ZGlmZiAtLWdpdCBhLzAuMTAvQ0hBTkdFUy50eHQgYi8wLjEwL0NIQU5HRVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWRiNjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL0NIQU5HRVMudHh0CkBAIC0wLDAgKzEsMTIyNiBAQAorQXBhY2hlIE9PRFQgQ2hhbmdlIExvZworPT09PT09PT09PT09PT09PT09PT09PQorUmVsZWFzZSAwLjEwIC0gMDgvMzAvMjAxNQorCisqIE9PRFQtODcxIElzc3VlcyB3aXRoIE9PRFQgMC4xMCBSQyMxIChsZXdpc21jLCBtYXR0bWFubikKKworKiBPT0RULTI0NiBHaXZlIHVzZXIgdGhlIGFiaWxpdHkgdG8gcHJpbnQgYSBkZXRhaWxlZCByZXBvcnQgb24gd2hhdCBqb2JzIGluIAorICB0aGUgUmVzb3VyY2UgTWFuYWdlciBhcmUgcnVubmluZyBvbiB3aGF0IG5vZGVzIChHYWJlIFJlc25lY2ssIG1hdHRtYW5uKQorCisqIE9PRFQtMjQ1IExpc3QgcmVzdWx0cyBmcm9tIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIGNsaWVudCBzaG91bGQgYmUgc29ydGVkIAorICBhbHBoYWJldGljYWxseSAoR2FiZSBSZXNuZWNrIHZpYSBtYXR0bWFubikKKworKiBPT0RULTI0OCBHaXZlIHVzZXIgdGhlIGFiaWxpdHkgdG8gcHJpbnQgYSBkZXRhaWxlZCByZXBvcnQgb24gdGhlIGxvYWQsIGNhcGFjaXR5IAorICBhbmQgcXVldWVzIG9mIGFsbCBub2RlcyBpbiB0aGUgUmVzb3VyY2UgTWFuYWdlciAoR2FiZSBSZXNuZWNrLCBtYXR0bWFubikKKworKiBPT0RULTI0NyBSZXNvdXJjZSBNYW5hZ2VyIGNsaWVudCBzaG91bGQgYWxsb3cgdXNlcnMgdG8gc2VlIHdoYXQgam9icyBhcmUgCisgIGN1cnJlbnRseSBpbiB0aGUgcXVldWUgKEdhYmUgUmVzbmVjaywgbWF0dG1hbm4pCisKKyogT09EVC0yNDQgQWxsb3cgdGhlIFJlc291cmNlIE1hbmFnZXIgc2NoZWR1bGVyIHRvIGN5Y2xlIG9uIGEgbm9uLWludGVnZXIgCisgIG51bWJlciBvZiBzZWNvbmRzIChHYWJlIFJlc25lY2sgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtODY0IFVwZ3JhZGUgdG8gVGlrYSAxLjEwIChtYXR0bWFubix0cGFsc3VsaWNoKQorCisqIE9PRFQtNjg2IEFkZFByb2R1Y3RUeXBlQ2xpQWN0aW9uIHNob3VsZCBwcm9tcHQgZm9yIFByb2R1Y3RUeXBlSWQgKHJ2ZXJtYSwgbWF0dG1hbm4pCisKKyogT09EVC0zMDIgQWRkIHN1cHBvcnQgaW4gdGhlIHhtbHF1ZXJ5IHBhY2thZ2UgdG8gaGFuZGxlIEhUVFAgUmVkaXJlY3Rpb24gKE1pY2hhZWwgQ2F5YW5hbiB2aWEgbWF0dG1hbm4pCisKKyogT09EVC0zMDMgQWRkIHN1cHBvcnQgaW4gdGhlIEdyaWQgUGFja2FnZSB0byB0aHJvdyBhbiBIVFRQIFNlcnZsZXQgUmVzcG9uc2UgKE1pY2hhZWwgQ2F5YW5hbiB2aWEgbWF0dG1hbm4pCisKKyogT09EVC00ODAgQmFsYW5jZTogZGVmYXVsdCB2aWV3IG5vdCBmb3VuZCAoTmVzYmVydCBIaWRhbGdvIHZpYSBtYXR0bWFubikKKworKiBPT0RULTU5OCBYTUxRdWVyeSBESVMtc3R5bGUgcXVlcnkgcGFyc2VyIG5lZWRzIHRvIHRyZWF0ICIjIiBhcyBhIHdvcmQgY2hhcmFjdGVyIChrZWxseSB2aWEgbWF0dG1hbm4pCisKKyogT09EVC04NzAgSW50ZWdyYXRlIEN1cmF0b3IgaW50byBPUFNVSSAobWF0dG1hbm4pCisKKyogT09EVC04NDIgY3JlYXRlIHJlc3RmdWwgdmVyc2lvbiBvZiBjYXMgY3VyYXRvciBzZXJ2aWNlcyAobWF0dG1hbm4pCisKKyogT09EVC04MzggU2VwYXJhdGUgUkVTVGZ1bCBTZXJ2ZXJzIGFuZCBDbGllbnRzIChNaWNoYWVsIFN0YXJjaCwgbWF0dG1hbm4pCisKKyogT09EVC04MjQgUG9ydCB0aGUgQ3VyYXRvciB0byBBcGFjaGUgV2lja2V0IChtYXR0bWFubikKKworKiBPT0RULTg2MSBXb3JrZmxvdyBNYW5hZ2VyIGNsaWVudCB3aWxsIHByaW50IHRoZSBsaXN0IG9mIHRhc2sgaWRzIGZvciBhIGdpdmVuIHdvcmtmbG93LCBpZiByZXF1ZXN0ZWQgKGx1Y2EpCisKKyogT09EVC04NTQgRW5hYmxlIEZpbGUgTWFuYWdlciBhbmQgUmVzb3VyY2UgTWFuYWdlciB0byBjb2xsZWN0IGNvbmZpZ3VyYXRpb24gZmlsZXMgYnkgcGFyc2luZyBhIGRpcmVjdG9yeSB0cmVlIHJlY3Vyc2l2ZWx5IChsdWNhKQorCisKK1JlbGVhc2UgMC45IC0gMDUvMzEvMjAxNQorCisqIE9PRFQtODQxIFVwZGF0ZSBNYXZlbiBpbnN0cnVjdGlvbnMgaW4gUkVBRE1FIHRvIGluY2x1ZGUgY2xlYW4gY29tbWFuZCAoRXRoYW4gV2FuZyB2aWEgbWF0dG1hbm4pCisKKyogT09EVC04NDQgU2NhbGEgbWF2ZW4gcGx1Z2luIGZvciBzdHJlYW1pbmcgb25seSAoSmFuZSBXeW5nYWFyZCB2aWEgbWF0dG1hbm4pCisKKyogT09EVC04MjkgSW1wbGVtZW50IGFuIEFwYWNoZSBUaWthIGJhc2VkIFNlcnZlciBTaWRlIEV4dHJhY3RvciAoUmFkdSBNYW5vbGUgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtODI2IEFkZCB0aGUgY2FwYWJpbGl0eSB0byBjaGVjayBleHRlcm5hbCBwcmVjb25kaXRpb25zIGJlZm9yZSBpbmdlc3RpbmcgYSBmaWxlLgorCisqIE9PRFQtODMyIE1vdmUgc3RyZWFtaW5nIGl0ZW1zIHRvIHNlcGVyYXRlIHRvcC1sZXZlbCBjb21wb25lbnQgKHN0YXJjaG1kKQorCisqIE9PRFQtODMxIENBUyBQR0UgYWRhcHRlciBmcmFtZXdvcmsgYnVpbGQgZmFpbGVkIChBZGl0eWEgRGh1bGlwYWxhIHZpYSBtYXR0bWFubikKKworKiBPT0RULTgzMCBRdWV1ZSBBc3NlcnRpb24gZmFpbHVyZSBvZiBYbWxRdWV1ZVJlcG9zaXRvcnkgdW5kZXIgQ0FTIFJlc291cmNlIE1hbmFnZXIgKEFkaXR5YSBEaHVsaXBhbGEgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtODIzIE9PRFQgSkRLOCBNYXZlbjMgYnVpbGQgZXJyb3JzIChBZGl0eWEgRGh1bGlwYWxhIHZpYSBtYXR0bWFubikKKworKiBPT0RULTcxNSBTb2xySW5kZXhlciBmYWlscyB0byBpbmRleCB3aGVuIG51bVByb2R1Y3RzID09IHBhZ2VTaXplIChwcmFtaXJleiwgbWRzdGFyY2ggdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtODIxIE9PRFQtODIxIEZNUHJvZCBSREYgY29uZiBzaG91bGRuJ3QgdXNlIEVEUk4gYXMgYSBkZWZhdWx0IG5hbWVzcGFjZSBmb3Iga2V5cyBhbmQgZm9yIHR5cGVzIChtYXR0bWFubikKKworKiBPT0RULTgxOCBDbWRMaW5lSW5nZXN0ZXIgc2hvdWxkIGxvZyB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uIGFuZCBtb3ZlIG9uIGR1cmluZyBpbmdlc3QgKG1hdHRtYW5uKQorCisqIE9PRFQtODE3IFRpa2FDbWRMaW5lRXh0cmFjdG9yIG5lZWRzIHRvIGFkZCBGaWxlbmFtZSBhbmQgRmlsZUxvY2F0aW9uIGZpZWxkcyAobWF0dG1hbm4pCisKKyogT09EVC04MTMgQ0FTLVBHRSBpbmNvcnJlY3RseSBwYXNzZXMgdmFyYXJncyB0byBEeW5hbWljQ29uZmlnRmlsZSBpbXBsZW1lbnRhdGlvbnMgKG1hdHRtYW5uKQorCisqIE9PRFQtODEyIFJBRElYIGluZ2VzdCBzY3JpcHQgKG1hdHRtYW5uKQorCisqIE9PRFQtODExIFJBRElYIGluY29ycmVjdGx5IHNldHMgdXAgUENTIFJFU1Qgc2VydmljZXMgYXBwIGNvbmZpZyAobWF0dG1hbm4pCisKKyogT09EVC04MTAgTWV0YWRhdGEgUHJlQ29uZGl0aW9uIENvbXBhcmF0b3JzIGJhc2VkIG9uIEZpbGVOYW1lIGFuZCBMYXN0TW9kaWZpZWQgdGltZSAoTHVjYSBDaW5xdWluaSB2aWEgbWF0dG1hbm4pCisKKyogT09EVC04MDkgQSBDcmF3bGVyQWN0aW9uIHRoYXQgaW5kZXhlcyB0byBTb2xyIChMdWNhIENpbnF1aW5pIHZpYSBtYXR0bWFubikKKworCitSZWxlYXNlIDAuOC4xIC0gMDEvMjgvMjAxNQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBPT0RULTgwNCBCcm9rZW4gdHJ1bmsgYnVpbGQgb24gSmVua2lucworCisqIE9PRFQtNjk5IE1lc29zIGNsdXN0ZXIgbWFuYWdlciBiYWNrZW5kIHRvIHJlc291cmNlIG1hbmFnZXIKKworKiBPT0RULTc4MCBTcGFyayBiYWNrZW5kIHRvIHJlc291cmNlIG1hbmFnZXIKKworKiBPT0RULTgwMiBDcmVhdGUgRG9ja2VyZmlsZSBmb3IgT09EVCBSYWRpeC4KKworKiBPT0RULTc2MSBVcGRhdGUgUEdFIHZlcnNpb24gaW4gUmFkaXguCisKKyogT09EVC03NDkgUmVtb3ZlIG9sZCBYZXJjZXNJbXBsIGphciBmcm9tIGdyaWQgcG9tLgorCisqIE9PRFQtNzcxIEZpeCBwdXNoX3B1bGxfZnJhbWV3b3JrLnByb3BlcnRpZXMgcGF0aCByZWZlcmVuY2UgZm9yIGNvbmZpZy5leHRlcm5hbC5wcm9wZXJ0aWVzLmZpbGVzIGluIGluY29ycmVjdCB3aXRoIGEgcGF0Y2ggZnJvbSBMZXdpcworCisqIE9PRFQtNzcwIEZpeCB0aGUgUkFESVggSXNzdWVzIHdpdGggYSBwYXRjaCBmcm9tIExld2lzIE1jR2liYm5leQorCitSZWxlYXNlIDAuOCAtIDEyLzE5LzIwMTQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogT09EVC03NTEgT1BTVUkgcGFnZXMgY29uc3RhbnRseSBleHBpcmUgKFRvbSBCYXJiZXIsIG1hdHRtYW5uKQorCisqIE9PRFQtNzQ4IEZpeCBEZXNjcmlwdGlvbiBpbiBhZ2lsaXR5L3NldHVwLnB5CisKKyogT09EVC03ODcgUEdFX1JPT1QgZW52IHZhcmlhYmxlIGRvZXMgbm90IHdvcmsgaW4gUEdFQ29uZmlnLnhtbCBhbmQgdGFza3MueG1sIChZaSBTdW4sIFNuZWhhIERlc2htdWtoIHZpYSBtYXR0bWFubikKKworKiBPT0RULTU2MiBFeHBvc2luZyBwYXJlbnQtY2hpbGQgJiBlbGVtZW50IGFkZGl0aW9uL2RlbGV0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIHByb2R1Y3QgdHlwZXMgdXNpbmcgY2FzLWN1cmF0b3IgKHZhcnVucikKKworKiBPT0RULTU2MyBNb2RpZnlpbmcgV29ya2Zsb3cgTWFuYWdlciB0byBhbGxvdyBhZGRpbmcgbmV3IHdvcmtmbG93cyAodmFydW5yKQorCisqIE9PRFQtNzg2IENoYW5nZSBzaGViYW5nIHRvIGJhc2ggZm9yIHByb3BlciBjb2xvciBvdXRwdXQgKFBvb2ppdCBTaGFybWEgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNzg1IFVwZGF0ZSBiYXRjaCBzdHViIHdpdGggbGVnYWN5TW9kZSBzZXQgdG8gdHJ1ZSAobWVnaGFtc2g0IHZpYSBtYXR0bWFubikKKworKiBPT0RULTc4MyBSQURpWCBDcmF3bGVyIGFjdGlvbiBiZWFuIGNvbmZpZyByZWZlcnMgdG8gV09SS0ZMT1dNR1JfVVJMIChBbmdlbGEgV2FuZyB2aWEgbWF0dG1hbm4pCisKKyogT09EVC03ODIgUmVzb3VyY2UgbWFuYWdlciBwb3J0IG51bWJlciBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lIHVzZWQgaW4gd29ya2Zsb3cucHJvcGVydGllcyAoSW1yYW4gTWFtbWFsZGkgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNzY5IFRoZSB3aWtpIHBhZ2UgY29tbWFuZCBpbnN0YWxscyAwLjYgdmVyc2lvbiBvZiB0aGUgb29kdCByYWRpeCBpbnN0YWxsZXIgKGxld2lzbWMsIFNhbnRvc2ggU0hhbmthcikKKworKiBPT0RULTc3NyBVcGRhdGUgZmlsZWNvbmNhdGVuYXRvci1wZ2UudGFyIGZvciBidWlsZGluZyBmaWxlY29uY2F0ZW5hdG9yLXBnZSAodGhyZWVlYXJzIHZpYSBtYXR0bWFubikKKworKiBPT0RULTc3NiBUZXN0IGZpeDogbG9nIG1lc3NhZ2VzIGNhbiBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBsb2NhbGVzIChUb20gVHVuZyB2aWEgbWF0dG1hbm4pCisKKyogT09EVC03MDEgQWRkaW5nIGluIHN0cmVhbSBwcm9kdWN0IHN0cnVjdHVyZSBmb3IgZmlsZW1hbmFnZXIuIEFkZCBpbiBjaGVjayBmb3IgdmFsaWQgcHJvZHVjdCBzdHJ1Y3R1cmVzLCBhbmQgZml4ZWQgdGVzdHMgYnJlYWtpbmcgZnJvbSB0aGF0IGNoZWNrLgorCisqIE9PRFQtNjk5IEFkZGluZyBpbiBjbHVzdGVyIG1hbmFnbWVudCBzY3JpcHRzIGZvciBtZXNvcy4KKworKiBPT0RULTc2NCBBZGRpbmcgaW4gbXVsdGlwbGV4aW5nIHJlc291cmNlIG1hbmFnZXIgYmFja2VuZC4KKworKiBPT0RULTc2MyBDb3JyZWN0aW5nIHBhdGggdG8gT09EVF9IT01FIGFuZCBGSUxFTUdSX0hPTUUgKHZpc2hhbGhlbW5hbmkgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMzg1LCBPT0RULTYzMCwgT09EVC02MzEsIE9PRFQtNjMyLiBVcGdyYWRlZCBUaWthIHRvIHZlcnNpb24gMS42LgorCisqIE9PRFQtNzU3IEZpeGVkIFBHRVRhc2tJbnN0YW5jZSBidWcgdGhhdCBwcmV2ZW50ZWQgaW5zdGFudGlhdGlvbiBvZiBBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIgKGx1Y2EpCisKKyogT09EVC03NTYgSHR0cENsaWVudCBOb0NsYXNzRGVmRm91bmRFcnJvciBGb3IgdGhlIHVybC1kb3dubG9hZGVyIFNjcmlwdCAoTWVuZ3lpbmcgV2FuZyB2aWEgbWF0dG1hbm4pCisKKyogT09EVC03NTQgQ29udHJpYnV0ZSBQcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3IgKHJpY2tkbikKKworKiBPT0RULTc1MCBJc3N1ZSB3aXRoIHJ1bm5pbmcgbXZuIHNpdGU6c2l0ZSBkdWUgdG8gb2xkIGZpbmRidWdzIHBsdWdpbiAobWF0dG1hbm4pCisKKworUmVsZWFzZSAwLjcgLSAwOS8xNS8yMDE0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworKiBPT0RULTY2OSBNYWtlIFJlc291cmNlIE1hbmFnZXIgd29yayB3aXRob3V0IEdhbmdsaWEgKG1hdHRtYW5uLCByYWppdGgpCisKKyogT09EVC02NDQgRml4IHRvIEZUUCBwcm90b2NvbCB0ZXN0cywgYWJzdHJhY3Rpbmcgc29tZSBvZiB0aGUgbG9naWMgdG8gbWFrZSB0aGUgY29kZSBiZXR0ZXIgc3VpdGVkIHRvIG1vY2tpbmcobWFnaWNhbHRyb3V0KQorCisqIE9PRFQtNjQ0IEZpeCB0byBzdHViIEZUUCBjbGllbnQgcHJvdG9jb2wgc28gaXQgZG9lc24ndCBmYWlsIHdoZW4gdGhlIHBvcnQgaXMgaW4gdXNlCisKKyogT09EVC02NDQgUGFydGlhbCBmaXggdG8gc3R1YiBTU0ggY2xpZW50IHNvIGl0IGRvZXNuJ3QgZmFpbCB3aGVuIFNTSEQgaXMgcnVubmluZyBsb2NhbGx5CisKKyogT09EVC03NDUgUmVtb3ZlZCB0cmFpbGluZyBzcGFjZXMgaW4gdGhlIHJhZGl4IHdtZ3IgZmlsZXgKKworKiBPT0RULTQ3MyBScmVtb3ZlICJEZWxldGVkIiBNZXRhZGF0YSBGbGFnIGZyb20gU29sciBJbmRleGVyIChtYWdpY2FsdHJvdXQpCisKKyogT09EVC03MzYgQ2xlYW4gdXAgdGVzdCBkYXRhIGxlZnQgYnkgVGVzdFR5cGVIYW5kbGVyIHRlc3QgKHJsYWlkbGF3KQorCisqIE9PRFQtNjY3IENBUy1QR0Ugbm8gbG9uZ2VyIHJlc3BlY3RzIHdyaXRlcnMgYW5kIGZpbGUgdGFncyBmcm9tIAorICBlYXJsaWVyIHBnZUNvbmZpZy54bWwgZmlsZXMgKG1hdHRtYW5uKQorCisqIE9PRFQtNzQxIFJlbW92ZSBzdGF0aWMgbW9kaWZpZXIgZnJvbSBlbGVtZW50TWFwLCBzdWJUb1N1cGVyTWFwIGFuZAorICBwcm9kdWN0VHlwZUVsZW1lbnRNYXAgZmllbGRzIGluIFhNTFZhbGlkYXRpb25MYXllciAocmxhaWRsYXcpCisKKyogT09EVC03MzcgQ29waWVkIG92ZXIgbGF0ZXN0IGNtZC1saW5lLW9wdGlvbnMueG1sIHdpdGggdHlwZU5hbWUgKHJsYWlkbGF3KQorCisqIE9PRFQtNzM5IEZpeCBGaWxlIE1hbmFnZXIgdW5pdCB0ZXN0cyAoc3RlcCAxMikgLSBmaXggdGVzdCBjbGFzc2VzIGluCisgICdtZXRhZGF0YScgYW5kICd2ZXJzaW9uaW5nJyBwYWNrYWdlcyAocmxhaWRsYXcpCisKKyogT09EVC03MzggQ29udHJpYnV0ZSB3b3JrZmxvdyBzY3JpcHRzIHRvIGtpbGwgYWxsIGJ5IHN0YXR1cyBvciBraWxsIGJ5IGluc3RhbmNlIElEIChtYXR0bWFubikKKworKiBPT0RULTczNyBGaXggRmlsZSBNYW5hZ2VyIHVuaXQgdGVzdHMgKHN0ZXAgMTEpIC0gZml4IHRlc3QgY2xhc3NlcyBpbiAnY2xpJworICBwYWNrYWdlIChybGFpZGxhdykKKworKiBPT0RULTczNiBGaXggRmlsZSBNYW5hZ2VyIHVuaXQgdGVzdHMgKHN0ZXAgMTApIC0gZml4IHRlc3QgY2xhc3NlcyBpbiAnc3RydWN0cycKKyAgcGFja2FnZSAocmxhaWRsYXcpCisKKyogT09EVC03MzUgRml4IEZpbGUgTWFuYWdlciB1bml0IHRlc3RzIChzdGVwIDkpIC0gZml4IHRlc3QgY2xhc3NlcyBpbiAndG9vbHMnCisgIHBhY2thZ2UgKHJsYWlkbGF3KQorCisqIE9PRFQtNzM0IEZpeCBGaWxlIE1hbmFnZXIgdW5pdCB0ZXN0cyAoc3RlcCA4KSAtIGZpeCB0ZXN0IGNsYXNzZXMgaW4gJ3N5c3RlbScKKyAgcGFja2FnZSAocmxhaWRsYXcpCisKKyogT09EVC03MzMgRml4IEZpbGUgTWFuYWdlciB1bml0IHRlc3RzIChzdGVwIDcpIC0gZml4IHRlc3QgY2xhc3NlcyBpbiAnaW5nZXN0JworICBwYWNrYWdlIChybGFpZGxhdykKKworKiBPT0RULTczMiBGaXggRmlsZSBNYW5hZ2VyIHVuaXQgdGVzdHMgKHN0ZXAgNikgLSBmaXggdGVzdCBjbGFzc2VzIGluCisgICdkYXRhdHJhbnNmZXInIHBhY2thZ2UgKHJsYWlkbGF3KQorCisqIE9PRFQtNzMxIEZpeCBGaWxlIE1hbmFnZXIgdW5pdCB0ZXN0cyAoc3RlcCA1KSAtIGZpeCB0ZXN0IGNsYXNzZXMgaW4gJ2NhdGFsb2cnCisgIHBhY2thZ2UgKHJsYWlkbGF3KQorCisqIE9PRFQtNzI4IEZpZ3VyZSBvdXQgd2h5IGNlcnRhaW4gbWV0YWRhdGEgZmllbGRzIGdldCBzZXQgdHdpY2UgZHVyaW5nIHBpcGVsaW5lIHByb2Nlc3NpbmcgKG1hdHRtYW5uKQorCisqIE9PRFQtNzI5IEZpeCBGaWxlIE1hbmFnZXIgdW5pdCB0ZXN0cyAoc3RlcCA0KSAtIGZpeCB0ZXN0IGNsYXNzZXMgaW4gJ3V0aWwnCisgIHBhY2thZ2UgKHJsYWlkbGF3KQorCisqIE9PRFQtNjkwIFJBRGlYIGV4YW1wbGUgcG9saWN5IGZvciBHZW5lcmljRmlsZSBtaXNzaW5nICI8bWV0YWRhdGEvPiIgbm9kZSAocnZlcm1hIHZpYSBtYXR0bWFubikKKworKiBPT0RULTcxOCBSQURpWCBCdWlsZCBGYWlsdXJlICh0cGFsc3VsaWNoLCBnb29kYWxlIHZpYSBtYXR0bWFubikKKworKiBPT0RULTcyNiBDcmVhdGUgTWV0RmlsdGVyIFRhc2sgRXhhbXBsZSAobWF0dG1hbm4pCisKKyogT09EVC03MjQgQ3Jhd2xlciBhY3Rpb24gYmVhbiBjb25maWcgcmVmZXJzIHRvIFdPUktGTE9XTUdSX1VSTCAobWF0dG1hbm4pCisKKyogT09EVC03MjMgRml4IEZpbGUgTWFuYWdlciB1bml0IHRlc3RzIChzdGVwIDMpIC0gZml4IHRlc3QgY2xhc3MgaW4gJ3ZhbGlkYXRpb24nCisgIHBhY2thZ2UgKHJsYWlkbGF3KQorCisqIE9PRFQtNzIyIEZpeCBGaWxlIE1hbmFnZXIgdW5pdCB0ZXN0cyAoc3RlcCAyKSAtIGZpeCB0ZXN0IGNsYXNzIGluICdyZXBvc2l0b3J5JworICBwYWNrYWdlIChybGFpZGxhdykKKworKiBPT0RULTY3MiBPT0RUIFN0YXJ0IHNjcmlwdCBkb2VzIG5vdCBub3RpZnkgdXNlciBvZiBzdGF0dXMgKGFzdW1hcmxpZGFzb24gdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNzIxIEZpeCBGaWxlIE1hbmFnZXIgdW5pdCB0ZXN0cyAoc3RlcCAxKSAtIHJlbW92ZSBkdXBsaWNhdGUgWE1MIGZyb20gdGVzdAorICByZXNvdXJjZXMgKHJsYWlkbGF3KQorICAKKyogT09EVC03MTkgUHJldmVudCBodHRwY2xpZW50IGZyb20gc3Bhd25pbmcgY2xvc2V3YWl0IHRjcCBjb25uZWN0aW9ucyAoS29uc3RhbnRpbm9zIE1hdnJvbW1hdGlzIHZpYSBsZXdpc21jKQorCisqIE9PRFQtNjg1IGl4IE9PRFQgMC43LVNOQVBTSE9UIEplbmtpbnMgbmlnaHRseSBidWlsZCBvbiBVYnVudHUgMXN0IFBhc3MgKGxld2lzbWMpCisKKyogT09EVC03MTYgVmFncmFudCB1c2VyIG9uIFZNIHVuYWJsZSB0byBzdGFydC9zdG9wIG9vZHQgc2VydmljZXMgKHNoZXJ5bGopCisKKyogT09EVC03MDggQWRkIFBHRSBSQURpWCBBcmNoZXR5cGUgKHNraHVkaWt5KQorCisqIE9PRFQtNTkzIER5biB3b3JrZmxvd3MgaW4gV29ya2Zsb3cgTWFuYWdlciBjYXVzZSBOUEVzIG9uIHJlc3RhcnQgKG1hdHRtYW5uKQorCisqIE9PRFQtNzA1IFJBRElYIG9uZSBzdGVwIHNjcmlwdCAobWF0dG1hbm4pCisKKyogT09EVC03MDMgRGF0YVV0aWwuY3JlYXRlUHJvZHVjdFppcEZpbGUgdGhyb3dzIGV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIGEgemlwZmlsZSBvZiBhIGhpZXJhcmNoaWNhbCBwcm9kdWN0ICh0aG9tYXMpCisKKyogT09EVC02NzQgTW92ZURhdGFmaWxlVG9GYWlsdXJlRGlyIGZhaWxzIHRvIG1vdmUgZmlsZXMgb2ZmIGFuIE5GUyBtb3VudGVkIGRpcmVjdG9yeSAodGhvbWFzKQorCisqIE9PRFQtNjYyIFVwZ3JhZGUgY29nLWpnbG9idXMgZGVwZW5kZW5jeSBpbiBwcm90b2NvbC1mdHAgKGxld2lzbWMpCisKKyogT09EVC02NjggUHJvZHVjdFF1ZXJ5U2VydmxldCB3aWxsIG5vdyByZW5hbWUgemlwIGF0dGFjaG1lbnRzIHdpdGggcHJvcGVyICIuemlwIiBleHRlbnNpb24sCisgIGFuZCB0aGUgY29udmVudGlvbnMgdXNlZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIChsdWNhKQorCisqIE9PRFQtMjE3IENBUy1QR0UgVXNlciBNYW51YWwgKHJ2ZXJtYSwgYmZvc3RlciwgbWF0dG1hbm4pCisKKyogT09EVC02NjUgQ0FTIFJERiBhbmQgUlNTIHByb2R1Y3Qgc2VydmljZSBkb2Vzbid0IGFsbG93IHByb2R1Y3QgdHlwZSBtZXQgdG8gaGF2ZSBrZXlzIAorICB3aXRoIHNwYWNlcyAobWF0dG1hbm4pCisKKyogT09EVC02NjQgUkFESVggZGVwbG95bWVudCBvZiBvcHN1aSBpbmNvcnJlY3RseSB1c2VzIC9wY3Mtb3BzdWkgYXMgdGhlIHdlYi54bWwgY29udGV4dCAKKyAgYW5kIG9taXRzIDIga2V5IFBDUyBwcm9wZXJ0aWVzIGZyb20gY29udGV4dC54bWwgKG1hdHRtYW5uLCBwcmFtaXJleiwgYWhhcnQpCisKKyogT09EVC02NjMgU2FtcGxlIENBUy1QR0Ugd29ya2Zsb3cgdGFzayBzaG91bGQgYmUgaW5jbHVkZWQgaW4gY2FzLXBnZSAobWF0dG1hbm4pCisKKyogT09EVC02NjEgRW5hYmxlZCBjYXNlLWluc2Vuc2l0aXZlIHNwZWNpZmljYXRpb24gb2YgIk9GU04iIGFuZCAiUlQiIHBhcmFtZXRlciBuYW1lcworICAobm90IHZhbHVlcyEpIHdoZW4gaXNzdWluZyBhIHJlcXVlc3QgdG8gdGhlIFByb2R1Y3QgU2VydmVyIChsdWNhKQorCisqIE9PRFQtNjU2IFByb3ZpZGUgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgUXVlcnlTZXJ2bGV0IHRoYXQgaXMgYWJsZSAKKyAgdG8gY29uc3RydWN0IHF1ZXJpZXMgZnJvbSBub24gRElTLXN0eWxlIHBhcmFtZXRlcnMgKGx1Y2EpCisKKyogT09EVC02MTMgQ0FTIFByb2R1Y3Qgd2ViIGFwcGxpY2F0aW9uIC0gY29uZmlndXJhYmxlIGNvbnRlbnQgd3JpdGVycyBmb3IgUkRGCisgIGFuZCBSU1MgKHJsYWlkbGF3KQorCisqIE9PRFQtNjEyIENBUyBQcm9kdWN0IHdlYiBhcHBsaWNhdGlvbiAtIGFkZCBjb250ZW50IHdyaXRlcnMgZm9yIFhNTCwgSlNPTiwgUkRGLAorICBSU1MgKHJsYWlkbGF3KQorCisqIE9PRFQtNjUyIE5ldyBUaWthQ21kTGluZU1ldEV4dHJhY3RvciAocml2ZXJtYSkKKworKiBPT0RULTY1MSBJbXByb3ZlIHBhcmFtZXRlciBpbml0aWFsaXphdGlvbiwgdmFsaWRhdGlvbiBhbmQgbG9nZ2luZyBmb3IKKyAgQ0FTLVByb2R1Y3Qgd2ViIGFwcGxpY2F0aW9uIChybGFpZGxhdykKKworKiBPT0RULTY1MCBSZW1vdmUgZHVwbGljYXRlIGNvbnRleHQgY29udGFpbmVyIGV4YW1wbGUgZnJvbSBDQVMtUHJvZHVjdCB3ZWIKKyAgYXBwbGljYXRpb24gKHJsYWlkbGF3KQorCisqIE9PRFQtNjQ5IEFkZCBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyB3cmFwcGVyIGFyb3VuZCBjYWxscyB0bworICBjb250ZXh0LmdldEluaXRQYXJhbWV0ZXIgdG8gcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKHJsYWlkbGF3KQorCisqIE9PRFQtNjExIEltcGxlbWVudCBKQVgtUlMgc2VydmljZXMgdG8gYWNjZXNzIEZpbGUgTWFuYWdlciBwcm9kdWN0cyBhcyByYXcKKyAgZGF0YSAocmxhaWRsYXcpCisKKyogT09EVC02NDggQWRkIGxpY2Vuc2UgaGVhZGVycyB0byBmaWxlcyBzbyB0aGF0IG12biByYXQ6Y2hlY2sgaXMgc3VjY2Vzc2Z1bCAKKyAgKGxld2lzbWMpCisKKyogT09EVC02NDIgSW4gQ0FTLVByb2R1Y3QsIG1vdmVkIHRlc3RzIHRvIHNyYy90ZXN0L2phdmEgYW5kIHRlc3QgcmVzb3VyY2VzIHRvCisgIHNyYy90ZXN0L3Jlc291cmNlcyB0byBtYXRjaCBNYXZlbiBzdGFuZGFyZCBkaXJlY3RvcnkgbGF5b3V0IChybGFpZGxhdykKKworKiBPT0RULTYxOSBJbXBsZW1lbnQgdGhlIGNhcGFiaWxpdHkgdG8gcHVsbCBzdGF0dXMgb2YgcmVzb3VyY2UgCisgIG5vZGVzIGZyb20gZ2FuZ2xpYSAoUmFqaXRoIFNpcml3YXJkYW5hIHZpYSBtYXR0bWFubikKKworCitSZWxlYXNlIDAuNiAtIDA3LzA4LzIwMTMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogT09EVC02MzMgVXBkYXRlIFBFQVIgcGFja2FnZS54bWwgZmlsZXMgZm9yIHVwY29taW5nIHJlbGVhc2UuIChnbWNkb25hbGQpCisKKyogT09EVC02NDAgQWRkZWQgdmVyc2lvbiBudW1iZXIgZm9yIG1hdmVuLXdhci1wbHVnaW4gdG8gQ0FTLVByb2R1Y3QgUE9NCisgIChybGFpZGxhdykKKworKiBPT0RULTYzOSBBZGQgYSB2ZXJzaW9uZXIgYmFzZWQgb24gUHJvZHVjdCBUeXBlIE1ldGFkYXRhIChtYXR0bWFubikKKworKiBPT0RULTYzOCBJbmNsdWRlIG1vcmUgcHJvdmVuYW5jZSBtZXRhZGF0YSBpbiB0cmFjZSBwcm9kdWN0IHR5cGUgKG1hdHRtYW5uKQorCisqIE9PRFQtNjM3IEdlbyBQcm9kdWN0IFR5cGUgcG9saWN5IGluY2x1ZGVzIGR1cGxpY2F0aXZlIGVsZW1lbnRzIChtYXR0bWFubikKKworKiBPT0RULTYzNSBGaXggdHJpdmlhbCBlcnJvcnMgaW4gQmFzaWMgQ0FTIEN1cmF0aW9uIEV4YW1wbGUgKGxld2lzbWMgdmlhIG1hdHRtYW5uLCBCaWxsIFJpZGVvdXQpCisKKyogT09EVC02MzYgRml4ZWQgSmF2YWRvYyB3YXJuaW5ncyBpbiBDQVMtUHJvZHVjdCAocmxhaWRsYXcpCisKKyogT09EVC02MzQgRml4ZWQgbGluZ2VyaW5nIGJ1ZyBpbiBTb2xyIENhdGFsb2cgaW1wbGVtZW50YXRpb24gdGhhdCB3b3VsZCBzdGlsbCBub3QgcmV0dXJuIG51bGwKKyAgICAgICAgICAgaWYgbm8gbWF0Y2hpbmcgcHJvZHVjdCBpcyBmb3VuZCAobHVjYSkKKyogT09EVC02MjggTXVsdGlwbGUgY2x1c3RlciBHYW5nbGlhIHhtbCBwYXJzZSBlcnJvciAoUmFqaXRoIFNpcml3YXJkYW5hIHZpYSBtYXR0bWFubikKKworKiBPT0RULTYxMCBBZGRlZCBuZXcgZW1wdHkgcGFja2FnZSBvb2R0LmNhcy5wcm9kdWN0LnNlcnZpY2UgZm9yIGZ1dHVyZSBKQVgtUlMKKyAgY2xhc3NlcyAocmxhaWRsYXcpCisKKyogT09EVC02MDkgQWRkZWQgQXBhY2hlIENYRiBkZXBlbmRlbmN5IHRvIHRoZSBDQVMtUHJvZHVjdCBQT00gKHJsYWlkbGF3KQorCisqIE9PRFQtNjI0IFVwZGF0ZWQgbWF2ZW4tamF2YWRvYy1wbHVnaW4gdG8gdjIuOSAocmxhaWRsYXcpCisKKyogT09EVC02MjMgQWRkaXRpb24gb2YgcmVsYXRpdmVQYXRoIHRvIHRoZSBvcGVuZGFwcHMvcG9tLnhtbCB0byBoZWxwIGl0IGxvY2F0ZQorICB0aGUgb29kdC1jb3JlIFBPTSAocmxhaWRsYXcpCisKKyogT09EVC02MTggSW1wbGVtZW50IGdhbmdsaWEgWE1MIHBhcnNlciAoUmFqaXRoIFNpcml3YXJkYW5hIHZpYSBtYXR0bWFubikKKworKiBPT0RULTYyNSBCYWtlIFRyYWNlYWJsZUZpbGUgcHJvZHVjdCBwb2xpY3kgaW50byBGTSAobWF0dG1hbm4pCisKKyogT09EVC02MjIgVXBkYXRlZCBzdm46aWdub3JlIHByb3BlcnRpZXMgZm9yIHNldmVyYWwgbW9kdWxlcyB0byBhZGQgRWNsaXBzZQorICBjb25maWd1cmF0aW9uIGZpbGVzIHRvIHRoZSBpZ25vcmUgbGlzdHMgKHJsYWlkbGF3KQorCisqIE9PRFQtNTcyIFJlcGxhY2UgbWtkaXIgd2l0aCBtb3JlIG11bHRpLXRocmVhZCByZXNpbGllbnQgZm9yY2VNa2RpciBpbiAKKyAgTG9jYWxEYXRhVHJhbnNmZXJlciAoVG9tIEJhcmJlciB2aWEgbWF0dG1hbm4pCisKKyogT09EVC01NTkgVW5pdCB0ZXN0IGZhaWx1cmUgaW4gdGVzdERvRHluYW1pY1JlcGxhY2VtZW50IGZvciAiRXVyb3BlL0xvbmRvbiIgCisgIHRpbWV6b25lIChUb20gQmFyYmVyIHZpYSBtYXR0bWFubikKKworKiBPT0RULTYxNSBGaXhlZCBidWcgaW4gU29sckNhdGFsb2cgdGhhdCB3b3VsZCB0aHJvdyBleGNlcHRpb24gaWYgbm8gbWF0Y2hpbmcgcHJvZHVjdHMgYXJlIGZvdW5kCisgICAgICAgICAgIChsdWNhKQorCisqIE9PRFQtNDA4IERyb3AgU3ByaW5nIGxvZ2dpbmcgbGV2ZWxzIGZyb20gV0FSTklORyB0byBTRVZFUkUgKExld2lzIEpvaG4gTWNHaWJibmV5CisgIHZpYSBtYXR0bWFubiwgYmZvc3RlcikKKworKiBPT0RULTYwNyBTY2lQZ2VXcml0ZXIgdGhhdCBpcyBhIHNpbXBsZSBNZXRLZXkgdGVtcGxhdGUgcmVwbGFjZXIgKG1hdHRtYW5uKQorCisqIE9PRFQtNjA2IFNjaVBnZVdyaXRlciB0aGF0IHVzZXMgQXBhY2hlVmVsb2NpdHkgKG1hdHRtYW5uLCBwcmFtaXJleikKKworKiBPT0RULTU5MiBQcm92aWRlIFNvbHItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgQ0FTIEZpbGUgTWFuYWdlciAobHVjYSkKKworKiBPT0RULTU5MCBtb2RpZnkgcGNzIHJlZmVyZW5jZXMgaW4gb3BzdWkgd2ViYXBwIChyaXZlcm1hKQorCisqIE9PRFQtNTg5IGFkZCBwY3NfaG9tZSBlbnYgdmFyaWFibGUgdG8gZW52IHNjcmlwdCAocml2ZXJtYSkKKworKiBPT0RULTU4NiBSQURpWCBhcmNoZXR5cGUgZG9lcyBub3QgcHJvcGVybHkgZGVwbG95IGNyYXdsZXIgKHJpdmVybWEpCisKKyogT09EVC02MDMgRW5hYmxlIFJlc291cmNlIE1hbmFnZXIgc3RhcnQvc3RvcCB3aXRoaW4gUkFEaVggKHJpdmVybWEpCisKKyogT09EVC02MDAgTW9kdWxhcml6ZSBvbGQgT1BTVUkgdGhlbWUgaW50byBhIHNlcGFyYXRlIFdpY2tldCAic2tpbiIgKHJpdmVybWEpCisKKyogT09EVC01OTkgTW9kdWxhcml6ZSBuZXcgdGhlbWUgaW50byBhIHN0YW5kLWFsb25lIFdpY2tldCAic2tpbiIgKHJpdmVybWEpCisKKyogT09EVC01OTcgSW1wcm92ZSB0aGVtZS9zdHlsaW5nIG9mIE9QU1VJIChyaXZlcm1hKQorCisqIE9PRFQtNTk2IEZpeCBvcHN1aSB3ZWJhcHAncyB3aWNrZXQgJ1BhZ2UgRXhwaXJlZCcgZXJyb3IgKHJpdmVybWEpCisKKyogT09EVC01OTUgSW1wcm92ZSBzdHlsaW5nIG9mIFdvcmtmbG93IFZpZXdlciAod2ViYXBwL2NvbXBvbmVudHMpIChyaXZlcm1hKQorCisqIE9PRFQtNjAyIExvYWQgbm90IHNldHRhYmxlIGZvciBXb3JrZmxvd1Rhc2tKb2JzIGluIAorICBJdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NUaHJlYWQgKG1hdHRtYW5uKQorCisqIE9PRFQtNDcwIEVuYWJsZWQgUlNTUHJvZHVjdFRyYW5zZmVyU2VydmxldCB0byBiZSBjb25maWd1cmVkIHVzaW5nIGFuIFhNTAorICBjb25maWd1cmF0aW9uIGZpbGUgKHJsYWlkbGF3KQorCisqIE9PRFQtNTYwIFhtbFN0cnVjdEZhY3Rvcnk6OmdldFByb2R1Y3RUeXBlTWFwWG1sRG9jdW1lbnQgZG9lcyBub3QgCisgIG91dHB1dCB2aXJ0dWFsIHByb2R1Y3QgdHlwZXMgKFZhcnVuIFJhdG5ha2FyIHZpYSBtYXR0bWFubikKKworKiBPT0RULTU4MyBBZGRlZCBKVW5pdCB0ZXN0IGNsYXNzIGZvciBSU1NDb25maWdSZWFkZXIgKHJsYWlkbGF3KQorCisqIE9PRFQtNTgyIEZpeCBmb3Igb29kdC5jYXMucHJvZHVjdC5yc3MuUlNTQ29uZmlnUmVhZGVyLnJlYWRUYWdzKCkgZm9yIGRldGVjdGlvbgorICBvZiBzb3VyY2UgYXR0cmlidXRlIGZvciB0YWdzIGRlZmluZWQgaW4gdGhlIFJTUyBjb25maWd1cmF0aW9uIGZpbGUgKHJsYWlkbGF3KQorCisqIE9PRFQtNTc2IFVzZWQgdHJ5Li4uZmluYWxseSBpbiBvb2R0LmNvbW1vbnMuZGF0YWJhc2UuU3FsU2NyaXB0LmxvYWRTY3JpcHQoKSB0bworICBjbG9zZSBCdWZmZXJlZFJlYWRlciAocmxhaWRsYXcpCisKKyogT09EVC01MzcgUHVzaC9QdWxsIE51bGxQb2ludGVyRXhjZXB0aW9uIG9uIHN0YXJ0dXAgKG1hdHRtYW5uLCBqb3ljZSkKKworKiBPT0RULTU3OCBXb3JrZmxvdyBNb25pdG9yIGV4cGVyaWVuY2VzIHJ1bnRpbWUgZXhjZXB0aW9uIChOUEUpIG91dCAKKyAgb2YgdGhlIGJveCB3aXRoIFJBRElYIChBcm5pIFN1bWFybGlkYXNvbiB2aWEgbWF0dG1hbm4pCisKKyogT09EVC01NzUgTWV0YWRhdGEgZXh0cmFjdG9yIGZvciBwYXJzaW5nIGZpbGVuYW1lIGJhc2VkIG9uIHJlZ2V4IAorICAoTmdhIENodW5nIHZpYSBtYXR0bWFubikKKworKiBPT0RULTU3MyBSZWZhY3RvcmVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGluIHRoZSBnZXRUb3BOUHJvZHVjdHMgbWV0aG9kIGluIHRoZQorICBMdWNlbmVDYXRhbG9nIGNsYXNzIChybGFpZGxhdykKKworKiBPT0RULTU3MSBVcGRhdGVkIGFzc2lnbm1lbnRzIGluIHNldFdvcmtmbG93SW5zdCBhbmQgc2V0V2FpdGZvckNvbmRpdGlvblNhdGlzZnkKKyAgbWV0aG9kcyBpbiBJdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZCBjbGFzcyAocmxhaWRsYXcpCisKKyogT09EVC01NzQgUkFEaVggUE9NIFBhcmVudCBSZWZlcmVuY2VzIChBcm5pIFN1bWFybGlkYXNvbiB2aWEgbWF0dG1hbm4pCisKKyogT09EVC00OTEgQWRkIG5leHRTdGF0ZSAoZGV0ZXJtaW5lTmV4dFN0YXRlKSBmdW5jdGlvbiB0byAKKyAgV29ya2Zsb3dQcm9jZXNzb3IgKG1hdHRtYW5uKQorCisqIE9PRFQtNTU4IEludHJvZHVjaW5nIG9wdGlvbmFsIHdlYi1ncmlkIHNlcnZsZXQgaW5pdCBwYXJhbWV0ZXIgIm9yZy5hcGFjaGUub29kdC5ncmlkLkdyaWRTZXJ2bGV0LmNvbmZpZyIgCisgdGhhdCBjYW4gYmUgdXNlZCB0byByZWFkL3dyaXRlIGl0cyBjb25maWd1cmF0aW9uIHRvIGEgbG9jYXRpb24gZXh0ZXJuYWwgdG8gdGhlIHdlYiBhcHAgZGlyZWN0b3J5IChsdWNhKS4KKworKiBPT0RULTU2NCBYTUxQUyBzaG91bGQgcHJvdmlkZWQgb3JkZXJlZCByZXN1bHRzIGJhc2VkIG9uIAorICByZXF1ZXN0ZWQgZmllbGRzIChtYXR0bWFubiwgam95Y2UpCisKKyogT09EVC0zNjkgQnVpbGRpbmcgd2l0aCBNYXZlbjMgKG1hdHRtYW5uLCBBZGFtIEVzdHJhZGEpCisKKyogT09EVC01NTUsIE9PRFQtNTU3IC0gQ2hhbmdlZCBiZWhhdmlvciBvZiBMdWNlbmUgQ2F0YWxvZyB1cGRhdGUgbWV0aG9kcyB0byByZXRyaWV2ZSBhIHByb2R1Y3QgZnJvbSB0aGUgaW5kZXggdG8gdGhlIGNhY2hlLCAKKyAgaW5zdGVhZCBvZiBmYWlsaW5nIGlmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuIEF0IHRoZSBzYW1lIHRpbWUsIHNpbXBsaWZ5IHRoZSBDdXJhdG9yIHVwZGF0ZU1ldGFkYXRhKCkgbWV0aG9kIHRvIGp1c3QgdXBkYXRlCisgIHRoZSBtZXRhZGF0YSwgd2l0aG91dCByZW1vdmluZyBhbmQgcmUtaW5zZXJ0aW5nIHRoZSBwcm9kdWN0IGJlZm9yZSB0aGF0LgorICAobHVjYSwgcmlzaGksIG1hdHRtYW5uKQorCisqIE9PRFQtNTUzIFVwZGF0ZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5leGVjLkVudlV0aWxpdGllcyB0byBVc2UgU3lzdGVtLmdldEVudmlyb25tZW50IAorICAoTWljaGFlbCBTdGFyY2ggdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNTUxIEluc2VydCBwcmltYXJ5IGtleSBpbiBtZXRhZGF0YSB0YWJsZSBmb3IgZGF0YWJhc2UtYmFzZWQgRmlsZSBNYW5hZ2VyLCB0byBhbHdheXMgcmV0dXJuIG1ldGFkYXRhIHZhbHVlcyBpbiBwcm9wZXIgb3JkZXIKKyAgICAgICAgICAgKGx1Y2EsIG1hdHRtYW5uLCBiZm9zdGVyKQorCisqIE9PRFQtNTQ4IEJlIG1vcmUgcmVzaWxpZW50IHRvIHRhYmxlIGRlZmluaXRpb25zIG1hdGNoaW5nIHRoZSBtYXN0ZXIgdGFibGUgCisgIGluIHRoZSBNYXBwaW5nIGNvbmZpZyBmaWxlIChtYXR0bWFubixqb3ljZSkKKworKiBPT0RULTU0NiBYTUxQUyBpbm5lci1qb2lucyBkZWZhdWx0IHRhYmxlIHdpdGggaXRzZWxmIChtYXR0bWFubixqb3ljZSkKKworKiBPT0RULTU0NyBTd2l0Y2ggbmV3ZXN0IEN1cmF0b3IgdXB1ZGF0ZSBtZXRhZGF0YSBtZXRob2QgdG8gdXNlIFhNTC1SUEMgRmlsZU1hbmFnZXIgY2xpZW50LgorICAgICAgICAgICBTd2l0Y2ggb3RoZXIgQ3VyYXRvciB1cGRhdGUgbWV0YWRhdGEgbWV0aG9kIHRvIHVzZSBzaGFyZWQgaW5zdGFuY2Ugb2YgQ2F0YWxvZyBGYWN0b3J5IAorICAgICAgICAgICB0byBtaW5pbWl6ZSB1c2Ugb2YgcmVzb3VyY2VzLgorICAgICAgICAgICAobHVjYSkKKworCitSZWxlYXNlIDAuNSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZWxlYXNlIERhdGU6IERlY2VtYmVyIDE4LCAyMDEyCisKKyogT09EVC01NDEgSW1wbGVtZW50IGEgTGVuaWVudERhdGFTb3VyY2VDYXRhbG9nIHRoYXQgYWxsb3dzIGZvciBkeW5hbWljYWxseSBuYW1lZAorICBtZXRhZGF0YSBmaWVsZHMsIGVmZmVjdGl2ZWx5IGJ5cGFzc2luZyB0aGUgdmFsaWRhdGlvbiBsYXllci4KKyAgKGx1Y2EpCisKKyogT09EVC01NDQgSW1wbGVtZW50IGEgRGF0YVNvdXJjZUNhdGFsb2cgYmFjay1lbmQgdG8gdGhlIENBUyBGaWxlTWFuYWdlciAKKyAgd2hlcmUgdGhlICJwcm9kdWN0X2lkIiBjb2x1bW4gaXMgb2YgdHlwZSBzdHJpbmcuCisgIChsdWNhKQorCisqIE9PRFQtNTQ1IEFsbG93IEN1cmF0b3Igd2ViIGFwcCB0byB1c2UgYSBjb25maWd1cmFibGUgQ0FTIENhdGFsb2cgRmFjdG9yeSAKKyAgYXMgc3BlY2lmaWVkIGluIGN1cmF0b3IueG1sLgorICAobHVjYSkKKworKiBPT0RULTU0MyBVcGRhdGUgRXhwSW1wQ2F0YWxvZyB0b29sIHRvIGFsbG93IGNvcmUgTWV0YWRhdGEgdG8gcGFzcyB0aHJvdWdoIAorICB3aGVuIEVtYmVkZGVkIENhdGFsb2dzIGFyZSB1c2VkIChtYXR0bWFubiwgY2lucXVpbmkpCisKKyogT09EVC01NDIgTmVlZCB0byB1cGRhdGUgbG9nZ2luZy5wcm9wZXJ0aWVzIGZvciBhbGwgc2VydmVycyBwb3N0IENBUyBDTEkKKyAgKG1hdHRtYW5uKQorCisqIE9PRFQtNTM1IFByb3ZpZGUgY2FwYWJpbGl0eSB0byByZW1vdmUgbWV0YWRhdGEgdGFncyB0aHJvdWdoIEN1cmF0b3IgCisgIHdlYiBhcHAuIChsdWNhKQorCisqIE9PRFQtNTMzIEFsbG93IFNvbHJJbmRleGVyIHRvIHF1ZXJ5IGFuZCBpbmdlc3QgcHJvZHVjdHMgZnJvbSB0aGUgRmlsZSAKKyAgTWFuYWdlciBjYXRhbG9nIGJ5IG5hbWUuIChsdWNhKQorCisqIE9PRFQtNTM0IEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gYSBwcm9kdWN0IGlzIGxvb2tlZCBieSBpZCBpbiB0aGUgY2F0YWxvZyAKKyAgYW5kIG5vdCBmb3VuZC4gKGx1Y2EpCisgICAgICAgICAgICAgICAgICAgICAgCisqIE9PRFQtNTI5IEFsbG93IEx1Y2VuZSBDYXRhbG9nIHRvIGJlICJsZW5pZW50IiB3aXRoIHJlc3BlY3QgdG8gWE1MIHZhbGlkYXRpb24sCisgIGkuZS4gYWxsb3cgaGFuZGxpbmcgb2YgZHluYW1pY2FsbHkgbmFtZWQgZmllbGRzIGlmIHRoZSAibGVuaWVudCIgZmxhZyBpcyBzZXQgCisgIChkZWZhdWx0cyB0byBmYWxzZSkuIChsdWNhKQorCisqIE9PRFQtNTMwIEJ1ZyBmaXg6IGNyYXdsZXIgTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIgaGFkIGEgbGlzdCBvZiBwcmVjb25kaXRpb24gCisgIGJlYW5zIHRoYXQgd2FzIG5vdCBpbml0aWFsaXplZCB0byBhbiBlbXB0eSBsaXN0LCB3aXRoIHdvdWxkIGNhdXNlIGEgU3ByaW5nIAorICBpbml0aWFsaXphdGlvbiBleGNlcHRpb24gd2hlbiBtb3JlIHRoYW4gb25lIHByZWNvbmRpdGlvbnMgd2FzIGluamVjdGVkLiAobHVjYSkKKyAgICAgICAgICAgCisqIE9PRFQtNTMxIEJ1ZyBmaXg6IHRoZSBsZWdhY3kgU3ByaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBsZWdhY3ktY21kLWxpbmUtb3B0aW9ucy54bWwgCisgIHdhcyBtaXNzaW5nIHNvbWUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGJlYW5zICJub1JlY3VyIiBhbmQgImNyYXdsRm9yRGlycyIuCisgIChsdWNhKQorICAgICAgICAgICAKKyogT09EVC01MzIgQnVnIGZpeDogcHJlLWNvbmRpdGlvbiBiZWFuICJBcHJpb3JpVW5pcXVlc3NDaGVja1dpdGhGaWxlbWdyIiB3YXMgbWlzc2luZyAKKyB0aGUgZmlsZW1nclVybCBwcm9wZXJ0eSwgd2hpY2ggd2FzIHRoZXJlZm9yZSBuZXZlciBzZXQgYXQgaW5pdGlhbGl6YXRpb24uIChsdWNhKQorCisqIE9PRFQtNTIyIFByb3ZpZGVkIGFkZGl0aW9uYWwgQ3VyYXRvciBSRVNUIGVuZHBvaW50OiAiL21ldGFkYXRhL3VwZGF0ZSIgdGhhdCB1cGRhdGVkIAorICBwcm9kdWN0IG1ldGFkYXRhIGluIHBsYWNlLCBpLmUuIHByZXNlcnZlcyBhbGwgZXhpc3RpbmcgY2F0YWxvZyBtZXRhZGF0YSAobHVjYSkKKworKiBPT0RULTUyMyBVcGRhdGVkIEN1cmF0b3IgQ1hGIGRlcGVuZGVuY3kgdG8gMi42LjAgYW5kIHJlbW92ZWQgRklYTUUgcGF0Y2ggdG8gCisgIGV4dHJhY3QgImlkIiBmcm9tICIvbWV0YWRhdGEvY2F0YWxvZyIgcmVxdWVzdCAobHVjYSkKKworKiBPT0RULTUyOCBNZXJnZWQgYmFjayBjaGFuZ2VkIHRvIEN1cmF0b3JMdWNlbmVDYXRhbG9nIGludG8gRmlsZSBNYW5hZ2VyIEx1Y2VuZUNhdGFsb2csCisgIGFuZCBjaGFuZ2UgQ3VyYXRvciB0byB1c2UgbWFpbnN0cmVhbSBGaWxlIE1hbmFnZXIgTHVjZW5lIENhdGFsb2cgKGx1Y2EpCisKKyogT09EVC0yNzIgRW5hYmxlIFJlbW92YWwgb2YgRmluaXNoZWQgSW5nZXN0aW9uIFRhc2tzCisgIChNaWNoYWVsIEpveWNlIHZpYSBtYXR0bWFubikKKworKiBPT0RULTMyOCBSZW1vdmUganBsLm5hc2EuZ292IHJlZmVyZW5jZXMgZnJvbSBjb2RlIAorICAoTWljaGFlbCBKb3ljZSB2aWEgbWF0dG1hbm4pCisKKyogT09EVC01MjAgRGVmYXVsdCBDcmF3bGVyIGxhdW5jaGVyIGRvZXNuJ3QgcmVmZXJlbmNlIEZpbGVNYW5hZ2VyIAorICBwcm9wZXJ0aWVzIChNaWtlIEpveWNlIHZpYSBtYXR0bWFubikKKworKiBPT0RULTUwMjogU3VwcG9ydCBwcmUgYW5kIHBvc3QgY29uZGl0aW9ucyBpbiBXb3JrZmxvdyBQcm9jZXNzb3IgCisgIFF1ZXVlIChtYXR0bWFubikKKworKiBPT0RULTUxNjogQWRkIFdvcmtmbG93TGlmZWN5Y2xlIHRlc3RzIHRoYXQgY2hlY2sgcGN0Q29tcGxldGUgZm9yIAorICB3ZW5naW5lIGFuZCB3MSBzdHlsZSBsaWZlY3ljbGVzIChtYXR0bWFubikKKworKiBPT0RULTUwMTogTWV0aG9kIHRvIGNyZWF0ZSBQcm9jZXNzb3IgZnJvbSBJbnN0YW5jZSBzaG91bGQgYmUgYmFzZWQgb24gCisgIEdyYXBoIHN0cnVjdHVyZSAobWF0dG1hbm4pCisKKyogT09EVC01MTE6IFNvbHIgSW5kZXhlciBEYXRlIEZvcm1hdHRpbmcgUmVtb3ZlcyBNZXRhZGF0YSAocHJhbWlyZXopCisKKyogT09EVC01MTA6IFNvbHJJbmRleGVyIGZhaWxzIG9uIFByb2R1Y3RUeXBlcyB0aGF0IGhhdmUgMCBwcm9kdWN0cyAocHJhbWlyZXosIGFoYXJ0KQorCisqIE9PRFQtNDk2OiBDb252ZXJ0IEVuZ2luZVJ1bm5lciBpbnRlcmZhY2UgdG8gdGFrZSBUYXNrUHJvY2Vzc29yIChtYXR0bWFubikKKworKiBPT0RULTUwNTogUmVtb3ZlIHN5bmNocm9ub3VzIFJ1bm5lciAobWF0dG1hbm4pCisKKyogT09EVC00OTg6IE92ZXJ3cml0ZSBhbmQgYnJpbmcgYmFjayAwLjMgVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lIHBsdXMgCisgIHBhdGNoZXMgKG1hdHRtYW5uKQorCisqIE9PRFQtNTAwOiBSZW5hbWUgcHJvcGVydHkgZm9yIG1heCB0aHJlYWRzIGluIEFzeW5jTG9jYWxFbmdpbmVSdW5uZXIgKG1hdHRtYW5uKQorCisqIE9PRFQtNDk3OiBNYWtlIFdvcmtmbG93UHJvY2Vzc29yIFByaW9yaXR5U29ydGVycyB0aHJlYWQtc2FmZSAobWF0dG1hbm4pCisKKyogT09EVC00OTI6IFJlZmFjdG9yIFdvcmtmbG93IEluc3RhbmNlIHJlcG8gdG8gc3RvcmUvcmV0cmlldmUgdGhhdCBzdGF0ZSAKKyAgaW5mb3JtYXRpb24gKG1hdHRtYW5uKQorCisqIE9PRFQtNDkwOiBSZWZhY3RvciBXb3JrZmxvd1Byb2Nlc3NvciB0byBwdXNoIGFsbCBvZiBpdHMgc3RhdGUgaW5mb3JtYXRpb24gCisgIGludG8gV29ya2Zsb3cgSW5zdGFuY2UgKG1hdHRtYW5uKQorCisqIE9PRFQtNDMyOiBBZGQgRmlsZVNpemUgdG8ga25vdyBtZXRhZGF0YSBmaWVsZHMgc2V0IGJ5IENBUy1DcmF3bGVyIAorICAoYmZvc3RlciB2aWEgbWF0dG1hbm4pCisKKyogT09EVC0zODE6IENyZWF0ZSBSdW5uZXIgZnJhbWV3b3JrIHRvIGFsbG93IGZsZXhpYmxlIFdvcmtmbG93VGFzayAKKyAgZXhlY3V0aW9uIG9uIGRpZmZlcmVudCBydW50aW1lcyAobWF0dG1hbm4sIGJmb3N0ZXIpCisKKyogT09EVC0yMTU6IFdvcmtmbG93MiBBcmNoaXRlY3R1cmUgKG1hdHRtYW5uLCBiZm9zdGVyLCBzaGVyeWxqKQorCisqIE9PRFQtMzEwOiBQb3J0IFdFbmdpbmUgdG8gdHJ1bmsgKG1hdHRtYW5uLCBiZm9zdGVyLCBzaGVyeWxqKQorCisqIE9PRFQtNDg3OiBNZXRhZGF0YUJhc2VkUHJvZHVjdE1vdmVyIHRvIGhhbmRsZSB3aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9ucyBtYXRjaCAoY2dvb2RhbGUpCisKKyogT09EVC00ODg6IEVuaGFuY2VkIFNvbHIgSW5kZXhlciBjYXBhYmlsaXRpZXMgKHByYW1pcmV6KQorCisqIE9PRFQtMzkwOiBSZW1vdmFsIG9mIG9wdGltaXplIGNhbGwgaW4gTHVjZW5lIFdvcmtmbG93IEluc3RhbmNlIFJlcG9zaXRvcnkgKHByYW1pcmV6KQorCisqIE9PRFQtNDg2OiBXb3JrZmxvd0luc3RhbmNlIHRyaWVzIHRvIGNhc3QgbnVsbCBzdHJpbmdzIGludG8gZGF0ZXMgY2F1c2luZworICBleGNlcHRpb25zIG9uIGdldHRlcnMvc2V0dGVycyAobWF0dG1hbm4pCisKKyogT09EVC00ODM6IEZpeCB0byBwcmV2ZW50IE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpbiBYbWxScGNTdHJ1Y3RGYWN0b3J5IChybGFpZGxhdykKKworKiBPT0RULTQ3MTogQWRkZWQgbmFtZXNwYWNlIGRlZmluaXRpb25zIHRvIFJTUyBjb25maWcgZmlsZXMgZm9yIENBUyBSRVNUIEFQSSAocmxhaWRsYXcpCisKKyogT09EVC00Njk6IE1vZGlmaWVkIFJTU1Byb2R1Y3RTZXJ2bGV0IHRvIHJlbW92ZSBoYXJkLWNvZGVkIG5hbWVzcGFjZXMgYW5kIGFsbG93IAorY29uZmlndXJhYmxlIG5hbWVzcGFjZXMgdmlhIFJTUyBjb25maWcgZmlsZXMgKHJsYWlkbGF3KQorCisqIE9PRFQtNDg1OiBGYWN0b3J5IG91dCBFbmdpbmVSdW5uZXIgYW5kIFdvcmtmbG93UHJvY2Vzc29yIGNsYXNzZXMgaW50byB0aGVpciBvd24gcGFja2FnZXMgKGJmb3N0ZXIpCisKKyogT09EVC00ODE6IENBUy1QdXNocHVsbCB1bmlxdWVNZXRhZGF0YUVsZW1lbnQgaXMgYmVpbmcgbG9hZGVkIGFzIGVtcHR5IFN0cmluZyBpbnN0ZWFkIG9mIG51bGwgKGJmb3N0ZXIpCisKKyogT09EVC00NzQ6IEZpeGVkIHRoZSBwcm9iZW0gaGF2aW5nIGluIGEgY29uZmlndXJhdGlvbiBmaWxlIAorICBQcm90b2NvbEZhY3RvcnlJbmZvLnhtbCAobWF0dG1hbm4sIFl1bkhlZSBLYW5nKQorCisqIE9PRFQtNDc4OiBCYWxhbmNlOiBOZXcgaG9vayBmb3IgaG9va3MucGhwIChuaGlkYWxnbyB2aWEgYWhhcnQpCisKKyogT09EVC00NzY6IFJlbW90ZVNpdGVGaWxlIGRvZXNuJ3QgYWx3YXlzIHNldCBSZW1vdGVTaXRlIChiZm9zdGVyKQorCisqIE9PRFQtNDc3OiBDb21tb25zTmV0RnRwUHJvdG9jb2wgdGhyb3dzIGV4Y2VwdGlvbiBvbiBzdWNjZXNzZnVsIGRvd25sb2FkIChiZm9zdGVyKQorCisqIE9PRFQtMzI5OiBPT0RUIFBFQVIgQ2hhbm5lbCAoR2F2aW4gTWNEb25hbGQgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNDcyOiBQdW55IE1vZHVsZSAtIFJldHVybiB0byBwcmV2aW91cyBwYWdlIG9uY2UgdGhlIHVzZXIgaXMgZG9uZSBlZGl0aW5nICAoc2todWRpa3kpCisKKyogT09EVC00Njc6IENoYW5nZSBTY2lQZ2VDb25maWdGaWxlV3JpdGVyIHRvIER5bmFtaWNDb25maWdGaWxlV3JpdGVyIChiZm9zdGVyKQorCisqIE9PRFQtNDY0OiBBZGQgZmlsZSBzdGFnaW5nIHN1cHBvcnQgdG8gQ0FTLVBHRSdzIFhtbEZpbGVQZ2VDb25maWdCdWlsZGVyIChiZm9zdGVyKQorCitSZWxlYXNlIDAuNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JlbGVhc2UgRGF0ZTogSnVuZSAxM3RoLCAyMDEyCisKKyogT09EVC00NDYgQWRkaXRpb24gb2YgUHVueSBtb2R1bGUgdG8gQmFsYW5jZSAoc2todWRpa3kpCisKKyogT09EVC00NjI6IEluY2x1ZGUgc3VwcG9ydCBmb3Igc3BlY2lhbCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiBvcGVuZGFwLXBzIGNvbmZpZ3VyYXRpb24gZmlsZSAobHVjYSkKKworKiBPT0RULTQ2MzogSWdub3JlIGNvbnRhaW5lci10eXBlIERBUyBhdHRyaWJ1dGVzIHdoZW4gcGFyc2luZyBtZXRhZGF0YSBpbiBvcGVuZGFwLXBzIG1vZHVsZSAobHVjYSkKKworKiBPT0RULTQwMjogUHJvdmlkZWQgZGVmYXVsdCBGaWxlIE1hbmFnZXIgcG9saWN5IGFuZCBSU1MgY29uZmlndXJhdGlvbiBmb3IgCitwcm9kdWN0cyB3aXRoIGxvY2F0aW9uIG1ldGFkYXRhLiAgU2VlIHN1YnRhc2tzIE9PRFQtNDQ5LCA0NTIgYW5kIDQ1My4gKHJsYWlkbGF3KQorCisqIE9PRFQtNDQ5OiBBZGRlZCBkZWZhdWx0IEdlb1JTUyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBDQVMgUkVTVCBSU1Mgc2VydmljZS4gKHJsYWlkbGF3KQorCisqIE9PRFQtNDUyOiBNb3ZlZCBGaWxlIE1hbmFnZXIgcG9saWN5IGZpbGVzIGZvciBHZW5lcmljRmlsZSB0eXBlIChlbGVtZW50cy54bWwsIHByb2R1Y3QtdHlwZXMueG1sLCAKK3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwpIHRvIGZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcmUgc3ViZGlyZWN0b3J5LiAgCitVcGRhdGVkIHNpeCB1bml0IHRlc3RzIHRvIHVzZSB0aGUgbmV3IHN1YmRpcmVjdG9yeS4gKHJsYWlkbGF3KQorCisqIE9PRFQtNDUzOiBBZGRlZCBGaWxlIE1hbmFnZXIgcG9saWN5IGZpbGVzIGZvciBzaW1wbGUgTG9jYXRpb25Bd2FyZVByb2R1Y3QKKyhlbGVtZW50cy54bWwsIHByb2R1Y3QtdHlwZXMueG1sLCBwcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sKS4gKHJsYWlkbGF3KQorCisqIE9PRFQtNDU3OiBhZGQgbWlzc2luZyBEYXRhdGFibGVzIGltYWdlcyBmb3IgcGFnaW5nIHRocm91Z2ggQ2FzLWJyb3dzZXIgaW5kZXggcGFnZSAoc2todWRpa3kpCisKKyogT09EVC00NTUgU21hbGwgQ1NTIHR3ZWFrIGZvciB0aGUgT1BTVUkgV2lja2V0IEFwcCAoY2dvb2RhbGUpCisKKyogT09EVC00NTEgSW1wbGVtZW50ZWQgQ0FTIG1ldGFkYXRhIHByZWNvbmRpdGlvbiBjbGFzcyB0byBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIGdpdmVuIG1hcmtlciBmaWxlCisgICAgICAgICAgIHdpdGhpbiBwcm9kdWN0IGRpcmVjdG9yeSAobHVjYSkKKworKiBPT0RULTQ0NSBFeHRlbmQgZW52IHJlcGxhY2Ugc3VwcG9ydCBpbnRyb2R1Y2VkIGluIE9PRFQtMzQzIChhaGFydCkKKworKiBPT0RULTQ0NCBVdGlscyBjbGFzcyBtaXNzaW5nIGZyb20gQmFsYW5jZSBjYXMtYnJvd3NlciBtb2R1bGUgKGFoYXJ0KQorCisqIE9PRFQtNDQ4IGFkZGVkIG1pc3NpbmcgY2hhcmFjdGVyIChza2h1ZGlreSkKKworKiBPT0RULTQ0NyBjaGFuZ2VkIHJlZmVyZW5jZSB0byBDQVMtU1NPIGRpcmVjdG9yeSBpbiB0aGUgcHJvZmlsZSBtYW5hZ2VtZW50IG1vZHVsZSBSRUFETUUudHh0IChza2h1ZGlreSkKKworKiBPT0RULTQ1MCBDcmF3bGVyIGJlaW5nIGFibGUgdG8gZGVsZXRlIGEgbm9uLWVtcHR5IHByb2R1Y3QgZGlyZWN0b3J5CisgIHVwb24gc3VjY2Vzc2Z1bCBwcm9kdWN0IGluZ2VzdGlvbiAobHVjYSkKKworKiBPT0RULTQyMSBNYWtlIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciB1bmRlcnN0YW5kIAorICBXb3JrZmxvd1N0YXRlcyAobWF0dG1hbm4pCisKKyogT09EVC00NDAgUmVwbGFjZSBsZWdhY3kgZ2V0TWV0YWRhdGEoIlVVSUQiKSBjYWxscyB3aXRoIAorICBnZXRNZXRhZGF0YSgiQ0FTLiIgKyBDb3JlTWV0S2V5cy5QUk9EVUNUX0lEKSAodGhvbWFzKQorCisqIE9PRFQtNDQyIEFwYWNoZSBwcm9qZWN0IGJyYW5kaW5nIHJlcXVpcmVtZW50czogRE9BUAorICBmaWxlIFtQQVRDSF0gKFNoYW5lIEN1cmN1cnUgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNDM4IE1ha2UgQ0FTLUNyYXdsZXJzIE1pbWVFeHRyYWN0b3JDb25maWdSZWFkZXIgcmVsYXRpdmUgZmlsZSBwYXRocyBiZSByZWxhdGl2ZSB0byBpdHMKKyAgIFhNTCBmaWxlIChiZm9zdGVyKQorIAorKiBPT0RULTQyNiBJbnRyb2R1Y2UgYSBDQVMtTWV0YWRhdGEgYmFzZWQgcmVuYW1pbmcgaW50ZXJmYWNlIChiZm9zdGVyKQorCisqIE9PRFQtNDM1IFJlZmFjdG9yIEdyYXBoIGFuZCBQYXJlbnRDaGlsZFdvcmtmbG93IGNsYXNzIAorICBvdXRzaWRlIG9mIFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5IChtYXR0bWFubikKKworKiBPT0RULTE1NyBQQ1MgT3BlcmF0b3IgVXNlciBJbnRlcmZhY2Ugd2ViIGFwcGxpY2F0aW9uICAKKyAgKG1hdHRtYW5uLCBhaGFydCwgY2dvb2RhbGUsIHByYW1pcmV6KQorCisqIE9PRFQtNDAxIGFkZGVkIHByb2ZpbGUgbWFuYWdlbWVudCBtb2R1bGUgdG8gYmFsYW5jZSBtb2R1bGVzIGRpcmVjdG9yeSAoc2todWRpa3kpCisgIAorKiBPT0RULTQzMyBGaXggcmV0cmlldmVGaWxlQnlOYW1lIGFuZCByZXRyaWV2ZUZpbGVCeUlkIGJ1eSBzZXR0aW5nIHRoZSBwcm9kdWN0J3MgcmVmZXJlbmNlcyAKKyAgYmVmb3JlIGNhbGxpbmcgcmV0cmlldmVQcm9kdWN0ICh0aG9tYXMpCisKKyogT09EVC00MzAgVXBkYXRlIGFsbCBib29sZWFuIHR5cGUgYmVhbiBwcm9wZXJ0aWVzIGluIHRoZSBjcmF3bGVyIGNtZC1saW5lLW9wdGlvbnMueG1sICh0aG9tYXMpCisKKyogT09EVC00MTIgQnVnZml4OiBNb3ZlTWV0YWRhdGFUb0ZhaWx1cmVEaXIgc2hvdWxkIHJlYWQgTW92ZU1ldGFkYXRhRmlsZVRvRmFpbHVyZURpciAodGhvbWFzKQorCisqIE9PRFQtNDI4IENyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIGRvZXNuJ3Qgc2V0IGxpc3QgcHJvcGVydGllcyBmb3IgU3ByaW5nCisgIFByb3BlcnR5T3ZlcnJpZGVDb25maWd1cmVyIGNvcnJlY3RseSAoYmZvc3RlcikKKworKiBPT0RULTQyOSBmaWxlbWdyIHF1ZXJ5IHRocm93cyBOUEUgd2hlbiBzb3J0aW5nIGJ5IGtleSB3aXRoIHBvc3NpYmx5IGVtcHR5IHZhbHVlcyAocmlja2RuKQorCisqIE9PRFQtNDI3IGZpbGVtZ3IgcXVlcnkgdGhyb3dzICJTdHJpbmcgaW5kZXggb3V0IG9mIHJhbmdlOiAtMSIgd2hlbiBzb21lIHByb2R1Y3RzIGhhdmUgdW5kZWZpbmVkCisgIG1ldGFkYXRhIHZhbHVlcyAocmlja2RuKQorCisqIE9PRFQtNDA1IEludHJvZHVjZWQgbmV3IHN5bnRheCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVwbGFjZW1lbnQgaW4gb3BlbmRhcHBzIG1vZHVsZSAobHVjYSkKKworKiBPT0RULTQyNSBDQVMtUEdFIGxvZ2dlciB1bml0LXRlc3QgZmFpbHMgYmVjYXVzZSBpdCBzb21ldGltZXMgZmluZHMgbG9nZ2VyIGxvY2sgZmlsZSAoYmZvc3RlcikKKworKiBPT0RULTQyMiBBbGxvdyBmb3IgQ0FTLVBHRSBQZ2VNZXRhZGF0YSB0byBiZSBkdW1wZWQgdG8gYW4geG1sCisgIGZpbGUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gKGJmb3N0ZXIpCisKKyogT09EVC00MTAgRGF0YVNvdXJjZUNhdGFsb2cgY29tcGF0aWJsZSB3aXRoIEh5cGVyc29uaWNTUUwgCisgIChtYXR0bWFubixyaWNrZG4sYmZvc3RlcixwcmFtaXJleikKKworKiBPT0RULTQxMyBmaWxlbWdyIHF1ZXJ5IHRocm93cyBOUEUgd2hlbiBzb21lIHByb2R1Y3RzIGhhdmUgdW5kZWZpbmVkIG1ldGFkYXRhIHZhbHVlcyAocmlja2RuKQorCisqIE9PRFQtNDIwIENBUy1QR0Ugc2hvdWxkIGZhaWwgd2hlbiBwcm9kdWN0IGluZ2VzdHMgZmFpbCAoYmZvc3RlcikKKworKiBPT0RULTQxOSBNYWtlIFBnZUNvbmZpZ0J1aWxkZXIgY29uZmlndXJhdGlvbiB2aWEgUGdlVGFza01ldEtleXMgKGJmb3N0ZXIpCisKKyogT09EVC00MTggSW1wcm92ZSBDQVMtUEdFIGxvZ2dpbmcgKGJmb3N0ZXIpCisKKyogT09EVC03MSBBZGQgbGlmZWN5Y2xlIG1vZGVsIHN1cHBvcnRpbmcgdHJhbnNpdGlvbiwgZG9uZSAKKyAgYW5kIHdhaXRpbmcgc3RhdGVzIChtYXR0bWFubikKKworKiBPT0RULTQxNCBDcmVhdGUgSmF2YSBMb2dnZXIgSGFuZGxlciBmb3IgQ0FTLVBHRSAoYmZvc3RlcikKKworKiBPT0RULTQxNSBBZGQgc3VwcG9ydCB0byBFeGVjVXRpbHMgY2FsbFByb2dyYW0gdG8gdGFrZSBPdXRwdXRTdHJlYW1zCisgIGZvciBmb3J3YXJkaW5nIHN0ZG91dCBhbmQgc3RkZXJyIChiZm9zdGVyKQorCisqIE9PRFQtMjQ5IFdoZW4gYSBub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUgUmVzb3VyY2UgTWFuYWdlbWVudCAKKyAgc3lzdGVtLCBpdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGFsbCBvZiBpdHMgcXVldWVzIGFzIHdlbGwgKGdhYmUgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMzc2IEFkZGl0aW9uIG9mIENhcy1Ccm93c2VyIEJhbGFuY2UgbW9kdWxlIChnYWJlKQorCisqIE9PRFQtNDExIFBvcnQgQ0FTLVBHRSdzIFBjc01ldGFkYXRhS2V5cyB0byBQZ2VUYXNrTWV0S2V5cyAoYmZvc3RlcikKKworKiBPT0RULTQwOSBDb252ZXJ0IENBUy1QR0UgbWV0YWRhdGEga2V5cyBhbmQgd29ya2Zsb3cgc3RhdHVzZXMgZnJvbSBzdGF0aWMgU3RyaW5ncyB0byBlbnVtcyAoYmZvc3RlcikKKworKiBPT0RULTQwNiBBZGQgQ0FTLVBHRSBzdXBwb3J0IGZvciBtdWx0aXBsZSBQcm9wZXJ0eSBBZGRlcnMgKGJmb3N0ZXIpCisKKyogT09EVC00MDMgUG9ydCB3ZW5naW5lIENvbnRyb2xNZXRhZGF0YSB0byBjYXMtcGdlJ3MgUGdlTWV0YWRhdGEgKGJmb3N0ZXIpCisKKyogT09EVC0zNCBBYmlsaXR5IGZvciBGaWxlIE1hbmFnZXIgdG8gc3RhZ2UgYW4gaW5nZXN0ZWQgUHJvZHVjdCB0byBvbmUgb2YgaXRzIGNsaWVudHMgKGJmb3N0ZXIpCisKKyogT09EVC00MDAgQWRkIG9wdGlvbnMgZm9yIENBUy1DcmF3bGVyJ3MgU2VuZE5vdGlmaWNhdGlvbiBDcmF3bGVyQWN0aW9uIChiZm9zdGVyKQorCisqIE9PRFQtMzk5IGNhcy1jbGkgc3ViLW9wdGlvbiByZXF1aXJlbWVudHMgZm9yIGhlbHAgcHJpbnRpbmcgd2FzIG5vdAorICB1c2luZyBwOnJlcXVpcmVkIGZvciBHcm91cFN1Yk9wdGlvbiAoYmZvc3RlcikKKyAKKyogT09EVC0zOTUgU2VyaWFsaXphYmxlTWV0YWRhdGEudG9YbWwoKSBkb2Vzbid0IHNldCBuYW1lc3BhY2Ugb24gcm9vdCBlbGVtZW50IChyaWNrZG4pCisKKyogT09EVC0zNjEgV29ya2Zsb3cgdGVzdCBldmVudCBmYWlscyB3aXRoIE5QRSAocmlja2RuKQorCisqIE9PRFQtMzczIFBDUyBPcHNVSSBjb21wb25lbnQgbm90IGxpc3RlZCBpbiBPT0RUIHBvbS54bWwgKGFoYXJ0KQorCisqIE9PRFQtMzk3IFhtbFJwY1dvcmtmbG93TWFuYWdlciB0ZXN0cyBkb24ndCBwcm9wZXJseSBjbGVhbiB1cCAKKyAgTHVjZW5lQ2F0YWxvZyByZW1uYW50cyAobWF0dG1hbm4pCisKKyogT09EVC0zOTYgQWRkIHNodXRkb3duIGhvb2sgdG8gdGhlIFdvcmtmbG93IE1hbmFnZXIgc2VydmVyIChtYXR0bWFubikKKworKiBPT0RULTM5NCBJbnRlZ3JhdGUgQ0FTLVByb3RvY29sIHdpdGggQ0FTLUNMSSAoYmZvc3RlcikKKworKiBPT0RULTM5MiBSZW1vdmUgb2xkIGNvbW1hbmQgbGluZSBvcHRpb24gY29kZSBmcm9tIGNvbW1vbnMgKGJmb3N0ZXIpCisKKyogT09EVC0zOTEgSW50ZWdyYXRlIENBUy1DYXRhbG9nIHdpdGggQ0FTLUNMSSAoYmZvc3RlcikKKworKiBPT0RULTM1MiBJbnRlZ3JhdGUgQ0FTLUNMSSBpbnRvIENBUy1DcmF3bGVyIChiZm9zdGVyKQorCisqIE9PRFQtMzg5IEx1Y2VuZSBXb3JrZmxvdyBJbnN0YW5jZSBSZXBvc2l0b3J5IGluZGV4IG5vdyBpbnRpYWxpemVkIG9uIHN0YXJ0dXAgKHByYW1pcmV6KQorCisqIE9PRFQtMzgyIEx1Y2VuZSBGaWxlTWFuYWdlciBpbmRleCBub3cgaW50aWFsaXplZCBvbiBzdGFydHVwIChwcmFtaXJleikKKworKiBPT0RULTM4OCBDbGVhcmx5IGluZGljYXRlIGxvY2F0aW9uIGZvciBsb2FkaW5nIGdsb2JhbGx5LXJlcXVpcmVkIEJhbGFuY2UgbW9kdWxlcyAoYWhhcnQpCisKKyogT09EVC0zNzkgRml4IENBUy1DTEkgaGVscCBvcHRpb24gc29ydGluZyBhbmQgYWRkZWQgaGFuZGxlciBpbml0aWFsaXphdGlvbiAoYmZvc3RlcikKKworKiBPT0RULTM2MiBDaGFuZ2UgQ21kTGluZUFjdGlvbiBuYW1lcyB0byBtYXRjaCB0aGVpciBDbWRMaW5lT3B0aW9uIGxvbmcgb3B0aW9uIChiZm9zdGVyKQorCisqIE9PRFQtMzcxIEltcHJvdmVtZW50cyBpbiB0aGUgcmljaG5lc3MgYW5kIGNvbnNpc3RlbmN5IG9mIG1ldGFkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBUSFJFRERTIGNhdGFsb2dzCisgIGluIHRoZSBvcGVuZGFwLXBzIG1vZHVsZSAobHVjYSkKKworKiBPT0RULTM0MSBYTUxQUyBzaG91bGQgYmUgYWJsZSB0byBzdHJlYW0gbGFyZ2UgcmVzdWx0cyAocmlja2RuKQorCisqIE9PRFQtMzc1IEltcHJvdmUgQXBwbGljYXRpb25SZXNwb25zZTo6aW5jbHVkZUphdmFzY3JpcHQgdG8gc3VwcG9ydCBpbmNsdWRpbmcgCisgIEphdmFTY3JpcHQgc25pcHBldHMgaW4gYWRkaXRpb24gdG8gc3RhdGljIGZpbGVzIChhaGFydCkKKworKiBPT0RULTM1NiBUb29sIHRvIGNsZWFuIFdvcmtmbG93IEluc3RhbmNlIHJlcG9zaXRvcmllcyAobWF0dG1hbm4sIGJmb3N0ZXIpCisKKyogT09EVC0zNzIgQ29ycmVjdCBMREFQQXV0aGVudGljYXRpb25Qcm92aWRlciBjbGFzcyBuYW1lIChTaGFrZWggS2h1ZGlreWFuIHZpYSBhaGFydCkKKworKiBPT0RULTI1NiB1cGRhdGVNZXRhZGF0YSBuZWVkZWQgaW4gWG1sUnBjRmlsZU1hbmFnZXIgKG1hdHRtYW5uKQorCisqIE9PRFQtMzY4IFJlZmFjdG9yaW5nIG9mIG1ldGFkYXRhIGV4dHJhY3Rpb24gZnVuY3Rpb25hbGl0eSBmb3IgCisgIG9wZW5kYXBwcyBtb2R1bGUgKEx1Y2EgQ2lucXVpbmksIG1hdHRtYW5uKQorCisqIE9PRFQtMzY2IEV4dGVuc2lvbiB0byBvcGVuZGFwcHMgbW9kdWxlIHRvIGV4dHJhY3QgQUxMIHZhcmlhYmxlcyAKKyAgaW4gRERTIHN0cmVhbSAoTHVjYSBDaW5xdWluaSwgbWF0dG1hbm4pCisKKyogT09EVC0zNjUgTWFpbiBjbGFzcyB0byBkcml2ZSBvcGVuZGFwcHMgcHJvZmlsZSBnZW5lcmF0aW9uIAorICAoTHVjYSBDaW5xdWluaSwgbWF0dG1hbm4pCisKKyogT09EVC0zNjcgSW50ZWdyYXRlIENBUyBwcm90b2NvbCBpbnRvIFB1c2hQdWxsIChtYXR0bWFubiwgYmZvc3RlcikKKworKiBPT0RULTM2NCBQcmV2ZW50IFhTUyBhdHRhY2tzIHZpYSBtYWxmb3JtZWQgcXVlcnkgc3RyaW5nIChhaGFydCkKKworKiBPT0RULTM2MyBBZGQgc3VwcG9ydCBmb3IgTHVjZW5lUXVlcnkgYWN0aW9uIHRvIG9wdGlvbmFsbHkgcmV0dXJuIG1vcmUgdGhhbgorICBqdXN0IFByb2R1Y3QgSUQgcmVzdWx0cyAoYmZvc3RlcikKKworKiBPT0RULTM1MSBJbnRlZ3JhdGUgQ0FTLUNMSSBpbnRvIENBUy1GaWxlbWdyIChiZm9zdGVyKQorCisqIE9PRFQtMzYwIEFkZCBzdXBwb3J0ZWQgZm9yIENtZExpbmVBY3Rpb24gZGV0YWlsZWQgaGVscCBkZXNjcmlwdGlvbiAoYmZvc3RlcikKKworKiBPT0RULTM1OSBDbWRMaW5lVXRpbGl0eSBpcyBub3QgcHJpbnRpbmcgYWN0aW9uIG1lc3NhZ2VzIChiZm9zdGVyKQorCisqIE9PRFQtMzU4IENoYW5nZSBDbWRMaW5lVXRpbGl0eSdzIHJ1bihTdHJpbmdbXSkgbWV0aG9kIHRvIHRocm93CisgIFJ1bnRpbWVFeGNlcHRpb24gd2hlbiBpbiBkZWJ1ZyBtb2RlIChiZm9zdGVyKQorCisqIE9PRFQtMzU3IENoYW5nZSBQcmludCBTdXBwb3J0ZWQgQWN0aW9ucyBTdGRDbWRMaW5lUHJpbnRlciBvdXRwdXQKKyAgZm9ybWF0IHRvIG1vcmUgInJlYWRhYmxlIiAoYmZvc3RlcikKKworKiBPT0RULTMzOCBYTUxQUyB1bml0IHRlc3RzIHNob3VsZCBjaGFuZ2UgY29uc3RydWN0b3IgdG8gCisgIHNldFVwKCkgKFJpY2t5IE5ndXllbiB2aWEgbWF0dG1hbm4pCisKKyogT09EVC0zMzcgWE1MUFNQcm9kdWN0SGFuZGxlciBtZXRob2RzIHNob3VsZCByZXR1cm4gZW1wdHkgbGlzdHMgaW5zdGVhZCAKKyAgb2YgbnVsbCAoUmlja3kgTmd1eWVuIHZpYSBtYXR0bWFubikKKworKiBPT0RULTMzNiB4bWxwcyBzaG91bGQgb21pdCBqb2luaW5nIG9mIHRhYmxlcyB0aGF0IGFyZSB1bm5lY2Vzc2FyeSB0byAKKyAgZnVsZmlsbCBxdWVyeSAoUmlja3kgTmd1eWVuIHZpYSBtYXR0bWFubikKKworKiBPT0RULTMzOSBNYXBwaW5nUmVhZGVyIHNob3VsZCBhZGQgZGVmYXVsdCBqb2luIHRhYmxlIHRvIERhdGFiYXNlVGFibGUgCisgIGlmIG5vbmUgZGVmaW5lZCAoUmlja3kgTmd1eWVuIHZpYSBtYXR0bWFubikKKworKiBPT0RULTM1NCBDQVMtQ0xJIFN0ZENtZExpbmVQcmludGVyIGRvZXNuJ3QgcHJpbnQgb3B0aW9uYWwgc3ViLW9wdGlvbnMKKyAgZm9yIGdyb3VwIG9wdGlvbnMgKGJmb3N0ZXIpCisKKyogT09EVC0zNDMgQWRkIHN1cHBvcnQgZm9yIGJhc2ljICdlbnZpcm9ubWVudCByZXBsYWNlbWVudCcgaW4gCisgIG1vZHVsZSBjb25maWcuaW5pIGZpbGVzIChhaGFydCkKKworKiBPT0RULTM1MyBnZXRYbWxScGNQcm9kdWN0IGFuZCBnZXRQcm9kdWN0RnJvbVhtbFJwYyBzaG91bGQgYWxsb3cgCisgIG51bGwgdmFsdWVzIGZvciBwcm9kdWN0IG1lbWJlciB2YXJpYWJsZXMgc2luY2UgUHJvZHVjdCBpcyBqdXN0IAorICBhIGNhcnJpZXIgb2JqZWN0IChiZm9zdGVyKQorCisqIE9PRFQtMzQ5IENBUy1DTEkgQ21kTGluZUFjdGlvbiBzaG91bGQgdGFrZSBhIHByaW50ZXIgd2hpY2gKKyAgaXQgaXMgcmVxdWlyZWQgdG8gcHJpbnQgaXQncyBtZXNzYWdlcyB0byAoYmZvc3RlcikKKworKiBPT0RULTM1MCBGaWxlIE1hbmFnZXIgcXVlcnlfdG9vbCBidWcgZml4IGZvciBMdWNlbmUKKyAgc3R5bGUgcXVlcmllcyAoZ29vZGFsZSwgbWF0dG1hbm4sIGJmb3N0ZXIpCisKKyogT09EVC0zNDggSW50ZWdyYXRpb24gQ0FTLVJlc291cmNlIHdpdGggQ0FTLUNMSSAoYmZvc3RlcikKKworKiBPT0RULTM0NSBJbnRlZ3JhdGlvbiBDQVMtV29ya2Zsb3cgd2l0aCBDQVMtQ0xJIChiZm9zdGVyKQorCisqIE9PRFQtMzQ0IFdvcmtmbG93IENvbmRpdGlvbnMgYW5kIFRpbWVvdXQgU2Vjb25kcyBjYXVzZXMgCisgIGJhY2t3YXJkcyBpbmNvbXBhdCBTZXJEZSBpc3N1ZXMgd2l0aCBYTUwtUlBDIChtYXR0bWFubikKKworKiBPT0RULTMzMCBGYWN0b3Igb3V0IGNvbW1hbmQgbGluZSB1dGlsaXR5IGZyb20gb29kdC1jb21tb25zCisgICAgLSBjaGVjayBpbiBDQVMtQ0xJLi4uIGludGVncmF0aW9uIHRvIG90aGVyIGNvbXBvbmVudHMgdG8gY29tZSAoYmZvc3RlcikKKworKiBPT0RULTMzMyBYTUxQUyBxdWVyeSBkb2Vzbid0IHF1b3RlIGxpdGVyYWwgc3RyaW5nIAorICAoUmlja3kgTmd1eWVuLCBtYXR0bWFubiwgU2hlcnlsIEpvaG4pCisKKyogT09EVC0zMjMgQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIGluIFdvcmtmbG93IG1hbmFnZXIgCisgIGNsaWVudCB0byBnZXQgV29ya2Zsb3cgSW5zdGFuY2UgTWV0YWRhdGEgKFNoZXJ5bCBKb2huIHZpYSBtYXR0bWFubikKKworKiBPT0RULTUyIFVwZGF0ZSB0aGUgQ0FTIEZpbGUgTWFuYWdlciBVc2VyIEd1aWRlICh0aG9tYXMsIGdvb2RhbGUpCisKKyogT09EVC0zMjIgTERBUEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgY2xhc3MgcmVxdWlyZXMgCisgIGEgbm9uLWV4aXN0ZW50IHBhdGggKFNoYWtlaCBLaHVkaWt5YW4gdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMzIxIFBFQVIgaW5zdGFsbCBvZiBQSFAgZmlsZW1nciBpcyBub3Qgd29ya2luZyAKKyAgcHJvcGVybHkgKFNoYWtlaCBLaHVkaWt5YW4gdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMzI3IE9wZW4gU1NPIHBsdWctaW4gY2xpZW50IGZvciBDQVMtU1NPIChtYXR0bWFubiwgcHJhbWlyZXopCisKKyogT09EVC0zMjYgQSB0b29sIHRvIGR1bXAgdGhlIEZpbGUgTWFuYWdlciBjYXRhbG9nIG1ldGFkYXRhIAorICBpbnRvIFNvbHIgKG1hdHRtYW5uLCBwcmFtaXJleikKKworKiBPT0RULTM3IENyZWF0ZSBhbiBBY3Rpb24gdG8gR3JvdXAgb3RoZXIgQWN0aW9ucyBUb2dldGhlciAocHJhbWlyZXosIG1hdHRtYW5uKQorCisqIE9PRFQtMzYgQ3JlYXRlIGFuIEFjdGlvbiB0byBTdXBwb3J0IFNpbXBsZSBCcmFuY2hpbmcgKHByYW1pcmV6LCBtYXR0bWFubikKKworKiBPT0RULTE1MCBUb2dnbGVBY3Rpb24gYWRkaXRpb24gdG8gY3Jhd2xlciAoYmZvc3RlciwgbWF0dG1hbm4pCisKKyogT09EVC0zNCBDcmVhdGUgYW4gQWN0aW9uIHRvIEluZ2VzdCBhbiBBbmNpbGxhcnkgRmlsZSAobWF0dG1hbm4sIHByYW1pcmV6KQorCisqIE9PRFQtMzMgUmVmYWN0b3IgYW5kIEltcHJvdmUgRmlsZSBCYXNlZCBBY3Rpb25zIChtYXR0bWFubiwgcHJhbWlyZXopCisKKyogT09EVC0zNSBDcmVhdGUgYW4gQWN0aW9uIHRvIFNlbmQgYW4gRW1haWwgKG1hdHRtYW5uLCBwcmFtaXJleikKKworKiBPT0RULTMyMCBVcGRhdGUgT09EVCBBYm91dCBQYWdlIChBZGFtIEVzdHJhZGEgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNjEgYXBwZW5kVGFibGVOYW1lIHByb3BlcnR5IGZvciBtYXBwaW5nIGZpbGVzIGluIFhNTFBTIAorICBicmVha3MgY29sdW1ubmFtZS1iYXNlZCBsb29rdXAgaW4gCisgIFJlc3VsdFNldCAoUmlja3kgTmd1eWVuLCBtYXR0bWFubiwgZGF2ZWthbGUpIAorCisqIE9PRFQtMzE4IEZpeCBmb3IgSmVua2lucyBidWlsZHMgYW5kIGphdmEuaW8udG1wZGlyIGlzc3VlIAorICBmb3IgdGVzdGluZyB2aWEgTWF2ZW4gKG1hdHRhbm4sIE9saXZpZXIgTGFteSkKKyAgCisqIE9PRFQtMzE3IFdvcmtmbG93IFByaW9yaXR5IFNvcnRpbmcgKG1hdHRtYW5uLCBiZm9zdGVyKQorCisqIE9PRFQtMTcyIFVwZGF0ZSBDQVMgQ3VyYXRvciBUdXRvcmlhbCAodGhvbWFzIHZpYSBtYXR0bWFubikKKworKiBPT0RULTMxNiBBZGQgdGhlIFdvcmtmbG93TWFuYWdlciBVc2UgQ2FzZSBEaWFncmFtIGJhY2sgaW50byAKKyAgdGhlIFVzZXIgR3VpZGUgKG1hdHRtYW5uKQorCisqIE9PRFQtNDMgQWRkIHRoZSBGaWxlTWFuYWdlciBVc2UgQ2FzZSBEaWFncmFtIGJhY2sgaW50byB0aGUgCisgIFVzZXIgR3VpZGUgKG1hdHRtYW5uLCBjZ29vZGFsZSkKKworKiBPT0RULTMxMyBDb3B5cmlnaHQgc3RhdGVtZW50IG9uIE9PRFQgd2Vic2l0ZSBuZWVkcyB1cGRhdGluZyAKKyAgKG1hdHRtYW5uLCBHcmVnIFN0ZWluKQorCisqIE9PRFQtMzExIFRlc3QgZmFpbGluZyByZWxhdGVkIHRvIHdvcmtmbG93IHRhc2tzIGFuZCB0aGUgCisgIERhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnkgKG1hdHRtYW5uLCByaXZlcm1hLCBDZWNpbGlhIFMuIENoZW5nKQorCisqIE9PRFQtMjk5IFJlbmFtZSBhbGwgQXV0aGVudGljYXRpb24gcHJvcGVydGllcyB0byB1c2UKKyAgQXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBBdXRoIChhaGFydCwgU2hha2VoIEtodWRpa3lhbikKKworKiBPT0RULTMwOSBTZXF1ZW50aWFsV29ya2Zsb3dQcm9jZXNzb3IgZG9lc24ndCBuZWVkIHRvIGJlIGEgCisgIFRocmVhZCAobWF0dG1hbm4pCisKKyogT09EVC0yMDUgV29ya2Zsb3dJbnN0YW5jZXMgc2hvdWxkIGhhdmUgcHJlLWNvbmRpdGlvbnMgYXMgCisgIHdlbGwgKG1hdHRtYW5uKQorCisqIE9PRFQtMzA2IEFkZGVkIEZpbGVNYW5hZ2VyIFRvb2wgQWxpYXNlcyAobWF0dG1hbm4sIGdvb2RhbGUpCisKKyogT09EVC0yMDggV29ya2Zsb3dDb25kaXRpb25zIHNob3VsZCBiZSBpZGVudGlmaWFibGUgYXMgb3B0aW9uYWwgCisgIG9yIHJlcXVpcmVkIChtYXR0bWFubikKKworKiBPT0RULTIwOSBXb3JrZmxvdyBNYW5hZ2VyIER5bmFtaWMgV29ya2Zsb3dzIChtYXR0bWFubikKKworKiBPT0RULTIxMSBTdWIgV29ya2Zsb3dzIChtYXR0bWFubiwgcGVyIE9PRFQtNzApCisKKyogT09EVC0yMDcgV29ya2Zsb3dDb25kaXRpb25zIHNob3VsZCBoYXZlIGEgdGltZW91dCAobWF0dG1hbm4pCisKKyogT09EVC0zMDggV0VkaXRvciBzYXZlIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIChiZm9zdGVyIHZpYSBtYXR0bWFubikKKworKiBPT0RULTI5NiBXb3JrZmxvdyBFZGl0b3IgR1VJIChtYXR0bWFubiwgYmZvc3RlciwgYWhhcnQpCisKKyogT09EVC0yOTQgVXBkYXRlZCB3ZWJzaXRlIHRvIGFubm91bmNlIHJlbGVhc2Ugb2YgMC4zIChnb29kYWxlKQorCisqIE9PRFQtMTgwIEZpeGVkIHNtYWxsIHR5cG8gb24gd2Vic2l0ZSAoZ29vZGFsZSkKKworKiBPT0RULTcwIEFkZCBhYmlsaXR5IGZvciBzZXF1ZW50aWFsIGFuZCBwYXJhbGxlbCB0YXNrIAorICBzcGVjaWZpY2F0aW9ucyBmb3IgV29ya2Zsb3dzIChtYXR0bWFubiwgYmZvc3RlcikKKworKiBPT0RULTI5NSBCYXNpY1ZlcnNpb25lciBkb2Vzbid0IHdvcmsgd2l0aCBIaWVyYXJjaGljYWwgCisgIFByb2R1Y3RzIChtYXR0bWFubiwgVGltIFN0b3VnaCkKKworCitSZWxlYXNlIDAuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JlbGVhc2UgRGF0ZTogSnVuZSAyMHRoLCAyMDExCisKKyogT09EVC0yOTIgVXBkYXRlZCB3ZWJhcHAgcG9tcyB0byBpbmhlcml0IGZyb20gY29yZSBwYXJlbnQgcG9tIHRvIGFsbG93IG1hdmVuCisgIHJlbGVhc2UgcGx1Z2luIHRvIGZ1bmN0aW9uIHByb3Blcmx5IChwcmFtaXJleikKKworKiBPT0RULTI3OSBNYWtlIFJlc291cmNlIE1hbmFnZXIgRkFJTFVSRSBhbmQgU1VDQ0VTUyBhd2FyZSBpbnN0ZWFkIG9mIGp1c3QgCisgIENPTVBMRVRFIGF3YXJlIChtYXR0bWFubiwgYmZvc3RlcikKKworKiBPT0RULTI3OCBDQVMtUEdFIHJldHVybnMgc3VjY2VzcyBldmVuIGlmIHByb2R1Y3QgZmlsZShzKSBmYWlsIHRvIAorICBpbmdlc3QgKG1hdHRtYW5uLCBiZm9zdGVyKQorCisqIE9PRFQtMjQzIEFkZCBtZXRob2QgaXMgY2FsbGVkIG9uIGFscmVhZHkgZXhpc3Rpbmcgam9ic3BlYyAobWF0dG1hbm4sIGJmb3N0ZXIpCisKKyogT09EVC0xOTkgQ29yZU1ldEV4dHJhY3RvciBjaG9rZXMgb24gSGllcmFyY2hpY2FsIFByb2R1Y3RzIChtYXR0bWFubikKKworKiBPT0RULTIwMCBGaW5hbEZpbGVMb2NhdGlvbkV4dHJhY3RvciBjaG9rZXMgb24gSGllcmFyY2hpY2FsIHByb2R1Y3RzCisgIChtYXR0bWFubikKKworKiBPT0RULTE4NiBDb21tb24gYmFzZSBsaWJyYXJ5IGZvciBtb2R1bGFyIE9PRFQgd2ViIGFwcGxpY2F0aW9ucyBidWlsdCAKKyAgdXNpbmcgUEhQIChhaGFydCwgR2FiZSBSZXNuZWNrLCBTaGFrZWggS2h1ZGlreWFuKQorCisqIE9PRFQtMTkxIFB1c2hQdWxsIEZpbGVSZXRyaWV2YWxTeXN0ZW0gTlBFIGlmIG1pbWUgY29tbWVudCBmb3IgdHlwZSBkb2Vzbid0IAorICBpbmNsdWRlIGFtcGVyc2FuZCAobWF0dG1hbm4sIGJmb3N0ZXIpIAorCisqIE9PRFQtMTg0IEFkZCBhYmlsaXR5IHRvIHBvbGwgdGhlIGxvYWQgb2YgYW55IHBhcnRpY3VsYXIgbm9kZSAoR2FiZSBSZXNuZWNrIHZpYSBtYXR0bWFubikKKworKiBPT0RULTYwIEFubm95aW5nIGJ1aWxkIHdhcm5pbmdzIGFib3V0IGRlcGVuZGVuY2llcyB0aGF0IAorICBoYXZlICJiZWVuIHJlbG9jYXRlZCIgKG1hdHRtYW5uLCBkYXZpZGthbGUpCisKKyogT09EVC0xOTggQWRkIHRlc3QgaGFybmVzcyBmb3IgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyIChtYXR0bWFubikKKworKiBPT0RULTE4MiBBZGQgYWJpbGl0eSB0byBjaGFuZ2Ugbm9kZSBjYXBhY2l0eSBkdXJpbmcgZXhlY3V0aW9uIChHYWJlIFJlc25lY2sgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMTYyIFBhcmFtZXRyaWMgRGF0YSBNb2RlbCBGaWxlIE1hbmFnZXIgQ2F0YWxvZyAobWF0dG1hbm4sIGFoYXJ0LCBjZ29vZGFsZSkKKworKiBPT0RULTE5NSBYTUxWYWxpZGF0aW9uTGF5ZXI6IEVsZW1lbnRzIE1hcCBhbmQgUHJvZHVjdFR5cGUgdG8gRWxlbWVudCAKKyAgTWFwIGNhbiBiZWNvbWUgaW5jb25zaXN0ZW50IChNaWNoYWVsIFN0YXJjaCwgbWF0dG1hbm4sIGJmb3N0ZXIpCisKKyogT09EVC0xOTcgTnVsbCBkZXNjcmlwdGlvbnMgZnJvbSBlbGVtZW50cy54bWwgY2F1c2UgTlBFIHdoZW4gd3JpdGluZyAKKyAgZWxlbWVudHMueG1sIGZpbGUgYmFjayBvdXQgKG1hdHRtYW5uLCBNaWNoYWVsIFN0YXJjaCkKKworKiBPT0RULTE5MyBQR0UgRXh0ZXJuTWV0RXh0cmFjdG9yIE1ldFdyaXRlciAoYmZvc3RlciwgbWF0dG1hbm4pCisKKyogT09EVC0xOTIgUEdFIEZpbGVuYW1lRXh0cmFjdG9yTWV0V3JpdGVyIChtYXR0bWFubikKKworKiBPT0RULTE1NiBSZXdyaXRlIFdvcmtmbG93IE1vbml0b3Igd2ViYXBwIHVzaW5nIEFwYWNoZSBXaWNrZXQgKG1hdHRtYW5uKQorCisqIE9PRFQtMTkwIFdvcmtmbG93Q29uZGl0aW9uIGNvbmZpZ3VyYXRpb24gaXNuJ3QgcmVhZCAobWF0dG1hbm4pCisKKyogT09EVC0xODkgUmVmYWN0b3IgYW5kIGNsZWFuIHVwIFdvcmtmbG93Q29uZGl0aW9uIAorICBDb25maWd1cmF0aW9uIChtYXR0bWFubikKKworKiBPT0RULTE4OCBQcmVjb25kaXRpb24gQ29tcGFyYXRvciB0byBpZ25vcmUgZmlsZXMgd2l0aCAKKyAgYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbiAobWF0dG1hbm4pCisKKyogT09EVC0xMjkgSW50ZWdyYXRlIHdpdGggTWF2ZW4gQ2VudHJhbCAobWF0dG1hbm4pCisKKyogT09EVC0xNzcgUEhQIGltcGxlbWVudGF0aW9uIG9mIHNzbyAoYWhhcnQpCisKKyogT09EVC0xNzUgY2FzLXdtLXdlYmFwcCBqYXZhZG9jIGZhaWxzIG1hdmVuIGJ1aWxkIChtYXR0bWFubiwgYmZvc3RlcikKKworKiBPT0RULTU0IFhtbCBScGMgU2VyZGUgQ2FzdHMgTG9uZ3MgdG8gSW50cyAocHJhbWlyZXogdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMTU1IFJld3JpdGUgRmlsZSBNYW5hZ2VyIEJyb3dzZXIgd2ViYXBwIHVzaW5nIEFwYWNoZSBXaWNrZXQgKG1hdHRtYW5uKQorCisqIE9PRFQtMTg1IFRoZSBGaWxlIE1hbmFnZXIncyBxdWVyeV90b29sIHNjcmlwdCBkb2VzIG5vdCBoYW5kbGUgcXVvdGVkIHBhcmFtZXRlciB2YWx1ZXMuIChzaGFyZG1hbikKKworKiBPT0RULTE4MSBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgbWV0RmlsZUV4dCBhdHRyaWJ1dGUgb24gZXhlYyBlbGVtZW50IGluCisgIEV4dGVybk1ldEV4dHJhY3RvciAobWF0dG1hbm4pCisKKyogT09EVC0xNzkgVXBncmFkZSBQdXNoUHVsbCBGVFAgcHJvdG9jb2wgdG8gdXNlIENvbW1vbnMgTmV0IDIuMiAobWF0dG1hbm4pCisKKyogT09EVC0xNzYgQmFrZWQgaW4gZmlsZSBtYW5hZ2VyIHBvbGljeSBzaG91bGQgaW5jbHVkZSBleGFtcGxlIG9mIHByb2R1Y3QgdHlwZSBtZXRhZGF0YSAobWF0dG1hbm4pCisKKyogT09EVC0xNzQgVGVzdEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lciBmYWlscyBpbiB0aGUgbGF0ZXIgZXZlbmluZyAoYmZvc3RlciB2aWEgbWF0dG1hbm4pCisKKyogT09EVC0xNzIgSW1wcm92ZW1lbnRzIHRvIHRoZSBGaWxlbmFtZSBFeHRyYWN0b3IgKG1hdHRtYW5uKQorCisqIE9PRFQtMTcwIGNhcy1jYXRhbG9nIHNodWZmbGVzIHF1ZXJ5IHJlc3VsdHMgLiAuIC4gb3JkZXIgaXMgbG9zdCAoYmZvc3RlcikKKworKiBPT0RULTE2OSBQdXNocHVsbCBkaXJzdHJ1Y3QgeG1sIGZpbGVzIGZhaWwgdG8gcmVwbGFjZSBnbG9iYWwgCisgIHZhcmlhYmxlcyBpbiBuYW1lIGF0dHJpYnV0ZSBmb3IgZGlyIGFuZCBmaWxlIGVsZW1lbnRzIChiZm9zdGVyKQorCisqIE9PRFQtMTY2IEFiaWxpdHkgZm9yIHB1c3B1bGwgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgUHJvZHVjdE5hbWUgZm9yIGEgZ2l2ZW4gbWltZS10eXBlIChiZm9zdGVyKQorCisqIE9PRFQtMTY3IFByb2Nlc3NlZFBhZ2VJbmZvIGlzTGFzdFBhZ2UgZmFpbHMgZm9yIGNhc2UgUGFnZU51bSA9IDEgYW5kIHRvdGFsUGFnZXMgPSAwIChiZm9zdGVyKQorCisqIE9PRFQtMTY0IEFjcXVzaXRpb25EYXRlIFZlcnNpb25lciAobWF0dG1hbm4pCisKKyogT09EVC0xNjMgRGlyZWN0b3J5UHJvZHVjdCBWZXJzaW9uZXIgZm9yIHRoZSBGaWxlIE1hbmFnZXIgKG1hdHRtYW5uKQorCisqIE9PRFQtMTYwIEFsbG93IG51bWJlciBvZiBzZXNzaW9uIHByb3RvY29sIGNvbm5lY3Rpb25zIGluIAorICBwdXNocHVsbCB0byBiZSBjb25maWd1cmFibGUgZm9yIGVhY2ggc2l0ZSAoYmZvc3RlcikKKworKiBPT0RULTE2MSBQdXNoUHVsbCBnZXRUZXh0Q29udGV4dCgpL2dldE5vZGUoKSB2YWx1ZSBzdGlsbCBwb3NlcyBhbiBpc3N1ZSBmb3Igc29tZSBKVk1zIChiZm9zdGVyKQorCisqIE9PRFQtMTU5IER5bmFtaWMgUXVldWUvTm9kZSB3YXMgbm90IGFkZGVkIHRvIGNvbW1hbmQtbGluZSB1c2FnZSBwcmludG91dCAoYmZvc3RlcikKKworKiBPT0RULTE1MiBGaXhlZCB3ZWJzaXRlIGFuZCBkb3dubG9hZCBwYWdlLiAgUmV2ZXJ0ZWQgYmFjaworICB0byB0aGUgc2FtZSBzaXRlIGZyb20gT09EVC0xMzQuIChnb29kYWxlKQorCisqIE9PRFQtMTUzIFBhdGhVdGlscyBbREFURS5NT05USF0gYW5kIFtEQVRFLkRBWV0gc2hvdWxkIHBhZCB3aXRoIAorICBhICIwIiBub3QgYSAiICIgKGVtcHR5IHNwYWNlKSAoYmZvc3RlciB2aWEgbWF0dG1hbm4pCisKKyogT09EVC0xMzkgUENTIEpBWC1SUyBzZXJ2aWNlcyAobWF0dG1hbm4sIHByYW1pcmV6LCBiZm9zdGVyLCBhaGFydCkKKworKiBPT0RULTE1MSBBZGQgeGRvY3MgZm9yIG1vZHVsZXMgZnJvbSBvbGQgSlBMIHNpdGUgKG1hdHRtYW5uKQorCisqIE9PRFQtMTEwIFRlc3RFeHRlcm5NZXRFeHRyYWN0b3IgZmFpbHMgaWYgdGVtcCBkaXJlY3RvcnkgaXMgbW91bnRlZCBub2V4ZWMgKHByYW1pcmV6LCBzbWNsZWVzKQorCisqIE9PRFQtMTQ1IFN0cmVhbUdvYmJsZXIgc3RvcEdvYmJsaW5nQW5kRGllKCkgbWV0aG9kIGRvZXNuJ3Qgd2FpdCAKKyAgdW50aWwgZ29iYmxlIGlzIHJlYWxseSBkZWFkIChiZm9zdGVyKQorCisqIE9PRFQtMTEyIExpbmsgdG8gc2xpZGVzIG9uIHdlYi1ncmlkIE1hdmVuIHBhZ2UgaXMgYnJva2UgKG1hdHRtYW5uLCBnb29kYWxlKQorCisqIE9PRFQtMTMwIEZpeGVkIG1haWxpbmcgbGlzdCBsaW5rcyBmb3IgQ0FTIENvbXBvbmVudHMgbWF2ZW4gZ2VuZXJhdGVkIHNpdGUgcGFnZXMgKGdvb2RhbGUpCisKKyogT09EVC0xNDQgRXh0ZXJuQWN0aW9uIGZvciBjcmF3bGVyIHdoaWNoIGV4ZWN1dGVzIHNvbWUgZXh0ZXJuYWwgY29tbWFuZCAoYmZvc3RlcikKKworKiBPT0RULTE0MyBhZGRpdGlvbiBvZiBmbXByb2QgY29udGV4dC54bWwgYW5kIG1hdmVuIHNlcnZsZXQtYXBpIAorICBkZXBlbmRlbmN5IHNjb3BlIGNoYW5nZSB0byBwcm92aWRlciAoU2hha2VoIEtodWRpa3lhbiwgbWF0dG1hbm4pCisKKyogT09EVC0xNDIgVHlwZUhhbmRsZXIgU2VyRGUgaXMgYmFja3dhcmRzIGluY29tcGF0IHdpdGggb2xkZXIgCisgIHZlcnNpb25zIG9mIEZNIChtYXR0bWFubikKKworKiBPT0RULTE0MSBMdWNlbmVDYXRhbG9nIHBhZ2luYXRpb24gdGhyb3dzIEx1Y2VuZUV4Y2VwdGlvbiB3aGVuIAorICBncmFiYmluZyBvdXQgb2YgYm91bmRzIGhpdE51bQorCisqIE9PRFQtMTQwIGNvbW1vbnMtbGFuZyB2ZXJzaW9uIHNob3VsZCBiZSBzdGFuZGFyZGl6ZWQgb24gCisgICgyLjEuIHZzIDIuMykgKGJmb3N0ZXIpCisKKyogT09EVC0xMzUgUHJvY2VzcyBDb250cm9sIFN5c3RlbSBQYWNrYWdlIChtYXR0bWFubikKKworKiBPT0RULTEzOCBSZWZlcmVuY2UgY2xhc3MgcHJpbnRzIHN0YWNrIHRyYWNlIHdoZW4gbWltZSB0eXBlIHJlcG8gCisgIGNhbm5vdCBiZSBmb3VuZCAobWF0dG1hbm4pCisKKyogT09EVC0xMzYgTGFjayBvZiBjYXRhbG9nZWQgbWltZSB0eXBlIGNhdXNlcyByZWNvdmVyYWJsZSBleGNlcHRpb24gaW4gCisgIFJlZmVyZW5jZSBjb3JlIGNsYXNzIChtYXR0bWFubikKKworKiBPT0RULTEzNCBVcGRhdGUgd2Vic2l0ZSB3aXRoIE5ld3Mgb2YgUmVsZWFzZSAwLjIgYW5kIGxpbmtzIGZvciBkb3dubG9hZCAoZ29vZGFsZSkKKworKiBPT0RULTEyOCBDQVMgd29ya2Zsb3cgbW9uaXRvciB3ZWJhcHAgZmFpbHMgdG8gbG9hZCBkdWUgdG8gdW5wYXJzYWJsZSAKKyAgY2hhcmFjdGVyIGluIEpTUCBmaWxlIChSaXNoaSBWZXJtYSB2aWEgbWF0dG1hbm4pCisKK1JlbGVhc2UgMC4yIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JlbGVhc2UgRGF0ZTogSmFudWFyeSAxN3RoLCAyMDExCisKKyogT09EVC0xMTkgQ3VyYXRvciBSRVNUIEFQSSBkb2N1bWVudGF0aW9uIChtYXR0bWFubiwgam9zaHVhZ2EpCisKKyogT09EVC0xMTggQ0FTIEN1cmF0b3IgZG9lc24ndCBhbGxvdyBtZXRhZGF0YSB1cGRhdGUgb24gZmlsZSAKKyAgbWFuYWdlciBicm93c2VyIChtYXR0bWFubikKKworKiBPT0RULTExNiBDYXMgQ3VyYXRvciBkb2Vzbid0IGluZ2VzdCAobWF0dG1hbm4pCisKKyogT09EVC0xMTcgRmluYWwgRmlsZSBMb2NhdGlvbiBFeHRyYWN0b3IgZmFpbHMgaW4gYWN0dWFsIHVzZSBkZXNwaXRlIHVuaXQgdGVzdCAKKyAgcGFzc2luZyAobWF0dG1hbm4pCisKKyogT09EVC0xMTUgVGVzdENhdGFsb2dTZXJ2aWNlTG9jYWwgZmFpbHMgKG1hdHRtYW5uLCBwcmFtaXJleikKKworKiBPT0RULTY1IFJlbGVhc2UgcHJvY2VzcyBub3cgaW5jbHVkZXMgcHVibGlzaGluZyB0byBQeVBpIChwcmFtaXJleiwga2VsbHksIG1hdHRtYW5uKQorCisqIE9PRFQtMTEyIExpbmsgdG8gc2xpZGVzIG9uIHdlYi1ncmlkIE1hdmVuIHBhZ2UgaXMgYnJva2UgKG1hdHRtYW5uLCBrZWxseSkKKworKiBPT0RULTExMSBBbGxvdyBhIGZpbGUgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBVUkwgZm9yIHRoZSAKKyAgb3BlbmRhcHAgY29uZmlndXJhdG9yIChWaWN0b3IgSHdhbmcgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMTA4IEFiaWxpdHkgZm9yIHRoZSBmaWxlIG1hbmFnZXIgdG8gaW5nZXN0IGEgZmlsZSBpbiAKKyAgcGxhY2UgKEZhcmFuYWsgRGF2b29kaSB2aWEgbWF0dG1hbm4pCisKKyogT09EVC03MyBVcGRhdGUgdGhlIE9PRFQgd2Vic2l0ZSBAIGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcgIChnb29kYWxlLCBrZWxseSkgCisKKyogT09EVC04NiBUaGUgUHJvZHVjdCBTZXJ2ZXIgU2hvdWxkIEhhdmUgdGhlIENhcGFiaWxpdHkgdG8gVHVybiBPZmYgCisgIFJlcG9ydGluZyBvZiBGaWxlIFNpemVzIEZvciBGaWxlIExpc3RpbmcgRnVuY3Rpb25zIChNaWNoYWVsIENheWFuYW4gdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNDEgUHJvZHVjdCBDb25zdHJ1Y3RvciBkb2VzIG5vdCBzZXQgdHJhbnNmZXIgc3RhdHVzIChtYXR0bWFubikKKworKiBPT0RULTcyIFVuYWJsZSB0byBzZXQgTWV0YWRhdGEgYmFzZWQgb2ZmIFByb2R1Y3QgVmVyc2lvbmluZyBkdXJpbmcgCisgIFByb2R1Y3QgaW5nZXN0aW9uIChtYXR0bWFubiwgYmZvc3RlcikKKworKiBPT0RULTY4IEFkZCBOdW1iZXIgb2YgUHJvZHVjdCBIaXRzIHRvIFByb2R1Y3RQYWdlIChiZm9zdGVyLCBtYXR0bWFubikKKworKiBPT0RULTEwNyBUeXBvIGlkZW50aWZpZWQgaW4gZmlsZW1nci1jbGllbnQgdXNhZ2Ugc3RhdGVtZW50IChSaXNoaSBWZXJtYSB2aWEgbWF0dG1hbm4pCisKKyogT09EVC01OCB1cGRhdGUgZmlsZSBtYW5hZ2VyIHRvIHVzZSBUaWthIGZvciBtaW1lLXR5cGUgZGV0ZWN0aW9uIChtYXR0bWFubikKKworKiBPT0RULTEwNiBMb2dnaW5nIHByb3BlcnRpZXMgZm9yIE9QZU5EQVAgcHMgZG9lc24ndCBpbmNsdWRlIHJlcXVpcmVkIC5sZXZlbCBzdWZmaXggKG1hdHRtYW5uKQorCisqIE9PRFQtMTA1IEZpeCBHZW9zcGF0aWFsQ292ZXJhZ2UgaW4gT1BlTkRBUCBwcyAobWF0dG1hbm4pCisKKyogT09EVC0xMDQgQWxsb3cgY29uc3Qgc2VjdGlvbiB0byBwbHVtYiBpbmZvcm1hdGlvbiBpbnRvIHByb2ZpbGUgZWxlbWVudHMgKG1hdHRtYW5uKQorCisqIE9PRFQtOTAgKGNhcy1jcmF3bGVyIHBhdGNoKSBDQVMtUEdFIHJldHVybnMgc3VjY2VzcyBldmVuIGlmIHByb2R1Y3QgZmlsZShzKSBmYWlsZWQgdG8gaW5nZXN0IChiZm9zdGVyKQorCisqIE9PRFQtMTAzIG1vZGlmeSBjYXMtY29tbW9uJ3MgY21kLWxpbmUgcGFyc2VyIHRvIHRocm93IGEgc3BlY2lhbCBPcHRpb25IZWxwRXhjZXB0aW9uIGlmIG5vIGFyZ3MgCisgIGFyZSBzcGVjaWZpZWQgc28gaXQgY2FuIGJlIHNwZWNpZmljYWxseSB0cmFwcGVkIChiZm9zdGVyKQorCisqIE9PRFQtMTkyIGNhcy1jYXRhbG9nIHNob3VsZCByZXF1aXJlIGEgbWV0YWRhdGEgZmxhZyBmb3IgYWxsb3dpbmcgVHJhbnNhY3Rpb24gdXBkYXRlcyAoYmZvc3RlcikKKworKiBPT0RULTk1IGNhcy1jYXRhbG9nIHRocm93cyBleGNlcHRpb25zIHdpdGggYmxhbmsgbWVzc2FnZXMgKGJmb3N0ZXIpCisKKyogT09EVC05OCBSZXNvdXJjZSBNYW5hZ2VyIFRlc3RYbWxRdWV1ZVJlcG9zaXRvcnkgdGVzdCBmYWlscyBvbiBzb21lIGNvbXB1dGVycyBiZWNhdXNlIAorIDxoYXNobWFwPi5rZXlTZXQoKSBvcmRlciBpcyB1bmRlZmluZWQgKGJmb3N0ZXIsIG1hdHRtYW5uKQorCisqIE9PRFQtOTcgQWxsb3cgZm9yIHVuc29ydGVkIHBhZ2luZyBhY3Jvc3MgYWxsIGNhdGFsb2dzIHRvIGdpdmUgb3B0aW9uIG9mIGxvd2VyaW5nIGhlYXAgZm9vdHByaW50IChiZm9zdGVyKQorCisqIE9PRFQtOTYgY2FzLWNhdGFsb2cgcXVlcnkgcGFyc2VyIGZhaWxzIHdoZW4gYnVja2V0TmFtZXMgYXJlIGdpdmVuIChiZm9zdGVyKQorCisqIE9PRFQtOTQgRGF0YVNvdXJjZUluZGV4IGRvZXNuJ3QgZmlsdGVyIGl0J3MgcXVlcnkgdG8gdGhlIGJ1Y2tldCBuYW1lcyBwcm92aWRlZCBpbiB0aGUgUXVlcnlFeHByZXNzaW9uIChiZm9zdGVyKQorCisqIE9PRFQtOTMgU3ByaW5nIFhNTCByZXNvdXJjZSBjbGFzc3BhdGhzIGFyZSBzdGlsbCBzZXQgdG8gL2dvdi9uYXNhL2pwbC4uLiBhbmQgY29tbW9ucyBjbGFzc3BhdGhzIHdlcmUgbm90IHVwZGF0ZXMgdG8gcmVtb3ZlICdjYXMnIChiZm9zdGVyKQorCisqIE9PRFQtOTEgY2FzLWNvbW1vbnMgY29tbWFuZC1saW5lIGhlbHAgZm9yIGEgZ2l2ZW4gYXJndW1lbnRzIChiZm9zdGVyKQorCisqIE9PRFQtODkgKGNhcy1wdXNocHVsbCBwYXRjaCkgU3luY2hvbml6ZSBPT0RULUNBUyBjb21wb25lbnRzLCB3aGljaCBkZXBlbmQgb24gb25lIGFub3RoZXIsIG9uIGEgcGFydGljdWxhciBBcGFjaGUtVGlrYSB2ZXJzaW9uIChiZm9zdGVyKQorCisqIE9PRFQtODggbXZuIGVjbGlwc2U6ZWNsaXBzZSBmYWlscyB0byBtZXJnZSByZXNvdXJjZXMgKGJmb3N0ZXIpCisKKyogT09EVC04OSAoY2FzLW1ldGFkYXRhIHBhdGNoKSBTeW5jaG9uaXplIE9PRFQtQ0FTIGNvbXBvbmVudHMsIHdoaWNoIGRlcGVuZCBvbiBvbmUgYW5vdGhlciwgb24gYSBwYXJ0aWN1bGFyIEFwYWNoZS1UaWthIHZlcnNpb24gKGJmb3N0ZXIpCisKKyogT09EVC04NyBBZGQgZGF0ZSByb2xsIGR5bmFtaWMgcmVwbGFjZW1lbnQgZnVjdGlvbiB0byBQYXRoVXRpbHMgKGJmb3N0ZXIpCisKKyogT09EVC02MyBVc2UgaGFyZCBjb2RlZCB2ZXJzaW9uIG51bWJlcnMgaW4gc2hhcmVkIGNvbXBvbmVudCBQT01zIHNvIHRoYXQgTVZOIGluc3RhbGwgd29ya3MgKGJmb3N0ZXIpCisKKyogT09EVC04NSBYTUwgY29uZmlndXJhdG9yIGZvciBvcGVuZGFwIGNyYXNoZXMgb24gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMgZm9yIHNvbWUgZGF0YXNldHMgKFZpY3RvciBId2FuZyB2aWEgbWF0dG1hbm4pCisKKyogT09EVC03OCBBYmlsaXR5IGZvciBSZXNvdXJjZSBNYW5hZ2VyIHRvIGR5bmFtaWNhbGx5IGFkZC9yZW1vdmUgbm9kZXMgYW5kIG1vZGlmeSBxdWV1ZXMgYXQgcnVuLXRpbWUgKGJmb3N0ZXIpCisKKyogT09EVC03OSBMUlVTY2hlZHVsZXIgcmVtb3ZlcyBhIGpvYiBmcm9tIHRoZSBKb2JRdWV1ZSwgYnV0IGFkZHMgaXQgYmFjayBpZiBjYW4ndCBzY2hlZHVsZSBpdCwgd2hpY2ggKGluIHRoZSAKKyAgSm9iU3RhY2sgaW1wbCkgY2F1c2VzIEpvYlJlcG8gdG8gY3JlYXRlIGR1cGxpY2F0ZSBjb3BpZXMgb2YgdGhlIHNhbWUgSm9iU3BlYyB3aXRoIGRpZmZlcmVudCBKb2JJZHMgKGJmb3N0ZXIpCisKKyogT09EVC03NyBNYWtlIHJlc291cmNlIG1hbmFnZXIgUXVldWUgYXdhcmUgKGJmb3N0ZXIpCisKKyogT09EVC04MCBDcmVhdGUgQ2FjaGVkIEpvYlJlcG9zaXRvcnkgZm9yIGNhcy1yZXNvdXJjZSAoYmZvc3RlcikKKworKiBPT0RULTgyIE1ha2UgcmVzb3VyY2UgbWFuYWdlcidzIG5vZGUgaXAgYWRkcmVzc2VzIGVudlJlcGxhY2UtYWJsZSAoYmZvc3RlcikKKworKiBPT0RULTgzIHRoZSBhcnRpZmFjdGlkIGZvciBwdXNocHVsbCBzaG91bGQgY2hhbmdlIHRvIGNhcy1wdXNocHVsbCAoRmFyYW5hayBEYXZvb2RpIHZpYSBtYXR0bWFubikKKworKiBPT0RULTc2IENvbW1vbnMgVGltZUV2ZW50V2VpZ2h0ZWRIYXNoIHRocm93cyBhIFN0YWNrT3ZlcnRocm93IEVycm9yIHdoZW4gZXBzaWxvbiBpcyBsYXJnZSBhbmQgZXZlbnQgZHVyYXRpb24gaXMgc21hbGwgKGJmb3N0ZXIpCisKKyogT09EVC05IENyZWF0ZSBhIGdlbmVyaWMgT3BlbkRBUCBwcm9maWxlIHNlcnZlciAobWF0dG1hbm4sIFZpY3RvciBId2FuZywgc21jY2xlZXMpCisKKyogT09EVC02NyBBbGwgTG9nZ2VycyBzaG91bGQgYmUgInN0YXRpYyBmaW5hbCIgKGJmb3N0ZXIpCisKKyogT09EVC02NiBBbGxvdyBGaWxlbWdyIFhNTC1SUEMgY29ubmVjdGlvbiByZXRyaWVzIGFuZCByZXRyeSBpbnRlcnZhbCB0byBiZSBjb25maWd1cmFibGUgKGJmb3N0ZXIpCisKKyogT09EVC02MiBEYXRlVGltZVZlcnNpb25lciBmYWlscyBvbiArIHNpZGUgb2YgdGhlIEdNVCBsaW5lIChUaG9tYXMgQmVubmV0dCB2aWEgbWF0dG1hbm4pCisKKyogT09EVC01NyBMdWNlbmVDYXRhbG9nLmdldE51bUhpdHMoKSBkb2Vzbid0IHByb3Blcmx5IHRyYW5zbGF0ZSB0aGUgCisgIGdpdmVuIFF1ZXJ5IG9iamVjdCBpbnRvIHRoZSBlcXVpdmFsZW50IEx1Y2VuZSBxdWVyeSAoR2FiZSBSZXNuZWNrIHZpYSBtYXR0bWFubikKKworCisKK1JlbGVhc2UgMC4xLWluY3ViYXRpbmcgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmVsZWFzZSBEYXRlOiAwY3QgMzEsIDIwMTAKKworKiBPT0RULTU2IFdlYiBHcmlkIGNvbmZpZyBjb250YWlucyBvbGQgY2FsdGVjaCBsaWNlbnNpbmcgaGVhZGVyICh3b29sbGFyZCkKKworKiBPT0RULTU1IExhdGVzdCBUaWthIDAuOC1TTkFQU0hPVCBicm9rZSBwdXNocHVsbCAobWF0dG1hbm4pCisKKyogT09EVC01MSBXb3JrZmxvdyB1bml0IHRlc3QgZmFpbHMgZHVlIHRvIGhzcWwgbm90IHBhcnNpbmcgdGhlIGFwYWNoZSBoZWFkZXIgY29ycmVjdGx5ICh3b29sbGFyZCkKKworKiBPT0RULTQ5IEJhc2ljIHVzZXIgZ3VpZGUgZm9yIFB1c2hQdWxsIChtYXR0bWFubikKKworKiBPT0RULTIyIHJlbW92ZSBwdXNocHVsbCdzIGp2ZnRwIGRlcGVuZGVuY3kgKG1hdHRtYW5uKQorCisqIE9PRFQtNDcgV2ViLWdyaWQgYWRtaW4gcGFnZXMgcmVmZXJlbmNlIGpwbC5lZGEgaW5zdGVhZCBvZiBvcmcuYXBhY2hlLm9vZHQgKG1hdHRtYW5uKQorCisqIE9PRFQtNDYgWE1MUFMgbWFwcGluZyBmaWxlIGRvZXNuJ3QgZGVjbGFyZSBYTUwgYXQgdG9wIG9mIGNvbmYgZmlsZSAobWF0dG1hbm4pCisKKyogT09EVC00OCBXaWxkY2FyZEV4cHJlc3Npb24gaW4gWE1MUFMgZ2VuZXJhdGVzIGluY29ycmVjdCBTUUwgKG1hdHRtYW5uKQorCisqIE9PRFQtNDQgZG9lc24ndCBidWlsZCBpbiBKREs1IGJlY2F1c2Ugb2Ygc3RyaW5nUHJvcGVydHlOYW1lcygpIGluIAorICBjYXMvd29ya2Zsb3cvc3RydWN0cy9UYXNrSm9iSW5wdXQuamF2YSAobWF0dG1hbm4sIGRhdmVrYWxlKQorCisqIE9PRFQtNDIgRml4IENBUy1DYXRhbG9nIHRvIHdvcmsgaW4gYXBhY2hlIGFuZCBwdWxsIG92ZXIgbmV3IGNoYW5nZXMgCisgIHNpbmNlIGFwYWNoZSBwb3J0IChiZm9zdGVyKQorCisqIE9PRFQtMyBVcGRhdGUgc291cmNlIGNvZGUgdG8gdXNlIEFTTCBoZWFkZXJzIGFuZCBhZGQgTk9USUNFLCBldGMuIAorICAoc21jY2xlZXMsIGFoYXJ0LCB3b29sbGFyZCwgbWF0dG1hbm4sIGtlbGx5LCBwcmFtaXJleikKKworKiBPT0RULTM4IFJlbW92ZWQgUkFUIGZyb20gZGVmYXVsdCBidWlsZCBwcm9jZXNzLiBVc2UgIm12biAtUCBhdWRpdCAuLi4iIHRvIHJ1biBSQVQgKHByYW1pcmV6KQorCisqIE9PRFQtNDAgRGF0YVNvdXJjZUNhdGFsb2dGYWN0b3J5IGRlZmF1bHQgdmFsaWRhdGlvbiBsYXllciBjbGFzcyBpcyBpbmNvcnJlY3QgKHByYW1pcmV6IHZpYSBtYXR0bWFubikKKworKiBPT0RULTM5IEx1Y2VuZUNhdGFsb2dGYWN0b3J5IGRlZmF1bHQgdmFsaWRhdGlvbiBsYXllciBjbGFzcyBpcyBpbmNvcnJlY3QgKHByYW1pcmV6IHZpYSBtYXR0bWFubikKKworKiBPT0RULTE1IE9uZSB0cnVuayBmb3IgYWxsIE9PRFQgY29tcG9uZW50cyB3aXRoIHRvcCBsZXZlbCBidWlsZCAobWF0dG1hbm4sIGJmb3N0ZXIsIGtlbGx5LCB3b29sbGFyZCkKKworKiBPT0RULTMwIHVwZGF0ZWQgImdyaWQiIHN2bjppZ25vcmUgcHJvcGVydHkgdG8gaWdub3JlIHRhcmdldCBmb2xkZXIgKERhdmlkIEthbGUgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtMjkgSW1wb3J0IChFUk5FKSBYTUxQUyBjb21wb25lbnQgKERhdmlkIEthbGUsIGFoYXJ0LCB3b29sbGFyZCwgbWF0dG1hbm4pCisKKyogT09EVC0yNyBJbXBvcnQgV2ViIEdyaWQgY29tcG9uZW50IChEYXZpZCBLYWxlLCBtYXR0bWFubikKKworKiBPT0RULTI2IFR5cG8gaWRlbnRpZmllZCBpbiBiYXNpYyB1c2VyJ3MgZ3VpZGUgKFJpc2hpIFZlcm1hIHZpYSBtYXR0bWFubikKKworKiBPT0RULTE2IE9PRFQgd2Vic2l0ZSAoa2VsbHkpCisKKyogT09EVC0yNCBGbXByb2Qgd2ViYXBwIGN1cnJlbnRseSBkZXBlbmRlZCBvbiB0aGUgdG9YTUwgbWV0aG9kIG9mIHRoZSBNZXRhZGF0YSBvYmplY3QgCisgIGluIGNhcy1tZXRhZGF0YSwgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZC4uLiAod29vbGxhcmQpCisKKyogT09EVC0yMyByZW1vdmUgcHVzaHB1bGwncyBqYXZhbWFpbCBkZXBlbmRlbmN5IChtYXR0bWFubikKKworKiBPT0RULTIwIFVwZ3JhZGUgb29kdC1wcm9maWxlJ3MgamVuYSBkZXBlbmRlbmN5IHRvIG1vcmUgcmVjZW50IHZlcnNpb24gKGtlbGx5KQorCisqIE9PRFQtMTkgTWV0YWRhdGEgc2hvdWxkIG5vdCB1c2UgYSBHUEwtbGljZW5zZWQgWE1MIHBhcnNlciAobWF0dG1hbm4pCisKKyogT09EVC03IEN1cmF0b3IgYWRkcyBlc2NhcGVkIHNlcXVlbmNlZCBzcGFjZXMgd2hlbiByZWFkaW5nIGV4dHJhY3RvckJpblBhdGggCisgIHRhZyBmcm9tIGV4dHJhY3RvciBjb25maWcgZmlsZXMgKGpvc2h1YWdhIHZpYSBtYXR0bWFubikKKworKiBPT0RULTIxIFJlbW92ZSBqZXJzZXkgZGVwZW5kZW5jeSBmcm9tIGN1cmF0b3IgYW5kIHJlcGxhY2Ugd2l0aCBBcGFjaGUgQ1hGIChtYXR0bWFubikKKworKiBPT0RULTE4IENvbnZlcnQgY3VyYXRvciB0byB1c2UgQXBhY2hlIGNvbW1vbnMgcmF0aGVyIHRoYW4galRpZHkgKG1hdHRtYW5uKQorCisqIE9PRFQtMTYgLSBSZW1vdmUgSlBMIGxvb2srZmVlbCBhbmQgd2ViIHJlZmVyZW5jZXMsIGFzIHdlbGwgYXMgZGVwZW5kZW5jeSBvbiBwcml2YXRlIEpQTCBNMiAKKyAgcmVwb3NpdG9yeTsgYWRkIHJlbG9jYXRpb24gdGFncyBhbmQgZGlzY2xhaW1lciBvZiBBcGFjaGUgSW5jdWJhdGlvbiBzdGF0dXMgKGtlbGx5KQorCisqIE9PRFQtMTQgVXNlciBndWlkZSBwcmUtcmVxdWlzaXRlIHRvIGNoZWNrb3V0IGFuZCBpbnN0YWxsIG9vZHQtY29yZSBiZWZvcmUgYXR0ZW1wdGluZyB0byAKKyAgIGJ1aWxkIGNhcy1maWxlbWdyIChDYW1lcm9uIEdvb2RhbGUgdmlhIG1hdHRtYW5uKQorCisqIE9PRFQtNCAtIE1lcmdlIGNhcy1jb21tb25zIGFuZCBlZG0tY29tbW9ucyAobWF0dG1hbm4pCisKKyogT09EVC04IC0gZ3JpZC1wcm9kdWN0L3BvbS54bWwgcmVmZXJlbmNlcyB0aWthIHZlci4gMC4yLVNOQVBTSE9ULCB3aGljaCBubyBsb25nZXIgZXhpc3RzIChEYXZpZCBLYWxlIHZpYSBtYXR0bWFubikKKworKiBPT0RULTIgLSBJbXBvcnQgQ0FTIGNvbXBvbmVudHMgaW50byBPT0RUIFNWTiAobWF0dG1hbm4sIGpvZXMpCisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9IRUFERVIudHh0IGIvMC4xMC9IRUFERVIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTYzYWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL0hFQURFUi50eHQKQEAgLTAsMCArMSwxNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwpkaWZmIC0tZ2l0IGEvMC4xMC9LRVlTIGIvMC4xMC9LRVlTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODU2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL0tFWVMKQEAgLTAsMCArMSwzNDUgQEAKK1RoaXMgZmlsZSBjb250YWlucyB0aGUgUEdQIGtleXMgb2YgdmFyaW91cyBkZXZlbG9wZXJzLgorUGxlYXNlIGRvbid0IHVzZSB0aGVtIGZvciBlbWFpbCB1bmxlc3MgeW91IGhhdmUgdG8uIFRoZWlyIG1haW4KK3B1cnBvc2UgaXMgY29kZSBzaWduaW5nLgorCitVc2VyczoKKyAgICBwZ3AgPCBLRVlTCisgICAgZ3BnIC0taW1wb3J0IEtFWVMKKworRGV2ZWxvcGVyczogCisgICAgcGdwIC1reGEgPHlvdXIgbmFtZT4gICAjIGFuZCBhcHBlbmQgdG8gS0VZUyAodGhpcyBmaWxlKQorICAgIChwZ3BrIC1sbCA8eW91ciBuYW1lPiAmJiBwZ3BrIC14YSA8eW91ciBuYW1lPikgPj4gS0VZUworICAgIChncGcgLS1saXN0LXNpZ3MgPHlvdXIgbmFtZT4gJiYgZ3BnIC0tYXJtb3IgLS1leHBvcnQgPHlvdXIgbmFtZT4pID4+IEtFWVMKKworLS0tLQorCisKK3B1YiAgIDEwMjREL0I4NzY4ODRBIDIwMDctMTItMjQKK3VpZCAgICAgICAgICAgICAgICAgIENocmlzIE1hdHRtYW5uIChDT0RFIFNJR05JTkcgS0VZKSA8bWF0dG1hbm5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBCODc2ODg0QSAyMDA3LTEyLTI0ICBDaHJpcyBNYXR0bWFubiAoQ09ERSBTSUdOSU5HIEtFWSkgPG1hdHRtYW5uQGFwYWNoZS5vcmc+CitzdWIgICAyMDQ4Zy9EM0I0RjM1MCAyMDA3LTEyLTI0CitzaWcgICAgICAgICAgQjg3Njg4NEEgMjAwNy0xMi0yNCAgQ2hyaXMgTWF0dG1hbm4gKENPREUgU0lHTklORyBLRVkpIDxtYXR0bWFubkBhcGFjaGUub3JnPgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjQuOCAoRGFyd2luKQorCittUUdpQkVkdkw5UVJCQUN1YVYwNmJ5K3B4WkhYSXhCc2ZBRllKazdYSmdzcVIyM201Q2xDRFB1c01lYUk0WEdCCitlVThOdzRpVndnRzNwNVZMV0xYZU1JbS9LUHozcG14aU55RVAvZEhvRHhPUFIraEFxbFA1djAzRDFpSzE5SDdxCis0NkJJZWNJd284cTBlaTcwZkJMdk1RTithcElGbHZZRHFWQ1RtMWx4b0NRYWZhZ3FkOXAySnRUZit3Q2c3MHlNCituR3RyZWpCK1pUVGNiMDhmN1NBSHNMRUQvMTF2SWRjeFZpTjN1KzNrbGhiYjk5YmQvZzlLdkNVL0kvNytNRHgxCiszenJTdkpWMmIyd3J4YWJVSjFPeHNiNC80QlhxOEExRnloQzFoL2QyUHNhd3FpWTBHWjAyY3VjYnpFbWRYSDUxCitVbnJSTE05L3R4dFoyYjdWNllrRG1QZjBrNnJEMFNqcUFBeTFFUmVrRVZVT3huWTRzUEdtSm95YWM0ajkrcE85CisxdkgvQS85TFJvSmxQVGZ2L21GWXR5Ni9FZ2NraHY0OFlvUlVCbzFkTmg2SVBRWTBvVnBBRmJjWGMzR2lUeUN1Cis1aVFwN3V0eFA3aG9KVFVNMkhuNXRGOUQ3SW5pUkM5d3NyY1c4R2kvZjgyTzRIbG15VjQrVHQ3NW5XeDAxOG9JCitPYkdtd2l0VDI3RWtPbkZjUWM5RitRNTNuS3IrYTIyU0JicGZmZkY5WGRia3c3VjczYlEzUTJoeWFYTWdUV0YwCitkRzFoYm00Z0tFTlBSRVVnVTBsSFRrbE9SeUJMUlZrcElEeHRZWFIwYldGdWJrQmhjR0ZqYUdVdWIzSm5Qb2hnCitCQk1SQWdBZ0JRSkhieS9VQWhzREJnc0pDQWNEQWdRVkFnZ0RCQllDQXdFQ0hnRUNGNEFBQ2drUWNQQ2N4cmgyCitpRXI4S3dDZmZNSUtNdTNUQnJHWlZ1MUJQTGJNQmhqc3JsOEFvSTE1cmcrdHpZWlptWkpENnREUzQwa2xUc1ZBCit1UUlOQkVkdkw5UVFDQUNsSGp3WE11MzhpRFIzbnZiWWtXbWN6NXJmQkZ2RG0vS1ZRR0xublk5NkMxcjg5MElyCitjSHhBbFNwYkdiNnFQaTVuMjd2ODdMb1MyYllFaXRxQ1VVd0I3QVFMT2dxbUx2cU1KNHFwNUhVZlRRL3dIOUJyCit3SzJMWDFvR0ZKWEgxNGxiWjd4VzM2bjlBL0p0WEhZOHZHejNHdUR2S1lxYmRPQ0ZvOGZCTHdvdGRGT0hoTll5CitiQllTMUc0Z3RtZW1Yd3pIOGtjdW9JVzZMdW9STnhsdUhpMXRKR0ZDMUYxdUJveEtpcjdGN0JDMzhERE52aGFrCitkU0pwbTNXeEZrRUVrSVV5SUVSVkdWUm9GekxsazcyVzBSM2taVnZuWGJ0Z1BrbFRnLzJTeTEzR2IrTXpUQll0Cis1VEY4NDFuZU0va0hkZ3Q0NUVnQmhjaEhOM1lzM2xqYWJpaGJBQU1GQi80a2U0WGU1NzNWNzhVUi9XVE1VemZ3CitwSXlzTVV6RWpOS3FPZm5Bb05uUjRXRERjYTRNd0lVbDYyUXFHVFJyV1p4VEQ4ZkFHWXhjK20wcW15Z0dLdFlxCitMVVlCNU4vcExHdTFzZzJqMjNHOGFCS3RoaUNDRStqT3IzdWViVS9qMEJUek4vQndYQ3FJR29nRUxGbFBDNVRqCitIcjZjOExwa1JGSU9qVmZ1WUIyVFY0bzJSZlNGenJTRkhDYnJVODJvanhoWVN3eXFER0FkRDZFR3RiYnFhRU1YCit0R1p6SGFNVm0yZ0RlVjlXMnZldXJ4T3VsZ25kTmcyK0ZYdmdVbE9hK0taMkoyRHhOQmNKdjF1QnREQVdEeVI5CitkVGdUYks2MlpuU2pzblJZYmdmMEhkQStrVzluOVhCTUVId2dZazBxK2RvT1dVT1FGcUM4NFRncnJoeURkMVhaCitpRWtFR0JFQ0FBa0ZBa2R2TDlRQ0d3d0FDZ2tRY1BDY3hyaDJpRXBsWHdDZ3JhWTNFTGxEU3RxcEpEU1V6VnNOCityR3VOaXdzQW9LejkyeWNFamNNbm9Mblg4QWFQQURkbzFtL1AKKz16RWZPCistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCisKKworcHViICAgNDA5NlIvRjlEOThCRkEgMjAxMC0wNC0xNgordWlkICAgICAgICAgICAgICAgICAgU2VhbiBDb2xpbi1QYXRyaWNrIEtlbGx5IChDT0RFIFNJR05JTkcgS0VZKSA8a2VsbHlAYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBGOUQ5OEJGQSAyMDEwLTA0LTE2ICBTZWFuIENvbGluLVBhdHJpY2sgS2VsbHkgKENPREUgU0lHTklORyBLRVkpIDxrZWxseUBhcGFjaGUub3JnPgorc3ViICAgNDA5NlIvQUMxN0ZGRDggMjAxMC0wNC0xNgorc2lnICAgICAgICAgIEY5RDk4QkZBIDIwMTAtMDQtMTYgIFNlYW4gQ29saW4tUGF0cmljayBLZWxseSAoQ09ERSBTSUdOSU5HIEtFWSkgPGtlbGx5QGFwYWNoZS5vcmc+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcvTWFjR1BHMiB2Mi4wLjE0IChEYXJ3aW4pCisKK21RSU5CRXZJbVRJQkVBRElDZHlPTEJQZDFXdHRkaDkraGhYOERTYkhIV096M2d0U2Z4bklXdys0QldxQXZQbysKK29SRlNkNTYzZ0xKZEovYnBqZnJoajR3UVVNTEF3bWFtMUtwT0pCYkkyeUJzZ2t5UmtVYWxETWtxOFFxeE1KN2IKK0FNQ3dkVm9HNTA3QjJjK2d6Y01DV2hJZlhYTVZJZCtDYzdjK0srWkduRzBGK1NIODdoTEdEMTVFMHRieTJibG0KK1hIS1JnaVNqbXFDUFdqUGRacE1yZ2NqaklwQ0lHYUovdkFyOUNVRXJCM29pL0JEKzJXenpTMXk0Znk2a2ltdVIKKzNVM0hRMU9tR2hvTmpUaDArZUlIL2REc3hlTHh6WXY1K3hSQUpYWVBRUnJHMVF6V0psZUdCcUFVWWFKVitjdFkKK0w2M2pFalk0VThBSWw1d3pFdWhxOHF6UzBoQlQ3QmpLNGZmdUxzUzZRYllSam1GSlVBcXhZYllPVm1vQWZzU3cKK3k4RDM4V2phMVFNNFFPdnM5UnhSUWZuMU5haHBxQUZRd0k4TDdjeEdnTFhTWFg4MU96V1lhYnNqeTdFLzJwbi8KK0t4SmxHOWZhU2hMZWxPMklCZFVkL21VbXh5VUhjOXJtWWV2U3RHaGZLeGVGYU1YdUdYQjMybjVXbHJwaXplVFUKK1N5QUxvWWhTbjZ1TmZnNUREMVl3dG9QRVBnZmY1WXZPTnkxb3Mva1UrSFhOWSsrOVNmRWhaVzRrcDUwNVE0MzIKK1RyRXZzNVh0ZEV5Sm1BRldkcWdhV1VwSHN0TDNLOWtEdG14NEJkS1ZTZ3VGQStObGthQm1JS0ZsOEpaZW9wY3gKK3lmbitzQjBTRWFNSWhDU3ZXTXpJN0xCRjRNay8zWnhQMGlZMFM5aThLMURtK0srcmcwZFhwTllmdndBUkFRQUIKK3RENVRaV0Z1SUVOdmJHbHVMVkJoZEhKcFkyc2dTMlZzYkhrZ0tFTlBSRVVnVTBsSFRrbE9SeUJMUlZrcElEeHIKK1pXeHNlVUJoY0dGamFHVXViM0puUG9rQ053UVRBUW9BSVFVQ1M4aVpNZ0liQXdVTENRZ0hBd1VWQ2drSUN3VVcKK0FnTUJBQUllQVFJWGdBQUtDUkFYQzJWKytkbUwrdGU3RC85QXRxMnVJV09ZTDViTFFHOHpFMThZNFR3NHZCUHUKKzd6RlRxUlRySUYrR0tuUkJpMHlTLy9wNXN1Qy84TDduWUVlRGl0NEVYNjltdW56S0t1RHdZWnI2YUJmUzhWSDcKK2FzcE4xSFp3Y3ErUjdveHVDT2ZsL0dYenZoV3dsU3k2Nm5QdEkyVmJ3Ri9Dc2FnL29TMS9ZUmFHYXdEb2lsYi8KKytCU1A2OUxwdzZtMDdxbEtyNzkvelVsRHBOcnlVM1Z5aW9UeUFuSTh0cEtoNGpWNzFMblpvbFZkYmdXVEJReUUKK3hCQ3Q3WW5LMGhjbW8vZWZFZCs0emlWUUFaYjh3U0s2SnpMeEk2UStLNzk2WGJ2cVNOMlA2K3Ztblg1UWpqTG8KK3FYSzJDL1dKUW1wSldPUVZpOE5MUFlUQW5scTJyZG13d3NkcVhDV1FWTTdRUWdRbmY5MXZtYTgvbUgrK2ZHSUMKKzZjbHU5QjJ6TFA5dWdhTXUwSDl4Z2IzdUFVUnV4aXNHcE91TThIQS9jQWZIMzlyR2Y1ZGxJalQyLzFLNzdIWmsKK3JjcmdXK2t5U0FLVHozYzdiRVArQk5LOHlFWUtvU3IrSWF2eFkrU0hIc1BzVnd2WkV0N0hwYTJHa3ZKTVRJVXcKK2xUVlUrSWJSTzN4ejNpeWdjNVNMR2FjZGJSMlYraVVJQkNKd1pzN0xsd3Q5ZHFvQnRzNzU4RndqR3FDa0JiS0gKKzB6Uml2L3RkZDRNZ011bmpsRGh0cW9MYTF6Y2tXdzMySDd1T2c5OVprQTJVbmlqZENMNWZGbWV3UGdEZjVsL0kKK0NrN3FHSm1QU1daSkdkVWtselpGZng0WDg0MDFUcWVBZjVsMmNOeVNjeTBUeDIxUDFEN3RWN2ZLMEVnbDBvWnIKK1JwelhibnBodmlMRVhia0NEUVJMeUpreUFSQUE3L0FXcXh2MzhRT1J1VTZoQ2VtOVZzR0t3OWpma3h6ZVc5MmgKKytmbWdmSk93ZlRzaTFnTG5BNHRHVW5QUFdlUTRrcFBmVDFzMXZKbWRRYkg4UjB4K29xVitoNHc1ZXJVTkQyMlkKKzNuL2NSNlRja3VyR2UvTkVZUlhyWG8yTTNDRWxFcC9GdXQydjJ0cUthbm5HMmVHZEg5dFVhV3BOM1BCVVk4NnoKK21hM1pMSU11SjJCSjBqdGo4THVLVjFaRG1yczVsbHNNcGJLMUdLWVkzSmtjN0c2SlFncGxQRUJLVnFkTndob1UKK0twMVNtbFA5MEJwNThZZXRXRnRBNVZ2WElob1dJSDNTUENVMk55RUY3ZUJuTHdBVGtpSXdxRlVEMmp3UklxeUIKK1NRS3UvL0U3alFrTXJsVFNaZk5XVnQzcU5UcWZCNDJvdkRKL3N3NXhycmZUZTd3RnhUc2U2WG0zSm5hc1hNS3cKK3lMNlJ5WXo2K3ZtUDVmL09GaWwzclk3K1FVQzJ5a2tHdHU0NDhNT1FJUXNEZStDaWx5dVdZNkZpVEpWRkd2RTcKK0Y4dFJiOEVTQnk3S3EvcjlpcVpkeC9RZjhDVGMrNG04TXBqK09QMDhPNzlQQW1jVWNybVdNOU5ScnlPeWdIeDUKK3BWSlkyUFBrS2I5NzlSV2NvOFN0WksrRG1DQ05VYjc1dlovU1lvb0s2SjB0WmtZdkJhR3hRS1p6UnBqWU5PWmYKK3dNbzdsRCtodlhPdWxhRFRiNk0za0tzcnBuZlo2SkczVVUyYW1mSGY5Zm83YnJ4QnkwNHZ3VW9scHhqMC9PRUsKKzZDSm5YMjNYa3RQcVZTTUJkMldEVnVkaC9tK2pPWk9GOXdjV3hZVDNXUXdYVXlVUWpleEVac003ZW85MGdRNWYKK0J0a0tMRFVBRVFFQUFZa0NId1FZQVFvQUNRVUNTOGlaTWdJYkRBQUtDUkFYQzJWKytkbUwrbDUrRUFDL3BRWEUKK0pkS1dZTTVxOXk4cGlZY3RXQ0NRTzZESE5qMWlZM29aME1EcGQ3Wlg5SzVZNTlWZUE3N0p1bGtFb2tQTVZ3WGsKK1AwbmZJb2hlT1JYR01kN3BzSGNPY0pVU1BHU2dYeEt6dHg4Z3pJQTBTVm5EbkNwd2RxaDJoQ3RtUjhyVVc4VmUKK3FuU0xvUEFPREExZTl3UDh4Y1VQbkt1NjUrbDlGT21PNi9GaTFDYWVoM3VSU0prT2JHUGozTDlWM0k0Q2paMlcKKzdidHRSQmRITTNVS2hKZkNwR250aUYyQTlsZjlyTWU3OWRuUWhPejAreVg5d1U4ZjU4WkJQeWRnaWhnRFkyS3kKK21wMEVOWnNHL1BiVHdmVVBOeVI0VktFaDMxUXMxdmRicXJVWW9CWUIvaWtBUnkxUXczK1hxamkveUE1dmtCVEgKK3F0aHdZUXhUQXRMc2xybDNsUDVLdE5YKzhrSmcxb2swTy9TdVNUS29POVJrYUtVdHVNbVU4N0pUbkVaUHBzdzkKK1pIZ1dMQUlIaEdsT2U0THVuaGNHTkpORFpDYURJMGkvSDhsQTNlV3daRkpwZXM2bDE3Y1d6Kzg4cjMyVDVjT1cKK3RqWm1DNzNScG81KzZhbDVFYWU2N1g3aWxUMGlGSXlKeTFXMGNhWlpMNzg1ZTcyVGVlNDE1cnBzblBwN09wVS8KKzZDWXdaM1dwQTlFanNTcUhzWlJ3UU5WK3FTb2I1OUhKOEo1eDBSY3M4Ym4rdUk5bG5FKyt2RkZVMFBmY005dVkKK3d1YlJqT05XUnl0YXV2OVZUTEhTRmNZRzBXVEZ0OHdGTlk1ODVXeXZaWHRWNnp3WjFFSXQ2TDJXZ0xHSlB4MmkKK3NSTzZNaFR1OG94R0pUd1pjUDBrY3BLbHc3NU95Ylp4S0xqK05BPT0KKz01dXppCistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCisKK3B1YiAgIDQwOTZSL0ZGNUIwQkQ1IDIwMTAtMTAtMTgKK3VpZCAgICAgICAgICAgICAgICAgIERhdmlkIFdvb2xsYXJkIChDT0RFIFNJR05JTkcgS0VZKSA8d29vbGxhcmRAYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBGRjVCMEJENSAyMDEwLTEwLTE4ICBEYXZpZCBXb29sbGFyZCAoQ09ERSBTSUdOSU5HIEtFWSkgPHdvb2xsYXJkQGFwYWNoZS5vcmc+CitzdWIgICA0MDk2Ui8wOTk2NzQ2RSAyMDEwLTEwLTE4CitzaWcgICAgICAgICAgRkY1QjBCRDUgMjAxMC0xMC0xOCAgRGF2aWQgV29vbGxhcmQgKENPREUgU0lHTklORyBLRVkpIDx3b29sbGFyZEBhcGFjaGUub3JnPgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjQuMTEgKERhcndpbikKKworbVFJTkJFeThrcDhCRUFDN2FXQlB2YW9BYlN5NmJvUXBmYmFCQ3pFWkVaTEFIUHlMVFI4TTI5WjQydGREaTRIbgorV0tEYjhhNklCY2NIMXZZeE00eTZTOGFtWFdYbEJrK25jVXlFSUtsQTErZjBtM3ZQUFZ0ZFZBa1NaaEs1RWNKMQorcUo4WTR1eFdqQXJ3blovTWdQNzZ5eVJObEhrOWVLdzIzS0w1ZDBheVRMK2FJL1A2VEJIWitWcndBWGlkTlp2MQorWlVrdlVjd0ZkN3JEdUR0M0hBUDJwaXIvd1A3TThyZnc0VG8xRmxMRFdWQXRzK3BOVGErUmd2TWhXbTVCMjArcQorL3crQkpTQTkzekVPb1RZSEVnbmU1Q3dXUFVaMnFwYS8vdVBWbkpwTDhvOG44cmdCWGJzL3FzRmgzRFVjbm9oWQorak1WZW9GY3JXcmRrVEV2ZjRvcTh1SDU0allxWi9TM1RNeVdtNEl4aTBwOVkyRmxNOVFjRHV2NHZkOWM1OWJCYQorb2tmWDk1U1NqbHZDMm1pRlpVRHFsbWxZRUFrdEU3VUlkYm85eHNlTG9VM1BmSHc0NUQ2cVgwTERIZ052Q3M4aAorN1NCR043eitxdzlybHBZbk5JcTJ1dndSUzVhTFgrSVVTaHdoVVlmdmw3YlYrVVlpa25mUE12RVhmSm5IS2daRAorNXc0M1o3em9sb0p1a2tqdFRTMDAvZnJlbGE3Y1FkSzlNM1lKQWJQZXlqMWVxNjN1S3FuL1FoZXA3cjNlZC9DTAoreUZqV0pybjd1aGw0MjdiRHlvK1RURXFISWlFcVNUVVJtN2NhVnJ4NEw2cTlPSTl4SDdaK0t0K0pUd1lUMzNTUworWHhIeURaNDlHRW50RFJCUlI3UVk4a1B0Sk8yWk5tV3MwK1QyaFMzVU9PMEd4SkxhNExMK3F4NmUxd0FSQVFBQgordERkRVlYWnBaQ0JYYjI5c2JHRnlaQ0FvUTA5RVJTQlRTVWRPU1U1SElFdEZXU2tnUEhkdmIyeHNZWEprUUdGdworWVdOb1pTNXZjbWMraVFJMEJCTUJDZ0FlQlFKTXZKS2ZBaHNEQlFzSkNBY0RCUlVLQ1FnTEFoWUNBaDRCQWhlQQorQUFvSkVCR1JGbm4vV3d2VmhMWVFBSjdHQW12N3l5SlZQVHZxMXl1aHpQY3dTK3Z6aXhYdm5JRmR2TXBJdEwvbworbk5nWm9JMGFuVmNKQXpRTGNjOE1weHhydlQrd3VsdkpqdnR3a1cvVXhLMFJreTNuRWExTmRWdlNjUTFOVlZ4TQorQ0tUSHpERjlURVllM1p4R25vT3hKbDZYS1dQZzlxTlBQNDRKeW8xaVBDcDJDZUhlajU1V1VTMFhHWndOSS9YOAorUDZ5NDZDTDliR29ZN2tDZ2pZNEljM3BmaEtnUWZCMTBFZHVub0RVelZxOVUyY1gzQVZMaEUxcDNQdzBTNjZ3SQorWEgyMXRZdUppbS9DUHFMLzlneHA2a3lEeTE1RSsxdzc1S1Y5UUFaUXlyZ1JTc3RJVFBoalZtOGFSNm1mdUFzcQorMU93TldzbzJzUURsWE9STUk3WkhVd0Q4RWJQTnZyUHl0V1Y0Q0ovN2xTWEJFZ09QeXZMYkhKR0w1Z1R3bUNueAorTnh5YzRwalRJdUN4cDA5WUYxSmtPNmpEYkNBSzNNYlY4S2d1SzJOK24wVHU4QkRVMm84eXZiU3FUd1RTV2FoYworWDhEbWF0emRVQk0yam5SbURmYzI5U3czS0NUVkU2ZS9jRzRxQXVyamNTRDRlREcrT25IY0hrWHJSMXR4ZUlhMQoranM5Q25rQzA1bnRLSUMyNDJTaVcxREZTdVpMRW1qZGYwRFhnL3Bva3laQzR1TDlRUzZDMWxxU0VpbC9WTjk3YworYkxxT0I5MXFTTzZhZzV4Nk1iTXBySUVpMmdqY3NhS1dTK0k1aytweWlPWHY4UWFtUUxUcFZiVnpqeEJ0TElCKworYmpOL1QyZENPQkw2akhlSUJKZ21BelYwMHF4aXFDL0dEbjJSZUVDWU01bEdTcDZidUtMcXNndXRrc3Bhb1pzOQordVFJTkJFeThrcDhCRUFEd1gxS1lvVzcxT0E5NENHN2F1ZXZaWDlDaituTEtWdVlERStlYU4zNE5DV2tjMytuNQorYU9OZ3EvYmJSa3h6Y0RkWjNRekpGZVYzajlxNEY5QkwxWnBvNTJlRHUyZW1NelhhQVdHT3JadXY1dGVrTVZDeQorSWx0aG5uLzA2cW9qU3lxcG05VVBQbGo1bVRzSnBRV3RXUWZmelRwajMwWU5nekg4UzlDN3dVekYwTUtLTmZhMAorUHVVK0s5ZW04SlVJOC9mVVNwM0ZPN1UwR0UvdVJkM2c0bkFQMkk1dG1HNnAyeWFYWDdleTdrdmllZi9WeWh2NQorR2tNWEVIemU0NVVSbWZReEQ2dC9DRk9HZGFLUUNOcFYrc0lOeWIzWmRRTzFCMXF5SWFWQTlZdVN4V0FCZlJSbworaFBVOC9MaE5WZFZpTkJvNlZ6ejZjWlFpcjlVL2k0Tld4dHN2bzlGeXJBZkJLbjJoRTVnRDZQUCtWWnlLaFR1cworZlc1YmNwOEtuSU0xUEJHNTk4SXorWHRNSnpJS25pdkxOTktNdmhUZy9tUFhVeCt2Q0NlbjgyazZJVU5JcFhXagorYmlhWnMzZFFxU0RLN0w0TERCSHVOeEVsMU5IZmZFeHlRTVR4KzRZVTVmaGlxbkVnZnNtTThuNGNUYkRMOXNRQQorMGZ2aVVock1lRk95S0doY2l6QUFDL3l2RzdmN3laOEdvOC9ZSExFQm4wVjZwV3B1Q3ZzcUg0VS9IRS9kSEVLeAorMG5zL2VQZ1ZuSjc5UUllYTdlWFpoS04zRzNobUpzaWswRE1zeFpTdEx0azRQajFjbHdFUyt1em0wUHR0bldQRQorUURUa1VsVmdJRUF5WGxZMFZHQmRGblVqVUVpaFo5a1ZXbHo3RmtIbE5hbnAyTFJsOExOUjh5Y0p3d0FSQVFBQgoraVFJZkJCZ0JDZ0FKQlFKTXZKS2ZBaHNNQUFvSkVCR1JGbm4vV3d2VitYRVAvQTJ0WUpOOXUrUEVlNU9lSFUwdQorMCtCcGplNEU3bG1VU2orSHpFd1pzb1ZaVncvOWdhQkFPd0lnWHk4TThZcjgxR0FLRGZPWms4Vm5jZ1hld1N1MQorb2FwNHRqa3lrSDE1bHNRVkFrT09md1lHdnJhZUh0M3VudW91aGhKSVpiN0NiMzBoMFhDbmVNMy9KWWFiTFRJWgorc0ZjRStMMmIxeU5CSzZTamxpcFR4K0c1bmxqVHNzVGN6azEyR3k5dStHUHoyeVNYNllYSnkrWXdwa3loMElFMAorVVdZc25sVTluMk5MeG14RjB5RWYvd2s5M2l1VW1ndURBYUhSaVNQcllzV0RrWEZoREF5N1NBMXpsMWFFK2syTworOGZHRFBMNkk5YlIwYTdITDZzNWRsVVBjRkY1TlpQZlE2WGQvTG5nc2N0VlhaWkR6MHEzZTcyaDZuNjhGQzhWUQorVEhHWEFEd01vb09ZSDU1aXQ1MlRrR1g3ekxqNUhZM1FSVEZ4T2RYay9EMmYwMnhuY3FCM3EzRThsa050ZmRFYQorSFArTGxQREpZcWVEQlhYVCtrN0JFTXFvMGUwdWxlWmwzY2FBREM0WU1TSXNXWFBORWhLNUFmeUc4VEN2TEl1aQorbXZWamYveWVhREZmY1grbXZRYlNZNDFaRW5qVXhsWWxKRlk0WVg2R25qd3ZBcEsxUlpGTFdDeldJUC9LaWljYQoranpsRG5GVk1EUlFZMmtpcXoyci9nT09XZTgrYzRadHF5MjhCeERoUEIwVVpDcWVHUW5tbGV3S1JpVzRXdUJuVAorWUFoUGp6YWdoVlV2N0IwZkFOcTZYeHZKQ1NRNXcrTUxtaDFmR0ZZdEJIRE8vSHRNVzdUZWtyeVVIKzRZTzZ0bworTzBMNkxIMDBnSE9nbWNYc00xVVVsUGRyCis9aHhiTworLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorcHViICAgNDA5NlIvMkM0N0Q1NjggMjAxMS0wMS0xOAordWlkICAgICAgICAgICAgICAgICAgUGF1bCBNaWNoYWVsIFJhbWlyZXogKENPREUgU0lHTklORyBLRVkpIDxwcmFtaXJlekBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDJDNDdENTY4IDIwMTEtMDEtMTggIFBhdWwgTWljaGFlbCBSYW1pcmV6IChDT0RFIFNJR05JTkcgS0VZKSA8cHJhbWlyZXpAYXBhY2hlLm9yZz4KK3N1YiAgIDQwOTZSLzYyQzdDNEU3IDIwMTEtMDEtMTgKK3NpZyAgICAgICAgICAyQzQ3RDU2OCAyMDExLTAxLTE4ICBQYXVsIE1pY2hhZWwgUmFtaXJleiAoQ09ERSBTSUdOSU5HIEtFWSkgPHByYW1pcmV6QGFwYWNoZS5vcmc+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjIuMC4xNiAoRnJlZUJTRCkKKworbVFJTkJFMDFIL1FCRUFDOWREVExvYUsvbTF4OXlLQitHQzhpRDJrZFdLbDhlU3NuNWphTlpZTnBPL0ZUemFFQworcXRxMW51OEZ5V0k1U01tSWFjdDZldkVlRUM1UnFFSGYvUWdjb0RPVjhvdW0yT3BjWDBwS1NOb0FLVXFtKzRhQgordldMa0xTNVg0UjhlTFdjcmtET3BQVWVDc0RnZVJhWnczY2xtaDR2dDllcjUvWWtDQUpZZHRobXVFQmtnYUVNMgordStVZjVlMGdseVdJYnZYK0J4ZEd4REdEeXpNL1FKeklPcXdHSTZmSHhHRlpvVkN0dytQSy9nTHFEc2RnMmM3SgordnZhUlN6eVBQS3NFeEFTOVZjYmdCdCtYb3RGTU5XUXU2NUNXei9DdUs2WUNkZkR4aTNLaXFCU0JIYmk4bndabQorTkpyS0pLb2Foc2ZZNTVkZmxNcmNEQVdDZ29CM2VOL3JhL3BCRkJNUU5ZTUc1dXNkNlplbGVZWkJMZTJqVWJ4NworVzRZV2ozcm5oKzh0cm5Wb2RBYWVwdWdRR3VIWEl5Q3BVSjJJK1cwRWRXVGtLZi92Z3d1QkpTQ3lwSjZlcmFCRAorTTdnWUhBeUo5ZitRM1NDc2xRR1lvSU5tZGt1Z09hVjd2T0dlRkxVUlZrQkpXVlRDVnJpNFBxNGtNeStFL0JYRAorN1B1MHhvY2JhV21UZGJXcWlRVlhYV29kbDdmZ1FyUVEraVNFT09Tc3dOd3NJVGJmSHFORHlRemhoR29JODF1awordDRZdWt4alVGMnFhd25DbVNMSkduQmlYK04zeExLbUFXQTh3QWtQNllNaENncmUwamVvQ1c5S1ZwM1k2cjA5UworN29tcWIxNjlYVno4MFNEcVoyUEE3THllRWRZUEUzTVRnM1A0MjFRdmVGek1uSVNkRS9rSFV0SGtTUUFSQVFBQgordEQxUVlYVnNJRTFwWTJoaFpXd2dVbUZ0YVhKbGVpQW9RMDlFUlNCVFNVZE9TVTVISUV0RldTa2dQSEJ5WVcxcAorY21WNlFHRndZV05vWlM1dmNtYytpUUkzQkJNQkNnQWhCUUpOTlIvMEFoc0RCUXNKQ0FjREJSVUtDUWdMQlJZQworQXdFQUFoNEJBaGVBQUFvSkVLWGJ3QmdzUjlWb29Db1FBTEt3RnJqWE5RQU5zRGpWc2IwRnlkVGNFYnFkMmZBUQordEJ5Q1RTQkFmRk52dnNUTXZhSkhUQmZkNkY2ZVUrZFpRSVVQbFdKNUJ4L1Z3NTVielEyR1oraWdhUHBKRkcvegoramxOYnFta0lhY3hwZVNmQnFaM0NHdHNLUDN1eGJBZlJDN2J0OUhHMUcxNXRGenA0NWJnQUFDNElTbHE2NmpJdQorTkJ1UGplWWJFWCt1WnpNWG9WcXp2T1BkU0ppczBxdGVBZTdGdVpMYXkrM0poR09HeG04aVUxLzlVWmtQMEZRSworZm5lcXNML3RoQ1lqMUtJSXI3NHkrcjd2anZObm9IVUxELyt6YUYwREJaWTFRcGxkT050Sm43ZzRZaG9ucTRvbQorZ3RsVTZtT0FncHZoWjlIbmp5U3BjbDhYdGFzV2VieDRaVVpkcVFxZUJyQ0xaZXQzMHhGbkpocXQxQVF3QzZQWQorLzNUUTB4UWtOaFYxWUpJNlYwWHJ3OXpKOEVvc1lSaXoxYlpEQ3F6TFVqOUt2emg5Z0xKOGZZTlZEUHdVRjRVNworTXc3V2RhSzczcmxDT3JxY2RHZjEzUDd2UUpUWUhCNm1Da3BZNVF1OVFlakUyZUUzVnJkNWs2a3R3V0ZrRnF1OQorNmk0MHp5YTJ2czIrK0NNK1I3VnVFR2RYcEVTdmVmVktwYjBrNWNvWllaNXJHU3llK0JrYk03UW8vSXZ2VXR4cgorZnR5c2NVVnVRNzAvWUw3MVVCMndrODNkY1lXdGoxcHo5Zmc4b3FSR3JGd2lQV21GZXdwZzdrV0NVS29tQXFuNAorMFhLMXdHNFcyM0F6S05hcjRQbjB3cVF0S2txVFRPbW5nbEdDZXZsM2V0cHg0VkNtMU5Vbm5nc3V0QzczRHo1RQora0htdUVLSlRaZmg2dVFJTkJFMDFIL1FCRUFDMDNidEQ4RFhJSUVZQ3hESkczRzlHNUZEaTZmWWgxd3p4bXlqVgorR1R2NnlGUm5XSG5TK2FtZldQVzdGOHpiWGhmME9VdXJlKzJqajVUZUdNR1ZMa05iMXlzODhOV3dCY3pTOHplRgorNGw4S3gvSmMzU1NZL0o3MW9HQTJUSmF4THM1eWEvSjlxemhrLzl2SnlldGFHVVNUVHMrc2hrUXFoNEhxdjRXUgorWFRwdW1ibmMwckx2ajdlZG0zNDNOZ0p2SXRBbFBqSDJiNGJDRnRVamdJOUJSU3dlNXlQSmFFbVVaSTRDMkM3Twordms1U01MSkM5V1c5KzdnczE3Tmg0YWY1d0xObGRVSlBhTFltZXJLbUExbVhXVEFvYWdFTFdRdWZlbHF3dFlWbgorTkhkYVU5WGJVREZyTU1yK08wUGNKaHlEUTJUREJsVU50ZWVNUitPN0xMRFBjNkE3TzV0ak5XMUVacGpsUVp4SQoraXpDK25Ta1BZanI3c3p3ejVJbVh5d3dzQkdOM0tUZWpMa1BsT0FXZFVqdDBrVW94aHNiMXBtSjBkc0hsV3UwNAoreVdhaXhsK2M4c0lDRm5LZUNBRnJVMnNxTXl4TXlVT3hGaS9HZjR1YWZLRUhrbFdXYy9SRDRlM2hRa2VGOVRNVwordFYxOG5JanN6TkdXTlhqVUlQSG1BclpUd1FvSmwrdlhlMkU4c21BTG5qbVdta05KdWthWXp2WDB5cjBZT084bAorQzBSbVpoZjVtYjQwWkU4bmhTb1ZYdlFKT3NkVEM0N2xJMUZnZ1lYQ2lJWGE5Z3VVdDlGSmh6M3lhR1ViQVFmbgoraktoQWEva3ZaMXQzMWJOQmxubDVNelY2LzRQN2lvRWF4SDFFSGRybkg4dko2SEpzazBhODUwY0phOUdFclg4bQorV3hVZHJRQVJBUUFCaVFJZkJCZ0JDZ0FKQlFKTk5SLzBBaHNNQUFvSkVLWGJ3QmdzUjlWbzdoMFFBTGZYdTEzYworVXZXUCtnN3VWOWZFYy85MjNGS3NVREpxRFh4KyttVkVwaG1pT0cxZDE3SFNQN2wzbmFBMytXdHpDQmpvYkhwRQordmxLZXg0bHNBZWZHblp0KzNHbnBDQXdBWHhQUzU2WjBEOWdPeXhOa3FTT0E4QkwvY0o3Y2xjZExGeml2Q3pRdworZnBvdUJ4bjhZZDNTUjlLOEtOZ2dzU3dqUExpYXQwWnZQbG1sNFlsR3NrR0pWejh1N1ptWVZwWEtXOUhoM3RsTAorWmU0VnB3bHUxQmIwMlQ1MEdkdlRQM05EWEtjalY3SFh5d3owTHFHekkzQlpoR1gvVk1uaGJteldqeEh3a0NGTgorYUZEL0Q2NnB2YWthTUVsU1BlQkpFeks4RzZPV2xoQ2ZRelJGalV2M2VEWXQvN1VjMHFrSHBjNTlWQXZpMjg0dgorRU1xalptNW03SVo5aEM1ZmJveFVLa3lsTWcxdktyZUwzM3FOcGswY3k1em9SQ2NFc2VsUS9ncjdkTjQva21wMAorbERxSURxYVZ5Q0pCbys5N2VTMkoxRmVXNWdDQVhwQWlXTlNncStMV1BiZ1dRNWt2YTFndGJFQ3ZuWE54ZXFjMgorMm14ak01Rkh5cU5FYU9ySVV4RTRWYXBRRlNYUVhQTG5uVHIxU0hMNzAwclcrUkZLVldXLzhvL20wRDZ6T244SworUURuS0RYUkh2anE1bDdDbHBLUmdzZzJZV0tNY3NvSFhnbUI0UWh3TFo1RnlRelU5Z1hnQ2FVWm5KMWRSYlV6TQorN2k0ejZiWUdXQzUxN29KUFBKeiszTmJnaEJ5bjNLTTVsdk5PMjYxR01Hck1jeEVhM0tOQjRTOE5FUzBEY1JHcQorQ2l6ZHlQT1ZLRFQ3WTdHeDdVaEt6SzJNTkc2UnZCMFVaV2w2Cis9RDFxbworLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorcHViICAgNDA5NlIvODBFRjY1MkQgMjAxMS0wNi0wOAordWlkICAgICAgICAgICAgICAgICAgQW5kcmV3IEhhcnQgKENPREUgU0lHTklORyBLRVkpIDxhaGFydEBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDgwRUY2NTJEIDIwMTEtMDYtMDggIEFuZHJldyBIYXJ0IChDT0RFIFNJR05JTkcgS0VZKSA8YWhhcnRAYXBhY2hlLm9yZz4KK3N1YiAgIDQwOTZSL0Q0QjAyODZEIDIwMTEtMDYtMDgKK3NpZyAgICAgICAgICA4MEVGNjUyRCAyMDExLTA2LTA4ICBBbmRyZXcgSGFydCAoQ09ERSBTSUdOSU5HIEtFWSkgPGFoYXJ0QGFwYWNoZS5vcmc+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjIuMC4xNyAoRnJlZUJTRCkKKworbVFJTkJFM3UzelVCRUFERGtyTEJ2RTFOUVovMGpycmFjWFdYTmNhRHdOVmhETHRMc2VCLzBZOFBVRXNqL0h5QworRG9WeUtwRGpOc2VDVk9FOEE4SnZ1V0pNWkRSeERscHNMRklXWDRUWnBhcG53VXkzaVJ1ZWhaQk4raVNHMTg0aworaXl2MW5vbUZPeUJzRjdQY0psa2d3dkVYN0drVEF2UkZmWXgxUE5IWkJXZ2hpck0yMkdNaWhNYXVIMnk0RThGbworczZnSitoc0ZlVjk2eHpKQVRXbWhXRU80Q0pEVEZpcWR3bEdCdTg1VU9lRFNrSHUwcWVncm1DajdXdUpwSEQ2dAorSUl2bXZMSkg0OCtqRjM3NHUyWTlRWldHV3prV2g5MVFCWUh5OFNBK1VFY2prZVpmN1dFdUdicmQxcm9WTysxcQorV3AwYWRDa3pjcURUeVJaWnVTQzNobWgrUnc2bWlSamNXanF1S3RFVDV2NkhQTWN2dm52Y2JiRVZrcHlyR2dBUgorSk1RTWJaeEl2SndQNWk4ZTlUNmtSelR5aDRWQVhvaDJ1aWRSMnhTeUY3cEZvWnU5S3BESDk5dnYwUjFoNjdSOQordXZmc2pKdXZuaklYNUdiZzBUMWhhRjRZc2VGTERQVzNnQTBzajM2Nkp2TVFoVmZxbzFudmJmUWFhVm9BTUV4WAorNFRPMGo0KytydlpLaG92SFJLMVlkQ2JkeHlQMWlObVFxTEdKalJNT0xNMWk4OERHKy9nV1BEdVB6T2MwcHlPNQorZ2JwVGEzL0JjNDlRQkptcXdyb0JuWHF1b0JCYksrMGZ3aEJhNEtjSWRtdGhpWXBBencyMStGMDhobFU2UjdpaworRzlqSzNpYUR4Ty9XcXg0UTI1T3l0WEdMc1JPRWJnL2tCSmNEbmNTeW1BZHBQcTBJbU84cGd0bEE1d0FSQVFBQgordERGQmJtUnlaWGNnU0dGeWRDQW9RMDlFUlNCVFNVZE9TVTVISUV0RldTa2dQR0ZvWVhKMFFHRndZV05vWlM1dgorY21jK2lRSTNCQk1CQ2dBaEJRSk43dDgxQWhzREJRc0pDQWNEQlJVS0NRZ0xCUllDQXdFQUFoNEJBaGVBQUFvSgorRUhHSmNBaUE3MlV0TEZrUCt3WmlvRGNVb1h1WkFGYlZkZ29OSStvUjZ6LzdPR3E1SGo1V1kvTE1RYVBKenRNMwora0J0WTRNN29FQklnejNON0VkVEJ3bUNHTGpaRDB1TUJYUVlKeEw5ZUw4ZXhoemFmSGJNZ3ptY1p2VUlSdDBIMgorbmVoemNBYlpESFN4RzlITTdWWENGNUZ1RU9qVm5xVWdLZVFaSTFlMy9SV1pSalNlWjN2VzByaCtEUWYwcEhRaworN2lnQnVFR09SSkgrWUJSb0x4cDNvYkMweDNzTXd2MDNkakxCOW9OREJoSzBZWm4zbjdnTmVHZVlVckovN3NjeAordExKcFBsWU14QmFVSklaUkYzbkVmazBNMlVONFhGNkF5ajFBeTd2NkhsYjI1VUtKbGdldVV6OEJ4cmZXM1g5UQorM3dKV05YdU8xUTBKSDVnNW1Ib1Q5QUFrK2FHQXQ2MktVcTg4NXBMdUtkaWdwNGxFc1lJbThqdzljUTZnUnVBSQorOE50NE13RG40VnVyYTlSZHE4alpXdFZlaVdGRHhEOEh6b1MwckRmbG5oYzlRbkY1R0dyNllCVTBkeWM3YWtQVAorWEdYVkFaU1Noc1hXVUE4MkdHc0JQK1R1eGRaYmxIWktGTjUza09QWGg3bm1uVFRiS3o2NFNuTmZPNXVjZ2tHUQorZTlweU1jUEdJazAvZ2lYM2FxVzdUVjFEdzJaS2RJam5YbUYvQ0IzWXEyZmVpZmcrVnRJME1hQXJ4MGdHTFppQworOW5IWUtRei9ZdXlUK0ZnR1h2ajR6Z24rbDVLMHliREF0U0prZlJYQmREclhzSUcyam9hbG14eFJJZzFOZGJiTQoreUFwNVVKSXI2N3lCTXQyYzZkT3pZeWNUaVM1ZldMZUZyWFNOWGp3ZEt6V0hQWHZkMnhUNzBZMUhhZVpRdVFJTgorQkUzdTN6VUJFQUN3OUNPUDU2MFRXN3p2Ulk5d21hWmprM3dxb2JIK21YRStDVDI2VmFEd29PcHI5R1QwSmlIZQorc0tjKy9NYlZ5TkpjSWp1cEcrK1VvV0lHdTdMSHRydVB0c2dERkJFSUtKRFBkdWFNaUxpZXpBcW9XT3huc3RoLworL252cWNMNnpCUnZXV094Z2pvcWtDZEluNFhpdllwWTlGMWpYVTVCRWVFSFVZWk1sSG44Nm9ld2ZhR3hYNWh0RworZWI4RjR0eHh4eGVHQWN5bjNBZUZYVDRVdmdTSXZ0ZGYyalg0dTI4c3Rqd1RtNHd2WEtsR1J5NmJCT3JmbmZ1MAorajdXb2xocDVLUmRKMHlIbkZiYVViVGVaNzhuejBZWG1qMXZYVm9GQnByL2daQjFrdVdpR3lYR0VsdFFrWnc3KworOEFwcDlLVkVQU1RPQkpweUxBcU16dTdpdDcwb09aTEVmTWFhL3ZXaG9DT25penM0RFc3YUo4aWs2Z1o1cFBhQwora2pwVjhTM0hGWmVSd3hzbEZDQnJGNDdjTDRCbWxlSzRiVWdOVVA2TlpwUXFWOTBkdDJlMjY3bkhCeGhYSjB4KworaS9LOXAyc2ZFcDBGdXBwdE5pMHhWTWdKSmN0RFNYcFBwYnIrRnlXQ3dtekd1RGY3d3A1aXh4ZmkzVncweXVudAorWEFJcytEaTVPL25GREFMVjhUTW9EYlJMRWdBdE1JK2dlWlZBWW5nOVJYQ2YxeGMyWDBrTzRRaEovNll0dFYyRAorYTVUOXlQdUJuMW1hT1dZK1d3YlNLRU9ZQzhkazArSExFNEh5ZzZDSStnM0F0cVI3dk4wMm0zb2F2Z2Q0aHd4VAorS2FDNzVKOTVWbWt5M1dZN3RsR2NtNWJsSjY4V2g4Wm90bEthaWdLY2hUaGlrQ0pkcEV4S3RRQVJBUUFCaVFJZgorQkJnQkNnQUpCUUpON3Q4MUFoc01BQW9KRUhHSmNBaUE3MlV0ME9ZUC9BbWhpSnZRWEg2bUpTVlFrMnBRcmZqVgorbS9WSy93TGNkS1BLL2dHcS8vTlp6cE5WZVVPbnoyS0l6WmhRMVZCL3Zqd2tRaVBTNmxFTXBpWTZSS051c1VFdQorbWFYV1phRnVxcS9CaU9PNlU0UzZXVURlaFQrSnhtdGRjUTA4RnFVbldoR1Q0THRXU0JTSjZ5M1BvZktOd01KRworZ3B1UHJTZ011V0tYOC9MTE1VZFk2cHIvZ3ZsajFXZ091KzZPclI4UmFMR3ZGSWJKcVlOM2NNTXg2VWJENGRsdAorMHVuQm1ld3BwajhBTEYzekRTcXhoZmtzMjRndk9TNDN5Yk1XZWVhcEV5N0J0eXJOeStUT2JtYnhxdlA2NFFEaAorWlFESHgxUEVHcEphTzJvZzMvdmR3V3NGZXRWUElPTi9FcEovSWt6SjNtSStVZ2tQY2IvbEo1VnZHeWkwdytSdAordk12ZnZHL0VNZDZOekFmRUVzUjFoRkNtaFRhRitkNXNwNnhlS3pGSXB1YzROUU1zUW9VL2ZuRG83MkVFQzdLRAorS0M0bHUzR3UrelNwVE5XSXhMUC8zRHM0dDdyQktYVFJYRWdua1piaVdjNDJoNURWOHhPcUY1Z1FRaDc5dkVkRworNXprZ0QzZlF0VVNRL3I4ZTF3Z1RxVFpLWnpjVjZ3M1ZCOVVBc2tDNnpVbG80UXVtRTJWWFZjeFpPamJMaHpIagord3IyYldONll2MlA4V2ZVOEd2TGNScmZuR3VtUG9QWHN0SHZWVS84b044MkhrT2w0SldXQ1p2MTR5TzNHM3RKUworV0ZOd3JMQTZBdWpoaUpnRUhycVlidXEvMnJKeVc1MkM0L3k4VHdabFdpTWZyMW9HQkVlZjhwNktFdWdSanhpRworWURkYnhJVlF2M0hLbi9CN2tlSUkKKz1aTm45CistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitwdWIgICA0MDk2Ui83ODNDRTdCQiAyMDE0LTEyLTE5Cit1aWQgICAgICAgICAgICAgICAgICBUb20gQmFyYmVyIChDT0RFIFNJR05JTkcgS0VZKSA8bWFnaWNhbHRyb3V0QGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgNzgzQ0U3QkIgMjAxNC0xMi0xOSAgVG9tIEJhcmJlciAoQ09ERSBTSUdOSU5HIEtFWSkgPG1hZ2ljYWx0cm91dEBhcGFjaGUub3JnPgorc3ViICAgNDA5NlIvRTBENDIwRTEgMjAxNC0xMi0xOQorc2lnICAgICAgICAgIDc4M0NFN0JCIDIwMTQtMTItMTkgIFRvbSBCYXJiZXIgKENPREUgU0lHTklORyBLRVkpIDxtYWdpY2FsdHJvdXRAYXBhY2hlLm9yZz4KKworLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MQorCittUUlOQkZTVUNKVUJFQURkUStvSWljQUhyN1crMmhHSlIvZFZ0MFloNlR1SzhpNms0SlEzdlUwYVdiVkRDL0J5CitqVEVSQ3ZkREdNMHhnbGd3TGowNm5NMStSVnRSNHprK2ZraTQ5YXNaSW5vY0pHMmJXbkZ6NW9lM1FDbnNLdWFvCitVZVRFVFZHRU00N0hLYXhBUXE0dzh2NEtjcy9aZnRheFYxTDBGM3lPb2Y1SHd2Y3RTclZ0ZmpTNWZiaTZxVnpQCit1OU5IMXM2QnZqNlR4VUd6dTVMemVTMXhSUUpXWGt4TEN0TW92S2g1N3VaMkZJNm55b1J5VkZFS014dzRjRnpqCitiNFEvMmlKVUk2KzVRbFBSSFRlUDVOQWFvY0dqVG9ndDdSa2JrL0NZNVBVWm5ZVDg0c3hMdktPaEZPVW5oTE10CitzSEJYMzRCZTBmU2ZoYU5MQ2tJWUFOVjI1UitXd0ZTcmd5R2ZhUUNPcy9Ta3lieXdoQVZQUkxReHdsSWZ5Wm5PCitSdlkxdy80RXVxcGpBeUMvSzgzRmcrNE1seDNtdmpTVFh0VnlWbHhRWlh4S0gya2h1bndNTldJa0VuYXBCd2crCitqQURZTHJzM0Z2eGRIQVNDRVpmZXpwbmxFS3ZsSWhnNldlZWsvSzlMVTJ2cjlCcll6blRUMkF1UFF4T1hJWWg4CitCbjJLTElYNlBIY1Y0Rm5FQm8wWS9QVW5ESFJIbXJacFAwTEVGdUFCVHRqN1JDeCsvckZlUk1IM2crVkozYktzCitsS3FrSTFjcXM3ZmpOUlN3K0tTYjhManQ3SEpOZVQrbjVhMlY5ZVlneDVoRzBHU1B3M3V0WEtYR1lvZitwYmVHCitkM0NCdjF5T0QwRnF5THJ2OVRUTitkNjBTaERqSVpQc2Z5MkFuMisydHJ3VUFvYlBxVC8rck4rT093QVJBUUFCCit0RGRVYjIwZ1FtRnlZbVZ5SUNoRFQwUkZJRk5KUjA1SlRrY2dTMFZaS1NBOGJXRm5hV05oYkhSeWIzVjBRR0Z3CitZV05vWlM1dmNtYytpUUk0QkJNQkFnQWlCUUpVbEFpVkFoc0RCZ3NKQ0FjREFnWVZDQUlKQ2dzRUZnSURBUUllCitBUUlYZ0FBS0NSRFlGbkZ4ZUR6bnV4ZkVFQUNyQVpCVTIxeXJXdlBvemoxNmlxMXdYWWtNTVl0cFd1YVlXbkEwCitDV1VqWXF1eDY5MFVhY3ptQS81MllSTisxTXF1STljakdFT0dpNnlnVGhtbFVlVTV5SWZCMXA4K2ppUlhaaGJ2Cis4dnNZY1c2VnB5RThqb3RHLzI0V0cxcDdRTUdudFVoallBL3VoSzkvdWhzTUYvZUczQTJQR2ZKVEo3K2c0Wml1Cis4U0ExS0xLQ3MvYmczbjB1dnJ5c2JRNkxRUlAwVHA4aCtaU2JHSTdsU25CeXRjWUVBekhiVmlkWVRVRElNaGR6CitmTlN3TmhhNGFDZmQ0TU50YkoxSDVnSzhrRXJ5MzFDdjliekdRKzVUcVgvMCtVaDIzcjJoemduaFJOTzVaRUJPCitWUzhNS2NlSjZFSHhya3ptMC9VazU0b2UyQmtNWTNzTjBZempQZ09RUWRsdElFNEpIVDN3ZVBzMG9NMWNaL0loCitTMmFnbjNUc3E5WmRXN0lkSlR5M2N0NEVQcFRyWVFab0Q0cS9aUmZHSmZQNmJRTk1ucVJZeERnb1VaUUFNdzVyCitRYXVSejdtdHg2YVh2QWd4SVZlRHBXMFVqK0pXOTkwTXZTS2FvcS9UaXQ3eDY5SUZqMExDdlErMWxxUk4xK0NDCisyOENqYW0yV1Fjb0JidTVmRitSVTRGZkpBMklQZTl4SUYvWnJaaU1nYUJWdkFyZ1JqNWloZWlnSU41UVFtbzIzCisvY1ROdWVpZHNxUjB6VHVnZTVuSXo2ZnhCanNyTUpBeUFPS241RkN3OStnY0FDREl2SGEyYUxncytjV1EwWDYxCis2WlNqWXlMSlRPallPa2FITjcrZ2IwdzNqLzdIeXdhWjdXSFFQdkJ4L21nbm5jYXowZ01KaitNS2hTeHhzS040CiszTjdBdTdrQ0RRUlVsQWlWQVJBQXJaOXQ0YldqckkrdVl6bE5XQ1ltUU9UNUV0cTBjQnlyWlJKakJpYW5oYWtXCityMEUxY0JTcXR5bnVtZTJiVnRDSHRPUXpvVDd2QWxEbTJJVmpaYXNNRDM5VTJPcGFIMlJqVWd1VVVzVHJ6d3lOCiszT0ErY1Yvd3BiSFNvSlpQRld6RCtWM1Bwd0xHSzFGS0dRTHVlZ1E5YnlPTUFqUmVPbHFRWHZMcVU2RUhCMW5VCitiZnRraE5jaWZEQ2VjTnJmaExyQ2NtbVkraExuTlptWXFSUjVSTHl6WEY4S01QaW15c09kcnpQTUJRbkZ5cTRvCitHUHBxdWJuM1RNNTZmYVl0UmZCNE8zMUZjMU54SWc2NHhaOURxMzlST21wc3I3WkFReEtvbDRUYytDSXNoTXh2Cit3K0hjK1F5eGo2WnBqQUV5MmJ3Z0g3Y3pwNE1rUmk2ZndFVGFRcW1Zald5Z2xuZFZsT0NxYVI4M0VNdVk2d3pnCitTZ1hZU3lJN2xIWHhSQTNQK1I5dU9SOUpzZUYvTnhDMm8xVFhES1E5RXlkMnBNZFo5dHhkMTE4Mlk2c0NEK0ppCitLeEVMZE1aUlhUK1VoTFA2U0tqaFlRanRUZGk4UTlJRjlMQWwyYmVGM3VUdHpqcUNzVGd0Q1E4citRUFk3b2JXCit6NVpJMXF4VElWUGFTZUJheWkyMkk2bVUwMlFVTVRNQ21IMXBpWHhzRVNxeU1RMjIxbnVEaWswcFVWQzJleHNrCitIbnFDNC9hVnZKU254TGsxSC85ZG9wenllV3AzN0lGUVJIOVd6eVhjNHRjcUV4eCtmQ2FldFBBZTdvS09sd3pqCithcnpBd3NPTTVHRy9icytycE1CN2c5d0dhejhmbDlvbnBDY3VHUmVTVWhlZXRoWTFEYWtXOFc1SkVwNmRlWmtBCitFUUVBQVlrQ0h3UVlBUUlBQ1FVQ1ZKUUlsUUliREFBS0NSRFlGbkZ4ZUR6bnU2dVJEL3NGWEZ3UDZQU0V0MHY4CitZNWgyVkZQaGNOMm50NDIralN5emZZNVhFemFzdXVZWXNUUHhLRVBiWkhsNUJ5ODZpMHZMSjF3dkpudm9FZkV5CitYd015TExudzg3UmdzbmtITDBOSEdESkY3ZHJRcGJoSWdTWmZRVjJoWTFKM0F6MVBNV3M3ckkydGJLZVFVbUMxCitrN2l5eXpFeVFucGhUYlJkN0ZFS1lBRlB5bnJtcmxSUG5HMXpOUkZZR0MyUzVWa3hDT1YvZndOMlZwOFBYZm85CitQOUF6NFEwdEV1b3dOaVc3UHA0S2FIdW5kSVF0U01kWkFNMGJqNXdSa3c0WTk2VVlHRC9odXh2QWk3TUNnT2d2CitOQjhlNjU2clN4aWdOaUVKOWdPWU93SC82a000NGc4QlB0Y0x6ZVU0dERLelpkZkhDeHJYenhjQklWYTNRWjY5CitjN0pVSlRVODlMU2NKbThyYkhCVXdRcnJmNDd2U3hzOHB6VVRwRlRFb1BhQm5MRC9XT1hsUHdpSnl5T3FTaCt3CitrWnFwQzNKbjBhWHg0aGNtVkZ0bW9hTnNOZWhpSndBbDJiWDdnd2NpYTZ6ZXkwWjFLbGpyN04raWtITWhaTGpBCitQUzNCcE1mRWMvaGNMOSt2cjc0c2EzMnptOVM0YkZyZDF4Q0dNdjJoY29WV3lJMzhPckZCdnZLNnVLVHhWQ1BsCittbGdEa2NkRWJvT29RTmc1VHBWWEdueW9wMGRYSUNUZngyVy92KzdQcTk3ZWZGbG83aDNPREk3R3RsdEh4cWJzCitJR3VPRG84eDBobkdydkFPWlliNUJVTDcvQ1JvOVBNdDkxRExQT1JFRlNNSFZFc0ExMk9uYVRRMmhQWnJWT2NWCitIU1RqMVNBZm9aNWVyeFNrMy9lTWQzSDUyLzZqQmc9PQorPXlCYjcKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KZGlmZiAtLWdpdCBhLzAuMTAvTElDRU5TRS50eHQgYi8wLjEwL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvMC4xMC9OT1RJQ0UudHh0IGIvMC4xMC9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmZlZmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL05PVElDRS50eHQKQEAgLTAsMCArMSwxMDMgQEAKK0FwYWNoZSBPT0RUCitDb3B5cmlnaHQgMjAxMC0yMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0CitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgdGhlIFdlYkFwcGVycyBQcm9ncmVzcyBCYXIsIHZlcnNpb24gMC4yLCB3cml0dGVuIGJ5CitSYXkgQ2hldW5nLiBXZWJBcHBlcnMgUHJvZ3Jlc3MgQmFyIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyAKK29mIHRoZSBDcmVhdGl2ZSBDb21tb25zIGxpY2Vuc2UuIEZvciBkZXRhaWxzLCBzZWUgdGhlIFdlYkFwcGVycyB3ZWIgc2l0ZTogCisgICAgaHR0cDovL3d3dy53ZWJhcHBlcnMuY29tL3Byb2dyZXNzQmFyLworCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgdGhlIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yaywgdmVyc2lvbiAxLjUuMCwKK3dyaXR0ZW4gYnkgU2FtIFN0ZXBoZW5zb24uIFByb3RvdHlwZSBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgCitvZiBhbiBNSVQtc3R5bGUgbGljZW5zZS4gRm9yIGRldGFpbHMsIHNlZSB0aGUgUHJvdG90eXBlIHdlYiBzaXRlOiAKKyAgICBodHRwOi8vcHJvdG90eXBlLmNvbmlvLm5ldC8KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5LCB2ZXJzaW9uIDEuMy4xLCB3cml0dGVuCitieSBKb2huIFJlc2lnLiBqUXVlcnkgaXMgZHVhbGx5IGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcywgYW5kCitpcyBpbmNsdWRlZCBpbiB0aGlzIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIEZvciBkZXRhaWxzLAorc2VlIHRoZSBqUXVlcnkgd2ViIHNpdGU6IAorICAgIGh0dHA6Ly9qcXVlcnkuY29tLworCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgdGhlIGpRdWVyeSBVSSwgdmVyc2lvbnMgMS4yLjJiMiBhbmQgMS41LjMsIHdyaXR0ZW4gYnkgCitQYXVsIEJha2F1cy4gVGhlIGpRdWVyeSBVSSBpcyBkdWFsbHkgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLCAKK2FuZCBpcyBpbmNsdWRlZCBpbiB0aGlzIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIEZvciAKK2RldGFpbHMsIHNlZSB0aGUgalF1ZXJ5IFVJIHdlYiBzaXRlOgorICAgIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkKKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBqUXVlcnkgVUkgQ1NTIEZyYW1ld29yay4gVGhlIGpRdWVyeSBVSSBDU1MgCitGcmFtZXdvcmsgaXMgZHVhbGx5IGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcywgYW5kIGlzIGluY2x1ZGVkIAoraW4gdGhpcyBzb2Z0d2FyZSBkaXN0cmlidXRpb24gdW5kZXIgdGhlIE1JVCBsaWNlbnNlLiBGb3IgZGV0YWlscywgc2VlIHRoZSAKK2pRdWVyeSBVSSB3ZWIgc2l0ZToKKyAgICBodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0CisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyB0aGUgalF1ZXJ5IEFsZXJ0IERpYWxvZ3MgUGx1Z2luLCB2ZXJzaW9uIDEuMSwgd3JpdHRlbgorYnkgQ29yeSBTLk4uIExhVmlza2EgZm9yIEEgQmVhdXRpZnVsIFNpdGUsIExMQy4gVGhlIGpRdWVyeSBBbGVydCBEaWFsb2dzIAorUGx1Z2luIGlzIGR1YWxseSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMsIGFuZCBpcyBpbmNsdWRlZCBpbiAKK3RoaXMgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gRm9yIGRldGFpbHMsIHNlZSB0aGUgQQorQmVhdXRpZnVsIFNpdGUgd2ViIHNpdGU6CisgICAgaHR0cDovL2FiZWF1dGlmdWxzaXRlLm5ldC8KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBqUXVlcnkgUGVyaW9kaWNhbFVwZGF0ZXIgUGx1Z2luLCB2ZXJzaW9uIDIuMCwgCit3cml0dGVuIGJ5IFJvYmVydCBGaXNjaGVyIGZvciBTbW9rZWp1bXBlciBJVCBhbmQgMzYwaW5ub3ZhdGUuIFRoZSBqUXVlcnkKK1BlcmlvZGljYWxVcGRhdGVyIFBsdWdpbiBpcyBkdWFsbHkgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLCAKK2FuZCBpcyBpbmNsdWRlZCBpbiB0aGlzIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIEZvciAKK2RldGFpbHMsIHNlZSB0aGUgZm9sbG93aW5nIHdlYnNpdGVzOgorICAgICBSb2JlcnQgRmlzY2hlciAoaHR0cDovL3Ntb2tlanVtcGVyaXQuY29tKQorICAgICAzNjBpbm5vdmF0ZSAoaHR0cDovL3d3dy4zNjBpbm5vdmF0ZS5jby51aykKKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBqUXVlcnkgYmxvY2tVSSBQbHVnaW4sIHZlcnNpb24gMi4xNSwgd3JpdHRlbiBieQorTS4gQWxzdXAuIFRoZSBqUXVlcnkgYmxvY2tVSSBQbHVnaW4gaXMgZHVhbGx5IGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIAorR1BMIGxpY2Vuc2VzLCBhbmQgaXMgaW5jbHVkZWQgaW4gdGhpcyBzb2Z0d2FyZSBkaXN0cmlidXRpb24gdW5kZXIgdGhlIE1JVCAKK2xpY2Vuc2UuIEZvciBkZXRhaWxzLCBzZWU6CisgICAgIGh0dHA6Ly9tYWxzdXAuY29tL2pxdWVyeS9ibG9jay8KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBqUXVlcnkgQ29va2llIFBsdWdpbiwgd3JpdHRlbiBieSBLbGF1cyBIYXJ0bC4KK1RoZSBqUXVlcnkgQ29va2llIFBsdWdpbiBpcyBkdWFsbHkgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLCAKK2FuZCBpcyBpbmNsdWRlZCBpbiB0aGlzIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyB0aGUgalF1ZXJ5IFRyZWV2aWV3IFBsdWdpbiwgdmVyc2lvbiAxLjQsIGFuZCB0aGUKK0FzeW5jIFRyZWV2aWV3IGV4dGVuc2lvbiwgdmVyc2lvbiAwLjEsIHdyaXR0ZW4gYnkgSsO2cm4gWmFlZmZlcmVyLiBUaGUgCitqUXVlcnkgVHJlZXZpZXcgUGx1Z2luIGFuZCBBc3luYyBUcmVldmlldyBhcmUgZHVhbGx5IGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgCithbmQgR1BMIGxpY2Vuc2VzLCBhbmQgaXMgaW5jbHVkZWQgaW4gdGhpcyBzb2Z0d2FyZSBkaXN0cmlidXRpb24gdW5kZXIgdGhlIAorTUlUIGxpY2Vuc2UuIEZvciBkZXRhaWxzLCBzZWU6CisgICAgIGh0dHA6Ly9iYXNzaXN0YW5jZS5kZS9qcXVlcnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLXRyZWV2aWV3LworICAgICBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVHJlZXZpZXcKKyAKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyB0aGUgRHluYW1pYyBUcmVlIFZpZXcgQ29udHJvbCwgdmVyc2lvbiAwLjQuMCwgd3JpdHRlbgorYnkgTWFydGluIFdlbmR0LiBUaGUgRHluYW1pYyBUcmVlIFZpZXcgQ09udHJvbCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUCitsaWNlbnNlLiBGb3IgZGV0YWlscywgc2VlOgorICAgICBodHRwOi8vZHluYXRyZWUuZ29vZ2xlY29kZS5jb20vCisKK1RoaXMgcHJvZHVjdCB1dGlsaXplcyB1c2luZyB2MS4zLjQgb2YgRG91ZyBMZWEncyBqYXZhLnV0aWwuY29uY3VycmVudC4KKworVGhpcyBwcm9kdWN0IHV0aWxpemVzIGpzY2ggdmVyc2lvbiAwLjEuNDIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgQXRzdWhpa28gWWFtYW5ha2EsIEpDcmFmdCxJbmMuIAorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKK0lOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBKQ1JBRlQsCitJTkMuIE9SIEFOWSBDT05UUklCVVRPUlMgVE8gVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCitPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhLzAuMTAvUkVBRE1FLm1kIGIvMC4xMC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxMTAyOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTUzIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgV2VsY29tZSB0byBBcGFjaGUgT09EVCAgPGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPT0RUIGlzIGEgZ3JpZCBtaWRkbGV3YXJlIGZyYW1ld29yayB1c2VkIG9uIGEgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgcHJvamVjdHMgYXQKK05BU0EncyBKZXQgUHJvcHVsc2lvbiBMYWJvcmF0b3J5L0NhbGlmb3JuaWEgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIGFuZCBtYW55CitvdGhlciByZXNlYXJjaCBpbnN0aXR1dGlvbnMgYW5kIHVuaXZlcnNpdGllcywgc3BlY2lmaWNhbGx5IHRob3NlIHBhcnQgb2YgdGhlOgorCisqIE5hdGlvbmFsIENhbmNlciBJbnN0aXR1dGUncyAoTkNJJ3MpIEVhcmx5IERldGVjdGlvbiBSZXNlYXJjaCBOZXR3b3JrIChFRFJOKQorICBwcm9qZWN0IC0gb3ZlciA0MCsgaW5zdGl0dXRpb25zIGFsbCBwZXJmb3JtaW5nIHJlc2VhcmNoIGludG8gZGlzY292ZXJpbmcKKyAgYmlvbWFya2VycyB3aGljaCBhcmUgZWFybHkgaW5kaWNhdG9ycyBvZiBkaXNlYXNlLgorKiBOQVNBJ3MgUGxhbmV0YXJ5IERhdGEgU3lzdGVtIChQRFMpIC0gTkFTQSdzIHBsYW5ldGFyeSBkYXRhIGFyY2hpdmUsIGEKKyAgcmVwb3NpdG9yeSBhbmQgcmVnaXN0cnkgZm9yIGFsbCBwbGFuZXRhcnkgZGF0YSBjb2xsZWN0ZWQgb3ZlciB0aGUgcGFzdCAzMCsKKyAgeWVhcnMuCisqIFZhcmlvdXMgRWFydGggU2NpZW5jZSBkYXRhIHByb2Nlc3NpbmcgbWlzc2lvbnMsIGluY2x1ZGluZworICBTZWF3aW5kcy9RdWlja1NDQVQsIHRoZSBPcmJpdGluZyBDYXJib24gT2JzZXJ2YXRvcnksIHRoZSBOUFAgU291bmRlciBQRUFURQorICBwcm9qZWN0LCBhbmQgdGhlIFNvaWwgTW9pc3R1cmUgQWN0aXZlIFBhc3NpdmUgKFNNQVApIG1pc3Npb24uCisKK09PRFQgaXMgYSBUb3AgTGV2ZWwgcHJvamVjdCBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKzxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKworR2V0dGluZyBTdGFydGVkCis9PT09PT09PT09PT09PT0KKworT09EVCBpcyBwcmltYXJpbHkgd3JpdHRlbiBpbiBKYXZhLCB3aXRoIHNvbWUgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gUHl0aG9uLgorSXQgcmVxdWlyZXMgSmF2YSA1IGFuZCB1c2VzIHRoZSBNYXZlbiAyIDxodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8+IGJ1aWxkCitzeXN0ZW0uICBUbyBidWlsZCB0aGUgSmF2YSBjb21wb25lbnRzIG9mIE9PRFQsIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4KK3RoaXMgZGlyZWN0b3J5OgorCisgICAgbXZuIGNsZWFuIGluc3RhbGwKKworRm9yIHRoZSBQeXRob24gY29tcG9uZW50cywgc2VlIHRoZSAiYWdpbGl0eSIgc3ViZGlyZWN0b3J5LgorCitDb250cmlidXRpbmcKKz09PT09PT09PT09PQorVG8gY29udHJpYnV0ZSBhIHBhdGNoLCBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIChub3RlIHRoYXQgaW5zdGFsbGluZworW0h1Yl0oaHR0cDovL2h1Yi5naXRodWIuY29tKSBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQsIGJ1dCBpcyByZWNvbW1lbmRlZCkuCisKK2BgYAorMC4gRG93bmxvYWQgYW5kIGluc3RhbGwgaHViLmdpdGh1Yi5jb20KKzEuIEZpbGUgSklSQSBpc3N1ZSBmb3IgeW91ciBmaXggYXQgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PT0RUCistIHlvdSB3aWxsIGdldCBpc3N1ZSBpZCBPT0RULXh4eCB3aGVyZSB4eHggaXMgdGhlIGlzc3VlIElELgorMi4gZ2l0IGNsb25lIGh0dHA6Ly9naXRodWIuY29tL2FwYWNoZS9vb2R0LmdpdAorMy4gY2Qgb29kdAorNC4gZ2l0IGNoZWNrb3V0IC1iIE9PRFQteHh4Cis1LiBlZGl0IGZpbGVzCis2LiBnaXQgc3RhdHVzIChtYWtlIHN1cmUgaXQgc2hvd3Mgd2hhdCBmaWxlcyB5b3UgZXhwZWN0ZWQgdG8gZWRpdCkKKzcuIGdpdCBhZGQgPGZpbGVzPgorOC4gZ2l0IGNvbW1pdCAtbSDigJxmaXggZm9yIE9PRFQteHh4IGNvbnRyaWJ1dGVkIGJ5IDx5b3VyIHVzZXJuYW1lPuKAnQorOS4gZ2l0IGZvcmsKKzEwLiBnaXQgcHVzaCAtdSA8eW91ciBnaXQgdXNlcm5hbWU+IE9PRFQteHh4CisxMS4gZ2l0IHB1bGwtcmVxdWVzdAorYGBgCisKKworTGljZW5zZSAoc2VlIGFsc28gTElDRU5TRS50eHQpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29sbGVjdGl2ZSB3b3JrOiBDb3B5cmlnaHQgMjAxMC0yMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0FwYWNoZSBPT0RUIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZSBjb3B5cmlnaHQKK25vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0bwordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlcyBsaXN0ZWQgaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuCisKK0V4cG9ydCBjb250cm9sCis9PT09PT09PT09PT09PQorCitUaGlzIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlLiAgVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91CitjdXJyZW50bHkgcmVzaWRlIG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCB1c2UsIGFuZC9vcgorcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gIEJFRk9SRSB1c2luZyBhbnkKK2VuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB5b3VyIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQKK3BvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mCitlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuICBTZWUKKzxodHRwOi8vd3d3Lndhc3NlbmFhci5vcmcvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVGhlIFUuUy4gIEdvdmVybm1lbnQgRGVwYXJ0bWVudCBvZiBDb21tZXJjZSwgQnVyZWF1IG9mIEluZHVzdHJ5IGFuZCBTZWN1cml0eQorKEJJUyksIGhhcyBjbGFzc2lmaWVkIHRoaXMgc29mdHdhcmUgYXMgRXhwb3J0IENvbW1vZGl0eSBDb250cm9sIE51bWJlciAoRUNDTikKKzVEMDAyLkMuMSwgd2hpY2ggaW5jbHVkZXMgaW5mb3JtYXRpb24gc2VjdXJpdHkgc29mdHdhcmUgdXNpbmcgb3IgcGVyZm9ybWluZworY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbnMgd2l0aCBhc3ltbWV0cmljIGFsZ29yaXRobXMuICBUaGUgZm9ybSBhbmQgbWFubmVyIG9mCit0aGlzIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGRpc3RyaWJ1dGlvbiBtYWtlcyBpdCBlbGlnaWJsZSBmb3IgZXhwb3J0Cit1bmRlciB0aGUgTGljZW5zZSBFeGNlcHRpb24gRU5DIFRlY2hub2xvZ3kgU29mdHdhcmUgVW5yZXN0cmljdGVkIChUU1UpCitleGNlcHRpb24gKHNlZSB0aGUgQklTIEV4cG9ydCBBZG1pbmlzdHJhdGlvbiBSZWd1bGF0aW9ucywgU2VjdGlvbiA3NDAuMTMpIGZvcgorYm90aCBvYmplY3QgY29kZSBhbmQgc291cmNlIGNvZGUuCisKK1RoZSBmb2xsb3dpbmcgcHJvdmlkZXMgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbmNsdWRlZCBjcnlwdG9ncmFwaGljIHNvZnR3YXJlOgorCisgICAgQXBhY2hlIE9PRFQgdXNlcyBBcGFjaGUgVGlrYSB3aGljaCB1c2VzIHRoZSBCb3VuY3kgQ2FzdGxlIGdlbmVyaWMKKyAgICBlbmNyeXB0aW9uIGxpYnJhcmllcyBmb3IgZXh0cmFjdGluZyB0ZXh0IGNvbnRlbnQgYW5kIG1ldGFkYXRhIGZyb20KKyAgICBlbmNyeXB0ZWQgUERGIGZpbGVzLiAgU2VlIGh0dHA6Ly93d3cuYm91bmN5Y2FzdGxlLm9yZy8gZm9yIG1vcmUgZGV0YWlscyBvbgorICAgIEJvdW5jeSBDYXN0bGUuCisKK0RvY3VtZW50YXRpb24KKz09PT09PT09PT09PT0KKworWW91IGNhbiBidWlsZCBhIGxvY2FsIGNvcHkgb2YgdGhlIE9PRFQgZG9jdW1lbnRhdGlvbiBpbmNsdWRpbmcgSmF2YURvY3MgdXNpbmcKK3RoZSBmb2xsb3dpbmcgTWF2ZW4gMiBjb21tYW5kIGluIHRoZSBPT0RUIHNvdXJjZSBkaXJlY3Rvcnk6CisKKyAgICBtdm4gc2l0ZQorCitZb3UgY2FuIHRoZW4gb3BlbiB0aGUgT09EVCBEb2N1bWVudGF0aW9uIGluIGEgd2ViIGJyb3dzZXI6CisKKyAgICAuL3RhcmdldC9zaXRlL2luZGV4Lmh0bWwKKworTm90ZTogYWxsIE9PRFQgc291cmNlIGZpbGVzIGFyZSBlbmNvZGVkIHdpdGggVVRGLTguICBZb3UgbXVzdCBzZXQgeW91cgorTUFWRU5fT1BUUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBpbmNsdWRlICItRGZpbGUuZW5jb2Rpbmc9VVRGLTgiIGluIG9yZGVyIHRvCitwcm9wZXJseSBnZW5lcmF0ZSB0aGUgd2ViIHNpdGUgYW5kIG90aGVyIGFydGlmYWN0cyBmcm9tIHNvdXJjZS4KKworTm90ZTogZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnRhdGlvbiByZXF1aXJlcyBlbm9ybW91cyBhbW91bnRzIG9mIG1lbW9yeS4gIE1vcmUKK3RoYW4gbGlrZWx5IHlvdSdsbCBuZWVkIHRvIGFkZCB0byB0aGUgTUFWRU5fT1BUUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBvcmRlcgordG8gc2V0IHRoZSBKYXZhIGhlYXAgbWF4aW11bSBzaXplIHdpdGggIi1YbXg1MTJtIiBvciBsYXJnZXIgYmVmb3JlIGF0dGVtcHRpbmcKK3RvIHJ1biAibXZuIHNpdGUiLgorCitNYWlsaW5nIExpc3RzCis9PT09PT09PT09PT09CisKK0Rpc2N1c3Npb24gYWJvdXQgT09EVCB0YWtlcyBwbGFjZSBvbiB0aGUgZm9sbG93aW5nIG1haWxpbmcgbGlzdHM6CisKKyAgICBkZXZAb29kdC5hcGFjaGUub3JnICAgIC0gQWJvdXQgdXNpbmcgT09EVCBhbmQgZGV2ZWxvcGluZyBPT0RUCisKK05vdGlmaWNhdGlvbiBvbiBhbGwgY29kZSBjaGFuZ2VzIGFyZSBzZW50IHRvIHRoZSBmb2xsb3dpbmcgbWFpbGluZyBsaXN0OgorCisgICAgY29tbWl0c0Bvb2R0LmFwYWNoZS5vcmcKKworVGhlIG1haWxpbmcgbGlzdHMgYXJlIG9wZW4gdG8gYW55b25lIGFuZCBwdWJsaWNseSBhcmNoaXZlZC4KKworWW91IGNhbiBzdWJzY3JpYmUgdGhlIG1haWxpbmcgbGlzdHMgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdG8KKzxMSVNUPi1zdWJzY3JpYmVAb29kdC5hcGFjaGUub3JnIChmb3IgZXhhbXBsZQorZGV2LXN1YnNjcmliZUBvb2R0Li4uKS4gIFRvIHVuc3Vic2NyaWJlLCBzZW5kIGEgbWVzc2FnZSB0bworPExJU1Q+LXVuc3Vic2NyaWJlQG9vZHQuYXBhY2hlLm9yZy4gIEZvciBtb3JlIGluc3RydWN0aW9ucywgc2VuZCBhCittZXNzYWdlIHRvIDxMSVNUPi1oZWxwQG9vZHQuYXBhY2hlLm9yZy4KKworSXNzdWUgVHJhY2tlcgorPT09PT09PT09PT09PQorCitJZiB5b3UgZW5jb3VudGVyIGVycm9ycyBpbiBPT0RUIG9yIHdhbnQgdG8gc3VnZ2VzdCBhbiBpbXByb3ZlbWVudCBvciBhIG5ldworZmVhdHVyZSwgcGxlYXNlIHZpc2l0IHRoZSBPT0RUIGlzc3VlIHRyYWNrZXIgYXQKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT09EVC4gIFRoZXJlIHlvdSBjYW4gYWxzbyBmaW5kIHRoZQorbGF0ZXN0IGluZm9ybWF0aW9uIG9uIGtub3duIGlzc3VlcyBhbmQgcmVjZW50IGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLgpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L01BTklGRVNULmluIGIvMC4xMC9hZ2lsaXR5L01BTklGRVNULmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTg3MWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvTUFOSUZFU1QuaW4KQEAgLTAsMCArMSwyIEBACitpbmNsdWRlIGRpc3RyaWJ1dGVfc2V0dXAucHkKK3JlY3Vyc2l2ZS1pbmNsdWRlIGRvY3MgKi50eHQKZGlmZiAtLWdpdCBhLzAuMTAvYWdpbGl0eS9SRUFETUUudHh0IGIvMC4xMC9hZ2lsaXR5L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNDVhMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYWdpbGl0eS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTcgQEAKK0FnaWxlIE9PRFQgaXMgYSBuZXcgdmVyc2lvbiBvZiBgT2JqZWN0IE9yaWVudGVkIERhdGEgVGVjaG5vbG9neWBfLiAgSXQKK2ltcHJvdmVzIHVwb24gdGhlIHByZXZpb3VzIHZlcnNpb24gYnkgYmVpbmcgZWFzaWVyIHRvIGRldmVsb3AsIG1haW50YWluLCBhbmQKK2V4dGVuZDsgc2ltcGxlciB0byBpbnRlZ3JhdGUgYnk7IGFuZCBmYXN0ZXIgdG8gdXNlLgorCisuLiBUaGlzIGlzIGxpY2Vuc2VkIHNvZnR3YXJlOyBzZWUgdGhlIGZpbGVzIE5PVElDRS50eHQgYW5kIGRvY3MvTElDRU5TRS50eHQuCisKKy4uIEZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLCBzZWUgZG9jcy9JTlNUQUxMLnR4dC4KKworLi4gUmVmZXJlbmNlczoKKy4uIF9gT2JqZWN0IE9yaWVudGVkIERhdGEgVGVjaG5vbG9neWA6IGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvCisKKy4uIG1ldGE6OgorICAgIDprZXl3b3JkczogT09EVCwgZGF0YSwgb2JqZWN0LCBPTywgZGlzY292ZXJ5LCBtZXRhZGF0YSwKKyAgICAgICAgdHJhbnNmZXIsIHRyYW5zZm9ybWF0aW9uLCBxdWVyeSwgc2VhcmNoLCByZXRyaWV2YWwKKyAgICA6ZGVzY3JpcHRpb24gbGFuZz1lbjogQWdpbGUgT09EVCwgdGhlIG5pbWJsZSB2ZXJzaW9uIG9mCisgICAgICAgIE9iamVjdCBPcmllbnRlZCBEYXRhIFRlY2hub2xvZ3kKKwpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L2RvY3MvSElTVE9SWS50eHQgYi8wLjEwL2FnaWxpdHkvZG9jcy9ISVNUT1JZLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQyNTZiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L2RvY3MvSElTVE9SWS50eHQKQEAgLTAsMCArMSwyMSBAQAorQ2hhbmdlbG9nCis9PT09PT09PT0KKworV2hhdCBmb2xsb3dzIGlzIGEgaGlzdG9yeSBvZiBjaGFuZ2VzIHRvIHRoaXMgc29mdHdhcmUuCisKKzAuMiAtIEN1cnJlbnQKKy0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgY3VycmVudCByZWxlYXNlIG9mIEFnaWxlIE9PRFQsIHJlcHJlc2VudGluZyBpdHMgbWlncmF0aW9uIGZyb20gdGhlCitBcGFjaGUgSW5jdWJhdG9yIHRvIGEgZnVsbC1mbGVkZ2VkIHRvcC1sZXZlbCBBcGFjaGUgcHJvamVjdC4KKworCiswLjEtaW5jdWJhdGluZyAtIEluaXRpYWwgQXBhY2hlIFJlbGVhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHJlbGVhc2UgbWFya3MgdGhlIGluZHVjdGlvbiBvZiBBZ2lsZSBPT0RUIGludG8gdGhlIEFwYWNoZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIEluY3ViYXRvcl8uCisKKworLi4gUmVmZXJlbmNlczoKKy4uIF9JbmN1YmF0b3I6IGh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2FnaWxpdHkvZG9jcy9JTlNUQUxMLnR4dCBiLzAuMTAvYWdpbGl0eS9kb2NzL0lOU1RBTEwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTA3NGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvZG9jcy9JTlNUQUxMLnR4dApAQCAtMCwwICsxLDkxIEBACitJbnN0YWxsYXRpb24KKz09PT09PT09PT09PQorCitXaGF0IGZvbGxvd3MgYXJlIHRoZSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBBZ2lsZSBPT0RULgorCisKK1F1aWNrIEluc3RydWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIGEgdXNlciB3aXRoIGFkbWluaXN0cmF0aXZlIHByaXZpbGVnZXMsIHJ1biBlaXRoZXI6OgorCisgICAgcGlwIG9vZHQKKworb3I6OgorCisgICAgZWFzeV9pbnN0YWxsIG9vZHQKKworZGVwZW5kaW5nIG9uIHdoYXQncyBhdmFpbGFibGUgb24geW91ciBzeXN0ZW0uICBZb3UncmUgZG9uZSEKKworCitGdWxsIEluc3RydWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0KKworQWdpbGUgT09EVCByZXF1aXJlcyB0aGUgUHl0aG9uXyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIFdlIHJlY29tbWVuZCB2ZXJzaW9uIDIuNAorb3IgbGF0ZXIuICBBcyBvZiB0aGlzIHdyaXRpbmcsIDIuNyBpcyB0aGUgbGF0ZXN0IHN0YWJsZSB2ZXJzaW9uLiAgSWYgUHl0aG9uIGlzCitub3QgeWV0IGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSwgeW91IGNhbiBmaW5kIGJpbmFyeSBhbmQgYW5kIHNvdXJjZQorZGlzdHJpYnV0aW9ucyBmcm9tIHRoZSBQeXRob24gd2Vic2l0ZS4KKworVG8gdGVzdCBpZiBhIGNvcnJlY3QgdmVyc2lvbiBvZiBQeXRob24gaXMgYXZhaWxhYmxlIG9uIHlvdXIgc3lzdGVtLCBydW46OgorCisgICAgcHl0aG9uIC1WCisgICAgCitZb3Ugc2hvdWxkIHNlZSBvdXRwdXQgc2ltaWxhciB0bzo6CisKKyAgICBQeXRob24gMi43CisgICAgCitpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiBpbnN0YWxsZWQuICBZb3UgbWF5IHRoZW4gcHJvY2VlZCB0byBpbnN0YWxsCitBZ2lsZSBPT0RULgorCitCeSBmYXIgdGhlIGVhc2llc3QsIHJlY29tbWVuZGVkLCBhbmQgZW5jb3VyYWdlZCB3YXkgdG8gaW5zdGFsbCBBZ2lsZSBPT0RUIGlzCitlaXRoZXIgd2l0aCBQaXBfIG9yIEVhc3lJbnN0YWxsXy4gIElmIHlvdXIgUHl0aG9uIGluc3RhbGxhdGlvbiBoYXMgZWl0aGVyIG9mCit0aGVzZSBpbnN0YWxsZXJzIGF2YWlsYWJsZSB0byBpdCwgdGhlbiBvbmUgY29tbWFuZCBpcyBhbGwgeW91IG5lZWQgdG8gcnVuIGluCitvcmRlciB0byBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIGFuZCBnZW5lcmF0ZSBjb21tYW5kLWxpbmUgdG9vbHMgYWxsIGluIG9uZQorZ28gZm9yIGFsbCB1c2VycyBvbiB5b3VyIHN5c3RlbS4gIEZvciBQaXAgdXNlcnMsIGl0J3M6OgorCisgICAgcGlwIG9vZHQKKworQW5kIGZvciBFYXN5SW5zdGFsbCB1c2VycywgaXQnczo6CisKKyAgICBlYXN5X2luc3RhbGwgb29kdAorICAgIAorQmUgc3VyZSB0byBydW4gdGhhdCBjb21tYW5kIGFzIGFuIGFkbWluaXN0cmF0aXZlIHVzZXIuICBGb3IgZXhhbXBsZSwgb24gTWFjIE9TCitYIGFuZCBvdGhlciBVbml4IHN5c3RlbXMsIHlvdSBtaWdodCBuZWVkIHRvIHJ1biBlaXRoZXIgb2Y6OgorCisgICAgc3VkbyBwaXAgb29kdAorICAgIHN1ZG8gZWFzeV9pbnN0YWxsIG9vZHQKKworCitJbnN0YWxsaW5nIEZyb20gU291cmNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIG5laXRoZXIgUGlwIG5vciBFYXN5SW5zdGFsbCBhcmUgYXZhaWxhYmxlLCB5b3UgY2FuIHN0aWxsIG1ha2UgYSBwcm9wZXIKK2luc3RhbGxhdGlvbiBvZiBBZ2lsZSBPT0RUIGJ5IGJ1aWxkaW5nIGl0IGZyb20gaXRzIHNvdXJjZSBjb2RlLiAgSnVzdCBmb2xsb3cKK3RoZXNlIGluc3RydWN0aW9uczoKKworMS4gIERvd25sb2FkIHRoZSBBZ2lsZSBPT0RUIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGV4dHJhY3QgdGhlIHNvdXJjZQorICAgIGFyY2hpdmUuICBUaGUgc291cmNlIGRpc3RyaWJ1dGlvbiBpcyBwYWNrYWdlZCBhcyBhIGd6aXAnZCB0YXIgYXJjaGl2ZS4KKzIuICBDaGFuZ2UgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIG5ld2x5IGV4dHJhY3RlZCBkaXJlY3RvcnkuCiszLiAgQXMgYW4gYWRtaW5pc3RyYXRpdmUgdXNlciwgcnVuOiBgYHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsYGAKKworCitGb3IgTW9yZSBJbmZvcm1hdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVmlzaXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGlua3MgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHRvIGFzayBxdWVzdGlvbnMsCityZXBvcnQgYnVncywgYW5kIHNvIGZvcnRoOgorCitPT0RUIEhvbWUgUGFnZQorICAgIGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvCitNYWlsaW5nIExpc3QgZm9yIE9PRFQgRGV2ZWxvcG1lbnQKKyAgICBtYWlsdG86ZGV2QG9vZHQuYXBhY2hlLm9yZworUGFja2FnZSBQYWdlIChDaGVlc2UgU2hvcCkKKyAgICBodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGkvb29kdC8KK0lzc3VlIFRyYWNrZXIgKHN1Ym1pdCBidWcgcmVwb3J0cyBoZXJlKQorICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT09EVAorCisKKy4uIFJlZmVyZW5jZXM6CisuLiBfRWFzeUluc3RhbGw6IGh0dHA6Ly9wYWNrYWdlcy5weXRob24ub3JnL2Rpc3RyaWJ1dGUvZWFzeV9pbnN0YWxsLmh0bWwKKy4uIF9QaXA6IGh0dHA6Ly9waXAub3BlbnBsYW5zLm9yZy8KKy4uIF9QeXRob246IGh0dHA6Ly9weXRob24ub3JnLwpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L2RvY3MvTElDRU5TRS50eHQgYi8wLjEwL2FnaWxpdHkvZG9jcy9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTk1NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L2RvY3MvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNzkgQEAKK0xpY2Vuc2UsIFRlcm1zLCBhbmQgQ29uZGl0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L2V6X3NldHVwLnB5IGIvMC4xMC9hZ2lsaXR5L2V6X3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTQxOWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvZXpfc2V0dXAucHkKQEAgLTAsMCArMSwzNDcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkJvb3RzdHJhcCBzZXR1cHRvb2xzIGluc3RhbGxhdGlvbgorCitUbyB1c2Ugc2V0dXB0b29scyBpbiB5b3VyIHBhY2thZ2UncyBzZXR1cC5weSwgaW5jbHVkZSB0aGlzCitmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgYWRkIHRoaXMgdG8gdGhlIHRvcCBvZiB5b3VyIHNldHVwLnB5OjoKKworICAgIGZyb20gZXpfc2V0dXAgaW1wb3J0IHVzZV9zZXR1cHRvb2xzCisgICAgdXNlX3NldHVwdG9vbHMoKQorCitUbyByZXF1aXJlIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBzZXR1cHRvb2xzLCBzZXQgYSBkb3dubG9hZAorbWlycm9yLCBvciB1c2UgYW4gYWx0ZXJuYXRlIGRvd25sb2FkIGRpcmVjdG9yeSwgc2ltcGx5IHN1cHBseQordGhlIGFwcHJvcHJpYXRlIG9wdGlvbnMgdG8gYGB1c2Vfc2V0dXB0b29scygpYGAuCisKK1RoaXMgZmlsZSBjYW4gYWxzbyBiZSBydW4gYXMgYSBzY3JpcHQgdG8gaW5zdGFsbCBvciB1cGdyYWRlIHNldHVwdG9vbHMuCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgemlwZmlsZQoraW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBjb250ZXh0bGliCisKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKwordHJ5OgorICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHVybGxpYjIgaW1wb3J0IHVybG9wZW4KKwordHJ5OgorICAgIGZyb20gc2l0ZSBpbXBvcnQgVVNFUl9TSVRFCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgVVNFUl9TSVRFID0gTm9uZQorCitERUZBVUxUX1ZFUlNJT04gPSAiOC4yLjEiCitERUZBVUxUX1VSTCA9ICJodHRwczovL3B5cGkucHl0aG9uLm9yZy9wYWNrYWdlcy9zb3VyY2Uvcy9zZXR1cHRvb2xzLyIKKworZGVmIF9weXRob25fY21kKCphcmdzKToKKyAgICAiIiIKKyAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgY29tbWFuZCBzdWNjZWVkZWQuCisgICAgIiIiCisgICAgYXJncyA9IChzeXMuZXhlY3V0YWJsZSwpICsgYXJncworICAgIHJldHVybiBzdWJwcm9jZXNzLmNhbGwoYXJncykgPT0gMAorCisKK2RlZiBfaW5zdGFsbChhcmNoaXZlX2ZpbGVuYW1lLCBpbnN0YWxsX2FyZ3M9KCkpOgorICAgIHdpdGggYXJjaGl2ZV9jb250ZXh0KGFyY2hpdmVfZmlsZW5hbWUpOgorICAgICAgICAjIGluc3RhbGxpbmcKKyAgICAgICAgbG9nLndhcm4oJ0luc3RhbGxpbmcgU2V0dXB0b29scycpCisgICAgICAgIGlmIG5vdCBfcHl0aG9uX2NtZCgnc2V0dXAucHknLCAnaW5zdGFsbCcsICppbnN0YWxsX2FyZ3MpOgorICAgICAgICAgICAgbG9nLndhcm4oJ1NvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uLicpCisgICAgICAgICAgICBsb2cud2FybignU2VlIHRoZSBlcnJvciBtZXNzYWdlIGFib3ZlLicpCisgICAgICAgICAgICAjIGV4aXRjb2RlIHdpbGwgYmUgMgorICAgICAgICAgICAgcmV0dXJuIDIKKworCitkZWYgX2J1aWxkX2VnZyhlZ2csIGFyY2hpdmVfZmlsZW5hbWUsIHRvX2Rpcik6CisgICAgd2l0aCBhcmNoaXZlX2NvbnRleHQoYXJjaGl2ZV9maWxlbmFtZSk6CisgICAgICAgICMgYnVpbGRpbmcgYW4gZWdnCisgICAgICAgIGxvZy53YXJuKCdCdWlsZGluZyBhIFNldHVwdG9vbHMgZWdnIGluICVzJywgdG9fZGlyKQorICAgICAgICBfcHl0aG9uX2NtZCgnc2V0dXAucHknLCAnLXEnLCAnYmRpc3RfZWdnJywgJy0tZGlzdC1kaXInLCB0b19kaXIpCisgICAgIyByZXR1cm5pbmcgdGhlIHJlc3VsdAorICAgIGxvZy53YXJuKGVnZykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZWdnKToKKyAgICAgICAgcmFpc2UgSU9FcnJvcignQ291bGQgbm90IGJ1aWxkIHRoZSBlZ2cuJykKKworCitjbGFzcyBDb250ZXh0dWFsWmlwRmlsZSh6aXBmaWxlLlppcEZpbGUpOgorICAgICIiIgorICAgIFN1cHBsZW1lbnQgWmlwRmlsZSBjbGFzcyB0byBzdXBwb3J0IGNvbnRleHQgbWFuYWdlciBmb3IgUHl0aG9uIDIuNgorICAgICIiIgorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBDb25zdHJ1Y3QgYSBaaXBGaWxlIG9yIENvbnRleHR1YWxaaXBGaWxlIGFzIGFwcHJvcHJpYXRlCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKHppcGZpbGUuWmlwRmlsZSwgJ19fZXhpdF9fJyk6CisgICAgICAgICAgICByZXR1cm4gemlwZmlsZS5aaXBGaWxlKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIHN1cGVyKENvbnRleHR1YWxaaXBGaWxlLCBjbHMpLl9fbmV3X18oY2xzKQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgYXJjaGl2ZV9jb250ZXh0KGZpbGVuYW1lKToKKyAgICAjIGV4dHJhY3RpbmcgdGhlIGFyY2hpdmUKKyAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICBsb2cud2FybignRXh0cmFjdGluZyBpbiAlcycsIHRtcGRpcikKKyAgICBvbGRfd2QgPSBvcy5nZXRjd2QoKQorICAgIHRyeToKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB3aXRoIENvbnRleHR1YWxaaXBGaWxlKGZpbGVuYW1lKSBhcyBhcmNoaXZlOgorICAgICAgICAgICAgYXJjaGl2ZS5leHRyYWN0YWxsKCkKKworICAgICAgICAjIGdvaW5nIGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgc3ViZGlyID0gb3MucGF0aC5qb2luKHRtcGRpciwgb3MubGlzdGRpcih0bXBkaXIpWzBdKQorICAgICAgICBvcy5jaGRpcihzdWJkaXIpCisgICAgICAgIGxvZy53YXJuKCdOb3cgd29ya2luZyBpbiAlcycsIHN1YmRpcikKKyAgICAgICAgeWllbGQKKworICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKG9sZF93ZCkKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0bXBkaXIpCisKKworZGVmIF9kb19kb3dubG9hZCh2ZXJzaW9uLCBkb3dubG9hZF9iYXNlLCB0b19kaXIsIGRvd25sb2FkX2RlbGF5KToKKyAgICBlZ2cgPSBvcy5wYXRoLmpvaW4odG9fZGlyLCAnc2V0dXB0b29scy0lcy1weSVkLiVkLmVnZycKKyAgICAgICAgICAgICAgICAgICAgICAgJSAodmVyc2lvbiwgc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVnZyk6CisgICAgICAgIGFyY2hpdmUgPSBkb3dubG9hZF9zZXR1cHRvb2xzKHZlcnNpb24sIGRvd25sb2FkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX2RpciwgZG93bmxvYWRfZGVsYXkpCisgICAgICAgIF9idWlsZF9lZ2coZWdnLCBhcmNoaXZlLCB0b19kaXIpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGVnZykKKworICAgICMgUmVtb3ZlIHByZXZpb3VzbHktaW1wb3J0ZWQgcGtnX3Jlc291cmNlcyBpZiBwcmVzZW50IChzZWUKKyAgICAjIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3NldHVwdG9vbHMvcHVsbC1yZXF1ZXN0LzcvIGZvciBkZXRhaWxzKS4KKyAgICBpZiAncGtnX3Jlc291cmNlcycgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgIGRlbCBzeXMubW9kdWxlc1sncGtnX3Jlc291cmNlcyddCisKKyAgICBpbXBvcnQgc2V0dXB0b29scworICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IGVnZworCisKK2RlZiB1c2Vfc2V0dXB0b29scyh2ZXJzaW9uPURFRkFVTFRfVkVSU0lPTiwgZG93bmxvYWRfYmFzZT1ERUZBVUxUX1VSTCwKKyAgICAgICAgdG9fZGlyPW9zLmN1cmRpciwgZG93bmxvYWRfZGVsYXk9MTUpOgorICAgIHRvX2RpciA9IG9zLnBhdGguYWJzcGF0aCh0b19kaXIpCisgICAgcmVwX21vZHVsZXMgPSAncGtnX3Jlc291cmNlcycsICdzZXR1cHRvb2xzJworICAgIGltcG9ydGVkID0gc2V0KHN5cy5tb2R1bGVzKS5pbnRlcnNlY3Rpb24ocmVwX21vZHVsZXMpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgcGtnX3Jlc291cmNlcworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcmV0dXJuIF9kb19kb3dubG9hZCh2ZXJzaW9uLCBkb3dubG9hZF9iYXNlLCB0b19kaXIsIGRvd25sb2FkX2RlbGF5KQorICAgIHRyeToKKyAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCJzZXR1cHRvb2xzPj0iICsgdmVyc2lvbikKKyAgICAgICAgcmV0dXJuCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uTm90Rm91bmQ6CisgICAgICAgIHJldHVybiBfZG9fZG93bmxvYWQodmVyc2lvbiwgZG93bmxvYWRfYmFzZSwgdG9fZGlyLCBkb3dubG9hZF9kZWxheSkKKyAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3QgYXMgVkNfZXJyOgorICAgICAgICBpZiBpbXBvcnRlZDoKKyAgICAgICAgICAgIG1zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgICAgICBUaGUgcmVxdWlyZWQgdmVyc2lvbiBvZiBzZXR1cHRvb2xzICg+PXt2ZXJzaW9ufSkgaXMgbm90IGF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICBhbmQgY2FuJ3QgYmUgaW5zdGFsbGVkIHdoaWxlIHRoaXMgc2NyaXB0IGlzIHJ1bm5pbmcuIFBsZWFzZQorICAgICAgICAgICAgICAgIGluc3RhbGwgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIGZpcnN0LCB1c2luZworICAgICAgICAgICAgICAgICdlYXN5X2luc3RhbGwgLVUgc2V0dXB0b29scycuCisKKyAgICAgICAgICAgICAgICAoQ3VycmVudGx5IHVzaW5nIHtWQ19lcnIuYXJnc1swXSFyfSkKKyAgICAgICAgICAgICAgICAiIiIpLmZvcm1hdChWQ19lcnI9VkNfZXJyLCB2ZXJzaW9uPXZlcnNpb24pCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZykKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICAgICAgIyBvdGhlcndpc2UsIHJlbG9hZCBvaworICAgICAgICBkZWwgcGtnX3Jlc291cmNlcywgc3lzLm1vZHVsZXNbJ3BrZ19yZXNvdXJjZXMnXQorICAgICAgICByZXR1cm4gX2RvX2Rvd25sb2FkKHZlcnNpb24sIGRvd25sb2FkX2Jhc2UsIHRvX2RpciwgZG93bmxvYWRfZGVsYXkpCisKK2RlZiBfY2xlYW5fY2hlY2soY21kLCB0YXJnZXQpOgorICAgICIiIgorICAgIFJ1biB0aGUgY29tbWFuZCB0byBkb3dubG9hZCB0YXJnZXQuIElmIHRoZSBjb21tYW5kIGZhaWxzLCBjbGVhbiB1cCBiZWZvcmUKKyAgICByZS1yYWlzaW5nIHRoZSBlcnJvci4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjbWQpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgorICAgICAgICBpZiBvcy5hY2Nlc3ModGFyZ2V0LCBvcy5GX09LKToKKyAgICAgICAgICAgIG9zLnVubGluayh0YXJnZXQpCisgICAgICAgIHJhaXNlCisKK2RlZiBkb3dubG9hZF9maWxlX3Bvd2Vyc2hlbGwodXJsLCB0YXJnZXQpOgorICAgICIiIgorICAgIERvd25sb2FkIHRoZSBmaWxlIGF0IHVybCB0byB0YXJnZXQgdXNpbmcgUG93ZXJzaGVsbCAod2hpY2ggd2lsbCB2YWxpZGF0ZQorICAgIHRydXN0KS4gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGNhbm5vdCBjb21wbGV0ZS4KKyAgICAiIiIKKyAgICB0YXJnZXQgPSBvcy5wYXRoLmFic3BhdGgodGFyZ2V0KQorICAgIHBzX2NtZCA9ICgKKyAgICAgICAgIltTeXN0ZW0uTmV0LldlYlJlcXVlc3RdOjpEZWZhdWx0V2ViUHJveHkuQ3JlZGVudGlhbHMgPSAiCisgICAgICAgICJbU3lzdGVtLk5ldC5DcmVkZW50aWFsQ2FjaGVdOjpEZWZhdWx0Q3JlZGVudGlhbHM7ICIKKyAgICAgICAgIihuZXctb2JqZWN0IFN5c3RlbS5OZXQuV2ViQ2xpZW50KS5Eb3dubG9hZEZpbGUoJSh1cmwpciwgJSh0YXJnZXQpcikiCisgICAgICAgICUgdmFycygpCisgICAgKQorICAgIGNtZCA9IFsKKyAgICAgICAgJ3Bvd2Vyc2hlbGwnLAorICAgICAgICAnLUNvbW1hbmQnLAorICAgICAgICBwc19jbWQsCisgICAgXQorICAgIF9jbGVhbl9jaGVjayhjbWQsIHRhcmdldCkKKworZGVmIGhhc19wb3dlcnNoZWxsKCk6CisgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBjbWQgPSBbJ3Bvd2Vyc2hlbGwnLCAnLUNvbW1hbmQnLCAnZWNobyB0ZXN0J10KKyAgICB3aXRoIG9wZW4ob3MucGF0aC5kZXZudWxsLCAnd2InKSBhcyBkZXZudWxsOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kLCBzdGRvdXQ9ZGV2bnVsbCwgc3RkZXJyPWRldm51bGwpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkb3dubG9hZF9maWxlX3Bvd2Vyc2hlbGwudmlhYmxlID0gaGFzX3Bvd2Vyc2hlbGwKKworZGVmIGRvd25sb2FkX2ZpbGVfY3VybCh1cmwsIHRhcmdldCk6CisgICAgY21kID0gWydjdXJsJywgdXJsLCAnLS1zaWxlbnQnLCAnLS1vdXRwdXQnLCB0YXJnZXRdCisgICAgX2NsZWFuX2NoZWNrKGNtZCwgdGFyZ2V0KQorCitkZWYgaGFzX2N1cmwoKToKKyAgICBjbWQgPSBbJ2N1cmwnLCAnLS12ZXJzaW9uJ10KKyAgICB3aXRoIG9wZW4ob3MucGF0aC5kZXZudWxsLCAnd2InKSBhcyBkZXZudWxsOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kLCBzdGRvdXQ9ZGV2bnVsbCwgc3RkZXJyPWRldm51bGwpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkb3dubG9hZF9maWxlX2N1cmwudmlhYmxlID0gaGFzX2N1cmwKKworZGVmIGRvd25sb2FkX2ZpbGVfd2dldCh1cmwsIHRhcmdldCk6CisgICAgY21kID0gWyd3Z2V0JywgdXJsLCAnLS1xdWlldCcsICctLW91dHB1dC1kb2N1bWVudCcsIHRhcmdldF0KKyAgICBfY2xlYW5fY2hlY2soY21kLCB0YXJnZXQpCisKK2RlZiBoYXNfd2dldCgpOgorICAgIGNtZCA9IFsnd2dldCcsICctLXZlcnNpb24nXQorICAgIHdpdGggb3Blbihvcy5wYXRoLmRldm51bGwsICd3YicpIGFzIGRldm51bGw6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjbWQsIHN0ZG91dD1kZXZudWxsLCBzdGRlcnI9ZGV2bnVsbCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2Rvd25sb2FkX2ZpbGVfd2dldC52aWFibGUgPSBoYXNfd2dldAorCitkZWYgZG93bmxvYWRfZmlsZV9pbnNlY3VyZSh1cmwsIHRhcmdldCk6CisgICAgIiIiCisgICAgVXNlIFB5dGhvbiB0byBkb3dubG9hZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2ggaXQgY2Fubm90IGF1dGhlbnRpY2F0ZSB0aGUKKyAgICBjb25uZWN0aW9uLgorICAgICIiIgorICAgIHNyYyA9IHVybG9wZW4odXJsKQorICAgIHRyeToKKyAgICAgICAgIyBSZWFkIGFsbCB0aGUgZGF0YSBpbiBvbmUgYmxvY2suCisgICAgICAgIGRhdGEgPSBzcmMucmVhZCgpCisgICAgZmluYWxseToKKyAgICAgICAgc3JjLmNsb3NlKCkKKworICAgICMgV3JpdGUgYWxsIHRoZSBkYXRhIGluIG9uZSBibG9jayB0byBhdm9pZCBjcmVhdGluZyBhIHBhcnRpYWwgZmlsZS4KKyAgICB3aXRoIG9wZW4odGFyZ2V0LCAid2IiKSBhcyBkc3Q6CisgICAgICAgIGRzdC53cml0ZShkYXRhKQorCitkb3dubG9hZF9maWxlX2luc2VjdXJlLnZpYWJsZSA9IGxhbWJkYTogVHJ1ZQorCitkZWYgZ2V0X2Jlc3RfZG93bmxvYWRlcigpOgorICAgIGRvd25sb2FkZXJzID0gKAorICAgICAgICBkb3dubG9hZF9maWxlX3Bvd2Vyc2hlbGwsCisgICAgICAgIGRvd25sb2FkX2ZpbGVfY3VybCwKKyAgICAgICAgZG93bmxvYWRfZmlsZV93Z2V0LAorICAgICAgICBkb3dubG9hZF9maWxlX2luc2VjdXJlLAorICAgICkKKyAgICB2aWFibGVfZG93bmxvYWRlcnMgPSAoZGwgZm9yIGRsIGluIGRvd25sb2FkZXJzIGlmIGRsLnZpYWJsZSgpKQorICAgIHJldHVybiBuZXh0KHZpYWJsZV9kb3dubG9hZGVycywgTm9uZSkKKworZGVmIGRvd25sb2FkX3NldHVwdG9vbHModmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsCisgICAgICAgIHRvX2Rpcj1vcy5jdXJkaXIsIGRlbGF5PTE1LCBkb3dubG9hZGVyX2ZhY3Rvcnk9Z2V0X2Jlc3RfZG93bmxvYWRlcik6CisgICAgIiIiCisgICAgRG93bmxvYWQgc2V0dXB0b29scyBmcm9tIGEgc3BlY2lmaWVkIGxvY2F0aW9uIGFuZCByZXR1cm4gaXRzIGZpbGVuYW1lCisKKyAgICBgdmVyc2lvbmAgc2hvdWxkIGJlIGEgdmFsaWQgc2V0dXB0b29scyB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIGF2YWlsYWJsZQorICAgIGFzIGFuIHNkaXN0IGZvciBkb3dubG9hZCB1bmRlciB0aGUgYGRvd25sb2FkX2Jhc2VgIFVSTCAod2hpY2ggc2hvdWxkIGVuZAorICAgIHdpdGggYSAnLycpLiBgdG9fZGlyYCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBlZ2cgd2lsbCBiZSBkb3dubG9hZGVkLgorICAgIGBkZWxheWAgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHBhdXNlIGJlZm9yZSBhbiBhY3R1YWwgZG93bmxvYWQKKyAgICBhdHRlbXB0LgorCisgICAgYGBkb3dubG9hZGVyX2ZhY3RvcnlgYCBzaG91bGQgYmUgYSBmdW5jdGlvbiB0YWtpbmcgbm8gYXJndW1lbnRzIGFuZAorICAgIHJldHVybmluZyBhIGZ1bmN0aW9uIGZvciBkb3dubG9hZGluZyBhIFVSTCB0byBhIHRhcmdldC4KKyAgICAiIiIKKyAgICAjIG1ha2luZyBzdXJlIHdlIHVzZSB0aGUgYWJzb2x1dGUgcGF0aAorICAgIHRvX2RpciA9IG9zLnBhdGguYWJzcGF0aCh0b19kaXIpCisgICAgemlwX25hbWUgPSAic2V0dXB0b29scy0lcy56aXAiICUgdmVyc2lvbgorICAgIHVybCA9IGRvd25sb2FkX2Jhc2UgKyB6aXBfbmFtZQorICAgIHNhdmV0byA9IG9zLnBhdGguam9pbih0b19kaXIsIHppcF9uYW1lKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzYXZldG8pOiAgIyBBdm9pZCByZXBlYXRlZCBkb3dubG9hZHMKKyAgICAgICAgbG9nLndhcm4oIkRvd25sb2FkaW5nICVzIiwgdXJsKQorICAgICAgICBkb3dubG9hZGVyID0gZG93bmxvYWRlcl9mYWN0b3J5KCkKKyAgICAgICAgZG93bmxvYWRlcih1cmwsIHNhdmV0bykKKyAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChzYXZldG8pCisKK2RlZiBfYnVpbGRfaW5zdGFsbF9hcmdzKG9wdGlvbnMpOgorICAgICIiIgorICAgIEJ1aWxkIHRoZSBhcmd1bWVudHMgdG8gJ3B5dGhvbiBzZXR1cC5weSBpbnN0YWxsJyBvbiB0aGUgc2V0dXB0b29scyBwYWNrYWdlCisgICAgIiIiCisgICAgcmV0dXJuIFsnLS11c2VyJ10gaWYgb3B0aW9ucy51c2VyX2luc3RhbGwgZWxzZSBbXQorCitkZWYgX3BhcnNlX2FyZ3MoKToKKyAgICAiIiIKKyAgICBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zCisgICAgIiIiCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgJy0tdXNlcicsIGRlc3Q9J3VzZXJfaW5zdGFsbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgIGhlbHA9J2luc3RhbGwgaW4gdXNlciBzaXRlIHBhY2thZ2UgKHJlcXVpcmVzIFB5dGhvbiAyLjYgb3IgbGF0ZXIpJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgJy0tZG93bmxvYWQtYmFzZScsIGRlc3Q9J2Rvd25sb2FkX2Jhc2UnLCBtZXRhdmFyPSJVUkwiLAorICAgICAgICBkZWZhdWx0PURFRkFVTFRfVVJMLAorICAgICAgICBoZWxwPSdhbHRlcm5hdGl2ZSBVUkwgZnJvbSB3aGVyZSB0byBkb3dubG9hZCB0aGUgc2V0dXB0b29scyBwYWNrYWdlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgJy0taW5zZWN1cmUnLCBkZXN0PSdkb3dubG9hZGVyX2ZhY3RvcnknLCBhY3Rpb249J3N0b3JlX2NvbnN0JywKKyAgICAgICAgY29uc3Q9bGFtYmRhOiBkb3dubG9hZF9maWxlX2luc2VjdXJlLCBkZWZhdWx0PWdldF9iZXN0X2Rvd25sb2FkZXIsCisgICAgICAgIGhlbHA9J1VzZSBpbnRlcm5hbCwgbm9uLXZhbGlkYXRpbmcgZG93bmxvYWRlcicKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICctLXZlcnNpb24nLCBoZWxwPSJTcGVjaWZ5IHdoaWNoIHZlcnNpb24gdG8gZG93bmxvYWQiLAorICAgICAgICBkZWZhdWx0PURFRkFVTFRfVkVSU0lPTiwKKyAgICApCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICAjIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSBpZ25vcmVkCisgICAgcmV0dXJuIG9wdGlvbnMKKworZGVmIG1haW4oKToKKyAgICAiIiJJbnN0YWxsIG9yIHVwZ3JhZGUgc2V0dXB0b29scyBhbmQgRWFzeUluc3RhbGwiIiIKKyAgICBvcHRpb25zID0gX3BhcnNlX2FyZ3MoKQorICAgIGFyY2hpdmUgPSBkb3dubG9hZF9zZXR1cHRvb2xzKAorICAgICAgICB2ZXJzaW9uPW9wdGlvbnMudmVyc2lvbiwKKyAgICAgICAgZG93bmxvYWRfYmFzZT1vcHRpb25zLmRvd25sb2FkX2Jhc2UsCisgICAgICAgIGRvd25sb2FkZXJfZmFjdG9yeT1vcHRpb25zLmRvd25sb2FkZXJfZmFjdG9yeSwKKyAgICApCisgICAgcmV0dXJuIF9pbnN0YWxsKGFyY2hpdmUsIF9idWlsZF9pbnN0YWxsX2FyZ3Mob3B0aW9ucykpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L29vZHQvX19pbml0X18ucHkgYi8wLjEwL2FnaWxpdHkvb29kdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M5MWZhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L29vZHQvX19pbml0X18ucHkKQEAgLTAsMCArMSwyNyBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnQWdpbGUgT2JqZWN0IE9yaWVudGVkIERhdGEgVGVjaG5vbG9neSAoT09EVCkuCisKK09PRFQgaXMgYSBzZXQgb2Ygc29mdHdhcmUgY29tcG9uZW50cyB0aGF0IHBlcm1pdCB0aGUgZGlzY292ZXJ5LCBjb3JyZWxhdGlvbiwKK3NlYXJjaCwgYW5kIHJldHJpZXZhbCBvZiBkYXRhIGFuZCBtZXRhZGF0YS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCitPT0RUIHdlYiBzaXRlXy4KKworLi4gX3NpdGU6IGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvCisnJycKKworX19kb2Nmb3JtYXRfXyA9ICdyZXN0cnVjdHVyZWR0ZXh0JwpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L29vZHQvb29kdGVycm9ycy5weSBiLzAuMTAvYWdpbGl0eS9vb2R0L29vZHRlcnJvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlZTk5OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYWdpbGl0eS9vb2R0L29vZHRlcnJvcnMucHkKQEAgLTAsMCArMSwyNiBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnT2JqZWN0IE9yaWVudGVkIERhdGEgVGVjaG5vbG9neSBleGNlcHRpb25zLgorJycnCisKK19fZG9jZm9ybWF0X18gPSAncmVzdHJ1Y3R1cmVkdGV4dCcKKworY2xhc3MgT09EVEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICcnJ0NvbW1vbiBPT0RUIGV4Y2VwdGlvbiBiYXNlLgorICAgICcnJworICAgIHBhc3MKZGlmZiAtLWdpdCBhLzAuMTAvYWdpbGl0eS9vb2R0L3Byb2ZpbGUucHkgYi8wLjEwL2FnaWxpdHkvb29kdC9wcm9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmY5OWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvb29kdC9wcm9maWxlLnB5CkBAIC0wLDAgKzEsNTAyIEBACisjIGVuY29kaW5nOiB1dGYtOAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisnJydQcm9maWxlcy4gIEEgcHJvZmlsZSBpcyBhIG1ldGFkYXRhIGRlc2NyaXB0aW9uIG9mIGEgcmVzb3VyY2UuCisKK1Byb2ZpbGVzIGNhcHR1cmU6CisKKyogSW5jZXB0aW9uIG1ldGFkYXRhLiAgVGhpcyBpbmNsdWRlcyBpdGVtcyBzdWNoIGFzIGEgcmVzb3VjZSdzIHRpdGxlLAorICBkZXNjcmlwdGlvbiwgY3JlYXRvcnMsIGNvbnRyaWJ1dG9ycywgcHVibGlzaGVycywgbGFuZ3VhZ2UsIGFuZCBzbyBvbi4gIFRoaXMKKyAgc2V0IG9mIG1ldGRhdGEgaXMgYmFzZWQgb24gdGhlIER1YmxpbiBDb3JlLiAgQ2xhc3MgYFJlc291cmNlQXR0cmlidXRlc2AKKyAgY2FwdHVyZXMgdGhpcyBtZXRhZGF0YS4KKworKiBDb21wb3NpdGlvbiBtZXRhZGF0YS4gIFRoaXMgaW5jbHVkZXMgZGF0YSBlbGVtZW50cyB0aGF0IGRlc2NyaWJlIHdoYXQKKyAgdGhlIHJlc291cmNlIGNvbnRhaW5zLCBzdWNoIGFzIHJhbmdlcyBvZiBkYXRhIHZhbHVlcyAoaGlnaCBhbmQgbG93CisgIHRlbXBlcmF0dXJlLCBsYXRpdHVkZS9sb25naXR1ZGUpIG9yIGVudW1lcmF0ZWQgZGF0YSB2YWx1ZXMgKHpvbmluZyBjb2RlLAorICBnZW51cy9zcGVjaWVzLCBldGMuKS4gIFN1YmNsYXNzZXMgb2YgYFByb2ZpbGVFbGVtZW50YCBjYXB0dXJlcyB0aGlzCisgIG1ldGFkYXRhLgorCisqIFByb2ZpbGUgbWV0YWRhdGEuICBUaGlzIGlzIG1ldGFkYXRhIGRlc2NyaWJpbmcgdGhlIHByb2ZpbGUgaXRzZWxmLCBzdWNoCisgIGFzIHJldmlzaW9uIG5vdGVzLCBJRCBudW1iZXIsIGV0Yy4gIENsYXNzIGBQcm9maWxlQXR0cmlidXRlc2AgY2FwdHVyZXMgdGhpcworICBtZXRhZGF0YS4KKworT2JqZWN0cyBvZiB0aGVzZSBjbGFzc2VzIGFyZSB1bmlmaWVkIGludG8gYSBzaW5nbGUgYFByb2ZpbGVgIG9iamVjdC4KKycnJworCitfX2RvY2Zvcm1hdF9fID0gJ3Jlc3RydWN0dXJlZHRleHQnCisKK2ltcG9ydCB4bWx1dGlscworaW1wb3J0IHhtbC5kb20KK2Zyb20geG1sdXRpbHMgaW1wb3J0IERvY3VtZW50YWJsZUZpZWxkCisKK2NsYXNzIFByb2ZpbGVBdHRyaWJ1dGVzKHhtbHV0aWxzLkRvY3VtZW50YWJsZSk6CisgICAgJycnQXR0cmlidXRlcyBvZiBhIHByb2ZpbGUuICBUaGVzZSBhcmUgYXR0cmlidXRlcyBub3QgcmVsYXRlZCB0byB0aGUKKyAgICByZXNvdXJjZSB0aGF0IGEgcHJvZmlsZSBwcm9maWxlcywgYnV0IHJhdGhlciB0aGUgcHJvZmlsZSBpdHNlbGYuICBJbgorICAgIG1vc3QgY2FzZXMsIHNpbXBseSBjb25zdHJ1Y3RpbmcgdGhpcyBvYmplY3Qgd2l0aCBubyBpbml0aWFsaXplcgorICAgIGFyZ3VtZW50cyB3aWxsIHN1ZmZpY2UuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlkPSdVTktOT1dOJywgdmVyc2lvbj0nMS4wLjAnLCB0eXBlPSdwcm9maWxlJywgc3RhdHVzSUQ9J2FjdGl2ZScsIHNlY3VyaXR5VHlwZT0ndW5jbGFzc2lmaWVkJywKKyAgICAgICAgcGFyZW50SUQ9J1VOS05PV04nLCBjaGlsZElEcz1Ob25lLCByZWdBdXRob3JpdHk9J1VOS05PV04nLCByZXZOb3Rlcz1Ob25lLCBub2RlPU5vbmUpOgorICAgICAgICAnJydJbml0aWFsaXplIHByb2ZpbGUgYXR0cmlidXRlcy4KKyAgICAgICAgCisgICAgICAgIC0gYGlkYCB1bmlxdWUgSUQgZm9yIHRoZSBwcm9maWxlCisgICAgICAgIC0gYHZlcnNpb25gIG51bWJlcgorICAgICAgICAtIGB0eXBlYCBzaG91bGQgYWx3YXlzIGJlIHRoZSBzdHJpbmcgInByb2ZpbGUiCisgICAgICAgIC0gYHN0YXR1c0lEYCBzaG91bGQgYWx3YXlzIGJlIHRoZSBzdHJpbmcgImFjdGl2ZSIKKyAgICAgICAgLSBgc2VjdXJpdHlUeXBlYCB0ZWxscyB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIHNlY3JldAorICAgICAgICAtIGBwYXJlbnRJRGAgZ2l2ZXMgdGhlIHVuaXF1ZSBJRCBmb3IgYW55ICJwYXJlbnQiIHByb2ZpbGUKKyAgICAgICAgLSBgY2hpbGRJRHNgIHNob3VsZCBiZSBhIHNlcXVuZWNlIG9mIGFueSAiY2hpbGRyZW4iIHByb2ZpbGVzCisgICAgICAgIC0gYHJlZ0F1dGhvcml0eWAgaXMgYSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlZ2lzdHJhdGlvbgorICAgICAgICAgICBhdXRob3JpdHkgcmVzcG9uc2libGUgZm9yIHRoZSBwcm9maWxlCisgICAgICAgIC0gYHJldk5vdGVzYCBpcyBhIHNlcXVlbmNlIG9mIGNvbW1lbnRzIGRldGFpbGluZyBoaXN0b3JpY2FsCisgICAgICAgICAgIGNoYW5nZXMgdG8gdGhlIHByb2ZpbGUKKyAgICAgICAgLSBgbm9kZWAgaXMgYW4gWE1MIERPTSBub2RlLiAgSWYgdGhlIGBub2RlYCBhcmd1bWVudCBpcyBnaXZlbiwKKyAgICAgICAgICAgaXQncyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdC4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuaWQgPSBpZAorICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5zdGF0dXNJRCA9IHN0YXR1c0lECisgICAgICAgIHNlbGYuc2VjdXJpdHlUeXBlID0gc2VjdXJpdHlUeXBlCisgICAgICAgIHNlbGYucGFyZW50SUQgPSBwYXJlbnRJRAorICAgICAgICBzZWxmLmNoaWxkSURzID0gY2hpbGRJRHMKKyAgICAgICAgc2VsZi5yZWdBdXRob3JpdHkgPSByZWdBdXRob3JpdHkKKyAgICAgICAgc2VsZi5yZXZOb3RlcyA9IHJldk5vdGVzCisgICAgICAgIGlmIHNlbGYuY2hpbGRJRHMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2hpbGRJRHMgPSBbXQorICAgICAgICBpZiBzZWxmLnJldk5vdGVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJldk5vdGVzID0gW10KKyAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucGFyc2Uobm9kZSkKKyAgICAKKyAgICBkZWYgZ2V0RG9jdW1lbnRFbGVtZW50TmFtZShzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSBYTUwgdGFnIGZvciBvYmplY3RzIG9mIHRoaXMgY2xhc3M6IGBwcm9mQXR0cmlidXRlc2AuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gJ3Byb2ZBdHRyaWJ1dGVzJworICAgIAorICAgIGRlZiBnZXREb2N1bWVudGFibGVGaWVsZHMoc2VsZik6CisgICAgICAgICcnJ0dldCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBwdXQgaW50byBYTUwuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gKERvY3VtZW50YWJsZUZpZWxkKCdpZCcsIHUncHJvZklkJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3ZlcnNpb24nLCB1J3Byb2ZWZXJzaW9uJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3R5cGUnLCB1J3Byb2ZUeXBlJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3N0YXR1c0lEJywgdSdwcm9mU3RhdHVzSWQnLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnc2VjdXJpdHlUeXBlJywgdSdwcm9mU2VjdXJpdHlUeXBlJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3BhcmVudElEJywgdSdwcm9mUGFyZW50SWQnLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnY2hpbGRJRHMnLCB1J3Byb2ZDaGlsZElkJywgRG9jdW1lbnRhYmxlRmllbGQuTVVMVElfVkFMVUVEX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3JlZ0F1dGhvcml0eScsIHUncHJvZlJlZ0F1dGhvcml0eScsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdyZXZOb3RlcycsIHUncHJvZlJldmlzaW9uTm90ZScsIERvY3VtZW50YWJsZUZpZWxkLk1VTFRJX1ZBTFVFRF9LSU5EKSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgnUHJvZmlsZUF0dHJpYnV0ZXMoaWQ9JXMsdmVyc2lvbj0lcyx0eXBlPSVzLHN0YXR1c0lEPSVzLHNlY3VyaXR5VHlwZT0lcyxwYXJlbnRJRD0lcyxjaGlsZElEcz0lcywnIFwKKyAgICAgICAgICAgICdyZWdBdXRob3JpdHk9JXMscmV2Tm90ZXM9JXMpJykgJSAoc2VsZi5pZCwgc2VsZi52ZXJzaW9uLCBzZWxmLnR5cGUsIHNlbGYuc3RhdHVzSUQsIHNlbGYuc2VjdXJpdHlUeXBlLAorICAgICAgICAgICAgc2VsZi5wYXJlbnRJRCwgc2VsZi5jaGlsZElEcywgc2VsZi5yZWdBdXRob3JpdHksIHNlbGYucmV2Tm90ZXMpCisgICAgICAgICAgICAKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBjbXAoc2VsZi5pZCwgb3RoZXIuaWQpCisgICAgCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmlkKQorICAgIAorCitjbGFzcyBSZXNvdXJjZUF0dHJpYnV0ZXMoeG1sdXRpbHMuRG9jdW1lbnRhYmxlKToKKyAgICAnJydBdHRyaWJ1dGVzIG9mIHRoZSByZXNvdXJjZS4gIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBjb2xsZWN0IGRhdGEgYWJvdXQgdGhlIHJlc291cmNlJ3MKKyAgICBpbmNlcHRpb24gYW5kIGFyZSBiYXNlZCBvbiBEdWJsaW4gQ29yZS4KKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaWRlbnRpZmllcj0nVU5LTk9XTicsIHRpdGxlPSdVTktOT1dOJywgZm9ybWF0cz1Ob25lLCBkZXNjcmlwdGlvbj0nVU5LTk9XTicsIGNyZWF0b3JzPU5vbmUsIHN1YmplY3RzPU5vbmUsCisgICAgICAgIHB1Ymxpc2hlcnM9Tm9uZSwgY29udHJpYnV0b3JzPU5vbmUsIGRhdGVzPU5vbmUsIHR5cGVzPU5vbmUsIHNvdXJjZXM9Tm9uZSwgbGFuZ3VhZ2VzPU5vbmUsIHJlbGF0aW9ucz1Ob25lLAorICAgICAgICBjb3ZlcmFnZXM9Tm9uZSwgcmlnaHRzPU5vbmUsIGNvbnRleHRzPU5vbmUsIGFnZ3JlZ2F0aW9uPSdVTktOT1dOJywgcmVzQ2xhc3M9J1VOS05PV04nLCBsb2NhdGlvbnM9Tm9uZSwgbm9kZT1Ob25lKToKKyAgICAgICAgJycnSW5pdGlhbGl6ZSBSZXNvdXJjZUF0dHJpYnV0ZXMuCisgICAgICAgIAorICAgICAgICBUaGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQ6CisgICAgICAgIAorICAgICAgICAtIGBpZGVudGlmaWVyYCBpcyBhIFVSSSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGUgcmVzb3VyY2UKKyAgICAgICAgLSBgdGl0bGVgIG5hbWVzIHRoZSByZXNvdXJjZQorICAgICAgICAtIGBkZXNjcmlwdGlvbmAgZ2l2ZXMgYSBzdW1tYXJ5IG9yIGFic3RyYWN0IG9mIGl0CisgICAgICAgIC0gYGFnZ3JlZ2F0aW9uYCB0ZWxscyB0aGUgZ3Jvc3Mgc3RydWN0dXJlIG9mIHRoZSByZXNvdXJjZSBhbmQKKyAgICAgICAgICAgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgICAgICAgIC0gZGF0YS5ncmFudWxlCisgICAgICAgICAgICAtIGRhdGEuZGF0YVNldAorICAgICAgICAgICAgLSBkYXRhLmRhdGFTZXRDb2xsZWN0aW9uCisgICAgICAgIC0gYHJlc0NsYXNzYCBnaXZlcyB0aGUga2luZCBvZiB0aGUgcmVzb3VyY2UgKHdoYXQgdG8gZXhwZWN0CisgICAgICAgICAgIHdoZW4gY29ubmVjdGluZyB0byBvbmUgb2YgaXRzIGxvY2F0aW9ucykKKyAgICAgICAgCisgICAgICAgIEFsbCBvZiB0aGUgb3RoZXJzIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHNlcXVlbmNlcyBhcyB0aGUKKyAgICAgICAgcmVzb3VyY2UgYXR0cmlidXRlcyBmb2xsb3dzIHRoZSBEdWJsaW4gQ29yZSByZWNvbW1lbmRhdGlvbiBvbgorICAgICAgICBtdWx0aXBsaWNpdHkuCisgICAgICAgIAorICAgICAgICBJZiBgbm9kZWAgaXMgZ2l2ZW4sIGl0J3MgdHJlYXRlZCBhcyBhbiBYTUwgRE9NIG5vZGUgYW5kIGlzIHVzZWQgdG8KKyAgICAgICAgaW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgYXR0cmlidXRlcy4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisgICAgICAgIHNlbGYuZm9ybWF0cyA9IGZvcm1hdHMKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisgICAgICAgIHNlbGYuY3JlYXRvcnMgPSBjcmVhdG9ycworICAgICAgICBzZWxmLnN1YmplY3RzID0gc3ViamVjdHMKKyAgICAgICAgc2VsZi5wdWJsaXNoZXJzID0gcHVibGlzaGVycworICAgICAgICBzZWxmLmNvbnRyaWJ1dG9ycyA9IGNvbnRyaWJ1dG9ycworICAgICAgICBzZWxmLmRhdGVzID0gZGF0ZXMKKyAgICAgICAgc2VsZi50eXBlcyA9IHR5cGVzCisgICAgICAgIHNlbGYuc291cmNlcyA9IHNvdXJjZXMKKyAgICAgICAgc2VsZi5sYW5ndWFnZXMgPSBsYW5ndWFnZXMKKyAgICAgICAgc2VsZi5yZWxhdGlvbnMgPSByZWxhdGlvbnMKKyAgICAgICAgc2VsZi5jb3ZlcmFnZXMgPSBjb3ZlcmFnZXMKKyAgICAgICAgc2VsZi5yaWdodHMgPSByaWdodHMKKyAgICAgICAgc2VsZi5jb250ZXh0cyA9IGNvbnRleHRzCisgICAgICAgIHNlbGYuYWdncmVnYXRpb24gPSBhZ2dyZWdhdGlvbgorICAgICAgICBzZWxmLnJlc0NsYXNzID0gcmVzQ2xhc3MKKyAgICAgICAgc2VsZi5sb2NhdGlvbnMgPSBsb2NhdGlvbnMKKyAgICAgICAgZm9yIGF0dHIgaW4gKCdmb3JtYXRzJywgJ2NyZWF0b3JzJywgJ3N1YmplY3RzJywgJ3B1Ymxpc2hlcnMnLCAnY29udHJpYnV0b3JzJywgJ2RhdGVzJywgJ3NvdXJjZXMnLCAnbGFuZ3VhZ2VzJywKKyAgICAgICAgICAgICdyZWxhdGlvbnMnLCAnY292ZXJhZ2VzJywgJ3JpZ2h0cycsICdjb250ZXh0cycsICdsb2NhdGlvbnMnLCAndHlwZXMnKToKKyAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0cikgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIFtdKQorICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJzZShub2RlKQorICAgIAorICAgIGRlZiBnZXREb2N1bWVudEVsZW1lbnROYW1lKHNlbGYpOgorICAgICAgICAnJydHaXZlIHRoZSBYTUwgdGFnIG5hbWU6IGByZXNBdHRyaWJ1dGVzYC4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiAncmVzQXR0cmlidXRlcycKKyAgICAgICAgCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmlkZW50aWZpZXIpCisgICAgCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYuaWRlbnRpZmllciwgb3RoZXIuaWRlbnRpZmllcikKKyAgICAKKyAgICBkZWYgZ2V0RG9jdW1lbnRhYmxlRmllbGRzKHNlbGYpOgorICAgICAgICAnJydHZXQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBnbyBpbnRvIFhNTC4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiAoRG9jdW1lbnRhYmxlRmllbGQoJ2lkZW50aWZpZXInLCB1J0lkZW50aWZpZXInLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgndGl0bGUnLCB1J1RpdGxlJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ2Zvcm1hdHMnLCB1J0Zvcm1hdCcsIERvY3VtZW50YWJsZUZpZWxkLk1VTFRJX1ZBTFVFRF9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdkZXNjcmlwdGlvbicsIHUnRGVzY3JpcHRpb24nLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnY3JlYXRvcnMnLCB1J0NyZWF0b3InLCBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnc3ViamVjdHMnLCB1J1N1YmplY3QnLCBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgncHVibGlzaGVycycsIHUnUHVibGlzaGVyJywgRG9jdW1lbnRhYmxlRmllbGQuTVVMVElfVkFMVUVEX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ2NvbnRyaWJ1dG9ycycsIHUnQ29udHJpYnV0b3InLCBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnZGF0ZXMnLCB1J0RhdGUnLCBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgndHlwZXMnLCB1J1R5cGUnLCBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnc291cmNlcycsIHUnU291cmNlJywgRG9jdW1lbnRhYmxlRmllbGQuTVVMVElfVkFMVUVEX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ2xhbmd1YWdlcycsIHUnTGFuZ3VhZ2UnLCBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgncmVsYXRpb25zJywgdSdSZWxhdGlvbicsIERvY3VtZW50YWJsZUZpZWxkLk1VTFRJX1ZBTFVFRF9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdjb3ZlcmFnZXMnLCB1J0NvdmVyYWdlJywgRG9jdW1lbnRhYmxlRmllbGQuTVVMVElfVkFMVUVEX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3JpZ2h0cycsIHUnUmlnaHRzJywgRG9jdW1lbnRhYmxlRmllbGQuTVVMVElfVkFMVUVEX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ2NvbnRleHRzJywgdSdyZXNDb250ZXh0JywgRG9jdW1lbnRhYmxlRmllbGQuTVVMVElfVkFMVUVEX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ2FnZ3JlZ2F0aW9uJywgdSdyZXNBZ2dyZWdhdGlvbicsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdyZXNDbGFzcycsIHUncmVzQ2xhc3MnLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgnbG9jYXRpb25zJywgdSdyZXNMb2NhdGlvbicsIERvY3VtZW50YWJsZUZpZWxkLk1VTFRJX1ZBTFVFRF9LSU5EKSkKKyAgICAKKworY2xhc3MgUHJvZmlsZShvYmplY3QpOgorICAgICcnJ0EgcHJvZmlsZSAicHJvZmlsZXMiIGEgcmVzb3VyY2UgYnkgZGVzY3JpYmluZyBpdCB3aXRoIG1ldGFkYXRhLgorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9mQXR0cj1Ob25lLCByZXNBdHRyPU5vbmUsIHByb2ZFbGVtZW50cz1Ob25lLCBub2RlPU5vbmUpOgorICAgICAgICAnJydJbml0aWFsaXplIGEgcHJvZmlsZS4gIFRoZSBwcm9mRWxlbWVudHMgc2hvdWxkIGJlIGEgZGljaXRvbmFyeSB0aGF0IG1hcHMKKyAgICAgICAgZnJvbSBlbGVtZW50IG5hbWUgdG8gaW5zdGFuY2Ugb2YgYSBgUHJvZmlsZUVsZW1lbnRgLgorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5wcm9mQXR0ciwgc2VsZi5yZXNBdHRyLCBzZWxmLnByb2ZFbGVtZW50cyA9IHByb2ZBdHRyLCByZXNBdHRyLCBwcm9mRWxlbWVudHMKKyAgICAgICAgaWYgc2VsZi5wcm9mQXR0ciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wcm9mQXR0ciA9IFByb2ZpbGVBdHRyaWJ1dGVzKCkKKyAgICAgICAgaWYgc2VsZi5yZXNBdHRyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlc0F0dHIgPSBSZXNvdXJjZUF0dHJpYnV0ZXMoKQorICAgICAgICBpZiBzZWxmLnByb2ZFbGVtZW50cyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wcm9mRWxlbWVudHMgPSB7fQorICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJzZShub2RlKQorICAgIAorICAgIGRlZiBwYXJzZShzZWxmLCBub2RlKToKKyAgICAgICAgJycnSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBYTUwgRE9NIGBub2RlYC4KKyAgICAgICAgJycnCisgICAgICAgIGlmIG5vZGUubm9kZU5hbWUgIT0gJ3Byb2ZpbGUnOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRXhwZWN0ZWQgcHJvZmlsZSBlbGVtZW50IGJ1dCBnb3QgIiVzIicgJSBub2RlLm5vZGVOYW1lKQorICAgICAgICBmb3IgY2hpbGQgaW4gZmlsdGVyKGxhbWJkYSBub2RlOiBub2RlLm5vZGVUeXBlID09IHhtbC5kb20uTm9kZS5FTEVNRU5UX05PREUsIG5vZGUuY2hpbGROb2Rlcyk6CisgICAgICAgICAgICBuYW1lID0gY2hpbGQubm9kZU5hbWUKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gdSdwcm9mQXR0cmlidXRlcyc6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9mQXR0ciA9IFByb2ZpbGVBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICBzZWxmLnByb2ZBdHRyLnBhcnNlKGNoaWxkKQorICAgICAgICAgICAgZWxpZiBuYW1lID09IHUncmVzQXR0cmlidXRlcyc6CisgICAgICAgICAgICAgICAgc2VsZi5yZXNBdHRyID0gUmVzb3VyY2VBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICBzZWxmLnJlc0F0dHIucGFyc2UoY2hpbGQpCisgICAgICAgICAgICBlbGlmIG5hbWUgPT0gdSdwcm9mRWxlbWVudCc6CisgICAgICAgICAgICAgICAgZWxlbSA9IF9wYXJzZVByb2ZpbGVFbGVtZW50KGNoaWxkKQorICAgICAgICAgICAgICAgIHNlbGYucHJvZkVsZW1lbnRzW2VsZW0ubmFtZV0gPSBlbGVtCisgICAgICAgICAgICAgICAgCisgICAgZGVmIHRvWE1MKHNlbGYsIG93bmVyKToKKyAgICAgICAgJycnQ29udmVydCB0aGlzIG9iamVjdCBpbnRvIFhNTCBvd25lZCBieSB0aGUgZ2l2ZW4gYG93bmVyYCBkb2N1bWVudC4KKyAgICAgICAgJycnCisgICAgICAgIHJvb3QgPSBvd25lci5jcmVhdGVFbGVtZW50KHUncHJvZmlsZScpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoc2VsZi5wcm9mQXR0ci50b1hNTChvd25lcikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoc2VsZi5yZXNBdHRyLnRvWE1MKG93bmVyKSkKKyAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5wcm9mRWxlbWVudHMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChlbGVtLnRvWE1MKG93bmVyKSkKKyAgICAgICAgcmV0dXJuIHJvb3QKKyAgICAKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHByb2ZBdHRyID0gY21wKHNlbGYucHJvZkF0dHIsIG90aGVyLnByb2ZBdHRyKQorICAgICAgICBpZiBwcm9mQXR0ciA8IDA6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBwcm9mQXR0ciA9PSAwOgorICAgICAgICAgICAgcmVzQXR0ciA9IGNtcChzZWxmLnJlc0F0dHIsIG90aGVyLnJlc0F0dHIpCisgICAgICAgICAgICBpZiByZXNBdHRyIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsaWYgcmVzQXR0ciA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5wcm9mRWxlbWVudHMsIG90aGVyLnByb2ZFbGVtZW50cykKKyAgICAgICAgcmV0dXJuIDEKKyAgICAKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYucHJvZkF0dHIpIF4gaGFzaChzZWxmLnJlc0F0dHIpCisgICAgCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ1Byb2ZpbGUocHJvZkF0dHI9JXMscmVzQXR0cj0lcyxwcm9mRWxlbWVudHM9JXMpJyAlIChzZWxmLnByb2ZBdHRyLCBzZWxmLnJlc0F0dHIsIHNlbGYucHJvZkVsZW1lbnRzKQorICAgIAorCitjbGFzcyBQcm9maWxlRWxlbWVudChvYmplY3QpOgorICAgICcnJ0Fic3RyYWN0IHByb2ZpbGUgZWxlbWVudC4KKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGVzY3JpcHRpb24sIHR5cGUsIHVuaXRzLCBzeW5vbnltcywgY29tbWVudCk6CisgICAgICAgICcnJ0luaXRpYWxpemUgcHJvZmlsZSBlbGVtZW50LgorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLnVuaXRzID0gdW5pdHMKKyAgICAgICAgc2VsZi5zeW5vbnltcyA9IHN5bm9ueW1zCisgICAgICAgIHNlbGYuY29tbWVudCA9IGNvbW1lbnQKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnUHJvZmlsZUVsZW1lbnQobmFtZT0lcixkZXNjcmlwdGlvbj0lcix0eXBlPSVyLHVuaXRzPSVyLHN5bm9ueW1zPSVyLGNvbW1lbnQ9JXIpJyAlIChzZWxmLm5hbWUsCisgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLnR5cGUsIHNlbGYudW5pdHMsIHNlbGYuc3lub255bXMsIHNlbGYuY29tbWVudCkKKyAgICAKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJjID0gY21wKHNlbGYubmFtZSwgb3RoZXIubmFtZSkKKyAgICAgICAgaWYgcmMgPCAwOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGVsaWYgcmMgPT0gMDoKKyAgICAgICAgICAgIHJjID0gY21wKHNlbGYuZGVzY3JpcHRpb24sIG90aGVyLmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgaWYgcmMgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxpZiByYyA9PSAwOgorICAgICAgICAgICAgICAgIHJjID0gY21wKHNlbGYudHlwZSwgb3RoZXIudHlwZSkKKyAgICAgICAgICAgICAgICBpZiByYyA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIGVsaWYgcmMgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBjbXAoc2VsZi51bml0cywgb3RoZXIudW5pdHMpCisgICAgICAgICAgICAgICAgICAgIGlmIHJjIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgICAgICBlbGlmIHJjID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGNtcChzZWxmLnN5bm9ueW1zLCBvdGhlci5zeW5vbnltcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJjIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcmMgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuY29tbWVudCwgb3RoZXIuY29tbWVudCkKKyAgICAgICAgcmV0dXJuIDEKKyAgICAKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiByZWR1Y2UobGFtYmRhIHgsIHk6IGhhc2goeCkgXiBoYXNoKHkpLCBbZ2V0YXR0cihzZWxmLCBhdHRyKSBmb3IgYXR0ciBpbiAoJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAndHlwZScsCisgICAgICAgICAgICAndW5pdHMnLCAnc3lub255bXMnLCAnY29tbWVudCcpXSkKKyAgICAKKyAgICBkZWYgaXNFbnVtZXJhdGVkKHNlbGYpOgorICAgICAgICAnJydJcyB0aGlzIGFuIGVudW1lcmF0ZWQgZWxlbWVudD8gIEVudW1lcmF0ZWQgZWxlbWVudHMgaW5jbHVkZSB0aG9zZSB3aXRoCisgICAgICAgIGRpc2NyZXRlIHZhbHVlcyBhcyB3ZWxsIHVuc3BlY2lmaWVkIGVsZW1lbnRzLgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIEZhbHNlOworICAgIAorICAgIGRlZiBnZXRWYWx1ZXMoc2VsZik6CisgICAgICAgICcnJ0dldCB0aGUgZGlzY3JldGUgdmFsdWVzIG9mIHRoaXMgZWxlbWVudCwgd2hpY2ggbWF5IGJlIGVtcHR5LgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIFtdCisgICAgCisgICAgZGVmIGdldE1pblZhbHVlKHNlbGYpOgorICAgICAgICAnJydHZXQgdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhpcyBlbGVtZW50LCB3aGljaCBtYXkgYmUgemVyby4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiAwLjAKKyAgICAKKyAgICBkZWYgZ2V0TWF4VmFsdWUoc2VsZik6CisgICAgICAgICcnJ0dldCB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIHdoaWNoIG1heSBiZSB6ZXJvLgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIDAuMAorICAgIAorICAgIGRlZiB0b1hNTChzZWxmLCBvd25lcik6CisgICAgICAgICcnJ0NvbnZlcnQgdGhpcyBvYmplY3QgaW50byBYTUwgb3duZWQgYnkgdGhlIGdpdmVuIGBvd25lcmAgZG9jdW1lbnQuCisgICAgICAgICcnJworICAgICAgICByb290ID0gb3duZXIuY3JlYXRlRWxlbWVudCgncHJvZkVsZW1lbnQnKQorICAgICAgICB4bWx1dGlscy5hZGQocm9vdCwgdSdlbGVtSWQnLCBzZWxmLm5hbWUpCisgICAgICAgIHhtbHV0aWxzLmFkZChyb290LCB1J2VsZW1OYW1lJywgc2VsZi5uYW1lKQorICAgICAgICB4bWx1dGlscy5hZGQocm9vdCwgdSdlbGVtRGVzYycsIHNlbGYuZGVzY3JpcHRpb24pCisgICAgICAgIHhtbHV0aWxzLmFkZChyb290LCB1J2VsZW1UeXBlJywgc2VsZi50eXBlKQorICAgICAgICB4bWx1dGlscy5hZGQocm9vdCwgdSdlbGVtVW5pdCcsIHNlbGYudW5pdHMpCisgICAgICAgIGlmIHNlbGYuaXNFbnVtZXJhdGVkKCk6CisgICAgICAgICAgICBmbGFnID0gJ1QnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFnID0gJ0YnCisgICAgICAgIHhtbHV0aWxzLmFkZChyb290LCB1J2VsZW1FbnVtRmxhZycsIGZsYWcpCisgICAgICAgIGZvciB2YWx1ZSBpbiBzZWxmLmdldFZhbHVlcygpOgorICAgICAgICAgICAgZWxlbSA9IG93bmVyLmNyZWF0ZUVsZW1lbnQoJ2VsZW1WYWx1ZScpCisgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGVsZW0pCisgICAgICAgICAgICBlbGVtLmFwcGVuZENoaWxkKG93bmVyLmNyZWF0ZUNEQVRBU2VjdGlvbih2YWx1ZSkpCisgICAgICAgIGlmIG5vdCBzZWxmLmlzRW51bWVyYXRlZCgpOgorICAgICAgICAgICAgeG1sdXRpbHMuYWRkKHJvb3QsIHUnZWxlbU1pblZhbHVlJywgc3RyKHNlbGYuZ2V0TWluVmFsdWUoKSkpCisgICAgICAgICAgICB4bWx1dGlscy5hZGQocm9vdCwgdSdlbGVtTWF4VmFsdWUnLCBzdHIoc2VsZi5nZXRNYXhWYWx1ZSgpKSkKKyAgICAgICAgeG1sdXRpbHMuYWRkKHJvb3QsIHUnZWxlbVN5bm9ueW0nLCBzZWxmLnN5bm9ueW1zKQorICAgICAgICB4bWx1dGlscy5hZGQocm9vdCwgdSdlbGVtQ29tbWVudCcsIHNlbGYuY29tbWVudCkKKyAgICAgICAgcmV0dXJuIHJvb3QKKyAgICAKKworY2xhc3MgVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudChQcm9maWxlRWxlbWVudCk6CisgICAgJycnQW4gdW5zcGVjaWZpZWQgcHJvZmlsZSBlbGVtZW50IG1lcmVseSBkb2N1bWVudHMgdGhlIGV4aXN0ZW5jZSBvZiBhIGVsZW1lbnQgd2l0aGluIGEKKyAgICBkYXRhc2V0IGJ1dCBzYXlzIG5vdGhpbmcgYWJvdXQgaXRzIGFjdHVhbCB2YWx1ZXMuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGRlc2NyaXB0aW9uLCB0eXBlLCB1bml0cywgc3lub255bXMsIGNvbW1lbnQpOgorICAgICAgICAnJydJbml0aWFsaXplIGFuICJ1bnNwZWNpZmllZCIgcHJvZmlsZSBlbGVtZW50LgorICAgICAgICAnJycKKyAgICAgICAgc3VwZXIoVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudCwgc2VsZikuX19pbml0X18obmFtZSwgZGVzY3JpcHRpb24sIHR5cGUsIHVuaXRzLCBzeW5vbnltcywgY29tbWVudCkKKyAgICAKKyAgICBkZWYgaXNFbnVtZXJhdGVkKHNlbGYpOgorICAgICAgICAnJydBbiB1bnNwZWNpZmllZCBwcm9maWxlIGVsZW1lbnQgaXMgaW5kZWVkIGVudW1lcmF0ZWQuICBJdCBqdXN0IGhhcyBubyBlbnVtZXJhdGVkIHZhbHVlcy4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBUcnVlCisgICAgCisKK2NsYXNzIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChQcm9maWxlRWxlbWVudCk6CisgICAgJycnQW4gZW51bWVyYXRlZCBwcm9maWxlIGVsZW1lbnQgZGVzY3JpYmVzIHNldCBvZiBkaXNjcmV0ZSB2YWx1ZXMuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGRlc2NyaXB0aW9uLCB0eXBlLCB1bml0cywgc3lub255bXMsIGNvbW1lbnQsIHZhbHVlcyk6CisgICAgICAgICcnJ0luaXRpYWxpemUgYW4gZW51bWVyYXRlZCBwcm9maWxlIGVsZW1lbnQuCisgICAgICAgICcnJworICAgICAgICBzdXBlcihFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQsIHNlbGYpLl9faW5pdF9fKG5hbWUsIGRlc2NyaXB0aW9uLCB0eXBlLCB1bml0cywgc3lub255bXMsIGNvbW1lbnQpCisgICAgICAgIHNlbGYudmFsdWVzID0gdmFsdWVzCisgICAgICAgIAorICAgIGRlZiBpc0VudW1lcmF0ZWQoc2VsZik6CisgICAgICAgICcnJ0FuIGVudW1lcmF0ZWQgcHJvZmlsZSBlbGVtZW50IGlzIGluZGVlZCBlbnVtZXJhdGVkLgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICAKKyAgICBkZWYgZ2V0VmFsdWVzKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIHNlcXVlbmNlIG9mIHZhbHVlcy4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlcworICAgICAgICAKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJjID0gc3VwZXIoRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50LCBzZWxmKS5fX2NtcF9fKG90aGVyKQorICAgICAgICBpZiByYyA8IDA6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiByYyA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLnZhbHVlcywgb3RoZXIudmFsdWVzKQorICAgICAgICByZXR1cm4gMQorICAgIAorCitjbGFzcyBSYW5nZWRQcm9maWxlRWxlbWVudChQcm9maWxlRWxlbWVudCk6CisgICAgJycnQSByYW5nZWQgcHJvZmlsZSBlbGVtZW50IGRlc2NyaWJlcyBhIHZhbHVlIGJldHdlZW4gdHdvIG51bWVyaWMgcmFuZ2VzLgorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBkZXNjcmlwdGlvbiwgdHlwZSwgdW5pdHMsIHN5bm9ueW1zLCBjb21tZW50LCBtaW5WYWx1ZSwgbWF4VmFsdWUpOgorICAgICAgICAnJydJbml0aWFsaXplIGEgcmFuZ2VkIHByb2ZpbGUgZWxlbWVudC4KKyAgICAgICAgJycnCisgICAgICAgIHN1cGVyKFJhbmdlZFByb2ZpbGVFbGVtZW50LCBzZWxmKS5fX2luaXRfXyhuYW1lLCBkZXNjcmlwdGlvbiwgdHlwZSwgdW5pdHMsIHN5bm9ueW1zLCBjb21tZW50KQorICAgICAgICBzZWxmLm1pblZhbHVlID0gbWluVmFsdWUKKyAgICAgICAgc2VsZi5tYXhWYWx1ZSA9IG1heFZhbHVlCisgICAgCisgICAgZGVmIGdldE1pblZhbHVlKHNlbGYpOgorICAgICAgICAnJydHZXQgdGhlIG1pbmltdW0gdmFsdWUuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gc2VsZi5taW5WYWx1ZQorICAgIAorICAgIGRlZiBnZXRNYXhWYWx1ZShzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSBtYXhpbXVtIHZhbHVlLgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIHNlbGYubWF4VmFsdWUKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnUmFuZ2VkUHJvZmlsZUVsZW1lbnQoJXIsbWluVmFsdWU9JXIsbWF4VmFsdWU9JXIpJyAlIChzdXBlcihSYW5nZWRQcm9maWxlRWxlbWVudCwgc2VsZikuX19yZXByX18oKSwKKyAgICAgICAgICAgIHNlbGYubWluVmFsdWUsIHNlbGYubWF4VmFsdWUpCisgICAgCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByYyA9IHN1cGVyKFJhbmdlZFByb2ZpbGVFbGVtZW50LCBzZWxmKS5fX2NtcF9fKG90aGVyKQorICAgICAgICBpZiByYyA8IDA6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiByYyA9PSAwOgorICAgICAgICAgICAgcmMgPSBzZWxmLm1pblZhbHVlIC0gb3RoZXIubWluVmFsdWUKKyAgICAgICAgICAgIGlmIHJjIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsaWYgcmMgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXhWYWx1ZSAtIG90aGVyLm1heFZhbHVlCisgICAgICAgIHJldHVybiAxCisgICAgCisKK2RlZiBfcGFyc2VQcm9maWxlRWxlbWVudChub2RlKToKKyAgICAnJydDb25zdHJ1Y3QgYW4gYXBwcm9wcmlhdGUgcHJvZmlsZSBlbGVtZW50IGZyb20gdGhlIGdpdmVuIERPTSBub2RlLgorICAgICcnJworICAgIGlmIG5vZGUubm9kZU5hbWUgIT0gdSdwcm9mRWxlbWVudCc6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0V4cGVjdGVkIHByb2ZFbGVtZW50IGVsZW1lbnQgYnV0IGdvdCAiJXMiJyAlIG5vZGUubm9kZU5hbWUpCisgICAgc2V0dGluZ3MgPSBkaWN0KGVsZW1JZD11J1VOS05PV04nLCBlbGVtRGVzYz11J1VOS05PV04nLCBlbGVtVHlwZT11J1VOS05PV04nLCBlbGVtVW5pdD11J1VOS05PV04nLCBlbGVtRW51bUZsYWc9dSdGJywKKyAgICAgICAgZWxlbUNvbW1lbnQ9dSdVTktOT1dOJykKKyAgICB2YWx1ZXMsIHN5bnMgPSBbXSwgW10KKyAgICBmb3IgY2hpbGQgaW4gZmlsdGVyKGxhbWJkYSBub2RlOiBub2RlLm5vZGVUeXBlID09IHhtbC5kb20uTm9kZS5FTEVNRU5UX05PREUsIG5vZGUuY2hpbGROb2Rlcyk6CisgICAgICAgIHRleHQgPSB4bWx1dGlscy50ZXh0KGNoaWxkKQorICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J2VsZW1WYWx1ZSc6CisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHRleHQpCisgICAgICAgIGVsaWYgY2hpbGQubm9kZU5hbWUgPT0gdSdlbGVtU3lub255bSc6CisgICAgICAgICAgICBzeW5zLmFwcGVuZCh0ZXh0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2V0dGluZ3Nbc3RyKGNoaWxkLm5vZGVOYW1lKV0gPSB0ZXh0CisgICAgaWYgJ2VsZW1OYW1lJyBub3QgaW4gc2V0dGluZ3M6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Byb2ZFbGVtZW50IHJlcXVpcmVzIGVsZW1OYW1lIGJ1dCBub25lIHNwZWNpZmllZCcpCisgICAgaWYgJ2VsZW1FbnVtRmxhZycgbm90IGluIHNldHRpbmdzOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdwcm9mRWxlbWVudCByZXF1aXJlcyBlbGVtRW51bUZsYWcgYnV0IG5vbmUgc3BlY2lmaWVkJykKKyAgICAgICAgCisgICAgIyBOb3JtYWxseSBJJ2QgdHJlYXQgb25seSB0aG9zZSBYTUwgZWxlbWVudHMgd2hlcmUgZWxlbUVudW1GbGFnIGFzIFQgYXMgcG9zc2libHkgcHJvZHVjaW5nCisgICAgIyB1bnNwZWNpZmllZCBvciBlbnVtZXJhdGVkLCBhbmQgRiBwcm9kdWNpbmcgKm9ubHkqIHJhbmdlZCBlbGVtZW50cy4gIEJ1dCBQRFMgcHJvZmlsZQorICAgICMgc2VydmVycyBhcmUgcHJvZHVjaW5nIHByb2ZpbGUgZWxlbWVudHMgd2l0aCBGIGZvciBlbGVtRW51bUZsYWcgYW5kIHlldCBOTyBlbGVtTWluVmFsdWUKKyAgICAjIGFuZCBlbGVtTWF4VmFsdWUuICBJZiB0aGV5J3JlIHVzaW5nIHRoZSBKYXZhIHByb2ZpbGUgY29kZSwgSSdkIGNhbGwgdGhhdCBhIGJ1ZyBpbiB0aGF0CisgICAgIyBjb2RlLiAgSWYgdGhleSdyZSBub3QsIHRoZW4gSSdkIHNheSB0aGV5J3JlIHByb2R1Y2luZyBwcm9maWxlcyBpbmNvcnJlY3RseS4KKyAgICBpZiBzZXR0aW5nc1snZWxlbUVudW1GbGFnJ10gPT0gJ1QnOgorICAgICAgICBpZiBsZW4odmFsdWVzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIFVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQoc2V0dGluZ3NbJ2VsZW1OYW1lJ10sIHNldHRpbmdzWydlbGVtRGVzYyddLCBzZXR0aW5nc1snZWxlbVR5cGUnXSwKKyAgICAgICAgICAgICAgICBzZXR0aW5nc1snZWxlbVVuaXQnXSwgc3lucywgc2V0dGluZ3NbJ2VsZW1Db21tZW50J10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KHNldHRpbmdzWydlbGVtTmFtZSddLCBzZXR0aW5nc1snZWxlbURlc2MnXSwgc2V0dGluZ3NbJ2VsZW1UeXBlJ10sCisgICAgICAgICAgICAgICAgc2V0dGluZ3NbJ2VsZW1Vbml0J10sIHN5bnMsIHNldHRpbmdzWydlbGVtQ29tbWVudCddLCB2YWx1ZXMpCisgICAgZWxzZToKKyAgICAgICAgaWYgJ2VsZW1NaW5WYWx1ZScgbm90IGluIHNldHRpbmdzIG9yICdlbGVtTWF4VmFsdWUnIG5vdCBpbiBzZXR0aW5nczoKKyAgICAgICAgICAgIHJldHVybiBVbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50KHNldHRpbmdzWydlbGVtTmFtZSddLCBzZXR0aW5nc1snZWxlbURlc2MnXSwgc2V0dGluZ3NbJ2VsZW1UeXBlJ10sCisgICAgICAgICAgICAgICAgc2V0dGluZ3NbJ2VsZW1Vbml0J10sIHN5bnMsIHNldHRpbmdzWydlbGVtQ29tbWVudCddKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFJhbmdlZFByb2ZpbGVFbGVtZW50KHNldHRpbmdzWydlbGVtTmFtZSddLCBzZXR0aW5nc1snZWxlbURlc2MnXSwgc2V0dGluZ3NbJ2VsZW1UeXBlJ10sCisgICAgICAgICAgICBzZXR0aW5nc1snZWxlbVVuaXQnXSwgc3lucywgc2V0dGluZ3NbJ2VsZW1Db21tZW50J10sIGZsb2F0KHNldHRpbmdzWydlbGVtTWluVmFsdWUnXSksCisgICAgICAgICAgICBmbG9hdChzZXR0aW5nc1snZWxlbU1heFZhbHVlJ10pKQorICAgIAorCisjIFNvbWUgc2FtcGxlIGNvZGU6CisjIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisjICAgaW1wb3J0IHVybGxpYjIsIHhtbC5kb20ubWluaWRvbQorIyAgIHggPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly9zdGFyYnJpdGUuanBsLm5hc2EuZ292L3E/b2JqZWN0PXVybiUzQWVkYSUzQXJtaSUzQUpQTC5QRFMuTWFzdGVyUHJvZCZ0eXBlPXByb2ZpbGUma2V5d29yZFF1ZXJ5PVRBUkdFVF9OQU1FKyUzRCtNQVJTJykKKyMgICBkID0geG1sLmRvbS5taW5pZG9tLnBhcnNlKHgpCisjICAgeC5jbG9zZSgpCisjICAgcHJvZmlsZXMgPSBbXQorIyAgIGZvciBpIGluIGQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHUncHJvZmlsZScpOgorIyAgICAgICBwcm9maWxlcy5hcHBlbmQoUHJvZmlsZShub2RlPWkpKQorIyAgICAgICAKKyMgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQorIyAgIHByaW50ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicKKyMgICBwcmludCAnPCFET0NUWVBFIHByb2ZpbGVzIFBVQkxJQyAiLS8vSlBMLy9EVEQgUHJvZmlsZSAxLjEvL0VOIicKKyMgICBwcmludCAnICAiaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2dyaWQtcHJvZmlsZS9kdGQvcHJvZi5kdGQiPicKKyMgICBwcmludCAnPHByb2ZpbGVzPicKKyMgICBmb3IgcHJvZmlsZSBpbiBwcm9maWxlczoKKyMgICAgICAgcHJpbnQgcHJvZmlsZS50b1hNTChkb2MpLnRveG1sKCkKKyMgICBwcmludCAnPC9wcm9maWxlcz4nCisjICAgCmRpZmYgLS1naXQgYS8wLjEwL2FnaWxpdHkvb29kdC9xdWVyeS5weSBiLzAuMTAvYWdpbGl0eS9vb2R0L3F1ZXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDk3YzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvb29kdC9xdWVyeS5weQpAQCAtMCwwICsxLDQ1NiBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnCitBZ2lsZSBPT0RUIFF1ZXJ5IEV4cHJlc3Npb25zLgorCitRdWVyeSBleHByZXNzaW9ucyBpbiBPT0RUIGFyZSBiYXNlZCBvbiB0aGUgIkRJUyIgc3R5bGUgZXhwcmVzc2lvbnMgb3JpZ2luYWxseQorZGV2ZWxvcGVkIGZvciB0aGUgUGxhbmV0YXJ5IERhdGEgU3lzdGVtLiAgVGhleSBjb25zaXN0IG9mCitrZXl3b3JkL29wZXJhdG9yL2xpdGVyYWwtdmFsdWUgdHJpcGxlcywgc3VjaCBhcyBgdGFyZ2V0TmFtZSA9IE1hcnNgLCBlYWNoCitsaW5rZWQgd2l0aCBsb2dpY2FsIG9wZXJhdG9ycyAoYW5kLCBvciwgbm90KSBhbmQgZ3JvdXBlZCB3aXRoIHBhcmVudGhlc2VzLgorRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBPT0RUXy4KKworVGhpcyBtb2R1bGUgZGVmaW5lcyBjbGFzc2VzIHRoYXQgbW9kZWwgdGhlIGFzcGVjdHMgb2YgYSBxdWVyeS4gIEluIGdlbmVyYWwsCit1c2UgdGhlIGBRdWVyeWAgY2xhc3MsIHBhc3NpbmcgYSBzdHJpbmcgY29udGFpbmluZyB5b3VyIGtleXdvcmQgZXhwcmVzc2lvbiBhcwordGhlIGZpcnN0IGNvbnN0cnVjdG9yIGFyZ3VtZW50LiAgRnJvbSB0aGVyZSwgeW91IGhhdmUgYSBgUXVlcnlgIG9iamVjdCB5b3UgY2FuCitwYXNzIGFyb3VuZCB0byBwcm9maWxlIHNlcnZlcnMsIHByb2R1Y3Qgc2VydmVycywgYW5kIHNvIGZvcnRoLgorCisuLiBfT09EVDogaHR0cDovL29vZHQuYXBhY2hlLm9yZy8KKycnJworCitfX2RvY2Zvcm1hdF9fID0gJ3Jlc3RydWN0dXJlZHRleHQnCisKK2ltcG9ydCBvb2R0ZXJyb3JzLCBzaGxleCwgeG1sdXRpbHMsIHhtbC5kb20KK2Zyb20geG1sdXRpbHMgaW1wb3J0IERvY3VtZW50YWJsZUZpZWxkCisKK2NsYXNzIF9RdWVyeUV4cHJlc3Npb25TY2FubmVyKHNobGV4LnNobGV4KToKKyAgICAnJydFeHRlbmQgdGhlIHNobGV4IHNjYW5uZXIgYnV0IGZvciB0aGUgRElTLXN0eWxlIHF1ZXJ5IGV4cHJlc3Npb25zIHdlIGV4cGVjdC4KKyAgICBUaGlzIG1lYW5zIGFkZGluZyBhIGRvdCB0byB0aGUgY2hhcmFjdGVycyB0aGF0IGNvbXByaXNlIGEgd29yZCBzbyB3ZSBjYW4gZWFzaWx5IHBhcnNlCisgICAgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4gIEFsc28sIHRoZXJlJ3Mgbm8gY29tbWVudCBjaGFyYWN0ZXIuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cik6CisgICAgICAgICcnJ0NyZWF0ZSBzY2FubmVyLiAgYHN0cmAgaXMgdGhlIHN0cmluZyB0byBzY2FuLgorICAgICAgICAnJycKKyAgICAgICAgc2hsZXguc2hsZXguX19pbml0X18oc2VsZiwgc3RyKQorICAgICAgICBzZWxmLmNvbW1lbnRlcnMgPSAnJworICAgICAgICBzZWxmLndvcmRjaGFycyA9IHNlbGYud29yZGNoYXJzICsgJy4tLzonCisgICAgICAgIAorCisgICAgZGVmIGdldF90b2tlbihzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSBuZXh0IHRva2VuLiAgV2Ugc3RyaXAgcXVvdGVzIGZyb20gc3RyaW5ncywgYXR0YWNoIG5lZ2F0aXZlIHNpZ25zCisgICAgICAgIHRvIHRoZSBudW1iZXJzIHRoZXkncmUgbmVnYXRpbmcsIGFuZCBhdHRhY2ggdGhlID0gdG8gPCwgPiwgYW5kICEgd2hlcmUgbmVlZGVkLgorICAgICAgICAnJycKKyAgICAgICAgdG9rZW4gPSBzaGxleC5zaGxleC5nZXRfdG9rZW4oc2VsZikKKyAgICAgICAgaWYgdG9rZW4gPT0gc2VsZi5lb2Ygb3IgdG9rZW4gPT0gTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHRva2VuWzBdIGluIHNlbGYucXVvdGVzOgorICAgICAgICAgICAgdG9rZW4gPSB0b2tlblsxOi0xXQorICAgICAgICBlbGlmIHRva2VuIGluICgnPCcsICc+JywgJyEnKToKKyAgICAgICAgICAgIG5leHQgPSBzaGxleC5zaGxleC5nZXRfdG9rZW4oc2VsZikKKyAgICAgICAgICAgIGlmIG5leHQgPT0gc2VsZi5lb2Ygb3IgbmV4dCA9PSBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBlbGlmIG5leHQgPT0gJz0nOgorICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4gKyBuZXh0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaF90b2tlbihuZXh0KQorICAgICAgICByZXR1cm4gdG9rZW4KKyAgICAKKworY2xhc3MgUXVlcnlFeGNlcHRpb24ob29kdGVycm9ycy5PT0RURXhjZXB0aW9uKToKKyAgICAnJydFeGNlcHRpb25zIHJlbGF0ZWQgdG8gcXVlcnkgZXhwcmVzc2lvbiBvciBxdWVyeSBzZXJ2aWNlcworICAgICcnJworICAgIHBhc3MKKyAgICAKKworY2xhc3MgRXhwcmVzc2lvblBhcnNlRXJyb3IoUXVlcnlFeGNlcHRpb24pOgorICAgICcnJ0Vycm9yIGluIHBhcnNpbmcgYSBxdWVyeSBleHByZXNzaW9uLgorICAgICcnJworICAgIHBhc3MKKyAgICAKKworY2xhc3MgUXVlcnlFbGVtZW50KHhtbHV0aWxzLkRvY3VtZW50YWJsZSk6CisgICAgJycnQW4gZWxlbWVudCBvZiBhIHF1ZXJ5LgorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb2xlPSdVTktOT1dOJywgdmFsdWU9J1VOS05PV04nLCBub2RlPU5vbmUpOgorICAgICAgICAnJydDcmVhdGUgYSBRdWVyeUVsZW1lbnQuICBZb3UgY2FuIHByb3ZpZGUgcm9sZSBhbmQgdmFsdWUgc2V0dGluZ3MsIG9yIHByb3ZpZGUgYW4gWE1MCisgICAgICAgIERPTSBub2RlIHdoaWNoIHdpbGwgYmUgcGFyc2VkIGZvciByb2xlL3ZhbHVlLgorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5yb2xlLCBzZWxmLnZhbHVlID0gcm9sZSwgdmFsdWUKKyAgICAgICAgaWYgbm9kZSAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJzZShub2RlKQorCisgICAgZGVmIGdldERvY3VtZW50RWxlbWVudE5hbWUoc2VsZik6CisgICAgICAgICcnJ0dpdmUgdGhlIFhNTCB0YWcgbmFtZTogYHF1ZXJ5RWxlbWVudGAuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gJ3F1ZXJ5RWxlbWVudCcKKyAgICAKKyAgICBkZWYgZ2V0RG9jdW1lbnRhYmxlRmllbGRzKHNlbGYpOgorICAgICAgICAnJydHZXQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBnbyBpbnRvIFhNTC4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiAoRG9jdW1lbnRhYmxlRmllbGQoJ3JvbGUnLCB1J3Rva2VuUm9sZScsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCd2YWx1ZScsIHUndG9rZW5WYWx1ZScsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSkKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnUXVlcnlFbGVtZW50KHJvbGU9IiVzIix2YWx1ZT0iJXMiKScgJSAoc2VsZi5yb2xlLCBzZWxmLnZhbHVlKQorICAgIAorCitjbGFzcyBRdWVyeUhlYWRlcih4bWx1dGlscy5Eb2N1bWVudGFibGUpOgorICAgICcnJ0hlYWRlciBvZiBhIHF1ZXJ5LiAgQ2FwdHVyZXMgbWV0YWRhdGEgbGlrZSBkYXRhIGRpY3Rpb25hcnkgaW4gdXNlLCBldGMuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlkPSdVTktOT1dOJywgdGl0bGU9J1VOS05PV04nLCBkZXNjPSdVTktOT1dOJywgdHlwZT0nUVVFUlknLCBzdGF0dXM9J0FDVElWRScsIHNlY3VyaXR5PSdVTktOT1dOJywKKyAgICAgICAgcmV2PScyMDA1LTEwLTAxIFNDSyB2MC4wLjAgVW5kZXIgRGV2ZWxvcG1lbnQnLCBkYXRhRGljdD0nVU5LTk9XTicsIG5vZGU9Tm9uZSk6CisgICAgICAgICcnJ0luaXRpYWxpemUgYSBRdWVyeUhlYWRlci4gIFByb3ZpZGUgaWQsIHRpdGxlLCBkZXNjLCB0eXBlLCBzdGF0dXMsIHNlY3VyaXR5LCByZXYsCisgICAgICAgIGFuZCBkYXRhRGljdCBzZXR0aW5ncy4gIE9yLCBwcm92aWRlIGp1c3QgYW4gWE1MIERPTSBub2RlIHRvIGJlIHBhcnNlZC4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuaWQsIHNlbGYudGl0bGUsIHNlbGYuZGVzYywgc2VsZi50eXBlLCBzZWxmLnN0YXR1cywgc2VsZi5zZWN1cml0eSwgc2VsZi5yZXYsIHNlbGYuZGF0YURpY3QgPSBcCisgICAgICAgICAgICBpZCwgdGl0bGUsIGRlc2MsIHR5cGUsIHN0YXR1cywgc2VjdXJpdHksIHJldiwgZGF0YURpY3QKKyAgICAgICAgaWYgbm9kZSAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJzZShub2RlKQorICAgIAorICAgIGRlZiBnZXREb2N1bWVudEVsZW1lbnROYW1lKHNlbGYpOgorICAgICAgICAnJydHaXZlIHRoZSBYTUwgdGFnIG5hbWU6IGBxdWVyeUF0dHJpYnV0ZXNgLgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuICdxdWVyeUF0dHJpYnV0ZXMnCisgICAgCisgICAgZGVmIGdldERvY3VtZW50YWJsZUZpZWxkcyhzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSBhdHRyaWJ1dGVzIHRoYXQgZ28gaW50byBYTUwuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gKERvY3VtZW50YWJsZUZpZWxkKCdpZCcsIHUncXVlcnlJZCcsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCd0aXRsZScsIHUncXVlcnlUaXRsZScsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdkZXNjJywgdSdxdWVyeURlc2MnLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgndHlwZScsIHUncXVlcnlUeXBlJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3N0YXR1cycsIHUncXVlcnlTdGF0dXNJZCcsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdzZWN1cml0eScsIHUncXVlcnlTZWN1cml0eVR5cGUnLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICBEb2N1bWVudGFibGVGaWVsZCgncmV2JywgdSdxdWVyeVJldmlzaW9uTm90ZScsIERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EKSwKKyAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdkYXRhRGljdCcsIHUncXVlcnlEYXRhRGljdElkJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpKQorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdRdWVyeUhlYWRlcihpZD0iJXMiLHRpdGxlPSIlcyIsZGVzYz0iJXMiLHR5cGU9IiVzIixzdGF0dXM9IiVzIixzZWN1cml0eT0iJXMiLHJldj0iJXMiLGRhdGFEaWN0PSIlcyIpJyAlICgKKyAgICAgICAgICAgIHNlbGYuaWQsIHNlbGYudGl0bGUsIHNlbGYuZGVzYywgc2VsZi50eXBlLCBzZWxmLnN0YXR1cywgc2VsZi5zZWN1cml0eSwgc2VsZi5yZXYsIHNlbGYuZGF0YURpY3QKKyAgICAgICAgKQorICAgIAorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIGNtcCgoc2VsZi5pZCwgc2VsZi50aXRsZSwgc2VsZi5kZXNjLCBzZWxmLnR5cGUsIHNlbGYuc3RhdHVzLCBzZWxmLnNlY3VyaXR5LCBzZWxmLnJldiwgc2VsZi5kYXRhRGljdCksCisgICAgICAgICAgICAgICAob3RoZXIuaWQsIG90aGVyLnRpdGxlLCBvdGhlci5kZXNjLCBvdGhlci50eXBlLCBvdGhlci5zdGF0dXMsIG90aGVyLnNlY3VyaXR5LCBvdGhlci5yZXYsIG90aGVyLmRhdGFEaWN0KSkKKyAgICAKKworY2xhc3MgUXVlcnlSZXN1bHQob2JqZWN0KToKKyAgICAnJydSZXN1bHQgb2YgYSBxdWVyeS4KKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVzdWx0cz1bXSwgbm9kZT1Ob25lKToKKyAgICAgICAgJycnUmVzdWx0cyBvZiBhIHF1ZXJ5IGFyZSBjYXB0dXJlZCBhcyBhIHNlcXVlbmNlIG9mIGdlbmVyaWMgb2JqZWN0cy4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYucmVzdWx0cyA9IHJlc3VsdHMKKyAgICAgICAgaWYgbm9kZSAhPSBOb25lOiBzZWxmLnBhcnNlKG5vZGUpCisgICAgCisgICAgZGVmIHBhcnNlKHNlbGYsIG5vZGUpOgorICAgICAgICAnJydJbml0aWFsaXplIHRoaXMgb2JqZWN0IGZyb20gdGhlIGdpdmVuIFhNTCBET00gYG5vZGVgLgorICAgICAgICAnJycKKyAgICAgICAgaWYgJ3F1ZXJ5UmVzdWx0U2V0JyAhPSBub2RlLm5vZGVOYW1lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRXhwZWN0ZWQgcXVlcnlSZXN1bHRTZXQgYnV0IGdvdCAiJXMiJyAlIG5vZGUubm9kZU5hbWUpCisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6CisgICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSB4bWwuZG9tLk5vZGUuRUxFTUVOVF9OT0RFIGFuZCAncmVzdWx0RWxlbWVudCcgPT0gY2hpbGQubm9kZU5hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzLmFwcGVuZChSZXN1bHQobm9kZT1jaGlsZCkpCisgICAgCisgICAgZGVmIHRvWE1MKHNlbGYsIG93bmVyKToKKyAgICAgICAgJycnQ29udmVydCB0aGlzIG9iamVjdCBpbnRvIFhNTCBvd25lZCBieSB0aGUgZ2l2ZW4gYG93bmVyYCBkb2N1bWVudC4KKyAgICAgICAgJycnCisgICAgICAgIHJvb3QgPSBvd25lci5jcmVhdGVFbGVtZW50KCdxdWVyeVJlc3VsdFNldCcpCisgICAgICAgIGZvciByZXN1bHQgaW4gc2VsZi5yZXN1bHRzOgorICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChyZXN1bHQudG9YTUwob3duZXIpKQorICAgICAgICByZXR1cm4gcm9vdAorICAgIAorICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgJycnUmVtb3ZlIGFsbCByZXN1bHRzLgorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5yZXN1bHRzID0gW10KKyAgICAKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBzZWxmLnJlc3VsdHNbaV0KKyAgICAKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnJlc3VsdHMpCisgICAgCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYucmVzdWx0cywgb3RoZXIucmVzdWx0cykKKyAgICAKKworX1JFTE9QUyA9IHsKKyAgICAnTFQnOiAgICAgICdMVCcsIAorICAgICdsdCc6ICAgICAgJ0xUJywgCisgICAgJzwnOiAgICAgICAnTFQnLAorICAgICdMRSc6ICAgICAgJ0xFJywKKyAgICAnbGUnOiAgICAgICdMRScsCisgICAgJzw9JzogICAgICAnTEUnLAorICAgICdFUSc6ICAgICAgJ0VRJywgCisgICAgJ2VxJzogICAgICAnRVEnLCAKKyAgICAnPSc6ICAgICAgICdFUScsCisgICAgJ0dFJzogICAgICAnR0UnLAorICAgICdnZSc6ICAgICAgJ0dFJywKKyAgICAnPj0nOiAgICAgICdHRScsCisgICAgJ0dUJzogICAgICAnR1QnLAorICAgICdndCc6ICAgICAgJ0dUJywKKyAgICAnPic6ICAgICAgICdHVCcsCisgICAgJ05FJzogICAgICAnTkUnLAorICAgICduZSc6ICAgICAgJ05FJywKKyAgICAnIT0nOiAgICAgICdORScsCisgICAgJ0xJS0UnOiAgICAnTElLRScsCisgICAgJ2xpa2UnOiAgICAnTElLRScsCisgICAgJ05PVExJS0UnOiAnTk9UTElLRScsCisgICAgJ25vdGxpa2UnOiAnTk9UTElLRScsCisgICAgJ25vdExpa2UnOiAnTk9UTElLRScsCisgICAgJ0lTJzogICAgICAnSVMnLAorICAgICdpcyc6ICAgICAgJ2lzJywKKyAgICAnSVNOT1QnOiAgICdJU05PVCcsCisgICAgJ2lzbm90JzogICAnaXNub3QnLAorICAgICdpc05vdCc6ICAgJ2lzbm90JworfQorCitfTE9HT1BTID0geworICAgICdBTkQnOiAnQU5EJywKKyAgICAnYW5kJzogJ0FORCcsCisgICAgJyYnOiAgICdBTkQnLAorICAgICdPUic6ICAnT1InLAorICAgICdvcic6ICAnT1InLAorICAgICd8JzogICAnT1InLAorICAgICdOT1QnOiAnTk9UJywKKyAgICAnbm90JzogJ05PVCcsCisgICAgJyEnOiAgICdOT1QnCit9CisKK19QUkVDRURFTkNFID0geworICAgICdOT1QnOiAyLAorICAgICdBTkQnOiAxLAorICAgICdPUic6IDAsCit9CisKK2NsYXNzIFF1ZXJ5KG9iamVjdCk6CisgICAgJycnUXVlcnkuICBJbiBvbGQgT09EVCwgdGhpcyB3YXMgY2FsbGVkIFhNTFF1ZXJ5LCBldmVuIHRob3VnaCBYTUwgd2FzIHRhZ2VudGlhbCB0byBpdC4KKyAgICBDYXB0dXJlcyBhc3BlY3RzIG9mIGEgcXVlcnksIGluY2x1ZGluZyBoZWFkZXIsIHJlc3VsdHMsIGFuZCBzbyBmb3J0aC4gIE1vc3QgaW1wb3J0YW50bHksIGl0CisgICAgY2FwdHVyZXMgdGhlIHF1ZXJ5IGV4cHJlc3Npb24sIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdHJhaW50cyBvbiB1c2VyJ3MgZGVzaWRlcmF0YSBhbmQKKyAgICByYW5nZSBvbiB3aGF0IHRvIHJldHVybi4KKyAgICAKKyAgICBBcyB3aXRoIG90aGVyIGNsYXNzZXMgaW4gdGhpcyBtb2R1bGUsIHlvdSBjYW4gcHJvdmlkZSBhbiBYTUwgRE9NIG5vZGUgdG8gYmUgcGFyc2VkCisgICAgZm9yIHRoZSBxdWVyeSdzIHNldHRpbmdzLCBvciBwcm92aWRlIGVhY2ggb2YgdGhlbSBpbmRpdmlkdWFsbHkuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleXdvcmRRdWVyeT1Ob25lLCBoZWFkZXI9UXVlcnlIZWFkZXIoKSwgcmVzdWx0TW9kZUlEPSdBVFRSSUJVVEUnLCBwcm9wVHlwZT0nQlJPQURDQVNUJywKKyAgICAgICAgcHJvcExldmVscz0nTi9BJywgbWF4UmVzdWx0cz0xLCBtaW1lQWNjZXB0PVtdLCBwYXJzZVF1ZXJ5PVRydWUsIG5vZGU9Tm9uZSk6CisgICAgICAgICcnJ0luaXRpYWxpemUgYSBxdWVyeS4gIFVzdWFsbHkgeW91IHByb3ZpZGUganVzdCB0aGUgYGtleXdvcmRRdWVyeWAgYXJndW1lbnQKKyAgICAgICAgd2hpY2ggc2hvdWxkIGJlIGEga2V5d29yZC9xdWVyeSBleHByZXNzaW9uIGluIHRoZSBESVMtc3R5bGU7IG9yIHlvdSBwcm92aWRlCisgICAgICAgIHRoZSBgbm9kZWAgd2hpY2ggaXMgYW4gWE1MIERPTSBub2RlIGRlc2NyaWJpbmcgYSBxdWVyeS4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuaGVhZGVyLCBzZWxmLnJlc3VsdE1vZGVJRCwgc2VsZi5wcm9wVHlwZSwgc2VsZi5wcm9wTGV2ZWxzLCBzZWxmLm1heFJlc3VsdHMsIHNlbGYubWltZUFjY2VwdCA9IFwKKyAgICAgICAgICAgIGhlYWRlciwgcmVzdWx0TW9kZUlELCBwcm9wVHlwZSwgcHJvcExldmVscywgbWF4UmVzdWx0cywgbWltZUFjY2VwdAorICAgICAgICBzZWxmLndoZXJlcywgc2VsZi5zZWxlY3RzLCBzZWxmLmZyb21zLCBzZWxmLnJlc3VsdFNldCA9IFtdLCBbXSwgW10sIFF1ZXJ5UmVzdWx0KCkKKyAgICAgICAgaWYga2V5d29yZFF1ZXJ5ICE9IE5vbmU6CisgICAgICAgICAgICBzZWxmLmtleXdvcmRRdWVyeSA9IGtleXdvcmRRdWVyeQorICAgICAgICAgICAgaWYgcGFyc2VRdWVyeToKKyAgICAgICAgICAgICAgICBzZWxmLndoZXJlcywgc2VsZi5zZWxlY3RzID0gX3BhcnNlUXVlcnkoa2V5d29yZFF1ZXJ5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5rZXl3b3JkUXVlcnkgPSAnJworICAgICAgICBpZiBub2RlICE9IE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhcnNlKG5vZGUpCisgICAgICAgIAorICAgIGRlZiB0b1hNTChzZWxmLCBvd25lcik6CisgICAgICAgICcnJ1lpZWxkIHRoaXMgcXVlcnkgYXMgYW4gWE1MIERPTS4KKyAgICAgICAgJycnCisgICAgICAgIHF1ZXJ5ID0gb3duZXIuY3JlYXRlRWxlbWVudCgncXVlcnknKQorICAgICAgICBxdWVyeS5hcHBlbmRDaGlsZChzZWxmLmhlYWRlci50b1hNTChvd25lcikpCisgICAgICAgIHhtbHV0aWxzLmFkZChxdWVyeSwgdSdxdWVyeVJlc3VsdE1vZGVJZCcsIHNlbGYucmVzdWx0TW9kZUlEKQorICAgICAgICB4bWx1dGlscy5hZGQocXVlcnksIHUncXVlcnlQcm9wb2dhdGlvblR5cGUnLCBzZWxmLnByb3BUeXBlKQorICAgICAgICB4bWx1dGlscy5hZGQocXVlcnksIHUncXVlcnlQcm9wb2dhdGlvbkxldmVscycsIHNlbGYucHJvcExldmVscykKKyAgICAgICAgZm9yIG1pbWVUeXBlIGluIHNlbGYubWltZUFjY2VwdDoKKyAgICAgICAgICAgIHhtbHV0aWxzLmFkZChxdWVyeSwgdSdxdWVyeU1pbWVBY2NlcHQnLCBtaW1lVHlwZSkKKyAgICAgICAgeG1sdXRpbHMuYWRkKHF1ZXJ5LCB1J3F1ZXJ5TWF4UmVzdWx0cycsIHN0cihzZWxmLm1heFJlc3VsdHMpKQorICAgICAgICB4bWx1dGlscy5hZGQocXVlcnksIHUncXVlcnlLV1FTdHJpbmcnLCBzZWxmLmtleXdvcmRRdWVyeSkKKyAgICAgICAgc2VsZWN0cyA9IG93bmVyLmNyZWF0ZUVsZW1lbnQodSdxdWVyeVNlbGVjdFNldCcpCisgICAgICAgIHF1ZXJ5LmFwcGVuZENoaWxkKHNlbGVjdHMpCisgICAgICAgIGZvciBzZWxlY3QgaW4gc2VsZi5zZWxlY3RzOgorICAgICAgICAgICAgc2VsZWN0cy5hcHBlbmRDaGlsZChzZWxlY3QudG9YTUwob3duZXIpKQorICAgICAgICBmcm9tRWxlbWVudCA9IG93bmVyLmNyZWF0ZUVsZW1lbnQodSdxdWVyeUZyb21TZXQnKQorICAgICAgICBxdWVyeS5hcHBlbmRDaGlsZChmcm9tRWxlbWVudCkKKyAgICAgICAgZm9yIGkgaW4gc2VsZi5mcm9tczoKKyAgICAgICAgICAgIGZyb21FbGVtZW50LmFwcGVuZENoaWxkKGkudG9YTUwob3duZXIpKQorICAgICAgICB3aGVyZXMgPSBvd25lci5jcmVhdGVFbGVtZW50KHUncXVlcnlXaGVyZVNldCcpCisgICAgICAgIHF1ZXJ5LmFwcGVuZENoaWxkKHdoZXJlcykKKyAgICAgICAgZm9yIHdoZXJlIGluIHNlbGYud2hlcmVzOgorICAgICAgICAgICAgd2hlcmVzLmFwcGVuZENoaWxkKHdoZXJlLnRvWE1MKG93bmVyKSkKKyAgICAgICAgcXVlcnkuYXBwZW5kQ2hpbGQoc2VsZi5yZXN1bHRTZXQudG9YTUwob3duZXIpKQorICAgICAgICByZXR1cm4gcXVlcnkKKyAgICAgICAgCisgICAgZGVmIHBhcnNlKHNlbGYsIG5vZGUpOgorICAgICAgICAnJydQYXJzZSB0aGUgWE1MIERPTSBub2RlIGFzIGEgcXVlcnkgZG9jdW1lbnQuCisgICAgICAgICcnJworICAgICAgICBpZiAncXVlcnknICE9IG5vZGUubm9kZU5hbWU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCBxdWVyeSBidXQgZ290ICIlcyInICUgbm9kZS5ub2RlTmFtZSkKKyAgICAgICAgc2VsZi5taW1lQWNjZXB0LCBzZWxmLnJlc3VsdHMgPSBbXSwgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IHhtbC5kb20uTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICAgICAgaWYgY2hpbGQubm9kZU5hbWUgPT0gdSdxdWVyeUF0dHJpYnV0ZXMnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhlYWRlciA9IFF1ZXJ5SGVhZGVyKG5vZGU9Y2hpbGQpCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J3Jlc3VsdE1vZGVJRCc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0TW9kZUlEID0geG1sdXRpbHMudGV4dChjaGlsZCkKKyAgICAgICAgICAgICAgICBlbGlmIGNoaWxkLm5vZGVOYW1lID09IHUncXVlcnlQcm9wb2dhdGlvblR5cGUnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByb3BUeXBlID0geG1sdXRpbHMudGV4dChjaGlsZCkKKyAgICAgICAgICAgICAgICBlbGlmIGNoaWxkLm5vZGVOYW1lID09IHUncXVlcnlQcm9wb2dhdGlvbkxldmVscyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvcExldmVscyA9IHhtbHV0aWxzLnRleHQoY2hpbGQpCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J3F1ZXJ5TWltZUFjY2VwdCc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWltZUFjY2VwdC5hcHBlbmQoeG1sdXRpbHMudGV4dChjaGlsZCkpCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J3F1ZXJ5TWF4UmVzdWx0cyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWF4UmVzdWx0cyA9IGludCh4bWx1dGlscy50ZXh0KGNoaWxkKSkKKyAgICAgICAgICAgICAgICBlbGlmIGNoaWxkLm5vZGVOYW1lID09IHUncXVlcnlLV1FTdHJpbmcnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmtleXdvcmRRdWVyeSA9IHhtbHV0aWxzLnRleHQoY2hpbGQpCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J3F1ZXJ5U2VsZWN0U2V0JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RzID0gX3BhcnNlUXVlcnlFbGVtZW50cyhjaGlsZCkKKyAgICAgICAgICAgICAgICBlbGlmIGNoaWxkLm5vZGVOYW1lID09IHUncXVlcnlGcm9tU2V0JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcm9tcyA9IF9wYXJzZVF1ZXJ5RWxlbWVudHMoY2hpbGQpCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J3F1ZXJ5V2hlcmVTZXQnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndoZXJlcyA9IF9wYXJzZVF1ZXJ5RWxlbWVudHMoY2hpbGQpCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC5ub2RlTmFtZSA9PSB1J3F1ZXJ5UmVzdWx0U2V0JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRTZXQgPSBRdWVyeVJlc3VsdChub2RlPWNoaWxkKQorICAgIAorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaGVhZGVyID0gY21wKHNlbGYuaGVhZGVyLCBvdGhlci5oZWFkZXIpCisgICAgICAgIGlmIGhlYWRlciA8IDA6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBoZWFkZXIgPT0gMDoKKyAgICAgICAgICAgIHJlc3VsdE1vZGVJRCA9IGNtcChzZWxmLnJlc3VsdE1vZGVJRCwgb3RoZXIucmVzdWx0TW9kZUlEKQorICAgICAgICAgICAgaWYgcmVzdWx0TW9kZUlEIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsaWYgcmVzdWx0TW9kZUlEID09IDA6CisgICAgICAgICAgICAgICAgcHJvcFR5cGUgPSBjbXAoc2VsZi5wcm9wVHlwZSwgb3RoZXIucHJvcFR5cGUpCisgICAgICAgICAgICAgICAgaWYgcHJvcFR5cGUgPCAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBlbGlmIHByb3BUeXBlID09IDA6CisgICAgICAgICAgICAgICAgICAgIHByb3BMZXZlbHMgPSBjbXAoc2VsZi5wcm9wTGV2ZWxzLCBvdGhlci5wcm9wTGV2ZWxzKQorICAgICAgICAgICAgICAgICAgICBpZiBwcm9wTGV2ZWxzIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgICAgICBlbGlmIHByb3BMZXZlbHMgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlc3VsdHMgPSBzZWxmLm1heFJlc3VsdHMgLSBvdGhlci5tYXhSZXN1bHRzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBtYXhSZXN1bHRzIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbWF4UmVzdWx0cyA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVBY2NlcHQgPSBjbXAoc2VsZi5taW1lQWNjZXB0LCBvdGhlci5taW1lQWNjZXB0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1pbWVBY2NlcHQgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG1pbWVBY2NlcHQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0cyA9IGNtcChzZWxmLnNlbGVjdHMsIG90aGVyLnNlbGVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGVjdHMgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZWN0cyA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbXMgPSBjbXAoc2VsZi5mcm9tcywgb3RoZXIuZnJvbXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmcm9tcyA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGZyb21zID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVzID0gY21wKHNlbGYud2hlcmVzLCBvdGhlci53aGVyZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2hlcmVzIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiB3aGVyZXMgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLnJlc3VsdFNldCwgb3RoZXIucmVzdWx0U2V0KQorICAgICAgICByZXR1cm4gMQorICAgIAorCitkZWYgX3BhcnNlUXVlcnlFbGVtZW50cyhub2RlKToKKyAgICAnJydUaGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIFhNTCBET00gbm9kZSBhcmUgYSBzZXF1ZW5jZSBvZiBxdWVyeUVsZW1lbnRzLiAgUGFyc2UgdGhlbQorICAgIGFuZCByZXR1cm4gYSBsaXN0IG9mIFF1ZXJ5RWxlbWVudCBvYmplY3RzLgorICAgICcnJworICAgIGEgPSBbXQorICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IHhtbC5kb20uTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICBhLmFwcGVuZChRdWVyeUVsZW1lbnQobm9kZT1jaGlsZCkpCisgICAgcmV0dXJuIGEKKyAgICAKKworZGVmIF9wYXJzZVF1ZXJ5KHMpOgorICAgICcnJ1BhcnNlIHRoZSBxdWVyeSBleHByZXNzaW9uIGluIGBzYC4KKyAgICAnJycKKyAgICBpZiBzIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBbXSwgW10KKyAgICBpZiBsZW4ocy5zdHJpcCgpKSA9PSAwOgorICAgICAgICByZXR1cm4gW10sIFtdCisgICAgaWYgcy5jb3VudCgnKCcpICE9IHMuY291bnQoJyknKToKKyAgICAgICAgcmFpc2UgRXhwcmVzc2lvblBhcnNlRXJyb3IoJ1VuYmFsYW5jZWQgcGFyZW50aGVzZXMnKQorICAgIHNjYW5uZXIgPSBfUXVlcnlFeHByZXNzaW9uU2Nhbm5lcihzKQorICAgIHJldHVybiBfYnVpbGRRdWVyeShzY2FubmVyKQorICAgIAorCitkZWYgX2J1aWxkUXVlcnkoc2Nhbm5lcik6CisgICAgJycnQnVpbGQgdGhlIHF1ZXJ5IHN0YWNrcyB1c2luZyB0aGUgZ2l2ZW4gYHNjYW5uZXJgLgorICAgICcnJworICAgIG9wZXJhdG9ycywgZXhwcmVzc2lvbiwgc2VsZWN0b3JzID0gW10sIFtdLCBbXQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRva2VuID0gc2Nhbm5lci5nZXRfdG9rZW4oKQorICAgICAgICBpZiB0b2tlbiBpcyBOb25lOiBicmVhaworICAgICAgICBpZiB0b2tlbiBpbiBfTE9HT1BTOgorICAgICAgICAgICAgb3AgPSBRdWVyeUVsZW1lbnQoJ0xPR09QJywgX0xPR09QU1t0b2tlbl0pCisgICAgICAgICAgICBpZiBsZW4ob3BlcmF0b3JzKSA9PSAwOgorICAgICAgICAgICAgICAgIG9wZXJhdG9ycy5hcHBlbmQob3ApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdoaWxlIGxlbihvcGVyYXRvcnMpID4gMCBhbmQgX1BSRUNFREVOQ0Vbb3BlcmF0b3JzWy0xXS52YWx1ZV0gPiBfUFJFQ0VERU5DRVtvcC52YWx1ZV06CisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uYXBwZW5kKG9wZXJhdG9ycy5wb3AoKSkKKyAgICAgICAgICAgICAgICBvcGVyYXRvcnMuYXBwZW5kKG9wKQorICAgICAgICBlbGlmIHRva2VuID09ICcoJzoKKyAgICAgICAgICAgIHN1YkV4cHIsIHN1YlNlbGVjdG9ycyA9IF9idWlsZFF1ZXJ5KHNjYW5uZXIpCisgICAgICAgICAgICBleHByZXNzaW9uLmV4dGVuZChzdWJFeHByKQorICAgICAgICAgICAgc2VsZWN0b3JzLmV4dGVuZChzdWJTZWxlY3RvcnMpCisgICAgICAgIGVsaWYgdG9rZW4gPT0gJyknOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9hZGRUZXJtKHRva2VuLCBzY2FubmVyLCBleHByZXNzaW9uLCBvcGVyYXRvcnMsIHNlbGVjdG9ycykKKyAgICBpZiBsZW4ob3BlcmF0b3JzKSA+IDAgYW5kIGxlbihleHByZXNzaW9uKSA9PSAwOgorICAgICAgICByYWlzZSBFeHByZXNzaW9uUGFyc2VFcnJvcignUXVlcnkgY29udGFpbnMgb25seSBsb2dpY2FsIG9wZXJhdG9ycycpCisgICAgb3BlcmF0b3JzLnJldmVyc2UoKQorICAgIGV4cHJlc3Npb24uZXh0ZW5kKG9wZXJhdG9ycykKKyAgICByZXR1cm4gZXhwcmVzc2lvbiwgc2VsZWN0b3JzCisgICAgCisKK2RlZiBfYWRkVGVybShlbGVtTmFtZSwgc2Nhbm5lciwgZXhwcmVzc2lvbiwgb3BlcmF0b3JzLCBzZWxlY3RvcnMpOgorICAgICcnJ0FkZCBhIHRlcm0gdG8gdGhlIGNvcnJlY3Qgc3RhY2suCisgICAgJycnCisgICAgcmVsb3AgPSBzY2FubmVyLmdldF90b2tlbigpCisgICAgaWYgcmVsb3AgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgRXhwcmVzc2lvblBhcnNlRXJyb3IoJ0V4cGVjdGVkIHJlbGF0aW9uYWwgb3BlcmF0b3IgYWZ0ZXIgZWxlbWVudCBuYW1lICIlcyInICUgZWxlbU5hbWUpCisgICAgaWYgcmVsb3Agbm90IGluIF9SRUxPUFM6CisgICAgICAgIHJhaXNlIEV4cHJlc3Npb25QYXJzZUVycm9yKCdVbmtub3duIHJlbGF0aW9uYWwgb3BlcmF0b3IgIiVzIicgJSByZWxvcCkKKyAgICBsaXRlcmFsID0gc2Nhbm5lci5nZXRfdG9rZW4oKQorICAgIGlmIGxpdGVyYWwgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgRXhwcmVzc2lvblBhcnNlRXJyb3IoJ0V4cGVjdGVkIGxpdGVyYWwgdmFsdWUgZm9yICIlcyAlcyIgY29tcGFyaXNvbicgJSAoZWxlbU5hbWUsIHJlbG9wKSkKKyAgICBpZiBlbGVtTmFtZSA9PSAnUkVUVVJOJzoKKyAgICAgICAgc2VsZWN0b3JzLmFwcGVuZChRdWVyeUVsZW1lbnQoJ2VsZW1OYW1lJywgbGl0ZXJhbCkpCisgICAgICAgIGlmIGxlbihvcGVyYXRvcnMpID4gMDoKKyAgICAgICAgICAgIG9wZXJhdG9ycy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2Nhbm5lci5nZXRfdG9rZW4oKQorICAgIGVsc2U6CisgICAgICAgIGV4cHJlc3Npb24uYXBwZW5kKFF1ZXJ5RWxlbWVudCgnZWxlbU5hbWUnLCBlbGVtTmFtZSkpCisgICAgICAgIGV4cHJlc3Npb24uYXBwZW5kKFF1ZXJ5RWxlbWVudCgnTElURVJBTCcsIGxpdGVyYWwpKQorICAgICAgICBleHByZXNzaW9uLmFwcGVuZChRdWVyeUVsZW1lbnQoJ1JFTE9QJywgX1JFTE9QU1tyZWxvcF0pKQorICAgIAorCisjIFNhbXBsZSBjb2RlOgorIyBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorIyAgIGltcG9ydCB1cmxsaWIsIHhtbC5kb20ubWluaWRvbQorIyAKKyMgICBpbXBsID0geG1sLmRvbS5taW5pZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkKKyMgICBkb2MgPSBpbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpICMgbnNVUkksIHFOYW1lLCBkb2NUeXBlCisjIAorIyAgIHEgPSBRdWVyeSgndHJhY2sgPSBJbm5vY2VudGUnKQorIyAgIG5vZGUgPSBxLnRvWE1MKGRvYykKKyMgICBkb2MuYXBwZW5kQ2hpbGQobm9kZSkKKyMgICBxID0gZG9jLnRveG1sKCkKKyMgICBmID0gdXJsbGliLnVybG9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wZHMvcHJvZicsIHVybGxpYi51cmxlbmNvZGUoZGljdCh4bWxxPXEpKSwge30pICMgdXJsLCBwb3N0ZGF0YSwgcHJveGllcyAobm9uZSkKKyMgICBwcmludCBmLnJlYWQoKQpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L29vZHQvdGVzdHMvX19pbml0X18ucHkgYi8wLjEwL2FnaWxpdHkvb29kdC90ZXN0cy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTM1MWUxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L29vZHQvdGVzdHMvX19pbml0X18ucHkKQEAgLTAsMCArMSwzOCBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnQWdpbGUgT09EVCBUZXN0cy4KKycnJworCitfX2RvY2Zvcm1hdF9fID0gJ3Jlc3RydWN0dXJlZHRleHQnCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHByb2ZpbGVUZXN0LCBxdWVyeVRlc3QsIHhtbHV0aWxzVGVzdAorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgICcnJ0NyZWF0ZSB0aGUgc3VpdGUgb2YgdGVzdHMuCisgICAgJycnCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QocHJvZmlsZVRlc3QudGVzdF9zdWl0ZSgpKQorICAgIHN1aXRlLmFkZFRlc3QocXVlcnlUZXN0LnRlc3Rfc3VpdGUoKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHhtbHV0aWxzVGVzdC50ZXN0X3N1aXRlKCkpCisgICAgcmV0dXJuIHN1aXRlCisgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCisgICAgCmRpZmYgLS1naXQgYS8wLjEwL2FnaWxpdHkvb29kdC90ZXN0cy9wcm9maWxlVGVzdC5weSBiLzAuMTAvYWdpbGl0eS9vb2R0L3Rlc3RzL3Byb2ZpbGVUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYmU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvb29kdC90ZXN0cy9wcm9maWxlVGVzdC5weQpAQCAtMCwwICsxLDIzOSBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnVW5pdCB0ZXN0cyBmb3IgdGhlIGBwcm9maWxlYCBtb2R1bGUuCisnJycKKworX19kb2Nmb3JtYXRfXyA9ICdyZXN0cnVjdHVyZWR0ZXh0JworCitpbXBvcnQgdW5pdHRlc3QsIHhtbC5kb20ubWluaWRvbQorZnJvbSBvb2R0LnByb2ZpbGUgaW1wb3J0IFByb2ZpbGVBdHRyaWJ1dGVzLCBSZXNvdXJjZUF0dHJpYnV0ZXMsIFByb2ZpbGUsIFVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQsIFJhbmdlZFByb2ZpbGVFbGVtZW50LFwKKyAgICBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQKKworY2xhc3MgUHJvZmlsZUF0dHJpYnV0ZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3QgZm9yIHRoZSBQcm9maWxlQXR0cmlidXRlcyBjbGFzcy4KKyAgICAnJycKKyAgICBkZWYgdGVzdERlZmF1bHRzKHNlbGYpOgorICAgICAgICAnJydUZXN0IHRvIHNlZSBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgcmVhc29uYWJsZS4KKyAgICAgICAgJycnCisgICAgICAgIHBhID0gUHJvZmlsZUF0dHJpYnV0ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnVU5LTk9XTicsIHBhLmlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnMS4wLjAnLCBwYS52ZXJzaW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygncHJvZmlsZScsIHBhLnR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhY3RpdmUnLCBwYS5zdGF0dXNJRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3VuY2xhc3NpZmllZCcsIHBhLnNlY3VyaXR5VHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ1VOS05PV04nLCBwYS5wYXJlbnRJRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHBhLmNoaWxkSURzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ1VOS05PV04nLCBwYS5yZWdBdXRob3JpdHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihwYS5yZXZOb3RlcykpCisKKyAgICBkZWYgdGVzdENtcChzZWxmKToKKyAgICAgICAgJycnVGVzdCBjb21wYXJpc29uIG9wZXJhdG9ycy4KKyAgICAgICAgJycnCisgICAgICAgIGEgPSBQcm9maWxlQXR0cmlidXRlcygnMScpCisgICAgICAgIGIgPSBQcm9maWxlQXR0cmlidXRlcygnMScpCisgICAgICAgIGMgPSBQcm9maWxlQXR0cmlidXRlcygnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGEsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGEsIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDw9IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDw9IGMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDwgYykKKyAgICAgICAgCisgICAgZGVmIHRlc3RYTUwoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgWE1MIHNlcmlhbGl6YXRpb24gYW5kIHJlLWNvbXBvc2l0aW9uIGZyb20gWE1MLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFByb2ZpbGVBdHRyaWJ1dGVzKCcxLjMuMS45JywgJzIuMC4wJywgJ3Byb2ZpbGUnLCAnaW5hY3RpdmUnLCAnY2xhc3NpZmllZCcsICcxLjMuMScsIFsnMS4zLjEuOS4xJywgJzEuMy4xLjkuMiddLAorICAgICAgICAgICAgJ05BU0EnLCBbJ1VwZGF0ZWQnLCAnQ3JlYXRlZCddKQorICAgICAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBub2RlID0gYS50b1hNTChkb2MpCisgICAgICAgIGIgPSBQcm9maWxlQXR0cmlidXRlcyhub2RlPW5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGEsIGIpCisgICAgICAgIAorICAgIGRlZiB0ZXN0WE1MVmFsaWRpdHkoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgdG8gc2VlIGlmIGFsbCByZXF1aXJlZCBYTUwgZWxlbWVudHMgYXJlIGluIHRoZXJlLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFByb2ZpbGVBdHRyaWJ1dGVzKCcxLjMuMS45JywgJzIuMC4wJywgJ3Byb2ZpbGUnLCAnaW5hY3RpdmUnLCAnY2xhc3NpZmllZCcsICcxLjMuMScsIFsnMS4zLjEuOS4xJywgJzEuMy4xLjkuMiddLAorICAgICAgICAgICAgJ05BU0EnLCBbJ1VwZGF0ZWQnLCAnQ3JlYXRlZCddKQorICAgICAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBub2RlID0gYS50b1hNTChkb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdwcm9mQXR0cmlidXRlcycsIG5vZGUubm9kZU5hbWUpCisgICAgICAgIGNoaWxkRWxlbWVudHMgPSBbbi5ub2RlTmFtZSBmb3IgbiBpbiBub2RlLmNoaWxkTm9kZXNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFt1J3Byb2ZJZCcsIHUncHJvZlZlcnNpb24nLCB1J3Byb2ZUeXBlJywgdSdwcm9mU3RhdHVzSWQnLCB1J3Byb2ZTZWN1cml0eVR5cGUnLCB1J3Byb2ZQYXJlbnRJZCcsCisgICAgICAgICAgICB1J3Byb2ZDaGlsZElkJywgdSdwcm9mQ2hpbGRJZCcsIHUncHJvZlJlZ0F1dGhvcml0eScsIHUncHJvZlJldmlzaW9uTm90ZScsIHUncHJvZlJldmlzaW9uTm90ZSddLAorICAgICAgICAgICAgY2hpbGRFbGVtZW50cykKKyAgICAKKyAgICBkZWYgdGVzdEluc3RhbmNlcyhzZWxmKToKKyAgICAgICAgJycnVGVzdCB0byBlbnN1cmUgaW5zdGFuY2VzIGRvbid0IHNoYXJlIGluc3RhbmNlIGRhdGEuCisgICAgICAgICcnJworICAgICAgICBhID0gUHJvZmlsZUF0dHJpYnV0ZXMoaWQ9JzEnKQorICAgICAgICBiID0gUHJvZmlsZUF0dHJpYnV0ZXMoaWQ9JzInKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhhLCBiKQorICAgICAgICBhLmNoaWxkSURzLmFwcGVuZCgnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGEuY2hpbGRJRHMsIGIuY2hpbGRJRHMpCisgICAgICAgIGEucmV2Tm90ZXMuYXBwZW5kKCdVaGhoaGgsIHNwYW0/JykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS5yZXZOb3RlcywgYi5yZXZOb3RlcykKKyAgICAKKyAgICAKK2NsYXNzIFJlc291cmNlQXR0cmlidXRlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1VuaXQgdGVzdCBmb3IgdGhlIFJlc291cmNlQXR0cmlidXRlcyBjbGFzcy4KKyAgICAnJycKKyAgICBkZWYgdGVzdERlZmF1bHRzKHNlbGYpOgorICAgICAgICAnJydUZXN0IGlmIGRlZmF1bHQgdmFsdWVzIGFyZSByZWFzb25hYmxlLgorICAgICAgICAnJycKKyAgICAgICAgcmEgPSBSZXNvdXJjZUF0dHJpYnV0ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnVU5LTk9XTicsIHJhLmlkZW50aWZpZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdVTktOT1dOJywgcmEudGl0bGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihyYS5mb3JtYXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ1VOS05PV04nLCByYS5kZXNjcmlwdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLmNyZWF0b3JzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLnN1YmplY3RzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLnB1Ymxpc2hlcnMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4ocmEuY29udHJpYnV0b3JzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLmRhdGVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLnR5cGVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLnNvdXJjZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4ocmEubGFuZ3VhZ2VzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLnJlbGF0aW9ucykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihyYS5jb3ZlcmFnZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4ocmEucmlnaHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLmNvbnRleHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ1VOS05PV04nLCByYS5hZ2dyZWdhdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ1VOS05PV04nLCByYS5yZXNDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJhLmxvY2F0aW9ucykpCisgICAgCisgICAgZGVmIHRlc3RDbXAoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgY29tcGFyaXNvbiBvcGVyYXRpb25zLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFJlc291cmNlQXR0cmlidXRlcygndXJpOmZpc2gnLCAnRmlzaCcsIFsndGV4dC9odG1sJ10sICdBIGJvb2sgYWJvdXQgZmlzaC4nKQorICAgICAgICBiID0gUmVzb3VyY2VBdHRyaWJ1dGVzKCd1cmk6ZmlzaCcsICdGaXNoJywgWyd0ZXh0L2h0bWwnXSwgJ0EgYm9vayBhYm91dCBmaXNoLicpCisgICAgICAgIGMgPSBSZXNvdXJjZUF0dHJpYnV0ZXMoJ3VyaTpjbGFtcycsICdDbGFtcycsIFsndGV4dC9odG1sJ10sICdBIGJvb2sgYWJvdXQgY2xhbXMuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYSwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPD0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPj0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPiBjKQorICAgICAgICBzZWxmLmFzc2VydF8oYSA8PSBhKQorICAgIAorICAgIGRlZiB0ZXN0WE1MKHNlbGYpOgorICAgICAgICAnJydUZXN0IFhNTCBzZXJpYWxpemF0aW9uIGFuZCByZWNvbXBvc2l0aW9uIGZyb20gWE1MLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFJlc291cmNlQXR0cmlidXRlcygndXJpOmZpc2gnLCAnRmlzaCcsIFsndGV4dC9odG1sJ10sICdBIGJvb2sgYWJvdXQgZmlzaC4nKQorICAgICAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBub2RlID0gYS50b1hNTChkb2MpCisgICAgICAgIGIgPSBSZXNvdXJjZUF0dHJpYnV0ZXMobm9kZT1ub2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhLCBiKQorICAgIAorICAgIGRlZiB0ZXN0WE1MVmFsaWRpdHkoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgdG8gc2VlIGlmIGFsbCByZXF1aXJlZCBYTUwgZWxlbWVudHMgYXJlIGluIHRoZXJlLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFJlc291cmNlQXR0cmlidXRlcygndXJpOmFudXMnLCAnQW51cycsIFsndGV4dC9odG1sJ10sICdUaGUgYW51cywgcmVjdHVtLCBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIGJ1bS4nLAorICAgICAgICAgICAgWydCdXR0bWFuJ10sIFsnYnV0dHMnLCAnaGVuaWVzJywgJ2Jvb3RpZXMnXSwgWydCdXR0cyBhbmQgQ28gUHVibGlzaGluZyddLCBbJ0RyIEV1Z2VuZSBCb3R0b21tYW4sIElJSSddLAorICAgICAgICAgICAgW10sIFsncmVmZXJlbmNlJ10sIFsnVGhlIEJpZyBCb29rIG9mIEJvb3R5J10sIFsnZW4nXSwgWydCdXR0aG9sZXMgYW5kIG90aGVyIG9kZGl0aWVzJ10sCisgICAgICAgICAgICBbJ2FuYXRvbXknXSwgWydDYW5ub3QgdG91Y2ggdGhpcyddLCBbJ3N5c3RlbS5idXR0U2VydmVyJ10sICdncmFudWxlJywgJ3N5c3RlbS5idXR0U2VydmVyJywKKyAgICAgICAgICAgIFsnaHR0cDovL2J1dHQuaW5mby9idXR0J10pCisgICAgICAgIGRvYyA9IHhtbC5kb20ubWluaWRvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIG5vZGUgPSBhLnRvWE1MKGRvYykKKyAgICAgICAgY2hpbGRFbGVtZW50cyA9IFtuLm5vZGVOYW1lIGZvciBuIGluIG5vZGUuY2hpbGROb2Rlc10gICAgICAgCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFt1J0lkZW50aWZpZXInLCB1J1RpdGxlJywgdSdGb3JtYXQnLCB1J0Rlc2NyaXB0aW9uJywgdSdDcmVhdG9yJywgdSdTdWJqZWN0JywgdSdTdWJqZWN0JywKKyAgICAgICAgICAgIHUnU3ViamVjdCcsIHUnUHVibGlzaGVyJywgdSdDb250cmlidXRvcicsIHUnVHlwZScsIHUnU291cmNlJywgdSdMYW5ndWFnZScsIHUnUmVsYXRpb24nLCB1J0NvdmVyYWdlJywKKyAgICAgICAgICAgIHUnUmlnaHRzJywgdSdyZXNDb250ZXh0JywgdSdyZXNBZ2dyZWdhdGlvbicsIHUncmVzQ2xhc3MnLCB1J3Jlc0xvY2F0aW9uJ10sIGNoaWxkRWxlbWVudHMpCisgICAgCisgICAgZGVmIHRlc3RJbnN0YW5jZXMoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgdG8gZW5zdXJlIGluc3RhbmNlcyBkb24ndCBzaGFyZSBpbnN0YW5jZSBkYXRhLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFJlc291cmNlQXR0cmlidXRlcygpCisgICAgICAgIGIgPSBSZXNvdXJjZUF0dHJpYnV0ZXMoKQorICAgICAgICBhLmZvcm1hdHMuYXBwZW5kKCd0ZXh0L3htbCcpCisgICAgICAgIGEuY3JlYXRvcnMuYXBwZW5kKCdEZW5uaXMgTW9vcmUnKQorICAgICAgICBhLnN1YmplY3RzLmFwcGVuZCgnU2lsbGluZXNzJykKKyAgICAgICAgYS5wdWJsaXNoZXJzLmFwcGVuZCgnQkJDJykKKyAgICAgICAgYS5jb250cmlidXRvcnMuYXBwZW5kKCdOaWdlbCcpCisgICAgICAgIGEudHlwZXMuYXBwZW5kKCdWaWRlbycpCisgICAgICAgIGEubGFuZ3VhZ2VzLmFwcGVuZCgnZW4nKQorICAgICAgICBhLnJlbGF0aW9ucy5hcHBlbmQoJ0Zhd2x0eSBUb3dlcnMnKQorICAgICAgICBhLmNvdmVyYWdlcy5hcHBlbmQoJzE5NzAnKQorICAgICAgICBhLnJpZ2h0cy5hcHBlbmQoJ0FidXNlZCcpCisgICAgICAgIGEuY29udGV4dHMuYXBwZW5kKCdodW1vcicpCisgICAgICAgIGEubG9jYXRpb25zLmFwcGVuZCgnaHR0cDovL2JiYy5jby51ay8nKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhhLmZvcm1hdHMsIGIuZm9ybWF0cykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS5jcmVhdG9ycywgYi5jcmVhdG9ycykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS5zdWJqZWN0cywgYi5zdWJqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS5wdWJsaXNoZXJzLCBiLnB1Ymxpc2hlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGEuY29udHJpYnV0b3JzLCBiLmNvbnRyaWJ1dG9ycykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS50eXBlcywgYi50eXBlcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS5sYW5ndWFnZXMsIGIubGFuZ3VhZ2VzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhhLnJlbGF0aW9ucywgYi5yZWxhdGlvbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGEuY292ZXJhZ2VzLCBiLmNvdmVyYWdlcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoYS5yaWdodHMsIGIucmlnaHRzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhhLmNvbnRleHRzLCBiLmNvbnRleHRzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhhLmxvY2F0aW9ucywgYi5sb2NhdGlvbnMpCisgICAgCisKK2NsYXNzIFByb2ZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3QgZm9yIGNsYXNzIFByb2ZpbGUuCisgICAgJycnCisgICAgZGVmIHRlc3RDbXAoc2VsZik6CisgICAgICAgIGEgPSBQcm9maWxlKCkKKyAgICAgICAgYiA9IFByb2ZpbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhLCBiKQorICAgICAgICAKKyAgICBkZWYgdGVzdFhNTChzZWxmKToKKyAgICAgICAgJycnVGVzdCBYTUwgc2VyaWFsaXphdGlvbiBhbmQgcmVjb21wb3NpdGlvbiBmcm9tIFhNTC4KKyAgICAgICAgJycnCisgICAgICAgIGEgPSBQcm9maWxlKCkKKyAgICAgICAgZG9jID0geG1sLmRvbS5taW5pZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgbm9kZSA9IGEudG9YTUwoZG9jKQorICAgICAgICBiID0gUHJvZmlsZShub2RlPW5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGEsIGIpCisKKyAgICAgICAgeCA9IFVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQoJ3Rhc3RpbmVzcycsICdIb3cgdGFzdHkgaXQgd2FzJywgJ2NoYXInLCAnc3ViamVjdGl2ZScsIFsneXVtbWluZXNzJ10sCisgICAgICAgICAgICAnVGhpcyBpcyBoaWdobHkgc3ViamVjdGl2ZS4nKQorICAgICAgICB5ID0gRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KCdtZWFsJywgJ1doYXQgbWVhbCB3YXMgZWF0ZW4nLCAnY2hhcicsICdtZWFsJywgWydzZXJ2aW5nJ10sICdUeXBpY2FsIHZhbHVlcycsCisgICAgICAgICAgICBbJ0JyZWFrZmFzdCcsICdCcnVuY2gnLCAnTHVuY2gnLCAnRGlubmVyJ10pCisgICAgICAgIHogPSBSYW5nZWRQcm9maWxlRWxlbWVudCgnc3BpY3luZXNzJywgJ0hvdyBzcGljeSBpdCB3YXMnLCAnZmxvYXQnLCAnc2NvdmlsbGVzJywgWydwaXF1YW5jeSddLAorICAgICAgICAgICAgJ0hvdHRlciB0aGUgYmV0dGVyLCBJIHNheScsIDAuMCwgMTAwMDAwMC4wKQorICAgICAgICBhLnByb2ZFbGVtZW50c1sndGFzdGluZXNzJ10sIGEucHJvZkVsZW1lbnRzWydtZWFsJ10sIGEucHJvZkVsZW1lbnRzWydzcGljeW5lc3MnXSA9IHgsIHksIHoKKyAgICAgICAgbm9kZSA9IGEudG9YTUwoZG9jKQorICAgICAgICBiID0gUHJvZmlsZShub2RlPW5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGEsIGIpCisKKyAgICBkZWYgdGVzdEluc3RhbmNlcyhzZWxmKToKKyAgICAgICAgJycnVGVzdCB0byBlbnN1cmUgaXNudGFuY2VzIGRvbid0IHNoYXJlIGlzbnRhbmNlIGRhdGEuCisgICAgICAgICcnJworICAgICAgICBhID0gUHJvZmlsZSgpCisgICAgICAgIGIgPSBQcm9maWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYSwgYikKKyAgICAgICAgYS5wcm9mRWxlbWVudHNbJ2EnXSA9ICdiJworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhhLCBiKQorICAgIAorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgICcnJ01ha2UgdGhlIHRlc3Qgc3VpdGUuCisgICAgJycnCisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoUHJvZmlsZUF0dHJpYnV0ZXNUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZXNvdXJjZUF0dHJpYnV0ZXNUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShQcm9maWxlVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS8wLjEwL2FnaWxpdHkvb29kdC90ZXN0cy9xdWVyeVRlc3QucHkgYi8wLjEwL2FnaWxpdHkvb29kdC90ZXN0cy9xdWVyeVRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkNmYzMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYWdpbGl0eS9vb2R0L3Rlc3RzL3F1ZXJ5VGVzdC5weQpAQCAtMCwwICsxLDM0MSBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnVW5pdCB0ZXN0cyBmb3IgdGhlIHF1ZXJ5IG1vZHVsZS4KKworVGhpcyBtb2R1bGUgdGVzdHMgdmFyaW91cyBxdWVyeSBjbGFzc2VzIGFuZCB0aGUgcXVlcnkgZXhwcmVzc2lvbiBwYXJzZXIuCisnJycKKworX19kb2Nmb3JtYXRfXyA9ICdyZXN0cnVjdHVyZWR0ZXh0JworCitpbXBvcnQgdW5pdHRlc3QsIHhtbC5kb20sIG9vZHQueG1sdXRpbHMKK2Zyb20gb29kdC5xdWVyeSBpbXBvcnQgUXVlcnlFbGVtZW50LCBRdWVyeUhlYWRlciwgUXVlcnlSZXN1bHQsIFF1ZXJ5LCBfcGFyc2VRdWVyeSwgRXhwcmVzc2lvblBhcnNlRXJyb3IKKworY2xhc3MgUXVlcnlFbGVtZW50VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVGVzdCB0aGUgYFF1ZXJ5RWxlbWVudGAgY2xhc3MuCisgICAgJycnCisgICAgZGVmIHRlc3REZWZhdWx0cyhzZWxmKToKKyAgICAgICAgJycnVGVzdCB0byBzZWUgaWYgZGVmYXVsdHMgYXJlIHJlYXNvbmFibGUuCisgICAgICAgICcnJworICAgICAgICBxZSA9IFF1ZXJ5RWxlbWVudCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VOS05PV04nLCBxZS5yb2xlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVTktOT1dOJywgcWUudmFsdWUpCisKKyAgICBkZWYgdGVzdEFyZ3Moc2VsZik6CisgICAgICAgICcnJ1Rlc3QgdG8gc2VlIGlmIGluaXRpYWxpemVyIGFyZ3VtZW50cyBhcmUgdXNlZC4KKyAgICAgICAgJycnCisgICAgICAgIHFlID0gUXVlcnlFbGVtZW50KHJvbGU9J3JvbGUnLCB2YWx1ZT0ndmFsdWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdyb2xlJywgcWUucm9sZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgndmFsdWUnLCBxZS52YWx1ZSkKKyAgICAKKyAgICBkZWYgdGVzdENvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICAnJydUZXN0IGNvbXBhcmlzb24gb3BlcmF0b3JzLgorICAgICAgICAnJycKKyAgICAgICAgYSA9IFF1ZXJ5RWxlbWVudCgnYScsICcxJykKKyAgICAgICAgYiA9IFF1ZXJ5RWxlbWVudCgnYScsICcxJykKKyAgICAgICAgYyA9IFF1ZXJ5RWxlbWVudCgnYicsICcxJykKKyAgICAgICAgZCA9IFF1ZXJ5RWxlbWVudCgnYScsICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBjKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGMsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkLCBhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGMsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDw9IGMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIDwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPD0gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPCBkKQorICAgIAorICAgIGRlZiB0ZXN0QmFkQXJncyhzZWxmKToKKyAgICAgICAgJycnVGVzdCByZWFjdGlvbnMgdG8gYmFkIGFydWdtZW50cy4KKyAgICAgICAgJycnCisgICAgICAgIGRvbUltcGwgPSB4bWwuZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkKKyAgICAgICAgZG9jID0gZG9tSW1wbC5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKSAjIG5hbWVzcGFjZSBVUkksIHF1YWxpZmllZCBOYW1lLCBkb2N0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFF1ZXJ5RWxlbWVudCwgbm9kZT1kb2MuY3JlYXRlRWxlbWVudCgnbm90QVF1ZXJ5RWxlbWVudCcpKQorICAgIAorICAgIGRlZiB0ZXN0WE1MKHNlbGYpOgorICAgICAgICAnJydUZXN0IFhNTCBzZXJpYWxpemF0aW9uLgorICAgICAgICAnJycKKyAgICAgICAgZG9tSW1wbCA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgICAgICBkb2MgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpICMgbmFtZXNwYWNlIFVSSSwgcXVhbGlmaWVkIE5hbWUsIGRvY3R5cGUKKyAgICAgICAgcTEgPSBRdWVyeUVsZW1lbnQocm9sZT0nYScsIHZhbHVlPScxJykKKyAgICAgICAgcm9vdCA9IHExLnRvWE1MKGRvYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgncXVlcnlFbGVtZW50Jywgcm9vdC5ub2RlTmFtZSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHJvb3QuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGlmICd0b2tlblJvbGUnID09IGNoaWxkLm5vZGVOYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhJywgb29kdC54bWx1dGlscy50ZXh0KGNoaWxkKSkKKyAgICAgICAgICAgIGVsaWYgJ3Rva2VuVmFsdWUnID09IGNoaWxkLm5vZGVOYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCcxJywgb29kdC54bWx1dGlscy50ZXh0KGNoaWxkKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdVbmtub3duIG5vZGUgIicgKyBjaGlsZC5ub2RlTmFtZSArICciIGluIFhNTCByZXN1bHQnKQorCisgICAgICAgIHEyID0gUXVlcnlFbGVtZW50KG5vZGU9cm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxMSwgcTIpCisKKyAgICAgICAgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCdxdWVyeUVsZW1lbnQnKQorICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdCkKKyAgICAgICAgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0b2tlblJvbGUnKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGVsZW0pCisgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCdhJykpCisgICAgICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgndG9rZW5WYWx1ZScpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZWxlbSkKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoJzInKSkKKyAgICAgICAgcTMgPSBRdWVyeUVsZW1lbnQobm9kZT1yb290KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHExLCBxMykKKyAgICAKKworX1FVRVJZX0hFQURFUl9BVFRSUyA9IHsKKyAgICAncXVlcnlJZCc6ICdpZCcsCisgICAgJ3F1ZXJ5VGl0bGUnOiAndGl0bGUnLAorICAgICdxdWVyeURlc2MnOiAnZGVzYycsCisgICAgJ3F1ZXJ5VHlwZSc6ICd0eXBlJywKKyAgICAncXVlcnlTdGF0dXNJZCc6ICdzdGF0dXMnLAorICAgICdxdWVyeVNlY3VyaXR5VHlwZSc6ICdzZWN1cml0eScsCisgICAgJ3F1ZXJ5UmV2aXNpb25Ob3RlJzogJ3JldicsCisgICAgJ3F1ZXJ5RGF0YURpY3RJZCc6ICdkYXRhRGljdCcKK30KKworY2xhc3MgUXVlcnlIZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3QgZm9yIHRoZSBgUXVlcnlIZWFkZXJgIGNsYXNzLgorICAgICcnJworICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgaWYgZGVmYXVsdHMgYXJlIHJlYXNvbmFibGUuCisgICAgICAgICcnJworICAgICAgICBxaCA9IFF1ZXJ5SGVhZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVU5LTk9XTicsIHFoLmlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVTktOT1dOJywgcWgudGl0bGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VOS05PV04nLCBxaC5kZXNjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdRVUVSWScsIHFoLnR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0FDVElWRScsIHFoLnN0YXR1cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVU5LTk9XTicsIHFoLnNlY3VyaXR5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcyMDA1LTEwLTAxIFNDSyB2MC4wLjAgVW5kZXIgRGV2ZWxvcG1lbnQnLCBxaC5yZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VOS05PV04nLCBxaC5kYXRhRGljdCkKKworICAgIGRlZiB0ZXN0QXJncyhzZWxmKToKKyAgICAgICAgJycnVGVzdCBpZiBpbml0aWFsaXplciBhcmd1bWVudHMgYXJlIHVzZWQuCisgICAgICAgICcnJworICAgICAgICBxaCA9IFF1ZXJ5SGVhZGVyKCdpZCcsICd0aXRsZScsICdkZXNjJywgJ3R5cGUnLCAnc3RhdHVzJywgJ3NlY3VyaXR5JywgJ3JldicsICdkYXRhRGljdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocWguaWQsICdpZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocWgudGl0bGUsICd0aXRsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocWguZGVzYywgJ2Rlc2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHFoLnR5cGUsICd0eXBlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxaC5zdGF0dXMsICdzdGF0dXMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHFoLnNlY3VyaXR5LCAnc2VjdXJpdHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHFoLnJldiwgJ3JldicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocWguZGF0YURpY3QsICdkYXRhRGljdCcpCisKKyAgICBkZWYgdGVzdEJhZEFyZ3Moc2VsZik6CisgICAgICAgICcnJ1Rlc3QgcmVhY3Rpb24gdG8gYmFkIGFyZ3VtZW50cy4KKyAgICAgICAgJycnCisgICAgICAgIGRvbUltcGwgPSB4bWwuZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkKKyAgICAgICAgZG9jID0gZG9tSW1wbC5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKSAjIG5hbWVzcGFjZSBVUkksIHF1YWxpZmllZCBOYW1lLCBkb2N0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFF1ZXJ5SGVhZGVyLCBub2RlPWRvYy5jcmVhdGVFbGVtZW50KCdub3RBUXVlcnlIZWFkZXInKSkKKworICAgIGRlZiB0ZXN0WE1MKHNlbGYpOgorICAgICAgICAnJydUZXN0IFhNTCBzZXJpYWxpemF0aW9uLgorICAgICAgICAnJycKKyAgICAgICAgZG9tSW1wbCA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgICAgICBkb2MgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpICMgbmFtZXNwYWNlIFVSSSwgcXVhbGlmaWVkIE5hbWUsIGRvY3R5cGUKKyAgICAgICAgcTEgPSBRdWVyeUhlYWRlcignaWQnLCAndGl0bGUnLCAnZGVzYycsICd0eXBlJywgJ3N0YXR1cycsICdzZWN1cml0eScsICdyZXYnLCAnZGF0YURpY3QnKQorICAgICAgICByb290ID0gcTEudG9YTUwoZG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdxdWVyeUF0dHJpYnV0ZXMnLCByb290Lm5vZGVOYW1lKQorICAgICAgICBmb3IgY2hpbGQgaW4gcm9vdC5jaGlsZE5vZGVzOgorICAgICAgICAgICAgc2VsZi5jaGVjayhjaGlsZC5ub2RlTmFtZSwgb29kdC54bWx1dGlscy50ZXh0KGNoaWxkKSkKKyAgICAgICAgcTIgPSBRdWVyeUhlYWRlcihub2RlPXJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocTEsIHEyKQorCisgICAgZGVmIGNoZWNrKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgJycnQ2hlY2sgaWYgdGhlIGdpdmVuIHRhZyBuYW1lIGlzIHZhbGlkLgorICAgICAgICAnJycKKyAgICAgICAgaWYgbmFtZSBpbiBfUVVFUllfSEVBREVSX0FUVFJTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgX1FVRVJZX0hFQURFUl9BVFRSU1tuYW1lXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZhaWwoJ1Vua25vd24gZWxlbWVudCAnICsgbmFtZSArICcgaW4gcXVlcnkgaGVhZGVyJykKKyAgICAKKworY2xhc3MgUXVlcnlSZXN1bHRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3QgZm9yIHRoZSBgUXVlcnlSZXN1bHRzYCBjbGFzcy4KKyAgICAnJycKKyAgICBkZWYgdGVzdERlZmF1bHRzKHNlbGYpOgorICAgICAgICAnJydUZXN0IGlmIGRlZmF1bHRzIGFyZSByZWFzb25hYmxlLgorICAgICAgICAnJycKKyAgICAgICAgcXIgPSBRdWVyeVJlc3VsdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihxci5yZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcXIuX19nZXRpdGVtX18sIDApCisKKyAgICBkZWYgdGVzdEJhZEFyZ3Moc2VsZik6CisgICAgICAgICcnJ1Rlc3QgcmVhY3Rpb24gdG8gYmFkIGFyZ3VtZW50cy4KKyAgICAgICAgJycnCisgICAgICAgIGRvbUltcGwgPSB4bWwuZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkKKyAgICAgICAgZG9jID0gZG9tSW1wbC5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKSAjIG5hbWVzcGFjZSBVUkksIHF1YWxpZmllZCBOYW1lLCBkb2N0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFF1ZXJ5UmVzdWx0LCBub2RlPWRvYy5jcmVhdGVFbGVtZW50KCdub3RBUXVlcnlSZXN1bHQnKSkKKworICAgIGRlZiB0ZXN0WE1MKHNlbGYpOgorICAgICAgICAnJydUZXN0IFhNTCBzZXJpYWxpemF0aW9uLgorICAgICAgICAnJycKKyAgICAgICAgZG9tSW1wbCA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgICAgICBkb2MgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpICMgbmFtZXNwYWNlIFVSSSwgcXVhbGlmaWVkIE5hbWUsIGRvY3R5cGUKKyAgICAgICAgcTEgPSBRdWVyeVJlc3VsdCgpCisgICAgICAgIHJvb3QgPSBxMS50b1hNTChkb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3F1ZXJ5UmVzdWx0U2V0Jywgcm9vdC5ub2RlTmFtZSkKKyAgICAgICAgcTIgPSBRdWVyeVJlc3VsdChub2RlPXJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocTEsIHEyKQorICAgIAorCitjbGFzcyBRdWVyeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1VuaXQgdGVzdCBmb3IgdGhlIGBRdWVyeWAgY2xhc3MuCisgICAgJycnCisgICAgZGVmIHRlc3REZWZhdWx0cyhzZWxmKToKKyAgICAgICAgJycnVGVzdCBpZiBkZWZhdWx0cyBhcmUgcmVhc29uYWJsZS4KKyAgICAgICAgJycnCisgICAgICAgIHEgPSBRdWVyeSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUXVlcnlIZWFkZXIoKSwgcS5oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0FUVFJJQlVURScsIHEucmVzdWx0TW9kZUlEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdCUk9BRENBU1QnLCBxLnByb3BUeXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdOL0EnLCBxLnByb3BMZXZlbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcS5tYXhSZXN1bHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihxLm1pbWVBY2NlcHQpKQorCisgICAgZGVmIHRlc3RQYXJzZXIoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgdGhlIHF1ZXJ5IGV4cHJlc2lvbiBwYXJzZXIuCisgICAgICAgICcnJworICAgICAgICAjIEVtcHR5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKFtdLCBbXSksIF9wYXJzZVF1ZXJ5KCcnKSkKKyAgICAgICAgCisgICAgICAgICMgU2ltcGxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKFsgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3gnKSwgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nMScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J1JFTE9QJywgdmFsdWU9J0VRJykgXSwgW10pLCBfcGFyc2VRdWVyeSgneCA9IDEnKSkKKworICAgICAgICAjIExvZ2ljYWwgb3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoWyBRdWVyeUVsZW1lbnQocm9sZT0nZWxlbU5hbWUnLCB2YWx1ZT0neCcpLCBRdWVyeUVsZW1lbnQocm9sZT0nTElURVJBTCcsIHZhbHVlPScxJyksICAgICAgCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nTFQnKSwgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3knKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9Jy0yJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdHVCcpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xPR09QJywgdmFsdWU9J09SJykgXSwgW10pLCBfcGFyc2VRdWVyeSgneCA8IDEgb3IgeSA+IC0yJykpCisKKyAgICAgICAgIyBMb2dpY2FsIGFuZCBoYXMgaGlnaGVyIHByZWNlbmRlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKFsgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3gnKSwgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nMScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J1JFTE9QJywgdmFsdWU9J0xFJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd5JyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTElURVJBTCcsIHZhbHVlPScyJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdHRScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3onKSwgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nLTMuOTYnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdORScpLCBRdWVyeUVsZW1lbnQocm9sZT0nTE9HT1AnLCB2YWx1ZT0nQU5EJyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTE9HT1AnLCB2YWx1ZT0nT1InKSBdLCBbXSksIF9wYXJzZVF1ZXJ5KCd4IDw9IDEgfCB5ID49IDIgYW5kIHogIT0gLTMuOTYnKSkKKyAgICAgICAgCisgICAgICAgICMgTG9naWNhbCBvciBoYXMgbG93ZXIgcHJlY2VkZW5jZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChbIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd4JyksIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9JzEnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdMVCcpLCBRdWVyeUVsZW1lbnQocm9sZT0nZWxlbU5hbWUnLCB2YWx1ZT0neScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nMicpLCBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nR1QnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMT0dPUCcsIHZhbHVlPSdBTkQnKSwgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3onKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9JzMnKSwgUXVlcnlFbGVtZW50KHJvbGU9J1JFTE9QJywgdmFsdWU9J05FJyksIAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xPR09QJywgdmFsdWU9J09SJykgXSwgW10pLCBfcGFyc2VRdWVyeSgneCBMVCAxICYgeSBHVCAyIG9yIHogTkUgMycpKQorCisgICAgICAgICMgUGFyZW50aGVzaXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoWyBRdWVyeUVsZW1lbnQocm9sZT0nZWxlbU5hbWUnLCB2YWx1ZT0neCcpLCBRdWVyeUVsZW1lbnQocm9sZT0nTElURVJBTCcsIHZhbHVlPScxJyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nTEUnKSwgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3knKSwgXAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nMicpLCBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nR0UnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMT0dPUCcsIHZhbHVlPSdPUicpLCBRdWVyeUVsZW1lbnQocm9sZT0nZWxlbU5hbWUnLCB2YWx1ZT0neicpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nMycpLCBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nRVEnKSwgCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTE9HT1AnLCB2YWx1ZT0nQU5EJykgXSwgW10pLCBfcGFyc2VRdWVyeSgnKHggTEUgMSBvciB5IEdFIDIpIGFuZCB6IEVRIDMnKSkKKworICAgICAgICAjIExvZ2ljYWwgbm90CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKFsgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3gnKSwgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nMScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J1JFTE9QJywgdmFsdWU9J0xFJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd5JyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTElURVJBTCcsIHZhbHVlPScyJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdHRScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xPR09QJywgdmFsdWU9J09SJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdMT0dPUCcsIHZhbHVlPSdOT1QnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd6JyksIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9JzMnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdFUScpLCBRdWVyeUVsZW1lbnQocm9sZT0nTE9HT1AnLCB2YWx1ZT0nTk9UJyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTE9HT1AnLCB2YWx1ZT0nQU5EJykgXSwgW10pLCBfcGFyc2VRdWVyeSgnbm90ICh4IExFIDEgb3IgeSBHRSAyKSBhbmQgISB6IEVRIDMnKSkKKworICAgICAgICAjIFF1b3RlZCBzdHJpbmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKFsgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3gnKSwgUXVlcnlFbGVtZW50KHJvbGU9J0xJVEVSQUwnLCB2YWx1ZT0nRmlzaCBQb29wJyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nRVEnKSwgUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J3knKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9J01vbmtleSBQb29wJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdSRUxPUCcsIHZhbHVlPSdFUScpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J0xPR09QJywgdmFsdWU9J0FORCcpIF0sIFtdKSwKKyAgICAgICAgICAgIF9wYXJzZVF1ZXJ5KCIiInggPSAiRmlzaCBQb29wIiBhbmQgeSA9ICdNb25rZXkgUG9vcCciIiIpKQorICAgICAgICAgICAgICAgIAorICAgICAgICAjIFJFVFVSTiBlbGVtZW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChbIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd4JyksIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9J0Zpc2ggUG9vcCcpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J1JFTE9QJywgdmFsdWU9J0VRJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd5JyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTElURVJBTCcsIHZhbHVlPSdNb25rZXkgUG9vcCcpLCBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nRVEnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMT0dPUCcsIHZhbHVlPSdBTkQnKSBdLCBbUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J2Zpc2gnKV0pLAorICAgICAgICAgICAgX3BhcnNlUXVlcnkoIiIieCA9ICJGaXNoIFBvb3AiIGFuZCBSRVRVUk4gPiBmaXNoIGFuZCB5ID0gJ01vbmtleSBQb29wJyIiIikpCisgICAgICAgIAorICAgICAgICAjIFJFVFVSTiBhdCBiZWdpbm5pbmcgYW5kIG1pZGRsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChbIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd4JyksIFF1ZXJ5RWxlbWVudChyb2xlPSdMSVRFUkFMJywgdmFsdWU9J0Zpc2ggUG9vcCcpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KHJvbGU9J1JFTE9QJywgdmFsdWU9J0VRJyksIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSd5JyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQocm9sZT0nTElURVJBTCcsIHZhbHVlPSdNb25rZXkgUG9vcCcpLCBRdWVyeUVsZW1lbnQocm9sZT0nUkVMT1AnLCB2YWx1ZT0nRVEnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdMT0dPUCcsIHZhbHVlPSdBTkQnKSBdLCBbUXVlcnlFbGVtZW50KHJvbGU9J2VsZW1OYW1lJywgdmFsdWU9J2Zpc2gnKSwKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudChyb2xlPSdlbGVtTmFtZScsIHZhbHVlPSdwb29wJyldKSwKKyAgICAgICAgICAgIF9wYXJzZVF1ZXJ5KCIiIlJFVFVSTiA8IGZpc2ggYW5kIHggPSAiRmlzaCBQb29wIiBhbmQgUkVUVVJOID4gcG9vcCBhbmQgeSA9ICdNb25rZXkgUG9vcCciIiIpKQorICAgICAgICAgICAgCisgICAgICAgICMgQmFkIGV4cHJlc3Npb25zCisgICAgICAgIGZvciBleHByIGluICgnaGV5YScsICdSRVRVUk4gPScsICdBTkQnLCAnTEFUIH4gZmlzaCcsICdOT1QnLCAnKCcsICcpJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeHByZXNzaW9uUGFyc2VFcnJvciwgX3BhcnNlUXVlcnksIGV4cHIpCisgICAgICAgICAgICAKKyAgICAgICAgIyBVbnVzdWFsIHN5bWJvbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoW1F1ZXJ5RWxlbWVudCgnZWxlbU5hbWUnLCAnREFUQV9TRVRfSUQnKSwgUXVlcnlFbGVtZW50KCdMSVRFUkFMJywgJ0FSQ0ItTC1SVExTLTMtNzBDTS1WMS4wJyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQoJ1JFTE9QJywgJ0VRJyldLCBbXSksIF9wYXJzZVF1ZXJ5KCcnJ0RBVEFfU0VUX0lEID0gQVJDQi1MLVJUTFMtMy03MENNLVYxLjAnJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChbUXVlcnlFbGVtZW50KCdlbGVtTmFtZScsICdmaWxlJyksIFF1ZXJ5RWxlbWVudCgnTElURVJBTCcsICcvdXNyL2xvY2FsL2Jpbi9wb29wJyksCisgICAgICAgICAgICBRdWVyeUVsZW1lbnQoJ1JFTE9QJywgJ0VRJyldLCBbXSksIF9wYXJzZVF1ZXJ5KCcnJ2ZpbGUgPSAvdXNyL2xvY2FsL2Jpbi9wb29wJycnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoW1F1ZXJ5RWxlbWVudCgnZWxlbU5hbWUnLCAnc3RhcnRfdGltZScpLCBRdWVyeUVsZW1lbnQoJ0xJVEVSQUwnLCAnMjAwNi0wMi0wNlQxMzoxMjoxMycpLAorICAgICAgICAgICAgUXVlcnlFbGVtZW50KCdSRUxPUCcsICdFUScpXSwgW10pLCBfcGFyc2VRdWVyeSgnJydzdGFydF90aW1lID0gMjAwNi0wMi0wNlQxMzoxMjoxMycnJykpCisgICAgCisgICAgZGVmIHRlc3RDbXAoc2VsZik6CisgICAgICAgICcnJ1Rlc3QgY29tcGFyaXNvbiBvcGVyYXRvcnMuCisgICAgICAgICcnJworICAgICAgICBhID0gUXVlcnkoJ2xhdCA+IDMgYW5kIGxvbiA8IC05Mi42JykKKyAgICAgICAgYiA9IFF1ZXJ5KCdsYXQgPiAzIGFuZCBsb24gPCAtOTIuNicpCisgICAgICAgIGMgPSBRdWVyeSgnbGF0IDwgMyBhbmQgbG9uID4gLTkyLjYnKQorICAgICAgICBzZWxmLmFzc2VydF8oYSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydF8oYSA9PSBiKQorICAgICAgICBzZWxmLmFzc2VydF8oYSA8IGMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjID4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPD0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPj0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgPD0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGMgPj0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGMgIT0gYSkKKworICAgIGRlZiB0ZXN0WE1MKHNlbGYpOgorICAgICAgICAnJydUZXN0IFhNTCBzZXJpYWxpemF0aW9uLgorICAgICAgICAnJycKKyAgICAgICAgZG9tSW1wbCA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgICAgICBkb2MgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpICMgbmFtZXNwYWNlIFVSSSwgcXVhbGlmaWVkIE5hbWUsIGRvY3R5cGUKKyAgICAgICAgcTEgPSBRdWVyeSgnbGF0ID4gMyBhbmQgbG9uIDwgLTkyLjYnKQorICAgICAgICByb290ID0gcTEudG9YTUwoZG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdxdWVyeScsIHJvb3Qubm9kZU5hbWUpCisgICAgICAgIHEyID0gUXVlcnkobm9kZT1yb290KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHExLCBxMikKKyAgICAKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICAnJydDcmVhdGUgdGhlIHN1aXRlIG9mIHRlc3RzLgorICAgICcnJworICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShRdWVyeUVsZW1lbnRUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShRdWVyeUhlYWRlclRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFF1ZXJ5UmVzdWx0VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoUXVlcnlUZXN0KSkKKyAgICByZXR1cm4gc3VpdGUKKyAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKKyAgICAKZGlmZiAtLWdpdCBhLzAuMTAvYWdpbGl0eS9vb2R0L3Rlc3RzL3htbHV0aWxzVGVzdC5weSBiLzAuMTAvYWdpbGl0eS9vb2R0L3Rlc3RzL3htbHV0aWxzVGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY2NGE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L29vZHQvdGVzdHMveG1sdXRpbHNUZXN0LnB5CkBAIC0wLDAgKzEsMTA5IEBACisjIGVuY29kaW5nOiB1dGYtOAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisnJydVbml0IHRlc3RzIGZvciB0aGUgYHhtbHV0aWxzYCBtb2R1bGUuCisnJycKKworX19kb2Nmb3JtYXRfXyA9ICdyZXN0cnVjdHVyZWR0ZXh0JworCitpbXBvcnQgdW5pdHRlc3QsIHhtbC5kb20sIG9vZHQueG1sdXRpbHMKK2Zyb20gb29kdC54bWx1dGlscyBpbXBvcnQgRG9jdW1lbnRhYmxlRmllbGQKKworY2xhc3MgWE1MVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVW5pdCB0ZXN0IHRoZSBYTUwgdXRpbGl0aWVzLgorICAgICcnJworICAgIGRlZiB0ZXN0VGV4dChzZWxmKToKKyAgICAgICAgJycnVGVzdCBnZXR0aW5nIHRleHQgZnJvbSBub2Rlcy4KKyAgICAgICAgJycnCisgICAgICAgIGRvbUltcGwgPSB4bWwuZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkKKyAgICAgICAgZG9jID0gZG9tSW1wbC5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKSAjIG5zIFVSSSwgcXVhbCBuYW1lLCBkb2N0eXBlCisgICAgICAgIHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgncm9vdCcpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCdIZWxsbycpKQorICAgICAgICBjaGlsZCA9IGRvYy5jcmVhdGVFbGVtZW50KCdjaGlsZCcpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoY2hpbGQpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbignd29ybGQnKSkKKyAgICAgICAgY2hpbGQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCdjcnVlbCcpKQorICAgICAgICBlbXB0eSA9IGRvYy5jcmVhdGVFbGVtZW50KCdlbXB0eScpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZW1wdHkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2NydWVsJywgb29kdC54bWx1dGlscy50ZXh0KGNoaWxkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKG9vZHQueG1sdXRpbHMudGV4dChlbXB0eSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnSGVsbG9jcnVlbHdvcmxkJywgb29kdC54bWx1dGlscy50ZXh0KHJvb3QpKQorICAgIAorICAgIGRlZiB0ZXN0QWRkcyhzZWxmKToKKyAgICAgICAgJycnVGVzdCBhZGRpbmcgdGhpbmdzIHRvIG5vZGVzLgorICAgICAgICAnJycKKyAgICAgICAgZG9tSW1wbCA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgICAgICBkb2MgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpICMgbnMgVVJJLCBxdWFsIG5hbWUsIGRvY3R5cGUKKyAgICAgICAgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCdyb290JykKKworICAgICAgICBvb2R0LnhtbHV0aWxzLmFkZChyb290LCAnZmlyc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4ob29kdC54bWx1dGlscy50ZXh0KHJvb3QpKSkKKyAgICAgICAgb29kdC54bWx1dGlscy5hZGQocm9vdCwgJ3NlY29uZCcsICd3aXRoIHRleHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2l0aCB0ZXh0Jywgb29kdC54bWx1dGlscy50ZXh0KHJvb3QpKQorICAgICAgICAKKyAgICAgICAgb29kdC54bWx1dGlscy5hZGQocm9vdCwgJ251bWJlcicsIFtzdHIoaSkgZm9yIGkgaW4gcmFuZ2UoMSwgNCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2l0aCB0ZXh0MTIzJywgb29kdC54bWx1dGlscy50ZXh0KHJvb3QpKQorICAgIAorCitjbGFzcyBEb2N1bWVudGFibGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3QgdGhlIGBEb2N1bWVudGFibGVgIGFuZCBgRG9jdW1lbnRhYmxlRmllbGRgIGNsYXNzZXMuCisgICAgJycnCisgICAgZGVmIHRlc3RJdChzZWxmKToKKyAgICAgICAgJycnVGVzdCB0aGUgYERvY3VtZW50YWJsZWAgYW5kIGBEb2N1bWVudGFibGVGaWVsZGAgY2xhc3Nlcy4KKyAgICAgICAgJycnCisgICAgICAgIGNsYXNzIFgob29kdC54bWx1dGlscy5Eb2N1bWVudGFibGUpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1pc3Npb249J1VOSycsIHRhcmdldD0nVU5LJywgbWVhc3VyZW1lbnRzPVtdLCBub2RlPU5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYubWlzc2lvbiwgc2VsZi50YXJnZXQsIHNlbGYubWVhc3VyZW1lbnRzID0gbWlzc2lvbiwgdGFyZ2V0LCBtZWFzdXJlbWVudHMKKyAgICAgICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlKG5vZGUpCisgICAgICAgICAgICBkZWYgY29tcHV0ZVZhbHVlRnJvbURvY3VtZW50KHNlbGYsIGF0dHJOYW1lLCB0ZXh0KToKKyAgICAgICAgICAgICAgICBpZiBhdHRyTmFtZSA9PSAnbWVhc3VyZW1lbnRzJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludCh0ZXh0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0CisgICAgICAgICAgICBkZWYgZ2V0RG9jdW1lbnRFbGVtZW50TmFtZShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1gnCisgICAgICAgICAgICBkZWYgZ2V0RG9jdW1lbnRhYmxlRmllbGRzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnRhYmxlRmllbGQoJ21pc3Npb24nLCB1J01JU1NJT04nLCBEb2N1bWVudGFibGVGaWVsZC5TSU5HTEVfVkFMVUVfS0lORCksCisgICAgICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQoJ3RhcmdldCcsIHUnVEFSR0VUJywgRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQpLAorICAgICAgICAgICAgICAgIERvY3VtZW50YWJsZUZpZWxkKCdtZWFzdXJlbWVudHMnLCB1J01aUicsIERvY3VtZW50YWJsZUZpZWxkLk1VTFRJX1ZBTFVFRF9LSU5EKSkKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi5taXNzaW9uID09IG90aGVyLm1pc3Npb24gYW5kIHNlbGYudGFyZ2V0ID09IG90aGVyLnRhcmdldAorICAgICAgICAgICAgICAgICAgICBhbmQgY21wKHNlbGYubWVhc3VyZW1lbnRzLCBvdGhlci5tZWFzdXJlbWVudHMpID09IDApCisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJyVzLCVzOiVzJyAlIChzZWxmLm1pc3Npb24sIHNlbGYudGFyZ2V0LCBzZWxmLm1lYXN1cmVtZW50cykKKyAgICAgICAgYSA9IFgoJ0V4cGxvcmVyJywgJ01vb24nLCBbMSwgMiwgM10pCisgICAgICAgIGRvYyA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBub2RlID0gYS50b1hNTChkb2MpCisgICAgICAgIGIgPSBYKG5vZGU9bm9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYSwgYikKKyAgICAKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICAnJydDcmVhdGUgdGhlIHN1aXRlIG9mIHRlc3RzLgorICAgICcnJworICAgIGltcG9ydCBkb2N0ZXN0CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFhNTFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERvY3VtZW50YWJsZVRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QoZG9jdGVzdC5Eb2NUZXN0U3VpdGUob29kdC54bWx1dGlscykpCisgICAgcmV0dXJuIHN1aXRlCisgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS8wLjEwL2FnaWxpdHkvb29kdC93ZWJncmlkLnB5IGIvMC4xMC9hZ2lsaXR5L29vZHQvd2ViZ3JpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU2ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L29vZHQvd2ViZ3JpZC5weQpAQCAtMCwwICsxLDIyNiBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJycnQWdpbGUgV2ViIEdyaWQuICBIVFRQLWJhc2VkIHByb2ZpbGUgYW5kIHByb2R1Y3Qgc2VydmVycy4KKycnJworCitfX2RvY2Zvcm1hdF9fID0gJ3Jlc3RydWN0dXJlZHRleHQnCisKK2Zyb20gb29kdC5xdWVyeSBpbXBvcnQgUXVlcnkKK2Zyb20geG1sLmRvbS5taW5pZG9tIGltcG9ydCBwYXJzZVN0cmluZywgZ2V0RE9NSW1wbGVtZW50YXRpb24KK2Zyb20gQmFzZUhUVFBTZXJ2ZXIgaW1wb3J0IEhUVFBTZXJ2ZXIsIEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIKK2ltcG9ydCBjZ2ksIG9zLCBzaHV0aWwsIHN0YXQKKworX3ZhbGlkS2luZHMgPSAoJ3Byb2ZpbGUnLCAncHJvZHVjdCcpCitfZG9jID0gZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKSAjIHFuYW1lLCBuc3VyaSwgZG9jdHlwZQorICAgIAorY2xhc3MgV2ViR3JpZFJlcXVlc3RIYW5kbGVyKEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICcnJ0hUVFAgcmVxdWVzdCBoYW5kbGVyIGZvciBXZWItR3JpZCByZXF1ZXN0cy4gIFRoaXMgcmVxdWVzdCBoYW5kbGVyIGFjY2VwdHMgR0VUCisgICAgb3IgUE9TVCByZXF1ZXN0cyBhbmQgZGlyZWN0cyB0aGVtIHRvIHByb2ZpbGUgb3IgcHJvZHVjdCBoYW5kbGVycy4gIEFkZGl0aW9uYWxseSwKKyAgICByZXF1ZXN0cyB0byBpbnN0YWxsIG5ldyBoYW5kbGVycywgdG8gbGlzdCBjdXJyZW50bHkgaW5zdGFsbGVkIGhhbmRsZXJzLCBhbmQgdG8KKyAgICByZW1vdmUgaGFuZGxlcnMgYnkgSUQgYXJlIHN1cHBvcnRlZC4KKyAgICAnJycKKyAgICBkZWYgZG9fUE9TVChzZWxmKToKKyAgICAgICAgJycnSGFuZGxlIGEgUE9TVC4KKyAgICAgICAgJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxlbmd0aCA9IGludChzZWxmLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pCisgICAgICAgICAgICBraW5kID0gc2VsZi5oZWFkZXJzWydjb250ZW50LXR5cGUnXQorICAgICAgICAgICAgaWYga2luZC5lbmRzd2l0aCgnd3d3LWZvcm0tdXJsZW5jb2RlZCcpOgorICAgICAgICAgICAgICAgIGlmIGxlbmd0aCA+IDA6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGNnaS5wYXJzZV9xcyhzZWxmLnJmaWxlLnJlYWQobGVuZ3RoKSwgVHJ1ZSwgVHJ1ZSkgIyBLZWVwIGJsYW5rcywgc3RyaWN0IHBhcnNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0ge30KKyAgICAgICAgICAgICAgICBzZWxmLl9fZXhlY3V0ZShzZWxmLnBhdGgsIHBhcmFtcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biBlbmNvZGluZyAiJXMiJyAlIGtpbmQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNTAwLCBzdHIoZSkpCisgICAgCisgICAgZGVmIGRvX0dFVChzZWxmKToKKyAgICAgICAgJycnSGFuZGxlIGEgR0VULgorICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5kZXggPSBzZWxmLnBhdGguZmluZCgnPycpCisgICAgICAgICAgICBpZiBpbmRleCA+PSAwOgorICAgICAgICAgICAgICAgIHBhcmFtcyA9IGNnaS5wYXJzZV9xcyhzZWxmLnBhdGhbaW5kZXgrMTpdLCBUcnVlLCBUcnVlKSAjIEtlZXAgYmxhbmtzLCBzdHJpY3QgcGFyc2UKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoWzA6aW5kZXhdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcmFtcywgcGF0aCA9IHt9LCBzZWxmLnBhdGgKKyAgICAgICAgICAgIHNlbGYuX19leGVjdXRlKHBhdGgsIHBhcmFtcykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig1MDAsIHN0cihlKSkKKyAgICAKKyAgICBkZWYgX19leGVjdXRlKHNlbGYsIHBhdGgsIHBhcmFtcyk6CisgICAgICAgICcnJ0V4ZWN1dGUgYW4gSFRUUCByZXF1ZXN0LgorICAgICAgICAnJycKKyAgICAgICAgY29tcG9uZW50cyA9IHBhdGguc3BsaXQoJy8nKQorICAgICAgICBpZiBsZW4oY29tcG9uZW50cykgPT0gMzoKKyAgICAgICAgICAgIGNvbnRleHQsIGNvbW1hbmQgPSBjb21wb25lbnRzWzFdLCBjb21wb25lbnRzWzJdCisgICAgICAgICAgICBpZiBjb250ZXh0ICE9IHNlbGYuc2VydmVyLnNlcnZlcklEOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gc2VydmVyIElEICIlcyInICUgY29udGV4dCkKKyAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHNlbGYsIGNvbW1hbmQpCisgICAgICAgICAgICBpZiBjYWxsYWJsZShmdW5jKToKKyAgICAgICAgICAgICAgICBmdW5jKHBhcmFtcykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ1Vua25vd24gY29tbWFuZCcpCisgICAgCisgICAgZGVmIGVjaG8oc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnRGVidWdnaW5nIG1ldGhvZCB0aGF0IGVjaG9lcyBiYWNrIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuCisgICAgICAgICcnJworICAgICAgICB1ID0gdW5pY29kZShwYXJhbXMpCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgnKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihsZW4odSkpKQorICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgc2VsZi53ZmlsZS53cml0ZSh1KQorICAgIAorICAgIGRlZiBzZW5kRW1wdHlSZXNwb25zZShzZWxmKToKKyAgICAgICAgJycnU2VuZCBhbiBlbXB0eSByZXNwb25zZSB0byB0aGUgSFRUUCBjbGllbnQuCisgICAgICAgICcnJworICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JykKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1sZW5ndGgnLCAnMCcpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgIAorICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhcmFtcyk6CisgICAgICAgICcnJ0luc3RhbGwgYSBuZXcgaGFuZGxlci4gIFRoaXMgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgaGFuZGxlcnMgd2l0aCB0aGUKKyAgICAgICAgc2FtZSBJRC4KKyAgICAgICAgJycnCisgICAgICAgIGhhbmRsZXJzID0gc2VsZi5zZXJ2ZXIuZ2V0SGFuZGxlcnMocGFyYW1zWydraW5kJ11bMF0pCisgICAgICAgIGdsb2JzID0gZGljdChnbG9iYWxzKCkpCisgICAgICAgIGRlbCBnbG9ic1snX19uYW1lX18nXQorICAgICAgICAjIFRPRE86IHVzZSByZXhlYyBvciBvdGhlcndpc2UgbGltaXQgdGhlIGNvZGUgdGhhbiBjYW4gYmUgdXBsb2FkZWQuCisgICAgICAgIGV4ZWMgcGFyYW1zWydjb2RlJ11bMF0gaW4gZ2xvYnMsIGdsb2JzCisgICAgICAgIGhhbmRsZXJzW3BhcmFtc1snaWQnXVswXV0gPSBnbG9ic1snaGFuZGxlciddCisgICAgICAgIHNlbGYuc2VuZEVtcHR5UmVzcG9uc2UoKQorICAgIAorICAgIGRlZiByZW1vdmUoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnUmVtb3ZlIGFuIGV4aXN0aW5nIGhhbmRsZXIuCisgICAgICAgICcnJworICAgICAgICBoYW5kbGVycyA9IHNlbGYuc2VydmVyLmdldEhhbmRsZXJzKHBhcmFtc1sna2luZCddWzBdKQorICAgICAgICBkZWwgaGFuZGxlcnNbcGFyYW1zWydpZCddWzBdXQorICAgICAgICBzZWxmLnNlbmRFbXB0eVJlc3BvbnNlKCkKKyAgICAKKyAgICBkZWYgbGlzdChzZWxmLCBwYXJhbXMpOgorICAgICAgICAnJydMaXN0IGluc3RhbGxlZCBoYW5kbGVycy4KKyAgICAgICAgJycnCisgICAgICAgIGhhbmRsZXJzID0ge30KKyAgICAgICAgZm9yIGtpbmQgaW4gX3ZhbGlkS2luZHM6CisgICAgICAgICAgICBoYW5kbGVyc1traW5kXSA9IHNlbGYuc2VydmVyLmdldEhhbmRsZXJzKGtpbmQpLmtleXMoKQorICAgICAgICBoYW5kbGVycyA9IHVuaWNvZGUoaGFuZGxlcnMpCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgnKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihsZW4oaGFuZGxlcnMpKSkKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoaGFuZGxlcnMpCisgICAgCisgICAgZGVmIF9fY3JlYXRlUXVlcnkoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnQ3JlYXRlIGEgUXVlcnkgZnJvbSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLiAgVGhpcyBtZXRob2QgcHJlZmVycyB0aGUKKyAgICAgICAgeG1scSBwYXJhbWV0ZXIgYW5kIHBhcnNlcyBpdCBhcyBhbiBYTUwgZG9jdW1lbnQgYW5kIGludG8gYSBRdWVyeSBvYmplY3QuCisgICAgICAgIEhvd2V2ZXIsIGlmIGl0J3Mgbm90IHByb3ZpZGVkLCBvciBmYWlscyB0byBwYXJzZSwgaXQnbGwgdXNlIHRoZSBxIHBhcmFtZXRlciwKKyAgICAgICAgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUganVzdCBhIHF1ZXJ5IGV4cHJlc3Npb24uCisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBkb2MgPSBwYXJzZVN0cmluZyhwYXJhbXNbJ3htbHEnXVswXSkKKyAgICAgICAgICAgIHJldHVybiBRdWVyeShub2RlPWRvYy5kb2N1bWVudEVsZW1lbnQpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBRdWVyeShwYXJhbXNbJ3EnXVswXSkKKyAgICAKKyAgICBkZWYgc2VuZFByb2R1Y3Qoc2VsZiwgbWF0Y2gpOgorICAgICAgICAnJydTZW5kIGEgbWF0Y2hpbmcgcHJvZHVjdC4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtdHlwZScsIG1hdGNoLmNvbnRlbnRUeXBlKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihtYXRjaC5sZW5ndGgpKQorICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKG1hdGNoLmRhdGEsIHNlbGYud2ZpbGUpCisgICAgICAgIHNlbGYubG9nX3JlcXVlc3QoMjAwLCBtYXRjaC5sZW5ndGgpCisgICAgCisgICAgZGVmIHByb2Qoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnSGFuZGxlIGEgcHJvZHVjdCBxdWVyeS4KKyAgICAgICAgJycnCisgICAgICAgIHF1ZXJ5ID0gc2VsZi5fX2NyZWF0ZVF1ZXJ5KHBhcmFtcykKKyAgICAgICAgZm9yIGhhbmRsZXIgaW4gc2VsZi5zZXJ2ZXIuZ2V0SGFuZGxlcnMoJ3Byb2R1Y3QnKToKKyAgICAgICAgICAgIG1hdGNoZXMgPSBoYW5kbGVyLnF1ZXJ5KHF1ZXJ5KQorICAgICAgICAgICAgaWYgbGVuKG1hdGNoZXMpID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRQcm9kdWN0KG1hdGNoZXNbMF0pCisgICAgICAgIHNlbGYuc2VuZF9lcnJvcig0MDQsICdObyBtYXRjaGluZyBwcm9kdWN0cycpCisgICAgCisgICAgZGVmIHByb2Yoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnSGFuZGxlIGEgcHJvZmlsZSBxdWVyeS4KKyAgICAgICAgJycnCisgICAgICAgIHF1ZXJ5ID0gc2VsZi5fX2NyZWF0ZVF1ZXJ5KHBhcmFtcykKKyAgICAgICAgdG1wID0gb3MudG1wZmlsZSgpCisgICAgICAgIHRtcC53cml0ZWxpbmVzKCh1Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nLAorICAgICAgICAgICAgdSc8IURPQ1RZUEUgcHJvZmlsZXMgUFVCTElDICItLy9KUEwvL0RURCBQcm9maWxlIDEuMS8vRU4iXG4nLAorICAgICAgICAgICAgdScgICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvZ3JpZC1wcm9maWxlL2R0ZC9wcm9mLmR0ZCI+XG4nLAorICAgICAgICAgICAgdSc8cHJvZmlsZXM+XG4nKSkKKyAgICAgICAgZm9yIGhhbmRsZXIgaW4gc2VsZi5zZXJ2ZXIuZ2V0SGFuZGxlcnMoJ3Byb2ZpbGUnKS5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBmb3IgcHJvZmlsZSBpbiBoYW5kbGVyLnF1ZXJ5KHF1ZXJ5KToKKyAgICAgICAgICAgICAgICBub2RlID0gcHJvZmlsZS50b1hNTChfZG9jKQorICAgICAgICAgICAgICAgIHRtcC53cml0ZShub2RlLnRveG1sKCkpCisgICAgICAgIHRtcC53cml0ZSh1JzwvcHJvZmlsZXM+JykKKyAgICAgICAgdG1wLmZsdXNoKCkKKyAgICAgICAgdG1wLnNlZWsoMEwpCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L3htbDtjaGFyc2V0PXV0Zi04JykKKyAgICAgICAgc2l6ZSA9IG9zLmZzdGF0KHRtcC5maWxlbm8oKSlbc3RhdC5TVF9TSVpFXQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihzaXplKSkKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaih0bXAsIHNlbGYud2ZpbGUpCisgICAgICAgIHNlbGYubG9nX3JlcXVlc3QoMjAwLCBzaXplKQorICAgIAorCitjbGFzcyBXZWJHcmlkU2VydmVyKEhUVFBTZXJ2ZXIpOgorICAgICcnJ1dlYiBncmlkIEhUVFAgc2VydmVyLiAgVGhpcyBzZXJ2ZXIgaGFuZGxlcyBpbmNvbWluZyBIVFRQIHJlcXVlc3RzIGFuZCBkaXJlY3RzIHRoZW0gdG8gYQorICAgIFdlYkdyaWRSZXF1ZXN0SGFuZGxlci4gIEl0IGFsc28gY29udGFpbnMgdGhlIHNlcnZlcidzIElELCBhbmQgdGhlIHNlcXVlbmNlcyBvZiBwcm9maWxlIGFuZAorICAgIHByb2R1Y3QgaGFuZGxlcnMuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHIsIHNlcnZlcklEKToKKyAgICAgICAgJycnSW5pdGlhbGl6ZSBieSBzYXZpbmcgdGhlIHNlcnZlciBJRCBhbmQgY3JlYXRpbmcgZW1wdHkgc2VxdWVuY2VzIG9mIHByb2ZpbGUKKyAgICAgICAgYW5kIHByb2R1Y3QgaGFuZGxlcnMuCisgICAgICAgICcnJworICAgICAgICBIVFRQU2VydmVyLl9faW5pdF9fKHNlbGYsIGFkZHIsIFdlYkdyaWRSZXF1ZXN0SGFuZGxlcikKKyAgICAgICAgc2VsZi5zZXJ2ZXJJRCA9IHNlcnZlcklECisgICAgICAgIHNlbGYuX19oYW5kbGVycyA9IHt9CisgICAgICAgIGZvciBraW5kIGluIF92YWxpZEtpbmRzOgorICAgICAgICAgICAgc2VsZi5fX2hhbmRsZXJzW2tpbmRdID0ge30KKyAgICAKKyAgICBkZWYgZ2V0SGFuZGxlcnMoc2VsZiwga2luZCk6CisgICAgICAgICcnJ0dldCB0aGUgbWFwIG9mIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4ga2luZCwgd2hpY2ggaXMgZWl0aGVyICJwcm9kdWN0IiBvciAicHJvZmlsZSIuCisgICAgICAgICcnJworICAgICAgICBpZiBraW5kIG5vdCBpbiBfdmFsaWRLaW5kczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgaGFuZGxlciBraW5kICIlcyInICUga2luZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19oYW5kbGVyc1traW5kXQorICAgIAorCitkZWYgX21haW4oKToKKyAgICAnJydSdW4gdGhlIHdlYiBncmlkIHNlcnZlci4KKyAgICAnJycKKyAgICBpbXBvcnQgc3lzCisgICAgdHJ5OgorICAgICAgICBzZXJ2ZXJJRCA9IHN5cy5hcmd2WzFdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHNlcnZlcklEID0gJ29vZHQnCisgICAgbGlzdGVuQWRkciA9ICgnJywgNzU3NikKKyAgICBodHRwZCA9IFdlYkdyaWRTZXJ2ZXIobGlzdGVuQWRkciwgc2VydmVySUQpCisgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX21haW4oKQpkaWZmIC0tZ2l0IGEvMC4xMC9hZ2lsaXR5L29vZHQveG1sdXRpbHMucHkgYi8wLjEwL2FnaWxpdHkvb29kdC94bWx1dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGU3ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L29vZHQveG1sdXRpbHMucHkKQEAgLTAsMCArMSwyMDkgQEAKKyMgZW5jb2Rpbmc6IHV0Zi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisKKycnJ09iamVjdCBPcmllbnRlZCBEYXRhIFRlY2hub2xvZ3kgWE1MIHV0aWxpdGllcy4gVGhlc2UgYXJlIHNvbWUgc2ltcGxlIHV0aWxpdGllcwordGhhdCBtYWtlIHdvcmtpbmcgd2l0aCByYXRoZXIgb2J0dXNlIERPTSBBUEkgbGVzcyBwYWluZnVsLgorJycnCisKK19fZG9jZm9ybWF0X18gPSAncmVzdHJ1Y3R1cmVkdGV4dCcKKworaW1wb3J0IHN0cmluZworaW1wb3J0IHhtbC5kb20KKyAgICAKK2RlZiB0ZXh0KG5vZGUpOgorICAgICcnJ1JldHVybiB0aGUgdGV4dCB1bmRlciB0aGUgZ2l2ZW4gbm9kZS4gIFRleHQgYW5kIENEQVRBIG5vZGVzIHNpbXBseSByZXR1cm4KKyAgICB0aGVpciBjb250ZW50LiAgT3RoZXJ3aXNlLCB0ZXh0IGlzIGdhdGhlcmVkIGluIGEgZGVwdGgtZmlyc3QgbGVmdC10by1yaWdodAorICAgIHRyYXZlcnNhbCBvZiB0aGUgbm9kZSwgYnVpbGRpbmcgdXAgdGV4dCBhcyB3ZSBnbyBhbG9uZy4KKyAgICAKKyAgICA+Pj4gaW1wb3J0IHhtbC5kb20KKyAgICA+Pj4gZG9tSW1wbCA9IHhtbC5kb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgID4+PiBkb2MgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpCisgICAgPj4+IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgncm9vdCcpCisgICAgPj4+IHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCdhbHBoYScpKSAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIDxET00gVGV4dCBub2RlLi4uPgorICAgID4+PiB0ZXh0KHJvb3QpCisgICAgJ2FscGhhJworICAgID4+PiBjaGlsZCA9IHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUVsZW1lbnQoJ2NoaWxkJykpCisgICAgPj4+IHRleHQoY2hpbGQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbignYmV0YScpKSkKKyAgICAnYmV0YScKKyAgICA+Pj4gdGV4dChyb290KQorICAgICdhbHBoYWJldGEnCisgICAgJycnCisgICAgc3RyaW5ncyA9IFtdCisgICAgX3RleHQwKG5vZGUsIHN0cmluZ3MpCisgICAgcmV0dXJuIHN0cmluZy5qb2luKHN0cmluZ3MsICcnKSAjIG5vIHNlcGFyYXRvcgorICAgIAorCitkZWYgX3RleHQwKG5vZGUsIHN0cmluZ3MpOgorICAgICcnJ0FkZCB0aGUgdGV4dCB1bmRlciB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgbGlzdCBvZiBzdHJpbmdzLgorICAgICcnJworICAgIGlmIG5vZGUubm9kZVR5cGUgPT0geG1sLmRvbS5Ob2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKKyAgICAgICAgc3RyaW5ncy5hcHBlbmQobm9kZS5ub2RlVmFsdWUpCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IHhtbC5kb20uTm9kZS5URVhUX05PREU6CisgICAgICAgIHN0cmluZ3MuYXBwZW5kKG5vZGUubm9kZVZhbHVlKQorICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6CisgICAgICAgIF90ZXh0MChjaGlsZCwgc3RyaW5ncykKKyAgICAKKworZGVmIGFkZChub2RlLCBlbGVtZW50TmFtZSwgdmFsdWU9Tm9uZSk6CisgICAgJycnQWRkIGFuIGVsZW1lbnQgdW5kZXIgdGhlIGdpdmVuIG5vZGUuICBPcHRpb25hbGx5LCB0aGUgdmFsdWUgdGV4dCBpcyBhZGRlZCB0byB0aGUgZWxlbWVudC4KKyAgICBSZXR1cm5zIHRoZSBvcmlnaW5hbCBub2RlLCBoYW5keSBmb3IgY2hhaW5pbmcgY2FsbHMgdG9nZXRoZXIuICBJZiB0aGUgdmFsdWUgaXMgYSBzZXF1ZW5jZSwKKyAgICB0aGVuIHRoZSBlbGVtZW50IGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGl0ZW0gaW4gdGhlIHNlcXVlbmNlLCB1c2luZyB0aGUgaXRlbQorICAgIGFzIHRoZSB0ZXh0LgorCisgICAgPj4+IGZyb20geG1sLmRvbS5taW5pZG9tIGltcG9ydCBnZXRET01JbXBsZW1lbnRhdGlvbgorICAgID4+PiBkb2MgPSBnZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpCisgICAgPj4+IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgncm9vdCcpCisgICAgPj4+IHJvb3QudG94bWwoKQorICAgICc8cm9vdC8+JworICAgID4+PiBhZGQocm9vdCwgJ2VtcHR5JykudG94bWwoKQorICAgICc8cm9vdD48ZW1wdHkvPjwvcm9vdD4nCisgICAgPj4+IGFkZChyb290LCAnZnVsbCcsICdvZiB0ZXh0JykudG94bWwoKQorICAgICc8cm9vdD48ZW1wdHkvPjxmdWxsPm9mIHRleHQ8L2Z1bGw+PC9yb290PicKKyAgICA+Pj4gYWRkKHJvb3QsICdpdGVtJywgW3N0cihpKSBmb3IgaSBpbiByYW5nZSgxLCA0KV0pLnRveG1sKCkKKyAgICAnPHJvb3Q+PGVtcHR5Lz48ZnVsbD5vZiB0ZXh0PC9mdWxsPjxpdGVtPjE8L2l0ZW0+PGl0ZW0+MjwvaXRlbT48aXRlbT4zPC9pdGVtPjwvcm9vdD4nCisgICAgJycnCisgICAgb3duZXIgPSBub2RlLm93bmVyRG9jdW1lbnQKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgZWxlbSA9IG93bmVyLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpCisgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZWxlbSkKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChvd25lci5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSkpCisgICAgZWxpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgZm9yIGkgaW4gdmFsdWU6CisgICAgICAgICAgICBlbGVtID0gb3duZXIuY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSkKKyAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZWxlbSkKKyAgICAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQob3duZXIuY3JlYXRlVGV4dE5vZGUoaSkpCisgICAgZWxzZToKKyAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChvd25lci5jcmVhdGVFbGVtZW50KGVsZW1lbnROYW1lKSkKKyAgICByZXR1cm4gbm9kZQorICAgIAorCitjbGFzcyBEb2N1bWVudGFibGVGaWVsZChvYmplY3QpOgorICAgICcnJ0EgZG9jdW1lbnRhYmxlIGZpZWxkIGlzIGFuIGF0dHJpYnV0ZSBvZiBhbiBvYmplY3QgdGhhdCB3ZSBjYW4gc2VyaWFsaXplIGludG8gWE1MLgorICAgICcnJworICAgIFNJTkdMRV9WQUxVRV9LSU5EID0gMQorICAgIE1VTFRJX1ZBTFVFRF9LSU5EID0gMgorICAgIERPQ1VNRU5UQUJMRV9LSU5EID0gMworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJOYW1lLCBlbGVtTmFtZSwga2luZCk6CisgICAgICAgICcnJ0luaXRpYWxpemUgYSBkb2N1bWVudGFibGUgZmllbGQgd2l0aCBhdHRyTmFtZSAobmFtZSBvZiBhdHRyaWJ1dGUgaW4gb2JqZWN0KSwKKyAgICAgICAgZWxlbU5hbWUgKG5hbWUgdG8gdXNlIGZvciBYTUwgZWxlbWVudCkgYW5kIGtpbmQsIHdoaWNoIGlzIG9uZSBvZiB0aGUgRE9DVU1FTlRBQkxFXyoKKyAgICAgICAgY29uc3RhbnRzLgorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5hdHRyTmFtZSA9IGF0dHJOYW1lCisgICAgICAgIHNlbGYuZWxlbU5hbWUgPSBlbGVtTmFtZQorICAgICAgICBpZiBraW5kIG5vdCBpbiAoRG9jdW1lbnRhYmxlRmllbGQuU0lOR0xFX1ZBTFVFX0tJTkQsIERvY3VtZW50YWJsZUZpZWxkLk1VTFRJX1ZBTFVFRF9LSU5ELAorICAgICAgICAgICAgRG9jdW1lbnRhYmxlRmllbGQuRE9DVU1FTlRBQkxFX0tJTkQpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBraW5kICVkJyAlIGtpbmQpCisgICAgICAgIHNlbGYua2luZCA9IGtpbmQKKyAgICAKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGF0dHJOYW1lID0gY21wKHNlbGYuYXR0ck5hbWUsIG90aGVyLmF0dHJOYW1lKQorICAgICAgICBpZiBhdHRyTmFtZSA8IDA6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBhdHRyTmFtZSA9PSAwOgorICAgICAgICAgICAgZWxlbU5hbWUgPSBjbXAoc2VsZi5lbGVtTmFtZSwgb3RoZXIuZWxlbU5hbWUpCisgICAgICAgICAgICBpZiBlbGVtTmFtZSA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbGlmIGVsZW1OYW1lID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmtpbmQsIG90aGVyLmtpbmQpCisgICAgICAgIHJldHVybiAxCisgICAgCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmF0dHJOYW1lKSBeIGhhc2goc2VsZi5lbGVtTmFtZSkgXiBzZWxmLmtpbmQKKyAgICAKKworY2xhc3MgRG9jdW1lbnRhYmxlKG9iamVjdCk6CisgICAgJycnQW4gb2JqZWN0IHRoYXQgY2FuIGJlIGRvY3VtZW50ZWQgaW50byBYTUwgYW5kIHBhcnNlZCBmcm9tIGFuIFhNTCBkb2N1bWVudC4KKyAgICAnJycKKyAgICBkZWYgZ2V0RG9jdW1lbnRFbGVtZW50TmFtZShzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSBYTUwgdGFnIG5hbWUuICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcworICAgICAgICBvdGhlcndpc2UgdGhleSBnZXQgdGhlIHRhZyBuYW1lIGBVTktOT1dOYC4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiAnVU5LTk9XTicKKyAgICAgICAgCisgICAgZGVmIGdldERvY3VtZW50YWJsZUZpZWxkcyhzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSBzZXF1ZW5jZSBvZiBkb2N1bWVudGFibGUgYXR0cmlidXRlcy4gIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKKyAgICAgICAgd2l0aCBhIHNlcXVlbmNlIG9mIGBEb2N1bWVudGFibGVGaWVsZGAgb2JqZWN0cy4gIEJ5IGRlZmF1bHQsIHdlIHJldHVybiBhbiBlbXB0eQorICAgICAgICBzZXF1ZW5jZS4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBbXQorICAgIAorICAgIGRlZiB0b1hNTChzZWxmLCBvd25lcik6CisgICAgICAgICcnJ0NvbnZlcnQgdGhpcyBvYmplY3QgaW50byBYTUwgb3duZWQgYnkgdGhlIGdpdmVuIGBvd25lcmAgZG9jdW1lbnQuCisgICAgICAgICcnJworICAgICAgICByb290ID0gb3duZXIuY3JlYXRlRWxlbWVudChzZWxmLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSkKKyAgICAgICAgZm9yIGRmIGluIHNlbGYuZ2V0RG9jdW1lbnRhYmxlRmllbGRzKCk6CisgICAgICAgICAgICBpZiBkZi5raW5kID09IERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EOgorICAgICAgICAgICAgICAgIGFkZChyb290LCBkZi5lbGVtTmFtZSwgc3RyKGdldGF0dHIoc2VsZiwgZGYuYXR0ck5hbWUpKSkKKyAgICAgICAgICAgIGVsaWYgZGYua2luZCA9PSBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORDoKKyAgICAgICAgICAgICAgICBhZGQocm9vdCwgZGYuZWxlbU5hbWUsIFtzdHIodmFsdWUpIGZvciB2YWx1ZSBpbiBnZXRhdHRyKHNlbGYsIGRmLmF0dHJOYW1lKV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZ2V0YXR0cihzZWxmLCBkZi5hdHRyTmFtZSkudG9YTUwob3duZXIpKQorICAgICAgICByZXR1cm4gcm9vdAorICAgIAorICAgIGRlZiBjb21wdXRlVmFsdWVGcm9tRG9jdW1lbnQoc2VsZiwgYXR0ck5hbWUsIHRleHQpOgorICAgICAgICAnJydDb21wdXRlIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGF0dHJOYW1lYCBmcm9tIHRoZQorICAgICAgICBYTUwgdGV4dCByZXByZXNlbnRhdGlvbiBgdGV4dGAuICBTdWJjbGFzc2VzIG1heSB3aXNoIHRvCisgICAgICAgIG92ZXJyaWRlIHRoaXMgaW4gb3JkZXIgdG8gcHJvdmlkZSBjdXN0b20gdHlwaW5nIGZvciBjZXJ0YWluCisgICAgICAgIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGludGVnZXIgb3IgZGF0ZXRpbWUgdmFsdWUgYnkKKyAgICAgICAgcGFyc2luZyB0aGUgdGV4dC4gIEJ5IGRlZmF1bHQsIHRoZSBgdGV4dGAgaXMgcmV0dXJuZWQKKyAgICAgICAgdW5tb2RpZmllZCBhcyBhIHN0cmluZy4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiB0ZXh0CisgICAgCisgICAgZGVmIHBhcnNlKHNlbGYsIG5vZGUpOgorICAgICAgICAnJydJbml0aWFsaXplIHRoaXMgb2JqZWN0IGZyb20gdGhlIGdpdmVuIFhNTCBET00gYG5vZGVgLgorICAgICAgICAnJycKKyAgICAgICAgaWYgbm9kZS5ub2RlTmFtZSAhPSBzZWxmLmdldERvY3VtZW50RWxlbWVudE5hbWUoKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0V4cGVjdGVkICVzIGVsZW1lbnQgYnV0IGdvdCAlcycgJSAoc2VsZi5nZXREb2N1bWVudEVsZW1lbnROYW1lKCksIG5vZGUubm9kZU5hbWUpKQorICAgICAgICBmaWVsZE1hcCA9IGRpY3QoemlwKFtpLmVsZW1OYW1lIGZvciBpIGluIHNlbGYuZ2V0RG9jdW1lbnRhYmxlRmllbGRzKCldLCBzZWxmLmdldERvY3VtZW50YWJsZUZpZWxkcygpKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIGZpbHRlcihsYW1iZGEgbjogbi5ub2RlVHlwZSA9PSB4bWwuZG9tLk5vZGUuRUxFTUVOVF9OT0RFLCBub2RlLmNoaWxkTm9kZXMpOgorICAgICAgICAgICAgbmFtZSA9IGNoaWxkLm5vZGVOYW1lCisgICAgICAgICAgICBpZiBuYW1lIGluIGZpZWxkTWFwOgorICAgICAgICAgICAgICAgIGZpZWxkID0gZmllbGRNYXBbbmFtZV0KKyAgICAgICAgICAgICAgICBpZiBmaWVsZC5raW5kID09IERvY3VtZW50YWJsZUZpZWxkLlNJTkdMRV9WQUxVRV9LSU5EOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGZpZWxkLmF0dHJOYW1lLCBzZWxmLmNvbXB1dGVWYWx1ZUZyb21Eb2N1bWVudChmaWVsZC5hdHRyTmFtZSwgdGV4dChjaGlsZCkpKQorICAgICAgICAgICAgICAgIGVsaWYgZmllbGQua2luZCA9PSBEb2N1bWVudGFibGVGaWVsZC5NVUxUSV9WQUxVRURfS0lORDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgZmllbGQuYXR0ck5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBmaWVsZC5hdHRyTmFtZSwgW10pCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoc2VsZiwgZmllbGQuYXR0ck5hbWUpLmFwcGVuZChzZWxmLmNvbXB1dGVWYWx1ZUZyb21Eb2N1bWVudChmaWVsZC5hdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQoY2hpbGQpKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYsIGZpZWxkLmF0dHJOYW1lKS5wYXJzZShjaGlsZCkKKyAgICAKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICcnJ1RoZSBkb2N1bWVudGFibGUgZmllbGRzIHByb3ZpZGUgYSBib251czogd2UgY2FuIHVzZSB0aGVtIHRvIGRvIGNvbXBhcmlzb25zLgorICAgICAgICAnJycKKyAgICAgICAgZm9yIGZpZWxkIGluIHNlbGYuZ2V0RG9jdW1lbnRhYmxlRmllbGRzKCk6CisgICAgICAgICAgICBhdHRyTmFtZSA9IGZpZWxkLmF0dHJOYW1lCisgICAgICAgICAgICBtaW5lID0gZ2V0YXR0cihzZWxmLCBhdHRyTmFtZSkKKyAgICAgICAgICAgIG90aGVycyA9IGdldGF0dHIob3RoZXIsIGF0dHJOYW1lKQorICAgICAgICAgICAgcmMgPSBjbXAobWluZSwgb3RoZXJzKQorICAgICAgICAgICAgaWYgcmMgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxpZiByYyA+IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIDAKKyAgICAKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICcnJ1RoZSBkb2N1bWVudGFibGUgZmllbGRzIHByb3ZpZGUgYW5vdGhlciBib251czogd2UgY2FuIHVzZSB0aGVtCisgICAgICAgIHRvIGRvIGhhc2hpbmcuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gcmVkdWNlKGxhbWJkYSB4LCB5OiBoYXNoKHgpIF4gaGFzaCh5KSwgW2dldGF0dHIoc2VsZiwgaS5hdHRyTmFtZSkgZm9yIGkgaW4gc2VsZi5nZXREb2N1bWVudGFibGVGaWVsZHMoKV0sCisgICAgICAgICAgICAweDU1NTU1NTU1KQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYWdpbGl0eS9zZXR1cC5jZmcgYi8wLjEwL2FnaWxpdHkvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDE4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FnaWxpdHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMTggQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworW2VnZ19pbmZvXQordGFnX2J1aWxkID0gLmRldgordGFnX3N2bl9yZXZpc2lvbiA9IDEKZGlmZiAtLWdpdCBhLzAuMTAvYWdpbGl0eS9zZXR1cC5weSBiLzAuMTAvYWdpbGl0eS9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDJiNTdjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hZ2lsaXR5L3NldHVwLnB5CkBAIC0wLDAgKzEsOTggQEAKKyMgZW5jb2Rpbmc6IHV0Zi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisKK2ltcG9ydCBvcy5wYXRoCitmcm9tIGV6X3NldHVwIGltcG9ydCB1c2Vfc2V0dXB0b29scwordXNlX3NldHVwdG9vbHMoKQorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBmaW5kX3BhY2thZ2VzLCBzZXR1cAorCisKKyMgUGFja2FnZSBkYXRhCisjIC0tLS0tLS0tLS0tLQorCitfbmFtZSAgICAgICAgID0gJ29vZHQnCitfdmVyc2lvbiAgICAgID0gJzAuMTAnCitfZGVzY3JpcHRpb24gID0gJ0FwYWNoZSBPT0RUJworX3VybCAgICAgICAgICA9ICdodHRwOi8vb29kdC5hcGFjaGUub3JnLycKK19kb3dubG9hZFVSTCAgPSAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpL29vZHQvJworX2F1dGhvciAgICAgICA9ICdTZWFuIEtlbGx5JworX2F1dGhvckVtYWlsICA9ICdrZWxseUBhcGFjaGUub3JnJworX2xpY2Vuc2UgICAgICA9ICdBcGFjaGUgMi4wJworX25hbWVzcGFjZXMgICA9IFtdCitfdGVzdFN1aXRlICAgID0gJ29vZHQudGVzdHMudGVzdF9zdWl0ZScKK196aXBTYWZlICAgICAgPSBUcnVlCitfa2V5d29yZHMgICAgID0gJ2RhdGEgZ3JpZCBkaXNjb3ZlcnkgcXVlcnkgb3B0aW1pemF0aW9uIG9iamVjdCBtaWRkbGV3YXJlIGFyY2hpdmUgY2F0YWxvZyBpbmRleCcKK19yZXF1aXJlbWVudHMgPSBbXQorX2VudHJ5UG9pbnRzICA9IHsKKyAgICAnY29uc29sZV9zY3JpcHRzJzogWyd3ZWJncmlkID0gb29kdC53ZWJncmlkOl9tYWluJ10sCit9CitfY2xhc3NpZmllcnMgID0gWworICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAnRW52aXJvbm1lbnQgOjogTm8gSW5wdXQvT3V0cHV0IChEYWVtb24pJywKKyAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IEluZm9ybWF0aW9uIFRlY2hub2xvZ3knLAorICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBTY2llbmNlL1Jlc2VhcmNoJywKKyAgICAnVG9waWMgOjogRGF0YWJhc2UgOjogRnJvbnQtRW5kcycsCisgICAgJ1RvcGljIDo6IEludGVybmV0IDo6IFdXVy9IVFRQIDo6IER5bmFtaWMgQ29udGVudCcsCisgICAgJ1RvcGljIDo6IEludGVybmV0IDo6IFdXVy9IVFRQIDo6IEhUVFAgU2VydmVycycsCisgICAgJ1RvcGljIDo6IEludGVybmV0IDo6IFozOS41MCcsCisgICAgJ1RvcGljIDo6IFNjaWVudGlmaWMvRW5naW5lZXJpbmcnLAorICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJywKKyAgICAnRW52aXJvbm1lbnQgOjogV2ViIEVudmlyb25tZW50JywKKyAgICAnTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UnLAorICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JywKKyAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKKyAgICAnVG9waWMgOjogSW50ZXJuZXQgOjogV1dXL0hUVFAnLAorICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMnLAorXQorCisKKyMgU2V0dXAgTWV0YWRhdGEKKyMgLS0tLS0tLS0tLS0tLS0KKworZGVmIF9yZWFkKCpybmFtZXMpOgorICAgIHJldHVybiBvcGVuKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAqcm5hbWVzKSkucmVhZCgpCisKK19oZWFkZXIgPSAnKicgKiBsZW4oX25hbWUpICsgJ1xuJyArIF9uYW1lICsgJ1xuJyArICcqJyAqIGxlbihfbmFtZSkKK19sb25nRGVzY3JpcHRpb24gPSAnXG5cbicuam9pbihbCisgICAgX2hlYWRlciwKKyAgICBfcmVhZCgnUkVBRE1FLnR4dCcpLAorICAgIF9yZWFkKCdkb2NzJywgJ0lOU1RBTEwudHh0JyksCisgICAgX3JlYWQoJ2RvY3MnLCAnSElTVE9SWS50eHQnKQorXSkKK29wZW4oJ2RvYy50eHQnLCAndycpLndyaXRlKF9sb25nRGVzY3JpcHRpb24pCisKK3NldHVwKAorICAgIGF1dGhvcj1fYXV0aG9yLAorICAgIGF1dGhvcl9lbWFpbD1fYXV0aG9yRW1haWwsCisgICAgY2xhc3NpZmllcnM9X2NsYXNzaWZpZXJzLAorICAgIGRlc2NyaXB0aW9uPV9kZXNjcmlwdGlvbiwKKyAgICBkb3dubG9hZF91cmw9X2Rvd25sb2FkVVJMLAorICAgIGVudHJ5X3BvaW50cz1fZW50cnlQb2ludHMsCisgICAgaW5jbHVkZV9wYWNrYWdlX2RhdGE9VHJ1ZSwKKyAgICBpbnN0YWxsX3JlcXVpcmVzPV9yZXF1aXJlbWVudHMsCisgICAga2V5d29yZHM9X2tleXdvcmRzLAorICAgIGxpY2Vuc2U9X2xpY2Vuc2UsCisgICAgbG9uZ19kZXNjcmlwdGlvbj1fbG9uZ0Rlc2NyaXB0aW9uLAorICAgIG5hbWU9X25hbWUsCisgICAgbmFtZXNwYWNlX3BhY2thZ2VzPV9uYW1lc3BhY2VzLAorICAgIHBhY2thZ2VzPWZpbmRfcGFja2FnZXMoZXhjbHVkZT1bJ2V6X3NldHVwJ10pLAorICAgIHRlc3Rfc3VpdGU9X3Rlc3RTdWl0ZSwKKyAgICB1cmw9X3VybCwKKyAgICB2ZXJzaW9uPV92ZXJzaW9uLAorICAgIHppcF9zYWZlPV96aXBTYWZlLAorKQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3BvbS54bWwgYi8wLjEwL2FwcC9mbWJyb3dzZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDY5ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvZm1icm93c2VyL3BvbS54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGFydGlmYWN0SWQ+Y2FzLWZtLWJyb3dzZXI8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkNhdGFsb2cgYW5kIEFyY2hpdmUgRmlsZSBNYW5hZ2VtZW50IEJyb3dzZXI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UaGUgZ3JhcGhpY2FsIGZyb250LWVuZCBpbnRlcmZhY2UgdG8gdGhlIENhdGFsb2cgYW5kIEFyY2hpdmUgU2VydmljZS4gVGhpcyBjb21wb25lbnQKKyAgICAgcHJvdmlkZXMgdGhlIHVzZXIgb2YgdGhlIENBUyBGaWxlIE1hbmFnZXIgd2l0aCBhIGdyYXBoaWNhbCBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGV5CisgICAgIGNhbiB2aWV3IGFyY2hpdmVkIHByb2R1Y3RzJyBtZXRhZGF0YSwgcXVlcnkgZm9yIHByb2R1Y3RzIHdpdGggcGFydGljdWxhciBtZXRhZGF0YSwgCisgICAgIGFuZCBleHBvcnQgcmVzdWx0cyBvZiBxdWVyaWVzIHRvIHRoZSBNUyBFeGNlbChjKSBmaWxlIGZvcm1hdC48L2Rlc2NyaXB0aW9uPgorICA8c2NtPgorICAgCTxjb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL2FwcC9mbWJyb3dzZXI8L2Nvbm5lY3Rpb24+CisgICAJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvYXBwL2ZtYnJvd3NlcjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgIAk8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyL2FwcC9mbWJyb3dzZXI8L3VybD4KKyAgPC9zY20+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucyAvPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5wb2k8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wb2k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjItRklOQUw8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vYmluL2ZpbGVtZ3ItYnJvd3NlciBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9iaW4vZmlsZW1nci1icm93c2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDM4ODEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vYmluL2ZpbGVtZ3ItYnJvd3NlcgpAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKyMKKyMgaW5pdCBzY3JpcHQgZm9yIFhtbFJwY0ZpbGVNYW5hZ2VyCisjCisjIGNoa2NvbmZpZzogMzQ1IDg4IDIyCisjIGRlc2NyaXB0aW9uOiBDQVMgRmlsZSBNYW5hZ2VyIEJyb3dzZXIKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyMKKyMgJElkJAorCitbIC1mIC9ldGMvc3lzY29uZmlnL2phdmEgXSAmJiAuIC9ldGMvc3lzY29uZmlnL2phdmEKKyNbIC1mIC9ldGMvc3lzY29uZmlnL2Nhcy1maWxlbWdyXSAmJiAuIC9ldGMvc3lzY29uZmlnL2Nhcy1maWxlbWdyCisKK0pBVkFfSE9NRT0vcGF0aC90by9qYXZhL2hvbWUKK2V4cG9ydCBKQVZBX0hPTUUKK0ZJTEVNR1JfQlJPV1NFUl9IT01FPS4uCitleHBvcnQgRklMRU1HUl9CUk9XU0VSX0hPTUUKKworUEFUSD0ke0pBVkFfSE9NRX0vYmluOiR7RklMRU1HUl9CUk9XU0VSX0hPTUV9L2JpbjovdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbgorZXhwb3J0IFBBVEgKKworJEpBVkFfSE9NRS9iaW4vamF2YSAtRGphdmEuZXh0LmRpcnM9JHtGSUxFTUdSX0JST1dTRVJfSE9NRX0vbGliIFwKKyAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIuc3lzdGVtLlhtbFJwY0ZpbGVtZ3JCcm93c2VyICYKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL2NvbnRyb2xsZXIvVGFibGVMaXN0ZW5lci5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvY29udHJvbGxlci9UYWJsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlYjVkNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL2NvbnRyb2xsZXIvVGFibGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIuY29udHJvbGxlcjsKKworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbC5IU1NGU2hlZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRldvcmtib29rOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5tZW51cy5SaWdodENsaWNrTWVudTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVscy5IZWFkZXJDZWxsOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXcucGFuZWxzLkhlYWRlclNwYWNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVscy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHMuVGFibGVQYW5lOworCitwdWJsaWMgY2xhc3MgVGFibGVMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIsIEFjdGlvbkxpc3RlbmVyIHsKKworICBwcml2YXRlIENvbXBvbmVudCBjYWxsZXI7CisgIHByaXZhdGUgVGFibGVQYW5lIHRhYmxlOworICBwcml2YXRlIGludCBtb3VzZVBvczsKKyAgcHJpdmF0ZSBSaWdodENsaWNrTWVudSByY01lbnU7CisKKyAgcHVibGljIFRhYmxlTGlzdGVuZXIoVGFibGVQYW5lIHQpIHsKKyAgICB0YWJsZSA9IHQ7CisgICAgbW91c2VQb3MgPSAtMTsKKyAgICBjYWxsZXIgPSBudWxsOworICAgIHJjTWVudSA9IG5ldyBSaWdodENsaWNrTWVudSh0aGlzKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgYXJnMCkgeworICB9CisKKyAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgYXJnMCkgeworICB9CisKKyAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKSB7CisgIH0KKworICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7CisgICAgY2FsbGVyID0gZS5nZXRDb21wb25lbnQoKTsKKyAgICBtb3VzZVBvcyA9IGUuZ2V0WCgpICsgY2FsbGVyLmdldFgoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7CisgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgSGVhZGVyU3BhY2VyKSB7CisgICAgICAgIEhlYWRlclNwYWNlciBoc0NhbGxlciA9IChIZWFkZXJTcGFjZXIpIGNhbGxlcjsKKyAgICAgICAgaWYgKGUuZ2V0TW9kaWZpZXJzKCkgPT0gMTgKKyAgICAgICAgICAgICYmIHRhYmxlLmhpZGRlbkNvbHMuY29udGFpbnMobmV3IEludGVnZXIoaHNDYWxsZXIuZ2V0Q29sTnVtKCkgKyAxKSkpIHsKKyAgICAgICAgICByY01lbnUuc2V0VW5oaWRlTW9kZSgpOworICAgICAgICAgIHJjTWVudS5zaG93KGNhbGxlciwgZS5nZXRYKCksIGUuZ2V0WSgpKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBjaGFuZ2UgPSBlLmdldFgoKSArIGNhbGxlci5nZXRYKCkgLSBtb3VzZVBvczsKKyAgICAgICAgICBpbnQgY3VyV2lkdGggPSB0YWJsZS5oZWFkZXIuZ2V0V2lkdGgoaHNDYWxsZXIuZ2V0Q29sTnVtKCkpOworICAgICAgICAgIHRhYmxlLmhlYWRlci5jaGFuZ2VXaWR0aChoc0NhbGxlci5nZXRDb2xOdW0oKSwgY3VyV2lkdGggKyBjaGFuZ2UpOworCisgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0YWJsZS5nZXRDb21wb25lbnRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICgoUm93KSB0YWJsZS5nZXRDb21wb25lbnQoaSkpLmNoYW5nZVdpZHRoKCgoSGVhZGVyU3BhY2VyKSBjYWxsZXIpCisgICAgICAgICAgICAgICAgLmdldENvbE51bSgpLCBjdXJXaWR0aCArIGNoYW5nZSArIDIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYWxsZXIgPSBudWxsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgSGVhZGVyQ2VsbCAmJiBlLmdldE1vZGlmaWVycygpID09IDE4KSB7CisgICAgICAgICAgcmNNZW51LnNldEhpZGVNb2RlKCk7CisgICAgICAgICAgcmNNZW51LnNob3coY2FsbGVyLCBlLmdldFgoKSwgZS5nZXRZKCkpOworCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhcmcwKSB7CisgICAgaWYgKGFyZzAuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiSGlkZSIpKSB7CisgICAgICBpZiAoY2FsbGVyICE9IG51bGwpIHsKKyAgICAgICAgaW50IGNvbE51bSA9ICgoSGVhZGVyQ2VsbCkgY2FsbGVyKS5nZXRDb2xOdW0oKTsKKyAgICAgICAgdGFibGUuaGlkZUNvbHVtbihjb2xOdW0pOworICAgICAgICBjYWxsZXIgPSBudWxsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJVbmhpZGUiKSkgeworICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7CisgICAgICAgIGludCBjb2xOdW0gPSAoKEhlYWRlclNwYWNlcikgY2FsbGVyKS5nZXRDb2xOdW0oKSArIDE7CisgICAgICAgIHRhYmxlLnVuaGlkZUNvbHVtbihjb2xOdW0pOworICAgICAgICBjYWxsZXIgPSBudWxsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJVbmhpZGUgQ29sdW1ucyIpKSB7CisgICAgICB3aGlsZSAoIXRhYmxlLmhpZGRlbkNvbHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRhYmxlLnVuaGlkZUNvbHVtbigodGFibGUuaGlkZGVuQ29scy5maXJzdEVsZW1lbnQoKSkuaW50VmFsdWUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmcwLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoIkV4cG9ydCBUYWJsZSIpKSB7CisKKyAgICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBmYyA9IG5ldyBKRmlsZUNob29zZXIoKTsKKyAgICAgIGludCByZXR1cm5WYWwgPSBmYy5zaG93U2F2ZURpYWxvZyh0YWJsZSk7CisgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworCisgICAgICAgIC8vIHdyaXRlIG91dCBleGNlbCBmaWxlCisgICAgICAgIFN0cmluZyBmdWxsRmlsZU5hbWUgPSAoZmMuZ2V0U2VsZWN0ZWRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBpZiAoIWZ1bGxGaWxlTmFtZS5lbmRzV2l0aCgiLnhscyIpKQorICAgICAgICAgIGZ1bGxGaWxlTmFtZSArPSAiLnhscyI7CisKKyAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vaygpOworICAgICAgICBIU1NGU2hlZXQgc2hlZXQgPSB3Yi5jcmVhdGVTaGVldCgicmVzdWx0cyIpOworICAgICAgICBIU1NGUm93IGhlYWRlclJvdyA9IHNoZWV0LmNyZWF0ZVJvdygoc2hvcnQpIDApOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJsZS5nZXRSb3coMCkuZ2V0Q29tcG9uZW50Q291bnQoKTsgaisrKSB7CisgICAgICAgICAgaWYgKCF0YWJsZS5oaWRkZW5Db2xzLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGopKSkgeworICAgICAgICAgICAgaGVhZGVyUm93LmNyZWF0ZUNlbGwoKHNob3J0KSBpKS5zZXRDZWxsVmFsdWUoCisgICAgICAgICAgICAgICAgdGFibGUuaGVhZGVyLmdldFRleHQoaikpOworICAgICAgICAgICAgaSsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdGFibGUuZ2V0Q29tcG9uZW50Q291bnQoKSAtIDE7IGsrKykgeworICAgICAgICAgIEhTU0ZSb3cgcm93ID0gc2hlZXQuY3JlYXRlUm93KChzaG9ydCkgayArIDEpOworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFibGUuZ2V0Um93KDApLmdldENvbXBvbmVudENvdW50KCk7IGorKykgeworICAgICAgICAgICAgaWYgKCF0YWJsZS5oaWRkZW5Db2xzLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGopKSkgeworICAgICAgICAgICAgICByb3cuY3JlYXRlQ2VsbCgoc2hvcnQpIGkpLnNldENlbGxWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICh0YWJsZS5nZXRSb3coaykpLmdldFRleHQoaikpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlT3V0OworICAgICAgICB0cnkgeworCisgICAgICAgICAgZmlsZU91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZ1bGxGaWxlTmFtZSk7CisgICAgICAgICAgd2Iud3JpdGUoZmlsZU91dCk7CisgICAgICAgICAgZmlsZU91dC5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfQorCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvY29udHJvbGxlci9XaW5kb3dMaXN0ZW5lci5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvY29udHJvbGxlci9XaW5kb3dMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmQ3MjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci9jb250cm9sbGVyL1dpbmRvd0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci5jb250cm9sbGVyOworCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIubW9kZWwuQ2FzREI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5NYWluV2luZG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXcucHJvbXB0cy5Db25uZWN0UHJvbXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXcucHJvbXB0cy5RdWVyeUJ1aWxkZXJQcm9tcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wcm9tcHRzLlNvcnRQcm9tcHQ7CisKK3B1YmxpYyBjbGFzcyBXaW5kb3dMaXN0ZW5lciBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKworICBwcml2YXRlIE1haW5XaW5kb3cgd2luZG93OworICBwcml2YXRlIENvbm5lY3RQcm9tcHQgcHJvbXB0OworICBwcml2YXRlIFNvcnRQcm9tcHQgc29ydDsKKyAgcHJpdmF0ZSBRdWVyeUJ1aWxkZXJQcm9tcHQgcXVlcnk7CisKKyAgcHJpdmF0ZSBDYXNEQiBkYjsKKworICBwdWJsaWMgV2luZG93TGlzdGVuZXIoTWFpbldpbmRvdyBtKSB7CisgICAgd2luZG93ID0gbTsKKyAgICBkYiA9IG5ldyBDYXNEQigpOworICB9CisKKyAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFyZzApIHsKKyAgICBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJBYm91dCIpKSB7CisgICAgICBTdHJpbmcgYWJvdXRJbmZvID0gIk9PRFQgQ2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2ZXIgRmlsZSBNYW5nZXIgQnJvd3Nlci5cbiIKKyAgICAgICAgICArICJDb3B5cmlnaHQgKGMpIDIwMTAsIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiI7CisgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh3aW5kb3csIGFib3V0SW5mbyk7CisgICAgfSBlbHNlIGlmIChhcmcwLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoIlF1ZXJ5IExhbmd1YWdlIikpIHsKKyAgICAgIFN0cmluZyBhYm91dFF1ZXJ5TGFuZ3VhZ2UgPSAiVGhlIENBUyBGaWxlIE1hbmFnZXIgQnJvd3NlciB1c2VzIHRoZSBMdWNlbmUgUXVlcnkgTGFuZ3VhZ2UuXG4iCisgICAgICAgICAgKyAiTW9yZSBJbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQ6XG4iCisgICAgICAgICAgKyAiaHR0cDovL2x1Y2VuZS5hcGFjaGUub3JnL2phdmEvZG9jcy9xdWVyeXBhcnNlcnN5bnRheC5odG1sIjsKKyAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHdpbmRvdywgYWJvdXRRdWVyeUxhbmd1YWdlKTsKKyAgICB9IGVsc2UgaWYgKGFyZzAuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiRXhpdCIpKSB7CisgICAgICBTdHJpbmcgZXhpdFdhcm5pbmcgPSAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGV4aXQgdGhlIENBUyBGaWxlIE1hbmFnZXIgQnJvd3Nlcj9cbiIKKyAgICAgICAgICArICJBbGwgdW5leHBvcnRlZCBxdWVyaWVzIHdpbGwgYmUgbG9zdC4iOworICAgICAgaW50IHJldHVyblZhbCA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKHdpbmRvdywgZXhpdFdhcm5pbmcsCisgICAgICAgICAgIkV4aXQiLCBKT3B0aW9uUGFuZS5PS19DQU5DRUxfT1BUSU9OLCBKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOworICAgICAgaWYgKHJldHVyblZhbCA9PSBKT3B0aW9uUGFuZS5PS19PUFRJT04pIHsKKyAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmcwLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoIkNvbm5lY3QuLi4iKSkgeworICAgICAgLy8gdGhpcyBpcyBmcm9tIHRoZSBtYWluIG1lbnUKKyAgICAgIHdpbmRvdy5iYXIuY2hhbmdlQ29ubmVjdFN0YXR1cygpOworICAgICAgcHJvbXB0ID0gbmV3IENvbm5lY3RQcm9tcHQodGhpcyk7CisgICAgICBwcm9tcHQucGFjaygpOworICAgICAgcHJvbXB0LnNldFZpc2libGUodHJ1ZSk7CisgICAgfSBlbHNlIGlmIChhcmcwLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoIkRpc2Nvbm5lY3QiKSkgeworICAgICAgU3RyaW5nIGRpc2Nvbm5lY3RXYXJuaW5nID0gIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkaXNjb25uZWN0IGZyb20gdGhpcyBGaWxlIE1hbmFnZXI/XG4iCisgICAgICAgICAgKyAiQWxsIHVuZXhwb3J0ZWQgcXVlcmllcyB3aWxsIGJlIGxvc3QuIjsKKyAgICAgIGludCByZXR1cm5WYWwgPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyh3aW5kb3csIGRpc2Nvbm5lY3RXYXJuaW5nLAorICAgICAgICAgICJEaXNjb25uZWN0IiwgSk9wdGlvblBhbmUuT0tfQ0FOQ0VMX09QVElPTiwKKyAgICAgICAgICBKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOworICAgICAgaWYgKHJldHVyblZhbCA9PSBKT3B0aW9uUGFuZS5PS19PUFRJT04pIHsKKyAgICAgICAgd2luZG93LmJhci5jaGFuZ2VDb25uZWN0U3RhdHVzKCk7CisgICAgICAgIGRiLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgd2luZG93Lm1QYW5lLnRQYW5lLnNldEJsYW5rKCk7CisgICAgICAgIHdpbmRvdy5xUGFuZS51cGRhdGVUeXBlcyhuZXcgU3RyaW5nW10geyAiIiB9KTsKKyAgICAgICAgd2luZG93LmJQYW5lLmNoYW5nZVN0YXR1cygiRGlzY29ubmVjdGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmcwLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoIkNhbmNlbCIpKSB7CisgICAgICBpZiAoKChKQnV0dG9uKSBhcmcwLmdldFNvdXJjZSgpKS5nZXROYW1lKCkuZXF1YWxzKCJDb25uZWN0Q2FuY2VsIikpIHsKKyAgICAgICAgcHJvbXB0LmRpc3Bvc2UoKTsKKyAgICAgICAgd2luZG93LmJhci5jaGFuZ2VDb25uZWN0U3RhdHVzKCk7CisgICAgICB9IGVsc2UgaWYgKCgoSkJ1dHRvbikgYXJnMC5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpLmVxdWFscygiU29ydENhbmNlbCIpKSB7CisgICAgICAgIHNvcnQuZGlzcG9zZSgpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJDb25uZWN0IikpIHsKKyAgICAgIC8vIHRoaXMgaXMgZnJvbSB0aGUgY29ubmVjdCBwcm9tcHQKKyAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZGIuY29ubmVjdChwcm9tcHQuZ2V0Q0FTVXJsKCkpOworICAgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICB3aW5kb3cucVBhbmUudXBkYXRlVHlwZXMoZGIuZ2V0QXZhaWxhYmxlVHlwZXMoKSk7CisgICAgICAgIHdpbmRvdy5iUGFuZS5jaGFuZ2VTdGF0dXMoIkNvbm5lY3RlZCB0byAiICsgcHJvbXB0LmdldENBU1VybCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdpbmRvdy5iYXIuY2hhbmdlQ29ubmVjdFN0YXR1cygpOworICAgICAgICBTdHJpbmcgZXJyb3JDb25uZWN0aW5nU3RyaW5nID0gIkVycm9yIENvbm5lY3RpbmcgdG8gQ0FTIEZpbGUgTWFuYWdlciBhdCB0aGlzIGZvbGxvd2luZyBhZGRyZXNzOiIKKyAgICAgICAgICAgICsgcHJvbXB0LmdldENBU1VybCgpOworICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh3aW5kb3csIGVycm9yQ29ubmVjdGluZ1N0cmluZywgIkVycm9yIiwKKyAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworICAgICAgfQorICAgICAgcHJvbXB0LmRpc3Bvc2UoKTsKKyAgICB9IGVsc2UgaWYgKGFyZzAuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiU29ydCIpKSB7CisgICAgICBzb3J0ID0gbmV3IFNvcnRQcm9tcHQod2luZG93LCB0aGlzKTsKKyAgICAgIHNvcnQucGFjaygpOworICAgICAgc29ydC5zZXRWaXNpYmxlKHRydWUpOworICAgIH0gZWxzZSBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJRdWVyeSBCdWlsZGVyIikpIHsKKyAgICAgIGlmIChkYi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgIHF1ZXJ5ID0gbmV3IFF1ZXJ5QnVpbGRlclByb21wdChkYiwgdGhpcyk7CisgICAgICAgIHF1ZXJ5LnBhY2soKTsKKyAgICAgICAgcXVlcnkuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cmluZyBlcnJvclF1ZXJ5U3RyaW5nID0gIllvdSBtdXN0IGNvbm5lY3QgdG8gYSBDQVMgRmlsZSBNYW5hZ2VyIGJlZm9yZSB1c2luZyB0aGUgUXVlcnkgQnVpbGRlci4iOworICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh3aW5kb3csIGVycm9yUXVlcnlTdHJpbmcsICJEaXNjb25uZWN0ZWQiLAorICAgICAgICAgICAgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFyZzAuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiT0siKSkgeworICAgICAgd2luZG93Lm1QYW5lLnRQYW5lLnNvcnRSb3dzKHNvcnQuZ2V0U29ydEluZGV4KCksIHNvcnQuZ2V0U29ydFR5cGUoKSk7CisgICAgICBzb3J0LmRpc3Bvc2UoKTsKKyAgICB9IGVsc2UgaWYgKGFyZzAuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiU2VhcmNoIikpIHsKKyAgICAgIGlmICgoKEpCdXR0b24pIGFyZzAuZ2V0U291cmNlKCkpLmdldE5hbWUoKS5lcXVhbHMoIkFkdmFuY2VkUXVlcnkiKSkgeworICAgICAgICBpZiAoZGIuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgIHdpbmRvdy5iUGFuZS5jaGFuZ2VTdGF0dXMoIlF1ZXJ5aW5nIHRoZSBDQVMuLi4iKTsKKyAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGRiLmlzc3VlUXVlcnkocXVlcnkuZ2V0UXVlcnkoKSwgcXVlcnkKKyAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIHdpbmRvdy5tUGFuZS50UGFuZS5uZXdUYWJsZShkYi5yZXN1bHRzLmdldERhdGEoKSk7CisgICAgICAgICAgICB3aW5kb3cuYlBhbmUuY2hhbmdlU3RhdHVzKCJRdWVyeTogIiArIHF1ZXJ5LmdldFF1ZXJ5U3RyaW5nKCkKKyAgICAgICAgICAgICAgICArICIgcmV0dXJuZWQgIiArIGRiLnJlc3VsdHMuZ2V0TnVtUmVjb3JkcygpICsgIiByZWNvcmRzLiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aW5kb3cubVBhbmUudFBhbmUuc2V0QmxhbmsoKTsKKyAgICAgICAgICAgIHdpbmRvdy5iUGFuZS5jaGFuZ2VTdGF0dXMoIlF1ZXJ5IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIHdpbmRvdy5xUGFuZS5jbGVhclF1ZXJ5KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHF1ZXJ5LmRpc3Bvc2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkYi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgd2luZG93LmJQYW5lLmNoYW5nZVN0YXR1cygiUXVlcnlpbmcgdGhlIENBUy4uLiIpOworICAgICAgICAgIFN0cmluZyBxdWVyeSA9IHdpbmRvdy5xUGFuZS5nZXRRdWVyeSgpOworICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGIuY3JlYXRlUXVlcnkocXVlcnksIHdpbmRvdy5xUGFuZS5nZXRUeXBlKCkpOworICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIHdpbmRvdy5tUGFuZS50UGFuZS5uZXdUYWJsZShkYi5yZXN1bHRzLmdldERhdGEoKSk7CisgICAgICAgICAgICB3aW5kb3cuYlBhbmUuY2hhbmdlU3RhdHVzKCJRdWVyeTogIiArIHF1ZXJ5ICsgIiByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgKyBkYi5yZXN1bHRzLmdldE51bVJlY29yZHMoKSArICIgcmVjb3Jkcy4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2luZG93Lm1QYW5lLnRQYW5lLnNldEJsYW5rKCk7CisgICAgICAgICAgICB3aW5kb3cuYlBhbmUuY2hhbmdlU3RhdHVzKCJRdWVyeSBmYWlsZWQuIik7CisgICAgICAgICAgICB3aW5kb3cucVBhbmUuY2xlYXJRdWVyeSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJDbGVhciBRdWVyeSIpKSB7CisgICAgICBTdHJpbmcgY2xlYXJXYXJuaW5nID0gIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbGVhciB0aGUgY3VycmVudCBRdWVyeT9cbiIKKyAgICAgICAgICArICJBbGwgdW5leHBvcnRlZCBxdWVyaWVzIHdpbGwgYmUgbG9zdC4iOworICAgICAgaW50IHJldHVyblZhbCA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKHdpbmRvdywgY2xlYXJXYXJuaW5nLAorICAgICAgICAgICJDbGVhciIsIEpPcHRpb25QYW5lLk9LX0NBTkNFTF9PUFRJT04sIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisgICAgICBpZiAocmV0dXJuVmFsID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgeworICAgICAgICB3aW5kb3cubVBhbmUudFBhbmUuc2V0QmxhbmsoKTsKKyAgICAgICAgd2luZG93LmJQYW5lLmNoYW5nZVN0YXR1cygiUXVlcnkgY2xlYXJlZC4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvbW9kZWwvQ2FzREIuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL21vZGVsL0Nhc0RCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNTM0NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL21vZGVsL0Nhc0RCLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci5tb2RlbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlF1ZXJ5UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKKworcHVibGljIGNsYXNzIENhc0RCIHsKKworICBVUkwgZmlsZW1nclVybDsKKyAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50OworICBwdWJsaWMgUmVzdWx0cyByZXN1bHRzOworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmcmVlVGV4dEJsb2NrID0gIl9fRlJFRV9fIjsKKworICBwdWJsaWMgQ2FzREIoKSB7CisgICAgZmlsZW1nclVybCA9IG51bGw7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KFN0cmluZyBjYXMpIHsKKyAgICB0cnkgeworICAgICAgZmlsZW1nclVybCA9IG5ldyBVUkwoY2FzKTsKKyAgICAgIGNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChmaWxlbWdyVXJsKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmlsZW1nclVybCA9IG51bGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKKyAgICBmaWxlbWdyVXJsID0gbnVsbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworICAgIGlmIChmaWxlbWdyVXJsID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZVR5cGVzKCkgeworICAgIFN0cmluZ1tdIHR5cGVzID0gbnVsbDsKKyAgICBpZiAoZmlsZW1nclVybCAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBWZWN0b3I8UHJvZHVjdFR5cGU+IHYgPSAoVmVjdG9yPFByb2R1Y3RUeXBlPikgY2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICBWZWN0b3I8U3RyaW5nPiBuYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICB0eXBlcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykKKyAgICAgICAgICBuYW1lcy5hZGQodi5nZXQoaSkuZ2V0TmFtZSgpKTsKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG5hbWVzKTsKKyAgICAgICAgbmFtZXMudG9BcnJheSh0eXBlcyk7CisKKyAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICB0eXBlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICB0eXBlc1swXSA9ICIiOworICAgIH0KKworICAgIHJldHVybiB0eXBlczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRBdmFpbGFibGVFbGVtZW50cyhTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKSB7CisgICAgU3RyaW5nW10gZWxlbWVudHMgPSBudWxsOworICAgIGlmIChmaWxlbWdyVXJsICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gY2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgIFZlY3RvcjxFbGVtZW50PiB2ID0gKFZlY3RvcjxFbGVtZW50PikgY2xpZW50CisgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgZWxlbWVudHMgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspCisgICAgICAgICAgbmFtZXMuYWRkKHYuZ2V0KGkpLmdldEVsZW1lbnROYW1lKCkpOworCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobmFtZXMpOworICAgICAgICBuYW1lcy50b0FycmF5KGVsZW1lbnRzKTsKKworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZWxlbWVudHMgPSBuZXcgU3RyaW5nWzFdOworICAgICAgZWxlbWVudHNbMF0gPSAiIjsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50SUQoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisgICAgU3RyaW5nIGVsZW1lbnRJRCA9IG5ldyBTdHJpbmcoKTsKKyAgICBFbGVtZW50IGU7CisgICAgdHJ5IHsKKyAgICAgIGUgPSBjbGllbnQuZ2V0RWxlbWVudEJ5TmFtZShlbGVtZW50TmFtZSk7CisgICAgICBlbGVtZW50SUQgPSBlLmdldEVsZW1lbnRJZCgpOworICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiBlMSkgeworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudElEOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNzdWVRdWVyeShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeSBxdWVyeSwKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZSkgeworICAgIHJlc3VsdHMgPSBuZXcgUmVzdWx0cygpOworICAgIHRyeSB7CisgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gY2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlKTsKKyAgICAgIFZlY3RvcjxQcm9kdWN0PiBwcm9kdWN0cyA9IChWZWN0b3I8UHJvZHVjdD4pIGNsaWVudC5xdWVyeShxdWVyeSwgdHlwZSk7CisgICAgICBpbnQgbWF4VmFsID0gMjA7CisgICAgICBpZiAocHJvZHVjdHMuc2l6ZSgpIDwgbWF4VmFsKQorICAgICAgICBtYXhWYWwgPSBwcm9kdWN0cy5zaXplKCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFZhbDsgaSsrKSB7CisgICAgICAgIFZlY3RvcjxFbGVtZW50PiBlbGVtZW50cyA9IChWZWN0b3I8RWxlbWVudD4pIGNsaWVudAorICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgTWV0YWRhdGEgbSA9IGNsaWVudC5nZXRNZXRhZGF0YShwcm9kdWN0cy5nZXQoaSkpOworICAgICAgICBIYXNodGFibGUgaGFzaCA9IG0uZ2V0SGFzaHRhYmxlKCk7CisgICAgICAgIHJlc3VsdHMuYWRkUHJvZHVjdChtKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY3JlYXRlUXVlcnkoU3RyaW5nIHF1ZXJ5VGV4dCwgU3RyaW5nIHByb2R1Y3RUeXBlKSB7CisKKyAgICByZXN1bHRzID0gbmV3IFJlc3VsdHMoKTsKKyAgICBpZiAocXVlcnlUZXh0LnRyaW0oKS5lcXVhbHMoIioiKSkgeworICAgICAgUHJvZHVjdFR5cGUgdHlwZTsKKyAgICAgIHRyeSB7CisgICAgICAgIHR5cGUgPSBjbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGUpOworICAgICAgICBWZWN0b3I8UHJvZHVjdD4gcHJvZHVjdHMgPSAoVmVjdG9yPFByb2R1Y3Q+KSBjbGllbnQKKyAgICAgICAgICAgIC5nZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgIC8vIGZvcihpbnQgaT0wO2k8cHJvZHVjdHMuc2l6ZSgpO2krKyl7CisgICAgICAgIGludCBtYXhWYWwgPSAyMDsKKyAgICAgICAgaWYgKHByb2R1Y3RzLnNpemUoKSA8IG1heFZhbCkKKyAgICAgICAgICBtYXhWYWwgPSBwcm9kdWN0cy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4VmFsOyBpKyspIHsKKyAgICAgICAgICBWZWN0b3I8RWxlbWVudD4gZWxlbWVudHMgPSAoVmVjdG9yPEVsZW1lbnQ+KSBjbGllbnQKKyAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgICBNZXRhZGF0YSBtID0gY2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3RzLmdldChpKSk7CisgICAgICAgICAgSGFzaHRhYmxlIGhhc2ggPSBtLmdldEhhc2h0YWJsZSgpOworICAgICAgICAgIHJlc3VsdHMuYWRkUHJvZHVjdChtKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgUXVlcnlCdWlsZGVyIHFiID0gbmV3IFF1ZXJ5QnVpbGRlcih0aGlzKTsKKyAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGNhc1EgPSBxYi5QYXJzZVF1ZXJ5KHF1ZXJ5VGV4dCk7CisgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIHR5cGUgPSBjbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGUpOworICAgICAgICBWZWN0b3I8UHJvZHVjdD4gcHJvZHVjdHMgPSAoVmVjdG9yPFByb2R1Y3Q+KSBjbGllbnQucXVlcnkoY2FzUSwgdHlwZSk7CisgICAgICAgIGludCBtYXhWYWwgPSAyMDsKKyAgICAgICAgaWYgKHByb2R1Y3RzLnNpemUoKSA8IG1heFZhbCkKKyAgICAgICAgICBtYXhWYWwgPSBwcm9kdWN0cy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4VmFsOyBpKyspIHsKKyAgICAgICAgICBWZWN0b3I8RWxlbWVudD4gZWxlbWVudHMgPSAoVmVjdG9yPEVsZW1lbnQ+KSBjbGllbnQKKyAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgICBNZXRhZGF0YSBtID0gY2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3RzLmdldChpKSk7CisgICAgICAgICAgSGFzaHRhYmxlIGhhc2ggPSBtLmdldEhhc2h0YWJsZSgpOworICAgICAgICAgIHJlc3VsdHMuYWRkUHJvZHVjdChtKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjbGVhclF1ZXJ5KCkgeworICAgIHJlc3VsdHMgPSBudWxsOworICAgIHJldHVybiB0cnVlOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL21vZGVsL1F1ZXJ5QnVpbGRlci5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvbW9kZWwvUXVlcnlCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyZGY3MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL21vZGVsL1F1ZXJ5QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIubW9kZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlF1ZXJ5UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuQ2xhdXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlBocmFzZVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5SYW5nZVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5UZXJtUXVlcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SYW5nZVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzLkNBU0FuYWx5emVyOworCitwdWJsaWMgY2xhc3MgUXVlcnlCdWlsZGVyIHsKKworICBwcml2YXRlIENhc0RCIGRhdGFiYXNlOworCisgIHB1YmxpYyBRdWVyeUJ1aWxkZXIoQ2FzREIgZGIpIHsKKyAgICBkYXRhYmFzZSA9IGRiOworICB9CisKKyAgcHVibGljIFF1ZXJ5IFBhcnNlUXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgLy8gbm90ZSB0aGF0ICJfX0ZSRUVfXyIgaXMgYSBjb250cm9sIHdvcmsgZm9yIGZyZWUgdGV4dCBzZWFyY2hpbmcKKyAgICBRdWVyeVBhcnNlciBwYXJzZXIgPSBuZXcgUXVlcnlQYXJzZXIoIl9fRlJFRV9fIiwgbmV3IENBU0FuYWx5emVyKCkpOworCisgICAgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5IGx1Y2VuZVEgPSBudWxsOworICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGNhc1EgPSBuZXcgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkoKTsKKworICAgIHRyeSB7CisgICAgICBsdWNlbmVRID0gcGFyc2VyLnBhcnNlKHF1ZXJ5KTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlci5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIFN5c3RlbS5vdXQucHJpbnRsbihsdWNlbmVRLnRvU3RyaW5nKCkpOworICAgIEdlbmVyYXRlQ0FTUXVlcnkoY2FzUSwgbHVjZW5lUSk7CisKKyAgICByZXR1cm4gY2FzUTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIEdlbmVyYXRlQ0FTUXVlcnkob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkgY2FzUSwKKyAgICAgIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSBsdWNlbmVRKSB7CisgICAgaWYgKGx1Y2VuZVEgaW5zdGFuY2VvZiBUZXJtUXVlcnkpIHsKKyAgICAgIFRlcm0gdCA9ICgoVGVybVF1ZXJ5KSBsdWNlbmVRKS5nZXRUZXJtKCk7CisgICAgICBpZiAodC5maWVsZCgpLmVxdWFscygiX19GUkVFX18iKSkgeworICAgICAgICAvLyBpZihjYXNRdWVyeS5nZXRDcml0ZXJpYSgpLmlzRW1wdHkoKSkgY2FzUXVlcnkuYWRkQ3JpdGVyaW9uKG5ldworICAgICAgICAvLyBGcmVlVGV4dFF1ZXJ5Q3JpdGVyaWEoKSk7CisgICAgICAgIC8vICgoRnJlZVRleHRRdWVyeUNyaXRlcmlhKWNhc1F1ZXJ5LmdldENyaXRlcmlhKCkuZ2V0KDApKS5hZGRWYWx1ZSh0LnRleHQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmcgZWxlbWVudCA9IGRhdGFiYXNlLmdldEVsZW1lbnRJRCh0LmZpZWxkKCkpOworICAgICAgICBpZiAoIWVsZW1lbnQuZXF1YWxzKCIiKSAmJiAhdC50ZXh0KCkuZXF1YWxzKCIiKSkgeworCisgICAgICAgICAgY2FzUS5hZGRDcml0ZXJpb24obmV3IFRlcm1RdWVyeUNyaXRlcmlhKGVsZW1lbnQsIHQudGV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGx1Y2VuZVEgaW5zdGFuY2VvZiBQaHJhc2VRdWVyeSkgeworICAgICAgVGVybVtdIHQgPSAoKFBocmFzZVF1ZXJ5KSBsdWNlbmVRKS5nZXRUZXJtcygpOworICAgICAgaWYgKHRbMF0uZmllbGQoKS5lcXVhbHMoIl9fRlJFRV9fIikpIHsKKyAgICAgICAgLy8gaWYoY2FzUXVlcnkuZ2V0Q3JpdGVyaWEoKS5pc0VtcHR5KCkpIGNhc1F1ZXJ5LmFkZENyaXRlcmlvbihuZXcKKyAgICAgICAgLy8gRnJlZVRleHRRdWVyeUNyaXRlcmlhKCkpOworICAgICAgICAvLyBmb3IoaW50IGk9MDtpPHQubGVuZ3RoO2krKykKKyAgICAgICAgLy8gKChGcmVlVGV4dFF1ZXJ5Q3JpdGVyaWEpY2FzUXVlcnkuZ2V0Q3JpdGVyaWEoKS5nZXQoMCkpLmFkZFZhbHVlKHRbaV0udGV4dCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gZGF0YWJhc2UuZ2V0RWxlbWVudElEKHRbaV0uZmllbGQoKSk7CisgICAgICAgICAgaWYgKCFlbGVtZW50LmVxdWFscygiIikgJiYgIXRbaV0udGV4dCgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGNhc1EuYWRkQ3JpdGVyaW9uKG5ldyBUZXJtUXVlcnlDcml0ZXJpYShlbGVtZW50LCB0W2ldLnRleHQoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAobHVjZW5lUSBpbnN0YW5jZW9mIFJhbmdlUXVlcnkpIHsKKyAgICAgIFRlcm0gc3RhcnRUID0gKChSYW5nZVF1ZXJ5KSBsdWNlbmVRKS5nZXRMb3dlclRlcm0oKTsKKyAgICAgIFRlcm0gZW5kVCA9ICgoUmFuZ2VRdWVyeSkgbHVjZW5lUSkuZ2V0VXBwZXJUZXJtKCk7CisgICAgICBTdHJpbmcgZWxlbWVudCA9IGRhdGFiYXNlLmdldEVsZW1lbnRJRChzdGFydFQuZmllbGQoKSk7CisgICAgICBpZiAoIWVsZW1lbnQuZXF1YWxzKCIiKSAmJiAhc3RhcnRULnRleHQoKS5lcXVhbHMoIiIpCisgICAgICAgICAgJiYgIWVuZFQudGV4dCgpLmVxdWFscygiIikpIHsKKyAgICAgICAgY2FzUS5hZGRDcml0ZXJpb24obmV3IFJhbmdlUXVlcnlDcml0ZXJpYShlbGVtZW50LCBzdGFydFQudGV4dCgpLCBlbmRUCisgICAgICAgICAgICAudGV4dCgpKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsdWNlbmVRIGluc3RhbmNlb2YgQm9vbGVhblF1ZXJ5KSB7CisgICAgICBCb29sZWFuQ2xhdXNlW10gY2xhdXNlcyA9ICgoQm9vbGVhblF1ZXJ5KSBsdWNlbmVRKS5nZXRDbGF1c2VzKCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXVzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgR2VuZXJhdGVDQVNRdWVyeShjYXNRLCAoY2xhdXNlc1tpXSkuZ2V0UXVlcnkoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgUGFyc2luZyBRdWVyeSIpOworICAgICAgU3lzdGVtLmV4aXQoLTEpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci9tb2RlbC9SZXN1bHRzLmphdmEgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci9tb2RlbC9SZXN1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhZjBiZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL21vZGVsL1Jlc3VsdHMuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIubW9kZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworcHVibGljIGNsYXNzIFJlc3VsdHMgeworCisgIHB1YmxpYyBWZWN0b3I8TWV0YWRhdGE+IHByb2R1Y3RzOworCisgIHB1YmxpYyBSZXN1bHRzKCkgeworICAgIHByb2R1Y3RzID0gbmV3IFZlY3RvcjxNZXRhZGF0YT4oKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFByb2R1Y3QoTWV0YWRhdGEgbSkgeworICAgIHByb2R1Y3RzLmFkZChtKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0TnVtUmVjb3JkcygpIHsKKyAgICByZXR1cm4gcHJvZHVjdHMuc2l6ZSgpOworICB9CisKKyAgcHVibGljIFN0cmluZ1tdW10gZ2V0RGF0YSgpIHsKKworICAgIFN0cmluZ1tdW10gZGF0YSA9IG51bGw7CisgICAgaWYgKHByb2R1Y3RzLnNpemUoKSA+IDApIHsKKyAgICAgIGRhdGEgPSBuZXcgU3RyaW5nW3Byb2R1Y3RzLnNpemUoKSArIDFdW107CisKKyAgICAgIEhhc2h0YWJsZSBoYXNoID0gcHJvZHVjdHMuZmlyc3RFbGVtZW50KCkuZ2V0SGFzaHRhYmxlKCk7CisgICAgICBpbnQgbnVtQ29scyA9IGhhc2guc2l6ZSgpOworICAgICAgZGF0YVswXSA9IG5ldyBTdHJpbmdbbnVtQ29sc107CisgICAgICBpbnQgaSA9IDA7CisgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBoYXNoLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgZGF0YVswXVtpXSA9IGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGF0YVswXVtpXSk7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9kdWN0cy5zaXplKCk7IGorKykgeworICAgICAgICBkYXRhW2ogKyAxXSA9IG5ldyBTdHJpbmdbaV07CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaTsgaysrKSB7CisgICAgICAgICAgZGF0YVtqICsgMV1ba10gPSBwcm9kdWN0cy5nZXQoaikuZ2V0TWV0YWRhdGEoZGF0YVswXVtrXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gZGF0YTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvc3lzdGVtL1htbFJwY0ZpbGVtZ3JCcm93c2VyLmphdmEgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci9zeXN0ZW0vWG1sUnBjRmlsZW1nckJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWM5Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvc3lzdGVtL1htbFJwY0ZpbGVtZ3JCcm93c2VyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnN5c3RlbTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXcuTWFpbldpbmRvdzsKKworcHVibGljIGNsYXNzIFhtbFJwY0ZpbGVtZ3JCcm93c2VyIHsKKworICBwcml2YXRlIHN0YXRpYyBNYWluV2luZG93IHdpbmRvdzsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB3aW5kb3cgPSBuZXcgTWFpbldpbmRvdygpOworICAgICAgICB3aW5kb3cucGFjaygpOworICAgICAgICB3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9HdWlQYXJhbXMuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvR3VpUGFyYW1zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxMmRhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvR3VpUGFyYW1zLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXc7CisKK3B1YmxpYyBjbGFzcyBHdWlQYXJhbXMgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19XSURUSCA9IDYwMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0hFSUdIVCA9IDQwMDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NFTExfV0lEVEggPSA3MDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DRUxMX0hFSUdIVCA9IDIwOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L01haW5XaW5kb3cuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvTWFpbldpbmRvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L01haW5XaW5kb3cuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldzsKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5Db250YWluZXI7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworCitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIuY29udHJvbGxlci5UYWJsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLmNvbnRyb2xsZXIuV2luZG93TGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIubW9kZWwuQ2FzREI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHMuQm90dG9tUGFuZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVscy5IZWFkZXJSb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHMuTWlkZGxlUGFuZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVscy5RdWVyeVBhbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wcm9tcHRzLkNvbm5lY3RQcm9tcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wcm9tcHRzLlNvcnRQcm9tcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5tZW51cy5NZW51QmFyOworCitwdWJsaWMgY2xhc3MgTWFpbldpbmRvdyBleHRlbmRzIEpGcmFtZSB7CisKKyAgcHVibGljIFF1ZXJ5UGFuZSBxUGFuZTsKKyAgcHVibGljIE1pZGRsZVBhbmUgbVBhbmU7CisgIHB1YmxpYyBCb3R0b21QYW5lIGJQYW5lOworICBwdWJsaWMgTWVudUJhciBiYXI7CisKKyAgcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciB3TGlzdGVuZXI7CisKKyAgcHVibGljIE1haW5XaW5kb3coKSB7CisgICAgd0xpc3RlbmVyID0gbmV3IFdpbmRvd0xpc3RlbmVyKHRoaXMpOworICAgIC8vIGRiID0gbmV3IENhc0RCKCk7CisgICAgc2V0TmFtZSgiQ0FTIEZpbGUgTWFuYWdlciBCcm93c2VyIik7CisgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEVYSVRfT05fQ0xPU0UpOworICAgIHFQYW5lID0gbmV3IFF1ZXJ5UGFuZSh3TGlzdGVuZXIpOworICAgIG1QYW5lID0gbmV3IE1pZGRsZVBhbmUoKTsKKyAgICBiUGFuZSA9IG5ldyBCb3R0b21QYW5lKCk7CisgICAgRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKEd1aVBhcmFtcy5XSU5ET1dfV0lEVEgsIEd1aVBhcmFtcy5XSU5ET1dfSEVJR0hUKTsKKyAgICBDb250YWluZXIgcCA9IHRoaXMuZ2V0Q29udGVudFBhbmUoKTsKKyAgICBwLnNldFByZWZlcnJlZFNpemUoZCk7CisgICAgcC5zZXRNaW5pbXVtU2l6ZShkKTsKKyAgICBwLnNldE1heGltdW1TaXplKGQpOworICAgIHAuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgcC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICBwLmFkZChxUGFuZSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICBwLmFkZChtUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgcC5hZGQoYlBhbmUsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICBiYXIgPSBuZXcgTWVudUJhcih3TGlzdGVuZXIsIG1QYW5lLmdldExpc3RlbmVyKCkpOworICAgIHRoaXMuc2V0Sk1lbnVCYXIoYmFyKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2xIZWFkZXJzKCkgeworICAgIEhlYWRlclJvdyBoID0gbVBhbmUudFBhbmUuZ2V0SGVhZGVyKCk7CisgICAgU3RyaW5nW10gaGVhZGluZyA9IG5ldyBTdHJpbmdbaC5nZXROdW1Db2xzKCldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaC5nZXROdW1Db2xzKCk7IGkrKykgeworICAgICAgaGVhZGluZ1tpXSA9IGguZ2V0VGV4dChpKTsKKyAgICB9CisgICAgcmV0dXJuIGhlYWRpbmc7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvbWVudXMvTWVudUJhci5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9tZW51cy9NZW51QmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1MWVjMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvbWVudXMvTWVudUJhci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5tZW51czsKKworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OworCitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnU7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVCYXI7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOworaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKKworcHVibGljIGNsYXNzIE1lbnVCYXIgZXh0ZW5kcyBKTWVudUJhciB7CisKKyAgcHJpdmF0ZSBKTWVudSBmaWxlTWVudTsKKyAgcHJpdmF0ZSBKTWVudSBxdWVyeU1lbnU7CisgIHByaXZhdGUgSk1lbnUgaGVscE1lbnU7CisKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gcXVlcnlJdGVtOworICBwcml2YXRlIEpNZW51SXRlbSBhYm91dEl0ZW07CisgIHByaXZhdGUgSk1lbnVJdGVtIGNsZWFySXRlbTsKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gdW5oaWRlSXRlbTsKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gZXhwb3J0SXRlbTsKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gZXhpdEl0ZW07CisgIHByaXZhdGUgSk1lbnVJdGVtIHNvcnRJdGVtOworICBwcml2YXRlIEpNZW51SXRlbSBhZHZhbmNlZEl0ZW07CisgIHByaXZhdGUgSk1lbnVJdGVtIGNvbm5lY3RJdGVtOworCisgIHB1YmxpYyBNZW51QmFyKEFjdGlvbkxpc3RlbmVyIHdpbmRvd0xpc3RlbmVyLCBBY3Rpb25MaXN0ZW5lciB0YWJsZUxpc3RlbmVyKSB7CisgICAgZmlsZU1lbnUgPSBuZXcgSk1lbnUoIkZpbGUiKTsKKyAgICBmaWxlTWVudS5zZXRNbmVtb25pYyhLZXlFdmVudC5WS19GKTsKKyAgICBxdWVyeU1lbnUgPSBuZXcgSk1lbnUoIlF1ZXJ5Iik7CisgICAgcXVlcnlNZW51LnNldE1uZW1vbmljKEtleUV2ZW50LlZLX1EpOworICAgIGhlbHBNZW51ID0gbmV3IEpNZW51KCJIZWxwIik7CisKKyAgICAvLyBidWlsZCBoZWxwIG1lbnUKKyAgICBxdWVyeUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJRdWVyeSBMYW5ndWFnZSIpOworICAgIHF1ZXJ5SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih3aW5kb3dMaXN0ZW5lcik7CisgICAgYWJvdXRJdGVtID0gbmV3IEpNZW51SXRlbSgiQWJvdXQiKTsKKyAgICBhYm91dEl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIod2luZG93TGlzdGVuZXIpOworICAgIGhlbHBNZW51LmFkZChxdWVyeUl0ZW0pOworICAgIGhlbHBNZW51LmFkZFNlcGFyYXRvcigpOworICAgIGhlbHBNZW51LmFkZChhYm91dEl0ZW0pOworCisgICAgLy8gYnVpbGQgcXVlcnkgbWVudQorICAgIGNsZWFySXRlbSA9IG5ldyBKTWVudUl0ZW0oIkNsZWFyIFF1ZXJ5Iik7CisgICAgY2xlYXJJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKKyAgICBhZHZhbmNlZEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJRdWVyeSBCdWlsZGVyIik7CisgICAgYWR2YW5jZWRJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKKyAgICBzb3J0SXRlbSA9IG5ldyBKTWVudUl0ZW0oIlNvcnQiKTsKKyAgICBzb3J0SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih3aW5kb3dMaXN0ZW5lcik7CisgICAgdW5oaWRlSXRlbSA9IG5ldyBKTWVudUl0ZW0oIlVuaGlkZSBDb2x1bW5zIik7CisgICAgdW5oaWRlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0YWJsZUxpc3RlbmVyKTsKKyAgICBxdWVyeU1lbnUuYWRkKHVuaGlkZUl0ZW0pOworICAgIHF1ZXJ5TWVudS5hZGQoYWR2YW5jZWRJdGVtKTsKKyAgICBxdWVyeU1lbnUuYWRkKHNvcnRJdGVtKTsKKyAgICBxdWVyeU1lbnUuYWRkU2VwYXJhdG9yKCk7CisgICAgcXVlcnlNZW51LmFkZChjbGVhckl0ZW0pOworCisgICAgLy8gYnVpbGQgZmlsZSBtZW51CisgICAgY29ubmVjdEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJDb25uZWN0Li4uIik7CisgICAgY29ubmVjdEl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIod2luZG93TGlzdGVuZXIpOworICAgIGV4cG9ydEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJFeHBvcnQgVGFibGUiKTsKKyAgICBleHBvcnRJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRhYmxlTGlzdGVuZXIpOworICAgIGV4aXRJdGVtID0gbmV3IEpNZW51SXRlbSgiRXhpdCIpOworICAgIGV4aXRJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKKyAgICBmaWxlTWVudS5hZGQoY29ubmVjdEl0ZW0pOworICAgIGZpbGVNZW51LmFkZChleHBvcnRJdGVtKTsKKyAgICBmaWxlTWVudS5hZGRTZXBhcmF0b3IoKTsKKyAgICBmaWxlTWVudS5hZGQoZXhpdEl0ZW0pOworCisgICAgYWRkKGZpbGVNZW51KTsKKyAgICBhZGQocXVlcnlNZW51KTsKKyAgICBhZGQoaGVscE1lbnUpOworICB9CisKKyAgcHVibGljIHZvaWQgY2hhbmdlQ29ubmVjdFN0YXR1cygpIHsKKyAgICBpZiAoY29ubmVjdEl0ZW0uZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiQ29ubmVjdC4uLiIpKSB7CisgICAgICBjb25uZWN0SXRlbS5zZXRBY3Rpb25Db21tYW5kKCJEaXNjb25uZWN0Iik7CisgICAgICBjb25uZWN0SXRlbS5zZXRUZXh0KCJEaXNjb25uZWN0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbm5lY3RJdGVtLnNldEFjdGlvbkNvbW1hbmQoIkNvbm5lY3QuLi4iKTsKKyAgICAgIGNvbm5lY3RJdGVtLnNldFRleHQoIkNvbm5lY3QuLi4iKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvbWVudXMvUmlnaHRDbGlja01lbnUuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvbWVudXMvUmlnaHRDbGlja01lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTRjZmIzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9tZW51cy9SaWdodENsaWNrTWVudS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3Lm1lbnVzOworCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07CitpbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudTsKKworcHVibGljIGNsYXNzIFJpZ2h0Q2xpY2tNZW51IGV4dGVuZHMgSlBvcHVwTWVudSB7CisKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gaGlkZUl0ZW07CisgIHByaXZhdGUgSk1lbnVJdGVtIHVuaGlkZUl0ZW07CisKKyAgLy8gcHJpdmF0ZSBKTWVudUl0ZW0gcmVzaXplSXRlbTsKKworICBwdWJsaWMgUmlnaHRDbGlja01lbnUoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgIGhpZGVJdGVtID0gbmV3IEpNZW51SXRlbSgiSGlkZSIpOworICAgIGhpZGVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB1bmhpZGVJdGVtID0gbmV3IEpNZW51SXRlbSgiVW5oaWRlIik7CisgICAgdW5oaWRlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgLy8gcmVzaXplSXRlbSA9IG5ldyBKTWVudUl0ZW0oIlJlc2l6ZSIpOworICAgIC8vIHJlc2l6ZUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgdGhpcy5hZGQoaGlkZUl0ZW0pOworICAgIHRoaXMuYWRkKHVuaGlkZUl0ZW0pOworICAgIC8vIHRoaXMuYWRkU2VwYXJhdG9yKCk7CisgICAgLy8gdGhpcy5hZGQocmVzaXplSXRlbSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVbmhpZGVNb2RlKCkgeworICAgIGhpZGVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOworICAgIHVuaGlkZUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAvLyByZXNpemVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0SGlkZU1vZGUoKSB7CisgICAgaGlkZUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICB1bmhpZGVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOworICAgIC8vIHJlc2l6ZUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9Cb3R0b21QYW5lLmphdmEgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9Cb3R0b21QYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0ZmEwMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL0JvdHRvbVBhbmUuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHM7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuRm9udDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkxpbmVCb3JkZXI7CisKK3B1YmxpYyBjbGFzcyBCb3R0b21QYW5lIGV4dGVuZHMgSlBhbmVsIHsKKworICBwdWJsaWMgSkxhYmVsIHN0YXR1c01lc3NhZ2U7CisKKyAgcHVibGljIEJvdHRvbVBhbmUoKSB7CisKKyAgICAvLyBzZXQgYmFja2dyb3VuZCBhbmQgcGFuZWwgc2l6ZQorICAgIHNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgIEVtcHR5Qm9yZGVyIGxpbmUxID0gbmV3IEVtcHR5Qm9yZGVyKDQsIDEwLCA0LCAyKTsKKyAgICBMaW5lQm9yZGVyIGxpbmUyID0gbmV3IExpbmVCb3JkZXIoQ29sb3IuQkxBQ0ssIDEpOworICAgIEVtcHR5Qm9yZGVyIGxpbmUzID0gbmV3IEVtcHR5Qm9yZGVyKDQsIDEwLCA0LCAxMCk7CisgICAgQ29tcG91bmRCb3JkZXIgY2IxID0gbmV3IENvbXBvdW5kQm9yZGVyKGxpbmUxLCBsaW5lMik7CisgICAgQ29tcG91bmRCb3JkZXIgY2IyID0gbmV3IENvbXBvdW5kQm9yZGVyKGNiMSwgbGluZTMpOworICAgIHNldEJvcmRlcihjYjIpOworCisgICAgSkxhYmVsIHN0YXR1c0xhYmVsID0gbmV3IEpMYWJlbCgiIFN0YXR1czogIik7CisgICAgc3RhdHVzTGFiZWwuc2V0Rm9udChuZXcgRm9udCgic2FuLXNlcmlmIiwgRm9udC5QTEFJTiwgMTApKTsKKworICAgIHN0YXR1c01lc3NhZ2UgPSBuZXcgSkxhYmVsKCIgRGlzY29ubmVjdGVkIik7CisgICAgc3RhdHVzTWVzc2FnZS5zZXRGb250KG5ldyBGb250KCJzYW4tc2VyaWYiLCBGb250LlBMQUlOLCAxMCkpOworICAgIHN0YXR1c01lc3NhZ2Uuc2V0Rm9yZWdyb3VuZChDb2xvci5SRUQpOworICAgIHN0YXR1c01lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisKKyAgICAvLyBzZXQgbGF5b3V0CisgICAgc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LkxJTkVfQVhJUykpOworICAgIGFkZChzdGF0dXNMYWJlbCk7CisgICAgYWRkKHN0YXR1c01lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgY2hhbmdlU3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICBzdGF0dXNNZXNzYWdlLnNldFRleHQoc3RhdHVzKTsKKyAgICB0aGlzLnJlcGFpbnQoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9DZWxsLmphdmEgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9DZWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhMjllYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL0NlbGwuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHM7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5MaW5lQm9yZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5HdWlQYXJhbXM7CisKK3B1YmxpYyBjbGFzcyBDZWxsIGV4dGVuZHMgSlBhbmVsIHsKKworICBwcm90ZWN0ZWQgSkxhYmVsIHRleHQ7CisKKyAgcHVibGljIENlbGwoKSB7CisgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgc2V0Rm9yZWdyb3VuZChDb2xvci5CTEFDSyk7CisgICAgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKEd1aVBhcmFtcy5ERUZBVUxUX0NFTExfV0lEVEgsCisgICAgICAgIEd1aVBhcmFtcy5ERUZBVUxUX0NFTExfSEVJR0hUKTsKKyAgICBzZXRNaW5pbXVtU2l6ZShzaXplKTsKKyAgICBzZXRNYXhpbXVtU2l6ZShzaXplKTsKKyAgICBzZXRQcmVmZXJyZWRTaXplKHNpemUpOworICAgIHNldEJvcmRlcihuZXcgTGluZUJvcmRlcihDb2xvci5MSUdIVF9HUkFZLCAxKSk7CisKKyAgICB0ZXh0ID0gbmV3IEpMYWJlbCgiIik7CisgICAgRm9udCBmID0gbmV3IEZvbnQoInNhbi1zYXJpZiIsIEZvbnQuUExBSU4sIDEwKTsKKyAgICB0ZXh0LnNldEZvbnQoZik7CisgICAgdGhpcy5hZGQodGV4dCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7CisgICAgdGV4dC5zZXRUZXh0KG5ld1RleHQpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgIHJldHVybiB0ZXh0LmdldFRleHQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFdpZHRoKGludCBuZXdXaWR0aCkgeworICAgIERpbWVuc2lvbiBzaXplID0gdGhpcy5nZXRTaXplKCk7CisgICAgc2l6ZS53aWR0aCA9IG5ld1dpZHRoOworICAgIHRoaXMuc2V0U2l6ZShzaXplKTsKKyAgICB0ZXh0LnNldFNpemUoc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IG5ld0hlaWdodCkgeworICAgIERpbWVuc2lvbiBzaXplID0gdGhpcy5nZXRTaXplKCk7CisgICAgc2l6ZS5oZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgdGhpcy5zZXRTaXplKHNpemUpOworICAgIHRleHQuc2V0U2l6ZShzaXplKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvSGVhZGVyQ2VsbC5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvSGVhZGVyQ2VsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzU0NjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9IZWFkZXJDZWxsLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXcucGFuZWxzOworCitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKKworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5MaW5lQm9yZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5HdWlQYXJhbXM7CisKK3B1YmxpYyBjbGFzcyBIZWFkZXJDZWxsIGV4dGVuZHMgQ2VsbCB7CisKKyAgcHJpdmF0ZSBpbnQgY29sTnVtOworCisgIHB1YmxpYyBIZWFkZXJDZWxsKE1vdXNlTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjb2xOdW0pIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuc2V0QmFja2dyb3VuZChDb2xvci5MSUdIVF9HUkFZKTsKKyAgICB0aGlzLnNldEJvcmRlcihudWxsKTsKKyAgICBEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24oR3VpUGFyYW1zLkRFRkFVTFRfQ0VMTF9XSURUSCAtIDIsCisgICAgICAgIEd1aVBhcmFtcy5ERUZBVUxUX0NFTExfSEVJR0hUKTsKKyAgICBzZXRNaW5pbXVtU2l6ZShzaXplKTsKKyAgICBzZXRNYXhpbXVtU2l6ZShzaXplKTsKKyAgICBzZXRQcmVmZXJyZWRTaXplKHNpemUpOworICAgIEZvbnQgZiA9IG5ldyBGb250KCJzYW4tc2VyaWYiLCBGb250LkJPTEQsIDExKTsKKyAgICB0ZXh0LnNldEZvbnQoZik7CisKKyAgICB0aGlzLmNvbE51bSA9IGNvbE51bTsKKyAgICB0aGlzLmFkZE1vdXNlTGlzdGVuZXIobGlzdGVuZXIpOworICB9CisKKyAgcHVibGljIGludCBnZXRDb2xOdW0oKSB7CisgICAgcmV0dXJuIGNvbE51bTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9IZWFkZXJSb3cuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL0hlYWRlclJvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODBlZGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9IZWFkZXJSb3cuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHM7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUxpc3RlbmVyOworCitpbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKKworcHVibGljIGNsYXNzIEhlYWRlclJvdyBleHRlbmRzIEpQYW5lbCB7CisKKyAgcHJpdmF0ZSBIZWFkZXJDZWxsIGNlbGxzW107CisgIHByaXZhdGUgaW50IG51bUNlbGxzOworCisgIHB1YmxpYyBIZWFkZXJSb3coTW91c2VMaXN0ZW5lciBsaXN0ZW5lciwgaW50IG51bUNlbGxzKSB7CisgICAgLy8gY3JlYXRlIGNlbGxzCisgICAgdGhpcy5udW1DZWxscyA9IG51bUNlbGxzOworICAgIGNlbGxzID0gbmV3IEhlYWRlckNlbGxbbnVtQ2VsbHNdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2VsbHM7IGkrKykgeworICAgICAgY2VsbHNbaV0gPSBuZXcgSGVhZGVyQ2VsbChsaXN0ZW5lciwgaSk7CisgICAgfQorCisgICAgLy8gc2V0IGJhY2tncm91bmQsIGV0Yy4KKyAgICB0aGlzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LkxJTkVfQVhJUykpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DZWxsczsgaSsrKSB7CisgICAgICB0aGlzLmFkZChjZWxsc1tpXSk7CisgICAgICB0aGlzLmFkZChuZXcgSGVhZGVyU3BhY2VyKGxpc3RlbmVyLCBpKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXROdW1Db2xzKCkgeworICAgIHJldHVybiBudW1DZWxsczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGhpZGVDb2woaW50IGNvbE51bSkgeworICAgIGludCB0cnVlTnVtID0gY29sTnVtICogMjsKKyAgICBIZWFkZXJDZWxsIGMgPSAoSGVhZGVyQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQodHJ1ZU51bSk7CisgICAgYy5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBIZWFkZXJTcGFjZXIgc3AgPSAoSGVhZGVyU3BhY2VyKSB0aGlzLmdldENvbXBvbmVudCh0cnVlTnVtICsgMSk7CisgICAgc3Auc2V0VmlzaWJsZShmYWxzZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bmhpZGVDb2woaW50IGNvbE51bSkgeworICAgIGludCB0cnVlTnVtID0gY29sTnVtICogMjsKKyAgICBIZWFkZXJDZWxsIGMgPSAoSGVhZGVyQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQodHJ1ZU51bSk7CisgICAgYy5zZXRWaXNpYmxlKHRydWUpOworICAgIEhlYWRlclNwYWNlciBzcCA9IChIZWFkZXJTcGFjZXIpIHRoaXMuZ2V0Q29tcG9uZW50KHRydWVOdW0gKyAxKTsKKyAgICBzcC5zZXRWaXNpYmxlKHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VGV4dChpbnQgY29sTnVtLCBTdHJpbmcgdGV4dCkgeworICAgIGludCB0cnVlTnVtID0gY29sTnVtICogMjsKKyAgICBIZWFkZXJDZWxsIGMgPSAoSGVhZGVyQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQodHJ1ZU51bSk7CisgICAgYy5zZXRUZXh0KHRleHQpOworICAgIGMucmVwYWludCgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBjb2xOdW0pIHsKKyAgICBpbnQgdHJ1ZU51bSA9IGNvbE51bSAqIDI7CisgICAgSGVhZGVyQ2VsbCBjID0gKEhlYWRlckNlbGwpIHRoaXMuZ2V0Q29tcG9uZW50KHRydWVOdW0pOworICAgIHJldHVybiBjLmdldFRleHQoKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoaW50IGNvbE51bSkgeworICAgIGludCB0cnVlTnVtID0gY29sTnVtICogMjsKKyAgICBIZWFkZXJDZWxsIGMgPSAoSGVhZGVyQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQodHJ1ZU51bSk7CisgICAgcmV0dXJuIGMuZ2V0V2lkdGgoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNoYW5nZVdpZHRoKGludCBjb2xOdW0sIGludCBuZXdXaWR0aCkgeworICAgIGludCB0cnVlTnVtID0gY29sTnVtICogMjsKKyAgICBIZWFkZXJDZWxsIGMgPSAoSGVhZGVyQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQodHJ1ZU51bSk7CisgICAgaW50IGNoYW5nZSA9IGMuZ2V0V2lkdGgoKSAtIG5ld1dpZHRoOworICAgIGMuc2V0V2lkdGgobmV3V2lkdGgpOworICAgIGZvciAoaW50IGkgPSB0cnVlTnVtICsgMTsgaSA8IHRoaXMuZ2V0Q29tcG9uZW50Q291bnQoKTsgaSsrKSB7CisgICAgICB0aGlzLmdldENvbXBvbmVudChpKS5zZXRMb2NhdGlvbih0aGlzLmdldENvbXBvbmVudChpKS5nZXRYKCkgLSBjaGFuZ2UsCisgICAgICAgICAgdGhpcy5nZXRDb21wb25lbnQoaSkuZ2V0WSgpKTsKKyAgICB9CisgICAgdGhpcy5yZXBhaW50KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL0hlYWRlclNwYWNlci5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvSGVhZGVyU3BhY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmOGYxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL0hlYWRlclNwYWNlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVsczsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUxpc3RlbmVyOworCitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5HdWlQYXJhbXM7CisKK3B1YmxpYyBjbGFzcyBIZWFkZXJTcGFjZXIgZXh0ZW5kcyBKUGFuZWwgeworCisgIHByaXZhdGUgaW50IGNvbDsKKworICBwdWJsaWMgSGVhZGVyU3BhY2VyKE1vdXNlTGlzdGVuZXIgbGlzdGVuZXIsIGludCBwb3MpIHsKKyAgICAvLyBzZXQgYmFja2dyb3VuZCwgc2l6ZQorICAgIHRoaXMuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKDIsIEd1aVBhcmFtcy5ERUZBVUxUX0NFTExfSEVJR0hUKTsKKyAgICB0aGlzLnNldE1pbmltdW1TaXplKGQpOworICAgIHRoaXMuc2V0TWF4aW11bVNpemUoZCk7CisgICAgdGhpcy5zZXRQcmVmZXJyZWRTaXplKGQpOworCisgICAgY29sID0gcG9zOworICAgIHRoaXMuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgIH0KKworICBwdWJsaWMgaW50IGdldENvbE51bSgpIHsKKyAgICByZXR1cm4gY29sOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL01pZGRsZVBhbmUuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL01pZGRsZVBhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY0ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvTWlkZGxlUGFuZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVsczsKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLmNvbnRyb2xsZXIuVGFibGVMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIE1pZGRsZVBhbmUgZXh0ZW5kcyBKUGFuZWwgeworCisgIHB1YmxpYyBUYWJsZVBhbmUgdFBhbmU7CisKKyAgcHVibGljIE1pZGRsZVBhbmUoKSB7CisgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICB0aGlzLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCisgICAgdFBhbmUgPSBuZXcgVGFibGVQYW5lKCk7CisKKyAgICBKUGFuZWwgaW5zZXQgPSBuZXcgSlBhbmVsKCk7CisgICAgaW5zZXQuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgaW5zZXQuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgaW5zZXQuYWRkKHRQYW5lLCBCb3JkZXJMYXlvdXQuV0VTVCk7CisKKyAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKGluc2V0KTsKKworICAgIHRoaXMuYWRkKHNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOworICB9CisKKyAgcHVibGljIFRhYmxlTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgcmV0dXJuIHRQYW5lLmdldExpc3RlbmVyKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvUXVlcnlGaWVsZC5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvUXVlcnlGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWI0YWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9RdWVyeUZpZWxkLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVsczsKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Gb2N1c0V2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkZvY3VzTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworCitwdWJsaWMgY2xhc3MgUXVlcnlGaWVsZCBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKworICBwcml2YXRlIEpUZXh0RmllbGQgdGV4dDsKKyAgcHJpdmF0ZSBKQnV0dG9uIGJ1dHRvbjsKKyAgcHJpdmF0ZSBKQ29tYm9Cb3ggdHlwZXM7CisKKyAgcHVibGljIFF1ZXJ5RmllbGQoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgIC8vIHNldGJhY2tncm91bmQgYW4gc2l6ZSBmb3IgcGFuZWwKKyAgICBzZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLCBCb3hMYXlvdXQuTElORV9BWElTKSk7CisgICAgc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbig1MDAsIDUwKSk7CisgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDUwMCwgNTApKTsKKworICAgIHRleHQgPSBuZXcgSlRleHRGaWVsZCgzMCk7CisgICAgYnV0dG9uID0gbmV3IEpCdXR0b24oIlNlYXJjaCIpOworICAgIFN0cmluZ1tdIGJsYW5rVHlwZSA9IHsgIiIgfTsKKyAgICB0eXBlcyA9IG5ldyBKQ29tYm9Cb3goYmxhbmtUeXBlKTsKKworICAgIC8vIHNldCBiYWNrZ3JvdW5kIGFuZCBzaXplIGZvciB0ZXh0Ym94IGFuZCBjb21ibworICAgIHRleHQuc2V0Rm9yZWdyb3VuZChDb2xvci5CTEFDSyk7CisgICAgdGV4dC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICB0ZXh0LnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oMTAwLCAyNSkpOworICAgIHRleHQuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDEwMCwgMjUpKTsKKyAgICB0ZXh0LnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oMTAwLCAyNSkpOworICAgIHRleHQuYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisgICAgRGltZW5zaW9uIHR5cGVEaW0gPSBuZXcgRGltZW5zaW9uKDEwMCwgMjUpOworICAgIHR5cGVzLnNldE1heGltdW1TaXplKHR5cGVEaW0pOworICAgIHR5cGVzLnNldE1pbmltdW1TaXplKHR5cGVEaW0pOworICAgIHR5cGVzLnNldFByZWZlcnJlZFNpemUodHlwZURpbSk7CisgICAgdHlwZXMuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisKKyAgICAvLyBzZXQgYnV0dG9uCisgICAgYnV0dG9uLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgIGJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgYnV0dG9uLnNldE5hbWUoIlF1ZXJ5Iik7CisKKyAgICBhZGQobmV3IEpMYWJlbCgiUHJvZHVjdFR5cGU6ICAiKSk7CisgICAgYWRkKHR5cGVzKTsKKyAgICBhZGQobmV3IEpMYWJlbCgiICAgIFF1ZXJ5OiAgIikpOworICAgIGFkZCh0ZXh0KTsKKyAgICBhZGQoYnV0dG9uKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgcmV0dXJuIHRleHQuZ2V0VGV4dCgpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXJRdWVyeSgpIHsKKyAgICB0ZXh0LnNldFRleHQoIiIpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZXMuZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVwZGF0ZVR5cGVzKFN0cmluZ1tdIHR5cGVOYW1lcykgeworICAgIHRoaXMucmVtb3ZlKHR5cGVzKTsKKyAgICB0eXBlcyA9IG5ldyBKQ29tYm9Cb3godHlwZU5hbWVzKTsKKyAgICB0eXBlcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICBEaW1lbnNpb24gdHlwZURpbSA9IG5ldyBEaW1lbnNpb24oMTAwLCAyNSk7CisgICAgdHlwZXMuc2V0TWF4aW11bVNpemUodHlwZURpbSk7CisgICAgdHlwZXMuc2V0TWluaW11bVNpemUodHlwZURpbSk7CisgICAgdHlwZXMuc2V0UHJlZmVycmVkU2l6ZSh0eXBlRGltKTsKKyAgICBhZGQodHlwZXMsIDEpOworICAgIHRoaXMucmVwYWludCgpOworICB9CisKKyAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFyZzApIHsKKyAgICBidXR0b24uZG9DbGljaygpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9RdWVyeVBhbmUuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL1F1ZXJ5UGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTFhYzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvYnJvd3Nlci92aWV3L3BhbmVscy9RdWVyeVBhbmUuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wYW5lbHM7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworCitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5MaW5lQm9yZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5HdWlQYXJhbXM7CisKK3B1YmxpYyBjbGFzcyBRdWVyeVBhbmUgZXh0ZW5kcyBKUGFuZWwgeworCisgIHByaXZhdGUgUXVlcnlGaWVsZCBmaWVsZDsKKworICBwdWJsaWMgUXVlcnlQYW5lKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgc3VwZXIobmV3IEJvcmRlckxheW91dCgpKTsKKworICAgIC8vIHNldCBiYWNrZ3JvdW5kIGFuZCBwYW5lbCBzaXplCisgICAgc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgRGltZW5zaW9uIHBhbmVTaXplID0gbmV3IERpbWVuc2lvbigpOworICAgIHBhbmVTaXplLndpZHRoID0gR3VpUGFyYW1zLldJTkRPV19XSURUSDsKKyAgICBwYW5lU2l6ZS5oZWlnaHQgPSAoaW50KSAoR3VpUGFyYW1zLldJTkRPV19IRUlHSFQgKiAoMC4xKSk7CisKKyAgICAvLyBzZXQgYm9yZGVyCisgICAgRW1wdHlCb3JkZXIgbGluZTEgPSBuZXcgRW1wdHlCb3JkZXIoMiwgMTAsIDIsIDIpOworICAgIExpbmVCb3JkZXIgbGluZTIgPSBuZXcgTGluZUJvcmRlcihDb2xvci5CTEFDSywgMSk7CisgICAgQ29tcG91bmRCb3JkZXIgY3AgPSBuZXcgQ29tcG91bmRCb3JkZXIobGluZTEsIGxpbmUyKTsKKyAgICB0aGlzLnNldEJvcmRlcihjcCk7CisKKyAgICAvLyBhZGQgcXVlcnkgZmllbGQgdG8gcGFuZQorICAgIGZpZWxkID0gbmV3IFF1ZXJ5RmllbGQobGlzdGVuZXIpOworICAgIGFkZChmaWVsZCwgQm9yZGVyTGF5b3V0LkVBU1QpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKKyAgICByZXR1cm4gZmllbGQuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyUXVlcnkoKSB7CisgICAgZmllbGQuY2xlYXJRdWVyeSgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgIHJldHVybiBmaWVsZC5nZXRQcm9kdWN0VHlwZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdXBkYXRlVHlwZXMoU3RyaW5nW10gdHlwZXMpIHsKKyAgICBmaWVsZC51cGRhdGVUeXBlcyh0eXBlcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL1Jvdy5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvUm93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNzE4MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL1Jvdy5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVsczsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCitpbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKKworcHVibGljIGNsYXNzIFJvdyBleHRlbmRzIEpQYW5lbCB7CisKKyAgcHJpdmF0ZSBDZWxsIGNlbGxzW107CisKKyAgcHVibGljIFJvdyhpbnQgbnVtQ2VsbHMpIHsKKyAgICAvLyBjcmVhdGUgY2VsbHMKKyAgICBjZWxscyA9IG5ldyBDZWxsW251bUNlbGxzXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNlbGxzOyBpKyspIHsKKyAgICAgIGNlbGxzW2ldID0gbmV3IENlbGwoKTsKKyAgICAgIGNlbGxzW2ldLnNldFRleHQoIiIpOworICAgIH0KKworICAgIC8vIHNldCBiYWNrZ3JvdW5kLCBldGMuCisgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICB0aGlzLnNldExheW91dChuZXcgQm94TGF5b3V0KHRoaXMsIEJveExheW91dC5MSU5FX0FYSVMpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2VsbHM7IGkrKykgeworICAgICAgdGhpcy5hZGQoY2VsbHNbaV0pOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGhpZGVDb2woaW50IGNvbE51bSkgeworICAgIENlbGwgYyA9IChDZWxsKSB0aGlzLmdldENvbXBvbmVudChjb2xOdW0pOworICAgIGMuc2V0VmlzaWJsZShmYWxzZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bmhpZGVDb2woaW50IGNvbE51bSkgeworICAgIENlbGwgYyA9IChDZWxsKSB0aGlzLmdldENvbXBvbmVudChjb2xOdW0pOworICAgIGMuc2V0VmlzaWJsZSh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRleHQoaW50IGNvbE51bSwgU3RyaW5nIHRleHQpIHsKKyAgICBDZWxsIGMgPSAoQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQoY29sTnVtKTsKKyAgICBjLnNldFRleHQodGV4dCk7CisgICAgYy5yZXBhaW50KCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFRleHQoaW50IGNvbE51bSkgeworICAgIENlbGwgYyA9IChDZWxsKSB0aGlzLmdldENvbXBvbmVudChjb2xOdW0pOworICAgIHJldHVybiBjLmdldFRleHQoKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoaW50IGNvbE51bSkgeworICAgIENlbGwgYyA9IChDZWxsKSB0aGlzLmdldENvbXBvbmVudChjb2xOdW0pOworICAgIHJldHVybiBjLmdldFdpZHRoKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjaGFuZ2VXaWR0aChpbnQgY29sTnVtLCBpbnQgbmV3V2lkdGgpIHsKKyAgICBDZWxsIGMgPSAoQ2VsbCkgdGhpcy5nZXRDb21wb25lbnQoY29sTnVtKTsKKyAgICBpbnQgY2hhbmdlID0gYy5nZXRXaWR0aCgpIC0gbmV3V2lkdGg7CisgICAgYy5zZXRXaWR0aChuZXdXaWR0aCk7CisgICAgZm9yIChpbnQgaSA9IGNvbE51bSArIDE7IGkgPCB0aGlzLmdldENvbXBvbmVudENvdW50KCk7IGkrKykgeworICAgICAgdGhpcy5nZXRDb21wb25lbnQoaSkuc2V0TG9jYXRpb24odGhpcy5nZXRDb21wb25lbnQoaSkuZ2V0WCgpIC0gY2hhbmdlLAorICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KGkpLmdldFkoKSk7CisgICAgfQorICAgIHRoaXMucmVwYWludCgpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL1RhYmxlUGFuZS5qYXZhIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wYW5lbHMvVGFibGVQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjOGY1YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcGFuZWxzL1RhYmxlUGFuZS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnBhbmVsczsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKK2ltcG9ydCBqYXZheC5zd2luZy5KRmlsZUNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuTGluZUJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbC5IU1NGU2hlZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRldvcmtib29rOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIuY29udHJvbGxlci5UYWJsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLnZpZXcubWVudXMuUmlnaHRDbGlja01lbnU7CisKK3B1YmxpYyBjbGFzcyBUYWJsZVBhbmUgZXh0ZW5kcyBKUGFuZWx7IAorCQorCXB1YmxpYyBWZWN0b3I8SW50ZWdlcj4gaGlkZGVuQ29sczsKKwlwdWJsaWMgSGVhZGVyUm93IGhlYWRlcjsKKwkKKwlwcml2YXRlIFRhYmxlTGlzdGVuZXIgbGlzdGVuZXI7CisJCisJcHVibGljIFRhYmxlUGFuZSgpeworCQlsaXN0ZW5lciA9IG5ldyBUYWJsZUxpc3RlbmVyKHRoaXMpOworCQkKKwkJaGlkZGVuQ29scyA9IG5ldyBWZWN0b3I8SW50ZWdlcj4oKTsKKwkJc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisJCUxpbmVCb3JkZXIgbGluZTEgPSBuZXcgTGluZUJvcmRlcihDb2xvci5XSElURSwxMCk7CisJCXNldEJvcmRlcihsaW5lMSk7CisJCQorCQlzZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLEJveExheW91dC5QQUdFX0FYSVMpKTsKKwkJCisJCXRoaXMuc2V0QmxhbmsoKTsKKwl9CisJCisJcHVibGljIFRhYmxlTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKXsKKwkJcmV0dXJuIGxpc3RlbmVyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRCbGFuaygpeworCQl0aGlzLnJlbW92ZUFsbCgpOworCQlpbnQgbnVtQ29sdW1ucyA9IDEwOworCQlpbnQgbnVtUm93cyA9IDIwOworCQloZWFkZXIgPSBuZXcgSGVhZGVyUm93KGxpc3RlbmVyLG51bUNvbHVtbnMpOworCQlhZGQoaGVhZGVyKTsKKwkJCisJCWZvcihpbnQgaT0wO2k8bnVtUm93cztpKyspeworCQkJUm93IHIgPSBuZXcgUm93KG51bUNvbHVtbnMpOworCQkJYWRkKHIpOworCQl9CisJCQorCQl0aGlzLnZhbGlkYXRlKCk7CisJCXRoaXMucmVwYWludCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBuZXdUYWJsZShTdHJpbmdbXVtdIGRhdGEpeworCQl0aGlzLnJlbW92ZUFsbCgpOworCQlpZihkYXRhLmxlbmd0aD4xKXsKKwkJCWhlYWRlciA9IG5ldyBIZWFkZXJSb3cobGlzdGVuZXIsZGF0YVswXS5sZW5ndGgpOworCQkJZm9yKGludCBqPTA7ajxkYXRhWzBdLmxlbmd0aDtqKyspeworCQkJCWhlYWRlci5zZXRUZXh0KGosIGRhdGFbMF1bal0pOworCQkJfQorCQkJdGhpcy5hZGQoaGVhZGVyKTsKKwkJCQorCQkJZm9yKGludCBqPTE7ajxkYXRhLmxlbmd0aDtqKyspeworCQkJCVJvdyByID0gbmV3IFJvdyhkYXRhWzBdLmxlbmd0aCk7CisJCQkJZm9yKGludCBrPTA7azxkYXRhWzBdLmxlbmd0aDtrKyspeworCQkJCQlyLnNldFRleHQoaywgZGF0YVtqXVtrXSk7CisJCQkJfQorCQkJCXRoaXMuYWRkKHIpOworCQkJfQorCQl9CisJCXRoaXMudmFsaWRhdGUoKTsKKwkJdGhpcy5yZXBhaW50KCk7CisJfQorCQorCXB1YmxpYyBIZWFkZXJSb3cgZ2V0SGVhZGVyKCl7CisJCXJldHVybiBoZWFkZXI7CisJfQorCisJcHVibGljIHZvaWQgc29ydFJvd3MoaW50IGNvbCwgU3RyaW5nIHNvcnRUeXBlKXsKKwkJaW50IGxlbmd0aCA9IHRoaXMuZ2V0Q29tcG9uZW50Q291bnQoKTsKKwkJaW50IGksajsKKworCSAgICBmb3IgKGk9bGVuZ3RoOyAtLWkgPj0xOykgeworCSAgICAgICBmb3IgKGo9MTsgajxpO2orKykgeworCSAgICAJICAgUm93IGpUaFJvdyA9IChSb3cpdGhpcy5nZXRDb21wb25lbnQoaik7CisJICAgIAkgICBSb3cgaVRoUm93ID0gKFJvdyl0aGlzLmdldENvbXBvbmVudChpKTsKKwkgICAgCSAgIGlmKHNvcnRUeXBlLmVxdWFscygiQWNjZW5kaW5nIikpeworCSAgICAJCSAgIGlmKGpUaFJvdy5nZXRUZXh0KGNvbCkuY29tcGFyZVRvKGlUaFJvdy5nZXRUZXh0KGNvbCkpPjApeworCSAgICAJCQkgICBzd2FwUm93cyhqLGorMSk7CisJICAgIAkJICAgfQorCSAgICAJICAgfSBlbHNlIHsKKwkgICAgCQkgICBpZihqVGhSb3cuZ2V0VGV4dChjb2wpLmNvbXBhcmVUbyhpVGhSb3cuZ2V0VGV4dChjb2wpKTwwKXsKKwkgICAgCQkJICAgc3dhcFJvd3MoaixqKzEpOworCSAgICAJCSAgIH0KKwkgICAgCSAgIH0KKwkgICAgICAgfQorCSAgICB9CisJICAgIHRoaXMudmFsaWRhdGUoKTsKKwkgICAgdGhpcy5yZXBhaW50KCk7CisJICAgIAorCX0KKwkKKwlwdWJsaWMgdm9pZCBzd2FwUm93cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKXsKKwkJQ29tcG9uZW50IGMxID0gdGhpcy5nZXRDb21wb25lbnQoaW5kZXgxKTsKKwkJQ29tcG9uZW50IGMyID0gdGhpcy5nZXRDb21wb25lbnQoaW5kZXgyKTsKKwkJdGhpcy5hZGQoYzEsIGluZGV4Mik7CisJCXRoaXMuYWRkKGMyLCBpbmRleDEpOworCX0KKwkKKwlwdWJsaWMgUm93IGdldFJvdyhpbnQgbnVtKXsKKwkJUm93IHIgPSBudWxsOworCQlpZihudW08dGhpcy5nZXRDb21wb25lbnRDb3VudCgpLTEpeworCQkJciA9IChSb3cpdGhpcy5nZXRDb21wb25lbnQobnVtKzEpOworCQl9CisJCXJldHVybiByOworCX0KKwkKKwlwdWJsaWMgdm9pZCBoaWRlQ29sdW1uKGludCBjb2xOdW0peworCQloZWFkZXIuaGlkZUNvbChjb2xOdW0pOworCQlmb3IoaW50IGk9MTtpPHRoaXMuZ2V0Q29tcG9uZW50Q291bnQoKTtpKyspeworCQkJKChSb3cpdGhpcy5nZXRDb21wb25lbnQoaSkpLmhpZGVDb2woY29sTnVtKTsKKwkJfQorCQloaWRkZW5Db2xzLmFkZChuZXcgSW50ZWdlcihjb2xOdW0pKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5oaWRlQ29sdW1uKGludCBjb2xOdW0peworCQloZWFkZXIudW5oaWRlQ29sKGNvbE51bSk7CisJCWZvcihpbnQgaT0xO2k8dGhpcy5nZXRDb21wb25lbnRDb3VudCgpO2krKyl7CisJCQkoKFJvdyl0aGlzLmdldENvbXBvbmVudChpKSkudW5oaWRlQ29sKGNvbE51bSk7CisJCX0KKwkJaGlkZGVuQ29scy5yZW1vdmUobmV3IEludGVnZXIoY29sTnVtKSk7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wcm9tcHRzL0Nvbm5lY3RQcm9tcHQuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcHJvbXB0cy9Db25uZWN0UHJvbXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwOGQ0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcHJvbXB0cy9Db25uZWN0UHJvbXB0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnByb21wdHM7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkxpbmVCb3JkZXI7CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0UHJvbXB0IGV4dGVuZHMgSkZyYW1lIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgeworCisgIHByaXZhdGUgQ0FTRmllbGQgdG9wUGFuZWw7CisgIHByaXZhdGUgQ29ubmVjdEJ1dHRvbiBib3R0b21QYW5lbDsKKworICBwdWJsaWMgQ29ubmVjdFByb21wdChBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIHRoaXMuc2V0TmFtZSgiTmV3IENvbm5lY3Rpb24iKTsKKyAgICB0aGlzLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihESVNQT1NFX09OX0NMT1NFKTsKKyAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oNDAwLCAxMDApOworICAgIHRoaXMuc2V0TWluaW11bVNpemUoZCk7CisgICAgdGhpcy5zZXRNYXhpbXVtU2l6ZShkKTsKKyAgICB0aGlzLnNldFByZWZlcnJlZFNpemUoZCk7CisKKyAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KAorICAgICAgICBuZXcgQm94TGF5b3V0KHRoaXMuZ2V0Q29udGVudFBhbmUoKSwgQm94TGF5b3V0LllfQVhJUykpOworICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKworICAgIHRvcFBhbmVsID0gbmV3IENBU0ZpZWxkKHRoaXMpOworICAgIGJvdHRvbVBhbmVsID0gbmV3IENvbm5lY3RCdXR0b24obGlzdGVuZXIpOworICAgIHRoaXMuYWRkKHRvcFBhbmVsKTsKKyAgICB0aGlzLmFkZChib3R0b21QYW5lbCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldENBU1VybCgpIHsKKyAgICByZXR1cm4gdG9wUGFuZWwuY2FzUmVmLmdldFRleHQoKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgQ0FTRmllbGQgZXh0ZW5kcyBKUGFuZWwgeworCisgICAgcHJvdGVjdGVkIEpUZXh0RmllbGQgY2FzUmVmOworCisgICAgcHJvdGVjdGVkIENBU0ZpZWxkKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICB0aGlzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLCBCb3hMYXlvdXQuWF9BWElTKSk7CisgICAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oNDAwLCAzMCk7CisgICAgICB0aGlzLnNldE1heGltdW1TaXplKGQpOworICAgICAgdGhpcy5zZXRNaW5pbXVtU2l6ZShkKTsKKyAgICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShkKTsKKworICAgICAgRW1wdHlCb3JkZXIgbGluZTEgPSBuZXcgRW1wdHlCb3JkZXIoNSwgMTAsIDUsIDUpOworICAgICAgdGhpcy5zZXRCb3JkZXIobGluZTEpOworCisgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJDQVMgRmlsZSBNYW5hZ2VyIFVSTDogICIpKTsKKyAgICAgIGNhc1JlZiA9IG5ldyBKVGV4dEZpZWxkKCk7CisgICAgICBjYXNSZWYuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgdGhpcy5hZGQoY2FzUmVmKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNsYXNzIENvbm5lY3RCdXR0b24gZXh0ZW5kcyBKUGFuZWwgeworCisgICAgcHJvdGVjdGVkIEpCdXR0b24gY29ubmVjdDsKKyAgICBwcm90ZWN0ZWQgSkJ1dHRvbiBjYW5jZWw7CisKKyAgICBwcm90ZWN0ZWQgQ29ubmVjdEJ1dHRvbihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LlhfQVhJUykpOworCisgICAgICBFbXB0eUJvcmRlciBsaW5lMSA9IG5ldyBFbXB0eUJvcmRlcig1LCAyMCwgNSwgNSk7CisgICAgICB0aGlzLnNldEJvcmRlcihsaW5lMSk7CisKKyAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIikpOworICAgICAgY29ubmVjdCA9IG5ldyBKQnV0dG9uKCJDb25uZWN0Iik7CisgICAgICBjb25uZWN0LnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgY29ubmVjdC5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICBjYW5jZWwgPSBuZXcgSkJ1dHRvbigiQ2FuY2VsIik7CisgICAgICBjYW5jZWwuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgICBjYW5jZWwuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgY2FuY2VsLnNldE5hbWUoIkNvbm5lY3RDYW5jZWwiKTsKKyAgICAgIHRoaXMuYWRkKGNhbmNlbCk7CisgICAgICB0aGlzLmFkZChjb25uZWN0KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgYXJnMCkgeworICAgIGJvdHRvbVBhbmVsLmNvbm5lY3QuZG9DbGljaygpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcHJvbXB0cy9RdWVyeUJ1aWxkZXJQcm9tcHQuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcHJvbXB0cy9RdWVyeUJ1aWxkZXJQcm9tcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjA0ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wcm9tcHRzL1F1ZXJ5QnVpbGRlclByb21wdC5qYXZhCkBAIC0wLDAgKzEsNDUzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5wcm9tcHRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Gb2N1c0V2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkZvY3VzTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRBcmVhOworaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkNvbXBvdW5kQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuTGluZUJvcmRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5icm93c2VyLmNvbnRyb2xsZXIuV2luZG93TGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIubW9kZWwuQ2FzREI7CisKK3B1YmxpYyBjbGFzcyBRdWVyeUJ1aWxkZXJQcm9tcHQgZXh0ZW5kcyBKRnJhbWUgeworCisgIHByb3RlY3RlZCBDYXNEQiBkYXRhYmFzZTsKKyAgcHJvdGVjdGVkIFdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyOworCisgIHByb3RlY3RlZCBUeXBlUGFuZWwgdFBhbmVsOworICBwcm90ZWN0ZWQgUXVlcnlTZWxlY3Rpb25QYW5lbCBxUGFuZWw7CisgIHByb3RlY3RlZCBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lOworICBwcm90ZWN0ZWQgQnVpbHRRdWVyeVBhbmUgYnVpbHRQYW5lbDsKKyAgcHJvdGVjdGVkIFNlYXJjaFBhbmVsIHNQYW5lbDsKKworICBwdWJsaWMgUXVlcnlCdWlsZGVyUHJvbXB0KENhc0RCIGRiLCBXaW5kb3dMaXN0ZW5lciBsKSB7CisKKyAgICBkYXRhYmFzZSA9IGRiOworICAgIGxpc3RlbmVyID0gbDsKKworICAgIHRoaXMuc2V0TmFtZSgiUXVlcnkgQnVpbGRlciIpOworICAgIHRoaXMuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKERJU1BPU0VfT05fQ0xPU0UpOworICAgIERpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbig1MDAsIDQwMCk7CisgICAgdGhpcy5zZXRNaW5pbXVtU2l6ZShkKTsKKyAgICB0aGlzLnNldE1heGltdW1TaXplKGQpOworICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShkKTsKKworICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQoCisgICAgICAgIG5ldyBCb3hMYXlvdXQodGhpcy5nZXRDb250ZW50UGFuZSgpLCBCb3hMYXlvdXQuWV9BWElTKSk7CisgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworCisgICAgdFBhbmVsID0gbmV3IFR5cGVQYW5lbCh0aGlzKTsKKyAgICBxUGFuZWwgPSBuZXcgUXVlcnlTZWxlY3Rpb25QYW5lbCh0aGlzKTsKKyAgICBzUGFuZWwgPSBuZXcgU2VhcmNoUGFuZWwodGhpcyk7CisgICAgYnVpbHRQYW5lbCA9IG5ldyBCdWlsdFF1ZXJ5UGFuZSh0aGlzKTsKKworICAgIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUocVBhbmVsKTsKKyAgICBEaW1lbnNpb24gc2Nyb2xsRGltID0gbmV3IERpbWVuc2lvbig1MDAsIDIyMCk7CisgICAgc2Nyb2xsUGFuZS5zZXRNYXhpbXVtU2l6ZShzY3JvbGxEaW0pOworICAgIHNjcm9sbFBhbmUuc2V0TWluaW11bVNpemUoc2Nyb2xsRGltKTsKKyAgICBzY3JvbGxQYW5lLnNldFByZWZlcnJlZFNpemUoc2Nyb2xsRGltKTsKKworICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodFBhbmVsKTsKKyAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHNjcm9sbFBhbmUpOworICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQoYnVpbHRQYW5lbCk7CisgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChzUGFuZWwpOworICB9CisKKyAgcHVibGljIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGdldFF1ZXJ5KCkgeworICAgIHJldHVybiBxUGFuZWwuZ2V0Q2FzUXVlcnkoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgcmV0dXJuIHFQYW5lbC5nZXRRdWVyeSgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0VHlwZSgpIHsKKyAgICByZXR1cm4gdFBhbmVsLmdldFR5cGUoKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgUXVlcnlQYW5lbCBleHRlbmRzIEpQYW5lbCB7CisKKyAgICBwcml2YXRlIEpDb21ib0JveCBlbGVtZW50czsKKyAgICBwcml2YXRlIEpDb21ib0JveCBvcHM7CisgICAgcHJpdmF0ZSBKUGFuZWwgcGxhY2Vob2xkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIHNob3dPcDsKKworICAgIHB1YmxpYyBRdWVyeVBhbmVsKFF1ZXJ5QnVpbGRlclByb21wdCBwcm9tcHQpIHsKKyAgICAgIERpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbig0NjAsIDM1KTsKKyAgICAgIHRoaXMuc2V0TWF4aW11bVNpemUoZCk7CisgICAgICB0aGlzLnNldE1pbmltdW1TaXplKGQpOworICAgICAgdGhpcy5zZXRQcmVmZXJyZWRTaXplKGQpOworICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LlhfQVhJUykpOworCisgICAgICBzaG93T3AgPSBmYWxzZTsKKyAgICAgIG9wcyA9IG5ldyBKQ29tYm9Cb3gobmV3IFN0cmluZ1tdIHsgIkFORCIsICJPUiIsICJOT1QiIH0pOworICAgICAgRGltZW5zaW9uIG9wc0RpbSA9IG5ldyBEaW1lbnNpb24oNzUsIDI1KTsKKyAgICAgIG9wcy5zZXRNYXhpbXVtU2l6ZShvcHNEaW0pOworICAgICAgb3BzLnNldE1pbmltdW1TaXplKG9wc0RpbSk7CisgICAgICBvcHMuc2V0UHJlZmVycmVkU2l6ZShvcHNEaW0pOworICAgICAgb3BzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgb3BzLnNldFZpc2libGUoZmFsc2UpOworCisgICAgICBwbGFjZWhvbGRlciA9IG5ldyBKUGFuZWwoKTsKKyAgICAgIHBsYWNlaG9sZGVyLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgcGxhY2Vob2xkZXIuc2V0TWF4aW11bVNpemUob3BzRGltKTsKKyAgICAgIHBsYWNlaG9sZGVyLnNldE1pbmltdW1TaXplKG9wc0RpbSk7CisgICAgICBwbGFjZWhvbGRlci5zZXRQcmVmZXJyZWRTaXplKG9wc0RpbSk7CisKKyAgICAgIGVsZW1lbnRzID0gbmV3IEpDb21ib0JveChwcm9tcHQuZGF0YWJhc2UKKyAgICAgICAgICAuZ2V0QXZhaWxhYmxlRWxlbWVudHMocHJvbXB0LnRQYW5lbC5nZXRUeXBlKCkpKTsKKyAgICAgIGVsZW1lbnRzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgRGltZW5zaW9uIGRFbGVtID0gbmV3IERpbWVuc2lvbigxNTAsIDI1KTsKKyAgICAgIGVsZW1lbnRzLnNldE1heGltdW1TaXplKGRFbGVtKTsKKyAgICAgIGVsZW1lbnRzLnNldE1pbmltdW1TaXplKGRFbGVtKTsKKyAgICAgIGVsZW1lbnRzLnNldFByZWZlcnJlZFNpemUoZEVsZW0pOworCisgICAgICB0aGlzLmFkZChvcHMpOworICAgICAgdGhpcy5hZGQocGxhY2Vob2xkZXIpOworICAgICAgdGhpcy5hZGQoZWxlbWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE9wKCkgeworICAgICAgc2hvd09wID0gdHJ1ZTsKKyAgICAgIG9wcy5zZXRWaXNpYmxlKHRydWUpOworICAgICAgcGxhY2Vob2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50KCkgeworICAgICAgcmV0dXJuIGVsZW1lbnRzLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPcCgpIHsKKyAgICAgIFN0cmluZyBvcCA9ICIiOworICAgICAgaWYgKHNob3dPcCkgeworICAgICAgICBvcCA9IG9wcy5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworICAgICAgfQorICAgICAgcmV0dXJuIG9wOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY2xhc3MgVGVybVF1ZXJ5UGFuZWwgZXh0ZW5kcyBRdWVyeVBhbmVsIHsKKworICAgIHByaXZhdGUgSlRleHRGaWVsZCB0ZXh0OworCisgICAgcHVibGljIFRlcm1RdWVyeVBhbmVsKFF1ZXJ5QnVpbGRlclByb21wdCBwcm9tcHQpIHsKKyAgICAgIHN1cGVyKHByb21wdCk7CisKKyAgICAgIHRleHQgPSBuZXcgSlRleHRGaWVsZCgpOworICAgICAgRGltZW5zaW9uIGRUZXh0ID0gbmV3IERpbWVuc2lvbigxNTAsIDI1KTsKKyAgICAgIHRleHQuc2V0UHJlZmVycmVkU2l6ZShkVGV4dCk7CisgICAgICB0ZXh0LnNldE1heGltdW1TaXplKGRUZXh0KTsKKyAgICAgIHRleHQuc2V0TWluaW11bVNpemUoZFRleHQpOworICAgICAgdGV4dC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIHRleHQuYWRkRm9jdXNMaXN0ZW5lcihwcm9tcHQuYnVpbHRQYW5lbCk7CisgICAgICB0ZXh0LmFkZEFjdGlvbkxpc3RlbmVyKHByb21wdC5idWlsdFBhbmVsKTsKKworICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiICBNYXRjaGVzICAiKSk7CisgICAgICB0aGlzLmFkZCh0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICByZXR1cm4gdGV4dC5nZXRUZXh0KCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIGNsYXNzIFJhbmdlUXVlcnlQYW5lbCBleHRlbmRzIFF1ZXJ5UGFuZWwgeworCisgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHN0YXJ0OworICAgIHByaXZhdGUgSlRleHRGaWVsZCBzdG9wOworCisgICAgcHVibGljIFJhbmdlUXVlcnlQYW5lbChRdWVyeUJ1aWxkZXJQcm9tcHQgcHJvbXB0KSB7CisgICAgICBzdXBlcihwcm9tcHQpOworCisgICAgICBzdGFydCA9IG5ldyBKVGV4dEZpZWxkKCk7CisgICAgICBzdG9wID0gbmV3IEpUZXh0RmllbGQoKTsKKworICAgICAgRGltZW5zaW9uIGRUZXh0ID0gbmV3IERpbWVuc2lvbig2MCwgMjUpOworICAgICAgc3RhcnQuc2V0TWF4aW11bVNpemUoZFRleHQpOworICAgICAgc3RhcnQuc2V0TWluaW11bVNpemUoZFRleHQpOworICAgICAgc3RhcnQuc2V0UHJlZmVycmVkU2l6ZShkVGV4dCk7CisgICAgICBzdGFydC5hZGRGb2N1c0xpc3RlbmVyKHByb21wdC5idWlsdFBhbmVsKTsKKyAgICAgIHN0YXJ0LmFkZEFjdGlvbkxpc3RlbmVyKHByb21wdC5idWlsdFBhbmVsKTsKKworICAgICAgc3RvcC5zZXRNYXhpbXVtU2l6ZShkVGV4dCk7CisgICAgICBzdG9wLnNldE1pbmltdW1TaXplKGRUZXh0KTsKKyAgICAgIHN0b3Auc2V0UHJlZmVycmVkU2l6ZShkVGV4dCk7CisgICAgICBzdG9wLmFkZEZvY3VzTGlzdGVuZXIocHJvbXB0LmJ1aWx0UGFuZWwpOworICAgICAgc3RvcC5hZGRBY3Rpb25MaXN0ZW5lcihwcm9tcHQuYnVpbHRQYW5lbCk7CisKKyAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIiAgQmV0d2VlbiAgIikpOworICAgICAgdGhpcy5hZGQoc3RhcnQpOworICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiIEFuZCAiKSk7CisgICAgICB0aGlzLmFkZChzdG9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0KCkgeworICAgICAgcmV0dXJuIHN0YXJ0LmdldFRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3AoKSB7CisgICAgICByZXR1cm4gc3RvcC5nZXRUZXh0KCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIGNsYXNzIFF1ZXJ5U2VsZWN0aW9uUGFuZWwgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIEpCdXR0b24gYWRkVGVybTsKKyAgICBwcml2YXRlIEpCdXR0b24gYWRkUmFuZ2U7CisgICAgcHJpdmF0ZSBRdWVyeUJ1aWxkZXJQcm9tcHQgcHJvbXB0OworCisgICAgcHVibGljIFF1ZXJ5U2VsZWN0aW9uUGFuZWwoUXVlcnlCdWlsZGVyUHJvbXB0IHByb21wdCkgeworICAgICAgdGhpcy5wcm9tcHQgPSBwcm9tcHQ7CisgICAgICB0aGlzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworCisgICAgICBFbXB0eUJvcmRlciBsaW5lMSA9IG5ldyBFbXB0eUJvcmRlcigyLCAyLCAyLCAyKTsKKyAgICAgIExpbmVCb3JkZXIgbGluZTIgPSBuZXcgTGluZUJvcmRlcihDb2xvci5CTEFDSywgMSk7CisgICAgICBDb21wb3VuZEJvcmRlciBjcCA9IG5ldyBDb21wb3VuZEJvcmRlcihsaW5lMSwgbGluZTIpOworICAgICAgdGhpcy5zZXRCb3JkZXIoY3ApOworICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLCBCb3hMYXlvdXQuWV9BWElTKSk7CisKKyAgICAgIEpQYW5lbCBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICAgIERpbWVuc2lvbiBidXR0b25EaW0gPSBuZXcgRGltZW5zaW9uKDQ2MCwgMzApOworICAgICAgYnV0dG9uUGFuZWwuc2V0TWF4aW11bVNpemUoYnV0dG9uRGltKTsKKyAgICAgIGJ1dHRvblBhbmVsLnNldE1pbmltdW1TaXplKGJ1dHRvbkRpbSk7CisgICAgICBidXR0b25QYW5lbC5zZXRQcmVmZXJyZWRTaXplKGJ1dHRvbkRpbSk7CisgICAgICBidXR0b25QYW5lbC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIGJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuWF9BWElTKSk7CisKKyAgICAgIGFkZFRlcm0gPSBuZXcgSkJ1dHRvbigiQWRkIFRlcm0gQ3JpdGVyaWEiKTsKKyAgICAgIGFkZFRlcm0uc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgICBhZGRUZXJtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCisgICAgICBhZGRSYW5nZSA9IG5ldyBKQnV0dG9uKCJBZGQgUmFuZ2UgQ3JpdGVyaWEiKTsKKyAgICAgIGFkZFJhbmdlLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgYWRkUmFuZ2UuYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisKKyAgICAgIGJ1dHRvblBhbmVsLmFkZChhZGRUZXJtKTsKKyAgICAgIGJ1dHRvblBhbmVsLmFkZChhZGRSYW5nZSk7CisgICAgICB0aGlzLmFkZChidXR0b25QYW5lbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFyZzApIHsKKyAgICAgIGlmIChhcmcwLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoIkFkZCBUZXJtIENyaXRlcmlhIikpIHsKKyAgICAgICAgVGVybVF1ZXJ5UGFuZWwgdHEgPSBuZXcgVGVybVF1ZXJ5UGFuZWwocHJvbXB0KTsKKyAgICAgICAgaWYgKHRoaXMuZ2V0Q29tcG9uZW50Q291bnQoKSA+IDEpCisgICAgICAgICAgdHEuYWRkT3AoKTsKKyAgICAgICAgaW50IGluc2VydE9yZGVyID0gdGhpcy5nZXRDb21wb25lbnRDb3VudCgpIC0gMTsKKyAgICAgICAgaWYgKGluc2VydE9yZGVyIDwgMCkKKyAgICAgICAgICBpbnNlcnRPcmRlciA9IDA7CisgICAgICAgIHRoaXMuYWRkKHRxLCBpbnNlcnRPcmRlcik7CisgICAgICAgIHRoaXMudmFsaWRhdGUoKTsKKyAgICAgICAgcHJvbXB0LnNjcm9sbFBhbmUudmFsaWRhdGUoKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnMC5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKCJBZGQgUmFuZ2UgQ3JpdGVyaWEiKSkgeworICAgICAgICBSYW5nZVF1ZXJ5UGFuZWwgcnEgPSBuZXcgUmFuZ2VRdWVyeVBhbmVsKHByb21wdCk7CisgICAgICAgIGlmICh0aGlzLmdldENvbXBvbmVudENvdW50KCkgPiAxKQorICAgICAgICAgIHJxLmFkZE9wKCk7CisgICAgICAgIGludCBpbnNlcnRPcmRlciA9IHRoaXMuZ2V0Q29tcG9uZW50Q291bnQoKSAtIDE7CisgICAgICAgIGlmIChpbnNlcnRPcmRlciA8IDApCisgICAgICAgICAgaW5zZXJ0T3JkZXIgPSAwOworICAgICAgICB0aGlzLmFkZChycSwgaW5zZXJ0T3JkZXIpOworICAgICAgICB0aGlzLnZhbGlkYXRlKCk7CisgICAgICAgIHByb21wdC5zY3JvbGxQYW5lLnZhbGlkYXRlKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKKyAgICAgIFN0cmluZyBxID0gbmV3IFN0cmluZygpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmdldENvbXBvbmVudENvdW50KCk7IGkrKykgeworICAgICAgICBDb21wb25lbnQgYyA9IHRoaXMuZ2V0Q29tcG9uZW50KGkpOworICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFRlcm1RdWVyeVBhbmVsKSB7CisgICAgICAgICAgcSArPSAoKFRlcm1RdWVyeVBhbmVsKSBjKS5nZXRPcCgpICsgIiAiOworICAgICAgICAgIHEgKz0gKChUZXJtUXVlcnlQYW5lbCkgYykuZ2V0RWxlbWVudCgpICsgIjoiOworICAgICAgICAgIHEgKz0gKChUZXJtUXVlcnlQYW5lbCkgYykuZ2V0VGV4dCgpICsgIiAiOworICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBSYW5nZVF1ZXJ5UGFuZWwpIHsKKyAgICAgICAgICBxICs9ICgoUmFuZ2VRdWVyeVBhbmVsKSBjKS5nZXRPcCgpICsgIiAiOworICAgICAgICAgIHEgKz0gKChSYW5nZVF1ZXJ5UGFuZWwpIGMpLmdldEVsZW1lbnQoKSArICI6WyI7CisgICAgICAgICAgcSArPSAoKFJhbmdlUXVlcnlQYW5lbCkgYykuZ2V0U3RhcnQoKSArICIgVE8gIjsKKyAgICAgICAgICBxICs9ICgoUmFuZ2VRdWVyeVBhbmVsKSBjKS5nZXRTdG9wKCkgKyAiXSAiOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBxOworICAgIH0KKworICAgIHB1YmxpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeSBnZXRDYXNRdWVyeSgpIHsKKyAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IHEgPSBuZXcgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5nZXRDb21wb25lbnRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgQ29tcG9uZW50IGMgPSB0aGlzLmdldENvbXBvbmVudChpKTsKKyAgICAgICAgU3RyaW5nIGVsZW1lbnQ7CisgICAgICAgIGlmIChjIGluc3RhbmNlb2YgVGVybVF1ZXJ5UGFuZWwpIHsKKyAgICAgICAgICBlbGVtZW50ID0gZGF0YWJhc2UuZ2V0RWxlbWVudElEKCgoVGVybVF1ZXJ5UGFuZWwpIGMpLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgU3RyaW5nIGNyaXRlcmlhID0gKChUZXJtUXVlcnlQYW5lbCkgYykuZ2V0VGV4dCgpOworICAgICAgICAgIGlmICghZWxlbWVudC5lcXVhbHMoIiIpICYmICFjcml0ZXJpYS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBUZXJtUXVlcnlDcml0ZXJpYSB0YyA9IG5ldyBUZXJtUXVlcnlDcml0ZXJpYSgpOworICAgICAgICAgICAgdGMuc2V0RWxlbWVudE5hbWUoZWxlbWVudCk7CisgICAgICAgICAgICB0Yy5zZXRWYWx1ZShjcml0ZXJpYSk7CisgICAgICAgICAgICBxLmFkZENyaXRlcmlvbih0Yyk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBSYW5nZVF1ZXJ5UGFuZWwpIHsKKyAgICAgICAgICBlbGVtZW50ID0gZGF0YWJhc2UuZ2V0RWxlbWVudElEKCgoUmFuZ2VRdWVyeVBhbmVsKSBjKS5nZXRFbGVtZW50KCkpOworICAgICAgICAgIFN0cmluZyBzdGFydENyaXRlcmlhID0gKChSYW5nZVF1ZXJ5UGFuZWwpIGMpLmdldFN0YXJ0KCk7CisgICAgICAgICAgU3RyaW5nIHN0b3BDcml0ZXJpYSA9ICgoUmFuZ2VRdWVyeVBhbmVsKSBjKS5nZXRTdG9wKCk7CisgICAgICAgICAgaWYgKCFlbGVtZW50LmVxdWFscygiIikgJiYgIXN0YXJ0Q3JpdGVyaWEuZXF1YWxzKCIiKQorICAgICAgICAgICAgICAmJiAhc3RvcENyaXRlcmlhLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIFJhbmdlUXVlcnlDcml0ZXJpYSBydCA9IG5ldyBSYW5nZVF1ZXJ5Q3JpdGVyaWEoKTsKKyAgICAgICAgICAgIHJ0LnNldEVsZW1lbnROYW1lKGVsZW1lbnQpOworICAgICAgICAgICAgcnQuc2V0U3RhcnRWYWx1ZShzdGFydENyaXRlcmlhKTsKKyAgICAgICAgICAgIHJ0LnNldEVuZFZhbHVlKHN0b3BDcml0ZXJpYSk7CisgICAgICAgICAgICBxLmFkZENyaXRlcmlvbihydCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBxOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hQYW5lbCBleHRlbmRzIEpQYW5lbCB7CisgICAgcHJpdmF0ZSBKQnV0dG9uIHNlYXJjaDsKKworICAgIHB1YmxpYyBTZWFyY2hQYW5lbChRdWVyeUJ1aWxkZXJQcm9tcHQgcHJvbXB0KSB7CisgICAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oNTAwLCA0MCk7CisgICAgICB0aGlzLnNldE1heGltdW1TaXplKGQpOworICAgICAgdGhpcy5zZXRNaW5pbXVtU2l6ZShkKTsKKyAgICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShkKTsKKyAgICAgIEVtcHR5Qm9yZGVyIGxpbmUxID0gbmV3IEVtcHR5Qm9yZGVyKDIsIDIsIDIsIDIpOworICAgICAgTGluZUJvcmRlciBsaW5lMiA9IG5ldyBMaW5lQm9yZGVyKENvbG9yLkJMQUNLLCAxKTsKKyAgICAgIENvbXBvdW5kQm9yZGVyIGNwID0gbmV3IENvbXBvdW5kQm9yZGVyKGxpbmUxLCBsaW5lMik7CisgICAgICB0aGlzLnNldEJvcmRlcihjcCk7CisgICAgICB0aGlzLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKworICAgICAgc2VhcmNoID0gbmV3IEpCdXR0b24oIlNlYXJjaCIpOworICAgICAgc2VhcmNoLnNldE5hbWUoIkFkdmFuY2VkUXVlcnkiKTsKKyAgICAgIHNlYXJjaC5hZGRBY3Rpb25MaXN0ZW5lcihwcm9tcHQubGlzdGVuZXIpOworICAgICAgc2VhcmNoLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworCisgICAgICBKUGFuZWwgYnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICBidXR0b25QYW5lbC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIGJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuWF9BWElTKSk7CisgICAgICBidXR0b25QYW5lbC5hZGQoc2VhcmNoKTsKKyAgICAgIHRoaXMuYWRkKGJ1dHRvblBhbmVsLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIGNsYXNzIFR5cGVQYW5lbCBleHRlbmRzIEpQYW5lbCB7CisKKyAgICBwcml2YXRlIEpDb21ib0JveCB0eXBlczsKKworICAgIHB1YmxpYyBUeXBlUGFuZWwoUXVlcnlCdWlsZGVyUHJvbXB0IHByb21wdCkgeworCisgICAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oNTAwLCA0MCk7CisgICAgICB0aGlzLnNldE1heGltdW1TaXplKGQpOworICAgICAgdGhpcy5zZXRNaW5pbXVtU2l6ZShkKTsKKyAgICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShkKTsKKyAgICAgIEVtcHR5Qm9yZGVyIGxpbmUxID0gbmV3IEVtcHR5Qm9yZGVyKDIsIDIsIDIsIDIpOworICAgICAgTGluZUJvcmRlciBsaW5lMiA9IG5ldyBMaW5lQm9yZGVyKENvbG9yLkJMQUNLLCAxKTsKKyAgICAgIENvbXBvdW5kQm9yZGVyIGNwID0gbmV3IENvbXBvdW5kQm9yZGVyKGxpbmUxLCBsaW5lMik7CisgICAgICB0aGlzLnNldEJvcmRlcihjcCk7CisKKyAgICAgIHR5cGVzID0gbmV3IEpDb21ib0JveChkYXRhYmFzZS5nZXRBdmFpbGFibGVUeXBlcygpKTsKKyAgICAgIHR5cGVzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgRGltZW5zaW9uIHREaW0gPSBuZXcgRGltZW5zaW9uKDIwMCwgMzApOworICAgICAgdHlwZXMuc2V0TWF4aW11bVNpemUodERpbSk7CisgICAgICB0eXBlcy5zZXRNaW5pbXVtU2l6ZSh0RGltKTsKKyAgICAgIHR5cGVzLnNldFByZWZlcnJlZFNpemUodERpbSk7CisKKyAgICAgIHRoaXMuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgICB0aGlzLnNldExheW91dChuZXcgQm94TGF5b3V0KHRoaXMsIEJveExheW91dC5YX0FYSVMpKTsKKworICAgICAgSkxhYmVsIGxhYmVsID0gbmV3IEpMYWJlbCgiICAgICAgICBQcm9kdWN0IFR5cGU6ICAgIik7CisKKyAgICAgIHRoaXMuYWRkKGxhYmVsKTsKKyAgICAgIHRoaXMuYWRkKHR5cGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICByZXR1cm4gdHlwZXMuZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNsYXNzIEJ1aWx0UXVlcnlQYW5lIGV4dGVuZHMgSlBhbmVsIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciwKKyAgICAgIEFjdGlvbkxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgUXVlcnlCdWlsZGVyUHJvbXB0IHA7CisgICAgcHJpdmF0ZSBKVGV4dEFyZWEgZmllbGQ7CisKKyAgICBwdWJsaWMgQnVpbHRRdWVyeVBhbmUoUXVlcnlCdWlsZGVyUHJvbXB0IHByb21wdCkgeworCisgICAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oNTAwLCA3NSk7CisgICAgICB0aGlzLnNldE1heGltdW1TaXplKGQpOworICAgICAgdGhpcy5zZXRNaW5pbXVtU2l6ZShkKTsKKyAgICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShkKTsKKworICAgICAgRW1wdHlCb3JkZXIgbGluZTEgPSBuZXcgRW1wdHlCb3JkZXIoMiwgMiwgMiwgMik7CisgICAgICBMaW5lQm9yZGVyIGxpbmUyID0gbmV3IExpbmVCb3JkZXIoQ29sb3IuQkxBQ0ssIDEpOworICAgICAgQ29tcG91bmRCb3JkZXIgY3AgPSBuZXcgQ29tcG91bmRCb3JkZXIobGluZTEsIGxpbmUyKTsKKyAgICAgIHRoaXMuc2V0Qm9yZGVyKGNwKTsKKyAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisKKyAgICAgIGZpZWxkID0gbmV3IEpUZXh0QXJlYSgpOworICAgICAgRm9udCBmb250ID0gbmV3IEZvbnQoInNhbi1zZXJpZiIsIEZvbnQuUExBSU4sIDEwKTsKKyAgICAgIGZpZWxkLnNldEZvbnQoZm9udCk7CisgICAgICBmaWVsZC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIGZpZWxkLnNldExpbmVXcmFwKHRydWUpOworICAgICAgZmllbGQuc2V0V3JhcFN0eWxlV29yZCh0cnVlKTsKKworICAgICAgdGhpcy5hZGQoZmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgYXJnMCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGFyZzApIHsKKyAgICAgIGZpZWxkLnNldFRleHQocVBhbmVsLmdldFF1ZXJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhcmcwKSB7CisgICAgICBmaWVsZC5zZXRUZXh0KHFQYW5lbC5nZXRRdWVyeSgpKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2Jyb3dzZXIvdmlldy9wcm9tcHRzL1NvcnRQcm9tcHQuamF2YSBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcHJvbXB0cy9Tb3J0UHJvbXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNTUwYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9icm93c2VyL3ZpZXcvcHJvbXB0cy9Tb3J0UHJvbXB0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuYnJvd3Nlci52aWV3LnByb21wdHM7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOworaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmJyb3dzZXIudmlldy5NYWluV2luZG93OworCitwdWJsaWMgY2xhc3MgU29ydFByb21wdCBleHRlbmRzIEpGcmFtZSB7CisKKyAgcHJpdmF0ZSBDb2x1bW5QYW5lbCBjUGFuZWw7CisgIHByaXZhdGUgQ29ubmVjdEJ1dHRvbiBjQnV0dG9uczsKKworICBwdWJsaWMgU29ydFByb21wdChNYWluV2luZG93IHdpbmRvdywgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICB0aGlzLnNldE5hbWUoIlNvcnQiKTsKKyAgICB0aGlzLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihESVNQT1NFX09OX0NMT1NFKTsKKyAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oMzUwLCAxNTApOworICAgIHRoaXMuc2V0TWluaW11bVNpemUoZCk7CisgICAgdGhpcy5zZXRNYXhpbXVtU2l6ZShkKTsKKyAgICB0aGlzLnNldFByZWZlcnJlZFNpemUoZCk7CisKKyAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KAorICAgICAgICBuZXcgQm94TGF5b3V0KHRoaXMuZ2V0Q29udGVudFBhbmUoKSwgQm94TGF5b3V0LllfQVhJUykpOworICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKworICAgIGNQYW5lbCA9IG5ldyBDb2x1bW5QYW5lbCh3aW5kb3cpOworICAgIGNCdXR0b25zID0gbmV3IENvbm5lY3RCdXR0b24obGlzdGVuZXIpOworICAgIHRoaXMuYWRkKGNQYW5lbCk7CisgICAgdGhpcy5hZGQoY0J1dHRvbnMpOworICB9CisKKyAgcHVibGljIGludCBnZXRTb3J0SW5kZXgoKSB7CisgICAgcmV0dXJuIGNQYW5lbC5nZXRTb3J0SW5kZXgoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0U29ydFR5cGUoKSB7CisgICAgcmV0dXJuIGNQYW5lbC5nZXRTb3J0VHlwZSgpOworICB9CisKKyAgcHJvdGVjdGVkIGNsYXNzIENvbHVtblBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKKworICAgIHByb3RlY3RlZCBKQ29tYm9Cb3ggQ29sQ2hvaWNlczsKKyAgICBwcm90ZWN0ZWQgSkNvbWJvQm94IFNvcnRDaG9pY2VzOworICAgIHByb3RlY3RlZCBKQnV0dG9uIGNhbmNlbDsKKyAgICBwcm90ZWN0ZWQgSkJ1dHRvbiBvazsKKworICAgIHB1YmxpYyBDb2x1bW5QYW5lbChNYWluV2luZG93IHdpbmRvdykgeworICAgICAgQ29sQ2hvaWNlcyA9IG5ldyBKQ29tYm9Cb3god2luZG93LmdldENvbEhlYWRlcnMoKSk7CisgICAgICBDb2xDaG9pY2VzLnNldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgICBDb2xDaG9pY2VzLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOworICAgICAgU3RyaW5nW10gc29ydFBhdHRlcm5zID0geyAiQWNjZW5kaW5nIiwgIkRlc2NlbmRpbmciIH07CisgICAgICBTb3J0Q2hvaWNlcyA9IG5ldyBKQ29tYm9Cb3goc29ydFBhdHRlcm5zKTsKKyAgICAgIFNvcnRDaG9pY2VzLnNldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgICBTb3J0Q2hvaWNlcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKworICAgICAgRGltZW5zaW9uIGNob2ljZXNEaW0gPSBuZXcgRGltZW5zaW9uKDIwMCwgMjApOworICAgICAgQ29sQ2hvaWNlcy5zZXRNaW5pbXVtU2l6ZShjaG9pY2VzRGltKTsKKyAgICAgIENvbENob2ljZXMuc2V0TWF4aW11bVNpemUoY2hvaWNlc0RpbSk7CisgICAgICBDb2xDaG9pY2VzLnNldFByZWZlcnJlZFNpemUoY2hvaWNlc0RpbSk7CisgICAgICBTb3J0Q2hvaWNlcy5zZXRNaW5pbXVtU2l6ZShjaG9pY2VzRGltKTsKKyAgICAgIFNvcnRDaG9pY2VzLnNldE1heGltdW1TaXplKGNob2ljZXNEaW0pOworICAgICAgU29ydENob2ljZXMuc2V0UHJlZmVycmVkU2l6ZShjaG9pY2VzRGltKTsKKworICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOworICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CisKKyAgICAgIEVtcHR5Qm9yZGVyIGxpbmUxID0gbmV3IEVtcHR5Qm9yZGVyKDUsIDEwLCA1LCA1KTsKKyAgICAgIHRoaXMuc2V0Qm9yZGVyKGxpbmUxKTsKKworICAgICAgYy5ncmlkeCA9IDA7CisgICAgICBjLmdyaWR5ID0gMDsKKyAgICAgIGMuaXBhZHggPSAxMDsKKyAgICAgIGMuaXBhZHkgPSAxMDsKKyAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIlNvcnQgQnk6ICAiKSwgYyk7CisKKyAgICAgIGMuZ3JpZHggPSAxOworICAgICAgYy5ncmlkeSA9IDA7CisgICAgICB0aGlzLmFkZChDb2xDaG9pY2VzLCBjKTsKKworICAgICAgYy5ncmlkeCA9IDA7CisgICAgICBjLmdyaWR5ID0gMTsKKyAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkluIE9yZGVyOiAgIiksIGMpOworCisgICAgICBjLmdyaWR4ID0gMTsKKyAgICAgIGMuZ3JpZHkgPSAxOworICAgICAgdGhpcy5hZGQoU29ydENob2ljZXMsIGMpOworCisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTb3J0SW5kZXgoKSB7CisgICAgICByZXR1cm4gQ29sQ2hvaWNlcy5nZXRTZWxlY3RlZEluZGV4KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb3J0VHlwZSgpIHsKKyAgICAgIHJldHVybiBTb3J0Q2hvaWNlcy5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBDb25uZWN0QnV0dG9uIGV4dGVuZHMgSlBhbmVsIHsKKworICAgIHByb3RlY3RlZCBKQnV0dG9uIGNvbm5lY3Q7CisgICAgcHJvdGVjdGVkIEpCdXR0b24gY2FuY2VsOworCisgICAgcHJvdGVjdGVkIENvbm5lY3RCdXR0b24oQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgIHRoaXMuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgICB0aGlzLnNldExheW91dChuZXcgQm94TGF5b3V0KHRoaXMsIEJveExheW91dC5YX0FYSVMpKTsKKworICAgICAgRW1wdHlCb3JkZXIgbGluZTEgPSBuZXcgRW1wdHlCb3JkZXIoNSwgMjAsIDUsIDUpOworICAgICAgdGhpcy5zZXRCb3JkZXIobGluZTEpOworCisgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCIgICAgICAgICAgICAgICAgICAgICAgICAgICIpKTsKKyAgICAgIGNvbm5lY3QgPSBuZXcgSkJ1dHRvbigiT0siKTsKKyAgICAgIGNvbm5lY3Quc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgICBjb25uZWN0LmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgIGNhbmNlbCA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKKyAgICAgIGNhbmNlbC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgIGNhbmNlbC5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICBjYW5jZWwuc2V0TmFtZSgiU29ydENhbmNlbCIpOworICAgICAgdGhpcy5hZGQoY2FuY2VsKTsKKyAgICAgIHRoaXMuYWRkKGNvbm5lY3QpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3BvbS54bWwgYi8wLjEwL2FwcC93ZWRpdG9yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwMGQ4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3IvcG9tLnhtbApAQCAtMCwwICsxLDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwkJPHJlbGF0aXZlUGF0aD4uLi8uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKwk8L3BhcmVudD4KKwk8YXJ0aWZhY3RJZD53ZWRpdG9yPC9hcnRpZmFjdElkPgorCTxuYW1lPkNhdGFsb2cgYW5kIEFyY2hpdmUgV29ya2Zsb3cgTWFuYWdlbWVudCBHVUkgRWRpdG9yPC9uYW1lPgorCTxkZXNjcmlwdGlvbj5BcGFjaGUgT09EVCBXb3JrZmxvdyBFZGl0b3IgR1VJPC9kZXNjcmlwdGlvbj4KKwk8YnVpbGQ+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxkZXNjcmlwdG9ycz4KKwkJCQkJCTxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKwkJCQkJPC9kZXNjcmlwdG9ycz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCTwvcGx1Z2lucz4KKwkJPHJlc291cmNlcz4KKwkJCTxyZXNvdXJjZT4KKwkJCQk8dGFyZ2V0UGF0aD5vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS91dGlsPC90YXJnZXRQYXRoPgorCQkJCTxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnM8L2RpcmVjdG9yeT4KKwkJCQk8aW5jbHVkZXM+CisJCQkJCTxpbmNsdWRlPioqPC9pbmNsdWRlPgorCQkJCTwvaW5jbHVkZXM+CisJCQk8L3Jlc291cmNlPgorCQk8L3Jlc291cmNlcz4KKwk8L2J1aWxkPgorCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FzLXdvcmtmbG93PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm5ldC5zZi5qdW5nPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuZy1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm5ldC5zZi5qdW5nPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuZy12aXN1YWxpemF0aW9uPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5uZXQuc2YuanVuZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bmctYWxnb3JpdGhtczwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+bmV0LnNmLmp1bmc8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5nLWdyYXBoLWltcGw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmpncmFwaDwvZ3JvdXBJZD4gICAgICAgIAorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amdyYXBoPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NS4xMy4wLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4JCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ4NjNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw3MiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5Pg0KKyAgPGlkPmRpc3Q8L2lkPg0KKyAgPGZvcm1hdHM+DQorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCisgIDwvZm9ybWF0cz4NCisgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4gIAorICA8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5Pg0KKyAgPGZpbGVTZXRzPg0KKyAgICA8ZmlsZVNldD4NCisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4NCisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4NCisgICAgICA8aW5jbHVkZXM+DQorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPg0KKyAgICAgIDwvaW5jbHVkZXM+DQorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KioucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFTU9WRS5sb2c8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+d29ya3NwYWNlPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+DQorICA8L2ZpbGVTZXRzPg0KKyAgPGRlcGVuZGVuY3lTZXRzPg0KKyAgICA8ZGVwZW5kZW5jeVNldD4NCisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4NCisgICAgICA8dW5wYWNrT3B0aW9ucy8+DQorICAgIDwvZGVwZW5kZW5jeVNldD4NCisgIDwvZGVwZW5kZW5jeVNldHM+DQorPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2Jpbi93ZWRpdG9yIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9iaW4vd2VkaXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdkZjBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9iaW4vd2VkaXRvcgpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vY3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyR7SkFWQV9IT01FfS9iaW4vamF2YSBcCisJLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBcCisJLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKwlvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5Xb3JrZmxvd0dVSQorCisKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9Xb3JrZmxvd0dVSS5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL1dvcmtmbG93R1VJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0ZWFiZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9Xb3JrZmxvd0dVSS5qYXZhCkBAIC0wLDAgKzEsMzE0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zd2luZy5KRmlsZUNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51QmFyOworaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOworaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0ZvY3VzTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tZW51LkVkaXRNZW51OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1lbnUuRmlsZU1lbnU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwuTW9kZWxHcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tb2RlbC5yZXBvLlhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLnJlcG8uWG1sV29ya2Zsb3dNb2RlbFJlcG9zaXRvcnlGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLk11bHRpU3RhdGVQZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS5idWlsZC5CdWlsZFBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS50b29sYm94LlRvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkudG9vbGJveC5Ub29sQm94OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnV0aWwuSWNvbkxvYWRlcjsKKworLy9Db21tb25zIGltcG9ydAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworCisvKioKKyAqIAorICogCisgKiBNYWluIGRyaXZlciBzaGVsbCBhbmQgSkZyYW1lIGZvciB0aGUgV29ya2Zsb3cgRWRpdG9yIEdVSS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93R1VJIGV4dGVuZHMgSkZyYW1lIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODIxNzU0MDQ0MDE5NTEyNjM3N0w7CisKKyAgcHJpdmF0ZSBUb29sQm94IHRvb2xib3g7CisKKyAgcHJpdmF0ZSBNdWx0aVN0YXRlUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmU7CisKKyAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciB1bnRpdGxlZEl0ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICBwcml2YXRlIEpNZW51QmFyIG1lbnU7CisKKyAgcHJpdmF0ZSBGaWxlIHdvcmtzcGFjZTsKKworICBwcml2YXRlIFhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5IHJlcG87CisKKyAgcHVibGljIFdvcmtmbG93R1VJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICB0aGlzLmFkZFdpbmRvd0ZvY3VzTGlzdGVuZXIobmV3IFdpbmRvd0ZvY3VzTGlzdGVuZXIoKSB7CisKKyAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0dhaW5lZEZvY3VzKFdpbmRvd0V2ZW50IGUpIHsKKyAgICAgICAgaWYgKG1lbnUgIT0gbnVsbCkKKyAgICAgICAgICBtZW51LnJldmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKHRvb2xib3ggIT0gbnVsbCkKKyAgICAgICAgICB0b29sYm94LnJldmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKHBlcnNwZWN0aXZlICE9IG51bGwpCisgICAgICAgICAgcGVyc3BlY3RpdmUucmVmcmVzaCgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dMb3N0Rm9jdXMoV2luZG93RXZlbnQgZSkgeworICAgICAgfQorCisgICAgfSk7CisKKyAgICB0aGlzLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDEwMDAsIDgwMCkpOworCisgICAgVmVjdG9yPFRvb2w+IHRvb2xzID0gbmV3IFZlY3RvcjxUb29sPigpOworICAgIFRvb2wgZWRpdFRvb2wgPSBuZXcgVG9vbChJY29uTG9hZGVyLmdldEljb24oSWNvbkxvYWRlci5FRElUKSwKKyAgICAgICAgSWNvbkxvYWRlci5nZXRJY29uKEljb25Mb2FkZXIuRURJVF9TRUxFQ1RFRCkpIHsKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2ODI4NDUyNjM3OTYxNjEyODJMOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgIFdvcmtmbG93R1VJLnRoaXMucGVyc3BlY3RpdmUuc2V0TW9kZShWaWV3Lk1vZGUuRURJVCk7CisgICAgICB9CisgICAgfTsKKyAgICB0b29scy5hZGQoZWRpdFRvb2wpOworICAgIFRvb2wgZGVsZXRlVG9vbCA9IG5ldyBUb29sKEljb25Mb2FkZXIuZ2V0SWNvbihJY29uTG9hZGVyLkRFTEVURSksCisgICAgICAgIEljb25Mb2FkZXIuZ2V0SWNvbihJY29uTG9hZGVyLkRFTEVURV9TRUxFQ1RFRCkpIHsKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwNTAxMjc3MTMyNTQ2MzQ3ODNMOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgIFdvcmtmbG93R1VJLnRoaXMucGVyc3BlY3RpdmUuc2V0TW9kZShWaWV3Lk1vZGUuREVMRVRFKTsKKyAgICAgIH0KKyAgICB9OworICAgIHRvb2xzLmFkZChkZWxldGVUb29sKTsKKyAgICBUb29sIG1vdmVUb29sID0gbmV3IFRvb2woSWNvbkxvYWRlci5nZXRJY29uKEljb25Mb2FkZXIuTU9WRSksCisgICAgICAgIEljb25Mb2FkZXIuZ2V0SWNvbihJY29uTG9hZGVyLk1PVkVfU0VMRUNURUQpKSB7CisgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjgyODQ1MjYzNzk2MTYxMjgyTDsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBXb3JrZmxvd0dVSS50aGlzLnBlcnNwZWN0aXZlLnNldE1vZGUoVmlldy5Nb2RlLk1PVkUpOworICAgICAgfQorICAgIH07CisgICAgdG9vbHMuYWRkKG1vdmVUb29sKTsKKyAgICBUb29sIHpvb21JblRvb2wgPSBuZXcgVG9vbChJY29uTG9hZGVyLmdldEljb24oSWNvbkxvYWRlci5aT09NX0lOKSwKKyAgICAgICAgSWNvbkxvYWRlci5nZXRJY29uKEljb25Mb2FkZXIuWk9PTV9JTl9TRUxFQ1RFRCkpIHsKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2ODI4NDUyNjM3OTYxNjEyODJMOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgIFdvcmtmbG93R1VJLnRoaXMucGVyc3BlY3RpdmUuc2V0TW9kZShWaWV3Lk1vZGUuWk9PTV9JTik7CisgICAgICB9CisgICAgfTsKKyAgICB0b29scy5hZGQoem9vbUluVG9vbCk7CisgICAgVG9vbCB6b29tT3V0VG9vbCA9IG5ldyBUb29sKEljb25Mb2FkZXIuZ2V0SWNvbihJY29uTG9hZGVyLlpPT01fT1VUKSwKKyAgICAgICAgSWNvbkxvYWRlci5nZXRJY29uKEljb25Mb2FkZXIuWk9PTV9PVVRfU0VMRUNURUQpKSB7CisgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjgyODQ1MjYzNzk2MTYxMjgyTDsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBXb3JrZmxvd0dVSS50aGlzLnBlcnNwZWN0aXZlLnNldE1vZGUoVmlldy5Nb2RlLlpPT01fT1VUKTsKKyAgICAgIH0KKyAgICB9OworICAgIHRvb2xzLmFkZCh6b29tT3V0VG9vbCk7CisgICAgdG9vbGJveCA9IG5ldyBUb29sQm94KHRvb2xzKTsKKyAgICB0b29sYm94LnNldFNlbGVjdGVkKGVkaXRUb29sKTsKKyAgICB0aGlzLmFkZCh0b29sYm94LCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCisgICAgdGhpcy5zZXRKTWVudUJhcihtZW51ID0gdGhpcy5nZW5lcmF0ZU1lbnVCYXIoKSk7CisgICAgcGVyc3BlY3RpdmUgPSBuZXcgQnVpbGRQZXJzcGVjdGl2ZSgpOworICAgIHBlcnNwZWN0aXZlLnJlZnJlc2goKTsKKyAgICB0aGlzLmFkZChwZXJzcGVjdGl2ZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgIH0KKworICBwcml2YXRlIHZvaWQgdXBkYXRlV29ya3NwYWNlVGV4dCgpIHsKKyAgICBpZiAodGhpcy53b3Jrc3BhY2UgPT0gbnVsbCkKKyAgICAgIHRoaXMuc2V0VGl0bGUobnVsbCk7CisgICAgZWxzZQorICAgICAgdGhpcy5zZXRUaXRsZShTdHJpbmdVdGlscy5sZWZ0UGFkKCJXb3Jrc3BhY2U6ICIgKyB0aGlzLndvcmtzcGFjZSwgMTAwKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9hZFByb2plY3RzKCkgeworICAgIHRyeSB7CisgICAgICBYbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBYbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeUZhY3RvcnkoKTsKKyAgICAgIGZhY3Rvcnkuc2V0V29ya3NwYWNlKHRoaXMud29ya3NwYWNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIHJlcG8gPSBmYWN0b3J5LmNyZWF0ZU1vZGVsUmVwb3NpdG9yeSgpOworICAgICAgcmVwby5sb2FkR3JhcGhzKG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgic2VxdWVudGlhbCIsCisgICAgICAgICAgInBhcmFsbGVsIiwgInRhc2siLCAiY29uZGl0aW9uIikpKTsKKyAgICAgIGZvciAoRmlsZSBmaWxlIDogcmVwby5nZXRGaWxlcygpKSB7CisgICAgICAgIExpc3Q8TW9kZWxHcmFwaD4gZ3JhcGhzID0gbmV3IFZlY3RvcjxNb2RlbEdyYXBoPigpOworICAgICAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiByZXBvLmdldEdyYXBocygpKQorICAgICAgICAgIGlmIChncmFwaC5nZXRNb2RlbCgpLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpCisgICAgICAgICAgICBncmFwaHMuYWRkKGdyYXBoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdyYXBocyk7CisgICAgICAgIHBlcnNwZWN0aXZlLmFkZFN0YXRlKG5ldyBWaWV3U3RhdGUoZmlsZSwgbnVsbCwgZ3JhcGhzLCByZXBvCisgICAgICAgICAgICAuZ2V0R2xvYmFsQ29uZmlnR3JvdXBzKCkpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgSk1lbnVCYXIgZ2VuZXJhdGVNZW51QmFyKCkgeworICAgIEpNZW51QmFyIGJhciA9IG5ldyBKTWVudUJhcigpOworICAgIEZpbGVNZW51IGZpbGVNZW51ID0gbmV3IEZpbGVNZW51KCk7CisgICAgYmFyLmFkZChmaWxlTWVudSk7CisgICAgZmlsZU1lbnUuZ2V0RXhpdCgpLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIAorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3lzdGVtLmV4aXQoMSk7ICAgICAgICAKKyAgICAgIH0KKyAgICB9KTsKKyAgICAKKyAgICBmaWxlTWVudS5nZXRPcGVuV29ya3NwYWNlKCkuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgSkZpbGVDaG9vc2VyIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKG5ldyBGaWxlKCIuIikpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0RmlsZShGaWxlIGYpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGYuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIGNob29zZXIuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOworICAgICAgICAgIGludCB2YWx1ZSA9IGNob29zZXIuc2hvd09wZW5EaWFsb2coV29ya2Zsb3dHVUkudGhpcyk7CisgICAgICAgICAgaWYgKHZhbHVlID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworICAgICAgICAgICAgd29ya3NwYWNlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKyAgICAgICAgICAgIHVwZGF0ZVdvcmtzcGFjZVRleHQoKTsKKyAgICAgICAgICAgIHBlcnNwZWN0aXZlLnJlc2V0KCk7CisgICAgICAgICAgICBsb2FkUHJvamVjdHMoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgZmlsZU1lbnUuZ2V0SW1wb3J0KCkuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAod29ya3NwYWNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgSkZpbGVDaG9vc2VyIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKG5ldyBGaWxlKCIuIikpOworICAgICAgICAgIGludCB2YWx1ZSA9IGNob29zZXIuc2hvd09wZW5EaWFsb2coV29ya2Zsb3dHVUkudGhpcyk7CisgICAgICAgICAgaWYgKHZhbHVlID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKyAgICAgICAgICAgIFhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5RmFjdG9yeSgpOworICAgICAgICAgICAgZmFjdG9yeS5zZXRXb3Jrc3BhY2Uod29ya3NwYWNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIFZpZXcgYWN0aXZlVmlldyA9IHBlcnNwZWN0aXZlLmdldEFjdGl2ZVZpZXcoKTsKKworICAgICAgICAgICAgaWYgKGFjdGl2ZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgY29kZSBmb3IgaW1wb3J0CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0pOworICAgIGZpbGVNZW51LmdldE5ld1dvcmtzcGFjZSgpLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBKRmlsZUNob29zZXIgY2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIobmV3IEZpbGUoIi4iKSkgeworICAgICAgICAgIGJvb2xlYW4gYWNjZXB0RmlsZShGaWxlIGYpIHsKKyAgICAgICAgICAgIHJldHVybiBmLmlzRGlyZWN0b3J5KCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjaG9vc2VyLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKKyAgICAgICAgaW50IHZhbHVlID0gY2hvb3Nlci5zaG93T3BlbkRpYWxvZyhXb3JrZmxvd0dVSS50aGlzKTsKKyAgICAgICAgaWYgKHZhbHVlID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworICAgICAgICAgIHdvcmtzcGFjZSA9IGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisgICAgICAgICAgdXBkYXRlV29ya3NwYWNlVGV4dCgpOworICAgICAgICAgIHBlcnNwZWN0aXZlLnJlc2V0KCk7CisgICAgICAgICAgbG9hZFByb2plY3RzKCk7CisgICAgICAgICAgcGVyc3BlY3RpdmUucmVmcmVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisKKyAgICBmaWxlTWVudS5nZXROZXdQcm9qZWN0KCkuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIFRPRE86IGFkZCBuZXcgcHJvamVjdCBjb2RlCisgICAgICB9CisgICAgfSk7CisgICAgZmlsZU1lbnUuZ2V0U2F2ZSgpLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgICAgCXRyeSB7CisgICAgICAJCXJlcG8uc2F2ZSgpOworICAgICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAJfQorICAgICAgfQorICAgIH0pOworICAgIEVkaXRNZW51IGVkaXRNZW51ID0gbmV3IEVkaXRNZW51KCk7CisgICAgYmFyLmFkZChlZGl0TWVudSk7CisgICAgZWRpdE1lbnUuZ2V0VW5kbygpLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHBlcnNwZWN0aXZlLnVuZG8oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgYmFyLnJldmFsaWRhdGUoKTsKKyAgICByZXR1cm4gYmFyOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIFVJTWFuYWdlci5wdXQoIlRhYmJlZFBhbmUuc2VsZWN0ZWQiLCBuZXcgQ29sb3IoMjM4LCAyMzgsIDIzOCkpOworICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgV29ya2Zsb3dHVUkgZ3VpOworICAgICAgICB0cnkgeworICAgICAgICAgIGd1aSA9IG5ldyBXb3JrZmxvd0dVSSgpOworICAgICAgICAgIGd1aS5wYWNrKCk7CisgICAgICAgICAgZ3VpLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9tZW51L0VkaXRNZW51LmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbWVudS9FZGl0TWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTBkYmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbWVudS9FZGl0TWVudS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tZW51OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnU7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOworCisvKioKKyAqIAorICogCisgKiBFZGl0IG1lbnUgZHJpdmVyIGZvciB0aGUgV29ya2Zsb3cgRWRpdG9yIEdVSS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIEVkaXRNZW51IGV4dGVuZHMgSk1lbnUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzY4NzQ0Njk3MTMyNDIxMjc0TDsKKworICBwcml2YXRlIEpNZW51SXRlbSB1bmRvSXRlbTsKKworICBwdWJsaWMgRWRpdE1lbnUoKSB7CisgICAgc3VwZXIoIkVkaXQiKTsKKyAgICB0aGlzLmFkZCh0aGlzLnVuZG9JdGVtID0gbmV3IEpNZW51SXRlbSgiVW5kbyIpKTsKKyAgfQorCisgIHB1YmxpYyBKTWVudUl0ZW0gZ2V0VW5kbygpIHsKKyAgICByZXR1cm4gdGhpcy51bmRvSXRlbTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbWVudS9GaWxlTWVudS5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL21lbnUvRmlsZU1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTlhMzMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL21lbnUvRmlsZU1lbnUuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubWVudTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51OworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKKworLyoqCisgKiAKKyAqIAorICogRmlsZSBtZW51IGRyaXZlciBmb3IgdGhlIFdvcmtmbG93IEVkaXRvciBHVUkuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTWVudSBleHRlbmRzIEpNZW51IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTcwMjk4NzM5NjkxNjQ0MTcxOEw7CisKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gbmV3V29ya3NwYWNlOworICBwcml2YXRlIEpNZW51SXRlbSBuZXdQcm9qZWN0OworICBwcml2YXRlIEpNZW51SXRlbSBvcGVuV29ya3NwYWNlOworICBwcml2YXRlIEpNZW51SXRlbSBpbXBvcnRJdGVtOworICBwcml2YXRlIEpNZW51SXRlbSBzYXZlSXRlbTsKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gZXhpdEl0ZW07CisgIHByaXZhdGUgSk1lbnUgbmV3TWVudSwgb3Blbk1lbnUsIGltcG9ydE1lbnU7CisKKyAgcHVibGljIEZpbGVNZW51KCkgeworICAgIHN1cGVyKCJGaWxlIik7CisgICAgdGhpcy5hZGQobmV3TWVudSA9IG5ldyBKTWVudSgiTmV3IikpOworICAgIG5ld01lbnUuYWRkKHRoaXMubmV3V29ya3NwYWNlID0gbmV3IEpNZW51SXRlbSgiV29ya3NwYWNlIikpOworICAgIG5ld01lbnUuYWRkKHRoaXMubmV3UHJvamVjdCA9IG5ldyBKTWVudUl0ZW0oIlByb2plY3QiKSk7CisgICAgdGhpcy5hZGQob3Blbk1lbnUgPSBuZXcgSk1lbnUoIk9wZW4iKSk7CisgICAgb3Blbk1lbnUuYWRkKHRoaXMub3BlbldvcmtzcGFjZSA9IG5ldyBKTWVudUl0ZW0oIldvcmtzcGFjZSIpKTsKKyAgICB0aGlzLmFkZChpbXBvcnRNZW51ID0gbmV3IEpNZW51KCJJbXBvcnQiKSk7CisgICAgaW1wb3J0TWVudS5hZGQodGhpcy5pbXBvcnRJdGVtID0gbmV3IEpNZW51SXRlbSgiUHJvamVjdCIpKTsKKyAgICB0aGlzLmFkZCh0aGlzLnNhdmVJdGVtID0gbmV3IEpNZW51SXRlbSgiU2F2ZSBQcm9qZWN0IikpOworICAgIHRoaXMuYWRkKHRoaXMuZXhpdEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJFeGl0IikpOworICB9CisKKyAgcHVibGljIEpNZW51SXRlbSBnZXRPcGVuV29ya3NwYWNlKCkgeworICAgIHJldHVybiB0aGlzLm9wZW5Xb3Jrc3BhY2U7CisgIH0KKworICBwdWJsaWMgSk1lbnVJdGVtIGdldEltcG9ydCgpIHsKKyAgICByZXR1cm4gdGhpcy5pbXBvcnRJdGVtOworICB9CisKKyAgcHVibGljIEpNZW51SXRlbSBnZXROZXdXb3Jrc3BhY2UoKSB7CisgICAgcmV0dXJuIHRoaXMubmV3V29ya3NwYWNlOworICB9CisKKyAgcHVibGljIEpNZW51SXRlbSBnZXROZXdQcm9qZWN0KCkgeworICAgIHJldHVybiB0aGlzLm5ld1Byb2plY3Q7CisgIH0KKworICBwdWJsaWMgSk1lbnVJdGVtIGdldFNhdmUoKSB7CisgICAgcmV0dXJuIHRoaXMuc2F2ZUl0ZW07CisgIH0KKyAgCisgIHB1YmxpYyBKTWVudUl0ZW0gZ2V0RXhpdCgpeworICAgIHJldHVybiB0aGlzLmV4aXRJdGVtOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9tb2RlbC9Nb2RlbEdyYXBoLmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbW9kZWwvTW9kZWxHcmFwaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDEzNDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbW9kZWwvTW9kZWxHcmFwaC5qYXZhCkBAIC0wLDAgKzEsMjgxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsLkd1aVV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogCisgKiAKKyAqIFRoZSBncmFwaCB0byBkaXNwbGF5IHBlciB3b3JrZmxvdyBpbiB0aGUgV29ya2Zsb3cgRWRpdG9yIEdVSS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIE1vZGVsR3JhcGggeworCisgIHByaXZhdGUgTW9kZWxHcmFwaCBwYXJlbnQ7CisgIHByaXZhdGUgTW9kZWxOb2RlIG1vZGVsOworICBwcml2YXRlIE1vZGVsR3JhcGggcHJlQ29uZGl0aW9uczsKKyAgcHJpdmF0ZSBWZWN0b3I8TW9kZWxHcmFwaD4gY2hpbGRyZW47CisgIHByaXZhdGUgTW9kZWxHcmFwaCBwb3N0Q29uZGl0aW9uczsKKyAgcHJpdmF0ZSBib29sZWFuIGlzUHJlQ29uZGl0aW9uOworICBwcml2YXRlIGJvb2xlYW4gaXNQb3N0Q29uZGl0aW9uOworCisgIHB1YmxpYyBNb2RlbEdyYXBoKE1vZGVsTm9kZSBtb2RlbCkgeworICAgIHRoaXMuaXNQcmVDb25kaXRpb24gPSBpc1Bvc3RDb25kaXRpb24gPSBmYWxzZTsKKyAgICB0aGlzLm1vZGVsID0gbW9kZWw7CisgICAgdGhpcy5jaGlsZHJlbiA9IG5ldyBWZWN0b3I8TW9kZWxHcmFwaD4oKTsKKyAgICBpZiAodGhpcy5tb2RlbC5pc1BhcmVudFR5cGUoKSkKKyAgICAgIHRoaXMuYWRkQ2hpbGQobmV3IE1vZGVsR3JhcGgoR3VpVXRpbHMuY3JlYXRlRHVtbXlOb2RlKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldElzUmVmKGJvb2xlYW4gaXNSZWYpIHsKKyAgICBTdGFjazxNb2RlbEdyYXBoPiBzdGFjayA9IG5ldyBTdGFjazxNb2RlbEdyYXBoPigpOworICAgIHN0YWNrLmFkZCh0aGlzKTsKKyAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIE1vZGVsR3JhcGggY3VyR3JhcGggPSBzdGFjay5wb3AoKTsKKyAgICAgIGN1ckdyYXBoLmdldE1vZGVsKCkuc2V0SXNSZWYoaXNSZWYpOworICAgICAgc3RhY2suYWRkQWxsKGN1ckdyYXBoLmdldENoaWxkcmVuKCkpOworICAgICAgaWYgKGN1ckdyYXBoLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsKQorICAgICAgICBzdGFjay5hZGQoY3VyR3JhcGguZ2V0UHJlQ29uZGl0aW9ucygpKTsKKyAgICAgIGlmIChjdXJHcmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICAgIHN0YWNrLmFkZChjdXJHcmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0NvbmRpdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5pc1ByZUNvbmRpdGlvbiB8fCB0aGlzLmlzUG9zdENvbmRpdGlvbjsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRXhjdXNlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wYXJlbnQgIT0gbnVsbAorICAgICAgICAmJiB0aGlzLnBhcmVudC5nZXRNb2RlbCgpLmdldEV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMoKQorICAgICAgICAgICAgLmNvbnRhaW5zKHRoaXMuZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCkpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gbW9kZWwuZ2V0SWQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNb2RlbEdyYXBoIHBhcmVudCkgeworICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7CisgICAgICBpZiAodGhpcy5pc0NvbmRpdGlvbigpICYmICF0aGlzLnBhcmVudC5pc0NvbmRpdGlvbigpKSB7CisgICAgICAgIGlmICh0aGlzLmlzUHJlQ29uZGl0aW9uKQorICAgICAgICAgIHRoaXMucGFyZW50LnByZUNvbmRpdGlvbnMgPSBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgdGhpcy5wYXJlbnQucG9zdENvbmRpdGlvbnMgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgICB9CisgICAgfQorICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIGlmICghdGhpcy5nZXRNb2RlbCgpLmlzUmVmKCkgJiYgcGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE1vZGVsKCkuaXNSZWYoKSkKKyAgICAgIHRoaXMuZ2V0TW9kZWwoKS5zZXRJc1JlZih0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBNb2RlbEdyYXBoIGdldFBhcmVudCgpIHsKKyAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CisgIH0KKworICBwdWJsaWMgTW9kZWxHcmFwaCBnZXRSb290UGFyZW50KCkgeworICAgIGlmICh0aGlzLnBhcmVudCA9PSBudWxsKQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldFJvb3RQYXJlbnQoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PE1vZGVsR3JhcGg+IGdldFBhdGhGcm9tUm9vdFBhcmVudCgpIHsKKyAgICBWZWN0b3I8TW9kZWxHcmFwaD4gcGF0aCA9IG5ldyBWZWN0b3I8TW9kZWxHcmFwaD4oKTsKKyAgICBNb2RlbEdyYXBoIGN1ckdyYXBoID0gdGhpczsKKyAgICB3aGlsZSAoY3VyR3JhcGggIT0gbnVsbCkgeworICAgICAgcGF0aC5hZGQoMCwgY3VyR3JhcGgpOworICAgICAgY3VyR3JhcGggPSB0aGlzLnBhcmVudDsKKyAgICB9CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRDaGlsZChNb2RlbEdyYXBoIGdyYXBoKSB7CisgICAgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSgpID09IDEKKyAgICAgICAgJiYgR3VpVXRpbHMuaXNEdW1teU5vZGUodGhpcy5jaGlsZHJlbi5nZXQoMCkuZ2V0TW9kZWwoKSkpCisgICAgICB0aGlzLmNoaWxkcmVuLmNsZWFyKCk7CisgICAgdGhpcy5jaGlsZHJlbi5hZGQoZ3JhcGgpOworICAgIGdyYXBoLnNldFBhcmVudCh0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKE1vZGVsR3JhcGggZ3JhcGgpIHsKKyAgICB0aGlzLmNoaWxkcmVuLnJlbW92ZShncmFwaCk7CisgICAgdGhpcy5nZXRNb2RlbCgpLmdldEV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMoKQorICAgICAgICAucmVtb3ZlKGdyYXBoLmdldE1vZGVsKCkuZ2V0TW9kZWxJZCgpKTsKKyAgICBncmFwaC5wYXJlbnQgPSBudWxsOworICAgIGlmICh0aGlzLmNoaWxkcmVuLnNpemUoKSA9PSAwKQorICAgICAgdGhpcy5hZGRDaGlsZChuZXcgTW9kZWxHcmFwaChHdWlVdGlscy5jcmVhdGVEdW1teU5vZGUoKSkpOworICB9CisKKyAgcHVibGljIExpc3Q8TW9kZWxHcmFwaD4gZ2V0Q2hpbGRyZW4oKSB7CisgICAgaWYgKHRoaXMuZ2V0TW9kZWwoKS5pc1BhcmVudFR5cGUoKSAmJiBjaGlsZHJlbi5zaXplKCkgPT0gMCkKKyAgICAgIHRoaXMuYWRkQ2hpbGQobmV3IE1vZGVsR3JhcGgoR3VpVXRpbHMuY3JlYXRlRHVtbXlOb2RlKCkpKTsKKyAgICByZXR1cm4gY2hpbGRyZW47CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKKyAgICBpZiAodGhpcy5jaGlsZHJlbi5zaXplKCkgPT0gMQorICAgICAgICAmJiBHdWlVdGlscy5pc0R1bW15Tm9kZSh0aGlzLmNoaWxkcmVuLmdldCgwKS5nZXRNb2RlbCgpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zaXplKCkgPiAwOworICB9CisKKyAgcHVibGljIE1vZGVsTm9kZSBnZXRNb2RlbCgpIHsKKyAgICByZXR1cm4gbW9kZWw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbE5vZGUgbW9kZWwpIHsKKyAgICB0aGlzLm1vZGVsID0gbW9kZWw7CisgIH0KKworICBwdWJsaWMgTWV0YWRhdGEgZ2V0SW5oZXJpdGVkU3RhdGljTWV0YWRhdGEoVmlld1N0YXRlIHN0YXRlKSB7CisgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7CisgICAgICBtLnJlcGxhY2VNZXRhZGF0YSh0aGlzLnBhcmVudC5nZXRJbmhlcml0ZWRTdGF0aWNNZXRhZGF0YShzdGF0ZSkpOworICAgICAgaWYgKHRoaXMucGFyZW50LmdldE1vZGVsKCkuZ2V0U3RhdGljTWV0YWRhdGEoKSAhPSBudWxsKQorICAgICAgICBtLnJlcGxhY2VNZXRhZGF0YSh0aGlzLnBhcmVudC5nZXRNb2RlbCgpLmdldFN0YXRpY01ldGFkYXRhKCkpOworICAgICAgaWYgKHRoaXMucGFyZW50LmdldE1vZGVsKCkuZ2V0RXh0ZW5kc0NvbmZpZygpICE9IG51bGwpCisgICAgICAgIGZvciAoU3RyaW5nIGNvbmZpZ0dyb3VwIDogdGhpcy5wYXJlbnQuZ2V0TW9kZWwoKS5nZXRFeHRlbmRzQ29uZmlnKCkpCisgICAgICAgICAgbS5yZXBsYWNlTWV0YWRhdGEoc3RhdGUuZ2V0R2xvYmFsQ29uZmlnR3JvdXBzKCkuZ2V0KGNvbmZpZ0dyb3VwKQorICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoKSk7CisgICAgfQorICAgIHJldHVybiBtOworICB9CisKKyAgcHVibGljIE1vZGVsR3JhcGggZ2V0UHJlQ29uZGl0aW9ucygpIHsKKyAgICByZXR1cm4gcHJlQ29uZGl0aW9uczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFByZUNvbmRpdGlvbnMoTW9kZWxHcmFwaCBwcmVDb25kaXRpb25zKSB7CisgICAgaWYgKHRoaXMucHJlQ29uZGl0aW9ucyAhPSBudWxsKQorICAgICAgdGhpcy5wcmVDb25kaXRpb25zLnNldFBhcmVudChudWxsKTsKKyAgICBTdGFjazxNb2RlbEdyYXBoPiBzdGFjayA9IG5ldyBTdGFjazxNb2RlbEdyYXBoPigpOworICAgIHN0YWNrLmFkZChwcmVDb25kaXRpb25zKTsKKyAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIE1vZGVsR3JhcGggZ3JhcGggPSBzdGFjay5wb3AoKTsKKyAgICAgIGdyYXBoLmlzUHJlQ29uZGl0aW9uID0gdHJ1ZTsKKyAgICAgIHN0YWNrLmFkZEFsbChncmFwaC5nZXRDaGlsZHJlbigpKTsKKyAgICB9CisgICAgKHRoaXMucHJlQ29uZGl0aW9ucyA9IHByZUNvbmRpdGlvbnMpLnNldFBhcmVudCh0aGlzKTsKKyAgfQorCisgIHB1YmxpYyBNb2RlbEdyYXBoIGdldFBvc3RDb25kaXRpb25zKCkgeworICAgIHJldHVybiBwb3N0Q29uZGl0aW9uczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBvc3RDb25kaXRpb25zKE1vZGVsR3JhcGggcG9zdENvbmRpdGlvbnMpIHsKKyAgICBpZiAodGhpcy5wb3N0Q29uZGl0aW9ucyAhPSBudWxsKQorICAgICAgdGhpcy5wb3N0Q29uZGl0aW9ucy5zZXRQYXJlbnQobnVsbCk7CisgICAgU3RhY2s8TW9kZWxHcmFwaD4gc3RhY2sgPSBuZXcgU3RhY2s8TW9kZWxHcmFwaD4oKTsKKyAgICBzdGFjay5hZGQocG9zdENvbmRpdGlvbnMpOworICAgIHdoaWxlICghc3RhY2suZW1wdHkoKSkgeworICAgICAgTW9kZWxHcmFwaCBncmFwaCA9IHN0YWNrLnBvcCgpOworICAgICAgZ3JhcGguaXNQb3N0Q29uZGl0aW9uID0gdHJ1ZTsKKyAgICAgIHN0YWNrLmFkZEFsbChncmFwaC5nZXRDaGlsZHJlbigpKTsKKyAgICB9CisgICAgKHRoaXMucG9zdENvbmRpdGlvbnMgPSBwb3N0Q29uZGl0aW9ucykuc2V0UGFyZW50KHRoaXMpOworICB9CisKKyAgcHVibGljIE1vZGVsR3JhcGggcmVjdXJzaXZlRmluZChTdHJpbmcgaWQpIHsKKyAgICBTdGFjazxNb2RlbEdyYXBoPiBzdGFjayA9IG5ldyBTdGFjazxNb2RlbEdyYXBoPigpOworICAgIHN0YWNrLmFkZCh0aGlzKTsKKyAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIE1vZGVsR3JhcGggY3VyR3JhcGggPSBzdGFjay5wb3AoKTsKKyAgICAgIGlmIChjdXJHcmFwaC5nZXRJZCgpLmVxdWFscyhpZCkpCisgICAgICAgIHJldHVybiBjdXJHcmFwaDsKKyAgICAgIHN0YWNrLmFkZEFsbChjdXJHcmFwaC5nZXRDaGlsZHJlbigpKTsKKyAgICAgIGlmIChjdXJHcmFwaC5nZXRQcmVDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgICAgc3RhY2suYWRkKGN1ckdyYXBoLmdldFByZUNvbmRpdGlvbnMoKSk7CisgICAgICBpZiAoY3VyR3JhcGguZ2V0UG9zdENvbmRpdGlvbnMoKSAhPSBudWxsKQorICAgICAgICBzdGFjay5hZGQoY3VyR3JhcGguZ2V0UG9zdENvbmRpdGlvbnMoKSk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIE1vZGVsR3JhcGggcmVjdXJzaXZlRmluZEJ5TW9kZWxJZChTdHJpbmcgbW9kZWxJZCkgeworICAgIFN0YWNrPE1vZGVsR3JhcGg+IHN0YWNrID0gbmV3IFN0YWNrPE1vZGVsR3JhcGg+KCk7CisgICAgc3RhY2suYWRkKHRoaXMpOworICAgIHdoaWxlICghc3RhY2suZW1wdHkoKSkgeworICAgICAgTW9kZWxHcmFwaCBjdXJHcmFwaCA9IHN0YWNrLnBvcCgpOworICAgICAgaWYgKGN1ckdyYXBoLmdldE1vZGVsKCkuZ2V0TW9kZWxJZCgpLmVxdWFscyhtb2RlbElkKSkKKyAgICAgICAgcmV0dXJuIGN1ckdyYXBoOworICAgICAgc3RhY2suYWRkQWxsKGN1ckdyYXBoLmdldENoaWxkcmVuKCkpOworICAgICAgaWYgKGN1ckdyYXBoLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsKQorICAgICAgICBzdGFjay5hZGQoY3VyR3JhcGguZ2V0UHJlQ29uZGl0aW9ucygpKTsKKyAgICAgIGlmIChjdXJHcmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICAgIHN0YWNrLmFkZChjdXJHcmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgTGlzdDxNb2RlbEdyYXBoPiBnZXRMZWFmTm9kZXMoKSB7CisgICAgVmVjdG9yPE1vZGVsR3JhcGg+IGxlYWZOb2RlcyA9IG5ldyBWZWN0b3I8TW9kZWxHcmFwaD4oKTsKKyAgICBTdGFjazxNb2RlbEdyYXBoPiBzdGFjayA9IG5ldyBTdGFjazxNb2RlbEdyYXBoPigpOworICAgIHN0YWNrLmFkZCh0aGlzKTsKKyAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIE1vZGVsR3JhcGggY3VyR3JhcGggPSBzdGFjay5wb3AoKTsKKyAgICAgIGlmIChjdXJHcmFwaC5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAwKQorICAgICAgICBsZWFmTm9kZXMuYWRkKGN1ckdyYXBoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RhY2suYWRkQWxsKGN1ckdyYXBoLmdldENoaWxkcmVuKCkpOworICAgIH0KKyAgICByZXR1cm4gbGVhZk5vZGVzOworICB9CisKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRJZCgpLmhhc2hDb2RlKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbEdyYXBoKQorICAgICAgcmV0dXJuIHRoaXMuZ2V0SWQoKS5lcXVhbHMoKChNb2RlbEdyYXBoKSBvYmopLmdldElkKCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCk7CisgIH0KKworICBwdWJsaWMgTW9kZWxHcmFwaCBjbG9uZSgpIHsKKyAgICBNb2RlbE5vZGUgY2xvbmVOb2RlID0gdGhpcy5tb2RlbC5jbG9uZSgpOworICAgIE1vZGVsR3JhcGggY2xvbmUgPSBuZXcgTW9kZWxHcmFwaChjbG9uZU5vZGUpOworICAgIGZvciAoTW9kZWxHcmFwaCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pCisgICAgICBjbG9uZS5hZGRDaGlsZChjaGlsZC5jbG9uZSgpKTsKKyAgICBpZiAodGhpcy5wcmVDb25kaXRpb25zICE9IG51bGwpCisgICAgICBjbG9uZS5zZXRQcmVDb25kaXRpb25zKHRoaXMucHJlQ29uZGl0aW9ucy5jbG9uZSgpKTsKKyAgICBpZiAodGhpcy5wb3N0Q29uZGl0aW9ucyAhPSBudWxsKQorICAgICAgY2xvbmUuc2V0UG9zdENvbmRpdGlvbnModGhpcy5wb3N0Q29uZGl0aW9ucy5jbG9uZSgpKTsKKyAgICByZXR1cm4gY2xvbmU7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9tb2RlbC9Nb2RlbE5vZGUuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9tb2RlbC9Nb2RlbE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI4M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL21vZGVsL01vZGVsTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIAorICogCisgKiBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgV29ya2Zsb3cgTW9kZWwgZ3JhcGguCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbE5vZGUgeworCisgIHByaXZhdGUgU3RyaW5nIGlkOworICBwcml2YXRlIFN0cmluZyBhbGlhczsKKyAgcHJpdmF0ZSBib29sZWFuIGlzUmVmOworICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgcHJpdmF0ZSBib29sZWFuIHRleHRWaXNpYmxlOworICBwcml2YXRlIGJvb2xlYW4gZW50cnlQb2ludDsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uZmlnR3JvdXBzOworICBwcml2YXRlIFN0cmluZyBleGVjdXRpb25UeXBlOworICBwcml2YXRlIFN0cmluZyBtb2RlbElkOworICBwcml2YXRlIFN0cmluZyBtb2RlbE5hbWU7CisgIHByaXZhdGUgU3RyaW5nIGluc3RhbmNlQ2xhc3M7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHM7CisgIHByaXZhdGUgTWV0YWRhdGEgc3RhdGljTWV0YWRhdGE7CisgIHByaXZhdGUgbG9uZyB0aW1lb3V0OworICBwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWw7CisKKyAgcHVibGljIE1vZGVsTm9kZShGaWxlIGZpbGUpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgdGhpcy5pZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgdGhpcy5pc1JlZiA9IGZhbHNlOworICAgIHRoaXMuZXhlY3V0aW9uVHlwZSA9ICJ0YXNrIjsKKyAgICB0aGlzLnRleHRWaXNpYmxlID0gdHJ1ZTsKKyAgICB0aGlzLmVudHJ5UG9pbnQgPSBmYWxzZTsKKyAgICB0aGlzLmNvbmZpZ0dyb3VwcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIHRoaXMubW9kZWxJZCA9IG51bGw7CisgICAgdGhpcy5tb2RlbE5hbWUgPSBudWxsOworICAgIHRoaXMuaW5zdGFuY2VDbGFzcyA9IG51bGw7CisgICAgdGhpcy5leGN1c2VkU3ViUHJvY2Vzc29ySWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgdGhpcy5zdGF0aWNNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgIHRoaXMudGltZW91dCA9IC0xOworICAgIHRoaXMub3B0aW9uYWwgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBNb2RlbE5vZGUoRmlsZSBmaWxlLCBTdHJpbmcgbW9kZWxJZCkgeworICAgIHRoaXMoZmlsZSk7CisgICAgdGhpcy5zZXRNb2RlbElkKG1vZGVsSWQpOworICAgIHRoaXMuc2V0TW9kZWxOYW1lKG1vZGVsSWQpOworICB9CisKKyAgcHVibGljIE1vZGVsTm9kZShGaWxlIGZpbGUsIFN0cmluZyBtb2RlbElkLCBib29sZWFuIGlzUmVmKSB7CisgICAgdGhpcyhmaWxlLCBtb2RlbElkKTsKKyAgICB0aGlzLmlzUmVmID0gaXNSZWY7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgIHJldHVybiB0aGlzLmlkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIGFsaWFzKSB7CisgIAl0aGlzLmFsaWFzID0gYWxpYXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAJcmV0dXJuIGFsaWFzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0SXNSZWYoYm9vbGVhbiBpc1JlZikgeworICAgIHRoaXMuaXNSZWYgPSBpc1JlZjsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUmVmKCkgeworICAgIHJldHVybiB0aGlzLmlzUmVmOworICB9CisKKyAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICByZXR1cm4gdGhpcy5maWxlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RXh0ZW5kc0NvbmZpZyhMaXN0PFN0cmluZz4gY29uZmlnR3JvdXBzKSB7CisgICAgdGhpcy5jb25maWdHcm91cHMuY2xlYXIoKTsKKyAgICB0aGlzLmNvbmZpZ0dyb3Vwcy5hZGRBbGwoY29uZmlnR3JvdXBzKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RXh0ZW5kc0NvbmZpZygpIHsKKyAgICByZXR1cm4gdGhpcy5jb25maWdHcm91cHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRUZXh0VmlzaWJsZShib29sZWFuIHRleHRWaXNpYmxlKSB7CisgICAgdGhpcy50ZXh0VmlzaWJsZSA9IHRleHRWaXNpYmxlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RW50cnlQb2ludChib29sZWFuIGVudHJ5UG9pbnQpIHsKKyAgICB0aGlzLmVudHJ5UG9pbnQgPSBlbnRyeVBvaW50OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNFbnRyeVBvaW50KCkgeworICAgIHJldHVybiB0aGlzLmVudHJ5UG9pbnQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1BhcmVudFR5cGUoKSB7CisgICAgcmV0dXJuICEodGhpcy5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJ0YXNrIikgfHwgdGhpcy5nZXRFeGVjdXRpb25UeXBlKCkKKyAgICAgICAgLmVxdWFscygiY29uZGl0aW9uIikpOworICB9CisKKyAgcHVibGljIENvbG9yIGdldENvbG9yKCkgeworICAgIGlmICh0aGlzLmlzUGFyZW50VHlwZSgpKSB7CisgICAgICBpZiAodGhpcy5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJzZXF1ZW50aWFsIikpCisgICAgICAgIHJldHVybiBuZXcgQ29sb3IoMTAwLCAxNDksIDIzNyk7CisgICAgICBlbHNlIGlmICh0aGlzLmdldEV4ZWN1dGlvblR5cGUoKS5lcXVhbHMoInBhcmFsbGVsIikpCisgICAgICAgIHJldHVybiBuZXcgQ29sb3IoMTQzLCAxODgsIDE0Myk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBDb2xvci5kYXJrR3JheTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHRoaXMuZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygidGFzayIpKQorICAgICAgICByZXR1cm4gQ29sb3Iub3JhbmdlOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ29sb3IuY3lhbjsKKyAgICB9CisgIH0KKworICBwdWJsaWMgQ29sb3IgZ2V0R3JhZGllbnRDb2xvcigpIHsKKyAgICBpZiAodGhpcy5pc1BhcmVudFR5cGUoKSkgeworICAgICAgaWYgKHRoaXMuZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygic2VxdWVudGlhbCIpKQorICAgICAgICByZXR1cm4gbmV3IENvbG9yKDIwMCwgMjAwLCAyMDApOworICAgICAgZWxzZSBpZiAodGhpcy5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJwYXJhbGxlbCIpKQorICAgICAgICByZXR1cm4gbmV3IENvbG9yKDIwMCwgMjAwLCAyMDApOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ29sb3Iud2hpdGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDb2xvci5kYXJrR3JheTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWQoKSB7CisgICAgcmV0dXJuIG1vZGVsSWQ7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsTmFtZSgpIHsKKyAgICBpZiAobW9kZWxOYW1lID09IG51bGwpIHsKKyAgICAgIHJldHVybiBtb2RlbElkOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbW9kZWxOYW1lOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0aW9uVHlwZSgpIHsKKyAgICByZXR1cm4gZXhlY3V0aW9uVHlwZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VDbGFzcygpIHsKKyAgICByZXR1cm4gaW5zdGFuY2VDbGFzczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RXhjdXNlZFN1YlByb2Nlc3NvcklkcygpIHsKKyAgICBpZiAodGhpcy5leGN1c2VkU3ViUHJvY2Vzc29ySWRzID09IG51bGwpCisgICAgICB0aGlzLmV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICByZXR1cm4gdGhpcy5leGN1c2VkU3ViUHJvY2Vzc29ySWRzOworICB9CisKKyAgcHVibGljIE1ldGFkYXRhIGdldFN0YXRpY01ldGFkYXRhKCkgeworICAgIHJldHVybiBzdGF0aWNNZXRhZGF0YSAhPSBudWxsID8gdGhpcy5zdGF0aWNNZXRhZGF0YQorICAgICAgICA6ICh0aGlzLnN0YXRpY01ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCkpOworICB9CisKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRJZCgpLmhhc2hDb2RlKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbE5vZGUpCisgICAgICByZXR1cm4gdGhpcy5nZXRJZCgpLmVxdWFscygoKE1vZGVsTm9kZSkgb2JqKS5nZXRJZCgpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIGlmICh0aGlzLnRleHRWaXNpYmxlKSB7CisgICAgICBpZiAodGhpcy5pc1BhcmVudFR5cGUoKSkKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TW9kZWxOYW1lKCkgKyAiIDogIiArIHRoaXMuZ2V0RXhlY3V0aW9uVHlwZSgpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gdGhpcy5nZXRNb2RlbE5hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIE1vZGVsTm9kZSBjbG9uZSgpIHsKKyAgICBNb2RlbE5vZGUgY2xvbmUgPSBuZXcgTW9kZWxOb2RlKHRoaXMuZmlsZSk7CisgICAgY2xvbmUuaWQgPSB0aGlzLmlkOworICAgIGlmICh0aGlzLmV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMgIT0gbnVsbCkKKyAgICAgIGNsb25lLmV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oCisgICAgICAgICAgdGhpcy5leGN1c2VkU3ViUHJvY2Vzc29ySWRzKTsKKyAgICBjbG9uZS5leGVjdXRpb25UeXBlID0gdGhpcy5leGVjdXRpb25UeXBlOworICAgIGNsb25lLmluc3RhbmNlQ2xhc3MgPSB0aGlzLmluc3RhbmNlQ2xhc3M7CisgICAgY2xvbmUubW9kZWxJZCA9IHRoaXMubW9kZWxJZDsKKyAgICBjbG9uZS5tb2RlbE5hbWUgPSB0aGlzLm1vZGVsTmFtZTsKKyAgICBjbG9uZS5zdGF0aWNNZXRhZGF0YSA9IG51bGw7CisgICAgY2xvbmUudGV4dFZpc2libGUgPSB0aGlzLnRleHRWaXNpYmxlOworICAgIGlmICh0aGlzLnN0YXRpY01ldGFkYXRhICE9IG51bGwpCisgICAgICBjbG9uZS5zdGF0aWNNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSh0aGlzLnN0YXRpY01ldGFkYXRhKTsKKyAgICByZXR1cm4gY2xvbmU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG1vZGVsSWQKKyAgICogICAgICAgICAgdGhlIG1vZGVsSWQgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNb2RlbElkKFN0cmluZyBtb2RlbElkKSB7CisgICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbW9kZWxOYW1lCisgICAqICAgICAgICAgIHRoZSBtb2RlbE5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNb2RlbE5hbWUoU3RyaW5nIG1vZGVsTmFtZSkgeworICAgIHRoaXMubW9kZWxOYW1lID0gbW9kZWxOYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBpbnN0YW5jZUNsYXNzCisgICAqICAgICAgICAgIHRoZSBpbnN0YW5jZUNsYXNzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VDbGFzcyhTdHJpbmcgaW5zdGFuY2VDbGFzcykgeworICAgIHRoaXMuaW5zdGFuY2VDbGFzcyA9IGluc3RhbmNlQ2xhc3M7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMKKyAgICogICAgICAgICAgdGhlIGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKExpc3Q8U3RyaW5nPiBleGN1c2VkU3ViUHJvY2Vzc29ySWRzKSB7CisgICAgdGhpcy5leGN1c2VkU3ViUHJvY2Vzc29ySWRzID0gZXhjdXNlZFN1YlByb2Nlc3NvcklkczsKKyAgfQorCisKKworICAvKioKKyAgICogQHJldHVybiB0aGUgY29uZmlnR3JvdXBzCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbmZpZ0dyb3VwcygpIHsKKyAgICByZXR1cm4gY29uZmlnR3JvdXBzOworICB9CisKKworCisgIC8qKgorICAgKiBAcGFyYW0gY29uZmlnR3JvdXBzIHRoZSBjb25maWdHcm91cHMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25maWdHcm91cHMoTGlzdDxTdHJpbmc+IGNvbmZpZ0dyb3VwcykgeworICAgIHRoaXMuY29uZmlnR3JvdXBzID0gY29uZmlnR3JvdXBzOworICB9CisKKworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0ZXh0VmlzaWJsZQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNUZXh0VmlzaWJsZSgpIHsKKyAgICByZXR1cm4gdGV4dFZpc2libGU7CisgIH0KKworCisKKyAgLyoqCisgICAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICB0aGlzLmlkID0gaWQ7CisgIH0KKworCisKKyAgLyoqCisgICAqIEBwYXJhbSBpc1JlZiB0aGUgaXNSZWYgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSZWYoYm9vbGVhbiBpc1JlZikgeworICAgIHRoaXMuaXNSZWYgPSBpc1JlZjsKKyAgfQorCisKKworICAvKioKKyAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgIH0KKworCisKKyAgLyoqCisgICAqIEBwYXJhbSBleGVjdXRpb25UeXBlIHRoZSBleGVjdXRpb25UeXBlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uVHlwZShTdHJpbmcgZXhlY3V0aW9uVHlwZSkgeworICAgIHRoaXMuZXhlY3V0aW9uVHlwZSA9IGV4ZWN1dGlvblR5cGU7CisgIH0KKworCisKKyAgLyoqCisgICAqIEBwYXJhbSBzdGF0aWNNZXRhZGF0YSB0aGUgc3RhdGljTWV0YWRhdGEgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTdGF0aWNNZXRhZGF0YShNZXRhZGF0YSBzdGF0aWNNZXRhZGF0YSkgeworICAgIHRoaXMuc3RhdGljTWV0YWRhdGEgPSBzdGF0aWNNZXRhZGF0YTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0aW1lb3V0CisgICAqLworICBwdWJsaWMgbG9uZyBnZXRUaW1lb3V0KCkgeworICAgIHJldHVybiB0aW1lb3V0OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG9wdGlvbmFsCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworICAgIHJldHVybiBvcHRpb25hbDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gb3B0aW9uYWwgdGhlIG9wdGlvbmFsIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiBvcHRpb25hbCkgeworICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbW9kZWwvcmVwby9YbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL21vZGVsL3JlcG8vWG1sV29ya2Zsb3dNb2RlbFJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY3ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL21vZGVsL3JlcG8vWG1sV29ya2Zsb3dNb2RlbFJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDU5NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLnJlcG87CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tb2RlbC5Nb2RlbEdyYXBoOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLk1vZGVsTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIAorICogTW9kZWwgUmVwb3NpdG9yeSB3aGljaCBzdG9yZXMgbW9kZWxzIGluIHhtbCBmaWxlcworICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgWG1sV29ya2Zsb3dNb2RlbFJlcG9zaXRvcnkgeworCisgIHByaXZhdGUgRmlsZSB3b3Jrc3BhY2U7CisgIHByaXZhdGUgTGlzdDxGaWxlPiBmaWxlczsKKyAgcHJpdmF0ZSBTZXQ8TW9kZWxHcmFwaD4gZ3JhcGhzOworICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbmZpZ0dyb3VwPiBnbG9iYWxDb25maWdHcm91cHM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoWG1sV29ya2Zsb3dNb2RlbFJlcG9zaXRvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgWG1sV29ya2Zsb3dNb2RlbFJlcG9zaXRvcnkoRmlsZSB3b3Jrc3BhY2UpIHsKKyAgICB0aGlzLmZpbGVzID0gbmV3IFZlY3RvcjxGaWxlPigpOworICAgIGZvciAoRmlsZSBmaWxlIDogKHRoaXMud29ya3NwYWNlID0gd29ya3NwYWNlKS5saXN0RmlsZXMoKSkKKyAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICB0aGlzLmZpbGVzLmFkZChmaWxlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGxvYWRHcmFwaHMoU2V0PFN0cmluZz4gc3VwcG9ydGVkUHJvY2Vzc29ySWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0aGlzLmdyYXBocyA9IG5ldyBIYXNoU2V0PE1vZGVsR3JhcGg+KCk7CisgICAgSGFzaE1hcDxTdHJpbmcsIENvbmZpZ0dyb3VwPiBnbG9iYWxDb25mR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb25maWdHcm91cD4oKTsKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICBMaXN0PEZpbGVCYXNlZEVsZW1lbnQ+IHJvb3RFbGVtZW50cyA9IG5ldyBWZWN0b3I8RmlsZUJhc2VkRWxlbWVudD4oKTsKKyAgICBmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmc6ICIgKyBmaWxlKTsKKyAgICAgIHJvb3RFbGVtZW50cy5hZGQobmV3IEZpbGVCYXNlZEVsZW1lbnQoZmlsZSwgcGFyc2VyLnBhcnNlKGZpbGUpCisgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpKSk7CisgICAgfQorICAgIGZvciAoRmlsZUJhc2VkRWxlbWVudCByb290IDogcm9vdEVsZW1lbnRzKSB7CisgICAgICBsb2FkQ29uZmlndXJhdGlvbihyb290RWxlbWVudHMsIHJvb3QsIG51bGwsIGdsb2JhbENvbmZHcm91cHMpOworICAgICAgTm9kZUxpc3Qgcm9vdENoaWxkcmVuID0gcm9vdC5nZXRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb290Q2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKyAgICAgICAgaWYgKHJvb3RDaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUKKyAgICAgICAgICAgICYmICFyb290Q2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscygiY29uZmlndXJhdGlvbiIpCisgICAgICAgICAgICAmJiAhcm9vdENoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImV2ZW50IikpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGUgbmFtZTogWyIKKyAgICAgICAgICAgICAgKyByb290Q2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpICsgIl0iKTsKKyAgICAgICAgICBNb2RlbEdyYXBoIGdyYXBoID0gdGhpcy5sb2FkR3JhcGgocm9vdEVsZW1lbnRzLCBuZXcgRmlsZUJhc2VkRWxlbWVudCgKKyAgICAgICAgICAgICAgcm9vdC5nZXRGaWxlKCksIChFbGVtZW50KSByb290Q2hpbGRyZW4uaXRlbShpKSksIG5ldyBNZXRhZGF0YSgpLAorICAgICAgICAgICAgICBnbG9iYWxDb25mR3JvdXBzLCBzdXBwb3J0ZWRQcm9jZXNzb3JJZHMpOworICAgICAgICAgIHRoaXMuZ3JhcGhzLmFkZChncmFwaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5zdXJlVW5pcXVlSWRzKGdyYXBocyk7CisgICAgdGhpcy5nbG9iYWxDb25maWdHcm91cHMgPSBnbG9iYWxDb25mR3JvdXBzOworICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdsb2JhbENvbmZpZ0dyb3Vwcy5rZXlTZXQoKSk7CisgIH0KKworICBwdWJsaWMgU2V0PE1vZGVsR3JhcGg+IGdldEdyYXBocygpIHsKKyAgICByZXR1cm4gdGhpcy5ncmFwaHM7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgQ29uZmlnR3JvdXA+IGdldEdsb2JhbENvbmZpZ0dyb3VwcygpIHsKKyAgICByZXR1cm4gdGhpcy5nbG9iYWxDb25maWdHcm91cHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRHbG9iYWxDb25maWdHcm91cHMoTWFwPFN0cmluZywgQ29uZmlnR3JvdXA+IGdsb2JhbENvbmZpZ0dyb3VwcykgeworICAgIHRoaXMuZ2xvYmFsQ29uZmlnR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb25maWdHcm91cD4oCisgICAgICAgIGdsb2JhbENvbmZpZ0dyb3Vwcyk7CisgIH0KKworICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRGaWxlcygpIHsKKyAgICByZXR1cm4gdGhpcy5maWxlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0aGlzLmJhY2t1cEN1cnJlbnRGaWxlcygpOworICAgIHRoaXMuc2F2ZUdyYXBocygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGJhY2t1cEN1cnJlbnRGaWxlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpbGUgYmFja3VwRGlyID0gbmV3IEZpbGUodGhpcy53b3Jrc3BhY2UsICIuYmFja3VwIik7CisgICAgZm9yIChGaWxlIGZpbGUgOiB0aGlzLmZpbGVzKSB7CisgICAgICBGaWxlVXRpbHMuY29weUZpbGUoZmlsZSwgbmV3IEZpbGUoYmFja3VwRGlyLCBmaWxlLmdldE5hbWUoKSkpOworICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICB9CisgICAgdGhpcy5maWxlcy5jbGVhcigpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNhdmVHcmFwaHMoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgTWFwPEZpbGUsIERvY3VtZW50PiBkb2N1bWVudHMgPSBuZXcgSGFzaE1hcDxGaWxlLCBEb2N1bWVudD4oKTsKKyAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiB0aGlzLmdyYXBocykgeworICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudHMuZ2V0KGdyYXBoLmdldE1vZGVsKCkuZ2V0RmlsZSgpKTsKKyAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKSB7CisgICAgICAgIGRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKKyAgICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgid29ya2Zsb3dzIikpOworICAgICAgICBkb2N1bWVudHMucHV0KGdyYXBoLmdldE1vZGVsKCkuZ2V0RmlsZSgpLCBkb2N1bWVudCk7CisgICAgICB9CisgICAgICBzYXZlR3JhcGgoZ3JhcGgsIGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLCBkb2N1bWVudCk7CisgICAgfQorICAgIHNhdmVHbG9iYWxDb25maWdHcm91cHMoZG9jdW1lbnRzKTsKKyAgICB3cml0ZU91dERvY3VtZW50cyhkb2N1bWVudHMpOworICAgIHRoaXMuZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KGRvY3VtZW50cy5rZXlTZXQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPdXREb2N1bWVudHMoTWFwPEZpbGUsIERvY3VtZW50PiBkb2N1bWVudHMpIHsKKyAgICBmb3IgKEZpbGUgZmlsZSA6IGRvY3VtZW50cy5rZXlTZXQoKSkgeworICAgICAgWE1MVXRpbHMud3JpdGVYbWxGaWxlKGRvY3VtZW50cy5nZXQoZmlsZSksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzYXZlR2xvYmFsQ29uZmlnR3JvdXBzKE1hcDxGaWxlLCBEb2N1bWVudD4gZG9jdW1lbnRzKQorICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgIEZpbGUgZ2xvYmFsQ29uZmlnR3JvdXBzRmlsZSA9IG5ldyBGaWxlKHdvcmtzcGFjZSwKKyAgICAgICAgInNoYXJlZC1jb25maWd1cmF0aW9uLnhtbCIpOworICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzLmdldChnbG9iYWxDb25maWdHcm91cHNGaWxlKTsKKyAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkgeworICAgICAgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCgpOworICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgid29ya2Zsb3dzIikpOworICAgICAgZG9jdW1lbnRzLnB1dChnbG9iYWxDb25maWdHcm91cHNGaWxlLCBkb2N1bWVudCk7CisgICAgfQorICAgIGZvciAoU3RyaW5nIGNvbmZpZ05hbWUgOiB0aGlzLmdsb2JhbENvbmZpZ0dyb3Vwcy5rZXlTZXQoKSkgeworICAgICAgQ29uZmlnR3JvdXAgZ2xvYmFsQ29uZmlnID0gdGhpcy5nbG9iYWxDb25maWdHcm91cHMuZ2V0KGNvbmZpZ05hbWUpOworICAgICAgRWxlbWVudCBjb25maWdFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29uZmlndXJhdGlvbiIpOworICAgICAgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoY29uZmlnRWxlbSk7CisgICAgICBjb25maWdFbGVtLnNldEF0dHJpYnV0ZSgibmFtZSIsIGdsb2JhbENvbmZpZy5nZXROYW1lKCkpOworICAgICAgaWYgKCFnbG9iYWxDb25maWcuZ2V0RXh0ZW5kcygpLmlzRW1wdHkoKSkgeworICAgICAgICBjb25maWdFbGVtLnNldEF0dHJpYnV0ZSgiZXh0ZW5kcyIsCisgICAgICAgICAgICBTdHJpbmdVdGlscy5qb2luKGdsb2JhbENvbmZpZy5nZXRFeHRlbmRzKCksICIsICIpKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IGdsb2JhbENvbmZpZy5nZXRNZXRhZGF0YSgpLmdldEFsbEtleXMoKQorICAgICAgICAgIC50b0FycmF5KG5ldyBTdHJpbmdbZ2xvYmFsQ29uZmlnLmdldE1ldGFkYXRhKCkuZ2V0QWxsS2V5cygpLnNpemUoKV0pOworICAgICAgQXJyYXlzLnNvcnQocHJvcGVydGllcyk7CisgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKyAgICAgICAgRWxlbWVudCBwcm9wRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByb3BlcnR5Iik7CisgICAgICAgIGNvbmZpZ0VsZW0uYXBwZW5kQ2hpbGQocHJvcEVsZW0pOworICAgICAgICBwcm9wRWxlbS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBwcm9wZXJ0eSk7CisgICAgICAgIHByb3BFbGVtLnNldEF0dHJpYnV0ZSgidmFsdWUiLAorICAgICAgICAgICAgZ2xvYmFsQ29uZmlnLmdldE1ldGFkYXRhKCkuZ2V0TWV0YWRhdGEocHJvcGVydHkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2F2ZUdyYXBoKE1vZGVsR3JhcGggZ3JhcGgsIEVsZW1lbnQgcGFyZW50RWxlbSwgRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICBNb2RlbE5vZGUgbm9kZSA9IGdyYXBoLmdldE1vZGVsKCk7CisKKyAgICBFbGVtZW50IHdvcmtmbG93RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZS5nZXRFeGVjdXRpb25UeXBlKCkpOworICAgIHBhcmVudEVsZW0uYXBwZW5kQ2hpbGQod29ya2Zsb3dFbGVtKTsKKworICAgIGlmIChub2RlLmlzUmVmKCkpIHsKKyAgICAgIHdvcmtmbG93RWxlbS5zZXRBdHRyaWJ1dGUoImlkLXJlZiIsIG5vZGUuZ2V0TW9kZWxJZCgpKTsKKyAgICAgIGlmIChub2RlLmdldEFsaWFzKCkgIT0gbnVsbCkgeworICAgICAgICB3b3JrZmxvd0VsZW0uc2V0QXR0cmlidXRlKCJhbGlhcyIsIG5vZGUuZ2V0QWxpYXMoKSk7CisgICAgICB9CisgICAgICBzYXZlQ29uZmlndXJhdGlvbihub2RlLCB3b3JrZmxvd0VsZW0sIGRvY3VtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgd29ya2Zsb3dFbGVtLnNldEF0dHJpYnV0ZSgiaWQiLCBub2RlLmdldE1vZGVsSWQoKSk7CisgICAgICB3b3JrZmxvd0VsZW0uc2V0QXR0cmlidXRlKCJuYW1lIiwgbm9kZS5nZXRNb2RlbE5hbWUoKSk7CisgICAgICBpZiAobm9kZS5nZXRJbnN0YW5jZUNsYXNzKCkgIT0gbnVsbCkgeworICAgICAgICB3b3JrZmxvd0VsZW0uc2V0QXR0cmlidXRlKCJjbGFzcyIsIG5vZGUuZ2V0SW5zdGFuY2VDbGFzcygpKTsKKyAgICAgIH0KKworICAgICAgc2F2ZUNvbmZpZ3VyYXRpb24obm9kZSwgd29ya2Zsb3dFbGVtLCBkb2N1bWVudCk7CisKKyAgICAgIC8vIGhhbmRsZSBwcmVjb25kaXRpb25zCisgICAgICBpZiAoZ3JhcGguZ2V0UHJlQ29uZGl0aW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgRWxlbWVudCBwcmVDb25kaXRpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29uZGl0aW9ucyIpOworICAgICAgICB3b3JrZmxvd0VsZW0uYXBwZW5kQ2hpbGQocHJlQ29uZGl0aW9ucyk7CisgICAgICAgIHByZUNvbmRpdGlvbnMuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInByZSIpOworICAgICAgICBwcmVDb25kaXRpb25zLnNldEF0dHJpYnV0ZSgiZXhlY3V0aW9uIiwgZ3JhcGguZ2V0UHJlQ29uZGl0aW9ucygpCisgICAgICAgICAgICAuZ2V0TW9kZWwoKS5nZXRFeGVjdXRpb25UeXBlKCkpOworICAgICAgICBwcmVDb25kaXRpb25zLnNldEF0dHJpYnV0ZSgidGltZW91dCIsIFN0cmluZy52YWx1ZU9mKGdyYXBoLmdldE1vZGVsKCkuZ2V0VGltZW91dCgpKSk7CisgICAgICAgIHByZUNvbmRpdGlvbnMuc2V0QXR0cmlidXRlKCJvcHRpb25hbCIsIFN0cmluZy52YWx1ZU9mKGdyYXBoLmdldE1vZGVsKCkuaXNPcHRpb25hbCgpKSk7CisgICAgICAgIGZvciAoTW9kZWxHcmFwaCBwcmVDb25kaXRpb24gOiBncmFwaC5nZXRQcmVDb25kaXRpb25zKCkuZ2V0Q2hpbGRyZW4oKSkgeworICAgICAgICAgIHNhdmVHcmFwaChwcmVDb25kaXRpb24sIHByZUNvbmRpdGlvbnMsIGRvY3VtZW50KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBoYW5kbGUgc3VicHJvY2Vzc29ycworICAgICAgZm9yIChNb2RlbEdyYXBoIHN1YlByb2Nlc3NvciA6IGdyYXBoLmdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgc2F2ZUdyYXBoKHN1YlByb2Nlc3Nvciwgd29ya2Zsb3dFbGVtLCBkb2N1bWVudCk7CisgICAgICB9CisKKyAgICAgIC8vIGhhbmRsZSBwb3N0Y29uZGl0aW9ucworICAgICAgaWYgKGdyYXBoLmdldFBvc3RDb25kaXRpb25zKCkgIT0gbnVsbCkgeworICAgICAgICBFbGVtZW50IHBvc3RDb25kaXRpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29uZGl0aW9ucyIpOworICAgICAgICB3b3JrZmxvd0VsZW0uYXBwZW5kQ2hpbGQocG9zdENvbmRpdGlvbnMpOworICAgICAgICBwb3N0Q29uZGl0aW9ucy5zZXRBdHRyaWJ1dGUoInR5cGUiLCAicG9zdCIpOworICAgICAgICBwb3N0Q29uZGl0aW9ucy5zZXRBdHRyaWJ1dGUoImV4ZWN1dGlvbiIsIGdyYXBoLmdldFBvc3RDb25kaXRpb25zKCkKKyAgICAgICAgICAgIC5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKSk7CisgICAgICAgIHBvc3RDb25kaXRpb25zLnNldEF0dHJpYnV0ZSgidGltZW91dCIsIFN0cmluZy52YWx1ZU9mKGdyYXBoLmdldE1vZGVsKCkuZ2V0VGltZW91dCgpKSk7CisgICAgICAgIHBvc3RDb25kaXRpb25zLnNldEF0dHJpYnV0ZSgib3B0aW9uYWwiLCBTdHJpbmcudmFsdWVPZihncmFwaC5nZXRNb2RlbCgpLmlzT3B0aW9uYWwoKSkpOworICAgICAgICBmb3IgKE1vZGVsR3JhcGggcG9zdENvbmRpdGlvbiA6IGdyYXBoLmdldFBvc3RDb25kaXRpb25zKCkuZ2V0Q2hpbGRyZW4oKSkgeworICAgICAgICAgIHNhdmVHcmFwaChwb3N0Q29uZGl0aW9uLCBwb3N0Q29uZGl0aW9ucywgZG9jdW1lbnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghbm9kZS5nZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkuaXNFbXB0eSgpKSB7CisgICAgICB3b3JrZmxvd0VsZW0uc2V0QXR0cmlidXRlKCJleGN1c2VkIiwKKyAgICAgICAgICBTdHJpbmdVdGlscy5qb2luKG5vZGUuZ2V0RXhjdXNlZFN1YlByb2Nlc3NvcklkcygpLCAiLCIpKTsKKyAgICB9CisgICAgaWYgKG5vZGUuaXNFbnRyeVBvaW50KCkpIHsKKyAgICAgIHdvcmtmbG93RWxlbS5zZXRBdHRyaWJ1dGUoImVudHJ5UG9pbnQiLCAidHJ1ZSIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzYXZlQ29uZmlndXJhdGlvbihNb2RlbE5vZGUgbm9kZSwgRWxlbWVudCB3b3JrZmxvd0VsZW0sCisgICAgICBEb2N1bWVudCBkb2N1bWVudCkgeworICAgIGlmICghbm9kZS5nZXRTdGF0aWNNZXRhZGF0YSgpLmdldEFsbEtleXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgIEVsZW1lbnQgY29uZmlnRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNvbmZpZ3VyYXRpb24iKTsKKyAgICAgIHdvcmtmbG93RWxlbS5hcHBlbmRDaGlsZChjb25maWdFbGVtKTsKKyAgICAgIGlmICghbm9kZS5nZXRFeHRlbmRzQ29uZmlnKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGNvbmZpZ0VsZW0uc2V0QXR0cmlidXRlKCJleHRlbmRzIiwKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLmpvaW4obm9kZS5nZXRFeHRlbmRzQ29uZmlnKCksICIsICIpKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXMgPSBub2RlLmdldFN0YXRpY01ldGFkYXRhKCkuZ2V0QWxsS2V5cygpCisgICAgICAgICAgLnRvQXJyYXkobmV3IFN0cmluZ1tub2RlLmdldFN0YXRpY01ldGFkYXRhKCkuZ2V0QWxsS2V5cygpLnNpemUoKV0pOworICAgICAgQXJyYXlzLnNvcnQocHJvcGVydGllcyk7CisgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKyAgICAgICAgRWxlbWVudCBwcm9wRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByb3BlcnR5Iik7CisgICAgICAgIGNvbmZpZ0VsZW0uYXBwZW5kQ2hpbGQocHJvcEVsZW0pOworICAgICAgICBwcm9wRWxlbS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBwcm9wZXJ0eSk7CisgICAgICAgIHByb3BFbGVtLnNldEF0dHJpYnV0ZSgidmFsdWUiLAorICAgICAgICAgICAgbm9kZS5nZXRTdGF0aWNNZXRhZGF0YSgpLmdldE1ldGFkYXRhKHByb3BlcnR5KSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICByZXR1cm4gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGVuc3VyZVVuaXF1ZUlkcyhTZXQ8TW9kZWxHcmFwaD4gZ3JhcGhzKSB7CisgICAgZm9yIChNb2RlbEdyYXBoIGdyYXBoIDogZ3JhcGhzKSB7CisgICAgICBIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICBWZWN0b3I8TW9kZWxHcmFwaD4gc3RhY2sgPSBuZXcgVmVjdG9yPE1vZGVsR3JhcGg+KCk7CisgICAgICBzdGFjay5hZGQoZ3JhcGgpOworICAgICAgd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgTW9kZWxHcmFwaCBjdXJyZW50R3JhcGggPSBzdGFjay5yZW1vdmUoMCk7CisgICAgICAgIFN0cmluZyBjdXJyZW50SWQgPSBjdXJyZW50R3JhcGguZ2V0SWQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IG5hbWVzLmNvbnRhaW5zKGN1cnJlbnRJZCk7IGkrKykKKyAgICAgICAgICBjdXJyZW50SWQgPSBjdXJyZW50R3JhcGguZ2V0SWQoKSArICItIiArIGk7CisgICAgICAgIG5hbWVzLmFkZChjdXJyZW50SWQpOworICAgICAgICBpZiAoIWN1cnJlbnRJZC5lcXVhbHMoY3VycmVudEdyYXBoLmdldElkKCkpKQorICAgICAgICAgIGN1cnJlbnRHcmFwaC5nZXRNb2RlbCgpLnNldE1vZGVsSWQoY3VycmVudElkKTsKKyAgICAgICAgc3RhY2suYWRkQWxsKGN1cnJlbnRHcmFwaC5nZXRDaGlsZHJlbigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIE1vZGVsR3JhcGggbG9hZEdyYXBoKExpc3Q8RmlsZUJhc2VkRWxlbWVudD4gcm9vdEVsZW1lbnRzLAorICAgICAgRmlsZUJhc2VkRWxlbWVudCB3b3JrZmxvd05vZGUsIE1ldGFkYXRhIHN0YXRpY01ldGFkYXRhLAorICAgICAgSGFzaE1hcDxTdHJpbmcsIENvbmZpZ0dyb3VwPiBnbG9iYWxDb25mR3JvdXBzLAorICAgICAgU2V0PFN0cmluZz4gc3VwcG9ydGVkUHJvY2Vzc29ySWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIFN0cmluZyBtb2RlbElkUmVmID0gbnVsbDsKKyAgICBTdHJpbmcgbW9kZWxJZCA9IG51bGw7CisgICAgU3RyaW5nIG1vZGVsTmFtZSA9IG51bGw7CisgICAgU3RyaW5nIGFsaWFzID0gbnVsbDsKKyAgICBTdHJpbmcgZXhlY3V0aW9uVHlwZSA9IG51bGw7CisgICAgTGlzdDxTdHJpbmc+IGV4Y3VzZWQgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICBTdHJpbmcgY2xhenogPSBudWxsOworICAgIGxvbmcgdGltZW91dCA9IC0xOworICAgIGJvb2xlYW4gb3B0aW9uYWwgPSBmYWxzZTsKKyAgICBib29sZWFuIGVudHJ5UG9pbnQgPSBmYWxzZTsKKworICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gd29ya2Zsb3dOb2RlLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICBOb2RlIG5vZGUgPSB3b3JrZmxvd05vZGUuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZXMoKS5pdGVtKGkpOworICAgICAgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImlkIikpIHsKKyAgICAgICAgbW9kZWxJZCA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIm5hbWUiKSkgeworICAgICAgICBtb2RlbE5hbWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOworICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJjbGFzcyIpKSB7CisgICAgICAgIGNsYXp6ID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygiaWQtcmVmIikpIHsKKyAgICAgICAgbW9kZWxJZFJlZiA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImV4Y3VzZWQiKSkgeworICAgICAgICBleGN1c2VkLmFkZEFsbChBcnJheXMuYXNMaXN0KG5vZGUuZ2V0Tm9kZVZhbHVlKCkuc3BsaXQoIiwiKSkpOworICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJlbnRyeVBvaW50IikpIHsKKyAgICAgICAgZW50cnlQb2ludCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJhbGlhcyIpKSB7CisgICAgICAgIGFsaWFzID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygiZXhlY3V0aW9uIikpIHsKKyAgICAgICAgZXhlY3V0aW9uVHlwZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInRpbWVvdXQiKSkgeworICAgICAgICB0aW1lb3V0ID0gbm9kZS5nZXROb2RlVmFsdWUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiAhbm9kZS5nZXROb2RlVmFsdWUoKS5lcXVhbHMoIiIpID8gTG9uZy52YWx1ZU9mKG5vZGUKKyAgICAgICAgICAgIC5nZXROb2RlVmFsdWUoKSkgOiAtMTsKKyAgICAgIH0gCisgICAgICBlbHNlIGlmKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIm9wdGlvbmFsIikpeworICAgICAgICBvcHRpb25hbCA9IEJvb2xlYW4udmFsdWVPZihub2RlLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoInA6IikpIHsKKyAgICAgICAgc3RhdGljTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKG5vZGUuZ2V0Tm9kZU5hbWUoKS5zdWJzdHJpbmcoMiksCisgICAgICAgICAgICBub2RlLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kZWxJZCA9PSBudWxsICYmIG1vZGVsSWRSZWYgPT0gbnVsbCkKKyAgICAgIG1vZGVsSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCisgICAgTW9kZWxHcmFwaCBncmFwaCA9IG51bGw7CisgICAgaWYgKG1vZGVsSWQgIT0gbnVsbCkgeworCisgICAgICBpZiAod29ya2Zsb3dOb2RlLmdldEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpLmVxdWFscygid29ya2Zsb3ciKQorICAgICAgICAgIHx8IHdvcmtmbG93Tm9kZS5nZXRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImNvbmRpdGlvbnMiKQorICAgICAgICAgIHx8IHdvcmtmbG93Tm9kZS5nZXRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInRhc2tzIikpIHsKKyAgICAgICAgaWYgKGV4ZWN1dGlvblR5cGUgPT0gbnVsbCkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIndvcmtmbG93IG1vZGVsICciCisgICAgICAgICAgICAgICsgd29ya2Zsb3dOb2RlLmdldEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpCisgICAgICAgICAgICAgICsgIicgbWlzc2luZyBleGVjdXRpb24gdHlwZTogYXNzdW1pbmcgc2VxdWVudGlhbCIpOworICAgICAgICAgIGV4ZWN1dGlvblR5cGUgPSAic2VxdWVudGlhbCI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV4ZWN1dGlvblR5cGUgPSB3b3JrZmxvd05vZGUuZ2V0RWxlbWVudCgpLmdldE5vZGVOYW1lKCk7CisgICAgICB9CisKKyAgICAgIGlmICghc3VwcG9ydGVkUHJvY2Vzc29ySWRzLmNvbnRhaW5zKGV4ZWN1dGlvblR5cGUpKQorICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbnN1cHBvcnRlZCBleGVjdXRpb24gdHlwZSBpZCAnIgorICAgICAgICAgICAgKyBleGVjdXRpb25UeXBlICsgIiciKTsKKworICAgICAgTW9kZWxOb2RlIG1vZGVsTm9kZSA9IG5ldyBNb2RlbE5vZGUod29ya2Zsb3dOb2RlLmdldEZpbGUoKSk7CisgICAgICBtb2RlbE5vZGUuc2V0TW9kZWxJZChtb2RlbElkKTsKKyAgICAgIG1vZGVsTm9kZS5zZXRNb2RlbE5hbWUobW9kZWxOYW1lKTsKKyAgICAgIG1vZGVsTm9kZS5zZXRFeGVjdXRpb25UeXBlKGV4ZWN1dGlvblR5cGUpOworICAgICAgbW9kZWxOb2RlLnNldFN0YXRpY01ldGFkYXRhKHN0YXRpY01ldGFkYXRhKTsKKyAgICAgIG1vZGVsTm9kZS5zZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKGV4Y3VzZWQpOworICAgICAgbW9kZWxOb2RlLnNldEluc3RhbmNlQ2xhc3MoY2xhenopOworICAgICAgbW9kZWxOb2RlLnNldEVudHJ5UG9pbnQoZW50cnlQb2ludCk7CisgICAgICBtb2RlbE5vZGUuc2V0VGltZW91dCh0aW1lb3V0KTsKKyAgICAgIG1vZGVsTm9kZS5zZXRPcHRpb25hbChvcHRpb25hbCk7CisKKyAgICAgIGxvYWRDb25maWd1cmF0aW9uKHJvb3RFbGVtZW50cywgd29ya2Zsb3dOb2RlLCBtb2RlbE5vZGUsIGdsb2JhbENvbmZHcm91cHMpOworCisgICAgICBncmFwaCA9IG5ldyBNb2RlbEdyYXBoKG1vZGVsTm9kZSk7CisKKyAgICAgIGJvb2xlYW4gbG9hZGVkUHJlQ29uZGl0aW9ucyA9IGZhbHNlOworICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSB3b3JrZmxvd05vZGUuZ2V0RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICBOb2RlIGN1ckNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKKyAgICAgICAgaWYgKGN1ckNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICBpZiAoY3VyQ2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImNvbmRpdGlvbnMiKSkgeworICAgICAgICAgICAgYm9vbGVhbiBpc1ByZUNvbmRpdGlvbiA9ICFsb2FkZWRQcmVDb25kaXRpb25zOworICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSAoKEVsZW1lbnQpIGN1ckNoaWxkKS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKKyAgICAgICAgICAgIGlmICh0eXBlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgaXNQcmVDb25kaXRpb24gPSB0eXBlLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJwcmUiKTsKKyAgICAgICAgICAgIGlmIChpc1ByZUNvbmRpdGlvbikKKyAgICAgICAgICAgICAgZ3JhcGguc2V0UHJlQ29uZGl0aW9ucyh0aGlzLmxvYWRHcmFwaChyb290RWxlbWVudHMsCisgICAgICAgICAgICAgICAgICBuZXcgRmlsZUJhc2VkRWxlbWVudCh3b3JrZmxvd05vZGUuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBjdXJDaGlsZCksIG5ldyBNZXRhZGF0YShzdGF0aWNNZXRhZGF0YSksCisgICAgICAgICAgICAgICAgICBnbG9iYWxDb25mR3JvdXBzLCBzdXBwb3J0ZWRQcm9jZXNzb3JJZHMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ3JhcGguc2V0UG9zdENvbmRpdGlvbnModGhpcy5sb2FkR3JhcGgocm9vdEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgbmV3IEZpbGVCYXNlZEVsZW1lbnQod29ya2Zsb3dOb2RlLmdldEZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudCkgY3VyQ2hpbGQpLCBuZXcgTWV0YWRhdGEoc3RhdGljTWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgZ2xvYmFsQ29uZkdyb3Vwcywgc3VwcG9ydGVkUHJvY2Vzc29ySWRzKSk7CisgICAgICAgICAgICBsb2FkZWRQcmVDb25kaXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCFjdXJDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygiY29uZmlndXJhdGlvbiIpCisgICAgICAgICAgICAgICYmICFjdXJDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygicmVxdWlyZWRNZXRGaWVsZHMiKSkgeworICAgICAgICAgICAgZ3JhcGguYWRkQ2hpbGQodGhpcy5sb2FkR3JhcGgocm9vdEVsZW1lbnRzLCBuZXcgRmlsZUJhc2VkRWxlbWVudCgKKyAgICAgICAgICAgICAgICB3b3JrZmxvd05vZGUuZ2V0RmlsZSgpLCAoRWxlbWVudCkgY3VyQ2hpbGQpLCBuZXcgTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgc3RhdGljTWV0YWRhdGEpLCBnbG9iYWxDb25mR3JvdXBzLCBzdXBwb3J0ZWRQcm9jZXNzb3JJZHMpKTsKKworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgfSBlbHNlIGlmIChtb2RlbElkUmVmICE9IG51bGwpIHsKKyAgICAgIGdyYXBoID0gdGhpcy5maW5kR3JhcGgocm9vdEVsZW1lbnRzLCBtb2RlbElkUmVmLCBuZXcgTWV0YWRhdGEoCisgICAgICAgICAgc3RhdGljTWV0YWRhdGEpLCBnbG9iYWxDb25mR3JvdXBzLCBzdXBwb3J0ZWRQcm9jZXNzb3JJZHMpOworICAgICAgaWYgKGdyYXBoID09IG51bGwpCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldvcmtmbG93ICciICsgbW9kZWxJZFJlZgorICAgICAgICAgICAgKyAiJyBoYXMgbm90IGJlZW4gZGVmaW5lZCBpbiB0aGlzIGNvbnRleHQiKTsKKyAgICAgIGdyYXBoLnNldElzUmVmKHRydWUpOworICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5zZXRTdGF0aWNNZXRhZGF0YShuZXcgTWV0YWRhdGEoKSk7CisgICAgICBsb2FkQ29uZmlndXJhdGlvbihyb290RWxlbWVudHMsIHdvcmtmbG93Tm9kZSwgZ3JhcGguZ2V0TW9kZWwoKSwKKyAgICAgICAgICBnbG9iYWxDb25mR3JvdXBzKTsKKyAgICAgIGdyYXBoLmdldE1vZGVsKCkuc2V0QWxpYXMoYWxpYXMpOworICAgIH0KKworICAgIGlmIChlbnRyeVBvaW50ICYmIGdyYXBoLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgIHRoaXMuZ3JhcGhzLmFkZChncmFwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGdyYXBoOworICB9CisKKyAgcHJvdGVjdGVkIE1vZGVsR3JhcGggZmluZEdyYXBoKExpc3Q8RmlsZUJhc2VkRWxlbWVudD4gcm9vdEVsZW1lbnRzLAorICAgICAgU3RyaW5nIG1vZGVsSWRSZWYsIE1ldGFkYXRhIHN0YXRpY01ldGFkYXRhLAorICAgICAgSGFzaE1hcDxTdHJpbmcsIENvbmZpZ0dyb3VwPiBnbG9iYWxDb25mR3JvdXBzLAorICAgICAgU2V0PFN0cmluZz4gc3VwcG9ydGVkUHJvY2Vzc29ySWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBYUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgWFBhdGhFeHByZXNzaW9uIGV4cHIgPSB4cGF0aC5jb21waWxlKCIvLypbQGlkID0gJyIgKyBtb2RlbElkUmVmICsgIiddIik7CisgICAgZm9yIChGaWxlQmFzZWRFbGVtZW50IHJvb3RFbGVtZW50IDogcm9vdEVsZW1lbnRzKSB7CisgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgZXhwci5ldmFsdWF0ZShyb290RWxlbWVudC5nZXRFbGVtZW50KCksCisgICAgICAgICAgWFBhdGhDb25zdGFudHMuTk9ERSk7CisgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxvYWRHcmFwaChyb290RWxlbWVudHMsCisgICAgICAgICAgICBuZXcgRmlsZUJhc2VkRWxlbWVudChyb290RWxlbWVudC5nZXRGaWxlKCksIChFbGVtZW50KSBub2RlKSwKKyAgICAgICAgICAgIHN0YXRpY01ldGFkYXRhLCBnbG9iYWxDb25mR3JvdXBzLCBzdXBwb3J0ZWRQcm9jZXNzb3JJZHMpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2FkQ29uZmlndXJhdGlvbihMaXN0PEZpbGVCYXNlZEVsZW1lbnQ+IHJvb3RFbGVtZW50cywKKyAgICAgIEZpbGVCYXNlZEVsZW1lbnQgd29ya2Zsb3dOb2RlLCBNb2RlbE5vZGUgbW9kZWxOb2RlLAorICAgICAgSGFzaE1hcDxTdHJpbmcsIENvbmZpZ0dyb3VwPiBnbG9iYWxDb25mR3JvdXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHdvcmtmbG93Tm9kZS5nZXRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgTm9kZSBjdXJDaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisgICAgICBpZiAoY3VyQ2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24iKSkgeworICAgICAgICBNZXRhZGF0YSBjdXJNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBpZiAobW9kZWxOb2RlICE9IG51bGwKKyAgICAgICAgICAgICYmICEoKEVsZW1lbnQpIGN1ckNoaWxkKS5nZXRBdHRyaWJ1dGUoImV4dGVuZHMiKS5lcXVhbHMoIiIpKQorICAgICAgICAgIG1vZGVsTm9kZS5zZXRFeHRlbmRzQ29uZmlnKEFycmF5cy5hc0xpc3QoKChFbGVtZW50KSBjdXJDaGlsZCkKKyAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgiZXh0ZW5kcyIpLnNwbGl0KCIsIikpKTsKKyAgICAgICAgY3VyTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHRoaXMubG9hZENvbmZpZ3VyYXRpb24ocm9vdEVsZW1lbnRzLAorICAgICAgICAgICAgY3VyQ2hpbGQsIGdsb2JhbENvbmZHcm91cHMpKTsKKyAgICAgICAgaWYgKCEoKEVsZW1lbnQpIGN1ckNoaWxkKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgQ29uZmlnR3JvdXAgY29uZmlnR3JvdXAgPSBuZXcgQ29uZmlnR3JvdXAoCisgICAgICAgICAgICAgICgoRWxlbWVudCkgY3VyQ2hpbGQpLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBjdXJNZXRhZGF0YSk7CisgICAgICAgICAgaWYgKG1vZGVsTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXh0ZW5kc0NvbmZpZyA9IG5ldyBWZWN0b3I8U3RyaW5nPigKKyAgICAgICAgICAgICAgICBtb2RlbE5vZGUuZ2V0RXh0ZW5kc0NvbmZpZygpKTsKKyAgICAgICAgICAgIGNvbmZpZ0dyb3VwLmFkZEFsbEV4dGVuZHMoZXh0ZW5kc0NvbmZpZyk7CisgICAgICAgICAgICBleHRlbmRzQ29uZmlnLmFkZChjb25maWdHcm91cC5nZXROYW1lKCkpOworICAgICAgICAgICAgbW9kZWxOb2RlLnNldEV4dGVuZHNDb25maWcoZXh0ZW5kc0NvbmZpZyk7CisgICAgICAgICAgfQorICAgICAgICAgIGdsb2JhbENvbmZHcm91cHMucHV0KCgoRWxlbWVudCkgY3VyQ2hpbGQpLmdldEF0dHJpYnV0ZSgibmFtZSIpLAorICAgICAgICAgICAgICBjb25maWdHcm91cCk7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZWxOb2RlICE9IG51bGwpIHsKKyAgICAgICAgICBtb2RlbE5vZGUuc2V0U3RhdGljTWV0YWRhdGEoY3VyTWV0YWRhdGEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBsb2FkQ29uZmlndXJhdGlvbihMaXN0PEZpbGVCYXNlZEVsZW1lbnQ+IHJvb3RFbGVtZW50cywKKyAgICAgIE5vZGUgY29uZmlnTm9kZSwgSGFzaE1hcDxTdHJpbmcsIENvbmZpZ0dyb3VwPiBnbG9iYWxDb25mR3JvdXBzKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWV0YWRhdGEgY3VyTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBOb2RlTGlzdCBjdXJHcmFuZENoaWxkcmVuID0gY29uZmlnTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjdXJHcmFuZENoaWxkcmVuLmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgIGlmIChjdXJHcmFuZENoaWxkcmVuLml0ZW0oaykuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInByb3BlcnR5IikpIHsKKyAgICAgICAgRWxlbWVudCBwcm9wZXJ0eSA9IChFbGVtZW50KSBjdXJHcmFuZENoaWxkcmVuLml0ZW0oayk7CisgICAgICAgIFN0cmluZyBkZWxpbSA9IHByb3BlcnR5LmdldEF0dHJpYnV0ZSgiZGVsaW0iKTsKKyAgICAgICAgU3RyaW5nIGVudlJlcGxhY2UgPSBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGUoImVudlJlcGxhY2UiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydHkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oZW52UmVwbGFjZSkpCisgICAgICAgICAgY3VyTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKG5hbWUgKyAiL2VudlJlcGxhY2UiLCAidHJ1ZSIpOworICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGlmIChkZWxpbS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgdmFsdWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlLnNwbGl0KCJcXCIgKyBkZWxpbSkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICBjdXJNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEobmFtZSwgdmFsdWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGN1ck1ldGFkYXRhOworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBGaWxlQmFzZWRFbGVtZW50IHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgIHByaXZhdGUgRWxlbWVudCBlbGVtZW50OworCisgICAgcHVibGljIEZpbGVCYXNlZEVsZW1lbnQoRmlsZSBmaWxlLCBFbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICByZXR1cm4gdGhpcy5maWxlOworICAgIH0KKworICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICByZXR1cm4gdGhpcy5lbGVtZW50OworICAgIH0KKworICB9CisKKyAgcHVibGljIGNsYXNzIENvbmZpZ0dyb3VwIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleHRlbmRzQ29uZmlnOworCisgICAgcHVibGljIENvbmZpZ0dyb3VwKFN0cmluZyBuYW1lLCBNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgIHRoaXMuZXh0ZW5kc0NvbmZpZyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisgICAgcHVibGljIE1ldGFkYXRhIGdldE1ldGFkYXRhKCkgeworICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5kcyhTdHJpbmcgY2hpbGQpIHsKKyAgICAgIHRoaXMuZXh0ZW5kc0NvbmZpZy5hZGQoY2hpbGQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFsbEV4dGVuZHMoTGlzdDxTdHJpbmc+IGNoaWxkcmVuKSB7CisgICAgICB0aGlzLmV4dGVuZHNDb25maWcuYWRkQWxsKGNoaWxkcmVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFeHRlbmRzKFN0cmluZyBjaGlsZCkgeworICAgICAgdGhpcy5leHRlbmRzQ29uZmlnLnJlbW92ZShjaGlsZCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeHRlbmRzKCkgeworICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kc0NvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIHRoaXMubmFtZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29uZmlnR3JvdXApIHsKKyAgICAgICAgQ29uZmlnR3JvdXAgY29tcCA9IChDb25maWdHcm91cCkgb2JqOworICAgICAgICByZXR1cm4gY29tcC5uYW1lLmVxdWFscyh0aGlzLm5hbWUpOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbW9kZWwvcmVwby9YbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9tb2RlbC9yZXBvL1htbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGIwNzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvbW9kZWwvcmVwby9YbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwucmVwbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiAKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHhtbCBtb2RlbCByZXBvc2l0b3JpZXMKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5RmFjdG9yeSB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlOworCisgIHB1YmxpYyBYbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeSBjcmVhdGVNb2RlbFJlcG9zaXRvcnkoKSB7CisgICAgaWYgKHdvcmtzcGFjZSA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgaWYgKCFuZXcgRmlsZSh3b3Jrc3BhY2UpLmV4aXN0cygpKQorICAgICAgbmV3IEZpbGUod29ya3NwYWNlKS5ta2RpcnMoKTsKKyAgICByZXR1cm4gbmV3IFhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5KG5ldyBGaWxlKHdvcmtzcGFjZSkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0V29ya3NwYWNlKFN0cmluZyB3b3Jrc3BhY2UpIHsKKyAgICB0aGlzLndvcmtzcGFjZSA9IHdvcmtzcGFjZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvTXVsdGlTdGF0ZVBlcnNwZWN0aXZlLmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvTXVsdGlTdGF0ZVBlcnNwZWN0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZjdmNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS9NdWx0aVN0YXRlUGVyc3BlY3RpdmUuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3Lk1vZGU7CisKKy8qKgorICogCisgKiBBIG11bHRpLXN0YXRlIGRpc3BsYXkgcGVyc3BlY3RpdmUuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aVN0YXRlUGVyc3BlY3RpdmUgZXh0ZW5kcyBQZXJzcGVjdGl2ZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY0MTA3Njg3MTMwODQ4NzI5NzdMOworCisgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVmlld1N0YXRlPiBzdGF0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZpZXdTdGF0ZT4oKTsKKworICBwcml2YXRlIE1vZGUgbW9kZTsKKworICBwdWJsaWMgTXVsdGlTdGF0ZVBlcnNwZWN0aXZlKFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIobmFtZSk7CisgICAgdGhpcy5tb2RlID0gTW9kZS5FRElUOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkU3RhdGUoVmlld1N0YXRlIHN0YXRlKSB7CisgICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBzdXBlci5zZXRTdGF0ZShzdGF0ZSk7CisgICAgc3RhdGUuc2V0TW9kZSh0aGlzLm1vZGUpOworICAgIGlmICghdGhpcy5zdGF0ZXMuY29udGFpbnNLZXkoc3RhdGUuZ2V0SWQoKSkpIHsKKyAgICAgIHRoaXMuc3RhdGVzLnB1dChzdGF0ZS5nZXRJZCgpLCBzdGF0ZSk7CisgICAgICB0aGlzLmhhbmRsZUFkZFN0YXRlKHN0YXRlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZShWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICB0aGlzLnN0YXRlcy5yZW1vdmUoc3RhdGUpOworICAgIHRoaXMuaGFuZGxlUmVtb3ZlU3RhdGUoc3RhdGUpOworICAgIHN1cGVyLnNldFN0YXRlKHRoaXMuZ2V0QWN0aXZlU3RhdGUoKSk7CisgIH0KKworICBwdWJsaWMgVmlld1N0YXRlIGdldFN0YXRlKFN0cmluZyBzdGF0ZUlkKSB7CisgICAgcmV0dXJuIHRoaXMuc3RhdGVzLmdldChzdGF0ZUlkKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFZpZXdTdGF0ZT4gZ2V0U3RhdGVzKCkgeworICAgIHJldHVybiBuZXcgVmVjdG9yPFZpZXdTdGF0ZT4odGhpcy5zdGF0ZXMudmFsdWVzKCkpOworICB9CisKKyAgcHVibGljIFNldDxTdHJpbmc+IGdldFN0YXRlSWRzKCkgeworICAgIHJldHVybiB0aGlzLnN0YXRlcy5rZXlTZXQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1vZGUoTW9kZSBtb2RlKSB7CisgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICBmb3IgKFZpZXdTdGF0ZSBzdGF0ZSA6IHN0YXRlcy52YWx1ZXMoKSkKKyAgICAgIHN0YXRlLnNldE1vZGUobW9kZSk7CisgICAgdGhpcy5yZWZyZXNoKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICBzdXBlci5yZXNldCgpOworICAgIHRoaXMubW9kZSA9IE1vZGUuRURJVDsKKyAgICBzdGF0ZXMuY2xlYXIoKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGhhbmRsZUFkZFN0YXRlKFZpZXdTdGF0ZSBzdGF0ZSk7CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlUmVtb3ZlU3RhdGUoVmlld1N0YXRlIHN0YXRlKTsKKworICBwdWJsaWMgYWJzdHJhY3QgVmlld1N0YXRlIGdldEFjdGl2ZVN0YXRlKCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZS5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5ZWRhMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3TGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3Lk1vZGU7CisKKy8qKgorICogCisgKiAKKyAqIEEgdmlldyBsaXN0ZW5lciBhbmQganBhbmVsIGZvciBrZWVwaW5nIHRoZSBXb3JrZmxvdyBwZXJzcGVjdGl2ZSBpbiBzeW5jLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc3BlY3RpdmUgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBWaWV3TGlzdGVuZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzQzODA1MTU5Mzk2NDM1ODgyTDsKKworICBwcml2YXRlIFZpZXdTdGF0ZSBzdGF0ZTsKKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICBwdWJsaWMgUGVyc3BlY3RpdmUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiB0aGlzLm5hbWU7CisgIH0KKworICBwdWJsaWMgVmlld1N0YXRlIGdldFN0YXRlKCkgeworICAgIHJldHVybiB0aGlzLnN0YXRlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3RhdGUoVmlld1N0YXRlIHN0YXRlKSB7CisgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG1vZGUpIHsKKyAgICB0aGlzLnN0YXRlLnNldE1vZGUobW9kZSk7CisgICAgdGhpcy5yZWZyZXNoKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzYXZlKCkgeworICAgIGlmICh0aGlzLnN0YXRlICE9IG51bGwpCisgICAgICB0aGlzLnN0YXRlLnNhdmUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuZG8oKSB7CisgICAgaWYgKHRoaXMuc3RhdGUgIT0gbnVsbCkgeworICAgICAgdGhpcy5zdGF0ZS51bmRvKCk7CisgICAgICB0aGlzLnJlZnJlc2goKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICB0aGlzLnN0YXRlID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZnJlc2goKTsKKworICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRBY3RpdmVWaWV3KCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS9idWlsZC9CdWlsZFBlcnNwZWN0aXZlLmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvYnVpbGQvQnVpbGRQZXJzcGVjdGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzQxNmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvYnVpbGQvQnVpbGRQZXJzcGVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsNDI1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUuYnVpbGQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudTsKK2ltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJiZWRQYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLk1vZGVsR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUuTXVsdGlTdGF0ZVBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuTXVsdGlTdGF0ZVZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlld0NoYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LmltcGwuRGVmYXVsdFByb3BWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuaW1wbC5EZWZhdWx0VHJlZVZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5pbXBsLkdsb2JhbENvbmZpZ1ZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5pbXBsLkdyYXBoVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LmltcGwuVHJlZVByb2plY3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnV0aWwuR3VpVXRpbHM7CisKKy8qKgorICogCisgKiBUaGUgZGVmYXVsdCBidWlsZCBwZXJzcGVjdGl2ZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIEJ1aWxkUGVyc3BlY3RpdmUgZXh0ZW5kcyBNdWx0aVN0YXRlUGVyc3BlY3RpdmUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMzODc2MzI4MTk1NzYwNTc1MjdMOworCisgIHByaXZhdGUgVmlldyBwcm9qZWN0VmlldzsKKyAgcHJpdmF0ZSBWaWV3IGdsb2JhbENvbmZpZ1ZpZXc7CisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IHByb2plY3RWaWV3Q2xhc3M7CisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IG1haW5WaWV3Q2xhc3M7CisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IHRyZWVWaWV3Q2xhc3M7CisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IHByb3BWaWV3Q2xhc3M7CisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IGdsb2JhbFZpZXdDbGFzczsKKworICBwcml2YXRlIEhhc2hNYXA8Vmlld1N0YXRlLCBCdWlsZFBhbmVsPiBzdGF0ZVZpZXdzOworICBwcml2YXRlIFZpZXdTdGF0ZSBhY3RpdmVTdGF0ZTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUlOX1ZJRVcgPSAxOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSURUSCA9IDEwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUlHSFQgPSA3MDA7CisKKyAgcHJpdmF0ZSBKU3BsaXRQYW5lIHByb2plY3RTcGxpdFBhbmU7CisKKyAgcHJpdmF0ZSBib29sZWFuIGZpbmRTZWxlY3RlZEluVGFiID0gZmFsc2U7CisKKyAgcHVibGljIEJ1aWxkUGVyc3BlY3RpdmUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgIHRoaXMoVHJlZVByb2plY3RWaWV3LmNsYXNzLCBHcmFwaFZpZXcuY2xhc3MsIERlZmF1bHRUcmVlVmlldy5jbGFzcywKKyAgICAgICAgRGVmYXVsdFByb3BWaWV3LmNsYXNzLCBHbG9iYWxDb25maWdWaWV3LmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyBCdWlsZFBlcnNwZWN0aXZlKENsYXNzPD8gZXh0ZW5kcyBWaWV3PiBwcm9qZWN0Vmlld0NsYXNzLAorICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IG1haW5WaWV3Q2xhc3MsIENsYXNzPD8gZXh0ZW5kcyBWaWV3PiB0cmVlVmlld0NsYXNzLAorICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IHByb3BWaWV3Q2xhc3MsIENsYXNzPD8gZXh0ZW5kcyBWaWV3PiBnbG9iYWxWaWV3Q2xhc3MpCisgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgc3VwZXIoIkJ1aWxkIik7CisgICAgdGhpcy5wcm9qZWN0Vmlld0NsYXNzID0gcHJvamVjdFZpZXdDbGFzczsKKyAgICB0aGlzLm1haW5WaWV3Q2xhc3MgPSBtYWluVmlld0NsYXNzOworICAgIHRoaXMudHJlZVZpZXdDbGFzcyA9IHRyZWVWaWV3Q2xhc3M7CisgICAgdGhpcy5wcm9wVmlld0NsYXNzID0gcHJvcFZpZXdDbGFzczsKKyAgICB0aGlzLmdsb2JhbFZpZXdDbGFzcyA9IGdsb2JhbFZpZXdDbGFzczsKKyAgICB0aGlzLnN0YXRlVmlld3MgPSBuZXcgSGFzaE1hcDxWaWV3U3RhdGUsIEJ1aWxkUGFuZWw+KCk7CisgICAgdGhpcy5wcm9qZWN0VmlldyA9IHRoaXMuY3JlYXRlUHJvamVjdFZpZXcoKTsKKyAgICB0aGlzLnByb2plY3RWaWV3LnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihXSURUSCAvIDEwLCBIRUlHSFQgLyAyKSk7CisgICAgdGhpcy5nbG9iYWxDb25maWdWaWV3ID0gdGhpcy5jcmVhdGVHbG9iYWxDb25maWdWaWV3KCk7CisgICAgdGhpcy5nbG9iYWxDb25maWdWaWV3CisgICAgICAgIC5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oV0lEVEggLyAxMCwgSEVJR0hUIC8gMikpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgc3VwZXIucmVzZXQoKTsKKyAgICB0aGlzLmFjdGl2ZVN0YXRlID0gbnVsbDsKKyAgICB0aGlzLnN0YXRlVmlld3MuY2xlYXIoKTsKKyAgICB0aGlzLnByb2plY3RWaWV3ID0gdGhpcy5jcmVhdGVQcm9qZWN0VmlldygpOworICAgIHRoaXMuZ2xvYmFsQ29uZmlnVmlldyA9IHRoaXMuY3JlYXRlR2xvYmFsQ29uZmlnVmlldygpOworICB9CisKKyAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VOb3RpZnkoVmlld0NoYW5nZTw/PiBjaGFuZ2UpIHsKKyAgICBpZiAoY2hhbmdlIGluc3RhbmNlb2YgVmlld0NoYW5nZS5ORVdfQUNUSVZFX1NUQVRFKSB7CisgICAgICB0aGlzLmFjdGl2ZVN0YXRlID0gKChWaWV3Q2hhbmdlLk5FV19BQ1RJVkVfU1RBVEUpIGNoYW5nZSkuZ2V0T2JqZWN0KCk7CisgICAgICB0aGlzLnJlZnJlc2goKTsKKyAgICB9IGVsc2UgaWYgKGNoYW5nZSBpbnN0YW5jZW9mIFZpZXdDaGFuZ2UuUkVGUkVTSF9WSUVXKSB7CisgICAgICB0aGlzLnJlZnJlc2goKTsKKyAgICB9IGVsc2UgaWYgKGNoYW5nZSBpbnN0YW5jZW9mIFZpZXdDaGFuZ2UuU1RBVEVfTkFNRV9DSEFOR0UpIHsKKyAgICAgIFZpZXdTdGF0ZSBzdGF0ZSA9ICgoVmlld0NoYW5nZS5TVEFURV9OQU1FX0NIQU5HRSkgY2hhbmdlKS5nZXRPYmplY3QoKTsKKyAgICAgIHRoaXMucmVmcmVzaCgpOworICAgIH0gZWxzZSBpZiAoY2hhbmdlIGluc3RhbmNlb2YgVmlld0NoYW5nZS5WSUVXX01PREVMKSB7CisgICAgICBTdHJpbmcgbW9kZWxJZCA9ICgoVmlld0NoYW5nZS5WSUVXX01PREVMKSBjaGFuZ2UpLmdldE9iamVjdCgpOworICAgICAgZm9yIChWaWV3U3RhdGUgc3RhdGUgOiB0aGlzLnN0YXRlVmlld3Mua2V5U2V0KCkpIHsKKyAgICAgICAgZm9yIChNb2RlbEdyYXBoIGdyYXBoIDogc3RhdGUuZ2V0R3JhcGhzKCkpIHsKKyAgICAgICAgICBNb2RlbEdyYXBoIGZvdW5kID0gZ3JhcGgucmVjdXJzaXZlRmluZEJ5TW9kZWxJZChtb2RlbElkKTsKKyAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiAhZm91bmQuZ2V0TW9kZWwoKS5pc1JlZigpKSB7CisgICAgICAgICAgICB0aGlzLmFjdGl2ZVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB0aGlzLmFjdGl2ZVN0YXRlLnNldFNlbGVjdGVkKGZvdW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy5maW5kU2VsZWN0ZWRJblRhYiA9IHRydWU7CisgICAgICB0aGlzLnJlZnJlc2goKTsKKyAgICAgIHRoaXMuZmluZFNlbGVjdGVkSW5UYWIgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFZpZXdTdGF0ZSBnZXRBY3RpdmVTdGF0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5hY3RpdmVTdGF0ZTsKKyAgfQorCisgIHB1YmxpYyBWaWV3IGdldEFjdGl2ZVZpZXcoKSB7CisgICAgaWYgKHRoaXMuZ2V0QWN0aXZlU3RhdGUoKSAhPSBudWxsKQorICAgICAgcmV0dXJuIHRoaXMuc3RhdGVWaWV3cy5nZXQodGhpcy5nZXRBY3RpdmVTdGF0ZSgpKS5nZXRBY3RpdmVWaWV3KCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlQWRkU3RhdGUoZmluYWwgVmlld1N0YXRlIHN0YXRlKSB7CisgICAgdGhpcy5hY3RpdmVTdGF0ZSA9IHN0YXRlOworICAgIEJ1aWxkUGFuZWwgYnVpbGRQYW5lbCA9IG5ldyBCdWlsZFBhbmVsKHN0YXRlKTsKKyAgICB0aGlzLnN0YXRlVmlld3MucHV0KHN0YXRlLCBidWlsZFBhbmVsKTsKKyAgICB0aGlzLnJlZnJlc2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVSZW1vdmVTdGF0ZShWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICB0aGlzLnN0YXRlVmlld3MucmVtb3ZlKHN0YXRlKTsKKyAgICBpZiAodGhpcy5zdGF0ZVZpZXdzLnNpemUoKSA+IDApCisgICAgICB0aGlzLmFjdGl2ZVN0YXRlID0gdGhpcy5zdGF0ZVZpZXdzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIGVsc2UKKyAgICAgIHRoaXMuYWN0aXZlU3RhdGUgPSBudWxsOworICAgIHRoaXMucmVmcmVzaCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisgICAgdGhpcy5zYXZlKCk7CisgICAgdGhpcy5yZW1vdmVBbGwoKTsKKyAgICB0aGlzLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgIEpQYW5lbCBwYW5lbCA9IG51bGw7CisgICAgaWYgKHRoaXMuYWN0aXZlU3RhdGUgIT0gbnVsbCkgeworICAgICAgQnVpbGRQYW5lbCBidWlsZFBhbmVsID0gdGhpcy5zdGF0ZVZpZXdzLmdldCh0aGlzLmFjdGl2ZVN0YXRlKTsKKyAgICAgIGJ1aWxkUGFuZWwucmVmcmVzaCgpOworICAgICAgcGFuZWwgPSBidWlsZFBhbmVsOworICAgIH0gZWxzZSB7CisgICAgICBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5wcm9qZWN0VmlldyBpbnN0YW5jZW9mIE11bHRpU3RhdGVWaWV3KQorICAgICAgKChNdWx0aVN0YXRlVmlldykgdGhpcy5wcm9qZWN0VmlldykucmVmcmVzaFZpZXcodGhpcy5hY3RpdmVTdGF0ZSwKKyAgICAgICAgICB0aGlzLmdldFN0YXRlcygpKTsKKyAgICBlbHNlCisgICAgICB0aGlzLnByb2plY3RWaWV3LnJlZnJlc2hWaWV3KHRoaXMuYWN0aXZlU3RhdGUpOworCisgICAgdGhpcy5nbG9iYWxDb25maWdWaWV3LnJlZnJlc2hWaWV3KHRoaXMuYWN0aXZlU3RhdGUpOworCisgICAgSlBhbmVsIGdsb2JhbFBhbmVsID0gbmV3IEpQYW5lbCgpOworICAgIGdsb2JhbFBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgIGdsb2JhbFBhbmVsLmFkZCh0aGlzLnByb2plY3RWaWV3LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICBnbG9iYWxQYW5lbC5hZGQodGhpcy5nbG9iYWxDb25maWdWaWV3LCBCb3JkZXJMYXlvdXQuU09VVEgpOworCisgICAgaW50IGRpdmlkZXJMb2NhdGlvbiA9IC0xOworICAgIGlmIChwcm9qZWN0U3BsaXRQYW5lICE9IG51bGwpCisgICAgICBkaXZpZGVyTG9jYXRpb24gPSBwcm9qZWN0U3BsaXRQYW5lLmdldERpdmlkZXJMb2NhdGlvbigpOworICAgIHByb2plY3RTcGxpdFBhbmUgPSBuZXcgSlNwbGl0UGFuZShKU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQsIGdsb2JhbFBhbmVsLAorICAgICAgICBwYW5lbCk7CisgICAgaWYgKGRpdmlkZXJMb2NhdGlvbiAhPSAtMSkKKyAgICAgIHByb2plY3RTcGxpdFBhbmUuc2V0RGl2aWRlckxvY2F0aW9uKGRpdmlkZXJMb2NhdGlvbik7CisgICAgdGhpcy5hZGQocHJvamVjdFNwbGl0UGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisKKyAgICB0aGlzLnJldmFsaWRhdGUoKTsKKworICB9CisKKyAgcHJpdmF0ZSBWaWV3IGNyZWF0ZU1haW5WaWV3KFN0cmluZyBuYW1lKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLm1haW5WaWV3Q2xhc3MuZ2V0Q29uc3RydWN0b3IoU3RyaW5nLmNsYXNzKS5uZXdJbnN0YW5jZShuYW1lKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgVmlldyBjcmVhdGVUcmVlVmlldygpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJlZVZpZXdDbGFzcy5nZXRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MpLm5ld0luc3RhbmNlKAorICAgICAgICAgIHRoaXMudHJlZVZpZXdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBWaWV3IGNyZWF0ZUdsb2JhbENvbmZpZ1ZpZXcoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLmdsb2JhbFZpZXdDbGFzcy5nZXRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MpLm5ld0luc3RhbmNlKAorICAgICAgICAgIHRoaXMuZ2xvYmFsVmlld0NsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFZpZXcgY3JlYXRlUHJvamVjdFZpZXcoKSB7CisgICAgdHJ5IHsKKyAgICAgIFZpZXcgdmlldyA9IHRoaXMucHJvamVjdFZpZXdDbGFzcy5nZXRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MpCisgICAgICAgICAgLm5ld0luc3RhbmNlKHRoaXMucHJvamVjdFZpZXdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgdmlldy5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgcmV0dXJuIHZpZXc7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFZpZXcgY3JlYXRlUHJvcFZpZXcoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLnByb3BWaWV3Q2xhc3MuZ2V0Q29uc3RydWN0b3IoU3RyaW5nLmNsYXNzKS5uZXdJbnN0YW5jZSgKKyAgICAgICAgICB0aGlzLnByb3BWaWV3Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY2xhc3MgQnVpbGRQYW5lbCBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIFZpZXdMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjEyMDA0Nzk1OTk2MjU2Nzk2M0w7CisKKyAgICBwcml2YXRlIEpUYWJiZWRQYW5lIHRhYmJlZFBhbmU7CisgICAgcHJpdmF0ZSBNYXA8VmlldywgVmlld1N0YXRlPiBtYWluVmlld3M7CisgICAgcHJpdmF0ZSBWaWV3IHByb3BWaWV3OworICAgIHByaXZhdGUgVmlldyB0cmVlVmlldzsKKworICAgIHByaXZhdGUgVmlldyBwcmltYXJ5TWFpblZpZXc7CisKKyAgICBwcml2YXRlIEpQb3B1cE1lbnUgY2xvc2VUYWJQb3B1cDsKKworICAgIHByaXZhdGUgVmlld1N0YXRlIHN0YXRlOworCisgICAgcHVibGljIEJ1aWxkUGFuZWwoVmlld1N0YXRlIHN0YXRlKSB7CisgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisKKyAgICAgIG1haW5WaWV3cyA9IG5ldyBIYXNoTWFwPFZpZXcsIFZpZXdTdGF0ZT4oKTsKKworICAgICAgcHJvcFZpZXcgPSBjcmVhdGVQcm9wVmlldygpOworICAgICAgcHJvcFZpZXcucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKworICAgICAgdHJlZVZpZXcgPSBjcmVhdGVUcmVlVmlldygpOworICAgICAgdHJlZVZpZXcucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKworICAgICAgdGFiYmVkUGFuZSA9IG5ldyBKVGFiYmVkUGFuZSgpOworCisgICAgICB0aGlzLmFkZE1haW5WaWV3KGNyZWF0ZU1haW5WaWV3KHN0YXRlLmdldEZpbGUoKS5nZXROYW1lKCkpLCBzdGF0ZSk7CisKKyAgICAgIGNsb3NlVGFiUG9wdXAgPSBuZXcgSlBvcHVwTWVudSgpOworICAgICAgSk1lbnVJdGVtIGNsb3NlSXRlbSA9IG5ldyBKTWVudUl0ZW0oIkNsb3NlIik7CisgICAgICBjbG9zZUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgVmlldyBtYWluVmlldyA9IChWaWV3KSBCdWlsZFBhbmVsLnRoaXMudGFiYmVkUGFuZQorICAgICAgICAgICAgICAuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKKyAgICAgICAgICBCdWlsZFBhbmVsLnRoaXMucmVtb3ZlTWFpblZpZXcobWFpblZpZXcpOworICAgICAgICB9CisKKyAgICAgIH0pOworICAgICAgY2xvc2VUYWJQb3B1cC5hZGQoY2xvc2VJdGVtKTsKKworICAgICAgdGhpcy50YWJiZWRQYW5lLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgIGlmIChlLmdldEJ1dHRvbigpID09IE1vdXNlRXZlbnQuQlVUVE9OMworICAgICAgICAgICAgICAmJiAhQnVpbGRQYW5lbC50aGlzLnRhYmJlZFBhbmUuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICBCdWlsZFBhbmVsLnRoaXMucHJpbWFyeU1haW5WaWV3KSkgeworICAgICAgICAgICAgY2xvc2VUYWJQb3B1cC5zaG93KEJ1aWxkUGFuZWwudGhpcy50YWJiZWRQYW5lLCBlLmdldFgoKSwgZS5nZXRZKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgfQorCisgICAgICB9KTsKKworICAgICAgdGhpcy50YWJiZWRQYW5lLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgeworICAgICAgICAgIFZpZXcgYWN0aXZlVmlldyA9IChWaWV3KSBCdWlsZFBhbmVsLnRoaXMudGFiYmVkUGFuZQorICAgICAgICAgICAgICAuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKKyAgICAgICAgICBhY3RpdmVWaWV3Lm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICB9CisKKyAgICAgIH0pOworCisgICAgICB0cmVlVmlldy5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oV0lEVEggLyAxMCwgSEVJR0hUIC8gMikpOworICAgICAgcHJvcFZpZXcuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKFdJRFRIIC8gMTAsIEhFSUdIVCAvIDIpKTsKKyAgICAgIEpTcGxpdFBhbmUgdHJlZVByb3BQYW5lID0gbmV3IEpTcGxpdFBhbmUoSlNwbGl0UGFuZS5WRVJUSUNBTF9TUExJVCwKKyAgICAgICAgICB0cmVlVmlldywgcHJvcFZpZXcpOworICAgICAgdHJlZVByb3BQYW5lLnNldFJlc2l6ZVdlaWdodCguMjUpOworICAgICAgdGFiYmVkUGFuZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oV0lEVEgsIEhFSUdIVCkpOworICAgICAgSlNwbGl0UGFuZSBtYWluU3BsaXRQYW5lID0gbmV3IEpTcGxpdFBhbmUoSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElULAorICAgICAgICAgIHRhYmJlZFBhbmUsIHRyZWVQcm9wUGFuZSk7CisgICAgICBtYWluU3BsaXRQYW5lLnNldFJlc2l6ZVdlaWdodCguNzUpOworICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgIHRoaXMuYWRkKG1haW5TcGxpdFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1haW5WaWV3KFZpZXcgbWFpblZpZXcsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgICAgaWYgKHRoaXMubWFpblZpZXdzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHRoaXMucHJpbWFyeU1haW5WaWV3ID0gbWFpblZpZXc7CisgICAgICAgIG1haW5WaWV3LnNldFByaW1hcnkodHJ1ZSk7CisgICAgICB9CisgICAgICB0aGlzLm1haW5WaWV3cy5wdXQobWFpblZpZXcsIHN0YXRlKTsKKyAgICAgIHRoaXMudGFiYmVkUGFuZS5hZGRUYWIobWFpblZpZXcuZ2V0TmFtZSgpLCBtYWluVmlldyk7CisgICAgICB0aGlzLnRhYmJlZFBhbmUuc2V0U2VsZWN0ZWRDb21wb25lbnQobWFpblZpZXcpOworICAgICAgbWFpblZpZXcucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNYWluVmlldyhWaWV3IG1haW5WaWV3KSB7CisgICAgICBpZiAoIXRoaXMucHJpbWFyeU1haW5WaWV3LmVxdWFscyhtYWluVmlldykpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRhYmJlZFBhbmUuZ2V0VGFiQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgaWYgKG1haW5WaWV3LmdldE5hbWUoKS5lcXVhbHModGhpcy50YWJiZWRQYW5lLmdldFRpdGxlQXQoaSkpKSB7CisgICAgICAgICAgICB0aGlzLnRhYmJlZFBhbmUucmVtb3ZlVGFiQXQoaSk7CisgICAgICAgICAgICB0aGlzLm1haW5WaWV3cy5yZW1vdmUobWFpblZpZXcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEFjdGl2ZVZpZXcoKSB7CisgICAgICByZXR1cm4gKFZpZXcpIHRoaXMudGFiYmVkUGFuZS5nZXRTZWxlY3RlZENvbXBvbmVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisgICAgICBpZiAodGhpcy5nZXRBY3RpdmVWaWV3KCkgIT0gbnVsbCkgeworICAgICAgICBWaWV3U3RhdGUgdmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgaWYgKHRoaXMuc3RhdGUuZ2V0U2VsZWN0ZWQoKSAhPSBudWxsICYmIGZpbmRTZWxlY3RlZEluVGFiKSB7CisgICAgICAgICAgVE9QOiBmb3IgKEVudHJ5PFZpZXcsIFZpZXdTdGF0ZT4gZW50cnkgOiB0aGlzLm1haW5WaWV3cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiBlbnRyeS5nZXRWYWx1ZSgpLmdldEdyYXBocygpKSB7CisgICAgICAgICAgICAgIE1vZGVsR3JhcGggZm91bmQgPSBncmFwaC5yZWN1cnNpdmVGaW5kQnlNb2RlbElkKHRoaXMuc3RhdGUKKyAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkuZ2V0TW9kZWxJZCgpKTsKKyAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwgJiYgIWZvdW5kLmdldE1vZGVsKCkuaXNSZWYoKSkgeworICAgICAgICAgICAgICAgIHZpZXdTdGF0ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgdmlld1N0YXRlLnNldFNlbGVjdGVkKGZvdW5kKTsKKyAgICAgICAgICAgICAgICB0aGlzLnRhYmJlZFBhbmUuc2V0U2VsZWN0ZWRDb21wb25lbnQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIGJyZWFrIFRPUDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2aWV3U3RhdGUgPSB0aGlzLm1haW5WaWV3cy5nZXQodGhpcy5nZXRBY3RpdmVWaWV3KCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZ2V0QWN0aXZlVmlldygpLnJlZnJlc2hWaWV3KHZpZXdTdGF0ZSk7CisgICAgICAgIHRoaXMucHJvcFZpZXcucmVmcmVzaFZpZXcodmlld1N0YXRlKTsKKyAgICAgICAgdGhpcy50cmVlVmlldy5yZWZyZXNoVmlldyh2aWV3U3RhdGUpOworICAgICAgfQorICAgICAgdGhpcy5yZXZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VOb3RpZnkoVmlld0NoYW5nZTw/PiBjaGFuZ2UpIHsKKyAgICAgIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBWaWV3Q2hhbmdlLk5FV19WSUVXKSB7CisgICAgICAgIHRoaXMuYWRkTWFpblZpZXcoCisgICAgICAgICAgICBjcmVhdGVNYWluVmlldygoKFZpZXdDaGFuZ2UuTkVXX1ZJRVcpIGNoYW5nZSkuZ2V0T2JqZWN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCkpLAorICAgICAgICAgICAgbmV3IFZpZXdTdGF0ZSh0aGlzLnN0YXRlLmdldEZpbGUoKSwgbnVsbCwgQ29sbGVjdGlvbnMKKyAgICAgICAgICAgICAgICAuc2luZ2xldG9uTGlzdChHdWlVdGlscy5maW5kKHRoaXMuc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgICAgICAgICAgICgoVmlld0NoYW5nZS5ORVdfVklFVykgY2hhbmdlKS5nZXRPYmplY3QoKS5nZXRNb2RlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSkpLCB0aGlzLnN0YXRlLmdldEdsb2JhbENvbmZpZ0dyb3VwcygpKSk7CisgICAgICAgIHRoaXMucmVmcmVzaCgpOworICAgICAgfQorICAgICAgQnVpbGRQZXJzcGVjdGl2ZS50aGlzLnN0YXRlQ2hhbmdlTm90aWZ5KGNoYW5nZSk7CisgICAgfQorCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvTXVsdGlTdGF0ZVZpZXcuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L011bHRpU3RhdGVWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzNDI4NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L011bHRpU3RhdGVWaWV3LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiAKKyAqIEEgbXVsdGktc3RhdGUgdmlldy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpU3RhdGVWaWV3IGV4dGVuZHMgVmlldyB7CisKKyAgcHVibGljIE11bHRpU3RhdGVWaWV3KFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIobmFtZSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjk2ODYyNzg1MTcyNzY5ODU0MEw7CisKKyAgcHVibGljIHZvaWQgcmVmcmVzaFZpZXcoVmlld1N0YXRlIHN0YXRlKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICJUaGlzIGlzIGEgbXV0bGktc3RhdGUgdmlldyAtLSBjYWxsIG11bHRpLXN0YXRlIHZpZXcgcmVmcmVzaFZpZXcgbWV0aG9kISIpOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVmcmVzaFZpZXcoVmlld1N0YXRlIGFjdGl2ZVN0YXRlLCBMaXN0PFZpZXdTdGF0ZT4gc3RhdGVzKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvVmlldy5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjkyNjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9WaWV3LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKKworLyoqCisgKiAKKyAqIAorICogVmlldyBhYnN0cmFjdCBiYXNlIGNsYXNzLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlldyBleHRlbmRzIEpQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcwODY5MjQ1OTY2NzMwOTQxM0w7CisKKyAgcHVibGljIGVudW0gTW9kZSB7CisgICAgREVMRVRFLCBFRElULCBNT1ZFLCBaT09NX0lOLCBaT09NX09VVDsKKyAgfQorCisgIHByaXZhdGUgVmVjdG9yPFZpZXdMaXN0ZW5lcj4gbGlzdGVuZXJzOworICBwcml2YXRlIFN0cmluZyBpZDsKKyAgcHJpdmF0ZSBib29sZWFuIGlzUHJpbWFyeTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX0dSQVBIX0lEUyA9ICJEaXNwbGF5R3JhcGhJZHMiOworCisgIHB1YmxpYyBWaWV3KFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLmlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICBpZiAobmFtZSAhPSBudWxsKQorICAgICAgdGhpcy5zZXROYW1lKG5hbWUpOworICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IFZlY3RvcjxWaWV3TGlzdGVuZXI+KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5KGJvb2xlYW4gaXNQcmltYXJ5KSB7CisgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnkoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNQcmltYXJ5OworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5pZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoVmlld0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgIH0KKworICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyTGlzdGVuZXIoVmlld0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgdGhpcy5saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhWaWV3Q2hhbmdlPD8+IGNoYW5nZSkgeworICAgIGZvciAoVmlld0xpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKQorICAgICAgbGlzdGVuZXIuc3RhdGVDaGFuZ2VOb3RpZnkoY2hhbmdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycygpIHsKKyAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhuZXcgVmlld0NoYW5nZS5SRUZSRVNIX1ZJRVcodGhpcywgdGhpcykpOworICB9CisKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5pZC5oYXNoQ29kZSgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgVmlldyAmJiAoKFZpZXcpIG9iaikuaWQuZXF1YWxzKHRoaXMuaWQpOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVmcmVzaFZpZXcoVmlld1N0YXRlIHN0YXRlKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvVmlld0NoYW5nZS5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvVmlld0NoYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDJhMTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9WaWV3Q2hhbmdlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwuTW9kZWxHcmFwaDsKKworLyoqCisgKiAKKyAqIFJlcHJlc2VudHMgYSBjaGFuZ2UgaW4gdGhlIFdvcmtmbG93IEdVSSBtb2RlbCB2aWV3LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0NoYW5nZTxUPiB7CisKKyAgcHJpdmF0ZSBUIG9iamVjdDsKKyAgcHJpdmF0ZSBWaWV3IHNvdXJjZTsKKworICBwcm90ZWN0ZWQgVmlld0NoYW5nZShUIG9iamVjdCwgVmlldyBzb3VyY2UpIHsKKyAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgfQorCisgIHB1YmxpYyBUIGdldE9iamVjdCgpIHsKKyAgICByZXR1cm4gdGhpcy5vYmplY3Q7CisgIH0KKworICBwdWJsaWMgVmlldyBnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIHRoaXMuc291cmNlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBORVdfVklFVyBleHRlbmRzIFZpZXdDaGFuZ2U8TW9kZWxHcmFwaD4geworICAgIHB1YmxpYyBORVdfVklFVyhNb2RlbEdyYXBoIG9iamVjdCwgVmlldyBzb3VyY2UpIHsKKyAgICAgIHN1cGVyKG9iamVjdCwgc291cmNlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERFTEVURV9WSUVXIGV4dGVuZHMgVmlld0NoYW5nZTxWaWV3PiB7CisgICAgcHVibGljIERFTEVURV9WSUVXKFZpZXcgb2JqZWN0LCBWaWV3IHNvdXJjZSkgeworICAgICAgc3VwZXIob2JqZWN0LCBzb3VyY2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUkVGUkVTSF9WSUVXIGV4dGVuZHMgVmlld0NoYW5nZTxWaWV3PiB7CisgICAgcHVibGljIFJFRlJFU0hfVklFVyhWaWV3IG9iamVjdCwgVmlldyBzb3VyY2UpIHsKKyAgICAgIHN1cGVyKG9iamVjdCwgc291cmNlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5FV19TVEFURSBleHRlbmRzIFZpZXdDaGFuZ2U8Vmlld1N0YXRlPiB7CisgICAgcHVibGljIE5FV19TVEFURShWaWV3U3RhdGUgb2JqZWN0LCBWaWV3IHNvdXJjZSkgeworICAgICAgc3VwZXIob2JqZWN0LCBzb3VyY2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUkVNT1ZFX1NUQVRFIGV4dGVuZHMgVmlld0NoYW5nZTxWaWV3U3RhdGU+IHsKKyAgICBwdWJsaWMgUkVNT1ZFX1NUQVRFKFZpZXdTdGF0ZSBvYmplY3QsIFZpZXcgc291cmNlKSB7CisgICAgICBzdXBlcihvYmplY3QsIHNvdXJjZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBORVdfQUNUSVZFX1NUQVRFIGV4dGVuZHMgVmlld0NoYW5nZTxWaWV3U3RhdGU+IHsKKyAgICBwdWJsaWMgTkVXX0FDVElWRV9TVEFURShWaWV3U3RhdGUgb2JqZWN0LCBWaWV3IHNvdXJjZSkgeworICAgICAgc3VwZXIob2JqZWN0LCBzb3VyY2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU1RBVEVfTkFNRV9DSEFOR0UgZXh0ZW5kcyBWaWV3Q2hhbmdlPFZpZXdTdGF0ZT4geworICAgIHB1YmxpYyBTVEFURV9OQU1FX0NIQU5HRShWaWV3U3RhdGUgb2JqZWN0LCBWaWV3IHNvdXJjZSkgeworICAgICAgc3VwZXIob2JqZWN0LCBzb3VyY2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVklFV19NT0RFTCBleHRlbmRzIFZpZXdDaGFuZ2U8U3RyaW5nPiB7CisgICAgcHVibGljIFZJRVdfTU9ERUwoU3RyaW5nIG1vZGVsSWQsIFZpZXcgc291cmNlKSB7CisgICAgICBzdXBlcihtb2RlbElkLCBzb3VyY2UpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9WaWV3TGlzdGVuZXIuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L1ZpZXdMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODhiMjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9WaWV3TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldzsKKworLyoqCisgKiAKKyAqIEludGVyZmFjZSBmb3IgbGlzdGVuaW5nL25vdGlmeWluZyBhYm91dCBXb3JrZmxvdyBWaWV3IHN0YXRlIGNoYW5nZXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmlld0xpc3RlbmVyIHsKKworICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZU5vdGlmeShWaWV3Q2hhbmdlPD8+IGNoYW5nZSk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L1ZpZXdTdGF0ZS5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvVmlld1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxM2I3ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L1ZpZXdTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjYwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLk1vZGVsR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwucmVwby5YbWxXb3JrZmxvd01vZGVsUmVwb3NpdG9yeS5Db25maWdHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXcuTW9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsLkd1aVV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIGEgcGFydGljdWxhciBXb3JrZmxvdyBHVUkgZWRpdG9yIHZpZXcuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBWaWV3U3RhdGUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdGFjazxWaWV3U3RhdGU+PiB1bmRvSGlzdG9yeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RhY2s8Vmlld1N0YXRlPj4oKTsKKworICBwcml2YXRlIE1vZGVsR3JhcGggc2VsZWN0ZWQ7CisgIHByaXZhdGUgTGlzdDxNb2RlbEdyYXBoPiBncmFwaHM7CisgIHByaXZhdGUgU3RyaW5nIGlkOworICBwcml2YXRlIFN0cmluZyBjdXJyZW50TWV0R3JvdXA7CisgIHByaXZhdGUgTWV0YWRhdGEgcHJvcGVydGllczsKKyAgcHJpdmF0ZSBNb2RlIG1vZGU7CisgIHByaXZhdGUgRmlsZSBmaWxlOworICBwcml2YXRlIGJvb2xlYW4gY2hhbmdlID0gZmFsc2U7CisgIHByaXZhdGUgTWFwPFN0cmluZywgQ29uZmlnR3JvdXA+IGdsb2JhbENvbmZpZ0dyb3VwczsKKworICBwdWJsaWMgVmlld1N0YXRlKEZpbGUgZmlsZSwgTW9kZWxHcmFwaCBzZWxlY3RlZCwgTGlzdDxNb2RlbEdyYXBoPiBncmFwaHMsCisgICAgICBNYXA8U3RyaW5nLCBDb25maWdHcm91cD4gZ2xvYmFsQ29uZmlnR3JvdXBzKSB7CisgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOworICAgIHRoaXMuZ3JhcGhzID0gbmV3IFZlY3RvcjxNb2RlbEdyYXBoPihncmFwaHMpOworICAgIHRoaXMuaWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgIHRoaXMuY3VycmVudE1ldEdyb3VwID0gbnVsbDsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICB0aGlzLm1vZGUgPSBNb2RlLkVESVQ7CisgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB0aGlzLmdsb2JhbENvbmZpZ0dyb3VwcyA9IGdsb2JhbENvbmZpZ0dyb3VwczsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBDb25maWdHcm91cD4gZ2V0R2xvYmFsQ29uZmlnR3JvdXBzKCkgeworICAgIHJldHVybiB0aGlzLmdsb2JhbENvbmZpZ0dyb3VwczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZEdsb2JhbENvbmZpZ0dyb3VwKFN0cmluZyBncm91cE5hbWUsIENvbmZpZ0dyb3VwIGNvbmZpZ0dyb3VwKSB7CisgICAgdGhpcy5nbG9iYWxDb25maWdHcm91cHMucHV0KGdyb3VwTmFtZSwgY29uZmlnR3JvdXApOworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlR2xvYmFsQ29uZmlnR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgIHRoaXMuZ2xvYmFsQ29uZmlnR3JvdXBzLnJlbW92ZShncm91cE5hbWUpOworICB9CisKKyAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICByZXR1cm4gdGhpcy5maWxlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5pZDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zUHJvcGVydHkoU3RyaW5nIGtleSkgeworICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuY29udGFpbnNHcm91cChrZXkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgVmVjdG9yPFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgdGhpcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBMaXN0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgdGhpcy5wcm9wZXJ0aWVzLnJlcGxhY2VNZXRhZGF0YShrZXksIHZhbHVlcyk7CisgICAgdGhpcy5jaGFuZ2UgPSB0cnVlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRGaXJzdFByb3BlcnR5VmFsdWUoU3RyaW5nIGtleSkgeworICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB0aGlzLmdldFByb3BlcnR5KGtleSk7CisgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkKKyAgICAgIHJldHVybiBudWxsOworICAgIHJldHVybiB2YWx1ZXMuZ2V0KDApOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXRBbGxNZXRhZGF0YShrZXkpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSkgeworICAgIHRoaXMucHJvcGVydGllcy5yZW1vdmVNZXRhZGF0YShrZXkpOworICAgIHRoaXMuY2hhbmdlID0gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0S2V5c1JlY3VyKFN0cmluZyBzdWJHcm91cCkgeworICAgIFZlY3RvcjxTdHJpbmc+IGtleXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICBmb3IgKFN0cmluZyBrZXkgOiB0aGlzLnByb3BlcnRpZXMuZ2V0QWxsS2V5cygpKQorICAgICAgaWYgKGtleS5jb250YWlucyhzdWJHcm91cCkpCisgICAgICAgIGtleXMuYWRkKGtleSk7CisgICAgcmV0dXJuIGtleXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChNb2RlbEdyYXBoIHNlbGVjdGVkKSB7CisgICAgaWYgKHRoaXMuc2VsZWN0ZWQgPT0gbnVsbCB8fCBzZWxlY3RlZCA9PSBudWxsCisgICAgICAgIHx8ICF0aGlzLnNlbGVjdGVkLmVxdWFscyhzZWxlY3RlZCkpIHsKKyAgICAgIHRoaXMuY3VycmVudE1ldEdyb3VwID0gbnVsbDsKKyAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKyAgICAgIHRoaXMuY2hhbmdlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTW9kZWxHcmFwaCBnZXRTZWxlY3RlZCgpIHsKKyAgICBpZiAodGhpcy5tb2RlLmVxdWFscyhNb2RlLkVESVQpKQorICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0R3JhcGhJZHMoKSB7CisgICAgSGFzaFNldDxTdHJpbmc+IGdyYXBoSWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGZvciAoTW9kZWxHcmFwaCBncmFwaCA6IHRoaXMuZ2V0R3JhcGhzKCkpCisgICAgICBncmFwaElkcy5hZGQoZ3JhcGguZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCkpOworICAgIHJldHVybiBncmFwaElkczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PE1vZGVsR3JhcGg+IGdldEdyYXBocygpIHsKKyAgICByZXR1cm4gdGhpcy5ncmFwaHM7CisgIH0KKworICBwdWJsaWMgdm9pZCByZW1vdmVHcmFwaChNb2RlbEdyYXBoIGdyYXBoKSB7CisgICAgdGhpcy5ncmFwaHMucmVtb3ZlKGdyYXBoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZEdyYXBoKE1vZGVsR3JhcGggZ3JhcGgpIHsKKyAgICB0aGlzLmdyYXBocy5hZGQoZ3JhcGgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG1vZGUpIHsKKyAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgIHRoaXMuY2hhbmdlID0gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBNb2RlIGdldE1vZGUoKSB7CisgICAgcmV0dXJuIHRoaXMubW9kZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZXRHcm91cChTdHJpbmcgY3VycmVudE1ldEdyb3VwKSB7CisgICAgdGhpcy5jdXJyZW50TWV0R3JvdXAgPSBjdXJyZW50TWV0R3JvdXA7CisgICAgdGhpcy5jaGFuZ2UgPSB0cnVlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50TWV0R3JvdXAoKSB7CisgICAgcmV0dXJuIHRoaXMuY3VycmVudE1ldEdyb3VwOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jaGFuZ2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBzYXZlKCkgeworICAgIGlmICh0aGlzLmNoYW5nZSkgeworICAgICAgU3RhY2s8Vmlld1N0YXRlPiBzdGFjayA9IHVuZG9IaXN0b3J5LmdldCh0aGlzLmlkKTsKKyAgICAgIGlmIChzdGFjayA9PSBudWxsKQorICAgICAgICBzdGFjayA9IG5ldyBTdGFjazxWaWV3U3RhdGU+KCk7CisgICAgICBpZiAoc3RhY2suc2l6ZSgpID49IDEwMCkKKyAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOworICAgICAgc3RhY2sucHVzaCh0aGlzLmNsb25lKCkpOworICAgICAgdW5kb0hpc3RvcnkucHV0KHRoaXMuaWQsIHN0YWNrKTsKKyAgICAgIHRoaXMuY2hhbmdlID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdW5kbygpIHsKKyAgICBTdGFjazxWaWV3U3RhdGU+IHN0YWNrID0gdW5kb0hpc3RvcnkuZ2V0KHRoaXMuaWQpOworICAgIGlmIChzdGFjayAhPSBudWxsICYmICFzdGFjay5lbXB0eSgpKSB7CisgICAgICB0aGlzLmNsb25lKHN0YWNrLnBvcCgpKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldEdyYXBoSWRzKCkpOworICAgICAgdGhpcy5jaGFuZ2UgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9uZShWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICB0aGlzLmdyYXBocyA9IG51bGw7CisgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7CisgICAgaWYgKHN0YXRlLmdyYXBocyAhPSBudWxsKSB7CisgICAgICB0aGlzLmdyYXBocyA9IG5ldyBWZWN0b3I8TW9kZWxHcmFwaD4oKTsKKyAgICAgIGZvciAoTW9kZWxHcmFwaCBncmFwaCA6IHN0YXRlLmdyYXBocykKKyAgICAgICAgdGhpcy5ncmFwaHMuYWRkKGdyYXBoLmNsb25lKCkpOworICAgICAgaWYgKHN0YXRlLnNlbGVjdGVkICE9IG51bGwpCisgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBHdWlVdGlscy5maW5kKHRoaXMuZ3JhcGhzLCBzdGF0ZS5zZWxlY3RlZC5nZXRNb2RlbCgpCisgICAgICAgICAgICAuZ2V0TW9kZWxJZCgpKTsKKyAgICB9CisgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IE1ldGFkYXRhKHN0YXRlLnByb3BlcnRpZXMpOworICAgIHRoaXMuaWQgPSBzdGF0ZS5pZDsKKyAgICB0aGlzLmN1cnJlbnRNZXRHcm91cCA9IHN0YXRlLmN1cnJlbnRNZXRHcm91cDsKKyAgICB0aGlzLm1vZGUgPSBzdGF0ZS5tb2RlOworICB9CisKKyAgcHVibGljIFZpZXdTdGF0ZSBjbG9uZSgpIHsKKyAgICBMaXN0PE1vZGVsR3JhcGg+IGNsb25lR3JhcGhzID0gbnVsbDsKKyAgICBNb2RlbEdyYXBoIHNlbGVjdGVkID0gbnVsbDsKKyAgICBpZiAodGhpcy5ncmFwaHMgIT0gbnVsbCkgeworICAgICAgY2xvbmVHcmFwaHMgPSBuZXcgVmVjdG9yPE1vZGVsR3JhcGg+KCk7CisgICAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiB0aGlzLmdyYXBocykKKyAgICAgICAgY2xvbmVHcmFwaHMuYWRkKGdyYXBoLmNsb25lKCkpOworICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQgIT0gbnVsbCkKKyAgICAgICAgc2VsZWN0ZWQgPSBHdWlVdGlscy5maW5kKGNsb25lR3JhcGhzLCB0aGlzLnNlbGVjdGVkLmdldE1vZGVsKCkKKyAgICAgICAgICAgIC5nZXRNb2RlbElkKCkpOworICAgIH0KKyAgICBWaWV3U3RhdGUgY2xvbmUgPSBuZXcgVmlld1N0YXRlKHRoaXMuZmlsZSwgc2VsZWN0ZWQsIGNsb25lR3JhcGhzLAorICAgICAgICB0aGlzLmdsb2JhbENvbmZpZ0dyb3Vwcyk7CisgICAgY2xvbmUuaWQgPSB0aGlzLmlkOworICAgIGNsb25lLmZpbGUgPSB0aGlzLmZpbGU7CisgICAgY2xvbmUuY3VycmVudE1ldEdyb3VwID0gdGhpcy5jdXJyZW50TWV0R3JvdXA7CisgICAgY2xvbmUucHJvcGVydGllcyA9IG5ldyBNZXRhZGF0YSh0aGlzLnByb3BlcnRpZXMpOworICAgIGNsb25lLm1vZGUgPSB0aGlzLm1vZGU7CisgICAgcmV0dXJuIGNsb25lOworICB9CisKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5pZC5oYXNoQ29kZSgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgVmlld1N0YXRlICYmIHRoaXMuaWQuZXF1YWxzKCgoVmlld1N0YXRlKSBvYmopLmlkKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0SWQoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0RlZmF1bHRQcm9wVmlldy5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvaW1wbC9EZWZhdWx0UHJvcFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNmYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvaW1wbC9EZWZhdWx0UHJvcFZpZXcuamF2YQpAQCAtMCwwICsxLDg1MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuaW1wbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5DaGVja2JveDsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CitpbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQb3B1cE1lbnU7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlNsaWRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxFdmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbFJlbmRlcmVyOworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tb2RlbC5Nb2RlbEdyYXBoOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsLkd1aVV0aWxzOworCisvKioKKyAqIAorICogCisgKiBUaGUgZGVmYXVsdCB2aWV3IGRpc3BsYXlpbmcgYSB3b3JrZmxvdyBwcm9wZXJ0eSAoZm9yIGEgdGFzaywgb3IgYSBjb25kaXRpb24sCisgKiBvciBzZXQgb2Ygd29ya2Zsb3dzKS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRQcm9wVmlldyBleHRlbmRzIFZpZXcgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTIxMDQ3MzAwNTUxOTc0ODk4TDsKKworICBwcml2YXRlIEpUYWJsZSB0YWJsZTsKKyAgcHJpdmF0ZSBKUG9wdXBNZW51IHRhYmxlTWVudTsKKyAgcHJpdmF0ZSBKTWVudUl0ZW0gb3ZlcnJpZGU7CisgIHByaXZhdGUgSk1lbnVJdGVtIGRlbGV0ZTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJSSURFID0gIk92ZXJyaWRlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJEZWxldGUiOworICBwcml2YXRlIGludCBERUZBVUxUX1BSSU9SSVRZID0gNTsKKworICBwdWJsaWMgRGVmYXVsdFByb3BWaWV3KFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIobmFtZSk7CisgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgfQorCisgIHByaXZhdGUgSlRhYmxlIGNyZWF0ZVRhYmxlKGZpbmFsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIEpUYWJsZSB0YWJsZSA9IG51bGw7CisgICAgZmluYWwgTW9kZWxHcmFwaCBzZWxlY3RlZCA9IHN0YXRlLmdldFNlbGVjdGVkKCk7CisgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKKyAgICAgIGZpbmFsIFZlY3RvcjxWZWN0b3I8U3RyaW5nPj4gcm93cyA9IG5ldyBWZWN0b3I8VmVjdG9yPFN0cmluZz4+KCk7CisgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBrZXlUb0dyb3VwTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICBNZXRhZGF0YSBzdGF0aWNNZXQgPSBzZWxlY3RlZC5nZXRNb2RlbCgpLmdldFN0YXRpY01ldGFkYXRhKCk7CisgICAgICBNZXRhZGF0YSBpbmhlcml0ZWRNZXQgPSBzZWxlY3RlZC5nZXRJbmhlcml0ZWRTdGF0aWNNZXRhZGF0YShzdGF0ZSk7CisgICAgICBNZXRhZGF0YSBjb21wbGV0ZU1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgaWYgKHN0YXRpY01ldCAhPSBudWxsKSB7CisgICAgICAgIGNvbXBsZXRlTWV0LnJlcGxhY2VNZXRhZGF0YShzdGF0aWNNZXQuZ2V0U3ViTWV0YWRhdGEoc3RhdGUKKyAgICAgICAgICAgIC5nZXRDdXJyZW50TWV0R3JvdXAoKSkpOworICAgICAgfQorICAgICAgaWYgKHNlbGVjdGVkLmdldE1vZGVsKCkuZ2V0RXh0ZW5kc0NvbmZpZygpICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgY29uZmlnR3JvdXAgOiBzZWxlY3RlZC5nZXRNb2RlbCgpLmdldEV4dGVuZHNDb25maWcoKSkgeworICAgICAgICAgIE1ldGFkYXRhIGV4dGVuZHNNZXRhZGF0YSA9IHN0YXRlLmdldEdsb2JhbENvbmZpZ0dyb3VwcygpCisgICAgICAgICAgICAgIC5nZXQoY29uZmlnR3JvdXApLmdldE1ldGFkYXRhKCkKKyAgICAgICAgICAgICAgLmdldFN1Yk1ldGFkYXRhKHN0YXRlLmdldEN1cnJlbnRNZXRHcm91cCgpKTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBleHRlbmRzTWV0YWRhdGEuZ2V0QWxsS2V5cygpKSB7CisgICAgICAgICAgICBpZiAoIWNvbXBsZXRlTWV0LmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAga2V5VG9Hcm91cE1hcC5wdXQoa2V5LCBjb25maWdHcm91cCk7CisgICAgICAgICAgICAgIGNvbXBsZXRlTWV0LnJlcGxhY2VNZXRhZGF0YShrZXksCisgICAgICAgICAgICAgICAgICBleHRlbmRzTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaW5oZXJpdGVkTWV0ICE9IG51bGwpIHsKKyAgICAgICAgTWV0YWRhdGEgaW5oZXJpdGVkTWV0YWRhdGEgPSBpbmhlcml0ZWRNZXQuZ2V0U3ViTWV0YWRhdGEoc3RhdGUKKyAgICAgICAgICAgIC5nZXRDdXJyZW50TWV0R3JvdXAoKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGluaGVyaXRlZE1ldGFkYXRhLmdldEFsbEtleXMoKSkgeworICAgICAgICAgIGlmICghY29tcGxldGVNZXQuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAga2V5VG9Hcm91cE1hcC5wdXQoa2V5LCAiX19pbmhlcml0ZWRfXyIpOworICAgICAgICAgICAgY29tcGxldGVNZXQucmVwbGFjZU1ldGFkYXRhKGtleSwKKyAgICAgICAgICAgICAgICBpbmhlcml0ZWRNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YShrZXkpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIExpc3Q8U3RyaW5nPiBrZXlzID0gY29tcGxldGVNZXQuZ2V0QWxsS2V5cygpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlzKTsKKyAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKKyAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgiL2VudlJlcGxhY2UiKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU3RyaW5nIHZhbHVlcyA9IFN0cmluZ1V0aWxzLmpvaW4oY29tcGxldGVNZXQuZ2V0QWxsTWV0YWRhdGEoa2V5KSwgIiwiKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gcm93ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIHJvdy5hZGQoa2V5VG9Hcm91cE1hcC5nZXQoa2V5KSk7CisgICAgICAgIHJvdy5hZGQoa2V5KTsKKyAgICAgICAgcm93LmFkZCh2YWx1ZXMpOworICAgICAgICByb3cuYWRkKEJvb2xlYW4udG9TdHJpbmcoQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29tcGxldGVNZXQKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YShrZXkgKyAiL2VudlJlcGxhY2UiKSkpKTsKKyAgICAgICAgcm93cy5hZGQocm93KTsKKyAgICAgIH0KKyAgICAgIHRhYmxlID0gbmV3IEpUYWJsZSgpOy8vIHJvd3MsIG5ldyBWZWN0b3I8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nW10geyAia2V5IiwgInZhbHVlcyIsICJlbnZSZXBsYWNlIiB9KSkpOworICAgICAgdGFibGUuc2V0TW9kZWwobmV3IEFic3RyYWN0VGFibGVNb2RlbCgpIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2wpIHsKKyAgICAgICAgICBzd2l0Y2ggKGNvbCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybiAiZ3JvdXAiOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAia2V5IjsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gInZhbHVlcyI7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuICJlbnZSZXBsYWNlIjsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKKyAgICAgICAgICByZXR1cm4gcm93cy5zaXplKCkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKKyAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93LCBpbnQgY29sKSB7CisgICAgICAgICAgaWYgKHJvdyA+PSByb3dzLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJvd3MuZ2V0KHJvdykuZ2V0KGNvbCk7CisgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgY29sID09IDMpCisgICAgICAgICAgICByZXR1cm4gImZhbHNlIjsKKyAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBjb2wgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAiX19sb2NhbF9fIjsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgICAgICAgaWYgKHJvdyA+PSByb3dzLnNpemUoKSkgeworICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmdldE1vZGVsKCkuZ2V0U3RhdGljTWV0YWRhdGEoKQorICAgICAgICAgICAgICAgIC5jb250YWluc0dyb3VwKHN0YXRlLmdldEN1cnJlbnRNZXRHcm91cCgpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNvbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIFN0cmluZyBrZXkgPSByb3dzLmdldChyb3cpLmdldCgxKTsKKyAgICAgICAgICBpZiAoa2V5ID09IG51bGwKKyAgICAgICAgICAgICAgfHwgKHNlbGVjdGVkLmdldE1vZGVsKCkuZ2V0U3RhdGljTWV0YWRhdGEoKSAhPSBudWxsICYmIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAuZ2V0TW9kZWwoKS5nZXRTdGF0aWNNZXRhZGF0YSgpCisgICAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkoZ2V0S2V5KGtleSwgc3RhdGUpKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICAgIGlmIChyb3cgPj0gcm93cy5zaXplKCkpIHsKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc+IG5ld1JvdyA9IG5ldyBWZWN0b3I8U3RyaW5nPihBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwgfSkpOworICAgICAgICAgICAgbmV3Um93LmFkZChjb2wsIChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgIHJvd3MuYWRkKG5ld1Jvdyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc+IHJvd1ZhbHVlcyA9IHJvd3MuZ2V0KHJvdyk7CisgICAgICAgICAgICByb3dWYWx1ZXMuYWRkKGNvbCwgKFN0cmluZykgdmFsdWUpOworICAgICAgICAgICAgcm93VmFsdWVzLnJlbW92ZShjb2wgKyAxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhpcy5maXJlVGFibGVDZWxsVXBkYXRlZChyb3csIGNvbCk7CisgICAgICAgIH0KKworICAgICAgfSk7CisgICAgICBNeVRhYmxlTGlzdGVuZXIgdGFibGVMaXN0ZW5lciA9IG5ldyBNeVRhYmxlTGlzdGVuZXIoc3RhdGUpOworICAgICAgdGFibGUuZ2V0TW9kZWwoKS5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGFibGVMaXN0ZW5lcik7CisgICAgICB0YWJsZS5nZXRTZWxlY3Rpb25Nb2RlbCgpLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcih0YWJsZUxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGUgPSBuZXcgSlRhYmxlKG5ldyBWZWN0b3I8VmVjdG9yPFN0cmluZz4+KCksIG5ldyBWZWN0b3I8U3RyaW5nPigKKyAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJrZXkiLCAidmFsdWVzIiwgImVudlJlcGxhY2UiIH0pKSk7CisgICAgfQorCisgICAgLy8gdGFibGUuc2V0RmlsbHNWaWV3cG9ydEhlaWdodCh0cnVlKTsKKyAgICB0YWJsZS5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKENvbG9yLmN5YW4pOworICAgIHRhYmxlLnNldEF1dG9SZXNpemVNb2RlKEpUYWJsZS5BVVRPX1JFU0laRV9PRkYpOworICAgIFRhYmxlQ2VsbFJlbmRlcmVyIGNlbGxSZW5kZXJlciA9IG5ldyBUYWJsZUNlbGxSZW5kZXJlcigpIHsKKworICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgdGFibGUsCisgICAgICAgICAgT2JqZWN0IHZhbHVlLCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csCisgICAgICAgICAgaW50IGNvbHVtbikgeworICAgICAgICBKTGFiZWwgZmllbGQgPSBuZXcgSkxhYmVsKChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgaWYgKGNvbHVtbiA9PSAwKSB7CisgICAgICAgICAgZmllbGQuc2V0Rm9yZWdyb3VuZChDb2xvci5ncmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkKKyAgICAgICAgICAgIGZpZWxkLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKDEpKTsKKyAgICAgICAgICBpZiAodGFibGUuaXNDZWxsRWRpdGFibGUocm93LCAxKSkKKyAgICAgICAgICAgIGZpZWxkLnNldEZvcmVncm91bmQoQ29sb3IuYmxhY2spOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkLnNldEZvcmVncm91bmQoQ29sb3IuZ3JheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgfQorCisgICAgfTsKKyAgICBUYWJsZUNvbHVtbiBncm91cENvbCA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKDApOworICAgIGdyb3VwQ29sLnNldFByZWZlcnJlZFdpZHRoKDc1KTsKKyAgICBncm91cENvbC5zZXRDZWxsUmVuZGVyZXIoY2VsbFJlbmRlcmVyKTsKKyAgICBUYWJsZUNvbHVtbiBrZXlDb2wgPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbigxKTsKKyAgICBrZXlDb2wuc2V0UHJlZmVycmVkV2lkdGgoMjAwKTsKKyAgICBrZXlDb2wuc2V0Q2VsbFJlbmRlcmVyKGNlbGxSZW5kZXJlcik7CisgICAgVGFibGVDb2x1bW4gdmFsdWVzQ29sID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oMik7CisgICAgdmFsdWVzQ29sLnNldFByZWZlcnJlZFdpZHRoKDMwMCk7CisgICAgdmFsdWVzQ29sLnNldENlbGxSZW5kZXJlcihjZWxsUmVuZGVyZXIpOworICAgIFRhYmxlQ29sdW1uIGVudlJlcGxhY2VDb2wgPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbigzKTsKKyAgICBlbnZSZXBsYWNlQ29sLnNldFByZWZlcnJlZFdpZHRoKDc1KTsKKyAgICBlbnZSZXBsYWNlQ29sLnNldENlbGxSZW5kZXJlcihjZWxsUmVuZGVyZXIpOworCisgICAgdGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VMaXN0ZW5lcigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgaWYgKGUuZ2V0QnV0dG9uKCkgPT0gTW91c2VFdmVudC5CVVRUT04zCisgICAgICAgICAgICAmJiBEZWZhdWx0UHJvcFZpZXcudGhpcy50YWJsZS5nZXRTZWxlY3RlZFJvdygpICE9IC0xKSB7CisgICAgICAgICAgaW50IHJvdyA9IERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLmdldFNlbGVjdGVkUm93KCk7Ly8gcm93QXRQb2ludChEZWZhdWx0UHJvcFZpZXcudGhpcy50YWJsZS5nZXRNb3VzZVBvc2l0aW9uKCkpOworICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkoCisgICAgICAgICAgICAgIChTdHJpbmcpIERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLmdldFZhbHVlQXQocm93LCAxKSwgc3RhdGUpOworICAgICAgICAgIE1ldGFkYXRhIHN0YXRpY01ldCA9IHN0YXRlLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKQorICAgICAgICAgICAgICAuZ2V0U3RhdGljTWV0YWRhdGEoKTsKKyAgICAgICAgICBvdmVycmlkZS5zZXRWaXNpYmxlKHN0YXRpY01ldCA9PSBudWxsIHx8ICFzdGF0aWNNZXQuY29udGFpbnNLZXkoa2V5KSk7CisgICAgICAgICAgZGVsZXRlLnNldFZpc2libGUoc3RhdGljTWV0ICE9IG51bGwgJiYgc3RhdGljTWV0LmNvbnRhaW5zS2V5KGtleSkpOworICAgICAgICAgIHRhYmxlTWVudS5zaG93KERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLCBlLmdldFgoKSwgZS5nZXRZKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKSB7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiB0YWJsZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWZyZXNoVmlldyhmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICB0aGlzLnJlbW92ZUFsbCgpOworCisgICAgdGFibGVNZW51ID0gbmV3IEpQb3B1cE1lbnUoIlRhYmxlTWVudSIpOworICAgIHRoaXMuYWRkKHRhYmxlTWVudSk7CisgICAgb3ZlcnJpZGUgPSBuZXcgSk1lbnVJdGVtKE9WRVJSSURFKTsKKyAgICBvdmVycmlkZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICBpbnQgcm93ID0gRGVmYXVsdFByb3BWaWV3LnRoaXMudGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsvLyByb3dBdFBvaW50KERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLmdldE1vdXNlUG9zaXRpb24oKSk7CisgICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkoCisgICAgICAgICAgICAoU3RyaW5nKSBEZWZhdWx0UHJvcFZpZXcudGhpcy50YWJsZS5nZXRWYWx1ZUF0KHJvdywgMSksIHN0YXRlKTsKKyAgICAgICAgTWV0YWRhdGEgc3RhdGljTWV0ID0gc3RhdGUuZ2V0U2VsZWN0ZWQoKS5nZXRNb2RlbCgpLmdldFN0YXRpY01ldGFkYXRhKCk7CisgICAgICAgIGlmIChzdGF0aWNNZXQgPT0gbnVsbCkKKyAgICAgICAgICBzdGF0aWNNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgaWYgKGUuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhPVkVSUklERSkpIHsKKyAgICAgICAgICBpZiAoIXN0YXRpY01ldC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICBzdGF0aWNNZXQuYWRkTWV0YWRhdGEoa2V5LAorICAgICAgICAgICAgICAgIChTdHJpbmcpIERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLmdldFZhbHVlQXQocm93LCAyKSk7CisgICAgICAgICAgICBTdHJpbmcgZW52UmVwbGFjZSA9IChTdHJpbmcpIERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLmdldFZhbHVlQXQoCisgICAgICAgICAgICAgICAgcm93LCAzKTsKKyAgICAgICAgICAgIGlmIChCb29sZWFuLnZhbHVlT2YoZW52UmVwbGFjZSkpCisgICAgICAgICAgICAgIHN0YXRpY01ldC5hZGRNZXRhZGF0YShrZXkgKyAiL2VudlJlcGxhY2UiLCBlbnZSZXBsYWNlKTsKKyAgICAgICAgICAgIHN0YXRlLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKS5zZXRTdGF0aWNNZXRhZGF0YShzdGF0aWNNZXQpOworICAgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgZGVsZXRlID0gbmV3IEpNZW51SXRlbShERUxFVEUpOworICAgIGRlbGV0ZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgIGludCByb3cgPSBEZWZhdWx0UHJvcFZpZXcudGhpcy50YWJsZS5nZXRTZWxlY3RlZFJvdygpOy8vIHJvd0F0UG9pbnQoRGVmYXVsdFByb3BWaWV3LnRoaXMudGFibGUuZ2V0TW91c2VQb3NpdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIGtleSA9IGdldEtleSgKKyAgICAgICAgICAgIChTdHJpbmcpIERlZmF1bHRQcm9wVmlldy50aGlzLnRhYmxlLmdldFZhbHVlQXQocm93LCAxKSwgc3RhdGUpOworICAgICAgICBNZXRhZGF0YSBzdGF0aWNNZXQgPSBzdGF0ZS5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkuZ2V0U3RhdGljTWV0YWRhdGEoKTsKKyAgICAgICAgaWYgKHN0YXRpY01ldCA9PSBudWxsKQorICAgICAgICAgIHN0YXRpY01ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBzdGF0aWNNZXQucmVtb3ZlTWV0YWRhdGEoa2V5KTsKKyAgICAgICAgc3RhdGljTWV0LnJlbW92ZU1ldGFkYXRhKGtleSArICIvZW52UmVwbGFjZSIpOworICAgICAgICBzdGF0ZS5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkuc2V0U3RhdGljTWV0YWRhdGEoc3RhdGljTWV0KTsKKyAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICB9CisKKyAgICB9KTsKKyAgICB0YWJsZU1lbnUuYWRkKG92ZXJyaWRlKTsKKyAgICB0YWJsZU1lbnUuYWRkKGRlbGV0ZSk7CisKKyAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWQoKSAhPSBudWxsKSB7CisgICAgICBKUGFuZWwgbWFzdGVyUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICBtYXN0ZXJQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChtYXN0ZXJQYW5lbCwgQm94TGF5b3V0LllfQVhJUykpOworICAgICAgbWFzdGVyUGFuZWwuYWRkKHRoaXMuZ2V0TW9kZWxJZFBhbmVsKHN0YXRlLmdldFNlbGVjdGVkKCksIHN0YXRlKSk7CisgICAgICBtYXN0ZXJQYW5lbC5hZGQodGhpcy5nZXRNb2RlbE5hbWVQYW5lbChzdGF0ZS5nZXRTZWxlY3RlZCgpLCBzdGF0ZSkpOworICAgICAgaWYgKCFzdGF0ZS5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkuaXNQYXJlbnRUeXBlKCkpCisgICAgICAgIG1hc3RlclBhbmVsLmFkZCh0aGlzLmdldEluc3RhbmNlQ2xhc3NQYW5lbChzdGF0ZS5nZXRTZWxlY3RlZCgpLCBzdGF0ZSkpOworICAgICAgbWFzdGVyUGFuZWwuYWRkKHRoaXMuZ2V0RXhlY3V0aW9uVHlwZVBhbmVsKHN0YXRlLmdldFNlbGVjdGVkKCksIHN0YXRlKSk7CisgICAgICBtYXN0ZXJQYW5lbC5hZGQodGhpcy5nZXRQcmlvcml0eVBhbmVsKHN0YXRlKSk7CisgICAgICBtYXN0ZXJQYW5lbC5hZGQodGhpcy5nZXRFeGVjdXNlZElkcyhzdGF0ZS5nZXRTZWxlY3RlZCgpKSk7CisgICAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWQoKS5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKS5lcXVhbHMoImNvbmRpdGlvbiIpKSB7CisgICAgICAgIG1hc3RlclBhbmVsLmFkZCh0aGlzLmdldFRpbWVvdXQoc3RhdGUuZ2V0U2VsZWN0ZWQoKSwgc3RhdGUpKTsKKyAgICAgICAgbWFzdGVyUGFuZWwuYWRkKHRoaXMuZ2V0T3B0aW9uYWwoc3RhdGUuZ2V0U2VsZWN0ZWQoKSwgc3RhdGUpKTsKKyAgICAgIH0KKyAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGFibGUgPSB0aGlzLmNyZWF0ZVRhYmxlKHN0YXRlKSwKKyAgICAgICAgICBKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQUxXQVlTLAorICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FMV0FZUyk7CisgICAgICBzY3JvbGxQYW5lLmdldEhvcml6b250YWxTY3JvbGxCYXIoKS5zZXRVbml0SW5jcmVtZW50KDEwKTsKKyAgICAgIHNjcm9sbFBhbmUuZ2V0VmVydGljYWxTY3JvbGxCYXIoKS5zZXRVbml0SW5jcmVtZW50KDEwKTsKKyAgICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICAgIHBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgcGFuZWwuc2V0Qm9yZGVyKG5ldyBFdGNoZWRCb3JkZXIoKSk7CisgICAgICBmaW5hbCBKTGFiZWwgbWV0TGFiZWwgPSBuZXcgSkxhYmVsKCJTdGF0aWMgTWV0YWRhdGEiKTsKKyAgICAgIG1ldExhYmVsLnNldEFsaWdubWVudFgoQ29tcG9uZW50LkNFTlRFUl9BTElHTk1FTlQpOworICAgICAgZmluYWwgSkxhYmVsIGV4dGVuZHNMYWJlbCA9IG5ldyBKTGFiZWwoIjxleHRlbmRzPiIpOworICAgICAgZXh0ZW5kc0xhYmVsLnNldEZvbnQobmV3IEZvbnQoIlNlcmlmIiwgRm9udC5QTEFJTiwgMTApKTsKKyAgICAgIGV4dGVuZHNMYWJlbC5zZXRBbGlnbm1lbnRYKENvbXBvbmVudC5DRU5URVJfQUxJR05NRU5UKTsKKyAgICAgIGV4dGVuZHNMYWJlbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgeworCisgICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgYXZhaWxhYmxlU2Nyb2xsZXI7CisgICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgbWluZVNjcm9sbGVyOworICAgICAgICBwcml2YXRlIEpMaXN0IG1pbmVMaXN0OworICAgICAgICBwcml2YXRlIEpMaXN0IGF2YWlsYWJsZUxpc3Q7CisgICAgICAgIHByaXZhdGUgRGVmYXVsdExpc3RNb2RlbCBtaW5lTW9kZWw7CisgICAgICAgIHByaXZhdGUgRGVmYXVsdExpc3RNb2RlbCBhdmFpbGFibGVNb2RlbDsKKworICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgZmluYWwgSlBvcHVwTWVudSBwb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7CisgICAgICAgICAgcG9wdXAuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisKKyAgICAgICAgICBKUGFuZWwgbWFpbiA9IG5ldyBKUGFuZWwoKTsKKyAgICAgICAgICBtYWluLnNldExheW91dChuZXcgQm94TGF5b3V0KG1haW4sIEJveExheW91dC5YX0FYSVMpKTsKKworICAgICAgICAgIEpQYW5lbCBtaW5lID0gbmV3IEpQYW5lbCgpOworICAgICAgICAgIG1pbmUuc2V0Qm9yZGVyKG5ldyBFdGNoZWRCb3JkZXIoKSk7CisgICAgICAgICAgbWluZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICBKTGFiZWwgbWluZUxhYmVsID0gbmV3IEpMYWJlbCgiTWluZSIpOworICAgICAgICAgIG1pbmVTY3JvbGxlciA9IG5ldyBKU2Nyb2xsUGFuZShtaW5lTGlzdCA9IGNyZWF0ZUpMaXN0KAorICAgICAgICAgICAgICBtaW5lTW9kZWwgPSBuZXcgRGVmYXVsdExpc3RNb2RlbCgpLCBzdGF0ZS5nZXRTZWxlY3RlZCgpCisgICAgICAgICAgICAgICAgICAuZ2V0TW9kZWwoKS5nZXRFeHRlbmRzQ29uZmlnKCkpKTsKKyAgICAgICAgICBtaW5lU2Nyb2xsZXIuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDI1MCwgODApKTsKKyAgICAgICAgICBtaW5lLmFkZChtaW5lTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgICAgbWluZS5hZGQobWluZVNjcm9sbGVyLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKworICAgICAgICAgIEpQYW5lbCBhdmFpbGFibGUgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgYXZhaWxhYmxlLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOworICAgICAgICAgIGF2YWlsYWJsZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICBKTGFiZWwgYXZhaWxhYmxlTGFiZWwgPSBuZXcgSkxhYmVsKCJBdmFpbGFibGUiKTsKKyAgICAgICAgICBWZWN0b3I8U3RyaW5nPiBhdmFpbGFibGVHcm91cHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oc3RhdGUKKyAgICAgICAgICAgICAgLmdldEdsb2JhbENvbmZpZ0dyb3VwcygpLmtleVNldCgpKTsKKyAgICAgICAgICBhdmFpbGFibGVHcm91cHMucmVtb3ZlQWxsKHN0YXRlLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKQorICAgICAgICAgICAgICAuZ2V0RXh0ZW5kc0NvbmZpZygpKTsKKyAgICAgICAgICBhdmFpbGFibGVTY3JvbGxlciA9IG5ldyBKU2Nyb2xsUGFuZShhdmFpbGFibGVMaXN0ID0gdGhpcy5jcmVhdGVKTGlzdCgKKyAgICAgICAgICAgICAgYXZhaWxhYmxlTW9kZWwgPSBuZXcgRGVmYXVsdExpc3RNb2RlbCgpLCBhdmFpbGFibGVHcm91cHMpKTsKKyAgICAgICAgICBhdmFpbGFibGVTY3JvbGxlci5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oMjUwLCA4MCkpOworICAgICAgICAgIGF2YWlsYWJsZS5hZGQoYXZhaWxhYmxlTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgICAgYXZhaWxhYmxlLmFkZChhdmFpbGFibGVTY3JvbGxlciwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisKKyAgICAgICAgICBKUGFuZWwgYnV0dG9ucyA9IG5ldyBKUGFuZWwoKTsKKyAgICAgICAgICBidXR0b25zLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvbnMsIEJveExheW91dC5ZX0FYSVMpKTsKKyAgICAgICAgICBKQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCI8LS0tIik7CisgICAgICAgICAgYWRkQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkID0gYXZhaWxhYmxlTGlzdC5nZXRTZWxlY3RlZFZhbHVlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZz4gZXh0ZW5kc0NvbmZpZyA9IG5ldyBWZWN0b3I8U3RyaW5nPihzdGF0ZQorICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKS5nZXRFeHRlbmRzQ29uZmlnKCkpOworICAgICAgICAgICAgICBleHRlbmRzQ29uZmlnLmFkZChzZWxlY3RlZCk7CisgICAgICAgICAgICAgIHN0YXRlLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKS5zZXRFeHRlbmRzQ29uZmlnKGV4dGVuZHNDb25maWcpOworICAgICAgICAgICAgICBhdmFpbGFibGVNb2RlbC5yZW1vdmUoYXZhaWxhYmxlTGlzdC5nZXRTZWxlY3RlZEluZGV4KCkpOworICAgICAgICAgICAgICBtaW5lTW9kZWwuYWRkRWxlbWVudChzZWxlY3RlZCk7CisgICAgICAgICAgICAgIHBvcHVwLnJldmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0pOworICAgICAgICAgIEpCdXR0b24gcmVtb3ZlQnV0dG9uID0gbmV3IEpCdXR0b24oIi0tLT4iKTsKKyAgICAgICAgICByZW1vdmVCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0ZWQgPSBtaW5lTGlzdC5nZXRTZWxlY3RlZFZhbHVlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZz4gZXh0ZW5kc0NvbmZpZyA9IG5ldyBWZWN0b3I8U3RyaW5nPihzdGF0ZQorICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKS5nZXRFeHRlbmRzQ29uZmlnKCkpOworICAgICAgICAgICAgICBleHRlbmRzQ29uZmlnLnJlbW92ZShzZWxlY3RlZCk7CisgICAgICAgICAgICAgIHN0YXRlLmdldFNlbGVjdGVkKCkuZ2V0TW9kZWwoKS5zZXRFeHRlbmRzQ29uZmlnKGV4dGVuZHNDb25maWcpOworICAgICAgICAgICAgICBtaW5lTW9kZWwucmVtb3ZlKG1pbmVMaXN0LmdldFNlbGVjdGVkSW5kZXgoKSk7CisgICAgICAgICAgICAgIGF2YWlsYWJsZU1vZGVsLmFkZEVsZW1lbnQoc2VsZWN0ZWQpOworICAgICAgICAgICAgICBwb3B1cC5yZXZhbGlkYXRlKCk7CisgICAgICAgICAgICAgIERlZmF1bHRQcm9wVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUVudGVyZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBidXR0b25zLmFkZChhZGRCdXR0b24pOworICAgICAgICAgIGJ1dHRvbnMuYWRkKHJlbW92ZUJ1dHRvbik7CisKKyAgICAgICAgICBtYWluLmFkZChtaW5lKTsKKyAgICAgICAgICBtYWluLmFkZChidXR0b25zKTsKKyAgICAgICAgICBtYWluLmFkZChhdmFpbGFibGUpOworICAgICAgICAgIHBvcHVwLmFkZChtYWluLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgICBwb3B1cC5zaG93KGV4dGVuZHNMYWJlbCwgZS5nZXRYKCksIGUuZ2V0WSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICBleHRlbmRzTGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5ibHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgIGV4dGVuZHNMYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLmJsYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEpMaXN0IGNyZWF0ZUpMaXN0KERlZmF1bHRMaXN0TW9kZWwgbW9kZWwsCisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCkgeworICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogbGlzdCkKKyAgICAgICAgICAgIG1vZGVsLmFkZEVsZW1lbnQodmFsdWUpOworICAgICAgICAgIEpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG1vZGVsKTsKKyAgICAgICAgICBqTGlzdC5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfSU5URVJWQUxfU0VMRUNUSU9OKTsKKyAgICAgICAgICBqTGlzdC5zZXRMYXlvdXRPcmllbnRhdGlvbihKTGlzdC5WRVJUSUNBTCk7CisgICAgICAgICAgcmV0dXJuIGpMaXN0OworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIEpMYWJlbCBtZXRHcm91cExhYmVsID0gbmV3IEpMYWJlbCgiKFN1Yi1Hcm91cDogIgorICAgICAgICAgICsgKHN0YXRlLmdldEN1cnJlbnRNZXRHcm91cCgpICE9IG51bGwgPyBzdGF0ZS5nZXRDdXJyZW50TWV0R3JvdXAoKQorICAgICAgICAgICAgICA6ICI8YmFzZT4iKSArICIpIik7CisgICAgICBtZXRHcm91cExhYmVsLnNldEFsaWdubWVudFgoQ29tcG9uZW50LkNFTlRFUl9BTElHTk1FTlQpOworICAgICAgSlBhbmVsIGxhYmVsUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICBsYWJlbFBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGxhYmVsUGFuZWwsIEJveExheW91dC5ZX0FYSVMpKTsKKyAgICAgIEpQYW5lbCB0b3AgPSBuZXcgSlBhbmVsKCk7CisgICAgICB0b3Auc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodG9wLCBCb3hMYXlvdXQuWV9BWElTKSk7CisgICAgICB0b3AuYWRkKGV4dGVuZHNMYWJlbCk7CisgICAgICB0b3AuYWRkKG1ldExhYmVsKTsKKyAgICAgIGxhYmVsUGFuZWwuYWRkKHRvcCk7CisgICAgICBsYWJlbFBhbmVsLmFkZChtZXRHcm91cExhYmVsKTsKKyAgICAgIHBhbmVsLmFkZChsYWJlbFBhbmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgcGFuZWwuYWRkKHNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgbWFzdGVyUGFuZWwuYWRkKHBhbmVsKTsKKyAgICAgIHRoaXMuYWRkKG1hc3RlclBhbmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5hZGQobmV3IEpQYW5lbCgpKTsKKyAgICB9CisgICAgdGhpcy5yZXZhbGlkYXRlKCk7CisgIH0KKworICBwcml2YXRlIEpQYW5lbCBnZXRUaW1lb3V0KGZpbmFsIE1vZGVsR3JhcGggZ3JhcGgsIGZpbmFsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICBwYW5lbC5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigpKTsKKyAgICBwYW5lbC5hZGQobmV3IEpMYWJlbCgiVGltZW91dDoiKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICBKVGV4dEZpZWxkIGZpZWxkID0gbmV3IEpUZXh0RmllbGQoU3RyaW5nLnZhbHVlT2YoZ3JhcGguZ2V0TW9kZWwoKQorICAgICAgICAuZ2V0VGltZW91dCgpKSwgNTApOworICAgIGZpZWxkLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgaWYgKCFncmFwaC5nZXRNb2RlbCgpLmdldE1vZGVsSWQoKS5lcXVhbHMoZS5nZXRBY3Rpb25Db21tYW5kKCkpKSB7CisgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5zZXRUaW1lb3V0KExvbmcudmFsdWVPZigKKyAgICAgICAgICAgICAgZS5nZXRBY3Rpb25Db21tYW5kKCkgIT0gbnVsbCAmJiAKKyAgICAgICAgICAgICAgIWUuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscygiIikgPyAKKyAgICAgICAgICAgICAgICAgIGUuZ2V0QWN0aW9uQ29tbWFuZCgpOiItMSIpKTsKKyAgICAgICAgICBEZWZhdWx0UHJvcFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICBEZWZhdWx0UHJvcFZpZXcudGhpcy5yZWZyZXNoVmlldyhzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0pOworICAgIHBhbmVsLmFkZChmaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgcmV0dXJuIHBhbmVsOworICB9CisKKyAgcHJpdmF0ZSBKUGFuZWwgZ2V0TW9kZWxJZFBhbmVsKGZpbmFsIE1vZGVsR3JhcGggZ3JhcGgsIGZpbmFsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICBwYW5lbC5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigpKTsKKyAgICBwYW5lbC5hZGQobmV3IEpMYWJlbCgiTW9kZWxJZDoiKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICBKVGV4dEZpZWxkIGZpZWxkID0gbmV3IEpUZXh0RmllbGQoZ3JhcGguZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCksIDUwKTsKKyAgICBmaWVsZC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgIGlmICghZ3JhcGguZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCkuZXF1YWxzKGUuZ2V0QWN0aW9uQ29tbWFuZCgpKSkgeworICAgICAgICAgIEd1aVV0aWxzLnVwZGF0ZUdyYXBoTW9kZWxJZChzdGF0ZSwgZ3JhcGguZ2V0TW9kZWwoKS5nZXRJZCgpLAorICAgICAgICAgICAgICBlLmdldEFjdGlvbkNvbW1hbmQoKSk7CisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMucmVmcmVzaFZpZXcoc3RhdGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9KTsKKyAgICBwYW5lbC5hZGQoZmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgIHJldHVybiBwYW5lbDsKKyAgfQorCisgIHByaXZhdGUgSlBhbmVsIGdldE1vZGVsTmFtZVBhbmVsKGZpbmFsIE1vZGVsR3JhcGggZ3JhcGgsIGZpbmFsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICBwYW5lbC5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigpKTsKKyAgICBwYW5lbC5hZGQobmV3IEpMYWJlbCgiTW9kZWxOYW1lOiIpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgIEpUZXh0RmllbGQgZmllbGQgPSBuZXcgSlRleHRGaWVsZChncmFwaC5nZXRNb2RlbCgpLmdldE1vZGVsTmFtZSgpLCA1MCk7CisgICAgZmllbGQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICBpZiAoIWdyYXBoLmdldE1vZGVsKCkuZ2V0TW9kZWxOYW1lKCkuZXF1YWxzKGUuZ2V0QWN0aW9uQ29tbWFuZCgpKSkgeworICAgICAgICAgIC8vIEd1aVV0aWxzLnVwZGF0ZUdyYXBoTW9kZWxOYW1lKGdldFN0YXRlKCksCisgICAgICAgICAgLy8gZ3JhcGguZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCksIGUuZ2V0QWN0aW9uQ29tbWFuZCgpKTsKKyAgICAgICAgICBncmFwaC5nZXRNb2RlbCgpLnNldE1vZGVsTmFtZShlLmdldEFjdGlvbkNvbW1hbmQoKSk7CisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMucmVmcmVzaFZpZXcoc3RhdGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9KTsKKyAgICBwYW5lbC5hZGQoZmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgIHJldHVybiBwYW5lbDsKKyAgfQorCisgIHByaXZhdGUgSlBhbmVsIGdldEluc3RhbmNlQ2xhc3NQYW5lbChmaW5hbCBNb2RlbEdyYXBoIGdyYXBoLAorICAgICAgZmluYWwgVmlld1N0YXRlIHN0YXRlKSB7CisgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOworICAgIHBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgIHBhbmVsLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOworICAgIHBhbmVsLmFkZChuZXcgSkxhYmVsKCJJbnN0YW5jZUNsYXNzOiIpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgIEpUZXh0RmllbGQgZmllbGQgPSBuZXcgSlRleHRGaWVsZChncmFwaC5nZXRNb2RlbCgpLmdldEluc3RhbmNlQ2xhc3MoKSwgNTApOworICAgIGZpZWxkLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgaWYgKGdyYXBoLmdldE1vZGVsKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IG51bGwKKyAgICAgICAgICAgIHx8ICFncmFwaC5nZXRNb2RlbCgpLmdldEluc3RhbmNlQ2xhc3MoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoZS5nZXRBY3Rpb25Db21tYW5kKCkpKSB7CisgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5zZXRJbnN0YW5jZUNsYXNzKGUuZ2V0QWN0aW9uQ29tbWFuZCgpKTsKKyAgICAgICAgICBEZWZhdWx0UHJvcFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICBEZWZhdWx0UHJvcFZpZXcudGhpcy5yZWZyZXNoVmlldyhzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0pOworICAgIHBhbmVsLmFkZChmaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgcmV0dXJuIHBhbmVsOworICB9CisKKyAgcHJpdmF0ZSBKUGFuZWwgZ2V0UHJpb3JpdHlQYW5lbChmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgcGFuZWwuc2V0Qm9yZGVyKG5ldyBFdGNoZWRCb3JkZXIoKSk7CisgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgcGFuZWwuYWRkKG5ldyBKTGFiZWwoIlByaW9yaXR5OiAgIiksIEJvcmRlckxheW91dC5XRVNUKTsKKyAgICBmaW5hbCBKTGFiZWwgcHJpb3JpdHlMYWJlbCA9IG5ldyBKTGFiZWwoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9QUklPUklUWSkpOworICAgIHBhbmVsLmFkZChwcmlvcml0eUxhYmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICBKU2xpZGVyIHNsaWRlciA9IG5ldyBKU2xpZGVyKDAsIDEwMCwgKGludCkgNSAqIDEwKTsKKyAgICBzbGlkZXIuc2V0TWFqb3JUaWNrU3BhY2luZygxMCk7CisgICAgc2xpZGVyLnNldE1pbm9yVGlja1NwYWNpbmcoMSk7CisgICAgc2xpZGVyLnNldFBhaW50TGFiZWxzKHRydWUpOworICAgIHNsaWRlci5zZXRQYWludFRpY2tzKHRydWUpOworICAgIHNsaWRlci5zZXRTbmFwVG9UaWNrcyhmYWxzZSk7CisgICAgRm9ybWF0IGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiMC4wIik7CisgICAgSGFzaHRhYmxlPEludGVnZXIsIEpDb21wb25lbnQ+IGxhYmVscyA9IG5ldyBIYXNodGFibGU8SW50ZWdlciwgSkNvbXBvbmVudD4oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSAxMDsgaSArPSAyKSB7CisgICAgICBKTGFiZWwgbGFiZWwgPSBuZXcgSkxhYmVsKGYuZm9ybWF0KGkpKTsKKyAgICAgIGxhYmVsLnNldEZvbnQobGFiZWwuZ2V0Rm9udCgpLmRlcml2ZUZvbnQoRm9udC5QTEFJTikpOworICAgICAgbGFiZWxzLnB1dChpICogMTAsIGxhYmVsKTsKKyAgICB9CisgICAgc2xpZGVyLnNldExhYmVsVGFibGUobGFiZWxzKTsKKyAgICBzbGlkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IENoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgeworICAgICAgICBkb3VibGUgdmFsdWUgPSAoKEpTbGlkZXIpIGUuZ2V0U291cmNlKCkpLmdldFZhbHVlKCkgLyAxMC4wOworICAgICAgICBwcmlvcml0eUxhYmVsLnNldFRleHQodmFsdWUgKyAiIik7CisgICAgICAgIHByaW9yaXR5TGFiZWwucmV2YWxpZGF0ZSgpOworICAgICAgICBpZiAoISgoSlNsaWRlcikgZS5nZXRTb3VyY2UoKSkuZ2V0VmFsdWVJc0FkanVzdGluZygpKSB7CisgICAgICAgICAgLy8gRklYTUU6IGRlYWwgd2l0aCBwcmlvcml0aWVzCisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0pOworCisgICAgcGFuZWwuYWRkKHNsaWRlciwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKyAgICByZXR1cm4gcGFuZWw7CisgIH0KKworICBwcml2YXRlIEpQYW5lbCBnZXRFeGVjdXRpb25UeXBlUGFuZWwoZmluYWwgTW9kZWxHcmFwaCBncmFwaCwKKyAgICAgIGZpbmFsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICBwYW5lbC5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigpKTsKKyAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICBwYW5lbC5hZGQobmV3IEpMYWJlbCgiRXhlY3V0aW9uVHlwZToiKSwgQm9yZGVyTGF5b3V0LldFU1QpOworICAgIEpDb21ib0JveCBjb21ib0JveCA9IG5ldyBKQ29tYm9Cb3goKTsKKyAgICBpZiAoZ3JhcGguaGFzQ2hpbGRyZW4oKSkgeworICAgICAgY29tYm9Cb3guYWRkSXRlbSgicGFyYWxsZWwiKTsKKyAgICAgIGNvbWJvQm94LmFkZEl0ZW0oInNlcXVlbnRpYWwiKTsKKyAgICB9IGVsc2UgaWYgKGdyYXBoLmdldE1vZGVsKCkuZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygidGFzayIpKSB7CisgICAgICBjb21ib0JveC5hZGRJdGVtKCJwYXJhbGxlbCIpOworICAgICAgY29tYm9Cb3guYWRkSXRlbSgic2VxdWVudGlhbCIpOworICAgICAgY29tYm9Cb3guYWRkSXRlbSgidGFzayIpOworICAgIH0gZWxzZSBpZiAoZ3JhcGguaXNDb25kaXRpb24oKQorICAgICAgICB8fCBncmFwaC5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKS5lcXVhbHMoImNvbmRpdGlvbiIpKSB7CisgICAgICBjb21ib0JveC5hZGRJdGVtKCJwYXJhbGxlbCIpOworICAgICAgY29tYm9Cb3guYWRkSXRlbSgic2VxdWVudGlhbCIpOworICAgICAgY29tYm9Cb3guYWRkSXRlbSgiY29uZGl0aW9uIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbWJvQm94LmFkZEl0ZW0oInBhcmFsbGVsIik7CisgICAgICBjb21ib0JveC5hZGRJdGVtKCJzZXF1ZW50aWFsIik7CisgICAgICBjb21ib0JveC5hZGRJdGVtKCJ0YXNrIik7CisgICAgfQorICAgIGNvbWJvQm94LnNldFNlbGVjdGVkSXRlbShncmFwaC5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKSk7CisgICAgY29tYm9Cb3guYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7CisgICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7CisgICAgICAgIGlmICghZ3JhcGguZ2V0TW9kZWwoKS5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKGUuZ2V0SXRlbSgpKSkgeworICAgICAgICAgIGdyYXBoLmdldE1vZGVsKCkuc2V0RXhlY3V0aW9uVHlwZSgoU3RyaW5nKSBlLmdldEl0ZW0oKSk7CisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMucmVmcmVzaFZpZXcoc3RhdGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgcGFuZWwuYWRkKGNvbWJvQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICByZXR1cm4gcGFuZWw7CisgIH0KKworICBwcml2YXRlIEpQYW5lbCBnZXRPcHRpb25hbChmaW5hbCBNb2RlbEdyYXBoIGdyYXBoLCBmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgcGFuZWwuc2V0Qm9yZGVyKG5ldyBFdGNoZWRCb3JkZXIoKSk7CisgICAgcGFuZWwuYWRkKG5ldyBKTGFiZWwoIk9wdGlvbmFsOiIpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgIEpQYW5lbCBjaGVja0JveGVzID0gbmV3IEpQYW5lbCgpOworICAgIGNoZWNrQm94ZXMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIDEpKTsKKyAgICBDaGVja2JveCBjaGVja2JveCA9IG5ldyBDaGVja2JveCgiaWdub3JlIiwgZ3JhcGguZ2V0TW9kZWwoKS5pc09wdGlvbmFsKCkpOworICAgIGNoZWNrQm94ZXMuYWRkKGNoZWNrYm94KTsKKyAgICAgICAgY2hlY2tib3guYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7CisgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5ERVNFTEVDVEVEKQorICAgICAgICAgICAgICBncmFwaC5nZXRNb2RlbCgpLnNldE9wdGlvbmFsKGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGUuZ2V0U3RhdGVDaGFuZ2UoKSA9PSBJdGVtRXZlbnQuU0VMRUNURUQpCisgICAgICAgICAgICAgIGdyYXBoLmdldE1vZGVsKCkuc2V0T3B0aW9uYWwodHJ1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIERlZmF1bHRQcm9wVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgICAgRGVmYXVsdFByb3BWaWV3LnRoaXMucmVmcmVzaFZpZXcoc3RhdGUpOworICAgICAgICAgIH0KKworICAgICAgICB9KTsKKyAgICBwYW5lbC5hZGQoY2hlY2tCb3hlcywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgcmV0dXJuIHBhbmVsOworICB9ICAKKyAgCisgIAorICBwcml2YXRlIEpQYW5lbCBnZXRFeGVjdXNlZElkcyhmaW5hbCBNb2RlbEdyYXBoIGdyYXBoKSB7CisgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOworICAgIHBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgIHBhbmVsLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOworICAgIHBhbmVsLmFkZChuZXcgSkxhYmVsKCJFeGN1c2VkU3ViUHJvY2Vzc29ySWRzOiIpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgIEpQYW5lbCBjaGVja0JveGVzID0gbmV3IEpQYW5lbCgpOworICAgIGNoZWNrQm94ZXMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGdyYXBoLmdldENoaWxkcmVuKCkuc2l6ZSgpLCAxKSk7CisgICAgaWYgKGdyYXBoLmhhc0NoaWxkcmVuKCkpIHsKKyAgICAgIGZvciAoTW9kZWxHcmFwaCBjaGlsZEdyYXBoIDogZ3JhcGguZ2V0Q2hpbGRyZW4oKSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbW9kZWxJZCA9IGNoaWxkR3JhcGguZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCk7CisgICAgICAgIENoZWNrYm94IGNoZWNrYm94ID0gbmV3IENoZWNrYm94KG1vZGVsSWQsIGdyYXBoLmdldE1vZGVsKCkKKyAgICAgICAgICAgIC5nZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkuY29udGFpbnMobW9kZWxJZCkpOworICAgICAgICBjaGVja0JveGVzLmFkZChjaGVja2JveCk7CisgICAgICAgIGNoZWNrYm94LmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgeworCisgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgeworICAgICAgICAgICAgaWYgKGUuZ2V0U3RhdGVDaGFuZ2UoKSA9PSBJdGVtRXZlbnQuREVTRUxFQ1RFRCkKKyAgICAgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5nZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkucmVtb3ZlKG1vZGVsSWQpOworICAgICAgICAgICAgZWxzZSBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkKKyAgICAgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5nZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkuYWRkKG1vZGVsSWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBEZWZhdWx0UHJvcFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICAgIHBhbmVsLmFkZChjaGVja0JveGVzLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICByZXR1cm4gcGFuZWw7CisgIH0KKworICBwdWJsaWMgY2xhc3MgTXlUYWJsZUxpc3RlbmVyIGltcGxlbWVudHMgVGFibGVNb2RlbExpc3RlbmVyLAorICAgICAgTGlzdFNlbGVjdGlvbkxpc3RlbmVyIHsKKworICAgIFN0cmluZyBvbGRLZXksIG9sZFZhbHVlLCBvbGRFbnZSZXBsYWNlOworCisgICAgcHJpdmF0ZSBWaWV3U3RhdGUgc3RhdGU7CisKKyAgICBwdWJsaWMgTXlUYWJsZUxpc3RlbmVyKFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKG9sZEtleSArICIgIiArIG9sZFZhbHVlICsgIiAiICsgb2xkRW52UmVwbGFjZSk7CisgICAgICBpZiAoZS5nZXRUeXBlKCkgPT0gVGFibGVNb2RlbEV2ZW50LlVQREFURSkgeworICAgICAgICBNZXRhZGF0YSBzdGF0aWNNZXQgPSBzdGF0ZS5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkuZ2V0U3RhdGljTWV0YWRhdGEoKTsKKyAgICAgICAgaWYgKHN0YXRpY01ldCA9PSBudWxsKQorICAgICAgICAgIHN0YXRpY01ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBpZiAoZS5nZXRDb2x1bW4oKSA9PSAxKSB7CisgICAgICAgICAgU3RyaW5nIG5ld0dyb3VwbGVzc0tleSA9IChTdHJpbmcpIHRhYmxlLmdldFZhbHVlQXQoZS5nZXRGaXJzdFJvdygpLAorICAgICAgICAgICAgICBlLmdldENvbHVtbigpKTsKKyAgICAgICAgICBpZiAobmV3R3JvdXBsZXNzS2V5LmVxdWFscygiIikKKyAgICAgICAgICAgICAgfHwgKG5ld0dyb3VwbGVzc0tleS5lcXVhbHMoImVudlJlcGxhY2UiKSAmJiAhc3RhdGUuZ2V0U2VsZWN0ZWQoKQorICAgICAgICAgICAgICAgICAgLmdldE1vZGVsKCkuZ2V0U3RhdGljTWV0YWRhdGEoKQorICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zR3JvdXAoc3RhdGUuZ2V0Q3VycmVudE1ldEdyb3VwKCkpKSkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIFN0cmluZyBuZXdLZXkgPSBnZXRLZXkobmV3R3JvdXBsZXNzS2V5LCBzdGF0ZSk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXdLZXk6ICIgKyBuZXdLZXkpOworICAgICAgICAgIGlmIChvbGRLZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhdGljTWV0LnJlcGxhY2VNZXRhZGF0YShuZXdLZXksIHN0YXRpY01ldC5nZXRBbGxNZXRhZGF0YShvbGRLZXkpKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNNZXQuY29udGFpbnNLZXkob2xkS2V5ICsgIi9lbnZSZXBsYWNlIikpCisgICAgICAgICAgICAgIHN0YXRpY01ldC5yZXBsYWNlTWV0YWRhdGEobmV3S2V5LAorICAgICAgICAgICAgICAgICAgc3RhdGljTWV0LmdldEFsbE1ldGFkYXRhKG9sZEtleSArICIvZW52UmVwbGFjZSIpKTsKKyAgICAgICAgICAgIGlmICghbmV3S2V5LmVxdWFscyhvbGRLZXkpKQorICAgICAgICAgICAgICBzdGF0aWNNZXQucmVtb3ZlTWV0YWRhdGEob2xkS2V5KTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0aWNNZXQucmVwbGFjZU1ldGFkYXRhKG9sZEtleSA9IG5ld0tleSwgKFN0cmluZykgbnVsbCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0Q29sdW1uKCkgPT0gMikgeworICAgICAgICAgIGlmIChvbGRLZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZykgdGFibGUuZ2V0VmFsdWVBdChlLmdldEZpcnN0Um93KCksCisgICAgICAgICAgICAgICAgZS5nZXRDb2x1bW4oKSk7CisgICAgICAgICAgICBpZiAob2xkS2V5LmVuZHNXaXRoKCIvZW52UmVwbGFjZSIpKSB7CisgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmVxdWFscygiZmFsc2UiKSkKKyAgICAgICAgICAgICAgICBzdGF0aWNNZXQucmVtb3ZlTWV0YWRhdGEob2xkS2V5KTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXRpY01ldC5yZXBsYWNlTWV0YWRhdGEob2xkS2V5LAorICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ld1ZhbHVlLnNwbGl0KCIsIikpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YXRpY01ldC5yZXBsYWNlTWV0YWRhdGEob2xkS2V5LAorICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChuZXdWYWx1ZS5zcGxpdCgiLCIpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRDb2x1bW4oKSA9PSAzKSB7CisgICAgICAgICAgaWYgKG9sZEtleSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbmV3RW52UmVwbGFjZSA9ICgoU3RyaW5nKSB0YWJsZS5nZXRWYWx1ZUF0KGUuZ2V0Rmlyc3RSb3coKSwKKyAgICAgICAgICAgICAgICBlLmdldENvbHVtbigpKSkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGlmIChuZXdFbnZSZXBsYWNlLmVxdWFscygidHJ1ZSIpKQorICAgICAgICAgICAgICBzdGF0aWNNZXQucmVwbGFjZU1ldGFkYXRhKG9sZEtleSArICIvZW52UmVwbGFjZSIsIG5ld0VudlJlcGxhY2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzdGF0aWNNZXQucmVtb3ZlTWV0YWRhdGEob2xkS2V5ICsgIi9lbnZSZXBsYWNlIik7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuZ2V0U2VsZWN0ZWQoKS5nZXRNb2RlbCgpLnNldFN0YXRpY01ldGFkYXRhKHN0YXRpY01ldCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgIG9sZEtleSA9IGdldEtleSgoU3RyaW5nKSB0YWJsZS5nZXRWYWx1ZUF0KGUuZ2V0Rmlyc3RJbmRleCgpLCAxKSwgc3RhdGUpOworICAgICAgb2xkVmFsdWUgPSAoU3RyaW5nKSB0YWJsZS5nZXRWYWx1ZUF0KGUuZ2V0Rmlyc3RJbmRleCgpLCAyKTsKKyAgICAgIG9sZEVudlJlcGxhY2UgPSAoU3RyaW5nKSB0YWJsZS5nZXRWYWx1ZUF0KGUuZ2V0Rmlyc3RJbmRleCgpLCAzKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldEtleShTdHJpbmcga2V5LCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBpZiAoa2V5ICE9IG51bGwgJiYgc3RhdGUuZ2V0Q3VycmVudE1ldEdyb3VwKCkgIT0gbnVsbCkKKyAgICAgIHJldHVybiBzdGF0ZS5nZXRDdXJyZW50TWV0R3JvdXAoKSArICIvIiArIGtleTsKKyAgICBlbHNlCisgICAgICByZXR1cm4ga2V5OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L2ltcGwvRGVmYXVsdFRyZWVWaWV3LmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0RlZmF1bHRUcmVlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWMyZjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0RlZmF1bHRUcmVlVmlldy5qYXZhCkBAIC0wLDAgKzEsNDgzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5pbXBsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZhLmF3dC5NZW51SXRlbTsKK2ltcG9ydCBqYXZhLmF3dC5Qb3B1cE1lbnU7CitpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZTsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVDZWxsUmVuZGVyZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwuTW9kZWxHcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3Q2hhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlld1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnV0aWwuR3VpVXRpbHM7CisKKy8qKgorICogCisgKiBUaGUgZGVmYXVsdCBXb3JrZmxvdyBHVUkgZWRpdG9yIHZpZXcgc2hlbGwuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0VHJlZVZpZXcgZXh0ZW5kcyBWaWV3IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODI5NTA3MDU5NzY1MTE5MDU3Nkw7CisKKyAgcHJpdmF0ZSBKVHJlZSB0cmVlOworICBwcml2YXRlIFBvcHVwTWVudSBhY3Rpb25zTWVudSwgb3JkZXJTdWJNZW51OworICBwcml2YXRlIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmU7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEFORF9TVEFUSUNfTUVUQURBVEEgPSAiRGVmYXVsdFRyZWVWaWV3L2V4cGFuZC9zdGF0aWMtbWV0YWRhdGEiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQQU5EX1BSRUNPTkRJVElPTlMgPSAiRGVmYXVsdFRyZWVWaWV3L2V4cGFuZC9wcmUtY29uZGl0aW9ucyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBBTkRfUE9TVENPTkRJVElPTlMgPSAiRGVmYXVsdFRyZWVWaWV3L2V4cGFuZC9wb3N0LWNvbmRpdGlvbnMiOworCisgIHB1YmxpYyBEZWZhdWx0VHJlZVZpZXcoU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihuYW1lKTsKKyAgICB0aGlzLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICB9CisKKyAgcHVibGljIFRyZWVQYXRoIGdldFRyZWVQYXRoKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSwgTW9kZWxHcmFwaCBncmFwaCkgeworICAgIGlmIChub2RlLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoZ3JhcGgpKSB7CisgICAgICByZXR1cm4gbmV3IFRyZWVQYXRoKG5vZGUuZ2V0UGF0aCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldENoaWxkQ291bnQoKTsgaSsrKSB7CisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiaTogIiArICgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkKKyAgICAgICAgLy8gbm9kZS5nZXRDaGlsZEF0KGkpKS5nZXRVc2VyT2JqZWN0KCkpOworICAgICAgICBUcmVlUGF0aCB0cmVlUGF0aCA9IHRoaXMuZ2V0VHJlZVBhdGgoCisgICAgICAgICAgICAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgbm9kZS5nZXRDaGlsZEF0KGkpLCBncmFwaCk7CisgICAgICAgIGlmICh0cmVlUGF0aCAhPSBudWxsKQorICAgICAgICAgIHJldHVybiB0cmVlUGF0aDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgVHJlZVBhdGggZ2V0VHJlZVBhdGgoVHJlZVBhdGggY3VycmVudFBhdGgsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIFN0cmluZyBsb29raW5nRm9yUGF0aCA9IHN0YXRlLmdldEN1cnJlbnRNZXRHcm91cCgpOworICAgIFN0YWNrPERlZmF1bHRNdXRhYmxlVHJlZU5vZGU+IHN0YWNrID0gbmV3IFN0YWNrPERlZmF1bHRNdXRhYmxlVHJlZU5vZGU+KCk7CisgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBiYXNlTm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBjdXJyZW50UGF0aAorICAgICAgICAuZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VOb2RlLmdldENoaWxkQ291bnQoKTsgaSsrKQorICAgICAgc3RhY2sucHVzaCgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgYmFzZU5vZGUuZ2V0Q2hpbGRBdChpKSk7CisgICAgd2hpbGUgKCFzdGFjay5lbXB0eSgpKSB7CisgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBzdGFjay5wb3AoKTsKKyAgICAgIGlmIChub2RlLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoInN0YXRpYy1tZXRhZGF0YSIpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5nZXRDaGlsZENvdW50KCk7IGkrKykKKyAgICAgICAgICBzdGFjay5wdXNoKChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBub2RlLmdldENoaWxkQXQoaSkpOworICAgICAgfSBlbHNlIGlmIChub2RlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIEhhc2hNYXApIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpICgoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4pIG5vZGUuZ2V0VXNlck9iamVjdCgpKQorICAgICAgICAgICAgLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBpZiAobG9va2luZ0ZvclBhdGguZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRyZWVQYXRoKG5vZGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChsb29raW5nRm9yUGF0aC5zdGFydHNXaXRoKGtleSArICIvIikpIHsKKyAgICAgICAgICBsb29raW5nRm9yUGF0aCA9IGxvb2tpbmdGb3JQYXRoCisgICAgICAgICAgICAgIC5zdWJzdHJpbmcobG9va2luZ0ZvclBhdGguaW5kZXhPZigiLyIpICsgMSk7CisgICAgICAgICAgc3RhY2suY2xlYXIoKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZ2V0Q2hpbGRDb3VudCgpOyBpKyspCisgICAgICAgICAgICBzdGFjay5hZGQoKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIG5vZGUuZ2V0Q2hpbGRBdChpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGN1cnJlbnRQYXRoOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlc2V0UHJvcGVydGllcyhWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBzdGF0ZS5zZXRQcm9wZXJ0eShFWFBBTkRfU1RBVElDX01FVEFEQVRBLCAiZmFsc2UiKTsKKyAgICBzdGF0ZS5zZXRQcm9wZXJ0eShFWFBBTkRfUFJFQ09ORElUSU9OUywgImZhbHNlIik7CisgICAgc3RhdGUuc2V0UHJvcGVydHkoRVhQQU5EX1BPU1RDT05ESVRJT05TLCAiZmFsc2UiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWZyZXNoVmlldyhmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBSZWN0YW5nbGUgdmlzaWJsZVJlY3QgPSBudWxsOworICAgIGlmICh0aGlzLnRyZWUgIT0gbnVsbCkKKyAgICAgIHZpc2libGVSZWN0ID0gdGhpcy50cmVlLmdldFZpc2libGVSZWN0KCk7CisKKyAgICB0aGlzLnJlbW92ZUFsbCgpOworCisgICAgdGhpcy5hY3Rpb25zTWVudSA9IHRoaXMuY3JlYXRlUG9wdXBNZW51KHN0YXRlKTsKKworICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJXT1JLRkxPV1MiKTsKKyAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiBzdGF0ZS5nZXRHcmFwaHMoKSkKKyAgICAgIHJvb3QuYWRkKHRoaXMuYnVpbGRUcmVlKGdyYXBoLCBzdGF0ZSkpOworICAgIHRyZWUgPSBuZXcgSlRyZWUocm9vdCk7CisgICAgdHJlZS5zZXRTaG93c1Jvb3RIYW5kbGVzKHRydWUpOworICAgIHRyZWUuc2V0Um9vdFZpc2libGUoZmFsc2UpOworICAgIHRyZWUuYWRkKHRoaXMuYWN0aW9uc01lbnUpOworCisgICAgaWYgKHN0YXRlLmdldFNlbGVjdGVkKCkgIT0gbnVsbCkgeworICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTRUxFQ1RFRDogIiArIHN0YXRlLmdldFNlbGVjdGVkKCkpOworICAgICAgVHJlZVBhdGggdHJlZVBhdGggPSB0aGlzLmdldFRyZWVQYXRoKHJvb3QsIHN0YXRlLmdldFNlbGVjdGVkKCkpOworICAgICAgaWYgKHN0YXRlLmdldEN1cnJlbnRNZXRHcm91cCgpICE9IG51bGwpIHsKKyAgICAgICAgdHJlZVBhdGggPSB0aGlzLmdldFRyZWVQYXRoKHRyZWVQYXRoLCBzdGF0ZSk7CisgICAgICB9IGVsc2UgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHN0YXRlCisgICAgICAgICAgLmdldEZpcnN0UHJvcGVydHlWYWx1ZShFWFBBTkRfU1RBVElDX01FVEFEQVRBKSkpIHsKKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBiYXNlTm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSB0cmVlUGF0aAorICAgICAgICAgICAgLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZU5vZGUuZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICBpZiAoKChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBiYXNlTm9kZS5nZXRDaGlsZEF0KGkpKS5nZXRVc2VyT2JqZWN0KCkKKyAgICAgICAgICAgICAgLmVxdWFscygic3RhdGljLW1ldGFkYXRhIikpIHsKKyAgICAgICAgICAgIHRyZWVQYXRoID0gbmV3IFRyZWVQYXRoKAorICAgICAgICAgICAgICAgICgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgYmFzZU5vZGUuZ2V0Q2hpbGRBdChpKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChCb29sZWFuLnBhcnNlQm9vbGVhbihzdGF0ZQorICAgICAgICAgIC5nZXRGaXJzdFByb3BlcnR5VmFsdWUoRVhQQU5EX1BSRUNPTkRJVElPTlMpKSkgeworICAgICAgICBpZiAodHJlZVBhdGggPT0gbnVsbCkKKyAgICAgICAgICB0cmVlUGF0aCA9IHRoaXMuZ2V0VHJlZVBhdGgocm9vdCwgc3RhdGUuZ2V0U2VsZWN0ZWQoKQorICAgICAgICAgICAgICAuZ2V0UHJlQ29uZGl0aW9ucygpKTsKKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBiYXNlTm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSB0cmVlUGF0aAorICAgICAgICAgICAgLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZU5vZGUuZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICBpZiAoKChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBiYXNlTm9kZS5nZXRDaGlsZEF0KGkpKS5nZXRVc2VyT2JqZWN0KCkKKyAgICAgICAgICAgICAgLmVxdWFscygicHJlLWNvbmRpdGlvbnMiKSkgeworICAgICAgICAgICAgdHJlZVBhdGggPSBuZXcgVHJlZVBhdGgoCisgICAgICAgICAgICAgICAgKChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBiYXNlTm9kZS5nZXRDaGlsZEF0KGkpKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHN0YXRlCisgICAgICAgICAgLmdldEZpcnN0UHJvcGVydHlWYWx1ZShFWFBBTkRfUE9TVENPTkRJVElPTlMpKSkgeworICAgICAgICBpZiAodHJlZVBhdGggPT0gbnVsbCkKKyAgICAgICAgICB0cmVlUGF0aCA9IHRoaXMuZ2V0VHJlZVBhdGgocm9vdCwgc3RhdGUuZ2V0U2VsZWN0ZWQoKQorICAgICAgICAgICAgICAuZ2V0UG9zdENvbmRpdGlvbnMoKSk7CisgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgYmFzZU5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgdHJlZVBhdGgKKyAgICAgICAgICAgIC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VOb2RlLmdldENoaWxkQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgaWYgKCgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgYmFzZU5vZGUuZ2V0Q2hpbGRBdChpKSkuZ2V0VXNlck9iamVjdCgpCisgICAgICAgICAgICAgIC5lcXVhbHMoInBvc3QtY29uZGl0aW9ucyIpKSB7CisgICAgICAgICAgICB0cmVlUGF0aCA9IG5ldyBUcmVlUGF0aCgKKyAgICAgICAgICAgICAgICAoKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIGJhc2VOb2RlLmdldENoaWxkQXQoaSkpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMudHJlZS5leHBhbmRQYXRoKHRyZWVQYXRoKTsKKyAgICAgIHRoaXMudHJlZS5zZXRTZWxlY3Rpb25QYXRoKHRyZWVQYXRoKTsKKyAgICB9CisKKyAgICB0cmVlLmFkZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcihuZXcgVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoVHJlZVNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgaWYgKGUuZ2V0UGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSB7CisgICAgICAgICAgRGVmYXVsdFRyZWVWaWV3LnRoaXMucmVzZXRQcm9wZXJ0aWVzKHN0YXRlKTsKKyAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgZS5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisgICAgICAgICAgaWYgKG5vZGUuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgTW9kZWxHcmFwaCkgeworICAgICAgICAgICAgc3RhdGUuc2V0U2VsZWN0ZWQoKE1vZGVsR3JhcGgpIG5vZGUuZ2V0VXNlck9iamVjdCgpKTsKKyAgICAgICAgICAgIHN0YXRlLnNldEN1cnJlbnRNZXRHcm91cChudWxsKTsKKyAgICAgICAgICAgIERlZmF1bHRUcmVlVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkuZXF1YWxzKCJzdGF0aWMtbWV0YWRhdGEiKQorICAgICAgICAgICAgICB8fCBub2RlLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoInByZS1jb25kaXRpb25zIikKKyAgICAgICAgICAgICAgfHwgbm9kZS5nZXRVc2VyT2JqZWN0KCkuZXF1YWxzKCJwb3N0LWNvbmRpdGlvbnMiKSkgeworICAgICAgICAgICAgc3RhdGUuc2V0U2VsZWN0ZWQoKE1vZGVsR3JhcGgpICgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgbm9kZQorICAgICAgICAgICAgICAgIC5nZXRQYXJlbnQoKSkuZ2V0VXNlck9iamVjdCgpKTsKKyAgICAgICAgICAgIHN0YXRlLnNldEN1cnJlbnRNZXRHcm91cChudWxsKTsKKyAgICAgICAgICAgIHN0YXRlLnNldFByb3BlcnR5KEVYUEFORF9TVEFUSUNfTUVUQURBVEEsIEJvb2xlYW4udG9TdHJpbmcobm9kZQorICAgICAgICAgICAgICAgIC5nZXRVc2VyT2JqZWN0KCkuZXF1YWxzKCJzdGF0aWMtbWV0YWRhdGEiKSkpOworICAgICAgICAgICAgc3RhdGUuc2V0UHJvcGVydHkoRVhQQU5EX1BSRUNPTkRJVElPTlMsCisgICAgICAgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhub2RlLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoInByZS1jb25kaXRpb25zIikpKTsKKyAgICAgICAgICAgIHN0YXRlLnNldFByb3BlcnR5KEVYUEFORF9QT1NUQ09ORElUSU9OUywgQm9vbGVhbi50b1N0cmluZyhub2RlCisgICAgICAgICAgICAgICAgLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoInBvc3QtY29uZGl0aW9ucyIpKSk7CisgICAgICAgICAgICBEZWZhdWx0VHJlZVZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgSGFzaE1hcCkgeworICAgICAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBtZXROb2RlID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBncm91cCA9IG51bGw7CisgICAgICAgICAgICBPYmplY3RbXSBwYXRoID0gZS5nZXRQYXRoKCkuZ2V0UGF0aCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgaWYgKCgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgcGF0aFtpXSkuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgTW9kZWxHcmFwaCkgeworICAgICAgICAgICAgICAgIG1ldE5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgcGF0aFtpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIHBhdGhbaV0pLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIEhhc2hNYXApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgIGdyb3VwID0gKFN0cmluZykgKChIYXNoTWFwPFN0cmluZywgU3RyaW5nPikgKChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBwYXRoW2ldKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRVc2VyT2JqZWN0KCkpLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGdyb3VwID0gKFN0cmluZykgKChIYXNoTWFwPFN0cmluZywgU3RyaW5nPikgKChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBwYXRoW2ldKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRVc2VyT2JqZWN0KCkpLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICArIGdyb3VwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNb2RlbEdyYXBoIGdyYXBoID0gKE1vZGVsR3JhcGgpIG1ldE5vZGUuZ2V0VXNlck9iamVjdCgpOworICAgICAgICAgICAgc3RhdGUuc2V0U2VsZWN0ZWQoZ3JhcGgpOworICAgICAgICAgICAgc3RhdGUuc2V0Q3VycmVudE1ldEdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgIERlZmF1bHRUcmVlVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0ZS5zZXRTZWxlY3RlZChudWxsKTsKKyAgICAgICAgICAgIERlZmF1bHRUcmVlVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgfSk7CisgICAgdHJlZS5zZXRDZWxsUmVuZGVyZXIobmV3IFRyZWVDZWxsUmVuZGVyZXIoKSB7CisKKyAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVHJlZSB0cmVlLCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBleHBhbmRlZCwgYm9vbGVhbiBsZWFmLCBpbnQgcm93LAorICAgICAgICAgIGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIHZhbHVlOworICAgICAgICBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgICAgSkxhYmVsIGxhYmVsID0gbmV3IEpMYWJlbCgoU3RyaW5nKSBub2RlLmdldFVzZXJPYmplY3QoKSk7CisgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5ibHVlKTsKKyAgICAgICAgICBwYW5lbC5hZGQobGFiZWwsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICAgIHBhbmVsLnNldEJhY2tncm91bmQoc2VsZWN0ZWQgPyBDb2xvci5saWdodEdyYXkgOiBDb2xvci53aGl0ZSk7CisgICAgICAgICAgcmV0dXJuIHBhbmVsOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgTW9kZWxHcmFwaCkgeworICAgICAgICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICAgICAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICBKTGFiZWwgaWNvbkxhYmVsID0gbmV3IEpMYWJlbCgoKE1vZGVsR3JhcGgpIG5vZGUuZ2V0VXNlck9iamVjdCgpKQorICAgICAgICAgICAgICAuZ2V0TW9kZWwoKS5nZXRFeGVjdXRpb25UeXBlKCkgKyAiOiAiKTsKKyAgICAgICAgICBpY29uTGFiZWwuc2V0Rm9yZWdyb3VuZCgoKE1vZGVsR3JhcGgpIG5vZGUuZ2V0VXNlck9iamVjdCgpKQorICAgICAgICAgICAgICAuZ2V0TW9kZWwoKS5nZXRDb2xvcigpKTsKKyAgICAgICAgICBpY29uTGFiZWwuc2V0QmFja2dyb3VuZChDb2xvci53aGl0ZSk7CisgICAgICAgICAgSkxhYmVsIGlkTGFiZWwgPSBuZXcgSkxhYmVsKCgoTW9kZWxHcmFwaCkgbm9kZS5nZXRVc2VyT2JqZWN0KCkpCisgICAgICAgICAgICAgIC5nZXRNb2RlbCgpLmdldE1vZGVsTmFtZSgpKTsKKyAgICAgICAgICBpZExhYmVsLnNldEJhY2tncm91bmQoQ29sb3Iud2hpdGUpOworICAgICAgICAgIHBhbmVsLmFkZChpY29uTGFiZWwsIEJvcmRlckxheW91dC5XRVNUKTsKKyAgICAgICAgICBwYW5lbC5hZGQoaWRMYWJlbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgcGFuZWwuc2V0QmFja2dyb3VuZChzZWxlY3RlZCA/IENvbG9yLmxpZ2h0R3JheSA6IENvbG9yLndoaXRlKTsKKyAgICAgICAgICByZXR1cm4gcGFuZWw7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBIYXNoTWFwKSB7CisgICAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOworICAgICAgICAgIHBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICAgIFN0cmluZyBncm91cCA9IChTdHJpbmcpICgoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4pIG5vZGUKKyAgICAgICAgICAgICAgLmdldFVzZXJPYmplY3QoKSkua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgSkxhYmVsIG5hbWVMYWJlbCA9IG5ldyBKTGFiZWwoZ3JvdXAgKyAiIDogIik7CisgICAgICAgICAgbmFtZUxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuYmx1ZSk7CisgICAgICAgICAgbmFtZUxhYmVsLnNldEJhY2tncm91bmQoQ29sb3Iud2hpdGUpOworICAgICAgICAgIEpMYWJlbCB2YWx1ZUxhYmVsID0gbmV3IEpMYWJlbCgoKEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KSBub2RlCisgICAgICAgICAgICAgIC5nZXRVc2VyT2JqZWN0KCkpLmdldChncm91cCkpOworICAgICAgICAgIHZhbHVlTGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5kYXJrR3JheSk7CisgICAgICAgICAgdmFsdWVMYWJlbC5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlKTsKKyAgICAgICAgICBwYW5lbC5hZGQobmFtZUxhYmVsLCBCb3JkZXJMYXlvdXQuV0VTVCk7CisgICAgICAgICAgcGFuZWwuYWRkKHZhbHVlTGFiZWwsIEJvcmRlckxheW91dC5FQVNUKTsKKyAgICAgICAgICBwYW5lbC5zZXRCYWNrZ3JvdW5kKHNlbGVjdGVkID8gQ29sb3IubGlnaHRHcmF5IDogQ29sb3Iud2hpdGUpOworICAgICAgICAgIHJldHVybiBwYW5lbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEpMYWJlbCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9KTsKKyAgICB0cmVlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7CisgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgIGlmIChlLmdldEJ1dHRvbigpID09IE1vdXNlRXZlbnQuQlVUVE9OMworICAgICAgICAgICAgJiYgRGVmYXVsdFRyZWVWaWV3LnRoaXMudHJlZS5nZXRTZWxlY3Rpb25QYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBEZWZhdWx0VHJlZVZpZXcudGhpcy50cmVlCisgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25QYXRoKCkuZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKKyAgICAgICAgICBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBTdHJpbmcKKyAgICAgICAgICAgICAgJiYgIShub2RlLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoInByZS1jb25kaXRpb25zIikgfHwgbm9kZQorICAgICAgICAgICAgICAgICAgLmdldFVzZXJPYmplY3QoKS5lcXVhbHMoInBvc3QtY29uZGl0aW9ucyIpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICBvcmRlclN1Yk1lbnUuc2V0RW5hYmxlZChub2RlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIE1vZGVsR3JhcGgKKyAgICAgICAgICAgICAgJiYgISgoTW9kZWxHcmFwaCkgbm9kZS5nZXRVc2VyT2JqZWN0KCkpLmlzQ29uZGl0aW9uKCkKKyAgICAgICAgICAgICAgJiYgKChNb2RlbEdyYXBoKSBub2RlLmdldFVzZXJPYmplY3QoKSkuZ2V0UGFyZW50KCkgIT0gbnVsbCk7CisgICAgICAgICAgRGVmYXVsdFRyZWVWaWV3LnRoaXMuYWN0aW9uc01lbnUuc2hvdyhEZWZhdWx0VHJlZVZpZXcudGhpcy50cmVlLAorICAgICAgICAgICAgICBlLmdldFgoKSwgZS5nZXRZKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKSB7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKyAgICB9KTsKKyAgICB0aGlzLnNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodHJlZSwKKyAgICAgICAgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FMV0FZUywKKyAgICAgICAgSlNjcm9sbFBhbmUuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQUxXQVlTKTsKKyAgICB0aGlzLmFkZCh0aGlzLnNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgIGlmICh2aXNpYmxlUmVjdCAhPSBudWxsKQorICAgICAgdGhpcy50cmVlLnNjcm9sbFJlY3RUb1Zpc2libGUodmlzaWJsZVJlY3QpOworCisgICAgdGhpcy5yZXZhbGlkYXRlKCk7CisgIH0KKworICBwcml2YXRlIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgYnVpbGRUcmVlKE1vZGVsR3JhcGggZ3JhcGgsIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGdyYXBoKTsKKyAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG1ldGFkYXRhTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKAorICAgICAgICAic3RhdGljLW1ldGFkYXRhIik7CisgICAgTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBpZiAoZ3JhcGguZ2V0SW5oZXJpdGVkU3RhdGljTWV0YWRhdGEoc3RhdGUpICE9IG51bGwpCisgICAgICBzdGF0aWNNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoZ3JhcGguZ2V0SW5oZXJpdGVkU3RhdGljTWV0YWRhdGEoc3RhdGUpKTsKKyAgICBpZiAoZ3JhcGguZ2V0TW9kZWwoKS5nZXRTdGF0aWNNZXRhZGF0YSgpICE9IG51bGwpCisgICAgICBzdGF0aWNNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoZ3JhcGguZ2V0TW9kZWwoKS5nZXRTdGF0aWNNZXRhZGF0YSgpKTsKKyAgICB0aGlzLmFkZE1ldGFkYXRhTm9kZXMobWV0YWRhdGFOb2RlLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgaWYgKCFtZXRhZGF0YU5vZGUuaXNMZWFmKCkpCisgICAgICBub2RlLmFkZChtZXRhZGF0YU5vZGUpOworCisgICAgaWYgKGdyYXBoLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsKSB7CisgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByZUNvbmRpdGlvbnMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgKKyAgICAgICAgICAicHJlLWNvbmRpdGlvbnMiKTsKKyAgICAgIExpc3Q8TW9kZWxHcmFwaD4gbGVhZk5vZGVzID0gZ3JhcGguZ2V0UHJlQ29uZGl0aW9ucygpLmdldExlYWZOb2RlcygpOworICAgICAgZm9yIChNb2RlbEdyYXBoIGNvbmQgOiBsZWFmTm9kZXMpIHsKKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjb25kTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGNvbmQpOworICAgICAgICBwcmVDb25kaXRpb25zLmFkZChjb25kTm9kZSk7CisgICAgICB9CisgICAgICBub2RlLmFkZChwcmVDb25kaXRpb25zKTsKKyAgICB9CisgICAgaWYgKGdyYXBoLmdldFBvc3RDb25kaXRpb25zKCkgIT0gbnVsbCkgeworICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwb3N0Q29uZGl0aW9ucyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKAorICAgICAgICAgICJwb3N0LWNvbmRpdGlvbnMiKTsKKyAgICAgIExpc3Q8TW9kZWxHcmFwaD4gbGVhZk5vZGVzID0gZ3JhcGguZ2V0UG9zdENvbmRpdGlvbnMoKS5nZXRMZWFmTm9kZXMoKTsKKyAgICAgIGZvciAoTW9kZWxHcmFwaCBjb25kIDogbGVhZk5vZGVzKSB7CisgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgY29uZE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjb25kKTsKKyAgICAgICAgcG9zdENvbmRpdGlvbnMuYWRkKGNvbmROb2RlKTsKKyAgICAgIH0KKyAgICAgIG5vZGUuYWRkKHBvc3RDb25kaXRpb25zKTsKKyAgICB9CisgICAgZm9yIChNb2RlbEdyYXBoIGNoaWxkIDogZ3JhcGguZ2V0Q2hpbGRyZW4oKSkKKyAgICAgIGlmICghR3VpVXRpbHMuaXNEdW1teU5vZGUoY2hpbGQuZ2V0TW9kZWwoKSkpCisgICAgICAgIG5vZGUuYWRkKHRoaXMuYnVpbGRUcmVlKGNoaWxkLCBzdGF0ZSkpOworICAgIHJldHVybiBub2RlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFkYXRhTm9kZXMoRGVmYXVsdE11dGFibGVUcmVlTm9kZSBtZXRhZGF0YU5vZGUsCisgICAgICBNZXRhZGF0YSBzdGF0aWNNZXRhZGF0YSkgeworICAgIGZvciAoU3RyaW5nIGdyb3VwIDogc3RhdGljTWV0YWRhdGEuZ2V0R3JvdXBzKCkpIHsKKyAgICAgIE9iamVjdCB1c2VyT2JqID0gbnVsbDsKKyAgICAgIGlmIChzdGF0aWNNZXRhZGF0YS5nZXRNZXRhZGF0YShncm91cCkgIT0gbnVsbCkgeworICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgbWFwLnB1dChncm91cCwKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLmpvaW4oc3RhdGljTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoZ3JvdXApLCAiLCIpKTsKKyAgICAgICAgdXNlck9iaiA9IG1hcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBtYXAucHV0KGdyb3VwLCBudWxsKTsKKyAgICAgICAgdXNlck9iaiA9IG1hcDsKKyAgICAgIH0KKyAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgZ3JvdXBOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodXNlck9iaik7CisgICAgICBtZXRhZGF0YU5vZGUuYWRkKGdyb3VwTm9kZSk7CisgICAgICB0aGlzLmFkZE1ldGFkYXRhTm9kZXMoZ3JvdXBOb2RlLCBzdGF0aWNNZXRhZGF0YS5nZXRTdWJNZXRhZGF0YShncm91cCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgUG9wdXBNZW51IGNyZWF0ZVBvcHVwTWVudShmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBmaW5hbCBTdHJpbmcgQUNUSU9OU19QT1BfTUVOVV9OQU1FID0gIkFjdGlvbnMiOworICAgIGZpbmFsIFN0cmluZyBWSUVXX0NPTkRJVElPTl9NQVAgPSAiVmlldy4uLiI7CisgICAgUG9wdXBNZW51IGFjdGlvbnNNZW51ID0gbmV3IFBvcHVwTWVudShBQ1RJT05TX1BPUF9NRU5VX05BTUUpOworICAgIGFjdGlvbnNNZW51LmFkZChuZXcgTWVudUl0ZW0oVklFV19DT05ESVRJT05fTUFQKSk7CisgICAgYWN0aW9uc01lbnUuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICBpZiAoZS5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFZJRVdfQ09ORElUSU9OX01BUCkpIHsKKyAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgdHJlZQorICAgICAgICAgICAgICAuZ2V0U2VsZWN0aW9uUGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisgICAgICAgICAgTW9kZWxHcmFwaCBncmFwaFRvRm9jdXMgPSBudWxsOworICAgICAgICAgIGlmIChCb29sZWFuLnBhcnNlQm9vbGVhbihzdGF0ZQorICAgICAgICAgICAgICAuZ2V0Rmlyc3RQcm9wZXJ0eVZhbHVlKEVYUEFORF9QUkVDT05ESVRJT05TKSkKKyAgICAgICAgICAgICAgfHwgQm9vbGVhbi5wYXJzZUJvb2xlYW4oc3RhdGUKKyAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdFByb3BlcnR5VmFsdWUoRVhQQU5EX1BPU1RDT05ESVRJT05TKSkpIHsKKyAgICAgICAgICAgIC8vIGlmIChub2RlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIFN0cmluZyAmJgorICAgICAgICAgICAgLy8gKG5vZGUuZ2V0VXNlck9iamVjdCgpLmVxdWFscygicHJlLWNvbmRpdGlvbnMiKSB8fAorICAgICAgICAgICAgLy8gbm9kZS5nZXRVc2VyT2JqZWN0KCkuZXF1YWxzKCJwb3N0LWNvbmRpdGlvbnMiKSkpIHsKKyAgICAgICAgICAgIE1vZGVsR3JhcGggZ3JhcGggPSBzdGF0ZS5nZXRTZWxlY3RlZCgpOworICAgICAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHN0YXRlCisgICAgICAgICAgICAgICAgLmdldEZpcnN0UHJvcGVydHlWYWx1ZShFWFBBTkRfUFJFQ09ORElUSU9OUykpKQorICAgICAgICAgICAgICBncmFwaFRvRm9jdXMgPSBncmFwaC5nZXRQcmVDb25kaXRpb25zKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdyYXBoVG9Gb2N1cyA9IGdyYXBoLmdldFBvc3RDb25kaXRpb25zKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIE1vZGVsR3JhcGgpIHsKKyAgICAgICAgICAgIGdyYXBoVG9Gb2N1cyA9IChNb2RlbEdyYXBoKSBub2RlLmdldFVzZXJPYmplY3QoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgRGVmYXVsdFRyZWVWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKG5ldyBWaWV3Q2hhbmdlLk5FV19WSUVXKAorICAgICAgICAgICAgICBncmFwaFRvRm9jdXMsIERlZmF1bHRUcmVlVmlldy50aGlzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0pOworCisgICAgZmluYWwgU3RyaW5nIE9SREVSX1NVQl9QT1BfTUVOVV9OQU1FID0gIk9yZGVyIjsKKyAgICBmaW5hbCBTdHJpbmcgVE9fRlJPTlRfSVRFTV9OQU1FID0gIk1vdmUgVG8gRnJvbnQiOworICAgIGZpbmFsIFN0cmluZyBUT19CQUNLX0lURU1fTkFNRSA9ICJNb3ZlIFRvIEJhY2siOworICAgIGZpbmFsIFN0cmluZyBGT1JXQVJEX0lURU1fTkFNRSA9ICJNb3ZlIEZvcndhcmQiOworICAgIGZpbmFsIFN0cmluZyBCQUNLV0FSRFNfSVRFTV9OQU1FID0gIk1vdmUgQmFja3dhcmRzIjsKKyAgICBhY3Rpb25zTWVudS5hZGQob3JkZXJTdWJNZW51ID0gbmV3IFBvcHVwTWVudShPUkRFUl9TVUJfUE9QX01FTlVfTkFNRSkpOworICAgIG9yZGVyU3ViTWVudS5hZGQobmV3IE1lbnVJdGVtKFRPX0ZST05UX0lURU1fTkFNRSkpOworICAgIG9yZGVyU3ViTWVudS5hZGQobmV3IE1lbnVJdGVtKFRPX0JBQ0tfSVRFTV9OQU1FKSk7CisgICAgb3JkZXJTdWJNZW51LmFkZChuZXcgTWVudUl0ZW0oRk9SV0FSRF9JVEVNX05BTUUpKTsKKyAgICBvcmRlclN1Yk1lbnUuYWRkKG5ldyBNZW51SXRlbShCQUNLV0FSRFNfSVRFTV9OQU1FKSk7CisgICAgb3JkZXJTdWJNZW51LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgTW9kZWxHcmFwaCBncmFwaCA9IHN0YXRlLmdldFNlbGVjdGVkKCk7CisgICAgICAgIE1vZGVsR3JhcGggcGFyZW50ID0gZ3JhcGguZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoVE9fRlJPTlRfSVRFTV9OQU1FKSkgeworICAgICAgICAgIGlmIChwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoZ3JhcGgpKQorICAgICAgICAgICAgcGFyZW50LmdldENoaWxkcmVuKCkuYWRkKDAsIGdyYXBoKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoVE9fQkFDS19JVEVNX05BTUUpKSB7CisgICAgICAgICAgaWYgKHBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShncmFwaCkpCisgICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZ3JhcGgpOworICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhGT1JXQVJEX0lURU1fTkFNRSkpIHsKKyAgICAgICAgICBpbnQgaW5kZXggPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKGdyYXBoKTsKKyAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoTWF0aC5tYXgoMCwgaW5kZXggKyAxKSwgZ3JhcGgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoQkFDS1dBUkRTX0lURU1fTkFNRSkpIHsKKyAgICAgICAgICBpbnQgaW5kZXggPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKGdyYXBoKTsKKyAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoTWF0aC5tYXgoMCwgaW5kZXggLSAxKSwgZ3JhcGgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBEZWZhdWx0VHJlZVZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgRGVmYXVsdFRyZWVWaWV3LnRoaXMucmVmcmVzaFZpZXcoc3RhdGUpOworICAgICAgfQorCisgICAgfSk7CisgICAgcmV0dXJuIGFjdGlvbnNNZW51OworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0dsb2JhbENvbmZpZ1ZpZXcuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L2ltcGwvR2xvYmFsQ29uZmlnVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OThlNzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0dsb2JhbENvbmZpZ1ZpZXcuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuaW1wbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGFiYmVkUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZTsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVDZWxsUmVuZGVyZXI7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tb2RlbC5yZXBvLlhtbFdvcmtmbG93TW9kZWxSZXBvc2l0b3J5LkNvbmZpZ0dyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKKworLyoqCisgKiAKKyAqIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IGdsb2JhbCBjb25maWcgcHJvcGVydGllcyBsb2FkZWQgZnJvbSB0aGUKKyAqIFdvcmtmbG93cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdsb2JhbENvbmZpZ1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODk5MTA0OTA5Mjc4MjMyNDA3TDsKKyAgcHJpdmF0ZSBKVHJlZSB0cmVlOworICBwcml2YXRlIEpUYWJiZWRQYW5lIHRhYmJlZFBhbmU7CisgIHByaXZhdGUgTWFwPFN0cmluZywgQ29uZmlnR3JvdXA+IGdsb2JhbENvbmZpZzsKKworICBwdWJsaWMgR2xvYmFsQ29uZmlnVmlldyhTdHJpbmcgbmFtZSkgeworICAgIHN1cGVyKG5hbWUpOworICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVmcmVzaFZpZXcoVmlld1N0YXRlIHN0YXRlKSB7CisKKyAgICBSZWN0YW5nbGUgdmlzaWJsZVJlY3QgPSBudWxsOworICAgIGlmICh0aGlzLnRyZWUgIT0gbnVsbCkKKyAgICAgIHZpc2libGVSZWN0ID0gdGhpcy50cmVlLmdldFZpc2libGVSZWN0KCk7CisKKyAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiR2xvYmFsQ29uZmlnIik7CisKKyAgICBpZiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5nZXRHbG9iYWxDb25maWdHcm91cHMoKSAhPSBudWxsKSB7CisgICAgICBpZiAoZ2xvYmFsQ29uZmlnICE9IG51bGwKKyAgICAgICAgICAmJiBnbG9iYWxDb25maWcua2V5U2V0KCkuZXF1YWxzKAorICAgICAgICAgICAgICBzdGF0ZS5nZXRHbG9iYWxDb25maWdHcm91cHMoKS5rZXlTZXQoKSkKKyAgICAgICAgICAmJiBnbG9iYWxDb25maWcudmFsdWVzKCkuZXF1YWxzKAorICAgICAgICAgICAgICBzdGF0ZS5nZXRHbG9iYWxDb25maWdHcm91cHMoKS52YWx1ZXMoKSkpCisgICAgICAgIHJldHVybjsKKworICAgICAgdGhpcy5yZW1vdmVBbGwoKTsKKworICAgICAgZm9yIChDb25maWdHcm91cCBncm91cCA6IChnbG9iYWxDb25maWcgPSBzdGF0ZS5nZXRHbG9iYWxDb25maWdHcm91cHMoKSkKKyAgICAgICAgICAudmFsdWVzKCkpIHsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGtleXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgZ3JvdXBOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoCisgICAgICAgICAgICBuZXcgR3JvdXAoZ3JvdXAuZ2V0TmFtZSgpKSk7CisgICAgICAgIHJvb3QuYWRkKGdyb3VwTm9kZSk7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGdyb3VwLmdldE1ldGFkYXRhKCkuZ2V0QWxsS2V5cygpKSB7CisgICAgICAgICAga2V5cy5hZGQoa2V5KTsKKyAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGtleU5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShuZXcgS2V5KAorICAgICAgICAgICAgICBrZXkpKTsKKyAgICAgICAgICBncm91cE5vZGUuYWRkKGtleU5vZGUpOworICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdmFsdWVOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoCisgICAgICAgICAgICAgIG5ldyBWYWx1ZShTdHJpbmdVdGlscy5qb2luKGdyb3VwLmdldE1ldGFkYXRhKCkKKyAgICAgICAgICAgICAgICAgIC5nZXRBbGxNZXRhZGF0YShrZXkpLCAiLCIpKSk7CisgICAgICAgICAga2V5Tm9kZS5hZGQodmFsdWVOb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3JvdXAuZ2V0RXh0ZW5kcygpICE9IG51bGwpIHsKKyAgICAgICAgICBMaXN0PFN0cmluZz4gZXh0ZW5kc0dyb3VwcyA9IG5ldyBWZWN0b3I8U3RyaW5nPihncm91cC5nZXRFeHRlbmRzKCkpOworICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoZXh0ZW5kc0dyb3Vwcyk7CisgICAgICAgICAgZm9yIChTdHJpbmcgZXh0ZW5kc0dyb3VwIDogZXh0ZW5kc0dyb3VwcykgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGdyb3VwS2V5cyA9IHN0YXRlLmdldEdsb2JhbENvbmZpZ0dyb3VwcygpCisgICAgICAgICAgICAgICAgLmdldChleHRlbmRzR3JvdXApLmdldE1ldGFkYXRhKCkuZ2V0QWxsS2V5cygpOworICAgICAgICAgICAgZ3JvdXBLZXlzLnJlbW92ZUFsbChrZXlzKTsKKyAgICAgICAgICAgIGlmIChncm91cEtleXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBncm91cEtleXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWtleXMuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgICAgICAgICAga2V5cy5hZGQoa2V5KTsKKyAgICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUga2V5Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKAorICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRlbmRzS2V5KGV4dGVuZHNHcm91cCwga2V5KSk7CisgICAgICAgICAgICAgICAgICBncm91cE5vZGUuYWRkKGtleU5vZGUpOworICAgICAgICAgICAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSB2YWx1ZU5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0ZW5kc1ZhbHVlKFN0cmluZ1V0aWxzLmpvaW4oc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEdsb2JhbENvbmZpZ0dyb3VwcygpLmdldChleHRlbmRzR3JvdXApCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRhZGF0YSgpLmdldEFsbE1ldGFkYXRhKGtleSksICIsIikpKTsKKyAgICAgICAgICAgICAgICAgIGtleU5vZGUuYWRkKHZhbHVlTm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRyZWUgPSBuZXcgSlRyZWUocm9vdCk7CisgICAgICB0cmVlLnNldFNob3dzUm9vdEhhbmRsZXModHJ1ZSk7CisgICAgICB0cmVlLnNldFJvb3RWaXNpYmxlKGZhbHNlKTsKKworICAgICAgdHJlZS5zZXRDZWxsUmVuZGVyZXIobmV3IFRyZWVDZWxsUmVuZGVyZXIoKSB7CisKKyAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUcmVlIHRyZWUsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gZXhwYW5kZWQsIGJvb2xlYW4gbGVhZiwgaW50IHJvdywKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgdmFsdWU7CisgICAgICAgICAgaWYgKG5vZGUuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgS2V5KSB7CisgICAgICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICAgIEpMYWJlbCBsYWJlbCA9IG5ldyBKTGFiZWwobm9kZS5nZXRVc2VyT2JqZWN0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLmRhcmtHcmF5KTsKKyAgICAgICAgICAgIHBhbmVsLmFkZChsYWJlbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgICBwYW5lbC5zZXRCYWNrZ3JvdW5kKHNlbGVjdGVkID8gQ29sb3IubGlnaHRHcmF5IDogQ29sb3Iud2hpdGUpOworICAgICAgICAgICAgcmV0dXJuIHBhbmVsOworICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBFeHRlbmRzS2V5KSB7CisgICAgICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICAgIEV4dGVuZHNLZXkga2V5ID0gKEV4dGVuZHNLZXkpIG5vZGUuZ2V0VXNlck9iamVjdCgpOworICAgICAgICAgICAgSkxhYmVsIGdyb3VwTGFiZWwgPSBuZXcgSkxhYmVsKCIoIiArIGtleS5nZXRHcm91cCgpICsgIikgIik7CisgICAgICAgICAgICBncm91cExhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuYmxhY2spOworICAgICAgICAgICAgSkxhYmVsIGtleUxhYmVsID0gbmV3IEpMYWJlbChrZXkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBrZXlMYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLmdyYXkpOworICAgICAgICAgICAgcGFuZWwuYWRkKGdyb3VwTGFiZWwsIEJvcmRlckxheW91dC5XRVNUKTsKKyAgICAgICAgICAgIHBhbmVsLmFkZChrZXlMYWJlbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgICBwYW5lbC5zZXRCYWNrZ3JvdW5kKHNlbGVjdGVkID8gQ29sb3IubGlnaHRHcmF5IDogQ29sb3Iud2hpdGUpOworICAgICAgICAgICAgcmV0dXJuIHBhbmVsOworICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBHcm91cCkgeworICAgICAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOworICAgICAgICAgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgICAgICBKTGFiZWwgbGFiZWwgPSBuZXcgSkxhYmVsKG5vZGUuZ2V0VXNlck9iamVjdCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5ibGFjayk7CisgICAgICAgICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlKTsKKyAgICAgICAgICAgIHBhbmVsLmFkZChsYWJlbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgICBwYW5lbC5zZXRCYWNrZ3JvdW5kKHNlbGVjdGVkID8gQ29sb3IubGlnaHRHcmF5IDogQ29sb3Iud2hpdGUpOworICAgICAgICAgICAgcmV0dXJuIHBhbmVsOworICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBWYWx1ZSkgeworICAgICAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOworICAgICAgICAgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgICAgICBwYW5lbC5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigxKSk7CisgICAgICAgICAgICBKTGFiZWwgbGFiZWwgPSBuZXcgSkxhYmVsKG5vZGUuZ2V0VXNlck9iamVjdCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5ibGFjayk7CisgICAgICAgICAgICBwYW5lbC5hZGQobGFiZWwsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICAgICAgcGFuZWwuc2V0QmFja2dyb3VuZChzZWxlY3RlZCA/IENvbG9yLmxpZ2h0R3JheSA6IENvbG9yLndoaXRlKTsKKyAgICAgICAgICAgIHJldHVybiBwYW5lbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgRXh0ZW5kc1ZhbHVlKSB7CisgICAgICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICAgIHBhbmVsLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKDEpKTsKKyAgICAgICAgICAgIEpMYWJlbCBsYWJlbCA9IG5ldyBKTGFiZWwobm9kZS5nZXRVc2VyT2JqZWN0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLmdyYXkpOworICAgICAgICAgICAgcGFuZWwuYWRkKGxhYmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgICAgIHBhbmVsLnNldEJhY2tncm91bmQoc2VsZWN0ZWQgPyBDb2xvci5saWdodEdyYXkgOiBDb2xvci53aGl0ZSk7CisgICAgICAgICAgICByZXR1cm4gcGFuZWw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSkxhYmVsKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0pOworICAgIH0KKworICAgIHRoaXMuc2V0Qm9yZGVyKG5ldyBFdGNoZWRCb3JkZXIoKSk7CisgICAgSkxhYmVsIHBhbmVsTmFtZSA9IG5ldyBKTGFiZWwoIkdsb2JhbC1Db25maWcgR3JvdXBzIik7CisgICAgcGFuZWxOYW1lLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOworICAgIHRoaXMuYWRkKHBhbmVsTmFtZSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRyZWUsCisgICAgICAgIEpTY3JvbGxQYW5lLlZFUlRJQ0FMX1NDUk9MTEJBUl9BTFdBWVMsCisgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FMV0FZUyk7CisKKyAgICB0YWJiZWRQYW5lID0gbmV3IEpUYWJiZWRQYW5lKCk7CisgICAgdGFiYmVkUGFuZS5hZGRUYWIoIlRyZWUiLCBzY3JvbGxQYW5lKTsKKyAgICB0YWJiZWRQYW5lLmFkZFRhYigiVGFibGUiLCBuZXcgSlBhbmVsKCkpOworCisgICAgdGhpcy5hZGQodGFiYmVkUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisKKyAgICBpZiAodmlzaWJsZVJlY3QgIT0gbnVsbCkKKyAgICAgIHRoaXMudHJlZS5zY3JvbGxSZWN0VG9WaXNpYmxlKHZpc2libGVSZWN0KTsKKworICAgIHRoaXMucmV2YWxpZGF0ZSgpOworICB9CisKKyAgcHVibGljIGNsYXNzIFN0cmluZ05vZGUgeworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFN0cmluZ05vZGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLnZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgY2xhc3MgS2V5IGV4dGVuZHMgU3RyaW5nTm9kZSB7CisgICAgcHVibGljIEtleShTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHN1cGVyKHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgY2xhc3MgRXh0ZW5kc0tleSBleHRlbmRzIFN0cmluZ05vZGUgeworICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwOworCisgICAgcHVibGljIEV4dGVuZHNLZXkoU3RyaW5nIGdyb3VwLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHN1cGVyKHZhbHVlKTsKKyAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwKCkgeworICAgICAgcmV0dXJuIHRoaXMuZ3JvdXA7CisgICAgfQorICB9CisKKyAgcHVibGljIGNsYXNzIEV4dGVuZHNWYWx1ZSBleHRlbmRzIFN0cmluZ05vZGUgeworICAgIHB1YmxpYyBFeHRlbmRzVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICBzdXBlcih2YWx1ZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGNsYXNzIFZhbHVlIGV4dGVuZHMgU3RyaW5nTm9kZSB7CisgICAgcHVibGljIFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgc3VwZXIodmFsdWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBjbGFzcyBHcm91cCBleHRlbmRzIFN0cmluZ05vZGUgeworICAgIHB1YmxpYyBHcm91cChTdHJpbmcgZ3JvdXApIHsKKyAgICAgIHN1cGVyKGdyb3VwKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvaW1wbC9HcmFwaFZpZXcuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L2ltcGwvR3JhcGhWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0NjlkMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L2ltcGwvR3JhcGhWaWV3LmphdmEKQEAgLTAsMCArMSwxMTAwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5pbXBsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkN1cnNvcjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0Lk1lbnVJdGVtOworaW1wb3J0IGphdmEuYXd0LlBvaW50OworaW1wb3J0IGphdmEuYXd0LlBvcHVwTWVudTsKK2ltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CitpbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKK2ltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuRGF0YUZsYXZvcjsKK2ltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuVHJhbnNmZXJhYmxlOworaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5VbnN1cHBvcnRlZEZsYXZvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmF3dC5kbmQuRG5EQ29uc3RhbnRzOworaW1wb3J0IGphdmEuYXd0LmRuZC5EcmFnR2VzdHVyZUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmRuZC5EcmFnR2VzdHVyZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmRuZC5EcmFnU291cmNlOworaW1wb3J0IGphdmEuYXd0LmRuZC5EcmFnU291cmNlRHJhZ0V2ZW50OworaW1wb3J0IGphdmEuYXd0LmRuZC5EcmFnU291cmNlRHJvcEV2ZW50OworaW1wb3J0IGphdmEuYXd0LmRuZC5EcmFnU291cmNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VNb3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZVdoZWVsTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkxpbmVCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOworCisvL0pHcmFwaCBpbXBvcnRzCitpbXBvcnQgb3JnLmpncmFwaC5KR3JhcGg7CitpbXBvcnQgb3JnLmpncmFwaC5ncmFwaC5BdHRyaWJ1dGVNYXA7CitpbXBvcnQgb3JnLmpncmFwaC5ncmFwaC5EZWZhdWx0R3JhcGhDZWxsOworaW1wb3J0IG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEVkZ2U7CitpbXBvcnQgb3JnLmpncmFwaC5ncmFwaC5HcmFwaENvbnN0YW50czsKK2ltcG9ydCBjb20uamdyYXBoLmxheW91dC5KR3JhcGhGYWNhZGU7CitpbXBvcnQgY29tLmpncmFwaC5sYXlvdXQuaGllcmFyY2hpY2FsLkpHcmFwaEhpZXJhcmNoaWNhbExheW91dDsKKworLy9KdW5nIGltcG9ydHMKK2ltcG9ydCBlZHUudWNpLmljcy5qdW5nLmdyYXBoLkRpcmVjdGVkU3BhcnNlR3JhcGg7CitpbXBvcnQgZWR1LnVjaS5pY3MuanVuZy5ncmFwaC5PYnNlcnZhYmxlR3JhcGg7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwuTW9kZWxHcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tb2RlbC5Nb2RlbE5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5WaWV3OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlld0NoYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsLkd1aVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnV0aWwuSWNvbkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsLkxpbmU7CisKKy8qKgorICogCisgKiBUaGlzIGlzIHdoZXJlIHRoZSBtb25leSBoYXBwZW5zLiBUaGUgR3JhcGggdmlzdWFsaXphdGlvbiBvZiBPT0RUIENBUworICogd29ya2Zsb3dzIGlzIGRpc3BsYXllZCB2aWEgdGhpcyB2aWV3LCB3aGljaCBtYWdpY2FsbHkgaW50ZWdyYXRlcyBKR3JhcGgsCisgKiBKdW5nLCBhbmQgT09EVC4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdyYXBoVmlldyBleHRlbmRzIERlZmF1bHRUcmVlVmlldyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTkzNTU3ODM4NTI1NDg4NDM4N0w7CisKKyAgcHJpdmF0ZSBKdW5nSkdyYXBoTW9kZWxBZGFwdGVyIG1famdBZGFwdGVyOworICBwcml2YXRlIEpHcmFwaCBqZ3JhcGg7CisgIHByaXZhdGUgT2JzZXJ2YWJsZUdyYXBoPE1vZGVsTm9kZSwgSWRlbnRpZmlhYmxlRWRnZT4gZGlyZWN0ZWRHcmFwaDsKKworICBwcml2YXRlIE15R3JhcGhMaXN0ZW5lciBteUdyYXBoTGlzdGVuZXI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVGX1dPUktGTE9XID0gIlZpZXcgUmVmZXJyZW5jZWQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OU19QT1BfTUVOVV9OQU1FID0gIkFjdGlvbnMiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NVQl9QT1BfTUVOVV9OQU1FID0gIk5ldyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEFTS19JVEVNX05BTUUgPSAiVGFzayI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09ORElUSU9OX0lURU1fTkFNRSA9ICJDb25kaXRpb24iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BBUkFMTEVMX0lURU1fTkFNRSA9ICJQYXJhbGxlbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU0VRVUVOVElBTF9JVEVNX05BTUUgPSAiU2VxdWVudGlhbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFREdFU19TVUJfUE9QX01FTlVfTkFNRSA9ICJFZGdlcyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0xFVkVMID0gIlRhc2sgTGV2ZWwiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfTEVWRUwgPSAiV29ya2Zsb3cgTGV2ZWwiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0lURU1fTkFNRSA9ICJEZWxldGUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0lURU1fTkFNRSA9ICJGb3JtYXQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfU1VCX1BPUF9NRU5VX05BTUUgPSAiT3JkZXIiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9fRlJPTlRfSVRFTV9OQU1FID0gIk1vdmUgVG8gRnJvbnQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9fQkFDS19JVEVNX05BTUUgPSAiTW92ZSBUbyBCYWNrIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfSVRFTV9OQU1FID0gIk1vdmUgRm9yd2FyZCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLV0FSRFNfSVRFTV9OQU1FID0gIk1vdmUgQmFja3dhcmRzIjsKKworICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBQYWlyPiBlZGdlTWFwOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRSA9ICJHcmFwaFZpZXcvc2NhbGUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURHRV9ESVNQTEFZX01PREUgPSAiR3JhcGhWaWV3L0VkZ2VEaXNwbGF5L01vZGUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19NT0RFID0gIlRhc2siOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfTU9ERSA9ICJXb3JrZmxvdyI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzY3JvbGxTZWxlY3RlZFRvVmlzaWJsZSA9IGZhbHNlOworCisgIHB1YmxpYyBHcmFwaFZpZXcoU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihuYW1lKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWZyZXNoVmlldyhmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICB0aGlzLnJlbW92ZUFsbCgpOworICAgIHRoaXMubXlHcmFwaExpc3RlbmVyID0gbmV3IE15R3JhcGhMaXN0ZW5lcihzdGF0ZSk7CisKKyAgICBSZWN0YW5nbGUgdmlzaWJsZSA9IG51bGw7CisgICAgaWYgKGpncmFwaCAhPSBudWxsKQorICAgICAgdmlzaWJsZSA9IGpncmFwaC5nZXRWaXNpYmxlUmVjdCgpOworCisgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgaWYgKGpncmFwaCAhPSBudWxsKQorICAgICAgY3Vyc29yID0gamdyYXBoLmdldEN1cnNvcigpOworCisgICAgdGhpcy5lZGdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYWlyPigpOworCisgICAgZGlyZWN0ZWRHcmFwaCA9IG5ldyBPYnNlcnZhYmxlR3JhcGg8TW9kZWxOb2RlLCBJZGVudGlmaWFibGVFZGdlPigKKyAgICAgICAgbmV3IERpcmVjdGVkU3BhcnNlR3JhcGg8TW9kZWxOb2RlLCBJZGVudGlmaWFibGVFZGdlPigpKTsKKyAgICBtX2pnQWRhcHRlciA9IG5ldyBKdW5nSkdyYXBoTW9kZWxBZGFwdGVyKGRpcmVjdGVkR3JhcGgpOworCisgICAgamdyYXBoID0gbmV3IEpHcmFwaChtX2pnQWRhcHRlcik7CisgICAgZm9yIChNb3VzZUxpc3RlbmVyIG1sIDogamdyYXBoLmdldE1vdXNlTGlzdGVuZXJzKCkpCisgICAgICBqZ3JhcGgucmVtb3ZlTW91c2VMaXN0ZW5lcihtbCk7CisgICAgZm9yIChNb3VzZU1vdGlvbkxpc3RlbmVyIG1sIDogamdyYXBoLmdldE1vdXNlTW90aW9uTGlzdGVuZXJzKCkpCisgICAgICBqZ3JhcGgucmVtb3ZlTW91c2VNb3Rpb25MaXN0ZW5lcihtbCk7CisgICAgZm9yIChNb3VzZVdoZWVsTGlzdGVuZXIgbWwgOiBqZ3JhcGguZ2V0TW91c2VXaGVlbExpc3RlbmVycygpKQorICAgICAgamdyYXBoLnJlbW92ZU1vdXNlV2hlZWxMaXN0ZW5lcihtbCk7CisgICAgamdyYXBoLnNldEJhY2tncm91bmQoQ29sb3Iud2hpdGUpOworICAgIGpncmFwaC5zZXRBbnRpQWxpYXNlZCh0cnVlKTsKKyAgICBqZ3JhcGguc2V0TW92ZWFibGUoZmFsc2UpOworICAgIFN0cmluZyBzY2FsZSA9IHN0YXRlLmdldEZpcnN0UHJvcGVydHlWYWx1ZShTQ0FMRSk7CisgICAgaWYgKHNjYWxlID09IG51bGwpCisgICAgICBzdGF0ZS5zZXRQcm9wZXJ0eShTQ0FMRSwgc2NhbGUgPSAiMS4wIik7CisgICAgamdyYXBoLnNldFNjYWxlKERvdWJsZS5wYXJzZURvdWJsZShzY2FsZSkpOworCisgICAgRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gRHJhZ1NvdXJjZS5nZXREZWZhdWx0RHJhZ1NvdXJjZSgpOworICAgIGRyYWdTb3VyY2UuY3JlYXRlRGVmYXVsdERyYWdHZXN0dXJlUmVjb2duaXplcih0aGlzLmpncmFwaCwKKyAgICAgICAgRG5EQ29uc3RhbnRzLkFDVElPTl9NT1ZFLCBuZXcgRHJhZ0dlc3R1cmVMaXN0ZW5lcigpIHsKKworICAgICAgICAgIERlZmF1bHRHcmFwaENlbGwgbW92ZUNlbGwgPSBudWxsOworICAgICAgICAgIE1vZGVsR3JhcGggbW92ZUdyYXBoID0gbnVsbDsKKworICAgICAgICAgIHB1YmxpYyB2b2lkIGRyYWdHZXN0dXJlUmVjb2duaXplZChmaW5hbCBEcmFnR2VzdHVyZUV2ZW50IGRnZSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmdldE1vZGUoKSA9PSBWaWV3Lk1vZGUuTU9WRQorICAgICAgICAgICAgICAgIHx8IHN0YXRlLmdldE1vZGUoKSA9PSBWaWV3Lk1vZGUuRURJVCkgeworICAgICAgICAgICAgICBPYmplY3QgbW92ZU92ZXJDZWxsID0gamdyYXBoLmdldEZpcnN0Q2VsbEZvckxvY2F0aW9uKGRnZQorICAgICAgICAgICAgICAgICAgLmdldERyYWdPcmlnaW4oKS5nZXRYKCksIGRnZS5nZXREcmFnT3JpZ2luKCkuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgaWYgKG1vdmVPdmVyQ2VsbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vdmVPdmVyQ2VsbCBpbnN0YW5jZW9mIERlZmF1bHRFZGdlKSB7CisgICAgICAgICAgICAgICAgICBtb3ZlQ2VsbCA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3ZlT3ZlckNlbGwgaW5zdGFuY2VvZiBEZWZhdWx0R3JhcGhDZWxsKSB7CisgICAgICAgICAgICAgICAgICBtb3ZlQ2VsbCA9IChEZWZhdWx0R3JhcGhDZWxsKSBtb3ZlT3ZlckNlbGw7CisgICAgICAgICAgICAgICAgICBtb3ZlR3JhcGggPSBHdWlVdGlscy5maW5kKHN0YXRlLmdldEdyYXBocygpLAorICAgICAgICAgICAgICAgICAgICAgICgoTW9kZWxOb2RlKSAoKERlZmF1bHRHcmFwaENlbGwpIG1vdmVDZWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VXNlck9iamVjdCgpKS5nZXRJZCgpKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmdldE1vZGUoKSA9PSBWaWV3Lk1vZGUuTU9WRSkKKyAgICAgICAgICAgICAgICAgICAgbW92ZUNlbGwgPSBHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZlcnRleENlbGwoKG1vdmVHcmFwaCA9IG1vdmVHcmFwaC5nZXRSb290UGFyZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1vZGVsKCkpOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3VpVXRpbHMuaXNEdW1teU5vZGUobW92ZUdyYXBoLmdldE1vZGVsKCkpKQorICAgICAgICAgICAgICAgICAgICBtb3ZlQ2VsbCA9IEdyYXBoVmlldy50aGlzLm1famdBZGFwdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmVydGV4Q2VsbCgobW92ZUdyYXBoID0gbW92ZUdyYXBoLmdldFBhcmVudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNb2RlbCgpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vdmVHcmFwaC5nZXRNb2RlbCgpLmlzUmVmKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1vdmVHcmFwaC5nZXRQYXJlbnQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtb3ZlR3JhcGguZ2V0UGFyZW50KCkuZ2V0TW9kZWwoKS5pc1JlZigpKQorICAgICAgICAgICAgICAgICAgICAgIG1vdmVHcmFwaCA9IG1vdmVHcmFwaC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZUNlbGwgPSBHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZlcnRleENlbGwobW92ZUdyYXBoLmdldE1vZGVsKCkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZmluYWwgZG91YmxlIHNjYWxlID0gRG91YmxlLnBhcnNlRG91YmxlKHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0UHJvcGVydHlWYWx1ZShTQ0FMRSkpOworICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdGFuZ2xlMkQgYm91bmRzID0gKFJlY3RhbmdsZTJEKSBHcmFwaFZpZXcudGhpcy5qZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlcyhtb3ZlQ2VsbCkuZ2V0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUyk7CisgICAgICAgICAgICAgICAgICBQb2ludCBvZmZzZXQgPSBuZXcgUG9pbnQoCisgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kcy5nZXRYKCkgKiBzY2FsZSAtIGRnZS5nZXREcmFnT3JpZ2luKCkuZ2V0WCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRzLmdldFkoKSAqIHNjYWxlIC0gZGdlLmdldERyYWdPcmlnaW4oKS5nZXRZKCkpKTsKKyAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZSgoaW50KSAoYm91bmRzCisgICAgICAgICAgICAgICAgICAgICAgLmdldFdpZHRoKCkgKiBzY2FsZSksIChpbnQpIChib3VuZHMuZ2V0SGVpZ2h0KCkgKiBzY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKKyAgICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZzJkID0gaW1hZ2UuY3JlYXRlR3JhcGhpY3MoKTsKKyAgICAgICAgICAgICAgICAgIGcyZC5zZXRDb2xvcihDb2xvci5ibGFjayk7CisgICAgICAgICAgICAgICAgICBnMmQuZHJhd1JlY3QoKGludCkgKDIgKiBzY2FsZSksIChpbnQpICgyICogc2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgoYm91bmRzLmdldFdpZHRoKCkgLSA0KSAqIHNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKGJvdW5kcy5nZXRIZWlnaHQoKSAtIDQpICogc2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgIGRnZS5zdGFydERyYWcoR3JhcGhWaWV3LnRoaXMuZ2V0Q3Vyc29yKCksIGltYWdlLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zZmVyYWJsZSgpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmFuc2ZlckRhdGEoRGF0YUZsYXZvciBmbGF2b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRmxhdm9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGF2b3IuZ2V0SHVtYW5QcmVzZW50YWJsZU5hbWUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0R3JhcGhDZWxsLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGbGF2b3JFeGNlcHRpb24oZmxhdm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIERhdGFGbGF2b3JbXSBnZXRUcmFuc2ZlckRhdGFGbGF2b3JzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFGbGF2b3JbXSB7IG5ldyBEYXRhRmxhdm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEdyYXBoQ2VsbC5jbGFzcywgRGVmYXVsdEdyYXBoQ2VsbC5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUZsYXZvclN1cHBvcnRlZChEYXRhRmxhdm9yIGZsYXZvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhdm9yLmdldEh1bWFuUHJlc2VudGFibGVOYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEdyYXBoQ2VsbC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgfSwgbmV3IERyYWdTb3VyY2VMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNb2RlbEdyYXBoIG1vdXNlT3ZlckdyYXBoOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBEZWZhdWx0R3JhcGhDZWxsIG1vdXNlT3ZlckNlbGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRyYWdEcm9wRW5kKERyYWdTb3VyY2VEcm9wRXZlbnQgZHNkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRSQUcgRU5EISEhISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW92ZUNlbGwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IGRyb3BQb2ludCA9IG5ldyBQb2ludChkc2RlLmdldFgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBqZ3JhcGguZ2V0TG9jYXRpb25PblNjcmVlbigpLngsIGRzZGUuZ2V0WSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGpncmFwaC5nZXRMb2NhdGlvbk9uU2NyZWVuKCkueSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRHcmFwaENlbGwgZW5kQ2VsbCA9IChEZWZhdWx0R3JhcGhDZWxsKSBHcmFwaFZpZXcudGhpcy5qZ3JhcGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25DZWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRDZWxsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbEdyYXBoIGVuZEdyYXBoID0gR3VpVXRpbHMuZmluZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTW9kZWxOb2RlKSBlbmRDZWxsLmdldFVzZXJPYmplY3QoKSkuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRHcmFwaC5nZXRNb2RlbCgpLmlzUGFyZW50VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEd1aVV0aWxzLmlzU3ViR3JhcGgobW92ZUdyYXBoLCBlbmRHcmFwaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVHcmFwaC5nZXRQYXJlbnQoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVtb3ZlR3JhcGgobW92ZUdyYXBoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHdWlVdGlscy5yZW1vdmVOb2RlKHN0YXRlLmdldEdyYXBocygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVHcmFwaC5nZXRNb2RlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFZpZXcudGhpcy5yZW1vdmVTaGlmdChzdGF0ZSwgbW92ZUdyYXBoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHdWlVdGlscy5hZGRDaGlsZChzdGF0ZS5nZXRHcmFwaHMoKSwgZW5kR3JhcGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1vZGVsKCkuZ2V0SWQoKSwgbW92ZUdyYXBoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW92ZUdyYXBoLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd1aVV0aWxzLnJlbW92ZU5vZGUoc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUdyYXBoLmdldE1vZGVsKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuYWRkR3JhcGgobW92ZUdyYXBoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2hpZnRQb2ludCA9IG5ldyBQb2ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKChkcm9wUG9pbnQueCAtIChkZ2UuZ2V0RHJhZ09yaWdpbigpLnggLSAoYm91bmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WCgpICogc2NhbGUpKSkgLyBzY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgoZHJvcFBvaW50LnkgLSAoZGdlLmdldERyYWdPcmlnaW4oKS55IC0gKGJvdW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFkoKSAqIHNjYWxlKSkpIC8gc2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFZpZXcudGhpcy5zZXRTaGlmdChzdGF0ZSwgbW92ZUdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdFBvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJhZ1NvdXJjZURyYWdFdmVudCBkc2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlckNlbGwgPSAoRGVmYXVsdEdyYXBoQ2VsbCkgR3JhcGhWaWV3LnRoaXMuamdyYXBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDZWxsRm9yTG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNkZS5nZXRYKCkgLSBqZ3JhcGguZ2V0TG9jYXRpb25PblNjcmVlbigpLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNkZS5nZXRZKCkgLSBqZ3JhcGguZ2V0TG9jYXRpb25PblNjcmVlbigpLnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZU92ZXJHcmFwaCA9IEd1aVV0aWxzLmZpbmQoc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1vZGVsTm9kZSkgbW91c2VPdmVyQ2VsbC5nZXRVc2VyT2JqZWN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkcmFnRXhpdChEcmFnU291cmNlRXZlbnQgZHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRFJBRyBFWElUISEhISIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcmFnU291cmNlRHJhZ0V2ZW50IGRzZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmdldE1vZGUoKS5lcXVhbHMoTW9kZS5FRElUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3VzZU92ZXJDZWxsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZTJEIGN1cnJlbnRCb3VuZHMgPSAoUmVjdGFuZ2xlMkQpIG1vdXNlT3ZlckNlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlcygpLmdldChHcmFwaENvbnN0YW50cy5CT1VORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgY3VycmVudFBvaW50ID0gbmV3IFBvaW50KGRzZGUuZ2V0WCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBqZ3JhcGguZ2V0TG9jYXRpb25PblNjcmVlbigpLngsIGRzZGUuZ2V0WSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBqZ3JhcGguZ2V0TG9jYXRpb25PblNjcmVlbigpLnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCb3VuZHMuY29udGFpbnMoY3VycmVudFBvaW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1vZGVsR3JhcGggY2hpbGQgOiBtb3VzZU92ZXJHcmFwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0R3JhcGhDZWxsIG1vdXNlT3ZlckNlbGxMb2MgPSBHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmVydGV4Q2VsbChjaGlsZC5nZXRNb2RlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Qm91bmRzID0gKFJlY3RhbmdsZTJEKSBtb3VzZU92ZXJDZWxsTG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGVzKCkuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhDb25zdGFudHMuQk9VTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJvdW5kcy5jb250YWlucyhjdXJyZW50UG9pbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZU92ZXJDZWxsID0gbW91c2VPdmVyQ2VsbExvYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlckdyYXBoID0gY2hpbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3VzZU92ZXJHcmFwaC5nZXRQYXJlbnQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIW1vdXNlT3ZlckdyYXBoLmlzQ29uZGl0aW9uKCkgfHwgKG1vdXNlT3ZlckdyYXBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzQ29uZGl0aW9uKCkgJiYgbW91c2VPdmVyR3JhcGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyZW50KCkuaXNDb25kaXRpb24oKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VPdmVyQ2VsbCA9IEdyYXBoVmlldy50aGlzLm1famdBZGFwdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZXJ0ZXhDZWxsKChtb3VzZU92ZXJHcmFwaCA9IG1vdXNlT3ZlckdyYXBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyZW50KCkpLmdldE1vZGVsKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCb3VuZHMgPSAoUmVjdGFuZ2xlMkQpIG1vdXNlT3ZlckNlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZXMoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaENvbnN0YW50cy5CT1VORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlckNlbGwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlckdyYXBoID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZU92ZXJDZWxsID0gKERlZmF1bHRHcmFwaENlbGwpIEdyYXBoVmlldy50aGlzLmpncmFwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdENlbGxGb3JMb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNkZS5nZXRYKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gamdyYXBoLmdldExvY2F0aW9uT25TY3JlZW4oKS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2RlLmdldFkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBqZ3JhcGguZ2V0TG9jYXRpb25PblNjcmVlbigpLnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlT3ZlckNlbGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VPdmVyR3JhcGggPSBHdWlVdGlscy5maW5kKHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0R3JhcGhzKCksICgoTW9kZWxOb2RlKSBtb3VzZU92ZXJDZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VXNlck9iamVjdCgpKS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VPdmVyR3JhcGggPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW91c2VPdmVyR3JhcGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEd1aVV0aWxzLmlzRHVtbXlOb2RlKG1vdXNlT3ZlckdyYXBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1vZGVsKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlckdyYXBoID0gbW91c2VPdmVyR3JhcGguZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobW91c2VPdmVyR3JhcGggIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbW91c2VPdmVyR3JhcGguZ2V0TW9kZWwoKS5pc1JlZigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlT3ZlckdyYXBoID0gbW91c2VPdmVyR3JhcGguZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW91c2VPdmVyR3JhcGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VPdmVyQ2VsbCA9IEdyYXBoVmlldy50aGlzLm1famdBZGFwdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmVydGV4Q2VsbChtb3VzZU92ZXJHcmFwaC5nZXRNb2RlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VPdmVyQ2VsbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoVmlldy50aGlzLmpncmFwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uQ2VsbHMobmV3IE9iamVjdFtdIHsgbW91c2VPdmVyQ2VsbCB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkcm9wQWN0aW9uQ2hhbmdlZChEcmFnU291cmNlRHJhZ0V2ZW50IGRzZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEUkFHIENIQU5HRSEhISEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICB9KTsKKworICAgIExpc3Q8TGluZT4gbGluZXMgPSBHdWlVdGlscy5maW5kTGluZXMoc3RhdGUuZ2V0R3JhcGhzKCkpOworICAgIGZvciAoTGluZSBsaW5lIDogbGluZXMpIHsKKyAgICAgIGlmICghdGhpcy5kaXJlY3RlZEdyYXBoLmNvbnRhaW5zVmVydGV4KGxpbmUuZ2V0RnJvbU1vZGVsKCkpKQorICAgICAgICB0aGlzLmRpcmVjdGVkR3JhcGguYWRkVmVydGV4KGxpbmUuZ2V0RnJvbU1vZGVsKCkpOworCisgICAgICBpZiAobGluZS5nZXRUb01vZGVsKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAoIXRoaXMuZGlyZWN0ZWRHcmFwaC5jb250YWluc1ZlcnRleChsaW5lLmdldFRvTW9kZWwoKSkpCisgICAgICAgICAgdGhpcy5kaXJlY3RlZEdyYXBoLmFkZFZlcnRleChsaW5lLmdldFRvTW9kZWwoKSk7CisgICAgICAgIElkZW50aWZpYWJsZUVkZ2UgZWRnZSA9IG5ldyBJZGVudGlmaWFibGVFZGdlKGxpbmUuZ2V0RnJvbU1vZGVsKCksIGxpbmUuZ2V0VG9Nb2RlbCgpKTsKKyAgICAgICAgZGlyZWN0ZWRHcmFwaC5hZGRFZGdlKGVkZ2UsIGxpbmUuZ2V0RnJvbU1vZGVsKCksIGxpbmUuZ2V0VG9Nb2RlbCgpKTsKKyAgICAgICAgdGhpcy5lZGdlTWFwLnB1dChlZGdlLmlkLCBuZXcgUGFpcihsaW5lLmdldEZyb21Nb2RlbCgpICE9IG51bGwgPyBsaW5lCisgICAgICAgICAgICAuZ2V0RnJvbU1vZGVsKCkuZ2V0SWQoKSA6IG51bGwsIGxpbmUuZ2V0VG9Nb2RlbCgpLmdldElkKCkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBKR3JhcGhGYWNhZGUgZmFjYWRlID0gbmV3IEpHcmFwaEZhY2FkZShqZ3JhcGgpOworICAgIGZhY2FkZS5zZXRJZ25vcmVzVW5jb25uZWN0ZWRDZWxscyhmYWxzZSk7CisgICAgSkdyYXBoSGllcmFyY2hpY2FsTGF5b3V0IGxheW91dCA9IG5ldyBKR3JhcGhIaWVyYXJjaGljYWxMYXlvdXQoKTsKKyAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oU3dpbmdDb25zdGFudHMuV0VTVCk7CisgICAgbGF5b3V0LnNldEludHJhQ2VsbFNwYWNpbmcoNzAuMCk7CisgICAgbGF5b3V0LnNldExheW91dEZyb21TaW5rcyhmYWxzZSk7CisgICAgbGF5b3V0LnJ1bihmYWNhZGUpOworICAgIE1hcCBuZXN0ZWQgPSBmYWNhZGUuY3JlYXRlTmVzdGVkTWFwKHRydWUsIHRydWUpOworICAgIGlmIChuZXN0ZWQgIT0gbnVsbCkgeworICAgICAgdGhpcy5oaWRlRHVtbXlOb2RlcyhuZXN0ZWQpOworICAgICAgdGhpcy5hZGRHcm91cHMoc3RhdGUuZ2V0R3JhcGhzKCksIG5lc3RlZCwgc3RhdGUpOworICAgICAgdGhpcy5lbnN1cmVOb092ZXJsYXAobmVzdGVkLCBzdGF0ZSk7CisgICAgICBuZXN0ZWQgPSB0aGlzLnNoaWZ0TWFwKG5lc3RlZCwgc3RhdGUpOworICAgICAgamdyYXBoLmdldEdyYXBoTGF5b3V0Q2FjaGUoKS5lZGl0KG5lc3RlZCk7CisgICAgfQorCisgICAgU3RyaW5nIGVkZ2VEaXNwbGF5TW9kZSA9IHN0YXRlLmdldEZpcnN0UHJvcGVydHlWYWx1ZShFREdFX0RJU1BMQVlfTU9ERSk7CisgICAgaWYgKGVkZ2VEaXNwbGF5TW9kZSA9PSBudWxsKQorICAgICAgc3RhdGUuc2V0UHJvcGVydHkoRURHRV9ESVNQTEFZX01PREUsIGVkZ2VEaXNwbGF5TW9kZSA9IFdPUktGTE9XX01PREUpOworICAgIGlmIChlZGdlRGlzcGxheU1vZGUuZXF1YWxzKFdPUktGTE9XX01PREUpKSB7CisgICAgICB0aGlzLmVkZ2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhaXI+KCk7CisgICAgICByZW1vdmVBbGxFZGdlcyh0aGlzLmRpcmVjdGVkR3JhcGgpOworICAgICAgbGluZXMgPSBHdWlVdGlscy5maW5kU2VxdWVudGlhbExpbmVzKHN0YXRlLmdldEdyYXBocygpKTsKKyAgICAgIGZvciAoTGluZSBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgSWRlbnRpZmlhYmxlRWRnZSBlZGdlID0gbmV3IElkZW50aWZpYWJsZUVkZ2UobGluZS5nZXRGcm9tTW9kZWwoKSwgbGluZS5nZXRUb01vZGVsKCkpOworICAgICAgICBkaXJlY3RlZEdyYXBoLmFkZEVkZ2UoZWRnZSwgbGluZS5nZXRGcm9tTW9kZWwoKSwgbGluZS5nZXRUb01vZGVsKCkpOworICAgICAgICB0aGlzLmVkZ2VNYXAucHV0KGVkZ2UuaWQsIG5ldyBQYWlyKGxpbmUuZ2V0RnJvbU1vZGVsKCkgIT0gbnVsbCA/IGxpbmUKKyAgICAgICAgICAgIC5nZXRGcm9tTW9kZWwoKS5nZXRJZCgpIDogbnVsbCwgbGluZS5nZXRUb01vZGVsKCkuZ2V0SWQoKSkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0ZS5nZXRTZWxlY3RlZCgpICE9IG51bGwpIHsKKyAgICAgIE1vZGVsR3JhcGggZ3JhcGggPSBHdWlVdGlscy5maW5kKHN0YXRlLmdldEdyYXBocygpLCBzdGF0ZS5nZXRTZWxlY3RlZCgpCisgICAgICAgICAgLmdldE1vZGVsKCkuZ2V0SWQoKSk7CisgICAgICBpZiAoZ3JhcGggIT0gbnVsbCkgeworICAgICAgICBEZWZhdWx0R3JhcGhDZWxsIGNlbGwgPSB0aGlzLm1famdBZGFwdGVyCisgICAgICAgICAgICAuZ2V0VmVydGV4Q2VsbChncmFwaC5nZXRNb2RlbCgpKTsKKyAgICAgICAgaWYgKGNlbGwgIT0gbnVsbCkKKyAgICAgICAgICB0aGlzLmpncmFwaC5zZXRTZWxlY3Rpb25DZWxscyhuZXcgT2JqZWN0W10geyBjZWxsIH0pOworICAgICAgICBlbHNlCisgICAgICAgICAgdGhpcy5qZ3JhcGguc2V0U2VsZWN0aW9uQ2VsbHMobmV3IE9iamVjdFtdIHt9KTsKKyAgICAgIH0gZWxzZQorICAgICAgICB0aGlzLmpncmFwaC5zZXRTZWxlY3Rpb25DZWxscyhuZXcgT2JqZWN0W10ge30pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmpncmFwaC5zZXRTZWxlY3Rpb25DZWxscyhuZXcgT2JqZWN0W10ge30pOworICAgIH0KKworICAgIGpncmFwaC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMubXlHcmFwaExpc3RlbmVyKTsKKworICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgdGhpcy5hZGQobmV3IEpTY3JvbGxQYW5lKGpncmFwaCwgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FMV0FZUywKKyAgICAgICAgSlNjcm9sbFBhbmUuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQUxXQVlTKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisKKyAgICBpZiAoc2Nyb2xsU2VsZWN0ZWRUb1Zpc2libGUgJiYgc3RhdGUuZ2V0U2VsZWN0ZWQoKSAhPSBudWxsKSB7CisgICAgICB0aGlzLmpncmFwaC5zY3JvbGxDZWxsVG9WaXNpYmxlKEdyYXBoVmlldy50aGlzLm1famdBZGFwdGVyCisgICAgICAgICAgLmdldFZlcnRleENlbGwoc3RhdGUuZ2V0U2VsZWN0ZWQoKS5nZXRNb2RlbCgpKSk7CisgICAgICBzY3JvbGxTZWxlY3RlZFRvVmlzaWJsZSA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAodmlzaWJsZSAhPSBudWxsKSB7CisgICAgICB0aGlzLmpncmFwaC5zY3JvbGxSZWN0VG9WaXNpYmxlKHZpc2libGUpOworICAgIH0KKworICAgIGlmIChjdXJzb3IgIT0gbnVsbCkKKyAgICAgIHRoaXMuamdyYXBoLnNldEN1cnNvcihjdXJzb3IpOworCisgICAgdGhpcy5yZXZhbGlkYXRlKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaGlkZUR1bW15Tm9kZXMoTWFwIG5lc3RlZCkgeworICAgIGZvciAoT2JqZWN0IGNlbGwgOiBuZXN0ZWQua2V5U2V0KCkpIHsKKyAgICAgIGlmIChjZWxsIGluc3RhbmNlb2YgRGVmYXVsdEVkZ2UpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgfSBlbHNlIGlmIChjZWxsIGluc3RhbmNlb2YgRGVmYXVsdEdyYXBoQ2VsbCkgeworICAgICAgICBpZiAoR3VpVXRpbHMuaXNEdW1teU5vZGUoKE1vZGVsTm9kZSkgKChEZWZhdWx0R3JhcGhDZWxsKSBjZWxsKQorICAgICAgICAgICAgLmdldFVzZXJPYmplY3QoKSkpIHsKKyAgICAgICAgICAoKE1hcDxPYmplY3QsIE9iamVjdD4pIG5lc3RlZC5nZXQoY2VsbCkpLnB1dCgib3BhcXVlIiwgZmFsc2UpOworICAgICAgICAgICgoTWFwPE9iamVjdCwgT2JqZWN0PikgbmVzdGVkLmdldChjZWxsKSkucHV0KCJiYWNrZ3JvdW5kQ29sb3IiLAorICAgICAgICAgICAgICBDb2xvci53aGl0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIE1hcCBzaGlmdE1hcChNYXAgbmVzdGVkLCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBNYXAgc2hpZnRlZE5lc3RlZCA9IG5ldyBIYXNodGFibGUobmVzdGVkKTsKKyAgICBmb3IgKE9iamVjdCBvYmogOiBzaGlmdGVkTmVzdGVkLmVudHJ5U2V0KCkpIHsKKyAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSBvYmo7CisgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBEZWZhdWx0RWRnZSkgeworICAgICAgICBBcnJheUxpc3Q8UG9pbnQyRC5Eb3VibGU+IHBvaW50cyA9IChBcnJheUxpc3Q8UG9pbnQyRC5Eb3VibGU+KSAoKE1hcDxPYmplY3QsIE9iamVjdD4pIGVudHJ5CisgICAgICAgICAgICAuZ2V0VmFsdWUoKSkuZ2V0KCJwb2ludHMiKTsKKyAgICAgICAgQXJyYXlMaXN0PFBvaW50MkQuRG91YmxlPiBuZXdQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFBvaW50MkQuRG91YmxlPigpOworICAgICAgICBQb2ludCBzaGlmdCA9IHRoaXMuZ2V0U2hpZnQoc3RhdGUsIChEZWZhdWx0R3JhcGhDZWxsKSBlbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgIG5lc3RlZCk7CisgICAgICAgIGZvciAoUG9pbnQyRC5Eb3VibGUgcG9pbnQgOiBwb2ludHMpCisgICAgICAgICAgbmV3UG9pbnRzCisgICAgICAgICAgICAgIC5hZGQobmV3IFBvaW50MkQuRG91YmxlKHBvaW50LnggKyBzaGlmdC54LCBwb2ludC55ICsgc2hpZnQueSkpOworICAgICAgICAoKE1hcDxPYmplY3QsIE9iamVjdD4pIGVudHJ5LmdldFZhbHVlKCkpLnB1dCgicG9pbnRzIiwgbmV3UG9pbnRzKTsKKyAgICAgIH0gZWxzZSBpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBEZWZhdWx0R3JhcGhDZWxsKSB7CisgICAgICAgIERlZmF1bHRHcmFwaENlbGwgY2VsbCA9IChEZWZhdWx0R3JhcGhDZWxsKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzID0gKFJlY3RhbmdsZTJEKSAoKE1hcDxPYmplY3QsIE9iamVjdD4pIGVudHJ5CisgICAgICAgICAgICAuZ2V0VmFsdWUoKSkuZ2V0KCJib3VuZHMiKTsKKyAgICAgICAgUG9pbnQgc2hpZnQgPSB0aGlzLmdldFNoaWZ0KHN0YXRlLCBjZWxsLCBuZXN0ZWQpOworICAgICAgICBBdHRyaWJ1dGVNYXAuU2VyaWFsaXphYmxlUmVjdGFuZ2xlMkQgbmV3Qm91bmRzID0gbmV3IEF0dHJpYnV0ZU1hcC5TZXJpYWxpemFibGVSZWN0YW5nbGUyRCgKKyAgICAgICAgICAgIGJvdW5kcy5nZXRYKCkgKyBzaGlmdC54LCBib3VuZHMuZ2V0WSgpICsgc2hpZnQueSwKKyAgICAgICAgICAgIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBNYXA8T2JqZWN0LCBPYmplY3Q+IG5ld01hcCA9IG5ldyBIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+KAorICAgICAgICAgICAgKE1hcDxPYmplY3QsIE9iamVjdD4pIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICBuZXdNYXAucHV0KCJib3VuZHMiLCBuZXdCb3VuZHMpOworICAgICAgICBzaGlmdGVkTmVzdGVkLnB1dChjZWxsLCBuZXdNYXApOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2hpZnRlZE5lc3RlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBlbnN1cmVOb092ZXJsYXAoTWFwIG5lc3RlZCwgVmlld1N0YXRlIHN0YXRlKSB7CisgICAgYm9vbGVhbiBjaGFuZ2VkOworICAgIGRvIHsKKyAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUuZ2V0R3JhcGhzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTW9kZWxHcmFwaCBjdXJyZW50R3JhcGggPSBzdGF0ZS5nZXRHcmFwaHMoKS5nZXQoaSk7CisgICAgICAgIGlmICh0aGlzLmVuc3VyZU5vSW50ZXJuYWxPdmVybGFwKGN1cnJlbnRHcmFwaCwgbmVzdGVkKSkKKyAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgRGVmYXVsdEdyYXBoQ2VsbCBjdXJyZW50Q2VsbCA9IHRoaXMubV9qZ0FkYXB0ZXIKKyAgICAgICAgICAgIC5nZXRWZXJ0ZXhDZWxsKGN1cnJlbnRHcmFwaC5nZXRNb2RlbCgpKTsKKyAgICAgICAgUmVjdGFuZ2xlMkQgY3VycmVudEJvdW5kcyA9IChSZWN0YW5nbGUyRCkgKChNYXApIG5lc3RlZAorICAgICAgICAgICAgLmdldChjdXJyZW50Q2VsbCkpLmdldChHcmFwaENvbnN0YW50cy5CT1VORFMpOworICAgICAgICBQb2ludCBjdXJyZW50U2hpZnQgPSB0aGlzLmdldFNoaWZ0KHN0YXRlLCBjdXJyZW50Q2VsbCwgbmVzdGVkKTsKKyAgICAgICAgUmVjdGFuZ2xlIGN1cnJlbnRTaGlmdEJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoCisgICAgICAgICAgICAoaW50KSAoY3VycmVudEJvdW5kcy5nZXRYKCkgKyBjdXJyZW50U2hpZnQuZ2V0WCgpKSwKKyAgICAgICAgICAgIChpbnQpIChjdXJyZW50Qm91bmRzLmdldFkoKSArIGN1cnJlbnRTaGlmdC5nZXRZKCkpLAorICAgICAgICAgICAgKGludCkgY3VycmVudEJvdW5kcy5nZXRXaWR0aCgpLCAoaW50KSBjdXJyZW50Qm91bmRzLmdldEhlaWdodCgpKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdGF0ZS5nZXRHcmFwaHMoKS5zaXplKCk7IGorKykgeworICAgICAgICAgIGlmIChpID09IGopCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBNb2RlbEdyYXBoIGdyYXBoID0gc3RhdGUuZ2V0R3JhcGhzKCkuZ2V0KGopOworICAgICAgICAgIERlZmF1bHRHcmFwaENlbGwgY2VsbCA9IHRoaXMubV9qZ0FkYXB0ZXIuZ2V0VmVydGV4Q2VsbChncmFwaAorICAgICAgICAgICAgICAuZ2V0TW9kZWwoKSk7CisgICAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzID0gKFJlY3RhbmdsZTJEKSAoKE1hcCkgbmVzdGVkLmdldChjZWxsKSkKKyAgICAgICAgICAgICAgLmdldChHcmFwaENvbnN0YW50cy5CT1VORFMpOworICAgICAgICAgIFBvaW50IHNoaWZ0ID0gdGhpcy5nZXRTaGlmdChzdGF0ZSwgY2VsbCwgbmVzdGVkKTsKKyAgICAgICAgICBSZWN0YW5nbGUgc2hpZnRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKAorICAgICAgICAgICAgICAoaW50KSAoYm91bmRzLmdldFgoKSArIHNoaWZ0LmdldFgoKSksCisgICAgICAgICAgICAgIChpbnQpIChib3VuZHMuZ2V0WSgpICsgc2hpZnQuZ2V0WSgpKSwgKGludCkgYm91bmRzLmdldFdpZHRoKCksCisgICAgICAgICAgICAgIChpbnQpIGJvdW5kcy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgaWYgKGN1cnJlbnRTaGlmdEJvdW5kcy5pbnRlcnNlY3RzKHNoaWZ0Qm91bmRzKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoY3VycmVudFNoaWZ0Qm91bmRzLmdldFkoKSA8IHNoaWZ0Qm91bmRzLmdldFkoKSkgeworICAgICAgICAgICAgICBSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gY3VycmVudFNoaWZ0Qm91bmRzCisgICAgICAgICAgICAgICAgICAuaW50ZXJzZWN0aW9uKHNoaWZ0Qm91bmRzKTsKKyAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTaGlmdEJvdW5kcy5nZXRZKCkgKyBjdXJyZW50U2hpZnRCb3VuZHMuZ2V0SGVpZ2h0KCkgPiBzaGlmdEJvdW5kcworICAgICAgICAgICAgICAgICAgLmdldFkoKSArIHNoaWZ0Qm91bmRzLmdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRTaGlmdChzdGF0ZSwgZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgoaW50KSAoY3VycmVudFNoaWZ0Qm91bmRzLmdldFgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50U2hpZnRCb3VuZHMuZ2V0V2lkdGgoKSArIDIwLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2hpZnRCb3VuZHMuZ2V0WSgpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRTaGlmdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoKGludCkgc2hpZnRCb3VuZHMuZ2V0WCgpLCAoaW50KSAoc2hpZnRCb3VuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRZKCkgKyBpbnRlcnNlY3Rpb24uZ2V0SGVpZ2h0KCkgKyAyMC4wKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gc2hpZnRCb3VuZHMKKyAgICAgICAgICAgICAgICAgIC5pbnRlcnNlY3Rpb24oY3VycmVudFNoaWZ0Qm91bmRzKTsKKyAgICAgICAgICAgICAgaWYgKHNoaWZ0Qm91bmRzLmdldFkoKSArIHNoaWZ0Qm91bmRzLmdldEhlaWdodCgpID4gY3VycmVudFNoaWZ0Qm91bmRzCisgICAgICAgICAgICAgICAgICAuZ2V0WSgpICsgY3VycmVudFNoaWZ0Qm91bmRzLmdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRTaGlmdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KChpbnQpIChzaGlmdEJvdW5kcy5nZXRYKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2hpZnRCb3VuZHMuZ2V0V2lkdGgoKSArIDIwLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgY3VycmVudFNoaWZ0Qm91bmRzLmdldFkoKSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0U2hpZnQoCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JhcGgsCisgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgoaW50KSBjdXJyZW50U2hpZnRCb3VuZHMuZ2V0WCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGN1cnJlbnRTaGlmdEJvdW5kcy5nZXRZKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGludGVyc2VjdGlvbi5nZXRIZWlnaHQoKSArIDIwLjApKSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjdXJyZW50U2hpZnQgPSB0aGlzLmdldFNoaWZ0KHN0YXRlLCBjdXJyZW50Q2VsbCwgbmVzdGVkKTsKKyAgICAgICAgICAgICAgY3VycmVudFNoaWZ0Qm91bmRzID0gbmV3IFJlY3RhbmdsZSgKKyAgICAgICAgICAgICAgICAgIChpbnQpIChjdXJyZW50Qm91bmRzLmdldFgoKSArIGN1cnJlbnRTaGlmdC5nZXRYKCkpLAorICAgICAgICAgICAgICAgICAgKGludCkgKGN1cnJlbnRCb3VuZHMuZ2V0WSgpICsgY3VycmVudFNoaWZ0LmdldFkoKSksCisgICAgICAgICAgICAgICAgICAoaW50KSBjdXJyZW50Qm91bmRzLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAoaW50KSBjdXJyZW50Qm91bmRzLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChjaGFuZ2VkKTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBlbnN1cmVOb0ludGVybmFsT3ZlcmxhcChmaW5hbCBNb2RlbEdyYXBoIGdyYXBoLAorICAgICAgZmluYWwgTWFwIG5lc3RlZCkgeworICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChncmFwaC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDEpIHsKKyAgICAgIExpc3Q8TW9kZWxHcmFwaD4gc29ydGVkQ2hpbGRyZW4gPSBuZXcgVmVjdG9yPE1vZGVsR3JhcGg+KAorICAgICAgICAgIGdyYXBoLmdldENoaWxkcmVuKCkpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRDaGlsZHJlbiwgbmV3IENvbXBhcmF0b3I8TW9kZWxHcmFwaD4oKSB7CisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1vZGVsR3JhcGggbzEsIE1vZGVsR3JhcGggbzIpIHsKKyAgICAgICAgICBEZWZhdWx0R3JhcGhDZWxsIGNoaWxkMUNlbGwgPSBHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlcgorICAgICAgICAgICAgICAuZ2V0VmVydGV4Q2VsbChvMS5nZXRNb2RlbCgpKTsKKyAgICAgICAgICBEZWZhdWx0R3JhcGhDZWxsIGNoaWxkMkNlbGwgPSBHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlcgorICAgICAgICAgICAgICAuZ2V0VmVydGV4Q2VsbChvMi5nZXRNb2RlbCgpKTsKKyAgICAgICAgICBSZWN0YW5nbGUyRCBjaGlsZDFCb3VuZHMgPSAoUmVjdGFuZ2xlMkQpICgoTWFwKSBuZXN0ZWQKKyAgICAgICAgICAgICAgLmdldChjaGlsZDFDZWxsKSkuZ2V0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUyk7CisgICAgICAgICAgUmVjdGFuZ2xlMkQgY2hpbGQyQm91bmRzID0gKFJlY3RhbmdsZTJEKSAoKE1hcCkgbmVzdGVkCisgICAgICAgICAgICAgIC5nZXQoY2hpbGQyQ2VsbCkpLmdldChHcmFwaENvbnN0YW50cy5CT1VORFMpOworICAgICAgICAgIGlmIChncmFwaC5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKS5lcXVhbHMoInBhcmFsbGVsIikpCisgICAgICAgICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoY2hpbGQxQm91bmRzLmdldE1heFkoKSwKKyAgICAgICAgICAgICAgICBjaGlsZDJCb3VuZHMuZ2V0TWF4WSgpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoY2hpbGQxQm91bmRzLmdldFgoKSwgY2hpbGQyQm91bmRzLmdldFgoKSk7CisgICAgICAgIH0KKworICAgICAgfSk7CisgICAgICBjaGFuZ2VkID0gZW5zdXJlTm9JbnRlcm5hbE92ZXJsYXAoc29ydGVkQ2hpbGRyZW4uZ2V0KDApLCBuZXN0ZWQpOworICAgICAgUmVjdGFuZ2xlMkQgZ3JhcGhSZWN0YW5nbGUgPSAoUmVjdGFuZ2xlMkQpICgoTWFwKSBuZXN0ZWQKKyAgICAgICAgICAuZ2V0KHRoaXMubV9qZ0FkYXB0ZXIuZ2V0VmVydGV4Q2VsbChzb3J0ZWRDaGlsZHJlbi5nZXQoMCkuZ2V0TW9kZWwoKSkpKQorICAgICAgICAgIC5nZXQoR3JhcGhDb25zdGFudHMuQk9VTkRTKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc29ydGVkQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTW9kZWxHcmFwaCBjaGlsZDIgPSBzb3J0ZWRDaGlsZHJlbi5nZXQoaSk7CisgICAgICAgIGlmIChlbnN1cmVOb0ludGVybmFsT3ZlcmxhcChjaGlsZDIsIG5lc3RlZCkpCisgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIERlZmF1bHRHcmFwaENlbGwgY2hpbGQyQ2VsbCA9IHRoaXMubV9qZ0FkYXB0ZXIuZ2V0VmVydGV4Q2VsbChjaGlsZDIKKyAgICAgICAgICAgIC5nZXRNb2RlbCgpKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IGkgLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICAgIE1vZGVsR3JhcGggY2hpbGQxID0gc29ydGVkQ2hpbGRyZW4uZ2V0KGopOworICAgICAgICAgIERlZmF1bHRHcmFwaENlbGwgY2hpbGQxQ2VsbCA9IHRoaXMubV9qZ0FkYXB0ZXIuZ2V0VmVydGV4Q2VsbChjaGlsZDEKKyAgICAgICAgICAgICAgLmdldE1vZGVsKCkpOworICAgICAgICAgIFJlY3RhbmdsZTJEIGNoaWxkMUJvdW5kcyA9IChSZWN0YW5nbGUyRCkgKChNYXApIG5lc3RlZAorICAgICAgICAgICAgICAuZ2V0KGNoaWxkMUNlbGwpKS5nZXQoR3JhcGhDb25zdGFudHMuQk9VTkRTKTsKKyAgICAgICAgICBSZWN0YW5nbGUyRCBjaGlsZDJCb3VuZHMgPSAoUmVjdGFuZ2xlMkQpICgoTWFwKSBuZXN0ZWQKKyAgICAgICAgICAgICAgLmdldChjaGlsZDJDZWxsKSkuZ2V0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUyk7CisgICAgICAgICAgaWYgKGNoaWxkMUJvdW5kcy5pbnRlcnNlY3RzKGNoaWxkMkJvdW5kcykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGdyYXBoLmdldE1vZGVsKCkuZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygicGFyYWxsZWwiKSkgeworICAgICAgICAgICAgICAoKE1hcCkgbmVzdGVkLmdldChjaGlsZDJDZWxsKSkucHV0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUywKKyAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVNYXAuU2VyaWFsaXphYmxlUmVjdGFuZ2xlMkQoY2hpbGQyQm91bmRzLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjaGlsZDFCb3VuZHMuZ2V0TWF4WSgpICsgMjAuMCwgY2hpbGQyQm91bmRzLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgY2hpbGQyQm91bmRzLmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICAgIHRoaXMuc2hpZnQoY2hpbGQyLmdldENoaWxkcmVuKCksIG5lc3RlZCwgMCwKKyAgICAgICAgICAgICAgICAgIGNoaWxkMUJvdW5kcy5nZXRNYXhZKCkgKyAyMC4wIC0gY2hpbGQyQm91bmRzLmdldFkoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAoKE1hcCkgbmVzdGVkLmdldChjaGlsZDJDZWxsKSkucHV0KAorICAgICAgICAgICAgICAgICAgR3JhcGhDb25zdGFudHMuQk9VTkRTLAorICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZU1hcC5TZXJpYWxpemFibGVSZWN0YW5nbGUyRChjaGlsZDFCb3VuZHMKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWF4WCgpICsgMjAuMCwgY2hpbGQyQm91bmRzLmdldFkoKSwgY2hpbGQyQm91bmRzCisgICAgICAgICAgICAgICAgICAgICAgLmdldFdpZHRoKCksIGNoaWxkMkJvdW5kcy5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgICB0aGlzLnNoaWZ0KGNoaWxkMi5nZXRDaGlsZHJlbigpLCBuZXN0ZWQsIGNoaWxkMUJvdW5kcy5nZXRNYXhYKCkKKyAgICAgICAgICAgICAgICAgICsgMjAuMCAtIGNoaWxkMkJvdW5kcy5nZXRYKCksIDApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBncmFwaFJlY3RhbmdsZSA9IGdyYXBoUmVjdGFuZ2xlLmNyZWF0ZVVuaW9uKChSZWN0YW5nbGUyRCkgKChNYXApIG5lc3RlZAorICAgICAgICAgICAgLmdldChjaGlsZDJDZWxsKSkuZ2V0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUykpOworICAgICAgfQorICAgICAgKChNYXApIG5lc3RlZC5nZXQodGhpcy5tX2pnQWRhcHRlci5nZXRWZXJ0ZXhDZWxsKGdyYXBoLmdldE1vZGVsKCkpKSkucHV0KAorICAgICAgICAgIEdyYXBoQ29uc3RhbnRzLkJPVU5EUywgbmV3IEF0dHJpYnV0ZU1hcC5TZXJpYWxpemFibGVSZWN0YW5nbGUyRCgKKyAgICAgICAgICAgICAgZ3JhcGhSZWN0YW5nbGUuZ2V0WCgpIC0gNSwgZ3JhcGhSZWN0YW5nbGUuZ2V0WSgpIC0gMjAsCisgICAgICAgICAgICAgIGdyYXBoUmVjdGFuZ2xlLmdldFdpZHRoKCkgKyAxMCwgZ3JhcGhSZWN0YW5nbGUuZ2V0SGVpZ2h0KCkgKyAyNSkpOworICAgIH0KKyAgICByZXR1cm4gY2hhbmdlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzaGlmdChMaXN0PE1vZGVsR3JhcGg+IGdyYXBocywgTWFwIG5lc3RlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmFwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIE1vZGVsR3JhcGggZ3JhcGggPSBncmFwaHMuZ2V0KGkpOworICAgICAgRGVmYXVsdEdyYXBoQ2VsbCBjZWxsID0gdGhpcy5tX2pnQWRhcHRlci5nZXRWZXJ0ZXhDZWxsKGdyYXBoLmdldE1vZGVsKCkpOworICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzID0gKFJlY3RhbmdsZTJEKSAoKE1hcCkgbmVzdGVkLmdldChjZWxsKSkKKyAgICAgICAgICAuZ2V0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUyk7CisgICAgICAoKE1hcCkgbmVzdGVkLmdldChjZWxsKSkucHV0KAorICAgICAgICAgIEdyYXBoQ29uc3RhbnRzLkJPVU5EUywKKyAgICAgICAgICBuZXcgQXR0cmlidXRlTWFwLlNlcmlhbGl6YWJsZVJlY3RhbmdsZTJEKGJvdW5kcy5nZXRYKCkgKyB4LCBib3VuZHMKKyAgICAgICAgICAgICAgLmdldFkoKSArIHksIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgIHRoaXMuc2hpZnQoZ3JhcGguZ2V0Q2hpbGRyZW4oKSwgbmVzdGVkLCB4LCB5KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkR3JvdXBzKExpc3Q8TW9kZWxHcmFwaD4gbW9kZWxHcmFwaHMsIE1hcCBuZXN0ZWQsCisgICAgICBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBmb3IgKE1vZGVsR3JhcGggbW9kZWxHcmFwaCA6IG1vZGVsR3JhcGhzKQorICAgICAgdGhpcy5hZGRHcm91cHMobW9kZWxHcmFwaCwgbmVzdGVkLCBzdGF0ZSk7CisgIH0KKworICBwcml2YXRlIERlZmF1bHRHcmFwaENlbGwgYWRkR3JvdXBzKE1vZGVsR3JhcGggbW9kZWxHcmFwaCwgTWFwIG5lc3RlZCwKKyAgICAgIFZpZXdTdGF0ZSBzdGF0ZSkgeworICAgIGlmIChtb2RlbEdyYXBoLmdldE1vZGVsKCkuaXNQYXJlbnRUeXBlKCkpIHsKKyAgICAgIGRvdWJsZSB0b3BfeCA9IERvdWJsZS5NQVhfVkFMVUUsIHRvcF95ID0gRG91YmxlLk1BWF9WQUxVRSwgYm90dG9tX3ggPSAwLjAsIGJvdHRvbV95ID0gMC4wOworICAgICAgdGhpcy5kaXJlY3RlZEdyYXBoLmFkZFZlcnRleChtb2RlbEdyYXBoLmdldE1vZGVsKCkpOworICAgICAgRGVmYXVsdEdyYXBoQ2VsbCBtb2RlbENlbGwgPSB0aGlzLm1famdBZGFwdGVyLmdldFZlcnRleENlbGwobW9kZWxHcmFwaAorICAgICAgICAgIC5nZXRNb2RlbCgpKTsKKyAgICAgIFZlY3RvcjxEZWZhdWx0R3JhcGhDZWxsPiBncm91cCA9IG5ldyBWZWN0b3I8RGVmYXVsdEdyYXBoQ2VsbD4oKTsKKyAgICAgIGdyb3VwLmFkZChtb2RlbENlbGwpOworCisgICAgICBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxHcmFwaC5nZXRDaGlsZHJlbigpLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE1vZGVsR3JhcGggY2hpbGQgPSBtb2RlbEdyYXBoLmdldENoaWxkcmVuKCkuZ2V0KGkpOworICAgICAgICBEZWZhdWx0R3JhcGhDZWxsIGN1ckNlbGwgPSBhZGRHcm91cHMoY2hpbGQsIG5lc3RlZCwgc3RhdGUpOworICAgICAgICBncm91cC5hZGQoY3VyQ2VsbCk7CisgICAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcyA9IChSZWN0YW5nbGUyRCkgKChNYXA8T2JqZWN0LCBPYmplY3Q+KSBuZXN0ZWQKKyAgICAgICAgICAgIC5nZXQoY3VyQ2VsbCkpLmdldCgiYm91bmRzIik7CisgICAgICAgIGlmIChib3VuZHMuZ2V0WCgpIDwgdG9wX3gpCisgICAgICAgICAgdG9wX3ggPSBib3VuZHMuZ2V0WCgpOworICAgICAgICBpZiAoYm91bmRzLmdldFkoKSA8IHRvcF95KQorICAgICAgICAgIHRvcF95ID0gYm91bmRzLmdldFkoKTsKKyAgICAgICAgaWYgKGJvdW5kcy5nZXRNYXhYKCkgPiBib3R0b21feCkKKyAgICAgICAgICBib3R0b21feCA9IGJvdW5kcy5nZXRNYXhYKCk7CisgICAgICAgIGlmIChib3VuZHMuZ2V0TWF4WSgpID4gYm90dG9tX3kpCisgICAgICAgICAgYm90dG9tX3kgPSBib3VuZHMuZ2V0TWF4WSgpOworICAgICAgfQorCisgICAgICBtYXAucHV0KEdyYXBoQ29uc3RhbnRzLkJPVU5EUywgbmV3IEF0dHJpYnV0ZU1hcC5TZXJpYWxpemFibGVSZWN0YW5nbGUyRCgKKyAgICAgICAgICB0b3BfeCAtIDUsIHRvcF95IC0gMjAsIGJvdHRvbV94IC0gdG9wX3ggKyAxMCwgYm90dG9tX3kgLSB0b3BfeSArIDI1KSk7CisgICAgICBtYXAucHV0KEdyYXBoQ29uc3RhbnRzLkZPUkVHUk9VTkQsIENvbG9yLmJsYWNrKTsKKyAgICAgIGlmIChtb2RlbEdyYXBoLmdldE1vZGVsKCkuaXNSZWYoKSkKKyAgICAgICAgbWFwLnB1dChHcmFwaENvbnN0YW50cy5CQUNLR1JPVU5ELCBDb2xvci5saWdodEdyYXkpOworICAgICAgZWxzZQorICAgICAgICBtYXAucHV0KEdyYXBoQ29uc3RhbnRzLkJBQ0tHUk9VTkQsIENvbG9yLndoaXRlKTsKKyAgICAgIGlmIChtb2RlbEdyYXBoLmlzRXhjdXNlZCgpKQorICAgICAgICBtYXAucHV0KEdyYXBoQ29uc3RhbnRzLkdSQURJRU5UQ09MT1IsIENvbG9yLmdyYXkpOworICAgICAgbWFwLnB1dChHcmFwaENvbnN0YW50cy5IT1JJWk9OVEFMX0FMSUdOTUVOVCwgU3dpbmdDb25zdGFudHMuTEVGVCk7CisgICAgICBtYXAucHV0KEdyYXBoQ29uc3RhbnRzLlZFUlRJQ0FMX0FMSUdOTUVOVCwgU3dpbmdDb25zdGFudHMuVE9QKTsKKyAgICAgIG1hcC5wdXQoR3JhcGhDb25zdGFudHMuQk9SREVSLCBuZXcgTGluZUJvcmRlcihtb2RlbEdyYXBoLmdldE1vZGVsKCkKKyAgICAgICAgICAuZ2V0Q29sb3IoKSwgMSkpOworICAgICAgamdyYXBoLmdldEdyYXBoTGF5b3V0Q2FjaGUoKS50b0JhY2sobmV3IE9iamVjdFtdIHsgbW9kZWxDZWxsIH0pOworICAgICAgbmVzdGVkLnB1dChtb2RlbENlbGwsIG1hcCk7CisgICAgICByZXR1cm4gbW9kZWxDZWxsOworICAgIH0KKyAgICBEZWZhdWx0R3JhcGhDZWxsIGNlbGwgPSB0aGlzLm1famdBZGFwdGVyLmdldFZlcnRleENlbGwobW9kZWxHcmFwaAorICAgICAgICAuZ2V0TW9kZWwoKSk7CisgICAgKChNYXA8T2JqZWN0LCBPYmplY3Q+KSBuZXN0ZWQuZ2V0KGNlbGwpKS5wdXQoR3JhcGhDb25zdGFudHMuRk9SRUdST1VORCwKKyAgICAgICAgQ29sb3IuYmxhY2spOworICAgIGlmIChtb2RlbEdyYXBoLmlzRXhjdXNlZCgpKQorICAgICAgKChNYXA8T2JqZWN0LCBPYmplY3Q+KSBuZXN0ZWQuZ2V0KGNlbGwpKS5wdXQoCisgICAgICAgICAgR3JhcGhDb25zdGFudHMuR1JBRElFTlRDT0xPUiwgQ29sb3IuZ3JheSk7CisgICAgZWxzZQorICAgICAgKChNYXA8T2JqZWN0LCBPYmplY3Q+KSBuZXN0ZWQuZ2V0KGNlbGwpKS5wdXQoCisgICAgICAgICAgR3JhcGhDb25zdGFudHMuR1JBRElFTlRDT0xPUiwgQ29sb3Iud2hpdGUpOworICAgIGlmICghKChNb2RlbE5vZGUpICgoRGVmYXVsdEdyYXBoQ2VsbCkgY2VsbCkuZ2V0VXNlck9iamVjdCgpKS5pc1JlZigpKQorICAgICAgKChNYXA8T2JqZWN0LCBPYmplY3Q+KSBuZXN0ZWQuZ2V0KGNlbGwpKS5wdXQoR3JhcGhDb25zdGFudHMuQkFDS0dST1VORCwKKyAgICAgICAgICBtb2RlbEdyYXBoLmdldE1vZGVsKCkuZ2V0Q29sb3IoKSk7CisgICAgZWxzZQorICAgICAgKChNYXA8T2JqZWN0LCBPYmplY3Q+KSBuZXN0ZWQuZ2V0KGNlbGwpKS5wdXQoR3JhcGhDb25zdGFudHMuQkFDS0dST1VORCwKKyAgICAgICAgICBDb2xvci5saWdodEdyYXkpOworICAgIHJldHVybiBjZWxsOworICB9CisgIAorICBwcml2YXRlIHZvaWQgcmVtb3ZlQWxsRWRnZXMoT2JzZXJ2YWJsZUdyYXBoPE1vZGVsTm9kZSwgSWRlbnRpZmlhYmxlRWRnZT4gZ3JhcGgpeworICAgIExpc3Q8SWRlbnRpZmlhYmxlRWRnZT4gZWRnZXMgPSBuZXcgVmVjdG9yPElkZW50aWZpYWJsZUVkZ2U+KCk7CisgICAgCisgICAgZm9yKElkZW50aWZpYWJsZUVkZ2UgZWRnZTogZ3JhcGguZ2V0RWRnZXMoKSl7CisgICAgICAgZWRnZXMuYWRkKGVkZ2UpOworICAgICB9CisgICAgCisgICAgZm9yKElkZW50aWZpYWJsZUVkZ2UgZWRnZTogZWRnZXMpeworICAgICAgIGdyYXBoLnJlbW92ZUVkZ2UoZWRnZSk7CisgICAgfQorICB9CisgIAorCisgIHByaXZhdGUgY2xhc3MgUGFpciB7CisgICAgU3RyaW5nIGZpcnN0LCBzZWNvbmQ7CisKKyAgICBwdWJsaWMgUGFpcihTdHJpbmcgZmlyc3QsIFN0cmluZyBzZWNvbmQpIHsKKyAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDsKKyAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3QoKSB7CisgICAgICByZXR1cm4gdGhpcy5maXJzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlY29uZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnNlY29uZDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgY2xhc3MgTXlHcmFwaExpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciwgQWN0aW9uTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBQb2ludCBjdXJQb2ludDsKKyAgICBwcml2YXRlIFZpZXdTdGF0ZSBzdGF0ZTsKKworICAgIHB1YmxpYyBNeUdyYXBoTGlzdGVuZXIoVmlld1N0YXRlIHN0YXRlKSB7CisgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZSkgeworICAgICAgY3VyUG9pbnQgPSBlLmdldFBvaW50KCk7CisgICAgICBpZiAoZS5nZXRCdXR0b24oKSA9PSBNb3VzZUV2ZW50LkJVVFRPTjMpIHsKKyAgICAgICAgT2JqZWN0IG1vdXNlT3ZlckNlbGwgPSBHcmFwaFZpZXcudGhpcy5qZ3JhcGguZ2V0Rmlyc3RDZWxsRm9yTG9jYXRpb24oCisgICAgICAgICAgICBlLmdldFgoKSwgZS5nZXRZKCkpOworICAgICAgICBNb2RlbEdyYXBoIG1vdXNlT3ZlckdyYXBoID0gbnVsbDsKKyAgICAgICAgaWYgKG1vdXNlT3ZlckNlbGwgIT0gbnVsbCkgeworICAgICAgICAgIG1vdXNlT3ZlckdyYXBoID0gKEd1aVV0aWxzLmZpbmQoc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgICAgICgoTW9kZWxOb2RlKSAoKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIG1vdXNlT3ZlckNlbGwpCisgICAgICAgICAgICAgICAgICAuZ2V0VXNlck9iamVjdCgpKS5nZXRJZCgpKSk7CisgICAgICAgICAgaWYgKG1vdXNlT3ZlckdyYXBoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChHdWlVdGlscy5pc0R1bW15Tm9kZShtb3VzZU92ZXJHcmFwaC5nZXRNb2RlbCgpKSkgeworICAgICAgICAgICAgICBtb3VzZU92ZXJHcmFwaCA9IG1vdXNlT3ZlckdyYXBoLmdldFBhcmVudCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgd2hpbGUgKG1vdXNlT3ZlckdyYXBoICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICYmIG1vdXNlT3ZlckdyYXBoLmdldFBhcmVudCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICYmIG1vdXNlT3ZlckdyYXBoLmdldFBhcmVudCgpLmdldE1vZGVsKCkuaXNSZWYoKSkKKyAgICAgICAgICAgICAgICBtb3VzZU92ZXJHcmFwaCA9IG1vdXNlT3ZlckdyYXBoLmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vdXNlT3ZlckdyYXBoICE9IG51bGwpCisgICAgICAgICAgICAgIG1vdXNlT3ZlckNlbGwgPSBHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlcgorICAgICAgICAgICAgICAgICAgLmdldFZlcnRleENlbGwobW91c2VPdmVyR3JhcGguZ2V0TW9kZWwoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG1vdXNlT3ZlckNlbGwgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgICBzdGF0ZS5zZXRTZWxlY3RlZChtb3VzZU92ZXJHcmFwaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGUuc2V0U2VsZWN0ZWQobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgUG9wdXBNZW51IGFjdGlvbnNNZW51ID0gY3JlYXRlQWN0aW9uTWVudShzdGF0ZSk7CisgICAgICAgIEdyYXBoVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICBHcmFwaFZpZXcudGhpcy5qZ3JhcGguYWRkKGFjdGlvbnNNZW51KTsKKyAgICAgICAgYWN0aW9uc01lbnUuc2hvdyhHcmFwaFZpZXcudGhpcy5qZ3JhcGgsIGUuZ2V0UG9pbnQoKS54LCBlLmdldFBvaW50KCkueSk7CisgICAgICB9IGVsc2UgaWYgKGUuZ2V0QnV0dG9uKCkgPT0gTW91c2VFdmVudC5CVVRUT04xKSB7CisgICAgICAgIGlmIChzdGF0ZS5nZXRNb2RlKCkgPT0gVmlldy5Nb2RlLlpPT01fSU4pIHsKKyAgICAgICAgICBzdGF0ZS5zZXRQcm9wZXJ0eShTQ0FMRSwgRG91YmxlLnRvU3RyaW5nKERvdWJsZS5wYXJzZURvdWJsZShzdGF0ZQorICAgICAgICAgICAgICAuZ2V0Rmlyc3RQcm9wZXJ0eVZhbHVlKFNDQUxFKSkgKyAwLjEpKTsKKyAgICAgICAgICBzdGF0ZS5zZXRTZWxlY3RlZChudWxsKTsKKyAgICAgICAgICBHcmFwaFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5nZXRNb2RlKCkgPT0gVmlldy5Nb2RlLlpPT01fT1VUKSB7CisgICAgICAgICAgc3RhdGUuc2V0UHJvcGVydHkoU0NBTEUsIERvdWJsZS50b1N0cmluZyhEb3VibGUucGFyc2VEb3VibGUoc3RhdGUKKyAgICAgICAgICAgICAgLmdldEZpcnN0UHJvcGVydHlWYWx1ZShTQ0FMRSkpIC0gMC4xKSk7CisgICAgICAgICAgc3RhdGUuc2V0U2VsZWN0ZWQobnVsbCk7CisgICAgICAgICAgR3JhcGhWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZ2V0TW9kZSgpID09IFZpZXcuTW9kZS5FRElUKSB7CisgICAgICAgICAgT2JqZWN0IGNlbGwgPSBHcmFwaFZpZXcudGhpcy5qZ3JhcGguZ2V0Rmlyc3RDZWxsRm9yTG9jYXRpb24oZS5nZXRYKCksCisgICAgICAgICAgICAgIGUuZ2V0WSgpKTsKKyAgICAgICAgICBpZiAoY2VsbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2VsbCBpbnN0YW5jZW9mIERlZmF1bHRFZGdlKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNlbGwgaW5zdGFuY2VvZiBEZWZhdWx0R3JhcGhDZWxsKSB7CisgICAgICAgICAgICAgIE1vZGVsR3JhcGggZ3JhcGggPSBHdWlVdGlscy5maW5kKHN0YXRlLmdldEdyYXBocygpLAorICAgICAgICAgICAgICAgICAgKChNb2RlbE5vZGUpICgoRGVmYXVsdEdyYXBoQ2VsbCkgY2VsbCkuZ2V0VXNlck9iamVjdCgpKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgaWYgKGdyYXBoLmdldE1vZGVsKCkuaXNSZWYoKSkKKyAgICAgICAgICAgICAgICB3aGlsZSAoZ3JhcGguZ2V0UGFyZW50KCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBncmFwaC5nZXRQYXJlbnQoKS5nZXRNb2RlbCgpLmlzUmVmKCkpCisgICAgICAgICAgICAgICAgICBncmFwaCA9IGdyYXBoLmdldFBhcmVudCgpOworICAgICAgICAgICAgICBpZiAoR3VpVXRpbHMuaXNEdW1teU5vZGUoZ3JhcGguZ2V0TW9kZWwoKSkpCisgICAgICAgICAgICAgICAgZ3JhcGggPSBncmFwaC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgc3RhdGUuc2V0U2VsZWN0ZWQoZ3JhcGgpOworICAgICAgICAgICAgICBHcmFwaFZpZXcudGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNlbGwgPT0gbnVsbCAmJiBzdGF0ZS5nZXRTZWxlY3RlZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXRlLnNldFNlbGVjdGVkKG51bGwpOworICAgICAgICAgICAgR3JhcGhWaWV3LnRoaXMubm90aWZ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmdldE1vZGUoKSA9PSBWaWV3Lk1vZGUuREVMRVRFCisgICAgICAgICAgICAmJiBlLmdldENsaWNrQ291bnQoKSA9PSAyKSB7CisgICAgICAgICAgT2JqZWN0IGNlbGwgPSBHcmFwaFZpZXcudGhpcy5qZ3JhcGguZ2V0Rmlyc3RDZWxsRm9yTG9jYXRpb24oZS5nZXRYKCksCisgICAgICAgICAgICAgIGUuZ2V0WSgpKTsKKyAgICAgICAgICBpZiAoY2VsbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2VsbCBpbnN0YW5jZW9mIERlZmF1bHRFZGdlKSB7CisgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbCBpbnN0YW5jZW9mIERlZmF1bHRHcmFwaENlbGwpIHsKKyAgICAgICAgICAgICAgTW9kZWxHcmFwaCBncmFwaCA9IEd1aVV0aWxzLnJlbW92ZU5vZGUoc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgICAgICAgICAoTW9kZWxOb2RlKSAoKERlZmF1bHRHcmFwaENlbGwpIGNlbGwpLmdldFVzZXJPYmplY3QoKSk7CisgICAgICAgICAgICAgIEdyYXBoVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIGlmIChzdGF0ZS5nZXRNb2RlKCkgPT0gVmlldy5Nb2RlLlpPT01fSU4KKyAgICAgICAgICB8fCBzdGF0ZS5nZXRNb2RlKCkgPT0gVmlldy5Nb2RlLlpPT01fT1VUKSB7CisgICAgICAgIFRvb2xraXQgdG9vbGtpdCA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBHcmFwaFZpZXcudGhpcy5qZ3JhcGguc2V0Q3Vyc29yKHRvb2xraXQuY3JlYXRlQ3VzdG9tQ3Vyc29yKAorICAgICAgICAgICAgICBJY29uTG9hZGVyLmdldEljb24oSWNvbkxvYWRlci5aT09NX0NVUlNPUiksIG5ldyBQb2ludCgwLCAwKSwKKyAgICAgICAgICAgICAgImltZyIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZ2V0TW9kZSgpID09IE1vZGUuTU9WRSkgeworICAgICAgICBHcmFwaFZpZXcudGhpcy5qZ3JhcGguc2V0Q3Vyc29yKG5ldyBDdXJzb3IoQ3Vyc29yLkhBTkRfQ1VSU09SKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHcmFwaFZpZXcudGhpcy5qZ3JhcGguc2V0Q3Vyc29yKG5ldyBDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgIHRoaXMuY3JlYXRlTmV3R3JhcGgoZS5nZXRBY3Rpb25Db21tYW5kKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVOZXdHcmFwaChTdHJpbmcgYWN0aW9uQ29tbWFuZCkgeworICAgICAgTW9kZWxHcmFwaCBuZXdHcmFwaCA9IG51bGw7CisgICAgICBpZiAoYWN0aW9uQ29tbWFuZC5lcXVhbHMoTkVXX1RBU0tfSVRFTV9OQU1FKSkgeworICAgICAgICBuZXdHcmFwaCA9IG5ldyBNb2RlbEdyYXBoKG5ldyBNb2RlbE5vZGUoc3RhdGUuZ2V0RmlsZSgpLAorICAgICAgICAgICAgR3VpVXRpbHMuY3JlYXRlVW5pcXVlTmFtZSgpKSk7CisgICAgICB9IGVsc2UgaWYgKGFjdGlvbkNvbW1hbmQuZXF1YWxzKE5FV19QQVJBTExFTF9JVEVNX05BTUUpKSB7CisgICAgICAgIE1vZGVsTm9kZSBub2RlID0gbmV3IE1vZGVsTm9kZShzdGF0ZS5nZXRGaWxlKCksCisgICAgICAgICAgICBHdWlVdGlscy5jcmVhdGVVbmlxdWVOYW1lKCkpOworICAgICAgICBub2RlLnNldEV4ZWN1dGlvblR5cGUoInBhcmFsbGVsIik7CisgICAgICAgIG5ld0dyYXBoID0gbmV3IE1vZGVsR3JhcGgobm9kZSk7CisgICAgICB9IGVsc2UgaWYgKGFjdGlvbkNvbW1hbmQuZXF1YWxzKE5FV19TRVFVRU5USUFMX0lURU1fTkFNRSkpIHsKKyAgICAgICAgTW9kZWxOb2RlIG5vZGUgPSBuZXcgTW9kZWxOb2RlKHN0YXRlLmdldEZpbGUoKSwKKyAgICAgICAgICAgIEd1aVV0aWxzLmNyZWF0ZVVuaXF1ZU5hbWUoKSk7CisgICAgICAgIG5vZGUuc2V0RXhlY3V0aW9uVHlwZSgic2VxdWVudGlhbCIpOworICAgICAgICBuZXdHcmFwaCA9IG5ldyBNb2RlbEdyYXBoKG5vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgT2JqZWN0IGNlbGwgPSBHcmFwaFZpZXcudGhpcy5qZ3JhcGguZ2V0U2VsZWN0aW9uQ2VsbCgpOworICAgICAgaWYgKGNlbGwgIT0gbnVsbCkgeworICAgICAgICBpZiAoY2VsbCBpbnN0YW5jZW9mIERlZmF1bHRHcmFwaENlbGwpIHsKKyAgICAgICAgICBNb2RlbEdyYXBoIGdyYXBoID0gR3VpVXRpbHMuZmluZChzdGF0ZS5nZXRHcmFwaHMoKSwKKyAgICAgICAgICAgICAgKChNb2RlbE5vZGUpICgoRGVmYXVsdEdyYXBoQ2VsbCkgY2VsbCkuZ2V0VXNlck9iamVjdCgpKS5nZXRJZCgpKTsKKyAgICAgICAgICBpZiAoZ3JhcGggIT0gbnVsbCkKKyAgICAgICAgICAgIGdyYXBoLmFkZENoaWxkKG5ld0dyYXBoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGUuYWRkR3JhcGgobmV3R3JhcGgpOworICAgICAgICBHcmFwaFZpZXcudGhpcy5zZXRTaGlmdChzdGF0ZSwgbmV3R3JhcGgsIGN1clBvaW50KTsKKyAgICAgIH0KKyAgICAgIEdyYXBoVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgIH0KKworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2hpZnQoVmlld1N0YXRlIHN0YXRlLCBNb2RlbEdyYXBoIG1vZGVsR3JhcGgsIFBvaW50IHBvaW50KSB7CisgICAgc3RhdGUuc2V0UHJvcGVydHkobW9kZWxHcmFwaC5nZXRNb2RlbCgpLmdldElkKCkgKyAiL1NoaWZ0L3giLAorICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHBvaW50LngpKTsKKyAgICBzdGF0ZS5zZXRQcm9wZXJ0eShtb2RlbEdyYXBoLmdldE1vZGVsKCkuZ2V0SWQoKSArICIvU2hpZnQveSIsCisgICAgICAgIEludGVnZXIudG9TdHJpbmcocG9pbnQueSkpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlU2hpZnQoVmlld1N0YXRlIHN0YXRlLCBNb2RlbEdyYXBoIG1vZGVsR3JhcGgpIHsKKyAgICBzdGF0ZS5yZW1vdmVQcm9wZXJ0eShtb2RlbEdyYXBoLmdldE1vZGVsKCkuZ2V0SWQoKSArICIvU2hpZnQiKTsKKyAgfQorCisgIHB1YmxpYyBQb2ludCBnZXRTaGlmdChWaWV3U3RhdGUgc3RhdGUsIERlZmF1bHRHcmFwaENlbGwgY2VsbCwgTWFwIG5lc3RlZCkgeworICAgIE1vZGVsR3JhcGggZ3JhcGggPSBudWxsOworICAgIGlmIChjZWxsIGluc3RhbmNlb2YgRGVmYXVsdEVkZ2UpIHsKKyAgICAgIElkZW50aWZpYWJsZUVkZ2UgZWRnZSA9IChJZGVudGlmaWFibGVFZGdlKSBjZWxsLmdldFVzZXJPYmplY3QoKTsKKyAgICAgIFBhaXIgcGFpciA9IEdyYXBoVmlldy50aGlzLmVkZ2VNYXAuZ2V0KGVkZ2UuaWQpOworICAgICAgZ3JhcGggPSBHdWlVdGlscy5maW5kKHN0YXRlLmdldEdyYXBocygpLCBwYWlyLmdldEZpcnN0KCkpOworICAgIH0gZWxzZSB7CisgICAgICBncmFwaCA9IEd1aVV0aWxzLmZpbmQoc3RhdGUuZ2V0R3JhcGhzKCksCisgICAgICAgICAgKChNb2RlbE5vZGUpIGNlbGwuZ2V0VXNlck9iamVjdCgpKS5nZXRJZCgpKTsKKyAgICB9CisgICAgTW9kZWxHcmFwaCBwYXJlbnQgPSBHdWlVdGlscy5maW5kUm9vdChzdGF0ZS5nZXRHcmFwaHMoKSwgZ3JhcGgpOworICAgIFBvaW50IHNoaWZ0UG9pbnQgPSBudWxsOworICAgIGlmIChzdGF0ZS5jb250YWluc1Byb3BlcnR5KHBhcmVudC5nZXRNb2RlbCgpLmdldElkKCkgKyAiL1NoaWZ0IikpCisgICAgICBzaGlmdFBvaW50ID0gbmV3IFBvaW50KEludGVnZXIucGFyc2VJbnQoc3RhdGUKKyAgICAgICAgICAuZ2V0Rmlyc3RQcm9wZXJ0eVZhbHVlKHBhcmVudC5nZXRNb2RlbCgpLmdldElkKCkgKyAiL1NoaWZ0L3giKSksCisgICAgICAgICAgSW50ZWdlci5wYXJzZUludChzdGF0ZS5nZXRGaXJzdFByb3BlcnR5VmFsdWUocGFyZW50LmdldE1vZGVsKCkKKyAgICAgICAgICAgICAgLmdldElkKCkgKyAiL1NoaWZ0L3kiKSkpOworICAgIGlmIChzaGlmdFBvaW50ID09IG51bGwpIHsKKyAgICAgIHNoaWZ0UG9pbnQgPSBuZXcgUG9pbnQoMTAwLCAxMDApOworICAgICAgdGhpcy5zZXRTaGlmdChzdGF0ZSwgcGFyZW50LCBzaGlmdFBvaW50KTsKKyAgICAgIHJldHVybiBzaGlmdFBvaW50OworICAgIH0gZWxzZSB7CisgICAgICBSZWN0YW5nbGUyRCBib3VuZHMgPSAoUmVjdGFuZ2xlMkQpICgoTWFwPE9iamVjdCwgT2JqZWN0PikgbmVzdGVkCisgICAgICAgICAgLmdldChHcmFwaFZpZXcudGhpcy5tX2pnQWRhcHRlci5nZXRWZXJ0ZXhDZWxsKHBhcmVudC5nZXRNb2RlbCgpKSkpCisgICAgICAgICAgLmdldChHcmFwaENvbnN0YW50cy5CT1VORFMpOworICAgICAgcmV0dXJuIG5ldyBQb2ludChzaGlmdFBvaW50LnggLSAoaW50KSBib3VuZHMuZ2V0WCgpLCBzaGlmdFBvaW50LnkKKyAgICAgICAgICAtIChpbnQpIGJvdW5kcy5nZXRZKCkpOworICAgIH0KKyAgfQorCisKKyAgcHJpdmF0ZSBQb3B1cE1lbnUgY3JlYXRlQWN0aW9uTWVudShmaW5hbCBWaWV3U3RhdGUgc3RhdGUpIHsKKyAgICBQb3B1cE1lbnUgYWN0aW9uc01lbnUgPSBuZXcgUG9wdXBNZW51KEFDVElPTlNfUE9QX01FTlVfTkFNRSk7CisgICAgUG9wdXBNZW51IG5ld1N1Yk1lbnUgPSBuZXcgUG9wdXBNZW51KE5FV19TVUJfUE9QX01FTlVfTkFNRSk7CisgICAgTWVudUl0ZW0gdGFza0l0ZW0gPSBuZXcgTWVudUl0ZW0oTkVXX1RBU0tfSVRFTV9OQU1FKTsKKyAgICBNZW51SXRlbSBjb25kSXRlbSA9IG5ldyBNZW51SXRlbShORVdfQ09ORElUSU9OX0lURU1fTkFNRSk7CisgICAgbmV3U3ViTWVudS5hZGQodGFza0l0ZW0pOworICAgIG5ld1N1Yk1lbnUuYWRkKGNvbmRJdGVtKTsKKyAgICBuZXdTdWJNZW51LmFkZChuZXcgTWVudUl0ZW0oTkVXX1BBUkFMTEVMX0lURU1fTkFNRSkpOworICAgIG5ld1N1Yk1lbnUuYWRkKG5ldyBNZW51SXRlbShORVdfU0VRVUVOVElBTF9JVEVNX05BTUUpKTsKKyAgICBuZXdTdWJNZW51LmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMubXlHcmFwaExpc3RlbmVyKTsKKyAgICBhY3Rpb25zTWVudS5hZGQobmV3U3ViTWVudSk7CisgICAgTWVudUl0ZW0gdmlld1JlZmVycmVuY2VkV29ya2Zsb3cgPSBuZXcgTWVudUl0ZW0oVklFV19SRUZfV09SS0ZMT1cpOworICAgIGFjdGlvbnNNZW51LmFkZCh2aWV3UmVmZXJyZW5jZWRXb3JrZmxvdyk7CisgICAgTWVudUl0ZW0gZGVsZXRlSXRlbSA9IG5ldyBNZW51SXRlbShERUxFVEVfSVRFTV9OQU1FKTsKKyAgICBhY3Rpb25zTWVudS5hZGQoZGVsZXRlSXRlbSk7CisgICAgTWVudUl0ZW0gZm9ybWF0SXRlbSA9IG5ldyBNZW51SXRlbShGT1JNQVRfSVRFTV9OQU1FKTsKKyAgICBhY3Rpb25zTWVudS5hZGQoZm9ybWF0SXRlbSk7CisKKyAgICBQb3B1cE1lbnUgb3JkZXJTdWJNZW51ID0gbmV3IFBvcHVwTWVudShPUkRFUl9TVUJfUE9QX01FTlVfTkFNRSk7CisKKyAgICBNb2RlbEdyYXBoIG1vZGVsR3JhcGggPSBzdGF0ZS5nZXRTZWxlY3RlZCgpOworICAgIG5ld1N1Yk1lbnUuc2V0RW5hYmxlZChtb2RlbEdyYXBoID09IG51bGwKKyAgICAgICAgfHwgbW9kZWxHcmFwaC5nZXRNb2RlbCgpLmlzUGFyZW50VHlwZSgpKTsKKyAgICBkZWxldGVJdGVtLnNldEVuYWJsZWQobW9kZWxHcmFwaCAhPSBudWxsKTsKKyAgICBmb3JtYXRJdGVtLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgaWYgKG1vZGVsR3JhcGggIT0gbnVsbCkgeworICAgICAgdmlld1JlZmVycmVuY2VkV29ya2Zsb3cuc2V0RW5hYmxlZChtb2RlbEdyYXBoLmdldE1vZGVsKCkuaXNSZWYoKSk7CisgICAgICB0YXNrSXRlbS5zZXRFbmFibGVkKCFtb2RlbEdyYXBoLmlzQ29uZGl0aW9uKCkpOworICAgICAgY29uZEl0ZW0uc2V0RW5hYmxlZChtb2RlbEdyYXBoLmlzQ29uZGl0aW9uKCkpOworICAgICAgb3JkZXJTdWJNZW51LnNldEVuYWJsZWQobW9kZWxHcmFwaC5nZXRQYXJlbnQoKSAhPSBudWxsCisgICAgICAgICAgJiYgIShtb2RlbEdyYXBoLmlzQ29uZGl0aW9uKCkgJiYgIW1vZGVsR3JhcGguZ2V0UGFyZW50KCkKKyAgICAgICAgICAgICAgLmlzQ29uZGl0aW9uKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYm9vbGVhbiBpc0NvbmRpdGlvbiA9IGZhbHNlOworICAgICAgaWYgKHN0YXRlLmdldEdyYXBocygpLnNpemUoKSA+IDApCisgICAgICAgIGlzQ29uZGl0aW9uID0gc3RhdGUuZ2V0R3JhcGhzKCkuZ2V0KDApLmlzQ29uZGl0aW9uKCk7CisgICAgICB2aWV3UmVmZXJyZW5jZWRXb3JrZmxvdy5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgIHRhc2tJdGVtLnNldEVuYWJsZWQoIWlzQ29uZGl0aW9uKTsKKyAgICAgIGNvbmRJdGVtLnNldEVuYWJsZWQoaXNDb25kaXRpb24pOworICAgIH0KKworICAgIGFjdGlvbnNNZW51LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoREVMRVRFX0lURU1fTkFNRSkpIHsKKyAgICAgICAgICBHdWlVdGlscy5yZW1vdmVOb2RlKHN0YXRlLmdldEdyYXBocygpLCBzdGF0ZS5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkpOworICAgICAgICAgIHN0YXRlLnNldFNlbGVjdGVkKG51bGwpOworICAgICAgICAgIEdyYXBoVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhGT1JNQVRfSVRFTV9OQU1FKSkgeworICAgICAgICAgIEdyYXBoVmlldy50aGlzLnJlZnJlc2hWaWV3KHN0YXRlKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoVklFV19SRUZfV09SS0ZMT1cpKSB7CisgICAgICAgICAgc2Nyb2xsU2VsZWN0ZWRUb1Zpc2libGUgPSB0cnVlOworICAgICAgICAgIEdyYXBoVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycyhuZXcgVmlld0NoYW5nZS5WSUVXX01PREVMKHN0YXRlCisgICAgICAgICAgICAgIC5nZXRTZWxlY3RlZCgpLmdldE1vZGVsKCkuZ2V0TW9kZWxJZCgpLCBHcmFwaFZpZXcudGhpcykpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgUG9wdXBNZW51IGVkZ2VzU3ViTWVudSA9IG5ldyBQb3B1cE1lbnUoRURHRVNfU1VCX1BPUF9NRU5VX05BTUUpOworICAgIGVkZ2VzU3ViTWVudS5hZGQobmV3IE1lbnVJdGVtKFRBU0tfTEVWRUwpKTsKKyAgICBlZGdlc1N1Yk1lbnUuYWRkKG5ldyBNZW51SXRlbShXT1JLRkxPV19MRVZFTCkpOworICAgIGFjdGlvbnNNZW51LmFkZChlZGdlc1N1Yk1lbnUpOworICAgIGVkZ2VzU3ViTWVudS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisKKyAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoVEFTS19MRVZFTCkpIHsKKyAgICAgICAgICBzdGF0ZS5zZXRQcm9wZXJ0eShFREdFX0RJU1BMQVlfTU9ERSwgVEFTS19NT0RFKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoV09SS0ZMT1dfTEVWRUwpKSB7CisgICAgICAgICAgc3RhdGUuc2V0UHJvcGVydHkoRURHRV9ESVNQTEFZX01PREUsIFdPUktGTE9XX01PREUpOworICAgICAgICB9CisgICAgICAgIEdyYXBoVmlldy50aGlzLnJlZnJlc2hWaWV3KHN0YXRlKTsKKyAgICAgIH0KKworICAgIH0pOworICAgIGFjdGlvbnNNZW51LmFkZChvcmRlclN1Yk1lbnUpOworICAgIG9yZGVyU3ViTWVudS5hZGQobmV3IE1lbnVJdGVtKFRPX0ZST05UX0lURU1fTkFNRSkpOworICAgIG9yZGVyU3ViTWVudS5hZGQobmV3IE1lbnVJdGVtKFRPX0JBQ0tfSVRFTV9OQU1FKSk7CisgICAgb3JkZXJTdWJNZW51LmFkZChuZXcgTWVudUl0ZW0oRk9SV0FSRF9JVEVNX05BTUUpKTsKKyAgICBvcmRlclN1Yk1lbnUuYWRkKG5ldyBNZW51SXRlbShCQUNLV0FSRFNfSVRFTV9OQU1FKSk7CisgICAgb3JkZXJTdWJNZW51LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgTW9kZWxHcmFwaCBncmFwaCA9IHN0YXRlLmdldFNlbGVjdGVkKCk7CisgICAgICAgIE1vZGVsR3JhcGggcGFyZW50ID0gZ3JhcGguZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoVE9fRlJPTlRfSVRFTV9OQU1FKSkgeworICAgICAgICAgIGlmIChwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoZ3JhcGgpKQorICAgICAgICAgICAgcGFyZW50LmdldENoaWxkcmVuKCkuYWRkKDAsIGdyYXBoKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoVE9fQkFDS19JVEVNX05BTUUpKSB7CisgICAgICAgICAgaWYgKHBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShncmFwaCkpCisgICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZ3JhcGgpOworICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhGT1JXQVJEX0lURU1fTkFNRSkpIHsKKyAgICAgICAgICBpbnQgaW5kZXggPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKGdyYXBoKTsKKyAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoCisgICAgICAgICAgICAgICAgTWF0aC5taW4ocGFyZW50LmdldENoaWxkcmVuKCkuc2l6ZSgpLCBpbmRleCArIDEpLCBncmFwaCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhCQUNLV0FSRFNfSVRFTV9OQU1FKSkgeworICAgICAgICAgIGludCBpbmRleCA9IHBhcmVudC5nZXRDaGlsZHJlbigpLmluZGV4T2YoZ3JhcGgpOworICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgcGFyZW50LmdldENoaWxkcmVuKCkucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIHBhcmVudC5nZXRDaGlsZHJlbigpLmFkZChNYXRoLm1heCgwLCBpbmRleCAtIDEpLCBncmFwaCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEdyYXBoVmlldy50aGlzLm5vdGlmeUxpc3RlbmVycygpOworICAgICAgfQorCisgICAgfSk7CisgICAgcmV0dXJuIGFjdGlvbnNNZW51OworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0lkZW50aWZpYWJsZUVkZ2UuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L2ltcGwvSWRlbnRpZmlhYmxlRWRnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDE3NWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0lkZW50aWZpYWJsZUVkZ2UuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5pbXBsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5tb2RlbC5Nb2RlbE5vZGU7CisKKy8qKgorICogCisgKiBBbiBJRCdlZCBlZGdlIGlkZW50aWZpZWQgYnkge0BsaW5rIFVVSUQjcmFuZG9tVVVJRCgpfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUVkZ2UgeworCisgIFN0cmluZyBpZDsKKyAgCisgIE1vZGVsTm9kZSBmcm9tOworICAKKyAgTW9kZWxOb2RlIHRvOworCisgIHB1YmxpYyBJZGVudGlmaWFibGVFZGdlKE1vZGVsTm9kZSBmcm9tLCBNb2RlbE5vZGUgdG8pIHsKKyAgICBpZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgdGhpcy5mcm9tID0gZnJvbTsKKyAgICB0aGlzLnRvID0gdG87CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBpZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGlkIHRoZSBpZCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBmcm9tCisgICAqLworICBwdWJsaWMgTW9kZWxOb2RlIGdldEZyb20oKSB7CisgICAgcmV0dXJuIGZyb207CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGZyb20gdGhlIGZyb20gdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGcm9tKE1vZGVsTm9kZSBmcm9tKSB7CisgICAgdGhpcy5mcm9tID0gZnJvbTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0bworICAgKi8KKyAgcHVibGljIE1vZGVsTm9kZSBnZXRUbygpIHsKKyAgICByZXR1cm4gdG87CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHRvIHRoZSB0byB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRvKE1vZGVsTm9kZSB0bykgeworICAgIHRoaXMudG8gPSB0bzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvaW1wbC9KdW5nSkdyYXBoTW9kZWxBZGFwdGVyLmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL0p1bmdKR3JhcGhNb2RlbEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE3OWVmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3BlcnNwZWN0aXZlL3ZpZXcvaW1wbC9KdW5nSkdyYXBoTW9kZWxBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LmltcGw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLk1vZGVsTm9kZTsKKworLy9KR3JhcGggaW1wb3J0cworaW1wb3J0IG9yZy5qZ3JhcGguZXZlbnQuR3JhcGhNb2RlbEV2ZW50OworaW1wb3J0IG9yZy5qZ3JhcGguZXZlbnQuR3JhcGhNb2RlbExpc3RlbmVyOworaW1wb3J0IG9yZy5qZ3JhcGguZ3JhcGguQXR0cmlidXRlTWFwOworaW1wb3J0IG9yZy5qZ3JhcGguZ3JhcGguQ29ubmVjdGlvblNldDsKK2ltcG9ydCBvcmcuamdyYXBoLmdyYXBoLkRlZmF1bHRFZGdlOworaW1wb3J0IG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEdyYXBoQ2VsbDsKK2ltcG9ydCBvcmcuamdyYXBoLmdyYXBoLkRlZmF1bHRHcmFwaE1vZGVsOworaW1wb3J0IG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdFBvcnQ7CitpbXBvcnQgb3JnLmpncmFwaC5ncmFwaC5HcmFwaENvbnN0YW50czsKKworLy9KdW5nIGltcG9ydHMKK2ltcG9ydCBlZHUudWNpLmljcy5qdW5nLmdyYXBoLk9ic2VydmFibGVHcmFwaDsKK2ltcG9ydCBlZHUudWNpLmljcy5qdW5nLmdyYXBoLmV2ZW50LkdyYXBoRXZlbnQ7CitpbXBvcnQgZWR1LnVjaS5pY3MuanVuZy5ncmFwaC5ldmVudC5HcmFwaEV2ZW50TGlzdGVuZXI7CisKKy8qKgorICogCisgKiBUaGlzIGNsYXNzIGludGVncmF0ZXMgT09EVCwgSnVuZyBhbmQgSkdyYXBoLgorICogCisgKiBOb3QgbmVjZXNzYXJpbHkgaW4gdGhhdCBvcmRlci4gSXQgYWN0cyBhcyBhIGZhY2FkZSwgd3JhcHBpbmcgYSBKdW5nIGdyYXBoCisgKiAoYW5kIGl0cyBtb2RpZmljYXRpb25zKSBhbmQgdGhlbiB1c2luZyB0aGF0IHRvIHVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZgorICogdGhlIGFzc29jaWF0ZWQgSkdyYXBoIG1vZGVsLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIEp1bmdKR3JhcGhNb2RlbEFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0R3JhcGhNb2RlbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjA1NjQ3MzQ5ODQ4OTY1NjUxTDsKKworICBwcml2YXRlIE9ic2VydmFibGVHcmFwaDxNb2RlbE5vZGUsIElkZW50aWZpYWJsZUVkZ2U+IGp1bmdHcmFwaDsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIERlZmF1bHRHcmFwaENlbGw+IGNlbGxNYXA7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihKdW5nSkdyYXBoTW9kZWxBZGFwdGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIEp1bmdKR3JhcGhNb2RlbEFkYXB0ZXIoCisgICAgICBmaW5hbCBPYnNlcnZhYmxlR3JhcGg8TW9kZWxOb2RlLCBJZGVudGlmaWFibGVFZGdlPiBqdW5nR3JhcGgpIHsKKyAgICB0aGlzLmp1bmdHcmFwaCA9IGp1bmdHcmFwaDsKKyAgICB0aGlzLmp1bmdHcmFwaC5hZGRHcmFwaEV2ZW50TGlzdGVuZXIobmV3IFdvcmtmbG93Q2hhbmdlTGlzdGVuZXIodGhpcykpOworICAgIHRoaXMuY2VsbE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGVmYXVsdEdyYXBoQ2VsbD4oKTsKKyAgICB0aGlzLmFkZEdyYXBoTW9kZWxMaXN0ZW5lcihuZXcgR3JhcGhNb2RlbExpc3RlbmVyKCkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGdyYXBoQ2hhbmdlZChHcmFwaE1vZGVsRXZlbnQgZSkgeworICAgICAgICBPYmplY3RbXSBhZGRlZCA9IGUuZ2V0Q2hhbmdlKCkuZ2V0SW5zZXJ0ZWQoKTsKKyAgICAgICAgT2JqZWN0W10gcmVtb3ZlZCA9IGUuZ2V0Q2hhbmdlKCkuZ2V0UmVtb3ZlZCgpOworICAgICAgICBPYmplY3RbXSBjaGFuZ2VkID0gZS5nZXRDaGFuZ2UoKS5nZXRDaGFuZ2VkKCk7CisKKyAgICAgICAgaWYgKGFkZGVkICE9IG51bGwgJiYgYWRkZWQubGVuZ3RoID4gMCkgeworICAgICAgICAgIGZvciAoT2JqZWN0IGEgOiBhZGRlZCkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiSmdyYXBoIG5vdGlmaWNhdGlvbiBvZiBvYmplY3QgYWRkZWQ6IFsiCisgICAgICAgICAgICAgICAgKyBhLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsKKworICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBvcmcuamdyYXBoLmdyYXBoLkRlZmF1bHRFZGdlKSB7CisgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIkVkZ2UgYWRkZWQgdG8gamdyYXBoIik7CisgICAgICAgICAgICAgIG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEVkZ2UgZWRnZSA9IChvcmcuamdyYXBoLmdyYXBoLkRlZmF1bHRFZGdlKSBhOworICAgICAgICAgICAgICBpZiAoIWp1bmdHcmFwaC5nZXRFZGdlcygpLmNvbnRhaW5zKGVkZ2UuZ2V0VXNlck9iamVjdCgpKSkgeworICAgICAgICAgICAgICAgIGp1bmdHcmFwaC5hZGRFZGdlKAorICAgICAgICAgICAgICAgICAgICBuZXcgSWRlbnRpZmlhYmxlRWRnZSgoTW9kZWxOb2RlKSBlZGdlLmdldFNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKE1vZGVsTm9kZSkgZWRnZS5nZXRUYXJnZXQoKSksIChNb2RlbE5vZGUpIGVkZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTb3VyY2UoKSwgKE1vZGVsTm9kZSkgZWRnZS5nZXRUYXJnZXQoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEdyYXBoQ2VsbCkgeworICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJWZXJ0ZXggYWRkZWQgdG8gamdyYXBoIik7CisgICAgICAgICAgICAgIG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEdyYXBoQ2VsbCBjZWxsID0gKG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEdyYXBoQ2VsbCkgYTsKKworICAgICAgICAgICAgICBpZiAoIWp1bmdHcmFwaC5nZXRWZXJ0aWNlcygpLmNvbnRhaW5zKGNlbGwuZ2V0VXNlck9iamVjdCgpKSkgeworICAgICAgICAgICAgICAgIGp1bmdHcmFwaC5hZGRWZXJ0ZXgoKE1vZGVsTm9kZSkgY2VsbC5nZXRVc2VyT2JqZWN0KCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbW92ZWQgIT0gbnVsbCAmJiByZW1vdmVkLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBmb3IgKE9iamVjdCByIDogcmVtb3ZlZCkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiSmdyYXBoIG5vdGlmaWNhdGlvbiBvZiBvYmplY3QgcmVtb3ZlZDogWyIKKyAgICAgICAgICAgICAgICArIHIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSIpOworCisgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEVkZ2UpIHsKKyAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiRWRnZSByZW1vdmVkIGZyb20gamdyYXBoIik7CisgICAgICAgICAgICAgIG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEVkZ2UgZWRnZSA9IChvcmcuamdyYXBoLmdyYXBoLkRlZmF1bHRFZGdlKSByOworICAgICAgICAgICAgICBpZiAoanVuZ0dyYXBoLmdldEVkZ2VzKCkuY29udGFpbnMoZWRnZS5nZXRVc2VyT2JqZWN0KCkpKSB7CisgICAgICAgICAgICAgICAganVuZ0dyYXBoLnJlbW92ZUVkZ2UoKElkZW50aWZpYWJsZUVkZ2UpIGVkZ2UuZ2V0VXNlck9iamVjdCgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2Ygb3JnLmpncmFwaC5ncmFwaC5EZWZhdWx0R3JhcGhDZWxsKSB7CisgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlZlcnRleCByZW1vdmVkIGZyb20gamdyYXBoIik7CisgICAgICAgICAgICAgIG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEdyYXBoQ2VsbCBjZWxsID0gKG9yZy5qZ3JhcGguZ3JhcGguRGVmYXVsdEdyYXBoQ2VsbCkgcjsKKworICAgICAgICAgICAgICBpZiAoanVuZ0dyYXBoLmdldFZlcnRpY2VzKCkuY29udGFpbnMoY2VsbC5nZXRVc2VyT2JqZWN0KCkpKSB7CisgICAgICAgICAgICAgICAganVuZ0dyYXBoLnJlbW92ZVZlcnRleCgoTW9kZWxOb2RlKSBjZWxsLmdldFVzZXJPYmplY3QoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfQorICAgIH0pOworCisgIH0KKworICBwdWJsaWMgRGVmYXVsdEdyYXBoQ2VsbCBnZXRWZXJ0ZXhDZWxsKE1vZGVsTm9kZSBub2RlKSB7CisgICAgaWYgKGNlbGxNYXAuZ2V0KG5vZGUuZ2V0SWQoKSkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGNlbGxNYXAuZ2V0KG5vZGUuZ2V0SWQoKSk7CisgICAgfQorCisgICAgRGVmYXVsdEdyYXBoQ2VsbCBjZWxsID0gbmV3IERlZmF1bHRHcmFwaENlbGwobm9kZSk7CisgICAgY2VsbC5hZGQobmV3IERlZmF1bHRQb3J0KCkpOworICAgIHJldHVybiBjZWxsOworICB9CisKKyAgcHJpdmF0ZSBBdHRyaWJ1dGVNYXAgZ2V0RWRnZUF0dHJpYnV0ZXMoRGVmYXVsdEVkZ2UgZWRnZSkgeworICAgIEF0dHJpYnV0ZU1hcCBlTWFwID0gbmV3IEF0dHJpYnV0ZU1hcCgpOworICAgIEdyYXBoQ29uc3RhbnRzLnNldExpbmVFbmQoZU1hcCwgR3JhcGhDb25zdGFudHMuQVJST1dfVEVDSE5JQ0FMKTsKKyAgICBHcmFwaENvbnN0YW50cy5zZXRFbmRGaWxsKGVNYXAsIHRydWUpOworICAgIEdyYXBoQ29uc3RhbnRzLnNldEVuZFNpemUoZU1hcCwgMTApOworICAgIEdyYXBoQ29uc3RhbnRzLnNldEZvcmVncm91bmQoZU1hcCwgQ29sb3IuZGVjb2RlKCIjMjU1MDdDIikpOworICAgIEdyYXBoQ29uc3RhbnRzLnNldEZvbnQoZU1hcCwKKyAgICAgICAgR3JhcGhDb25zdGFudHMuREVGQVVMVEZPTlQuZGVyaXZlRm9udChGb250LkJPTEQsIDEyKSk7CisgICAgR3JhcGhDb25zdGFudHMuc2V0TGluZUNvbG9yKGVNYXAsIENvbG9yLmRlY29kZSgiIzdBQTFFNiIpKTsKKyAgICBBdHRyaWJ1dGVNYXAgbWFwID0gbmV3IEF0dHJpYnV0ZU1hcCgpOworICAgIG1hcC5wdXQoZWRnZSwgZU1hcCk7CisgICAgcmV0dXJuIG1hcDsKKyAgfQorCisgIHByaXZhdGUgQXR0cmlidXRlTWFwIGdldFZlcnRleEF0dHJpYnV0ZXMoRGVmYXVsdEdyYXBoQ2VsbCBjZWxsKSB7CisgICAgQXR0cmlidXRlTWFwIHZNYXAgPSBuZXcgQXR0cmlidXRlTWFwKCk7CisKKyAgICBDb2xvciBjID0gQ29sb3IuZGVjb2RlKCIjRkY5OTAwIik7CisgICAgR3JhcGhDb25zdGFudHMuc2V0Qm91bmRzKHZNYXAsIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoNTAsIDUwLCA5MCwgMzApKTsKKyAgICBHcmFwaENvbnN0YW50cy5zZXRCb3JkZXIodk1hcCwgQm9yZGVyRmFjdG9yeS5jcmVhdGVSYWlzZWRCZXZlbEJvcmRlcigpKTsKKyAgICBHcmFwaENvbnN0YW50cy5zZXRCYWNrZ3JvdW5kKHZNYXAsIGMpOworICAgIEdyYXBoQ29uc3RhbnRzLnNldEZvcmVncm91bmQodk1hcCwgQ29sb3Iud2hpdGUpOworICAgIEdyYXBoQ29uc3RhbnRzLnNldEZvbnQodk1hcCwKKyAgICAgICAgR3JhcGhDb25zdGFudHMuREVGQVVMVEZPTlQuZGVyaXZlRm9udChGb250LkJPTEQsIDEyKSk7CisgICAgR3JhcGhDb25zdGFudHMuc2V0T3BhcXVlKHZNYXAsIHRydWUpOworCisgICAgQXR0cmlidXRlTWFwIG1hcCA9IG5ldyBBdHRyaWJ1dGVNYXAoKTsKKyAgICBtYXAucHV0KGNlbGwsIHZNYXApOworICAgIHJldHVybiBtYXA7CisgIH0KKworICBwcml2YXRlIGNsYXNzIFdvcmtmbG93Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cworICAgICAgR3JhcGhFdmVudExpc3RlbmVyPE1vZGVsTm9kZSwgSWRlbnRpZmlhYmxlRWRnZT4geworCisgICAgcHJpdmF0ZSBKdW5nSkdyYXBoTW9kZWxBZGFwdGVyIGFkYXB0ZXI7CisKKyAgICBwdWJsaWMgV29ya2Zsb3dDaGFuZ2VMaXN0ZW5lcihKdW5nSkdyYXBoTW9kZWxBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlCisgICAgICogZWR1LnVjaS5pY3MuanVuZy5ncmFwaC5ldmVudC5HcmFwaEV2ZW50TGlzdGVuZXIjaGFuZGxlR3JhcGhFdmVudChlZHUuCisgICAgICogdWNpLmljcy5qdW5nLmdyYXBoLmV2ZW50LkdyYXBoRXZlbnQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlR3JhcGhFdmVudChHcmFwaEV2ZW50PE1vZGVsTm9kZSwgSWRlbnRpZmlhYmxlRWRnZT4gZSkgeworICAgICAgaWYgKGUuZ2V0VHlwZSgpLmVxdWFscyhHcmFwaEV2ZW50LlR5cGUuRURHRV9BRERFRCkpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiRURHRSBBRERFRCEiKTsKKyAgICAgICAgR3JhcGhFdmVudC5FZGdlPE1vZGVsTm9kZSwgSWRlbnRpZmlhYmxlRWRnZT4gZXZlbnQgPSAoR3JhcGhFdmVudC5FZGdlPE1vZGVsTm9kZSwgSWRlbnRpZmlhYmxlRWRnZT4pIGU7CisgICAgICAgIGFkZEpHcmFwaEVkZ2UoZXZlbnQuZ2V0RWRnZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoZS5nZXRUeXBlKCkuZXF1YWxzKEdyYXBoRXZlbnQuVHlwZS5FREdFX1JFTU9WRUQpKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIkVER0UgUkVNT1ZFRCEiKTsKKyAgICAgIH0gZWxzZSBpZiAoZS5nZXRUeXBlKCkuZXF1YWxzKEdyYXBoRXZlbnQuVHlwZS5WRVJURVhfQURERUQpKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlZFUlRFWCBBRERFRCEiKTsKKyAgICAgICAgR3JhcGhFdmVudC5WZXJ0ZXg8TW9kZWxOb2RlLCBJZGVudGlmaWFibGVFZGdlPiBldmVudCA9IChHcmFwaEV2ZW50LlZlcnRleDxNb2RlbE5vZGUsIElkZW50aWZpYWJsZUVkZ2U+KSBlOworICAgICAgICBhZGRKR3JhcGhWZXJ0ZXgoZXZlbnQuZ2V0VmVydGV4KCkpOworICAgICAgfSBlbHNlIGlmIChlLmdldFR5cGUoKS5lcXVhbHMoR3JhcGhFdmVudC5UeXBlLlZFUlRFWF9SRU1PVkVEKSkgeworICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJWRVJURVggUkVNT1ZFRCEiKTsKKyAgICAgIH0KKworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZEpHcmFwaFZlcnRleChNb2RlbE5vZGUgbm9kZSkgeworICAgIERlZmF1bHRHcmFwaENlbGwgY2VsbCA9IG5ldyBEZWZhdWx0R3JhcGhDZWxsKG5vZGUpOworICAgIGNlbGwuYWRkKG5ldyBEZWZhdWx0UG9ydCgpKTsKKyAgICBpbnNlcnQobmV3IE9iamVjdFtdIHsgY2VsbCB9LCBnZXRWZXJ0ZXhBdHRyaWJ1dGVzKGNlbGwpLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICBjZWxsTWFwLnB1dChub2RlLmdldElkKCksIGNlbGwpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZEpHcmFwaEVkZ2UoSWRlbnRpZmlhYmxlRWRnZSBlKSB7CisgICAgQ29ubmVjdGlvblNldCBzZXQgPSBuZXcgQ29ubmVjdGlvblNldCgpOworICAgIERlZmF1bHRFZGdlIHRoZUVkZ2UgPSBuZXcgRGVmYXVsdEVkZ2UoZSk7CisgICAgRGVmYXVsdEdyYXBoQ2VsbCBmcm9tID0gbnVsbDsKKyAgICBEZWZhdWx0R3JhcGhDZWxsIHRvID0gbnVsbDsKKyAgICBTdHJpbmcgZnJvbVZlcnRleElkID0gZS5nZXRGcm9tKCkuZ2V0SWQoKTsKKyAgICBTdHJpbmcgdG9WZXJ0ZXhJZCA9IGUuZ2V0VG8oKS5nZXRJZCgpOworICAgIGlmICghY2VsbE1hcC5jb250YWluc0tleShmcm9tVmVydGV4SWQpKSB7CisgICAgICBhZGRKR3JhcGhWZXJ0ZXgoZS5nZXRGcm9tKCkpOworICAgIH0KKyAgICBmcm9tID0gY2VsbE1hcC5nZXQoZnJvbVZlcnRleElkKTsKKworICAgIGlmICghY2VsbE1hcC5jb250YWluc0tleSh0b1ZlcnRleElkKSkgeworICAgICAgYWRkSkdyYXBoVmVydGV4KGUuZ2V0VG8oKSk7CisgICAgfQorCisgICAgdG8gPSBjZWxsTWFwLmdldCh0b1ZlcnRleElkKTsKKworICAgIHNldC5jb25uZWN0KHRoZUVkZ2UsIChEZWZhdWx0UG9ydCkgZnJvbS5nZXRDaGlsZEF0KDApLAorICAgICAgICAoRGVmYXVsdFBvcnQpIHRvLmdldENoaWxkQXQoMCkpOworICAgIGluc2VydChuZXcgT2JqZWN0W10geyB0aGVFZGdlIH0sIGdldEVkZ2VBdHRyaWJ1dGVzKHRoZUVkZ2UpLCBzZXQsIG51bGwsCisgICAgICAgIG51bGwpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS9wZXJzcGVjdGl2ZS92aWV3L2ltcGwvVHJlZVByb2plY3RWaWV3LmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL1RyZWVQcm9qZWN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTI4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvcGVyc3BlY3RpdmUvdmlldy9pbXBsL1RyZWVQcm9qZWN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkucGVyc3BlY3RpdmUudmlldy5pbXBsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3Lk11bHRpU3RhdGVWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlld0NoYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5wZXJzcGVjdGl2ZS52aWV3LlZpZXdTdGF0ZTsKKworLyoqCisgKiAKKyAqIAorICogU2hvd3MgdGhlIGZpbGVzL3dvcmtmbG93cyBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0IGluIHRoZSBXb3JrZmxvdyBFZGl0b3IKKyAqIEdVSS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRyZWVQcm9qZWN0VmlldyBleHRlbmRzIE11bHRpU3RhdGVWaWV3IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxODY3NDI4Njk5NTMzNDg0ODYxTDsKKworICBwcml2YXRlIEpUcmVlIHRyZWU7CisKKyAgcHJpdmF0ZSBWaWV3U3RhdGUgc2VsZWN0ZWRTdGF0ZTsKKworICBwdWJsaWMgVHJlZVByb2plY3RWaWV3KFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIobmFtZSk7CisgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWZyZXNoVmlldyhmaW5hbCBWaWV3U3RhdGUgYWN0aXZlU3RhdGUsCisgICAgICBmaW5hbCBMaXN0PFZpZXdTdGF0ZT4gc3RhdGVzKSB7CisgICAgdGhpcy5yZW1vdmVBbGwoKTsKKyAgICB0aGlzLnNlbGVjdGVkU3RhdGUgPSBhY3RpdmVTdGF0ZTsKKyAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHNlbGVjdGVkID0gbnVsbDsKKyAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiUHJvamVjdHMiKTsKKyAgICBmb3IgKFZpZXdTdGF0ZSBzdGF0ZSA6IHN0YXRlcykKKyAgICAgIGlmIChzZWxlY3RlZFN0YXRlICE9IG51bGwKKyAgICAgICAgICAmJiBzdGF0ZS5nZXRGaWxlKCkuZXF1YWxzKHNlbGVjdGVkU3RhdGUuZ2V0RmlsZSgpKSkKKyAgICAgICAgcm9vdC5hZGQoc2VsZWN0ZWQgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShzdGF0ZS5nZXRGaWxlKCkKKyAgICAgICAgICAgIC5nZXROYW1lKCkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcm9vdC5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoc3RhdGUuZ2V0RmlsZSgpLmdldE5hbWUoKSkpOworCisgICAgdHJlZSA9IG5ldyBKVHJlZShyb290KTsKKyAgICB0cmVlLnNldEVkaXRhYmxlKHRydWUpOworICAgIHRyZWUuZ2V0TW9kZWwoKS5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVHJlZU1vZGVsTGlzdGVuZXIoKSB7CisKKyAgICAgIHB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgeworICAgICAgICAvL1RPRE86IHNvbWV0aGluZyB3aXRoIHRoZSB2aWV3IG5vZGVzIGhlcmUKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgeworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgeworICAgICAgfQorCisgICAgfSk7CisgICAgdHJlZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgIGlmIChlLmdldEJ1dHRvbigpID09IE1vdXNlRXZlbnQuQlVUVE9OMSkgeworICAgICAgICAgIGlmICh0cmVlLmdldFNlbGVjdGlvblBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHNlbGVjdGVkQ29tcCA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSB0cmVlCisgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblBhdGgoKS5nZXRMYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICAgICAgU3RyaW5nIHN0YXRlTmFtZSA9IChTdHJpbmcpICgoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgc2VsZWN0ZWRDb21wKQorICAgICAgICAgICAgICAgIC5nZXRVc2VyT2JqZWN0KCk7CisgICAgICAgICAgICBmb3IgKFZpZXdTdGF0ZSBzdGF0ZSA6IHN0YXRlcykgeworICAgICAgICAgICAgICBpZiAoc3RhdGUuZ2V0RmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoc3RhdGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAoZS5nZXRDbGlja0NvdW50KCkgPT0gMikKKyAgICAgICAgICAgICAgICAgIFRyZWVQcm9qZWN0Vmlldy50aGlzCisgICAgICAgICAgICAgICAgICAgICAgLm5vdGlmeUxpc3RlbmVycyhuZXcgVmlld0NoYW5nZS5ORVdfQUNUSVZFX1NUQVRFKAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFN0YXRlLCBUcmVlUHJvamVjdFZpZXcudGhpcykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKSB7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgIH0KKworICAgIH0pOworICAgIGlmIChzZWxlY3RlZCAhPSBudWxsKQorICAgICAgdHJlZS5zZXRTZWxlY3Rpb25QYXRoKG5ldyBUcmVlUGF0aChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZVtdIHsgcm9vdCwKKyAgICAgICAgICBzZWxlY3RlZCB9KSk7CisgICAgZWxzZSBpZiAoc3RhdGVzLnNpemUoKSA+IDApCisgICAgICB0cmVlLnNldFNlbGVjdGlvblBhdGgobmV3IFRyZWVQYXRoKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlW10geyByb290LAorICAgICAgICAgIChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSByb290LmdldENoaWxkQXQoMCkgfSkpOworCisgICAgdHJlZS5zZXRSb290VmlzaWJsZShmYWxzZSk7CisgICAgdGhpcy5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigpKTsKKyAgICBKTGFiZWwgcGFuZWxOYW1lID0gbmV3IEpMYWJlbCgiV29ya3NwYWNlIEV4cGxvcmVyIik7CisgICAgcGFuZWxOYW1lLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOworICAgIHRoaXMuYWRkKHBhbmVsTmFtZSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRyZWUsCisgICAgICAgIEpTY3JvbGxQYW5lLlZFUlRJQ0FMX1NDUk9MTEJBUl9BTFdBWVMsCisgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FMV0FZUyk7CisgICAgdGhpcy5hZGQoc2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisKKyAgICB0aGlzLnJldmFsaWRhdGUoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvdG9vbGJveC9Ub29sLmphdmEgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvdG9vbGJveC9Ub29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYTJkNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS90b29sYm94L1Rvb2wuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnRvb2xib3g7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkltYWdlOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy5JbWFnZUljb247CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKKworLyoqCisgKiAKKyAqIAorICogT25lIG9mIHRoZSB0b29sIGJ1dHRvbnMgYXQgdGhlIHRvcCBvZiB0aGUgV29ya2Zsb3cgRWRpdG9yIEdVSS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRvb2wgZXh0ZW5kcyBKUGFuZWwgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNzMzNTEzODUwMDk3MjQ0MDRMOworCisgIHByaXZhdGUgSW1hZ2UgaW1hZ2UsIHNlbGVjdGVkSW1hZ2U7CisgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOworICBwcml2YXRlIFRvb2xCb3ggdG9vbEJveDsKKworICBwdWJsaWMgVG9vbCgpIHsKKyAgICB0aGlzKCI/Iik7CisgIH0KKworICBwdWJsaWMgVG9vbChTdHJpbmcgdGV4dCkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICB0aGlzLmFkZChuZXcgSkxhYmVsKHRleHQpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICB0aGlzLnNldHVwKCk7CisgIH0KKworICBwdWJsaWMgVG9vbChJbWFnZSBpbWFnZSwgSW1hZ2Ugc2VsZWN0ZWRJbWFnZSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICB0aGlzLmFkZChuZXcgSkxhYmVsKG5ldyBJbWFnZUljb24oaW1hZ2UpKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgdGhpcy5pbWFnZSA9IGltYWdlOworICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IHNlbGVjdGVkSW1hZ2U7CisgICAgdGhpcy5zZXR1cCgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VG9vbEJveChUb29sQm94IHRvb2xCb3gpIHsKKyAgICB0aGlzLnRvb2xCb3ggPSB0b29sQm94OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5zZWxlY3RlZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpIHsKKyAgICBpZiAoaW1hZ2UgIT0gbnVsbCkgeworICAgICAgVG9vbC50aGlzLnJlbW92ZUFsbCgpOworICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZCkKKyAgICAgICAgVG9vbC50aGlzLmFkZChuZXcgSkxhYmVsKG5ldyBJbWFnZUljb24oc2VsZWN0ZWRJbWFnZSkpLAorICAgICAgICAgICAgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICBlbHNlCisgICAgICAgIFRvb2wudGhpcy5hZGQobmV3IEpMYWJlbChuZXcgSW1hZ2VJY29uKGltYWdlKSksIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgVG9vbC50aGlzLnJldmFsaWRhdGUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0dXAoKSB7CisgICAgdGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oMzAsIDMwKSk7CisgICAgdGhpcy5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgeworCisgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgIFRvb2wudGhpcy5vbkNsaWNrKCk7CisgICAgICAgIFRvb2wudGhpcy50b29sQm94LnNldFNlbGVjdGVkKFRvb2wudGhpcyk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgaWYgKCFzZWxlY3RlZCAmJiBzZWxlY3RlZEltYWdlICE9IG51bGwpIHsKKyAgICAgICAgICBUb29sLnRoaXMucmVtb3ZlQWxsKCk7CisgICAgICAgICAgVG9vbC50aGlzLmFkZChuZXcgSkxhYmVsKG5ldyBJbWFnZUljb24oc2VsZWN0ZWRJbWFnZSkpLAorICAgICAgICAgICAgICBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgICBUb29sLnRoaXMucmV2YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICBpZiAoIXNlbGVjdGVkICYmIGltYWdlICE9IG51bGwpIHsKKyAgICAgICAgICBUb29sLnRoaXMucmVtb3ZlQWxsKCk7CisgICAgICAgICAgVG9vbC50aGlzLmFkZChuZXcgSkxhYmVsKG5ldyBJbWFnZUljb24oaW1hZ2UpKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgVG9vbC50aGlzLnJldmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICB9CisKKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2xpY2soKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3Rvb2xib3gvVG9vbEJveC5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3Rvb2xib3gvVG9vbEJveC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYWM4MDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvdG9vbGJveC9Ub29sQm94LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnRvb2xib3g7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlcjsKKworLyoqCisgKiAKKyAqIAorICogVGhlIGJveCBidXR0b24gYW5kIGl0cyBwYW5lbCB0aGF0IHdyYXAgdGhlIHtAbGluayBUb29sfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRvb2xCb3ggZXh0ZW5kcyBKUGFuZWwgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNjcxNDU0NTI0OTY4MjM4NTE5TDsKKworICBwcml2YXRlIEpQYW5lbCB0aXRsZVBhbmVsOworICBwcml2YXRlIEpQYW5lbCBib3hQYW5lbDsKKyAgcHJpdmF0ZSBMaXN0PFRvb2w+IHRvb2xzOworICBwcml2YXRlIFRvb2wgc2VsZWN0ZWRUb29sOworCisgIHB1YmxpYyBUb29sQm94KExpc3Q8VG9vbD4gdG9vbHMpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMudG9vbHMgPSB0b29sczsKKyAgICB0aGlzLnRpdGxlUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgdGhpcy50aXRsZVBhbmVsLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOworICAgIHRoaXMudGl0bGVQYW5lbC5hZGQobmV3IEpMYWJlbCgiVG9vbGJveCIpKTsKKworICAgIHRoaXMuYm94UGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgdGhpcy5ib3hQYW5lbC5zZXRCb3JkZXIobmV3IEV0Y2hlZEJvcmRlcigpKTsKKyAgICB0aGlzLmJveFBhbmVsLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFQURJTkcpKTsKKyAgICBmb3IgKFRvb2wgdG9vbCA6IHRvb2xzKSB7CisgICAgICB0b29sLnNldFRvb2xCb3godGhpcyk7CisgICAgICB0aGlzLmJveFBhbmVsLmFkZCh0b29sKTsKKyAgICB9CisgICAgdGhpcy5hZGQodGhpcy5ib3hQYW5lbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChUb29sIHNlbGVjdGVkVG9vbCkgeworICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gc2VsZWN0ZWRUb29sOworICAgIHRoaXMuc2VsZWN0ZWRUb29sLnNldFNlbGVjdGVkKHRydWUpOworICAgIGZvciAoVG9vbCB0b29sIDogdG9vbHMpCisgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUb29sLmVxdWFscyh0b29sKSkKKyAgICAgICAgdG9vbC5zZXRTZWxlY3RlZChmYWxzZSk7CisgIH0KKworICBwdWJsaWMgVG9vbCBnZXRTZWxlY3RlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRvb2w7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3V0aWwvR3VpVXRpbHMuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS91dGlsL0d1aVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlNGY4NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS91dGlsL0d1aVV0aWxzLmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLk1vZGVsR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5ndWkubW9kZWwuTW9kZWxOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnBlcnNwZWN0aXZlLnZpZXcuVmlld1N0YXRlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKy8qKgorICogCisgKiAKKyAqIEdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbnMgaGVscGZ1bCBmb3IgdGhlIFdvcmtmbG93IEVkaXRvciBHVUkuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBHdWlVdGlscyB7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBBdG9taWNJbnRlZ2VyIHVudGl0bGVkSXRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICBwcm90ZWN0ZWQgc3RhdGljIEF0b21pY0ludGVnZXIgZHVtbXlVbnRpdGxlZEl0ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdWJHcmFwaChNb2RlbEdyYXBoIGdyYXBoLCBNb2RlbEdyYXBoIHN1YkdyYXBoKSB7CisgICAgaWYgKGdyYXBoLmVxdWFscyhzdWJHcmFwaCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBmb3IgKE1vZGVsR3JhcGggY2hpbGQgOiBncmFwaC5nZXRDaGlsZHJlbigpKQorICAgICAgaWYgKGlzU3ViR3JhcGgoY2hpbGQsIHN1YkdyYXBoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKGdyYXBoLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsKQorICAgICAgaWYgKGlzU3ViR3JhcGgoZ3JhcGguZ2V0UHJlQ29uZGl0aW9ucygpLCBzdWJHcmFwaCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChncmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICBpZiAoaXNTdWJHcmFwaChncmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpLCBzdWJHcmFwaCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVHcmFwaE1vZGVsSWQoVmlld1N0YXRlIHN0YXRlLCBTdHJpbmcgaWQsCisgICAgICBTdHJpbmcgbmV3TW9kZWxJZCkgeworICAgIE1vZGVsR3JhcGggZ3JhcGggPSBmaW5kKHN0YXRlLmdldEdyYXBocygpLCBpZCk7CisgICAgaWYgKGdyYXBoLmdldFBhcmVudCgpICE9IG51bGwKKyAgICAgICAgJiYgZ3JhcGguZ2V0UGFyZW50KCkuZ2V0TW9kZWwoKS5nZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkKKyAgICAgICAgICAgIC5jb250YWlucyhncmFwaC5nZXRNb2RlbCgpLmdldE1vZGVsSWQoKSkpIHsKKyAgICAgIGdyYXBoLmdldFBhcmVudCgpLmdldE1vZGVsKCkuZ2V0RXhjdXNlZFN1YlByb2Nlc3NvcklkcygpCisgICAgICAgICAgLnJlbW92ZShncmFwaC5nZXRNb2RlbCgpLmdldE1vZGVsSWQoKSk7CisgICAgICBncmFwaC5nZXRQYXJlbnQoKS5nZXRNb2RlbCgpLmdldEV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMoKS5hZGQobmV3TW9kZWxJZCk7CisgICAgfQorICAgIGdyYXBoLmdldE1vZGVsKCkuc2V0TW9kZWxJZChuZXdNb2RlbElkKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDaGlsZChMaXN0PE1vZGVsR3JhcGg+IGdyYXBocywgU3RyaW5nIHBhcmVudElkLAorICAgICAgTW9kZWxHcmFwaCBjaGlsZCkgeworICAgIE1vZGVsR3JhcGggcGFyZW50ID0gZmluZChncmFwaHMsIHBhcmVudElkKTsKKyAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICBwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PE1vZGVsR3JhcGg+IGZpbmRSb290R3JhcGhzKExpc3Q8TW9kZWxHcmFwaD4gZ3JhcGhzKSB7CisgICAgTGlzdDxNb2RlbEdyYXBoPiByb290R3JhcGhzID0gbmV3IFZlY3RvcjxNb2RlbEdyYXBoPigpOworICAgIGZvciAoTW9kZWxHcmFwaCBncmFwaCA6IGdyYXBocykgeworICAgICAgaWYgKHJvb3RHcmFwaHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcm9vdEdyYXBocy5hZGQoZ3JhcGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZpbmQocm9vdEdyYXBocywgZ3JhcGguZ2V0TW9kZWwoKS5nZXRNb2RlbElkKCkpID09IG51bGwpIHsKKyAgICAgICAgICByb290R3JhcGhzLmFkZChncmFwaCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb290R3JhcGhzLnNpemUoKTsgaSsrKSB7CisgICAgICBNb2RlbEdyYXBoIHJvb3RHcmFwaCA9IHJvb3RHcmFwaHMuZ2V0KGkpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByb290R3JhcGhzLnNpemUoKTsgaisrKSB7CisgICAgICAgIGlmIChpICE9IGoKKyAgICAgICAgICAgICYmIHJvb3RHcmFwaHMuZ2V0KGopLnJlY3Vyc2l2ZUZpbmQoCisgICAgICAgICAgICAgICAgcm9vdEdyYXBoLmdldE1vZGVsKCkuZ2V0TW9kZWxJZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgcm9vdEdyYXBocy5yZW1vdmUoaS0tKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfQorICAgIHJldHVybiByb290R3JhcGhzOworICB9CisKKyAgcHVibGljIHN0YXRpYyBNb2RlbEdyYXBoIGZpbmRSb290KExpc3Q8TW9kZWxHcmFwaD4gcm9vdEdyYXBocywKKyAgICAgIE1vZGVsR3JhcGggZ3JhcGgpIHsKKyAgICBmb3IgKE1vZGVsR3JhcGggcm9vdEdyYXBoIDogcm9vdEdyYXBocykgeworICAgICAgaWYgKGdyYXBoLmVxdWFscyhyb290R3JhcGgpKSB7CisgICAgICAgIHJldHVybiByb290R3JhcGg7CisgICAgICB9IGVsc2UgaWYgKGdyYXBoLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgTW9kZWxHcmFwaCByb290ID0gZmluZFJvb3Qocm9vdEdyYXBocywgZ3JhcGguZ2V0UGFyZW50KCkpOworICAgICAgICBpZiAocm9vdCAhPSBudWxsKQorICAgICAgICAgIHJldHVybiByb290OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxNb2RlbEdyYXBoPiBmaW5kKExpc3Q8TW9kZWxHcmFwaD4gZ3JhcGhzLCBTZXQ8U3RyaW5nPiBpZHMpIHsKKyAgICBWZWN0b3I8TW9kZWxHcmFwaD4gZm91bmRHcmFwaHMgPSBuZXcgVmVjdG9yPE1vZGVsR3JhcGg+KCk7CisgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKKyAgICAgIE1vZGVsR3JhcGggZ3JhcGggPSBmaW5kKGdyYXBocywgaWQpOworICAgICAgaWYgKGdyYXBoICE9IG51bGwpCisgICAgICAgIGZvdW5kR3JhcGhzLmFkZChncmFwaCk7CisgICAgfQorICAgIHJldHVybiBmb3VuZEdyYXBoczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTW9kZWxHcmFwaCBmaW5kKExpc3Q8TW9kZWxHcmFwaD4gZ3JhcGhzLCBTdHJpbmcgaWQpIHsKKyAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiBncmFwaHMpIHsKKyAgICAgIE1vZGVsR3JhcGggZm91bmQgPSBncmFwaC5yZWN1cnNpdmVGaW5kKGlkKTsKKyAgICAgIGlmIChmb3VuZCAhPSBudWxsKQorICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIHN0YXRpYyBNb2RlbEdyYXBoIHJlbW92ZU5vZGUoTGlzdDxNb2RlbEdyYXBoPiBncmFwaHMsIE1vZGVsTm9kZSBub2RlKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmFwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChncmFwaHMuZ2V0KGkpLmdldE1vZGVsKCkuZXF1YWxzKG5vZGUpKSB7CisgICAgICAgIHJldHVybiBncmFwaHMucmVtb3ZlKGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTW9kZWxHcmFwaCBncmFwaCA9IHJlbW92ZU5vZGUoZ3JhcGhzLmdldChpKSwgbm9kZSk7CisgICAgICAgIGlmIChncmFwaCAhPSBudWxsKQorICAgICAgICAgIHJldHVybiBncmFwaDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIE1vZGVsR3JhcGggcmVtb3ZlTm9kZShNb2RlbEdyYXBoIGdyYXBoLCBNb2RlbE5vZGUgbm9kZSkgeworICAgIFN0YWNrPE1vZGVsR3JhcGg+IHN0YWNrID0gbmV3IFN0YWNrPE1vZGVsR3JhcGg+KCk7CisgICAgc3RhY2suYWRkKGdyYXBoKTsKKyAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIE1vZGVsR3JhcGggY3VyR3JhcGggPSBzdGFjay5wb3AoKTsKKyAgICAgIGlmIChjdXJHcmFwaC5nZXRNb2RlbCgpLmVxdWFscyhub2RlKSkgeworICAgICAgICBjdXJHcmFwaC5zZXRQYXJlbnQobnVsbCk7CisgICAgICAgIHJldHVybiBjdXJHcmFwaDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YWNrLmFkZEFsbChjdXJHcmFwaC5nZXRDaGlsZHJlbigpKTsKKyAgICAgICAgaWYgKGN1ckdyYXBoLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsKQorICAgICAgICAgIHN0YWNrLmFkZChjdXJHcmFwaC5nZXRQcmVDb25kaXRpb25zKCkpOworICAgICAgICBpZiAoY3VyR3JhcGguZ2V0UG9zdENvbmRpdGlvbnMoKSAhPSBudWxsKQorICAgICAgICAgIHN0YWNrLmFkZChjdXJHcmFwaC5nZXRQb3N0Q29uZGl0aW9ucygpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8TGluZT4gZmluZFNlcXVlbnRpYWxMaW5lcyhMaXN0PE1vZGVsR3JhcGg+IGdyYXBocykgeworICAgIFZlY3RvcjxMaW5lPiBsaW5lcyA9IG5ldyBWZWN0b3I8TGluZT4oKTsKKyAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiBncmFwaHMpCisgICAgICBsaW5lcy5hZGRBbGwoZmluZFNlcXVlbnRpYWxMaW5lcyhncmFwaCkpOworICAgIHJldHVybiBsaW5lczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxMaW5lPiBmaW5kU2VxdWVudGlhbExpbmVzKGZpbmFsIE1vZGVsR3JhcGggZ3JhcGgpIHsKKyAgICBWZWN0b3I8TGluZT4gbGluZXMgPSBuZXcgVmVjdG9yPExpbmU+KCk7CisgICAgaWYgKGdyYXBoLmdldENoaWxkcmVuKCkuc2l6ZSgpID4gMCkgeworICAgICAgU3RhY2s8TW9kZWxHcmFwaD4gc3RhY2sgPSBuZXcgU3RhY2s8TW9kZWxHcmFwaD4oKTsKKyAgICAgIHN0YWNrLmFkZChncmFwaCk7CisgICAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgTW9kZWxHcmFwaCBjdXJHcmFwaCA9IHN0YWNrLnBvcCgpOworICAgICAgICBpZiAoY3VyR3JhcGguZ2V0TW9kZWwoKS5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJzZXF1ZW50aWFsIikpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1ckdyYXBoLmdldENoaWxkcmVuKCkuc2l6ZSgpIC0gMTsgaSsrKQorICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBMaW5lKGN1ckdyYXBoLmdldENoaWxkcmVuKCkuZ2V0KGkpLmdldE1vZGVsKCksCisgICAgICAgICAgICAgICAgY3VyR3JhcGguZ2V0Q2hpbGRyZW4oKS5nZXQoaSArIDEpLmdldE1vZGVsKCkpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFjay5hZGRBbGwoY3VyR3JhcGguZ2V0Q2hpbGRyZW4oKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsaW5lczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxMaW5lPiBmaW5kTGluZXMoZmluYWwgTGlzdDxNb2RlbEdyYXBoPiBncmFwaHMpIHsKKyAgICBWZWN0b3I8TGluZT4gbGluZXMgPSBuZXcgVmVjdG9yPExpbmU+KCk7CisgICAgZm9yIChNb2RlbEdyYXBoIGdyYXBoIDogZ3JhcGhzKQorICAgICAgbGluZXMuYWRkQWxsKGZpbmRMaW5lcyhncmFwaCkpOworICAgIHJldHVybiBsaW5lczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxMaW5lPiBmaW5kTGluZXMoZmluYWwgTW9kZWxHcmFwaCBncmFwaCkgeworICAgIFZlY3RvcjxMaW5lPiBsaW5lcyA9IG5ldyBWZWN0b3I8TGluZT4oKTsKKyAgICBpZiAoZ3JhcGguZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKSB7CisgICAgICBTdGFjazxNb2RlbEdyYXBoPiBncmFwaHMgPSBuZXcgU3RhY2s8TW9kZWxHcmFwaD4oKTsKKyAgICAgIGdyYXBocy5hZGQoZ3JhcGgpOworICAgICAgd2hpbGUgKCFncmFwaHMuZW1wdHkoKSkgeworICAgICAgICBNb2RlbEdyYXBoIGN1ckdyYXBoID0gZ3JhcGhzLnBvcCgpOworICAgICAgICBpZiAoY3VyR3JhcGguZ2V0TW9kZWwoKS5pc1BhcmVudFR5cGUoKSkgeworCisgICAgICAgICAgaWYgKGN1ckdyYXBoLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDApCisgICAgICAgICAgICBjdXJHcmFwaC5hZGRDaGlsZChuZXcgTW9kZWxHcmFwaChjcmVhdGVEdW1teU5vZGUoKSkpOworCisgICAgICAgICAgTGlzdDxMaW5lPiByZWxhdmVudExpbmVzID0gZ2V0UmVsYXZlbnRMaW5lcyhsaW5lcywgY3VyR3JhcGgKKyAgICAgICAgICAgICAgLmdldE1vZGVsKCkuZ2V0SWQoKSk7CisgICAgICAgICAgZm9yIChMaW5lIHJlbGF2ZW50TGluZSA6IHJlbGF2ZW50TGluZXMpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmVzLmluZGV4T2YocmVsYXZlbnRMaW5lKTsKKyAgICAgICAgICAgIGlmIChjdXJHcmFwaC5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKS50b0xvd2VyQ2FzZSgpCisgICAgICAgICAgICAgICAgLmVxdWFscygic2VxdWVudGlhbCIpKSB7CisgICAgICAgICAgICAgIGxpbmVzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgIGlmIChjdXJHcmFwaC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmVsYXZlbnRMaW5lLmdldEZyb21Nb2RlbCgpLmVxdWFscyhjdXJHcmFwaC5nZXRNb2RlbCgpKSkKKyAgICAgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgTGluZShjdXJHcmFwaC5nZXRDaGlsZHJlbigpCisgICAgICAgICAgICAgICAgICAgICAgLmdldChjdXJHcmFwaC5nZXRDaGlsZHJlbigpLnNpemUoKSAtIDEpLmdldE1vZGVsKCksCisgICAgICAgICAgICAgICAgICAgICAgcmVsYXZlbnRMaW5lLmdldFRvTW9kZWwoKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgTGluZShyZWxhdmVudExpbmUuZ2V0RnJvbU1vZGVsKCksIGN1ckdyYXBoCisgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuKCkuZ2V0KDApLmdldE1vZGVsKCkpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJHcmFwaC5nZXRNb2RlbCgpLmdldEV4ZWN1dGlvblR5cGUoKS50b0xvd2VyQ2FzZSgpCisgICAgICAgICAgICAgICAgLmVxdWFscygicGFyYWxsZWwiKSkgeworICAgICAgICAgICAgICBsaW5lcy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgICBpZiAocmVsYXZlbnRMaW5lLmdldEZyb21Nb2RlbCgpLmVxdWFscyhjdXJHcmFwaC5nZXRNb2RlbCgpKSkKKyAgICAgICAgICAgICAgICBmb3IgKE1vZGVsR3JhcGggY2hpbGQgOiBjdXJHcmFwaC5nZXRDaGlsZHJlbigpKQorICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBMaW5lKGNoaWxkLmdldE1vZGVsKCksIHJlbGF2ZW50TGluZQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRUb01vZGVsKCkpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciAoTW9kZWxHcmFwaCBjaGlsZCA6IGN1ckdyYXBoLmdldENoaWxkcmVuKCkpCisgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQobmV3IExpbmUocmVsYXZlbnRMaW5lLmdldEZyb21Nb2RlbCgpLCBjaGlsZAorICAgICAgICAgICAgICAgICAgICAgIC5nZXRNb2RlbCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGN1ckdyYXBoLmdldE1vZGVsKCkuZ2V0RXhlY3V0aW9uVHlwZSgpLnRvTG93ZXJDYXNlKCkKKyAgICAgICAgICAgICAgLmVxdWFscygic2VxdWVudGlhbCIpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1ckdyYXBoLmdldENoaWxkcmVuKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKGkgPT0gY3VyR3JhcGguZ2V0Q2hpbGRyZW4oKS5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgTGluZShjdXJHcmFwaC5nZXRDaGlsZHJlbigpLmdldChpKS5nZXRNb2RlbCgpLAorICAgICAgICAgICAgICAgICAgICBudWxsKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW5lcy5hZGQobmV3IExpbmUoY3VyR3JhcGguZ2V0Q2hpbGRyZW4oKS5nZXQoaSkuZ2V0TW9kZWwoKSwKKyAgICAgICAgICAgICAgICAgICAgY3VyR3JhcGguZ2V0Q2hpbGRyZW4oKS5nZXQoaSArIDEpLmdldE1vZGVsKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGN1ckdyYXBoLmdldE1vZGVsKCkuZ2V0RXhlY3V0aW9uVHlwZSgpLnRvTG93ZXJDYXNlKCkKKyAgICAgICAgICAgICAgLmVxdWFscygicGFyYWxsZWwiKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJHcmFwaC5nZXRDaGlsZHJlbigpLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICBsaW5lcworICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGluZShjdXJHcmFwaC5nZXRDaGlsZHJlbigpLmdldChpKS5nZXRNb2RlbCgpLCBudWxsKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdyYXBocy5hZGRBbGwoY3VyR3JhcGguZ2V0Q2hpbGRyZW4oKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGluZXMuYWRkKG5ldyBMaW5lKGdyYXBoLmdldE1vZGVsKCksIG51bGwpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpbmVzOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRHVtbXlOb2RlKE1vZGVsTm9kZSBub2RlKSB7CisgICAgcmV0dXJuIG5vZGUuZ2V0TW9kZWxJZCgpLnN0YXJ0c1dpdGgoIkRVTU1ZLSIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBNb2RlbE5vZGUgY3JlYXRlRHVtbXlOb2RlKCkgeworICAgIE1vZGVsTm9kZSBkdW1teSA9IG5ldyBNb2RlbE5vZGUobnVsbCwgIkRVTU1ZLSIKKyAgICAgICAgKyBkdW1teVVudGl0bGVkSXRlci5nZXRBbmRJbmNyZW1lbnQoKSk7CisgICAgZHVtbXkuc2V0VGV4dFZpc2libGUoZmFsc2UpOworICAgIHJldHVybiBkdW1teTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxNb2RlbEdyYXBoPiBnZXRHcmFwaHNJbkZpbGUoRmlsZSBmaWxlLAorICAgICAgTGlzdDxNb2RlbEdyYXBoPiBncmFwaHMpIHsKKyAgICBMaXN0PE1vZGVsR3JhcGg+IGdyYXBoc0luRmlsZSA9IG5ldyBWZWN0b3I8TW9kZWxHcmFwaD4oKTsKKyAgICBmb3IgKE1vZGVsR3JhcGggZ3JhcGggOiBncmFwaHMpIHsKKyAgICAgIGlmIChncmFwaC5nZXRNb2RlbCgpLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKKyAgICAgICAgZ3JhcGhzSW5GaWxlLmFkZChncmFwaCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBncmFwaHNJbkZpbGUuYWRkQWxsKGdldEdyYXBoc0luRmlsZShmaWxlLCBncmFwaC5nZXRDaGlsZHJlbigpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBncmFwaHNJbkZpbGU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVOYW1lKCkgeworICAgIHJldHVybiAiVW50aXRsZWQtIiArIHVudGl0bGVkSXRlci5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGluZSBnZXRMaW5lKExpc3Q8TGluZT4gbGluZXMsIE1vZGVsTm9kZSBmcm9tTW9kZWwsCisgICAgICBNb2RlbE5vZGUgdG9Nb2RlbCkgeworICAgIGZvciAoTGluZSBsaW5lIDogbGluZXMpCisgICAgICBpZiAobGluZS5nZXRGcm9tTW9kZWwoKS5lcXVhbHMoZnJvbU1vZGVsKQorICAgICAgICAgICYmIGxpbmUuZ2V0VG9Nb2RlbCgpLmVxdWFscyh0b01vZGVsKSkKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8TGluZT4gZ2V0UmVsYXZlbnRMaW5lcyhMaXN0PExpbmU+IGxpbmVzLCBTdHJpbmcgaWQpIHsKKyAgICBMaXN0PExpbmU+IHJlbGF2ZW50TGluZXMgPSBuZXcgVmVjdG9yPExpbmU+KCk7CisgICAgZm9yIChMaW5lIGxpbmUgOiBsaW5lcykKKyAgICAgIGlmICgobGluZS5nZXRGcm9tTW9kZWwoKSAhPSBudWxsICYmIGxpbmUuZ2V0RnJvbU1vZGVsKCkuZ2V0SWQoKQorICAgICAgICAgIC5lcXVhbHMoaWQpKQorICAgICAgICAgIHx8IChsaW5lLmdldFRvTW9kZWwoKSAhPSBudWxsICYmIGxpbmUuZ2V0VG9Nb2RlbCgpLmdldElkKCkuZXF1YWxzKGlkKSkpCisgICAgICAgIHJlbGF2ZW50TGluZXMuYWRkKGxpbmUpOworICAgIHJldHVybiByZWxhdmVudExpbmVzOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PExpbmU+IGdldENoaWxkcmVuTGluZXMoTGlzdDxMaW5lPiBsaW5lcywgU3RyaW5nIGlkKSB7CisgICAgTGlzdDxMaW5lPiByZWxhdmVudExpbmVzID0gbmV3IFZlY3RvcjxMaW5lPigpOworICAgIGZvciAoTGluZSBsaW5lIDogbGluZXMpCisgICAgICBpZiAobGluZS5nZXRGcm9tTW9kZWwoKS5nZXRJZCgpLmVxdWFscyhpZCkpCisgICAgICAgIHJlbGF2ZW50TGluZXMuYWRkKGxpbmUpOworICAgIHJldHVybiByZWxhdmVudExpbmVzOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PExpbmU+IGdldFBhcmVudExpbmVzKExpc3Q8TGluZT4gbGluZXMsIFN0cmluZyBpZCkgeworICAgIExpc3Q8TGluZT4gcmVsYXZlbnRMaW5lcyA9IG5ldyBWZWN0b3I8TGluZT4oKTsKKyAgICBmb3IgKExpbmUgbGluZSA6IGxpbmVzKQorICAgICAgaWYgKGxpbmUuZ2V0VG9Nb2RlbCgpLmdldElkKCkuZXF1YWxzKGlkKSkKKyAgICAgICAgcmVsYXZlbnRMaW5lcy5hZGQobGluZSk7CisgICAgcmV0dXJuIHJlbGF2ZW50TGluZXM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8TGluZT4gZ2V0U3RhcnRpbmdMaW5lcyhMaXN0PExpbmU+IGxpbmVzKSB7CisgICAgVmVjdG9yPExpbmU+IHN0YXJ0aW5nTGluZXMgPSBuZXcgVmVjdG9yPExpbmU+KCk7CisgICAgZm9yIChMaW5lIGxpbmUgOiBsaW5lcykKKyAgICAgIGlmIChnZXRQYXJlbnRMaW5lcyhsaW5lcywgbGluZS5nZXRGcm9tTW9kZWwoKS5nZXRJZCgpKS5zaXplKCkgPT0gMCkKKyAgICAgICAgc3RhcnRpbmdMaW5lcy5hZGQobGluZSk7CisgICAgcmV0dXJuIHN0YXJ0aW5nTGluZXM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3V0aWwvSWNvbkxvYWRlci5qYXZhIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3V0aWwvSWNvbkxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZGZkMGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9ndWkvdXRpbC9JY29uTG9hZGVyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmF3dC5JbWFnZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKKworLyoqCisgKiAKKyAqIAorICogTG9hZHMgdGhlIGFwcHJvcHJpYXRlIGNsYXNzcGF0aC1sZXZlbCBpY29uIGltYWdlIGZvciBUb29scywgZXRjLiwgdGhhdCBhcmUKKyAqIHBhcnQgb2YgdGhlIFdvcmtmbG93IEVkaXRvciBHVUkuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSWNvbkxvYWRlciB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX1NFTEVDVEVEID0gMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX1NFTEVDVEVEID0gMzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVCA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfU0VMRUNURUQgPSA1OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFID0gNjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9TRUxFQ1RFRCA9IDc7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFpPT01fSU4gPSA4OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaT09NX0lOX1NFTEVDVEVEID0gOTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9PVVQgPSAxMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9PVVRfU0VMRUNURUQgPSAxMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9DVVJTT1IgPSAxMjsKKworICBwcml2YXRlIEljb25Mb2FkZXIoKSB7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEljb24oaW50IGljb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoIChpY29uKSB7CisgICAgY2FzZSBERUxFVEU6CisgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKEljb25Mb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UoImRlbGV0ZS5qcGciKSk7CisgICAgY2FzZSBERUxFVEVfU0VMRUNURUQ6CisgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKEljb25Mb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UoImRlbGV0ZS1zZWwuanBnIikpOworICAgIGNhc2UgRURJVDoKKyAgICAgIHJldHVybiBJbWFnZUlPLnJlYWQoSWNvbkxvYWRlci5jbGFzcy5nZXRSZXNvdXJjZSgiZWRpdC5qcGciKSk7CisgICAgY2FzZSBFRElUX1NFTEVDVEVEOgorICAgICAgcmV0dXJuIEltYWdlSU8ucmVhZChJY29uTG9hZGVyLmNsYXNzLmdldFJlc291cmNlKCJlZGl0LXNlbC5qcGciKSk7CisgICAgY2FzZSBNT1ZFOgorICAgICAgcmV0dXJuIEltYWdlSU8ucmVhZChJY29uTG9hZGVyLmNsYXNzLmdldFJlc291cmNlKCJtb3ZlLmpwZyIpKTsKKyAgICBjYXNlIE1PVkVfU0VMRUNURUQ6CisgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKEljb25Mb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UoIm1vdmUtc2VsLmpwZyIpKTsKKyAgICBjYXNlIFpPT01fSU46CisgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKEljb25Mb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UoInpvb20taW4uanBnIikpOworICAgIGNhc2UgWk9PTV9JTl9TRUxFQ1RFRDoKKyAgICAgIHJldHVybiBJbWFnZUlPLnJlYWQoSWNvbkxvYWRlci5jbGFzcy5nZXRSZXNvdXJjZSgiem9vbS1pbi1zZWwuanBnIikpOworICAgIGNhc2UgWk9PTV9PVVQ6CisgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKEljb25Mb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UoInpvb20tb3V0LmpwZyIpKTsKKyAgICBjYXNlIFpPT01fT1VUX1NFTEVDVEVEOgorICAgICAgcmV0dXJuIEltYWdlSU8ucmVhZChJY29uTG9hZGVyLmNsYXNzLmdldFJlc291cmNlKCJ6b29tLW91dC1zZWwuanBnIikpOworICAgIGNhc2UgWk9PTV9DVVJTT1I6CisgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKEljb25Mb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UoImN1cnNvci16b29tLnBuZyIpKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS91dGlsL0xpbmUuamF2YSBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2d1aS91dGlsL0xpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRjODBhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZ3VpL3V0aWwvTGluZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZ3VpLm1vZGVsLk1vZGVsTm9kZTsKKworLyoqCisgKiAKKyAqIAorICogV3JhcHBlciBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgbGluZSBiZXR3ZWVuIHR3byB7QGxpbmsgTW9kZWxOb2RlfXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5lIHsKKworICBwcml2YXRlIE1vZGVsTm9kZSBmcm9tTW9kZWw7CisgIHByaXZhdGUgTW9kZWxOb2RlIHRvTW9kZWw7CisKKyAgcHVibGljIExpbmUoTW9kZWxOb2RlIGZyb21Nb2RlbCwgTW9kZWxOb2RlIHRvTW9kZWwpIHsKKyAgICB0aGlzLmZyb21Nb2RlbCA9IGZyb21Nb2RlbDsKKyAgICB0aGlzLnRvTW9kZWwgPSB0b01vZGVsOworICB9CisKKyAgcHVibGljIE1vZGVsTm9kZSBnZXRGcm9tTW9kZWwoKSB7CisgICAgcmV0dXJuIGZyb21Nb2RlbDsKKyAgfQorCisgIHB1YmxpYyBNb2RlbE5vZGUgZ2V0VG9Nb2RlbCgpIHsKKyAgICByZXR1cm4gdG9Nb2RlbDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExpbmUpIHsKKyAgICAgIGlmICh0aGlzLmZyb21Nb2RlbCA9PSBudWxsICYmIHRoaXMudG9Nb2RlbCA9PSBudWxsKQorICAgICAgICByZXR1cm4gKChMaW5lKSBvYmopLmZyb21Nb2RlbCA9PSBudWxsICYmICgoTGluZSkgb2JqKS50b01vZGVsID09IG51bGw7CisgICAgICBlbHNlIGlmICh0aGlzLmZyb21Nb2RlbCA9PSBudWxsKQorICAgICAgICByZXR1cm4gKChMaW5lKSBvYmopLmZyb21Nb2RlbCA9PSBudWxsCisgICAgICAgICAgICAmJiAoKExpbmUpIG9iaikudG9Nb2RlbC5lcXVhbHModGhpcy50b01vZGVsKTsKKyAgICAgIGVsc2UgaWYgKHRoaXMudG9Nb2RlbCA9PSBudWxsKQorICAgICAgICByZXR1cm4gKChMaW5lKSBvYmopLmZyb21Nb2RlbC5lcXVhbHModGhpcy5mcm9tTW9kZWwpCisgICAgICAgICAgICAmJiAoKExpbmUpIG9iaikudG9Nb2RlbCA9PSBudWxsOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKChMaW5lKSBvYmopLmZyb21Nb2RlbC5lcXVhbHModGhpcy5mcm9tTW9kZWwpCisgICAgICAgICAgICAmJiAoKExpbmUpIG9iaikudG9Nb2RlbC5lcXVhbHModGhpcy50b01vZGVsKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuZnJvbU1vZGVsLmdldE1vZGVsSWQoKSArICIgLT4gIiArIHRoaXMudG9Nb2RlbC5nZXRNb2RlbElkKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvUkVNT1ZFLmxvZyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFkZjhiMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cKQEAgLTAsMCArMSwxOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGlzIGZpbGUgb25seSBleGlzdHMgdG8gZW5zdXJlIHRoYXQgTWF2ZW4gY3JlYXRlcyAKK3RoaXMgb3V0cHV0IGRpcmVjdG9yeS5Zb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyAKK2ZpbGUuCmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9HcmFudWxlTWFwcy54bWwgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9HcmFudWxlTWFwcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjZTY4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0dyYW51bGVNYXBzLnhtbApAQCAtMCwwICsxLDIzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOndvcmtmbG93cyAKKwl4bWxucz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzIuMC9jYXMiCisJeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMi4wL2NhcyIKKwl4bWxuczpwPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMi4wL2Nhcy9wcm9wZXJ0eSI+CisJCisJPHNlcXVlbnRpYWwgaWQ9InVybjpucHA6R3JhbnVsZU1hcHMiIG5hbWU9IkdyYW51bGVNYXBzIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQkKKwkJCTwhLS0gUENTIHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9RdWVyeS9GaWxlTWFuYWdlclVybCIgdmFsdWU9IltGSUxFTUdSX1VSTF0iIGVudlJlcGxhY2U9InRydWUiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9GaWxlTWFuYWdlclVybCIgdmFsdWU9IltGSUxFTUdSX1VSTF0iIGVudlJlcGxhY2U9InRydWUiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9DbGllbnRUcmFuc2ZlclNlcnZpY2VGYWN0b3J5IiB2YWx1ZT0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svSW5nZXN0L01ldEZpbGVFeHRlbnNpb24iIHZhbHVlPSJjYXMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9DcmF3bGVyQ3Jhd2xGb3JEaXJzIiB2YWx1ZT0iZmFsc2UiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9DcmF3bGVyUmVjdXIiIHZhbHVlPSJmYWxzZSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svSW5nZXN0L0FjdGlvbnNJZHMiIHZhbHVlPSJSbURhdGFGaWxlIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Jbmdlc3QvQWN0aW9uUmVwb0ZpbGUiIHZhbHVlPSJmaWxlOltQQ1NfSE9NRV0vY29yZS9wZ2UvcG9saWN5L2FjdGlvbi1iZWFucy54bWwiIGVudlJlcGxhY2U9InRydWUiLz4KKwkJCQorCQkJPCEtLSBUaW1lb3V0IHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vVGltZW91dCIgdmFsdWU9IjMwMDAwIi8+CisKKwkJCTwhLS0gcXVlcnkgcHJvcGVydGllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9TdGFydERhdGVUaW1lS2V5IiB2YWx1ZT0iU3RhcnREYXRlVGltZSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0VuZERhdGVUaW1lS2V5IiB2YWx1ZT0iRW5kRGF0ZVRpbWUiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Tb3J0QnlLZXkiIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vVmVyc2lvbmluZ0tleSIgdmFsdWU9IlByb2R1Y3Rpb25EYXRlVGltZSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0ZpbHRlckFsZ29yQ2xhc3MiIHZhbHVlPSJnb3YubmFzYS5qcGwub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5XZWlnaHRlZEhhc2hGaWx0ZXJBbGdvciIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL01pbk51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vTWF4R2FwU2l6ZSIgdmFsdWU9Ii0xIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXBzaWxvbkluTWlsbGlzIiB2YWx1ZT0iMCIvPgorCQkJCisJCQk8IS0tIFdhaXQgdGltZSBiZXR3ZWVuIGJsb2NrIGFuZCB1bmJsb2NrIGluIG1pbnV0ZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iQmxvY2tUaW1lRWxhcHNlIiB2YWx1ZT0iMSIvPgorCisJCTwvY29uZmlndXJhdGlvbj4KKworCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InBhcmFsbGVsIiB0eXBlPSJwcmUiPgorCQkJPGNvbmRpdGlvbiBpZC1yZWY9InVybjpucHA6TU9BX0lBU0lfTDFDX0RhaWx5Ii8+CQkJCisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpNT0FfTUhTX0wxQl9EYWlseSIvPgkJCQorCQkJPGNvbmRpdGlvbiBpZC1yZWY9InVybjpucHA6TU9BX0FNU1VBX0wxQl9EYWlseSIvPgkJCQorCQk8L2NvbmRpdGlvbnM+CisJCQorCQk8cGFyYWxsZWw+CisJCQk8dGFzayBpZC1yZWY9InVybjpucHA6T3JiaXRzIi8+CisJCQk8dGFzayBpZC1yZWY9InVybjpucHA6TW9hSWFzaUdQb2x5Z29uIi8+CisJCQk8dGFzayBpZC1yZWY9InVybjpucHA6TW9hTWhzR1BvbHlnb24iLz4KKwkJCTx0YXNrIGlkLXJlZj0idXJuOm5wcDpNb2FBbXN1YUdQb2x5Z29uIi8+CisJCTwvcGFyYWxsZWw+CisJCQorCQk8cGFyYWxsZWw+CQkKKwkJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCIgdHlwZT0icHJlIj4KKwkJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpNT0FfT1JCSVRTX0ZpbGVCYXNlZCIvPgorCQkJPC9jb25kaXRpb25zPgorCQkJCisJCQk8dGFzayBpZC1yZWY9InVybjpucHA6TW9hSWFzaU1hcCIvPgorCQkJPHRhc2sgaWQtcmVmPSJ1cm46bnBwOk1vYU1oc01hcCIvPgorCQkJPHRhc2sgaWQtcmVmPSJ1cm46bnBwOk1vYUFtc3VhTWFwIi8+CisJCQkKKwkJCTwhLS1jb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCIgdHlwZT0icG9zdCI+ICAKKwkJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpWZXJpZnlNYXBzRXhpc3QiIG5hbWU9IlZlcmlmeU1hcHNFeGlzdCIvPgkJCQkKKwkJCTwvY29uZGl0aW9ucy0tPgorCisJCTwvcGFyYWxsZWw+CisJCQorCQk8d29ya2Zsb3cgaWQtcmVmPSJNU1BJX0wxX1dvcmtmbG93Ii8+CisJCQorCTwvc2VxdWVudGlhbD4KKworCisJPCEtLSBDT05ESVRJT05TIC0tPgorCTxjb25kaXRpb24gaWQ9InVybjpucHA6TU9BX0lBU0lfTDFDX0RhaWx5IiBuYW1lPSJNT0FfSUFTSV9MMUNfRGFpbHkiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTU9BX0lBU0lfTDFDIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXhwZWN0ZWROdW1PZkZpbGVzIiB2YWx1ZT0iNDgwIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXBzaWxvbkluTWlsbGlzIiB2YWx1ZT0iMzAwMDAiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9TcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0lBU0lfTDFfUXVlcnkiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0wxX0Zvcm1hdHRlZE1ldGFkYXRhIHwgJEZpbGVMb2NhdGlvbi8kRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0wxX0ZpbGVuYW1lcyB8ICRGaWxlbmFtZX0iLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iUXVldWVOYW1lIiB2YWx1ZT0iamF2YSIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC9jb25kaXRpb24+CQkJCisJPGNvbmRpdGlvbiBpZD0idXJuOm5wcDpNT0FfTUhTX0wxQl9EYWlseSIgbmFtZT0iTU9BX01IU19MMUJfRGFpbHkiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTU9BX01IU19MMUIiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxNSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0Vwc2lsb25Jbk1pbGxpcyIgdmFsdWU9IjYwMDAwIi8+IDwhLS0ybWlucy0tPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1NxbFF1ZXJ5S2V5IiB2YWx1ZT0iUnVudGltZS9Db25kaXRpb24vTUhTX0wxX1F1ZXJ5Ii8+IAorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Jlc3VsdEtleUZvcm1hdHMiIHZhbHVlPSJ7UnVudGltZS9Db25kaXRpb24vTUhTX0wxX0Zvcm1hdHRlZE1ldGFkYXRhIHwgJEZpbGVMb2NhdGlvbi8kRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9NSFNfTDFfRmlsZW5hbWVzIHwgJEZpbGVuYW1lfSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJqYXZhIi8+CisJCTwvY29uZmlndXJhdGlvbj4KKwk8L2NvbmRpdGlvbj4JCQorCTxjb25kaXRpb24gaWQ9InVybjpucHA6TU9BX0FNU1VBX0wxQl9EYWlseSIgbmFtZT0iTU9BX01IU19MMUJfRGFpbHkiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTU9BX0FNU1VBX0wxQiIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0V4cGVjdGVkTnVtT2ZGaWxlcyIgdmFsdWU9IjE1Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXBzaWxvbkluTWlsbGlzIiB2YWx1ZT0iNjAwMDAiLz4gPCEtLTJtaW5zLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9MMV9RdWVyeSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9SZXN1bHRLZXlGb3JtYXRzIiB2YWx1ZT0ie1J1bnRpbWUvQ29uZGl0aW9uL0FNU1VBX0wxX0Zvcm1hdHRlZE1ldGFkYXRhIHwgJEZpbGVMb2NhdGlvbi8kRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9MMV9GaWxlbmFtZXMgfCAkRmlsZW5hbWV9Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0iUXVldWVOYW1lIiB2YWx1ZT0iamF2YSIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC9jb25kaXRpb24+CQorCTxjb25kaXRpb24gaWQ9InVybjpucHA6TU9BX09SQklUU19GaWxlQmFzZWQiIG5hbWU9Ik1PQV9PUkJJVFNfRmlsZUJhc2VkIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUHJvZHVjdFR5cGVOYW1lcyIgdmFsdWU9Ik1PQV9PUkJJVFMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9PcmJpdHNRdWVyeSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9SZXN1bHRLZXlGb3JtYXRzIiB2YWx1ZT0ie1J1bnRpbWUvQ29uZGl0aW9uL09yYml0c0Zvcm1hdHRlZE1ldGFkYXRhIHwgJEZpbGVMb2NhdGlvbi8kRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9PcmJpdHNGaWxlbmFtZXMgfCAkRmlsZW5hbWV9Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0iUXVldWVOYW1lIiB2YWx1ZT0iamF2YSIvPgkJCisJCTwvY29uZmlndXJhdGlvbj4JCisJPC9jb25kaXRpb24+CQorCTxjb25kaXRpb24gaWQ9InVybjpucHA6TU9BX0lBU0lfUE9MWV9GaWxlQmFzZWQiIG5hbWU9Ik1PQV9JQVNJX1BPTFlfRmlsZUJhc2VkIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUHJvZHVjdFR5cGVOYW1lcyIgdmFsdWU9Ik1PQV9JQVNJX1BPTFkiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0dQb2x5UXVlcnkiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0dQb2x5Rm9ybWF0dGVkTWV0YWRhdGEgfCAkRmlsZUxvY2F0aW9uLyRGaWxlbmFtZX0se1J1bnRpbWUvQ29uZGl0aW9uL0lBU0lfR1BvbHlGaWxlbmFtZXMgfCAkRmlsZW5hbWV9Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0iUXVldWVOYW1lIiB2YWx1ZT0iamF2YSIvPgkKKwkJPC9jb25maWd1cmF0aW9uPgkKKwk8L2NvbmRpdGlvbj4JCQkKKwk8Y29uZGl0aW9uIGlkPSJ1cm46bnBwOk1PQV9NSFNfUE9MWV9GaWxlQmFzZWQiIG5hbWU9Ik1PQV9NSFNfUE9MWV9GaWxlQmFzZWQiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTU9BX01IU19QT0xZIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXhwZWN0ZWROdW1PZkZpbGVzIiB2YWx1ZT0iMSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1NxbFF1ZXJ5S2V5IiB2YWx1ZT0iUnVudGltZS9Db25kaXRpb24vTUhTX0dQb2x5UXVlcnkiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9NSFNfR1BvbHlGb3JtYXR0ZWRNZXRhZGF0YSB8ICRGaWxlTG9jYXRpb24vJEZpbGVuYW1lfSx7UnVudGltZS9Db25kaXRpb24vTUhTX0dQb2x5RmlsZW5hbWVzIHwgJEZpbGVuYW1lfSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImphdmEiLz4JCisJCTwvY29uZmlndXJhdGlvbj4JCisJPC9jb25kaXRpb24+CQkJCisJPGNvbmRpdGlvbiBpZD0idXJuOm5wcDpNT0FfQU1TVUFfUE9MWV9GaWxlQmFzZWQiIG5hbWU9Ik1PQV9BTVNVQV9QT0xZX0ZpbGVCYXNlZCIgY2xhc3M9Imdvdi5uYXNhLmpwbC5vb2R0LmNhcy5wZ2UuY29uZGl0aW9uLlBHRVRhc2tXb3JrZmxvd0NvbmRpdGlvbiI+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Byb2R1Y3RUeXBlTmFtZXMiIHZhbHVlPSJNT0FfQU1TVUFfUE9MWSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0V4cGVjdGVkTnVtT2ZGaWxlcyIgdmFsdWU9IjEiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9TcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0FNU1VBX0dQb2x5UXVlcnkiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9HUG9seUZvcm1hdHRlZE1ldGFkYXRhIHwgJEZpbGVMb2NhdGlvbi8kRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9HUG9seUZpbGVuYW1lcyB8ICRGaWxlbmFtZX0iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJqYXZhIi8+CisJCTwvY29uZmlndXJhdGlvbj4JCisJPC9jb25kaXRpb24+CQorCTwhLS1jb25kaXRpb24gaWQ9InVybjpucHA6VmVyaWZ5TWFwc0V4aXN0IiBuYW1lPSJWZXJpZnlNYXBzRXhpc3QiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iLy0tPgkJCQkKKwkKKwkKKwk8IS0tIFRBU0tTIC0tPgorCTx0YXNrIGlkPSJ1cm46bnBwOk9yYml0cyIgbmFtZT0iTW9hT3JiaXRzIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNb2FPcmJpdHMiIC8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hT3JiaXRzL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FPcmJpdHMueG1sIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vTDFGb3JtYXR0ZWRNZXRhZGF0YSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0wxX0Zvcm1hdHRlZE1ldGFkYXRhXSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxRmlsZW5hbWVzIiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL0lBU0lfTDFfRmlsZW5hbWVzXSIvPgorCQkJPHByb3BlcnR5IG5hbWU9Ikluc3RydW1lbnQiIHZhbHVlPSJNZXRPcFMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FJYXNpR1BvbHlnb24iIG5hbWU9Ik1vYUlhc2lHUG9seWdvbiIgY2xhc3M9Imdvdi5uYXNhLmpwbC5vb2R0LmNhcy5wZ2UuU3RkUEdFVGFza0luc3RhbmNlIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9OYW1lIiB2YWx1ZT0iTW9hSWFzaUdQb2x5Z29uIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hSWFzaUdQb2x5Z29uL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FHUG9seWdvbi54bWwiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9MMUZvcm1hdHRlZE1ldGFkYXRhIiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL0lBU0lfTDFfRm9ybWF0dGVkTWV0YWRhdGFdIi8+CQkJCisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vTDFGaWxlbmFtZXMiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vSUFTSV9MMV9GaWxlbmFtZXNdIi8+CQkJCisJCQk8cHJvcGVydHkgbmFtZT0iSW5zdHJ1bWVudCIgdmFsdWU9IklBU0kiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FNaHNHUG9seWdvbiIgbmFtZT0iTW9hTWhzR1BvbHlnb24iIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLlN0ZFBHRVRhc2tJbnN0YW5jZSI+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svTmFtZSIgdmFsdWU9Ik1vYUFtc3VhR1BvbHlnb24iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmZpZ0ZpbGVQYXRoIiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FBbXN1YUdQb2x5Z29uL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FHUG9seWdvbi54bWwiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9MMUZvcm1hdHRlZE1ldGFkYXRhIiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL0FNU1VBX0wxX0Zvcm1hdHRlZE1ldGFkYXRhXSIvPgkJCQkJCQorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxRmlsZW5hbWVzIiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL0FNU1VBX0wxX0ZpbGVuYW1lc10iLz4JCQkJCQkKKwkJCTxwcm9wZXJ0eSBuYW1lPSJJbnN0cnVtZW50IiB2YWx1ZT0iQU1TVUEiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FBbXN1YUdQb2x5Z29uIiBuYW1lPSJNb2FBbXN1YUdQb2x5Z29uIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNb2FNaHNHUG9seWdvbiIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZmlnRmlsZVBhdGgiIHZhbHVlPSJbU1BTU19DT05GSUdfSE9NRV0vW01vYU1oc0dQb2x5Z29uL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FHUG9seWdvbi54bWwiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9MMUZvcm1hdHRlZE1ldGFkYXRhIiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL01IU19MMV9Gb3JtYXR0ZWRNZXRhZGF0YV0iLz4JCQkJCQkJCQkKKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9MMUZpbGVuYW1lcyIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9NSFNfTDFfRmlsZW5hbWVzXSIvPgkJCQkJCQkJCQorCQkJPHByb3BlcnR5IG5hbWU9Ikluc3RydW1lbnQiIHZhbHVlPSJNSFMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FJYXNpTWFwIiBuYW1lPSJNb2FJYXNpTWFwIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiIHR5cGU9InByZSI+CisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpNT0FfSUFTSV9QT0xZX0ZpbGVCYXNlZCIvPgkJCQorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svTmFtZSIgdmFsdWU9Ik1vYUlhc2lNYXAiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmZpZ0ZpbGVQYXRoIiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FJYXNpTWFwL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FNYXAueG1sIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vR1BvbHlGb3JtYXR0ZWRNZXRhZGF0YSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0dQb2x5Rm9ybWF0dGVkTWV0YWRhdGFdIi8+CQkJCQkJCQkJCisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vR1BvbHlGaWxlbmFtZXMiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vSUFTSV9HUG9seUZpbGVuYW1lc10iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJJbnN0cnVtZW50IiB2YWx1ZT0iSUFTSSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImlkbCIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46bnBwOk1vYU1oc01hcCIgbmFtZT0iTW9hTWhzTWFwIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiIHR5cGU9InByZSI+CisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpNT0FfTUhTX1BPTFlfRmlsZUJhc2VkIi8+CQkJCisJCTwvY29uZGl0aW9ucz4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9OYW1lIiB2YWx1ZT0iTW9hTWhzTWFwIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hTWhzTWFwL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FNYXAueG1sIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vR1BvbHlGb3JtYXR0ZWRNZXRhZGF0YSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9NSFNfR1BvbHlGb3JtYXR0ZWRNZXRhZGF0YV0iLz4JCQkJCQkJCQkKKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9HUG9seUZpbGVuYW1lcyIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9NSFNfR1BvbHlGaWxlbmFtZXNdIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iSW5zdHJ1bWVudCIgdmFsdWU9Ik1IUyIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImlkbCIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46bnBwOk1vYUFtc3VhTWFwIiBuYW1lPSJNb2FBbXN1YU1hcCIgY2xhc3M9Imdvdi5uYXNhLmpwbC5vb2R0LmNhcy5wZ2UuU3RkUEdFVGFza0luc3RhbmNlIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiB0eXBlPSJwcmUiPgorCQkJPGNvbmRpdGlvbiBpZC1yZWY9InVybjpucHA6TU9BX0FNU1VBX1BPTFlfRmlsZUJhc2VkIi8+CQkJCisJCTwvY29uZGl0aW9ucz4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9OYW1lIiB2YWx1ZT0iTW9hQW1zdWFNYXAiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmZpZ0ZpbGVQYXRoIiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FBbXN1YU1hcC9TUFNTX1ZlcnNpb25dL2NvbmZpZy9QZ2VDb25maWdfTW9hTWFwLnhtbCIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0dQb2x5Rm9ybWF0dGVkTWV0YWRhdGEiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vQU1TVUFfR1BvbHlGb3JtYXR0ZWRNZXRhZGF0YV0iLz4JCQkJCQkJCQkKKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9HUG9seUZpbGVuYW1lcyIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9HUG9seUZpbGVuYW1lc10iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJJbnN0cnVtZW50IiB2YWx1ZT0iQU1TVUEiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwkKKzwvY2FzOndvcmtmbG93cz4KZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21zcGktd29ya2Zsb3cueG1sIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbXNwaS13b3JrZmxvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzMTNmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21zcGktd29ya2Zsb3cueG1sCkBAIC0wLDAgKzEsMTI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzx3b3JrZmxvd3M+IAorICAgIAorICAgIDxzZXF1ZW50aWFsIGlkPSJNU1BJX0wxX1dvcmtmbG93IiBuYW1lPSJNU1BJIEwxIFdvcmtmbG93Ij4KKyAgICAgICAgCisgICAgICAgIDxjb25maWd1cmF0aW9uIGV4dGVuZHM9Imdsb2JhbCx3b3JrZmxvd3MiLz4KKyAgICAgICAgCisgICAgICAgIDx0YXNrIGlkLXJlZj0iTVNQSV9MMUExX1Rhc2siLz4KKyAgICAgICAgPHRhc2sgaWQtcmVmPSJNU1BJX0wxQTJfVGFzayIvPgorICAgICAgICA8dGFzayBpZC1yZWY9Ik1TUElfTDFCMV9UYXNrIi8+CisgICAgICAgIDx0YXNrIGlkLXJlZj0iTVNQSV9MMUIyX1Rhc2siLz4KKyAgICAgICAgCisgICAgPC9zZXF1ZW50aWFsPgorICAgIAorICAgIDwhLS0gQ09ORElUSU9OUyAtLT4KKyAgICA8Y29uZGl0aW9uIGlkPSJNU1BJX0wwX0NvbmRpdGlvbiIgbmFtZT0iTVNQSSBMMCBDb25kaXRpb24iIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorICAgICAgICA8Y29uZmlndXJhdGlvbiBleHRlbmRzPSJnbG9iYWwsY29uZGl0aW9ucywxLWZpbGUiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Byb2R1Y3RUeXBlTmFtZXMiIHZhbHVlPSJNU1BJX0wwIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9MMC9Gb3JtYXR0ZWQgfCAkRmlsZUxvY2F0aW9uLyRGaWxlbmFtZX0se1J1bnRpbWUvQ29uZGl0aW9uL0wwL0ZpbGVuYW1lcyB8ICRGaWxlbmFtZX0se1J1bnRpbWUvQ29uZGl0aW9uL0wwL1N0YXJ0RGF0ZVRpbWUgfCAkU3RhcnREYXRlVGltZX0se1J1bnRpbWUvQ29uZGl0aW9uL0wwL0VuZERhdAorICAgICAgICAgICAgICAgIGVUaW1lIHwgJEVuZERhdGVUaW1lfSx7UnVudGltZS9Db25kaXRpb24vTDAvTGF0aXR1ZGUgfCAkTGF0aXR1ZGV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMC9Mb25naXR1ZGUgfCAkTG9uZ2l0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDAvQXppbXV0aCB8ICRBemltdXRofSx7UnVudGltZS9Db25kaXRpb24vTDAvRWxldmF0aW9uIHwgJEVsZXZhdGlvbn0iLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9TcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wwX1F1ZXJ5Ii8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIGlkPSJNU1BJX0wxQTFfQ29uZGl0aW9uIiBuYW1lPSJNU1BJIEwxQTEgQ29uZGl0aW9uIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24gZXh0ZW5kcz0iZ2xvYmFsLGNvbmRpdGlvbnMsMS1maWxlIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTVNQSV9MMUExIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9MMUExL0Zvcm1hdHRlZCB8ICRGaWxlTG9jYXRpb24vJEZpbGVuYW1lfSx7UnVudGltZS9Db25kaXRpb24vTDFBMS9GaWxlbmFtZXMgfCAkRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUExL1N0YXJ0RGF0ZVRpbWUgfCAkU3RhcnREYXRlVGltZX0se1J1bnRpbWUvQ29uZGl0aW9uL0wxQQorICAgICAgICAgICAgICAgIDEvRW5kRGF0ZVRpbWUgfCAkRW5kRGF0ZVRpbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUExL0xhdGl0dWRlIHwgJExhdGl0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDFBMS9Mb25naXR1ZGUgfCAkTG9uZ2l0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDFBMS9BemltdXRoIHwgJEF6aW11dGh9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUExL0VsZXZhdGlvbiB8ICRFbGV2YXRpb259Ii8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9MMUExX1F1ZXJ5Ii8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIGlkPSJNU1BJX0wxQTJfQ29uZGl0aW9uIiBuYW1lPSJNU1BJIEwxQTIgQ29uZGl0aW9uIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iTVNQSV9MMUEyX0NvbmRpdGlvbiIgZXh0ZW5kcz0iZ2xvYmFsLGNvbmRpdGlvbnMsMS1maWxlIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTVNQSV9MMUEyIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9MMUEyL0Zvcm1hdHRlZCB8ICRGaWxlTG9jYXRpb24vJEZpbGVuYW1lfSx7UnVudGltZS9Db25kaXRpb24vTDFBMi9GaWxlbmFtZXMgfCAkRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUEyL1N0YXJ0RGF0ZVRpbWUgfCAkU3RhcnREYXRlVGltZX0se1J1bnRpbWUvQ29uZGl0aW9uL0wxQQorICAgICAgICAgICAgICAgIDIvRW5kRGF0ZVRpbWUgfCAkRW5kRGF0ZVRpbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUEyL0xhdGl0dWRlIHwgJExhdGl0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDFBMi9Mb25naXR1ZGUgfCAkTG9uZ2l0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDFBMi9BemltdXRoIHwgJEF6aW11dGh9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUEyL0VsZXZhdGlvbiB8ICRFbGV2YXRpb259Ii8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9MMUEyX1F1ZXJ5Ii8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIGlkPSJNU1BJX0wxQjFfQ29uZGl0aW9uIiBuYW1lPSJNU1BJIEwxQjEgQ29uZGl0aW9uIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24gZXh0ZW5kcz0iZ2xvYmFsLGNvbmRpdGlvbnMsMS1maWxlIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTVNQSV9MMUIxIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUmVzdWx0S2V5Rm9ybWF0cyIgdmFsdWU9IntSdW50aW1lL0NvbmRpdGlvbi9MMUIxL0Zvcm1hdHRlZCB8ICRGaWxlTG9jYXRpb24vJEZpbGVuYW1lfSx7UnVudGltZS9Db25kaXRpb24vTDFCMS9GaWxlbmFtZXMgfCAkRmlsZW5hbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUIxL1N0YXJ0RGF0ZVRpbWUgfCAkU3RhcnREYXRlVGltZX0se1J1bnRpbWUvQ29uZGl0aW9uL0wxQgorICAgICAgICAgICAgICAgIDEvRW5kRGF0ZVRpbWUgfCAkRW5kRGF0ZVRpbWV9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUIxL0xhdGl0dWRlIHwgJExhdGl0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDFCMS9Mb25naXR1ZGUgfCAkTG9uZ2l0dWRlfSx7UnVudGltZS9Db25kaXRpb24vTDFCMS9BemltdXRoIHwgJEF6aW11dGh9LHtSdW50aW1lL0NvbmRpdGlvbi9MMUIxL0VsZXZhdGlvbiB8ICRFbGV2YXRpb259LHtSdW50aW1lL0NvbmRpdGlvbi9MMUIxL3JlZl9yb3cgfCAzMn0iCisgICAgICAgICAgICAvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1NxbFF1ZXJ5S2V5IiB2YWx1ZT0iUnVudGltZS9Db25kaXRpb24vTDFCMV9RdWVyeSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBpZD0iTVNQSV9MMUIxX0RpYWdfQ29uZGl0aW9uIiBuYW1lPSJNU1BJIEwxQjEgRGlhZyBDb25kaXRpb24iIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorICAgICAgICA8Y29uZmlndXJhdGlvbiBleHRlbmRzPSJnbG9iYWwsY29uZGl0aW9ucywxLWZpbGUiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Byb2R1Y3RUeXBlTmFtZXMiIHZhbHVlPSJNU1BJX0wxQjFfRGlhZyIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Jlc3VsdEtleUZvcm1hdHMiIHZhbHVlPSJ7UnVudGltZS9Db25kaXRpb24vTDFCMV9EaWFnL0Zvcm1hdHRlZCB8ICRGaWxlTG9jYXRpb24vJEZpbGVuYW1lfSx7UnVudGltZS9Db25kaXRpb24vTDFCMV9EaWFnL0ZpbGVuYW1lcyB8ICRGaWxlbmFtZX0iLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9TcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxQjFfRGlhZ19RdWVyeSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPC9jb25kaXRpb24+CisgICAgCisgICAgPCEtLSBUQVNLUyAtLT4KKyAgICA8dGFzayBpZD0iTVNQSV9MMUExX1Rhc2siIG5hbWU9Ik1TUEkgTDFBMSBUYXNrIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorICAgICAgICA8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiIHR5cGU9InByZSI+CisgICAgICAgICAgICA8Y29uZGl0aW9uIGlkLXJlZj0iTVNQSV9MMF9Db25kaXRpb24iLz4KKyAgICAgICAgPC9jb25kaXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNU1BJX0wxQTFfVGFzayIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svRmlsZUJhc2VkQ29uZmlnL1N0YWdlQ29uZmlnRmlsZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0ZpbGVCYXNlZENvbmZpZy9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltQQ1NfSE9NRV0vY29yZS9wZ2UvcG9saWN5L21zcGkvUGdlQ29uZmlnX01TUElfTDEueG1sIiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTVNQSS9MMVR5cGUiIHZhbHVlPSJMMUExIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTVNQSS9MMUlucHV0VHlwZSIgdmFsdWU9IkwwIi8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8L3Rhc2s+CisgICAgPHRhc2sgaWQ9Ik1TUElfTDFBMl9UYXNrIiBuYW1lPSJNU1BJIEwxQTIgVGFzayIgY2xhc3M9Imdvdi5uYXNhLmpwbC5vb2R0LmNhcy5wZ2UuU3RkUEdFVGFza0luc3RhbmNlIj4KKyAgICAgICAgPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiB0eXBlPSJwcmUiPgorICAgICAgICAgICAgPGNvbmRpdGlvbiBpZC1yZWY9Ik1TUElfTDFBMV9Db25kaXRpb24iLz4KKyAgICAgICAgPC9jb25kaXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNU1BJX0wxQTJfVGFzayIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svRmlsZUJhc2VkQ29uZmlnL1N0YWdlQ29uZmlnRmlsZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0ZpbGVCYXNlZENvbmZpZy9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltQQ1NfSE9NRV0vY29yZS9wZ2UvcG9saWN5L21zcGkvUGdlQ29uZmlnX01TUElfTDEueG1sIiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTVNQSS9MMVR5cGUiIHZhbHVlPSJMMUEyIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTVNQSS9MMUlucHV0VHlwZSIgdmFsdWU9IkwxQTEiLz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDwvdGFzaz4KKyAgICA8dGFzayBpZD0iTVNQSV9MMUIxX1Rhc2siIG5hbWU9Ik1TUEkgTDFCMSBUYXNrIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorICAgICAgICA8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiIHR5cGU9InByZSI+CisgICAgICAgICAgICA8Y29uZGl0aW9uIGlkLXJlZj0iTVNQSV9MMUEyX0NvbmRpdGlvbiIvPgorICAgICAgICA8L2NvbmRpdGlvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svTmFtZSIgdmFsdWU9Ik1TUElfTDFCMV9UYXNrIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9GaWxlQmFzZWRDb25maWcvU3RhZ2VDb25maWdGaWxlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svRmlsZUJhc2VkQ29uZmlnL0NvbmZpZ0ZpbGVQYXRoIiB2YWx1ZT0iW1BDU19IT01FXS9jb3JlL3BnZS9wb2xpY3kvbXNwaS9QZ2VDb25maWdfTVNQSV9MMS54bWwiIGVudlJlcGxhY2U9InRydWUiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJNU1BJL0wxVHlwZSIgdmFsdWU9IkwxQjEiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJNU1BJL0wxSW5wdXRUeXBlIiB2YWx1ZT0iTDFBMiIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPC90YXNrPgorICAgIDx0YXNrIGlkPSJNU1BJX0wxQjJfVGFzayIgbmFtZT0iTVNQSSBMMUIyIFRhc2siIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMucGdlLlN0ZFBHRVRhc2tJbnN0YW5jZSI+CisgICAgICAgIDxjb25kaXRpb25zIGV4ZWN1dGlvbj0icGFyYWxsZWwiIHR5cGU9InByZSI+CisgICAgICAgICAgICA8Y29uZGl0aW9uIGlkLXJlZj0iTVNQSV9MMUIxX0NvbmRpdGlvbiIvPgorICAgICAgICAgICAgPGNvbmRpdGlvbiBpZC1yZWY9Ik1TUElfTDFCMV9EaWFnX0NvbmRpdGlvbiIvPgorICAgICAgICA8L2NvbmRpdGlvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svTmFtZSIgdmFsdWU9Ik1TUElfTDFCMl9UYXNrIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9GaWxlQmFzZWRDb25maWcvU3RhZ2VDb25maWdGaWxlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svRmlsZUJhc2VkQ29uZmlnL0NvbmZpZ0ZpbGVQYXRoIiB2YWx1ZT0iW1BDU19IT01FXS9jb3JlL3BnZS9wb2xpY3kvbXNwaS9QZ2VDb25maWdfTVNQSV9MMS54bWwiIGVudlJlcGxhY2U9InRydWUiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJNU1BJL0wxVHlwZSIgdmFsdWU9IkwxQjIiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJNU1BJL0wxSW5wdXRUeXBlIiB2YWx1ZT0iTDFCMSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPC90YXNrPgorICAgIAorPC93b3JrZmxvd3M+CmRpZmYgLS1naXQgYS8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9zaGFyZWQtcHJvcGVydGllcy54bWwgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9zaGFyZWQtcHJvcGVydGllcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhZTczMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3NoYXJlZC1wcm9wZXJ0aWVzLnhtbApAQCAtMCwwICsxLDg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzx3b3JrZmxvd3M+CisgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iZ2xvYmFsIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svUXVlcnkvRmlsZU1hbmFnZXJVcmwiIHZhbHVlPSJbRklMRU1HUl9VUkxdIiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJCbG9ja1RpbWVFbGFwc2UiIHZhbHVlPSIxMCIvPiA8IS0tMTBtaW5zLS0+CisgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDxjb25maWd1cmF0aW9uIG5hbWU9IndvcmtmbG93cyI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9GaWxlTWFuYWdlclVybCIgdmFsdWU9IltGSUxFTUdSX1VSTF0iIGVudlJlcGxhY2U9InRydWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svSW5nZXN0L0NsaWVudFRyYW5zZmVyU2VydmljZUZhY3RvcnkiIHZhbHVlPSJnb3YubmFzYS5qcGwub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9NZXRGaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iY2FzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9DcmF3bGVyQ3Jhd2xGb3JEaXJzIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svSW5nZXN0L0NyYXdsZXJSZWN1ciIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDwhLS1wcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9BY3Rpb25zSWRzIiB2YWx1ZT0iUm1EYXRhRmlsZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svSW5nZXN0L0FjdGlvblJlcG9GaWxlIiB2YWx1ZT0iZmlsZTpbUENTX0hPTUVdL2Nhcy9wZ2UvcG9saWN5L2FjdGlvbi1iZWFucy54bWwiIGVudlJlcGxhY2U9InRydWUiLy0tPgorICAgICAgICAKKyAgICAgICAgPCEtLSByZXNvdXJjZSBydW5uZXIgcHJvcGVydGllcyAtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImV4ZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iTG9hZCIgdmFsdWU9IjIiLz4KKyAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iY29uZGl0aW9ucyI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9UaW1lb3V0IiB2YWx1ZT0iMjg4MDAiLz4gPCEtLThocnMtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1N0YXJ0RGF0ZVRpbWVLZXkiIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FbmREYXRlVGltZUtleSIgdmFsdWU9IkVuZERhdGVUaW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Tb3J0QnlLZXkiIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9WZXJzaW9uaW5nS2V5IiB2YWx1ZT0iUHJvZHVjdGlvbkRhdGVUaW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9NaW5OdW1PZkZpbGVzIiB2YWx1ZT0iMSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vTWF4R2FwL1NpemUiIHZhbHVlPSItMSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXBzaWxvbkluTWlsbGlzIiB2YWx1ZT0iMCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRmlsdGVyQWxnb3JDbGFzcyIgdmFsdWU9Imdvdi5uYXNhLmpwbC5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuZmlsdGVyLldlaWdodGVkSGFzaEZpbHRlckFsZ29yIi8+CisgICAgICAgIAorICAgICAgICA8IS0tIHJlc291cmNlIHJ1bm5lciBwcm9wZXJ0aWVzIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUXVldWVOYW1lIiB2YWx1ZT0iY29uZHMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkxvYWQiIHZhbHVlPSIxIi8+CisgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDxjb25maWd1cmF0aW9uIG5hbWU9ImFpcnMiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vU3RhcnREYXRlVGltZUtleSIgdmFsdWU9IlVUQ19zdGFydF90aW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FbmREYXRlVGltZUtleSIgdmFsdWU9IlVUQ19zdG9wX3RpbWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1NvcnRCeUtleSIgdmFsdWU9IlVUQ19zdGFydF90aW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9WZXJzaW9uaW5nS2V5IiB2YWx1ZT0iUHJvZHVjdGlvbkRhdGV0aW1lIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIyNDAiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0Vwc2lsb25Jbk1pbGxpcyIgdmFsdWU9IjEwMDAwIi8+IDwhLS0xMHNlY3MtLT4KKyAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iMTQtZmlsZXMiPgorICAgICAgICA8IS0tIGZpbHRlciBwcm9wZXJ0aWVzIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXhwZWN0ZWROdW1PZkZpbGVzIiB2YWx1ZT0iMTQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0Vwc2lsb25Jbk1pbGxpcyIgdmFsdWU9IjEwMDAwMDAiLz4gPCEtLTEwMDBzZWNzLS0+CisgICAgICAgIAorICAgICAgICA8IS0tIGdhcCBhbmFseXNpcyBwcm9wZXJ0aWVzIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vTWF4R2FwL1NpemUiIHZhbHVlPSI2MDAwMDAwIi8+IDwhLS0xMDBtaW5zLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9NYXhHYXAvU3RhcnREYXRlVGltZSIgdmFsdWU9IltOb21pbmFsRGF0ZV1UMDA6MDA6MDAuMDAwWiIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vTWF4R2FwL0VuZERhdGVUaW1lIiB2YWx1ZT0iW05vbWluYWxEYXRlXVQyMzo1OTo1OS45OTlaIi8+CisgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDxjb25maWd1cmF0aW9uIG5hbWU9IjQ4MC1maWxlcyI+CisgICAgICAgIDwhLS0gZmlsdGVyIHByb3BlcnRpZXMgLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSI0ODAiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0Vwc2lsb25Jbk1pbGxpcyIgdmFsdWU9IjMwMDAwIi8+IDwhLS0zMHNlY3MtLT4KKyAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iMS1maWxlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0ZpbHRlckFsZ29yQ2xhc3MiIHZhbHVlPSJnb3YubmFzYS5qcGwub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5UYWtlRWFybGllc3RFdmVudEZpbHRlckFsZ29yIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDxjb25maWd1cmF0aW9uIG5hbWU9ImNvbmNhdC1maWxlcyI+CisgICAgICAgIDwhLS0gZmlsdGVyIHByb3BlcnRpZXMgLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIyOCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXBzaWxvbkluTWlsbGlzIiB2YWx1ZT0iMjE2MDAwMDAiLz4gPCEtLTZob3Vycy0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vTWluTnVtT2ZGaWxlcyIgdmFsdWU9IjIiLz4KKyAgICA8L2NvbmZpZ3VyYXRpb24+Cis8L3dvcmtmbG93cz4KKwpkaWZmIC0tZ2l0IGEvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdGVzdC54bWwgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmJmMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdGVzdC54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOndvcmtmbG93cyAKKwl4bWxucz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzIuMC9jYXMiCisJeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMi4wL2NhcyIKKwl4bWxuczpwPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMi4wL2Nhcy9wcm9wZXJ0eSI+CisJCisJPHdvcmtmbG93IGlkPSJUZXN0V29ya2Zsb3ciIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCI+CisJCTx0YXNrIGlkLXJlZj0iT3JiaXQiLz4KKwkJPHdvcmtmbG93IGlkPSJ0ZXN0ZXIiIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCI+CisJCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InBhcmFsbGVsIj4KKwkJCQk8Y29uZGl0aW9uIGlkLXJlZj0iY29uZDEiLz4KKwkJCQk8Y29uZGl0aW9uIGlkLXJlZj0iY29uZDIiLz4KKwkJCTwvY29uZGl0aW9ucz4KKwkJCQorCQkJPHBhcmFsbGVsPgorCQkJCTx3b3JrZmxvdyBpZD0iTDAiIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCI+CisJCQkJCTx0YXNrIGlkLXJlZj0iTDBhIi8+CisJCQkJCTx0YXNrIGlkLXJlZj0iTDBiIi8+CisJCQkJCTx0YXNrIGlkLXJlZj0iTDBjIi8+CisJCQkJCTx0YXNrIGlkLXJlZj0iTDBkIi8+CisJCQkJPC93b3JrZmxvdz4gCisJCQkJPHdvcmtmbG93IGlkLXJlZj0iTDFhIi8+CisJCQk8L3BhcmFsbGVsPgorCQkJPHNlcXVlbnRpYWw+CisJCQkJPHRhc2sgaWQtcmVmPSJBbmUiLz4KKwkJCQk8cGFyYWxsZWw+CisJCQkJCTx3b3JrZmxvdyBpZC1yZWY9Ikdlb0NhbCIvPgorCQkJCQk8d29ya2Zsb3cgaWQtcmVmPSJHZW8iLz4gICAgICAgICAgICAgCisJCQkJPC9wYXJhbGxlbD4KKwkJCTwvc2VxdWVudGlhbD4KKwkJCQorCQkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIj4KKwkJCQk8Y29uZGl0aW9uIGlkLXJlZj0iY29uZDMiLz4KKwkJCTwvY29uZGl0aW9ucz4KKwkJPC93b3JrZmxvdz4KKwkJPHdvcmtmbG93IGlkLXJlZj0iTVNQSV9MMV9Xb3JrZmxvdyIvPgorCTwvd29ya2Zsb3c+CisJCisJPHRhc2sgaWQ9Ik9yYml0IiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlLlZhbGlkYXRlTWV0YWRhdGFJbnN0YW5jZSIvPgorCTx0YXNrIGlkPSJMMGEiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksY29uZDFfa2V5LGNvbmQyX2tleSIvPgorCTx0YXNrIGlkPSJMMGIiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksY29uZDFfa2V5LGNvbmQyX2tleSxMMGFfa2V5Ii8+CisJPHRhc2sgaWQ9IkwwYyIgY2xhc3M9Imdvdi5uYXNhLmpwbC5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZS5WYWxpZGF0ZU1ldGFkYXRhSW5zdGFuY2UiIHA6dmFsaWRhdGVLZXk9Ik9yYml0X2tleSxjb25kMV9rZXksY29uZDJfa2V5LEwwYV9rZXksTDBiX2tleSIvPgorCTx0YXNrIGlkPSJMMGQiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksY29uZDFfa2V5LGNvbmQyX2tleSxMMGFfa2V5LEwwYl9rZXksTDBjX2tleSIvPgorCTx0YXNrIGlkPSJBbmUiIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksY29uZDFfa2V5LGNvbmQyX2tleSxMMGFfa2V5LEwwYl9rZXksTDBjX2tleSxMMGRfa2V5Ii8+CisJCisJPGNvbmRpdGlvbiBpZD0iY29uZDEiIHA6dGltZW91dD0iMjAwIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlLlZhbGlkYXRlTWV0YWRhdGFJbnN0YW5jZSIvPgorCTxjb25kaXRpb24gaWQ9ImNvbmQyIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlLlZhbGlkYXRlTWV0YWRhdGFJbnN0YW5jZSIvPgorCTxjb25kaXRpb24gaWQ9ImNvbmQzIiBjbGFzcz0iZ292Lm5hc2EuanBsLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlLlZhbGlkYXRlTWV0YWRhdGFJbnN0YW5jZSIgcDp2YWxpZGF0ZUtleT0iTDBhX2tleSxMMGJfa2V5LEwwY19rZXksTDBkX2tleSxMMWFUYXNrX2tleSxBbmVfa2V5LEdlb0NhbFRhc2tfa2V5LEdlb1Rhc2tfa2V5LGNvbmQxX2tleSxjb25kMl9rZXkiLz4KKwkKKwk8c2VxdWVudGlhbCBpZD0iTDFhIj4KKwkJPHRhc2sgaWQ9IkwxYVRhc2siIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksY29uZDFfa2V5LGNvbmQyX2tleSIvPgorCTwvc2VxdWVudGlhbD4KKwkKKwk8d29ya2Zsb3cgaWQ9Ikdlb0NhbCIgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIj4KKwkJPHRhc2sgaWQ9Ikdlb0NhbFRhc2siIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksQW5lX2tleSxjb25kMV9rZXksY29uZDJfa2V5LEwwYl9rZXksTDBjX2tleSxMMGRfa2V5Ii8+CisJPC93b3JrZmxvdz4KKwkKKwk8d29ya2Zsb3cgaWQ9IkdlbyIgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIj4KKwkJPHRhc2sgaWQ9Ikdlb1Rhc2siIGNsYXNzPSJnb3YubmFzYS5qcGwub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2UuVmFsaWRhdGVNZXRhZGF0YUluc3RhbmNlIiBwOnZhbGlkYXRlS2V5PSJPcmJpdF9rZXksQW5lX2tleSxjb25kMV9rZXksY29uZDJfa2V5LEwwYl9rZXksTDBjX2tleSxMMGRfa2V5Ii8+CisJPC93b3JrZmxvdz4KKworPC9jYXM6d29ya2Zsb3dzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2N1cnNvci16b29tLnBuZyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2N1cnNvci16b29tLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDdmODc5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvY3Vyc29yLXpvb20ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2RlbGV0ZS1zZWwuanBnIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvZGVsZXRlLXNlbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NGFiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2RlbGV0ZS1zZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2RlbGV0ZS5qcGcgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9pY29ucy9kZWxldGUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9pY29ucy9kZWxldGUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2VkaXQtc2VsLmpwZyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2VkaXQtc2VsLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI2MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvZWRpdC1zZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2VkaXQuanBnIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvZWRpdC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ZDZkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL2VkaXQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL21vdmUtc2VsLmpwZyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL21vdmUtc2VsLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRkY2NlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvbW92ZS1zZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL21vdmUuanBnIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvbW92ZS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2ZTAzZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL21vdmUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20taW4tc2VsLmpwZyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20taW4tc2VsLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDcyZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvem9vbS1pbi1zZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20taW4uanBnIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvem9vbS1pbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxZGVjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20taW4uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20tb3V0LXNlbC5qcGcgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9pY29ucy96b29tLW91dC1zZWwuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjBiMzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2FwcC93ZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9pY29ucy96b29tLW91dC1zZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20tb3V0LmpwZyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2ljb25zL3pvb20tb3V0LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk2YWYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvaWNvbnMvem9vbS1vdXQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcyBiLzAuMTAvYXBwL3dlZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcyNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9hcHAvd2VkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBJTkZPCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEFMTAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWwgPSBBTEwKKyAgICAgICAgCisjIFNldCB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorCisjIGRlZmF1bHQgZmlsZSBvdXRwdXQgaXMgaW4gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIucGF0dGVybiA9IC4uL2xvZ3MvY2FzX3dvcmtmbG93X2d1aSVnLmxvZworamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGltaXQgPSA1MDAwMAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuY291bnQgPSA1CitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5hcHBlbmQgPSB0cnVlCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBzdWJzeXN0ZW1zCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmd1aS5sZXZlbCA9IElORk8KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC8uaHRhY2Nlc3MgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvLmh0YWNjZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTU1N2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvLmh0YWNjZXNzCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBSZXdyaXRlIHJ1bGVzIGZvciBPT0RUIEJhbGFuY2Ugd2ViIGFwcGxpY2F0aW9ucy4gCisjCisjIEVuYWJsZSB0aGUgcmV3cml0ZSBlbmdpbmUKK1Jld3JpdGVFbmdpbmUgT24KKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgZm9yIFJld3JpdGVCYXNlIGV4YWN0bHkgbWF0Y2hlcyB0aGUgCisjIHZhbHVlIGZvciBzaXRlX3Jvb3QgaW4gY29uZmlnLmluaS4gVGhpcyB2YWx1ZSBzaG91bGQgcG9pbnQgdG8gdGhlIAorIyBsb2NhdGlvbiAocmVsYXRpdmUgdG8gdGhlIHNlcnZlcidzIGRvY3VtZW50IHJvb3QpIG9mIHRoZSAKKyMgQmFsYW5jZSB3ZWJhcHAgZGlyZWN0b3J5ICh0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgY29uZmlnLmluaSkuIEZvcgorIyBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gbGl2ZXMgYXQgdGhlIHNlcnZlcidzIGRvY3VtZW50IHJvb3QsIHRoZW4KKyMgUmV3cml0ZUJhc2Ugc2hvdWxkIGJlIHNldCB0byAnLycuIElmLCBvbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGFwcGxpY2F0aW9uCisjIGhhcyBiZWVuIGluc3RhbGxlZCBpbnRvIGEgc3ViZGlyZWN0b3J5ICdmb28nIHVuZGVybmVhdGggdGhlIHNlcnZlcidzIAorIyBkb2N1bWVudCByb290LCBSZXdyaXRlQmFzZSAoYW5kIHNpdGVfcm9vdCBpbiBjb25maWcuaW5pKSBzaG91bGQgYmUgc2V0CisjIHRvICcvZm9vLycKK1Jld3JpdGVCYXNlIC8KKworIyBUaGlzIHNlY3Rpb24gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIHRoZSBCYWxhbmNlIGFwcGxpY2F0aW9uJ3MgZnJvbnQKKyMgY29udHJvbGxlci4gVW5sZXNzIHlvdSBhcmUgbW9kaWZ5aW5nIHRoZSBsb3ctbGV2ZWwgYmVoYXZpb3Igb2YgdGhlIAorIyBCYWxhbmNlIGFwcGxpY2F0aW9uIGZyYW1ld29yaywgdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gbWFrZSBhbnkKKyMgbW9kaWZpY2F0aW9ucyBiZWxvdyB0aGlzIGxpbmUuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFNlbmQgYWxsIG90aGVyIG5vbi1zdGF0aWMgcmVxdWVzdHMgdG8gdGhlIG1haW4gY29udHJvbGxlcgorUmV3cml0ZUNvbmQgJXtSRVFVRVNUX1VSSX0gIS9zdGF0aWMvKC4qKSQKK1Jld3JpdGVDb25kICV7UkVRVUVTVF9VUkl9ICEvc2NyaXB0cy8oLiopJAorUmV3cml0ZUNvbmQgJXtSRVFVRVNUX1VSSX0gIS9nbG9iYWwvKC4qKSQKK1Jld3JpdGVDb25kICV7UkVRVUVTVF9VUkl9ICFpbmRleFwucGhwLy4rJAorUmV3cml0ZVJ1bGUgXiguKykkIC4vaW5kZXhcLnBocC8kMSBbTCxOQ10KKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2V0Yy9za2VsL1JFQURNRS50eHQgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTdiMmZkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2V0Yy9za2VsL1JFQURNRS50eHQKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK09PRFQgQmFsYW5jZSBXZWIgQXBwbGljYXRpb24gUkVBRE1FIEZpbGUKKworVGhlIE9PRFQgQmFsYW5jZSB3ZWIgYXBwbGljYXRpb24gc2tlbGV0b24gaXMgYSBxdWljayB3YXkgdG8gZ2V0IHN0YXJ0ZWQgCitkZXZlbG9waW5nIGEgbmV3IEJhbGFuY2UgYXBwbGljYXRpb24uIEl0IHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgZGlyZWN0b3J5IAorc3RydWN0dXJlIGFuZCBzYW5lIGRlZmF1bHQgY29uZmlndXJhdGlvbiB2YWx1ZXMgdGhhdCB5b3UgY2FuIGN1c3RvbWl6ZSB0byAKK3N1aXQgeW91ciBuZWVkcy4gVGhlc2UgaW5zdHJ1Y3Rpb25zIGFzc3VtZSB5b3UgaGF2ZSB0aGUgbmVjZXNzYXJ5IGFjY2VzcyAKK3RvIGluc3RhbGwgZmlsZXMgaW50byB5b3VyIHdlYiBzZXJ2ZXIncyBkb2N1bWVudCByb290LiBUaGVzZSBpbnN0cnVjdGlvbnMgCit3aWxsIGhlbHAgeW91IGNyZWF0ZSBhbiBhcHBsaWNhdGlvbiBjYWxsZWQgJ215LWFwcGxpY2F0aW9uJyB3aGljaCB3aWxsIGJlIAorYWNjZXNzZWQgZnJvbSBodHRwOi8vbG9jYWxob3N0L215LWFwcGxpY2F0aW9uLiBZb3VyIGVudmlyb25tZW50IGFuZC9vciAKK25lZWRzIG1heSBkaWZmZXIsIHNvIGFkYXB0IHRoZSBmb2xsb3dpbmcgYXMgbmVjZXNzYXJ5LgorCisKKzEuIEluc3RhbGxpbmcgdGhlIE9PRFQgQmFsYW5jZSBQRUFSIHBhY2thZ2UgKCJCYWxhbmNlIGxpYnJhcnkiKQorCitUaGUgQmFsYW5jZSBsaWJyYXJ5IHByb3ZpZGVzIGNvcmUgY2xhc3NzIHRoYXQgbXVzdCBiZSBpbiBwbGFjZSBwcmlvciB0byAKK2RldmVsb3BpbmcgYSBCYWxhbmNlIGFwcGxpY2F0aW9uLiBUaGUgbGlicmFyeSBvbmx5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCAKK29uY2UgcGVyIHN5c3RlbS4gSWYgeW91IGhhdmUgcHJldmlvdXNseSBpbnN0YWxsZWQgdGhlIEJhbGFuY2UgbGlicmFyeSBvbiAKK3lvdXIgc3lzdGVtLCB5b3UgY2FuIHNhZmVseSBza2lwIHRoaXMgc3RlcC4KKworICAgYS4gRG93bmxvYWQgdGhlIGxhdGVzdCBzdGFibGUgQmFsYW5jZSBsaWJyYXJ5IHJlbGVhc2UgKE9PRFRfUk9PVC9iYWxhbmNlL2xpYi9wZWFyKQorICAgICAgdG8gYSBzY3JhdGNoIGRpcmVjdG9yeSBvbiB5b3VyIHN5c3RlbQorICAgYi4gQnVpbGQgdGhlIHBlYXIgcGFja2FnZSB1c2luZyB0aGUgcGVhciBjb21tYW5kIGxpbmUgdXRpbGl0eToKKyAgICAgICQgcGVhciBwYWNrYWdlCisgICBjLiBJbnN0YWxsIHRoZSByZXN1bHRpbmcgcGFja2FnZSAoLnRneiBmaWxlKSB1c2luZyB0aGUgcGVhciBpbnN0YWxsZXI6CisgICAgICAkIHBlYXIgaW5zdGFsbCAtLWZvcmNlIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlLSMuIy4jLnRnegorCisyLiBTZXR0aW5nIHVwIHRoZSB3ZWIgYXBwbGljYXRpb24gc2tlbGV0b24KKworVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHJlcHJlc2VudCB0aGUgQmFsYW5jZSBhcHBsaWNhdGlvbiBza2VsZXRvbi4gSWYKK3lvdSBoYXZlIG5vdCBhbHJlYWR5IGRvbmUgc28sIG1vdmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgZmlsZSB0bworeW91ciB3ZWIgc2VydmVyJ3MgZGlyZWN0b3J5IHJvb3QsIG5vdGluZyB0aGUgbmFtZSB5b3UgdXNlIGZvciB0aGUgcGF0aAorKGUuZy46IC9wYXRoL3RvL2RvY3VtZW50L3Jvb3QvbXktYXBwbGljYXRpb24pLiBUaGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFzc3VtZQordGhhdCB5b3UgaGF2ZSBuYW1lZCB0aGUgZGlyZWN0b3J5ICdteS1hcHBsaWNhdGlvbicuIEFkanVzdCBhcyBuZWNlc3NhcnkgZm9yIAoreW91ciBlbnZpcm9ubWVudC4KKworICAgYS4gSW4gdGhlIGNvbmZpZy5pbmkgZmlsZSwgc2V0IHRoZSB1cmxfYmFzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHRvIC9teS1hcHBsaWNhdGlvbgorICAgYi4gSW4gdGhlIC5odGFjY2VzcyBmaWxlLCBzZXQgdGhlIFJld3JpdGVCYXNlIGRpcmVjdGl2ZSB0byAvbXktYXBwbGljYXRpb24KKyAgIGMuIFZpc2l0IGh0dHA6Ly9sb2NhbGhvc3QvbXktYXBwbGljYXRpb24gdG8gc2VlIHlvdXIgc2tlbGV0YWwgQmFsYW5jZSBhcHBsaWNhdGlvbi4gTm90ZQorICAgICAgdGhhdCB0aGUgVVJMIHlvdSB1c2UgdG8gdmlzaXQgeW91ciBhcHBsaWNhdGlvbiBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlIGFib3ZlIAorICAgICAgaWYgeW91IGhhdmUgc2V0IHVwIHZpcnR1YWwgaG9zdGluZyBvciBoYXZlIGEgZG9tYWluIG5hbWUgb3RoZXIgdGhhbiBsb2NhbGhvc3QuCisKKzMuIERldmVsb3BpbmcgeW91ciB3ZWIgYXBwbGljYXRpb24KKworVGhlIGZvbGxvd2luZyBpcyBhIHZlcnkgaGlnaCBsZXZlbCBpbnRyb2R1Y3Rpb24gdG8gZGV2ZWxvcGluZyBhIHdlYiBhcHBsaWNhdGlvbiB1c2luZyBCYWxhbmNlLgorCitCYWxhbmNlIG9wZXJhdGVzIG9uIHRoZSBjb25jZXB0IG9mIGFwcGxpY2F0aW9uICd2aWV3cycuIEVhY2ggYXBwbGljYXRpb24gdXJsLCBlLmcuOiAKK2h0dHA6Ly9sb2NhbGhvc3QvbXktYXBwbGljYXRpb24vYWJvdXQsIG1hcHMgdG8gZXhhY3RseSBvbmUgdmlldywgZS5nLjogSE9NRS92aWV3cy9hYm91dC5waHAsIAord2hlcmUgSE9NRSBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIEJhbGFuY2Ugd2ViIGFwcGxpY2F0aW9uIGZpbGVzLiBBIHZpZXcgZmlsZSBpcyBhIHBsYWluIHZhbmlsbGEKK1BIUCBmaWxlLCB3aGljaCwgaW4gaXRzIHNpbXBsZXN0IGZvcm0sIG1pZ2h0IG9ubHkgY29udGFpbiBzdGF0aWMgSFRNTC4gRm9yIG1vcmUgaW52b2x2ZWQgdGFza3MsCitmdW5jdGlvbnMgZnJvbSB0aGUgQmFsYW5jZSBjb3JlIGxpYnJhcnkgY2FuIGJlIGludm9rZWQgZGlyZWN0bHkgZnJvbSB3aXRoaW4gdGhlIHZpZXcgZmlsZS4KKworTW9zdCBzaXRlcyBpbmNvcnBvcmF0ZSBjb21tb24sIHNpdGUtd2lkZSBjb250ZW50IGF0IHRoZSB0b3AgKGhlYWRlcikgYW5kIGJvdHRvbSAoZm9vdGVyKSBvZgorZWFjaCBwYWdlLiBCYWxhbmNlIHN1cHBvcnRzIGhlYWRlciBhbmQgZm9vdGVyIGZpbGVzLCB3aGljaCBnZXQgaW5jbHVkZWQgd2l0aCBldmVyeSB2aWV3IHVubGVzcwordGhlIHZpZXcgZmlsZSBpdHNlbGYgZXhwbGljaXRseSBtb2RpZmllcyB0aGlzIGJlaGF2aW9yLiBCeSBkZWZhdWx0LCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgZmlsZQorY2FuIGJlIGZvdW5kIGF0IEhPTUUvdmlld3MvY29tbW9uL2hlYWRlci5waHAgYW5kIEhPTUUvdmlld3MvY29tbW9uL2Zvb3Rlci5waHAsIHJlc3BlY3RpdmVseS4KKworT2NjYXNpb25hbGx5LCBzdWNoIGFzIHdoZW4gYSBmb3JtIGdldHMgc3VibWl0dGVkIHZpYSBQT1NULCBhIHNjcmlwdCBuZWVkcyB0byBiZSBpbnZva2VkIHRvIGhhbmRsZQordGhlIGlucHV0LiBTY3JpcHRzIGFyZSBnZW5lcmFsbHkgbG9jYXRlZCBhdCBIT01FL3NjcmlwdHMsIGFuZCBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSB1cmwKK3RoYXQgd2lsbCBiZSB1c2VkIHRvIGludm9rZSB0aGVtLiBTY3JpcHRzIGFyZSBkaWZmZXJlbnRpYXRlZCBmcm9tIHZpZXdzIGZyb20gYSB1cmwgc3RhbmRwb2ludCBpbgordGhhdCB1cmxzIGZvciBzY3JpcHRzIGVuZCBpbiAnLmRvJyB3aGVyZWFzIHVybHMgZm9yIHZpZXdzIGdlbmVyYWxseSBkbyBub3QgaGF2ZSBhIGZpbGUgZXh0ZW5zaW9uLgorQXMgYSBjb25jcmV0ZSBleGFtcGxlLCBpbWFnaW5lIGEgbG9naW4gdmlldyBwcm92aWRpbmcgaW5wdXRzIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQuIEl0IG1pZ2h0Cit0aGVvcmV0aWNhbGx5IHJlc2lkZSBhdCBIT01FL3ZpZXdzL2xvZ2luLnBocCBhbmQgYmUgYWNjZXNzZWQgdmlhIAoraHR0cDovL2xvY2FsaG9zdC9teS1hcHBsaWNhdGlvbi9sb2dpbi4gT24gc3VibWlzc2lvbiwgdGhlIGxvZ2luIGZvcm0ncyB0YXJnZXQgbWlnaHQgYmUgc2V0IHRvIGEgCitsb2dpbiBzY3JpcHQgdGhhdCBwcm9jZXNzZXMgdGhlIHN1Ym1pdHRlZCB1c2VyIGluZm9ybWF0aW9uLiBUaGF0IHNjcmlwdCB3b3VsZCByZXNpZGUgYXQgCitIT01FL3NjcmlwdHMvbG9naW4ucGhwIGFuZCBiZSBhY2Nlc3NlZCB2aWEgaHR0cDovL2xvY2FsaG9zdC9teS1hcHBsaWNhdGlvbi9sb2dpbi5kby4gSW4gdGhlIAorZXZlbnQgdGhhdCB0aGUgc2NyaXB0IGlzIGludGVuZGVkIHRvIGhhbmRsZSBHRVQgcGFyYW1ldGVycywgdGhleSBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIC5kbyB1c2luZwordGhlIHN0YW5kYXJkIHVybCBub3RhdGlvbiAoZS5nLjogLi4ubXlzY3JpcHQuZG8/cGFyYW0xPXZhbHVlMSZwYXJhbTI9dmFsdWUyKS4gVGhlICcuZG8nIGV4dGVuc2lvbiBpcyAKK21lcmVseSBhIHVybCByb3V0aW5nIGNvbnZlbnRpb24gbWVhbnQgdG8gaW1wbHkgdGhlIGV4ZWN1dGlvbiBvZiBzb21lIGFjdGlvbiwgdGhlIGFjdHVhbCBzY3JpcHQgCitmaWxlIGluIEhPTUUvc2NyaXB0cyBtYWludGFpbnMgdGhlICcucGhwJyBleHRlbnNpb24uCisKK01vcmUgaW5mb3JtYXRpb24gY2FuIGJlIG9idGFpbmVkIGJ5IHZpc2l0aW5nIHRoZSBPT0RUIHdlYnNpdGUgKGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcpIG9yIHBvc2luZworYSBxdWVzdGlvbiB0byB0aGUgT09EVCB1c2VyIG1haWxpbmcgbGlzdCAodXNlckBvb2R0LmFwYWNoZS5vcmcpLgorCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvY29uZmlnLmluaSBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9jb25maWcuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzkxYjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvY29uZmlnLmluaQpAQCAtMCwwICsxLDgyIEBACis7Cis7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorOyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKzsgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorOyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorOyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorOyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKzsKKzsgT09EVCBCYWxhbmNlCis7IFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworOworOyBBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uIEZpbGUuIFRoaXMgZmlsZSBzaG91bGQgYmUgY2FsbGVkICdjb25maWcuaW5pJyBhbmQgCis7IHNob3VsZCByZXNpZGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHlvdXIgc2l0ZS4gVGhpcyBmaWxlIGZvbGxvd3Mgc3RhbmRhcmQKKzsgaW5pIGZpbGUgY29udmVudGlvbnMuIExpbmVzIGJlZ2lubmluZyB3aXRoICc7JyBhcmUgY29tbWVudHMgYW5kIGFyZSBpZ25vcmVkLgorOworCitbQXBwbGljYXRpb24gRW52aXJvbm1lbnRdCisKKzsgc2l0ZV9yb290Cis7IElmIHRoZSBzaXRlIGxpdmVzIGF0IHRoZSBkb2N1bWVudCByb290IG9mIHRoZSBzZXJ2ZXIsIHRoaXMgd2lsbCBiZSAnLycuIE9uCis7IHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgc2l0ZSBsaXZlcyBpbiBhIHN1Yi1kaXJlY3Rvcnkgb2YgdGhlIGRvY3VtZW50IHJvb3QsIAorOyB0aGlzIHdpbGwgYmUgdGhlIGZ1bGwgcGF0aCAoc3RhcnRpbmcgZnJvbSB0aGUgZG9jdW1lbnQgcm9vdCkgdG8gdGhlIHJvb3QgCis7IGRpcmVjdG9yeSBvZiB0aGUgc2l0ZS4gQWx3YXlzIHN0YXJ0IHdpdGggYSBzbGFzaCAoLykgYW5kIGFsd2F5cyBvbWl0IHRoZQorOyB0cmFpbGluZyBzbGFzaC4gCis7Cis7IGV4YW1wbGVzOiAKKzsgICAgKGRvY3VtZW50IHJvb3QpIGh0dHA6Ly9kb21haW4uY29tLyAgICAgICAgICAoc2l0ZV9yb290OiAnLycpCis7ICAgIChzdWJkaXJlY3RvcnkpICBodHRwOi8vZG9tYWluLmNvbS9hcHBzL3NpdGUgKHNpdGVfcm9vdDogJy9hcHBzL3NpdGUnKQorOworOyBOb3RlOiBUaGUgdmFsdWUgZm9yIHNpdGVfcm9vdCBzaG91bGQgYWx3YXlzIG1hdGNoIHRoZSB2YWx1ZSBmb3IgJ1Jld3JpdGVCYXNlJworOyAgICAgICBpbiB0aGUgLmh0YWNjZXNzIGZpbGUgbG9jYXRlZCBpbiB0aGUgc2l0ZSdzIHJvb3QgZGlyZWN0b3J5LgorOworc2l0ZV9yb290ID0gLworCisKK1tBcHBsaWNhdGlvbiBDb250ZW50XQorCis7IHZpZXdzX2RpcgorOyBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW5zaWRlIHlvdXIgc2l0ZSByb290IHdoZXJlIHlvdXIgYXBwbGljYXRpb24ncyB2aWV3cworOyByZXNpZGUuIFRoaXMgc2hvdWxkIGJlIGEgcmVsYXRpdmUgcGF0aCAoLi8pLiBJZiB5b3UgaGF2ZSBzZXQgdGhpbmdzIHVwCis7IGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zLCB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIAorOyBmaWxlIChjb25maWcuaW5pKSBhcyB0aGUgYmFzZS4KKzsKKzsgTm90ZTogVGhlIHZhbHVlIHByb3ZpZGVkIGlzIHNpbXBseSBhbiBleGFtcGxlLiBJdCBpcyB1cCB0byB5b3UgdG8gcHJvdmlkZQorOyAgICAgICB2YWxpZCBwYXRocyBmb3IgeW91ciBlbnZpcm9ubWVudC4KK3ZpZXdzX2RpciA9IC4vdmlld3MKKworOyBoZWFkZXJfZmlsZV9wYXRoCis7IFRoaXMgaXMgdGhlIGZpbGUgdGhhdCBjb250YWlucyBhIHNpdGUtd2lkZSBoZWFkZXIgY29kZS9sYXlvdXQgdG8gYmUgaW5jbHVkZWQKKzsgaW4gZWFjaCB2aWV3LiBUaGlzIHNob3VsZCBiZSBhIHJlbGF0aXZlIHBhdGggKC4vKS4gSWYgeW91IGhhdmUgc2V0IHRoaW5ncyB1cAorOyBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucywgdGhlIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgbG9jYXRpb24gb2YgdGhpcyAKKzsgZmlsZSAoY29uZmlnLmluaSkgYXMgdGhlIGJhc2UuCis7Cis7IE5vdGU6IFRoZSB2YWx1ZSBwcm92aWRlZCBpcyBzaW1wbHkgYW4gZXhhbXBsZS4gSXQgaXMgdXAgdG8geW91IHRvIHByb3ZpZGUKKzsgICAgICAgdmFsaWQgcGF0aHMgZm9yIHlvdXIgZW52aXJvbm1lbnQuCitoZWFkZXJfZmlsZV9wYXRoID0gLi92aWV3cy9jb21tb24vaGVhZGVyLnBocAorCis7IGZvb3Rlcl9maWxlX3BhdGgKKzsgVGhpcyBpcyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIGEgc2l0ZS13aWRlIGZvb3RlciBjb2RlL2xheW91dCB0byBiZSBpbmNsdWRlZAorOyBpbiBlYWNoIHZpZXcuIFRoaXMgc2hvdWxkIGJlIGEgcmVsYXRpdmUgcGF0aCAoLi8pLiBJZiB5b3UgaGF2ZSBzZXQgdGhpbmdzIHVwCis7IGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zLCB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIAorOyBmaWxlIChjb25maWcuaW5pKSBhcyB0aGUgYmFzZS4KKzsKKzsgTm90ZTogVGhlIHZhbHVlIHByb3ZpZGVkIGlzIHNpbXBseSBhbiBleGFtcGxlLiBJdCBpcyB1cCB0byB5b3UgdG8gcHJvdmlkZQorOyAgICAgICB2YWxpZCBwYXRocyBmb3IgeW91ciBlbnZpcm9ubWVudC4KK2Zvb3Rlcl9maWxlX3BhdGggPSAuL3ZpZXdzL2NvbW1vbi9mb290ZXIucGhwCisKKworW0FVVEggJiBBVVRIXQorCis7IEF1dGhvcml6YXRpb24gZXJyb3IgcmVkaXJlY3QgcGF0aCB0byBsb2dpbiBwYWdlCithdXRob3JpemF0aW9uX3JlZGlyZWN0X3VybCA9IC8KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9ob29rcy5waHAgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvaG9va3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmRkOTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvaG9va3MucGhwCkBAIC0wLDAgKzEsOTggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorKi8KKworLyoqCisgKiBIT09LUy5QSFAKKyAqCisgKiBIb29rcyBwcm92aWRlIHRoZSBhYmlsaXR5LCBhcyB0aGUgbmFtZSBpbXBsaWVzLCB0byBob29rIGludG8gdmFyaW91cyBwYXJ0cyBvZgorICogdGhlIHZpZXcgcmVuZGVyaW5nIHByb2Nlc3MgYW5kIGluc2VydCBjdXN0b21pemF0aW9ucy4gVGhlIGNvbnRlbnRzIG9mIHRoZXNlCisgKiBmdW5jdGlvbnMgYXJlIHJ1biBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZSAqRVZFUlkqIHRpbWUgYSB2aWV3IGlzIHJlbmRlcmVkLCBpLmUuCisgKiB0aGUgY29udGVudCBvZiB0aGUgaG9va3MgaXMgbm90IGJ5IGRlZmF1bHQgdmlldy1zcGVjaWZpYyBidXQgcmF0aGVyIHdpbGwgYmUKKyAqIGFwcGxpZWQgdG8gYWxsIHZpZXdzLiAoSG93ZXZlciwgdGhlcmUgaXMgbm90aGluZyB0aGF0IHByZXZlbnRzIGRldmVsb3BlcnMgZnJvbQorICogaW5zZXJ0aW5nIGNvbmRpdGlvbmFsIGxvZ2ljIGluc2lkZSBhIGhvb2sgdGhhdCB0aGVuIGNhdXNlcyB2aWV3LXNwZWNpZmljCisgKiB0aGVtIHRvIGV4aGliaXQgdmlldy1zcGVjaWZpYyBiZWhhdmlvcikuCisgKgorICogQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgYSBob29rIHRoYXQgYWRkcyB0aGUgYW1vdW50IG9mIHRpbWUgQmFsYW5jZSB0b29rIHRvIHJlbmRlcgorICogdGhlIHBhZ2UgYXMgYW4gaW5saW5lIEhUTUwgY29tbWVudCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggcGFnZSBhZnRlciBpdCBoYXMgYmVlbiBzZW50OgorICoKKyAqIGZ1bmN0aW9uIGhvb2tfYWZ0ZXJfc2VuZCgpIHsKKyAqICAgICAkdGltZVN0YXJ0ID0gJEdMT0JBTFNbJ2JhbGFuY2VfcmVxdWVzdF9zdGFydCddOworICogICAgICR0aW1lTm93ICAgPSBtaWNyb3RpbWUodHJ1ZSk7CisgKiAgICAgJGVsYXBzZWQgICA9ICR0aW1lTm93IC0gJHRpbWVTdGFydDsKKyAqICAgICBlY2hvICI8IS0tIHBhZ2UgcmVuZGVyZWQgaW4geyRlbGFwc2VkfSBzZWNvbmRzIC0tPiI7CisgKiB9CisgKgorICoKKyAqIFRha2UgYSBsb29rIGF0IHRoZSBkb2NibG9jayBkZXNjcmlwdGlvbnMgb2YgZWFjaCBob29rIHRvIGdldCBhIHNlbnNlIG9mIHdoZXJlCisgKiBpbiB0aGUgdmlldyByZW5kZXJpbmcgcHJvY2VzcyB0aGUgaG9vayBpcyBpbnZva2VkLgorICoKKyAqLworCisvKioKKyAqIGhvb2tfYmVmb3JlX2FsbAorICoKKyAqIFRoaXMgaG9vayBpcyBleGVjdXRlZCBiZWZvcmUgYW55IG90aGVyIGhvb2tzLiBJdCBjYW4gYmUgdXNlZCBmb3IgYW55CisgKiBwcmUtcHJvY2Vzc2luZyBsb2dpYy4KKyAqLworZnVuY3Rpb24gaG9va19iZWZvcmVfYWxsKCkge30KKworLyoqCisgKiBob29rX2JlZm9yZV9oZWFkZXIKKyAqCisgKiBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBjb250ZW50cyBvZiB0aGUgaGVhZGVyIGZpbGUgYXJlIHByb2Nlc3NlZC4KKyAqLworZnVuY3Rpb24gaG9va19iZWZvcmVfaGVhZGVyKCkge30KKworLyoqCisgKiBob29rX2JlZm9yZV92aWV3CisgKgorICogVGhpcyBob29rIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgY29udGVudHMgb2YgdGhlIG1haW4gdmlldyBhcmUgcHJvY2Vzc2VkLgorICovCitmdW5jdGlvbiBob29rX2JlZm9yZV92aWV3KCkge30KKworLyoqCisgKiBob29rX2JlZm9yZV9mb290ZXIKKyAqCisgKiBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBjb250ZW50cyBvZiB0aGUgZm9vdGVyIGFyZSBwcm9jZXNzZWQKKyAqLworZnVuY3Rpb24gaG9va19iZWZvcmVfZm9vdGVyKCkge30KKworLyoqCisgKiBob29rX2JlZm9yZV9zZW5kCisgKgorICogVGhpcyBob29rIGlzIGFmdGVyIGFsbCBvZiB0aGUgdmlldyBjb21wb25lbnRzIChoZWFkZXIsIHZpZXcsIGZvb3RlcikgaGF2ZSBiZWVuCisgKiBwcm9jZXNzZWQgYnV0IGJlZm9yZSB0aGUgcHJvY2Vzc2VkIHJlc3VsdHMgYXJlIHNlbnQgb3V0IGFjcm9zcyB0aGUgd2lyZSB0byB0aGUKKyAqIGJyb3dzZXIuIEhUVFAgaGVhZGVycyBoYXZlIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZSBicm93c2VyLgorICovCitmdW5jdGlvbiBob29rX2JlZm9yZV9zZW5kKCkge30KKworLyoqCisgKiBob29rX2FmdGVyX3NlbmQKKyAqCisgKiBUaGlzIGhvb2sgaXMgYWZ0ZXIgYWxsIG9mIHRoZSB2aWV3IGNvbXBvbmVudHMgKGhlYWRlciwgdmlldywgZm9vdGVyKSBoYXZlIGJlZW4KKyAqIHByb2Nlc3NlZCBhbmQgc2VudCBvdXQgYWNyb3NzIHRoZSB3aXJlIHRvIHRoZSBicm93c2VyLiBJdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZworICogb3IgYW5hbHl0aWNzIHB1cnBvc2VzLCBvciB0byBhcHBlbmQgYSBjb21tb24gdHJhaWxlciB0byBhbGwgY29udGVudC4KKyAqLworZnVuY3Rpb24gaG9va19hZnRlcl9zZW5kKCkgeworCSR0aW1lU3RhcnQgPSAkR0xPQkFMU1snYmFsYW5jZV9yZXF1ZXN0X3N0YXJ0J107CisJJHRpbWVFbmQgICA9IG1pY3JvdGltZSh0cnVlKTsKKwkkZWxhcHNlZCAgID0gJHRpbWVFbmQgLSAkdGltZVN0YXJ0OworCisJZWNobyAiXHJcbjwhLS0gcGFnZSByZW5kZXJlZCBpbiB7JGVsYXBzZWR9IHNlY29uZHMgLS0+IjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9pbmRleC5waHAgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvaW5kZXgucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjYzM2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvaW5kZXgucGhwCkBAIC0wLDAgKzEsNDggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIE9PRFQgQmFsYW5jZQorICogV2ViIEFwcGxpY2F0aW9uIEJhc2UgRnJhbWV3b3JrCisgKgorICogRnJvbnQtY29udHJvbGxlcgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIG1hcnNoYWxsaW5nIG9mIHJlcXVlc3RzIHRvIHRoZSBhcHByb3ByaWF0ZQorICogYXBwbGljYXRpb24gdmlldy4KKyAqCisgKi8KK2RlZmluZSAoIkRFQlVHIiwgdHJ1ZSk7IC8vIENoYW5nZSB0aGlzIHRvIGBmYWxzZWAgd2hlbiBubyBsb25nZXIgZGVidWdnaW5nCisKKy8vIEFwcGxpY2F0aW9uIHJvb3QgZGlyZWN0b3J5IHBhdGggKHNob3VsZCBuZXZlciBuZWVkIHRvIGNoYW5nZSB0aGlzKQorZGVmaW5lICgiSE9NRSIsICBkaXJuYW1lKF9fRklMRV9fKSk7CisKKy8qIFNldCB1cCBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCityZXF1aXJlX29uY2UoIk9yZy9BcGFjaGUvT29kdC9CYWxhbmNlL0Jvb3QvYm9vdHN0cmFwLnBocCIpOworCisvKiBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiB3aXRoIHRoZSBzZXR0aW5ncyBmcm9tIGNvbmZpZy5pbmkgKioqKioqKioqLworJGFwcCA9ICRHTE9CQUxTWydhcHAnXSA9IEFwcDo6Q3JlYXRlKHBhcnNlX2luaV9maWxlKEhPTUUgLiAnL2NvbmZpZy5pbmknKSk7CisKKy8qIEluaXRpYWxpemUgYW55IGdsb2JhbGx5IHJlcXVpcmVkIG1vZHVsZXMgaGVyZSAqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBFeGFtcGxlOgorLy8gVG8gbG9hZCBhIG1vZHVsZSAnZm9vJywgbG9jYXRlZCBhdCAuL21vZHVsZXMvZm9vLCBvbiBldmVyeSByZXF1ZXN0OgorLy8gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgnZm9vJyk7CisKKy8qIEdlbmVyYXRlIGFuZCBzZW5kIGEgcmVzcG9uc2UgdG8gdGhlIGJyb3dzZXIgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiskcmVzcG9uc2UgPSAkYXBwLT5nZXRSZXNwb25zZSgpLT5zZW5kKCk7CisKKy8qIENsZWFuIHVwIGFmdGVyIG91cnNlbHZlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiskYXBwLT5jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvc2NyaXB0cy93aWRnZXRzL0JyZWFkY3J1bWJzV2lkZ2V0LnBocCBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9zY3JpcHRzL3dpZGdldHMvQnJlYWRjcnVtYnNXaWRnZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvc2NyaXB0cy93aWRnZXRzL0JyZWFkY3J1bWJzV2lkZ2V0LnBocApAQCAtMCwwICsxLDEwMSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQlJFQURDUlVNQiBESVNQTEFZIFdJREdFVAorICoKKyAqIFdpZGdldCB0byBkaXNwbGF5IGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHBhZ2UuIEl0IGFsbG93cworICogdXNlcnMgdG8ga2VlcCB0cmFjayBvZiB0aGVpciBsb2NhdGlvbnMgd2l0aGluIHRoZSB3ZWJzaXRlLgorICoKKyAqIFRoZXNlIGJyZWFkY3J1bWJzIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gcmV0dXJuIHRvIHBhcmVudCBwYWdlcyB3aGVuIGEKKyAqIGEgbGluayBpcyBwcm92aWRlZC4KKyAqCisgKiBJbml0aWFsaXphdGlvbiBCcmVhZGNydW1ic1dpZGdldDoKKyAqICAgICAgJGJjdyA9IG5ldyBCcmVhZGNydW1ic1dpZGdldCggJG9wdGlvbnMgPSBhcnJheSgpKTsKKyAqCisgKiAgICAgIHN1cHBvcnRlZCBvcHRpb25zOgorICogICAgICAgICdzZXBhcmF0b3InID0+ICIoc3RyaW5nKSBzcGVjaWZ5aW5nIHRoZSBodG1sIHRoYXQgc2hvdWxkIHNlcGFyYXRlIGJyZWFkY3J1bWJzIgorICoKKyAqICAgICAgKk5PVEUqOiB0aGUgY2xhc3MgYWxzbyByZWNvZ25pemVzIHRoZSBgYnJlYWRjcnVtYnNfc2VwYXJhdG9yYCBhcHBsaWNhdGlvbiBjb25maWcKKyAqICAgICAgICAgICAgICBzZXR0aW5nLiBJZiB0aGlzIHNldHRpbmcgaXMgcHJlc2VudCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGNvbmZpZy5pbmkgZmlsZSwKKyAqICAgICAgICAgICAgICB0aGUgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBzZXBhcmF0b3I7CisgKgorICoKKyAqIEFkZGluZyBhIGxhYmVsIGJyZWFkY3J1bWIgKG5vIGxpbmspOgorICogCQkkYmN3LT5hZGQoJ0xhYmVsJyk7CisgKgorICogQWRkaW5nIGEgbGlua2VkIGxhYmVsIGJyZWFkY3J1bWI6CisgKiAJIAkkYmN3LT5hZGQoJ0xhYmVsJywnbGlua19ocmVmJyk7CisgKgorICoKKyAqLworCitjbGFzcyBCcmVhZGNydW1ic1dpZGdldAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25XaWRnZXQgeworCisJcHJvdGVjdGVkICRzZXBhcmF0b3IgPSAnJm5ic3A7JnJhcnI7Jm5ic3A7JzsKKworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucyA9IGFycmF5KCkpIHsKKworCQkvLyBDaGVjayBpZiB0aGUgYnJlYWRjcnVtYnNfc2VwYXJhdG9yIGNvbmZpZyBzZXR0aW5nIGhhcyBiZWVuIHNldAorCQlpZiAoaXNzZXQoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2JyZWFkY3J1bWJzX3NlcGFyYXRvciddKSkgeworCQkJJHRoaXMtPnNlcGFyYXRvciA9IEFwcDo6R2V0KCktPnNldHRpbmdzWydicmVhZGNydW1ic19zZXBhcmF0b3InXTsKKwkJfQorCisJCS8vIElmIHRoZSAnc2VwYXJhdG9yJyBvcHRpb24gaGFzIGJlZW4gcGFzc2VkLCBwcmVmZXIgaXQKKwkJaWYgKGlzc2V0KCRvcHRpb25zWydzZXBhcmF0b3InXSkpIHsKKwkJCSR0aGlzLT5zZXBhcmF0b3IgPSAkb3B0aW9uc1snc2VwYXJhdG9yJ107CisJCX0KKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gYWRkKCAkbGFiZWwgPSBudWxsLCAkbGluayA9IG51bGwpIHsKKwkJJGJyZWFkY3J1bWJzID0gQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmRhdGEoJ2JyZWFkY3J1bWJzJyk7CisJCWlmICggJGxhYmVsICE9IG51bGwgJiYgJGxpbmsgIT0gbnVsbCApIHsKKworCQkJLy8gd2lsbCBzaG93IHVwIGFzIGEgbGlua2VkIGxhYmVsCisJCQkkYnJlYWRjcnVtYnNbXSA9IGFycmF5KCRsYWJlbCwkbGluayk7CisJCX0gZWxzZWlmICggJGxhYmVsICE9IG51bGwgKSB7CisKKwkJCS8vIHdpbGwgc2hvdyB1cCBhcyBqdXN0IHRleHQKKwkJCSRicmVhZGNydW1ic1tdID0gJGxhYmVsOworCQl9IGVsc2UKKwkJCXJldHVybiAwOworCisJCUFwcDo6R2V0KCktPnJlc3BvbnNlLT5kYXRhKCJicmVhZGNydW1icyIsJGJyZWFkY3J1bWJzKTsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCRiRWNobyA9IHRydWUpIHsKKwkJJHN0ciAJPSAnJzsKKwkJJGRhdGEgPSBBcHA6OkdldCgpLT5yZXNwb25zZS0+ZGF0YSgnYnJlYWRjcnVtYnMnKTsKKwkJaWYgKCAhZW1wdHkoJGRhdGEpICkgeworCQkJZm9yZWFjaCAoJGRhdGEgYXMgJGJjKSB7CisJCQkJaWYgKGlzX2FycmF5KCRiYykpIHsKKwkJCQkJJHN0ciAuPSAnPHNwYW4gY2xhc3M9ImNydW1iIGxpbmsiPjxhIGhyZWY9IicuJGJjWzFdLiciPicuJGJjWzBdLiI8L2E+PC9zcGFuPnskdGhpcy0+c2VwYXJhdG9yfSI7CisJCQkJfSBlbHNlIHsKKwkJCQkJJHN0ciAuPSAnPHNwYW4gY2xhc3M9ImNydW1iIHRleHQiPicuJGJjLic8L3NwYW4+JzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZigkYkVjaG8pIHsKKwkJCWVjaG8gJHN0cjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAkc3RyOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2V0Yy9za2VsL3N0YXRpYy9jc3MvYmFsYW5jZS9iYWxhbmNlLmNzcyBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9zdGF0aWMvY3NzL2JhbGFuY2UvYmFsYW5jZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3YTc3NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9zdGF0aWMvY3NzL2JhbGFuY2UvYmFsYW5jZS5jc3MKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKiogUkVTRVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2h0bWwsIGJvZHksIGRpdiwgc3BhbiwgYXBwbGV0LCBvYmplY3QsIGlmcmFtZSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgCitibG9ja3F1b3RlLCBwcmUsIGEsIGFiYnIsIGFjcm9ueW0sIGFkZHJlc3MsIGJpZywgY2l0ZSwgY29kZSwgZGVsLCBkZm4sIGVtLCAKK2ltZywgaW5zLCBrYmQsIHEsIHMsIHNhbXAsIHNtYWxsLCBzdHJpa2UsIHN0cm9uZywgc3ViLCBzdXAsIHR0LCB2YXIsIGIsIHUsIAoraSwgY2VudGVyLCBkbCwgZHQsIGRkLCBvbCwgdWwsIGxpLCBmaWVsZHNldCwgZm9ybSwgbGFiZWwsIGxlZ2VuZCwgdGFibGUsIAorY2FwdGlvbiwgdGJvZHksIHRmb290LCB0aGVhZCwgdHIsIHRoLCB0ZCwgYXJ0aWNsZSwgYXNpZGUsIGNhbnZhcywgZGV0YWlscywgCitlbWJlZCwgZmlndXJlLCBmaWdjYXB0aW9uLCBmb290ZXIsIGhlYWRlciwgaGdyb3VwLCBtZW51LCBuYXYsIG91dHB1dCwgcnVieSwgCitzZWN0aW9uLCBzdW1tYXJ5LCB0aW1lLCBtYXJrLCBhdWRpbywgdmlkZW8geworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGJvcmRlcjogMDsKKyAgICBmb250LXNpemU6IDEwMCU7CisgICAgZm9udDogaW5oZXJpdDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Cit9CisvKiBIVE1MNSBkaXNwbGF5LXJvbGUgcmVzZXQgZm9yIG9sZGVyIGJyb3dzZXJzICovCithcnRpY2xlLCBhc2lkZSwgZGV0YWlscywgZmlnY2FwdGlvbiwgZmlndXJlLCAKK2Zvb3RlciwgaGVhZGVyLCBoZ3JvdXAsIG1lbnUsIG5hdiwgc2VjdGlvbiB7CisgICAgZGlzcGxheTogYmxvY2s7Cit9Citib2R5IHsKKyAgICBsaW5lLWhlaWdodDogMTsKK30KK29sLCB1bCB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKK30KK2Jsb2NrcXVvdGUsIHEgeworICAgIHF1b3Rlczogbm9uZTsKK30KK2Jsb2NrcXVvdGU6YmVmb3JlLCBibG9ja3F1b3RlOmFmdGVyLAorcTpiZWZvcmUsIHE6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIGNvbnRlbnQ6IG5vbmU7Cit9Cit0YWJsZSB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXItc3BhY2luZzogMDsKK30KKworLyoqKioqIEJBTEFOQ0UgREVGQVVMVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitodG1sLGJvZHkgeworICAgIGZvbnQtZmFtaWx5OmFyaWFsLHZlcmRhbmEsc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemU6MWVtOworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICBjb2xvcjojMDAwOworICAgIGxpbmUtaGVpZ2h0OjEuNWVtOworfQorCitoMSwgaDIsIGgzLCBoNCwgaDUgeworICAgIG1hcmdpbjoxMHB4IDBweDsKK30KKworaDEgeworICAgIGZvbnQtc2l6ZToyLjFlbTsKKyAgICBmb250LXdlaWdodDpib2xkOworICAgIG1hcmdpbjoxNXB4IDBweDsKK30KKworaDIgeworICAgIGZvbnQtc2l6ZToxLjhlbTsKKyAgICBmb250LXdlaWdodDpib2xkOworICAgIG1hcmdpbjoxMnB4IDBweDsKK30KKworaDMgeworICAgIGZvbnQtc2l6ZToxLjRlbTsKKyAgICBmb250LXdlaWdodDpib2xkOworfQorCitoNCB7CisgICAgZm9udC1zaXplOjEuMmVtOworICAgIGZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKK2g1IHsKKyAgICBmb250LXNpemU6MWVtOworICAgIGZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKK2Rpdi5jb250YWluZXIgeworICAgIHdpZHRoOjk2MHB4OworICAgIG1hcmdpbjoxMHB4IGF1dG87Cit9CisKKworLyoqCisgKiBCYWxhbmNlIFdpZGdldCBTdHlsaW5nCisgKi8KKworZGl2LmJhbF93aWRnZXQgeworCWJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKwlwYWRkaW5nOjVweDsKK30KKworLyoqCisgKiBCYWxhbmNlIGRlZmF1bHQgZm9vdGVyIHN0eWxpbmcKKyAqLworZGl2LmJhbF9mb290ZXIgeworCWNvbG9yOiM4ODg7CisJZm9udC1zaXplOjgwJTsJCit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvc3RhdGljL2Nzcy9zaXRlLmNzcyBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC9zdGF0aWMvY3NzL3NpdGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZmQ4NGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvc3RhdGljL2Nzcy9zaXRlLmNzcwpAQCAtMCwwICsxLDE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBQbGFjZSBzaXRlIENTUyBzdGF0ZW1lbnRzIGhlcmUKKyAqKi8KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9jb21tb24vZm9vdGVyLnBocCBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9jb21tb24vZm9vdGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQ1NTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2V0Yy9za2VsL3ZpZXdzL2NvbW1vbi9mb290ZXIucGhwCkBAIC0wLDAgKzEsMzggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEFwcGxpY2F0aW9uIEZvb3RlciBGaWxlCisgKgorICogVGhpcyBmaWxlIHJlcHJlc2VudHMgYSBzYW1wbGUgYXBwbGljYXRpb24gZm9vdGVyIGZpbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZAorICogd2l0aCBldmVyeSBhcHBsaWNhdGlvbiB2aWV3ICh1bmxlc3MgdGhlIHZpZXcgaGFzIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgKiBhIGRpZmZlcmVudCBmb290ZXIgZmlsZSwgb3Igbm8gZm9vdGVyIGF0IGFsbCkuIFRvIGN1c3RvbWl6ZSB0aGUgZm9vdGVyCisgKiBmaWxlLCB5b3UgaGF2ZSB0d28gb3B0aW9uczoKKyAqIAorICogMSkgbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBkaXJlY3RseQorICogMikgY3JlYXRlIGEgbmV3IGZvb3RlciBmaWxlLCBhbmQgdXBkYXRlIGNvbmZpZy5pbmkgdG8gcG9pbnQgdG8gaXQsIGluc3RlYWQKKyAqLworPz4KKworPGRpdiBjbGFzcz0iYmFsX2Zvb3RlciI+CisJQ3JlYXRlZCB3aXRoIE9PRFQgQmFsYW5jZSB2Ljw/cGhwIGVjaG8gQkFMQU5DRV9WRVJTSU9OID8+Cis8L2Rpdj4KKzwhLS0gaHRtbCBjbG9zaW5nIHN0YXRlbWVudHMgLS0+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9jb21tb24vaGVhZGVyLnBocCBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9jb21tb24vaGVhZGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVkYzFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2V0Yy9za2VsL3ZpZXdzL2NvbW1vbi9oZWFkZXIucGhwCkBAIC0wLDAgKzEsNTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEFwcGxpY2F0aW9uIEhlYWRlciBGaWxlCisgKgorICogVGhpcyBmaWxlIHJlcHJlc2VudHMgYSBzYW1wbGUgYXBwbGljYXRpb24gaGVhZGVyIGZpbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZAorICogd2l0aCBldmVyeSBhcHBsaWNhdGlvbiB2aWV3ICh1bmxlc3MgdGhlIHZpZXcgaGFzIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgKiBhIGRpZmZlcmVudCBoZWFkZXIgZmlsZSwgb3Igbm8gaGVhZGVyIGZpbGUgYXQgYWxsKS4gVG8gY3VzdG9taXplIHRoZSBoZWFkZXIKKyAqIGZpbGUsIHlvdSBoYXZlIHR3byBvcHRpb25zOgorICogCisgKiAxKSBtYWtlIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGRpcmVjdGx5CisgKiAyKSBjcmVhdGUgYSBuZXcgaGVhZGVyIGZpbGUsIGFuZCB1cGRhdGUgY29uZmlnLmluaSB0byBwb2ludCB0byBpdCwgaW5zdGVhZAorICovCis/PgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIE9PRFQgQmFsYW5jZSBBcHBsaWNhdGlvbjwvdGl0bGU+CisKKzwhLS0gQmFzZSBzdHlsZXNoZWV0cyAtLT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ijw/cGhwIGVjaG8gU0lURV9ST09UIC4nL3N0YXRpYy9jc3MvYmFsYW5jZS9iYWxhbmNlLmNzcyc/PiIvPgorCis8IS0tIEJhc2UgSmF2YXNjcmlwdCAtLT4KKworPCEtLSBEeW5hbWljYWxseSBBZGRlZCBTdHlsZXNoZWV0cyAtLT4KKzwhLS0gU1RZTEVTSEVFVFMgLS0+CisKKzwhLS0gRHluYW1pY2FsbHkgQWRkZWQgSmF2YXNjcmlwdHMgLS0+Cis8IS0tIEpBVkFTQ1JJUFRTIC0tPgorCis8IS0tIFNpdGUgc3BlY2lmaWMgc3R5bGVzaGVldCBvdmVycmlkZXMgLS0+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8P3BocCBlY2hvIFNJVEVfUk9PVCAuJy9zdGF0aWMvY3NzL3NpdGUuY3NzJz8+Ii8+CisKKzwvaGVhZD4KKzxib2R5PgorPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KKzw/cGhwCisJLy8gVGhpcyByZXRyaWV2ZXMgYW55ICdmbGFzaCcgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCisJZWNobyBBcHA6OkdldCgpLT5HZXRNZXNzYWdlcygpOworPz4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9lcnJvcnMvNDAzLnBocCBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9lcnJvcnMvNDAzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTg3ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2V0Yy9za2VsL3ZpZXdzL2Vycm9ycy80MDMucGhwCkBAIC0wLDAgKzEsMzAgQEAKKzw/cGhwIAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFByZXBhcmUgQnJlYWRjcnVtYnNXaWdkZXQKK3JlcXVpcmVfb25jZSggSE9NRSAuICcvc2NyaXB0cy93aWRnZXRzL0JyZWFkY3J1bWJzV2lkZ2V0LnBocCcpOworJGJjdyA9IG5ldyBCcmVhZGNydW1ic1dpZGdldCgpOworJGJjdy0+YWRkKCdIb21lJyxTSVRFX1JPT1QgLiAnLycpOworJGJjdy0+YWRkKCdBY2Nlc3MgRm9yYmlkZGVuJyk7Cis/PgorCis8ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPgorCTxoMj4gNDAzIEFjY2VzcyBGb3JiaWRkZW4gPC9oMj4KKwk8aDU+IFlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdmlldyB0aGUgcmVxdWVzdGVkIHJlc291cmNlLiBJZiB5b3UgZmVlbCB0aGlzIGlzIGluIGVycm9yLCBwbGVhc2UKKyAgICAgICAgICAgICBjb250YWN0IHRoZSB3ZWJtYXN0ZXIgZm9yIHRoaXMgc2l0ZSA8L2g1PgorPC9kaXY+CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvdmlld3MvZXJyb3JzLzQwNC5waHAgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvdmlld3MvZXJyb3JzLzQwNC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0MGE4MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9lcnJvcnMvNDA0LnBocApAQCAtMCwwICsxLDI5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFByZXBhcmUgQnJlYWRjcnVtYnNXaWdkZXQKK3JlcXVpcmVfb25jZSggSE9NRSAuICcvc2NyaXB0cy93aWRnZXRzL0JyZWFkY3J1bWJzV2lkZ2V0LnBocCcpOworJGJjdyA9IG5ldyBCcmVhZGNydW1ic1dpZGdldCgpOworJGJjdy0+YWRkKCdIb21lJyxTSVRFX1JPT1QgLiAnLycpOworJGJjdy0+YWRkKCdOb3QgRm91bmQnKTsKKz8+CisKKzxkaXYgaWQ9InBhZ2VfY29udGVudCI+CisgICAgICAgIDxoMj4gNDA0IE5vdCBGb3VuZCA8L2gyPgorICAgICAgICA8aDU+IFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKDw/cGhwIGVjaG8gQXBwOjpHZXQoKS0+cmVxdWVzdC0+dXJpPz4pIGRvZXMgbm90IGV4aXN0LjwvaDU+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9ldGMvc2tlbC92aWV3cy9pbmRleC5waHAgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvdmlld3MvaW5kZXgucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjVlMDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvZXRjL3NrZWwvdmlld3MvaW5kZXgucGhwCkBAIC0wLDAgKzEsMzUgQEAKKzwhLS0KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8cD4mbmJzcDs8L3A+Cis8aDE+SGVsbG8gZnJvbSBPT0RUIEJhbGFuY2U8L2gxPgorCis8ZGl2IGNsYXNzPSJib3giPgorCTxoNT5UbyBjb25maWd1cmUgeW91ciBhcHBsaWNhdGlvbjo8L2g1PgorCTxjb2RlPmZpbGU6Ly88P3BocCBlY2hvIEhPTUU/Pi9jb25maWcuaW5pPC9jb2RlPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImJveCI+CisJPGg1PlRvIGVkaXQgdGhpcyB2aWV3OjwvaDU+CisJPGNvZGU+ZmlsZTovLzw/cGhwIGVjaG8gSE9NRT8+L3ZpZXdzL2luZGV4LnBocDwvY29kZT4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJib3giPgorCTxoNT5Gb3IgbW9yZSBpbmZvcm1hdGlvbjo8L2g1PgorCTxhIGhyZWY9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmciPmh0dHA6Ly9vb2R0LmFwYWNoZS5vcmc8L2E+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Cb290L2Jvb3RzdHJhcC5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQm9vdC9ib290c3RyYXAucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGNiOWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQm9vdC9ib290c3RyYXAucGhwCkBAIC0wLDAgKzEsNTkgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBCb290c3RyYXAgZmlsZSB0byBwcm92aWRlIGFsbCBmcmFtZXdvcmsgYmFzZSBmaWxlcyBuZWNlc3NhcnkgdG8gCisgKiBzYXRpc2Z5IGEgcmVzb3VyY2UgcmVxdWVzdC4KKyAqIAorICogQGF1dGhvciBhaGFydAorICogCisgKi8KKworZGVmaW5lKCJCQUxBTkNFX1ZFUlNJT04iLCAnMC4zLVNOQVBTSE9UJyk7CisKKy8vIEluY2x1ZGUgUmVxdWlyZWQgRnJhbWV3b3JrIEludGVyZmFjZXMKK2luY2x1ZGUoIk9yZy9BcGFjaGUvT29kdC9CYWxhbmNlL0ludGVyZmFjZXMvSUFwcGxpY2F0aW9uV2lkZ2V0LnBocCIpOworaW5jbHVkZSgiT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25EYXRhUHJvdmlkZXIucGhwIik7CitpbmNsdWRlKCJPcmcvQXBhY2hlL09vZHQvQmFsYW5jZS9JbnRlcmZhY2VzL0lBcHBsaWNhdGlvbkF1dGhlbnRpY2F0aW9uUHJvdmlkZXIucGhwIik7CitpbmNsdWRlKCJPcmcvQXBhY2hlL09vZHQvQmFsYW5jZS9JbnRlcmZhY2VzL0lBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlci5waHAiKTsKKworLy8gSW5jbHVkZSBSZXF1aXJlZCBGcmFtZXdvcmsgQ2xhc3NlcworaW5jbHVkZSgiT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UvQ29yZS9BcHBsaWNhdGlvbi5jbGFzcy5waHAiKTsKK2luY2x1ZGUoIk9yZy9BcGFjaGUvT29kdC9CYWxhbmNlL0NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmNsYXNzLnBocCIpOworaW5jbHVkZSgiT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UvQ29yZS9BcHBsaWNhdGlvblJlc3BvbnNlLmNsYXNzLnBocCIpOworaW5jbHVkZSgiT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UvQ29yZS9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZS5jbGFzcy5waHAiKTsKKworCitjbGFzcyBBcHAgeworCQorCXByb3RlY3RlZCBzdGF0aWMgJGFwcCA9IG51bGw7CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDcmVhdGUoJGNvbmZpZykgeworCQlpZiAoIXNlbGY6OiRhcHApIHsKKwkJCXNlbGY6OiRhcHAgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbigkY29uZmlnKTsKKwkJfSAKKwkJcmV0dXJuIHNlbGY6OiRhcHA7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0KCkgeworCQlyZXR1cm4gc2VsZjo6JGFwcDsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQ29yZS9BcHBsaWNhdGlvbi5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQ29yZS9BcHBsaWNhdGlvbi5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExZjA4NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Db3JlL0FwcGxpY2F0aW9uLmNsYXNzLnBocApAQCAtMCwwICsxLDQyNyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiAKKyAqIE9PRFQgQmFsYW5jZQorICogV2ViIEFwcGxpY2F0aW9uIEJhc2UgRnJhbWV3b3JrCisgKiAKKyAqIE1haW4gY2xhc3MgZm9yIE9PRFQgQmFsYW5jZSB3ZWIgYXBwbGljYXRpb25zLiBDb250YWlucyB1dGlsaXR5CisgKiBtZXRob2RzIGFuZCBkZWZpbml0aW9ucyB0aGF0IHByb3ZpZGUgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBhY3Jvc3MKKyAqIHRoZSBzaXRlLgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiAKKyAqLworY2xhc3MgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbiB7CisJCisJcHVibGljICRyZXF1ZXN0OworCQorCXB1YmxpYyAkc3VicmVxdWVzdDsKKwkKKwlwdWJsaWMgJGF1dGhlbnRpY2F0aW9uUHJvdmlkZXJJbnN0YW5jZSA9IG51bGw7CisJCisJcHVibGljICRhdXRob3JpemF0aW9uUHJvdmlkZXJJbnN0YW5jZSA9IG51bGw7CisJCisJcHVibGljICRyZXNwb25zZTsKKwkKKwlwdWJsaWMgJHNldHRpbmdzOworCQorCXB1YmxpYyAkbW9kdWxlc0xvYWRlZDsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNldHRpbmdzKSB7CisJCQorCQkvLyBTYXZlIHRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncworCQkkdGhpcy0+c2V0dGluZ3MgPSAkc2V0dGluZ3M7CisJCQorCQkvLyBVcGRhdGUgdGhlIFBIUCBpbmNsdWRlIHBhdGggdG8gaW5jbHVkZSB0aGUgbG9jYXRpb25zIHNwZWNpZmllZCBpbgorCQkvLyB0aGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiAuaW5pIGZpbGUKKwkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snY2xhc3Nlc19kaXInXSkgJiYgaXNfYXJyYXkoJHRoaXMtPnNldHRpbmdzWydjbGFzc2VzX2RpciddKSkgeworCQkJJGN1c3RvbUNsYXNzUGF0aCA9IGltcGxvZGUoJzsnLCR0aGlzLT5zZXR0aW5nc1snY2xhc3Nlc19kaXJzJ10pOworCQkJc2V0X2luY2x1ZGVfcGF0aChnZXRfaW5jbHVkZV9wYXRoKCkgLiAnOycgLiAkY3VzdG9tQ2xhc3NQYXRoKTsKKwkJfQorCQkKKwkJLy8gSW5pdGlhbGl6ZSBhIHNlc3Npb24KKwkJc2Vzc2lvbl9zdGFydCgpOworCQkKKwkJLy8gRGVmaW5lIHRoZSBhcHBsaWNhdGlvbiBiYXNlIHVybAorCQlkZWZpbmUgKCJTSVRFX1JPT1QiLCAoJHNldHRpbmdzWydzaXRlX3Jvb3QnXSA9PSAnLycpIAorCQkJPyAnJyAKKwkJCTogJHNldHRpbmdzWydzaXRlX3Jvb3QnXSk7CisJCQkKKwl9CisJCisJCisJcHVibGljIGZ1bmN0aW9uIGdldFJlc3BvbnNlKCkgeworCQkKKwkJJHRoaXMtPnNldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJJbnN0YW5jZSgpOworCQkkdGhpcy0+c2V0QXV0aG9yaXphdGlvblByb3ZpZGVySW5zdGFuY2UoKTsKKwkJCisJCS8vIEludGVycHJldCB0aGUgcmVxdWVzdCB1cmkgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdAorCQkkdXJpID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3NpdGVfcm9vdCddICE9ICcvJworCQkJPyBzdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sc3RybGVuKEFwcDo6R2V0KCktPnNldHRpbmdzWydzaXRlX3Jvb3QnXSkpCisJCQk6ICRfU0VSVkVSWydSRVFVRVNUX1VSSSddOworCQkkdGhpcy0+cmVxdWVzdCA9IG5ldyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uUmVxdWVzdCgKKwkJCSR0aGlzLT5zZXR0aW5ncywkdXJpKTsKKwkJCQorCQkvLyBJbml0aWFsaXplIGEgcmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgcmVxdWVzdAorCQkkdGhpcy0+cmVzcG9uc2UgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvblJlc3BvbnNlKAorCQkJJHRoaXMtPnNldHRpbmdzLCR0aGlzLT5yZXF1ZXN0KTsKKwkJCQorCQkvLyBQcm9jZXNzIHRoZSByZXNwb25zZQorCQkkdGhpcy0+cmVzcG9uc2UtPnByb2Nlc3MoKTsKKwkJCQorCQkvLyBSZXR1cm4gdGhlIHByb2Nlc3NlZCByZXNwb25zZSBvYmplY3QKKwkJcmV0dXJuICR0aGlzLT5yZXNwb25zZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKSB7CisJCQorCX0KKwkKKwkvKioKKwkgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudCByZXF1ZXN0IG1hcHMgdG8gcmVzb3VyY2VzIGFzc29jaWF0ZWQKKwkgKiB3aXRoIGFuIGFwcGxpY2F0aW9uIG1vZHVsZS4gCisJICogCisJICogSWYgYSB2aWV3LCBzY3JpcHQsIG9yIHN0YXRpYyBhc3NldCBpcyBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uIG1vZHVsZSwKKwkgKiB0aGUgcGF0aCB0byB0aGUgZmlsZSB3aWxsIGRpZmZlciB0aGFuIHRob3NlIGZvciByZWd1bGFyIGFwcGxpY2F0aW9uCisJICogcmVzb3VyY2VzLiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4KKwkgKiByZXF1ZXN0IHNob3VsZCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBtb2R1bGUgb3Igb2YgdGhlIGdlbmVyYWwgCisJICogYXBwbGljYXRpb24uIAorCSAqIAorCSAqIEBwYXJhbSAkcmVxdWVzdFVSSSAtIFRoZSByZXF1ZXN0IHVyaSB0byB0ZXN0CisJICogQHJldHVybiBib29sZWFuICAgIC0gdHJ1ZSBpbmRpY2F0ZXMgdGhlIHJlcXVlc3QgdXJpIGJlbG9uZ3MgdG8gYSBtb2R1bGUKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gaXNNb2R1bGUoJHJlcXVlc3RVUkkpIHsKKwkJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBtb2R1bGUgaXMgYmVpbmcgcmVxdWVzdGVkCisJCSRmaWx0ZXJlZFVSSSA9ICRyZXF1ZXN0VVJJOworCQkkZmlsdGVyZWRVUkkgPSBsdHJpbSgkZmlsdGVyZWRVUkksJy8nKTsKKwkJJHBhcnRzID0gZXhwbG9kZSgnLycsJGZpbHRlcmVkVVJJKTsKKworICAgICAgICBpZiAoaXNfZGlyKEhPTUUgLiAiL21vZHVsZXMiKSkgeworCQkJJGhhbmRsZSA9IG9wZW5kaXIoSE9NRSAuICIvbW9kdWxlcyIpOworCQkJd2hpbGUgKGZhbHNlICE9PSAoJGRpciA9IHJlYWRkaXIoJGhhbmRsZSkpKSB7CisJCQkJaWYgKCAkZGlyID09ICRwYXJ0c1swXSAmJiAkbW9kdWxlID0gJHRoaXMtPmxvYWRNb2R1bGUoJGRpcikgKSB7CisJCQkJCXJldHVybiAkbW9kdWxlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCkgeworCQlyZXR1cm4gJHRoaXMtPmF1dGhlbnRpY2F0aW9uUHJvdmlkZXJJbnN0YW5jZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJJbnN0YW5jZSgpIHsKKwkJCisJCS8vIENoZWNrIGlmIHRoZSB1c2VyIHdhbnRzIGF1dGhlbnRpY2F0aW9uIGZvciBhcHBsaWNhdGlvbiAKKwkJaWYgKCAkdGhpcy0+c2V0dGluZ3NbJ2F1dGhlbnRpY2F0aW9uX2NsYXNzX3BhdGgnXSAhPSBudWxsICYmCisJCQkgJHRoaXMtPnNldHRpbmdzWydhdXRoZW50aWNhdGlvbl9jbGFzcyddICAgICAgIT0gbnVsbCAgICkgeworCQkJIAkKKwkJCSAJcmVxdWlyZV9vbmNlICR0aGlzLT5zZXR0aW5nc1snYXV0aGVudGljYXRpb25fY2xhc3NfcGF0aCddOworCQkJCSRhdXRoUHJvdmlkZXIgPSAkdGhpcy0+c2V0dGluZ3NbJ2F1dGhlbnRpY2F0aW9uX2NsYXNzJ107CisJCQkJJHRoaXMtPmF1dGhlbnRpY2F0aW9uUHJvdmlkZXJJbnN0YW5jZSA9IG5ldyAkYXV0aFByb3ZpZGVyKCk7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcml6YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuICR0aGlzLT5hdXRob3JpemF0aW9uUHJvdmlkZXJJbnN0YW5jZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldEF1dGhvcml6YXRpb25Qcm92aWRlckluc3RhbmNlKCkgeworCQkKKwkJLy8gQ2hlY2sgaWYgdGhlIHVzZXIgd2FudHMgYXV0aG9yaXphdGlvbiBmb3IgYXBwbGljYXRpb24gCisJCWlmICggJHRoaXMtPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2NsYXNzX3BhdGgnXSAhPSBudWxsICYmCisJCQkgJHRoaXMtPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2NsYXNzJ10gICAgICAhPSBudWxsICAgKSB7CisJCQkgCQorCQkJIAlyZXF1aXJlX29uY2UgJHRoaXMtPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2NsYXNzX3BhdGgnXTsKKwkJCQkkYXV0aFByb3ZpZGVyIAkJICAJCQkJID0gJHRoaXMtPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2NsYXNzJ107CisJCQkJJHRoaXMtPmF1dGhvcml6YXRpb25Qcm92aWRlckluc3RhbmNlID0gbmV3ICRhdXRoUHJvdmlkZXIoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbG9hZE1vZHVsZSgkbW9kTmFtZSA9IG51bGwpIHsKKwkJLy8gSWYgdGhlIG1vZHVsZSBuYW1lIGlzIG51bGwsIGEgbW9kdWxlIGlzIHJlcXVlc3RpbmcgdGhhdAorCQkvLyBpdHMgb3duIGNvbnRleHQgYmUgbG9hZGVkCisJCWlmICgkbW9kTmFtZSA9PT0gbnVsbCkgeworCQkJcmV0dXJuICR0aGlzLT5nZXRNb2R1bGVDb250ZXh0KCk7CisJCX0KKworCQkvLyBJZiB0aGUgbW9kdWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgbG9hZGVkLCByZXR1cm4gaXRzIGNvbnRleHQKKwkJaWYgKGlzc2V0KCR0aGlzLT5tb2R1bGVzTG9hZGVkWyRtb2ROYW1lXSkpIHsKKwkJCXJldHVybiAkdGhpcy0+bW9kdWxlc0xvYWRlZFskbW9kTmFtZV07CisJCX0KKworCQkvLyBjaGVjayBpZiBtb2R1bGUgcGF0aCBleGlzdHMgYmVmb3JlIGxvYWRpbmcgbW9kdWxlIGNvbnRleHQKKwkJJG1vZHVsZVBhdGggPSBIT01FIC4gIi9tb2R1bGVzL3skbW9kTmFtZX0iOworCQlpZiAoIGlzX2RpcigkbW9kdWxlUGF0aCkgKSB7CisJCQkKKwkJCS8vIGNyZWF0ZSBzdGRDbGFzcyAKKwkJCSRtb2RDbGFzcyA9IG5ldyBzdGRDbGFzcygpOworCQkJJG1vZENsYXNzLT5tb2R1bGVQYXRoICAgPSAkbW9kdWxlUGF0aDsKKwkJCSRtb2RDbGFzcy0+bW9kdWxlUm9vdCAgID0gU0lURV9ST09UIC4gIi97JG1vZE5hbWV9IjsKKwkJCSRtb2RDbGFzcy0+bW9kdWxlU3RhdGljID0gU0lURV9ST09UIC4gIi9tb2R1bGVzL3skbW9kTmFtZX0vc3RhdGljIjsKKworCQkJJHRoaXMtPm1vZHVsZXNMb2FkZWRbJG1vZE5hbWVdID0gJG1vZENsYXNzOworCisJCQkvLyBSZWFkIGluIHRoZSBtb2R1bGUgY29uZmlnIGZpbGUgYW5kIGFwcGVuZCB0byBhcHBsaWNhdGlvbiBjb25maWcKKwkJCWlmIChmaWxlX2V4aXN0cygkbW9kdWxlUGF0aCAuICcvY29uZmlnLmluaScpKSB7CisJCQkgICAJLy8gR2V0IHRoZSByYXcgY29udGVudHMgb2YgdGhlIGNvbmZpZyBmaWxlCisJCQkgICAJJGluaSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRtb2R1bGVQYXRoIC4gJy9jb25maWcuaW5pJyk7CisJCQkJLy8gUGVyZm9ybSBlbnZpcm9ubWVudCByZXBsYWNlbWVudAorCQkJCSRpbmkgPSBzdHJfcmVwbGFjZSgnW01PRFVMRV9QQVRIXScsICAkbW9kQ2xhc3MtPm1vZHVsZVBhdGgsICAgJGluaSk7CisJCQkJJGluaSA9IHN0cl9yZXBsYWNlKCdbTU9EVUxFX1JPT1RdJywgICRtb2RDbGFzcy0+bW9kdWxlUm9vdCwgICAkaW5pKTsKKwkJCQkkaW5pID0gc3RyX3JlcGxhY2UoJ1tNT0RVTEVfU1RBVElDXScsJG1vZENsYXNzLT5tb2R1bGVTdGF0aWMsICRpbmkpOworCisJCQkJJGluaSA9IHN0cl9yZXBsYWNlKCdbSE9NRV0nLCBIT01FLCAkaW5pKTsKKwkJCQkkaW5pID0gc3RyX3JlcGxhY2UoJ1tTSVRFX1JPT1RdJywgU0lURV9ST09ULCAkaW5pKTsKKworCQkJCS8vIFBhcnNlIHRoZSBlbnYtcmVwbGFjZWQgY29udGVudAorCQkJCSRtb2R1bGVTZXR0aW5ncyAgID0gcGFyc2VfaW5pX3N0cmluZygkaW5pKTsKKwkJCQkvLyBBcHBlbmQgKHVuaW9uKSB3aXRoIGdsb2JhbCBzZXR0aW5ncy4gKz0gZW5zdXJlcyB0aGF0CisJCQkJLy8gYXBwbGljYXRpb24gc2V0dGluZ3MgYWx3YXlzIG92ZXJyaWRlIG1vZHVsZSBzZXR0aW5ncy4KKwkJCQkkdGhpcy0+c2V0dGluZ3MgICs9ICRtb2R1bGVTZXR0aW5nczsKKwkJCX0KKwkJCQorCQkJLy8gUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdAorCQkJcmV0dXJuICRtb2RDbGFzczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gZ2V0TW9kdWxlQ29udGV4dCgkd2hpY2ggPSBudWxsKSB7CisJCQorCQkvLyBJZiBhIG1vZHVsZSBpcyByZXF1ZXN0aW5nIGl0cyBvd24gY29udGV4dC4uLgorCQlpZiAoICR3aGljaCA9PT0gbnVsbCApIHsKKwkJCSRyZXEgPSAoJHRoaXMtPnN1YnJlcXVlc3QgIT0gbnVsbCkgCisJCQkJPyAkdGhpcy0+c3VicmVxdWVzdAorCQkJCTogJHRoaXMtPnJlcXVlc3Q7CisJCQkkdXJpID0gbHRyaW0oJHJlcS0+dXJpLCcvJyk7CisJCQkkbW9kdWxlTmFtZSA9IHN1YnN0cigkdXJpLDAsc3RycG9zKCR1cmksJy8nKSk7CisJCQkJCQkJCisJCQlyZXR1cm4gKCFlbXB0eSgkbW9kdWxlTmFtZSkpIAorCQkJCT8gJHRoaXMtPmxvYWRNb2R1bGUoJG1vZHVsZU5hbWUpCisJCQkJOiBmYWxzZTsKKwkJfSAKKwkJCQkKKwkJLy8gb3RoZXJ3aXNlLCByZXR1cm4gdGhlIHJlc3VsdCBvZiBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIG1vZHVsZQorCQlyZXR1cm4gJHRoaXMtPmxvYWRNb2R1bGUoJHdoaWNoKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTZXRNZXNzYWdlKCRjb250ZW50LCRsZXZlbCA9IENBU19NU0dfSU5GTykgeworCQkKKwkJc3dpdGNoICgkbGV2ZWwpIHsKKwkJCWNhc2UgQ0FTX01TR19XQVJOOgorCQkJCSRfU0VTU0lPTlsnX21lc3NhZ2VzJ11bXSA9ICc8ZGl2IGNsYXNzPSJjYXNfbXNnIHdhcm4iPicgIC4gJGNvbnRlbnQgLiAnPC9kaXY+JzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0FTX01TR19FUlJPUjoKKwkJCQkkX1NFU1NJT05bJ19tZXNzYWdlcyddW10gPSAnPGRpdiBjbGFzcz0iY2FzX21zZyBlcnJvciI+JyAuICRjb250ZW50IC4gJzwvZGl2Pic7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCSRfU0VTU0lPTlsnX21lc3NhZ2VzJ11bXSA9ICc8ZGl2IGNsYXNzPSJjYXNfbXNnIGluZm8iPicgIC4gJGNvbnRlbnQgLiAnPC9kaXY+JzsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldE1lc3NhZ2VzKCkgeworCQkkcmVzcG9uc2UgPSBpc3NldCgkX1NFU1NJT05bJ19tZXNzYWdlcyddKSAKKwkJCT8gaW1wbG9kZSgnJywgJF9TRVNTSU9OWydfbWVzc2FnZXMnXSkKKwkJCTogZmFsc2U7CisJCXVuc2V0KCRfU0VTU0lPTlsnX21lc3NhZ2VzJ10pOworCQlyZXR1cm4gJHJlc3BvbnNlOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gZmF0YWwoJG1lc3NhZ2UpIHsKKwkJQXBwbGljYXRpb25SZXNwb25zZTo6c2VuZEZhdGFsKCRtZXNzYWdlKTsKKwkJZXhpdCgpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEVuZFVzZXJTZXNzaW9uKCkgeworCQkvLyBVbnNldCBhbGwgb2YgdGhlIHNlc3Npb24gdmFyaWFibGVzLgorCQkkX1NFU1NJT04gPSBhcnJheSgpOworCQkKKwkJLy8gRmluYWxseSwgZGVzdHJveSB0aGUgc2Vzc2lvbi4KKwkJc2Vzc2lvbl9kZXN0cm95KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSZWRpcmVjdCgkbmV3TG9jYXRpb24pIHsKKwkJaGVhZGVyKCJMb2NhdGlvbjogeyRuZXdMb2NhdGlvbn0iKTsKKwkJZXhpdCgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgRGF0YVByb3ZpZGVyIGNsYXNzLCBlbnN1cmluZworCSAqIHRoYXQgYWxsIG5lY2Vzc2FyeSBwcmVyZXF1aXNpdGVzIGFyZSBjb3JyZWN0bHkgbG9hZGVkLiBUbyBsb2FkIGEgCisJICogY3VzdG9tIERhdGFQcm92aWRlci4gVGhlIGZyYW1ld29yayBsb29rcyBmb3IgYSBtYXRjaGluZyBkYXRhCisJICogcHJvdmlkZXIgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgaGVpcmFyY2h5LCBzdG9wcGluZyB3aGVuIAorCSAqIGl0IGZpcnN0IGZpbmRzIGEgbWF0Y2hpbmcgY2xhc3M6IElmIHRoZSByZXF1ZXN0IGludm9sdmVzIGEgbW9kdWxlLAorCSAqIHRoYXQgbW9kdWxlJ3MgL2NsYXNzZXMvZGF0YVByb3ZpZGVycyBkaXJlY3RvcnkgaXMgY2hlY2tlZCwgCisJICogb3RoZXJ3aXNlL3RoZW4gdGhlIGFwcGxpY2F0aW9uJ3MgY2xhc3Nlcy9kYXRhUHJvdmlkZXJzIGRpcmVjdG9yeSAKKwkgKiBpcyBjaGVja2VkLCBhbmQgZmluYWxseSAoaWYgbm8gbWF0Y2ggZm91bmQgeWV0KSB0aGUgd2ViYXBwLWJhc2UKKwkgKiAvY2xhc3Nlcy9kYXRhUHJvdmlkZXJzIGRpcmVjdG9yeSBpcyBjaGVja2VkLgorCSAqIERhdGEgcHJvdmlkZXJzIG11c3QgYmUgbmFtZWQgPFByb3ZpZGVyTmFtZT4uY2xhc3MucGhwLCBhbmQgbXVzdCAKKwkgKiBpbXBsZW1lbnQgdGhlIElBcHBsaWNhdGlvbkRhdGFQcm92aWRlciBpbnRlcmZhY2UuCisJICogCisJICogQHBhcmFtICRjbGFzcyAgICAgICAgc3RyaW5nICBUaGUgbmFtZSBvZiB0aGUgRGF0YVByb3ZpZGVyIGNsYXNzCisJICogQHBhcmFtICRvcHRpb25zICAgICAgYXJyYXkgICBvcHRpb25hbCBhcnJheSBvZiBjb25zdHJ1Y3RvciBvcHRpb25zLgorCSAqIAkJCQkJCVRoZXNlIGFyZSBmbG93ZWQgZG93biB0byB0aGUgRGF0YVByb3ZpZGVyJ3MgCisJICogCQkJCQkJY29uc3RydWN0b3IgZnVuY3Rpb24uCisJICogQHJldHVybiB0aGUgZGF0YSBwcm92aWRlciAobXVzdCBpbXBsZW1lbnQgSUFwcGxpY2F0aW9uRGF0YVByb3ZpZGVyKQorCSAqIAorCSAqIEV4YW1wbGU6IHRvIGdldCBhbiBpbnN0YW5jZSBvZiBhIGRhdGEgcHJvdmlkZXI6CisJICogCSAgJHAgPSAkYXBwLT5HZXREYXRhUHJvdmlkZXIoJzxQcm92aWRlck5hbWU+Jyk7CisJICogCisJICogRXhhbXBsZSAyOiB0byBnZXQgYW4gaW5zdGFuY2UgYW5kIHBhc3Mgb3B0aW9ucyB0byB0aGUgY29uc3RydWN0b3IKKwkgKiAgICAkcCA9ICRhcHAtPkdldERhdGFQcm92aWRlcignPFByb3ZpZGVyTmFtZT4nLGFycmF5KCdvcHQxJz0+J3ZhbDEnKSk7CisJICogICAgCisJICogTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHlvdXIgZGF0YSBwcm92aWRlci4KKwkgKiBBbGwgaW1wbGVtZW50YXRpb25zIG9mIElBcHBsaWNhdGlvbkRhdGFQcm92aWRlciBvZmZlciBhIDo6Y29ubmVjdCgpCisJICogZnVuY3Rpb24sIHdoaWNoIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSByZXR1cm5lZCBjbGFzcyB0byBpbml0aWF0ZQorCSAqIGEgY29ubmVjdGlvbi4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0RGF0YVByb3ZpZGVyKCRjbGFzcywkb3B0aW9ucyA9IGFycmF5KCkpIHsKKwkJcmVxdWlyZV9vbmNlKCAiT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25EYXRhUHJvdmlkZXIucGhwIik7CisJCSRkYXRhUHJvdmlkZXJQYXRoID0gIi9jbGFzc2VzL2RhdGFQcm92aWRlcnMveyRjbGFzc30uY2xhc3MucGhwIjsKKwkJCisJCS8vIENoZWNrIGZvciB0aGUgcmVxdWVzdGVkIGRhdGEgcHJvdmlkZXIgaW4gb25lIG9mIDMgbG9jYXRpb25zLiBJdCBjb3VsZCBiZToKKwkJLy8gMSkgUGFydCBvZiBhIG1vZHVsZQorCQlpZiAoJHRoaXMtPnJlcXVlc3QtPmlzTW9kdWxlICYmIAorCQkJaXNfZmlsZSgkdGhpcy0+cmVxdWVzdC0+bW9kdWxlQmFzZSAuICRkYXRhUHJvdmlkZXJQYXRoKSkgeworCQkJcmVxdWlyZV9vbmNlKCR0aGlzLT5yZXF1ZXN0LT5tb2R1bGVCYXNlIC4gJGRhdGFQcm92aWRlclBhdGgpOworCQkJCisJCQlyZXR1cm4gbmV3ICRjbGFzcygkb3B0aW9ucyk7CisJCX0KKwkJCisJCS8vIDIpIFBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uJ3Mgd2lkZ2V0IGNvbGxlY3Rpb24KKwkJaWYgKGlzX2ZpbGUoSE9NRSAuICRkYXRhUHJvdmlkZXJQYXRoKSkgeworCQkJcmVxdWlyZV9vbmNlKEhPTUUgLiAkZGF0YVByb3ZpZGVyUGF0aCk7CisJCQlyZXR1cm4gbmV3ICRjbGFzcygkb3B0aW9ucyk7CisJCX0KKwkJCisJCS8vIDMpIFBhcnQgb2YgdGhlIHdlYmFwcC1iYXNlIHdpZGdldCBjb2xsZWN0aW9uCisJCWlmIChpc19maWxlKExJQiAuICRkYXRhUHJvdmlkZXJQYXRoKSkgeworCQkJcmVxdWlyZV9vbmNlKExJQiAuICRkYXRhUHJvdmlkZXJQYXRoKTsKKwkJCXJldHVybiBuZXcgJGNsYXNzKCRvcHRpb25zKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvclByb3ZpZGVyKAorCQkkY2xhc3MgPSAnT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfUHJvdmlkZXJzX0Vycm9yX0RlZmF1bHRFcnJvclByb3ZpZGVyJywKKwkJJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCQorCQlyZXR1cm4gbmV3ICRjbGFzczsKKwl9CisJCisJCisJLyoqCisJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgd2lkZ2V0IGNsYXNzLiAKKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBwYXJhbSB1bmtub3duX3R5cGUgJGNsYXNzCisJICogQHBhcmFtIHVua25vd25fdHlwZSAkb3B0aW9ucworCSAqLworCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVXaWRnZXQoJGNsYXNzLCRvcHRpb25zID0gYXJyYXkoKSkgeworCQkKKwkJcmVxdWlyZV9vbmNlKCAiT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25XaWRnZXQucGhwIik7CisJCQorCQkkY2xhc3NQYXRoID0gIi9zY3JpcHRzL3dpZGdldHMveyRjbGFzc30ucGhwIjsKKwkJCisJCS8vIENoZWNrIGZvciB0aGUgcmVxdWVzdGVkIHdpZGdldCBpbiBvbmUgb2YgMiBsb2NhdGlvbnMuIEl0IGNvdWxkIGJlOgorCQkvLyAxKSBQYXJ0IG9mIGEgbW9kdWxlCisJCWlmICgkdGhpcy0+cmVxdWVzdC0+aXNNb2R1bGUgJiYgCisJCQlpc19maWxlKCR0aGlzLT5yZXF1ZXN0LT5tb2R1bGVCYXNlIC4gJGNsYXNzUGF0aCkpIHsKKwkJCXJlcXVpcmVfb25jZSgkdGhpcy0+cmVxdWVzdC0+bW9kdWxlQmFzZSAuICRjbGFzc1BhdGgpOworCQkJcmV0dXJuIG5ldyAkY2xhc3MoJG9wdGlvbnMpOworCQl9CisJCQorCQkvLyAyKSBQYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbidzIHdpZGdldCBjb2xsZWN0aW9uCisJCWlmIChpc19maWxlKEhPTUUgLiAkY2xhc3NQYXRoKSkgeworCQkJcmVxdWlyZV9vbmNlKEhPTUUgLiAkY2xhc3NQYXRoKTsKKwkJCXJldHVybiBuZXcgJGNsYXNzKCRvcHRpb25zKTsKKwkJfQorCQkKKwkJLy8gTm8gd2lkZ2V0IG1hdGNoaW5nICRjbGFzcyBmb3VuZC4uLgorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIFRha2UgYW55IGFwcGxpY2F0aW9uIHZpZXcgYW5kICd3aWRnZXRpemUnIGl0LiBUaGlzIGFsbG93cyBkZXZlbG9wZXJzIHRvIG5lc3QKKwkgKiBhcHBsaWNhdGlvbiB2aWV3cywgYWxsb3dpbmcgZm9yIGdyZWF0ZXIgbW9kdWxhcml0eSBhbmQgcmV1c2UuCisJICogCisJICogQXMgYW4gZXhhbXBsZTogZ2l2ZW4gYW4gYXBwbGljYXRpb24gd2l0aCBVUklzICAvZm9vL2JhciBhbmQgZm9vL2JheiAoY29ycmVzcG9uZGluZworCSAqIHRvIEhPTUUvdmlld3MvZm9vL2Jhci5waHAgYW5kIEhPTUUvdmlld3MvZm9vL2Jhei5waHApLCB0aGUgY29udGVudCBvZiAvZm9vL2JheiBjYW4KKwkgKiBiZSAnd2lkZ2V0aXplZCcgKG5lc3RlZCkgd2l0aGluIC9mb28vYmFyIHNpbXBseSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZnJvbSBzb21ld2hlcmUKKwkgKiB3aXRoaW4gdGhlIGhvc3QgdmlldyAoL2Zvby9iYXIpOgorCSAqIAorCSAqIDxkaXY+CisJICogICA8P3BocCBBcHA6OkdldCgpLT53aWRnZXRpemVWaWV3KCcvZm9vL2JheicpOworCSAqIDwvZGl2PgorCSAqIAorCSAqIHdpbGwgcHJvZHVjZToKKwkgKiAKKwkgKiA8ZGl2PgorCSAqICAgPGRpdiBjbGFzcz0iYmFsX3dpZGdldCI+Li4uY29udGVudHMgb2YgSE9NRS92aWV3cy9mb28vYmF6LnBocC4uLjwvZGl2PgorCSAqIDwvZGl2PgorCSAqIAorCSAqIFRoZSBgY3NzQ2xhc3Nlc2AgcGFyYW1ldGVyIGFsbG93cyBmb3Igc3BlY2lmeWluZyBhbnkgY3NzIGNsYXNzIGRlZmluaXRpb25zIHRoYXQgc2hvdWxkCisJICogYmUgYXBwbGllZCB0byB0aGUgd2lkZ2V0IGNvbnRhaW5lci4gRm9yIGV4YW1wbGU6CisJICogCisJICogQXBwOjpHZXQoKS0+d2lkZ2V0aXplVmlldygnL2Zvby9iYXonLCdzb21lQ2xhc3Mgc29tZU90aGVyQ2xhc3MnKTsKKwkgKiAKKwkgKiB3aWxsIHByb2R1Y2U6CisJICogCisJICogPGRpdj4KKwkgKiAgIDxkaXYgY2xhc3M9ImJhbF93aWRnZXQgc29tZUNsYXNzIHNvbWVPdGhlckNsYXNzIj4uLi5jb250ZW50cy4uLjwvZGl2PgorCSAqIDwvZGl2PgorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnRQYXRoICBUaGUgVVJJIHRvIHRoZSB2aWV3IHRvIHdpZGdldGl6ZQorCSAqIEBwYXJhbSBzdHJpbmcgJGNzc0NsYXNzZXMgICBBbnkgY3NzIGNsYXNzZXMgdG8gYXBwZW5kIHRvIHRoZSB3aWRnZXQncyBgY2xhc3Nlc2AgYXR0cmlidXRlCisJICogQHBhcmFtIG1peGVkICAkb3B0aW9ucyAgICAgIEFuIGFycmF5IG9mIG9wdGlvbnMgKGZvciB0aGUgZnV0dXJlLi4uIG5vbmUgZGVmaW5lZCB5ZXQpCisJICovCisJcHVibGljIGZ1bmN0aW9uIHdpZGdldGl6ZVZpZXcoJGNvbnRlbnRQYXRoLCRjc3NDbGFzc2VzID0gJycsJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCisJCS8vIENyZWF0ZSBhIHJlcXVlc3Qgb2JqZWN0IGZvciB0aGUgY29udGVudCB0byBiZSB3aWRnZXRpemVkCisJCSRyZXF1ZXN0ICA9ICR0aGlzLT5zdWJyZXF1ZXN0ID0gbmV3IE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0NvcmVfQXBwbGljYXRpb25SZXF1ZXN0KAorCQkJJHRoaXMtPnNldHRpbmdzLCRjb250ZW50UGF0aCk7CisJCQkKKwkJLy8gU3RvcmUgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3Qgb2JqZWN0IHByaW9yIHRvIHByb2Nlc3NpbmcgdGhpcyBuZXN0ZWQgcmVxdWVzdAorCQkkcGFyZW50UmVxdWVzdCA9ICR0aGlzLT5yZXF1ZXN0OworCQkKKwkJLy8gU3RvcmUgdGhlIG5lc3RlZCByZXF1ZXN0IGluIHRoZSBhcHBsaWNhdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSBhY2Nlc3NlZCBhcworCQkvLyBleHBlY3RlZCB2aWEgQXBwOjpHZXQoKS0+cmVxdWVzdCAoZm9yIGFjY3VyYXRlIHNlZ21lbnQgcHJvY2Vzc2luZywgZm9yIGV4YW1wbGUpCisJCSR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7IAkKKwkJCisJCS8vIEdlbmVyYXRlIGEgcmVzcG9uc2UgZm9yIHRoZSBuZXN0ZWQgcmVxdWVzdAorCQkkcmVzcG9uc2UgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvblJlc3BvbnNlKAorCQkJJHRoaXMtPnNldHRpbmdzLCRyZXF1ZXN0KTsKKwkJJHJlc3BvbnNlLT5wcm9jZXNzKGFycmF5KCdza2lwSGVhZGVyJyA9PiB0cnVlLCdza2lwRm9vdGVyJyA9PiB0cnVlLCdza2lwSG9va3MnID0+IHRydWUpKTsKKwkJCisJCS8vVE9ETzogUHJvY2VzcyBhbnkgb3B0aW9ucyAoc3RpbGwgbmVlZCB0byBkZWZpbmUgdGhlIG9wdGlvbnMgYXZhaWxhYmxlKQorCQkKKwkJLy8gc2VuZCB0aGUgd2lnaXRpemVkIGNvbnRlbnQKKwkJZWNobyAnPGRpdiBjbGFzcz0iYmFsX3dpZGdldCAnIC4gJGNzc0NsYXNzZXMgLiAnIj4nCisJCQkuICRyZXNwb25zZS0+Z2V0Vmlld0NvbnRlbnQoKQorCQkJLiAnPC9kaXY+JzsKKwkJCQorCQkvLyBSZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0CisJCSR0aGlzLT5yZXF1ZXN0ICAgID0gJHBhcmVudFJlcXVlc3Q7CisJCSR0aGlzLT5zdWJyZXF1ZXN0ID0gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQ29yZS9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZS5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQ29yZS9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZS5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4ZDEyYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Db3JlL0FwcGxpY2F0aW9uRGF0YVJlc3BvbnNlLmNsYXNzLnBocApAQCAtMCwwICsxLDgxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIAorICogT09EVCBCYWxhbmNlCisgKiBXZWIgQXBwbGljYXRpb24gQmFzZSBGcmFtZXdvcmsKKyAqIAorICogQXBwbGljYXRpb25EYXRhUmVzcG9uc2UgcHJvdmlkZXMgYSBzdGFuZGFyZCByZXNwb25zZSBvYmplY3QgZm9yIHVzZSBieSBhcHBsaWNhdGlvbgorICogZGF0YSBwcm92aWRlcnMuIAorICogCisgKiBUaGUgQXBwbGljYXRpb25EYXRhUmVzcG9uc2Ugd29ya3Mgb2ZmIG9mIHRoZSBpZGVhIHRoYXQgdGhlIEtFWT0+VkFMVUUgcGFyYWRpZ20KKyAqIGlzIG1vcmUgb3IgbGVzcyB1bml2ZXJzYWwgYW5kIHN1aXRzIChvciBpcyBhdCBsZWFzdCBjb21wYXRpYmxlIHdpdGgpIGEgYnJvYWQgYXJyYXkKKyAqIG9mIGRhdGEgc291cmNlcy4gQnkgZ3VhcmFudGVlaW5nIHRoYXQgYWxsIGRhdGEgcHJvdmlkZXJzIHdpbGwgcmV0dXJuIG9iamVjdHMgb2YgdGhpcyB0eXBlCisgKiBpbiByZXNwb25zZSB0byBkYXRhIHJlcXVlc3RzLCBpdCBpcyBwb3NzaWJsZSB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiBpbnRlZ3JhdGluZworICogYW5kIGFzc2ltaWxhdGluZyBkYXRhIGZyb20gbXVsdGlwbGUgaGV0ZXJvZ2VuZW91cyBzb3VyY2VzCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqIAorICovCitjbGFzcyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uRGF0YVJlc3BvbnNlIHsKKwkKKwlwdWJsaWMgJHJlcXVlc3RTdHJpbmc7CisJcHVibGljICRkYXRhOworCXB1YmxpYyAkZXJyb3JPY2N1cnJlZDsKKwlwdWJsaWMgJGVycm9yTWVzc2FnZTsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNlZWQgPSBhcnJheSgpKSB7CisJCSR0aGlzLT5kYXRhID0gJHNlZWQ7CisJCSR0aGlzLT5lcnJvck9jY3VycmVkID0gZmFsc2U7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBzaXplKCkgeworCQlyZXR1cm4gY291bnQoJHRoaXMtPmRhdGEpOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gY291bnQoKSB7CisJCXJldHVybiBjb3VudCgkdGhpcy0+ZGF0YSk7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBhZGQoJGtleSwkdmFsdWUpIHsKKwkJJHRoaXMtPmRhdGFbJGtleV0gPSAkdmFsdWU7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBidWxrQWRkKCRkYXRhKSB7CisJCSR0aGlzLT5kYXRhID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmRhdGEsJGRhdGEpOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gZ2V0KCRrZXkpIHsKKwkJcmV0dXJuIChpc3NldCgkdGhpcy0+ZGF0YVsna2V5J10pKQorCQkJPyAkdGhpcy0+ZGF0YVsna2V5J10KKwkJCTogZmFsc2U7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBzZXRSZXF1ZXN0U3RyaW5nKCRyZXF1ZXN0KSB7CisJCSR0aGlzLT5yZXF1ZXN0U3RyaW5nID0gJHJlcXVlc3Q7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBlcnJvcigpIHsKKwkJcmV0dXJuICgkdGhpcy0+ZXJyb3JPY2N1cnJlZCk7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvcigkbWVzc2FnZSkgeworCQkkdGhpcy0+ZXJyb3JPY2N1cnJlZCA9IHRydWU7CisJCSR0aGlzLT5lcnJvck1lc3NhZ2UgID0gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQ29yZS9BcHBsaWNhdGlvblJlcXVlc3QuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZkNjJiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmNsYXNzLnBocApAQCAtMCwwICsxLDE3MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiAKKyAqIE9PRFQgQmFsYW5jZQorICogV2ViIEFwcGxpY2F0aW9uIEJhc2UgRnJhbWV3b3JrCisgKiAKKyAqIEFwcGxpY2F0aW9uUmVxdWVzdDogUHJvdmlkZXMgbWV0aG9kcyBmb3IgaW50ZXJwcmV0aW5nIGFuZCBwcm9jZXNzaW5nCisgKiBhIHJlc291cmNlIHJlcXVlc3QuCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqIAorICovCitjbGFzcyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uUmVxdWVzdCB7CisJCisJcHVibGljICRpc1NjcmlwdDsKKwkKKwlwdWJsaWMgJGNvbmZpZzsKKwkKKwlwdWJsaWMgJHVyaTsKKwkKKwlwdWJsaWMgJHNlZ21lbnRzOworCQorCXB1YmxpYyAkZGF0YTsKKwkKKwlwdWJsaWMgJHZpZXdQYXRoOworCQorCXB1YmxpYyAkc2NyaXB0UGF0aDsKKwkKKwlwdWJsaWMgJGlzTW9kdWxlOworCQorCXB1YmxpYyAkbW9kdWxlUGF0aDsJLy8gRmlsZXN5c3RlbSBwYXRoIGZvciBtb2R1bGUKKworCXB1YmxpYyAkbW9kdWxlUm9vdDsJLy8gVVJMIGJhc2UgZm9yIG1vZHVsZQorCisJcHVibGljICRtb2R1bGVTdGF0aWM7CS8vIFVSTCBiYXNlIGZvciAgc3RhdGljIG1vZHVsZSBhc3Nlc3RzIChpbWFnZXMsY3NzLGpzLGV0YykKKworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkY29uZmlnLCRyZXF1ZXN0VVJJKSB7CisJCQorCQkvLyBEZXRlcm1pbmUgaWYgdGhpcyByZXF1ZXN0IGlzIGEgc2NyaXB0IG9yIGEgdmlldworCQkkdGhpcy0+aXNTY3JpcHQgPSAkdGhpcy0+aXNTY3JpcHQoJHJlcXVlc3RVUkkpOworCQorCQkvLyBTdG9yZSB0aGUgY29uZmlnIGFzIHByb3ZpZGVkCisJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOworCQkKKwkJLy8gU3RvcmUgdGhlIHVyaSBhcyBwcm92aWRlZAorCQkkdGhpcy0+dXJpID0gaHRtbGVudGl0aWVzKCRyZXF1ZXN0VVJJKTsKKwkJCisJCS8vIEluaXRpYWxpemUgdGhlIHNlZ21lbnRzIGFuZCB2aWV3IHBhdGgKKwkJJHRoaXMtPnNlZ21lbnRzID0gYXJyYXkoKTsKKwkJJHRoaXMtPnZpZXdQYXRoID0gZmFsc2U7CisJCQorCQkvLyBTdG9yZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdAorCQkkdGhpcy0+ZGF0YSA9ICRfR0VUOworCQkkdGhpcy0+ZGF0YSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhLCRfUE9TVCk7CisJCQorCQlpZiAoJHRoaXMtPmlzU2NyaXB0KSB7CisJCQkkdGhpcy0+cHJvY2Vzc0FzU2NyaXB0KCk7CisJCX0gZWxzZSB7CisJCQkkdGhpcy0+cHJvY2Vzc0FzVmlldygpOworCQl9CisJfSAKKwkKKwlwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc0FzVmlldygpIHsKKwkJLy8gRGV0ZXJtaW5lIHRoZSB2aWV3IHRvIHVzZQorCQlsaXN0KCR0aGVQYWdlKSA9IGV4cGxvZGUoJ2luZGV4LnBocCcsIHBhcnNlX3VybCgkdGhpcy0+dXJpLCBQSFBfVVJMX1BBVEgpKTsgLy8gd2Ugb25seSBjYXJlIGFib3V0IFVSTCBwYXRoIGluZm8KKwkJJHRoZVBhZ2UgPSBsdHJpbSgkdGhlUGFnZSwnLycpOworCisJCWlmICgkdGhlUGFnZSA9PSAnJykgeyAkdGhlUGFnZSA9ICdpbmRleCc7IH0JCisJCSRwYXJ0cyA9IGV4cGxvZGUoJy8nLCR0aGVQYWdlKTsKKworCQkvLyBEZXRlcm1pbmUgd2hldGhlciBhIG1vZHVsZSBpcyBiZWluZyByZXF1ZXN0ZWQKKwkJJG1vZHVsZSA9IEFwcDo6R2V0KCktPmlzTW9kdWxlKCR0aGVQYWdlKTsKKwkJCisJCWlmICgkbW9kdWxlKSB7CisJCQkkdGhpcy0+aXNNb2R1bGUgICA9IHRydWU7CisJCQkkdGhpcy0+bW9kdWxlUGF0aCAgID0gJG1vZHVsZS0+bW9kdWxlUGF0aDsKKyAgICAgICAgICAgICR0aGlzLT5tb2R1bGVSb290ICAgPSAkbW9kdWxlLT5tb2R1bGVSb290OworICAgICAgICAgICAgJHRoaXMtPm1vZHVsZVN0YXRpYyA9ICRtb2R1bGUtPm1vZHVsZVN0YXRpYzsKKwkJCWFycmF5X3NoaWZ0KCRwYXJ0cyk7CisJCX0KKworCQkvLyBTdGFydGluZyB3aXRoIHRoZSBmdWxsIHJlcXVlc3Qgc3RyaW5nLCB0ZXN0IGZvciB0aGUgZXhpc3RhbmNlIG9mCisJCS8vIGEgY29ycmVzcG9uZGluZyB2aWV3LiBJZiBub25lIGlzIGZvdW5kIGluIHRoZSBIT01FCisJCS8vIGRpcmVjdG9yeSwgY2hvcCBvZmYgdGhlIGxhc3Qgc2VnbWVudCBhbmQgdHJ5IGFnYWluLiBBZGQgdGhlIGNob3BwZWQKKwkJLy8gc2VnbWVudCB0byB0aGUgInNlZ21lbnRzIiBhcnJheSBzaW5jZSBpdCBpcyBsaWtlbHkgYSBwYXJhbWV0ZXIuCisJCSRwYXJ0Q291bnQgPSBjb3VudCgkcGFydHMpOworCisJCS8vIGNoZWNrIGZvciB2aWV3IGF0IGxlYXN0IG9uY2UKKwkJZG8geworCQkJJHRlc3RQYXRoICAgID0gaW1wbG9kZSgnLycsJHBhcnRzKTsKKwkJCSRob21lVGVzdCAgICA9ICgoJHRoaXMtPmlzTW9kdWxlKSA/ICJ7JHRoaXMtPm1vZHVsZVBhdGh9L3ZpZXdzIiA6ICR0aGlzLT5jb25maWdbJ3ZpZXdzX2RpciddKSAuICcvJyAuICR0ZXN0UGF0aCAuICcucGhwJzsKKwkJCSRob21lSWR4VGVzdCA9ICgoJHRoaXMtPmlzTW9kdWxlKSA/ICJ7JHRoaXMtPm1vZHVsZVBhdGh9L3ZpZXdzIiA6ICR0aGlzLT5jb25maWdbJ3ZpZXdzX2RpciddKSAuICcvJyAuICR0ZXN0UGF0aCAuICcvaW5kZXgucGhwJzsKKwkJCQorCQkJCisJCQlpZiAoaXNfZmlsZSgkaG9tZVRlc3QpKSB7IAorCQkJCSR0aGlzLT52aWV3UGF0aCA9ICRob21lVGVzdDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpc19maWxlKCRob21lSWR4VGVzdCkpIHsKKwkJCQkkdGhpcy0+dmlld1BhdGggPSAkaG9tZUlkeFRlc3Q7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCS8vIElmIGhlcmUsIG5laXRoZXIgaXMgYSB2YWxpZCB2aWV3LCBzbyBjaG9wIHRoZSBsYXN0IHNlZ21lbnQKKwkJCSR0aGlzLT5zZWdtZW50c1tdID0gJHBhcnRzWyRwYXJ0Q291bnQgLSAxXTsKKwkJCWFycmF5X3BvcCgkcGFydHMpOworCQkJJHBhcnRDb3VudC0tOworCQl9IHdoaWxlICgkcGFydENvdW50ID4gMCk7CisJCQorCQkvLyBJZiBubyB2aWV3IGhhcyBiZWVuIGZvdW5kIGJ5IHRoaXMgcG9pbnQsIGRpc3BsYXkgYSA0MDQgbWVzc2FnZQorCQlpZiAoISR0aGlzLT52aWV3UGF0aCkgeworCQkJJHRoaXMtPnZpZXdQYXRoID0gZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkgLiAiL3ZpZXdzL2Vycm9yLzQwNC5waHAiOworCQl9CisJCQorCQkvLyBSZXZlcnNlIHRoZSBzZWdtZW50cyBhcnJheSBzbyB0aGF0IHBhcmFtcyBhcHBlYXIgaW4gdGhlIHByb3BlciBvcmRlcgorCQkkdGhpcy0+c2VnbWVudHMgPSBhcnJheV9yZXZlcnNlKCR0aGlzLT5zZWdtZW50cyk7CisJfQorCQorCXByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzQXNTY3JpcHQoKSB7CisJCQorCQkvLyBEZXRlcm1pbmUgdGhlIGRlc2lyZWQgc2NyaXB0CisJCWxpc3QoJHRoZVNjcmlwdCkgPSBleHBsb2RlKCJfaW5pdC5waHAiLCR0aGlzLT51cmkpOworCQlpZiAoJEdMT0JBTFNbJ2FwcCddLT5zZXR0aW5nc1snc2l0ZV9yb290J10gIT0gJy8nKSB7CisJCQkkdGhlU2NyaXB0ICAgPSBzdHJfcmVwbGFjZSgkR0xPQkFMU1snYXBwJ10tPnNldHRpbmdzWydzaXRlX3Jvb3QnXSwnJywkdGhlU2NyaXB0KTsKKwkJfQorCQkkdGhlU2NyaXB0ICAgICAgID0gc3RyX3JlcGxhY2UoIi5kbyIsIi5waHAiLCR0aGVTY3JpcHQpOworCQkkdGhlU2NyaXB0ICAgICAgID0gc3RycG9zKCR0aGVTY3JpcHQsJz8nKSAKKwkJCT8gc3Vic3RyKCR0aGVTY3JpcHQsMCxzdHJwb3MoJHRoZVNjcmlwdCwnPycpKQorCQkJOiAkdGhlU2NyaXB0OworCQkkdGhlU2NyaXB0ICAgICAgID0gbHRyaW0oJHRoZVNjcmlwdCwnLycpOworCQkkbW9kdWxlICAgICAgICAgID0gJEdMT0JBTFNbJ2FwcCddLT5pc01vZHVsZSgkdGhlU2NyaXB0KTsKKwkJaWYgKCRtb2R1bGUpIHsKKwkJCSR0aGlzLT5pc01vZHVsZSAgID0gdHJ1ZTsKKwkJCSR0aGlzLT5tb2R1bGVQYXRoICAgPSAkbW9kdWxlLT5tb2R1bGVQYXRoOworICAgICAgICAgICAgJHRoaXMtPm1vZHVsZVJvb3QgICA9ICRtb2R1bGUtPm1vZHVsZVJvb3Q7CisgICAgICAgICAgICAkdGhpcy0+bW9kdWxlU3RhdGljID0gJG1vZHVsZS0+bW9kdWxlU3RhdGljOworCQkJJHRoZVNjcmlwdCAgICAgICAgPSBzdWJzdHIoJHRoZVNjcmlwdCxzdHJwb3MoJHRoZVNjcmlwdCwnLycpKzEpOworCQkJJHBhdGggICAgICAgICAgICAgPSAkbW9kdWxlLT5tb2R1bGVQYXRoIC4gIi9zY3JpcHRzL3skdGhlU2NyaXB0fSI7CisJCX0gZWxzZSB7CisJCQkkcGF0aCA9IEhPTUUgLiAiL3NjcmlwdHMveyR0aGVTY3JpcHR9IjsKKwkJfQorCQkKKwkJJHRoaXMtPnNjcmlwdFBhdGggICA9ICRwYXRoOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNTY3JpcHQoJHJlcXVlc3RVUkkpIHsKKwkJLy8gSXMgdGhpcyBhIHNjcmlwdD8gKGRvZXMgdGhlIHNjcmlwdCBmaWxlbmFtZSBlbmQgaW4gLmRvPykKKwkJJHRlc3QgPSAkcmVxdWVzdFVSSTsKKwkJaWYgKHN0cnBvcygkdGVzdCwnPycpKSB7CisJCQkkdGVzdCA9IHN1YnN0cigkdGVzdCwwLHN0cnBvcygkdGVzdCwnPycpKTsKKwkJfQorCQlyZXR1cm4gKHN1YnN0cigkdGVzdCwtMywzKSA9PSAnLmRvJyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0NvcmUvQXBwbGljYXRpb25SZXNwb25zZS5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvQ29yZS9BcHBsaWNhdGlvblJlc3BvbnNlLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmU5YjhkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0NvcmUvQXBwbGljYXRpb25SZXNwb25zZS5jbGFzcy5waHAKQEAgLTAsMCArMSwzMTEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBBcHBsaWNhdGlvblJlc3BvbnNlOiBQcm92aWRlcyBmdW5jdGlvbnMgZm9yIGR5bmFtaWNhbGx5IGNvbnN0cnVjdGluZworICogYW5kIGRlbGl2ZXJpbmcgYSByZXNwb25zZSB0byBhIHJlc291cmNlIHJlcXVlc3QuCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqIAorICovCitjbGFzcyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uUmVzcG9uc2UgeworCQorCXByb3RlY3RlZCAkY29uZmlnOworCXByb3RlY3RlZCAkcmVxdWVzdDsKKwkKKwlwcm90ZWN0ZWQgJGhlYWRlcnM7CisJCisJcHJvdGVjdGVkICRoZWFkZXI7CisJcHJvdGVjdGVkICR2aWV3OworCXByb3RlY3RlZCAkZm9vdGVyOworCQorCXByb3RlY3RlZCAkc3R5bGVzaGVldHMgPSBhcnJheSgpOworCXByb3RlY3RlZCAkamF2YXNjcmlwdHMgPSBhcnJheSgpOworCQorCXByb3RlY3RlZCAkZGF0YTsKKworCWNvbnN0IERZTl9KU19UQUcgID0gJzwhLS0gSkFWQVNDUklQVFMgLS0+JzsKKwljb25zdCBEWU5fQ1NTX1RBRyA9ICc8IS0tIFNUWUxFU0hFRVRTIC0tPic7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgJGNvbmZpZworCSAqIEBwYXJhbSBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uUmVxdWVzdCAkcmVxdWVzdAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkY29uZmlnLCAKKwkJT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvblJlcXVlc3QgJHJlcXVlc3QpIHsKKwkJCisJCSR0aGlzLT5jb25maWcgICA9ICRjb25maWc7CisJCQorCQkkdGhpcy0+cmVxdWVzdCA9ICRyZXF1ZXN0OworCQkKKwkJJHRoaXMtPmhlYWRlcnMgID0gYXJyYXkoKTsKKwkJCisJCSR0aGlzLT5oZWFkZXIgICA9IEhPTUUgLiAiL3skY29uZmlnWydoZWFkZXJfZmlsZV9wYXRoJ119IjsKKwkJJHRoaXMtPmZvb3RlciAgID0gSE9NRSAuICIveyRjb25maWdbJ2Zvb3Rlcl9maWxlX3BhdGgnXX0iOworCX0KKwkKKwkvKioKKwkgKiBHZW5lcmF0ZXMgYSByZXNwb25zZSBieSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0ZWQgdmlldywKKwkgKiBpbmNsdWRpbmcgYW55IGhlYWRlciBhbmQgZm9vdGVyIHZpZXdzIChpZiBuZWVkZWQpIGFzIHNwZWNpZmllZAorCSAqIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb25maWcgZmlsZS4KKwkgKiAKKwkgKiBBdmFpbGFibGUgb3B0aW9uczoKKwkgKiAgIHNraXBIZWFkZXI6IGJvb2xlYW4gKGRlZmF1bHQgPSBmYWxzZSkgSWYgcHJlc2VudCwgb21pdHMgaGVhZGVyIHByb2Nlc3NpbmcKKwkgKiAgIHNraXBGb290ZXI6IGJvb2xlYW4gKGRlZmF1bHQgPSBmYWxzZSkgSWYgcHJlc2VudCwgb21pdHMgZm9vdGVyIHByb2Nlc3NpbmcKKwkgKiAgIHNraXBIb29rczogIGJvb2xlYW4gKGRlZmF1bHQgPSBmYWxzZSkgSWYgcHJlc2VudCwgb21pdHMgaG9vayBwcm9jZXNzaW5nCisJICoKKwkgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzcygkb3B0aW9ucyA9IGFycmF5KCkpIHsKKwkJCisJCS8vIE1lcmdlIGRlZmF1bHRzIHdpdGggcHJvdmlkZWQgb3B0aW9ucworCQkkZGVmYXVsdHMgPSBhcnJheSgKKwkJCSdza2lwSGVhZGVyJyA9PiBmYWxzZSwKKwkJCSdza2lwRm9vdGVyJyA9PiBmYWxzZSwKKwkJCSdza2lwSG9va3MnICA9PiBmYWxzZSwKKwkJKTsKKwkJJG9wdGlvbnMgKz0gJGRlZmF1bHRzOworCQkKKwkJaWYgKCEkb3B0aW9uc1snc2tpcEhvb2tzJ10pIHsKKwkJICAgLy8gSW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgaG9va3MucGhwIGZpbGUKKwkJICAgaW5jbHVkZSAoKEFwcDo6R2V0KCktPnJlcXVlc3QtPmlzTW9kdWxlCisJCSAgIAkgICA/IEFwcDo6R2V0KCktPnJlcXVlc3QtPm1vZHVsZVBhdGgKKwkJCSAgIDogSE9NRSApIC4gJy9ob29rcy5waHAnKTsKKworCQkgICAvLyBSdW4gJ2JlZm9yZV9hbGwnIGhvb2sgZm9yIGFsbCByZXF1ZXN0cworCQkgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdob29rX2JlZm9yZV9hbGwnKSkgeworCQkgICAgICBob29rX2JlZm9yZV9hbGwoKTsKKwkJICAgfQorCQl9CisKKwkJLy8gUHJlcHJvY2Vzc2luZyBmb3IgYSB2aWV3CisJCWlmICghJHRoaXMtPnJlcXVlc3QtPmlzU2NyaXB0KSB7CisJCQlvYl9zdGFydCgpOwkvLyBTdGFydCBidWZmZXJpbmcgdGhlIG91dHB1dAorCQkJCisJCQkvLyBDaGVjayB0aGF0IHRoZSByZXF1ZXN0ZWQgdmlldyBleGlzdHMKKwkJCWlmIChmaWxlX2V4aXN0cygkdGhpcy0+cmVxdWVzdC0+dmlld1BhdGgpKSB7CisJCQkJCisJCQkJLy8gUnVuIHRoZSBiZWZvcmVWaWV3IGhvb2sKKwkJCQlpZiAoISRvcHRpb25zWydza2lwSG9va3MnXSAmJiBmdW5jdGlvbl9leGlzdHMoJ2hvb2tfYmVmb3JlX3ZpZXcnKSkgeworCQkJCQlob29rX2JlZm9yZV92aWV3KCk7CisJCQkJfQorCQkJCS8vIFByb2Nlc3MgdGhlIHZpZXcKKwkJCQlpbmNsdWRlKCR0aGlzLT5yZXF1ZXN0LT52aWV3UGF0aCk7CisJCQl9IGVsc2UgeyAKKwkJCQlpbmNsdWRlKEhPTUUgLiAiL3ZpZXdzL2Vycm9ycy80MDQucGhwIik7IC8vIDQwNCBlcnJvciBwYWdlCisJCQl9CisJCQkKKwkJCSR0aGlzLT52aWV3ID0gb2JfZ2V0X2NvbnRlbnRzKCk7CisJCQlvYl9jbGVhbigpOworCQkJCisJCQkvLyBEZXRlcm1pbmUgdGhlIGhlYWRlciB2aWV3IChpZiBhbnkpIHRvIGluY2x1ZGUKKwkJCWlmICghJG9wdGlvbnNbJ3NraXBIZWFkZXInXSAmJiAkdGhpcy0+aGVhZGVyICYmIGlzX2ZpbGUoJHRoaXMtPmhlYWRlcikpIHsKKwkJCQkvLyBSdW4gdGhlIGJlZm9yZUhlYWRlciBob29rCisJCQkJaWYgKCEkb3B0aW9uc1snc2tpcEhvb2tzJ10gJiYgZnVuY3Rpb25fZXhpc3RzKCdob29rX2JlZm9yZV9oZWFkZXInKSkgeworCQkJCQlob29rX2JlZm9yZV9oZWFkZXIoKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gUHJvY2VzcyB0aGUgaGVhZGVyCisJCQkJaWYgKCFlbXB0eSgkdGhpcy0+aGVhZGVyKSkge2luY2x1ZGUoJHRoaXMtPmhlYWRlcik7fQorCisJCQkJJHRoaXMtPmhlYWRlciA9IG9iX2dldF9jb250ZW50cygpOworCQkJCW9iX2NsZWFuKCk7CisJCQl9CisJCQkKKwkJCS8vIERldGVybWluZSB0aGUgZm9vdGVyIHZpZXcgKGlmIGFueSkgdG8gaW5jbHVkZQorCQkJaWYgKCEkb3B0aW9uc1snc2tpcEZvb3RlciddICYmICR0aGlzLT5mb290ZXIgJiYgaXNfZmlsZSgkdGhpcy0+Zm9vdGVyKSkgeworCQkJCS8vIFJ1biB0aGUgYmVmb3JlRm9vdGVyIGhvb2sKKwkJCQlpZiAoISRvcHRpb25zWydza2lwSG9va3MnXSAmJiBmdW5jdGlvbl9leGlzdHMoJ2hvb2tfYmVmb3JlX2Zvb3RlcicpKSB7CisJCQkJCWhvb2tfYmVmb3JlX2Zvb3RlcigpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBQcm9jZXNzIHRoZSBmb290ZXIKKwkJCQlpZiAoIWVtcHR5KCR0aGlzLT5mb290ZXIpKSB7aW5jbHVkZSgkdGhpcy0+Zm9vdGVyKTt9CisJCQkJCisJCQkJJHRoaXMtPmZvb3RlciA9IG9iX2dldF9jb250ZW50cygpOworCQkJCW9iX2NsZWFuKCk7CisJCQl9CisKKwkJCW9iX2VuZF9jbGVhbigpOwkvLyBTdG9wIGJ1ZmZlcmluZyB0aGUgb3V0cHV0CisJCX0gZWxzZSB7CisJCQlyZXF1aXJlX29uY2UoICR0aGlzLT5yZXF1ZXN0LT5zY3JpcHRQYXRoICk7CisJCQlleGl0KCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQWN0dWFsbHkgc2VuZHMgdGhlIHJlc3BvbnNlICh1c2luZyAnZWNobycpIG91dCB0byB0aGUgCisJICogY2xpZW50J3MgYnJvd3Nlci4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gc2VuZCgpIHsKKwkJCisJCWlmICgkdGhpcy0+cmVxdWVzdC0+aXNTY3JpcHQpIHsJCisJCQlpZiAoaXNfZmlsZSgkdGhpcy0+cmVxdWVzdC0+c2NyaXB0UGF0aCkpIHsKKwkJCQlyZXF1aXJlX29uY2UoJHRoaXMtPnJlcXVlc3QtPnNjcmlwdFBhdGgpOworCQkJfSBlbHNlIHsKKwkJCQloZWFkZXIoIkxvY2F0aW9uOiAiIC4gU0lURV9ST09UIC4gIi9lcnJvcnMvNDA0Iik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBQcm9jZXNzIGFueSBkeW5hbWljYWxseSBhZGRlZCBjb250ZW50CisJCQkkdGhpcy0+cHJvY2Vzc0R5bmFtaWNDb250ZW50KCk7CisJCQkKKwkJCS8vIFJ1biB0aGUgYmVmb3JlU2VuZCBob29rCisJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdob29rX2JlZm9yZV9zZW5kJykpIHsKKwkJCQlob29rX2JlZm9yZV9zZW5kKCk7CisJCQl9CisJCQlmb3JlYWNoICgkdGhpcy0+aGVhZGVycyBhcyAkaGVhZGVyKSB7CisJCQkJaGVhZGVyKCRoZWFkZXIpOworCQkJfQorCQkJaWYgKCR0aGlzLT5oZWFkZXIpIHsKKwkJCQllY2hvICR0aGlzLT5oZWFkZXI7CisJCQl9CisJCQllY2hvICR0aGlzLT52aWV3OworCQkJaWYgKCR0aGlzLT5mb290ZXIpIHsKKwkJCQllY2hvICR0aGlzLT5mb290ZXI7CisJCQl9CisJCQkvLyBSdW4gdGhlIGFmdGVyU2VuZCBob29rCisJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdob29rX2FmdGVyX3NlbmQnKSkgeworCQkJCWhvb2tfYWZ0ZXJfc2VuZCgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZW5kRmF0YWwoJG1lc3NhZ2UpIHsKKwkJLy8gU3RvcmUgdGhlIG1lc3NhZ2UgaW4gdGhlIHNlc3Npb24KKwkJJF9TRVNTSU9OWydmYWlsX21lc3NhZ2UnXSA9ICRtZXNzYWdlOworCQkKKwkJLy8gQ2xlYXIgYW55IG9sZCBvdXRwdXQgYW5kIHJlc3RhcnQgYnVmZmVyaW5nIHRoZSBvdXRwdXQKKwkJb2JfY2xlYW4oKTsKKwkJb2Jfc3RhcnQoKTsKKwkKKwkJLy8gQnVpbGQgdGhlIDQwNCBlcnJvciBwYWdlCisJCWluY2x1ZGUoTElCIC4gIi92aWV3cy9lcnJvcnMvZmFpbC5waHAiKTsKKwkJCisJCS8vIEdldCB0aGUgY29udGVudHMgYXMgYSBzdHJpbmcgYW5kIGZsdXNoIHRoZSBidWZmZXIKKwkJJGNvbnRlbnQgPSBvYl9nZXRfY29udGVudHMoKTsKKwkJCisJCS8vIFN0b3AgYnVmZmVyaW5nIG91dHB1dAorCQlvYl9lbmRfY2xlYW4oKTsKKwkJCisJCS8vIFNlbmQgdGhlIHJlc3BvbnNlCisJCWVjaG8gJGNvbnRlbnQ7CisJCQorCQlleGl0KCk7CisJfQorCQorCS8qKgorCSAqIFJlcGxhY2Ugc3BlY2lhbCB0YWdzIHdpdGggdGhlaXIgZHluYW1pY2FsbHkgYXNzaWduZWQgY29udGVudC4gQ3VycmVudGx5LCB0aGUgb25seQorCSAqIHNwZWNpYWwgdGFncyBhcmUgZm9yIGRlZmluaW5nIGFuIGFyZWEgZm9yIENTUyBhbmQgSmF2YVNjcmlwdCBpbXBvcnRzLgorCSAqIAorCSAqLworCXByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzRHluYW1pY0NvbnRlbnQoKSB7CisJCQorCQkvLyBEeW5hbWljYWxseSBpbnNlcnQgQ1NTCisJCSR0aGlzLT5oZWFkZXIgPSBzdHJfcmVwbGFjZShzZWxmOjpEWU5fQ1NTX1RBRyxpbXBsb2RlKCJcclxuIiwkdGhpcy0+c3R5bGVzaGVldHMpLCR0aGlzLT5oZWFkZXIpOworCQkkdGhpcy0+dmlldyAgID0gc3RyX3JlcGxhY2Uoc2VsZjo6RFlOX0NTU19UQUcsaW1wbG9kZSgiXHJcbiIsJHRoaXMtPnN0eWxlc2hlZXRzKSwkdGhpcy0+dmlldyk7CisJCSR0aGlzLT5mb290ZXIgPSBzdHJfcmVwbGFjZShzZWxmOjpEWU5fQ1NTX1RBRyxpbXBsb2RlKCJcclxuIiwkdGhpcy0+c3R5bGVzaGVldHMpLCR0aGlzLT5mb290ZXIpOworCQkKKwkJLy8gRHluYW1pY2FsbHkgaW5zZXJ0IEpTCisJCSR0aGlzLT5oZWFkZXIgPSBzdHJfcmVwbGFjZShzZWxmOjpEWU5fSlNfVEFHLGltcGxvZGUoIlxyXG4iLCR0aGlzLT5qYXZhc2NyaXB0cyksJHRoaXMtPmhlYWRlcik7CisJCSR0aGlzLT52aWV3ICAgPSBzdHJfcmVwbGFjZShzZWxmOjpEWU5fSlNfVEFHLGltcGxvZGUoIlxyXG4iLCR0aGlzLT5qYXZhc2NyaXB0cyksJHRoaXMtPnZpZXcpOworCQkkdGhpcy0+Zm9vdGVyID0gc3RyX3JlcGxhY2Uoc2VsZjo6RFlOX0pTX1RBRyxpbXBsb2RlKCJcclxuIiwkdGhpcy0+amF2YXNjcmlwdHMpLCR0aGlzLT5mb290ZXIpOworCQkKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHVzZUhlYWRlckZpbGUoJHBhdGgpIHsKKwkJJHRoaXMtPmhlYWRlciA9ICRwYXRoOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gdXNlRm9vdGVyRmlsZSgkcGF0aCkgeworCQkkdGhpcy0+Zm9vdGVyID0gJHBhdGg7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBzZW5kSGVhZGVyKCRoZWFkZXJDb250ZW50KSB7CisJCSR0aGlzLT5oZWFkZXJzW10gPSAkaGVhZGVyQ29udGVudDsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlckNvbnRlbnQoKSB7CisJCXJldHVybiAkdGhpcy0+aGVhZGVyOworCX0KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0Vmlld0NvbnRlbnQoKSB7CisJCXJldHVybiAkdGhpcy0+dmlldzsKKwl9CisJcHVibGljIGZ1bmN0aW9uIGdldEZvb3RlckNvbnRlbnQoKSB7CisJCXJldHVybiAkdGhpcy0+Zm9vdGVyOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBkYXRhKCRrZXkgPSBudWxsLCAkdmFsdWUgPSBudWxsKSB7CisJICAgICAgIAorCQkvLyBSZXR1cm4gdGhlIGRhdGEgc3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdAorCQlpZiAoJGtleSA9PSBudWxsICYmICR2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gJHRoaXMtPmRhdGE7CisJCX0KKwkJCQkJCisJCS8vIFJldHVybiB0aGUgc3RvcmVkIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQga2V5CisJCWlmICgkdmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGlzc2V0KCR0aGlzLT5kYXRhWyRrZXldKSAKKwkJCQk/ICR0aGlzLT5kYXRhWyRrZXldIAorCQkJCTogbnVsbDsKKwkJfQorCQkJCQkJCQkJCQkJCQkJICAgCisJCS8vIFNldCB0aGUgc3RvcmVkIHZhbHVlIGZvciB0aGUga2V5IHRvIHRoZSBwcm92aWRlZCB2YWx1ZQorCQkkdGhpcy0+ZGF0YVska2V5XSA9ICR2YWx1ZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGFkZFN0eWxlc2hlZXQoJGhyZWYsJGNvbmRpdGlvbj0nJykgeworCQkvLyBCdWlsZCB0aGUgc3RyaW5nIGZvciB0aGUgY3NzIGltcG9ydAorCQkkc3RyID0gIjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwieyRocmVmfVwiLz4iOworCQlpZiAoIWVtcHR5KCRjb25kaXRpb24pKSB7CisJCQkkc3RyID0gIjwhLS1baWYgeyRjb25kaXRpb259XT57JHN0cn08IVtlbmRpZl0tLT4iOworCQl9CisJCSR0aGlzLT5zdHlsZXNoZWV0c1tdID0gJHN0cjsKKwl9CisJCisgICAgLyoqCisgICAgICogQWRkIGphdmFzY3JpcHQgcmVzb3VyY2VzIHRvIHRoZSByZXNwb25zZQorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIGNsZWFuIHdheSB0byBwcm9ncmFtbWF0aWNhbGx5IGluY2x1ZGUgYXJiaXRyYXJ5CisgICAgICogSmF2YXNjcmlwdCByZXNvdXJjZXMgaW4gdGhlIHJlc3BvbnNlLiBEZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUKKyAgICAgKiBwcm92aWRlZCBmb3IgJ2lzUmF3JywgdGhlIGNvbnRlbnRzIG9mICdzcmMnIHdpbGwgZWl0aGVyIGJlIGludGVycHJldGVkCisgICAgICogYXMgdGhlICdzcmMnIGF0dHJpYnV0ZSBvciB0aGUgYm9keSBjb250ZW50IG9mIHRoZSBnZW5lcmF0ZWQgPHNjcmlwdD4gYmxvY2suIAorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyBzcmMgLSBFaXRoZXIgdGhlIHVybCB0byB0aGUgcmVzb3VyY2UgdG8gaW5jbHVkZSAoaWYgCisgICAgICogICAgICAgICAgICAgICAgICAgICAnaXNSYXcnID0gZmFsc2UpIG9yIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgCisgICAgICogICAgICAgICAgICAgICAgICAgICByYXcgSmF2YXNjcmlwdCB0byBpbmNsdWRlIChpZiAnaXNSYXcnID0gdHJ1ZSkKKyAgICAgKiBAcGFyYW0gYm9vbGVhbiBpc1JhdyAtIENvbnRyb2xzIGhvdyAnc3JjJyBpcyBpbnRlcnByZXRlZC4gSWYgc2V0IHRvIGZhbHNlIAorICAgICAqICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpLCAnc3JjJyB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgVVJMIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgSmF2YXNjcmlwdCByZXNvdXJjZSB0byBpbmNsdWRlLiBJZiBzZXQgdG8gdHJ1ZSwgJ3NyYycgCisgICAgICogICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgc3RyaW5nIG9mIHJhdyBKYXZhc2NyaXB0LgorICAgICAqLworCXB1YmxpYyBmdW5jdGlvbiBhZGRKYXZhc2NyaXB0KCRzcmMsICRpc1JhdyA9IGZhbHNlKSB7CisgICAgICAgIGlmICgkaXNSYXcgPT09IHRydWUpIHsKKyAgICAgICAgICAgIC8vIEJ1aWxkIGEgc2NyaXB0IGNvbnRhaW5lciBmb3IgdGhlIHJhdyBqYXZhc2NyaXB0CisgICAgICAgICAgICAkc3RyID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPnskc3JjfTwvc2NyaXB0PiI7CisgICAgICAgICAgICAkdGhpcy0+amF2YXNjcmlwdHNbXSA9ICRzdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBCdWlsZCB0aGUgc3RyaW5nIGZvciB0aGUgamF2YXNjcmlwdCBmaWxlIGltcG9ydAorICAgICAgICAgICAgJHN0ciA9ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJ7JHNyY31cIj48L3NjcmlwdD4iOworICAgICAgICAgICAgJHRoaXMtPmphdmFzY3JpcHRzW10gPSAkc3RyOworICAgICAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0ludGVyZmFjZXMvSUFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlci5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25BdXRoZW50aWNhdGlvblByb3ZpZGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2UzOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0ludGVyZmFjZXMvSUFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlci5waHAKQEAgLTAsMCArMSwxNjIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBJQXBwbGljYXRpb25BdXRoZW50aWNhdGlvblByb3ZpZGVyIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIAorICogaW1wbGVtZW50ZWQgYnkgYWxsIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVycyB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiAKKyAqIGFjY2Vzc2luZyBhbmQgcmV0cmlldmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5kZXJseWluZyBzeXN0ZW0uIAorICogCisgKiBUaGUgaW50ZXJmYWNlIGRlZmluZXMgZml2ZSBtYW5kYXRvcnkgZnVuY3Rpb25zOgorICogICAgLSBfX2NvbnN0cnVjdDogUHJvdmlkZSBhbnkgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYnV0IGRvCisgKiAgICAgICAgICAgICAgIG5vdCBhY3R1YWxseSBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4KKyAqICAgIC0gY29ubmVjdDogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGFjdHVhbGx5IGNvbm5lY3RpbmcgdG8gdGhlIAorICogICAgICAgICAgICAgICB1bmRlcmx5aW5nIHN5c3RlbS4gT3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgZWl0aGVyIGhlcmUgb3IgaW4gCisgKiAgICAgICAgICAgICAgIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKG9yIGJvdGgpLCBidXQgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIAorICogICAgICAgICAgICAgICB1bmRlcmx5aW5nIHN5c3RlbSBzaG91bGQgbm90IGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGZ1bmN0aW9uIAorICogICAgICAgICAgICAgICBpcyBpbnZva2VkLgorICogICAgLSBkaXNjb25uZWN0OiBEaXNjb25uZWN0IGZyb20gdGhlIHVuZGVybHlpbmcgc3lzdGVtLCBwZXJmb3JtaW5nIGFueQorICogICAgICAgICAgICAgICBuZWNlc3NhcnkgY2xlYW4gdXAgb3BlcmF0aW9ucyBpbiB0aGUgcHJvY2Vzcy4KKyAqICAgIC0gY2hlY2tMb2dpbjogQ2hlY2sgaWYgYSB2YWxpZCB1c2VyIGhhcyBsb2dnZWQgaW4uCisgKiAgICAtIGxvZ2luOiAgIERldGVybWluZSB0aGUgYWJpbGl0eSB0byBnYWluIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0gCisgKiAgICAJCQkgYXMgYSBsZWdpdGltYXRlIHVzZXIuIFRoZSByZXF1aXJlbWVudHMgYXJlIGEgdmFsaWQgdXNlcm5hbWUgCisgKiAgICAJCQkgKG9yIHVzZXIgSUQpIGFuZCBwYXNzd29yZC4KKyAqICAgIC0gbG9nb3V0OiAgRW5kaW5nIHRoZSB1c2VyJ3Mgc2Vzc2lvbiB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisgKiAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAKKyAqICAgRnJhbWV3b3JrIGltcGxlbWVudGF0aW9ucyBvZiBjb21tb24gYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIGNhbiBiZSBmb3VuZCBpbjoKKyAqICAge0xJQn0vY2xhc3Nlcy9hdXRoZW50aWNhdGlvblByb3ZpZGVycyAgIGFuZCBzaG91bGQgYmUgbmFtZWQgRm9vQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcy5waHAuCisgKiAgIEZyYW1ld29yayBhdXRoZW50aWNhdGlvbiBwcm92aWRlcnMgY2FuIGJlIGludm9rZWQgYnkgZG9pbmc6CisgKiAgICAgICAgICAkYXBwLT5HZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCdGb29BdXRoZW50aWNhdGlvblByb3ZpZGVyJyk7CisgKiAgIAorICogICBDdXN0b20gYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIHNob3VsZCBiZSBwbGFjZWQgaW46CisgKiAgIHtIT01FfS9jbGFzc2VzL2F1dGhlbnRpY2F0aW9uUHJvdmlkZXJzICBhbmQgc2hvdWxkIGJlIG5hbWVkIEZvb0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwLgorICogICBDdXN0b20gYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIGNhbiBiZSBpbnZva2VkIGJ5IGRvaW5nOgorICogICAgICAgICAgJGFwcC0+R2V0QXV0aGVudGljYXRpb25Qcm92aWRlcignZm9vJyx0cnVlKTsgLy8gdHJ1ZSAtLT4gY3VzdG9tCisgKiAKKyAqIEBhdXRob3Igcy5raHVkaWt5YW4KKyAqIAorICovCitpbnRlcmZhY2UgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25BdXRoZW50aWNhdGlvblByb3ZpZGVyIHsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciAtIEluc3RhbnRpYXRlIHRoZSBwcm92aWRlciBidXQgZG8gbm90IHlldCBjb25uZWN0CisJICogdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorCSAqIAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpOworCQorCS8qKgorCSAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisJICogCisJICogQHJldHVybiBib29sZWFuICAgICAgICAgICAgVHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCk7CisJCisJLyoqCisJICogRGlzY29ubmVjdCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBhbmQgcGVyZm9ybSBhbnkgY2xlYW51cCAKKwkgKiBvcGVyYXRpb25zIG5lY2Vzc2FyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4gCQkgICAgICBUcnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0CisJICovCisJcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKTsKKwkKKwkvKioKKwkgKiBDaGVjayBpZiBhIHZhbGlkIHVzZXIgaGFzIGxvZ2dlZCBpbi4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4gCQkgICAgICBUcnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0CisJICovCQorCXB1YmxpYyBmdW5jdGlvbiBpc0xvZ2dlZEluKCk7CisJCisJLyoqCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgcHJpdmlsZWdlcyB3aWxsIGJlIGdyYW50ZWQgdG8gYSBwYXJ0aWN1bGFyIHVzZXIKKwkgKiB1c2luZyBjcmVkZW50aWFscyBwcm92aWRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gJHVzZXJuYW1lICAgIG1peGVkICBUaGUgdXNlcm5hbWUgaXMgdXN1YWxseSBhIHN0cmluZy4gCisJICogQHBhcmFtICRwYXNzd29yZCAgICBtaXhlZCAgVGhlIHBhc3N3b3JkIGlzIHVzdWFsbHkgYSBzdHJpbmcuIAorCSAqIEByZXR1cm4gbWl4ZWQJICAgICAgICAgIFRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9mIGxvZ2luCisJICovCisJcHVibGljIGZ1bmN0aW9uIGxvZ2luKCAkdXNlcm5hbWUsICRwYXNzd29yZCApOworCQorCS8qKgorCSAqIEVuZGluZyB0aGUgdXNlcidzIHNlc3Npb24gdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorCSAqIAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBsb2dvdXQoKTsKKwkKKwkvKioKKwkgKiBHZXQgY3VycmVudCB1c2VyJ3MgdXNlcm5hbWUuCisJICogCisJICovCisJcHVibGljIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VybmFtZSgpOworCQorCS8qKgorCSAqIENoYW5nZSBjdXJyZW50IHVzZXIncyBwYXNzd29yZC4KKwkgKiAKKwkgKiBAcGFyYW0gJG5ld1Bhc3N3b3JkIHN0cmluZworCSAqIEByZXR1cm4gYm9vbGVhbgkJCSAgIFRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9mIHBhc3N3b3JkIGNoYW5nZQorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VQYXNzd29yZCggJG5ld1Bhc3N3b3JkICk7CisKKwkvKioKKwkgKiBDaGVja3MgaWYgdXNlciBpcyBsb2dnZWQgaW4uIElmIHRydWUsIHZhbGlkYXRlcyBydWxlcyBmcm9tIGNvbmZpZyBmaWxlIGFuZCB1c2VzIAorCSAqIHtAbGluayBjaGFuZ2VQYXNzd29yZH0gdG8gY2hhbmdlIHBhc3N3b3JkLgorCSAqIAorCSAqIEBwYXJhbSAkbmV3UGFzcyAgICAgICAgICAgIHN0cmluZyAgVGhlIG5ldyBwYXNzd29yZAorCSAqIEBwYXJhbSAkZW5jcnlwdGlvbk1ldGhvZCAgIHN0cmluZyAgVGhlIGVuY3J5cHRpb24gbWV0aG9kIHVzZWQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVDaGFuZ2VQYXNzd29yZCggJG5ld1Bhc3MsICRlbmNyeXB0aW9uTWV0aG9kID0gIlNIQSIgKTsKKwkKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGZyb20gdGhlIHVzZXIncyBlbnRyeSAKKwkgKiAKKwkgKiBAcGFyYW0gJHVzZXJuYW1lICAgIHN0cmluZyAgVGhlIHVzZXIgZm9yIHdoaWNoIGF0dHJpYnV0ZXMgd2lsbCBiZSByZXR1cm5lZAorCSAqIEBwYXJhbSAkYXR0cmlidXRlcyAgYXJyYXkgICBBdHRyaWJ1dGVzIHRvIHJldHJpZXZlCisJICogQHJldHVybiBhcnJheSAgICAgICAgICAgICAgIEFuIGVtcHR5IGFycmF5IG9yIHJlcXVlc3RlZCBhdHRyaWJ1dGVzCisJICovCisJcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlVXNlckF0dHJpYnV0ZXMoICR1c2VybmFtZSwgJGF0dHJpYnV0ZXMgKTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFjY291bnQgd2l0aCB0aGUgdXNlciBpbmZvcm1hdGlvbiBwcm92aWRlZAorCSAqIAorCSAqIEBwYXJhbSAkdXNlckluZm8gICAgYXJyYXkgIENhbiBpbmNsdWRlIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nIG9uIHByb3ZpZGVyCisJICogCQkJCQkJCQlpLmUuIHVzZXJuYW1lLCBmaXJzdG5hbWUsIGxhc3RuYW1lLCBlbWFpbAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBhZGRVc2VyKCAkdXNlckluZm8gKTsKKwkKKwkvKioKKwkgKiBVc2VzIHtAbGluayByZXRyaWV2ZVVzZXJBdHRyaWJ1dGVzfSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvdmlkZWQgCisJICogdXNlci4gSWYgY291bnQgb2YgYXJyYXkgcmV0dXJuZWQgaXMgPiAwIHRoZW4gdGhlIHVzZXJuYW1lIGlzIG5vdCBhdmFpbGFibGUuCisJICogCisJICogQHBhcmFtICR1c2VybmFtZQkgICBzdHJpbmcgVGhlIHVzZXJuYW1lIGZvciB3aGljaCBhIHVzZXIgaXMgY2hlY2tpbmcgdGhlIAorCSAqIAkJCQkJCQkJYXZhaWxhYmlsaXR5IG9mCisJICovCQorCXB1YmxpYyBmdW5jdGlvbiB1c2VybmFtZUF2YWlsYWJpbGl0eSggJHVzZXJuYW1lICk7CisJCisJLyoqCisJICogVXBkYXRlcyB1c2VyIGluZm9ybWF0aW9uIHdpdGggdGhlIHZhbHVlcyBvZiBwcm92aWRlZCBhdHRyaWJ1dGVzCisJICogCisJICogQHBhcmFtICRuZXdJbmZvICAgICBhcnJheSAgKGtleSwgdmFsdWUpIGJhc2VkIGFycmF5LCB3aGVyZSBrZXlzIGFyZSB0aGUgdXNlcidzIAorIAkgKiAJCQkJCQkJCWVudHJ5IGF0dHJpYnV0ZSBpZHMgYW5kIHRoZSB2YWx1ZXMgd2lsbCByZXBsYWNlIAorIAkgKiAJCQkJCQkJCXRoZSB2YWx1ZXMgb2YgdGhvc2UgYXR0cmlidXRlcyAKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZSggJG5ld0luZm8gKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9JbnRlcmZhY2VzL0lBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlci5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25BdXRob3JpemF0aW9uUHJvdmlkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmRmNDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25BdXRob3JpemF0aW9uUHJvdmlkZXIucGhwCkBAIC0wLDAgKzEsNjIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBMREFQQXV0aG9yaXphdGlvblByb3ZpZGVyIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRoYXQgd2lsbCBkZXRlcm1pbmUgd2hhdCBsZXZlbCAKKyAqIG9mIGFjY2VzcyBhIHBhcnRpY3VsYXIgdXNlciBzaG91bGQgaGF2ZSB0byBzZWN1cmVkIHJlc291cmNlcy4gCisgKiAKKyAqIFRoZSBpbnRlcmZhY2UgZGVmaW5lcyBmaXZlIG1hbmRhdG9yeSBmdW5jdGlvbnM6CisgKiAgICAtIF9fY29uc3RydWN0OiBQcm92aWRlIGFueSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgIAorICogICBGcmFtZXdvcmsgaW1wbGVtZW50YXRpb25zIG9mIGNvbW1vbiBhdXRob3JpemF0aW9uIHByb3ZpZGVycyBjYW4gYmUgZm91bmQgaW46CisgKiAgIEJhbGFuY2UvUHJvdmlkZXJzL0F1dGhvcml6YXRpb24gCisgKiAgIEZyYW1ld29yayBhdXRob3JpemF0aW9uIHByb3ZpZGVycyBjYW4gYmUgaW52b2tlZCBieSBkb2luZzoKKyAqICAgICAgICAgIEFwcDpHZXQoKS0+Z2V0QXV0aG9yaXphdGlvblByb3ZpZGVyKCk7CisgKiAKKyAqIEBhdXRob3Igcy5raHVkaWt5YW4KKyAqIAorICovCisKK2ludGVyZmFjZSBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlciB7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IgLSBJbnN0YW50aWF0ZSB0aGUgcHJvdmlkZXIKKwkgKiAKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKTsKKwkKKwkvKioKKwkgKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbiAgICAgICAgICAgIFRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHRoZSByZXN1bHQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgpOworCQorCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgc2V0IG9mIGdyb3VwcyBmb3Igc3BlY2lmaWVkIHVzZXIKKwkgKiAKKwkgKiBAcGFyYW0gJHVzZXJuYW1lICAgIHN0cmluZyAgVGhlIHVzZXIgZm9yIHdoaWNoIGdyb3VwcyB3aWxsIGJlIHJldHVybmVkCisJICogQHJldHVybiBhcnJheSAgICAgICAgICAgICAgIEFuIGVtcHR5IGFycmF5IG9yIGdyb3VwcyB0aGUgdXNlciBiZWxvbmdzIHRvCisJICovCisJcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlR3JvdXBzRm9yVXNlciggJHVzZXJuYW1lICk7CisJCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0ludGVyZmFjZXMvSUFwcGxpY2F0aW9uRGF0YVByb3ZpZGVyLnBocCBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9JbnRlcmZhY2VzL0lBcHBsaWNhdGlvbkRhdGFQcm92aWRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4ZDdhNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9JbnRlcmZhY2VzL0lBcHBsaWNhdGlvbkRhdGFQcm92aWRlci5waHAKQEAgLTAsMCArMSwxMjUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBJQXBwbGljYXRpb25EYXRhUHJvdmlkZXIgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQKKyAqIGJ5IGFsbCBkYXRhIHByb3ZpZGVycyB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiBpbnRlZ3JhdGluZyBhbmQgYWNjZXNzaW5nCisgKiBtdWx0aXBsZSBoZXRlcm9nZW5lb3VzIGRhdGEgc291cmNlcy4gQSBkYXRhIHNvdXJjZSBjb3VsZCBiZSBhIHJlbGF0aW9uYWwKKyAqIFNRTC1saWtlIGRhdGFiYXNlLCBhIENBUyBGaWxlIE1hbmFnZXIsIGFuIExEQVAgc2VydmVyLCBhbnl0aGluZyB0aGF0IGNhbgorICogYmUgcXVlcmllZCBmb3IgZGF0YS4gCisgKiAKKyAqIFRoZSBpbnRlcmZhY2UgZGVmaW5lcyBmaXZlIG1hbmRhdG9yeSBmdW5jdGlvbnM6CisgKiAgICAtIF9fY29uc3RydWN0OiBQcm92aWRlIGFueSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBidXQgZG8KKyAqICAgICAgICAgICAgICAgbm90IGFjdHVhbGx5IGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcgZGF0YQorICogICAgICAgICAgICAgICBzb3VyY2UuCisgKiAgICAtIGNvbm5lY3Q6IFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBhY3R1YWxseSBjb25uZWN0aW5nIHRvIHRoZSAKKyAqICAgICAgICAgICAgICAgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4gT3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgZWl0aGVyIGhlcmUKKyAqICAgICAgICAgICAgICAgb3IgaW4gdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAob3IgYm90aCksIGJ1dCB0aGUgY29ubmVjdGlvbgorICogICAgICAgICAgICAgICB0byB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZSBzaG91bGQgbm90IGJlIGluaXRpYXRlZCB1bnRpbAorICogICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQuCisgKiAgICAtIGRpc2Nvbm5lY3Q6IERpc2Nvbm5lY3QgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZSwgcGVyZm9ybWluZyBhbnkKKyAqICAgICAgICAgICAgICAgbmVjZXNzYXJ5IGNsZWFuIHVwIG9wZXJhdGlvbnMgaW4gdGhlIHByb2Nlc3MuCisgKiAgICAtIHJlcXVlc3Q6IFNhdGlzZnkgYSByZXF1ZXN0IGZvciBkYXRhLiBUaGUgZm9ybWF0IHRoYXQgdGhpcyByZXF1ZXN0IHRha2VzCisgKiAgICAgICAgICAgICAgIHdpbGwgbGlrZWx5IGRpZmZlciBhY3Jvc3MgaW1wbGVtZW50YXRpb25zLiBBbiBhcnJheSBvZiBmdXJ0aGVyCisgKiAgICAgICAgICAgICAgIG9wdGlvbnMgbWF5IGJlIHByb3ZpZGVkIGFzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudC4gQXMgYSAKKyAqICAgICAgICAgICAgICAgY29uY3JldGUgIGV4YW1wbGUsIGFuIFNRTC1saWtlIGRhdGEgc291cmNlIG1heSBzdXBwb3J0IHN0cmluZyAKKyAqICAgICAgICAgICAgICAgcmVxdWVzdHMgbGlrZSAiU0VMRUNUICogRlJPTSBmb28gV0hFUkUgYmFyPSdiYXonIi4gVGhlIAorICogICAgICAgICAgICAgICByZXNwb25zZSBmcm9tIHRoaXMgY2FsbCBtdXN0IGJlIGFuIEFwcGxpY2F0aW9uRGF0YVJlc3BvbnNlIG9iamVjdAorICogICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCkgYXJyYXkgb2YgcmVzcG9uc2UgaW5mby4gCisgKiAgICAtIGNvbW1hbmQ6IFNlbmQgYSBjb21tYW5kIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlLiBBcyB3aXRoIHJlcXVlc3QsCisgKiAgICAgICAgICAgICAgIHRoZSBmb3JtYXQgdGhhdCB0aGlzIGNvbW1hbmQgdGFrZXMgd2lsbCBsaWtlbHkgZGlmZmVyIGFjcm9zcworICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMuIEFzIGEgY29uY3JldGUgZXhhbXBsZSwgYW4gU1FMLWxpa2UgZGF0YSBzb3VyY2UKKyAqICAgICAgICAgICAgICAgbWF5IHN1cHBvcnQgc3RyaW5nIGNvbW1hbmRzIGxpa2UgIlVQREFURSBmb28gc2V0IGJhcj0nYmF6JyIuIAorICogICAgICAgICAgICAgICBDb21tYW5kIHNob3VsZCBub3QgYmUgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUsIG90aGVyIHRoYW4KKyAqICAgICAgICAgICAgICAgcG9zc2libHkgdHJ1ZS9mYWxzZSB0byBpbmRpY2F0ZSB0aGUgc3VjY2VzcyBvZiB0aGUgY2FsbC4KKyAqICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgIAorICogICBGcmFtZXdvcmsgaW1wbGVtZW50YXRpb25zIG9mIGNvbW1vbiBkYXRhIHByb3ZpZGVycyBjYW4gYmUgZm91bmQgaW46CisgKiAgIHtMSUJ9L2NsYXNzZXMvZGF0YVByb3ZpZGVycyAgIGFuZCBzaG91bGQgYmUgbmFtZWQgRm9vRGF0YVByb3ZpZGVyLmNsYXNzLnBocC4KKyAqICAgRnJhbWV3b3JrIGRhdGEgcHJvdmlkZXJzIGNhbiBiZSBpbnZva2VkIGJ5IGRvaW5nOgorICogICAgICAgICAgJGFwcC0+R2V0RGF0YVByb3ZpZGVyKCdGb29EYXRhUHJvdmlkZXInKTsKKyAqICAgCisgKiAgIEN1c3RvbSBkYXRhIHByb3ZpZGVycyBzaG91bGQgYmUgcGxhY2VkIGluOgorICogICB7SE9NRX0vY2xhc3Nlcy9kYXRhUHJvdmlkZXJzICBhbmQgc2hvdWxkIGJlIG5hbWVkIEZvb0RhdGFQcm92aWRlci5jbGFzcy5waHAuCisgKiAgIEN1c3RvbSBkYXRhIHByb3ZpZGVycyBjYW4gYmUgaW52b2tlZCBieSBkb2luZzoKKyAqICAgICAgICAgICRhcHAtPkdldERhdGFQcm92aWRlcignZm9vJyx0cnVlKTsgLy8gdHJ1ZSAtLT4gY3VzdG9tCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqIAorICovCitpbnRlcmZhY2UgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25EYXRhUHJvdmlkZXIgeworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIC0gSW5zdGFudGlhdGUgdGhlIHByb3ZpZGVyIGJ1dCBkbyBub3QgeWV0IGNvbm5lY3QKKwkgKiB0byB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4KKwkgKiAKKwkgKiBAcGFyYW0gJG9wdGlvbnMgIGFycmF5ICAgQW4gb3B0aW9uYWwgc2V0IG9mIGNvbmZpZ3VyYXRpb24gdmFsdWVzCisJICovCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcHRpb25zID0gYXJyYXkoKSk7CisJCisJLyoqCisJICogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlCisJICogCisJICogQHBhcmFtICRvcHRpb25zICBhcnJheSAgQW4gb3B0aW9uYWwgc2V0IG9mIGNvbmZpZ3VyYXRpb24gdmFsdWVzCisJICogQHJldHVybiBib29sZWFuICAgICAgICAgVHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCRvcHRpb25zID0gYXJyYXkoKSk7CisJCisJLyoqCisJICogRGlzY29ubmVjdCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlIGFuZCBwZXJmb3JtIGFueQorCSAqIGNsZWFudXAgb3BlcmF0aW9ucyBuZWNlc3NhcnkuCisJICogCisJICogQHBhcmFtICRvcHRpb25zICBhcnJheSAgQW4gb3B0aW9uYWwgc2V0IG9mIGNvbmZpZ3VyYXRpb24gdmFsdWVzCisJICogQHJldHVybiB1bmtub3duX3R5cGUgICAgVHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBkaXNjb25uZWN0KCRvcHRpb25zID0gYXJyYXkoKSk7CisJCisJLyoqCisJICogUmVxdWVzdCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UuCisJICogCisJICogQHBhcmFtICRyZXF1ZXN0ICBtaXhlZCAgVGhlIHJlcXVlc3QgaXRzZWxmLCB1c3VhbGx5IGEgc3RyaW5nLiBUaGUgbmF0dXJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJlcXVlc3QgaXMgbmVjZXNzYXJpbHkgaW1wbGVtZW50YXRpb24gCisJICogICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgYW5kIHdpbGwgdmFyeSBhY3Jvc3MgcHJvdmlkZXJzLiBGb3IgYSAKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBTUUwtbGlrZSByZWxhdGlvbmFsIHByb3ZpZGVyLCB0aGlzIHdpbGwgbGlrZWx5IGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgYSAiU0VMRUNUIC4uLiIgc3RyaW5nLgorCSAqIEBwYXJhbSAkb3B0aW9ucyAgYXJyYXkgIEFuIGFycmF5IG9mIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSByZXF1ZXN0LgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIHdpbGwgYmUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYW5kIAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlZm9yZSB3aWxsIGxpa2VseSBkaWZmZXIgYWNyb3NzIHByb3ZpZGVycy4KKwkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uRGF0YVJlc3BvbnNlICBUaGUgcmVzdWx0aW5nIGRhdGEgcmV0cmlldmVkCisJICovCisJcHVibGljIGZ1bmN0aW9uIHJlcXVlc3QoJHJlcXVlc3QsJG9wdGlvbnMgPSBhcnJheSgpKTsKKwkKKwkvKioKKwkgKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4KKwkgKiAKKwkgKiBAcGFyYW0gJGNvbW1hbmQgbWl4ZWQgICBUaGUgY29tbWFuZCBpdHNlbGYsIHVzdWFsbHkgYSBzdHJpbmcuIFRoZSBuYXR1cmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY29tbWFuZCBpcyBuZWNlc3NhcmlseSBpbXBsZW1lbnRhdGlvbiAKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBhbmQgd2lsbCB2YXJ5IGFjcm9zcyBwcm92aWRlcnMuIEZvciBhIAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIFNRTC1saWtlIHJlbGF0aW9uYWwgcHJvdmlkZXIsIHRoaXMgd2lsbCBsaWtlbHkgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBhICJVUERBVEUgLi4uIiwgb3IgIkNSRUFURSAuLi4iIHN0cmluZy4KKwkgKiBAcGFyYW0gJG9wdGlvbnMgIGFycmF5ICBBbiBhcnJheSBvZiBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29tbWFuZC4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSB3aWxsIGJlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFuZCAKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZWZvcmUgd2lsbCBsaWtlbHkgZGlmZmVyIGFjcm9zcyBwcm92aWRlcnMuCisJICogQHJldHVybiBib29sZWFuICAgICAgICAgVHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gdGhlIHN1Y2Nlc3Mgb2YgdGhlIGNvbW1hbmQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gY29tbWFuZCgkY29tbWFuZCwkb3B0aW9ucyA9IGFycmF5KCkpOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0ludGVyZmFjZXMvSUFwcGxpY2F0aW9uRXJyb3JQcm92aWRlci5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25FcnJvclByb3ZpZGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzI2MmExCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL0ludGVyZmFjZXMvSUFwcGxpY2F0aW9uRXJyb3JQcm92aWRlci5waHAKQEAgLTAsMCArMSwzOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiAKKyAqIE9PRFQgQmFsYW5jZQorICogV2ViIEFwcGxpY2F0aW9uIEJhc2UgRnJhbWV3b3JrCisgKiAKKyAqIElBcHBsaWNhdGlvbkVycm9yUHJvdmlkZXIgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQKKyAqIGJ5IGFsbCBlcnJvciBwcm92aWRlcnMgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgZm9ybWF0dGluZyBhbmQgZGlzcGxheWluZworICogYXBwbGljYXRpb24gZXJyb3JzLgorICogCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqLworaW50ZXJmYWNlIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0ludGVyZmFjZXNfSUFwcGxpY2F0aW9uRXJyb3JQcm92aWRlciB7CisJCisJLyoqCisJICogQ2F1c2VzIGFuIGVycm9yIHJlc3BvbnNlIHRvIGJlIHNlbnQgdG8gdGhlIHNlbmRlcgorCSAqIAorCSAqIEBwYXJhbSBpbnRlZ2VyICRodHRwUmVzcG9uc2VDb2RlICBUaGUgSFRUUCByZXNwb25zZSBjb2RlIHRvIHNlbmQKKwkgKiBAcGFyYW0gc3RyaW5nICAkbWVzc2FnZSAgICAgICAgICAgQSBjb250ZXh0dWFsIG1lc3NhZ2UgdG8gaW5jbHVkZSBvciBsb2cKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJGh0dHBSZXNwb25zZUNvZGUsJG1lc3NhZ2UgPSAnJywkb3B0aW9ucz1hcnJheSgpKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9JbnRlcmZhY2VzL0lBcHBsaWNhdGlvbldpZGdldC5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25XaWRnZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvSW50ZXJmYWNlcy9JQXBwbGljYXRpb25XaWRnZXQucGhwCkBAIC0wLDAgKzEsNjcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBJbnRlcmZhY2UgZm9yIGRldmVsb3Bpbmcgd2lkZ2V0cyAocmV1c2FibGUgYml0cyBvZiB2aWV3IGNvZGUpIHRoYXQgY2FuCisgKiBiZSBwbGFjZWQgb24gZGlmZmVyZW50IGFwcGxpY2F0aW9uIHBhZ2VzLgorICogCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHR3byBtYW5kYXRvcnkgZnVuY3Rpb25zOgorICogIC0gY29uc3RydWN0IDogSW50aWFsaXplIHRoZSB3aWRnZXQgYW5kIHByb3ZpZGUgYW55IG5lY2Vzc2FyeSAKKyAqICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqICAtIHJlbmRlciAgICA6IEJ1aWxkIHRoZSBIVE1MIG91dHB1dCB0aGF0IGNvbnN0aXR1dGVzIHRoZSB3aWRnZXQuIFRoaXMKKyAqICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBhcmd1bWVudHMgKGFueSBjb25maWcgc2hvdWxkCisgKiAgICAgICAgICAgICAgICBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGNvbnRyb2xsZXIgb3IgdmlhIG90aGVyICJzZXQiCisgKiAgICAgICAgICAgICAgICBmdW5jdGlvbnMuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIHN0cmluZyBjb21wb3NlZAorICogICAgICAgICAgICAgICAgb2YgdGhlIGZpbmFsIEhUTUwgb3V0cHV0IG9mIHRoZSB3aWRnZXQuCisgKiAgICAgICAgCisgKiBGcmFtZXdvcmsgd2lkZ2V0cyBjYW4gYmUgZm91bmQgaW5zaWRlIHRoZSB7TElCfS9zY3JpcHRzL3dpZGdldHMgZGlyZWN0b3J5LiAgICAgICAgICAgICAgCisgKiAKKyAqIEZyYW1ld29yayBXaWRnZXRzIGNhbiBiZSBpbnZva2VkIGZyb20gdmlldyBjb2RlIGFzIGZvbGxvd3M6CisgKiAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHdpZGdldCAod2lsbCB0cmFuc3BhcmVudGx5IGNhbGwgX19jb25zdHJ1Y3QpCisgKiAgICAkbXlGb29XaWRnZXQgPSAkYXBwLT5jcmVhdGVXaWRnZXQoJ0Zvb1dpZGdldCcsYXJyYXkoLi5jb25maWcuLikpCisgKiAgCisgKiBDdXN0b20gd2lkZ2V0cyBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSB0aGUge0hPTUV9L3NjcmlwdHMvd2lkZ2V0cyBkaXJlY3RvcnkgYW5kIAorICogY2FuIGJlIG5hbWVkIEZvb1dpZGdldC5waHAuIEFsbCB3aWRnZXRzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgorICogCisgKiBDdXN0b20gV2lkZ2V0cyBjYW4gYmUgaW52b2tlZCBmcm9tIHZpZXcgY29kZSBhcyBmb2xsb3dzOgorICogICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSB3aWRnZXQgKHdpbGwgdHJhbnNwYXJlbnRseSBjYWxsIF9fY29uc3RydWN0KQorICogICAgJG15Rm9vV2lkZ2V0ID0gJGFwcC0+Y3JlYXRlV2lkZ2V0KCdGb29XaWRnZXQnLGFycmF5KC4uY29uZmlnLi4pLHRydWUpIC8vIHRydWUgLS0+IGN1c3RvbQorICogCisgKiA8IS0tIChhbGwgd2lkZ2V0cywgZnJhbWV3b3JrIG9yIGN1c3RvbSk6IGRpc3BsYXkgd2lkZ2V0IGNvbnRlbnRzIC0tPgorICogPHNwYW4+PD9waHAgZWNobyAkbXlGb29XaWRnZXQtPnJlbmRlcigpPz48L3NwYW4+CisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqIAorICovCitpbnRlcmZhY2UgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25XaWRnZXQgeworCQorCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucyA9IGFycmF5KCkpOworCQorCS8qKgorCSAqIEJ1aWxkIHRoZSBIVE1MIG91dHB1dCB0aGF0IGNvbnN0aXR1dGVzIHRoZSB3aWRnZXQuCisJICogCisJICogQHBhcmFtIGJvb2xlYW4gJGJFY2hvIChkZWZhdWx0ID0gdHJ1ZSkgSWYgdHJ1ZSwgdGhlIGZ1bmN0aW9uIHNob3VsZAorCSAqICAgICAgICBlY2hvIHRoZSBjb250ZW50cyBkaXJlY3RseS4gSWYgZmFsc2UsIHRoZSBjb250ZW50cyBzaG91bGQgYmUKKwkgKiAgICAgICAgcmV0dXJuZWQgYXMgYSBzdHJpbmcuCisJICovCisJcHVibGljIGZ1bmN0aW9uIHJlbmRlcigkYkVjaG8gPSB0cnVlKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvQXV0aGVudGljYXRpb24vTERBUEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1Byb3ZpZGVycy9BdXRoZW50aWNhdGlvbi9MREFQQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0YzZmOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvQXV0aGVudGljYXRpb24vTERBUEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsMTcwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIAorICogT09EVCBCYWxhbmNlCisgKiBXZWIgQXBwbGljYXRpb24gQmFzZSBGcmFtZXdvcmsKKyAqIAorICogSW1wbGVtZW50YXRpb24gb2YgaUFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlciwgd2hpY2ggZXh0ZW5kcyBTaW5nbGVTaWduT24uCisgKiAKKyAqIE5vdGU6IFRoaXMgY2xhc3MgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGUgT09EVCBDQVMtU1NPIHBhY2thZ2UuCisgKgkJVGhlIG5lY2Vzc2FyeSBmaWxlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3BlYXIuYXBhY2hlLm9yZy9vb2R0LworICoJCWFsb25nIHdpdGggaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KKyAqIAorICogQGF1dGhvciBzLmtodWRpa3lhbgorICogQGF1dGhvciBhaGFydAorICogCisgKi8KK3JlcXVpcmUoIk9yZy9BcGFjaGUvT29kdC9TZWN1cml0eS9TaW5nbGVTaWduT24ucGhwIik7CisKK2NsYXNzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX1Byb3ZpZGVyc19BdXRoZW50aWNhdGlvbl9MREFQQXV0aGVudGljYXRpb25Qcm92aWRlcgorCWV4dGVuZHMgT3JnX0FwYWNoZV9Pb2R0X1NlY3VyaXR5X1NpbmdsZVNpZ25PbiAKKwlpbXBsZW1lbnRzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0ludGVyZmFjZXNfSUFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlciB7CisKKwkvKioKKwkgKiBJZiBhdXRoZW50aWNhdGlvbiBjb25maWcgZmlsZSBleGlzdHMsIHJlcXVpcmUoZmlsZV9uYW1lKSBmaWxlCisJICovCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgeworCQkKKwkJLy8gc2V0IExEQVAgY29uc3RhbnRzCisJCWRlZmluZSgiQ0FTX1NFQ1VSSVRZIix0cnVlKTsKKwkJZGVmaW5lKCJTU09fTERBUF9IT1NUIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2xkYXBfaG9zdCddKTsKKwkJZGVmaW5lKCJTU09fTERBUF9QT1JUIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2xkYXBfcG9ydCddKTsKKwkJZGVmaW5lKCJTU09fQkFTRV9ETiIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydsZGFwX2Jhc2VfZG4nXSk7CisJCWRlZmluZSgiU1NPX0dST1VQU19ETiIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydsZGFwX2dyb3VwX2RuJ10pOworCQlkZWZpbmUoIlNTT19DT09LSUVfS0VZIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Nvb2tpZV9rZXknXSk7CisJCQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgpIHsKKwkJcmV0dXJuIHBhcmVudDo6Y29ubmVjdChmdW5jX2dldF9hcmcoMCksZnVuY19nZXRfYXJnKDEpKTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7CisJCQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gaXNMb2dnZWRJbigpIHsKKwkJcmV0dXJuIHBhcmVudDo6aXNMb2dnZWRJbigpOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICkgeworCQlyZXR1cm4gcGFyZW50Ojpsb2dpbiggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGxvZ291dCgpIHsKKwkJcGFyZW50Ojpsb2dvdXQoKTsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJuYW1lKCkgeworCQlyZXR1cm4gcGFyZW50OjpnZXRDdXJyZW50VXNlcm5hbWUoKTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGNoYW5nZVBhc3N3b3JkKCAkbmV3UGFzc3dvcmQgKSB7CisJCWlmICggQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2F1dGhlbnRpY2F0aW9uX2VuY3J5cHRpb25fbWV0aG9kJ10gKSB7CisJCQlyZXR1cm4gcGFyZW50OjpjaGFuZ2VQYXNzd29yZCggJG5ld1Bhc3N3b3JkLCBBcHA6OkdldCgpLT5zZXR0aW5nc1snYXV0aGVudGljYXRpb25fZW5jcnlwdGlvbl9tZXRob2QnXSApOworCQl9CisJCXJldHVybiBwYXJlbnQ6OmNoYW5nZVBhc3N3b3JkKCAkbmV3UGFzc3dvcmQgKTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlQ2hhbmdlUGFzc3dvcmQoICRuZXdQYXNzLCAkZW5jcnlwdGlvbk1ldGhvZCA9ICJTSEEiICkgeworCQkkaXNWYWxpZCA9IHRydWU7CisJCSRtZXNzYWdlcyA9IGFycmF5KCk7CisJCS8vIHZhbGlkYXRlIHJ1bGVzIGZyb20gY29uZmlnIGZpbGUKKwkJJHJ1bGVzID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3NlY3VyaXR5X3Bhc3N3b3JkX3J1bGVzJ107CisKKwkJaWYgKCBpc3NldCgkcnVsZXMpICkgeworCQkJZm9yZWFjaCggJHJ1bGVzIGFzICRydWxlICl7CisJCQkJCisJCQkJLy8gU2VwYXJhdGUgdGhlIHJ1bGUgZnJvbSB0aGUgZXJyb3IgbWVzc2FnZQorCQkJCWxpc3QoJHJlZ3VsYXJFeHByZXNzaW9uLCRlcnJvck1lc3NhZ2UpID0gZXhwbG9kZSgnfCcsJHJ1bGUsMik7CisJCQkJCisJCQkJLy8gVGVzdCB0aGUgcnVsZQorCQkJCSRydWxlUGFzc2VkID0gcHJlZ19tYXRjaCgkcmVndWxhckV4cHJlc3Npb24sICRuZXdQYXNzKTsKKwkJCQkKKwkJCQkvLyBJZiB0aGUgcnVsZSBmYWlsZWQsIGFwcGVuZCB0aGUgZXJyb3IgbWVzc2FnZQorCQkJCWlmICghJHJ1bGVQYXNzZWQpIHsKKwkJCQkJJG1lc3NhZ2VzW10gPSAkZXJyb3JNZXNzYWdlOworCQkJCQkkaXNWYWxpZCAgICA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICgkaXNWYWxpZCAmJiAkdGhpcy0+Y29ubmVjdChTU09fTERBUF9IT1NULFNTT19MREFQX1BPUlQpKSB7CisJCSAgJHJlc3VsdCA9ICR0aGlzLT5jaGFuZ2VQYXNzd29yZCgkbmV3UGFzcywkZW5jcnlwdGlvbk1ldGhvZCk7CisJCSAgcmV0dXJuIHRydWU7CisJCX0gZWxzZQorCQkgIHJldHVybiAkbWVzc2FnZXM7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZVVzZXJBdHRyaWJ1dGVzKCAkdXNlcm5hbWUsICRhdHRyaWJ1dGVzICkgeworCQkkcmF3QXJyYXkgCQk9IHBhcmVudDo6cmV0cmlldmVVc2VyQXR0cmlidXRlcyggJHVzZXJuYW1lLCAkYXR0cmlidXRlcyApOworCQkkdXNlckF0dHJpYnV0ZXMgPSBhcnJheSgpOworCQkKKwkJaWYgKCBjb3VudCgkcmF3QXJyYXkpID4gMSApIHsKKwkJCSRyYXdBcnJheSA9ICRyYXdBcnJheVswXTsKKwkJCS8vIEdldCBvbmx5IG5lY2Vzc2FyeSBhdHRyaWJ1dGVzIHRvIHJldHVybgorCQkJZm9yZWFjaCAoICRyYXdBcnJheSBhcyAka2V5PT4ka2V5VmFsdWUgKSB7CisJCQkJZm9yZWFjaCAoICRhdHRyaWJ1dGVzIGFzICR2YWx1ZSApIHsKKwkJCQkJaWYgKCAka2V5ID09PSAkdmFsdWUgKSB7CisJCQkJCQkkdXNlckF0dHJpYnV0ZXNbJGtleV0gPSAka2V5VmFsdWVbMF07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuICR1c2VyQXR0cmlidXRlczsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGFkZFVzZXIoJHVzZXJJbmZvKSB7CisJCSRsZGFwY29ubiA9ICR0aGlzLT5jb25uZWN0KFNTT19MREFQX0hPU1QsU1NPX0xEQVBfUE9SVCk7CisJCWlmICgkbGRhcGNvbm4pIHsKKwkJCSR1c2VyICA9ICJ1aWQ9eyR1c2VySW5mb1sgInVpZCIgXX0sIiAuIFNTT19CQVNFX0ROOworCQkJcmV0dXJuIGxkYXBfYWRkKCRsZGFwY29ubiwkdXNlciwkdXNlckluZm8pOworCQl9CisJCS8vIGNvbm5lY3Rpb24gZmFpbGVkCisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHVzZXJuYW1lQXZhaWxhYmlsaXR5KCAkdXNlcm5hbWUgKSB7CisJCSRqdXN0dGhlc2UgPSBhcnJheSggQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3VzZXJuYW1lX2F0dHInXSApOworCQkkcHJvZmlsZSA9ICR0aGlzLT5yZXRyaWV2ZVVzZXJBdHRyaWJ1dGVzKCR1c2VybmFtZSwgJGp1c3R0aGVzZSk7CisJCWlmIChjb3VudCgkcHJvZmlsZSkgPiAwKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQkvLyBhdmFpbGFibGUKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVQcm9maWxlKCRuZXdJbmZvKSB7CisKKwkJaWYgKCR0aGlzLT5pc0xvZ2dlZEluKCkpIHsKKwkJCSR1c2VyICA9ICJ1aWQ9eyR0aGlzLT5nZXRDdXJyZW50VXNlcm5hbWUoKX0sIiAuIFNTT19CQVNFX0ROIDsKKwkJCSRsZGFwY29ubiA9ICR0aGlzLT5jb25uZWN0KFNTT19MREFQX0hPU1QsU1NPX0xEQVBfUE9SVCk7CisJCQkKKwkJCWlmIChsZGFwX21vZF9yZXBsYWNlKCRsZGFwY29ubiwkdXNlciwkbmV3SW5mbykpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1Byb3ZpZGVycy9BdXRob3JpemF0aW9uL0xEQVBBdXRob3JpemF0aW9uUHJvdmlkZXIuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1Byb3ZpZGVycy9BdXRob3JpemF0aW9uL0xEQVBBdXRob3JpemF0aW9uUHJvdmlkZXIuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGRmYzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvUHJvdmlkZXJzL0F1dGhvcml6YXRpb24vTERBUEF1dGhvcml6YXRpb25Qcm92aWRlci5jbGFzcy5waHAKQEAgLTAsMCArMSwxMDkgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBJQXBwbGljYXRpb25BdXRoZW50aWNhdGlvblByb3ZpZGVyIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIAorICogaW1wbGVtZW50ZWQgYnkgYWxsIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVycyB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiAKKyAqIGFjY2Vzc2luZyBhbmQgcmV0cmlldmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5kZXJseWluZyBzeXN0ZW0uIAorICogCisgKiBUaGUgaW50ZXJmYWNlIGRlZmluZXMgZml2ZSBtYW5kYXRvcnkgZnVuY3Rpb25zOgorICogICAgLSBfX2NvbnN0cnVjdDogUHJvdmlkZSBhbnkgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYnV0IGRvCisgKiAgICAgICAgICAgICAgIG5vdCBhY3R1YWxseSBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4KKyAqICAgIC0gY29ubmVjdDogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGFjdHVhbGx5IGNvbm5lY3RpbmcgdG8gdGhlIAorICogICAgICAgICAgICAgICB1bmRlcmx5aW5nIHN5c3RlbS4gT3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgZWl0aGVyIGhlcmUgb3IgaW4gCisgKiAgICAgICAgICAgICAgIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKG9yIGJvdGgpLCBidXQgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIAorICogICAgICAgICAgICAgICB1bmRlcmx5aW5nIHN5c3RlbSBzaG91bGQgbm90IGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGZ1bmN0aW9uIAorICogICAgICAgICAgICAgICBpcyBpbnZva2VkLgorICogICAgLSBkaXNjb25uZWN0OiBEaXNjb25uZWN0IGZyb20gdGhlIHVuZGVybHlpbmcgc3lzdGVtLCBwZXJmb3JtaW5nIGFueQorICogICAgICAgICAgICAgICBuZWNlc3NhcnkgY2xlYW4gdXAgb3BlcmF0aW9ucyBpbiB0aGUgcHJvY2Vzcy4KKyAqICAgIC0gY2hlY2tMb2dpbjogQ2hlY2sgaWYgYSB2YWxpZCB1c2VyIGhhcyBsb2dnZWQgaW4uCisgKiAgICAtIGxvZ2luOiAgIERldGVybWluZSB0aGUgYWJpbGl0eSB0byBnYWluIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0gCisgKiAgICAJCQkgYXMgYSBsZWdpdGltYXRlIHVzZXIuIFRoZSByZXF1aXJlbWVudHMgYXJlIGEgdmFsaWQgdXNlcm5hbWUgCisgKiAgICAJCQkgKG9yIHVzZXIgSUQpIGFuZCBwYXNzd29yZC4KKyAqICAgIC0gbG9nb3V0OiAgRW5kaW5nIHRoZSB1c2VyJ3Mgc2Vzc2lvbiB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisgKiAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAKKyAqICAgRnJhbWV3b3JrIGltcGxlbWVudGF0aW9ucyBvZiBjb21tb24gYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIGNhbiBiZSBmb3VuZCBpbjoKKyAqICAge0xJQn0vY2xhc3Nlcy9hdXRoZW50aWNhdGlvblByb3ZpZGVycyAgIGFuZCBzaG91bGQgYmUgbmFtZWQgRm9vQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcy5waHAuCisgKiAgIEZyYW1ld29yayBhdXRoZW50aWNhdGlvbiBwcm92aWRlcnMgY2FuIGJlIGludm9rZWQgYnkgZG9pbmc6CisgKiAgICAgICAgICAkYXBwLT5HZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCdGb29BdXRoZW50aWNhdGlvblByb3ZpZGVyJyk7CisgKiAgIAorICogICBDdXN0b20gYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIHNob3VsZCBiZSBwbGFjZWQgaW46CisgKiAgIHtIT01FfS9jbGFzc2VzL2F1dGhlbnRpY2F0aW9uUHJvdmlkZXJzICBhbmQgc2hvdWxkIGJlIG5hbWVkIEZvb0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwLgorICogICBDdXN0b20gYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIGNhbiBiZSBpbnZva2VkIGJ5IGRvaW5nOgorICogICAgICAgICAgJGFwcC0+R2V0QXV0aGVudGljYXRpb25Qcm92aWRlcignZm9vJyx0cnVlKTsgLy8gdHJ1ZSAtLT4gY3VzdG9tCisgKiAKKyAqIEBhdXRob3Igcy5raHVkaWt5YW4KKyAqIAorICovCisKK2NsYXNzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX1Byb3ZpZGVyc19BdXRob3JpemF0aW9uX0xEQVBBdXRob3JpemF0aW9uUHJvdmlkZXIgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlciB7CisJCisJLyoqCisJICogSWYgYXV0aG9yaXphdGlvbiBjb25maWcgZmlsZSBleGlzdHMsIHJlcXVpcmUoZmlsZV9uYW1lKSBmaWxlCisJICovCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgeworCQkvLyBTZXQgTERBUCBjb25zdGFudHMKKwkJZGVmaW5lKCJBVVRIX0JBU0VfRE4iLCAgIEFwcDo6R2V0KCktPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2xkYXBfYmFzZV9kbiddKTsKKwkJZGVmaW5lKCJBVVRIX0dST1VQU19ETiIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2xkYXBfZ3JvdXBfZG4nXSk7CisJCWRlZmluZSgiQVVUSF9MREFQX0hPU1QiLCBBcHA6OkdldCgpLT5zZXR0aW5nc1snYXV0aG9yaXphdGlvbl9sZGFwX2hvc3QnXSk7CisJCWRlZmluZSgiQVVUSF9MREFQX1BPUlQiLCBBcHA6OkdldCgpLT5zZXR0aW5nc1snYXV0aG9yaXphdGlvbl9sZGFwX3BvcnQnXSk7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZUdyb3Vwc0ZvclVzZXIoJHVzZXJuYW1lLCRzZWFyY2hEaXJlY3RvcnkgPSBBVVRIX0dST1VQU19ETikgeworCQkKKwkJLy8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGxkYXAgc2VydmVyIAorCQkkbGRhcGNvbm4gPSAkdGhpcy0+Y29ubmVjdChBVVRIX0xEQVBfSE9TVCxBVVRIX0xEQVBfUE9SVCk7CisJCSRncm91cHMgICA9IGFycmF5KCk7CisJCWlmICgkbGRhcGNvbm4pIHsKKwkJCSRmaWx0ZXIgPSAiKCYob2JqZWN0Q2xhc3M9Z3JvdXBPZlVuaXF1ZU5hbWVzKSIKKwkJCQkuIih1bmlxdWVNZW1iZXI9dWlkPXskdXNlcm5hbWV9LCIgLiBBVVRIX0JBU0VfRE4gLiAiKSkiOworCQkJJHJlc3VsdCA9IGxkYXBfc2VhcmNoKCRsZGFwY29ubiwkc2VhcmNoRGlyZWN0b3J5LCRmaWx0ZXIsYXJyYXkoJ2NuJykpOworCQkJCisJCQlpZiAoJHJlc3VsdCkgeworCQkJCSRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkbGRhcGNvbm4sJHJlc3VsdCk7CisJCQkJZm9yZWFjaCAoJGVudHJpZXMgYXMgJHJhd0dyb3VwKSB7CisJCQkJCWlmIChpc3NldCgkcmF3R3JvdXBbJ2NuJ11bMF0pIAorCQkJCQkmJiAkcmF3R3JvdXBbJ2NuJ11bMF0gIT0gJycpIHsKKwkJCQkJCSRncm91cHNbXSA9ICRyYXdHcm91cFsnY24nXVswXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSAKKwkJcmV0dXJuICRncm91cHM7CisJfQorCQkJCisJcHVibGljIGZ1bmN0aW9uIGNvbm5lY3QoKSB7CisJCWlmICgkY29ubiA9IGxkYXBfY29ubmVjdChmdW5jX2dldF9hcmcoMCksZnVuY19nZXRfYXJnKDEpKSkgeworCQkJLy8gQ29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCQkJJHRoaXMtPmNvbm5lY3Rpb25TdGF0dXMgPSAxOworCQkJbGRhcF9zZXRfb3B0aW9uKCRjb25uLCBMREFQX09QVF9QUk9UT0NPTF9WRVJTSU9OLCAzKTsKKwkJCWxkYXBfc2V0X29wdGlvbigkY29ubiwgTERBUF9PUFRfREVCVUdfTEVWRUwsIDcpOworCQkJbGRhcF9zZXRfb3B0aW9uKCRjb25uLCBMREFQX09QVF9SRUZFUlJBTFMsIDApOwkKKwkJCSR0aGlzLT5jb25uID0gJGNvbm47CisJCQlyZXR1cm4gJGNvbm47CisJCX0gZWxzZSB7CisJCQkvLyBDb25uZWN0aW9uIGZhaWxlZAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQkJCit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbGliL3BlYXIvUHJvdmlkZXJzL0RhdGEvTURCMkRhdGFQcm92aWRlci5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvUHJvdmlkZXJzL0RhdGEvTURCMkRhdGFQcm92aWRlci5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5YzAyZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvRGF0YS9NREIyRGF0YVByb3ZpZGVyLmNsYXNzLnBocApAQCAtMCwwICsxLDEzNyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiAKKyAqIE9PRFQgQmFsYW5jZQorICogV2ViIEFwcGxpY2F0aW9uIEJhc2UgRnJhbWV3b3JrCisgKiAKKyAqIEltcGxlbWVudGF0aW9uIG9mIElBcHBsaWNhdGlvbkRhdGFQcm92aWRlciBmb3IgUEVBUiBNREIyLgorICogCisgKiBAYXV0aG9yIHMua2h1ZGlreWFuCisgKiBAYXV0aG9yIGFoYXJ0CisgKiAKKyAqLworcmVxdWlyZV9vbmNlKCAnTURCMi5waHAnICk7CisKK2NsYXNzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX1Byb3ZpZGVyc19EYXRhX01EQjJEYXRhUHJvdmlkZXIgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkRhdGFQcm92aWRlciB7CisJCisJcHVibGljICRsaW5rOworCQorCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucyA9IGFycmF5KCkpIHsKKwkJCisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCRvcHRpb25zID0gYXJyYXkoKSkgeworCQkkZHNuID0gJ215c3FsOi8vJy4kb3B0aW9uc1sndXNlcm5hbWUnXS4nOicuJG9wdGlvbnNbJ3Bhc3N3b3JkJ10uJ0AnLiRvcHRpb25zWydzZXJ2ZXInXS4nLycuJG9wdGlvbnNbJ2RhdGFiYXNlJ107CisJCSR0aGlzLT5saW5rID0gTURCMjo6c2luZ2xldG9uKCAkZHNuICk7CisJCQorCQlpZiAoIFBFQVI6OmlzRXJyb3IoJHRoaXMtPmxpbmspICkgeworCisJCQlkaWUoIlRoZXJlIHdhcyBhbiBlcnJvciBjb25uZWN0aW5nIHRvIHRoZSBkYXRhYmFzZTogIiAuICR0aGlzLT5saW5rLT5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBkaXNjb25uZWN0KCRvcHRpb25zID0gYXJyYXkoKSkgeworCQlpZiAoJHRoaXMtPmxpbmspIHsKKwkJCSR0aGlzLT5saW5rLT5kaXNjb25uZWN0KCk7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHJlcXVlc3QoJHJlcXVlc3QsJG9wdGlvbnMgPSBhcnJheSgpICkgeyAKKwkJJGRhdGEgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZSgpOworCQkKKwkJaWYgKCR0aGlzLT5saW5rKSB7CisJCQkKKwkJCS8vIEhhbmRsZSBhc3NvY2lhdGl2ZSBhcnJheQorCQkJaWYgKGlzc2V0KCRvcHRpb25zWydmb3JtYXQnXSkgJiYgCisJCQkJc3RydG9sb3dlcigkb3B0aW9uc1snZm9ybWF0J10pID09ICdhc3NvYycpIHsKKwkJCQkJCisJCQkJCS8vIEV4ZWN1dGUgdGhlIHJlcXVlc3QgYW5kIGJ1aWxkIGEgcmVzcG9uc2Ugb2JqZWN0CisJCQkJCSRyZXN1bHQgID0gJHRoaXMtPmxpbmstPnF1ZXJ5QWxsKCRyZXF1ZXN0LG51bGwsTURCMl9GRVRDSE1PREVfQVNTT0MpOworCQkJfQorCisJCQkvLyBIYW5kbGUgbnVtZXJpYyBhcnJheQorCQkJZWxzZSB7CisJCQkJCisJCQkJLy8gRXhlY3V0ZSB0aGUgcmVxdWVzdCBhbmQgYnVpbGQgYSByZXNwb25zZSBvYmplY3QKKwkJCQkkcmVzdWx0ICA9ICR0aGlzLT5saW5rLT5xdWVyeUFsbCgkcmVxdWVzdCxudWxsLE1EQjJfRkVUQ0hNT0RFX09SREVSRUQpOworCQkJfQorCQkJCisJCQlpZiAoIFBFQVI6OmlzRXJyb3IoJHJlc3VsdCkgKSB7CisJCQkJCisJCQkJJGRhdGEtPnNldEVycm9yKCRyZXN1bHQtPmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuICRkYXRhOworCQkJfSBlbHNlIHsKKwkJCQkKKwkJCQkvLyBTdG9yZSB0aGUgcmVxdWVzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkYXRhCisJCQkJJGRhdGEtPmJ1bGtBZGQoJHJlc3VsdCk7CisJCQkJCisJCQkJLy8gRnJlZSB0aGUgcmVxdWVzdAorCQkJCSR0aGlzLT5saW5rLT5mcmVlKCk7CisJCQkJCisJCQkJLy8gUmV0dXJuIHRoZSByZXF1ZXN0ZWQgZGF0YQorCQkJCXJldHVybiAkZGF0YTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSRkYXRhLT5zZXRFcnJvcigiVW5hYmxlIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIGRhdGEgc291cmNlIik7CisJCQlyZXR1cm4gJGRhdGE7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGNvbW1hbmQoJGNvbW1hbmQsJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCSRkYXRhID0gbmV3IE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0NvcmVfQXBwbGljYXRpb25EYXRhUmVzcG9uc2UoKTsKKwkJCisJCWlmICgkdGhpcy0+bGluaykgeworCQkJCisJCQkkcmVzdWx0ID0gJHRoaXMtPmxpbmstPmV4ZWMoJGNvbW1hbmQpOworCQkJCisJCQlpZiAoIFBFQVI6OmlzRXJyb3IoJHJlc3VsdCkgKSB7CisJCQkJCisJCQkJJGRhdGEtPnNldEVycm9yKCRyZXN1bHQtPmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuICRkYXRhOworCQkJfQorCQl9IGVsc2UgeworCQkJJGRhdGEtPnNldEVycm9yKCJVbmFibGUgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gZGF0YSBzb3VyY2UiKTsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbGFzdEluc2VydGVkSWQoJG9wdGlvbnMgPSBhcnJheSgpKXsKKwkJJGRhdGEgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZSgpOworCQkKKwkJaWYgKCR0aGlzLT5saW5rKSB7CisJCQkKKwkJCSRyZXN1bHQgPSAkdGhpcy0+bGluay0+bGFzdEluc2VydElkKCk7CisJCQkKKwkJCWlmICggUEVBUjo6aXNFcnJvcigkcmVzdWx0KSApIHsKKwkJCQkKKwkJCQkkZGF0YS0+c2V0RXJyb3IoJHJlc3VsdC0+Z2V0TWVzc2FnZSgpKTsKKwkJCQlyZXR1cm4gJGRhdGE7CisJCQl9IGVsc2UgeworCQkJCQkJCQorCQkJCXJldHVybiAkcmVzdWx0OworCQkJCQorCQkJfQorCQl9IGVsc2UgeworCQkJJGRhdGEtPnNldEVycm9yKCJVbmFibGUgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gZGF0YSBzb3VyY2UiKTsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvRGF0YS9NeVNxbERhdGFQcm92aWRlci5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvUHJvdmlkZXJzL0RhdGEvTXlTcWxEYXRhUHJvdmlkZXIuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzkzYzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvUHJvdmlkZXJzL0RhdGEvTXlTcWxEYXRhUHJvdmlkZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsMTI4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIAorICogT09EVCBCYWxhbmNlCisgKiBXZWIgQXBwbGljYXRpb24gQmFzZSBGcmFtZXdvcmsKKyAqIAorICogSW1wbGVtZW50YXRpb24gb2YgSUFwcGxpY2F0aW9uRGF0YVByb3ZpZGVyIGZvciBhIE15U3FsIGRhdGFiYXNlLgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiAKKyAqLworY2xhc3MgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfUHJvdmlkZXJzX0RhdGFfTXlTcWxEYXRhUHJvdmlkZXIgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkRhdGFQcm92aWRlciB7CisJCisJcHVibGljICRsaW5rOworCQorCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucyA9IGFycmF5KCkpIHsKKwkJCisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCRvcHRpb25zID0gYXJyYXkoKSkgeworCQkkdGhpcy0+bGluayA9IG15c3FsX2Nvbm5lY3QoJG9wdGlvbnNbJ3NlcnZlciddLAorCQkJJG9wdGlvbnNbJ3VzZXJuYW1lJ10sCisJCQkkb3B0aW9uc1sncGFzc3dvcmQnXSkgb3IgCisJCQlkaWUoIkNvdWxkIG5vdCBjb25uZWN0OiAiIC4gbXlzcWxfZXJyb3IoKSk7CisJCQlteXNxbF9zZWxlY3RfZGIoJG9wdGlvbnNbJ2RhdGFiYXNlJ10sJHRoaXMtPmxpbmspIG9yCisJCQlkaWUoIkNvdWxkIG5vdCBzZWxlY3QgZGF0YWJhc2U6ICIgLiBteXNxbF9lcnJvcigpKTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCWlmICgkdGhpcy0+bGluaykgeworCQkJbXlzcWxfY2xvc2UoJHRoaXMtPmxpbmspOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZXF1ZXN0KCRyZXF1ZXN0LCRvcHRpb25zID0gYXJyYXkoKSkgeworCQlpZiAoJHRoaXMtPmxpbmspIHsKKwkJCQorCQkJLy8gRXhlY3V0ZSB0aGUgcmVxdWVzdCBhbmQgYnVpbGQgYSByZXNwb25zZSBvYmplY3QKKwkJCSRyYXcgID0gbXlzcWxfcXVlcnkoJHJlcXVlc3QsJHRoaXMtPmxpbmspOworCQkJJGRhdGEgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZSgpOworCQkJCisJCQlpZiAoJycgIT0gKCRlcnJNZXNzYWdlID0gbXlzcWxfZXJyb3IoJHRoaXMtPmxpbmspKSkgeworCQkJCSRkYXRhLT5zZXRFcnJvcigkZXJyTWVzc2FnZSk7CisJCQkJcmV0dXJuICRkYXRhOworCQkJfSBlbHNlIHsKKwkJCQorCQkJCS8vIEhhbmRsZSBhc3NvY2lhdGl2ZSBhcnJheQorCQkJCWlmIChpc3NldCgkb3B0aW9uc1snZm9ybWF0J10pICYmIAorCQkJCQlzdHJ0b2xvd2VyKCRvcHRpb25zWydmb3JtYXQnXSkgPT0gJ2Fzc29jJykgeworCQkJCQkkaWR4ID0gMDsKKwkJCQkJd2hpbGUgKGZhbHNlICE9PSAkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHJhdykpIHsKKwkJCQkJCWlmIChpc3NldCgkb3B0aW9uc1snaW5kZXhLZXknXSkpIHsKKwkJCQkJCQkkZGF0YS0+YWRkKCRyYXdbJG9wdGlvbnNbJ2luZGV4S2V5J11dLCRyb3cpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkkZGF0YS0+YWRkKCRpZHgrKywkcm93KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gCisJCQkJCisJCQkJLy8gSGFuZGxlIG51bWVyaWMgYXJyYXkKKwkJCQllbHNlIHsKKwkJCQkJJGlkeCA9IDA7CisJCQkJCXdoaWxlIChmYWxzZSAhPT0gJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcmF3KSkgeworCQkJCQkJaWYgKGlzc2V0KCRvcHRpb25zWydpbmRleEtleSddKSkgeworCQkJCQkJCSRkYXRhLT5hZGQoJHJhd1skb3B0aW9uc1snaW5kZXhLZXknXV0sJHJvdyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCSRkYXRhLT5hZGQoJGlkeCsrLCRyb3cpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8vIFN0b3JlIHRoZSByZXF1ZXN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRhdGEKKwkJCQkkZGF0YS0+c2V0UmVxdWVzdFN0cmluZygkcmVxdWVzdCk7CisJCQkJCisJCQkJLy8gRnJlZSB0aGUgcmVxdWVzdAorCQkJCW15c3FsX2ZyZWVfcmVzdWx0KCRyYXcpOworCQkJCQorCQkJCS8vIFJldHVybiB0aGUgcmVxdWVzdGVkIGRhdGEKKwkJCQlyZXR1cm4gJGRhdGE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkkZGF0YSA9IG5ldyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uRGF0YVJlc3BvbnNlKCk7CisJCQkkZGF0YS0+c2V0RXJyb3IoIlVuYWJsZSB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBkYXRhIHNvdXJjZSIpOworCQkJcmV0dXJuICRkYXRhOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBjb21tYW5kKCRjb21tYW5kLCRvcHRpb25zID0gYXJyYXkoKSkgeworCQlpZiAoJHRoaXMtPmxpbmspIHsKKwkJCQorCQkJbXlzcWxfcXVlcnkoJGNvbW1hbmQpOworCQkJCisJCX0gZWxzZSB7CisJCQkkZGF0YSA9IE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0NvcmVfQXBwbGljYXRpb25EYXRhUmVzcG9uc2UoKTsKKwkJCSRkYXRhLT5zZXRFcnJvcigiVW5hYmxlIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIGRhdGEgc291cmNlIik7CisJCQlyZXR1cm4gJGRhdGE7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGxhc3RJbnNlcnRlZElkKCRvcHRpb25zID0gYXJyYXkoKSl7CisJCWlmICgkdGhpcy0+bGluaykgeworCQkJCisJCQlyZXR1cm4gbXlzcWxfaW5zZXJ0X2lkKCk7CisJCQkKKwkJfSBlbHNlIHsKKwkJCSRkYXRhID0gT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZSgpOworCQkJJGRhdGEtPnNldEVycm9yKCJVbmFibGUgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gZGF0YSBzb3VyY2UiKTsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvRGF0YS9QRE9EYXRhUHJvdmlkZXIuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1Byb3ZpZGVycy9EYXRhL1BET0RhdGFQcm92aWRlci5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNTMwYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvRGF0YS9QRE9EYXRhUHJvdmlkZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsMTQyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIAorICogT09EVCBCYWxhbmNlCisgKiBXZWIgQXBwbGljYXRpb24gQmFzZSBGcmFtZXdvcmsKKyAqIAorICogSW1wbGVtZW50YXRpb24gb2YgSUFwcGxpY2F0aW9uRGF0YVByb3ZpZGVyIGZvciBQSFAgUERPLgorICogCisgKiBAYXV0aG9yIHMua2h1ZGlreWFuCisgKiBAYXV0aG9yIGFoYXJ0CisgKiAKKyAqLworY2xhc3MgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfUHJvdmlkZXJzX0RhdGFfUERPRGF0YVByb3ZpZGVyIAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25EYXRhUHJvdmlkZXIgeworCQorCXB1YmxpYyAkbGluazsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgkb3B0aW9ucyA9IGFycmF5KCkpIHsKKwkJdHJ5IHsKKwkJCSRkc24gPSAnbXlzcWw6aG9zdD0nLiRvcHRpb25zWydzZXJ2ZXInXS4nO2RibmFtZT0nLiRvcHRpb25zWydkYXRhYmFzZSddOworCQkJJHRoaXMtPmxpbmsgPSBuZXcgUERPKCAkZHNuLCAkb3B0aW9uc1sndXNlcm5hbWUnXSwgJG9wdGlvbnNbJ3Bhc3N3b3JkJ10gKTsKKwkJfSBjYXRjaCAoUERPRXhjZXB0aW9uICRlKSB7CisJCQlkaWUoIlRoZXJlIHdhcyBhbiBlcnJvciBjb25uZWN0aW5nIHRvIHRoZSBkYXRhYmFzZTogIiAuICRlLT5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBkaXNjb25uZWN0KCRvcHRpb25zID0gYXJyYXkoKSkgeworCQlpZiAoJHRoaXMtPmxpbmspIHsKKwkJCS8qKiogY2xvc2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gKioqLworICAgIAkJJHRoaXMtPmxpbmsgPSBudWxsOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZXF1ZXN0KCRyZXF1ZXN0LCRvcHRpb25zID0gYXJyYXkoKSApIHsKKwkJJGRhdGEgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZSgpOworCQkKKwkJaWYgKCR0aGlzLT5saW5rKSB7CisJCQkKKwkJCS8vIEhhbmRsZSBhc3NvY2lhdGl2ZSBhcnJheQorCQkJaWYgKGlzc2V0KCRvcHRpb25zWydmb3JtYXQnXSkgJiYgCisJCQkJc3RydG9sb3dlcigkb3B0aW9uc1snZm9ybWF0J10pID09ICdhc3NvYycpIHsKKwkJCQkJCisJCQkJCXRyeSB7CisJCQkJCQkvLyBmZXRjaCBpbnRvIGFuIFBET1N0YXRlbWVudCBvYmplY3QKKyAgICAJCQkJCSRzdG10ID0gJHRoaXMtPmxpbmstPnF1ZXJ5QWxsKCRyZXF1ZXN0KTsKKyAgICAJCQkJCSRyZXN1bHQgPSAkc3RtdC0+ZmV0Y2goUERPOjpGRVRDSF9BU1NPQyk7CisJCQkJCX0gY2F0Y2ggKFBET0V4Y2VwdGlvbiAkZSkgeworCQkJCQkJCisJCQkJCQkkZGF0YS0+c2V0RXJyb3IoICRlLT5nZXRNZXNzYWdlKCkgKTsKKwkJCQkJCXJldHVybiAkZGF0YTsKKwkJCQkJfQorCQkJfQorCisJCQkvLyBIYW5kbGUgbnVtZXJpYyBhcnJheQorCQkJZWxzZSB7CisJCQkJCXRyeSB7CQorCQkJCQkJLy8gZmV0Y2ggaW50byBhbiBQRE9TdGF0ZW1lbnQgb2JqZWN0CisgICAgCQkJCQkkc3RtdCA9ICR0aGlzLT5saW5rLT5xdWVyeUFsbCgkcmVxdWVzdCk7CisgICAgCQkJCQkkcmVzdWx0ID0gJHN0bXQtPmZldGNoKFBETzo6RkVUQ0hfTlVNKTsKKwkJCQkJfSBjYXRjaCAoUERPRXhjZXB0aW9uICRlKSB7CisJCQkJCQkKKwkJCQkJCSRkYXRhLT5zZXRFcnJvciggJGUtPmdldE1lc3NhZ2UoKSApOworCQkJCQkJcmV0dXJuICRkYXRhOworCQkJCQl9CisJCQl9CisJCQkJCisJCQkvLyBTdG9yZSB0aGUgcmVxdWVzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkYXRhCisJCQkkZGF0YS0+YnVsa0FkZCgkcmVzdWx0KTsKKwkJCQorCQkJLy8gRnJlZSB0aGUgcmVxdWVzdAorCQkJJHRoaXMtPmxpbmstPmZyZWUoKTsKKwkJCQorCQkJLy8gUmV0dXJuIHRoZSByZXF1ZXN0ZWQgZGF0YQorCQkJcmV0dXJuICRkYXRhOworCisJCX0gZWxzZSB7CisJCQkkZGF0YS0+c2V0RXJyb3IoIlVuYWJsZSB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBkYXRhIHNvdXJjZSIpOworCQkJcmV0dXJuICRkYXRhOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBjb21tYW5kKCRjb21tYW5kLCRvcHRpb25zID0gYXJyYXkoKSkgeworCQkkZGF0YSA9IG5ldyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9Db3JlX0FwcGxpY2F0aW9uRGF0YVJlc3BvbnNlKCk7CisJCQorCQlpZiAoJHRoaXMtPmxpbmspIHsKKwkJCQorCQkJdHJ5IHsKKwkJCQkKKwkJCQkkcmVzdWx0ID0gJHRoaXMtPmxpbmstPmV4ZWMoICRjb21tYW5kICk7CisJCQl9IGNhdGNoIChQRE9FeGNlcHRpb24gJGUpIHsKKwkJCQkKKwkJCQkkZGF0YS0+c2V0RXJyb3IoICRlLT5nZXRNZXNzYWdlKCkgKTsKKwkJCQlyZXR1cm4gJGRhdGE7CisJCQl9CisJCQkKKwkJfSBlbHNlIHsKKwkJCSRkYXRhLT5zZXRFcnJvciggIlVuYWJsZSB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBkYXRhIHNvdXJjZSIgKTsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbGFzdEluc2VydGVkSWQoJG9wdGlvbnMgPSBhcnJheSgpKXsKKwkJJGRhdGEgPSBuZXcgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfQ29yZV9BcHBsaWNhdGlvbkRhdGFSZXNwb25zZSgpOworCQkKKwkJaWYgKCR0aGlzLT5saW5rKSB7CisJCQkKKwkJCXRyeSB7CisJCQkJJGxhc3RJZCA9ICR0aGlzLT5saW5rLT5sYXN0SW5zZXJ0SWQoKTsJCQkJCisJCQl9IGNhdGNoIChQRE9FeGNlcHRpb24gJGUpIHsKKwkJCQkKKwkJCQkkZGF0YS0+c2V0RXJyb3IoICRlLT5nZXRNZXNzYWdlKCkgKTsKKwkJCQlyZXR1cm4gJGRhdGE7CisJCQl9CisJCQlyZXR1cm4gJGxhc3RJZDsKKwkJCQorCQl9IGVsc2UgeworCQkJJGRhdGEtPnNldEVycm9yKCJVbmFibGUgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gZGF0YSBzb3VyY2UiKTsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvRXJyb3IvRGVmYXVsdEVycm9yUHJvdmlkZXIuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1Byb3ZpZGVycy9FcnJvci9EZWZhdWx0RXJyb3JQcm92aWRlci5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MjlmMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9saWIvcGVhci9Qcm92aWRlcnMvRXJyb3IvRGVmYXVsdEVycm9yUHJvdmlkZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsMzggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiBPT0RUIEJhbGFuY2UKKyAqIFdlYiBBcHBsaWNhdGlvbiBCYXNlIEZyYW1ld29yaworICogCisgKiBBIHZlcnkgc2ltcGxlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElBcHBsaWNhdGlvbkVycm9yUHJvdmlkZXIgCisgKiBpbnRlcmZhY2UgdGhhdCBzaW1wbHkgbG9va3MgZm9yIGEgdmlldyBpbiBIT01FL3ZpZXdzL2NvbW1vbi8jIyMucGhwIHdoZXJlCisgKiAjIyMgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaHR0cCBjb2RlLgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKi8KK2NsYXNzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX1Byb3ZpZGVyc19FcnJvcl9EZWZhdWx0RXJyb3JQcm92aWRlciAKKwlpbXBsZW1lbnRzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0ludGVyZmFjZXNfSUFwcGxpY2F0aW9uRXJyb3JQcm92aWRlciB7CisJCQorCisJcHVibGljIGZ1bmN0aW9uIGVycm9yKCRodHRwUmVzcG9uc2VDb2RlLCRtZXNzYWdlID0gJycsJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCXJlcXVpcmUoSE9NRSAuICcvdmlld3MvZXJyb3IvJyAuICRodHRwUmVzcG9uc2VDb2RlIC4gJy5waHAnKTsKKwkJZXhpdCgpOworCX0KKwkJCit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbGliL3BlYXIvUkVBRE1FIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU0ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL1JFQURNRQpAQCAtMCwwICsxLDM0IEBACitPT0RUIEJhbGFuY2UgLSBGcmFtZXdvcmsgTGlicmFyeQorCitPVkVSVklFVworPT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyB0aGUgT09EVCBCYWxhbmNlIEZyYW1ld29yayBsaWJyYXJ5LiBJdCBwcm92aWRlcyBhIGNvbW1vbiBjb2RlYmFzZQordXBvbiB3aGljaCB0byBidWlsZCBQSFAgd2ViIGFwcGxpY2F0aW9ucyB1dGlsaXppbmcgdGhlIE9PRFQgZnJhbWV3b3JrLgorCitNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vb29kdC5hcGFjaGUub3JnLworCitJTlNUQUxMQVRJT04KKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBsaWJyYXJ5IGlzIHByb3ZpZGVkIGFzIGEgUEhQIEV4dGVuc2lvbiBhbmQgQXBwbGljYXRpb24gUmVwb3NpdG9yeSAoUEVBUikKK3BhY2thZ2UuIE1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGluc3RhbGwgdGhlIFBFQVIgcGFja2FnZSBtYW5hZ2VyIG9uIHlvdXIKK3N5c3RlbSBjYW4gYmUgZm91bmQgYXQ6IGh0dHA6Ly9wZWFyLnBocC5uZXQvbWFudWFsL2VuL2luc3RhbGxhdGlvbi5waHAKKworQXNzdW1pbmcgeW91IGhhdmUgdGhlIFBFQVIgcGFja2FnZSBtYW5hZ2VyIGluc3RhbGxlZCBjb3JyZWN0bHk6CisKKzEpICJjZCIgaW50byB0aGUgc3JjL3BlYXIgZGlyZWN0b3J5ICh5b3Ugc2hvdWxkIHNlZSBhIHBhY2thZ2UueG1sIGZpbGUpCisyKSBCdWlsZCB0aGUgcGVhciBwYWNrYWdlOiAKKyAgICQgcGVhciBwYWNrYWdlCiszKSBJbnN0YWxsIHRoZSByZXN1bHRpbmcgdGFyYmFsbDoKKyAgICQgKHN1ZG8pIHBlYXIgaW5zdGFsbCAtLWZvcmNlIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlXy4uLnRnegorCisKK1VTQUdFCis9PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBsaWJyYXJ5IGZvcm1zIGEgY29kZWJhc2UgdXBvbiB3aGljaCBhcHBsaWNhdGlvbnMgY2FuIGJlIGRldmVsb3BlZC4gSXQgaXMgYQorcHJlcmVxdWlzaXRlIGZvciBCYWxhbmNlIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LCBidXQgY2FuIGRvIG5vdGhpbmcgb24gaXRzIG93bi4KK0ZvciBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBhbmQgZGV2ZWxvcGluZyBhcHBsaWNhdGlvbnMgdGhhdCB0YXJnZXQgdGhpcyBsaWJyYXJ5LAordmlzaXQgaHR0cDovL29vZHQuYXBhY2hlLm9yZy8KKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL3BhY2thZ2UueG1sIGIvMC4xMC9iYWxhbmNlL2xpYi9wZWFyL3BhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWM1YTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbGliL3BlYXIvcGFja2FnZS54bWwKQEAgLTAsMCArMSwxMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzwhLS0gCisgICBAcGFja2FnZSBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZQorICAgQGF1dGhvciBBbmRyZXcgRi4gSGFydAorICAgQHZlcnNpb24gJElkJAorLS0+Cis8cGFja2FnZSB2ZXJzaW9uPSIyLjAiIHhtbG5zPSJodHRwOi8vcGVhci5waHAubmV0L2R0ZC9wYWNrYWdlLTIuMCIKKyAgeG1sbnM6dGFza3M9Imh0dHA6Ly9wZWFyLnBocC5uZXQvZHRkL3Rhc2tzLTEuMCIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vcGVhci5waHAubmV0L2R0ZC90YXNrcy0xLjAueHNkCisgICAgICAgICBodHRwOi8vcGVhci5waHAubmV0L2R0ZC9wYWNrYWdlLTIuMAorICAgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvcGFja2FnZS0yLjAueHNkIj4KKyAgPG5hbWU+QXBhY2hlX09PRFRfQmFsYW5jZTwvbmFtZT4KKyAgPGNoYW5uZWw+cGVhci5hcGFjaGUub3JnL29vZHQ8L2NoYW5uZWw+CisgIDxzdW1tYXJ5Pk9PRFQgQmFsYW5jZSBXZWJhcHAgQmFzZSBQYWNrYWdlPC9zdW1tYXJ5PgorICA8ZGVzY3JpcHRpb24+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHRoZSBPT0RUIEJhbGFuY2Ugd2ViYXBwLWJhc2UgcGFja2FnZSByZXF1aXJlZAorICAgIGJ5IGFsbCBCYWxhbmNlLWJhc2VkIHdlYiBhcHBsaWNhdGlvbnMuCisgIDwvZGVzY3JpcHRpb24+CisgIDxsZWFkPgorICAgIDxuYW1lPkFuZHJldyBIYXJ0PC9uYW1lPgorICAgIDx1c2VyPmFoYXJ0PC91c2VyPgorICAgIDxlbWFpbD5haGFydEBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICA8YWN0aXZlPnllczwvYWN0aXZlPgorICA8L2xlYWQ+CisgIDxkYXRlPjIwMTMtMDYtMjk8L2RhdGU+CisgIDx2ZXJzaW9uPgorICAgIDxyZWxlYXNlPjAuNi4wPC9yZWxlYXNlPgorICAgIDxhcGk+MC42LjA8L2FwaT4KKyAgPC92ZXJzaW9uPgorICA8c3RhYmlsaXR5PgorICAgIDxyZWxlYXNlPnN0YWJsZTwvcmVsZWFzZT4KKyAgICA8YXBpPnN0YWJsZTwvYXBpPgorICA8L3N0YWJpbGl0eT4KKyAgPGxpY2Vuc2UgdXJpPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFTTCAyLjAgTGljZW5zZTwvbGljZW5zZT4KKyAgPG5vdGVzPgorICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyB0aGUgT09EVCBCYWxhbmNlIHdlYmFwcC1iYXNlIHBhY2thZ2UgcmVxdWlyZWQKKyAgICBieSBhbGwgQmFsYW5jZS1iYXNlZCB3ZWIgYXBwbGljYXRpb25zLgorICA8L25vdGVzPgorICA8Y29udGVudHM+CisgICAgPGRpciBuYW1lPSIvIiBiYXNlaW5zdGFsbGRpcj0iT3JnL0FwYWNoZS9Pb2R0L0JhbGFuY2UiPgorICAgIDxkaXIgbmFtZT0iQm9vdCI+CisgICAgICA8ZmlsZSBuYW1lPSJib290c3RyYXAucGhwIiByb2xlPSJwaHAiLz4KKyAgICA8L2Rpcj4KKyAgICA8ZGlyIG5hbWU9IkNvcmUiPgorICAgICAgPGZpbGUgbmFtZT0iQXBwbGljYXRpb24uY2xhc3MucGhwIiByb2xlPSJwaHAiLz4KKyAgICAgIDxmaWxlIG5hbWU9IkFwcGxpY2F0aW9uRGF0YVJlc3BvbnNlLmNsYXNzLnBocCIgcm9sZT0icGhwIi8+CisgICAgICA8ZmlsZSBuYW1lPSJBcHBsaWNhdGlvblJlcXVlc3QuY2xhc3MucGhwIiByb2xlPSJwaHAiLz4KKyAgICAgIDxmaWxlIG5hbWU9IkFwcGxpY2F0aW9uUmVzcG9uc2UuY2xhc3MucGhwIiByb2xlPSJwaHAiLz4KKyAgICA8L2Rpcj4KKyAgICA8ZGlyIG5hbWU9IkludGVyZmFjZXMiPgorICAgICAgPGZpbGUgbmFtZT0iSUFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlci5waHAiIHJvbGU9InBocCIvPgorICAgICAgPGZpbGUgbmFtZT0iSUFwcGxpY2F0aW9uQXV0aG9yaXphdGlvblByb3ZpZGVyLnBocCIgIHJvbGU9InBocCIvPgorICAgICAgPGZpbGUgbmFtZT0iSUFwcGxpY2F0aW9uRGF0YVByb3ZpZGVyLnBocCIgcm9sZT0icGhwIi8+CisgICAgICA8ZmlsZSBuYW1lPSJJQXBwbGljYXRpb25FcnJvclByb3ZpZGVyLnBocCIgcm9sZT0icGhwIi8+CisgICAgICA8ZmlsZSBuYW1lPSJJQXBwbGljYXRpb25XaWRnZXQucGhwIiByb2xlPSJwaHAiLz4KKyAgICA8L2Rpcj4KKyAgICA8ZGlyIG5hbWU9IlByb3ZpZGVycyI+CisgICAgICA8ZGlyIG5hbWU9IkF1dGhlbnRpY2F0aW9uIj4KKyAgICAgICAgPGZpbGUgbmFtZT0iTERBUEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwIiByb2xlPSJwaHAiLz4KKyAgICAgIDwvZGlyPgorICAgICAgPGRpciBuYW1lPSJBdXRob3JpemF0aW9uIj4KKyAgICAgICAgPGZpbGUgbmFtZT0iTERBUEF1dGhvcml6YXRpb25Qcm92aWRlci5jbGFzcy5waHAiIHJvbGU9InBocCIvPgorICAgICAgPC9kaXI+CisgICAgICA8ZGlyIG5hbWU9IkRhdGEiPgorICAgICAgICA8ZmlsZSBuYW1lPSJNeVNxbERhdGFQcm92aWRlci5jbGFzcy5waHAiIHJvbGU9InBocCIvPgorICAgICAgPC9kaXI+ICAgIAorICAgICAgPGRpciBuYW1lPSJFcnJvciI+CisgICAgICAgIDxmaWxlIG5hbWU9IkRlZmF1bHRFcnJvclByb3ZpZGVyLmNsYXNzLnBocCIgcm9sZT0icGhwIi8+CisgICAgICA8L2Rpcj4gCisgICAgPC9kaXI+CisgICAgPC9kaXI+PCEtLSAvIC0tPgorICA8L2NvbnRlbnRzPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxyZXF1aXJlZD4KKyAgICAgIDxwaHA+CisgICAgICAgIDxtaW4+NS4xLjY8L21pbj4KKyAgICAgIDwvcGhwPgorICAgICAgPHBlYXJpbnN0YWxsZXI+CisgICAgICAgIDxtaW4+MS42LjE8L21pbj4KKyAgICAgIDwvcGVhcmluc3RhbGxlcj4KKyAgICA8L3JlcXVpcmVkPgorICA8L2RlcGVuZGVuY2llcz4KKyAgPHBocHJlbGVhc2UgLz4KKyAgPGNoYW5nZWxvZz4KKyAgICA8cmVsZWFzZT4KKyAgICAgIDx2ZXJzaW9uPgorICAgICAgICA8cmVsZWFzZT4wLjIuMDwvcmVsZWFzZT4KKyAgICAgICAgPGFwaT4wLjIuMDwvYXBpPgorICAgICAgPC92ZXJzaW9uPgorICAgICAgPHN0YWJpbGl0eT4KKyAgICAgICAgPHJlbGVhc2U+c3RhYmxlPC9yZWxlYXNlPgorICAgICAgICA8YXBpPnN0YWJsZTwvYXBpPgorICAgICAgPC9zdGFiaWxpdHk+CisgICAgICA8ZGF0ZT4yMDExLTAyLTAzPC9kYXRlPgorICAgICAgPGxpY2Vuc2UgdXJpPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YiPk9PRFQgTGljZW5zZTwvbGljZW5zZT4KKyAgICAgIDxub3Rlcz4KKyAgICAgIEltcHJvdmVtZW50cyB0byB0aGUgY29yZSBsaWJyYXJ5IHRvIHN1cHBvcnQgbW9yZSBmbGV4aWJsZSB1c2UKKyAgICAgIG9mIG1vZHVsZXMgYW5kIGdyZWF0ZXIgcmV1c2FiaWxpdHkuCisgICAgICA8L25vdGVzPiAgICAgCisgICAgPC9yZWxlYXNlPgorICAgIDxyZWxlYXNlPgorICAgICAgPHZlcnNpb24+CisgICAgICAgIDxyZWxlYXNlPjAuMS4wPC9yZWxlYXNlPgorICAgICAgICA8YXBpPjAuMS4wPC9hcGk+CisgICAgICA8L3ZlcnNpb24+CisgICAgICA8c3RhYmlsaXR5PgorICAgICAgICA8cmVsZWFzZT5zdGFibGU8L3JlbGVhc2U+CisgICAgICAgIDxhcGk+c3RhYmxlPC9hcGk+CisgICAgICA8L3N0YWJpbGl0eT4KKyAgICAgIDxkYXRlPjIwMTAtMTEtMDE8L2RhdGU+CisgICAgICA8bGljZW5zZSB1cmk9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdiI+T09EVCBMaWNlbnNlPC9saWNlbnNlPgorICAgICAgPG5vdGVzPgorICAgICAgVGhpcyByZWxlYXNlIG1hcmtzIHRoZSBmaXJzdCByZWxlYXNlIG9mIHRoZSBPT0RUIEJhbGFuY2Ugd2ViYXBwLWJhc2UgcGFja2FnZS4KKyAgICAgIDwvbm90ZXM+ICAgICAKKyAgICA8L3JlbGVhc2U+CisgIDwvY2hhbmdlbG9nPgorPC9wYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvY2xhc3Nlcy9DYXNCcm93c2VyLmNsYXNzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL2NsYXNzZXMvQ2FzQnJvd3Nlci5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzYTZjOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL2NsYXNzZXMvQ2FzQnJvd3Nlci5jbGFzcy5waHAKQEAgLTAsMCArMSw0NTUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiAkSWQkCisgKiAKKyAqIENBUy1Ccm93c2VyIE1vZHVsZQorICogCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhcHBsaWNhdGlvbnMgYSBtZWFucyBmb3IgYnJvd3NpbmcgYSBDQVMgRmlsZSAKKyAqIE1hbmFnZXIgY2F0YWxvZyBhbmQgb2J0YWluaW5nIHByb2R1Y3RzIGZyb20gYSBDQVMgRmlsZSBNYW5hZ2VyIHJlcG9zaXRvcnkuCisgKiAKKyAqIEZvciBjb21wbGV0ZSBmdW5jdGlvbmFsaXR5LCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisgKiBhcmUgZXhwZWN0ZWQgdG8gYmUgcHJlc2VudCBpbiB0aGUgbW9kdWxlJ3MgY29uZmlnLmluaSBmaWxlOgorICogCisgKiBicm93c2VyX2ZpbGVtZ3JfdXJsICAgIC0gZmlsZW1hbmFnZXIgaG9zdCAoZS5nLjogaHR0cDovL3NvbWVob3N0OjkwMDApCisgKiBicm93c2VyX2ZpbGVtZ3JfcGF0aCAgIC0gZmlsZW1hbmFnZXIgdXJsIG9uIHNlcnZlciAoZS5nLjogLykgIAorICogYnJvd3Nlcl9kYXRhZGVsaXZfdXJsICAtIHRoZSBiYXNlIHVybCB0byB1c2Ugd2hlbiBkb3dubG9hZGluZyBwcm9kdWN0cworICogICAKKyAqIE5PVEU6IFRoaXMgbW9kdWxlIGhhcyBhIGRlcGVuZGVuY3kgdXBvbiB0aGUgQ0FTLUZpbGVtZ3IgUEhQIGNsYXNzZXMKKyAqIChodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RydW5rL2ZpbGVtZ3Ivc3JjL21haW4vcGhwKQorICogICAgICAKKyAqICAgICAgVG8gYnVpbGQgdGhpcyBkZXBlbmRlbmN5LCBjaGVjayBvdXQgdGhlIGFib3ZlIHByb2plY3QgYW5kIHRoZW46CisgKiAgICAgIDEpIGNkIGludG8gdGhlIGNoZWNrZWQgb3V0IHByb2plY3QgKHlvdSBzaG91bGQgc2VlIGEgcGFja2FnZS54bWwgZmlsZSkKKyAqICAgICAgMikgcGVhciBwYWNrYWdlCisgKiAgICAgIDMpIChzdWRvKSBwZWFyIGluc3RhbGwgLS1mb3JjZSBDQVNfRmlsZW1nci4uLnRhci5negorICogICAKKyAqIEBhdXRob3IgYWhhcnQKKyAqIEBhdXRob3IgcmVzbmVjaworICoKKyAqLworLy8gUmVxdWlyZSBDQVMgRmlsZW1nciBDbGFzc2VzCityZXF1aXJlX29uY2UoIkNBUy9GaWxlbWdyL0Jvb2xlYW5RdWVyeUNyaXRlcmlhLmNsYXNzLnBocCIpOworcmVxdWlyZV9vbmNlKCJDQVMvRmlsZW1nci9FbGVtZW50LmNsYXNzLnBocCIpOworcmVxdWlyZV9vbmNlKCJDQVMvRmlsZW1nci9NZXRhZGF0YS5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZSgiQ0FTL0ZpbGVtZ3IvUHJvZHVjdC5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZSgiQ0FTL0ZpbGVtZ3IvUHJvZHVjdFR5cGUuY2xhc3MucGhwIik7CityZXF1aXJlX29uY2UoIkNBUy9GaWxlbWdyL1Byb2R1Y3RQYWdlLmNsYXNzLnBocCIpOworcmVxdWlyZV9vbmNlKCJDQVMvRmlsZW1nci9RdWVyeS5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZSgiQ0FTL0ZpbGVtZ3IvUmFuZ2VRdWVyeUNyaXRlcmlhLmNsYXNzLnBocCIpOworcmVxdWlyZV9vbmNlKCJDQVMvRmlsZW1nci9UZXJtUXVlcnlDcml0ZXJpYS5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZSgiQ0FTL0ZpbGVtZ3IvWG1sUnBjRmlsZW1nckNsaWVudC5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZShkaXJuYW1lKF9fRklMRV9fKSAuICIvVXRpbHMuY2xhc3MucGhwIik7CisKKworY2xhc3MgQ2FzQnJvd3NlciB7CisJCisJY29uc3QgVklTX0lOVEVSUFJFVF9ISURFICAgICA9ICdoaWRlJzsKKwljb25zdCBWSVNfSU5URVJQUkVUX1NIT1cgICAgID0gJ3Nob3cnOworCWNvbnN0IFZJU19BVVRIX0FOT05ZTU9VUyAgICAgPSBmYWxzZTsKKwljb25zdCBWSVNfQVVUSF9BVVRIRU5USUNBVEVEID0gdHJ1ZTsKKwljb25zdCBWSVNfQUxMICAgICAgICAgICAgICAgID0gJ2FsbCc7CisJY29uc3QgVklTX0xJTUlUICAgICAgICAgICAgICA9ICdsaW1pdCc7CisJY29uc3QgVklTX05PTkUgICAgICAgICAgICAgICA9ICdkZW55JzsKKwljb25zdCBWSVNfREVOWSAgICAgICAgICAgICAgID0gJ2RlbnknOworCQorCXB1YmxpYyAkY2xpZW50OworCQorCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKKwkJdHJ5IHsKKwkJCSR0aGlzLT5jbGllbnQgPSBuZXcgQ0FTX0ZpbGVtZ3JfWG1sUnBjRmlsZW1nckNsaWVudCgKKwkJCQlBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9maWxlbWdyX3VybCddLAorCQkJCUFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX2ZpbGVtZ3JfcGF0aCddKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CisJCQlBcHA6OkdldCgpLT5mYXRhbCgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgY29ubmVjdGlvbiB0byAiCisJCQkJLiBBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9maWxlbWdyX3VybCddCisJCQkJLiBBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9maWxlbWdyX3BhdGgnXSk7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGdldENsaWVudCgpIHsKKwkJcmV0dXJuICR0aGlzLT5jbGllbnQ7CisJfQorCQorCS8qKgorCSAqIFVzZSB0aGUgcnVsZXMgaW4gZWxlbWVudC1vcmRlcmluZy5pbmkgdG8gZGV0ZXJtaW5lIHRoZSBkaXNwbGF5IG9yZGVyCisJICogZm9yIHByb2R1Y3QgdHlwZSBtZXRhZGF0YSBlbGVtZW50cy4gU2VlIGVsZW1lbnQtb3JkZXJpbmcuaW5pIGZvciBtb3JlCisJICogaW5mb3JtYXRpb24gb24gaG93IHRvIHNwZWNpZnkgZWxlbWVudCBvcmRlciBydWxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gaW50ZWdlciAkcHJvZHVjdFR5cGVJZCAgVGhlIGlkIG9mIHRoZSBwcm9kdWN0IHR5cGUgdG8gZ2V0IG1ldCBmb3IKKwkgKiBAcGFyYW0gYXJyYXkgICAkbWV0YWRhdGFUb3VzZSAgQW4gb3B0aW9uYWwgYXJyYXkgb2YgbWV0YWRhdGEga2V5L3ZhbHMgdG8gc29ydC4gSWYKKwkgKiAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBwcm92aWRlZCwgdGhlIHByb2R1Y3QgdHlwZSBtZXRhZGF0YSB3aWxsIGJlIHVzZWQuCisJICovCisJcHVibGljIGZ1bmN0aW9uIGdldFNvcnRlZE1ldGFkYXRhKCRwcm9kdWN0VHlwZUlkLCRtZXRhZGF0YVRvVXNlID0gbnVsbCwgJG9yZGVyaW5nQXR0cmlidXRlKSB7CisJCQorCQlpZiAoIWlzX2FycmF5KCRtZXRhZGF0YVRvVXNlKSkgeworCQkJJHB0ID0gJHRoaXMtPmNsaWVudAorCQkJCS0+Z2V0UHJvZHVjdFR5cGVCeUlkKCRwcm9kdWN0VHlwZUlkKQorCQkJCS0+dG9Bc3NvY0FycmF5KCk7CisJCQkkbWV0YWRhdGFBc0FycmF5ID0gJHB0Wyd0eXBlTWV0YWRhdGEnXTsKKwkJfSBlbHNlIHsKKwkJCSRtZXRhZGF0YUFzQXJyYXkgPSAkbWV0YWRhdGFUb1VzZTsKKwkJfQorCQkKKwkJJG9yZGVyaW5nUG9saWN5RmlsZVBhdGggPSBkaXJuYW1lKGRpcm5hbWUoX19GSUxFX18pKSAuICcvZWxlbWVudC1vcmRlcmluZy5pbmknOworCQlpZiAoZmlsZV9leGlzdHMoJG9yZGVyaW5nUG9saWN5RmlsZVBhdGgpKSB7CisJCQkkb3JkZXJQb2xpY3kgPSBwYXJzZV9pbmlfZmlsZSgkb3JkZXJpbmdQb2xpY3lGaWxlUGF0aCx0cnVlKTsKKworCQkJJGZpcnN0ICAgID0gaXNzZXQoJG9yZGVyUG9saWN5WyRwcm9kdWN0VHlwZUlkXVskb3JkZXJpbmdBdHRyaWJ1dGUgLiAnLmVsZW1lbnQub3JkZXJpbmcuZmlyc3QnXSkgCisJCQkJPyAkb3JkZXJQb2xpY3lbJHByb2R1Y3RUeXBlSWRdWyRvcmRlcmluZ0F0dHJpYnV0ZSAuICcuZWxlbWVudC5vcmRlcmluZy5maXJzdCddCisJCQkJOiAkb3JkZXJQb2xpY3lbJyonXVskb3JkZXJpbmdBdHRyaWJ1dGUgLiAnLmVsZW1lbnQub3JkZXJpbmcuZmlyc3QnXTsKKwkJCSRsYXN0ICAgICA9IGlzc2V0KCRvcmRlclBvbGljeVskcHJvZHVjdFR5cGVJZF1bJG9yZGVyaW5nQXR0cmlidXRlIC4gJy5lbGVtZW50Lm9yZGVyaW5nLmxhc3QnXSkgCisJCQkJPyAkb3JkZXJQb2xpY3lbJHByb2R1Y3RUeXBlSWRdWyRvcmRlcmluZ0F0dHJpYnV0ZSAuICcuZWxlbWVudC5vcmRlcmluZy5sYXN0J10KKwkJCQk6ICRvcmRlclBvbGljeVsnKiddWyRvcmRlcmluZ0F0dHJpYnV0ZSAuICcuZWxlbWVudC5vcmRlcmluZy5sYXN0J107CisJCQkJCQkJCQorCQkJLy8gVXNpbmcgdGhlIG9kZXJpbmcgcG9saWN5LCBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBtZXRhZGF0YSB3aWxsIGJlIGxpc3RlZAorCQkJcmV0dXJuICR0aGlzLT5zb3J0TWV0YWRhdGEoJG1ldGFkYXRhQXNBcnJheSwkZmlyc3QsJGxhc3QpOwkKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAkbWV0YWRhdGFBc0FycmF5OworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHJlaXZlcyB0aGUgc2V0IG9mIG1ldGFkYXRhIGZvciB0aGUgcHJvdmlkZWQgcHJvZHVjdFR5cGVJZCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlCisJICogdG8gdGhlIGN1cnJlbnQgdXNlci4gVGhpcyBmdW5jdGlvbiBhbHNvIGFwcGxpZXMgdGhlIHNvcnRpbmcgcG9saWN5IChpZiBpdCBpcyBkZWZpbmVkKQorCSAqIHNwZWNpZmllZCBpbiBlbGVtZW50Lm9yZGVyaW5nLmluaS4KKwkgKiAKKwkgKiBAcGFyYW0gc3RyaW5nICRwcm9kdWN0VHlwZUlkIC0gdGhlIHVuaXF1ZSBwcm9kdWN0VHlwZSBpZGVudGlmaWVyCisJICovCisJcHVibGljIGZ1bmN0aW9uIGdldFZpc2libGVNZXRhZGF0YUZvclByb2R1Y3RUeXBlKCRwcm9kdWN0VHlwZUlkKSB7CisJCS8vIEdldCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9kdWN0IHR5cGUKKwkJJHB0ID0gJHRoaXMtPmNsaWVudAorCQkJLT5nZXRQcm9kdWN0VHlwZUJ5SWQoJHByb2R1Y3RUeXBlSWQpCisJCQktPnRvQXNzb2NBcnJheSgpOworCQkJCisJCS8vIERldGVybWluZSB3aGljaCBtZXRhZGF0YSBzaG91bGQgYmUgdmlzaWJsZSB0byB0aGUgY3VycmVudCB1c2VyCisJCSR2aXNpYmxlTWV0YWRhdGEgPSAkdGhpcy0+Z2V0VmlzaWJsZU1ldGFkYXRhKCRwdFsndHlwZU1ldGFkYXRhJ10sICRwcm9kdWN0VHlwZUlkKTsKKwkJCisJCS8vIFNvcnQgdGhlIHZpc2libGUgbWV0YWRhdGEgYWNjb3JkaW5nIHRvIHRoZSBvcmRlcmluZyBwb2xpY3kKKwkJJHJlc3VsdCAgPSAkdGhpcy0+Z2V0U29ydGVkTWV0YWRhdGEoJHByb2R1Y3RUeXBlSWQsJHZpc2libGVNZXRhZGF0YSwgJ3B0Jyk7CisJCQorCQlyZXR1cm4gJHJlc3VsdDsKKwl9CisJCisJCisJLyoqCisJICogUmV0cmlldmVzIHRoZSBzZXQgb2YgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBwcm9kdWN0SWQgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSB0byAKKwkgKiB0aGUgY3VycmVudCB1c2VyCisJICogCisJICogQHBhcmFtIHN0cmluZyAgJHByb2R1Y3RJZCAtIHRoZSB1bmlxdWUgcHJvZHVjdCBpZGVudGlmaWVyCisJICogQHBhcmFtIGJvb2xlYW4gJGF1dGhTdGF0ZSAtIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHVzZXIgaXMgYXV0aGVudGljYXRlZAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBnZXRWaXNpYmxlTWV0YWRhdGFGb3JQcm9kdWN0KCRwcm9kdWN0SWQpIHsKKwkJJHAgID0gJHRoaXMtPmNsaWVudC0+Z2V0UHJvZHVjdEJ5SWQoJHByb2R1Y3RJZCk7CisJCSRwcm9kdWN0VHlwZUluZm8gPSAkcC0+Z2V0VHlwZSgpLT50b0Fzc29jQXJyYXkoKTsKKwkJJHByb2R1Y3RUeXBlSWQgICA9ICRwcm9kdWN0VHlwZUluZm9bQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHRfaWRfa2V5J11dOworCQkkcHJvZHVjdE1ldGFkYXRhID0gJHRoaXMtPmNsaWVudC0+Z2V0TWV0YWRhdGEoJHApOworCQkKKwkJLy8gRGV0ZXJtaW5lIHdoaWNoIG1ldGFkYXRhIHNob3VsZCBiZSB2aXNpYmxlIHRvIHRoZSBjdXJyZW50IHVzZXIKKwkJJHZpc2libGVNZXRhZGF0YSA9ICR0aGlzLT5nZXRWaXNpYmxlTWV0YWRhdGEoJHByb2R1Y3RNZXRhZGF0YS0+dG9Bc3NvY0FycmF5KCksICRwcm9kdWN0VHlwZUlkKTsKKwkJCQkKKwkJLy8gU29ydCB0aGUgdmlzaWJsZSBtZXRhZGF0YSBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyaW5nIHBvbGljeQorCQkkcmVzdWx0ICA9ICR0aGlzLT5nZXRTb3J0ZWRNZXRhZGF0YSgkcHJvZHVjdFR5cGVJZCwkdmlzaWJsZU1ldGFkYXRhLCAncCcpOworCQkKKwkJcmV0dXJuICRyZXN1bHQ7CQkKKwl9CisJCisJCisJLyoqCisJICogRGV0ZXJtaW5lIHRoZSB2aXNpYmlsaXR5IGxldmVsIGZvciB0aGUgY3VycmVudCBwcm9kdWN0IHR5cGUgYW5kIGN1cnJlbnQgdXNlci4KKwkgKiBUaGUgbGV2ZWwgcmV0dXJuZWQgaXMgb25lIG9mIFZJU19BTEwsVklTX0xJTUlULFZJU19OT05FCisJICogCisJICogQHBhcmFtIHN0cmluZyAkcHJvZHVjdFR5cGVJZCAtIHRoZSB1bmlxdWUgcHJvZHVjdCB0eXBlIGlkZW50aWZpZXIKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZHVjdFR5cGVWaXNpYmlsaXR5TGV2ZWwoICRwcm9kdWN0VHlwZUlkICkgeworCQkvLyBJZiB0aGUgY29uZmlndXJhdGlvbiBleHBsaWNpdGx5IHN0YXRlcyB0aGF0IHRoaXMgZGF0YXNldCBpcyB0byBiZSBpZ25vcmVkLAorCQkvLyBpZ25vcmUgaXQ6CisJCWlmIChpbl9hcnJheSgkcHJvZHVjdFR5cGVJZCxBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9kYXRhc2V0X2lnbm9yZXMnXSkpIHsKKwkJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfTk9ORTsKKwkJfQorCQkKKwkJLy8gR2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb2R1Y3QgdHlwZQorCQkkdHlwZUluZm8gPSAkdGhpcy0+Y2xpZW50CisJCQktPmdldFByb2R1Y3RUeXBlQnlJZCgkcHJvZHVjdFR5cGVJZCkKKwkJCS0+dG9Bc3NvY0FycmF5KCk7CisJCQorCQlpZiAoIEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKSApIHsKKwkJCQorCQkJLy8gRG9lcyB0aGUgcHJvZHVjdCB0eXBlIGRlZmluZSBhIG1ldGFkYXRhIGVsZW1lbnQgbWF0Y2hpbmcKKwkJCS8vIHRoZSBgYnJvd3Nlcl9kYXRhX2FjY2Vzc19rZXlgIGNvbmZpZyBzZXR0aW5nPworCQkJJGFjY2Vzc0tleUV4aXN0cyA9IGlzc2V0KCR0eXBlSW5mb1sndHlwZU1ldGFkYXRhJ11bQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfZGF0YV9hY2Nlc3Nfa2V5J11dKTsKKwkJCQorCQkJLy8gT2J0YWluIHRoZSBncm91cHMgZm9yIHRoZSBjdXJyZW50IHJlc291cmNlCisJCQkkcmVzb3VyY2VHcm91cHMgPSAoJGFjY2Vzc0tleUV4aXN0cykKKwkJCQk/ICR0eXBlSW5mb1sndHlwZU1ldGFkYXRhJ11bQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfZGF0YV9hY2Nlc3Nfa2V5J11dCisJCQkJOiBhcnJheSgpOworCQkJCisJCQlyZXR1cm4gJHRoaXMtPmdldFJlc291cmNlVmlzaWJpbGl0eSgkcmVzb3VyY2VHcm91cHMsCisJCQkJQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHRfYXV0aF9wb2xpY3knXSk7CisJCX0gZWxzZSB7CisJCQkvLyBObyBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgZXZlcnl0aGluZyBpcyBwdWJsaWMKKwkJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfQUxMOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBnZXRQcm9kdWN0VmlzaWJpbGl0eUxldmVsKCAkcHJvZHVjdElkICkgeworCQkKKwkJJHByb2R1Y3QgPSAkdGhpcy0+Y2xpZW50LT5nZXRQcm9kdWN0QnlJZCggJHByb2R1Y3RJZCApOworCQkkcHJvZHVjdE1ldGFkYXRhID0gJHRoaXMtPmNsaWVudC0+Z2V0TWV0YWRhdGEoJHByb2R1Y3QpOworCisJCS8vIEdldCBtZXRhZGF0YSBmb3IgcHJvZHVjdCBhbmQgcHJvZHVjdFR5cGUgYXMgYXNzb2NpYXRpdmUgYXJyYXlzCisJCSRwcm9kdWN0VHlwZUluZm8gPSAkcHJvZHVjdC0+Z2V0VHlwZSgpLT50b0Fzc29jQXJyYXkoKTsKKwkJJHByb2R1Y3RJbmZvICAgICA9ICRwcm9kdWN0TWV0YWRhdGEtPnRvQXNzb2NBcnJheSgpOworCQkKKwkJaWYgKCBBcHA6OkdldCgpLT5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCkgKSB7CisJCQkKKwkJCS8vIERvZXMgdGhlIHByb2R1Y3QgdHlwZSBkZWZpbmUgYSBtZXRhZGF0YSBlbGVtZW50IG1hdGNoaW5nCisJCQkvLyB0aGUgYGJyb3dzZXJfZGF0YV9hY2Nlc3Nfa2V5YCBjb25maWcgc2V0dGluZz8KKwkJCSRhY2Nlc3NLZXlFeGlzdHMgPSBpc3NldCgkcHJvZHVjdEluZm9bQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfZGF0YV9hY2Nlc3Nfa2V5J11dKTsKKwkJCSAKKwkJCS8vIE9idGFpbiB0aGUgZ3JvdXBzIGZvciB0aGUgY3VycmVudCByZXNvdXJjZQorCQkJJHJlc291cmNlR3JvdXBzID0gKCRhY2Nlc3NLZXlFeGlzdHMpCisJCQkJPyAkcHJvZHVjdEluZm9bQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfZGF0YV9hY2Nlc3Nfa2V5J11dCisJCQkJOiBhcnJheSgpOworCQkJCisJCQlyZXR1cm4gJHRoaXMtPmdldFJlc291cmNlVmlzaWJpbGl0eSgkcmVzb3VyY2VHcm91cHMsIAorCQkJCUFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3BfYXV0aF9wb2xpY3knXSk7CisJCX0gZWxzZSB7CisJCQkvLyBObyBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgZXZlcnl0aGluZyBpcyBwdWJsaWMKKwkJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfQUxMOworCQl9CisJfQorCQorCQorCS8qKgorCSAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbiBmb3Igc29ydGluZyhvcmRlcmluZykgYSBtZXRhZGF0YSBhcnJheSBhY2NvcmRpbmcgdG8gcG9saWN5LiAKKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgJHVuc29ydGVkTWV0YWRhdGEgQW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgdW5zb3J0ZWQgbWV0YWR0YSBrZXkvKG11bHRpKXZhbHVlcworCSAqIEBwYXJhbSBhcnJheSAkc29ydEZpcnN0ICAgICAgICBBIHNjYWxhciBhcnJheSBvZiBtZXRhZGF0YSBrZXlzIHRoYXQgbXVzdCBiZSBvcmRlcmVkIGZpcnN0CisJICogQHBhcmFtIGFycmF5ICRzb3J0TGFzdCAgICAgICAgIEEgc2NhbGFyIGFycmF5IG9mIG1ldGFkYXRhIGtleXMgdGhhdCBtdXN0IGJlIG9yZGVyZWQgbGFzdAorCSAqIEByZXR1cm5zIGFycmF5IEFuIGFzc29jaWF0aXZlIGFycmF5IG9mIHNvcnRlZChvcmRlcmVkKSBtZXRhZGF0YSBrZXkvKG11bHRpKXZhbHVlcworCSAqLworCXByb3RlY3RlZCBmdW5jdGlvbiBzb3J0TWV0YWRhdGEoJHVuc29ydGVkTWV0YWRhdGEsJHNvcnRGaXJzdCwkc29ydExhc3QpIHsKKwkJJG9yZGVyZWRNZXRhZGF0YSA9IGFycmF5KCk7CisJCWZvcmVhY2ggKCRzb3J0Rmlyc3QgYXMgJGtleSkgeworCQkJaWYgKGlzc2V0KCR1bnNvcnRlZE1ldGFkYXRhWyRrZXldKSkgeworCQkJCSRvcmRlcmVkTWV0YWRhdGFbJGtleV0gPSAkdW5zb3J0ZWRNZXRhZGF0YVska2V5XTsKKwkJCQl1bnNldCgkdW5zb3J0ZWRNZXRhZGF0YVska2V5XSk7CisJCQl9CisJCX0KKwkJJGxhc3RNZXRhZGF0YSA9IGFycmF5KCk7CisJCWZvcmVhY2ggKCRzb3J0TGFzdCBhcyAka2V5KSB7CisJCQlpZiAoaXNzZXQoJHVuc29ydGVkTWV0YWRhdGFbJGtleV0pKSB7CisJCQkJJGxhc3RNZXRhZGF0YVska2V5XSA9ICR1bnNvcnRlZE1ldGFkYXRhWyRrZXldOworCQkJCXVuc2V0KCR1bnNvcnRlZE1ldGFkYXRhWyRrZXldKTsKKwkJCX0KKwkJfQorCQkkb3JkZXJlZE1ldGFkYXRhICs9ICR1bnNvcnRlZE1ldGFkYXRhOworCQkkb3JkZXJlZE1ldGFkYXRhICs9ICRsYXN0TWV0YWRhdGE7CisJCQorCQlyZXR1cm4gJG9yZGVyZWRNZXRhZGF0YTsKKwl9CisJCisJLyoqCisJICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciwgZ2l2ZW4gYW4gYXJyYXkgb2YgbWV0YWRhdGEsIGEgcHJvZHVjdFR5cGVJRCwgYW5kIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciBvciBub3QgdGhlIAorCSAqIGN1cnJlbnQgdXNlciBpcyBhdXRoZW50aWNhdGVkLCByZXR1cm5pbmcgdGhlIHN1YnNldCBvZiBtZXRhZGF0YSB0aGF0IHNob3VsZCBiZSB2aXNpYmxlIHRvCisJICogdGhlIHVzZXIuIAorCSAqIAorCSAqIEBwYXJhbSBhcnJheSAgICRtZXRhZGF0YUFzQXJyYXkKKwkgKiBAcGFyYW0gc3RyaW5nICAkcHJvZHVjdFR5cGVJZAorCSAqIEBwYXJhbSBib29sZWFuICRsb25naW5TdGF0ZSAtIG9uZSBvZiBWSVNfQVVUSF9BVVRIRU5USUNBVEVEfFZJU19BVVRIX0FOT05ZTU9VUworCSAqLworCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRWaXNpYmxlTWV0YWRhdGEoJG1ldGFkYXRhQXNBcnJheSwgJHByb2R1Y3RUeXBlSWQpIHsKKwkJCisJCS8vIERldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQKKwkJJGF1dGhTdGF0ZSA9ICgoJGFwID0gQXBwOjpHZXQoKS0+Z2V0QXV0aGVudGljYXRpb25Qcm92aWRlcigpKSAmJiAkYXAtPmlzTG9nZ2VkSW4oKSk7CisJCQorCQkkdmlzaWJpbGl0eVBvbGljeUZpbGVQYXRoID0gZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkgLiAnL2VsZW1lbnQtdmlzaWJpbGl0eS5pbmknOworCQlpZiAoZmlsZV9leGlzdHMoJHZpc2liaWxpdHlQb2xpY3lGaWxlUGF0aCkpIHsKKwkJCSR2aXNpYmlsaXR5UG9saWN5ID0gcGFyc2VfaW5pX2ZpbGUoJHZpc2liaWxpdHlQb2xpY3lGaWxlUGF0aCx0cnVlKTsKKwkJCQorCQkJJGludGVycHJldGF0aW9uID0gJHZpc2liaWxpdHlQb2xpY3lbJ2ludGVycHJldGF0aW9uLnBvbGljeSddOworCQkJJGdsb2JhbFZpc2liaWxpdHlQb2xpY3kgPSAkdmlzaWJpbGl0eVBvbGljeVsnKiddOworCQkJJHByb2R1Y3RUeXBlVmlzaWJpbGl0eVBvbGljeSA9IGlzc2V0KCR2aXNpYmlsaXR5UG9saWN5WyRwcm9kdWN0VHlwZUlkXSkKKwkJCQk/ICR2aXNpYmlsaXR5UG9saWN5WyRwcm9kdWN0VHlwZUlkXQorCQkJCTogYXJyYXkoInZpc2liaWxpdHkuYWx3YXlzIiA9PiBhcnJheSgpLAorCQkJCQkJInZpc2liaWxpdHkuYW5vbnltb3VzIiA9PiBhcnJheSgpLAorCQkJCQkJInZpc2liaWxpdHkuYXV0aGVudGljYXRlZCIgPT4gYXJyYXkoKSk7CisKKwkJCS8vIFRoZSB2aXNpYmlsaXR5IG9mIGEgZ2l2ZW4gbWV0YWRhdGEgZWxlbWVudCBpcyBkZXBlbmRlbnQgdXBvbgorCQkJLy8gICAoMSkgdGhlIGF1dGhlbnRpY2F0aW9uIHN0YXR1cyBvZiB0aGUgdXNlciAoVklTX0FVVEhfQVVUSEVOVElDQVRFRHxWSVNfQVVUSF9BTk9OWU1PVVMpCisJCQkvLyAgICgyKSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHZpc2liaWxpdHkgcG9saWN5IChWSVNfSU5URVJQUkVUX1NIT1d8VklTX0lOVEVSUFJFVF9ISURFKQorCQkJLy8gICAKKwkJCS8vICAgVXNpbmcgdGhlc2UgdmFsdWVzLCBkZXRlcm1pbmUgd2hpY2ggbWV0YWRhdGEgdG8gZGlzcGxheToKKwkJCXN3aXRjaCAoJGludGVycHJldGF0aW9uKSB7CisJCQkJLy8gSWYgdGhlIHBvbGljeSBkZWZpbmVzIG9ubHkgdGhvc2UgbWV0YWRhdGEgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbjoKKwkJCQljYXNlIHNlbGY6OlZJU19JTlRFUlBSRVRfSElERToKKwkJCQkJJGRpc3BsYXlNZXQgPSAkbWV0YWRhdGFBc0FycmF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIHNob3duIHVubGVzcyBleHBsaWNpdGx5IGhpZGRlbiB2aWEgdGhlIHBvbGljeQorCQkJCQlmb3JlYWNoICgkZ2xvYmFsVmlzaWJpbGl0eVBvbGljeVsndmlzaWJpbGl0eS5hbHdheXMnXSBhcyAkZWxtKSAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgZ2xvYmFsICdhbHdheXMgaGlkZScgYXJyYXkuLi4KKwkJCQkJCXVuc2V0KCRkaXNwbGF5TWV0WyRlbG1dKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGFsbCBsaXN0ZWQgZWxlbWVudHMKKwkJCQkJZm9yZWFjaCAoJHByb2R1Y3RUeXBlVmlzaWJpbGl0eVBvbGljeVsndmlzaWJpbGl0eS5hbHdheXMnXSBhcyAkZWxtKSAvLyBub3cgaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcm9kdWN0LXR5cGUgJ2Fsd2F5cyBoaWRlJyBhcnJheS4uLgorCQkJCQkJdW5zZXQoJGRpc3BsYXlNZXRbJGVsbV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgYWxsIGxpc3RlZCBlbGVtZW50cworCQkJCQkJCQorCQkJCQkvLyBEZXRlcm1pbmUgd2hhdCB0byBoaWRlIGdpdmVuIHRoZSB1c2VyJ3MgbG9naW4gc3RhdGUgCisJCQkJCXN3aXRjaCAoJGF1dGhTdGF0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgbG9naW4gc3RhdHVzIG9mIHRoZSB1c2VyCisJCQkJCQljYXNlIHNlbGY6OlZJU19BVVRIX0FOT05ZTU9VUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXIgaXMgYW5vbnltb3VzLi4uCisJCQkJCQkJZm9yZWFjaCgkZ2xvYmFsVmlzaWJpbGl0eVBvbGljeVsndmlzaWJpbGl0eS5hbm9ueW1vdXMnXSBhcyAkZWxtKSAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBnbG9iYWwgJ2Fub255bW91cyBoaWRlJyBhcnJheS4uLgorCQkJCQkJCQl1bnNldCgkZGlzcGxheU1ldFskZWxtXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgYWxsIGxpc3RlZCBlbGVtZW50cworCQkJCQkJCWZvcmVhY2ggKCRwcm9kdWN0VHlwZVZpc2liaWxpdHlQb2xpY3lbJ3Zpc2liaWxpdHkuYW5vbnltb3VzJ10gYXMgJGVsbSkgICAgIC8vIG5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIHByb2R1Y3QtdHlwZSAnYW5vbnltb3VzIGhpZGUnIGFycmF5Li4uCisJCQkJCQkJCXVuc2V0KCRkaXNwbGF5TWV0WyRlbG1dKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJlbW92ZSBhbGwgbGlzdGVkIGVsZW1lbnRzCisJCQkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZS4KKwkJCQkJCWNhc2Ugc2VsZjo6VklTX0FVVEhfQVVUSEVOVElDQVRFRDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLi4uCisJCQkJCQkJZm9yZWFjaCgkZ2xvYmFsVmlzaWJpbGl0eVBvbGljeVsndmlzaWJpbGl0eS5hdXRoZW50aWNhdGVkJ10gYXMgJGVsbSkgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBnbG9iYWwgJ2F1dGhlbnRpY2F0ZWQgaGlkZScgYXJyYXkuLi4KKwkJCQkJCQkJdW5zZXQoJGRpc3BsYXlNZXRbJGVsbV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGFsbCBsaXN0ZWQgZWxlbWVudHMKKwkJCQkJCQlmb3JlYWNoICgkcHJvZHVjdFR5cGVWaXNpYmlsaXR5UG9saWN5Wyd2aXNpYmlsaXR5LmF1dGhlbnRpY2F0ZWQnXSBhcyAkZWxtKSAvLyBub3cgaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcm9kdWN0LXR5cGUgJ2F1dGhlbnRpY2F0ZWQgaGlkZScgYXJyYXkuLi4KKwkJCQkJCQkJdW5zZXQoJGRpc3BsYXlNZXRbJGVsbV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGFsbCBsaXN0ZWQgZWxlbWVudHMKKwkJCQkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lLgorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJLy8gSWYgdGhlIHBvbGljeSBkZWZpbmVzIG9ubHkgdGhvc2UgbWV0YWRhdGEgd2hpY2ggc2hvdWxkIGJlIHNob3duOgorCQkJCWNhc2Ugc2VsZjo6VklTX0lOVEVSUFJFVF9TSE9XOgorCQkJCQkkZGlzcGxheU1ldCA9ICRnbG9iYWxWaXNpYmlsaXR5UG9saWN5Wyd2aXNpYmlsaXR5LmFsd2F5cyddICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZSBnbG9iYWwgJ2Fsd2F5cyBzaG93JyBhcnJheQorCQkJCQkJKyAkcHJvZHVjdFR5cGVWaXNpYmlsaXR5UG9saWN5Wyd2aXNpYmlsaXR5LmFsd2F5cyddOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHByb2R1Y3QtdHlwZSBzcGVjaWZpYyAnYWx3YXlzIHNob3cnIGFycmF5CisJCQkJCXN3aXRjaCAoJGF1dGhTdGF0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGxvZ2luIHN0YXR1cyBvZiB0aGUgdXNlcgorCQkJCQkJY2FzZSBzZWxmOjpWSVNfQVVUSF9BTk9OWU1PVVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB1c2VyIGlzIGFub255bW91cy4uLgorCQkJCQkJCSRkaXNwbGF5TWV0ICs9ICRnbG9iYWxWaXNpYmlsaXR5UG9saWN5Wyd2aXNpYmlsaXR5LmFub255bW91cyddOyAgICAgICAgICAgIC8vIG1lcmdlIHRoZSBnbG9iYWwgJ2Fub255bW91cyBzaG93JyBhcnJheQorCQkJCQkJCSRkaXNwbGF5TWV0ICs9ICRwcm9kdWN0VHlwZVZpc2liaWxpdHlQb2xpY3lbJ3Zpc2liaWxpdHkuYW5vbnltb3VzJ107ICAgICAgIC8vIGFuZCB0aGUgcHJvZHVjdC10eXBlIHNwZWNpZmljICdhbm9ueW1vdXMgc2hvdycgYXJyYXkKKwkJCQkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lLgorCQkJCQkJY2FzZSBzZWxmOjpWSVNfQVVUSF9BVVRIRU5USUNBVEVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQuLi4KKwkJCQkJCQkkZGlzcGxheU1ldCArPSAkZ2xvYmFsVmlzaWJpbGl0eVBvbGljeVsndmlzaWJpbGl0eS5hdXRoZW50aWNhdGVkJ107ICAgICAgICAvLyBtZXJnZSB0aGUgZ2xvYmFsICdhdXRoZW50aWNhdGVkIHNob3cnIGFycmF5IAorCQkJCQkJCSRkaXNwbGF5TWV0ICs9ICRwcm9kdWN0VHlwZVZpc2liaWxpdHlQb2xpY3lbJ3Zpc2liaWxpdHkuYXV0aGVudGljYXRlZCddOyAgIC8vIGFuZCB0aGUgcHJvZHVjdC10eXBlIHNwZWNpZmljICdhdXRoZW50aWNhdGVkIHNob3cnIGFycmF5CisJCQkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZS4KKwkJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gJGRpc3BsYXlNZXQ7CQorCQkJCQorCQl9IGVsc2UgeworCQkJcmV0dXJuICRtZXRhZGF0YUFzQXJyYXk7CisJCX0KKwl9CisJCQorCS8qKgorCSAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHZpc2liaWxpdHkgbGV2ZWwgb2YgYSBnaXZlbiByZXNvdXJjZSBnaXZlbgorCSAqIGl0cyBhcnJheSBvZiBzZWN1cml0eSBncm91cHMuIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBvbmUgb2YgVklTX0FMTCxWSVNfTElNSVQsVklTX05PTkUuCisJICogCisJICogQHBhcmFtIGFycmF5ICRyZXNvdXJjZUdyb3VwcyAtIGFuIGFycmF5IG9mIHNlY3VyaXR5IGdyb3VwcyBmb3IgdGhlIHJlc291cmNlCisJICogQHBhcmFtIHN0cmluZyAkcG9saWN5ICAgICAgICAtIG9uZSBvZiBWSVNfTElNSVQgb3IgVklTX0RFTlkKKwkgKi8JCisJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJlc291cmNlVmlzaWJpbGl0eSggJHJlc291cmNlR3JvdXBzLCAkcG9saWN5ID0gQ2FzQnJvd3Nlcjo6VklTX0RFTlkgKSB7CisJCQorCQkvLyBJcyB0aGUgcmVzb3VyY2UgY29uc2lkZXJlZCAicHVibGljIj8KKyAJCWlmIChpbl9hcnJheShBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9kYXRhX3B1YmxpY19hY2Nlc3MnXSwkcmVzb3VyY2VHcm91cHMpKSB7IAorCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19BTEw7CisJCX0KKwkJCisJCS8vIEdldCB1c2VyIGF1dGhlbnRpY2F0aW9uIGluZm8KKwkJJGF1dGhlbnRpY2F0aW9uID0gQXBwOjpHZXQoKS0+Z2V0QXV0aGVudGljYXRpb25Qcm92aWRlcigpOworCQkkdXNlcm5hbWUgPSAoJGF1dGhlbnRpY2F0aW9uKQorCQkgICAgPyAkYXV0aGVudGljYXRpb24tPmdldEN1cnJlbnRVc2VybmFtZSgpCisJCSAgICA6IGZhbHNlOwkvLyBubyBhdXRoZW50aWNhdGlvbiBpbmZvIHByb3ZpZGVkIGluIGNvbmZpZyBmaWxlCisJCQorCQkvLyBEb2VzIHRoZSBtZXRhZGF0YSB2aXNpYmlsaXR5IGRlcGVuZCBvbiBhbiBhY2Nlc3MgZWxlbWVudCBtYXRjaGluZworIAkJLy8gdGhlIGBicm93c2VyX2RhdGFfYWNjZXNzX2tleWAgaW4gdGhlIGNvbmZpZyBzZXR0aW5nPworIAkJJGFjY2Vzc0tleUV4aXN0cyA9IGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX2RhdGFfYWNjZXNzX2tleSddKTsKKworIAkJLy8gSWYga2V5IGlzIHNldCB0aGVuIHdlIGxvb2sgaW50byB3aGF0IGdyb3VwcyBoYXZlIGFjY2VzcyB0byBtZXRhZGF0YQorIAkJaWYgKCAkYWNjZXNzS2V5RXhpc3RzICYmICFlbXB0eSgkcmVzb3VyY2VHcm91cHMpICkgeworCQkJCisJCQkvLyBIYXMgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgaW5mb3JtYXRpb24gYmVlbiBzcGVjaWZpZWQ/CisJCQlpZiAoICRhdXRoZW50aWNhdGlvbiApIHsKKwkJCQkKKwkJCSAJLy8gSXMgdGhlIHVzZXIgY3VycmVudGx5IGxvZ2dlZCBpbj8KKwkJCSAJaWYgKCAkdXNlcm5hbWUgKSB7CisJIAkJCQkKKwkJCSAJCWlmICggJGF1dGhvcml6YXRpb24gPSBBcHA6OkdldCgpLT5nZXRBdXRob3JpemF0aW9uUHJvdmlkZXIoKSApIHsKKwkJCQkgCQkvLyBPYnRhaW4gdGhlIGdyb3VwcyBmb3IgdGhlIGN1cnJlbnQgdXNlcgorCQkJCSAJCSR1c2VyR3JvdXBzID0gJGF1dGhvcml6YXRpb24tPnJldHJpZXZlR3JvdXBzRm9yVXNlcigkdXNlcm5hbWUpOworCQkJCSAJCQorCQkJCSAJCS8vIFBlcmZvcm0gYSBjb21wYXJpc29uIHZpYSBhcnJheSBpbnRlcnNlY3Rpb24gdG8gZGV0ZXJtaW5lIG92ZXJsYXAKKwkJCQkgCQkkeCA9IGFycmF5X2ludGVyc2VjdCgkdXNlckdyb3VwcywkcmVzb3VyY2VHcm91cHMpOworCQkJCSAJCQorCQkJCSAJCWlmIChlbXB0eSgkeCkpIHsgLy8gTm8gaW50ZXJzZWN0aW9uIGZvdW5kIGJldHdlZW4gdXNlciBhbmQgcmVzb3VyY2UgZ3JvdXBzCisJCQkJCisJCQkJIAkJCS8vIEV4YW1pbmUgdGhlIHBvbGljeSB0byBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgZmFpbHVyZQorCQkJCSAJCQlzd2l0Y2ggKCRwb2xpY3kpIHsKKwkJCQkgCQkJCWNhc2UgQ2FzQnJvd3Nlcjo6VklTX0xJTUlUOgorCQkJCSAJCQkJCS8vIEFsbG93IHRoZSB1c2VyIHRvIHByb2NlZWQsIHRoZSBtZXRhZGF0YSB2aXNpYmlsaXR5IHBvbGljeQorCQkJCSAJCQkJCS8vIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBpcyB2aXNpYmxlIHRvIG5vbi1hdXRob3JpemVkCisJCQkJIAkJCQkJLy8gdXNlcnMuCisJCQkJIAkJCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19MSU1JVDsKKwkJCQkgCQkJCWRlZmF1bHQ6CisJCQkJIAkJCQkJLy8gS2ljayB0aGUgdXNlciBvdXQgYXQgdGhpcyBwb2ludCwgZGVueSBhbGwgYWNjZXNzLiAKKwkJCQkJIAkJCQlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX05PTkU7CisJCQkJIAkJCX0KKwkJCQkgCQl9IGVsc2UgeworCQkJCSAJCQkvLyBXZSBoYXZlIGFuIGF1dGhvcml6ZWQgdXNlcgorCQkJCSAJCQkkYXV0aG9yaXplZFVzZXIgPSB0cnVlOworCQkJCSAJCX0KKwkJCSAJCX0gZWxzZSB7CisJCQkgCQkJCisJCQkJCQkvLyBJZiBubyBhdXRob3JpemF0aW9uIHByb3ZpZGVyIGluZm9ybWF0aW9uIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24KKwkJCQkJIAkvLyBjb25maWd1cmF0aW9uIGZpbGUsIGl0IGlzIGFzc3VtZWQgdGhhdCBldmVyeSB1c2VyIGlzIGF1dGhvcml6ZWQgb25jZQorCQkJCQkgCS8vIGxvZ2dlZCBpbi4KKwkJCQkJIAlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX0FMTDsJCQkJIAkJCQorCQkJIAkJfQorCQkJIAl9IGVsc2UgeworCQkJIAkJCisJCQkgCQkvLyBJZiBubyBsb2dnZWQgaW4gdXNlciwgYW5kIHBvbGljeSBzYXlzIERFTlksIGtpY2sgdGhlIHVzZXIKKwkJCSAJCWlmICgkcG9saWN5ID09IENhc0Jyb3dzZXI6OlZJU19ERU5ZKSB7CisJCQkgCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19OT05FOworIAkJCSAJCX0gZWxzZSB7CisJCQkgCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19MSU1JVDsKKyAJCQkgCQl9CisJCQkgCX0KKwkJIAl9IGVsc2UgeworCQkJIAkvLyBJZiBubyBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBpbmZvcm1hdGlvbiBleGlzdHMgaW4gdGhlIGFwcGxpY2F0aW9uCisJCQkgCS8vIGNvbmZpZ3VyYXRpb24gZmlsZSwgaXQgaXMgYXNzdW1lZCB0aGF0IGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uCisJCQkgCS8vIGFyZSBub3QgbmVlZGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGh1cyBldmVyeSB1c2VyIGlzIGF1dGhvcml6ZWQKKwkJCSAJLy8gYnkgZGVmYXVsdC4KKwkJCSAJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19BTEw7CQorCQkJfQkJCQkKKyAJCX0gZWxzZSB7CisgCQkJCisgCQkJLy8gQWxsIGRhdGEgaXMgdmlzaWJsZSB0byB1c2VyIGlmIGxvZ2dlZCBpbgorIAkJCS8vIEhhcyBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBpbmZvcm1hdGlvbiBiZWVuIHNwZWNpZmllZD8KKwkJCWlmICggJGF1dGhlbnRpY2F0aW9uICkgeworCQkJCQorCQkJIAkvLyBJcyB0aGUgdXNlciBjdXJyZW50bHkgbG9nZ2VkIGluPworCQkJIAlpZiAoICR1c2VybmFtZSApIHsKKwkJCSAJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfQUxMOyAvLyBXZSBoYXZlIGFuIGF1dGhvcml6ZWQgdXNlcgorCQkJIAl9IGVsc2UgeworCQkJIAkJLy8gSWYgbm8gbG9nZ2VkIGluIHVzZXIsIGFuZCBwb2xpY3kgc2F5cyBERU5ZLCBraWNrIHRoZSB1c2VyCisJCQkgCQlpZiAoJHBvbGljeSA9PSBDYXNCcm93c2VyOjpWSVNfREVOWSkgeworCQkJIAkJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfTk9ORTsKKwkJCSAJCX0gZWxzZSB7CisJCQkgCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19MSU1JVDsKKwkJCSAJCX0KKwkJCSAJfQorCQkgCX0gZWxzZSB7CisJCQkgCS8vIElmIG5vIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGluZm9ybWF0aW9uIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24KKwkJCSAJLy8gY29uZmlndXJhdGlvbiBmaWxlLCBpdCBpcyBhc3N1bWVkIHRoYXQgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24KKwkJCSAJLy8gYXJlIG5vdCBuZWVkZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aHVzIGV2ZXJ5IHVzZXIgaXMgYXV0aG9yaXplZAorCQkJIAkvLyBieSBkZWZhdWx0LgorCQkJIAlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX0FMTDsJCisJCQl9CisgCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvY2xhc3Nlcy9VdGlscy5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9jbGFzc2VzL1V0aWxzLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ2MDhhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvY2xhc3Nlcy9VdGlscy5jbGFzcy5waHAKQEAgLTAsMCArMSwzODggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcmVxdWlyZV9vbmNlKCJDYXNCcm93c2VyLmNsYXNzLnBocCIpOworCitjbGFzcyBVdGlsc3sKKwkKKwlwdWJsaWMgc3RhdGljICRhY2NlcHRlZFJldHVyblR5cGVzID0gYXJyYXkoJ2h0bWwnLCAnanNvbicpOworCisJLyoqCisJICogQHBhcmFtIHR5cGVzCisJICoJCUFuIGFycmF5IG9mIFBvZHVjdFR5cGVzLgorCSAqCisJICogQHJldHVybiAKKwkgKgkJQW4gYXJyYXkgb2YgdW5pcXVlIG5hbWVzIG9mIE1ldGFkYXRhIGFuZCBFbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIAorCSAqCQlQcm9kdWN0VHlwZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNZXRhZGF0YUVsZW1lbnRzKCR0eXBlcyl7CisJCSRjYiA9IG5ldyBDYXNCcm93c2VyKCk7CisJCSRjbGllbnQgPSAkY2ItPmdldENsaWVudCgpOworCQkkbWV0YWRhdGFOYW1lcyA9IGFycmF5KCk7CisJCWZvcmVhY2goJHR5cGVzIGFzICR0eXBlKXsKKwkJCWZvcmVhY2goYXJyYXlfa2V5cygkdHlwZS0+Z2V0VHlwZU1ldGFkYXRhKCktPnRvQXNzb2NBcnJheSgpKSBhcyAkbWV0YWRhdGEpeworCQkJCWlmKCFpbl9hcnJheSgkbWV0YWRhdGEsICRtZXRhZGF0YU5hbWVzKSl7CisJCQkJCWFycmF5X3B1c2goJG1ldGFkYXRhTmFtZXMsICRtZXRhZGF0YSk7CisJCQkJfQorCQkJfQorCQkJZm9yZWFjaCgkY2xpZW50LT5nZXRFbGVtZW50c0J5UHJvZHVjdFR5cGUoJHR5cGUpIGFzICRlbGVtZW50KXsKKwkJCQkkZWxlbWVudE5hbWUgPSAkZWxlbWVudC0+Z2V0RWxlbWVudE5hbWUoKTsKKwkJCQlpZighaW5fYXJyYXkoJGVsZW1lbnROYW1lLCAkbWV0YWRhdGFOYW1lcykpeworCQkJCQlhcnJheV9wdXNoKCRtZXRhZGF0YU5hbWVzLCAkZWxlbWVudE5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gJG1ldGFkYXRhTmFtZXM7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBwcm9kdWN0VHlwZQorCSAqCQlUaGUgcHJvZHVjdFR5cGUgb2YgdGhlIFByb2R1Y3RQYWdlIGRlc2lyZWQuCisJICoKKwkgKiBAcGFyYW0gcGFnZU51bQorCSAqCQlUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIGRlc2lyZWQgaW4gdGhlIHNldCBvZiBQcm9kdWN0UGFnZXMgb2YgdGhhdCBQcm9kdWN0VHlwZS4KKwkgKgorCSAqIEByZXR1cm4KKwkgKgkJVGhlIHJlcXVlc3RlZCBQcm9kdWN0UGFnZSBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQYWdlKCRwcm9kdWN0VHlwZSwgJHBhZ2VOdW0peworCQkkY2IgPSBuZXcgQ2FzQnJvd3NlcigpOworCQkkY2xpZW50ID0gJGNiLT5nZXRDbGllbnQoKTsKKwkJCisJCS8vIEl0ZXJhdGUgdW50aWwgdGhlIHByb3BlciBwYWdlIGlzIHJlYWNoZWQKKwkJZm9yKCRwYWdlID0gJGNsaWVudC0+Z2V0Rmlyc3RQYWdlKCRwcm9kdWN0VHlwZSk7CisJCQkkcGFnZS0+Z2V0UGFnZU51bSgpIDwgJHBhZ2VOdW0gJiYgJHBhZ2UtPmdldFBhZ2VOdW0oKSA8ICRwYWdlLT5nZXRUb3RhbFBhZ2VzKCk7CisJCQkkcGFnZSA9ICRjbGllbnQtPmdldE5leHRQYWdlKCRwcm9kdWN0VHlwZSwgJHBhZ2UpKXt9CisJCQkKKwkJcmV0dXJuICRwYWdlOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlcXVlc3RlZFJldHVyblR5cGUoJHJlcXVlc3RlZFR5cGUpeworCQkkbG93ZXJSZXF1ZXN0ZWRUeXBlID0gc3RydG9sb3dlcigkcmVxdWVzdGVkVHlwZSk7CisJCWlmKCFpbl9hcnJheSgkbG93ZXJSZXF1ZXN0ZWRUeXBlLCBzZWxmOjokYWNjZXB0ZWRSZXR1cm5UeXBlcykpeworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oJ0Vycm9yOiBUaGUgcmVxdWVzdGVkIHJldHVybiB0eXBlIG9mICcuICRyZXF1ZXN0ZWRUeXBlIC4gJ2lzIG5vdCBhY2NlcHRlZC4nKTsKKwkJfQorCQlyZXR1cm4gJGxvd2VyUmVxdWVzdGVkVHlwZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQcm9kdWN0TGlzdE1ldGFkYXRhKCRwcm9kdWN0cyl7CisJCSRwYXlsb2FkID0gYXJyYXkoKTsKKwkJZm9yZWFjaCgkcHJvZHVjdHMgYXMgJHApeworCQkJJGNiID0gbmV3IENhc0Jyb3dzZXIoKTsKKwkJCSRjbGllbnQgPSAkY2ItPmdldENsaWVudCgpOworCQkJJG1ldCA9ICRjbGllbnQtPmdldE1ldGFkYXRhKCRwKTsKKwkJCSRwYXlsb2FkWyRwLT5nZXRJZCgpXSA9ICRtZXQ7CisJCX0KKwkJcmV0dXJuICRwYXlsb2FkOworCX0KKwkKKwkvLyBXaGF0IGtpbmQgb2YgYWNjZXNzIHNob3VsZCB0aGUgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgdXNlciBoYXZlLCBnaXZlbiB0aGUgCisJLy8gcHJvdmlkZWQgZ3JvdXBzIChha2Egcm9sZXMsIHBlcm1pc3Npb25zKSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlPworCS8vCisJLy8gUG9zc2libGUgdmFsdWVzIGFyZTogQ2FzQnJvd3Nlcjo6e1ZJU19BTEwsIFZJU19MSU1JVCwgVklTX05PTkV9LiBJdCBpcyB1cCB0byB0aGUgCisJLy8gY2FsbGVyIHRvIGRldGVybWluZSB3aGF0IHRvIGRvIGJhc2VkIG9uIHRoZSByZXR1cm4gdmFsdWUKKwkvLworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUmVzb3VyY2VWaXNpYmlsaXR5KCAkcmVzb3VyY2VHcm91cHMgKSB7CisJCQorCQkvLyBJcyB0aGUgcmVzb3VyY2UgY29uc2lkZXJlZCAicHVibGljIj8KKyAJCWlmIChpbl9hcnJheShBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9kYXRhX3B1YmxpY19hY2Nlc3MnXSwkcmVzb3VyY2VHcm91cHMpKSB7IAorCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19BTEw7CisJCX0KKwkJCisJCS8vIEdldCB1c2VyIGF1dGhlbnRpY2F0aW9uIGluZm8KKwkJJGF1dGhlbnRpY2F0aW9uID0gQXBwOjpHZXQoKS0+Z2V0QXV0aGVudGljYXRpb25Qcm92aWRlcigpOworCQkkdXNlcm5hbWUgPSAoJGF1dGhlbnRpY2F0aW9uKQorCQkgICAgPyAkYXV0aGVudGljYXRpb24tPmdldEN1cnJlbnRVc2VybmFtZSgpCisJCSAgICA6IGZhbHNlOwkvLyBubyBhdXRoZW50aWNhdGlvbiBpbmZvIHByb3ZpZGVkIGluIGNvbmZpZyBmaWxlCisJCQorCQkvLyBEb2VzIHRoZSBtZXRhZGF0YSB2aXNpYmlsaXR5IGRlcGVuZCBvbiBhbiBhY2Nlc3MgZWxlbWVudCBtYXRjaGluZworIAkJLy8gdGhlIGBicm93c2VyX2RhdGFfYWNjZXNzX2tleWAgaW4gdGhlIGNvbmZpZyBzZXR0aW5nPworIAkJJGFjY2Vzc0tleUV4aXN0cyA9IGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX2RhdGFfYWNjZXNzX2tleSddKTsKKworIAkJLy8gSWYga2V5IGlzIHNldCB0aGVuIHdlIGxvb2sgaW50byB3aGF0IGdyb3VwcyBoYXZlIGFjY2VzcyB0byBtZXRhZGF0YQorIAkJaWYgKCAkYWNjZXNzS2V5RXhpc3RzICYmICFlbXB0eSgkcmVzb3VyY2VHcm91cHMpICkgeworCQkJCisJCQkvLyBIYXMgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgaW5mb3JtYXRpb24gYmVlbiBzcGVjaWZpZWQ/CisJCQlpZiAoICRhdXRoZW50aWNhdGlvbiApIHsKKwkJCQkKKwkJCSAJLy8gSXMgdGhlIHVzZXIgY3VycmVudGx5IGxvZ2dlZCBpbj8KKwkJCSAJaWYgKCAkdXNlcm5hbWUgKSB7CisJIAkJCisJCQkgCQkvLyBPYnRhaW4gdGhlIGdyb3VwcyBmb3IgdGhlIGN1cnJlbnQgdXNlcgorCQkJIAkJJHVzZXJHcm91cHMgPSBBcHA6OkdldCgpLT5nZXRBdXRob3JpemF0aW9uUHJvdmlkZXIoKS0+cmV0cmlldmVHcm91cHNGb3JVc2VyKCR1c2VybmFtZSk7CisJCQkgCQkJIAkJCisJCQkgCQkvLyBQZXJmb3JtIGEgY29tcGFyaXNvbiB2aWEgYXJyYXkgaW50ZXJzZWN0aW9uIHRvIGRldGVybWluZSBvdmVybGFwCisJCQkgCQkkeCA9IGFycmF5X2ludGVyc2VjdCgkdXNlckdyb3VwcywkcmVzb3VyY2VHcm91cHMpOworCQkJIAkJCisJCQkgCQlpZiAoZW1wdHkoJHgpKSB7IC8vIE5vIGludGVyc2VjdGlvbiBmb3VuZCBiZXR3ZWVuIHVzZXIgYW5kIHJlc291cmNlIGdyb3VwcworCQkJCisJCQkgCQkJLy8gRXhhbWluZSBgYnJvd3Nlcl9wdF9hdXRoX3BvbGljeWAgdG8gZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdGhlIGZhaWx1cmUKKwkJCSAJCQlzd2l0Y2ggKHN0cnRvdXBwZXIoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHRfYXV0aF9wb2xpY3knXSkpIHsKKwkJCSAJCQkJY2FzZSAiTElNSVQiOgorCQkJIAkJCQkJLy8gQWxsb3cgdGhlIHVzZXIgdG8gcHJvY2VlZCwgdGhlIG1ldGFkYXRhIHZpc2liaWxpdHkgcG9saWN5CisJCQkgCQkJCQkvLyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgaXMgdmlzaWJsZSB0byBub24tYXV0aG9yaXplZAorCQkJIAkJCQkJLy8gdXNlcnMuCisJCQkgCQkJCQlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX0xJTUlUOwkJCQkKKwkJCSAJCQkJY2FzZSAiREVOWSI6CisJCQkgCQkJCWRlZmF1bHQ6CisJCQkgCQkJCQkvLyBLaWNrIHRoZSB1c2VyIG91dCBhdCB0aGlzIHBvaW50LCBkZW55IGFsbCBhY2Nlc3MuIAorCQkJCSAJCQkJcmV0dXJuIENhc0Jyb3dzZXI6OlZJU19OT05FOworCQkJIAkJCX0KKwkJCSAJCX0gZWxzZSB7CisJCQkgCQkJLy8gV2UgaGF2ZSBhbiBhdXRob3JpemVkIHVzZXIKKwkJCSAJCQkkYXV0aG9yaXplZFVzZXIgPSB0cnVlOworCQkJIAkJfQorCQkJIAl9IGVsc2UgeworCQkJIAkJLy8gSWYgbm8gbG9nZ2VkIGluIHVzZXIsIGFuZCBwb2xpY3kgc2F5cyBERU5ZLCBraWNrIHRoZSB1c2VyCisJCQkgCQlpZiAoc3RydG91cHBlcihBcHA6OkdldCgpLT5zZXR0aW5nc1skbWV0VHlwZV0pID09ICJERU5ZIikgeworCQkJIAkJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfTk9ORTsKKyAJCQkgCQl9IGVsc2UgeworCQkJIAkJCXJldHVybiBDYXNCcm93c2VyOjpWSVNfTElNSVQ7CisgCQkJIAkJfQorCQkJIAl9CisJCSAJfSBlbHNlIHsKKwkJCSAJLy8gSWYgbm8gYXV0aGVudGljYXRpb24gcHJvdmlkZXIgaW5mb3JtYXRpb24gZXhpc3RzIGluIHRoZSBhcHBsaWNhdGlvbgorCQkJIAkvLyBjb25maWd1cmF0aW9uIGZpbGUsIGl0IGlzIGFzc3VtZWQgdGhhdCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbgorCQkJIAkvLyBhcmUgbm90IG5lZWRlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRodXMgZXZlcnkgdXNlciBpcyBhdXRob3JpemVkCisJCQkgCS8vIGJ5IGRlZmF1bHQuCisJCQkgCXJldHVybiBDYXNCcm93c2VyOjpWSVNfQUxMOwkKKwkJCX0JCQkJCisgCQl9IGVsc2UgeworIAkJCQorIAkJCS8vIEFsbCBkYXRhIGlzIHZpc2libGUgdG8gdXNlciBpZiBsb2dnZWQgaW4KKyAJCQkvLyBIYXMgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgaW5mb3JtYXRpb24gYmVlbiBzcGVjaWZpZWQ/CisJCQlpZiAoICRhdXRoZW50aWNhdGlvbiApIHsKKwkJCQkKKwkJCSAJLy8gSXMgdGhlIHVzZXIgY3VycmVudGx5IGxvZ2dlZCBpbj8KKwkJCSAJaWYgKCAkdXNlcm5hbWUgKSB7CisJCQkgCQlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX0FMTDsgLy8gV2UgaGF2ZSBhbiBhdXRob3JpemVkIHVzZXIKKwkJCSAJfSBlbHNlIHsKKwkJCSAJCS8vIElmIG5vIGxvZ2dlZCBpbiB1c2VyLCBhbmQgcG9saWN5IHNheXMgREVOWSwga2ljayB0aGUgdXNlcgorCQkJIAkJaWYgKHN0cnRvdXBwZXIoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJG1ldFR5cGVdKSA9PSAiREVOWSIpIHsKKwkJCSAJCQlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX05PTkU7CisJCQkgCQl9CisJCQkgCQlyZXR1cm4gQ2FzQnJvd3Nlcjo6VklTX0xJTUlUOworCQkJIAl9CisJCSAJfSBlbHNlIHsKKwkJCSAJLy8gSWYgbm8gYXV0aGVudGljYXRpb24gcHJvdmlkZXIgaW5mb3JtYXRpb24gZXhpc3RzIGluIHRoZSBhcHBsaWNhdGlvbgorCQkJIAkvLyBjb25maWd1cmF0aW9uIGZpbGUsIGl0IGlzIGFzc3VtZWQgdGhhdCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbgorCQkJIAkvLyBhcmUgbm90IG5lZWRlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRodXMgZXZlcnkgdXNlciBpcyBhdXRob3JpemVkCisJCQkgCS8vIGJ5IGRlZmF1bHQuCisJCQkgCXJldHVybiBDYXNCcm93c2VyOjpWSVNfQUxMOwkKKwkJCX0KKyAJCX0KKwl9CisJCisJLy8gQ3JlYXRlIGEgY3JpdGVyaWEgc3VidHJlZSB0aGF0IHdpbGwgc2VhcmNoIGZvciB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGNyaXRlcmlhSW5kZXggYWNyb3NzIGFsbCAKKwkvLyBtZXRhZGF0YSBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2R1Y3RUeXBlcy4KKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUJhc2ljU2VhcmNoU3VidHJlZSgkY3JpdGVyaWFJbmRleCwgJHF1ZXJ5VHlwZXMpeworCQkkY3JpdGVyaW9uID0gbmV3IENBU19GaWxlbWdyX0Jvb2xlYW5RdWVyeUNyaXRlcmlhKCk7CisJCSRjcml0ZXJpb24tPnNldE9wZXJhdG9yKENBU19GaWxlbWdyX0Jvb2xlYW5RdWVyeUNyaXRlcmlhOjokT1JfT1ApOworCQkkbWV0YWRhdGFOYW1lcyA9IGdldE1ldGFkYXRhRWxlbWVudHMoJHF1ZXJ5VHlwZXMpOworCQlmb3JlYWNoKCRtZXRhZGF0YU5hbWVzIGFzICRuYW1lKXsKKwkJCSR0ZXJtID0gbmV3IENBU19GaWxlbWdyX1Rlcm1RdWVyeUNyaXRlcmlhKCk7CisJCQkkdGVybS0+c2V0RWxlbWVudE5hbWUoJG5hbWUpOworCQkJJHRlcm0tPnNldFZhbHVlKCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ1ZhbHVlJ10pOworCQkJJGNyaXRlcmlvbi0+YWRkVGVybSgkdGVybSk7CisJCX0KKwkJcmV0dXJuICRjcml0ZXJpb247CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlVGVybUNyaXRlcmlhKCRjcml0ZXJpYUluZGV4LCAkcXVlcnlUeXBlcyl7CisJCWlmKCFpc3NldCgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydFbGVtZW50TmFtZSddKSl7CisJCQl0aHJvdyBuZXcgQ2FzQnJvd3NlckV4Y2VwdGlvbigiUXVlcnkgVGVybSBjcml0ZXJpb24gIiAuICRjcml0ZXJpYUluZGV4IC4gIiBkb2VzIG5vdCBjb250YWluICdFbGVtZW50TmFtZScgc3BlY2lmaWNhdGlvbiIpOworCQl9CisJCWlmKCFpc3NldCgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydWYWx1ZSddKSl7CisJCQl0aHJvdyBuZXcgQ2FzQnJvd3NlckV4Y2VwdGlvbigiUXVlcnkgVGVybSBjcml0ZXJpb24gIiAuICRjcml0ZXJpYUluZGV4IC4gIiBkb2VzIG5vdCBjb250YWluICdWYWx1ZScgc3BlY2lmaWNhdGlvbiIpOworCQl9CisJCWlmKCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ0VsZW1lbnROYW1lJ10gPT0gJyonKXsKKwkJCSRjcml0ZXJpb24gPSBzZWxmOjpjcmVhdGVCYXNpY1NlYXJjaFN1YnRyZWUoJGNyaXRlcmlhSW5kZXgsICRxdWVyeVR5cGVzKTsKKwkJfWVsc2V7CisJCQkkY3JpdGVyaW9uID0gbmV3IENBU19GaWxlbWdyX1Rlcm1RdWVyeUNyaXRlcmlhKCk7CisJCQkkY3JpdGVyaW9uLT5zZXRFbGVtZW50TmFtZSgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydFbGVtZW50TmFtZSddKTsKKwkJCSRjcml0ZXJpb24tPnNldFZhbHVlKCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ1ZhbHVlJ10pOworCQl9CisJCXJldHVybiAkY3JpdGVyaW9uOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlQ3JpdGVyaWEoJGNyaXRlcmlhSW5kZXgpeworCQlpZighaXNzZXQoJF9QT1NUWydDcml0ZXJpYSddWyRjcml0ZXJpYUluZGV4XVsnRWxlbWVudE5hbWUnXSkpeworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIlF1ZXJ5IFRlcm0gY3JpdGVyaW9uICIgLiAkY3JpdGVyaWFJbmRleCAuICIgZG9lcyBub3QgY29udGFpbiAnRWxlbWVudE5hbWUnIHNwZWNpZmljYXRpb24iKTsKKwkJfQorCQlpZighaXNzZXQoJF9QT1NUWydDcml0ZXJpYSddWyRjcml0ZXJpYUluZGV4XVsnTWluJ10pKXsKKwkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJRdWVyeSBSYW5nZSBjcml0ZXJpb24gIiAuICRjcml0ZXJpYUluZGV4IC4gIiBkb2VzIG5vdCBjb250YWluICdNaW4nIHNwZWNpZmljYXRpb24iKTsKKwkJfQorCQlpZighaXNzZXQoJF9QT1NUWydDcml0ZXJpYSddWyRjcml0ZXJpYUluZGV4XVsnTWF4J10pKXsKKwkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJRdWVyeSBSYW5nZSBjcml0ZXJpb24gIiAuICRjcml0ZXJpYUluZGV4IC4gIiBkb2VzIG5vdCBjb250YWluICdNYXgnIHNwZWNpZmljYXRpb24iKTsKKwkJfQorCQkkY3JpdGVyaW9uID0gbmV3IENBU19GaWxlbWdyX1JhbmdlUXVlcnlDcml0ZXJpYSgpOworCQkkY3JpdGVyaW9uLT5zZXRFbGVtZW50TmFtZSgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydFbGVtZW50TmFtZSddKTsKKwkJJGNyaXRlcmlvbi0+c2V0U3RhcnRWYWx1ZSgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydNaW4nXSk7CisJCSRjcml0ZXJpb24tPnNldEVuZFZhbHVlKCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ01heCddKTsKKwkJaWYoaXNzZXQoJF9QT1NUWydDcml0ZXJpYSddWyRjcml0ZXJpYUluZGV4XVsnSW5jbHVzaXZlJ10pKXsKKwkJCSRjcml0ZXJpb24tPnNldEluY2x1c2l2ZSgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydJbmNsdXNpdmUnXSk7CisJCX0KKwkJcmV0dXJuICRjcml0ZXJpb247CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlQm9vbGVhbkNyaXRlcmlhKCRjcml0ZXJpYUluZGV4LCAkcXVlcnlUeXBlcywgJGNyZWF0ZWRJbmRpY2VzKXsKKwkJaWYoIWlzc2V0KCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ09wZXJhdG9yJ10pKXsKKwkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJRdWVyeSBCb29sZWFuIGNyaXRlcmlvbiAiIC4gJGNyaXRlcmlhSW5kZXggLiAiIGRvZXMgbm90IGNvbnRhaW4gJ09wZXJhdG9yJyBzcGVjaWZpY2F0aW9uIik7CisJCX0KKwkJaWYoIWlzc2V0KCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ0NyaXRlcmlhVGVybXMnXSkpeworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIlF1ZXJ5IEJvb2xlYW4gY3JpdGVyaW9uICIgLiAkY3JpdGVyaWFJbmRleCAuICIgZG9lcyBub3QgY29udGFpbiAnQ3JpdGVyaWFUZXJtcycgc3BlY2lmaWNhdGlvbiIpOworCQl9CisJCWlmKCFjb3VudCgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydDcml0ZXJpYVRlcm1zJ10pKXsKKwkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJRdWVyeSBCb29sZWFuIGNyaXRlcmlvbiAiIC4gJGNyaXRlcmlhSW5kZXggLiAiIGRvZXMgbm90IGNvbnRhaW4gYW55IHRlcm1zIik7CisJCX0KKwkJJGNyaXRlcmlvbiA9IG5ldyBDQVNfRmlsZW1ncl9Cb29sZWFuUXVlcnlDcml0ZXJpYSgpOworCQkkb3BlcmF0b3IgPSB0cmltKHN0cnRvdXBwZXIoJF9QT1NUWydDcml0ZXJpYSddWyRjcml0ZXJpYUluZGV4XVsnT3BlcmF0b3InXSkpOworCQlpZigkb3BlcmF0b3IgPT0gJ0FORCcpeworCQkJJGNyaXRlcmlvbi0+c2V0T3BlcmF0b3IoQ0FTX0ZpbGVtZ3JfQm9vbGVhblF1ZXJ5Q3JpdGVyaWE6OiRBTkRfT1ApOworCQl9ZWxzZWlmKCRvcGVyYXRvciA9PSAnT1InKXsKKwkJCSRjcml0ZXJpb24tPnNldE9wZXJhdG9yKENBU19GaWxlbWdyX0Jvb2xlYW5RdWVyeUNyaXRlcmlhOjokT1JfT1ApOworCQl9ZWxzZWlmKCRvcGVyYXRvciA9PSAnTk9UJyl7CisJCQlpZihjb3VudCgkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydDcml0ZXJpYVRlcm1zJ10pICE9IDEpeworCQkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJRdWVyeSBCb29sZWFuIGNyaXRlcmlvbiAiIC4gJGNyaXRlcmlhSW5kZXggLiAiIGNhbm5vdCBuZWdhdGUgbW9yZSB0aGFuIG9uZSB0ZXJtIik7CisJCQl9CisJCQkkY3JpdGVyaW9uLT5zZXRPcGVyYXRvcihDQVNfRmlsZW1ncl9Cb29sZWFuUXVlcnlDcml0ZXJpYTo6JE5PVF9PUCk7CisJCX1lbHNleworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIkVycm9yOiBRdWVyeSBCb29sZWFuIGNyaXRlcmlvbiAiIC4gJGNyaXRlcmlhSW5kZXggLiAiIHRyaWVzIHRvIHVzZSB1bmRlZmluZWQgb3BlcmF0b3IgJyIgLiAkb3BlcmF0b3IgLiAiJyIpOworCQl9CisJCWZvcmVhY2goYXJyYXlfbWFwKCJpbnR2YWwiLCAkX1BPU1RbJ0NyaXRlcmlhJ11bJGNyaXRlcmlhSW5kZXhdWydDcml0ZXJpYVRlcm1zJ10pIGFzICRjaGlsZEluZGV4KXsKKwkJCWlmKGluX2FycmF5KCRjaGlsZEluZGV4LCAkY3JlYXRlZEluZGljZXMpKXsJCS8vIENoZWNrIGZvciBsb29wcyBpbiBjcml0ZXJpYSB0cmVlCisJCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIkNyaXRlcmlvbiAiIC4gJGNyaXRlcmlhSW5kZXggLiAiIGxpc3RzICIgLiAkY2hpbGRJbmRleCAuICJhcyBhIGNoaWxkLCBtYWtpbmcgYSBsb29wLiIpOworCQkJfQorCQkJYXJyYXlfcHVzaCgkY3JlYXRlZEluZGljZXMsICRjaGlsZEluZGV4KTsKKwkJCSRjaGlsZCA9IHNlbGY6OmNyZWF0ZUNyaXRlcmlhVHJlZSgkY2hpbGRJbmRleCwgJHF1ZXJ5VHlwZXMpOworCQkJJGNyaXRlcmlvbi0+YWRkVGVybSgkY2hpbGQpOworCQl9CisJCXJldHVybiAkY3JpdGVyaW9uOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUNyaXRlcmlhVHJlZSgkY3JpdGVyaWFJbmRleCwgJHF1ZXJ5VHlwZXMsICRjcmVhdGVkSW5kaWNlcz1udWxsKXsKKwkJaWYoIWlzc2V0KCRjcmVhdGVkSW5kaWNlcykpeworCQkJJGNyZWF0ZWRJbmRpY2VzID0gYXJyYXkoKTsKKwkJfQorCQlpZighaXNzZXQoJF9QT1NUWydDcml0ZXJpYSddWyRjcml0ZXJpYUluZGV4XSkpeworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIlF1ZXJ5IEJvb2xlYW4gY3JpdGVyaW9uICIgLiAkY3JpdGVyaWFJbmRleCAuICIgZG9lcyBub3QgZXhpc3QuIik7CisJCX0KKwkJJHR5cGUgPSBzdHJ0b2xvd2VyKCRfUE9TVFsnQ3JpdGVyaWEnXVskY3JpdGVyaWFJbmRleF1bJ0NyaXRlcmlhVHlwZSddKTsKKwkJaWYoJHR5cGUgPT0gJ3Rlcm0nKXsKKwkJCSRjcml0ZXJpb24gPSBzZWxmOjpjcmVhdGVUZXJtQ3JpdGVyaWEoJGNyaXRlcmlhSW5kZXgsICRxdWVyeVR5cGVzKTsKKwkJfWVsc2VpZigkdHlwZSA9PSAncmFuZ2UnKXsKKwkJCSRjcml0ZXJpb24gPSBzZWxmOjpjcmVhdGVSYW5nZUNyaXRlcmlhKCRjcml0ZXJpYUluZGV4KTsKKwkJfWVsc2VpZigkdHlwZSA9PSAnYm9vbGVhbicpeworCQkJJGNyaXRlcmlvbiA9IHNlbGY6OmNyZWF0ZUJvb2xlYW5Dcml0ZXJpYSgkY3JpdGVyaWFJbmRleCwgJHF1ZXJ5VHlwZXMsICRjcmVhdGVkSW5kaWNlcyk7CisJCX1lbHNleworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIlF1ZXJ5IGNyaXRlcmlvbiAiIC4gJGNyaXRlcmlhSW5kZXggLiAiIGNvbnRhaW5zIGFuIHVua25vd24gdHlwZSAiIC4gJHR5cGUgLiAiLiAgUGxlYXNlIHVzZSBvbmUgb2YgJ3Rlcm0nLCAncmFuZ2UnIG9yICdib29sZWFuJyIpOworCQl9CisJCXJldHVybiAkY3JpdGVyaW9uOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1ldGFkYXRhTmFtZXNGb3JUeXBlUHJvZHVjdHMoJHR5cGUpeworCQkkY2IgPSBuZXcgQ2FzQnJvd3NlcigpOworCQkkY2xpZW50ID0gJGNiLT5nZXRDbGllbnQoKTsKKwkJJGVsZW1lbnROYW1lcyA9IGFycmF5KCk7CisJCWZvcmVhY2goJGNsaWVudC0+Z2V0RWxlbWVudHNCeVByb2R1Y3RUeXBlKCR0eXBlKSBhcyAkZSl7CisJCQlhcnJheV9wdXNoKCRlbGVtZW50TmFtZXMsICRlLT5nZXRFbGVtZW50TmFtZSgpKTsKKwkJfQorCQlmb3JlYWNoKGFycmF5X2tleXMoJHR5cGUtPmdldFR5cGVNZXRhZGF0YSgpLT50b0Fzc29jQXJyYXkoKSkgYXMgJHR5cGVFbGVtZW50TmFtZSl7CisJCQlpZighaW5fYXJyYXkoJHR5cGVFbGVtZW50TmFtZSwgJGVsZW1lbnROYW1lcykpeworCQkJCWFycmF5X3B1c2goJGVsZW1lbnROYW1lcywgJHR5cGVFbGVtZW50TmFtZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuICRlbGVtZW50TmFtZXM7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RmFjZXRzKCl7CisJCSRjYiA9IG5ldyBDYXNCcm93c2VyKCk7CisJCSRjbGllbnQgPSAkY2ItPmdldENsaWVudCgpOworCQkkdHlwZXMgPSAkY2xpZW50LT5nZXRQcm9kdWN0VHlwZXMoKTsKKwkJJGZhY2V0cyA9IHNlbGY6OmdldE1ldGFkYXRhTmFtZXNGb3JUeXBlUHJvZHVjdHMoYXJyYXlfcG9wKCR0eXBlcykpOworCQlpZihjb3VudCgkdHlwZXMpID09IDApeworCQkJcmV0dXJuICRmYWNldHM7CS8vIEluIGNhc2UgdGhlcmUgaXMgb25seSBvbmUgcHJvZHVjdCB0eXBlCisJCX0KKwkJZm9yZWFjaCgkdHlwZXMgYXMgJHR5cGUpeworCQkJJGVsZW1lbnROYW1lcyA9IHNlbGY6OmdldE1ldGFkYXRhTmFtZXNGb3JUeXBlUHJvZHVjdHMoJHR5cGUpOworCQkJJGZhY2V0cyA9IGFycmF5X2ludGVyc2VjdCgkZmFjZXRzLCAkZWxlbWVudE5hbWVzKTsKKwkJfQorCQlyZXR1cm4gJGZhY2V0czsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYWdpbmF0ZSgkYWxsUHJvZHVjdHMsICRwYWdlTnVtLCAkcGFnZVNpemUpeworCQlpZihjb3VudCgkYWxsUHJvZHVjdHMpID09IDApeworCQkJcmV0dXJuIGFycmF5KCk7CisJCX0KKwkJaWYoJHBhZ2VTaXplIDw9IDApeworCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIlRoZSBnaXZlbiBQYWdlU2l6ZSAoIiAuICRwYWdlU2l6ZSAuICIpIHdhcyB6ZXJvIG9yIGxlc3MuIik7CisJCX0KKwkJJHN0YXJ0SW5kZXggPSAoJHBhZ2VOdW0gLSAxKSAqICRwYWdlU2l6ZTsKKwkJaWYoJHN0YXJ0SW5kZXggPj0gY291bnQoJGFsbFByb2R1Y3RzKSl7CisJCQl0aHJvdyBuZXcgQ2FzQnJvd3NlckV4Y2VwdGlvbigiVGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgcGFnZSAoIiAuCisJCQkJCSRzdGFydEluZGV4IC4gIikgaXMgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IGluZGV4IG9mIGFsbCBwcm9kdWN0cyAoIiAuCisJCQkJCWNvdW50KCRhbGxQcm9kdWN0cykgLiAiKS4iKTsKKwkJfQorCQkkZW5kSW5kZXggPSAkc3RhcnRJbmRleCArICRwYWdlU2l6ZSAtIDE7CisJCSRlbmRJbmRleCA9IG1pbigkZW5kSW5kZXgsIGNvdW50KCRhbGxQcm9kdWN0cykgLSAxKTsKKwkJJHJlcXVlc3RlZFByb2R1Y3RzID0gYXJyYXkoKTsKKwkJZm9yKCRpID0gJHN0YXJ0SW5kZXg7ICRpIDw9ICRlbmRJbmRleDsgJGkrKyl7CisJCQlhcnJheV9wdXNoKCRyZXF1ZXN0ZWRQcm9kdWN0cywgJGFsbFByb2R1Y3RzWyRpXSk7CisJCX0KKwkJcmV0dXJuICRyZXF1ZXN0ZWRQcm9kdWN0czsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRSZXN1bHRzKCRwcm9kdWN0cyl7CisJCSRjYiA9IG5ldyBDYXNCcm93c2VyKCk7CisJCSRjbGllbnQgPSAkY2ItPmdldENsaWVudCgpOworCQkkcmVzdWx0cyA9IGFycmF5KCk7CisJCWZvcmVhY2goJHByb2R1Y3RzIGFzICRwcm9kdWN0KXsKKwkJCXRyeXsKKwkJCQkkcCA9IGFycmF5KCdpZCc9PiRwcm9kdWN0Wydwcm9kdWN0J10tPmdldElkKCksCisJCQkJCQknbmFtZSc9PnVybERlY29kZSgkcHJvZHVjdFsncHJvZHVjdCddLT5nZXROYW1lKCkpLAorCQkJCQkJJ21ldGFkYXRhJz0+JGNsaWVudC0+Z2V0TWV0YWRhdGEoJHByb2R1Y3RbJ3Byb2R1Y3QnXSktPnRvQXNzb2NBcnJheSgpKTsKKwkJCQlpZihpc3NldCgkcHJvZHVjdFsndHlwZU5hbWUnXSkpeworCQkJCQkkcFsndHlwZSddID0gJHByb2R1Y3RbJ3R5cGVOYW1lJ107CisJCQkJfQorCQkJCWFycmF5X3B1c2goJHJlc3VsdHMsICRwKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gJGUpeworCQkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGZvcm1hdHRpbmcgcHJvZHVjdCBbIiAuCisJCQkJCQkkcHJvZHVjdFsncHJvZHVjdCddLT5nZXRJZCgpIC4gIl0gbWV0YWRhdGE6ICIgLiAkZS0+Z2V0TWVzc2FnZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gJHJlc3VsdHM7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwb3J0RXJyb3IoJG1lc3NhZ2UsICRvdXRwdXRGb3JtYXQpeworCQlpZigkb3V0cHV0Rm9ybWF0ID09ICdodG1sJyl7CisJCQllY2hvICc8ZGl2IGNsYXNzPSJlcnJvciI+JyAuICRtZXNzYWdlIC4gJzwvZGl2Pic7CisJCX1lbHNlaWYoJG91dHB1dEZvcm1hdCA9PSAnanNvbicpeworCQkJJHBheWxvYWQgPSBhcnJheSgpOworCQkJJHBheWxvYWRbJ0Vycm9yJ10gPSAxOworCQkJJHBheWxvYWRbJ0Vycm9yTXNnJ10gPSAkbWVzc2FnZTsKKwkJCSRwYXlsb2FkID0ganNvbl9lbmNvZGUoJHBheWxvYWQpOworCQkJZWNobyAkcGF5bG9hZDsKKwkJfQorCQlleGl0KCk7CisJfQorCQorfQorCitjbGFzcyBDYXNCcm93c2VyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9ue30KKworPz4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL2NvbmZpZy5pbmkgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9jb25maWcuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTdhZjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9jb25maWcuaW5pCkBAIC0wLDAgKzEsMTIxIEBACis7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorOyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKzsgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorOyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorOyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorOyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworOyBDQVMtQlJPV1NFUiBtb2R1bGUgY29uZmlndXJhdGlvbiBmaWxlCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKzsgRklMRSBNQU5BR0VSIENPTk5FQ1RJVklUWQorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTcGVjaWZ5IGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yIGFuIGluc3RhbmNlIG9mIHRoZSBPT0RUIGZpbGUgbWFuYWdlci4KKzsKK2Jyb3dzZXJfZmlsZW1ncl91cmwgICA9IGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMAorYnJvd3Nlcl9maWxlbWdyX3BhdGggID0gLworYnJvd3Nlcl9kYXRhZGVsaXZfdXJsID0gaHR0cDovL2hvc3Q6cG9ydC9wYXRoCisKKworCis7IEFVVEhFTlRJQ0FUSU9OIEFORCBBVVRIT1JJWkFUSU9OCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIG1vZHVsZSBmb3Igc3BlY2lmaWMgYXV0aCAmIGF1dGggcmVxdWlyZW1lbnRzLgorCis7IFRoaXMga2V5IHNwZWNpZmllcyB0aGUgYmVoYXZpb3IgdG8gdGFrZSB3aGVuIHVzZXJzIGF0dGVtcHQgdG8gYWNjZXNzIHJlc291cmNlcworOyBmb3Igd2hpY2ggdGhleSBkbyBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zLiBUaGVyZSBhcmUgdHdvIG9wdGlvbnM6Cis7Cis7IGRlbnkgID0+IGZvcmNlIHJlZGlyZWN0IHdpdGggYSA0MDMgTm90IEF1dGhvcml6ZWQgZXJyb3IKKzsgICAgICAgICAgIFRoaXMgb3B0aW9uIHByZXZlbnRzIGEgdXNlciBmcm9tIHZpZXdpbmcgYW55IGluZm9ybWF0aW9uIGFib3V0Cis7ICAgICAgICAgICBwcm9kdWN0cyBvciBwcm9kdWN0VHlwZXMgdGhleSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gc2VlLgorOworOyBsaW1pdCA9PiBhcHBseSB0aGUgbWV0YWRhdGEgZmlsdGVyaW5nIHBvbGljeSBzcGVjaWZpZWQgaW4gZWxlbWVudC12aXNpYmlsaXR5LmluaQorOyAgICAgICAgICAgdG8gY29udHJvbCBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gb24gYSBtb3JlIGdyYW51bGFyLCBlbGVtZW50IGJ5Cis7ICAgICAgICAgICBlbGVtZW50IGxldmVsLiBUaGlzIGFsbG93cyB1c2VycyB0byBzZWUgcHVibGljbHkgYXZhaWxhYmxlIGluZm9ybWF0aW9uCis7ICAgICAgICAgICBhYm91dCBhbiBvdGhlcndpc2UgcHJvdGVjdGVkIHByb2R1Y3Qgb3IgcHJvZHVjdFR5cGUuCis7Cis7IFBvbGljeSBmb3IgcHJvZHVjdCB0eXBlczoKK2Jyb3dzZXJfcHRfYXV0aF9wb2xpY3kgPSBsaW1pdAorOyBQb2xpY3kgZm9yIHByb2R1Y3RzOgorYnJvd3Nlcl9wX2F1dGhfcG9saWN5ICA9IGxpbWl0CisKKzsgVGhpcyBrZXkgc3BlY2lmaWVzIHRoZSBwcm9kdWN0VHlwZSBtZXRhZGF0YSBlbGVtZW50IHRoYXQgY29udGFpbnMKKzsgdGhlIGxpc3Qgb2Ygc2VjdXJpdHkgZ3JvdXBzIChha2Egcm9sZXMsIHBlcm1pc3Npb25zLGV0YykgdGhhdCBzaG91bGQKKzsgYmUgZ3JhbnRlZCBhY2Nlc3MuIFRoaXMga2V5IGNhbiBleGlzdCBpbiBwcm9kdWN0VHlwZSBtZXRhZGF0YSwgb3IKKzsgcHJvZHVjdCBtZXRhZGF0YSwgb3IgYm90aC4gSWYgaXQgZXhpc3RzIGluIHByb2R1Y3RUeXBlIG1ldGFkYXRhIG9ubHksCis7IHByb2R1Y3RzIHdpbGwgaW5oZXJpdCB0aGUgaW5mb3JtYXRpb24uCis7Citicm93c2VyX2RhdGFfYWNjZXNzX2tleSAJPSBBY2Nlc3NHcmFudGVkVG8KK2Jyb3dzZXJfZGF0YV9wdWJsaWNfYWNjZXNzIAk9IHB1YmxpYworCis7IExPT0sgQU5EIEZFRUwgU0VUVElOR1MKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQ3VzdG9taXplIGFzcGVjdHMgb2YgdGhlIHVzZXIgaW50ZXJmYWNlIHRvIHN1aXQgcHJvamVjdCBuZWVkcworCiticm93c2VyX2luZGV4X3RpdGxlX3RleHQgID0gQ2FzIEJyb3dzZXIKKworOyBUaGVzZSBrZXlzIGlkZW50aWZ5IHRoZSBtZXRhZGF0YSBrZXlzIHVzZWQgdG8gb2J0YWluIGJhc2ljIHByb2R1Y3QgdHlwZSAKKzsgaW5mb3JtYXRpb24uIFRoZXNlIHJhcmVseSBuZWVkIHRvIGJlIG1hbnVhbGx5IGNoYW5nZWQuCis7ICAgIGJyb3dzZXJfcHRfbmFtZV9rZXk6IHRoZSBwcm9kdWN0IHR5cGUgbmFtZQorOyAgICBicm93c2VyX3B0X2Rlc2Nfa2V5OiB0aGUga2V5IGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvZHVjdCB0eXBlIAorOyAgICBicm93c2VyX3B0X2lkX2tleTogICB0aGUga2V5IGNvbnRhaW5pbmcgdGhlIHVuaXF1ZSBwcm9kdWN0IHR5cGUgaWQgKHVybikKKworYnJvd3Nlcl9wdF9uYW1lX2tleSAgICAgICA9IG5hbWUKK2Jyb3dzZXJfcHRfZGVzY19rZXkgICAgICAgPSBkZXNjcmlwdGlvbgorYnJvd3Nlcl9wdF9pZF9rZXkgICAgICAgICA9IGlkCisKKzsgVGhlc2Uga2V5cyBkZXRlcm1pbmUgd2hpY2ggbWV0YWRhdGEgZWxlbWVudHMgd2lsbAorOyBhcHBlYXIgYXMgY29sdW1uIGhlYWRlcnMgb24gdGhlIGRhdGFzZXQgdmlld2VyCisKK2Jyb3dzZXJfcHRfc2VhcmNoX21ldFtdICAgPSBuYW1lCiticm93c2VyX3B0X3NlYXJjaF9tZXRbXSAgID0gZGVzY3JpcHRpb24KK2Jyb3dzZXJfcHRfc2VhcmNoX21ldFtdICAgPSBpZAorCis7IFRoaXMga2V5IGRldGVybWluZXMgd2hpY2ggb2YgdGhlIGBicm93c2VyX3B0X3NlYXJjaF9tZXRgIGtleXMgd2lsbCBiZSB1c2VkCis7IGFzIHRoZSBjbGlja2FibGUgbGluayB0YWtpbmcgdGhlIHVzZXIgdG8gdGhlIG92ZXJ2aWV3IHBhZ2UgZm9yIHRoZSBnaXZlbgorOyBwcm9kdWN0IHR5cGUKKworYnJvd3Nlcl9wdF9zZWFyY2hfbGlua2tleSA9IG5hbWUKKworOyBUaGVzZSBrZXlzIHNwZWNpZnkgKGFuIGFycmF5IG9mKSBwcm9kdWN0IHR5cGVzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgCis7IHByb2R1Y3QgdHlwZSBsaXN0IGRpc3BsYXllZCBvbiB0aGUgaW5kZXggcGFnZS4KK2Jyb3dzZXJfZGF0YXNldF9pZ25vcmVzW10gPSB1cm46b29kdDpHZW5lcmljRmlsZQorCisKKworOyBUaGUgYnJvd3Nlcl9wcm9kdWN0c19tZXRbXSBhcnJheSBrZXkgZGljdGF0ZXMgd2hpY2ggbWV0YWRhdGEgZWxlbWVudHMgd2lsbAorOyBiZSBkaXNwbGF5ZWQgaW4gdGhlIHByb2R1Y3RzIHZpZXcuICBPbmUgY2FuIGRlc2lnbmF0ZSBhbnkgbnVtYmVyIG9mCis7IGVsZW1lbnRzIHRvIGRpc3BsYXkgKGluY2x1ZGluZyB6ZXJvKSwgYnV0IGFsbCBvZiB0aGVtIG11c3QgYmUgZGVmaW5lZCBmb3IKKzsgYWxsIHByb2R1Y3QgdHlwZXMuCisKK2Jyb3dzZXJfcHJvZHVjdHNfbWV0W10gPSBDQVMuUHJvZHVjdElkCiticm93c2VyX3Byb2R1Y3RzX21ldFtdID0gTWltZVR5cGUKK2Jyb3dzZXJfcHJvZHVjdHNfbWV0W10gPSBQcm9kdWN0U3RydWN0dXJlCiticm93c2VyX3Byb2R1Y3RzX21ldFtdID0gQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUKKworOyBUaGUgYnJvd3Nlcl9wcml2YXRlX3Byb2R1Y3RzX3Zpc2liaWxpdHkga2V5IGRpY3RhdGVzIHdoZXRoZXIgcHJpdmF0ZSBwcm9kdWN0cyAKKzsgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHByb2R1Y3RzIHZpZXcuCiticm93c2VyX3ByaXZhdGVfcHJvZHVjdHNfdmlzaWJpbGl0eSA9IHRydWUKKworOyBJZiB0aGUgYnJvd3Nlcl9zaG93X2Rvd25sb2FkX3dpZGdldCBrZXkgaXMgc2V0IHRvIDAsIHRoZSBkb3dubG9hZCB3aWRnZXQgaW4KKzsgdGhlIHByb2R1Y3RzIHZpZXcgd29uJ3QgYmUgZGlzcGxheWVkLiAgSWYgdGhlIGtleSBpcyBzZXQgdG8gYW55IG90aGVyIHZhbHVlCis7IHRoZSB3aWRnZXQgd2lsbCBiZSBkaXNwbGF5ZWQuCisKK2Jyb3dzZXJfc2hvd19kb3dubG9hZF93aWRnZXQ9MQorCis7IElmIGRlZmF1bHRfc2hvd19hbGwgaXMgc2V0IHRvIDEsIHRoZW4gdGhlIHR5cGVzZWFyY2ggdmlldyB3aWxsLCBieSBkZWFmdWx0LAorOyBkaXNwbGF5IGFsbCBwcm9kdWN0cyBvZiBhbGwgdHlwZXMgd2hlbiB0aGUgdmlldyBpcyBvcGVuZWQuICBPdGhlcndpc2UsIG5vCis7IHByb2R1Y3RzIHdpbGwgYmUgc2hvd24gaW4gdGhlIHR5cGVzZWFyY2ggdmllIHVudGlsIGZpbHRlcnMgYXJlIHNwZWNpZmllZC4KKworZGVmYXVsdF9zaG93X2FsbCA9IDEKKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvZWxlbWVudC1vcmRlcmluZy5pbmkgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9lbGVtZW50LW9yZGVyaW5nLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM1MWZkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvZWxlbWVudC1vcmRlcmluZy5pbmkKQEAgLTAsMCArMSw2NCBAQAorOworOyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKzsgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCis7IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKzsgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKzsgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKzsgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Cis7IEVMRU1FTlQtT1JERVJJTkcuSU5JCis7Cis7IFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBvcmRlciBvZiBtZXRhZGF0YSBrZXlzIG9uIGEgcGVyLXByb2R1Y3QtdHlwZSBiYXNpcworOyBFbGVtZW50cyBub3QgZXhwbGljaXRseSBtZW50aW9uZWQgaW4gdGhpcyBmaWxlIHdpbGwgYmUgZGlzcGxheWVkIGZvbGxvd2luZworOyBhbGwgb2YgdGhlIGV4cGxpY2l0bHkgb3JkZXJlZCBlbGVtZW50cy4KKzsKKzsgVGhlIGdsb2JhbCBzZWN0aW9uIFsqXSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBkZWZhdWx0IG9yZGVyaW5nIHRvIGFwcGx5LgorOyBOb3RlIHRoYXQsIGlmIGEgcHJvZHVjdCB0eXBlIGRlY2xhcmF0aW9uIGlzIGZvdW5kLCBpdHMgb3JkZXJpbmcgb3ZlcnJpZGVzCis7IHRoZSBkZWZhdWx0IG9yZGVyaW5nIGluIFsqXS4KKzsKKzsgVGhlcmUgYXJlIHR3byBvcmRlcmVkIGFycmF5cyBmb3IgZWFjaCBwcm9kdWN0IHR5cGU6Cis7ICAgIHB0LmVsZW1lbnQub3JkZXJpbmc6ICAgc3BlY2lmaWVzIHByb2R1Y3QtdHlwZSBtZXRhZGF0YSBvcmRlcgorOyAgICBwLmVsZW1lbnQub3JkZXJpbmc6ICAgIHNwZWNpZmllcyBwcm9kdWN0IG1ldGFkYXRhIG9yZGVyCis7CisKK1sqXQorO3Byb2R1Y3QgdHlwZSBtZXRhZGF0YSBlbGVtZW50IG9yZGVyaW5nIChnbG9iYWwpCis7IHRoZSAnLmZpcnN0JyBhcnJheSBpbmRpY2F0ZXMgdGhvc2UgZWxlbWVudHMgd2hpY2ggc2hvdWxkIGJlIHNob3duIEJFRk9SRQorOyBhbGwgb3RoZXIgbWV0YWRhdGEgZWxlbWVudHM6CitwdC5lbGVtZW50Lm9yZGVyaW5nLmZpcnN0W10gPSAKKworCis7IHRoZSAnLmxhc3QnIGFycmF5IGluZGljYXRlcyB0aG9zZSBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBzaG93biBBRlRFUgorOyBhbGwgb3RoZXIgbWV0YWRhdGEgZWxlbWVudHMuIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyBhcnJheSB3aWxsIGJlCis7IHNob3duIGxhc3QuCitwdC5lbGVtZW50Lm9yZGVyaW5nLmxhc3RbXSA9IAorCisKKzsgcHJvZHVjdCBtZXRhZGF0YSBlbGVtZW50IG9yZGVyaW5nIChnbG9iYWwpCis7IHRoZSAnLmZpcnN0JyBhcnJheSBpbmRpY2F0ZXMgdGhvc2UgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgc2hvd24gQkVGT1JFCis7IGFsbCBvdGhlciBtZXRhZGF0YSBlbGVtZW50czoKK3AuZWxlbWVudC5vcmRlcmluZy5maXJzdFtdID0KKzsgdGhlICcubGFzdCcgYXJyYXkgaW5kaWNhdGVzIHRob3NlIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHNob3duIEFGVEVSCis7IGFsbCBvdGhlciBtZXRhZGF0YSBlbGVtZW50cy4gVGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIGFycmF5IHdpbGwgYmUKKzsgc2hvd24gbGFzdC4KK3AuZWxlbWVudC5vcmRlcmluZy5sYXN0W10gPQorCis7IEl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBnbG9iYWwgc2V0dGluZ3Mgb24gYSBwZXItcHJvZHVjdFR5cGUgYmFzaXMKKzsgc2ltcGx5IGJ5IGRlZmluaW5nIGEgcHJvZHVjdFR5cGUgaGVhZGVyIGFuZCByZS1kZWZpbmluZyB0aGUgcHQuZWxlbWVudC5vcmRlcmluZy4qCis7IGFycmF5cyBmb3IgdGhhdCBwcm9kdWN0VHlwZS4gUHJvZHVjdFR5cGUtc3BlY2lmaWMgc2V0dGluZ3MgZG8gbm90IGluaGVyaXQgZnJvbSAKKzt0aGUgZ2xvYmFsIHNldHRpbmdzLgorOworO1t1cm46b29kdDpHZW5lcmljRmlsZV0KKztwdC5lbGVtZW50Lm9yZGVyaW5nLmZpcnN0W10gPQorO3B0LmVsZW1lbnQub3JkZXJpbmcubGFzdFtdID0gCis7cC5lbGVtZW50Lm9yZGVyaW5nLmZpcnN0W10gPQorO3AuZWxlbWVudC5vcmRlcmluZy5sYXN0W10gPQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvZWxlbWVudC12aXNpYmlsaXR5LmluaSBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL2VsZW1lbnQtdmlzaWJpbGl0eS5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzZjlkYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL2VsZW1lbnQtdmlzaWJpbGl0eS5pbmkKQEAgLTAsMCArMSw0OSBAQAorOworOyBFTEVNRU5ULVZJU0lCSUxJVFkuSU5JCis7Cis7IFRoaXMgZmlsZSBjb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiBtZXRhZGF0YSBlbGVtZW50cyBmb3IgcHJvZHVjdCB0eXBlcyAKKzsga25vd24gdG8gdGhlIHVuZGVybHlpbmcgZmlsZSBtYW5hZ2VyIGluc3RhbmNlLgorOyAKKzsgU3BlY2lmeSB0aGUgaW50ZXJwcmV0YXRpb24gcG9saWN5IGZvciB0aGlzIGZpbGUuIFRoaXMgY2FuIHRha2Ugb25lIG9mIHR3byB2YWx1ZXM6Cis7ICAgIHNob3c6IERlZmluaXRpb25zIGluIHRoaXMgZmlsZSBpbmRpY2F0ZSBtZXRhZGF0YSBrZXlzIHdoaWNoIHNob3VsZCBiZSBTSE9XTgorOyAgICBoaWRlOiBEZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUgaW5kaWNhdGUgbWV0YWRhdGEga2V5cyB3aGljaCBzaG91bGQgYmUgSElEREVOCis7Cis7ICBJZiB0aGUgcG9saWN5IGlzICdzaG93JyBhbmQgYW4gZWxlbWVudCBkb2VzIE5PVCBhcHBlYXIgaW4gdGhpcyBmaWxlLCBpdCB3aWxsIGJlIAorOyAgaGlkZGVuLiBDb252ZXJzZWx5LCBpZiB0aGUgcG9saWN5IGlzICdoaWRlJyBhbmQgYW4gZWxlbWVudCBkb2VzIE5PVCBhcHBlYXIgaW4gCis7ICB0aGlzIGxpc3QsIGl0IHdpbGwgYmUgc2hvd24uCisKK2ludGVycHJldGF0aW9uLnBvbGljeSA9IGhpZGUKKworOyBOZXh0LCBkZWZpbmUgZWxlbWVudCB2aXNpYmlsaXR5IG9uIGEgcGVyLXByb2R1Y3QtdHlwZSBiYXNpcy4KKzsgVG8gc3BlY2lmeSBkZWZpbml0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHByb2R1Y3QgdHlwZSwgZmlyc3QgZGVjbGFyZSB0aGUgcHJvZHVjdCB0eXBlIAorOyBieSBlbmNsb3NpbmcgaXRzIFVSTiBpbiBzcXVhcmUgYnJhY2tldHMgb24gaXRzIG93biBsaW5lLCBlLmcuOgorOyBbdXJuOm9vZHQ6R2VuZXJpY0ZpbGVdCis7ICh3aXRob3V0IHRoZSBsZWFkaW5nICc7Jywgb2J2aW91c2x5KSBhbmQgdGhlbiBhZGQgZWxlbWVudCB2aXNpYmlsaXR5IGRlZmluaXRpb25zIGJlbG93LiAKKzsKKzsgRWxlbWVudCB2aXNpYmlsaXR5IGRlZmluaXRpb25zIHRha2UgdGhyZWUgZm9ybXM6Cis7ICAgICB2aXNpYmlsaXR5LmFsd2F5czogICAgICAgIHdpbGwgYmUge3Nob3duL2hpZGRlbn0gcmVnYXJkbGVzcyBvZiBhdXRoZW50aWNhdGlvbgorOyAgICAgdmlzaWJpbGl0eS5hbm9ueW1vdXM6ICAgICB3aWxsIGJlIHtzaG93bi9oaWRkZW59IGZvciBhbm9ueW1vdXMgdXNlcnMKKzsgICAgIHZpc2liaWxpdHkuYXV0aGVudGljYXRlZDogd2lsbCBiZSB7c2hvd24vaGlkZGVufSBmb3IgYXV0aGVudGljYXRlZCB1c2VycworOyBOb3RlIHRoYXQge3Nob3duL2hpZGRlbn0gaXMgZGV0ZXJtaW5lZCBieSB0aGUgaW50ZXJwcmV0YXRpb24ucG9saWN5IGZvciB0aGUgZmlsZS4gVGhhdCBpcywgCis7IGlmIHRoZSBpbnRlcnByZXRhdGlvbiBwb2xpY3kgaXMgInNob3ciLCB0aGVuIHRoZSBrZXlzIHVuZGVyIHZpc2liaWxpdHkuYWx3YXlzIHdpbGwgYWx3YXlzCis7IGJlIHNob3duLiBJZiB0aGUgaW50ZXJwcmV0YXRpb24gaXMgImhpZGUiLCBob3dldmVyLCB0aG9zZSBzYW1lIGtleXMgd2lsbCBhbHdheXMgYmUKKzsgaGlkZGVuLgorOyAKKzsKKzsKKzsgRGVmaW5pdGlvbnMgdW5kZXIgdGhlIHByb2R1Y3QgdHlwZSBsYWJlbCBbKl0gd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwcm9kdWN0IHR5cGVzIGFuZCAKKzsgbWVyZ2VkIHdpdGggYW55IHByb2R1Y3QtdHlwZS1zcGVjaWZpYyBkZWZpbml0aW9ucyB3aGljaCBtYXkgY29tZSBsYXRlciBpbiB0aGUgZmlsZS4KK1sqXQordmlzaWJpbGl0eS5hbHdheXNbXSA9IAordmlzaWJpbGl0eS5hbm9ueW1vdXNbXSA9IAordmlzaWJpbGl0eS5hdXRoZW50aWNhdGVkW10gPSAKKworOyBFWEFNUExFIG9mIHByb2R1Y3QtdHlwZSBzcGVjaWZpYyBvdmVycmlkZToKKzsgRGVmaW5pdGlvbnMgZm9yIHRoZSBGSENSQyBIYW5hc2ggKEFubmV4aW4tTEFNUikgcHJvZHVjdCB0eXBlCis7Cis7W3VybjplZHJuOkZIQ1JDSGFuYXNoQW5uZXhpbkxhbXJdCis7dmlzaWJpbGl0eS5hbHdheXNbXSA9IAorO3Zpc2liaWxpdHkuYW5vbnltb3VzW10gPSAKKzt2aXNpYmlsaXR5LmF1dGhlbnRpY2F0ZWRbXSA9ICAKKworCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9ob29rcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9ob29rcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwYzIxMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL2hvb2tzLnBocApAQCAtMCwwICsxLDc0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEhPT0tTLlBIUAorICogCisgKiBIb29rcyBwcm92aWRlIHRoZSBhYmlsaXR5LCBhcyB0aGUgbmFtZSBpbXBsaWVzLCB0byBob29rIGludG8gdmFyaW91cyBwYXJ0cyBvZiAKKyAqIHRoZSB2aWV3IHJlbmRlcmluZyBwcm9jZXNzIGFuZCBpbnNlcnQgY3VzdG9taXphdGlvbnMuIFRoZSBjb250ZW50cyBvZiB0aGVzZSAKKyAqIGZ1bmN0aW9ucyBhcmUgcnVuIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lICpFVkVSWSogdGltZSBhIHZpZXcgaXMgcmVuZGVyZWQsIGkuZS4KKyAqIHRoZSBjb250ZW50IG9mIHRoZSBob29rcyBpcyBub3QgYnkgZGVmYXVsdCB2aWV3LXNwZWNpZmljIGJ1dCByYXRoZXIgd2lsbCBiZSAKKyAqIGFwcGxpZWQgdG8gYWxsIHZpZXdzLiAoSG93ZXZlciwgdGhlcmUgaXMgbm90aGluZyB0aGF0IHByZXZlbnRzIGRldmVsb3BlcnMgZnJvbSAKKyAqIGluc2VydGluZyBjb25kaXRpb25hbCBsb2dpYyBpbnNpZGUgYSBob29rIHRoYXQgdGhlbiBjYXVzZXMgdmlldy1zcGVjaWZpYworICogdGhlbSB0byBleGhpYml0IHZpZXctc3BlY2lmaWMgYmVoYXZpb3IpLgorICogCisgKiBUYWtlIGEgbG9vayBhdCB0aGUgZG9jYmxvY2sgZGVzY3JpcHRpb25zIG9mIGVhY2ggaG9vayB0byBnZXQgYSBzZW5zZSBvZiB3aGVyZQorICogaW4gdGhlIHZpZXcgcmVuZGVyaW5nIHByb2Nlc3MgdGhlIGhvb2sgaXMgaW52b2tlZC4KKyAqIAorICogQGF1dGhvciBhaGFydAorICovCisKKy8qKgorICogaG9va19iZWZvcmVfaGVhZGVyCisgKiAKKyAqIFRoaXMgaG9vayBpcyBleGVjdXRlZCBiZWZvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBoZWFkZXIgZmlsZSBhcmUgcHJvY2Vzc2VkLgorICovCitmdW5jdGlvbiBob29rX2JlZm9yZV9oZWFkZXIoKSB7fSAKKworLyoqCisgKiBob29rX2JlZm9yZV92aWV3CisgKiAKKyAqIFRoaXMgaG9vayBpcyBleGVjdXRlZCBiZWZvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYWluIHZpZXcgYXJlIHByb2Nlc3NlZC4KKyAqLworZnVuY3Rpb24gaG9va19iZWZvcmVfdmlldygpIHsKKwlyZXF1aXJlX29uY2UoICdzY3JpcHRzL3dpZGdldHMvQnJlYWRjcnVtYnNXaWRnZXQucGhwJyApOworCQorCSRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisJLy8gSW5jbHVkZSBKYXZhU2NyaXB0IGZpbGVzIHRvIGJlIHNob3duIHdpdGggZXZlcnkgdmlldyBpbiB0aGlzIG1vZHVsZQorCUFwcDo6R2V0KCktPnJlc3BvbnNlLT5hZGRKYXZhc2NyaXB0KCRtb2R1bGUtPm1vZHVsZVN0YXRpYy4nL2pzL2pxdWVyeS0xLjQuMi1taW4uanMnKTsKKwlBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkSmF2YXNjcmlwdCgkbW9kdWxlLT5tb2R1bGVTdGF0aWMuJy9qcy9qY29ybmVyLmpxdWVyeS5qcycpOworCQorCS8vIEluY2x1ZGUgQ0FTLUJyb3dzZXIgZGVmYXVsdCBDU1Mgc3R5bGVzaGVldHMgdG8gYmUgc2hvd24gd2l0aCBldmVyeSB2aWV3IGluIHRoaXMgbW9kdWxlCisJQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmFkZFN0eWxlc2hlZXQoJG1vZHVsZS0+bW9kdWxlU3RhdGljLicvY3NzL2Nhcy1icm93c2VyLmNzcycpOworCUFwcDo6R2V0KCktPnJlc3BvbnNlLT5hZGRTdHlsZXNoZWV0KCRtb2R1bGUtPm1vZHVsZVN0YXRpYy4nL2Nzcy9kYXRhVGFibGVzLmNzcycpOworfQorCisvKioKKyAqIGhvb2tfYmVmb3JlX2Zvb3RlcgorICogCisgKiBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBjb250ZW50cyBvZiB0aGUgZm9vdGVyIGFyZSBwcm9jZXNzZWQKKyAqLworZnVuY3Rpb24gaG9va19iZWZvcmVfZm9vdGVyKCkge30KKworLyoqCisgKiBob29rX2JlZm9yZV9yZW5kZXIKKyAqIAorICogVGhpcyBob29rIGlzIGFmdGVyIGFsbCBvZiB0aGUgdmlldyBjb21wb25lbnRzIChoZWFkZXIsIHZpZXcsIGZvb3RlcikgaGF2ZSBiZWVuCisgKiBwcm9jZXNzZWQgYnV0IGJlZm9yZSB0aGUgcHJvY2Vzc2VkIHJlc3VsdHMgYXJlIHNlbnQgb3V0IGFjcm9zcyB0aGUgd2lyZSB0byB0aGUgCisgKiBicm93c2VyLgorICovCitmdW5jdGlvbiBob29rX2JlZm9yZV9zZW5kKCkge30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvYWxsVHlwZVNjcmlwdC5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL2FsbFR5cGVTY3JpcHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjZhNWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL2FsbFR5cGVTY3JpcHQucGhwCkBAIC0wLDAgKzEsNjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKK3JlcXVpcmVfb25jZShkaXJuYW1lKGRpcm5hbWUoX19GSUxFX18pKSAuICcvY2xhc3Nlcy9DYXNCcm93c2VyLmNsYXNzLnBocCcpOworCiskb3V0cHV0Rm9ybWF0ID0gJ2pzb24nOwkvLyBIYXJkLWNvZGVkIGZvciBub3cKKworLy8gR2V0IGNsaWVudCBoYW5kbGUKKyRjYiA9IG5ldyBDYXNCcm93c2VyKCk7CiskY2xpZW50ID0gJGNiLT5nZXRDbGllbnQoKTsKKworJHJlc3VsdHMgPSBhcnJheSgncmVzdWx0cyc9PmFycmF5KCkpOworCisvLyBHZXQgYWxsIHByb2R1Y3RzIGFuZCB0aGVpciB0eXBlcworJGFsbFByb2R1Y3RzID0gYXJyYXkoKTsKK2ZvcmVhY2goJGNsaWVudC0+Z2V0UHJvZHVjdFR5cGVzKCkgYXMgJHR5cGUpeworCWZvcmVhY2goJGNsaWVudC0+Z2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKCR0eXBlKSBhcyAkcHJvZHVjdCl7CisJCWFycmF5X3B1c2goJGFsbFByb2R1Y3RzLCBhcnJheSgncHJvZHVjdCc9PiRwcm9kdWN0LCAndHlwZU5hbWUnPT4kdHlwZS0+Z2V0TmFtZSgpKSk7CisJfQorfQorCisvLyBOYXJyb3cgZG93biB0aGUgZ2l2ZW4gcHJvZHVjdHMgdG8gdGhlIHJlcXVlc3RlZCBwYWdlIChpZiBwYWdlIGluZm8gaXMgZ2l2ZW4pCiskcmVxdWVzdGVkUHJvZHVjdHMgPSBhcnJheSgpOworaWYoaXNzZXQoJF9QT1NUWydQYWdlTnVtJ10pICYmIGlzc2V0KCRfUE9TVFsnUGFnZVNpemUnXSkpeworCSRwYWdlTnVtID0gaW50dmFsKCRfUE9TVFsnUGFnZU51bSddKTsKKwkkcGFnZVNpemUgPSBpbnR2YWwoJF9QT1NUWydQYWdlU2l6ZSddKTsKKwl0cnl7CisJCSRyZXF1ZXN0ZWRQcm9kdWN0cyA9IFV0aWxzOjpwYWdpbmF0ZSgkYWxsUHJvZHVjdHMsICRwYWdlTnVtLCAkcGFnZVNpemUpOworCX1jYXRjaChFeGNlcHRpb24gJGUpeworCQlVdGlsczo6cmVwb3J0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJG91dHB1dEZvcm1hdCk7CisJfQorCSRyZXN1bHRzWyd0b3RhbFBhZ2VzJ10gPSBjZWlsKGNvdW50KCRhbGxQcm9kdWN0cykgLyAkcGFnZVNpemUpOworfWVsc2V7CisJJHJlcXVlc3RlZFByb2R1Y3RzID0gJGFsbFByb2R1Y3RzOworfQorCisvLyBHZXQgbWV0YWRhdGEgYW5kIGZvcm1hdCByZXF1ZXN0ZWQgcHJvZHVjdHMKK3RyeXsKKwkkcmVzdWx0c1sncmVzdWx0cyddID0gVXRpbHM6OmZvcm1hdFJlc3VsdHMoJHJlcXVlc3RlZFByb2R1Y3RzKTsKK31jYXRjaChFeGNlcHRpb24gJGUpeworCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAkb3V0cHV0Rm9ybWF0KTsKK30KKworJHJlc3VsdHNbJ3RvdGFsUHJvZHVjdHMnXSA9IGNvdW50KCRhbGxQcm9kdWN0cyk7CisKK2VjaG8ganNvbl9lbmNvZGUoJHJlc3VsdHMpOworCis/PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvY3Jvc3NUeXBlUXVlcnlTY3JpcHQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc2NyaXB0cy9jcm9zc1R5cGVRdWVyeVNjcmlwdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyOGYyYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvY3Jvc3NUeXBlUXVlcnlTY3JpcHQucGhwCkBAIC0wLDAgKzEsMjQ2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CityZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkgLiAnL2NsYXNzZXMvQ2FzQnJvd3Nlci5jbGFzcy5waHAnKTsKKworZ2xvYmFsICRtZXNzYWdlczsKKyRtZXNzYWdlcyA9IGFycmF5KCk7CisKK2Z1bmN0aW9uIHNlYXJjaEJvb2xlYW5NZXRhZGF0YSgkcHRzLCAkYm9vbGVhbkNyaXRlcmlvbil7CisJZ2xvYmFsICRtZXNzYWdlczsKKwkkcmVzdWx0VHlwZXMgPSBhcnJheSgpOworCSR0ZXJtcyA9ICRib29sZWFuQ3JpdGVyaW9uLT5nZXRUZXJtcygpOworCWlmKCRib29sZWFuQ3JpdGVyaW9uLT5nZXRPcGVyYXRvcigpID09IENBU19GaWxlbWdyX0Jvb2xlYW5RdWVyeUNyaXRlcmlhOjokQU5EX09QKXsKKwkJJHJlc3VsdFR5cGVzID0gJHB0czsKKwkJZm9yZWFjaCgkdGVybXMgYXMgJHQpeworCQkJdHJ5eworCQkJCSRyZXN1bHRUeXBlcyA9IHNlYXJjaFR5cGVNZXRhZGF0YSgkcmVzdWx0VHlwZXMsICR0KTsKKwkJCQlhcnJheV9wdXNoKCRtZXNzYWdlcywgY291bnQoJHRlcm1SZXN1bHRzKSAuICIgdHlwZXMgcmV0dXJuZWQgdG8gYm9vbGVhbiB0eXBlIHNlYXJjaCIpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CisJCQkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBzZWFyY2hpbmcgdHlwZSBtZXRhZGF0YSBpbiBib29sZWFuIEFORCB0ZXJtICgiCisJCQkJCQkuICR0LT5nZXRFbGVtZW50TmFtZSgpIC4gIiA9ICIgLiAkdC0+Z2V0VmFsdWUoKSAuICIpOiAiIC4gJGUtPmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQlpZighY291bnQoJHJlc3VsdFR5cGVzKSl7CisJCQkJYXJyYXlfcHVzaCgkbWVzc2FnZXMsICJObyB0eXBlcyBmb3VuZCB0aGF0IG1hdGNoIHRoZSBib29sZWFuIEFORCBxdWVyeSIpOworCQkJCXJldHVybiBhcnJheSgpOworCQkJfQorCQl9CisJfWVsc2VpZigkYm9vbGVhbkNyaXRlcmlvbi0+Z2V0T3BlcmF0b3IoKSA9PSBDQVNfRmlsZW1ncl9Cb29sZWFuUXVlcnlDcml0ZXJpYTo6JE9SX09QKXsKKwkJZm9yZWFjaCgkdGVybXMgYXMgJHQpeworCQkJdHJ5eworCQkJCSR0ZXJtUmVzdWx0cyA9IHNlYXJjaFR5cGVNZXRhZGF0YSgkcHRzLCAkdCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwkJCQl0aHJvdyBuZXcgQ2FzQnJvd3NlckV4Y2VwdGlvbigiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHNlYXJjaGluZyB0eXBlIG1ldGFkYXRhIGluIGJvb2xlYW4gT1IgdGVybSAoIgorCQkJCQkJLiAkdC0+Z2V0RWxlbWVudE5hbWUoKSAuICIgPSAiIC4gJHQtPmdldFZhbHVlKCkgLiAiKTogIiAuICRlLT5nZXRNZXNzYWdlKCkpOworCQkJfQorCQkJJHJlc3VsdFR5cGVzICs9ICR0ZXJtUmVzdWx0czsJLy8gTm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0CisJCQlpZihjb3VudCgkcmVzdWx0VHlwZXMpID09IGNvdW50KCRwdHMpKXsKKwkJCQlhcnJheV9wdXNoKCRtZXNzYWdlcywgIkFsbCB0eXBlcyBtYXRjaCB0aGUgYm9vbGVhbiBPUiBxdWVyeSIpOworCQkJCXJldHVybiAkcHRzOworCQkJfQorCQl9CisJfWVsc2VpZigkYm9vbGVhbkNyaXRlcmlvbi0+Z2V0T3BlcmF0b3IoKSA9PSBDQVNfRmlsZW1ncl9Cb29sZWFuUXVlcnlDcml0ZXJpYTo6JE5PVF9PUCl7CisJCXRyeXsKKwkJCSR0ZXJtUmVzdWx0cyA9IHNlYXJjaFR5cGVNZXRhZGF0YSgkcHRzLCAkdGVybXNbMF0pOworCQl9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwkJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgc2VhcmNoaW5nIHR5cGUgbWV0YWRhdGEgaW4gYm9vbGVhbiBOT1QgdGVybTogIgorCQkJCQkuICRlLT5nZXRNZXNzYWdlKCkpOworCQl9CisJCSRyZXN1bHRUeXBlcyA9IGFycmF5X21lcmdlKGFycmF5X2RpZmYoJHB0cywgJHRlcm1SZXN1bHRzKSk7CisJfWVsc2V7CisJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJBIEJvb2xlYW5RdWVyeUNyaXRlcmlhIG9iamVjdCBoYXMgYW4gaW52YWxpZCBvcGVyYXRvciIpOworCX0KKwlhcnJheV9wdXNoKCRtZXNzYWdlcywgY291bnQoJHJlc3VsdFR5cGVzKSAuICIgdHlwZXMgZm91bmQgdGhhdCBtYXRjaCB0aGUgYm9vbGVhbiBxdWVyeSIpOworCXJldHVybiAkcmVzdWx0VHlwZXM7Cit9CisKK2Z1bmN0aW9uIHNlYXJjaFRlcm1NZXRhZGF0YSgkcHRzLCAkdGVybUNyaXRlcmlvbil7CisJZ2xvYmFsICRtZXNzYWdlczsKKwkka2V5ID0gJHRlcm1Dcml0ZXJpb24tPmdldEVsZW1lbnROYW1lKCk7CisJJHZhbHVlID0gJHRlcm1Dcml0ZXJpb24tPmdldFZhbHVlKCk7CisJYXJyYXlfcHVzaCgkbWVzc2FnZXMsICJTZWFyY2hpbmcgdHlwZSBtZXRhZGF0YSBmb3IgIiAuICRrZXkgLiAiID0gIiAuICR2YWx1ZSAuICIgaW4gIiAuIGNvdW50KCRwdHMpIC4gIiB0eXBlcyIpOworCSRyZXN1bHRUeXBlcyA9IGFycmF5KCk7CisJZm9yZWFjaCgkcHRzIGFzICRwdCl7CisJCSRwdE1ldCA9ICRwdC0+Z2V0VHlwZU1ldGFkYXRhKCk7CisJCWlmKGFycmF5X2tleV9leGlzdHMoJGtleSwgJHB0TWV0LT50b0Fzc29jQXJyYXkoKSkpeworCQkJaWYoJHB0TWV0LT5pc011bHRpVmFsdWVkKCRrZXkpKXsKKwkJCQkkcHRNZXRWYWx1ZXMgPSAkcHRNZXQtPmdldEFsbE1ldGFkYXRhKCRrZXkpOworCQkJCWZvcigkaSA9IDA7ICRpIDwgY291bnQoJHB0TWV0VmFsdWVzKTsgJGkrKyl7CisJCQkJCS8vYXJyYXlfcHVzaCgkbWVzc2FnZXMsICJDb21wYXJpbmcgdHlwZSAiIC4gJHB0LT5nZXROYW1lKCkgLiAiIGtleSAiIC4gJGtleSAuICIgdmFsdWU6ICIgLiAkcHRNZXRWYWx1ZXNbJGldKTsKKwkJCQkJaWYoJHB0TWV0VmFsdWVzWyRpXSA9PSAkdmFsdWUpeworCQkJCQkJYXJyYXlfcHVzaCgkcmVzdWx0VHlwZXMsICRwdCk7CisJCQkJCQkkaSA9IGNvdW50KCRwdE1ldFZhbHVlcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9ZWxzZWlmKCRwdE1ldC0+Z2V0TWV0YWRhdGEoJGtleSkgPT0gJHZhbHVlKXsKKwkJCQlhcnJheV9wdXNoKCRyZXN1bHRUeXBlcywgJHB0KTsKKwkJCX0KKwkJfQorCX0KKwlhcnJheV9wdXNoKCRtZXNzYWdlcywgY291bnQoJHJlc3VsdFR5cGVzKSAuICIgdHlwZXMgZm91bmQgdGhhdCBtYXRjaCB0aGUgdGVybSIpOworCXJldHVybiAkcmVzdWx0VHlwZXM7Cit9CisKK2Z1bmN0aW9uIHNlYXJjaFR5cGVNZXRhZGF0YSgkcHRzLCAkY3JpdGVyaW9uKXsKKwlpZigkY3JpdGVyaW9uID09IE5VTEwpeworCQl0aHJvdyBuZXcgQ2FzQnJvd3NlckV4Y2VwdGlvbigiQSBudWxsIGNyaXRlcmlvbiB3YXMgZ2l2ZW4gdG8gc2VhcmNoIGZvciB0eXBlIG1ldGFkYXRhIik7CisJfQorCWlmKCRwdHMgPT0gTlVMTCl7CisJCXRocm93IG5ldyBDYXNCcm93c2VyRXhjZXB0aW9uKCJBIG51bGwgbGlzdCBvZiBwcm9kdWN0IHR5cGVzIHdhcyBnaXZlbiB0byBzZWFyY2ggZm9yIHR5cGUgbWV0YWRhdGEiKTsKKwl9CisJaWYoIWNvdW50KCRwdHMpKXsKKwkJdGhyb3cgbmV3IENhc0Jyb3dzZXJFeGNlcHRpb24oIkFuIGVtcHR5IGxpc3Qgb2YgcHJvZHVjdCB0eXBlcyB3YXMgZ2l2ZW4gdG8gc2VhcmNoIGZvciB0eXBlIG1ldGFkYXRhIik7CisJfQorCWlmKCRjcml0ZXJpb24gaW5zdGFuY2VvZiBDQVNfRmlsZW1ncl9UZXJtUXVlcnlDcml0ZXJpYSl7CisJCXJldHVybiBzZWFyY2hUZXJtTWV0YWRhdGEoJHB0cywgJGNyaXRlcmlvbik7CisJfWVsc2VpZigkY3JpdGVyaW9uIGluc3RhbmNlb2YgQ0FTX0ZpbGVtZ3JfUmFuZ2VRdWVyeUNyaXRlcmlhKXsKKwkJcmV0dXJuIGFycmF5KCk7CS8vIE5vdCB5ZXQgc3VwcG9ydGVkCisJfWVsc2VpZigkY3JpdGVyaW9uIGluc3RhbmNlb2YgQ0FTX0ZpbGVtZ3JfQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpeworCQlyZXR1cm4gc2VhcmNoQm9vbGVhbk1ldGFkYXRhKCRwdHMsICRjcml0ZXJpb24pOworCX1lbHNleworCQl0aHJvdyBuZXcgQ2FzQnJvd3NlckV4Y2VwdGlvbigiQW4gdW5rbm93biBxdWVyeSBjcml0ZXJpYSB0eXBlIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBzZWFyY2ggcHJvZHVjdCB0eXBlIG1ldGFkYXRhIik7CisJfQorfQorCisKKworCiskb3V0cHV0Rm9ybWF0ID0gJ2pzb24nOwkvLyBIYXJkLWNvZGVkIGZvciBub3cKKworLy8gR2V0IGNsaWVudCBoYW5kbGUKKyRjYiA9IG5ldyBDYXNCcm93c2VyKCk7CiskY2xpZW50ID0gJGNiLT5nZXRDbGllbnQoKTsKKworJHJlc3VsdHMgPSBhcnJheSgncmVzdWx0cyc9PmFycmF5KCkpOworCisvLyBDZWF0ZSBhbiBhcnJheSBvZiBQcm9kdWN0VHlwZXMgdG8gYmUgcXVlcmllZAordHJ5eworCWlmKCFpc3NldCgkX1BPU1RbJ1R5cGVzJ10pKXsKKwkJVXRpbHM6OnJlcG9ydEVycm9yKCJQT1NUIGRvZXMgbm90IGNvbnRhaW4gJ1R5cGVzJyBzdWItYXJyYXkiLCAkb3V0cHV0Rm9ybWF0KTsKKwl9CisJaWYoY291bnQoJF9QT1NUWydUeXBlcyddKSA9PSAwKXsKKwkJVXRpbHM6OnJlcG9ydEVycm9yKCJObyBwcm9kdWN0IHR5cGVzIHdlcmUgc3BlY2lmaWVkIGluIFBPU1QiLCAkb3V0cHV0Rm9ybWF0KTsKKwl9CisJJHF1ZXJ5VHlwZXMgPSBhcnJheSgpOworCSRhbGxUeXBlcyA9ICRjbGllbnQtPmdldFByb2R1Y3RUeXBlcygpOworCWlmKCRfUE9TVFsnVHlwZXMnXVswXSA9PSAnKicpeworCQkkcXVlcnlUeXBlcyA9ICRhbGxUeXBlczsKKwl9ZWxzZXsKKwkJJGFsbFR5cGVOYW1lcyA9IGFycmF5X21hcChjcmVhdGVfZnVuY3Rpb24oJyR0JywgJ3JldHVybiAkdC0+Z2V0TmFtZSgpOycpLCAkYWxsVHlwZXMpOworCQlmb3JlYWNoKCRfUE9TVFsnVHlwZXMnXSBhcyAkdHlwZSl7CisJCQlpZighaW5fYXJyYXkoJHR5cGUsICRhbGxUeXBlTmFtZXMpKXsKKwkJCQkkZXJyU3RyID0gIkVycm9yOiBUaGUgdHlwZSAiIC4gJHR5cGUgLiAiIGlzIG5vdCB1c2VkIGluIHRoZSByZXBvc2l0b3J5LiAgUGxlYXNlIHVzZSBvbmUgb2Y6ICI7CisJCQkJJGVyclN0ciAuPSAkYWxsVHlwZU5hbWVzWzBdOworCQkJCWZvcigkaSA9IDE7ICRpIDwgY291bnQoJGFsbFR5cGVOYW1lcyk7ICRpKyspeworCQkJCQkkZXJyU3RyIC49ICIsICIgLiAkYWxsVHlwZU5hbWVzWyRpXTsKKwkJCQl9CisJCQkJVXRpbHM6OnJlcG9ydEVycm9yKCRlcnJTdHIsICRvdXRwdXRGb3JtYXQpOworCQkJfQorCQkJYXJyYXlfcHVzaCgkcXVlcnlUeXBlcywgJGNsaWVudC0+Z2V0UHJvZHVjdFR5cGVCeU5hbWUoJHR5cGUpKTsKKwkJfQorCQlpZighY291bnQoJHF1ZXJ5VHlwZXMpKXsKKwkJCVV0aWxzOjpyZXBvcnRFcnJvcigiTm8gUHJvZHVjdFR5cGVzIHdlcmUgZ2l2ZW4gdG8gcXVlcnkiLCAkb3V0cHV0Rm9ybWF0KTsKKwkJfQorCX0KK31jYXRjaChFeGNlcHRpb24gJGUpeworCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAkb3V0cHV0Rm9ybWF0KTsKK30KKworLy8gQ3JlYXRlIHRoZSB0cmVlIG9mIGNyaXRlcmlhIG9iamVjdHMgdGhhdCBkZWZpbmUgdGhlIHF1ZXJ5LiAgVGhlIHRyZWUgcm9vdCBpcyByZXR1cm5lZC4KK2lmKCFpc3NldCgkX1BPU1RbJ0NyaXRlcmlhJ10pKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoIlBPU1QgZG9lcyBub3QgY29udGFpbiAnQ3JpdGVyaWEnIHN1Yi1hcnJheSIsICRvdXRwdXRGb3JtYXQpOworfQoraWYoIWNvdW50KCRfUE9TVFsnQ3JpdGVyaWEnXSkpeworCVV0aWxzOjpyZXBvcnRFcnJvcigiUE9TVCBzdWItYXJyYXkgJ0NyaXRlcmlhJyBjb250YWlucyBubyBjcml0ZXJpYSIsICRvdXRwdXRGb3JtYXQpOworfQorJHJvb3RJbmRleCA9IChpc3NldCgkX1BPU1RbJ1Jvb3RJbmRleCddKSkKKwkJCT8gaW50dmFsKCRfUE9TVFsnUm9vdEluZGV4J10pCisJCQk6IDA7Cit0cnl7CisJJGNyaXRlcmlhVHJlZSA9IFV0aWxzOjpjcmVhdGVDcml0ZXJpYVRyZWUoJHJvb3RJbmRleCwgJHF1ZXJ5VHlwZXMsIG51bGwpOworfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CisJVXRpbHM6OnJlcG9ydEVycm9yKCRlLT5nZXRNZXNzYWdlKCksICRvdXRwdXRGb3JtYXQpOworfQorCisvLyBTZWFyY2ggaW5zaWRlIG9mIHByb2R1Y3QgdHlwZSBtZXRhZGF0YSBmb3IgcmVzdWx0cyB0byBmdXJ0aGVyIHJlZmluZSBzZWFyY2gKKy8vIE5PVEU6IFRoaXMgaXMgYWxsIGN1cnJlbnRseSBhIGRpcnR5IGhhY2shICBUaGlzIG5lZWRzIG1ham9yIHJlZmluZW1lbnQhCiskYWxsTWF0Y2hpbmdQcm9kdWN0cyA9IGFycmF5KCk7CiskdHlwZXNCeU5hbWUgPSBhcnJheSgpOworZm9yZWFjaCgkcXVlcnlUeXBlcyBhcyAkdCl7CisJJHR5cGVzQnlOYW1lWyR0LT5nZXROYW1lKCldID0gJHQ7Cit9Cit0cnl7CisJJG1hdGNoaW5nUFRzID0gc2VhcmNoVHlwZU1ldGFkYXRhKCRxdWVyeVR5cGVzLCAkY3JpdGVyaWFUcmVlKTsKK31jYXRjaChFeGNlcHRpb24gJGUpeworCVV0aWxzOjpyZXBvcnRFcnJvcigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHNlYXJjaGluZyB0eXBlIG1ldGFkYXRhOiAiIC4gJGUtPmdldE1lc3NhZ2UoKSwgJG91dHB1dEZvcm1hdCk7Cit9Citmb3JlYWNoKCRtYXRjaGluZ1BUcyBhcyAkbWF0Y2hpbmdUeXBlKXsKKwlhcnJheV9zcGxpY2UoJHF1ZXJ5VHlwZXMsIGFycmF5X3NlYXJjaCgkbWF0Y2hpbmdUeXBlLCAkcXVlcnlUeXBlcyksIDEpOwkvLyBSZW1vdmUgdHlwZXMgdGhhdCBtYXRjaCBmcm9tIHF1ZXJ5CisJZm9yZWFjaCgkY2xpZW50LT5nZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUoJG1hdGNoaW5nVHlwZSkgYXMgJHApewkvLyBBZGQgYWxsIHByb2R1Y3RzIG9mIG1hdGNoaW5nIHR5cGVzCisJCWFycmF5X3B1c2goJGFsbE1hdGNoaW5nUHJvZHVjdHMsIGFycmF5KCdwcm9kdWN0Jz0+JHAsICd0eXBlTmFtZSc9PiRtYXRjaGluZ1R5cGUtPmdldE5hbWUoKSkpOworCX0KK30KKworLy8gQWRkIGNyaXRlcmlhIHRvIHF1ZXJ5IG9iamVjdAorJHF1ZXJ5ID0gbmV3IENBU19GaWxlbWdyX1F1ZXJ5KCk7CiskcXVlcnktPmFkZENyaXRlcmlvbigkY3JpdGVyaWFUcmVlKTsKKworLy8gUGVyZm9ybSB0aGUgcXVlcnkgYW5kIGNvbGxlY3QgcmVzdWx0cwordHJ5eworCWZvcmVhY2goJHF1ZXJ5VHlwZXMgYXMgJHR5cGUpeworCQkkcXVlcnlSZXN1bHRzT2ZUeXBlID0gJGNsaWVudC0+cXVlcnkoJHF1ZXJ5LCAkdHlwZSk7CisJCWlmKGNvdW50KCRxdWVyeVJlc3VsdHNPZlR5cGUpID4gMCl7CisJCQlmb3JlYWNoKCRxdWVyeVJlc3VsdHNPZlR5cGUgYXMgJG1hdGNoaW5nUHJvZHVjdCl7CisJCQkJYXJyYXlfcHVzaCgkYWxsTWF0Y2hpbmdQcm9kdWN0cywgYXJyYXkoJ3Byb2R1Y3QnPT4kbWF0Y2hpbmdQcm9kdWN0LCAndHlwZU5hbWUnPT4kdHlwZS0+Z2V0TmFtZSgpKSk7CisJCQl9CisJCX0KKwl9Cit9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJG91dHB1dEZvcm1hdCk7Cit9CisKKy8vIE5hcnJvdyBkb3duIHRoZSBnaXZlbiBwcm9kdWN0cyB0byB0aGUgcmVxdWVzdGVkIHBhZ2UgKGlmIHBhZ2UgaW5mbyBpcyBnaXZlbikKKyRyZXF1ZXN0ZWRQcm9kdWN0cyA9IGFycmF5KCk7CitpZihpc3NldCgkX1BPU1RbJ1BhZ2VOdW0nXSkgJiYgaXNzZXQoJF9QT1NUWydQYWdlU2l6ZSddKSl7CisJJHBhZ2VOdW0gPSBpbnR2YWwoJF9QT1NUWydQYWdlTnVtJ10pOworCSRwYWdlU2l6ZSA9IGludHZhbCgkX1BPU1RbJ1BhZ2VTaXplJ10pOworCXRyeXsKKwkJJHJlcXVlc3RlZFByb2R1Y3RzID0gVXRpbHM6OnBhZ2luYXRlKCRhbGxNYXRjaGluZ1Byb2R1Y3RzLCAkcGFnZU51bSwgJHBhZ2VTaXplKTsKKwl9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwkJVXRpbHM6OnJlcG9ydEVycm9yKCRlLT5nZXRNZXNzYWdlKCksICRvdXRwdXRGb3JtYXQpOworCX0KKwkkcmVzdWx0c1sndG90YWxQYWdlcyddID0gY2VpbChjb3VudCgkYWxsTWF0Y2hpbmdQcm9kdWN0cykgLyAkcGFnZVNpemUpOworfWVsc2V7CisJJHJlcXVlc3RlZFByb2R1Y3RzID0gJGFsbE1hdGNoaW5nUHJvZHVjdHM7Cit9CisKKy8vIEdldCBtZXRhZGF0YSBhbmQgZm9ybWF0IHJlcXVlc3RlZCBwcm9kdWN0cwordHJ5eworCSRyZXN1bHRzWydyZXN1bHRzJ10gPSBVdGlsczo6Zm9ybWF0UmVzdWx0cygkcmVxdWVzdGVkUHJvZHVjdHMpOworfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CisJVXRpbHM6OnJlcG9ydEVycm9yKCRlLT5nZXRNZXNzYWdlKCksICRvdXRwdXRGb3JtYXQpOworfQorCQorJHJlc3VsdHNbJ3RvdGFsUHJvZHVjdHMnXSA9IGNvdW50KCRhbGxNYXRjaGluZ1Byb2R1Y3RzKTsKKworJHJlc3VsdHNbJ21lc3NhZ2VzJ10gPSAkbWVzc2FnZXM7CisKK2VjaG8ganNvbl9lbmNvZGUoJHJlc3VsdHMpOworCis/PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvcGFnZVNjcmlwdC5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3BhZ2VTY3JpcHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNGFhZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3BhZ2VTY3JpcHQucGhwCkBAIC0wLDAgKzEsMTAyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CityZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkgLiAnL2NsYXNzZXMvQ2FzQnJvd3Nlci5jbGFzcy5waHAnKTsKKworLy8gRXh0cmFjdCBkZXNpcmVkIG91dHB1dCBmb3JtYXQgZnJvbSBQT1NUCitpZihpc3NldCgkX1BPU1RbJ091dHB1dEZvcm1hdCddKSl7CisJdHJ5eworCQkkb3V0cHV0Rm9ybWF0ID0gVXRpbHM6OmdldFJlcXVlc3RlZFJldHVyblR5cGUoJF9QT1NUWydPdXRwdXRGb3JtYXQnXSk7CisJfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CisJCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAnaHRtbCcpOworCX0KK31lbHNleworCSRvdXRwdXRGb3JtYXQgPSAnaHRtbCc7Cit9CisKKy8vIEdldCBjbGllbnQgaGFuZGxlCiskY2IgPSBuZXcgQ2FzQnJvd3NlcigpOworJGNsaWVudCA9ICRjYi0+Z2V0Q2xpZW50KCk7CisKKy8vIEV4dHJhY3QgUHJvZHVjdFR5cGUgZnJvbSBQT1NUCitpZighaXNzZXQoJF9QT1NUWydUeXBlJ10pKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoIlBPU1QgZG9lcyBub3QgY29udGFpbiAnVHlwZScgUHJvZHVjdFR5cGUiLCAkb3V0cHV0Rm9ybWF0KTsKK30KKyR0eXBlTmFtZSA9ICRfUE9TVFsnVHlwZSddOwordHJ5eworCSRhbGxUeXBlcyA9ICRjbGllbnQtPmdldFByb2R1Y3RUeXBlcygpOworCSRhbGxUeXBlTmFtZXMgPSBhcnJheV9tYXAoY3JlYXRlX2Z1bmN0aW9uKCckdCcsICdyZXR1cm4gJHQtPmdldE5hbWUoKTsnKSwgJGFsbFR5cGVzKTsKKwlpZighaW5fYXJyYXkoJHR5cGVOYW1lLCAkYWxsVHlwZU5hbWVzKSl7CisJCSRlcnJTdHIgPSAiVGhlIHR5cGUgIiAuICR0eXBlTmFtZSAuICIgaXMgbm90IHVzZWQgaW4gdGhlIHJlcG9zaXRvcnkuICBQbGVhc2UgdXNlIG9uZSBvZjogIjsKKwkJZm9yKCRpID0gMDsgJGkgPCBjb3VudCgkYWxsVHlwZU5hbWVzKSAtIDE7ICRpKyspeworCQkJJGVyclN0ciAuPSAkYWxsVHlwZU5hbWVzW2ldIC4gIiwgIjsKKwkJfQorCQkkZXJyU3RyIC49ICRhbGxUeXBlTmFtZXNbY291bnQoJGFsbFR5cGVOYW1lcykgLSAxXTsKKwkJVXRpbHM6OnJlcG9ydEVycm9yKCRlcnJTdHIsICRvdXRwdXRGb3JtYXQpOworCX0KKwkkdHlwZSA9ICRjbGllbnQtPmdldFByb2R1Y3RUeXBlQnlOYW1lKCR0eXBlTmFtZSk7Cit9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJG91dHB1dEZvcm1hdCk7Cit9CisKKy8vIEV4dHJhY3QgcGFnZSBudW1iZXIgZnJvbSBQT1NUCitpZighaXNzZXQoJF9QT1NUWydQYWdlTnVtJ10pKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoIlBPU1QgZG9lcyBub3QgY29udGFpbiAnUGFnZU51bSciLCAkb3V0cHV0Rm9ybWF0KTsKK30KKyRwYWdlTnVtID0gaW50dmFsKCRfUE9TVFsnUGFnZU51bSddKTsKKworLy8gR2V0IHRoZSByZXF1ZXN0ZWQgcGFnZQordHJ5eworCSRwYWdlID0gVXRpbHM6OmdldFBhZ2UoJHR5cGUsICRwYWdlTnVtKTsKK31jYXRjaChFeGNlcHRpb24gJGUpeworCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAkb3V0cHV0Rm9ybWF0KTsKK30KKworLy8gR2V0IHRoZSBwcm9kdWN0cyBmcm9tIHRoZSByZXF1ZXN0ZWQgcGFnZSAtLSB3aGF0IHdlJ3JlIHJlYWxseSBhZnRlcgorJHBhZ2VQcm9kdWN0cyA9IGFycmF5KCk7Citmb3JlYWNoKCRwYWdlLT5nZXRQYWdlUHJvZHVjdHMoKSBhcyAkcCl7CisJYXJyYXlfcHVzaCgkcGFnZVByb2R1Y3RzLCBhcnJheSgncHJvZHVjdCc9PiRwKSk7Cit9CisKKy8vIEZvcm1hdCByZXN1bHRzCitpZigkb3V0cHV0Rm9ybWF0ID09ICdodG1sJyl7CisJJHBheWxvYWQgPSAnPHVsIGNsYXNzPSJwcF9wcm9kdWN0TGlzdCIgaWQ9InByb2R1Y3RfbGlzdCI+JzsKKwlmb3JlYWNoKCRwYWdlUHJvZHVjdHMgYXMgJHApeworCQkkcGF5bG9hZCAuPSAnPGxpPjxhIGhyZWY9IicgLiAkbW9kdWxlLT5tb2R1bGVSb290IC4gJy9wcm9kdWN0LycgLiAkcFsncHJvZHVjdCddLT5nZXRJZCgpIC4gJyI+JzsKKwkJJHBheWxvYWQgLj0gdXJsRGVjb2RlKCRwWydwcm9kdWN0J10tPmdldE5hbWUoKSkgLiAnPC9hPjwvbGk+JzsKKwl9CisJJHBheWxvYWQgLj0gIjwvdWw+XG4iOworCSRwYXlsb2FkIC49ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0idG90YWxfcGFnZXMiIHZhbHVlPSInIC4gJHBhZ2UtPmdldFRvdGFsUGFnZXMoKSAuICciPic7CisJJHBheWxvYWQgLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJwYWdlX3NpemUiIHZhbHVlPSInIC4gJHBhZ2UtPmdldFBhZ2VTaXplKCkgLiAnIj4nOworfWVsc2VpZiAoJG91dHB1dEZvcm1hdCA9PSAnanNvbicpIHsKKwkkcGF5bG9hZCA9IGFycmF5KCk7CisJdHJ5eworCQkkcGF5bG9hZFsncmVzdWx0cyddID0gVXRpbHM6OmZvcm1hdFJlc3VsdHMoJHBhZ2VQcm9kdWN0cyk7CisJCSRwYXlsb2FkWyd0b3RhbFByb2R1Y3RzJ10gPSAkY2xpZW50LT5nZXROdW1Qcm9kdWN0cygkdHlwZSk7CisJfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CisJCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAkb3V0cHV0Rm9ybWF0KTsKKwl9CisJJHBheWxvYWRbJ3RvdGFsUGFnZXMnXSA9ICRwYWdlLT5nZXRUb3RhbFBhZ2VzKCk7CisJJHBheWxvYWRbJ3BhZ2VTaXplJ10gPSAkcGFnZS0+Z2V0UGFnZVNpemUoKTsKKwkkcGF5bG9hZCA9IGpzb25fZW5jb2RlKCRwYXlsb2FkKTsKK30KKworZWNobyAkcGF5bG9hZDsKKworPz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3Byb2R1Y3RUeXBlRmlsdGVyLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvcHJvZHVjdFR5cGVGaWx0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjRjZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3Byb2R1Y3RUeXBlRmlsdGVyLnBocApAQCAtMCwwICsxLDcwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqCisgKiAgIFBST0RVQ1QtVFlQRSBGSUxURVIKKyAqICAgCisgKiAgIEhUVFAgTWV0aG9kOiBHRVQKKyAqICAgSW5wdXQ6CisgKiAgICAgLSBrZXkgICAgKHN0cmluZykgYSBQcm9kdWN0VHlwZSBtZXRhZGF0YSBrZXkgdG8gc2VhcmNoIG9uCisgKiAgICAgLSB2YWx1ZSAgKHN0cmluZykgdGhlIHZhbHVlIHRvIHVzZSB3aGVuIGRldGVybWluaW5nIG1hdGNoZXMKKyAqICAgT3V0cHV0OgorICogICAgIC0ganNvbiAgIChkZWZhdWx0KSBhIGpzb24gYXJyYXkgcmVwcmVzZW50aW5nIGFsbCBtYXRjaGluZyBwcm9kdWN0IHR5cGVzCisgKiAgICAgICAgICAgICAgd2l0aCB0aGVpciBkZWZpbmVkIG1ldGFkYXRhCisgKiAgICAgICAgICAgICAgCisgKi8KKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CityZXF1aXJlX29uY2UoICRtb2R1bGUtPm1vZHVsZVBhdGggLiAiL2NsYXNzZXMvQ2FzQnJvd3Nlci5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZSggJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvc2NyaXB0cy93aWRnZXRzL1Byb2R1Y3RUeXBlTGlzdFdpZGdldC5waHAiKTsKKworLy8gR2V0IGEgQ2FzLUJyb3dzZXIgWE1ML1JQQyBDbGllbnQKKyRicm93c2VyID0gbmV3IENhc0Jyb3dzZXIoKTsKKyRjbGllbnQgID0gJGJyb3dzZXItPmdldENsaWVudCgpOworCisvLyBHZXQgYSBsaXN0IG9mIHRoZSBwcm9kdWN0IHR5cGVzIG1hbmFnZWQgYnkgdGhpcyBzZXJ2ZXIKKyRwdHlwZXMgPSAkY2xpZW50LT5nZXRQcm9kdWN0VHlwZXMoKTsKKworLy8gR2V0IHRoZSBtZXRhZGF0YSBrZXkvdmFsIHBhaXIgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBuZWVkbGUKKyRtZXRLZXkgPSB1cmxkZWNvZGUoJF9HRVRbJ2tleSddKTsKKyRuZWVkbGUgPSB1cmxkZWNvZGUoJF9HRVRbJ3ZhbHVlJ10pOworCiskcHJvZHVjdFR5cGVzID0gYXJyYXkoKTsKK2ZvcmVhY2ggKCRwdHlwZXMgYXMgJHB0KSB7CisJJHB0QXJyYXkgPSAkcHQtPnRvQXNzb2NBcnJheSgpOworCQorCS8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBtZXQga2V5IHZhbHVlIG1hdGNoZXMgZGVzaXJlZCB2YWx1ZQorCWlmICgkbmVlZGxlID09ICcqJyB8fCAoaXNzZXQoJHB0QXJyYXlbJ3R5cGVNZXRhZGF0YSddWyRtZXRLZXldKSAKKwkJJiYgJHB0QXJyYXlbJ3R5cGVNZXRhZGF0YSddWyRtZXRLZXldWzBdID09ICRuZWVkbGUpKSB7CisKKwkJJG1lcmdlZCA9IGFycmF5X21lcmdlKCRwdEFycmF5Wyd0eXBlTWV0YWRhdGEnXSxhcnJheSgKKwkJCSJuYW1lIiA9PiBhcnJheSgkcHRBcnJheVtBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wdF9uYW1lX2tleSddXSksCisJCQkiZGVzY3JpcHRpb24iID0+IGFycmF5KCRwdEFycmF5W0FwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3B0X2Rlc2Nfa2V5J11dKSwKKwkJCSJpZCIgICA9PiBhcnJheSgkcHRBcnJheVtBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wdF9pZF9rZXknXV0pKSk7CisJCQorCQkkcHJvZHVjdFR5cGVzW10gPSAkbWVyZ2VkOworCX0JCit9CisKKy8vIEZvcm1hdCBvdXRwdXQgYXMganNvbgorJGpzb24gPSBqc29uX2VuY29kZSgkcHJvZHVjdFR5cGVzKTsKKworLy8gT3V0cHV0IHRoZSBqc29uIHJlc3VsdAoraGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKK2VjaG8gJGpzb247CisKKy8vIFdlJ3JlIGRvbmUuCitleGl0KCk7CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3F1ZXJ5U2NyaXB0LnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvcXVlcnlTY3JpcHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjY5OTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3F1ZXJ5U2NyaXB0LnBocApAQCAtMCwwICsxLDE1NSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworcmVxdWlyZV9vbmNlKGRpcm5hbWUoZGlybmFtZShfX0ZJTEVfXykpIC4gJy9jbGFzc2VzL0Nhc0Jyb3dzZXIuY2xhc3MucGhwJyk7CisKKy8vIEV4dHJhY3QgZGVzaXJlZCBvdXRwdXQgZm9ybWF0IGZyb20gUE9TVAoraWYoaXNzZXQoJF9QT1NUWydPdXRwdXRGb3JtYXQnXSkpeworCXRyeXsKKwkJJG91dHB1dEZvcm1hdCA9IFV0aWxzOjpnZXRSZXF1ZXN0ZWRSZXR1cm5UeXBlKCRfUE9TVFsnT3V0cHV0Rm9ybWF0J10pOworCX1jYXRjaChFeGNlcHRpb24gJGUpeworCQlVdGlsczo6cmVwb3J0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJ2h0bWwnKTsKKwl9Cit9ZWxzZXsKKwkkb3V0cHV0Rm9ybWF0ID0gJ2h0bWwnOworfQorCisvLyBHZXQgY2xpZW50IGhhbmRsZQorJGNiID0gbmV3IENhc0Jyb3dzZXIoKTsKKyRjbGllbnQgPSAkY2ItPmdldENsaWVudCgpOworCisvLyBDZWF0ZSBhbiBhcnJheSBvZiBQcm9kdWN0VHlwZXMgdG8gYmUgcXVlcmllZAordHJ5eworCWlmKCFpc3NldCgkX1BPU1RbJ1R5cGVzJ10pKXsKKwkJVXRpbHM6OnJlcG9ydEVycm9yKCJQT1NUIGRvZXMgbm90IGNvbnRhaW4gJ1R5cGVzJyBzdWItYXJyYXkiLCAkb3V0cHV0Rm9ybWF0KTsKKwl9CisJaWYoY291bnQoJF9QT1NUWydUeXBlcyddKSA9PSAwKXsKKwkJVXRpbHM6OnJlcG9ydEVycm9yKCJObyBwcm9kdWN0IHR5cGVzIHdlcmUgc3BlY2lmaWVkIGluIFBPU1QiLCAkb3V0cHV0Rm9ybWF0KTsKKwl9CisJJHF1ZXJ5VHlwZXMgPSBhcnJheSgpOworCSRhbGxUeXBlcyA9ICRjbGllbnQtPmdldFByb2R1Y3RUeXBlcygpOworCWlmKCRfUE9TVFsnVHlwZXMnXVswXSA9PSAnKicpeworCQkkcXVlcnlUeXBlcyA9ICRhbGxUeXBlczsKKwl9ZWxzZXsKKwkJJGFsbFR5cGVOYW1lcyA9IGFycmF5X21hcChjcmVhdGVfZnVuY3Rpb24oJyR0JywgJ3JldHVybiAkdC0+Z2V0TmFtZSgpOycpLCAkYWxsVHlwZXMpOworCQlmb3JlYWNoKCRfUE9TVFsnVHlwZXMnXSBhcyAkdHlwZSl7CisJCQlpZighaW5fYXJyYXkoJHR5cGUsICRhbGxUeXBlTmFtZXMpKXsKKwkJCQkkZXJyU3RyID0gIkVycm9yOiBUaGUgdHlwZSAiIC4gJHR5cGUgLiAiIGlzIG5vdCB1c2VkIGluIHRoZSByZXBvc2l0b3J5LiAgUGxlYXNlIHVzZSBvbmUgb2Y6ICI7CisJCQkJJGVyclN0ciAuPSAkYWxsVHlwZU5hbWVzWzBdOworCQkJCWZvcigkaSA9IDE7ICRpIDwgY291bnQoJGFsbFR5cGVOYW1lcyk7ICRpKyspeworCQkJCQkkZXJyU3RyIC49ICIsICIgLiAkYWxsVHlwZU5hbWVzWyRpXTsKKwkJCQl9CisJCQkJVXRpbHM6OnJlcG9ydEVycm9yKCRlcnJTdHIsICRvdXRwdXRGb3JtYXQpOworCQkJfQorCQkJYXJyYXlfcHVzaCgkcXVlcnlUeXBlcywgJGNsaWVudC0+Z2V0UHJvZHVjdFR5cGVCeU5hbWUoJHR5cGUpKTsKKwkJfQorCQlpZighY291bnQoJHF1ZXJ5VHlwZXMpKXsKKwkJCVV0aWxzOjpyZXBvcnRFcnJvcigiTm8gUHJvZHVjdFR5cGVzIHdlcmUgZ2l2ZW4gdG8gcXVlcnkiLCAkb3V0cHV0Rm9ybWF0KTsKKwkJfQorCX0KK31jYXRjaChFeGNlcHRpb24gJGUpeworCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAkb3V0cHV0Rm9ybWF0KTsKK30KKworLy8gQ2hlY2sgaWYgcmVzdWx0cyBhcmUgZGVzaXJlZCBpbiBhIFByb2R1Y3RQYWdlIGFuZCB3aGljaCBwYWdlIG9mIHJlc3VsdHMgaXMgZGVzaXJlZAorJHBhZ2VkUmVzdWx0cyA9IGZhbHNlOworJHBhZ2VOdW0gPSAxOworaWYoaXNzZXQoJF9QT1NUWydQYWdlZFJlc3VsdHMnXSkpeworCWlmKCRfUE9TVFsnUGFnZWRSZXN1bHRzJ10peworCQlpZihjb3VudCgkcXVlcnlUeXBlcykgIT0gMSl7CisJCQlVdGlsczo6cmVwb3J0RXJyb3IoIlBhZ2VkIHF1ZXJpZXMgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIG9uIG9uZSBQcm9kdWN0VHlwZSIsICRvdXRwdXRGb3JtYXQpOworCQl9CisJCSRwYWdlZFJlc3VsdHMgPSB0cnVlOworCQlpZihpc3NldCgkX1BPU1RbJ1BhZ2VOdW0nXSkpeworCQkJJHBhZ2VOdW0gPSBpbnR2YWwoJF9QT1NUWydQYWdlTnVtJ10pOworCQl9CQkKKwl9Cit9CisKKy8vIENyZWF0ZSB0aGUgdHJlZSBvZiBjcml0ZXJpYSBvYmplY3RzIHRoYXQgZGVmaW5lIHRoZSBxdWVyeQoraWYoIWlzc2V0KCRfUE9TVFsnQ3JpdGVyaWEnXSkpeworCVV0aWxzOjpyZXBvcnRFcnJvcigiUE9TVCBkb2VzIG5vdCBjb250YWluICdDcml0ZXJpYScgc3ViLWFycmF5IiwgJG91dHB1dEZvcm1hdCk7Cit9CitpZighY291bnQoJF9QT1NUWydDcml0ZXJpYSddKSl7CisJVXRpbHM6OnJlcG9ydEVycm9yKCJQT1NUIHN1Yi1hcnJheSAnQ3JpdGVyaWEnIGNvbnRhaW5zIG5vIGNyaXRlcmlhIiwgJG91dHB1dEZvcm1hdCk7Cit9Ciskcm9vdEluZGV4ID0gKGlzc2V0KCRfUE9TVFsnUm9vdEluZGV4J10pKQorCQkJPyBpbnR2YWwoJF9QT1NUWydSb290SW5kZXgnXSkKKwkJCTogMDsKK3RyeXsKKwkkY3JpdGVyaWFUcmVlID0gVXRpbHM6OmNyZWF0ZUNyaXRlcmlhVHJlZSgkcm9vdEluZGV4LCAkcXVlcnlUeXBlcywgbnVsbCk7Cit9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJG91dHB1dEZvcm1hdCk7Cit9CisJCisvLyBBZGQgY3JpdGVyaWEgdG8gcXVlcnkgb2JqZWN0CiskcXVlcnkgPSBuZXcgQ0FTX0ZpbGVtZ3JfUXVlcnkoKTsKKyRxdWVyeS0+YWRkQ3JpdGVyaW9uKCRjcml0ZXJpYVRyZWUpOworCisvLyBQZXJmb3JtIHRoZSBxdWVyeSBhbmQgY29sbGVjdCByZXN1bHRzCiskcmVzdWx0cyA9IGFycmF5KCk7Cit0cnl7CisJaWYoJHBhZ2VkUmVzdWx0cyl7CisJCSRyZXN1bHRQYWdlID0gJGNsaWVudC0+cGFnZWRRdWVyeSgkcXVlcnksICRxdWVyeVR5cGVzWzBdLCAkcGFnZU51bSk7CisJCWZvcmVhY2goJHJlc3VsdFBhZ2UtPmdldFBhZ2VQcm9kdWN0cygpIGFzICRwKXsKKwkJCWFycmF5X3B1c2goJHJlc3VsdHMsIGFycmF5KCdwcm9kdWN0Jz0+JHApKTsKKwkJfQorCX1lbHNleworCQlmb3JlYWNoKCRxdWVyeVR5cGVzIGFzICR0eXBlKXsKKwkJCWZvcmVhY2goJGNsaWVudC0+cXVlcnkoJHF1ZXJ5LCAkdHlwZSkgYXMgJHApeworCQkJCWFycmF5X3B1c2goJHJlc3VsdHMsIGFycmF5KCdwcm9kdWN0Jz0+JHApKTsKKwkJCX0KKwkJfQorCX0KK31jYXRjaChFeGNlcHRpb24gJGUpeworCVV0aWxzOjpyZXBvcnRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAkb3V0cHV0Rm9ybWF0KTsKK30KKworLy8gRm9ybWF0IHJlc3VsdHMKK3RyeXsKKwlpZigkb3V0cHV0Rm9ybWF0ID09ICdodG1sJyl7CisJCSRwYXlsb2FkID0gJzx1bCBjbGFzcz0icHBfcHJvZHVjdExpc3QiIGlkPSJwcm9kdWN0X2xpc3QiPic7CisJCWZvcmVhY2goJHJlc3VsdHMgYXMgJHIpeworCQkJJHBheWxvYWQgLj0gJzxsaT48YSBocmVmPSInIC4gJG1vZHVsZS0+bW9kdWxlUm9vdCAuICcvcHJvZHVjdC8nIC4gJHJbJ3Byb2R1Y3QnXS0+Z2V0SWQoKSAuICciPic7CisJCQkkcGF5bG9hZCAuPSB1cmxEZWNvZGUoJHJbJ3Byb2R1Y3QnXS0+Z2V0TmFtZSgpKSAuICc8L2E+PC9saT4nOworCQl9CisJCSRwYXlsb2FkIC49ICI8L3VsPlxuIjsKKwkJaWYoJHBhZ2VkUmVzdWx0cyl7CisJCQkkcGF5bG9hZCAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9InRvdGFsX3BhZ2VzIiB2YWx1ZT0iJyAuICRyZXN1bHRQYWdlLT5nZXRUb3RhbFBhZ2VzKCkgLiAnIj4nOworCQkJJHBheWxvYWQgLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJwYWdlX3NpemUiIHZhbHVlPSInIC4gJHJlc3VsdFBhZ2UtPmdldFBhZ2VTaXplKCkgLiAnIj4nOworCQkJJHBheWxvYWQgLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJ0b3RhbF90eXBlX3Byb2R1Y3RzIiB2YWx1ZT0iJyAuICRjbGllbnQtPmdldE51bVByb2R1Y3RzKCRxdWVyeVR5cGVzWzBdKSAuICciPic7CisJCX0KKwl9ZWxzZWlmICgkb3V0cHV0Rm9ybWF0ID09ICdqc29uJykgeworCQkkcGF5bG9hZCA9IGFycmF5KCk7CisJCSRwYXlsb2FkWydyZXN1bHRzJ10gPSBVdGlsczo6Zm9ybWF0UmVzdWx0cygkcmVzdWx0cyk7CisJCWlmKCRwYWdlZFJlc3VsdHMpeworCQkJJHBheWxvYWRbJ3RvdGFsUGFnZXMnXSA9ICRyZXN1bHRQYWdlLT5nZXRUb3RhbFBhZ2VzKCk7CisJCQkkcGF5bG9hZFsncGFnZVNpemUnXSA9ICRyZXN1bHRQYWdlLT5nZXRQYWdlU2l6ZSgpOworCQkJJHBheWxvYWRbJ3RvdGFsUHJvZHVjdHMnXSA9ICRjbGllbnQtPmdldE51bVByb2R1Y3RzKCRxdWVyeVR5cGVzWzBdKTsKKwkJfQorCQkkcGF5bG9hZCA9IGpzb25fZW5jb2RlKCRwYXlsb2FkKTsKKwl9Cit9Y2F0Y2goRXhjZXB0aW9uICRlKXsKKwlVdGlsczo6cmVwb3J0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJG91dHB1dEZvcm1hdCk7Cit9CisKK2VjaG8gJHBheWxvYWQ7CisKKz8+CisKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9CYXNpY1NlYXJjaFdpZGdldC5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvQmFzaWNTZWFyY2hXaWRnZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2VhYTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvQmFzaWNTZWFyY2hXaWRnZXQucGhwCkBAIC0wLDAgKzEsNDIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2xhc3MgQmFzaWNTZWFyY2hXaWRnZXQgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbldpZGdldCB7CisJCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcHRpb25zID0gYXJyYXkoKSl7fQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXIoJGJFY2hvID0gdHJ1ZSl7CisJCSRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisJCSRzdHIgPSAnJzsKKwkJJHN0ciAuPSAnPGZvcm0gYWN0aW9uPSInIC4gJG1vZHVsZS0+bW9kdWxlUm9vdCAuICcvcXVlcnlTY3JpcHQuZG8iIG1ldGhvZD0iUE9TVCI+JzsKKwkJJHN0ciAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVHlwZXNbMF0iIHZhbHVlPSIqIi8+JzsKKwkJJHN0ciAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ3JpdGVyaWFbMF1bQ3JpdGVyaWFUeXBlXSIgdmFsdWU9IlRlcm0iLz4nOworCQkkc3RyIC49ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDcml0ZXJpYVswXVtFbGVtZW50TmFtZV0iIHZhbHVlPSIqIi8+JzsKKwkJJHN0ciAuPSAnPGlucHV0IHR5cGU9InRleHQiIG5hbWUgPSJDcml0ZXJpYVswXVtWYWx1ZV0iLz4nOworCQkkc3RyIC49ICc8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIi8+JzsKKwkJJHN0ciAuPSAnPC9mb3JtPic7CisJCQorCQlpZiAoJGJFY2hvKSB7CisJCQllY2hvICRzdHI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gJHN0OworCQl9CisJfQorfQorPz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvQ3Jvc3NUeXBlU2VhcmNoV2lkZ2V0LnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Dcm9zc1R5cGVTZWFyY2hXaWRnZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGRlNDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvQ3Jvc3NUeXBlU2VhcmNoV2lkZ2V0LnBocApAQCAtMCwwICsxLDEyNSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjbGFzcyBDcm9zc1R5cGVTZWFyY2hXaWRnZXQgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbldpZGdldCB7CisJCisJLy8gVGhlIGlkIG9mIHRoZSBIVE1MRWxlbWVudCB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgYnkgZmlsdGVyIHJlc3VsdHMuICBUaGlzIG11c3QgYmUgc2V0IGJlZm9yZQorCS8vIGNhbGxpbmcgcmVuZGVyU2NyaXB0KCkuCisJcHVibGljICRodG1sSUQ7CisJCisJLy8gVGhlIElEIG9mIHRoZSBIVE1MRWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBsb2FkaW5nIGljb24gdGhhdCB3aWxsIGJlCisJLy8gZGlzcGxheWVkIHdoaWxlIGdldHRpbmcgcmVzdWx0cworCXB1YmxpYyAkbG9hZGluZ0lEOworCQorCS8vIFRoZSB1cmwgb2YgdGhlIHNpdGUgYmFzZQorCXB1YmxpYyAkc2l0ZVVybDsKKworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucyA9IGFycmF5KCkpeworCQlpZihpc3NldCgkb3B0aW9uc1snaHRtbElEJ10pKXsKKwkJCSR0aGlzLT5odG1sSUQgPSAkb3B0aW9uc1snaHRtbElEJ107CisJCX0KKwkJaWYoaXNzZXQoJG9wdGlvbnNbJ2xvYWRpbmdJRCddKSl7CisJCQkkdGhpcy0+bG9hZGluZ0lEID0gJG9wdGlvbnNbJ2xvYWRpbmdJRCddOworCQl9CisJCWlmKGlzc2V0KCRvcHRpb25zWydzaXRlVXJsJ10pKXsKKwkJCSR0aGlzLT5zaXRlVXJsID0gJG9wdGlvbnNbJ3NpdGVVcmwnXTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gc2V0SHRtbElkKCRodG1sSUQpeworCQkkdGhpcy0+aHRtbElEID0gJGh0bWxJRDsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldFNpdGVVcmwoJHNpdGVVcmwpeworCQkkdGhpcy0+c2l0ZVVybCA9ICRzaXRlVXJsOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCRiRWNobyA9IHRydWUpeworCQkkc3RyID0gJzxkaXYgaWQ9ImZpbHRlcl93aWRnZXRfZXhjbHVzaXZlX2NvbnRhaW5lciI+JzsKKwkJJHN0ciAuPSAnPGxhYmVsPkV4Y2x1c2l2ZTo8L2xhYmVsPjxpbnB1dCBpZD0iZXhjbHVzaXZlIiB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD0iY2hlY2tlZCIgb25jbGljaz0iY2hhbmdlRXhjbHVzaXZlKCkiLz48L2Rpdj4nOworCQkkc3RyIC49ICc8c2VsZWN0IGlkPSJmaWx0ZXJLZXkiPic7CisJCSRmaWx0ZXJLZXlzID0gVXRpbHM6OmdldEZhY2V0cygpOworCQluYXRjYXNlc29ydCgkZmlsdGVyS2V5cyk7CisJCWZvcmVhY2goJGZpbHRlcktleXMgYXMgJGxhYmVsKXsKKwkJCSRzdHIgLj0gJzxvcHRpb24gdmFsdWU9IicgLiAkbGFiZWwgLiAnIj4nIC4gJGxhYmVsIC4gJzwvb3B0aW9uPic7CisJCX0KKwkJJHN0ciAuPSAnPC9zZWxlY3Q+Jm5ic3A7PSZuYnNwOyc7CisJCSRzdHIgLj0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZmlsdGVyVmFsdWUiIHNpemU9IjE4IiBhbHQ9ImZpbHRlclZhbHVlIj4mbmJzcDsnOworCQkkc3RyIC49ICc8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQWRkIiBvbmNsaWNrPSJhZGRGaWx0ZXIoKSIgLz4nOworCQkkc3RyIC49ICc8dGFibGUgaWQ9ImZpbHRlcnMiPjwvdGFibGU+JzsKKwkJJHN0ciAuPSAnJzsKKwkJJHN0ciAuPSAnPGRpdiBpZD0icGVybWFsaW5rIj48L2Rpdj4nOworCQkKKwkJaWYgKCRiRWNobykgeworCQkJZWNobyAkc3RyOworCQl9IGVsc2UgeworCQkJcmV0dXJuICRzdHI7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHJlbmRlclNjcmlwdCgkYkVjaG8gPSB0cnVlKXsKKwkJJHN0ciA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JzsKKwkJJHN0ciAuPSAndmFyIGh0bWxJRCA9ICInIC4gJHRoaXMtPmh0bWxJRCAuICciOyc7CisJCSRzdHIgLj0gJ3ZhciBsb2FkaW5nSUQgPSAiJyAuICR0aGlzLT5sb2FkaW5nSUQgLiAnIjsnOworCQkkc3RyIC49ICd2YXIgc2l0ZVVybCA9ICInLiAkdGhpcy0+c2l0ZVVybCAuICciOyc7CisJCSRzdHIgLj0gJ3ZhciByZXN1bHRGb3JtYXQgPSAianNvbiI7JzsKKwkJJHN0ciAuPSAndmFyIGRlZmF1bHRTaG93RXZlcnl0aGluZyA9ICcgLiBBcHA6OkdldCgpLT5zZXR0aW5nc1snZGVmYXVsdF9zaG93X2FsbCddIC4gJzsnOworCQkkc3RyIC49ICd2YXIgZGlzcGxheWVkTWV0YWRhdGEgPSBuZXcgQXJyYXkoJzsKKwkJaWYoaXNzZXQoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHJvZHVjdHNfbWV0J10pKXsKKwkJCSRtZXRMaXN0ID0gJyc7CisJCQlmb3JlYWNoKEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3Byb2R1Y3RzX21ldCddIGFzICRtZXQpeworCQkJCWlmKHN0cmxlbigkbWV0TGlzdCkgPiAwKXsKKwkJCQkJJG1ldExpc3QgLj0gJywnOworCQkJCX0KKwkJCQkkbWV0TGlzdCAuPSAnIicgLiAkbWV0IC4gJyInOworCQkJfQorCQkJJHN0ciAuPSAkbWV0TGlzdDsKKwkJfQorCQkkc3RyIC49ICcpOzwvc2NyaXB0Pic7CisJCSRzdHIgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiBBcHA6OkdldCgpLT5yZXF1ZXN0LT5tb2R1bGVTdGF0aWMgLiAnL2pzL3F1ZXJ5d2lkZ2V0LmpzIj48L3NjcmlwdD4nOworCQkkc3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gQXBwOjpHZXQoKS0+cmVxdWVzdC0+bW9kdWxlU3RhdGljIC4gJy9qcy9jcm9zc3R5cGVzZWFyY2h3aWRnZXQuanMiPjwvc2NyaXB0Pic7CisJCQorCQlpZiAoJGJFY2hvKSB7CisJCQllY2hvICRzdHI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gJHN0cjsKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlU2VnbWVudHMoKXsKKwkJJHJlc3VsdHMgPSBhcnJheSgpOworCQkkc2VnbWVudHMgPSBBcHA6OkdldCgpLT5yZXF1ZXN0LT5zZWdtZW50czsKKwkJaWYoaXNzZXQoJHNlZ21lbnRzWzFdKSAmJiAkc2VnbWVudHNbMV0gIT0gIiIpeworCQkJJGZpbHRlclBhcmFtcyA9IGFycmF5KCk7CisJCQlmb3IoJGluZGV4ID0gMTsgaXNzZXQoJHNlZ21lbnRzWyRpbmRleF0pICYmICRzZWdtZW50c1skaW5kZXhdICE9ICIiOyAkaW5kZXggPSAkaW5kZXggKyAyKXsKKwkJCQlhcnJheV9wdXNoKCRmaWx0ZXJQYXJhbXMsIGFycmF5KCRzZWdtZW50c1skaW5kZXhdLCAkc2VnbWVudHNbJGluZGV4ICsgMV0pKTsKKwkJCX0KKwkJCSRyZXN1bHRzWydmaWx0ZXJQYXJhbXMnXSA9ICRmaWx0ZXJQYXJhbXM7CisJCX0KKwkJaWYoaXNzZXQoJHNlZ21lbnRzWzBdKSAmJiAkc2VnbWVudHNbMF0gIT0gIiIpeworCQkJaWYoaW50dmFsKCRzZWdtZW50c1swXSkgPT0gMSl7CisJCQkJJHJlc3VsdHNbJ2V4Y2x1c2l2ZSddID0gYXJyYXkoJ2Jvb2wnPT4nb3InLCAnY2hlY2tlZCc9PmZhbHNlKTsKKwkJCX1lbHNleworCQkJCSRyZXN1bHRzWydleGNsdXNpdmUnXSA9IGFycmF5KCdib29sJz0+J2FuZCcsICdjaGVja2VkJz0+dHJ1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuICRyZXN1bHRzOworCX0KK30KKz8+CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvQ3VzdG9tU2VhcmNoV2lkZ2V0LnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9DdXN0b21TZWFyY2hXaWRnZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDJkN2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvQ3VzdG9tU2VhcmNoV2lkZ2V0LnBocApAQCAtMCwwICsxLDE3OCBAQAorPD9waHAKKyAvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIAorICogVGhpcyB3aWRnZXQgaXMgY29uZmlndXJlZCBieSB0aGUgY3VzdG9tU2VhcmNoQ29uZmlnIGFycmF5IGluIHRoZSBjb25maWcgZmlsZS4gIFRoZQorICogd2lkZ2V0IGV4cGVjdHMgdGhlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY3JpdGVyaWEgdG8gc2VhcmNoIGluIHNlcXVlbmNlLiAgRWFjaAorICogY3JpdGVyaWEgc2hvdWxkIHN0YXJ0IHdpdGggZWl0aGVyICd0ZXJtJyBvciAncmFuZ2UnIGFzIGFuIGVsZW1lbnQgaW4gdGhlIGNvbmZpZworICogYXJyYXksIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YSBlbGVtZW50IHRoYXQgd2lsbCBiZSBzZWFyY2hlZCB3aXRoIHRoZQorICogdmFsdWUgZ2l2ZW4gaW4gdGhlIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBjcml0ZXJpYS4gIEZpbmFsbHkgdGhlIG5leHQgZWxlbWVudAorICogb3IgdHdvIGVsZW1lbnRzIGluIHRoZSBjb25maWcgYXJyYXkgd2lsbCBiZSBvY2N1cGllZCBieSBsYWJlbHMgZm9yIHRoZSBpbm91dCBmaWVsZHMsCisgKiBkZXBlbmRpbmcgdXBvbiB0aGUgY3JpdGVyaWEgdHlwZSAodGVybSBvciByYW5nZSkuCisgKiBIZXJlIGlzIGFuIGV4bWFwbGUgb2YgYSBjb25maWcgYXJyYXkgZm9yIGEgdGVybSBjcml0ZXJpb24gYW5kIGEgcmFuZ2UgY3JpdGVyaW9uIGluIG9yZGVyOgorICogCisgKiBjdXN0b21TZWFyY2hDb25maWdbXT10ZXJtCisgKiBjdXN0b21TZWFyY2hDb25maWdbXT1FVUZpbGUKKyAqIGN1c3RvbVNlYXJjaENvbmZpZ1tdPUVVRmlsZQorICogY3VzdG9tU2VhcmNoQ29uZmlnW109cmFuZ2UKKyAqIGN1c3RvbVNlYXJjaENvbmZpZ1tdPVZpZGVvTGVuZ3RoCisgKiBjdXN0b21TZWFyY2hDb25maWdbXT1NaW4uIFZpZGVvIExlbmd0aAorICogY3VzdG9tU2VhcmNoQ29uZmlnW109TWF4LiBWaWRlbyBMZW5ndGgKKyAqIAorICovCitjbGFzcyBDdXN0b21TZWFyY2hXaWRnZXQgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbldpZGdldCB7CisJCisJLy8gVGhpcyBhcnJheSB3aWxsIHNwZWNpZnkgd2hhdCBjcml0ZXJpYSB3ZSB1c2UgaW4gb3VyIHNlYXJjaCwgd2hhdCB0eXBlcyB0aGV5IGFyZQorCS8vIGFuZCBob3cgdGhleSBzaG91bGQgYmUgbGFiZWxlZC4KKwlwdWJsaWMgJGNyaXRlcmlhOworCQorCS8vIFRoZSBQcm9kdWN0VHlwZSB0aGF0IHRoZSB3aWRnZXQgaXMgZmlsdGVyaW5nLiAgVGhpcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZworCS8vIHJlbmRlcigpIG9yIHJlbmRlclNjcmlwdCgpLgorCXB1YmxpYyAkcHJvZHVjdFR5cGU7CisJCisJLy8gVGhlIGlkIG9mIHRoZSBIVE1MRWxlbWVudCB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgYnkgZmlsdGVyIHJlc3VsdHMuICBUaGlzIG11c3QgYmUgc2V0IGJlZm9yZQorCS8vIGNhbGxpbmcgcmVuZGVyU2NyaXB0KCkuCisJcHVibGljICRodG1sSUQ7CisJCisJLy8gVGhlIHVybCBvZiB0aGUgc2l0ZSBiYXNlCisJcHVibGljICRzaXRlVXJsOworCQorCS8vIFdpbGwgcmVzdWx0cyBiZSByZXR1cm5lZCBpbiBodG1sIG9yIGpzb24KKwlwdWJsaWMgJHJlc3VsdEZvcm1hdDsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMgPSBhcnJheSgpKXsKKwkJCisJCWlmKGlzc2V0KCRvcHRpb25zWydwcm9kdWN0VHlwZSddKSl7CisJCQkkdGhpcy0+cHJvZHVjdFR5cGUgPSAkb3B0aW9uc1sncHJvZHVjdFR5cGUnXTsKKwkJfQorCQlpZihpc3NldCgkb3B0aW9uc1snaHRtbElEJ10pKXsKKwkJCSR0aGlzLT5odG1sSUQgPSAkb3B0aW9uc1snaHRtbElEJ107CisJCX0KKwkJaWYoaXNzZXQoJG9wdGlvbnNbJ3NpdGVVcmwnXSkpeworCQkJJHRoaXMtPnNpdGVVcmwgPSAkb3B0aW9uc1snc2l0ZVVybCddOworCQl9CisJCWlmKGlzc2V0KCRvcHRpb25zWydyZXN1bHRGb3JtYXQnXSkpeworCQkJJHRoaXMtPnJlc3VsdEZvcm1hdCA9ICRvcHRpb25zWydyZXN1bHRGb3JtYXQnXTsKKwkJfQorCQkKKwkJaWYoIWlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydjdXN0b21TZWFyY2hDb25maWcnXSkpeworCQkJZWNobyAnPGRpdiBjbGFzcz0iZXJyb3IiPk5vIGNyaXRlcmlhIGNvbmZpZyB3YXMgZm91bmQgZm9yIHRoZSBDdXN0b21TZWFyY2hXaWRnZXQuPC9kaXY+JzsKKwkJCXJldHVybjsKKwkJfQorCQkkY3JpdGVyaWFDb25maWcgPSBBcHA6OkdldCgpLT5zZXR0aW5nc1snY3VzdG9tU2VhcmNoQ29uZmlnJ107CisJCQorCQkvLyBCdWlsZCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjcml0ZXJpYSB0byBiZSBzZWFyY2hlZCBieSB0aGUgd2lkZ2V0LgorCQkvLyBJZiwgZHVyaW5nIHRoaXMgcHJvY2Vzcywgd2UgZW5jb3VudGVyIGNvbmZpZyB2YWx1ZXMgdGhhdCBkb24ndCBtYWtlCisJCS8vIHNlbnNlIG9yIGFuIGluY29tcGxldGUgY29uZmlnIGZvciBhIGNyaXRlcmlvbiwgd2UnbGwgc2ltcGx5IHNraXAgdG8KKwkJLy8gdGhlIG5leHQgaW5kZXggaW4gdGhlIGNvbmZpZyBhcnJheS4KKwkJJHRoaXMtPmNyaXRlcmlhID0gYXJyYXkoKTsKKwkJJGNvbmZpZ0luZGV4ID0gMDsKKwkJd2hpbGUoaXNzZXQoJGNyaXRlcmlhQ29uZmlnWyRjb25maWdJbmRleF0pKXsKKwkJCQorCQkJJG5ld0NyaXRlcmlvbiA9IGFycmF5KCk7CisJCQkKKwkJCS8vIExvb2sgZm9yIGEgY3JpdGVyaWEgdHlwZQorCQkJJG5ld1R5cGUgPSBzdHJ0b2xvd2VyKCRjcml0ZXJpYUNvbmZpZ1skY29uZmlnSW5kZXhdKTsKKwkJCWlmKCRuZXdUeXBlID09ICd0ZXJtJyBvciAkbmV3VHlwZSA9PSAncmFuZ2UnKXsKKwkJCQkkbmV3Q3JpdGVyaW9uWyd0eXBlJ10gPSAkbmV3VHlwZTsKKwkJCQkkY29uZmlnSW5kZXgrKzsKKwkJCX1lbHNleworCQkJCWNvbnRpbnVlOwkvLyBMZXQncyBza2lwIHRoaXMgb25lIGFuZCBob3BlIHRoYXQgd2UKKwkJCQkJCQkvLyBmaW5kIG9uZSB0aGF0IG1ha2VzIG1vcmUgc2Vuc2UgbGF0ZXIuCisJCQl9CisJCQkKKwkJCS8vIEV4dHJhY3QgdGhlIG1ldGFkYXRhIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0ZXJpb24KKwkJCSRuZXdFbGVtZW50ID0gJGNyaXRlcmlhQ29uZmlnWyRjb25maWdJbmRleF07CisJCQlpZihpc3NldCgkbmV3RWxlbWVudCkpeworCQkJCSRuZXdDcml0ZXJpb25bJ2VsZW1lbnQnXSA9ICRuZXdFbGVtZW50OworCQkJCSRjb25maWdJbmRleCsrOworCQkJfWVsc2V7CisJCQkJY29udGludWU7CS8vIFRoaXMgY3JpdGVyaW9uIHdhc24ndCBmaW5pc2hlZC4KKwkJCX0KKwkJCQorCQkJLy8gRXh0cmFjdCB0aGUgbGFiZWxzIGZvciB0aGUgaW5wdXQgZmllbGQocykKKwkJCSRuZXdMYWJlbCA9ICRjcml0ZXJpYUNvbmZpZ1skY29uZmlnSW5kZXhdOworCQkJaWYoaXNzZXQoJG5ld0xhYmVsKSl7CisJCQkJaWYoJG5ld1R5cGUgPT0gJ3Rlcm0nKXsKKwkJCQkJJG5ld0NyaXRlcmlvblsndGVybUxhYmVsJ10gPSAkbmV3TGFiZWw7CisJCQkJfWVsc2V7CisJCQkJCSRuZXdDcml0ZXJpb25bJ21pbkxhYmVsJ10gPSAkbmV3TGFiZWw7CisJCQkJCSRjb25maWdJbmRleCsrOworCQkJCQkkbmV3TGFiZWwgPSAkY3JpdGVyaWFDb25maWdbJGNvbmZpZ0luZGV4XTsKKwkJCQkJaWYoaXNzZXQoJG5ld0xhYmVsKSl7CisJCQkJCQkkbmV3Q3JpdGVyaW9uWydtYXhMYWJlbCddID0gJG5ld0xhYmVsOworCQkJCQl9ZWxzZXsKKwkJCQkJCWNvbnRpbnVlOwkvLyBUaGlzIGNyaXRlcmlvbiB3YXNuJ3QgZmluaXNoZWQuCisJCQkJCX0KKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQljb250aW51ZTsJLy8gVGhpcyBjcml0ZXJpb24gd2Fzbid0IGZpbmlzaGVkLgorCQkJfQorCQkJCisJCQlhcnJheV9wdXNoKCR0aGlzLT5jcml0ZXJpYSwgJG5ld0NyaXRlcmlvbik7CisJCQkkY29uZmlnSW5kZXgrKzsKKwkJCQorCQl9CisJfQorCQorCS8vIFVzaW5nIHRoZSBjcml0ZXJpYSByZXByZXNlbnRhdGlvbiBhdCB0aGlzLT5jcml0ZXJpYSwgd2UgY3JlYXRlIHRoZSBmaWVsZHMgZm9yCisJLy8gc3BlY2lmeWluZyB0aGUgY3JpdGVyaWEgdmFsdWVzLiAgV2UgcHV0IGEgaGlkZGVuIGlucHV0IHRhZyB3aXRoIGFuIGlkIG9mIHRoZQorCS8vIGZvcm0gdGVybVggb3IgcmFuZ2VYIGJlZm9yZSB0aGUgc3BlY2lmaWNhdGlvbiBmaWVsZHMuICBUaGUgSlMgd2lsbCBmaW5kIHRoZXNlCisJLy8gaGlkZGVuIHRhZ3MgYW5kIHVzZSB0aGVtIHRvIHVuZGVyc3RhbmQgd2hldGhlciB0aGUgZmllbGRzIHNwZWNpZnkgdGVybSBvcgorCS8vIHJhbmdlIGNyaXRlcmlhLiAgVGhlIG51bWJlciBmb2xsb3dpbmcgdGhlIGNyaXRlcmlvbiB0eXBlIGlzIG9ubHkgc28gdGhhdCB0aGV5CisJLy8gaGF2ZSB1bmlxdWUgSURzLgorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXIoJGJFY2hvID0gdHJ1ZSl7CisJCSRzdHIgPSAnJzsKKwkJZm9yKCRpID0gMDsgJGkgPCBjb3VudCgkdGhpcy0+Y3JpdGVyaWEpOyAkaSsrKXsKKwkJCWlmKCR0aGlzLT5jcml0ZXJpYVskaV1bJ3R5cGUnXSA9PSAndGVybScpeworCQkJCSRzdHIgLj0gJzxpbnB1dCBpZD0idGVybScgLiAkaSAuICciIHR5cGU9ImhpZGRlbiIgdmFsdWU9IicgLiAkdGhpcy0+Y3JpdGVyaWFbJGldWydlbGVtZW50J10gLiAnIj4nOworCQkJCSRzdHIgLj0gJHRoaXMtPmNyaXRlcmlhWyRpXVsndGVybUxhYmVsJ10gLiAnOiZuYnNwOzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIxOCIgaWQ9ImlucHV0VGVybScgLiAkaSAuICciPjxici8+JzsKKwkJCX1lbHNleworCQkJCSRzdHIgLj0gJzxpbnB1dCBpZD0icmFuZ2UnIC4gJGkgLiAnIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSInIC4gJHRoaXMtPmNyaXRlcmlhWyRpXVsnZWxlbWVudCddIC4gJyI+JzsKKwkJCQkkc3RyIC49ICR0aGlzLT5jcml0ZXJpYVskaV1bJ21pbkxhYmVsJ10gLiAnOiZuYnNwOzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIxOCIgaWQ9ImlucHV0UmFuZ2VNaW4nIC4gJGkgLiAnIj4nOworCQkJCSRzdHIgLj0gJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyc7CisJCQkJJHN0ciAuPSAkdGhpcy0+Y3JpdGVyaWFbJGldWydtYXhMYWJlbCddIC4gJzombmJzcDs8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMTgiIGlkPSJpbnB1dFJhbmdlTWF4JyAuICRpIC4gJyI+PGJyLz4nOworCQkJfQorCQl9CisJCSRzdHIgLj0gJzxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJTZWFyY2giIG9uY2xpY2s9ImN1c3RvbVF1ZXJ5KCkiIC8+JzsKKwkJCisJCWlmICgkYkVjaG8pIHsKKwkJCWVjaG8gJHN0cjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAkc3RyOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXJTY3JpcHQoJGJFY2hvID0gdHJ1ZSl7CisJCSRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisJCSRzdHIgPSAnJzsKKwkJJHN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBodG1sSUQgPSAiJyAuICR0aGlzLT5odG1sSUQgLiAnIjs8L3NjcmlwdD4nOworCQkkc3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIHB0TmFtZSA9ICInIC4gJHRoaXMtPnByb2R1Y3RUeXBlLT5nZXROYW1lKCkgLiAnIjs8L3NjcmlwdD4nOworCQkkc3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIHNpdGVVcmwgPSAiJyAuICR0aGlzLT5zaXRlVXJsIC4gJyI7PC9zY3JpcHQ+JzsKKwkJJHN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciByZXN1bHRGb3JtYXQgPSAiJyAuICR0aGlzLT5yZXN1bHRGb3JtYXQgLiAnIjs8L3NjcmlwdD4nOworCQkkc3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gJG1vZHVsZS0+bW9kdWxlU3RhdGljIC4gJy9qcy9xdWVyeXdpZGdldC5qcyI+PC9zY3JpcHQ+JzsKKwkJJHN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuICRtb2R1bGUtPm1vZHVsZVN0YXRpYyAuICcvanMvY3VzdG9tc2VhcmNod2lkZ2V0LmpzIj48L3NjcmlwdD4nOworCQkKKwkJaWYgKCRiRWNobykgeworCQkJZWNobyAkc3RyOworCQl9IGVsc2UgeworCQkJcmV0dXJuICRzdHI7CisJCX0KKwl9Cit9Cis/PgpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc2NyaXB0cy93aWRnZXRzL0ZpbHRlcldpZGdldC5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvRmlsdGVyV2lkZ2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjBkZDNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc2NyaXB0cy93aWRnZXRzL0ZpbHRlcldpZGdldC5waHAKQEAgLTAsMCArMSwxMzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2xhc3MgRmlsdGVyV2lkZ2V0IAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25XaWRnZXQgeworCisJLy8gVGhlIFByb2R1Y3RUeXBlIHRoYXQgdGhlIHdpZGdldCBpcyBmaWx0ZXJpbmcuICBUaGlzIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nCisJLy8gcmVuZGVyKCkgb3IgcmVuZGVyU2NyaXB0KCkuCisJcHVibGljICRwcm9kdWN0VHlwZTsKKwkKKwkvLyBUaGUgSUQgb2YgdGhlIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSBtb2RpZmllZCBieSBmaWx0ZXIgcmVzdWx0cy4gIFRoaXMgbXVzdCBiZSBzZXQgYmVmb3JlCisJLy8gY2FsbGluZyByZW5kZXJTY3JpcHQoKS4KKwlwdWJsaWMgJGh0bWxJRDsKKwkKKwkvLyBUaGUgSUQgb2YgdGhlIEhUTUxFbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGxvYWRpbmcgaWNvbiB0aGF0IHdpbGwgYmUKKwkvLyBkaXNwbGF5ZWQgd2hpbGUgZ2V0dGluZyByZXN1bHRzCisJcHVibGljICRsb2FkaW5nSUQ7CisJCisJLy8gVGhlIHVybCBvZiB0aGUgc2l0ZSBiYXNlCisJcHVibGljICRzaXRlVXJsOworCQorCS8vIFdoZXRoZXIgZmlsdGVyZWQgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCBhbGwgYXQgb25jZSBvciBpbiBhIHBhZ2VkIGZvcm1hdAorCXB1YmxpYyAkcGFnZWRSZXN1bHRzOworCQorCS8vIFdpbGwgcmVzdWx0cyBiZSByZXR1cm5lZCBpbiBodG1sIG9yIGpzb24KKwlwdWJsaWMgJHJlc3VsdEZvcm1hdDsKKworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucyA9IGFycmF5KCkpeworCQlpZihpc3NldCgkb3B0aW9uc1sncHJvZHVjdFR5cGUnXSkpeworCQkJJHRoaXMtPnByb2R1Y3RUeXBlID0gJG9wdGlvbnNbJ3Byb2R1Y3RUeXBlJ107CisJCX0KKwkJaWYoaXNzZXQoJG9wdGlvbnNbJ2h0bWxJRCddKSl7CisJCQkkdGhpcy0+aHRtbElEID0gJG9wdGlvbnNbJ2h0bWxJRCddOworCQl9CisJCWlmKGlzc2V0KCRvcHRpb25zWydsb2FkaW5nSUQnXSkpeworCQkJJHRoaXMtPmxvYWRpbmdJRCA9ICRvcHRpb25zWydsb2FkaW5nSUQnXTsKKwkJfQorCQlpZihpc3NldCgkb3B0aW9uc1snc2l0ZVVybCddKSl7CisJCQkkdGhpcy0+c2l0ZVVybCA9ICRvcHRpb25zWydzaXRlVXJsJ107CisJCX0KKwkJaWYoaXNzZXQoJG9wdGlvbnNbJ3BhZ2VkUmVzdWx0cyddKSl7CisJCQkkdGhpcy0+cGFnZWRSZXN1bHRzID0gJG9wdGlvbnNbJ3BhZ2VkUmVzdWx0cyddOworCQl9CisJCWlmKGlzc2V0KCRvcHRpb25zWydyZXN1bHRGb3JtYXQnXSkpeworCQkJJHRoaXMtPnJlc3VsdEZvcm1hdCA9ICRvcHRpb25zWydyZXN1bHRGb3JtYXQnXTsKKwkJfQorCQkKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldFByb2R1Y3RUeXBlKCRwcm9kdWN0VHlwZSl7CisJCSR0aGlzLT5wcm9kdWN0VHlwZSA9ICRwcm9kdWN0VHlwZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldEh0bWxJZCgkaHRtbElEKXsKKwkJJHRoaXMtPmh0bWxJRCA9ICRodG1sSUQ7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBzZXRTaXRlVXJsKCRzaXRlVXJsKXsKKwkJJHRoaXMtPnNpdGVVcmwgPSAkc2l0ZVVybDsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldFBhZ2VkUmVzdWx0cygkcGFnZWRSZXN1bHRzKXsKKwkJJHRoaXMtPnBhZ2VkUmVzdWx0cyA9ICRwYWdlZFJlc3VsdHM7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBzZXRSZXN1bHRGb3JtYXQoJHJlc3VsdEZvcm1hdCl7CisJCSR0aGlzLT5yZXN1bHRGb3JtYXQgPSByZXN1bHRGb3JtYXQ7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXIoJGJFY2hvID0gdHJ1ZSl7CisJCSRzdHIgPSAnJzsKKwkJJHN0ciAuPSAnPHNlbGVjdCBpZD0iZmlsdGVyS2V5Ij4nOworCQkkZmlsdGVyS2V5cyA9IFV0aWxzOjpnZXRNZXRhZGF0YUVsZW1lbnRzKGFycmF5KCR0aGlzLT5wcm9kdWN0VHlwZSkpOworCQluYXRjYXNlc29ydCgkZmlsdGVyS2V5cyk7CisJCWZvcmVhY2goJGZpbHRlcktleXMgYXMgJGxhYmVsKXsKKwkJCSRzdHIgLj0gJzxvcHRpb24gdmFsdWU9IicgLiAkbGFiZWwgLiAnIj4nIC4gJGxhYmVsIC4gJzwvb3B0aW9uPic7CisJCX0KKwkJJHN0ciAuPSAnPC9zZWxlY3Q+Jm5ic3A7PSZuYnNwOyc7CisJCSRzdHIgLj0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZmlsdGVyVmFsdWUiIHNpemU9IjE4IiBhbHQ9ImZpbHRlclZhbHVlIj4mbmJzcDsnOworCQkkc3RyIC49ICc8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQWRkIiBvbmNsaWNrPSJhZGRGaWx0ZXIoKSIgLz4nOworCQkkc3RyIC49ICc8dGFibGUgaWQ9ImZpbHRlcnMiPjwvdGFibGU+JzsKKwkJJHN0ciAuPSAnPGRpdiBpZD0icGVybWFsaW5rIj48L2Rpdj4nOworCQkKKwkJaWYgKCRiRWNobykgeworCQkJZWNobyAkc3RyOworCQl9IGVsc2UgeworCQkJcmV0dXJuICRzdHI7CisJCX0KKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHJlbmRlclNjcmlwdCgkYkVjaG8gPSB0cnVlKXsKKwkJJHN0ciA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JzsKKwkJJHN0ciAuPSAndmFyIGh0bWxJRCA9ICInIC4gJHRoaXMtPmh0bWxJRCAuICciOyc7CisJCSRzdHIgLj0gJ3ZhciBsb2FkaW5nSUQgPSAiJyAuICR0aGlzLT5sb2FkaW5nSUQgLiAnIjsnOworCQkkc3RyIC49ICd2YXIgcHROYW1lID0gIicgLiAkdGhpcy0+cHJvZHVjdFR5cGUtPmdldE5hbWUoKSAuICciOyc7CisJCSRzdHIgLj0gJ3ZhciBwdElEID0gIicgLiAkdGhpcy0+cHJvZHVjdFR5cGUtPmdldElkKCkgLiAnIjsnOworCQkkc3RyIC49ICd2YXIgc2l0ZVVybCA9ICInLiAkdGhpcy0+c2l0ZVVybCAuICciOyc7CisJCSRzdHIgLj0gJ3ZhciByZXN1bHRGb3JtYXQgPSAiJyAuICR0aGlzLT5yZXN1bHRGb3JtYXQgIC4gJyI7JzsKKwkJJHN0ciAuPSAndmFyIGRpc3BsYXllZE1ldGFkYXRhID0gbmV3IEFycmF5KCc7CisJCWlmKGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3Byb2R1Y3RzX21ldCddKSl7CisJCQkkbWV0TGlzdCA9ICcnOworCQkJZm9yZWFjaChBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wcm9kdWN0c19tZXQnXSBhcyAkbWV0KXsKKwkJCQlpZihzdHJsZW4oJG1ldExpc3QpID4gMCl7CisJCQkJCSRtZXRMaXN0IC49ICcsJzsKKwkJCQl9CisJCQkJJG1ldExpc3QgLj0gJyInIC4gJG1ldCAuICciJzsKKwkJCX0KKwkJCSRzdHIgLj0gJG1ldExpc3Q7CisJCX0KKwkJJHN0ciAuPSAnKTs8L3NjcmlwdD4nOworCQkkc3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gQXBwOjpHZXQoKS0+cmVxdWVzdC0+bW9kdWxlU3RhdGljIC4gJy9qcy9xdWVyeXdpZGdldC5qcyI+PC9zY3JpcHQ+JzsKKwkJJHN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuIEFwcDo6R2V0KCktPnJlcXVlc3QtPm1vZHVsZVN0YXRpYyAuICcvanMvZmlsdGVyd2lkZ2V0LmpzIj48L3NjcmlwdD4nOworCQorCQlpZiAoJGJFY2hvKSB7CisJCQllY2hvICRzdHI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gJHN0cjsKKwkJfQorCX0KK30KKz8+CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvTWV0YWRhdGFEaXNwbGF5V2lkZ2V0LnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9NZXRhZGF0YURpc3BsYXlXaWRnZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTJhZTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zY3JpcHRzL3dpZGdldHMvTWV0YWRhdGFEaXNwbGF5V2lkZ2V0LnBocApAQCAtMCwwICsxLDkwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NsYXNzIE1ldGFkYXRhRGlzcGxheVdpZGdldAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25XaWRnZXQgeworCQorCXB1YmxpYyAkbWV0YWRhdGE7CisJCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcHRpb25zID0gYXJyYXkoKSkgeworCQkKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGxvYWRNZXRhZGF0YSgkbWV0YWRhdGEpIHsKKwkJJHRoaXMtPm1ldGFkYXRhID0gJG1ldGFkYXRhOworCX0KKwkKKwkKKwlwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCRiRWNobyA9IHRydWUpIHsKKwkJJHN0ciAgPSAiPHRhYmxlIGNsYXNzPVwibWV0d2lkZ2V0XCI+PHRib2R5PiI7CisJCSRzdHIgLj0gJHRoaXMtPnJlbmRlckhlbHBlcigkdGhpcy0+bWV0YWRhdGEpOworCQkkc3RyIC49ICI8L3Rib2R5PjwvdGFibGU+IjsKKwkJaWYgKCRiRWNobykgeworCQkJZWNobyAkc3RyOworCQl9IGVsc2UgeworCQkJcmV0dXJuICRzdHI7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbmRlckhlbHBlcigkbWV0YWRhdGEpIHsKKwkJZm9yZWFjaCAoJG1ldGFkYXRhIGFzICRrZXkgPT4gJHZhbHVlcykgeworCQkJaWYgKCAhZW1wdHkoJHZhbHVlcykgKSB7CisJCQkJLy8gQnVpbGQgbmVzdGVkIG1ldGFkYXRhIHRhYmxlcyByZWN1cnNpdmVseQorCQkJCSRyIC49ICI8dHI+PHRoPnska2V5fTwvdGg+IjsKKwkJCQkvLyBBc3NvY2lhdGl2ZSBhcnJheSBtZWFucyBtZXQgY29udGFpbnMgc3Via2V5cworCQkJCWlmIChpc19hcnJheSgkdmFsdWVzKSAmJiBzZWxmOjppc19hc3NvYygkdmFsdWVzKSkgeworCQkJCQkkciAuPSAiPHRkPiI7CisJCQkJCSRyIC49ICI8dGFibGUgY2xhc3M9XCJtZXR3aWRnZXQgbXVsdGl2YWx1ZVwiPjx0Ym9keT4iOworCQkJCQkkciAuPSAkdGhpcy0+cmVuZGVySGVscGVyKCR2YWx1ZXMpOworCQkJCQkkciAuPSAiPC90Ym9keT48L3RhYmxlPiI7CisJCQkJfSAKKwkJCQkvLyBOdW1lcmljIGFycmF5IG1lYW5zIG1ldCBoYXMgbXVsdGlwbGUgdmFsdWVzCisJCQkJZWxzZSBpZiAoaXNfYXJyYXkoJHZhbHVlcykpIHsKKwkJCQkJJHIgLj0gIjx0ZD4iOworCQkJCQkkciAuPSAiPHRhYmxlIGNsYXNzPVwibWV0d2lkZ2V0XCI+PHRib2R5PiI7CisJCQkJCWZvcmVhY2ggKCR2YWx1ZXMgYXMgJHZhbCkgeworCQkJCQkJaWYgKGlzX2FycmF5KCR2YWwpICYmIHNlbGY6OmlzX2Fzc29jKCR2YWwpKSB7CisJCQkJCQkJJHIgLj0gIjx0ciBjbGFzcz1cIm11bHRpdmFsdWVcIj48dGQ+IjsKKwkJCQkJCQkkciAuPSAiPHRhYmxlIGNsYXNzPVwibWV0d2lkZ2V0XCI+IjsKKwkJCQkJCQkkciAuPSAkdGhpcy0+cmVuZGVySGVscGVyKCR2YWwpOworCQkJCQkJCSRyIC49ICI8L3RhYmxlPiI7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCSRyIC49ICI8dHI+PHRkIGNsYXNzPVwidmFsdWVcIj4iOworCQkJCQkJCSRyIC49ICI8ZGl2PiIuIHdvcmR3cmFwKCR2YWwsIDgwLCAiPGJyIC8+IiwgdHJ1ZSkgLiAiPC9kaXY+IjsKKwkJCQkJCX0KKwkJCQkJCSRyIC49ICI8L3RkPjwvdHI+IjsKKwkJCQkJfQorCQkJCQkkciAuPSAiPC90Ym9keT48L3RhYmxlPiI7CisJCQkJfSAKKwkJCQkvLyBTY2FsYXIgdmFsdWUgbWVhbnMgbWV0IGhhcyBvbmUgdmFsdWUgCisJCQkJZWxzZSB7CisJCQkJCSRyIC49ICI8dGQgY2xhc3M9XCJ2YWx1ZVwiPiI7CisJCQkJCSRyIC49ICI8ZGl2PnskdmFsdWVzfTwvZGl2PiI7CisJCQkJfQorCQkJCSRyIC49ICI8L3RkPjwvdHI+IjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gJHI7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNfYXNzb2MoJGFycmF5KSB7CisgICAgCXJldHVybiAoaXNfYXJyYXkoJGFycmF5KSAmJiAKKyAgICAJCShjb3VudCgkYXJyYXkpPT0wIHx8IAorICAgIAkJCTAgIT09IGNvdW50KGFycmF5X2RpZmZfa2V5KCRhcnJheSwgYXJyYXlfa2V5cyhhcnJheV9rZXlzKCRhcnJheSkpKSApKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Qcm9kdWN0RG93bmxvYWRXaWRnZXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc2NyaXB0cy93aWRnZXRzL1Byb2R1Y3REb3dubG9hZFdpZGdldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2ZTY0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Qcm9kdWN0RG93bmxvYWRXaWRnZXQucGhwCkBAIC0wLDAgKzEsOTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2xhc3MgUHJvZHVjdERvd25sb2FkV2lkZ2V0IAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25XaWRnZXQgeworCQorCXB1YmxpYyAkY2xpZW50OworCXB1YmxpYyAkcHJvZHVjdDsKKwlwdWJsaWMgJGRhdGFEZWxpdmVyeVVybDsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCSR0aGlzLT5kYXRhRGVsaXZlcnlVcmwgPSAkb3B0aW9uc1snZGF0YURlbGl2ZXJ5VXJsJ107CisJCQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gc2V0Q2xpZW50KCYkWG1sUnBjQ2xpZW50KSB7CisJCSR0aGlzLT5jbGllbnQgPSAkWG1sUnBjQ2xpZW50OworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbG9hZCgkUHJvZHVjdCkgeworCQkkdGhpcy0+cHJvZHVjdCA9ICRQcm9kdWN0OworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCRiRWNobyA9IHRydWUpIHsKKwkJJHN0ciA9ICcnOworCQkkcmVmZXJlbmNlcyA9ICR0aGlzLT5jbGllbnQtPmdldFByb2R1Y3RSZWZlcmVuY2VzKCR0aGlzLT5wcm9kdWN0KTsKKwkJaWYgKGlzc2V0KCRyZWZlcmVuY2VzWydmYXVsdENvZGUnXSkpeworCQkJJHN0ciAuPSAgIjxkaXYgY2xhc3M9XCJlcnJvclwiPiI7CisJCQkkc3RyIC49ICAiRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBwcm9kdWN0IHJlZmVyZW5jZXMuPGJyLz4iOworCQkJJHN0ciAuPSAgIkZBVUxUIENPREU6ICRyZWZlcmVuY2VzW2ZhdWx0Q29kZV08YnIvPiI7CisJCQkkc3RyIC49ICAiRkFVTFQgU1RSSU5HOiAkcmVmZXJlbmNlc1tmYXVsdFN0cmluZ108YnIvPiI7CisJCQkkc3RyIC49ICAiPC9kaXY+IjsKKwkJCWlmICgkYkVjaG8pIHsKKwkJCQllY2hvICRzdHI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAkc3RyOworCQkJfQorCQl9CisJCQorCQkkcmVmZXJlbmNlQ291bnRlciA9IDA7CisJCSRzdHIgLj0gICI8dGFibGUgY2xhc3M9XCJwZHdfZG93bmxvYWRUYWJsZVwiPiI7CisJCWZvcmVhY2ggKCRyZWZlcmVuY2VzIGFzICRyZWZlcmVuY2UpeworCQkJJGZpbGVOYW1lID0gZW5kKGV4cGxvZGUoIi8iLCRyZWZlcmVuY2VbJ2RhdGFTdG9yZVJlZmVyZW5jZSddKSk7CisJCQkkZmlsZVNpemUgPSAkcmVmZXJlbmNlWydmaWxlU2l6ZSddOworCQkJJGZpbGVTaXplU3RyID0gIiI7CisJCQkoJGZpbGVTaXplID4gKDEwMjQqMTAyNCkpIAorCQkJCT8gJGZpbGVTaXplU3RyID0gbnVtYmVyX2Zvcm1hdCgoJGZpbGVTaXplLygxMDI0KjEwMjQpKSwxKSAuICIgTUIiCisJCQkJOiAoKCRmaWxlU2l6ZSA+ICgxMDI0KSkKKwkJCQkJPyAkZmlsZVNpemVTdHIgPSBudW1iZXJfZm9ybWF0KCgkZmlsZVNpemUgLyAxMDI0KSwxKSAuICIgS0IiCisJCQkJCTogJGZpbGVTaXplU3RyID0gJGZpbGVTaXplIC4gIiBieXRlcyIpOworCQkJJHN0ciAuPSAgIjx0cj4iOworCQkJJHN0ciAuPSAgIjx0ZD4iOworCQkJaWYgKCRyZWZlcmVuY2VbJ21pbWVUeXBlJ10gPT0gJ2ltYWdlL2pwZWcnKSB7CisJCQkJJHN0ciAuPSAgIjxpbWcgY2xhc3M9XCJ0blwiIHNyYz1cIiIuJHRoaXMtPmRhdGFEZWxpdmVyeVVybC4iL2RhdGE/cmVmSW5kZXg9JHJlZmVyZW5jZUNvdW50ZXImcHJvZHVjdElEPXskdGhpcy0+cHJvZHVjdC0+Z2V0SUQoKX1cIj4iOwkKKwkJCX0gZWxzZSB7CisJCQkJJHN0ciAuPSAgIjxpbWcgY2xhc3M9XCJ0blwiIHNyYz1cIiIuQXBwOjpHZXQoKS0+cmVxdWVzdC0+bW9kdWxlU3RhdGljLiIvaW1nL2Rvd25sb2FkLWljb24uZ2lmXCIvPiI7CisJCQl9CisJCQkkc3RyIC49ICAiPC90ZD4iOworCQkJJHN0ciAuPSAgIjx0ZCBzdHlsZT1cInZlcnRpY2FsLWFsaWduOnRvcDtcIj4iLnVybGRlY29kZSgkZmlsZU5hbWUpLiIgPGJyLz48c3BhbiBpZD1cInByb2R1Y3RfZG93bmxvYWRfc3BhblwiPiRmaWxlU2l6ZVN0cjwvc3Bhbj48YnIvPiI7CisJCQkkc3RyIC49ICAiTWltZSBUeXBlOiAkcmVmZXJlbmNlW21pbWVUeXBlXTxici8+IjsKKwkJCWlmKCRyZWZlcmVuY2VbJ21pbWVUeXBlJ10gPT0gJ2ltYWdlL2pwZWcnKSB7CisJCQkJJHN0ciAuPSAgIiZuYnNwOzxhIGhyZWY9XCIiLiR0aGlzLT5kYXRhRGVsaXZlcnlVcmwuIi9kYXRhP3JlZkluZGV4PSRyZWZlcmVuY2VDb3VudGVyJnByb2R1Y3RJRD17JHRoaXMtPnByb2R1Y3QtPmdldElEKCl9XCIgdGFyZ2V0PVwiX25ld1wiPnZpZXc8L2E+ICZuYnNwOyI7CisJCQkJJHN0ciAuPSAgIjxhIGhyZWY9XCJnZXRJbWFnZS5waHA/cHJvZHVjdElEPXskdGhpcy0+cHJvZHVjdC0+Z2V0SUQoKX0mcmVmTnVtYmVyPSRyZWZlcmVuY2VDb3VudGVyJmZpbGVOYW1lPSRmaWxlTmFtZVwiPnNhdmU8L2E+Jm5ic3A7IjsJCisJCQl9CisJCQllbHNleworCQkJCSRzdHIgLj0gICI8YSBocmVmPVwiIi4kdGhpcy0+ZGF0YURlbGl2ZXJ5VXJsLiIvZGF0YT9yZWZJbmRleD0kcmVmZXJlbmNlQ291bnRlciZwcm9kdWN0SUQ9eyR0aGlzLT5wcm9kdWN0LT5nZXRJRCgpfVwiPnNhdmU8L2E+ICZuYnNwOyI7CQkKKwkJCX0KKwkJCQkKKwkJCSRzdHIgLj0gICI8L3RkPiI7CisJCQkkc3RyIC49ICAiPC90cj4iOworCQkJJHJlZmVyZW5jZUNvdW50ZXIrKzsKKwkJfQorCQkkc3RyIC49ICAiPC90YWJsZT4iOworCQkKKwkJaWYgKCRiRWNobykgeworCQkJZWNobyAkc3RyOworCQl9IGVsc2UgeworCQkJcmV0dXJuICRzdHI7CisJCX0JCisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc2NyaXB0cy93aWRnZXRzL1Byb2R1Y3RQYWdlV2lkZ2V0LnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Qcm9kdWN0UGFnZVdpZGdldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNzVlOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Qcm9kdWN0UGFnZVdpZGdldC5waHAKQEAgLTAsMCArMSwxMzMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBEaXNwbGF5IGEgcGFnZSBvZiBwcm9kdWN0IHJlc3VsdHMuCisgKiBAYXV0aG9yIGFoYXJ0CisgKgorICovCitjbGFzcyBQcm9kdWN0UGFnZVdpZGdldCAKKwlpbXBsZW1lbnRzIE9yZ19BcGFjaGVfT29kdF9CYWxhbmNlX0ludGVyZmFjZXNfSUFwcGxpY2F0aW9uV2lkZ2V0IHsKKwkKKwlwdWJsaWMgJHBhZ2U7CisJcHVibGljICRwYWdlTWV0YWRhdGE7CisJcHVibGljICRwcm9kdWN0VHlwZUlkOworCXB1YmxpYyAkcmV0dXJuUGFnZTsKKwlwdWJsaWMgJHVybEJhc2U7CisJCisJcHJpdmF0ZSAkcGFnZU51bTsKKwlwcml2YXRlICRwYWdlUHJvZHVjdHM7CisJcHJpdmF0ZSAkcGFnZVNpemU7CisJcHJpdmF0ZSAkdG90YWxQYWdlczsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMgPSBhcnJheSgpICkgeworCQkkdGhpcy0+cGFnZSA9IGZhbHNlOworCQkkdGhpcy0+cHJvZHVjdFR5cGVJZCA9ICRvcHRpb25zWydwcm9kdWN0VHlwZUlkJ107IAorCQkkdGhpcy0+cmV0dXJuUGFnZSAgICA9IChpc3NldCgkb3B0aW9uc1sncmV0dXJuUGFnZSddKSkKKwkJCT8gJG9wdGlvbnNbJ3JldHVyblBhZ2UnXQorCQkJOiAxOworCQkkdGhpcy0+dXJsQmFzZSAgICAgICA9ICRvcHRpb25zWyd1cmxCYXNlJ107CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCRwcm9kdWN0UGFnZSwgJHByb2R1Y3RNZXRhZGF0YSA9IE5VTEwpIHsKKwkJJHRoaXMtPnBhZ2UgCQk9ICRwcm9kdWN0UGFnZTsKKwkJJHRoaXMtPnBhZ2VNZXRhZGF0YSA9ICRwcm9kdWN0TWV0YWRhdGE7CisJCSR0aGlzLT5wYWdlTnVtIAkJPSAkdGhpcy0+cGFnZS0+Z2V0UGFnZU51bSgpOworCQkkdGhpcy0+cGFnZVByb2R1Y3RzID0gJHRoaXMtPnBhZ2UtPmdldFBhZ2VQcm9kdWN0cygpOworCQkkdGhpcy0+cGFnZVNpemUgCT0gJHRoaXMtPnBhZ2UtPmdldFBhZ2VTaXplKCk7CisJCSR0aGlzLT50b3RhbFBhZ2VzIAk9ICR0aGlzLT5wYWdlLT5nZXRUb3RhbFBhZ2VzKCk7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXIoJGJFY2hvID0gdHJ1ZSkgeworCQkkc3RyID0gJyc7CisJCWlmICgkdGhpcy0+cGFnZSkgeworCQkJJHN0ciAuPSAiPHRhYmxlPjx0cj48dGg+UHJvZHVjdCBOYW1lPC90aD4iOworCQkJJGRpc3BsYXllZEVsZW1lbnRzID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHJvZHVjdHNfbWV0J107CisJCQlmb3JlYWNoKCRkaXNwbGF5ZWRFbGVtZW50cyBhcyAkZWxlbWVudE5hbWUpeworCQkJCSRzdHIgLj0gIjx0aD57JGVsZW1lbnROYW1lfTwvdGg+IjsKKwkJCX0KKwkJCSRzdHIgLj0gIjwvdHI+IjsKKwkJCQorCQkJaWYgKCAhQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHJpdmF0ZV9wcm9kdWN0c192aXNpYmlsaXR5J10gKSB7CisJCQkvLyBHZXQgYSBDQVMtQnJvd3NlciBYTUwvUlBDIGNsaWVudAorCQkJJGJyb3dzZXIgID0gbmV3IENhc0Jyb3dzZXIoKTsKKwkJCSRjbGllbnQgICA9ICRicm93c2VyLT5nZXRDbGllbnQoKTsKKwkJCWZvcmVhY2ggKCR0aGlzLT5wYWdlTWV0YWRhdGEgYXMgJGtleSA9PiAkdmFsdWUpIHsKKwkJCQlpZiAoICRicm93c2VyLT5nZXRQcm9kdWN0VmlzaWJpbGl0eUxldmVsKCRrZXkpID09ICJkZW55IikgeworCQkJCQl1bnNldCgkdGhpcy0+cGFnZU1ldGFkYXRhWyRrZXldKTsKKwkJCQkJZm9yZWFjaCAoJHRoaXMtPnBhZ2VQcm9kdWN0cyBhcyAkcHJvZHVjdCkgeworCQkJCQkJaWYgKCRwcm9kdWN0LT5pZCA9PSAka2V5KSB7CisJCQkJCQkJJHByb2R1Y3RLZXkgPSBhcnJheV9zZWFyY2goJHByb2R1Y3QsICR0aGlzLT5wYWdlUHJvZHVjdHMpOworCQkJCQkJCXVuc2V0KCR0aGlzLT5wYWdlUHJvZHVjdHNbJHByb2R1Y3RLZXldKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCX0KKwkJCWZvcmVhY2goJHRoaXMtPnBhZ2VQcm9kdWN0cyBhcyAkcHJvZHVjdCl7CisJCQkJJHN0ciAuPSAiPHRyPjx0ZD48YSBocmVmPVwiIi4kdGhpcy0+dXJsQmFzZS4iL3Byb2R1Y3QveyRwcm9kdWN0LT5nZXRJZCgpfS97JHRoaXMtPnJldHVyblBhZ2V9XCI+IiAKKwkJCQkgIC4gdXJsRGVjb2RlKGJhc2VuYW1lKCRwcm9kdWN0LT5nZXROYW1lKCkpKSAuICI8L2E+PC90ZD4iOworCQkJCWZvcmVhY2goJGRpc3BsYXllZEVsZW1lbnRzIGFzICRlbGVtZW50TmFtZSl7CisJCQkJCSRzdHIgLj0gIjx0ZD4iIC4gJHRoaXMtPnBhZ2VNZXRhZGF0YVskcHJvZHVjdC0+Z2V0SWQoKV0tPmdldE1ldGFkYXRhKCRlbGVtZW50TmFtZSkgLiAiPC90ZD4iOworCQkJCX0KKwkJCQkkc3RyIC49ICI8L3RyPiI7CisJCQl9CisJCQkkc3RyIC49ICI8L3RhYmxlPiI7CisJCX0gCisJCWlmICgkYkVjaG8pIHsKKwkJCWVjaG8gJHN0cjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAkc3RyOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXJQYWdlRGV0YWlscygkYkVjaG8gPSB0cnVlKSB7CisJCS8vIFZhcmlhYmxlcyB0byBkZXRlcm1pbmUgcHJvZHVjdCByYW5nZSBkaXNwbGF5ZWQgYW5kIHRvdGFsIGNvdW50CisJCSRwYWdlTnVtICAgID0gKCR0aGlzLT5wYWdlTnVtID09IC0xKSAgICA/IDAgOiAkdGhpcy0+cGFnZU51bTsKKwkJJHRvdGFsUGFnZXMgPSAoJHRoaXMtPnRvdGFsUGFnZXMgPT0gLTEpID8gMCA6ICR0aGlzLT50b3RhbFBhZ2VzOworCQkKKwkJJGRpc3BsYXlDb3VudFN0YXJ0ID0gKCR0b3RhbFBhZ2VzID09IDApID8gMCA6ICR0aGlzLT5wYWdlU2l6ZSAqICgkcGFnZU51bSAtIDEpICsgMTsKKwkJJGRpc3BsYXlDb3VudEVuZCAgID0gKCR0b3RhbFBhZ2VzID09IDApID8gMCA6ICRkaXNwbGF5Q291bnRTdGFydCArIGNvdW50KCR0aGlzLT5wYWdlUHJvZHVjdHMpIC0gMTsKKwkJJGRpc3BsYXlDb3VudFN0YXJ0ID0gKCR0b3RhbFBhZ2VzID4gMCAmJiAkZGlzcGxheUNvdW50U3RhcnQgPT0gMCkgPyAxIDogJGRpc3BsYXlDb3VudFN0YXJ0OworCQkKKworCQkvLyAnUHJldmlvdXMnIGFuZCAnTmV4dCcgcGFnZSBsaW5rcworCQkkbGlua0Jhc2UgICAgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCktPm1vZHVsZVJvb3QgLiAiL3Byb2R1Y3RzL3skdGhpcy0+cHJvZHVjdFR5cGVJZH0vcGFnZSI7CisJCSRwcmV2UGFnZU51bSA9ICR0aGlzLT5wYWdlTnVtIC0xOworCQkkbmV4dFBhZ2VOdW0gPSAkdGhpcy0+cGFnZU51bSArMTsKKwkJIAorCQkkcHJldlBhZ2VMaW5rID0gKCRwcmV2UGFnZU51bSA+PSAxKSAKKwkJCT8gIjxhIGhyZWY9XCJ7JGxpbmtCYXNlfS97JHByZXZQYWdlTnVtfVwiPiZsdDsmbHQ7Jm5ic3A7UHJldmlvdXMgUGFnZTwvYT4iCisJCQk6ICcnOworCQkkbmV4dFBhZ2VMaW5rID0gKCRuZXh0UGFnZU51bSA8PSAkdGhpcy0+dG90YWxQYWdlcykKKwkJCT8gIjxhIGhyZWY9XCJ7JGxpbmtCYXNlfS97JG5leHRQYWdlTnVtfVwiPk5leHQgUGFnZSZuYnNwOyZndDsmZ3Q7PC9hPiIKKwkJCTogJyc7CisJCisJCSRyYW5nZUluZm8gPSAiPHNwYW4gY2xhc3M9XCJwcF9kZXRhaWxcIj5QYWdlIHskcGFnZU51bX0gb2YgeyR0b3RhbFBhZ2VzfSAiCisJCQkuIihwcm9kdWN0cyB7JGRpc3BsYXlDb3VudFN0YXJ0fSAtIHskZGlzcGxheUNvdW50RW5kfSk8L3NwYW4+IjsKKworCQkKKwkJJHN0ciA9ICI8ZGl2IGNsYXNzPVwicHBfcGFnZUxpbmtzXCI+eyRyYW5nZUluZm99Jm5ic3A7Jm5ic3A7eyRwcmV2UGFnZUxpbmt9Jm5ic3A7Jm5ic3A7eyRuZXh0UGFnZUxpbmt9PC9kaXY+XHJcbiI7CQorCQorCQlpZiAoJGJFY2hvKSB7CisJCQllY2hvICRzdHI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gJHN0cjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Qcm9kdWN0VHlwZUxpc3RXaWRnZXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc2NyaXB0cy93aWRnZXRzL1Byb2R1Y3RUeXBlTGlzdFdpZGdldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZDVlMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3NjcmlwdHMvd2lkZ2V0cy9Qcm9kdWN0VHlwZUxpc3RXaWRnZXQucGhwCkBAIC0wLDAgKzEsOTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2xhc3MgUHJvZHVjdFR5cGVMaXN0V2lkZ2V0IAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25XaWRnZXQgeworCQorCXB1YmxpYyAkcHJvZHVjdFR5cGVzOworCXB1YmxpYyAkdXJsQmFzZTsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMgPSBhcnJheSgpKSB7CisJCSR0aGlzLT5wcm9kdWN0VHlwZXMgPSAkb3B0aW9uc1sncHJvZHVjdFR5cGVzJ107CisJCSR0aGlzLT51cmxCYXNlICAgICAgPSBpc3NldCgkb3B0aW9uc1sndXJsQmFzZSddKSAKKwkJCT8gJG9wdGlvbnNbJ3VybEJhc2UnXQorCQkJOiAnJzsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHNldFVybEJhc2UoJGJhc2UpIHsKKwkJJHRoaXMtPnVybEJhc2UgPSAkYmFzZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHJlbmRlcigkYkVjaG8gPSB0cnVlKSB7CisJCSRzdHIgPSAnJzsKKwkJJHN0ci49ICI8dGFibGUgaWQ9XCJwcm9kdWN0VHlwZVNlYXJjaFwiIGNsYXNzPVwiZGF0YVRhYmxlXCI+CisJCQkgIDx0aGVhZD4KKwkJCSAgICA8dHI+IjsKKwkJLy8gRGlzcGxheSB0aGUgQ29sdW1uIEhlYWRlcnMKKwkJZm9yZWFjaCAoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHRfc2VhcmNoX21ldCddIGFzICRtZXRLZXkpIHsKKwkJCSRzdHIgLj0gIjx0aD4iLnVjd29yZHMoJG1ldEtleSkuIjwvdGg+IjsKKwkJfQorCQlpZiAoaXNzZXQoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHRfaGlkZGVuX3NlYXJjaF9tZXQnXSkpIHsKKwkJCWZvcmVhY2ggKEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3B0X2hpZGRlbl9zZWFyY2hfbWV0J10gYXMgJG1ldEtleSkgeworCQkJCSRzdHIgLj0gIjx0aCBjbGFzcz1cImhpZGRlblwiPnskbWV0S2V5fTwvdGg+IjsKKwkJCX0KKwkJfQorCQkkc3RyIC49ICI8L3RyPjwvdGhlYWQ+PHRib2R5PiI7CisKKwkJLy8gRGlzcGxheSB0aGUgRGF0YQorCQlmb3JlYWNoICgkdGhpcy0+cHJvZHVjdFR5cGVzIGFzICRwdEtleSA9PiAkcHRNZXRhZGF0YSkgeworCQkJaWYgKGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3Byb2R1Y3RfdHlwZV9pZ25vcmVzJ10pICYmIAorCQkJCWluX2FycmF5KCRwdEtleSxBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wcm9kdWN0X3R5cGVfaWdub3JlcyddKSkgeyBjb250aW51ZTsgfQorCQkJJHN0ciAuPSAiPHRyPiI7CisJCQlmb3JlYWNoIChBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wdF9zZWFyY2hfbWV0J10gYXMgJG1ldEtleSkgeworCQkJCWlmICgkbWV0S2V5ID09IEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3B0X3NlYXJjaF9saW5ra2V5J10pIHsKKwkJCQkJJHN0ciAuPSAiPHRkPjxhIGhyZWY9XCJ7JHRoaXMtPnVybEJhc2V9L3Byb2R1Y3RzL3skcHRLZXl9XCI+eyRwdE1ldGFkYXRhWyRtZXRLZXldWzBdfTwvYT4iOworCQkJCQlpZihjb3VudCgkcHRNZXRhZGF0YVskbWV0S2V5XSkgPT0gMil7CisJCQkJCQkkc3RyIC49ICImbmJzcCh7JHB0TWV0YWRhdGFbJG1ldEtleV1bMV19KSI7CisJCQkJCX0KKwkJCQkJJHN0ciAuPSAiPC90ZD4iOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjb3VudCgkcHRNZXRhZGF0YVskbWV0S2V5XSkgPiAxKSB7CisJCQkJCQkkc3RyIC49ICI8dGQ+IiAuIGltcGxvZGUoIiwgIiwgJHB0TWV0YWRhdGFbJG1ldEtleV0pIC4gIjwvdGQ+IjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSRzdHIgLj0gIjx0ZD57JHB0TWV0YWRhdGFbJG1ldEtleV1bMF19PC90ZD4iOwkKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChpc3NldChBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wdF9oaWRkZW5fc2VhcmNoX21ldCddKSkgeworCQkJCWZvcmVhY2ggKEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3B0X2hpZGRlbl9zZWFyY2hfbWV0J10gYXMgJG1ldEtleSkgeworCQkJCQlpZiAoY291bnQoJHB0TWV0YWRhdGFbJG1ldEtleV0pID4gMSkgeworCQkJCQkJJHN0ciAuPSAiPHRkIGNsYXNzPVwiaGlkZGVuXCI+IiAuIGltcGxvZGUoIiwgIiwgJHB0TWV0YWRhdGFbJG1ldEtleV0pIC4gIjwvdGQ+IjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSRzdHIgLj0gIjx0ZCBjbGFzcz1cImhpZGRlblwiPnskcHRNZXRhZGF0YVskbWV0S2V5XVswXX08L3RkPiI7CQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJJHN0ciAuPSAiPC90cj5cclxuIjsKKwkJfQorCQkkc3RyIC49ICI8L3Rib2R5PjwvdGFibGU+IjsJCisJCSRzdHIgLj0gIjxicj4iOworCQkJCisJCWlmICgkYkVjaG8pIHsKKwkJCWVjaG8gJHN0cjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAkc3RyOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9jc3MvY2FzLWJyb3dzZXIuY3NzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2Nzcy9jYXMtYnJvd3Nlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkYWRiYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9jc3MvY2FzLWJyb3dzZXIuY3NzCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworQENIQVJTRVQgIlVURi04IjsKKworYSB7CisJY29sb3I6IzIzNjsKK30KKworYnIuZmlmdHlQeHsKKwltYXJnaW4tYm90dG9tOjUwcHg7Cit9CisKK3RhYmxlI3Byb2R1Y3RUeXBlU2VhcmNoIHsKKwkJCit9Cit0YWJsZSNwcm9kdWN0VHlwZVNlYXJjaCB0aC5oaWRkZW4sCisJdGFibGUjcHJvZHVjdFR5cGVTZWFyY2ggdGQuaGlkZGVuIHsKKwlkaXNwbGF5Om5vbmU7CQorfQorCitkaXYjcHJvZHVjdFR5cGVTZWFyY2hfbGVuZ3RoIHsKKwlmbG9hdDpyaWdodDsKKwl0ZXh0LWFsaWduOnJpZ2h0OworCW1hcmdpbi1ib3R0b206MjBweDsJCisJbWFyZ2luLXRvcDoyNXB4OwkKK30KK2RpdiNwcm9kdWN0VHlwZVNlYXJjaF9maWx0ZXIgeworCWZsb2F0Om5vbmU7CisJbWFyZ2luLXRvcDotMjBweDsJCisJcmlnaHQ6MHB4OwkKKwl0ZXh0LWFsaWduOmxlZnQ7CisJd2lkdGg6NDUwcHg7Cit9CisKK3RhYmxlLmRhdGFUYWJsZSB0ciB7CisJCit9Cit0YWJsZS5kYXRhVGFibGUgdHIgdGQgeworCXBhZGRpbmc6NnB4OworCXZlcnRpY2FsLWFsaWduOnRvcAorfQorCit0YWJsZS5kYXRhVGFibGUgIHsKKwltYXJnaW4tdG9wOjE1cHg7CQorfQorLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9dGV4dF0geworCXBhZGRpbmc6NXB4OworCW1hcmdpbi1sZWZ0OjBweDsJCisJd2lkdGg6OTclOworfQordGFibGUuZGF0YVRhYmxlIHRoZWFkIHRyIHRoIHsKKwlib3JkZXItYm90dG9tOnNvbGlkIDFweCAjODg4OworfQorCit0YWJsZS5kYXRhVGFibGUgdGJvZHkgdHIub2RkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNlZWU7CQorfQordGFibGUuZGF0YVRhYmxlIHRib2R5IHRyLmV2ZW4geworCWJhY2tncm91bmQtY29sb3I6I2ZmZjsKK30KK3RhYmxlLmRhdGFUYWJsZSB0Ym9keSB0ci5vZGQgdGQgeworCWJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7CQorfQordGFibGUuZGF0YVRhYmxlIHRib2R5IHRyLmV2ZW4gdGQgeworCWJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7CQorfQordGFibGUuZGF0YVRhYmxlIHRib2R5IHRyIHRkLnNvcnRpbmdfMSwKKwl0YWJsZS5kYXRhVGFibGUgdGhlYWQgdHIgdGguc29ydGluZ19hc2MsCisJdGFibGUuZGF0YVRhYmxlIHRoZWFkIHRyIHRoLnNvcnRpbmdfZGVzYyB7CisJYmFja2dyb3VuZC1jb2xvcjojZjNmZmYzOwkKK30KK3RhYmxlLmRhdGFUYWJsZSB0Ym9keSB0ci5vZGQgdGQuc29ydGluZ18xIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNlM2YzZTM7Cit9Cit0YWJsZS5kYXRhVGFibGUgdGJvZHkgdHIgdGQgYSB7CisJY29sb3I6IzIyMjsKK30KKworLyoqCisgKiBEQVRBU0VUCisgKi8KK3VsLnRhYnMgeworCWJvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7CisJbWFyZ2luOjBweDsKKwlwYWRkaW5nOjBweDsKKwlwYWRkaW5nLWJvdHRvbTo2cHg7Cit9Cit1bC50YWJzIGxpIHsKKwlkaXNwbGF5OmlubGluZTsKKwltYXJnaW46MHB4OworCXBhZGRpbmc6MHB4OworfQordWwudGFicyBsaSBhIHsKKwlib3JkZXI6c29saWQgMXB4ICNjY2M7CisJcGFkZGluZzo4cHggMTJweDsKKwltYXJnaW4tcmlnaHQ6NXB4OworCW1hcmdpbi1ib3R0b206MHB4OworCWJhY2tncm91bmQtY29sb3I6I2NjYzsKK30KK3VsLnRhYnMgbGkgYS5zZWxlY3RlZCB7CisJYmFja2dyb3VuZC1jb2xvcjojZmZmOworCWJvcmRlci1ib3R0b206c29saWQgMXB4ICNmZmY7Cit9CisKKy8qKgorICogTUVUIFZJRVdFUgorICovCitoNC50b2dnbGVyIHsKKwlwYWRkaW5nOjVweCAwcHg7CisJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKKwljdXJzb3I6cG9pbnRlcjsKKwlfY3Vyc29yOmhhbmQ7CisJbWFyZ2luLWJvdHRvbTowcHg7Cit9Cit0YWJsZS5tZXR3aWRnZXQgeworCQorfQorCisKK3RhYmxlLm1ldHdpZGdldCB0ciB7CisJCit9CisKK3RhYmxlLm1ldHdpZGdldCB0aCB7CisJYmFja2dyb3VuZC1jb2xvcjojZTNmM2UzOworCWJvcmRlci1ib3R0b206c29saWQgMXB4ICNiM2MzYjM7CQorCXZlcnRpY2FsLWFsaWduOnRvcDsKKwlwYWRkaW5nLXRvcDoxNXB4OworCXdpZHRoOjExMHB4OworfQordGFibGUubWV0d2lkZ2V0IHRkIHsKKwl2ZXJ0aWNhbC1hbGlnbjp0b3A7CisJYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggI2IzYzNiMzsKK30KK3RhYmxlLm1ldHdpZGdldCB0YWJsZSB0ZCB7CisJYm9yZGVyLWJvdHRvbTpub25lOworfQorCit0YWJsZS5tZXR3aWRnZXQgdGQudmFsdWUgZGl2IHsKKwliYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OworCWJvcmRlcjpzb2xpZCA0cHggI2ZmZjsKKwlwYWRkaW5nOjVweDsKK30KK3RhYmxlLm1ldHdpZGdldC5tdWx0aXZhbHVlIHRkIHsKKwlib3JkZXI6bm9uZTsJCit9Cit0YWJsZS5tZXR3aWRnZXQgdGFibGUgeworCW1hcmdpbjowcHg7CisJcGFkZGluZzowcHg7Cit9CisKK2RpdiNzZWN0aW9uX3Byb2R1Y3RzIHsKKwlwb3NpdGlvbjpyZWxhdGl2ZTsKK30KK2RpdiNjYXNfYnJvd3Nlcl9kYXRhc2V0X2Rvd25sb2FkIHsKKworfQorCit1bC5wcF9wcm9kdWN0TGlzdCB7CisJbWFyZ2luLXRvcDoxMHB4OworCWxpc3Qtc3R5bGU6bm9uZTsKKwlwYWRkaW5nLWxlZnQ6MHB4OworfQordWwucHBfcHJvZHVjdExpc3QgbGkgeworCWxpbmUtaGVpZ2h0OjI4cHg7CisJcGFkZGluZy1sZWZ0OjBweDsKKwltYXJnaW4tbGVmdDowcHg7Cit9Cit1bC5wcF9wcm9kdWN0TGlzdCBsaSBhIHsKKwl0ZXh0LWRlY29yYXRpb246bm9uZTsKKwlkaXNwbGF5OmJsb2NrOworCWJhY2tncm91bmQtY29sb3I6I2ZmZjsKKwlwYWRkaW5nOjBweCA4cHg7CisJd2lkdGg6MTAwJTsKK30KK3VsLnBwX3Byb2R1Y3RMaXN0IGxpIGE6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisJYmFja2dyb3VuZC1jb2xvcjojZTNmM2UzOworfQorCitpbnB1dFt0eXBlPXRleHRdIHsKKwlwYWRkaW5nOjVweDsJCit9CitzZWxlY3QgeworIAlwYWRkaW5nOjNweDsKK30KKworZGl2LmJyZWFkY3J1bWJzIHsKKwlib3JkZXItYm90dG9tOmRvdHRlZCAxcHggI2NjYzsKKwlwYWRkaW5nLWJvdHRvbTo0cHg7CisJbWFyZ2luLXRvcDotNXB4OworfQorCisKKwordGFibGUubWV0d2lkZ2V0IHsKKwlib3JkZXItdG9wOmRvdHRlZCAxcHggI2JiYjsJCit9Cit0YWJsZS5tZXR3aWRnZXQgdGFibGUgeworCWJvcmRlci10b3A6bm9uZTsJCit9CisKK3RhYmxlLm1ldHdpZGdldCB0ciB0aCB7CisJdmVydGljYWwtYWxpZ246dG9wOworCXBhZGRpbmctdG9wOjhweDsJCisJYmFja2dyb3VuZC1jb2xvcjojZWVlOworCWJvcmRlci1ib3R0b206c29saWQgMnB4ICNmZmY7Cit9Cit0YWJsZS5tZXR3aWRnZXQgdHIgdGQgeworCWJhY2tncm91bmQtY29sb3I6I2Y4ZjhmODsJCit9CisKK3VsLnRhYm1lbnUgeworCW1hcmdpbjowcHg7CisJcGFkZGluZzowcHg7CisJbWFyZ2luLWJvdHRvbToxNXB4OworCXBhZGRpbmctYm90dG9tOjdweDsKKwlib3JkZXItYm90dG9tOnNvbGlkIDFweCAjY2NjOwkKK30KK3VsLnRhYm1lbnUgbGkgeworCWRpc3BsYXk6aW5saW5lOworCWJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKwliYWNrZ3JvdW5kLWNvbG9yOiNlZWU7CisJcGFkZGluZzoxMHB4IDE1cHg7CisJZm9udC1zaXplOjEuNmVtOworCW1hcmdpbi1yaWdodDo1cHg7CisJY3Vyc29yOnBvaW50ZXI7CisJX2N1cnNvcjpoYW5kOworfQordWwudGFibWVudSBsaS5zZWxlY3RlZCB7CisJYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggI2ZmZjsKKwliYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Cit9CisKK2RpdiNmaWx0ZXJfd2lkZ2V0IHsKKwlkaXNwbGF5Om5vbmU7CisJYm9yZGVyOnNvbGlkIDFweCAjY2NjOworCWJhY2tncm91bmQtY29sb3I6I2Y4ZjhmODsKKwlwYWRkaW5nOjVweDsJCit9CisKK2RpdiNzZWN0aW9uX2ZpbHRlcl90b29sc19jb250YWluZXIgeworCXBvc2l0aW9uOnJlbGF0aXZlOwkKK30KK2RpdiNzZWN0aW9uX2ZpbHRlcl90b29sc19idXR0b25zIHsKKwl0ZXh0LWFsaWduOnJpZ2h0OworCXBvc2l0aW9uOmFic29sdXRlOworCXRvcDowcHg7CisJcmlnaHQ6MHB4OworfQorZGl2I3NlY3Rpb25fZmlsdGVyX3Rvb2xzIHsKKwltYXJnaW4tYm90dG9tOjE1cHg7CQorfQorZGl2I2ZpbHRlcl93aWRnZXRfZXhjbHVzaXZlX2NvbnRhaW5lciB7CisJcG9zaXRpb246YWJzb2x1dGU7CisJdG9wOjI1cHg7CisJcmlnaHQ6MHB4OworfQorCisKKworc3BhbiNwcm9kdWN0X2Rvd25sb2FkX3NwYW4geworCWNvbG9yOiM1NTU7CisJZm9udC1zaXplOjAuOWVtOworfQorCitkaXYjbG9hZGluZ19pY29uX2NvbnRhaW5lciB7CisJbWFyZ2luLWJvdHRvbTo1MHB4OworfQorCitpbWcjemlwX2ljb257CisJZmxvYXQ6bGVmdDsKKwltYXJnaW4tcmlnaHQ6MTVweDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9jc3MvZGF0YVRhYmxlcy5jc3MgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvY3NzL2RhdGFUYWJsZXMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MDA0MmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvY3NzL2RhdGFUYWJsZXMuY3NzCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoKKyAqIEdlbmVyYWwgcGFnZSBzZXR1cAorICovCisjZHRfZXhhbXBsZSB7CisJZm9udDogODAlLzEuNDVlbSAiTHVjaWRhIEdyYW5kZSIsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJbWFyZ2luOiAwOworCXBhZGRpbmc6IDA7CisJY29sb3I6ICMzMzM7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKK30KKworCisjZHRfZXhhbXBsZSAjY29udGFpbmVyIHsKKwl3aWR0aDogODAwcHg7CisJbWFyZ2luOiAzMHB4IGF1dG87CisJcGFkZGluZzogMDsKK30KKworCisjZHRfZXhhbXBsZSAjZm9vdGVyIHsKKwltYXJnaW46IDUwcHggYXV0byAwIGF1dG87CisJcGFkZGluZzogMDsKK30KKworI2R0X2V4YW1wbGUgI2RlbW8geworCW1hcmdpbjogMzBweCBhdXRvIDAgYXV0bzsKK30KKworI2R0X2V4YW1wbGUgLmJpZyB7CisJZm9udC1zaXplOiAxLjNlbTsKKwlmb250LXdlaWdodDogYm9sZDsKKwlsaW5lLWhlaWdodDogMS42ZW07CisJY29sb3I6ICM0RTZDQTM7Cit9CisKKyNkdF9leGFtcGxlIC5zcGFjZXIgeworCWhlaWdodDogMjBweDsKKwljbGVhcjogYm90aDsKK30KKworI2R0X2V4YW1wbGUgLmNsZWFyIHsKKwljbGVhcjogYm90aDsKK30KKworI2R0X2V4YW1wbGUgcHJlIHsKKwlwYWRkaW5nOiAxNXB4OworCWJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKK30KKworI2R0X2V4YW1wbGUgaDEgeworCW1hcmdpbi10b3A6IDJlbTsKKwlmb250LXNpemU6IDEuM2VtOworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJbGluZS1oZWlnaHQ6IDEuNmVtOworCWNvbG9yOiAjNEU2Q0EzOworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQjBCRUQ5OworCWNsZWFyOiBib3RoOworfQorCisjZHRfZXhhbXBsZSBoMiB7CisJZm9udC1zaXplOiAxLjJlbTsKKwlmb250LXdlaWdodDogbm9ybWFsOworCWxpbmUtaGVpZ2h0OiAxLjZlbTsKKwljb2xvcjogIzRFNkNBMzsKKwljbGVhcjogYm90aDsKK30KKworI2R0X2V4YW1wbGUgYSB7CisJY29sb3I6ICMwMDYzREM7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisjZHRfZXhhbXBsZSBhOmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworI2R0X2V4YW1wbGUgdWwgeworCWNvbG9yOiAjQjBCRUQ5OworfQorCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCisgKiBEYXRhVGFibGVzIGZlYXR1cmVzCisgKi8KKworLmRhdGFUYWJsZXNfd3JhcHBlciB7CisJcG9zaXRpb246IHJlbGF0aXZlOworCW1pbi1oZWlnaHQ6IDMwMnB4OworCV9oZWlnaHQ6IDMwMnB4OworCWNsZWFyOiBib3RoOworfQorCisuZGF0YVRhYmxlc19wcm9jZXNzaW5nIHsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJdG9wOiAwcHg7CisJbGVmdDogNTAlOworCXdpZHRoOiAyNTBweDsKKwltYXJnaW4tbGVmdDogLTEyNXB4OworCWJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWNvbG9yOiAjOTk5OworCWZvbnQtc2l6ZTogMTFweDsKKwlwYWRkaW5nOiAycHggMDsKK30KKworLmRhdGFUYWJsZXNfbGVuZ3RoIHsKKwl3aWR0aDogNDAlOworCWZsb2F0OiBsZWZ0OworfQorCisuZGF0YVRhYmxlc19maWx0ZXIgeworCXdpZHRoOiA1MCU7CisJZmxvYXQ6IHJpZ2h0OworCXRleHQtYWxpZ246IHJpZ2h0OworfQorCisuZGF0YVRhYmxlc19pbmZvIHsKKwl3aWR0aDogNjAlOworCWZsb2F0OiBsZWZ0OworfQorCisuZGF0YVRhYmxlc19wYWdpbmF0ZSB7CisJd2lkdGg6IDQ0cHg7CisJKiB3aWR0aDogNTBweDsKKwlmbG9hdDogcmlnaHQ7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy8qIFBhZ2luYXRpb24gbmVzdGVkICovCisucGFnaW5hdGVfZGlzYWJsZWRfcHJldmlvdXMsIC5wYWdpbmF0ZV9lbmFibGVkX3ByZXZpb3VzLCAucGFnaW5hdGVfZGlzYWJsZWRfbmV4dCwgLnBhZ2luYXRlX2VuYWJsZWRfbmV4dCB7CisJaGVpZ2h0OiAxOXB4OworCXdpZHRoOiAxOXB4OworCW1hcmdpbi1sZWZ0OiAzcHg7CisJZmxvYXQ6IGxlZnQ7Cit9CisKKy5wYWdpbmF0ZV9kaXNhYmxlZF9wcmV2aW91cyB7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWcvZGF0YVRhYmxlcy9iYWNrX2Rpc2FibGVkLnBuZycpOworfQorCisucGFnaW5hdGVfZW5hYmxlZF9wcmV2aW91cyB7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWcvZGF0YVRhYmxlcy9iYWNrX2VuYWJsZWQucG5nJyk7Cit9CisKKy5wYWdpbmF0ZV9kaXNhYmxlZF9uZXh0IHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltZy9kYXRhVGFibGVzL2ZvcndhcmRfZGlzYWJsZWQucG5nJyk7Cit9CisKKy5wYWdpbmF0ZV9lbmFibGVkX25leHQgeworCWJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1nL2RhdGFUYWJsZXMvZm9yd2FyZF9lbmFibGVkLnBuZycpOworfQorCisKKworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoKKyAqIERhdGFUYWJsZXMgZGlzcGxheQorICovCit0YWJsZS5kaXNwbGF5IHsKKwltYXJnaW46IDAgYXV0bzsKKwl3aWR0aDogMTAwJTsKKwljbGVhcjogYm90aDsKK30KKwordGFibGUuZGlzcGxheSB0aGVhZCB0aCB7CisJcGFkZGluZzogM3B4IDEwcHg7CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOworCWZvbnQtd2VpZ2h0OiBib2xkOworCWN1cnNvcjogcG9pbnRlcjsKKwkqIGN1cnNvcjogaGFuZDsKK30KKwordGFibGUuZGlzcGxheSB0Zm9vdCB0aCB7CisJcGFkZGluZzogM3B4IDEwcHg7CisJYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit0YWJsZS5kaXNwbGF5IHRyLmhlYWRpbmcyIHRkIHsKKwlib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FhYTsKK30KKwordGFibGUuZGlzcGxheSB0ZCB7CisJcGFkZGluZzogM3B4IDEwcHg7Cit9CisKK3RhYmxlLmRpc3BsYXkgdGQuY2VudGVyIHsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICogRGF0YVRhYmxlcyBzb3J0aW5nCisgKi8KKworLnNvcnRpbmdfYXNjIHsKKwliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltZy9kYXRhVGFibGVzL3NvcnRfYXNjLnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgcmlnaHQ7Cit9CisKKy5zb3J0aW5nX2Rlc2MgeworCWJhY2tncm91bmQ6IHVybCgnLi4vaW1nL2RhdGFUYWJsZXMvc29ydF9kZXNjLnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgcmlnaHQ7Cit9CisKKy5zb3J0aW5nIHsKKwliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltZy9kYXRhVGFibGVzL3NvcnRfYm90aC5wbmcnKSBuby1yZXBlYXQgY2VudGVyIHJpZ2h0OworfQorCisKKworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICogRGF0YVRhYmxlcyByb3cgY2xhc3NlcworICovCit0YWJsZS5kaXNwbGF5IHRyLm9kZC5ncmFkZUEgeworCWJhY2tncm91bmQtY29sb3I6ICNkZGZmZGQ7Cit9CisKK3RhYmxlLmRpc3BsYXkgdHIuZXZlbi5ncmFkZUEgeworCWJhY2tncm91bmQtY29sb3I6ICNlZWZmZWU7Cit9CisKKworCisKK3RhYmxlLmRpc3BsYXkgdHIub2RkLmdyYWRlQSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2RkZmZkZDsKK30KKwordGFibGUuZGlzcGxheSB0ci5ldmVuLmdyYWRlQSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZmZlZTsKK30KKwordGFibGUuZGlzcGxheSB0ci5vZGQuZ3JhZGVDIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGZmOworfQorCit0YWJsZS5kaXNwbGF5IHRyLmV2ZW4uZ3JhZGVDIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworfQorCit0YWJsZS5kaXNwbGF5IHRyLm9kZC5ncmFkZVggeworCWJhY2tncm91bmQtY29sb3I6ICNmZmRkZGQ7Cit9CisKK3RhYmxlLmRpc3BsYXkgdHIuZXZlbi5ncmFkZVggeworCWJhY2tncm91bmQtY29sb3I6ICNmZmVlZWU7Cit9CisKK3RhYmxlLmRpc3BsYXkgdHIub2RkLmdyYWRlVSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKK30KKwordGFibGUuZGlzcGxheSB0ci5ldmVuLmdyYWRlVSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKK30KKworCit0ci5vZGQgeworCWJhY2tncm91bmQtY29sb3I6ICNFMkU0RkY7Cit9CisKK3RyLmV2ZW4geworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworfQorCisKKworCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCisgKiBNaXNjCisgKi8KKy50b3AsIC5ib3R0b20geworCXBhZGRpbmc6IDE1cHg7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTsKKwlib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDOworfQorCisudG9wIC5kYXRhVGFibGVzX2luZm8geworCWZsb2F0OiBub25lOworfQorCisuY2xlYXIgeworCWNsZWFyOiBib3RoOworfQorCit0Zm9vdCBpbnB1dCB7CisJbWFyZ2luOiAwLjVlbSAwOworCXdpZHRoOiAxMDAlOworCWNvbG9yOiAjNDQ0OworfQorCit0Zm9vdCBpbnB1dC5zZWFyY2hfaW5pdCB7CisJY29sb3I6ICM5OTk7Cit9CisKKworLmV4YW1wbGVfYWx0X3BhZ2luYXRpb24gZGl2LmRhdGFUYWJsZXNfaW5mbyB7CisJd2lkdGg6IDQwJTsKK30KKworLmV4YW1wbGVfYWx0X3BhZ2luYXRpb24gLmRhdGFUYWJsZXNfcGFnaW5hdGUgeworCXdpZHRoOiA0MDBweDsKK30KKworLmV4YW1wbGVfYWx0X3BhZ2luYXRpb24gZGl2LmRhdGFUYWJsZXNfcGFnaW5hdGUgc3Bhbi5wYWdpbmF0ZV9idXR0b24sCisgCS5leGFtcGxlX2FsdF9wYWdpbmF0aW9uIGRpdi5kYXRhVGFibGVzX3BhZ2luYXRlIHNwYW4ucGFnaW5hdGVfYWN0aXZlIHsKKwlib3JkZXI6IDFweCBzb2xpZCAjYWFhOworCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4OworCS1tb3otYm9yZGVyLXJhZGl1czogNXB4OworCXBhZGRpbmc6IDJweCA1cHg7CisJbWFyZ2luOiAwIDNweDsKKwljdXJzb3I6IHBvaW50ZXI7CisJKmN1cnNvcjogaGFuZDsKK30KKworLmV4YW1wbGVfYWx0X3BhZ2luYXRpb24gZGl2LmRhdGFUYWJsZXNfcGFnaW5hdGUgc3Bhbi5wYWdpbmF0ZV9idXR0b24geworCWJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cit9CisKKy5leGFtcGxlX2FsdF9wYWdpbmF0aW9uIGRpdi5kYXRhVGFibGVzX3BhZ2luYXRlIHNwYW4ucGFnaW5hdGVfYnV0dG9uOmhvdmVyIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOworfQorCisuZXhhbXBsZV9hbHRfcGFnaW5hdGlvbiBkaXYuZGF0YVRhYmxlc19wYWdpbmF0ZSBzcGFuLnBhZ2luYXRlX2FjdGl2ZSB7CisJYmFja2dyb3VuZC1jb2xvcjogIzk5QjNGRjsKK30KKworCit0YWJsZS5kaXNwbGF5IHRyLnJvd19zZWxlY3RlZC5vZGQgdGQgeworCWJhY2tncm91bmQtY29sb3I6ICNCMEJFRDk7Cit9CisKK3RhYmxlLmRpc3BsYXkgdHIucm93X3NlbGVjdGVkLmV2ZW4gdGQgeworCWJhY2tncm91bmQtY29sb3I6ICM5RkFGRDE7Cit9CisKKworLyoKKyAqIFNvcnRpbmcgY2xhc3NlcyBmb3IgY29sdW1ucworICovCisvKiBGb3IgdGhlIHN0YW5kYXJkIG9kZC9ldmVuICovCit0ci5vZGQgdGQuc29ydGluZ18xIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRDNENkZGOworfQorCit0ci5vZGQgdGQuc29ydGluZ18yIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQ0ZGOworfQorCit0ci5vZGQgdGQuc29ydGluZ18zIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRTBFMkZGOworfQorCit0ci5ldmVuIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI0VBRUJGRjsKK30KKwordHIuZXZlbiB0ZC5zb3J0aW5nXzIgeworCWJhY2tncm91bmQtY29sb3I6ICNGMkYzRkY7Cit9CisKK3RyLmV2ZW4gdGQuc29ydGluZ18zIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjlGOUZGOworfQorCisKKy8qIEZvciB0aGUgQ29uZGl0aW9uYWwtQ1NTIGdyYWRpbmcgcm93cyAqLworLyoKKyAJQ29sb3VyIGNhbGN1bGF0aW9ucyAoYmFzZWQgb2ZmIHRoZSBtYWluIHJvdyBjb2xvdXJzKQorICBMZXZlbCAxOgorCQlkZCA+IGM0CisJCWVlID4gZDUKKwlMZXZlbCAyOgorCSAgZGQgPiBkMQorCSAgZWUgPiBlMgorICovCit0ci5vZGQuZ3JhZGVBIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2M0ZmZjNDsKK30KKwordHIub2RkLmdyYWRlQSB0ZC5zb3J0aW5nXzIgeworCWJhY2tncm91bmQtY29sb3I6ICNkMWZmZDE7Cit9CisKK3RyLmV2ZW4uZ3JhZGVBIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Q1ZmZkNTsKK30KKwordHIuZXZlbi5ncmFkZUEgdGQuc29ydGluZ18yIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZTJmZmUyOworfQorCit0ci5vZGQuZ3JhZGVDIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2M0YzRmZjsKK30KKwordHIub2RkLmdyYWRlQyB0ZC5zb3J0aW5nXzIgeworCWJhY2tncm91bmQtY29sb3I6ICNkMWQxZmY7Cit9CisKK3RyLmV2ZW4uZ3JhZGVDIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Q1ZDVmZjsKK30KKwordHIuZXZlbi5ncmFkZUMgdGQuc29ydGluZ18yIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmZmOworfQorCit0ci5vZGQuZ3JhZGVYIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZmYzRjNDsKK30KKwordHIub2RkLmdyYWRlWCB0ZC5zb3J0aW5nXzIgeworCWJhY2tncm91bmQtY29sb3I6ICNmZmQxZDE7Cit9CisKK3RyLmV2ZW4uZ3JhZGVYIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZmZDVkNTsKK30KKwordHIuZXZlbi5ncmFkZVggdGQuc29ydGluZ18yIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZlMmUyOworfQorCit0ci5vZGQuZ3JhZGVVIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2M0YzRjNDsKK30KKwordHIub2RkLmdyYWRlVSB0ZC5zb3J0aW5nXzIgeworCWJhY2tncm91bmQtY29sb3I6ICNkMWQxZDE7Cit9CisKK3RyLmV2ZW4uZ3JhZGVVIHRkLnNvcnRpbmdfMSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Q1ZDVkNTsKK30KKwordHIuZXZlbi5ncmFkZVUgdGQuc29ydGluZ18yIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOworfQorCisKKy8qCisgKiBSb3cgaGlnaGxpZ2h0aW5nIGV4YW1wbGUKKyAqLworLmV4X2hpZ2hsaWdodCAjZXhhbXBsZSB0Ym9keSB0ci5ldmVuOmhvdmVyLCAjZXhhbXBsZSB0Ym9keSB0ci5ldmVuIHRkLmhpZ2hsaWdodGVkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUNGRkIzOworfQorCisuZXhfaGlnaGxpZ2h0ICNleGFtcGxlIHRib2R5IHRyLm9kZDpob3ZlciwgI2V4YW1wbGUgdGJvZHkgdHIub2RkIHRkLmhpZ2hsaWdodGVkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRTZGRjk5OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9Tb3J0aW5nIGljb25zLnBzZCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9Tb3J0aW5nIGljb25zLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IyZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL1NvcnRpbmcgaWNvbnMucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9iYWNrX2Rpc2FibGVkLnBuZyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9iYWNrX2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFkZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2JhY2tfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9iYWNrX2VuYWJsZWQucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2JhY2tfZW5hYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwODY4MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9iYWNrX2VuYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9iYWNrX2VuYWJsZWRfaG92ZXIucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2JhY2tfZW5hYmxlZF9ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwMGYxMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9iYWNrX2VuYWJsZWRfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mYXZpY29uLmljbyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mYXZpY29uLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVhYTJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mb3J3YXJkX2Rpc2FibGVkLnBuZyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mb3J3YXJkX2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTZkZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2ZvcndhcmRfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mb3J3YXJkX2VuYWJsZWQucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2ZvcndhcmRfZW5hYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNmI1MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mb3J3YXJkX2VuYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mb3J3YXJkX2VuYWJsZWRfaG92ZXIucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL2ZvcndhcmRfZW5hYmxlZF9ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NmM1ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9mb3J3YXJkX2VuYWJsZWRfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2FzYy5wbmcgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2RhdGFUYWJsZXMvc29ydF9hc2MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGQ3OTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2RhdGFUYWJsZXMvc29ydF9hc2MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2FzY19kaXNhYmxlZC5wbmcgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2RhdGFUYWJsZXMvc29ydF9hc2NfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTQ0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2RhdGFUYWJsZXMvc29ydF9hc2NfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2JvdGgucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL3NvcnRfYm90aC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2NzA0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2JvdGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2Rlc2MucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL3NvcnRfZGVzYy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmMDcxZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2Rlc2MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2Rlc2NfZGlzYWJsZWQucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy9kYXRhVGFibGVzL3NvcnRfZGVzY19kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyNDk3MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZGF0YVRhYmxlcy9zb3J0X2Rlc2NfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvZG93bmxvYWQtaWNvbi5naWYgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2Rvd25sb2FkLWljb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTNhMzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2Rvd25sb2FkLWljb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvbG9hZGluZy5naWYgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2xvYWRpbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL2xvYWRpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvemlwLWljb24tc21hbGxlci5naWYgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL3ppcC1pY29uLXNtYWxsZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjI1NDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvaW1nL3ppcC1pY29uLXNtYWxsZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvemlwLWljb24uZ2lmIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2ltZy96aXAtaWNvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmMDVlMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9pbWcvemlwLWljb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9qcy9jcm9zc3R5cGVzZWFyY2h3aWRnZXQuanMgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvY3Jvc3N0eXBlc2VhcmNod2lkZ2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2QyMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvY3Jvc3N0eXBlc2VhcmNod2lkZ2V0LmpzCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZnVuY3Rpb24gcmVuZGVySnNvbk91dHB1dChkYXRhKXsKKwlvdXRwdXQgPSAnPHRhYmxlIGlkPSJjcm9zc1BUU2VhcmNoVGFibGUiIGNsYXNzPSJkYXRhVGFibGUiPjx0aGVhZD48dHI+PHRoPlByb2R1Y3QgTmFtZTwvdGg+PHRoPlByb2R1Y3RUeXBlPC90aD4nOworCWZvcihpID0gMDsgaSA8IGRpc3BsYXllZE1ldGFkYXRhLmxlbmd0aDsgaSsrKXsKKwkJb3V0cHV0ICs9ICc8dGg+JyArIGRpc3BsYXllZE1ldGFkYXRhW2ldICsgJzwvdGg+JzsKKwl9CisJb3V0cHV0ICs9ICc8L3RyPjwvdGhlYWQ+PHRib2R5Pic7CisJZm9yKGkgPSAwOyBpIDwgZGF0YVsncmVzdWx0cyddLmxlbmd0aDsgaSsrKXsKKwkJb3V0cHV0ICs9ICc8dHI+PHRkPjxhIGhyZWY9IicgKyBzaXRlVXJsICsgJy9wcm9kdWN0LycgKyBkYXRhWydyZXN1bHRzJ11baV1bJ2lkJ10gKyAnIj4nOworCQlvdXRwdXQgKz0gZGF0YVsncmVzdWx0cyddW2ldWyduYW1lJ10gKyAnPC9hPjwvdGQ+JzsKKwkJb3V0cHV0ICs9ICc8dGQ+JyArIGRhdGFbJ3Jlc3VsdHMnXVtpXVsndHlwZSddICsgJzwvdGQ+JzsKKwkJZm9yKGsgPSAwOyBrIDwgZGlzcGxheWVkTWV0YWRhdGEubGVuZ3RoOyBrKyspeworCQkJb3V0cHV0ICs9ICc8dGQ+JyArIGRhdGFbJ3Jlc3VsdHMnXVtpXVsnbWV0YWRhdGEnXVtkaXNwbGF5ZWRNZXRhZGF0YVtrXV0gKyAnPC90ZD4nOworCQl9CisJCW91dHB1dCArPSAnPC90cj4nOworCX0KKwlvdXRwdXQgKz0gJzwvdGJvZHk+PC90YWJsZT48YnIgLz4nOworCSQoIiMiICsgaHRtbElEKS5odG1sKG91dHB1dCk7Cit9CisKK2Z1bmN0aW9uIGRpc3BsYXlQZXJtYWxpbmsoKXsKKwlvdXRwdXQgPSAnVG8gc2VlIHRoZXNlIGZpbHRlcnMgYWdhaW4sIGdvIHRvOjxiciAvPicgKyBzaXRlVXJsICsgJy90eXBlc2VhcmNoLyc7CisJaWYoJCgiI2V4Y2x1c2l2ZSIpLmF0dHIoImNoZWNrZWQiKSl7CisJCW91dHB1dCArPSAnMC8nOworCX1lbHNleworCQlvdXRwdXQgKz0gJzEvJzsKKwl9CisJZm9yKGkgPSAwOyBpIDwgYWxsQ3JpdGVyaWFbY3JpdGVyaWFSb290XS5jcml0ZXJpYS5sZW5ndGg7IGkrKyl7CisJCXRlcm1JbmRleCA9IGFsbENyaXRlcmlhW2NyaXRlcmlhUm9vdF0uY3JpdGVyaWFbaV07CisJCXRlcm1LZXkgPSBhbGxDcml0ZXJpYVt0ZXJtSW5kZXhdLmVsZW1lbnQ7CisJCXRlcm1WYWx1ZSA9IGFsbENyaXRlcmlhW3Rlcm1JbmRleF0udmFsdWU7CisJCW91dHB1dCArPSB0ZXJtS2V5ICsgJy8nICsgdGVybVZhbHVlICsgJy8nOworCX0KKwkkKCIjcGVybWFsaW5rIikuaHRtbChvdXRwdXQpOworfQorCitmdW5jdGlvbiBjbGVhclJlc3VsdHMoKXsKKwkkKCIjIiArIGh0bWxJRCkuaHRtbCgiIik7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUZpbHRlcihrZXksIHZhbHVlKXsKKwlpbmRleCA9IGFkZFRlcm1Dcml0ZXJpYShrZXksIHZhbHVlLCBjcml0ZXJpYVJvb3QpOworCXZhciBmaWx0ZXJUZXh0ID0gJzx0ciBpZD0iZmlsdGVyJyArIGluZGV4ICsgJyI+JzsKKwlmaWx0ZXJUZXh0ICs9ICc8dGQ+JyArIGtleSArICc8L3RkPjx0ZD49PC90ZD48dGQ+JyArIHZhbHVlICsgJzwvdGQ+JzsKKwlmaWx0ZXJUZXh0ICs9ICc8dGQgYWxpZ249InJpZ2h0Ij4nOworCWZpbHRlclRleHQgKz0gJzxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJSZW1vdmUiIG9uY2xpY2s9InJlbW92ZUZpbHRlcihcJycgKyBpbmRleCArICdcJykiIC8+JzsKKwlmaWx0ZXJUZXh0ICs9ICc8L3RkPjwvdHI+JzsKKwkkKCIjZmlsdGVycyIpLmFwcGVuZChmaWx0ZXJUZXh0KTsKK30KKworZnVuY3Rpb24gYWRkRmlsdGVyKCl7CisJcEN1cnJQYWdlID0gMTsKKwlrZXkgPSAkKCIjZmlsdGVyS2V5IikudmFsKCk7CisJdmFsdWUgPSAkKCIjZmlsdGVyVmFsdWUiKS52YWwoKTsKKwlpZih2YWx1ZSE9IiIpeworCQkkKCIjcGVybWFsaW5rIikuaHRtbCgiIik7CisJCWNyZWF0ZUZpbHRlcihrZXksIHZhbHVlKTsKKwkJZm9ybWF0Q3Jvc3NUeXBlUXVlcnlSZXF1ZXN0KCk7CisJCSQoIiNmaWx0ZXJWYWx1ZSIpLnZhbCgiIik7CisgICAgfQorfQorCitmdW5jdGlvbiByZW1vdmVGaWx0ZXIoZmlsdGVySW5kZXgpeworCXBDdXJyUGFnZSA9IDE7CisJJCgiI2ZpbHRlciIgKyBmaWx0ZXJJbmRleCkucmVtb3ZlKCk7CisJJCgiI3Blcm1hbGluayIpLmh0bWwoIiIpOworCXJlbW92ZUNyaXRlcmlhKGZpbHRlckluZGV4KTsKKwlzZW5kQ3Jvc3NUeXBlUmVxdWVzdCgpOworfQorCitmdW5jdGlvbiBnZXROZXh0UGFnZSgpeworCXBDdXJyUGFnZSA9IHBDdXJyUGFnZSArIDE7CisJc2VuZENyb3NzVHlwZVJlcXVlc3QoKTsKK30KKworZnVuY3Rpb24gZ2V0UHJldlBhZ2UoKXsKKwlwQ3VyclBhZ2UgPSBwQ3VyclBhZ2UgLSAxOworCXNlbmRDcm9zc1R5cGVSZXF1ZXN0KCk7Cit9CisKK2Z1bmN0aW9uIGNoYW5nZUV4Y2x1c2l2ZSgpeworCWlmKCQoIiNleGNsdXNpdmUiKS5hdHRyKCJjaGVja2VkIikpeworCQlzZXRFeGNsdXNpdmVRdWVyeSh0cnVlKTsKKwl9ZWxzZXsKKwkJc2V0RXhjbHVzaXZlUXVlcnkoZmFsc2UpOworCX0KKwlpZihkZXRlcm1pbmVSZXF1ZXN0KGNyaXRlcmlhUm9vdCkpeworCQlmb3JtYXRDcm9zc1R5cGVRdWVyeVJlcXVlc3QoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvY3VzdG9tc2VhcmNod2lkZ2V0LmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2N1c3RvbXNlYXJjaHdpZGdldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg3NDMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2N1c3RvbXNlYXJjaHdpZGdldC5qcwpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gV2hlbiB0aGUgZG9jdW1lbnQgaXMgcmVhZHksIHdlIG5lZWQgdG8gY3JlYXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNyaXRlcmlhCisvLyB0cmVlIGluIGphdmFzY3JpcHQuICBUaGlzIGlzIGRvbmUgYnkgbG9va2luZyBmb3IgaGlkZGVuIGlucHV0IHRhZ3Mgd2l0aCBpZHMgdGhhdAorLy8gc3RhcnQgd2l0aCBlaXRoZXIgJ3Rlcm0nIG9yICdyYW5nZScuICBUaGVzZSBwcmVjZWRlIHRoZSB0ZXh0IGlucHV0IGZpZWxkcyB0bworLy8gc3BlY2lmeSBjcml0ZXJpYSBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlLiAgV2Ugc3RvcmUgdGhlIGlkcyBvZiB0aGUgaW5wdXQgZmllbGRzCisvLyBzbyB3ZSBjYW4gdXNlIHRoaWVyIHZhbHVlcyB3aGVuIHRoZSBzZWFyY2ggYnV0dG9uIGlzIGNsaWNrZWQuICBDcmVhdGUgY3JpdGVyaWEKKy8vIHRoYXQgaGF2ZSBibGFuayB2YWx1ZXMgc2luY2UgdGhleSBoYXZlbid0IGJlZW4gZmlsbGVkIGluIHlldDsgdGhlc2UgdmFsdWVzIHdpbGwKKy8vIGJlIHVwZGF0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHNlYXJjaCBidXR0b24uCiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeworCXZhciBwYXJlbnRJbmRleCA9IGFkZEJvb2xlYW5Dcml0ZXJpYSgnYW5kJywgbnVsbCk7CisJJCgnaW5wdXRbaWRePSJ0ZXJtIl0nKS5lYWNoKGZ1bmN0aW9uKCl7CisJCXZhciBuZXdUZXJtSW5kZXggPSBhZGRUZXJtQ3JpdGVyaWEoJCh0aGlzKS52YWwoKSwgJycsIHBhcmVudEluZGV4KTsKKwkJYWxsQ3JpdGVyaWFbbmV3VGVybUluZGV4XS50ZXJtSW5wdXRJZCA9ICQodGhpcykubmV4dCgpLmF0dHIoImlkIik7CisJfSkKKwkkKCdpbnB1dFtpZF49InJhbmdlIl0nKS5lYWNoKGZ1bmN0aW9uKCl7CisJCXZhciBuZXdSYW5nZUluZGV4ID0gYWRkUmFuZ2VDcml0ZXJpYSgkKHRoaXMpLnZhbCgpLCAnJywgJycsIHBhcmVudEluZGV4KTsKKwkJYWxsQ3JpdGVyaWFbbmV3UmFuZ2VJbmRleF0ubWluSW5wdXRJZCA9ICQodGhpcykubmV4dCgpLmF0dHIoImlkIik7CisJCWFsbENyaXRlcmlhW25ld1JhbmdlSW5kZXhdLm1heElucHV0SWQgPSAkKHRoaXMpLm5leHQoKS5uZXh0KCkuYXR0cigiaWQiKTsKKwl9KQorfSk7CisKKy8vIFNpbmNlIHRoZSBjcml0ZXJpYSBpbiBvdXIgcXVlcnkgdHJlZSBhcmUgb3JpZ2luYWxseSBjcmVhdGVkIHdpdGggZW1wdHkgdmFsdWVzLCB3ZQorLy8gbXVzdCBncmFiIHRoZSB2YWx1ZXMgZnJvbSB0aGUgaW5wdXQgZmllbGRzIGF0IHRoZSBzdG9yZWQgaWRzLgorZnVuY3Rpb24gY3VzdG9tVXBkYXRlQ3JpdGVyaWEoaW5kZXgpeworCWlmKGFsbENyaXRlcmlhW2luZGV4XS50eXBlID09ICd0ZXJtJyl7CisJCWFsbENyaXRlcmlhW2luZGV4XS52YWx1ZSA9ICQoJyMnICsgYWxsQ3JpdGVyaWFbaW5kZXhdLnRlcm1JbnB1dElkKS52YWwoKTsKKwkJJCgnIycgKyBhbGxDcml0ZXJpYVtpbmRleF0udGVybUlucHV0SWQpLnZhbCgnJyk7CisJfWVsc2UgaWYoYWxsQ3JpdGVyaWFbaW5kZXhdLnR5cGUgPT0gJ3JhbmdlJyl7CisJCWFsbENyaXRlcmlhW2luZGV4XS5taW4gPSAkKCcjJyArIGFsbENyaXRlcmlhW2luZGV4XS5taW5JbnB1dElkKS52YWwoKTsKKwkJJCgnIycgKyBhbGxDcml0ZXJpYVtpbmRleF0ubWluSW5wdXRJZCkudmFsKCcnKTsKKwkJYWxsQ3JpdGVyaWFbaW5kZXhdLm1heCA9ICQoJyMnICsgYWxsQ3JpdGVyaWFbaW5kZXhdLm1heElucHV0SWQpLnZhbCgpOworCQkkKCcjJyArIGFsbENyaXRlcmlhW2luZGV4XS5tYXhJbnB1dElkKS52YWwoJycpOworCX1lbHNlIGlmKGFsbENyaXRlcmlhW2luZGV4XS50eXBlID09ICdib29sZWFuJyl7CisJCWZvcihpID0gMDsgaSA8IGFsbENyaXRlcmlhW2luZGV4XS5jcml0ZXJpYS5sZW5ndGg7IGkrKyl7CisJCQljdXN0b21VcGRhdGVDcml0ZXJpYShhbGxDcml0ZXJpYVtpbmRleF0uY3JpdGVyaWFbaV0pOworCQl9CisJfQorCXJldHVybjsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc2VhcmNoIGJ1dHRvbiBpcyBjbGlja2VkLgorZnVuY3Rpb24gY3VzdG9tUXVlcnkoKXsKKwkkKCIjcGFnZV9udW0iKS52YWwoMSk7CS8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIGRlc2lyZWQgcGFnZSB0byAxIChmaXJzdCBpbgorCQkJCQkJCS8vIHRoZSBzZXQpLiAgVGhlIHVzZXIgY2FuIGZldGNoIGxhdGVyIHBhZ2VzIGJ5CisJCQkJCQkJLy8gY2xpY2tpbmcgdGhlIGxpbmtzIGZvciBuZXh0IGFuZCBwcmV2aW91cyBwYWdlcy4KKwljdXN0b21VcGRhdGVDcml0ZXJpYShjcml0ZXJpYVJvb3QpOwkvLyBVcGRhdGUgdGhlIGNyaXRlcmlhIGluIHRoZSBxdWVyeSB0cmVlCisJCQkJCQkJCQkJLy8gd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIGlucHV0IGZpZWxkcy4KKwlmb3JtYXRRdWVyeVJlcXVlc3QoImh0bWwiKTsJLy8gUGVyZm9ybSB0aGUgcXVlcnkKK30KKworZnVuY3Rpb24gcmVuZGVySnNvbk91dHB1dChkYXRhKXsKKwlvdXRwdXQgPSAnPHVsIGNsYXNzPSJwcF9wcm9kdWN0TGlzdCIgaWQ9InByb2R1Y3RfbGlzdCI+JzsKKwlmb3IoaSA9IDA7IGkgPCBkYXRhWydwcm9kdWN0TGlzdCddLmxlbmd0aDsgaSsrKXsKKwkJb3V0cHV0ICs9ICc8bGk+PGEgaHJlZj0iJyArIHNpdGVVcmwgKyAnL3Byb2R1Y3QvJyArIGRhdGFbJ3Byb2R1Y3RMaXN0J11baV1bJ2lkJ10gKyAnIj4nOworCQlvdXRwdXQgKz0gZGF0YVsncHJvZHVjdExpc3QnXVtpXVsnbmFtZSddICsgJzwvbGk+JzsKKwl9CisJb3V0cHV0ICs9ICc8L3VsPic7CisJb3V0cHV0ICs9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0idG90YWxfcGFnZXMiIHZhbHVlPSInICsgZGF0YVsndG90YWxQYWdlcyddICsgJyI+JzsKKwlvdXRwdXQgKz0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJwYWdlX3NpemUiIHZhbHVlPSInICsgZGF0YVsncGFnZVNpemUnXSArICciPic7CisJb3V0cHV0ICs9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0idG90YWxfdHlwZV9wcm9kdWN0cyIgdmFsdWU9IicgKyBkYXRhWyd0b3RhbFR5cGVQcm9kdWN0cyddICsgJyI+JzsKKwkkKCIjIiArIGh0bWxJRCkuaHRtbChvdXRwdXQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9qcy9maWx0ZXJ3aWRnZXQuanMgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvZmlsdGVyd2lkZ2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmI1NmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvZmlsdGVyd2lkZ2V0LmpzCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitmdW5jdGlvbiBjcmVhdGVGaWx0ZXIoa2V5LCB2YWx1ZSl7CisJaWYoIWFsbENyaXRlcmlhW2NyaXRlcmlhUm9vdF0peworCQljcml0ZXJpYVJvb3QgPSBhZGRCb29sZWFuQ3JpdGVyaWEoJ2FuZCcsIG51bGwpOworCX0KKwlpbmRleCA9IGFkZFRlcm1Dcml0ZXJpYShrZXksIHZhbHVlLCBjcml0ZXJpYVJvb3QpOworCXZhciBmaWx0ZXJUZXh0ID0gJzx0ciBpZD0iZmlsdGVyJyArIGluZGV4ICsgJyI+JzsKKwlmaWx0ZXJUZXh0ICs9ICc8dGQ+JyArIGtleSArICc8L3RkPjx0ZD49PC90ZD48dGQ+JyArIHZhbHVlICsgJzwvdGQ+JzsKKwlmaWx0ZXJUZXh0ICs9ICc8dGQgYWxpZ249InJpZ2h0Ij4nOworCWZpbHRlclRleHQgKz0gJzxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJSZW1vdmUiIG9uY2xpY2s9InJlbW92ZUZpbHRlcihcJycgKyBpbmRleCArICdcJykiIC8+JzsKKwlmaWx0ZXJUZXh0ICs9ICc8L3RkPjwvdHI+JzsKKwkkKCIjZmlsdGVycyIpLmFwcGVuZChmaWx0ZXJUZXh0KTsKK30KKworZnVuY3Rpb24gYWRkRmlsdGVyKCl7CisJa2V5ID0gJCgiI2ZpbHRlcktleSIpLnZhbCgpOworCXZhbHVlID0gJCgiI2ZpbHRlclZhbHVlIikudmFsKCk7CisJcEN1cnJQYWdlID0gMTsKKwlpZih2YWx1ZSE9IiIpeworCQkkKCIjcGVybWFsaW5rIikuaHRtbCgiIik7CisJCWNyZWF0ZUZpbHRlcihrZXksIHZhbHVlKTsKKwkJZm9ybWF0UXVlcnlSZXF1ZXN0KHJlc3VsdEZvcm1hdCk7CisJCSQoIiNmaWx0ZXJWYWx1ZSIpLnZhbCgiIik7CisgICAgfQorfQorCitmdW5jdGlvbiByZW1vdmVGaWx0ZXIoZmlsdGVySW5kZXgpeworCXBDdXJyUGFnZSA9IDE7CisJJCgiI2ZpbHRlciIgKyBmaWx0ZXJJbmRleCkucmVtb3ZlKCk7CisJJCgiI3Blcm1hbGluayIpLmh0bWwoIiIpOworCXJlbW92ZUNyaXRlcmlhKGZpbHRlckluZGV4KTsKKwlzZW5kUmVxdWVzdChyZXN1bHRGb3JtYXQpOworfQorCitmdW5jdGlvbiByZW5kZXJKc29uT3V0cHV0KGRhdGEpeworCW91dHB1dCA9ICcnOworCWlmKGRpc3BsYXllZE1ldGFkYXRhLmxlbmd0aCA+IDApeworCQlvdXRwdXQgPSAnPHRhYmxlPjx0aGVhZD48dHI+PHRoPlByb2R1Y3QgTmFtZTwvdGg+JzsKKwkJZm9yKGkgPSAwOyBpIDwgZGlzcGxheWVkTWV0YWRhdGEubGVuZ3RoOyBpKyspeworCQkJb3V0cHV0ICs9ICc8dGg+JyArIGRpc3BsYXllZE1ldGFkYXRhW2ldICsgJzwvdGg+JzsKKwkJfQorCQlvdXRwdXQgKz0gJzwvdHI+PC90aGVhZD48dGJvZHk+JzsKKwkJZm9yKGkgPSAwOyBpIDwgZGF0YVsncmVzdWx0cyddLmxlbmd0aDsgaSsrKXsKKwkJCW91dHB1dCArPSAnPHRyPjx0ZD48YSBocmVmPSInICsgc2l0ZVVybCArICcvcHJvZHVjdC8nICsgZGF0YVsncmVzdWx0cyddW2ldWydpZCddICsgJyI+JzsKKwkJCW91dHB1dCArPSBkYXRhWydyZXN1bHRzJ11baV1bJ25hbWUnXSArICc8L2E+PC90ZD4nOworCQkJZm9yKGogPSAwOyBqIDwgZGlzcGxheWVkTWV0YWRhdGEubGVuZ3RoOyBqKyspeworCQkJCW91dHB1dCArPSAnPHRkPicgKyBkYXRhWydyZXN1bHRzJ11baV1bJ21ldGFkYXRhJ11bZGlzcGxheWVkTWV0YWRhdGFbal1dICsgJzwvdGQ+JzsKKwkJCX0KKwkJCW91dHB1dCArPSAnPC90cj4nOworCQl9CisJCW91dHB1dCArPSAnPC90Ym9keT48L3RhYmxlPic7CisJfWVsc2V7CisJCW91dHB1dCA9ICc8dWwgY2xhc3M9InBwX3Byb2R1Y3RMaXN0IiBpZD0icHJvZHVjdF9saXN0Ij4nOworCQlmb3IoaSA9IDA7IGkgPCBkYXRhWydyZXN1bHRzJ10ubGVuZ3RoOyBpKyspeworCQkJb3V0cHV0ICs9ICc8bGk+PGEgaHJlZj0iJyArIHNpdGVVcmwgKyAnL3Byb2R1Y3QvJyArIGRhdGFbJ3Jlc3VsdHMnXVtpXVsnaWQnXSArICciPic7CisJCQlvdXRwdXQgKz0gZGF0YVsncmVzdWx0cyddW2ldWyduYW1lJ10gKyAnPC9hPjwvbGk+JzsKKwkJfQorCQlvdXRwdXQgKz0gJzwvdWw+JzsKKwl9CisJJCgiIyIgKyBodG1sSUQpLmh0bWwob3V0cHV0KTsKK30KKworZnVuY3Rpb24gZGlzcGxheVBlcm1hbGluaygpeworCW91dHB1dCA9ICdUbyBzZWUgdGhlc2UgZmlsdGVycyBhZ2FpbiwgZ28gdG86PGJyIC8+JyArIHNpdGVVcmwgKyAnL3Byb2R1Y3RzLycgKyBwdElEICsgJy8nOworCWZvcihpID0gMDsgaSA8IGFsbENyaXRlcmlhW2NyaXRlcmlhUm9vdF0uY3JpdGVyaWEubGVuZ3RoOyBpKyspeworCQl0ZXJtSW5kZXggPSBhbGxDcml0ZXJpYVtjcml0ZXJpYVJvb3RdLmNyaXRlcmlhW2ldOworCQl0ZXJtS2V5ID0gYWxsQ3JpdGVyaWFbdGVybUluZGV4XS5lbGVtZW50OworCQl0ZXJtVmFsdWUgPSBhbGxDcml0ZXJpYVt0ZXJtSW5kZXhdLnZhbHVlOworCQlvdXRwdXQgKz0gdGVybUtleSArICcvJyArIHRlcm1WYWx1ZSArICcvJzsKKwl9CisJJCgiI3Blcm1hbGluayIpLmh0bWwob3V0cHV0KTsKK30KKworZnVuY3Rpb24gZ2V0TmV4dFBhZ2UoKXsKKwlwQ3VyclBhZ2UgPSBwQ3VyclBhZ2UgKyAxOworCXNlbmRSZXF1ZXN0KCJqc29uIik7Cit9CisKK2Z1bmN0aW9uIGdldFByZXZQYWdlKCl7CisJcEN1cnJQYWdlID0gcEN1cnJQYWdlIC0gMTsKKwlzZW5kUmVxdWVzdCgianNvbiIpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9qcy9qY29ybmVyLmpxdWVyeS5qcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3N0YXRpYy9qcy9qY29ybmVyLmpxdWVyeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTZhMTdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2pjb3JuZXIuanF1ZXJ5LmpzCkBAIC0wLDAgKzEsMjQ3IEBACisvKiEKKyAqIGpRdWVyeSBjb3JuZXIgcGx1Z2luOiBzaW1wbGUgY29ybmVyIHJvdW5kaW5nCisgKiBFeGFtcGxlcyBhbmQgZG9jdW1lbnRhdGlvbiBhdDogaHR0cDovL2pxdWVyeS5tYWxzdXAuY29tL2Nvcm5lci8KKyAqIHZlcnNpb24gMi4xMSAoMTUtSlVOLTIwMTApCisgKiBSZXF1aXJlcyBqUXVlcnkgdjEuMy4yIG9yIGxhdGVyCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKKyAqIEF1dGhvcnM6IERhdmUgTWV0aHZpbiBhbmQgTWlrZSBBbHN1cAorICovCisKKy8qKgorICogIGNvcm5lcigpIHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudDogICQoJyNteURpdicpLmNvcm5lcigiZWZmZWN0IGNvcm5lcnMgd2lkdGgiKQorICoKKyAqICBlZmZlY3Q6ICBuYW1lIG9mIHRoZSBlZmZlY3QgdG8gYXBwbHksIHN1Y2ggYXMgcm91bmQsIGJldmVsLCBub3RjaCwgYml0ZSwgZXRjIChkZWZhdWx0IGlzIHJvdW5kKS4gCisgKiAgY29ybmVyczogb25lIG9yIG1vcmUgb2Y6IHRvcCwgYm90dG9tLCB0ciwgdGwsIGJyLCBvciBibC4gIChkZWZhdWx0IGlzIGFsbCBjb3JuZXJzKQorICogIHdpZHRoOiAgIHdpZHRoIG9mIHRoZSBlZmZlY3Q7IGluIHRoZSBjYXNlIG9mIHJvdW5kZWQgY29ybmVycyB0aGlzIGlzIHRoZSByYWRpdXMuIAorICogICAgICAgICAgIHNwZWNpZnkgdGhpcyB2YWx1ZSB1c2luZyB0aGUgcHggc3VmZml4IHN1Y2ggYXMgMTBweCAoeWVzLCBpdCBtdXN0IGJlIHBpeGVscykuCisgKi8KKzsoZnVuY3Rpb24oJCkgeyAKKwordmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGUsCisgICAgbW96ID0gc3R5bGVbJ01vekJvcmRlclJhZGl1cyddICE9PSB1bmRlZmluZWQsCisgICAgd2Via2l0ID0gc3R5bGVbJ1dlYmtpdEJvcmRlclJhZGl1cyddICE9PSB1bmRlZmluZWQsCisgICAgcmFkaXVzID0gc3R5bGVbJ2JvcmRlclJhZGl1cyddICE9PSB1bmRlZmluZWQgfHwgc3R5bGVbJ0JvcmRlclJhZGl1cyddICE9PSB1bmRlZmluZWQsCisgICAgbW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCAwLAorICAgIG5vQm90dG9tRm9sZCA9ICQuYnJvd3Nlci5tc2llICYmICgoJC5icm93c2VyLnZlcnNpb24gPCA4ICYmICFtb2RlKSB8fCBtb2RlIDwgOCksCisKKyAgICBleHByID0gJC5icm93c2VyLm1zaWUgJiYgKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHRyeSB7IGRpdi5zdHlsZS5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJzArMCcpOyBkaXYuc3R5bGUucmVtb3ZlRXhwcmVzc2lvbignd2lkdGgnKTsgfQorICAgICAgICBjYXRjaChlKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9KSgpOworCiskLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiskLnN1cHBvcnQuYm9yZGVyUmFkaXVzID0gbW96IHx8IHdlYmtpdCB8fCByYWRpdXM7IC8vIHNvIHlvdSBjYW4gZG86ICBpZiAoISQuc3VwcG9ydC5ib3JkZXJSYWRpdXMpICQoJyNteURpdicpLmNvcm5lcigpOworCitmdW5jdGlvbiBzeihlbCwgcCkgeyAKKyAgICByZXR1cm4gcGFyc2VJbnQoJC5jc3MoZWwscCkpfHwwOyAKK307CitmdW5jdGlvbiBoZXgyKHMpIHsKKyAgICB2YXIgcyA9IHBhcnNlSW50KHMpLnRvU3RyaW5nKDE2KTsKKyAgICByZXR1cm4gKCBzLmxlbmd0aCA8IDIgKSA/ICcwJytzIDogczsKK307CitmdW5jdGlvbiBncGMobm9kZSkgeworICAgIHdoaWxlKG5vZGUpIHsKKyAgICAgICAgdmFyIHYgPSAkLmNzcyhub2RlLCdiYWNrZ3JvdW5kQ29sb3InKSwgcmdiOworICAgICAgICBpZiAodiAmJiB2ICE9ICd0cmFuc3BhcmVudCcgJiYgdiAhPSAncmdiYSgwLCAwLCAwLCAwKScpIHsKKyAgICAgICAgICAgIGlmICh2LmluZGV4T2YoJ3JnYicpID49IDApIHsgCisgICAgICAgICAgICAgICAgcmdiID0gdi5tYXRjaCgvXGQrL2cpOyAKKyAgICAgICAgICAgICAgICByZXR1cm4gJyMnKyBoZXgyKHJnYlswXSkgKyBoZXgyKHJnYlsxXSkgKyBoZXgyKHJnYlsyXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdodG1sJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOyAvLyBrZWVwIHdhbGtpbmcgaWYgdHJhbnNwYXJlbnQKKyAgICB9CisgICAgcmV0dXJuICcjZmZmZmZmJzsKK307CisKK2Z1bmN0aW9uIGdldFdpZHRoKGZ4LCBpLCB3aWR0aCkgeworICAgIHN3aXRjaChmeCkgeworICAgIGNhc2UgJ3JvdW5kJzogIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoKigxLU1hdGguY29zKE1hdGguYXNpbihpL3dpZHRoKSkpKTsKKyAgICBjYXNlICdjb29sJzogICByZXR1cm4gTWF0aC5yb3VuZCh3aWR0aCooMStNYXRoLmNvcyhNYXRoLmFzaW4oaS93aWR0aCkpKSk7CisgICAgY2FzZSAnc2hhcnAnOiAgcmV0dXJuIE1hdGgucm91bmQod2lkdGgqKDEtTWF0aC5jb3MoTWF0aC5hY29zKGkvd2lkdGgpKSkpOworICAgIGNhc2UgJ2JpdGUnOiAgIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoKihNYXRoLmNvcyhNYXRoLmFzaW4oKHdpZHRoLWktMSkvd2lkdGgpKSkpOworICAgIGNhc2UgJ3NsaWRlJzogIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoKihNYXRoLmF0YW4yKGksd2lkdGgvaSkpKTsKKyAgICBjYXNlICdqdXQnOiAgICByZXR1cm4gTWF0aC5yb3VuZCh3aWR0aCooTWF0aC5hdGFuMih3aWR0aCwod2lkdGgtaS0xKSkpKTsKKyAgICBjYXNlICdjdXJsJzogICByZXR1cm4gTWF0aC5yb3VuZCh3aWR0aCooTWF0aC5hdGFuKGkpKSk7CisgICAgY2FzZSAndGVhcic6ICAgcmV0dXJuIE1hdGgucm91bmQod2lkdGgqKE1hdGguY29zKGkpKSk7CisgICAgY2FzZSAnd2lja2VkJzogcmV0dXJuIE1hdGgucm91bmQod2lkdGgqKE1hdGgudGFuKGkpKSk7CisgICAgY2FzZSAnbG9uZyc6ICAgcmV0dXJuIE1hdGgucm91bmQod2lkdGgqKE1hdGguc3FydChpKSkpOworICAgIGNhc2UgJ3NjdWxwdCc6IHJldHVybiBNYXRoLnJvdW5kKHdpZHRoKihNYXRoLmxvZygod2lkdGgtaS0xKSx3aWR0aCkpKTsKKyAgICBjYXNlICdkb2dmb2xkJzoKKyAgICBjYXNlICdkb2cnOiAgICByZXR1cm4gKGkmMSkgPyAoaSsxKSA6IHdpZHRoOworICAgIGNhc2UgJ2RvZzInOiAgIHJldHVybiAoaSYyKSA/IChpKzEpIDogd2lkdGg7CisgICAgY2FzZSAnZG9nMyc6ICAgcmV0dXJuIChpJjMpID8gKGkrMSkgOiB3aWR0aDsKKyAgICBjYXNlICdmcmF5JzogICByZXR1cm4gKGklMikqd2lkdGg7CisgICAgY2FzZSAnbm90Y2gnOiAgcmV0dXJuIHdpZHRoOyAKKyAgICBjYXNlICdiZXZlbGZvbGQnOgorICAgIGNhc2UgJ2JldmVsJzogIHJldHVybiBpKzE7CisgICAgfQorfTsKKworJC5mbi5jb3JuZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgLy8gaW4gMS4zKyB3ZSBjYW4gZml4IG1pc3Rha2VzIHdpdGggdGhlIHJlYWR5IHN0YXRlCisgICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgaWYgKCEkLmlzUmVhZHkgJiYgdGhpcy5zZWxlY3RvcikgeworICAgICAgICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdG9yLCBjID0gdGhpcy5jb250ZXh0OworICAgICAgICAgICAgJChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAkKHMsYykuY29ybmVyKG9wdGlvbnMpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpbmRleCl7CisgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCisgICAgICAgICAgICAvLyBtZXRhIHZhbHVlcyBvdmVycmlkZSBvcHRpb25zCisgICAgICAgICAgICBvID0gWyR0aGlzLmF0dHIoJC5mbi5jb3JuZXIuZGVmYXVsdHMubWV0YUF0dHIpIHx8ICcnLCBvcHRpb25zIHx8ICcnXS5qb2luKCcgJykudG9Mb3dlckNhc2UoKSwKKyAgICAgICAgICAgIGtlZXAgPSAva2VlcC8udGVzdChvKSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgYm9yZGVycz8KKyAgICAgICAgICAgIGNjID0gKChvLm1hdGNoKC9jYzooI1swLTlhLWZdKykvKXx8W10pWzFdKSwgIC8vIGNvcm5lciBjb2xvcgorICAgICAgICAgICAgc2MgPSAoKG8ubWF0Y2goL3NjOigjWzAtOWEtZl0rKS8pfHxbXSlbMV0pLCAgLy8gc3RyaXAgY29sb3IKKyAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQoKG8ubWF0Y2goLyhcZCspcHgvKXx8W10pWzFdKSB8fCAxMCwgLy8gY29ybmVyIHdpZHRoCisgICAgICAgICAgICByZSA9IC9yb3VuZHxiZXZlbGZvbGR8YmV2ZWx8bm90Y2h8Yml0ZXxjb29sfHNoYXJwfHNsaWRlfGp1dHxjdXJsfHRlYXJ8ZnJheXx3aWNrZWR8c2N1bHB0fGxvbmd8ZG9nM3xkb2cyfGRvZ2ZvbGR8ZG9nLywKKyAgICAgICAgICAgIGZ4ID0gKChvLm1hdGNoKHJlKXx8Wydyb3VuZCddKVswXSksCisgICAgICAgICAgICBmb2xkID0gL2RvZ2ZvbGR8YmV2ZWxmb2xkLy50ZXN0KG8pLAorICAgICAgICAgICAgZWRnZXMgPSB7IFQ6MCwgQjoxIH0sCisgICAgICAgICAgICBvcHRzID0geworICAgICAgICAgICAgICAgIFRMOiAgL3RvcHx0bHxsZWZ0Ly50ZXN0KG8pLCAgICAgICBUUjogIC90b3B8dHJ8cmlnaHQvLnRlc3QobyksCisgICAgICAgICAgICAgICAgQkw6ICAvYm90dG9tfGJsfGxlZnQvLnRlc3QobyksICAgIEJSOiAgL2JvdHRvbXxicnxyaWdodC8udGVzdChvKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vIHZhcnMgdXNlZCBpbiBmdW5jIGxhdGVyCisgICAgICAgICAgICBzdHJpcCwgcGFkLCBjc3NIZWlnaHQsIGosIGJvdCwgZCwgZHMsIGJ3LCBpLCB3LCBlLCBjLCBjb21tb24sICRob3J6OworICAgICAgICAKKyAgICAgICAgaWYgKCAhb3B0cy5UTCAmJiAhb3B0cy5UUiAmJiAhb3B0cy5CTCAmJiAhb3B0cy5CUiApCisgICAgICAgICAgICBvcHRzID0geyBUTDoxLCBUUjoxLCBCTDoxLCBCUjoxIH07CisgICAgICAgICAgICAKKyAgICAgICAgLy8gc3VwcG9ydCBuYXRpdmUgcm91bmRpbmcKKyAgICAgICAgaWYgKCQuZm4uY29ybmVyLmRlZmF1bHRzLnVzZU5hdGl2ZSAmJiBmeCA9PSAncm91bmQnICYmIChyYWRpdXMgfHwgbW96IHx8IHdlYmtpdCkgJiYgIWNjICYmICFzYykgeworICAgICAgICAgICAgaWYgKG9wdHMuVEwpCisgICAgICAgICAgICAgICAgJHRoaXMuY3NzKHJhZGl1cyA/ICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJyA6IG1veiA/ICctbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdCcgOiAnLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzJywgd2lkdGggKyAncHgnKTsKKyAgICAgICAgICAgIGlmIChvcHRzLlRSKQorICAgICAgICAgICAgICAgICR0aGlzLmNzcyhyYWRpdXMgPyAnYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMnIDogbW96ID8gJy1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodCcgOiAnLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1cycsIHdpZHRoICsgJ3B4Jyk7CisgICAgICAgICAgICBpZiAob3B0cy5CTCkKKyAgICAgICAgICAgICAgICAkdGhpcy5jc3MocmFkaXVzID8gJ2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnIDogbW96ID8gJy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0JyA6ICctd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnLCB3aWR0aCArICdweCcpOworICAgICAgICAgICAgaWYgKG9wdHMuQlIpCisgICAgICAgICAgICAgICAgJHRoaXMuY3NzKHJhZGl1cyA/ICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cycgOiBtb3ogPyAnLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JyA6ICctd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJywgd2lkdGggKyAncHgnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHN0cmlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgICQoc3RyaXApLmNzcyh7CisgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsCisgICAgICAgICAgICBoZWlnaHQ6ICcxcHgnLAorICAgICAgICAgICAgbWluSGVpZ2h0OiAnMXB4JywKKyAgICAgICAgICAgIGZvbnRTaXplOiAnMXB4JywKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogc2MgfHwgJ3RyYW5zcGFyZW50JywKKyAgICAgICAgICAgIGJvcmRlclN0eWxlOiAnc29saWQnCisgICAgICAgIH0pOworICAgIAorICAgICAgICBwYWQgPSB7CisgICAgICAgICAgICBUOiBwYXJzZUludCgkLmNzcyh0aGlzLCdwYWRkaW5nVG9wJykpfHwwLCAgICAgUjogcGFyc2VJbnQoJC5jc3ModGhpcywncGFkZGluZ1JpZ2h0JykpfHwwLAorICAgICAgICAgICAgQjogcGFyc2VJbnQoJC5jc3ModGhpcywncGFkZGluZ0JvdHRvbScpKXx8MCwgIEw6IHBhcnNlSW50KCQuY3NzKHRoaXMsJ3BhZGRpbmdMZWZ0JykpfHwwCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0eWxlLnpvb20gIT0gdW5kZWZpbmVkKSB0aGlzLnN0eWxlLnpvb20gPSAxOyAvLyBmb3JjZSAnaGFzTGF5b3V0JyBpbiBJRQorICAgICAgICBpZiAoIWtlZXApIHRoaXMuc3R5bGUuYm9yZGVyID0gJ25vbmUnOworICAgICAgICBzdHJpcC5zdHlsZS5ib3JkZXJDb2xvciA9IGNjIHx8IGdwYyh0aGlzLnBhcmVudE5vZGUpOworICAgICAgICBjc3NIZWlnaHQgPSAkKHRoaXMpLm91dGVySGVpZ2h0KCk7CisKKyAgICAgICAgZm9yIChqIGluIGVkZ2VzKSB7CisgICAgICAgICAgICBib3QgPSBlZGdlc1tqXTsKKyAgICAgICAgICAgIC8vIG9ubHkgYWRkIHN0aXBzIGlmIG5lZWRlZAorICAgICAgICAgICAgaWYgKChib3QgJiYgKG9wdHMuQkwgfHwgb3B0cy5CUikpIHx8ICghYm90ICYmIChvcHRzLlRMIHx8IG9wdHMuVFIpKSkgeworICAgICAgICAgICAgICAgIHN0cmlwLnN0eWxlLmJvcmRlclN0eWxlID0gJ25vbmUgJysob3B0c1tqKydSJ10/J3NvbGlkJzonbm9uZScpKycgbm9uZSAnKyhvcHRzW2orJ0wnXT8nc29saWQnOidub25lJyk7CisgICAgICAgICAgICAgICAgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgICAgICAgICAgICQoZCkuYWRkQ2xhc3MoJ2pxdWVyeS1jb3JuZXInKTsKKyAgICAgICAgICAgICAgICBkcyA9IGQuc3R5bGU7CisKKyAgICAgICAgICAgICAgICBib3QgPyB0aGlzLmFwcGVuZENoaWxkKGQpIDogdGhpcy5pbnNlcnRCZWZvcmUoZCwgdGhpcy5maXJzdENoaWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChib3QgJiYgY3NzSGVpZ2h0ICE9ICdhdXRvJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoJC5jc3ModGhpcywncG9zaXRpb24nKSA9PSAnc3RhdGljJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworICAgICAgICAgICAgICAgICAgICBkcy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgICAgICAgICAgICAgICAgIGRzLmJvdHRvbSA9IGRzLmxlZnQgPSBkcy5wYWRkaW5nID0gZHMubWFyZ2luID0gJzAnOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzLnNldEV4cHJlc3Npb24oJ3dpZHRoJywgJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCcpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkcy53aWR0aCA9ICcxMDAlJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWJvdCAmJiAkLmJyb3dzZXIubXNpZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoJC5jc3ModGhpcywncG9zaXRpb24nKSA9PSAnc3RhdGljJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworICAgICAgICAgICAgICAgICAgICBkcy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgICAgICAgICAgICAgICAgIGRzLnRvcCA9IGRzLmxlZnQgPSBkcy5yaWdodCA9IGRzLnBhZGRpbmcgPSBkcy5tYXJnaW4gPSAnMCc7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBmaXggaWU2IHByb2JsZW0gd2hlbiBibG9ja2VkIGVsZW1lbnQgaGFzIGEgYm9yZGVyIHdpZHRoCisgICAgICAgICAgICAgICAgICAgIGlmIChleHByKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidyA9IHN6KHRoaXMsJ2JvcmRlckxlZnRXaWR0aCcpICsgc3oodGhpcywnYm9yZGVyUmlnaHRXaWR0aCcpOworICAgICAgICAgICAgICAgICAgICAgICAgZHMuc2V0RXhwcmVzc2lvbignd2lkdGgnLCAndGhpcy5wYXJlbnROb2RlLm9mZnNldFdpZHRoIC0gJytidysnKyAicHgiJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZHMud2lkdGggPSAnMTAwJSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkcy5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisgICAgICAgICAgICAgICAgICAgIGRzLm1hcmdpbiA9ICFib3QgPyAnLScrcGFkLlQrJ3B4IC0nK3BhZC5SKydweCAnKyhwYWQuVC13aWR0aCkrJ3B4IC0nK3BhZC5MKydweCcgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFkLkItd2lkdGgpKydweCAtJytwYWQuUisncHggLScrcGFkLkIrJ3B4IC0nK3BhZC5MKydweCc7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoMCxnZXRXaWR0aChmeCxpLCB3aWR0aCkpOworICAgICAgICAgICAgICAgICAgICBlID0gc3RyaXAuY2xvbmVOb2RlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZS5zdHlsZS5ib3JkZXJXaWR0aCA9ICcwICcrKG9wdHNbaisnUiddP3c6MCkrJ3B4IDAgJysob3B0c1tqKydMJ10/dzowKSsncHgnOworICAgICAgICAgICAgICAgICAgICBib3QgPyBkLmFwcGVuZENoaWxkKGUpIDogZC5pbnNlcnRCZWZvcmUoZSwgZC5maXJzdENoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGZvbGQgJiYgJC5zdXBwb3J0LmJveE1vZGVsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChib3QgJiYgbm9Cb3R0b21Gb2xkKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIG9wdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0c1tjXSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm90ICYmIChjID09ICdUTCcgfHwgYyA9PSAnVFInKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJvdCAmJiAoYyA9PSAnQkwnIHx8IGMgPT0gJ0JSJykpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24gPSB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBib3JkZXI6ICdub25lJywgbWFyZ2luOiAwLCBwYWRkaW5nOiAwLCBvdmVyZmxvdzogJ2hpZGRlbicsIGJhY2tncm91bmRDb2xvcjogc3RyaXAuc3R5bGUuYm9yZGVyQ29sb3IgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRob3J6ID0gJCgnPGRpdi8+JykuY3NzKGNvbW1vbikuY3NzKHsgd2lkdGg6IHdpZHRoICsgJ3B4JywgaGVpZ2h0OiAnMXB4JyB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUTCc6ICRob3J6LmNzcyh7IGJvdHRvbTogMCwgbGVmdDogMCB9KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUUic6ICRob3J6LmNzcyh7IGJvdHRvbTogMCwgcmlnaHQ6IDAgfSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQkwnOiAkaG9yei5jc3MoeyB0b3A6IDAsIGxlZnQ6IDAgfSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQlInOiAkaG9yei5jc3MoeyB0b3A6IDAsIHJpZ2h0OiAwIH0pOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGQuYXBwZW5kQ2hpbGQoJGhvcnpbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHZlcnQgPSAkKCc8ZGl2Lz4nKS5jc3MoY29tbW9uKS5jc3MoeyB0b3A6IDAsIGJvdHRvbTogMCwgd2lkdGg6ICcxcHgnLCBoZWlnaHQ6IHdpZHRoICsgJ3B4JyB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUTCc6ICR2ZXJ0LmNzcyh7IGxlZnQ6IHdpZHRoIH0pOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RSJzogJHZlcnQuY3NzKHsgcmlnaHQ6IHdpZHRoIH0pOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JMJzogJHZlcnQuY3NzKHsgbGVmdDogd2lkdGggfSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQlInOiAkdmVydC5jc3MoeyByaWdodDogd2lkdGggfSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZC5hcHBlbmRDaGlsZCgkdmVydFswXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKK307CisKKyQuZm4udW5jb3JuZXIgPSBmdW5jdGlvbigpIHsgCisgICAgaWYgKHJhZGl1cyB8fCBtb3ogfHwgd2Via2l0KQorICAgICAgICB0aGlzLmNzcyhyYWRpdXMgPyAnYm9yZGVyLXJhZGl1cycgOiBtb3ogPyAnLW1vei1ib3JkZXItcmFkaXVzJyA6ICctd2Via2l0LWJvcmRlci1yYWRpdXMnLCAwKTsKKyAgICAkKCdkaXYuanF1ZXJ5LWNvcm5lcicsIHRoaXMpLnJlbW92ZSgpOworICAgIHJldHVybiB0aGlzOworfTsKKworLy8gZXhwb3NlIG9wdGlvbnMKKyQuZm4uY29ybmVyLmRlZmF1bHRzID0geworICAgIHVzZU5hdGl2ZTogdHJ1ZSwgLy8gdHJ1ZSBpZiBwbHVnaW4gc2hvdWxkIGF0dGVtcHQgdG8gdXNlIG5hdGl2ZSBicm93c2VyIHN1cHBvcnQgZm9yIGJvcmRlciByYWRpdXMgcm91bmRpbmcKKyAgICBtZXRhQXR0cjogICdkYXRhLWNvcm5lcicgLy8gbmFtZSBvZiBtZXRhIGF0dHJpYnV0ZSB0byB1c2UgZm9yIG9wdGlvbnMKK307CisgICAgCit9KShqUXVlcnkpOwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2pxdWVyeS0xLjQuMi1taW4uanMgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvanF1ZXJ5LTEuNC4yLW1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI0MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2pxdWVyeS0xLjQuMi1taW4uanMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIQorICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2MS40LjIKKyAqIGh0dHA6Ly9qcXVlcnkuY29tLworICoKKyAqIENvcHlyaWdodCAyMDEwLCBKb2huIFJlc2lnCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisgKiBJbmNsdWRlcyBTaXp6bGUuanMKKyAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCisgKiBDb3B5cmlnaHQgMjAxMCwgVGhlIERvam8gRm91bmRhdGlvbgorICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgorICoKKyAqIERhdGU6IFNhdCBGZWIgMTMgMjI6MzM6NDggMjAxMCAtMDUwMAorICovCisoZnVuY3Rpb24oQSx3KXtmdW5jdGlvbiBtYSgpe2lmKCFjLmlzUmVhZHkpe3RyeXtzLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQobWEsMSk7cmV0dXJufWMucmVhZHkoKX19ZnVuY3Rpb24gUWEoYSxiKXtiLnNyYz9jLmFqYXgoe3VybDpiLnNyYyxhc3luYzpmYWxzZSxkYXRhVHlwZToic2NyaXB0In0pOmMuZ2xvYmFsRXZhbChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIik7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gWChhLGIsZCxmLGUsail7dmFyIGk9YS5sZW5ndGg7aWYodHlwZW9mIGI9PT0ib2JqZWN0Iil7Zm9yKHZhciBvIGluIGIpWChhLG8sYltvXSxmLGUsZCk7cmV0dXJuIGF9aWYoZCE9PXcpe2Y9IWomJmYmJmMuaXNGdW5jdGlvbihkKTtmb3Iobz0wO288aTtvKyspZShhW29dLGIsZj9kLmNhbGwoYVtvXSxvLGUoYVtvXSxiKSk6ZCxqKTtyZXR1cm4gYX1yZXR1cm4gaT8KK2UoYVswXSxiKTp3fWZ1bmN0aW9uIEooKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX1mdW5jdGlvbiBZKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIFooKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBuYShhLGIsZCl7ZFswXS50eXBlPWE7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KGIsZCl9ZnVuY3Rpb24gb2EoYSl7dmFyIGIsZD1bXSxmPVtdLGU9YXJndW1lbnRzLGosaSxvLGssbixyO2k9Yy5kYXRhKHRoaXMsImV2ZW50cyIpO2lmKCEoYS5saXZlRmlyZWQ9PT10aGlzfHwhaXx8IWkubGl2ZXx8YS5idXR0b24mJmEudHlwZT09PSJjbGljayIpKXthLmxpdmVGaXJlZD10aGlzO3ZhciB1PWkubGl2ZS5zbGljZSgwKTtmb3Ioaz0wO2s8dS5sZW5ndGg7aysrKXtpPXVba107aS5vcmlnVHlwZS5yZXBsYWNlKE8sIiIpPT09YS50eXBlP2YucHVzaChpLnNlbGVjdG9yKTp1LnNwbGljZShrLS0sMSl9aj1jKGEudGFyZ2V0KS5jbG9zZXN0KGYsYS5jdXJyZW50VGFyZ2V0KTtuPTA7Zm9yKHI9CitqLmxlbmd0aDtuPHI7bisrKWZvcihrPTA7azx1Lmxlbmd0aDtrKyspe2k9dVtrXTtpZihqW25dLnNlbGVjdG9yPT09aS5zZWxlY3Rvcil7bz1qW25dLmVsZW07Zj1udWxsO2lmKGkucHJlVHlwZT09PSJtb3VzZWVudGVyInx8aS5wcmVUeXBlPT09Im1vdXNlbGVhdmUiKWY9YyhhLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoaS5zZWxlY3RvcilbMF07aWYoIWZ8fGYhPT1vKWQucHVzaCh7ZWxlbTpvLGhhbmRsZU9iajppfSl9fW49MDtmb3Iocj1kLmxlbmd0aDtuPHI7bisrKXtqPWRbbl07YS5jdXJyZW50VGFyZ2V0PWouZWxlbTthLmRhdGE9ai5oYW5kbGVPYmouZGF0YTthLmhhbmRsZU9iaj1qLmhhbmRsZU9iajtpZihqLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShqLmVsZW0sZSk9PT1mYWxzZSl7Yj1mYWxzZTticmVha319cmV0dXJuIGJ9fWZ1bmN0aW9uIHBhKGEsYil7cmV0dXJuImxpdmUuIisoYSYmYSE9PSIqIj9hKyIuIjoiIikrYi5yZXBsYWNlKC9cLi9nLCJgIikucmVwbGFjZSgvIC9nLAorIiYiKX1mdW5jdGlvbiBxYShhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gcmEoYSxiKXt2YXIgZD0wO2IuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWU9PT0oYVtkXSYmYVtkXS5ub2RlTmFtZSkpe3ZhciBmPWMuZGF0YShhW2QrK10pLGU9Yy5kYXRhKHRoaXMsZik7aWYoZj1mJiZmLmV2ZW50cyl7ZGVsZXRlIGUuaGFuZGxlO2UuZXZlbnRzPXt9O2Zvcih2YXIgaiBpbiBmKWZvcih2YXIgaSBpbiBmW2pdKWMuZXZlbnQuYWRkKHRoaXMsaixmW2pdW2ldLGZbal1baV0uZGF0YSl9fX0pfWZ1bmN0aW9uIHNhKGEsYixkKXt2YXIgZixlLGo7Yj1iJiZiWzBdP2JbMF0ub3duZXJEb2N1bWVudHx8YlswXTpzO2lmKGEubGVuZ3RoPT09MSYmdHlwZW9mIGFbMF09PT0ic3RyaW5nIiYmYVswXS5sZW5ndGg8NTEyJiZiPT09cyYmIXRhLnRlc3QoYVswXSkmJihjLnN1cHBvcnQuY2hlY2tDbG9uZXx8IXVhLnRlc3QoYVswXSkpKXtlPQordHJ1ZTtpZihqPWMuZnJhZ21lbnRzW2FbMF1dKWlmKGohPT0xKWY9an1pZighZil7Zj1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjLmNsZWFuKGEsYixmLGQpfWlmKGUpYy5mcmFnbWVudHNbYVswXV09aj9mOjE7cmV0dXJue2ZyYWdtZW50OmYsY2FjaGVhYmxlOmV9fWZ1bmN0aW9uIEsoYSxiKXt2YXIgZD17fTtjLmVhY2godmEuY29uY2F0LmFwcGx5KFtdLHZhLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7ZFt0aGlzXT1hfSk7cmV0dXJuIGR9ZnVuY3Rpb24gd2EoYSl7cmV0dXJuInNjcm9sbFRvImluIGEmJmEuZG9jdW1lbnQ/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzpmYWxzZX12YXIgYz1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgYy5mbi5pbml0KGEsYil9LFJhPUEualF1ZXJ5LFNhPUEuJCxzPUEuZG9jdW1lbnQsVCxUYT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XiMoW1x3LV0rKSQvLFVhPS9eLlteOiNcW1wuLF0qJC8sVmE9L1xTLywKK1dhPS9eKFxzfFx1MDBBMCkrfChcc3xcdTAwQTApKyQvZyxYYT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLFA9bmF2aWdhdG9yLnVzZXJBZ2VudCx4YT1mYWxzZSxRPVtdLEwsJD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGFhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYmE9QXJyYXkucHJvdG90eXBlLnB1c2gsUj1BcnJheS5wcm90b3R5cGUuc2xpY2UseWE9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y7Yy5mbj1jLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBkLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YTt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFiKXt0aGlzLmNvbnRleHQ9czt0aGlzWzBdPXMuYm9keTt0aGlzLnNlbGVjdG9yPSJib2R5Ijt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoKGQ9VGEuZXhlYyhhKSkmJgorKGRbMV18fCFiKSlpZihkWzFdKXtmPWI/Yi5vd25lckRvY3VtZW50fHxiOnM7aWYoYT1YYS5leGVjKGEpKWlmKGMuaXNQbGFpbk9iamVjdChiKSl7YT1bcy5jcmVhdGVFbGVtZW50KGFbMV0pXTtjLmZuLmF0dHIuY2FsbChhLGIsdHJ1ZSl9ZWxzZSBhPVtmLmNyZWF0ZUVsZW1lbnQoYVsxXSldO2Vsc2V7YT1zYShbZFsxXV0sW2ZdKTthPShhLmNhY2hlYWJsZT9hLmZyYWdtZW50LmNsb25lTm9kZSh0cnVlKTphLmZyYWdtZW50KS5jaGlsZE5vZGVzfXJldHVybiBjLm1lcmdlKHRoaXMsYSl9ZWxzZXtpZihiPXMuZ2V0RWxlbWVudEJ5SWQoZFsyXSkpe2lmKGIuaWQhPT1kWzJdKXJldHVybiBULmZpbmQoYSk7dGhpcy5sZW5ndGg9MTt0aGlzWzBdPWJ9dGhpcy5jb250ZXh0PXM7dGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfWVsc2UgaWYoIWImJi9eXHcrJC8udGVzdChhKSl7dGhpcy5zZWxlY3Rvcj1hO3RoaXMuY29udGV4dD1zO2E9cy5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtyZXR1cm4gYy5tZXJnZSh0aGlzLAorYSl9ZWxzZSByZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fFQpLmZpbmQoYSk6YyhiKS5maW5kKGEpO2Vsc2UgaWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiBULnJlYWR5KGEpO2lmKGEuc2VsZWN0b3IhPT13KXt0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3I7dGhpcy5jb250ZXh0PWEuY29udGV4dH1yZXR1cm4gYy5tYWtlQXJyYXkoYSx0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjQuMiIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBSLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzLnNsaWNlKGEpWzBdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsZCl7dmFyIGY9YygpO2MuaXNBcnJheShhKT9iYS5hcHBseShmLGEpOmMubWVyZ2UoZixhKTtmLnByZXZPYmplY3Q9dGhpcztmLmNvbnRleHQ9dGhpcy5jb250ZXh0O2lmKGI9PT0KKyJmaW5kIilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStkO2Vsc2UgaWYoYilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2QrIikiO3JldHVybiBmfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2MuYmluZFJlYWR5KCk7aWYoYy5pc1JlYWR5KWEuY2FsbChzLGMpO2Vsc2UgUSYmUS5wdXNoKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLFIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5tYXAodGhpcywKK2Z1bmN0aW9uKGIsZCl7cmV0dXJuIGEuY2FsbChiLGQsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fGMobnVsbCl9LHB1c2g6YmEsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9O2MuZm4uaW5pdC5wcm90b3R5cGU9Yy5mbjtjLmV4dGVuZD1jLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXXx8e30sYj0xLGQ9YXJndW1lbnRzLmxlbmd0aCxmPWZhbHNlLGUsaixpLG87aWYodHlwZW9mIGE9PT0iYm9vbGVhbiIpe2Y9YTthPWFyZ3VtZW50c1sxXXx8e307Yj0yfWlmKHR5cGVvZiBhIT09Im9iamVjdCImJiFjLmlzRnVuY3Rpb24oYSkpYT17fTtpZihkPT09Yil7YT10aGlzOy0tYn1mb3IoO2I8ZDtiKyspaWYoKGU9YXJndW1lbnRzW2JdKSE9bnVsbClmb3IoaiBpbiBlKXtpPWFbal07bz1lW2pdO2lmKGEhPT1vKWlmKGYmJm8mJihjLmlzUGxhaW5PYmplY3Qobyl8fGMuaXNBcnJheShvKSkpe2k9aSYmKGMuaXNQbGFpbk9iamVjdChpKXx8CitjLmlzQXJyYXkoaSkpP2k6Yy5pc0FycmF5KG8pP1tdOnt9O2Fbal09Yy5leHRlbmQoZixpLG8pfWVsc2UgaWYobyE9PXcpYVtqXT1vfXJldHVybiBhfTtjLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihhKXtBLiQ9U2E7aWYoYSlBLmpRdWVyeT1SYTtyZXR1cm4gY30saXNSZWFkeTpmYWxzZSxyZWFkeTpmdW5jdGlvbigpe2lmKCFjLmlzUmVhZHkpe2lmKCFzLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoYy5yZWFkeSwxMyk7Yy5pc1JlYWR5PXRydWU7aWYoUSl7Zm9yKHZhciBhLGI9MDthPVFbYisrXTspYS5jYWxsKHMsYyk7UT1udWxsfWMuZm4udHJpZ2dlckhhbmRsZXImJmMocykudHJpZ2dlckhhbmRsZXIoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZigheGEpe3hhPXRydWU7aWYocy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gYy5yZWFkeSgpO2lmKHMuYWRkRXZlbnRMaXN0ZW5lcil7cy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwKK0wsZmFsc2UpO0EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYy5yZWFkeSxmYWxzZSl9ZWxzZSBpZihzLmF0dGFjaEV2ZW50KXtzLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEwpO0EuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYy5yZWFkeSk7dmFyIGE9ZmFsc2U7dHJ5e2E9QS5mcmFtZUVsZW1lbnQ9PW51bGx9Y2F0Y2goYil7fXMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZhJiZtYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LGlzQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEFycmF5XSJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fCQuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0ifHxhLm5vZGVUeXBlfHxhLnNldEludGVydmFsKXJldHVybiBmYWxzZTtpZihhLmNvbnN0cnVjdG9yJiYhYWEuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhYWEuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwKKyJpc1Byb3RvdHlwZU9mIikpcmV0dXJuIGZhbHNlO3ZhciBiO2ZvcihiIGluIGEpO3JldHVybiBiPT09d3x8YWEuY2FsbChhLGIpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LHBhcnNlSlNPTjpmdW5jdGlvbihhKXtpZih0eXBlb2YgYSE9PSJzdHJpbmcifHwhYSlyZXR1cm4gbnVsbDthPWMudHJpbShhKTtpZigvXltcXSw6e31cc10qJC8udGVzdChhLnJlcGxhY2UoL1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZywiQCIpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCJdIikucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCIiKSkpcmV0dXJuIEEuSlNPTiYmQS5KU09OLnBhcnNlP0EuSlNPTi5wYXJzZShhKToobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIisKK2EpKSgpO2Vsc2UgYy5lcnJvcigiSW52YWxpZCBKU09OOiAiK2EpfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe2lmKGEmJlZhLnRlc3QoYSkpe3ZhciBiPXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8cy5kb2N1bWVudEVsZW1lbnQsZD1zLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2QudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtpZihjLnN1cHBvcnQuc2NyaXB0RXZhbClkLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoYSkpO2Vsc2UgZC50ZXh0PWE7Yi5pbnNlcnRCZWZvcmUoZCxiLmZpcnN0Q2hpbGQpO2IucmVtb3ZlQ2hpbGQoZCl9fSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGU9MCxqPWEubGVuZ3RoLGk9aj09PXd8fGMuaXNGdW5jdGlvbihhKTtpZihkKWlmKGkpZm9yKGYgaW4gYSl7aWYoYi5hcHBseShhW2ZdLAorZCk9PT1mYWxzZSlicmVha31lbHNlIGZvcig7ZTxqOyl7aWYoYi5hcHBseShhW2UrK10sZCk9PT1mYWxzZSlicmVha31lbHNlIGlmKGkpZm9yKGYgaW4gYSl7aWYoYi5jYWxsKGFbZl0sZixhW2ZdKT09PWZhbHNlKWJyZWFrfWVsc2UgZm9yKGQ9YVswXTtlPGomJmIuY2FsbChkLGUsZCkhPT1mYWxzZTtkPWFbKytlXSk7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKFdhLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtpZihhIT1udWxsKWEubGVuZ3RoPT1udWxsfHx0eXBlb2YgYT09PSJzdHJpbmcifHxjLmlzRnVuY3Rpb24oYSl8fHR5cGVvZiBhIT09ImZ1bmN0aW9uIiYmYS5zZXRJbnRlcnZhbD9iYS5jYWxsKGIsYSk6Yy5tZXJnZShiLGEpO3JldHVybiBifSxpbkFycmF5OmZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKXJldHVybiBiLmluZGV4T2YoYSk7Zm9yKHZhciBkPTAsZj1iLmxlbmd0aDtkPGY7ZCsrKWlmKGJbZF09PT0KK2EpcmV0dXJuIGQ7cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5sZW5ndGgsZj0wO2lmKHR5cGVvZiBiLmxlbmd0aD09PSJudW1iZXIiKWZvcih2YXIgZT1iLmxlbmd0aDtmPGU7ZisrKWFbZCsrXT1iW2ZdO2Vsc2UgZm9yKDtiW2ZdIT09dzspYVtkKytdPWJbZisrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGY9W10sZT0wLGo9YS5sZW5ndGg7ZTxqO2UrKykhZCE9PSFiKGFbZV0sZSkmJmYucHVzaChhW2VdKTtyZXR1cm4gZn0sbWFwOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGY9W10sZSxqPTAsaT1hLmxlbmd0aDtqPGk7aisrKXtlPWIoYVtqXSxqLGQpO2lmKGUhPW51bGwpZltmLmxlbmd0aF09ZX1yZXR1cm4gZi5jb25jYXQuYXBwbHkoW10sZil9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIsZCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpaWYodHlwZW9mIGI9PT0ic3RyaW5nIil7ZD1hO2E9ZFtiXTtiPXd9ZWxzZSBpZihiJiYKKyFjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPXd9aWYoIWImJmEpYj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGR8fHRoaXMsYXJndW1lbnRzKX07aWYoYSliLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8Yi5ndWlkfHxjLmd1aWQrKztyZXR1cm4gYn0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTthPS8od2Via2l0KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKG1zaWUpIChbXHcuXSspLy5leGVjKGEpfHwhL2NvbXBhdGlibGUvLnRlc3QoYSkmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8uZXhlYyhhKXx8W107cmV0dXJue2Jyb3dzZXI6YVsxXXx8IiIsdmVyc2lvbjphWzJdfHwiMCJ9fSxicm93c2VyOnt9fSk7UD1jLnVhTWF0Y2goUCk7aWYoUC5icm93c2VyKXtjLmJyb3dzZXJbUC5icm93c2VyXT10cnVlO2MuYnJvd3Nlci52ZXJzaW9uPVAudmVyc2lvbn1pZihjLmJyb3dzZXIud2Via2l0KWMuYnJvd3Nlci5zYWZhcmk9Cit0cnVlO2lmKHlhKWMuaW5BcnJheT1mdW5jdGlvbihhLGIpe3JldHVybiB5YS5jYWxsKGIsYSl9O1Q9YyhzKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpTD1mdW5jdGlvbigpe3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsTCxmYWxzZSk7Yy5yZWFkeSgpfTtlbHNlIGlmKHMuYXR0YWNoRXZlbnQpTD1mdW5jdGlvbigpe2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe3MuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsTCk7Yy5yZWFkeSgpfX07KGZ1bmN0aW9uKCl7Yy5zdXBwb3J0PXt9O3ZhciBhPXMuZG9jdW1lbnRFbGVtZW50LGI9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksZj0ic2NyaXB0IitKKCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7Cit2YXIgZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksaj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoISghZXx8IWUubGVuZ3RofHwhaikpe2Muc3VwcG9ydD17bGVhZGluZ1doaXRlc3BhY2U6ZC5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3JlZC8udGVzdChqLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ai5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUkLy50ZXN0KGouc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFqLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6cy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChzLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKS5zZWxlY3RlZCwKK3BhcmVudE5vZGU6ZC5yZW1vdmVDaGlsZChkLmFwcGVuZENoaWxkKHMuY3JlYXRlRWxlbWVudCgiZGl2IikpKS5wYXJlbnROb2RlPT09bnVsbCxkZWxldGVFeHBhbmRvOnRydWUsY2hlY2tDbG9uZTpmYWxzZSxzY3JpcHRFdmFsOmZhbHNlLG5vQ2xvbmVFdmVudDp0cnVlLGJveE1vZGVsOm51bGx9O2IudHlwZT0idGV4dC9qYXZhc2NyaXB0Ijt0cnl7Yi5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJ3aW5kb3cuIitmKyI9MTsiKSl9Y2F0Y2goaSl7fWEuaW5zZXJ0QmVmb3JlKGIsYS5maXJzdENoaWxkKTtpZihBW2ZdKXtjLnN1cHBvcnQuc2NyaXB0RXZhbD10cnVlO2RlbGV0ZSBBW2ZdfXRyeXtkZWxldGUgYi50ZXN0fWNhdGNoKG8pe2Muc3VwcG9ydC5kZWxldGVFeHBhbmRvPWZhbHNlfWEucmVtb3ZlQ2hpbGQoYik7aWYoZC5hdHRhY2hFdmVudCYmZC5maXJlRXZlbnQpe2QuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uIGsoKXtjLnN1cHBvcnQubm9DbG9uZUV2ZW50PQorZmFsc2U7ZC5kZXRhY2hFdmVudCgib25jbGljayIsayl9KTtkLmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKX1kPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0ncmFkaW90ZXN0JyBjaGVja2VkPSdjaGVja2VkJy8+IjthPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuYXBwZW5kQ2hpbGQoZC5maXJzdENoaWxkKTtjLnN1cHBvcnQuY2hlY2tDbG9uZT1hLmNsb25lTm9kZSh0cnVlKS5jbG9uZU5vZGUodHJ1ZSkubGFzdENoaWxkLmNoZWNrZWQ7YyhmdW5jdGlvbigpe3ZhciBrPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ay5zdHlsZS53aWR0aD1rLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiO3MuYm9keS5hcHBlbmRDaGlsZChrKTtjLmJveE1vZGVsPWMuc3VwcG9ydC5ib3hNb2RlbD1rLm9mZnNldFdpZHRoPT09MjtzLmJvZHkucmVtb3ZlQ2hpbGQoaykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTthPWZ1bmN0aW9uKGspe3ZhciBuPQorcy5jcmVhdGVFbGVtZW50KCJkaXYiKTtrPSJvbiIrazt2YXIgcj1rIGluIG47aWYoIXIpe24uc2V0QXR0cmlidXRlKGssInJldHVybjsiKTtyPXR5cGVvZiBuW2tdPT09ImZ1bmN0aW9uIn1yZXR1cm4gcn07Yy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXM9YSgic3VibWl0Iik7Yy5zdXBwb3J0LmNoYW5nZUJ1YmJsZXM9YSgiY2hhbmdlIik7YT1iPWQ9ZT1qPW51bGx9fSkoKTtjLnByb3BzPXsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixyZWFkb25seToicmVhZE9ubHkiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHRhYmluZGV4OiJ0YWJJbmRleCIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciJ9O3ZhciBHPSJqUXVlcnkiK0ooKSxZYT0wLHphPXt9O2MuZXh0ZW5kKHtjYWNoZTp7fSxleHBhbmRvOkcsbm9EYXRhOntlbWJlZDp0cnVlLG9iamVjdDp0cnVlLAorYXBwbGV0OnRydWV9LGRhdGE6ZnVuY3Rpb24oYSxiLGQpe2lmKCEoYS5ub2RlTmFtZSYmYy5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe2E9YT09QT96YTphO3ZhciBmPWFbR10sZT1jLmNhY2hlO2lmKCFmJiZ0eXBlb2YgYj09PSJzdHJpbmciJiZkPT09dylyZXR1cm4gbnVsbDtmfHwoZj0rK1lhKTtpZih0eXBlb2YgYj09PSJvYmplY3QiKXthW0ddPWY7ZVtmXT1jLmV4dGVuZCh0cnVlLHt9LGIpfWVsc2UgaWYoIWVbZl0pe2FbR109ZjtlW2ZdPXt9fWE9ZVtmXTtpZihkIT09dylhW2JdPWQ7cmV0dXJuIHR5cGVvZiBiPT09InN0cmluZyI/YVtiXTphfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe2lmKCEoYS5ub2RlTmFtZSYmYy5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe2E9YT09QT96YTphO3ZhciBkPWFbR10sZj1jLmNhY2hlLGU9ZltkXTtpZihiKXtpZihlKXtkZWxldGUgZVtiXTtjLmlzRW1wdHlPYmplY3QoZSkmJmMucmVtb3ZlRGF0YShhKX19ZWxzZXtpZihjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbylkZWxldGUgYVtjLmV4cGFuZG9dOworZWxzZSBhLnJlbW92ZUF0dHJpYnV0ZSYmYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZltkXX19fX0pO2MuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0idW5kZWZpbmVkIiYmdGhpcy5sZW5ndGgpcmV0dXJuIGMuZGF0YSh0aGlzWzBdKTtlbHNlIGlmKHR5cGVvZiBhPT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLGEpfSk7dmFyIGQ9YS5zcGxpdCgiLiIpO2RbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihiPT09dyl7dmFyIGY9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKTtpZihmPT09dyYmdGhpcy5sZW5ndGgpZj1jLmRhdGEodGhpc1swXSxhKTtyZXR1cm4gZj09PXcmJmRbMV0/dGhpcy5kYXRhKGRbMF0pOmZ9ZWxzZSByZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIitkWzFdKyIhIixbZFswXSxiXSkuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLAorYSxiKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pO2MuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsZCl7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIjt2YXIgZj1jLmRhdGEoYSxiKTtpZighZClyZXR1cm4gZnx8W107aWYoIWZ8fGMuaXNBcnJheShkKSlmPWMuZGF0YShhLGIsYy5tYWtlQXJyYXkoZCkpO2Vsc2UgZi5wdXNoKGQpO3JldHVybiBmfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgZD1jLnF1ZXVlKGEsYiksZj1kLnNoaWZ0KCk7aWYoZj09PSJpbnByb2dyZXNzIilmPWQuc2hpZnQoKTtpZihmKXtiPT09ImZ4IiYmZC51bnNoaWZ0KCJpbnByb2dyZXNzIik7Zi5jYWxsKGEsZnVuY3Rpb24oKXtjLmRlcXVldWUoYSxiKX0pfX19KTtjLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYSE9PSJzdHJpbmciKXtiPWE7YT0iZngifWlmKGI9PT0KK3cpcmV0dXJuIGMucXVldWUodGhpc1swXSxhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Yy5xdWV1ZSh0aGlzLGEsYik7YT09PSJmeCImJmRbMF0hPT0iaW5wcm9ncmVzcyImJmMuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1jLmZ4P2MuZnguc3BlZWRzW2FdfHxhOmE7Yj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmRlcXVldWUoZCxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX19KTt2YXIgQWE9L1tcblx0XS9nLGNhPS9ccysvLFphPS9cci9nLCRhPS9ocmVmfHNyY3xzdHlsZS8sYWI9LyhidXR0b258aW5wdXQpL2ksYmI9LyhidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkvaSwKK2NiPS9eKGF8YXJlYSkkL2ksQmE9L3JhZGlvfGNoZWNrYm94LztjLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBYKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyxuLHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChjYSksZD0wLGY9dGhpcy5sZW5ndGg7ZDxmO2QrKyl7dmFyIGU9dGhpc1tkXTtpZihlLm5vZGVUeXBlPT09MSlpZihlLmNsYXNzTmFtZSl7Zm9yKHZhciBqPSIgIitlLmNsYXNzTmFtZSsiICIsCitpPWUuY2xhc3NOYW1lLG89MCxrPWIubGVuZ3RoO288aztvKyspaWYoai5pbmRleE9mKCIgIitiW29dKyIgIik8MClpKz0iICIrYltvXTtlLmNsYXNzTmFtZT1jLnRyaW0oaSl9ZWxzZSBlLmNsYXNzTmFtZT1hfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihrKXt2YXIgbj1jKHRoaXMpO24ucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsayxuLmF0dHIoImNsYXNzIikpKX0pO2lmKGEmJnR5cGVvZiBhPT09InN0cmluZyJ8fGE9PT13KWZvcih2YXIgYj0oYXx8IiIpLnNwbGl0KGNhKSxkPTAsZj10aGlzLmxlbmd0aDtkPGY7ZCsrKXt2YXIgZT10aGlzW2RdO2lmKGUubm9kZVR5cGU9PT0xJiZlLmNsYXNzTmFtZSlpZihhKXtmb3IodmFyIGo9KCIgIitlLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoQWEsIiAiKSxpPTAsbz1iLmxlbmd0aDtpPG87aSsrKWo9ai5yZXBsYWNlKCIgIitiW2ldKyIgIiwKKyIgIik7ZS5jbGFzc05hbWU9Yy50cmltKGopfWVsc2UgZS5jbGFzc05hbWU9IiJ9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGEsZj10eXBlb2YgYj09PSJib29sZWFuIjtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgaj1jKHRoaXMpO2oudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsZSxqLmF0dHIoImNsYXNzIiksYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoZD09PSJzdHJpbmciKWZvcih2YXIgZSxqPTAsaT1jKHRoaXMpLG89YixrPWEuc3BsaXQoY2EpO2U9a1tqKytdOyl7bz1mP286IWkuaGFzQ2xhc3MoZSk7aVtvPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihkPT09InVuZGVmaW5lZCJ8fGQ9PT0iYm9vbGVhbiIpe3RoaXMuY2xhc3NOYW1lJiZjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpO3RoaXMuY2xhc3NOYW1lPQordGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKEFhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZihhPT09dyl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXJldHVybihiLmF0dHJpYnV0ZXMudmFsdWV8fHt9KS5zcGVjaWZpZWQ/Yi52YWx1ZTpiLnRleHQ7aWYoYy5ub2RlTmFtZShiLCJzZWxlY3QiKSl7dmFyIGQ9Yi5zZWxlY3RlZEluZGV4LGY9W10sZT1iLm9wdGlvbnM7Yj1iLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZDwwKXJldHVybiBudWxsO3ZhciBqPWI/ZDowO2ZvcihkPWI/ZCsxOmUubGVuZ3RoO2o8ZDtqKyspe3ZhciBpPQorZVtqXTtpZihpLnNlbGVjdGVkKXthPWMoaSkudmFsKCk7aWYoYilyZXR1cm4gYTtmLnB1c2goYSl9fXJldHVybiBmfWlmKEJhLnRlc3QoYi50eXBlKSYmIWMuc3VwcG9ydC5jaGVja09uKXJldHVybiBiLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjpiLnZhbHVlO3JldHVybihiLnZhbHVlfHwiIikucmVwbGFjZShaYSwiIil9cmV0dXJuIHd9dmFyIG89Yy5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oayl7dmFyIG49Yyh0aGlzKSxyPWE7aWYodGhpcy5ub2RlVHlwZT09PTEpe2lmKG8pcj1hLmNhbGwodGhpcyxrLG4udmFsKCkpO2lmKHR5cGVvZiByPT09Im51bWJlciIpcis9IiI7aWYoYy5pc0FycmF5KHIpJiZCYS50ZXN0KHRoaXMudHlwZSkpdGhpcy5jaGVja2VkPWMuaW5BcnJheShuLnZhbCgpLHIpPj0wO2Vsc2UgaWYoYy5ub2RlTmFtZSh0aGlzLCJzZWxlY3QiKSl7dmFyIHU9Yy5tYWtlQXJyYXkocik7Yygib3B0aW9uIix0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0KK2MuaW5BcnJheShjKHRoaXMpLnZhbCgpLHUpPj0wfSk7aWYoIXUubGVuZ3RoKXRoaXMuc2VsZWN0ZWRJbmRleD0tMX1lbHNlIHRoaXMudmFsdWU9cn19KX19KTtjLmV4dGVuZCh7YXR0ckZuOnt2YWw6dHJ1ZSxjc3M6dHJ1ZSxodG1sOnRydWUsdGV4dDp0cnVlLGRhdGE6dHJ1ZSx3aWR0aDp0cnVlLGhlaWdodDp0cnVlLG9mZnNldDp0cnVlfSxhdHRyOmZ1bmN0aW9uKGEsYixkLGYpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIHc7aWYoZiYmYiBpbiBjLmF0dHJGbilyZXR1cm4gYyhhKVtiXShkKTtmPWEubm9kZVR5cGUhPT0xfHwhYy5pc1hNTERvYyhhKTt2YXIgZT1kIT09dztiPWYmJmMucHJvcHNbYl18fGI7aWYoYS5ub2RlVHlwZT09PTEpe3ZhciBqPSRhLnRlc3QoYik7aWYoYiBpbiBhJiZmJiYhail7aWYoZSl7Yj09PSJ0eXBlIiYmYWIudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlJiZjLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTsKK2FbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJmIuc3BlY2lmaWVkP2IudmFsdWU6YmIudGVzdChhLm5vZGVOYW1lKXx8Y2IudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6dztyZXR1cm4gYVtiXX1pZighYy5zdXBwb3J0LnN0eWxlJiZmJiZiPT09InN0eWxlIil7aWYoZSlhLnN0eWxlLmNzc1RleHQ9IiIrZDtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fWUmJmEuc2V0QXR0cmlidXRlKGIsIiIrZCk7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZmJiZqP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP3c6YX1yZXR1cm4gYy5zdHlsZShhLGIsZCl9fSk7dmFyIE89L1wuKC4qKSQvLGRiPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1teXHdcc1wuXHxgXS9nLAorZnVuY3Rpb24oYil7cmV0dXJuIlxcIitifSl9O2MuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGIsZCxmKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe2lmKGEuc2V0SW50ZXJ2YWwmJmEhPT1BJiYhYS5mcmFtZUVsZW1lbnQpYT1BO3ZhciBlLGo7aWYoZC5oYW5kbGVyKXtlPWQ7ZD1lLmhhbmRsZXJ9aWYoIWQuZ3VpZClkLmd1aWQ9Yy5ndWlkKys7aWYoaj1jLmRhdGEoYSkpe3ZhciBpPWouZXZlbnRzPWouZXZlbnRzfHx7fSxvPWouaGFuZGxlO2lmKCFvKWouaGFuZGxlPW89ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIGMhPT0idW5kZWZpbmVkIiYmIWMuZXZlbnQudHJpZ2dlcmVkP2MuZXZlbnQuaGFuZGxlLmFwcGx5KG8uZWxlbSxhcmd1bWVudHMpOnd9O28uZWxlbT1hO2I9Yi5zcGxpdCgiICIpO2Zvcih2YXIgayxuPTAscjtrPWJbbisrXTspe2o9ZT9jLmV4dGVuZCh7fSxlKTp7aGFuZGxlcjpkLGRhdGE6Zn07aWYoay5pbmRleE9mKCIuIik+LTEpe3I9ay5zcGxpdCgiLiIpOworaz1yLnNoaWZ0KCk7ai5uYW1lc3BhY2U9ci5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpfWVsc2V7cj1bXTtqLm5hbWVzcGFjZT0iIn1qLnR5cGU9aztqLmd1aWQ9ZC5ndWlkO3ZhciB1PWlba10sej1jLmV2ZW50LnNwZWNpYWxba118fHt9O2lmKCF1KXt1PWlba109W107aWYoIXouc2V0dXB8fHouc2V0dXAuY2FsbChhLGYscixvKT09PWZhbHNlKWlmKGEuYWRkRXZlbnRMaXN0ZW5lcilhLmFkZEV2ZW50TGlzdGVuZXIoayxvLGZhbHNlKTtlbHNlIGEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitrLG8pfWlmKHouYWRkKXt6LmFkZC5jYWxsKGEsaik7aWYoIWouaGFuZGxlci5ndWlkKWouaGFuZGxlci5ndWlkPWQuZ3VpZH11LnB1c2goaik7Yy5ldmVudC5nbG9iYWxba109dHJ1ZX1hPW51bGx9fX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsZCxmKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe3ZhciBlLGo9MCxpLG8sayxuLHIsdSx6PWMuZGF0YShhKSwKK0M9eiYmei5ldmVudHM7aWYoeiYmQyl7aWYoYiYmYi50eXBlKXtkPWIuaGFuZGxlcjtiPWIudHlwZX1pZighYnx8dHlwZW9mIGI9PT0ic3RyaW5nIiYmYi5jaGFyQXQoMCk9PT0iLiIpe2I9Ynx8IiI7Zm9yKGUgaW4gQyljLmV2ZW50LnJlbW92ZShhLGUrYil9ZWxzZXtmb3IoYj1iLnNwbGl0KCIgIik7ZT1iW2orK107KXtuPWU7aT1lLmluZGV4T2YoIi4iKTwwO289W107aWYoIWkpe289ZS5zcGxpdCgiLiIpO2U9by5zaGlmdCgpO2s9bmV3IFJlZ0V4cCgiKF58XFwuKSIrYy5tYXAoby5zbGljZSgwKS5zb3J0KCksZGIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWlmKHI9Q1tlXSlpZihkKXtuPWMuZXZlbnQuc3BlY2lhbFtlXXx8e307Zm9yKEI9Znx8MDtCPHIubGVuZ3RoO0IrKyl7dT1yW0JdO2lmKGQuZ3VpZD09PXUuZ3VpZCl7aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Zj09bnVsbCYmci5zcGxpY2UoQi0tLDEpO24ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEsdSl9aWYoZiE9CitudWxsKWJyZWFrfX1pZihyLmxlbmd0aD09PTB8fGYhPW51bGwmJnIubGVuZ3RoPT09MSl7aWYoIW4udGVhcmRvd258fG4udGVhcmRvd24uY2FsbChhLG8pPT09ZmFsc2UpQ2EoYSxlLHouaGFuZGxlKTtkZWxldGUgQ1tlXX19ZWxzZSBmb3IodmFyIEI9MDtCPHIubGVuZ3RoO0IrKyl7dT1yW0JdO2lmKGl8fGsudGVzdCh1Lm5hbWVzcGFjZSkpe2MuZXZlbnQucmVtb3ZlKGEsbix1LmhhbmRsZXIsQik7ci5zcGxpY2UoQi0tLDEpfX19aWYoYy5pc0VtcHR5T2JqZWN0KEMpKXtpZihiPXouaGFuZGxlKWIuZWxlbT1udWxsO2RlbGV0ZSB6LmV2ZW50cztkZWxldGUgei5oYW5kbGU7Yy5pc0VtcHR5T2JqZWN0KHopJiZjLnJlbW92ZURhdGEoYSl9fX19fSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBlPWEudHlwZXx8YTtpZighZil7YT10eXBlb2YgYT09PSJvYmplY3QiP2FbR10/YTpjLmV4dGVuZChjLkV2ZW50KGUpLGEpOmMuRXZlbnQoZSk7aWYoZS5pbmRleE9mKCIhIik+PTApe2EudHlwZT0KK2U9ZS5zbGljZSgwLC0xKTthLmV4Y2x1c2l2ZT10cnVlfWlmKCFkKXthLnN0b3BQcm9wYWdhdGlvbigpO2MuZXZlbnQuZ2xvYmFsW2VdJiZjLmVhY2goYy5jYWNoZSxmdW5jdGlvbigpe3RoaXMuZXZlbnRzJiZ0aGlzLmV2ZW50c1tlXSYmYy5ldmVudC50cmlnZ2VyKGEsYix0aGlzLmhhbmRsZS5lbGVtKX0pfWlmKCFkfHxkLm5vZGVUeXBlPT09M3x8ZC5ub2RlVHlwZT09PTgpcmV0dXJuIHc7YS5yZXN1bHQ9dzthLnRhcmdldD1kO2I9Yy5tYWtlQXJyYXkoYik7Yi51bnNoaWZ0KGEpfWEuY3VycmVudFRhcmdldD1kOyhmPWMuZGF0YShkLCJoYW5kbGUiKSkmJmYuYXBwbHkoZCxiKTtmPWQucGFyZW50Tm9kZXx8ZC5vd25lckRvY3VtZW50O3RyeXtpZighKGQmJmQubm9kZU5hbWUmJmMubm9EYXRhW2Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKWlmKGRbIm9uIitlXSYmZFsib24iK2VdLmFwcGx5KGQsYik9PT1mYWxzZSlhLnJlc3VsdD1mYWxzZX1jYXRjaChqKXt9aWYoIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmCitmKWMuZXZlbnQudHJpZ2dlcihhLGIsZix0cnVlKTtlbHNlIGlmKCFhLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtmPWEudGFyZ2V0O3ZhciBpLG89Yy5ub2RlTmFtZShmLCJhIikmJmU9PT0iY2xpY2siLGs9Yy5ldmVudC5zcGVjaWFsW2VdfHx7fTtpZigoIWsuX2RlZmF1bHR8fGsuX2RlZmF1bHQuY2FsbChkLGEpPT09ZmFsc2UpJiYhbyYmIShmJiZmLm5vZGVOYW1lJiZjLm5vRGF0YVtmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSl7dHJ5e2lmKGZbZV0pe2lmKGk9Zlsib24iK2VdKWZbIm9uIitlXT1udWxsO2MuZXZlbnQudHJpZ2dlcmVkPXRydWU7ZltlXSgpfX1jYXRjaChuKXt9aWYoaSlmWyJvbiIrZV09aTtjLmV2ZW50LnRyaWdnZXJlZD1mYWxzZX19fSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGIsZCxmLGU7YT1hcmd1bWVudHNbMF09Yy5ldmVudC5maXgoYXx8QS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTsKK2lmKCFiKXtkPWEudHlwZS5zcGxpdCgiLiIpO2EudHlwZT1kLnNoaWZ0KCk7Zj1uZXcgUmVnRXhwKCIoXnxcXC4pIitkLnNsaWNlKDApLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKX1lPWMuZGF0YSh0aGlzLCJldmVudHMiKTtkPWVbYS50eXBlXTtpZihlJiZkKXtkPWQuc2xpY2UoMCk7ZT0wO2Zvcih2YXIgaj1kLmxlbmd0aDtlPGo7ZSsrKXt2YXIgaT1kW2VdO2lmKGJ8fGYudGVzdChpLm5hbWVzcGFjZSkpe2EuaGFuZGxlcj1pLmhhbmRsZXI7YS5kYXRhPWkuZGF0YTthLmhhbmRsZU9iaj1pO2k9aS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihpIT09dyl7YS5yZXN1bHQ9aTtpZihpPT09ZmFsc2Upe2EucHJldmVudERlZmF1bHQoKTthLnN0b3BQcm9wYWdhdGlvbigpfX1pZihhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fX1yZXR1cm4gYS5yZXN1bHR9LHByb3BzOiJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKK2ZpeDpmdW5jdGlvbihhKXtpZihhW0ddKXJldHVybiBhO3ZhciBiPWE7YT1jLkV2ZW50KGIpO2Zvcih2YXIgZD10aGlzLnByb3BzLmxlbmd0aCxmO2Q7KXtmPXRoaXMucHJvcHNbLS1kXTthW2ZdPWJbZl19aWYoIWEudGFyZ2V0KWEudGFyZ2V0PWEuc3JjRWxlbWVudHx8cztpZihhLnRhcmdldC5ub2RlVHlwZT09PTMpYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZTtpZighYS5yZWxhdGVkVGFyZ2V0JiZhLmZyb21FbGVtZW50KWEucmVsYXRlZFRhcmdldD1hLmZyb21FbGVtZW50PT09YS50YXJnZXQ/YS50b0VsZW1lbnQ6YS5mcm9tRWxlbWVudDtpZihhLnBhZ2VYPT1udWxsJiZhLmNsaWVudFghPW51bGwpe2I9cy5kb2N1bWVudEVsZW1lbnQ7ZD1zLmJvZHk7YS5wYWdlWD1hLmNsaWVudFgrKGImJmIuc2Nyb2xsTGVmdHx8ZCYmZC5zY3JvbGxMZWZ0fHwwKS0oYiYmYi5jbGllbnRMZWZ0fHxkJiZkLmNsaWVudExlZnR8fDApO2EucGFnZVk9YS5jbGllbnRZKyhiJiZiLnNjcm9sbFRvcHx8CitkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCl9aWYoIWEud2hpY2gmJihhLmNoYXJDb2RlfHxhLmNoYXJDb2RlPT09MD9hLmNoYXJDb2RlOmEua2V5Q29kZSkpYS53aGljaD1hLmNoYXJDb2RlfHxhLmtleUNvZGU7aWYoIWEubWV0YUtleSYmYS5jdHJsS2V5KWEubWV0YUtleT1hLmN0cmxLZXk7aWYoIWEud2hpY2gmJmEuYnV0dG9uIT09dylhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjA7cmV0dXJuIGF9LGd1aWQ6MUU4LHByb3h5OmMucHJveHksc3BlY2lhbDp7cmVhZHk6e3NldHVwOmMuYmluZFJlYWR5LHRlYXJkb3duOmMubm9vcH0sbGl2ZTp7YWRkOmZ1bmN0aW9uKGEpe2MuZXZlbnQuYWRkKHRoaXMsYS5vcmlnVHlwZSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOm9hfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dHJ1ZSxkPWEub3JpZ1R5cGUucmVwbGFjZShPLCIiKTtjLmVhY2goYy5kYXRhKHRoaXMsCisiZXZlbnRzIikubGl2ZXx8W10sZnVuY3Rpb24oKXtpZihkPT09dGhpcy5vcmlnVHlwZS5yZXBsYWNlKE8sIiIpKXJldHVybiBiPWZhbHNlfSk7YiYmYy5ldmVudC5yZW1vdmUodGhpcyxhLm9yaWdUeXBlLG9hKX19LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGQpe2lmKHRoaXMuc2V0SW50ZXJ2YWwpdGhpcy5vbmJlZm9yZXVubG9hZD1kO3JldHVybiBmYWxzZX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXtpZih0aGlzLm9uYmVmb3JldW5sb2FkPT09Yil0aGlzLm9uYmVmb3JldW5sb2FkPW51bGx9fX19O3ZhciBDYT1zLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGQpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGQsZmFsc2UpfTpmdW5jdGlvbihhLGIsZCl7YS5kZXRhY2hFdmVudCgib24iK2IsZCl9O2MuRXZlbnQ9ZnVuY3Rpb24oYSl7aWYoIXRoaXMucHJldmVudERlZmF1bHQpcmV0dXJuIG5ldyBjLkV2ZW50KGEpO2lmKGEmJmEudHlwZSl7dGhpcy5vcmlnaW5hbEV2ZW50PQorYTt0aGlzLnR5cGU9YS50eXBlfWVsc2UgdGhpcy50eXBlPWE7dGhpcy50aW1lU3RhbXA9SigpO3RoaXNbR109dHJ1ZX07Yy5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Wjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoYSl7YS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpO2EucmV0dXJuVmFsdWU9ZmFsc2V9fSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPVo7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpe2Euc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpO2EuY2FuY2VsQnViYmxlPXRydWV9fSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPVo7dGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOlksaXNQcm9wYWdhdGlvblN0b3BwZWQ6WSwKK2lzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOll9O3ZhciBEYT1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQ7dHJ5e2Zvcig7YiYmYiE9PXRoaXM7KWI9Yi5wYXJlbnROb2RlO2lmKGIhPT10aGlzKXthLnR5cGU9YS5kYXRhO2MuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19Y2F0Y2goZCl7fX0sRWE9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2MuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Yy5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihkKXtjLmV2ZW50LmFkZCh0aGlzLGIsZCYmZC5zZWxlY3Rvcj9FYTpEYSxhKX0sdGVhcmRvd246ZnVuY3Rpb24oZCl7Yy5ldmVudC5yZW1vdmUodGhpcyxiLGQmJmQuc2VsZWN0b3I/RWE6RGEpfX19KTtpZighYy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMpYy5ldmVudC5zcGVjaWFsLnN1Ym1pdD0KK3tzZXR1cDpmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJmb3JtIil7Yy5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0ic3VibWl0Inx8ZD09PSJpbWFnZSIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgpcmV0dXJuIG5hKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX0pO2MuZXZlbnQuYWRkKHRoaXMsImtleXByZXNzLnNwZWNpYWxTdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKChkPT09InRleHQifHxkPT09InBhc3N3b3JkIikmJmMoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aCYmYS5rZXlDb2RlPT09MTMpcmV0dXJuIG5hKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX0pfWVsc2UgcmV0dXJuIGZhbHNlfSx0ZWFyZG93bjpmdW5jdGlvbigpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iil9fTsKK2lmKCFjLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIGRhPS90ZXh0YXJlYXxpbnB1dHxzZWxlY3QvaSxlYSxGYT1mdW5jdGlvbihhKXt2YXIgYj1hLnR5cGUsZD1hLnZhbHVlO2lmKGI9PT0icmFkaW8ifHxiPT09ImNoZWNrYm94IilkPWEuY2hlY2tlZDtlbHNlIGlmKGI9PT0ic2VsZWN0LW11bHRpcGxlIilkPWEuc2VsZWN0ZWRJbmRleD4tMT9jLm1hcChhLm9wdGlvbnMsZnVuY3Rpb24oZil7cmV0dXJuIGYuc2VsZWN0ZWR9KS5qb2luKCItIik6IiI7ZWxzZSBpZihhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2VsZWN0IilkPWEuc2VsZWN0ZWRJbmRleDtyZXR1cm4gZH0sZmE9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnRhcmdldCxmLGU7aWYoISghZGEudGVzdChkLm5vZGVOYW1lKXx8ZC5yZWFkT25seSkpe2Y9Yy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIpO2U9RmEoZCk7aWYoYS50eXBlIT09ImZvY3Vzb3V0Inx8ZC50eXBlIT09InJhZGlvIiljLmRhdGEoZCwiX2NoYW5nZV9kYXRhIiwKK2UpO2lmKCEoZj09PXd8fGU9PT1mKSlpZihmIT1udWxsfHxlKXthLnR5cGU9ImNoYW5nZSI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihhLGIsZCl9fX07Yy5ldmVudC5zcGVjaWFsLmNoYW5nZT17ZmlsdGVyczp7Zm9jdXNvdXQ6ZmEsY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoZD09PSJyYWRpbyJ8fGQ9PT0iY2hlY2tib3gifHxiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2VsZWN0IilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKGEua2V5Q29kZT09PTEzJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0idGV4dGFyZWEifHxhLmtleUNvZGU9PT0zMiYmKGQ9PT0iY2hlY2tib3gifHxkPT09InJhZGlvIil8fGQ9PT0ic2VsZWN0LW11bHRpcGxlIilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLAorIl9jaGFuZ2VfZGF0YSIsRmEoYSkpfX0sc2V0dXA6ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGU9PT0iZmlsZSIpcmV0dXJuIGZhbHNlO2Zvcih2YXIgYSBpbiBlYSljLmV2ZW50LmFkZCh0aGlzLGErIi5zcGVjaWFsQ2hhbmdlIixlYVthXSk7cmV0dXJuIGRhLnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxDaGFuZ2UiKTtyZXR1cm4gZGEudGVzdCh0aGlzLm5vZGVOYW1lKX19O2VhPWMuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyc31zLmFkZEV2ZW50TGlzdGVuZXImJmMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGYpe2Y9Yy5ldmVudC5maXgoZik7Zi50eXBlPWI7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmNhbGwodGhpcyxmKX1jLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyKGEsCitkLHRydWUpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9fX0pO2MuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxmLGUpe2lmKHR5cGVvZiBkPT09Im9iamVjdCIpe2Zvcih2YXIgaiBpbiBkKXRoaXNbYl0oaixmLGRbal0sZSk7cmV0dXJuIHRoaXN9aWYoYy5pc0Z1bmN0aW9uKGYpKXtlPWY7Zj13fXZhciBpPWI9PT0ib25lIj9jLnByb3h5KGUsZnVuY3Rpb24oayl7Yyh0aGlzKS51bmJpbmQoayxpKTtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTplO2lmKGQ9PT0idW5sb2FkIiYmYiE9PSJvbmUiKXRoaXMub25lKGQsZixlKTtlbHNle2o9MDtmb3IodmFyIG89dGhpcy5sZW5ndGg7ajxvO2orKyljLmV2ZW50LmFkZCh0aGlzW2pdLGQsaSxmKX1yZXR1cm4gdGhpc319KTtjLmZuLmV4dGVuZCh7dW5iaW5kOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0ib2JqZWN0IiYmCishYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO2Vsc2V7ZD0wO2Zvcih2YXIgZj10aGlzLmxlbmd0aDtkPGY7ZCsrKWMuZXZlbnQucmVtb3ZlKHRoaXNbZF0sYSxiKX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIHRoaXMubGl2ZShiLGQsZixhKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMudW5iaW5kKCJsaXZlIik6dGhpcy5kaWUoYixudWxsLGQsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pe2E9Yy5FdmVudChhKTthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0pO3JldHVybiBhLnJlc3VsdH19LAordG9nZ2xlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMsZD0xO2Q8Yi5sZW5ndGg7KWMucHJveHkoYSxiW2QrK10pO3JldHVybiB0aGlzLmNsaWNrKGMucHJveHkoYSxmdW5jdGlvbihmKXt2YXIgZT0oYy5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Yy5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpO2YucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fGZhbHNlfSkpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KTt2YXIgR2E9e2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCIsbW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2MuZWFjaChbImxpdmUiLCJkaWUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxmLGUsail7dmFyIGksbz0wLGssbixyPWp8fHRoaXMuc2VsZWN0b3IsCit1PWo/dGhpczpjKHRoaXMuY29udGV4dCk7aWYoYy5pc0Z1bmN0aW9uKGYpKXtlPWY7Zj13fWZvcihkPShkfHwiIikuc3BsaXQoIiAiKTsoaT1kW28rK10pIT1udWxsOyl7aj1PLmV4ZWMoaSk7az0iIjtpZihqKXtrPWpbMF07aT1pLnJlcGxhY2UoTywiIil9aWYoaT09PSJob3ZlciIpZC5wdXNoKCJtb3VzZWVudGVyIitrLCJtb3VzZWxlYXZlIitrKTtlbHNle249aTtpZihpPT09ImZvY3VzInx8aT09PSJibHVyIil7ZC5wdXNoKEdhW2ldK2spO2krPWt9ZWxzZSBpPShHYVtpXXx8aSkraztiPT09ImxpdmUiP3UuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQuYWRkKHRoaXMscGEoaSxyKSx7ZGF0YTpmLHNlbGVjdG9yOnIsaGFuZGxlcjplLG9yaWdUeXBlOmksb3JpZ0hhbmRsZXI6ZSxwcmVUeXBlOm59KX0pOnUudW5iaW5kKHBhKGksciksZSl9fXJldHVybiB0aGlzfX0pO2MuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciIuc3BsaXQoIiAiKSwKK2Z1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoYixkKTp0aGlzLnRyaWdnZXIoYil9O2lmKGMuYXR0ckZuKWMuYXR0ckZuW2JdPXRydWV9KTtBLmF0dGFjaEV2ZW50JiYhQS5hZGRFdmVudExpc3RlbmVyJiZBLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gYy5jYWNoZSlpZihjLmNhY2hlW2FdLmhhbmRsZSl0cnl7Yy5ldmVudC5yZW1vdmUoYy5jYWNoZVthXS5oYW5kbGUuZWxlbSl9Y2F0Y2goYil7fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoZyl7Zm9yKHZhciBoPSIiLGwsbT0wO2dbbV07bSsrKXtsPWdbbV07aWYobC5ub2RlVHlwZT09PTN8fGwubm9kZVR5cGU9PT00KWgrPWwubm9kZVZhbHVlO2Vsc2UgaWYobC5ub2RlVHlwZSE9PTgpaCs9YShsLmNoaWxkTm9kZXMpfXJldHVybiBofWZ1bmN0aW9uIGIoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTsKK2lmKHQpe3Q9dFtnXTtmb3IodmFyIHk9ZmFsc2U7dDspe2lmKHQuc2l6Y2FjaGU9PT1sKXt5PW1bdC5zaXpzZXRdO2JyZWFrfWlmKHQubm9kZVR5cGU9PT0xJiYhcCl7dC5zaXpjYWNoZT1sO3Quc2l6c2V0PXF9aWYodC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aCl7eT10O2JyZWFrfXQ9dFtnXX1tW3FdPXl9fX1mdW5jdGlvbiBkKGcsaCxsLG0scSxwKXtxPTA7Zm9yKHZhciB2PW0ubGVuZ3RoO3E8djtxKyspe3ZhciB0PW1bcV07aWYodCl7dD10W2ddO2Zvcih2YXIgeT1mYWxzZTt0Oyl7aWYodC5zaXpjYWNoZT09PWwpe3k9bVt0LnNpenNldF07YnJlYWt9aWYodC5ub2RlVHlwZT09PTEpe2lmKCFwKXt0LnNpemNhY2hlPWw7dC5zaXpzZXQ9cX1pZih0eXBlb2YgaCE9PSJzdHJpbmciKXtpZih0PT09aCl7eT10cnVlO2JyZWFrfX1lbHNlIGlmKGsuZmlsdGVyKGgsW3RdKS5sZW5ndGg+MCl7eT10O2JyZWFrfX10PXRbZ119bVtxXT15fX19dmFyIGY9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csCitlPTAsaj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGk9ZmFsc2Usbz10cnVlO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtvPWZhbHNlO3JldHVybiAwfSk7dmFyIGs9ZnVuY3Rpb24oZyxoLGwsbSl7bD1sfHxbXTt2YXIgcT1oPWh8fHM7aWYoaC5ub2RlVHlwZSE9PTEmJmgubm9kZVR5cGUhPT05KXJldHVybltdO2lmKCFnfHx0eXBlb2YgZyE9PSJzdHJpbmciKXJldHVybiBsO2Zvcih2YXIgcD1bXSx2LHQseSxTLEg9dHJ1ZSxNPXgoaCksST1nOyhmLmV4ZWMoIiIpLHY9Zi5leGVjKEkpKSE9PW51bGw7KXtJPXZbM107cC5wdXNoKHZbMV0pO2lmKHZbMl0pe1M9dlszXTticmVha319aWYocC5sZW5ndGg+MSYmci5leGVjKGcpKWlmKHAubGVuZ3RoPT09MiYmbi5yZWxhdGl2ZVtwWzBdXSl0PWdhKHBbMF0rcFsxXSxoKTtlbHNlIGZvcih0PW4ucmVsYXRpdmVbcFswXV0/W2hdOmsocC5zaGlmdCgpLGgpO3AubGVuZ3RoOyl7Zz1wLnNoaWZ0KCk7aWYobi5yZWxhdGl2ZVtnXSlnKz1wLnNoaWZ0KCk7Cit0PWdhKGcsdCl9ZWxzZXtpZighbSYmcC5sZW5ndGg+MSYmaC5ub2RlVHlwZT09PTkmJiFNJiZuLm1hdGNoLklELnRlc3QocFswXSkmJiFuLm1hdGNoLklELnRlc3QocFtwLmxlbmd0aC0xXSkpe3Y9ay5maW5kKHAuc2hpZnQoKSxoLE0pO2g9di5leHByP2suZmlsdGVyKHYuZXhwcix2LnNldClbMF06di5zZXRbMF19aWYoaCl7dj1tP3tleHByOnAucG9wKCksc2V0OnoobSl9OmsuZmluZChwLnBvcCgpLHAubGVuZ3RoPT09MSYmKHBbMF09PT0ifiJ8fHBbMF09PT0iKyIpJiZoLnBhcmVudE5vZGU/aC5wYXJlbnROb2RlOmgsTSk7dD12LmV4cHI/ay5maWx0ZXIodi5leHByLHYuc2V0KTp2LnNldDtpZihwLmxlbmd0aD4wKXk9eih0KTtlbHNlIEg9ZmFsc2U7Zm9yKDtwLmxlbmd0aDspe3ZhciBEPXAucG9wKCk7dj1EO2lmKG4ucmVsYXRpdmVbRF0pdj1wLnBvcCgpO2Vsc2UgRD0iIjtpZih2PT1udWxsKXY9aDtuLnJlbGF0aXZlW0RdKHksdixNKX19ZWxzZSB5PVtdfXl8fCh5PXQpO3l8fGsuZXJyb3IoRHx8CitnKTtpZihqLmNhbGwoeSk9PT0iW29iamVjdCBBcnJheV0iKWlmKEgpaWYoaCYmaC5ub2RlVHlwZT09PTEpZm9yKGc9MDt5W2ddIT1udWxsO2crKyl7aWYoeVtnXSYmKHlbZ109PT10cnVlfHx5W2ddLm5vZGVUeXBlPT09MSYmRShoLHlbZ10pKSlsLnB1c2godFtnXSl9ZWxzZSBmb3IoZz0wO3lbZ10hPW51bGw7ZysrKXlbZ10mJnlbZ10ubm9kZVR5cGU9PT0xJiZsLnB1c2godFtnXSk7ZWxzZSBsLnB1c2guYXBwbHkobCx5KTtlbHNlIHooeSxsKTtpZihTKXtrKFMscSxsLG0pO2sudW5pcXVlU29ydChsKX1yZXR1cm4gbH07ay51bmlxdWVTb3J0PWZ1bmN0aW9uKGcpe2lmKEIpe2k9bztnLnNvcnQoQik7aWYoaSlmb3IodmFyIGg9MTtoPGcubGVuZ3RoO2grKylnW2hdPT09Z1toLTFdJiZnLnNwbGljZShoLS0sMSl9cmV0dXJuIGd9O2subWF0Y2hlcz1mdW5jdGlvbihnLGgpe3JldHVybiBrKGcsbnVsbCxudWxsLGgpfTtrLmZpbmQ9ZnVuY3Rpb24oZyxoLGwpe3ZhciBtLHE7aWYoIWcpcmV0dXJuW107Citmb3IodmFyIHA9MCx2PW4ub3JkZXIubGVuZ3RoO3A8djtwKyspe3ZhciB0PW4ub3JkZXJbcF07aWYocT1uLmxlZnRNYXRjaFt0XS5leGVjKGcpKXt2YXIgeT1xWzFdO3Euc3BsaWNlKDEsMSk7aWYoeS5zdWJzdHIoeS5sZW5ndGgtMSkhPT0iXFwiKXtxWzFdPShxWzFdfHwiIikucmVwbGFjZSgvXFwvZywiIik7bT1uLmZpbmRbdF0ocSxoLGwpO2lmKG0hPW51bGwpe2c9Zy5yZXBsYWNlKG4ubWF0Y2hbdF0sIiIpO2JyZWFrfX19fW18fChtPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7cmV0dXJue3NldDptLGV4cHI6Z319O2suZmlsdGVyPWZ1bmN0aW9uKGcsaCxsLG0pe2Zvcih2YXIgcT1nLHA9W10sdj1oLHQseSxTPWgmJmhbMF0mJngoaFswXSk7ZyYmaC5sZW5ndGg7KXtmb3IodmFyIEggaW4gbi5maWx0ZXIpaWYoKHQ9bi5sZWZ0TWF0Y2hbSF0uZXhlYyhnKSkhPW51bGwmJnRbMl0pe3ZhciBNPW4uZmlsdGVyW0hdLEksRDtEPXRbMV07eT1mYWxzZTt0LnNwbGljZSgxLDEpO2lmKEQuc3Vic3RyKEQubGVuZ3RoLQorMSkhPT0iXFwiKXtpZih2PT09cClwPVtdO2lmKG4ucHJlRmlsdGVyW0hdKWlmKHQ9bi5wcmVGaWx0ZXJbSF0odCx2LGwscCxtLFMpKXtpZih0PT09dHJ1ZSljb250aW51ZX1lbHNlIHk9ST10cnVlO2lmKHQpZm9yKHZhciBVPTA7KEQ9dltVXSkhPW51bGw7VSsrKWlmKEQpe0k9TShELHQsVSx2KTt2YXIgSGE9bV4hIUk7aWYobCYmSSE9bnVsbClpZihIYSl5PXRydWU7ZWxzZSB2W1VdPWZhbHNlO2Vsc2UgaWYoSGEpe3AucHVzaChEKTt5PXRydWV9fWlmKEkhPT13KXtsfHwodj1wKTtnPWcucmVwbGFjZShuLm1hdGNoW0hdLCIiKTtpZigheSlyZXR1cm5bXTticmVha319fWlmKGc9PT1xKWlmKHk9PW51bGwpay5lcnJvcihnKTtlbHNlIGJyZWFrO3E9Z31yZXR1cm4gdn07ay5lcnJvcj1mdW5jdGlvbihnKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2c7fTt2YXIgbj1rLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKS8sCitDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rLV0qKVwpKT8vLFBPUzovOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZ2V0QXR0cmlidXRlKCJocmVmIil9fSwKK3JlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oZyxoKXt2YXIgbD10eXBlb2YgaD09PSJzdHJpbmciLG09bCYmIS9cVy8udGVzdChoKTtsPWwmJiFtO2lmKG0paD1oLnRvTG93ZXJDYXNlKCk7bT0wO2Zvcih2YXIgcT1nLmxlbmd0aCxwO208cTttKyspaWYocD1nW21dKXtmb3IoOyhwPXAucHJldmlvdXNTaWJsaW5nKSYmcC5ub2RlVHlwZSE9PTE7KTtnW21dPWx8fHAmJnAubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWg/cHx8ZmFsc2U6cD09PWh9bCYmay5maWx0ZXIoaCxnLHRydWUpfSwiPiI6ZnVuY3Rpb24oZyxoKXt2YXIgbD10eXBlb2YgaD09PSJzdHJpbmciO2lmKGwmJiEvXFcvLnRlc3QoaCkpe2g9aC50b0xvd2VyQ2FzZSgpO2Zvcih2YXIgbT0wLHE9Zy5sZW5ndGg7bTxxO20rKyl7dmFyIHA9Z1ttXTtpZihwKXtsPXAucGFyZW50Tm9kZTtnW21dPWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWg/bDpmYWxzZX19fWVsc2V7bT0wO2ZvcihxPWcubGVuZ3RoO208cTttKyspaWYocD1nW21dKWdbbV09CitsP3AucGFyZW50Tm9kZTpwLnBhcmVudE5vZGU9PT1oO2wmJmsuZmlsdGVyKGgsZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaCxsKXt2YXIgbT1lKysscT1kO2lmKHR5cGVvZiBoPT09InN0cmluZyImJiEvXFcvLnRlc3QoaCkpe3ZhciBwPWg9aC50b0xvd2VyQ2FzZSgpO3E9Yn1xKCJwYXJlbnROb2RlIixoLG0sZyxwLGwpfSwifiI6ZnVuY3Rpb24oZyxoLGwpe3ZhciBtPWUrKyxxPWQ7aWYodHlwZW9mIGg9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChoKSl7dmFyIHA9aD1oLnRvTG93ZXJDYXNlKCk7cT1ifXEoInByZXZpb3VzU2libGluZyIsaCxtLGcscCxsKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaCxsKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbClyZXR1cm4oZz1oLmdldEVsZW1lbnRCeUlkKGdbMV0pKT9bZ106W119LE5BTUU6ZnVuY3Rpb24oZyxoKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50c0J5TmFtZSE9PSJ1bmRlZmluZWQiKXt2YXIgbD1bXTsKK2g9aC5nZXRFbGVtZW50c0J5TmFtZShnWzFdKTtmb3IodmFyIG09MCxxPWgubGVuZ3RoO208cTttKyspaFttXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWdbMV0mJmwucHVzaChoW21dKTtyZXR1cm4gbC5sZW5ndGg9PT0wP251bGw6bH19LFRBRzpmdW5jdGlvbihnLGgpe3JldHVybiBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKGdbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihnLGgsbCxtLHEscCl7Zz0iICIrZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKSsiICI7aWYocClyZXR1cm4gZztwPTA7Zm9yKHZhciB2Oyh2PWhbcF0pIT1udWxsO3ArKylpZih2KWlmKHFeKHYuY2xhc3NOYW1lJiYoIiAiK3YuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5dL2csIiAiKS5pbmRleE9mKGcpPj0wKSlsfHxtLnB1c2godik7ZWxzZSBpZihsKWhbcF09ZmFsc2U7cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnRvTG93ZXJDYXNlKCl9LAorQ0hJTEQ6ZnVuY3Rpb24oZyl7aWYoZ1sxXT09PSJudGgiKXt2YXIgaD0vKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKGdbMl09PT0iZXZlbiImJiIybiJ8fGdbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGdbMl0pJiYiMG4rIitnWzJdfHxnWzJdKTtnWzJdPWhbMV0rKGhbMl18fDEpLTA7Z1szXT1oWzNdLTB9Z1swXT1lKys7cmV0dXJuIGd9LEFUVFI6ZnVuY3Rpb24oZyxoLGwsbSxxLHApe2g9Z1sxXS5yZXBsYWNlKC9cXC9nLCIiKTtpZighcCYmbi5hdHRyTWFwW2hdKWdbMV09bi5hdHRyTWFwW2hdO2lmKGdbMl09PT0ifj0iKWdbNF09IiAiK2dbNF0rIiAiO3JldHVybiBnfSxQU0VVRE86ZnVuY3Rpb24oZyxoLGwsbSxxKXtpZihnWzFdPT09Im5vdCIpaWYoKGYuZXhlYyhnWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGdbM10pKWdbM109ayhnWzNdLG51bGwsbnVsbCxoKTtlbHNle2c9ay5maWx0ZXIoZ1szXSxoLGwsdHJ1ZV5xKTtsfHxtLnB1c2guYXBwbHkobSwKK2cpO3JldHVybiBmYWxzZX1lbHNlIGlmKG4ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG4ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09dHJ1ZX0sY2hlY2tlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5jaGVja2VkPT09dHJ1ZX0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuc2VsZWN0ZWQ9PT10cnVlfSxwYXJlbnQ6ZnVuY3Rpb24oZyl7cmV0dXJuISFnLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGcpe3JldHVybiFnLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihnLGgsbCl7cmV0dXJuISFrKGxbM10sZykubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oZyl7cmV0dXJuL2hcZC9pLnRlc3QoZy5ub2RlTmFtZSl9LAordGV4dDpmdW5jdGlvbihnKXtyZXR1cm4idGV4dCI9PT1nLnR5cGV9LHJhZGlvOmZ1bmN0aW9uKGcpe3JldHVybiJyYWRpbyI9PT1nLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGcpe3JldHVybiJjaGVja2JveCI9PT1nLnR5cGV9LGZpbGU6ZnVuY3Rpb24oZyl7cmV0dXJuImZpbGUiPT09Zy50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihnKXtyZXR1cm4icGFzc3dvcmQiPT09Zy50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oZyl7cmV0dXJuInN1Ym1pdCI9PT1nLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGcpe3JldHVybiJpbWFnZSI9PT1nLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGcpe3JldHVybiJyZXNldCI9PT1nLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4iYnV0dG9uIj09PWcudHlwZXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGcpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChnLm5vZGVOYW1lKX19LAorc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaD09PTB9LGxhc3Q6ZnVuY3Rpb24oZyxoLGwsbSl7cmV0dXJuIGg9PT1tLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGglMj09PTB9LG9kZDpmdW5jdGlvbihnLGgpe3JldHVybiBoJTI9PT0xfSxsdDpmdW5jdGlvbihnLGgsbCl7cmV0dXJuIGg8bFszXS0wfSxndDpmdW5jdGlvbihnLGgsbCl7cmV0dXJuIGg+bFszXS0wfSxudGg6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBsWzNdLTA9PT1ofSxlcTpmdW5jdGlvbihnLGgsbCl7cmV0dXJuIGxbM10tMD09PWh9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihnLGgsbCxtKXt2YXIgcT1oWzFdLHA9bi5maWx0ZXJzW3FdO2lmKHApcmV0dXJuIHAoZyxsLGgsbSk7ZWxzZSBpZihxPT09ImNvbnRhaW5zIilyZXR1cm4oZy50ZXh0Q29udGVudHx8Zy5pbm5lclRleHR8fGEoW2ddKXx8IiIpLmluZGV4T2YoaFszXSk+PTA7ZWxzZSBpZihxPT09Im5vdCIpe2g9CitoWzNdO2w9MDtmb3IobT1oLmxlbmd0aDtsPG07bCsrKWlmKGhbbF09PT1nKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1lbHNlIGsuZXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrcSl9LENISUxEOmZ1bmN0aW9uKGcsaCl7dmFyIGw9aFsxXSxtPWc7c3dpdGNoKGwpe2Nhc2UgIm9ubHkiOmNhc2UgImZpcnN0Ijpmb3IoO209bS5wcmV2aW91c1NpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtpZihsPT09ImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOmw9aFsyXTt2YXIgcT1oWzNdO2lmKGw9PT0xJiZxPT09MClyZXR1cm4gdHJ1ZTtoPWhbMF07dmFyIHA9Zy5wYXJlbnROb2RlO2lmKHAmJihwLnNpemNhY2hlIT09aHx8IWcubm9kZUluZGV4KSl7dmFyIHY9MDtmb3IobT1wLmZpcnN0Q2hpbGQ7bTttPQorbS5uZXh0U2libGluZylpZihtLm5vZGVUeXBlPT09MSltLm5vZGVJbmRleD0rK3Y7cC5zaXpjYWNoZT1ofWc9Zy5ub2RlSW5kZXgtcTtyZXR1cm4gbD09PTA/Zz09PTA6ZyVsPT09MCYmZy9sPj0wfX0sSUQ6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gZy5ub2RlVHlwZT09PTEmJmcuZ2V0QXR0cmlidXRlKCJpZCIpPT09aH0sVEFHOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGg9PT0iKiImJmcubm9kZVR5cGU9PT0xfHxnLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ofSxDTEFTUzpmdW5jdGlvbihnLGgpe3JldHVybigiICIrKGcuY2xhc3NOYW1lfHxnLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGgpPi0xfSxBVFRSOmZ1bmN0aW9uKGcsaCl7dmFyIGw9aFsxXTtnPW4uYXR0ckhhbmRsZVtsXT9uLmF0dHJIYW5kbGVbbF0oZyk6Z1tsXSE9bnVsbD9nW2xdOmcuZ2V0QXR0cmlidXRlKGwpO2w9ZysiIjt2YXIgbT1oWzJdO2g9aFs0XTtyZXR1cm4gZz09bnVsbD9tPT09IiE9IjptPT09CisiPSI/bD09PWg6bT09PSIqPSI/bC5pbmRleE9mKGgpPj0wOm09PT0ifj0iPygiICIrbCsiICIpLmluZGV4T2YoaCk+PTA6IWg/bCYmZyE9PWZhbHNlOm09PT0iIT0iP2whPT1oOm09PT0iXj0iP2wuaW5kZXhPZihoKT09PTA6bT09PSIkPSI/bC5zdWJzdHIobC5sZW5ndGgtaC5sZW5ndGgpPT09aDptPT09Inw9Ij9sPT09aHx8bC5zdWJzdHIoMCxoLmxlbmd0aCsxKT09PWgrIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oZyxoLGwsbSl7dmFyIHE9bi5zZXRGaWx0ZXJzW2hbMl1dO2lmKHEpcmV0dXJuIHEoZyxsLGgsbSl9fX0scj1uLm1hdGNoLlBPUztmb3IodmFyIHUgaW4gbi5tYXRjaCl7bi5tYXRjaFt1XT1uZXcgUmVnRXhwKG4ubWF0Y2hbdV0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSk7bi5sZWZ0TWF0Y2hbdV09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK24ubWF0Y2hbdV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxmdW5jdGlvbihnLAoraCl7cmV0dXJuIlxcIisoaC0wKzEpfSkpfXZhciB6PWZ1bmN0aW9uKGcsaCl7Zz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnLDApO2lmKGgpe2gucHVzaC5hcHBseShoLGcpO3JldHVybiBofXJldHVybiBnfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKX1jYXRjaChDKXt6PWZ1bmN0aW9uKGcsaCl7aD1ofHxbXTtpZihqLmNhbGwoZyk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsZyk7ZWxzZSBpZih0eXBlb2YgZy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIGw9MCxtPWcubGVuZ3RoO2w8bTtsKyspaC5wdXNoKGdbbF0pO2Vsc2UgZm9yKGw9MDtnW2xdO2wrKyloLnB1c2goZ1tsXSk7cmV0dXJuIGh9fXZhciBCO2lmKHMuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKUI9ZnVuY3Rpb24oZyxoKXtpZighZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8CishaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbil7aWYoZz09aClpPXRydWU7cmV0dXJuIGcuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MX1nPWcuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaCkmND8tMTpnPT09aD8wOjE7aWYoZz09PTApaT10cnVlO3JldHVybiBnfTtlbHNlIGlmKCJzb3VyY2VJbmRleCJpbiBzLmRvY3VtZW50RWxlbWVudClCPWZ1bmN0aW9uKGcsaCl7aWYoIWcuc291cmNlSW5kZXh8fCFoLnNvdXJjZUluZGV4KXtpZihnPT1oKWk9dHJ1ZTtyZXR1cm4gZy5zb3VyY2VJbmRleD8tMToxfWc9Zy5zb3VyY2VJbmRleC1oLnNvdXJjZUluZGV4O2lmKGc9PT0wKWk9dHJ1ZTtyZXR1cm4gZ307ZWxzZSBpZihzLmNyZWF0ZVJhbmdlKUI9ZnVuY3Rpb24oZyxoKXtpZighZy5vd25lckRvY3VtZW50fHwhaC5vd25lckRvY3VtZW50KXtpZihnPT1oKWk9dHJ1ZTtyZXR1cm4gZy5vd25lckRvY3VtZW50Py0xOjF9dmFyIGw9Zy5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksbT0KK2gub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpO2wuc2V0U3RhcnQoZywwKTtsLnNldEVuZChnLDApO20uc2V0U3RhcnQoaCwwKTttLnNldEVuZChoLDApO2c9bC5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELG0pO2lmKGc9PT0wKWk9dHJ1ZTtyZXR1cm4gZ307KGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxoPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2cuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2grIicvPiI7dmFyIGw9cy5kb2N1bWVudEVsZW1lbnQ7bC5pbnNlcnRCZWZvcmUoZyxsLmZpcnN0Q2hpbGQpO2lmKHMuZ2V0RWxlbWVudEJ5SWQoaCkpe24uZmluZC5JRD1mdW5jdGlvbihtLHEscCl7aWYodHlwZW9mIHEuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIXApcmV0dXJuKHE9cS5nZXRFbGVtZW50QnlJZChtWzFdKSk/cS5pZD09PW1bMV18fHR5cGVvZiBxLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmCitxLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09bVsxXT9bcV06dzpbXX07bi5maWx0ZXIuSUQ9ZnVuY3Rpb24obSxxKXt2YXIgcD10eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJm0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbS5ub2RlVHlwZT09PTEmJnAmJnAubm9kZVZhbHVlPT09cX19bC5yZW1vdmVDaGlsZChnKTtsPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHMuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCluLmZpbmQuVEFHPWZ1bmN0aW9uKGgsbCl7bD1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKGhbMV0pO2lmKGhbMV09PT0iKiIpe2g9W107Zm9yKHZhciBtPTA7bFttXTttKyspbFttXS5ub2RlVHlwZT09PTEmJmgucHVzaChsW21dKTtsPWh9cmV0dXJuIGx9O2cuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IjsKK2lmKGcuZmlyc3RDaGlsZCYmdHlwZW9mIGcuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT0idW5kZWZpbmVkIiYmZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIT09IiMiKW4uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGgpe3JldHVybiBoLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9O2c9bnVsbH0pKCk7cy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBnPWssaD1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIShoLnF1ZXJ5U2VsZWN0b3JBbGwmJmgucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGg9PT0wKSl7az1mdW5jdGlvbihtLHEscCx2KXtxPXF8fHM7aWYoIXYmJnEubm9kZVR5cGU9PT05JiYheChxKSl0cnl7cmV0dXJuIHoocS5xdWVyeVNlbGVjdG9yQWxsKG0pLHApfWNhdGNoKHQpe31yZXR1cm4gZyhtLHEscCx2KX07Zm9yKHZhciBsIGluIGcpa1tsXT1nW2xdO2g9bnVsbH19KCk7CisoZnVuY3Rpb24oKXt2YXIgZz1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7aWYoISghZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lfHxnLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0wKSl7Zy5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihnLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0xKXtuLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIik7bi5maW5kLkNMQVNTPWZ1bmN0aW9uKGgsbCxtKXtpZih0eXBlb2YgbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09InVuZGVmaW5lZCImJiFtKXJldHVybiBsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsxXSl9O2c9bnVsbH19fSkoKTt2YXIgRT1zLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGcsaCl7cmV0dXJuISEoZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoKSYxNil9OgorZnVuY3Rpb24oZyxoKXtyZXR1cm4gZyE9PWgmJihnLmNvbnRhaW5zP2cuY29udGFpbnMoaCk6dHJ1ZSl9LHg9ZnVuY3Rpb24oZyl7cmV0dXJuKGc9KGc/Zy5vd25lckRvY3VtZW50fHxnOjApLmRvY3VtZW50RWxlbWVudCk/Zy5ub2RlTmFtZSE9PSJIVE1MIjpmYWxzZX0sZ2E9ZnVuY3Rpb24oZyxoKXt2YXIgbD1bXSxtPSIiLHE7Zm9yKGg9aC5ub2RlVHlwZT9baF06aDtxPW4ubWF0Y2guUFNFVURPLmV4ZWMoZyk7KXttKz1xWzBdO2c9Zy5yZXBsYWNlKG4ubWF0Y2guUFNFVURPLCIiKX1nPW4ucmVsYXRpdmVbZ10/ZysiKiI6ZztxPTA7Zm9yKHZhciBwPWgubGVuZ3RoO3E8cDtxKyspayhnLGhbcV0sbCk7cmV0dXJuIGsuZmlsdGVyKG0sbCl9O2MuZmluZD1rO2MuZXhwcj1rLnNlbGVjdG9ycztjLmV4cHJbIjoiXT1jLmV4cHIuZmlsdGVycztjLnVuaXF1ZT1rLnVuaXF1ZVNvcnQ7Yy50ZXh0PWE7Yy5pc1hNTERvYz14O2MuY29udGFpbnM9RX0pKCk7dmFyIGViPS9VbnRpbCQvLGZiPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLAorZ2I9LywvO1I9QXJyYXkucHJvdG90eXBlLnNsaWNlO3ZhciBJYT1mdW5jdGlvbihhLGIsZCl7aWYoYy5pc0Z1bmN0aW9uKGIpKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihlLGope3JldHVybiEhYi5jYWxsKGUsaixlKT09PWR9KTtlbHNlIGlmKGIubm9kZVR5cGUpcmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09Yj09PWR9KTtlbHNlIGlmKHR5cGVvZiBiPT09InN0cmluZyIpe3ZhciBmPWMuZ3JlcChhLGZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVUeXBlPT09MX0pO2lmKFVhLnRlc3QoYikpcmV0dXJuIGMuZmlsdGVyKGIsZiwhZCk7ZWxzZSBiPWMuZmlsdGVyKGIsZil9cmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGUpe3JldHVybiBjLmluQXJyYXkoZSxiKT49MD09PWR9KX07Yy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMucHVzaFN0YWNrKCIiLCJmaW5kIixhKSxkPTAsZj0wLGU9dGhpcy5sZW5ndGg7ZjxlO2YrKyl7ZD1iLmxlbmd0aDsKK2MuZmluZChhLHRoaXNbZl0sYik7aWYoZj4wKWZvcih2YXIgaj1kO2o8Yi5sZW5ndGg7aisrKWZvcih2YXIgaT0wO2k8ZDtpKyspaWYoYltpXT09PWJbal0pe2Iuc3BsaWNlKGotLSwxKTticmVha319cmV0dXJuIGJ9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1jKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihjLmNvbnRhaW5zKHRoaXMsYltkXSkpcmV0dXJuIHRydWV9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhJYSh0aGlzLGEsZmFsc2UpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKElhKHRoaXMsYSx0cnVlKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiZjLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7aWYoYy5pc0FycmF5KGEpKXt2YXIgZD1bXSxmPXRoaXNbMF0sZSxqPQore30saTtpZihmJiZhLmxlbmd0aCl7ZT0wO2Zvcih2YXIgbz1hLmxlbmd0aDtlPG87ZSsrKXtpPWFbZV07altpXXx8KGpbaV09Yy5leHByLm1hdGNoLlBPUy50ZXN0KGkpP2MoaSxifHx0aGlzLmNvbnRleHQpOmkpfWZvcig7ZiYmZi5vd25lckRvY3VtZW50JiZmIT09Yjspe2ZvcihpIGluIGope2U9altpXTtpZihlLmpxdWVyeT9lLmluZGV4KGYpPi0xOmMoZikuaXMoZSkpe2QucHVzaCh7c2VsZWN0b3I6aSxlbGVtOmZ9KTtkZWxldGUgaltpXX19Zj1mLnBhcmVudE5vZGV9fXJldHVybiBkfXZhciBrPWMuZXhwci5tYXRjaC5QT1MudGVzdChhKT9jKGEsYnx8dGhpcy5jb250ZXh0KTpudWxsO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuLHIpe2Zvcig7ciYmci5vd25lckRvY3VtZW50JiZyIT09Yjspe2lmKGs/ay5pbmRleChyKT4tMTpjKHIpLmlzKGEpKXJldHVybiByO3I9ci5wYXJlbnROb2RlfXJldHVybiBudWxsfSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PQorInN0cmluZyIpcmV0dXJuIGMuaW5BcnJheSh0aGlzWzBdLGE/YyhhKTp0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkpO3JldHVybiBjLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXthPXR5cGVvZiBhPT09InN0cmluZyI/YyhhLGJ8fHRoaXMuY29udGV4dCk6Yy5tYWtlQXJyYXkoYSk7Yj1jLm1lcmdlKHRoaXMuZ2V0KCksYSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHFhKGFbMF0pfHxxYShiWzBdKT9iOmMudW5pcXVlKGIpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pO2MuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybihhPWEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT0xMT9hOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIsCitkKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciLGQpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGQpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLm5vZGVOYW1lKGEsImlmcmFtZSIpPworYS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpjLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZil7dmFyIGU9Yy5tYXAodGhpcyxiLGQpO2ViLnRlc3QoYSl8fChmPWQpO2lmKGYmJnR5cGVvZiBmPT09InN0cmluZyIpZT1jLmZpbHRlcihmLGUpO2U9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShlKTplO2lmKCh0aGlzLmxlbmd0aD4xfHxnYi50ZXN0KGYpKSYmZmIudGVzdChhKSllPWUucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KTtjLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixkKXtpZihkKWE9Ijpub3QoIithKyIpIjtyZXR1cm4gYy5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj1bXTtmb3IoYT1hW2JdO2EmJmEubm9kZVR5cGUhPT05JiYoZD09PXd8fGEubm9kZVR5cGUhPT0xfHwhYyhhKS5pcyhkKSk7KXthLm5vZGVUeXBlPT09CisxJiZmLnB1c2goYSk7YT1hW2JdfXJldHVybiBmfSxudGg6ZnVuY3Rpb24oYSxiLGQpe2I9Ynx8MTtmb3IodmFyIGY9MDthO2E9YVtkXSlpZihhLm5vZGVUeXBlPT09MSYmKytmPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmQucHVzaChhKTtyZXR1cm4gZH19KTt2YXIgSmE9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZyxWPS9eXHMrLyxLYT0vKDwoW1x3Ol0rKVtePl0qPylcLz4vZyxoYj0vXig/OmFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pJC9pLExhPS88KFtcdzpdKykvLGliPS88dGJvZHkvaSxqYj0vPHwmIz9cdys7Lyx0YT0vPHNjcmlwdHw8b2JqZWN0fDxlbWJlZHw8b3B0aW9ufDxzdHlsZS9pLHVhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLE1hPWZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gaGIudGVzdChkKT8KK2E6YisiPjwvIitkKyI+In0sRj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtGLm9wdGdyb3VwPUYub3B0aW9uO0YudGJvZHk9Ri50Zm9vdD1GLmNvbGdyb3VwPUYuY2FwdGlvbj1GLnRoZWFkO0YudGg9Ri50ZDtpZighYy5zdXBwb3J0Lmh0bWxTZXJpYWxpemUpRi5fZGVmYXVsdD1bMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXTtjLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD0KK2ModGhpcyk7ZC50ZXh0KGEuY2FsbCh0aGlzLGIsZC50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT09Im9iamVjdCImJmEhPT13KXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fHMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gYy50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe2ModGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxkKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1jKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSh0cnVlKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pO2IubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBkPXRoaXM7ZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xOylkPWQuZmlyc3RDaGlsZDtyZXR1cm4gZH0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sCit3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Yyh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWModGhpcyksZD1iLmNvbnRlbnRzKCk7ZC5sZW5ndGg/ZC53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Yy5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSwKK3ByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oYil7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLHRoaXMpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1jKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oYil7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLAordGhpcy5uZXh0U2libGluZyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGMoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTAsZjsoZj10aGlzW2RdKSE9bnVsbDtkKyspaWYoIWF8fGMuZmlsdGVyKGEsW2ZdKS5sZW5ndGgpe2lmKCFiJiZmLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEoZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtjLmNsZWFuRGF0YShbZl0pfWYucGFyZW50Tm9kZSYmZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfXJldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9dGhpc1thXSkhPW51bGw7YSsrKWZvcihiLm5vZGVUeXBlPT09MSYmYy5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKK3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm1hcChmdW5jdGlvbigpe2lmKCFjLnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhYy5pc1hNTERvYyh0aGlzKSl7dmFyIGQ9dGhpcy5vdXRlckhUTUwsZj10aGlzLm93bmVyRG9jdW1lbnQ7aWYoIWQpe2Q9Zi5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmFwcGVuZENoaWxkKHRoaXMuY2xvbmVOb2RlKHRydWUpKTtkPWQuaW5uZXJIVE1MfXJldHVybiBjLmNsZWFuKFtkLnJlcGxhY2UoSmEsIiIpLnJlcGxhY2UoLz0oW149Iic+XHNdK1wvKT4vZywnPSIkMSI+JykucmVwbGFjZShWLCIiKV0sZilbMF19ZWxzZSByZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSl9KTtpZihhPT09dHJ1ZSl7cmEodGhpcyxiKTtyYSh0aGlzLmZpbmQoIioiKSxiLmZpbmQoIioiKSl9cmV0dXJuIGJ9LGh0bWw6ZnVuY3Rpb24oYSl7aWYoYT09PXcpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ubm9kZVR5cGU9PT0xP3RoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UoSmEsCisiIik6bnVsbDtlbHNlIGlmKHR5cGVvZiBhPT09InN0cmluZyImJiF0YS50ZXN0KGEpJiYoYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhVi50ZXN0KGEpKSYmIUZbKExhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShLYSxNYSk7dHJ5e2Zvcih2YXIgYj0wLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKylpZih0aGlzW2JdLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEodGhpc1tiXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt0aGlzW2JdLmlubmVySFRNTD1hfX1jYXRjaChmKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGo9Yyh0aGlzKSxpPWouaHRtbCgpO2ouZW1wdHkoKS5hcHBlbmQoZnVuY3Rpb24oKXtyZXR1cm4gYS5jYWxsKHRoaXMsZSxpKX0pfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmCit0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPWModGhpcyksZj1kLmh0bWwoKTtkLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZikpfSk7aWYodHlwZW9mIGEhPT0ic3RyaW5nIilhPWMoYSkuZGV0YWNoKCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsZD10aGlzLnBhcmVudE5vZGU7Yyh0aGlzKS5yZW1vdmUoKTtiP2MoYikuYmVmb3JlKGEpOmMoZCkuYXBwZW5kKGEpfSl9ZWxzZSByZXR1cm4gdGhpcy5wdXNoU3RhY2soYyhjLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSx0cnVlKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYodSl7cmV0dXJuIGMubm9kZU5hbWUodSwidGFibGUiKT91LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHwKK3UuYXBwZW5kQ2hpbGQodS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOnV9dmFyIGUsaixpPWFbMF0sbz1bXSxrO2lmKCFjLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBpPT09InN0cmluZyImJnVhLnRlc3QoaSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykuZG9tTWFuaXAoYSxiLGQsdHJ1ZSl9KTtpZihjLmlzRnVuY3Rpb24oaSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih1KXt2YXIgej1jKHRoaXMpO2FbMF09aS5jYWxsKHRoaXMsdSxiP3ouaHRtbCgpOncpO3ouZG9tTWFuaXAoYSxiLGQpfSk7aWYodGhpc1swXSl7ZT1pJiZpLnBhcmVudE5vZGU7ZT1jLnN1cHBvcnQucGFyZW50Tm9kZSYmZSYmZS5ub2RlVHlwZT09PTExJiZlLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/e2ZyYWdtZW50OmV9OnNhKGEsdGhpcyxvKTtrPWUuZnJhZ21lbnQ7aWYoaj1rLmNoaWxkTm9kZXMubGVuZ3RoPT09CisxPyhrPWsuZmlyc3RDaGlsZCk6ay5maXJzdENoaWxkKXtiPWImJmMubm9kZU5hbWUoaiwidHIiKTtmb3IodmFyIG49MCxyPXRoaXMubGVuZ3RoO248cjtuKyspZC5jYWxsKGI/Zih0aGlzW25dLGopOnRoaXNbbl0sbj4wfHxlLmNhY2hlYWJsZXx8dGhpcy5sZW5ndGg+MT9rLmNsb25lTm9kZSh0cnVlKTprKX1vLmxlbmd0aCYmYy5lYWNoKG8sUWEpfXJldHVybiB0aGlzfX0pO2MuZnJhZ21lbnRzPXt9O2MuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihkKXt2YXIgZj1bXTtkPWMoZCk7dmFyIGU9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZSYmZS5ub2RlVHlwZT09PTExJiZlLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZC5sZW5ndGg9PT0xKXtkW2JdKHRoaXNbMF0pOworcmV0dXJuIHRoaXN9ZWxzZXtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPShlPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjLmZuW2JdLmFwcGx5KGMoZFtlXSksaSk7Zj1mLmNvbmNhdChpKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGQuc2VsZWN0b3IpfX19KTtjLmV4dGVuZCh7Y2xlYW46ZnVuY3Rpb24oYSxiLGQsZil7Yj1ifHxzO2lmKHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PT0idW5kZWZpbmVkIiliPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxzO2Zvcih2YXIgZT1bXSxqPTAsaTsoaT1hW2pdKSE9bnVsbDtqKyspe2lmKHR5cGVvZiBpPT09Im51bWJlciIpaSs9IiI7aWYoaSl7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIWpiLnRlc3QoaSkpaT1iLmNyZWF0ZVRleHROb2RlKGkpO2Vsc2UgaWYodHlwZW9mIGk9PT0ic3RyaW5nIil7aT1pLnJlcGxhY2UoS2EsTWEpO3ZhciBvPShMYS5leGVjKGkpfHxbIiIsCisiIl0pWzFdLnRvTG93ZXJDYXNlKCksaz1GW29dfHxGLl9kZWZhdWx0LG49a1swXSxyPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKHIuaW5uZXJIVE1MPWtbMV0raStrWzJdO24tLTspcj1yLmxhc3RDaGlsZDtpZighYy5zdXBwb3J0LnRib2R5KXtuPWliLnRlc3QoaSk7bz1vPT09InRhYmxlIiYmIW4/ci5maXJzdENoaWxkJiZyLmZpcnN0Q2hpbGQuY2hpbGROb2RlczprWzFdPT09Ijx0YWJsZT4iJiYhbj9yLmNoaWxkTm9kZXM6W107Zm9yKGs9by5sZW5ndGgtMTtrPj0wOy0tayljLm5vZGVOYW1lKG9ba10sInRib2R5IikmJiFvW2tdLmNoaWxkTm9kZXMubGVuZ3RoJiZvW2tdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob1trXSl9IWMuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmVi50ZXN0KGkpJiZyLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFYuZXhlYyhpKVswXSksci5maXJzdENoaWxkKTtpPXIuY2hpbGROb2Rlc31pZihpLm5vZGVUeXBlKWUucHVzaChpKTtlbHNlIGU9CitjLm1lcmdlKGUsaSl9fWlmKGQpZm9yKGo9MDtlW2pdO2orKylpZihmJiZjLm5vZGVOYW1lKGVbal0sInNjcmlwdCIpJiYoIWVbal0udHlwZXx8ZVtqXS50eXBlLnRvTG93ZXJDYXNlKCk9PT0idGV4dC9qYXZhc2NyaXB0IikpZi5wdXNoKGVbal0ucGFyZW50Tm9kZT9lW2pdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZVtqXSk6ZVtqXSk7ZWxzZXtlW2pdLm5vZGVUeXBlPT09MSYmZS5zcGxpY2UuYXBwbHkoZSxbaisxLDBdLmNvbmNhdChjLm1ha2VBcnJheShlW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkpKTtkLmFwcGVuZENoaWxkKGVbal0pfXJldHVybiBlfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGQsZj1jLmNhY2hlLGU9Yy5ldmVudC5zcGVjaWFsLGo9Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8saT0wLG87KG89YVtpXSkhPW51bGw7aSsrKWlmKGQ9b1tjLmV4cGFuZG9dKXtiPWZbZF07aWYoYi5ldmVudHMpZm9yKHZhciBrIGluIGIuZXZlbnRzKWVba10/CitjLmV2ZW50LnJlbW92ZShvLGspOkNhKG8sayxiLmhhbmRsZSk7aWYoailkZWxldGUgb1tjLmV4cGFuZG9dO2Vsc2Ugby5yZW1vdmVBdHRyaWJ1dGUmJm8ucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGZbZF19fX0pO3ZhciBrYj0vei0/aW5kZXh8Zm9udC0/d2VpZ2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSxOYT0vYWxwaGFcKFteKV0qXCkvLE9hPS9vcGFjaXR5PShbXildKikvLGhhPS9mbG9hdC9pLGlhPS8tKFthLXpdKS9pZyxsYj0vKFtBLVpdKS9nLG1iPS9eLT9cZCsoPzpweCk/JC9pLG5iPS9eLT9cZC8sb2I9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LHBiPVsiTGVmdCIsIlJpZ2h0Il0scWI9WyJUb3AiLCJCb3R0b20iXSxyYj1zLmRlZmF1bHRWaWV3JiZzLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUsUGE9Yy5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiLGphPQorZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTtjLmZuLmNzcz1mdW5jdGlvbihhLGIpe3JldHVybiBYKHRoaXMsYSxiLHRydWUsZnVuY3Rpb24oZCxmLGUpe2lmKGU9PT13KXJldHVybiBjLmN1ckNTUyhkLGYpO2lmKHR5cGVvZiBlPT09Im51bWJlciImJiFrYi50ZXN0KGYpKWUrPSJweCI7Yy5zdHlsZShkLGYsZSl9KX07Yy5leHRlbmQoe3N0eWxlOmZ1bmN0aW9uKGEsYixkKXtpZighYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KXJldHVybiB3O2lmKChiPT09IndpZHRoInx8Yj09PSJoZWlnaHQiKSYmcGFyc2VGbG9hdChkKTwwKWQ9dzt2YXIgZj1hLnN0eWxlfHxhLGU9ZCE9PXc7aWYoIWMuc3VwcG9ydC5vcGFjaXR5JiZiPT09Im9wYWNpdHkiKXtpZihlKXtmLnpvb209MTtiPXBhcnNlSW50KGQsMTApKyIiPT09Ik5hTiI/IiI6ImFscGhhKG9wYWNpdHk9IitkKjEwMCsiKSI7YT1mLmZpbHRlcnx8Yy5jdXJDU1MoYSwiZmlsdGVyIil8fCIiO2YuZmlsdGVyPQorTmEudGVzdChhKT9hLnJlcGxhY2UoTmEsYik6Yn1yZXR1cm4gZi5maWx0ZXImJmYuZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9Iik+PTA/cGFyc2VGbG9hdChPYS5leGVjKGYuZmlsdGVyKVsxXSkvMTAwKyIiOiIifWlmKGhhLnRlc3QoYikpYj1QYTtiPWIucmVwbGFjZShpYSxqYSk7aWYoZSlmW2JdPWQ7cmV0dXJuIGZbYl19LGNzczpmdW5jdGlvbihhLGIsZCxmKXtpZihiPT09IndpZHRoInx8Yj09PSJoZWlnaHQiKXt2YXIgZSxqPWI9PT0id2lkdGgiP3BiOnFiO2Z1bmN0aW9uIGkoKXtlPWI9PT0id2lkdGgiP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQ7ZiE9PSJib3JkZXIiJiZjLmVhY2goaixmdW5jdGlvbigpe2Z8fChlLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwKTtpZihmPT09Im1hcmdpbiIpZSs9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwO2Vsc2UgZS09cGFyc2VGbG9hdChjLmN1ckNTUyhhLAorImJvcmRlciIrdGhpcysiV2lkdGgiLHRydWUpKXx8MH0pfWEub2Zmc2V0V2lkdGghPT0wP2koKTpjLnN3YXAoYSxvYixpKTtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGUpKX1yZXR1cm4gYy5jdXJDU1MoYSxiLGQpfSxjdXJDU1M6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGU9YS5zdHlsZTtpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSImJmEuY3VycmVudFN0eWxlKXtmPU9hLnRlc3QoYS5jdXJyZW50U3R5bGUuZmlsdGVyfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjoiIjtyZXR1cm4gZj09PSIiPyIxIjpmfWlmKGhhLnRlc3QoYikpYj1QYTtpZighZCYmZSYmZVtiXSlmPWVbYl07ZWxzZSBpZihyYil7aWYoaGEudGVzdChiKSliPSJmbG9hdCI7Yj1iLnJlcGxhY2UobGIsIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZT1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7aWYoIWUpcmV0dXJuIG51bGw7aWYoYT1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlmPQorYS5nZXRQcm9wZXJ0eVZhbHVlKGIpO2lmKGI9PT0ib3BhY2l0eSImJmY9PT0iIilmPSIxIn1lbHNlIGlmKGEuY3VycmVudFN0eWxlKXtkPWIucmVwbGFjZShpYSxqYSk7Zj1hLmN1cnJlbnRTdHlsZVtiXXx8YS5jdXJyZW50U3R5bGVbZF07aWYoIW1iLnRlc3QoZikmJm5iLnRlc3QoZikpe2I9ZS5sZWZ0O3ZhciBqPWEucnVudGltZVN0eWxlLmxlZnQ7YS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0O2UubGVmdD1kPT09ImZvbnRTaXplIj8iMWVtIjpmfHwwO2Y9ZS5waXhlbExlZnQrInB4IjtlLmxlZnQ9YjthLnJ1bnRpbWVTdHlsZS5sZWZ0PWp9fXJldHVybiBmfSxzd2FwOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj17fTtmb3IodmFyIGUgaW4gYil7ZltlXT1hLnN0eWxlW2VdO2Euc3R5bGVbZV09YltlXX1kLmNhbGwoYSk7Zm9yKGUgaW4gYilhLnN0eWxlW2VdPWZbZV19fSk7aWYoYy5leHByJiZjLmV4cHIuZmlsdGVycyl7Yy5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3ZhciBiPQorYS5vZmZzZXRXaWR0aCxkPWEub2Zmc2V0SGVpZ2h0LGY9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIjtyZXR1cm4gYj09PTAmJmQ9PT0wJiYhZj90cnVlOmI+MCYmZD4wJiYhZj9mYWxzZTpjLmN1ckNTUyhhLCJkaXNwbGF5Iik9PT0ibm9uZSJ9O2MuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWMuZXhwci5maWx0ZXJzLmhpZGRlbihhKX19dmFyIHNiPUooKSx0Yj0vPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+L2dpLHViPS9zZWxlY3R8dGV4dGFyZWEvaSx2Yj0vY29sb3J8ZGF0ZXxkYXRldGltZXxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrL2ksTj0vPVw/KCZ8JCkvLGthPS9cPy8sd2I9LyhcP3wmKV89Lio/KCZ8JCkvLHhiPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyx5Yj0vJTIwL2csemI9Yy5mbi5sb2FkO2MuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYixkKXtpZih0eXBlb2YgYSE9PQorInN0cmluZyIpcmV0dXJuIHpiLmNhbGwodGhpcyxhKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZj1hLmluZGV4T2YoIiAiKTtpZihmPj0wKXt2YXIgZT1hLnNsaWNlKGYsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGYpfWY9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PSJvYmplY3QiKXtiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7Zj0iUE9TVCJ9dmFyIGo9dGhpcztjLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpiLGNvbXBsZXRlOmZ1bmN0aW9uKGksbyl7aWYobz09PSJzdWNjZXNzInx8bz09PSJub3Rtb2RpZmllZCIpai5odG1sKGU/YygiPGRpdiAvPiIpLmFwcGVuZChpLnJlc3BvbnNlVGV4dC5yZXBsYWNlKHRiLCIiKSkuZmluZChlKTppLnJlc3BvbnNlVGV4dCk7ZCYmai5lYWNoKGQsW2kucmVzcG9uc2VUZXh0LG8saV0pfX0pO3JldHVybiB0aGlzfSwKK3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Yy5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHx1Yi50ZXN0KHRoaXMubm9kZU5hbWUpfHx2Yi50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7YT1jKHRoaXMpLnZhbCgpO3JldHVybiBhPT1udWxsP251bGw6Yy5pc0FycmF5KGEpP2MubWFwKGEsZnVuY3Rpb24oZCl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmR9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmF9fSkuZ2V0KCl9fSk7Yy5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSwKK2Z1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5iaW5kKGIsZCl9fSk7Yy5leHRlbmQoe2dldDpmdW5jdGlvbihhLGIsZCxmKXtpZihjLmlzRnVuY3Rpb24oYikpe2Y9Znx8ZDtkPWI7Yj1udWxsfXJldHVybiBjLmFqYXgoe3R5cGU6IkdFVCIsdXJsOmEsZGF0YTpiLHN1Y2Nlc3M6ZCxkYXRhVHlwZTpmfSl9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBjLmdldChhLG51bGwsYiwic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmdldChhLGIsZCwianNvbiIpfSxwb3N0OmZ1bmN0aW9uKGEsYixkLGYpe2lmKGMuaXNGdW5jdGlvbihiKSl7Zj1mfHxkO2Q9YjtiPXt9fXJldHVybiBjLmFqYXgoe3R5cGU6IlBPU1QiLHVybDphLGRhdGE6YixzdWNjZXNzOmQsZGF0YVR5cGU6Zn0pfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSl7Yy5leHRlbmQoYy5hamF4U2V0dGluZ3MsYSl9LGFqYXhTZXR0aW5nczp7dXJsOmxvY2F0aW9uLmhyZWYsCitnbG9iYWw6dHJ1ZSx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOnRydWUsYXN5bmM6dHJ1ZSx4aHI6QS5YTUxIdHRwUmVxdWVzdCYmKEEubG9jYXRpb24ucHJvdG9jb2whPT0iZmlsZToifHwhQS5BY3RpdmVYT2JqZWN0KT9mdW5jdGlvbigpe3JldHVybiBuZXcgQS5YTUxIdHRwUmVxdWVzdH06ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBBLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYSl7fX0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQvcGxhaW4iLF9kZWZhdWx0OiIqLyoifX0sbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7ZS5zdWNjZXNzJiYKK2Uuc3VjY2Vzcy5jYWxsKGssbyxpLHgpO2UuZ2xvYmFsJiZmKCJhamF4U3VjY2VzcyIsW3gsZV0pfWZ1bmN0aW9uIGQoKXtlLmNvbXBsZXRlJiZlLmNvbXBsZXRlLmNhbGwoayx4LGkpO2UuZ2xvYmFsJiZmKCJhamF4Q29tcGxldGUiLFt4LGVdKTtlLmdsb2JhbCYmIS0tYy5hY3RpdmUmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKX1mdW5jdGlvbiBmKHEscCl7KGUuY29udGV4dD9jKGUuY29udGV4dCk6Yy5ldmVudCkudHJpZ2dlcihxLHApfXZhciBlPWMuZXh0ZW5kKHRydWUse30sYy5hamF4U2V0dGluZ3MsYSksaixpLG8saz1hJiZhLmNvbnRleHR8fGUsbj1lLnR5cGUudG9VcHBlckNhc2UoKTtpZihlLmRhdGEmJmUucHJvY2Vzc0RhdGEmJnR5cGVvZiBlLmRhdGEhPT0ic3RyaW5nIillLmRhdGE9Yy5wYXJhbShlLmRhdGEsZS50cmFkaXRpb25hbCk7aWYoZS5kYXRhVHlwZT09PSJqc29ucCIpe2lmKG49PT0iR0VUIilOLnRlc3QoZS51cmwpfHwoZS51cmwrPShrYS50ZXN0KGUudXJsKT8KKyImIjoiPyIpKyhlLmpzb25wfHwiY2FsbGJhY2siKSsiPT8iKTtlbHNlIGlmKCFlLmRhdGF8fCFOLnRlc3QoZS5kYXRhKSllLmRhdGE9KGUuZGF0YT9lLmRhdGErIiYiOiIiKSsoZS5qc29ucHx8ImNhbGxiYWNrIikrIj0/IjtlLmRhdGFUeXBlPSJqc29uIn1pZihlLmRhdGFUeXBlPT09Impzb24iJiYoZS5kYXRhJiZOLnRlc3QoZS5kYXRhKXx8Ti50ZXN0KGUudXJsKSkpe2o9ZS5qc29ucENhbGxiYWNrfHwianNvbnAiK3NiKys7aWYoZS5kYXRhKWUuZGF0YT0oZS5kYXRhKyIiKS5yZXBsYWNlKE4sIj0iK2orIiQxIik7ZS51cmw9ZS51cmwucmVwbGFjZShOLCI9IitqKyIkMSIpO2UuZGF0YVR5cGU9InNjcmlwdCI7QVtqXT1BW2pdfHxmdW5jdGlvbihxKXtvPXE7YigpO2QoKTtBW2pdPXc7dHJ5e2RlbGV0ZSBBW2pdfWNhdGNoKHApe316JiZ6LnJlbW92ZUNoaWxkKEMpfX1pZihlLmRhdGFUeXBlPT09InNjcmlwdCImJmUuY2FjaGU9PT1udWxsKWUuY2FjaGU9ZmFsc2U7aWYoZS5jYWNoZT09PQorZmFsc2UmJm49PT0iR0VUIil7dmFyIHI9SigpLHU9ZS51cmwucmVwbGFjZSh3YiwiJDFfPSIrcisiJDIiKTtlLnVybD11Kyh1PT09ZS51cmw/KGthLnRlc3QoZS51cmwpPyImIjoiPyIpKyJfPSIrcjoiIil9aWYoZS5kYXRhJiZuPT09IkdFVCIpZS51cmwrPShrYS50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmRhdGE7ZS5nbG9iYWwmJiFjLmFjdGl2ZSsrJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO3I9KHI9eGIuZXhlYyhlLnVybCkpJiYoclsxXSYmclsxXSE9PWxvY2F0aW9uLnByb3RvY29sfHxyWzJdIT09bG9jYXRpb24uaG9zdCk7aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZuPT09IkdFVCImJnIpe3ZhciB6PXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8cy5kb2N1bWVudEVsZW1lbnQsQz1zLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO0Muc3JjPWUudXJsO2lmKGUuc2NyaXB0Q2hhcnNldClDLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0O2lmKCFqKXt2YXIgQj0KK2ZhbHNlO0Mub25sb2FkPUMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoIUImJighdGhpcy5yZWFkeVN0YXRlfHx0aGlzLnJlYWR5U3RhdGU9PT0ibG9hZGVkInx8dGhpcy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIikpe0I9dHJ1ZTtiKCk7ZCgpO0Mub25sb2FkPUMub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7eiYmQy5wYXJlbnROb2RlJiZ6LnJlbW92ZUNoaWxkKEMpfX19ei5pbnNlcnRCZWZvcmUoQyx6LmZpcnN0Q2hpbGQpO3JldHVybiB3fXZhciBFPWZhbHNlLHg9ZS54aHIoKTtpZih4KXtlLnVzZXJuYW1lP3gub3BlbihuLGUudXJsLGUuYXN5bmMsZS51c2VybmFtZSxlLnBhc3N3b3JkKTp4Lm9wZW4obixlLnVybCxlLmFzeW5jKTt0cnl7aWYoZS5kYXRhfHxhJiZhLmNvbnRlbnRUeXBlKXguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixlLmNvbnRlbnRUeXBlKTtpZihlLmlmTW9kaWZpZWQpe2MubGFzdE1vZGlmaWVkW2UudXJsXSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsCitjLmxhc3RNb2RpZmllZFtlLnVybF0pO2MuZXRhZ1tlLnVybF0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsYy5ldGFnW2UudXJsXSl9cnx8eC5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKTt4LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZS5kYXRhVHlwZSYmZS5hY2NlcHRzW2UuZGF0YVR5cGVdP2UuYWNjZXB0c1tlLmRhdGFUeXBlXSsiLCAqLyoiOmUuYWNjZXB0cy5fZGVmYXVsdCl9Y2F0Y2goZ2Epe31pZihlLmJlZm9yZVNlbmQmJmUuYmVmb3JlU2VuZC5jYWxsKGsseCxlKT09PWZhbHNlKXtlLmdsb2JhbCYmIS0tYy5hY3RpdmUmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTt4LmFib3J0KCk7cmV0dXJuIGZhbHNlfWUuZ2xvYmFsJiZmKCJhamF4U2VuZCIsW3gsZV0pO3ZhciBnPXgub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHEpe2lmKCF4fHx4LnJlYWR5U3RhdGU9PT0wfHxxPT09ImFib3J0Iil7RXx8CitkKCk7RT10cnVlO2lmKHgpeC5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUUmJngmJih4LnJlYWR5U3RhdGU9PT00fHxxPT09InRpbWVvdXQiKSl7RT10cnVlO3gub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtpPXE9PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHgpPyJlcnJvciI6ZS5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh4LGUudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihpPT09InN1Y2Nlc3MiKXRyeXtvPWMuaHR0cERhdGEoeCxlLmRhdGFUeXBlLGUpfWNhdGNoKHYpe2k9InBhcnNlcmVycm9yIjtwPXZ9aWYoaT09PSJzdWNjZXNzInx8aT09PSJub3Rtb2RpZmllZCIpanx8YigpO2Vsc2UgYy5oYW5kbGVFcnJvcihlLHgsaSxwKTtkKCk7cT09PSJ0aW1lb3V0IiYmeC5hYm9ydCgpO2lmKGUuYXN5bmMpeD1udWxsfX07dHJ5e3ZhciBoPXguYWJvcnQ7eC5hYm9ydD1mdW5jdGlvbigpe3gmJmguY2FsbCh4KTsKK2coImFib3J0Iil9fWNhdGNoKGwpe31lLmFzeW5jJiZlLnRpbWVvdXQ+MCYmc2V0VGltZW91dChmdW5jdGlvbigpe3gmJiFFJiZnKCJ0aW1lb3V0Iil9LGUudGltZW91dCk7dHJ5e3guc2VuZChuPT09IlBPU1QifHxuPT09IlBVVCJ8fG49PT0iREVMRVRFIj9lLmRhdGE6bnVsbCl9Y2F0Y2gobSl7Yy5oYW5kbGVFcnJvcihlLHgsbnVsbCxtKTtkKCl9ZS5hc3luY3x8ZygpO3JldHVybiB4fX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYS5lcnJvcilhLmVycm9yLmNhbGwoYS5jb250ZXh0fHxhLGIsZCxmKTtpZihhLmdsb2JhbCkoYS5jb250ZXh0P2MoYS5jb250ZXh0KTpjLmV2ZW50KS50cmlnZ2VyKCJhamF4RXJyb3IiLFtiLGEsZl0pfSxhY3RpdmU6MCxodHRwU3VjY2VzczpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIWEuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09PSJmaWxlOiJ8fGEuc3RhdHVzPj0yMDAmJmEuc3RhdHVzPDMwMHx8YS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09CisxMjIzfHxhLnN0YXR1cz09PTB9Y2F0Y2goYil7fXJldHVybiBmYWxzZX0saHR0cE5vdE1vZGlmaWVkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLGY9YS5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpO2lmKGQpYy5sYXN0TW9kaWZpZWRbYl09ZDtpZihmKWMuZXRhZ1tiXT1mO3JldHVybiBhLnN0YXR1cz09PTMwNHx8YS5zdGF0dXM9PT0wfSxodHRwRGF0YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9YS5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIil8fCIiLGU9Yj09PSJ4bWwifHwhYiYmZi5pbmRleE9mKCJ4bWwiKT49MDthPWU/YS5yZXNwb25zZVhNTDphLnJlc3BvbnNlVGV4dDtlJiZhLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZT09PSJwYXJzZXJlcnJvciImJmMuZXJyb3IoInBhcnNlcmVycm9yIik7aWYoZCYmZC5kYXRhRmlsdGVyKWE9ZC5kYXRhRmlsdGVyKGEsYik7aWYodHlwZW9mIGE9PT0ic3RyaW5nIilpZihiPT09CisianNvbiJ8fCFiJiZmLmluZGV4T2YoImpzb24iKT49MClhPWMucGFyc2VKU09OKGEpO2Vsc2UgaWYoYj09PSJzY3JpcHQifHwhYiYmZi5pbmRleE9mKCJqYXZhc2NyaXB0Iik+PTApYy5nbG9iYWxFdmFsKGEpO3JldHVybiBhfSxwYXJhbTpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoaSxvKXtpZihjLmlzQXJyYXkobykpYy5lYWNoKG8sZnVuY3Rpb24oayxuKXtifHwvXFtcXSQvLnRlc3QoaSk/ZihpLG4pOmQoaSsiWyIrKHR5cGVvZiBuPT09Im9iamVjdCJ8fGMuaXNBcnJheShuKT9rOiIiKSsiXSIsbil9KTtlbHNlIWImJm8hPW51bGwmJnR5cGVvZiBvPT09Im9iamVjdCI/Yy5lYWNoKG8sZnVuY3Rpb24oayxuKXtkKGkrIlsiK2srIl0iLG4pfSk6ZihpLG8pfWZ1bmN0aW9uIGYoaSxvKXtvPWMuaXNGdW5jdGlvbihvKT9vKCk6bztlW2UubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoaSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChvKX12YXIgZT1bXTtpZihiPT09dyliPWMuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOworaWYoYy5pc0FycmF5KGEpfHxhLmpxdWVyeSljLmVhY2goYSxmdW5jdGlvbigpe2YodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGogaW4gYSlkKGosYVtqXSk7cmV0dXJuIGUuam9pbigiJiIpLnJlcGxhY2UoeWIsIisiKX19KTt2YXIgbGE9e30sQWI9L3RvZ2dsZXxzaG93fGhpZGUvLEJiPS9eKFsrLV09KT8oW1xkKy0uXSspKC4qKSQvLFcsdmE9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV07Yy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKEsoInNob3ciLDMpLGEsYik7ZWxzZXthPTA7Zm9yKGI9dGhpcy5sZW5ndGg7YTxiO2ErKyl7dmFyIGQ9Yy5kYXRhKHRoaXNbYV0sIm9sZGRpc3BsYXkiKTsKK3RoaXNbYV0uc3R5bGUuZGlzcGxheT1kfHwiIjtpZihjLmNzcyh0aGlzW2FdLCJkaXNwbGF5Iik9PT0ibm9uZSIpe2Q9dGhpc1thXS5ub2RlTmFtZTt2YXIgZjtpZihsYVtkXSlmPWxhW2RdO2Vsc2V7dmFyIGU9YygiPCIrZCsiIC8+IikuYXBwZW5kVG8oImJvZHkiKTtmPWUuY3NzKCJkaXNwbGF5Iik7aWYoZj09PSJub25lIilmPSJibG9jayI7ZS5yZW1vdmUoKTtsYVtkXT1mfWMuZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5IixmKX19YT0wO2ZvcihiPXRoaXMubGVuZ3RoO2E8YjthKyspdGhpc1thXS5zdHlsZS5kaXNwbGF5PWMuZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5Iil8fCIiO3JldHVybiB0aGlzfX0saGlkZTpmdW5jdGlvbihhLGIpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoSygiaGlkZSIsMyksYSxiKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXt2YXIgZD1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpOyFkJiZkIT09Im5vbmUiJiZjLmRhdGEodGhpc1thXSwKKyJvbGRkaXNwbGF5IixjLmNzcyh0aGlzW2FdLCJkaXNwbGF5IikpfWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9fSxfdG9nZ2xlOmMuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWQ/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoSygidG9nZ2xlIiwzKSxhLGIpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxkKX0sCithbmltYXRlOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBlPWMuc3BlZWQoYixkLGYpO2lmKGMuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGUuY29tcGxldGUpO3JldHVybiB0aGlzW2UucXVldWU9PT1mYWxzZT8iZWFjaCI6InF1ZXVlIl0oZnVuY3Rpb24oKXt2YXIgaj1jLmV4dGVuZCh7fSxlKSxpLG89dGhpcy5ub2RlVHlwZT09PTEmJmModGhpcykuaXMoIjpoaWRkZW4iKSxrPXRoaXM7Zm9yKGkgaW4gYSl7dmFyIG49aS5yZXBsYWNlKGlhLGphKTtpZihpIT09bil7YVtuXT1hW2ldO2RlbGV0ZSBhW2ldO2k9bn1pZihhW2ldPT09ImhpZGUiJiZvfHxhW2ldPT09InNob3ciJiYhbylyZXR1cm4gai5jb21wbGV0ZS5jYWxsKHRoaXMpO2lmKChpPT09ImhlaWdodCJ8fGk9PT0id2lkdGgiKSYmdGhpcy5zdHlsZSl7ai5kaXNwbGF5PWMuY3NzKHRoaXMsImRpc3BsYXkiKTtqLm92ZXJmbG93PXRoaXMuc3R5bGUub3ZlcmZsb3d9aWYoYy5pc0FycmF5KGFbaV0pKXsoai5zcGVjaWFsRWFzaW5nPQorai5zcGVjaWFsRWFzaW5nfHx7fSlbaV09YVtpXVsxXTthW2ldPWFbaV1bMF19fWlmKGoub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtqLmN1ckFuaW09Yy5leHRlbmQoe30sYSk7Yy5lYWNoKGEsZnVuY3Rpb24ocix1KXt2YXIgej1uZXcgYy5meChrLGoscik7aWYoQWIudGVzdCh1KSl6W3U9PT0idG9nZ2xlIj9vPyJzaG93IjoiaGlkZSI6dV0oYSk7ZWxzZXt2YXIgQz1CYi5leGVjKHUpLEI9ei5jdXIodHJ1ZSl8fDA7aWYoQyl7dT1wYXJzZUZsb2F0KENbMl0pO3ZhciBFPUNbM118fCJweCI7aWYoRSE9PSJweCIpe2suc3R5bGVbcl09KHV8fDEpK0U7Qj0odXx8MSkvei5jdXIodHJ1ZSkqQjtrLnN0eWxlW3JdPUIrRX1pZihDWzFdKXU9KENbMV09PT0iLT0iPy0xOjEpKnUrQjt6LmN1c3RvbShCLHUsRSl9ZWxzZSB6LmN1c3RvbShCLHUsIiIpfX0pO3JldHVybiB0cnVlfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLnRpbWVyczthJiZ0aGlzLnF1ZXVlKFtdKTsKK3RoaXMuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgZj1kLmxlbmd0aC0xO2Y+PTA7Zi0tKWlmKGRbZl0uZWxlbT09PXRoaXMpe2ImJmRbZl0odHJ1ZSk7ZC5zcGxpY2UoZiwxKX19KTtifHx0aGlzLmRlcXVldWUoKTtyZXR1cm4gdGhpc319KTtjLmVhY2goe3NsaWRlRG93bjpLKCJzaG93IiwxKSxzbGlkZVVwOksoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOksoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9fSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsZCxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/YTp7Y29tcGxldGU6ZHx8IWQmJmJ8fGMuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpkJiZifHxiJiYhYy5pc0Z1bmN0aW9uKGIpJiZifTtmLmR1cmF0aW9uPWMuZngub2ZmPzA6dHlwZW9mIGYuZHVyYXRpb249PT0KKyJudW1iZXIiP2YuZHVyYXRpb246Yy5meC5zcGVlZHNbZi5kdXJhdGlvbl18fGMuZnguc3BlZWRzLl9kZWZhdWx0O2Yub2xkPWYuY29tcGxldGU7Zi5jb21wbGV0ZT1mdW5jdGlvbigpe2YucXVldWUhPT1mYWxzZSYmYyh0aGlzKS5kZXF1ZXVlKCk7Yy5pc0Z1bmN0aW9uKGYub2xkKSYmZi5vbGQuY2FsbCh0aGlzKX07cmV0dXJuIGZ9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixkLGYpe3JldHVybiBkK2YqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrMC41KSpmK2R9fSx0aW1lcnM6W10sZng6ZnVuY3Rpb24oYSxiLGQpe3RoaXMub3B0aW9ucz1iO3RoaXMuZWxlbT1hO3RoaXMucHJvcD1kO2lmKCFiLm9yaWcpYi5vcmlnPXt9fX0pO2MuZngucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyk7KGMuZnguc3RlcFt0aGlzLnByb3BdfHwKK2MuZnguc3RlcC5fZGVmYXVsdCkodGhpcyk7aWYoKHRoaXMucHJvcD09PSJoZWlnaHQifHx0aGlzLnByb3A9PT0id2lkdGgiKSYmdGhpcy5lbGVtLnN0eWxlKXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LGN1cjpmdW5jdGlvbihhKXtpZih0aGlzLmVsZW1bdGhpcy5wcm9wXSE9bnVsbCYmKCF0aGlzLmVsZW0uc3R5bGV8fHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1udWxsKSlyZXR1cm4gdGhpcy5lbGVtW3RoaXMucHJvcF07cmV0dXJuKGE9cGFyc2VGbG9hdChjLmNzcyh0aGlzLmVsZW0sdGhpcy5wcm9wLGEpKSkmJmE+LTEwMDAwP2E6cGFyc2VGbG9hdChjLmN1ckNTUyh0aGlzLmVsZW0sdGhpcy5wcm9wKSl8fDB9LGN1c3RvbTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZihqKXtyZXR1cm4gZS5zdGVwKGopfXRoaXMuc3RhcnRUaW1lPUooKTt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7Cit0aGlzLnBvcz10aGlzLnN0YXRlPTA7dmFyIGU9dGhpcztmLmVsZW09dGhpcy5lbGVtO2lmKGYoKSYmYy50aW1lcnMucHVzaChmKSYmIVcpVz1zZXRJbnRlcnZhbChjLmZ4LnRpY2ssMTMpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPUooKSxkPXRydWU7aWYoYXx8Yj49dGhpcy5vcHRpb25zLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz0KK3RoaXMuZW5kO3RoaXMucG9zPXRoaXMuc3RhdGU9MTt0aGlzLnVwZGF0ZSgpO3RoaXMub3B0aW9ucy5jdXJBbmltW3RoaXMucHJvcF09dHJ1ZTtmb3IodmFyIGYgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0paWYodGhpcy5vcHRpb25zLmN1ckFuaW1bZl0hPT10cnVlKWQ9ZmFsc2U7aWYoZCl7aWYodGhpcy5vcHRpb25zLmRpc3BsYXkhPW51bGwpe3RoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdz10aGlzLm9wdGlvbnMub3ZlcmZsb3c7YT1jLmRhdGEodGhpcy5lbGVtLCJvbGRkaXNwbGF5Iik7dGhpcy5lbGVtLnN0eWxlLmRpc3BsYXk9YT9hOnRoaXMub3B0aW9ucy5kaXNwbGF5O2lmKGMuY3NzKHRoaXMuZWxlbSwiZGlzcGxheSIpPT09Im5vbmUiKXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9dGhpcy5vcHRpb25zLmhpZGUmJmModGhpcy5lbGVtKS5oaWRlKCk7aWYodGhpcy5vcHRpb25zLmhpZGV8fHRoaXMub3B0aW9ucy5zaG93KWZvcih2YXIgZSBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSljLnN0eWxlKHRoaXMuZWxlbSwKK2UsdGhpcy5vcHRpb25zLm9yaWdbZV0pO3RoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKHRoaXMuZWxlbSl9cmV0dXJuIGZhbHNlfWVsc2V7ZT1iLXRoaXMuc3RhcnRUaW1lO3RoaXMuc3RhdGU9ZS90aGlzLm9wdGlvbnMuZHVyYXRpb247YT10aGlzLm9wdGlvbnMuZWFzaW5nfHwoYy5lYXNpbmcuc3dpbmc/InN3aW5nIjoibGluZWFyIik7dGhpcy5wb3M9Yy5lYXNpbmdbdGhpcy5vcHRpb25zLnNwZWNpYWxFYXNpbmcmJnRoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nW3RoaXMucHJvcF18fGFdKHRoaXMuc3RhdGUsZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTt0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvczt0aGlzLnVwZGF0ZSgpfXJldHVybiB0cnVlfX07Yy5leHRlbmQoYy5meCx7dGljazpmdW5jdGlvbigpe2Zvcih2YXIgYT1jLnRpbWVycyxiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSgpfHxhLnNwbGljZShiLS0sMSk7YS5sZW5ndGh8fAorYy5meC5zdG9wKCl9LHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFcpO1c9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Yy5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7aWYoYS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbClhLmVsZW0uc3R5bGVbYS5wcm9wXT0oYS5wcm9wPT09IndpZHRoInx8YS5wcm9wPT09ImhlaWdodCI/TWF0aC5tYXgoMCxhLm5vdyk6YS5ub3cpK2EudW5pdDtlbHNlIGEuZWxlbVthLnByb3BdPWEubm93fX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKWMuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBjLmdyZXAoYy50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gcy5kb2N1bWVudEVsZW1lbnQ/CitmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGUpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3ZhciBkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj1iLm93bmVyRG9jdW1lbnQ7Yj1mLmJvZHk7Zj1mLmRvY3VtZW50RWxlbWVudDtyZXR1cm57dG9wOmQudG9wKyhzZWxmLnBhZ2VZT2Zmc2V0fHxjLnN1cHBvcnQuYm94TW9kZWwmJmYuc2Nyb2xsVG9wfHxiLnNjcm9sbFRvcCktKGYuY2xpZW50VG9wfHxiLmNsaWVudFRvcHx8MCksbGVmdDpkLmxlZnQrKHNlbGYucGFnZVhPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmZi5zY3JvbGxMZWZ0fHxiLnNjcm9sbExlZnQpLShmLmNsaWVudExlZnR8fGIuY2xpZW50TGVmdHx8MCl9fTpmdW5jdGlvbihhKXt2YXIgYj0KK3RoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEscil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7Yy5vZmZzZXQuaW5pdGlhbGl6ZSgpO3ZhciBkPWIub2Zmc2V0UGFyZW50LGY9YixlPWIub3duZXJEb2N1bWVudCxqLGk9ZS5kb2N1bWVudEVsZW1lbnQsbz1lLmJvZHk7Zj0oZT1lLmRlZmF1bHRWaWV3KT9lLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTtmb3IodmFyIGs9Yi5vZmZzZXRUb3Asbj1iLm9mZnNldExlZnQ7KGI9Yi5wYXJlbnROb2RlKSYmYiE9PW8mJmIhPT1pOyl7aWYoYy5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uJiZmLnBvc2l0aW9uPT09ImZpeGVkIilicmVhaztqPWU/ZS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGU7CitrLT1iLnNjcm9sbFRvcDtuLT1iLnNjcm9sbExlZnQ7aWYoYj09PWQpe2srPWIub2Zmc2V0VG9wO24rPWIub2Zmc2V0TGVmdDtpZihjLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYhKGMub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzJiYvXnQoYWJsZXxkfGgpJC9pLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGouYm9yZGVyVG9wV2lkdGgpfHwwO24rPXBhcnNlRmxvYXQoai5ib3JkZXJMZWZ0V2lkdGgpfHwwfWY9ZDtkPWIub2Zmc2V0UGFyZW50fWlmKGMub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmai5vdmVyZmxvdyE9PSJ2aXNpYmxlIil7ays9cGFyc2VGbG9hdChqLmJvcmRlclRvcFdpZHRoKXx8MDtuKz1wYXJzZUZsb2F0KGouYm9yZGVyTGVmdFdpZHRoKXx8MH1mPWp9aWYoZi5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGYucG9zaXRpb249PT0ic3RhdGljIil7ays9by5vZmZzZXRUb3A7bis9by5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmCitmLnBvc2l0aW9uPT09ImZpeGVkIil7ays9TWF0aC5tYXgoaS5zY3JvbGxUb3Asby5zY3JvbGxUb3ApO24rPU1hdGgubWF4KGkuc2Nyb2xsTGVmdCxvLnNjcm9sbExlZnQpfXJldHVybnt0b3A6ayxsZWZ0Om59fTtjLm9mZnNldD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXMuYm9keSxiPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksZCxmLGUsaj1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpblRvcCIsdHJ1ZSkpfHwwO2MuZXh0ZW5kKGIuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLGJvcmRlcjowLHdpZHRoOiIxcHgiLGhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSk7Yi5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CithLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCk7ZD1iLmZpcnN0Q2hpbGQ7Zj1kLmZpcnN0Q2hpbGQ7ZT1kLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDt0aGlzLmRvZXNOb3RBZGRCb3JkZXI9Zi5vZmZzZXRUb3AhPT01O3RoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM9ZS5vZmZzZXRUb3A9PT01O2Yuc3R5bGUucG9zaXRpb249ImZpeGVkIjtmLnN0eWxlLnRvcD0iMjBweCI7dGhpcy5zdXBwb3J0c0ZpeGVkUG9zaXRpb249Zi5vZmZzZXRUb3A9PT0yMHx8Zi5vZmZzZXRUb3A9PT0xNTtmLnN0eWxlLnBvc2l0aW9uPWYuc3R5bGUudG9wPSIiO2Quc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7ZC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO3RoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWYub2Zmc2V0VG9wPT09LTU7dGhpcy5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRvcCE9PWo7YS5yZW1vdmVDaGlsZChiKTsKK2Mub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpbkxlZnQiLHRydWUpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXtpZigvc3RhdGljLy50ZXN0KGMuY3VyQ1NTKGEsInBvc2l0aW9uIikpKWEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZj1jKGEpLGU9Zi5vZmZzZXQoKSxqPXBhcnNlSW50KGMuY3VyQ1NTKGEsInRvcCIsdHJ1ZSksMTApfHwwLGk9cGFyc2VJbnQoYy5jdXJDU1MoYSwibGVmdCIsdHJ1ZSksMTApfHwwO2lmKGMuaXNGdW5jdGlvbihiKSliPWIuY2FsbChhLAorZCxlKTtkPXt0b3A6Yi50b3AtZS50b3AraixsZWZ0OmIubGVmdC1lLmxlZnQraX07InVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsZCk6Zi5jc3MoZCl9fTtjLmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm4gbnVsbDt2YXIgYT10aGlzWzBdLGI9dGhpcy5vZmZzZXRQYXJlbnQoKSxkPXRoaXMub2Zmc2V0KCksZj0vXmJvZHl8aHRtbCQvaS50ZXN0KGJbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCk7ZC50b3AtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luVG9wIix0cnVlKSl8fDA7ZC5sZWZ0LT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpbkxlZnQiLHRydWUpKXx8MDtmLnRvcCs9cGFyc2VGbG9hdChjLmN1ckNTUyhiWzBdLCJib3JkZXJUb3BXaWR0aCIsdHJ1ZSkpfHwwO2YubGVmdCs9cGFyc2VGbG9hdChjLmN1ckNTUyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiLHRydWUpKXx8MDtyZXR1cm57dG9wOmQudG9wLQorZi50b3AsbGVmdDpkLmxlZnQtZi5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxzLmJvZHk7YSYmIS9eYm9keXxodG1sJC9pLnRlc3QoYS5ub2RlTmFtZSkmJmMuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIjspYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYX0pfX0pO2MuZWFjaChbIkxlZnQiLCJUb3AiXSxmdW5jdGlvbihhLGIpe3ZhciBkPSJzY3JvbGwiK2I7Yy5mbltkXT1mdW5jdGlvbihmKXt2YXIgZT10aGlzWzBdLGo7aWYoIWUpcmV0dXJuIG51bGw7aWYoZiE9PXcpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGo9d2EodGhpcykpai5zY3JvbGxUbyghYT9mOmMoaikuc2Nyb2xsTGVmdCgpLGE/ZjpjKGopLnNjcm9sbFRvcCgpKTtlbHNlIHRoaXNbZF09Zn0pO2Vsc2UgcmV0dXJuKGo9d2EoZSkpPyJwYWdlWE9mZnNldCJpbiBqP2pbYT8icGFnZVlPZmZzZXQiOgorInBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZqLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8ai5kb2N1bWVudC5ib2R5W2RdOmVbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTtjLmZuWyJpbm5lciIrYl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1swXT9jLmNzcyh0aGlzWzBdLGQsZmFsc2UsInBhZGRpbmciKTpudWxsfTtjLmZuWyJvdXRlciIrYl09ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXNbMF0/Yy5jc3ModGhpc1swXSxkLGZhbHNlLGY/Im1hcmdpbiI6ImJvcmRlciIpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXTtpZighZSlyZXR1cm4gZj09bnVsbD9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oail7dmFyIGk9Yyh0aGlzKTtpW2RdKGYuY2FsbCh0aGlzLGosaVtkXSgpKSl9KTtyZXR1cm4ic2Nyb2xsVG8iaW4KK2UmJmUuZG9jdW1lbnQ/ZS5kb2N1bWVudC5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiJiZlLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitiXXx8ZS5kb2N1bWVudC5ib2R5WyJjbGllbnQiK2JdOmUubm9kZVR5cGU9PT05P01hdGgubWF4KGUuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2JdLGUuYm9keVsic2Nyb2xsIitiXSxlLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIitiXSxlLmJvZHlbIm9mZnNldCIrYl0sZS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIrYl0pOmY9PT13P2MuY3NzKGUsZCk6dGhpcy5jc3MoZCx0eXBlb2YgZj09PSJzdHJpbmciP2Y6ZisicHgiKX19KTtBLmpRdWVyeT1BLiQ9Y30pKHdpbmRvdyk7CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvanF1ZXJ5LmRhdGFUYWJsZXMubWluLmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQxN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICBqcXVlcnkuZGF0YVRhYmxlcy5taW4uanMKKyAqIFZlcnNpb246ICAgICAxLjQuMworICogQXV0aG9yOiAgICAgIEFsbGFuIEphcmRpbmUgKHd3dy5zcHJ5bWVkaWEuY28udWspCisgKiAKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQWxsYW4gSmFyZGluZSwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIHVuZGVyIGVpdGhlciB0aGUgR1BMIHYyIGxpY2Vuc2Ugb3IgYQorICogQlNEIHN0eWxlIGxpY2Vuc2UsIGFzIHN1cHBsaWVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KKyAqIAorICogVGhpcyBzb3VyY2UgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgCisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSAKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGxpY2Vuc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKi8KKyhmdW5jdGlvbigkKXskLmZuLmRhdGFUYWJsZVNldHRpbmdzPVtdOyQuZm4uZGF0YVRhYmxlRXh0PXt9OyQuZm4uZGF0YVRhYmxlRXh0Lm9BcGk9e307CiskLmZuLmRhdGFUYWJsZUV4dC5vUGFnaW5hdGlvbj17dHdvX2J1dHRvbjp7Zm5Jbml0OmZ1bmN0aW9uKG9TZXR0aW5ncyxmbkNhbGxiYWNrRHJhdyl7b1NldHRpbmdzLm5QcmV2aW91cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK29TZXR0aW5ncy5uTmV4dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihvU2V0dGluZ3Muc1RhYmxlSWQhPT0iIil7b1NldHRpbmdzLm5QYWdpbmF0ZS5zZXRBdHRyaWJ1dGUoImlkIixvU2V0dGluZ3Muc1RhYmxlSWQrIl9wYWdpbmF0ZSIpOworb1NldHRpbmdzLm5QcmV2aW91cy5zZXRBdHRyaWJ1dGUoImlkIixvU2V0dGluZ3Muc1RhYmxlSWQrIl9wcmV2aW91cyIpO29TZXR0aW5ncy5uTmV4dC5zZXRBdHRyaWJ1dGUoImlkIixvU2V0dGluZ3Muc1RhYmxlSWQrIl9uZXh0IikKK31vU2V0dGluZ3MublByZXZpb3VzLmNsYXNzTmFtZT0icGFnaW5hdGVfZGlzYWJsZWRfcHJldmlvdXMiO29TZXR0aW5ncy5uTmV4dC5jbGFzc05hbWU9InBhZ2luYXRlX2Rpc2FibGVkX25leHQiOworb1NldHRpbmdzLm5QYWdpbmF0ZS5hcHBlbmRDaGlsZChvU2V0dGluZ3MublByZXZpb3VzKTtvU2V0dGluZ3MublBhZ2luYXRlLmFwcGVuZENoaWxkKG9TZXR0aW5ncy5uTmV4dCk7CiskKG9TZXR0aW5ncy5uUGFnaW5hdGUpLmluc2VydEFmdGVyKG9TZXR0aW5ncy5uVGFibGUpOyQob1NldHRpbmdzLm5QcmV2aW91cykuY2xpY2soZnVuY3Rpb24oKXtvU2V0dGluZ3MuaURpc3BsYXlTdGFydC09b1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RoOworaWYob1NldHRpbmdzLmlEaXNwbGF5U3RhcnQ8MCl7b1NldHRpbmdzLmlEaXNwbGF5U3RhcnQ9MH1mbkNhbGxiYWNrRHJhdyhvU2V0dGluZ3MpCit9KTskKG9TZXR0aW5ncy5uTmV4dCkuY2xpY2soZnVuY3Rpb24oKXtpZihvU2V0dGluZ3MuaURpc3BsYXlTdGFydCtvU2V0dGluZ3MuaURpc3BsYXlMZW5ndGg8b1NldHRpbmdzLmFpRGlzcGxheS5sZW5ndGgpe29TZXR0aW5ncy5pRGlzcGxheVN0YXJ0Kz1vU2V0dGluZ3MuaURpc3BsYXlMZW5ndGgKK31mbkNhbGxiYWNrRHJhdyhvU2V0dGluZ3MpfSl9LGZuVXBkYXRlOmZ1bmN0aW9uKG9TZXR0aW5ncyxmbkNhbGxiYWNrRHJhdyl7b1NldHRpbmdzLm5QcmV2aW91cy5jbGFzc05hbWU9KG9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0PT09MCk/InBhZ2luYXRlX2Rpc2FibGVkX3ByZXZpb3VzIjoicGFnaW5hdGVfZW5hYmxlZF9wcmV2aW91cyI7CitvU2V0dGluZ3Mubk5leHQuY2xhc3NOYW1lPShvU2V0dGluZ3MuaURpc3BsYXlFbmQ9PW9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoKT8icGFnaW5hdGVfZGlzYWJsZWRfbmV4dCI6InBhZ2luYXRlX2VuYWJsZWRfbmV4dCIKK319LGlGdWxsTnVtYmVyc1Nob3dQYWdlczo1LGZ1bGxfbnVtYmVyczp7Zm5Jbml0OmZ1bmN0aW9uKG9TZXR0aW5ncyxmbkNhbGxiYWNrRHJhdyl7dmFyIG5GaXJzdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Cit2YXIgblByZXZpb3VzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt2YXIgbkxpc3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwordmFyIG5OZXh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt2YXIgbkxhc3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworbkZpcnN0LmlubmVySFRNTD1vU2V0dGluZ3Mub0xhbmd1YWdlLm9QYWdpbmF0ZS5zRmlyc3Q7blByZXZpb3VzLmlubmVySFRNTD1vU2V0dGluZ3Mub0xhbmd1YWdlLm9QYWdpbmF0ZS5zUHJldmlvdXM7CituTmV4dC5pbm5lckhUTUw9b1NldHRpbmdzLm9MYW5ndWFnZS5vUGFnaW5hdGUuc05leHQ7bkxhc3QuaW5uZXJIVE1MPW9TZXR0aW5ncy5vTGFuZ3VhZ2Uub1BhZ2luYXRlLnNMYXN0OworbkZpcnN0LmNsYXNzTmFtZT0icGFnaW5hdGVfYnV0dG9uIGZpcnN0IjtuUHJldmlvdXMuY2xhc3NOYW1lPSJwYWdpbmF0ZV9idXR0b24gcHJldmlvdXMiOworbk5leHQuY2xhc3NOYW1lPSJwYWdpbmF0ZV9idXR0b24gbmV4dCI7bkxhc3QuY2xhc3NOYW1lPSJwYWdpbmF0ZV9idXR0b24gbGFzdCI7b1NldHRpbmdzLm5QYWdpbmF0ZS5hcHBlbmRDaGlsZChuRmlyc3QpOworb1NldHRpbmdzLm5QYWdpbmF0ZS5hcHBlbmRDaGlsZChuUHJldmlvdXMpO29TZXR0aW5ncy5uUGFnaW5hdGUuYXBwZW5kQ2hpbGQobkxpc3QpOworb1NldHRpbmdzLm5QYWdpbmF0ZS5hcHBlbmRDaGlsZChuTmV4dCk7b1NldHRpbmdzLm5QYWdpbmF0ZS5hcHBlbmRDaGlsZChuTGFzdCk7JChuRmlyc3QpLmNsaWNrKGZ1bmN0aW9uKCl7b1NldHRpbmdzLmlEaXNwbGF5U3RhcnQ9MDsKK2ZuQ2FsbGJhY2tEcmF3KG9TZXR0aW5ncyl9KTskKG5QcmV2aW91cykuY2xpY2soZnVuY3Rpb24oKXtvU2V0dGluZ3MuaURpc3BsYXlTdGFydC09b1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RoOworaWYob1NldHRpbmdzLmlEaXNwbGF5U3RhcnQ8MCl7b1NldHRpbmdzLmlEaXNwbGF5U3RhcnQ9MH1mbkNhbGxiYWNrRHJhdyhvU2V0dGluZ3MpCit9KTskKG5OZXh0KS5jbGljayhmdW5jdGlvbigpe2lmKG9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0K29TZXR0aW5ncy5pRGlzcGxheUxlbmd0aDxvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aCl7b1NldHRpbmdzLmlEaXNwbGF5U3RhcnQrPW9TZXR0aW5ncy5pRGlzcGxheUxlbmd0aAorfWZuQ2FsbGJhY2tEcmF3KG9TZXR0aW5ncyl9KTskKG5MYXN0KS5jbGljayhmdW5jdGlvbigpe3ZhciBpUGFnZXM9cGFyc2VJbnQoKG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoLTEpL29TZXR0aW5ncy5pRGlzcGxheUxlbmd0aCwxMCkrMTsKK29TZXR0aW5ncy5pRGlzcGxheVN0YXJ0PShpUGFnZXMtMSkqb1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RoO2ZuQ2FsbGJhY2tEcmF3KG9TZXR0aW5ncykKK30pOyQoInNwYW4iLG9TZXR0aW5ncy5uUGFnaW5hdGUpLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KTskKCJzcGFuIixvU2V0dGluZ3MublBhZ2luYXRlKS5iaW5kKCJzZWxlY3RzdGFydCIsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2UKK30pO29TZXR0aW5ncy5uUGFnaW5hdGVMaXN0PW5MaXN0fSxmblVwZGF0ZTpmdW5jdGlvbihvU2V0dGluZ3MsZm5DYWxsYmFja0RyYXcpe3ZhciBpUGFnZUNvdW50PWpRdWVyeS5mbi5kYXRhVGFibGVFeHQub1BhZ2luYXRpb24uaUZ1bGxOdW1iZXJzU2hvd1BhZ2VzOwordmFyIGlQYWdlQ291bnRIYWxmPU1hdGguZmxvb3IoaVBhZ2VDb3VudC8yKTt2YXIgaVBhZ2VzPXBhcnNlSW50KChvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aC0xKS9vU2V0dGluZ3MuaURpc3BsYXlMZW5ndGgsMTApKzE7Cit2YXIgaUN1cnJlbnRQYWdlPXBhcnNlSW50KG9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0L29TZXR0aW5ncy5pRGlzcGxheUxlbmd0aCwxMCkrMTsKK3ZhciBzTGlzdD0iIjt2YXIgaVN0YXJ0QnV0dG9uO3ZhciBpRW5kQnV0dG9uO2lmKGlQYWdlczxpUGFnZUNvdW50KXtpU3RhcnRCdXR0b249MTsKK2lFbmRCdXR0b249aVBhZ2VzfWVsc2V7aWYoaUN1cnJlbnRQYWdlPD1pUGFnZUNvdW50SGFsZil7aVN0YXJ0QnV0dG9uPTE7aUVuZEJ1dHRvbj1pUGFnZUNvdW50Cit9ZWxzZXtpZihpQ3VycmVudFBhZ2U+PShpUGFnZXMtaVBhZ2VDb3VudEhhbGYpKXtpU3RhcnRCdXR0b249aVBhZ2VzLWlQYWdlQ291bnQrMTsKK2lFbmRCdXR0b249aVBhZ2VzfWVsc2V7aVN0YXJ0QnV0dG9uPWlDdXJyZW50UGFnZS1NYXRoLmNlaWwoaVBhZ2VDb3VudC8yKSsxO2lFbmRCdXR0b249aVN0YXJ0QnV0dG9uK2lQYWdlQ291bnQtMQorfX19Zm9yKHZhciBpPWlTdGFydEJ1dHRvbjtpPD1pRW5kQnV0dG9uO2krKyl7aWYoaUN1cnJlbnRQYWdlIT1pKXtzTGlzdCs9JzxzcGFuIGNsYXNzPSJwYWdpbmF0ZV9idXR0b24iPicraSsiPC9zcGFuPiIKK31lbHNle3NMaXN0Kz0nPHNwYW4gY2xhc3M9InBhZ2luYXRlX2FjdGl2ZSI+JytpKyI8L3NwYW4+In19b1NldHRpbmdzLm5QYWdpbmF0ZUxpc3QuaW5uZXJIVE1MPXNMaXN0OworJCgic3BhbiIsb1NldHRpbmdzLm5QYWdpbmF0ZUxpc3QpLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KTskKCJzcGFuIixvU2V0dGluZ3MublBhZ2luYXRlTGlzdCkuYmluZCgic2VsZWN0c3RhcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlCit9KTskKCJzcGFuIixvU2V0dGluZ3MublBhZ2luYXRlTGlzdCkuY2xpY2soZnVuY3Rpb24oKXt2YXIgaVRhcmdldD0odGhpcy5pbm5lckhUTUwqMSktMTsKK29TZXR0aW5ncy5pRGlzcGxheVN0YXJ0PWlUYXJnZXQqb1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RoO2ZuQ2FsbGJhY2tEcmF3KG9TZXR0aW5ncyk7CityZXR1cm4gZmFsc2V9KX19fTskLmZuLmRhdGFUYWJsZUV4dC5vU29ydD17InN0cmluZy1hc2MiOmZ1bmN0aW9uKGEsYil7dmFyIHg9YS50b0xvd2VyQ2FzZSgpOwordmFyIHk9Yi50b0xvd2VyQ2FzZSgpO3JldHVybigoeDx5KT8tMTooKHg+eSk/MTowKSl9LCJzdHJpbmctZGVzYyI6ZnVuY3Rpb24oYSxiKXt2YXIgeD1hLnRvTG93ZXJDYXNlKCk7Cit2YXIgeT1iLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCh4PHkpPzE6KCh4PnkpPy0xOjApKX0sImh0bWwtYXNjIjpmdW5jdGlvbihhLGIpe3ZhciB4PWEucmVwbGFjZSgvPC4qPz4vZywiIikudG9Mb3dlckNhc2UoKTsKK3ZhciB5PWIucmVwbGFjZSgvPC4qPz4vZywiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4oKHg8eSk/LTE6KCh4PnkpPzE6MCkpfSwiaHRtbC1kZXNjIjpmdW5jdGlvbihhLGIpe3ZhciB4PWEucmVwbGFjZSgvPC4qPz4vZywiIikudG9Mb3dlckNhc2UoKTsKK3ZhciB5PWIucmVwbGFjZSgvPC4qPz4vZywiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4oKHg8eSk/MTooKHg+eSk/LTE6MCkpfSwiZGF0ZS1hc2MiOmZ1bmN0aW9uKGEsYil7dmFyIHg9RGF0ZS5wYXJzZShhKTsKK3ZhciB5PURhdGUucGFyc2UoYik7aWYoaXNOYU4oeCkpe3g9RGF0ZS5wYXJzZSgiMDEvMDEvMTk3MCAwMDowMDowMCIpfWlmKGlzTmFOKHkpKXt5PURhdGUucGFyc2UoIjAxLzAxLzE5NzAgMDA6MDA6MDAiKQorfXJldHVybiB4LXl9LCJkYXRlLWRlc2MiOmZ1bmN0aW9uKGEsYil7dmFyIHg9RGF0ZS5wYXJzZShhKTt2YXIgeT1EYXRlLnBhcnNlKGIpO2lmKGlzTmFOKHgpKXt4PURhdGUucGFyc2UoIjAxLzAxLzE5NzAgMDA6MDA6MDAiKQorfWlmKGlzTmFOKHkpKXt5PURhdGUucGFyc2UoIjAxLzAxLzE5NzAgMDA6MDA6MDAiKX1yZXR1cm4geS14fSwibnVtZXJpYy1hc2MiOmZ1bmN0aW9uKGEsYil7dmFyIHg9YT09Ii0iPzA6YTsKK3ZhciB5PWI9PSItIj8wOmI7cmV0dXJuIHgteX0sIm51bWVyaWMtZGVzYyI6ZnVuY3Rpb24oYSxiKXt2YXIgeD1hPT0iLSI/MDphO3ZhciB5PWI9PSItIj8wOmI7CityZXR1cm4geS14fX07JC5mbi5kYXRhVGFibGVFeHQuYVR5cGVzPVtmdW5jdGlvbihzRGF0YSl7dmFyIHNWYWxpZENoYXJzPSIwMTIzNDU2Nzg5Li0iOwordmFyIENoYXI7Zm9yKGk9MDtpPHNEYXRhLmxlbmd0aDtpKyspe0NoYXI9c0RhdGEuY2hhckF0KGkpO2lmKHNWYWxpZENoYXJzLmluZGV4T2YoQ2hhcik9PS0xKXtyZXR1cm4gbnVsbAorfX1yZXR1cm4ibnVtZXJpYyJ9LGZ1bmN0aW9uKHNEYXRhKXtpZighaXNOYU4oRGF0ZS5wYXJzZShzRGF0YSkpKXtyZXR1cm4iZGF0ZSJ9cmV0dXJuIG51bGwKK31dOyQuZm4uZGF0YVRhYmxlRXh0Ll9vRXh0ZXJuQ29uZmlnPXtpTmV4dFVuaXF1ZTowfTskLmZuLmRhdGFUYWJsZT1mdW5jdGlvbihvSW5pdCl7dmFyIF9hb1NldHRpbmdzPSQuZm4uZGF0YVRhYmxlU2V0dGluZ3M7CitmdW5jdGlvbiBjbGFzc1NldHRpbmdzKCl7dGhpcy5zSW5zdGFuY2U9bnVsbDt0aGlzLm9GZWF0dXJlcz17YlBhZ2luYXRlOnRydWUsYkxlbmd0aENoYW5nZTp0cnVlLGJGaWx0ZXI6dHJ1ZSxiU29ydDp0cnVlLGJJbmZvOnRydWUsYkF1dG9XaWR0aDp0cnVlLGJQcm9jZXNzaW5nOmZhbHNlLGJTb3J0Q2xhc3Nlczp0cnVlLGJTdGF0ZVNhdmU6ZmFsc2V9OwordGhpcy5vTGFuZ3VhZ2U9e3NQcm9jZXNzaW5nOiJQcm9jZXNzaW5nLi4uIixzTGVuZ3RoTWVudToiU2hvdyBfTUVOVV8gZW50cmllcyBwZXIgcGFnZSIsc1plcm9SZWNvcmRzOiJObyBtYXRjaGluZyByZWNvcmRzIGZvdW5kIixzSW5mbzoiU2hvd2luZyBfU1RBUlRfIHRvIF9FTkRfIG9mIF9UT1RBTF8gZW50cmllcyIsc0luZm9FbXB0eToiU2hvd2luZyAwIHRvIDAgb2YgMCBlbnRyaWVzIixzSW5mb0ZpbHRlcmVkOiIoZmlsdGVyZWQgZnJvbSBfTUFYXyB0b3RhbCBlbnRyaWVzKSIsc0luZm9Qb3N0Rml4OiIiLHNTZWFyY2g6IlNlYXJjaDoiLHNVcmw6IiIsb1BhZ2luYXRlOntzRmlyc3Q6IkZpcnN0IixzUHJldmlvdXM6IlByZXZpb3VzIixzTmV4dDoiTmV4dCIsc0xhc3Q6Ikxhc3QifX07Cit0aGlzLmFvRGF0YT1bXTt0aGlzLmFpRGlzcGxheT1bXTt0aGlzLmFpRGlzcGxheU1hc3Rlcj1bXTt0aGlzLmFvQ29sdW1ucz1bXTt0aGlzLmlOZXh0SWQ9MDsKK3RoaXMuYXNEYXRhU2VhcmNoPVtdO3RoaXMub1ByZXZpb3VzU2VhcmNoPXtzU2VhcmNoOiIiLGJFc2NhcGVSZWdleDp0cnVlfTt0aGlzLmFvUHJlU2VhcmNoQ29scz1bXTsKK3RoaXMubkluZm89bnVsbDt0aGlzLm5Qcm9jZXNzaW5nPW51bGw7dGhpcy5pRGlzcGxheUxlbmd0aD0xMDA7dGhpcy5pRGlzcGxheVN0YXJ0PTA7Cit0aGlzLmlEaXNwbGF5RW5kPTEwO3RoaXMuYWFTb3J0aW5nPVtbMCwiYXNjIl1dO3RoaXMuYXNTdHJpcENsYXNzZXM9WyJvZGQiLCJldmVuIl07Cit0aGlzLmZuUm93Q2FsbGJhY2s9bnVsbDt0aGlzLmZuSGVhZGVyQ2FsbGJhY2s9bnVsbDt0aGlzLmZuRm9vdGVyQ2FsbGJhY2s9bnVsbDt0aGlzLmZuRHJhd0NhbGxiYWNrPW51bGw7Cit0aGlzLmZuSW5pdENvbXBsZXRlPW51bGw7dGhpcy5uRm9vdGVyPW51bGw7dGhpcy5zVGFibGVJZD0iIjt0aGlzLm5UYWJsZT1udWxsO3RoaXMuaURlZmF1bHRTb3J0SW5kZXg9MDsKK3RoaXMuYkluaXRpYWxpc2VkPWZhbHNlO3RoaXMubk9wZW5Sb3c9bnVsbDt0aGlzLm5QYWdpbmF0ZT1udWxsO3RoaXMublByZXZpb3VzPW51bGw7Cit0aGlzLm5OZXh0PW51bGw7dGhpcy5zRG9tUG9zaXRpb25pbmc9ImxmcnRpcCI7dGhpcy5zUGFnaW5hdGlvblR5cGU9InR3b19idXR0b24iO3RoaXMuc0FqYXhTb3VyY2U9bnVsbDsKK3RoaXMuaUNvb2tpZUR1cmF0aW9uPTYwKjYwKjJ9dGhpcy5vQXBpPXt9O3RoaXMuZm5EcmF3PWZ1bmN0aW9uKCl7X2ZuUmVEcmF3KF9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSkpCit9O3RoaXMuZm5GaWx0ZXI9ZnVuY3Rpb24oc0lucHV0LGlDb2x1bW4sYkVzY2FwZVJlZ2V4KXt2YXIgb1NldHRpbmdzPV9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSk7CitpZih0eXBlb2YgYkVzY2FwZVJlZ2V4PT0idW5kZWZpbmVkIil7YkVzY2FwZVJlZ2V4PXRydWV9aWYodHlwZW9mIGlDb2x1bW49PSJ1bmRlZmluZWQifHxpQ29sdW1uPT09bnVsbCl7X2ZuRmlsdGVyQ29tcGxldGUob1NldHRpbmdzLHtzU2VhcmNoOnNJbnB1dCxiRXNjYXBlUmVnZXg6YkVzY2FwZVJlZ2V4fSwxKQorfWVsc2V7b1NldHRpbmdzLmFvUHJlU2VhcmNoQ29sc1tpQ29sdW1uXS5zU2VhcmNoPXNJbnB1dDtvU2V0dGluZ3MuYW9QcmVTZWFyY2hDb2xzW2lDb2x1bW5dLmJFc2NhcGVSZWdleD1iRXNjYXBlUmVnZXg7CitfZm5GaWx0ZXJDb21wbGV0ZShvU2V0dGluZ3Msb1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaCwxKX19O3RoaXMuZm5TZXR0aW5ncz1mdW5jdGlvbihuTm9kZSl7cmV0dXJuIF9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSkKK307dGhpcy5mblNvcnQ9ZnVuY3Rpb24oYWFTb3J0KXt2YXIgb1NldHRpbmdzPV9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSk7b1NldHRpbmdzLmFhU29ydGluZz1hYVNvcnQ7CitfZm5Tb3J0KG9TZXR0aW5ncyl9O3RoaXMuZm5BZGREYXRhPWZ1bmN0aW9uKG1EYXRhLGJSZWRyYXcpe3ZhciBhaVJldHVybj1bXTt2YXIgaVRlc3Q7CitpZih0eXBlb2YgYlJlZHJhdz09InVuZGVmaW5lZCIpe2JSZWRyYXc9dHJ1ZX12YXIgb1NldHRpbmdzPV9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSk7CitpZih0eXBlb2YgbURhdGFbMF09PSJvYmplY3QiKXtmb3IodmFyIGk9MDtpPG1EYXRhLmxlbmd0aDtpKyspe2lUZXN0PV9mbkFkZERhdGEob1NldHRpbmdzLG1EYXRhW2ldKTsKK2lmKGlUZXN0PT0tMSl7cmV0dXJuIGFpUmV0dXJufWFpUmV0dXJuLnB1c2goaVRlc3QpfX1lbHNle2lUZXN0PV9mbkFkZERhdGEob1NldHRpbmdzLG1EYXRhKTsKK2lmKGlUZXN0PT0tMSl7cmV0dXJuIGFpUmV0dXJufWFpUmV0dXJuLnB1c2goaVRlc3QpfW9TZXR0aW5ncy5haURpc3BsYXk9b1NldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpOworX2ZuQnVpbGRTZWFyY2hBcnJheShvU2V0dGluZ3MsMSk7aWYoYlJlZHJhdyl7X2ZuUmVEcmF3KG9TZXR0aW5ncyl9cmV0dXJuIGFpUmV0dXJuCit9O3RoaXMuZm5EZWxldGVSb3c9ZnVuY3Rpb24oaUFPRGF0YUluZGV4LGZuQ2FsbEJhY2spe3ZhciBvU2V0dGluZ3M9X2ZuU2V0dGluZ3NGcm9tTm9kZSh0aGlzWzBdKTsKK3ZhciBpO2ZvcihpPTA7aTxvU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXJbaV09PWlBT0RhdGFJbmRleCl7b1NldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5zcGxpY2UoaSwxKTsKK2JyZWFrfX1mb3IoaT0wO2k8b1NldHRpbmdzLmFpRGlzcGxheS5sZW5ndGg7aSsrKXtpZihvU2V0dGluZ3MuYWlEaXNwbGF5W2ldPT1pQU9EYXRhSW5kZXgpe29TZXR0aW5ncy5haURpc3BsYXkuc3BsaWNlKGksMSkKK319X2ZuQnVpbGRTZWFyY2hBcnJheShvU2V0dGluZ3MsMSk7aWYodHlwZW9mIGZuQ2FsbEJhY2s9PSJmdW5jdGlvbiIpe2ZuQ2FsbEJhY2suY2FsbCh0aGlzKQorfWlmKG9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0Pm9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoKXtvU2V0dGluZ3MuaURpc3BsYXlTdGFydC09b1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RoCit9X2ZuQ2FsY3VsYXRlRW5kKG9TZXR0aW5ncyk7X2ZuRHJhdyhvU2V0dGluZ3MpO3JldHVybiBvU2V0dGluZ3MuYW9EYXRhW2lBT0RhdGFJbmRleF0uX2FEYXRhLnNsaWNlKCkKK307dGhpcy5mbkNsZWFyVGFibGU9ZnVuY3Rpb24oKXt2YXIgb1NldHRpbmdzPV9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSk7b1NldHRpbmdzLmFvRGF0YS5sZW5ndGg9MDsKK29TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIubGVuZ3RoPTA7b1NldHRpbmdzLmFpRGlzcGxheS5sZW5ndGg9MDtfZm5DYWxjdWxhdGVFbmQob1NldHRpbmdzKTsKK19mbkRyYXcob1NldHRpbmdzKX07dGhpcy5mbk9wZW49ZnVuY3Rpb24oblRyLHNIdG1sLHNDbGFzcyl7dmFyIG9TZXR0aW5ncz1fZm5TZXR0aW5nc0Zyb21Ob2RlKHRoaXNbMF0pOworaWYob1NldHRpbmdzLm5PcGVuUm93IT09bnVsbCl7dGhpcy5mbkNsb3NlKCl9dmFyIG5OZXdSb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKK3ZhciBuTmV3Q2VsbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO25OZXdSb3cuYXBwZW5kQ2hpbGQobk5ld0NlbGwpO25OZXdSb3cuY2xhc3NOYW1lPXNDbGFzczsKK25OZXdDZWxsLmNvbFNwYW49b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7bk5ld0NlbGwuaW5uZXJIVE1MPXNIdG1sOyQobk5ld1JvdykuaW5zZXJ0QWZ0ZXIoblRyKTsKK29TZXR0aW5ncy5uT3BlblJvdz1uTmV3Um93fTt0aGlzLmZuQ2xvc2U9ZnVuY3Rpb24oKXt2YXIgb1NldHRpbmdzPV9mblNldHRpbmdzRnJvbU5vZGUodGhpc1swXSk7CiskKG9TZXR0aW5ncy5uT3BlblJvdykucmVtb3ZlKCk7b1NldHRpbmdzLm5PcGVuUm93PW51bGx9O3RoaXMuZm5HZXREYXRhPWZ1bmN0aW9uKGlSb3cpe3ZhciBvU2V0dGluZ3M9X2ZuU2V0dGluZ3NGcm9tTm9kZSh0aGlzWzBdKTsKK2lmKHR5cGVvZiBpUm93IT0idW5kZWZpbmVkIil7cmV0dXJuIG9TZXR0aW5ncy5hb0RhdGFbaVJvd10uX2FEYXRhfXJldHVybiBfZm5HZXREYXRhTWFzdGVyKG9TZXR0aW5ncykKK307dGhpcy5mbkdldE5vZGVzPWZ1bmN0aW9uKGlSb3cpe3ZhciBvU2V0dGluZ3M9X2ZuU2V0dGluZ3NGcm9tTm9kZSh0aGlzWzBdKTtpZih0eXBlb2YgaVJvdyE9InVuZGVmaW5lZCIpe3JldHVybiBvU2V0dGluZ3MuYW9EYXRhW2lSb3ddLm5UcgorfXJldHVybiBfZm5HZXRUck5vZGVzKG9TZXR0aW5ncyl9O3RoaXMuZm5HZXRQb3NpdGlvbj1mdW5jdGlvbihuTm9kZSl7dmFyIG9TZXR0aW5ncz1fZm5TZXR0aW5nc0Zyb21Ob2RlKHRoaXNbMF0pOwordmFyIGk7aWYobk5vZGUubm9kZU5hbWU9PSJUUiIpe2ZvcihpPTA7aTxvU2V0dGluZ3MuYW9EYXRhLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5hb0RhdGFbaV0ublRyPT1uTm9kZSl7cmV0dXJuIGkKK319fWVsc2V7aWYobk5vZGUubm9kZU5hbWU9PSJURCIpe2ZvcihpPTA7aTxvU2V0dGluZ3MuYW9EYXRhLmxlbmd0aDtpKyspe3ZhciBpQ29ycmVjdG9yPTA7Citmb3IodmFyIGo9MDtqPG9TZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoO2orKyl7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tqXS5iVmlzaWJsZSl7aWYob1NldHRpbmdzLmFvRGF0YVtpXS5uVHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIilbai1pQ29ycmVjdG9yXT09bk5vZGUpe3JldHVybltpLGotaUNvcnJlY3RvcixqXQorfX1lbHNle2lDb3JyZWN0b3IrK319fX19cmV0dXJuIG51bGx9O3RoaXMuZm5VcGRhdGU9ZnVuY3Rpb24obURhdGEsaVJvdyxpQ29sdW1uLGJSZWRyYXcpe3ZhciBvU2V0dGluZ3M9X2ZuU2V0dGluZ3NGcm9tTm9kZSh0aGlzWzBdKTsKK3ZhciBpVmlzaWJsZUNvbHVtbjt2YXIgc1JlbmRlcmVkO2lmKHR5cGVvZiBiUmVkcmF3PT0idW5kZWZpbmVkIil7YlJlZHJhdz10cnVlfWlmKHR5cGVvZiBtRGF0YSE9Im9iamVjdCIpe29TZXR0aW5ncy5hb0RhdGFbaVJvd10uX2FEYXRhW2lDb2x1bW5dPW1EYXRhOworaWYob1NldHRpbmdzLmFvQ29sdW1uc1tpQ29sdW1uXS5mblJlbmRlciE9PW51bGwmJm9TZXR0aW5ncy5hb0NvbHVtbnNbaUNvbHVtbl0uYlVzZVJlbmRlcmVkKXtzUmVuZGVyZWQ9b1NldHRpbmdzLmFvQ29sdW1uc1tpQ29sdW1uXS5mblJlbmRlcih7aURhdGFSb3c6aVJvdyxpRGF0YUNvbHVtbjppQ29sdW1uLGFEYXRhOm9TZXR0aW5ncy5hb0RhdGFbaVJvd10uX2FEYXRhfSk7CitvU2V0dGluZ3MuYW9EYXRhW2lSb3ddLl9hRGF0YVtpQ29sdW1uXT1zUmVuZGVyZWR9aVZpc2libGVDb2x1bW49X2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUob1NldHRpbmdzLGlDb2x1bW4pOworaWYoaVZpc2libGVDb2x1bW4hPT1udWxsKXtvU2V0dGluZ3MuYW9EYXRhW2lSb3ddLm5Uci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKVtpVmlzaWJsZUNvbHVtbl0uaW5uZXJIVE1MPW9TZXR0aW5ncy5hb0RhdGFbaVJvd10uX2FEYXRhW2lDb2x1bW5dCit9fWVsc2V7aWYobURhdGEubGVuZ3RoIT1vU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aCl7YWxlcnQoIldhcm5pbmc6IEFuIGFycmF5IHBhc3NlZCB0byBmblVwZGF0ZSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgdGhlIHRhYmxlIGluIHF1ZXN0aW9uIC0gaW4gdGhpcyBjYXNlICIrb1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGgpOworcmV0dXJuIDF9Zm9yKHZhciBpPTA7aTxtRGF0YS5sZW5ndGg7aSsrKXtvU2V0dGluZ3MuYW9EYXRhW2lSb3ddLl9hRGF0YVtpXT1tRGF0YVtpXTsKK2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uZm5SZW5kZXIhPT1udWxsJiZvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmJVc2VSZW5kZXJlZCl7c1JlbmRlcmVkPW9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uZm5SZW5kZXIoe2lEYXRhUm93OmlSb3csaURhdGFDb2x1bW46aSxhRGF0YTpvU2V0dGluZ3MuYW9EYXRhW2lSb3ddLl9hRGF0YX0pOworb1NldHRpbmdzLmFvRGF0YVtpUm93XS5fYURhdGFbaV09c1JlbmRlcmVkfWlWaXNpYmxlQ29sdW1uPV9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKG9TZXR0aW5ncyxpKTsKK2lmKGlWaXNpYmxlQ29sdW1uIT09bnVsbCl7b1NldHRpbmdzLmFvRGF0YVtpUm93XS5uVHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIilbaVZpc2libGVDb2x1bW5dLmlubmVySFRNTD1vU2V0dGluZ3MuYW9EYXRhW2lSb3ddLl9hRGF0YVtpXQorfX19X2ZuQnVpbGRTZWFyY2hBcnJheShvU2V0dGluZ3MsMSk7aWYoYlJlZHJhdyl7X2ZuUmVEcmF3KG9TZXR0aW5ncyl9cmV0dXJuIDB9O2Z1bmN0aW9uIF9mbkV4dGVybkFwaUZ1bmMoc0Z1bmMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBhQXJncz1bX2ZuU2V0dGluZ3NGcm9tTm9kZSh0aGlzWzBdKV0uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpOworcmV0dXJuICQuZm4uZGF0YVRhYmxlRXh0Lm9BcGlbc0Z1bmNdLmFwcGx5KHRoaXMsYUFyZ3MpfX12YXIgYkFwaT1mYWxzZTtmb3IodmFyIHNGdW5jIGluICQuZm4uZGF0YVRhYmxlRXh0Lm9BcGkpe2lmKHNGdW5jKXt0aGlzW3NGdW5jXT1fZm5FeHRlcm5BcGlGdW5jKHNGdW5jKTsKK2JBcGk9dHJ1ZX19ZnVuY3Rpb24gX2ZuSW5pdGFsaXNlKG9TZXR0aW5ncyl7aWYob1NldHRpbmdzLmJJbml0aWFsaXNlZD09PWZhbHNlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X2ZuSW5pdGFsaXNlKG9TZXR0aW5ncykKK30sMjAwKTtyZXR1cm59X2ZuQWRkT3B0aW9uc0h0bWwob1NldHRpbmdzKTtfZm5EcmF3SGVhZChvU2V0dGluZ3MpO2lmKG9TZXR0aW5ncy5vRmVhdHVyZXMuYlNvcnQpe19mblNvcnQob1NldHRpbmdzLGZhbHNlKTsKK19mblNvcnRpbmdDbGFzc2VzKG9TZXR0aW5ncyl9ZWxzZXtvU2V0dGluZ3MuYWlEaXNwbGF5PW9TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKTsKK19mbkNhbGN1bGF0ZUVuZChvU2V0dGluZ3MpO19mbkRyYXcob1NldHRpbmdzKX1pZihvU2V0dGluZ3Muc0FqYXhTb3VyY2UhPT1udWxsKXtfZm5Qcm9jZXNzaW5nRGlzcGxheShvU2V0dGluZ3MsdHJ1ZSk7CiskLmdldEpTT04ob1NldHRpbmdzLnNBamF4U291cmNlLG51bGwsZnVuY3Rpb24oanNvbil7Zm9yKHZhciBpPTA7aTxqc29uLmFhRGF0YS5sZW5ndGg7CitpKyspe19mbkFkZERhdGEob1NldHRpbmdzLGpzb24uYWFEYXRhW2ldKX1pZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTb3J0KXtfZm5Tb3J0KG9TZXR0aW5ncykKK31lbHNle29TZXR0aW5ncy5haURpc3BsYXk9b1NldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpO19mbkNhbGN1bGF0ZUVuZChvU2V0dGluZ3MpOworX2ZuRHJhdyhvU2V0dGluZ3MpfV9mblByb2Nlc3NpbmdEaXNwbGF5KG9TZXR0aW5ncyxmYWxzZSk7aWYodHlwZW9mIG9TZXR0aW5ncy5mbkluaXRDb21wbGV0ZT09ImZ1bmN0aW9uIil7b1NldHRpbmdzLmZuSW5pdENvbXBsZXRlKG9TZXR0aW5ncykKK319KTtyZXR1cm59aWYob1NldHRpbmdzLm9GZWF0dXJlcy5iU29ydCl7X2ZuU29ydGluZ0NsYXNzZXMob1NldHRpbmdzKX1pZih0eXBlb2Ygb1NldHRpbmdzLmZuSW5pdENvbXBsZXRlPT0iZnVuY3Rpb24iKXtvU2V0dGluZ3MuZm5Jbml0Q29tcGxldGUob1NldHRpbmdzKQorfX1mdW5jdGlvbiBfZm5MYW5ndWFnZVByb2Nlc3Mob1NldHRpbmdzLG9MYW5ndWFnZSxiSW5pdCl7aWYodHlwZW9mIG9MYW5ndWFnZS5zUHJvY2Vzc2luZyE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5vTGFuZ3VhZ2Uuc1Byb2Nlc3Npbmc9b0xhbmd1YWdlLnNQcm9jZXNzaW5nCit9aWYodHlwZW9mIG9MYW5ndWFnZS5zTGVuZ3RoTWVudSE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5vTGFuZ3VhZ2Uuc0xlbmd0aE1lbnU9b0xhbmd1YWdlLnNMZW5ndGhNZW51Cit9aWYodHlwZW9mIG9MYW5ndWFnZS5zWmVyb1JlY29yZHMhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0xhbmd1YWdlLnNaZXJvUmVjb3Jkcz1vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzCit9aWYodHlwZW9mIG9MYW5ndWFnZS5zSW5mbyE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5vTGFuZ3VhZ2Uuc0luZm89b0xhbmd1YWdlLnNJbmZvCit9aWYodHlwZW9mIG9MYW5ndWFnZS5zSW5mb0VtcHR5IT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm9MYW5ndWFnZS5zSW5mb0VtcHR5PW9MYW5ndWFnZS5zSW5mb0VtcHR5Cit9aWYodHlwZW9mIG9MYW5ndWFnZS5zSW5mb0ZpbHRlcmVkIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm9MYW5ndWFnZS5zSW5mb0ZpbHRlcmVkPW9MYW5ndWFnZS5zSW5mb0ZpbHRlcmVkCit9aWYodHlwZW9mIG9MYW5ndWFnZS5zSW5mb1Bvc3RGaXghPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0xhbmd1YWdlLnNJbmZvUG9zdEZpeD1vTGFuZ3VhZ2Uuc0luZm9Qb3N0Rml4Cit9aWYodHlwZW9mIG9MYW5ndWFnZS5zU2VhcmNoIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm9MYW5ndWFnZS5zU2VhcmNoPW9MYW5ndWFnZS5zU2VhcmNoCit9aWYodHlwZW9mIG9MYW5ndWFnZS5vUGFnaW5hdGUhPSJ1bmRlZmluZWQiKXtpZih0eXBlb2Ygb0xhbmd1YWdlLm9QYWdpbmF0ZSE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5vTGFuZ3VhZ2Uub1BhZ2luYXRlLnNGaXJzdD1vTGFuZ3VhZ2Uub1BhZ2luYXRlLnNGaXJzdAorfWlmKHR5cGVvZiBvTGFuZ3VhZ2Uub1BhZ2luYXRlIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm9MYW5ndWFnZS5vUGFnaW5hdGUuc1ByZXZpb3VzPW9MYW5ndWFnZS5vUGFnaW5hdGUuc1ByZXZpb3VzCit9aWYodHlwZW9mIG9MYW5ndWFnZS5vUGFnaW5hdGUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0xhbmd1YWdlLm9QYWdpbmF0ZS5zTmV4dD1vTGFuZ3VhZ2Uub1BhZ2luYXRlLnNOZXh0Cit9aWYodHlwZW9mIG9MYW5ndWFnZS5vUGFnaW5hdGUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0xhbmd1YWdlLm9QYWdpbmF0ZS5zTGFzdD1vTGFuZ3VhZ2Uub1BhZ2luYXRlLnNMYXN0Cit9fWlmKGJJbml0KXtfZm5Jbml0YWxpc2Uob1NldHRpbmdzKX19ZnVuY3Rpb24gX2ZuQWRkQ29sdW1uKG9TZXR0aW5ncyxvT3B0aW9ucyl7b1NldHRpbmdzLmFvQ29sdW1uc1tvU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aCsrXT17c1R5cGU6bnVsbCxfYkF1dG9UeXBlOnRydWUsYlZpc2libGU6dHJ1ZSxiU2VhcmNoYWJsZTp0cnVlLGJTb3J0YWJsZTp0cnVlLHNUaXRsZTpudWxsLHNXaWR0aDpudWxsLHNDbGFzczpudWxsLGZuUmVuZGVyOm51bGwsYlVzZVJlbmRlcmVkOnRydWUsaURhdGFTb3J0Om9TZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoLTF9OworaWYodHlwZW9mIG9PcHRpb25zIT0idW5kZWZpbmVkIiYmb09wdGlvbnMhPT1udWxsKXt2YXIgaUxlbmd0aD1vU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aC0xOworaWYodHlwZW9mIG9PcHRpb25zLnNUeXBlIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLmFvQ29sdW1uc1tpTGVuZ3RoXS5zVHlwZT1vT3B0aW9ucy5zVHlwZTsKK29TZXR0aW5ncy5hb0NvbHVtbnNbaUxlbmd0aF0uX2JBdXRvVHlwZT1mYWxzZX1pZih0eXBlb2Ygb09wdGlvbnMuYlZpc2libGUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2lMZW5ndGhdLmJWaXNpYmxlPW9PcHRpb25zLmJWaXNpYmxlCit9aWYodHlwZW9mIG9PcHRpb25zLmJTZWFyY2hhYmxlIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLmFvQ29sdW1uc1tpTGVuZ3RoXS5iU2VhcmNoYWJsZT1vT3B0aW9ucy5iU2VhcmNoYWJsZQorfWlmKHR5cGVvZiBvT3B0aW9ucy5iU29ydGFibGUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2lMZW5ndGhdLmJTb3J0YWJsZT1vT3B0aW9ucy5iU29ydGFibGUKK31pZih0eXBlb2Ygb09wdGlvbnMuc1RpdGxlIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLmFvQ29sdW1uc1tpTGVuZ3RoXS5zVGl0bGU9b09wdGlvbnMuc1RpdGxlCit9aWYodHlwZW9mIG9PcHRpb25zLnNXaWR0aCE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5hb0NvbHVtbnNbaUxlbmd0aF0uc1dpZHRoPW9PcHRpb25zLnNXaWR0aAorfWlmKHR5cGVvZiBvT3B0aW9ucy5zQ2xhc3MhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2lMZW5ndGhdLnNDbGFzcz1vT3B0aW9ucy5zQ2xhc3MKK31pZih0eXBlb2Ygb09wdGlvbnMuZm5SZW5kZXIhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2lMZW5ndGhdLmZuUmVuZGVyPW9PcHRpb25zLmZuUmVuZGVyCit9aWYodHlwZW9mIG9PcHRpb25zLmJVc2VSZW5kZXJlZCE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5hb0NvbHVtbnNbaUxlbmd0aF0uYlVzZVJlbmRlcmVkPW9PcHRpb25zLmJVc2VSZW5kZXJlZAorfWlmKHR5cGVvZiBvT3B0aW9ucy5pRGF0YVNvcnQhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2lMZW5ndGhdLmlEYXRhU29ydD1vT3B0aW9ucy5pRGF0YVNvcnQKK319b1NldHRpbmdzLmFvUHJlU2VhcmNoQ29sc1tvU2V0dGluZ3MuYW9QcmVTZWFyY2hDb2xzLmxlbmd0aCsrXT17c1NlYXJjaDoiIixiRXNjYXBlUmVnZXg6dHJ1ZX0KK31mdW5jdGlvbiBfZm5BZGREYXRhKG9TZXR0aW5ncyxhRGF0YSl7aWYoYURhdGEubGVuZ3RoIT1vU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aCl7cmV0dXJuIC0xCit9dmFyIGlUaGlzSW5kZXg9b1NldHRpbmdzLmFvRGF0YS5sZW5ndGg7b1NldHRpbmdzLmFvRGF0YS5wdXNoKHtfaUlkOm9TZXR0aW5ncy5pTmV4dElkKyssX2FEYXRhOmFEYXRhLnNsaWNlKCksblRyOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIil9KTsKK3ZhciBuVGQ7Zm9yKHZhciBpPTA7aTxhRGF0YS5sZW5ndGg7aSsrKXtpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmJWaXNpYmxlKXtuVGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKK2lmKHR5cGVvZiBvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmZuUmVuZGVyPT0iZnVuY3Rpb24iKXt2YXIgc1JlbmRlcmVkPW9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uZm5SZW5kZXIoe2lEYXRhUm93OmlUaGlzSW5kZXgsaURhdGFDb2x1bW46aSxhRGF0YTphRGF0YX0pOworblRkLmlubmVySFRNTD1zUmVuZGVyZWQ7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5iVXNlUmVuZGVyZWQpe29TZXR0aW5ncy5hb0RhdGFbaVRoaXNJbmRleF0uX2FEYXRhW2ldPXNSZW5kZXJlZAorfX1lbHNle25UZC5pbm5lckhUTUw9YURhdGFbaV19aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zQ2xhc3MhPT1udWxsKXtuVGQuY2xhc3NOYW1lPW9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc0NsYXNzCit9aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5fYkF1dG9UeXBlJiZvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNUeXBlIT0ic3RyaW5nIil7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zVHlwZT09PW51bGwpe29TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1R5cGU9X2ZuRGV0ZWN0VHlwZShhRGF0YVtpXSkKK31lbHNle2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1R5cGU9PSJkYXRlInx8b1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zVHlwZT09Im51bWVyaWMiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNUeXBlPV9mbkRldGVjdFR5cGUoYURhdGFbaV0pCit9fX1vU2V0dGluZ3MuYW9EYXRhW2lUaGlzSW5kZXhdLm5Uci5hcHBlbmRDaGlsZChuVGQpfX1vU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLnB1c2goaVRoaXNJbmRleCk7CityZXR1cm4gaVRoaXNJbmRleH1mdW5jdGlvbiBfZm5HYXRoZXJEYXRhKG9TZXR0aW5ncyl7dmFyIG5EYXRhTm9kZXM7dmFyIGlEYXRhTGVuZ3RoPSQoInRib2R5IHRyIikubGVuZ3RoOwordmFyIGlMb29wO3ZhciBpLGo7aWYoJCgidGhlYWQgdGgiLG9TZXR0aW5ncy5uVGFibGUpLmxlbmd0aCE9b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGgpe2FsZXJ0KCJXYXJuaW5nIC0gY29sdW1ucyBkbyBub3QgbWF0Y2giKQorfW9TZXR0aW5ncy5uSGVhZGVyPSQoInRoZWFkIixvU2V0dGluZ3MublRhYmxlKVswXTtpZih0eXBlb2YgJCgidGZvb3QiLG9TZXR0aW5ncy5uVGFibGUpWzBdIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm5Gb290ZXI9JCgidGZvb3QiLG9TZXR0aW5ncy5uVGFibGUpWzBdCit9JCgidGJvZHkgdHIiLG9TZXR0aW5ncy5uVGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgaVRoaXNJbmRleD1vU2V0dGluZ3MuYW9EYXRhLmxlbmd0aDsKK29TZXR0aW5ncy5hb0RhdGEucHVzaCh7X2lJZDpvU2V0dGluZ3MuaU5leHRJZCsrLF9hRGF0YTpbXSxuVHI6dGhpc30pO29TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIucHVzaChpVGhpc0luZGV4KTsKK3ZhciBhTG9jYWxEYXRhPW9TZXR0aW5ncy5hb0RhdGFbaVRoaXNJbmRleF0uX2FEYXRhOyQoInRkIix0aGlzKS5lYWNoKGZ1bmN0aW9uKGkpe2FMb2NhbERhdGFbaV09dGhpcy5pbm5lckhUTUwKK30pfSk7dmFyIGlDb3JyZWN0b3I9MDtmb3IoaT0wO2k8b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7aSsrKXtpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNUaXRsZT09PW51bGwpe29TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1RpdGxlPSQoInRoZWFkIHRoOm50aC1jaGlsZCgiKyhpKzEpKyIpIixvU2V0dGluZ3MublRhYmxlKS5odG1sKCkKK31pZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLl9iQXV0b1R5cGUpe2lMb29wPW9TZXR0aW5ncy5hb0RhdGEubGVuZ3RoO2ZvcihqPTA7ajxpTG9vcDsKK2orKyl7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zVHlwZT09PW51bGwpe29TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1R5cGU9X2ZuRGV0ZWN0VHlwZShvU2V0dGluZ3MuYW9EYXRhW2pdLl9hRGF0YVtpXSkKK31lbHNle2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1R5cGU9PSJkYXRlInx8b1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zVHlwZT09Im51bWVyaWMiKXtvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNUeXBlPV9mbkRldGVjdFR5cGUob1NldHRpbmdzLmFvRGF0YVtqXS5fYURhdGFbaV0pCit9fX19aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zQ2xhc3MhPT1udWxsKXtpTG9vcD1vU2V0dGluZ3MuYW9EYXRhLmxlbmd0aDtmb3Ioaj0wOworajxpTG9vcDtqKyspe29TZXR0aW5ncy5hb0RhdGFbal0ublRyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpW2ktaUNvcnJlY3Rvcl0uY2xhc3NOYW1lKz0iICIrb1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zQ2xhc3MKK319aWYodHlwZW9mIG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uZm5SZW5kZXI9PSJmdW5jdGlvbiIpe2lMb29wPW9TZXR0aW5ncy5hb0RhdGEubGVuZ3RoOworZm9yKGo9MDtqPGlMb29wO2orKyl7dmFyIHNSZW5kZXJlZD1vU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmZuUmVuZGVyKHtpRGF0YVJvdzpqLGlEYXRhQ29sdW1uOmksYURhdGE6b1NldHRpbmdzLmFvRGF0YVtqXS5fYURhdGF9KTsKK29TZXR0aW5ncy5hb0RhdGFbal0ublRyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpW2ktaUNvcnJlY3Rvcl0uaW5uZXJIVE1MPXNSZW5kZXJlZDsKK2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uYlVzZVJlbmRlcmVkKXtvU2V0dGluZ3MuYW9EYXRhW2pdLl9hRGF0YVtpXT1zUmVuZGVyZWR9fX1pZighb1NldHRpbmdzLmFvQ29sdW1uc1tpXS5iVmlzaWJsZSl7aUxvb3A9b1NldHRpbmdzLmFvRGF0YS5sZW5ndGg7Citmb3Ioaj0wO2o8aUxvb3A7aisrKXt2YXIgblJlbW92ZT1vU2V0dGluZ3MuYW9EYXRhW2pdLm5Uci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKVtpLWlDb3JyZWN0b3JdOworblJlbW92ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5SZW1vdmUpfWlDb3JyZWN0b3IrK319fWZ1bmN0aW9uIF9mbkRyYXdIZWFkKG9TZXR0aW5ncyl7dmFyIGk7Cit2YXIgblRoT3JpZ2luYWxzPSQoInRoZWFkIHRoIixvU2V0dGluZ3MublRhYmxlKTtpZihuVGhPcmlnaW5hbHMubGVuZ3RoPT1vU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aCl7Zm9yKGk9MDsKK2k8b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7aSsrKXtpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmJWaXNpYmxlKXtpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNXaWR0aCE9PW51bGwpe25UaE9yaWdpbmFsc1tpXS5zdHlsZS53aWR0aD1vU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNXaWR0aAorfWlmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1RpdGxlIT1uVGhPcmlnaW5hbHNbaV0uaW5uZXJIVE1MKXtuVGhPcmlnaW5hbHNbaV0uaW5uZXJIVE1MPW9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1RpdGxlCit9fWVsc2V7blRoT3JpZ2luYWxzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoblRoT3JpZ2luYWxzW2ldKX19fWVsc2V7dmFyIG5UaDt2YXIgblRyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Citmb3IoaT0wO2k8b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7aSsrKXtpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmJWaXNpYmxlKXtuVGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTsKK2lmKHR5cGVvZiBuVGhPcmlnaW5hbHNbaV0hPSJ1bmRlZmluZWQiJiZuVGhPcmlnaW5hbHNbaV0uY2xhc3NOYW1lIT09IiIpe25UaC5jbGFzc05hbWU9blRoT3JpZ2luYWxzW2ldLmNsYXNzTmFtZQorfWlmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1dpZHRoIT09bnVsbCl7blRoLnN0eWxlLndpZHRoPW9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1dpZHRoCit9blRoLmlubmVySFRNTD1vU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNUaXRsZTtuVHIuYXBwZW5kQ2hpbGQoblRoKX19JCgidGhlYWQiLG9TZXR0aW5ncy5uVGFibGUpLmh0bWwoIiIpWzBdLmFwcGVuZENoaWxkKG5UcikKK31pZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTb3J0KXskKCJ0aGVhZCB0aCIsb1NldHRpbmdzLm5UYWJsZSkuY2xpY2soZnVuY3Rpb24oZSl7dmFyIGlEYXRhSW5kZXg9JCgidGhlYWQgdGgiLG9TZXR0aW5ncy5uVGFibGUpLmluZGV4KHRoaXMpOworaURhdGFJbmRleD1fZm5WaXNpYmxlVG9Db2x1bW5JbmRleChvU2V0dGluZ3MsaURhdGFJbmRleCk7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpRGF0YUluZGV4XS5iU29ydGFibGU9PT1mYWxzZSl7cmV0dXJuCit9X2ZuUHJvY2Vzc2luZ0Rpc3BsYXkob1NldHRpbmdzLHRydWUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihlLnNoaWZ0S2V5KXt2YXIgYkZvdW5kPWZhbHNlOworZm9yKHZhciBpPTA7aTxvU2V0dGluZ3MuYWFTb3J0aW5nLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5hYVNvcnRpbmdbaV1bMF09PWlEYXRhSW5kZXgpe2lmKG9TZXR0aW5ncy5hYVNvcnRpbmdbaV1bMV09PSJhc2MiKXtvU2V0dGluZ3MuYWFTb3J0aW5nW2ldWzFdPSJkZXNjIgorfWVsc2V7b1NldHRpbmdzLmFhU29ydGluZy5zcGxpY2UoaSwxKX1iRm91bmQ9dHJ1ZTticmVha319aWYoYkZvdW5kPT09ZmFsc2Upe29TZXR0aW5ncy5hYVNvcnRpbmcucHVzaChbaURhdGFJbmRleCwiYXNjIl0pCit9fWVsc2V7aWYob1NldHRpbmdzLmFhU29ydGluZy5sZW5ndGg9PTEmJm9TZXR0aW5ncy5hYVNvcnRpbmdbMF1bMF09PWlEYXRhSW5kZXgpe29TZXR0aW5ncy5hYVNvcnRpbmdbMF1bMV09b1NldHRpbmdzLmFhU29ydGluZ1swXVsxXT09ImFzYyI/ImRlc2MiOiJhc2MiCit9ZWxzZXtvU2V0dGluZ3MuYWFTb3J0aW5nLnNwbGljZSgwLG9TZXR0aW5ncy5hYVNvcnRpbmcubGVuZ3RoKTtvU2V0dGluZ3MuYWFTb3J0aW5nLnB1c2goW2lEYXRhSW5kZXgsImFzYyJdKQorfX1fZm5Tb3J0aW5nQ2xhc3NlcyhvU2V0dGluZ3MpO19mblNvcnQob1NldHRpbmdzKTtfZm5Qcm9jZXNzaW5nRGlzcGxheShvU2V0dGluZ3MsZmFsc2UpCit9LDApfSk7JCgidGhlYWQgdGgiLG9TZXR0aW5ncy5uVGFibGUpLm1vdXNlZG93bihmdW5jdGlvbigpe3RoaXMub25zZWxlY3RzdGFydD1mdW5jdGlvbigpe3JldHVybiBmYWxzZQorfTtyZXR1cm4gZmFsc2V9KX1pZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJBdXRvV2lkdGgpe29TZXR0aW5ncy5uVGFibGUuc3R5bGUud2lkdGg9b1NldHRpbmdzLm5UYWJsZS5vZmZzZXRXaWR0aCsicHgiCit9fWZ1bmN0aW9uIF9mbkRyYXcob1NldHRpbmdzKXt2YXIgaTt2YXIgYW5Sb3dzPVtdO3ZhciBpUm93Q291bnQ9MDt2YXIgaVN0cmlwcz1vU2V0dGluZ3MuYXNTdHJpcENsYXNzZXMubGVuZ3RoOworaWYob1NldHRpbmdzLmFpRGlzcGxheS5sZW5ndGghPT0wKXtmb3IodmFyIGo9b1NldHRpbmdzLmlEaXNwbGF5U3RhcnQ7ajxvU2V0dGluZ3MuaURpc3BsYXlFbmQ7CitqKyspe3ZhciBuUm93PW9TZXR0aW5ncy5hb0RhdGFbb1NldHRpbmdzLmFpRGlzcGxheVtqXV0ublRyOyQoblJvdykucmVtb3ZlQ2xhc3Mob1NldHRpbmdzLmFzU3RyaXBDbGFzc2VzLmpvaW4oIiAiKSk7CiskKG5Sb3cpLmFkZENsYXNzKG9TZXR0aW5ncy5hc1N0cmlwQ2xhc3Nlc1tpUm93Q291bnQlaVN0cmlwc10pO2lmKHR5cGVvZiBvU2V0dGluZ3MuZm5Sb3dDYWxsYmFjaz09ImZ1bmN0aW9uIil7YW5Sb3dzW2lSb3dDb3VudF09b1NldHRpbmdzLmZuUm93Q2FsbGJhY2soblJvdyxvU2V0dGluZ3MuYW9EYXRhW29TZXR0aW5ncy5haURpc3BsYXlbal1dLl9hRGF0YSxpUm93Q291bnQsaikKK31hblJvd3MucHVzaChuUm93KTtpUm93Q291bnQrK319ZWxzZXthblJvd3NbMF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTtpZih0eXBlb2Ygb1NldHRpbmdzLmFzU3RyaXBDbGFzc2VzWzBdIT0idW5kZWZpbmVkIil7YW5Sb3dzWzBdLmNsYXNzTmFtZT1vU2V0dGluZ3MuYXNTdHJpcENsYXNzZXNbMF0KK312YXIgblRkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7blRkLnNldEF0dHJpYnV0ZSgidmFsaWduIiwidG9wIik7blRkLmNvbFNwYW49b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7CituVGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiO25UZC5jbGFzc05hbWU9ImRhdGFUYWJsZXNfZW1wdHkiO25UZC5pbm5lckhUTUw9b1NldHRpbmdzLm9MYW5ndWFnZS5zWmVyb1JlY29yZHM7CithblJvd3NbaVJvd0NvdW50XS5hcHBlbmRDaGlsZChuVGQpfWlmKHR5cGVvZiBvU2V0dGluZ3MuZm5IZWFkZXJDYWxsYmFjaz09ImZ1bmN0aW9uIil7b1NldHRpbmdzLmZuSGVhZGVyQ2FsbGJhY2soJCgidGhlYWQgdHIiLG9TZXR0aW5ncy5uVGFibGUpWzBdLF9mbkdldERhdGFNYXN0ZXIob1NldHRpbmdzKSxvU2V0dGluZ3MuaURpc3BsYXlTdGFydCxvU2V0dGluZ3MuaURpc3BsYXlFbmQsb1NldHRpbmdzLmFpRGlzcGxheSkKK31pZih0eXBlb2Ygb1NldHRpbmdzLmZuRm9vdGVyQ2FsbGJhY2s9PSJmdW5jdGlvbiIpe29TZXR0aW5ncy5mbkZvb3RlckNhbGxiYWNrKG9TZXR0aW5ncy5uRm9vdGVyLF9mbkdldERhdGFNYXN0ZXIob1NldHRpbmdzKSxvU2V0dGluZ3MuaURpc3BsYXlTdGFydCxvU2V0dGluZ3MuaURpc3BsYXlFbmQsb1NldHRpbmdzLmFpRGlzcGxheSkKK312YXIgblRycz0kKCJ0Ym9keTplcSgwKT50ciIsb1NldHRpbmdzLm5UYWJsZSk7Zm9yKGk9MDtpPG5UcnMubGVuZ3RoO2krKyl7blRyc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5UcnNbaV0pCit9dmFyIG5Cb2R5PSQoInRib2R5OmVxKDApIixvU2V0dGluZ3MublRhYmxlKTtmb3IoaT0wO2k8YW5Sb3dzLmxlbmd0aDtpKyspe25Cb2R5WzBdLmFwcGVuZENoaWxkKGFuUm93c1tpXSkKK31pZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJQYWdpbmF0ZSl7JC5mbi5kYXRhVGFibGVFeHQub1BhZ2luYXRpb25bb1NldHRpbmdzLnNQYWdpbmF0aW9uVHlwZV0uZm5VcGRhdGUob1NldHRpbmdzLGZ1bmN0aW9uKG9TZXR0aW5ncyl7X2ZuQ2FsY3VsYXRlRW5kKG9TZXR0aW5ncyk7CitfZm5EcmF3KG9TZXR0aW5ncyl9KX1pZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJJbmZvKXtpZihvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aD09PTAmJm9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoPT1vU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aCl7b1NldHRpbmdzLm5JbmZvLmlubmVySFRNTD1vU2V0dGluZ3Mub0xhbmd1YWdlLnNJbmZvRW1wdHkrIiAiK29TZXR0aW5ncy5vTGFuZ3VhZ2Uuc0luZm9Qb3N0Rml4Cit9ZWxzZXtpZihvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aD09PTApe29TZXR0aW5ncy5uSW5mby5pbm5lckhUTUw9b1NldHRpbmdzLm9MYW5ndWFnZS5zSW5mb0VtcHR5KyIgIitvU2V0dGluZ3Mub0xhbmd1YWdlLnNJbmZvRmlsdGVyZWQucmVwbGFjZSgiX01BWF8iLG9TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIubGVuZ3RoKSsiICIrb1NldHRpbmdzLm9MYW5ndWFnZS5zSW5mb1Bvc3RGaXgKK31lbHNle2lmKG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoPT1vU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aCl7b1NldHRpbmdzLm5JbmZvLmlubmVySFRNTD1vU2V0dGluZ3Mub0xhbmd1YWdlLnNJbmZvLnJlcGxhY2UoIl9TVEFSVF8iLG9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0KzEpLnJlcGxhY2UoIl9FTkRfIixvU2V0dGluZ3MuaURpc3BsYXlFbmQpLnJlcGxhY2UoIl9UT1RBTF8iLG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoKSsiICIrb1NldHRpbmdzLm9MYW5ndWFnZS5zSW5mb1Bvc3RGaXgKK31lbHNle29TZXR0aW5ncy5uSW5mby5pbm5lckhUTUw9b1NldHRpbmdzLm9MYW5ndWFnZS5zSW5mby5yZXBsYWNlKCJfU1RBUlRfIixvU2V0dGluZ3MuaURpc3BsYXlTdGFydCsxKS5yZXBsYWNlKCJfRU5EXyIsb1NldHRpbmdzLmlEaXNwbGF5RW5kKS5yZXBsYWNlKCJfVE9UQUxfIixvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aCkrIiAiK29TZXR0aW5ncy5vTGFuZ3VhZ2Uuc0luZm9GaWx0ZXJlZC5yZXBsYWNlKCJfTUFYXyIsb1NldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5sZW5ndGgpKyIgIitvU2V0dGluZ3Mub0xhbmd1YWdlLnNJbmZvUG9zdEZpeAorfX19fV9mblNhdmVTdGF0ZShvU2V0dGluZ3MpO2lmKHR5cGVvZiBvU2V0dGluZ3MuZm5EcmF3Q2FsbGJhY2s9PSJmdW5jdGlvbiIpe29TZXR0aW5ncy5mbkRyYXdDYWxsYmFjaygpCit9fWZ1bmN0aW9uIF9mblJlRHJhdyhvU2V0dGluZ3Mpe2lmKG9TZXR0aW5ncy5vRmVhdHVyZXMuYlNvcnQpe19mblNvcnQob1NldHRpbmdzLG9TZXR0aW5ncy5vUHJldmlvdXNTZWFyY2gpCit9ZWxzZXtpZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJGaWx0ZXIpe19mbkZpbHRlckNvbXBsZXRlKG9TZXR0aW5ncyxvU2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoKQorfWVsc2V7X2ZuQ2FsY3VsYXRlRW5kKG9TZXR0aW5ncyk7X2ZuRHJhdyhvU2V0dGluZ3MpfX19ZnVuY3Rpb24gX2ZuQWRkT3B0aW9uc0h0bWwob1NldHRpbmdzKXt2YXIgbkhvbGRpbmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CitvU2V0dGluZ3MublRhYmxlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5Ib2xkaW5nLG9TZXR0aW5ncy5uVGFibGUpO3ZhciBuV3JhcHBlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK25XcmFwcGVyLmNsYXNzTmFtZT0iZGF0YVRhYmxlc193cmFwcGVyIjtpZihvU2V0dGluZ3Muc1RhYmxlSWQhPT0iIil7bldyYXBwZXIuc2V0QXR0cmlidXRlKCJpZCIsb1NldHRpbmdzLnNUYWJsZUlkKyJfd3JhcHBlciIpCit9dmFyIG5JbnNlcnROb2RlPW5XcmFwcGVyO3ZhciBzRG9tPW9TZXR0aW5ncy5zRG9tUG9zaXRpb25pbmcuc3BsaXQoIiIpO2Zvcih2YXIgaT0wOworaTxzRG9tLmxlbmd0aDtpKyspe3ZhciBjT3B0aW9uPXNEb21baV07aWYoY09wdGlvbj09IjwiKXt2YXIgbk5ld05vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Cit2YXIgY05leHQ9c0RvbVtpKzFdO2lmKGNOZXh0PT0iJyJ8fGNOZXh0PT0nIicpe3ZhciBzQ2xhc3M9IiI7dmFyIGo9Mjt3aGlsZShzRG9tW2kral0hPWNOZXh0KXtzQ2xhc3MrPXNEb21baStqXTsKK2orK31uTmV3Tm9kZS5jbGFzc05hbWU9c0NsYXNzO2krPWp9bkluc2VydE5vZGUuYXBwZW5kQ2hpbGQobk5ld05vZGUpO25JbnNlcnROb2RlPW5OZXdOb2RlCit9ZWxzZXtpZihjT3B0aW9uPT0iPiIpe25JbnNlcnROb2RlPW5JbnNlcnROb2RlLnBhcmVudE5vZGV9ZWxzZXtpZihjT3B0aW9uPT0ibCImJm9TZXR0aW5ncy5vRmVhdHVyZXMuYlBhZ2luYXRlJiZvU2V0dGluZ3Mub0ZlYXR1cmVzLmJMZW5ndGhDaGFuZ2Upe25JbnNlcnROb2RlLmFwcGVuZENoaWxkKF9mbkZlYXR1cmVIdG1sTGVuZ3RoKG9TZXR0aW5ncykpCit9ZWxzZXtpZihjT3B0aW9uPT0iZiImJm9TZXR0aW5ncy5vRmVhdHVyZXMuYkZpbHRlcil7bkluc2VydE5vZGUuYXBwZW5kQ2hpbGQoX2ZuRmVhdHVyZUh0bWxGaWx0ZXIob1NldHRpbmdzKSkKK31lbHNle2lmKGNPcHRpb249PSJyIiYmb1NldHRpbmdzLm9GZWF0dXJlcy5iUHJvY2Vzc2luZyl7bkluc2VydE5vZGUuYXBwZW5kQ2hpbGQoX2ZuRmVhdHVyZUh0bWxQcm9jZXNzaW5nKG9TZXR0aW5ncykpCit9ZWxzZXtpZihjT3B0aW9uPT0idCIpe25JbnNlcnROb2RlLmFwcGVuZENoaWxkKG9TZXR0aW5ncy5uVGFibGUpfWVsc2V7aWYoY09wdGlvbj09ImkiJiZvU2V0dGluZ3Mub0ZlYXR1cmVzLmJJbmZvKXtuSW5zZXJ0Tm9kZS5hcHBlbmRDaGlsZChfZm5GZWF0dXJlSHRtbEluZm8ob1NldHRpbmdzKSkKK31lbHNle2lmKGNPcHRpb249PSJwIiYmb1NldHRpbmdzLm9GZWF0dXJlcy5iUGFnaW5hdGUpe25JbnNlcnROb2RlLmFwcGVuZENoaWxkKF9mbkZlYXR1cmVIdG1sUGFnaW5hdGUob1NldHRpbmdzKSkKK319fX19fX19fW5Ib2xkaW5nLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5XcmFwcGVyLG5Ib2xkaW5nKX1mdW5jdGlvbiBfZm5GZWF0dXJlSHRtbEZpbHRlcihvU2V0dGluZ3Mpe3ZhciBuRmlsdGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworaWYob1NldHRpbmdzLnNUYWJsZUlkIT09IiIpe25GaWx0ZXIuc2V0QXR0cmlidXRlKCJpZCIsb1NldHRpbmdzLnNUYWJsZUlkKyJfZmlsdGVyIikKK31uRmlsdGVyLmNsYXNzTmFtZT0iZGF0YVRhYmxlc19maWx0ZXIiO25GaWx0ZXIuaW5uZXJIVE1MPW9TZXR0aW5ncy5vTGFuZ3VhZ2Uuc1NlYXJjaCsnIDxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJytvU2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoLnNTZWFyY2gucmVwbGFjZSgnIicsIiZxdW90OyIpKyciIC8+JzsKKyQoImlucHV0IixuRmlsdGVyKS5rZXl1cChmdW5jdGlvbihlKXtfZm5GaWx0ZXJDb21wbGV0ZShvU2V0dGluZ3Mse3NTZWFyY2g6dGhpcy52YWx1ZSxiRXNjYXBlUmVnZXg6b1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5iRXNjYXBlUmVnZXh9KQorfSk7cmV0dXJuIG5GaWx0ZXJ9ZnVuY3Rpb24gX2ZuRmVhdHVyZUh0bWxJbmZvKG9TZXR0aW5ncyl7dmFyIG5JbmZvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworb1NldHRpbmdzLm5JbmZvPW5JbmZvO2lmKG9TZXR0aW5ncy5zVGFibGVJZCE9PSIiKXtvU2V0dGluZ3MubkluZm8uc2V0QXR0cmlidXRlKCJpZCIsb1NldHRpbmdzLnNUYWJsZUlkKyJfaW5mbyIpCit9b1NldHRpbmdzLm5JbmZvLmNsYXNzTmFtZT0iZGF0YVRhYmxlc19pbmZvIjtyZXR1cm4gbkluZm99ZnVuY3Rpb24gX2ZuRmVhdHVyZUh0bWxQYWdpbmF0ZShvU2V0dGluZ3Mpe3ZhciBuUGFnaW5hdGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CituUGFnaW5hdGUuY2xhc3NOYW1lPSJkYXRhVGFibGVzX3BhZ2luYXRlIjtvU2V0dGluZ3MublBhZ2luYXRlPW5QYWdpbmF0ZTskLmZuLmRhdGFUYWJsZUV4dC5vUGFnaW5hdGlvbltvU2V0dGluZ3Muc1BhZ2luYXRpb25UeXBlXS5mbkluaXQob1NldHRpbmdzLGZ1bmN0aW9uKG9TZXR0aW5ncyl7X2ZuQ2FsY3VsYXRlRW5kKG9TZXR0aW5ncyk7CitfZm5EcmF3KG9TZXR0aW5ncyl9KTtyZXR1cm4gblBhZ2luYXRlfWZ1bmN0aW9uIF9mbkZlYXR1cmVIdG1sTGVuZ3RoKG9TZXR0aW5ncyl7dmFyIHNOYW1lPShvU2V0dGluZ3Muc1RhYmxlSWQ9PT0iIik/IiI6J25hbWU9Iicrb1NldHRpbmdzLnNUYWJsZUlkKydfbGVuZ3RoIic7Cit2YXIgc1N0ZE1lbnU9JzxzZWxlY3Qgc2l6ZT0iMSIgJytzTmFtZSsnPjxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjI1Ij4yNTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjUwIj41MDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEwMCI+MTAwPC9vcHRpb24+PC9zZWxlY3Q+JzsKK3ZhciBuTGVuZ3RoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG9TZXR0aW5ncy5zVGFibGVJZCE9PSIiKXtuTGVuZ3RoLnNldEF0dHJpYnV0ZSgiaWQiLG9TZXR0aW5ncy5zVGFibGVJZCsiX2xlbmd0aCIpCit9bkxlbmd0aC5jbGFzc05hbWU9ImRhdGFUYWJsZXNfbGVuZ3RoIjtuTGVuZ3RoLmlubmVySFRNTD1vU2V0dGluZ3Mub0xhbmd1YWdlLnNMZW5ndGhNZW51LnJlcGxhY2UoIl9NRU5VXyIsc1N0ZE1lbnUpOworJCgnc2VsZWN0IG9wdGlvblt2YWx1ZT0iJytvU2V0dGluZ3MuaURpc3BsYXlMZW5ndGgrJyJdJyxuTGVuZ3RoKS5hdHRyKCJzZWxlY3RlZCIsdHJ1ZSk7CiskKCJzZWxlY3QiLG5MZW5ndGgpLmNoYW5nZShmdW5jdGlvbigpe29TZXR0aW5ncy5pRGlzcGxheUxlbmd0aD1wYXJzZUludCgkKHRoaXMpLnZhbCgpLDEwKTsKK19mbkNhbGN1bGF0ZUVuZChvU2V0dGluZ3MpO2lmKG9TZXR0aW5ncy5pRGlzcGxheUVuZD09b1NldHRpbmdzLmFpRGlzcGxheS5sZW5ndGgpe29TZXR0aW5ncy5pRGlzcGxheVN0YXJ0PW9TZXR0aW5ncy5pRGlzcGxheUVuZC1vU2V0dGluZ3MuaURpc3BsYXlMZW5ndGg7CitpZihvU2V0dGluZ3MuaURpc3BsYXlTdGFydDwwKXtvU2V0dGluZ3MuaURpc3BsYXlTdGFydD0wfX1fZm5EcmF3KG9TZXR0aW5ncyl9KTtyZXR1cm4gbkxlbmd0aAorfWZ1bmN0aW9uIF9mbkZlYXR1cmVIdG1sUHJvY2Vzc2luZyhvU2V0dGluZ3Mpe3ZhciBuUHJvY2Vzc2luZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK29TZXR0aW5ncy5uUHJvY2Vzc2luZz1uUHJvY2Vzc2luZztpZihvU2V0dGluZ3Muc1RhYmxlSWQhPT0iIil7b1NldHRpbmdzLm5Qcm9jZXNzaW5nLnNldEF0dHJpYnV0ZSgiaWQiLG9TZXR0aW5ncy5zVGFibGVJZCsiX3Byb2Nlc3NpbmciKQorfW9TZXR0aW5ncy5uUHJvY2Vzc2luZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvU2V0dGluZ3Mub0xhbmd1YWdlLnNQcm9jZXNzaW5nKSk7CitvU2V0dGluZ3MublByb2Nlc3NpbmcuY2xhc3NOYW1lPSJkYXRhVGFibGVzX3Byb2Nlc3NpbmciO29TZXR0aW5ncy5uUHJvY2Vzc2luZy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iOworb1NldHRpbmdzLm5UYWJsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvU2V0dGluZ3MublByb2Nlc3Npbmcsb1NldHRpbmdzLm5UYWJsZSk7CityZXR1cm4gblByb2Nlc3Npbmd9ZnVuY3Rpb24gX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkob1NldHRpbmdzLGJTaG93KXtpZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJQcm9jZXNzaW5nKXtpZihiU2hvdyl7b1NldHRpbmdzLm5Qcm9jZXNzaW5nLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiCit9ZWxzZXtvU2V0dGluZ3MublByb2Nlc3Npbmcuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn19fWZ1bmN0aW9uIF9mbkZpbHRlckNvbXBsZXRlKG9TZXR0aW5ncyxvSW5wdXQsaUZvcmNlKXtfZm5GaWx0ZXIob1NldHRpbmdzLG9JbnB1dC5zU2VhcmNoLGlGb3JjZSxvSW5wdXQuYkVzY2FwZVJlZ2V4KTsKK2Zvcih2YXIgaT0wO2k8b1NldHRpbmdzLmFvUHJlU2VhcmNoQ29scy5sZW5ndGg7aSsrKXtfZm5GaWx0ZXJDb2x1bW4ob1NldHRpbmdzLG9TZXR0aW5ncy5hb1ByZVNlYXJjaENvbHNbaV0uc1NlYXJjaCxpLG9TZXR0aW5ncy5hb1ByZVNlYXJjaENvbHNbaV0uYkVzY2FwZVJlZ2V4KQorfWlmKHR5cGVvZiBvU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQhPSJ1bmRlZmluZWQiJiZvU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQhPS0xKXtvU2V0dGluZ3MuaURpc3BsYXlTdGFydD1vU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQ7CitvU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQ9LTF9ZWxzZXtvU2V0dGluZ3MuaURpc3BsYXlTdGFydD0wfV9mbkNhbGN1bGF0ZUVuZChvU2V0dGluZ3MpOworX2ZuRHJhdyhvU2V0dGluZ3MpO19mbkJ1aWxkU2VhcmNoQXJyYXkob1NldHRpbmdzLDApfWZ1bmN0aW9uIF9mbkZpbHRlckNvbHVtbihvU2V0dGluZ3Msc0lucHV0LGlDb2x1bW4sYkVzY2FwZVJlZ2V4KXtpZihzSW5wdXQ9PT0iIil7cmV0dXJuCit9dmFyIGlJbmRleENvcnJlY3Rvcj0wO3ZhciBzUmVnZXhNYXRjaD1iRXNjYXBlUmVnZXg/X2ZuRXNjYXBlUmVnZXgoc0lucHV0KTpzSW5wdXQ7Cit2YXIgcnBTZWFyY2g9bmV3IFJlZ0V4cChzUmVnZXhNYXRjaCwiaSIpO2ZvcihpPW9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoLTE7aT49MDsKK2ktLSl7aWYoIXJwU2VhcmNoLnRlc3Qob1NldHRpbmdzLmFvRGF0YVtvU2V0dGluZ3MuYWlEaXNwbGF5W2ldXS5fYURhdGFbaUNvbHVtbl0pKXtvU2V0dGluZ3MuYWlEaXNwbGF5LnNwbGljZShpLDEpOworaUluZGV4Q29ycmVjdG9yKyt9fX1mdW5jdGlvbiBfZm5GaWx0ZXIob1NldHRpbmdzLHNJbnB1dCxpRm9yY2UsYkVzY2FwZVJlZ2V4KXt2YXIgZmxhZyxpLGo7CitpZih0eXBlb2YgaUZvcmNlPT0idW5kZWZpbmVkInx8aUZvcmNlPT09bnVsbCl7aUZvcmNlPTB9aWYodHlwZW9mIGJSZWRyYXc9PSJ1bmRlZmluZWQifHxiUmVkcmF3PT09bnVsbCl7YlJlZHJhdz10cnVlCit9dmFyIGFzU2VhcmNoPWJFc2NhcGVSZWdleD9fZm5Fc2NhcGVSZWdleChzSW5wdXQpLnNwbGl0KCIgIik6c0lucHV0LnNwbGl0KCIgIik7dmFyIHNSZWdFeHBTdHJpbmc9Il4oPz0uKj8iK2FzU2VhcmNoLmpvaW4oIikoPz0uKj8iKSsiKS4qJCI7Cit2YXIgcnBTZWFyY2g9bmV3IFJlZ0V4cChzUmVnRXhwU3RyaW5nLCJpIik7aWYoc0lucHV0Lmxlbmd0aDw9MCl7b1NldHRpbmdzLmFpRGlzcGxheS5zcGxpY2UoMCxvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aCk7CitvU2V0dGluZ3MuYWlEaXNwbGF5PW9TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKX1lbHNle2lmKG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoPT1vU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aHx8b1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoLmxlbmd0aD5zSW5wdXQubGVuZ3RofHxpRm9yY2U9PTF8fHNJbnB1dC5pbmRleE9mKG9TZXR0aW5ncy5vUHJldmlvdXNTZWFyY2guc1NlYXJjaCkhPT0wKXtvU2V0dGluZ3MuYWlEaXNwbGF5LnNwbGljZSgwLG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoKTsKK19mbkJ1aWxkU2VhcmNoQXJyYXkob1NldHRpbmdzLDEpO2ZvcihpPTA7aTxvU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aDtpKyspe2lmKHJwU2VhcmNoLnRlc3Qob1NldHRpbmdzLmFzRGF0YVNlYXJjaFtpXSkpe29TZXR0aW5ncy5haURpc3BsYXkucHVzaChvU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyW2ldKQorfX19ZWxzZXt2YXIgaUluZGV4Q29ycmVjdG9yPTA7Zm9yKGk9MDtpPG9TZXR0aW5ncy5hc0RhdGFTZWFyY2gubGVuZ3RoO2krKyl7aWYoIXJwU2VhcmNoLnRlc3Qob1NldHRpbmdzLmFzRGF0YVNlYXJjaFtpXSkpe29TZXR0aW5ncy5haURpc3BsYXkuc3BsaWNlKGktaUluZGV4Q29ycmVjdG9yLDEpOworaUluZGV4Q29ycmVjdG9yKyt9fX19b1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoPXNJbnB1dDtvU2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoLmJFc2NhcGVSZWdleD1iRXNjYXBlUmVnZXgKK31mdW5jdGlvbiBfZm5Tb3J0KG9TZXR0aW5ncyxiQXBwbHlDbGFzc2VzKXt2YXIgc0R5bmFtaWNTb3J0PSJ2YXIgZm5Mb2NhbFNvcnRpbmcgPSBmdW5jdGlvbihhLGIpe3ZhciBpVGVzdDt2YXIgb1NvcnQgPSAkLmZuLmRhdGFUYWJsZUV4dC5vU29ydDt2YXIgYW9EYXRhID0gb1NldHRpbmdzLmFvRGF0YTsiOwordmFyIGFhU29ydD1vU2V0dGluZ3MuYWFTb3J0aW5nO3ZhciBpRGF0YVNvcnQ7dmFyIGlEYXRhVHlwZTtpZihhYVNvcnQubGVuZ3RoIT09MCl7Zm9yKHZhciBpPTA7CitpPGFhU29ydC5sZW5ndGgtMTtpKyspe2lEYXRhU29ydD1vU2V0dGluZ3MuYW9Db2x1bW5zW2FhU29ydFtpXVswXV0uaURhdGFTb3J0O2lEYXRhVHlwZT1vU2V0dGluZ3MuYW9Db2x1bW5zW2lEYXRhU29ydF0uc1R5cGU7CitzRHluYW1pY1NvcnQrPSJpVGVzdCA9IG9Tb3J0WyciK2lEYXRhVHlwZSsiLSIrYWFTb3J0W2ldWzFdKyInXSggYW9EYXRhW2FdLl9hRGF0YVsiK2lEYXRhU29ydCsiXSwgYW9EYXRhW2JdLl9hRGF0YVsiK2lEYXRhU29ydCsiXSApOyBpZiAoIGlUZXN0ID09PSAwICkiCit9aURhdGFTb3J0PW9TZXR0aW5ncy5hb0NvbHVtbnNbYWFTb3J0W2FhU29ydC5sZW5ndGgtMV1bMF1dLmlEYXRhU29ydDtpRGF0YVR5cGU9b1NldHRpbmdzLmFvQ29sdW1uc1tpRGF0YVNvcnRdLnNUeXBlOworc0R5bmFtaWNTb3J0Kz0iaVRlc3QgPSBvU29ydFsnIitpRGF0YVR5cGUrIi0iK2FhU29ydFthYVNvcnQubGVuZ3RoLTFdWzFdKyInXSggYW9EYXRhW2FdLl9hRGF0YVsiK2lEYXRhU29ydCsiXSwgYW9EYXRhW2JdLl9hRGF0YVsiK2lEYXRhU29ydCsiXSApOyByZXR1cm4gaVRlc3Q7fSI7CitldmFsKHNEeW5hbWljU29ydCk7b1NldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5zb3J0KGZuTG9jYWxTb3J0aW5nKX1pZih0eXBlb2YgYkFwcGx5Q2xhc3Nlcz09InVuZGVmaW5lZCJ8fGJBcHBseUNsYXNzZXMpe19mblNvcnRpbmdDbGFzc2VzKG9TZXR0aW5ncykKK31pZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJGaWx0ZXIpe19mbkZpbHRlckNvbXBsZXRlKG9TZXR0aW5ncyxvU2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoLDEpCit9ZWxzZXtvU2V0dGluZ3MuYWlEaXNwbGF5PW9TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKTtfZm5DYWxjdWxhdGVFbmQob1NldHRpbmdzKTsKK19mbkRyYXcob1NldHRpbmdzKX19ZnVuY3Rpb24gX2ZuU29ydGluZ0NsYXNzZXMob1NldHRpbmdzKXskKCJ0aGVhZCB0aCIsb1NldHRpbmdzLm5UYWJsZSkucmVtb3ZlQ2xhc3MoInNvcnRpbmdfYXNjIHNvcnRpbmdfZGVzYyBzb3J0aW5nIik7Cit2YXIgaUNvcnJlY3Rvcj0wO3ZhciBpO2ZvcihpPTA7aTxvU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uYlNvcnRhYmxlJiZvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmJWaXNpYmxlKXt2YXIgc0NsYXNzPSJzb3J0aW5nIjsKK2Zvcih2YXIgaj0wO2o8b1NldHRpbmdzLmFhU29ydGluZy5sZW5ndGg7aisrKXtpZihvU2V0dGluZ3MuYWFTb3J0aW5nW2pdWzBdPT1pKXtzQ2xhc3M9KG9TZXR0aW5ncy5hYVNvcnRpbmdbal1bMV09PSJhc2MiKT8ic29ydGluZ19hc2MiOiJzb3J0aW5nX2Rlc2MiOworYnJlYWt9fSQoInRoZWFkIHRoOmVxKCIrX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUob1NldHRpbmdzLGkpKyIpIixvU2V0dGluZ3MublRhYmxlKS5hZGRDbGFzcyhzQ2xhc3MpCit9fWlmKG9TZXR0aW5ncy5vRmVhdHVyZXMuYlNvcnRDbGFzc2VzKXt2YXIgblRycz1fZm5HZXRUck5vZGVzKG9TZXR0aW5ncyk7JCgidGQiLG5UcnMpLnJlbW92ZUNsYXNzKCJzb3J0aW5nXzEgc29ydGluZ18yIHNvcnRpbmdfMyIpOworZm9yKGk9MDtpPG9TZXR0aW5ncy5hYVNvcnRpbmcubGVuZ3RoO2krKyl7aWYoaTw9MSl7JCgidGQ6ZXEoIitfZm5Db2x1bW5JbmRleFRvVmlzaWJsZShvU2V0dGluZ3Msb1NldHRpbmdzLmFhU29ydGluZ1tpXVswXSkrIikiLG5UcnMpLmFkZENsYXNzKCJzb3J0aW5nXyIrKGkrMSkpCit9ZWxzZXskKCJ0ZDplcSgiK19mbkNvbHVtbkluZGV4VG9WaXNpYmxlKG9TZXR0aW5ncyxvU2V0dGluZ3MuYWFTb3J0aW5nW2ldWzBdKSsiKSIsblRycykuYWRkQ2xhc3MoInNvcnRpbmdfMyIpCit9fX19ZnVuY3Rpb24gX2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXgob1NldHRpbmdzLGlNYXRjaCl7dmFyIGlDb2x1bW49LTE7Zm9yKHZhciBpPTA7CitpPG9TZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoO2krKyl7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5iVmlzaWJsZT09PXRydWUpe2lDb2x1bW4rKworfWlmKGlDb2x1bW49PWlNYXRjaCl7cmV0dXJuIGl9fXJldHVybiBudWxsfWZ1bmN0aW9uIF9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKG9TZXR0aW5ncyxpTWF0Y2gpe3ZhciBpVmlzaWJsZT0tMTsKK2Zvcih2YXIgaT0wO2k8b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7aSsrKXtpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLmJWaXNpYmxlPT09dHJ1ZSl7aVZpc2libGUrKworfWlmKGk9PWlNYXRjaCl7cmV0dXJuIG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uYlZpc2libGU9PT10cnVlP2lWaXNpYmxlOm51bGx9fXJldHVybiBudWxsCit9ZnVuY3Rpb24gX2ZuQnVpbGRTZWFyY2hBcnJheShvU2V0dGluZ3MsaU1hc3Rlcil7b1NldHRpbmdzLmFzRGF0YVNlYXJjaC5zcGxpY2UoMCxvU2V0dGluZ3MuYXNEYXRhU2VhcmNoLmxlbmd0aCk7Cit2YXIgYUFycmF5PSh0eXBlb2YgaU1hc3RlciE9InVuZGVmaW5lZCImJmlNYXN0ZXI9PTEpP29TZXR0aW5ncy5haURpc3BsYXlNYXN0ZXI6b1NldHRpbmdzLmFpRGlzcGxheTsKK2ZvcihpPTA7aTxhQXJyYXkubGVuZ3RoO2krKyl7b1NldHRpbmdzLmFzRGF0YVNlYXJjaFtpXT0iIjtmb3Ioaj0wO2o8b1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7CitqKyspe2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbal0uYlNlYXJjaGFibGUpe3ZhciBzRGF0YT1vU2V0dGluZ3MuYW9EYXRhW2FBcnJheVtpXV0uX2FEYXRhW2pdOworaWYob1NldHRpbmdzLmFvQ29sdW1uc1tqXS5zVHlwZT09Imh0bWwiKXtvU2V0dGluZ3MuYXNEYXRhU2VhcmNoW2ldKz1zRGF0YS5yZXBsYWNlKC9cbi9nLCIgIikucmVwbGFjZSgvPC4qPz4vZywiIikrIiAiCit9ZWxzZXtpZih0eXBlb2Ygc0RhdGE9PSJzdHJpbmciKXtvU2V0dGluZ3MuYXNEYXRhU2VhcmNoW2ldKz1zRGF0YS5yZXBsYWNlKC9cbi9nLCIgIikrIiAiCit9ZWxzZXtvU2V0dGluZ3MuYXNEYXRhU2VhcmNoW2ldKz1zRGF0YSsiICJ9fX19fX1mdW5jdGlvbiBfZm5DYWxjdWxhdGVFbmQob1NldHRpbmdzKXtpZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJQYWdpbmF0ZT09PWZhbHNlKXtvU2V0dGluZ3MuaURpc3BsYXlFbmQ9b1NldHRpbmdzLmFpRGlzcGxheS5sZW5ndGgKK31lbHNle2lmKG9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0K29TZXR0aW5ncy5pRGlzcGxheUxlbmd0aD5vU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aCl7b1NldHRpbmdzLmlEaXNwbGF5RW5kPW9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoCit9ZWxzZXtvU2V0dGluZ3MuaURpc3BsYXlFbmQ9b1NldHRpbmdzLmlEaXNwbGF5U3RhcnQrb1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RofX19ZnVuY3Rpb24gX2ZuQ29udmVydFRvV2lkdGgoc1dpZHRoLG5QYXJlbnQpe2lmKCFzV2lkdGh8fHNXaWR0aD09PW51bGx8fHNXaWR0aD09PSIiKXtyZXR1cm4gMAorfWlmKHR5cGVvZiBuUGFyZW50PT0idW5kZWZpbmVkIil7blBhcmVudD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdCit9dmFyIGlXaWR0aDt2YXIgblRtcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuVG1wLnN0eWxlLndpZHRoPXNXaWR0aDtuUGFyZW50LmFwcGVuZENoaWxkKG5UbXApOworaVdpZHRoPW5UbXAub2Zmc2V0V2lkdGg7blBhcmVudC5yZW1vdmVDaGlsZChuVG1wKTtyZXR1cm4oaVdpZHRoKX1mdW5jdGlvbiBfZm5DYWxjdWxhdGVDb2x1bW5XaWR0aHMob1NldHRpbmdzKXt2YXIgaVRhYmxlV2lkdGg9b1NldHRpbmdzLm5UYWJsZS5vZmZzZXRXaWR0aDsKK3ZhciBpVG90YWxVc2VySXBTaXplPTA7dmFyIGlUbXBXaWR0aDt2YXIgaVZpc2libGVDb2x1bW5zPTA7dmFyIGk7dmFyIG9IZWFkZXJzPSQoInRoZWFkIHRoIixvU2V0dGluZ3MublRhYmxlKTsKK2ZvcihpPTA7aTxvU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uYlZpc2libGUpe2lWaXNpYmxlQ29sdW1ucysrOworaWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zV2lkdGghPT1udWxsKXtpVG1wV2lkdGg9X2ZuQ29udmVydFRvV2lkdGgob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zV2lkdGgsb1NldHRpbmdzLm5UYWJsZS5wYXJlbnROb2RlKTsKK2lUb3RhbFVzZXJJcFNpemUrPWlUbXBXaWR0aDtvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNXaWR0aD1pVG1wV2lkdGgrInB4In19fWlmKG9TZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoPT1vSGVhZGVycy5sZW5ndGgmJmlUb3RhbFVzZXJJcFNpemU9PT0wKXtmb3IoaT0wOworaTxvU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aDtpKyspe29TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1dpZHRoPW9IZWFkZXJzW2ldLm9mZnNldFdpZHRoKyJweCIKK319ZWxzZXt2YXIgbkNhbGNUbXA9b1NldHRpbmdzLm5UYWJsZS5jbG9uZU5vZGUoZmFsc2UpO25DYWxjVG1wLnNldEF0dHJpYnV0ZSgiaWQiLCIiKTsKK3ZhciBzVGFibGVUbXA9Jzx0YWJsZSBjbGFzcz0iJytuQ2FsY1RtcC5jbGFzc05hbWUrJyI+Jzt2YXIgc0NhbGNIZWFkPSI8dHI+Ijt2YXIgc0NhbGNIdG1sPSI8dHI+IjsKK2ZvcihpPTA7aTxvU2V0dGluZ3MuYW9Db2x1bW5zLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5hb0NvbHVtbnNbaV0uYlZpc2libGUpe3NDYWxjSGVhZCs9Ijx0aD4iK29TZXR0aW5ncy5hb0NvbHVtbnNbaV0uc1RpdGxlKyI8L3RoPiI7CitpZihvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNXaWR0aCE9PW51bGwpe3ZhciBzV2lkdGg9IiI7aWYob1NldHRpbmdzLmFvQ29sdW1uc1tpXS5zV2lkdGghPT1udWxsKXtzV2lkdGg9JyBzdHlsZT0id2lkdGg6JytvU2V0dGluZ3MuYW9Db2x1bW5zW2ldLnNXaWR0aCsnOyInCit9c0NhbGNIdG1sKz0iPHRkIitzV2lkdGgrJyB0YWdfaW5kZXg9IicraSsnIj4nK2ZuR2V0TWF4TGVuU3RyaW5nKG9TZXR0aW5ncyxpKSsiPC90ZD4iCit9ZWxzZXtzQ2FsY0h0bWwrPSc8dGQgdGFnX2luZGV4PSInK2krJyI+JytmbkdldE1heExlblN0cmluZyhvU2V0dGluZ3MsaSkrIjwvdGQ+In19fXNDYWxjSGVhZCs9IjwvdHI+IjsKK3NDYWxjSHRtbCs9IjwvdHI+IjtuQ2FsY1RtcD0kKHNUYWJsZVRtcCtzQ2FsY0hlYWQrc0NhbGNIdG1sKyI8L3RhYmxlPiIpWzBdO25DYWxjVG1wLnN0eWxlLndpZHRoPWlUYWJsZVdpZHRoKyJweCI7CituQ2FsY1RtcC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO25DYWxjVG1wLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7b1NldHRpbmdzLm5UYWJsZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5DYWxjVG1wKTsKK3ZhciBvTm9kZXM9JCgidGQiLG5DYWxjVG1wKTt2YXIgaUluZGV4O2ZvcihpPTA7aTxvTm9kZXMubGVuZ3RoO2krKyl7aUluZGV4PW9Ob2Rlc1tpXS5nZXRBdHRyaWJ1dGUoInRhZ19pbmRleCIpOworb1NldHRpbmdzLmFvQ29sdW1uc1tpSW5kZXhdLnNXaWR0aD0kKCJ0ZCIsbkNhbGNUbXApW2ldLm9mZnNldFdpZHRoKyJweCJ9b1NldHRpbmdzLm5UYWJsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5DYWxjVG1wKQorfX1mdW5jdGlvbiBmbkdldE1heExlblN0cmluZyhvU2V0dGluZ3MsaUNvbCl7dmFyIGlNYXg9MDt2YXIgaU1heEluZGV4PS0xO2Zvcih2YXIgaT0wOworaTxvU2V0dGluZ3MuYW9EYXRhLmxlbmd0aDtpKyspe2lmKG9TZXR0aW5ncy5hb0RhdGFbaV0uX2FEYXRhW2lDb2xdLmxlbmd0aD5pTWF4KXtpTWF4PW9TZXR0aW5ncy5hb0RhdGFbaV0uX2FEYXRhW2lDb2xdLmxlbmd0aDsKK2lNYXhJbmRleD1pfX1pZihpTWF4SW5kZXg+PTApe3JldHVybiBvU2V0dGluZ3MuYW9EYXRhW2lNYXhJbmRleF0uX2FEYXRhW2lDb2xdfXJldHVybiIiCit9ZnVuY3Rpb24gX2ZuQXJyYXlDbXAoYUFycmF5MSxhQXJyYXkyKXtpZihhQXJyYXkxLmxlbmd0aCE9YUFycmF5Mi5sZW5ndGgpe3JldHVybiAxCit9Zm9yKHZhciBpPTA7aTxhQXJyYXkxLmxlbmd0aDtpKyspe2lmKGFBcnJheTFbaV0hPWFBcnJheTJbaV0pe3JldHVybiAyfX1yZXR1cm4gMH1mdW5jdGlvbiBfZm5EZXRlY3RUeXBlKHNEYXRhKXt2YXIgYVR5cGVzPSQuZm4uZGF0YVRhYmxlRXh0LmFUeXBlczsKK3ZhciBpTGVuPWFUeXBlcy5sZW5ndGg7Zm9yKHZhciBpPTA7aTxpTGVuO2krKyl7dmFyIHNUeXBlPWFUeXBlc1tpXShzRGF0YSk7aWYoc1R5cGUhPT1udWxsKXtyZXR1cm4gc1R5cGUKK319cmV0dXJuInN0cmluZyJ9ZnVuY3Rpb24gX2ZuU2V0dGluZ3NGcm9tTm9kZShuVGFibGUpe2Zvcih2YXIgaT0wO2k8X2FvU2V0dGluZ3MubGVuZ3RoOworaSsrKXtpZihfYW9TZXR0aW5nc1tpXS5uVGFibGU9PW5UYWJsZSl7cmV0dXJuIF9hb1NldHRpbmdzW2ldfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBfZm5HZXREYXRhTWFzdGVyKG9TZXR0aW5ncyl7dmFyIGFEYXRhPVtdOwordmFyIGlMZW49b1NldHRpbmdzLmFvRGF0YS5sZW5ndGg7Zm9yKHZhciBpPTA7aTxpTGVuO2krKyl7YURhdGEucHVzaChvU2V0dGluZ3MuYW9EYXRhW2ldLl9hRGF0YSkKK31yZXR1cm4gYURhdGF9ZnVuY3Rpb24gX2ZuR2V0VHJOb2RlcyhvU2V0dGluZ3Mpe3ZhciBhTm9kZXM9W107dmFyIGlMZW49b1NldHRpbmdzLmFvRGF0YS5sZW5ndGg7Citmb3IodmFyIGk9MDtpPGlMZW47aSsrKXthTm9kZXMucHVzaChvU2V0dGluZ3MuYW9EYXRhW2ldLm5Ucil9cmV0dXJuIGFOb2Rlc31mdW5jdGlvbiBfZm5Fc2NhcGVSZWdleChzVmFsKXt2YXIgYWNFc2NhcGU9WyIvIiwiLiIsIioiLCIrIiwiPyIsInwiLCIoIiwiKSIsIlsiLCJdIiwieyIsIn0iLCJcXCIsIiQiLCJeIl07Cit2YXIgcmVSZXBsYWNlPW5ldyBSZWdFeHAoIihcXCIrYWNFc2NhcGUuam9pbigifFxcIikrIikiLCJnIik7cmV0dXJuIHNWYWwucmVwbGFjZShyZVJlcGxhY2UsIlxcJDEiKQorfWZ1bmN0aW9uIF9mblNhdmVTdGF0ZShvU2V0dGluZ3Mpe2lmKCFvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTdGF0ZVNhdmUpe3JldHVybn12YXIgc1ZhbHVlPSJ7IjsKK3NWYWx1ZSs9JyJpU3RhcnQiOiAnK29TZXR0aW5ncy5pRGlzcGxheVN0YXJ0KyIsIjtzVmFsdWUrPSciaUVuZCI6ICcrb1NldHRpbmdzLmlEaXNwbGF5RW5kKyIsIjsKK3NWYWx1ZSs9JyJpTGVuZ3RoIjogJytvU2V0dGluZ3MuaURpc3BsYXlMZW5ndGgrIiwiO3NWYWx1ZSs9JyJzRmlsdGVyIjogIicrb1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoLnJlcGxhY2UoJyInLCdcXCInKSsnIiwnOworc1ZhbHVlKz0nInNGaWx0ZXJFc2MiOiAnK29TZXR0aW5ncy5vUHJldmlvdXNTZWFyY2guYkVzY2FwZVJlZ2V4KyIsIjtzVmFsdWUrPSciYWFTb3J0aW5nIjogWyAnOworZm9yKHZhciBpPTA7aTxvU2V0dGluZ3MuYWFTb3J0aW5nLmxlbmd0aDtpKyspe3NWYWx1ZSs9IlsiK29TZXR0aW5ncy5hYVNvcnRpbmdbaV1bMF0rIiwnIitvU2V0dGluZ3MuYWFTb3J0aW5nW2ldWzFdKyInXSwiCit9c1ZhbHVlPXNWYWx1ZS5zdWJzdHJpbmcoMCxzVmFsdWUubGVuZ3RoLTEpO3NWYWx1ZSs9Il19IjtfZm5DcmVhdGVDb29raWUoIlNwcnlNZWRpYV9EYXRhVGFibGVzXyIrb1NldHRpbmdzLnNJbnN0YW5jZSxzVmFsdWUsb1NldHRpbmdzLmlDb29raWVEdXJhdGlvbikKK31mdW5jdGlvbiBfZm5Mb2FkU3RhdGUob1NldHRpbmdzKXtpZighb1NldHRpbmdzLm9GZWF0dXJlcy5iU3RhdGVTYXZlKXtyZXR1cm59dmFyIHNEYXRhPV9mblJlYWRDb29raWUoIlNwcnlNZWRpYV9EYXRhVGFibGVzXyIrb1NldHRpbmdzLnNJbnN0YW5jZSk7CitpZihzRGF0YSE9PW51bGwmJnNEYXRhIT09IiIpe2lmKHR5cGVvZiBKU09OPT0ib2JqZWN0IiYmdHlwZW9mIEpTT04ucGFyc2U9PSJmdW5jdGlvbiIpe29EYXRhPUpTT04ucGFyc2Uoc0RhdGEucmVwbGFjZSgvJy9nLCciJykpCit9ZWxzZXtvRGF0YT1ldmFsKCIoIitzRGF0YSsiKSIpfW9TZXR0aW5ncy5pRGlzcGxheVN0YXJ0PW9EYXRhLmlTdGFydDtvU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQ9b0RhdGEuaVN0YXJ0Oworb1NldHRpbmdzLmlEaXNwbGF5RW5kPW9EYXRhLmlFbmQ7b1NldHRpbmdzLmlEaXNwbGF5TGVuZ3RoPW9EYXRhLmlMZW5ndGg7b1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoPW9EYXRhLnNGaWx0ZXI7CitvU2V0dGluZ3MuYWFTb3J0aW5nPW9EYXRhLmFhU29ydGluZy5zbGljZSgpO2lmKHR5cGVvZiBvRGF0YS5zRmlsdGVyRXNjIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5iRXNjYXBlUmVnZXg9b0RhdGEuc0ZpbHRlckVzYworfX19ZnVuY3Rpb24gX2ZuQ3JlYXRlQ29va2llKHNOYW1lLHNWYWx1ZSxpU2Vjcyl7dmFyIGRhdGU9bmV3IERhdGUoKTtkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKGlTZWNzKjEwMDApKTsKK3NOYW1lKz0iXyIrd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1tcLzpdL2csIiIpO2RvY3VtZW50LmNvb2tpZT1zTmFtZSsiPSIrc1ZhbHVlKyI7IGV4cGlyZXM9IitkYXRlLnRvR01UU3RyaW5nKCkrIjsgcGF0aD0vIgorfWZ1bmN0aW9uIF9mblJlYWRDb29raWUoc05hbWUpe3ZhciBzTmFtZUVRPXNOYW1lKyJfIit3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvW1wvOl0vZywiIikrIj0iOwordmFyIHNDb29raWVDb250ZW50cz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGk9MDtpPHNDb29raWVDb250ZW50cy5sZW5ndGg7CitpKyspe3ZhciBjPXNDb29raWVDb250ZW50c1tpXTt3aGlsZShjLmNoYXJBdCgwKT09IiAiKXtjPWMuc3Vic3RyaW5nKDEsYy5sZW5ndGgpfWlmKGMuaW5kZXhPZihzTmFtZUVRKT09PTApe3JldHVybiBjLnN1YnN0cmluZyhzTmFtZUVRLmxlbmd0aCxjLmxlbmd0aCkKK319cmV0dXJuIG51bGx9aWYoYkFwaSl7dGhpcy5vQXBpLl9mbkluaXRhbGlzZT1fZm5Jbml0YWxpc2U7dGhpcy5vQXBpLl9mbkxhbmd1YWdlUHJvY2Vzcz1fZm5MYW5ndWFnZVByb2Nlc3M7Cit0aGlzLm9BcGkuX2ZuQWRkQ29sdW1uPV9mbkFkZENvbHVtbjt0aGlzLm9BcGkuX2ZuQWRkRGF0YT1fZm5BZGREYXRhO3RoaXMub0FwaS5fZm5HYXRoZXJEYXRhPV9mbkdhdGhlckRhdGE7Cit0aGlzLm9BcGkuX2ZuRHJhd0hlYWQ9X2ZuRHJhd0hlYWQ7dGhpcy5vQXBpLl9mbkRyYXc9X2ZuRHJhdzt0aGlzLm9BcGkuX2ZuQWRkT3B0aW9uc0h0bWw9X2ZuQWRkT3B0aW9uc0h0bWw7Cit0aGlzLm9BcGkuX2ZuRmVhdHVyZUh0bWxGaWx0ZXI9X2ZuRmVhdHVyZUh0bWxGaWx0ZXI7dGhpcy5vQXBpLl9mbkZlYXR1cmVIdG1sSW5mbz1fZm5GZWF0dXJlSHRtbEluZm87Cit0aGlzLm9BcGkuX2ZuRmVhdHVyZUh0bWxQYWdpbmF0ZT1fZm5GZWF0dXJlSHRtbFBhZ2luYXRlO3RoaXMub0FwaS5fZm5GZWF0dXJlSHRtbExlbmd0aD1fZm5GZWF0dXJlSHRtbExlbmd0aDsKK3RoaXMub0FwaS5fZm5GZWF0dXJlSHRtbFByb2Nlc3Npbmc9X2ZuRmVhdHVyZUh0bWxQcm9jZXNzaW5nO3RoaXMub0FwaS5fZm5Qcm9jZXNzaW5nRGlzcGxheT1fZm5Qcm9jZXNzaW5nRGlzcGxheTsKK3RoaXMub0FwaS5fZm5GaWx0ZXJDb21wbGV0ZT1fZm5GaWx0ZXJDb21wbGV0ZTt0aGlzLm9BcGkuX2ZuRmlsdGVyQ29sdW1uPV9mbkZpbHRlckNvbHVtbjsKK3RoaXMub0FwaS5fZm5GaWx0ZXI9X2ZuRmlsdGVyO3RoaXMub0FwaS5fZm5Tb3J0aW5nQ2xhc3Nlcz1fZm5Tb3J0aW5nQ2xhc3Nlczt0aGlzLm9BcGkuX2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXg9X2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXg7Cit0aGlzLm9BcGkuX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGU9X2ZuQ29sdW1uSW5kZXhUb1Zpc2libGU7dGhpcy5vQXBpLl9mbkJ1aWxkU2VhcmNoQXJyYXk9X2ZuQnVpbGRTZWFyY2hBcnJheTsKK3RoaXMub0FwaS5fZm5DYWxjdWxhdGVFbmQ9X2ZuQ2FsY3VsYXRlRW5kO3RoaXMub0FwaS5fZm5Db252ZXJ0VG9XaWR0aD1fZm5Db252ZXJ0VG9XaWR0aDsKK3RoaXMub0FwaS5fZm5DYWxjdWxhdGVDb2x1bW5XaWR0aHM9X2ZuQ2FsY3VsYXRlQ29sdW1uV2lkdGhzO3RoaXMub0FwaS5fZm5BcnJheUNtcD1fZm5BcnJheUNtcDsKK3RoaXMub0FwaS5fZm5EZXRlY3RUeXBlPV9mbkRldGVjdFR5cGU7dGhpcy5vQXBpLl9mbkdldERhdGFNYXN0ZXI9X2ZuR2V0RGF0YU1hc3RlcjsKK3RoaXMub0FwaS5fZm5HZXRUck5vZGVzPV9mbkdldFRyTm9kZXM7dGhpcy5vQXBpLl9mbkVzY2FwZVJlZ2V4PV9mbkVzY2FwZVJlZ2V4O3RoaXMub0FwaS5fZm5TYXZlU3RhdGU9X2ZuU2F2ZVN0YXRlOwordGhpcy5vQXBpLl9mbkxvYWRTdGF0ZT1fZm5Mb2FkU3RhdGU7dGhpcy5vQXBpLl9mbkNyZWF0ZUNvb2tpZT1fZm5DcmVhdGVDb29raWU7dGhpcy5vQXBpLl9mblJlYWRDb29raWU9X2ZuUmVhZENvb2tpZQorfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgb1NldHRpbmdzPW5ldyBjbGFzc1NldHRpbmdzKCk7X2FvU2V0dGluZ3MucHVzaChvU2V0dGluZ3MpOwordmFyIGJJbml0SGFuZGVkT2ZmPWZhbHNlO3ZhciBiVXNlUGFzc2VkRGF0YT1mYWxzZTt2YXIgc0lkPXRoaXMuZ2V0QXR0cmlidXRlKCJpZCIpOworaWYoc0lkIT09bnVsbCl7b1NldHRpbmdzLnNUYWJsZUlkPXNJZDtvU2V0dGluZ3Muc0luc3RhbmNlPXNJZH1lbHNle29TZXR0aW5ncy5zSW5zdGFuY2U9JC5mbi5kYXRhVGFibGVFeHQuX29FeHRlcm5Db25maWcuaU5leHRVbmlxdWUrKworfW9TZXR0aW5ncy5uVGFibGU9dGhpcztpZih0eXBlb2Ygb0luaXQhPSJ1bmRlZmluZWQiJiZvSW5pdCE9PW51bGwpe2lmKHR5cGVvZiBvSW5pdC5iUGFnaW5hdGUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJQYWdpbmF0ZT1vSW5pdC5iUGFnaW5hdGUKK31pZih0eXBlb2Ygb0luaXQuYkxlbmd0aENoYW5nZSE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5vRmVhdHVyZXMuYkxlbmd0aENoYW5nZT1vSW5pdC5iTGVuZ3RoQ2hhbmdlCit9aWYodHlwZW9mIG9Jbml0LmJGaWx0ZXIhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJGaWx0ZXI9b0luaXQuYkZpbHRlcn1pZih0eXBlb2Ygb0luaXQuYlNvcnQhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTb3J0PW9Jbml0LmJTb3J0Cit9aWYodHlwZW9mIG9Jbml0LmJJbmZvIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLm9GZWF0dXJlcy5iSW5mbz1vSW5pdC5iSW5mb31pZih0eXBlb2Ygb0luaXQuYlByb2Nlc3NpbmchPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJQcm9jZXNzaW5nPW9Jbml0LmJQcm9jZXNzaW5nCit9aWYodHlwZW9mIG9Jbml0LmJBdXRvV2lkdGghPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJBdXRvV2lkdGg9b0luaXQuYkF1dG9XaWR0aAorfWlmKHR5cGVvZiBvSW5pdC5iU29ydENsYXNzZXMhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTb3J0Q2xhc3Nlcz1vSW5pdC5iU29ydENsYXNzZXMKK31pZih0eXBlb2Ygb0luaXQuYWFEYXRhIT0idW5kZWZpbmVkIil7YlVzZVBhc3NlZERhdGE9dHJ1ZX1pZih0eXBlb2Ygb0luaXQuaURpc3BsYXlMZW5ndGghPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuaURpc3BsYXlMZW5ndGg9b0luaXQuaURpc3BsYXlMZW5ndGgKK31pZih0eXBlb2Ygb0luaXQuYXNTdHJpcENsYXNzZXMhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuYXNTdHJpcENsYXNzZXM9b0luaXQuYXNTdHJpcENsYXNzZXMKK31pZih0eXBlb2Ygb0luaXQuZm5Sb3dDYWxsYmFjayE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5mblJvd0NhbGxiYWNrPW9Jbml0LmZuUm93Q2FsbGJhY2sKK31pZih0eXBlb2Ygb0luaXQuZm5IZWFkZXJDYWxsYmFjayE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5mbkhlYWRlckNhbGxiYWNrPW9Jbml0LmZuSGVhZGVyQ2FsbGJhY2sKK31pZih0eXBlb2Ygb0luaXQuZm5Gb290ZXJDYWxsYmFjayE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5mbkZvb3RlckNhbGxiYWNrPW9Jbml0LmZuRm9vdGVyQ2FsbGJhY2sKK31pZih0eXBlb2Ygb0luaXQuZm5EcmF3Q2FsbGJhY2shPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuZm5EcmF3Q2FsbGJhY2s9b0luaXQuZm5EcmF3Q2FsbGJhY2sKK31pZih0eXBlb2Ygb0luaXQuZm5Jbml0Q29tcGxldGUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3MuZm5Jbml0Q29tcGxldGU9b0luaXQuZm5Jbml0Q29tcGxldGUKK31pZih0eXBlb2Ygb0luaXQuYWFTb3J0aW5nIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLmFhU29ydGluZz1vSW5pdC5hYVNvcnRpbmd9aWYodHlwZW9mIG9Jbml0LnNQYWdpbmF0aW9uVHlwZSE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5zUGFnaW5hdGlvblR5cGU9b0luaXQuc1BhZ2luYXRpb25UeXBlCit9aWYodHlwZW9mIG9Jbml0LnNEb20hPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Muc0RvbVBvc2l0aW9uaW5nPW9Jbml0LnNEb219aWYodHlwZW9mIG9Jbml0LnNBamF4U291cmNlIT0idW5kZWZpbmVkIil7b1NldHRpbmdzLnNBamF4U291cmNlPW9Jbml0LnNBamF4U291cmNlCit9aWYodHlwZW9mIG9Jbml0LmlDb29raWVEdXJhdGlvbiE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5pQ29va2llRHVyYXRpb249b0luaXQuaUNvb2tpZUR1cmF0aW9uCit9aWYodHlwZW9mIG9Jbml0LmJTdGF0ZVNhdmUhPSJ1bmRlZmluZWQiKXtvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTdGF0ZVNhdmU9b0luaXQuYlN0YXRlU2F2ZTsKK19mbkxvYWRTdGF0ZShvU2V0dGluZ3MpfWlmKHR5cGVvZiBvSW5pdCE9InVuZGVmaW5lZCImJnR5cGVvZiBvSW5pdC5hb0RhdGEhPSJ1bmRlZmluZWQiKXtvSW5pdC5hb0NvbHVtbnM9b0luaXQuYW9EYXRhCit9aWYodHlwZW9mIG9Jbml0Lm9MYW5ndWFnZSE9InVuZGVmaW5lZCIpe2lmKHR5cGVvZiBvSW5pdC5vTGFuZ3VhZ2Uuc1VybCE9InVuZGVmaW5lZCIpe29TZXR0aW5ncy5vTGFuZ3VhZ2Uuc1VybD1vSW5pdC5vTGFuZ3VhZ2Uuc1VybDsKKyQuZ2V0SlNPTihvU2V0dGluZ3Mub0xhbmd1YWdlLnNVcmwsbnVsbCxmdW5jdGlvbihqc29uKXtfZm5MYW5ndWFnZVByb2Nlc3Mob1NldHRpbmdzLGpzb24sdHJ1ZSkKK30pO2JJbml0SGFuZGVkT2ZmPXRydWV9ZWxzZXtfZm5MYW5ndWFnZVByb2Nlc3Mob1NldHRpbmdzLG9Jbml0Lm9MYW5ndWFnZSxmYWxzZSl9fX1pZih0eXBlb2Ygb0luaXQhPSJ1bmRlZmluZWQiJiZ0eXBlb2Ygb0luaXQuYW9Db2x1bW5zIT0idW5kZWZpbmVkIil7Zm9yKHZhciBpPTA7CitpPG9Jbml0LmFvQ29sdW1ucy5sZW5ndGg7aSsrKXtfZm5BZGRDb2x1bW4ob1NldHRpbmdzLG9Jbml0LmFvQ29sdW1uc1tpXSl9fWVsc2V7JCgidGhlYWQgdGgiLHRoaXMpLmVhY2goZnVuY3Rpb24oKXtfZm5BZGRDb2x1bW4ob1NldHRpbmdzLG51bGwpCit9KX1pZihiVXNlUGFzc2VkRGF0YSl7Zm9yKHZhciBqPTA7ajxvSW5pdC5hYURhdGEubGVuZ3RoO2orKyl7X2ZuQWRkRGF0YShvU2V0dGluZ3Msb0luaXQuYWFEYXRhW2pdKQorfWlmKCQoInRoZWFkIix0aGlzKS5sZW5ndGg9PT0wKXt0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoZWFkIikpCit9aWYoJCgidGJvZHkiLHRoaXMpLmxlbmd0aD09PTApe3RoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSkKK319ZWxzZXtfZm5HYXRoZXJEYXRhKG9TZXR0aW5ncyl9b1NldHRpbmdzLmFpRGlzcGxheT1vU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCk7CitpZihvU2V0dGluZ3Mub0ZlYXR1cmVzLmJBdXRvV2lkdGgpe19mbkNhbGN1bGF0ZUNvbHVtbldpZHRocyhvU2V0dGluZ3MpfW9TZXR0aW5ncy5iSW5pdGlhbGlzZWQ9dHJ1ZTsKK2lmKGJJbml0SGFuZGVkT2ZmPT09ZmFsc2Upe19mbkluaXRhbGlzZShvU2V0dGluZ3MpfX0pfX0pKGpRdWVyeSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL3F1ZXJ5d2lkZ2V0LmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvc3RhdGljL2pzL3F1ZXJ5d2lkZ2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDJiY2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci9zdGF0aWMvanMvcXVlcnl3aWRnZXQuanMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgY3JpdGVyaWFOdW0gPSAwOwordmFyIGFsbENyaXRlcmlhID0gbmV3IEFycmF5KCk7Cit2YXIgY3JpdGVyaWFSb290ID0gMDsKK3ZhciBwQ3VyclBhZ2UgPSAxOwordmFyIHBUb3RhbFBhZ2VzID0gMDsKK3ZhciBwUGFnZVNpemUgPSAwOwordmFyIHBOdW1QYWdlUHJvZHVjdHMgPSAwOwordmFyIHBUb3RhbFByb2R1Y3RzID0gMDsKKworZnVuY3Rpb24gZW5jb2RlUmVxdWVzdERhdGEoa2V5LCB2YWx1ZSl7CisJcmV0dXJuIGVzY2FwZShrZXkpICsgIj0iICsgdmFsdWU7Cit9CisKK2Z1bmN0aW9uIGRpc3BsYXlQYWdlSW5mbygpeworCXBhZ2VJbmZvID0gJzxkaXYgY2xhc3M9InBwX3BhZ2VMaW5rcyI+JzsKKwlpZihwTnVtUGFnZVByb2R1Y3RzID4gMCl7CisJCXByb2RSYW5nZVN0YXJ0ID0gKHBDdXJyUGFnZSAtIDEpICogcFBhZ2VTaXplICsgMTsKKwkJcHJvZFJhbmdlRW5kID0gKHBDdXJyUGFnZSAtIDEpICogcFBhZ2VTaXplICsgcE51bVBhZ2VQcm9kdWN0czsKKwkJcGFnZUluZm8gKz0gJ1BhZ2UgJyArIHBDdXJyUGFnZSArICcgb2YgJyArIHBUb3RhbFBhZ2VzICsgJyZuYnNwOyc7CisJCXBhZ2VJbmZvICs9ICcoUHJvZHVjdHMgJyArIHByb2RSYW5nZVN0YXJ0ICsgJyB0byAnICsgcHJvZFJhbmdlRW5kOworCQlpZihwVG90YWxQcm9kdWN0cyA+IDApeworCQkJcGFnZUluZm8gKz0gJywgb3V0IG9mICcgKyBwVG90YWxQcm9kdWN0czsKKwkJfQorCQlwYWdlSW5mbyArPSAnKSZuYnNwOyZuYnNwOyc7CisJCWlmKHBDdXJyUGFnZSA+IDEpeworCQkJcGFnZUluZm8gKz0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImdldFByZXZQYWdlKCkiPiZsdDsmbHQ7Jm5ic3A7UHJldmlvdXMgUGFnZTwvYT4mbmJzcDsmbmJzcDsnOworCQl9CisJCWlmKHBDdXJyUGFnZSA8IHBUb3RhbFBhZ2VzKXsKKwkJCXBhZ2VJbmZvICs9ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJnZXROZXh0UGFnZSgpIj5OZXh0IFBhZ2UmbmJzcDsmZ3Q7Jmd0OzwvYT4nOworCQl9CisJfWVsc2V7CisJCXBhZ2VJbmZvICs9ICdObyBwcm9kdWN0cyBtZWV0IGdpdmVuIGNyaXRlcmlhLic7CisJfQorCXBhZ2VJbmZvICs9ICc8L2Rpdj4nOworCSQoIiMiICsgaHRtbElEKS5wcmVwZW5kKHBhZ2VJbmZvKTsKK30KKworZnVuY3Rpb24gZm9ybWF0Q3JpdGVyaWEoaW5kZXgpeworCWlmKGFsbENyaXRlcmlhW2luZGV4XS50eXBlID09ICd0ZXJtJyl7CisJCXJlcXVlc3REYXRhID0gZW5jb2RlUmVxdWVzdERhdGEoIkNyaXRlcmlhWyIgKyBpbmRleCArICJdW0NyaXRlcmlhVHlwZV0iLCAiVGVybSIpOworCQlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bRWxlbWVudE5hbWVdIiwgYWxsQ3JpdGVyaWFbaW5kZXhdLmVsZW1lbnQpOworCQlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bVmFsdWVdIiwgYWxsQ3JpdGVyaWFbaW5kZXhdLnZhbHVlKTsKKwl9ZWxzZSBpZihhbGxDcml0ZXJpYVtpbmRleF0udHlwZSA9PSAncmFuZ2UnKXsKKwkJcmVxdWVzdERhdGEgPSBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bQ3JpdGVyaWFUeXBlXSIsICJSYW5nZSIpOworCQlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bRWxlbWVudE5hbWVdIiwgYWxsQ3JpdGVyaWFbaW5kZXhdLmVsZW1lbnQpOworCQlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bTWluXSIsIGFsbENyaXRlcmlhW2luZGV4XS5taW4pOworCQlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bTWF4XSIsIGFsbENyaXRlcmlhW2luZGV4XS5tYXgpOworCX1lbHNlIGlmKGFsbENyaXRlcmlhW2luZGV4XS50eXBlID09ICdib29sZWFuJyl7CisJCXJlcXVlc3REYXRhID0gZW5jb2RlUmVxdWVzdERhdGEoIkNyaXRlcmlhWyIgKyBpbmRleCArICJdW0NyaXRlcmlhVHlwZV0iLCAiQm9vbGVhbiIpOworCQlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiQ3JpdGVyaWFbIiArIGluZGV4ICsgIl1bT3BlcmF0b3JdIiwgYWxsQ3JpdGVyaWFbaW5kZXhdLm9wZXJhdG9yKTsKKwkJZm9yKGkgPSAwOyBpIDwgYWxsQ3JpdGVyaWFbaW5kZXhdLmNyaXRlcmlhLmxlbmd0aDsgaSsrKXsKKwkJCXJlcXVlc3REYXRhICs9ICcmJyArIGVuY29kZVJlcXVlc3REYXRhKCJDcml0ZXJpYVsiICsgaW5kZXggKyAiXVtDcml0ZXJpYVRlcm1zXVsiICsgaSArICJdIiwgYWxsQ3JpdGVyaWFbaW5kZXhdLmNyaXRlcmlhW2ldKTsKKwkJfQorCQlmb3IoaSA9IDA7IGkgPCBhbGxDcml0ZXJpYVtpbmRleF0uY3JpdGVyaWEubGVuZ3RoOyBpKyspeworCQkJcmVxdWVzdERhdGEgKz0gICcmJyArIGZvcm1hdENyaXRlcmlhKGFsbENyaXRlcmlhW2luZGV4XS5jcml0ZXJpYVtpXSk7CisJCX0KKwl9CisJcmV0dXJuIHJlcXVlc3REYXRhOworfQorCitmdW5jdGlvbiBmb3JtYXRRdWVyeVJlcXVlc3QoZXhwZWN0ZWRUeXBlKXsKKwlzaG93TG9hZGluZ0ljb24oKTsKKwlyZXF1ZXN0RGF0YSA9IGVuY29kZVJlcXVlc3REYXRhKCJUeXBlc1swXSIsIHB0TmFtZSk7CisJcmVxdWVzdERhdGEgKz0gJyYnICsgZW5jb2RlUmVxdWVzdERhdGEoIlBhZ2VkUmVzdWx0cyIsICIxIik7CisJcmVxdWVzdERhdGEgKz0gJyYnICsgZW5jb2RlUmVxdWVzdERhdGEoIlBhZ2VOdW0iLCBwQ3VyclBhZ2UpOworCXJlcXVlc3REYXRhICs9ICcmJyArIGVuY29kZVJlcXVlc3REYXRhKCJSb290SW5kZXgiLCBjcml0ZXJpYVJvb3QpOworCXJlcXVlc3REYXRhICs9ICcmJyArIGVuY29kZVJlcXVlc3REYXRhKCJPdXRwdXRGb3JtYXQiLCBleHBlY3RlZFR5cGUpOworCXJlcXVlc3REYXRhICs9ICcmJyArIGZvcm1hdENyaXRlcmlhKGNyaXRlcmlhUm9vdCk7CisJZGlzcGxheVBlcm1hbGluaygpOworCSQucG9zdChzaXRlVXJsICsgIi9xdWVyeVNjcmlwdC5kbyIsCisJCXJlcXVlc3REYXRhLAorCQlmdW5jdGlvbihkYXRhKXsKKwkJCWhpZGVMb2FkaW5nSWNvbigpOworCQkJaWYoZXhwZWN0ZWRUeXBlID09ICJodG1sIil7CisJCQkJJCgiIyIgKyBodG1sSUQpLmh0bWwoZGF0YSk7CisJCQkJY3VyclBhZ2UgPSBwYXJzZUludCgkKCIjcGFnZV9udW0iKS52YWwoKSk7CisJCQkJdG90YWxQYWdlcyA9IHBhcnNlSW50KCQoIiN0b3RhbF9wYWdlcyIpLnZhbCgpKTsKKwkJCQlwYWdlU2l6ZSA9IHBhcnNlSW50KCQoIiNwYWdlX3NpemUiKS52YWwoKSk7CisJCQkJbnVtUGFnZVByb2R1Y3RzID0gJCgiI3Byb2R1Y3RfbGlzdCA+IGxpIikubGVuZ3RoOworCQkJCXRvdGFsVHlwZVByb2R1Y3RzID0gJCgiI3RvdGFsX3R5cGVfcHJvZHVjdHMiKS52YWwoKTsKKwkJCX1lbHNlIGlmKGV4cGVjdGVkVHlwZSA9PSAianNvbiIpeworCQkJCWlmKHBhcnNlSW50KGRhdGFbJ0Vycm9yJ10pID09IDEpeworCQkJCQkkKCIjIiArIGh0bWxJRCkuaHRtbCgnPGRpdiBjbGFzcz0iZXJyb3IiPicgKyBkYXRhWydFcnJvck1zZyddICsgJzwvZGl2PicpOworCQkJCQlwQ3VyclBhZ2UgPSAwOworCQkJCQlwVG90YWxQYWdlcyA9IDA7CisJCQkJCXBQYWdlU2l6ZSA9IDA7CisJCQkJCXBOdW1QYWdlUHJvZHVjdHMgPSAwOworCQkJCQlwVG90YWxQcm9kdWN0cyA9IDA7CisJCQkJfWVsc2V7CisJCQkJCXJlbmRlckpzb25PdXRwdXQoZGF0YSk7CisJCQkJCXBUb3RhbFBhZ2VzID0gZGF0YVsndG90YWxQYWdlcyddOworCQkJCQlwUGFnZVNpemUgPSBkYXRhWydwYWdlU2l6ZSddOworCQkJCQlwTnVtUGFnZVByb2R1Y3RzID0gZGF0YVsncmVzdWx0cyddLmxlbmd0aDsKKwkJCQkJcFRvdGFsUHJvZHVjdHMgPSBkYXRhWyd0b3RhbFByb2R1Y3RzJ107CisJCQkJfQorCQkJfQorCQkJZGlzcGxheVBhZ2VJbmZvKCk7CisJCX0sCisJCWV4cGVjdGVkVHlwZSk7Cit9CisKK2Z1bmN0aW9uIGZvcm1hdENyb3NzVHlwZVF1ZXJ5UmVxdWVzdCgpeworCXNob3dMb2FkaW5nSWNvbigpOworCXJlcXVlc3REYXRhID0gZW5jb2RlUmVxdWVzdERhdGEoIlR5cGVzWzBdIiwgIioiKTsKKwlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiUm9vdEluZGV4IiwgY3JpdGVyaWFSb290KTsKKwlyZXF1ZXN0RGF0YSArPSAnJicgKyBmb3JtYXRDcml0ZXJpYShjcml0ZXJpYVJvb3QpOworCXJlcXVlc3REYXRhICs9ICcmJyArIGVuY29kZVJlcXVlc3REYXRhKCJQYWdlTnVtIiwgcEN1cnJQYWdlKTsKKwlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiUGFnZVNpemUiLCBwUGFnZVNpemUpOworCWRpc3BsYXlQZXJtYWxpbmsoKTsKKwkkLnBvc3Qoc2l0ZVVybCArICIvY3Jvc3NUeXBlUXVlcnlTY3JpcHQuZG8iLAorCQlyZXF1ZXN0RGF0YSwKKwkJZnVuY3Rpb24oZGF0YSl7CisJCWhpZGVMb2FkaW5nSWNvbigpOworCQkJaWYocGFyc2VJbnQoZGF0YVsnRXJyb3InXSkgPT0gMSl7CisJCQkJJCgiIyIgKyBodG1sSUQpLmh0bWwoJzxkaXYgY2xhc3M9ImVycm9yIj4nICsgZGF0YVsnRXJyb3JNc2cnXSArICc8L2Rpdj4nKTsKKwkJCX1lbHNleworCQkJCXJlbmRlckpzb25PdXRwdXQoZGF0YSk7CisJCQkJcFRvdGFsUGFnZXMgPSBkYXRhWyd0b3RhbFBhZ2VzJ107CisJCQkJcFRvdGFsUHJvZHVjdHMgPSBkYXRhWyd0b3RhbFByb2R1Y3RzJ107CisJCQkJcE51bVBhZ2VQcm9kdWN0cyA9IGRhdGFbJ3Jlc3VsdHMnXS5sZW5ndGg7CisJCQkJZGlzcGxheVBhZ2VJbmZvKCk7CisJCQl9CisJCX0sCisJCSJqc29uIik7Cit9CisKK2Z1bmN0aW9uIGZvcm1hdEFsbFR5cGVSZXF1ZXN0KCl7CisJc2hvd0xvYWRpbmdJY29uKCk7CisJcmVxdWVzdERhdGEgPSBlbmNvZGVSZXF1ZXN0RGF0YSgiUGFnZU51bSIsIHBDdXJyUGFnZSk7CisJcmVxdWVzdERhdGEgKz0gJyYnICsgZW5jb2RlUmVxdWVzdERhdGEoIlBhZ2VTaXplIiwgcFBhZ2VTaXplKTsKKwkkLnBvc3Qoc2l0ZVVybCArICIvYWxsVHlwZVNjcmlwdC5kbyIsCisJCXJlcXVlc3REYXRhLAorCQlmdW5jdGlvbihkYXRhKXsKKwkJCWhpZGVMb2FkaW5nSWNvbigpOworCQkJaWYocGFyc2VJbnQoZGF0YVsnRXJyb3InXSkgPT0gMSl7CisJCQkJJCgiIyIgKyBodG1sSUQpLmh0bWwoJzxkaXYgY2xhc3M9ImVycm9yIj4nICsgZGF0YVsnRXJyb3JNc2cnXSArICc8L2Rpdj4nKTsKKwkJCX1lbHNleworCQkJCXJlbmRlckpzb25PdXRwdXQoZGF0YSk7CisJCQkJcFRvdGFsUGFnZXMgPSBkYXRhWyd0b3RhbFBhZ2VzJ107CisJCQkJcFRvdGFsUHJvZHVjdHMgPSBkYXRhWyd0b3RhbFByb2R1Y3RzJ107CisJCQkJcE51bVBhZ2VQcm9kdWN0cyA9IGRhdGFbJ3Jlc3VsdHMnXS5sZW5ndGg7CisJCQkJZGlzcGxheVBhZ2VJbmZvKCk7CisJCQl9CisJCX0sCisJCSJqc29uIik7Cit9CisKK2Z1bmN0aW9uIGZvcm1hdFByb2R1Y3RQYWdlUmVxdWVzdChleHBlY3RlZFR5cGUpeworCXNob3dMb2FkaW5nSWNvbigpOworCXJlcXVlc3REYXRhID0gZW5jb2RlUmVxdWVzdERhdGEoIlR5cGUiLCBwdE5hbWUpOworCXJlcXVlc3REYXRhICs9ICcmJyArIGVuY29kZVJlcXVlc3REYXRhKCJQYWdlTnVtIiwgcEN1cnJQYWdlKTsKKwlyZXF1ZXN0RGF0YSArPSAnJicgKyBlbmNvZGVSZXF1ZXN0RGF0YSgiT3V0cHV0Rm9ybWF0IiwgZXhwZWN0ZWRUeXBlKTsKKwkkLnBvc3Qoc2l0ZVVybCArICIvcGFnZVNjcmlwdC5kbyIsIAorCQlyZXF1ZXN0RGF0YSwgCisJCWZ1bmN0aW9uKGRhdGEpeworCQkJaGlkZUxvYWRpbmdJY29uKCk7CisJCQlpZihleHBlY3RlZFR5cGUgPT0gImh0bWwiKXsKKwkJCQkkKCIjIiArIGh0bWxJRCkuaHRtbChkYXRhKTsKKwkJCQljdXJyUGFnZSA9IHBhcnNlSW50KCQoIiNwYWdlX251bSIpLnZhbCgpKTsKKwkJCQl0b3RhbFBhZ2VzID0gcGFyc2VJbnQoJCgiI3RvdGFsX3BhZ2VzIikudmFsKCkpOworCQkJCXBhZ2VTaXplID0gcGFyc2VJbnQoJCgiI3BhZ2Vfc2l6ZSIpLnZhbCgpKTsKKwkJCQludW1QYWdlUHJvZHVjdHMgPSAkKCIjcHJvZHVjdF9saXN0ID4gbGkiKS5sZW5ndGg7CisJCQkJdG90YWxUeXBlUHJvZHVjdHMgPSAwOworCQkJfWVsc2UgaWYoZXhwZWN0ZWRUeXBlID09ICJqc29uIil7CisJCQkJaWYocGFyc2VJbnQoZGF0YVsnRXJyb3InXSkgPT0gMSl7CisJCQkJCSQoIiMiICsgaHRtbElEKS5odG1sKCc8ZGl2IGNsYXNzPSJlcnJvciI+JyArIGRhdGFbJ0Vycm9yTXNnJ10gKyAnPC9kaXY+Jyk7CisJCQkJCXBDdXJyUGFnZSA9IDA7CisJCQkJCXBUb3RhbFBhZ2VzID0gMDsKKwkJCQkJcFBhZ2VTaXplID0gMDsKKwkJCQkJcE51bVBhZ2VQcm9kdWN0cyA9IDA7CisJCQkJCXBUb3RhbFByb2R1Y3RzID0gMDsKKwkJCQl9ZWxzZXsKKwkJCQkJcmVuZGVySnNvbk91dHB1dChkYXRhKTsKKwkJCQkJcFRvdGFsUGFnZXMgPSBkYXRhWyd0b3RhbFBhZ2VzJ107CisJCQkJCXBQYWdlU2l6ZSA9IGRhdGFbJ3BhZ2VTaXplJ107CisJCQkJCXBOdW1QYWdlUHJvZHVjdHMgPSBkYXRhWydyZXN1bHRzJ10ubGVuZ3RoOworCQkJCQlwVG90YWxQcm9kdWN0cyA9IGRhdGFbJ3RvdGFsUHJvZHVjdHMnXTsKKwkJCQl9CisJCQl9CisJCQlkaXNwbGF5UGFnZUluZm8oKTsKKwkJfSwKKwkJZXhwZWN0ZWRUeXBlKTsKK30KKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmVxdWVzdCBhIHBhZ2Ugb3IgcXVlcnksIGRlcGVuZGluZyB1cG9uIHRoZSBwcmVzZW5jZQorLy8gb2YgYW55IG5vbi1ib29sZWFuIGNyaXRlcmlhLiAgUmV0dXJucyAwIGZvciBhIHBhZ2UgYW5kIDEgZm9yIGEgcXVlcnkuCitmdW5jdGlvbiBkZXRlcm1pbmVSZXF1ZXN0KGluZGV4KXsKKwlpZihhbGxDcml0ZXJpYVtpbmRleF0gPT0gbnVsbCl7CisJCXJldHVybiAwOworCX0KKwlpZihhbGxDcml0ZXJpYVtpbmRleF0udHlwZSAhPSAnYm9vbGVhbicpeworCQlyZXR1cm4gMTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgYWxsQ3JpdGVyaWFbaW5kZXhdLmNyaXRlcmlhLmxlbmd0aDsgaSsrKXsKKwkJaWYoZGV0ZXJtaW5lUmVxdWVzdChhbGxDcml0ZXJpYVtpbmRleF0uY3JpdGVyaWFbaV0pKXsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitmdW5jdGlvbiBzZW5kUmVxdWVzdChleHBlY3RlZFR5cGUpeworCWlmKGRldGVybWluZVJlcXVlc3QoY3JpdGVyaWFSb290KSl7CisJCWZvcm1hdFF1ZXJ5UmVxdWVzdChleHBlY3RlZFR5cGUpOworCX1lbHNleworCQlmb3JtYXRQcm9kdWN0UGFnZVJlcXVlc3QoZXhwZWN0ZWRUeXBlKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHNlbmRDcm9zc1R5cGVSZXF1ZXN0KCl7CisJaWYoZGV0ZXJtaW5lUmVxdWVzdChjcml0ZXJpYVJvb3QpKXsKKwkJZm9ybWF0Q3Jvc3NUeXBlUXVlcnlSZXF1ZXN0KCk7CisJfWVsc2V7CisJCWlmKHBhcnNlSW50KGRlZmF1bHRTaG93RXZlcnl0aGluZykgPT0gMSl7CisJCQlmb3JtYXRBbGxUeXBlUmVxdWVzdCgpOworCQl9ZWxzZXsKKwkJCWNsZWFyUmVzdWx0cygpOworCQl9CisJfQorfQorCitmdW5jdGlvbiBhZGRDcml0ZXJpYSgpeworCWluZGV4ID0gY3JpdGVyaWFOdW07CisJY3JpdGVyaWFOdW0rKzsKKwlhbGxDcml0ZXJpYVtpbmRleF0gPSBuZXcgT2JqZWN0KCk7CisJcmV0dXJuIGluZGV4OworfQorCitmdW5jdGlvbiBhZGRUZXJtQ3JpdGVyaWEoZWxlbWVudE5hbWUsIHZhbHVlLCBwYXJlbnRJbmRleCl7CisJaW5kZXggPSBhZGRDcml0ZXJpYSgpOworCWFsbENyaXRlcmlhW2luZGV4XS50eXBlID0gJ3Rlcm0nOworCWFsbENyaXRlcmlhW2luZGV4XS5wYXJlbnRJbmRleCA9IHBhcmVudEluZGV4OworCWFsbENyaXRlcmlhW2luZGV4XS5lbGVtZW50ID0gZWxlbWVudE5hbWU7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLnZhbHVlID0gdmFsdWU7CisJaWYocGFyZW50SW5kZXggIT0gbnVsbCl7CisJCWFsbENyaXRlcmlhW3BhcmVudEluZGV4XS5jcml0ZXJpYS5wdXNoKGluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorCitmdW5jdGlvbiBhZGRSYW5nZUNyaXRlcmlhKGVsZW1lbnROYW1lLCBtaW4sIG1heCwgcGFyZW50SW5kZXgpeworCWluZGV4ID0gYWRkQ3JpdGVyaWEoKTsKKwlhbGxDcml0ZXJpYVtpbmRleF0udHlwZSA9ICdyYW5nZSc7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLnBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLmVsZW1lbnQgPSBlbGVtZW50TmFtZTsKKwlhbGxDcml0ZXJpYVtpbmRleF0ubWluID0gbWluOworCWFsbENyaXRlcmlhW2luZGV4XS5tYXggPSBtYXg7CisJaWYocGFyZW50SW5kZXggIT0gbnVsbCl7CisJCWFsbENyaXRlcmlhW3BhcmVudEluZGV4XS5jcml0ZXJpYS5wdXNoKGluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorCitmdW5jdGlvbiBhZGRCb29sZWFuQ3JpdGVyaWEob3BlcmF0b3IsIHBhcmVudEluZGV4KXsKKwlpbmRleCA9IGFkZENyaXRlcmlhKCk7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLnR5cGUgPSAnYm9vbGVhbic7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLnBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLm9wZXJhdG9yID0gb3BlcmF0b3I7CisJYWxsQ3JpdGVyaWFbaW5kZXhdLmNyaXRlcmlhID0gbmV3IEFycmF5KCk7CisJaWYocGFyZW50SW5kZXggIT0gbnVsbCl7CisJCWFsbENyaXRlcmlhW3BhcmVudEluZGV4XS5jcml0ZXJpYS5wdXNoKGFsbENyaXRlcmlhW2luZGV4XSk7CisJfQorCXJldHVybiBpbmRleDsKK30KKworZnVuY3Rpb24gcmVtb3ZlQ3JpdGVyaWEoaW5kZXgpeworCWlmKGFsbENyaXRlcmlhW2luZGV4XS5wYXJlbnRJbmRleCAhPSBudWxsKXsKKwkJcGFyZW50Q3JpdGVyaWEgPSBhbGxDcml0ZXJpYVthbGxDcml0ZXJpYVtpbmRleF0ucGFyZW50SW5kZXhdOworCQlmb3IoaSA9IDA7IGkgPCBwYXJlbnRDcml0ZXJpYS5jcml0ZXJpYS5sZW5ndGg7IGkrKyl7CisJCQlpZihwYXJlbnRDcml0ZXJpYS5jcml0ZXJpYVtpXSA9PSBpbmRleCl7CisJCQkJcGFyZW50Q3JpdGVyaWEuY3JpdGVyaWEuc3BsaWNlKGksIDEpOworCQkJCWkgPSBwYXJlbnRDcml0ZXJpYS5jcml0ZXJpYS5sZW5ndGg7CisJCQl9CisJCX0KKwl9CisJYWxsQ3JpdGVyaWFbaW5kZXhdID0gbnVsbDsKK30KKworZnVuY3Rpb24gc2hvd0xvYWRpbmdJY29uKCl7CisJJCgiIyIgKyBodG1sSUQpLmNzcygiZGlzcGxheSIsICJub25lIik7CisJJCgiIyIgKyBsb2FkaW5nSUQpLmNzcygiZGlzcGxheSIsICJibG9jayIpOworfQorCitmdW5jdGlvbiBoaWRlTG9hZGluZ0ljb24oKXsKKwkkKCIjIiArIGh0bWxJRCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7CisJJCgiIyIgKyBsb2FkaW5nSUQpLmNzcygiZGlzcGxheSIsICJub25lIik7Cit9CisKK2Z1bmN0aW9uIHNldEV4Y2x1c2l2ZVF1ZXJ5KGV4Y2x1c2l2ZSl7CisJaWYoYWxsQ3JpdGVyaWFbY3JpdGVyaWFSb290XSl7CisJCWlmKGV4Y2x1c2l2ZSA9PSB0cnVlKXsKKwkJCWFsbENyaXRlcmlhW2NyaXRlcmlhUm9vdF0ub3BlcmF0b3IgPSAnYW5kJzsKKwkJfWVsc2V7CisJCQlhbGxDcml0ZXJpYVtjcml0ZXJpYVJvb3RdLm9wZXJhdG9yID0gJ29yJzsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL2RhdGFzZXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvdmlld3MvZGF0YXNldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyOTY2ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL2RhdGFzZXQucGhwCkBAIC0wLDAgKzEsMTAwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIExvYWQgdGhlIG1vZHVsZSBjb250ZXh0IGZvciB0aGlzIG1vZHVsZQorJG1vZHVsZSAgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisKK3JlcXVpcmVfb25jZSgkbW9kdWxlLT5tb2R1bGVQYXRoIC4gIi9jbGFzc2VzL0Nhc0Jyb3dzZXIuY2xhc3MucGhwIik7CityZXF1aXJlX29uY2UoJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvc2NyaXB0cy93aWRnZXRzL01ldGFkYXRhRGlzcGxheVdpZGdldC5waHAiKTsKKworLy8gR2V0IGEgQ0FTLUJyb3dzZXIgWE1ML1JQQyBjbGllbnQKKyRicm93c2VyICA9IG5ldyBDYXNCcm93c2VyKCk7CiskY2xpZW50ICAgPSAkYnJvd3Nlci0+Z2V0Q2xpZW50KCk7CisKKy8vIEdldCBhICBQcm9kdWN0IFR5cGUgb2JqZWN0CiskcHJvZHVjdFR5cGUgPSAkY2xpZW50LT5nZXRQcm9kdWN0VHlwZUJ5SWQoQXBwOjpHZXQoKS0+cmVxdWVzdC0+c2VnbWVudHNbMF0pOworJHB0SUQgPSAkcHJvZHVjdFR5cGUtPmdldElkKCk7CiskcHROYW1lID0gJHByb2R1Y3RUeXBlLT5nZXROYW1lKCk7CisKKy8vIERldGVybWluZSB0aGUgdmlzaWJpbGl0eSBsZXZlbCBiYXNlZCBvbiB0aGUgY3VycmVudCB1c2VyCiskcHRWaXNpYmlsaXR5TGV2ZWwgPSAkYnJvd3Nlci0+Z2V0UHJvZHVjdFR5cGVWaXNpYmlsaXR5TGV2ZWwoJHB0SUQpOworCisvLyBSZWRpcmVjdCB0aGUgdXNlciBpZiB0aGV5IGFyZSBub3QgYXV0aG9yaXplZAoraWYgKCRwdFZpc2liaWxpdHlMZXZlbCA9PSBDYXNCcm93c2VyOjpWSVNfTk9ORSkgeworCUFwcDo6R2V0KCktPnJlZGlyZWN0KFNJVEVfUk9PVCAuICcvZXJyb3JzLzQwMycpOworfQorCisvLyBMb2FkIGEgTWV0YWRhdGFEaXNwbGF5V2lkZ2V0IHdpdGggdGhlIHZpc2libGUgbWV0YWRhdGEgZm9yIHRoaXMgcHJvZHVjdCB0eXBlCiskdHlwZU1ldGFkYXRhV2lkZ2V0ID0gbmV3IE1ldGFkYXRhRGlzcGxheVdpZGdldChhcnJheSgpKTsKKyR0eXBlTWV0YWRhdGFXaWRnZXQtPmxvYWRNZXRhZGF0YSgkYnJvd3Nlci0+Z2V0VmlzaWJsZU1ldGFkYXRhRm9yUHJvZHVjdFR5cGUoJHB0SUQpKTsKKworLy8gQ3JlYXRlIGEgTWV0YWRhdGFEaXNwbGF5V2lkZ2V0IHRvIGRpc3BsYXkgc3lzdGVtIG1ldGFkYXRhIChhbGwgZXhjZXB0IHR5cGVNZXRhZGF0YSkKKyR0eXBlTWV0YWRhdGEgPSAkcHJvZHVjdFR5cGUtPnRvQXNzb2NBcnJheSgpOwordW5zZXQoJHR5cGVNZXRhZGF0YVsndHlwZU1ldGFkYXRhJ10pOworJHN5c3RlbU1ldGFkYXRhV2lkZ2V0ID0gbmV3IE1ldGFkYXRhRGlzcGxheVdpZGdldChhcnJheSgpKTsKKyRzeXN0ZW1NZXRhZGF0YVdpZGdldC0+bG9hZE1ldGFkYXRhKCR0eXBlTWV0YWRhdGEpOworCisKKy8vIFByZXBhcmUgQnJlYWRjcnVtYldpZ2RldAorJGJjdyA9IG5ldyBCcmVhZGNydW1ic1dpZGdldCgpOworJGJjdy0+YWRkKCdIb21lJyxTSVRFX1JPT1QgLiAnLycpOworJGJjdy0+YWRkKCJCcm93c2UgQnkgVHlwZSIsICRtb2R1bGUtPm1vZHVsZVJvb3QgLiAnLycpOworJGJjdy0+YWRkKCRwdE5hbWUpOworPz4KKworCis8ZGl2IGNsYXNzPSJjb250YWluZXIiPgorCTxociBjbGFzcz0ic3BhY2UiIC8+CisKKwk8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9jb250YWluZXIiPgorCQk8aDI+PD9waHAgZWNobyAkc29ydGVkTWV0YWRhdGFbJ0RhdGFTZXROYW1lJ11bMF0/PiA8P3BocCBlY2hvICRwdE5hbWU/PjwvaDI+CisJCTxociAvPgorCisJCTxkaXYgaWQ9InNlY3Rpb25fdHlwZV9tZXRhZGF0YSI+CisJCQk8aDM+RGVzY3JpcHRpb246PC9oMz4KKwkJCTxwPjw/cGhwIGVjaG8gJHByb2R1Y3RUeXBlLT5nZXREZXNjcmlwdGlvbigpPz48L3A+CisJCQk8aHIgY2xhc3M9InNwYWNlIiAvPgorCisJCQk8dWwgY2xhc3M9InRhYm1lbnUiPgorCQkJCTxsaSBjbGFzcz0ic2VsZWN0ZWQiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L2RhdGFzZXQvPD9waHAgZWNobyAkcHRJRD8+Ij5BZGRpdGlvbmFsIEluZm9ybWF0aW9uPC9hPjwvbGk+CisJCQkJPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L3Byb2R1Y3RzLzw/cGhwIGVjaG8gJHB0SUQ/PiI+RG93bmxvYWRhYmxlIEZpbGVzPC9hPjwvbGk+CisJCQk8L3VsPgorCisJCQk8ZGl2IGlkPSJhZGRpdGlvbmFsLWluZm9ybWF0aW9uIj4KKwkJCQk8cD5UaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbWV0YWRhdGEgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhpcworCQkJCWRhdGFzZXQuPC9wPgorCisJCQkJPD9waHAgaWYgKCRwdFZpc2liaWxpdHlMZXZlbCA9PSBDYXNCcm93c2VyOjpWSVNfTElNSVQpOj8+CisJCQkJPGRpdiBjbGFzcz0ibm90aWNlIj5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG1heSBleGlzdCB0aGF0IGlzIG5vdCB2aXNpYmxlCisJCQkJZHVlIHRvIHlvdXIgY3VycmVudCBhY2Nlc3MgcGVybWlzc2lvbnMuPC9kaXY+CisJCQkJPD9waHAgZW5kaWY7Pz4KKworCQkJCTw/cGhwIGVjaG8gJHR5cGVNZXRhZGF0YVdpZGdldC0+cmVuZGVyKCk/PgorCQkJPC9kaXY+CisJCQkJCisJCQk8ZGl2IGlkPSJkYXRhIj48L2Rpdj4KKwkJPC9kaXY+CisKKwkJPD9waHAgaWYgKCFBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9zdXBwcmVzc19zeXN0ZW1fbWV0YWRhdGEnXSk6Pz4KKwkJPGRpdiBpZD0ic2VjdGlvbl9zeXN0ZW1fbWV0YWRhdGEiPgorCQkJPGgzPlN5c3RlbSBNZXRhZGF0YTo8L2gzPgorCQkJPD9waHAgZWNobyAkc3lzdGVtTWV0YWRhdGFXaWRnZXQtPnJlbmRlcigpPz4KKwkJPC9kaXY+CisJCTw/cGhwIGVuZGlmOz8+CisJPC9kaXY+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci92aWV3cy9pbmRleC5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci92aWV3cy9pbmRleC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjZGYzMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL2luZGV4LnBocApAQCAtMCwwICsxLDg3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CityZXF1aXJlX29uY2UoICRtb2R1bGUtPm1vZHVsZVBhdGggLiAiL2NsYXNzZXMvQ2FzQnJvd3Nlci5jbGFzcy5waHAiKTsKK3JlcXVpcmVfb25jZSggJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvc2NyaXB0cy93aWRnZXRzL1Byb2R1Y3RUeXBlTGlzdFdpZGdldC5waHAiKTsKKworLy8gR2V0IGEgQ0FTLUJyb3dzZXIgWE1ML1JQQyBjbGllbnQKKyRicm93c2VyID0gbmV3IENhc0Jyb3dzZXIoKTsKKyRjbGllbnQgID0gJGJyb3dzZXItPmdldENsaWVudCgpOworJGlzQWxpdmUgPSAkY2xpZW50LT5pc0FsaXZlKCk7CitpZiAoICEkaXNBbGl2ZSApIHsKKwlBcHA6OkdldCgpLT5TZXRNZXNzYWdlKCJGaWxlbWdyIGF0ICIuICRjbGllbnQtPnNlcnZlclVSTC4gIiBpcyBkb3duLiBQbGVhc2Ugc3RhcnQgaXQuPGJyPiIsQ0FTX01TR19FUlJPUik7Cit9IGVsc2V7CisJCisvLyBHZXQgYSBsaXN0IG9mIHRoZSBwcm9kdWN0IHR5cGVzIG1hbmFnZWQgYnkgdGhpcyBzZXJ2ZXIKKyRyZXNwb25zZSAgICAgPSAkY2xpZW50LT5nZXRQcm9kdWN0VHlwZXMoKTsKKyRwcm9kdWN0VHlwZXMgPSBhcnJheSgpOworCitmb3JlYWNoICgkcmVzcG9uc2UgYXMgJHB0KSB7CisJJHB0QXJyYXkgPSAkcHQtPnRvQXNzb2NBcnJheSgpOworCQorCSRwdFZpc2liaWxpdHkgPSAkYnJvd3Nlci0+Z2V0UHJvZHVjdFR5cGVWaXNpYmlsaXR5TGV2ZWwoJHB0LT5nZXRJZCgpKTsKKwkKKwlpZiAoJHB0VmlzaWJpbGl0eSA9PSBDYXNCcm93c2VyOjpWSVNfTk9ORSkgeyBjb250aW51ZTsgfQorCisJJG1lcmdlZCA9IGFycmF5KAorCQkibmFtZSIgPT4gYXJyYXkoCisJCQkkcHRBcnJheVtBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wdF9uYW1lX2tleSddXSwKKwkJCSRjbGllbnQtPmdldE51bVByb2R1Y3RzKCRwdCkpLAorCQkiZGVzY3JpcHRpb24iID0+IGFycmF5KCRwdEFycmF5W0FwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3B0X2Rlc2Nfa2V5J11dKSwKKwkJImlkIiA9PiBhcnJheSgkcHRBcnJheVtBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wdF9pZF9rZXknXV0pKTsKKwkkbWVyZ2VkICs9ICRwdEFycmF5Wyd0eXBlTWV0YWRhdGEnXTsKKwkKKwkkcHJvZHVjdFR5cGVzWyRwdEFycmF5W0FwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3B0X2lkX2tleSddXV0gPSAkbWVyZ2VkOworfQorJHByb2R1Y3RUeXBlTGlzdFdpZGdldCA9IG5ldyBQcm9kdWN0VHlwZUxpc3RXaWRnZXQoYXJyYXkoInByb2R1Y3RUeXBlcyIgPT4gJHByb2R1Y3RUeXBlcykpOworJHByb2R1Y3RUeXBlTGlzdFdpZGdldC0+c2V0VXJsQmFzZSgkbW9kdWxlLT5tb2R1bGVSb290KTsKK30KKworLy8gUHJlcGFyZSBCcmVhZGNydW1iV2lnZGV0CiskYmN3ID0gbmV3IEJyZWFkY3J1bWJzV2lkZ2V0KCk7CiskYmN3LT5hZGQoJ0hvbWUnLFNJVEVfUk9PVCAuICcvJyk7CiskYmN3LT5hZGQoIkJyb3dzZSBCeSBUeXBlIik7Cis/PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVN0YXRpYz8+L2pzL2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKwkvLyBUdXJuIHRoZSB0YWJsZSBpbnRvIGEgc29ydGFibGUsIHNlYXJjaGFibGUgdGFibGUKKwkkKCIjcHJvZHVjdFR5cGVTZWFyY2giKS5kYXRhVGFibGUoKTsKKwkvLyBHaXZlIHRoZSBzZWFyY2ggYm94IHRoZSBpbml0aWFsIGZvY3VzCisJJCgiI3Byb2R1Y3RUeXBlU2VhcmNoX2ZpbHRlciA+IGlucHV0IikuZm9jdXMoKTsKK30pOyAKKzwvc2NyaXB0PgorCis8ZGl2IGNsYXNzPSJjb250YWluZXIiPgorCis8P3BocCBpZiAoICRpc0FsaXZlICkgOj8+Cis8aHIgY2xhc3M9InNwYWNlIi8+Cis8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9jb250YWluZXIiIGNsYXNzPSJzcGFuLTIyIGxhc3QgcHJlcGVuZC0xIGFwcGVuZC0xIj4KKwk8aDIgaWQ9ImNhc19icm93c2VyX3RpdGxlIj48P3BocCBlY2hvIEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX2luZGV4X3RpdGxlX3RleHQnXT8+PC9oMj4KKwk8dWwgY2xhc3M9InRhYm1lbnUiPgorCQk8bGkgY2xhc3M9InNlbGVjdGVkIj48YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi8iPkJyb3dzZSBCeSBUeXBlPC9hPjwvbGk+CisJCTxsaSBjbGFzcz0iIj48YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi90eXBlc2VhcmNoLyI+QnJvd3NlIEFjcm9zcyBUeXBlczwvYT48L2xpPgorCTwvdWw+CisJPGJyIGNsYXNzPSJmaWZ0eVB4Ii8+Cis8P3BocCAkcHJvZHVjdFR5cGVMaXN0V2lkZ2V0LT5yZW5kZXIoKTs/PgorPC9kaXY+Cis8aHIgY2xhc3M9InNwYWNlIi8+Cis8L2Rpdj4KKzw/cGhwIGVuZGlmOyA/PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL3Byb2R1Y3QucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvdmlld3MvcHJvZHVjdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNjE3NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL3Byb2R1Y3QucGhwCkBAIC0wLDAgKzEsODQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKK3JlcXVpcmVfb25jZSgkbW9kdWxlLT5tb2R1bGVQYXRoIC4gIi9jbGFzc2VzL0Nhc0Jyb3dzZXIuY2xhc3MucGhwIik7CityZXF1aXJlX29uY2UoJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvc2NyaXB0cy93aWRnZXRzL01ldGFkYXRhRGlzcGxheVdpZGdldC5waHAiKTsKK3JlcXVpcmVfb25jZSgkbW9kdWxlLT5tb2R1bGVQYXRoIC4gIi9zY3JpcHRzL3dpZGdldHMvUHJvZHVjdERvd25sb2FkV2lkZ2V0LnBocCIpOworCisvLyBHZXQgYSBDQVMtQnJvd3NlciBYTUwvUlBDIGNsaWVudAorJGJyb3dzZXIgID0gbmV3IENhc0Jyb3dzZXIoKTsKKyRjbGllbnQgICA9ICRicm93c2VyLT5nZXRDbGllbnQoKTsKKyAgICAKKy8vIEdldCB0aGUgc3BlY2lmaWVkIHByb2R1Y3QKKyRwcm9kdWN0SWQgPSBBcHA6OkdldCgpLT5yZXF1ZXN0LT5zZWdtZW50c1swXTsKKyRwcm9kdWN0ID0gJGNsaWVudC0+Z2V0UHJvZHVjdEJ5SWQoJHByb2R1Y3RJZCk7CiskcHJvZHVjdE5hbWUgICAgID0gJHByb2R1Y3QtPmdldE5hbWUoKTsKKyRwcm9kdWN0VHlwZU5hbWUgPSAkcHJvZHVjdC0+Z2V0VHlwZSgpLT5nZXROYW1lKCk7CiskcHJvZHVjdFR5cGVJZCAgID0gJHByb2R1Y3QtPmdldFR5cGUoKS0+Z2V0SWQoKTsKKyRwcm9kdWN0TWV0YWRhdGEgPSAkY2xpZW50LT5nZXRNZXRhZGF0YSgkcHJvZHVjdCk7CisKKy8vIEdldCBtZXRhZGF0YSBmb3IgcHJvZHVjdCBhbmQgcHJvZHVjdFR5cGUgYXMgYXNzb2NpYXRpdmUgYXJyYXlzCiskcHJvZHVjdFR5cGVJbmZvID0gJHByb2R1Y3QtPmdldFR5cGUoKS0+dG9Bc3NvY0FycmF5KCk7CiskcHJvZHVjdEluZm8gICAgID0gJHByb2R1Y3RNZXRhZGF0YS0+dG9Bc3NvY0FycmF5KCk7CisKKyRwcm9kdWN0VmlzaWJpbGl0eUxldmVsID0gJGJyb3dzZXItPmdldFByb2R1Y3RWaXNpYmlsaXR5TGV2ZWwoJHByb2R1Y3RJZCk7CisKKy8vIFJlZGlyZWN0IHRoZSB1c2VyIGlmIHRoZXkgYXJlIG5vdCBhdXRob3JpemVkIAoraWYgKCRwcm9kdWN0VmlzaWJpbGl0eUxldmVsID09IENhc0Jyb3dzZXI6OlZJU19OT05FKSB7CisJQXBwOjpHZXQoKS0+cmVkaXJlY3QoU0lURV9ST09UIC4gJy9lcnJvcnMvNDAzJyk7Cit9CisKKworLy8gQ3JlYXRlIGFuZCBsb2FkIGEgTWV0YWRhdGFEaXNwbGF5IHdpZGdldCB3aXQgdGhlIHZpc2libGUgbWV0YWRhdGEKKyRtZXRhZGF0YVdpZGdldCA9IG5ldyBNZXRhZGF0YURpc3BsYXlXaWRnZXQoYXJyYXkoKSk7CiskbWV0YWRhdGFXaWRnZXQtPmxvYWRNZXRhZGF0YSgkYnJvd3Nlci0+Z2V0VmlzaWJsZU1ldGFkYXRhRm9yUHJvZHVjdCgkcHJvZHVjdElkKSk7CisKKy8vIFJlY29yZCB0aGUgcHJvZHVjdCBwYWdlIHRvIHNlbmQgdGhlIHVzZXIgYmFjayB0bywgaWYgcHJvdmlkZWQKKyRyZXR1cm5QYWdlID0gaXNzZXQoQXBwOjpHZXQoKS0+cmVxdWVzdC0+c2VnbWVudHNbMV0pID8gQXBwOjpHZXQoKS0+cmVxdWVzdC0+c2VnbWVudHNbMV0gOiAxOworCisvLyBDcmVhdGUgYSBQcm9kdWN0RG93bmxvYWRXaWRnZXQKKyRwcm9kdWN0RG93bmxvYWRXaWRnZXQgPSBuZXcgUHJvZHVjdERvd25sb2FkV2lkZ2V0KGFycmF5KAorCSJkYXRhRGVsaXZlcnlVcmwiID0+IEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX2RhdGFkZWxpdl91cmwnXSkpOworJHByb2R1Y3REb3dubG9hZFdpZGdldC0+c2V0Q2xpZW50KCRjbGllbnQpOworJHByb2R1Y3REb3dubG9hZFdpZGdldC0+bG9hZCgkcHJvZHVjdCk7CisKKy8vIEFkZCB0aGUgY2FzLWJyb3dzZXIgc3R5bGVzCitBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkU3R5bGVzaGVldCgkbW9kdWxlLT5tb2R1bGVTdGF0aWMgLiAnL2Nzcy9jYXMtYnJvd3Nlci5jc3MnKTsKKworLy8gUHJlcGFyZSBCcmVhZGNydW1iV2lnZGV0CiskYmN3ID0gbmV3IEJyZWFkY3J1bWJzV2lkZ2V0KCk7CiskYmN3LT5hZGQoJ0hvbWUnLFNJVEVfUk9PVCAuICcvJyk7CiskYmN3LT5hZGQoJ0Jyb3dzZSBCeSBUeXBlJywgJG1vZHVsZS0+bW9kdWxlUm9vdCAuICcvJyk7CiskYmN3LT5hZGQoJHByb2R1Y3RUeXBlTmFtZSwgJG1vZHVsZS0+bW9kdWxlUm9vdC4iL2RhdGFzZXQveyRwcm9kdWN0VHlwZUlkfSIpOwkKKyRiY3ctPmFkZCgnUHJvZHVjdHMnLCAkbW9kdWxlLT5tb2R1bGVSb290LiIvcHJvZHVjdHMveyRwcm9kdWN0VHlwZUlkfS9wYWdlL3skcmV0dXJuUGFnZX0iKTsKKyRiY3ctPmFkZChBcHA6OkdldCgpLT5yZXF1ZXN0LT5zZWdtZW50c1swXSk7Cis/PgorCisKKzxociBjbGFzcz0ic3BhY2UiLz4KKzxkaXYgY2xhc3M9InNwYW4tMjIgbGFzdCBwcmVwZW5kLTEgYXBwZW5kLTEiPgorCTxkaXYgaWQ9ImNhc19icm93c2VyX3Byb2R1Y3RfbWV0YWRhdGEiPgorCQk8aDIgY2xhc3M9ImxhcmdlciBsb3VkIj5Qcm9kdWN0IE1ldGFkYXRhOiA8P3BocCBlY2hvIHdvcmR3cmFwKCRwcm9kdWN0TmFtZSwgNjIsICI8YnIgLz4iLHRydWUpOz8+PC9oMj4KKwkJPD9waHAgJG1ldGFkYXRhV2lkZ2V0LT5yZW5kZXIoKT8+CisJPC9kaXY+CisJPGRpdiBpZD0iY2FzX2Jyb3dzZXJfcHJvZHVjdF9kb3dubG9hZCI+CisJCTxoMiBjbGFzcz0ibGFyZ2VyIGxvdWQiPkRvd25sb2FkIHRoaXMgUHJvZHVjdDo8L2gyPgorCQk8P3BocCAkcHJvZHVjdERvd25sb2FkV2lkZ2V0LT5yZW5kZXIoKT8+CisJPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL3Byb2R1Y3RzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL3Byb2R1Y3RzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkyYzEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvdmlld3MvcHJvZHVjdHMucGhwCkBAIC0wLDAgKzEsMTU2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CityZXF1aXJlX29uY2UoJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvY2xhc3Nlcy9DYXNCcm93c2VyLmNsYXNzLnBocCIpOworcmVxdWlyZV9vbmNlKCRtb2R1bGUtPm1vZHVsZVBhdGggLiAiL3NjcmlwdHMvd2lkZ2V0cy9GaWx0ZXJXaWRnZXQucGhwIik7CityZXF1aXJlX29uY2UoJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvc2NyaXB0cy93aWRnZXRzL1Byb2R1Y3RQYWdlV2lkZ2V0LnBocCIpOworCisvLyBHZXQgYSBDQVMtQnJvd3NlciBYTUwvUlBDIGNsaWVudAorJGJyb3dzZXIgID0gbmV3IENhc0Jyb3dzZXIoKTsKKyRjbGllbnQgICA9ICRicm93c2VyLT5nZXRDbGllbnQoKTsKKyAKKy8vIEdldCBhICBQcm9kdWN0IFR5cGUgb2JqZWN0CiskcHJvZHVjdFR5cGUgPSAkY2xpZW50LT5nZXRQcm9kdWN0VHlwZUJ5SWQoQXBwOjpHZXQoKS0+cmVxdWVzdC0+c2VnbWVudHNbMF0pOworJHB0SUQgICAgID0gJHByb2R1Y3RUeXBlLT5nZXRJZCgpOworJHB0TmFtZSAgID0gJHByb2R1Y3RUeXBlLT5nZXROYW1lKCk7CiskdHlwZUluZm8gPSAkcHJvZHVjdFR5cGUtPnRvQXNzb2NBcnJheSgpOworCisvLyBEZXRlcm1pbmUgdGhlIHZpc2liaWxpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGN1cnJlbnQgdXNlcgorJHB0VmlzaWJpbGl0eUxldmVsID0gJGJyb3dzZXItPmdldFByb2R1Y3RUeXBlVmlzaWJpbGl0eUxldmVsKCRwdElEKTsKKworLy8gUmVkaXJlY3QgdGhlIHVzZXIgaWYgdGhleSBhcmUgbm90IGF1dGhvcml6ZWQKK2lmICgkcHRWaXNpYmlsaXR5TGV2ZWwgPT0gQ2FzQnJvd3Nlcjo6VklTX05PTkUpIHsKKwlBcHA6OkdldCgpLT5yZWRpcmVjdChTSVRFX1JPT1QgLiAnL2Vycm9ycy80MDMnKTsKK30KKworLy8gU3RvcmUgYW55IGZpbHRlciBwYXJhbWV0ZXJzIHBhc3NlZCBpbiB2aWEgVVJMCiskZmlsdGVyUGFyYW1zID0gYXJyYXkoKTsKKyRzZWdtZW50cyA9IEFwcDo6R2V0KCktPnJlcXVlc3QtPnNlZ21lbnRzOworZm9yKCRpbmRleCA9IDE7IGlzc2V0KCRzZWdtZW50c1skaW5kZXhdKSAmJiAkc2VnbWVudHNbJGluZGV4XSAhPSAiIjsgJGluZGV4ID0gJGluZGV4ICsgMil7CisJYXJyYXlfcHVzaCgkZmlsdGVyUGFyYW1zLCBhcnJheSgkc2VnbWVudHNbJGluZGV4XSwgJHNlZ21lbnRzWyRpbmRleCArIDFdKSk7Cit9CitpZihjb3VudCgkZmlsdGVyUGFyYW1zKSA+IDApeworCSRmaWx0ZXJCdXR0b25WYWx1ZSA9ICJIaWRlIEZpbHRlcnMiOworfWVsc2V7CisJJGZpbHRlckJ1dHRvblZhbHVlID0gIlNob3cgRmlsdGVycyI7Cit9CisKKy8vIEluaXRpYWxpemUgdGhlIEZpbHRlcldpZGdldAorJHF1ZXJ5U2l0ZVJvb3QgPSAoaXNzZXQoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3F1ZXJ5X3NlcnZpY2VfdXJsJ10pKQorCT8gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3F1ZXJ5X3NlcnZpY2VfdXJsJ10KKwk6ICdodHRwOi8vJyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICRtb2R1bGUtPm1vZHVsZVJvb3Q7CiskcmVzdWx0Rm9ybWF0ID0gImpzb24iOworJGZpbHRlcldpZGdldCA9IG5ldyBGaWx0ZXJXaWRnZXQoYXJyYXkoCisJJ3Byb2R1Y3RUeXBlJyAgPT4gJHByb2R1Y3RUeXBlLAorCSdodG1sSUQnICAgICAgID0+ICdjYXNfYnJvd3Nlcl9wcm9kdWN0X2xpc3QnLAorCSdsb2FkaW5nSUQnICAgID0+ICdsb2FkaW5nX2ljb25fY29udGFpbmVyJywJCisJJ3NpdGVVcmwnICAgICAgPT4gJHF1ZXJ5U2l0ZVJvb3QsCisJJ3BhZ2VkUmVzdWx0cycgPT4gdHJ1ZSwKKwkncmVzdWx0Rm9ybWF0JyA9PiAkcmVzdWx0Rm9ybWF0KSk7CiskZmlsdGVyV2lkZ2V0LT5yZW5kZXJTY3JpcHQoKTsKKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2hvdyB0aGUgZG93bmxvYWQgd2lkZ2V0Ciskc2hvd0Rvd25sb2FkV2lkZ2V0ID0gKGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3Nob3dfZG93bmxvYWRfd2lkZ2V0J10pIAorCSYmIEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3Nob3dfZG93bmxvYWRfd2lkZ2V0J10gPT0gMCkKKwk/IGZhbHNlCisJOiB0cnVlOworCQorLy8gUHJlcGFyZSBCcmVhZGNydW1iV2lnZGV0CiskYmN3ID0gbmV3IEJyZWFkY3J1bWJzV2lkZ2V0KCk7CiskYmN3LT5hZGQoJ0hvbWUnLFNJVEVfUk9PVCAuICcvJyk7CiskYmN3LT5hZGQoIkJyb3dzZSBCeSBUeXBlIiwgJG1vZHVsZS0+bW9kdWxlUm9vdCAuICcvJyk7CiskYmN3LT5hZGQoJHB0TmFtZSwgJG1vZHVsZS0+bW9kdWxlUm9vdC4iL2RhdGFzZXQveyRwdElEfSIpOwkKKyRiY3ctPmFkZCgiUHJvZHVjdHMiKTsKKz8+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworCisJJCgnI3Nob3dGaWx0ZXJzJykuY2xpY2soZnVuY3Rpb24oKSB7CisJCWlmICgkKHRoaXMpLnZhbCgpID09ICJTaG93IEZpbHRlcnMiKSB7CisJCQkkKCcjZmlsdGVyX3dpZGdldCcpLmZhZGVJbignc2xvdycpOworCQkJJCh0aGlzKS52YWwoJ0hpZGUgRmlsdGVycycpOworCQl9IGVsc2UgeworCQkJJCgnI2ZpbHRlcl93aWRnZXQnKS5mYWRlT3V0KCdzbG93Jyk7CisJCQkkKHRoaXMpLnZhbCgnU2hvdyBGaWx0ZXJzJyk7CisJCX0KKwl9KTsKKworCTw/cGhwCisJaWYoY291bnQoJGZpbHRlclBhcmFtcykgPiAwKXsKKwkJZm9yZWFjaCgkZmlsdGVyUGFyYW1zIGFzICRmaWx0ZXIpeworCQkJZWNobyAiY3JlYXRlRmlsdGVyKCciIC4gJGZpbHRlclswXSAuICInLCciIC4gJGZpbHRlclsxXSAuICInKTtcbiI7CisJCX0KKwkJZWNobyAnZGlzcGxheVBlcm1hbGluaygpOyc7CisJCWVjaG8gJyQoIiNmaWx0ZXJfd2lkZ2V0IikuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7JzsKKwl9CisJPz4KKworCXNlbmRSZXF1ZXN0KDw/cGhwIGVjaG8gJyInIC4gJHJlc3VsdEZvcm1hdCAuICciJzsgPz4pOworCQorfSk7Cis8L3NjcmlwdD4KKzxkaXYgY2xhc3M9ImNvbnRhaW5lciI+Cis8aHIgY2xhc3M9InNwYWNlIi8+Cis8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9jb250YWluZXIiIGNsYXNzPSJzcGFuLTI0IGxhc3QiPgorCisJPGRpdiBpZD0ic2VjdGlvbl9wcm9kdWN0cyI+CisJCTxoMiA+PD9waHAgZWNobyAkcHROYW1lPz48L2gyPgorCQk8aHIvPgorCQkKKwkJPGRpdiBpZD0ic2VjdGlvbl90eXBlX21ldGFkYXRhIj4KKwkJCTxoMz5EZXNjcmlwdGlvbjo8L2gzPgorCQkJPHA+PD9waHAgZWNobyAkdHlwZUluZm9bJ2Rlc2NyaXB0aW9uJ10/PjwvcD4KKwkJCTxociBjbGFzcz0ic3BhY2UiLz4KKwkJCQorCQkJPHVsIGNsYXNzPSJ0YWJtZW51Ij4KKwkJCQk8bGkgY2xhc3M9IiI+ICAgICAgICA8YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9kYXRhc2V0Lzw/cGhwIGVjaG8gJHB0SUQ/PiI+QWRkaXRpb25hbCBJbmZvcm1hdGlvbjwvYT48L2xpPgorCQkJCTxsaSBjbGFzcz0ic2VsZWN0ZWQiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L3Byb2R1Y3RzLzw/cGhwIGVjaG8gJHB0SUQ/PiI+RG93bmxvYWRhYmxlIEZpbGVzPC9hPjwvbGk+CisJCQk8L3VsPgorCQk8L2Rpdj4KKwkJPD9waHAgaWYgKCAkcHRWaXNpYmlsaXR5TGV2ZWwgPT0gQ2FzQnJvd3Nlcjo6VklTX0xJTUlUICk6Pz4KKwkJPGRpdiBjbGFzcz0ibm90aWNlIj4KKwkJCUFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbWF5IGV4aXN0IHRoYXQgaXMgbm90IHZpc2libGUgZHVlIHRvIHlvdXIgY3VycmVudCBhY2Nlc3MgcGVybWlzc2lvbnMuCisJCTwvZGl2PgorCQk8P3BocCBlbmRpZjs/PgorCQkKKwkJPGRpdiBpZD0ic2VjdGlvbl9maWx0ZXJfdG9vbHNfY29udGFpbmVyIj4KKwkJCTxkaXYgaWQ9InNlY3Rpb25fZmlsdGVyX3Rvb2xzX2J1dHRvbnMiPgorCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJzaG93RmlsdGVycyIgdmFsdWU9PD9waHAgZWNobyAnIicgLiAkZmlsdGVyQnV0dG9uVmFsdWUgLiAnIic7Pz4vPgorCQkJPC9kaXY+CisJCQk8ZGl2IGlkPSJzZWN0aW9uX2ZpbHRlcl90b29scyI+CisJCQkJPGRpdiBpZD0iZmlsdGVyX3dpZGdldCI+CisJCQkJCUZpbHRlcjogPD9waHAgJGZpbHRlcldpZGdldC0+cmVuZGVyKCk7ID8+CisJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJwYWdlX251bSIgdmFsdWU9IjEiPgorCQkJCTwvZGl2PgorCQkJPC9kaXY+CisJCTwvZGl2PgorCQk8P3BocCBpZiAoICFBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9wcml2YXRlX3Byb2R1Y3RzX3Zpc2liaWxpdHknXSAmJiAkcHRWaXNpYmlsaXR5TGV2ZWwgPT0gQ2FzQnJvd3Nlcjo6VklTX0xJTUlUICk6Pz4KKwkJPGgzPlB1YmxpYyBEb3dubG9hZGFibGUgRmlsZXMgZm9yIHRoaXMgRGF0YXNldDwvaDM+CisJCTw/cGhwIGVsc2UgOj8+CisJCTxoMz5Eb3dubG9hZGFibGUgRmlsZXMgZm9yIHRoaXMgRGF0YXNldDwvaDM+CisJCTw/cGhwIGVuZGlmOz8+CisJCTxkaXYgaWQ9ImxvYWRpbmdfaWNvbl9jb250YWluZXIiPgorCQk8aW1nIHNyYz0iPD9waHAgZWNobyBBcHA6OkdldCgpLT5yZXF1ZXN0LT5tb2R1bGVTdGF0aWMgLiAnL2ltZy9sb2FkaW5nLmdpZic7ID8+Ii8+CisJCTwvZGl2PgorCQk8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9wcm9kdWN0X2xpc3QiPjwvZGl2PgorCQkKKwk8L2Rpdj4KKzwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9jYXMtYnJvd3Nlci92aWV3cy9zZWFyY2gucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvdmlld3Mvc2VhcmNoLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI2YjFlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvdmlld3Mvc2VhcmNoLnBocApAQCAtMCwwICsxLDg5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisKK3JlcXVpcmVfb25jZSgkbW9kdWxlLT5tb2R1bGVQYXRoIC4gIi9jbGFzc2VzL0Nhc0Jyb3dzZXIuY2xhc3MucGhwIik7CisKKy8vIEdldCBhIENBUy1Ccm93c2VyIFhNTC9SUEMgY2xpZW50CiskYnJvd3NlciAgPSBuZXcgQ2FzQnJvd3NlcigpOworJGNsaWVudCAgID0gJGJyb3dzZXItPmdldENsaWVudCgpOworIAorLy8gR2V0IGEgIFByb2R1Y3QgVHlwZSBvYmplY3QKKyRwcm9kdWN0VHlwZSAgPSAkY2xpZW50LT5nZXRQcm9kdWN0VHlwZUJ5SWQoQXBwOjpHZXQoKS0+cmVxdWVzdC0+c2VnbWVudHNbMF0pOworJHByb2R1Y3RDb3VudCA9ICRjbGllbnQtPmdldE51bVByb2R1Y3RzKCRwcm9kdWN0VHlwZSk7CiskcHRJRCA9ICRwcm9kdWN0VHlwZS0+Z2V0SWQoKTsKKyRwdE5hbWUgPSAkcHJvZHVjdFR5cGUtPmdldE5hbWUoKTsKKworLy8gRGV0ZXJtaW5lIHdoaWNoIHNlYXJjaCB3aWRnZXQgdG8gc2hvdworJHdpZGdldENsYXNzTmFtZSA9IGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydicm93c2VyX3Byb2R1Y3Rfc2VhcmNoX3dpZGdldCddKQorCT8gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Jyb3dzZXJfcHJvZHVjdF9zZWFyY2hfd2lkZ2V0J10KKwk6ICdGaWx0ZXJXaWRnZXQnOworCiskcXVlcnlTaXRlUm9vdCA9IChpc3NldChBcHA6OkdldCgpLT5zZXR0aW5nc1sncXVlcnlfc2VydmljZV91cmwnXSkpCisJPyBBcHA6OkdldCgpLT5zZXR0aW5nc1sncXVlcnlfc2VydmljZV91cmwnXQorCTogJ2h0dHA6Ly8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gTU9EVUxFX1JPT1Q7CisKKy8vIENyZWF0ZSB0aGUgc2VhcmNoIHdpZGdldAorcmVxdWlyZV9vbmNlKCRtb2R1bGUtPm1vZHVsZVBhdGggLiAiL3NjcmlwdHMvd2lkZ2V0cy97JHdpZGdldENsYXNzTmFtZX0ucGhwIik7Ciskc2VhcmNoV2lkZ2V0ID0gbmV3ICR3aWRnZXRDbGFzc05hbWUoYXJyYXkoCisJJ3Byb2R1Y3RUeXBlJz0+JHByb2R1Y3RUeXBlLAorCSdodG1sSUQnPT4nY2FzX2Jyb3dzZXJfcHJvZHVjdF9saXN0JywKKwknc2l0ZVVybCc9PiRxdWVyeVNpdGVSb290LAorCSdwYWdlZFJlc3VsdHMnPT50cnVlLAorCSdyZXN1bHRGb3JtYXQnPT4nanNvbicpKTsKKworLy8gUmVuZGVyIHNlYXJjaCB3aWRnZXQgamF2YXNjcmlwdAorJHNlYXJjaFdpZGdldC0+cmVuZGVyU2NyaXB0KCk7CisKKy8vIFByZXBhcmUgQnJlYWRjcnVtYldpZ2RldAorJGJjdyA9IG5ldyBCcmVhZGNydW1ic1dpZGdldCgpOworJGJjdy0+YWRkKCdIb21lJyxTSVRFX1JPT1QgLiAnLycpOworJGJjdy0+YWRkKCJCcm93c2VyIiwgJG1vZHVsZS0+bW9kdWxlUm9vdCAuICcvJyk7CiskYmN3LT5hZGQoJHB0TmFtZSwgJG1vZHVsZS0+bW9kdWxlUm9vdC4iL2RhdGFzZXQveyRwdElEfSIpOwkKKyRiY3ctPmFkZCgiUHJvZHVjdCBTZWFyY2giKTsKKz8+CisKKzxkaXYgY2xhc3M9ImNvbnRhaW5lciI+Cis8aHIgY2xhc3M9InNwYWNlIi8+Cis8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9jb250YWluZXIiIGNsYXNzPSJzcGFuLTI0IGxhc3QiPgorCTx1bCBjbGFzcz0idGFicyI+CisJICA8bGk+PGEgaWQ9InRhYl9tZXRhZGF0YSIgaHJlZj0iPD9waHAgZWNobyBNT0RVTEVfUk9PVD8+L2RhdGFzZXQvPD9waHAgZWNobyAkcHRJRD8+Ij5NZXRhZGF0YTwvYT48L2xpPgorCSAgPGxpPjxhIGlkPSJ0YWJfYnJvd3NlIiAgIGhyZWY9Ijw/cGhwIGVjaG8gTU9EVUxFX1JPT1Q/Pi9wcm9kdWN0cy88P3BocCBlY2hvICRwdElEPz4iPkJyb3dzZTwvYT48L2xpPgorCSAgPGxpPjxhIGlkPSJ0YWJfc2VhcmNoIiAgIGhyZWY9Ijw/cGhwIGVjaG8gTU9EVUxFX1JPT1Q/Pi9zZWFyY2gvPD9waHAgZWNobyAkcHRJRD8+IiBjbGFzcz0ic2VsZWN0ZWQiPlNlYXJjaDwvYT48L2xpPgorCTwvdWw+CisJPGRpdiBpZD0ic2VjdGlvbl9wcm9kdWN0cyI+CisJCTxoMiBjbGFzcz0ibGFyZ2VyIGxvdWQiPlByb2R1Y3QgU2VhcmNoOiA8P3BocCBlY2hvICRwdE5hbWU/PjwvaDI+CisJCTxici8+CisJCTxkaXYgaWQ9ImNhc19icm93c2VyX3NlYXJjaF93aWRnZXQiIGNsYXNzPSJzcGFuLTI0IGxhc3QiPgorCSAgCQk8P3BocCAkc2VhcmNoV2lkZ2V0LT5yZW5kZXIoKTsgPz4KKwkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJwYWdlX251bSIgdmFsdWU9IjEiPgorCQk8L2Rpdj4KKwkJPGRpdiBpZD0iY2FzX2Jyb3dzZXJfcHJvZHVjdF9saXN0IiBjbGFzcz0ic3Bhbi0xNiBjb2xib3JkZXIiPgorCSAgCQk8aDM+UHJvZHVjdCBTZWFyY2ggUmVzdWx0czwvaDM+CisJCTwvZGl2PgorCQk8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9kYXRhc2V0X2Rvd25sb2FkIiBjbGFzcz0ic3Bhbi02IGxhc3QiPgorCQkJPGEgaHJlZj0iPD9waHAgZWNobyBBcHA6OkdldCgpLT5zZXR0aW5nc1snYnJvd3Nlcl9kYXRhZGVsaXZfdXJsJ10/Pi9kYXRhc2V0P3R5cGVJRD08P3BocCBlY2hvIEFwcDo6R2V0KCktPnJlcXVlc3QtPnNlZ21lbnRzWzBdPz4mZm9ybWF0PWFwcGxpY2F0aW9uL3gtemlwIj4KKwkJCQk8aW1nIHNyYz0iPD9waHAgZWNobyBNT0RVTEVfU1RBVElDPz4vaW1nL3ppcC1pY29uLXNtYWxsZXIuZ2lmIiBpZD0iemlwX2ljb24iIGFsdD0iemlwLWljb24iLz4KKwkJCTwvYT4KKwkJCUNsaWNrIG9uIHRoZSBpY29uIHRvIGRvd25sb2FkIGFsbCA8P3BocCBlY2hvICRwcm9kdWN0Q291bnQgPz4gZGF0YSBwcm9kdWN0cyBhc3NvY2lhdGVkIHdpdGgKKwkJCXRoaXMgc2VhcmNoIGFzIGEgc2luZ2xlIFppcCBhcmNoaXZlLjxici8+CisJCTwvZGl2PgorCTwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL3R5cGVzZWFyY2gucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvY2FzLWJyb3dzZXIvdmlld3MvdHlwZXNlYXJjaC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZTNhYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL2Nhcy1icm93c2VyL3ZpZXdzL3R5cGVzZWFyY2gucGhwCkBAIC0wLDAgKzEsMTIxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CityZXF1aXJlX29uY2UoJG1vZHVsZS0+bW9kdWxlUGF0aCAuICIvY2xhc3Nlcy9DYXNCcm93c2VyLmNsYXNzLnBocCIpOworcmVxdWlyZV9vbmNlKCRtb2R1bGUtPm1vZHVsZVBhdGggLiAiL3NjcmlwdHMvd2lkZ2V0cy9Dcm9zc1R5cGVTZWFyY2hXaWRnZXQucGhwIik7CisKKy8vIEdldCBhIENBUy1Ccm93c2VyIFhNTC9SUEMgY2xpZW50CiskYnJvd3NlciAgPSBuZXcgQ2FzQnJvd3NlcigpOworJGNsaWVudCAgID0gJGJyb3dzZXItPmdldENsaWVudCgpOworCisvLyBJbml0aWFsaXplIHRoZSBDcm9zc1R5cGVTZWFyY2hXaWRnZXQKKyRxdWVyeVNpdGVSb290ID0gKGlzc2V0KEFwcDo6R2V0KCktPnNldHRpbmdzWydxdWVyeV9zZXJ2aWNlX3VybCddKSkKKwk/IEFwcDo6R2V0KCktPnNldHRpbmdzWydxdWVyeV9zZXJ2aWNlX3VybCddCisJOiAnaHR0cDovLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkbW9kdWxlLT5tb2R1bGVSb290OworJGNyb3NzVHlwZVdpZGdldCA9IG5ldyBDcm9zc1R5cGVTZWFyY2hXaWRnZXQoYXJyYXkoCisJJ2h0bWxJRCcgICAgICAgPT4gJ2Nhc19icm93c2VyX3Byb2R1Y3RfbGlzdCcsCisJJ2xvYWRpbmdJRCcgICAgPT4gJ2xvYWRpbmdfaWNvbl9jb250YWluZXInLAorCSdzaXRlVXJsJyAgICAgID0+ICRxdWVyeVNpdGVSb290KSk7CiskY3Jvc3NUeXBlV2lkZ2V0LT5yZW5kZXJTY3JpcHQoKTsKKwkKKy8vIFN0b3JlIGFueSBmaWx0ZXIgYW5kIGV4Y2x1c2l2ZS9pbmNsdXNpdmUgcGFyYW1ldGVycyBwYXNzZWQgaW4gdmlhIFVSTAorJHVybFBhcmFtcyA9IENyb3NzVHlwZVNlYXJjaFdpZGdldDo6cGFyc2VTZWdtZW50cygpOworJHF1ZXJ5Qm9vbFZhbHVlID0gJ2FuZCc7CiskZXhjbHVzaXZlQ2hlY2tlZCA9IHRydWU7CitpZihpc3NldCgkdXJsUGFyYW1zWydmaWx0ZXJQYXJhbXMnXSkpeworCSRmaWx0ZXJCdXR0b25WYWx1ZSA9ICJIaWRlIEZpbHRlcnMiOworfWVsc2V7CisJJGZpbHRlckJ1dHRvblZhbHVlID0gIlNob3cgRmlsdGVycyI7Cit9CitpZihpc3NldCgkdXJsUGFyYW1zWydleGNsdXNpdmUnXSkpeworCSRxdWVyeUJvb2xWYWx1ZSA9ICR1cmxQYXJhbXNbJ2V4Y2x1c2l2ZSddWydib29sJ107CisJJGV4Y2x1c2l2ZUNoZWNrZWQgPSAkdXJsUGFyYW1zWydleGNsdXNpdmUnXVsnY2hlY2tlZCddOworfQorCisvLyBQcmVwYXJlIEJyZWFkY3J1bWJXaWdkZXQKKyRiY3cgPSBuZXcgQnJlYWRjcnVtYnNXaWRnZXQoKTsKKyRiY3ctPmFkZCgnSG9tZScsU0lURV9ST09UIC4gJy8nKTsKKyRiY3ctPmFkZCgiQnJvd3NlIEFjcm9zcyBUeXBlcyIpOwkKKz8+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlU3RhdGljPz4vanMvanF1ZXJ5LmRhdGFUYWJsZXMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworCisJJCgnI3Nob3dGaWx0ZXJzJykuY2xpY2soZnVuY3Rpb24oKSB7CisJCWlmICgkKHRoaXMpLnZhbCgpID09ICJTaG93IEZpbHRlcnMiKSB7CisJCQkkKCcjZmlsdGVyX3dpZGdldCcpLmZhZGVJbignc2xvdycpOworCQkJJCh0aGlzKS52YWwoJ0hpZGUgRmlsdGVycycpOworCQl9IGVsc2UgeworCQkJJCgnI2ZpbHRlcl93aWRnZXQnKS5mYWRlT3V0KCdzbG93Jyk7CisJCQkkKHRoaXMpLnZhbCgnU2hvdyBGaWx0ZXJzJyk7CisJCX0KKwl9KTsKKworCXBQYWdlU2l6ZSA9IDIwOworCisJYWRkQm9vbGVhbkNyaXRlcmlhKDw/cGhwIGVjaG8gIiciIC4gJHF1ZXJ5Qm9vbFZhbHVlIC4gIiciOyA/PiwgbnVsbCk7CisKKwk8P3BocAorCWlmKGlzc2V0KCR1cmxQYXJhbXNbJ2ZpbHRlclBhcmFtcyddKSl7CisJCWZvcmVhY2goJHVybFBhcmFtc1snZmlsdGVyUGFyYW1zJ10gYXMgJGZpbHRlcil7CisJCQllY2hvICJjcmVhdGVGaWx0ZXIoJyIgLiAkZmlsdGVyWzBdIC4gIicsJyIgLiAkZmlsdGVyWzFdIC4gIicpO1xuIjsKKwkJfQorCQlpZigkZXhjbHVzaXZlQ2hlY2tlZCA9PSBmYWxzZSl7CisJCQllY2hvICckKCIjZXhjbHVzaXZlIikuYXR0cigiY2hlY2tlZCIsIGZhbHNlKTsnOworCQl9CisJCWVjaG8gJ2Rpc3BsYXlQZXJtYWxpbmsoKTsnOworCQllY2hvICckKCIjZmlsdGVyX3dpZGdldCIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOyc7CisJfQorCT8+CisKKwlzZW5kQ3Jvc3NUeXBlUmVxdWVzdCgpOworCQorfSk7Cis8L3NjcmlwdD4KKzxkaXYgY2xhc3M9ImNvbnRhaW5lciI+Cis8aHIgY2xhc3M9InNwYWNlIi8+Cis8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9jb250YWluZXIiIGNsYXNzPSJzcGFuLTI0IGxhc3QiPgorCTxkaXYgaWQ9InNlY3Rpb25fcHJvZHVjdHMiPgorCQk8aDIgPjw/cGhwIGVjaG8gIkNyb3NzIFByb2R1Y3QgVHlwZSBTZWFyY2giPz48L2gyPgorCQk8dWwgY2xhc3M9InRhYm1lbnUiPgorCQkJPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+LyI+QnJvd3NlIEJ5IFR5cGU8L2E+PC9saT4KKwkJCTxsaSBjbGFzcz0ic2VsZWN0ZWQiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L3R5cGVzZWFyY2gvIj5Ccm93c2UgQWNyb3NzIFR5cGVzPC9hPjwvbGk+CisJCTwvdWw+CisJCTxociBjbGFzcz0ic3BhY2UiLz4KKwkJCisJCTxkaXYgaWQ9InNlY3Rpb25fZmlsdGVyX3Rvb2xzX2NvbnRhaW5lciI+CisJCQk8ZGl2IGlkPSJzZWN0aW9uX2ZpbHRlcl90b29sc19idXR0b25zIj4KKwkJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0ic2hvd0ZpbHRlcnMiIHZhbHVlPTw/cGhwIGVjaG8gJyInIC4gJGZpbHRlckJ1dHRvblZhbHVlIC4gJyInOz8+IC8+CisJCQk8L2Rpdj4KKwkJCTxkaXYgaWQ9InNlY3Rpb25fZmlsdGVyX3Rvb2xzIj4KKwkJCQk8ZGl2IGlkPSJmaWx0ZXJfd2lkZ2V0Ij4KKwkJCQkJRmlsdGVyOiA8P3BocCAkY3Jvc3NUeXBlV2lkZ2V0LT5yZW5kZXIoKTsgPz4KKwkJCQk8L2Rpdj4KKwkJCTwvZGl2PgorCQk8L2Rpdj4KKwkJCisJCTxici8+CisJCTxkaXYgaWQ9ImxvYWRpbmdfaWNvbl9jb250YWluZXIiPgorCQk8aW1nIHNyYz0iPD9waHAgZWNobyBBcHA6OkdldCgpLT5yZXF1ZXN0LT5tb2R1bGVTdGF0aWMgLiAnL2ltZy9sb2FkaW5nLmdpZic7ID8+Ii8+CisJCTwvZGl2PgorCQk8ZGl2IGlkPSJjYXNfYnJvd3Nlcl9wcm9kdWN0X2xpc3QiPjwvZGl2PgorCTwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL1JFQURNRS50eHQgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3YmUzZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDg4IEBACitQcm9maWxlIE1hbmFnZXIgLSBMaWdodHdlaWdodCBwcm9maWxlIG1hbmFnZXIgZm9yIEJhbGFuY2UgYXBwbGljYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK092ZXJ2aWV3CistLS0tLS0tLQorCitUaGUgUHJvZmlsZSBNYW5hZ2VyIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiBhY2Nlc3NpbmcgYW5kIAorbWFuYWdpbmcgdGhlIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgdW5kZXJseWluZyBkaXJlY3Rvcnkgc2VydmljZXMuIFRoZSBtb2R1bGUgcHJvdmlkZXMgCit2aWV3cyB0aGF0IG1ha2UgaXQgZWFzeSB0byBsb2dpbiwgYnJvd3NlLCBhbmQgbWFuYWdlIHByb2ZpbGUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWVkIAordXNlci4gSXQgYWxzbyBwcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIGNyZWF0ZSBuZXcgcHJvZmlsZXMuIEhvd2V2ZXIsIGFuIGFkbWluaXN0cmF0aXZlIAordXNlciBtdXN0IGdyYW50IHRoZSBuZXcgdXNlciBwcml2aWxlZ2VzIGZyb20gd2l0aGluIHRoZSB1bmRlcmx5aW5nIGRpcmVjdG9yeSBzZXJ2aWNlLiBUaGUgCitwcmltYXJ5IHVzZSBjYXNlIGZvciB0aGlzIG1vZHVsZSBpbnZvbHZlcyBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiB1c2luZyBMREFQLCAKK2FsdGhvdWdoIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IGFkZGl0aW9uYWwgYmFjay1lbmRzIHdpdGggbW9kZXJhdGUgY3VzdG9taXphdGlvbi4KKworCitIb3cgaXQgV29ya3MKKy0tLS0tLS0tLS0tLQorCitUaGUgUHJvZmlsZSBNYW5hZ2VyIGhhcyBiZWVuIGRlc2lnbmVkIHNvIHRoYXQgaXQgaXMgZWFzeSB0byBwbHVnIGluIGN1c3RvbSBiYWNrIGVuZCAKK2RpcmVjdG9yeSBzZXJ2aWNlcyAoTERBUCwgTXlTcWwsIGV0YykuIFRoZSBwcm9maWxlIG1hbmFnZXIgY29tZXMgd2l0aCBhIHJlYWR5LXRvLXVzZSAKK0xEQVAgcHJvdmlkZXIgYnV0IGN1c3RvbWl6aW5nIGl0IGlzIHZlcnkgc2ltcGxlLiBPbmNlIGFsbCB0aGUgYXR0cmlidXRlcyBpbiB0aGUgCitjb25maWcuaW5pIGZpbGUgYXJlIHNldCwgdGhlIHByb2ZpbGUgbWFuYWdlciB3aWxsIGRpc3BsYXkgYWxsIGF0dHJpYnV0ZXMgZGVmaW5lZC4gCitUaGVzZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoZSB2aWV3LnBocCBwYWdlIGFuZCBjYW4gYmUgbW9kaWZpZWQgdGhyb3VnaCAKK3RoZSBtYW5hZ2UucGhwIHBhZ2UuIFRoZSBwcm9maWxlIG1hbmFnZXIgYWxzbyBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdXNlciAKK3Bhc3N3b3Jkcy4gTW9yZW92ZXIsIHVzZXIgZ3JvdXBzIGNhbiBiZSB2aWV3ZWQgb24gdGhlIGdyb3Vwcy5waHAgcGFnZSBpZiBhdXRob3JpemF0aW9uIAorY29uZmlndXJhdGlvbnMgYXJlIHNldHVwLgorCisKK0luc3RhbGxhdGlvbgorLS0tLS0tLS0tLS0tCisKK0NvcHkgdGhlIFByb2ZpbGUgbW9kdWxlICh0aGlzIGRpcmVjdG9yeSkgdG8gdGhlIC9tb2R1bGVzIGRpcmVjdG9yeSBvZgoreW91ciBCYWxhbmNlIGFwcGxpY2F0aW9uLiAKKworCitEZXBlbmRlbmNpZXMKKy0tLS0tLS0tLS0tLQorCisgQ0FTLVNpbmdsZSBTaWduIE9uICggRm9yIExEQVAgdXNlcnMgKQorOiBJZiBMREFQIGlzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZC9vciBhdXRob3JpemF0aW9uLCB0aGUgW0NBUy1TU09dKGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjMvc3NvL3NyYy9tYWluL3BocC9wZWFyLykgCisgIGxpYnJhcnkgbXVzdCBiZSBhdmFpbGFibGUgb24gdGhlIGhvc3QgZW52aXJvbm1lbnQgdG8gYWxsb3cgdGhlIG1vZHVsZSB0byBjb21tdW5pY2F0ZSAKKyAgIHdpdGggTERBUCB0aHJvdWdoIHRoaXMgbGlicmFyeS4gIAorCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworQWxsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBQcm9maWxlIE1hbmFnZXIgdGFrZXMgcGxhY2UgaW4gdGhlIG1vZHVsZSdzICdjb25maWcuaW5pJyBmaWxlLiAKK1NlZSB0aGUgaW5saW5lIGRvY3VtZW50YXRpb24gaW4gJ2NvbmZpZy5pbmknIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoCitjb25maWd1cmF0aW9uIG9wdGlvbi4gCisKKworRGV2ZWxvcGVyIEd1aWRlCistLS0tLS0tLS0tLS0tLS0KKworIyMjIEluY2x1ZGluZyB0aGUgUHJvZmlsZSBNYW5hZ2VyIGluIHlvdXIgYXBwbGljYXRpb24KKworSW4gZ2VuZXJhbCwgdGhlIFByb2ZpbGUgTWFuYWdlciBuZWVkcyB0byBiZSBhdmFpbGFibGUgb24gZWFjaCBhcHBsaWNhdGlvbiB2aWV3LiBUbyBhdm9pZCAKK2hhdmluZyB0byBsb2FkIHRoZSBtb2R1bGUgYXQgdGhlIHRvcCBvZiBlYWNoIHZpZXcsIGl0IGlzIHBvc3NpYmxlIHRvIGluY2x1ZGUgdGhlIG1vZHVsZSBvbmNlLAoraW4gdGhlIEJhbGFuY2UgaW5kZXgucGhwIGF0IHRoZSByb290IG9mIHlvdXIgYXBwbGljYXRpb24uIFNpbXBseSBhZGQgdGhlIGZvbGxvd2luZyAKK2xpbmVzIHRvIHRoZSAnaW5kZXgucGhwJyBmaWxlIHdoZXJlIGl0IHNheXMgJ0luaXRpYWxpemUgYW55IGdsb2JhbGx5IHJlcXVpcmVkIG1vZHVsZXMgaGVyZSc6CisKKy8vIFByb2ZpbGUgTWFuYWdlciBpbml0aWFsaXphdGlvbgorJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoJ05BTUVfT0ZfUFJPRklMRV9ESVJFQ1RPUlknKTsKKworCisjIyMgSW5jbHVkaW5nIHRoZSBQcm9maWxlIE1hbmFnZXIgaW4geW91ciBhcHBsaWNhdGlvbiB2aWV3cyAjIyMgCisKK0JlZm9yZSBkaXNwbGF5aW5nIHRoZSBtYW5hZ2VyIGZpcnN0IHlvdSBtdXN0IGluaXRpYWxpemUgdGhlIFVzZXJTdGF0dXNXaWRnZXQgYnkgYWRkaW5nIHRoZSAKK2ZvbGxvd2luZzoKKworCQkvLyBMb2FkIHByb2ZpbGUgbW9kdWxlIGZvciBwYXRoIGFjY2VzcyAKKwkJJG1vZHVsZSAJCT0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgncHJvZmlsZScpOworCQkvLyBQcmVwYXJlIFVzZXIgbG9naW4gZGV0YWlscworCQkkYXV0aGVudGljYXRpb24gPSBBcHA6OkdldCgpLT5nZXRBdXRoUHJvdmlkZXIoKTsKKwkJJHVzZXJuYW1lIAkJPSAkYXV0aGVudGljYXRpb24tPmdldEN1cnJlbnRVc2VybmFtZSgpOworCQlyZXF1aXJlX29uY2UoICRtb2R1bGUtPm1vZHVsZVBhdGggLiAnL3NjcmlwdHMvd2lkZ2V0cy9Vc2VyU3RhdHVzV2lkZ2V0LnBocCcgKTsKKwkJJHVzZXJTdGF0dXMgPSBuZXcgVXNlclN0YXR1c1dpZGdldCgKKwkJCWFycmF5KCAkYXV0aGVudGljYXRpb24tPmlzTG9nZ2VkSW4oKSwKKwkJCQkgICAkdXNlcm5hbWUsCisJCQkJICAgLy8gU2V0IHByb2ZpbGUgbWFuYWdlbWVudCBvbi4gJ2ZhbHNlJyB3aWxsIGRpc2FibGUgdGhlIGxpbmsgdG8gcHJvZmlsZSBtYW5hZ2VtZW50LgorCQkJCSAgIHRydWUpLCB0cnVlICk7CisJCSAgIAorVG8gZGlzcGxheSB0aGUgdXNlciBzdGF0dXMgaW4geW91ciBhcHBsaWNhdGlvbiB2aWV3cyBzaW1wbHkgYWRkIHRoZSBmb2xsb3dpbmc6CisKKwkJPD9waHAgJHVzZXJTdGF0dXMtPnJlbmRlcigpOz8+CisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9jbGFzc2VzL0xEQVBBdXRoZW50aWNhdGlvblByb3ZpZGVyLmNsYXNzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvY2xhc3Nlcy9MREFQQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2OTE1OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvY2xhc3Nlcy9MREFQQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcy5waHAKQEAgLTAsMCArMSwyNjMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBMREFQQXV0aGVudGljYXRpb25Qcm92aWRlcgorICogCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGV4dGVuc2lvbiBvZiB0aGUgT09EVCBTZWN1cml0eSAnU2luZ2xlLXNpZ24gb24nCisgKiBmdW5jdGlvbmFsaXR5IHRoYXQgY29tcGxpZXMgd2l0aCB0aGUgY29udHJhY3Qgc3BlY2lmaWVkIGluIHRoZSBPT0RUIEJhbGFuY2UKKyAqIEFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlciBpbnRlcmZhY2UuCisgKiAKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBmdW5jdGlvbnMgYXZhaWxhYmxlIGhlcmUsIGNvbnN1bHQgZWl0aGVyIHRoZQorICogT09EVCBTZWN1cml0eSBwYWNrYWdlIG9yIHRoZSBCYWxhbmNlIEFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlciAKKyAqIGludGVyZmFjZSBkb2N1bWVudGF0aW9uLgorICogCisgKiBOb3RlOiBUaGlzIGNsYXNzIGhhcyBhIGRlcGVuZGVuY3kgb24gdGhlIE9PRFQgQ0FTLVNTTyBwYWNrYWdlIAorICogICAgICAoaHR0cDovL29vZHQuanBsLm5hc2EuZ292L3JlcG8vZnJhbWV3b3JrL2Nhcy1zc28vdHJ1bmsvc3JjL3BocC9wZWFyKQorICogICAgICAKKyAqICAgICAgVG8gYnVpbGQgdGhpcyBkZXBlbmRlbmN5LCBjaGVjayBvdXQgdGhlIGFib3ZlIHByb2plY3QgYW5kIHRoZW46CisgKiAgICAgIDEpIGNkIGludG8gdGhlIGNoZWNrZWQgb3V0IHByb2plY3QgKHlvdSBzaG91bGQgc2VlIGEgcGFja2FnZS54bWwgZmlsZSkKKyAqICAgICAgMikgcGVhciBwYWNrYWdlCisgKiAgICAgIDMpIChzdWRvKSBwZWFyIGluc3RhbGwgLS1mb3JjZSBHb3ZfTmFzYV9KcGwuLi50YXIuZ3oKKyAqIAorICogQGF1dGhvciBzLmtodWRpa3lhbgorICogQGF1dGhvciBhaGFydAorICogCisgKi8KKworcmVxdWlyZSgiT3JnL0FwYWNoZS9Pb2R0L1NlY3VyaXR5L1NpbmdsZVNpZ25Pbi5waHAiKTsKKworY2xhc3MgTERBUEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIKKwlleHRlbmRzIE9yZ19BcGFjaGVfT29kdF9TZWN1cml0eV9TaW5nbGVTaWduT24gCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgeworCQorCS8vIFRoZSBMREFQIHNlcnZlciBuYW1lCisJcHJvdGVjdGVkICRsZGFwSG9zdDsKKwkKKwkvLyBUaGUgcG9ydCBvbiB3aGljaCB0aGUgTERBUCBzZXJ2ZXIgbGlzdGVucworCXByb3RlY3RlZCAkbGRhcFBvcnQ7CisKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgeworCQkKKwkJLy8gc2V0IExEQVAgY29uc3RhbnRzCisJCWRlZmluZSgiQ0FTX1NFQ1VSSVRZIix0cnVlKTsKKwkJZGVmaW5lKCJTU09fTERBUF9IT1NUIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2xkYXBfaG9zdCddKTsKKwkJZGVmaW5lKCJTU09fTERBUF9QT1JUIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2xkYXBfcG9ydCddKTsKKwkJZGVmaW5lKCJTU09fQkFTRV9ETiIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydsZGFwX2Jhc2VfZG4nXSk7CisJCWRlZmluZSgiU1NPX0dST1VQU19ETiIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydsZGFwX2dyb3VwX2RuJ10pOworCQlkZWZpbmUoIlNTT19DT09LSUVfS0VZIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2Nvb2tpZV9rZXknXSk7CisJCQorCQkkdGhpcy0+bGRhcEhvc3QgPSBTU09fTERBUF9IT1NUOworCQkkdGhpcy0+bGRhcFBvcnQgPSBTU09fTERBUF9QT1JUOworCX0KKwkKKwkvKioKKwkgKiBDb25uZWN0IHRvIHRoZSBMREFQIHNlcnZlcgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCkgeworCQlyZXR1cm4gcGFyZW50Ojpjb25uZWN0KCR0aGlzLT5sZGFwSG9zdCwkdGhpcy0+bGRhcFBvcnQpOworCX0KKwkKKwkvKioKKwkgKiBEaXNjb25uZWN0IGZyb20gdGhlIExEQVAgc2VydmVyCisJICovCisJcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7CisJCWxkYXBfY2xvc2UoJHRoaXMtPmNvbm4pOworCX0KKwkKKwkvKioKKwkgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSB1c2VyIGhhcyBhdXRoZW50aWNhdGVkCisJICogCisJICogQHJldHVybiBib29sZWFuIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gaXNMb2dnZWRJbigpIHsKKwkJcmV0dXJuIHBhcmVudDo6aXNMb2dnZWRJbigpOworCX0KKwkKKwkvKioKKwkgKiBQcm9jZXNzIGEgdXNlciBsb2dpbgorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSBwcm92aWRlZCB1c2VybmFtZQorCSAqIEBwYXJhbSBzdHJpbmcgJHBhc3N3b3JkIFRoZSBwcm92aWRlZCBwYXNzd29yZAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBsb2dpbiggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKSB7CisJCXJldHVybiBwYXJlbnQ6OmxvZ2luKCAkdXNlcm5hbWUsICRwYXNzd29yZCApOworCX0KKwkKKwkvKioKKwkgKiBFbmQgYW4gYXV0aGVudGljYXRlZCB1c2VyJ3Mgc2Vzc2lvbgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBsb2dvdXQoKSB7CisJCXBhcmVudDo6bG9nb3V0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB1bmlxdWUgdXNlcm5hbWUgb2YgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJuYW1lKCkgeworCQlyZXR1cm4gcGFyZW50OjpnZXRDdXJyZW50VXNlcm5hbWUoKTsKKwl9CisJCisJLyoqCisJICogUHJvY2VzcyBhIHBhc3N3b3JkIGNoYW5nZSByZXF1ZXN0IGZvciB0aGUgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQKKwkgKiB1c2VyCisJICogCisJICogQHBhcmFtIHN0cmluZyAkbmV3UGFzc3dvcmQgVGhlIG5ldyBwYXNzd29yZCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXNlcgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VQYXNzd29yZCggJG5ld1Bhc3N3b3JkICkgeworCQlpZiAoIEFwcDo6R2V0KCktPnNldHRpbmdzWydhdXRoX2VuY3J5cHRpb25fbWV0aG9kJ10gKSB7CisJCQlyZXR1cm4gcGFyZW50OjpjaGFuZ2VQYXNzd29yZCggJG5ld1Bhc3N3b3JkLCBBcHA6OkdldCgpLT5zZXR0aW5nc1snYXV0aF9lbmNyeXB0aW9uX21ldGhvZCddICk7CisJCX0KKwkJcmV0dXJuIHBhcmVudDo6Y2hhbmdlUGFzc3dvcmQoICRuZXdQYXNzd29yZCApOworCX0KKwkKKwkvKioKKwkgKiBBdHRlbXB0IHRvIHZhbGlkYXRlIGEgY2FuZGlkYXRlIHZhbHVlIGZvciBuZXcgdXNlciBwYXNzd29yZAorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmcgJG5ld1Bhc3MgVGhlIGNhbmRpZGF0ZSBwYXNzd29yZCB2YWx1ZQorCSAqIEBwYXJhbSBzdHJpbmcgJGVuY3J5cHRpb25NZXRob2QgVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZQorCSAqLworCXB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUNoYW5nZVBhc3N3b3JkKCAkbmV3UGFzcywgJGVuY3J5cHRpb25NZXRob2QgPSAiU0hBIiApIHsKKwkJJGlzVmFsaWQgPSB0cnVlOworCQkkbWVzc2FnZXMgPSBhcnJheSgpOworCQkvLyB2YWxpZGF0ZSBydWxlcyBmcm9tIGNvbmZpZyBmaWxlCisJCSRydWxlcyA9IEFwcDo6R2V0KCktPnNldHRpbmdzWydzZWN1cml0eV9wYXNzd29yZF9ydWxlcyddOworCisJCWlmICggaXNzZXQoJHJ1bGVzKSApIHsKKwkJCWZvcmVhY2goICRydWxlcyBhcyAkcnVsZSApeworCQkJCQorCQkJCS8vIFNlcGFyYXRlIHRoZSBydWxlIGZyb20gdGhlIGVycm9yIG1lc3NhZ2UKKwkJCQlsaXN0KCRyZWd1bGFyRXhwcmVzc2lvbiwkZXJyb3JNZXNzYWdlKSA9IGV4cGxvZGUoJ3wnLCRydWxlLDIpOworCQkJCQorCQkJCS8vIFRlc3QgdGhlIHJ1bGUKKwkJCQkkcnVsZVBhc3NlZCA9IHByZWdfbWF0Y2goJHJlZ3VsYXJFeHByZXNzaW9uLCAkbmV3UGFzcyk7CisJCQkJCisJCQkJLy8gSWYgdGhlIHJ1bGUgZmFpbGVkLCBhcHBlbmQgdGhlIGVycm9yIG1lc3NhZ2UKKwkJCQlpZiAoISRydWxlUGFzc2VkKSB7CisJCQkJCSRtZXNzYWdlc1tdID0gJGVycm9yTWVzc2FnZTsKKwkJCQkJJGlzVmFsaWQgICAgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoJGlzVmFsaWQgJiYgJHRoaXMtPmNvbm5lY3QoU1NPX0xEQVBfSE9TVCxTU09fTERBUF9QT1JUKSkgeworCQkgICRyZXN1bHQgPSAkdGhpcy0+Y2hhbmdlUGFzc3dvcmQoJG5ld1Bhc3MsJGVuY3J5cHRpb25NZXRob2QpOworCQkgIHJldHVybiB0cnVlOworCQl9IGVsc2UKKwkJICByZXR1cm4gJG1lc3NhZ2VzOworCX0KKwkKKwkvKioKKwkgKiBPYnRhaW4gZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCB1c2VyLiAKKwkgKiAKKwkgKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYm90aCBhIHVzZXJuYW1lIGFuZCBhbiBhcnJheSBvZiBhdHRyaWJ1dGVzIAorCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhcmlhYmxlcyBpbiB0aGUgTERBUCB1c2VyIHJlY29yZCBmb3Igd2hpY2ggCisJICogdmFsdWVzIHNob3VsZCBiZSByZXR1cm5lZC4gCisJICogCisJICogQHBhcmFtIHN0cmluZyAkdXNlcm5hbWUgICBUaGUgdXNlcm5hbWUgdG8gb2J0YWluIGluZm9ybWF0aW9uIGZvcgorCSAqIEBwYXJhbSBhcnJheSAgJGF0dHJpYnV0ZXMgVGhlIHNldCBvZiB2YXJpYWJsZXMgdG8gcmV0dXJuIHZhbHVlcyBmb3IKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmVVc2VyQXR0cmlidXRlcyggJHVzZXJuYW1lLCAkYXR0cmlidXRlcyApIHsKKwkJJHJhd0FycmF5IAkJPSBwYXJlbnQ6OnJldHJpZXZlVXNlckF0dHJpYnV0ZXMoICR1c2VybmFtZSwgJGF0dHJpYnV0ZXMgKTsKKwkJJHVzZXJBdHRyaWJ1dGVzID0gYXJyYXkoKTsKKwkJCisJCWlmICggY291bnQoJHJhd0FycmF5KSA+IDEgKSB7CisJCQkkcmF3QXJyYXkgPSAkcmF3QXJyYXlbMF07CisJCQkvLyBHZXQgb25seSBuZWNlc3NhcnkgYXR0cmlidXRlcyB0byByZXR1cm4KKwkJCWZvcmVhY2ggKCAkcmF3QXJyYXkgYXMgJGtleT0+JGtleVZhbHVlICkgeworCQkJCWZvcmVhY2ggKCAkYXR0cmlidXRlcyBhcyAkdmFsdWUgKSB7CisJCQkJCWlmICggJGtleSA9PT0gJHZhbHVlICkgeworCQkJCQkJJHVzZXJBdHRyaWJ1dGVzWyRrZXldID0gJGtleVZhbHVlWzBdOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiAkdXNlckF0dHJpYnV0ZXM7CisJfQorCQorCS8qKgorCSAqIEFkZCBhIHVzZXIgcmVjb3JkIHRvIHRoZSBMREFQIGRpcmVjdG9yeQorCSAqIAorCSAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBpbmZvcm1hdGlvbiBhYm91dCAKKwkgKiBhIHVzZXIuIFRoZSBrZXlzIGluIHRoaXMgYXJyYXkgY29ycmVzcG9uZCB0byB0aGUgbmFtZWQgdmFyaWFibGVzCisJICogaW4gdGhlIHVzZXIgb2JqZWN0IGluIHRoZSBMREFQIGRpcmVjdG9yeS4gQXQgYSBtaW5pbXVtLCB0aGlzIAorCSAqIGFycmF5IG11c3QgY29udGFpbiBhIGtleSAndWlkJyB3aGljaCBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgdXNlcnMKKwkgKiBzbyB0aGF0IGEgcHJvcGVyIGRuIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBuZXcgdXNlci4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgJHVzZXJJbmZvIFRoZSBpbmZvcm1hdGlvbiB0byBpbmNsdWRlIGluIHRoZSByZWNvcmQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gYWRkVXNlcigkdXNlckluZm8pIHsKKwkJJGxkYXBjb25uID0gJHRoaXMtPmNvbm5lY3QoU1NPX0xEQVBfSE9TVCxTU09fTERBUF9QT1JUKTsKKwkJaWYgKCRsZGFwY29ubikgeworCQkJJHVzZXIgID0gInVpZD17JHVzZXJJbmZvWyAidWlkIiBdfSwiIC4gU1NPX0JBU0VfRE47CisJCQlyZXR1cm4gbGRhcF9hZGQoJGxkYXBjb25uLCR1c2VyLCR1c2VySW5mbyk7CisJCX0KKwkJLy8gY29ubmVjdGlvbiBmYWlsZWQKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCB1c2VybmFtZSBpcyBhdmFpbGFibGUKKwkgKiAKKwkgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHZhbHVlIG9mIHRoZSBjb25maWcgc2V0dGluZyAndXNlcm5hbWVfYXR0cicgd2hlbgorCSAqIGRldGVybWluaW5nIHdoaWNoIGtleSBpbiB0aGUgTERBUCB1c2VyIHJlY29yZCB0byB1c2UgYXMgdGhlIHVzZXJuYW1lCisJICogYXR0cmlidXRlLiAKKwkgKiAKKwkgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gdGVzdCBmb3IgYXZhaWxhYmlsaXR5CisJICovCisJcHVibGljIGZ1bmN0aW9uIHVzZXJuYW1lQXZhaWxhYmlsaXR5KCAkdXNlcm5hbWUgKSB7CisJCSRqdXN0dGhlc2UgPSBhcnJheSggQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3VzZXJuYW1lX2F0dHInXSApOworCQkkcHJvZmlsZSA9ICR0aGlzLT5yZXRyaWV2ZVVzZXJBdHRyaWJ1dGVzKCR1c2VybmFtZSwgJGp1c3R0aGVzZSk7CisJCWlmIChjb3VudCgkcHJvZmlsZSkgPiAwKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQkvLyBhdmFpbGFibGUKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCQorCS8qKgorCSAqIFVwZGF0ZSBhbiBleGlzdGluZyB1c2VyIHByb2ZpbGUgd2l0aCBuZXcgaW5mb3JtYXRpb24KKwkgKiAKKwkgKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBuYW1lZCBrZXkvdmFsdWUKKwkgKiBwYWlycy4gVGhlIGtleXMgaW4gdGhpcyBhcnJheSBjb3JyZXNwb25kIHRvIHRoZSBuYW1lZCB2YXJpYWJsZXMKKwkgKiBpbiB0aGUgdXNlciBvYmplY3QgaW4gdGhlIExEQVAgZGlyZWN0b3J5LiBUaGUgZnVuY3Rpb24gY2FuIG9ubHkgdXBkYXRlCisJICogdGhlIHJlY29yZCBmb3IgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuCisJICogCisJICogQHBhcmFtIGFycmF5ICRuZXdJbmZvIFRoZSB1cGRhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlcidzIHByb2ZpbGUKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZSgkbmV3SW5mbykgeworCisJCWlmICgkdGhpcy0+aXNMb2dnZWRJbigpKSB7CisJCQkkdXNlciAgPSAidWlkPXskdGhpcy0+Z2V0Q3VycmVudFVzZXJuYW1lKCl9LCIgLiBTU09fQkFTRV9ETiA7CisJCQkkbGRhcGNvbm4gPSAkdGhpcy0+Y29ubmVjdChTU09fTERBUF9IT1NULFNTT19MREFQX1BPUlQpOworCQkJCisJCQlpZiAobGRhcF9tb2RfcmVwbGFjZSgkbGRhcGNvbm4sJHVzZXIsJG5ld0luZm8pKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvY2xhc3Nlcy9MREFQQXV0aG9yaXphdGlvblByb3ZpZGVyLmNsYXNzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvY2xhc3Nlcy9MREFQQXV0aG9yaXphdGlvblByb3ZpZGVyLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM5NWZiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9jbGFzc2VzL0xEQVBBdXRob3JpemF0aW9uUHJvdmlkZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsMTEzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogTERBUEF1dGhvcml6YXRpb25Qcm92aWRlcgorICogCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPT0RUIEJhbGFuY2UgQXBwbGljYXRpb24gCisgKiBBdXRob3JpemF0aW9uIFByb3ZpZGVyIGludGVyZmFjZSB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgTGlnaHR3ZWlnaHQKKyAqIERpcmVjdG9yeSBBY2Nlc3MgUHJvdG9jb2wgKExEQVApLgorICogCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZnVuY3Rpb25zIGF2YWlsYWJsZSBoZXJlLCBjb25zdWx0IHRoZQorICogT09EVCBCYWxhbmNlIEFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25Qcm92aWRlciBpbnRlcmZhY2UgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIHMua2h1ZGlreWFuCisgKiBAYXV0aG9yIGFoYXJ0CisgKiAKKyAqLworCitjbGFzcyBMREFQQXV0aG9yaXphdGlvblByb3ZpZGVyIAorCWltcGxlbWVudHMgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25BdXRob3JpemF0aW9uUHJvdmlkZXIgeworCisJCisJLy8gVGhlIExEQVAgc2VydmVyIG5hbWUKKwlwcm90ZWN0ZWQgJGxkYXBIb3N0OworCQorCS8vIFRoZSBwb3J0IG9uIHdoaWNoIHRoZSBMREFQIHNlcnZlciBsaXN0ZW5zCisJcHJvdGVjdGVkICRsZGFwUG9ydDsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKKwkJCisJCS8vIFNldCBMREFQIGNvbnN0YW50cworCQlkZWZpbmUoIkFVVEhfQkFTRV9ETiIsICAgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2F1dGhvcml6YXRpb25fbGRhcF9iYXNlX2RuJ10pOworCQlkZWZpbmUoIkFVVEhfR1JPVVBTX0ROIiwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2F1dGhvcml6YXRpb25fbGRhcF9ncm91cF9kbiddKTsKKwkJZGVmaW5lKCJBVVRIX0xEQVBfSE9TVCIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2xkYXBfaG9zdCddKTsKKwkJZGVmaW5lKCJBVVRIX0xEQVBfUE9SVCIsIEFwcDo6R2V0KCktPnNldHRpbmdzWydhdXRob3JpemF0aW9uX2xkYXBfcG9ydCddKTsKKwkJCisJCSR0aGlzLT5sZGFwSG9zdCA9IEFVVEhfTERBUF9IT1NUOworCQkkdGhpcy0+bGRhcFBvcnQgPSBBVVRIX0xEQVBfUE9SVDsKKwl9CisJCisJLyoqCisJICogT2J0YWluIHRoZSBncm91cHMvcm9sZXMgZm9yIHRoZSBjdXJyZW50IHVzZXJuYW1lCisJICogCisJICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB7JHNlYXJjaERpcmVjdG9yeX0gZm9yIGdyb3VwT2ZVbmlxdWVOYW1lIG9iamVjdHMgd2hvc2UKKwkgKiB1bmlxdWVNZW1iZXIgYXR0cmlidXRlIGNvbnRhaW5zIHskdXNlcm5hbWV9LiBUaGUgY24gYXR0cmlidXRlIG9mIGFsbCBtYXRjaGluZworCSAqIGdyb3VwcyBpcyByZXR1cm5lZCBhcyBhIG51bWVyaWMgYXJyYXkuCisJICogCisJICogQHBhcmFtIHN0cmluZyAkdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHRlc3QgZm9yLiBOb3RlIHRoYXQganVzdCB0aGUgdXNlcm5hbWUgCisJICogICAgICAgICAgICAgICAgICAgICAgICAgcG9ydGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLCBhcyBib3RoICd1aWQ9JyBhbmQgQVVUSF9CQVNFX0ROCisJICogICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGFkZGVkIHRvIHRoZSB2YWx1ZSBiZWZvcmUgc2VhcmNoaW5nLgorCSAqIEBwYXJhbSBzdHJpbmcgJHNlYXJjaERpcmVjdG9yeSBUaGUgZnVsbHkgcXVhbGlmaWVkIEROIChlLmcuOiBvdT1zeXN0ZW0sb3U9Z3JvdXBzKQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBMREFQIGRpcmVjdG9yeSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIGdyb3VwcworCSAqLworCXB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZUdyb3Vwc0ZvclVzZXIoJHVzZXJuYW1lLCRzZWFyY2hEaXJlY3RvcnkgPSBBVVRIX0dST1VQU19ETikgeworCQkKKwkJLy8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGxkYXAgc2VydmVyIAorCQkkbGRhcGNvbm4gPSAkdGhpcy0+Y29ubmVjdChBVVRIX0xEQVBfSE9TVCxBVVRIX0xEQVBfUE9SVCk7CisJCSRncm91cHMgICA9IGFycmF5KCk7CisJCWlmICgkbGRhcGNvbm4pIHsKKwkJCSRmaWx0ZXIgPSAiKCYob2JqZWN0Q2xhc3M9Z3JvdXBPZlVuaXF1ZU5hbWVzKSIKKwkJCQkuIih1bmlxdWVNZW1iZXI9dWlkPXskdXNlcm5hbWV9LCIgLiBBVVRIX0JBU0VfRE4gLiAiKSkiOworCQkJJHJlc3VsdCA9IGxkYXBfc2VhcmNoKCRsZGFwY29ubiwkc2VhcmNoRGlyZWN0b3J5LCRmaWx0ZXIsYXJyYXkoJ2NuJykpOworCQkJCisJCQlpZiAoJHJlc3VsdCkgeworCQkJCSRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkbGRhcGNvbm4sJHJlc3VsdCk7CisJCQkJZm9yZWFjaCAoJGVudHJpZXMgYXMgJHJhd0dyb3VwKSB7CisJCQkJCWlmIChpc3NldCgkcmF3R3JvdXBbJ2NuJ11bMF0pIAorCQkJCQkmJiAkcmF3R3JvdXBbJ2NuJ11bMF0gIT0gJycpIHsKKwkJCQkJCSRncm91cHNbXSA9ICRyYXdHcm91cFsnY24nXVswXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSAKKwkJcmV0dXJuICRncm91cHM7CisJfQorCQkJCisJLyoqCisJICogQ29ubmVjdCB0byB0aGUgTERBUCBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgpIHsKKwkJaWYgKCRjb25uID0gbGRhcF9jb25uZWN0KCR0aGlzLT5sZGFwSG9zdCwkdGhpcy0+bGRhcFBvcnQpKSB7CisJCQkKKwkJCS8vIENvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwkJCSR0aGlzLT5jb25uZWN0aW9uU3RhdHVzID0gMTsKKwkJCWxkYXBfc2V0X29wdGlvbigkY29ubiwgTERBUF9PUFRfUFJPVE9DT0xfVkVSU0lPTiwgMyk7CisJCQlsZGFwX3NldF9vcHRpb24oJGNvbm4sIExEQVBfT1BUX0RFQlVHX0xFVkVMLCA3KTsKKwkJCWxkYXBfc2V0X29wdGlvbigkY29ubiwgTERBUF9PUFRfUkVGRVJSQUxTLCAwKTsJCisJCQkkdGhpcy0+Y29ubiA9ICRjb25uOworCQkJcmV0dXJuICRjb25uOworCQl9IGVsc2UgeworCQkJLy8gQ29ubmVjdGlvbiBmYWlsZWQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0JCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvY2xhc3Nlcy9OdWxsQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL2NsYXNzZXMvTnVsbEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDlkMTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL2NsYXNzZXMvTnVsbEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsOTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKy8qKgorICogTnVsbEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIKKyAqIAorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGlBcHBsaWNhdGlvbkF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgaW50ZXJmYWNlIHdpdGgKKyAqIG5vIGV4dGVybmFsIGRlcGVuZGVuY2llcyAoYW5kIGFsc28gbGltaXRlZCBmdW5jdGlvbmFsaXR5KSBpbnRlbmRlZCB0byBiZSB1c2VkCisgKiBhcyBhIGRldmVsb3BtZW50IHRvb2wgZm9yIHF1aWNrbHkgdGVzdGluZyBhbmQgZGVidWdnaW5nIGFwcGxpY2F0aW9ucyB3aXRob3V0CisgKiBoYXZpbmcgdG8gc2V0IHVwIGRldGFpbGVkIGF1dGgmYXV0aCBkZXBlbmRlbmNpZXMuIAorICogCisgKiBUaGlzIGNsYXNzIHV0aWxpemVzIHRoZSBQSFAgU2Vzc2lvbiBjb25zdHJ1Y3QgZm9yIHN0b3JpbmcgYSBwcm92aWRlZCB1c2VybmFtZS4KKyAqIEFueSB1c2VybmFtZSAvIHBhc3N3b3JkIGNvbWJpbmF0aW9uIGlzIHRyZWF0ZWQgYXMgdmFsaWQuCisgKiAKKyAqLworY2xhc3MgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfUHJvdmlkZXJzX0F1dGhlbnRpY2F0aW9uX051bGxBdXRoZW50aWNhdGlvblByb3ZpZGVyCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgeworCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkge30KKwkKKwlwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBkaXNjb25uZWN0KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIGlzTG9nZ2VkSW4oKSB7CisJCXJldHVybiBpc3NldCgkX1NFU1NJT05bJ19hdXRoJ10pOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICkgeworICAgICAgICAkX1NFU1NJT05bJ19hdXRoJ10gPSBhcnJheSgKKyAgICAgICAgICAgICd1c2VybmFtZScgPT4gJHVzZXJuYW1lCisgICAgICAgICk7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBsb2dvdXQoKSB7IAorICAgICAgICB1bnNldCgkX1NFU1NJT05bJ19hdXRoJ10pOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50VXNlcm5hbWUoKSB7CisJCXJldHVybiAoJHRoaXMtPmlzTG9nZ2VkSW4oKSkKKyAgICAgICAgICAgID8gJF9TRVNTSU9OWydfYXV0aCddWyd1c2VybmFtZSddCisgICAgICAgICAgICA6IGZhbHNlOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gY2hhbmdlUGFzc3dvcmQoICRuZXdQYXNzd29yZCApIHsKKwkgICAgICAgcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUNoYW5nZVBhc3N3b3JkKCAkbmV3UGFzcywgJGVuY3J5cHRpb25NZXRob2QgPSAiU0hBIiApIHsKKwkgICAgICAgcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZVVzZXJBdHRyaWJ1dGVzKCAkdXNlcm5hbWUsICRhdHRyaWJ1dGVzICkgeworCQlyZXR1cm4gKCR0aGlzLT5pc0xvZ2dlZEluKCkpCisgICAgICAgICAgICA/IGFycmF5KAorCQkgICAgICAgImNuIiAgICAgICAgPT4gJHRoaXMtPmdldEN1cnJlbnRVc2VybmFtZSgpLAorCQkgICAgICAgImdpdmVubmFtZSIgPT4gJHRoaXMtPmdldEN1cnJlbnRVc2VybmFtZSgpLAorCQkgICAgICAgInNuIiAgICAgICAgPT4gJycsCisJCSAgICAgICAidWlkIiAgICAgICA9PiAkdGhpcy0+Z2V0Q3VycmVudFVzZXJuYW1lKCksCisJCSAgICAgICAibWFpbCIgICAgICA9PiAnZ3Vlc3RAZXhhbXBsZS5vcmcnCisJCSAgICApCisgICAgICAgICAgICA6IGZhbHNlOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gYWRkVXNlcigkdXNlckluZm8pIHsKKwkgICAgICAgcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gdXNlcm5hbWVBdmFpbGFiaWxpdHkoICR1c2VybmFtZSApIHsKKwkgICAgICAgcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZSgkbmV3SW5mbykgeworCSAgICAgICByZXR1cm4gZmFsc2U7CisKKwl9CQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9jbGFzc2VzL051bGxBdXRob3JpemF0aW9uUHJvdmlkZXIuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9jbGFzc2VzL051bGxBdXRob3JpemF0aW9uUHJvdmlkZXIuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGEyMjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL2NsYXNzZXMvTnVsbEF1dGhvcml6YXRpb25Qcm92aWRlci5jbGFzcy5waHAKQEAgLTAsMCArMSw0NSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIE51bGxBdXRob3JpemF0aW9uUHJvdmlkZXIKKyAqIAorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGlBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlciBpbnRlcmZhY2Ugd2l0aAorICogbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIChhbmQgYWxzbyBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkpIGludGVuZGVkIHRvIGJlIHVzZWQKKyAqIGFzIGEgZGV2ZWxvcG1lbnQgdG9vbCBmb3IgcXVpY2tseSB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcgYXBwbGljYXRpb25zIHdpdGhvdXQKKyAqIGhhdmluZyB0byBzZXQgdXAgZGV0YWlsZWQgYXV0aCZhdXRoIGRlcGVuZGVuY2llcy4gCisgKiAKKyAqIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFsbCB1c2VybmFtZXMsIGluZGljYXRpbmcgdGhhdCAKKyAqIHRoZSB1c2VyIGlzIG5vdCBwYXJ0IG9mIGFueSBncm91cHMvcm9sZXMuCisgKiAKKyAqLworY2xhc3MgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfUHJvdmlkZXJzX0F1dGhvcml6YXRpb25fTnVsbEF1dGhvcml6YXRpb25Qcm92aWRlcgoraW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlciB7CisKKwlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CisKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmVHcm91cHNGb3JVc2VyKCR1c2VybmFtZSkgeworCQlyZXR1cm4gYXJyYXkoKTsKKwl9CisJCQorCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL2NvbmZpZy5pbmkgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL2NvbmZpZy5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1ZTI0ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvY29uZmlnLmluaQpAQCAtMCwwICsxLDE4MCBAQAorIDsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgOyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyA7IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyA7IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgOyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIDsgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyA7CisgOyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgOworIDsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIDsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyA7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIDsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIDsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgCisKKzsgUHJvZmlsZSBtb2R1bGUgY29uZmlndXJhdGlvbiBmaWxlCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBUaGUgUHJvZmlsZSBtb2R1bGUgc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBtYW5hZ2luZyB1c2VycyBvZiB5b3VyIHdlYiAKKzsgYXBwbGljYXRpb24uIFRoZSBwcmltYXJ5IHVzZSBjYXNlIGZvciB0aGlzIG1vZHVsZSBpbnZvbHZlcyBhdXRoZW50aWNhdGlvbgorOyBhbmQgYXV0aG9yaXphdGlvbiB1c2luZyBMREFQLCBhbHRob3VnaCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gc3VwcG9ydCAKKzsgYWRkaXRpb25hbCBiYWNrLWVuZHMgd2l0aCBtb2RlcmF0ZSBjdXN0b21pemF0aW9uLgorOworCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IFBST0ZJTEUgQVVUSEVOVElDQVRJT04gU0VUVElOR1MKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Cis7IFJlc3BvbnNpYmlsaXR5IGZvciBhdXRoZW50aWNhdGlvbiBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGNsYXNzIHNwZWNpZmllZCBoZXJlLgorOyBUaGUgb25seSByZXF1aXJlbWVudCBvZiB0aGUgZGVsZWdhdGVkIGNsYXNzIGlzIHRoYXQgaXQgaW1wbGVtZW50IHRoZSAKKzsgT3JnX0FwYWNoZV9Pb2R0X0JhbGFuY2VfSW50ZXJmYWNlc19JQXBwbGljYXRpb25BdXRoZW50aWNhdGlvblByb3ZpZGVyIAorOyBpbnRlcmZhY2UuCis7Cis7IFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgZGVmaW5lIGJvdGggdGhlIGNsYXNzIG5hbWUgKGF1dGhlbnRpY2F0aW9uX2NsYXNzKSBhbmQKKzsgdGhlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgY2xhc3MgaXRzZWxmIChhdXRoZW50aWNhdGlvbl9jbGFzc19wYXRoKS4gQm90aCAKKzsgYXJlIHJlcXVpcmVkIGZvciBhdXRoZW50aWNhdGlvbiB0byBmdW5jdGlvbi4gCis7Cis7IFRpcDogV2hlbiBzcGVjaWZ5aW5nIHRoZSBhdXRoZW50aWNhdGlvbl9jbGFzc19wYXRoLCB0aGUgdG9rZW4gW01PRFVMRV9QQVRIXSAKKzsgd2lsbCBiZSBleHBhbmRlZCB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBtb2R1bGUgKGkuZS46IHRoZSBsb2NhdGlvbiBvZiAKKzsgdGhpcyBmaWxlKQorOworOyBJZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgcmVxdWlyZWQsIGJvdGggb2YgdGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIGJlIGxlZnQgCis7IGJsYW5rLgorOworYXV0aGVudGljYXRpb25fY2xhc3MgICAgICA9IExEQVBBdXRoZW50aWNhdGlvblByb3ZpZGVyCithdXRoZW50aWNhdGlvbl9jbGFzc19wYXRoID0gW01PRFVMRV9QQVRIXS9jbGFzc2VzL0xEQVBBdXRoZW50aWNhdGlvblByb3ZpZGVyLmNsYXNzLnBocAorCisKKzsgTERBUCBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIgY29ubmVjdGlvbiBkZXRhaWxzCitsZGFwX2hvc3QgICAgICAgICAgICA9ICJob3N0IgorbGRhcF9wb3J0ICAgICAgICAgICAgPSA2ODYKK2xkYXBfYmFzZV9kbiAgICAgICAgID0gImRjPXBlb3BsZSxkYz1wcm9qZWN0IgorY29va2llX2tleSAgICAgICAgICAgPSAiX19hY19fc2NfXyIKKworCis7IEVuY3J5cHRpb24gbWV0aG9kIHVzZWQgdG8gZW5jcnlwdCB1c2VyIHBhc3N3b3JkcyAKKzsgU3VwcG9ydGVkIG9wdGlvbnMgYXJlOgorOyAJCTEuIFNIQQorOyAJCTIuIE1ENQorYXV0aF9lbmNyeXB0aW9uX21ldGhvZCAJPSBTSEEKKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyBQUk9GSUxFIEFVVEhPUklaQVRJT04gU0VUVElOR1MKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Cis7IFJlc3BvbnNpYmlsaXR5IGZvciBhdXRob3JpemF0aW9uIGlzIGRlbGVnYXRlZCB0byB0aGUgY2xhc3Mgc3BlY2lmaWVkIGhlcmUuIAorOyBUaGUgb25seSByZXF1aXJlbWVudCBvZiB0aGUgZGVsZWdhdGVkIGNsYXNzIGlzIHRoYXQgaXQgaW1wbGVtZW50IHRoZQorOyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbkF1dGhvcml6YXRpb25Qcm92aWRlcgorOyBpbnRlcmZhY2UuIAorOworOyBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGRlZmluZSBib3RoIHRoZSBjbGFzcyBuYW1lIChhdXRob3JpemF0aW9uX2NsYXNzKSBhbmQKKzsgdGhlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgY2xhc3MgaXRzZWxmIChhdXRob3JpemF0aW9uX2NsYXNzX3BhdGgpLiBCb3RoIAorOyBhcmUgcmVxdWlyZWQgZm9yIGF1dGhlbnRpY2F0aW9uIHRvIGZ1bmN0aW9uLiAKKzsKKzsgVGlwOiBXaGVuIHNwZWNpZnlpbmcgdGhlIGF1dGhvcml6YXRpb25fY2xhc3NfcGF0aCwgdGhlIHRva2VuIFtNT0RVTEVfUEFUSF0gCis7IHdpbGwgYmUgZXhwYW5kZWQgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgbW9kdWxlIChpLmUuOiB0aGUgbG9jYXRpb24KKzsgb2YgdGhpcyBmaWxlKQorOworOyBJZiBhdXRob3JpemF0aW9uIGlzIG5vdCByZXF1aXJlZCwgYm90aCBvZiB0aGVzZSBzZXR0aW5ncyBzaG91bGQgYmUgbGVmdCAKKzsgYmxhbmsuCis7CithdXRob3JpemF0aW9uX2NsYXNzCQkgPSBMREFQQXV0aG9yaXphdGlvblByb3ZpZGVyCithdXRob3JpemF0aW9uX2NsYXNzX3BhdGggPSBbTU9EVUxFX1BBVEhdL2NsYXNzZXMvTERBUEF1dGhvcml6YXRpb25Qcm92aWRlci5jbGFzcy5waHAKKworCis7IExEQVAgYXV0aG9yaXphdGlvbiBmaWx0ZXIgZGV0YWlscworYXV0aG9yaXphdGlvbl9sZGFwX2ZpbHRlciA9ICcmKG9iamVjdENsYXNzPWdyb3VwT2ZVbmlxdWVOYW1lcyknCithdXRob3JpemF0aW9uX2xkYXBfZmlsdGVyX3VzZXJpZCA9ICd1bmlxdWVNZW1iZXI9dWlkJworCis7IExEQVAgYXV0aG9yaXphdGlvbiBzZXJ2ZXIgY29ubmVjdGlvbiBkZXRhaWxzCithdXRob3JpemF0aW9uX2xkYXBfaG9zdCAgICAgICAgICAgID0gJ2hvc3QnCithdXRob3JpemF0aW9uX2xkYXBfcG9ydCAgICAgICAgICAgID0gNjg2CithdXRob3JpemF0aW9uX2xkYXBfYmFzZV9kbiAgICAgICAgID0gJ2RjPXBlb3BsZSxkYz1wcm9qZWN0JworYXV0aG9yaXphdGlvbl9sZGFwX2dyb3VwX2RuICAgICAgICA9ICdkYz1ncm91cCxkYz1wcm9qZWN0JworYXV0aG9yaXphdGlvbl9jb29raWVfa2V5ICAgICAgICAgICA9ICdfX2FjX19zY19fJworCis7IFBhZ2UgdG8gcmVkaXJlY3QgdXNlcnMgdG8gd2hlbiBhdXRob3JpemF0aW9uIGlzIHJlcXVpcmVkCithdXRob3JpemF0aW9uX3JlZGlyZWN0X3VybCA9IFtNT0RVTEVfUk9PVF0vbG9naW4KKworCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IFBST0ZJTEUgQVRUUklCVVRFIFNFVFRJTkdTCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyBVc2VyIHByb2ZpbGVzIGNvbnNpc3Qgb2YgdmFyaW91cyBhdHRyaWJ1dGVzIChuYW1lLCB0ZWxlcGhvbmUsIGVtYWlsLCBldGMuKS4KKzsgVGhpcyBzZWN0aW9uIGRlZmluZXMgdGhlIGF0dHJpYnV0ZXMgdGhhdCB0aGUgcHJvZmlsZSB3aWxsIGV4cG9zZS4KKworOyBBdHRyaWJ1dGUgTWFwcGluZworOyBUaGUgcHJvZmlsZSBtb2R1bGUgbmF0aXZlbHkgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBwcm9maWxlIGF0dHJpYnV0ZXMsIAorOyB3aGljaCBhcmUgd2lkZWx5IGFwcGxpY2FibGUgYWNyb3NzIHByb2plY3RzLiBUaGlzIHNlY3Rpb24gZGVmaW5lcyBhIG1hcHBpbmcKKzsgYmV0d2VlbiB0aGVzZSBwcm9maWxlIGF0dHJpYnV0ZXMgYW5kIHlvdXIgc3BlY2lmaWMgZW52aXJvbm1lbnQuIAorOworOyBjb21tb25uYW1lX2F0dHI6IFRoZSBjb21tb24gbmFtZSBvZiB0aGUgdXNlciAodXN1YWxseSBmaXJzdCBhbmQgbGFzdCBuYW1lKQorY29tbW9ubmFtZV9hdHRyID0gY24KKzsgZmlyc3RuYW1lX2F0dHI6IFRoZSBmaXJzdCAoZ2l2ZW4pIG5hbWUgb2YgdGhlIHVzZXIKK2ZpcnN0bmFtZV9hdHRyICA9IGdpdmVubmFtZQorOyBsYXN0bmFtZV9hdHRyOiBUaGUgbGFzdCAoc3VybmFtZSkgbmFtZSBvZiB0aGUgdXNlcgorbGFzdG5hbWVfYXR0ciAgID0gc24KKzsgdXNlcm5hbWVfYXR0cjogVGhlIHVuaXF1ZSBpZC9uYW1lIG9mIHRoZSB1c2VyCit1c2VybmFtZV9hdHRyICAgPSB1aWQKKzsgZW1haWxfYXR0cjogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXIKK2VtYWlsX2F0dHIgICAgICA9IG1haWwKKworOyBWaXNpYmxlIEF0dHJpYnV0ZXMKKzsgVGhlIHByb2ZpbGUgbW9kdWxlIHdpbGwgZXhwb3NlIHRoZSBwcm9maWxlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGhlcmUuIAorOyBUaGVzZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGlzcGxheWVkIGZvciB0aGUgdXNlciB0byB2aWV3LgorOyAKKzsgU3BlY2lmeSB0aGUgcHJvZmlsZSBhdHRyaWJ1dGVzIHRvIGV4cG9zZSBoZXJlOgorcHJvZmlsZV9hdHRyaWJ1dGVzW10gPSBnaXZlbm5hbWUKK3Byb2ZpbGVfYXR0cmlidXRlc1tdID0gc24KK3Byb2ZpbGVfYXR0cmlidXRlc1tdID0gdWlkCitwcm9maWxlX2F0dHJpYnV0ZXNbXSA9IG1haWwKKworOyBBdHRyaWJ1dGVzIGFsbG93ZWQgdG8gbW9kaWZ5Cis7IFRoZSBwcm9maWxlIG1vZHVsZSB3aWxsIGV4cG9zZSB0aGUgcHJvZmlsZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCBoZXJlLiAKKzsgVGhlc2UgYXR0cmlidXRlcyB3aWxsIGJlIGRpc3BsYXllZCBmb3IgdGhlIHVzZXIgdG8gdmlldyBhbmQgdGhlIHVzZXIgCis7IHdpbGwgYmUgYWxsb3dlZCB0byBjaGFuZ2UgdmFsdWVzIGluIHRoZSBsZGFwIGRpcmVjdG9yeS4KKzsgCis7IFNwZWNpZnkgdGhlIHByb2ZpbGUgYXR0cmlidXRlcyB0byBtb2RpZnkgaGVyZToKK3Byb2ZpbGVfbW9kaWZ5X2F0dHJpYnV0ZXNbXSA9IGdpdmVubmFtZQorcHJvZmlsZV9tb2RpZnlfYXR0cmlidXRlc1tdID0gc24KK3Byb2ZpbGVfbW9kaWZ5X2F0dHJpYnV0ZXNbXSA9IG1haWwKKworOyBXaGVuIGRpc3BsYXlpbmcgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGFib3ZlLCBhIGh1bWFuIHJlYWRhYmxlIGxhYmVsIGNhbgorOyBiZSBkZWZpbmVkLiBUaGlzIHdpbGwgaGVscCB1c2VycyBiZXR0ZXIgdW5kZXJzdGFuZCB3aGljaCB2YWx1ZXMgdGhleSBhcmUKKzsgc2VlaW5nIGFuZC9vciBtb2RpZnlpbmcuIAorOworOyBTcGVjaWZ5IGFuIGF0dHJpYnV0ZS10by1sYWJlbCBtYXBwaW5nIGZvciBlYWNoIG9mIHRoZSBhYm92ZSBhdHRyaWJ1dGVzIGhlcmU6CithdHRyX3RpdGxlc1sgJ0ZpcnN0IG5hbWUnIF0gPSBnaXZlbm5hbWUKK2F0dHJfdGl0bGVzWyAnTGFzdCBuYW1lJyBdICA9IHNuCithdHRyX3RpdGxlc1sgJ1VzZXJuYW1lJyBdICAgPSB1aWQKK2F0dHJfdGl0bGVzWyAnRW1haWwnIF0gICAgICA9IG1haWwKKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyBQQVNTV09SRCBWQUxJREFUSU9OIFNFVFRJTkdTCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyBJbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBhcmUgcmVxdWlyZW1lbnRzIHRoYXQgZGVmaW5lIGEgdmFsaWQgcGFzc3dvcmQsIHRoZXkKKzsgY2FuIGJlIHNwZWNpZmllZCBoZXJlIGFzIGFuIGFycmF5IG9mICd0ZXN0cycuIFRoZXNlIHRlc3RzIHdpbGwgYmUgaW52b2tlZAorOyB3aGVuZXZlciB0aGUgdXNlciBhdHRlbXB0cyB0byBzZXQgLyBjaGFuZ2UgaGlzIG9yIGhlciBwYXNzd29yZC4KKzsKKzsgVGhlIGdlbmVyYWwgZm9ybWF0IG9mIHRoZXNlIHJ1bGVzIGlzIGEgcmVndWxhciBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGEKKzsgcGlwZSAofCkgZm9sbG93ZWQgYnkgdGhlIGh1bWFuLXJlYWRhYmxlIGV4Y2VwdGlvbiB0byBkaXNwbGF5IHdoZW4gYSBwYXNzd29yZAorOyBmYWlscyB0byB2YWxpZGF0ZS4KKzsgCis7IEVYQU1QTEVTOgorOyAtIFRvIHJlcXVpcmUgcGFzc3dvcmRzIHdpdGggbGVuZ3RoIG9mIDUgb3IgZ3JlYXRlcjoKKzsgICBzZWN1cml0eV9wYXNzd29yZF9ydWxlc1tdID0gIi8uezUsfS98UGFzc3dvcmQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIDUgb3IgZ3JlYXRlciIKKzsgLSBUbyBlbmZvY2UgdGhlIHByZXNlbmNlIG9mIGF0IGxlYXN0IG9uZSB1cHBlcmNhc2UgbGV0dGVyCis7ICAgc2VjdXJpdHlfcGFzc3dvcmRfcnVsZXNbXSA9ICIvW0EtWl0rL3xQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHVwcGVyY2FzZSBsZXR0ZXIiCis7Cis7IFRoZSBzZWN1cml0eSBydWxlcyB3aWxsIGJlIGVuZm9yY2VkIGluIHNlcmllcywgYW5kIHByb2Nlc3Npbmcgd2lsbCBoYWx0Cis7IGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlLgorOworc2VjdXJpdHlfcGFzc3dvcmRfcnVsZXNbXSA9CisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9ob29rcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL2hvb2tzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzY2YzgxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9ob29rcy5waHAKQEAgLTAsMCArMSw5MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBIT09LUy5QSFAKKyAqIAorICogSG9va3MgcHJvdmlkZSB0aGUgYWJpbGl0eSwgYXMgdGhlIG5hbWUgaW1wbGllcywgdG8gaG9vayBpbnRvIHZhcmlvdXMgcGFydHMgb2YgCisgKiB0aGUgdmlldyByZW5kZXJpbmcgcHJvY2VzcyBhbmQgaW5zZXJ0IGN1c3RvbWl6YXRpb25zLiBUaGUgY29udGVudHMgb2YgdGhlc2UgCisgKiBmdW5jdGlvbnMgYXJlIHJ1biBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZSAqRVZFUlkqIHRpbWUgYSB2aWV3IGlzIHJlbmRlcmVkLCBpLmUuCisgKiB0aGUgY29udGVudCBvZiB0aGUgaG9va3MgaXMgbm90IGJ5IGRlZmF1bHQgdmlldy1zcGVjaWZpYyBidXQgcmF0aGVyIHdpbGwgYmUgCisgKiBhcHBsaWVkIHRvIGFsbCB2aWV3cy4gKEhvd2V2ZXIsIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBwcmV2ZW50cyBkZXZlbG9wZXJzIGZyb20gCisgKiBpbnNlcnRpbmcgY29uZGl0aW9uYWwgbG9naWMgaW5zaWRlIGEgaG9vayB0aGF0IHRoZW4gY2F1c2VzIHZpZXctc3BlY2lmaWMKKyAqIHRoZW0gdG8gZXhoaWJpdCB2aWV3LXNwZWNpZmljIGJlaGF2aW9yKS4KKyAqIAorICogQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgYSBob29rIHRoYXQgYWRkcyB0aGUgYW1vdW50IG9mIHRpbWUgQmFsYW5jZSB0b29rIHRvIHJlbmRlcgorICogdGhlIHBhZ2UgYXMgYW4gaW5saW5lIEhUTUwgY29tbWVudCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggcGFnZSBhZnRlciBpdCBoYXMgYmVlbiBzZW50OgorICogCisgKiBmdW5jdGlvbiBob29rX2FmdGVyX3NlbmQoKSB7CisgKiAgICAgJHRpbWVTdGFydCA9ICRHTE9CQUxTWydiYWxhbmNlX3JlcXVlc3Rfc3RhcnQnXTsKKyAqICAgICAkdGltZU5vdyAgID0gbWljcm90aW1lKHRydWUpOworICogICAgICRlbGFwc2VkICAgPSAkdGltZU5vdyAtICR0aW1lU3RhcnQ7CisgKiAgICAgZWNobyAiPCEtLSBwYWdlIHJlbmRlcmVkIGluIHskZWxhcHNlZH0gc2Vjb25kcyAtLT4iOworICogfQorICogCisgKiAKKyAqIFRha2UgYSBsb29rIGF0IHRoZSBkb2NibG9jayBkZXNjcmlwdGlvbnMgb2YgZWFjaCBob29rIHRvIGdldCBhIHNlbnNlIG9mIHdoZXJlCisgKiBpbiB0aGUgdmlldyByZW5kZXJpbmcgcHJvY2VzcyB0aGUgaG9vayBpcyBpbnZva2VkLgorICogCisgKi8KKworLyoqCisgKiBob29rX2JlZm9yZV9oZWFkZXIKKyAqIAorICogVGhpcyBob29rIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgY29udGVudHMgb2YgdGhlIGhlYWRlciBmaWxlIGFyZSBwcm9jZXNzZWQuCisgKi8KK2Z1bmN0aW9uIGhvb2tfYmVmb3JlX2hlYWRlcigpIHt9CisKKy8qKgorICogaG9va19iZWZvcmVfdmlldworICogCisgKiBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBjb250ZW50cyBvZiB0aGUgbWFpbiB2aWV3IGFyZSBwcm9jZXNzZWQuCisgKi8KK2Z1bmN0aW9uIGhvb2tfYmVmb3JlX3ZpZXcoKSB7CisJJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKwlBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkU3R5bGVzaGVldCgkbW9kdWxlLT5tb2R1bGVTdGF0aWMuJy9jc3MvcHJvZmlsZS5jc3MnKTsKK30KKworLyoqCisgKiBob29rX2JlZm9yZV9mb290ZXIKKyAqIAorICogVGhpcyBob29rIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgY29udGVudHMgb2YgdGhlIGZvb3RlciBhcmUgcHJvY2Vzc2VkCisgKi8KK2Z1bmN0aW9uIGhvb2tfYmVmb3JlX2Zvb3RlcigpIHt9CisKKy8qKgorICogaG9va19iZWZvcmVfc2VuZAorICogCisgKiBUaGlzIGhvb2sgaXMgYWZ0ZXIgYWxsIG9mIHRoZSB2aWV3IGNvbXBvbmVudHMgKGhlYWRlciwgdmlldywgZm9vdGVyKSBoYXZlIGJlZW4KKyAqIHByb2Nlc3NlZCBidXQgYmVmb3JlIHRoZSBwcm9jZXNzZWQgcmVzdWx0cyBhcmUgc2VudCBvdXQgYWNyb3NzIHRoZSB3aXJlIHRvIHRoZSAKKyAqIGJyb3dzZXIuIEhUVFAgaGVhZGVycyBoYXZlIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZSBicm93c2VyLgorICovCitmdW5jdGlvbiBob29rX2JlZm9yZV9zZW5kKCkge30KKworLyoqCisgKiBob29rX2FmdGVyX3NlbmQKKyAqIAorICogVGhpcyBob29rIGlzIGFmdGVyIGFsbCBvZiB0aGUgdmlldyBjb21wb25lbnRzIChoZWFkZXIsIHZpZXcsIGZvb3RlcikgaGF2ZSBiZWVuCisgKiBwcm9jZXNzZWQgYW5kIHNlbnQgb3V0IGFjcm9zcyB0aGUgd2lyZSB0byB0aGUgYnJvd3Nlci4gSXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2dpbmcKKyAqIG9yIGFuYWx5dGljcyBwdXJwb3Nlcywgb3IgdG8gYXBwZW5kIGEgY29tbW9uIHRyYWlsZXIgdG8gYWxsIGNvbnRlbnQuCisgKi8KK2Z1bmN0aW9uIGhvb2tfYWZ0ZXJfc2VuZCgpIHsKKwkkdGltZVN0YXJ0ID0gJEdMT0JBTFNbJ2JhbGFuY2VfcmVxdWVzdF9zdGFydCddOworCSR0aW1lRW5kICAgPSBtaWNyb3RpbWUodHJ1ZSk7CisJJGVsYXBzZWQgICA9ICR0aW1lRW5kIC0gJHRpbWVTdGFydDsKKwkKKwllY2hvICJcclxuPCEtLSBwYWdlIHJlbmRlcmVkIGluIHskZWxhcHNlZH0gc2Vjb25kcyAtLT4iOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zY3JpcHRzL2FjY2Vzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3NjcmlwdHMvYWNjZXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY3NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zY3JpcHRzL2FjY2Vzcy5waHAKQEAgLTAsMCArMSwxMDcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQUk9GSUxFIE1BTkFHRVIgLSBDUkVBVEUgVVNFUgorICogCisgKiBDcmVhdGUgbmV3IHVzZXIsIHJlcXVpcmVkIGF0dHJpYnV0ZXM6CisgKiAKKyAqIAkxLiBGaXJzdCBuYW1lCisgKiAJMi4gTGFzdCBuYW1lCisgKiAJMy4gVXNlcm5hbWUKKyAqIAk0LiBFbWFpbCAKKyAqIAorICogCS0gcGFzc3dvcmQKKyAqIAktIGNvbmZpcm0gcGFzc3dvcmQKKyAqIAorICogQGF1dGhvciBzLmtodWRpa3lhbgorKiovCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworJGFsbFNldCA9IHRydWU7CisKKworaWYgKCBpc3NldCgkX1BPU1RbImZpcnN0bmFtZSJdKSAmJiAkX1BPU1RbImZpcnN0bmFtZSJdICE9ICIiICkgeworCSRpbmZvWyBBcHA6OkdldCgpLT5zZXR0aW5nc1snZmlyc3RuYW1lX2F0dHInXSBdID0gJF9QT1NUWyJmaXJzdG5hbWUiXTsKK30gZWxzZSB7CisJLy8gZmlyc3QgbmFtZSBpcyByZXF1aXJlZAorCUFwcDo6R2V0KCktPlNldE1lc3NhZ2UoIkZpcnN0IG5hbWUgY2Fubm90IGJlIGJsYW5rIixDQVNfTVNHX0VSUk9SKTsKKwkkYWxsU2V0ID0gRkFMU0U7Cit9CisKK2lmICggaXNzZXQoJF9QT1NUWyJsYXN0bmFtZSJdKSAmJiAkX1BPU1RbImxhc3RuYW1lIl0gIT0gIiIgKSB7CisJJGluZm9bIEFwcDo6R2V0KCktPnNldHRpbmdzWydsYXN0bmFtZV9hdHRyJ10gXSA9ICRfUE9TVFsibGFzdG5hbWUiXTsKK30gZWxzZSB7CisJLy8gbGFzdCBuYW1lIGlzIHJlcXVpcmVkCisJQXBwOjpHZXQoKS0+U2V0TWVzc2FnZSgiTGFzdCBuYW1lIGNhbm5vdCBiZSBibGFuayIsQ0FTX01TR19FUlJPUik7CisJJGFsbFNldCA9IEZBTFNFOworfQorCitpZiAoIGlzc2V0KCRfUE9TVFsidXNlcm5hbWUiXSkgJiYgJF9QT1NUWyJ1c2VybmFtZSJdICE9ICIiICkgeworCQorCS8vIGNoZWNrIHVzZXJuYW1lIGF2YWlsYWJpbGl0eQorCSRpc0F2YWlsYWJsZSA9IEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKS0+dXNlcm5hbWVBdmFpbGFiaWxpdHkoJF9QT1NUWyJ1c2VybmFtZSJdKTsJCisJaWYgKCAkaXNBdmFpbGFibGUgKSB7CisJCSRpbmZvWyBBcHA6OkdldCgpLT5zZXR0aW5nc1sndXNlcm5hbWVfYXR0ciddIF0gPSAkX1BPU1RbInVzZXJuYW1lIl07CisJfSBlbHNleworCQlBcHA6OkdldCgpLT5TZXRNZXNzYWdlKCJVc2VybmFtZSBoYXMgYmVlbiB0YWtlbiIsQ0FTX01TR19FUlJPUik7CisJCSRhbGxTZXQgPSBGQUxTRTsKKwl9Cit9IGVsc2UgeworCS8vIHVzZXJuYW1lIGlzIHJlcXVpcmVkCisJQXBwOjpHZXQoKS0+U2V0TWVzc2FnZSgiVXNlcm5hbWUgY2Fubm90IGJlIGJsYW5rIixDQVNfTVNHX0VSUk9SKTsKKwkkYWxsU2V0ID0gRkFMU0U7Cit9CisKK2lmICggaXNzZXQoJF9QT1NUWyJlbWFpbCJdKSAmJiAkX1BPU1RbImVtYWlsIl0gIT0gIiIpIHsKKwkkaW5mb1sgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2VtYWlsX2F0dHInXSBdID0gJF9QT1NUWyJlbWFpbCJdOworfSBlbHNlIHsKKwkvLyBlbWFpbCBpcyByZXF1aXJlZAorCUFwcDo6R2V0KCktPlNldE1lc3NhZ2UoIkVtYWlsIGNhbm5vdCBiZSBibGFuayIsQ0FTX01TR19FUlJPUik7CisJJGFsbFNldCA9IEZBTFNFOworfQorCitpZiAoICFpc3NldCgkX1BPU1RbInBhc3N3b3JkX2NvbmZpcm0iXSkgfHwgJF9QT1NUWyJwYXNzd29yZF9jb25maXJtIl0gPT0gIiIgKSB7CisJCisJLy8gcGFzc3dvcmQgY29uZmlybSBpcyByZXF1aXJlZAorCUFwcDo6R2V0KCktPlNldE1lc3NhZ2UoIlBhc3N3b3JkIGNhbm5vdCBiZSBibGFuayBhbmQgbXVzdCBtYXRjaCIsQ0FTX01TR19FUlJPUik7CisJJGFsbFNldCA9IEZBTFNFOworfSBlbHNlaWYgKCAoaXNzZXQoJF9QT1NUWyJwYXNzd29yZCJdKSB8fCAkX1BPU1RbInBhc3N3b3JkIl0gIT0gIiIpICYmIAorCQkgICAoICRfUE9TVFsicGFzc3dvcmQiXSA9PSAkX1BPU1RbInBhc3N3b3JkX2NvbmZpcm0iXSApICkgeworCQkgICAJCisJJGluZm9bJ3VzZXJQYXNzd29yZCddID0gJF9QT1NUWyJwYXNzd29yZCJdOworfSBlbHNlIHsKKwkKKwkvLyBwYXNzd29yZCBpcyByZXF1aXJlZCBhbmQgbXVzdCBtYXRjaAorCUFwcDo6R2V0KCktPlNldE1lc3NhZ2UoIlBhc3N3b3JkIGNhbm5vdCBiZSBibGFuayBhbmQgbXVzdCBtYXRjaCIsQ0FTX01TR19FUlJPUik7CisJJGFsbFNldCA9IEZBTFNFOworfQorCitpZiAoJGFsbFNldCkgeworCQorCSRpbmZvWyBBcHA6OkdldCgpLT5zZXR0aW5nc1snY29tbW9ubmFtZV9hdHRyJ10gXSA9ICRfUE9TVFsiZmlyc3RuYW1lIl0gLiAiICIgLiAkX1BPU1RbImxhc3RuYW1lIl07CisJJGluZm9bICJvYmplY3RDbGFzcyIgXSA9ICJpbmV0T3JnUGVyc29uIjsKKwlpZiAoIEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKS0+YWRkVXNlcigkaW5mbykgKSB7CisJCQorCQlBcHA6OkdldCgpLT5SZWRpcmVjdCgkbW9kdWxlLT5tb2R1bGVSb290IC4gIi9sb2dpbiIgKTsgLy8gYWRkIGFjY291bnQgc3VjY2Vzc2Z1bAkKKwl9IGVsc2UgeworCQlBcHA6OkdldCgpLT5zZXRNZXNzYWdlKCJDb3VsZCBub3QgYWRkIHVzZXIuIixDQVNfTVNHX0VSUk9SKTsKKwl9Cit9IGVsc2UgeworCQorCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiL2NyZWF0ZVVzZXIiICk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3NjcmlwdHMvY2hhbmdlUHdkLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc2NyaXB0cy9jaGFuZ2VQd2QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MGMxODkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3NjcmlwdHMvY2hhbmdlUHdkLnBocApAQCAtMCwwICsxLDY5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUFJPRklMRSBNQU5BR0VSIC0gUEFTU1dPUkQgQ0hBTkdFCisgKiAKKyAqIEF0dGVtcHQgdG8gY2hhbmdlIHBhc3N3b3JkLiBUaGlzIHNjcmlwdCB1c2VzIGNvbmZpZyBmaWxlIHRvIAorICogY2hlY2sgZm9yIHBhc3N3b3JkIHJlc3RyaWN0aW9ucy4KKyAqIAorICogQGF1dGhvciBzLmtodWRpa3lhbgorKiovCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworCisvLyBHZXQgaW5zdGFuY2Ugb2YgYXV0aGVudGljYXRpb24gY2xhc3MKKyRhdXRoZW50aWNhdGlvbiA9IEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKTsKKworCitpZiAoICFpc3NldCgkX1BPU1RbInBhc3N3b3JkX2NvbmZpcm0iXSkgfHwgJF9QT1NUWyJwYXNzd29yZF9jb25maXJtIl0gPT0gIiIgKSB7CisJCisJLy8gcGFzc3dvcmQgY29uZmlybSBpcyByZXF1aXJlZAorCUFwcDo6R2V0KCktPlNldE1lc3NhZ2UoIlBsZWFzZSBjb25maXJtIHBhc3N3b3JkLiIsQ0FTX01TR19FUlJPUik7CisJQXBwOjpHZXQoKS0+UmVkaXJlY3QoJG1vZHVsZS0+bW9kdWxlUm9vdCAuICIvY2hhbmdlUHdkIiApOworCQorfSBlbHNlaWYgKCAoaXNzZXQoJF9QT1NUWyJwYXNzd29yZCJdKSB8fCAkX1BPU1RbInBhc3N3b3JkIl0gIT0gIiIpICYmIAorCQkgKCAkX1BPU1RbInBhc3N3b3JkIl0gPT0gJF9QT1NUWyJwYXNzd29yZF9jb25maXJtIl0gKSApIHsKKworCQkgCSRtZXNzYWdlID0gJGF1dGhlbnRpY2F0aW9uLT52YWxpZGF0ZUNoYW5nZVBhc3N3b3JkKCAkX1BPU1RbInBhc3N3b3JkIl0gKTsKKworCQkgCWlmKCBpc19hcnJheSgkbWVzc2FnZSkgKSB7CisgCQkKKwkJIAkJZm9yZWFjaCAoJG1lc3NhZ2UgYXMgJHZhbHVlKSB7CisJCSAJCQlBcHA6OkdldCgpLT5zZXRNZXNzYWdlKCR2YWx1ZSxDQVNfTVNHX0VSUk9SKTsKKwkJIAkJfQorCQkgICAJCQorCQkgICAJCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiL2NoYW5nZVB3ZCIgKTsKKwkJIAl9IGVsc2V7CisJCSAJCQorCQkgCQkvLyBMb2cgdGhlIHVzZXIgb3V0CisJCQkJJGF1dGhlbnRpY2F0aW9uLT5sb2dvdXQoKTsKKwkJCQkKKwkJCQkvLyBFbmQgdXNlciBzZXNzaW9uCisJCQkJQXBwOjpHZXQoKS0+RW5kVXNlclNlc3Npb24oKTsKKwkJCQkKKwkJCQkvLyBSZWRpcmVjdCB0byBjb25maXJtYXRpb24gcGFnZQorCQkgICAJCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiL3Bhc3N3b3JkQ2hhbmdlQ29uZmlybWVkIiApOyAvLyBwYXNzd29yZCBjaGFuZ2Ugc3VjY2Vzc2Z1bAorICAgCQkKKyAgIAkJCX0KKwkJIH0gZWxzZSB7CisJCisJCQkvLyBwYXNzd29yZCBpcyByZXF1aXJlZCBhbmQgbXVzdCBtYXRjaAorCQkJQXBwOjpHZXQoKS0+U2V0TWVzc2FnZSgiUGFzc3dvcmQgY2Fubm90IGJlIGJsYW5rIGFuZCBtdXN0IG1hdGNoIixDQVNfTVNHX0VSUk9SKTsKKwkJCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiL2NoYW5nZVB3ZCIgKTsKKwkJfQorCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3NjcmlwdHMvbG9naW4ucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zY3JpcHRzL2xvZ2luLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzZmZDQzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zY3JpcHRzL2xvZ2luLnBocApAQCAtMCwwICsxLDQ2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUFJPRklMRSBNQU5BR0VSIC0gTE9HSU4KKyAqIAorICogQXR0ZW1wdCB0byBsb2dpbi4KKyAqIAorICogQGF1dGhvciBzLmtodWRpa3lhbgorKiovCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworCisvLyBHZXQgaW5zdGFuY2Ugb2YgYXV0aGVudGljYXRpb24gY2xhc3MKKyRhdXRoZW50aWNhdGlvbiA9IEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKTsKKworJG1lc3NhZ2UgPSAnJzsKKworLy8gSWYgYSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluLCByZWRpcmVjdCB0byBob21lIHBhZ2UKK2lmKCAkYXV0aGVudGljYXRpb24tPmlzTG9nZ2VkSW4oKSApIEFwcDo6R2V0KCktPlJlZGlyZWN0KFNJVEVfUk9PVCAuICIvIik7IAorCisvLyBPdGhlcndpc2UsIGlmIGEgdXNlciBpcyBhdHRlbXB0aW5nIHRvIGxvZyBpbiwgcHJvY2VzczoKK2Vsc2UgaWYoaXNzZXQoJF9QT1NUWyJ1c2VybmFtZSJdKSAmJiBpc3NldCgkX1BPU1RbInBhc3N3b3JkIl0pKSB7CisKKwkvLyBDaGVjayB0aGUgcHJvdmlkZWQgbG9naW4gY3JlZGVudGlhbHM6CisJaWYoJGF1dGhlbnRpY2F0aW9uLT5sb2dpbigkX1BPU1RbInVzZXJuYW1lIl0sICRfUE9TVFsicGFzc3dvcmQiXSkpeworICAJIAlBcHA6OkdldCgpLT5SZWRpcmVjdChTSVRFX1JPT1QgLiAiLyIgKTsgLy8gbG9naW4gc3VjY2Vzc2Z1bAorICAJIH0gZWxzZSB7CisgIAkgCUFwcDo6R2V0KCktPlNldE1lc3NhZ2UoIkludmFsaWQgQ3JlZGVudGlhbHMgUHJvdmlkZWQiLENBU19NU0dfRVJST1IpOworICAJIAlBcHA6OkdldCgpLT5SZWRpcmVjdCgkbW9kdWxlLT5tb2R1bGVSb290IC4gIi9sb2dpbiIpOworICAJIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3NjcmlwdHMvbG9nb3V0LnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc2NyaXB0cy9sb2dvdXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2NjZTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3NjcmlwdHMvbG9nb3V0LnBocApAQCAtMCwwICsxLDM2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUFJPRklMRSBNQU5BR0VSIC0gTE9HT1VUCisgKiAKKyAqIEVuZCBhbiBhdXRoZW50aWNhdGVkIHVzZXIgc2Vzc2lvbgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiBAYXV0aG9yIGRhdm9vZGkKKyAqIEBhdXRob3Igcy5raHVkaWt5YW4KKyoqLworCisvLyBMb2cgdGhlIHVzZXIgb3V0CitBcHA6OkdldCgpLT5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCktPmxvZ291dCgpOworCisvLyBFbmQgdXNlciBzZXNzaW9uCitBcHA6OkdldCgpLT5FbmRVc2VyU2Vzc2lvbigpOworCisvLyBSZWRpcmVjdCB0byB0aGUgaG9tZSBwYWdlCitBcHA6OkdldCgpLT5SZWRpcmVjdChTSVRFX1JPT1QgLiAiLyIpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc2NyaXB0cy9tYW5hZ2UucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zY3JpcHRzL21hbmFnZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNWVjNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc2NyaXB0cy9tYW5hZ2UucGhwCkBAIC0wLDAgKzEsNTkgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQUk9GSUxFIE1BTkFHRVIgLSBNQU5BR0UgVVNFUiBQUk9GSUxFCisgKiAKKyAqIFByb2Nlc3MgdXNlcidzIGNoYW5nZXMgdG8gcHJvZmlsZSBpbmZvcm1hdGlvbi4gCisgKiAKKyAqIEBhdXRob3Igcy5raHVkaWt5YW4KKyoqLworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKyRhbGxTZXQgPSB0cnVlOworCitmb3JlYWNoICgkX1BPU1QgYXMgJGtleT0+JHZhbHVlKSB7CisKKwlpZiAoICRrZXkgIT0gc3VibWl0X2J1dHRvbikgeworCQlpZiAoIGlzc2V0KCR2YWx1ZSkgJiYgJHZhbHVlICE9ICIiICkgeworCQkJJGluZm9bJGtleV0gPSAkdmFsdWU7CisJCX0gZWxzZSB7CisJCQkvLyBzZXQgZXJyb3IgbWVzc2FnZQorCQkJQXBwOjpHZXQoKS0+U2V0TWVzc2FnZSggCisJCQkJYXJyYXlfc2VhcmNoKCAka2V5LCBBcHA6OkdldCgpLT5zZXR0aW5nc1snYXR0cl90aXRsZXMnXSApIAorCQkJCS4gIiBjYW5ub3QgYmUgbGVmdCBibGFuay4iLCBDQVNfTVNHX0VSUk9SICk7CisJCQkkYWxsU2V0ID0gZmFsc2U7CisJCX0KKwl9Cit9CisKK2lmICgkYWxsU2V0KSB7CisJLy8gbWV0aG9kIHRvIGVkaXQgdXNlcgorCWlmKCBBcHA6OkdldCgpLT5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCktPnVwZGF0ZVByb2ZpbGUoJGluZm8pICl7CisgCQkKKwkJLy8gdXNlciBpbmZvIGNoYW5nZSBzdWNjZXNzZnVsCisgICAJCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiLyIgKTsKKyAgIAl9IGVsc2V7CisgICAJCQorICAgCQkvLyBpZiBub3QgbG9nZ2VkIGluIC0gY2Fubm90IGNoYW5nZSBwd2QKKyAgIAkJQXBwOjpHZXQoKS0+U2V0TWVzc2FnZSgiSW52YWxpZCBlbnRyeSIsQ0FTX01TR19FUlJPUik7CisgICAJCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiL21hbmFnZSIgKTsKKyAgIAl9Cit9IGVsc2UgeworCQorCUFwcDo6R2V0KCktPlJlZGlyZWN0KCRtb2R1bGUtPm1vZHVsZVJvb3QgLiAiL21hbmFnZSIgKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc2NyaXB0cy93aWRnZXRzL1VzZXJTdGF0dXNXaWRnZXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zY3JpcHRzL3dpZGdldHMvVXNlclN0YXR1c1dpZGdldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5ZGQyNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc2NyaXB0cy93aWRnZXRzL1VzZXJTdGF0dXNXaWRnZXQucGhwCkBAIC0wLDAgKzEsOTEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQUk9GSUxFIE1BTkFHRVIgLSBVc2VyIFN0YXR1cyBEaXNwbGF5CisgKiAKKyAqIFRoaXMgd2lkZ2V0IGRpc3BsYXlzIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyLiBJdCBwcm92aWRlcyBhIGxpbmsKKyAqIHRvIGxvZyBpbiB3aGVuIHVzZXIgaXMgbG9nZ2VkIG91dCBhbmQgZGlzcGxheXMgdXNlcm5hbWUgd2l0aCBhIGxvZy1vdXQgbGluaworICogd2hlbiB1c2VyIGlzIGxvZ2dlZCBpbi4KKyAqIAorICogVGhpcyB3aWRnZXQgYWxzbyBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdGhlIHVzZXJzIHdpbGwKKyAqIGhhdmUgYWNjZXNzIHRvIG1hbmFnZSB0aGVpciBhY2NvdW50IHRocm91Z2ggdGhlIFByb2ZpbGUgTWFuYWdlciBpbnRlcmZhY2UuCisgKiAKKyAqIEBhdXRob3Igcy5raHVkaWt5YW4KKyAqIAorICovCisKK2NsYXNzIFVzZXJTdGF0dXNXaWRnZXQgCisJaW1wbGVtZW50cyBPcmdfQXBhY2hlX09vZHRfQmFsYW5jZV9JbnRlcmZhY2VzX0lBcHBsaWNhdGlvbldpZGdldCB7CisJCQorCXB1YmxpYyAkaXNMb2dnZWRJbjsKKwlwdWJsaWMgJHVzZXJuYW1lOworCXB1YmxpYyAkcHJvZmlsZUxpbms7CisJcHJvdGVjdGVkICRtb2R1bGVOYW1lOworCQorCS8qKgorCSAqIFBhc3MgYm9vbGVhbiB0cnVlIG9yIGZhbHNlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW4gdGhlIG9wdGlvbnMgYXJyYXkKKwkgKiB0byBnZW5lcmF0ZSBlaXRoZXIgYSBsb2dpbiBsaW5rIG9yIGEgbG9nb3V0IGxpbmssIHdoaWNoZXZlciBpcyBhcHByb3ByaWF0ZS4KKwkgKiAgCVRydWU6ICB1c2VyIGlzIGxvZ2dlZCBpbiwgc2hvdyBsb2dvdXQgbGluaworCSAqICAJRmFsc2U6IHVzZXIgaXMgbm90IGxvZ2dlZCBpbiwgc2hvdyBsb2dpbiBsaW5rCisJICogCisJICogUGFzcyB1c2VybmFtZSBhcyB0aGUgc2Vjb25kIHBhcmFtZXJ0ZXIgaW4gdGhlIG9wdGlvbnMgYXJyYXkKKwkgKiAKKwkgKiBQYXNzIGJvb2xlYW4gdHJ1ZSBvciBmYWxzZSBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyIGluIHRoZSBvcHRpb25zIGFycmF5CisJICogdG8gZ2VuZXJhdGUgdGhlIHVzZXJuYW1lIGFzIGEgbGluayB0byB0aGUgcG9yZmlsZSBtb2R1bGUuCisJICogIAlUcnVlOiAgbGluayB3aWxsIGJlIGNyZWF0ZWQtICpEZWZhdWx0KgorCSAqICAJRmFsc2U6IGxpbmsgd2lsbCBub3QgYmUgY3JlYXRlZAorCSAqICAgCisJICogUGFzcyBtb2R1bGUgbmFtZSBhcyB0aGUgZm91cnRoIHBhcmFtZXJ0ZXIgaW4gdGhlIG9wdGlvbnMgYXJyYXkuIFRoaXMgd2F5CisJICogdGhlIGRldmVsb3BlciBoYXMgdGhlIG9wdGlvbiB0byBuYW1lIHRoZSBtb2R1bGUgYW55dGhpbmcuCisJICogCQlEZWZhdWx0OiAncHJvZmlsZScKKwkgKi8gCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcHRpb25zID0gYXJyYXkoKSkgeworCQkkdGhpcy0+aXNMb2dnZWRJbiAgPSAoIGlzc2V0KCRvcHRpb25zWzBdKSAgICYmICRvcHRpb25zWzBdID09PSB0cnVlICk7CisJCSR0aGlzLT51c2VybmFtZSAgICA9ICggaXNzZXQoJG9wdGlvbnNbMV0pICkgPyAgJG9wdGlvbnNbMV0gOiBmYWxzZTsKKwkJJHRoaXMtPnByb2ZpbGVMaW5rID0gKCBpc3NldCgkb3B0aW9uc1syXSkgKSA/ICAkb3B0aW9uc1syXSA6IHRydWU7CisJCSR0aGlzLT5tb2R1bGVOYW1lICA9ICggaXNzZXQoJG9wdGlvbnNbM10pICkgPyAgJG9wdGlvbnNbM10gOiAncHJvZmlsZSc7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW5kZXIoJGJFY2hvID0gdHJ1ZSkgeworCQkKKwkJJHN0ciAJPSAnJzsKKwkJJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoJHRoaXMtPm1vZHVsZU5hbWUpOworCQkKKwkJLy8gRGlzcGxheSB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIKKwkJaWYoJHRoaXMtPmlzTG9nZ2VkSW4pIHsKKwkJCSRzdHIgLj0gIkxvZ2dlZCBpbiBhcyAiOworCQkJaWYgKCR0aGlzLT5wcm9maWxlTGluaykgeworCQkJCSRzdHIgLj0gJzxhIGhyZWY9IicgLiAkbW9kdWxlLT5tb2R1bGVSb290IC4gJy8iPicgLiAkdGhpcy0+dXNlcm5hbWUgLiAnPC9hPiZuYnNwO3wmbmJzcDsnCisJCQkJCS4nPGEgaHJlZj0iJyAuICRtb2R1bGUtPm1vZHVsZVJvb3QgLiAnL2xvZ291dC5kbyI+TG9nIE91dDwvYT4nOworCQkJfSBlbHNlIHsKKwkJCQkkc3RyIC49ICAkdGhpcy0+dXNlcm5hbWUgLiAnJm5ic3A7fCZuYnNwOycKKwkJCQkJCS4nPGEgaHJlZj0iJyAuICRtb2R1bGUtPm1vZHVsZVJvb3QgLiAnL2xvZ291dC5kbyI+TG9nIE91dDwvYT4nOworCQkJfQorCQl9IGVsc2UgeworCQkJJHN0ciAuPSAnPGEgaHJlZj0iJyAuICRtb2R1bGUtPm1vZHVsZVJvb3QgLiAnL2xvZ2luIj5Mb2cgSW48L2E+JzsKKwkJfQorCQkKKwkJaWYoJGJFY2hvKSB7CisJCQllY2hvICRzdHI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gJHN0cjsKKwkJfQorCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3N0YXRpYy9jc3MvcHJvZmlsZS5jc3MgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3N0YXRpYy9jc3MvcHJvZmlsZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkOTVhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc3RhdGljL2Nzcy9wcm9maWxlLmNzcwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgCisvKioKKyAqIFBST0ZJTEUgTUFOQUdFUiBTVFlMRVNIRUVUCisgKgorICogUEFHRSBFTEVNRU5UUyAKKyAqCisgKi8KK2ZpZWxkc2V0ICB7Cit9CisKK2xhYmVsLmludmFsaWQgeworCWNvbG9yOiNCRjFCMDI7CisJZm9udDoxZW0gZ2VvcmdpYTsKKwltYXJnaW46MCAwIDJweDsKK30KKworLnByb2ZpbGVfaW5wdXQgeworCWhlaWdodDoyM3B4OworCXdpZHRoOjIwMHB4OworfQorCisvKioKKyAqIERJVi5VU0VSREVUQUlMUworICogVGhpcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9naW4tc3RhdHVzIG9mIHRoZSB1c2VyLgorICoKKyAqIHRvcCBhbmQgY29sb3IgY2FuIGJlIGNoYW5nZWQgZGVwZW5kaW5nIG9uIHBvcnRhbAorICovCisjdXNlcmRldGFpbHMgeworCXBvc2l0aW9uOmFic29sdXRlOworCXRvcDoxMDVweDsKKwlyaWdodDoxNXB4OworCXotaW5kZXg6MTA7Cit9CisjdXNlcmRldGFpbHMgYSB7CisJZm9udC1zaXplOjEzcHg7Cit9CisKKy8qIFVuc3VwcG9ydGVkIGJyb3dzZXJzICovCisKKy5vcmFuZ2VfcmJjb250ZW50IHsgcGFkZGluZzogMC40ZW07IH0KKy5vcmFuZ2VfcmJyb3VuZGJveCB7IHdpZHRoOiAxMDAlOyB9CisKKyN1bnN1cHBvcnRlZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisvKiBTaWdudXAgZm9ybSAqLworCisjc2lnbnVwZm9ybSB0YWJsZSB7CisgIGJvcmRlci1zcGFjaW5nOiAwcHg7CisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgIGVtcHR5LWNlbGxzOiBzaG93OworfQorCisjc2lnbnVwZm9ybSAubGFiZWwgeworICBwYWRkaW5nLXRvcDogMnB4OworICBwYWRkaW5nLXJpZ2h0OiA4cHg7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICB3aWR0aDogMTI1cHg7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKyNzaWdudXBmb3JtIC5maWVsZCB7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisjc2lnbnVwZm9ybSAuc3RhdHVzIHsKKyAgcGFkZGluZy10b3A6IDJweDsKKyAgcGFkZGluZy1sZWZ0OiA4cHg7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgIHdpZHRoOiAyNDZweDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworI3NpZ251cGZvcm0gLnRleHRmaWVsZCB7CisgIHdpZHRoOiAxNTBweDsKK30KKworI3NpZ251cGZvcm0gLmVycm9yLCAubm90aWNlLCAuc3VjY2VzcyB7CisgIHBhZGRpbmc6MC4yNWVtOworICBtYXJnaW4tYm90dG9tOjAuNWVtIDA7CisgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKKyAgYm9yZGVyOjFweCBzb2xpZCAjQkJCQkJCOworfQorCisjc2lnbnVwZm9ybSBsYWJlbC5lcnJvciB7CisgIGJhY2tncm91bmQ6bm9uZTsKKyAgcGFkZGluZy1sZWZ0OiAxNnB4OworICBwYWRkaW5nLWJvdHRvbTogMnB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgY29sb3I6ICNFQTUyMDA7CisgIGJvcmRlcjpub25lOworfQorCisjc2lnbnVwZm9ybSBsYWJlbC5jaGVja2VkIC8qeworICBiYWNrZ3JvdW5kOm5vbmU7Cit9CisKKyNzaWdudXBmb3JtIC5zdWNjZXNzX21zZyB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBjb2xvcjogIzAwNjBCRjsKKyAgbWFyZ2luLWxlZnQ6IDE5cHg7Cit9CisKKyNzaWdudXBmb3JtICNkYXRlZm9ybWF0U3RhdHVzLCAjc2lnbnVwZm9ybSAjdGVybXNTdGF0dXMgeworICBtYXJnaW4tbGVmdDogNnB4OworfQorCisjc2lnbnVwZm9ybSAjdGVybXN3cmFwIHsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNzaWdudXBmb3JtICN0ZXJtcyB7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgIGZsb2F0OiBsZWZ0OworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7Cit9CisKKyNzaWdudXBmb3JtICNsdGVybXMgeworICBmb250LXdlaWdodDogbm9ybWFsOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICBmbG9hdDogbGVmdDsKKyAgZGlzcGxheTogYmxvY2s7CisgIHdpZHRoOiAzNTBweDsKKyAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKK30KKworI3NpZ251cGZvcm0gI2xzaWdudXBzdWJtaXQgeworICB2aXNpYmlsaXR5OiBoaWRkZW47Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zdGF0aWMvanMvYWRkaXRpb25hbC1tZXRob2RzLmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zdGF0aWMvanMvYWRkaXRpb25hbC1tZXRob2RzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiM2FkMTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3N0YXRpYy9qcy9hZGRpdGlvbmFsLW1ldGhvZHMuanMKQEAgLTAsMCArMSwyNTkgQEAKKyhmdW5jdGlvbigpIHsNCisJDQorCWZ1bmN0aW9uIHN0cmlwSHRtbCh2YWx1ZSkgew0KKwkJLy8gcmVtb3ZlIGh0bWwgdGFncyBhbmQgc3BhY2UgY2hhcnMNCisJCXJldHVybiB2YWx1ZS5yZXBsYWNlKC88LltePD5dKj8+L2csICcgJykucmVwbGFjZSgvJm5ic3A7fCYjMTYwOy9naSwgJyAnKQ0KKwkJLy8gcmVtb3ZlIG51bWJlcnMgYW5kIHB1bmN0dWF0aW9uDQorCQkucmVwbGFjZSgvWzAtOS4oKSw7OiE/JSMkJyJfKz1cLy1dKi9nLCcnKTsNCisJfQ0KKwlqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgibWF4V29yZHMiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCwgcGFyYW1zKSB7IA0KKwkgICAgcmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCkgfHwgc3RyaXBIdG1sKHZhbHVlKS5tYXRjaCgvXGJcdytcYi9nKS5sZW5ndGggPCBwYXJhbXM7IA0KKwl9LCBqUXVlcnkudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIHswfSB3b3JkcyBvciBsZXNzLiIpKTsgDQorCSANCisJalF1ZXJ5LnZhbGlkYXRvci5hZGRNZXRob2QoIm1pbldvcmRzIiwgZnVuY3Rpb24odmFsdWUsIGVsZW1lbnQsIHBhcmFtcykgeyANCisJICAgIHJldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpIHx8IHN0cmlwSHRtbCh2YWx1ZSkubWF0Y2goL1xiXHcrXGIvZykubGVuZ3RoID49IHBhcmFtczsgDQorCX0sIGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IHdvcmRzLiIpKTsgDQorCSANCisJalF1ZXJ5LnZhbGlkYXRvci5hZGRNZXRob2QoInJhbmdlV29yZHMiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCwgcGFyYW1zKSB7IA0KKwkgICAgcmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCkgfHwgc3RyaXBIdG1sKHZhbHVlKS5tYXRjaCgvXGJcdytcYi9nKS5sZW5ndGggPj0gcGFyYW1zWzBdICYmIHZhbHVlLm1hdGNoKC9idytiL2cpLmxlbmd0aCA8IHBhcmFtc1sxXTsgDQorCX0sIGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYmV0d2VlbiB7MH0gYW5kIHsxfSB3b3Jkcy4iKSk7DQorDQorfSkoKTsNCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgibGV0dGVyc3dpdGhiYXNpY3B1bmMiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXlthLXotLiwoKSdcIlxzXSskL2kudGVzdCh2YWx1ZSk7DQorfSwgIkxldHRlcnMgb3IgcHVuY3R1YXRpb24gb25seSBwbGVhc2UiKTsgIA0KKw0KK2pRdWVyeS52YWxpZGF0b3IuYWRkTWV0aG9kKCJhbHBoYW51bWVyaWMiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXlx3KyQvaS50ZXN0KHZhbHVlKTsNCit9LCAiTGV0dGVycywgbnVtYmVycywgc3BhY2VzIG9yIHVuZGVyc2NvcmVzIG9ubHkgcGxlYXNlIik7ICANCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgibGV0dGVyc29ubHkiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXlthLXpdKyQvaS50ZXN0KHZhbHVlKTsNCit9LCAiTGV0dGVycyBvbmx5IHBsZWFzZSIpOyANCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgibm93aGl0ZXNwYWNlIiwgZnVuY3Rpb24odmFsdWUsIGVsZW1lbnQpIHsNCisJcmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCkgfHwgL15cUyskL2kudGVzdCh2YWx1ZSk7DQorfSwgIk5vIHdoaXRlIHNwYWNlIHBsZWFzZSIpOyANCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgiemlwcmFuZ2UiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXjkwWzItNV1cZFx7Mn0tXGR7NH0kLy50ZXN0KHZhbHVlKTsNCit9LCAiWW91ciBaSVAtY29kZSBtdXN0IGJlIGluIHRoZSByYW5nZSA5MDJ4eC14eHh4IHRvIDkwNS14eC14eHh4Iik7DQorDQoralF1ZXJ5LnZhbGlkYXRvci5hZGRNZXRob2QoImludGVnZXIiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXi0/XGQrJC8udGVzdCh2YWx1ZSk7DQorfSwgIkEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgbm9uLWRlY2ltYWwgbnVtYmVyIHBsZWFzZSIpOw0KKw0KKy8qKg0KKyogUmV0dXJuIHRydWUsIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIHZlaGljbGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIChWSU4pLg0KKyoNCisqIFdvcmtzIHdpdGggYWxsIGtpbmQgb2YgdGV4dCBpbnB1dHMuDQorKg0KKyogQGV4YW1wbGUgPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjIwIiBuYW1lPSJWZWhpY2xlSUQiIGNsYXNzPSJ7cmVxdWlyZWQ6dHJ1ZSx2aW5VUzp0cnVlfSIgLz4NCisqIEBkZXNjIERlY2xhcmVzIGEgcmVxdWlyZWQgaW5wdXQgZWxlbWVudCB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdmVoaWNsZSBpZGVudGlmaWNhdGlvbiBudW1iZXIuDQorKg0KKyogQG5hbWUgalF1ZXJ5LnZhbGlkYXRvci5tZXRob2RzLnZpblVTDQorKiBAdHlwZSBCb29sZWFuDQorKiBAY2F0IFBsdWdpbnMvVmFsaWRhdGUvTWV0aG9kcw0KKyovIA0KK2pRdWVyeS52YWxpZGF0b3IuYWRkTWV0aG9kKA0KKwkidmluVVMiLA0KKwlmdW5jdGlvbih2KXsNCisJCWlmICh2Lmxlbmd0aCAhPSAxNykNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl2YXIgaSwgbiwgZCwgZiwgY2QsIGNkdjsNCisJCXZhciBMTCAgICA9IFsiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIlAiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiXTsNCisJCXZhciBWTCAgICA9IFsxLDIsMyw0LDUsNiw3LDgsMSwyLDMsNCw1LDcsOSwyLDMsNCw1LDYsNyw4LDldOw0KKwkJdmFyIEZMICAgID0gWzgsNyw2LDUsNCwzLDIsMTAsMCw5LDgsNyw2LDUsNCwzLDJdOw0KKwkJdmFyIHJzICAgID0gMDsNCisJCWZvcihpID0gMDsgaSA8IDE3OyBpKyspew0KKwkJICAgIGYgPSBGTFtpXTsNCisJCSAgICBkID0gdi5zbGljZShpLGkrMSk7DQorCQkgICAgaWYoaSA9PSA4KXsNCisJCSAgICAgICAgY2R2ID0gZDsNCisJCSAgICB9DQorCQkgICAgaWYoIWlzTmFOKGQpKXsNCisJCSAgICAgICAgZCAqPSBmOw0KKwkJICAgIH0NCisJCSAgICBlbHNlew0KKwkJICAgICAgICBmb3IobiA9IDA7IG4gPCBMTC5sZW5ndGg7IG4rKyl7DQorCQkgICAgICAgICAgICBpZihkLnRvVXBwZXJDYXNlKCkgPT09IExMW25dKXsNCisJCSAgICAgICAgICAgICAgICBkID0gVkxbbl07DQorCQkgICAgICAgICAgICAgICAgZCAqPSBmOw0KKwkJICAgICAgICAgICAgICAgIGlmKGlzTmFOKGNkdikgJiYgbiA9PSA4KXsNCisJCSAgICAgICAgICAgICAgICAgICAgY2R2ID0gTExbbl07DQorCQkgICAgICAgICAgICAgICAgfQ0KKwkJICAgICAgICAgICAgICAgIGJyZWFrOw0KKwkJICAgICAgICAgICAgfQ0KKwkJICAgICAgICB9DQorCQkgICAgfQ0KKwkJICAgIHJzICs9IGQ7DQorCQl9DQorCQljZCA9IHJzICUgMTE7DQorCQlpZihjZCA9PSAxMCl7Y2QgPSAiWCI7fQ0KKwkJaWYoY2QgPT0gY2R2KXtyZXR1cm4gdHJ1ZTt9DQorCQlyZXR1cm4gZmFsc2U7IA0KKwl9LA0KKwkiVGhlIHNwZWNpZmllZCB2ZWhpY2xlIGlkZW50aWZpY2F0aW9uIG51bWJlciAoVklOKSBpcyBpbnZhbGlkLiINCispOw0KKw0KKy8qKg0KKyAgKiBSZXR1cm4gdHJ1ZSwgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZSwgYWxzbyBtYWtpbmcgdGhpcyBmb3JtYWwgY2hlY2sgZGQvbW0veXl5eS4NCisgICoNCisgICogQGV4YW1wbGUgalF1ZXJ5LnZhbGlkYXRvci5tZXRob2RzLmRhdGUoIjAxLzAxLzE5MDAiKQ0KKyAgKiBAcmVzdWx0IHRydWUNCisgICoNCisgICogQGV4YW1wbGUgalF1ZXJ5LnZhbGlkYXRvci5tZXRob2RzLmRhdGUoIjAxLzEzLzE5OTAiKQ0KKyAgKiBAcmVzdWx0IGZhbHNlDQorICAqDQorICAqIEBleGFtcGxlIGpRdWVyeS52YWxpZGF0b3IubWV0aG9kcy5kYXRlKCIwMS4wMS4xOTAwIikNCisgICogQHJlc3VsdCBmYWxzZQ0KKyAgKg0KKyAgKiBAZXhhbXBsZSA8aW5wdXQgbmFtZT0icGlwcG8iIGNsYXNzPSJ7ZGF0ZUlUQTp0cnVlfSIgLz4NCisgICogQGRlc2MgRGVjbGFyZXMgYW4gb3B0aW9uYWwgaW5wdXQgZWxlbWVudCB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZGF0ZS4NCisgICoNCisgICogQG5hbWUgalF1ZXJ5LnZhbGlkYXRvci5tZXRob2RzLmRhdGVJVEENCisgICogQHR5cGUgQm9vbGVhbg0KKyAgKiBAY2F0IFBsdWdpbnMvVmFsaWRhdGUvTWV0aG9kcw0KKyAgKi8NCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgNCisJImRhdGVJVEEiLA0KKwlmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwkJdmFyIGNoZWNrID0gZmFsc2U7DQorCQl2YXIgcmUgPSAvXlxkezEsMn1cL1xkezEsMn1cL1xkezR9JC87DQorCQlpZiggcmUudGVzdCh2YWx1ZSkpew0KKwkJCXZhciBhZGF0YSA9IHZhbHVlLnNwbGl0KCcvJyk7DQorCQkJdmFyIGdnID0gcGFyc2VJbnQoYWRhdGFbMF0sMTApOw0KKwkJCXZhciBtbSA9IHBhcnNlSW50KGFkYXRhWzFdLDEwKTsNCisJCQl2YXIgYWFhYSA9IHBhcnNlSW50KGFkYXRhWzJdLDEwKTsNCisJCQl2YXIgeGRhdGEgPSBuZXcgRGF0ZShhYWFhLG1tLTEsZ2cpOw0KKwkJCWlmICggKCB4ZGF0YS5nZXRGdWxsWWVhcigpID09IGFhYWEgKSAmJiAoIHhkYXRhLmdldE1vbnRoICgpID09IG1tIC0gMSApICYmICggeGRhdGEuZ2V0RGF0ZSgpID09IGdnICkgKQ0KKwkJCQljaGVjayA9IHRydWU7DQorCQkJZWxzZQ0KKwkJCQljaGVjayA9IGZhbHNlOw0KKwkJfSBlbHNlDQorCQkJY2hlY2sgPSBmYWxzZTsNCisJCXJldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpIHx8IGNoZWNrOw0KKwl9LCANCisJIlBsZWFzZSBlbnRlciBhIGNvcnJlY3QgZGF0ZSINCispOw0KKw0KK2pRdWVyeS52YWxpZGF0b3IuYWRkTWV0aG9kKCJkYXRlTkwiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgew0KKwkJcmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCkgfHwgL15cZFxkP1tcLlwvLV1cZFxkP1tcLlwvLV1cZFxkXGQ/XGQ/JC8udGVzdCh2YWx1ZSk7DQorCX0sICJWdWwgaGllciBlZW4gZ2VsZGlnZSBkYXR1bSBpbi4iDQorKTsNCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgidGltZSIsIGZ1bmN0aW9uKHZhbHVlLCBlbGVtZW50KSB7DQorCQlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXihbMDFdWzAtOV0pfCgyWzAxMjNdKTooWzAtNV0pKFswLTldKSQvLnRlc3QodmFsdWUpOw0KKwl9LCAiUGxlYXNlIGVudGVyIGEgdmFsaWQgdGltZSwgYmV0d2VlbiAwMDowMCBhbmQgMjM6NTkiDQorKTsNCisNCisvKioNCisgKiBtYXRjaGVzIFVTIHBob25lIG51bWJlciBmb3JtYXQgDQorICogDQorICogd2hlcmUgdGhlIGFyZWEgY29kZSBtYXkgbm90IHN0YXJ0IHdpdGggMSBhbmQgdGhlIHByZWZpeCBtYXkgbm90IHN0YXJ0IHdpdGggMSANCisgKiBhbGxvd3MgJy0nIG9yICcgJyBhcyBhIHNlcGFyYXRvciBhbmQgYWxsb3dzIHBhcmVucyBhcm91bmQgYXJlYSBjb2RlIA0KKyAqIHNvbWUgcGVvcGxlIG1heSB3YW50IHRvIHB1dCBhICcxJyBpbiBmcm9udCBvZiB0aGVpciBudW1iZXIgDQorICogDQorICogMSgyMTIpLTk5OS0yMzQ1DQorICogb3INCisgKiAyMTIgOTk5IDIzNDQNCisgKiBvcg0KKyAqIDIxMi05OTktMDk4Mw0KKyAqIA0KKyAqIGJ1dCBub3QNCisgKiAxMTEtMTIzLTU0MzQNCisgKiBhbmQgbm90DQorICogMjEyIDEyMyA0NTY3DQorICovDQoralF1ZXJ5LnZhbGlkYXRvci5hZGRNZXRob2QoInBob25lVVMiLCBmdW5jdGlvbihwaG9uZV9udW1iZXIsIGVsZW1lbnQpIHsNCisgICAgcGhvbmVfbnVtYmVyID0gcGhvbmVfbnVtYmVyLnJlcGxhY2UoL1xzKy9nLCAiIik7IA0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCBwaG9uZV9udW1iZXIubGVuZ3RoID4gOSAmJg0KKwkJcGhvbmVfbnVtYmVyLm1hdGNoKC9eKDEtPyk/KFwoWzItOV1cZHsyfVwpfFsyLTldXGR7Mn0pLT9bMi05XVxkezJ9LT9cZHs0fSQvKTsNCit9LCAiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBwaG9uZSBudW1iZXIiKTsNCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgncGhvbmVVSycsIGZ1bmN0aW9uKHBob25lX251bWJlciwgZWxlbWVudCkgew0KK3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpIHx8IHBob25lX251bWJlci5sZW5ndGggPiA5ICYmDQorcGhvbmVfbnVtYmVyLm1hdGNoKC9eKFwoPygwfFwrNDQpWzEtOV17MX1cZHsxLDR9P1wpP1xzP1xkezMsNH1ccz9cZHszLDR9KSQvKTsNCit9LCAnUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBwaG9uZSBudW1iZXInKTsNCisNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgnbW9iaWxlVUsnLCBmdW5jdGlvbihwaG9uZV9udW1iZXIsIGVsZW1lbnQpIHsNCityZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCBwaG9uZV9udW1iZXIubGVuZ3RoID4gOSAmJg0KK3Bob25lX251bWJlci5tYXRjaCgvXigoMHxcKzQ0KTcoNXw2fDd8OHw5KXsxfVxkezJ9XHM/XGR7Nn0pJC8pOw0KK30sICdQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG1vYmlsZSBudW1iZXInKTsNCisNCisvLyBUT0RPIGNoZWNrIGlmIHZhbHVlIHN0YXJ0cyB3aXRoIDwsIG90aGVyd2lzZSBkb24ndCB0cnkgc3RyaXBwaW5nIGFueXRoaW5nDQoralF1ZXJ5LnZhbGlkYXRvci5hZGRNZXRob2QoInN0cmlwcGVkbWlubGVuZ3RoIiwgZnVuY3Rpb24odmFsdWUsIGVsZW1lbnQsIHBhcmFtKSB7DQorCXJldHVybiBqUXVlcnkodmFsdWUpLnRleHQoKS5sZW5ndGggPj0gcGFyYW07DQorfSwgalF1ZXJ5LnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7MH0gY2hhcmFjdGVycyIpKTsNCisNCisvLyBzYW1lIGFzIGVtYWlsLCBidXQgVExEIGlzIG9wdGlvbmFsDQoralF1ZXJ5LnZhbGlkYXRvci5hZGRNZXRob2QoImVtYWlsMiIsIGZ1bmN0aW9uKHZhbHVlLCBlbGVtZW50LCBwYXJhbSkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXigoKFthLXpdfFxkfFshI1wkJSYnXCpcK1wtXC89XD9cXl9ge1x8fX5dfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSsoXC4oW2Etel18XGR8WyEjXCQlJidcKlwrXC1cLz1cP1xeX2B7XHx9fl18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKykqKXwoKFx4MjIpKCgoKFx4MjB8XHgwOSkqKFx4MGRceDBhKSk/KFx4MjB8XHgwOSkrKT8oKFtceDAxLVx4MDhceDBiXHgwY1x4MGUtXHgxZlx4N2ZdfFx4MjF8W1x4MjMtXHg1Yl18W1x4NWQtXHg3ZV18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfChcXChbXHgwMS1ceDA5XHgwYlx4MGNceDBkLVx4N2ZdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpKSooKChceDIwfFx4MDkpKihceDBkXHgwYSkpPyhceDIwfFx4MDkpKyk/KFx4MjIpKSlAKCgoW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLikqKChbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuPyQvaS50ZXN0KHZhbHVlKTsgDQorfSwgalF1ZXJ5LnZhbGlkYXRvci5tZXNzYWdlcy5lbWFpbCk7DQorDQorLy8gc2FtZSBhcyB1cmwsIGJ1dCBUTEQgaXMgb3B0aW9uYWwNCitqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCgidXJsMiIsIGZ1bmN0aW9uKHZhbHVlLCBlbGVtZW50LCBwYXJhbSkgew0KKwlyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KSB8fCAvXihodHRwcz98ZnRwKTpcL1wvKCgoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6KSpAKT8oKChcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pKXwoKChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuKSooKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4/KSg6XGQqKT8pKFwvKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCkrKFwvKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKSopKik/KT8oXD8oKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKXxbXHVFMDAwLVx1RjhGRl18XC98XD8pKik/KFwjKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCl8XC98XD8pKik/JC9pLnRlc3QodmFsdWUpOyANCit9LCBqUXVlcnkudmFsaWRhdG9yLm1lc3NhZ2VzLnVybCk7DQorDQorLy8gTk9USUNFOiBNb2RpZmllZCB2ZXJzaW9uIG9mIENhc3RsZS5Db21wb25lbnRzLlZhbGlkYXRvci5DcmVkaXRDYXJkVmFsaWRhdG9yDQorLy8gUmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGhlIEFwYWNoZSBMaWNlbnNlIDIuMCBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisvLyBWYWxpZCBUeXBlczogbWFzdGVyY2FyZCwgdmlzYSwgYW1leCwgZGluZXJzY2x1YiwgZW5yb3V0ZSwgZGlzY292ZXIsIGpjYiwgdW5rbm93biwgYWxsIChvdmVycmlkZXMgYWxsIG90aGVyIHNldHRpbmdzKQ0KK2pRdWVyeS52YWxpZGF0b3IuYWRkTWV0aG9kKCJjcmVkaXRjYXJkdHlwZXMiLCBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCwgcGFyYW0pIHsNCisNCisJaWYgKC9bXjAtOS1dKy8udGVzdCh2YWx1ZSkpIA0KKwkJcmV0dXJuIGZhbHNlOw0KKwkNCisJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cRC9nLCAiIik7DQorCQ0KKwl2YXIgdmFsaWRUeXBlcyA9IDB4MDAwMDsNCisJDQorCWlmIChwYXJhbS5tYXN0ZXJjYXJkKSANCisJCXZhbGlkVHlwZXMgfD0gMHgwMDAxOw0KKwlpZiAocGFyYW0udmlzYSkgDQorCQl2YWxpZFR5cGVzIHw9IDB4MDAwMjsNCisJaWYgKHBhcmFtLmFtZXgpIA0KKwkJdmFsaWRUeXBlcyB8PSAweDAwMDQ7DQorCWlmIChwYXJhbS5kaW5lcnNjbHViKSANCisJCXZhbGlkVHlwZXMgfD0gMHgwMDA4Ow0KKwlpZiAocGFyYW0uZW5yb3V0ZSkgDQorCQl2YWxpZFR5cGVzIHw9IDB4MDAxMDsNCisJaWYgKHBhcmFtLmRpc2NvdmVyKSANCisJCXZhbGlkVHlwZXMgfD0gMHgwMDIwOw0KKwlpZiAocGFyYW0uamNiKSANCisJCXZhbGlkVHlwZXMgfD0gMHgwMDQwOw0KKwlpZiAocGFyYW0udW5rbm93bikgDQorCQl2YWxpZFR5cGVzIHw9IDB4MDA4MDsNCisJaWYgKHBhcmFtLmFsbCkgDQorCQl2YWxpZFR5cGVzID0gMHgwMDAxIHwgMHgwMDAyIHwgMHgwMDA0IHwgMHgwMDA4IHwgMHgwMDEwIHwgMHgwMDIwIHwgMHgwMDQwIHwgMHgwMDgwOw0KKwkNCisJaWYgKHZhbGlkVHlwZXMgJiAweDAwMDEgJiYgL14oNTF8NTJ8NTN8NTR8NTUpLy50ZXN0KHZhbHVlKSkgeyAvL21hc3RlcmNhcmQNCisJCXJldHVybiB2YWx1ZS5sZW5ndGggPT0gMTY7DQorCX0NCisJaWYgKHZhbGlkVHlwZXMgJiAweDAwMDIgJiYgL14oNCkvLnRlc3QodmFsdWUpKSB7IC8vdmlzYQ0KKwkJcmV0dXJuIHZhbHVlLmxlbmd0aCA9PSAxNjsNCisJfQ0KKwlpZiAodmFsaWRUeXBlcyAmIDB4MDAwNCAmJiAvXigzNHwzNykvLnRlc3QodmFsdWUpKSB7IC8vYW1leA0KKwkJcmV0dXJuIHZhbHVlLmxlbmd0aCA9PSAxNTsNCisJfQ0KKwlpZiAodmFsaWRUeXBlcyAmIDB4MDAwOCAmJiAvXigzMDB8MzAxfDMwMnwzMDN8MzA0fDMwNXwzNnwzOCkvLnRlc3QodmFsdWUpKSB7IC8vZGluZXJzY2x1Yg0KKwkJcmV0dXJuIHZhbHVlLmxlbmd0aCA9PSAxNDsNCisJfQ0KKwlpZiAodmFsaWRUeXBlcyAmIDB4MDAxMCAmJiAvXigyMDE0fDIxNDkpLy50ZXN0KHZhbHVlKSkgeyAvL2Vucm91dGUNCisJCXJldHVybiB2YWx1ZS5sZW5ndGggPT0gMTU7DQorCX0NCisJaWYgKHZhbGlkVHlwZXMgJiAweDAwMjAgJiYgL14oNjAxMSkvLnRlc3QodmFsdWUpKSB7IC8vZGlzY292ZXINCisJCXJldHVybiB2YWx1ZS5sZW5ndGggPT0gMTY7DQorCX0NCisJaWYgKHZhbGlkVHlwZXMgJiAweDAwNDAgJiYgL14oMykvLnRlc3QodmFsdWUpKSB7IC8vamNiDQorCQlyZXR1cm4gdmFsdWUubGVuZ3RoID09IDE2Ow0KKwl9DQorCWlmICh2YWxpZFR5cGVzICYgMHgwMDQwICYmIC9eKDIxMzF8MTgwMCkvLnRlc3QodmFsdWUpKSB7IC8vamNiDQorCQlyZXR1cm4gdmFsdWUubGVuZ3RoID09IDE1Ow0KKwl9DQorCWlmICh2YWxpZFR5cGVzICYgMHgwMDgwKSB7IC8vdW5rbm93bg0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisJcmV0dXJuIGZhbHNlOw0KK30sICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXIuIik7DQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS9zdGF0aWMvanMvanF1ZXJ5LnZhbGlkYXRlLm1pbi5qcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc3RhdGljL2pzL2pxdWVyeS52YWxpZGF0ZS5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2NDg2NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc3RhdGljL2pzL2pxdWVyeS52YWxpZGF0ZS5taW4uanMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGpRdWVyeSB2YWxpZGF0aW9uIHBsdWctaW4gMS43CisgKgorICogaHR0cDovL2Jhc3Npc3RhbmNlLmRlL2pxdWVyeS1wbHVnaW5zL2pxdWVyeS1wbHVnaW4tdmFsaWRhdGlvbi8KKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vUGx1Z2lucy9WYWxpZGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCBKw7ZybiBaYWVmZmVyZXIKKyAqCisgKiAkSWQ6IGpxdWVyeS52YWxpZGF0ZS5qcyA2NDAzIDIwMDktMDYtMTcgMTQ6Mjc6MTZaIGpvZXJuLnphZWZmZXJlciAkCisgKgorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6CisgKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCisgKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAorICovCisoZnVuY3Rpb24oJCl7JC5leHRlbmQoJC5mbix7dmFsaWRhdGU6ZnVuY3Rpb24ob3B0aW9ucyl7aWYoIXRoaXMubGVuZ3RoKXtvcHRpb25zJiZvcHRpb25zLmRlYnVnJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuKCJub3RoaW5nIHNlbGVjdGVkLCBjYW4ndCB2YWxpZGF0ZSwgcmV0dXJuaW5nIG5vdGhpbmciKTtyZXR1cm47fXZhciB2YWxpZGF0b3I9JC5kYXRhKHRoaXNbMF0sJ3ZhbGlkYXRvcicpO2lmKHZhbGlkYXRvcil7cmV0dXJuIHZhbGlkYXRvcjt9dmFsaWRhdG9yPW5ldyAkLnZhbGlkYXRvcihvcHRpb25zLHRoaXNbMF0pOyQuZGF0YSh0aGlzWzBdLCd2YWxpZGF0b3InLHZhbGlkYXRvcik7aWYodmFsaWRhdG9yLnNldHRpbmdzLm9uc3VibWl0KXt0aGlzLmZpbmQoImlucHV0LCBidXR0b24iKS5maWx0ZXIoIi5jYW5jZWwiKS5jbGljayhmdW5jdGlvbigpe3ZhbGlkYXRvci5jYW5jZWxTdWJtaXQ9dHJ1ZTt9KTtpZih2YWxpZGF0b3Iuc2V0dGluZ3Muc3VibWl0SGFuZGxlcil7dGhpcy5maW5kKCJpbnB1dCwgYnV0dG9uIikuZmlsdGVyKCI6c3VibWl0IikuY2xpY2soZnVuY3Rpb24oKXt2YWxpZGF0b3Iuc3VibWl0QnV0dG9uPXRoaXM7fSk7fXRoaXMuc3VibWl0KGZ1bmN0aW9uKGV2ZW50KXtpZih2YWxpZGF0b3Iuc2V0dGluZ3MuZGVidWcpZXZlbnQucHJldmVudERlZmF1bHQoKTtmdW5jdGlvbiBoYW5kbGUoKXtpZih2YWxpZGF0b3Iuc2V0dGluZ3Muc3VibWl0SGFuZGxlcil7aWYodmFsaWRhdG9yLnN1Ym1pdEJ1dHRvbil7dmFyIGhpZGRlbj0kKCI8aW5wdXQgdHlwZT0naGlkZGVuJy8+IikuYXR0cigibmFtZSIsdmFsaWRhdG9yLnN1Ym1pdEJ1dHRvbi5uYW1lKS52YWwodmFsaWRhdG9yLnN1Ym1pdEJ1dHRvbi52YWx1ZSkuYXBwZW5kVG8odmFsaWRhdG9yLmN1cnJlbnRGb3JtKTt9dmFsaWRhdG9yLnNldHRpbmdzLnN1Ym1pdEhhbmRsZXIuY2FsbCh2YWxpZGF0b3IsdmFsaWRhdG9yLmN1cnJlbnRGb3JtKTtpZih2YWxpZGF0b3Iuc3VibWl0QnV0dG9uKXtoaWRkZW4ucmVtb3ZlKCk7fXJldHVybiBmYWxzZTt9cmV0dXJuIHRydWU7fWlmKHZhbGlkYXRvci5jYW5jZWxTdWJtaXQpe3ZhbGlkYXRvci5jYW5jZWxTdWJtaXQ9ZmFsc2U7cmV0dXJuIGhhbmRsZSgpO31pZih2YWxpZGF0b3IuZm9ybSgpKXtpZih2YWxpZGF0b3IucGVuZGluZ1JlcXVlc3Qpe3ZhbGlkYXRvci5mb3JtU3VibWl0dGVkPXRydWU7cmV0dXJuIGZhbHNlO31yZXR1cm4gaGFuZGxlKCk7fWVsc2V7dmFsaWRhdG9yLmZvY3VzSW52YWxpZCgpO3JldHVybiBmYWxzZTt9fSk7fXJldHVybiB2YWxpZGF0b3I7fSx2YWxpZDpmdW5jdGlvbigpe2lmKCQodGhpc1swXSkuaXMoJ2Zvcm0nKSl7cmV0dXJuIHRoaXMudmFsaWRhdGUoKS5mb3JtKCk7fWVsc2V7dmFyIHZhbGlkPXRydWU7dmFyIHZhbGlkYXRvcj0kKHRoaXNbMF0uZm9ybSkudmFsaWRhdGUoKTt0aGlzLmVhY2goZnVuY3Rpb24oKXt2YWxpZCY9dmFsaWRhdG9yLmVsZW1lbnQodGhpcyk7fSk7cmV0dXJuIHZhbGlkO319LHJlbW92ZUF0dHJzOmZ1bmN0aW9uKGF0dHJpYnV0ZXMpe3ZhciByZXN1bHQ9e30sJGVsZW1lbnQ9dGhpczskLmVhY2goYXR0cmlidXRlcy5zcGxpdCgvXHMvKSxmdW5jdGlvbihpbmRleCx2YWx1ZSl7cmVzdWx0W3ZhbHVlXT0kZWxlbWVudC5hdHRyKHZhbHVlKTskZWxlbWVudC5yZW1vdmVBdHRyKHZhbHVlKTt9KTtyZXR1cm4gcmVzdWx0O30scnVsZXM6ZnVuY3Rpb24oY29tbWFuZCxhcmd1bWVudCl7dmFyIGVsZW1lbnQ9dGhpc1swXTtpZihjb21tYW5kKXt2YXIgc2V0dGluZ3M9JC5kYXRhKGVsZW1lbnQuZm9ybSwndmFsaWRhdG9yJykuc2V0dGluZ3M7dmFyIHN0YXRpY1J1bGVzPXNldHRpbmdzLnJ1bGVzO3ZhciBleGlzdGluZ1J1bGVzPSQudmFsaWRhdG9yLnN0YXRpY1J1bGVzKGVsZW1lbnQpO3N3aXRjaChjb21tYW5kKXtjYXNlImFkZCI6JC5leHRlbmQoZXhpc3RpbmdSdWxlcywkLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlKGFyZ3VtZW50KSk7c3RhdGljUnVsZXNbZWxlbWVudC5uYW1lXT1leGlzdGluZ1J1bGVzO2lmKGFyZ3VtZW50Lm1lc3NhZ2VzKXNldHRpbmdzLm1lc3NhZ2VzW2VsZW1lbnQubmFtZV09JC5leHRlbmQoc2V0dGluZ3MubWVzc2FnZXNbZWxlbWVudC5uYW1lXSxhcmd1bWVudC5tZXNzYWdlcyk7YnJlYWs7Y2FzZSJyZW1vdmUiOmlmKCFhcmd1bWVudCl7ZGVsZXRlIHN0YXRpY1J1bGVzW2VsZW1lbnQubmFtZV07cmV0dXJuIGV4aXN0aW5nUnVsZXM7fXZhciBmaWx0ZXJlZD17fTskLmVhY2goYXJndW1lbnQuc3BsaXQoL1xzLyksZnVuY3Rpb24oaW5kZXgsbWV0aG9kKXtmaWx0ZXJlZFttZXRob2RdPWV4aXN0aW5nUnVsZXNbbWV0aG9kXTtkZWxldGUgZXhpc3RpbmdSdWxlc1ttZXRob2RdO30pO3JldHVybiBmaWx0ZXJlZDt9fXZhciBkYXRhPSQudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGVzKCQuZXh0ZW5kKHt9LCQudmFsaWRhdG9yLm1ldGFkYXRhUnVsZXMoZWxlbWVudCksJC52YWxpZGF0b3IuY2xhc3NSdWxlcyhlbGVtZW50KSwkLnZhbGlkYXRvci5hdHRyaWJ1dGVSdWxlcyhlbGVtZW50KSwkLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhlbGVtZW50KSksZWxlbWVudCk7aWYoZGF0YS5yZXF1aXJlZCl7dmFyIHBhcmFtPWRhdGEucmVxdWlyZWQ7ZGVsZXRlIGRhdGEucmVxdWlyZWQ7ZGF0YT0kLmV4dGVuZCh7cmVxdWlyZWQ6cGFyYW19LGRhdGEpO31yZXR1cm4gZGF0YTt9fSk7JC5leHRlbmQoJC5leHByWyI6Il0se2JsYW5rOmZ1bmN0aW9uKGEpe3JldHVybiEkLnRyaW0oIiIrYS52YWx1ZSk7fSxmaWxsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuISEkLnRyaW0oIiIrYS52YWx1ZSk7fSx1bmNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuY2hlY2tlZDt9fSk7JC52YWxpZGF0b3I9ZnVuY3Rpb24ob3B0aW9ucyxmb3JtKXt0aGlzLnNldHRpbmdzPSQuZXh0ZW5kKHRydWUse30sJC52YWxpZGF0b3IuZGVmYXVsdHMsb3B0aW9ucyk7dGhpcy5jdXJyZW50Rm9ybT1mb3JtO3RoaXMuaW5pdCgpO307JC52YWxpZGF0b3IuZm9ybWF0PWZ1bmN0aW9uKHNvdXJjZSxwYXJhbXMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpcmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9JC5tYWtlQXJyYXkoYXJndW1lbnRzKTthcmdzLnVuc2hpZnQoc291cmNlKTtyZXR1cm4gJC52YWxpZGF0b3IuZm9ybWF0LmFwcGx5KHRoaXMsYXJncyk7fTtpZihhcmd1bWVudHMubGVuZ3RoPjImJnBhcmFtcy5jb25zdHJ1Y3RvciE9QXJyYXkpe3BhcmFtcz0kLm1ha2VBcnJheShhcmd1bWVudHMpLnNsaWNlKDEpO31pZihwYXJhbXMuY29uc3RydWN0b3IhPUFycmF5KXtwYXJhbXM9W3BhcmFtc107fSQuZWFjaChwYXJhbXMsZnVuY3Rpb24oaSxuKXtzb3VyY2U9c291cmNlLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFx7IitpKyJcXH0iLCJnIiksbik7fSk7cmV0dXJuIHNvdXJjZTt9OyQuZXh0ZW5kKCQudmFsaWRhdG9yLHtkZWZhdWx0czp7bWVzc2FnZXM6e30sZ3JvdXBzOnt9LHJ1bGVzOnt9LGVycm9yQ2xhc3M6ImVycm9yIix2YWxpZENsYXNzOiJ2YWxpZCIsZXJyb3JFbGVtZW50OiJsYWJlbCIsZm9jdXNJbnZhbGlkOnRydWUsZXJyb3JDb250YWluZXI6JChbXSksZXJyb3JMYWJlbENvbnRhaW5lcjokKFtdKSxvbnN1Ym1pdDp0cnVlLGlnbm9yZTpbXSxpZ25vcmVUaXRsZTpmYWxzZSxvbmZvY3VzaW46ZnVuY3Rpb24oZWxlbWVudCl7dGhpcy5sYXN0QWN0aXZlPWVsZW1lbnQ7aWYodGhpcy5zZXR0aW5ncy5mb2N1c0NsZWFudXAmJiF0aGlzLmJsb2NrRm9jdXNDbGVhbnVwKXt0aGlzLnNldHRpbmdzLnVuaGlnaGxpZ2h0JiZ0aGlzLnNldHRpbmdzLnVuaGlnaGxpZ2h0LmNhbGwodGhpcyxlbGVtZW50LHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcyx0aGlzLnNldHRpbmdzLnZhbGlkQ2xhc3MpO3RoaXMuZXJyb3JzRm9yKGVsZW1lbnQpLmhpZGUoKTt9fSxvbmZvY3Vzb3V0OmZ1bmN0aW9uKGVsZW1lbnQpe2lmKCF0aGlzLmNoZWNrYWJsZShlbGVtZW50KSYmKGVsZW1lbnQubmFtZSBpbiB0aGlzLnN1Ym1pdHRlZHx8IXRoaXMub3B0aW9uYWwoZWxlbWVudCkpKXt0aGlzLmVsZW1lbnQoZWxlbWVudCk7fX0sb25rZXl1cDpmdW5jdGlvbihlbGVtZW50KXtpZihlbGVtZW50Lm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWR8fGVsZW1lbnQ9PXRoaXMubGFzdEVsZW1lbnQpe3RoaXMuZWxlbWVudChlbGVtZW50KTt9fSxvbmNsaWNrOmZ1bmN0aW9uKGVsZW1lbnQpe2lmKGVsZW1lbnQubmFtZSBpbiB0aGlzLnN1Ym1pdHRlZCl0aGlzLmVsZW1lbnQoZWxlbWVudCk7ZWxzZSBpZihlbGVtZW50LnBhcmVudE5vZGUubmFtZSBpbiB0aGlzLnN1Ym1pdHRlZCl0aGlzLmVsZW1lbnQoZWxlbWVudC5wYXJlbnROb2RlKTt9LGhpZ2hsaWdodDpmdW5jdGlvbihlbGVtZW50LGVycm9yQ2xhc3MsdmFsaWRDbGFzcyl7JChlbGVtZW50KS5hZGRDbGFzcyhlcnJvckNsYXNzKS5yZW1vdmVDbGFzcyh2YWxpZENsYXNzKTt9LHVuaGlnaGxpZ2h0OmZ1bmN0aW9uKGVsZW1lbnQsZXJyb3JDbGFzcyx2YWxpZENsYXNzKXskKGVsZW1lbnQpLnJlbW92ZUNsYXNzKGVycm9yQ2xhc3MpLmFkZENsYXNzKHZhbGlkQ2xhc3MpO319LHNldERlZmF1bHRzOmZ1bmN0aW9uKHNldHRpbmdzKXskLmV4dGVuZCgkLnZhbGlkYXRvci5kZWZhdWx0cyxzZXR0aW5ncyk7fSxtZXNzYWdlczp7cmVxdWlyZWQ6IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIixyZW1vdGU6IlBsZWFzZSBmaXggdGhpcyBmaWVsZC4iLGVtYWlsOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLiIsdXJsOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBVUkwuIixkYXRlOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlLiIsZGF0ZUlTTzoiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSAoSVNPKS4iLG51bWJlcjoiUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyLiIsZGlnaXRzOiJQbGVhc2UgZW50ZXIgb25seSBkaWdpdHMuIixjcmVkaXRjYXJkOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXIuIixlcXVhbFRvOiJQbGVhc2UgZW50ZXIgdGhlIHNhbWUgdmFsdWUgYWdhaW4uIixhY2NlcHQ6IlBsZWFzZSBlbnRlciBhIHZhbHVlIHdpdGggYSB2YWxpZCBleHRlbnNpb24uIixtYXhsZW5ndGg6JC52YWxpZGF0b3IuZm9ybWF0KCJQbGVhc2UgZW50ZXIgbm8gbW9yZSB0aGFuIHswfSBjaGFyYWN0ZXJzLiIpLG1pbmxlbmd0aDokLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7MH0gY2hhcmFjdGVycy4iKSxyYW5nZWxlbmd0aDokLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0gY2hhcmFjdGVycyBsb25nLiIpLHJhbmdlOiQudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIGEgdmFsdWUgYmV0d2VlbiB7MH0gYW5kIHsxfS4iKSxtYXg6JC52YWxpZGF0b3IuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gezB9LiIpLG1pbjokLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7MH0uIil9LGF1dG9DcmVhdGVSYW5nZXM6ZmFsc2UscHJvdG90eXBlOntpbml0OmZ1bmN0aW9uKCl7dGhpcy5sYWJlbENvbnRhaW5lcj0kKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lcik7dGhpcy5lcnJvckNvbnRleHQ9dGhpcy5sYWJlbENvbnRhaW5lci5sZW5ndGgmJnRoaXMubGFiZWxDb250YWluZXJ8fCQodGhpcy5jdXJyZW50Rm9ybSk7dGhpcy5jb250YWluZXJzPSQodGhpcy5zZXR0aW5ncy5lcnJvckNvbnRhaW5lcikuYWRkKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lcik7dGhpcy5zdWJtaXR0ZWQ9e307dGhpcy52YWx1ZUNhY2hlPXt9O3RoaXMucGVuZGluZ1JlcXVlc3Q9MDt0aGlzLnBlbmRpbmc9e307dGhpcy5pbnZhbGlkPXt9O3RoaXMucmVzZXQoKTt2YXIgZ3JvdXBzPSh0aGlzLmdyb3Vwcz17fSk7JC5lYWNoKHRoaXMuc2V0dGluZ3MuZ3JvdXBzLGZ1bmN0aW9uKGtleSx2YWx1ZSl7JC5lYWNoKHZhbHVlLnNwbGl0KC9ccy8pLGZ1bmN0aW9uKGluZGV4LG5hbWUpe2dyb3Vwc1tuYW1lXT1rZXk7fSk7fSk7dmFyIHJ1bGVzPXRoaXMuc2V0dGluZ3MucnVsZXM7JC5lYWNoKHJ1bGVzLGZ1bmN0aW9uKGtleSx2YWx1ZSl7cnVsZXNba2V5XT0kLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlKHZhbHVlKTt9KTtmdW5jdGlvbiBkZWxlZ2F0ZShldmVudCl7dmFyIHZhbGlkYXRvcj0kLmRhdGEodGhpc1swXS5mb3JtLCJ2YWxpZGF0b3IiKSxldmVudFR5cGU9Im9uIitldmVudC50eXBlLnJlcGxhY2UoL152YWxpZGF0ZS8sIiIpO3ZhbGlkYXRvci5zZXR0aW5nc1tldmVudFR5cGVdJiZ2YWxpZGF0b3Iuc2V0dGluZ3NbZXZlbnRUeXBlXS5jYWxsKHZhbGlkYXRvcix0aGlzWzBdKTt9JCh0aGlzLmN1cnJlbnRGb3JtKS52YWxpZGF0ZURlbGVnYXRlKCI6dGV4dCwgOnBhc3N3b3JkLCA6ZmlsZSwgc2VsZWN0LCB0ZXh0YXJlYSIsImZvY3VzaW4gZm9jdXNvdXQga2V5dXAiLGRlbGVnYXRlKS52YWxpZGF0ZURlbGVnYXRlKCI6cmFkaW8sIDpjaGVja2JveCwgc2VsZWN0LCBvcHRpb24iLCJjbGljayIsZGVsZWdhdGUpO2lmKHRoaXMuc2V0dGluZ3MuaW52YWxpZEhhbmRsZXIpJCh0aGlzLmN1cnJlbnRGb3JtKS5iaW5kKCJpbnZhbGlkLWZvcm0udmFsaWRhdGUiLHRoaXMuc2V0dGluZ3MuaW52YWxpZEhhbmRsZXIpO30sZm9ybTpmdW5jdGlvbigpe3RoaXMuY2hlY2tGb3JtKCk7JC5leHRlbmQodGhpcy5zdWJtaXR0ZWQsdGhpcy5lcnJvck1hcCk7dGhpcy5pbnZhbGlkPSQuZXh0ZW5kKHt9LHRoaXMuZXJyb3JNYXApO2lmKCF0aGlzLnZhbGlkKCkpJCh0aGlzLmN1cnJlbnRGb3JtKS50cmlnZ2VySGFuZGxlcigiaW52YWxpZC1mb3JtIixbdGhpc10pO3RoaXMuc2hvd0Vycm9ycygpO3JldHVybiB0aGlzLnZhbGlkKCk7fSxjaGVja0Zvcm06ZnVuY3Rpb24oKXt0aGlzLnByZXBhcmVGb3JtKCk7Zm9yKHZhciBpPTAsZWxlbWVudHM9KHRoaXMuY3VycmVudEVsZW1lbnRzPXRoaXMuZWxlbWVudHMoKSk7ZWxlbWVudHNbaV07aSsrKXt0aGlzLmNoZWNrKGVsZW1lbnRzW2ldKTt9cmV0dXJuIHRoaXMudmFsaWQoKTt9LGVsZW1lbnQ6ZnVuY3Rpb24oZWxlbWVudCl7ZWxlbWVudD10aGlzLmNsZWFuKGVsZW1lbnQpO3RoaXMubGFzdEVsZW1lbnQ9ZWxlbWVudDt0aGlzLnByZXBhcmVFbGVtZW50KGVsZW1lbnQpO3RoaXMuY3VycmVudEVsZW1lbnRzPSQoZWxlbWVudCk7dmFyIHJlc3VsdD10aGlzLmNoZWNrKGVsZW1lbnQpO2lmKHJlc3VsdCl7ZGVsZXRlIHRoaXMuaW52YWxpZFtlbGVtZW50Lm5hbWVdO31lbHNle3RoaXMuaW52YWxpZFtlbGVtZW50Lm5hbWVdPXRydWU7fWlmKCF0aGlzLm51bWJlck9mSW52YWxpZHMoKSl7dGhpcy50b0hpZGU9dGhpcy50b0hpZGUuYWRkKHRoaXMuY29udGFpbmVycyk7fXRoaXMuc2hvd0Vycm9ycygpO3JldHVybiByZXN1bHQ7fSxzaG93RXJyb3JzOmZ1bmN0aW9uKGVycm9ycyl7aWYoZXJyb3JzKXskLmV4dGVuZCh0aGlzLmVycm9yTWFwLGVycm9ycyk7dGhpcy5lcnJvckxpc3Q9W107Zm9yKHZhciBuYW1lIGluIGVycm9ycyl7dGhpcy5lcnJvckxpc3QucHVzaCh7bWVzc2FnZTplcnJvcnNbbmFtZV0sZWxlbWVudDp0aGlzLmZpbmRCeU5hbWUobmFtZSlbMF19KTt9dGhpcy5zdWNjZXNzTGlzdD0kLmdyZXAodGhpcy5zdWNjZXNzTGlzdCxmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4hKGVsZW1lbnQubmFtZSBpbiBlcnJvcnMpO30pO310aGlzLnNldHRpbmdzLnNob3dFcnJvcnM/dGhpcy5zZXR0aW5ncy5zaG93RXJyb3JzLmNhbGwodGhpcyx0aGlzLmVycm9yTWFwLHRoaXMuZXJyb3JMaXN0KTp0aGlzLmRlZmF1bHRTaG93RXJyb3JzKCk7fSxyZXNldEZvcm06ZnVuY3Rpb24oKXtpZigkLmZuLnJlc2V0Rm9ybSkkKHRoaXMuY3VycmVudEZvcm0pLnJlc2V0Rm9ybSgpO3RoaXMuc3VibWl0dGVkPXt9O3RoaXMucHJlcGFyZUZvcm0oKTt0aGlzLmhpZGVFcnJvcnMoKTt0aGlzLmVsZW1lbnRzKCkucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzKTt9LG51bWJlck9mSW52YWxpZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYmplY3RMZW5ndGgodGhpcy5pbnZhbGlkKTt9LG9iamVjdExlbmd0aDpmdW5jdGlvbihvYmope3ZhciBjb3VudD0wO2Zvcih2YXIgaSBpbiBvYmopY291bnQrKztyZXR1cm4gY291bnQ7fSxoaWRlRXJyb3JzOmZ1bmN0aW9uKCl7dGhpcy5hZGRXcmFwcGVyKHRoaXMudG9IaWRlKS5oaWRlKCk7fSx2YWxpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemUoKT09MDt9LHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckxpc3QubGVuZ3RoO30sZm9jdXNJbnZhbGlkOmZ1bmN0aW9uKCl7aWYodGhpcy5zZXR0aW5ncy5mb2N1c0ludmFsaWQpe3RyeXskKHRoaXMuZmluZExhc3RBY3RpdmUoKXx8dGhpcy5lcnJvckxpc3QubGVuZ3RoJiZ0aGlzLmVycm9yTGlzdFswXS5lbGVtZW50fHxbXSkuZmlsdGVyKCI6dmlzaWJsZSIpLmZvY3VzKCkudHJpZ2dlcigiZm9jdXNpbiIpO31jYXRjaChlKXt9fX0sZmluZExhc3RBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgbGFzdEFjdGl2ZT10aGlzLmxhc3RBY3RpdmU7cmV0dXJuIGxhc3RBY3RpdmUmJiQuZ3JlcCh0aGlzLmVycm9yTGlzdCxmdW5jdGlvbihuKXtyZXR1cm4gbi5lbGVtZW50Lm5hbWU9PWxhc3RBY3RpdmUubmFtZTt9KS5sZW5ndGg9PTEmJmxhc3RBY3RpdmU7fSxlbGVtZW50czpmdW5jdGlvbigpe3ZhciB2YWxpZGF0b3I9dGhpcyxydWxlc0NhY2hlPXt9O3JldHVybiAkKFtdKS5hZGQodGhpcy5jdXJyZW50Rm9ybS5lbGVtZW50cykuZmlsdGVyKCI6aW5wdXQiKS5ub3QoIjpzdWJtaXQsIDpyZXNldCwgOmltYWdlLCBbZGlzYWJsZWRdIikubm90KHRoaXMuc2V0dGluZ3MuaWdub3JlKS5maWx0ZXIoZnVuY3Rpb24oKXshdGhpcy5uYW1lJiZ2YWxpZGF0b3Iuc2V0dGluZ3MuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmVycm9yKCIlbyBoYXMgbm8gbmFtZSBhc3NpZ25lZCIsdGhpcyk7aWYodGhpcy5uYW1lIGluIHJ1bGVzQ2FjaGV8fCF2YWxpZGF0b3Iub2JqZWN0TGVuZ3RoKCQodGhpcykucnVsZXMoKSkpcmV0dXJuIGZhbHNlO3J1bGVzQ2FjaGVbdGhpcy5uYW1lXT10cnVlO3JldHVybiB0cnVlO30pO30sY2xlYW46ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiAkKHNlbGVjdG9yKVswXTt9LGVycm9yczpmdW5jdGlvbigpe3JldHVybiAkKHRoaXMuc2V0dGluZ3MuZXJyb3JFbGVtZW50KyIuIit0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MsdGhpcy5lcnJvckNvbnRleHQpO30scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnN1Y2Nlc3NMaXN0PVtdO3RoaXMuZXJyb3JMaXN0PVtdO3RoaXMuZXJyb3JNYXA9e307dGhpcy50b1Nob3c9JChbXSk7dGhpcy50b0hpZGU9JChbXSk7dGhpcy5jdXJyZW50RWxlbWVudHM9JChbXSk7fSxwcmVwYXJlRm9ybTpmdW5jdGlvbigpe3RoaXMucmVzZXQoKTt0aGlzLnRvSGlkZT10aGlzLmVycm9ycygpLmFkZCh0aGlzLmNvbnRhaW5lcnMpO30scHJlcGFyZUVsZW1lbnQ6ZnVuY3Rpb24oZWxlbWVudCl7dGhpcy5yZXNldCgpO3RoaXMudG9IaWRlPXRoaXMuZXJyb3JzRm9yKGVsZW1lbnQpO30sY2hlY2s6ZnVuY3Rpb24oZWxlbWVudCl7ZWxlbWVudD10aGlzLmNsZWFuKGVsZW1lbnQpO2lmKHRoaXMuY2hlY2thYmxlKGVsZW1lbnQpKXtlbGVtZW50PXRoaXMuZmluZEJ5TmFtZShlbGVtZW50Lm5hbWUpWzBdO312YXIgcnVsZXM9JChlbGVtZW50KS5ydWxlcygpO3ZhciBkZXBlbmRlbmN5TWlzbWF0Y2g9ZmFsc2U7Zm9yKG1ldGhvZCBpbiBydWxlcyl7dmFyIHJ1bGU9e21ldGhvZDptZXRob2QscGFyYW1ldGVyczpydWxlc1ttZXRob2RdfTt0cnl7dmFyIHJlc3VsdD0kLnZhbGlkYXRvci5tZXRob2RzW21ldGhvZF0uY2FsbCh0aGlzLGVsZW1lbnQudmFsdWUucmVwbGFjZSgvXHIvZywiIiksZWxlbWVudCxydWxlLnBhcmFtZXRlcnMpO2lmKHJlc3VsdD09ImRlcGVuZGVuY3ktbWlzbWF0Y2giKXtkZXBlbmRlbmN5TWlzbWF0Y2g9dHJ1ZTtjb250aW51ZTt9ZGVwZW5kZW5jeU1pc21hdGNoPWZhbHNlO2lmKHJlc3VsdD09InBlbmRpbmciKXt0aGlzLnRvSGlkZT10aGlzLnRvSGlkZS5ub3QodGhpcy5lcnJvcnNGb3IoZWxlbWVudCkpO3JldHVybjt9aWYoIXJlc3VsdCl7dGhpcy5mb3JtYXRBbmRBZGQoZWxlbWVudCxydWxlKTtyZXR1cm4gZmFsc2U7fX1jYXRjaChlKXt0aGlzLnNldHRpbmdzLmRlYnVnJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2coImV4Y2VwdGlvbiBvY2N1cmVkIHdoZW4gY2hlY2tpbmcgZWxlbWVudCAiK2VsZW1lbnQuaWQKKysiLCBjaGVjayB0aGUgJyIrcnVsZS5tZXRob2QrIicgbWV0aG9kIixlKTt0aHJvdyBlO319aWYoZGVwZW5kZW5jeU1pc21hdGNoKXJldHVybjtpZih0aGlzLm9iamVjdExlbmd0aChydWxlcykpdGhpcy5zdWNjZXNzTGlzdC5wdXNoKGVsZW1lbnQpO3JldHVybiB0cnVlO30sY3VzdG9tTWV0YU1lc3NhZ2U6ZnVuY3Rpb24oZWxlbWVudCxtZXRob2Qpe2lmKCEkLm1ldGFkYXRhKXJldHVybjt2YXIgbWV0YT10aGlzLnNldHRpbmdzLm1ldGE/JChlbGVtZW50KS5tZXRhZGF0YSgpW3RoaXMuc2V0dGluZ3MubWV0YV06JChlbGVtZW50KS5tZXRhZGF0YSgpO3JldHVybiBtZXRhJiZtZXRhLm1lc3NhZ2VzJiZtZXRhLm1lc3NhZ2VzW21ldGhvZF07fSxjdXN0b21NZXNzYWdlOmZ1bmN0aW9uKG5hbWUsbWV0aG9kKXt2YXIgbT10aGlzLnNldHRpbmdzLm1lc3NhZ2VzW25hbWVdO3JldHVybiBtJiYobS5jb25zdHJ1Y3Rvcj09U3RyaW5nP206bVttZXRob2RdKTt9LGZpbmREZWZpbmVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7aWYoYXJndW1lbnRzW2ldIT09dW5kZWZpbmVkKXJldHVybiBhcmd1bWVudHNbaV07fXJldHVybiB1bmRlZmluZWQ7fSxkZWZhdWx0TWVzc2FnZTpmdW5jdGlvbihlbGVtZW50LG1ldGhvZCl7cmV0dXJuIHRoaXMuZmluZERlZmluZWQodGhpcy5jdXN0b21NZXNzYWdlKGVsZW1lbnQubmFtZSxtZXRob2QpLHRoaXMuY3VzdG9tTWV0YU1lc3NhZ2UoZWxlbWVudCxtZXRob2QpLCF0aGlzLnNldHRpbmdzLmlnbm9yZVRpdGxlJiZlbGVtZW50LnRpdGxlfHx1bmRlZmluZWQsJC52YWxpZGF0b3IubWVzc2FnZXNbbWV0aG9kXSwiPHN0cm9uZz5XYXJuaW5nOiBObyBtZXNzYWdlIGRlZmluZWQgZm9yICIrZWxlbWVudC5uYW1lKyI8L3N0cm9uZz4iKTt9LGZvcm1hdEFuZEFkZDpmdW5jdGlvbihlbGVtZW50LHJ1bGUpe3ZhciBtZXNzYWdlPXRoaXMuZGVmYXVsdE1lc3NhZ2UoZWxlbWVudCxydWxlLm1ldGhvZCksdGhlcmVnZXg9L1wkP1x7KFxkKylcfS9nO2lmKHR5cGVvZiBtZXNzYWdlPT0iZnVuY3Rpb24iKXttZXNzYWdlPW1lc3NhZ2UuY2FsbCh0aGlzLHJ1bGUucGFyYW1ldGVycyxlbGVtZW50KTt9ZWxzZSBpZih0aGVyZWdleC50ZXN0KG1lc3NhZ2UpKXttZXNzYWdlPWpRdWVyeS5mb3JtYXQobWVzc2FnZS5yZXBsYWNlKHRoZXJlZ2V4LCd7JDF9JykscnVsZS5wYXJhbWV0ZXJzKTt9dGhpcy5lcnJvckxpc3QucHVzaCh7bWVzc2FnZTptZXNzYWdlLGVsZW1lbnQ6ZWxlbWVudH0pO3RoaXMuZXJyb3JNYXBbZWxlbWVudC5uYW1lXT1tZXNzYWdlO3RoaXMuc3VibWl0dGVkW2VsZW1lbnQubmFtZV09bWVzc2FnZTt9LGFkZFdyYXBwZXI6ZnVuY3Rpb24odG9Ub2dnbGUpe2lmKHRoaXMuc2V0dGluZ3Mud3JhcHBlcil0b1RvZ2dsZT10b1RvZ2dsZS5hZGQodG9Ub2dnbGUucGFyZW50KHRoaXMuc2V0dGluZ3Mud3JhcHBlcikpO3JldHVybiB0b1RvZ2dsZTt9LGRlZmF1bHRTaG93RXJyb3JzOmZ1bmN0aW9uKCl7Zm9yKHZhciBpPTA7dGhpcy5lcnJvckxpc3RbaV07aSsrKXt2YXIgZXJyb3I9dGhpcy5lcnJvckxpc3RbaV07dGhpcy5zZXR0aW5ncy5oaWdobGlnaHQmJnRoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0LmNhbGwodGhpcyxlcnJvci5lbGVtZW50LHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcyx0aGlzLnNldHRpbmdzLnZhbGlkQ2xhc3MpO3RoaXMuc2hvd0xhYmVsKGVycm9yLmVsZW1lbnQsZXJyb3IubWVzc2FnZSk7fWlmKHRoaXMuZXJyb3JMaXN0Lmxlbmd0aCl7dGhpcy50b1Nob3c9dGhpcy50b1Nob3cuYWRkKHRoaXMuY29udGFpbmVycyk7fWlmKHRoaXMuc2V0dGluZ3Muc3VjY2Vzcyl7Zm9yKHZhciBpPTA7dGhpcy5zdWNjZXNzTGlzdFtpXTtpKyspe3RoaXMuc2hvd0xhYmVsKHRoaXMuc3VjY2Vzc0xpc3RbaV0pO319aWYodGhpcy5zZXR0aW5ncy51bmhpZ2hsaWdodCl7Zm9yKHZhciBpPTAsZWxlbWVudHM9dGhpcy52YWxpZEVsZW1lbnRzKCk7ZWxlbWVudHNbaV07aSsrKXt0aGlzLnNldHRpbmdzLnVuaGlnaGxpZ2h0LmNhbGwodGhpcyxlbGVtZW50c1tpXSx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MsdGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKTt9fXRoaXMudG9IaWRlPXRoaXMudG9IaWRlLm5vdCh0aGlzLnRvU2hvdyk7dGhpcy5oaWRlRXJyb3JzKCk7dGhpcy5hZGRXcmFwcGVyKHRoaXMudG9TaG93KS5zaG93KCk7fSx2YWxpZEVsZW1lbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudEVsZW1lbnRzLm5vdCh0aGlzLmludmFsaWRFbGVtZW50cygpKTt9LGludmFsaWRFbGVtZW50czpmdW5jdGlvbigpe3JldHVybiAkKHRoaXMuZXJyb3JMaXN0KS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50O30pO30sc2hvd0xhYmVsOmZ1bmN0aW9uKGVsZW1lbnQsbWVzc2FnZSl7dmFyIGxhYmVsPXRoaXMuZXJyb3JzRm9yKGVsZW1lbnQpO2lmKGxhYmVsLmxlbmd0aCl7bGFiZWwucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpO2xhYmVsLmF0dHIoImdlbmVyYXRlZCIpJiZsYWJlbC5odG1sKG1lc3NhZ2UpO31lbHNle2xhYmVsPSQoIjwiK3RoaXMuc2V0dGluZ3MuZXJyb3JFbGVtZW50KyIvPiIpLmF0dHIoeyJmb3IiOnRoaXMuaWRPck5hbWUoZWxlbWVudCksZ2VuZXJhdGVkOnRydWV9KS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpLmh0bWwobWVzc2FnZXx8IiIpO2lmKHRoaXMuc2V0dGluZ3Mud3JhcHBlcil7bGFiZWw9bGFiZWwuaGlkZSgpLnNob3coKS53cmFwKCI8Iit0aGlzLnNldHRpbmdzLndyYXBwZXIrIi8+IikucGFyZW50KCk7fWlmKCF0aGlzLmxhYmVsQ29udGFpbmVyLmFwcGVuZChsYWJlbCkubGVuZ3RoKXRoaXMuc2V0dGluZ3MuZXJyb3JQbGFjZW1lbnQ/dGhpcy5zZXR0aW5ncy5lcnJvclBsYWNlbWVudChsYWJlbCwkKGVsZW1lbnQpKTpsYWJlbC5pbnNlcnRBZnRlcihlbGVtZW50KTt9aWYoIW1lc3NhZ2UmJnRoaXMuc2V0dGluZ3Muc3VjY2Vzcyl7bGFiZWwudGV4dCgiIik7dHlwZW9mIHRoaXMuc2V0dGluZ3Muc3VjY2Vzcz09InN0cmluZyI/bGFiZWwuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5zdWNjZXNzKTp0aGlzLnNldHRpbmdzLnN1Y2Nlc3MobGFiZWwpO310aGlzLnRvU2hvdz10aGlzLnRvU2hvdy5hZGQobGFiZWwpO30sZXJyb3JzRm9yOmZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBuYW1lPXRoaXMuaWRPck5hbWUoZWxlbWVudCk7cmV0dXJuIHRoaXMuZXJyb3JzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignZm9yJyk9PW5hbWU7fSk7fSxpZE9yTmFtZTpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gdGhpcy5ncm91cHNbZWxlbWVudC5uYW1lXXx8KHRoaXMuY2hlY2thYmxlKGVsZW1lbnQpP2VsZW1lbnQubmFtZTplbGVtZW50LmlkfHxlbGVtZW50Lm5hbWUpO30sY2hlY2thYmxlOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybi9yYWRpb3xjaGVja2JveC9pLnRlc3QoZWxlbWVudC50eXBlKTt9LGZpbmRCeU5hbWU6ZnVuY3Rpb24obmFtZSl7dmFyIGZvcm09dGhpcy5jdXJyZW50Rm9ybTtyZXR1cm4gJChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSkubWFwKGZ1bmN0aW9uKGluZGV4LGVsZW1lbnQpe3JldHVybiBlbGVtZW50LmZvcm09PWZvcm0mJmVsZW1lbnQubmFtZT09bmFtZSYmZWxlbWVudHx8bnVsbDt9KTt9LGdldExlbmd0aDpmdW5jdGlvbih2YWx1ZSxlbGVtZW50KXtzd2l0Y2goZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtjYXNlJ3NlbGVjdCc6cmV0dXJuICQoIm9wdGlvbjpzZWxlY3RlZCIsZWxlbWVudCkubGVuZ3RoO2Nhc2UnaW5wdXQnOmlmKHRoaXMuY2hlY2thYmxlKGVsZW1lbnQpKXJldHVybiB0aGlzLmZpbmRCeU5hbWUoZWxlbWVudC5uYW1lKS5maWx0ZXIoJzpjaGVja2VkJykubGVuZ3RoO31yZXR1cm4gdmFsdWUubGVuZ3RoO30sZGVwZW5kOmZ1bmN0aW9uKHBhcmFtLGVsZW1lbnQpe3JldHVybiB0aGlzLmRlcGVuZFR5cGVzW3R5cGVvZiBwYXJhbV0/dGhpcy5kZXBlbmRUeXBlc1t0eXBlb2YgcGFyYW1dKHBhcmFtLGVsZW1lbnQpOnRydWU7fSxkZXBlbmRUeXBlczp7ImJvb2xlYW4iOmZ1bmN0aW9uKHBhcmFtLGVsZW1lbnQpe3JldHVybiBwYXJhbTt9LCJzdHJpbmciOmZ1bmN0aW9uKHBhcmFtLGVsZW1lbnQpe3JldHVybiEhJChwYXJhbSxlbGVtZW50LmZvcm0pLmxlbmd0aDt9LCJmdW5jdGlvbiI6ZnVuY3Rpb24ocGFyYW0sZWxlbWVudCl7cmV0dXJuIHBhcmFtKGVsZW1lbnQpO319LG9wdGlvbmFsOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiEkLnZhbGlkYXRvci5tZXRob2RzLnJlcXVpcmVkLmNhbGwodGhpcywkLnRyaW0oZWxlbWVudC52YWx1ZSksZWxlbWVudCkmJiJkZXBlbmRlbmN5LW1pc21hdGNoIjt9LHN0YXJ0UmVxdWVzdDpmdW5jdGlvbihlbGVtZW50KXtpZighdGhpcy5wZW5kaW5nW2VsZW1lbnQubmFtZV0pe3RoaXMucGVuZGluZ1JlcXVlc3QrKzt0aGlzLnBlbmRpbmdbZWxlbWVudC5uYW1lXT10cnVlO319LHN0b3BSZXF1ZXN0OmZ1bmN0aW9uKGVsZW1lbnQsdmFsaWQpe3RoaXMucGVuZGluZ1JlcXVlc3QtLTtpZih0aGlzLnBlbmRpbmdSZXF1ZXN0PDApdGhpcy5wZW5kaW5nUmVxdWVzdD0wO2RlbGV0ZSB0aGlzLnBlbmRpbmdbZWxlbWVudC5uYW1lXTtpZih2YWxpZCYmdGhpcy5wZW5kaW5nUmVxdWVzdD09MCYmdGhpcy5mb3JtU3VibWl0dGVkJiZ0aGlzLmZvcm0oKSl7JCh0aGlzLmN1cnJlbnRGb3JtKS5zdWJtaXQoKTt0aGlzLmZvcm1TdWJtaXR0ZWQ9ZmFsc2U7fWVsc2UgaWYoIXZhbGlkJiZ0aGlzLnBlbmRpbmdSZXF1ZXN0PT0wJiZ0aGlzLmZvcm1TdWJtaXR0ZWQpeyQodGhpcy5jdXJyZW50Rm9ybSkudHJpZ2dlckhhbmRsZXIoImludmFsaWQtZm9ybSIsW3RoaXNdKTt0aGlzLmZvcm1TdWJtaXR0ZWQ9ZmFsc2U7fX0scHJldmlvdXNWYWx1ZTpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gJC5kYXRhKGVsZW1lbnQsInByZXZpb3VzVmFsdWUiKXx8JC5kYXRhKGVsZW1lbnQsInByZXZpb3VzVmFsdWUiLHtvbGQ6bnVsbCx2YWxpZDp0cnVlLG1lc3NhZ2U6dGhpcy5kZWZhdWx0TWVzc2FnZShlbGVtZW50LCJyZW1vdGUiKX0pO319LGNsYXNzUnVsZVNldHRpbmdzOntyZXF1aXJlZDp7cmVxdWlyZWQ6dHJ1ZX0sZW1haWw6e2VtYWlsOnRydWV9LHVybDp7dXJsOnRydWV9LGRhdGU6e2RhdGU6dHJ1ZX0sZGF0ZUlTTzp7ZGF0ZUlTTzp0cnVlfSxkYXRlREU6e2RhdGVERTp0cnVlfSxudW1iZXI6e251bWJlcjp0cnVlfSxudW1iZXJERTp7bnVtYmVyREU6dHJ1ZX0sZGlnaXRzOntkaWdpdHM6dHJ1ZX0sY3JlZGl0Y2FyZDp7Y3JlZGl0Y2FyZDp0cnVlfX0sYWRkQ2xhc3NSdWxlczpmdW5jdGlvbihjbGFzc05hbWUscnVsZXMpe2NsYXNzTmFtZS5jb25zdHJ1Y3Rvcj09U3RyaW5nP3RoaXMuY2xhc3NSdWxlU2V0dGluZ3NbY2xhc3NOYW1lXT1ydWxlczokLmV4dGVuZCh0aGlzLmNsYXNzUnVsZVNldHRpbmdzLGNsYXNzTmFtZSk7fSxjbGFzc1J1bGVzOmZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBydWxlcz17fTt2YXIgY2xhc3Nlcz0kKGVsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7Y2xhc3NlcyYmJC5lYWNoKGNsYXNzZXMuc3BsaXQoJyAnKSxmdW5jdGlvbigpe2lmKHRoaXMgaW4gJC52YWxpZGF0b3IuY2xhc3NSdWxlU2V0dGluZ3MpeyQuZXh0ZW5kKHJ1bGVzLCQudmFsaWRhdG9yLmNsYXNzUnVsZVNldHRpbmdzW3RoaXNdKTt9fSk7cmV0dXJuIHJ1bGVzO30sYXR0cmlidXRlUnVsZXM6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIHJ1bGVzPXt9O3ZhciAkZWxlbWVudD0kKGVsZW1lbnQpO2ZvcihtZXRob2QgaW4gJC52YWxpZGF0b3IubWV0aG9kcyl7dmFyIHZhbHVlPSRlbGVtZW50LmF0dHIobWV0aG9kKTtpZih2YWx1ZSl7cnVsZXNbbWV0aG9kXT12YWx1ZTt9fWlmKHJ1bGVzLm1heGxlbmd0aCYmLy0xfDIxNDc0ODM2NDd8NTI0Mjg4Ly50ZXN0KHJ1bGVzLm1heGxlbmd0aCkpe2RlbGV0ZSBydWxlcy5tYXhsZW5ndGg7fXJldHVybiBydWxlczt9LG1ldGFkYXRhUnVsZXM6ZnVuY3Rpb24oZWxlbWVudCl7aWYoISQubWV0YWRhdGEpcmV0dXJue307dmFyIG1ldGE9JC5kYXRhKGVsZW1lbnQuZm9ybSwndmFsaWRhdG9yJykuc2V0dGluZ3MubWV0YTtyZXR1cm4gbWV0YT8kKGVsZW1lbnQpLm1ldGFkYXRhKClbbWV0YV06JChlbGVtZW50KS5tZXRhZGF0YSgpO30sc3RhdGljUnVsZXM6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIHJ1bGVzPXt9O3ZhciB2YWxpZGF0b3I9JC5kYXRhKGVsZW1lbnQuZm9ybSwndmFsaWRhdG9yJyk7aWYodmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzKXtydWxlcz0kLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlKHZhbGlkYXRvci5zZXR0aW5ncy5ydWxlc1tlbGVtZW50Lm5hbWVdKXx8e307fXJldHVybiBydWxlczt9LG5vcm1hbGl6ZVJ1bGVzOmZ1bmN0aW9uKHJ1bGVzLGVsZW1lbnQpeyQuZWFjaChydWxlcyxmdW5jdGlvbihwcm9wLHZhbCl7aWYodmFsPT09ZmFsc2Upe2RlbGV0ZSBydWxlc1twcm9wXTtyZXR1cm47fWlmKHZhbC5wYXJhbXx8dmFsLmRlcGVuZHMpe3ZhciBrZWVwUnVsZT10cnVlO3N3aXRjaCh0eXBlb2YgdmFsLmRlcGVuZHMpe2Nhc2Uic3RyaW5nIjprZWVwUnVsZT0hISQodmFsLmRlcGVuZHMsZWxlbWVudC5mb3JtKS5sZW5ndGg7YnJlYWs7Y2FzZSJmdW5jdGlvbiI6a2VlcFJ1bGU9dmFsLmRlcGVuZHMuY2FsbChlbGVtZW50LGVsZW1lbnQpO2JyZWFrO31pZihrZWVwUnVsZSl7cnVsZXNbcHJvcF09dmFsLnBhcmFtIT09dW5kZWZpbmVkP3ZhbC5wYXJhbTp0cnVlO31lbHNle2RlbGV0ZSBydWxlc1twcm9wXTt9fX0pOyQuZWFjaChydWxlcyxmdW5jdGlvbihydWxlLHBhcmFtZXRlcil7cnVsZXNbcnVsZV09JC5pc0Z1bmN0aW9uKHBhcmFtZXRlcik/cGFyYW1ldGVyKGVsZW1lbnQpOnBhcmFtZXRlcjt9KTskLmVhY2goWydtaW5sZW5ndGgnLCdtYXhsZW5ndGgnLCdtaW4nLCdtYXgnXSxmdW5jdGlvbigpe2lmKHJ1bGVzW3RoaXNdKXtydWxlc1t0aGlzXT1OdW1iZXIocnVsZXNbdGhpc10pO319KTskLmVhY2goWydyYW5nZWxlbmd0aCcsJ3JhbmdlJ10sZnVuY3Rpb24oKXtpZihydWxlc1t0aGlzXSl7cnVsZXNbdGhpc109W051bWJlcihydWxlc1t0aGlzXVswXSksTnVtYmVyKHJ1bGVzW3RoaXNdWzFdKV07fX0pO2lmKCQudmFsaWRhdG9yLmF1dG9DcmVhdGVSYW5nZXMpe2lmKHJ1bGVzLm1pbiYmcnVsZXMubWF4KXtydWxlcy5yYW5nZT1bcnVsZXMubWluLHJ1bGVzLm1heF07ZGVsZXRlIHJ1bGVzLm1pbjtkZWxldGUgcnVsZXMubWF4O31pZihydWxlcy5taW5sZW5ndGgmJnJ1bGVzLm1heGxlbmd0aCl7cnVsZXMucmFuZ2VsZW5ndGg9W3J1bGVzLm1pbmxlbmd0aCxydWxlcy5tYXhsZW5ndGhdO2RlbGV0ZSBydWxlcy5taW5sZW5ndGg7ZGVsZXRlIHJ1bGVzLm1heGxlbmd0aDt9fWlmKHJ1bGVzLm1lc3NhZ2VzKXtkZWxldGUgcnVsZXMubWVzc2FnZXM7fXJldHVybiBydWxlczt9LG5vcm1hbGl6ZVJ1bGU6ZnVuY3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJpbmciKXt2YXIgdHJhbnNmb3JtZWQ9e307JC5lYWNoKGRhdGEuc3BsaXQoL1xzLyksZnVuY3Rpb24oKXt0cmFuc2Zvcm1lZFt0aGlzXT10cnVlO30pO2RhdGE9dHJhbnNmb3JtZWQ7fXJldHVybiBkYXRhO30sYWRkTWV0aG9kOmZ1bmN0aW9uKG5hbWUsbWV0aG9kLG1lc3NhZ2UpeyQudmFsaWRhdG9yLm1ldGhvZHNbbmFtZV09bWV0aG9kOyQudmFsaWRhdG9yLm1lc3NhZ2VzW25hbWVdPW1lc3NhZ2UhPXVuZGVmaW5lZD9tZXNzYWdlOiQudmFsaWRhdG9yLm1lc3NhZ2VzW25hbWVdO2lmKG1ldGhvZC5sZW5ndGg8Myl7JC52YWxpZGF0b3IuYWRkQ2xhc3NSdWxlcyhuYW1lLCQudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUobmFtZSkpO319LG1ldGhvZHM6e3JlcXVpcmVkOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe2lmKCF0aGlzLmRlcGVuZChwYXJhbSxlbGVtZW50KSlyZXR1cm4iZGVwZW5kZW5jeS1taXNtYXRjaCI7c3dpdGNoKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Y2FzZSdzZWxlY3QnOnZhciB2YWw9JChlbGVtZW50KS52YWwoKTtyZXR1cm4gdmFsJiZ2YWwubGVuZ3RoPjA7Y2FzZSdpbnB1dCc6aWYodGhpcy5jaGVja2FibGUoZWxlbWVudCkpcmV0dXJuIHRoaXMuZ2V0TGVuZ3RoKHZhbHVlLGVsZW1lbnQpPjA7ZGVmYXVsdDpyZXR1cm4gJC50cmltKHZhbHVlKS5sZW5ndGg+MDt9fSxyZW1vdGU6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7aWYodGhpcy5vcHRpb25hbChlbGVtZW50KSlyZXR1cm4iZGVwZW5kZW5jeS1taXNtYXRjaCI7dmFyIHByZXZpb3VzPXRoaXMucHJldmlvdXNWYWx1ZShlbGVtZW50KTtpZighdGhpcy5zZXR0aW5ncy5tZXNzYWdlc1tlbGVtZW50Lm5hbWVdKXRoaXMuc2V0dGluZ3MubWVzc2FnZXNbZWxlbWVudC5uYW1lXT17fTtwcmV2aW91cy5vcmlnaW5hbE1lc3NhZ2U9dGhpcy5zZXR0aW5ncy5tZXNzYWdlc1tlbGVtZW50Lm5hbWVdLnJlbW90ZTt0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2VsZW1lbnQubmFtZV0ucmVtb3RlPXByZXZpb3VzLm1lc3NhZ2U7cGFyYW09dHlwZW9mIHBhcmFtPT0ic3RyaW5nIiYme3VybDpwYXJhbX18fHBhcmFtO2lmKHByZXZpb3VzLm9sZCE9PXZhbHVlKXtwcmV2aW91cy5vbGQ9dmFsdWU7dmFyIHZhbGlkYXRvcj10aGlzO3RoaXMuc3RhcnRSZXF1ZXN0KGVsZW1lbnQpO3ZhciBkYXRhPXt9O2RhdGFbZWxlbWVudC5uYW1lXT12YWx1ZTskLmFqYXgoJC5leHRlbmQodHJ1ZSx7dXJsOnBhcmFtLG1vZGU6ImFib3J0Iixwb3J0OiJ2YWxpZGF0ZSIrZWxlbWVudC5uYW1lLGRhdGFUeXBlOiJqc29uIixkYXRhOmRhdGEsc3VjY2VzczpmdW5jdGlvbihyZXNwb25zZSl7dmFsaWRhdG9yLnNldHRpbmdzLm1lc3NhZ2VzW2VsZW1lbnQubmFtZV0ucmVtb3RlPXByZXZpb3VzLm9yaWdpbmFsTWVzc2FnZTt2YXIgdmFsaWQ9cmVzcG9uc2U9PT10cnVlO2lmKHZhbGlkKXt2YXIgc3VibWl0dGVkPXZhbGlkYXRvci5mb3JtU3VibWl0dGVkO3ZhbGlkYXRvci5wcmVwYXJlRWxlbWVudChlbGVtZW50KTt2YWxpZGF0b3IuZm9ybVN1Ym1pdHRlZD1zdWJtaXR0ZWQ7dmFsaWRhdG9yLnN1Y2Nlc3NMaXN0LnB1c2goZWxlbWVudCk7dmFsaWRhdG9yLnNob3dFcnJvcnMoKTt9ZWxzZXt2YXIgZXJyb3JzPXt9O3ZhciBtZXNzYWdlPShwcmV2aW91cy5tZXNzYWdlPXJlc3BvbnNlfHx2YWxpZGF0b3IuZGVmYXVsdE1lc3NhZ2UoZWxlbWVudCwicmVtb3RlIikpO2Vycm9yc1tlbGVtZW50Lm5hbWVdPSQuaXNGdW5jdGlvbihtZXNzYWdlKT9tZXNzYWdlKHZhbHVlKTptZXNzYWdlO3ZhbGlkYXRvci5zaG93RXJyb3JzKGVycm9ycyk7fXByZXZpb3VzLnZhbGlkPXZhbGlkO3ZhbGlkYXRvci5zdG9wUmVxdWVzdChlbGVtZW50LHZhbGlkKTt9fSxwYXJhbSkpO3JldHVybiJwZW5kaW5nIjt9ZWxzZSBpZih0aGlzLnBlbmRpbmdbZWxlbWVudC5uYW1lXSl7cmV0dXJuInBlbmRpbmciO31yZXR1cm4gcHJldmlvdXMudmFsaWQ7fSxtaW5sZW5ndGg6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fHRoaXMuZ2V0TGVuZ3RoKCQudHJpbSh2YWx1ZSksZWxlbWVudCk+PXBhcmFtO30sbWF4bGVuZ3RoOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHx0aGlzLmdldExlbmd0aCgkLnRyaW0odmFsdWUpLGVsZW1lbnQpPD1wYXJhbTt9LHJhbmdlbGVuZ3RoOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe3ZhciBsZW5ndGg9dGhpcy5nZXRMZW5ndGgoJC50cmltKHZhbHVlKSxlbGVtZW50KTtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8KGxlbmd0aD49cGFyYW1bMF0mJmxlbmd0aDw9cGFyYW1bMV0pO30sbWluOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHx2YWx1ZT49cGFyYW07fSxtYXg6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fHZhbHVlPD1wYXJhbTt9LHJhbmdlOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwodmFsdWU+PXBhcmFtWzBdJiZ2YWx1ZTw9cGFyYW1bMV0pO30sZW1haWw6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fC9eKCgoW2Etel18XGR8WyEjXCQlJidcKlwrXC1cLz1cP1xeX2B7XHx9fl18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKyhcLihbYS16XXxcZHxbISNcJCUmJ1wqXCtcLVwvPVw/XF5fYHtcfH1+XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkrKSopfCgoXHgyMikoKCgoXHgyMHxceDA5KSooXHgwZFx4MGEpKT8oXHgyMHxceDA5KSspPygoW1x4MDEtXHgwOFx4MGJceDBjXHgwZS1ceDFmXHg3Zl18XHgyMXxbXHgyMy1ceDViXXxbXHg1ZC1ceDdlXXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KFxcKFtceDAxLVx4MDlceDBiXHgwY1x4MGQtXHg3Zl18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSkpKigoKFx4MjB8XHgwOSkqKFx4MGRceDBhKSk/KFx4MjB8XHgwOSkrKT8oXHgyMikpKUAoKChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuKSsoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4/JC9pLnRlc3QodmFsdWUpO30sdXJsOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwvXihodHRwcz98ZnRwKTpcL1wvKCgoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6KSpAKT8oKChcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pKXwoKChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuKSsoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4/KSg6XGQqKT8pKFwvKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCkrKFwvKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKSopKik/KT8oXD8oKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKXxbXHVFMDAwLVx1RjhGRl18XC98XD8pKik/KFwjKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCl8XC98XD8pKik/JC9pLnRlc3QodmFsdWUpO30sZGF0ZTpmdW5jdGlvbih2YWx1ZSxlbGVtZW50KXtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8IS9JbnZhbGlkfE5hTi8udGVzdChuZXcgRGF0ZSh2YWx1ZSkpO30sZGF0ZUlTTzpmdW5jdGlvbih2YWx1ZSxlbGVtZW50KXtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8L15cZHs0fVtcLy1dXGR7MSwyfVtcLy1dXGR7MSwyfSQvLnRlc3QodmFsdWUpO30sbnVtYmVyOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwvXi0/KD86XGQrfFxkezEsM30oPzosXGR7M30pKykoPzpcLlxkKyk/JC8udGVzdCh2YWx1ZSk7fSxkaWdpdHM6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fC9eXGQrJC8udGVzdCh2YWx1ZSk7fSxjcmVkaXRjYXJkOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe2lmKHRoaXMub3B0aW9uYWwoZWxlbWVudCkpcmV0dXJuImRlcGVuZGVuY3ktbWlzbWF0Y2giO2lmKC9bXjAtOS1dKy8udGVzdCh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciBuQ2hlY2s9MCxuRGlnaXQ9MCxiRXZlbj1mYWxzZTt2YWx1ZT12YWx1ZS5yZXBsYWNlKC9cRC9nLCIiKTtmb3IodmFyIG49dmFsdWUubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciBjRGlnaXQ9dmFsdWUuY2hhckF0KG4pO3ZhciBuRGlnaXQ9cGFyc2VJbnQoY0RpZ2l0LDEwKTtpZihiRXZlbil7aWYoKG5EaWdpdCo9Mik+OSluRGlnaXQtPTk7fW5DaGVjays9bkRpZ2l0O2JFdmVuPSFiRXZlbjt9cmV0dXJuKG5DaGVjayUxMCk9PTA7fSxhY2NlcHQ6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7cGFyYW09dHlwZW9mIHBhcmFtPT0ic3RyaW5nIj9wYXJhbS5yZXBsYWNlKC8sL2csJ3wnKToicG5nfGpwZT9nfGdpZiI7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fHZhbHVlLm1hdGNoKG5ldyBSZWdFeHAoIi4oIitwYXJhbSsiKSQiLCJpIikpO30sZXF1YWxUbzpmdW5jdGlvbih2YWx1ZSxlbGVtZW50LHBhcmFtKXt2YXIgdGFyZ2V0PSQocGFyYW0pLnVuYmluZCgiLnZhbGlkYXRlLWVxdWFsVG8iKS5iaW5kKCJibHVyLnZhbGlkYXRlLWVxdWFsVG8iLGZ1bmN0aW9uKCl7JChlbGVtZW50KS52YWxpZCgpO30pO3JldHVybiB2YWx1ZT09dGFyZ2V0LnZhbCgpO319fSk7JC5mb3JtYXQ9JC52YWxpZGF0b3IuZm9ybWF0O30pKGpRdWVyeSk7OyhmdW5jdGlvbigkKXt2YXIgYWpheD0kLmFqYXg7dmFyIHBlbmRpbmdSZXF1ZXN0cz17fTskLmFqYXg9ZnVuY3Rpb24oc2V0dGluZ3Mpe3NldHRpbmdzPSQuZXh0ZW5kKHNldHRpbmdzLCQuZXh0ZW5kKHt9LCQuYWpheFNldHRpbmdzLHNldHRpbmdzKSk7dmFyIHBvcnQ9c2V0dGluZ3MucG9ydDtpZihzZXR0aW5ncy5tb2RlPT0iYWJvcnQiKXtpZihwZW5kaW5nUmVxdWVzdHNbcG9ydF0pe3BlbmRpbmdSZXF1ZXN0c1twb3J0XS5hYm9ydCgpO31yZXR1cm4ocGVuZGluZ1JlcXVlc3RzW3BvcnRdPWFqYXguYXBwbHkodGhpcyxhcmd1bWVudHMpKTt9cmV0dXJuIGFqYXguYXBwbHkodGhpcyxhcmd1bWVudHMpO307fSkoalF1ZXJ5KTs7KGZ1bmN0aW9uKCQpe2lmKCFqUXVlcnkuZXZlbnQuc3BlY2lhbC5mb2N1c2luJiYhalF1ZXJ5LmV2ZW50LnNwZWNpYWwuZm9jdXNvdXQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpeyQuZWFjaCh7Zm9jdXM6J2ZvY3VzaW4nLGJsdXI6J2ZvY3Vzb3V0J30sZnVuY3Rpb24ob3JpZ2luYWwsZml4KXskLmV2ZW50LnNwZWNpYWxbZml4XT17c2V0dXA6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIob3JpZ2luYWwsaGFuZGxlcix0cnVlKTt9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG9yaWdpbmFsLGhhbmRsZXIsdHJ1ZSk7fSxoYW5kbGVyOmZ1bmN0aW9uKGUpe2FyZ3VtZW50c1swXT0kLmV2ZW50LmZpeChlKTthcmd1bWVudHNbMF0udHlwZT1maXg7cmV0dXJuICQuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9fTtmdW5jdGlvbiBoYW5kbGVyKGUpe2U9JC5ldmVudC5maXgoZSk7ZS50eXBlPWZpeDtyZXR1cm4gJC5ldmVudC5oYW5kbGUuY2FsbCh0aGlzLGUpO319KTt9OyQuZXh0ZW5kKCQuZm4se3ZhbGlkYXRlRGVsZWdhdGU6ZnVuY3Rpb24oZGVsZWdhdGUsdHlwZSxoYW5kbGVyKXtyZXR1cm4gdGhpcy5iaW5kKHR5cGUsZnVuY3Rpb24oZXZlbnQpe3ZhciB0YXJnZXQ9JChldmVudC50YXJnZXQpO2lmKHRhcmdldC5pcyhkZWxlZ2F0ZSkpe3JldHVybiBoYW5kbGVyLmFwcGx5KHRhcmdldCxhcmd1bWVudHMpO319KTt9fSk7fSkoalF1ZXJ5KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3N0YXRpYy9qcy9qcXVlcnkudmFsaWRhdGUucGFjay5qcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvc3RhdGljL2pzL2pxdWVyeS52YWxpZGF0ZS5wYWNrLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3N0YXRpYy9qcy9qcXVlcnkudmFsaWRhdGUucGFjay5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorICogalF1ZXJ5IHZhbGlkYXRpb24gcGx1Zy1pbiAxLjcKKyAqCisgKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi12YWxpZGF0aW9uLworICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9QbHVnaW5zL1ZhbGlkYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgorICoKKyAqICRJZDoganF1ZXJ5LnZhbGlkYXRlLmpzIDY0MDMgMjAwOS0wNi0xNyAxNDoyNzoxNlogam9lcm4uemFlZmZlcmVyICQKKyAqCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczoKKyAqICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKyAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCisgKi8KK2V2YWwoZnVuY3Rpb24ocCxhLGMsayxlLHIpe2U9ZnVuY3Rpb24oYyl7cmV0dXJuKGM8YT8nJzplKHBhcnNlSW50KGMvYSkpKSsoKGM9YyVhKT4zNT9TdHJpbmcuZnJvbUNoYXJDb2RlKGMrMjkpOmMudG9TdHJpbmcoMzYpKX07aWYoIScnLnJlcGxhY2UoL14vLFN0cmluZykpe3doaWxlKGMtLSlyW2UoYyldPWtbY118fGUoYyk7az1bZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19XTtlPWZ1bmN0aW9uKCl7cmV0dXJuJ1xcdysnfTtjPTF9O3doaWxlKGMtLSlpZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcYicrZShjKSsnXFxiJywnZycpLGtbY10pO3JldHVybiBwfSgnKDcoJCl7JC5IKCQuMkwsezE3OjcoZCl7bCghNi5GKXtkJiZkLjJxJiYyVC4xeiYmMXouNTIoIjN5IDNwLCA0TFwndCAxNywgNjQgM3kiKTs4fXAgYz0kLjE5KDZbMF0sXCd2XCcpO2woYyl7OCBjfWM9MncgJC52KGQsNlswXSk7JC4xOSg2WzBdLFwndlwnLGMpO2woYy5xLjN4KXs2LjNzKCIxdywgM2kiKS4xbygiLjRFIikuM2UoNygpe2MuM2I9d30pO2woYy5xLjM1KXs2LjNzKCIxdywgM2kiKS4xbygiOjJzIikuM2UoNygpe2MuMVo9Nn0pfTYuMnMoNyhiKXtsKGMucS4ycSliLjVKKCk7NyAxVCgpe2woYy5xLjM1KXtsKGMuMVope3AgYT0kKCI8MXcgMVY9XCc1clwnLz4iKS4xcygidSIsYy4xWi51KS4zMyhjLjFaLlopLjUxKGMuVSl9Yy5xLjM1LlYoYyxjLlUpO2woYy4xWil7YS4zRCgpfTggTn04IHd9bChjLjNiKXtjLjNiPU47OCAxVCgpfWwoYy5MKCkpe2woYy4xYil7Yy4xbD13OzggTn04IDFUKCl9MTJ7Yy4ybCgpOzggTn19KX04IGN9LEo6Nygpe2woJCg2WzBdKS4yVyhcJ0xcJykpezggNi4xNygpLkwoKX0xMntwIGI9dztwIGE9JCg2WzBdLkwpLjE3KCk7Ni5QKDcoKXtiJj1hLkkoNil9KTs4IGJ9fSw0RDo3KGMpe3AgZD17fSwkST02OyQuUChjLjFJKC9cXHMvKSw3KGEsYil7ZFtiXT0kSS4xcyhiKTskSS42ZChiKX0pOzggZH0sMWk6NyhoLGspe3AgZj02WzBdO2woaCl7cCBpPSQuMTkoZi5MLFwndlwnKS5xO3AgZD1pLjFpO3AgYz0kLnYuMzYoZik7MjMoaCl7MWUiMWQiOiQuSChjLCQudi4xWChrKSk7ZFtmLnVdPWM7bChrLkcpaS5HW2YudV09JC5IKGkuR1tmLnVdLGsuRyk7MzE7MWUiM0QiOmwoIWspe1QgZFtmLnVdOzggY31wIGU9e307JC5QKGsuMUkoL1xccy8pLDcoYSxiKXtlW2JdPWNbYl07VCBjW2JdfSk7OCBlfX1wIGc9JC52LjQxKCQuSCh7fSwkLnYuM1koZiksJC52LjNWKGYpLCQudi4zVChmKSwkLnYuMzYoZikpLGYpO2woZy4xNSl7cCBqPWcuMTU7VCBnLjE1O2c9JC5IKHsxNTpqfSxnKX04IGd9fSk7JC5IKCQuNXBbIjoiXSx7NW46NyhhKXs4ISQuMXAoIiIrYS5aKX0sNWc6NyhhKXs4ISEkLjFwKCIiK2EuWil9LDVmOjcoYSl7OCFhLjRofX0pOyQudj03KGIsYSl7Ni5xPSQuSCh3LHt9LCQudi4zZCxiKTs2LlU9YTs2LjNJKCl9OyQudi5XPTcoYyxiKXtsKFIuRj09MSk4IDcoKXtwIGE9JC4zRihSKTthLjRWKGMpOzggJC52LlcuMVEoNixhKX07bChSLkY+MiYmYi4yYyE9M0Ipe2I9JC4zRihSKS40USgxKX1sKGIuMmMhPTNCKXtiPVtiXX0kLlAoYiw3KGksbil7Yz1jLjF1KDJ3IDN0KCJcXFxceyIraSsiXFxcXH0iLCJnIiksbil9KTs4IGN9OyQuSCgkLnYsezNkOntHOnt9LDJhOnt9LDFpOnt9LDFjOiIzciIsMjg6IkoiLDJGOiI0UCIsMmw6dywzbzokKFtdKSwyRDokKFtdKSwzeDp3LDNsOltdLDNrOk4sNE86NyhhKXs2LjNVPWE7bCg2LnEuNEsmJiE2LjRKKXs2LnEuMUsmJjYucS4xSy5WKDYsYSw2LnEuMWMsNi5xLjI4KTs2LjFNKGEpLjJBKCl9fSw0Qzo3KGEpe2woITYuMUUoYSkmJihhLnUgMTEgNi4xYXx8ITYuSyhhKSkpezYuSShhKX19LDZjOjcoYSl7bChhLnUgMTEgNi4xYXx8YT09Ni40QSl7Ni5JKGEpfX0sNjg6NyhhKXtsKGEudSAxMSA2LjFhKTYuSShhKTsxMiBsKGEuNHgudSAxMSA2LjFhKTYuSShhLjR4KX0sMzk6NyhhLGMsYil7JChhKS4yMihjKS4ydihiKX0sMUs6NyhhLGMsYil7JChhKS4ydihjKS4yMihiKX19LDYzOjcoYSl7JC5IKCQudi4zZCxhKX0sRzp7MTU6IjYxIDRyIDJXIDE1LiIsMXE6Ik0gMk8gNiA0ci4iLDFKOiJNIE8gYSBKIDFKIDVYLiIsMUI6Ik0gTyBhIEogNVcuIiwxQToiTSBPIGEgSiAxQS4iLDJqOiJNIE8gYSBKIDFBICg1USkuIiwxRzoiTSBPIGEgSiAxRy4iLDFQOiJNIE8gNU8gMVAuIiwyZjoiTSBPIGEgSiA1TCA1SSAxRy4iLDJvOiJNIE8gNDcgNUYgWiA1Qi4iLDQzOiJNIE8gYSBaIDV6IGEgSiA1eC4iLDE4OiQudi5XKCJNIE8gM0sgNXYgMlggezB9IDJWLiIpLDF5OiQudi5XKCJNIE8gNXQgNXMgezB9IDJWLiIpLDJpOiQudi5XKCJNIE8gYSBaIDNXIHswfSAzTyB7MX0gMlYgNW8uIiksMnI6JC52LlcoIk0gTyBhIFogM1cgezB9IDNPIHsxfS4iKSwxQzokLnYuVygiTSBPIGEgWiA1aiAyWCA0NiAzTSAzTCB7MH0uIiksMXQ6JC52LlcoIk0gTyBhIFogNWQgMlggNDYgM00gM0wgezB9LiIpfSwzSjpOLDVhOnszSTo3KCl7Ni4yND0kKDYucS4yRCk7Ni40dD02LjI0LkYmJjYuMjR8fCQoNi5VKTs2LjJ4PSQoNi5xLjNvKS4xZCg2LnEuMkQpOzYuMWE9e307Ni41ND17fTs2LjFiPTA7Ni4xaD17fTs2LjFmPXt9OzYuMjEoKTtwIGY9KDYuMmE9e30pOyQuUCg2LnEuMmEsNyhkLGMpeyQuUChjLjFJKC9cXHMvKSw3KGEsYil7ZltiXT1kfSl9KTtwIGU9Ni5xLjFpOyQuUChlLDcoYixhKXtlW2JdPSQudi4xWChhKX0pOzcgMk4oYSl7cCBiPSQuMTkoNlswXS5MLCJ2IiksM2M9IjRXIithLjFWLjF1KC9eMTcvLCIiKTtiLnFbM2NdJiZiLnFbM2NdLlYoYiw2WzBdKX0kKDYuVSkuMksoIjozRSwgOjRVLCA6NFQsIDJlLCA0UyIsIjJkIDJKIDRSIiwyTikuMksoIjozQywgOjNBLCAyZSwgM3oiLCIzZSIsMk4pO2woNi5xLjN3KSQoNi5VKS4ySSgiMWYtTC4xNyIsNi5xLjN3KX0sTDo3KCl7Ni4zdigpOyQuSCg2LjFhLDYuMXYpOzYuMWY9JC5IKHt9LDYuMXYpO2woITYuSigpKSQoNi5VKS4zdSgiMWYtTCIsWzZdKTs2LjFtKCk7OCA2LkooKX0sM3Y6NygpezYuMkgoKTtRKHAgaT0wLDE0PSg2LjJiPTYuMTQoKSk7MTRbaV07aSsrKXs2LjI5KDE0W2ldKX04IDYuSigpfSxJOjcoYSl7YT02LjJHKGEpOzYuNEE9YTs2LjJQKGEpOzYuMmI9JChhKTtwIGI9Ni4yOShhKTtsKGIpe1QgNi4xZlthLnVdfTEyezYuMWZbYS51XT13fWwoITYuM3EoKSl7Ni4xMz02LjEzLjFkKDYuMngpfTYuMW0oKTs4IGJ9LDFtOjcoYil7bChiKXskLkgoNi4xdixiKTs2LlM9W107UShwIGMgMTEgYil7Ni5TLjI3KHsxajpiW2NdLEk6Ni4yNihjKVswXX0pfTYuMW49JC4zbig2LjFuLDcoYSl7OCEoYS51IDExIGIpfSl9Ni5xLjFtPzYucS4xbS5WKDYsNi4xdiw2LlMpOjYuM20oKX0sMlM6Nygpe2woJC4yTC4yUykkKDYuVSkuMlMoKTs2LjFhPXt9OzYuMkgoKTs2LjJRKCk7Ni4xNCgpLjJ2KDYucS4xYyl9LDNxOjcoKXs4IDYuMmsoNi4xZil9LDJrOjcoYSl7cCBiPTA7UShwIGkgMTEgYSliKys7OCBifSwyUTo3KCl7Ni4yQyg2LjEzKS4yQSgpfSxKOjcoKXs4IDYuM2ooKT09MH0sM2o6NygpezggNi5TLkZ9LDJsOjcoKXtsKDYucS4ybCl7M1F7JCg2LjNoKCl8fDYuUy5GJiY2LlNbMF0uSXx8W10pLjFvKCI6NE4iKS4zZygpLjRNKCIyZCIpfTNmKGUpe319fSwzaDo3KCl7cCBhPTYuM1U7OCBhJiYkLjNuKDYuUyw3KG4pezggbi5JLnU9PWEudX0pLkY9PTEmJmF9LDE0OjcoKXtwIGE9NiwyQj17fTs4ICQoW10pLjFkKDYuVS4xNCkuMW8oIjoxdyIpLjFMKCI6MnMsIDoyMSwgOjRJLCBbNEhdIikuMUwoNi5xLjNsKS4xbyg3KCl7ITYudSYmYS5xLjJxJiYyVC4xeiYmMXouM3IoIiVvIDRHIDNLIHUgNEYiLDYpO2woNi51IDExIDJCfHwhYS4yaygkKDYpLjFpKCkpKTggTjsyQls2LnVdPXc7OCB3fSl9LDJHOjcoYSl7OCAkKGEpWzBdfSwyejo3KCl7OCAkKDYucS4yRisiLiIrNi5xLjFjLDYuNHQpfSwyMTo3KCl7Ni4xbj1bXTs2LlM9W107Ni4xdj17fTs2LjFrPSQoW10pOzYuMTM9JChbXSk7Ni4yYj0kKFtdKX0sMkg6NygpezYuMjEoKTs2LjEzPTYuMnooKS4xZCg2LjJ4KX0sMlA6NyhhKXs2LjIxKCk7Ni4xMz02LjFNKGEpfSwyOTo3KGQpe2Q9Ni4yRyhkKTtsKDYuMUUoZCkpe2Q9Ni4yNihkLnUpWzBdfXAgYT0kKGQpLjFpKCk7cCBjPU47UShZIDExIGEpe3AgYj17WTpZLDJuOmFbWV19OzNRe3AgZj0kLnYuMU5bWV0uVig2LGQuWi4xdSgvXFxyL2csIiIpLGQsYi4ybik7bChmPT0iMVMtMVkiKXtjPXc7Nmd9Yz1OO2woZj09IjFoIil7Ni4xMz02LjEzLjFMKDYuMU0oZCkpOzh9bCghZil7Ni40QihkLGIpOzggTn19M2YoZSl7Ni5xLjJxJiYyVC4xeiYmMXouNmYoIjZlIDZiIDZhIDY5IEkgIitkLjR6KyIsIDI5IDQ3IFwnIitiLlkrIlwnIFkiLGUpOzY3IGU7fX1sKGMpODtsKDYuMmsoYSkpNi4xbi4yNyhkKTs4IHd9LDR5OjcoYSxiKXtsKCEkLjFIKTg7cCBjPTYucS4zYT8kKGEpLjFIKClbNi5xLjNhXTokKGEpLjFIKCk7OCBjJiZjLkcmJmMuR1tiXX0sNHc6NyhhLGIpe3AgbT02LnEuR1thXTs4IG0mJihtLjJjPT00dj9tOm1bYl0pfSw0dTo3KCl7UShwIGk9MDtpPFIuRjtpKyspe2woUltpXSE9PTIwKTggUltpXX04IDIwfSwydTo3KGEsYil7OCA2LjR1KDYuNHcoYS51LGIpLDYuNHkoYSxiKSwhNi5xLjNrJiZhLjYyfHwyMCwkLnYuR1tiXSwiPDRzPjYwOiA1WiAxaiA1WSBRICIrYS51KyI8LzRzPiIpfSw0Qjo3KGIsYSl7cCBjPTYuMnUoYixhLlkpLDM3PS9cXCQ/XFx7KFxcZCspXFx9L2c7bCgxZyBjPT0iNyIpe2M9Yy5WKDYsYS4ybixiKX0xMiBsKDM3LjE2KGMpKXtjPTFGLlcoYy4xdSgzNyxcJ3skMX1cJyksYS4ybil9Ni5TLjI3KHsxajpjLEk6Yn0pOzYuMXZbYi51XT1jOzYuMWFbYi51XT1jfSwyQzo3KGEpe2woNi5xLjJ0KWE9YS4xZChhLjRxKDYucS4ydCkpOzggYX0sM206Nygpe1EocCBpPTA7Ni5TW2ldO2krKyl7cCBhPTYuU1tpXTs2LnEuMzkmJjYucS4zOS5WKDYsYS5JLDYucS4xYyw2LnEuMjgpOzYuMkUoYS5JLGEuMWopfWwoNi5TLkYpezYuMWs9Ni4xay4xZCg2LjJ4KX1sKDYucS4xeCl7UShwIGk9MDs2LjFuW2ldO2krKyl7Ni4yRSg2LjFuW2ldKX19bCg2LnEuMUspe1EocCBpPTAsMTQ9Ni40cCgpOzE0W2ldO2krKyl7Ni5xLjFLLlYoNiwxNFtpXSw2LnEuMWMsNi5xLjI4KX19Ni4xMz02LjEzLjFMKDYuMWspOzYuMlEoKTs2LjJDKDYuMWspLjRvKCl9LDRwOjcoKXs4IDYuMmIuMUwoNi40bigpKX0sNG46NygpezggJCg2LlMpLjRtKDcoKXs4IDYuSX0pfSwyRTo3KGEsYyl7cCBiPTYuMU0oYSk7bChiLkYpe2IuMnYoKS4yMig2LnEuMWMpO2IuMXMoIjRsIikmJmIuNGsoYyl9MTJ7Yj0kKCI8Iis2LnEuMkYrIi8+IikuMXMoeyJRIjo2LjM0KGEpLDRsOnd9KS4yMig2LnEuMWMpLjRrKGN8fCIiKTtsKDYucS4ydCl7Yj1iLjJBKCkuNG8oKS41VigiPCIrNi5xLjJ0KyIvPiIpLjRxKCl9bCghNi4yNC41UyhiKS5GKTYucS40aj82LnEuNGooYiwkKGEpKTpiLjVSKGEpfWwoIWMmJjYucS4xeCl7Yi4zRSgiIik7MWcgNi5xLjF4PT0iMUQiP2IuMjIoNi5xLjF4KTo2LnEuMXgoYil9Ni4xaz02LjFrLjFkKGIpfSwxTTo3KGEpe3AgYj02LjM0KGEpOzggNi4yeigpLjFvKDcoKXs4ICQoNikuMXMoXCdRXCcpPT1ifSl9LDM0OjcoYSl7OCA2LjJhW2EudV18fCg2LjFFKGEpP2EudTphLjR6fHxhLnUpfSwxRTo3KGEpezgvM0N8M0EvaS4xNihhLjFWKX0sMjY6NyhkKXtwIGM9Ni5VOzggJCg0aS41UChkKSkuNG0oNyhhLGIpezggYi5MPT1jJiZiLnU9PWQmJmJ8fDRnfSl9LDFPOjcoYSxiKXsyMyhiLjRmLjRlKCkpezFlXCcyZVwnOjggJCgiM3o6M3AiLGIpLkY7MWVcJzF3XCc6bCg2LjFFKGIpKTggNi4yNihiLnUpLjFvKFwnOjRoXCcpLkZ9OCBhLkZ9LDRkOjcoYixhKXs4IDYuMzJbMWcgYl0/Ni4zMlsxZyBiXShiLGEpOnd9LDMyOnsiNU4iOjcoYixhKXs4IGJ9LCIxRCI6NyhiLGEpezghISQoYixhLkwpLkZ9LCI3Ijo3KGIsYSl7OCBiKGEpfX0sSzo3KGEpezghJC52LjFOLjE1LlYoNiwkLjFwKGEuWiksYSkmJiIxUy0xWSJ9LDRjOjcoYSl7bCghNi4xaFthLnVdKXs2LjFiKys7Ni4xaFthLnVdPXd9fSw0Yjo3KGEsYil7Ni4xYi0tO2woNi4xYjwwKTYuMWI9MDtUIDYuMWhbYS51XTtsKGImJjYuMWI9PTAmJjYuMWwmJjYuTCgpKXskKDYuVSkuMnMoKTs2LjFsPU59MTIgbCghYiYmNi4xYj09MCYmNi4xbCl7JCg2LlUpLjN1KCIxZi1MIixbNl0pOzYuMWw9Tn19LDJoOjcoYSl7OCAkLjE5KGEsIjJoIil8fCQuMTkoYSwiMmgiLHsyTTo0ZyxKOncsMWo6Ni4ydShhLCIxcSIpfSl9fSwxUjp7MTU6ezE1Ond9LDFKOnsxSjp3fSwxQjp7MUI6d30sMUE6ezFBOnd9LDJqOnsyajp3fSw0YTp7NGE6d30sMUc6ezFHOnd9LDQ5Ons0OTp3fSwxUDp7MVA6d30sMmY6ezJmOnd9fSw0ODo3KGEsYil7YS4yYz09NHY/Ni4xUlthXT1iOiQuSCg2LjFSLGEpfSwzVjo3KGIpe3AgYT17fTtwIGM9JChiKS4xcyhcJzVIXCcpO2MmJiQuUChjLjFJKFwnIFwnKSw3KCl7bCg2IDExICQudi4xUil7JC5IKGEsJC52LjFSWzZdKX19KTs4IGF9LDNUOjcoYyl7cCBhPXt9O3AgZD0kKGMpO1EoWSAxMSAkLnYuMU4pe3AgYj1kLjFzKFkpO2woYil7YVtZXT1ifX1sKGEuMTgmJi8tMXw1R3w1Qy8uMTYoYS4xOCkpe1QgYS4xOH04IGF9LDNZOjcoYSl7bCghJC4xSCk4e307cCBiPSQuMTkoYS5MLFwndlwnKS5xLjNhOzggYj8kKGEpLjFIKClbYl06JChhKS4xSCgpfSwzNjo3KGIpe3AgYT17fTtwIGM9JC4xOShiLkwsXCd2XCcpO2woYy5xLjFpKXthPSQudi4xWChjLnEuMWlbYi51XSl8fHt9fTggYX0sNDE6NyhkLGUpeyQuUChkLDcoYyxiKXtsKGI9PT1OKXtUIGRbY107OH1sKGIuMlJ8fGIuMnApe3AgYT13OzIzKDFnIGIuMnApezFlIjFEIjphPSEhJChiLjJwLGUuTCkuRjszMTsxZSI3IjphPWIuMnAuVihlLGUpOzMxfWwoYSl7ZFtjXT1iLjJSIT09MjA/Yi4yUjp3fTEye1QgZFtjXX19fSk7JC5QKGQsNyhhLGIpe2RbYV09JC40NChiKT9iKGUpOmJ9KTskLlAoW1wnMXlcJyxcJzE4XCcsXCcxdFwnLFwnMUNcJ10sNygpe2woZFs2XSl7ZFs2XT0yWihkWzZdKX19KTskLlAoW1wnMmlcJyxcJzJyXCddLDcoKXtsKGRbNl0pe2RbNl09WzJaKGRbNl1bMF0pLDJaKGRbNl1bMV0pXX19KTtsKCQudi4zSil7bChkLjF0JiZkLjFDKXtkLjJyPVtkLjF0LGQuMUNdO1QgZC4xdDtUIGQuMUN9bChkLjF5JiZkLjE4KXtkLjJpPVtkLjF5LGQuMThdO1QgZC4xeTtUIGQuMTh9fWwoZC5HKXtUIGQuR304IGR9LDFYOjcoYSl7bCgxZyBhPT0iMUQiKXtwIGI9e307JC5QKGEuMUkoL1xccy8pLDcoKXtiWzZdPXd9KTthPWJ9OCBhfSw1QTo3KGMsYSxiKXskLnYuMU5bY109YTskLnYuR1tjXT1iIT0yMD9iOiQudi5HW2NdO2woYS5GPDMpeyQudi40OChjLCQudi4xWChjKSl9fSwxTjp7MTU6NyhjLGQsYSl7bCghNi40ZChhLGQpKTgiMVMtMVkiOzIzKGQuNGYuNGUoKSl7MWVcJzJlXCc6cCBiPSQoZCkuMzMoKTs4IGImJmIuRj4wOzFlXCcxd1wnOmwoNi4xRShkKSk4IDYuMU8oYyxkKT4wOzV5OjggJC4xcChjKS5GPjB9fSwxcTo3KGYsaCxqKXtsKDYuSyhoKSk4IjFTLTFZIjtwIGc9Ni4yaChoKTtsKCE2LnEuR1toLnVdKTYucS5HW2gudV09e307Zy40MD02LnEuR1toLnVdLjFxOzYucS5HW2gudV0uMXE9Zy4xajtqPTFnIGo9PSIxRCImJnsxQjpqfXx8ajtsKGcuMk0hPT1mKXtnLjJNPWY7cCBrPTY7Ni40YyhoKTtwIGk9e307aVtoLnVdPWY7JC4yVSgkLkgodyx7MUI6aiwzWjoiMlkiLDNYOiIxNyIraC51LDV3OiI1dSIsMTk6aSwxeDo3KGQpe2sucS5HW2gudV0uMXE9Zy40MDtwIGI9ZD09PXc7bChiKXtwIGU9ay4xbDtrLjJQKGgpO2suMWw9ZTtrLjFuLjI3KGgpO2suMW0oKX0xMntwIGE9e307cCBjPShnLjFqPWR8fGsuMnUoaCwiMXEiKSk7YVtoLnVdPSQuNDQoYyk/YyhmKTpjO2suMW0oYSl9Zy5KPWI7ay40YihoLGIpfX0saikpOzgiMWgifTEyIGwoNi4xaFtoLnVdKXs4IjFoIn04IGcuSn0sMXk6NyhiLGMsYSl7OCA2LksoYyl8fDYuMU8oJC4xcChiKSxjKT49YX0sMTg6NyhiLGMsYSl7OCA2LksoYyl8fDYuMU8oJC4xcChiKSxjKTw9YX0sMmk6NyhiLGQsYSl7cCBjPTYuMU8oJC4xcChiKSxkKTs4IDYuSyhkKXx8KGM+PWFbMF0mJmM8PWFbMV0pfSwxdDo3KGIsYyxhKXs4IDYuSyhjKXx8Yj49YX0sMUM6NyhiLGMsYSl7OCA2LksoYyl8fGI8PWF9LDJyOjcoYixjLGEpezggNi5LKGMpfHwoYj49YVswXSYmYjw9YVsxXSl9LDFKOjcoYSxiKXs4IDYuSyhiKXx8L14oKChbYS16XXxcXGR8WyEjXFwkJSZcJ1xcKlxcK1xcLVxcLz1cXD9cXF5YYHtcXHx9fl18W1xcRS1cXEJcXEMtXFx4XFxBLVxceV0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmXCdcXCpcXCtcXC1cXC89XFw/XFxeWGB7XFx8fX5dfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKSspKil8KChcXDNTKSgoKChcXDJtfFxcMVcpKihcXDMwXFwzUikpPyhcXDJtfFxcMVcpKyk/KChbXFwzUC1cXDVxXFw0NVxcNDJcXDVELVxcNUVcXDNOXXxcXDVtfFtcXDVsLVxcNWtdfFtcXDVpLVxcNUtdfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKXwoXFxcXChbXFwzUC1cXDFXXFw0NVxcNDJcXDMwLVxcM05dfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKSkpKSooKChcXDJtfFxcMVcpKihcXDMwXFwzUikpPyhcXDJtfFxcMVcpKyk/KFxcM1MpKSlAKCgoW2Etel18XFxkfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKXwoKFthLXpdfFxcZHxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSkoW2Etel18XFxkfC18XFwufFh8fnxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSkqKFthLXpdfFxcZHxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSkpKVxcLikrKChbYS16XXxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSl8KChbYS16XXxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSkoW2Etel18XFxkfC18XFwufFh8fnxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSkqKFthLXpdfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKSkpXFwuPyQvaS4xNihhKX0sMUI6NyhhLGIpezggNi5LKGIpfHwvXig1aD98NU0pOlxcL1xcLygoKChbYS16XXxcXGR8LXxcXC58WHx+fFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKXwoJVtcXDFVLWZdezJ9KXxbIVxcJCZcJ1xcKFxcKVxcKlxcKyw7PV18OikqQCk/KCgoXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pKXwoKChbYS16XXxcXGR8W1xcRS1cXEJcXEMtXFx4XFxBLVxceV0pfCgoW2Etel18XFxkfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKShbYS16XXxcXGR8LXxcXC58WHx+fFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKSooW2Etel18XFxkfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKSkpXFwuKSsoKFthLXpdfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKXwoKFthLXpdfFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKShbYS16XXxcXGR8LXxcXC58WHx+fFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKSooW2Etel18W1xcRS1cXEJcXEMtXFx4XFxBLVxceV0pKSlcXC4/KSg6XFxkKik/KShcXC8oKChbYS16XXxcXGR8LXxcXC58WHx+fFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKXwoJVtcXDFVLWZdezJ9KXxbIVxcJCZcJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSsoXFwvKChbYS16XXxcXGR8LXxcXC58WHx+fFtcXEUtXFxCXFxDLVxceFxcQS1cXHldKXwoJVtcXDFVLWZdezJ9KXxbIVxcJCZcJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSopKik/KT8oXFw/KCgoW2Etel18XFxkfC18XFwufFh8fnxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSl8KCVbXFwxVS1mXXsyfSl8WyFcXCQmXCdcXChcXClcXCpcXCssOz1dfDp8QCl8W1xcNWUtXFw1VF18XFwvfFxcPykqKT8oXFwjKCgoW2Etel18XFxkfC18XFwufFh8fnxbXFxFLVxcQlxcQy1cXHhcXEEtXFx5XSl8KCVbXFwxVS1mXXsyfSl8WyFcXCQmXCdcXChcXClcXCpcXCssOz1dfDp8QCl8XFwvfFxcPykqKT8kL2kuMTYoYSl9LDFBOjcoYSxiKXs4IDYuSyhiKXx8IS81VXw1Yy8uMTYoMncgNWIoYSkpfSwyajo3KGEsYil7OCA2LksoYil8fC9eXFxkezR9W1xcLy1dXFxkezEsMn1bXFwvLV1cXGR7MSwyfSQvLjE2KGEpfSwxRzo3KGEsYil7OCA2LksoYil8fC9eLT8oPzpcXGQrfFxcZHsxLDN9KD86LFxcZHszfSkrKSg/OlxcLlxcZCspPyQvLjE2KGEpfSwxUDo3KGEsYil7OCA2LksoYil8fC9eXFxkKyQvLjE2KGEpfSwyZjo3KGIsZSl7bCg2LksoZSkpOCIxUy0xWSI7bCgvW14wLTktXSsvLjE2KGIpKTggTjtwIGE9MCxkPTAsMmc9TjtiPWIuMXUoL1xcRC9nLCIiKTtRKHAgbj1iLkYtMTtuPj0wO24tLSl7cCBjPWIuNTkobik7cCBkPTU4KGMsMTApO2woMmcpe2woKGQqPTIpPjkpZC09OX1hKz1kOzJnPSEyZ304KGElMTApPT0wfSw0Mzo3KGIsYyxhKXthPTFnIGE9PSIxRCI/YS4xdSgvLC9nLFwnfFwnKToiNTd8NTY/Z3w1NSI7OCA2LksoYyl8fGIuNjUoMncgM3QoIi4oIithKyIpJCIsImkiKSl9LDJvOjcoYyxkLGEpe3AgYj0kKGEpLjY2KCIuMTctMm8iKS4ySSgiM0guMTctMm8iLDcoKXskKGQpLkooKX0pOzggYz09Yi4zMygpfX19KTskLlc9JC52Lld9KSgxRik7KDcoJCl7cCBjPSQuMlU7cCBkPXt9OyQuMlU9NyhhKXthPSQuSChhLCQuSCh7fSwkLjUzLGEpKTtwIGI9YS4zWDtsKGEuM1o9PSIyWSIpe2woZFtiXSl7ZFtiXS4yWSgpfTgoZFtiXT1jLjFRKDYsUikpfTggYy4xUSg2LFIpfX0pKDFGKTsoNygkKXtsKCExRi4xci4zOC4yZCYmITFGLjFyLjM4LjJKJiY0aS4zRyl7JC5QKHszZzpcJzJkXCcsM0g6XCcySlwnfSw3KGIsYSl7JC4xci4zOFthXT17NTA6NygpezYuM0coYiwyeSx3KX0sNFo6NygpezYuNFkoYiwyeSx3KX0sMnk6NyhlKXtSWzBdPSQuMXIuMk8oZSk7UlswXS4xVj1hOzggJC4xci4xVC4xUSg2LFIpfX07NyAyeShlKXtlPSQuMXIuMk8oZSk7ZS4xVj1hOzggJC4xci4xVC5WKDYsZSl9fSl9OyQuSCgkLjJMLHsySzo3KGQsZSxjKXs4IDYuMkkoZSw3KGEpe3AgYj0kKGEuNFgpO2woYi4yVyhkKSl7OCBjLjFRKGIsUil9fSl9fSl9KSgxRik7Jyw2MiwzODksJ3x8fHx8fHRoaXN8ZnVuY3Rpb258cmV0dXJufHx8fHx8fHx8fHx8fGlmfHx8fHZhcnxzZXR0aW5nc3x8fHxuYW1lfHZhbGlkYXRvcnx0cnVlfHVGRENGfHVGRkVGfHx1RkRGMHx1RDdGRnx1RjkwMHx8dTAwQTB8bGVuZ3RofG1lc3NhZ2VzfGV4dGVuZHxlbGVtZW50fHZhbGlkfG9wdGlvbmFsfGZvcm18UGxlYXNlfGZhbHNlfGVudGVyfGVhY2h8Zm9yfGFyZ3VtZW50c3xlcnJvckxpc3R8ZGVsZXRlfGN1cnJlbnRGb3JtfGNhbGx8Zm9ybWF0fF98bWV0aG9kfHZhbHVlfHxpbnxlbHNlfHRvSGlkZXxlbGVtZW50c3xyZXF1aXJlZHx0ZXN0fHZhbGlkYXRlfG1heGxlbmd0aHxkYXRhfHN1Ym1pdHRlZHxwZW5kaW5nUmVxdWVzdHxlcnJvckNsYXNzfGFkZHxjYXNlfGludmFsaWR8dHlwZW9mfHBlbmRpbmd8cnVsZXN8bWVzc2FnZXx0b1Nob3d8Zm9ybVN1Ym1pdHRlZHxzaG93RXJyb3JzfHN1Y2Nlc3NMaXN0fGZpbHRlcnx0cmltfHJlbW90ZXxldmVudHxhdHRyfG1pbnxyZXBsYWNlfGVycm9yTWFwfGlucHV0fHN1Y2Nlc3N8bWlubGVuZ3RofGNvbnNvbGV8ZGF0ZXx1cmx8bWF4fHN0cmluZ3xjaGVja2FibGV8alF1ZXJ5fG51bWJlcnxtZXRhZGF0YXxzcGxpdHxlbWFpbHx1bmhpZ2hsaWdodHxub3R8ZXJyb3JzRm9yfG1ldGhvZHN8Z2V0TGVuZ3RofGRpZ2l0c3xhcHBseXxjbGFzc1J1bGVTZXR0aW5nc3xkZXBlbmRlbmN5fGhhbmRsZXxkYXx0eXBlfHgwOXxub3JtYWxpemVSdWxlfG1pc21hdGNofHN1Ym1pdEJ1dHRvbnx1bmRlZmluZWR8cmVzZXR8YWRkQ2xhc3N8c3dpdGNofGxhYmVsQ29udGFpbmVyfHxmaW5kQnlOYW1lfHB1c2h8dmFsaWRDbGFzc3xjaGVja3xncm91cHN8Y3VycmVudEVsZW1lbnRzfGNvbnN0cnVjdG9yfGZvY3VzaW58c2VsZWN0fGNyZWRpdGNhcmR8YkV2ZW58cHJldmlvdXNWYWx1ZXxyYW5nZWxlbmd0aHxkYXRlSVNPfG9iamVjdExlbmd0aHxmb2N1c0ludmFsaWR8eDIwfHBhcmFtZXRlcnN8ZXF1YWxUb3xkZXBlbmRzfGRlYnVnfHJhbmdlfHN1Ym1pdHx3cmFwcGVyfGRlZmF1bHRNZXNzYWdlfHJlbW92ZUNsYXNzfG5ld3xjb250YWluZXJzfGhhbmRsZXJ8ZXJyb3JzfGhpZGV8cnVsZXNDYWNoZXxhZGRXcmFwcGVyfGVycm9yTGFiZWxDb250YWluZXJ8c2hvd0xhYmVsfGVycm9yRWxlbWVudHxjbGVhbnxwcmVwYXJlRm9ybXxiaW5kfGZvY3Vzb3V0fHZhbGlkYXRlRGVsZWdhdGV8Zm58b2xkfGRlbGVnYXRlfGZpeHxwcmVwYXJlRWxlbWVudHxoaWRlRXJyb3JzfHBhcmFtfHJlc2V0Rm9ybXx3aW5kb3d8YWpheHxjaGFyYWN0ZXJzfGlzfHRoYW58YWJvcnR8TnVtYmVyfHgwZHxicmVha3xkZXBlbmRUeXBlc3x2YWx8aWRPck5hbWV8c3VibWl0SGFuZGxlcnxzdGF0aWNSdWxlc3x0aGVyZWdleHxzcGVjaWFsfGhpZ2hsaWdodHxtZXRhfGNhbmNlbFN1Ym1pdHxldmVudFR5cGV8ZGVmYXVsdHN8Y2xpY2t8Y2F0Y2h8Zm9jdXN8ZmluZExhc3RBY3RpdmV8YnV0dG9ufHNpemV8aWdub3JlVGl0bGV8aWdub3JlfGRlZmF1bHRTaG93RXJyb3JzfGdyZXB8ZXJyb3JDb250YWluZXJ8c2VsZWN0ZWR8bnVtYmVyT2ZJbnZhbGlkc3xlcnJvcnxmaW5kfFJlZ0V4cHx0cmlnZ2VySGFuZGxlcnxjaGVja0Zvcm18aW52YWxpZEhhbmRsZXJ8b25zdWJtaXR8bm90aGluZ3xvcHRpb258Y2hlY2tib3h8QXJyYXl8cmFkaW98cmVtb3ZlfHRleHR8bWFrZUFycmF5fGFkZEV2ZW50TGlzdGVuZXJ8Ymx1cnxpbml0fGF1dG9DcmVhdGVSYW5nZXN8bm98dG98ZXF1YWx8eDdmfGFuZHx4MDF8dHJ5fHgwYXx4MjJ8YXR0cmlidXRlUnVsZXN8bGFzdEFjdGl2ZXxjbGFzc1J1bGVzfGJldHdlZW58cG9ydHxtZXRhZGF0YVJ1bGVzfG1vZGV8b3JpZ2luYWxNZXNzYWdlfG5vcm1hbGl6ZVJ1bGVzfHgwY3xhY2NlcHR8aXNGdW5jdGlvbnx4MGJ8b3J8dGhlfGFkZENsYXNzUnVsZXN8bnVtYmVyREV8ZGF0ZURFfHN0b3BSZXF1ZXN0fHN0YXJ0UmVxdWVzdHxkZXBlbmR8dG9Mb3dlckNhc2V8bm9kZU5hbWV8bnVsbHxjaGVja2VkfGRvY3VtZW50fGVycm9yUGxhY2VtZW50fGh0bWx8Z2VuZXJhdGVkfG1hcHxpbnZhbGlkRWxlbWVudHN8c2hvd3x2YWxpZEVsZW1lbnRzfHBhcmVudHxmaWVsZHxzdHJvbmd8ZXJyb3JDb250ZXh0fGZpbmREZWZpbmVkfFN0cmluZ3xjdXN0b21NZXNzYWdlfHBhcmVudE5vZGV8Y3VzdG9tTWV0YU1lc3NhZ2V8aWR8bGFzdEVsZW1lbnR8Zm9ybWF0QW5kQWRkfG9uZm9jdXNvdXR8cmVtb3ZlQXR0cnN8Y2FuY2VsfGFzc2lnbmVkfGhhc3xkaXNhYmxlZHxpbWFnZXxibG9ja0ZvY3VzQ2xlYW51cHxmb2N1c0NsZWFudXB8Y2FufHRyaWdnZXJ8dmlzaWJsZXxvbmZvY3VzaW58bGFiZWx8c2xpY2V8a2V5dXB8dGV4dGFyZWF8ZmlsZXxwYXNzd29yZHx1bnNoaWZ0fG9ufHRhcmdldHxyZW1vdmVFdmVudExpc3RlbmVyfHRlYXJkb3dufHNldHVwfGFwcGVuZFRvfHdhcm58YWpheFNldHRpbmdzfHZhbHVlQ2FjaGV8Z2lmfGpwZXxwbmd8cGFyc2VJbnR8Y2hhckF0fHByb3RvdHlwZXxEYXRlfE5hTnxncmVhdGVyfHVFMDAwfHVuY2hlY2tlZHxmaWxsZWR8aHR0cHN8eDVkfGxlc3N8eDVifHgyM3x4MjF8Ymxhbmt8bG9uZ3xleHByfHgwOHxoaWRkZW58bGVhc3R8YXR8anNvbnxtb3JlfGRhdGFUeXBlfGV4dGVuc2lvbnxkZWZhdWx0fHdpdGh8YWRkTWV0aG9kfGFnYWlufDUyNDI4OHx4MGV8eDFmfHNhbWV8MjE0NzQ4MzY0N3xjbGFzc3xjYXJkfHByZXZlbnREZWZhdWx0fHg3ZXxjcmVkaXR8ZnRwfGJvb2xlYW58b25seXxnZXRFbGVtZW50c0J5TmFtZXxJU098aW5zZXJ0QWZ0ZXJ8YXBwZW5kfHVGOEZGfEludmFsaWR8d3JhcHxVUkx8YWRkcmVzc3xkZWZpbmVkfE5vfFdhcm5pbmd8VGhpc3x0aXRsZXxzZXREZWZhdWx0c3xyZXR1cm5pbmd8bWF0Y2h8dW5iaW5kfHRocm93fG9uY2xpY2t8Y2hlY2tpbmd8d2hlbnxvY2N1cmVkfG9ua2V5dXB8cmVtb3ZlQXR0cnxleGNlcHRpb258bG9nfGNvbnRpbnVlJy5zcGxpdCgnfCcpLDAse30pKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvY2hhbmdlUHdkLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvY2hhbmdlUHdkLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFiY2JiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9jaGFuZ2VQd2QucGhwCkBAIC0wLDAgKzEsNzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQcm9maWxlIE1hbmFnZXI6CisgKiBUaGlzIHZpZXcgYWxsb3dzIHVzZXIgdG8gY2hhbmdlIHBhc3N3b3JkCisgKi8KKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisKKz8+CisJCisJPGRpdiBjbGFzcz0iYnJlYWRjcnVtYnMiPgorCQk8YSBocmVmPSI8P3BocCBlY2hvIFNJVEVfUk9PVD8+LyI+SG9tZTwvYT4KKwk8L2Rpdj4KKyAgICAKKyAgICA8ZGl2IGNsYXNzPSdzcGFuLTIyIGFwcGVuZC0xIHByZXBlbmQtMSBsYXN0JyBpZD0ncHJvZmlsZV9jb250YWluZXInPgorCQk8aDE+Q2hhbmdlIFBhc3N3b3JkPC9oMT4KKwkJPGRpdiBpZD0ic3VibWVudSI+CisJCQk8cD4KKwkJCQk8YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9tYW5hZ2UiPiBNYW5hZ2UgUHJvZmlsZTwvYT4KKwkJCQkmbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7CisJCQkJPGEgaHJlZj0iPD9waHAgZWNobyAkbW9kdWxlLT5tb2R1bGVSb290Pz4vY2hhbmdlUHdkIj5DaGFuZ2UgUGFzc3dvcmQ8L2E+CisJCQkJJm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOworCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L2dyb3VwcyI+R3JvdXBzPC9hPgorCQkJPC9wPgorCQk8L2Rpdj4KKwkJCisJCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkJCisJCTxmaWVsZHNldCBpZD0ncHJvZmlsZV9maWVsZHNldCc+CisJCTxmb3JtIGlkPSJzaWdudXBmb3JtIiBhdXRvY29tcGxldGU9Im9mZiIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L2NoYW5nZVB3ZC5kbyI+CisgICAgCQk8YnIgY2xhc3M9InNwYWNlIi8+CisgICAgCQkJCisgICAgICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTQgcHJlcGVuZC0xIj4KKwkgICAgCQk8bGFiZWwgZm9yPSJwYXNzd29yZCI+Q2hvb3NlIGEgcGFzc3dvcmQ8L2xhYmVsPgorCSAgICAJPC9kaXY+CisJICAgIAk8ZGl2IGlkPSJmb3JtX2lucHV0IiBjbGFzcz0ic3Bhbi0xMiI+CisJICAgIAkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiBpZD0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgbWF4bGVuZ3RoPSI1MCIgdmFsdWU9IiIgLz4KKwkgICAgCTwvZGl2PgorCSAgICAJCisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAkKKwkgICAgCTxkaXYgY2xhc3M9InNwYW4tNCBwcmVwZW5kLTEiPgorCSAgICAJCTxsYWJlbCBmb3I9InBhc3N3b3JkX2NvbmZpcm0iPkNvbmZpcm0gcGFzc3dvcmQ8L2xhYmVsPgorCSAgICAJPC9kaXY+CisJICAgIAk8ZGl2IGlkPSJmb3JtX2lucHV0IiBjbGFzcz0ic3Bhbi0xMiI+CisJICAgIAkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiBpZD0icGFzc3dvcmRfY29uZmlybSIgbmFtZT0icGFzc3dvcmRfY29uZmlybSIgdHlwZT0icGFzc3dvcmQiIG1heGxlbmd0aD0iNTAiIHZhbHVlPSIiIC8+CisJICAgIAk8L2Rpdj4KKwkgICAgCQorCSAgICAJPGJyIGNsYXNzPSJzcGFjZSIvPgorCSAgICAJPGJyIGNsYXNzPSJzcGFjZSIvPgorCSAgICAJCisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTEwIiBhbGlnbj0iY2VudGVyIj4KKwkgICAgCQk8aW5wdXQgY2xhc3M9InByb2ZpbGVfaW5wdXQiIGlkPSJidXR0b25fcGFzc3dkUmVzZXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+CisgICAgCQk8L2Rpdj4KKyAgICAJCQorCQkJPGJyIGNsYXNzPSJzcGFjZSIvPgorICAgIAk8L2Zvcm0+CisgICAgCTwvZmllbGRzZXQ+CisJCQorICAgIDwvZGl2PgpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9jcmVhdGVVc2VyLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvY3JlYXRlVXNlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhY2U4MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvY3JlYXRlVXNlci5waHAKQEAgLTAsMCArMSwxODQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQcm9maWxlIE1hbmFnZXI6CisgKiBUaGlzIHZpZXcgd2lsbCBhbGxvdyB1c2VyIHRvIGNyZWF0ZSBwcm9maWxlIAorICogCQlpbmNsdWRlcyB2YWxpZGF0aW9uCisgKiAKKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgYWNjZXNzIGdyYW50ZWQgYnkgdW5kZXJseWluZyBkaXJlY3Rvcnkgc2VydmljZQorICovCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworCis/PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisKKwkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKwkJLy8gdmFsaWRhdGUgc2lnbnVwIGZvcm0gb24ga2V5dXAgYW5kIHN1Ym1pdAorCQl2YXIgdmFsaWRhdG9yID0gJCgiI3NpZ251cGZvcm0iKS52YWxpZGF0ZSh7CisJCXJ1bGVzOiB7CisJCQlmaXJzdG5hbWU6ICJyZXF1aXJlZCIsCisJCQlsYXN0bmFtZTogInJlcXVpcmVkIiwKKwkJCXVzZXJuYW1lOiB7CisJCQkJcmVxdWlyZWQ6IHRydWUsCisJCQkJbWlubGVuZ3RoOiAyLAorCQkJfSwKKwkJCXBhc3N3b3JkOiB7CisJCQkJcmVxdWlyZWQ6IHRydWUsCisJCQkJbWlubGVuZ3RoOiA1CisJCQl9LAorCQkJcGFzc3dvcmRfY29uZmlybTogeworCQkJCXJlcXVpcmVkOiB0cnVlLAorCQkJCW1pbmxlbmd0aDogNSwKKwkJCQllcXVhbFRvOiAiI3Bhc3N3b3JkIgorCQkJfSwKKwkJCWVtYWlsOiB7CisJCQkJcmVxdWlyZWQ6IHRydWUsCisJCQkJZW1haWw6IHRydWUsCisJCQl9CisJCX0sCisJCW1lc3NhZ2VzOiB7CisJCQlmaXJzdG5hbWU6ICJFbnRlciB5b3VyIGZpcnN0bmFtZSIsCisJCQlsYXN0bmFtZTogIkVudGVyIHlvdXIgbGFzdG5hbWUiLAorCQkJdXNlcm5hbWU6IHsKKwkJCQlyZXF1aXJlZDogIkVudGVyIGEgdXNlcm5hbWUiLAorCQkJCW1pbmxlbmd0aDogalF1ZXJ5LmZvcm1hdCgiRW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMiKSwKKwkJCX0sCisJCQlwYXNzd29yZDogeworCQkJCXJlcXVpcmVkOiAiUHJvdmlkZSBhIHBhc3N3b3JkIiwKKwkJCQlyYW5nZWxlbmd0aDogalF1ZXJ5LmZvcm1hdCgiRW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMiKQorCQkJfSwKKwkJCXBhc3N3b3JkX2NvbmZpcm06IHsKKwkJCQlyZXF1aXJlZDogIlJlcGVhdCB5b3VyIHBhc3N3b3JkIiwKKwkJCQltaW5sZW5ndGg6IGpRdWVyeS5mb3JtYXQoIkVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzIiksCisJCQkJZXF1YWxUbzogIkVudGVyIHRoZSBzYW1lIHBhc3N3b3JkIGFzIGFib3ZlIgorCQkJfSwKKwkJCWVtYWlsOiB7CisJCQkJcmVxdWlyZWQ6ICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIiwKKwkJCQltaW5sZW5ndGg6ICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIiwKKwkJCX0sCisJCX0sCisJCS8vIHNldCB0aGlzIGNsYXNzIHRvIGVycm9yLWxhYmVscyB0byBpbmRpY2F0ZSB2YWxpZCBmaWVsZHMKKwkJc3VjY2VzczogZnVuY3Rpb24obGFiZWwpIHsKKwkJCS8vIHNldCAmbmJzcDsgYXMgdGV4dCBmb3IgSUUKKwkJCWxhYmVsLmh0bWwoIiZuYnNwOyIpLmFkZENsYXNzKCJjaGVja2VkIik7CisJCX0KKwl9KTsKKwkKKwkvLyBwcm9wb3NlIHVzZXJuYW1lIGJ5IGNvbWJpbmluZyBmaXJzdC0gYW5kIGxhc3RuYW1lCisJJCgiI3VzZXJuYW1lIikuZm9jdXMoZnVuY3Rpb24oKSB7CisJCXZhciBmaXJzdG5hbWUgPSAkKCIjZmlyc3RuYW1lIikudmFsKCk7CisJCXZhciBsYXN0bmFtZSA9ICQoIiNsYXN0bmFtZSIpLnZhbCgpOworCQlpZihmaXJzdG5hbWUgJiYgbGFzdG5hbWUgJiYgIXRoaXMudmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSBmaXJzdG5hbWUgKyAiLiIgKyBsYXN0bmFtZTsKKwkJfQorCX0pOworCit9KTsKKzwvc2NyaXB0PgorCQorCTxkaXYgY2xhc3M9ImJyZWFkY3J1bWJzIj4KKwkJPGEgaHJlZj0iPD9waHAgZWNobyBTSVRFX1JPT1Q/Pi8iPkhvbWU8L2E+CisJPC9kaXY+CisJCisgICAgPGRpdiBjbGFzcz0nc3Bhbi0yMiBhcHBlbmQtMSBwcmVwZW5kLTEgbGFzdCcgaWQ9J3Byb2ZpbGVfY29udGFpbmVyJz4KKyAgICAJPGgxPk9idGFpbmluZyBBY2Nlc3M8L2gxPgorCisJCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkJCisgCQk8ZmllbGRzZXQgaWQ9J3Byb2ZpbGVfZmllbGRzZXQnPgorCQk8Zm9ybSBpZD0ic2lnbnVwZm9ybSIgYXV0b2NvbXBsZXRlPSJvZmYiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9hY2Nlc3MuZG8iPgorCSAgICAJPGJyIGNsYXNzPSJzcGFjZSIvPgorCisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTQgcHJlcGVuZC0xIj4KKwkgICAgCQk8bGFiZWwgZm9yPSJmaXJzdG5hbWUiPkZpcnN0IE5hbWU8L2xhYmVsPgorCSAgICAJPC9kaXY+CisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTE1Ij4KKwkgICAgCQk8aW5wdXQgY2xhc3M9InByb2ZpbGVfaW5wdXQiIGlkPSJmaXJzdG5hbWUiIG5hbWU9ImZpcnN0bmFtZSIgdHlwZT0idGV4dCIgdmFsdWU9IiIgbWF4bGVuZ3RoPSIxMDAiIC8+CisJICAgIAk8L2Rpdj4KKwkgICAgCQorCSAgICAJPGJyIGNsYXNzPSJzcGFjZSIvPgorCSAgICAJCisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTQgcHJlcGVuZC0xIj4KKwkgICAgCQk8bGFiZWwgZm9yPSJsYXN0bmFtZSI+TGFzdCBOYW1lPC9sYWJlbD4KKwkgICAgCTwvZGl2PgorCSAgICAJPGRpdiBjbGFzcz0ic3Bhbi0xNSI+CisJICAgIAkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiBpZD0ibGFzdG5hbWUiIG5hbWU9Imxhc3RuYW1lIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBtYXhsZW5ndGg9IjEwMCIgLz4KKwkgICAgCTwvZGl2PgorCSAgICAJCisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAkKKwkgICAgCTxkaXYgY2xhc3M9InNwYW4tNCBwcmVwZW5kLTEiPgorCSAgICAJCTxsYWJlbCBmb3I9InVzZXJuYW1lIj5EZXNpcmVkIExvZ2luIE5hbWU8L2xhYmVsPgorCSAgICAJPC9kaXY+CisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTE1Ij4KKwkgICAgCQk8aW5wdXQgY2xhc3M9InByb2ZpbGVfaW5wdXQiIGlkPSJ1c2VybmFtZSIgbmFtZT0idXNlcm5hbWUiIHR5cGU9InRleHQiIHZhbHVlPSIiIG1heGxlbmd0aD0iNTAiIC8+CisJICAgIAk8L2Rpdj4KKworCSAgICAJPGJyIGNsYXNzPSJzcGFjZSIvPgorCSAgICAJCisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTQgcHJlcGVuZC0xIj4KKwkgICAgCQk8bGFiZWwgZm9yPSJlbWFpbCI+RW1haWw8L2xhYmVsPgorCSAgICAJPC9kaXY+CisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTE1Ij4KKwkgICAgCQk8aW5wdXQgY2xhc3M9InByb2ZpbGVfaW5wdXQiIGlkPSJlbWFpbCIgbmFtZT0iZW1haWwiIHR5cGU9InRleHQiIHZhbHVlPSIiIG1heGxlbmd0aD0iMTUwIiAvPgorCSAgICAJPC9kaXY+CisJICAgIAkJCisgICAgCQk8YnIgY2xhc3M9InNwYWNlIi8+CisgICAgCQk8YnIgY2xhc3M9InNwYWNlIi8+CisgICAgCQkgICAgCQorICAgICAgICAJPGRpdiBjbGFzcz0ic3Bhbi00IHByZXBlbmQtMSI+CisgICAgICAgIAkJPGxhYmVsIGZvcj0icGFzc3dvcmQiPkNob29zZSBhIHBhc3N3b3JkPC9sYWJlbD4KKwkgICAgCTwvZGl2PgorCSAgICAJPGRpdiBjbGFzcz0ic3Bhbi0xNSI+CisJICAgIAkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiBpZD0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgbWF4bGVuZ3RoPSI1MCIgdmFsdWU9IiIgLz4KKwkgICAgCTwvZGl2PgorCSAgICAJCisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAkKKwkgICAgCTxkaXYgY2xhc3M9InNwYW4tNCBwcmVwZW5kLTEiPgorCSAgICAJCTxsYWJlbCBmb3I9InBhc3N3b3JkX2NvbmZpcm0iPkNvbmZpcm0gcGFzc3dvcmQ8L2xhYmVsPgorCSAgICAJPC9kaXY+CisJICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTE1Ij4KKwkgICAgCQk8aW5wdXQgY2xhc3M9InByb2ZpbGVfaW5wdXQiIGlkPSJwYXNzd29yZF9jb25maXJtIiBuYW1lPSJwYXNzd29yZF9jb25maXJtIiB0eXBlPSJwYXNzd29yZCIgbWF4bGVuZ3RoPSI1MCIgdmFsdWU9IiIgLz4KKwkgICAgCTwvZGl2PgorCSAgICAJCisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAkKKwkgICAgCTxkaXYgY2xhc3M9InNwYW4tMTAiIGFsaWduPSJjZW50ZXIiPgorCSAgICAJCTxpbnB1dCBjbGFzcz0icHJvZmlsZV9pbnB1dCIgaWQ9ImJ1dHRvbl9uZXdfYWNjb3VudCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij4KKyAgICAJCTwvZGl2PgorCisJCQk8YnIgY2xhc3M9InNwYWNlIi8+CisgICAgCTwvZm9ybT4KKyAgICAJPC9maWVsZHNldD4KKyAgICA8L2Rpdj4KKworCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK191YWNjdCA9ICJVQS0yNjIzNDAyLTEiOwordXJjaGluVHJhY2tlcigpOworPC9zY3JpcHQ+CisgICAgCisKKyAgICAKKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9ncm91cHMucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9ncm91cHMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDg5M2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3ZpZXdzL2dyb3Vwcy5waHAKQEAgLTAsMCArMSw4MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFByb2ZpbGUgTWFuYWdlcjoKKyAqIFRoaXMgdmlldyB3aWxsIGV4cG9zZSB0aGUgdXNlciBncm91cHMgYW5kIHJvbGVzIGZvciB0aGUgdXNlci4KKyAqLworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworLy8gR2V0IGluc3RhbmNlIG9mIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIGNsYXNzCiskYXV0aG9yaXphdGlvbiAJPSBBcHA6OkdldCgpLT5nZXRBdXRob3JpemF0aW9uUHJvdmlkZXIoKTsKKyRhdXRoZW50aWNhdGlvbiA9IEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKTsKKworaWYgKCAkYXV0aG9yaXphdGlvbiAhPSBmYWxzZSkgeworCSRncm91cHMgPSAkYXV0aG9yaXphdGlvbi0+cmV0cmlldmVHcm91cHNGb3JVc2VyKCRhdXRoZW50aWNhdGlvbi0+Z2V0Q3VycmVudFVzZXJuYW1lKCksQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2F1dGhvcml6YXRpb25fbGRhcF9ncm91cF9kbiddKTsKK30KKworPz4KKwkKKwk8ZGl2IGNsYXNzPSJicmVhZGNydW1icyI+CisJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gU0lURV9ST09UPz4vIj5Ib21lPC9hPgorCTwvZGl2PgorICAgIAorCTxkaXYgY2xhc3M9J3NwYW4tMjIgYXBwZW5kLTEgcHJlcGVuZC0xIGxhc3QnIGlkPSdwcm9maWxlX2NvbnRhaW5lcic+CisJCTxoMT48P3BocCBlY2hvICRhdXRoZW50aWNhdGlvbi0+Z2V0Q3VycmVudFVzZXJuYW1lKCkgPz4ncyBHcm91cHMgPC9oMT4KKwkJPGRpdiBpZD0ic3VibWVudSI+CisJCQk8cD4KKwkJCQk8YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3QgPz4vbWFuYWdlIj4gTWFuYWdlIFByb2ZpbGU8L2E+CisJCQkJJm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOworCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L2NoYW5nZVB3ZCI+Q2hhbmdlIFBhc3N3b3JkPC9hPgorCQkJCSZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDsKKwkJCQk8YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9ncm91cHMiPkdyb3VwczwvYT4KKwkJCTwvcD4KKwkJPC9kaXY+CisJCQkKKwkJPGJyIGNsYXNzPSJzcGFjZSIvPgorCisJCTxmaWVsZHNldCBpZD0ncHJvZmlsZV9maWVsZHNldCc+CisJCTw/cGhwIAorCQkJCisJCWlmIChjb3VudCgkZ3JvdXBzKSA+IDApIHsKKwkJCWVjaG8gIjxkaXYgY2xhc3M9J3NwYW4tMTUgcHJlcGVuZC0xJz4iOworCQkJZm9yZWFjaCAoJGdyb3VwcyBhcyAkZykgeworCQkJCUxpc3QoJGdyb3VwLCAkcm9sZSkgPSAgZXhwbG9kZSgiXyIsICRnKTsKKwkJCQkKKwkJCQlpZiggJGdyb3VwICE9ICRncm91cEluZGV4ICkgeworCQkJCQllY2hvICI8L3VsPjwvdWw+IjsKKwkJCQkJZWNobyAiPGJyIGNsYXNzPSdzcGFjZSc+IjsKKwkJCQkJZWNobyAiPGgzPnskZ3JvdXB9PC9oMz4iOworCQkJCQllY2hvICI8dWw+PHVsPiI7CisJCQkJCSRncm91cEluZGV4ID0gJGdyb3VwOworCQkJCX0JCQorCQkJICAJZWNobyAiPGxpPiI7CisJCQkgIAllY2hvICRyb2xlOworCQkJCWVjaG8gIjwvbGk+IjsKKwkJCQllY2hvICI8YnIgY2xhc3M9J3NwYWNlJz4iOworCQkJfQorCQkJCisJCQllY2hvICI8L2Rpdj4iOworCQl9IGVsc2V7CisJCQllY2hvICI8aDQ+IE5vIEdyb3VwcyBmb3VuZCE8L2g0PiI7CisJCX0KKwkJPz4KKwkJPC9maWVsZHNldD4KKwkJPGJyIGNsYXNzPSdzcGFjZSc+CisJPC9kaXY+CisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9pbmRleC5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3ZpZXdzL2luZGV4LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I3MGJlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9pbmRleC5waHAKQEAgLTAsMCArMSw4MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFByb2ZpbGUgTWFuYWdlcjoKKyAqIFRoaXMgdmlldyB3aWxsIGV4cG9zZSB0aGUgcHJvZmlsZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLmluaSAocHJvZmlsZV9hdHRyaWJ1dGVzKS4KKyAqLworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworZnVuY3Rpb24gZGlzcGxheUF0dHJpYnV0ZXMoJHVzZXJBdHRyKSB7CisKKwkkc3RyID0gJyc7CisgCWZvcmVhY2ggKCR1c2VyQXR0ciBhcyAka2V5PT4ka2V5VmFsdWUpIHsKKyAJCWZvcmVhY2ggKEFwcDo6R2V0KCktPnNldHRpbmdzWydhdHRyX3RpdGxlcyddIGFzICRhdHRyVGl0bGU9PiR2YWx1ZSkgeworIAkJCWlmICggJGtleSA9PT0gJHZhbHVlKSB7CisgCQkJCSRzdHIgLj0gJzxkaXYgY2xhc3M9InNwYW4tMTMgcHJlcGVuZC0xIj48aDQgYWxpZ249ImxlZnQiPic7CisgCQkJCSRzdHIgLj0gJGF0dHJUaXRsZTsKKyAJCQkJJHN0ciAuPSAnPC9oND48L2Rpdj4nOworIAkJCQkKKyAJCQkJJHN0ciAuPSAnPGRpdiBjbGFzcz0ic3Bhbi01Ij48aDYgYWxpZ249ImxlZnQiPic7CisgCQkJCSRzdHIgLj0gJGtleVZhbHVlOworIAkJCQkkc3RyIC49ICc8L2g2PjwvZGl2Pic7CisgCQkJfQorIAkJfQorIAl9CisgCXJldHVybiAkc3RyOwkKK30KKworCS8vIEdldCB1c2VyIGF0dHJpYnV0ZXMKKwkkdXNlckF0dHIgPSBBcHA6OkdldCgpLT5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCktPnJldHJpZXZlVXNlckF0dHJpYnV0ZXMoIAorCQkJCUFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKS0+Z2V0Q3VycmVudFVzZXJuYW1lKCksIEFwcDo6R2V0KCktPnNldHRpbmdzWydwcm9maWxlX2F0dHJpYnV0ZXMnXSApOworCis/PgorCQorCTxkaXYgY2xhc3M9ImJyZWFkY3J1bWJzIj4KKwkJPGEgaHJlZj0iPD9waHAgZWNobyBTSVRFX1JPT1Q/Pi8iPkhvbWU8L2E+CisJPC9kaXY+CisgICAgCisJPGRpdiBjbGFzcz0nc3Bhbi0yMiBhcHBlbmQtMSBwcmVwZW5kLTEgbGFzdCcgaWQ9J3Byb2ZpbGVfY29udGFpbmVyJz4KKwkJPGgxPldlbGNvbWUgPD9waHAgZWNobyAkdXNlckF0dHJbIEFwcDo6R2V0KCktPnNldHRpbmdzWydmaXJzdG5hbWVfYXR0ciddIF0gPz4hIDwvaDE+CisJCTxkaXYgaWQ9InN1Ym1lbnUiPgorCQkJPHA+CisJCQkJPGEgaHJlZj0iPD9waHAgZWNobyAkbW9kdWxlLT5tb2R1bGVSb290ID8+L21hbmFnZSI+IE1hbmFnZSBQcm9maWxlPC9hPgorCQkJCSZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDsKKwkJCQk8YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9jaGFuZ2VQd2QiPkNoYW5nZSBQYXNzd29yZDwvYT4KKwkJCQkmbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7CisJCQkJPGEgaHJlZj0iPD9waHAgZWNobyAkbW9kdWxlLT5tb2R1bGVSb290Pz4vZ3JvdXBzIj5Hcm91cHM8L2E+CisJCQk8L3A+CisJCTwvZGl2PgorCQkKKyAJCTxiciBjbGFzcz0ic3BhY2UiLz4KKworCQk8aDM+UHJvZmlsZTwvaDM+CQkKKyAJCTxmaWVsZHNldCBpZD0ncHJvZmlsZV9maWVsZHNldCc+CisgCQkJPGJyIGNsYXNzPSJzcGFjZSIvPgorIAkJCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkJCQorCQkJPD9waHAgCWVjaG8gZGlzcGxheUF0dHJpYnV0ZXMoJHVzZXJBdHRyKSA/PgorCQkJCisJCQk8YnIgY2xhc3M9InNwYWNlIi8+CisJCTwvZmllbGRzZXQ+CisJCQorICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisgICAgCQorCTwvZGl2PgorCQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9sb2dpbi5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wcm9maWxlL3ZpZXdzL2xvZ2luLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYzYjJjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9sb2dpbi5waHAKQEAgLTAsMCArMSw3MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFByb2ZpbGUgTWFuYWdlcjoKKyAqIExvZ2luIHBhZ2UKKyAqLworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworLy8gSWYgYSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluLCByZWRpcmVjdCB0byBob21lIHBhZ2UKK2lmKCBBcHA6OkdldCgpLT5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCktPmlzTG9nZ2VkSW4oKSApIEFwcDo6R2V0KCktPlJlZGlyZWN0KFNJVEVfUk9PVCAuICIvIik7IAorCis/PgorCQorCTxkaXYgY2xhc3M9ImJyZWFkY3J1bWJzIj4KKwkJPGEgaHJlZj0iPD9waHAgZWNobyBTSVRFX1JPT1Q/Pi8iPkhvbWU8L2E+CisJPC9kaXY+CisgICAgCisJPGRpdiBjbGFzcz0nc3Bhbi0yMiBhcHBlbmQtMSBwcmVwZW5kLTEgbGFzdCcgaWQ9J3Byb2ZpbGVfY29udGFpbmVyJz4gCisJCTxoMT5QbGVhc2UgbG9nIGluIHRvIGNvbnRpbnVlLi4uPC9oMT4KKwkJCisJCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkJCisJCTxmaWVsZHNldCBpZD0ncHJvZmlsZV9maWVsZHNldCc+CisJCTxmb3JtIGlkPSJzaWdudXBmb3JtIiBhdXRvY29tcGxldGU9Im9mZiIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdCA/Pi9sb2dpbi5kbyI+CisJCQk8YnIgY2xhc3M9InNwYWNlIi8+CisJCSAJPGJyIGNsYXNzPSJzcGFjZSIvPgorCQkgCQorCQkJPGRpdiBjbGFzcz0ic3Bhbi0yIHByZXBlbmQtMSI+CisJCQkJPGxhYmVsIGZvcj0idXNlcm5hbWUiPlVzZXJuYW1lPC9sYWJlbD4KKwkJCTwvZGl2PgorCQkJPGRpdiBjbGFzcz0ic3Bhbi0xNSI+CisJCQkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiBpZD0idXNlcm5hbWUiIG5hbWU9InVzZXJuYW1lIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBtYXhsZW5ndGg9IjUwIiAvPgorCQkJPC9kaXY+CisJCQkKKwkJCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkJCQorCQkJPGRpdiBjbGFzcz0ic3Bhbi0yIHByZXBlbmQtMSI+CisJICAgIAkJPGxhYmVsIGZvcj0icGFzc3dvcmQiPlBhc3N3b3JkPC9sYWJlbD4KKwkgICAgCTwvZGl2PgorCSAgICAJPGRpdiBjbGFzcz0ic3Bhbi0xNSI+CisJICAgIAkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiBpZD0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgbWF4bGVuZ3RoPSI1MCIgdmFsdWU9IiIgLz4KKwkgICAgCTwvZGl2PgorCSAgICAJCisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAk8YnIgY2xhc3M9InNwYWNlIi8+CisJICAgIAkKKwkgICAgCTxkaXYgY2xhc3M9InNwYW4tMTAiIGFsaWduPSJjZW50ZXIiPgorCSAgICAJCTxpbnB1dCBjbGFzcz0icHJvZmlsZV9pbnB1dCIgaWQ9ImJ1dHRvbl9uZXdfYWNjb3VudCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij4KKyAgICAJCTwvZGl2PgorICAgIAkJCisgICAgCQk8YnIgY2xhc3M9InNwYWNlIi8+CisgICAgCQk8YnIgY2xhc3M9InNwYWNlIi8+CisJCTwvZm9ybT4KKwkJPC9maWVsZHNldD4KKwk8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvbWFuYWdlLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvbWFuYWdlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE3OGNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9tYW5hZ2UucGhwCkBAIC0wLDAgKzEsODcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQcm9maWxlIE1hbmFnZXI6CisgKiBUaGlzIHZpZXcgd2lsbCBleHBvc2UgdGhlIHByb2ZpbGUgYXR0cmlidXRlcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZy5pbmkgCisgKiAocHJvZmlsZV9tb2RpZnlfYXR0cmlidXRlcykgYW5kIHdpbGwgYWxsb3cgdXNlciB0byBtb2RpZnkgdmFsdWVzIGluIHRoZSBMREFQIGRpcmVjdG9yeS4KKyAqLworJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworZnVuY3Rpb24gbWFuYWdlQXR0cmlidXRlKCkgeworCSR1c2VyQXR0ciA9IEFwcDo6R2V0KCktPmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKS0+cmV0cmlldmVVc2VyQXR0cmlidXRlcyggCisJCQkJQXBwOjpHZXQoKS0+Z2V0QXV0aGVudGljYXRpb25Qcm92aWRlcigpLT5nZXRDdXJyZW50VXNlcm5hbWUoKSwgQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3Byb2ZpbGVfbW9kaWZ5X2F0dHJpYnV0ZXMnXSApOworCSRzdHIgPSAnJzsKKyAJZm9yZWFjaCAoJHVzZXJBdHRyIGFzICRrZXk9PiRrZXlWYWx1ZSkgeworIAkJZm9yZWFjaCAoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ2F0dHJfdGl0bGVzJ10gYXMgJGF0dHJUaXRsZT0+JHZhbHVlKSB7CisgCQkJaWYgKCAka2V5ICE9IEFwcDo6R2V0KCktPnNldHRpbmdzWyd1c2VybmFtZV9hdHRyJ10pIHsKKworCSAJCQlpZiAoICRrZXkgPT09ICR2YWx1ZSkgeworCSAJCQkJJHN0ciAuPSAnPGRpdiBjbGFzcz0ic3Bhbi0zIHByZXBlbmQtMSI+PGxhYmVsIGZvcj0iJzsKKwkgCQkJCSRzdHIgLj0gJGtleSAuICciPiAnIC4gJGF0dHJUaXRsZTsKKwkgCQkJCSRzdHIgLj0gJzwvbGFiZWw+PC9kaXY+JzsKKwkgCQkJCQorCSAJCQkJJHN0ciAuPSAnPGRpdiBjbGFzcz0ic3Bhbi0xMiI+PGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjEwMCIgaWQ9JzsKKwkgCQkJCSRzdHIgLj0gJGtleSAuICcgbmFtZT0nIC4gJGtleSAuICcgdmFsdWU9JyAuICRrZXlWYWx1ZTsKKwkgCQkJCSRzdHIgLj0gJz48L2Rpdj4nOworCSAJCQkJJHN0ciAuPSAnPGJyIGNsYXNzPSJzcGFjZSIvPic7CisJIAkJCX0KKyAJCQl9CisgCQl9CisgCX0KKworIAlyZXR1cm4gJHN0cjsKK30KKz8+CisJCisJPGRpdiBjbGFzcz0iYnJlYWRjcnVtYnMiPgorCQk8YSBocmVmPSI8P3BocCBlY2hvIFNJVEVfUk9PVD8+LyI+SG9tZTwvYT4KKwk8L2Rpdj4KKyAgICAKKyAgICA8ZGl2IGNsYXNzPSdzcGFuLTIyIGFwcGVuZC0xIHByZXBlbmQtMSBsYXN0JyBpZD0ncHJvZmlsZV9jb250YWluZXInPgorICAgIAk8aDE+TWFuYWdlIFlvdXIgUHJvZmlsZTwvaDE+CisJCTxkaXYgaWQ9InN1Ym1lbnUiPgorCQkJPHA+CisJCQkJPGEgaHJlZj0iPD9waHAgZWNobyAkbW9kdWxlLT5tb2R1bGVSb290Pz4vbWFuYWdlIj4gTWFuYWdlIFByb2ZpbGU8L2E+CisJCQkJJm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOworCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1vZHVsZS0+bW9kdWxlUm9vdD8+L2NoYW5nZVB3ZCI+Q2hhbmdlIFBhc3N3b3JkPC9hPgorCQkJCSZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDsKKwkJCQk8YSBocmVmPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9ncm91cHMiPkdyb3VwczwvYT4KKwkJCTwvcD4KKwkJPC9kaXY+CisJCQorCQk8YnIgY2xhc3M9InNwYWNlIi8+CisKKwkJPGZpZWxkc2V0IGlkPSdwcm9maWxlX2ZpZWxkc2V0Jz4KKwkJPGZvcm0gaWQ9InNpZ251cGZvcm0iIGF1dG9jb21wbGV0ZT0ib2ZmIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD9waHAgZWNobyAkbW9kdWxlLT5tb2R1bGVSb290Pz4vbWFuYWdlLmRvIj4KKwkgICAgCTxiciBjbGFzcz0ic3BhY2UiLz4KKworCQkJPD9waHAgZWNobyBtYW5hZ2VBdHRyaWJ1dGUoKT8+CisKKwkgICAgCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkgICAgCTxiciBjbGFzcz0ic3BhY2UiLz4KKwkgICAgCQorCSAgICAJPGRpdiBjbGFzcz0ic3Bhbi0xMCIgYWxpZ249ImNlbnRlciI+CisJICAgIAkJPGlucHV0IGNsYXNzPSJwcm9maWxlX2lucHV0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTdWJtaXQiIG5hbWU9InN1Ym1pdF9idXR0b24iPgorICAgIAkJPC9kaXY+CisgICAgCQkKKwkgICAgCTxiciBjbGFzcz0ic3BhY2UiLz4KKyAgICAJPC9mb3JtPgorCQk8L2ZpZWxkc2V0PgorCQkKKyAgICA8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvcGFzc3dvcmRDaGFuZ2VDb25maXJtZWQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHJvZmlsZS92aWV3cy9wYXNzd29yZENoYW5nZUNvbmZpcm1lZC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyODIwMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3Byb2ZpbGUvdmlld3MvcGFzc3dvcmRDaGFuZ2VDb25maXJtZWQucGhwCkBAIC0wLDAgKzEsNDQgQEAKKzw/cGhwIAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUHJvZmlsZSBNYW5hZ2VyOgorICogRGlzcGxheSBjb25maXJtYXRpb24gb2YgcGFzc3dvcmQgY2hhbmdlIGFuZCBhbGxvdyB1c2VyIHRvIGxvZyBiYWNrIGluCisgKi8KKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisKKz8+CisJCisJPGRpdiBjbGFzcz0iYnJlYWRjcnVtYnMiPgorCQk8YSBocmVmPSI8P3BocCBlY2hvIFNJVEVfUk9PVD8+LyI+SG9tZTwvYT4KKwk8L2Rpdj4KKyAgICAKKyAgICA8ZGl2IGNsYXNzPSdzcGFuLTIyIGFwcGVuZC0xIHByZXBlbmQtMSBsYXN0JyBpZD0icHJvZmlsZV9jb250YWluZXIiPgorICAgIAk8ZGl2IGNsYXNzPSJzcGFuLTI0Ij4KKyAgICAJCTxicj4KKwkJCTxoMz5QYXNzd29yZCBoYXMgYmVlbiBjaGFuZ2VkLjwvaDM+CisJCQk8YnI+CisgICAgCTwvZGl2PgorCQkKKwkJPGRpdiBjbGFzcz0ic3Bhbi0yMiI+CisJCQk8aDU+PGEgaHJlZj0iPD9waHAgZWNobyAkbW9kdWxlLT5tb2R1bGVSb290Pz4vbG9naW4iPlBsZWFzZSBsb2cgaW4gd2l0aCBuZXcgcGFzc3dvcmQuPC9hPjwvaDU+CisJCTwvZGl2PgorCQk8YnIgY2xhc3M9InNwYWNlIi8+CisJCQorICAgIDwvZGl2PgorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvUkVBRE1FLnR4dCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFjNTMwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTE1IEBACitQdW55IC0gTGlnaHR3ZWlnaHQgY29udGVudCBlZGl0b3IgZm9yIEJhbGFuY2UgYXBwbGljYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1B1bnkgaXMgYSBsaWdodHdlaWdodCBjb250ZW50IGVkaXRpbmcgbW9kdWxlIGZvciBCYWxhbmNlIGFwcGxpY2F0aW9ucy4gUHVueSBtYWtlcworaXQgZWFzeSBmb3IgZGV2ZWxvcGVycyB0byBhZGQgdXNlci1lZGl0YWJsZSBzZWN0aW9ucyBvZiBjb250ZW50IHRvIHRoZWlyIGFwcGxpY2F0aW9uCit2aWV3cyBhbmQgc3VwcG9ydHMgcmVhbC10aW1lLCBpbi1wbGFjZSBlZGl0aW5nIG9mIHRoZSBjb250ZW50LgorCitPdmVydmlldworLS0tLS0tLS0KKworUHVueSBtYWtlcyBpdCBlYXNpZXIgdG8gc2VwYXJhdGUgY29udGVudCBmcm9tIHByZXNlbnRhdGlvbiBhbmQgc2VwYXJhdGUgdGhlIAorcm9sZSBvZiB0aGUgc2l0ZSBkZXZlbG9wZXIgYW5kIHRoZSBjb250ZW50IG1hbmFnZXIuIEFzIGl0cyBuYW1lIGltcGxpZXMsIGl0Citwcm92aWRlcyB0aGUgYmFyZSBtaW5pbXVtIG5lY2Vzc2FyeSB0byBhY2NvbXBsaXNoIHRoaXMgLS0gYmFzZWQgb24gdGhlIAordW5kZXJzdGFuZGluZyB0aGF0IGV4Y2VsbGVudCwgZnVsbC1mbGVkZ2VkIENvbnRlbnQgTWFuYWdlbWVudCBTeXN0ZW0gb3B0aW9ucworYXJlIHJlYWRpbHkgYXZhaWxhYmxlIGFuZCBtb3JlIGFwcHJvcHJpYXRlIGZvciBjb250ZW50LWhlYXZ5IHNpdGVzLiBQdW55IHNpbXBseSAKK3Byb3ZpZGVzIGEgd2F5IGZvciBzaXRlcyB0aGF0IGFyZSBub3QgZ2VuZXJhbGx5IHN1aXRlZCB0byBhIENNUyB0byBuZXZlcnRoZWxlc3MKK3JlYXAgdGhlIGJlbmVmaXRzIG9mIHJlYWwtdGltZSwgaW4tYnJvd3NlciBjb250ZW50IGVkaXRpbmcgYnkgYSB1c2VyIG5vdCAKK2ludGltYXRlbHkgZmFtaWxpYXIgd2l0aCBIVE1MLgorCitIb3cgaXQgV29ya3MKKy0tLS0tLS0tLS0tLQorCitEZXZlbG9wZXJzIGVtYmVkICdjb250YWluZXJzJyBpbiB0aGVpciB2aWV3cywgYW5kIGNvbnRlbnQgZWRpdG9ycyBwcm92aWRlIHRoZQorY29udGVudCB0aGF0IGdldCBkaXNwbGF5ZWQgaW4gdGhlIGNvbnRhaW5lcnMuIFB1bnkgbG9hZHMgdXAgdGhlIG1vc3QgcmVjZW50IAordmVyc2lvbiBvZiB0aGUgY29udGVudCBmcm9tIHRoZSBkYXRhIHN0b3JlLCByZW5kZXJzIGl0IHVzaW5nIHRoZSBzcGVjaWZpZWQgCitwYXJzZXIsIGFuZCBwbGFjZXMgdGhlIHJlbmRlcmVkIHRleHQgaW50byB0aGUgdmlldyBjb250YWluZXIuIAorCitCeSBsb2dnaW5nIGluIHdpdGggdGhlIGVkaXRvciBjcmVkZW50aWFscywgYSB1c2VyIGNhbiB2aXN1YWxseSBzZWUgdGhlIGVkaXRhYmxlCisnY29udGFpbmVycycgb24gdGhlIGFwcGxpY2F0aW9uIHZpZXdzLCBhbmQsIHVzaW5nIGEgamF2YXNjcmlwdC1lbmFibGVkIGJyb3dzZXIsCitjYW4gcHJvdmlkZSBpbmxpbmUsIHJlYWwtdGltZSBlZGl0cywgY3JlYXRpbmcgYSBuZXcgdmVyc2lvbiBvZiB0aGUgY29udGVudC4KKworCisKKyMjIyBGbGV4aWJpbGl0eSAjIyMKKworUHVueSBoYXMgYmVlbiBkZXNpZ25lZCBzbyB0aGF0IGl0IGlzIGVhc3kgdG8gcGx1ZyBpbiBjdXN0b20gYmFjayBlbmQgZGF0YQorc3RvcmVzIChNeVNxbCwgTW9uZ29EQiwgU1FMaXRlLCBldGMpIGFuZCB0ZW1wbGF0ZSBlbmdpbmVzIChNYXJrZG93biwgVGV4dGlsZSwKK2JiY29kZSwgZXRjKS4gSWYgYSBkcml2ZXIgZm9yIDxpbnNlcnQgZGF0YSBzdG9yZSBvciBwYXJzZXIgaGVyZT4gZG9lc24ndCBleGlzdCwgCit0aGVyZSBhcmUgdHdvIHByaW1hcnkgZXh0ZW5zaW9uIHBvaW50czogUHVueV9EYXRhU3RvcmUgKGEgYmFzZSBjbGFzcyBmb3IgZGV2ZWxvcGluZyAKK2RyaXZlcnMgZm9yIGRhdGEgc3RvcmVzKSwgYW5kIFB1bnlfUGFyc2VyIChhIGJhc2UgY2xhc3MgZm9yIGludGVyZmFjaW5nIHdpdGggdGV4dCAKK3BhcnNlcnMgYW5kIHRlbXBsYXRlIGVuZ2luZXMpLiBVc2luZyB0aGUgZXhhbXBsZXMgaW4gdGhlIC9jbGFzc2VzL2RhdGEgYW5kIAorL2NsYXNzZXMvcGFyc2VycywgaXQgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZWFzeSB0byBkZXZlbG9wIGFkZGl0aW9uYWwgZHJpdmVycy4KKworCitJbnN0YWxsYXRpb24KKy0tLS0tLS0tLS0tLQorCitDb3B5IHRoZSBQdW55IG1vZHVsZSAodGhpcyBkaXJlY3RvcnkpIHRvIHRoZSAvbW9kdWxlcyBkaXJlY3Rvcnkgb2YKK3lvdXIgQmFsYW5jZSBhcHBsaWNhdGlvbi4gCisKKworQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLQorCitBbGwgY29uZmlndXJhdGlvbiBmb3IgUHVueSB0YWtlcyBwbGFjZSBpbiB0aGUgbW9kdWxlJ3MgJ2NvbmZpZy5pbmknIGZpbGUuIFNlZQordGhlIGlubGluZSBkb2N1bWVudGF0aW9uIGluICdjb25maWcuaW5pJyBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgZWFjaAorY29uZmlndXJhdGlvbiBvcHRpb24uIAorCisKK0RldmVsb3BlciBHdWlkZQorLS0tLS0tLS0tLS0tLS0tCisKKyMjIyBJbmNsdWRpbmcgUHVueSBpbiB5b3VyIGFwcGxpY2F0aW9uCisKK0luIGdlbmVyYWwsIFB1bnkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIG9uIGVhY2ggYXBwbGljYXRpb24gdmlldy4gVG8gYXZvaWQgaGF2aW5nIHRvIGxvYWQgCit0aGUgbW9kdWxlIGF0IHRoZSB0b3Agb2YgZWFjaCB2aWV3LCBpdCBpcyBwb3NzaWJsZSB0byBpbmNsdWRlIHRoZSBtb2R1bGUgb25jZSxpbiB0aGUgCitCYWxhbmNlIGluZGV4LnBocCBhdCB0aGUgcm9vdCBvZiB5b3VyIGFwcGxpY2F0aW9uLiBTaW1wbHkgYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gdGhlIAorJ2luZGV4LnBocCcgZmlsZSB3aGVyZSBpdCBzYXlzICdJbml0aWFsaXplIGFueSBnbG9iYWxseSByZXF1aXJlZCBtb2R1bGVzIGhlcmUnOgorCisvLyBQdW55IGluaXRpYWxpemF0aW9uCitBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCdwdW55Jyk7CityZXF1aXJlX29uY2UoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfbW9kdWxlX3BhdGgnXSAuICcvY2xhc3Nlcy9QdW55LmNsYXNzLnBocCcpOworCisKKyMjIyBJbnN0YWxsaW5nIHlvdXIgZGF0YSBzdG9yZSAjIyMKKworTG9vayBpbiB0aGUgL3NjaGVtYXMgZm9sZGVyIGluIHRoZSBQdW55IG1vZHVsZSBmb3IgYSBzY2hlbWEgY29tcGF0aWJsZSB3aXRoIHlvdXIgZGF0YXN0b3JlCitkcml2ZXIuIEluc3RhbGwgdGhlIHNjaGVtYSB1c2luZyB3aGF0ZXZlciBtZXRob2QgaXMgbW9zdCBhcHByb3ByaWF0ZSBmb3IgdGhlIHRlY2hub2xvZ3kuIFRoZQorZGVmYXVsdCBkcml2ZXIgaXMgdGhlIFBETyBkcml2ZXIgaW1wbGVtZW50ZWQgaW4gLi9jbGFzc2VzL2RhdGEvUHVueV9QZG9EYXRhU3RvcmUuY2xhc3MucGhwLgorVGhlIE15U1FMIHNjaGVtYSBjb21wYXRpYmxlIHdpdGggdGhpcyBkcml2ZXIgaXMgaW4gLi9zY2hlbWFzL3B1bnkucGRvLm15c3FsLnNxbC4gQ29weSB0aGlzCitmaWxlIGFuZCBpbXBvcnQgaXQgaW50byB0aGUgZGF0YWJhc2UgeW91IGNvbmZpZ3VyZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RlcCBhYm92ZS4KKworCisjIyMgSW5jbHVkaW5nIFB1bnkgY29udGFpbmVycyBpbiB5b3VyIGFwcGxpY2F0aW9uIHZpZXdzICMjIyAKKworVGhlIGVhc2llc3Qgd2F5IHRvIGluY2x1ZGUgUHVueSBjb250YWluZXJzIGluIHlvdXIgYXBwbGljYXRpb24gdmlld3MgaXM6CisKKzw/cGhwIGVjaG8gUHVueTo6Y29udGFpbmVyKCktPmxvYWQoJ3Jlc291cmNlaWQnKTs/PgorCitCeSBkZWZhdWx0LCBjb250YWluZXIgY3JlYXRlcyBhICc8ZGl2PicgZWxlbWVudCBhbmQgbG9hZHMgdGhlIGNvbnRlbnQgaW50byBpdC4gVG8gdXNlCitzb21ldGhpbmcgb3RoZXIgdGhhbiBhICc8ZGl2Picgc2ltcGx5IHNwZWNpZnkgdGhlIGh0bWwgZWxlbWVudCB0byB0aGUgY29udGFpbmVyKCkgZnVuY3Rpb246CisKKzw/cGhwIGVjaG8gUHVueTo6Y29udGFpbmVyKCdzcGFuJyktPmxvYWQoJ3Jlc291cmNlaWQnKTs/PgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHlvdXIgY29udGFpbmVyLiBFeGFtcGxlcyAKK2luY2x1ZGUgYSBET00gaWQsIENTUyBjbGFzcyhlcyksIHN0eWxlIGF0dHJpYnV0ZSwgYWx0LCByZWwsIG9yIGFueXRoaW5nIGVsc2UuIFRoaXMgaXMgCithY2NvbXBsaXNoZWQgYnkgcGFzc2luZyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBjb250YWluZXIoKSB3aGVyZQordGhlIGFycmF5IGtleXMgYXJlIHRoZSBhdHRyaWJ1dGUgbmFtZXMsIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgYXR0cmlidXRlIHZhbHVlcy4gCisKKzw/cGhwIGVjaG8gUHVueTo6Y29udGFpbmVyKCdkaXYnLGFycmF5KCdpZCc9PidteWRpdicsJ2NsYXNzJz0+J2ZvbyBiYXInKSktPmxvYWQoJ3Jlc291cmNlaWQnKTs/PgorCisKKyMjIyBBbGxvd2luZyBlZGl0b3JzIHRvIGxvZyBpbiBhbmQgZWRpdCAjIyMKKworU29tZXdoZXJlIGluIHlvdXIgYXBwbGljYXRpb24sIHRoZXJlIHNob3VsZCBiZSBhIGxvZ2luIGxpbmsgdGhhdCBhbGxvd3MgZWRpdG9ycyB0byBsb2cgaW4KK2FuZCBtYWtlIGVkaXRzIHRvIGNvbnRlbnQuIFRoaXMgaXMgZWFzaWx5IGFjY29tcGxpc2hlZCBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHdoZXJldmVyCit5b3Ugd2FudCB0aGUgbG9naW4gbGluayB0byBhcHBlYXI6CisKKzw/cGhwIGVjaG8gUHVueTo6c3RhdHVzKCk7Pz4KKworVGhpcyB3aWxsIGRpc3BsYXkgZWl0aGVyIGEgbG9naW4gb3IgbG9nb3V0IGxpbmssIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCBhbiBlZGl0b3IKK2lzIGN1cnJlbnRseSBsb2dnZWQgaW4uIAorCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQsIGl0IGxpdmVzIHVwIHRvIGl0cyBuYW1lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9QdW55LmNsYXNzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9QdW55LmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VkNmJjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL1B1bnkuY2xhc3MucGhwCkBAIC0wLDAgKzEsMTY2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3JlcXVpcmVfb25jZSggZGlybmFtZShfX0ZJTEVfXykgLiAnL1B1bnlfQ29udGFpbmVyLmNsYXNzLnBocCcpOworcmVxdWlyZV9vbmNlKCBkaXJuYW1lKF9fRklMRV9fKSAuICcvUHVueV9SZXNvdXJjZS5jbGFzcy5waHAnKTsKKworLyoqCisgKiBQdW55CisgKiAKKyAqIExpZ2h0LXdlaWdodCBjb250ZW50IGVkaXRpbmcgZm9yIEJhbGFuY2UgYXBwbGljYXRpb25zLiBQdW55IG1ha2VzIGl0IGVhc3kKKyAqIHRvIGFkZCBlZGl0YWJsZSBzZWN0aW9ucyBvZiBjb250ZW50IHRvIHlvdXIgYXBwbGljYXRpb24gdmlld3MgYW5kIHN1cHBvcnRzCisgKiByZWFsLXRpbWUsIGluLXBsYWNlIGVkaXRpbmcuCisgKiAKKyAqIFB1bnkgaGFzIGJlZW4gZGVzaWduZWQgc28gdGhhdCBpdCBpcyBlYXN5IHRvIHBsdWcgaW4gY3VzdG9tIGJhY2sgZW5kIGRhdGEKKyAqIHN0b3JlcyAoTXlTcWwsIE1vbmdvREIsIFNRTGl0ZSwgZXRjKSBhbmQgdGVtcGxhdGUgZW5naW5lcyAoTWFya2Rvd24sIFRleHRpbGUsCisgKiBiYmNvZGUsIGV0YykuIFVzZSB3aGF0IG1ha2VzIHNlbnNlIGZvciB5b3VyIHByb2plY3QsIGFuZCBpZiB3aGF0IHlvdSB3YW50CisgKiBpcyBub3QgeWV0IHN1cHBvcnRlZCwgd3JpdGluZyBhIFB1bnkgZHJpdmVyIGZvciBhIGRhdGFzdG9yZSBvciB0ZW1wbGF0ZSAKKyAqIGVuZ2luZSBpcyBhIHBpZWNlIG9mIGNha2UuIFRoZXJlIGFyZSBleGFtcGxlcyBvZiBlYWNoIGluIHRoZSAvY2xhc3Nlcy9kYXRhIGFuZCAKKyAqIC9jbGFzc2VzL3BhcnNlcnMgZGlyZWN0b3JpZXMuCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqLworCitjbGFzcyBQdW55IHsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljICRkYXRhc3RvcmUgPSBudWxsOworCQorCXByb3RlY3RlZCBzdGF0aWMgJGNvbW1vblJlc291cmNlc0xvYWRlZCA9IGZhbHNlOworCisJcHJvdGVjdGVkIHN0YXRpYyAkZWRpdG9yUmVzb3VyY2VzTG9hZGVkID0gZmFsc2U7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpbml0KCkgeworCQkKKwkJLy8gT25seSBpZiB0aGUgZGF0YXN0b3JlIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuLi4KKwkJaWYgKCFzZWxmOjokZGF0YXN0b3JlKSB7CisJCQl0cnkgeworCQkJCS8vIE9idGFpbiBkYXRhc3RvcmUgY29uZmlndXJhdGlvbiBkZXRhaWxzCisJCQkJJGRhdGFzdG9yZUNsYXNzID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfZGF0YXN0b3JlX2NsYXNzbmFtZSddOworCQkJCXJlcXVpcmVfb25jZSggQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfZGF0YXN0b3JlX2NsYXNzcGF0aCddICk7CisJCQorCQkJCS8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YXN0b3JlIGNvbm5lY3RvcgorCQkJCXNlbGY6OiRkYXRhc3RvcmUgPSBuZXcgJGRhdGFzdG9yZUNsYXNzKCk7CisJCQorCQkJCS8vIENvbm5lY3QgdG8gdGhlIGRhdGFzdG9yZQorCQkJCXNlbGY6OiRkYXRhc3RvcmUtPmNvbm5lY3QoKTsKKwkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CisJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3IgaW5zdGFudGlhdGluZyBQdW55LiAiCisJCQkJLiAiVGhlIHVuZGVybHlpbmcgY2F1c2Ugd2FzOiAiIC4gJGUtPmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCX0KKwkJCisJCXNlbGY6OmluamVjdENvbW1vblJlc291cmNlcygpOworCQlzZWxmOjppbmplY3RFZGl0b3JSZXNvdXJjZXMoKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkKCAkcmVzb3VyY2VJZCwgJHZlcnNpb24gPSBudWxsLCAkcGFyc2VDb250ZW50ID0gdHJ1ZSApIHsKKworCQlzZWxmOjppbml0KCk7CisJCQorCQkvLyBMb2FkIHRoZSByYXcgZGF0YSBmcm9tIHRoZSBkYXRhIHN0b3JlLi4uCisJCWlmIChmYWxzZSAhPT0gKCRyZXNvdXJjZSA9IHNlbGY6OiRkYXRhc3RvcmUtPmxvYWQoICRyZXNvdXJjZUlkLCAkdmVyc2lvbiApKSkgeworCQkJCisJCQkvLyBJZiBhIHZhbGlkIHJlc291cmNlIHdhcyBmb3VuZCwgcmV0dXJuIGl0CisJCQlyZXR1cm4gKCRwYXJzZUNvbnRlbnQpID8gJHJlc291cmNlLT5wYXJzZSgpIDogJHJlc291cmNlOworCQkJCisJCX0gZWxzZSB7CisJCQkKKwkJCS8vIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHJlc291cmNlIHdpdGggdGhlIHJlcXVlc3RlZCBpZAorCQkJcmV0dXJuIG5ldyBQdW55X1Jlc291cmNlKCBhcnJheSgicmVzb3VyY2VJZCIgPT4gJHJlc291cmNlSWQsICJjb250ZW50IiA9PiAkcmVzb3VyY2VJZCkgKTsKKwkJCisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdG9yZSAoUHVueV9SZXNvdXJjZSAkcmVzb3VyY2UgKSB7CisJCQorCQlzZWxmOjppbml0KCk7CisJCQorCQkvLyBQZXJzaXN0IHRoZSByZXNvdXJjZSB0byB0aGUgZGF0YXN0b3JlCisJCXNlbGY6OiRkYXRhc3RvcmUtPnN0b3JlKCAkcmVzb3VyY2UgKTsKKwkJCisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNFZGl0aW5nKCkgeworCQlyZXR1cm4gKCBpc3NldCgkX1NFU1NJT05bJ3B1bnknXSkgJiYgJF9TRVNTSU9OWydwdW55J11bJ2VkaXRpbmcnXSA9PT0gdHJ1ZSApOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZUVkaXRvclNlc3Npb24oKSB7CisJCSRfU0VTU0lPTlsncHVueSddID0gYXJyYXkoJ2VkaXRpbmcnID0+IHRydWUsICdzZXNzaW9uU3RhcnQnID0+IHRpbWUoKSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVzdHJveUVkaXRvclNlc3Npb24oKSB7CisJCXVuc2V0KCRfU0VTU0lPTlsncHVueSddKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdGF0dXMoKSB7CisJCWlmIChzZWxmOjppc0VkaXRpbmcoKSkgeworCQkJcmV0dXJuICI8YSBocmVmPSciLkFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X21vZHVsZV9yb290J10uIi9sb2dvdXQnPkxvZ291dDwvYT4iOworCQl9IGVsc2UgeworCQkJcmV0dXJuICI8YSBocmVmPSciLkFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X21vZHVsZV9yb290J10uIi9sb2dpbic+TG9naW48L2E+IjsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGluamVjdENvbW1vblJlc291cmNlcygpIHsKKwkgIC8vIEluamVjdCB0aGUgZW52aXJvbm1lbnRhbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHRoZSBqYXZhc2NyaXB0IGxpYnJhcmllcworCSAgLy8gdG8gZnVuY3Rpb24gYXMgZXhwZWN0ZWQuLi4KKwkgIGlmICggIXNlbGY6OiRjb21tb25SZXNvdXJjZXNMb2FkZWQgKSB7CisJICAgICRqcyA9ICJcclxuIgorCSAgICAgIC4gInZhciBwdW55X21vZHVsZV9yb290ICAgPSAnIiAuIHRyaW0oQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfbW9kdWxlX3Jvb3QnXSkgLiAiJ1xyXG4iCisJICAgICAgLiAiICAgIHB1bnlfbW9kdWxlX3N0YXRpYyA9ICciIC4gdHJpbShBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9tb2R1bGVfc3RhdGljJ10pIC4iJ1xyXG4iCisJICAgICAgLiAiICAgIHB1bnlfY3VycmVudF91cmwgPSAnIiAuICRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSAuIic7XHJcbiI7CisJICAgICAgQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmFkZEphdmFzY3JpcHQoICRqcywgdHJ1ZSApOyAvLyByYXcgSmF2YXNjcmlwdAorCSAgICAKKwkgICAgLy8gQWRkIHB1bnkgZGVmYXVsdCBzdHlsZXMKKwkgICAgJHN0YXRpY1BhdGggPSB0cmltKEFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X21vZHVsZV9zdGF0aWMnXSk7CisJCUFwcDo6R2V0KCktPnJlc3BvbnNlLT5hZGRTdHlsZXNoZWV0KCRzdGF0aWNQYXRoIC4gJy9jc3MvZGVmYXVsdHMuY3NzJyk7CisJCUFwcDo6R2V0KCktPnJlc3BvbnNlLT5hZGRKYXZhc2NyaXB0KCRzdGF0aWNQYXRoIC4gJy9qcy9qcXVlcnktMS43LjIubWluLmpzJyk7CisJCXNlbGY6OiRjb21tb25SZXNvdXJjZXNMb2FkZWQgPSB0cnVlOworCSAgfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaW5qZWN0RWRpdG9yUmVzb3VyY2VzKCkgeworCQkvLyBPbmx5IGluamVjdCByZXNvdXJjZXMgaWYgd2UgYXJlIGVkaXRpbmcgYW5kIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZC4uLgorCQkkc2VnbWVudHMgPSBBcHA6OkdldCgpLT5yZXF1ZXN0LT51cmk7CisJCSRzdGF0aWNQYXRoID0gdHJpbShBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9tb2R1bGVfc3RhdGljJ10pOworCQlpZiAoIHNlbGY6OmlzRWRpdGluZygpICYmIHN0cnN0cigkc2VnbWVudHMsJ2VkaXQnKSAhPSBmYWxzZSkgeworCQkJCisJCQlBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkSmF2YXNjcmlwdCgkc3RhdGljUGF0aCAuICcvanMvZ29sbHVtLmpzJyk7CisJCQlBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkSmF2YXNjcmlwdCgkc3RhdGljUGF0aCAuICcvanMvZ29sbHVtLmRpYWxvZy5qcycpOworCQkJQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmFkZEphdmFzY3JpcHQoJHN0YXRpY1BhdGggLiAnL2pzL2dvbGx1bS5wbGFjZWhvbGRlci5qcycpOworCQkJQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmFkZEphdmFzY3JpcHQoJHN0YXRpY1BhdGggLiAnL2pzL2VkaXRvci9nb2xsdW0uZWRpdG9yLmpzJyk7CisJCQkKKwkJCUFwcDo6R2V0KCktPnJlc3BvbnNlLT5hZGRTdHlsZXNoZWV0KCRzdGF0aWNQYXRoIC4gJy9jc3MvZ2l0aHViLmNzcycpOworCQkJQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmFkZFN0eWxlc2hlZXQoJHN0YXRpY1BhdGggLiAnL2Nzcy9lZGl0b3IuY3NzJyk7CisJCQlBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkU3R5bGVzaGVldCgkc3RhdGljUGF0aCAuICcvY3NzL2RpYWxvZy5jc3MnKTsKKwkJfQorCQlpZiAoIHNlbGY6OmlzRWRpdGluZygpICYmICFzZWxmOjokZWRpdG9yUmVzb3VyY2VzTG9hZGVkICkgeworCQkJCisJCQlBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkSmF2YXNjcmlwdCgkc3RhdGljUGF0aCAuICcvanMvcHVueS5qcycpOworCQkJQXBwOjpHZXQoKS0+cmVzcG9uc2UtPmFkZFN0eWxlc2hlZXQoJHN0YXRpY1BhdGggLiAnL2Nzcy9wdW55LmNzcycpOworCQkJc2VsZjo6JGVkaXRvclJlc291cmNlc0xvYWRlZCA9IHRydWU7CisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb250YWluZXIoICRodG1sRWxtdCA9ICdkaXYnICwgJGV4dHJhID0gYXJyYXkoKSkgeworCQkKKwkJc2VsZjo6aW5pdCgpOworCQkKKwkJLy8gQ3JlYXRlIGEgbmV3IFB1bnlfQ29udGFpbmVyIG9iamVjdCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGluZm8KKwkJcmV0dXJuIG5ldyBQdW55X0NvbnRhaW5lcigkaHRtbEVsbXQsICRleHRyYSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9QdW55X0NvbnRhaW5lci5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvUHVueV9Db250YWluZXIuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Yjc4NmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvUHVueV9Db250YWluZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcmVxdWlyZV9vbmNlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9QdW55LmNsYXNzLnBocCcpOworCisvKioKKyAqIFB1bnlfQ29udGFpbmVyCisgKiAKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW4gSFRNTCBjb250YWluZXIKKyAqIGFyb3VuZCBhIFB1bnlfUmVzb3VyY2UuIFB1bnlfQ29udGFpbmVyIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGRldmVsb3BlcnMKKyAqIHRvIG1hbnVhbGx5IGFubm90YXRlIEhUTUwgd2l0aCB0aGUgcHVueT0iLi4uIiBhdHRyaWJ1dGUgKHNvIHRoYXQgdGhlIAorICogUHVueSBqYXZhc2NyaXB0IGluLXBsYWNlIGVkaXRvciBmdW5jdGlvbnMgb24gdGhlIHJlc291cmNlKS4KKyAqIAorICogQGF1dGhvciBhaGFydAorICovCitjbGFzcyBQdW55X0NvbnRhaW5lciB7CisJCisJcHJvdGVjdGVkICRodG1sRWxlbWVudDsKKwlwcm90ZWN0ZWQgJGF0dHJpYnV0ZXM7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gc3RyaW5nICRlbG10ICBUaGUgaHRtbCBlbGVtZW50IHRvIHVzZSBhcyBhIGNvbnRhaW5lciAoZS5nLjogJ2RpdicsJ3NwYW4nKQorCSAqIEBwYXJhbSBhcnJheSAgJGF0dHJpYnV0ZXMgKG9wdGlvbmFsKSBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBhdHRyaWJ1dGVzIHRvIAorCSAqICAgICAgICAgICAgICAgICAgICAgYXR0YWNoIHRvIHRoZSBodG1sIGNvbnRhaW5lciBlbGVtZW50LiBlLmc6CisJICogICAgICAgICAgICAgICAgICAgICBhcnJheSgiaWQiID0+ICdmb28nLCAiY2xhc3MiID0+ICJiYXIgYmF6Iik7CisJICovCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZWxtdCA9ICdkaXYnLCAkYXR0cmlidXRlcyA9IGFycmF5KCkgKSB7CisJCQorCQkkdGhpcy0+aHRtbEVsZW1lbnQgPSAkZWxtdDsKKwkJJHRoaXMtPmF0dHJpYnV0ZXMgID0gJGF0dHJpYnV0ZXM7CisJfQorCQorCS8qKgorCSAqIExvYWQgYSByZXNvdXJjZSBpbnRvIHRoaXMgY29udGFpbmVyCisJICogCisJICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgdGhlIFB1bnk6OmxvYWQgZnVuY3Rpb24gYW5kIHJldHVybnMKKwkgKiB3cmFwcyB0aGUgcmVzdWx0IGluIHRoZSBjb250YWluZXIgaHRtbAorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmcgJHJlc291cmNlSWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZAorCSAqIEBwYXJhbSBpbnQgJHZlcnNpb24gKG9wdGlvbmFsKSBUaGUgdmVyc2lvbiB0byBsb2FkIChkZWZhdWx0ID0gbGF0ZXN0KQorCSAqIEByZXR1cm5zIHN0cmluZworCSAqLworCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCAkcmVzb3VyY2VJZCwgJHZlcnNpb24gPSBudWxsICkgeworCQlyZXR1cm4gJHRoaXMtPnJlbmRlciggUHVueTo6bG9hZCggJHJlc291cmNlSWQsICR2ZXJzaW9uLCBmYWxzZSApKTsKKwl9CisJCisJCisJLyoqCisJICogSGVscGVyIGZ1bmN0aW9uIGZvciByZW5kZXJpbmcgYSByZXNvdXJjZSBpbnNpZGUgdGhpcyBjb250YWluZXIKKwkgKiAKKwkgKiBAcGFyYW0gdW5rbm93bl90eXBlICRyZXNvdXJjZQorCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCisJICovCisJcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbmRlcigkcmVzb3VyY2UpIHsKKwkJCisJCSRodG1sID0gIjx7JHRoaXMtPmh0bWxFbGVtZW50fSI7CisJCQorCQlmb3JlYWNoICgkdGhpcy0+YXR0cmlidXRlcyBhcyAkayA9PiAkdikgeworCQkJJGh0bWwgLj0gIiB7JGt9PVwieyR2fVwiIjsKKwkJfQorCQkKKwkJJGh0bWwgLj0gIiBwdW55PVwieyRyZXNvdXJjZS0+Z2V0SWQoKX1cIj4iCisJCQkgIC4gICJ7JHJlc291cmNlLT5wYXJzZSgpLT5nZXRDb250ZW50KCl9IgorCQkJICAuICAiPC97JHRoaXMtPmh0bWxFbGVtZW50fT4iOworCQkKKwkJcmV0dXJuICRodG1sOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvUHVueV9SZXNvdXJjZS5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvUHVueV9SZXNvdXJjZS5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3YzU2OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9QdW55X1Jlc291cmNlLmNsYXNzLnBocApAQCAtMCwwICsxLDE2MyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFB1bnlfUmVzb3VyY2UKKyAqIAorICogUmVwcmVzZW50cyBhIHBpZWNlIG9mIGNvbnRlbnQgYmVpbmcgbWFuYWdlZCBieSBQdW55LiAKKyAqIAorICogVGhlIFB1bnlfUmVzb3VyY2UgY2xhc3MgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIHBpZWNlIG9mIGVkaXRhYmxlCisgKiBjb250ZW50IChhIHJlc291cmNlKS4gVGhlIGNsYXNzIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIAorICogZnVuY3Rpb25zIGZvciBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQuCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqLworY2xhc3MgUHVueV9SZXNvdXJjZSB7CisKKwlwcm90ZWN0ZWQgJGlkOwkJCQkJCS8vIFRoZSB1bmlxdWUgaWQgZm9yIHRoaXMgcmVzb3VyY2UKKwlwcm90ZWN0ZWQgJHZlcnNpb24gPSAwOwkJCQkvLyBUaGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgcmVzb3VyY2UKKwlwcm90ZWN0ZWQgJGNvbnRlbnQ7CQkJCQkvLyBUaGUgcmVzb3VyY2UgcmF3IGNvbnRlbnQKKwlwcm90ZWN0ZWQgJHBhcnNlciAgPSAnbWFya2Rvd24nOwkvLyBUaGUgcGFyc2VyIGxhYmVsIGZvciB0aGlzIHJlc291cmNlCisJcHJvdGVjdGVkICRwYXJzZWRDb250ZW50OwkJCS8vIFRoZSByZXNvdXJjZSBwYXJzZWQgY29udGVudAorCQorCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogT3B0aW9uYWxseSBwcm92aWRlIGFuIGFzc29jaWF0aXZlIGFycmF5IGNvbnRhaW5pbmcgCisJICogdGhlIGRhdGEgdG8gdXNlIHdoZW4gaW5pdGlhbGl6aW5nIHRoaXMgb2JqZWN0LiAKKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgJGRhdGEgKG9wdGlvbmFsKSBkYXRhIHRvIHVzZSB3aGVuIGluaXRpYWxpemluZyB0aGUgb2JqZWN0CisJICovCisJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRkYXRhID0gYXJyYXkoKSkgeworCQkkdGhpcy0+aWQgICAgICA9IGlzc2V0KCRkYXRhWydyZXNvdXJjZUlkJ10pID8gJGRhdGFbJ3Jlc291cmNlSWQnXSA6IGZhbHNlOworCQkkdGhpcy0+dmVyc2lvbiA9IGlzc2V0KCRkYXRhWyd2ZXJzaW9uJ10pICAgID8gJGRhdGFbJ3ZlcnNpb24nXSAgICA6IDA7CisJCSR0aGlzLT5jb250ZW50ID0gaXNzZXQoJGRhdGFbJ2NvbnRlbnQnXSkgICAgPyAkZGF0YVsnY29udGVudCddICAgIDogJyc7CisJCSR0aGlzLT5wYXJzZXIgID0gaXNzZXQoJGRhdGFbJ3BhcnNlciddKSAgICAgPyAkZGF0YVsncGFyc2VyJ10gICAgIDogJ21hcmtkb3duJzsKKwkJJHRoaXMtPnBhcnNlZENvbnRlbnQgPSBpc3NldCgkZGF0YVsncGFyc2VkQ29udGVudCddKSA/ICRkYXRhWydwYXJzZWRDb250ZW50J10gOiAnJzsKKwl9CisJCisJLyoqCisJICogR2V0IHRoZSB1bmlxdWUgaWQgZm9yIHRoaXMgcmVzb3VyY2UKKwkgKiBAcmV0dXJucyBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0SWQoKSB7CisJCXJldHVybiAkdGhpcy0+aWQ7CisJfQorCQorCS8qKgorCSAqIEluY3JlbWVudCB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgcmVzb3VyY2UKKwkgKiBAcmV0dXJucyBQdW55X1Jlc291cmNlCisJICovCisJcHVibGljIGZ1bmN0aW9uIGluY3JlbWVudFZlcnNpb24oKSB7CisJCSR0aGlzLT52ZXJzaW9uICs9IDE7CisJCXJldHVybiAkdGhpczsJLy8gYWxsb3cgbWV0aG9kIGNoYWluaW5nCisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgcmVzb3VyY2UKKwkgKiBAcmV0dXJucyBpbnQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuICR0aGlzLT52ZXJzaW9uOworCX0KKwkKKwkvKioKKwkgKiBHZXQgdGhlIHBhcnNlciBsYWJlbCBmb3IgdGhpcyByZXNvdXJjZS4gVGhlIHBhcnNlcgorCSAqIGxhYmVsIGlzIGEgdGV4dCBsYWJlbCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byAKKwkgKiBvbmUgb2YgdGhlIGVudHJpZXMgaW4gdGhlICdwYXJzZXJzJyBzZWN0aW9uIG9mIHRoZQorCSAqIFB1bnkgbW9kdWxlJ3MgY29uZmlnLmluaSBmaWxlLgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBnZXRQYXJzZXIoKSB7CisJCXJldHVybiAkdGhpcy0+cGFyc2VyOworCX0KKwkKKwkvKioKKwkgKiBTZXQgdGhlIHBhcnNlciBsYWJlbCBmb3IgdGhpcyByZXNvdXJjZS4gCisJICogCisJICogQHBhcmFtIHN0cmluZyAkbGFiZWwgVGhlIHBhcnNlciBsYWJlbCB0byB1c2UKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gc2V0UGFyc2VyKCAkbGFiZWwgKSB7CisJCSR0aGlzLT5wYXJzZXIgPSAkbGFiZWw7CisJCXJldHVybiAkdGhpczsJLy8gYWxsb3cgbWV0aG9kIGNoYWluaW5nCisJfQorCQorCS8qKgorCSAqIEdldCBlaXRoZXIgdGhlIHBhcnNlZCBvciByYXcgcmVzb3VyY2UgY29udGVudC4gCisJICogCisJICogQHBhcmFtIGJvb2xlYW4gJHJhdyAoZGVmYXVsdD1mYWxzZSkgcmV0dXJuIHJhdyBjb250ZW50PworCSAqIEByZXR1cm5zIHN0cmluZworCSAqLworCXB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50KCAkcmF3ID0gZmFsc2UgKSB7CisJCXJldHVybiAoJHJhdykgPyAkdGhpcy0+Y29udGVudCA6ICR0aGlzLT5wYXJzZWRDb250ZW50OworCX0KKwkKKwkvKioKKwkgKiBzZXQgdGhlIHJhdyBjb250ZW50IGZvciB0aGlzIHJlc291cmNlLgorCSAqIEBwYXJhbSBzdHJpbmcgJHZhbCBUaGUgcmF3IGNvbnRlbnQgZm9yIHRoaXMgcmVzb3VyY2UKKwkgKiBAcmV0dXJucyBQdW55X1Jlc291cmNlCisJICovCisJcHVibGljIGZ1bmN0aW9uIHNldENvbnRlbnQoICR2YWwgKSB7CisJCSR0aGlzLT5jb250ZW50ID0gJHZhbDsKKwkJcmV0dXJuICR0aGlzOwkvLyBhbGxvdyBtZXRob2QgY2hhaW5pbmcKKwl9CisJCisJLyoqCisJICogUGFyc2UgdGhlIHJhdyBjb250ZW50cyBvZiB0aGlzIHJlc291cnNlCisJICogCisJICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBwYXJzZXIgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKwkgKiByZXNvdXJjZSB0byBkZXRlcm1pbmUgdGhlIHBhcnNlciB0byB1c2UsIGluc3RhbnRpYXRlcyBhCisJICogcGFyc2VyIGluc3RhbmNlLCBhbmQgcGFyc2VzIHRoZSByYXcgY29udGVudC4gVGhlIHJlc3VsdAorCSAqIGlzIHN0b3JlZCBpbiAkdGhpcy0+cGFyc2VkQ29udGVudC4gCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKiBAcmV0dXJucyBQdW55X1Jlc291cmNlCisJICovCisJcHVibGljIGZ1bmN0aW9uIHBhcnNlKCkgeworCQkvLyBEZXRlcm1pbmUgdGhlIHBhcnNlciB0byB1c2UKKwkJJHBhcnNlckxhYmVsID0gJHRoaXMtPmdldFBhcnNlcigpOworCQkJCisJCS8vIEVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgcGFyc2VyIGhhcyBiZWVuIHJlcXVpcmVkCisJCSRwYXJzZXJzID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfcGFyc2VyJ107CisJCWlmICggIWluX2FycmF5KCAkcGFyc2VyTGFiZWwsIGFycmF5X2tleXMoICRwYXJzZXJzICkgKSApIHsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yIGluc3RhbnRpYXRpbmcgcGFyc2VyOiAiCisJCQkuICJsYWJlbCAneyRwYXJzZXJMYWJlbH0nIG5vdCBjb25maWd1cmVkLiAiKTsKKwkJfSBlbHNlIHsKKwkJCXJlcXVpcmVfb25jZSggJHBhcnNlcnNbJHBhcnNlckxhYmVsXSApOworCQl9CisJCQorCQkvLyBMb2FkIHRoZSBwYXJzZXIKKwkJJHBhcnNlckNsYXNzTmFtZSA9ICdQdW55XycgLiB1Y2ZpcnN0KCRwYXJzZXJMYWJlbCkgLiAnUGFyc2VyJzsKKwkJJHBhcnNlciA9IG5ldyAkcGFyc2VyQ2xhc3NOYW1lKCk7CisJCQorCQkvLyBFeHBhbmQgQmFsYW5jZSBjb25zdGFudHM6CisJCS8vIChbU0lURV9ST09UXSwgW01PRFVMRV9ST09UXSwgW01PRFVMRV9QQVRIXSwgW01PRFVMRV9TVEFUSUNdKQorCQkkY29udGVudCA9IHN0cl9yZXBsYWNlKCdbU0lURV9ST09UXScsU0lURV9ST09ULCBzdHJpcHNsYXNoZXMoJHRoaXMtPmNvbnRlbnQpKTsKKwkJJG1vZHVsZUluZm8gPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisJCWlmICgkbW9kdWxlSW5mbykgeworCQkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgnW01PRFVMRV9ST09UXScsJG1vZHVsZUluZm8tPm1vZHVsZVJvb3QsICRjb250ZW50KTsKKwkJCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoJ1tNT0RVTEVfUEFUSF0nLCRtb2R1bGVJbmZvLT5tb2R1bGVQYXRoLCAkY29udGVudCk7CisJCQkkY29udGVudCA9IHN0cl9yZXBsYWNlKCdbTU9EVUxFX1NUQVRJQ10nLCRtb2R1bGVJbmZvLT5tb2R1bGVTdGF0aWMsICRjb250ZW50KTsKKwkJfQorCQorCQkvLyBTdG9yZSB0aGUgcGFyc2VkIGNvbnRlbnRzCisJCSR0aGlzLT5wYXJzZWRDb250ZW50ID0gJHBhcnNlci0+cGFyc2UoICRjb250ZW50ICk7CisJCQorCQkvLyBBbGxvdyBtZXRob2QgY2hhaW5pbmcKKwkJcmV0dXJuICR0aGlzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvZGF0YS9QdW55X0RhdGFTdG9yZS5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvZGF0YS9QdW55X0RhdGFTdG9yZS5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1MGRjNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9kYXRhL1B1bnlfRGF0YVN0b3JlLmNsYXNzLnBocApAQCAtMCwwICsxLDY5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUHVueV9EYXRhU3RvcmUKKyAqIAorICogQmFzZSBjbGFzcyBmb3IgUHVueSBkYXRhIHN0b3JlIGltcGxlbWVudGF0aW9ucworICogCisgKiBAYWJzdHJhY3QgCisgKiAKKyAqIEBhdXRob3IgYWhhcnQKKyAqLworYWJzdHJhY3QgY2xhc3MgUHVueV9EYXRhU3RvcmUgeworCQorCXByb3RlY3RlZCAkaG9zdDsKKwlwcm90ZWN0ZWQgJHVzZXJuYW1lOworCXByb3RlY3RlZCAkcGFzc3dvcmQ7CisJcHJvdGVjdGVkICRkYm5hbWU7CisJCisJcHJvdGVjdGVkICRsaW5rOworCQorCS8qKgorCSAqIENvbm5lY3QgdG8gdGhlIGRhdGEgc3RvcmUKKwkgKiAKKwkgKi8JCisJcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIGNvbm5lY3QoKTsKKwkKKwkvKioKKwkgKiBEaXNjb25uZWN0IGZyb20gdGhlIGRhdGEgc3RvcmUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gZGlzY29ubmVjdCgpOworCQorCS8qKgorCSAqIFJlcXVlc3QgYSByZXNvdXJjZSBmcm9tIHRoZSBkYXRhIHN0b3JlLiBPcHRpb25hbGx5CisJICogc3BlY2lmeSBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgdG8gZmV0Y2guCisJICogCisJICogQHBhcmFtIHN0cmluZyAkcmVzb3VyY2VJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByZXNvdXJjZQorCSAqIEBwYXJhbSBpbnRlZ2VyICR2ZXJzaW9uICAgKE9wdGlvbmFsKSB0aGUgdmVyc2lvbiB0byByZXRyaWV2ZS4gRGVmYXVsdCA9IGxhdGVzdC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gbG9hZCggJHJlc291cmNlSWQsICR2ZXJzaW9uID0gbnVsbCApOworCQorCS8qKgorCSAqIFN0b3JlIGEgbmV3IHZlcnNpb24gb2YgYSByZXNvdXJjZS4gRm9yIHNpbXBsaWNpdHksIHZlcnNpb25zIGFyZSAKKwkgKiBpbW11dGFibGUuIFRoYXQgaXMsIGV2ZXJ5IHRpbWUgYSByZXNvdXJjZSBpcyBzdG9yZWQsIGl0cyB2ZXJzaW9uIGlzCisJICogZmlyc3QgaW5jcmVtZW50ZWQgYW5kIGEgbmV3IHJlY29yZCBpcyBjcmVhdGVkLiBJbXBsZW1lbmF0aW9ucyBzaG91bGQKKwkgKiB0YWtlIGNhcmUgdG8gYXV0b21hdGljYWxseSBpbmNyZW1lbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorCSAqIHJlc291cmNlIGJlZm9yZSBwZXJzaXN0aW5nIHRvIHRoZSBkYXRhc3RvcmUuCisJICogCisJICogQHBhcmFtIHN0cmluZyAkcmVzb3VyY2VJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByZXNvdXJjZQorCSAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gc3RvcmUgCisJICovCisJcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHN0b3JlKCBQdW55X1Jlc291cmNlICRyZXNvdXJjZSApOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL2RhdGEvUHVueV9Mb2NhbEZpbGVEYXRhU3RvcmUuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL2RhdGEvUHVueV9Mb2NhbEZpbGVEYXRhU3RvcmUuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTIwNzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvZGF0YS9QdW55X0xvY2FsRmlsZURhdGFTdG9yZS5jbGFzcy5waHAKQEAgLTAsMCArMSw3OSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBSZXF1aXJlIHRoZSBhYnN0cmFjdCBwYXJlbnQgY2xhc3MgZGVmaW5pdGlvbgorcmVxdWlyZV9vbmNlKCBkaXJuYW1lKF9fRklMRV9fKSAuICcvUHVueV9EYXRhU3RvcmUuY2xhc3MucGhwJyk7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFB1bnlfRGF0YVN0b3JlIGNsYXNzIHRoYXQgcGVyc2lzdHMKKyAqIGNvbnRlbnQgdG8gYXNjaWkgdGV4dCBmaWxlcy4KKyAqCisgKiBAYXV0aG9yIGFoYXJ0CisgKi8KK2NsYXNzIFB1bnlfTG9jYWxGaWxlRGF0YVN0b3JlIGV4dGVuZHMgUHVueV9EYXRhU3RvcmUgeworCisgIHByb3RlY3RlZCAkZGF0YURpcmVjdG9yeTsKKworICBwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgpIHsKKyAgICAkdGhpcy0+ZGF0YURpcmVjdG9yeSA9IEFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X2RhdGFzdG9yZV9sb2NhbGZpbGVfZGlyJ107CisKKyAgICAvLyBFbnN1cmUgd2UgY2FuIHdyaXRlIHRvIHRoZSBkaXJlY3RvcnkKKyAgICBpZiAoIWlzX3dyaXRlYWJsZSgkdGhpcy0+ZGF0YURpcmVjdG9yeSkpIHsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlB1bnkgY2FuIG5vdCB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGRhdGEgZGlyZWN0b3J5Iik7CisgICAgfQorICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7CisgICAgLy9ub29wCisgIH0KKworICBwdWJsaWMgZnVuY3Rpb24gbG9hZCggJHJlc291cmNlSWQsICR2ZXJzaW9uID0gbnVsbCApIHsKKworICAgIC8vIFRoZSBMb2NhbEZpbGUgZGF0YSBzdG9yZSBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydAorICAgIC8vIHRoZSBjb25jZXB0IG9mICd2ZXJzaW9ucycuIEl0IGNvdWxkLCBidXQgaXMgdGhlIAorICAgIC8vIGFkZGVkIGNvbXBsZXhpdHkgcmVhbGx5IHdvcnRoIGl0PyBUaGlzIGlzIHJlYWxseSAKKyAgICAvLyBpbnRlbmRlZCBhcyBhIGRldmVsb3BtZW50IHRvb2wsIHdpdGggdGhlIGFzc3VtcHRpb24KKyAgICAvLyB0aGF0IG9uZSBvZiB0aGUgbW9yZSBmdWxsLWZlYXR1cmVkIGRhdGEgc3RvcmUKKyAgICAvLyBpbXBsZW1lbnRhdGlvbnMgKGUuZy46IFBETywgTW9uZ28pIHdpbGwgdWx0aW1hdGVseQorICAgIC8vIGJlIHVzZWQuIAorCisgICAgLy8gQnVpbGQgdGhlIGZ1bGwgcGF0aCBmcm9tIHRoZSByZXNvdXJjZUlkCisgICAgJHBhdGggPSAkdGhpcy0+ZGF0YURpcmVjdG9yeSAuICcvJyAuICRyZXNvdXJjZUlkIC4gIi50eHQiOworCisgICAgaWYgKGZpbGVfZXhpc3RzKCAkcGF0aCApICkgeworICAgICAgJGNvbnRlbnQgID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOworICAgICAgJHJlc291cmNlID0gYXJyYXkoCisJCQkicmVzb3VyY2VJZCIgPT4gJHJlc291cmNlSWQKKwkJCSwgImNvbnRlbnQiICA9PiAkY29udGVudAorCQkJKTsKKyAgICAgIHJldHVybiBuZXcgUHVueV9SZXNvdXJjZSgkcmVzb3VyY2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIHN0b3JlICggUHVueV9SZXNvdXJjZSAkcmVzb3VyY2UgKSB7CisKKyAgICAvLyBCdWlsZCB0aGUgZnVsbCBwYXRoIGZyb20gdGhlIHJlc291cmNlSWQKKyAgICAkcGF0aCA9ICR0aGlzLT5kYXRhRGlyZWN0b3J5IC4gJy8nIC4gJHJlc291cmNlLT5nZXRJZCgpIC4gIi50eHQiOworCisgICAgLy8gU3RvcmUgdGhlIGxhdGVzdCBjb250ZW50CisgICAgZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICRyZXNvdXJjZS0+Z2V0Q29udGVudCh0cnVlKSk7IC8vIHJhdywgdW5wYXJzZWQgY29udGVudAorCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvZGF0YS9QdW55X01vbmdvRGF0YVN0b3JlLmNsYXNzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9kYXRhL1B1bnlfTW9uZ29EYXRhU3RvcmUuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDgyYWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvZGF0YS9QdW55X01vbmdvRGF0YVN0b3JlLmNsYXNzLnBocApAQCAtMCwwICsxLDc1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFJlcXVpcmUgdGhlIGFic3RyYWN0IHBhcmVudCBjbGFzcyBkZWZpbml0aW9uCityZXF1aXJlX29uY2UoIGRpcm5hbWUoX19GSUxFX18pIC4gJy9QdW55X0RhdGFTdG9yZS5jbGFzcy5waHAnKTsKKworLyoqCisgKiBBIE1vbmdvREIgaW1wbGVtZW50YXRpb24gb2YgdGhlIFB1bnlfRGF0YVN0b3JlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgYWhhcnQKKyAqLworY2xhc3MgUHVueV9Nb25nb0RhdGFTdG9yZSBleHRlbmRzIFB1bnlfRGF0YVN0b3JlIHsKKworICBwcm90ZWN0ZWQgJGNvbGxlY3Rpb247CisKKyAgcHVibGljIGZ1bmN0aW9uIGNvbm5lY3QoKSB7CisgICAgJGRibmFtZSA9IEFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X2RhdGFzdG9yZV9tb25nb19kYiddOworICAgICRjb2xsICAgPSBBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9kYXRhc3RvcmVfbW9uZ29fY29sbGVjdGlvbiddOworICAgICR0aGlzLT5saW5rID0gbmV3IE1vbmdvKCk7CisgICAgJHRoaXMtPmRibmFtZSA9ICR0aGlzLT5saW5rLT5zZWxlY3REQigkZGJuYW1lKTsKKyAgICAkdGhpcy0+Y29sbGVjdGlvbiA9ICR0aGlzLT5kYm5hbWUtPiRjb2xsOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKCR0aGlzLT5saW5rKSB7CisgICAgICAkdGhpcy0+bGluay0+Y2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgZnVuY3Rpb24gbG9hZCggJHJlc291cmNlSWQsICR2ZXJzaW9uID0gbnVsbCApIHsKKyAgICAvLyBCdWlsZCBjcml0ZXJpYSBmb3IgbG9hZGluZy4uLgorICAgICRjcml0ZXJpYSA9IGFycmF5KCJyZXNvdXJjZUlkIiA9PiAkcmVzb3VyY2VJZCk7CisgICAgCisgICAgLy8gSWYgYSB2ZXJzaW9uIGlzIHNwZWNpZmllZC4uLgorICAgIGlmICgkdmVyc2lvbiAhPT0gbnVsbCkgeyAKKyAgICAgICRjcml0ZXJpYVsndmVyc2lvbiddID0gJHZlcnNpb247CisgICAgICAkZG9jID0gJHRoaXMtPmNvbGxlY3Rpb24tPmZpbmRPbmUoICRjcml0ZXJpYSApOworICAgIH0gCisKKyAgICAvLyBPdGhlcndpc2UuLi4KKyAgICBlbHNlIHsKKyAgICAgICRjdXJzb3IgPSAkdGhpcy0+Y29sbGVjdGlvbi0+ZmluZChhcnJheSgicmVzb3VyY2VJZCIgPT4gJHJlc291cmNlSWQpKTsKKyAgICAgICRjdXJzb3ItPnNvcnQoYXJyYXkoJ3ZlcnNpb24nID0+IC0xKSk7CisgICAgICAkZG9jID0gJGN1cnNvci0+Z2V0TmV4dCgpOworICAgIH0KKworICAgIC8vIFJldHVybiB3aGF0ZXZlciB3YXMgZm91bmQuLi4KKyAgICByZXR1cm4gKCRkb2MpID8gbmV3IFB1bnlfUmVzb3VyY2UoICRkb2MgKSA6IGZhbHNlOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIHN0b3JlICggUHVueV9SZXNvdXJjZSAkcmVzb3VyY2UgKSB7CisgICAgJGRvYyA9IGFycmF5KAorCQkgInJlc291cmNlSWQiID0+ICRyZXNvdXJjZS0+Z2V0SWQoKQorCQkgLCAidmVyc2lvbiIgID0+IHRpbWUoKQorCQkgLCAicGFyc2VyIiAgID0+ICRyZXNvdXJjZS0+Z2V0UGFyc2VyKCkKKwkJICwgImNvbnRlbnQiICA9PiAkcmVzb3VyY2UtPmdldENvbnRlbnQoIHRydWUgKSk7IC8vIHJhdywgdW5wYXJzZWQgY29udGVudAorCisgICAgJHRoaXMtPmNvbGxlY3Rpb24tPmluc2VydCggJGRvYyApOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL2RhdGEvUHVueV9QZG9EYXRhU3RvcmUuY2xhc3MucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL2RhdGEvUHVueV9QZG9EYXRhU3RvcmUuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzBmMzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvZGF0YS9QdW55X1Bkb0RhdGFTdG9yZS5jbGFzcy5waHAKQEAgLTAsMCArMSwxMTEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gUmVxdWlyZSB0aGUgYWJzdHJhY3QgcGFyZW50IGNsYXNzIGRlZmluaXRpb24KK3JlcXVpcmVfb25jZSggZGlybmFtZShfX0ZJTEVfXykgLiAnL1B1bnlfRGF0YVN0b3JlLmNsYXNzLnBocCcpOworCisKKy8qKgorICogQSBQRE8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFB1bnlfRGF0YVN0b3JlIGNsYXNzLgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKi8KK2NsYXNzIFB1bnlfUGRvRGF0YVN0b3JlIGV4dGVuZHMgUHVueV9EYXRhU3RvcmUgeworCQorCXByb3RlY3RlZCAkZHJpdmVyICAgICAgPSAnbXlzcWwnOworCXByb3RlY3RlZCAkdGFibGVQcmVmaXggPSAncHVueV8nOworCQorCS8qKgorCSAqIChub24tUEhQZG9jKQorCSAqIEBzZWUgUHVueV9EYXRhU3RvcmU6OmNvbm5lY3QoKQorCSAqIEB0aHJvd3MgUERPRXhjZXB0aW9uCisJICovCisJcHVibGljIGZ1bmN0aW9uIGNvbm5lY3QoKSB7CisJCSR0aGlzLT5ob3N0ID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfZGF0YXN0b3JlX3Bkb19ob3N0J107CisJCSR0aGlzLT51c2VybmFtZSA9IEFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X2RhdGFzdG9yZV9wZG9fdXNlcm5hbWUnXTsKKwkJJHRoaXMtPnBhc3N3b3JkID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfZGF0YXN0b3JlX3Bkb19wYXNzd29yZCddOworCQkkdGhpcy0+ZGJuYW1lICAgPSBBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9kYXRhc3RvcmVfcGRvX2RibmFtZSddOworCQkkdGhpcy0+ZHJpdmVyICAgPSBBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9kYXRhc3RvcmVfcGRvX2RyaXZlciddOworCQkkdGhpcy0+dGFibGVQcmVmaXggPSBBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9kYXRhc3RvcmVfcGRvX3RhYmxlUHJlZml4J107CisJCQorCQkkZHNuID0gJHRoaXMtPmRyaXZlciAuICc6aG9zdD0nIC4gJHRoaXMtPmhvc3QgLiAnO2RibmFtZT0nIC4gJHRoaXMtPmRibmFtZTsKKwkJJHRoaXMtPmxpbmsgPSBuZXcgUERPKCAkZHNuLCAkdGhpcy0+dXNlcm5hbWUsICR0aGlzLT5wYXNzd29yZCApOworCX0KKwkKKwkvKioKKwkgKiAobm9uLVBIUGRvYykKKwkgKiBAc2VlIFB1bnlfRGF0YVN0b3JlOjpkaXNjb25uZWN0KCkKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZGlzY29ubmVjdCgpIHsKKwkJaWYgKCR0aGlzLT5saW5rKQorCQkJJHRoaXMtPmxpbmsgPSBudWxsOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gbG9hZCggJHJlc291cmNlSWQsICR2ZXJzaW9uID0gbnVsbCkgeworCQkKKwkJLy8gUmVxdWVzdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLi4uCisJCSRzcWwgID0gIlNFTEVDVCAqIEZST00gYHskdGhpcy0+dGFibGVQcmVmaXh9cmVzb3VyY2VgIFdIRVJFIGByZXNvdXJjZUlkYD06cmVzb3VyY2VJZCAiOworCQkkZGF0YSA9IGFycmF5KCdyZXNvdXJjZUlkJyA9PiAkcmVzb3VyY2VJZCk7IAorCQkKKwkJLy8gSWYgYSB2ZXJzaW9uIGlzIHNwZWNpZmllZCwgZXhwbGljaXRseSByZXF1ZXN0IHRoYXQgdmVyc2lvbi4uLgorCQlpZiAoJHZlcnNpb24gIT0gbnVsbCkgeworCQkJJHNxbCAuPSAiIEFORCBgdmVyc2lvbmA9OnZlcnNpb24gIjsKKwkJCSRkYXRhWyd2ZXJzaW9uJ10gPSAkdmVyc2lvbjsKKwkJfSAKKwkJCisJCS8vIE90aGVyd2lzZSwgc2ltcGx5IGdldCB0aGUgbGF0ZXN0IHZlcnNpb24uLi4KKwkJZWxzZSB7CisJCQkkc3FsIC49ICIgT1JERVIgQlkgYHZlcnNpb25gIERFU0MgIjsKKwkJfQorCQkKKwkJLy8gTGltaXQgb3VyIHJlc3VsdHMgdG8gYXQgbW9zdCBvbmUgcmVzdWx0Li4uCisJCSRzcWwgLj0gIiBMSU1JVCAxICI7CisJCQorCQkvLyBQcmVwYXJlIGFuZCBleGVjdXRlIHRoZSBxdWVyeSB1c2luZyB0aGUgcHJvdmlkZWQgZGF0YS4uLgorCQkkc3RtdCA9ICR0aGlzLT5saW5rLT5wcmVwYXJlKCAkc3FsICk7CisJCSRzdG10LT5leGVjdXRlKCAkZGF0YSApOworCisJCS8vIFJldHVybiB0aGUgc2luZ2xlIHJlc3VsdCwgb3IgcmV0dXJuIGZhbHNlIGlmIG5vIG1hdGNoLi4uCisJCWlmIChmYWxzZSAhPSAoJHJlc291cmNlID0gJHN0bXQtPmZldGNoKCkpKSB7CisJCQlyZXR1cm4gbmV3IFB1bnlfUmVzb3VyY2UoJHJlc291cmNlKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gc3RvcmUoIFB1bnlfUmVzb3VyY2UgJHJlc291cmNlICkgeworCQkKKwkJLy8gSW5jcmVtZW50IHRoZSByZXNvdXJjZSB2ZXJzaW9uIGlkLi4uIChzZWUgbm90ZSBpbiBQdW55X0RhdGFTdG9yZS5jbGFzcy5waHApCisJCSRyZXNvdXJjZS0+aW5jcmVtZW50VmVyc2lvbigpOworCQkKKwkJLy8gQ3JlYXRlIHNxbCBmb3Igc3RvcmluZyB0aGlzIG5ldyByZXNvdXJjZSB2ZXJzaW9uLi4uCisJCSRzcWwgPSAiSU5TRVJUIElOVE8gYHskdGhpcy0+dGFibGVQcmVmaXh9cmVzb3VyY2VgIChgcmVzb3VyY2VJZGAsYHZlcnNpb25gLGBwYXJzZXJgLGBjb250ZW50YCkgIgorCQkJLiAgIlZBTFVFUyAoOnJlc291cmNlSWQsIDp2ZXJzaW9uLCA6cGFyc2VyLCA6Y29udGVudCkgIjsKKwkJCisJCS8vIFByZXBhcmUgYW5kIGV4ZWN1dGUgdGhlIHN0YXRlbWVudCB1c2luZyB0aGUgcHJvdmlkZWQgZGF0YQorCQkkc3RtdCA9ICR0aGlzLT5saW5rLT5wcmVwYXJlKCRzcWwpOworCQkkc3RtdC0+ZXhlY3V0ZSAoIGFycmF5ICgKKwkJCSdyZXNvdXJjZUlkJyA9PiAkcmVzb3VyY2UtPmdldElkKCkKKwkJCSwgJ3ZlcnNpb24nICA9PiAkcmVzb3VyY2UtPmdldFZlcnNpb24oKQorCQkJLCAncGFyc2VyJyAgID0+ICRyZXNvdXJjZS0+Z2V0UGFyc2VyKCkKKwkJCSwgJ2NvbnRlbnQnICA9PiAkcmVzb3VyY2UtPmdldENvbnRlbnQodHJ1ZSkgLy8gcmF3LCB1bnBhcnNlZCBjb250ZW50CisJCSkpOworCQkKKwl9CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL3BhcnNlcnMvUHVueV9NYXJrZG93blBhcnNlci5jbGFzcy5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NsYXNzZXMvcGFyc2Vycy9QdW55X01hcmtkb3duUGFyc2VyLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc3ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL3BhcnNlcnMvUHVueV9NYXJrZG93blBhcnNlci5jbGFzcy5waHAKQEAgLTAsMCArMSwzNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBSZXF1aXJlIHRoZSBtYXJrZG93biBwaHAgbGlicmFyeSAoaHR0cHM6Ly9naXRodWIuY29tL21pY2hlbGYvcGhwLW1hcmtkb3duLykKK3JlcXVpcmVfb25jZSggQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfbW9kdWxlX3BhdGgnXSAuICcvbGlicy9tYXJrZG93bi5waHAnKTsKKworLyoqCisgKiBNYXJrZG93biBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHVueV9QYXJzZXIgY2xhc3MKKyAqIAorICogQGF1dGhvciBhaGFydAorICovCisKK2NsYXNzICBQdW55X01hcmtkb3duUGFyc2VyIHsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gcGFyc2UgKCAkY29udGVudCApIHsKKwkJCisJCXJldHVybiBNYXJrZG93biggJGNvbnRlbnQgKTsKKwkJCisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9wYXJzZXJzL1B1bnlfUGFyc2VyLmNsYXNzLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY2xhc3Nlcy9wYXJzZXJzL1B1bnlfUGFyc2VyLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzAxZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9jbGFzc2VzL3BhcnNlcnMvUHVueV9QYXJzZXIuY2xhc3MucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQdW55X1BhcnNlcgorICogCisgKiBCYXNlIGNsYXNzIGZvciBQdW55IHBhcnNlciBpbXBsZW1lbnRhdGlvbnMuIAorICogCisgKiBAYWJzdHJhY3QKKyAqIAorICogQGF1dGhvciBhaGFydAorICovCithYnN0cmFjdCBjbGFzcyBQdW55X1BhcnNlciB7CisJCisJLyoqCisJICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgCisJICogZmluYWwgKGRpc3BsYXktcmVhZHkpIHZlcnNpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnRlbnQuCisJICogCisJICogQHBhcmFtIHN0cmluZyAkY29udGVudCBUaGUgY29udGVudCB0byBwYXJzZQorCSAqIEByZXR1cm5zIHN0cmluZworCSAqIEBhYnN0cmFjdAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBwYXJzZSggJGNvbnRlbnQgKTsKKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NvbmZpZy5pbmkgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2NvbmZpZy5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzYjMzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvY29uZmlnLmluaQpAQCAtMCwwICsxLDc1IEBACisgIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICMKKyAjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAjCisgIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBQdW55IC0gTGlnaHR3ZWlnaHQgY29udGVudCBlZGl0b3IgZm9yIEJhbGFuY2UgYXBwbGljYXRpb25zCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworCitbQURNSU5JU1RSQVRJT04gQ09ORklHVVJBVElPTl0KKyMKKyMgRWRpdG9yIGxvZ2luIGNyZWRlbnRpYWxzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGVkaXRvciBpcyB0aGUgdXNlciBhdXRob3JpemVkIHRvIG1ha2UgY29udGVudCBjaGFuZ2VzIHRvIHRoZSBzaXRlCisjCitwdW55X2VkaXRvcl91c2VybmFtZSA9ICcnCitwdW55X2VkaXRvcl9wYXNzd29yZCA9ICcnCisKKworW0RBVEFTVE9SRSBDT05GSUdVUkFUSU9OXQorIworIyBXaGljaCBjbGFzcyB3aWxsIHByb3ZpZGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBzdG9yZT8KK3B1bnlfZGF0YXN0b3JlX2NsYXNzbmFtZSA9IFB1bnlfTG9jYWxGaWxlRGF0YVN0b3JlOworCisjIFdoZXJlIGlzIHRoaXMgY2xhc3MgaW4gdGhlIGZpbGVzeXN0ZW0/CitwdW55X2RhdGFzdG9yZV9jbGFzc3BhdGggPSBbTU9EVUxFX1BBVEhdL2NsYXNzZXMvZGF0YS9QdW55X0xvY2FsRmlsZURhdGFTdG9yZS5jbGFzcy5waHA7IAorCisjIENvbm5lY3Rpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byB0aGUgUHVueV9Mb2NhbEZpbGVEYXRhU3RvcmUgY29ubmVjdG9yCitwdW55X2RhdGFzdG9yZV9sb2NhbGZpbGVfZGlyICAgPSAnW01PRFVMRV9QQVRIXS9kYXRhL3Jlc291cmNlcyc7CisKKyMgQ29ubmVjdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZSBQdW55X1Bkb0RhdGFTdG9yZSBjb25uZWN0b3IKK3B1bnlfZGF0YXN0b3JlX3Bkb19ob3N0ID0gJ2xvY2FsaG9zdCc7CitwdW55X2RhdGFzdG9yZV9wZG9fdXNlcm5hbWUgICAgPSAnJzsKK3B1bnlfZGF0YXN0b3JlX3Bkb19wYXNzd29yZCAgICA9ICcnOworcHVueV9kYXRhc3RvcmVfcGRvX2RibmFtZSAgICAgID0gJyc7CitwdW55X2RhdGFzdG9yZV9wZG9fZHJpdmVyICAgICAgPSAnbXlzcWwnOworcHVueV9kYXRhc3RvcmVfcGRvX3RhYmxlUHJlZml4ID0gJ3B1bnlfJzsKKworIyBDb25uZWN0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gdGhlIFB1bnlfTW9uZ29EYXRhU3RvcmUgY29ubmVjdG9yCitwdW55X2RhdGFzdG9yZV9tb25nb19kYiAgICAgICAgID0gJyc7CitwdW55X2RhdGFzdG9yZV9tb25nb19jb2xsZWN0aW9uID0gJyc7CisKK1tQQVJTRVIgQ09ORklHVVJBVElPTl0KKyMKKyMgUHVueSBzdXBwb3J0cyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIHBhcnNlcnMuIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQKKyMgdGhlcmUgYmUgYSBkcml2ZXIgdGhhdCBjb25mb3JtcyB0byAuL2NsYXNzZXMvcGFyc2Vycy9QdW55X1BhcnNlci5jbGFzcy5waHAuCisjIAorIyBUaGlzIGFycmF5IHByb3ZpZGVzIGEgbWFwcGluZyBiZXR3ZWVuIHBhcnNlciBsYWJlbHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisjIHBhcnNlciBjbGFzcyB0aGF0IHdpbGwgZG8gdGhlIHdvcmsuCisjCitwdW55X3BhcnNlclsgJ21hcmtkb3duJyBdID0gW01PRFVMRV9QQVRIXS9jbGFzc2VzL3BhcnNlcnMvUHVueV9NYXJrZG93blBhcnNlci5jbGFzcy5waHAKKworCisKK1tJTlRFUk5BTCBST1VUSU5HXQorIworIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGhlcmUgdG8gcHJvdmlkZSBsb2NhdGlvbiBpbmRlcGVuZGVuY2UgKHNvIHRoYXQgeW91IGNhbiAKKyMgaW5zdGFsbCBQdW55IGluIC4vbW9kdWxlcy9wdW55IG9yIC4vbW9kdWxlcy9zb21ldGhpbmdlbHNlIHdpdGhvdXQgaGF2aW5nIAorIyB0byBjaGFuZ2UgYW55IGNvZGUuIFlvdSBzaG91bGQgbmV2ZXIgaGF2ZSB0byBlZGl0IHRoZXNlLgorIworcHVueV9tb2R1bGVfcGF0aCAgID0gW01PRFVMRV9QQVRIXQorcHVueV9tb2R1bGVfcm9vdCAgID0gW01PRFVMRV9ST09UXQorcHVueV9tb2R1bGVfc3RhdGljID0gW01PRFVMRV9TVEFUSUNdIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvaG9va3MucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9ob29rcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyM2YzMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvaG9va3MucGhwCkBAIC0wLDAgKzEsMTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L2xpYnMvbWFya2Rvd24ucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9saWJzL21hcmtkb3duLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUwY2FhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9saWJzL21hcmtkb3duLnBocApAQCAtMCwwICsxLDI5NDkgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIworIyBNYXJrZG93biBFeHRyYSAgLSAgQSB0ZXh0LXRvLUhUTUwgY29udmVyc2lvbiB0b29sIGZvciB3ZWIgd3JpdGVycworIworIyBQSFAgTWFya2Rvd24gJiBFeHRyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMiBNaWNoZWwgRm9ydGluICAKKyMgPGh0dHA6Ly9taWNoZWxmLmNvbS9wcm9qZWN0cy9waHAtbWFya2Rvd24vPgorIworIyBPcmlnaW5hbCBNYXJrZG93bgorIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBKb2huIEdydWJlciAgCisjIDxodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLz4KKyMKKworCitkZWZpbmUoICdNQVJLRE9XTl9WRVJTSU9OJywgICIxLjAuMW8iICk7ICMgU3VuIDggSmFuIDIwMTIKK2RlZmluZSggJ01BUktET1dORVhUUkFfVkVSU0lPTicsICAiMS4yLjUiICk7ICMgU3VuIDggSmFuIDIwMTIKKworCisjCisjIEdsb2JhbCBkZWZhdWx0IHNldHRpbmdzOgorIworCisjIENoYW5nZSB0byAiPiIgZm9yIEhUTUwgb3V0cHV0CitAZGVmaW5lKCAnTUFSS0RPV05fRU1QVFlfRUxFTUVOVF9TVUZGSVgnLCAgIiAvPiIpOworCisjIERlZmluZSB0aGUgd2lkdGggb2YgYSB0YWIgZm9yIGNvZGUgYmxvY2tzLgorQGRlZmluZSggJ01BUktET1dOX1RBQl9XSURUSCcsICAgICA0ICk7CisKKyMgT3B0aW9uYWwgdGl0bGUgYXR0cmlidXRlIGZvciBmb290bm90ZSBsaW5rcyBhbmQgYmFja2xpbmtzLgorQGRlZmluZSggJ01BUktET1dOX0ZOX0xJTktfVElUTEUnLCAgICAgICAgICIiICk7CitAZGVmaW5lKCAnTUFSS0RPV05fRk5fQkFDS0xJTktfVElUTEUnLCAgICAgIiIgKTsKKworIyBPcHRpb25hbCBjbGFzcyBhdHRyaWJ1dGUgZm9yIGZvb3Rub3RlIGxpbmtzIGFuZCBiYWNrbGlua3MuCitAZGVmaW5lKCAnTUFSS0RPV05fRk5fTElOS19DTEFTUycsICAgICAgICAgIiIgKTsKK0BkZWZpbmUoICdNQVJLRE9XTl9GTl9CQUNLTElOS19DTEFTUycsICAgICAiIiApOworCisKKyMKKyMgV29yZFByZXNzIHNldHRpbmdzOgorIworCisjIENoYW5nZSB0byBmYWxzZSB0byByZW1vdmUgTWFya2Rvd24gZnJvbSBwb3N0cyBhbmQvb3IgY29tbWVudHMuCitAZGVmaW5lKCAnTUFSS0RPV05fV1BfUE9TVFMnLCAgICAgIHRydWUgKTsKK0BkZWZpbmUoICdNQVJLRE9XTl9XUF9DT01NRU5UUycsICAgdHJ1ZSApOworCisKKworIyMjIFN0YW5kYXJkIEZ1bmN0aW9uIEludGVyZmFjZSAjIyMKKworQGRlZmluZSggJ01BUktET1dOX1BBUlNFUl9DTEFTUycsICAnTWFya2Rvd25FeHRyYV9QYXJzZXInICk7CisKK2Z1bmN0aW9uIE1hcmtkb3duKCR0ZXh0KSB7CisjCisjIEluaXRpYWxpemUgdGhlIHBhcnNlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgaXRzIHRyYW5zZm9ybSBtZXRob2QuCisjCisJIyBTZXR1cCBzdGF0aWMgcGFyc2VyIHZhcmlhYmxlLgorCXN0YXRpYyAkcGFyc2VyOworCWlmICghaXNzZXQoJHBhcnNlcikpIHsKKwkJJHBhcnNlcl9jbGFzcyA9IE1BUktET1dOX1BBUlNFUl9DTEFTUzsKKwkJJHBhcnNlciA9IG5ldyAkcGFyc2VyX2NsYXNzOworCX0KKworCSMgVHJhbnNmb3JtIHRleHQgdXNpbmcgcGFyc2VyLgorCXJldHVybiAkcGFyc2VyLT50cmFuc2Zvcm0oJHRleHQpOworfQorCisKKyMjIyBXb3JkUHJlc3MgUGx1Z2luIEludGVyZmFjZSAjIyMKKworLyoKK1BsdWdpbiBOYW1lOiBNYXJrZG93biBFeHRyYQorUGx1Z2luIFVSSTogaHR0cDovL21pY2hlbGYuY29tL3Byb2plY3RzL3BocC1tYXJrZG93bi8KK0Rlc2NyaXB0aW9uOiA8YSBocmVmPSJodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCI+TWFya2Rvd24gc3ludGF4PC9hPiBhbGxvd3MgeW91IHRvIHdyaXRlIHVzaW5nIGFuIGVhc3ktdG8tcmVhZCwgZWFzeS10by13cml0ZSBwbGFpbiB0ZXh0IGZvcm1hdC4gQmFzZWQgb24gdGhlIG9yaWdpbmFsIFBlcmwgdmVyc2lvbiBieSA8YSBocmVmPSJodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0LyI+Sm9obiBHcnViZXI8L2E+LiA8YSBocmVmPSJodHRwOi8vbWljaGVsZi5jb20vcHJvamVjdHMvcGhwLW1hcmtkb3duLyI+TW9yZS4uLjwvYT4KK1ZlcnNpb246IDEuMi41CitBdXRob3I6IE1pY2hlbCBGb3J0aW4KK0F1dGhvciBVUkk6IGh0dHA6Ly9taWNoZWxmLmNvbS8KKyovCisKK2lmIChpc3NldCgkd3BfdmVyc2lvbikpIHsKKwkjIE1vcmUgZGV0YWlscyBhYm91dCBob3cgaXQgd29ya3MgaGVyZToKKwkjIDxodHRwOi8vbWljaGVsZi5jb20vd2VibG9nLzIwMDUvd29yZHByZXNzLXRleHQtZmxvdy12cy1tYXJrZG93bi8+CisJCisJIyBQb3N0IGNvbnRlbnQgYW5kIGV4Y2VycHRzCisJIyAtIFJlbW92ZSBXb3JkUHJlc3MgcGFyYWdyYXBoIGdlbmVyYXRvci4KKwkjIC0gUnVuIE1hcmtkb3duIG9uIGV4Y2VycHQsIHRoZW4gcmVtb3ZlIGFsbCB0YWdzLgorCSMgLSBBZGQgcGFyYWdyYXBoIHRhZyBhcm91bmQgdGhlIGV4Y2VycHQsIGJ1dCByZW1vdmUgaXQgZm9yIHRoZSBleGNlcnB0IHJzcy4KKwlpZiAoTUFSS0RPV05fV1BfUE9TVFMpIHsKKwkJcmVtb3ZlX2ZpbHRlcigndGhlX2NvbnRlbnQnLCAgICAgJ3dwYXV0b3AnKTsKKyAgICAgICAgcmVtb3ZlX2ZpbHRlcigndGhlX2NvbnRlbnRfcnNzJywgJ3dwYXV0b3AnKTsKKwkJcmVtb3ZlX2ZpbHRlcigndGhlX2V4Y2VycHQnLCAgICAgJ3dwYXV0b3AnKTsKKwkJYWRkX2ZpbHRlcigndGhlX2NvbnRlbnQnLCAgICAgJ21kd3BfTWFya2Rvd25Qb3N0JywgNik7CisgICAgICAgIGFkZF9maWx0ZXIoJ3RoZV9jb250ZW50X3JzcycsICdtZHdwX01hcmtkb3duUG9zdCcsIDYpOworCQlhZGRfZmlsdGVyKCdnZXRfdGhlX2V4Y2VycHQnLCAnbWR3cF9NYXJrZG93blBvc3QnLCA2KTsKKwkJYWRkX2ZpbHRlcignZ2V0X3RoZV9leGNlcnB0JywgJ3RyaW0nLCA3KTsKKwkJYWRkX2ZpbHRlcigndGhlX2V4Y2VycHQnLCAgICAgJ21kd3BfYWRkX3AnKTsKKwkJYWRkX2ZpbHRlcigndGhlX2V4Y2VycHRfcnNzJywgJ21kd3Bfc3RyaXBfcCcpOworCQkKKwkJcmVtb3ZlX2ZpbHRlcignY29udGVudF9zYXZlX3ByZScsICAnYmFsYW5jZVRhZ3MnLCA1MCk7CisJCXJlbW92ZV9maWx0ZXIoJ2V4Y2VycHRfc2F2ZV9wcmUnLCAgJ2JhbGFuY2VUYWdzJywgNTApOworCQlhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICAJICAnYmFsYW5jZVRhZ3MnLCA1MCk7CisJCWFkZF9maWx0ZXIoJ2dldF90aGVfZXhjZXJwdCcsICdiYWxhbmNlVGFncycsIDkpOworCX0KKwkKKwkjIEFkZCBhIGZvb3Rub3RlIGlkIHByZWZpeCB0byBwb3N0cyB3aGVuIGluc2lkZSBhIGxvb3AuCisJZnVuY3Rpb24gbWR3cF9NYXJrZG93blBvc3QoJHRleHQpIHsKKwkJc3RhdGljICRwYXJzZXI7CisJCWlmICghJHBhcnNlcikgeworCQkJJHBhcnNlcl9jbGFzcyA9IE1BUktET1dOX1BBUlNFUl9DTEFTUzsKKwkJCSRwYXJzZXIgPSBuZXcgJHBhcnNlcl9jbGFzczsKKwkJfQorCQlpZiAoaXNfc2luZ2xlKCkgfHwgaXNfcGFnZSgpIHx8IGlzX2ZlZWQoKSkgeworCQkJJHBhcnNlci0+Zm5faWRfcHJlZml4ID0gIiI7CisJCX0gZWxzZSB7CisJCQkkcGFyc2VyLT5mbl9pZF9wcmVmaXggPSBnZXRfdGhlX0lEKCkgLiAiLiI7CisJCX0KKwkJcmV0dXJuICRwYXJzZXItPnRyYW5zZm9ybSgkdGV4dCk7CisJfQorCQorCSMgQ29tbWVudHMKKwkjIC0gUmVtb3ZlIFdvcmRQcmVzcyBwYXJhZ3JhcGggZ2VuZXJhdG9yLgorCSMgLSBSZW1vdmUgV29yZFByZXNzIGF1dG8tbGluayBnZW5lcmF0b3IuCisJIyAtIFNjcmFtYmxlIGltcG9ydGFudCB0YWdzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGtzZXMgZmlsdGVyLgorCSMgLSBSdW4gTWFya2Rvd24gb24gZXhjZXJwdCB0aGVuIHJlbW92ZSBwYXJhZ3JhcGggdGFncy4KKwlpZiAoTUFSS0RPV05fV1BfQ09NTUVOVFMpIHsKKwkJcmVtb3ZlX2ZpbHRlcignY29tbWVudF90ZXh0JywgJ3dwYXV0b3AnLCAzMCk7CisJCXJlbW92ZV9maWx0ZXIoJ2NvbW1lbnRfdGV4dCcsICdtYWtlX2NsaWNrYWJsZScpOworCQlhZGRfZmlsdGVyKCdwcmVfY29tbWVudF9jb250ZW50JywgJ01hcmtkb3duJywgNik7CisJCWFkZF9maWx0ZXIoJ3ByZV9jb21tZW50X2NvbnRlbnQnLCAnbWR3cF9oaWRlX3RhZ3MnLCA4KTsKKwkJYWRkX2ZpbHRlcigncHJlX2NvbW1lbnRfY29udGVudCcsICdtZHdwX3Nob3dfdGFncycsIDEyKTsKKwkJYWRkX2ZpbHRlcignZ2V0X2NvbW1lbnRfdGV4dCcsICAgICdNYXJrZG93bicsIDYpOworCQlhZGRfZmlsdGVyKCdnZXRfY29tbWVudF9leGNlcnB0JywgJ01hcmtkb3duJywgNik7CisJCWFkZF9maWx0ZXIoJ2dldF9jb21tZW50X2V4Y2VycHQnLCAnbWR3cF9zdHJpcF9wJywgNyk7CisJCisJCWdsb2JhbCAkbWR3cF9oaWRkZW5fdGFncywgJG1kd3BfcGxhY2Vob2xkZXJzOworCQkkbWR3cF9oaWRkZW5fdGFncyA9IGV4cGxvZGUoJyAnLAorCQkJJzxwPiA8L3A+IDxwcmU+IDwvcHJlPiA8b2w+IDwvb2w+IDx1bD4gPC91bD4gPGxpPiA8L2xpPicpOworCQkkbWR3cF9wbGFjZWhvbGRlcnMgPSBleHBsb2RlKCcgJywgc3RyX3JvdDEzKAorCQkJJ3BFajA3WmJiQlogVTFrcWdoNHc0cCBwcmUyem1lTjZLIFFUaTMxdDlwcmUgb2wwTVAxanpKUiAnLgorCQkJJ01MNUlqbWJSb2wgdWxBTmkxTnNHWSBKN3pSTEpxUHVsIGxpQThjdGwxNlQgSzluaG9vVUhsaScpKTsKKwl9CisJCisJZnVuY3Rpb24gbWR3cF9hZGRfcCgkdGV4dCkgeworCQlpZiAoIXByZWdfbWF0Y2goJ3teJHxePChwfHVsfG9sfGRsfHByZXxibG9ja3F1b3RlKT59aScsICR0ZXh0KSkgeworCQkJJHRleHQgPSAnPHA+Jy4kdGV4dC4nPC9wPic7CisJCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgne1xuezIsfX0nLCAiPC9wPlxuXG48cD4iLCAkdGV4dCk7CisJCX0KKwkJcmV0dXJuICR0ZXh0OworCX0KKwkKKwlmdW5jdGlvbiBtZHdwX3N0cmlwX3AoJHQpIHsgcmV0dXJuIHByZWdfcmVwbGFjZSgnezwvP3A+fWknLCAnJywgJHQpOyB9CisKKwlmdW5jdGlvbiBtZHdwX2hpZGVfdGFncygkdGV4dCkgeworCQlnbG9iYWwgJG1kd3BfaGlkZGVuX3RhZ3MsICRtZHdwX3BsYWNlaG9sZGVyczsKKwkJcmV0dXJuIHN0cl9yZXBsYWNlKCRtZHdwX2hpZGRlbl90YWdzLCAkbWR3cF9wbGFjZWhvbGRlcnMsICR0ZXh0KTsKKwl9CisJZnVuY3Rpb24gbWR3cF9zaG93X3RhZ3MoJHRleHQpIHsKKwkJZ2xvYmFsICRtZHdwX2hpZGRlbl90YWdzLCAkbWR3cF9wbGFjZWhvbGRlcnM7CisJCXJldHVybiBzdHJfcmVwbGFjZSgkbWR3cF9wbGFjZWhvbGRlcnMsICRtZHdwX2hpZGRlbl90YWdzLCAkdGV4dCk7CisJfQorfQorCisKKyMjIyBiQmxvZyBQbHVnaW4gSW5mbyAjIyMKKworZnVuY3Rpb24gaWRlbnRpZnlfbW9kaWZpZXJfbWFya2Rvd24oKSB7CisJcmV0dXJuIGFycmF5KAorCQknbmFtZScgPT4gJ21hcmtkb3duJywKKwkJJ3R5cGUnID0+ICdtb2RpZmllcicsCisJCSduaWNlbmFtZScgPT4gJ1BIUCBNYXJrZG93biBFeHRyYScsCisJCSdkZXNjcmlwdGlvbicgPT4gJ0EgdGV4dC10by1IVE1MIGNvbnZlcnNpb24gdG9vbCBmb3Igd2ViIHdyaXRlcnMnLAorCQknYXV0aG9ycycgPT4gJ01pY2hlbCBGb3J0aW4gYW5kIEpvaG4gR3J1YmVyJywKKwkJJ2xpY2VuY2UnID0+ICdHUEwnLAorCQkndmVyc2lvbicgPT4gTUFSS0RPV05FWFRSQV9WRVJTSU9OLAorCQknaGVscCcgPT4gJzxhIGhyZWY9Imh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4Ij5NYXJrZG93biBzeW50YXg8L2E+IGFsbG93cyB5b3UgdG8gd3JpdGUgdXNpbmcgYW4gZWFzeS10by1yZWFkLCBlYXN5LXRvLXdyaXRlIHBsYWluIHRleHQgZm9ybWF0LiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgUGVybCB2ZXJzaW9uIGJ5IDxhIGhyZWY9Imh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvIj5Kb2huIEdydWJlcjwvYT4uIDxhIGhyZWY9Imh0dHA6Ly9taWNoZWxmLmNvbS9wcm9qZWN0cy9waHAtbWFya2Rvd24vIj5Nb3JlLi4uPC9hPicsCisJCSk7Cit9CisKKworIyMjIFNtYXJ0eSBNb2RpZmllciBJbnRlcmZhY2UgIyMjCisKK2Z1bmN0aW9uIHNtYXJ0eV9tb2RpZmllcl9tYXJrZG93bigkdGV4dCkgeworCXJldHVybiBNYXJrZG93bigkdGV4dCk7Cit9CisKKworIyMjIFRleHRpbGUgQ29tcGF0aWJpbGl0eSBNb2RlICMjIworCisjIFJlbmFtZSB0aGlzIGZpbGUgdG8gImNsYXNzVGV4dGlsZS5waHAiIGFuZCBpdCBjYW4gcmVwbGFjZSBUZXh0aWxlIGV2ZXJ5d2hlcmUuCisKK2lmIChzdHJjYXNlY21wKHN1YnN0cihfX0ZJTEVfXywgLTE2KSwgImNsYXNzVGV4dGlsZS5waHAiKSA9PSAwKSB7CisJIyBUcnkgdG8gaW5jbHVkZSBQSFAgU21hcnR5UGFudHMuIFNob3VsZCBiZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisJQGluY2x1ZGVfb25jZSAnc21hcnR5cGFudHMucGhwJzsKKwkjIEZha2UgVGV4dGlsZSBjbGFzcy4gSXQgY2FsbHMgTWFya2Rvd24gaW5zdGVhZC4KKwljbGFzcyBUZXh0aWxlIHsKKwkJZnVuY3Rpb24gVGV4dGlsZVRoaXMoJHRleHQsICRsaXRlPScnLCAkZW5jb2RlPScnKSB7CisJCQlpZiAoJGxpdGUgPT0gJycgJiYgJGVuY29kZSA9PSAnJykgICAgJHRleHQgPSBNYXJrZG93bigkdGV4dCk7CisJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdTbWFydHlQYW50cycpKSAgJHRleHQgPSBTbWFydHlQYW50cygkdGV4dCk7CisJCQlyZXR1cm4gJHRleHQ7CisJCX0KKwkJIyBGYWtlIHJlc3RyaWN0ZWQgdmVyc2lvbjogcmVzdHJpY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBub3cuCisJCWZ1bmN0aW9uIFRleHRpbGVSZXN0cmljdGVkKCR0ZXh0LCAkbGl0ZT0nJywgJG5vaW1hZ2U9JycpIHsKKwkJCXJldHVybiAkdGhpcy0+VGV4dGlsZVRoaXMoJHRleHQsICRsaXRlKTsKKwkJfQorCQkjIFdvcmthcm91bmQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBUZXh0UGF0dGVybiA0LjAuMy4KKwkJZnVuY3Rpb24gYmxvY2tMaXRlKCR0ZXh0KSB7IHJldHVybiAkdGV4dDsgfQorCX0KK30KKworCisKKyMKKyMgTWFya2Rvd24gUGFyc2VyIENsYXNzCisjCisKK2NsYXNzIE1hcmtkb3duX1BhcnNlciB7CisKKwkjIFJlZ2V4IHRvIG1hdGNoIGJhbGFuY2VkIFticmFja2V0c10uCisJIyBOZWVkZWQgdG8gaW5zZXJ0IGEgbWF4aW11bSBicmFja2VkIGRlcHRoIHdoaWxlIGNvbnZlcnRpbmcgdG8gUEhQLgorCXZhciAkbmVzdGVkX2JyYWNrZXRzX2RlcHRoID0gNjsKKwl2YXIgJG5lc3RlZF9icmFja2V0c19yZTsKKwkKKwl2YXIgJG5lc3RlZF91cmxfcGFyZW50aGVzaXNfZGVwdGggPSA0OworCXZhciAkbmVzdGVkX3VybF9wYXJlbnRoZXNpc19yZTsKKworCSMgVGFibGUgb2YgaGFzaCB2YWx1ZXMgZm9yIGVzY2FwZWQgY2hhcmFjdGVyczoKKwl2YXIgJGVzY2FwZV9jaGFycyA9ICdcYCpfe31bXSgpPiMrLS4hJzsKKwl2YXIgJGVzY2FwZV9jaGFyc19yZTsKKworCSMgQ2hhbmdlIHRvICI+IiBmb3IgSFRNTCBvdXRwdXQuCisJdmFyICRlbXB0eV9lbGVtZW50X3N1ZmZpeCA9IE1BUktET1dOX0VNUFRZX0VMRU1FTlRfU1VGRklYOworCXZhciAkdGFiX3dpZHRoID0gTUFSS0RPV05fVEFCX1dJRFRIOworCQorCSMgQ2hhbmdlIHRvIGB0cnVlYCB0byBkaXNhbGxvdyBtYXJrdXAgb3IgZW50aXRpZXMuCisJdmFyICRub19tYXJrdXAgPSBmYWxzZTsKKwl2YXIgJG5vX2VudGl0aWVzID0gZmFsc2U7CisJCisJIyBQcmVkZWZpbmVkIHVybHMgYW5kIHRpdGxlcyBmb3IgcmVmZXJlbmNlIGxpbmtzIGFuZCBpbWFnZXMuCisJdmFyICRwcmVkZWZfdXJscyA9IGFycmF5KCk7CisJdmFyICRwcmVkZWZfdGl0bGVzID0gYXJyYXkoKTsKKworCisJZnVuY3Rpb24gTWFya2Rvd25fUGFyc2VyKCkgeworCSMKKwkjIENvbnN0cnVjdG9yIGZ1bmN0aW9uLiBJbml0aWFsaXplIGFwcHJvcHJpYXRlIG1lbWJlciB2YXJpYWJsZXMuCisJIworCQkkdGhpcy0+X2luaXREZXRhYigpOworCQkkdGhpcy0+cHJlcGFyZUl0YWxpY3NBbmRCb2xkKCk7CisJCisJCSR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUgPSAKKwkJCXN0cl9yZXBlYXQoJyg/PlteXFtcXV0rfFxbJywgJHRoaXMtPm5lc3RlZF9icmFja2V0c19kZXB0aCkuCisJCQlzdHJfcmVwZWF0KCdcXSkqJywgJHRoaXMtPm5lc3RlZF9icmFja2V0c19kZXB0aCk7CisJCisJCSR0aGlzLT5uZXN0ZWRfdXJsX3BhcmVudGhlc2lzX3JlID0gCisJCQlzdHJfcmVwZWF0KCcoPz5bXigpXHNdK3xcKCcsICR0aGlzLT5uZXN0ZWRfdXJsX3BhcmVudGhlc2lzX2RlcHRoKS4KKwkJCXN0cl9yZXBlYXQoJyg/PlwpKSkqJywgJHRoaXMtPm5lc3RlZF91cmxfcGFyZW50aGVzaXNfZGVwdGgpOworCQkKKwkJJHRoaXMtPmVzY2FwZV9jaGFyc19yZSA9ICdbJy5wcmVnX3F1b3RlKCR0aGlzLT5lc2NhcGVfY2hhcnMpLiddJzsKKwkJCisJCSMgU29ydCBkb2N1bWVudCwgYmxvY2ssIGFuZCBzcGFuIGdhbXV0IGluIGFzY2VuZGVudCBwcmlvcml0eSBvcmRlci4KKwkJYXNvcnQoJHRoaXMtPmRvY3VtZW50X2dhbXV0KTsKKwkJYXNvcnQoJHRoaXMtPmJsb2NrX2dhbXV0KTsKKwkJYXNvcnQoJHRoaXMtPnNwYW5fZ2FtdXQpOworCX0KKworCisJIyBJbnRlcm5hbCBoYXNoZXMgdXNlZCBkdXJpbmcgdHJhbnNmb3JtYXRpb24uCisJdmFyICR1cmxzID0gYXJyYXkoKTsKKwl2YXIgJHRpdGxlcyA9IGFycmF5KCk7CisJdmFyICRodG1sX2hhc2hlcyA9IGFycmF5KCk7CisJCisJIyBTdGF0dXMgZmxhZyB0byBhdm9pZCBpbnZhbGlkIG5lc3RpbmcuCisJdmFyICRpbl9hbmNob3IgPSBmYWxzZTsKKwkKKwkKKwlmdW5jdGlvbiBzZXR1cCgpIHsKKwkjCisJIyBDYWxsZWQgYmVmb3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzIHN0YXJ0cyB0byBzZXR1cCBwYXJzZXIgCisJIyBzdGF0ZXMuCisJIworCQkjIENsZWFyIGdsb2JhbCBoYXNoZXMuCisJCSR0aGlzLT51cmxzID0gJHRoaXMtPnByZWRlZl91cmxzOworCQkkdGhpcy0+dGl0bGVzID0gJHRoaXMtPnByZWRlZl90aXRsZXM7CisJCSR0aGlzLT5odG1sX2hhc2hlcyA9IGFycmF5KCk7CisJCQorCQkkaW5fYW5jaG9yID0gZmFsc2U7CisJfQorCQorCWZ1bmN0aW9uIHRlYXJkb3duKCkgeworCSMKKwkjIENhbGxlZCBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24gcHJvY2VzcyB0byBjbGVhciBhbnkgdmFyaWFibGUgCisJIyB3aGljaCBtYXkgYmUgdGFraW5nIHVwIG1lbW9yeSB1bm5lY2Vzc2FybHkuCisJIworCQkkdGhpcy0+dXJscyA9IGFycmF5KCk7CisJCSR0aGlzLT50aXRsZXMgPSBhcnJheSgpOworCQkkdGhpcy0+aHRtbF9oYXNoZXMgPSBhcnJheSgpOworCX0KKworCisJZnVuY3Rpb24gdHJhbnNmb3JtKCR0ZXh0KSB7CisJIworCSMgTWFpbiBmdW5jdGlvbi4gUGVyZm9ybXMgc29tZSBwcmVwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCB0ZXh0CisJIyBhbmQgcGFzcyBpdCB0aHJvdWdoIHRoZSBkb2N1bWVudCBnYW11dC4KKwkjCisJCSR0aGlzLT5zZXR1cCgpOworCQorCQkjIFJlbW92ZSBVVEYtOCBCT00gYW5kIG1hcmtlciBjaGFyYWN0ZXIgaW4gaW5wdXQsIGlmIHByZXNlbnQuCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlKCd7Xlx4RUZceEJCXHhCRnxceDFBfScsICcnLCAkdGV4dCk7CisKKwkJIyBTdGFuZGFyZGl6ZSBsaW5lIGVuZGluZ3M6CisJCSMgICBET1MgdG8gVW5peCBhbmQgTWFjIHRvIFVuaXgKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2UoJ3tcclxuP30nLCAiXG4iLCAkdGV4dCk7CisKKwkJIyBNYWtlIHN1cmUgJHRleHQgZW5kcyB3aXRoIGEgY291cGxlIG9mIG5ld2xpbmVzOgorCQkkdGV4dCAuPSAiXG5cbiI7CisKKwkJIyBDb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlcy4KKwkJJHRleHQgPSAkdGhpcy0+ZGV0YWIoJHRleHQpOworCisJCSMgVHVybiBibG9jay1sZXZlbCBIVE1MIGJsb2NrcyBpbnRvIGhhc2ggZW50cmllcworCQkkdGV4dCA9ICR0aGlzLT5oYXNoSFRNTEJsb2NrcygkdGV4dCk7CisKKwkJIyBTdHJpcCBhbnkgbGluZXMgY29uc2lzdGluZyBvbmx5IG9mIHNwYWNlcyBhbmQgdGFicy4KKwkJIyBUaGlzIG1ha2VzIHN1YnNlcXVlbnQgcmVnZXhlbiBlYXNpZXIgdG8gd3JpdGUsIGJlY2F1c2Ugd2UgY2FuCisJCSMgbWF0Y2ggY29uc2VjdXRpdmUgYmxhbmsgbGluZXMgd2l0aCAvXG4rLyBpbnN0ZWFkIG9mIHNvbWV0aGluZworCQkjIGNvbnRvcnRlZCBsaWtlIC9bIF0qXG4rLyAuCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvXlsgXSskL20nLCAnJywgJHRleHQpOworCisJCSMgUnVuIGRvY3VtZW50IGdhbXV0IG1ldGhvZHMuCisJCWZvcmVhY2ggKCR0aGlzLT5kb2N1bWVudF9nYW11dCBhcyAkbWV0aG9kID0+ICRwcmlvcml0eSkgeworCQkJJHRleHQgPSAkdGhpcy0+JG1ldGhvZCgkdGV4dCk7CisJCX0KKwkJCisJCSR0aGlzLT50ZWFyZG93bigpOworCisJCXJldHVybiAkdGV4dCAuICJcbiI7CisJfQorCQorCXZhciAkZG9jdW1lbnRfZ2FtdXQgPSBhcnJheSgKKwkJIyBTdHJpcCBsaW5rIGRlZmluaXRpb25zLCBzdG9yZSBpbiBoYXNoZXMuCisJCSJzdHJpcExpbmtEZWZpbml0aW9ucyIgPT4gMjAsCisJCQorCQkicnVuQmFzaWNCbG9ja0dhbXV0IiAgID0+IDMwLAorCQkpOworCisKKwlmdW5jdGlvbiBzdHJpcExpbmtEZWZpbml0aW9ucygkdGV4dCkgeworCSMKKwkjIFN0cmlwcyBsaW5rIGRlZmluaXRpb25zIGZyb20gdGV4dCwgc3RvcmVzIHRoZSBVUkxzIGFuZCB0aXRsZXMgaW4KKwkjIGhhc2ggcmVmZXJlbmNlcy4KKwkjCisJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aCAtIDE7CisKKwkJIyBMaW5rIGRlZnMgYXJlIGluIHRoZSBmb3JtOiBeW2lkXTogdXJsICJvcHRpb25hbCB0aXRsZSIKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCQkJCQleWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfVxbKC4rKVxdWyBdPzoJIyBpZCA9ICQxCisJCQkJCQkJICBbIF0qCisJCQkJCQkJICBcbj8JCQkJIyBtYXliZSAqb25lKiBuZXdsaW5lCisJCQkJCQkJICBbIF0qCisJCQkJCQkJKD86CisJCQkJCQkJICA8KC4rPyk+CQkJIyB1cmwgPSAkMgorCQkJCQkJCXwKKwkJCQkJCQkgIChcUys/KQkJCSMgdXJsID0gJDMKKwkJCQkJCQkpCisJCQkJCQkJICBbIF0qCisJCQkJCQkJICBcbj8JCQkJIyBtYXliZSBvbmUgbmV3bGluZQorCQkJCQkJCSAgWyBdKgorCQkJCQkJCSg/OgorCQkJCQkJCQkoPzw9XHMpCQkJIyBsb29rYmVoaW5kIGZvciB3aGl0ZXNwYWNlCisJCQkJCQkJCVsiKF0KKwkJCQkJCQkJKC4qPykJCQkjIHRpdGxlID0gJDQKKwkJCQkJCQkJWyIpXQorCQkJCQkJCQlbIF0qCisJCQkJCQkJKT8JIyB0aXRsZSBpcyBvcHRpb25hbAorCQkJCQkJCSg/OlxuK3xcWikKKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfc3RyaXBMaW5rRGVmaW5pdGlvbnNfY2FsbGJhY2snKSwKKwkJCSR0ZXh0KTsKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfc3RyaXBMaW5rRGVmaW5pdGlvbnNfY2FsbGJhY2soJG1hdGNoZXMpIHsKKwkJJGxpbmtfaWQgPSBzdHJ0b2xvd2VyKCRtYXRjaGVzWzFdKTsKKwkJJHVybCA9ICRtYXRjaGVzWzJdID09ICcnID8gJG1hdGNoZXNbM10gOiAkbWF0Y2hlc1syXTsKKwkJJHRoaXMtPnVybHNbJGxpbmtfaWRdID0gJHVybDsKKwkJJHRoaXMtPnRpdGxlc1skbGlua19pZF0gPSYgJG1hdGNoZXNbNF07CisJCXJldHVybiAnJzsgIyBTdHJpbmcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGJsb2NrCisJfQorCisKKwlmdW5jdGlvbiBoYXNoSFRNTEJsb2NrcygkdGV4dCkgeworCQlpZiAoJHRoaXMtPm5vX21hcmt1cCkgIHJldHVybiAkdGV4dDsKKworCQkkbGVzc190aGFuX3RhYiA9ICR0aGlzLT50YWJfd2lkdGggLSAxOworCisJCSMgSGFzaGlmeSBIVE1MIGJsb2NrczoKKwkJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBmb3IgYmxvY2stbGV2ZWwgSFRNTCB0YWdzLCBzdWNoIGFzIGhlYWRlcnMsCisJCSMgbGlzdHMsIGFuZCB0YWJsZXMuIFRoYXQncyBiZWNhdXNlIHdlIHN0aWxsIHdhbnQgdG8gd3JhcCA8cD5zIGFyb3VuZAorCQkjICJwYXJhZ3JhcGhzIiB0aGF0IGFyZSB3cmFwcGVkIGluIG5vbi1ibG9jay1sZXZlbCB0YWdzLCBzdWNoIGFzIGFuY2hvcnMsCisJCSMgcGhyYXNlIGVtcGhhc2lzLCBhbmQgc3BhbnMuIFRoZSBsaXN0IG9mIHRhZ3Mgd2UncmUgbG9va2luZyBmb3IgaXMKKwkJIyBoYXJkLWNvZGVkOgorCQkjCisJCSMgKiAgTGlzdCAiYSIgaXMgbWFkZSBvZiB0YWdzIHdoaWNoIGNhbiBiZSBib3RoIGlubGluZSBvciBibG9jay1sZXZlbC4KKwkJIyAgICBUaGVzZSB3aWxsIGJlIHRyZWF0ZWQgYmxvY2stbGV2ZWwgd2hlbiB0aGUgc3RhcnQgdGFnIGlzIGFsb25lIG9uIAorCQkjICAgIGl0cyBsaW5lLCBvdGhlcndpc2UgdGhleSdyZSBub3QgbWF0Y2hlZCBoZXJlIGFuZCB3aWxsIGJlIHRha2VuIGFzIAorCQkjICAgIGlubGluZSBsYXRlci4KKwkJIyAqICBMaXN0ICJiIiBpcyBtYWRlIG9mIHRhZ3Mgd2hpY2ggYXJlIGFsd2F5cyBibG9jay1sZXZlbDsKKwkJIworCQkkYmxvY2tfdGFnc19hX3JlID0gJ2luc3xkZWwnOworCQkkYmxvY2tfdGFnc19iX3JlID0gJ3B8ZGl2fGhbMS02XXxibG9ja3F1b3RlfHByZXx0YWJsZXxkbHxvbHx1bHxhZGRyZXNzfCcuCisJCQkJCQkgICAnc2NyaXB0fG5vc2NyaXB0fGZvcm18ZmllbGRzZXR8aWZyYW1lfG1hdGgnOworCisJCSMgUmVndWxhciBleHByZXNzaW9uIGZvciB0aGUgY29udGVudCBvZiBhIGJsb2NrIHRhZy4KKwkJJG5lc3RlZF90YWdzX2xldmVsID0gNDsKKwkJJGF0dHIgPSAnCisJCQkoPz4JCQkJIyBvcHRpb25hbCB0YWcgYXR0cmlidXRlcworCQkJICBccwkJCSMgc3RhcnRzIHdpdGggd2hpdGVzcGFjZQorCQkJICAoPz4KKwkJCQlbXj4iL10rCQkjIHRleHQgb3V0c2lkZSBxdW90ZXMKKwkJCSAgfAorCQkJCS8rKD8hPikJCSMgc2xhc2ggbm90IGZvbGxvd2VkIGJ5ICI+IgorCQkJICB8CisJCQkJIlteIl0qIgkJIyB0ZXh0IGluc2lkZSBkb3VibGUgcXVvdGVzICh0b2xlcmF0ZSAiPiIpCisJCQkgIHwKKwkJCQlcJ1teXCddKlwnCSMgdGV4dCBpbnNpZGUgc2luZ2xlIHF1b3RlcyAodG9sZXJhdGUgIj4iKQorCQkJICApKgorCQkJKT8JCisJCQknOworCQkkY29udGVudCA9CisJCQlzdHJfcmVwZWF0KCcKKwkJCQkoPz4KKwkJCQkgIFtePF0rCQkJIyBjb250ZW50IHdpdGhvdXQgdGFnCisJCQkJfAorCQkJCSAgPFwyCQkJIyBuZXN0ZWQgb3BlbmluZyB0YWcKKwkJCQkJJy4kYXR0ci4nCSMgYXR0cmlidXRlcworCQkJCQkoPz4KKwkJCQkJICAvPgorCQkJCQl8CisJCQkJCSAgPicsICRuZXN0ZWRfdGFnc19sZXZlbCkuCSMgZW5kIG9mIG9wZW5pbmcgdGFnCisJCQkJCSAgJy4qPycuCQkJCQkjIGxhc3QgbGV2ZWwgbmVzdGVkIHRhZyBjb250ZW50CisJCQlzdHJfcmVwZWF0KCcKKwkJCQkJICA8L1wyXHMqPgkjIGNsb3NpbmcgbmVzdGVkIHRhZworCQkJCQkpCisJCQkJICB8CQkJCQorCQkJCQk8KD8hL1wyXHMqPgkjIG90aGVyIHRhZ3Mgd2l0aCBhIGRpZmZlcmVudCBuYW1lCisJCQkJICApCisJCQkJKSonLAorCQkJCSRuZXN0ZWRfdGFnc19sZXZlbCk7CisJCSRjb250ZW50MiA9IHN0cl9yZXBsYWNlKCdcMicsICdcMycsICRjb250ZW50KTsKKworCQkjIEZpcnN0LCBsb29rIGZvciBuZXN0ZWQgYmxvY2tzLCBlLmcuOgorCQkjIAk8ZGl2PgorCQkjIAkJPGRpdj4KKwkJIyAJCXRhZ3MgZm9yIGlubmVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQuCisJCSMgCQk8L2Rpdj4KKwkJIyAJPC9kaXY+CisJCSMKKwkJIyBUaGUgb3V0ZXJtb3N0IHRhZ3MgbXVzdCBzdGFydCBhdCB0aGUgbGVmdCBtYXJnaW4gZm9yIHRoaXMgdG8gbWF0Y2gsIGFuZAorCQkjIHRoZSBpbm5lciBuZXN0ZWQgZGl2cyBtdXN0IGJlIGluZGVudGVkLgorCQkjIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgdGhlIG5leHQsIG1vcmUgbGliZXJhbCBtYXRjaCwgYmVjYXVzZSB0aGUgbmV4dAorCQkjIG1hdGNoIHdpbGwgc3RhcnQgYXQgdGhlIGZpcnN0IGA8ZGl2PmAgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IGA8L2Rpdj5gLgorCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneyg/PgorCQkJKD8+CisJCQkJKD88PVxuXG4pCQkjIFN0YXJ0aW5nIGFmdGVyIGEgYmxhbmsgbGluZQorCQkJCXwJCQkJIyBvcgorCQkJCVxBXG4/CQkJIyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2MKKwkJCSkKKwkJCSgJCQkJCQkjIHNhdmUgaW4gJDEKKworCQkJICAjIE1hdGNoIGZyb20gYFxuPHRhZz5gIHRvIGA8L3RhZz5cbmAsIGhhbmRsaW5nIG5lc3RlZCB0YWdzIAorCQkJICAjIGluIGJldHdlZW4uCisJCQkJCQorCQkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQorCQkJCQkJPCgnLiRibG9ja190YWdzX2JfcmUuJykjIHN0YXJ0IHRhZyA9ICQyCisJCQkJCQknLiRhdHRyLic+CQkJIyBhdHRyaWJ1dGVzIGZvbGxvd2VkIGJ5ID4gYW5kIFxuCisJCQkJCQknLiRjb250ZW50LicJCSMgY29udGVudCwgc3VwcG9ydCBuZXN0aW5nCisJCQkJCQk8L1wyPgkJCQkjIHRoZSBtYXRjaGluZyBlbmQgdGFnCisJCQkJCQlbIF0qCQkJCSMgdHJhaWxpbmcgc3BhY2VzL3RhYnMKKwkJCQkJCSg/PVxuK3xcWikJIyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgb3IgZW5kIG9mIGRvY3VtZW50CisKKwkJCXwgIyBTcGVjaWFsIHZlcnNpb24gZm9yIHRhZ3Mgb2YgZ3JvdXAgYS4KKworCQkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQorCQkJCQkJPCgnLiRibG9ja190YWdzX2FfcmUuJykjIHN0YXJ0IHRhZyA9ICQzCisJCQkJCQknLiRhdHRyLic+WyBdKlxuCSMgYXR0cmlidXRlcyBmb2xsb3dlZCBieSA+CisJCQkJCQknLiRjb250ZW50Mi4nCQkjIGNvbnRlbnQsIHN1cHBvcnQgbmVzdGluZworCQkJCQkJPC9cMz4JCQkJIyB0aGUgbWF0Y2hpbmcgZW5kIHRhZworCQkJCQkJWyBdKgkJCQkjIHRyYWlsaW5nIHNwYWNlcy90YWJzCisJCQkJCQkoPz1cbit8XFopCSMgZm9sbG93ZWQgYnkgYSBuZXdsaW5lIG9yIGVuZCBvZiBkb2N1bWVudAorCQkJCQkKKwkJCXwgIyBTcGVjaWFsIGNhc2UganVzdCBmb3IgPGhyIC8+LiBJdCB3YXMgZWFzaWVyIHRvIG1ha2UgYSBzcGVjaWFsIAorCQkJICAjIGNhc2UgdGhhbiB0byBtYWtlIHRoZSBvdGhlciByZWdleCBtb3JlIGNvbXBsaWNhdGVkLgorCQkJCisJCQkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CisJCQkJCQk8KGhyKQkJCQkjIHN0YXJ0IHRhZyA9ICQyCisJCQkJCQknLiRhdHRyLicJCQkjIGF0dHJpYnV0ZXMKKwkJCQkJCS8/PgkJCQkJIyB0aGUgbWF0Y2hpbmcgZW5kIHRhZworCQkJCQkJWyBdKgorCQkJCQkJKD89XG57Mix9fFxaKQkJIyBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgb3IgZW5kIG9mIGRvY3VtZW50CisJCQkKKwkJCXwgIyBTcGVjaWFsIGNhc2UgZm9yIHN0YW5kYWxvbmUgSFRNTCBjb21tZW50czoKKwkJCQorCQkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CisJCQkJCSg/czoKKwkJCQkJCTwhLS0gLio/IC0tPgorCQkJCQkpCisJCQkJCVsgXSoKKwkJCQkJKD89XG57Mix9fFxaKQkJIyBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgb3IgZW5kIG9mIGRvY3VtZW50CisJCQkKKwkJCXwgIyBQSFAgYW5kIEFTUC1zdHlsZSBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICg8PyBhbmQgPCUpCisJCQkKKwkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQorCQkJCQkoP3M6CisJCQkJCQk8KFs/JV0pCQkJIyAkMgorCQkJCQkJLio/CisJCQkJCQlcMj4KKwkJCQkJKQorCQkJCQlbIF0qCisJCQkJCSg/PVxuezIsfXxcWikJCSMgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIG9yIGVuZCBvZiBkb2N1bWVudAorCQkJCQkKKwkJCSkKKwkJCSl9U3htaScsCisJCQlhcnJheSgmJHRoaXMsICdfaGFzaEhUTUxCbG9ja3NfY2FsbGJhY2snKSwKKwkJCSR0ZXh0KTsKKworCQlyZXR1cm4gJHRleHQ7CisJfQorCWZ1bmN0aW9uIF9oYXNoSFRNTEJsb2Nrc19jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkdGV4dCA9ICRtYXRjaGVzWzFdOworCQkka2V5ICA9ICR0aGlzLT5oYXNoQmxvY2soJHRleHQpOworCQlyZXR1cm4gIlxuXG4ka2V5XG5cbiI7CisJfQorCQorCQorCWZ1bmN0aW9uIGhhc2hQYXJ0KCR0ZXh0LCAkYm91bmRhcnkgPSAnWCcpIHsKKwkjCisJIyBDYWxsZWQgd2hlbmV2ZXIgYSB0YWcgbXVzdCBiZSBoYXNoZWQgd2hlbiBhIGZ1bmN0aW9uIGluc2VydCBhbiBhdG9taWMgCisJIyBlbGVtZW50IGluIHRoZSB0ZXh0IHN0cmVhbS4gUGFzc2luZyAkdGV4dCB0byB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gZ2l2ZXMKKwkjIGEgdW5pcXVlIHRleHQtdG9rZW4gd2hpY2ggd2lsbCBiZSByZXZlcnRlZCBiYWNrIHdoZW4gY2FsbGluZyB1bmhhc2guCisJIworCSMgVGhlICRib3VuZGFyeSBhcmd1bWVudCBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIHNob3VsZCBiZSB1c2VkIHRvIHN1cnJvdW5kCisJIyB0aGUgdG9rZW4uIEJ5IGNvbnZlbnNpb24sICJCIiBpcyB1c2VkIGZvciBibG9jayBlbGVtZW50cyB0aGF0IG5lZWRzIG5vdAorCSMgdG8gYmUgd3JhcHBlZCBpbnRvIHBhcmFncmFwaCB0YWdzIGF0IHRoZSBlbmQsICI6IiBpcyB1c2VkIGZvciBlbGVtZW50cworCSMgdGhhdCBhcmUgd29yZCBzZXBhcmF0b3JzIGFuZCAiWCIgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhbCBjYXNlLgorCSMKKwkJIyBTd2FwIGJhY2sgYW55IHRhZyBoYXNoIGZvdW5kIGluICR0ZXh0IHNvIHdlIGRvIG5vdCBoYXZlIHRvIGB1bmhhc2hgCisJCSMgbXVsdGlwbGUgdGltZXMgYXQgdGhlIGVuZC4KKwkJJHRleHQgPSAkdGhpcy0+dW5oYXNoKCR0ZXh0KTsKKwkJCisJCSMgVGhlbiBoYXNoIHRoZSBibG9jay4KKwkJc3RhdGljICRpID0gMDsKKwkJJGtleSA9ICIkYm91bmRhcnlceDFBIiAuICsrJGkgLiAkYm91bmRhcnk7CisJCSR0aGlzLT5odG1sX2hhc2hlc1ska2V5XSA9ICR0ZXh0OworCQlyZXR1cm4gJGtleTsgIyBTdHJpbmcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHRhZy4KKwl9CisKKworCWZ1bmN0aW9uIGhhc2hCbG9jaygkdGV4dCkgeworCSMKKwkjIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBoYXNoUGFydCB3aXRoIGJsb2NrLWxldmVsIGJvdW5kYXJpZXMuCisJIworCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCR0ZXh0LCAnQicpOworCX0KKworCisJdmFyICRibG9ja19nYW11dCA9IGFycmF5KAorCSMKKwkjIFRoZXNlIGFyZSBhbGwgdGhlIHRyYW5zZm9ybWF0aW9ucyB0aGF0IGZvcm0gYmxvY2stbGV2ZWwKKwkjIHRhZ3MgbGlrZSBwYXJhZ3JhcGhzLCBoZWFkZXJzLCBhbmQgbGlzdCBpdGVtcy4KKwkjCisJCSJkb0hlYWRlcnMiICAgICAgICAgPT4gMTAsCisJCSJkb0hvcml6b250YWxSdWxlcyIgPT4gMjAsCisJCQorCQkiZG9MaXN0cyIgICAgICAgICAgID0+IDQwLAorCQkiZG9Db2RlQmxvY2tzIiAgICAgID0+IDUwLAorCQkiZG9CbG9ja1F1b3RlcyIgICAgID0+IDYwLAorCQkpOworCisJZnVuY3Rpb24gcnVuQmxvY2tHYW11dCgkdGV4dCkgeworCSMKKwkjIFJ1biBibG9jayBnYW11dCB0cmFuZm9ybWF0aW9ucy4KKwkjCisJCSMgV2UgbmVlZCB0byBlc2NhcGUgcmF3IEhUTUwgaW4gTWFya2Rvd24gc291cmNlIGJlZm9yZSBkb2luZyBhbnl0aGluZyAKKwkJIyBlbHNlLiBUaGlzIG5lZWQgdG8gYmUgZG9uZSBmb3IgZWFjaCBibG9jaywgYW5kIG5vdCBvbmx5IGF0IHRoZSAKKwkJIyBiZWdpbmluZyBpbiB0aGUgTWFya2Rvd24gZnVuY3Rpb24gc2luY2UgaGFzaGVkIGJsb2NrcyBjYW4gYmUgcGFydCBvZgorCQkjIGxpc3QgaXRlbXMgYW5kIGNvdWxkIGhhdmUgYmVlbiBpbmRlbnRlZC4gSW5kZW50ZWQgYmxvY2tzIHdvdWxkIGhhdmUgCisJCSMgYmVlbiBzZWVuIGFzIGEgY29kZSBibG9jayBpbiBhIHByZXZpb3VzIHBhc3Mgb2YgaGFzaEhUTUxCbG9ja3MuCisJCSR0ZXh0ID0gJHRoaXMtPmhhc2hIVE1MQmxvY2tzKCR0ZXh0KTsKKwkJCisJCXJldHVybiAkdGhpcy0+cnVuQmFzaWNCbG9ja0dhbXV0KCR0ZXh0KTsKKwl9CisJCisJZnVuY3Rpb24gcnVuQmFzaWNCbG9ja0dhbXV0KCR0ZXh0KSB7CisJIworCSMgUnVuIGJsb2NrIGdhbXV0IHRyYW5mb3JtYXRpb25zLCB3aXRob3V0IGhhc2hpbmcgSFRNTCBibG9ja3MuIFRoaXMgaXMgCisJIyB1c2VmdWwgd2hlbiBIVE1MIGJsb2NrcyBhcmUga25vd24gdG8gYmUgYWxyZWFkeSBoYXNoZWQsIGxpa2UgaW4gdGhlIGZpcnN0CisJIyB3aG9sZS1kb2N1bWVudCBwYXNzLgorCSMKKwkJZm9yZWFjaCAoJHRoaXMtPmJsb2NrX2dhbXV0IGFzICRtZXRob2QgPT4gJHByaW9yaXR5KSB7CisJCQkkdGV4dCA9ICR0aGlzLT4kbWV0aG9kKCR0ZXh0KTsKKwkJfQorCQkKKwkJIyBGaW5hbGx5IGZvcm0gcGFyYWdyYXBoIGFuZCByZXN0b3JlIGhhc2hlZCBibG9ja3MuCisJCSR0ZXh0ID0gJHRoaXMtPmZvcm1QYXJhZ3JhcGhzKCR0ZXh0KTsKKworCQlyZXR1cm4gJHRleHQ7CisJfQorCQorCQorCWZ1bmN0aW9uIGRvSG9yaXpvbnRhbFJ1bGVzKCR0ZXh0KSB7CisJCSMgRG8gSG9yaXpvbnRhbCBSdWxlczoKKwkJcmV0dXJuIHByZWdfcmVwbGFjZSgKKwkJCSd7CisJCQkJXlsgXXswLDN9CSMgTGVhZGluZyBzcGFjZQorCQkJCShbLSpfXSkJCSMgJDE6IEZpcnN0IG1hcmtlcgorCQkJCSg/PgkJCSMgUmVwZWF0ZWQgbWFya2VyIGdyb3VwCisJCQkJCVsgXXswLDJ9CSMgWmVybywgb25lLCBvciB0d28gc3BhY2VzLgorCQkJCQlcMQkJCSMgTWFya2VyIGNoYXJhY3RlcgorCQkJCSl7Mix9CQkjIEdyb3VwIHJlcGVhdGVkIGF0IGxlYXN0IHR3aWNlCisJCQkJWyBdKgkJIyBUYWlsaW5nIHNwYWNlcworCQkJCSQJCQkjIEVuZCBvZiBsaW5lLgorCQkJfW14JywKKwkJCSJcbiIuJHRoaXMtPmhhc2hCbG9jaygiPGhyJHRoaXMtPmVtcHR5X2VsZW1lbnRfc3VmZml4IikuIlxuIiwgCisJCQkkdGV4dCk7CisJfQorCisKKwl2YXIgJHNwYW5fZ2FtdXQgPSBhcnJheSgKKwkjCisJIyBUaGVzZSBhcmUgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBvY2N1ciAqd2l0aGluKiBibG9jay1sZXZlbAorCSMgdGFncyBsaWtlIHBhcmFncmFwaHMsIGhlYWRlcnMsIGFuZCBsaXN0IGl0ZW1zLgorCSMKKwkJIyBQcm9jZXNzIGNoYXJhY3RlciBlc2NhcGVzLCBjb2RlIHNwYW5zLCBhbmQgaW5saW5lIEhUTUwKKwkJIyBpbiBvbmUgc2hvdC4KKwkJInBhcnNlU3BhbiIgICAgICAgICAgID0+IC0zMCwKKworCQkjIFByb2Nlc3MgYW5jaG9yIGFuZCBpbWFnZSB0YWdzLiBJbWFnZXMgbXVzdCBjb21lIGZpcnN0LAorCQkjIGJlY2F1c2UgIVtmb29dW2ZdIGxvb2tzIGxpa2UgYW4gYW5jaG9yLgorCQkiZG9JbWFnZXMiICAgICAgICAgICAgPT4gIDEwLAorCQkiZG9BbmNob3JzIiAgICAgICAgICAgPT4gIDIwLAorCQkKKwkJIyBNYWtlIGxpbmtzIG91dCBvZiB0aGluZ3MgbGlrZSBgPGh0dHA6Ly9leGFtcGxlLmNvbS8+YAorCQkjIE11c3QgY29tZSBhZnRlciBkb0FuY2hvcnMsIGJlY2F1c2UgeW91IGNhbiB1c2UgPCBhbmQgPgorCQkjIGRlbGltaXRlcnMgaW4gaW5saW5lIGxpbmtzIGxpa2UgW3RoaXNdKDx1cmw+KS4KKwkJImRvQXV0b0xpbmtzIiAgICAgICAgID0+ICAzMCwKKwkJImVuY29kZUFtcHNBbmRBbmdsZXMiID0+ICA0MCwKKworCQkiZG9JdGFsaWNzQW5kQm9sZCIgICAgPT4gIDUwLAorCQkiZG9IYXJkQnJlYWtzIiAgICAgICAgPT4gIDYwLAorCQkpOworCisJZnVuY3Rpb24gcnVuU3BhbkdhbXV0KCR0ZXh0KSB7CisJIworCSMgUnVuIHNwYW4gZ2FtdXQgdHJhbmZvcm1hdGlvbnMuCisJIworCQlmb3JlYWNoICgkdGhpcy0+c3Bhbl9nYW11dCBhcyAkbWV0aG9kID0+ICRwcmlvcml0eSkgeworCQkJJHRleHQgPSAkdGhpcy0+JG1ldGhvZCgkdGV4dCk7CisJCX0KKworCQlyZXR1cm4gJHRleHQ7CisJfQorCQorCQorCWZ1bmN0aW9uIGRvSGFyZEJyZWFrcygkdGV4dCkgeworCQkjIERvIGhhcmQgYnJlYWtzOgorCQlyZXR1cm4gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvIHsyLH1cbi8nLCAKKwkJCWFycmF5KCYkdGhpcywgJ19kb0hhcmRCcmVha3NfY2FsbGJhY2snKSwgJHRleHQpOworCX0KKwlmdW5jdGlvbiBfZG9IYXJkQnJlYWtzX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCXJldHVybiAkdGhpcy0+aGFzaFBhcnQoIjxiciR0aGlzLT5lbXB0eV9lbGVtZW50X3N1ZmZpeFxuIik7CisJfQorCisKKwlmdW5jdGlvbiBkb0FuY2hvcnMoJHRleHQpIHsKKwkjCisJIyBUdXJuIE1hcmtkb3duIGxpbmsgc2hvcnRjdXRzIGludG8gWEhUTUwgPGE+IHRhZ3MuCisJIworCQlpZiAoJHRoaXMtPmluX2FuY2hvcikgcmV0dXJuICR0ZXh0OworCQkkdGhpcy0+aW5fYW5jaG9yID0gdHJ1ZTsKKwkJCisJCSMKKwkJIyBGaXJzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBsaW5rczogW2xpbmsgdGV4dF0gW2lkXQorCQkjCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CisJCQkoCQkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKKwkJCSAgXFsKKwkJCQkoJy4kdGhpcy0+bmVzdGVkX2JyYWNrZXRzX3JlLicpCSMgbGluayB0ZXh0ID0gJDIKKwkJCSAgXF0KKworCQkJICBbIF0/CQkJCSMgb25lIG9wdGlvbmFsIHNwYWNlCisJCQkgICg/OlxuWyBdKik/CQkjIG9uZSBvcHRpb25hbCBuZXdsaW5lIGZvbGxvd2VkIGJ5IHNwYWNlcworCisJCQkgIFxbCisJCQkJKC4qPykJCSMgaWQgPSAkMworCQkJICBcXQorCQkJKQorCQkJfXhzJywKKwkJCWFycmF5KCYkdGhpcywgJ19kb0FuY2hvcnNfcmVmZXJlbmNlX2NhbGxiYWNrJyksICR0ZXh0KTsKKworCQkjCisJCSMgTmV4dCwgaW5saW5lLXN0eWxlIGxpbmtzOiBbbGluayB0ZXh0XSh1cmwgIm9wdGlvbmFsIHRpdGxlIikKKwkJIworCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneworCQkJKAkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKKwkJCSAgXFsKKwkJCQkoJy4kdGhpcy0+bmVzdGVkX2JyYWNrZXRzX3JlLicpCSMgbGluayB0ZXh0ID0gJDIKKwkJCSAgXF0KKwkJCSAgXCgJCQkjIGxpdGVyYWwgcGFyZW4KKwkJCQlbIFxuXSoKKwkJCQkoPzoKKwkJCQkJPCguKz8pPgkjIGhyZWYgPSAkMworCQkJCXwKKwkJCQkJKCcuJHRoaXMtPm5lc3RlZF91cmxfcGFyZW50aGVzaXNfcmUuJykJIyBocmVmID0gJDQKKwkJCQkpCisJCQkJWyBcbl0qCisJCQkJKAkJCSMgJDUKKwkJCQkgIChbXCciXSkJIyBxdW90ZSBjaGFyID0gJDYKKwkJCQkgICguKj8pCQkjIFRpdGxlID0gJDcKKwkJCQkgIFw2CQkjIG1hdGNoaW5nIHF1b3RlCisJCQkJICBbIFxuXSoJIyBpZ25vcmUgYW55IHNwYWNlcy90YWJzIGJldHdlZW4gY2xvc2luZyBxdW90ZSBhbmQgKQorCQkJCSk/CQkJIyB0aXRsZSBpcyBvcHRpb25hbAorCQkJICBcKQorCQkJKQorCQkJfXhzJywKKwkJCWFycmF5KCYkdGhpcywgJ19kb0FuY2hvcnNfaW5saW5lX2NhbGxiYWNrJyksICR0ZXh0KTsKKworCQkjCisJCSMgTGFzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBzaG9ydGN1dHM6IFtsaW5rIHRleHRdCisJCSMgVGhlc2UgbXVzdCBjb21lIGxhc3QgaW4gY2FzZSB5b3UndmUgYWxzbyBnb3QgW2xpbmsgdGV4dF1bMV0KKwkJIyBvciBbbGluayB0ZXh0XSgvZm9vKQorCQkjCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CisJCQkoCQkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKKwkJCSAgXFsKKwkJCQkoW15cW1xdXSspCQkjIGxpbmsgdGV4dCA9ICQyOyBjYW5cJ3QgY29udGFpbiBbIG9yIF0KKwkJCSAgXF0KKwkJCSkKKwkJCX14cycsCisJCQlhcnJheSgmJHRoaXMsICdfZG9BbmNob3JzX3JlZmVyZW5jZV9jYWxsYmFjaycpLCAkdGV4dCk7CisKKwkJJHRoaXMtPmluX2FuY2hvciA9IGZhbHNlOworCQlyZXR1cm4gJHRleHQ7CisJfQorCWZ1bmN0aW9uIF9kb0FuY2hvcnNfcmVmZXJlbmNlX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSR3aG9sZV9tYXRjaCA9ICAkbWF0Y2hlc1sxXTsKKwkJJGxpbmtfdGV4dCAgID0gICRtYXRjaGVzWzJdOworCQkkbGlua19pZCAgICAgPSYgJG1hdGNoZXNbM107CisKKwkJaWYgKCRsaW5rX2lkID09ICIiKSB7CisJCQkjIGZvciBzaG9ydGN1dCBsaW5rcyBsaWtlIFt0aGlzXVtdIG9yIFt0aGlzXS4KKwkJCSRsaW5rX2lkID0gJGxpbmtfdGV4dDsKKwkJfQorCQkKKwkJIyBsb3dlci1jYXNlIGFuZCB0dXJuIGVtYmVkZGVkIG5ld2xpbmVzIGludG8gc3BhY2VzCisJCSRsaW5rX2lkID0gc3RydG9sb3dlcigkbGlua19pZCk7CisJCSRsaW5rX2lkID0gcHJlZ19yZXBsYWNlKCd7WyBdP1xufScsICcgJywgJGxpbmtfaWQpOworCisJCWlmIChpc3NldCgkdGhpcy0+dXJsc1skbGlua19pZF0pKSB7CisJCQkkdXJsID0gJHRoaXMtPnVybHNbJGxpbmtfaWRdOworCQkJJHVybCA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHVybCk7CisJCQkKKwkJCSRyZXN1bHQgPSAiPGEgaHJlZj1cIiR1cmxcIiI7CisJCQlpZiAoIGlzc2V0KCAkdGhpcy0+dGl0bGVzWyRsaW5rX2lkXSApICkgeworCQkJCSR0aXRsZSA9ICR0aGlzLT50aXRsZXNbJGxpbmtfaWRdOworCQkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKKwkJCQkkcmVzdWx0IC49ICAiIHRpdGxlPVwiJHRpdGxlXCIiOworCQkJfQorCQkKKwkJCSRsaW5rX3RleHQgPSAkdGhpcy0+cnVuU3BhbkdhbXV0KCRsaW5rX3RleHQpOworCQkJJHJlc3VsdCAuPSAiPiRsaW5rX3RleHQ8L2E+IjsKKwkJCSRyZXN1bHQgPSAkdGhpcy0+aGFzaFBhcnQoJHJlc3VsdCk7CisJCX0KKwkJZWxzZSB7CisJCQkkcmVzdWx0ID0gJHdob2xlX21hdGNoOworCQl9CisJCXJldHVybiAkcmVzdWx0OworCX0KKwlmdW5jdGlvbiBfZG9BbmNob3JzX2lubGluZV9jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkd2hvbGVfbWF0Y2gJPSAgJG1hdGNoZXNbMV07CisJCSRsaW5rX3RleHQJCT0gICR0aGlzLT5ydW5TcGFuR2FtdXQoJG1hdGNoZXNbMl0pOworCQkkdXJsCQkJPSAgJG1hdGNoZXNbM10gPT0gJycgPyAkbWF0Y2hlc1s0XSA6ICRtYXRjaGVzWzNdOworCQkkdGl0bGUJCQk9JiAkbWF0Y2hlc1s3XTsKKworCQkkdXJsID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkdXJsKTsKKworCQkkcmVzdWx0ID0gIjxhIGhyZWY9XCIkdXJsXCIiOworCQlpZiAoaXNzZXQoJHRpdGxlKSkgeworCQkJJHRpdGxlID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkdGl0bGUpOworCQkJJHJlc3VsdCAuPSAgIiB0aXRsZT1cIiR0aXRsZVwiIjsKKwkJfQorCQkKKwkJJGxpbmtfdGV4dCA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJGxpbmtfdGV4dCk7CisJCSRyZXN1bHQgLj0gIj4kbGlua190ZXh0PC9hPiI7CisKKwkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkcmVzdWx0KTsKKwl9CisKKworCWZ1bmN0aW9uIGRvSW1hZ2VzKCR0ZXh0KSB7CisJIworCSMgVHVybiBNYXJrZG93biBpbWFnZSBzaG9ydGN1dHMgaW50byA8aW1nPiB0YWdzLgorCSMKKwkJIworCQkjIEZpcnN0LCBoYW5kbGUgcmVmZXJlbmNlLXN0eWxlIGxhYmVsZWQgaW1hZ2VzOiAhW2FsdCB0ZXh0XVtpZF0KKwkJIworCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneworCQkJKAkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKKwkJCSAgIVxbCisJCQkJKCcuJHRoaXMtPm5lc3RlZF9icmFja2V0c19yZS4nKQkJIyBhbHQgdGV4dCA9ICQyCisJCQkgIFxdCisKKwkJCSAgWyBdPwkJCQkjIG9uZSBvcHRpb25hbCBzcGFjZQorCQkJICAoPzpcblsgXSopPwkJIyBvbmUgb3B0aW9uYWwgbmV3bGluZSBmb2xsb3dlZCBieSBzcGFjZXMKKworCQkJICBcWworCQkJCSguKj8pCQkjIGlkID0gJDMKKwkJCSAgXF0KKworCQkJKQorCQkJfXhzJywgCisJCQlhcnJheSgmJHRoaXMsICdfZG9JbWFnZXNfcmVmZXJlbmNlX2NhbGxiYWNrJyksICR0ZXh0KTsKKworCQkjCisJCSMgTmV4dCwgaGFuZGxlIGlubGluZSBpbWFnZXM6ICAhW2FsdCB0ZXh0XSh1cmwgIm9wdGlvbmFsIHRpdGxlIikKKwkJIyBEb24ndCBmb3JnZXQ6IGVuY29kZSAqIGFuZCBfCisJCSMKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCSgJCQkJIyB3cmFwIHdob2xlIG1hdGNoIGluICQxCisJCQkgICFcWworCQkJCSgnLiR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUuJykJCSMgYWx0IHRleHQgPSAkMgorCQkJICBcXQorCQkJICBccz8JCQkjIE9uZSBvcHRpb25hbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcgorCQkJICBcKAkJCSMgbGl0ZXJhbCBwYXJlbgorCQkJCVsgXG5dKgorCQkJCSg/OgorCQkJCQk8KFxTKik+CSMgc3JjIHVybCA9ICQzCisJCQkJfAorCQkJCQkoJy4kdGhpcy0+bmVzdGVkX3VybF9wYXJlbnRoZXNpc19yZS4nKQkjIHNyYyB1cmwgPSAkNAorCQkJCSkKKwkJCQlbIFxuXSoKKwkJCQkoCQkJIyAkNQorCQkJCSAgKFtcJyJdKQkjIHF1b3RlIGNoYXIgPSAkNgorCQkJCSAgKC4qPykJCSMgdGl0bGUgPSAkNworCQkJCSAgXDYJCSMgbWF0Y2hpbmcgcXVvdGUKKwkJCQkgIFsgXG5dKgorCQkJCSk/CQkJIyB0aXRsZSBpcyBvcHRpb25hbAorCQkJICBcKQorCQkJKQorCQkJfXhzJywKKwkJCWFycmF5KCYkdGhpcywgJ19kb0ltYWdlc19pbmxpbmVfY2FsbGJhY2snKSwgJHRleHQpOworCisJCXJldHVybiAkdGV4dDsKKwl9CisJZnVuY3Rpb24gX2RvSW1hZ2VzX3JlZmVyZW5jZV9jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkd2hvbGVfbWF0Y2ggPSAkbWF0Y2hlc1sxXTsKKwkJJGFsdF90ZXh0ICAgID0gJG1hdGNoZXNbMl07CisJCSRsaW5rX2lkICAgICA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbM10pOworCisJCWlmICgkbGlua19pZCA9PSAiIikgeworCQkJJGxpbmtfaWQgPSBzdHJ0b2xvd2VyKCRhbHRfdGV4dCk7ICMgZm9yIHNob3J0Y3V0IGxpbmtzIGxpa2UgIVt0aGlzXVtdLgorCQl9CisKKwkJJGFsdF90ZXh0ID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkYWx0X3RleHQpOworCQlpZiAoaXNzZXQoJHRoaXMtPnVybHNbJGxpbmtfaWRdKSkgeworCQkJJHVybCA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRoaXMtPnVybHNbJGxpbmtfaWRdKTsKKwkJCSRyZXN1bHQgPSAiPGltZyBzcmM9XCIkdXJsXCIgYWx0PVwiJGFsdF90ZXh0XCIiOworCQkJaWYgKGlzc2V0KCR0aGlzLT50aXRsZXNbJGxpbmtfaWRdKSkgeworCQkJCSR0aXRsZSA9ICR0aGlzLT50aXRsZXNbJGxpbmtfaWRdOworCQkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKKwkJCQkkcmVzdWx0IC49ICAiIHRpdGxlPVwiJHRpdGxlXCIiOworCQkJfQorCQkJJHJlc3VsdCAuPSAkdGhpcy0+ZW1wdHlfZWxlbWVudF9zdWZmaXg7CisJCQkkcmVzdWx0ID0gJHRoaXMtPmhhc2hQYXJ0KCRyZXN1bHQpOworCQl9CisJCWVsc2UgeworCQkJIyBJZiB0aGVyZSdzIG5vIHN1Y2ggbGluayBJRCwgbGVhdmUgaW50YWN0OgorCQkJJHJlc3VsdCA9ICR3aG9sZV9tYXRjaDsKKwkJfQorCisJCXJldHVybiAkcmVzdWx0OworCX0KKwlmdW5jdGlvbiBfZG9JbWFnZXNfaW5saW5lX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSR3aG9sZV9tYXRjaAk9ICRtYXRjaGVzWzFdOworCQkkYWx0X3RleHQJCT0gJG1hdGNoZXNbMl07CisJCSR1cmwJCQk9ICRtYXRjaGVzWzNdID09ICcnID8gJG1hdGNoZXNbNF0gOiAkbWF0Y2hlc1szXTsKKwkJJHRpdGxlCQkJPSYgJG1hdGNoZXNbN107CisKKwkJJGFsdF90ZXh0ID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkYWx0X3RleHQpOworCQkkdXJsID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkdXJsKTsKKwkJJHJlc3VsdCA9ICI8aW1nIHNyYz1cIiR1cmxcIiBhbHQ9XCIkYWx0X3RleHRcIiI7CisJCWlmIChpc3NldCgkdGl0bGUpKSB7CisJCQkkdGl0bGUgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR0aXRsZSk7CisJCQkkcmVzdWx0IC49ICAiIHRpdGxlPVwiJHRpdGxlXCIiOyAjICR0aXRsZSBhbHJlYWR5IHF1b3RlZAorCQl9CisJCSRyZXN1bHQgLj0gJHRoaXMtPmVtcHR5X2VsZW1lbnRfc3VmZml4OworCisJCXJldHVybiAkdGhpcy0+aGFzaFBhcnQoJHJlc3VsdCk7CisJfQorCisKKwlmdW5jdGlvbiBkb0hlYWRlcnMoJHRleHQpIHsKKwkJIyBTZXRleHQtc3R5bGUgaGVhZGVyczoKKwkJIwkgIEhlYWRlciAxCisJCSMJICA9PT09PT09PQorCQkjICAKKwkJIwkgIEhlYWRlciAyCisJCSMJICAtLS0tLS0tLQorCQkjCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7IF4oLis/KVsgXSpcbig9K3wtKylbIF0qXG4rIH1teCcsCisJCQlhcnJheSgmJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX3NldGV4dCcpLCAkdGV4dCk7CisKKwkJIyBhdHgtc3R5bGUgaGVhZGVyczoKKwkJIwkjIEhlYWRlciAxCisJCSMJIyMgSGVhZGVyIDIKKwkJIwkjIyBIZWFkZXIgMiB3aXRoIGNsb3NpbmcgaGFzaGVzICMjCisJCSMJLi4uCisJCSMJIyMjIyMjIEhlYWRlciA2CisJCSMKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCQleKFwjezEsNn0pCSMgJDEgPSBzdHJpbmcgb2YgI1wncworCQkJCVsgXSoKKwkJCQkoLis/KQkJIyAkMiA9IEhlYWRlciB0ZXh0CisJCQkJWyBdKgorCQkJCVwjKgkJCSMgb3B0aW9uYWwgY2xvc2luZyAjXCdzIChub3QgY291bnRlZCkKKwkJCQlcbisKKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX2F0eCcpLCAkdGV4dCk7CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfZG9IZWFkZXJzX2NhbGxiYWNrX3NldGV4dCgkbWF0Y2hlcykgeworCQkjIFRlcnJpYmxlIGhhY2sgdG8gY2hlY2sgd2UgaGF2ZW4ndCBmb3VuZCBhbiBlbXB0eSBsaXN0IGl0ZW0uCisJCWlmICgkbWF0Y2hlc1syXSA9PSAnLScgJiYgcHJlZ19tYXRjaCgne14tKD86IHwkKX0nLCAkbWF0Y2hlc1sxXSkpCisJCQlyZXR1cm4gJG1hdGNoZXNbMF07CisJCQorCQkkbGV2ZWwgPSAkbWF0Y2hlc1syXXswfSA9PSAnPScgPyAxIDogMjsKKwkJJGJsb2NrID0gIjxoJGxldmVsPiIuJHRoaXMtPnJ1blNwYW5HYW11dCgkbWF0Y2hlc1sxXSkuIjwvaCRsZXZlbD4iOworCQlyZXR1cm4gIlxuIiAuICR0aGlzLT5oYXNoQmxvY2soJGJsb2NrKSAuICJcblxuIjsKKwl9CisJZnVuY3Rpb24gX2RvSGVhZGVyc19jYWxsYmFja19hdHgoJG1hdGNoZXMpIHsKKwkJJGxldmVsID0gc3RybGVuKCRtYXRjaGVzWzFdKTsKKwkJJGJsb2NrID0gIjxoJGxldmVsPiIuJHRoaXMtPnJ1blNwYW5HYW11dCgkbWF0Y2hlc1syXSkuIjwvaCRsZXZlbD4iOworCQlyZXR1cm4gIlxuIiAuICR0aGlzLT5oYXNoQmxvY2soJGJsb2NrKSAuICJcblxuIjsKKwl9CisKKworCWZ1bmN0aW9uIGRvTGlzdHMoJHRleHQpIHsKKwkjCisJIyBGb3JtIEhUTUwgb3JkZXJlZCAobnVtYmVyZWQpIGFuZCB1bm9yZGVyZWQgKGJ1bGxldGVkKSBsaXN0cy4KKwkjCisJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aCAtIDE7CisKKwkJIyBSZS11c2FibGUgcGF0dGVybnMgdG8gbWF0Y2ggbGlzdCBpdGVtIGJ1bGxldHMgYW5kIG51bWJlciBtYXJrZXJzOgorCQkkbWFya2VyX3VsX3JlICA9ICdbKistXSc7CisJCSRtYXJrZXJfb2xfcmUgID0gJ1xkK1tcLl0nOworCQkkbWFya2VyX2FueV9yZSA9ICIoPzokbWFya2VyX3VsX3JlfCRtYXJrZXJfb2xfcmUpIjsKKworCQkkbWFya2Vyc19yZWxpc3QgPSBhcnJheSgKKwkJCSRtYXJrZXJfdWxfcmUgPT4gJG1hcmtlcl9vbF9yZSwKKwkJCSRtYXJrZXJfb2xfcmUgPT4gJG1hcmtlcl91bF9yZSwKKwkJCSk7CisKKwkJZm9yZWFjaCAoJG1hcmtlcnNfcmVsaXN0IGFzICRtYXJrZXJfcmUgPT4gJG90aGVyX21hcmtlcl9yZSkgeworCQkJIyBSZS11c2FibGUgcGF0dGVybiB0byBtYXRjaCBhbnkgZW50aXJlbCB1bCBvciBvbCBsaXN0OgorCQkJJHdob2xlX2xpc3RfcmUgPSAnCisJCQkJKAkJCQkJCQkJIyAkMSA9IHdob2xlIGxpc3QKKwkJCQkgICgJCQkJCQkJCSMgJDIKKwkJCQkJKFsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30pCSMgJDMgPSBudW1iZXIgb2Ygc3BhY2VzCisJCQkJCSgnLiRtYXJrZXJfcmUuJykJCQkjICQ0ID0gZmlyc3QgbGlzdCBpdGVtIG1hcmtlcgorCQkJCQlbIF0rCisJCQkJICApCisJCQkJICAoP3M6Lis/KQorCQkJCSAgKAkJCQkJCQkJIyAkNQorCQkJCQkgIFx6CisJCQkJCXwKKwkJCQkJICBcbnsyLH0KKwkJCQkJICAoPz1cUykKKwkJCQkJICAoPyEJCQkJCQkjIE5lZ2F0aXZlIGxvb2thaGVhZCBmb3IgYW5vdGhlciBsaXN0IGl0ZW0gbWFya2VyCisJCQkJCQlbIF0qCisJCQkJCQknLiRtYXJrZXJfcmUuJ1sgXSsKKwkJCQkJICApCisJCQkJCXwKKwkJCQkJICAoPz0JCQkJCQkjIExvb2thaGVhZCBmb3IgYW5vdGhlciBraW5kIG9mIGxpc3QKKwkJCQkJICAgIFxuCisJCQkJCQlcMwkJCQkJCSMgTXVzdCBoYXZlIHRoZSBzYW1lIGluZGVudGF0aW9uCisJCQkJCQknLiRvdGhlcl9tYXJrZXJfcmUuJ1sgXSsKKwkJCQkJICApCisJCQkJICApCisJCQkJKQorCQkJJzsgLy8gbXgKKwkJCQorCQkJIyBXZSB1c2UgYSBkaWZmZXJlbnQgcHJlZml4IGJlZm9yZSBuZXN0ZWQgbGlzdHMgdGhhbiB0b3AtbGV2ZWwgbGlzdHMuCisJCQkjIFNlZSBleHRlbmRlZCBjb21tZW50IGluIF9Qcm9jZXNzTGlzdEl0ZW1zKCkuCisJCQorCQkJaWYgKCR0aGlzLT5saXN0X2xldmVsKSB7CisJCQkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCQkJCV4KKwkJCQkJCScuJHdob2xlX2xpc3RfcmUuJworCQkJCQl9bXgnLAorCQkJCQlhcnJheSgmJHRoaXMsICdfZG9MaXN0c19jYWxsYmFjaycpLCAkdGV4dCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneworCQkJCQkJKD86KD88PVxuKVxufFxBXG4/KSAjIE11c3QgZWF0IHRoZSBuZXdsaW5lCisJCQkJCQknLiR3aG9sZV9saXN0X3JlLicKKwkJCQkJfW14JywKKwkJCQkJYXJyYXkoJiR0aGlzLCAnX2RvTGlzdHNfY2FsbGJhY2snKSwgJHRleHQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfZG9MaXN0c19jYWxsYmFjaygkbWF0Y2hlcykgeworCQkjIFJlLXVzYWJsZSBwYXR0ZXJucyB0byBtYXRjaCBsaXN0IGl0ZW0gYnVsbGV0cyBhbmQgbnVtYmVyIG1hcmtlcnM6CisJCSRtYXJrZXJfdWxfcmUgID0gJ1sqKy1dJzsKKwkJJG1hcmtlcl9vbF9yZSAgPSAnXGQrW1wuXSc7CisJCSRtYXJrZXJfYW55X3JlID0gIig/OiRtYXJrZXJfdWxfcmV8JG1hcmtlcl9vbF9yZSkiOworCQkKKwkJJGxpc3QgPSAkbWF0Y2hlc1sxXTsKKwkJJGxpc3RfdHlwZSA9IHByZWdfbWF0Y2goIi8kbWFya2VyX3VsX3JlLyIsICRtYXRjaGVzWzRdKSA/ICJ1bCIgOiAib2wiOworCQkKKwkJJG1hcmtlcl9hbnlfcmUgPSAoICRsaXN0X3R5cGUgPT0gInVsIiA/ICRtYXJrZXJfdWxfcmUgOiAkbWFya2VyX29sX3JlICk7CisJCQorCQkkbGlzdCAuPSAiXG4iOworCQkkcmVzdWx0ID0gJHRoaXMtPnByb2Nlc3NMaXN0SXRlbXMoJGxpc3QsICRtYXJrZXJfYW55X3JlKTsKKwkJCisJCSRyZXN1bHQgPSAkdGhpcy0+aGFzaEJsb2NrKCI8JGxpc3RfdHlwZT5cbiIgLiAkcmVzdWx0IC4gIjwvJGxpc3RfdHlwZT4iKTsKKwkJcmV0dXJuICJcbiIuICRyZXN1bHQgLiJcblxuIjsKKwl9CisKKwl2YXIgJGxpc3RfbGV2ZWwgPSAwOworCisJZnVuY3Rpb24gcHJvY2Vzc0xpc3RJdGVtcygkbGlzdF9zdHIsICRtYXJrZXJfYW55X3JlKSB7CisJIworCSMJUHJvY2VzcyB0aGUgY29udGVudHMgb2YgYSBzaW5nbGUgb3JkZXJlZCBvciB1bm9yZGVyZWQgbGlzdCwgc3BsaXR0aW5nIGl0CisJIwlpbnRvIGluZGl2aWR1YWwgbGlzdCBpdGVtcy4KKwkjCisJCSMgVGhlICR0aGlzLT5saXN0X2xldmVsIGdsb2JhbCBrZWVwcyB0cmFjayBvZiB3aGVuIHdlJ3JlIGluc2lkZSBhIGxpc3QuCisJCSMgRWFjaCB0aW1lIHdlIGVudGVyIGEgbGlzdCwgd2UgaW5jcmVtZW50IGl0OyB3aGVuIHdlIGxlYXZlIGEgbGlzdCwKKwkJIyB3ZSBkZWNyZW1lbnQuIElmIGl0J3MgemVybywgd2UncmUgbm90IGluIGEgbGlzdCBhbnltb3JlLgorCQkjCisJCSMgV2UgZG8gdGhpcyBiZWNhdXNlIHdoZW4gd2UncmUgbm90IGluc2lkZSBhIGxpc3QsIHdlIHdhbnQgdG8gdHJlYXQKKwkJIyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCQkjCisJCSMJCUkgcmVjb21tZW5kIHVwZ3JhZGluZyB0byB2ZXJzaW9uCisJCSMJCTguIE9vcHMsIG5vdyB0aGlzIGxpbmUgaXMgdHJlYXRlZAorCQkjCQlhcyBhIHN1Yi1saXN0LgorCQkjCisJCSMgQXMgYSBzaW5nbGUgcGFyYWdyYXBoLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIHNlY29uZCBsaW5lIHN0YXJ0cworCQkjIHdpdGggYSBkaWdpdC1wZXJpb2Qtc3BhY2Ugc2VxdWVuY2UuCisJCSMKKwkJIyBXaGVyZWFzIHdoZW4gd2UncmUgaW5zaWRlIGEgbGlzdCAob3Igc3ViLWxpc3QpLCB0aGF0IGxpbmUgd2lsbCBiZQorCQkjIHRyZWF0ZWQgYXMgdGhlIHN0YXJ0IG9mIGEgc3ViLWxpc3QuIFdoYXQgYSBrbHVkZ2UsIGh1aD8gVGhpcyBpcworCQkjIGFuIGFzcGVjdCBvZiBNYXJrZG93bidzIHN5bnRheCB0aGF0J3MgaGFyZCB0byBwYXJzZSBwZXJmZWN0bHkKKwkJIyB3aXRob3V0IHJlc29ydGluZyB0byBtaW5kLXJlYWRpbmcuIFBlcmhhcHMgdGhlIHNvbHV0aW9uIGlzIHRvCisJCSMgY2hhbmdlIHRoZSBzeW50YXggcnVsZXMgc3VjaCB0aGF0IHN1Yi1saXN0cyBtdXN0IHN0YXJ0IHdpdGggYQorCQkjIHN0YXJ0aW5nIGNhcmRpbmFsIG51bWJlcjsgZS5nLiAiMS4iIG9yICJhLiIuCisJCQorCQkkdGhpcy0+bGlzdF9sZXZlbCsrOworCisJCSMgdHJpbSB0cmFpbGluZyBibGFuayBsaW5lczoKKwkJJGxpc3Rfc3RyID0gcHJlZ19yZXBsYWNlKCIvXG57Mix9XFx6LyIsICJcbiIsICRsaXN0X3N0cik7CisKKwkJJGxpc3Rfc3RyID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CisJCQkoXG4pPwkJCQkJCQkjIGxlYWRpbmcgbGluZSA9ICQxCisJCQkoXlsgXSopCQkJCQkJCSMgbGVhZGluZyB3aGl0ZXNwYWNlID0gJDIKKwkJCSgnLiRtYXJrZXJfYW55X3JlLicJCQkJIyBsaXN0IG1hcmtlciBhbmQgc3BhY2UgPSAkMworCQkJCSg/OlsgXSt8KD89XG4pKQkjIHNwYWNlIG9ubHkgcmVxdWlyZWQgaWYgaXRlbSBpcyBub3QgZW1wdHkKKwkJCSkKKwkJCSgoP3M6Lio/KSkJCQkJCQkjIGxpc3QgaXRlbSB0ZXh0ICAgPSAkNAorCQkJKD86KFxuKyg/PVxuKSl8XG4pCQkJCSMgdGFpbGluZyBibGFuayBsaW5lID0gJDUKKwkJCSg/PSBcbiogKFx6IHwgXDIgKCcuJG1hcmtlcl9hbnlfcmUuJykgKD86WyBdK3woPz1cbikpKSkKKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfcHJvY2Vzc0xpc3RJdGVtc19jYWxsYmFjaycpLCAkbGlzdF9zdHIpOworCisJCSR0aGlzLT5saXN0X2xldmVsLS07CisJCXJldHVybiAkbGlzdF9zdHI7CisJfQorCWZ1bmN0aW9uIF9wcm9jZXNzTGlzdEl0ZW1zX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSRpdGVtID0gJG1hdGNoZXNbNF07CisJCSRsZWFkaW5nX2xpbmUgPSYgJG1hdGNoZXNbMV07CisJCSRsZWFkaW5nX3NwYWNlID0mICRtYXRjaGVzWzJdOworCQkkbWFya2VyX3NwYWNlID0gJG1hdGNoZXNbM107CisJCSR0YWlsaW5nX2JsYW5rX2xpbmUgPSYgJG1hdGNoZXNbNV07CisKKwkJaWYgKCRsZWFkaW5nX2xpbmUgfHwgJHRhaWxpbmdfYmxhbmtfbGluZSB8fCAKKwkJCXByZWdfbWF0Y2goJy9cbnsyLH0vJywgJGl0ZW0pKQorCQl7CisJCQkjIFJlcGxhY2UgbWFya2VyIHdpdGggdGhlIGFwcHJvcHJpYXRlIHdoaXRlc3BhY2UgaW5kZW50YXRpb24KKwkJCSRpdGVtID0gJGxlYWRpbmdfc3BhY2UgLiBzdHJfcmVwZWF0KCcgJywgc3RybGVuKCRtYXJrZXJfc3BhY2UpKSAuICRpdGVtOworCQkJJGl0ZW0gPSAkdGhpcy0+cnVuQmxvY2tHYW11dCgkdGhpcy0+b3V0ZGVudCgkaXRlbSkuIlxuIik7CisJCX0KKwkJZWxzZSB7CisJCQkjIFJlY3Vyc2lvbiBmb3Igc3ViLWxpc3RzOgorCQkJJGl0ZW0gPSAkdGhpcy0+ZG9MaXN0cygkdGhpcy0+b3V0ZGVudCgkaXRlbSkpOworCQkJJGl0ZW0gPSBwcmVnX3JlcGxhY2UoJy9cbiskLycsICcnLCAkaXRlbSk7CisJCQkkaXRlbSA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJGl0ZW0pOworCQl9CisKKwkJcmV0dXJuICI8bGk+IiAuICRpdGVtIC4gIjwvbGk+XG4iOworCX0KKworCisJZnVuY3Rpb24gZG9Db2RlQmxvY2tzKCR0ZXh0KSB7CisJIworCSMJUHJvY2VzcyBNYXJrZG93biBgPHByZT48Y29kZT5gIGJsb2Nrcy4KKwkjCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CisJCQkJKD86XG5cbnxcQVxuPykKKwkJCQkoCSAgICAgICAgICAgICMgJDEgPSB0aGUgY29kZSBibG9jayAtLSBvbmUgb3IgbW9yZSBsaW5lcywgc3RhcnRpbmcgd2l0aCBhIHNwYWNlL3RhYgorCQkJCSAgKD8+CisJCQkJCVsgXXsnLiR0aGlzLT50YWJfd2lkdGguJ30gICMgTGluZXMgbXVzdCBzdGFydCB3aXRoIGEgdGFiIG9yIGEgdGFiLXdpZHRoIG9mIHNwYWNlcworCQkJCQkuKlxuKworCQkJCSAgKSsKKwkJCQkpCisJCQkJKCg/PV5bIF17MCwnLiR0aGlzLT50YWJfd2lkdGguJ31cUyl8XFopCSMgTG9va2FoZWFkIGZvciBub24tc3BhY2UgYXQgbGluZS1zdGFydCwgb3IgZW5kIG9mIGRvYworCQkJfXhtJywKKwkJCWFycmF5KCYkdGhpcywgJ19kb0NvZGVCbG9ja3NfY2FsbGJhY2snKSwgJHRleHQpOworCisJCXJldHVybiAkdGV4dDsKKwl9CisJZnVuY3Rpb24gX2RvQ29kZUJsb2Nrc19jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkY29kZWJsb2NrID0gJG1hdGNoZXNbMV07CisKKwkJJGNvZGVibG9jayA9ICR0aGlzLT5vdXRkZW50KCRjb2RlYmxvY2spOworCQkkY29kZWJsb2NrID0gaHRtbHNwZWNpYWxjaGFycygkY29kZWJsb2NrLCBFTlRfTk9RVU9URVMpOworCisJCSMgdHJpbSBsZWFkaW5nIG5ld2xpbmVzIGFuZCB0cmFpbGluZyBuZXdsaW5lcworCQkkY29kZWJsb2NrID0gcHJlZ19yZXBsYWNlKCcvXEFcbit8XG4rXHovJywgJycsICRjb2RlYmxvY2spOworCisJCSRjb2RlYmxvY2sgPSAiPHByZT48Y29kZT4kY29kZWJsb2NrXG48L2NvZGU+PC9wcmU+IjsKKwkJcmV0dXJuICJcblxuIi4kdGhpcy0+aGFzaEJsb2NrKCRjb2RlYmxvY2spLiJcblxuIjsKKwl9CisKKworCWZ1bmN0aW9uIG1ha2VDb2RlU3BhbigkY29kZSkgeworCSMKKwkjIENyZWF0ZSBhIGNvZGUgc3BhbiBtYXJrdXAgZm9yICRjb2RlLiBDYWxsZWQgZnJvbSBoYW5kbGVTcGFuVG9rZW4uCisJIworCQkkY29kZSA9IGh0bWxzcGVjaWFsY2hhcnModHJpbSgkY29kZSksIEVOVF9OT1FVT1RFUyk7CisJCXJldHVybiAkdGhpcy0+aGFzaFBhcnQoIjxjb2RlPiRjb2RlPC9jb2RlPiIpOworCX0KKworCisJdmFyICRlbV9yZWxpc3QgPSBhcnJheSgKKwkJJycgID0+ICcoPzooPzwhXCopXCooPyFcKil8KD88IV8pXyg/IV8pKSg/PVxTfCQpKD8hW1wuLDo7XVxzKScsCisJCScqJyA9PiAnKD88PVxTfF4pKD88IVwqKVwqKD8hXCopJywKKwkJJ18nID0+ICcoPzw9XFN8XikoPzwhXylfKD8hXyknLAorCQkpOworCXZhciAkc3Ryb25nX3JlbGlzdCA9IGFycmF5KAorCQknJyAgID0+ICcoPzooPzwhXCopXCpcKig/IVwqKXwoPzwhXylfXyg/IV8pKSg/PVxTfCQpKD8hW1wuLDo7XVxzKScsCisJCScqKicgPT4gJyg/PD1cU3xeKSg/PCFcKilcKlwqKD8hXCopJywKKwkJJ19fJyA9PiAnKD88PVxTfF4pKD88IV8pX18oPyFfKScsCisJCSk7CisJdmFyICRlbV9zdHJvbmdfcmVsaXN0ID0gYXJyYXkoCisJCScnICAgID0+ICcoPzooPzwhXCopXCpcKlwqKD8hXCopfCg/PCFfKV9fXyg/IV8pKSg/PVxTfCQpKD8hW1wuLDo7XVxzKScsCisJCScqKionID0+ICcoPzw9XFN8XikoPzwhXCopXCpcKlwqKD8hXCopJywKKwkJJ19fXycgPT4gJyg/PD1cU3xeKSg/PCFfKV9fXyg/IV8pJywKKwkJKTsKKwl2YXIgJGVtX3N0cm9uZ19wcmVwYXJlZF9yZWxpc3Q7CisJCisJZnVuY3Rpb24gcHJlcGFyZUl0YWxpY3NBbmRCb2xkKCkgeworCSMKKwkjIFByZXBhcmUgcmVndWxhciBleHByZXNzaW9ucyBmb3Igc2VhcmNoaW5nIGVtcGhhc2lzIHRva2VucyBpbiBhbnkKKwkjIGNvbnRleHQuCisJIworCQlmb3JlYWNoICgkdGhpcy0+ZW1fcmVsaXN0IGFzICRlbSA9PiAkZW1fcmUpIHsKKwkJCWZvcmVhY2ggKCR0aGlzLT5zdHJvbmdfcmVsaXN0IGFzICRzdHJvbmcgPT4gJHN0cm9uZ19yZSkgeworCQkJCSMgQ29uc3RydWN0IGxpc3Qgb2YgYWxsb3dlZCB0b2tlbiBleHByZXNzaW9ucy4KKwkJCQkkdG9rZW5fcmVsaXN0ID0gYXJyYXkoKTsKKwkJCQlpZiAoaXNzZXQoJHRoaXMtPmVtX3N0cm9uZ19yZWxpc3RbIiRlbSRzdHJvbmciXSkpIHsKKwkJCQkJJHRva2VuX3JlbGlzdFtdID0gJHRoaXMtPmVtX3N0cm9uZ19yZWxpc3RbIiRlbSRzdHJvbmciXTsKKwkJCQl9CisJCQkJJHRva2VuX3JlbGlzdFtdID0gJGVtX3JlOworCQkJCSR0b2tlbl9yZWxpc3RbXSA9ICRzdHJvbmdfcmU7CisJCQkJCisJCQkJIyBDb25zdHJ1Y3QgbWFzdGVyIGV4cHJlc3Npb24gZnJvbSBsaXN0LgorCQkJCSR0b2tlbl9yZSA9ICd7KCcuIGltcGxvZGUoJ3wnLCAkdG9rZW5fcmVsaXN0KSAuJyl9JzsKKwkJCQkkdGhpcy0+ZW1fc3Ryb25nX3ByZXBhcmVkX3JlbGlzdFsiJGVtJHN0cm9uZyJdID0gJHRva2VuX3JlOworCQkJfQorCQl9CisJfQorCQorCWZ1bmN0aW9uIGRvSXRhbGljc0FuZEJvbGQoJHRleHQpIHsKKwkJJHRva2VuX3N0YWNrID0gYXJyYXkoJycpOworCQkkdGV4dF9zdGFjayA9IGFycmF5KCcnKTsKKwkJJGVtID0gJyc7CisJCSRzdHJvbmcgPSAnJzsKKwkJJHRyZWVfY2hhcl9lbSA9IGZhbHNlOworCQkKKwkJd2hpbGUgKDEpIHsKKwkJCSMKKwkJCSMgR2V0IHByZXBhcmVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc2VyYWNoaW5nIGVtcGhhc2lzIHRva2VucworCQkJIyBpbiBjdXJyZW50IGNvbnRleHQuCisJCQkjCisJCQkkdG9rZW5fcmUgPSAkdGhpcy0+ZW1fc3Ryb25nX3ByZXBhcmVkX3JlbGlzdFsiJGVtJHN0cm9uZyJdOworCQkJCisJCQkjCisJCQkjIEVhY2ggbG9vcCBpdGVyYXRpb24gc2VhcmNoIGZvciB0aGUgbmV4dCBlbXBoYXNpcyB0b2tlbi4gCisJCQkjIEVhY2ggdG9rZW4gaXMgdGhlbiBwYXNzZWQgdG8gaGFuZGxlU3BhblRva2VuLgorCQkJIworCQkJJHBhcnRzID0gcHJlZ19zcGxpdCgkdG9rZW5fcmUsICR0ZXh0LCAyLCBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOworCQkJJHRleHRfc3RhY2tbMF0gLj0gJHBhcnRzWzBdOworCQkJJHRva2VuID0mICRwYXJ0c1sxXTsKKwkJCSR0ZXh0ID0mICRwYXJ0c1syXTsKKwkJCQorCQkJaWYgKGVtcHR5KCR0b2tlbikpIHsKKwkJCQkjIFJlYWNoZWQgZW5kIG9mIHRleHQgc3BhbjogZW1wdHkgc3RhY2sgd2l0aG91dCBlbWl0dGluZy4KKwkJCQkjIGFueSBtb3JlIGVtcGhhc2lzLgorCQkJCXdoaWxlICgkdG9rZW5fc3RhY2tbMF0pIHsKKwkJCQkJJHRleHRfc3RhY2tbMV0gLj0gYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKKwkJCQkJJHRleHRfc3RhY2tbMF0gLj0gYXJyYXlfc2hpZnQoJHRleHRfc3RhY2spOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJJHRva2VuX2xlbiA9IHN0cmxlbigkdG9rZW4pOworCQkJaWYgKCR0cmVlX2NoYXJfZW0pIHsKKwkJCQkjIFJlYWNoZWQgY2xvc2luZyBtYXJrZXIgd2hpbGUgaW5zaWRlIGEgdGhyZWUtY2hhciBlbXBoYXNpcy4KKwkJCQlpZiAoJHRva2VuX2xlbiA9PSAzKSB7CisJCQkJCSMgVGhyZWUtY2hhciBjbG9zaW5nIG1hcmtlciwgY2xvc2UgZW0gYW5kIHN0cm9uZy4KKwkJCQkJYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKKwkJCQkJJHNwYW4gPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CisJCQkJCSRzcGFuID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkc3Bhbik7CisJCQkJCSRzcGFuID0gIjxzdHJvbmc+PGVtPiRzcGFuPC9lbT48L3N0cm9uZz4iOworCQkJCQkkdGV4dF9zdGFja1swXSAuPSAkdGhpcy0+aGFzaFBhcnQoJHNwYW4pOworCQkJCQkkZW0gPSAnJzsKKwkJCQkJJHN0cm9uZyA9ICcnOworCQkJCX0gZWxzZSB7CisJCQkJCSMgT3RoZXIgY2xvc2luZyBtYXJrZXI6IGNsb3NlIG9uZSBlbSBvciBzdHJvbmcgYW5kCisJCQkJCSMgY2hhbmdlIGN1cnJlbnQgdG9rZW4gc3RhdGUgdG8gbWF0Y2ggdGhlIG90aGVyCisJCQkJCSR0b2tlbl9zdGFja1swXSA9IHN0cl9yZXBlYXQoJHRva2VuezB9LCAzLSR0b2tlbl9sZW4pOworCQkJCQkkdGFnID0gJHRva2VuX2xlbiA9PSAyID8gInN0cm9uZyIgOiAiZW0iOworCQkJCQkkc3BhbiA9ICR0ZXh0X3N0YWNrWzBdOworCQkJCQkkc3BhbiA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJHNwYW4pOworCQkJCQkkc3BhbiA9ICI8JHRhZz4kc3BhbjwvJHRhZz4iOworCQkJCQkkdGV4dF9zdGFja1swXSA9ICR0aGlzLT5oYXNoUGFydCgkc3Bhbik7CisJCQkJCSQkdGFnID0gJyc7ICMgJCR0YWcgc3RhbmRzIGZvciAkZW0gb3IgJHN0cm9uZworCQkJCX0KKwkJCQkkdHJlZV9jaGFyX2VtID0gZmFsc2U7CisJCQl9IGVsc2UgaWYgKCR0b2tlbl9sZW4gPT0gMykgeworCQkJCWlmICgkZW0pIHsKKwkJCQkJIyBSZWFjaGVkIGNsb3NpbmcgbWFya2VyIGZvciBib3RoIGVtIGFuZCBzdHJvbmcuCisJCQkJCSMgQ2xvc2luZyBzdHJvbmcgbWFya2VyOgorCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAyOyArKyRpKSB7CisJCQkJCQkkc2hpZnRlZF90b2tlbiA9IGFycmF5X3NoaWZ0KCR0b2tlbl9zdGFjayk7CisJCQkJCQkkdGFnID0gc3RybGVuKCRzaGlmdGVkX3Rva2VuKSA9PSAyID8gInN0cm9uZyIgOiAiZW0iOworCQkJCQkJJHNwYW4gPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CisJCQkJCQkkc3BhbiA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJHNwYW4pOworCQkJCQkJJHNwYW4gPSAiPCR0YWc+JHNwYW48LyR0YWc+IjsKKwkJCQkJCSR0ZXh0X3N0YWNrWzBdIC49ICR0aGlzLT5oYXNoUGFydCgkc3Bhbik7CisJCQkJCQkkJHRhZyA9ICcnOyAjICQkdGFnIHN0YW5kcyBmb3IgJGVtIG9yICRzdHJvbmcKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCSMgUmVhY2hlZCBvcGVuaW5nIHRocmVlLWNoYXIgZW1waGFzaXMgbWFya2VyLiBQdXNoIG9uIHRva2VuIAorCQkJCQkjIHN0YWNrOyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIHNwZWNpYWwgY29uZGl0aW9uIGFib3ZlLgorCQkJCQkkZW0gPSAkdG9rZW57MH07CisJCQkJCSRzdHJvbmcgPSAiJGVtJGVtIjsKKwkJCQkJYXJyYXlfdW5zaGlmdCgkdG9rZW5fc3RhY2ssICR0b2tlbik7CisJCQkJCWFycmF5X3Vuc2hpZnQoJHRleHRfc3RhY2ssICcnKTsKKwkJCQkJJHRyZWVfY2hhcl9lbSA9IHRydWU7CisJCQkJfQorCQkJfSBlbHNlIGlmICgkdG9rZW5fbGVuID09IDIpIHsKKwkJCQlpZiAoJHN0cm9uZykgeworCQkJCQkjIFVud2luZCBhbnkgZGFuZ2xpbmcgZW1waGFzaXMgbWFya2VyOgorCQkJCQlpZiAoc3RybGVuKCR0b2tlbl9zdGFja1swXSkgPT0gMSkgeworCQkJCQkJJHRleHRfc3RhY2tbMV0gLj0gYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKKwkJCQkJCSR0ZXh0X3N0YWNrWzBdIC49IGFycmF5X3NoaWZ0KCR0ZXh0X3N0YWNrKTsKKwkJCQkJfQorCQkJCQkjIENsb3Npbmcgc3Ryb25nIG1hcmtlcjoKKwkJCQkJYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKKwkJCQkJJHNwYW4gPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CisJCQkJCSRzcGFuID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkc3Bhbik7CisJCQkJCSRzcGFuID0gIjxzdHJvbmc+JHNwYW48L3N0cm9uZz4iOworCQkJCQkkdGV4dF9zdGFja1swXSAuPSAkdGhpcy0+aGFzaFBhcnQoJHNwYW4pOworCQkJCQkkc3Ryb25nID0gJyc7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXJyYXlfdW5zaGlmdCgkdG9rZW5fc3RhY2ssICR0b2tlbik7CisJCQkJCWFycmF5X3Vuc2hpZnQoJHRleHRfc3RhY2ssICcnKTsKKwkJCQkJJHN0cm9uZyA9ICR0b2tlbjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCSMgSGVyZSAkdG9rZW5fbGVuID09IDEKKwkJCQlpZiAoJGVtKSB7CisJCQkJCWlmIChzdHJsZW4oJHRva2VuX3N0YWNrWzBdKSA9PSAxKSB7CisJCQkJCQkjIENsb3NpbmcgZW1waGFzaXMgbWFya2VyOgorCQkJCQkJYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKKwkJCQkJCSRzcGFuID0gYXJyYXlfc2hpZnQoJHRleHRfc3RhY2spOworCQkJCQkJJHNwYW4gPSAkdGhpcy0+cnVuU3BhbkdhbXV0KCRzcGFuKTsKKwkJCQkJCSRzcGFuID0gIjxlbT4kc3BhbjwvZW0+IjsKKwkJCQkJCSR0ZXh0X3N0YWNrWzBdIC49ICR0aGlzLT5oYXNoUGFydCgkc3Bhbik7CisJCQkJCQkkZW0gPSAnJzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSR0ZXh0X3N0YWNrWzBdIC49ICR0b2tlbjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWFycmF5X3Vuc2hpZnQoJHRva2VuX3N0YWNrLCAkdG9rZW4pOworCQkJCQlhcnJheV91bnNoaWZ0KCR0ZXh0X3N0YWNrLCAnJyk7CisJCQkJCSRlbSA9ICR0b2tlbjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuICR0ZXh0X3N0YWNrWzBdOworCX0KKworCisJZnVuY3Rpb24gZG9CbG9ja1F1b3RlcygkdGV4dCkgeworCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLworCQkJICAoCQkJCQkJCQkjIFdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKKwkJCQkoPz4KKwkJCQkgIF5bIF0qPlsgXT8JCQkjICI+IiBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lCisJCQkJCS4rXG4JCQkJCSMgcmVzdCBvZiB0aGUgZmlyc3QgbGluZQorCQkJCSAgKC4rXG4pKgkJCQkJIyBzdWJzZXF1ZW50IGNvbnNlY3V0aXZlIGxpbmVzCisJCQkJICBcbioJCQkJCQkjIGJsYW5rcworCQkJCSkrCisJCQkgICkKKwkJCS94bScsCisJCQlhcnJheSgmJHRoaXMsICdfZG9CbG9ja1F1b3Rlc19jYWxsYmFjaycpLCAkdGV4dCk7CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfZG9CbG9ja1F1b3Rlc19jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkYnEgPSAkbWF0Y2hlc1sxXTsKKwkJIyB0cmltIG9uZSBsZXZlbCBvZiBxdW90aW5nIC0gdHJpbSB3aGl0ZXNwYWNlLW9ubHkgbGluZXMKKwkJJGJxID0gcHJlZ19yZXBsYWNlKCcvXlsgXSo+WyBdP3xeWyBdKyQvbScsICcnLCAkYnEpOworCQkkYnEgPSAkdGhpcy0+cnVuQmxvY2tHYW11dCgkYnEpOwkJIyByZWN1cnNlCisKKwkJJGJxID0gcHJlZ19yZXBsYWNlKCcvXi9tJywgIiAgIiwgJGJxKTsKKwkJIyBUaGVzZSBsZWFkaW5nIHNwYWNlcyBjYXVzZSBwcm9ibGVtIHdpdGggPHByZT4gY29udGVudCwgCisJCSMgc28gd2UgbmVlZCB0byBmaXggdGhhdDoKKwkJJGJxID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7KFxzKjxwcmU+Lis/PC9wcmU+KX1zeCcsIAorCQkJYXJyYXkoJiR0aGlzLCAnX2RvQmxvY2tRdW90ZXNfY2FsbGJhY2syJyksICRicSk7CisKKwkJcmV0dXJuICJcbiIuICR0aGlzLT5oYXNoQmxvY2soIjxibG9ja3F1b3RlPlxuJGJxXG48L2Jsb2NrcXVvdGU+IikuIlxuXG4iOworCX0KKwlmdW5jdGlvbiBfZG9CbG9ja1F1b3Rlc19jYWxsYmFjazIoJG1hdGNoZXMpIHsKKwkJJHByZSA9ICRtYXRjaGVzWzFdOworCQkkcHJlID0gcHJlZ19yZXBsYWNlKCcvXiAgL20nLCAnJywgJHByZSk7CisJCXJldHVybiAkcHJlOworCX0KKworCisJZnVuY3Rpb24gZm9ybVBhcmFncmFwaHMoJHRleHQpIHsKKwkjCisJIwlQYXJhbXM6CisJIwkJJHRleHQgLSBzdHJpbmcgdG8gcHJvY2VzcyB3aXRoIGh0bWwgPHA+IHRhZ3MKKwkjCisJCSMgU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgbGluZXM6CisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvXEFcbit8XG4rXHovJywgJycsICR0ZXh0KTsKKworCQkkZ3JhZnMgPSBwcmVnX3NwbGl0KCcvXG57Mix9LycsICR0ZXh0LCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7CisKKwkJIworCQkjIFdyYXAgPHA+IHRhZ3MgYW5kIHVuaGFzaGlmeSBIVE1MIGJsb2NrcworCQkjCisJCWZvcmVhY2ggKCRncmFmcyBhcyAka2V5ID0+ICR2YWx1ZSkgeworCQkJaWYgKCFwcmVnX21hdGNoKCcvXkJceDFBWzAtOV0rQiQvJywgJHZhbHVlKSkgeworCQkJCSMgSXMgYSBwYXJhZ3JhcGguCisJCQkJJHZhbHVlID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkdmFsdWUpOworCQkJCSR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL14oWyBdKikvJywgIjxwPiIsICR2YWx1ZSk7CisJCQkJJHZhbHVlIC49ICI8L3A+IjsKKwkJCQkkZ3JhZnNbJGtleV0gPSAkdGhpcy0+dW5oYXNoKCR2YWx1ZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQkjIElzIGEgYmxvY2suCisJCQkJIyBNb2RpZnkgZWxlbWVudHMgb2YgQGdyYWZzIGluLXBsYWNlLi4uCisJCQkJJGdyYWYgPSAkdmFsdWU7CisJCQkJJGJsb2NrID0gJHRoaXMtPmh0bWxfaGFzaGVzWyRncmFmXTsKKwkJCQkkZ3JhZiA9ICRibG9jazsKKy8vCQkJCWlmIChwcmVnX21hdGNoKCd7CisvLwkJCQkJXEEKKy8vCQkJCQkoCQkJCQkJCSMgJDEgPSA8ZGl2PiB0YWcKKy8vCQkJCQkgIDxkaXYgIFxzKworLy8JCQkJCSAgW14+XSoKKy8vCQkJCQkgIFxiCisvLwkJCQkJICBtYXJrZG93blxzKj1ccyogIChbXCciXSkJIwkkMiA9IGF0dHIgcXVvdGUgY2hhcgorLy8JCQkJCSAgMQorLy8JCQkJCSAgXDIKKy8vCQkJCQkgIFtePl0qCisvLwkJCQkJICA+CisvLwkJCQkJKQorLy8JCQkJCSgJCQkJCQkJIyAkMyA9IGNvbnRlbnRzCisvLwkJCQkJLioKKy8vCQkJCQkpCisvLwkJCQkJKDwvZGl2PikJCQkJCSMgJDQgPSBjbG9zaW5nIHRhZworLy8JCQkJCVx6CisvLwkJCQkJfXhzJywgJGJsb2NrLCAkbWF0Y2hlcykpCisvLwkJCQl7CisvLwkJCQkJbGlzdCgsICRkaXZfb3BlbiwgLCAkZGl2X2NvbnRlbnQsICRkaXZfY2xvc2UpID0gJG1hdGNoZXM7CisvLworLy8JCQkJCSMgV2UgY2FuJ3QgY2FsbCBNYXJrZG93bigpLCBiZWNhdXNlIHRoYXQgcmVzZXRzIHRoZSBoYXNoOworLy8JCQkJCSMgdGhhdCBpbml0aWFsaXphdGlvbiBjb2RlIHNob3VsZCBiZSBwdWxsZWQgaW50byBpdHMgb3duIHN1YiwgdGhvdWdoLgorLy8JCQkJCSRkaXZfY29udGVudCA9ICR0aGlzLT5oYXNoSFRNTEJsb2NrcygkZGl2X2NvbnRlbnQpOworLy8JCQkJCQorLy8JCQkJCSMgUnVuIGRvY3VtZW50IGdhbXV0IG1ldGhvZHMgb24gdGhlIGNvbnRlbnQuCisvLwkJCQkJZm9yZWFjaCAoJHRoaXMtPmRvY3VtZW50X2dhbXV0IGFzICRtZXRob2QgPT4gJHByaW9yaXR5KSB7CisvLwkJCQkJCSRkaXZfY29udGVudCA9ICR0aGlzLT4kbWV0aG9kKCRkaXZfY29udGVudCk7CisvLwkJCQkJfQorLy8KKy8vCQkJCQkkZGl2X29wZW4gPSBwcmVnX3JlcGxhY2UoCisvLwkJCQkJCSd7XHNtYXJrZG93blxzKj1ccyooW1wnIl0pLis/XDF9JywgJycsICRkaXZfb3Blbik7CisvLworLy8JCQkJCSRncmFmID0gJGRpdl9vcGVuIC4gIlxuIiAuICRkaXZfY29udGVudCAuICJcbiIgLiAkZGl2X2Nsb3NlOworLy8JCQkJfQorCQkJCSRncmFmc1ska2V5XSA9ICRncmFmOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGltcGxvZGUoIlxuXG4iLCAkZ3JhZnMpOworCX0KKworCisJZnVuY3Rpb24gZW5jb2RlQXR0cmlidXRlKCR0ZXh0KSB7CisJIworCSMgRW5jb2RlIHRleHQgZm9yIGEgZG91YmxlLXF1b3RlZCBIVE1MIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbgorCSMgaXMgKm5vdCogc3VpdGFibGUgZm9yIGF0dHJpYnV0ZXMgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3Rlcy4KKwkjCisJCSR0ZXh0ID0gJHRoaXMtPmVuY29kZUFtcHNBbmRBbmdsZXMoJHRleHQpOworCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCciJywgJyZxdW90OycsICR0ZXh0KTsKKwkJcmV0dXJuICR0ZXh0OworCX0KKwkKKwkKKwlmdW5jdGlvbiBlbmNvZGVBbXBzQW5kQW5nbGVzKCR0ZXh0KSB7CisJIworCSMgU21hcnQgcHJvY2Vzc2luZyBmb3IgYW1wZXJzYW5kcyBhbmQgYW5nbGUgYnJhY2tldHMgdGhhdCBuZWVkIHRvIAorCSMgYmUgZW5jb2RlZC4gVmFsaWQgY2hhcmFjdGVyIGVudGl0aWVzIGFyZSBsZWZ0IGFsb25lIHVubGVzcyB0aGUKKwkjIG5vLWVudGl0aWVzIG1vZGUgaXMgc2V0LgorCSMKKwkJaWYgKCR0aGlzLT5ub19lbnRpdGllcykgeworCQkJJHRleHQgPSBzdHJfcmVwbGFjZSgnJicsICcmYW1wOycsICR0ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCSMgQW1wZXJzYW5kLWVuY29kaW5nIGJhc2VkIGVudGlyZWx5IG9uIE5hdCBJcm9ucydzIEFtcHV0YXRvcgorCQkJIyBNVCBwbHVnaW46IDxodHRwOi8vYnVtcHBvLm5ldC9wcm9qZWN0cy9hbXB1dGF0b3IvPgorCQkJJHRleHQgPSBwcmVnX3JlcGxhY2UoJy8mKD8hIz9beFhdPyg/OlswLTlhLWZBLUZdK3xcdyspOykvJywgCisJCQkJCQkJCScmYW1wOycsICR0ZXh0KTs7CisJCX0KKwkJIyBFbmNvZGUgcmVtYWluaW5nIDwncworCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCc8JywgJyZsdDsnLCAkdGV4dCk7CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKworCisJZnVuY3Rpb24gZG9BdXRvTGlua3MoJHRleHQpIHsKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3s8KChodHRwcz98ZnRwfGRpY3QpOlteXCciPlxzXSspPn1pJywgCisJCQlhcnJheSgmJHRoaXMsICdfZG9BdXRvTGlua3NfdXJsX2NhbGxiYWNrJyksICR0ZXh0KTsKKworCQkjIEVtYWlsIGFkZHJlc3NlczogPGFkZHJlc3NAZG9tYWluLmZvbz4KKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCTwKKwkJCSg/Om1haWx0bzopPworCQkJKAorCQkJCSg/OgorCQkJCQlbLSEjJCUmXCcqKy89P15fYC57fH1+XHdceDgwLVx4RkZdKworCQkJCXwKKwkJCQkJIi4qPyIKKwkJCQkpCisJCQkJXEAKKwkJCQkoPzoKKwkJCQkJWy1hLXowLTlceDgwLVx4RkZdKyhcLlstYS16MC05XHg4MC1ceEZGXSspKlwuW2Etel0rCisJCQkJfAorCQkJCQlcW1tcZC5hLWZBLUY6XStcXQkjIElQdjQgJiBJUHY2CisJCQkJKQorCQkJKQorCQkJPgorCQkJfXhpJywKKwkJCWFycmF5KCYkdGhpcywgJ19kb0F1dG9MaW5rc19lbWFpbF9jYWxsYmFjaycpLCAkdGV4dCk7CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfZG9BdXRvTGlua3NfdXJsX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCRtYXRjaGVzWzFdKTsKKwkJJGxpbmsgPSAiPGEgaHJlZj1cIiR1cmxcIj4kdXJsPC9hPiI7CisJCXJldHVybiAkdGhpcy0+aGFzaFBhcnQoJGxpbmspOworCX0KKwlmdW5jdGlvbiBfZG9BdXRvTGlua3NfZW1haWxfY2FsbGJhY2soJG1hdGNoZXMpIHsKKwkJJGFkZHJlc3MgPSAkbWF0Y2hlc1sxXTsKKwkJJGxpbmsgPSAkdGhpcy0+ZW5jb2RlRW1haWxBZGRyZXNzKCRhZGRyZXNzKTsKKwkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkbGluayk7CisJfQorCisKKwlmdW5jdGlvbiBlbmNvZGVFbWFpbEFkZHJlc3MoJGFkZHIpIHsKKwkjCisJIwlJbnB1dDogYW4gZW1haWwgYWRkcmVzcywgZS5nLiAiZm9vQGV4YW1wbGUuY29tIgorCSMKKwkjCU91dHB1dDogdGhlIGVtYWlsIGFkZHJlc3MgYXMgYSBtYWlsdG8gbGluaywgd2l0aCBlYWNoIGNoYXJhY3RlcgorCSMJCW9mIHRoZSBhZGRyZXNzIGVuY29kZWQgYXMgZWl0aGVyIGEgZGVjaW1hbCBvciBoZXggZW50aXR5LCBpbgorCSMJCXRoZSBob3BlcyBvZiBmb2lsaW5nIG1vc3QgYWRkcmVzcyBoYXJ2ZXN0aW5nIHNwYW0gYm90cy4gRS5nLjoKKwkjCisJIwkgIDxwPjxhIGhyZWY9IiYjMTA5OyYjeDYxOyYjMTA1OyYjeDZjOyYjMTE2OyYjeDZmOyYjNTg7JiN4NjY7byYjMTExOworCSMgICAgICAgICYjeDQwOyYjMTAxOyYjeDc4OyYjOTc7JiN4NmQ7JiMxMTI7JiN4NmM7JiMxMDE7JiM0NjsmI3g2MzsmIzExMTsKKwkjICAgICAgICAmI3g2ZDsiPiYjeDY2O28mIzExMTsmI3g0MDsmIzEwMTsmI3g3ODsmIzk3OyYjeDZkOyYjMTEyOyYjeDZjOworCSMgICAgICAgICYjMTAxOyYjNDY7JiN4NjM7JiMxMTE7JiN4NmQ7PC9hPjwvcD4KKwkjCisJIwlCYXNlZCBieSBhIGZpbHRlciBieSBNYXR0aGV3IFdpY2tsaW5lLCBwb3N0ZWQgdG8gQkJFZGl0LVRhbGsuCisJIyAgIFdpdGggc29tZSBvcHRpbWl6YXRpb25zIGJ5IE1pbGlhbiBXb2xmZi4KKwkjCisJCSRhZGRyID0gIm1haWx0bzoiIC4gJGFkZHI7CisJCSRjaGFycyA9IHByZWdfc3BsaXQoJy8oPzwhXikoPyEkKS8nLCAkYWRkcik7CisJCSRzZWVkID0gKGludClhYnMoY3JjMzIoJGFkZHIpIC8gc3RybGVuKCRhZGRyKSk7ICMgRGV0ZXJtaW5pc3RpYyBzZWVkLgorCQkKKwkJZm9yZWFjaCAoJGNoYXJzIGFzICRrZXkgPT4gJGNoYXIpIHsKKwkJCSRvcmQgPSBvcmQoJGNoYXIpOworCQkJIyBJZ25vcmUgbm9uLWFzY2lpIGNoYXJzLgorCQkJaWYgKCRvcmQgPCAxMjgpIHsKKwkJCQkkciA9ICgkc2VlZCAqICgxICsgJGtleSkpICUgMTAwOyAjIFBzZXVkby1yYW5kb20gZnVuY3Rpb24uCisJCQkJIyByb3VnaGx5IDEwJSByYXcsIDQ1JSBoZXgsIDQ1JSBkZWMKKwkJCQkjICdAJyAqbXVzdCogYmUgZW5jb2RlZC4gSSBpbnNpc3QuCisJCQkJaWYgKCRyID4gOTAgJiYgJGNoYXIgIT0gJ0AnKSAvKiBkbyBub3RoaW5nICovOworCQkJCWVsc2UgaWYgKCRyIDwgNDUpICRjaGFyc1ska2V5XSA9ICcmI3gnLmRlY2hleCgkb3JkKS4nOyc7CisJCQkJZWxzZSAgICAgICAgICAgICAgJGNoYXJzWyRrZXldID0gJyYjJy4kb3JkLic7JzsKKwkJCX0KKwkJfQorCQkKKwkJJGFkZHIgPSBpbXBsb2RlKCcnLCAkY2hhcnMpOworCQkkdGV4dCA9IGltcGxvZGUoJycsIGFycmF5X3NsaWNlKCRjaGFycywgNykpOyAjIHRleHQgd2l0aG91dCBgbWFpbHRvOmAKKwkJJGFkZHIgPSAiPGEgaHJlZj1cIiRhZGRyXCI+JHRleHQ8L2E+IjsKKworCQlyZXR1cm4gJGFkZHI7CisJfQorCisKKwlmdW5jdGlvbiBwYXJzZVNwYW4oJHN0cikgeworCSMKKwkjIFRha2UgdGhlIHN0cmluZyAkc3RyIGFuZCBwYXJzZSBpdCBpbnRvIHRva2VucywgaGFzaGluZyBlbWJlZGVkIEhUTUwsCisJIyBlc2NhcGVkIGNoYXJhY3RlcnMgYW5kIGhhbmRsaW5nIGNvZGUgc3BhbnMuCisJIworCQkkb3V0cHV0ID0gJyc7CisJCQorCQkkc3Bhbl9yZSA9ICd7CisJCQkJKAorCQkJCQlcXFxcJy4kdGhpcy0+ZXNjYXBlX2NoYXJzX3JlLicKKwkJCQl8CisJCQkJCSg/PCFbYFxcXFxdKQorCQkJCQlgKwkJCQkJCSMgY29kZSBzcGFuIG1hcmtlcgorCQkJJy4oICR0aGlzLT5ub19tYXJrdXAgPyAnJyA6ICcKKwkJCQl8CisJCQkJCTwhLS0gICAgLio/ICAgICAtLT4JCSMgY29tbWVudAorCQkJCXwKKwkJCQkJPFw/Lio/XD8+IHwgPCUuKj8lPgkJIyBwcm9jZXNzaW5nIGluc3RydWN0aW9uCisJCQkJfAorCQkJCQk8Wy8hJF0/Wy1hLXpBLVowLTk6X10rCSMgcmVndWxhciB0YWdzCisJCQkJCSg/PgorCQkJCQkJXHMKKwkJCQkJCSg/PlteIlwnPl0rfCJbXiJdKiJ8XCdbXlwnXSpcJykqCisJCQkJCSk/CisJCQkJCT4KKwkJCScpLicKKwkJCQkpCisJCQkJfXhzJzsKKworCQl3aGlsZSAoMSkgeworCQkJIworCQkJIyBFYWNoIGxvb3AgaXRlcmF0aW9uIHNlYWNoIGZvciBlaXRoZXIgdGhlIG5leHQgdGFnLCB0aGUgbmV4dCAKKwkJCSMgb3Blbm5pbmcgY29kZSBzcGFuIG1hcmtlciwgb3IgdGhlIG5leHQgZXNjYXBlZCBjaGFyYWN0ZXIuIAorCQkJIyBFYWNoIHRva2VuIGlzIHRoZW4gcGFzc2VkIHRvIGhhbmRsZVNwYW5Ub2tlbi4KKwkJCSMKKwkJCSRwYXJ0cyA9IHByZWdfc3BsaXQoJHNwYW5fcmUsICRzdHIsIDIsIFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSk7CisJCQkKKwkJCSMgQ3JlYXRlIHRva2VuIGZyb20gdGV4dCBwcmVjZWRpbmcgdGFnLgorCQkJaWYgKCRwYXJ0c1swXSAhPSAiIikgeworCQkJCSRvdXRwdXQgLj0gJHBhcnRzWzBdOworCQkJfQorCQkJCisJCQkjIENoZWNrIGlmIHdlIHJlYWNoIHRoZSBlbmQuCisJCQlpZiAoaXNzZXQoJHBhcnRzWzFdKSkgeworCQkJCSRvdXRwdXQgLj0gJHRoaXMtPmhhbmRsZVNwYW5Ub2tlbigkcGFydHNbMV0sICRwYXJ0c1syXSk7CisJCQkJJHN0ciA9ICRwYXJ0c1syXTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gJG91dHB1dDsKKwl9CisJCisJCisJZnVuY3Rpb24gaGFuZGxlU3BhblRva2VuKCR0b2tlbiwgJiRzdHIpIHsKKwkjCisJIyBIYW5kbGUgJHRva2VuIHByb3ZpZGVkIGJ5IHBhcnNlU3BhbiBieSBkZXRlcm1pbmluZyBpdHMgbmF0dXJlIGFuZCAKKwkjIHJldHVybmluZyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSB0aGF0IHNob3VsZCByZXBsYWNlIGl0LgorCSMKKwkJc3dpdGNoICgkdG9rZW57MH0pIHsKKwkJCWNhc2UgIlxcIjoKKwkJCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCImIyIuIG9yZCgkdG9rZW57MX0pLiAiOyIpOworCQkJY2FzZSAiYCI6CisJCQkJIyBTZWFyY2ggZm9yIGVuZCBtYXJrZXIgaW4gcmVtYWluaW5nIHRleHQuCisJCQkJaWYgKHByZWdfbWF0Y2goJy9eKC4qP1teYF0pJy5wcmVnX3F1b3RlKCR0b2tlbikuJyg/IWApKC4qKSQvc20nLCAKKwkJCQkJJHN0ciwgJG1hdGNoZXMpKQorCQkJCXsKKwkJCQkJJHN0ciA9ICRtYXRjaGVzWzJdOworCQkJCQkkY29kZXNwYW4gPSAkdGhpcy0+bWFrZUNvZGVTcGFuKCRtYXRjaGVzWzFdKTsKKwkJCQkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkY29kZXNwYW4pOworCQkJCX0KKwkJCQlyZXR1cm4gJHRva2VuOyAvLyByZXR1cm4gYXMgdGV4dCBzaW5jZSBubyBlbmRpbmcgbWFya2VyIGZvdW5kLgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCR0b2tlbik7CisJCX0KKwl9CisKKworCWZ1bmN0aW9uIG91dGRlbnQoJHRleHQpIHsKKwkjCisJIyBSZW1vdmUgb25lIGxldmVsIG9mIGxpbmUtbGVhZGluZyB0YWJzIG9yIHNwYWNlcworCSMKKwkJcmV0dXJuIHByZWdfcmVwbGFjZSgnL14oXHR8WyBdezEsJy4kdGhpcy0+dGFiX3dpZHRoLid9KS9tJywgJycsICR0ZXh0KTsKKwl9CisKKworCSMgU3RyaW5nIGxlbmd0aCBmdW5jdGlvbiBmb3IgZGV0YWIuIGBfaW5pdERldGFiYCB3aWxsIGNyZWF0ZSBhIGZ1bmN0aW9uIHRvIAorCSMgaGFubGRlIFVURi04IGlmIHRoZSBkZWZhdWx0IGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0LgorCXZhciAkdXRmOF9zdHJsZW4gPSAnbWJfc3RybGVuJzsKKwkKKwlmdW5jdGlvbiBkZXRhYigkdGV4dCkgeworCSMKKwkjIFJlcGxhY2UgdGFicyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhbW91bnQgb2Ygc3BhY2UuCisJIworCQkjIEZvciBlYWNoIGxpbmUgd2Ugc2VwYXJhdGUgdGhlIGxpbmUgaW4gYmxvY2tzIGRlbGVtaXRlZCBieQorCQkjIHRhYiBjaGFyYWN0ZXJzLiBUaGVuIHdlIHJlY29uc3RydWN0IGV2ZXJ5IGxpbmUgYnkgYWRkaW5nIHRoZSAKKwkJIyBhcHByb3ByaWF0ZSBudW1iZXIgb2Ygc3BhY2UgYmV0d2VlbiBlYWNoIGJsb2Nrcy4KKwkJCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXi4qXHQuKiQvbScsCisJCQlhcnJheSgmJHRoaXMsICdfZGV0YWJfY2FsbGJhY2snKSwgJHRleHQpOworCisJCXJldHVybiAkdGV4dDsKKwl9CisJZnVuY3Rpb24gX2RldGFiX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSRsaW5lID0gJG1hdGNoZXNbMF07CisJCSRzdHJsZW4gPSAkdGhpcy0+dXRmOF9zdHJsZW47ICMgc3RybGVuIGZ1bmN0aW9uIGZvciBVVEYtOC4KKwkJCisJCSMgU3BsaXQgaW4gYmxvY2tzLgorCQkkYmxvY2tzID0gZXhwbG9kZSgiXHQiLCAkbGluZSk7CisJCSMgQWRkIGVhY2ggYmxvY2tzIHRvIHRoZSBsaW5lLgorCQkkbGluZSA9ICRibG9ja3NbMF07CisJCXVuc2V0KCRibG9ja3NbMF0pOyAjIERvIG5vdCBhZGQgZmlyc3QgYmxvY2sgdHdpY2UuCisJCWZvcmVhY2ggKCRibG9ja3MgYXMgJGJsb2NrKSB7CisJCQkjIENhbGN1bGF0ZSBhbW91bnQgb2Ygc3BhY2UsIGluc2VydCBzcGFjZXMsIGluc2VydCBibG9jay4KKwkJCSRhbW91bnQgPSAkdGhpcy0+dGFiX3dpZHRoIC0gCisJCQkJJHN0cmxlbigkbGluZSwgJ1VURi04JykgJSAkdGhpcy0+dGFiX3dpZHRoOworCQkJJGxpbmUgLj0gc3RyX3JlcGVhdCgiICIsICRhbW91bnQpIC4gJGJsb2NrOworCQl9CisJCXJldHVybiAkbGluZTsKKwl9CisJZnVuY3Rpb24gX2luaXREZXRhYigpIHsKKwkjCisJIyBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGB1dGY4X3N0cmxlbmAgcHJvcGVydHkKKwkjIChpbml0aWFsbHkgYG1iX3N0cmxlbmApLiBJZiB0aGUgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSwgY3JlYXRlIGEgCisJIyBmdW5jdGlvbiB0aGF0IHdpbGwgbG9vc2VseSBjb3VudCB0aGUgbnVtYmVyIG9mIFVURi04IGNoYXJhY3RlcnMgd2l0aCBhCisJIyByZWd1bGFyIGV4cHJlc3Npb24uCisJIworCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCR0aGlzLT51dGY4X3N0cmxlbikpIHJldHVybjsKKwkJJHRoaXMtPnV0Zjhfc3RybGVuID0gY3JlYXRlX2Z1bmN0aW9uKCckdGV4dCcsICdyZXR1cm4gcHJlZ19tYXRjaF9hbGwoCisJCQkiL1tcXFxceDAwLVxcXFx4QkZdfFtcXFxceEMwLVxcXFx4RkZdW1xcXFx4ODAtXFxcXHhCRl0qLyIsIAorCQkJJHRleHQsICRtKTsnKTsKKwl9CisKKworCWZ1bmN0aW9uIHVuaGFzaCgkdGV4dCkgeworCSMKKwkjIFN3YXAgYmFjayBpbiBhbGwgdGhlIHRhZ3MgaGFzaGVkIGJ5IF9IYXNoSFRNTEJsb2Nrcy4KKwkjCisJCXJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy8oLilceDFBWzAtOV0rXDEvJywgCisJCQlhcnJheSgmJHRoaXMsICdfdW5oYXNoX2NhbGxiYWNrJyksICR0ZXh0KTsKKwl9CisJZnVuY3Rpb24gX3VuaGFzaF9jYWxsYmFjaygkbWF0Y2hlcykgeworCQlyZXR1cm4gJHRoaXMtPmh0bWxfaGFzaGVzWyRtYXRjaGVzWzBdXTsKKwl9CisKK30KKworCisjCisjIE1hcmtkb3duIEV4dHJhIFBhcnNlciBDbGFzcworIworCitjbGFzcyBNYXJrZG93bkV4dHJhX1BhcnNlciBleHRlbmRzIE1hcmtkb3duX1BhcnNlciB7CisKKwkjIFByZWZpeCBmb3IgZm9vdG5vdGUgaWRzLgorCXZhciAkZm5faWRfcHJlZml4ID0gIiI7CisJCisJIyBPcHRpb25hbCB0aXRsZSBhdHRyaWJ1dGUgZm9yIGZvb3Rub3RlIGxpbmtzIGFuZCBiYWNrbGlua3MuCisJdmFyICRmbl9saW5rX3RpdGxlID0gTUFSS0RPV05fRk5fTElOS19USVRMRTsKKwl2YXIgJGZuX2JhY2tsaW5rX3RpdGxlID0gTUFSS0RPV05fRk5fQkFDS0xJTktfVElUTEU7CisJCisJIyBPcHRpb25hbCBjbGFzcyBhdHRyaWJ1dGUgZm9yIGZvb3Rub3RlIGxpbmtzIGFuZCBiYWNrbGlua3MuCisJdmFyICRmbl9saW5rX2NsYXNzID0gTUFSS0RPV05fRk5fTElOS19DTEFTUzsKKwl2YXIgJGZuX2JhY2tsaW5rX2NsYXNzID0gTUFSS0RPV05fRk5fQkFDS0xJTktfQ0xBU1M7CisJCisJIyBQcmVkZWZpbmVkIGFiYnJldmlhdGlvbnMuCisJdmFyICRwcmVkZWZfYWJiciA9IGFycmF5KCk7CisKKworCWZ1bmN0aW9uIE1hcmtkb3duRXh0cmFfUGFyc2VyKCkgeworCSMKKwkjIENvbnN0cnVjdG9yIGZ1bmN0aW9uLiBJbml0aWFsaXplIHRoZSBwYXJzZXIgb2JqZWN0LgorCSMKKwkJIyBBZGQgZXh0cmEgZXNjYXBhYmxlIGNoYXJhY3RlcnMgYmVmb3JlIHBhcmVudCBjb25zdHJ1Y3RvciAKKwkJIyBpbml0aWFsaXplIHRoZSB0YWJsZS4KKwkJJHRoaXMtPmVzY2FwZV9jaGFycyAuPSAnOnwnOworCQkKKwkJIyBJbnNlcnQgZXh0cmEgZG9jdW1lbnQsIGJsb2NrLCBhbmQgc3BhbiB0cmFuc2Zvcm1hdGlvbnMuIAorCQkjIFBhcmVudCBjb25zdHJ1Y3RvciB3aWxsIGRvIHRoZSBzb3J0aW5nLgorCQkkdGhpcy0+ZG9jdW1lbnRfZ2FtdXQgKz0gYXJyYXkoCisJCQkiZG9GZW5jZWRDb2RlQmxvY2tzIiA9PiA1LAorCQkJInN0cmlwRm9vdG5vdGVzIiAgICAgPT4gMTUsCisJCQkic3RyaXBBYmJyZXZpYXRpb25zIiA9PiAyNSwKKwkJCSJhcHBlbmRGb290bm90ZXMiICAgID0+IDUwLAorCQkJKTsKKwkJJHRoaXMtPmJsb2NrX2dhbXV0ICs9IGFycmF5KAorCQkJImRvRmVuY2VkQ29kZUJsb2NrcyIgPT4gNSwKKwkJCSJkb1RhYmxlcyIgICAgICAgICAgID0+IDE1LAorCQkJImRvRGVmTGlzdHMiICAgICAgICAgPT4gNDUsCisJCQkpOworCQkkdGhpcy0+c3Bhbl9nYW11dCArPSBhcnJheSgKKwkJCSJkb0Zvb3Rub3RlcyIgICAgICAgID0+IDUsCisJCQkiZG9BYmJyZXZpYXRpb25zIiAgICA9PiA3MCwKKwkJCSk7CisJCQorCQlwYXJlbnQ6Ok1hcmtkb3duX1BhcnNlcigpOworCX0KKwkKKwkKKwkjIEV4dHJhIHZhcmlhYmxlcyB1c2VkIGR1cmluZyBleHRyYSB0cmFuc2Zvcm1hdGlvbnMuCisJdmFyICRmb290bm90ZXMgPSBhcnJheSgpOworCXZhciAkZm9vdG5vdGVzX29yZGVyZWQgPSBhcnJheSgpOworCXZhciAkYWJicl9kZXNjaXB0aW9ucyA9IGFycmF5KCk7CisJdmFyICRhYmJyX3dvcmRfcmUgPSAnJzsKKwkKKwkjIEdpdmUgdGhlIGN1cnJlbnQgZm9vdG5vdGUgbnVtYmVyLgorCXZhciAkZm9vdG5vdGVfY291bnRlciA9IDE7CisJCisJCisJZnVuY3Rpb24gc2V0dXAoKSB7CisJIworCSMgU2V0dGluZyB1cCBFeHRyYS1zcGVjaWZpYyB2YXJpYWJsZXMuCisJIworCQlwYXJlbnQ6OnNldHVwKCk7CisJCQorCQkkdGhpcy0+Zm9vdG5vdGVzID0gYXJyYXkoKTsKKwkJJHRoaXMtPmZvb3Rub3Rlc19vcmRlcmVkID0gYXJyYXkoKTsKKwkJJHRoaXMtPmFiYnJfZGVzY2lwdGlvbnMgPSBhcnJheSgpOworCQkkdGhpcy0+YWJicl93b3JkX3JlID0gJyc7CisJCSR0aGlzLT5mb290bm90ZV9jb3VudGVyID0gMTsKKwkJCisJCWZvcmVhY2ggKCR0aGlzLT5wcmVkZWZfYWJiciBhcyAkYWJicl93b3JkID0+ICRhYmJyX2Rlc2MpIHsKKwkJCWlmICgkdGhpcy0+YWJicl93b3JkX3JlKQorCQkJCSR0aGlzLT5hYmJyX3dvcmRfcmUgLj0gJ3wnOworCQkJJHRoaXMtPmFiYnJfd29yZF9yZSAuPSBwcmVnX3F1b3RlKCRhYmJyX3dvcmQpOworCQkJJHRoaXMtPmFiYnJfZGVzY2lwdGlvbnNbJGFiYnJfd29yZF0gPSB0cmltKCRhYmJyX2Rlc2MpOworCQl9CisJfQorCQorCWZ1bmN0aW9uIHRlYXJkb3duKCkgeworCSMKKwkjIENsZWFyaW5nIEV4dHJhLXNwZWNpZmljIHZhcmlhYmxlcy4KKwkjCisJCSR0aGlzLT5mb290bm90ZXMgPSBhcnJheSgpOworCQkkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWQgPSBhcnJheSgpOworCQkkdGhpcy0+YWJicl9kZXNjaXB0aW9ucyA9IGFycmF5KCk7CisJCSR0aGlzLT5hYmJyX3dvcmRfcmUgPSAnJzsKKwkJCisJCXBhcmVudDo6dGVhcmRvd24oKTsKKwl9CisJCisJCisJIyMjIEhUTUwgQmxvY2sgUGFyc2VyICMjIworCQorCSMgVGFncyB0aGF0IGFyZSBhbHdheXMgdHJlYXRlZCBhcyBibG9jayB0YWdzOgorCXZhciAkYmxvY2tfdGFnc19yZSA9ICdwfGRpdnxoWzEtNl18YmxvY2txdW90ZXxwcmV8dGFibGV8ZGx8b2x8dWx8YWRkcmVzc3xmb3JtfGZpZWxkc2V0fGlmcmFtZXxocnxsZWdlbmQnOworCQorCSMgVGFncyB0cmVhdGVkIGFzIGJsb2NrIHRhZ3Mgb25seSBpZiB0aGUgb3BlbmluZyB0YWcgaXMgYWxvbmUgb24gaXQncyBsaW5lOgorCXZhciAkY29udGV4dF9ibG9ja190YWdzX3JlID0gJ3NjcmlwdHxub3NjcmlwdHxtYXRofGluc3xkZWwnOworCQorCSMgVGFncyB3aGVyZSBtYXJrZG93bj0iMSIgZGVmYXVsdCB0byBzcGFuIG1vZGU6CisJdmFyICRjb250YWluX3NwYW5fdGFnc19yZSA9ICdwfGhbMS02XXxsaXxkZHxkdHx0ZHx0aHxsZWdlbmR8YWRkcmVzcyc7CisJCisJIyBUYWdzIHdoaWNoIG11c3Qgbm90IGhhdmUgdGhlaXIgY29udGVudHMgbW9kaWZpZWQsIG5vIG1hdHRlciB3aGVyZSAKKwkjIHRoZXkgYXBwZWFyOgorCXZhciAkY2xlYW5fdGFnc19yZSA9ICdzY3JpcHR8bWF0aCc7CisJCisJIyBUYWdzIHRoYXQgZG8gbm90IG5lZWQgdG8gYmUgY2xvc2VkLgorCXZhciAkYXV0b19jbG9zZV90YWdzX3JlID0gJ2hyfGltZyc7CisJCisKKwlmdW5jdGlvbiBoYXNoSFRNTEJsb2NrcygkdGV4dCkgeworCSMKKwkjIEhhc2hpZnkgSFRNTCBCbG9ja3MgYW5kICJjbGVhbiB0YWdzIi4KKwkjCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBmb3IgYmxvY2stbGV2ZWwgSFRNTCB0YWdzLCBzdWNoIGFzIGhlYWRlcnMsCisJIyBsaXN0cywgYW5kIHRhYmxlcy4gVGhhdCdzIGJlY2F1c2Ugd2Ugc3RpbGwgd2FudCB0byB3cmFwIDxwPnMgYXJvdW5kCisJIyAicGFyYWdyYXBocyIgdGhhdCBhcmUgd3JhcHBlZCBpbiBub24tYmxvY2stbGV2ZWwgdGFncywgc3VjaCBhcyBhbmNob3JzLAorCSMgcGhyYXNlIGVtcGhhc2lzLCBhbmQgc3BhbnMuIFRoZSBsaXN0IG9mIHRhZ3Mgd2UncmUgbG9va2luZyBmb3IgaXMKKwkjIGhhcmQtY29kZWQuCisJIworCSMgVGhpcyB3b3JrcyBieSBjYWxsaW5nIF9IYXNoSFRNTEJsb2Nrc19Jbk1hcmtkb3duLCB3aGljaCB0aGVuIGNhbGxzCisJIyBfSGFzaEhUTUxCbG9ja3NfSW5IVE1MIHdoZW4gaXQgZW5jb3VudGVyIGJsb2NrIHRhZ3MuIFdoZW4gdGhlIG1hcmtkb3duPSIxIiAKKwkjIGF0dHJpYnV0ZSBpcyBmb3VuZCB3aGl0aW4gYSB0YWcsIF9IYXNoSFRNTEJsb2Nrc19JbkhUTUwgY2FsbHMgYmFjaworCSMgIF9IYXNoSFRNTEJsb2Nrc19Jbk1hcmtkb3duIHRvIGhhbmRsZSB0aGUgTWFya2Rvd24gc3ludGF4IHdpdGhpbiB0aGUgdGFnLgorCSMgVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgY2FsbGluZyBlYWNoIG90aGVyLiBJdCdzIHJlY3Vyc2l2ZSEKKwkjCisJCSMKKwkJIyBDYWxsIHRoZSBIVE1MLWluLU1hcmtkb3duIGhhc2hlci4KKwkJIworCQlsaXN0KCR0ZXh0LCApID0gJHRoaXMtPl9oYXNoSFRNTEJsb2Nrc19pbk1hcmtkb3duKCR0ZXh0KTsKKwkJCisJCXJldHVybiAkdGV4dDsKKwl9CisJZnVuY3Rpb24gX2hhc2hIVE1MQmxvY2tzX2luTWFya2Rvd24oJHRleHQsICRpbmRlbnQgPSAwLCAKKwkJCQkJCQkJCQkkZW5jbG9zaW5nX3RhZ19yZSA9ICcnLCAkc3BhbiA9IGZhbHNlKQorCXsKKwkjCisJIyBQYXJzZSBtYXJrZG93biB0ZXh0LCBjYWxsaW5nIF9IYXNoSFRNTEJsb2Nrc19JbkhUTUwgZm9yIGJsb2NrIHRhZ3MuCisJIworCSMgKiAgICRpbmRlbnQgaXMgdGhlIG51bWJlciBvZiBzcGFjZSB0byBiZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgZm9yIGNvZGUgCisJIyAgICAgYmxvY2tzLiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGlmIHdlIGRvbid0IHRha2UgdGhlIGluZGVudCBpbnRvIAorCSMgICAgIGFjY291bnQsIHNvbWV0aGluZyBsaWtlIHRoaXMgKHdoaWNoIGxvb2tzIHJpZ2h0KSB3b24ndCB3b3JrIGFzIGV4cGVjdGVkOgorCSMKKwkjICAgICA8ZGl2PgorCSMgICAgICAgICA8ZGl2IG1hcmtkb3duPSIxIj4KKwkjICAgICAgICAgSGVsbG8gV29ybGQuICA8LS0gSXMgdGhpcyBhIE1hcmtkb3duIGNvZGUgYmxvY2sgb3IgdGV4dD8KKwkjICAgICAgICAgPC9kaXY+ICA8LS0gSXMgdGhpcyBhIE1hcmtkb3duIGNvZGUgYmxvY2sgb3IgYSByZWFsIHRhZz8KKwkjICAgICA8ZGl2PgorCSMKKwkjICAgICBJZiB5b3UgZG9uJ3QgbGlrZSB0aGlzLCBqdXN0IGRvbid0IGluZGVudCB0aGUgdGFnIG9uIHdoaWNoCisJIyAgICAgeW91IGFwcGx5IHRoZSBtYXJrZG93bj0iMSIgYXR0cmlidXRlLgorCSMKKwkjICogICBJZiAkZW5jbG9zaW5nX3RhZ19yZSBpcyBub3QgZW1wdHksIHN0b3BzIGF0IHRoZSBmaXJzdCB1bm1hdGNoZWQgY2xvc2luZyAKKwkjICAgICB0YWcgd2l0aCB0aGF0IG5hbWUuIE5lc3RlZCB0YWdzIHN1cHBvcnRlZC4KKwkjCisJIyAqICAgSWYgJHNwYW4gaXMgdHJ1ZSwgdGV4dCBpbnNpZGUgbXVzdCB0cmVhdGVkIGFzIHNwYW4uIFNvIGFueSBkb3VibGUgCisJIyAgICAgbmV3bGluZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIG5ld2xpbmUgc28gdGhhdCBpdCBkb2VzIG5vdCBjcmVhdGUgCisJIyAgICAgcGFyYWdyYXBocy4KKwkjCisJIyBSZXR1cm5zIGFuIGFycmF5IG9mIHRoYXQgZm9ybTogKCBwcm9jZXNzZWQgdGV4dCAsIHJlbWFpbmluZyB0ZXh0ICkKKwkjCisJCWlmICgkdGV4dCA9PT0gJycpIHJldHVybiBhcnJheSgnJywgJycpOworCisJCSMgUmVnZXggdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5zZSBvZiBuZXdsaW5lcyBhcm91bmQgYSBibG9jayB0YWcuCisJCSRuZXdsaW5lX2JlZm9yZV9yZSA9ICcvKD86XlxuP3xcblxuKSokLyc7CisJCSRuZXdsaW5lX2FmdGVyX3JlID0gCisJCQkneworCQkJCV4JCQkJCQkjIFN0YXJ0IG9mIHRleHQgZm9sbG93aW5nIHRoZSB0YWcuCisJCQkJKD8+WyBdKjwhLS0uKj8tLT4pPwkJIyBPcHRpb25hbCBjb21tZW50LgorCQkJCVsgXSpcbgkJCQkJIyBNdXN0IGJlIGZvbGxvd2VkIGJ5IG5ld2xpbmUuCisJCQl9eHMnOworCQkKKwkJIyBSZWdleCB0byBtYXRjaCBhbnkgdGFnLgorCQkkYmxvY2tfdGFnX3JlID0KKwkJCSd7CisJCQkJKAkJCQkJIyAkMjogQ2FwdHVyZSBob2xlIHRhZy4KKwkJCQkJPC8/CQkJCQkjIEFueSBvcGVuaW5nIG9yIGNsb3NpbmcgdGFnLgorCQkJCQkJKD8+CQkJCSMgVGFnIG5hbWUuCisJCQkJCQkJJy4kdGhpcy0+YmxvY2tfdGFnc19yZS4nCQkJfAorCQkJCQkJCScuJHRoaXMtPmNvbnRleHRfYmxvY2tfdGFnc19yZS4nCXwKKwkJCQkJCQknLiR0aGlzLT5jbGVhbl90YWdzX3JlLicgICAgICAgIAl8CisJCQkJCQkJKD8hXHMpJy4kZW5jbG9zaW5nX3RhZ19yZS4nCisJCQkJCQkpCisJCQkJCQkoPzoKKwkJCQkJCQkoPz1bXHMiXCcvYS16QS1aMC05XSkJIyBBbGxvd2VkIGNoYXJhY3RlcnMgYWZ0ZXIgdGFnIG5hbWUuCisJCQkJCQkJKD8+CisJCQkJCQkJCSIuKj8iCQl8CSMgRG91YmxlIHF1b3RlcyAoY2FuIGNvbnRhaW4gYD5gKQorCQkJCQkJCQlcJy4qP1wnICAgCXwJIyBTaW5nbGUgcXVvdGVzIChjYW4gY29udGFpbiBgPmApCisJCQkJCQkJCS4rPwkJCQkjIEFueXRoaW5nIGJ1dCBxdW90ZXMgYW5kIGA+YC4KKwkJCQkJCQkpKj8KKwkJCQkJCSk/CisJCQkJCT4JCQkJCSMgRW5kIG9mIHRhZy4KKwkJCQl8CisJCQkJCTwhLS0gICAgLio/ICAgICAtLT4JIyBIVE1MIENvbW1lbnQKKwkJCQl8CisJCQkJCTxcPy4qP1w/PiB8IDwlLio/JT4JIyBQcm9jZXNzaW5nIGluc3RydWN0aW9uCisJCQkJfAorCQkJCQk8IVxbQ0RBVEFcWy4qP1xdXF0+CSMgQ0RhdGEgQmxvY2sKKwkJCQl8CisJCQkJCSMgQ29kZSBzcGFuIG1hcmtlcgorCQkJCQlgKworCQkJCScuICggISRzcGFuID8gJyAjIElmIG5vdCBpbiBzcGFuLgorCQkJCXwKKwkJCQkJIyBJbmRlbnRlZCBjb2RlIGJsb2NrCisJCQkJCSg/OiBeWyBdKlxuIHwgXiB8IFxuWyBdKlxuICkKKwkJCQkJWyBdeycuKCRpbmRlbnQrNCkuJ31bXlxuXSogXG4KKwkJCQkJKD8+CisJCQkJCQkoPzogWyBdeycuKCRpbmRlbnQrNCkuJ31bXlxuXSogfCBbIF0qICkgXG4KKwkJCQkJKSoKKwkJCQl8CisJCQkJCSMgRmVuY2VkIGNvZGUgYmxvY2sgbWFya2VyCisJCQkJCSg/PiBeIHwgXG4gKQorCQkJCQlbIF17MCwnLigkaW5kZW50KS4nfX5+fitbIF0qXG4KKwkJCQknIDogJycgKS4gJyAjIEVuZCAoaWYgbm90IGlzIHNwYW4pLgorCQkJCSkKKwkJCX14cyc7CisKKwkJCisJCSRkZXB0aCA9IDA7CQkjIEN1cnJlbnQgZGVwdGggaW5zaWRlIHRoZSB0YWcgdHJlZS4KKwkJJHBhcnNlZCA9ICIiOwkjIFBhcnNlZCB0ZXh0IHRoYXQgd2lsbCBiZSByZXR1cm5lZC4KKworCQkjCisJCSMgTG9vcCB0aHJvdWdoIGV2ZXJ5IHRhZyB1bnRpbCB3ZSBmaW5kIHRoZSBjbG9zaW5nIHRhZyBvZiB0aGUgcGFyZW50CisJCSMgb3IgbG9vcCB1bnRpbCByZWFjaGluZyB0aGUgZW5kIG9mIHRleHQgaWYgbm8gcGFyZW50IHRhZyBzcGVjaWZpZWQuCisJCSMKKwkJZG8geworCQkJIworCQkJIyBTcGxpdCB0aGUgdGV4dCB1c2luZyB0aGUgZmlyc3QgJHRhZ19tYXRjaCBwYXR0ZXJuIGZvdW5kLgorCQkJIyBUZXh0IGJlZm9yZSAgcGF0dGVybiB3aWxsIGJlIGZpcnN0IGluIHRoZSBhcnJheSwgdGV4dCBhZnRlcgorCQkJIyBwYXR0ZXJuIHdpbGwgYmUgYXQgdGhlIGVuZCwgYW5kIGJldHdlZW4gd2lsbCBiZSBhbnkgY2F0Y2hlcyBtYWRlIAorCQkJIyBieSB0aGUgcGF0dGVybi4KKwkJCSMKKwkJCSRwYXJ0cyA9IHByZWdfc3BsaXQoJGJsb2NrX3RhZ19yZSwgJHRleHQsIDIsIAorCQkJCQkJCQlQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOworCQkJCisJCQkjIElmIGluIE1hcmtkb3duIHNwYW4gbW9kZSwgYWRkIGEgZW1wdHktc3RyaW5nIHNwYW4tbGV2ZWwgaGFzaCAKKwkJCSMgYWZ0ZXIgZWFjaCBuZXdsaW5lIHRvIHByZXZlbnQgdHJpZ2dlcmluZyBhbnkgYmxvY2sgZWxlbWVudC4KKwkJCWlmICgkc3BhbikgeworCQkJCSR2b2lkID0gJHRoaXMtPmhhc2hQYXJ0KCIiLCAnOicpOworCQkJCSRuZXdsaW5lID0gIiR2b2lkXG4iOworCQkJCSRwYXJ0c1swXSA9ICR2b2lkIC4gc3RyX3JlcGxhY2UoIlxuIiwgJG5ld2xpbmUsICRwYXJ0c1swXSkgLiAkdm9pZDsKKwkJCX0KKwkJCQorCQkJJHBhcnNlZCAuPSAkcGFydHNbMF07ICMgVGV4dCBiZWZvcmUgY3VycmVudCB0YWcuCisJCQkKKwkJCSMgSWYgZW5kIG9mICR0ZXh0IGhhcyBiZWVuIHJlYWNoZWQuIFN0b3AgbG9vcC4KKwkJCWlmIChjb3VudCgkcGFydHMpIDwgMykgeworCQkJCSR0ZXh0ID0gIiI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCSR0YWcgID0gJHBhcnRzWzFdOyAjIFRhZyB0byBoYW5kbGUuCisJCQkkdGV4dCA9ICRwYXJ0c1syXTsgIyBSZW1haW5pbmcgdGV4dCBhZnRlciBjdXJyZW50IHRhZy4KKwkJCSR0YWdfcmUgPSBwcmVnX3F1b3RlKCR0YWcpOyAjIEZvciB1c2UgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24uCisJCQkKKwkJCSMKKwkJCSMgQ2hlY2sgZm9yOiBDb2RlIHNwYW4gbWFya2VyCisJCQkjCisJCQlpZiAoJHRhZ3swfSA9PSAiYCIpIHsKKwkJCQkjIEZpbmQgY29ycmVzcG9uZGluZyBlbmQgbWFya2VyLgorCQkJCSR0YWdfcmUgPSBwcmVnX3F1b3RlKCR0YWcpOworCQkJCWlmIChwcmVnX21hdGNoKCd7Xig/Pi4rP3xcbig/IVxuKSkqPyg/PCFgKScuJHRhZ19yZS4nKD8hYCl9JywKKwkJCQkJJHRleHQsICRtYXRjaGVzKSkKKwkJCQl7CisJCQkJCSMgRW5kIG1hcmtlciBmb3VuZDogcGFzcyB0ZXh0IHVuY2hhbmdlZCB1bnRpbCBtYXJrZXIuCisJCQkJCSRwYXJzZWQgLj0gJHRhZyAuICRtYXRjaGVzWzBdOworCQkJCQkkdGV4dCA9IHN1YnN0cigkdGV4dCwgc3RybGVuKCRtYXRjaGVzWzBdKSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkjIFVubWF0Y2hlZCBtYXJrZXI6IGp1c3Qgc2tpcCBpdC4KKwkJCQkJJHBhcnNlZCAuPSAkdGFnOworCQkJCX0KKwkJCX0KKwkJCSMKKwkJCSMgQ2hlY2sgZm9yOiBGZW5jZWQgY29kZSBibG9jayBtYXJrZXIuCisJCQkjCisJCQllbHNlIGlmIChwcmVnX21hdGNoKCd7XlxuP1sgXXswLCcuKCRpbmRlbnQrMykuJ31+fScsICR0YWcpKSB7CisJCQkJIyBGZW5jZWQgY29kZSBibG9jayBtYXJrZXI6IGZpbmQgbWF0Y2hpbmcgZW5kIG1hcmtlci4KKwkJCQkkdGFnX3JlID0gcHJlZ19xdW90ZSh0cmltKCR0YWcpKTsKKwkJCQlpZiAocHJlZ19tYXRjaCgne14oPz4uKlxuKSs/WyBdezAsJy4oJGluZGVudCkuJ30nLiR0YWdfcmUuJ1sgXSpcbn0nLCAkdGV4dCwgCisJCQkJCSRtYXRjaGVzKSkgCisJCQkJeworCQkJCQkjIEVuZCBtYXJrZXIgZm91bmQ6IHBhc3MgdGV4dCB1bmNoYW5nZWQgdW50aWwgbWFya2VyLgorCQkJCQkkcGFyc2VkIC49ICR0YWcgLiAkbWF0Y2hlc1swXTsKKwkJCQkJJHRleHQgPSBzdWJzdHIoJHRleHQsIHN0cmxlbigkbWF0Y2hlc1swXSkpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJIyBObyBlbmQgbWFya2VyOiBqdXN0IHNraXAgaXQuCisJCQkJCSRwYXJzZWQgLj0gJHRhZzsKKwkJCQl9CisJCQl9CisJCQkjCisJCQkjIENoZWNrIGZvcjogSW5kZW50ZWQgY29kZSBibG9jay4KKwkJCSMKKwkJCWVsc2UgaWYgKCR0YWd7MH0gPT0gIlxuIiB8fCAkdGFnezB9ID09ICIgIikgeworCQkJCSMgSW5kZW50ZWQgY29kZSBibG9jazogcGFzcyBpdCB1bmNoYW5nZWQsIHdpbGwgYmUgaGFuZGxlZCAKKwkJCQkjIGxhdGVyLgorCQkJCSRwYXJzZWQgLj0gJHRhZzsKKwkJCX0KKwkJCSMKKwkJCSMgQ2hlY2sgZm9yOiBPcGVuaW5nIEJsb2NrIGxldmVsIHRhZyBvcgorCQkJIyAgICAgICAgICAgIE9wZW5pbmcgQ29udGV4dCBCbG9jayB0YWcgKGxpa2UgaW5zIGFuZCBkZWwpIAorCQkJIyAgICAgICAgICAgICAgIHVzZWQgYXMgYSBibG9jayB0YWcgKHRhZyBpcyBhbG9uZSBvbiBpdCdzIGxpbmUpLgorCQkJIworCQkJZWxzZSBpZiAocHJlZ19tYXRjaCgne148KD86Jy4kdGhpcy0+YmxvY2tfdGFnc19yZS4nKVxifScsICR0YWcpIHx8CisJCQkJKAlwcmVnX21hdGNoKCd7XjwoPzonLiR0aGlzLT5jb250ZXh0X2Jsb2NrX3RhZ3NfcmUuJylcYn0nLCAkdGFnKSAmJgorCQkJCQlwcmVnX21hdGNoKCRuZXdsaW5lX2JlZm9yZV9yZSwgJHBhcnNlZCkgJiYKKwkJCQkJcHJlZ19tYXRjaCgkbmV3bGluZV9hZnRlcl9yZSwgJHRleHQpCSkKKwkJCQkpCisJCQl7CisJCQkJIyBOZWVkIHRvIHBhcnNlIHRhZyBhbmQgZm9sbG93aW5nIHRleHQgdXNpbmcgdGhlIEhUTUwgcGFyc2VyLgorCQkJCWxpc3QoJGJsb2NrX3RleHQsICR0ZXh0KSA9IAorCQkJCQkkdGhpcy0+X2hhc2hIVE1MQmxvY2tzX2luSFRNTCgkdGFnIC4gJHRleHQsICJoYXNoQmxvY2siLCB0cnVlKTsKKwkJCQkKKwkJCQkjIE1ha2Ugc3VyZSBpdCBzdGF5cyBvdXRzaWRlIG9mIGFueSBwYXJhZ3JhcGggYnkgYWRkaW5nIG5ld2xpbmVzLgorCQkJCSRwYXJzZWQgLj0gIlxuXG4kYmxvY2tfdGV4dFxuXG4iOworCQkJfQorCQkJIworCQkJIyBDaGVjayBmb3I6IENsZWFuIHRhZyAobGlrZSBzY3JpcHQsIG1hdGgpCisJCQkjICAgICAgICAgICAgSFRNTCBDb21tZW50cywgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuCisJCQkjCisJCQllbHNlIGlmIChwcmVnX21hdGNoKCd7XjwoPzonLiR0aGlzLT5jbGVhbl90YWdzX3JlLicpXGJ9JywgJHRhZykgfHwKKwkJCQkkdGFnezF9ID09ICchJyB8fCAkdGFnezF9ID09ICc/JykKKwkJCXsKKwkJCQkjIE5lZWQgdG8gcGFyc2UgdGFnIGFuZCBmb2xsb3dpbmcgdGV4dCB1c2luZyB0aGUgSFRNTCBwYXJzZXIuCisJCQkJIyAoZG9uJ3QgY2hlY2sgZm9yIG1hcmtkb3duIGF0dHJpYnV0ZSkKKwkJCQlsaXN0KCRibG9ja190ZXh0LCAkdGV4dCkgPSAKKwkJCQkJJHRoaXMtPl9oYXNoSFRNTEJsb2Nrc19pbkhUTUwoJHRhZyAuICR0ZXh0LCAiaGFzaENsZWFuIiwgZmFsc2UpOworCQkJCQorCQkJCSRwYXJzZWQgLj0gJGJsb2NrX3RleHQ7CisJCQl9CisJCQkjCisJCQkjIENoZWNrIGZvcjogVGFnIHdpdGggc2FtZSBuYW1lIGFzIGVuY2xvc2luZyB0YWcuCisJCQkjCisJCQllbHNlIGlmICgkZW5jbG9zaW5nX3RhZ19yZSAhPT0gJycgJiYKKwkJCQkjIFNhbWUgbmFtZSBhcyBlbmNsb3NpbmcgdGFnLgorCQkJCXByZWdfbWF0Y2goJ3tePC8/KD86Jy4kZW5jbG9zaW5nX3RhZ19yZS4nKVxifScsICR0YWcpKQorCQkJeworCQkJCSMKKwkJCQkjIEluY3JlYXNlL2RlY3JlYXNlIG5lc3RlZCB0YWcgY291bnQuCisJCQkJIworCQkJCWlmICgkdGFnezF9ID09ICcvJykJCQkJCQkkZGVwdGgtLTsKKwkJCQllbHNlIGlmICgkdGFne3N0cmxlbigkdGFnKS0yfSAhPSAnLycpCSRkZXB0aCsrOworCisJCQkJaWYgKCRkZXB0aCA8IDApIHsKKwkJCQkJIworCQkJCQkjIEdvaW5nIG91dCBvZiBwYXJlbnQgZWxlbWVudC4gQ2xlYW4gdXAgYW5kIGJyZWFrIHNvIHdlCisJCQkJCSMgcmV0dXJuIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgorCQkJCQkjCisJCQkJCSR0ZXh0ID0gJHRhZyAuICR0ZXh0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJJHBhcnNlZCAuPSAkdGFnOworCQkJfQorCQkJZWxzZSB7CisJCQkJJHBhcnNlZCAuPSAkdGFnOworCQkJfQorCQl9IHdoaWxlICgkZGVwdGggPj0gMCk7CisJCQorCQlyZXR1cm4gYXJyYXkoJHBhcnNlZCwgJHRleHQpOworCX0KKwlmdW5jdGlvbiBfaGFzaEhUTUxCbG9ja3NfaW5IVE1MKCR0ZXh0LCAkaGFzaF9tZXRob2QsICRtZF9hdHRyKSB7CisJIworCSMgUGFyc2UgSFRNTCwgY2FsbGluZyBfSGFzaEhUTUxCbG9ja3NfSW5NYXJrZG93biBmb3IgYmxvY2sgdGFncy4KKwkjCisJIyAqICAgQ2FsbHMgJGhhc2hfbWV0aG9kIHRvIGNvbnZlcnQgYW55IGJsb2Nrcy4KKwkjICogICBTdG9wcyB3aGVuIHRoZSBmaXJzdCBvcGVuaW5nIHRhZyBjbG9zZXMuCisJIyAqICAgJG1kX2F0dHIgaW5kaWNhdGUgaWYgdGhlIHVzZSBvZiB0aGUgYG1hcmtkb3duPSIxImAgYXR0cmlidXRlIGlzIGFsbG93ZWQuCisJIyAgICAgKGl0IGlzIG5vdCBpbnNpZGUgY2xlYW4gdGFncykKKwkjCisJIyBSZXR1cm5zIGFuIGFycmF5IG9mIHRoYXQgZm9ybTogKCBwcm9jZXNzZWQgdGV4dCAsIHJlbWFpbmluZyB0ZXh0ICkKKwkjCisJCWlmICgkdGV4dCA9PT0gJycpIHJldHVybiBhcnJheSgnJywgJycpOworCQkKKwkJIyBSZWdleCB0byBtYXRjaCBgbWFya2Rvd25gIGF0dHJpYnV0ZSBpbnNpZGUgb2YgYSB0YWcuCisJCSRtYXJrZG93bl9hdHRyX3JlID0gJworCQkJeworCQkJCVxzKgkJCSMgRWF0IHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBgbWFya2Rvd25gIGF0dHJpYnV0ZQorCQkJCW1hcmtkb3duCisJCQkJXHMqPVxzKgorCQkJCSg/PgorCQkJCQkoWyJcJ10pCQkjICQxOiBxdW90ZSBkZWxpbWl0ZXIJCQorCQkJCQkoLio/KQkJIyAkMjogYXR0cmlidXRlIHZhbHVlCisJCQkJCVwxCQkJIyBtYXRjaGluZyBkZWxpbWl0ZXIJCisJCQkJfAorCQkJCQkoW15ccz5dKikJIyAkMzogdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlCisJCQkJKQorCQkJCSgpCQkJCSMgJDQ6IG1ha2UgJDMgYWx3YXlzIGRlZmluZWQgKGF2b2lkIHdhcm5pbmdzKQorCQkJfXhzJzsKKwkJCisJCSMgUmVnZXggdG8gbWF0Y2ggYW55IHRhZy4KKwkJJHRhZ19yZSA9ICd7CisJCQkJKAkJCQkJIyAkMjogQ2FwdHVyZSBob2xlIHRhZy4KKwkJCQkJPC8/CQkJCQkjIEFueSBvcGVuaW5nIG9yIGNsb3NpbmcgdGFnLgorCQkJCQkJW1x3OiRdKwkJCSMgVGFnIG5hbWUuCisJCQkJCQkoPzoKKwkJCQkJCQkoPz1bXHMiXCcvYS16QS1aMC05XSkJIyBBbGxvd2VkIGNoYXJhY3RlcnMgYWZ0ZXIgdGFnIG5hbWUuCisJCQkJCQkJKD8+CisJCQkJCQkJCSIuKj8iCQl8CSMgRG91YmxlIHF1b3RlcyAoY2FuIGNvbnRhaW4gYD5gKQorCQkJCQkJCQlcJy4qP1wnICAgCXwJIyBTaW5nbGUgcXVvdGVzIChjYW4gY29udGFpbiBgPmApCisJCQkJCQkJCS4rPwkJCQkjIEFueXRoaW5nIGJ1dCBxdW90ZXMgYW5kIGA+YC4KKwkJCQkJCQkpKj8KKwkJCQkJCSk/CisJCQkJCT4JCQkJCSMgRW5kIG9mIHRhZy4KKwkJCQl8CisJCQkJCTwhLS0gICAgLio/ICAgICAtLT4JIyBIVE1MIENvbW1lbnQKKwkJCQl8CisJCQkJCTxcPy4qP1w/PiB8IDwlLio/JT4JIyBQcm9jZXNzaW5nIGluc3RydWN0aW9uCisJCQkJfAorCQkJCQk8IVxbQ0RBVEFcWy4qP1xdXF0+CSMgQ0RhdGEgQmxvY2sKKwkJCQkpCisJCQl9eHMnOworCQkKKwkJJG9yaWdpbmFsX3RleHQgPSAkdGV4dDsJCSMgU2F2ZSBvcmlnaW5hbCB0ZXh0IGluIGNhc2Ugb2YgZmFsaXVyZS4KKwkJCisJCSRkZXB0aAkJPSAwOwkjIEN1cnJlbnQgZGVwdGggaW5zaWRlIHRoZSB0YWcgdHJlZS4KKwkJJGJsb2NrX3RleHQJPSAiIjsJIyBUZW1wb3JhcnkgdGV4dCBob2xkZXIgZm9yIGN1cnJlbnQgdGV4dC4KKwkJJHBhcnNlZAkJPSAiIjsJIyBQYXJzZWQgdGV4dCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQuCisKKwkJIworCQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgc3RhcnRpbmcgdGFnLgorCQkjIChUaGlzIHBhdHRlcm4gbWFrZXMgJGJhc2VfdGFnX25hbWVfcmUgc2FmZSB3aXRob3V0IHF1b3RpbmcuKQorCQkjCisJCWlmIChwcmVnX21hdGNoKCcvXjwoW1x3OiRdKilcYi8nLCAkdGV4dCwgJG1hdGNoZXMpKQorCQkJJGJhc2VfdGFnX25hbWVfcmUgPSAkbWF0Y2hlc1sxXTsKKworCQkjCisJCSMgTG9vcCB0aHJvdWdoIGV2ZXJ5IHRhZyB1bnRpbCB3ZSBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgdGFnLgorCQkjCisJCWRvIHsKKwkJCSMKKwkJCSMgU3BsaXQgdGhlIHRleHQgdXNpbmcgdGhlIGZpcnN0ICR0YWdfbWF0Y2ggcGF0dGVybiBmb3VuZC4KKwkJCSMgVGV4dCBiZWZvcmUgIHBhdHRlcm4gd2lsbCBiZSBmaXJzdCBpbiB0aGUgYXJyYXksIHRleHQgYWZ0ZXIKKwkJCSMgcGF0dGVybiB3aWxsIGJlIGF0IHRoZSBlbmQsIGFuZCBiZXR3ZWVuIHdpbGwgYmUgYW55IGNhdGNoZXMgbWFkZSAKKwkJCSMgYnkgdGhlIHBhdHRlcm4uCisJCQkjCisJCQkkcGFydHMgPSBwcmVnX3NwbGl0KCR0YWdfcmUsICR0ZXh0LCAyLCBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOworCQkJCisJCQlpZiAoY291bnQoJHBhcnRzKSA8IDMpIHsKKwkJCQkjCisJCQkJIyBFbmQgb2YgJHRleHQgcmVhY2hlZCB3aXRoIHVuYmFsZW5jZWQgdGFnKHMpLgorCQkJCSMgSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gb3JpZ2luYWwgdGV4dCB1bmNoYW5nZWQgYW5kIHBhc3MgdGhlCisJCQkJIyBmaXJzdCBjaGFyYWN0ZXIgYXMgZmlsdGVyZWQgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSAKKwkJCQkjIHBhcmVudCBmdW5jdGlvbi4KKwkJCQkjCisJCQkJcmV0dXJuIGFycmF5KCRvcmlnaW5hbF90ZXh0ezB9LCBzdWJzdHIoJG9yaWdpbmFsX3RleHQsIDEpKTsKKwkJCX0KKwkJCQorCQkJJGJsb2NrX3RleHQgLj0gJHBhcnRzWzBdOyAjIFRleHQgYmVmb3JlIGN1cnJlbnQgdGFnLgorCQkJJHRhZyAgICAgICAgID0gJHBhcnRzWzFdOyAjIFRhZyB0byBoYW5kbGUuCisJCQkkdGV4dCAgICAgICAgPSAkcGFydHNbMl07ICMgUmVtYWluaW5nIHRleHQgYWZ0ZXIgY3VycmVudCB0YWcuCisJCQkKKwkJCSMKKwkJCSMgQ2hlY2sgZm9yOiBBdXRvLWNsb3NlIHRhZyAobGlrZSA8aHIvPikKKwkJCSMJCQkgQ29tbWVudHMgYW5kIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zLgorCQkJIworCQkJaWYgKHByZWdfbWF0Y2goJ3tePC8/KD86Jy4kdGhpcy0+YXV0b19jbG9zZV90YWdzX3JlLicpXGJ9JywgJHRhZykgfHwKKwkJCQkkdGFnezF9ID09ICchJyB8fCAkdGFnezF9ID09ICc/JykKKwkJCXsKKwkJCQkjIEp1c3QgYWRkIHRoZSB0YWcgdG8gdGhlIGJsb2NrIGFzIGlmIGl0IHdhcyB0ZXh0LgorCQkJCSRibG9ja190ZXh0IC49ICR0YWc7CisJCQl9CisJCQllbHNlIHsKKwkJCQkjCisJCQkJIyBJbmNyZWFzZS9kZWNyZWFzZSBuZXN0ZWQgdGFnIGNvdW50LiBPbmx5IGRvIHNvIGlmCisJCQkJIyB0aGUgdGFnJ3MgbmFtZSBtYXRjaCBiYXNlIHRhZydzLgorCQkJCSMKKwkJCQlpZiAocHJlZ19tYXRjaCgne148Lz8nLiRiYXNlX3RhZ19uYW1lX3JlLidcYn0nLCAkdGFnKSkgeworCQkJCQlpZiAoJHRhZ3sxfSA9PSAnLycpCQkJCQkJJGRlcHRoLS07CisJCQkJCWVsc2UgaWYgKCR0YWd7c3RybGVuKCR0YWcpLTJ9ICE9ICcvJykJJGRlcHRoKys7CisJCQkJfQorCQkJCQorCQkJCSMKKwkJCQkjIENoZWNrIGZvciBgbWFya2Rvd249IjEiYCBhdHRyaWJ1dGUgYW5kIGhhbmRsZSBpdC4KKwkJCQkjCisJCQkJaWYgKCRtZF9hdHRyICYmIAorCQkJCQlwcmVnX21hdGNoKCRtYXJrZG93bl9hdHRyX3JlLCAkdGFnLCAkYXR0cl9tKSAmJgorCQkJCQlwcmVnX21hdGNoKCcvXjF8YmxvY2t8c3BhbiQvJywgJGF0dHJfbVsyXSAuICRhdHRyX21bM10pKQorCQkJCXsKKwkJCQkJIyBSZW1vdmUgYG1hcmtkb3duYCBhdHRyaWJ1dGUgZnJvbSBvcGVuaW5nIHRhZy4KKwkJCQkJJHRhZyA9IHByZWdfcmVwbGFjZSgkbWFya2Rvd25fYXR0cl9yZSwgJycsICR0YWcpOworCQkJCQkKKwkJCQkJIyBDaGVjayBpZiB0ZXh0IGluc2lkZSB0aGlzIHRhZyBtdXN0IGJlIHBhcnNlZCBpbiBzcGFuIG1vZGUuCisJCQkJCSR0aGlzLT5tb2RlID0gJGF0dHJfbVsyXSAuICRhdHRyX21bM107CisJCQkJCSRzcGFuX21vZGUgPSAkdGhpcy0+bW9kZSA9PSAnc3BhbicgfHwgJHRoaXMtPm1vZGUgIT0gJ2Jsb2NrJyAmJgorCQkJCQkJcHJlZ19tYXRjaCgne148KD86Jy4kdGhpcy0+Y29udGFpbl9zcGFuX3RhZ3NfcmUuJylcYn0nLCAkdGFnKTsKKwkJCQkJCisJCQkJCSMgQ2FsY3VsYXRlIGluZGVudCBiZWZvcmUgdGFnLgorCQkJCQlpZiAocHJlZ19tYXRjaCgnLyg/Ol58XG4pKCAqPykoPyEgKS4qPyQvJywgJGJsb2NrX3RleHQsICRtYXRjaGVzKSkgeworCQkJCQkJJHN0cmxlbiA9ICR0aGlzLT51dGY4X3N0cmxlbjsKKwkJCQkJCSRpbmRlbnQgPSAkc3RybGVuKCRtYXRjaGVzWzFdLCAnVVRGLTgnKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSRpbmRlbnQgPSAwOworCQkJCQl9CisJCQkJCQorCQkJCQkjIEVuZCBwcmVjZWRpbmcgYmxvY2sgd2l0aCB0aGlzIHRhZy4KKwkJCQkJJGJsb2NrX3RleHQgLj0gJHRhZzsKKwkJCQkJJHBhcnNlZCAuPSAkdGhpcy0+JGhhc2hfbWV0aG9kKCRibG9ja190ZXh0KTsKKwkJCQkJCisJCQkJCSMgR2V0IGVuY2xvc2luZyB0YWcgbmFtZSBmb3IgdGhlIFBhcnNlTWFya2Rvd24gZnVuY3Rpb24uCisJCQkJCSMgKFRoaXMgcGF0dGVybiBtYWtlcyAkdGFnX25hbWVfcmUgc2FmZSB3aXRob3V0IHF1b3RpbmcuKQorCQkJCQlwcmVnX21hdGNoKCcvXjwoW1x3OiRdKilcYi8nLCAkdGFnLCAkbWF0Y2hlcyk7CisJCQkJCSR0YWdfbmFtZV9yZSA9ICRtYXRjaGVzWzFdOworCQkJCQkKKwkJCQkJIyBQYXJzZSB0aGUgY29udGVudCB1c2luZyB0aGUgSFRNTC1pbi1NYXJrZG93biBwYXJzZXIuCisJCQkJCWxpc3QgKCRibG9ja190ZXh0LCAkdGV4dCkKKwkJCQkJCT0gJHRoaXMtPl9oYXNoSFRNTEJsb2Nrc19pbk1hcmtkb3duKCR0ZXh0LCAkaW5kZW50LCAKKwkJCQkJCQkkdGFnX25hbWVfcmUsICRzcGFuX21vZGUpOworCQkJCQkKKwkJCQkJIyBPdXRkZW50IG1hcmtkb3duIHRleHQuCisJCQkJCWlmICgkaW5kZW50ID4gMCkgeworCQkJCQkJJGJsb2NrX3RleHQgPSBwcmVnX3JlcGxhY2UoIi9eWyBdezEsJGluZGVudH0vbSIsICIiLCAKKwkJCQkJCQkJCQkJCQkkYmxvY2tfdGV4dCk7CisJCQkJCX0KKwkJCQkJCisJCQkJCSMgQXBwZW5kIHRhZyBjb250ZW50IHRvIHBhcnNlZCB0ZXh0LgorCQkJCQlpZiAoISRzcGFuX21vZGUpCSRwYXJzZWQgLj0gIlxuXG4kYmxvY2tfdGV4dFxuXG4iOworCQkJCQllbHNlCQkJCSRwYXJzZWQgLj0gIiRibG9ja190ZXh0IjsKKwkJCQkJCisJCQkJCSMgU3RhcnQgb3ZlciBhIG5ldyBibG9jay4KKwkJCQkJJGJsb2NrX3RleHQgPSAiIjsKKwkJCQl9CisJCQkJZWxzZSAkYmxvY2tfdGV4dCAuPSAkdGFnOworCQkJfQorCQkJCisJCX0gd2hpbGUgKCRkZXB0aCA+IDApOworCQkKKwkJIworCQkjIEhhc2ggbGFzdCBibG9jayB0ZXh0IHRoYXQgd2Fzbid0IHByb2Nlc3NlZCBpbnNpZGUgdGhlIGxvb3AuCisJCSMKKwkJJHBhcnNlZCAuPSAkdGhpcy0+JGhhc2hfbWV0aG9kKCRibG9ja190ZXh0KTsKKwkJCisJCXJldHVybiBhcnJheSgkcGFyc2VkLCAkdGV4dCk7CisJfQorCisKKwlmdW5jdGlvbiBoYXNoQ2xlYW4oJHRleHQpIHsKKwkjCisJIyBDYWxsZWQgd2hlbmV2ZXIgYSB0YWcgbXVzdCBiZSBoYXNoZWQgd2hlbiBhIGZ1bmN0aW9uIGluc2VydCBhICJjbGVhbiIgdGFnCisJIyBpbiAkdGV4dCwgaXQgcGFzcyB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gYW5kIGlzIGF1dG9tYXRpY2FseSBlc2NhcGVkLCAKKwkjIGJsb2NraW5nIGludmFsaWQgbmVzdGVkIG92ZXJsYXAuCisJIworCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCR0ZXh0LCAnQycpOworCX0KKworCisJZnVuY3Rpb24gZG9IZWFkZXJzKCR0ZXh0KSB7CisJIworCSMgUmVkZWZpbmVkIHRvIGFkZCBpZCBhdHRyaWJ1dGUgc3VwcG9ydC4KKwkjCisJCSMgU2V0ZXh0LXN0eWxlIGhlYWRlcnM6CisJCSMJICBIZWFkZXIgMSAgeyNoZWFkZXIxfQorCQkjCSAgPT09PT09PT0KKwkJIyAgCisJCSMJICBIZWFkZXIgMiAgeyNoZWFkZXIyfQorCQkjCSAgLS0tLS0tLS0KKwkJIworCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKwkJCSd7CisJCQkJKF4uKz8pCQkJCQkJCQkjICQxOiBIZWFkZXIgdGV4dAorCQkJCSg/OlsgXStce1wjKFstXzphLXpBLVowLTldKylcfSk/CSMgJDI6IElkIGF0dHJpYnV0ZQorCQkJCVsgXSpcbig9K3wtKylbIF0qXG4rCQkJCSMgJDM6IEhlYWRlciBmb290ZXIKKwkJCX1teCcsCisJCQlhcnJheSgmJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX3NldGV4dCcpLCAkdGV4dCk7CisKKwkJIyBhdHgtc3R5bGUgaGVhZGVyczoKKwkJIwkjIEhlYWRlciAxICAgICAgICB7I2hlYWRlcjF9CisJCSMJIyMgSGVhZGVyIDIgICAgICAgeyNoZWFkZXIyfQorCQkjCSMjIEhlYWRlciAyIHdpdGggY2xvc2luZyBoYXNoZXMgIyMgIHsjaGVhZGVyM30KKwkJIwkuLi4KKwkJIwkjIyMjIyMgSGVhZGVyIDYgICB7I2hlYWRlcjJ9CisJCSMKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCQleKFwjezEsNn0pCSMgJDEgPSBzdHJpbmcgb2YgI1wncworCQkJCVsgXSoKKwkJCQkoLis/KQkJIyAkMiA9IEhlYWRlciB0ZXh0CisJCQkJWyBdKgorCQkJCVwjKgkJCSMgb3B0aW9uYWwgY2xvc2luZyAjXCdzIChub3QgY291bnRlZCkKKwkJCQkoPzpbIF0rXHtcIyhbLV86YS16QS1aMC05XSspXH0pPyAjIGlkIGF0dHJpYnV0ZQorCQkJCVsgXSoKKwkJCQlcbisKKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX2F0eCcpLCAkdGV4dCk7CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfZG9IZWFkZXJzX2F0dHIoJGF0dHIpIHsKKwkJaWYgKGVtcHR5KCRhdHRyKSkgIHJldHVybiAiIjsKKwkJcmV0dXJuICIgaWQ9XCIkYXR0clwiIjsKKwl9CisJZnVuY3Rpb24gX2RvSGVhZGVyc19jYWxsYmFja19zZXRleHQoJG1hdGNoZXMpIHsKKwkJaWYgKCRtYXRjaGVzWzNdID09ICctJyAmJiBwcmVnX21hdGNoKCd7Xi0gfScsICRtYXRjaGVzWzFdKSkKKwkJCXJldHVybiAkbWF0Y2hlc1swXTsKKwkJJGxldmVsID0gJG1hdGNoZXNbM117MH0gPT0gJz0nID8gMSA6IDI7CisJCSRhdHRyICA9ICR0aGlzLT5fZG9IZWFkZXJzX2F0dHIoJGlkID0mICRtYXRjaGVzWzJdKTsKKwkJJGJsb2NrID0gIjxoJGxldmVsJGF0dHI+Ii4kdGhpcy0+cnVuU3BhbkdhbXV0KCRtYXRjaGVzWzFdKS4iPC9oJGxldmVsPiI7CisJCXJldHVybiAiXG4iIC4gJHRoaXMtPmhhc2hCbG9jaygkYmxvY2spIC4gIlxuXG4iOworCX0KKwlmdW5jdGlvbiBfZG9IZWFkZXJzX2NhbGxiYWNrX2F0eCgkbWF0Y2hlcykgeworCQkkbGV2ZWwgPSBzdHJsZW4oJG1hdGNoZXNbMV0pOworCQkkYXR0ciAgPSAkdGhpcy0+X2RvSGVhZGVyc19hdHRyKCRpZCA9JiAkbWF0Y2hlc1szXSk7CisJCSRibG9jayA9ICI8aCRsZXZlbCRhdHRyPiIuJHRoaXMtPnJ1blNwYW5HYW11dCgkbWF0Y2hlc1syXSkuIjwvaCRsZXZlbD4iOworCQlyZXR1cm4gIlxuIiAuICR0aGlzLT5oYXNoQmxvY2soJGJsb2NrKSAuICJcblxuIjsKKwl9CisKKworCWZ1bmN0aW9uIGRvVGFibGVzKCR0ZXh0KSB7CisJIworCSMgRm9ybSBIVE1MIHRhYmxlcy4KKwkjCisJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aCAtIDE7CisJCSMKKwkJIyBGaW5kIHRhYmxlcyB3aXRoIGxlYWRpbmcgcGlwZS4KKwkJIworCQkjCXwgSGVhZGVyIDEgfCBIZWFkZXIgMgorCQkjCXwgLS0tLS0tLS0gfCAtLS0tLS0tLQorCQkjCXwgQ2VsbCAxICAgfCBDZWxsIDIKKwkJIwl8IENlbGwgMyAgIHwgQ2VsbCA0CisJCSMKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJworCQkJeworCQkJCV4JCQkJCQkJIyBTdGFydCBvZiBhIGxpbmUKKwkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CSMgQWxsb3dlZCB3aGl0ZXNwYWNlLgorCQkJCVt8XQkJCQkJCQkjIE9wdGlvbmFsIGxlYWRpbmcgcGlwZSAocHJlc2VudCkKKwkJCQkoLispIFxuCQkJCQkJIyAkMTogSGVhZGVyIHJvdyAoYXQgbGVhc3Qgb25lIHBpcGUpCisJCQkJCisJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQkjIEFsbG93ZWQgd2hpdGVzcGFjZS4KKwkJCQlbfF0gKFsgXSpbLTpdK1stfCA6XSopIFxuCSMgJDI6IEhlYWRlciB1bmRlcmxpbmUKKwkJCQkKKwkJCQkoCQkJCQkJCSMgJDM6IENlbGxzCisJCQkJCSg/PgorCQkJCQkJWyBdKgkJCQkjIEFsbG93ZWQgd2hpdGVzcGFjZS4KKwkJCQkJCVt8XSAuKiBcbgkJCSMgUm93IGNvbnRlbnQuCisJCQkJCSkqCisJCQkJKQorCQkJCSg/PVxufFxaKQkJCQkJIyBTdG9wIGF0IGZpbmFsIGRvdWJsZSBuZXdsaW5lLgorCQkJfXhtJywKKwkJCWFycmF5KCYkdGhpcywgJ19kb1RhYmxlX2xlYWRpbmdQaXBlX2NhbGxiYWNrJyksICR0ZXh0KTsKKwkJCisJCSMKKwkJIyBGaW5kIHRhYmxlcyB3aXRob3V0IGxlYWRpbmcgcGlwZS4KKwkJIworCQkjCUhlYWRlciAxIHwgSGVhZGVyIDIKKwkJIwktLS0tLS0tLSB8IC0tLS0tLS0tCisJCSMJQ2VsbCAxICAgfCBDZWxsIDIKKwkJIwlDZWxsIDMgICB8IENlbGwgNAorCQkjCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcKKwkJCXsKKwkJCQleCQkJCQkJCSMgU3RhcnQgb2YgYSBsaW5lCisJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQkjIEFsbG93ZWQgd2hpdGVzcGFjZS4KKwkJCQkoXFMuKlt8XS4qKSBcbgkJCQkjICQxOiBIZWFkZXIgcm93IChhdCBsZWFzdCBvbmUgcGlwZSkKKwkJCQkKKwkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CSMgQWxsb3dlZCB3aGl0ZXNwYWNlLgorCQkJCShbLTpdK1sgXSpbfF1bLXwgOl0qKSBcbgkjICQyOiBIZWFkZXIgdW5kZXJsaW5lCisJCQkJCisJCQkJKAkJCQkJCQkjICQzOiBDZWxscworCQkJCQkoPz4KKwkJCQkJCS4qIFt8XSAuKiBcbgkJIyBSb3cgY29udGVudAorCQkJCQkpKgorCQkJCSkKKwkJCQkoPz1cbnxcWikJCQkJCSMgU3RvcCBhdCBmaW5hbCBkb3VibGUgbmV3bGluZS4KKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfRG9UYWJsZV9jYWxsYmFjaycpLCAkdGV4dCk7CisKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfZG9UYWJsZV9sZWFkaW5nUGlwZV9jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkaGVhZAkJPSAkbWF0Y2hlc1sxXTsKKwkJJHVuZGVybGluZQk9ICRtYXRjaGVzWzJdOworCQkkY29udGVudAk9ICRtYXRjaGVzWzNdOworCQkKKwkJIyBSZW1vdmUgbGVhZGluZyBwaXBlIGZvciBlYWNoIHJvdy4KKwkJJGNvbnRlbnQJPSBwcmVnX3JlcGxhY2UoJy9eICpbfF0vbScsICcnLCAkY29udGVudCk7CisJCQorCQlyZXR1cm4gJHRoaXMtPl9kb1RhYmxlX2NhbGxiYWNrKGFycmF5KCRtYXRjaGVzWzBdLCAkaGVhZCwgJHVuZGVybGluZSwgJGNvbnRlbnQpKTsKKwl9CisJZnVuY3Rpb24gX2RvVGFibGVfY2FsbGJhY2soJG1hdGNoZXMpIHsKKwkJJGhlYWQJCT0gJG1hdGNoZXNbMV07CisJCSR1bmRlcmxpbmUJPSAkbWF0Y2hlc1syXTsKKwkJJGNvbnRlbnQJPSAkbWF0Y2hlc1szXTsKKworCQkjIFJlbW92ZSBhbnkgdGFpbGluZyBwaXBlcyBmb3IgZWFjaCBsaW5lLgorCQkkaGVhZAkJPSBwcmVnX3JlcGxhY2UoJy9bfF0gKiQvbScsICcnLCAkaGVhZCk7CisJCSR1bmRlcmxpbmUJPSBwcmVnX3JlcGxhY2UoJy9bfF0gKiQvbScsICcnLCAkdW5kZXJsaW5lKTsKKwkJJGNvbnRlbnQJPSBwcmVnX3JlcGxhY2UoJy9bfF0gKiQvbScsICcnLCAkY29udGVudCk7CisJCQorCQkjIFJlYWRpbmcgYWxpZ25lbWVudCBmcm9tIGhlYWRlciB1bmRlcmxpbmUuCisJCSRzZXBhcmF0b3JzCT0gcHJlZ19zcGxpdCgnLyAqW3xdICovJywgJHVuZGVybGluZSk7CisJCWZvcmVhY2ggKCRzZXBhcmF0b3JzIGFzICRuID0+ICRzKSB7CisJCQlpZiAocHJlZ19tYXRjaCgnL14gKi0rOiAqJC8nLCAkcykpCQkkYXR0clskbl0gPSAnIGFsaWduPSJyaWdodCInOworCQkJZWxzZSBpZiAocHJlZ19tYXRjaCgnL14gKjotKzogKiQvJywgJHMpKSRhdHRyWyRuXSA9ICcgYWxpZ249ImNlbnRlciInOworCQkJZWxzZSBpZiAocHJlZ19tYXRjaCgnL14gKjotKyAqJC8nLCAkcykpCSRhdHRyWyRuXSA9ICcgYWxpZ249ImxlZnQiJzsKKwkJCWVsc2UJCQkJCQkJCQkkYXR0clskbl0gPSAnJzsKKwkJfQorCQkKKwkJIyBQYXJzaW5nIHNwYW4gZWxlbWVudHMsIGluY2x1ZGluZyBjb2RlIHNwYW5zLCBjaGFyYWN0ZXIgZXNjYXBlcywgCisJCSMgYW5kIGlubGluZSBIVE1MIHRhZ3MsIHNvIHRoYXQgcGlwZXMgaW5zaWRlIHRob3NlIGdldHMgaWdub3JlZC4KKwkJJGhlYWQJCT0gJHRoaXMtPnBhcnNlU3BhbigkaGVhZCk7CisJCSRoZWFkZXJzCT0gcHJlZ19zcGxpdCgnLyAqW3xdICovJywgJGhlYWQpOworCQkkY29sX2NvdW50CT0gY291bnQoJGhlYWRlcnMpOworCQkKKwkJIyBXcml0ZSBjb2x1bW4gaGVhZGVycy4KKwkJJHRleHQgPSAiPHRhYmxlPlxuIjsKKwkJJHRleHQgLj0gIjx0aGVhZD5cbiI7CisJCSR0ZXh0IC49ICI8dHI+XG4iOworCQlmb3JlYWNoICgkaGVhZGVycyBhcyAkbiA9PiAkaGVhZGVyKQorCQkJJHRleHQgLj0gIiAgPHRoJGF0dHJbJG5dPiIuJHRoaXMtPnJ1blNwYW5HYW11dCh0cmltKCRoZWFkZXIpKS4iPC90aD5cbiI7CisJCSR0ZXh0IC49ICI8L3RyPlxuIjsKKwkJJHRleHQgLj0gIjwvdGhlYWQ+XG4iOworCQkKKwkJIyBTcGxpdCBjb250ZW50IGJ5IHJvdy4KKwkJJHJvd3MgPSBleHBsb2RlKCJcbiIsIHRyaW0oJGNvbnRlbnQsICJcbiIpKTsKKwkJCisJCSR0ZXh0IC49ICI8dGJvZHk+XG4iOworCQlmb3JlYWNoICgkcm93cyBhcyAkcm93KSB7CisJCQkjIFBhcnNpbmcgc3BhbiBlbGVtZW50cywgaW5jbHVkaW5nIGNvZGUgc3BhbnMsIGNoYXJhY3RlciBlc2NhcGVzLCAKKwkJCSMgYW5kIGlubGluZSBIVE1MIHRhZ3MsIHNvIHRoYXQgcGlwZXMgaW5zaWRlIHRob3NlIGdldHMgaWdub3JlZC4KKwkJCSRyb3cgPSAkdGhpcy0+cGFyc2VTcGFuKCRyb3cpOworCQkJCisJCQkjIFNwbGl0IHJvdyBieSBjZWxsLgorCQkJJHJvd19jZWxscyA9IHByZWdfc3BsaXQoJy8gKlt8XSAqLycsICRyb3csICRjb2xfY291bnQpOworCQkJJHJvd19jZWxscyA9IGFycmF5X3BhZCgkcm93X2NlbGxzLCAkY29sX2NvdW50LCAnJyk7CisJCQkKKwkJCSR0ZXh0IC49ICI8dHI+XG4iOworCQkJZm9yZWFjaCAoJHJvd19jZWxscyBhcyAkbiA9PiAkY2VsbCkKKwkJCQkkdGV4dCAuPSAiICA8dGQkYXR0clskbl0+Ii4kdGhpcy0+cnVuU3BhbkdhbXV0KHRyaW0oJGNlbGwpKS4iPC90ZD5cbiI7CisJCQkkdGV4dCAuPSAiPC90cj5cbiI7CisJCX0KKwkJJHRleHQgLj0gIjwvdGJvZHk+XG4iOworCQkkdGV4dCAuPSAiPC90YWJsZT4iOworCQkKKwkJcmV0dXJuICR0aGlzLT5oYXNoQmxvY2soJHRleHQpIC4gIlxuIjsKKwl9CisKKwkKKwlmdW5jdGlvbiBkb0RlZkxpc3RzKCR0ZXh0KSB7CisJIworCSMgRm9ybSBIVE1MIGRlZmluaXRpb24gbGlzdHMuCisJIworCQkkbGVzc190aGFuX3RhYiA9ICR0aGlzLT50YWJfd2lkdGggLSAxOworCisJCSMgUmUtdXNhYmxlIHBhdHRlcm4gdG8gbWF0Y2ggYW55IGVudGlyZSBkbCBsaXN0OgorCQkkd2hvbGVfbGlzdF9yZSA9ICcoPz4KKwkJCSgJCQkJCQkJCSMgJDEgPSB3aG9sZSBsaXN0CisJCQkgICgJCQkJCQkJCSMgJDIKKwkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CisJCQkJKCg/Pi4qXFMuKlxuKSspCQkJCSMgJDMgPSBkZWZpbmVkIHRlcm0KKwkJCQlcbj8KKwkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9OlsgXSsgIyBjb2xvbiBzdGFydGluZyBkZWZpbml0aW9uCisJCQkgICkKKwkJCSAgKD9zOi4rPykKKwkJCSAgKAkJCQkJCQkJIyAkNAorCQkJCSAgXHoKKwkJCQl8CisJCQkJICBcbnsyLH0KKwkJCQkgICg/PVxTKQorCQkJCSAgKD8hCQkJCQkJIyBOZWdhdGl2ZSBsb29rYWhlYWQgZm9yIGFub3RoZXIgdGVybQorCQkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CisJCQkJCSg/OiBcUy4qXG4gKSs/CQkJIyBkZWZpbmVkIHRlcm0KKwkJCQkJXG4/CisJCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ306WyBdKyAjIGNvbG9uIHN0YXJ0aW5nIGRlZmluaXRpb24KKwkJCQkgICkKKwkJCQkgICg/IQkJCQkJCSMgTmVnYXRpdmUgbG9va2FoZWFkIGZvciBhbm90aGVyIGRlZmluaXRpb24KKwkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfTpbIF0rICMgY29sb24gc3RhcnRpbmcgZGVmaW5pdGlvbgorCQkJCSAgKQorCQkJICApCisJCQkpCisJCSknOyAvLyBteAorCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CisJCQkJKD8+XEFcbj98KD88PVxuXG4pKQorCQkJCScuJHdob2xlX2xpc3RfcmUuJworCQkJfW14JywKKwkJCWFycmF5KCYkdGhpcywgJ19kb0RlZkxpc3RzX2NhbGxiYWNrJyksICR0ZXh0KTsKKworCQlyZXR1cm4gJHRleHQ7CisJfQorCWZ1bmN0aW9uIF9kb0RlZkxpc3RzX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSMgUmUtdXNhYmxlIHBhdHRlcm5zIHRvIG1hdGNoIGxpc3QgaXRlbSBidWxsZXRzIGFuZCBudW1iZXIgbWFya2VyczoKKwkJJGxpc3QgPSAkbWF0Y2hlc1sxXTsKKwkJCisJCSMgVHVybiBkb3VibGUgcmV0dXJucyBpbnRvIHRyaXBsZSByZXR1cm5zLCBzbyB0aGF0IHdlIGNhbiBtYWtlIGEKKwkJIyBwYXJhZ3JhcGggZm9yIHRoZSBsYXN0IGl0ZW0gaW4gYSBsaXN0LCBpZiBuZWNlc3Nhcnk6CisJCSRyZXN1bHQgPSB0cmltKCR0aGlzLT5wcm9jZXNzRGVmTGlzdEl0ZW1zKCRsaXN0KSk7CisJCSRyZXN1bHQgPSAiPGRsPlxuIiAuICRyZXN1bHQgLiAiXG48L2RsPiI7CisJCXJldHVybiAkdGhpcy0+aGFzaEJsb2NrKCRyZXN1bHQpIC4gIlxuXG4iOworCX0KKworCisJZnVuY3Rpb24gcHJvY2Vzc0RlZkxpc3RJdGVtcygkbGlzdF9zdHIpIHsKKwkjCisJIwlQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIHNpbmdsZSBkZWZpbml0aW9uIGxpc3QsIHNwbGl0dGluZyBpdAorCSMJaW50byBpbmRpdmlkdWFsIHRlcm0gYW5kIGRlZmluaXRpb24gbGlzdCBpdGVtcy4KKwkjCisJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aCAtIDE7CisJCQorCQkjIHRyaW0gdHJhaWxpbmcgYmxhbmsgbGluZXM6CisJCSRsaXN0X3N0ciA9IHByZWdfcmVwbGFjZSgiL1xuezIsfVxcei8iLCAiXG4iLCAkbGlzdF9zdHIpOworCisJCSMgUHJvY2VzcyBkZWZpbml0aW9uIHRlcm1zLgorCQkkbGlzdF9zdHIgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKKwkJCSg/PlxBXG4/fFxuXG4rKQkJCQkJIyBsZWFkaW5nIGxpbmUKKwkJCSgJCQkJCQkJCSMgZGVmaW5pdGlvbiB0ZXJtcyA9ICQxCisJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQkjIGxlYWRpbmcgd2hpdGVzcGFjZQorCQkJCSg/IVs6XVsgXXxbIF0pCQkJCSMgbmVnYXRpdmUgbG9va2FoZWFkIGZvciBhIGRlZmluaXRpb24gCisJCQkJCQkJCQkJCSMgICBtYXJrIChjb2xvbikgb3IgbW9yZSB3aGl0ZXNwYWNlLgorCQkJCSg/PiBcUy4qIFxuKSs/CQkJCSMgYWN0dWFsIHRlcm0gKG5vdCB3aGl0ZXNwYWNlKS4JCisJCQkpCQkJCisJCQkoPz1cbj9bIF17MCwzfTpbIF0pCQkJCSMgbG9va2FoZWFkIGZvciBmb2xsb3dpbmcgbGluZSBmZWVkIAorCQkJCQkJCQkJCQkjICAgd2l0aCBhIGRlZmluaXRpb24gbWFyay4KKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfcHJvY2Vzc0RlZkxpc3RJdGVtc19jYWxsYmFja19kdCcpLCAkbGlzdF9zdHIpOworCisJCSMgUHJvY2VzcyBhY3R1YWwgZGVmaW5pdGlvbnMuCisJCSRsaXN0X3N0ciA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneworCQkJXG4oXG4rKT8JCQkJCQkjIGxlYWRpbmcgbGluZSA9ICQxCisJCQkoCQkJCQkJCQkjIG1hcmtlciBzcGFjZSA9ICQyCisJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQkjIHdoaXRlc3BhY2UgYmVmb3JlIGNvbG9uCisJCQkJWzpdWyBdKwkJCQkJCSMgZGVmaW5pdGlvbiBtYXJrIChjb2xvbikKKwkJCSkKKwkJCSgoP3M6Lis/KSkJCQkJCQkjIGRlZmluaXRpb24gdGV4dCA9ICQzCisJCQkoPz0gXG4rIAkJCQkJCSMgc3RvcCBhdCBuZXh0IGRlZmluaXRpb24gbWFyaywKKwkJCQkoPzoJCQkJCQkJIyBuZXh0IHRlcm0gb3IgZW5kIG9mIHRleHQKKwkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfSBbOl1bIF0JfAorCQkJCQk8ZHQ+IHwgXHoKKwkJCQkpCQkJCQkJCisJCQkpCQkJCQkKKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfcHJvY2Vzc0RlZkxpc3RJdGVtc19jYWxsYmFja19kZCcpLCAkbGlzdF9zdHIpOworCisJCXJldHVybiAkbGlzdF9zdHI7CisJfQorCWZ1bmN0aW9uIF9wcm9jZXNzRGVmTGlzdEl0ZW1zX2NhbGxiYWNrX2R0KCRtYXRjaGVzKSB7CisJCSR0ZXJtcyA9IGV4cGxvZGUoIlxuIiwgdHJpbSgkbWF0Y2hlc1sxXSkpOworCQkkdGV4dCA9ICcnOworCQlmb3JlYWNoICgkdGVybXMgYXMgJHRlcm0pIHsKKwkJCSR0ZXJtID0gJHRoaXMtPnJ1blNwYW5HYW11dCh0cmltKCR0ZXJtKSk7CisJCQkkdGV4dCAuPSAiXG48ZHQ+IiAuICR0ZXJtIC4gIjwvZHQ+IjsKKwkJfQorCQlyZXR1cm4gJHRleHQgLiAiXG4iOworCX0KKwlmdW5jdGlvbiBfcHJvY2Vzc0RlZkxpc3RJdGVtc19jYWxsYmFja19kZCgkbWF0Y2hlcykgeworCQkkbGVhZGluZ19saW5lCT0gJG1hdGNoZXNbMV07CisJCSRtYXJrZXJfc3BhY2UJPSAkbWF0Y2hlc1syXTsKKwkJJGRlZgkJCT0gJG1hdGNoZXNbM107CisKKwkJaWYgKCRsZWFkaW5nX2xpbmUgfHwgcHJlZ19tYXRjaCgnL1xuezIsfS8nLCAkZGVmKSkgeworCQkJIyBSZXBsYWNlIG1hcmtlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSB3aGl0ZXNwYWNlIGluZGVudGF0aW9uCisJCQkkZGVmID0gc3RyX3JlcGVhdCgnICcsIHN0cmxlbigkbWFya2VyX3NwYWNlKSkgLiAkZGVmOworCQkJJGRlZiA9ICR0aGlzLT5ydW5CbG9ja0dhbXV0KCR0aGlzLT5vdXRkZW50KCRkZWYgLiAiXG5cbiIpKTsKKwkJCSRkZWYgPSAiXG4iLiAkZGVmIC4iXG4iOworCQl9CisJCWVsc2UgeworCQkJJGRlZiA9IHJ0cmltKCRkZWYpOworCQkJJGRlZiA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJHRoaXMtPm91dGRlbnQoJGRlZikpOworCQl9CisKKwkJcmV0dXJuICJcbjxkZD4iIC4gJGRlZiAuICI8L2RkPlxuIjsKKwl9CisKKworCWZ1bmN0aW9uIGRvRmVuY2VkQ29kZUJsb2NrcygkdGV4dCkgeworCSMKKwkjIEFkZGluZyB0aGUgZmVuY2VkIGNvZGUgYmxvY2sgc3ludGF4IHRvIHJlZ3VsYXIgTWFya2Rvd246CisJIworCSMgfn5+CisJIyBDb2RlIGJsb2NrCisJIyB+fn4KKwkjCisJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aDsKKwkJCisJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CisJCQkJKD86XG58XEEpCisJCQkJIyAxOiBPcGVuaW5nIG1hcmtlcgorCQkJCSgKKwkJCQkJfnszLH0gIyBNYXJrZXI6IHRocmVlIHRpbGRlIG9yIG1vcmUuCisJCQkJKQorCQkJCVsgXSogXG4gIyBXaGl0ZXNwYWNlIGFuZCBuZXdsaW5lIGZvbGxvd2luZyBtYXJrZXIuCisJCQkJCisJCQkJIyAyOiBDb250ZW50CisJCQkJKAorCQkJCQkoPz4KKwkJCQkJCSg/IVwxIFsgXSogXG4pCSMgTm90IGEgY2xvc2luZyBtYXJrZXIuCisJCQkJCQkuKlxuKworCQkJCQkpKworCQkJCSkKKwkJCQkKKwkJCQkjIENsb3NpbmcgbWFya2VyLgorCQkJCVwxIFsgXSogXG4KKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfZG9GZW5jZWRDb2RlQmxvY2tzX2NhbGxiYWNrJyksICR0ZXh0KTsKKworCQlyZXR1cm4gJHRleHQ7CisJfQorCWZ1bmN0aW9uIF9kb0ZlbmNlZENvZGVCbG9ja3NfY2FsbGJhY2soJG1hdGNoZXMpIHsKKwkJJGNvZGVibG9jayA9ICRtYXRjaGVzWzJdOworCQkkY29kZWJsb2NrID0gaHRtbHNwZWNpYWxjaGFycygkY29kZWJsb2NrLCBFTlRfTk9RVU9URVMpOworCQkkY29kZWJsb2NrID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXlxuKy8nLAorCQkJYXJyYXkoJiR0aGlzLCAnX2RvRmVuY2VkQ29kZUJsb2Nrc19uZXdsaW5lcycpLCAkY29kZWJsb2NrKTsKKwkJJGNvZGVibG9jayA9ICI8cHJlPjxjb2RlPiRjb2RlYmxvY2s8L2NvZGU+PC9wcmU+IjsKKwkJcmV0dXJuICJcblxuIi4kdGhpcy0+aGFzaEJsb2NrKCRjb2RlYmxvY2spLiJcblxuIjsKKwl9CisJZnVuY3Rpb24gX2RvRmVuY2VkQ29kZUJsb2Nrc19uZXdsaW5lcygkbWF0Y2hlcykgeworCQlyZXR1cm4gc3RyX3JlcGVhdCgiPGJyJHRoaXMtPmVtcHR5X2VsZW1lbnRfc3VmZml4IiwgCisJCQlzdHJsZW4oJG1hdGNoZXNbMF0pKTsKKwl9CisKKworCSMKKwkjIFJlZGVmaW5pbmcgZW1waGFzaXMgbWFya2VycyBzbyB0aGF0IGVtcGhhc2lzIGJ5IHVuZGVyc2NvcmUgZG9lcyBub3QKKwkjIHdvcmsgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQuCisJIworCXZhciAkZW1fcmVsaXN0ID0gYXJyYXkoCisJCScnICA9PiAnKD86KD88IVwqKVwqKD8hXCopfCg/PCFbYS16QS1aMC05X10pXyg/IV8pKSg/PVxTfCQpKD8hW1wuLDo7XVxzKScsCisJCScqJyA9PiAnKD88PVxTfF4pKD88IVwqKVwqKD8hXCopJywKKwkJJ18nID0+ICcoPzw9XFN8XikoPzwhXylfKD8hW2EtekEtWjAtOV9dKScsCisJCSk7CisJdmFyICRzdHJvbmdfcmVsaXN0ID0gYXJyYXkoCisJCScnICAgPT4gJyg/Oig/PCFcKilcKlwqKD8hXCopfCg/PCFbYS16QS1aMC05X10pX18oPyFfKSkoPz1cU3wkKSg/IVtcLiw6O11ccyknLAorCQknKionID0+ICcoPzw9XFN8XikoPzwhXCopXCpcKig/IVwqKScsCisJCSdfXycgPT4gJyg/PD1cU3xeKSg/PCFfKV9fKD8hW2EtekEtWjAtOV9dKScsCisJCSk7CisJdmFyICRlbV9zdHJvbmdfcmVsaXN0ID0gYXJyYXkoCisJCScnICAgID0+ICcoPzooPzwhXCopXCpcKlwqKD8hXCopfCg/PCFbYS16QS1aMC05X10pX19fKD8hXykpKD89XFN8JCkoPyFbXC4sOjtdXHMpJywKKwkJJyoqKicgPT4gJyg/PD1cU3xeKSg/PCFcKilcKlwqXCooPyFcKiknLAorCQknX19fJyA9PiAnKD88PVxTfF4pKD88IV8pX19fKD8hW2EtekEtWjAtOV9dKScsCisJCSk7CisKKworCWZ1bmN0aW9uIGZvcm1QYXJhZ3JhcGhzKCR0ZXh0KSB7CisJIworCSMJUGFyYW1zOgorCSMJCSR0ZXh0IC0gc3RyaW5nIHRvIHByb2Nlc3Mgd2l0aCBodG1sIDxwPiB0YWdzCisJIworCQkjIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGxpbmVzOgorCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgnL1xBXG4rfFxuK1x6LycsICcnLCAkdGV4dCk7CisJCQorCQkkZ3JhZnMgPSBwcmVnX3NwbGl0KCcvXG57Mix9LycsICR0ZXh0LCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7CisKKwkJIworCQkjIFdyYXAgPHA+IHRhZ3MgYW5kIHVuaGFzaGlmeSBIVE1MIGJsb2NrcworCQkjCisJCWZvcmVhY2ggKCRncmFmcyBhcyAka2V5ID0+ICR2YWx1ZSkgeworCQkJJHZhbHVlID0gdHJpbSgkdGhpcy0+cnVuU3BhbkdhbXV0KCR2YWx1ZSkpOworCQkJCisJCQkjIENoZWNrIGlmIHRoaXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgcGFyYWdyYXBoLgorCQkJIyBDbGVhbiB0YWcgaGFzaGVzICYgYmxvY2sgdGFnIGhhc2hlcyBhcmUgbGVmdCBhbG9uZS4KKwkJCSRpc19wID0gIXByZWdfbWF0Y2goJy9eQlx4MUFbMC05XStCfF5DXHgxQVswLTldK0MkLycsICR2YWx1ZSk7CisJCQkKKwkJCWlmICgkaXNfcCkgeworCQkJCSR2YWx1ZSA9ICI8cD4kdmFsdWU8L3A+IjsKKwkJCX0KKwkJCSRncmFmc1ska2V5XSA9ICR2YWx1ZTsKKwkJfQorCQkKKwkJIyBKb2luIGdyYWZzIGluIG9uZSB0ZXh0LCB0aGVuIHVuaGFzaCBIVE1MIHRhZ3MuIAorCQkkdGV4dCA9IGltcGxvZGUoIlxuXG4iLCAkZ3JhZnMpOworCQkKKwkJIyBGaW5pc2ggYnkgcmVtb3ZpbmcgYW55IHRhZyBoYXNoZXMgc3RpbGwgcHJlc2VudCBpbiAkdGV4dC4KKwkJJHRleHQgPSAkdGhpcy0+dW5oYXNoKCR0ZXh0KTsKKwkJCisJCXJldHVybiAkdGV4dDsKKwl9CisJCisJCisJIyMjIEZvb3Rub3RlcworCQorCWZ1bmN0aW9uIHN0cmlwRm9vdG5vdGVzKCR0ZXh0KSB7CisJIworCSMgU3RyaXBzIGxpbmsgZGVmaW5pdGlvbnMgZnJvbSB0ZXh0LCBzdG9yZXMgdGhlIFVSTHMgYW5kIHRpdGxlcyBpbgorCSMgaGFzaCByZWZlcmVuY2VzLgorCSMKKwkJJGxlc3NfdGhhbl90YWIgPSAkdGhpcy0+dGFiX3dpZHRoIC0gMTsKKworCQkjIExpbmsgZGVmcyBhcmUgaW4gdGhlIGZvcm06IFteaWRdOiB1cmwgIm9wdGlvbmFsIHRpdGxlIgorCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneworCQkJXlsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ31cW1xeKC4rPylcXVsgXT86CSMgbm90ZV9pZCA9ICQxCisJCQkgIFsgXSoKKwkJCSAgXG4/CQkJCQkjIG1heWJlICpvbmUqIG5ld2xpbmUKKwkJCSgJCQkJCQkjIHRleHQgPSAkMiAobm8gYmxhbmsgbGluZXMgYWxsb3dlZCkKKwkJCQkoPzoJCQkJCQorCQkJCQkuKwkJCQkjIGFjdHVhbCB0ZXh0CisJCQkJfAorCQkJCQlcbgkJCQkjIG5ld2xpbmVzIGJ1dCAKKwkJCQkJKD8hXFtcXi4rP1xdOlxzKSMgbmVnYXRpdmUgbG9va2FoZWFkIGZvciBmb290bm90ZSBtYXJrZXIuCisJCQkJCSg/IVxuK1sgXXswLDN9XFMpIyBlbnN1cmUgbGluZSBpcyBub3QgYmxhbmsgYW5kIGZvbGxvd2VkIAorCQkJCQkJCQkJIyBieSBub24taW5kZW50ZWQgY29udGVudAorCQkJCSkqCisJCQkpCQkKKwkJCX14bScsCisJCQlhcnJheSgmJHRoaXMsICdfc3RyaXBGb290bm90ZXNfY2FsbGJhY2snKSwKKwkJCSR0ZXh0KTsKKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfc3RyaXBGb290bm90ZXNfY2FsbGJhY2soJG1hdGNoZXMpIHsKKwkJJG5vdGVfaWQgPSAkdGhpcy0+Zm5faWRfcHJlZml4IC4gJG1hdGNoZXNbMV07CisJCSR0aGlzLT5mb290bm90ZXNbJG5vdGVfaWRdID0gJHRoaXMtPm91dGRlbnQoJG1hdGNoZXNbMl0pOworCQlyZXR1cm4gJyc7ICMgU3RyaW5nIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBibG9jaworCX0KKworCisJZnVuY3Rpb24gZG9Gb290bm90ZXMoJHRleHQpIHsKKwkjCisJIyBSZXBsYWNlIGZvb3Rub3RlIHJlZmVyZW5jZXMgaW4gJHRleHQgW15pZF0gd2l0aCBhIHNwZWNpYWwgdGV4dC10b2tlbiAKKwkjIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCBmb290bm90ZSBtYXJrZXIgaW4gYXBwZW5kRm9vdG5vdGVzLgorCSMKKwkJaWYgKCEkdGhpcy0+aW5fYW5jaG9yKSB7CisJCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgne1xbXF4oLis/KVxdfScsICJGXHgxQWZuOlxcMVx4MUE6IiwgJHRleHQpOworCQl9CisJCXJldHVybiAkdGV4dDsKKwl9CisKKwkKKwlmdW5jdGlvbiBhcHBlbmRGb290bm90ZXMoJHRleHQpIHsKKwkjCisJIyBBcHBlbmQgZm9vdG5vdGUgbGlzdCB0byB0ZXh0LgorCSMKKwkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3tGXHgxQWZuOiguKj8pXHgxQTp9JywgCisJCQlhcnJheSgmJHRoaXMsICdfYXBwZW5kRm9vdG5vdGVzX2NhbGxiYWNrJyksICR0ZXh0KTsKKwkKKwkJaWYgKCFlbXB0eSgkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWQpKSB7CisJCQkkdGV4dCAuPSAiXG5cbiI7CisJCQkkdGV4dCAuPSAiPGRpdiBjbGFzcz1cImZvb3Rub3Rlc1wiPlxuIjsKKwkJCSR0ZXh0IC49ICI8aHIiLiAkdGhpcy0+ZW1wdHlfZWxlbWVudF9zdWZmaXggLiJcbiI7CisJCQkkdGV4dCAuPSAiPG9sPlxuXG4iOworCQkJCisJCQkkYXR0ciA9ICIgcmV2PVwiZm9vdG5vdGVcIiI7CisJCQlpZiAoJHRoaXMtPmZuX2JhY2tsaW5rX2NsYXNzICE9ICIiKSB7CisJCQkJJGNsYXNzID0gJHRoaXMtPmZuX2JhY2tsaW5rX2NsYXNzOworCQkJCSRjbGFzcyA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJGNsYXNzKTsKKwkJCQkkYXR0ciAuPSAiIGNsYXNzPVwiJGNsYXNzXCIiOworCQkJfQorCQkJaWYgKCR0aGlzLT5mbl9iYWNrbGlua190aXRsZSAhPSAiIikgeworCQkJCSR0aXRsZSA9ICR0aGlzLT5mbl9iYWNrbGlua190aXRsZTsKKwkJCQkkdGl0bGUgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR0aXRsZSk7CisJCQkJJGF0dHIgLj0gIiB0aXRsZT1cIiR0aXRsZVwiIjsKKwkJCX0KKwkJCSRudW0gPSAwOworCQkJCisJCQl3aGlsZSAoIWVtcHR5KCR0aGlzLT5mb290bm90ZXNfb3JkZXJlZCkpIHsKKwkJCQkkZm9vdG5vdGUgPSByZXNldCgkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWQpOworCQkJCSRub3RlX2lkID0ga2V5KCR0aGlzLT5mb290bm90ZXNfb3JkZXJlZCk7CisJCQkJdW5zZXQoJHRoaXMtPmZvb3Rub3Rlc19vcmRlcmVkWyRub3RlX2lkXSk7CisJCQkJCisJCQkJJGZvb3Rub3RlIC49ICJcbiI7ICMgTmVlZCB0byBhcHBlbmQgbmV3bGluZSBiZWZvcmUgcGFyc2luZy4KKwkJCQkkZm9vdG5vdGUgPSAkdGhpcy0+cnVuQmxvY2tHYW11dCgiJGZvb3Rub3RlXG4iKTsJCQkJCisJCQkJJGZvb3Rub3RlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7Rlx4MUFmbjooLio/KVx4MUE6fScsIAorCQkJCQlhcnJheSgmJHRoaXMsICdfYXBwZW5kRm9vdG5vdGVzX2NhbGxiYWNrJyksICRmb290bm90ZSk7CisJCQkJCisJCQkJJGF0dHIgPSBzdHJfcmVwbGFjZSgiJSUiLCArKyRudW0sICRhdHRyKTsKKwkJCQkkbm90ZV9pZCA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJG5vdGVfaWQpOworCQkJCQorCQkJCSMgQWRkIGJhY2tsaW5rIHRvIGxhc3QgcGFyYWdyYXBoOyBjcmVhdGUgbmV3IHBhcmFncmFwaCBpZiBuZWVkZWQuCisJCQkJJGJhY2tsaW5rID0gIjxhIGhyZWY9XCIjZm5yZWY6JG5vdGVfaWRcIiRhdHRyPiYjODYxNzs8L2E+IjsKKwkJCQlpZiAocHJlZ19tYXRjaCgnezwvcD4kfScsICRmb290bm90ZSkpIHsKKwkJCQkJJGZvb3Rub3RlID0gc3Vic3RyKCRmb290bm90ZSwgMCwgLTQpIC4gIiYjMTYwOyRiYWNrbGluazwvcD4iOworCQkJCX0gZWxzZSB7CisJCQkJCSRmb290bm90ZSAuPSAiXG5cbjxwPiRiYWNrbGluazwvcD4iOworCQkJCX0KKwkJCQkKKwkJCQkkdGV4dCAuPSAiPGxpIGlkPVwiZm46JG5vdGVfaWRcIj5cbiI7CisJCQkJJHRleHQgLj0gJGZvb3Rub3RlIC4gIlxuIjsKKwkJCQkkdGV4dCAuPSAiPC9saT5cblxuIjsKKwkJCX0KKwkJCQorCQkJJHRleHQgLj0gIjwvb2w+XG4iOworCQkJJHRleHQgLj0gIjwvZGl2PiI7CisJCX0KKwkJcmV0dXJuICR0ZXh0OworCX0KKwlmdW5jdGlvbiBfYXBwZW5kRm9vdG5vdGVzX2NhbGxiYWNrKCRtYXRjaGVzKSB7CisJCSRub2RlX2lkID0gJHRoaXMtPmZuX2lkX3ByZWZpeCAuICRtYXRjaGVzWzFdOworCQkKKwkJIyBDcmVhdGUgZm9vdG5vdGUgbWFya2VyIG9ubHkgaWYgaXQgaGFzIGEgY29ycmVzcG9uZGluZyBmb290bm90ZSAqYW5kKgorCQkjIHRoZSBmb290bm90ZSBoYXNuJ3QgYmVlbiB1c2VkIGJ5IGFub3RoZXIgbWFya2VyLgorCQlpZiAoaXNzZXQoJHRoaXMtPmZvb3Rub3Rlc1skbm9kZV9pZF0pKSB7CisJCQkjIFRyYW5zZmVydCBmb290bm90ZSBjb250ZW50IHRvIHRoZSBvcmRlcmVkIGxpc3QuCisJCQkkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWRbJG5vZGVfaWRdID0gJHRoaXMtPmZvb3Rub3Rlc1skbm9kZV9pZF07CisJCQl1bnNldCgkdGhpcy0+Zm9vdG5vdGVzWyRub2RlX2lkXSk7CisJCQkKKwkJCSRudW0gPSAkdGhpcy0+Zm9vdG5vdGVfY291bnRlcisrOworCQkJJGF0dHIgPSAiIHJlbD1cImZvb3Rub3RlXCIiOworCQkJaWYgKCR0aGlzLT5mbl9saW5rX2NsYXNzICE9ICIiKSB7CisJCQkJJGNsYXNzID0gJHRoaXMtPmZuX2xpbmtfY2xhc3M7CisJCQkJJGNsYXNzID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkY2xhc3MpOworCQkJCSRhdHRyIC49ICIgY2xhc3M9XCIkY2xhc3NcIiI7CisJCQl9CisJCQlpZiAoJHRoaXMtPmZuX2xpbmtfdGl0bGUgIT0gIiIpIHsKKwkJCQkkdGl0bGUgPSAkdGhpcy0+Zm5fbGlua190aXRsZTsKKwkJCQkkdGl0bGUgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR0aXRsZSk7CisJCQkJJGF0dHIgLj0gIiB0aXRsZT1cIiR0aXRsZVwiIjsKKwkJCX0KKwkJCQorCQkJJGF0dHIgPSBzdHJfcmVwbGFjZSgiJSUiLCAkbnVtLCAkYXR0cik7CisJCQkkbm9kZV9pZCA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJG5vZGVfaWQpOworCQkJCisJCQlyZXR1cm4KKwkJCQkiPHN1cCBpZD1cImZucmVmOiRub2RlX2lkXCI+Ii4KKwkJCQkiPGEgaHJlZj1cIiNmbjokbm9kZV9pZFwiJGF0dHI+JG51bTwvYT4iLgorCQkJCSI8L3N1cD4iOworCQl9CisJCQorCQlyZXR1cm4gIlteIi4kbWF0Y2hlc1sxXS4iXSI7CisJfQorCQkKKwkKKwkjIyMgQWJicmV2aWF0aW9ucyAjIyMKKwkKKwlmdW5jdGlvbiBzdHJpcEFiYnJldmlhdGlvbnMoJHRleHQpIHsKKwkjCisJIyBTdHJpcHMgYWJicmV2aWF0aW9ucyBmcm9tIHRleHQsIHN0b3JlcyB0aXRsZXMgaW4gaGFzaCByZWZlcmVuY2VzLgorCSMKKwkJJGxlc3NfdGhhbl90YWIgPSAkdGhpcy0+dGFiX3dpZHRoIC0gMTsKKworCQkjIExpbmsgZGVmcyBhcmUgaW4gdGhlIGZvcm06IFtpZF0qOiB1cmwgIm9wdGlvbmFsIHRpdGxlIgorCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneworCQkJXlsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ31cKlxbKC4rPylcXVsgXT86CSMgYWJicl9pZCA9ICQxCisJCQkoLiopCQkJCQkjIHRleHQgPSAkMiAobm8gYmxhbmsgbGluZXMgYWxsb3dlZCkJCisJCQl9eG0nLAorCQkJYXJyYXkoJiR0aGlzLCAnX3N0cmlwQWJicmV2aWF0aW9uc19jYWxsYmFjaycpLAorCQkJJHRleHQpOworCQlyZXR1cm4gJHRleHQ7CisJfQorCWZ1bmN0aW9uIF9zdHJpcEFiYnJldmlhdGlvbnNfY2FsbGJhY2soJG1hdGNoZXMpIHsKKwkJJGFiYnJfd29yZCA9ICRtYXRjaGVzWzFdOworCQkkYWJicl9kZXNjID0gJG1hdGNoZXNbMl07CisJCWlmICgkdGhpcy0+YWJicl93b3JkX3JlKQorCQkJJHRoaXMtPmFiYnJfd29yZF9yZSAuPSAnfCc7CisJCSR0aGlzLT5hYmJyX3dvcmRfcmUgLj0gcHJlZ19xdW90ZSgkYWJicl93b3JkKTsKKwkJJHRoaXMtPmFiYnJfZGVzY2lwdGlvbnNbJGFiYnJfd29yZF0gPSB0cmltKCRhYmJyX2Rlc2MpOworCQlyZXR1cm4gJyc7ICMgU3RyaW5nIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBibG9jaworCX0KKwkKKwkKKwlmdW5jdGlvbiBkb0FiYnJldmlhdGlvbnMoJHRleHQpIHsKKwkjCisJIyBGaW5kIGRlZmluZWQgYWJicmV2aWF0aW9ucyBpbiB0ZXh0IGFuZCB3cmFwIHRoZW0gaW4gPGFiYnI+IGVsZW1lbnRzLgorCSMKKwkJaWYgKCR0aGlzLT5hYmJyX3dvcmRfcmUpIHsKKwkJCS8vIGNhbm5vdCB1c2UgdGhlIC94IG1vZGlmaWVyIGJlY2F1c2UgYWJicl93b3JkX3JlIG1heSAKKwkJCS8vIGNvbnRhaW4gc2lnbmlmaWNhbnQgc3BhY2VzOgorCQkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3snLgorCQkJCScoPzwhW1x3XHgxQV0pJy4KKwkJCQknKD86Jy4kdGhpcy0+YWJicl93b3JkX3JlLicpJy4KKwkJCQknKD8hW1x3XHgxQV0pJy4KKwkJCQknfScsIAorCQkJCWFycmF5KCYkdGhpcywgJ19kb0FiYnJldmlhdGlvbnNfY2FsbGJhY2snKSwgJHRleHQpOworCQl9CisJCXJldHVybiAkdGV4dDsKKwl9CisJZnVuY3Rpb24gX2RvQWJicmV2aWF0aW9uc19jYWxsYmFjaygkbWF0Y2hlcykgeworCQkkYWJiciA9ICRtYXRjaGVzWzBdOworCQlpZiAoaXNzZXQoJHRoaXMtPmFiYnJfZGVzY2lwdGlvbnNbJGFiYnJdKSkgeworCQkJJGRlc2MgPSAkdGhpcy0+YWJicl9kZXNjaXB0aW9uc1skYWJicl07CisJCQlpZiAoZW1wdHkoJGRlc2MpKSB7CisJCQkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgiPGFiYnI+JGFiYnI8L2FiYnI+Iik7CisJCQl9IGVsc2UgeworCQkJCSRkZXNjID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkZGVzYyk7CisJCQkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgiPGFiYnIgdGl0bGU9XCIkZGVzY1wiPiRhYmJyPC9hYmJyPiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuICRtYXRjaGVzWzBdOworCQl9CisJfQorCit9CisKKworLyoKKworUEhQIE1hcmtkb3duIEV4dHJhCis9PT09PT09PT09PT09PT09PT0KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgaXMgYSBQSFAgcG9ydCBvZiB0aGUgb3JpZ2luYWwgTWFya2Rvd24gZm9ybWF0dGVyIHdyaXR0ZW4gaW4gUGVybCAKK2J5IEpvaG4gR3J1YmVyLiBUaGlzIHNwZWNpYWwgIkV4dHJhIiB2ZXJzaW9uIG9mIFBIUCBNYXJrZG93biBmZWF0dXJlcyAKK2Z1cnRoZXIgZW5oYW5jZW1lbnRzIHRvIHRoZSBzeW50YXggZm9yIG1ha2luZyBhZGRpdGlvbmFsIGNvbnN0cnVjdHMgCitzdWNoIGFzIHRhYmxlcyBhbmQgZGVmaW5pdGlvbiBsaXN0LgorCitNYXJrZG93biBpcyBhIHRleHQtdG8tSFRNTCBmaWx0ZXI7IGl0IHRyYW5zbGF0ZXMgYW4gZWFzeS10by1yZWFkIC8KK2Vhc3ktdG8td3JpdGUgc3RydWN0dXJlZCB0ZXh0IGZvcm1hdCBpbnRvIEhUTUwuIE1hcmtkb3duJ3MgdGV4dCBmb3JtYXQKK2lzIG1vc3Qgc2ltaWxhciB0byB0aGF0IG9mIHBsYWluIHRleHQgZW1haWwsIGFuZCBzdXBwb3J0cyBmZWF0dXJlcyBzdWNoCithcyBoZWFkZXJzLCAqZW1waGFzaXMqLCBjb2RlIGJsb2NrcywgYmxvY2txdW90ZXMsIGFuZCBsaW5rcy4KKworTWFya2Rvd24ncyBzeW50YXggaXMgZGVzaWduZWQgbm90IGFzIGEgZ2VuZXJpYyBtYXJrdXAgbGFuZ3VhZ2UsIGJ1dAorc3BlY2lmaWNhbGx5IHRvIHNlcnZlIGFzIGEgZnJvbnQtZW5kIHRvIChYKUhUTUwuIFlvdSBjYW4gdXNlIHNwYW4tbGV2ZWwKK0hUTUwgdGFncyBhbnl3aGVyZSBpbiBhIE1hcmtkb3duIGRvY3VtZW50LCBhbmQgeW91IGNhbiB1c2UgYmxvY2sgbGV2ZWwKK0hUTUwgdGFncyAobGlrZSA8ZGl2PiBhbmQgPHRhYmxlPiBhcyB3ZWxsKS4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgTWFya2Rvd24ncyBzeW50YXgsIHNlZToKKworPGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vPgorCisKK0J1Z3MKKy0tLS0KKworVG8gZmlsZSBidWcgcmVwb3J0cyBwbGVhc2Ugc2VuZCBlbWFpbCB0bzoKKworPG1pY2hlbC5mb3J0aW5AbWljaGVsZi5jb20+CisKK1BsZWFzZSBpbmNsdWRlIHdpdGggeW91ciByZXBvcnQ6ICgxKSB0aGUgZXhhbXBsZSBpbnB1dDsgKDIpIHRoZSBvdXRwdXQgeW91CitleHBlY3RlZDsgKDMpIHRoZSBvdXRwdXQgTWFya2Rvd24gYWN0dWFsbHkgcHJvZHVjZWQuCisKKworVmVyc2lvbiBIaXN0b3J5CistLS0tLS0tLS0tLS0tLS0gCisKK1NlZSB0aGUgcmVhZG1lIGZpbGUgZm9yIGRldGFpbGVkIHJlbGVhc2Ugbm90ZXMgZm9yIHRoaXMgdmVyc2lvbi4KKworCitDb3B5cmlnaHQgYW5kIExpY2Vuc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQSFAgTWFya2Rvd24gJiBFeHRyYSAgCitDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOSBNaWNoZWwgRm9ydGluICAKKzxodHRwOi8vbWljaGVsZi5jb20vPiAgCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitCYXNlZCBvbiBNYXJrZG93biAgCitDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBKb2huIEdydWJlciAgIAorPGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvPiAgIAorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyoJUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorCXRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyoJUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworKglOZWl0aGVyIHRoZSBuYW1lICJNYXJrZG93biIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorCWJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisJd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzCitpcyIgYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQKK3RvLCB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYQorcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLiBJbiBubyBldmVudCBzaGFsbCB0aGUgY29weXJpZ2h0IG93bmVyCitvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwKK2V4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywKK3Byb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvcgorcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZgorbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcKK25lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcworc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKyovCis/PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc2NoZW1hcy9zY2hlbWEucGRvLm15c3FsIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zY2hlbWFzL3NjaGVtYS5wZG8ubXlzcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzZDMwZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc2NoZW1hcy9zY2hlbWEucGRvLm15c3FsCkBAIC0wLDAgKzEsMjYgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCistLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCistLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy0tIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy0tIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgcHVueV9yZXNvdXJjZWAKKy0tCisKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGBwdW55X3Jlc291cmNlYCAoCisgIGByZXNvdXJjZUlkYCB2YXJjaGFyKDYwKSBOT1QgTlVMTCwKKyAgYHZlcnNpb25gIGludCgxMCkgdW5zaWduZWQgTk9UIE5VTEwsCisgIGBwYXJzZXJgIHZhcmNoYXIoNjApIE5PVCBOVUxMLAorICBgY29udGVudGAgdGV4dCBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgIChgcmVzb3VyY2VJZGAsYHZlcnNpb25gKQorKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjEgQ09NTUVOVD0nUHVueSBjb250ZW50IHJlc291cmNlcyc7CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3NjcmlwdHMvbG9naW4ucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zY3JpcHRzL2xvZ2luLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM4ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zY3JpcHRzL2xvZ2luLnBocApAQCAtMCwwICsxLDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEluY2x1ZGUgdGhlIG1haW4gUHVueSBjbGFzcworcmVxdWlyZV9vbmNlKEFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X21vZHVsZV9wYXRoJ10gLiAnL2NsYXNzZXMvUHVueS5jbGFzcy5waHAnKTsKKworLy8gR2V0IHRoZSBjb25maWd1cmVkIGVkaXRvciB1c2VybmFtZSAvIHBhc3N3b3JkCiskcHVueVVzZXJuYW1lID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfZWRpdG9yX3VzZXJuYW1lJ107CiskcHVueVBhc3N3b3JkID0gQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfZWRpdG9yX3Bhc3N3b3JkJ107CisKKy8vIEdldCB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHMgZnJvbSB0aGUgUE9TVCByZXF1ZXN0CiskdXNlcm5hbWUgPSAkX1BPU1RbJ3VzZXJuYW1lJ107CiskcGFzc3dvcmQgPSAkX1BPU1RbJ3Bhc3N3b3JkJ107CisKKy8vIEVuc3VyZSB0aGF0IHRoZSBlZGl0b3IgY3JlZGVudGlhbHMgYXJlIHByb3Blcmx5IGNvbmZpZ3VyZWQgaW4gY29uZmlnLmluaQoraWYgKCAhKCRwdW55VXNlcm5hbWUgJiYgJHB1bnlQYXNzd29yZCkgKSB7CisJJF9TRVNTSU9OWydwdW55X2Vycm9yJ10gPSAiVW5hYmxlIHRvIGxhdW5jaCBQdW55IGJlY2F1c2UgdGhlIFB1bnkgIgorCQkuICJhZG1pbiBjcmVkZW50aWFscyBhcmUgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIjsKKwlBcHA6OkdldCgpLT5yZWRpcmVjdChBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9tb2R1bGVfcm9vdCddIC4gJy9lcnJvcicpOworfQorCisvLyBUZXN0IHRoZSBwcm92aWRlZCB2YWx1ZXMgYWdhaW5zdCB0aGUgY29uZmlndXJlZCB2YWx1ZXMKK2lmICggJHVzZXJuYW1lID09ICRwdW55VXNlcm5hbWUgJiYgJHBhc3N3b3JkID09ICRwdW55UGFzc3dvcmQgKSB7CisJLy8gTG9naW4gc3VjY2VzcworCVB1bnk6OmluaXRpYWxpemVFZGl0b3JTZXNzaW9uKCk7CisJQXBwOjpnZXQoKS0+cmVkaXJlY3QoU0lURV9ST09UIC4gJy8nKTsKK30gZWxzZSB7CisJLy8gTG9naW4gRmFpbHVyZS4uLgorCSRfU0VTU0lPTlsncHVueV9lcnJvciddID0gIkludmFsaWQgZWRpdG9yIGNyZWRlbnRpYWxzIHByb3ZpZGVkLi4uIjsKKwlBcHA6OkdldCgpLT5yZWRpcmVjdChBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9tb2R1bGVfcm9vdCddIC4gJy9lcnJvcicpOworfQorCitleGl0KCk7CisKKworCisKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc2NyaXB0cy9sb2dvdXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zY3JpcHRzL2xvZ291dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyM2ZlYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc2NyaXB0cy9sb2dvdXQucGhwCkBAIC0wLDAgKzEsMzIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gUGFyc2UgdGhlIFB1bnkgY29uZmlnIGZpbGUKKyRtb2R1bGUgPSBBcHA6OkdldCgpLT5sb2FkTW9kdWxlKCk7CisKKy8vIEluY2x1ZGUgdGhlIG1haW4gUHVueSBjbGFzcworcmVxdWlyZV9vbmNlKEFwcDo6R2V0KCktPnNldHRpbmdzWydwdW55X21vZHVsZV9wYXRoJ10gLiAnL2NsYXNzZXMvUHVueS5jbGFzcy5waHAnKTsKKworLy8gRGVzdHJveSB0aGUgZWRpdG9yIHNlc3Npb24KK1B1bnk6OmRlc3Ryb3lFZGl0b3JTZXNzaW9uKCk7CisKKy8vIFJlZGlyZWN0IGhvbWUKK0FwcDo6R2V0KCktPnJlZGlyZWN0KFNJVEVfUk9PVCAuICcvJyk7CisKK2V4aXQoKTsKKwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zY3JpcHRzL3N0b3JlLnBocCBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc2NyaXB0cy9zdG9yZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNjY1YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc2NyaXB0cy9zdG9yZS5waHAKQEAgLTAsMCArMSw0MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBQYXJzZSB0aGUgUHVueSBjb25maWcgZmlsZQorJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworLy8gSW5jbHVkZSB0aGUgbWFpbiBQdW55IGNsYXNzCityZXF1aXJlX29uY2UoQXBwOjpHZXQoKS0+c2V0dGluZ3NbJ3B1bnlfbW9kdWxlX3BhdGgnXSAuICcvY2xhc3Nlcy9QdW55LmNsYXNzLnBocCcpOworCisvLyBHZXQgdGhlIHJlc291cmNlIGlkIGZyb20gdGhlIHJlcXVlc3QgcGFyYW1ldGVycworJHJlc291cmNlSWQgPSAkX1BPU1RbJ3Jlc291cmNlSWQnXTsKKyRjb250ZW50ICAgID0gJF9QT1NUWydjb250ZW50J107CisKKy8vIExvYWQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBhbmQgdXBkYXRlIHRoZSBjb250ZW50CiskcmVzb3VyY2UgPSBQdW55Ojpsb2FkKCRyZXNvdXJjZUlkKS0+c2V0Q29udGVudCgkY29udGVudCk7CisKKy8vIFN0b3JlIHRoZSB1cGRhdGVkIGNvbnRlbnQgYXMgYSBuZXcgdmVyc2lvbgorUHVueTo6c3RvcmUoJHJlc291cmNlKTsKKworLy8gd2UncmUgZG9uZSA6KQorZWNobyBqc29uX2VuY29kZShhcnJheSgKKwkic3RhdHVzIiAgICAgPT4gIm9rIgorCSwgInJlc291cmNlSWQiID0+ICRyZXNvdXJjZUlkCisJLCAidmVyc2lvbiIgICAgPT4gJHJlc291cmNlLT5nZXRWZXJzaW9uKCkKKwksICJwYXJzZWRDb250ZW50IiA9PiAkcmVzb3VyY2UtPnBhcnNlKCktPmdldENvbnRlbnQoKSkpOwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvY3NzL2RlZmF1bHRzLmNzcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9kZWZhdWx0cy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmODljMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9kZWZhdWx0cy5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK0BDSEFSU0VUICJVVEYtOCI7CisKKy8qIFB1bnkgTW9kdWxlIERlZmF1bHQgU3R5bGUgKi8KKworW3B1bnldIGJsb2NrcXVvdGUgeworCW1hcmdpbjoyMHB4IDQwcHg7Cit9CitbcHVueV0gY29kZSB7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KK1twdW55XSBlbSB7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorW3B1bnldIG9sIHsKKwlsaXN0LXN0eWxlOiBkZWNpbWFsOworfQorW3B1bnldIHVsIHsKKwlsaXN0LXN0eWxlOiBkaXNjOworfQorW3B1bnldIHN0cm9uZyB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9jc3MvZGlhbG9nLmNzcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9kaWFsb2cuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGIwODMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9jc3MvZGlhbG9nLmNzcwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgCisvKiBAY29udHJvbCBkaWFsb2cgKi8KKworI2dvbGx1bS1kaWFsb2ctZGlhbG9nIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDUwJTsKK30KKworI2dvbGx1bS1kaWFsb2ctZGlhbG9nLmFjdGl2ZSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjZ29sbHVtLWRpYWxvZy1kaWFsb2ctaW5uZXIgeworICBtYXJnaW46IDAgMCAwIC0yMjVweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB3aWR0aDogNDUwcHg7CisKKyAgYm9yZGVyOiA3cHggc29saWQgIzk5OTsKKyAgYm9yZGVyOiA3cHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpOyAKKyAgYm9yZGVyLXJhZGl1czogNXB4OworICAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7Cit9CisKKyNnb2xsdW0tZGlhbG9nLWRpYWxvZy1iZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDFlbTsKKyAgCisgIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oI2Y3ZjdmNyksIHRvKCNmZmZmZmYpKTsKKyAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZjdmN2Y3LCAjZmZmZmZmKTsKK30KKworI2dvbGx1bS1kaWFsb2ctZGlhbG9nLWlubmVyIGg0IHsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7CisgIGNvbG9yOiAjMDAwOworICBmb250LXNpemU6IDEuOGVtOworICBsaW5lLWhlaWdodDogbm9ybWFsOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luOiAwIDAgMC43NWVtIDA7CisgIHBhZGRpbmc6IDAgMCAwLjNlbSAwOworfQorCisjZ29sbHVtLWRpYWxvZy1kaWFsb2ctYm9keSB7CisgIGZvbnQtc2l6ZTogMS4yZW07CisgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKK30KKworI2dvbGx1bS1kaWFsb2ctZGlhbG9nLWJvZHkgZmllbGRzZXQgeworICBkaXNwbGF5OiBibG9jazsKKyAgYm9yZGVyOiAwOworICBtYXJnaW46IDA7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDA7Cit9CisKKyNnb2xsdW0tZGlhbG9nLWRpYWxvZy1ib2R5IGZpZWxkc2V0IC5maWVsZCB7CisgIG1hcmdpbjogMCAwIDEuNWVtIDA7CisgIHBhZGRpbmc6IDA7Cit9CisKKyAgI2dvbGx1bS1kaWFsb2ctZGlhbG9nLWJvZHkgZmllbGRzZXQgLmZpZWxkIGxhYmVsIHsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBmb250LXNpemU6IDEuMmVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBtaW4td2lkdGg6IDgwcHg7CisgIH0KKyAgCisgICNnb2xsdW0tZGlhbG9nLWRpYWxvZy1ib2R5IGZpZWxkc2V0IC5maWVsZCBpbnB1dFt0eXBlPSJ0ZXh0Il0geworICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBsaW5lLWhlaWdodDogMS42ZW07CisgICAgbWFyZ2luOiAwLjNlbSAwIDAgMDsKKyAgICBwYWRkaW5nOiAwLjNlbSAwLjVlbTsKKyAgICB3aWR0aDogOTYuNSU7CisgIH0KKyAgCisgICNnb2xsdW0tZGlhbG9nLWRpYWxvZy1ib2R5IGZpZWxkc2V0IC5maWVsZCBpbnB1dC5jb2RlIHsKKyAgICBmb250LWZhbWlseTogJ01vbmFjbycsICdDb3VyaWVyIE5ldycsIENvdXJpZXIsIG1vbm9zcGFjZTsKKyAgfQorICAKKyNnb2xsdW0tZGlhbG9nLWRpYWxvZy1ib2R5IGZpZWxkc2V0IC5maWVsZDpsYXN0LWNoaWxkIHsKKyAgbWFyZ2luOiAwIDAgMWVtIDA7Cit9CisKKyNnb2xsdW0tZGlhbG9nLWRpYWxvZy1idXR0b25zIHsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIG1hcmdpbjogMS41ZW0gMCAwIDA7CisgIHBhZGRpbmc6IDFlbSAwIDAgMDsKK30KKworI2dvbGx1bS1kaWFsb2ctZGlhbG9nIGEubWluaWJ1dHRvbiB7CisgIGZsb2F0OiByaWdodDsKKyAgbWFyZ2luLXJpZ2h0OiAwLjVlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNnb2xsdW0tZGlhbG9nLWRpYWxvZyBhLm1pbmlidXR0b24sCisjZ29sbHVtLWRpYWxvZy1kaWFsb2cgYS5taW5pYnV0dG9uOnZpc2l0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OworICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OworICBjb2xvcjogIzMzMzsKKyAgY3Vyc29yOiBwb2ludGVyOworICBkaXNwbGF5OiBibG9jazsKKyAgZm9udC1zaXplOiAxLjJlbTsKKyAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW46IDAgMCAwIDAuOGVtOworICBwYWRkaW5nOiAwLjRlbSAxZW07CisKKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKworICBmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBzdGFydENvbG9yc3RyPScjZjRmNGY0JywgZW5kQ29sb3JzdHI9JyNlY2VjZWMnKTsKKyAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZjRmNGY0KSwgdG8oI2VjZWNlYykpOworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmNGY0ZjQsICNlY2VjZWMpOworCisgIGJvcmRlci1yYWRpdXM6IDNweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OworfQorCisjZ29sbHVtLWRpYWxvZy1kaWFsb2cgYS5taW5pYnV0dG9uOmhvdmVyIHsKKyAgYmFja2dyb3VuZDogIzMwNzJiMzsKKyAgYm9yZGVyLWNvbG9yOiAjNTE4Y2M2ICM1MThjYzYgIzJhNjVhMDsKKyAgY29sb3I6ICNmZmY7CisgIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMyk7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKworICBmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBzdGFydENvbG9yc3RyPScjNTk5YmRjJywgZW5kQ29sb3JzdHI9JyMzMDcyYjMnKTsKKyAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjNTk5YmRjKSwgdG8oIzMwNzJiMykpOworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICM1OTliZGMsICMzMDcyYjMpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9lZGl0b3IuY3NzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvY3NzL2VkaXRvci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxNzVmYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9lZGl0b3IuY3NzCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAgZWRpdG9yLmNzcworICBXaWtpIGVkaXRvciBmb3JtYXR0aW5nCisqLworCithIHsKKyAgLW1vei1vdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7Cit9CisKKy5qYXdzIHsKKyAgLyogSkFXUyBzaG91bGQgc2VlIGl0LCBidXQgeW91IGNhbid0ICovCisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDFweDsKKyAgbGVmdDogLTUwMDBweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC01MDAwcHg7CisgIHdpZHRoOiAxcHg7Cit9CisKKyNnb2xsdW0tZWRpdG9yIHsKKyAgYm9yZGVyOiAxcHggc29saWQgI2U0ZTRlNDsKKyAgYmFja2dyb3VuZDogI2Y5ZjlmOTsKKyAgbWFyZ2luOiAxZW0gMCA1ZW07CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDFlbSAxZW0gMC40ZW07CisKKyAgYm9yZGVyLXJhZGl1czogMWVtOworICAtbW96LWJvcmRlci1yYWRpdXM6IDFlbTsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxZW07Cit9CisKKy5pZSAjZ29sbHVtLWVkaXRvciB7CisgIHBhZGRpbmctYm90dG9tOiAxZW07ICAKK30KKworI2dvbGx1bS1lZGl0b3IgZm9ybSBmaWVsZHNldCB7CisgIGJvcmRlcjogMDsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworICB3aWR0aDogMTAwJTsKK30KKworI2dvbGx1bS1lZGl0b3IgLnNpbmdsZWxpbmUgeworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luOiAwIDAgMC43ZW0gMDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworI2dvbGx1bS1lZGl0b3IgLnNpbmdsZWxpbmUgaW5wdXQgeworICBiYWNrZ3JvdW5kOiAjZmZmOworICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOworICBjb2xvcjogIzAwMDsKKyAgZm9udC1zaXplOiAxLjNlbTsKKyAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGxpbmUtaGVpZ2h0OiAxLjhlbTsKKyAgbWFyZ2luOiAxZW0gMCAwLjRlbTsKKyAgcGFkZGluZzogMC41ZW07CisgIHdpZHRoOiA5OCU7Cit9CisKKyNnb2xsdW0tZWRpdG9yIC5zaW5nbGVsaW5lIGlucHV0LnBoIHsKKyAgY29sb3I6ICM5OTk7Cit9CisKKyNnb2xsdW0tZWRpdG9yLXRpdGxlLWZpZWxkIGlucHV0I2dvbGx1bS1lZGl0b3ItcGFnZS10aXRsZSB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW4tdG9wOiAwOworfQorCisjZ29sbHVtLWVkaXRvci10aXRsZS1maWVsZC5hY3RpdmUgeworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbjogMCAwIDAuM2VtIDA7CisgIHBhZGRpbmc6IDAgMCAwLjVlbSAwOworfQorCisjZ29sbHVtLWVkaXRvci10aXRsZS1maWVsZCBpbnB1dCNnb2xsdW0tZWRpdG9yLXBhZ2UtdGl0bGUucGggeworICBjb2xvcjogIzAwMDsKK30KKworLyogQGNvbnRyb2wgZWRpdG9yLXZpZXctdGFiICovCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci10eXBlLXN3aXRjaGVyIHsKKyAgZGlzcGxheTogbm9uZTsKK30KKworLyogQGNvbnRyb2wgZnVuY3Rpb24tYmFyICovCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgIHsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDA7Cit9CisKKworI2dvbGx1bS1lZGl0b3ItdGl0bGUtZmllbGQgKyAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgeworICBtYXJnaW4tdG9wOiAwLjZlbTsKK30KKworI2dvbGx1bS1lZGl0b3IgI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyICNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJ1dHRvbnMgeworICAvKiBkaXNwbGF5OiBub25lOyAqLworfQorCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIuYWN0aXZlICNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJ1dHRvbnMgeworICBkaXNwbGF5OiBibG9jazsKKyAgZmxvYXQ6IGxlZnQ7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDAgMCAxLjFlbSAwOworfQorCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgYS5mdW5jdGlvbi1idXR0b24geworICBiYWNrZ3JvdW5kOiAjZjdmN2Y3OworICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOworICBjb2xvcjogIzMzMzsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiBsZWZ0OworICBoZWlnaHQ6IDI1cHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIG1hcmdpbjogMC4yZW0gMC41ZW0gMCAwOworICAvKiB0ZXh0LWluZGVudDogLTUwMDBweDsgKi8KKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKyAgd2lkdGg6IDI1cHg7CisgIAorICBib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgCisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIHN0YXJ0Q29sb3JzdHI9JyNmNGY0ZjQnLCBlbmRDb2xvcnN0cj0nI2VjZWNlYycpOworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmNGY0ZjQpLCB0bygjZWNlY2VjKSk7CisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCwgI2VjZWNlYyk7Cit9CisKKyNnb2xsdW0tZWRpdG9yICNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhciBhLmZ1bmN0aW9uLWJ1dHRvbjpob3ZlciB7CisgIGNvbG9yOiAjZmZmOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjMpOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIAorICBmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBzdGFydENvbG9yc3RyPScjNTk5YmRjJywgZW5kQ29sb3JzdHI9JyMzMDcyYjMnKTsKKyAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjNTk5YmRjKSwgdG8oIzMwNzJiMykpOworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICM1OTliZGMsICMzMDcyYjMpOworfQorCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgYSBzcGFuIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltZy9pY29uLXNwcml0ZS5wbmcpOworICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICBkaXNwbGF5OiBibG9jazsKKyAgaGVpZ2h0OiAyNXB4OworICBvdmVyZmxvdzogaGlkZGVuOworICB0ZXh0LWluZGVudDogLTUwMDBweDsKKyAgd2lkdGg6IDI1cHg7Cit9CisKK2EjZnVuY3Rpb24tYm9sZCBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOyB9CithI2Z1bmN0aW9uLWl0YWxpYyBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3cHggMDsgfQorYSNmdW5jdGlvbi11bmRlcmxpbmUgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IDA7IH0KK2EjZnVuY3Rpb24tY29kZSBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgycHggMDsgfQorYSNmdW5jdGlvbi11bCBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwOXB4IDA7IH0KK2EjZnVuY3Rpb24tb2wgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMzZweCAwOyB9CithI2Z1bmN0aW9uLWJsb2NrcXVvdGUgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjNweCAwOyB9CithI2Z1bmN0aW9uLWhyIHNwYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkwcHggMDsgfQorYSNmdW5jdGlvbi1oMSBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxN3B4IDA7IH0KK2EjZnVuY3Rpb24taDIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDRweCAwOyB9CithI2Z1bmN0aW9uLWgzIHNwYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjcxcHggMDsgfQorYSNmdW5jdGlvbi1saW5rIHNwYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjk4cHggMDsgfQorYSNmdW5jdGlvbi1pbWFnZSBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMyNHB4IDA7IH0KK2EjZnVuY3Rpb24taGVscCBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQwNXB4IDA7IH0gCisKK2EjZnVuY3Rpb24tYm9sZDpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjhweDsgfQorYSNmdW5jdGlvbi1pdGFsaWM6aG92ZXIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yN3B4IC0yOHB4OyB9CithI2Z1bmN0aW9uLXVuZGVybGluZTpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTU0cHggLTI4cHg7IH0KK2EjZnVuY3Rpb24tY29kZTpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgycHggLTI4cHg7IH0KK2EjZnVuY3Rpb24tdWw6aG92ZXIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDlweCAtMjhweDsgfQorYSNmdW5jdGlvbi1vbDpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEzNnB4IC0yOHB4OyB9CithI2Z1bmN0aW9uLWJsb2NrcXVvdGU6aG92ZXIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjNweCAtMjhweDsgfQorYSNmdW5jdGlvbi1ocjpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MHB4IC0yOHB4OyB9CithI2Z1bmN0aW9uLWgxOmhvdmVyIHNwYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE3cHggLTI4cHg7IH0KK2EjZnVuY3Rpb24taDI6aG92ZXIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDRweCAtMjhweDsgfQorYSNmdW5jdGlvbi1oMzpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3MXB4IC0yOHB4OyB9CithI2Z1bmN0aW9uLWxpbms6aG92ZXIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yOThweCAtMjhweDsgfQorYSNmdW5jdGlvbi1pbWFnZTpob3ZlciBzcGFuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMyNHB4IC0yOHB4OyB9CithI2Z1bmN0aW9uLWhlbHA6aG92ZXIgc3BhbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00MDVweCAtMjhweDsgfSAKKworCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgYS5kaXNhYmxlZCB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyNnb2xsdW0tZWRpdG9yICNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhciBzcGFuLmZ1bmN0aW9uLWRpdmlkZXIgeworICBkaXNwbGF5OiBibG9jazsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAwLjVlbTsKK30KKworI2dvbGx1bS1lZGl0b3IgI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyICNnb2xsdW0tZWRpdG9yLWZvcm1hdC1zZWxlY3RvciB7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDAgMCAxLjFlbSAwOworfQorCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgCisgICNnb2xsdW0tZWRpdG9yLWZvcm1hdC1zZWxlY3RvciBzZWxlY3QgeyAgCisgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAKKyAgZmxvYXQ6IHJpZ2h0OworICBmb250LXNpemU6IDEuMWVtOworICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKKyAgcGFkZGluZzogMC41ZW0gMC43ZW07CisgIG1hcmdpbi1ib3R0b206IDA7CisgCisgCisgIGJvcmRlci1yYWRpdXM6IDAuNWVtOworICAtbW96LWJvcmRlci1yYWRpdXM6IDAuNWVtOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAuNWVtOyAKKyAgLW1vei1vdXRsaW5lOiBub25lOworfQorCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIgCisgICNnb2xsdW0tZWRpdG9yLWZvcm1hdC1zZWxlY3RvciBzZWxlY3Q6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOworICAtbW96LW91dGxpbmU6IG5vbmU7Cit9CisKKyNnb2xsdW0tZWRpdG9yICNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhcgorICAjZ29sbHVtLWVkaXRvci1mb3JtYXQtc2VsZWN0b3IgbGFiZWwgeworICBjb2xvcjogIzk5OTsKKyAgZmxvYXQ6IHJpZ2h0OworICBmb250LXNpemU6IDEuMWVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbGluZS1oZWlnaHQ6IDEuNmVtOworICBwYWRkaW5nOiAwLjZlbSAwLjVlbSAwIDA7Cit9CisgIAorI2dvbGx1bS1lZGl0b3IgI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyCisgICNnb2xsdW0tZWRpdG9yLWZvcm1hdC1zZWxlY3RvciBsYWJlbDphZnRlciB7CisgIGNvbnRlbnQ6ICc6JzsKK30KKyAgCisgIAorLyogQHNlY3Rpb24gZm9ybS1maWVsZHMgKi8KKworYm9keSB7Citmb250OiAxM3B4IEhlbHZldGljYSxhcmlhbCxmcmVlc2FucyxjbGVhbixzYW5zLXNlcmlmOworbGluZS1oZWlnaHQ6IDEuNDsKK2NvbG9yOiAjMzMzOworcG9zaXRpb246IHJlbGF0aXZlOworcGFkZGluZzogMDsKK3dpZHRoOiAxMDAlOworei1pbmRleDogOTsKK2Rpc3BsYXk6IGJsb2NrOworbWFyZ2luOiAwIGF1dG87Cit9CisKKyNnb2xsdW0tZWRpdG9yIHRleHRhcmVhI2dvbGx1bS1lZGl0b3ItYm9keSB7CisgIGJhY2tncm91bmQ6ICNmZmY7CisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisgIGZvbnQtc2l6ZTogMS4zZW07CisgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOworICBsaW5lLWhlaWdodDogMS44ZW07CisgIG1hcmdpbjogMWVtIDAgMC40ZW07CisgIHBhZGRpbmc6IDAuNWVtOyAvKiBJIGRvbid0IHJlYWxseSBsaWtlIG1peGluZyBwY3QgJiBlbSBoZXJlySAqLworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiAyMGVtOworfQorCisjZ29sbHVtLWVkaXRvciBpbnB1dC5nb2xsdW0tZWRpdG9yLWlucHV0IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKKyAgY29sb3I6ICMzMzM7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiBsZWZ0OworICBmb250LXNpemU6IDEuMmVtOworICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGhlaWdodDogMzVweDsKKyAgbWFyZ2luOiAwcHggNXB4OworICBwYWRkaW5nOiAwLjRlbSAxZW07CisKKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKworICBmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBzdGFydENvbG9yc3RyPScjZjRmNGY0JywgZW5kQ29sb3JzdHI9JyNlY2VjZWMnKTsKKyAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZjRmNGY0KSwgdG8oI2VjZWNlYykpOworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmNGY0ZjQsICNlY2VjZWMpOworCisgIGJvcmRlci1yYWRpdXM6IDNweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OworfQorCisud2Via2l0ICNnb2xsdW0tZWRpdG9yIGlucHV0I2dvbGx1bS1lZGl0b3Itc3VibWl0IHsKKyAgcGFkZGluZzogMC41ZW0gMWVtIDAuNDVlbTsKK30KKworLmllICNnb2xsdW0tZWRpdG9yIGlucHV0I2dvbGx1bS1lZGl0b3Itc3VibWl0IHsKKyAgcGFkZGluZzogMC40ZW0gMWVtIDAuNWVtOworfQorCisjZ29sbHVtLWVkaXRvciBpbnB1dCNnb2xsdW0tZWRpdG9yLXN1Ym1pdDpob3ZlciB7CisgIGJhY2tncm91bmQ6ICMzMDcyYjM7CisgIGJvcmRlci1jb2xvcjogIzUxOGNjNiAjNTE4Y2M2ICMyYTY1YTA7CisgIGNvbG9yOiAjZmZmOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjMpOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisKKyAgZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGU9MCwgc3RhcnRDb2xvcnN0cj0nIzU5OWJkYycsIGVuZENvbG9yc3RyPScjMzA3MmIzJyk7CisgIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oIzU5OWJkYyksIHRvKCMzMDcyYjMpKTsKKyAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjNTk5YmRjLCAjMzA3MmIzKTsKK30KKworI2dvbGx1bS1lZGl0b3IgLmNvbGxhcHNlZCwKKyNnb2xsdW0tZWRpdG9yIC5leHBhbmRlZCB7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOworICBkaXNwbGF5OiBibG9jazsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcGFkZGluZzogMWVtIDAgMC41ZW07Cit9CisKKyNnb2xsdW0tZWRpdG9yICNnb2xsdW0tZWRpdG9yLWJvZHkgKyAuY29sbGFwc2VkLAorI2dvbGx1bS1lZGl0b3IgI2dvbGx1bS1lZGl0b3ItYm9keSArIC5leHBhbmRlZCB7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOworICBtYXJnaW4tdG9wOiAwLjdlbTsKK30KKworI2dvbGx1bS1lZGl0b3IgLmNvbGxhcHNlZCBhLmJ1dHRvbiwKKyNnb2xsdW0tZWRpdG9yIC5leHBhbmRlZCBhLmJ1dHRvbiB7CisgIGJhY2tncm91bmQ6ICNmN2Y3Zjc7CisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisgIGNvbG9yOiAjMzMzOworICBkaXNwbGF5OiBibG9jazsKKyAgZmxvYXQ6IGxlZnQ7CisgIGhlaWdodDogMjVweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgbWFyZ2luOiAwLjJlbSAwLjVlbSAwLjc1ZW0gMDsKKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKyAgd2lkdGg6IDI1cHg7CisgIAorICBib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgCisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIHN0YXJ0Q29sb3JzdHI9JyNmNGY0ZjQnLCBlbmRDb2xvcnN0cj0nI2VjZWNlYycpOworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmNGY0ZjQpLCB0bygjZWNlY2VjKSk7CisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCwgI2VjZWNlYyk7Cit9CisKKyNnb2xsdW0tZWRpdG9yIC5jb2xsYXBzZWQgaDQsCisjZ29sbHVtLWVkaXRvciAuZXhwYW5kZWQgaDQgeworICBmb250LXNpemU6IDEuNmVtOworICBmbG9hdDogbGVmdDsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwLjRlbSAwIDAgMC4zZW07CisgIHRleHQtc2hhZG93OiAwIC0xcHggMCAjZmZmOworfQorCisjZ29sbHVtLWVkaXRvciAuY29sbGFwc2VkIGEuYnV0dG9uOmhvdmVyLAorI2dvbGx1bS1lZGl0b3IgLmV4cGFuZGVkIGg0IGEuYnV0dG9uOmhvdmVyIHsKKyAgY29sb3I6ICNmZmY7CisgIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuMyk7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgCisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIHN0YXJ0Q29sb3JzdHI9JyM1OTliZGMnLCBlbmRDb2xvcnN0cj0nIzMwNzJiMycpOworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCM1OTliZGMpLCB0bygjMzA3MmIzKSk7CisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzU5OWJkYywgIzMwNzJiMyk7Cit9CisKKyNnb2xsdW0tZWRpdG9yIC5jb2xsYXBzZWQgYSBzcGFuLAorI2dvbGx1bS1lZGl0b3IgLmV4cGFuZGVkIGEgc3BhbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWcvaWNvbi1zcHJpdGUucG5nKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM1MXB4IC0xcHg7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDI1cHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHRleHQtaW5kZW50OiAtNTAwMHB4OworICB3aWR0aDogMjVweDsKK30KKworI2dvbGx1bS1lZGl0b3IgLmNvbGxhcHNlZCBhOmhvdmVyIHNwYW4geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzUxcHggLTI4cHg7Cit9CisKKyNnb2xsdW0tZWRpdG9yIC5leHBhbmRlZCBhIHNwYW4geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzc4cHggMDsKK30KKworI2dvbGx1bS1lZGl0b3IgLmV4cGFuZGVkIGE6aG92ZXIgc3BhbiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0zNzhweCAtMjhweDsKK30KKworI2dvbGx1bS1lZGl0b3IgLmNvbGxhcHNlZCB0ZXh0YXJlYSB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyNnb2xsdW0tZWRpdG9yIC5leHBhbmRlZCB0ZXh0YXJlYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisgIGNsZWFyOiBib3RoOworICBkaXNwbGF5OiBibG9jazsKKyAgZm9udC1zaXplOiAxLjNlbTsKKyAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGhlaWdodDogN2VtOworICBsaW5lLWhlaWdodDogMS44ZW07CisgIG1hcmdpbjogMC43ZW0gMDsKKyAgcGFkZGluZzogMC41ZW07CisgIHdpZHRoOiA5OCU7Cit9CisKKy8qIEBjb250cm9sIG1pbmlidXR0b24gKi8KKworI2dvbGx1bS1lZGl0b3IgYS5taW5pYnV0dG9uLAorI2dvbGx1bS1lZGl0b3IgYS5taW5pYnV0dG9uOnZpc2l0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OworICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OworICBjb2xvcjogIzMzMzsKKyAgY3Vyc29yOiBwb2ludGVyOworICBkaXNwbGF5OiBibG9jazsKKyAgZm9udC1zaXplOiAxLjJlbTsKKyAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBsaW5lLWhlaWdodDogMS4yZW07CisgIG1hcmdpbjogMCAwIDAgMC44ZW07CisgIHBhZGRpbmc6IDAuNWVtIDFlbTsKKworICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjZmZmOworCisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIHN0YXJ0Q29sb3JzdHI9JyNmNGY0ZjQnLCBlbmRDb2xvcnN0cj0nI2VjZWNlYycpOworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmNGY0ZjQpLCB0bygjZWNlY2VjKSk7CisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCwgI2VjZWNlYyk7CisKKyAgYm9yZGVyLXJhZGl1czogM3B4OworICAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKyNnb2xsdW0tZWRpdG9yIGEubWluaWJ1dHRvbjpob3ZlciB7CisgIGJhY2tncm91bmQ6ICMzMDcyYjM7CisgIGJvcmRlci1jb2xvcjogIzUxOGNjNiAjNTE4Y2M2ICMyYTY1YTA7CisgIGNvbG9yOiAjZmZmOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjMpOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisKKyAgZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGU9MCwgc3RhcnRDb2xvcnN0cj0nIzU5OWJkYycsIGVuZENvbG9yc3RyPScjMzA3MmIzJyk7CisgIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oIzU5OWJkYyksIHRvKCMzMDcyYjMpKTsKKyAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjNTk5YmRjLCAjMzA3MmIzKTsKK30KKworCisjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1wcmV2aWV3IHsKKyAgZmxvYXQ6IGxlZnQ7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIHBhZGRpbmc6IGxlZnQ7Cit9CisKKworLyogQHNlY3Rpb24gaGVscCAqLworI2dvbGx1bS1lZGl0b3ItaGVscCB7CisgIG1hcmdpbjogMDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcGFkZGluZzogMDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsKKyAgYm9yZGVyLXdpZHRoOiAwIDFweCAxcHggMXB4OworfQorCisgICNnb2xsdW0tZWRpdG9yLWhlbHAtcGFyZW50LAorICAjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGZsb2F0OiBsZWZ0OworICAgIGhlaWdodDogMTdlbTsKKyAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDFlbSAwOworICAgIHdpZHRoOiAxOCU7CisgIH0KKyAgCisgICNnb2xsdW0tZWRpdG9yLWhlbHAtcGFyZW50IHsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZWVlOworICB9CisgIAorICAjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QgeworICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7CisgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2VlZTsKKyAgfQorICAKKyAgI2dvbGx1bS1lZGl0b3ItaGVscC1wYXJlbnQgbGksCisgICNnb2xsdW0tZWRpdG9yLWhlbHAtbGlzdCBsaSB7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBsaW5lLWhlaWdodDogMS42ZW07CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgIH0KKyAgICAKKyAgICAjZ29sbHVtLWVkaXRvci1oZWxwLXBhcmVudCBsaSBhLAorICAgICNnb2xsdW0tZWRpdG9yLWhlbHAtbGlzdCBsaSBhIHsKKyAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgYm9yZGVyLXdpZHRoOiAxcHggMDsKKyAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICBoZWlnaHQ6IDEwJTsKKyAgICAgIHdpZHRoOiBhdXRvOworICAgICAgcGFkZGluZzogMC4yZW0gMWVtOworICAgICAgdGV4dC1zaGFkb3c6IDAgLTFweCAwICNmZmY7CisgICAgfQorICAgIAorICAgICNnb2xsdW0tZWRpdG9yLWhlbHAtcGFyZW50IGxpIGE6aG92ZXIsCisgICAgI2dvbGx1bS1lZGl0b3ItaGVscC1saXN0IGxpIGE6aG92ZXIgeworICAgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICAgIGJvcmRlci1jb2xvcjogI2YwZjBmMDsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIAorICAgICAgYm94LXNoYWRvdzogbm9uZTsKKyAgICB9CisgICAgCisgICAgI2dvbGx1bS1lZGl0b3ItaGVscC1wYXJlbnQgbGkgYS5zZWxlY3RlZCwKKyAgICAjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QgbGkgYS5zZWxlY3RlZCB7CisgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOworICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2U3ZTdlNzsKKyAgICAgIGJvcmRlci13aWR0aDogMXB4IDA7CisgICAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgICAgY29sb3I6ICMwMDA7CisgICAgICAKKyAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAjZjBmMGYwOworICAgIH0KKyAgICAKKyAgI2dvbGx1bS1lZGl0b3ItaGVscC13cmFwcGVyIHsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIG92ZXJmbG93OiBhdXRvOworICAgIGhlaWdodDogMTdlbTsKKyAgICBwYWRkaW5nOiAxZW07CisgIH0KKyAgCisgICAgI2dvbGx1bS1lZGl0b3ItaGVscC1jb250ZW50IHsKKyAgICAgIGZvbnQtc2l6ZTogMS4yZW07CisgICAgICBtYXJnaW46IDAgMWVtIDAgMC41ZW07CisgICAgICBwYWRkaW5nOiAwOworICAgICAgbGluZS1oZWlnaHQ6IDEuOGVtOworICAgIH0KKyAgICAKKyAgICAjZ29sbHVtLWVkaXRvci1oZWxwLWNvbnRlbnQgcCB7CisgICAgICBtYXJnaW46IDAgMCAxZW0gMDsKKyAgICAgIHBhZGRpbmc6IDA7CisgICAgfQorICAgIAorLyogSUUgKi8KKy5pZSAjZ29sbHVtLWVkaXRvciAuc2luZ2xlbGluZSBpbnB1dCB7CisgIHBhZGRpbmctdG9wOiAwLjI1ZW07CisgIHBhZGRpbmctYm90dG9tOiAwLjc1ZW07Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9jc3MvZ2l0aHViLmNzcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9naXRodWIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDE5YzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9jc3MvZ2l0aHViLmNzcwpAQCAtMCwwICsxLDY3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyN3aWtpLXdyYXBwZXIgI3RlbXBsYXRlIGJsb2NrcXVvdGUgeworICBtYXJnaW46IDFlbSAwOworICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNkZGQ7CisgIHBhZGRpbmctbGVmdDogLjhlbTsKKyAgY29sb3I6ICM1NTU7Cit9CisKKy8qCisgIGdvbGx1bS5jc3MKKyAgQSBiYXNpYyBzdHlsZXNoZWV0IGZvciBHb2xsdW0KKyovCisKKy8qIEBzZWN0aW9uIGNvcmUgKi8KK2JvZHksIGh0bWwgeworICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiAxMHB4OworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9CisKKyN3aWtpLXdyYXBwZXIgeworICBtYXJnaW46IDAgYXV0bzsKKyAgb3ZlcmZsb3c6IHZpc2libGU7CisgIHdpZHRoOiA5MCU7Cit9CisKK2E6bGluayB7CisgIGNvbG9yOiAjNDE4M2M0OworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2E6aG92ZXIsIGE6dmlzaXRlZCB7CisgIGNvbG9yOiAjNDE4M2M0OworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworCisvKiBAc2VjdGlvbiBoZWFkICovCisjaGVhZCB7CisgIG1hcmdpbjogNC41ZW0gMCAwLjVlbTsKKyAgcGFkZGluZzogMC41ZW0gMDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworICAjaGVhZCBoMSB7CisgICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovCisgIH0KKyAgCisgICNoZWFkIHVsLmFjdGlvbnMgeworICAgIGZsb2F0OiByaWdodDsKKyAgfQorICAKKy8qIEBzZWN0aW9uIGNvbnRlbnQgKi8KKyN3aWtpLWNvbnRlbnQgeworICBoZWlnaHQ6IDElOworICBvdmVyZmxvdzogdmlzaWJsZTsKK30KKworICAjd2lraS1jb250ZW50IC53cmFwIHsKKyAgICBoZWlnaHQ6IDElOworICAgIG92ZXJmbG93OiBhdXRvOworICB9CisKKyAgLyogQHNlY3Rpb24gY29tbWVudHMgKi8KKyAgI3dpa2ktYm9keSAjaW5saW5lLWNvbW1lbnQgeworICAgIGRpc3BsYXk6IG5vbmU7IC8qIHRvZG8gKi8KKyAgfQorCisgIC8qIEBzZWN0aW9uIGJvZHkgKi8KKyAgI3dpa2ktYm9keSB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAzJTsKKyAgICB3aWR0aDogMTAwJTsKKyAgfQorCisgIC5oYXMtcmlnaHRiYXIgI3dpa2ktYm9keSB7CisgICAgd2lkdGg6IDY4JTsKKyAgfQorICAKKyAgLyogQHNlY3Rpb24gcmlnaHRiYXIgKi8KKyAgI3dpa2ktcmlnaHRiYXIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsKKyAgICBmb250LXNpemU6IDEzcHg7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHBhZGRpbmc6IDdweDsKKyAgICB3aWR0aDogMjUlOworICAgIAorICAgIGJvcmRlci1yYWRpdXM6IDAuNWVtOworICAgIC1tb3otYm9yZGVyLXJhZGl1czogMC41ZW07CisgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwLjVlbTsKKyAgfQorICAKKyAgICAjd2lraS1yaWdodGJhciBwIHsKKyAgICAgIG1hcmdpbjogMTNweCAwIDA7CisgICAgfQorCisgICAgICAjd2lraS1yaWdodGJhciA+IHA6Zmlyc3QtY2hpbGQgeworICAgICAgICBtYXJnaW4tdG9wOiAwOworICAgICAgfQorCisgICAgI3dpa2ktcmlnaHRiYXIgcC5wYXJlbnQgeworICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNiYmI7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIG1hcmdpbjogMCAwIDAuNWVtIDA7CisgICAgICBwYWRkaW5nOiAwIDAgMC41ZW0gMDsKKyAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNmZmY7CisgICAgfQorICAgIAorICAgIC8qIEJhY2sgYXJyb3cgKi8KKyAgICAjd2lraS1yaWdodGJhciBwLnBhcmVudDpiZWZvcmUgeworICAgICAgY29sb3I6ICM2NjY7CisgICAgICBjb250ZW50OiAiPC0tICI7CisgICAgfQorICAgIAorICAgICN3aWtpLXJpZ2h0YmFyIGgzIHsKKyAgICAgIGZvbnQtc2l6ZTogMS4yZW07CisgICAgICBjb2xvcjogIzMzMzsKKyAgICAgIG1hcmdpbjogMS4yZW0gMCAwOworICAgICAgcGFkZGluZzogMDsKKyAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNmZmY7CisgICAgfQorICAgIAorICAgICN3aWtpLXJpZ2h0YmFyIHVsIHsKKyAgICAgIG1hcmdpbjogMC41ZW0gMCAxZW07CisgICAgICBwYWRkaW5nOiAwOworICAgIH0KKyAgICAKKyAgICAjd2lraS1yaWdodGJhciB1bCBsaSB7CisgICAgICBjb2xvcjogI2JiYjsKKyAgICAgIG1hcmdpbjogMCAwIDAgMWVtOworICAgICAgcGFkZGluZzogMDsKKyAgICAgIGxpbmUtaGVpZ2h0OiAxLjc1ZW07CisgICAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7CisgICAgICBsaXN0LXN0eWxlLXR5cGU6IHJvdW5kOworICAgIH0gCisgICAgCisgICAgI3dpa2ktcmlnaHRiYXIgI25hdiB1bCBsaSBhIHsKKyAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKyAgICB9CisgICAgCisgIC8qIEBzZWN0aW9uIGZvb3RlciAqLworICAjd2lraS1mb290ZXIgeworICAgIGNsZWFyOiBib3RoOworICAgIG1hcmdpbjogMmVtIDAgNWVtOworICB9CisgIAorICAgIC5oYXMtcmlnaHRiYXIgI3dpa2ktZm9vdGVyIHsKKyAgICAgIHdpZHRoOiA3MCU7CisgICAgfQorICAgIAorICAgICN3aWtpLWZvb3RlciAjZm9vdGVyLWNvbnRlbnQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CisgICAgICBmb250LXNpemU6IDEuMmVtOworICAgICAgbGluZS1oZWlnaHQ6IDEuNWVtOworICAgICAgbWFyZ2luLXRvcDogMS41ZW07CisgICAgICBwYWRkaW5nOiAxZW07CisgICAgICAKKyAgICAgIGJvcmRlci1yYWRpdXM6IDAuNWVtOworICAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwLjVlbTsKKyAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMC41ZW07CisgICAgfQorICAgIAorICAgICN3aWtpLWZvb3RlciAjZm9vdGVyLWNvbnRlbnQgaDMgeworICAgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICAgIGNvbG9yOiAjMzMzOworICAgICAgbWFyZ2luOiAwOworICAgICAgcGFkZGluZzogMCAwIDAuMmVtOworICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKyAgICB9CisgICAgCisgICAgI3dpa2ktZm9vdGVyICNmb290ZXItY29udGVudCBwIHsKKyAgICAgIG1hcmdpbjogMC41ZW0gMCAwOworICAgICAgcGFkZGluZzogMDsKKyAgICB9CisgICAgCisgICAgI3dpa2ktZm9vdGVyICNmb290ZXItY29udGVudCB1bC5saW5rcyB7CisgICAgICBtYXJnaW46IDAuNWVtIDAgMDsKKyAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICBwYWRkaW5nOiAwOworICAgIH0KKyAgICAKKyAgICAjd2lraS1mb290ZXIgI2Zvb3Rlci1jb250ZW50IHVsLmxpbmtzIGxpIHsKKyAgICAgIGNvbG9yOiAjOTk5OworICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7CisgICAgICBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKKyAgICAgIHBhZGRpbmc6IDA7CisgICAgICBtYXJnaW4tbGVmdDogMC43NWVtOworICAgIH0KKyAgICAKKyAgICAjd2lraS1mb290ZXIgI2Zvb3Rlci1jb250ZW50IHVsLmxpbmtzIGxpIGEgeworICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjZmZmOworICAgIH0KKyAgICAKKyAgICAjd2lraS1mb290ZXIgI2Zvb3Rlci1jb250ZW50IHVsLmxpbmtzIGxpOmZpcnN0LWNoaWxkIHsKKyAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKyAgICAgIG1hcmdpbjogMDsKKyAgICB9ICAKKyAgICAKKyAgICAuZmYgI3dpa2ktZm9vdGVyICNmb290ZXItY29udGVudCB1bC5saW5rcyBsaTpmaXJzdC1jaGlsZCB7CisgICAgICBtYXJnaW46IDAgLTAuNzVlbSAwIDA7CisgICAgfQorICAKKyAgLyogQHNlY3Rpb24gcGFnZS1mb290ZXIgKi8KKyAgLnBhZ2UgI2Zvb3RlciB7CisgICAgbWFyZ2luOiAxZW0gMCA3ZW07CisgIH0KKyAgCisgICNmb290ZXIgcCNsYXN0LWVkaXQgeworICAgIGZvbnQtc2l6ZTogLjllbTsKKyAgICBsaW5lLWhlaWdodDogMS42ZW07CisgICAgY29sb3I6ICM5OTk7CisgICAgbWFyZ2luOiAwLjllbSAwOworICB9CisgIAorICAgICNmb290ZXIgcCNsYXN0LWVkaXQgc3Bhbi51c2VybmFtZSB7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICB9CisKKworLyogQHNlY3Rpb24gaGlzdG9yeSAqLworLmhpc3RvcnkgaDEgeworICBjb2xvcjogIzk5OTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworICAuaGlzdG9yeSBoMSBzdHJvbmcgeworICAgIGNvbG9yOiAjMDAwOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICB9CisKKyN3aWtpLWhpc3RvcnkgeworICBtYXJnaW4tdG9wOiAzZW07Cit9CisKKyAgI3dpa2ktaGlzdG9yeSBmaWVsZHNldCB7CisgICAgYm9yZGVyOiAwOworICAgIG1hcmdpbjogMmVtIDA7CisgICAgcGFkZGluZzogMDsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSwgI3dpa2ktaGlzdG9yeSB0Ym9keSB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgICB3aWR0aDogMTAwJTsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ciB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgIH0KKyAgCisgICN3aWtpLWhpc3RvcnkgdGFibGUgdHIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNlYmYyZjY7CisgIH0KKyAgCisgICN3aWtpLWhpc3RvcnkgdGFibGUgdHIgdGQgeworICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGRjZTk7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBsaW5lLWhlaWdodDogMS42ZW07CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDAuM2VtIDAuN2VtOworICB9CisgIAorICAjd2lraS1oaXN0b3J5IHRhYmxlIHRyIHRkLmNoZWNrYm94IHsKKyAgICBtaW4td2lkdGg6IDJlbTsKKyAgICBwYWRkaW5nOiAwLjNlbTsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ciB0ZC5jaGVja2JveCBpbnB1dCB7CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHBhZGRpbmctcmlnaHQ6IDA7CisgICAgcGFkZGluZy10b3A6IDAuNGVtOworICAgIG1hcmdpbi1yaWdodDogLTAuMmVtOworICB9CisgIAorICAjd2lraS1oaXN0b3J5IHRhYmxlIHRyOm50aC1jaGlsZCgybiksCisgICN3aWtpLWhpc3RvcnkgdGFibGUgdHIuYWx0LXJvdyB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjdmYTsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ci5zZWxlY3RlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZlYSAhaW1wb3J0YW50OworICAgIHotaW5kZXg6IDEwMDsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ciB0ZC5jb21taXQtbmFtZSB7CisgICAgYm9yZGVyLWxlZnQ6IDA7CisgIH0KKyAgCisgICN3aWtpLWhpc3RvcnkgdGFibGUgdHIgdGQuY29tbWl0LW5hbWUgc3Bhbi50aW1lLWVsYXBzZWQgeworICAgIGNvbG9yOiAjOTk5OworICB9CisgIAorICAjd2lraS1oaXN0b3J5IHRhYmxlIHRyIHRkLmF1dGhvciB7CisgICAgd2lkdGg6IDIwJTsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ciB0ZC5hdXRob3IgYSB7CisgICAgY29sb3I6ICMwMDA7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIH0KKyAgCisgICN3aWtpLWhpc3RvcnkgdGFibGUgdHIgdGQuYXV0aG9yIGEgc3Bhbi51c2VybmFtZSB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgcGFkZGluZy10b3A6IDNweDsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ciB0ZCBpbWcgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBoZWlnaHQ6IDE4cHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICBtYXJnaW46IDAgMC41ZW0gMCAwOworICAgIHdpZHRoOiAxOHB4OworICAgIHBhZGRpbmc6IDJweDsKKyAgfQorICAKKyAgI3dpa2ktaGlzdG9yeSB0YWJsZSB0ciB0ZC5jb21taXQtbmFtZSBhIHsKKyAgICBmb250LXNpemU6IDAuOWVtOworICAgIGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ0FuZGFsZSBNb25vJywgQ29uc29sYXMsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTsKKyAgICBwYWRkaW5nOiAwIDAuMmVtOworICB9CisKKy5oaXN0b3J5ICN3aWtpLWhpc3RvcnkgdWwuYWN0aW9ucyBsaSwKKy5oaXN0b3J5ICNmb290ZXIgdWwuYWN0aW9ucyBsaSB7CisgIG1hcmdpbjogMCAwLjZlbSAwIDA7Cit9CisKKworLyogQHNlY3Rpb24gZWRpdCAqLworLmVkaXQgaDEgeworICBjb2xvcjogIzk5OTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworICAuZWRpdCBoMSBzdHJvbmcgeworICAgIGNvbG9yOiAjMDAwOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICB9CisKKworLyogQHNlY3Rpb24gc2VhcmNoICovCisucmVzdWx0cyBoMSB7CisgIGNvbG9yOiAjOTk5OworICBmb250LXdlaWdodDogbm9ybWFsOworfQorCisgIC5yZXN1bHRzIGgxIHN0cm9uZyB7CisgICAgY29sb3I6ICMwMDA7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIH0KKyAgCisgIC5yZXN1bHRzICNyZXN1bHRzIHsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYzsKKyAgICBtYXJnaW4tYm90dG9tOiAyZW07CisgICAgcGFkZGluZy1ib3R0b206IDJlbTsKKyAgfQorICAKKyAgLnJlc3VsdHMgI3Jlc3VsdHMgdWwgeworICAgIG1hcmdpbjogMmVtIDAgMCAwOworICAgIHBhZGRpbmc6IDA7CisgIH0KKyAgCisgICAgLnJlc3VsdHMgI3Jlc3VsdHMgdWwgbGkgeworICAgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICAgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKKyAgICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7CisgICAgICBwYWRkaW5nOiAwLjJlbSAwOworICAgIH0KKyAgICAKKyAgICAucmVzdWx0cyAjcmVzdWx0cyB1bCBsaSBzcGFuLmNvdW50IHsKKyAgICAgIGNvbG9yOiAjOTk5OworICAgIH0KKworICAucmVzdWx0cyBwI25vLXJlc3VsdHMgeworICAgIGZvbnQtc2l6ZTogMS4yZW07CisgICAgbGluZS1oZWlnaHQ6IDEuNmVtOworICAgIG1hcmdpbi10b3A6IDJlbTsKKyAgfQorICAKKyAgLnJlc3VsdHMgI2Zvb3RlciB1bC5hY3Rpb25zIGxpIHsKKyAgICBtYXJnaW46IDAgMWVtIDAgMDsKKyAgfQorICAKKworLyogQHNlY3Rpb24gY29tcGFyZSAqLworLmNvbXBhcmUgaDEgeworICBjb2xvcjogIzk5OTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworICAuY29tcGFyZSBoMSBzdHJvbmcgeworICAgIGNvbG9yOiAjMDAwOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICB9CisgIAorICAuY29tcGFyZSAjY29tcGFyZS1jb250ZW50IHsKKyAgICBtYXJnaW4tdG9wOiAzZW07CisgIH0KKyAgCisgIC5jb21wYXJlIC5kYXRhIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOworICAgIG1hcmdpbi10b3A6IDFlbTsKKyAgICBvdmVyZmxvdzogYXV0bzsKKyAgfQorICAKKyAgLmNvbXBhcmUgLmRhdGEgcHJlIHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgfQorICAKKyAgLmNvbXBhcmUgLmRhdGEgcHJlIGRpdiB7CisgICAgcGFkZGluZzogMCAwIDAgMWVtOworICB9CisgIAorICAuY29tcGFyZSAuZGF0YSB0ciB0ZCB7CisgICAgZm9udC1mYW1pbHk6ICJDb25zb2xhcyIsICJNb25hY28iLCAiQW5kYWxlIE1vbm8iLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBsaW5lLWhlaWdodDogMS44ZW07CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgIH0KKyAgCisgIC5jb21wYXJlIC5kYXRhIHRkLmxpbmVfbnVtYmVycyB7CisgICAgYmFja2dyb3VuZDogI2Y3ZjdmNzsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjOTk5OworICAgIGNvbG9yOiAjOTk5OyAKKyAgICBwYWRkaW5nOiAwIDAgMCAwLjVlbTsKKyAgfQorCisuY29tcGFyZSAjY29tcGFyZS1jb250ZW50IHVsLmFjdGlvbnMgbGksCisuY29tcGFyZSAjZm9vdGVyIHVsLmFjdGlvbnMgbGkgeworICBtYXJnaW4tbGVmdDogMDsKKyAgbWFyZ2luLXJpZ2h0OiAwLjZlbTsKK30KKyAgCisgIAorICAKKy8qIEBjb250cm9sIHN5bnRheCAqLworLmhpZ2hsaWdodCAgeyBiYWNrZ3JvdW5kOiAjZmZmZmZmOyB9CisuaGlnaGxpZ2h0IC5jIHsgY29sb3I6ICM5OTk5ODg7IGZvbnQtc3R5bGU6IGl0YWxpYyB9IAorLmhpZ2hsaWdodCAuZXJyIHsgY29sb3I6ICNhNjE3MTc7IGJhY2tncm91bmQtY29sb3I6ICNlM2QyZDIgfSAKKy5oaWdobGlnaHQgLmsgeyBmb250LXdlaWdodDogYm9sZCB9IAorLmhpZ2hsaWdodCAubyB7IGZvbnQtd2VpZ2h0OiBib2xkIH0gCisuaGlnaGxpZ2h0IC5jbSB7IGNvbG9yOiAjOTk5OTg4OyBmb250LXN0eWxlOiBpdGFsaWMgfSAKKy5oaWdobGlnaHQgLmNwIHsgY29sb3I6ICM5OTk5OTk7IGZvbnQtd2VpZ2h0OiBib2xkIH0gCisuaGlnaGxpZ2h0IC5jMSB7IGNvbG9yOiAjOTk5OTg4OyBmb250LXN0eWxlOiBpdGFsaWMgfSAKKy5oaWdobGlnaHQgLmNzIHsgY29sb3I6ICM5OTk5OTk7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOiBpdGFsaWMgfSAKKy5oaWdobGlnaHQgLmdkIHsgY29sb3I6ICMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6ICNmZmRkZGQgfSAKKy5oaWdobGlnaHQgLmdkIC54IHsgY29sb3I6ICMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6ICNmZmFhYWEgfSAKKy5oaWdobGlnaHQgLmdlIHsgZm9udC1zdHlsZTogaXRhbGljIH0gCisuaGlnaGxpZ2h0IC5nciB7IGNvbG9yOiAjYWEwMDAwIH0gCisuaGlnaGxpZ2h0IC5naCB7IGNvbG9yOiAjOTk5OTk5IH0gCisuaGlnaGxpZ2h0IC5naSB7IGNvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRmZmRkIH0gCisuaGlnaGxpZ2h0IC5naSAueCB7IGNvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFmZmFhIH0gCisuaGlnaGxpZ2h0IC5nYyB7IGNvbG9yOiAjOTk5OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUFGMkY1IH0KKy5oaWdobGlnaHQgLmdvIHsgY29sb3I6ICM4ODg4ODggfSAKKy5oaWdobGlnaHQgLmdwIHsgY29sb3I6ICM1NTU1NTUgfSAKKy5oaWdobGlnaHQgLmdzIHsgZm9udC13ZWlnaHQ6IGJvbGQgfSAKKy5oaWdobGlnaHQgLmd1IHsgY29sb3I6ICNhYWFhYWEgfSAKKy5oaWdobGlnaHQgLmd0IHsgY29sb3I6ICNhYTAwMDAgfSAKKworCisvKiBAY29udHJvbCBtaW5pYnV0dG9uICovCit1bC5hY3Rpb25zIHsKKyAgIGRpc3BsYXk6IGJsb2NrOworICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgIHBhZGRpbmc6IDA7Cit9CisKKyB1bC5hY3Rpb25zIGxpIHsKKyAgIGZsb2F0OiBsZWZ0OworICAgZm9udC1zaXplOiAxLjJlbTsKKyAgIG1hcmdpbi1sZWZ0OiAwLjZlbTsKKyB9CisKKy5taW5pYnV0dG9uIGEgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OworICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OworICBjb2xvcjogIzMzMzsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDAuNGVtIDFlbTsKKyAgaGVpZ2h0OiAxLjRlbTsKKworICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjZmZmOworCisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIHN0YXJ0Q29sb3JzdHI9JyNmNGY0ZjQnLCBlbmRDb2xvcnN0cj0nI2VjZWNlYycpOworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmNGY0ZjQpLCB0bygjZWNlY2VjKSk7CisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCwgI2VjZWNlYyk7CisKKyAgYm9yZGVyLXJhZGl1czogM3B4OworICAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKyNzZWFyY2gtc3VibWl0IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKKyAgY29sb3I6ICMzMzM7CisgIGRpc3BsYXk6IGJsb2NrOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwLjRlbSAxZW07CisKKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjsKKworICBmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBzdGFydENvbG9yc3RyPScjZjRmNGY0JywgZW5kQ29sb3JzdHI9JyNlY2VjZWMnKTsKKyAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZjRmNGY0KSwgdG8oI2VjZWNlYykpOworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmNGY0ZjQsICNlY2VjZWMpOworCisgIGJvcmRlci1yYWRpdXM6IDNweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OworfQorCisubWluaWJ1dHRvbiBhOmhvdmVyLAorI3NlYXJjaC1zdWJtaXQ6aG92ZXIgeworICBiYWNrZ3JvdW5kOiAjMzA3MmIzOworICBib3JkZXItY29sb3I6ICM1MThjYzYgIzUxOGNjNiAjMmE2NWEwOworICBjb2xvcjogI2ZmZjsKKyAgdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4zKTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworCisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIHN0YXJ0Q29sb3JzdHI9JyM1OTliZGMnLCBlbmRDb2xvcnN0cj0nIzMwNzJiMycpOworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCM1OTliZGMpLCB0bygjMzA3MmIzKSk7CisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzU5OWJkYywgIzMwNzJiMyk7Cit9CisKKy5taW5pYnV0dG9uIGE6dmlzaXRlZCB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworCisvKiBAc3BlY2lhbCBlcnJvciAqLworI3dpa2ktd3JhcHBlci5lcnJvciB7CisgIGhlaWdodDogMXB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICB0b3A6IDUwJTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNlcnJvciB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlNGU0ZTQ7CisgIGxlZnQ6IDUwJTsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcGFkZGluZzogMiU7CisgIG1hcmdpbjogLTEwJSAwIDAgLTM1JTsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB3aWR0aDogNzAlOworICAKKyAgYm9yZGVyLXJhZGl1czogMC41ZW07CisgIC1tb3otYm9yZGVyLXJhZGl1czogMC41ZW07CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMC41ZW07Cit9CisKKyNlcnJvciBoMSB7CisgIGZvbnQtc2l6ZTogM2VtOworICBsaW5lLWhlaWdodDogbm9ybWFsOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9CisKKyNlcnJvciBwIHsKKyAgZm9udC1zaXplOiAxLjJlbTsKKyAgbGluZS1oZWlnaHQ6IDEuNmVtOworICBtYXJnaW46IDFlbSAwIDAuNWVtOworICBwYWRkaW5nOiAwOworfQorCisKKy8qIEBjb250cm9sIHNlYXJjaGJhciAqLworI2hlYWQgI3NlYXJjaGJhciB7CisgIGZsb2F0OiByaWdodDsKKyAgbWFyZ2luOiAxZW0gMCAwIDA7CisgIHBhZGRpbmc6IDA7CisgIG92ZXJmbG93OiBoaWRkZW47Cit9CisKKyAgI2hlYWQgI3NlYXJjaGJhciAjc2VhcmNoYmFyLWZhdXh0ZXh0IHsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAKKyAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKKyAgICAtbW96LWJvcmRlci1yYWRpdXM6IDAuM2VtOworICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMC4zZW07CisgIH0KKworICAjaGVhZCAjc2VhcmNoYmFyICNzZWFyY2hiYXItZmF1eHRleHQgaW5wdXQjc2VhcmNoLXF1ZXJ5IHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgY29sb3I6ICMwMDA7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBoZWlnaHQ6IDEuOGVtOworICAgIAorICAgIC13ZWJraXQtZm9jdXMtcmluZzogbm9uZTsKKyAgfQorCisgIC5mZiAjaGVhZCAjc2VhcmNoYmFyICNzZWFyY2hiYXItZmF1eHRleHQgaW5wdXQjc2VhcmNoLXF1ZXJ5IHsKKyAgICBwYWRkaW5nOiAwLjJlbSAwIDAuMmVtIDAuNWVtOworICB9CisgIAorICAuaWUgI2hlYWQgI3NlYXJjaGJhciAjc2VhcmNoYmFyLWZhdXh0ZXh0IGlucHV0I3NlYXJjaC1xdWVyeSB7CisgICAgcGFkZGluZzogMC40ZW0gMCAwIDAuNWVtOworICB9CisgIAorICAjaGVhZCAjc2VhcmNoYmFyICNzZWFyY2hiYXItZmF1eHRleHQgaW5wdXQjc2VhcmNoLXF1ZXJ5LnBoIHsKKyAgICBjb2xvcjogIzk5OTsKKyAgfQorICAKKyAgI2hlYWQgI3NlYXJjaGJhciAjc2VhcmNoYmFyLWZhdXh0ZXh0ICNzZWFyY2gtc3VibWl0IHsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZDRkNGQ0OworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICBtYXJnaW46IDAgIWltcG9ydGFudDsKKyAgICBwYWRkaW5nOiAwOworICAgIGZsb2F0OiByaWdodDsKKyAgICBmb250LXNpemU6IDEuMmVtOworICAgIAorICAgIGJvcmRlci1yYWRpdXM6IDAgM3B4IDNweCAwOworICAgIC1tb3otYm9yZGVyLXJhZGl1czogMCAzcHggM3B4IDA7CisgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwIDNweCAzcHggMDsKKyAgfQorICAKKyAgI2hlYWQgI3NlYXJjaGJhciAjc2VhcmNoYmFyLWZhdXh0ZXh0ICNzZWFyY2gtc3VibWl0IHNwYW4geworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvaW1hZ2VzL2ljb24tc3ByaXRlLnBuZyk7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQzMXB4IC0xcHg7CisgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBoZWlnaHQ6IDJlbTsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIHRleHQtaW5kZW50OiAtNTAwMHB4OworICAgIHdpZHRoOiAyOHB4OworICB9CisKKyAgLmZmICNoZWFkICNzZWFyY2hiYXIgI3NlYXJjaGJhci1mYXV4dGV4dCAjc2VhcmNoLXN1Ym1pdCBzcGFuLAorICAuaWUgI2hlYWQgI3NlYXJjaGJhciAjc2VhcmNoYmFyLWZhdXh0ZXh0ICNzZWFyY2gtc3VibWl0IHNwYW4geworICAgIGhlaWdodDogMi4yZW07CisgIH0KKworICAjaGVhZCAjc2VhcmNoYmFyICNzZWFyY2hiYXItZmF1eHRleHQgI3NlYXJjaC1zdWJtaXQ6aG92ZXIgc3BhbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQzMXB4IC0yOHB4OworICAgIHBhZGRpbmc6IDA7CisgIH0KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9wdW55LmNzcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2Nzcy9wdW55LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIzNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvY3NzL3B1bnkuY3NzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitAQ0hBUlNFVCAiVVRGLTgiOworCitbcHVueV0geworCQorCWJhY2tncm91bmQtY29sb3I6I2ZjZmFlNiAhaW1wb3J0YW50OworCWNvbG9yOiMyMjIgIWltcG9ydGFudDsKKwkKKwktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKKwktbW96LWJvcmRlci1yYWRpdXM6IDVweDsKKwlib3JkZXItcmFkaXVzOiA1cHg7Cit9CisKK1twdW55XSBhIHsKKwljb2xvcjojMjI1ICFpbXBvcnRhbnQ7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9pbWcvaWNvbi1zcHJpdGUucG5nIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvaW1nL2ljb24tc3ByaXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U4YzZmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvaW1nL2ljb24tc3ByaXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9lZGl0YWJsZS5qcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL2VkaXRhYmxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODJjMDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9lZGl0YWJsZS5qcwpAQCAtMCwwICsxLDEwOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqICBnb2xsdW0uZWRpdG9yLmpzCisgKiAgQSBqUXVlcnkgcGx1Z2luIHRoYXQgY3JlYXRlcyB0aGUgR29sbHVtIEVkaXRvci4KKyAqCisgKiAgVXNhZ2U6CisgKiAgJC5Hb2xsdW1FZGl0b3IoKTsgb24gRE9NIHJlYWR5LgorICovCisoZnVuY3Rpb24oJCkgeworCisgIC8vIEVkaXRvciBvcHRpb25zCisgIHZhciBEZWZhdWx0T3B0aW9ucyA9IHsKKyAgICBNYXJrdXBUeXBlOiAnbWFya2Rvd24nLAorICAgIEVkaXRvck1vZGU6ICdjb2RlJywKKyAgICBOZXdGaWxlOiBmYWxzZSwKKyAgICBIYXNGdW5jdGlvbkJhcjogdHJ1ZSwKKyAgICBEZWJ1ZzogZmFsc2UsCisgICAgTm9EZWZpbml0aW9uc0ZvcjogW10KKyAgfTsKKyAgdmFyIEFjdGl2ZU9wdGlvbnMgPSB7fTsKKworICAvKioKKyAgICogICQuR29sbHVtRWRpdG9yCisgICAqCisgICAqICBZb3UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gSnVzdCBydW4gdGhpcyBvbiBET00gcmVhZHkuCisgICAqLworICAkLkdvbGx1bUVkaXRvciA9IGZ1bmN0aW9uKCBJbmNvbWluZ09wdGlvbnMgKSB7CisKKyAgICBBY3RpdmVPcHRpb25zID0gJC5leHRlbmQoIERlZmF1bHRPcHRpb25zLCBJbmNvbWluZ09wdGlvbnMgKTsKKworICAgIGRlYnVnKCdHb2xsdW1FZGl0b3IgbG9hZGluZycpOworCisgICAgaWYgKCBFZGl0b3JIYXMuYmFzZUVkaXRvck1hcmt1cCgpICkgeworCisgICAgICBpZiAoIEVkaXRvckhhcy50aXRsZURpc3BsYXllZCgpICkgeworICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci10aXRsZS1maWVsZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKKyAgICAgIH0KKworICAgICAgaWYgKCBFZGl0b3JIYXMuZWRpdFN1bW1hcnlNYXJrdXAoKSApIHsKKyAgICAgICAgJC5Hb2xsdW1FZGl0b3IuUGxhY2Vob2xkZXIuYWRkKCQoJyNnb2xsdW0tZWRpdG9yLWVkaXQtc3VtbWFyeSBpbnB1dCcpKTsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3IgZm9ybVtuYW1lPSJnb2xsdW0tZWRpdG9yIl0nKS5zdWJtaXQoZnVuY3Rpb24oIGUgKSB7CisgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICQuR29sbHVtRWRpdG9yLlBsYWNlaG9sZGVyLmNsZWFyQWxsKCk7CisgICAgICAgICAgZGVidWcoJ3N1Ym1pdHRpbmcnKTsKKyAgICAgICAgICAkKHRoaXMpLnVuYmluZCgnc3VibWl0Jyk7CisgICAgICAgICAgJCh0aGlzKS5zdWJtaXQoKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICggRWRpdG9ySGFzLmNvbGxhcHNpYmxlSW5wdXRzKCkgKSB7CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yIC5jb2xsYXBzZWQgYS5idXR0b24sICcgKworICAgICAgICAgICcjZ29sbHVtLWVkaXRvciAuZXhwYW5kZWQgYS5idXR0b24nKS5jbGljayhmdW5jdGlvbiggZSApIHsKKyAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50b2dnbGVDbGFzcygnZXhwYW5kZWQnKTsKKyAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICggRWRpdG9ySGFzLnByZXZpZXdCdXR0b24oKSApIHsKKyAgICAgICAgdmFyIGZvcm1BY3Rpb24gPQorICAgICAgICAkKCcjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1wcmV2aWV3JykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICAgLy8gbWFrZSBhIGR1bW15IGZvcm0sIHN1Ym1pdCB0byBuZXcgdGFyZ2V0IHdpbmRvdworICAgICAgICAgIC8vIGdldCBmb3JtIGZpZWxkcworICAgICAgICAgIHZhciBvbGRBY3Rpb24gPSAkKCcjZ29sbHVtLWVkaXRvciBmb3JtJykuYXR0cignYWN0aW9uJyk7CisgICAgICAgICAgdmFyICRmb3JtID0gJCgkKCcjZ29sbHVtLWVkaXRvciBmb3JtJykuZ2V0KDApKTsKKyAgICAgICAgICAkZm9ybS5hdHRyKCdhY3Rpb24nLCB0aGlzLmhyZWYgfHwgJy9wcmV2aWV3Jyk7CisgICAgICAgICAgJGZvcm0uYXR0cigndGFyZ2V0JywgJ19ibGFuaycpOworICAgICAgICAgICRmb3JtLnN1Ym1pdCgpOworCisKKyAgICAgICAgICAkZm9ybS5hdHRyKCdhY3Rpb24nLCBvbGRBY3Rpb24pOworICAgICAgICAgICRmb3JtLnJlbW92ZUF0dHIoJ3RhcmdldCcpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIGJhciBieSBsb2FkaW5nIHByb3BlciBkZWZpbml0aW9ucworICAgICAgaWYgKCBFZGl0b3JIYXMuZnVuY3Rpb25CYXIoKSApIHsKKworICAgICAgICB2YXIgaHRtbFNldE1hcmt1cExhbmcgPQorICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWJvZHknKS5hdHRyKCdkYXRhLW1hcmt1cC1sYW5nJyk7CisKKyAgICAgICAgaWYgKCBodG1sU2V0TWFya3VwTGFuZyApIHsKKyAgICAgICAgICBBY3RpdmVPcHRpb25zLk1hcmt1cFR5cGUgPSBodG1sU2V0TWFya3VwTGFuZzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvYWQgbGFuZ3VhZ2UgZGVmaW5pdGlvbgorICAgICAgICBMYW5ndWFnZURlZmluaXRpb24uc2V0QWN0aXZlTGFuZ3VhZ2UoIEFjdGl2ZU9wdGlvbnMuTWFya3VwVHlwZSApOworICAgICAgICBpZiAoIEVkaXRvckhhcy5mb3JtYXRTZWxlY3RvcigpICkgeworICAgICAgICAgIEZvcm1hdFNlbGVjdG9yLmluaXQoCisgICAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1mb3JtYXQtc2VsZWN0b3Igc2VsZWN0JykgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggRWRpdG9ySGFzLmhlbHAoKSApIHsKKyAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykuaGlkZSgpOworICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5yZW1vdmVDbGFzcygnamF3cycpOworICAgICAgICB9CisKKyAgICAgIH0KKyAgICAgIC8vIEVkaXRvckhhcy5mdW5jdGlvbkJhcgorICAgIH0KKyAgICAvLyBFZGl0b3JIYXMuYmFzZUVkaXRvck1hcmt1cAorICB9OworCisKKworICAvKioKKyAgICogICQuR29sbHVtRWRpdG9yLmRlZmluZUxhbmd1YWdlCisgICAqICBEZWZpbmVzIGEgc2V0IG9mIGxhbmd1YWdlIGFjdGlvbnMgdGhhdCBHb2xsdW0gY2FuIHVzZS4KKyAgICogIFVzZWQgYnkgdGhlIGRlZmluaXRpb25zIGluIGxhbmdzLyB0byByZWdpc3RlciBsYW5ndWFnZSBkZWZpbml0aW9ucy4KKyAgICovCisgICQuR29sbHVtRWRpdG9yLmRlZmluZUxhbmd1YWdlID0gZnVuY3Rpb24oIGxhbmd1YWdlX25hbWUsIGxhbmd1YWdlT2JqZWN0ICkgeworICAgIGlmICggdHlwZW9mIGxhbmd1YWdlT2JqZWN0ID09ICdvYmplY3QnICkgeworICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLmRlZmluZSggbGFuZ3VhZ2VfbmFtZSwgbGFuZ3VhZ2VPYmplY3QgKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVidWcoJ0dvbGx1bUVkaXRvci5kZWZpbmVMYW5ndWFnZTogZGVmaW5pdGlvbiBmb3IgJyArIGxhbmd1YWdlX25hbWUgKworICAgICAgICAgICAgJyBpcyBub3QgYW4gb2JqZWN0Jyk7CisgICAgfQorICB9OworCisKKyAgLyoqCisgICAqICBkZWJ1ZworICAgKiAgUHJpbnRzIGRlYnVnIGluZm9ybWF0aW9uIHRvIGNvbnNvbGUubG9nIGlmIGRlYnVnIG91dHB1dCBpcyBlbmFibGVkLgorICAgKgorICAgKiAgQHBhcmFtICBtaXhlZCAgV2hhdGV2ZXIgeW91IHdhbnQgdG8gZHVtcCB0byBjb25zb2xlLmxvZworICAgKiAgQHJldHVybiB2b2lkCisgICAqLworICB2YXIgZGVidWcgPSBmdW5jdGlvbihtKSB7CisgICAgaWYgKCBBY3RpdmVPcHRpb25zLkRlYnVnICYmCisgICAgICAgICB0eXBlb2YgY29uc29sZSAhPSAndW5kZWZpbmVkJyApIHsKKyAgICAgIGNvbnNvbGUubG9nKCBtICk7CisgICAgfQorICB9OworCisKKworICAvKioKKyAgICogIExhbmd1YWdlRGVmaW5pdGlvbgorICAgKiAgTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmaWxlIGhhbmRsZXIKKyAgICogIExvYWRzIGxhbmd1YWdlIGRlZmluaXRpb24gZmlsZXMgYXMgbmVjZXNzYXJ5LgorICAgKi8KKyAgdmFyIExhbmd1YWdlRGVmaW5pdGlvbiA9IHsKKworICAgIF9BQ1RJVkVfTEFORzogJycsCisgICAgX0xPQURFRF9MQU5HUzogW10sCisgICAgX0xBTkc6IHt9LAorCisgICAgLyoqCisgICAgICogIERlZmluZXMgYSBsYW5ndWFnZQorICAgICAqCisgICAgICogIEBwYXJhbSBuYW1lIHN0cmluZyAgVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlCisgICAgICogIEBwYXJhbSBuYW1lIG9iamVjdCAgVGhlIGRlZmluaXRpb24gb2JqZWN0CisgICAgICovCisgICAgZGVmaW5lOiBmdW5jdGlvbiggbmFtZSwgZGVmaW5pdGlvbk9iamVjdCApIHsKKyAgICAgIExhbmd1YWdlRGVmaW5pdGlvbi5fQUNUSVZFX0xBTkcgPSBuYW1lOworICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MT0FERURfTEFOR1MucHVzaCggbmFtZSApOworICAgICAgaWYgKCB0eXBlb2YgJC5Hb2xsdW1FZGl0b3IuV2lraUxhbmd1YWdlID09ICdvYmplY3QnICkgeworICAgICAgICB2YXIgZGVmaW5pdGlvbiA9IHt9OworICAgICAgICAkLmV4dGVuZChkZWZpbml0aW9uLCAkLkdvbGx1bUVkaXRvci5XaWtpTGFuZ3VhZ2UsIGRlZmluaXRpb25PYmplY3QpOworICAgICAgICBMYW5ndWFnZURlZmluaXRpb24uX0xBTkdbbmFtZV0gPSBkZWZpbml0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW25hbWVdID0gZGVmaW5pdGlvbk9iamVjdDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZ2V0QWN0aXZlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIExhbmd1YWdlRGVmaW5pdGlvbi5fQUNUSVZFX0xBTkc7CisgICAgfSwKKworICAgIHNldEFjdGl2ZUxhbmd1YWdlOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICAgIGlmICggIUxhbmd1YWdlRGVmaW5pdGlvbi5pc0xvYWRlZEZvcihuYW1lKSApIHsKKyAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9BQ1RJVkVfTEFORyA9IG51bGw7CisgICAgICAgIExhbmd1YWdlRGVmaW5pdGlvbi5sb2FkRm9yKCBuYW1lLCBmdW5jdGlvbih4LCB0KSB7CisgICAgICAgICAgaWYgKCB0ICE9ICdzdWNjZXNzJyApIHsKKyAgICAgICAgICAgIGRlYnVnKCdGYWlsZWQgdG8gbG9hZCBsYW5ndWFnZSBkZWZpbml0aW9uIGZvciAnICsgbmFtZSk7CisgICAgICAgICAgICAvLyB3ZWxsLCBmYWtlIGl0IGFuZCB0dXJuIGV2ZXJ5dGhpbmcgb2ZmIGZvciB0aGlzIG9uZQorICAgICAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLmRlZmluZSggbmFtZSwge30gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyB1cGRhdGUgZmVhdHVyZXMgdGhhdCByZWx5IG9uIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uCisgICAgICAgICAgaWYgKCBFZGl0b3JIYXMuZnVuY3Rpb25CYXIoKSApIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uQmFyLnJlZnJlc2goKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIExhbmd1YWdlRGVmaW5pdGlvbi5pc1ZhbGlkKCkgJiYgRWRpdG9ySGFzLmZvcm1hdFNlbGVjdG9yKCkgKSB7CisgICAgICAgICAgICBGb3JtYXRTZWxlY3Rvci51cGRhdGVTZWxlY3RlZCgpOworICAgICAgICAgIH0KKworICAgICAgICB9ICk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMYW5ndWFnZURlZmluaXRpb24uX0FDVElWRV9MQU5HID0gbmFtZTsKKyAgICAgICAgRnVuY3Rpb25CYXIucmVmcmVzaCgpOworICAgICAgfQorICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBnZXRzIGEgZGVmaW5pdGlvbiBvYmplY3QgZm9yIGEgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogIEBwYXJhbSAgc3RyaW5nICBhdHRyICAgIFRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICAgICAqICBAcGFyYW0gIHN0cmluZyAgc3BlY2lmaWVkX2xhbmcgIFRoZSBsYW5ndWFnZSB0byBwdWxsIGEgZGVmaW5pdGlvbiBmb3IuCisgICAgICogIEByZXR1cm4gb2JqZWN0IGlmIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBnZXREZWZpbml0aW9uRm9yOiBmdW5jdGlvbiggYXR0ciwgc3BlY2lmaWVkX2xhbmcgKSB7CisgICAgICBpZiAoICFzcGVjaWZpZWRfbGFuZyApIHsKKyAgICAgICAgc3BlY2lmaWVkX2xhbmcgPSBMYW5ndWFnZURlZmluaXRpb24uX0FDVElWRV9MQU5HOworICAgICAgfQorCisgICAgICBpZiAoIExhbmd1YWdlRGVmaW5pdGlvbi5pc0xvYWRlZEZvcihzcGVjaWZpZWRfbGFuZykgJiYKKyAgICAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW3NwZWNpZmllZF9sYW5nXVthdHRyXSAmJgorICAgICAgICAgICB0eXBlb2YgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW3NwZWNpZmllZF9sYW5nXVthdHRyXSA9PSAnb2JqZWN0JyApIHsKKyAgICAgICAgcmV0dXJuIExhbmd1YWdlRGVmaW5pdGlvbi5fTEFOR1tzcGVjaWZpZWRfbGFuZ11bYXR0cl07CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBsb2FkRm9yCisgICAgICogIEFzeW5jaHJvbm91c2x5IGxvYWRzIGEgZGVmaW5pdGlvbiBmaWxlIGZvciB0aGUgY3VycmVudCBtYXJrdXAuCisgICAgICogIERlZmluaXRpb24gZmlsZXMgYXJlIG5lY2Vzc2FyeSB0byB1c2UgdGhlIGNvZGUgZWRpdG9yLgorICAgICAqCisgICAgICogIEBwYXJhbSAgc3RyaW5nICBtYXJrdXBfbmFtZSAgVGhlIG1hcmt1cCBuYW1lIHlvdSB3YW50IHRvIGxvYWQKKyAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICovCisgICAgbG9hZEZvcjogZnVuY3Rpb24oIG1hcmt1cF9uYW1lLCBvbl9jb21wbGV0ZSApIHsKKyAgICAgIC8vIEtlZXAgdXMgZnJvbSBoaXR0aW5nIDQwNHMgb24gb3VyIHNpdGUsIGNoZWNrIHRoZSBkZWZpbml0aW9uIGJsYWNrbGlzdAorICAgICAgaWYgKCBBY3RpdmVPcHRpb25zLk5vRGVmaW5pdGlvbnNGb3IubGVuZ3RoICkgeworICAgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgQWN0aXZlT3B0aW9ucy5Ob0RlZmluaXRpb25zRm9yLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgIGlmICggbWFya3VwX25hbWUgPT0gQWN0aXZlT3B0aW9ucy5Ob0RlZmluaXRpb25zRm9yW2ldICkgeworICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0aGlzLiBnZXQgb3V0LgorICAgICAgICAgICAgaWYgKCB0eXBlb2Ygb25fY29tcGxldGUgPT0gJ2Z1bmN0aW9uJyApIHsKKyAgICAgICAgICAgICAgb25fY29tcGxldGUoIG51bGwsICdlcnJvcicgKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBhdHRlbXB0IHRvIGxvYWQgdGhlIGRlZmluaXRpb24gZm9yIHRoaXMgbGFuZ3VhZ2UKKyAgICAgIHZhciBzY3JpcHRfdXJpID0gJy9qYXZhc2NyaXB0L2VkaXRvci9sYW5ncy8nICsgbWFya3VwX25hbWUgKyAnLmpzJzsKKyAgICAgICQuYWpheCh7CisgICAgICAgICAgICAgICAgdXJsOiBzY3JpcHRfdXJpLAorICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnc2NyaXB0JywKKyAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oIHhociwgdGV4dFN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIG9uX2NvbXBsZXRlID09ICdmdW5jdGlvbicgKSB7CisgICAgICAgICAgICAgICAgICAgIG9uX2NvbXBsZXRlKCB4aHIsIHRleHRTdGF0dXMgKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiAgaXNMb2FkZWRGb3IKKyAgICAgKiAgQ2hlY2tzIHRvIHNlZSBpZiBhIGRlZmluaXRpb24gZmlsZSBoYXMgYmVlbiBsb2FkZWQgZm9yIHRoZQorICAgICAqICBzcGVjaWZpZWQgbWFya3VwIGxhbmd1YWdlLgorICAgICAqCisgICAgICogIEBwYXJhbSAgc3RyaW5nICBtYXJrdXBfbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBtYXJrdXAuCisgICAgICogIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIGlzTG9hZGVkRm9yOiBmdW5jdGlvbiggbWFya3VwX25hbWUgKSB7CisgICAgICBpZiAoIExhbmd1YWdlRGVmaW5pdGlvbi5fTE9BREVEX0xBTkdTLmxlbmd0aCA9PT0gMCApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MT0FERURfTEFOR1MubGVuZ3RoOyBpKysgKSB7CisgICAgICAgIGlmICggTGFuZ3VhZ2VEZWZpbml0aW9uLl9MT0FERURfTEFOR1NbaV0gPT0gbWFya3VwX25hbWUgKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgaXNWYWxpZDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCBMYW5ndWFnZURlZmluaXRpb24uX0FDVElWRV9MQU5HICYmCisgICAgICAgICAgICAgICB0eXBlb2YgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW0xhbmd1YWdlRGVmaW5pdGlvbi5fQUNUSVZFX0xBTkddID09CisgICAgICAgICAgICAgICAnb2JqZWN0JyApOworICAgIH0KKworICB9OworCisKKyAgLyoqCisgICAqICBFZGl0b3JIYXMKKyAgICogIFZhcmlvdXMgY29uZGl0aW9uYWxzIHRvIGNoZWNrIHdoYXQgZmVhdHVyZXMgb2YgdGhlIEdvbGx1bSBFZGl0b3IgYXJlCisgICAqICBhY3RpdmUvb3BlcmF0aW9uYWwuCisgICAqLworICB2YXIgRWRpdG9ySGFzID0geworCisKKyAgICAvKioKKyAgICAgKiAgRWRpdG9ySGFzLmJhc2VFZGl0b3JNYXJrdXAKKyAgICAgKiAgVHJ1ZSBpZiB0aGUgYmFzaWMgZWRpdG9yIGZvcm0gaXMgaW4gcGxhY2UuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgYmFzZUVkaXRvck1hcmt1cDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCAkKCcjZ29sbHVtLWVkaXRvcicpLmxlbmd0aCAmJgorICAgICAgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItYm9keScpLmxlbmd0aCApOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMuY29sbGFwc2libGVJbnB1dHMKKyAgICAgKiAgVHJ1ZSBpZiB0aGUgZWRpdG9yIGNvbnRhaW5zIGNvbGxhcHNpYmxlIGlucHV0cyBmb3IgdGhpbmdzIGxpa2UgdGhlCisgICAgICogIHNpZGViYXIgb3IgZm9vdGVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgY29sbGFwc2libGVJbnB1dHM6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICQoJyNnb2xsdW0tZWRpdG9yIC5jb2xsYXBzZWQsICNnb2xsdW0tZWRpdG9yIC5leHBhbmRlZCcpLmxlbmd0aDsKKyAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiAgRWRpdG9ySGFzLmZvcm1hdFNlbGVjdG9yCisgICAgICogIFRydWUgaWYgdGhlIGVkaXRvciBoYXMgYSBmb3JtYXQgc2VsZWN0b3IgKGZvciBzd2l0Y2hpbmcgYmV0d2VlbgorICAgICAqICBsYW5ndWFnZSB0eXBlcyksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBmb3JtYXRTZWxlY3RvcjogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gJCgnI2dvbGx1bS1lZGl0b3ItZm9ybWF0LXNlbGVjdG9yIHNlbGVjdCcpLmxlbmd0aDsKKyAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiAgRWRpdG9ySGFzLmZ1bmN0aW9uQmFyCisgICAgICogIFRydWUgaWYgdGhlIEZ1bmN0aW9uIEJhciBtYXJrdXAgZXhpc3RzLgorICAgICAqCisgICAgICogIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIGZ1bmN0aW9uQmFyOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAoIEFjdGl2ZU9wdGlvbnMuSGFzRnVuY3Rpb25CYXIgJiYKKyAgICAgICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhcicpLmxlbmd0aCApOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMuZmY0RW52aXJvbm1lbnQKKyAgICAgKiAgVHJ1ZSBpZiBpbiBhIEZpcmVmb3ggNC4wIEJldGEgZW52aXJvbm1lbnQuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgZmY0RW52aXJvbm1lbnQ6IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHVhID0gbmV3IFJlZ0V4cCgvRmlyZWZveFwvNC4wYi8pOworICAgICAgcmV0dXJuICggdWEudGVzdCggbmF2aWdhdG9yLnVzZXJBZ2VudCApICk7CisgICAgfSwKKworCisgICAgLyoqCisgICAgICogIEVkaXRvckhhcy5lZGl0U3VtbWFyeU1hcmt1cAorICAgICAqICBUcnVlIGlmIHRoZSBlZGl0b3IgaGFzIGEgc3VtbWFyeSBmaWVsZCAoR29sbHVtJ3MgY29tbWl0IG1lc3NhZ2UpLAorICAgICAqICBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgZWRpdFN1bW1hcnlNYXJrdXA6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICggJCgnaW5wdXQjZ29sbHVtLWVkaXRvci1tZXNzYWdlLWZpZWxkJykubGVuZ3RoID4gMCApOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMuaGVscAorICAgICAqICBUcnVlIGlmIHRoZSBlZGl0b3IgY29udGFpbnMgdGhlIGlubGluZSBoZWxwIHNlY3RvciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIGhlbHA6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICggJCgnI2dvbGx1bS1lZGl0b3IgI2dvbGx1bS1lZGl0b3ItaGVscCcpLmxlbmd0aCAmJgorICAgICAgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3IgI2Z1bmN0aW9uLWhlbHAnKS5sZW5ndGggKTsKKyAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiAgRWRpdG9ySGFzLnByZXZpZXdCdXR0b24KKyAgICAgKiAgVHJ1ZSBpZiB0aGUgZWRpdG9yIGhhcyBhIHByZXZpZXcgYnV0dG9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgcHJldmlld0J1dHRvbjogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCAkKCcjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1wcmV2aWV3JykubGVuZ3RoICk7CisgICAgfSwKKworCisgICAgLyoqCisgICAgICogIEVkaXRvckhhcy50aXRsZURpc3BsYXllZAorICAgICAqICBUcnVlIGlmIHRoZSBlZGl0b3IgaXMgZGlzcGxheWluZyBhIHRpdGxlIGZpZWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgdGl0bGVEaXNwbGF5ZWQ6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICggQWN0aXZlT3B0aW9ucy5OZXdGaWxlICk7CisgICAgfQorCisgIH07CisKKworICAvKioKKyAgICogIEZ1bmN0aW9uQmFyCisgICAqCisgICAqICBUaGluZ3MgdGhlIGZ1bmN0aW9uIGJhciBkb2VzLgorICAgKi8KKyAgIHZhciBGdW5jdGlvbkJhciA9IHsKKworICAgICAgaXNBY3RpdmU6IGZhbHNlLAorCisKKyAgICAgIC8qKgorICAgICAgICogIEZ1bmN0aW9uQmFyLmFjdGl2YXRlCisgICAgICAgKiAgQWN0aXZhdGVzIHRoZSBmdW5jdGlvbiBiYXIsIGF0dGFjaGluZyBhbGwgY2xpY2sgZXZlbnRzCisgICAgICAgKiAgYW5kIGRpc3BsYXlpbmcgdGhlIGJhci4KKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIGFjdGl2YXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgZGVidWcoJ0FjdGl2YXRpbmcgZnVuY3Rpb24gYmFyJyk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlc2Ugb3V0CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhciBhLmZ1bmN0aW9uLWJ1dHRvbicpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAgaWYgKCBMYW5ndWFnZURlZmluaXRpb24uZ2V0RGVmaW5pdGlvbkZvciggJCh0aGlzKS5hdHRyKCdpZCcpICkgKSB7CisgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKCBGdW5jdGlvbkJhci5ldnRGdW5jdGlvbkJ1dHRvbkNsaWNrICk7CisgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICggJCh0aGlzKS5hdHRyKCdpZCcpICE9ICdmdW5jdGlvbi1oZWxwJyApIHsKKyAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBzaG93IGJhciBhcyBhY3RpdmUKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyJykuYWRkQ2xhc3MoICdhY3RpdmUnICk7CisgICAgICAgIEZ1bmN0aW9uQmFyLmlzQWN0aXZlID0gdHJ1ZTsKKyAgICAgIH0sCisKKworICAgICAgZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhciBhLmZ1bmN0aW9uLWJ1dHRvbicpLnVuYmluZCgnY2xpY2snKTsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyJykucmVtb3ZlQ2xhc3MoICdhY3RpdmUnICk7CisgICAgICAgIEZ1bmN0aW9uQmFyLmlzQWN0aXZlID0gZmFsc2U7CisgICAgICB9LAorCisKKyAgICAgIC8qKgorICAgICAgICogIEZ1bmN0aW9uQmFyLmV2dEZ1bmN0aW9uQnV0dG9uQ2xpY2sKKyAgICAgICAqICBFdmVudCBoYW5kbGVyIGZvciB0aGUgZnVuY3Rpb24gYnV0dG9ucy4gVHJhcHMgdGhlIGNsaWNrIGFuZAorICAgICAgICogIGV4ZWN1dGVzIHRoZSBwcm9wZXIgbGFuZ3VhZ2UgYWN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0galF1ZXJ5LkV2ZW50IGpRdWVyeSBldmVudCBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV2dEZ1bmN0aW9uQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB2YXIgZGVmID0gTGFuZ3VhZ2VEZWZpbml0aW9uLmdldERlZmluaXRpb25Gb3IoICQodGhpcykuYXR0cignaWQnKSApOworICAgICAgICBpZiAoIHR5cGVvZiBkZWYgPT0gJ29iamVjdCcgKSB7CisgICAgICAgICAgRnVuY3Rpb25CYXIuZXhlY3V0ZUFjdGlvbiggZGVmICk7CisgICAgICAgIH0KKyAgICAgIH0sCisKKworICAgICAgLyoqCisgICAgICAgKiAgRnVuY3Rpb25CYXIuZXhlY3V0ZUFjdGlvbgorICAgICAgICogIEV4ZWN1dGVzIGEgbGFuZ3VhZ2Utc3BlY2lmaWMgZGVmaW5lZCBhY3Rpb24gZm9yIGEgZnVuY3Rpb24gYnV0dG9uLgorICAgICAgICoKKyAgICAgICAqLworICAgICAgZXhlY3V0ZUFjdGlvbjogZnVuY3Rpb24oIGRlZmluaXRpb25PYmplY3QgKSB7CisgICAgICAgIC8vIGdldCB0aGUgc2VsZWN0ZWQgdGV4dCBmcm9tIHRoZSB0ZXh0YXJlYQorICAgICAgICB2YXIgdHh0ID0gJCgnI2dvbGx1bS1lZGl0b3ItYm9keScpLnZhbCgpOworICAgICAgICAvLyBobW0sIEknbSBub3Qgc3VyZSB0aGlzIHdpbGwgd29yayBpbiBhIHRleHRhcmVhCisgICAgICAgIHZhciBzZWxQb3MgPSBGdW5jdGlvbkJhcgorICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZFNlbGVjdGlvblBvc2l0aW9uKCAkKCcjZ29sbHVtLWVkaXRvci1ib2R5JykgKTsKKyAgICAgICAgdmFyIHNlbFRleHQgPSBGdW5jdGlvbkJhci5nZXRGaWVsZFNlbGVjdGlvbiggJCgnI2dvbGx1bS1lZGl0b3ItYm9keScpICk7CisgICAgICAgIHZhciByZXBUZXh0ID0gc2VsVGV4dDsKKyAgICAgICAgdmFyIHJlc2VsZWN0ID0gdHJ1ZTsKKyAgICAgICAgdmFyIGN1cnNvciA9IG51bGw7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBhIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGlmIG9uZSBleGlzdHMKKyAgICAgICAgaWYgKCBkZWZpbml0aW9uT2JqZWN0LmV4ZWMgJiYKKyAgICAgICAgICAgICB0eXBlb2YgZGVmaW5pdGlvbk9iamVjdC5leGVjID09ICdmdW5jdGlvbicgKSB7CisgICAgICAgICAgZGVmaW5pdGlvbk9iamVjdC5leGVjKCB0eHQsIHNlbFRleHQsICQoJyNnb2xsdW0tZWRpdG9yLWJvZHknKSApOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGV4ZWN1dGUgYSBzZWFyY2gvcmVwbGFjZSBpZiB0aGV5IGV4aXN0CisgICAgICAgIHZhciBzZWFyY2hFeHAgPSAvKFteXG5dKykvZ2k7CisgICAgICAgIGlmICggZGVmaW5pdGlvbk9iamVjdC5zZWFyY2ggJiYKKyAgICAgICAgICAgICB0eXBlb2YgZGVmaW5pdGlvbk9iamVjdC5zZWFyY2ggPT0gJ29iamVjdCcgKSB7CisgICAgICAgICAgZGVidWcoJ1JlcGxhY2luZyBzZWFyY2ggUmVnZXgnKTsKKyAgICAgICAgICBzZWFyY2hFeHAgPSBudWxsOworICAgICAgICAgIHNlYXJjaEV4cCA9IG5ldyBSZWdFeHAgKCBkZWZpbml0aW9uT2JqZWN0LnNlYXJjaCApOworICAgICAgICAgIGRlYnVnKCBzZWFyY2hFeHAgKTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZygncmVwVGV4dCBpcyAnICsgJyInICsgcmVwVGV4dCArICciJyk7CisgICAgICAgIC8vIHJlcGxhY2UgdGV4dAorICAgICAgICBpZiAoIGRlZmluaXRpb25PYmplY3QucmVwbGFjZSAmJgorICAgICAgICAgICAgIHR5cGVvZiBkZWZpbml0aW9uT2JqZWN0LnJlcGxhY2UgPT0gJ3N0cmluZycgKSB7CisgICAgICAgICAgZGVidWcoJ1J1bm5pbmcgcmVwbGFjZW1lbnQgLSB1c2luZyAnICsgZGVmaW5pdGlvbk9iamVjdC5yZXBsYWNlKTsKKyAgICAgICAgICB2YXIgcnQgPSBkZWZpbml0aW9uT2JqZWN0LnJlcGxhY2U7CisgICAgICAgICAgcmVwVGV4dCA9IHJlcFRleHQucmVwbGFjZSggc2VhcmNoRXhwLCBydCApOworICAgICAgICAgIC8vIHJlbW92ZSBiYWNrcmVmZXJlbmNlcworICAgICAgICAgIHJlcFRleHQgPSByZXBUZXh0LnJlcGxhY2UoIC9cJFtcZF0vZywgJycgKTsKKworICAgICAgICAgIGlmICggcmVwVGV4dCA9PT0gJycgKSB7CisgICAgICAgICAgICBkZWJ1ZygnU2VhcmNoIHN0cmluZyBpcyBlbXB0eScpOworCisgICAgICAgICAgICAvLyBmaW5kIHBvc2l0aW9uIG9mICQxIC0gdGhpcyBpcyB3aGVyZSB3ZSB3aWxsIHBsYWNlIHRoZSBjdXJzb3IKKyAgICAgICAgICAgIGN1cnNvciA9IHJ0LmluZGV4T2YoJyQxJyk7CisKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nLCBzbyBqdXN0IHJlbW92ZSBiYWNrcmVmZXJlbmNlcworICAgICAgICAgICAgcmVwVGV4dCA9IHJ0LnJlcGxhY2UoIC9cJFtcZF0vZywgJycgKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIHBvc2l0aW9uIG9mICQxIGRvZXNuJ3QgZXhpc3QsIHN0aWNrIHRoZSBjdXJzb3IgaW4KKyAgICAgICAgICAgIC8vIHRoZSBtaWRkbGUKKyAgICAgICAgICAgIGlmICggY3Vyc29yID09IC0xICkgeworICAgICAgICAgICAgICBjdXJzb3IgPSBNYXRoLmZsb29yKCBydC5sZW5ndGggLyAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwZW5kIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoIGRlZmluaXRpb25PYmplY3QuYXBwZW5kICYmCisgICAgICAgICAgICAgdHlwZW9mIGRlZmluaXRpb25PYmplY3QuYXBwZW5kID09ICdzdHJpbmcnICkgeworICAgICAgICAgIGlmICggcmVwVGV4dCA9PSBzZWxUZXh0ICkgeworICAgICAgICAgICAgcmVzZWxlY3QgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVwVGV4dCArPSBkZWZpbml0aW9uT2JqZWN0LmFwcGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmVwVGV4dCApIHsKKyAgICAgICAgICBGdW5jdGlvbkJhci5yZXBsYWNlRmllbGRTZWxlY3Rpb24oICQoJyNnb2xsdW0tZWRpdG9yLWJvZHknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcFRleHQsIHJlc2VsZWN0LCBjdXJzb3IgKTsKKyAgICAgICAgfQorCisgICAgICB9LAorCisKKyAgICAgIC8qKgorICAgICAgICogIGdldEZpZWxkU2VsZWN0aW9uUG9zaXRpb24KKyAgICAgICAqICBSZXRyaWV2ZXMgdGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIHRleHRhcmVhLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuIG9iamVjdCB0aGUgLnN0YXJ0IGFuZCAuZW5kIG9mZnNldHMgaW4gdGhlIHN0cmluZworICAgICAgICovCisgICAgICBnZXRGaWVsZFNlbGVjdGlvblBvc2l0aW9uOiBmdW5jdGlvbiggJGZpZWxkICkgeworICAgICAgICBpZiAoJGZpZWxkLmxlbmd0aCkgeworICAgICAgICAgIHZhciBzdGFydCA9IDAsIGVuZCA9IDA7CisgICAgICAgICAgdmFyIGVsID0gJGZpZWxkLmdldCgwKTsKKworICAgICAgICAgIGlmICh0eXBlb2YgZWwuc2VsZWN0aW9uU3RhcnQgPT0gIm51bWJlciIgJiYKKyAgICAgICAgICAgICAgdHlwZW9mIGVsLnNlbGVjdGlvbkVuZCA9PSAibnVtYmVyIikgeworICAgICAgICAgICAgc3RhcnQgPSBlbC5zZWxlY3Rpb25TdGFydDsKKyAgICAgICAgICAgIGVuZCA9IGVsLnNlbGVjdGlvbkVuZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgICAgICB2YXIgc3RvcmVkX3JhbmdlID0gcmFuZ2UuZHVwbGljYXRlKCk7CisgICAgICAgICAgICBzdG9yZWRfcmFuZ2UubW92ZVRvRWxlbWVudFRleHQoIGVsICk7CisgICAgICAgICAgICBzdG9yZWRfcmFuZ2Uuc2V0RW5kUG9pbnQoICdFbmRUb0VuZCcsIHJhbmdlICk7CisgICAgICAgICAgICBzdGFydCA9IHN0b3JlZF9yYW5nZS50ZXh0Lmxlbmd0aCAtIHJhbmdlLnRleHQubGVuZ3RoOworICAgICAgICAgICAgZW5kID0gc3RhcnQgKyByYW5nZS50ZXh0Lmxlbmd0aDsKKworICAgICAgICAgICAgLy8gc28sIHVoLCB3ZSdyZSBjbG9zZSwgYnV0IHdlIG5lZWQgdG8gc2VhcmNoIGZvciBsaW5lIGJyZWFrcyBhbmQKKyAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgc3RhcnQvZW5kIHBvaW50cyBhY2NvcmRpbmdseSBzaW5jZSBJRSBjb3VudHMgdGhlbSBhcworICAgICAgICAgICAgLy8gMiBjaGFyYWN0ZXJzIGluIFRleHRSYW5nZS4KKyAgICAgICAgICAgIHZhciBzID0gc3RhcnQ7CisgICAgICAgICAgICB2YXIgbGIgPSAwOworICAgICAgICAgICAgdmFyIGk7CisgICAgICAgICAgICBkZWJ1ZygnSUU6IHN0YXJ0IHBvc2l0aW9uIGlzIGN1cnJlbnRseSAnICsgcyk7CisgICAgICAgICAgICBmb3IgKCBpPTA7IGkgPCBzOyBpKysgKSB7CisgICAgICAgICAgICAgIGlmICggZWwudmFsdWUuY2hhckF0KGkpLm1hdGNoKC9cci8pICkgeworICAgICAgICAgICAgICAgICsrbGI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBsYiApIHsKKyAgICAgICAgICAgICAgZGVidWcoJ0lFIHN0YXJ0OiBjb21wZW5zYXRpbmcgZm9yICcgKyBsYiArICcgbGluZSBicmVha3MnKTsKKyAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydCAtIGxiOworICAgICAgICAgICAgICBsYiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlID0gZW5kOworICAgICAgICAgICAgZm9yICggaT0wOyBpIDwgZTsgaSsrICkgeworICAgICAgICAgICAgICBpZiAoIGVsLnZhbHVlLmNoYXJBdChpKS5tYXRjaCgvXHIvKSApIHsKKyAgICAgICAgICAgICAgICArK2xiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggbGIgKSB7CisgICAgICAgICAgICAgIGRlYnVnKCdJRSBlbmQ6IGNvbXBlbnNhdGluZyBmb3IgJyArIGxiICsgJyBsaW5lIGJyZWFrcycpOworICAgICAgICAgICAgICBlbmQgPSBlbmQgLSBsYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICBzdGFydDogc3RhcnQsCisgICAgICAgICAgICAgIGVuZDogZW5kCisgICAgICAgICAgfTsKKyAgICAgICAgfSAvLyBlbmQgaWYgKCRmaWVsZC5sZW5ndGgpCisgICAgICB9LAorCisKKyAgICAgIC8qKgorICAgICAgICogIGdldEZpZWxkU2VsZWN0aW9uCisgICAgICAgKiAgUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnN0cmluZyBvZiB0aGUgdGV4dGFyZWEuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgalF1ZXJ5ICBBIGpRdWVyeSBvYmplY3QgZm9yIHRoZSB0ZXh0YXJlYS4KKyAgICAgICAqICBAcmV0dXJuIHN0cmluZyAgU2VsZWN0ZWQgc3RyaW5nLgorICAgICAgICovCisgICAgICBnZXRGaWVsZFNlbGVjdGlvbjogZnVuY3Rpb24oICRmaWVsZCApIHsKKyAgICAgICAgdmFyIHNlbFN0ciA9ICcnOworICAgICAgICB2YXIgc2VsUG9zOworCisgICAgICAgIGlmICggJGZpZWxkLmxlbmd0aCApIHsKKyAgICAgICAgICBzZWxQb3MgPSBGdW5jdGlvbkJhci5nZXRGaWVsZFNlbGVjdGlvblBvc2l0aW9uKCAkZmllbGQgKTsKKyAgICAgICAgICBzZWxTdHIgPSAkZmllbGQudmFsKCkuc3Vic3RyaW5nKCBzZWxQb3Muc3RhcnQsIHNlbFBvcy5lbmQgKTsKKyAgICAgICAgICBkZWJ1ZygnU2VsZWN0ZWQ6ICcgKyBzZWxTdHIgKyAnICgnICsgc2VsUG9zLnN0YXJ0ICsgJywgJyArCisgICAgICAgICAgICAgICAgc2VsUG9zLmVuZCArICcpJyk7CisgICAgICAgICAgcmV0dXJuIHNlbFN0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9LAorCisKKyAgICAgIGlzU2hvd246IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gKCQoJyNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhcicpLmlzKCc6dmlzaWJsZScpKTsKKyAgICAgIH0sCisKKyAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAoIEVkaXRvckhhcy5mdW5jdGlvbkJhcigpICkgeworICAgICAgICAgIGRlYnVnKCdSZWZyZXNoaW5nIGZ1bmN0aW9uIGJhcicpOworICAgICAgICAgIGlmICggTGFuZ3VhZ2VEZWZpbml0aW9uLmlzVmFsaWQoKSApIHsKKyAgICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWZ1bmN0aW9uLWJhciBhLmZ1bmN0aW9uLWJ1dHRvbicpLnVuYmluZCgnY2xpY2snKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uQmFyLmFjdGl2YXRlKCk7CisgICAgICAgICAgICBpZiAoIEhlbHAgKSB7CisgICAgICAgICAgICAgIEhlbHAuc2V0QWN0aXZlSGVscCggTGFuZ3VhZ2VEZWZpbml0aW9uLmdldEFjdGl2ZUxhbmd1YWdlKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoJ0xhbmd1YWdlIGRlZmluaXRpb24gaXMgaW52YWxpZC4nKTsKKyAgICAgICAgICAgIGlmICggRnVuY3Rpb25CYXIuaXNTaG93bigpICkgeworICAgICAgICAgICAgICAvLyBkZWFjdGl2YXRlIHRoZSBmdW5jdGlvbiBiYXI7IGl0J3Mgbm90IGdvbm5hIHdvcmsgbm93CisgICAgICAgICAgICAgIEZ1bmN0aW9uQmFyLmRlYWN0aXZhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggSGVscC5pc1Nob3duKCkgKSB7CisgICAgICAgICAgICAgIEhlbHAuaGlkZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKworCisgICAgICAvKioKKyAgICAgICAqICByZXBsYWNlRmllbGRTZWxlY3Rpb24KKyAgICAgICAqICBSZXBsYWNlcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnN0cmluZyBvZiB0aGUgdGV4dGFyZWEgd2l0aAorICAgICAgICogIGEgbmV3IHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBqUXVlcnkgIEEgalF1ZXJ5IG9iamVjdCBmb3IgdGhlIHRleHRhcmVhLgorICAgICAgICogIEBwYXJhbSAgc3RyaW5nICBUaGUgc3RyaW5nIHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdpdGguCisgICAgICAgKiAgQHBhcmFtICBib29sZWFuIFJlc2VsZWN0IHRoZSBuZXcgdGV4dCByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVwbGFjZUZpZWxkU2VsZWN0aW9uOiBmdW5jdGlvbiggJGZpZWxkLCByZXBsYWNlVGV4dCwgcmVzZWxlY3QsIGN1cnNvck9mZnNldCApIHsKKyAgICAgICAgdmFyIHNlbFBvcyA9IEZ1bmN0aW9uQmFyLmdldEZpZWxkU2VsZWN0aW9uUG9zaXRpb24oICRmaWVsZCApOworICAgICAgICB2YXIgZnVsbFN0ciA9ICRmaWVsZC52YWwoKTsKKyAgICAgICAgdmFyIHNlbGVjdE5ldyA9IHRydWU7CisgICAgICAgIGlmICggcmVzZWxlY3QgPT09IGZhbHNlKSB7CisgICAgICAgICAgc2VsZWN0TmV3ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2Nyb2xsVG9wID0gbnVsbDsKKyAgICAgICAgaWYgKCAkZmllbGRbMF0uc2Nyb2xsVG9wICkgeworICAgICAgICAgIHNjcm9sbFRvcCA9ICRmaWVsZFswXS5zY3JvbGxUb3A7CisgICAgICAgIH0KKworICAgICAgICAkZmllbGQudmFsKCBmdWxsU3RyLnN1YnN0cmluZygwLCBzZWxQb3Muc3RhcnQpICsgcmVwbGFjZVRleHQgKworICAgICAgICAgICAgICAgICAgICBmdWxsU3RyLnN1YnN0cmluZyhzZWxQb3MuZW5kKSApOworICAgICAgICAkZmllbGRbMF0uZm9jdXMoKTsKKworICAgICAgICBpZiAoIHNlbGVjdE5ldyApIHsKKyAgICAgICAgICBpZiAoICRmaWVsZFswXS5zZXRTZWxlY3Rpb25SYW5nZSApIHsKKyAgICAgICAgICAgIGlmICggY3Vyc29yT2Zmc2V0ICkgeworICAgICAgICAgICAgICAkZmllbGRbMF0uc2V0U2VsZWN0aW9uUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbFBvcy5zdGFydCArIGN1cnNvck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUG9zLnN0YXJ0ICsgY3Vyc29yT2Zmc2V0CisgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgJGZpZWxkWzBdLnNldFNlbGVjdGlvblJhbmdlKCBzZWxQb3Muc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUG9zLnN0YXJ0ICsgcmVwbGFjZVRleHQubGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICggJGZpZWxkWzBdLmNyZWF0ZVRleHRSYW5nZSApIHsKKyAgICAgICAgICAgIHZhciByYW5nZSA9ICRmaWVsZFswXS5jcmVhdGVUZXh0UmFuZ2UoKTsKKyAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKCB0cnVlICk7CisgICAgICAgICAgICBpZiAoIGN1cnNvck9mZnNldCApIHsKKyAgICAgICAgICAgICAgcmFuZ2UubW92ZUVuZCggc2VsUG9zLnN0YXJ0ICsgY3Vyc29yT2Zmc2V0ICk7CisgICAgICAgICAgICAgIHJhbmdlLm1vdmVTdGFydCggc2VsUG9zLnN0YXJ0ICsgY3Vyc29yT2Zmc2V0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByYW5nZS5tb3ZlRW5kKCAnY2hhcmFjdGVyJywgc2VsUG9zLnN0YXJ0ICsgcmVwbGFjZVRleHQubGVuZ3RoICk7CisgICAgICAgICAgICAgIHJhbmdlLm1vdmVTdGFydCggJ2NoYXJhY3RlcicsIHNlbFBvcy5zdGFydCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBzY3JvbGxUb3AgKSB7CisgICAgICAgICAgLy8gdGhpcyBqdW1wcyBzb21ldGltZXMgaW4gRkYKKyAgICAgICAgICAkZmllbGRbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOworICAgICAgICB9CisgICAgICB9CisgICB9OworCisKKworICAgLyoqCisgICAgKiAgRm9ybWF0U2VsZWN0b3IKKyAgICAqCisgICAgKiAgRnVuY3Rpb25zIHJlbGF0aW5nIHRvIHRoZSBmb3JtYXQgc2VsZWN0b3IgKGlmIGl0IGV4aXN0cykKKyAgICAqLworICAgdmFyIEZvcm1hdFNlbGVjdG9yID0geworCisgICAgICRfU0VMRUNUT1I6IG51bGwsCisKKyAgICAgLyoqCisgICAgICAqICBGb3JtYXRTZWxlY3Rvci5ldnRDaGFuZ2VGb3JtYXQKKyAgICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gYSBmb3JtYXQgaGFzIGJlZW4gY2hhbmdlZCBieSB0aGUgZm9ybWF0CisgICAgICAqICBzZWxlY3Rvci4gV2lsbCBhdXRvbWF0aWNhbGx5IGxvYWQgYSBuZXcgbGFuZ3VhZ2UgZGVmaW5pdGlvbgorICAgICAgKiAgdmlhIEpTIGlmIG5lY2Vzc2FyeS4KKyAgICAgICoKKyAgICAgICogIEByZXR1cm4gdm9pZAorICAgICAgKi8KKyAgICAgZXZ0Q2hhbmdlRm9ybWF0OiBmdW5jdGlvbiggZSApIHsKKyAgICAgICB2YXIgbmV3TWFya3VwID0gJCh0aGlzKS52YWwoKTsKKyAgICAgICBMYW5ndWFnZURlZmluaXRpb24uc2V0QWN0aXZlTGFuZ3VhZ2UoIG5ld01hcmt1cCApOworICAgICB9LAorCisKKyAgICAgLyoqCisgICAgICAqICBGb3JtYXRTZWxlY3Rvci5pbml0CisgICAgICAqICBJbml0aWFsaXplcyB0aGUgZm9ybWF0IHNlbGVjdG9yLgorICAgICAgKgorICAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICAqLworICAgICBpbml0OiBmdW5jdGlvbiggJHNlbCApIHsKKyAgICAgICBkZWJ1ZygnSW5pdGlhbGl6aW5nIGZvcm1hdCBzZWxlY3RvcicpOworCisgICAgICAgLy8gdW5iaW5kIGV2ZW50cyBpZiBpbml0IGlzIGJlaW5nIGNhbGxlZCB0d2ljZSBmb3Igc29tZSByZWFzb24KKyAgICAgICBpZiAoIEZvcm1hdFNlbGVjdG9yLiRfU0VMRUNUT1IgJiYKKyAgICAgICAgICAgIHR5cGVvZiBGb3JtYXRTZWxlY3Rvci4kX1NFTEVDVE9SID09ICdvYmplY3QnICkgeworICAgICAgICAgRm9ybWF0U2VsZWN0b3IuJF9TRUxFQ1RPUi51bmJpbmQoICdjaGFuZ2UnICk7CisgICAgICAgfQorCisgICAgICAgRm9ybWF0U2VsZWN0b3IuJF9TRUxFQ1RPUiA9ICRzZWw7CisKKyAgICAgICAvLyBzZXQgZm9ybWF0IHNlbGVjdG9yIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlCisgICAgICAgRm9ybWF0U2VsZWN0b3IudXBkYXRlU2VsZWN0ZWQoKTsKKyAgICAgICBGb3JtYXRTZWxlY3Rvci4kX1NFTEVDVE9SLmNoYW5nZSggRm9ybWF0U2VsZWN0b3IuZXZ0Q2hhbmdlRm9ybWF0ICk7CisgICAgIH0sCisKKworICAgICAvKioKKyAgICAgICogRm9ybWF0U2VsZWN0b3IudXBkYXRlCisgICAgICAqLworICAgIHVwZGF0ZVNlbGVjdGVkOiBmdW5jdGlvbigpIHsKKyAgICAgICB2YXIgY3VycmVudExhbmcgPSBMYW5ndWFnZURlZmluaXRpb24uZ2V0QWN0aXZlTGFuZ3VhZ2UoKTsKKyAgICAgICBGb3JtYXRTZWxlY3Rvci4kX1NFTEVDVE9SLnZhbCggY3VycmVudExhbmcgKTsKKyAgICB9CisKKyAgIH07CisKKworCisgICAvKioKKyAgICAqICBIZWxwCisgICAgKgorICAgICogIEZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGUgZGlzcGxheSBhbmQgbG9hZGluZyBvZiBpbmxpbmUgaGVscCBmaWxlcy4KKyAgICAqLworICB2YXIgSGVscCA9IHsKKworICAgIF9BQ1RJVkVfSEVMUDogJycsCisgICAgX0xPQURFRF9IRUxQX0xBTkdTOiBbXSwKKyAgICBfSEVMUDoge30sCisKKyAgICAvKioKKyAgICAgKiAgSGVscC5kZWZpbmUKKyAgICAgKgorICAgICAqICBEZWZpbmVzIGEgbmV3IGhlbHAgY29udGV4dCBhbmQgZW5hYmxlcyB0aGUgaGVscCBmdW5jdGlvbiBpZiBpdAorICAgICAqICBleGlzdHMgaW4gdGhlIEdvbGx1bSBGdW5jdGlvbiBCYXIuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHN0cmluZyBuYW1lICAgVGhlIG5hbWUgeW91J3JlIGdpdmluZyB0byB0aGlzIGhlbHAgY29udGV4dC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbGx5LCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgbGFuZ3VhZ2UgbmFtZS4KKyAgICAgKiAgQHBhcmFtIG9iamVjdCBkZWZpbml0aW9uT2JqZWN0IFRoZSBkZWZpbml0aW9uIG9iamVjdCBiZWluZyBsb2FkZWQgZnJvbSBhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSAvIGhlbHAgZGVmaW5pdGlvbiBmaWxlLgorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBkZWZpbmU6IGZ1bmN0aW9uKCBuYW1lLCBkZWZpbml0aW9uT2JqZWN0ICkgeworICAgICAgaWYgKCBIZWxwLmlzVmFsaWRIZWxwRm9ybWF0KCBkZWZpbml0aW9uT2JqZWN0ICkgKSB7CisgICAgICAgIGRlYnVnKCdoZWxwIGlzIGEgdmFsaWQgZm9ybWF0Jyk7CisKKyAgICAgICAgSGVscC5fQUNUSVZFX0hFTFBfTEFORyA9IG5hbWU7CisgICAgICAgIEhlbHAuX0xPQURFRF9IRUxQX0xBTkdTLnB1c2goIG5hbWUgKTsKKyAgICAgICAgSGVscC5fSEVMUFtuYW1lXSA9IGRlZmluaXRpb25PYmplY3Q7CisKKyAgICAgICAgaWYgKCAkKCIjZnVuY3Rpb24taGVscCIpLmxlbmd0aCApIHsKKyAgICAgICAgICBpZiAoICQoJyNmdW5jdGlvbi1oZWxwJykuaGFzQ2xhc3MoJ2Rpc2FibGVkJykgKSB7CisgICAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOworICAgICAgICAgIH0KKyAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLnVuYmluZCgnY2xpY2snKTsKKyAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLmNsaWNrKCBIZWxwLmV2dEhlbHBCdXR0b25DbGljayApOworCisgICAgICAgICAgLy8gZ2VuZXJhdGUgaGVscCBtZW51cworICAgICAgICAgIEhlbHAuZ2VuZXJhdGVIZWxwTWVudUZvciggbmFtZSApOworCisgICAgICAgICAgaWYgKCAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykubGVuZ3RoICYmCisgICAgICAgICAgICAgICB0eXBlb2YgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmF0dHIoJ2RhdGEtYXV0b2Rpc3BsYXknKSAhPT0gJ3VuZGVmaW5lZCcgJiYKKyAgICAgICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5hdHRyKCdkYXRhLWF1dG9kaXNwbGF5JykgPT09ICd0cnVlJyApIHsKKyAgICAgICAgICAgIEhlbHAuc2hvdygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAkKCcjZnVuY3Rpb24taGVscCcpLmxlbmd0aCApIHsKKyAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmdlbmVyYXRlSGVscE1lbnVGb3IKKyAgICAgKiAgR2VuZXJhdGVzIHRoZSBtYXJrdXAgZm9yIHRoZSBtYWluIGhlbHAgbWVudSBnaXZlbiBhIGNvbnRleHQgbmFtZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gc3RyaW5nICBuYW1lICBUaGUgY29udGV4dCBuYW1lLgorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBnZW5lcmF0ZUhlbHBNZW51Rm9yOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICAgIGlmICggIUhlbHAuX0hFTFBbbmFtZV0gKSB7CisgICAgICAgIGRlYnVnKCdIZWxwIGlzIG5vdCBkZWZpbmVkIGZvciAnICsgbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgdmFyIGhlbHBEYXRhID0gSGVscC5fSEVMUFtuYW1lXTsKKworICAgICAgLy8gY2xlYXIgdGhpcyBzaGl6IG91dAorICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1wYXJlbnQnKS5odG1sKCcnKTsKKyAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAtbGlzdCcpLmh0bWwoJycpOworICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1jb250ZW50JykuaHRtbCgnJyk7CisKKyAgICAgIC8vIGdvIGdvIGluZWZmaWNpZW50IGFsZ29yaXRobQorICAgICAgZm9yICggdmFyIGk9MDsgaSA8IGhlbHBEYXRhLmxlbmd0aDsgaSsrICkgeworICAgICAgICBpZiAoIHR5cGVvZiBoZWxwRGF0YVtpXSAhPSAnb2JqZWN0JyApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhciAkbmV3TGkgPSAkKCc8bGk+PGEgaHJlZj0iIyIgcmVsPSInICsgaSArICciPicgKworICAgICAgICAgICAgICAgICAgICAgICBoZWxwRGF0YVtpXS5tZW51TmFtZSArICc8L2E+PC9saT4nKTsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1wYXJlbnQnKS5hcHBlbmQoICRuZXdMaSApOworICAgICAgICBpZiAoIGkgPT09IDAgKSB7CisgICAgICAgICAgLy8gc2VsZWN0IG9uIGZpcnN0IHJ1bgorICAgICAgICAgICRuZXdMaS5jaGlsZHJlbignYScpLmFkZENsYXNzKCdzZWxlY3RlZCcpOworICAgICAgICB9CisgICAgICAgICRuZXdMaS5jaGlsZHJlbignYScpLmNsaWNrKCBIZWxwLmV2dFBhcmVudE1lbnVDbGljayApOworICAgICAgfQorCisgICAgICAvLyBnZW5lcmF0ZSBwYXJlbnQgc3VibWVudSBvbiBmaXJzdCBydW4KKyAgICAgIEhlbHAuZ2VuZXJhdGVTdWJNZW51KCBoZWxwRGF0YVswXSwgMCApOworICAgICAgJCgkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QgbGkgYScpLmdldCgwKSkuY2xpY2soKTsKKworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiAgSGVscC5nZW5lcmF0ZVN1Yk1lbnUKKyAgICAgKiAgR2VuZXJhdGVzIHRoZSBtYXJrdXAgZm9yIHRoZSBpbmxpbmUgaGVscCBzdWItbWVudSBnaXZlbiB0aGUgZGF0YQorICAgICAqICBvYmplY3QgZm9yIHRoZSBzdWJtZW51IGFuZCB0aGUgYXJyYXkgaW5kZXggdG8gc3RhcnQgYXQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIG9iamVjdCBzdWJEYXRhIFRoZSBkYXRhIGZvciB0aGUgc3ViLW1lbnUuCisgICAgICogIEBwYXJhbSBpbnRlZ2VyIGluZGV4ICBUaGUgaW5kZXggY2xpY2tlZCBvbiAocGFyZW50IG1lbnUgaW5kZXgpLgorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBnZW5lcmF0ZVN1Yk1lbnU6IGZ1bmN0aW9uKCBzdWJEYXRhLCBpbmRleCApIHsKKyAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAtbGlzdCcpLmh0bWwoJycpOworICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1jb250ZW50JykuaHRtbCgnJyk7CisgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgc3ViRGF0YS5jb250ZW50Lmxlbmd0aDsgaSsrICkgeworICAgICAgICBpZiAoIHR5cGVvZiBzdWJEYXRhLmNvbnRlbnRbaV0gIT0gJ29iamVjdCcgKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgJHN1YkxpID0gJCgnPGxpPjxhIGhyZWY9IiMiIHJlbD0iJyArIGluZGV4ICsgJzonICsgaSArICciPicgKworICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhLmNvbnRlbnRbaV0ubWVudU5hbWUgKyAnPC9hPjwvbGk+Jyk7CisKKworICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QnKS5hcHBlbmQoICRzdWJMaSApOworICAgICAgICAkc3ViTGkuY2hpbGRyZW4oJ2EnKS5jbGljayggSGVscC5ldnRTdWJNZW51Q2xpY2sgKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaGlkZTogZnVuY3Rpb24oKSB7CisgICAgICBpZiAoICQuYnJvd3Nlci5tc2llICkgeworICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5hbmltYXRlKHsKKyAgICAgICAgICBvcGFjaXR5OiAwCisgICAgICAgIH0sIDIwMCwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpCisgICAgICAgICAgICAuYW5pbWF0ZSh7IGhlaWdodDogJ2hpZGUnIH0sIDIwMCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBzaG93OiBmdW5jdGlvbigpIHsKKyAgICAgIGlmICggJC5icm93c2VyLm1zaWUgKSB7CisgICAgICAgIC8vIGJ5cGFzcyBlZmZlY3RzIGZvciBpbnRlcm5ldCBleHBsb3Jlciwgc2luY2UgaXQgZG9lcyB3ZWlyZCBjcmFwCisgICAgICAgIC8vIHRvIHRleHQgYW50aWFsaWFzaW5nIHdpdGggb3BhY2l0eSBhbmltYXRpb25zCisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5hbmltYXRlKHsKKyAgICAgICAgICBoZWlnaHQ6ICdzaG93JworICAgICAgICB9LCAyMDAsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKQorICAgICAgICAgICAgLmFuaW1hdGUoeyBvcGFjaXR5OiAxIH0sIDMwMCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiAgSGVscC5zaG93SGVscEZvcgorICAgICAqICBEaXNwbGF5cyB0aGUgYWN0dWFsIGhlbHAgY29udGVudCBnaXZlbiB0aGUgdHdvIG1lbnUgaW5kZXhlcywgd2hpY2ggYXJlCisgICAgICogIHJlbmRlcmVkIGluIHRoZSByZWw9IiIgYXR0cmlidXRlcyBvZiB0aGUgaGVscCBtZW51cworICAgICAqCisgICAgICogIEBwYXJhbSBpbnRlZ2VyIGluZGV4MSAgcGFyZW50IGluZGV4CisgICAgICogIEBwYXJhbSBpbnRlZ2VyIGluZGV4MiAgc3VibWVudSBpbmRleAorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBzaG93SGVscEZvcjogZnVuY3Rpb24oIGluZGV4MSwgaW5kZXgyICkgeworICAgICAgdmFyIGh0bWwgPQorICAgICAgICBIZWxwLl9IRUxQW0hlbHAuX0FDVElWRV9IRUxQX0xBTkddW2luZGV4MV0uY29udGVudFtpbmRleDJdLmRhdGE7CisgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWNvbnRlbnQnKS5odG1sKGh0bWwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiAgSGVscC5pc0xvYWRlZEZvcgorICAgICAqICBSZXR1cm5zIHRydWUgaWYgaGVscCBpcyBsb2FkZWQgZm9yIGEgc3BlY2lmaWMgbWFya3VwIGxhbmd1YWdlLAorICAgICAqICBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHN0cmluZyBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIG1hcmt1cCBsYW5ndWFnZS4KKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgaXNMb2FkZWRGb3I6IGZ1bmN0aW9uKCBuYW1lICkgeworICAgICAgZm9yICggdmFyIGk9MDsgaSA8IEhlbHAuX0xPQURFRF9IRUxQX0xBTkdTLmxlbmd0aDsgaSsrICkgeworICAgICAgICBpZiAoIG5hbWUgPT0gSGVscC5fTE9BREVEX0hFTFBfTEFOR1NbaV0gKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgaXNTaG93bjogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5pcygnOnZpc2libGUnKSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmlzVmFsaWRIZWxwRm9ybWF0CisgICAgICogIERvZXMgYSBxdWljayBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaGVscCBkZWZpbml0aW9uIGlzbid0IGluIGEKKyAgICAgKiAgY29tcGxldGVseSBtZXNzZWQtdXAgZm9ybWF0LgorICAgICAqCisgICAgICogIEBwYXJhbSBvYmplY3QgKEFycmF5KSBoZWxwQXJyICBUaGUgaGVscCBkZWZpbml0aW9uIGFycmF5LgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBpc1ZhbGlkSGVscEZvcm1hdDogZnVuY3Rpb24oIGhlbHBBcnIgKSB7CisgICAgICByZXR1cm4gKCB0eXBlb2YgaGVscEFyciA9PSAnb2JqZWN0JyAmJgorICAgICAgICAgICAgICAgaGVscEFyci5sZW5ndGggJiYKKyAgICAgICAgICAgICAgIHR5cGVvZiBoZWxwQXJyWzBdLm1lbnVOYW1lID09ICdzdHJpbmcnICYmCisgICAgICAgICAgICAgICB0eXBlb2YgaGVscEFyclswXS5jb250ZW50ID09ICdvYmplY3QnICYmCisgICAgICAgICAgICAgICBoZWxwQXJyWzBdLmNvbnRlbnQubGVuZ3RoICk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLnNldEFjdGl2ZUhlbHAKKyAgICAgKiAgU2V0cyB0aGUgYWN0aXZlIGhlbHAgZGVmaW5pdGlvbiB0byB0aGUgb25lIGRlZmluZWQgaW4gdGhlIGFyZ3VtZW50LAorICAgICAqICByZS1yZW5kZXJpbmcgdGhlIGhlbHAgbWVudSB0byBtYXRjaCB0aGUgbmV3IGRlZmluaXRpb24uCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHN0cmluZyAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGhlbHAgZGVmaW5pdGlvbi4KKyAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICovCisgICAgc2V0QWN0aXZlSGVscDogZnVuY3Rpb24oIG5hbWUgKSB7CisgICAgICBpZiAoICFIZWxwLmlzTG9hZGVkRm9yKCBuYW1lICkgKSB7CisgICAgICAgIGlmICggJCgnI2Z1bmN0aW9uLWhlbHAnKS5sZW5ndGggKSB7CisgICAgICAgICAgJCgnI2Z1bmN0aW9uLWhlbHAnKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIEhlbHAuaXNTaG93bigpICkgeworICAgICAgICAgIEhlbHAuaGlkZSgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBIZWxwLl9BQ1RJVkVfSEVMUF9MQU5HID0gbmFtZTsKKyAgICAgICAgaWYgKCAkKCIjZnVuY3Rpb24taGVscCIpLmxlbmd0aCApIHsKKyAgICAgICAgICBpZiAoICQoJyNmdW5jdGlvbi1oZWxwJykuaGFzQ2xhc3MoJ2Rpc2FibGVkJykgKSB7CisgICAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOworICAgICAgICAgIH0KKyAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLnVuYmluZCgnY2xpY2snKTsKKyAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLmNsaWNrKCBIZWxwLmV2dEhlbHBCdXR0b25DbGljayApOworICAgICAgICAgIEhlbHAuZ2VuZXJhdGVIZWxwTWVudUZvciggbmFtZSApOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmV2dEhlbHBCdXR0b25DbGljaworICAgICAqICBFdmVudCBoYW5kbGVyIGZvciBjbGlja2luZyB0aGUgaGVscCBidXR0b24gaW4gdGhlIGZ1bmN0aW9uIGJhci4KKyAgICAgKgorICAgICAqICBAcGFyYW0galF1ZXJ5LkV2ZW50IGUgIFRoZSBqUXVlcnkgZXZlbnQgb2JqZWN0LgorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBldnRIZWxwQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCBlICkgeworICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgaWYgKCBIZWxwLmlzU2hvd24oKSApIHsKKyAgICAgICAgLy8gdHVybiBvZmYgYXV0b2Rpc3BsYXkgaWYgaXQncyBvbgorICAgICAgICBpZiAoICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5sZW5ndGggJiYKKyAgICAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykuYXR0cignZGF0YS1hdXRvZGlzcGxheScpICE9PSAndW5kZWZpbmVkJyAmJgorICAgICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5hdHRyKCdkYXRhLWF1dG9kaXNwbGF5JykgPT09ICd0cnVlJyApIHsKKyAgICAgICAgICAkLnBvc3QoJy93aWtpL2hlbHA/X21ldGhvZD1kZWxldGUnKTsKKyAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykuYXR0cignZGF0YS1hdXRvZGlzcGxheScsICcnKTsKKyAgICAgICAgfQorICAgICAgICBIZWxwLmhpZGUoKTsgfQorICAgICAgZWxzZSB7IEhlbHAuc2hvdygpOyB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmV2dFBhcmVudE1lbnVDbGljaworICAgICAqICBFdmVudCBoYW5kbGVyIGZvciBjbGlja2luZyBvbiBhbiBpdGVtIGluIHRoZSBwYXJlbnQgbWVudS4gQXV0b21hdGljYWxseQorICAgICAqICByZW5kZXJzIHRoZSBzdWJtZW51IGZvciB0aGUgcGFyZW50IG1lbnUgYXMgd2VsbCBhcyB0aGUgZmlyc3QgcmVzdWx0IGZvcgorICAgICAqICB0aGUgYWN0dWFsIHBsYWluIHRleHQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGpRdWVyeS5FdmVudCBlICBUaGUgalF1ZXJ5IGV2ZW50IG9iamVjdC4KKyAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICovCisgICAgZXZ0UGFyZW50TWVudUNsaWNrOiBmdW5jdGlvbiggZSApIHsKKyAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgIC8vIHNob3J0IGNpcmN1aXQgaWYgd2UndmUgc2VsZWN0ZWQgdGhpcyBhbHJlYWR5CisgICAgICBpZiAoICQodGhpcykuaGFzQ2xhc3MoJ3NlbGVjdGVkJykgKSB7IHJldHVybjsgfQorCisgICAgICAvLyBwb3B1bGF0ZSBmcm9tIGhlbHAgZGF0YSBmb3IgdGhpcworICAgICAgdmFyIGhlbHBJbmRleCA9ICQodGhpcykuYXR0cigncmVsJyk7CisgICAgICB2YXIgc3ViRGF0YSA9IEhlbHAuX0hFTFBbSGVscC5fQUNUSVZFX0hFTFBfTEFOR11baGVscEluZGV4XTsKKworICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1wYXJlbnQgbGkgYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOworICAgICAgJCh0aGlzKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICAgIEhlbHAuZ2VuZXJhdGVTdWJNZW51KCBzdWJEYXRhLCBoZWxwSW5kZXggKTsKKyAgICAgICQoJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1saXN0IGxpIGEnKS5nZXQoMCkpLmNsaWNrKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmV2dFN1Yk1lbnVDbGljaworICAgICAqICBFdmVudCBoYW5kbGVyIGZvciBjbGlja2luZyBhbiBpdGVtIGluIGEgaGVscCBzdWJtZW51LiBSZW5kZXJzIHRoZQorICAgICAqICBhcHByb3ByaWF0ZSB0ZXh0IGZvciB0aGUgc3VibWVudSBsaW5rLgorICAgICAqCisgICAgICogIEBwYXJhbSBqUXVlcnkuRXZlbnQgZSAgVGhlIGpRdWVyeSBldmVudCBvYmplY3QuCisgICAgICogIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGV2dFN1Yk1lbnVDbGljazogZnVuY3Rpb24oIGUgKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICBpZiAoICQodGhpcykuaGFzQ2xhc3MoJ3NlbGVjdGVkJykgKSB7IHJldHVybjsgfQorCisgICAgICAvLyBzcGxpdCBpbmRleCByZWwgZGF0YQorICAgICAgdmFyIHJhd0luZGV4ID0gJCh0aGlzKS5hdHRyKCdyZWwnKS5zcGxpdCgnOicpOworICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1saXN0IGxpIGEnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICAgICQodGhpcykuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgICBIZWxwLnNob3dIZWxwRm9yKCByYXdJbmRleFswXSwgcmF3SW5kZXhbMV0gKTsKKyAgICB9CisgIH07CisKKyAgLy8gUHVibGljbHktYWNjZXNzaWJsZSBmdW5jdGlvbiB0byBIZWxwLmRlZmluZQorICAkLkdvbGx1bUVkaXRvci5kZWZpbmVIZWxwID0gSGVscC5kZWZpbmU7CisKKyAgLy8gRGlhbG9nIGV4aXN0cyBhcyBpdHMgb3duIHRoaW5nIG5vdworICAkLkdvbGx1bUVkaXRvci5EaWFsb2cgPSAkLkdvbGx1bURpYWxvZzsKKyAgJC5Hb2xsdW1FZGl0b3IucmVwbGFjZVNlbGVjdGlvbiA9IGZ1bmN0aW9uKCByZXBUZXh0ICkgeworICAgIEZ1bmN0aW9uQmFyLnJlcGxhY2VGaWVsZFNlbGVjdGlvbiggJCgnI2dvbGx1bS1lZGl0b3ItYm9keScpLCByZXBUZXh0ICk7CisgIH07CisKKyAgLy8gUGxhY2Vob2xkZXIgZXhpc3RzIGFzIGl0cyBvd24gdGhpbmcgbm93CisgICQuR29sbHVtRWRpdG9yLlBsYWNlaG9sZGVyID0gJC5Hb2xsdW1QbGFjZWhvbGRlcjsKKworfSkoalF1ZXJ5KTsKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL2VkaXRvci9nb2xsdW0uZWRpdG9yLmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvanMvZWRpdG9yL2dvbGx1bS5lZGl0b3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwOTM1NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL2VkaXRvci9nb2xsdW0uZWRpdG9yLmpzCkBAIC0wLDAgKzEsMTA5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogIGdvbGx1bS5lZGl0b3IuanMKKyAqICBBIGpRdWVyeSBwbHVnaW4gdGhhdCBjcmVhdGVzIHRoZSBHb2xsdW0gRWRpdG9yLgorICoKKyAqICBVc2FnZToKKyAqICAkLkdvbGx1bUVkaXRvcigpOyBvbiBET00gcmVhZHkuCisgKi8KKyhmdW5jdGlvbigkKSB7CisKKyAgLy8gRWRpdG9yIG9wdGlvbnMKKyAgdmFyIERlZmF1bHRPcHRpb25zID0geworICAgIE1hcmt1cFR5cGU6ICdtYXJrZG93bicsCisgICAgRWRpdG9yTW9kZTogJ2NvZGUnLAorICAgIE5ld0ZpbGU6IGZhbHNlLAorICAgIEhhc0Z1bmN0aW9uQmFyOiB0cnVlLAorICAgIERlYnVnOiBmYWxzZSwKKyAgICBOb0RlZmluaXRpb25zRm9yOiBbXQorICB9OworICB2YXIgQWN0aXZlT3B0aW9ucyA9IHt9OworCisgIC8qKgorICAgKiAgJC5Hb2xsdW1FZGl0b3IKKyAgICoKKyAgICogIFlvdSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBKdXN0IHJ1biB0aGlzIG9uIERPTSByZWFkeS4KKyAgICovCisgICQuR29sbHVtRWRpdG9yID0gZnVuY3Rpb24oIEluY29taW5nT3B0aW9ucyApIHsKKworICAgIEFjdGl2ZU9wdGlvbnMgPSAkLmV4dGVuZCggRGVmYXVsdE9wdGlvbnMgKTsKKworICAgIGRlYnVnKCdHb2xsdW1FZGl0b3IgbG9hZGluZycpOworCisgICAgaWYgKCBFZGl0b3JIYXMuYmFzZUVkaXRvck1hcmt1cCgpICkgeworCisgICAgICBpZiAoIEVkaXRvckhhcy50aXRsZURpc3BsYXllZCgpICkgeworICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci10aXRsZS1maWVsZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKKyAgICAgIH0KKworICAgICAgaWYgKCBFZGl0b3JIYXMuZWRpdFN1bW1hcnlNYXJrdXAoKSApIHsKKyAgICAgICAgJC5Hb2xsdW1FZGl0b3IuUGxhY2Vob2xkZXIuYWRkKCQoJyNnb2xsdW0tZWRpdG9yLWVkaXQtc3VtbWFyeSBpbnB1dCcpKTsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3IgZm9ybVtuYW1lPSJnb2xsdW0tZWRpdG9yIl0nKS5zdWJtaXQoZnVuY3Rpb24oIGUgKSB7CisgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICQuR29sbHVtRWRpdG9yLlBsYWNlaG9sZGVyLmNsZWFyQWxsKCk7CisgICAgICAgICAgZGVidWcoJ3N1Ym1pdHRpbmcnKTsKKyAgICAgICAgICAkKHRoaXMpLnVuYmluZCgnc3VibWl0Jyk7CisgICAgICAgICAgJCh0aGlzKS5zdWJtaXQoKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICggRWRpdG9ySGFzLmNvbGxhcHNpYmxlSW5wdXRzKCkgKSB7CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yIC5jb2xsYXBzZWQgYS5idXR0b24sICcgKworICAgICAgICAgICcjZ29sbHVtLWVkaXRvciAuZXhwYW5kZWQgYS5idXR0b24nKS5jbGljayhmdW5jdGlvbiggZSApIHsKKyAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50b2dnbGVDbGFzcygnZXhwYW5kZWQnKTsKKyAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICggRWRpdG9ySGFzLnByZXZpZXdCdXR0b24oKSApIHsKKyAgICAgICAgdmFyIGZvcm1BY3Rpb24gPQorICAgICAgICAkKCcjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1wcmV2aWV3JykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICAgLy8gbWFrZSBhIGR1bW15IGZvcm0sIHN1Ym1pdCB0byBuZXcgdGFyZ2V0IHdpbmRvdworICAgICAgICAgIC8vIGdldCBmb3JtIGZpZWxkcworICAgICAgICAgIHZhciBvbGRBY3Rpb24gPSAkKCcjZ29sbHVtLWVkaXRvciBmb3JtJykuYXR0cignYWN0aW9uJyk7CisgICAgICAgICAgdmFyICRmb3JtID0gJCgkKCcjZ29sbHVtLWVkaXRvciBmb3JtJykuZ2V0KDApKTsKKyAgICAgICAgICAkZm9ybS5hdHRyKCdhY3Rpb24nLCB0aGlzLmhyZWYgfHwgJy9wcmV2aWV3Jyk7CisgICAgICAgICAgJGZvcm0uYXR0cigndGFyZ2V0JywgJ19ibGFuaycpOworICAgICAgICAgICRmb3JtLnN1Ym1pdCgpOworCisKKyAgICAgICAgICAkZm9ybS5hdHRyKCdhY3Rpb24nLCBvbGRBY3Rpb24pOworICAgICAgICAgICRmb3JtLnJlbW92ZUF0dHIoJ3RhcmdldCcpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIGJhciBieSBsb2FkaW5nIHByb3BlciBkZWZpbml0aW9ucworICAgICAgaWYgKCBFZGl0b3JIYXMuZnVuY3Rpb25CYXIoKSApIHsKKworICAgICAgICB2YXIgaHRtbFNldE1hcmt1cExhbmcgPQorICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWJvZHknKS5hdHRyKCdkYXRhLW1hcmt1cC1sYW5nJyk7CisKKyAgICAgICAgaWYgKCBodG1sU2V0TWFya3VwTGFuZyApIHsKKyAgICAgICAgICBBY3RpdmVPcHRpb25zLk1hcmt1cFR5cGUgPSBodG1sU2V0TWFya3VwTGFuZzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvYWQgbGFuZ3VhZ2UgZGVmaW5pdGlvbgorICAgICAgICBMYW5ndWFnZURlZmluaXRpb24uc2V0QWN0aXZlTGFuZ3VhZ2UoIEFjdGl2ZU9wdGlvbnMuTWFya3VwVHlwZSApOworICAgICAgICBpZiAoIEVkaXRvckhhcy5mb3JtYXRTZWxlY3RvcigpICkgeworICAgICAgICAgIEZvcm1hdFNlbGVjdG9yLmluaXQoCisgICAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1mb3JtYXQtc2VsZWN0b3Igc2VsZWN0JykgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggRWRpdG9ySGFzLmhlbHAoKSApIHsKKyAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykuaGlkZSgpOworICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5yZW1vdmVDbGFzcygnamF3cycpOworICAgICAgICB9CisKKyAgICAgIH0KKyAgICAgIC8vIEVkaXRvckhhcy5mdW5jdGlvbkJhcgorICAgIH0KKyAgICAvLyBFZGl0b3JIYXMuYmFzZUVkaXRvck1hcmt1cAorICB9OworCisKKworICAvKioKKyAgICogICQuR29sbHVtRWRpdG9yLmRlZmluZUxhbmd1YWdlCisgICAqICBEZWZpbmVzIGEgc2V0IG9mIGxhbmd1YWdlIGFjdGlvbnMgdGhhdCBHb2xsdW0gY2FuIHVzZS4KKyAgICogIFVzZWQgYnkgdGhlIGRlZmluaXRpb25zIGluIGxhbmdzLyB0byByZWdpc3RlciBsYW5ndWFnZSBkZWZpbml0aW9ucy4KKyAgICovCisgICQuR29sbHVtRWRpdG9yLmRlZmluZUxhbmd1YWdlID0gZnVuY3Rpb24oIGxhbmd1YWdlX25hbWUsIGxhbmd1YWdlT2JqZWN0ICkgeworICAgIGlmICggdHlwZW9mIGxhbmd1YWdlT2JqZWN0ID09ICdvYmplY3QnICkgeworICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLmRlZmluZSggbGFuZ3VhZ2VfbmFtZSwgbGFuZ3VhZ2VPYmplY3QgKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVidWcoJ0dvbGx1bUVkaXRvci5kZWZpbmVMYW5ndWFnZTogZGVmaW5pdGlvbiBmb3IgJyArIGxhbmd1YWdlX25hbWUgKworICAgICAgICAgICAgJyBpcyBub3QgYW4gb2JqZWN0Jyk7CisgICAgfQorICB9OworCisKKyAgLyoqCisgICAqICBkZWJ1ZworICAgKiAgUHJpbnRzIGRlYnVnIGluZm9ybWF0aW9uIHRvIGNvbnNvbGUubG9nIGlmIGRlYnVnIG91dHB1dCBpcyBlbmFibGVkLgorICAgKgorICAgKiAgQHBhcmFtICBtaXhlZCAgV2hhdGV2ZXIgeW91IHdhbnQgdG8gZHVtcCB0byBjb25zb2xlLmxvZworICAgKiAgQHJldHVybiB2b2lkCisgICAqLworICB2YXIgZGVidWcgPSBmdW5jdGlvbihtKSB7CisgICAgaWYgKCBBY3RpdmVPcHRpb25zLkRlYnVnICYmCisgICAgICAgICB0eXBlb2YgY29uc29sZSAhPSAndW5kZWZpbmVkJyApIHsKKyAgICAgIGNvbnNvbGUubG9nKCBtICk7CisgICAgfQorICB9OworCisKKworICAvKioKKyAgICogIExhbmd1YWdlRGVmaW5pdGlvbgorICAgKiAgTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmaWxlIGhhbmRsZXIKKyAgICogIExvYWRzIGxhbmd1YWdlIGRlZmluaXRpb24gZmlsZXMgYXMgbmVjZXNzYXJ5LgorICAgKi8KKyAgdmFyIExhbmd1YWdlRGVmaW5pdGlvbiA9IHsKKworICAgIF9BQ1RJVkVfTEFORzogJycsCisgICAgX0xPQURFRF9MQU5HUzogW10sCisgICAgX0xBTkc6IHt9LAorCisgICAgLyoqCisgICAgICogIERlZmluZXMgYSBsYW5ndWFnZQorICAgICAqCisgICAgICogIEBwYXJhbSBuYW1lIHN0cmluZyAgVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlCisgICAgICogIEBwYXJhbSBuYW1lIG9iamVjdCAgVGhlIGRlZmluaXRpb24gb2JqZWN0CisgICAgICovCisgICAgZGVmaW5lOiBmdW5jdGlvbiggbmFtZSwgZGVmaW5pdGlvbk9iamVjdCApIHsKKyAgICAgIExhbmd1YWdlRGVmaW5pdGlvbi5fQUNUSVZFX0xBTkcgPSBuYW1lOworICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MT0FERURfTEFOR1MucHVzaCggbmFtZSApOworICAgICAgaWYgKCB0eXBlb2YgJC5Hb2xsdW1FZGl0b3IuV2lraUxhbmd1YWdlID09ICdvYmplY3QnICkgeworICAgICAgICB2YXIgZGVmaW5pdGlvbiA9IHt9OworICAgICAgICAkLmV4dGVuZChkZWZpbml0aW9uLCAkLkdvbGx1bUVkaXRvci5XaWtpTGFuZ3VhZ2UsIGRlZmluaXRpb25PYmplY3QpOworICAgICAgICBMYW5ndWFnZURlZmluaXRpb24uX0xBTkdbbmFtZV0gPSBkZWZpbml0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW25hbWVdID0gZGVmaW5pdGlvbk9iamVjdDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZ2V0QWN0aXZlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIExhbmd1YWdlRGVmaW5pdGlvbi5fQUNUSVZFX0xBTkc7CisgICAgfSwKKworICAgIHNldEFjdGl2ZUxhbmd1YWdlOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICAgIGlmICggIUxhbmd1YWdlRGVmaW5pdGlvbi5pc0xvYWRlZEZvcihuYW1lKSApIHsKKyAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9BQ1RJVkVfTEFORyA9IG51bGw7CisgICAgICAgIExhbmd1YWdlRGVmaW5pdGlvbi5sb2FkRm9yKCBuYW1lLCBmdW5jdGlvbih4LCB0KSB7CisgICAgICAgICAgaWYgKCB0ICE9ICdzdWNjZXNzJyApIHsKKyAgICAgICAgICAgIGRlYnVnKCdGYWlsZWQgdG8gbG9hZCBsYW5ndWFnZSBkZWZpbml0aW9uIGZvciAnICsgbmFtZSk7CisgICAgICAgICAgICAvLyB3ZWxsLCBmYWtlIGl0IGFuZCB0dXJuIGV2ZXJ5dGhpbmcgb2ZmIGZvciB0aGlzIG9uZQorICAgICAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLmRlZmluZSggbmFtZSwge30gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyB1cGRhdGUgZmVhdHVyZXMgdGhhdCByZWx5IG9uIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uCisgICAgICAgICAgaWYgKCBFZGl0b3JIYXMuZnVuY3Rpb25CYXIoKSApIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uQmFyLnJlZnJlc2goKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIExhbmd1YWdlRGVmaW5pdGlvbi5pc1ZhbGlkKCkgJiYgRWRpdG9ySGFzLmZvcm1hdFNlbGVjdG9yKCkgKSB7CisgICAgICAgICAgICBGb3JtYXRTZWxlY3Rvci51cGRhdGVTZWxlY3RlZCgpOworICAgICAgICAgIH0KKworICAgICAgICB9ICk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMYW5ndWFnZURlZmluaXRpb24uX0FDVElWRV9MQU5HID0gbmFtZTsKKyAgICAgICAgRnVuY3Rpb25CYXIucmVmcmVzaCgpOworICAgICAgfQorICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBnZXRzIGEgZGVmaW5pdGlvbiBvYmplY3QgZm9yIGEgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogIEBwYXJhbSAgc3RyaW5nICBhdHRyICAgIFRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICAgICAqICBAcGFyYW0gIHN0cmluZyAgc3BlY2lmaWVkX2xhbmcgIFRoZSBsYW5ndWFnZSB0byBwdWxsIGEgZGVmaW5pdGlvbiBmb3IuCisgICAgICogIEByZXR1cm4gb2JqZWN0IGlmIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBnZXREZWZpbml0aW9uRm9yOiBmdW5jdGlvbiggYXR0ciwgc3BlY2lmaWVkX2xhbmcgKSB7CisgICAgICBpZiAoICFzcGVjaWZpZWRfbGFuZyApIHsKKyAgICAgICAgc3BlY2lmaWVkX2xhbmcgPSBMYW5ndWFnZURlZmluaXRpb24uX0FDVElWRV9MQU5HOworICAgICAgfQorCisgICAgICBpZiAoIExhbmd1YWdlRGVmaW5pdGlvbi5pc0xvYWRlZEZvcihzcGVjaWZpZWRfbGFuZykgJiYKKyAgICAgICAgICAgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW3NwZWNpZmllZF9sYW5nXVthdHRyXSAmJgorICAgICAgICAgICB0eXBlb2YgTGFuZ3VhZ2VEZWZpbml0aW9uLl9MQU5HW3NwZWNpZmllZF9sYW5nXVthdHRyXSA9PSAnb2JqZWN0JyApIHsKKyAgICAgICAgcmV0dXJuIExhbmd1YWdlRGVmaW5pdGlvbi5fTEFOR1tzcGVjaWZpZWRfbGFuZ11bYXR0cl07CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBsb2FkRm9yCisgICAgICogIEFzeW5jaHJvbm91c2x5IGxvYWRzIGEgZGVmaW5pdGlvbiBmaWxlIGZvciB0aGUgY3VycmVudCBtYXJrdXAuCisgICAgICogIERlZmluaXRpb24gZmlsZXMgYXJlIG5lY2Vzc2FyeSB0byB1c2UgdGhlIGNvZGUgZWRpdG9yLgorICAgICAqCisgICAgICogIEBwYXJhbSAgc3RyaW5nICBtYXJrdXBfbmFtZSAgVGhlIG1hcmt1cCBuYW1lIHlvdSB3YW50IHRvIGxvYWQKKyAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICovCisgICAgbG9hZEZvcjogZnVuY3Rpb24oIG1hcmt1cF9uYW1lLCBvbl9jb21wbGV0ZSApIHsKKyAgICAgIC8vIEtlZXAgdXMgZnJvbSBoaXR0aW5nIDQwNHMgb24gb3VyIHNpdGUsIGNoZWNrIHRoZSBkZWZpbml0aW9uIGJsYWNrbGlzdAorICAgICAgaWYgKCBBY3RpdmVPcHRpb25zLk5vRGVmaW5pdGlvbnNGb3IubGVuZ3RoICkgeworICAgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgQWN0aXZlT3B0aW9ucy5Ob0RlZmluaXRpb25zRm9yLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgIGlmICggbWFya3VwX25hbWUgPT0gQWN0aXZlT3B0aW9ucy5Ob0RlZmluaXRpb25zRm9yW2ldICkgeworICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0aGlzLiBnZXQgb3V0LgorICAgICAgICAgICAgaWYgKCB0eXBlb2Ygb25fY29tcGxldGUgPT0gJ2Z1bmN0aW9uJyApIHsKKyAgICAgICAgICAgICAgb25fY29tcGxldGUoIG51bGwsICdlcnJvcicgKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBhdHRlbXB0IHRvIGxvYWQgdGhlIGRlZmluaXRpb24gZm9yIHRoaXMgbGFuZ3VhZ2UKKyAgICAgIHZhciBzY3JpcHRfdXJpID0gIHB1bnlfbW9kdWxlX3N0YXRpYyArICcvanMvZWRpdG9yL2xhbmdzLycgKyBtYXJrdXBfbmFtZSArICcuanMnOworICAgICAgJC5hamF4KHsKKyAgICAgICAgICAgICAgICB1cmw6IHNjcmlwdF91cmksCisgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAorICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiggeGhyLCB0ZXh0U3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygb25fY29tcGxldGUgPT0gJ2Z1bmN0aW9uJyApIHsKKyAgICAgICAgICAgICAgICAgICAgb25fY29tcGxldGUoIHhociwgdGV4dFN0YXR1cyApOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBpc0xvYWRlZEZvcgorICAgICAqICBDaGVja3MgdG8gc2VlIGlmIGEgZGVmaW5pdGlvbiBmaWxlIGhhcyBiZWVuIGxvYWRlZCBmb3IgdGhlCisgICAgICogIHNwZWNpZmllZCBtYXJrdXAgbGFuZ3VhZ2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBzdHJpbmcgIG1hcmt1cF9uYW1lICAgVGhlIG5hbWUgb2YgdGhlIG1hcmt1cC4KKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgaXNMb2FkZWRGb3I6IGZ1bmN0aW9uKCBtYXJrdXBfbmFtZSApIHsKKyAgICAgIGlmICggTGFuZ3VhZ2VEZWZpbml0aW9uLl9MT0FERURfTEFOR1MubGVuZ3RoID09PSAwICkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGZvciAoIHZhciBpPTA7IGkgPCBMYW5ndWFnZURlZmluaXRpb24uX0xPQURFRF9MQU5HUy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgaWYgKCBMYW5ndWFnZURlZmluaXRpb24uX0xPQURFRF9MQU5HU1tpXSA9PSBtYXJrdXBfbmFtZSApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICBpc1ZhbGlkOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAoIExhbmd1YWdlRGVmaW5pdGlvbi5fQUNUSVZFX0xBTkcgJiYKKyAgICAgICAgICAgICAgIHR5cGVvZiBMYW5ndWFnZURlZmluaXRpb24uX0xBTkdbTGFuZ3VhZ2VEZWZpbml0aW9uLl9BQ1RJVkVfTEFOR10gPT0KKyAgICAgICAgICAgICAgICdvYmplY3QnICk7CisgICAgfQorCisgIH07CisKKworICAvKioKKyAgICogIEVkaXRvckhhcworICAgKiAgVmFyaW91cyBjb25kaXRpb25hbHMgdG8gY2hlY2sgd2hhdCBmZWF0dXJlcyBvZiB0aGUgR29sbHVtIEVkaXRvciBhcmUKKyAgICogIGFjdGl2ZS9vcGVyYXRpb25hbC4KKyAgICovCisgIHZhciBFZGl0b3JIYXMgPSB7CisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMuYmFzZUVkaXRvck1hcmt1cAorICAgICAqICBUcnVlIGlmIHRoZSBiYXNpYyBlZGl0b3IgZm9ybSBpcyBpbiBwbGFjZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBiYXNlRWRpdG9yTWFya3VwOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAoICQoJyNnb2xsdW0tZWRpdG9yJykubGVuZ3RoICYmCisgICAgICAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1ib2R5JykubGVuZ3RoICk7CisgICAgfSwKKworCisgICAgLyoqCisgICAgICogIEVkaXRvckhhcy5jb2xsYXBzaWJsZUlucHV0cworICAgICAqICBUcnVlIGlmIHRoZSBlZGl0b3IgY29udGFpbnMgY29sbGFwc2libGUgaW5wdXRzIGZvciB0aGluZ3MgbGlrZSB0aGUKKyAgICAgKiAgc2lkZWJhciBvciBmb290ZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBjb2xsYXBzaWJsZUlucHV0czogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gJCgnI2dvbGx1bS1lZGl0b3IgLmNvbGxhcHNlZCwgI2dvbGx1bS1lZGl0b3IgLmV4cGFuZGVkJykubGVuZ3RoOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMuZm9ybWF0U2VsZWN0b3IKKyAgICAgKiAgVHJ1ZSBpZiB0aGUgZWRpdG9yIGhhcyBhIGZvcm1hdCBzZWxlY3RvciAoZm9yIHN3aXRjaGluZyBiZXR3ZWVuCisgICAgICogIGxhbmd1YWdlIHR5cGVzKSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIGZvcm1hdFNlbGVjdG9yOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAkKCcjZ29sbHVtLWVkaXRvci1mb3JtYXQtc2VsZWN0b3Igc2VsZWN0JykubGVuZ3RoOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMuZnVuY3Rpb25CYXIKKyAgICAgKiAgVHJ1ZSBpZiB0aGUgRnVuY3Rpb24gQmFyIG1hcmt1cCBleGlzdHMuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgZnVuY3Rpb25CYXI6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICggQWN0aXZlT3B0aW9ucy5IYXNGdW5jdGlvbkJhciAmJgorICAgICAgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyJykubGVuZ3RoICk7CisgICAgfSwKKworCisgICAgLyoqCisgICAgICogIEVkaXRvckhhcy5mZjRFbnZpcm9ubWVudAorICAgICAqICBUcnVlIGlmIGluIGEgRmlyZWZveCA0LjAgQmV0YSBlbnZpcm9ubWVudC4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBmZjRFbnZpcm9ubWVudDogZnVuY3Rpb24oKSB7CisgICAgICB2YXIgdWEgPSBuZXcgUmVnRXhwKC9GaXJlZm94XC80LjBiLyk7CisgICAgICByZXR1cm4gKCB1YS50ZXN0KCBuYXZpZ2F0b3IudXNlckFnZW50ICkgKTsKKyAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiAgRWRpdG9ySGFzLmVkaXRTdW1tYXJ5TWFya3VwCisgICAgICogIFRydWUgaWYgdGhlIGVkaXRvciBoYXMgYSBzdW1tYXJ5IGZpZWxkIChHb2xsdW0ncyBjb21taXQgbWVzc2FnZSksCisgICAgICogIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBlZGl0U3VtbWFyeU1hcmt1cDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCAkKCdpbnB1dCNnb2xsdW0tZWRpdG9yLW1lc3NhZ2UtZmllbGQnKS5sZW5ndGggPiAwICk7CisgICAgfSwKKworCisgICAgLyoqCisgICAgICogIEVkaXRvckhhcy5oZWxwCisgICAgICogIFRydWUgaWYgdGhlIGVkaXRvciBjb250YWlucyB0aGUgaW5saW5lIGhlbHAgc2VjdG9yLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgaGVscDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCAkKCcjZ29sbHVtLWVkaXRvciAjZ29sbHVtLWVkaXRvci1oZWxwJykubGVuZ3RoICYmCisgICAgICAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvciAjZnVuY3Rpb24taGVscCcpLmxlbmd0aCApOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqICBFZGl0b3JIYXMucHJldmlld0J1dHRvbgorICAgICAqICBUcnVlIGlmIHRoZSBlZGl0b3IgaGFzIGEgcHJldmlldyBidXR0b24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwcmV2aWV3QnV0dG9uOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAoICQoJyNnb2xsdW0tZWRpdG9yICNnb2xsdW0tZWRpdG9yLXByZXZpZXcnKS5sZW5ndGggKTsKKyAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiAgRWRpdG9ySGFzLnRpdGxlRGlzcGxheWVkCisgICAgICogIFRydWUgaWYgdGhlIGVkaXRvciBpcyBkaXNwbGF5aW5nIGEgdGl0bGUgZmllbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICB0aXRsZURpc3BsYXllZDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gKCBBY3RpdmVPcHRpb25zLk5ld0ZpbGUgKTsKKyAgICB9CisKKyAgfTsKKworCisgIC8qKgorICAgKiAgRnVuY3Rpb25CYXIKKyAgICoKKyAgICogIFRoaW5ncyB0aGUgZnVuY3Rpb24gYmFyIGRvZXMuCisgICAqLworICAgdmFyIEZ1bmN0aW9uQmFyID0geworCisgICAgICBpc0FjdGl2ZTogZmFsc2UsCisKKworICAgICAgLyoqCisgICAgICAgKiAgRnVuY3Rpb25CYXIuYWN0aXZhdGUKKyAgICAgICAqICBBY3RpdmF0ZXMgdGhlIGZ1bmN0aW9uIGJhciwgYXR0YWNoaW5nIGFsbCBjbGljayBldmVudHMKKyAgICAgICAqICBhbmQgZGlzcGxheWluZyB0aGUgYmFyLgorICAgICAgICoKKyAgICAgICAqLworICAgICAgYWN0aXZhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICBkZWJ1ZygnQWN0aXZhdGluZyBmdW5jdGlvbiBiYXInKTsKKworICAgICAgICAvLyBjaGVjayB0aGVzZSBvdXQKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyIGEuZnVuY3Rpb24tYnV0dG9uJykuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICAgICBpZiAoIExhbmd1YWdlRGVmaW5pdGlvbi5nZXREZWZpbml0aW9uRm9yKCAkKHRoaXMpLmF0dHIoJ2lkJykgKSApIHsKKyAgICAgICAgICAgICQodGhpcykuY2xpY2soIEZ1bmN0aW9uQmFyLmV2dEZ1bmN0aW9uQnV0dG9uQ2xpY2sgKTsKKyAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCAkKHRoaXMpLmF0dHIoJ2lkJykgIT0gJ2Z1bmN0aW9uLWhlbHAnICkgeworICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIHNob3cgYmFyIGFzIGFjdGl2ZQorICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXInKS5hZGRDbGFzcyggJ2FjdGl2ZScgKTsKKyAgICAgICAgRnVuY3Rpb25CYXIuaXNBY3RpdmUgPSB0cnVlOworICAgICAgfSwKKworCisgICAgICBkZWFjdGl2YXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyIGEuZnVuY3Rpb24tYnV0dG9uJykudW5iaW5kKCdjbGljaycpOworICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXInKS5yZW1vdmVDbGFzcyggJ2FjdGl2ZScgKTsKKyAgICAgICAgRnVuY3Rpb25CYXIuaXNBY3RpdmUgPSBmYWxzZTsKKyAgICAgIH0sCisKKworICAgICAgLyoqCisgICAgICAgKiAgRnVuY3Rpb25CYXIuZXZ0RnVuY3Rpb25CdXR0b25DbGljaworICAgICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIHRoZSBmdW5jdGlvbiBidXR0b25zLiBUcmFwcyB0aGUgY2xpY2sgYW5kCisgICAgICAgKiAgZXhlY3V0ZXMgdGhlIHByb3BlciBsYW5ndWFnZSBhY3Rpb24uCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBqUXVlcnkuRXZlbnQgalF1ZXJ5IGV2ZW50IG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXZ0RnVuY3Rpb25CdXR0b25DbGljazogZnVuY3Rpb24oZSkgeworICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIHZhciBkZWYgPSBMYW5ndWFnZURlZmluaXRpb24uZ2V0RGVmaW5pdGlvbkZvciggJCh0aGlzKS5hdHRyKCdpZCcpICk7CisgICAgICAgIGlmICggdHlwZW9mIGRlZiA9PSAnb2JqZWN0JyApIHsKKyAgICAgICAgICBGdW5jdGlvbkJhci5leGVjdXRlQWN0aW9uKCBkZWYgKTsKKyAgICAgICAgfQorICAgICAgfSwKKworCisgICAgICAvKioKKyAgICAgICAqICBGdW5jdGlvbkJhci5leGVjdXRlQWN0aW9uCisgICAgICAgKiAgRXhlY3V0ZXMgYSBsYW5ndWFnZS1zcGVjaWZpYyBkZWZpbmVkIGFjdGlvbiBmb3IgYSBmdW5jdGlvbiBidXR0b24uCisgICAgICAgKgorICAgICAgICovCisgICAgICBleGVjdXRlQWN0aW9uOiBmdW5jdGlvbiggZGVmaW5pdGlvbk9iamVjdCApIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3RlZCB0ZXh0IGZyb20gdGhlIHRleHRhcmVhCisgICAgICAgIHZhciB0eHQgPSAkKCcjZ29sbHVtLWVkaXRvci1ib2R5JykudmFsKCk7CisgICAgICAgIC8vIGhtbSwgSSdtIG5vdCBzdXJlIHRoaXMgd2lsbCB3b3JrIGluIGEgdGV4dGFyZWEKKyAgICAgICAgdmFyIHNlbFBvcyA9IEZ1bmN0aW9uQmFyCisgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkU2VsZWN0aW9uUG9zaXRpb24oICQoJyNnb2xsdW0tZWRpdG9yLWJvZHknKSApOworICAgICAgICB2YXIgc2VsVGV4dCA9IEZ1bmN0aW9uQmFyLmdldEZpZWxkU2VsZWN0aW9uKCAkKCcjZ29sbHVtLWVkaXRvci1ib2R5JykgKTsKKyAgICAgICAgdmFyIHJlcFRleHQgPSBzZWxUZXh0OworICAgICAgICB2YXIgcmVzZWxlY3QgPSB0cnVlOworICAgICAgICB2YXIgY3Vyc29yID0gbnVsbDsKKworICAgICAgICAvLyBleGVjdXRlIGEgcmVwbGFjZW1lbnQgZnVuY3Rpb24gaWYgb25lIGV4aXN0cworICAgICAgICBpZiAoIGRlZmluaXRpb25PYmplY3QuZXhlYyAmJgorICAgICAgICAgICAgIHR5cGVvZiBkZWZpbml0aW9uT2JqZWN0LmV4ZWMgPT0gJ2Z1bmN0aW9uJyApIHsKKyAgICAgICAgICBkZWZpbml0aW9uT2JqZWN0LmV4ZWMoIHR4dCwgc2VsVGV4dCwgJCgnI2dvbGx1bS1lZGl0b3ItYm9keScpICk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhlY3V0ZSBhIHNlYXJjaC9yZXBsYWNlIGlmIHRoZXkgZXhpc3QKKyAgICAgICAgdmFyIHNlYXJjaEV4cCA9IC8oW15cbl0rKS9naTsKKyAgICAgICAgaWYgKCBkZWZpbml0aW9uT2JqZWN0LnNlYXJjaCAmJgorICAgICAgICAgICAgIHR5cGVvZiBkZWZpbml0aW9uT2JqZWN0LnNlYXJjaCA9PSAnb2JqZWN0JyApIHsKKyAgICAgICAgICBkZWJ1ZygnUmVwbGFjaW5nIHNlYXJjaCBSZWdleCcpOworICAgICAgICAgIHNlYXJjaEV4cCA9IG51bGw7CisgICAgICAgICAgc2VhcmNoRXhwID0gbmV3IFJlZ0V4cCAoIGRlZmluaXRpb25PYmplY3Quc2VhcmNoICk7CisgICAgICAgICAgZGVidWcoIHNlYXJjaEV4cCApOworICAgICAgICB9CisgICAgICAgIGRlYnVnKCdyZXBUZXh0IGlzICcgKyAnIicgKyByZXBUZXh0ICsgJyInKTsKKyAgICAgICAgLy8gcmVwbGFjZSB0ZXh0CisgICAgICAgIGlmICggZGVmaW5pdGlvbk9iamVjdC5yZXBsYWNlICYmCisgICAgICAgICAgICAgdHlwZW9mIGRlZmluaXRpb25PYmplY3QucmVwbGFjZSA9PSAnc3RyaW5nJyApIHsKKyAgICAgICAgICBkZWJ1ZygnUnVubmluZyByZXBsYWNlbWVudCAtIHVzaW5nICcgKyBkZWZpbml0aW9uT2JqZWN0LnJlcGxhY2UpOworICAgICAgICAgIHZhciBydCA9IGRlZmluaXRpb25PYmplY3QucmVwbGFjZTsKKyAgICAgICAgICByZXBUZXh0ID0gcmVwVGV4dC5yZXBsYWNlKCBzZWFyY2hFeHAsIHJ0ICk7CisgICAgICAgICAgLy8gcmVtb3ZlIGJhY2tyZWZlcmVuY2VzCisgICAgICAgICAgcmVwVGV4dCA9IHJlcFRleHQucmVwbGFjZSggL1wkW1xkXS9nLCAnJyApOworCisgICAgICAgICAgaWYgKCByZXBUZXh0ID09PSAnJyApIHsKKyAgICAgICAgICAgIGRlYnVnKCdTZWFyY2ggc3RyaW5nIGlzIGVtcHR5Jyk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgcG9zaXRpb24gb2YgJDEgLSB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgcGxhY2UgdGhlIGN1cnNvcgorICAgICAgICAgICAgY3Vyc29yID0gcnQuaW5kZXhPZignJDEnKTsKKworICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbiBlbXB0eSBzdHJpbmcsIHNvIGp1c3QgcmVtb3ZlIGJhY2tyZWZlcmVuY2VzCisgICAgICAgICAgICByZXBUZXh0ID0gcnQucmVwbGFjZSggL1wkW1xkXS9nLCAnJyApOworCisgICAgICAgICAgICAvLyBpZiB0aGUgcG9zaXRpb24gb2YgJDEgZG9lc24ndCBleGlzdCwgc3RpY2sgdGhlIGN1cnNvciBpbgorICAgICAgICAgICAgLy8gdGhlIG1pZGRsZQorICAgICAgICAgICAgaWYgKCBjdXJzb3IgPT0gLTEgKSB7CisgICAgICAgICAgICAgIGN1cnNvciA9IE1hdGguZmxvb3IoIHJ0Lmxlbmd0aCAvIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBlbmQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICggZGVmaW5pdGlvbk9iamVjdC5hcHBlbmQgJiYKKyAgICAgICAgICAgICB0eXBlb2YgZGVmaW5pdGlvbk9iamVjdC5hcHBlbmQgPT0gJ3N0cmluZycgKSB7CisgICAgICAgICAgaWYgKCByZXBUZXh0ID09IHNlbFRleHQgKSB7CisgICAgICAgICAgICByZXNlbGVjdCA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICByZXBUZXh0ICs9IGRlZmluaXRpb25PYmplY3QuYXBwZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCByZXBUZXh0ICkgeworICAgICAgICAgIEZ1bmN0aW9uQmFyLnJlcGxhY2VGaWVsZFNlbGVjdGlvbiggJCgnI2dvbGx1bS1lZGl0b3ItYm9keScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwVGV4dCwgcmVzZWxlY3QsIGN1cnNvciApOworICAgICAgICB9CisKKyAgICAgIH0sCisKKworICAgICAgLyoqCisgICAgICAgKiAgZ2V0RmllbGRTZWxlY3Rpb25Qb3NpdGlvbgorICAgICAgICogIFJldHJpZXZlcyB0aGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgdGV4dGFyZWEuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gb2JqZWN0IHRoZSAuc3RhcnQgYW5kIC5lbmQgb2Zmc2V0cyBpbiB0aGUgc3RyaW5nCisgICAgICAgKi8KKyAgICAgIGdldEZpZWxkU2VsZWN0aW9uUG9zaXRpb246IGZ1bmN0aW9uKCAkZmllbGQgKSB7CisgICAgICAgIGlmICgkZmllbGQubGVuZ3RoKSB7CisgICAgICAgICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMDsKKyAgICAgICAgICB2YXIgZWwgPSAkZmllbGQuZ2V0KDApOworCisgICAgICAgICAgaWYgKHR5cGVvZiBlbC5zZWxlY3Rpb25TdGFydCA9PSAibnVtYmVyIiAmJgorICAgICAgICAgICAgICB0eXBlb2YgZWwuc2VsZWN0aW9uRW5kID09ICJudW1iZXIiKSB7CisgICAgICAgICAgICBzdGFydCA9IGVsLnNlbGVjdGlvblN0YXJ0OworICAgICAgICAgICAgZW5kID0gZWwuc2VsZWN0aW9uRW5kOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgICAgIHZhciBzdG9yZWRfcmFuZ2UgPSByYW5nZS5kdXBsaWNhdGUoKTsKKyAgICAgICAgICAgIHN0b3JlZF9yYW5nZS5tb3ZlVG9FbGVtZW50VGV4dCggZWwgKTsKKyAgICAgICAgICAgIHN0b3JlZF9yYW5nZS5zZXRFbmRQb2ludCggJ0VuZFRvRW5kJywgcmFuZ2UgKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gc3RvcmVkX3JhbmdlLnRleHQubGVuZ3RoIC0gcmFuZ2UudGV4dC5sZW5ndGg7CisgICAgICAgICAgICBlbmQgPSBzdGFydCArIHJhbmdlLnRleHQubGVuZ3RoOworCisgICAgICAgICAgICAvLyBzbywgdWgsIHdlJ3JlIGNsb3NlLCBidXQgd2UgbmVlZCB0byBzZWFyY2ggZm9yIGxpbmUgYnJlYWtzIGFuZAorICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBzdGFydC9lbmQgcG9pbnRzIGFjY29yZGluZ2x5IHNpbmNlIElFIGNvdW50cyB0aGVtIGFzCisgICAgICAgICAgICAvLyAyIGNoYXJhY3RlcnMgaW4gVGV4dFJhbmdlLgorICAgICAgICAgICAgdmFyIHMgPSBzdGFydDsKKyAgICAgICAgICAgIHZhciBsYiA9IDA7CisgICAgICAgICAgICB2YXIgaTsKKyAgICAgICAgICAgIGRlYnVnKCdJRTogc3RhcnQgcG9zaXRpb24gaXMgY3VycmVudGx5ICcgKyBzKTsKKyAgICAgICAgICAgIGZvciAoIGk9MDsgaSA8IHM7IGkrKyApIHsKKyAgICAgICAgICAgICAgaWYgKCBlbC52YWx1ZS5jaGFyQXQoaSkubWF0Y2goL1xyLykgKSB7CisgICAgICAgICAgICAgICAgKytsYjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGxiICkgeworICAgICAgICAgICAgICBkZWJ1ZygnSUUgc3RhcnQ6IGNvbXBlbnNhdGluZyBmb3IgJyArIGxiICsgJyBsaW5lIGJyZWFrcycpOworICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC0gbGI7CisgICAgICAgICAgICAgIGxiID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGUgPSBlbmQ7CisgICAgICAgICAgICBmb3IgKCBpPTA7IGkgPCBlOyBpKysgKSB7CisgICAgICAgICAgICAgIGlmICggZWwudmFsdWUuY2hhckF0KGkpLm1hdGNoKC9cci8pICkgeworICAgICAgICAgICAgICAgICsrbGI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBsYiApIHsKKyAgICAgICAgICAgICAgZGVidWcoJ0lFIGVuZDogY29tcGVuc2F0aW5nIGZvciAnICsgbGIgKyAnIGxpbmUgYnJlYWtzJyk7CisgICAgICAgICAgICAgIGVuZCA9IGVuZCAtIGxiOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKKyAgICAgICAgICAgICAgZW5kOiBlbmQKKyAgICAgICAgICB9OworICAgICAgICB9IC8vIGVuZCBpZiAoJGZpZWxkLmxlbmd0aCkKKyAgICAgIH0sCisKKworICAgICAgLyoqCisgICAgICAgKiAgZ2V0RmllbGRTZWxlY3Rpb24KKyAgICAgICAqICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3Vic3RyaW5nIG9mIHRoZSB0ZXh0YXJlYS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBqUXVlcnkgIEEgalF1ZXJ5IG9iamVjdCBmb3IgdGhlIHRleHRhcmVhLgorICAgICAgICogIEByZXR1cm4gc3RyaW5nICBTZWxlY3RlZCBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGdldEZpZWxkU2VsZWN0aW9uOiBmdW5jdGlvbiggJGZpZWxkICkgeworICAgICAgICB2YXIgc2VsU3RyID0gJyc7CisgICAgICAgIHZhciBzZWxQb3M7CisKKyAgICAgICAgaWYgKCAkZmllbGQubGVuZ3RoICkgeworICAgICAgICAgIHNlbFBvcyA9IEZ1bmN0aW9uQmFyLmdldEZpZWxkU2VsZWN0aW9uUG9zaXRpb24oICRmaWVsZCApOworICAgICAgICAgIHNlbFN0ciA9ICRmaWVsZC52YWwoKS5zdWJzdHJpbmcoIHNlbFBvcy5zdGFydCwgc2VsUG9zLmVuZCApOworICAgICAgICAgIGRlYnVnKCdTZWxlY3RlZDogJyArIHNlbFN0ciArICcgKCcgKyBzZWxQb3Muc3RhcnQgKyAnLCAnICsKKyAgICAgICAgICAgICAgICBzZWxQb3MuZW5kICsgJyknKTsKKyAgICAgICAgICByZXR1cm4gc2VsU3RyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0sCisKKworICAgICAgaXNTaG93bjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAoJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyJykuaXMoJzp2aXNpYmxlJykpOworICAgICAgfSwKKworICAgICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggRWRpdG9ySGFzLmZ1bmN0aW9uQmFyKCkgKSB7CisgICAgICAgICAgZGVidWcoJ1JlZnJlc2hpbmcgZnVuY3Rpb24gYmFyJyk7CisgICAgICAgICAgaWYgKCBMYW5ndWFnZURlZmluaXRpb24uaXNWYWxpZCgpICkgeworICAgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItZnVuY3Rpb24tYmFyIGEuZnVuY3Rpb24tYnV0dG9uJykudW5iaW5kKCdjbGljaycpOworICAgICAgICAgICAgRnVuY3Rpb25CYXIuYWN0aXZhdGUoKTsKKyAgICAgICAgICAgIGlmICggSGVscCApIHsKKyAgICAgICAgICAgICAgSGVscC5zZXRBY3RpdmVIZWxwKCBMYW5ndWFnZURlZmluaXRpb24uZ2V0QWN0aXZlTGFuZ3VhZ2UoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZygnTGFuZ3VhZ2UgZGVmaW5pdGlvbiBpcyBpbnZhbGlkLicpOworICAgICAgICAgICAgaWYgKCBGdW5jdGlvbkJhci5pc1Nob3duKCkgKSB7CisgICAgICAgICAgICAgIC8vIGRlYWN0aXZhdGUgdGhlIGZ1bmN0aW9uIGJhcjsgaXQncyBub3QgZ29ubmEgd29yayBub3cKKyAgICAgICAgICAgICAgRnVuY3Rpb25CYXIuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBIZWxwLmlzU2hvd24oKSApIHsKKyAgICAgICAgICAgICAgSGVscC5oaWRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorCisKKyAgICAgIC8qKgorICAgICAgICogIHJlcGxhY2VGaWVsZFNlbGVjdGlvbgorICAgICAgICogIFJlcGxhY2VzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3Vic3RyaW5nIG9mIHRoZSB0ZXh0YXJlYSB3aXRoCisgICAgICAgKiAgYSBuZXcgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGpRdWVyeSAgQSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgdGV4dGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBzdHJpbmcgIFRoZSBzdHJpbmcgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aC4KKyAgICAgICAqICBAcGFyYW0gIGJvb2xlYW4gUmVzZWxlY3QgdGhlIG5ldyB0ZXh0IHJhbmdlLgorICAgICAgICovCisgICAgICByZXBsYWNlRmllbGRTZWxlY3Rpb246IGZ1bmN0aW9uKCAkZmllbGQsIHJlcGxhY2VUZXh0LCByZXNlbGVjdCwgY3Vyc29yT2Zmc2V0ICkgeworICAgICAgICB2YXIgc2VsUG9zID0gRnVuY3Rpb25CYXIuZ2V0RmllbGRTZWxlY3Rpb25Qb3NpdGlvbiggJGZpZWxkICk7CisgICAgICAgIHZhciBmdWxsU3RyID0gJGZpZWxkLnZhbCgpOworICAgICAgICB2YXIgc2VsZWN0TmV3ID0gdHJ1ZTsKKyAgICAgICAgaWYgKCByZXNlbGVjdCA9PT0gZmFsc2UpIHsKKyAgICAgICAgICBzZWxlY3ROZXcgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzY3JvbGxUb3AgPSBudWxsOworICAgICAgICBpZiAoICRmaWVsZFswXS5zY3JvbGxUb3AgKSB7CisgICAgICAgICAgc2Nyb2xsVG9wID0gJGZpZWxkWzBdLnNjcm9sbFRvcDsKKyAgICAgICAgfQorCisgICAgICAgICRmaWVsZC52YWwoIGZ1bGxTdHIuc3Vic3RyaW5nKDAsIHNlbFBvcy5zdGFydCkgKyByZXBsYWNlVGV4dCArCisgICAgICAgICAgICAgICAgICAgIGZ1bGxTdHIuc3Vic3RyaW5nKHNlbFBvcy5lbmQpICk7CisgICAgICAgICRmaWVsZFswXS5mb2N1cygpOworCisgICAgICAgIGlmICggc2VsZWN0TmV3ICkgeworICAgICAgICAgIGlmICggJGZpZWxkWzBdLnNldFNlbGVjdGlvblJhbmdlICkgeworICAgICAgICAgICAgaWYgKCBjdXJzb3JPZmZzZXQgKSB7CisgICAgICAgICAgICAgICRmaWVsZFswXS5zZXRTZWxlY3Rpb25SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUG9zLnN0YXJ0ICsgY3Vyc29yT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxQb3Muc3RhcnQgKyBjdXJzb3JPZmZzZXQKKyAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAkZmllbGRbMF0uc2V0U2VsZWN0aW9uUmFuZ2UoIHNlbFBvcy5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxQb3Muc3RhcnQgKyByZXBsYWNlVGV4dC5sZW5ndGggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKCAkZmllbGRbMF0uY3JlYXRlVGV4dFJhbmdlICkgeworICAgICAgICAgICAgdmFyIHJhbmdlID0gJGZpZWxkWzBdLmNyZWF0ZVRleHRSYW5nZSgpOworICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoIHRydWUgKTsKKyAgICAgICAgICAgIGlmICggY3Vyc29yT2Zmc2V0ICkgeworICAgICAgICAgICAgICByYW5nZS5tb3ZlRW5kKCBzZWxQb3Muc3RhcnQgKyBjdXJzb3JPZmZzZXQgKTsKKyAgICAgICAgICAgICAgcmFuZ2UubW92ZVN0YXJ0KCBzZWxQb3Muc3RhcnQgKyBjdXJzb3JPZmZzZXQgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJhbmdlLm1vdmVFbmQoICdjaGFyYWN0ZXInLCBzZWxQb3Muc3RhcnQgKyByZXBsYWNlVGV4dC5sZW5ndGggKTsKKyAgICAgICAgICAgICAgcmFuZ2UubW92ZVN0YXJ0KCAnY2hhcmFjdGVyJywgc2VsUG9zLnN0YXJ0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYW5nZS5zZWxlY3QoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHNjcm9sbFRvcCApIHsKKyAgICAgICAgICAvLyB0aGlzIGp1bXBzIHNvbWV0aW1lcyBpbiBGRgorICAgICAgICAgICRmaWVsZFswXS5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CisgICAgICAgIH0KKyAgICAgIH0KKyAgIH07CisKKworCisgICAvKioKKyAgICAqICBGb3JtYXRTZWxlY3RvcgorICAgICoKKyAgICAqICBGdW5jdGlvbnMgcmVsYXRpbmcgdG8gdGhlIGZvcm1hdCBzZWxlY3RvciAoaWYgaXQgZXhpc3RzKQorICAgICovCisgICB2YXIgRm9ybWF0U2VsZWN0b3IgPSB7CisKKyAgICAgJF9TRUxFQ1RPUjogbnVsbCwKKworICAgICAvKioKKyAgICAgICogIEZvcm1hdFNlbGVjdG9yLmV2dENoYW5nZUZvcm1hdAorICAgICAgKiAgRXZlbnQgaGFuZGxlciBmb3Igd2hlbiBhIGZvcm1hdCBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBmb3JtYXQKKyAgICAgICogIHNlbGVjdG9yLiBXaWxsIGF1dG9tYXRpY2FsbHkgbG9hZCBhIG5ldyBsYW5ndWFnZSBkZWZpbml0aW9uCisgICAgICAqICB2aWEgSlMgaWYgbmVjZXNzYXJ5LgorICAgICAgKgorICAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICAqLworICAgICBldnRDaGFuZ2VGb3JtYXQ6IGZ1bmN0aW9uKCBlICkgeworICAgICAgIHZhciBuZXdNYXJrdXAgPSAkKHRoaXMpLnZhbCgpOworICAgICAgIExhbmd1YWdlRGVmaW5pdGlvbi5zZXRBY3RpdmVMYW5ndWFnZSggbmV3TWFya3VwICk7CisgICAgIH0sCisKKworICAgICAvKioKKyAgICAgICogIEZvcm1hdFNlbGVjdG9yLmluaXQKKyAgICAgICogIEluaXRpYWxpemVzIHRoZSBmb3JtYXQgc2VsZWN0b3IuCisgICAgICAqCisgICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgICovCisgICAgIGluaXQ6IGZ1bmN0aW9uKCAkc2VsICkgeworICAgICAgIGRlYnVnKCdJbml0aWFsaXppbmcgZm9ybWF0IHNlbGVjdG9yJyk7CisKKyAgICAgICAvLyB1bmJpbmQgZXZlbnRzIGlmIGluaXQgaXMgYmVpbmcgY2FsbGVkIHR3aWNlIGZvciBzb21lIHJlYXNvbgorICAgICAgIGlmICggRm9ybWF0U2VsZWN0b3IuJF9TRUxFQ1RPUiAmJgorICAgICAgICAgICAgdHlwZW9mIEZvcm1hdFNlbGVjdG9yLiRfU0VMRUNUT1IgPT0gJ29iamVjdCcgKSB7CisgICAgICAgICBGb3JtYXRTZWxlY3Rvci4kX1NFTEVDVE9SLnVuYmluZCggJ2NoYW5nZScgKTsKKyAgICAgICB9CisKKyAgICAgICBGb3JtYXRTZWxlY3Rvci4kX1NFTEVDVE9SID0gJHNlbDsKKworICAgICAgIC8vIHNldCBmb3JtYXQgc2VsZWN0b3IgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UKKyAgICAgICBGb3JtYXRTZWxlY3Rvci51cGRhdGVTZWxlY3RlZCgpOworICAgICAgIEZvcm1hdFNlbGVjdG9yLiRfU0VMRUNUT1IuY2hhbmdlKCBGb3JtYXRTZWxlY3Rvci5ldnRDaGFuZ2VGb3JtYXQgKTsKKyAgICAgfSwKKworCisgICAgIC8qKgorICAgICAgKiBGb3JtYXRTZWxlY3Rvci51cGRhdGUKKyAgICAgICovCisgICAgdXBkYXRlU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeworICAgICAgIHZhciBjdXJyZW50TGFuZyA9IExhbmd1YWdlRGVmaW5pdGlvbi5nZXRBY3RpdmVMYW5ndWFnZSgpOworICAgICAgIEZvcm1hdFNlbGVjdG9yLiRfU0VMRUNUT1IudmFsKCBjdXJyZW50TGFuZyApOworICAgIH0KKworICAgfTsKKworCisKKyAgIC8qKgorICAgICogIEhlbHAKKyAgICAqCisgICAgKiAgRnVuY3Rpb25zIHRoYXQgbWFuYWdlIHRoZSBkaXNwbGF5IGFuZCBsb2FkaW5nIG9mIGlubGluZSBoZWxwIGZpbGVzLgorICAgICovCisgIHZhciBIZWxwID0geworCisgICAgX0FDVElWRV9IRUxQOiAnJywKKyAgICBfTE9BREVEX0hFTFBfTEFOR1M6IFtdLAorICAgIF9IRUxQOiB7fSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmRlZmluZQorICAgICAqCisgICAgICogIERlZmluZXMgYSBuZXcgaGVscCBjb250ZXh0IGFuZCBlbmFibGVzIHRoZSBoZWxwIGZ1bmN0aW9uIGlmIGl0CisgICAgICogIGV4aXN0cyBpbiB0aGUgR29sbHVtIEZ1bmN0aW9uIEJhci4KKyAgICAgKgorICAgICAqICBAcGFyYW0gc3RyaW5nIG5hbWUgICBUaGUgbmFtZSB5b3UncmUgZ2l2aW5nIHRvIHRoaXMgaGVscCBjb250ZXh0LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsbHksIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSBsYW5ndWFnZSBuYW1lLgorICAgICAqICBAcGFyYW0gb2JqZWN0IGRlZmluaXRpb25PYmplY3QgVGhlIGRlZmluaXRpb24gb2JqZWN0IGJlaW5nIGxvYWRlZCBmcm9tIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIC8gaGVscCBkZWZpbml0aW9uIGZpbGUuCisgICAgICogIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGRlZmluZTogZnVuY3Rpb24oIG5hbWUsIGRlZmluaXRpb25PYmplY3QgKSB7CisgICAgICBpZiAoIEhlbHAuaXNWYWxpZEhlbHBGb3JtYXQoIGRlZmluaXRpb25PYmplY3QgKSApIHsKKyAgICAgICAgZGVidWcoJ2hlbHAgaXMgYSB2YWxpZCBmb3JtYXQnKTsKKworICAgICAgICBIZWxwLl9BQ1RJVkVfSEVMUF9MQU5HID0gbmFtZTsKKyAgICAgICAgSGVscC5fTE9BREVEX0hFTFBfTEFOR1MucHVzaCggbmFtZSApOworICAgICAgICBIZWxwLl9IRUxQW25hbWVdID0gZGVmaW5pdGlvbk9iamVjdDsKKworICAgICAgICBpZiAoICQoIiNmdW5jdGlvbi1oZWxwIikubGVuZ3RoICkgeworICAgICAgICAgIGlmICggJCgnI2Z1bmN0aW9uLWhlbHAnKS5oYXNDbGFzcygnZGlzYWJsZWQnKSApIHsKKyAgICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CisgICAgICAgICAgfQorICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykudW5iaW5kKCdjbGljaycpOworICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykuY2xpY2soIEhlbHAuZXZ0SGVscEJ1dHRvbkNsaWNrICk7CisKKyAgICAgICAgICAvLyBnZW5lcmF0ZSBoZWxwIG1lbnVzCisgICAgICAgICAgSGVscC5nZW5lcmF0ZUhlbHBNZW51Rm9yKCBuYW1lICk7CisKKyAgICAgICAgICBpZiAoICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5sZW5ndGggJiYKKyAgICAgICAgICAgICAgIHR5cGVvZiAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykuYXR0cignZGF0YS1hdXRvZGlzcGxheScpICE9PSAndW5kZWZpbmVkJyAmJgorICAgICAgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmF0dHIoJ2RhdGEtYXV0b2Rpc3BsYXknKSA9PT0gJ3RydWUnICkgeworICAgICAgICAgICAgSGVscC5zaG93KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoICQoJyNmdW5jdGlvbi1oZWxwJykubGVuZ3RoICkgeworICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogIEhlbHAuZ2VuZXJhdGVIZWxwTWVudUZvcgorICAgICAqICBHZW5lcmF0ZXMgdGhlIG1hcmt1cCBmb3IgdGhlIG1haW4gaGVscCBtZW51IGdpdmVuIGEgY29udGV4dCBuYW1lLgorICAgICAqCisgICAgICogIEBwYXJhbSBzdHJpbmcgIG5hbWUgIFRoZSBjb250ZXh0IG5hbWUuCisgICAgICogIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGdlbmVyYXRlSGVscE1lbnVGb3I6IGZ1bmN0aW9uKCBuYW1lICkgeworICAgICAgaWYgKCAhSGVscC5fSEVMUFtuYW1lXSApIHsKKyAgICAgICAgZGVidWcoJ0hlbHAgaXMgbm90IGRlZmluZWQgZm9yICcgKyBuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB2YXIgaGVscERhdGEgPSBIZWxwLl9IRUxQW25hbWVdOworCisgICAgICAvLyBjbGVhciB0aGlzIHNoaXogb3V0CisgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLXBhcmVudCcpLmh0bWwoJycpOworICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1saXN0JykuaHRtbCgnJyk7CisgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWNvbnRlbnQnKS5odG1sKCcnKTsKKworICAgICAgLy8gZ28gZ28gaW5lZmZpY2llbnQgYWxnb3JpdGhtCisgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgaGVscERhdGEubGVuZ3RoOyBpKysgKSB7CisgICAgICAgIGlmICggdHlwZW9mIGhlbHBEYXRhW2ldICE9ICdvYmplY3QnICkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyICRuZXdMaSA9ICQoJzxsaT48YSBocmVmPSIjIiByZWw9IicgKyBpICsgJyI+JyArCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHBEYXRhW2ldLm1lbnVOYW1lICsgJzwvYT48L2xpPicpOworICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLXBhcmVudCcpLmFwcGVuZCggJG5ld0xpICk7CisgICAgICAgIGlmICggaSA9PT0gMCApIHsKKyAgICAgICAgICAvLyBzZWxlY3Qgb24gZmlyc3QgcnVuCisgICAgICAgICAgJG5ld0xpLmNoaWxkcmVuKCdhJykuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgICAgIH0KKyAgICAgICAgJG5ld0xpLmNoaWxkcmVuKCdhJykuY2xpY2soIEhlbHAuZXZ0UGFyZW50TWVudUNsaWNrICk7CisgICAgICB9CisKKyAgICAgIC8vIGdlbmVyYXRlIHBhcmVudCBzdWJtZW51IG9uIGZpcnN0IHJ1bgorICAgICAgSGVscC5nZW5lcmF0ZVN1Yk1lbnUoIGhlbHBEYXRhWzBdLCAwICk7CisgICAgICAkKCQoJyNnb2xsdW0tZWRpdG9yLWhlbHAtbGlzdCBsaSBhJykuZ2V0KDApKS5jbGljaygpOworCisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmdlbmVyYXRlU3ViTWVudQorICAgICAqICBHZW5lcmF0ZXMgdGhlIG1hcmt1cCBmb3IgdGhlIGlubGluZSBoZWxwIHN1Yi1tZW51IGdpdmVuIHRoZSBkYXRhCisgICAgICogIG9iamVjdCBmb3IgdGhlIHN1Ym1lbnUgYW5kIHRoZSBhcnJheSBpbmRleCB0byBzdGFydCBhdC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gb2JqZWN0IHN1YkRhdGEgVGhlIGRhdGEgZm9yIHRoZSBzdWItbWVudS4KKyAgICAgKiAgQHBhcmFtIGludGVnZXIgaW5kZXggIFRoZSBpbmRleCBjbGlja2VkIG9uIChwYXJlbnQgbWVudSBpbmRleCkuCisgICAgICogIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGdlbmVyYXRlU3ViTWVudTogZnVuY3Rpb24oIHN1YkRhdGEsIGluZGV4ICkgeworICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscC1saXN0JykuaHRtbCgnJyk7CisgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWNvbnRlbnQnKS5odG1sKCcnKTsKKyAgICAgIGZvciAoIHZhciBpPTA7IGkgPCBzdWJEYXRhLmNvbnRlbnQubGVuZ3RoOyBpKysgKSB7CisgICAgICAgIGlmICggdHlwZW9mIHN1YkRhdGEuY29udGVudFtpXSAhPSAnb2JqZWN0JyApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhciAkc3ViTGkgPSAkKCc8bGk+PGEgaHJlZj0iIyIgcmVsPSInICsgaW5kZXggKyAnOicgKyBpICsgJyI+JyArCisgICAgICAgICAgICAgICAgICAgICAgIHN1YkRhdGEuY29udGVudFtpXS5tZW51TmFtZSArICc8L2E+PC9saT4nKTsKKworCisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAtbGlzdCcpLmFwcGVuZCggJHN1YkxpICk7CisgICAgICAgICRzdWJMaS5jaGlsZHJlbignYScpLmNsaWNrKCBIZWxwLmV2dFN1Yk1lbnVDbGljayApOworICAgICAgfQorICAgIH0sCisKKyAgICBoaWRlOiBmdW5jdGlvbigpIHsKKyAgICAgIGlmICggJC5icm93c2VyLm1zaWUgKSB7CisgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmFuaW1hdGUoeworICAgICAgICAgIG9wYWNpdHk6IDAKKyAgICAgICAgfSwgMjAwLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwJykKKyAgICAgICAgICAgIC5hbmltYXRlKHsgaGVpZ2h0OiAnaGlkZScgfSwgMjAwKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIHNob3c6IGZ1bmN0aW9uKCkgeworICAgICAgaWYgKCAkLmJyb3dzZXIubXNpZSApIHsKKyAgICAgICAgLy8gYnlwYXNzIGVmZmVjdHMgZm9yIGludGVybmV0IGV4cGxvcmVyLCBzaW5jZSBpdCBkb2VzIHdlaXJkIGNyYXAKKyAgICAgICAgLy8gdG8gdGV4dCBhbnRpYWxpYXNpbmcgd2l0aCBvcGFjaXR5IGFuaW1hdGlvbnMKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmNzcygnZGlzcGxheScsICdibG9jaycpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmFuaW1hdGUoeworICAgICAgICAgIGhlaWdodDogJ3Nob3cnCisgICAgICAgIH0sIDIwMCwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpCisgICAgICAgICAgICAuYW5pbWF0ZSh7IG9wYWNpdHk6IDEgfSwgMzAwKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLnNob3dIZWxwRm9yCisgICAgICogIERpc3BsYXlzIHRoZSBhY3R1YWwgaGVscCBjb250ZW50IGdpdmVuIHRoZSB0d28gbWVudSBpbmRleGVzLCB3aGljaCBhcmUKKyAgICAgKiAgcmVuZGVyZWQgaW4gdGhlIHJlbD0iIiBhdHRyaWJ1dGVzIG9mIHRoZSBoZWxwIG1lbnVzCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGludGVnZXIgaW5kZXgxICBwYXJlbnQgaW5kZXgKKyAgICAgKiAgQHBhcmFtIGludGVnZXIgaW5kZXgyICBzdWJtZW51IGluZGV4CisgICAgICogIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHNob3dIZWxwRm9yOiBmdW5jdGlvbiggaW5kZXgxLCBpbmRleDIgKSB7CisgICAgICB2YXIgaHRtbCA9CisgICAgICAgIEhlbHAuX0hFTFBbSGVscC5fQUNUSVZFX0hFTFBfTEFOR11baW5kZXgxXS5jb250ZW50W2luZGV4Ml0uZGF0YTsKKyAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAtY29udGVudCcpLmh0bWwoaHRtbCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqICBIZWxwLmlzTG9hZGVkRm9yCisgICAgICogIFJldHVybnMgdHJ1ZSBpZiBoZWxwIGlzIGxvYWRlZCBmb3IgYSBzcGVjaWZpYyBtYXJrdXAgbGFuZ3VhZ2UsCisgICAgICogIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gc3RyaW5nIG5hbWUgICBUaGUgbmFtZSBvZiB0aGUgbWFya3VwIGxhbmd1YWdlLgorICAgICAqICBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBpc0xvYWRlZEZvcjogZnVuY3Rpb24oIG5hbWUgKSB7CisgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgSGVscC5fTE9BREVEX0hFTFBfTEFOR1MubGVuZ3RoOyBpKysgKSB7CisgICAgICAgIGlmICggbmFtZSA9PSBIZWxwLl9MT0FERURfSEVMUF9MQU5HU1tpXSApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAoJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmlzKCc6dmlzaWJsZScpKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogIEhlbHAuaXNWYWxpZEhlbHBGb3JtYXQKKyAgICAgKiAgRG9lcyBhIHF1aWNrIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBoZWxwIGRlZmluaXRpb24gaXNuJ3QgaW4gYQorICAgICAqICBjb21wbGV0ZWx5IG1lc3NlZC11cCBmb3JtYXQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIG9iamVjdCAoQXJyYXkpIGhlbHBBcnIgIFRoZSBoZWxwIGRlZmluaXRpb24gYXJyYXkuCisgICAgICogIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIGlzVmFsaWRIZWxwRm9ybWF0OiBmdW5jdGlvbiggaGVscEFyciApIHsKKyAgICAgIHJldHVybiAoIHR5cGVvZiBoZWxwQXJyID09ICdvYmplY3QnICYmCisgICAgICAgICAgICAgICBoZWxwQXJyLmxlbmd0aCAmJgorICAgICAgICAgICAgICAgdHlwZW9mIGhlbHBBcnJbMF0ubWVudU5hbWUgPT0gJ3N0cmluZycgJiYKKyAgICAgICAgICAgICAgIHR5cGVvZiBoZWxwQXJyWzBdLmNvbnRlbnQgPT0gJ29iamVjdCcgJiYKKyAgICAgICAgICAgICAgIGhlbHBBcnJbMF0uY29udGVudC5sZW5ndGggKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogIEhlbHAuc2V0QWN0aXZlSGVscAorICAgICAqICBTZXRzIHRoZSBhY3RpdmUgaGVscCBkZWZpbml0aW9uIHRvIHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgYXJndW1lbnQsCisgICAgICogIHJlLXJlbmRlcmluZyB0aGUgaGVscCBtZW51IHRvIG1hdGNoIHRoZSBuZXcgZGVmaW5pdGlvbi4KKyAgICAgKgorICAgICAqICBAcGFyYW0gc3RyaW5nICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgaGVscCBkZWZpbml0aW9uLgorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBzZXRBY3RpdmVIZWxwOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICAgIGlmICggIUhlbHAuaXNMb2FkZWRGb3IoIG5hbWUgKSApIHsKKyAgICAgICAgaWYgKCAkKCcjZnVuY3Rpb24taGVscCcpLmxlbmd0aCApIHsKKyAgICAgICAgICAkKCcjZnVuY3Rpb24taGVscCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpOworICAgICAgICB9CisgICAgICAgIGlmICggSGVscC5pc1Nob3duKCkgKSB7CisgICAgICAgICAgSGVscC5oaWRlKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEhlbHAuX0FDVElWRV9IRUxQX0xBTkcgPSBuYW1lOworICAgICAgICBpZiAoICQoIiNmdW5jdGlvbi1oZWxwIikubGVuZ3RoICkgeworICAgICAgICAgIGlmICggJCgnI2Z1bmN0aW9uLWhlbHAnKS5oYXNDbGFzcygnZGlzYWJsZWQnKSApIHsKKyAgICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CisgICAgICAgICAgfQorICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykudW5iaW5kKCdjbGljaycpOworICAgICAgICAgICQoJyNmdW5jdGlvbi1oZWxwJykuY2xpY2soIEhlbHAuZXZ0SGVscEJ1dHRvbkNsaWNrICk7CisgICAgICAgICAgSGVscC5nZW5lcmF0ZUhlbHBNZW51Rm9yKCBuYW1lICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogIEhlbHAuZXZ0SGVscEJ1dHRvbkNsaWNrCisgICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIGNsaWNraW5nIHRoZSBoZWxwIGJ1dHRvbiBpbiB0aGUgZnVuY3Rpb24gYmFyLgorICAgICAqCisgICAgICogIEBwYXJhbSBqUXVlcnkuRXZlbnQgZSAgVGhlIGpRdWVyeSBldmVudCBvYmplY3QuCisgICAgICogIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGV2dEhlbHBCdXR0b25DbGljazogZnVuY3Rpb24oIGUgKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICBpZiAoIEhlbHAuaXNTaG93bigpICkgeworICAgICAgICAvLyB0dXJuIG9mZiBhdXRvZGlzcGxheSBpZiBpdCdzIG9uCisgICAgICAgIGlmICggJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmxlbmd0aCAmJgorICAgICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5hdHRyKCdkYXRhLWF1dG9kaXNwbGF5JykgIT09ICd1bmRlZmluZWQnICYmCisgICAgICAgICAgICAgJCgnI2dvbGx1bS1lZGl0b3ItaGVscCcpLmF0dHIoJ2RhdGEtYXV0b2Rpc3BsYXknKSA9PT0gJ3RydWUnICkgeworICAgICAgICAgICQucG9zdCgnL3dpa2kvaGVscD9fbWV0aG9kPWRlbGV0ZScpOworICAgICAgICAgICQoJyNnb2xsdW0tZWRpdG9yLWhlbHAnKS5hdHRyKCdkYXRhLWF1dG9kaXNwbGF5JywgJycpOworICAgICAgICB9CisgICAgICAgIEhlbHAuaGlkZSgpOyB9CisgICAgICBlbHNlIHsgSGVscC5zaG93KCk7IH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogIEhlbHAuZXZ0UGFyZW50TWVudUNsaWNrCisgICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIGNsaWNraW5nIG9uIGFuIGl0ZW0gaW4gdGhlIHBhcmVudCBtZW51LiBBdXRvbWF0aWNhbGx5CisgICAgICogIHJlbmRlcnMgdGhlIHN1Ym1lbnUgZm9yIHRoZSBwYXJlbnQgbWVudSBhcyB3ZWxsIGFzIHRoZSBmaXJzdCByZXN1bHQgZm9yCisgICAgICogIHRoZSBhY3R1YWwgcGxhaW4gdGV4dC4KKyAgICAgKgorICAgICAqICBAcGFyYW0galF1ZXJ5LkV2ZW50IGUgIFRoZSBqUXVlcnkgZXZlbnQgb2JqZWN0LgorICAgICAqICBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBldnRQYXJlbnRNZW51Q2xpY2s6IGZ1bmN0aW9uKCBlICkgeworICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgLy8gc2hvcnQgY2lyY3VpdCBpZiB3ZSd2ZSBzZWxlY3RlZCB0aGlzIGFscmVhZHkKKyAgICAgIGlmICggJCh0aGlzKS5oYXNDbGFzcygnc2VsZWN0ZWQnKSApIHsgcmV0dXJuOyB9CisKKyAgICAgIC8vIHBvcHVsYXRlIGZyb20gaGVscCBkYXRhIGZvciB0aGlzCisgICAgICB2YXIgaGVscEluZGV4ID0gJCh0aGlzKS5hdHRyKCdyZWwnKTsKKyAgICAgIHZhciBzdWJEYXRhID0gSGVscC5fSEVMUFtIZWxwLl9BQ1RJVkVfSEVMUF9MQU5HXVtoZWxwSW5kZXhdOworCisgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLXBhcmVudCBsaSBhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgICAkKHRoaXMpLmFkZENsYXNzKCdzZWxlY3RlZCcpOworICAgICAgSGVscC5nZW5lcmF0ZVN1Yk1lbnUoIHN1YkRhdGEsIGhlbHBJbmRleCApOworICAgICAgJCgkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QgbGkgYScpLmdldCgwKSkuY2xpY2soKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogIEhlbHAuZXZ0U3ViTWVudUNsaWNrCisgICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIGNsaWNraW5nIGFuIGl0ZW0gaW4gYSBoZWxwIHN1Ym1lbnUuIFJlbmRlcnMgdGhlCisgICAgICogIGFwcHJvcHJpYXRlIHRleHQgZm9yIHRoZSBzdWJtZW51IGxpbmsuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGpRdWVyeS5FdmVudCBlICBUaGUgalF1ZXJ5IGV2ZW50IG9iamVjdC4KKyAgICAgKiAgQHJldHVybiB2b2lkCisgICAgICovCisgICAgZXZ0U3ViTWVudUNsaWNrOiBmdW5jdGlvbiggZSApIHsKKyAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgIGlmICggJCh0aGlzKS5oYXNDbGFzcygnc2VsZWN0ZWQnKSApIHsgcmV0dXJuOyB9CisKKyAgICAgIC8vIHNwbGl0IGluZGV4IHJlbCBkYXRhCisgICAgICB2YXIgcmF3SW5kZXggPSAkKHRoaXMpLmF0dHIoJ3JlbCcpLnNwbGl0KCc6Jyk7CisgICAgICAkKCcjZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QgbGkgYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOworICAgICAgJCh0aGlzKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICAgIEhlbHAuc2hvd0hlbHBGb3IoIHJhd0luZGV4WzBdLCByYXdJbmRleFsxXSApOworICAgIH0KKyAgfTsKKworICAvLyBQdWJsaWNseS1hY2Nlc3NpYmxlIGZ1bmN0aW9uIHRvIEhlbHAuZGVmaW5lCisgICQuR29sbHVtRWRpdG9yLmRlZmluZUhlbHAgPSBIZWxwLmRlZmluZTsKKworICAvLyBEaWFsb2cgZXhpc3RzIGFzIGl0cyBvd24gdGhpbmcgbm93CisgICQuR29sbHVtRWRpdG9yLkRpYWxvZyA9ICQuR29sbHVtRGlhbG9nOworICAkLkdvbGx1bUVkaXRvci5yZXBsYWNlU2VsZWN0aW9uID0gZnVuY3Rpb24oIHJlcFRleHQgKSB7CisgICAgRnVuY3Rpb25CYXIucmVwbGFjZUZpZWxkU2VsZWN0aW9uKCAkKCcjZ29sbHVtLWVkaXRvci1ib2R5JyksIHJlcFRleHQgKTsKKyAgfTsKKworICAvLyBQbGFjZWhvbGRlciBleGlzdHMgYXMgaXRzIG93biB0aGluZyBub3cKKyAgJC5Hb2xsdW1FZGl0b3IuUGxhY2Vob2xkZXIgPSAkLkdvbGx1bVBsYWNlaG9sZGVyOworCit9KShqUXVlcnkpOwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvanMvZWRpdG9yL2xhbmdzL21hcmtkb3duLmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvanMvZWRpdG9yL2xhbmdzL21hcmtkb3duLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzhlM2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9lZGl0b3IvbGFuZ3MvbWFya2Rvd24uanMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqICBNYXJrZG93biBMYW5ndWFnZSBEZWZpbml0aW9uCisgKgorICogIEEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3Igc3RyaW5nIG1hbmlwdWxhdGlvbiBvcGVyYXRpb25zLCBpbiB0aGlzIGNhc2UKKyAqICBmb3IgdGhlIE1hcmtkb3duLCB1aCwgbWFya3VwIGxhbmd1YWdlLiBVc2VzIHJlZ2V4ZXMgZm9yIHZhcmlvdXMgZnVuY3Rpb25zCisgKiAgYnkgZGVmYXVsdC4gSWYgcmVnZXhlcyB3b24ndCBkbyBhbmQgeW91IG5lZWQgdG8gZG8gc29tZSBzZXJpb3VzCisgKiAgbWFuaXB1bGF0aW9uLCB5b3UgY2FuIGRlY2xhcmUgYSBmdW5jdGlvbiBpbiB0aGUgb2JqZWN0IGluc3RlYWQuCisgKgorICogIENvZGUgZXhhbXBsZToKKyAqICAnZnVuY3Rpb25iYXItaWQnICA6ICAgeworICogICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKHRleHQsIHNlbGVjdGVkVGV4dCkgeworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uU3R1ZmZIZXJlKCk7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IC9zb21lc2VhcmNocmVnZXgvZ2ksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogJ3JlcGxhY2UgdGV4dCBmb3IgUmVnRXhwLnJlcGxhY2UnLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogImp1c3QgYWRkIHRoaXMgd2hlcmUgdGhlIGN1cnNvciBpcyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAqCisqKi8KKyhmdW5jdGlvbigkKSB7CisKK3ZhciBNYXJrRG93biA9IHsKKworICAnZnVuY3Rpb24tYm9sZCcgOiAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogLyhbXlxuXSspKFtcblxzXSopL2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlOiAiKiokMSoqJDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKworICAnZnVuY3Rpb24taXRhbGljJyA6ICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogLyhbXlxuXSspKFtcblxzXSopL2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlOiAiXyQxXyQyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisKKyAgJ2Z1bmN0aW9uLWNvZGUnICAgOiAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IC8oXltcbl0rKShbXG5cc10qKS9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogImAkMWAkMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCisgICdmdW5jdGlvbi1ocicgICAgIDogICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAiXG4qKipcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCisgICdmdW5jdGlvbi11bCcgICAgIDogICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiAvKC4rKShbXG5dPykvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6ICIqICQxJDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKworICAvKiBUaGlzIGxvb2tzIHNpbGx5IGJ1dCBpcyBjb21wbGV0ZWx5IHZhbGlkIE1hcmtkb3duICovCisgICdmdW5jdGlvbi1vbCcgICA6ICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiAvKC4rKShbXG5dPykvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6ICIxLiAkMSQyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisKKyAgJ2Z1bmN0aW9uLWJsb2NrcXVvdGUnIDogICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IC8oLispKFtcbl0/KS9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogIj4gJDEkMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCisgICdmdW5jdGlvbi1oMScgICAgICAgICA6ICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiAvKC4rKShbXG5dPykvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6ICIjICQxJDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKworICAnZnVuY3Rpb24taDInICAgICAgICAgOiAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogLyguKykoW1xuXT8pL2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlOiAiIyMgJDEkMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCisgICdmdW5jdGlvbi1oMycgICAgICAgICA6ICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiAvKC4rKShbXG5dPykvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6ICIjIyMgJDEkMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCisgICdmdW5jdGlvbi1saW5rJyAgICAgICA6ICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oIHR4dCwgc2VsVGV4dCwgJGZpZWxkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0cyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuR29sbHVtRWRpdG9yLkRpYWxvZy5pbml0KHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0luc2VydCBMaW5rJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICAgJ3RleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTGluayBUZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogICAnaHJlZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdVUkwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9LOiBmdW5jdGlvbiggcmVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVwID0gJyc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzWyd0ZXh0J10gJiYgcmVzWydocmVmJ10gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCA9ICdbJyArIHJlc1sndGV4dCddICsgJ10oJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNbJ2hyZWYnXSArICcpJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuR29sbHVtRWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oIHJlcCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKworICAnZnVuY3Rpb24taW1hZ2UnICAgICAgOiAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKCB0eHQsIHNlbFRleHQsICRmaWVsZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkdvbGx1bUVkaXRvci5EaWFsb2cuaW5pdCh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdJbnNlcnQgSW1hZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3VybCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdJbWFnZSBVUkwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYWx0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FsdCBUZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSzogZnVuY3Rpb24oIHJlcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXAgPSAnJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzWyd1cmwnXSAmJiByZXNbJ2FsdCddICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAgPSAnIVsnICsgcmVzWydhbHQnXSArICddJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJyArIHJlc1sndXJsJ10gKyAnKSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkdvbGx1bUVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCByZXAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworfTsKKwordmFyIE1hcmtEb3duSGVscCA9IFsKKworICB7CisgICAgbWVudU5hbWU6ICdCbG9jayBFbGVtZW50cycsCisgICAgY29udGVudDogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1lbnVOYW1lOiAnUGFyYWdyYXBocyAmYW1wOyBCcmVha3MnLAorICAgICAgICAgICAgICAgICAgZGF0YTogJzxwPlRvIGNyZWF0ZSBhIHBhcmFncmFwaCwgc2ltcGx5IGNyZWF0ZSBhIGJsb2NrIG9mIHRleHQgdGhhdCBpcyBub3Qgc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlIGJsYW5rIGxpbmVzLiBCbG9ja3Mgb2YgdGV4dCBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgYmxhbmsgbGluZXMgd2lsbCBiZSBwYXJzZWQgYXMgcGFyYWdyYXBocy48L3A+PHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbGluZSBicmVhaywgZW5kIGEgbGluZSB3aXRoIHR3byBvciBtb3JlIHNwYWNlcywgdGhlbiBoaXQgUmV0dXJuL0VudGVyLjwvcD4nCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtZW51TmFtZTogJ0hlYWRlcnMnLAorICAgICAgICAgICAgICAgICAgZGF0YTogJzxwPk1hcmtkb3duIHN1cHBvcnRzIHR3byBoZWFkZXIgZm9ybWF0cy4gVGhlIHdpa2kgZWRpdG9yIHVzZXMgdGhlICZsZHF1bzthdHgmcnNxdW87LXN0eWxlIGhlYWRlcnMuIFNpbXBseSBwcmVmaXggeW91ciBoZWFkZXIgdGV4dCB3aXRoIHRoZSBudW1iZXIgb2YgPGNvZGU+IzwvY29kZT4gY2hhcmFjdGVycyB0byBzcGVjaWZ5IGhlYWRpbmcgZGVwdGguIEZvciBleGFtcGxlOiA8Y29kZT4jIEhlYWRlciAxPC9jb2RlPiwgPGNvZGU+IyMgSGVhZGVyIDI8L2NvZGU+IGFuZCA8Y29kZT4jIyMgSGVhZGVyIDM8L2NvZGU+IHdpbGwgYmUgcHJvZ3Jlc3NpdmVseSBzbWFsbGVyIGhlYWRlcnMuIFlvdSBtYXkgZW5kIHlvdXIgaGVhZGVycyB3aXRoIGFueSBudW1iZXIgb2YgaGFzaGVzLjwvcD4nCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtZW51TmFtZTogJ0Jsb2NrcXVvdGVzJywKKyAgICAgICAgICAgICAgICAgIGRhdGE6ICc8cD5NYXJrZG93biBjcmVhdGVzIGJsb2NrcXVvdGVzIGVtYWlsLXN0eWxlIGJ5IHByZWZpeGluZyBlYWNoIGxpbmUgd2l0aCB0aGUgPGNvZGU+Jmd0OzwvY29kZT4uIFRoaXMgbG9va3MgYmVzdCBpZiB5b3UgZGVjaWRlIHRvIGhhcmQtd3JhcCB0ZXh0IGFuZCBwcmVmaXggZWFjaCBsaW5lIHdpdGggYSA8Y29kZT4mZ3Q7PC9jb2RlPiBjaGFyYWN0ZXIsIGJ1dCBNYXJrZG93biBzdXBwb3J0cyBqdXN0IHB1dHRpbmcgPGNvZGU+Jmd0OzwvY29kZT4gYmVmb3JlIHlvdXIgcGFyYWdyYXBoLjwvcD4nCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtZW51TmFtZTogJ0xpc3RzJywKKyAgICAgICAgICAgICAgICAgIGRhdGE6ICc8cD5NYXJrZG93biBzdXBwb3J0cyBib3RoIG9yZGVyZWQgYW5kIHVub3JkZXJlZCBsaXN0cy4gVG8gY3JlYXRlIGFuIG9yZGVyZWQgbGlzdCwgc2ltcGx5IHByZWZpeCBlYWNoIGxpbmUgd2l0aCBhIG51bWJlciAoYW55IG51bWJlciB3aWxsIGRvICZtZGFzaDsgdGhpcyBpcyB3aHkgdGhlIGVkaXRvciBvbmx5IHVzZXMgb25lIG51bWJlci4pIFRvIGNyZWF0ZSBhbiB1bm9yZGVyZWQgbGlzdCwgeW91IGNhbiBwcmVmaXggZWFjaCBsaW5lIHdpdGggPGNvZGU+KjwvY29kZT4sIDxjb2RlPis8L2NvZGU+IG9yIDxjb2RlPi08L2NvZGU+LjwvcD4gTGlzdCBpdGVtcyBjYW4gY29udGFpbiBtdWx0aXBsZSBwYXJhZ3JhcGhzLCBob3dldmVyIGVhY2ggcGFyYWdyYXBoIG11c3QgYmUgaW5kZW50ZWQgYnkgYXQgbGVhc3QgNCBzcGFjZXMgb3IgYSB0YWIuJworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWVudU5hbWU6ICdDb2RlIEJsb2NrcycsCisgICAgICAgICAgICAgICAgICBkYXRhOiAnPHA+TWFya2Rvd24gd3JhcHMgY29kZSBibG9ja3MgaW4gcHJlLWZvcm1hdHRlZCB0YWdzIHRvIHByZXNlcnZlIGluZGVudGF0aW9uIGluIHlvdXIgY29kZSBibG9ja3MuIFRvIGNyZWF0ZSBhIGNvZGUgYmxvY2ssIGluZGVudCB0aGUgZW50aXJlIGJsb2NrIGJ5IGF0IGxlYXN0IDQgc3BhY2VzIG9yIG9uZSB0YWIuIE1hcmtkb3duIHdpbGwgc3RyaXAgdGhlIGV4dHJhIGluZGVudGF0aW9uIHlvdSZyc3F1bzt2ZSBhZGRlZCB0byB0aGUgY29kZSBibG9jay48L3A+JworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWVudU5hbWU6ICdIb3Jpem9udGFsIFJ1bGVzJywKKyAgICAgICAgICAgICAgICAgIGRhdGE6ICdIb3Jpem9udGFsIHJ1bGVzIGFyZSBjcmVhdGVkIGJ5IHBsYWNpbmcgdGhyZWUgb3IgbW9yZSBoeXBoZW5zLCBhc3Rlcmlza3Mgb3IgdW5kZXJzY29yZXMgb24gYSBsaW5lIGJ5IHRoZW1zZWx2ZXMuIFNwYWNlcyBhcmUgYWxsb3dlZCBiZXR3ZWVuIHRoZSBoeXBoZW5zLCBhc3Rlcmlza3Mgb3IgdW5kZXJzY29yZXMuJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgXQorICB9LAorCisgIHsKKyAgICBtZW51TmFtZTogJ1NwYW4gRWxlbWVudHMnLAorICAgIGNvbnRlbnQ6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtZW51TmFtZTogJ0xpbmtzJywKKyAgICAgICAgICAgICAgICAgIGRhdGE6ICc8cD5NYXJrZG93biBoYXMgdHdvIHR5cGVzIG9mIGxpbmtzOiA8c3Ryb25nPmlubGluZTwvc3Ryb25nPiBhbmQgPHN0cm9uZz5yZWZlcmVuY2U8L3N0cm9uZz4uIEZvciBib3RoIHR5cGVzIG9mIGxpbmtzLCB0aGUgdGV4dCB5b3Ugd2FudCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyIGlzIHBsYWNlZCBpbiBzcXVhcmUgYnJhY2tldHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB5b3VyIGxpbmsgdG8gZGlzcGxheSB0aGUgdGV4dCAmbGRxdW87R2l0SHViJnJkcXVvOywgeW91IHdyaXRlIDxjb2RlPltHaXRIdWJdPC9jb2RlPi48L3A+PHA+VG8gY3JlYXRlIGFuIGlubGluZSBsaW5rLCBjcmVhdGUgYSBzZXQgb2YgcGFyZW50aGVzZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGJyYWNrZXRzIGFuZCB3cml0ZSB5b3VyIFVSTCB3aXRoaW4gdGhlIHBhcmVudGhlc2VzLiAoZS5nLiwgPGNvZGU+W0dpdEh1Yl0oaHR0cDovL2dpdGh1Yi5jb20vKTwvY29kZT4pLiBSZWxhdGl2ZSBwYXRocyBhcmUgYWxsb3dlZCBpbiBpbmxpbmUgbGlua3MuPC9wPjxwPlRvIGNyZWF0ZSBhIHJlZmVyZW5jZSBsaW5rLCB1c2UgdHdvIHNldHMgb2Ygc3F1YXJlIGJyYWNrZXRzLiA8Y29kZT5bbXkgaW50ZXJuYWwgbGlua11baW50ZXJuYWwtcmVmXTwvY29kZT4gd2lsbCBsaW5rIHRvIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UgPGNvZGU+aW50ZXJuYWwtcmVmPC9jb2RlPi48L3A+JworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtZW51TmFtZTogJ0VtcGhhc2lzJywKKyAgICAgICAgICAgICAgICAgIGRhdGE6ICc8cD5Bc3Rlcmlza3MgKDxjb2RlPio8L2NvZGU+KSBhbmQgdW5kZXJzY29yZXMgKDxjb2RlPl88L2NvZGU+KSBhcmUgdHJlYXRlZCBhcyBlbXBoYXNpcyBhbmQgYXJlIHdyYXBwZWQgd2l0aCBhbiA8Y29kZT4mbHQ7ZW0mZ3Q7PC9jb2RlPiB0YWcsIHdoaWNoIHVzdWFsbHkgZGlzcGxheXMgYXMgaXRhbGljcyBpbiBtb3N0IGJyb3dzZXJzLiBEb3VibGUgYXN0ZXJpc2tzICg8Y29kZT4qKjwvY29kZT4pIG9yIGRvdWJsZSB1bmRlcnNjb3JlcyAoPGNvZGU+X188L2NvZGU+KSBhcmUgdHJlYXRlZCBhcyBib2xkIHVzaW5nIHRoZSA8Y29kZT4mbHQ7c3Ryb25nJmd0OzwvY29kZT4gdGFnLiBUbyBjcmVhdGUgaXRhbGljIG9yIGJvbGQgdGV4dCwgc2ltcGx5IHdyYXAgeW91ciB3b3JkcyBpbiBzaW5nbGUvZG91YmxlIGFzdGVyaXNrcy91bmRlcnNjb3Jlcy4gRm9yIGV4YW1wbGUsIDxjb2RlPioqTXkgZG91YmxlIGVtcGhhc2lzIHRleHQqKjwvY29kZT4gYmVjb21lcyA8c3Ryb25nPk15IGRvdWJsZSBlbXBoYXNpcyB0ZXh0PC9zdHJvbmc+LCBhbmQgPGNvZGU+Kk15IHNpbmdsZSBlbXBoYXNpcyB0ZXh0KjwvY29kZT4gYmVjb21lcyA8ZW0+TXkgc2luZ2xlIGVtcGhhc2lzIHRleHQ8L2VtPi48L3A+JworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtZW51TmFtZTogJ0NvZGUnLAorICAgICAgICAgICAgICAgICAgZGF0YTogJzxwPlRvIGNyZWF0ZSBpbmxpbmUgc3BhbnMgb2YgY29kZSwgc2ltcGx5IHdyYXAgdGhlIGNvZGUgaW4gYmFja3RpY2tzICg8Y29kZT5gPC9jb2RlPikuIE1hcmtkb3duIHdpbGwgdHVybiA8Y29kZT5gbXlGdW5jdGlvbmA8L2NvZGU+IGludG8gPGNvZGU+bXlGdW5jdGlvbjwvY29kZT4uPC9wPicKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWVudU5hbWU6ICdJbWFnZXMnLAorICAgICAgICAgICAgICAgICAgZGF0YTogJzxwPk1hcmtkb3duIGltYWdlIHN5bnRheCBsb29rcyBhIGxvdCBsaWtlIHRoZSBzeW50YXggZm9yIGxpbmtzOyBpdCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBzeW50YXggcHJlY2VkZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgKDxjb2RlPiE8L2NvZGU+KS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGxpbmsgdG8gYW4gaW1hZ2UgYXQgPGNvZGU+aHR0cDovL2dpdGh1Yi5jb20vdW5pY29ybi5wbmc8L2NvZGU+IHdpdGggdGhlIGFsdGVybmF0ZSB0ZXh0IDxjb2RlPk15IFVuaWNvcm48L2NvZGU+LCB5b3Ugd291bGQgd3JpdGUgPGNvZGU+IVtNeSBVbmljb3JuXShodHRwOi8vZ2l0aHViLmNvbS91bmljb3JuLnBuZyk8L2NvZGU+LjwvcD4nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBdCisgIH0sCisKKyAgeworICAgIG1lbnVOYW1lOiAnTWlzY2VsbGFuZW91cycsCisgICAgY29udGVudDogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1lbnVOYW1lOiAnQXV0b21hdGljIExpbmtzJywKKyAgICAgICAgICAgICAgICAgIGRhdGE6ICc8cD5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBsaW5rIHRoYXQgZGlzcGxheXMgdGhlIGFjdHVhbCBVUkwsIG1hcmtkb3duIGFsbG93cyB5b3UgdG8gcXVpY2tseSB3cmFwIHRoZSBVUkwgaW4gPGNvZGU+Jmx0OzwvY29kZT4gYW5kIDxjb2RlPiZndDs8L2NvZGU+IHRvIGRvIHNvLiBGb3IgZXhhbXBsZSwgdGhlIGxpbmsgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyI+aHR0cDovL2dpdGh1Yi5jb20vPC9hPiBpcyBlYXNpbHkgcHJvZHVjZWQgYnkgd3JpdGluZyA8Y29kZT4mbHQ7aHR0cDovL2dpdGh1Yi5jb20vJmd0OzwvY29kZT4uPC9wPicKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWVudU5hbWU6ICdFc2NhcGluZycsCisgICAgICAgICAgICAgICAgICBkYXRhOiAnPHA+SWYgeW91IHdhbnQgdG8gdXNlIGEgc3BlY2lhbCBNYXJrZG93biBjaGFyYWN0ZXIgaW4geW91ciBkb2N1bWVudCAoc3VjaCBhcyBkaXNwbGF5aW5nIGxpdGVyYWwgYXN0ZXJpc2tzKSwgeW91IGNhbiBlc2NhcGUgdGhlIGNoYXJhY3RlciB3aXRoIHRoZSBiYWNrc2xhc2ggKDxjb2RlPlxcPC9jb2RlPikuIE1hcmtkb3duIHdpbGwgaWdub3JlIHRoZSBjaGFyYWN0ZXIgZGlyZWN0bHkgYWZ0ZXIgYSBiYWNrc2xhc2guJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgXQorICB9CitdOworCisKKyQuR29sbHVtRWRpdG9yLmRlZmluZUxhbmd1YWdlKCdtYXJrZG93bicsIE1hcmtEb3duKTsKKyQuR29sbHVtRWRpdG9yLmRlZmluZUhlbHAoJ21hcmtkb3duJywgTWFya0Rvd25IZWxwKTsKKworfSkoalF1ZXJ5KTsKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL2dvbGx1bS5kaWFsb2cuanMgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9nb2xsdW0uZGlhbG9nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZWNjN2MKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9nb2xsdW0uZGlhbG9nLmpzCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgICogIGdvbGx1bS5kaWFsb2cuanMKKyAgKgorICAqICBVc2VkIGZvciBkaWFsb2dzLiBEdWguCisgICoKKyAgKi8KKworKGZ1bmN0aW9uKCQpIHsKKworICB2YXIgRGlhbG9nID0geworCisgICAgZGVidWdPbjogZmFsc2UsCisgICAgbWFya3VwQ3JlYXRlZDogZmFsc2UsCisgICAgbWFya3VwOiAnJywKKworICAgIGF0dGFjaEV2ZW50czogZnVuY3Rpb24oIGV2dE9LICkgeworICAgICAgJCgnI2dvbGx1bS1kaWFsb2ctYWN0aW9uLW9rJykuY2xpY2soZnVuY3Rpb24oIGUgKSB7CisgICAgICAgIERpYWxvZy5ldmVudE9LKCBlLCBldnRPSyApOworICAgICAgfSk7CisgICAgICAkKCcjZ29sbHVtLWRpYWxvZy1hY3Rpb24tY2FuY2VsJykuY2xpY2soIERpYWxvZy5ldmVudENhbmNlbCApOworICAgICAgJCgnI2dvbGx1bS1kaWFsb2ctZGlhbG9nIGlucHV0W3R5cGU9InRleHQiXScpLmtleWRvd24oZnVuY3Rpb24oIGUgKSB7CisgICAgICAgIGlmICggZS5rZXlDb2RlID09IDEzICkgeworICAgICAgICAgIERpYWxvZy5ldmVudE9LKCBlLCBldnRPSyApOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9LAorCisgICAgZGV0YWNoRXZlbnRzOiBmdW5jdGlvbigpIHsKKyAgICAgICQoJyNnb2xsdW0tZGlhbG9nLWFjdGlvbi1vaycpLnVuYmluZCgnY2xpY2snKTsKKyAgICAgICQoJyNnb2xsdW0tZGlhbG9nLWFjdGlvbi1jYW5jZWwnKS51bmJpbmQoJ2NsaWNrJyk7CisgICAgfSwKKworICAgIGNyZWF0ZUZpZWxkTWFya3VwOiBmdW5jdGlvbiggZmllbGRBcnJheSApIHsKKyAgICAgIHZhciBmaWVsZE1hcmt1cCA9ICc8ZmllbGRzZXQ+JzsKKyAgICAgIGZvciAoIHZhciBpPTA7IGkgPCBmaWVsZEFycmF5Lmxlbmd0aDsgaSsrICkgeworICAgICAgICBpZiAoIHR5cGVvZiBmaWVsZEFycmF5W2ldID09ICdvYmplY3QnICkgeworICAgICAgICAgIGZpZWxkTWFya3VwICs9ICc8ZGl2IGNsYXNzPSJmaWVsZCI+JzsKKyAgICAgICAgICBzd2l0Y2ggKCBmaWVsZEFycmF5W2ldLnR5cGUgKSB7CisKKyAgICAgICAgICAvLyBvbmx5IHRleHQgaXMgc3VwcG9ydGVkIGZvciBub3cKKyAgICAgICAgICBjYXNlICd0ZXh0JzoKKyAgICAgICAgICAgIGZpZWxkTWFya3VwICs9IERpYWxvZy5jcmVhdGVGaWVsZFRleHQoIGZpZWxkQXJyYXlbaV0gKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgfQorICAgICAgICAgIGZpZWxkTWFya3VwICs9ICc8L2Rpdj4nOworICAgICAgICB9CisKKyAgICAgIH0KKyAgICAgIGZpZWxkTWFya3VwICs9ICc8L2ZpZWxkc2V0Pic7CisgICAgICByZXR1cm4gZmllbGRNYXJrdXA7CisgICAgfSwKKworICAgIGNyZWF0ZUZpZWxkVGV4dDogZnVuY3Rpb24oIGZpZWxkQXR0cmlidXRlcyApIHsKKyAgICAgIHZhciBodG1sID0gJyc7CisKKyAgICAgIGlmICggZmllbGRBdHRyaWJ1dGVzLm5hbWUgKSB7CisgICAgICAgIGh0bWwgKz0gJzxsYWJlbCc7CisgICAgICAgIGlmICggZmllbGRBdHRyaWJ1dGVzLmlkICkgeworICAgICAgICAgIGh0bWwgKz0gJyBmb3I9IicgKyBmaWVsZEF0dHJpYnV0ZXMubmFtZSArICciJzsKKyAgICAgICAgfQorICAgICAgICBodG1sICs9ICc+JyArIGZpZWxkQXR0cmlidXRlcy5uYW1lICsgJzwvbGFiZWw+JzsKKyAgICAgIH0KKworICAgICAgaHRtbCArPSAnPGlucHV0IHR5cGU9InRleHQiJzsKKworICAgICAgaWYgKCBmaWVsZEF0dHJpYnV0ZXMuaWQgKSB7CisgICAgICAgIGh0bWwgKz0gJyBuYW1lPSInICsgZmllbGRBdHRyaWJ1dGVzLmlkICsgJyInCisgICAgICAgIGlmICggZmllbGRBdHRyaWJ1dGVzLnR5cGUgPT0gJ2NvZGUnICkgeworICAgICAgICAgIGh0bWwrPSAnIGNsYXNzPSJjb2RlIic7CisgICAgICAgIH0KKyAgICAgICAgaHRtbCArPSAnIGlkPSJnb2xsdW0tZGlhbG9nLWRpYWxvZy1nZW5lcmF0ZWQtZmllbGQtJyArCisgICAgICAgICAgZmllbGRBdHRyaWJ1dGVzLmlkICsgJyI+JzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGh0bWw7CisgICAgfSwKKworICAgIGNyZWF0ZU1hcmt1cDogZnVuY3Rpb24oIHRpdGxlLCBib2R5ICkgeworICAgICAgRGlhbG9nLm1hcmt1cENyZWF0ZWQgPSB0cnVlOworICAgICAgaWYgKCQuZmFjZWJveCkgeworICAgICAgICByZXR1cm4gJzxkaXYgaWQ9ImdvbGx1bS1kaWFsb2ctZGlhbG9nIj4nICsKKyAgICAgICAgICAgICAgICc8ZGl2IGlkPSJnb2xsdW0tZGlhbG9nLWRpYWxvZy10aXRsZSI+PGg0PicgKworICAgICAgICAgICAgICAgdGl0bGUgKyc8L2g0PjwvZGl2PicgKworICAgICAgICAgICAgICAgJzxkaXYgaWQ9ImdvbGx1bS1kaWFsb2ctZGlhbG9nLWJvZHkiPicgKyBib2R5ICsgJzwvZGl2PicgKworICAgICAgICAgICAgICAgJzxkaXYgaWQ9ImdvbGx1bS1kaWFsb2ctZGlhbG9nLWJ1dHRvbnMiPicgKworICAgICAgICAgICAgICAgJzxhIGhyZWY9IiMiIHRpdGxlPSJDYW5jZWwiIGlkPSJnb2xsdW0tZGlhbG9nLWFjdGlvbi1jYW5jZWwiICcgKworICAgICAgICAgICAgICAgJ2NsYXNzPSJnb2xsdW0tbWluaWJ1dHRvbiI+Q2FuY2VsPC9hPicgKworICAgICAgICAgICAgICAgJzxhIGhyZWY9IiMiIHRpdGxlPSJPSyIgaWQ9ImdvbGx1bS1kaWFsb2ctYWN0aW9uLW9rIiAnKworICAgICAgICAgICAgICAgJ2NsYXNzPSJnb2xsdW0tbWluaWJ1dHRvbiI+T0s8L2E+JyArCisgICAgICAgICAgICAgICAnPC9kaXY+JyArCisgICAgICAgICAgICAgICAnPC9kaXY+JzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAnPGRpdiBpZD0iZ29sbHVtLWRpYWxvZy1kaWFsb2ciPicgKworICAgICAgICAgICAgICAgJzxkaXYgaWQ9ImdvbGx1bS1kaWFsb2ctZGlhbG9nLWlubmVyIj4nICsKKyAgICAgICAgICAgICAgICc8ZGl2IGlkPSJnb2xsdW0tZGlhbG9nLWRpYWxvZy1iZyI+JyArCisgICAgICAgICAgICAgICAnPGRpdiBpZD0iZ29sbHVtLWRpYWxvZy1kaWFsb2ctdGl0bGUiPjxoND4nICsKKyAgICAgICAgICAgICAgIHRpdGxlICsnPC9oND48L2Rpdj4nICsKKyAgICAgICAgICAgICAgICc8ZGl2IGlkPSJnb2xsdW0tZGlhbG9nLWRpYWxvZy1ib2R5Ij4nICsgYm9keSArICc8L2Rpdj4nICsKKyAgICAgICAgICAgICAgICc8ZGl2IGlkPSJnb2xsdW0tZGlhbG9nLWRpYWxvZy1idXR0b25zIj4nICsKKyAgICAgICAgICAgICAgICc8YSBocmVmPSIjIiB0aXRsZT0iQ2FuY2VsIiBpZD0iZ29sbHVtLWRpYWxvZy1hY3Rpb24tY2FuY2VsIiAnICsKKyAgICAgICAgICAgICAgICdjbGFzcz0ibWluaWJ1dHRvbiI+Q2FuY2VsPC9hPicgKworICAgICAgICAgICAgICAgJzxhIGhyZWY9IiMiIHRpdGxlPSJPSyIgaWQ9ImdvbGx1bS1kaWFsb2ctYWN0aW9uLW9rIiAnKworICAgICAgICAgICAgICAgJ2NsYXNzPSJtaW5pYnV0dG9uIj5PSzwvYT4nICsKKyAgICAgICAgICAgICAgICc8L2Rpdj4nICsKKyAgICAgICAgICAgICAgICc8L2Rpdj4nICsKKyAgICAgICAgICAgICAgICc8L2Rpdj4nICsKKyAgICAgICAgICAgICAgICc8L2Rpdj4nOworICAgICAgfQorICAgIH0sCisKKyAgICBldmVudENhbmNlbDogZnVuY3Rpb24oIGUgKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICBkZWJ1ZygnQ2FuY2VsbGVkIGRpYWxvZy4nKTsKKyAgICAgIERpYWxvZy5oaWRlKCk7CisgICAgfSwKKworICAgIGV2ZW50T0s6IGZ1bmN0aW9uKCBlLCBldnRPSyApIHsKKyAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKworICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICAgIC8vIGdldCB0aGUgcmVzdWx0cyBmcm9tIGVhY2ggZmllbGQgYW5kIGJ1aWxkIHRoZW0gaW50byB0aGUgb2JqZWN0CisgICAgICAkKCcjZ29sbHVtLWRpYWxvZy1kaWFsb2ctYm9keSBpbnB1dCcpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgIHJlc3VsdHNbJCh0aGlzKS5hdHRyKCduYW1lJyldID0gJCh0aGlzKS52YWwoKTsKKyAgICAgIH0pOworCisgICAgICAvLyBwYXNzIHRoZW0gdG8gZXZ0T0sgaWYgaXQgZXhpc3RzICh3aGljaCBpdCBzaG91bGQpCisgICAgICBpZiAoIGV2dE9LICYmCisgICAgICAgICAgIHR5cGVvZiBldnRPSyA9PSAnZnVuY3Rpb24nICkgeworICAgICAgICBldnRPSyggcmVzdWx0cyApOworICAgICAgfQorICAgICAgRGlhbG9nLmhpZGUoKTsKKyAgICB9LAorCisgICAgaGlkZTogZnVuY3Rpb24oKSB7CisgICAgICBpZiAoICQuZmFjZWJveCApIHsKKyAgICAgICAgRGlhbG9nLm1hcmt1cENyZWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcignY2xvc2UuZmFjZWJveCcpOworICAgICAgICBEaWFsb2cuZGV0YWNoRXZlbnRzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoICQuYnJvd3Nlci5tc2llICkgeworICAgICAgICAgICQoJyNnb2xsdW0tZGlhbG9nLWRpYWxvZycpLmhpZGUoKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CisgICAgICAgICAgJCgnc2VsZWN0JykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAkKCcjZ29sbHVtLWRpYWxvZy1kaWFsb2cnKS5hbmltYXRlKHsgb3BhY2l0eTogMCB9LCB7CisgICAgICAgICAgICBkdXJhdGlvbjogMjAwLAorICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAkKCcjZ29sbHVtLWRpYWxvZy1kaWFsb2cnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgaW5pdDogZnVuY3Rpb24oIGFyZ09iamVjdCApIHsKKyAgICAgIHZhciB0aXRsZSA9ICcnOworICAgICAgdmFyIGJvZHkgPSAnJzsKKworICAgICAgLy8gYmFpbCBvdXQgaWYgbmVjZXNzYXJ5CisgICAgICBpZiAoICFhcmdPYmplY3QgfHwKKyAgICAgICAgICAgdHlwZW9mIGFyZ09iamVjdCAhPSAnb2JqZWN0JyApIHsKKyAgICAgICAgZGVidWcoJ0VkaXRvciBEaWFsb2c6IENhbm5vdCBpbml0OyBpbnZhbGlkIGluaXQgb2JqZWN0Jyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCBhcmdPYmplY3QuYm9keSAmJiB0eXBlb2YgYXJnT2JqZWN0LmJvZHkgPT0gJ3N0cmluZycgKSB7CisgICAgICAgIGJvZHkgPSAnPHA+JyArIGFyZ09iamVjdC5ib2R5ICsgJzwvcD4nOworICAgICAgfQorCisgICAgICAvLyBhbHJpZ2h0LCBidWlsZCBvdXQgZmllbGRzCisgICAgICBpZiAoIGFyZ09iamVjdC5maWVsZHMgJiYgdHlwZW9mIGFyZ09iamVjdC5maWVsZHMgPT0gJ29iamVjdCcgKSB7CisgICAgICAgIGJvZHkgKz0gRGlhbG9nLmNyZWF0ZUZpZWxkTWFya3VwKCBhcmdPYmplY3QuZmllbGRzICk7CisgICAgICB9CisKKyAgICAgIGlmICggYXJnT2JqZWN0LnRpdGxlICYmIHR5cGVvZiBhcmdPYmplY3QudGl0bGUgPT0gJ3N0cmluZycgKSB7CisgICAgICAgIHRpdGxlID0gYXJnT2JqZWN0LnRpdGxlOworICAgICAgfQorCisgICAgICBpZiAoIERpYWxvZy5tYXJrdXBDcmVhdGVkICkgeworICAgICAgICBpZiAoJC5mYWNlYm94KSB7CisgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcignY2xvc2UuZmFjZWJveCcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICQoJyNnb2xsdW0tZGlhbG9nLWRpYWxvZycpLnJlbW92ZSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIERpYWxvZy5tYXJrdXAgPSBEaWFsb2cuY3JlYXRlTWFya3VwKCB0aXRsZSwgYm9keSApOworCisgICAgICBpZiAoJC5mYWNlYm94KSB7CisgICAgICAgICQoZG9jdW1lbnQpLmJpbmQoJ3JldmVhbC5mYWNlYm94JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgaWYgKCBhcmdPYmplY3QuT0sgJiYKKyAgICAgICAgICAgICAgIHR5cGVvZiBhcmdPYmplY3QuT0sgPT0gJ2Z1bmN0aW9uJyApIHsKKyAgICAgICAgICAgIERpYWxvZy5hdHRhY2hFdmVudHMoIGFyZ09iamVjdC5PSyApOworICAgICAgICAgICAgJCgkKCcjZmFjZWJveCBpbnB1dFt0eXBlPSJ0ZXh0Il0nKS5nZXQoMCkpLmZvY3VzKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoIERpYWxvZy5tYXJrdXAgKTsKKyAgICAgICAgaWYgKCBhcmdPYmplY3QuT0sgJiYKKyAgICAgICAgICAgICB0eXBlb2YgYXJnT2JqZWN0Lk9LID09ICdmdW5jdGlvbicgKSB7CisgICAgICAgICAgRGlhbG9nLmF0dGFjaEV2ZW50cyggYXJnT2JqZWN0Lk9LICk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgRGlhbG9nLnNob3coKTsKKyAgICB9LAorCisgICAgc2hvdzogZnVuY3Rpb24oKSB7CisgICAgICBpZiAoICFEaWFsb2cubWFya3VwQ3JlYXRlZCApIHsKKyAgICAgICAgZGVidWcoJ0RpYWxvZzogTm8gbWFya3VwIHRvIHNob3cuIFBsZWFzZSB1c2UgaW5pdCBmaXJzdC4nKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKCdTaG93aW5nIGRpYWxvZycpOworICAgICAgICBpZiAoJC5mYWNlYm94KSB7CisgICAgICAgICAgJC5mYWNlYm94KCBEaWFsb2cubWFya3VwICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCAkLmJyb3dzZXIubXNpZSApIHsKKyAgICAgICAgICAgICQoJyNnb2xsdW0tZGlhbG9nLmRpYWxvZycpLmFkZENsYXNzKCdhY3RpdmUnKTsKKyAgICAgICAgICAgIERpYWxvZy5wb3NpdGlvbigpOworICAgICAgICAgICAgJCgnc2VsZWN0JykuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkKCcjZ29sbHVtLWRpYWxvZy5kaWFsb2cnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOworICAgICAgICAgICAgJCgnI2dvbGx1bS1kaWFsb2ctZGlhbG9nJykuYW5pbWF0ZSh7IG9wYWNpdHk6IDAgfSwgeworICAgICAgICAgICAgICBkdXJhdGlvbjogMCwKKyAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICQoJyNnb2xsdW0tZGlhbG9nLWRpYWxvZycpLmNzcygnZGlzcGxheScsICdibG9jaycpOworICAgICAgICAgICAgICAgIERpYWxvZy5wb3NpdGlvbigpOyAvLyBwb3NpdGlvbiB0aGlzIHRoaW5nCisgICAgICAgICAgICAgICAgJCgnI2dvbGx1bS1kaWFsb2ctZGlhbG9nJykuYW5pbWF0ZSh7IG9wYWNpdHk6IDEgfSwgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBkaWFsb2dIZWlnaHQgPSAkKCcjZ29sbHVtLWRpYWxvZy1kaWFsb2ctaW5uZXInKS5oZWlnaHQoKTsKKyAgICAgICQoJyNnb2xsdW0tZGlhbG9nLWRpYWxvZy1pbm5lcicpCisgICAgICAgIC5jc3MoJ2hlaWdodCcsIGRpYWxvZ0hlaWdodCArICdweCcpOworICAgIH0KKyAgfTsKKworICBpZiAoJC5mYWNlYm94KSB7CisgICAgJChkb2N1bWVudCkuYmluZCgncmV2ZWFsLmZhY2Vib3gnLCBmdW5jdGlvbigpIHsKKyAgICAgICQoJyNmYWNlYm94IGltZy5jbG9zZV9pbWFnZScpLnJlbW92ZSgpOworICAgIH0pOworICB9CisKKyAgdmFyIGRlYnVnID0gZnVuY3Rpb24obSkgeworICAgIGlmICggRGlhbG9nLmRlYnVnT24KKyAgICAgICAgICYmIHR5cGVvZiBjb25zb2xlICE9ICd1bmRlZmluZWQnICkgeworICAgICAgY29uc29sZS5sb2coIG0gKTsKKyAgICB9CisgIH07CisKKyAgJC5Hb2xsdW1EaWFsb2cgPSBEaWFsb2c7CisKK30pKGpRdWVyeSk7CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9nb2xsdW0uanMgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9nb2xsdW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjY2EwYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL2dvbGx1bS5qcwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIHVhCiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgdmFyIG5vZGVTZWxlY3RvciA9IHsKKyAgICBub2RlMTogbnVsbCwKKyAgICBub2RlMjogbnVsbCwKKworICAgIHNlbGVjdE5vZGVSYW5nZTogZnVuY3Rpb24oIG4xLCBuMiApIHsKKyAgICAgIGlmICggbm9kZVNlbGVjdG9yLm5vZGUxICYmIG5vZGVTZWxlY3Rvci5ub2RlMiApIHsKKyAgICAgICAgJCgnI3dpa2ktaGlzdG9yeSB0ZC5zZWxlY3RlZCcpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOworICAgICAgICBub2RlU2VsZWN0b3Iubm9kZTEuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMi5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKKworICAgICAgICAvLyBzd2FwIHRoZSBub2RlcyBhcm91bmQgaWYgdGhleSB3ZW50IGluIHJldmVyc2UKKyAgICAgICAgaWYgKCBub2RlU2VsZWN0b3Iubm9kZUNvbWVzQWZ0ZXIoIG5vZGVTZWxlY3Rvci5ub2RlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMiApICkgeworICAgICAgICAgIHZhciBuID0gbm9kZVNlbGVjdG9yLm5vZGUxOworICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMSA9IG5vZGVTZWxlY3Rvci5ub2RlMjsKKyAgICAgICAgICBub2RlU2VsZWN0b3Iubm9kZTIgPSBuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHMgPSB0cnVlOworICAgICAgICB2YXIgJG5leHROb2RlID0gbm9kZVNlbGVjdG9yLm5vZGUxLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKCAkbmV4dE5vZGUgKSB7CisgICAgICAgICAgJG5leHROb2RlLmFkZENsYXNzKCdzZWxlY3RlZCcpOworICAgICAgICAgIGlmICggJG5leHROb2RlWzBdID09IG5vZGVTZWxlY3Rvci5ub2RlMlswXSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAkbmV4dE5vZGUgPSAkbmV4dE5vZGUubmV4dCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIG5vZGVDb21lc0FmdGVyOiBmdW5jdGlvbiAoIG4xLCBuMiApIHsKKyAgICAgIHZhciBzID0gZmFsc2U7CisgICAgICAkKG4xKS5wcmV2QWxsKCkuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAkKHRoaXMpWzBdID09ICQobjIpWzBdICkgeworICAgICAgICAgIHMgPSB0cnVlOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiBzOworICAgIH0sCisKKyAgICBjaGVja05vZGU6IGZ1bmN0aW9uKCBub2RlQ2hlY2tib3ggKSB7CisgICAgICB2YXIgJG5vZGVDaGVja2JveCA9IG5vZGVDaGVja2JveDsKKyAgICAgIHZhciAkbm9kZSA9ICQobm9kZUNoZWNrYm94KS5wYXJlbnQoKS5wYXJlbnQoKTsKKyAgICAgIC8vIGlmIHdlJ3JlIHVuY2hlY2tpbmcKKyAgICAgIGlmICggISRub2RlQ2hlY2tib3guaXMoJzpjaGVja2VkJykgKSB7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSByYW5nZSwgc2luY2Ugd2UncmUgYnJlYWtpbmcgaXQKKyAgICAgICAgJCgnI3dpa2ktaGlzdG9yeSB0ci5zZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAgaWYgKCAkKHRoaXMpLmZpbmQoJ3RkLmNoZWNrYm94IGlucHV0JykuaXMoJzpjaGVja2VkJykgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIG5vIGxvbmdlciB0cmFjayB0aGlzCisgICAgICAgIGlmICggJG5vZGVbMF0gPT0gbm9kZVNlbGVjdG9yLm5vZGUxWzBdICkgeworICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMSA9IG51bGw7CisgICAgICAgICAgaWYgKCBub2RlU2VsZWN0b3Iubm9kZTIgKSB7CisgICAgICAgICAgICBub2RlU2VsZWN0b3Iubm9kZTEgPSBub2RlU2VsZWN0b3Iubm9kZTI7CisgICAgICAgICAgICBub2RlU2VsZWN0b3Iubm9kZTIgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICggJG5vZGVbMF0gPT0gbm9kZVNlbGVjdG9yLm5vZGUyWzBdICkgeworICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAhbm9kZVNlbGVjdG9yLm5vZGUxICkgeworICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMSA9ICRub2RlOworICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICAgICAgfSBlbHNlIGlmICggIW5vZGVTZWxlY3Rvci5ub2RlMiApIHsKKyAgICAgICAgICAvLyBva2F5LCB3ZSBkb24ndCBoYXZlIGEgbm9kZSAyIGJ1dCBoYXZlIGEgbm9kZTEKKyAgICAgICAgICBub2RlU2VsZWN0b3Iubm9kZTIgPSAkbm9kZTsKKyAgICAgICAgICBub2RlU2VsZWN0b3Iubm9kZTIuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgICAgICAgbm9kZVNlbGVjdG9yLnNlbGVjdE5vZGVSYW5nZSggbm9kZVNlbGVjdG9yLm5vZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVTZWxlY3Rvci5ub2RlMiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIHdlIGhhdmUgdHdvIHNlbGVjdGVkIGFscmVhZHkKKyAgICAgICAgICAkbm9kZUNoZWNrYm94WzBdLmNoZWNrZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICAvLyB1YSBkZXRlY3Rpb24KKyAgaWYgKCQuYnJvd3Nlci5tb3ppbGxhKSB7CisgICAgJCgnYm9keScpLmFkZENsYXNzKCdmZicpOworICB9IGVsc2UgaWYgKCQuYnJvd3Nlci53ZWJraXQpIHsKKyAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3dlYmtpdCcpOworICB9IGVsc2UgaWYgKCQuYnJvd3Nlci5tc2llKSB7CisgICAgJCgnYm9keScpLmFkZENsYXNzKCdpZScpOworICAgIGlmICgkLmJyb3dzZXIudmVyc2lvbiA9PSAiNy4wIikgeworICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdpZTcnKTsKKyAgICB9IGVsc2UgaWYgKCQuYnJvd3Nlci52ZXJzaW9uID09ICI4LjAiKSB7CisgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ2llOCcpOworICAgIH0KKyAgfQorCisgIGlmICgkKCcjbWluaWJ1dHRvbi1uZXctcGFnZScpLmxlbmd0aCkgeworICAgICQoJyNtaW5pYnV0dG9uLW5ldy1wYWdlJykucmVtb3ZlQ2xhc3MoJ2phd3MnKTsKKyAgICAkKCcjbWluaWJ1dHRvbi1uZXctcGFnZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKKyAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgICQuR29sbHVtRGlhbG9nLmluaXQoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBQYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICAgJ25hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnUGFnZSBOYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSzogZnVuY3Rpb24oIHJlcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ05ldyBQYWdlJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzWyduYW1lJ10gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHJlc1snbmFtZSddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGVuY29kZVVSSUNvbXBvbmVudCggbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJy8nICsgbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgaWYgKCQoJyN3aWtpLXdyYXBwZXInKS5oYXNDbGFzcygnaGlzdG9yeScpKSB7CisgICAgJCgnI3dpa2ktaGlzdG9yeSB0ZC5jaGVja2JveCBpbnB1dCcpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICBub2RlU2VsZWN0b3IuY2hlY2tOb2RlKCQodGhpcykpOworICAgICAgfSk7CisgICAgICBpZiAoICQodGhpcykuaXMoJzpjaGVja2VkJykgKSB7CisgICAgICAgIG5vZGVTZWxlY3Rvci5jaGVja05vZGUoJCh0aGlzKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAoJCgnLmhpc3RvcnkgYS5hY3Rpb24tY29tcGFyZS1yZXZpc2lvbicpLmxlbmd0aCkgeworICAgICAgJCgnLmhpc3RvcnkgYS5hY3Rpb24tY29tcGFyZS1yZXZpc2lvbicpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAkKCIjdmVyc2lvbi1mb3JtIikuc3VibWl0KCk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBpZiAoJCgnI3NlYXJjaGJhciBhI3NlYXJjaC1zdWJtaXQnKS5sZW5ndGgpIHsKKyAgICAkLkdvbGx1bVBsYWNlaG9sZGVyLmFkZCgkKCcjc2VhcmNoYmFyICNzZWFyY2gtcXVlcnknKSk7CisgICAgJCgnI3NlYXJjaGJhciBhI3NlYXJjaC1zdWJtaXQnKS5jbGljayhmdW5jdGlvbihlKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAkKCcjc2VhcmNoYmFyICNzZWFyY2gtZm9ybScpWzBdLnN1Ym1pdCgpOworICAgIH0pOworICAgICQoJyNzZWFyY2hiYXIgI3NlYXJjaC1mb3JtJykuc3VibWl0KGZ1bmN0aW9uKGUpIHsKKyAgICAgICQuR29sbHVtUGxhY2Vob2xkZXIuY2xlYXJBbGwoKTsKKyAgICAgICQodGhpcykudW5iaW5kKCdzdWJtaXQnKTsKKyAgICAgICQodGhpcykuc3VibWl0KCk7CisgICAgfSk7CisgIH0KKworICBpZiAoJCgnI2dvbGx1bS1yZXZlcnQtZm9ybScpLmxlbmd0aCAmJgorICAgICAgJCgnLmdvbGx1bS1yZXZlcnQtYnV0dG9uJykubGVuZ3RoICkgeworICAgICQoJ2EuZ29sbHVtLXJldmVydC1idXR0b24nKS5jbGljayhmdW5jdGlvbihlKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAkKCcjZ29sbHVtLXJldmVydC1mb3JtJykuc3VibWl0KCk7CisgICAgfSk7CisgIH0KK30pOwpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvanMvZ29sbHVtLnBsYWNlaG9sZGVyLmpzIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvanMvZ29sbHVtLnBsYWNlaG9sZGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmYxYmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9nb2xsdW0ucGxhY2Vob2xkZXIuanMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyhmdW5jdGlvbigkKSB7CisKKyAgdmFyIFBsYWNlaG9sZGVyID0geworICAgCisgICAgIF9QTEFDRUhPTERFUlMgOiBbXSwKKyAgIAorICAgIF9wIDogZnVuY3Rpb24oICRmaWVsZCApIHsKKyAgICAKKyAgICAgICB0aGlzLmZpZWxkT2JqZWN0ID0gJGZpZWxkOyAKKyAgICAgICB0aGlzLnBsYWNlaG9sZGVyVGV4dCA9ICRmaWVsZC52YWwoKTsKKyAgICAgICB2YXIgcGxhY2Vob2xkZXJUZXh0ID0gJGZpZWxkLnZhbCgpOworICAgICAKKyAgICAgICAkZmllbGQuYWRkQ2xhc3MoJ3BoJyk7CisgICAgIAorICAgICAgICRmaWVsZC5ibHVyKGZ1bmN0aW9uKCkgeworICAgICAgICAgaWYgKCAkKHRoaXMpLnZhbCgpID09ICcnICkgeworICAgICAgICAgICAkKHRoaXMpLnZhbCggcGxhY2Vob2xkZXJUZXh0ICk7CisgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ3BoJyk7CisgICAgICAgICB9CisgICAgICAgfSk7CisgICAgIAorICAgICAgICRmaWVsZC5mb2N1cyhmdW5jdGlvbigpIHsKKyAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ3BoJyk7CisgICAgICAgICBpZiAoICQodGhpcykudmFsKCkgPT0gcGxhY2Vob2xkZXJUZXh0ICkgeworICAgICAgICAgICAkKHRoaXMpLnZhbCgnJyk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAkKHRoaXMpWzBdLnNlbGVjdCgpOworICAgICAgICAgfQorICAgICAgIH0pOworICAgICAKKyAgICAgfSwKKyAgIAorICAgICBhZGQgOiBmdW5jdGlvbiggJGZpZWxkICkgeworICAgICAgIFBsYWNlaG9sZGVyLl9QTEFDRUhPTERFUlMucHVzaCggbmV3IFBsYWNlaG9sZGVyLl9wKCAkZmllbGQgKSApOworICAgICB9LAorICAgCisgICAgIGNsZWFyQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgUGxhY2Vob2xkZXIuX1BMQUNFSE9MREVSUy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgIGlmICggUGxhY2Vob2xkZXIuX1BMQUNFSE9MREVSU1tpXS5maWVsZE9iamVjdC52YWwoKSA9PSAKKyAgICAgICAgICAgICAgUGxhY2Vob2xkZXIuX1BMQUNFSE9MREVSU1tpXS5wbGFjZWhvbGRlclRleHQgKSB7CisgICAgICAgICAgIFBsYWNlaG9sZGVyLl9QTEFDRUhPTERFUlNbaV0uZmllbGRPYmplY3QudmFsKCcnKTsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0sCisgICAKKyAgICAgZXhpc3RzIDogZnVuY3Rpb24oKSB7CisgICAgICAgcmV0dXJuICggX1BMQUNFSE9MREVSUy5sZW5ndGggKTsKKyAgICAgfQorICAgCisgfTsKKyAKKyAkLkdvbGx1bVBsYWNlaG9sZGVyID0gUGxhY2Vob2xkZXI7CisgCit9KShqUXVlcnkpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL2pxdWVyeS0xLjcuMi5taW4uanMgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9qcXVlcnktMS43LjIubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWRlYTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3N0YXRpYy9qcy9qcXVlcnktMS43LjIubWluLmpzCkBAIC0wLDAgKzEsNCBAQAorLyohIGpRdWVyeSB2MS43LjIganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLworKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gY3koYSl7cmV0dXJuIGYuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1mdW5jdGlvbiBjdShhKXtpZighY2pbYV0pe3ZhciBiPWMuYm9keSxkPWYoIjwiK2ErIj4iKS5hcHBlbmRUbyhiKSxlPWQuY3NzKCJkaXNwbGF5Iik7ZC5yZW1vdmUoKTtpZihlPT09Im5vbmUifHxlPT09IiIpe2NrfHwoY2s9Yy5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxjay5mcmFtZUJvcmRlcj1jay53aWR0aD1jay5oZWlnaHQ9MCksYi5hcHBlbmRDaGlsZChjayk7aWYoIWNsfHwhY2suY3JlYXRlRWxlbWVudCljbD0oY2suY29udGVudFdpbmRvd3x8Y2suY29udGVudERvY3VtZW50KS5kb2N1bWVudCxjbC53cml0ZSgoZi5zdXBwb3J0LmJveE1vZGVsPyI8IWRvY3R5cGUgaHRtbD4iOiIiKSsiPGh0bWw+PGJvZHk+IiksY2wuY2xvc2UoKTtkPWNsLmNyZWF0ZUVsZW1lbnQoYSksY2wuYm9keS5hcHBlbmRDaGlsZChkKSxlPWYuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKGNrKX1jalthXT1lfXJldHVybiBjalthXX1mdW5jdGlvbiBjdChhLGIpe3ZhciBjPXt9O2YuZWFjaChjcC5jb25jYXQuYXBwbHkoW10sY3Auc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtjW3RoaXNdPWF9KTtyZXR1cm4gY31mdW5jdGlvbiBjcygpe2NxPWJ9ZnVuY3Rpb24gY3IoKXtzZXRUaW1lb3V0KGNzLDApO3JldHVybiBjcT1mLm5vdygpfWZ1bmN0aW9uIGNpKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gY2goKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY2IoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZD1hLmRhdGFUeXBlcyxlPXt9LGcsaCxpPWQubGVuZ3RoLGosaz1kWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09InN0cmluZyImJihlW2gudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2hdKTtsPWssaz1kW2ddO2lmKGs9PT0iKiIpaz1sO2Vsc2UgaWYobCE9PSIqIiYmbCE9PWspe209bCsiICIrayxuPWVbbV18fGVbIiogIitrXTtpZighbil7cD1iO2ZvcihvIGluIGUpe2o9by5zcGxpdCgiICIpO2lmKGpbMF09PT1sfHxqWzBdPT09IioiKXtwPWVbalsxXSsiICIra107aWYocCl7bz1lW29dLG89PT0hMD9uPXA6cD09PSEwJiYobj1vKTticmVha319fX0hbiYmIXAmJmYuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK20ucmVwbGFjZSgiICIsIiB0byAiKSksbiE9PSEwJiYoYz1uP24oYyk6cChvKGMpKSl9fXJldHVybiBjfWZ1bmN0aW9uIGNhKGEsYyxkKXt2YXIgZT1hLmNvbnRlbnRzLGY9YS5kYXRhVHlwZXMsZz1hLnJlc3BvbnNlRmllbGRzLGgsaSxqLGs7Zm9yKGkgaW4gZylpIGluIGQmJihjW2dbaV1dPWRbaV0pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGg9PT1iJiYoaD1hLm1pbWVUeXBlfHxjLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaClmb3IoaSBpbiBlKWlmKGVbaV0mJmVbaV0udGVzdChoKSl7Zi51bnNoaWZ0KGkpO2JyZWFrfWlmKGZbMF1pbiBkKWo9ZlswXTtlbHNle2ZvcihpIGluIGQpe2lmKCFmWzBdfHxhLmNvbnZlcnRlcnNbaSsiICIrZlswXV0pe2o9aTticmVha31rfHwoaz1pKX1qPWp8fGt9aWYoail7aiE9PWZbMF0mJmYudW5zaGlmdChqKTtyZXR1cm4gZFtqXX19ZnVuY3Rpb24gYl8oYSxiLGMsZCl7aWYoZi5pc0FycmF5KGIpKWYuZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8YkQudGVzdChhKT9kKGEsZSk6Yl8oYSsiWyIrKHR5cGVvZiBlPT0ib2JqZWN0Ij9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZighYyYmZi50eXBlKGIpPT09Im9iamVjdCIpZm9yKHZhciBlIGluIGIpYl8oYSsiWyIrZSsiXSIsYltlXSxjLGQpO2Vsc2UgZChhLGIpfWZ1bmN0aW9uIGIkKGEsYyl7dmFyIGQsZSxnPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBjKWNbZF0hPT1iJiYoKGdbZF0/YTplfHwoZT17fSkpW2RdPWNbZF0pO2UmJmYuZXh0ZW5kKCEwLGEsZSl9ZnVuY3Rpb24gYlooYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJTLGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9YlooYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9YlooYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJZKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYk8pLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiQihhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiPzE6MCxnPTQ7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtlPGc7ZSs9MiljfHwoZC09cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIitieFtlXSkpfHwwKSxjPT09Im1hcmdpbiI/ZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrYnhbZV0pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrYnhbZV0rIldpZHRoIikpfHwwO3JldHVybiBkKyJweCJ9ZD1ieShhLGIpO2lmKGQ8MHx8ZD09bnVsbClkPWEuc3R5bGVbYl07aWYoYnQudGVzdChkKSlyZXR1cm4gZDtkPXBhcnNlRmxvYXQoZCl8fDA7aWYoYylmb3IoO2U8ZztlKz0yKWQrPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrYnhbZV0pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2J4W2VdKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrYnhbZV0pKXx8MCk7cmV0dXJuIGQrInB4In1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2Iubm9kZVR5cGU9PT0xJiYoYi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGM9PT0ib2JqZWN0Ij9iLm91dGVySFRNTD1hLm91dGVySFRNTDpjIT09ImlucHV0Inx8YS50eXBlIT09ImNoZWNrYm94IiYmYS50eXBlIT09InJhZGlvIj9jPT09Im9wdGlvbiI/Yi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDpjPT09ImlucHV0Inx8Yz09PSJ0ZXh0YXJlYSI/Yi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWU6Yz09PSJzY3JpcHQiJiZiLnRleHQhPT1hLnRleHQmJihiLnRleHQ9YS50ZXh0KTooYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpLGIucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyksYi5yZW1vdmVBdHRyaWJ1dGUoIl9zdWJtaXRfYXR0YWNoZWQiKSxiLnJlbW92ZUF0dHJpYnV0ZSgiX2NoYW5nZV9hdHRhY2hlZCIpKX1mdW5jdGlvbiBiaihhLGIpe2lmKGIubm9kZVR5cGU9PT0xJiYhIWYuaGFzRGF0YShhKSl7dmFyIGMsZCxlLGc9Zi5fZGF0YShhKSxoPWYuX2RhdGEoYixnKSxpPWcuZXZlbnRzO2lmKGkpe2RlbGV0ZSBoLmhhbmRsZSxoLmV2ZW50cz17fTtmb3IoYyBpbiBpKWZvcihkPTAsZT1pW2NdLmxlbmd0aDtkPGU7ZCsrKWYuZXZlbnQuYWRkKGIsYyxpW2NdW2RdKX1oLmRhdGEmJihoLmRhdGE9Zi5leHRlbmQoe30saC5kYXRhKSl9fWZ1bmN0aW9uIGJpKGEsYil7cmV0dXJuIGYubm9kZU5hbWUoYSwidGFibGUiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIFUoYSl7dmFyIGI9Vi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY31mdW5jdGlvbiBUKGEsYixjKXtiPWJ8fDA7aWYoZi5pc0Z1bmN0aW9uKGIpKXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3ZhciBlPSEhYi5jYWxsKGEsZCxhKTtyZXR1cm4gZT09PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBhPT09Yj09PWN9KTtpZih0eXBlb2YgYj09InN0cmluZyIpe3ZhciBkPWYuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09MX0pO2lmKE8udGVzdChiKSlyZXR1cm4gZi5maWx0ZXIoYixkLCFjKTtiPWYuZmlsdGVyKGIsZCl9cmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGYuaW5BcnJheShhLGIpPj0wPT09Y30pfWZ1bmN0aW9uIFMoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIEsoKXtyZXR1cm4hMH1mdW5jdGlvbiBKKCl7cmV0dXJuITF9ZnVuY3Rpb24gbihhLGIsYyl7dmFyIGQ9YisiZGVmZXIiLGU9YisicXVldWUiLGc9YisibWFyayIsaD1mLl9kYXRhKGEsZCk7aCYmKGM9PT0icXVldWUifHwhZi5fZGF0YShhLGUpKSYmKGM9PT0ibWFyayJ8fCFmLl9kYXRhKGEsZykpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IWYuX2RhdGEoYSxlKSYmIWYuX2RhdGEoYSxnKSYmKGYucmVtb3ZlRGF0YShhLGQsITApLGguZmlyZSgpKX0sMCl9ZnVuY3Rpb24gbShhKXtmb3IodmFyIGIgaW4gYSl7aWYoYj09PSJkYXRhIiYmZi5pc0VtcHR5T2JqZWN0KGFbYl0pKWNvbnRpbnVlO2lmKGIhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBsKGEsYyxkKXtpZihkPT09YiYmYS5ub2RlVHlwZT09PTEpe3ZhciBlPSJkYXRhLSIrYy5yZXBsYWNlKGssIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZD1hLmdldEF0dHJpYnV0ZShlKTtpZih0eXBlb2YgZD09InN0cmluZyIpe3RyeXtkPWQ9PT0idHJ1ZSI/ITA6ZD09PSJmYWxzZSI/ITE6ZD09PSJudWxsIj9udWxsOmYuaXNOdW1lcmljKGQpPytkOmoudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkfWNhdGNoKGcpe31mLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIGgoYSl7dmFyIGI9Z1thXT17fSxjLGQ7YT1hLnNwbGl0KC9ccysvKTtmb3IoYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliW2FbY11dPSEwO3JldHVybiBifXZhciBjPWEuZG9jdW1lbnQsZD1hLm5hdmlnYXRvcixlPWEubG9jYXRpb24sZj1mdW5jdGlvbigpe2Z1bmN0aW9uIEooKXtpZighZS5pc1JlYWR5KXt0cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChhKXtzZXRUaW1lb3V0KEosMSk7cmV0dXJufWUucmVhZHkoKX19dmFyIGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGUuZm4uaW5pdChhLGIsaCl9LGY9YS5qUXVlcnksZz1hLiQsaCxpPS9eKD86W14jPF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLyxqPS9cUy8saz0vXlxzKy8sbD0vXHMrJC8sbT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLG49L15bXF0sOnt9XHNdKiQvLG89L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyxwPS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxxPS8oPzpefDp8LCkoPzpccypcWykrL2cscj0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxzPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyx0PS8obXNpZSkgKFtcdy5dKykvLHU9Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/Lyx2PS8tKFthLXpdfFswLTldKS9pZyx3PS9eLW1zLS8seD1mdW5jdGlvbihhLGIpe3JldHVybihiKyIiKS50b1VwcGVyQ2FzZSgpfSx5PWQudXNlckFnZW50LHosQSxCLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxEPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksRT1BcnJheS5wcm90b3R5cGUucHVzaCxGPUFycmF5LnByb3RvdHlwZS5zbGljZSxHPVN0cmluZy5wcm90b3R5cGUudHJpbSxIPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLEk9e307ZS5mbj1lLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZSxpbml0OmZ1bmN0aW9uKGEsZCxmKXt2YXIgZyxoLGosaztpZighYSlyZXR1cm4gdGhpcztpZihhLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoYT09PSJib2R5IiYmIWQmJmMuYm9keSl7dGhpcy5jb250ZXh0PWMsdGhpc1swXT1jLmJvZHksdGhpcy5zZWxlY3Rvcj1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKSE9PSI8Inx8YS5jaGFyQXQoYS5sZW5ndGgtMSkhPT0iPiJ8fGEubGVuZ3RoPDM/Zz1pLmV4ZWMoYSk6Zz1bbnVsbCxhLG51bGxdO2lmKGcmJihnWzFdfHwhZCkpe2lmKGdbMV0pe2Q9ZCBpbnN0YW5jZW9mIGU/ZFswXTpkLGs9ZD9kLm93bmVyRG9jdW1lbnR8fGQ6YyxqPW0uZXhlYyhhKSxqP2UuaXNQbGFpbk9iamVjdChkKT8oYT1bYy5jcmVhdGVFbGVtZW50KGpbMV0pXSxlLmZuLmF0dHIuY2FsbChhLGQsITApKTphPVtrLmNyZWF0ZUVsZW1lbnQoalsxXSldOihqPWUuYnVpbGRGcmFnbWVudChbZ1sxXV0sW2tdKSxhPShqLmNhY2hlYWJsZT9lLmNsb25lKGouZnJhZ21lbnQpOmouZnJhZ21lbnQpLmNoaWxkTm9kZXMpO3JldHVybiBlLm1lcmdlKHRoaXMsYSl9aD1jLmdldEVsZW1lbnRCeUlkKGdbMl0pO2lmKGgmJmgucGFyZW50Tm9kZSl7aWYoaC5pZCE9PWdbMl0pcmV0dXJuIGYuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09aH10aGlzLmNvbnRleHQ9Yyx0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9cmV0dXJuIWR8fGQuanF1ZXJ5PyhkfHxmKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoZCkuZmluZChhKX1pZihlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGYucmVhZHkoYSk7YS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCk7cmV0dXJuIGUubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS43LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gRi5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY29uc3RydWN0b3IoKTtlLmlzQXJyYXkoYSk/RS5hcHBseShkLGEpOmUubWVyZ2UoZCxhKSxkLnByZXZPYmplY3Q9dGhpcyxkLmNvbnRleHQ9dGhpcy5jb250ZXh0LGI9PT0iZmluZCI/ZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrYzpiJiYoZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIitiKyIoIitjKyIpIik7cmV0dXJuIGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7ZS5iaW5kUmVhZHkoKSxBLmFkZChhKTtyZXR1cm4gdGhpc30sZXE6ZnVuY3Rpb24oYSl7YT0rYTtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLGErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEYuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsRi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhlLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6RSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sZS5mbi5pbml0LnByb3RvdHlwZT1lLmZuLGUuZXh0ZW5kPWUuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGYsZyxoLGk9YXJndW1lbnRzWzBdfHx7fSxqPTEsaz1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIGk9PSJib29sZWFuIiYmKGw9aSxpPWFyZ3VtZW50c1sxXXx8e30saj0yKSx0eXBlb2YgaSE9Im9iamVjdCImJiFlLmlzRnVuY3Rpb24oaSkmJihpPXt9KSxrPT09aiYmKGk9dGhpcywtLWopO2Zvcig7ajxrO2orKylpZigoYT1hcmd1bWVudHNbal0pIT1udWxsKWZvcihjIGluIGEpe2Q9aVtjXSxmPWFbY107aWYoaT09PWYpY29udGludWU7bCYmZiYmKGUuaXNQbGFpbk9iamVjdChmKXx8KGc9ZS5pc0FycmF5KGYpKSk/KGc/KGc9ITEsaD1kJiZlLmlzQXJyYXkoZCk/ZDpbXSk6aD1kJiZlLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxpW2NdPWUuZXh0ZW5kKGwsaCxmKSk6ZiE9PWImJihpW2NdPWYpfXJldHVybiBpfSxlLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXthLiQ9PT1lJiYoYS4kPWcpLGImJmEualF1ZXJ5PT09ZSYmKGEualF1ZXJ5PWYpO3JldHVybiBlfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP2UucmVhZHlXYWl0Kys6ZS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMCYmIS0tZS5yZWFkeVdhaXR8fGEhPT0hMCYmIWUuaXNSZWFkeSl7aWYoIWMuYm9keSlyZXR1cm4gc2V0VGltZW91dChlLnJlYWR5LDEpO2UuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tZS5yZWFkeVdhaXQ+MClyZXR1cm47QS5maXJlV2l0aChjLFtlXSksZS5mbi50cmlnZ2VyJiZlKGMpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIUEpe0E9ZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iik7aWYoYy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gc2V0VGltZW91dChlLnJlYWR5LDEpO2lmKGMuYWRkRXZlbnRMaXN0ZW5lciljLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZS5yZWFkeSwhMSk7ZWxzZSBpZihjLmF0dGFjaEV2ZW50KXtjLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEIpLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsZS5yZWFkeSk7dmFyIGI9ITE7dHJ5e2I9YS5mcmFtZUVsZW1lbnQ9PW51bGx9Y2F0Y2goZCl7fWMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZiJiZKKCl9fX0saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gZS50eXBlKGEpPT09ImZ1bmN0aW9uIn0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gZS50eXBlKGEpPT09ImFycmF5In0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPW51bGwmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe2lmKHR5cGVvZiBjIT0ic3RyaW5nInx8IWMpcmV0dXJuIG51bGw7dmFyIGQsZjt0cnl7YS5ET01QYXJzZXI/KGY9bmV3IERPTVBhcnNlcixkPWYucGFyc2VGcm9tU3RyaW5nKGMsInRleHQveG1sIikpOihkPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksZC5hc3luYz0iZmFsc2UiLGQubG9hZFhNTChjKSl9Y2F0Y2goZyl7ZD1ifSghZHx8IWQuZG9jdW1lbnRFbGVtZW50fHxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aCkmJmUuZXJyb3IoIkludmFsaWQgWE1MOiAiK2MpO3JldHVybiBkfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGIpe2ImJmoudGVzdChiKSYmKGEuZXhlY1NjcmlwdHx8ZnVuY3Rpb24oYil7YS5ldmFsLmNhbGwoYSxiKX0pKGIpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh3LCJtcy0iKS5yZXBsYWNlKHYseCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PWIudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZz0wLGg9YS5sZW5ndGgsaT1oPT09Ynx8ZS5pc0Z1bmN0aW9uKGEpO2lmKGQpe2lmKGkpe2ZvcihmIGluIGEpaWYoYy5hcHBseShhW2ZdLGQpPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5hcHBseShhW2crK10sZCk9PT0hMSlicmVha31lbHNlIGlmKGkpe2ZvcihmIGluIGEpaWYoYy5jYWxsKGFbZl0sZixhW2ZdKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuY2FsbChhW2ddLGcsYVtnKytdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOkc/ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6Ry5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjooYSsiIikucmVwbGFjZShrLCIiKS5yZXBsYWNlKGwsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtpZihhIT1udWxsKXt2YXIgZD1lLnR5cGUoYSk7YS5sZW5ndGg9PW51bGx8fGQ9PT0ic3RyaW5nInx8ZD09PSJmdW5jdGlvbiJ8fGQ9PT0icmVnZXhwInx8ZS5pc1dpbmRvdyhhKT9FLmNhbGwoYyxhKTplLm1lcmdlKGMsYSl9cmV0dXJuIGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKEgpcmV0dXJuIEguY2FsbChiLGEsYyk7ZD1iLmxlbmd0aCxjPWM/YzwwP01hdGgubWF4KDAsZCtjKTpjOjA7Zm9yKDtjPGQ7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5sZW5ndGgsZT0wO2lmKHR5cGVvZiBjLmxlbmd0aD09Im51bWJlciIpZm9yKHZhciBmPWMubGVuZ3RoO2U8ZjtlKyspYVtkKytdPWNbZV07ZWxzZSB3aGlsZShjW2VdIT09YilhW2QrK109Y1tlKytdO2EubGVuZ3RoPWQ7cmV0dXJuIGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU7Yz0hIWM7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWU9ISFiKGFbZl0sZiksYyE9PWUmJmQucHVzaChhW2ZdKTtyZXR1cm4gZH0sbWFwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnLGg9W10saT0wLGo9YS5sZW5ndGgsaz1hIGluc3RhbmNlb2YgZXx8aiE9PWImJnR5cGVvZiBqPT0ibnVtYmVyIiYmKGo+MCYmYVswXSYmYVtqLTFdfHxqPT09MHx8ZS5pc0FycmF5KGEpKTtpZihrKWZvcig7aTxqO2krKylmPWMoYVtpXSxpLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtlbHNlIGZvcihnIGluIGEpZj1jKGFbZ10sZyxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7cmV0dXJuIGguY29uY2F0LmFwcGx5KFtdLGgpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxjKXtpZih0eXBlb2YgYz09InN0cmluZyIpe3ZhciBkPWFbY107Yz1hLGE9ZH1pZighZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBiO3ZhciBmPUYuY2FsbChhcmd1bWVudHMsMiksZz1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZi5jb25jYXQoRi5jYWxsKGFyZ3VtZW50cykpKX07Zy5ndWlkPWEuZ3VpZD1hLmd1aWR8fGcuZ3VpZHx8ZS5ndWlkKys7cmV0dXJuIGd9LGFjY2VzczpmdW5jdGlvbihhLGMsZCxmLGcsaCxpKXt2YXIgaixrPWQ9PW51bGwsbD0wLG09YS5sZW5ndGg7aWYoZCYmdHlwZW9mIGQ9PSJvYmplY3QiKXtmb3IobCBpbiBkKWUuYWNjZXNzKGEsYyxsLGRbbF0sMSxoLGYpO2c9MX1lbHNlIGlmKGYhPT1iKXtqPWk9PT1iJiZlLmlzRnVuY3Rpb24oZiksayYmKGo/KGo9YyxjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKGUoYSksYyl9KTooYy5jYWxsKGEsZiksYz1udWxsKSk7aWYoYylmb3IoO2w8bTtsKyspYyhhW2xdLGQsaj9mLmNhbGwoYVtsXSxsLGMoYVtsXSxkKSk6ZixpKTtnPTF9cmV0dXJuIGc/YTprP2MuY2FsbChhKTptP2MoYVswXSxkKTpofSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtLG49ZnVuY3Rpb24oYil7dmFyIGQsZSxnLGgsaTtmb3IoZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylnPWJbZF0saD1mLnR5cGUoZyksaD09PSJhcnJheSI/bihnKTpoPT09ImZ1bmN0aW9uIiYmKCFhLnVuaXF1ZXx8IXAuaGFzKGcpKSYmYy5wdXNoKGcpfSxvPWZ1bmN0aW9uKGIsZil7Zj1mfHxbXSxlPSFhLm1lbW9yeXx8W2IsZl0saT0hMCxqPSEwLG09a3x8MCxrPTAsbD1jLmxlbmd0aDtmb3IoO2MmJm08bDttKyspaWYoY1ttXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aj0hMSxjJiYoYS5vbmNlP2U9PT0hMD9wLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCkscC5maXJlV2l0aChlWzBdLGVbMV0pKSl9LHA9e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO24oYXJndW1lbnRzKSxqP2w9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaz1hLG8oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2omJmY8PWwmJihsLS0sZjw9bSYmbS0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJnAuZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaj9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbyhiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe3AuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBwfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtpLmRvbmUuYXBwbHkoaSxhcmd1bWVudHMpLmZhaWwuYXBwbHkoaSxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxwaXBlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkKXtmLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltiLCJyZWplY3QiXSxwcm9ncmVzczpbYywibm90aWZ5Il19LGZ1bmN0aW9uKGEsYil7dmFyIGM9YlswXSxlPWJbMV0sZztmLmlzRnVuY3Rpb24oYyk/aVthXShmdW5jdGlvbigpe2c9Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksZyYmZi5pc0Z1bmN0aW9uKGcucHJvbWlzZSk/Zy5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QsZC5ub3RpZnkpOmRbZSsiV2l0aCJdKHRoaXM9PT1pP2Q6dGhpcyxbZ10pfSk6aVthXShkW2VdKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpYT1oO2Vsc2UgZm9yKHZhciBiIGluIGgpYVtiXT1oW2JdO3JldHVybiBhfX0saT1oLnByb21pc2Uoe30pLGo7Zm9yKGogaW4gZylpW2pdPWdbal0uZmlyZSxpW2orIldpdGgiXT1nW2pdLmZpcmVXaXRoO2kuZG9uZShmdW5jdGlvbigpe2U9InJlc29sdmVkIn0sYy5kaXNhYmxlLGQubG9jaykuZmFpbChmdW5jdGlvbigpe2U9InJlamVjdGVkIn0sYi5kaXNhYmxlLGQubG9jayksYSYmYS5jYWxsKGksaSk7cmV0dXJuIGl9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbShhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpiLGoubm90aWZ5V2l0aChrLGUpfX1mdW5jdGlvbiBsKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmMsLS1nfHxqLnJlc29sdmVXaXRoKGosYil9fXZhciBiPWkuY2FsbChhcmd1bWVudHMsMCksYz0wLGQ9Yi5sZW5ndGgsZT1BcnJheShkKSxnPWQsaD1kLGo9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCksaz1qLnByb21pc2UoKTtpZihkPjEpe2Zvcig7YzxkO2MrKyliW2NdJiZiW2NdLnByb21pc2UmJmYuaXNGdW5jdGlvbihiW2NdLnByb21pc2UpP2JbY10ucHJvbWlzZSgpLnRoZW4obChjKSxqLnJlamVjdCxtKGMpKTotLWc7Z3x8ai5yZXNvbHZlV2l0aChqLGIpfWVsc2UgaiE9PWEmJmoucmVzb2x2ZVdpdGgoaixkP1thXTpbXSk7cmV0dXJuIGt9fSksZi5zdXBwb3J0PWZ1bmN0aW9uKCl7dmFyIGIsZCxlLGcsaCxpLGosayxsLG0sbixvLHA9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxxPWMuZG9jdW1lbnRFbGVtZW50O3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighZHx8IWQubGVuZ3RofHwhZSlyZXR1cm57fTtnPWMuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksaD1nLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGk9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpwLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDplLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnAuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFjLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Yy5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAscGl4ZWxNYXJnaW46ITB9LGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1jLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsaS5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgcC50ZXN0fWNhdGNoKHIpe2IuZGVsZXRlRXhwYW5kbz0hMX0hcC5hZGRFdmVudExpc3RlbmVyJiZwLmF0dGFjaEV2ZW50JiZwLmZpcmVFdmVudCYmKHAuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7Yi5ub0Nsb25lRXZlbnQ9ITF9KSxwLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxpLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxwLmFwcGVuZENoaWxkKGkpLGo9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksai5hcHBlbmRDaGlsZChwLmxhc3RDaGlsZCksYi5jaGVja0Nsb25lPWouY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuYXBwZW5kQ2hlY2tlZD1pLmNoZWNrZWQsai5yZW1vdmVDaGlsZChpKSxqLmFwcGVuZENoaWxkKHApO2lmKHAuYXR0YWNoRXZlbnQpZm9yKG4gaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSltPSJvbiIrbixvPW0gaW4gcCxvfHwocC5zZXRBdHRyaWJ1dGUobSwicmV0dXJuOyIpLG89dHlwZW9mIHBbbV09PSJmdW5jdGlvbiIpLGJbbisiQnViYmxlcyJdPW87ai5yZW1vdmVDaGlsZChwKSxqPWc9aD1wPWk9bnVsbCxmKGZ1bmN0aW9uKCl7dmFyIGQsZSxnLGgsaSxqLGwsbSxuLHEscixzLHQsdT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXV8fChtPTEsdD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjoiLHI9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiLHM9dCsiMDt2aXNpYmlsaXR5OmhpZGRlbjsiLG49InN0eWxlPSciK3IrdCsiNXB4IHNvbGlkICMwMDA7IixxPSI8ZGl2ICIrbisiZGlzcGxheTpibG9jazsnPjxkaXYgc3R5bGU9JyIrdCsiMDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsZD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIrbSsicHgiLHUuaW5zZXJ0QmVmb3JlKGQsdS5maXJzdENoaWxkKSxwPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9JyIrdCsiMDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGs9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvPWtbMF0ub2Zmc2V0SGVpZ2h0PT09MCxrWzBdLnN0eWxlLmRpc3BsYXk9IiIsa1sxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1vJiZrWzBdLm9mZnNldEhlaWdodD09PTAsYS5nZXRDb21wdXRlZFN0eWxlJiYocC5pbm5lckhUTUw9IiIsbD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuc3R5bGUud2lkdGg9IjAiLGwuc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHAuc3R5bGUud2lkdGg9IjJweCIscC5hcHBlbmRDaGlsZChsKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUobCxudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCksdHlwZW9mIHAuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihwLmlubmVySFRNTD0iIixwLnN0eWxlLndpZHRoPXAuc3R5bGUucGFkZGluZz0iMXB4IixwLnN0eWxlLmJvcmRlcj0wLHAuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIscC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHAuc3R5bGUuem9vbT0xLGIuaW5saW5lQmxvY2tOZWVkc0xheW91dD1wLm9mZnNldFdpZHRoPT09MyxwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixwLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixwLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NXB4Oyc+PC9kaXY+IixiLnNocmlua1dyYXBCbG9ja3M9cC5vZmZzZXRXaWR0aCE9PTMpLHAuc3R5bGUuY3NzVGV4dD1yK3MscC5pbm5lckhUTUw9cSxlPXAuZmlyc3RDaGlsZCxnPWUuZmlyc3RDaGlsZCxpPWUubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLGo9e2RvZXNOb3RBZGRCb3JkZXI6Zy5vZmZzZXRUb3AhPT01LGRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzOmkub2Zmc2V0VG9wPT09NX0sZy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGcuc3R5bGUudG9wPSIyMHB4IixqLmZpeGVkUG9zaXRpb249Zy5vZmZzZXRUb3A9PT0yMHx8Zy5vZmZzZXRUb3A9PT0xNSxnLnN0eWxlLnBvc2l0aW9uPWcuc3R5bGUudG9wPSIiLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGouc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWcub2Zmc2V0VG9wPT09LTUsai5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD11Lm9mZnNldFRvcCE9PW0sYS5nZXRDb21wdXRlZFN0eWxlJiYocC5zdHlsZS5tYXJnaW5Ub3A9IjElIixiLnBpeGVsTWFyZ2luPShhLmdldENvbXB1dGVkU3R5bGUocCxudWxsKXx8e21hcmdpblRvcDowfSkubWFyZ2luVG9wIT09IjElIiksdHlwZW9mIGQuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihkLnN0eWxlLnpvb209MSksdS5yZW1vdmVDaGlsZChkKSxsPXA9ZD1udWxsLGYuZXh0ZW5kKGIsaikpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaCxpLGo9dGhpc1swXSxrPTAsbT1udWxsO2lmKGE9PT1iKXtpZih0aGlzLmxlbmd0aCl7bT1mLmRhdGEoaik7aWYoai5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKGosInBhcnNlZEF0dHJzIikpe2c9ai5hdHRyaWJ1dGVzO2ZvcihpPWcubGVuZ3RoO2s8aTtrKyspaD1nW2tdLm5hbWUsaC5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGg9Zi5jYW1lbENhc2UoaC5zdWJzdHJpbmcoNSkpLGwoaixoLG1baF0pKTtmLl9kYXRhKGosInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBtfWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iLDIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIixlPWRbMV0rIiEiO3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMpe2lmKGM9PT1iKXttPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2UsW2RbMF1dKSxtPT09YiYmaiYmKG09Zi5kYXRhKGosYSksbT1sKGosYSxtKSk7cmV0dXJuIG09PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTptfWRbMV09Yyx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2UsZCksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitlLGQpfSl9LG51bGwsYyxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe19tYXJrOmZ1bmN0aW9uKGEsYil7YSYmKGI9KGJ8fCJmeCIpKyJtYXJrIixmLl9kYXRhKGEsYiwoZi5fZGF0YShhLGIpfHwwKSsxKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGMpe2EhPT0hMCYmKGM9YixiPWEsYT0hMSk7aWYoYil7Yz1jfHwiZngiO3ZhciBkPWMrIm1hcmsiLGU9YT8wOihmLl9kYXRhKGIsZCl8fDEpLTE7ZT9mLl9kYXRhKGIsZCxlKTooZi5yZW1vdmVEYXRhKGIsZCwhMCksbihiLGMsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIixkPWYuX2RhdGEoYSxiKSxjJiYoIWR8fGYuaXNBcnJheShjKT9kPWYuX2RhdGEoYSxiLGYubWFrZUFycmF5KGMpKTpkLnB1c2goYykpO3JldHVybiBkfHxbXX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9Zi5xdWV1ZShhLGIpLGQ9Yy5zaGlmdCgpLGU9e307ZD09PSJpbnByb2dyZXNzIiYmKGQ9Yy5zaGlmdCgpKSxkJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGYuX2RhdGEoYSxiKyIucnVuIixlKSxkLmNhbGwoYSxmdW5jdGlvbigpe2YuZGVxdWV1ZShhLGIpfSxlKSksYy5sZW5ndGh8fChmLnJlbW92ZURhdGEoYSxiKyJxdWV1ZSAiK2IrIi5ydW4iLCEwKSxuKGEsYiwicXVldWUiKSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9Mjt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiLGQtLSk7aWYoYXJndW1lbnRzLmxlbmd0aDxkKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIGM9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zi5xdWV1ZSh0aGlzLGEsYyk7YT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJmYuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1mLmZ4P2YuZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gbSgpey0taHx8ZC5yZXNvbHZlV2l0aChlLFtlXSl9dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9YiksYT1hfHwiZngiO3ZhciBkPWYuRGVmZXJyZWQoKSxlPXRoaXMsZz1lLmxlbmd0aCxoPTEsaT1hKyJkZWZlciIsaj1hKyJxdWV1ZSIsaz1hKyJtYXJrIixsO3doaWxlKGctLSlpZihsPWYuZGF0YShlW2ddLGksYiwhMCl8fChmLmRhdGEoZVtnXSxqLGIsITApfHxmLmRhdGEoZVtnXSxrLGIsITApKSYmZi5kYXRhKGVbZ10saSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwhMCkpaCsrLGwuYWRkKG0pO20oKTtyZXR1cm4gZC5wcm9taXNlKGMpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1mLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPWIsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYyl7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnLGgsaTtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nIil7Yj1hLnNwbGl0KHApO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtlPXRoaXNbY107aWYoZS5ub2RlVHlwZT09PTEpaWYoIWUuY2xhc3NOYW1lJiZiLmxlbmd0aD09PTEpZS5jbGFzc05hbWU9YTtlbHNle2c9IiAiK2UuY2xhc3NOYW1lKyIgIjtmb3IoaD0wLGk9Yi5sZW5ndGg7aDxpO2grKyl+Zy5pbmRleE9mKCIgIitiW2hdKyIgIil8fChnKz1iW2hdKyIgIik7ZS5jbGFzc05hbWU9Zi50cmltKGcpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnLGgsaSxqO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHApO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07aWYoZy5ub2RlVHlwZT09PTEmJmcuY2xhc3NOYW1lKWlmKGEpe2g9KCIgIitnLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpO2ZvcihpPTAsaj1jLmxlbmd0aDtpPGo7aSsrKWg9aC5yZXBsYWNlKCIgIitjW2ldKyIgIiwiICIpO2cuY2xhc3NOYW1lPWYudHJpbShoKX1lbHNlIGcuY2xhc3NOYW1lPSIifX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYSxkPXR5cGVvZiBiPT0iYm9vbGVhbiI7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGM9PT0ic3RyaW5nIil7dmFyIGUsZz0wLGg9Zih0aGlzKSxpPWIsaj1hLnNwbGl0KHApO3doaWxlKGU9altnKytdKWk9ZD9pOiFoLmhhc0NsYXNzKGUpLGhbaT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoYz09PSJ1bmRlZmluZWQifHxjPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7Zm9yKDtjPGQ7YysrKWlmKHRoaXNbY10ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnPXRoaXNbMF07e2lmKCEhYXJndW1lbnRzLmxlbmd0aCl7ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLnR5cGVdfHxmLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9aWYoZyl7Yz1mLnZhbEhvb2tzW2cudHlwZV18fGYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGcsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWcudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocSwiIik6ZD09bnVsbD8iIjpkfX19fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCEhYSYmaiE9PTMmJmohPT04JiZqIT09Mil7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmaSYmKGc9aC5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGc7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihoJiYiZ2V0ImluIGgmJmkmJihnPWguZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gZztnPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBnPT09bnVsbD9iOmd9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaCxpPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtpPGc7aSsrKWU9ZFtpXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsaD11LnRlc3QoZSksaHx8Zi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLGgmJmMgaW4gYSYmKGFbY109ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoci50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaT1hLm5vZGVUeXBlO2lmKCEhYSYmaSE9PTMmJmkhPT04JiZpIT09Mil7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNlSW50KGMudmFsdWUsMTApOnMudGVzdChhLm5vZGVOYW1lKXx8dC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifX19fSksZi5hdHRySG9va3MudGFiaW5kZXg9Zi5wcm9wSG9va3MudGFiSW5kZXgseD17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT1mLnByb3AoYSxjKTtyZXR1cm4gZT09PSEwfHx0eXBlb2YgZSE9ImJvb2xlYW4iJiYoZD1hLmdldEF0dHJpYnV0ZU5vZGUoYykpJiZkLm5vZGVWYWx1ZSE9PSExP2MudG9Mb3dlckNhc2UoKTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2I9PT0hMT9mLnJlbW92ZUF0dHIoYSxjKTooZD1mLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gY319LHZ8fCh5PXtuYW1lOiEwLGlkOiEwLGNvb3JkczohMH0sdz1mLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGQmJih5W2NdP2Qubm9kZVZhbHVlIT09IiI6ZC5zcGVjaWZpZWQpP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5nZXRBdHRyaWJ1dGVOb2RlKGQpO2V8fChlPWMuY3JlYXRlQXR0cmlidXRlKGQpLGEuc2V0QXR0cmlidXRlTm9kZShlKSk7cmV0dXJuIGUubm9kZVZhbHVlPWIrIiJ9fSxmLmF0dHJIb29rcy50YWJpbmRleC5zZXQ9dy5zZXQsZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSxmLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDp3LmdldCxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2I9PT0iIiYmKGI9ImZhbHNlIiksdy5zZXQoYSxiLGMpfX0pLGYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Zi5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtmLmF0dHJIb29rc1tjXT1mLmV4dGVuZChmLmF0dHJIb29rc1tjXSx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIGQ9PT1udWxsP2I6ZH19KX0pLGYuc3VwcG9ydC5zdHlsZXx8KGYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHxifSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PSIiK2J9fSksZi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoZi5wcm9wSG9va3Muc2VsZWN0ZWQ9Zi5leHRlbmQoZi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7YiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gbnVsbH19KSksZi5zdXBwb3J0LmVuY3R5cGV8fChmLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHo9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEE9L14oW15cLl0qKT8oPzpcLiguKykpPyQvLEI9Lyg/Ol58XHMpaG92ZXIoXC5cUyspP1xiLyxDPS9ea2V5LyxEPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxFPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxGPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sRz1mdW5jdGlvbigKK2Epe3ZhciBiPUYuZXhlYyhhKTtiJiYoYlsxXT0oYlsxXXx8IiIpLnRvTG93ZXJDYXNlKCksYlszXT1iWzNdJiZuZXcgUmVnRXhwKCIoPzpefFxccykiK2JbM10rIig/Olxcc3wkKSIpKTtyZXR1cm4gYn0sSD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYXR0cmlidXRlc3x8e307cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHwoYy5pZHx8e30pLnZhbHVlPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KChjWyJjbGFzcyJdfHx7fSkudmFsdWUpKX0sST1mdW5jdGlvbihhKXtyZXR1cm4gZi5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKEIsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07Zi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlcixnPXAuc2VsZWN0b3IpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPWYudHJpbShJKGMpKS5zcGxpdCgiICIpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspe2w9QS5leGVjKGNba10pfHxbXSxtPWxbMV0sbj0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxtPShnP3MuZGVsZWdhdGVUeXBlOnMuYmluZFR5cGUpfHxtLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxvPWYuZXh0ZW5kKHt0eXBlOm0sb3JpZ1R5cGU6bFsxXSxkYXRhOmUsaGFuZGxlcjpkLGd1aWQ6ZC5ndWlkLHNlbGVjdG9yOmcscXVpY2s6ZyYmRyhnKSxuYW1lc3BhY2U6bi5qb2luKCIuIil9LHApLHI9alttXTtpZighcil7cj1qW21dPVtdLHIuZGVsZWdhdGVDb3VudD0wO2lmKCFzLnNldHVwfHxzLnNldHVwLmNhbGwoYSxlLG4saSk9PT0hMSlhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG0saSwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK20saSl9cy5hZGQmJihzLmFkZC5jYWxsKGEsbyksby5oYW5kbGVyLmd1aWR8fChvLmhhbmRsZXIuZ3VpZD1kLmd1aWQpKSxnP3Iuc3BsaWNlKHIuZGVsZWdhdGVDb3VudCsrLDAsbyk6ci5wdXNoKG8pLGYuZXZlbnQuZ2xvYmFsW21dPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZz1mLmhhc0RhdGEoYSkmJmYuX2RhdGEoYSksaCxpLGosayxsLG0sbixvLHAscSxyLHM7aWYoISFnJiYhIShvPWcuZXZlbnRzKSl7Yj1mLnRyaW0oSShifHwiIikpLnNwbGl0KCIgIik7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKyl7aT1BLmV4ZWMoYltoXSl8fFtdLGo9az1pWzFdLGw9aVsyXTtpZighail7Zm9yKGogaW4gbylmLmV2ZW50LnJlbW92ZShhLGorYltoXSxjLGQsITApO2NvbnRpbnVlfXA9Zi5ldmVudC5zcGVjaWFsW2pdfHx7fSxqPShkP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxqLHI9b1tqXXx8W10sbT1yLmxlbmd0aCxsPWw/bmV3IFJlZ0V4cCgiKF58XFwuKSIrbC5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspcz1yW25dLChlfHxrPT09cy5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cy5ndWlkKSYmKCFsfHxsLnRlc3Qocy5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cy5zZWxlY3Rvcnx8ZD09PSIqKiImJnMuc2VsZWN0b3IpJiYoci5zcGxpY2Uobi0tLDEpLHMuc2VsZWN0b3ImJnIuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscykpO3IubGVuZ3RoPT09MCYmbSE9PXIubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoYSxsKT09PSExKSYmZi5yZW1vdmVFdmVudChhLGosZy5oYW5kbGUpLGRlbGV0ZSBvW2pdKX1mLmlzRW1wdHlPYmplY3QobykmJihxPWcuaGFuZGxlLHEmJihxLmVsZW09bnVsbCksZi5yZW1vdmVEYXRhKGEsWyJldmVudHMiLCJoYW5kbGUiXSwhMCkpfX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxlLGcpe2lmKCFlfHxlLm5vZGVUeXBlIT09MyYmZS5ub2RlVHlwZSE9PTgpe3ZhciBoPWMudHlwZXx8YyxpPVtdLGosayxsLG0sbixvLHAscSxyLHM7aWYoRS50ZXN0KGgrZi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxrPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS5zaGlmdCgpLGkuc29ydCgpKTtpZigoIWV8fGYuZXZlbnQuY3VzdG9tRXZlbnRbaF0pJiYhZi5ldmVudC5nbG9iYWxbaF0pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9ayxjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGwsbz1oLmluZGV4T2YoIjoiKTwwPyJvbiIraDoiIjtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxtPUUudGVzdChzK2gpP2U6ZS5wYXJlbnROb2RlLG49bnVsbDtmb3IoO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyltPXJbbF1bMF0sYy50eXBlPXJbbF1bMV0scT0oZi5fZGF0YShtLCJldmVudHMiKXx8e30pW2MudHlwZV0mJmYuX2RhdGEobSwiaGFuZGxlIikscSYmcS5hcHBseShtLGQpLHE9byYmbVtvXSxxJiZmLmFjY2VwdERhdGEobSkmJnEuYXBwbHkobSxkKT09PSExJiZjLnByZXZlbnREZWZhdWx0KCk7Yy50eXBlPWgsIWcmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkoZS5vd25lckRvY3VtZW50LGQpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSYmbyYmZVtoXSYmKGghPT0iZm9jdXMiJiZoIT09ImJsdXIifHxjLnRhcmdldC5vZmZzZXRXaWR0aCE9PTApJiYhZi5pc1dpbmRvdyhlKSYmKG49ZVtvXSxuJiYoZVtvXT1udWxsKSxmLmV2ZW50LnRyaWdnZXJlZD1oLGVbaF0oKSxmLmV2ZW50LnRyaWdnZXJlZD1iLG4mJihlW29dPW4pKTtyZXR1cm4gYy5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihjKXtjPWYuZXZlbnQuZml4KGN8fGEuZXZlbnQpO3ZhciBkPShmLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10sZT1kLmRlbGVnYXRlQ291bnQsZz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxoPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLGk9Zi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LGo9W10sayxsLG0sbixvLHAscSxyLHMsdCx1O2dbMF09YyxjLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoIWkucHJlRGlzcGF0Y2h8fGkucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGMpIT09ITEpe2lmKGUmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXtuPWYodGhpcyksbi5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobT1jLnRhcmdldDttIT10aGlzO209bS5wYXJlbnROb2RlfHx0aGlzKWlmKG0uZGlzYWJsZWQhPT0hMCl7cD17fSxyPVtdLG5bMF09bTtmb3Ioaz0wO2s8ZTtrKyspcz1kW2tdLHQ9cy5zZWxlY3RvcixwW3RdPT09YiYmKHBbdF09cy5xdWljaz9IKG0scy5xdWljayk6bi5pcyh0KSkscFt0XSYmci5wdXNoKHMpO3IubGVuZ3RoJiZqLnB1c2goe2VsZW06bSxtYXRjaGVzOnJ9KX19ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cT1qW2tdLGMuY3VycmVudFRhcmdldD1xLmVsZW07Zm9yKGw9MDtsPHEubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtzPXEubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFzLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qocy5uYW1lc3BhY2UpKWMuZGF0YT1zLmRhdGEsYy5oYW5kbGVPYmo9cyxvPSgoZi5ldmVudC5zcGVjaWFsW3Mub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxzLmhhbmRsZXIpLmFwcGx5KHEuZWxlbSxnKSxvIT09YiYmKGMucmVzdWx0PW8sbz09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19aS5wb3N0RGlzcGF0Y2gmJmkucG9zdERpc3BhdGNoLmNhbGwodGhpcyxjKTtyZXR1cm4gYy5yZXN1bHR9fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGQpe3ZhciBlLGYsZyxoPWQuYnV0dG9uLGk9ZC5mcm9tRWxlbWVudDthLnBhZ2VYPT1udWxsJiZkLmNsaWVudFghPW51bGwmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsZj1lLmRvY3VtZW50RWxlbWVudCxnPWUuYm9keSxhLnBhZ2VYPWQuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxnJiZnLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGcmJmcuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1kLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxnJiZnLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxnJiZnLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmkmJihhLnJlbGF0ZWRUYXJnZXQ9aT09PWEudGFyZ2V0P2QudG9FbGVtZW50OmkpLCFhLndoaWNoJiZoIT09YiYmKGEud2hpY2g9aCYxPzE6aCYyPzM6aCY0PzI6MCk7cmV0dXJuIGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtmLmV4cGFuZG9dKXJldHVybiBhO3ZhciBkLGUsZz1hLGg9Zi5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxpPWgucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoaC5wcm9wcyk6dGhpcy5wcm9wczthPWYuRXZlbnQoZyk7Zm9yKGQ9aS5sZW5ndGg7ZDspZT1pWy0tZF0sYVtlXT1nW2VdO2EudGFyZ2V0fHwoYS50YXJnZXQ9Zy5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9PT1iJiYoYS5tZXRhS2V5PWEuY3RybEtleSk7cmV0dXJuIGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0sc3BlY2lhbDp7cmVhZHk6e3NldHVwOmYuYmluZFJlYWR5fSxsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e2RlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e2RlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5leHRlbmQobmV3IGYuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP2YuZXZlbnQudHJpZ2dlcihlLG51bGwsYik6Zi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sZi5ldmVudC5oYW5kbGU9Zi5ldmVudC5kaXNwYXRjaCxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/SzpKKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxmLm5vdygpLHRoaXNbZi5leHBhbmRvXT0hMH0sZi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1LLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpKLGlzUHJvcGFnYXRpb25TdG9wcGVkOkosaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Sn0sZi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1hLnJlbGF0ZWRUYXJnZXQsZT1hLmhhbmRsZU9iaixnPWUuc2VsZWN0b3IsaDtpZighZHx8ZCE9PWMmJiFmLmNvbnRhaW5zKGMsZCkpYS50eXBlPWUub3JpZ1R5cGUsaD1lLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iO3JldHVybiBofX19KSxmLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXt2YXIgYz1hLnRhcmdldCxkPWYubm9kZU5hbWUoYywiaW5wdXQiKXx8Zi5ub2RlTmFtZShjLCJidXR0b24iKT9jLmZvcm06YjtkJiYhZC5fc3VibWl0X2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxkLl9zdWJtaXRfYXR0YWNoZWQ9ITApfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGEuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLGYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZih6LnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpZi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSxmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7ei50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJiFhLmlzVHJpZ2dlciYmZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxiLl9jaGFuZ2VfYXR0YWNoZWQ9ITApfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIik7cmV0dXJuIHoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxmLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9ZnVuY3Rpb24oYSl7Zi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LGYuZXZlbnQuZml4KGEpLCEwKX07Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxnKXt2YXIgaCxpO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1kfHxjLGM9Yik7Zm9yKGkgaW4gYSl0aGlzLm9uKGksYyxkLGFbaV0sZyk7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1KO2Vsc2UgaWYoIWUpcmV0dXJuIHRoaXM7Zz09PTEmJihoPWUsZT1mdW5jdGlvbihhKXtmKCkub2ZmKGEpO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWguZ3VpZHx8KGguZ3VpZD1mLmd1aWQrKykpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGEsZSxkLGMpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLm9yaWdUeXBlKyIuIitlLm5hbWVzcGFjZTplLm9yaWdUeXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1KKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksQy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxELnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xfHxkPT09OXx8ZD09PTExKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7by5tYXRjaC5nbG9iYWxQT1M9cDt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLmdsb2JhbFBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIilbXFxzLz5dIiwiaSIpLGJkPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJlPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmY9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmc9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYmg9VShjKTtiZy5vcHRncm91cD1iZy5vcHRpb24sYmcudGJvZHk9YmcudGZvb3Q9YmcuY29sZ3JvdXA9YmcuY2FwdGlvbj1iZy50aGVhZCxiZy50aD1iZy50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJnLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9ZgorLmNsZWFuKGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9dGhpcy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiLGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsZi5jbGVhbihhcmd1bWVudHMpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXt2YXIgYz10aGlzWzBdfHx7fSxkPTAsZT10aGlzLmxlbmd0aDtpZihhPT09YilyZXR1cm4gYy5ub2RlVHlwZT09PTE/Yy5pbm5lckhUTUwucmVwbGFjZShXLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJhLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFYLnRlc3QoYSkpJiYhYmdbKFouZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3RyeXtmb3IoO2Q8ZTtkKyspYz10aGlzW2RdfHx7fSxjLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksYy5pbm5lckhUTUw9YSk7Yz0wfWNhdGNoKGcpe319YyYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyksZD1jLmh0bWwoKTtjLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZCkpfSk7dHlwZW9mIGEhPSJzdHJpbmciJiYoYT1mKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtmKHRoaXMpLnJlbW92ZSgpLGI/ZihiKS5iZWZvcmUoYSk6ZihjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZihmLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFmLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYmQudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5kb21NYW5pcChhLGMsZCwhMCl9KTtpZihmLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1mKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZi5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2U9e2ZyYWdtZW50Oml9OmU9Zi5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWUuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmYubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZC5jYWxsKGM/YmkodGhpc1tsXSxnKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHxtPjEmJmw8bj9mLmNsb25lKGgsITAsITApOmgpfWsubGVuZ3RoJiZmLmVhY2goayxmdW5jdGlvbihhLGIpe2Iuc3JjP2YuYWpheCh7dHlwZToiR0VUIixnbG9iYWw6ITEsdXJsOmIuc3JjLGFzeW5jOiExLGRhdGFUeXBlOiJzY3JpcHQifSk6Zi5nbG9iYWxFdmFsKChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIikucmVwbGFjZShiZiwiLyokMCovIikpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfSl9cmV0dXJuIHRoaXN9fSksZi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGgsaSxqPWFbMF07YiYmYlswXSYmKGk9YlswXS5vd25lckRvY3VtZW50fHxiWzBdKSxpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnR8fChpPWMpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGo9PSJzdHJpbmciJiZqLmxlbmd0aDw1MTImJmk9PT1jJiZqLmNoYXJBdCgwKT09PSI8IiYmIWJiLnRlc3QoaikmJihmLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJkLnRlc3QoaikpJiYoZi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KGopKSYmKGc9ITAsaD1mLmZyYWdtZW50c1tqXSxoJiZoIT09MSYmKGU9aCkpLGV8fChlPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGYuY2xlYW4oYSxpLGUsZCkpLGcmJihmLmZyYWdtZW50c1tqXT1oP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmd9fSxmLmZyYWdtZW50cz17fSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQ9W10sZT1mKGMpLGc9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZyYmZy5ub2RlVHlwZT09PTExJiZnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZS5sZW5ndGg9PT0xKXtlW2JdKHRoaXNbMF0pO3JldHVybiB0aGlzfWZvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9KGg+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKTtmKGVbaF0pW2JdKGopLGQ9ZC5jb25jYXQoail9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQsYSxlLnNlbGVjdG9yKX19KSxmLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxoPWYuc3VwcG9ydC5odG1sNUNsb25lfHxmLmlzWE1MRG9jKGEpfHwhYmMudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2EuY2xvbmVOb2RlKCEwKTpibyhhKTtpZigoIWYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCFmLnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT0xMSkmJiFmLmlzWE1MRG9jKGEpKXtiayhhLGgpLGQ9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWVbZ10mJmJrKGRbZ10sZVtnXSl9aWYoYil7YmooYSxoKTtpZihjKXtkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyliaihkW2ddLGVbZ10pfX1kPWU9bnVsbDtyZXR1cm4gaH0sY2xlYW46ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGcsaCxpLGo9W107Yj1ifHxjLHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PSJ1bmRlZmluZWQiJiYoYj1iLm93bmVyRG9jdW1lbnR8fGJbMF0mJmJbMF0ub3duZXJEb2N1bWVudHx8Yyk7Zm9yKHZhciBrPTAsbDsobD1hW2tdKSE9bnVsbDtrKyspe3R5cGVvZiBsPT0ibnVtYmVyIiYmKGwrPSIiKTtpZighbCljb250aW51ZTtpZih0eXBlb2YgbD09InN0cmluZyIpaWYoIV8udGVzdChsKSlsPWIuY3JlYXRlVGV4dE5vZGUobCk7ZWxzZXtsPWwucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbT0oWi5leGVjKGwpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG49YmdbbV18fGJnLl9kZWZhdWx0LG89blswXSxwPWIuY3JlYXRlRWxlbWVudCgiZGl2IikscT1iaC5jaGlsZE5vZGVzLHI7Yj09PWM/YmguYXBwZW5kQ2hpbGQocCk6VShiKS5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD1uWzFdK2wrblsyXTt3aGlsZShvLS0pcD1wLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcz0kLnRlc3QobCksdD1tPT09InRhYmxlIiYmIXM/cC5maXJzdENoaWxkJiZwLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpuWzFdPT09Ijx0YWJsZT4iJiYhcz9wLmNoaWxkTm9kZXM6W107Zm9yKGk9dC5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHRbaV0sInRib2R5IikmJiF0W2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZ0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodFtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGwpJiZwLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhsKVswXSkscC5maXJzdENoaWxkKSxsPXAuY2hpbGROb2RlcyxwJiYocC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLHEubGVuZ3RoPjAmJihyPXFbcS5sZW5ndGgtMV0sciYmci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpKX12YXIgdTtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYobFswXSYmdHlwZW9mICh1PWwubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHU7aSsrKWJuKGxbaV0pO2Vsc2UgYm4obCk7bC5ub2RlVHlwZT9qLnB1c2gobCk6aj1mLm1lcmdlKGosbCl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihrPTA7altrXTtrKyspe2g9altrXTtpZihlJiZmLm5vZGVOYW1lKGgsInNjcmlwdCIpJiYoIWgudHlwZXx8YmUudGVzdChoLnR5cGUpKSllLnB1c2goaC5wYXJlbnROb2RlP2gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoKTpoKTtlbHNle2lmKGgubm9kZVR5cGU9PT0xKXt2YXIgdj1mLmdyZXAoaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZyk7ai5zcGxpY2UuYXBwbHkoaixbaysxLDBdLmNvbmNhdCh2KSl9ZC5hcHBlbmRDaGlsZChoKX19fXJldHVybiBqfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWYuY2FjaGUsZT1mLmV2ZW50LnNwZWNpYWwsZz1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kbztmb3IodmFyIGg9MCxpOyhpPWFbaF0pIT1udWxsO2grKyl7aWYoaS5ub2RlTmFtZSYmZi5ub0RhdGFbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSljb250aW51ZTtjPWlbZi5leHBhbmRvXTtpZihjKXtiPWRbY107aWYoYiYmYi5ldmVudHMpe2Zvcih2YXIgaiBpbiBiLmV2ZW50cyllW2pdP2YuZXZlbnQucmVtb3ZlKGksaik6Zi5yZW1vdmVFdmVudChpLGosYi5oYW5kbGUpO2IuaGFuZGxlJiYoYi5oYW5kbGUuZWxlbT1udWxsKX1nP2RlbGV0ZSBpW2YuZXhwYW5kb106aS5yZW1vdmVBdHRyaWJ1dGUmJmkucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyksZGVsZXRlIGRbY119fX19KTt2YXIgYnA9L2FscGhhXChbXildKlwpL2ksYnE9L29wYWNpdHk9KFteKV0qKS8sYnI9LyhbQS1aXXxebXMpL2csYnM9L15bXC0rXT8oPzpcZCpcLik/XGQrJC9pLGJ0PS9eLT8oPzpcZCpcLik/XGQrKD8hcHgpW15cZFxzXSskL2ksYnU9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnY9L15tYXJnaW4vLGJ3PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxieD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGJ5LGJ6LGJBO2YuZm4uY3NzPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSxhLGMsYXJndW1lbnRzLmxlbmd0aD4xKX0sZi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1ieShhLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y31yZXR1cm4gYS5zdHlsZS5vcGFjaXR5fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFhJiZhLm5vZGVUeXBlIT09MyYmYS5ub2RlVHlwZSE9PTgmJiEhYS5zdHlsZSl7dmFyIGcsaCxpPWYuY2FtZWxDYXNlKGMpLGo9YS5zdHlsZSxrPWYuY3NzSG9va3NbaV07Yz1mLmNzc1Byb3BzW2ldfHxpO2lmKGQ9PT1iKXtpZihrJiYiZ2V0ImluIGsmJihnPWsuZ2V0KGEsITEsZSkpIT09YilyZXR1cm4gZztyZXR1cm4galtjXX1oPXR5cGVvZiBkLGg9PT0ic3RyaW5nIiYmKGc9YnUuZXhlYyhkKSkmJihkPSsoZ1sxXSsxKSorZ1syXStwYXJzZUZsb2F0KGYuY3NzKGEsYykpLGg9Im51bWJlciIpO2lmKGQ9PW51bGx8fGg9PT0ibnVtYmVyIiYmaXNOYU4oZCkpcmV0dXJuO2g9PT0ibnVtYmVyIiYmIWYuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWt8fCEoInNldCJpbiBrKXx8KGQ9ay5zZXQoYSxkKSkhPT1iKXRyeXtqW2NdPWR9Y2F0Y2gobCl7fX19LGNzczpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZztjPWYuY2FtZWxDYXNlKGMpLGc9Zi5jc3NIb29rc1tjXSxjPWYuY3NzUHJvcHNbY118fGMsYz09PSJjc3NGbG9hdCImJihjPSJmbG9hdCIpO2lmKGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxkKSkhPT1iKXJldHVybiBlO2lmKGJ5KXJldHVybiBieShhLGMpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fSxlLGY7Zm9yKGYgaW4gYilkW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5jYWxsKGEpO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1kW2ZdO3JldHVybiBlfX0pLGYuY3VyQ1NTPWYuY3NzLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGJ6PWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaD1hLnN0eWxlO2I9Yi5yZXBsYWNlKGJyLCItJDEiKS50b0xvd2VyQ2FzZSgpLChkPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykmJihlPWQuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKSYmKGM9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLGM9PT0iIiYmIWYuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGM9Zi5zdHlsZShhLGIpKSksIWYuc3VwcG9ydC5waXhlbE1hcmdpbiYmZSYmYnYudGVzdChiKSYmYnQudGVzdChjKSYmKGc9aC53aWR0aCxoLndpZHRoPWMsYz1lLndpZHRoLGgud2lkdGg9Zyk7cmV0dXJuIGN9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiQT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLGJ0LnRlc3QoZikmJihjPWcubGVmdCxkPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZS5sZWZ0LGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGcubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjpmLGY9Zy5waXhlbExlZnQrInB4IixnLmxlZnQ9YyxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1kKSk7cmV0dXJuIGY9PT0iIj8iYXV0byI6Zn0pLGJ5PWJ6fHxiQSxmLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiBhLm9mZnNldFdpZHRoIT09MD9iQihhLGIsZCk6Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtyZXR1cm4gYkIoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBicy50ZXN0KGIpP2IrInB4IjpifX19KSxmLnN1cHBvcnQub3BhY2l0eXx8KGYuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJxLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1mLmlzTnVtZXJpYyhiKT8iYWxwaGEob3BhY2l0eT0iK2IqMTAwKyIpIjoiIixnPWQmJmQuZmlsdGVyfHxjLmZpbHRlcnx8IiI7Yy56b29tPTE7aWYoYj49MSYmZi50cmltKGcucmVwbGFjZShicCwiIikpPT09IiIpe2MucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKTtpZihkJiYhZC5maWx0ZXIpcmV0dXJufWMuZmlsdGVyPWJwLnRlc3QoZyk/Zy5yZXBsYWNlKGJwLGUpOmcrIiAiK2V9fSksZihmdW5jdGlvbigpe2Yuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoZi5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe3JldHVybiBiP2J5KGEsIm1hcmdpbi1yaWdodCIpOmEuc3R5bGUubWFyZ2luUmlnaHR9KX19KX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KSxmLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe2YuY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe3ZhciBkLGU9dHlwZW9mIGM9PSJzdHJpbmciP2Muc3BsaXQoIiAiKTpbY10sZj17fTtmb3IoZD0wO2Q8NDtkKyspZlthK2J4W2RdK2JdPWVbZF18fGVbZC0yXXx8ZVswXTtyZXR1cm4gZn19fSk7dmFyIGJDPS8lMjAvZyxiRD0vXFtcXSQvLGJFPS9ccj9cbi9nLGJGPS8jLiokLyxiRz0vXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLGJIPS9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxkYXRldGltZS1sb2NhbHxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSxiST0vXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLGJKPS9eKD86R0VUfEhFQUQpJC8sYks9L15cL1wvLyxiTD0vXD8vLGJNPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLGJOPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pLGJPPS9ccysvLGJQPS8oWz8mXSlfPVteJl0qLyxiUT0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspKT8pPy8sYlI9Zi5mbi5sb2FkLGJTPXt9LGJUPXt9LGJVLGJWLGJXPVsiKi8iXStbIioiXTt0cnl7YlU9ZS5ocmVmfWNhdGNoKGJYKXtiVT1jLmNyZWF0ZUVsZW1lbnQoImEiKSxiVS5ocmVmPSIiLGJVPWJVLmhyZWZ9YlY9YlEuZXhlYyhiVS50b0xvd2VyQ2FzZSgpKXx8W10sZi5mbi5leHRlbmQoe2xvYWQ6ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIiYmYlIpcmV0dXJuIGJSLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGU9YS5pbmRleE9mKCIgIik7aWYoZT49MCl7dmFyIGc9YS5zbGljZShlLGEubGVuZ3RoKTthPWEuc2xpY2UoMCxlKX12YXIgaD0iR0VUIjtjJiYoZi5pc0Z1bmN0aW9uKGMpPyhkPWMsYz1iKTp0eXBlb2YgYz09Im9iamVjdCImJihjPWYucGFyYW0oYyxmLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksaD0iUE9TVCIpKTt2YXIgaT10aGlzO2YuYWpheCh7dXJsOmEsdHlwZTpoLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiLGMpe2M9YS5yZXNwb25zZVRleHQsYS5pc1Jlc29sdmVkKCkmJihhLmRvbmUoZnVuY3Rpb24oYSl7Yz1hfSksaS5odG1sKGc/ZigiPGRpdj4iKS5hcHBlbmQoYy5yZXBsYWNlKGJNLCIiKSkuZmluZChnKTpjKSksZCYmaS5lYWNoKGQsW2MsYixhXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBmLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Zi5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHxiTi50ZXN0KHRoaXMubm9kZU5hbWUpfHxiSC50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9Zih0aGlzKS52YWwoKTtyZXR1cm4gYz09bnVsbD9udWxsOmYuaXNBcnJheShjKT9mLm1hcChjLGZ1bmN0aW9uKGEsYyl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShiRSwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoYkUsIlxyXG4iKX19KS5nZXQoKX19KSxmLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGMpe2ZbY109ZnVuY3Rpb24oYSxkLGUsZyl7Zi5pc0Z1bmN0aW9uKGQpJiYoZz1nfHxlLGU9ZCxkPWIpO3JldHVybiBmLmFqYXgoe3R5cGU6Yyx1cmw6YSxkYXRhOmQsc3VjY2VzczplLGRhdGFUeXBlOmd9KX19KSxmLmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe2I/YiQoYSxmLmFqYXhTZXR0aW5ncyk6KGI9YSxhPWYuYWpheFNldHRpbmdzKSxiJChhLGIpO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpiVSxpc0xvY2FsOmJJLnRlc3QoYlZbMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjpiV30sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmEuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOmYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6Zi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e2NvbnRleHQ6ITAsdXJsOiEwfX0sYWpheFByZWZpbHRlcjpiWShiUyksYWpheFRyYW5zcG9ydDpiWShiVCksYWpheDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIHcoYSxjLGwsbSl7aWYocyE9PTIpe3M9MixxJiZjbGVhclRpbWVvdXQocSkscD1iLG49bXx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjA7dmFyIG8scix1LHc9Yyx4PWw/Y2EoZCx2LGwpOmIseSx6O2lmKGE+PTIwMCYmYTwzMDB8fGE9PT0zMDQpe2lmKGQuaWZNb2RpZmllZCl7aWYoeT12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpZi5sYXN0TW9kaWZpZWRba109eTtpZih6PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSlmLmV0YWdba109en1pZihhPT09MzA0KXc9Im5vdG1vZGlmaWVkIixvPSEwO2Vsc2UgdHJ5e3I9Y2IoZCx4KSx3PSJzdWNjZXNzIixvPSEwfWNhdGNoKEEpe3c9InBhcnNlcmVycm9yIix1PUF9fWVsc2V7dT13O2lmKCF3fHxhKXc9ImVycm9yIixhPDAmJihhPTApfXYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PSIiKyhjfHx3KSxvP2gucmVzb2x2ZVdpdGgoZSxbcix3LHZdKTpoLnJlamVjdFdpdGgoZSxbdix3LHVdKSx2LnN0YXR1c0NvZGUoaiksaj1iLHQmJmcudHJpZ2dlcigiYWpheCIrKG8/IlN1Y2Nlc3MiOiJFcnJvciIpLFt2LGQsbz9yOnVdKSxpLmZpcmVXaXRoKGUsW3Ysd10pLHQmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3YsZF0pLC0tZi5hY3RpdmV8fGYuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQ9Zi5hamF4U2V0dXAoe30sYyksZT1kLmNvbnRleHR8fGQsZz1lIT09ZCYmKGUubm9kZVR5cGV8fGUgaW5zdGFuY2VvZiBmKT9mKGUpOmYuZXZlbnQsaD1mLkRlZmVycmVkKCksaT1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxqPWQuc3RhdHVzQ29kZXx8e30sayxsPXt9LG09e30sbixvLHAscSxyLHM9MCx0LHUsdj17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXtpZighcyl7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2E9bVtjXT1tW2NdfHxhLGxbYV09Yn1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHM9PT0yP246bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGM7aWYocz09PTIpe2lmKCFvKXtvPXt9O3doaWxlKGM9YkcuZXhlYyhuKSlvW2NbMV0udG9Mb3dlckNhc2UoKV09Y1syXX1jPW9bYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gYz09PWI/bnVsbDpjfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3N8fChkLm1pbWVUeXBlPWEpO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXthPWF8fCJhYm9ydCIscCYmcC5hYm9ydChhKSx3KDAsYSk7cmV0dXJuIHRoaXN9fTtoLnByb21pc2Uodiksdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCx2LmNvbXBsZXRlPWkuYWRkLHYuc3RhdHVzQ29kZT1mdW5jdGlvbihhKXtpZihhKXt2YXIgYjtpZihzPDIpZm9yKGIgaW4gYSlqW2JdPVtqW2JdLGFbYl1dO2Vsc2UgYj1hW3Yuc3RhdHVzXSx2LnRoZW4oYixiKX1yZXR1cm4gdGhpc30sZC51cmw9KChhfHxkLnVybCkrIiIpLnJlcGxhY2UoYkYsIiIpLnJlcGxhY2UoYkssYlZbMV0rIi8vIiksZC5kYXRhVHlwZXM9Zi50cmltKGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5zcGxpdChiTyksZC5jcm9zc0RvbWFpbj09bnVsbCYmKHI9YlEuZXhlYyhkLnVybC50b0xvd2VyQ2FzZSgpKSxkLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PWJWWzFdJiZyWzJdPT1iVlsyXSYmKHJbM118fChyWzFdPT09Imh0dHA6Ij84MDo0NDMpKT09KGJWWzNdfHwoYlZbMV09PT0iaHR0cDoiPzgwOjQ0MykpKSksZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiZ0eXBlb2YgZC5kYXRhIT0ic3RyaW5nIiYmKGQuZGF0YT1mLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksYlooYlMsZCxjLHYpO2lmKHM9PT0yKXJldHVybiExO3Q9ZC5nbG9iYWwsZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hYkoudGVzdChkLnR5cGUpLHQmJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFkLmhhc0NvbnRlbnQpe2QuZGF0YSYmKGQudXJsKz0oYkwudGVzdChkLnVybCk/IiYiOiI/IikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLGs9ZC51cmw7aWYoZC5jYWNoZT09PSExKXt2YXIgeD1mLm5vdygpLHk9ZC51cmwucmVwbGFjZShiUCwiJDFfPSIreCk7ZC51cmw9eSsoeT09PWQudXJsPyhiTC50ZXN0KGQudXJsKT8iJiI6Ij8iKSsiXz0iK3g6IiIpfX0oZC5kYXRhJiZkLmhhc0NvbnRlbnQmJmQuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxkLmlmTW9kaWZpZWQmJihrPWt8fGQudXJsLGYubGFzdE1vZGlmaWVkW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixmLmxhc3RNb2RpZmllZFtrXSksZi5ldGFnW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGYuZXRhZ1trXSkpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKyhkLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2JXKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKTtmb3IodSBpbiBkLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKHUsZC5oZWFkZXJzW3VdKTtpZihkLmJlZm9yZVNlbmQmJihkLmJlZm9yZVNlbmQuY2FsbChlLHYsZCk9PT0hMXx8cz09PTIpKXt2LmFib3J0KCk7cmV0dXJuITF9Zm9yKHUgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdlt1XShkW3VdKTtwPWJaKGJULGQsYyx2KTtpZighcCl3KC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3YucmVhZHlTdGF0ZT0xLHQmJmcudHJpZ2dlcigiYWpheFNlbmQiLFt2LGRdKSxkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHE9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e3M9MSxwLnNlbmQobCx3KX1jYXRjaCh6KXtpZihzPDIpdygtMSx6KTtlbHNlIHRocm93IHp9fXJldHVybiB2fSxwYXJhbTpmdW5jdGlvbihhLGMpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPWYuaXNGdW5jdGlvbihiKT9iKCk6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07Yz09PWImJihjPWYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKTtpZihmLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhZi5pc1BsYWluT2JqZWN0KGEpKWYuZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgZyBpbiBhKWJfKGcsYVtnXSxjLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKGJDLCIrIil9fSksZi5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9fSk7dmFyIGNjPWYubm93KCksY2Q9LyhcPSlcPygmfCQpfFw/XD8vaTtmLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZXhwYW5kbysiXyIrY2MrK319KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10eXBlb2YgYi5kYXRhPT0ic3RyaW5nIiYmL15hcHBsaWNhdGlvblwveFwtd3d3XC1mb3JtXC11cmxlbmNvZGVkLy50ZXN0KGIuY29udGVudFR5cGUpO2lmKGIuZGF0YVR5cGVzWzBdPT09Impzb25wInx8Yi5qc29ucCE9PSExJiYoY2QudGVzdChiLnVybCl8fGUmJmNkLnRlc3QoYi5kYXRhKSkpe3ZhciBnLGg9Yi5qc29ucENhbGxiYWNrPWYuaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxpPWFbaF0saj1iLnVybCxrPWIuZGF0YSxsPSIkMSIraCsiJDIiO2IuanNvbnAhPT0hMSYmKGo9ai5yZXBsYWNlKGNkLGwpLGIudXJsPT09aiYmKGUmJihrPWsucmVwbGFjZShjZCxsKSksYi5kYXRhPT09ayYmKGorPSgvXD8vLnRlc3Qoaik/IiYiOiI/IikrYi5qc29ucCsiPSIraCkpKSxiLnVybD1qLGIuZGF0YT1rLGFbaF09ZnVuY3Rpb24oYSl7Zz1bYV19LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtoXT1pLGcmJmYuaXNGdW5jdGlvbihpKSYmYVtoXShnWzBdKX0pLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe2d8fGYuZXJyb3IoaCsiIHdhcyBub3QgY2FsbGVkIik7cmV0dXJuIGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIjtyZXR1cm4ic2NyaXB0In19KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7Zi5nbG9iYWxFdmFsKGEpO3JldHVybiBhfX19KSxmLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7YS5jYWNoZT09PWImJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLGYuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgZCxlPWMuaGVhZHx8Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxjLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihmLGcpe2Q9Yy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLmFzeW5jPSJhc3luYyIsYS5zY3JpcHRDaGFyc2V0JiYoZC5jaGFyc2V0PWEuc2NyaXB0Q2hhcnNldCksZC5zcmM9YS51cmwsZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXtpZihjfHwhZC5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGQucmVhZHlTdGF0ZSkpZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlJiZkLnBhcmVudE5vZGUmJmUucmVtb3ZlQ2hpbGQoZCksZD1iLGN8fGcoMjAwLCJzdWNjZXNzIil9LGUuaW5zZXJ0QmVmb3JlKGQsZS5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkLm9ubG9hZCgwLDEpfX19fSk7dmFyIGNlPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBjZyljZ1thXSgwLDEpfTohMSxjZj0wLGNnO2YuYWpheFNldHRpbmdzLnhocj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZjaCgpfHxjaSgpfTpjaCxmdW5jdGlvbihhKXtmLmV4dGVuZChmLnN1cHBvcnQse2FqYXg6ISFhLGNvcnM6ISFhJiYid2l0aENyZWRlbnRpYWxzImluIGF9KX0oZi5hamF4U2V0dGluZ3MueGhyKCkpLGYuc3VwcG9ydC5hamF4JiZmLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYyl7aWYoIWMuY3Jvc3NEb21haW58fGYuc3VwcG9ydC5jb3JzKXt2YXIgZDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGcpe3ZhciBoPWMueGhyKCksaSxqO2MudXNlcm5hbWU/aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jLGMudXNlcm5hbWUsYy5wYXNzd29yZCk6aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jKTtpZihjLnhockZpZWxkcylmb3IoaiBpbiBjLnhockZpZWxkcyloW2pdPWMueGhyRmllbGRzW2pdO2MubWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlKGMubWltZVR5cGUpLCFjLmNyb3NzRG9tYWluJiYhZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdJiYoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IoaiBpbiBlKWguc2V0UmVxdWVzdEhlYWRlcihqLGVbal0pfWNhdGNoKGspe31oLnNlbmQoYy5oYXNDb250ZW50JiZjLmRhdGF8fG51bGwpLGQ9ZnVuY3Rpb24oYSxlKXt2YXIgaixrLGwsbSxuO3RyeXtpZihkJiYoZXx8aC5yZWFkeVN0YXRlPT09NCkpe2Q9YixpJiYoaC5vbnJlYWR5c3RhdGVjaGFuZ2U9Zi5ub29wLGNlJiZkZWxldGUgY2dbaV0pO2lmKGUpaC5yZWFkeVN0YXRlIT09NCYmaC5hYm9ydCgpO2Vsc2V7aj1oLnN0YXR1cyxsPWguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksbT17fSxuPWgucmVzcG9uc2VYTUwsbiYmbi5kb2N1bWVudEVsZW1lbnQmJihtLnhtbD1uKTt0cnl7bS50ZXh0PWgucmVzcG9uc2VUZXh0fWNhdGNoKGEpe310cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjZixjZSYmKGNnfHwoY2c9e30sZihhKS51bmxvYWQoY2UpKSxjZ1tpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY2o9e30sY2ssY2wsY209L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNuPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY28sY3A9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3E7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdCgic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSwoZT09PSIiJiZmLmNzcyhkLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCFmLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZCkpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN1KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN0KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN0KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbyxwLHE7Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSk7aWYoKGs9Zi5jc3NIb29rc1tnXSkmJiJleHBhbmQiaW4gayl7bD1rLmV4cGFuZChhW2ddKSxkZWxldGUgYVtnXTtmb3IoaSBpbiBsKWkgaW4gYXx8KGFbaV09bFtpXSl9fWZvcihnIGluIGEpe2g9YVtnXSxmLmlzQXJyYXkoaCk/KGIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWhbMV0saD1hW2ddPWhbMF0pOmIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWIuc3BlY2lhbEVhc2luZyYmYi5zcGVjaWFsRWFzaW5nW2ddfHxiLmVhc2luZ3x8InN3aW5nIjtpZihoPT09ImhpZGUiJiZkfHxoPT09InNob3ciJiYhZClyZXR1cm4gYi5jb21wbGV0ZS5jYWxsKHRoaXMpO2MmJihnPT09ImhlaWdodCJ8fGc9PT0id2lkdGgiKSYmKGIub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldLGYuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZmLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiJiYoIWYuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0fHxjdSh0aGlzLm5vZGVOYW1lKT09PSJpbmxpbmUiP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjp0aGlzLnN0eWxlLnpvb209MSkpfWIub3ZlcmZsb3chPW51bGwmJih0aGlzLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTtmb3IoaSBpbiBhKWo9bmV3IGYuZngodGhpcyxiLGkpLGg9YVtpXSxjbS50ZXN0KGgpPyhxPWYuX2RhdGEodGhpcywidG9nZ2xlIitpKXx8KGg9PT0idG9nZ2xlIj9kPyJzaG93IjoiaGlkZSI6MCkscT8oZi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kscT09PSJzaG93Ij8iaGlkZSI6InNob3ciKSxqW3FdKCkpOmpbaF0oKSk6KG09Y24uZXhlYyhoKSxuPWouY3VyKCksbT8obz1wYXJzZUZsb2F0KG1bMl0pLHA9bVszXXx8KGYuY3NzTnVtYmVyW2ldPyIiOiJweCIpLHAhPT0icHgiJiYoZi5zdHlsZSh0aGlzLGksKG98fDEpK3ApLG49KG98fDEpL2ouY3VyKCkqbixmLnN0eWxlKHRoaXMsaSxuK3ApKSxtWzFdJiYobz0obVsxXT09PSItPSI/LTE6MSkqbytuKSxqLmN1c3RvbShuLG8scCkpOmouY3VzdG9tKG4saCwiIikpO3JldHVybiEwfXZhciBlPWYuc3BlZWQoYixjLGQpO2lmKGYuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGUuY29tcGxldGUsWyExXSk7YT1mLmV4dGVuZCh7fSxhKTtyZXR1cm4gZS5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGUucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxjLGQpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YyxjPWEsYT1iKSxjJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Z1bmN0aW9uIGgoYSxiLGMpe3ZhciBlPWJbY107Zi5yZW1vdmVEYXRhKGEsYywhMCksZS5zdG9wKGQpfXZhciBiLGM9ITEsZT1mLnRpbWVycyxnPWYuX2RhdGEodGhpcyk7ZHx8Zi5fdW5tYXJrKCEwLHRoaXMpO2lmKGE9PW51bGwpZm9yKGIgaW4gZylnW2JdJiZnW2JdLnN0b3AmJmIuaW5kZXhPZigiLnJ1biIpPT09Yi5sZW5ndGgtNCYmaCh0aGlzLGcsYik7ZWxzZSBnW2I9YSsiLnJ1biJdJiZnW2JdLnN0b3AmJmgodGhpcyxnLGIpO2ZvcihiPWUubGVuZ3RoO2ItLTspZVtiXS5lbGVtPT09dGhpcyYmKGE9PW51bGx8fGVbYl0ucXVldWU9PT1hKSYmKGQ/ZVtiXSghMCk6ZVtiXS5zYXZlU3RhdGUoKSxjPSEwLGUuc3BsaWNlKGIsMSkpOyghZHx8IWMpJiZmLmRlcXVldWUodGhpcyxhKX0pfX0pLGYuZWFjaCh7c2xpZGVEb3duOmN0KCJzaG93IiwxKSxzbGlkZVVwOmN0KCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpjdCgidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxmLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fGYuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhZi5pc0Z1bmN0aW9uKGIpJiZifTtkLmR1cmF0aW9uPWYuZngub2ZmPzA6dHlwZW9mIGQuZHVyYXRpb249PSJudW1iZXIiP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz9mLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpmLmZ4LnNwZWVkcy5fZGVmYXVsdDtpZihkLnF1ZXVlPT1udWxsfHxkLnF1ZXVlPT09ITApZC5xdWV1ZT0iZngiO2Qub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbihhKXtmLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWU/Zi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSk6YSE9PSExJiZmLl91bm1hcmsodGhpcyl9O3JldHVybiBkfSxlYXNpbmc6e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNX19LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jcXx8Y3IoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2YuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiYoZS5vcHRpb25zLmhpZGU/Zi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpOmUub3B0aW9ucy5zaG93JiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5lbmQpKX0saCgpJiZmLnRpbWVycy5wdXNoKGgpJiYhY28mJihjbz1zZXRJbnRlcnZhbChnLnRpY2ssZy5pbnRlcnZhbCkpfSxzaG93OmZ1bmN0aW9uKCl7dmFyIGE9Zi5fZGF0YSh0aGlzLmVsZW0sImZ4c2hvdyIrdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWF8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLnNob3c9ITAsYSE9PWI/dGhpcy5jdXN0b20odGhpcy5jdXIoKSxhKTp0aGlzLmN1c3RvbSh0aGlzLnByb3A9PT0id2lkdGgifHx0aGlzLnByb3A9PT0iaGVpZ2h0Ij8xOjAsdGhpcy5jdXIoKSksZih0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Zi5fZGF0YSh0aGlzLmVsZW0sImZ4c2hvdyIrdGhpcy5wcm9wKXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuaGlkZT0hMCx0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPWNxfHxjcigpLGc9ITAsaD10aGlzLmVsZW0saT10aGlzLm9wdGlvbnM7aWYoYXx8ZT49aS5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQsdGhpcy5wb3M9dGhpcy5zdGF0ZT0xLHRoaXMudXBkYXRlKCksaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXT0hMDtmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylpLmFuaW1hdGVkUHJvcGVydGllc1tiXSE9PSEwJiYoZz0hMSk7aWYoZyl7aS5vdmVyZmxvdyE9bnVsbCYmIWYuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzJiZmLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGEsYil7aC5zdHlsZVsib3ZlcmZsb3ciK2JdPWkub3ZlcmZsb3dbYV19KSxpLmhpZGUmJmYoaCkuaGlkZSgpO2lmKGkuaGlkZXx8aS5zaG93KWZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWYuc3R5bGUoaCxiLGkub3JpZ1tiXSksZi5yZW1vdmVEYXRhKGgsImZ4c2hvdyIrYiwhMCksZi5yZW1vdmVEYXRhKGgsInRvZ2dsZSIrYiwhMCk7ZD1pLmNvbXBsZXRlLGQmJihpLmNvbXBsZXRlPSExLGQuY2FsbChoKSl9cmV0dXJuITF9aS5kdXJhdGlvbj09SW5maW5pdHk/dGhpcy5ub3c9ZTooYz1lLXRoaXMuc3RhcnRUaW1lLHRoaXMuc3RhdGU9Yy9pLmR1cmF0aW9uLHRoaXMucG9zPWYuZWFzaW5nW2kuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF1dKHRoaXMuc3RhdGUsYywwLDEsaS5kdXJhdGlvbiksdGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3MpLHRoaXMudXBkYXRlKCk7cmV0dXJuITB9fSxmLmV4dGVuZChmLmZ4LHt0aWNrOmZ1bmN0aW9uKCl7dmFyIGEsYj1mLnRpbWVycyxjPTA7Zm9yKDtjPGIubGVuZ3RoO2MrKylhPWJbY10sIWEoKSYmYltjXT09PWEmJmIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8Zi5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGNvKSxjbz1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtmLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXthLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsP2EuZWxlbS5zdHlsZVthLnByb3BdPWEubm93K2EudW5pdDphLmVsZW1bYS5wcm9wXT1hLm5vd319fSksZi5lYWNoKGNwLmNvbmNhdC5hcHBseShbXSxjcCksZnVuY3Rpb24oYSxiKXtiLmluZGV4T2YoIm1hcmdpbiIpJiYoZi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykrYS51bml0KX0pfSksZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBmLmdyZXAoZi50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9KTt2YXIgY3YsY3c9L150KD86YWJsZXxkfGgpJC9pLGN4PS9eKD86Ym9keXxodG1sKSQvaTsiZ2V0Qm91bmRpbmdDbGllbnRSZWN0ImluIGMuZG9jdW1lbnRFbGVtZW50P2N2PWZ1bmN0aW9uKGEsYixjLGQpe3RyeXtkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZSl7fWlmKCFkfHwhZi5jb250YWlucyhjLGEpKXJldHVybiBkP3t0b3A6ZC50b3AsbGVmdDpkLmxlZnR9Ont0b3A6MCxsZWZ0OjB9O3ZhciBnPWIuYm9keSxoPWN5KGIpLGk9Yy5jbGllbnRUb3B8fGcuY2xpZW50VG9wfHwwLGo9Yy5jbGllbnRMZWZ0fHxnLmNsaWVudExlZnR8fDAsaz1oLnBhZ2VZT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmMuc2Nyb2xsVG9wfHxnLnNjcm9sbFRvcCxsPWgucGFnZVhPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmYy5zY3JvbGxMZWZ0fHxnLnNjcm9sbExlZnQsbT1kLnRvcCtrLWksbj1kLmxlZnQrbC1qO3JldHVybnt0b3A6bSxsZWZ0Om59fTpjdj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1hLm9mZnNldFBhcmVudCxnPWEsaD1iLmJvZHksaT1iLmRlZmF1bHRWaWV3LGo9aT9pLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKTphLmN1cnJlbnRTdHlsZSxrPWEub2Zmc2V0VG9wLGw9YS5vZmZzZXRMZWZ0O3doaWxlKChhPWEucGFyZW50Tm9kZSkmJmEhPT1oJiZhIT09Yyl7aWYoZi5zdXBwb3J0LmZpeGVkUG9zaXRpb24mJmoucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2Q9aT9pLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKTphLmN1cnJlbnRTdHlsZSxrLT1hLnNjcm9sbFRvcCxsLT1hLnNjcm9sbExlZnQsYT09PWUmJihrKz1hLm9mZnNldFRvcCxsKz1hLm9mZnNldExlZnQsZi5zdXBwb3J0LmRvZXNOb3RBZGRCb3JkZXImJighZi5zdXBwb3J0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzfHwhY3cudGVzdChhLm5vZGVOYW1lKSkmJihrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxnPWUsZT1hLm9mZnNldFBhcmVudCksZi5zdXBwb3J0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmZC5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fDAsbCs9cGFyc2VGbG9hdChkLmJvcmRlckxlZnRXaWR0aCl8fDApLGo9ZH1pZihqLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ai5wb3NpdGlvbj09PSJzdGF0aWMiKWsrPWgub2Zmc2V0VG9wLGwrPWgub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmai5wb3NpdGlvbj09PSJmaXhlZCImJihrKz1NYXRoLm1heChjLnNjcm9sbFRvcCxoLnNjcm9sbFRvcCksbCs9TWF0aC5tYXgoYy5zY3JvbGxMZWZ0LGguc2Nyb2xsTGVmdCkpO3JldHVybnt0b3A6ayxsZWZ0Omx9fSxmLmZuLm9mZnNldD1mdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGM9dGhpc1swXSxkPWMmJmMub3duZXJEb2N1bWVudDtpZighZClyZXR1cm4gbnVsbDtpZihjPT09ZC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGMpO3JldHVybiBjdihjLGQsZC5kb2N1bWVudEVsZW1lbnQpfSxmLm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWYuY3NzKGEsInBvc2l0aW9uIik7ZD09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZT1mKGEpLGc9ZS5vZmZzZXQoKSxoPWYuY3NzKGEsInRvcCIpLGk9Zi5jc3MoYSwibGVmdCIpLGo9KGQ9PT0iYWJzb2x1dGUifHxkPT09ImZpeGVkIikmJmYuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aj8obD1lLnBvc2l0aW9uKCksbT1sLnRvcCxuPWwubGVmdCk6KG09cGFyc2VGbG9hdChoKXx8MCxuPXBhcnNlRmxvYXQoaSl8fDApLGYuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxnKSksYi50b3AhPW51bGwmJihrLnRvcD1iLnRvcC1nLnRvcCttKSxiLmxlZnQhPW51bGwmJihrLmxlZnQ9Yi5sZWZ0LWcubGVmdCtuKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxrKTplLmNzcyhrKX19LGYuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWN4LnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtjLnRvcC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYy5sZWZ0LT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDAsZC50b3ArPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsZC5sZWZ0Kz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjLmJvZHk7d2hpbGUoYSYmIWN4LnRlc3QoYS5ub2RlTmFtZSkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L1kvLnRlc3QoYyk7Zi5mblthXT1mdW5jdGlvbihlKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGUsZyl7dmFyIGg9Y3koYSk7aWYoZz09PWIpcmV0dXJuIGg/YyBpbiBoP2hbY106Zi5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtlXXx8aC5kb2N1bWVudC5ib2R5W2VdOmFbZV07aD9oLnNjcm9sbFRvKGQ/ZihoKS5zY3JvbGxMZWZ0KCk6ZyxkP2c6ZihoKS5zY3JvbGxUb3AoKSk6YVtlXT1nfSxhLGUsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxmLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGMpe3ZhciBkPSJjbGllbnQiK2EsZT0ic2Nyb2xsIithLGc9Im9mZnNldCIrYTtmLmZuWyJpbm5lciIrYV09ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGMsInBhZGRpbmciKSk6dGhpc1tjXSgpOm51bGx9LGYuZm5bIm91dGVyIithXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGMsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbY10oKTpudWxsfSxmLmZuW2NdPWZ1bmN0aW9uKGEpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsYyxoKXt2YXIgaSxqLGssbDtpZihmLmlzV2luZG93KGEpKXtpPWEuZG9jdW1lbnQsaj1pLmRvY3VtZW50RWxlbWVudFtkXTtyZXR1cm4gZi5zdXBwb3J0LmJveE1vZGVsJiZqfHxpLmJvZHkmJmkuYm9keVtkXXx8an1pZihhLm5vZGVUeXBlPT09OSl7aT1hLmRvY3VtZW50RWxlbWVudDtpZihpW2RdPj1pW2VdKXJldHVybiBpW2RdO3JldHVybiBNYXRoLm1heChhLmJvZHlbZV0saVtlXSxhLmJvZHlbZ10saVtnXSl9aWYoaD09PWIpe2s9Zi5jc3MoYSxjKSxsPXBhcnNlRmxvYXQoayk7cmV0dXJuIGYuaXNOdW1lcmljKGwpP2w6a31mKGEpLmNzcyhjLGgpfSxjLGEsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS9zdGF0aWMvanMvcHVueS5qcyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL3B1bnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ODg4YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvc3RhdGljL2pzL3B1bnkuanMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUHVueSAtIEEgbGlnaHQtd2VpZ2h0IGNvbnRlbnQgZWRpdG9yIGZvciBCYWxhbmNlIGFwcGxpY2F0aW9ucworICogCisgKiBUaGlzIGxpYnJhcnkgZGVwZW5kcyBvbiBKUXVlcnkgdiAxLjQuMSBvciBoaWdoZXIgKGh0dHA6Ly93d3cuanF1ZXJ5LmNvbSkKKyAqLworJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisJCisJLy8gU3VwcG9ydCBjbGljay10by1lZGl0IG9uIHB1bnkgZWxlbWVudHMKKwkkKCdbcHVueV0nKS5saXZlKCdjbGljaycsZnVuY3Rpb24oZXZlbnQpIHsKKwkJcHVueUluaXRFZGl0b3IoJCh0aGlzKSk7CisJfSk7CisJLy8gRW5hYmxlIHRoZSBlZGl0b3Igc2F2ZSBidXR0b24KKwkkKCcjZ29sbHVtLWVkaXRvci1zdWJtaXQnKS5saXZlKCdjbGljaycsIHB1bnlQZXJzaXN0Q2hhbmdlcyk7CisJLy8gRW5hYmxlIHRoZSBlZGl0b3IgY2FuY2VsIGJ1dHRvbgorCSQoJyNnb2xsdW0tZWRpdG9yLWNhbmNlbCcpLmxpdmUoJ2NsaWNrJywgcHVueUNhbmNlbCk7CisJCit9KTsKKwordmFyIGVkaXRpbmdSZXNvdXJjZUlkID0gZmFsc2U7CisKKworZnVuY3Rpb24gcHVueUluaXRFZGl0b3IgKCBlbG10ICkgeworCWVkaXRpbmdSZXNvdXJjZUlkID0gZWxtdC5hdHRyKCdwdW55Jyk7CisJd2luZG93LmxvY2F0aW9uID0gcHVueV9tb2R1bGVfcm9vdCArICcvZWRpdC8nICsgZWRpdGluZ1Jlc291cmNlSWQ7Cit9OworCitmdW5jdGlvbiBwdW55Q2FuY2VsKCkgeworCXdpbmRvdy5sb2NhdGlvbiA9IHB1bnlfY3VycmVudF91cmw7Cit9CisKK2Z1bmN0aW9uIHB1bnlQZXJzaXN0Q2hhbmdlcyhldmVudCkgeworCWVkaXRpbmdSZXNvdXJjZUlkID0gJCgnI3B1bnlSZXNvdXJjZUlkJykudmFsKCk7CisJJC5wb3N0KCBwdW55X21vZHVsZV9yb290ICsgJy9zdG9yZS5kbycseworCQkncmVzb3VyY2VJZCcgOiBlZGl0aW5nUmVzb3VyY2VJZAorCQksICdjb250ZW50JyAgOiAkKCcjZ29sbHVtLWVkaXRvci1ib2R5JykudmFsKCkKKwl9LGZ1bmN0aW9uKCBkYXRhICkgeworCQl3aW5kb3cubG9jYXRpb24gPSBwdW55X2N1cnJlbnRfdXJsOworCX0sICdqc29uJyk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3ZpZXdzL2VkaXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9lZGl0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRlZDMyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9lZGl0LnBocApAQCAtMCwwICsxLDE0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworCisvLyBQYXNzIHRoZSBpbnN0YWxsZWQgc2l0ZSByb290IHRvIGphdmFzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitBcHA6OkdldCgpLT5yZXNwb25zZS0+YWRkSmF2YXNjcmlwdCgidmFyIHNpdGVfcm9vdCA9ICciIC4gU0lURV9ST09UIC4gIic7Iix0cnVlKTsKKwkJCQkKKy8vIERvbid0IHNob3cgYSBoZWFkZXIgb3IgZm9vdGVyIG9uIHRoaXMgdmlldworQXBwOjpHZXQoKS0+cmVzcG9uc2UtPnVzZUhlYWRlckZpbGUoZmFsc2UpOworQXBwOjpHZXQoKS0+cmVzcG9uc2UtPnVzZUZvb3RlckZpbGUoZmFsc2UpOworCisvLyBJbmNsdWRlIHRoZSBtYWluIFB1bnkgY2xhc3MKK3JlcXVpcmVfb25jZShBcHA6OkdldCgpLT5zZXR0aW5nc1sncHVueV9tb2R1bGVfcGF0aCddIC4gJy9jbGFzc2VzL1B1bnkuY2xhc3MucGhwJyk7CisKKy8vIExvYWQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZQorJHJlc291cmNlID0gUHVueTo6bG9hZChBcHA6OkdldCgpLT5yZXF1ZXN0LT5zZWdtZW50c1swXSk7CisKKy8vIEdldCB0aGUgcmF3IGNvbnRlbnRzCiskY29udGVudCA9ICRyZXNvdXJjZS0+Z2V0Q29udGVudCh0cnVlKTsKKz8+CisKKzwhLS0gSkFWQVNDUklQVFMgLS0+Cis8IS0tIFNUWUxFU0hFRVRTIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworCQkkLkdvbGx1bUVkaXRvcigpOworCX0pOworPC9zY3JpcHQ+CisKKworPGRpdiBpZD0id2lraS13cmFwcGVyIiBjbGFzcz0iZWRpdCBvdXRlciI+CisgIDxkaXYgaWQ9ImhlYWQiPgorICAgIDxoMT5FZGl0aW5nIDxzdHJvbmc+PD9waHAgZWNobyAkcmVzb3VyY2UtPmdldElkKCk7Pz48L3N0cm9uZz48L2gxPgorICAgIDxwPihsYXRlc3QgdmVyc2lvbjogPD9waHAgZWNobyAkcmVzb3VyY2UtPmdldFZlcnNpb24oKTs/Pik8L3A+CisgIDwvZGl2PgorICA8ZGl2IGlkPSJ3aWtpLWNvbnRlbnQiPgorCQk8ZGl2IGlkPSJnb2xsdW0tZWRpdG9yIiBkYXRhLWVzY2FwZWQtbmFtZT0iSG9tZSIgY2xhc3M9ImVkaXQiPgorCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJwdW55UmVzb3VyY2VJZCIgbmFtZT0icHVueVJlc291cmNlSWQiIHZhbHVlPSI8P3BocCBlY2hvICRyZXNvdXJjZS0+Z2V0SWQoKT8+Ii8+CisKKwkJCQkJPGRpdiBpZD0iZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1iYXIiPgorCQkJCQkJPGRpdiBpZD0iZ29sbHVtLWVkaXRvci1mdW5jdGlvbi1idXR0b25zIj4KKwkJCQkJCQk8YSBocmVmPSIjIiBpZD0iZnVuY3Rpb24taDEiIGNsYXNzPSJmdW5jdGlvbi1idXR0b24iIHRpdGxlPSJIZWFkZXIgMSIgdGFiaW5kZXg9Ii0xIj4gCisJCQkJCQkJCTxzcGFuPkhlYWRlciAxPC9zcGFuPiA8L2E+CisJCQkJCQkJPGEgaHJlZj0iIyIgaWQ9ImZ1bmN0aW9uLWgyIiBjbGFzcz0iZnVuY3Rpb24tYnV0dG9uIiB0aXRsZT0iSGVhZGVyIDIiIHRhYmluZGV4PSItMSI+CisJCQkJCQkJCTxzcGFuPkhlYWRlciAyPC9zcGFuPiA8L2E+IAorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1oMyIgY2xhc3M9ImZ1bmN0aW9uLWJ1dHRvbiIgdGl0bGU9IkhlYWRlciAzIiB0YWJpbmRleD0iLTEiPgorCQkJCQkJCQk8c3Bhbj5IZWFkZXIgMzwvc3Bhbj4gPC9hPiAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iZnVuY3Rpb24tZGl2aWRlciI+Jm5ic3A7PC9zcGFuPiAKKwkJCQkJCQk8YSBocmVmPSIjIiBpZD0iZnVuY3Rpb24taW50ZXJuYWwtbGluayIgY2xhc3M9ImZ1bmN0aW9uLWJ1dHRvbiIgdGl0bGU9Ildpa2kgTGluayIgdGFiaW5kZXg9Ii0xIj4KKwkJCQkJCQkJPHNwYW4+V2lraSBMaW5rPC9zcGFuPiA8L2E+IAorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1saW5rIiBjbGFzcz0iZnVuY3Rpb24tYnV0dG9uIiB0aXRsZT0iTGluayIgdGFiaW5kZXg9Ii0xIj4KKwkJCQkJCQkJPHNwYW4+TGluazwvc3Bhbj4gPC9hPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1pbWFnZSIgY2xhc3M9ImZ1bmN0aW9uLWJ1dHRvbiIgdGl0bGU9IkltYWdlIiB0YWJpbmRleD0iLTEiPgorCQkJCQkJCQk8c3Bhbj5JbWFnZTwvc3Bhbj4gPC9hPiAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iZnVuY3Rpb24tZGl2aWRlciI+Jm5ic3A7PC9zcGFuPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1ib2xkIiBjbGFzcz0iZnVuY3Rpb24tYnV0dG9uIiB0aXRsZT0iQm9sZCIgdGFiaW5kZXg9Ii0xIj4KKwkJCQkJCQkJPHNwYW4+Qm9sZDwvc3Bhbj4gPC9hPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1pdGFsaWMiIGNsYXNzPSJmdW5jdGlvbi1idXR0b24iIHRpdGxlPSJJdGFsaWMiIHRhYmluZGV4PSItMSI+CisJCQkJCQkJCTxzcGFuPkl0YWxpYzwvc3Bhbj4gPC9hPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1jb2RlIiBjbGFzcz0iZnVuY3Rpb24tYnV0dG9uIiB0aXRsZT0iQ29kZSIgdGFiaW5kZXg9Ii0xIj4KKwkJCQkJCQkJPHNwYW4+Q29kZTwvc3Bhbj4gPC9hPiAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iZnVuY3Rpb24tZGl2aWRlciI+Jm5ic3A7PC9zcGFuPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi11bCIgY2xhc3M9ImZ1bmN0aW9uLWJ1dHRvbiIgdGl0bGU9IlVub3JkZXJlZCBMaXN0IiB0YWJpbmRleD0iLTEiPgorCQkJCQkJCQk8c3Bhbj5Vbm9yZGVyZWQgTGlzdDwvc3Bhbj4gPC9hPiAKKwkJCQkJCQk8YSBocmVmPSIjIiBpZD0iZnVuY3Rpb24tb2wiIGNsYXNzPSJmdW5jdGlvbi1idXR0b24iIHRpdGxlPSJPcmRlcmVkIExpc3QiIHRhYmluZGV4PSItMSI+CisJCQkJCQkJCTxzcGFuPk9yZGVyZWQgTGlzdDwvc3Bhbj4gPC9hPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1ibG9ja3F1b3RlIiBjbGFzcz0iZnVuY3Rpb24tYnV0dG9uIiB0aXRsZT0iQmxvY2txdW90ZSIgdGFiaW5kZXg9Ii0xIj4KKwkJCQkJCQkJPHNwYW4+QmxvY2txdW90ZTwvc3Bhbj4gPC9hPgorCQkJCQkJCTxhIGhyZWY9IiMiIGlkPSJmdW5jdGlvbi1ociIgY2xhc3M9ImZ1bmN0aW9uLWJ1dHRvbiIgdGl0bGU9Ikhvcml6b250YWwgUnVsZSIgdGFiaW5kZXg9Ii0xIj4KKwkJCQkJCQkJPHNwYW4+SG9yaXpvbnRhbCBSdWxlPC9zcGFuPiA8L2E+IAorCQkJCQkJCTxzcGFuIGNsYXNzPSJmdW5jdGlvbi1kaXZpZGVyIj4mbmJzcDs8L3NwYW4+CisJCQkJCQkJPGEgaHJlZj0iIyIgaWQ9ImZ1bmN0aW9uLWhlbHAiIGNsYXNzPSJmdW5jdGlvbi1idXR0b24iIHRpdGxlPSJIZWxwIiB0YWJpbmRleD0iLTEiPgorCQkJCQkJCQk8c3Bhbj5IZWxwPC9zcGFuPiA8L2E+CisJCQkJCQk8L2Rpdj4KKworCQkJCQkJPGRpdiBpZD0iZ29sbHVtLWVkaXRvci1mb3JtYXQtc2VsZWN0b3IiPgorCQkJCQkJCTwhLS0gIDxzZWxlY3QgaWQ9Indpa2lfZm9ybWF0IiBuYW1lPSJ3aWtpW2Zvcm1hdF0iPgorCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJhc2NpaWRvYyI+QXNjaWlEb2M8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY3Jlb2xlIj5DcmVvbGU8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibWFya2Rvd24iIHNlbGVjdGVkPSJzZWxlY3RlZCI+TWFya2Rvd248L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibWVkaWF3aWtpIj5NZWRpYVdpa2k8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ib3JnIj5PcmctbW9kZTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJwb2QiPlBvZDwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJyZG9jIj5SRG9jPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gdmFsdWU9InRleHRpbGUiPlRleHRpbGU8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icmVzdCI+cmVTdHJ1Y3R1cmVkVGV4dDwvb3B0aW9uPgorCQkJCQkJCTwvc2VsZWN0PiAtLT4KKwkJCQkJCQk8bGFiZWwgaWQ9Indpa2lfZm9ybWF0IiBuYW1lPSJ3aWtpW2Zvcm1hdF0iPk1hcmtkb3duPC9sYWJlbD4KKwkJCQkJCQk8bGFiZWwgZm9yPSJ3aWtpX2Zvcm1hdCI+RWRpdCBNb2RlPC9sYWJlbD4KKwkJCQkJCTwvZGl2PgorCQkJCQk8L2Rpdj4KKworCQkJCQk8ZGl2IGlkPSJnb2xsdW0tZWRpdG9yLWhlbHAiIGNsYXNzPSJqYXdzIiBkYXRhLWF1dG9kaXNwbGF5PSZxdW90O3RydWUmcXVvdDs+CisJCQkJCQk8dWwgaWQ9ImdvbGx1bS1lZGl0b3ItaGVscC1wYXJlbnQiPgorCQkJCQkJCTxsaT48L2xpPgorCQkJCQkJPC91bD4KKwkJCQkJCTx1bCBpZD0iZ29sbHVtLWVkaXRvci1oZWxwLWxpc3QiPgorCQkJCQkJCTxsaT48L2xpPgorCQkJCQkJPC91bD4KKwkJCQkJCTxkaXYgaWQ9ImdvbGx1bS1lZGl0b3ItaGVscC13cmFwcGVyIj4KKwkJCQkJCQk8ZGl2IGlkPSJnb2xsdW0tZWRpdG9yLWhlbHAtY29udGVudCI+CisJCQkJCQkJCTxwPjwvcD4KKwkJCQkJCQk8L2Rpdj4KKwkJCQkJCTwvZGl2PgorCQkJCQk8L2Rpdj4KKyAKKwkJCQkJPGRpdiBpZD0iZ29sbHVtLWVycm9yLW1lc3NhZ2UiPjwvZGl2PgorCQkJCQk8dGV4dGFyZWEgZGF0YS1tYXJrdXAtbGFuZz0ibWFya2Rvd24iIGZvcm1hdD0ibWFya2Rvd24iCisJCQkJCQlpZD0iZ29sbHVtLWVkaXRvci1ib2R5IiBuYW1lPSJwdW55Q29udGVudCI+PD9waHAgZWNobyBzdHJpcHNsYXNoZXMoJGNvbnRlbnQpPz48L3RleHRhcmVhPgorPCEtLSBFZGl0IE1lc3NhZ2UgLS0+CisJCQkJCTwhLS08ZGl2IGlkPSJnb2xsdW0tZWRpdG9yLWVkaXQtc3VtbWFyeSIgY2xhc3M9InNpbmdsZWxpbmUiPgorCQkJCQkJPGxhYmVsIGNsYXNzPSJqYXdzIiBmb3I9Indpa2lfY29tbWl0Ij5FZGl0IE1lc3NhZ2U8L2xhYmVsPiAKKwkJCQkJCTxpbnB1dCBpZD0iZ29sbHVtLWVkaXRvci1tZXNzYWdlLWZpZWxkIiBuYW1lPSJ3aWtpW2NvbW1pdF0iCisJCQkJCQkJcGxhY2Vob2xkZXI9IldyaXRlIGEgc21hbGwgbWVzc2FnZSBoZXJlIGV4cGxhaW5pbmcgdGhpcyBjaGFuZ2UuIChPcHRpb25hbCkiCisJCQkJCQkJdHlwZT0idGV4dCIgLz4KKwkJCQkJPC9kaXY+IC0tPgorCisJCQkJCTxzcGFuIGNsYXNzPSJqYXdzIj48YnI+IDwvc3Bhbj4gCisJCQkJCTxpbnB1dCBpZD0iZ29sbHVtLWVkaXRvci1zdWJtaXQiIGNsYXNzPSJnb2xsdW0tZWRpdG9yLWlucHV0IiBuYW1lPSJjb21taXQiCisJCQkJCQl0aXRsZT0iU2F2ZSBjdXJyZW50IGNoYW5nZXMiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiIC8+CisJCQkJCTxpbnB1dCBpZD0iZ29sbHVtLWVkaXRvci1jYW5jZWwiIGNsYXNzPSJnb2xsdW0tZWRpdG9yLWlucHV0IiBuYW1lPSJjYW5jZWwiCisJCQkJCQl0aXRsZT0iQ2FuY2VsIGNoYW5nZXMiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNhbmNlbCIgLz4KKwkJPC9kaXY+CisJPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvdmlld3MvZXJyb3IucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9lcnJvci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NjYzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvYmFsYW5jZS9tb2R1bGVzL3B1bnkvdmlld3MvZXJyb3IucGhwCkBAIC0wLDAgKzEsMzEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCS8vIEdyYWIgdGhlIG1vc3QgcmVjZW50IGVycm9yIGZyb20gdGhlIHNlc3Npb24KKwkkZXJyb3JUZXh0ID0gJF9TRVNTSU9OWydwdW55X2Vycm9yJ107CisJdW5zZXQoJF9TRVNTSU9OWydwdW55X2Vycm9yJ10pOworCQorCS8vIERvbid0IHNob3cgYSBoZWFkZXIgb3IgZm9vdGVyIGZvciB0aGlzIHZpZXcKKwlBcHA6OkdldCgpLT5yZXNwb25zZS0+dXNlSGVhZGVyRmlsZShmYWxzZSk7CisJQXBwOjpHZXQoKS0+cmVzcG9uc2UtPnVzZUZvb3RlckZpbGUoZmFsc2UpOworCis/PgorCis8aDE+UHVueTwvaDE+Cis8aDI+QW4gZXJyb3IgaGFzIG9jY3VycmVkOjwvaDI+Cis8cD48P3BocCBlY2hvICRlcnJvclRleHQ7Pz48L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9sb2dpbi5waHAgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3ZpZXdzL2xvZ2luLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmY5ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9sb2dpbi5waHAKQEAgLTAsMCArMSw2MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBQYXJzZSB0aGUgUHVueSBjb25maWcgZmlsZQorJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworQXBwOjpHZXQoKS0+cmVzcG9uc2UtPnVzZUhlYWRlckZpbGUoZmFsc2UpOworQXBwOjpHZXQoKS0+cmVzcG9uc2UtPnVzZUZvb3RlckZpbGUoZmFsc2UpOworCis/PgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KK2RpdiNsb2dpbiB7CisJcGFkZGluZzoxNXB4OworCXdpZHRoOjgwMHB4OworCWJhY2tncm91bmQtY29sb3I6I2RmZGZkZjsKKwltYXJnaW4tYm90dG9tOm5vbmU7CisJYm9yZGVyOnNvbGlkIDVweCAjODg4OworCWZvbnQtc2l6ZToxLjJlbTsKKwljb2xvcjojMzMzOworCS13ZWJraXQtYm9yZGVyLXJhZGl1czogOHB4OworCS1tb3otYm9yZGVyLXJhZGl1czogOHB4OworCWJvcmRlci1yYWRpdXM6IDhweDsKK30KK2Zvcm0geworCW1hcmdpbjozMHB4OworfQoraW5wdXQgeworCXBhZGRpbmc6NXB4OworCW1hcmdpbi1yaWdodDo1cHg7Cit9CitsYWJlbCB7CisJcGFkZGluZy1yaWdodDo1cHg7Cit9Cis8L3N0eWxlPgorPGNlbnRlcj4KKzxwPiZuYnNwOzwvcD4KKzxkaXYgaWQ9ImxvZ2luIj4KKzxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI8P3BocCBlY2hvICRtb2R1bGUtPm1vZHVsZVJvb3Q/Pi9sb2dpbi5kbyI+Cis8bGFiZWw+VXNlcm5hbWU6PC9sYWJlbD4KKzxpbnB1dCB0eXBlPSJ0ZXh0IiBhbHQ9InVzZXJuYW1lIGlucHV0IiBuYW1lPSJ1c2VybmFtZSIvPgorPGxhYmVsPlBhc3N3b3JkOjwvbGFiZWw+Cis8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGFsdD0icGFzc3dvcmQgaW5wdXQiIG5hbWU9InBhc3N3b3JkIi8+Cis8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iLz4KKzwvZm9ybT4KKzwvZGl2PgorPC9jZW50ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9sb2dvdXQucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9sb2dvdXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjQ1OWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3ZpZXdzL2xvZ291dC5waHAKQEAgLTAsMCArMSwzMiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBQYXJzZSB0aGUgUHVueSBjb25maWcgZmlsZQorJG1vZHVsZSA9IEFwcDo6R2V0KCktPmxvYWRNb2R1bGUoKTsKKworLy8gSW5jbHVkZSB0aGUgbWFpbiBQdW55IGNsYXNzCityZXF1aXJlX29uY2UoJG1vZHVsZS0+bW9kdWxlUGF0aCAuICcvY2xhc3Nlcy9QdW55LmNsYXNzLnBocCcpOworCisvLyBJbnN0YW50aWF0ZSBQdW55CiskcHVueSA9IG5ldyBQdW55KCk7CisKKy8vIERlc3Ryb3kgdGhlIGVkaXRvciBzZXNzaW9uCiskcHVueS0+ZGVzdHJveUVkaXRvclNlc3Npb24oKTsKKworLy8gUmVkaXJlY3QgaG9tZQorQXBwOjpHZXQoKS0+cmVkaXJlY3QoU0lURV9ST09UIC4gJy8nKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2JhbGFuY2UvbW9kdWxlcy9wdW55L3ZpZXdzL3ByZXZpZXcucGhwIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9wcmV2aWV3LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRjOTJjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9iYWxhbmNlL21vZHVsZXMvcHVueS92aWV3cy9wcmV2aWV3LnBocApAQCAtMCwwICsxLDM2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFBhcnNlIHRoZSBQdW55IGNvbmZpZyBmaWxlCiskbW9kdWxlID0gQXBwOjpHZXQoKS0+bG9hZE1vZHVsZSgpOworCisvLyBJbmNsdWRlIHRoZSBtYWluIFB1bnkgY2xhc3MKK3JlcXVpcmVfb25jZSgkbW9kdWxlLT5tb2R1bGVQYXRoIC4gJy9jbGFzc2VzL1B1bnkuY2xhc3MucGhwJyk7CisKKy8vIEluc3RhbnRpYXRlIFB1bnkKKyRwdW55ID0gbmV3IFB1bnkoKTsKKworLy8gT2J0YWluIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlcXVlc3QKKyRyZXNvdXJjZUlkID0gQXBwOjpHZXQoKS0+cmVxdWVzdC0+c2VnbWVudHNbMF07CiskdmVyc2lvbklkICA9IGlzc2V0KEFwcDo6R2V0KCktPnJlcXVlc3QtPnNlZ21lbnRzWzFdKSA/IEFwcDo6R2V0KCktPnJlcXVlc3QtPnNlZ21lbnRzWzFdIDogbnVsbDsKKworLy8gTG9hZCwgcGFyc2UsIGFuZCBkaXNwbGF5IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKK2VjaG8gJHB1bnktPmxvYWQoJHJlc291cmNlSWQsICR2ZXJzaW9uSWQpLT5nZXRDb250ZW50KCk7CisKKy8vIHdlJ3JlIGRvbmUgOikKKz8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3BvbS54bWwgYi8wLjEwL2NhdGFsb2cvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU0YjYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3BvbS54bWwKQEAgLTAsMCArMSwyMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGFydGlmYWN0SWQ+Y2FzLWNhdGFsb2c8L2FydGlmYWN0SWQ+CisgIDxuYW1lPk9PRFQgQ0FTIFZpcnR1YWwgQ2F0YWxvZyBhbmQgSW50ZWdyYXRpb24gU2VydmljZS48L25hbWU+CisgIDxkZXNjcmlwdGlvbj5DQVMgQ2F0YWxvZyBpcyBhbiBlZmZvcnQgdG8gdmlydHVhbGl6ZSB1bmRlcmx5aW5nIAorICBjYXRhbG9ncyBmb3IgdXNlIGluIHRoZSBDQVMgc3lzdGVtLiBIZXRlcm9nZW5lb3VzIGNhdGFsb2cgbW9kZWxzIAorICBhcmUgbWFwcGVkIHRvIGEgY29tbW9uIGRpY3Rpb25hcnksIGFuZCB0aGVuIGludGVncmF0ZWQgbG9jYWxseSBzbyB0aGF0CisgIHRoZXkgbWF5IGJlIHF1ZXJpZWQgYWNyb3NzIGFuZCBpbmdlc3RlZCBpbnRvLgorICA8L2Rlc2NyaXB0aW9uPgorICA8c2NtPgorICAgCTxjb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL2NhdGFsb2c8L2Nvbm5lY3Rpb24+CisgICAJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvY2F0YWxvZzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgIAk8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyL2NhdGFsb2c8L3VybD4KKyAgPC9zY20+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvKi5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPnRtcGRpcjwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICA8bmFtZT50ZXN0LnRtcGRpcjwvbmFtZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+CisgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgPG5hbWU+amF2YS5pby50bXBkaXI8L25hbWU+CisgICAgICAgICAgICAgICA8dmFsdWU+JHt0ZXN0LnRtcGRpcn08L3ZhbHVlPgorICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgPC9wcm9maWxlcz4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICAgIDxhcmNoaXZlIC8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jb25maWc8L3RhcmdldFBhdGg+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5jYXRzZXJ2LXByb3BlcnRpZXMueG1sPC9pbmNsdWRlPiAgICAgICAgICAKKyAgICAgICAgICA8aW5jbHVkZT5jYXRzZXJ2LWJlYW5zLnhtbDwvaW5jbHVkZT4gICAgCisgICAgICAgICAgPGluY2x1ZGU+Y2F0c2Vydi1zZXJ2ZXItY29uZmlnLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5jYXRzZXJ2LXNlcnZlci1jbWQtbGluZS1iZWFucy54bWw8L2luY2x1ZGU+ICAgICAgICAgIAorICAgICAgICAgIDxpbmNsdWRlPmNhdHNlcnYtY2xpZW50LWNvbmZpZy54bWw8L2luY2x1ZGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICA8aW5jbHVkZT5jYXRzZXJ2LWNsaWVudC1hY3Rpb24tYmVhbnMueG1sPC9pbmNsdWRlPiAgICAgICAgICAKKyAgICAgICAgICA8aW5jbHVkZT5jYXRzZXJ2LWNsaWVudC1jbWQtbGluZS1iZWFucy54bWw8L2luY2x1ZGU+ICAgICAgICAgIAorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgPC9idWlsZD4KKyAgPGNpTWFuYWdlbWVudD4KKyAgICA8bm90aWZpZXJzPgorICAgICAgPG5vdGlmaWVyPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YWRkcmVzcz5jaHJpcy5tYXR0bWFubkBqcGwubmFzYS5nb3Y8L2FkZHJlc3M+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvbm90aWZpZXI+CisgICAgPC9ub3RpZmllcnM+CisgIDwvY2lNYW5hZ2VtZW50PgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b29kdC1jb21tb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4gICAgCisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtY2xpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4gICAgCisgICAgPC9kZXBlbmRlbmN5PiAgCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5sdWNlbmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sdWNlbmUtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMC4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPnhtbHJwYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhtbHJwYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MueHN0cmVhbTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhzdHJlYW08L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjMuMTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDwhLS0geG9tIGlzIGFuIG9wdGlvbmFsIGRlcGVuZGVuY3kgb2YgeHN0cmVhbS4gSXRzIGFsc28gYW4gQXBhY2hlIGluY29tcGF0aWJsZSBsaWNlbnNlIC0tPgorICAgICAgICAgIDxncm91cElkPnhvbTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD54b208L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPiAKKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5oc3FsZGI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oc3FsZGI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjguMC43PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8IS0tIAorICA8cmVwb3J0aW5nPgorICAJPHBsdWdpbnM+CisgIAkJPHBsdWdpbj4KKyAgCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAJCQk8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+CisgIAkJCTx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgCQkJPGNvbmZpZ3VyYXRpb24+CisgIAkJCQk8Y2hlY2tvdXREaXJlY3RvcnlOYW1lPmNhdGFsb2c8L2NoZWNrb3V0RGlyZWN0b3J5TmFtZT4KKyAgCQkJPC9jb25maWd1cmF0aW9uPgorICAJCTwvcGx1Z2luPgorICAJPC9wbHVnaW5zPgorICA8L3JlcG9ydGluZz4KKy0tPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlODMyZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw3NyBAQAorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+DQorPGFzc2VtYmx5Pg0KKyAgPGlkPmRpc3Q8L2lkPg0KKyAgPGZvcm1hdHM+DQorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCisgIDwvZm9ybWF0cz4NCisgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4gIAorICA8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5Pg0KKyAgPGZpbGVTZXRzPg0KKyAgICA8ZmlsZVNldD4NCisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4NCisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4NCisgICAgICA8aW5jbHVkZXM+DQorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPg0KKyAgICAgIDwvaW5jbHVkZXM+DQorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KioucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFTU9WRS5sb2c8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXRjPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+DQorICA8L2ZpbGVTZXRzPg0KKyAgPGRlcGVuZGVuY3lTZXRzPg0KKyAgICA8ZGVwZW5kZW5jeVNldD4NCisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4NCisgICAgICA8dW5wYWNrT3B0aW9ucy8+DQorICAgIDwvZGVwZW5kZW5jeVNldD4NCisgIDwvZGVwZW5kZW5jeVNldHM+DQorPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vYmluL2NhdHNlcnYtY2xpZW50IGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2Jpbi9jYXRzZXJ2LWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJmZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2Jpbi9jYXRzZXJ2LWNsaWVudApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vY3NoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3NldCBhcmdzCisKK2lmICggJCNhcmdzID4gMCApIHRoZW4KKyAgICAgICAgc2V0IGFyZ3MgPSAiJCoiCitlbmRpZgorCitzZXRlbnYgQ0FUQUxPR19IT01FIGBwd2RgLy4uCisKKyR7SkFWQV9IT01FfS9iaW4vamF2YSBcCisgICAgICAgIC1EamF2YS5leHQuZGlycz0uLi9saWIgXAorICAgICAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPS4uL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnPS4uL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnNwcmluZy5jb25maWc9Li4vcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sIFwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5DYXRhbG9nU2VydmljZUNvbW1hbmRMaW5lQ2xpZW50ICR7YXJnc30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9iaW4vY2F0c2Vydi1zZXJ2ZXIgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vYmluL2NhdHNlcnYtc2VydmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjEyMzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vYmluL2NhdHNlcnYtc2VydmVyCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9jc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc2V0IGFyZ3MKKworaWYgKCAkI2FyZ3MgPiAwICkgdGhlbgorICAgICAgICBzZXQgYXJncyA9ICIkKiIKK2VuZGlmCisKK3NldGVudiBDQVRBTE9HX0hPTUUgYHB3ZGAvLi4KKworJHtKQVZBX0hPTUV9L2Jpbi9qYXZhIFwKKyAgICAgICAgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBcCisgICAgICAgIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9Li4vZXRjL2xvZ2dpbmcucHJvcGVydGllcyBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnNwcmluZy5jb25maWc9Li4vcG9saWN5L2NtZC1saW5lLXNlcnZlci1hY3Rpb25zLnhtbCBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnNwcmluZy5jb25maWc9Li4vcG9saWN5L2NtZC1saW5lLXNlcnZlci1vcHRpb25zLnhtbCBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuQ2F0YWxvZ1NlcnZpY2VTZXJ2ZXJMYXVuY2hlciAke2FyZ3N9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9DYXRhbG9nU2VydmljZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vQ2F0YWxvZ1NlcnZpY2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q4MGZmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vQ2F0YWxvZ1NlcnZpY2VDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLkNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWwueG1scnBjLlhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLmltcGwuQ2F0YWxvZ1NlcnZpY2VDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5pbXBsLkNhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKKworLyoqCisgKiBCYXNlIENhdGFsb2cgU2VydmljZSB7QGxpbmsgQ21kTGluZUFjdGlvbn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYXRhbG9nU2VydmljZUNsaUFjdGlvbiBleHRlbmRzIENtZExpbmVBY3Rpb24geworCisgICBwcml2YXRlIENhdGFsb2dTZXJ2aWNlQ2xpZW50IGNsaWVudDsKKworICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnVybCIpOworICAgfQorCisgICBwcml2YXRlIGludCBnZXRDaHVua1NpemUoKSB7CisgICAgICByZXR1cm4gSW50ZWdlci5nZXRJbnRlZ2VyKCJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY2h1bmtTaXplIiwgMTAyNCk7CisgICB9CisKKyAgIHByaXZhdGUgaW50IGdldFJlcXVlc3RUaW1lb3V0KCkgeworICAgICAgcmV0dXJuIEludGVnZXIuZ2V0SW50ZWdlcigib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcXVlc3RUaW1lb3V0IiwgMjApOworICAgfQorCisgICBwcml2YXRlIGludCBnZXRDb25uZWN0aW9uVGltZW91dCgpIHsKKyAgICAgIHJldHVybiBJbnRlZ2VyLmdldEludGVnZXIoIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jb25uZWN0aW9uVGltZW91dCIsIDYwKTsKKyAgIH0KKworICAgcHJpdmF0ZSBpbnQgZ2V0QXV0b1BhZ2VyU2l6ZSgpIHsKKyAgICAgIHJldHVybiBJbnRlZ2VyLmdldEludGVnZXIoIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5hdXRvUGFnZXJTaXplIiwgMTAwMCk7CisgICB9CisKKyAgIHB1YmxpYyBDYXRhbG9nU2VydmljZUNsaWVudCBnZXRDbGllbnQoKSB7CisgICAgICBpZiAoY2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgIENhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yeSgpOworICAgICAgICAgZmFjdG9yeS5zZXRDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEZhY3RvcnkoZ2V0Q29tbXVuaWNhdGlvbkNoYW5uZWxGYWN0b3J5KCkpOworICAgICAgICAgZmFjdG9yeS5zZXRBdXRvUGFnZXJTaXplKGdldEF1dG9QYWdlclNpemUoKSk7CisgICAgICAgICByZXR1cm4gY2xpZW50ID0gZmFjdG9yeS5jcmVhdGVDYXRhbG9nU2VydmljZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5IGdldENvbW11bmljYXRpb25DaGFubmVsRmFjdG9yeSgpIHsKKyAgICAgIFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeSgpOworICAgICAgZmFjdG9yeS5zZXRTZXJ2ZXJVcmwoZ2V0VXJsKCkpOworICAgICAgZmFjdG9yeS5zZXRDaHVua1NpemUoZ2V0Q2h1bmtTaXplKCkpOworICAgICAgZmFjdG9yeS5zZXRSZXF1ZXN0VGltZW91dChnZXRSZXF1ZXN0VGltZW91dCgpKTsKKyAgICAgIGZhY3Rvcnkuc2V0Q29ubmVjdGlvblRpbWVvdXQoZ2V0Q29ubmVjdGlvblRpbWVvdXQoKSk7CisgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jbGkvYWN0aW9uL0dldFN1cHBvcnRlZENhdGFsb2dJZHNDbGlBY3Rpb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jbGkvYWN0aW9uL0dldFN1cHBvcnRlZENhdGFsb2dJZHNDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBlNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vR2V0U3VwcG9ydGVkQ2F0YWxvZ0lkc0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLmltcGwuQ2F0YWxvZ1NlcnZpY2VDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0IGEgbGlzdCBvZiBzdXBwb3J0ZWQge0BsaW5rIENhdGFsb2d9CisgKiBJRHMgZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nU2VydmljZUNsaWVudH0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpIAorICovCitwdWJsaWMgY2xhc3MgR2V0U3VwcG9ydGVkQ2F0YWxvZ0lkc0NsaUFjdGlvbiBleHRlbmRzIENhdGFsb2dTZXJ2aWNlQ2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJDYXRhbG9nSURzOiAiICsgZ2V0Q2xpZW50KCkuZ2V0Q3VycmVudENhdGFsb2dJZHMoKSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBzdXBwb3J0ZWQgQ2F0YWxvZyBJRHMgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vTG9hZENhdGFsb2dSZXBvc2l0b3J5Q2xpQWN0aW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9Mb2FkQ2F0YWxvZ1JlcG9zaXRvcnlDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNkZGRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vTG9hZENhdGFsb2dSZXBvc2l0b3J5Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggYWxsb3dzIHtAbGluayBDYXRhbG9nfXMgdG8gYmUgbG9hZGVkIGZyb20KKyAqIGFuIGV4aXN0aW5nIHtAbGluayBDYXRhbG9nUmVwb3NpdG9yeUZhY3Rvcnl9IGFuZCB0byBiZSBhZGQgdG8gYSBydW5uaW5nCisgKiBDYXRhbG9nIFNlcnZpY2UgZnJvbSBhbiBleGlzdGluZyBTcHJpbmcgYmVhbiBYTUwgZmlsZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIExvYWRDYXRhbG9nUmVwb3NpdG9yeUNsaUFjdGlvbiBleHRlbmRzIENhdGFsb2dTZXJ2aWNlQ2xpQWN0aW9uIHsKKworICAgcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nUmVwb3NpdG9yeUlkOworICAgcHJvdGVjdGVkIFN0cmluZyBiZWFuUmVwbzsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChjYXRhbG9nUmVwb3NpdG9yeUlkLCAiTXVzdCBzcGVjaWZ5IGNhdGFsb2dSZXBvc2l0b3J5SWQiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwoYmVhblJlcG8sICJNdXN0IHNwZWNpZnkgYmVhblJlcG8iKTsKKworICAgICAgICAgRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0ID0gbmV3IEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQoCisgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyB0aGlzLmJlYW5SZXBvIH0sIGZhbHNlKTsKKyAgICAgICAgIGFwcENvbnRleHQuc2V0Q2xhc3NMb2FkZXIobmV3IFNlcmlhbGl6ZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgIGFwcENvbnRleHQucmVmcmVzaCgpOworICAgICAgICAgQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSAoQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5KSBhcHBDb250ZXh0CisgICAgICAgICAgICAgICAuZ2V0QmVhbih0aGlzLmNhdGFsb2dSZXBvc2l0b3J5SWQsIENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5jbGFzcyk7CisgICAgICAgICBDYXRhbG9nUmVwb3NpdG9yeSBjYXRhbG9nUmVwb3NpdG9yeSA9IGZhY3RvcnkuY3JlYXRlUmVwb3NpdG9yeSgpOworICAgICAgICAgU2V0PENhdGFsb2c+IGNhdGFsb2dzID0gY2F0YWxvZ1JlcG9zaXRvcnkuZGVzZXJpYWxpemVBbGxDYXRhbG9ncygpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJEZXNlcmlhbGl6ZWQgQ2F0YWxvZ3M6ICIgKyBjYXRhbG9ncy50b1N0cmluZygpKTsKKyAgICAgICAgIGZvciAoQ2F0YWxvZyBjYXRhbG9nIDogY2F0YWxvZ3MpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiQWRkaW5nIENhdGFsb2c6ICIgKyBjYXRhbG9nKTsKKyAgICAgICAgICAgIGdldENsaWVudCgpLmFkZENhdGFsb2coY2F0YWxvZyk7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgY2F0YWxvZ3MgZnJvbSBiZWFuIHJlcG8gOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nUmVwb3NpdG9yeUlkKFN0cmluZyBjYXRhbG9nUmVwb3NpdG9yeUlkKSB7CisgICAgICB0aGlzLmNhdGFsb2dSZXBvc2l0b3J5SWQgPSBjYXRhbG9nUmVwb3NpdG9yeUlkOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRCZWFuUmVwbyhTdHJpbmcgYmVhblJlcG8pIHsKKyAgICAgIHRoaXMuYmVhblJlcG8gPSBiZWFuUmVwbzsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jbGkvYWN0aW9uL0xvYWRDYXRhbG9nc0NsaUFjdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vTG9hZENhdGFsb2dzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2MzdiMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jbGkvYWN0aW9uL0xvYWRDYXRhbG9nc0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggbG9hZHMge0BsaW5rIENhdGFsb2d9cyBmcm9tIGEgU3ByaW5nIFhNTCBmaWxlCisgKiBhbmQgYWRkcyB0aGVtIHRvIHRoZSBydW5uaW5nIENhdGFsb2cgU2VydmljZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIExvYWRDYXRhbG9nc0NsaUFjdGlvbiBleHRlbmRzIENhdGFsb2dTZXJ2aWNlQ2xpQWN0aW9uIHsKKworICAgcHJvdGVjdGVkIFN0cmluZyBiZWFuUmVwbzsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChiZWFuUmVwbywgIk11c3Qgc3BlY2lmeSBiZWFuUmVwbyIpOworCisgICAgICAgICBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0IHJlcG9BcHBDb250ZXh0ID0KKyAgICAgICAgICAgIG5ldyBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0KAorICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgdGhpcy5iZWFuUmVwbyB9LCBmYWxzZSk7CisgICAgICAgICByZXBvQXBwQ29udGV4dC5zZXRDbGFzc0xvYWRlcihuZXcgU2VyaWFsaXplcigpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgcmVwb0FwcENvbnRleHQucmVmcmVzaCgpOworICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICBNYXA8U3RyaW5nLCBDYXRhbG9nPiBjYXRhbG9ncyA9IHJlcG9BcHBDb250ZXh0CisgICAgICAgICAgICAgICAuZ2V0QmVhbnNPZlR5cGUoQ2F0YWxvZy5jbGFzcyk7CisgICAgICAgICBmb3IgKENhdGFsb2cgY2F0YWxvZyA6IGNhdGFsb2dzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIkFkZGluZyBjYXRhbG9nOiAiICsgY2F0YWxvZy5nZXRJZCgpKTsKKyAgICAgICAgICAgIGdldENsaWVudCgpLmFkZENhdGFsb2coY2F0YWxvZyk7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGNhdGFsb2dzIDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEJlYW5SZXBvKFN0cmluZyBiZWFuUmVwbykgeworICAgICAgdGhpcy5iZWFuUmVwbyA9IGJlYW5SZXBvOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vUGFnZWRRdWVyeUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vUGFnZWRRdWVyeUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZWY5MWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9QYWdlZFF1ZXJ5Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5wYXJzZXIuUXVlcnlQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFBhZ2VkUXVlcnlDbGlBY3Rpb24gZXh0ZW5kcyBDYXRhbG9nU2VydmljZUNsaUFjdGlvbiB7CisKKyAgIHByb3RlY3RlZCBpbnQgcGFnZU51bSA9IC0xOworICAgcHJvdGVjdGVkIGludCBwYWdlU2l6ZSA9IC0xOworICAgcHJvdGVjdGVkIFN0cmluZyBxdWVyeTsKKyAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzOworCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUuaXNUcnVlKHBhZ2VOdW0gIT0gLTEsICJNdXN0IHNwZWNpZnkgcGFnZU51bSIpOworICAgICAgICAgVmFsaWRhdGUuaXNUcnVlKHBhZ2VTaXplICE9IC0xLCAiTXVzdCBzcGVjaWZ5IHBhZ2VTaXplIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHF1ZXJ5LCAiTXVzdCBzcGVjaWZ5IHF1ZXJ5Iik7CisKKyAgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24gPSBRdWVyeVBhcnNlcgorICAgICAgICAgICAgICAgLnBhcnNlUXVlcnlFeHByZXNzaW9uKHF1ZXJ5KTsKKyAgICAgICAgIFBhZ2UgcGFnZSA9IG51bGw7CisgICAgICAgICBpZiAoY2F0YWxvZ0lkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBwYWdlID0gZ2V0Q2xpZW50KCkuZ2V0UGFnZShuZXcgUGFnZUluZm8ocGFnZVNpemUsIHBhZ2VOdW0pLAorICAgICAgICAgICAgICAgICAgcXVlcnlFeHByZXNzaW9uKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWdlID0gZ2V0Q2xpZW50KCkuZ2V0UGFnZShuZXcgUGFnZUluZm8ocGFnZVNpemUsIHBhZ2VOdW0pLAorICAgICAgICAgICAgICAgICAgcXVlcnlFeHByZXNzaW9uLCBjYXRhbG9nSWRzKTsKKyAgICAgICAgIH0KKyAgICAgICAgIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiB0cmFuc2FjdGlvbk1ldGFkYXRhcyA9IGdldENsaWVudCgpCisgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEocGFnZSk7CisgICAgICAgICBmb3IgKFRyYW5zYWN0aW9uYWxNZXRhZGF0YSB0TWV0IDogdHJhbnNhY3Rpb25NZXRhZGF0YXMpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIklEOiAiICsgdE1ldC5nZXRUcmFuc2FjdGlvbklkKCkgKyAiIDsgQ2F0YWxvZ0lEczogIgorICAgICAgICAgICAgICAgICAgKyB0TWV0LmdldENhdGFsb2dJZHMoKSArICIgOyBNZXRhZGF0YTogKCIpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBtZXRLZXkgOiB0TWV0LmdldE1ldGFkYXRhKCkuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgIHNiLmFwcGVuZChtZXRLZXkKKyAgICAgICAgICAgICAgICAgICAgICsgIj0iCisgICAgICAgICAgICAgICAgICAgICArIHRNZXQuZ2V0TWV0YWRhdGEoKS5nZXRBbGxNZXRhZGF0YSgoU3RyaW5nKSBtZXRLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCJbXFxbXFxdXSIsICInIikgKyAiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbihzYi5zdWJzdHJpbmcoMCwgc2IubGVuZ3RoKCkgLSAyKSArICIpIik7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwZXJmb3JtIHF1ZXJ5ICciICsgcXVlcnkKKyAgICAgICAgICAgICAgICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQYWdlU2l6ZShpbnQgcGFnZVNpemUpIHsKKyAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UGFnZU51bShpbnQgcGFnZU51bSkgeworICAgICAgdGhpcy5wYWdlTnVtID0gcGFnZU51bTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dJZHMoTGlzdDxTdHJpbmc+IGNhdGFsb2dJZHMpIHsKKyAgICAgIHRoaXMuY2F0YWxvZ0lkcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oY2F0YWxvZ0lkcyk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9RdWVyeUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vUXVlcnlDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk2ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vUXVlcnlDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlci5RdWVyeVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBxdWVyaWVzIENhdGFsb2cgU2VydmljZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5Q2xpQWN0aW9uICBleHRlbmRzIENhdGFsb2dTZXJ2aWNlQ2xpQWN0aW9uIHsKKworICAgcHJvdGVjdGVkIFN0cmluZyBxdWVyeTsKKyAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHF1ZXJ5LCAiTXVzdCBzcGVjaWZ5IHF1ZXJ5Iik7CisKKyAgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24gPSBRdWVyeVBhcnNlcgorICAgICAgICAgICAgICAgLnBhcnNlUXVlcnlFeHByZXNzaW9uKHF1ZXJ5KTsKKyAgICAgICAgIFF1ZXJ5UGFnZXIgcXVlcnlQYWdlciA9IG51bGw7CisgICAgICAgICBpZiAoY2F0YWxvZ0lkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBxdWVyeVBhZ2VyID0gZ2V0Q2xpZW50KCkucXVlcnkocXVlcnlFeHByZXNzaW9uKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBxdWVyeVBhZ2VyID0gZ2V0Q2xpZW50KCkucXVlcnkocXVlcnlFeHByZXNzaW9uLCBjYXRhbG9nSWRzKTsKKyAgICAgICAgIH0KKyAgICAgICAgIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiB0cmFuc2FjdGlvbk1ldGFkYXRhcyA9IGdldENsaWVudCgpCisgICAgICAgICAgICAgICAuZ2V0QWxsUGFnZXMocXVlcnlQYWdlcik7CisgICAgICAgICBmb3IgKFRyYW5zYWN0aW9uYWxNZXRhZGF0YSB0TWV0IDogdHJhbnNhY3Rpb25NZXRhZGF0YXMpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIklEOiAiICsgdE1ldC5nZXRUcmFuc2FjdGlvbklkKCkgKyAiIDsgQ2F0YWxvZ0lEczogIgorICAgICAgICAgICAgICAgICAgKyB0TWV0LmdldENhdGFsb2dJZHMoKSArICIgOyBNZXRhZGF0YTogKCIpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBtZXRLZXkgOiB0TWV0LmdldE1ldGFkYXRhKCkuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgIHNiLmFwcGVuZChtZXRLZXkKKyAgICAgICAgICAgICAgICAgICAgICsgIj0iCisgICAgICAgICAgICAgICAgICAgICArIHRNZXQuZ2V0TWV0YWRhdGEoKS5nZXRBbGxNZXRhZGF0YSgoU3RyaW5nKSBtZXRLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCJbXFxbXFxdXSIsICInIikgKyAiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbihzYi5zdWJzdHJpbmcoMCwgc2IubGVuZ3RoKCkgLSAyKSArICIpIik7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwZXJmb3JtIHF1ZXJ5ICciICsgcXVlcnkKKyAgICAgICAgICAgICAgICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRRdWVyeShTdHJpbmcgcXVlcnkpIHsKKyAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0lkcyhMaXN0PFN0cmluZz4gY2F0YWxvZ0lkcykgeworICAgICAgdGhpcy5jYXRhbG9nSWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihjYXRhbG9nSWRzKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jbGkvYWN0aW9uL1JlZHVjZWRQYWdlZFF1ZXJ5Q2xpQWN0aW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9SZWR1Y2VkUGFnZWRRdWVyeUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTA1NzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9SZWR1Y2VkUGFnZWRRdWVyeUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlBhZ2VJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlci5RdWVyeVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBxdWVyaWVzIENhdGFsb2cgU2VydmljZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFJlZHVjZWRQYWdlZFF1ZXJ5Q2xpQWN0aW9uIGV4dGVuZHMgQ2F0YWxvZ1NlcnZpY2VDbGlBY3Rpb24geworCisgICBwcm90ZWN0ZWQgaW50IHBhZ2VOdW0gPSAtMTsKKyAgIHByb3RlY3RlZCBpbnQgcGFnZVNpemUgPSAtMTsKKyAgIHByb3RlY3RlZCBTdHJpbmcgcXVlcnk7CisgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gY2F0YWxvZ0lkczsKKyAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gdGVybU5hbWVzOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5pc1RydWUocGFnZU51bSAhPSAtMSwgIk11c3Qgc3BlY2lmeSBwYWdlTnVtIik7CisgICAgICAgICBWYWxpZGF0ZS5pc1RydWUocGFnZVNpemUgIT0gLTEsICJNdXN0IHNwZWNpZnkgcGFnZVNpemUiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocXVlcnksICJNdXN0IHNwZWNpZnkgcXVlcnkiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwodGVybU5hbWVzLCAiTXVzdCBzcGVjaWZ5IHRlcm1OYW1lcyIpOworCisgICAgICAgICBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uID0gUXVlcnlQYXJzZXIKKyAgICAgICAgICAgICAgIC5wYXJzZVF1ZXJ5RXhwcmVzc2lvbihxdWVyeSk7CisgICAgICAgICBQYWdlIHBhZ2UgPSBudWxsOworICAgICAgICAgaWYgKGNhdGFsb2dJZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFnZSA9IGdldENsaWVudCgpLmdldFBhZ2UobmV3IFBhZ2VJbmZvKHBhZ2VTaXplLCBwYWdlTnVtKSwKKyAgICAgICAgICAgICAgICAgIHF1ZXJ5RXhwcmVzc2lvbik7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFnZSA9IGdldENsaWVudCgpLmdldFBhZ2UobmV3IFBhZ2VJbmZvKHBhZ2VTaXplLCBwYWdlTnVtKSwKKyAgICAgICAgICAgICAgICAgIHF1ZXJ5RXhwcmVzc2lvbiwgY2F0YWxvZ0lkcyk7CisgICAgICAgICB9CisgICAgICAgICBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gdHJhbnNhY3Rpb25NZXRhZGF0YXMgPSBnZXRDbGllbnQoKQorICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKHBhZ2UpOworICAgICAgICAgZm9yIChUcmFuc2FjdGlvbmFsTWV0YWRhdGEgdE1ldCA6IHRyYW5zYWN0aW9uTWV0YWRhdGFzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHRlcm1OYW1lIDogdGhpcy50ZXJtTmFtZXMpIHsKKyAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB0TWV0LmdldE1ldGFkYXRhKCkuZ2V0QWxsTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSB0ZXJtTmFtZSk7CisgICAgICAgICAgICAgICBzYi5hcHBlbmQodGVybU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICsgIiA9ICciCisgICAgICAgICAgICAgICAgICAgICArICh2YWx1ZXMgPT0gbnVsbCA/ICJudWxsIiA6IFN0cmluZ1V0aWxzLmpvaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuaXRlcmF0b3IoKSwgIiwiKSkgKyAiJywgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oc2Iuc3Vic3RyaW5nKDAsIHNiLmxlbmd0aCgpIC0gMikpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGVyZm9ybSBxdWVyeSAnIiArIHF1ZXJ5CisgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UGFnZVNpemUoaW50IHBhZ2VTaXplKSB7CisgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFBhZ2VOdW0oaW50IHBhZ2VOdW0pIHsKKyAgICAgIHRoaXMucGFnZU51bSA9IHBhZ2VOdW07CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkgeworICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5OworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nSWRzKExpc3Q8U3RyaW5nPiBjYXRhbG9nSWRzKSB7CisgICAgICB0aGlzLmNhdGFsb2dJZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KGNhdGFsb2dJZHMpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRSZWR1Y2VkVGVybXMoTGlzdDxTdHJpbmc+IHRlcm1OYW1lcykgeworICAgICAgdGhpcy50ZXJtTmFtZXMgPSB0ZXJtTmFtZXM7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9SZWR1Y2VkUXVlcnlDbGlBY3Rpb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9jbGkvYWN0aW9uL1JlZHVjZWRRdWVyeUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTNkYjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9SZWR1Y2VkUXVlcnlDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlci5RdWVyeVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBxdWVyaWVzIHRoZSBDYXRhbG9nIFNlcnZpY2UgYW5kIGxpbWl0cyB0aGUKKyAqIHJlc3VsdHMgdG8gYSBzdWJzZXQgb2YgZ2l2ZW4gdGVybXMuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWR1Y2VkUXVlcnlDbGlBY3Rpb24gZXh0ZW5kcyBDYXRhbG9nU2VydmljZUNsaUFjdGlvbiB7CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgcXVlcnk7CisgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gY2F0YWxvZ0lkczsKKyAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gdGVybU5hbWVzOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHF1ZXJ5LCAiTXVzdCBzcGVjaWZ5IHF1ZXJ5Iik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHRlcm1OYW1lcywgIk11c3Qgc3BlY2lmeSB0ZXJtTmFtZXMiKTsKKworICAgICAgICAgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiA9IFF1ZXJ5UGFyc2VyCisgICAgICAgICAgICAgICAucGFyc2VRdWVyeUV4cHJlc3Npb24ocXVlcnkpOworICAgICAgICAgUXVlcnlQYWdlciBxdWVyeVBhZ2VyID0gbnVsbDsKKyAgICAgICAgIGlmIChjYXRhbG9nSWRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHF1ZXJ5UGFnZXIgPSBnZXRDbGllbnQoKS5xdWVyeShxdWVyeUV4cHJlc3Npb24pOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1ZXJ5UGFnZXIgPSBnZXRDbGllbnQoKS5xdWVyeShxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpOworICAgICAgICAgfQorICAgICAgICAgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IHRyYW5zYWN0aW9uTWV0YWRhdGFzID0gZ2V0Q2xpZW50KCkKKyAgICAgICAgICAgICAgIC5nZXRBbGxQYWdlcyhxdWVyeVBhZ2VyKTsKKyAgICAgICAgIGZvciAoVHJhbnNhY3Rpb25hbE1ldGFkYXRhIHRNZXQgOiB0cmFuc2FjdGlvbk1ldGFkYXRhcykgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB0ZXJtTmFtZSA6IHRoaXMudGVybU5hbWVzKSB7CisgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gdE1ldC5nZXRNZXRhZGF0YSgpLmdldEFsbE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgdGVybU5hbWUpOworICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRlcm1OYW1lCisgICAgICAgICAgICAgICAgICAgICArICIgPSAnIgorICAgICAgICAgICAgICAgICAgICAgKyAodmFsdWVzID09IG51bGwgPyAibnVsbCIgOiBTdHJpbmdVdGlscy5qb2luKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLml0ZXJhdG9yKCksICIsIikpICsgIicsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKHNiLnN1YnN0cmluZygwLCBzYi5sZW5ndGgoKSAtIDIpKTsKKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiIiwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkgeworICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5OworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nSWRzKExpc3Q8U3RyaW5nPiBjYXRhbG9nSWRzKSB7CisgICAgICB0aGlzLmNhdGFsb2dJZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KGNhdGFsb2dJZHMpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRSZWR1Y2VkVGVybXMoTGlzdDxTdHJpbmc+IHRlcm1OYW1lcykgeworICAgICAgdGhpcy50ZXJtTmFtZXMgPSB0ZXJtTmFtZXM7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvY2xpL2FjdGlvbi9TaHV0ZG93bkNsaUFjdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vU2h1dGRvd25DbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ0OTJmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2NsaS9hY3Rpb24vU2h1dGRvd25DbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggc2h1dHMgZG93biBDYXRhbG9nIFNlcnZpY2Ugc2VydmVyLgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTaHV0ZG93bkNsaUFjdGlvbiBleHRlbmRzIENhdGFsb2dTZXJ2aWNlQ2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgZ2V0Q2xpZW50KCkuc2h1dGRvd24oKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHNodXRkb3duIHNlcnZlciA6ICIKKyAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2V4Y2VwdGlvbi9DYXRhbG9nRGljdGlvbmFyeUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL2V4Y2VwdGlvbi9DYXRhbG9nRGljdGlvbmFyeUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWJlZGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzczNDk4NzQxMDc3ODE5OTk1NUw7CisKKwlwdWJsaWMgQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nRGljdGlvbmFyeUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisJCXN1cGVyKG1zZyk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nRGljdGlvbmFyeUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1zZywgdGhyb3dhYmxlKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dFeGNlcHRpb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9leGNlcHRpb24vQ2F0YWxvZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjU1NTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NzM0OTg3NDEwNzc4MTk5OTU1TDsKKworCXB1YmxpYyBDYXRhbG9nRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgQ2F0YWxvZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisJCXN1cGVyKG1zZyk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKwkJc3VwZXIobXNnLCB0aHJvd2FibGUpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9leGNlcHRpb24vQ2F0YWxvZ0luZGV4RXhjZXB0aW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dJbmRleEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTI5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dJbmRleEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbG9nSW5kZXhFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzczNDk4NzQxMDc3ODE5OTk1NUw7CisKKwlwdWJsaWMgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwkJc3VwZXIobXNnKTsKKwl9CisJCisJcHVibGljIENhdGFsb2dJbmRleEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1zZywgdGhyb3dhYmxlKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5MDQyZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9leGNlcHRpb24vQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzczNDk4NzQxMDc3ODE5OTk1NUw7CisKKwlwdWJsaWMgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisJCXN1cGVyKG1zZyk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1zZywgdGhyb3dhYmxlKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0NhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZmZiYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9leGNlcHRpb24vQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzczNDk4NzQxMDc3ODE5OTk1NUw7CisKKwlwdWJsaWMgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisJCXN1cGVyKG1zZyk7CisJfQorCQorCXB1YmxpYyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1zZywgdGhyb3dhYmxlKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0luZ2VzdFNlcnZpY2VFeGNlcHRpb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9leGNlcHRpb24vSW5nZXN0U2VydmljZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTAwMWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL0luZ2VzdFNlcnZpY2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSW5nZXN0U2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NzM0OTg3NDEwNzc4MTk5OTU1TDsKKworCXB1YmxpYyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSW5nZXN0U2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisJCXN1cGVyKG1zZyk7CisJfQorCQorCXB1YmxpYyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKwkJc3VwZXIobXNnLCB0aHJvd2FibGUpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9leGNlcHRpb24vUXVlcnlTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL1F1ZXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjU4ODMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvZXhjZXB0aW9uL1F1ZXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeVNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzczNDk4NzQxMDc3ODE5OTk1NUw7CisKKwlwdWJsaWMgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwkJc3VwZXIobXNnKTsKKwl9CisJCisJcHVibGljIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1zZywgdGhyb3dhYmxlKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvbWFwcGluZy9EYXRhU291cmNlSW5nZXN0TWFwcGVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvbWFwcGluZy9EYXRhU291cmNlSW5nZXN0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NzczNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0RhdGFTb3VyY2VJbmdlc3RNYXBwZXIuamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tYXBwaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL1NRTCBpbXBvcnRzCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5DYXRhbG9nUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5JbmRleFBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkluZ2VzdFJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRlLkRhdGVVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgSW5nZXN0IE1hcHBlciB0aGF0IGluZGV4ZXMgdG8gYW4gRGF0YVNvdXJjZSBEYXRhYmFzZQorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlSW5nZXN0TWFwcGVyIGltcGxlbWVudHMgSW5nZXN0TWFwcGVyIHsKKworCXByb3RlY3RlZCBEYXRhU291cmNlIGRhdGFTb3VyY2U7CisJCisJcHVibGljIERhdGFTb3VyY2VJbmdlc3RNYXBwZXIoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzLCBTdHJpbmcgZHJpdmVyLAorCQkJU3RyaW5nIGpkYmNVcmwpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKwkJdGhpcy5kYXRhU291cmNlID0gRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5idWlsZERhdGFTb3VyY2UodXNlciwgcGFzcywKKyAgICAgICAgICAgICAgICBkcml2ZXIsIGpkYmNVcmwpOworCX0KKwkKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlQWxsTWFwcGluZ3NGb3JDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisJCXRyeSB7CisJCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKwkJCXN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCQkJc3RtdC5leGVjdXRlKCJERUxFVEUgRlJPTSBDYXRhbG9nU2VydmljZU1hcHBlciBXSEVSRSBDQVRBTE9HX0lEID0gJyIgKyBjYXRhbG9nSWQgKyAiJyIpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCWNvbm4uY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJc3RtdC5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZUFsbE1hcHBpbmdzRm9yQ2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisJCXRyeSB7CisJCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKwkJCXN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCQkJc3RtdC5leGVjdXRlKCJERUxFVEUgRlJPTSBDYXRhbG9nU2VydmljZU1hcHBlciBXSEVSRSBDQVRfU0VSVl9UUkFOU19JRCA9ICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIiciKTsKKwkJCWNvbm4uY29tbWl0KCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlVHJhbnNhY3Rpb25JZE1hcHBpbmcoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXN0bXQuZXhlY3V0ZSgiREVMRVRFIEZST00gQ2F0YWxvZ1NlcnZpY2VNYXBwZXIgV0hFUkUgQ0FUX1RSQU5TX0lEID0gJyIgKyBjYXRhbG9nVHJhbnNhY3Rpb25JZCArICInIEFORCBDQVRBTE9HX0lEID0gJyIgKyBjYXRhbG9nSWQgKyAiJyIpOworCQkJY29ubi5jb21taXQoKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCBDQVRfU0VSVl9UUkFOU19JRCxDQVRfU0VSVl9UUkFOU19GQUNUT1JZIEZST00gQ2F0YWxvZ1NlcnZpY2VNYXBwZXIgV0hFUkUgQ0FUX1RSQU5TX0lEID0gJyIrIGNhdGFsb2dUcmFuc2FjdGlvbklkICsgIicgQU5EIENBVEFMT0dfSUQgPSAnIiArIGNhdGFsb2dJZCArICInIik7CisJCQkKKwkJCXdoaWxlKHJzLm5leHQoKSkKKwkJCQlyZXR1cm4gKChUcmFuc2FjdGlvbklkRmFjdG9yeSkgQ2xhc3MuZm9yTmFtZShycy5nZXRTdHJpbmcoIkNBVF9TRVJWX1RSQU5TX0ZBQ1RPUlkiKSkubmV3SW5zdGFuY2UoKSkuY3JlYXRlVHJhbnNhY3Rpb25JZChycy5nZXRTdHJpbmcoIkNBVF9TRVJWX1RSQU5TX0lEIikpOworCisJCQlyZXR1cm4gbnVsbDsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nVHJhbnNhY3Rpb25JZCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCBDQVRfVFJBTlNfSUQsQ0FUX1RSQU5TX0ZBQ1RPUlkgRlJPTSBDYXRhbG9nU2VydmljZU1hcHBlciBXSEVSRSBDQVRfU0VSVl9UUkFOU19JRCA9ICciKyBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgKyAiJyBBTkQgQ0FUQUxPR19JRCA9ICciICsgY2F0YWxvZ0lkICsgIiciKTsKKwkJCQorCQkJd2hpbGUocnMubmV4dCgpKQorCQkJCXJldHVybiAoKFRyYW5zYWN0aW9uSWRGYWN0b3J5KSBDbGFzcy5mb3JOYW1lKHJzLmdldFN0cmluZygiQ0FUX1RSQU5TX0ZBQ1RPUlkiKSkubmV3SW5zdGFuY2UoKSkuY3JlYXRlVHJhbnNhY3Rpb25JZChycy5nZXRTdHJpbmcoIkNBVF9UUkFOU19JRCIpKTsKKworCQkJcmV0dXJuIG51bGw7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXJzLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIFNldDxTdHJpbmc+IGdldENhdGFsb2dJZHMoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgQ0FUQUxPR19JRCBGUk9NIENhdGFsb2dTZXJ2aWNlTWFwcGVyIFdIRVJFIENBVF9TRVJWX1RSQU5TX0lEID0gJyIrIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICInIik7CisJCQkKKwkJCVNldDxTdHJpbmc+IGNhdGFsb2dJZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCQl3aGlsZShycy5uZXh0KCkpCisJCQkJY2F0YWxvZ0lkcy5hZGQocnMuZ2V0U3RyaW5nKCJDQVRBTE9HX0lEIikpOworCisJCQlyZXR1cm4gY2F0YWxvZ0lkczsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQkKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIFNldDxUcmFuc2FjdGlvbklkPD8+PiBnZXRQYWdlT2ZDYXRhbG9nVHJhbnNhY3Rpb25JZHMoCisJCQlJbmRleFBhZ2VyIGluZGV4UGFnZXIsIFN0cmluZyBjYXRhbG9nSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisJCVJlc3VsdFNldCBycyA9IG51bGw7CisJCXRyeSB7CisJCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKwkJCXN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCQkJcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgKKwkJCQkiU0VMRUNUICogRlJPTSAiCisJCQkJCSsiKCBTRUxFQ1QgYS4qLCBST1dOVU0gciBGUk9NICIgCisJCQkJCQkrICIoIFNFTEVDVCBDQVRfVFJBTlNfRkFDVE9SWSxDQVRfVFJBTlNfSUQgRlJPTSBDYXRhbG9nU2VydmljZU1hcHBlciBXSEVSRSBDYXRhbG9nU2VydmljZU1hcHBlci5DQVRBTE9HX0lEID0gJyIgKyBjYXRhbG9nSWQgKyAiJyBPUkRFUiBCWSBDYXRhbG9nU2VydmljZU1hcHBlci5DQVRfU0VSVl9UUkFOU19JRCBERVNDICkgYSAiCisJCQkJCSsgIldIRVJFIFJPV05VTSA8PSAiICsgKGluZGV4UGFnZXIuZ2V0UGFnZVNpemUoKSAqIChpbmRleFBhZ2VyLmdldFBhZ2VOdW0oKSArIDEpKSArICIgKSAiCisJCQkJKyAiV0hFUkUgciA+PSAiICsgKChpbmRleFBhZ2VyLmdldFBhZ2VTaXplKCkgKiBpbmRleFBhZ2VyLmdldFBhZ2VOdW0oKSkgKyAxKSk7CisJCQkKKwkJCVNldDxUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkcyA9IG5ldyBIYXNoU2V0PFRyYW5zYWN0aW9uSWQ8Pz4+KCk7CisJCQl3aGlsZShycy5uZXh0KCkpCisJCQkJdHJhbnNhY3Rpb25JZHMuYWRkKCgoVHJhbnNhY3Rpb25JZEZhY3RvcnkpIENsYXNzLmZvck5hbWUocnMuZ2V0U3RyaW5nKCJDQVRfVFJBTlNfRkFDVE9SWSIpKS5uZXdJbnN0YW5jZSgpKS5jcmVhdGVUcmFuc2FjdGlvbklkKHJzLmdldFN0cmluZygiQ0FUX1RSQU5TX0lEIikpKTsKKwkJCQkKKwkJCXJldHVybiB0cmFuc2FjdGlvbklkczsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgQ0FUX1NFUlZfVFJBTlNfSUQgRlJPTSBDYXRhbG9nU2VydmljZU1hcHBlciBXSEVSRSBDQVRfU0VSVl9UUkFOU19JRCA9ICciKyBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgKyAiJyIpOworCQkJcmV0dXJuIHJzLm5leHQoKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZVRyYW5zYWN0aW9uSWRNYXBwaW5nKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQsCisJCQlUcmFuc2FjdGlvbklkRmFjdG9yeSBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRGYWN0b3J5LAorCQkJQ2F0YWxvZ1JlY2VpcHQgY2F0YWxvZ1JlY2VpcHQsCisJCQlUcmFuc2FjdGlvbklkRmFjdG9yeSBjYXRhbG9nVHJhbnNhY3Rpb25JZEZhY3RvcnkpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geyAKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCUNhbGVuZGFyIGNhbFRpbWUgPSBEYXRlVXRpbHMuZ2V0Q3VycmVudFV0Y1RpbWUoKTsKKwkJCWNhbFRpbWUuc2V0VGltZShjYXRhbG9nUmVjZWlwdC5nZXRUcmFuc2FjdGlvbkRhdGUoKSk7CisJCQlzdG10LmV4ZWN1dGUoIklOU0VSVCBJTlRPIENhdGFsb2dTZXJ2aWNlTWFwcGVyIChDQVRfU0VSVl9UUkFOU19JRCwgQ0FUX1NFUlZfVFJBTlNfRkFDVE9SWSwgQ0FUX1RSQU5TX0lELCBDQVRfVFJBTlNfRkFDVE9SWSwgQ0FUX1RSQU5TX0RBVEUsIENBVEFMT0dfSUQpIFZBTFVFUyAoJyIgCisJCQkJCSsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIicsICciIAorCQkJCQkrIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZEZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJywgJyIgCisJCQkJCSsgY2F0YWxvZ1JlY2VpcHQuZ2V0VHJhbnNhY3Rpb25JZCgpICsgIicsICciIAorCQkJCQkrIGNhdGFsb2dUcmFuc2FjdGlvbklkRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICInLCAnIiAKKwkJCQkJKyBEYXRlVXRpbHMudG9TdHJpbmcoY2FsVGltZSkgKyAiJywgJyIKKwkJCQkJKyBjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSArICInKSIpOworCQkJY29ubi5jb21taXQoKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBDYXRhbG9nUmVjZWlwdCBnZXRDYXRhbG9nUmVjZWlwdCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCBDQVRfVFJBTlNfSUQsIENBVF9UUkFOU19GQUNUT1JZLCBDQVRfVFJBTlNfREFURSBGUk9NIENhdGFsb2dTZXJ2aWNlTWFwcGVyIFdIRVJFIENBVF9TRVJWX1RSQU5TX0lEID0gJyIrIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICInIEFORCBDQVRBTE9HX0lEID0gJyIgKyBjYXRhbG9nSWQgKyAiJyIpOworCQkJCisJCQlpZihycy5uZXh0KCkpIHsKKwkJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkID0gICgoVHJhbnNhY3Rpb25JZEZhY3RvcnkpIENsYXNzLmZvck5hbWUocnMuZ2V0U3RyaW5nKCJDQVRfVFJBTlNfRkFDVE9SWSIpKS5uZXdJbnN0YW5jZSgpKS5jcmVhdGVUcmFuc2FjdGlvbklkKHJzLmdldFN0cmluZygiQ0FUX1RSQU5TX0lEIikpOworCQkJCURhdGUgdHJhbnNhY3Rpb25EYXRlID0gRGF0ZVV0aWxzLnRvQ2FsZW5kYXIocnMuZ2V0U3RyaW5nKCJDQVRfVFJBTlNfREFURSIpLCBEYXRlVXRpbHMuRm9ybWF0VHlwZS5VVENfRk9STUFUKS5nZXRUaW1lKCk7CisJCQkJcmV0dXJuIG5ldyBDYXRhbG9nUmVjZWlwdChuZXcgSW5nZXN0UmVjZWlwdChjYXRhbG9nVHJhbnNhY3Rpb25JZCwgdHJhbnNhY3Rpb25EYXRlKSwgY2F0YWxvZ0lkKTsKKwkJCX1lbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvRGF0YVNvdXJjZUluZ2VzdE1hcHBlckZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0RhdGFTb3VyY2VJbmdlc3RNYXBwZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2ZTAzNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0RhdGFTb3VyY2VJbmdlc3RNYXBwZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tYXBwaW5nOworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlcjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcgRGF0YVNvdXJjZUluZ2VzdE1hcHBlcgorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlSW5nZXN0TWFwcGVyRmFjdG9yeSBpbXBsZW1lbnRzIEluZ2VzdE1hcHBlckZhY3RvcnkgeworCisgICAgcHJvdGVjdGVkIFN0cmluZyBqZGJjVXJsOworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXI7CisJCisJcHVibGljIERhdGFTb3VyY2VJbmdlc3RNYXBwZXJGYWN0b3J5KCkge30KKworCXB1YmxpYyBTdHJpbmcgZ2V0SmRiY1VybCgpIHsKKwkJcmV0dXJuIGpkYmNVcmw7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0SmRiY1VybChTdHJpbmcgamRiY1VybCkgeworCQl0aGlzLmpkYmNVcmwgPSBqZGJjVXJsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKKwkJcmV0dXJuIHVzZXI7CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIHVzZXIpIHsKKwkJdGhpcy51c2VyID0gdXNlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhc3MoKSB7CisJCXJldHVybiBwYXNzOworCX0KKworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFBhc3MoU3RyaW5nIHBhc3MpIHsKKwkJdGhpcy5wYXNzID0gcGFzczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpIHsKKwkJcmV0dXJuIGRyaXZlcjsKKwl9CisKKwlAUmVxdWlyZWQKKwlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlcikgeworCQl0aGlzLmRyaXZlciA9IGRyaXZlcjsKKwl9CisJCisJcHVibGljIEluZ2VzdE1hcHBlciBjcmVhdGVNYXBwZXIoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IERhdGFTb3VyY2VJbmdlc3RNYXBwZXIodXNlciwgcGFzcywKKwkgICAgICAgICAgICAgICAgZHJpdmVyLCBqZGJjVXJsKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvbWFwcGluZy9Jbk1lbW9yeUluZ2VzdE1hcHBlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvSW5NZW1vcnlJbmdlc3RNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0ODE2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvSW5NZW1vcnlJbmdlc3RNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuU3FsU2NyaXB0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBJbk1lbW9yeUluZ2VzdE1hcHBlciBleHRlbmRzIERhdGFTb3VyY2VJbmdlc3RNYXBwZXIgeworCisJcHVibGljIEluTWVtb3J5SW5nZXN0TWFwcGVyKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcywgU3RyaW5nIGRyaXZlciwKKwkJCVN0cmluZyBqZGJjVXJsLCBTdHJpbmcgdGFibGVzRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyKHVzZXIsIHBhc3MsIGRyaXZlciwgamRiY1VybCk7CisgICAgICAgIFNxbFNjcmlwdCBjb3JlU2NoZW1hU2NyaXB0ID0gbmV3IFNxbFNjcmlwdChuZXcgRmlsZSh0YWJsZXNGaWxlKS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGhpcy5kYXRhU291cmNlKTsKKyAgICAgICAgY29yZVNjaGVtYVNjcmlwdC5sb2FkU2NyaXB0KCk7CisgICAgICAgIGNvcmVTY2hlbWFTY3JpcHQuZXhlY3V0ZSgpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0luTWVtb3J5SW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvSW5NZW1vcnlJbmdlc3RNYXBwZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3OWU0MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0luTWVtb3J5SW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwuaW5kZXguSW5NZW1vcnlJbmRleEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5SW5nZXN0TWFwcGVyRmFjdG9yeSBleHRlbmRzIERhdGFTb3VyY2VJbmdlc3RNYXBwZXJGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEluTWVtb3J5SW5kZXhGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHJvdGVjdGVkIFN0cmluZyB0YWJsZXNGaWxlOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBJbk1lbW9yeUluZ2VzdE1hcHBlciBjcmVhdGVNYXBwZXIoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IEluTWVtb3J5SW5nZXN0TWFwcGVyKHVzZXIsIHBhc3MsCisJICAgICAgICAgICAgICAgIGRyaXZlciwgamRiY1VybCwgdGhpcy50YWJsZXNGaWxlKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gY3JlYXRlIEluTWVtb3J5SW5kZXggOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0VGFibGVzRmlsZShTdHJpbmcgdGFibGVzRmlsZSkgeworCQl0aGlzLnRhYmxlc0ZpbGUgPSB0YWJsZXNGaWxlOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0luZ2VzdE1hcHBlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvSW5nZXN0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2YzE2MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0luZ2VzdE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuSW5kZXhQYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEFuIEludGVyZmFjZSBJbmdlc3QgTWFwcGVyIHRoYXQgaW5kZXhlcyB0cmFuc2FjdGlvbiBpZHMgdG8gY2F0YWxvZyB0cmFuc2FjdGlvbiBpZHMgYW5kIGNhdGxhb2cgaWRzCisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBJbmdlc3RNYXBwZXIgeworCisJLyoqCisJICogTWFwcyB0aGUgdGhyZWUgYXJndW1lbnRzIHRvIGVhY2ggb3RoZXIgc28gYW55IG9mIHRoZSBvdGhlcnMgY2FuIGJlCisJICogcmV0cmlldmVkIHZpYSBvbmUgb2YgdGhlIG90aGVyIGFyZ3VtZW50cworCSAqIAorCSAqIEBwYXJhbSBjYXRhbG9nSWQKKwkgKiAgICAgICAgICAgIFRoZSBJRCB0aGF0IHVuaXF1ZWx5IHJlcHJlc2VudHMgYSBjYXRhbG9nCisJICogQHBhcmFtIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZAorCSAqICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCBnZW5lcmF0ZWQgYnkgdGhlIENhdGFsb2dTZXJ2aWNlCisJICogQHBhcmFtIGNhdGFsb2dUcmFuc2FjdGlvbklkCisJICogICAgICAgICAgICBUaGUgVHJhbnNhY3Rpb25JZCB1c2VkIGJ5IHRoZSBDYXRhbG9nIGdpdmVuIChtYXliZSB0aGUgc2FtZSBhcworCSAqICAgICAgICAgICAgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBtYXliZSBkaWZmZXJlbnQpCisJICogQHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIEFueSBlcnJvcgorCSAqLworCXB1YmxpYyB2b2lkIHN0b3JlVHJhbnNhY3Rpb25JZE1hcHBpbmcoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25JZEZhY3RvcnkgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkRmFjdG9yeSwKKwkJCUNhdGFsb2dSZWNlaXB0IGNhdGFsb2dSZWNlaXB0LCBUcmFuc2FjdGlvbklkRmFjdG9yeSBjYXRhbG9nVHJhbnNhY3Rpb25JZEZhY3RvcnkpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisKKwlwdWJsaWMgU2V0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFBhZ2VPZkNhdGFsb2dUcmFuc2FjdGlvbklkcyhJbmRleFBhZ2VyIGluZGV4UGFnZXIsCisJCQlTdHJpbmcgY2F0YWxvZ0lkKSB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgZGVsZXRlVHJhbnNhY3Rpb25JZE1hcHBpbmcoVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCwgCisJCQlTdHJpbmcgY2F0YWxvZ0lkKSB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgZGVsZXRlQWxsTWFwcGluZ3NGb3JDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCBkZWxldGVBbGxNYXBwaW5nc0ZvckNhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBWZXJpZnkgaWYgdGhlIGdpdmVuIENhdGFsb2dTZXJ2aWNlIFRyYW5zYWN0aW9uSWQgaGFzIGJlZW4gc3RvcmVkIGluIGEKKwkgKiBtYXBwaW5nIHtAbGluayBzdG9yZVRyYW5zYWN0aW9uSWRNYXBwaW5nKFN0cmluZywgVHJhbnNhY3Rpb25JZDw/PiwKKwkgKiBUcmFuc2FjdGlvbklkPD8+KX0KKwkgKiAKKwkgKiBAcGFyYW0gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkCisJICogICAgICAgICAgICBUaGUgQ2F0YWxvZ1NlcnZpY2UgVHJhbnNhY3Rpb25JZCBpbiBxdWVzdGlvbgorCSAqIEByZXR1cm4gVHJ1ZSBpcyB0aGUgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkIGhhcyBiZWVuIHVzZWQgaW4gYSB1c2VkIGluIGEgbWFwcGluZworCSAqIEB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBBbnkgZXJyb3IKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIEdldCB0aGUgQ2F0YWxvZ1NlcnZpY2UgVHJhbnNhY3Rpb25JZCB0aGF0IHdhcyBtYXBwZWQgdG8gdGhlIGdpdmVuIENhdGFsb2cKKwkgKiBVUk4gYW5kIENhdGFsb2cgVHJhbnNhY3Rpb25JZAorCSAqIAorCSAqIEBwYXJhbSBjYXRhbG9nVHJhbnNhY3Rpb25JZAorCSAqICAgICAgICAgICAgQSBDYXRhbG9nIFRyYW5zYWN0aW9uSWQKKwkgKiBAcGFyYW0gY2F0YWxvZ0lkCisJICogICAgICAgICAgICBBIHVuaXF1ZSBDYXRhbG9nIElEIHdoZW4gdGhlIENhdGFsb2cgVHJhbnNhY3Rpb25JZCB3YXMgdXNlZAorCSAqIEByZXR1cm4gVGhlIENhdGFsb2dTZXJ2aWNlIFRyYW5zYWN0aW9uSWQgd2hpY2ggd2FzIG1hcHBlZCB0byB0aGUgZ2l2ZW4KKwkgKiAgICAgICAgIENhdGFsb2cgVHJhbnNhY3Rpb25JZCBhbmQgQ2F0YWxvZyBJRAorCSAqIEB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBBbnkgRXJyb3IKKwkgKi8KKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCisJLyoqCisJICogR2V0IHRoZSBDYXRhbG9nIFRyYW5zYWN0aW9uSWQgdGhhdCB3YXMgbWFwcGVkIHRvIHRoZSBnaXZlbiBDYXRhbG9nIElECisJICogYW5kIENhdGFsb2dTZXJ2aWNlIFRyYW5zYWN0aW9uSWQKKwkgKiAKKwkgKiBAcGFyYW0gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkCisJICogICAgICAgICAgICBBIENhdGFsb2cgVHJhbnNhY3Rpb25JZAorCSAqIEBwYXJhbSBjYXRhbG9nSWQKKwkgKiAgICAgICAgICAgIEEgdW5pcXVlIENhdGFsb2cgSUQgd2hlbiB0aGUgQ2F0YWxvZyBUcmFuc2FjdGlvbklkIHdhcyB1c2VkCisJICogQHJldHVybiBUaGUgQ2F0YWxvZ1NlcnZpY2UgVHJhbnNhY3Rpb25JZCB3aGljaCB3YXMgbWFwcGVkIHRvIHRoZSBnaXZlbgorCSAqICAgICAgICAgQ2F0YWxvZyBUcmFuc2FjdGlvbklkIGFuZCBDYXRhbG9nIElECisJICogQHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIEFueSBFcnJvcgorCSAqLworCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQsIFN0cmluZyBjYXRhbG9nSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisKKwkvKioKKwkgKiBHZXQgYWxsIHRoZSBDYXRhbG9nIFVSTnMgZm9yIHdoaWNoIHRoZSBnaXZlbiBUcmFuc2FjdGlvbklkIHdhcyBtYXBwZWQKKwkgKiAKKwkgKiBAcGFyYW0gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkCisJICogICAgICAgICAgICBBIENhdGFsb2dTZXJ2aWNlIFRyYW5zYWN0aW9uSWQKKwkgKiBAcmV0dXJuIENhdGFsb2cgSURzIGZvciB3aGljaCB0aGUgZ2l2ZW4gVHJhbnNhY3Rpb25JZCB3YXMgbWFwcGVkCisJICogQHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIEFueSBFcnJvcgorCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDYXRhbG9nSWRzKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisJCisJLyoqCisJICogCisJICogQHBhcmFtIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZAorCSAqIEBwYXJhbSBjYXRhbG9nSWQKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBDYXRhbG9nUmVjZWlwdCBnZXRDYXRhbG9nUmVjZWlwdCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvSW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvSW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjdhMDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvbWFwcGluZy9Jbmdlc3RNYXBwZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tYXBwaW5nOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBGYWN0b3J5IGZvciBjcmVhdGluZyBJbmdlc3RNYXBwZXIKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIEluZ2VzdE1hcHBlckZhY3RvcnkgeworCisJcHVibGljIEluZ2VzdE1hcHBlciBjcmVhdGVNYXBwZXIoKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0x1Y2VuZUluZ2VzdE1hcHBlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvTHVjZW5lSW5nZXN0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxNDgwYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0x1Y2VuZUluZ2VzdE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuSW5kZXhQYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgSW5nZXN0IE1hcHBlciB0aGF0IGluZGV4ZXMgdG8gYSBMdWNlbmUgaW5kZXgKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgTHVjZW5lSW5nZXN0TWFwcGVyIGltcGxlbWVudHMgSW5nZXN0TWFwcGVyIHsKKworCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbE1hcHBpbmdzRm9yQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGVBbGxNYXBwaW5nc0ZvckNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGVUcmFuc2FjdGlvbklkTWFwcGluZygKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIFN0cmluZyBjYXRhbG9nSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyBDYXRhbG9nUmVjZWlwdCBnZXRDYXRhbG9nUmVjZWlwdCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nVHJhbnNhY3Rpb25JZCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q2F0YWxvZ0lkcygKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU2V0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFBhZ2VPZkNhdGFsb2dUcmFuc2FjdGlvbklkcygKKwkJCUluZGV4UGFnZXIgaW5kZXhQYWdlciwgU3RyaW5nIGNhdGFsb2dJZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9yZVRyYW5zYWN0aW9uSWRNYXBwaW5nKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQsCisJCQlUcmFuc2FjdGlvbklkRmFjdG9yeSBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRGYWN0b3J5LAorCQkJQ2F0YWxvZ1JlY2VpcHQgY2F0YWxvZ1JlY2VpcHQsCisJCQlUcmFuc2FjdGlvbklkRmFjdG9yeSBjYXRhbG9nVHJhbnNhY3Rpb25JZEZhY3RvcnkpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0x1Y2VuZUluZ2VzdE1hcHBlckZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL0x1Y2VuZUluZ2VzdE1hcHBlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU0NWNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvTHVjZW5lSW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZzsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcgTHVjZW5lSW5nZXN0TWFwcGVyCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIEx1Y2VuZUluZ2VzdE1hcHBlckZhY3RvcnkgaW1wbGVtZW50cworCQlJbmdlc3RNYXBwZXJGYWN0b3J5IHsKKworCXB1YmxpYyBJbmdlc3RNYXBwZXIgY3JlYXRlTWFwcGVyKCkgeworCQlyZXR1cm4gbmV3IEx1Y2VuZUluZ2VzdE1hcHBlcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXIuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL01lbW9yeUJhc2VkSW5nZXN0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyYjdkNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL01lbW9yeUJhc2VkSW5nZXN0TWFwcGVyLmphdmEKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5DYXRhbG9nUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5JbmRleFBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWRGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBJbmdlc3QgTWFwcGVyIHRoYXQgaW5kZXhlcyB0byBsb2NhbCBtZW1vcnkKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXIgaW1wbGVtZW50cyBJbmdlc3RNYXBwZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIFRyYW5zYWN0aW9uSWRNYXBwaW5nPiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRLZXlNYXBwaW5nOworCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgVHJhbnNhY3Rpb25JZE1hcHBpbmc+IGNhdGFsb2dJbmZvS2V5TWFwcGluZzsKKwlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2F0YWxvZ1JlY2VpcHQ+PiBjYXRhbG9nSWRUb0NhdGFsb2dSZWNlaXB0TWFwcGluZzsKKwkKKwlwdWJsaWMgTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXIoKSB7CisJCXRoaXMuY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkS2V5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHJhbnNhY3Rpb25JZE1hcHBpbmc+KCk7CisJCXRoaXMuY2F0YWxvZ0luZm9LZXlNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmFuc2FjdGlvbklkTWFwcGluZz4oKTsKKwkJdGhpcy5jYXRhbG9nSWRUb0NhdGFsb2dSZWNlaXB0TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDYXRhbG9nUmVjZWlwdD4+KCk7CisJfQorCQorCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWVvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5DYXRhbG9nUmVwb3NpdG9yeSMKKwkgKiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQKKwkgKiAob3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkLCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiTG9va2luZyB1cCBDYXRhbG9nU2VydmljZSBUcmFuc2FjdGlvbklkIGZvciBDYXRhbG9nIFRyYW5zYWN0aW9uSWQgJyIgKyBjYXRhbG9nVHJhbnNhY3Rpb25JZCArICInIGFuZCBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIiciKTsKKwkJU3RyaW5nIGtleSA9IGdlbmVyYXRlS2V5KGNhdGFsb2dUcmFuc2FjdGlvbklkLnRvU3RyaW5nKCksIGNhdGFsb2dJZCk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJMT09LSU5HIFVQOiAiICsga2V5KTsKKwkJVHJhbnNhY3Rpb25JZE1hcHBpbmcgbWFwcGluZyA9IHRoaXMuY2F0YWxvZ0luZm9LZXlNYXBwaW5nLmdldChrZXkpOworCQlpZiAobWFwcGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gbWFwcGluZy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQ7CisJCX1lbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZW9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5IworCSAqIGdldENhdGFsb2dUcmFuc2FjdGlvbklkCisJICogKG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZCwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1RyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCwgU3RyaW5nIGNhdGFsb2dJZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCVRyYW5zYWN0aW9uSWRNYXBwaW5nIG1hcHBpbmcgPSB0aGlzLmNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZEtleU1hcHBpbmcKKwkJCQkuZ2V0KGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZC50b1N0cmluZygpKTsKKwkJaWYgKG1hcHBpbmcgIT0gbnVsbCkKKwkJCWZvciAoQ2F0YWxvZ1JlY2VpcHQgcmVjZWlwdCA6IG1hcHBpbmcuZ2V0Q2F0YWxvZ1JlY2VpcHRzKCkpCisJCQkJaWYgKHJlY2VpcHQuZ2V0Q2F0YWxvZ0lkKCkuZXF1YWxzKGNhdGFsb2dJZCkpCisJCQkJCXJldHVybiByZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZy5Jbmdlc3RNYXBwZXIjZ2V0UGFnZShvcmcuYXBhY2hlCisJICogLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5JbmRleFBhZ2VyLCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFBhZ2VPZkNhdGFsb2dUcmFuc2FjdGlvbklkcyhJbmRleFBhZ2VyIGluZGV4UGFnZXIsCisJCQlTdHJpbmcgY2F0YWxvZ0lkKSB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlTZXQ8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1RyYW5zYWN0aW9uSWRzID0gbmV3IEhhc2hTZXQ8VHJhbnNhY3Rpb25JZDw/Pj4oKTsKKwkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzID0gdGhpcy5jYXRhbG9nSWRUb0NhdGFsb2dSZWNlaXB0TWFwcGluZy5nZXQoY2F0YWxvZ0lkKTsKKwkJaWYgKGNhdGFsb2dSZWNlaXB0cyAhPSBudWxsKSAKKwkJCWZvciAoaW50IGkgPSBpbmRleFBhZ2VyLmdldFBhZ2VOdW0oKSAqIGluZGV4UGFnZXIuZ2V0UGFnZVNpemUoKTsgaSA8IGNhdGFsb2dSZWNlaXB0cy5zaXplKCkgJiYgaSA8IChpbmRleFBhZ2VyLmdldFBhZ2VOdW0oKSArIDEpICogaW5kZXhQYWdlci5nZXRQYWdlU2l6ZSgpOyBpKyspIAorCQkJCWNhdGFsb2dUcmFuc2FjdGlvbklkcy5hZGQoY2F0YWxvZ1JlY2VpcHRzLmdldChpKS5nZXRUcmFuc2FjdGlvbklkKCkpOworCQlyZXR1cm4gY2F0YWxvZ1RyYW5zYWN0aW9uSWRzOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmcuSW5nZXN0TWFwcGVyI2RlbGV0ZUFsbE1hcHBpbmdzRm9yQ2F0YWxvZyhqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGVBbGxNYXBwaW5nc0ZvckNhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCUxpc3Q8Q2F0YWxvZ1JlY2VpcHQ+IGNhdGFsb2dSZWNlaXB0cyA9IHRoaXMuY2F0YWxvZ0lkVG9DYXRhbG9nUmVjZWlwdE1hcHBpbmcucmVtb3ZlKGNhdGFsb2dJZCk7CisJCWlmIChjYXRhbG9nUmVjZWlwdHMgIT0gbnVsbCkgeworCQkJZm9yIChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA6IGNhdGFsb2dSZWNlaXB0cykgeworCQkJCVRyYW5zYWN0aW9uSWRNYXBwaW5nIG1hcHBpbmcgPSB0aGlzLmNhdGFsb2dJbmZvS2V5TWFwcGluZy5yZW1vdmUoZ2VuZXJhdGVLZXkoY2F0YWxvZ1JlY2VpcHQuZ2V0VHJhbnNhY3Rpb25JZCgpLnRvU3RyaW5nKCksIGNhdGFsb2dSZWNlaXB0LmdldENhdGFsb2dJZCgpKSk7CisJCQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkKKwkJCQkJbWFwcGluZy5nZXRDYXRhbG9nUmVjZWlwdHMoKS5yZW1vdmUoY2F0YWxvZ1JlY2VpcHQpOworCQkJfQorCQl9CQkKKwl9CisJCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5DYXRhbG9nUmVwb3NpdG9yeSNkZWxldGVBbGxNYXBwaW5nc0ZvckNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQpCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZUFsbE1hcHBpbmdzRm9yQ2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlUcmFuc2FjdGlvbklkTWFwcGluZyBtYXBwaW5nID0gdGhpcy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRLZXlNYXBwaW5nLnJlbW92ZShjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQudG9TdHJpbmcoKSk7CisJCWlmIChtYXBwaW5nICE9IG51bGwpCisJCQlmb3IgKENhdGFsb2dSZWNlaXB0IGNhdGFsb2dSZWNlaXB0IDogbWFwcGluZy5nZXRDYXRhbG9nUmVjZWlwdHMoKSkgeworCQkJCXRoaXMuY2F0YWxvZ0lkVG9DYXRhbG9nUmVjZWlwdE1hcHBpbmcuZ2V0KGNhdGFsb2dSZWNlaXB0LmdldENhdGFsb2dJZCgpKS5yZW1vdmUoY2F0YWxvZ1JlY2VpcHQpOworCQkJCXRoaXMuY2F0YWxvZ0luZm9LZXlNYXBwaW5nLnJlbW92ZShnZW5lcmF0ZUtleShjYXRhbG9nUmVjZWlwdC5nZXRUcmFuc2FjdGlvbklkKCkudG9TdHJpbmcoKSwgY2F0YWxvZ1JlY2VpcHQuZ2V0Q2F0YWxvZ0lkKCkpKTsKKwkJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5I2RlbGV0ZVRyYW5zYWN0aW9uSWRNYXBwaW5nKG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZCwgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkLCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGVUcmFuc2FjdGlvbklkTWFwcGluZygKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIFN0cmluZyBjYXRhbG9nSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlMaXN0PENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHMgPSB0aGlzLmNhdGFsb2dJZFRvQ2F0YWxvZ1JlY2VpcHRNYXBwaW5nLmdldChjYXRhbG9nSWQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGFsb2dSZWNlaXB0cy5zaXplKCk7IGkrKykgeworCQkJaWYgKGNhdGFsb2dSZWNlaXB0cy5nZXQoaSkuZ2V0Q2F0YWxvZ0lkKCkuZXF1YWxzKGNhdGFsb2dJZCkgJiYgY2F0YWxvZ1JlY2VpcHRzLmdldChpKS5nZXRUcmFuc2FjdGlvbklkKCkuZXF1YWxzKGNhdGFsb2dUcmFuc2FjdGlvbklkKSkgeworCQkJCWNhdGFsb2dSZWNlaXB0cy5yZW1vdmUoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJVHJhbnNhY3Rpb25JZE1hcHBpbmcgbWFwcGluZyA9IHRoaXMuY2F0YWxvZ0luZm9LZXlNYXBwaW5nLnJlbW92ZShnZW5lcmF0ZUtleShjYXRhbG9nVHJhbnNhY3Rpb25JZC50b1N0cmluZygpLCBjYXRhbG9nSWQpKTsKKwkJdGhpcy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRLZXlNYXBwaW5nLnJlbW92ZShtYXBwaW5nLmdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCgpLnRvU3RyaW5nKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuQ2F0YWxvZ1JlcG9zaXRvcnkjaGFzQ2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZCkKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzQ2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRLZXlNYXBwaW5nLmNvbnRhaW5zS2V5KGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZC50b1N0cmluZygpKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2Vlb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuQ2F0YWxvZ1JlcG9zaXRvcnkjCisJICogc3RvcmVUcmFuc2FjdGlvbklkTWFwcGluZyhqYXZhLmxhbmcuU3RyaW5nLAorCSAqIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZCwKKwkgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQpCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlVHJhbnNhY3Rpb25JZE1hcHBpbmcoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCwKKwkJCVRyYW5zYWN0aW9uSWRGYWN0b3J5IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZEZhY3RvcnksCisJCQlDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwKKwkJCVRyYW5zYWN0aW9uSWRGYWN0b3J5IGNhdGFsb2dUcmFuc2FjdGlvbklkRmFjdG9yeSkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7IAorCQlUcmFuc2FjdGlvbklkTWFwcGluZyBtYXBwaW5nID0gdGhpcy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRLZXlNYXBwaW5nCisJCQkJLmdldChjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQudG9TdHJpbmcoKSk7CisJCWlmIChtYXBwaW5nID09IG51bGwpCisJCQltYXBwaW5nID0gbmV3IFRyYW5zYWN0aW9uSWRNYXBwaW5nKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCk7CisJCW1hcHBpbmcuYWRkQ2F0YWxvZ1JlY2VpcHQoY2F0YWxvZ1JlY2VpcHQpOworCQl0aGlzLmNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZEtleU1hcHBpbmcucHV0KAorCQkJCWNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZC50b1N0cmluZygpLCBtYXBwaW5nKTsKKwkJdGhpcy5jYXRhbG9nSW5mb0tleU1hcHBpbmcucHV0KGdlbmVyYXRlS2V5KGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKS50b1N0cmluZygpLCBjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSksIG1hcHBpbmcpOworCQlMaXN0PENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHMgPSB0aGlzLmNhdGFsb2dJZFRvQ2F0YWxvZ1JlY2VpcHRNYXBwaW5nLmdldChjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSk7CisJCWlmIChjYXRhbG9nUmVjZWlwdHMgPT0gbnVsbCkKKwkJCWNhdGFsb2dSZWNlaXB0cyA9IG5ldyBWZWN0b3I8Q2F0YWxvZ1JlY2VpcHQ+KCk7CisJCWNhdGFsb2dSZWNlaXB0cy5hZGQoY2F0YWxvZ1JlY2VpcHQpOworCQl0aGlzLmNhdGFsb2dJZFRvQ2F0YWxvZ1JlY2VpcHRNYXBwaW5nLnB1dChjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSwgY2F0YWxvZ1JlY2VpcHRzKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlCisJICogb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuQ2F0YWxvZ1JlcG9zaXRvcnkjZ2V0Q2F0YWxvZ3MKKwkgKiAob3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0PFN0cmluZz4gZ2V0Q2F0YWxvZ0lkcygKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJSGFzaFNldDxTdHJpbmc+IGNhdGFsb2dzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlUcmFuc2FjdGlvbklkTWFwcGluZyBtYXBwaW5nID0gdGhpcy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRLZXlNYXBwaW5nCisJCQkJLmdldChjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQudG9TdHJpbmcoKSk7CisJCWZvciAoQ2F0YWxvZ1JlY2VpcHQgY2F0YWxvZ1JlY2VpcHQgOiBtYXBwaW5nLmdldENhdGFsb2dSZWNlaXB0cygpKQorCQkJY2F0YWxvZ3MuYWRkKGNhdGFsb2dSZWNlaXB0LmdldENhdGFsb2dJZCgpKTsKKwkJcmV0dXJuIGNhdGFsb2dzOworCX0KKworCXB1YmxpYyBDYXRhbG9nUmVjZWlwdCBnZXRDYXRhbG9nUmVjZWlwdCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJVHJhbnNhY3Rpb25JZE1hcHBpbmcgbWFwcGluZyA9IHRoaXMuY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkS2V5TWFwcGluZy5nZXQoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKTsKKwkJZm9yIChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA6IG1hcHBpbmcuZ2V0Q2F0YWxvZ1JlY2VpcHRzKCkpCisJCQlpZiAoY2F0YWxvZ1JlY2VpcHQuZ2V0Q2F0YWxvZ0lkKCkuZXF1YWxzKGNhdGFsb2dJZCkpCisJCQkJcmV0dXJuIGNhdGFsb2dSZWNlaXB0OworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVLZXkoU3RyaW5nIGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ0lkKSB7CisJCXJldHVybiBjYXRhbG9nVHJhbnNhY3Rpb25JZCArICI6IiArIGNhdGFsb2dJZDsKKwl9CisJCisJcHJpdmF0ZSBjbGFzcyBUcmFuc2FjdGlvbklkTWFwcGluZyB7CisKKwkJcHJpdmF0ZSBUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZDsKKwkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzOworCisJCXB1YmxpYyBUcmFuc2FjdGlvbklkTWFwcGluZyhUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCkgeworCQkJdGhpcy5jYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgPSBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQ7CisJCQl0aGlzLmNhdGFsb2dSZWNlaXB0cyA9IG5ldyBWZWN0b3I8Q2F0YWxvZ1JlY2VpcHQ+KCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nUmVjZWlwdChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCkgeworCQkJdGhpcy5jYXRhbG9nUmVjZWlwdHMuYWRkKGNhdGFsb2dSZWNlaXB0KTsKKwkJfQorCisJCXB1YmxpYyBMaXN0PENhdGFsb2dSZWNlaXB0PiBnZXRDYXRhbG9nUmVjZWlwdHMoKSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nUmVjZWlwdHM7CisJCX0KKworCQlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoKSB7CisJCQlyZXR1cm4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkOworCQl9CisKKwl9CisKKy8vCXByaXZhdGUgY2xhc3MgQ2F0YWxvZ0luZm8geworLy8KKy8vCQlwcml2YXRlIFN0cmluZyBjYXRhbG9nSWQ7CisvLwkJcHJpdmF0ZSBUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkOworLy8KKy8vCQlwdWJsaWMgQ2F0YWxvZ0luZm8oU3RyaW5nIGNhdGFsb2dJZCwKKy8vCQkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uSWQpIHsKKy8vCQkJdGhpcy5jYXRhbG9nSWQgPSBjYXRhbG9nSWQ7CisvLwkJCXRoaXMuY2F0YWxvZ1RyYW5zYWN0aW9uSWQgPSBjYXRhbG9nVHJhbnNhY3Rpb25JZDsKKy8vCQl9CisvLworLy8JCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ1VybigpIHsKKy8vCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ0lkOworLy8JCX0KKy8vCisvLwkJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1RyYW5zYWN0aW9uSWQoKSB7CisvLwkJCXJldHVybiB0aGlzLmNhdGFsb2dUcmFuc2FjdGlvbklkOworLy8JCX0KKy8vCQkKKy8vCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0YWxvZ0luZm8pIHsKKy8vCQkJCXJldHVybiB0aGlzLnRvU3RyaW5nKCkuZXF1YWxzKG9iai50b1N0cmluZygpKTsKKy8vCQkJfWVsc2UgeworLy8JCQkJcmV0dXJuIGZhbHNlOworLy8JCQl9CisvLwkJfQorLy8JCQorLy8JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisvLwkJCXJldHVybiB0aGlzLmNhdGFsb2dJZCArICI6IiArIHRoaXMuY2F0YWxvZ1RyYW5zYWN0aW9uSWQ7CisvLwkJfQorLy8KKy8vCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL01lbW9yeUJhc2VkSW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21hcHBpbmcvTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmZTg5YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9tYXBwaW5nL01lbW9yeUJhc2VkSW5nZXN0TWFwcGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZzsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcgTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXIKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgTWVtb3J5QmFzZWRJbmdlc3RNYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgSW5nZXN0TWFwcGVyRmFjdG9yeSB7CisKKwlwdWJsaWMgSW5nZXN0TWFwcGVyIGNyZWF0ZU1hcHBlcigpIHsKKwkJcmV0dXJuIG5ldyBNZW1vcnlCYXNlZEluZ2VzdE1hcHBlcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21ldGFkYXRhL1RyYW5zYWN0aW9uYWxNZXRhZGF0YS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL21ldGFkYXRhL1RyYW5zYWN0aW9uYWxNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzQ1ODEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvbWV0YWRhdGEvVHJhbnNhY3Rpb25hbE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5UcmFuc2FjdGlvblJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIE1ldGFkYXRhIHRpZWQgdG8gYSBUcmFuc2FjdGlvbgorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbmFsTWV0YWRhdGEgeworCisJcHJvdGVjdGVkIFRyYW5zYWN0aW9uUmVjZWlwdCByZWNlaXB0OworCXByb3RlY3RlZCBNZXRhZGF0YSBtZXRhZGF0YTsKKwkKKwlwdWJsaWMgVHJhbnNhY3Rpb25hbE1ldGFkYXRhKFRyYW5zYWN0aW9uUmVjZWlwdCByZWNlaXB0LCBNZXRhZGF0YSBtZXRhZGF0YSkgeworCQl0aGlzLnJlY2VpcHQgPSByZWNlaXB0OworCQl0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisJCXRoaXMubWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKENhdGFsb2dTZXJ2aWNlLkNBVEFMT0dfU0VSVklDRV9UUkFOU0FDVElPTl9JRF9NRVRfS0VZLCB0aGlzLnJlY2VpcHQuZ2V0VHJhbnNhY3Rpb25JZCgpLnRvU3RyaW5nKCkpOworCQl0aGlzLm1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShDYXRhbG9nU2VydmljZS5DQVRBTE9HX0lEU19NRVRfS0VZLCBTdHJpbmdVdGlscy5qb2luKHRoaXMucmVjZWlwdC5nZXRDYXRhbG9nSWRzKCkuaXRlcmF0b3IoKSwgIiwiKSk7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKwkJcmV0dXJuIHJlY2VpcHQuZ2V0VHJhbnNhY3Rpb25JZCgpOworCX0KKworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDYXRhbG9nSWRzKCkgeworCQlyZXR1cm4gcmVjZWlwdC5nZXRDYXRhbG9nSWRzKCk7CisJfQorCQorCXB1YmxpYyBEYXRlIGdldFRyYW5zYWN0aW9uRGF0ZSgpIHsKKwkJcmV0dXJuIHJlY2VpcHQuZ2V0VHJhbnNhY3Rpb25EYXRlKCk7CisJfQorCQorCXB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKwkJcmV0dXJuIG1ldGFkYXRhOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbklkKCkuaGFzaENvZGUoKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9DYXRhbG9nUmVjZWlwdC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvQ2F0YWxvZ1JlY2VpcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTczOTBhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvQ2F0YWxvZ1JlY2VpcHQuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1JlY2VpcHQgeworCisJcHJvdGVjdGVkIFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25JZDsKKwlwcm90ZWN0ZWQgRGF0ZSB0cmFuc2FjdGlvbkRhdGU7CisJcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nSWQ7CisJCisJcHVibGljIENhdGFsb2dSZWNlaXB0KEluZ2VzdFJlY2VpcHQgaW5nZXN0UmVjZWlwdCwgU3RyaW5nIGNhdGFsb2dJZCkgeworCQl0aGlzLnRyYW5zYWN0aW9uSWQgPSBpbmdlc3RSZWNlaXB0LmdldENhdGFsb2dUcmFuc2FjdGlvbklkKCk7CisJCXRoaXMudHJhbnNhY3Rpb25EYXRlID0gaW5nZXN0UmVjZWlwdC5nZXRUcmFuc2FjdGlvbkRhdGUoKTsKKwkJdGhpcy5jYXRhbG9nSWQgPSBjYXRhbG9nSWQ7CisJfQorCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldFRyYW5zYWN0aW9uSWQoKSB7CisJCXJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWQ7CisJfQorCisJcHVibGljIERhdGUgZ2V0VHJhbnNhY3Rpb25EYXRlKCkgeworCQlyZXR1cm4gdGhpcy50cmFuc2FjdGlvbkRhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nSWQoKSB7CisJCXJldHVybiB0aGlzLmNhdGFsb2dJZDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGFsb2dSZWNlaXB0KSB7CisJCQlDYXRhbG9nUmVjZWlwdCBjb21wYXJlVG8gPSAoQ2F0YWxvZ1JlY2VpcHQpIG9iajsKKwkJCXJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWQuZXF1YWxzKGNvbXBhcmVUby50cmFuc2FjdGlvbklkKSAmJiB0aGlzLnRyYW5zYWN0aW9uRGF0ZS5lcXVhbHMoY29tcGFyZVRvLnRyYW5zYWN0aW9uRGF0ZSkgJiYgdGhpcy5jYXRhbG9nSWQuZXF1YWxzKGNvbXBhcmVUby5jYXRhbG9nSWQpOworCQl9ZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRoaXMudG9TdHJpbmcoKS5oYXNoQ29kZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gKCJ7Q2F0YWxvZ1JlY2VpcHQodElEPSIgKyB0aGlzLnRyYW5zYWN0aW9uSWQgKyAiLHREYXRlPSIgKyB0aGlzLnRyYW5zYWN0aW9uRGF0ZSArICIsY2F0SUQ9IiArIHRoaXMuY2F0YWxvZ0lkICsgIil9Iik7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvSW5kZXhQYWdlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvSW5kZXhQYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTYxYTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9JbmRleFBhZ2VyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBwYWdlciBmb3IgcGFnaW5nIHRocm91Z2ggYSBpbmRleAorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBJbmRleFBhZ2VyIHsKKworCXByb3RlY3RlZCBpbnQgcGFnZVNpemU7CisJcHJvdGVjdGVkIGludCBwYWdlTnVtOworCXByb3RlY3RlZCBpbnQgdG90YWxQYWdlczsKKwlwcm90ZWN0ZWQgaW50IG51bU9mSGl0czsKKwkKKwlwdWJsaWMgSW5kZXhQYWdlcigpIHsKKwkJdGhpcy5wYWdlU2l6ZSA9IDIwOworCQl0aGlzLnBhZ2VOdW0gPSAxOworCQl0aGlzLnRvdGFsUGFnZXMgPSAwOworCX0KKwkKKwlwdWJsaWMgSW5kZXhQYWdlcihQcm9jZXNzZWRQYWdlSW5mbyBwcm9jZXNzZWRQYWdlSW5mbykgeworCQl0aGlzLnBhZ2VTaXplID0gcHJvY2Vzc2VkUGFnZUluZm8uZ2V0UGFnZVNpemUoKTsKKwkJdGhpcy5wYWdlTnVtID0gcHJvY2Vzc2VkUGFnZUluZm8uZ2V0UGFnZU51bSgpOworCQl0aGlzLnRvdGFsUGFnZXMgPSBwcm9jZXNzZWRQYWdlSW5mby5nZXRUb3RhbFBhZ2VzKCk7CisJCXRoaXMubnVtT2ZIaXRzID0gcHJvY2Vzc2VkUGFnZUluZm8uZ2V0TnVtT2ZIaXRzKCk7CisJfQorCQorCXB1YmxpYyBQcm9jZXNzZWRQYWdlSW5mbyBnZXRQcm9jZXNzZWRQYWdlSW5mbygpIHsKKwkJcmV0dXJuIG5ldyBQcm9jZXNzZWRQYWdlSW5mbyh0aGlzLnBhZ2VTaXplLCB0aGlzLnBhZ2VOdW0sIHRoaXMubnVtT2ZIaXRzKTsKKwl9CisJCisJcHVibGljIGludCBnZXRQYWdlU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucGFnZVNpemU7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0UGFnZU51bSgpIHsKKwkJcmV0dXJuIHRoaXMucGFnZU51bTsKKwl9CisJCisJcHVibGljIGludCBnZXRUb3RhbFBhZ2VzKCkgeworCQlyZXR1cm4gdGhpcy50b3RhbFBhZ2VzOworCX0KKwkKKwlwdWJsaWMgaW50IGdldE51bU9mSGl0cygpIHsKKwkJcmV0dXJuIHRoaXMubnVtT2ZIaXRzOworCX0KKworCXB1YmxpYyB2b2lkIGluY3JlbWVudFBhZ2VOdW1iZXIoKSB7CisJCWlmICh0aGlzLnBhZ2VOdW0gKyAxIDw9IHRoaXMudG90YWxQYWdlcykKKwkJCXRoaXMucGFnZU51bSsrOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0xhc3RQYWdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRQYWdlSW5mbygpLmlzTGFzdFBhZ2UoKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9Jbmdlc3RSZWNlaXB0LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9Jbmdlc3RSZWNlaXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMGIzOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9wYWdlL0luZ2VzdFJlY2VpcHQuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgSW5nZXN0UmVjZWlwdCB7CisKKwlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZDsKKwlwcm90ZWN0ZWQgRGF0ZSB0cmFuc2FjdGlvbkRhdGU7CisJCisJcHVibGljIEluZ2VzdFJlY2VpcHQoVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCwgRGF0ZSB0cmFuc2FjdGlvbkRhdGUpIHsKKwkJdGhpcy5jYXRhbG9nVHJhbnNhY3Rpb25JZCA9IGNhdGFsb2dUcmFuc2FjdGlvbklkOworCQl0aGlzLnRyYW5zYWN0aW9uRGF0ZSA9IHRyYW5zYWN0aW9uRGF0ZTsKKwl9CisJCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1RyYW5zYWN0aW9uSWQoKSB7CisJCXJldHVybiB0aGlzLmNhdGFsb2dUcmFuc2FjdGlvbklkOworCX0KKwkKKwlwdWJsaWMgRGF0ZSBnZXRUcmFuc2FjdGlvbkRhdGUoKSB7CisJCXJldHVybiB0aGlzLnRyYW5zYWN0aW9uRGF0ZTsKKwl9CisJCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2F0YWxvZ1RyYW5zYWN0aW9uSWQuaGFzaENvZGUoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRoaXMuY2F0YWxvZ1RyYW5zYWN0aW9uSWQudG9TdHJpbmcoKSArICIgOiAiICsgdGhpcy50cmFuc2FjdGlvbkRhdGUudG9TdHJpbmcoKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9QYWdlLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1ZGNlMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9wYWdlL1BhZ2UuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUGFnZSB7CisKKwlwcm90ZWN0ZWQgTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IHJlY2VpcHRzOworCXByb3RlY3RlZCBQcm9jZXNzZWRQYWdlSW5mbyBwcm9jZXNzZWRQYWdlSW5mbzsKKwlwcm90ZWN0ZWQgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbjsKKwlwcm90ZWN0ZWQgU2V0PFN0cmluZz4gcmVzdHJpY3RUb0NhdGFsb2dJZHM7CisJCisJcHVibGljIFBhZ2UoUHJvY2Vzc2VkUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IHJlc3RyaWN0VG9DYXRhbG9nSWRzLCBMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gcmVjZWlwdHMpIHsKKwkJdGhpcy5wcm9jZXNzZWRQYWdlSW5mbyA9IHBhZ2VJbmZvOworCQl0aGlzLnF1ZXJ5RXhwcmVzc2lvbiA9IHF1ZXJ5RXhwcmVzc2lvbjsKKwkJdGhpcy5yZXN0cmljdFRvQ2F0YWxvZ0lkcyA9IHJlc3RyaWN0VG9DYXRhbG9nSWRzOworCQl0aGlzLnJlY2VpcHRzID0gcmVjZWlwdHM7CisJfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gZ2V0UmVjZWlwdHMoKSB7CisJCXJldHVybiB0aGlzLnJlY2VpcHRzOworCX0KKwkKKwlwdWJsaWMgaW50IGdldFBhZ2VTaXplKCkgeworCQlyZXR1cm4gdGhpcy5wcm9jZXNzZWRQYWdlSW5mby5nZXRQYWdlU2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgaW50IGdldFBhZ2VOdW0oKSB7CisJCXJldHVybiB0aGlzLnByb2Nlc3NlZFBhZ2VJbmZvLmdldFBhZ2VOdW0oKTsKKwl9CisJCisJcHVibGljIGludCBnZXRUb3RhbFBhZ2VzKCkgeworCQlyZXR1cm4gdGhpcy5wcm9jZXNzZWRQYWdlSW5mby5nZXRUb3RhbFBhZ2VzKCk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0TnVtT2ZIaXRzKCkgeworCQlyZXR1cm4gdGhpcy5wcm9jZXNzZWRQYWdlSW5mby5nZXROdW1PZkhpdHMoKTsKKwl9CisJCisJcHVibGljIFF1ZXJ5RXhwcmVzc2lvbiBnZXRRdWVyeUV4cHJlc3Npb24oKSB7CisJCXJldHVybiBxdWVyeUV4cHJlc3Npb247CisJfQorCisJcHVibGljIFNldDxTdHJpbmc+IGdldFJlc3RyaWN0VG9DYXRhbG9nSWRzKCkgeworCQlyZXR1cm4gcmVzdHJpY3RUb0NhdGFsb2dJZHM7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzTGFzdFBhZ2UoKSB7CisJCXJldHVybiB0aGlzLnByb2Nlc3NlZFBhZ2VJbmZvLmlzTGFzdFBhZ2UoKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9QYWdlSW5mby5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvUGFnZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZmZmQzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvUGFnZUluZm8uamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2U7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUGFnZUluZm8geworCisJcHJvdGVjdGVkIGludCBwYWdlU2l6ZTsKKwlwcm90ZWN0ZWQgaW50IHBhZ2VOdW07CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUdFID0gSW50ZWdlci5NQVhfVkFMVUU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFHRSA9IDE7CisKKwlwdWJsaWMgUGFnZUluZm8oaW50IHBhZ2VTaXplLCBpbnQgcGFnZU51bSkgeworCQl0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisJCWlmIChwYWdlTnVtIDwgMSkKKwkJCXRoaXMucGFnZU51bSA9IDE7CisJCWVsc2UKKwkJCXRoaXMucGFnZU51bSA9IHBhZ2VOdW07CisJfQorCisJcHVibGljIGludCBnZXRQYWdlU2l6ZSgpIHsKKwkJcmV0dXJuIHBhZ2VTaXplOworCX0KKworCXB1YmxpYyBpbnQgZ2V0UGFnZU51bSgpIHsKKwkJcmV0dXJuIHBhZ2VOdW07CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvUHJvY2Vzc2VkUGFnZUluZm8uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9wYWdlL1Byb2Nlc3NlZFBhZ2VJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1NGU2OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9wYWdlL1Byb2Nlc3NlZFBhZ2VJbmZvLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NlZFBhZ2VJbmZvIGV4dGVuZHMgUGFnZUluZm8geworCisJcHJvdGVjdGVkIGludCB0b3RhbFBhZ2VzOworCXByb3RlY3RlZCBpbnQgbnVtT2ZIaXRzOworCQorCXB1YmxpYyBQcm9jZXNzZWRQYWdlSW5mbyhpbnQgcGFnZVNpemUsIGludCBwYWdlTnVtLCBpbnQgbnVtT2ZIaXRzKSB7CisJCXN1cGVyKHBhZ2VTaXplLCBwYWdlTnVtID4gKChpbnQpIE1hdGguY2VpbCgoZG91YmxlKSBudW1PZkhpdHMgLyAoZG91YmxlKSBwYWdlU2l6ZSkpID8gKChpbnQpIE1hdGguY2VpbCgoZG91YmxlKSBudW1PZkhpdHMgLyAoZG91YmxlKSBwYWdlU2l6ZSkpIDogcGFnZU51bSk7CisJCXRoaXMudG90YWxQYWdlcyA9ICgoaW50KSBNYXRoLmNlaWwoKGRvdWJsZSkgbnVtT2ZIaXRzIC8gKGRvdWJsZSkgcGFnZVNpemUpKTsKKwkJdGhpcy5udW1PZkhpdHMgPSBudW1PZkhpdHM7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0VG90YWxQYWdlcygpIHsKKwkJcmV0dXJuIHRoaXMudG90YWxQYWdlczsKKwl9CisJCisJcHVibGljIGludCBnZXROdW1PZkhpdHMoKSB7CisJCXJldHVybiB0aGlzLm51bU9mSGl0czsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNMYXN0UGFnZSgpIHsKKwkJcmV0dXJuIHRoaXMucGFnZU51bSA+PSB0aGlzLnRvdGFsUGFnZXM7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvUXVlcnlQYWdlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvUXVlcnlQYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjY1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9RdWVyeVBhZ2VyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIHBhZ2VyIGZvciBwYWdpbmcgdGhyb3VnaCBxdWVyeSByZXN1bHRzCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UGFnZXIgZXh0ZW5kcyBJbmRleFBhZ2VyIHsKKworCXByb3RlY3RlZCBMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gcmVjZWlwdHM7CisJCisJcHVibGljIFF1ZXJ5UGFnZXIoTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IHJlY2VpcHRzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMucmVjZWlwdHMgPSBuZXcgVmVjdG9yPFRyYW5zYWN0aW9uUmVjZWlwdD4ocmVjZWlwdHMpOworCQl0aGlzLnRvdGFsUGFnZXMgPSB0aGlzLmNhY3VsYXRlVG90YWxQYWdlcygpOworCQl0aGlzLm51bU9mSGl0cyA9IHJlY2VpcHRzLnNpemUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IGNhY3VsYXRlVG90YWxQYWdlcygpIHsKKwkJcmV0dXJuIChpbnQpIE1hdGguY2VpbCgoZG91YmxlKSByZWNlaXB0cy5zaXplKCkgLyAoZG91YmxlKSB0aGlzLmdldFBhZ2VTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQYWdlSW5mbyhQYWdlSW5mbyBwYWdlSW5mbykgeworCQl0aGlzLnBhZ2VTaXplID0gTWF0aC5tYXgocGFnZUluZm8uZ2V0UGFnZVNpemUoKSwgMCk7CisJCXRoaXMudG90YWxQYWdlcyA9IHRoaXMuY2FjdWxhdGVUb3RhbFBhZ2VzKCk7CisJCWlmICh0aGlzLnRvdGFsUGFnZXMgPT0gMCkKKwkJCXRoaXMucGFnZU51bSA9IDA7CisJCWVsc2UKKwkJCXRoaXMucGFnZU51bSA9IChwYWdlSW5mby5nZXRQYWdlTnVtKCkgPT0gUGFnZUluZm8uTEFTVF9QQUdFIHx8IHBhZ2VJbmZvLmdldFBhZ2VOdW0oKSA+PSB0aGlzLnRvdGFsUGFnZXMpID8gdGhpcy50b3RhbFBhZ2VzIDogcGFnZUluZm8uZ2V0UGFnZU51bSgpOworCX0KKwkJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25SZWNlaXB0PiBnZXRUcmFuc2FjdGlvblJlY2VpcHRzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLnJlY2VpcHRzKTsKKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25SZWNlaXB0PiBnZXRDdXJyZW50UGFnZSgpIHsKKwkJTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IGN1cnJlbnRQYWdlID0gbmV3IFZlY3RvcjxUcmFuc2FjdGlvblJlY2VpcHQ+KCk7CisJCWlmICh0aGlzLnBhZ2VOdW0gPiAwKQorCQkJZm9yIChpbnQgaSA9ICh0aGlzLmdldFBhZ2VOdW0oKSAtIDEpICogdGhpcy5nZXRQYWdlU2l6ZSgpOyBpIDwgcmVjZWlwdHMuc2l6ZSgpICYmIGkgPCB0aGlzLmdldFBhZ2VOdW0oKSAqIHRoaXMuZ2V0UGFnZVNpemUoKTsgaSsrKQorCQkJCWN1cnJlbnRQYWdlLmFkZChyZWNlaXB0cy5nZXQoaSkpOworCQlyZXR1cm4gY3VycmVudFBhZ2U7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvVHJhbnNhY3Rpb25SZWNlaXB0LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcGFnZS9UcmFuc2FjdGlvblJlY2VpcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU0ODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3BhZ2UvVHJhbnNhY3Rpb25SZWNlaXB0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIFJlY2llcHQgY3JlYXRlZCBieSBwZXJmb3JtaW5nIGEgdHJhbnNhY3Rpb24gd2l0aCBhIENhdGFsb2dTZXJ2aWNlCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uUmVjZWlwdCB7CisKKwlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkOworCXByb3RlY3RlZCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzOworCXByb3RlY3RlZCBEYXRlIHRyYW5zYWN0aW9uRGF0ZTsKKwlwcm90ZWN0ZWQgVmVjdG9yPENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHM7CisJCisJcHVibGljIFRyYW5zYWN0aW9uUmVjZWlwdChUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQsIExpc3Q8Q2F0YWxvZ1JlY2VpcHQ+IGNhdGFsb2dSZWNlaXB0cykgeworCQl0aGlzLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworCQl0aGlzLmNhdGFsb2dJZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCXRoaXMuY2F0YWxvZ1JlY2VpcHRzID0gbmV3IFZlY3RvcjxDYXRhbG9nUmVjZWlwdD4oY2F0YWxvZ1JlY2VpcHRzKTsKKwkJZm9yIChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA6IGNhdGFsb2dSZWNlaXB0cykgeworCQkJdGhpcy5jYXRhbG9nSWRzLmFkZChjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSk7CisJCQlpZiAodGhpcy50cmFuc2FjdGlvbkRhdGUgPT0gbnVsbCkKKwkJCQl0aGlzLnRyYW5zYWN0aW9uRGF0ZSA9IGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uRGF0ZSgpOworCQkJZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRhdGUuYmVmb3JlKGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uRGF0ZSgpKSkKKwkJCQl0aGlzLnRyYW5zYWN0aW9uRGF0ZSA9IGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uRGF0ZSgpOworCQl9CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKwkJcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25JZDsKKwl9CisJCisJcHVibGljIFNldDxTdHJpbmc+IGdldENhdGFsb2dJZHMoKSB7CisJCXJldHVybiB0aGlzLmNhdGFsb2dJZHM7CisJfQorCQorCXB1YmxpYyBEYXRlIGdldFRyYW5zYWN0aW9uRGF0ZSgpIHsKKwkJcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25EYXRlOworCX0KKwkKKwlwdWJsaWMgTGlzdDxDYXRhbG9nUmVjZWlwdD4gZ2V0Q2F0YWxvZ1JlY2VpcHRzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmNhdGFsb2dSZWNlaXB0cyk7CisJfQorCQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWQuaGFzaENvZGUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uUmVjZWlwdCkgeworCQkJcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25JZC5lcXVhbHMoKChUcmFuc2FjdGlvblJlY2VpcHQpIG9iaikudHJhbnNhY3Rpb25JZCk7CisJCX1lbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gdGhpcy50cmFuc2FjdGlvbklkICsgIjoiICsgdGhpcy5jYXRhbG9nSWRzOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9Db21wYXJpc29uUXVlcnlFeHByZXNzaW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDQ5MjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIFRlcm1RdWVyeUV4cHJlc3Npb24gd2hpY2ggYWxsb3dzIFRlcm0gY29tcGFyaXNvbgorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uIGV4dGVuZHMgVGVybVF1ZXJ5RXhwcmVzc2lvbiB7CisKKwlwdWJsaWMgc3RhdGljIGVudW0gT3BlcmF0b3IgeyBFUVVBTF9UTygiPT0iKSwgTEVTU19USEFOX0VRVUFMX1RPKCI8PSIpLCBHUkVBVEVSX1RIQU5fRVFVQUxfVE8oIj49IiksIExFU1NfVEhBTigiPCIpLCBHUkVBVEVSX1RIQU4oIj4iKSwgTElLRSgiTElLRSIpOyAKKwkKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJCQorCQlPcGVyYXRvcihTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCQkKKwkJcHVibGljIHN0YXRpYyBPcGVyYXRvciBnZXRPcGVyYXRvckJ5U2lnbihTdHJpbmcgc2lnbikgeworCQkJaWYgKEVRVUFMX1RPLnZhbHVlLmVxdWFscyhzaWduKSkKKwkJCQlyZXR1cm4gRVFVQUxfVE87CisJCQllbHNlIGlmIChMRVNTX1RIQU5fRVFVQUxfVE8udmFsdWUuZXF1YWxzKHNpZ24pKQorCQkJCXJldHVybiBMRVNTX1RIQU5fRVFVQUxfVE87CisJCQllbHNlIGlmIChHUkVBVEVSX1RIQU5fRVFVQUxfVE8udmFsdWUuZXF1YWxzKHNpZ24pKQorCQkJCXJldHVybiBHUkVBVEVSX1RIQU5fRVFVQUxfVE87CisJCQllbHNlIGlmIChMRVNTX1RIQU4udmFsdWUuZXF1YWxzKHNpZ24pKQorCQkJCXJldHVybiBMRVNTX1RIQU47CisJCQllbHNlIGlmIChHUkVBVEVSX1RIQU4udmFsdWUuZXF1YWxzKHNpZ24pKQorCQkJCXJldHVybiBHUkVBVEVSX1RIQU47CisJCQllbHNlIGlmIChMSUtFLnZhbHVlLmVxdWFscyhzaWduKSkKKwkJCQlyZXR1cm4gTElLRTsKKwkJCWVsc2UKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgbWF0Y2hpbmcgb3BlcmF0b3IgZm9yICciICsgc2lnbiArICInIik7CisJCX0KKwkJCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwkJfQorCQorCX0KKwlwcm90ZWN0ZWQgT3BlcmF0b3Igb3BlcmF0b3I7CisJCisJcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoT3BlcmF0b3Igb3BlcmF0b3IpIHsKKwkJdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yOworCX0KKwkKKwlwdWJsaWMgT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLm9wZXJhdG9yOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiKHsiICsgdGhpcy5idWNrZXROYW1lcyArICJ9ICIgKyB0aGlzLmdldFRlcm0oKS5nZXROYW1lKCkgKyAiICIgKyB0aGlzLm9wZXJhdG9yICsgIiAiICsgdGhpcy5nZXRUZXJtKCkuZ2V0VmFsdWVzKCkgKyAiKSI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24gY2xvbmUoKSB7CisJCUNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24gbmV3UUUgPSBuZXcgQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbigpOworCQluZXdRRS5vcGVyYXRvciA9IHRoaXMub3BlcmF0b3I7CisJCW5ld1FFLnNldFRlcm0odGhpcy50ZXJtLmNsb25lKCkpOworCQluZXdRRS5zZXRCdWNrZXROYW1lcyh0aGlzLmdldEJ1Y2tldE5hbWVzKCkpOworCQlyZXR1cm4gbmV3UUU7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvQ3VzdG9tUXVlcnlFeHByZXNzaW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvQ3VzdG9tUXVlcnlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5ZjI2MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9DdXN0b21RdWVyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIENvbmZpZ3VyYWJsZSBRdWVyeUV4cHJlc3Npb24KKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tUXVlcnlFeHByZXNzaW9uIGV4dGVuZHMgUXVlcnlFeHByZXNzaW9uIHsKKworCXByb3RlY3RlZCBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCQorCXB1YmxpYyBDdXN0b21RdWVyeUV4cHJlc3Npb24oU3RyaW5nIG5hbWUpIHsKKwkJdGhpcyhuYW1lLCBuZXcgUHJvcGVydGllcygpKTsKKwl9CisJCisJcHVibGljIEN1c3RvbVF1ZXJ5RXhwcmVzc2lvbihTdHJpbmcgbmFtZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpCisJCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCQllbHNlIAorCQkJdGhpcy5wcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisJCXJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEN1c3RvbVF1ZXJ5RXhwcmVzc2lvbiBjbG9uZSgpIHsKKwkJQ3VzdG9tUXVlcnlFeHByZXNzaW9uIGNxZSA9IG5ldyBDdXN0b21RdWVyeUV4cHJlc3Npb24odGhpcy5uYW1lLCAoUHJvcGVydGllcykgdGhpcy5wcm9wZXJ0aWVzLmNsb25lKCkpOworCQljcWUuc2V0QnVja2V0TmFtZXModGhpcy5nZXRCdWNrZXROYW1lcygpKTsKKwkJcmV0dXJuIGNxZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIih7IiArIHRoaXMuYnVja2V0TmFtZXMgKyAifSAiICsgdGhpcy5uYW1lICsgIiA6ICIgKyB0aGlzLnByb3BlcnRpZXMudG9TdHJpbmcoKSArICIpIjsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvQ3VzdG9tV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L0N1c3RvbVdyYXBwZXJRdWVyeUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYyMWZkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L0N1c3RvbVdyYXBwZXJRdWVyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbVdyYXBwZXJRdWVyeUV4cHJlc3Npb24gZXh0ZW5kcyBXcmFwcGVyUXVlcnlFeHByZXNzaW9uIHsKKworCXByb3RlY3RlZCBTdHJpbmcgbWVhbmluZzsKKwkKKwlwdWJsaWMgQ3VzdG9tV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbihTdHJpbmcgbWVhbmluZykgeworCQl0aGlzLm1lYW5pbmcgPSBtZWFuaW5nOworCX0KKwkKKwlwdWJsaWMgQ3VzdG9tV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbihTdHJpbmcgbWVhbmluZywgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgeworCQlzdXBlcihxdWVyeUV4cHJlc3Npb24pOworCQl0aGlzLm1lYW5pbmcgPSBtZWFuaW5nOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1lYW5pbmcoKSB7CisJCXJldHVybiB0aGlzLm1lYW5pbmc7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBDdXN0b21XcmFwcGVyUXVlcnlFeHByZXNzaW9uIGNsb25lKCkgeworCQlDdXN0b21XcmFwcGVyUXVlcnlFeHByZXNzaW9uIGN3cWUgPSBuZXcgQ3VzdG9tV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbih0aGlzLm1lYW5pbmcsIHRoaXMucXVlcnlFeHByZXNzaW9uLmNsb25lKCkpOworCQljd3FlLnNldEJ1Y2tldE5hbWVzKHRoaXMuYnVja2V0TmFtZXMpOworCQlyZXR1cm4gY3dxZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIih7IiArIHRoaXMuYnVja2V0TmFtZXMgKyAifSAiICsgdGhpcy5tZWFuaW5nICsgIigiICsgdGhpcy5xdWVyeUV4cHJlc3Npb24gKyAiKSkiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWRXaXRoTm9TdWJFeHByZXNzaW9uKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvRnJlZVRleHRRdWVyeUV4cHJlc3Npb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9GcmVlVGV4dFF1ZXJ5RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Mjc4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvRnJlZVRleHRRdWVyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRnJlZSBUZXh0IFRlcm1RdWVyeUV4cHJlc3Npb24KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRnJlZVRleHRRdWVyeUV4cHJlc3Npb24gZXh0ZW5kcyBUZXJtUXVlcnlFeHByZXNzaW9uIHsKKwkKKwlwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBub2lzZVdvcmRIYXNoID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKKwkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYSIsICJhbGwiLCAiYW0iLCAiYW4iLCAiYW5kIiwKKyAgICAgICAgImFueSIsICJhcmUiLCAiYXMiLCAiYXQiLCAiYmUiLCAiYnV0IiwgImNhbiIsICJkaWQiLCAiZG8iLCAiZG9lcyIsCisgICAgICAgICJmb3IiLCAiZnJvbSIsICJoYWQiLCAiaGFzIiwgImhhdmUiLCAiaGVyZSIsICJob3ciLCAiaSIsICJpZiIsCisgICAgICAgICJpbiIsICJpcyIsICJpdCIsICJubyIsICJub3QiLCAib2YiLCAib24iLCAib3IiLCAic28iLCAidGhhdCIsCisgICAgICAgICJ0aGUiLCAidGhlbiIsICJ0aGVyZSIsICJ0aGlzIiwgInRvIiwgInRvbyIsICJ1cCIsICJ1c2UiLCAid2hhdCIsCisgICAgICAgICJ3aGVuIiwgIndoZXJlIiwgIndobyIsICJ3aHkiLCAieW91IiB9KSk7CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCBmb3IgYWRkaW5nIHVucGFyc2VkIGZyZWUgdGV4dCB0byB0aGUgRnJlZVRleHRDcml0ZXJpYS4gRnJlZSB0ZXh0CisgICAgICogZW50ZXJlZCBhcyBhIHN0cmluZyBpcyB0b2tlbml6ZWQgYW5kIHB1bmN0dWF0aW9uIGFuZCBjb21tb24gd29yZHMgYXJlCisgICAgICogZHJvcHBlZCBiZWZvcmUgdGhlIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIHF1ZXJ5LiBJbiBvcmRlciB0byBxdWVyeSBmb3IKKyAgICAgKiBwcmUtcGFyc2VkIGtleXdvcmRzLCBzZWUgdGhlIHNldFZhbHVlcyBtZXRob2Qgb2YgdGhpcyBjbGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dAorICAgICAqICAgICAgICAgICAgVGhlIGZyZWUgdGV4dCB0byBiZSBwYXJzZWQgYW5kIHNlYXJjaGVkIG9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZyZWVUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIC8vIHJlbW92ZSBwdW5jdHVhdGlvbiBmcm9tIHRoZSB0ZXh0CisgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoIlxccHtQdW5jdH0rIiwgIiIpOworCisgICAgICAgIC8vIHRva2VuaXplIHN0cmluZyB1c2luZyBkZWZhdWx0IGRlbGltaXRlcnMKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCk7CisgICAgICAgIFN0cmluZyB0b2tlbiA9IG51bGw7CisKKyAgICAgICAgLy8gZmlsdGVyIG5vaXNlIHdvcmRzIGFuZCBhZGQgdG8gdmFsdWVzIHZlY3RvcgorICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHRva2VuID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKCFub2lzZVdvcmRIYXNoLmNvbnRhaW5zKHRva2VuKSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgCXZhbHVlcy5hZGRBbGwodGhpcy50ZXJtLmdldFZhbHVlcygpKTsKKyAgICAgICAgCXRoaXMudGVybS5zZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgaW5oZXJpdGVkIGZyb20gUXVlcnlDcml0ZXJpYSBmb3IKKyAgICAgKiBnZW5lcmF0aW5nIGEgaHVtYW4tcGFyc2FibGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIHF1ZXJ5IGNyaXRlcmlhLiBOb3RlCisgICAgICogdGhhdCB0aGUgcmV0dXJuZWQgU3RyaW5nIGZvbGxvd3MgdGhlIEx1Y2VuZSBxdWVyeSBsYW5ndWFnZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBxdWVyeSBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgc2VyaWFsID0gIih7IiArIHRoaXMuYnVja2V0TmFtZXMgKyAifSAiICsgdGhpcy50ZXJtLmdldE5hbWUoKSArICIgOnwiOworICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHRoaXMudGVybS5nZXRWYWx1ZXMoKSkKKyAgICAgICAgICAgIHNlcmlhbCArPSAiKyIgKyB2YWx1ZTsKKyAgICAgICAgc2VyaWFsICs9ICJ8OiApIjsKKyAgICAgICAgcmV0dXJuIHNlcmlhbDsKKyAgICB9CisgICAgCisJQE92ZXJyaWRlCisJcHVibGljIEZyZWVUZXh0UXVlcnlFeHByZXNzaW9uIGNsb25lKCkgeworCQlGcmVlVGV4dFF1ZXJ5RXhwcmVzc2lvbiBmdFFFID0gbmV3IEZyZWVUZXh0UXVlcnlFeHByZXNzaW9uKCk7CisJCWZ0UUUubm9pc2VXb3JkSGFzaCA9IG5ldyBIYXNoU2V0PFN0cmluZz4odGhpcy5ub2lzZVdvcmRIYXNoKTsKKwkJZnRRRS5zZXRUZXJtKHRoaXMudGVybS5jbG9uZSgpKTsKKwkJZnRRRS5zZXRCdWNrZXROYW1lcyh0aGlzLmJ1Y2tldE5hbWVzKTsKKwkJcmV0dXJuIGZ0UUU7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvTm90UXVlcnlFeHByZXNzaW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvTm90UXVlcnlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwOWRmYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9Ob3RRdWVyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBXcmFwcGVyUXVlcnlFeHByZXNzaW9uIHdoaWNoIHNpZ25pZmllcyBuZWdhdGlvbiBvZiB3cmFwcGVkIFF1ZXJ5RXhwcmVzc2lvbgorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBOb3RRdWVyeUV4cHJlc3Npb24gZXh0ZW5kcyBXcmFwcGVyUXVlcnlFeHByZXNzaW9uIHsKKwkKKwlwdWJsaWMgTm90UXVlcnlFeHByZXNzaW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgTm90UXVlcnlFeHByZXNzaW9uKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHsKKwkJc3VwZXIocXVlcnlFeHByZXNzaW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90UXVlcnlFeHByZXNzaW9uIGNsb25lKCkgeworCQlOb3RRdWVyeUV4cHJlc3Npb24gbnFlID0gbmV3IE5vdFF1ZXJ5RXhwcmVzc2lvbih0aGlzLnF1ZXJ5RXhwcmVzc2lvbi5jbG9uZSgpKTsKKwkJbnFlLnNldEJ1Y2tldE5hbWVzKHRoaXMuZ2V0QnVja2V0TmFtZXMoKSk7CisJCXJldHVybiBucWU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiKE5PVCAoIiArIHRoaXMucXVlcnlFeHByZXNzaW9uICsgIikpIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkV2l0aE5vU3ViRXhwcmVzc2lvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L1F1ZXJ5RXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L1F1ZXJ5RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZWYwMmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvUXVlcnlFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEV4cHJlc3Npb24gZm9yIHF1ZXJ5aW5nIGFnYWluc3QgYSBDYXRhbG9nU2VydmljZXMgTWV0YWRhdGEKKyAqIDxwPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUXVlcnlFeHByZXNzaW9uIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICAKKyAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gYnVja2V0TmFtZXM7CisgICAgCisgICAgcHVibGljIFF1ZXJ5RXhwcmVzc2lvbigpIHt9CisgICAgCisgICAgcHVibGljIFF1ZXJ5RXhwcmVzc2lvbihTZXQ8U3RyaW5nPiBidWNrZXROYW1lcykgeyAKKyAgICAJdGhpcy5idWNrZXROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpOworICAgIH0KKyAgICAKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QnVja2V0TmFtZXMoKSB7CisJCXJldHVybiAodGhpcy5idWNrZXROYW1lcyAhPSBudWxsKSA/IG5ldyBIYXNoU2V0PFN0cmluZz4odGhpcy5idWNrZXROYW1lcykgOiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEJ1Y2tldE5hbWVzKFNldDxTdHJpbmc+IGJ1Y2tldE5hbWVzKSB7CisJCXRoaXMuYnVja2V0TmFtZXMgPSBidWNrZXROYW1lczsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgUXVlcnlFeHByZXNzaW9uIGNsb25lKCk7CisgICAgCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvUXVlcnlMb2dpY2FsR3JvdXAuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9RdWVyeUxvZ2ljYWxHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmU3MzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvUXVlcnlMb2dpY2FsR3JvdXAuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBRdWVyeUV4cHJlc3Npb24gd2hpY2ggZ3JvdXBzIG90aGVyIFF1ZXJ5RXhwcmVzc2lvbnMKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgUXVlcnlMb2dpY2FsR3JvdXAgZXh0ZW5kcyBRdWVyeUV4cHJlc3Npb24geworCisJcHVibGljIGVudW0gT3BlcmF0b3IgeyBBTkQsIE9SIH0KKwkKKyAgICBwcm90ZWN0ZWQgT3BlcmF0b3Igb3BlcmF0b3I7CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxRdWVyeUV4cHJlc3Npb24+IHF1ZXJ5RXhwcmVzc2lvbnM7CisKKyAgICBwdWJsaWMgUXVlcnlMb2dpY2FsR3JvdXAoKSB7CisgICAgCXRoaXMobmV3IFZlY3RvcjxRdWVyeUV4cHJlc3Npb24+KCksIE9wZXJhdG9yLkFORCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBRdWVyeUxvZ2ljYWxHcm91cChMaXN0PFF1ZXJ5RXhwcmVzc2lvbj4gcXVlcnlFeHByZXNzaW9ucykgeworICAgIAl0aGlzKHF1ZXJ5RXhwcmVzc2lvbnMsIE9wZXJhdG9yLkFORCk7CisgICAgfQorCisgICAgcHVibGljIFF1ZXJ5TG9naWNhbEdyb3VwKExpc3Q8UXVlcnlFeHByZXNzaW9uPiBxdWVyeUV4cHJlc3Npb25zLCBPcGVyYXRvciBvcGVyYXRvcikgeworICAgIAl0aGlzLnNldEV4cHJlc3Npb25zKHF1ZXJ5RXhwcmVzc2lvbnMpOworICAgIAl0aGlzLnNldE9wZXJhdG9yKG9wZXJhdG9yKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbnMoTGlzdDxRdWVyeUV4cHJlc3Npb24+IHF1ZXJ5RXhwcmVzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5xdWVyeUV4cHJlc3Npb25zID0gbmV3IFZlY3RvcjxRdWVyeUV4cHJlc3Npb24+KHF1ZXJ5RXhwcmVzc2lvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBwYXJhbSBxdWVyeUNyaXRlcmlhCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXhwcmVzc2lvbihRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB7CisgICAgCXRoaXMucXVlcnlFeHByZXNzaW9ucy5hZGQocXVlcnlFeHByZXNzaW9uKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHF1ZXJ5Q3JpdGVyaWFzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXhwcmVzc2lvbnMoTGlzdDxRdWVyeUV4cHJlc3Npb24+IHF1ZXJ5RXhwcmVzc2lvbnMpIHsKKyAgICAJdGhpcy5xdWVyeUV4cHJlc3Npb25zLmFkZEFsbChxdWVyeUV4cHJlc3Npb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UXVlcnlFeHByZXNzaW9uPiBnZXRFeHByZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5xdWVyeUV4cHJlc3Npb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlcmF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihPcGVyYXRvciBvcGVyYXRvcikgeworICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIih7IiArIHRoaXMuYnVja2V0TmFtZXMgKyAifSAiICsgdGhpcy5vcGVyYXRvciArICIgOiAiOworICAgICAgICBmb3IgKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24gOiB0aGlzLnF1ZXJ5RXhwcmVzc2lvbnMpCisgICAgICAgICAgICBxdWVyeSArPSBxdWVyeUV4cHJlc3Npb24udG9TdHJpbmcoKSArICIsIjsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5LnN1YnN0cmluZygwLCBxdWVyeS5sZW5ndGgoKSAtIDEpICsgIikiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUXVlcnlMb2dpY2FsR3JvdXAgY2xvbmUoKSB7CisgICAgCVF1ZXJ5TG9naWNhbEdyb3VwIHFsR3JvdXAgPSBuZXcgUXVlcnlMb2dpY2FsR3JvdXAoKTsKKyAgICAJcWxHcm91cC5zZXRCdWNrZXROYW1lcyh0aGlzLmdldEJ1Y2tldE5hbWVzKCkpOworICAgIAlxbEdyb3VwLnNldE9wZXJhdG9yKHRoaXMub3BlcmF0b3IpOworICAgIAlmb3IgKFF1ZXJ5RXhwcmVzc2lvbiBxZSA6IHRoaXMucXVlcnlFeHByZXNzaW9ucykKKyAgICAJCXFsR3JvdXAuYWRkRXhwcmVzc2lvbihxZS5jbG9uZSgpKTsKKyAgICAJcmV0dXJuIHFsR3JvdXA7CisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9TdGRRdWVyeUV4cHJlc3Npb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9TdGRRdWVyeUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzUzZDRjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L1N0ZFF1ZXJ5RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBTdGFuZGFyZCBRdWVyeUV4cHJlc3Npb24KKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgU3RkUXVlcnlFeHByZXNzaW9uIGV4dGVuZHMgUXVlcnlFeHByZXNzaW9uIHsKKworCXB1YmxpYyBTdGRRdWVyeUV4cHJlc3Npb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBTdGRRdWVyeUV4cHJlc3Npb24oU2V0PFN0cmluZz4gYnVja2V0TmFtZXMpIHsKKwkJc3VwZXIoYnVja2V0TmFtZXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RkUXVlcnlFeHByZXNzaW9uIGNsb25lKCkgeworCQlyZXR1cm4gbmV3IFN0ZFF1ZXJ5RXhwcmVzc2lvbih0aGlzLmdldEJ1Y2tldE5hbWVzKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiKHsiICsgdGhpcy5idWNrZXROYW1lcyArICJ9KSI7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvVGVybVF1ZXJ5RXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L1Rlcm1RdWVyeUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTUxMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L1Rlcm1RdWVyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy50ZXJtLlRlcm07CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIFF1ZXJ5RXhwcmVzc2lvbiB3aGljaCB3cmFwcGVycyBhIFRlcm0KKyAqIDxwPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVybVF1ZXJ5RXhwcmVzc2lvbiBleHRlbmRzIFF1ZXJ5RXhwcmVzc2lvbiBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKwlwcm90ZWN0ZWQgVGVybSB0ZXJtOworCisgICAgcHVibGljIFRlcm0gZ2V0VGVybSgpIHsKKwkJcmV0dXJuIHRoaXMudGVybTsKKwl9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXJtKFRlcm0gdGVybSkgeworICAgIAl0aGlzLnRlcm0gPSB0ZXJtOworICAgIH0KKyAgICAJCisgICAgcHVibGljIGFic3RyYWN0IFRlcm1RdWVyeUV4cHJlc3Npb24gY2xvbmUoKTsKKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9XcmFwcGVyUXVlcnlFeHByZXNzaW9uLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWM2MjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIFF1ZXJ5RXhwcmVzc2lvbiB3aGljaCB3cmFwcGVycyBhbm90aGVyIFF1ZXJ5RXhwcmVzc2lvbgorICogPHA+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXcmFwcGVyUXVlcnlFeHByZXNzaW9uIGV4dGVuZHMgUXVlcnlFeHByZXNzaW9uIHsKKworCXByb3RlY3RlZCBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uOworCisJcHVibGljIFdyYXBwZXJRdWVyeUV4cHJlc3Npb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBXcmFwcGVyUXVlcnlFeHByZXNzaW9uKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHsKKwkJdGhpcygpOworCQl0aGlzLnF1ZXJ5RXhwcmVzc2lvbiA9IHF1ZXJ5RXhwcmVzc2lvbjsKKwl9CisJCisJcHVibGljIFF1ZXJ5RXhwcmVzc2lvbiBnZXRRdWVyeUV4cHJlc3Npb24oKSB7CisJCXJldHVybiBxdWVyeUV4cHJlc3Npb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UXVlcnlFeHByZXNzaW9uKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHsKKwkJdGhpcy5xdWVyeUV4cHJlc3Npb24gPSBxdWVyeUV4cHJlc3Npb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICIoIiArIHRoaXMucXVlcnlFeHByZXNzaW9uICsgIikiOworCX0KKwkKKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkV2l0aE5vU3ViRXhwcmVzc2lvbigpOworCisJcHVibGljIGFic3RyYWN0IFdyYXBwZXJRdWVyeUV4cHJlc3Npb24gY2xvbmUoKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvRmlsdGVyQWxnb3JpdGhtLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL0ZpbHRlckFsZ29yaXRobS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjk5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL0ZpbHRlckFsZ29yaXRobS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuZmlsdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEFuIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGRlZmluaW5nIGhvdyBRdWVyeUZpbHRlciBmaWx0ZXJzIHF1ZXJ5IHJlc3VsdHMKKyAqIDxwPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyQWxnb3JpdGhtPEZpbHRlclR5cGU+IHsKKyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxGaWx0ZXJUeXBlPiBmaWx0ZXIoTGlzdDxGaWx0ZXJUeXBlPiBldmVudHMpOyAKKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvUXVlcnlGaWx0ZXIuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvUXVlcnlGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZkZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L2ZpbHRlci9RdWVyeUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuZmlsdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgRmlsdGVyIGludGVyZmFjZSBmb3IgZmlsdGVyaW5nIHF1ZXJpZXMKKyAqIDxwPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUXVlcnlGaWx0ZXI8RmlsdGVyVHlwZT4geworCisJcHJvdGVjdGVkIEZpbHRlckFsZ29yaXRobTxGaWx0ZXJUeXBlPiBmaWx0ZXJBbGdvcml0aG07CisJCisJcHVibGljIFF1ZXJ5RmlsdGVyKCkge30KKwkKKwlwdWJsaWMgUXVlcnlGaWx0ZXIoRmlsdGVyQWxnb3JpdGhtPEZpbHRlclR5cGU+IGZpbHRlckFsZ29yaXRobSkgeworCQlzdXBlcigpOworCQl0aGlzLmZpbHRlckFsZ29yaXRobSA9IGZpbHRlckFsZ29yaXRobTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RmlsdGVyQWxnb3JpdGhtKEZpbHRlckFsZ29yaXRobTxGaWx0ZXJUeXBlPiBmaWx0ZXJBbGdvcml0aG0pIHsKKwkJdGhpcy5maWx0ZXJBbGdvcml0aG0gPSBmaWx0ZXJBbGdvcml0aG07CisJfQorCQorCXB1YmxpYyBGaWx0ZXJBbGdvcml0aG08RmlsdGVyVHlwZT4gZ2V0RmlsdGVyQWxnb3JpdGhtKCkgeworCQlyZXR1cm4gdGhpcy5maWx0ZXJBbGdvcml0aG07CisJfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZmlsdGVyTWV0YWRhdGFMaXN0KExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YVRvRmlsdGVyKSB7CisJCXJldHVybiB0aGlzLmZpbHRlclR5cGVUb01ldGFkYXRhKHRoaXMuZmlsdGVyQWxnb3JpdGhtLmZpbHRlcih0aGlzLm1ldGFkYXRhVG9GaWx0ZXJUeXBlKG1ldGFkYXRhVG9GaWx0ZXIpKSk7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PEZpbHRlclR5cGU+IG1ldGFkYXRhVG9GaWx0ZXJUeXBlKExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YUxpc3QpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZmlsdGVyVHlwZVRvTWV0YWRhdGEoTGlzdDxGaWx0ZXJUeXBlPiBmaWx0ZXJPYmplY3RzKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9NZXRhZGF0YVRpbWVFdmVudC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L2ZpbHRlci90aW1lL01ldGFkYXRhVGltZUV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZWFhZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9NZXRhZGF0YVRpbWVFdmVudC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuZmlsdGVyLnRpbWU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5maWx0ZXIuT2JqZWN0VGltZUV2ZW50OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBPYmplY3RUaW1lRXZlbnQgdGhhdCBob2xkcyBUZXJtQnVja2V0cworICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YVRpbWVFdmVudCBleHRlbmRzIE9iamVjdFRpbWVFdmVudDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IHsKKworICAgIHB1YmxpYyBNZXRhZGF0YVRpbWVFdmVudChsb25nIHN0YXJ0VGltZSwgbG9uZyBlbmRUaW1lLCBUcmFuc2FjdGlvbmFsTWV0YWRhdGEgdGltZU9iaikgeworCQlzdXBlcihzdGFydFRpbWUsIGVuZFRpbWUsIHRpbWVPYmopOworICAgIH0KKwkKKwlwdWJsaWMgTWV0YWRhdGFUaW1lRXZlbnQobG9uZyBzdGFydFRpbWUsIGxvbmcgZW5kVGltZSwgZG91YmxlIHByaW9yaXR5LCBUcmFuc2FjdGlvbmFsTWV0YWRhdGEgdGltZU9iaikgeworCQlzdXBlcihzdGFydFRpbWUsIGVuZFRpbWUsIHByaW9yaXR5LCB0aW1lT2JqKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9NZXRhZGF0YVRpbWVFdmVudEZpbHRlckFsZ29yaXRobS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L2ZpbHRlci90aW1lL01ldGFkYXRhVGltZUV2ZW50RmlsdGVyQWxnb3JpdGhtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0YTRkNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9NZXRhZGF0YVRpbWVFdmVudEZpbHRlckFsZ29yaXRobS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuZmlsdGVyLnRpbWU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvcml0aG07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZmlsdGVyLlRpbWVFdmVudFdlaWdodGVkSGFzaDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhVGltZUV2ZW50RmlsdGVyQWxnb3JpdGhtIGV4dGVuZHMgRmlsdGVyQWxnb3JpdGhtPE1ldGFkYXRhVGltZUV2ZW50PiB7CisJCisgICAgcHJvdGVjdGVkIGxvbmcgZXBzaWxvbjsKKyAgICAKKyAgICBwdWJsaWMgTWV0YWRhdGFUaW1lRXZlbnRGaWx0ZXJBbGdvcml0aG0oKSB7CisgICAgICAgIHRoaXMuZXBzaWxvbiA9IDA7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXRhZGF0YVRpbWVFdmVudEZpbHRlckFsZ29yaXRobShsb25nIGVwc2lsb24pIHsKKyAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RXBzaWxvbihsb25nIGVwc2lsb24pIHsKKyAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGxvbmcgZ2V0RXBzaWxvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXBzaWxvbjsKKyAgICB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxNZXRhZGF0YVRpbWVFdmVudD4gZmlsdGVyKExpc3Q8TWV0YWRhdGFUaW1lRXZlbnQ+IGV2ZW50cykgeworCQlUaW1lRXZlbnRXZWlnaHRlZEhhc2ggdGltZUV2ZW50SGFzaCA9IFRpbWVFdmVudFdlaWdodGVkSGFzaC5idWlsZEhhc2goZXZlbnRzLCB0aGlzLmVwc2lsb24pOworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdDxNZXRhZGF0YVRpbWVFdmVudD4pIHRpbWVFdmVudEhhc2guZ2V0R3JlYXRlc3RXZWlnaHRlZFBhdGhBc09yZGVyZWRMaXN0KCkpOworCX0KKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9NZXRhZGF0YVRpbWVFdmVudFF1ZXJ5RmlsdGVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL3RpbWUvTWV0YWRhdGFUaW1lRXZlbnRRdWVyeUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Y2FmMDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL3RpbWUvTWV0YWRhdGFUaW1lRXZlbnRRdWVyeUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LmZpbHRlci50aW1lOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuZmlsdGVyLlF1ZXJ5RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5maWx0ZXIudGltZS5jb252LkFzY2lpU29ydGFibGVWZXJzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5maWx0ZXIudGltZS5jb252LlZlcnNpb25Db252ZXJ0ZXI7CisKKy8vT09EVCBpbXBvcnRzCisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIHF1ZXJ5IGZpbHRlciB0aGF0IGFsbG93cyB1c2VyIHRvIGZpbHRlciByZXN1bHRzIGluIGEgY29tcGxleCBxdWVyeQorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YVRpbWVFdmVudFF1ZXJ5RmlsdGVyIGV4dGVuZHMgUXVlcnlGaWx0ZXI8TWV0YWRhdGFUaW1lRXZlbnQ+IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YXJ0RGF0ZVRpbWVNZXRLZXksIGVuZERhdGVUaW1lTWV0S2V5LCBwcmlvcml0eU1ldEtleTsKKyAgICBwcml2YXRlIFZlcnNpb25Db252ZXJ0ZXIgY29udmVydGVyOworCisgICAgcHVibGljIE1ldGFkYXRhVGltZUV2ZW50UXVlcnlGaWx0ZXIoKSB7CisgICAgCXN1cGVyKCk7CisgICAgICAgIHRoaXMuY29udmVydGVyID0gbmV3IEFzY2lpU29ydGFibGVWZXJzaW9uQ29udmVydGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGFydERhdGVUaW1lTWV0S2V5KCkgeworICAgICAgICByZXR1cm4gc3RhcnREYXRlVGltZU1ldEtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERhdGVUaW1lTWV0S2V5KFN0cmluZyBzdGFydERhdGVUaW1lTWV0S2V5KSB7CisgICAgICAgIHRoaXMuc3RhcnREYXRlVGltZU1ldEtleSA9IHN0YXJ0RGF0ZVRpbWVNZXRLZXk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbmREYXRlVGltZU1ldEtleSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZERhdGVUaW1lTWV0S2V5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZERhdGVUaW1lTWV0S2V5KFN0cmluZyBlbmREYXRlVGltZU1ldEtleSkgeworICAgICAgICB0aGlzLmVuZERhdGVUaW1lTWV0S2V5ID0gZW5kRGF0ZVRpbWVNZXRLZXk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmlvcml0eU1ldEtleSgpIHsKKyAgICAgICAgcmV0dXJuIHByaW9yaXR5TWV0S2V5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW9yaXR5TWV0S2V5KFN0cmluZyBwcmlvcml0eU1ldEtleSkgeworICAgICAgICB0aGlzLnByaW9yaXR5TWV0S2V5ID0gcHJpb3JpdHlNZXRLZXk7CisgICAgfQorCisgICAgcHVibGljIFZlcnNpb25Db252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgeworICAgICAgICByZXR1cm4gY29udmVydGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihWZXJzaW9uQ29udmVydGVyIGNvbnZlcnRlcikgeworICAgICAgICBpZiAoY29udmVydGVyICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKKyAgICB9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGlzdDxNZXRhZGF0YVRpbWVFdmVudD4gbWV0YWRhdGFUb0ZpbHRlclR5cGUoTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IG1ldGFkYXRhTGlzdCkgeworCQlMaXN0PE1ldGFkYXRhVGltZUV2ZW50PiB0aW1lRXZlbnRzID0gbmV3IFZlY3RvcjxNZXRhZGF0YVRpbWVFdmVudD4oKTsKKwkJZm9yIChUcmFuc2FjdGlvbmFsTWV0YWRhdGEgdHJhbnNhY3Rpb25hbE1ldGFkYXRhIDogbWV0YWRhdGFMaXN0KSB7CisJCQlkb3VibGUgcHJpb3JpdHkgPSAwOworCQkJaWYgKHRoaXMuZ2V0UHJpb3JpdHlNZXRLZXkoKSAhPSBudWxsKQorCQkJCXByaW9yaXR5ID0gRG91YmxlLnBhcnNlRG91YmxlKHRyYW5zYWN0aW9uYWxNZXRhZGF0YS5nZXRNZXRhZGF0YSgpLmdldE1ldGFkYXRhKHRoaXMucHJpb3JpdHlNZXRLZXkpKTsKKwkJCWxvbmcgc3RhcnRUaW1lID0gTG9uZy5wYXJzZUxvbmcodHJhbnNhY3Rpb25hbE1ldGFkYXRhLmdldE1ldGFkYXRhKCkuZ2V0TWV0YWRhdGEodGhpcy5zdGFydERhdGVUaW1lTWV0S2V5KSk7CisJCQlTdHJpbmcgZW5kVGltZVN0cmluZyA9IHRyYW5zYWN0aW9uYWxNZXRhZGF0YS5nZXRNZXRhZGF0YSgpLmdldE1ldGFkYXRhKHRoaXMuZW5kRGF0ZVRpbWVNZXRLZXkpOworCQkJbG9uZyBlbmRUaW1lID0gc3RhcnRUaW1lOworCQkJaWYgKGVuZFRpbWVTdHJpbmcgIT0gbnVsbCkKKwkJCQllbmRUaW1lID0gTG9uZy5wYXJzZUxvbmcoZW5kVGltZVN0cmluZyk7CisJCQl0aW1lRXZlbnRzLmFkZChuZXcgTWV0YWRhdGFUaW1lRXZlbnQoc3RhcnRUaW1lLCBlbmRUaW1lLCBwcmlvcml0eSwgdHJhbnNhY3Rpb25hbE1ldGFkYXRhKSk7CisJCX0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGltZUV2ZW50cyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBmaWx0ZXJUeXBlVG9NZXRhZGF0YShMaXN0PE1ldGFkYXRhVGltZUV2ZW50PiBmaWx0ZXJPYmplY3RzKSB7CisJCUxpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YUxpc3QgPSBuZXcgVmVjdG9yPFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4oKTsKKwkJZm9yIChNZXRhZGF0YVRpbWVFdmVudCB0aW1lRXZlbnQgOiBmaWx0ZXJPYmplY3RzKQorCQkJbWV0YWRhdGFMaXN0LmFkZCh0aW1lRXZlbnQuZ2V0VGltZU9iamVjdCgpKTsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobWV0YWRhdGFMaXN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9jb252L0FzY2lpU29ydGFibGVWZXJzaW9uQ29udmVydGVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL3RpbWUvY29udi9Bc2NpaVNvcnRhYmxlVmVyc2lvbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjg5MzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL3RpbWUvY29udi9Bc2NpaVNvcnRhYmxlVmVyc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuZmlsdGVyLnRpbWUuY29udjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQ29udmVydHMgYSBhc2NpaSBzb3J0YWJsZSBTdHJpbmcgdmVyc2lvbiBpbnRvIGEgcHJpb3JpdHkgbnVtYmVyCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIEFzY2lpU29ydGFibGVWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgVmVyc2lvbkNvbnZlcnRlciB7CisKKyAgICBwdWJsaWMgZG91YmxlIGNvbnZlcnRUb1ByaW9yaXR5KFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG91YmxlIHByaW9yaXR5ID0gMDsKKyAgICAgICAgY2hhcltdIHZlcnNpb25DaGFyQXJyYXkgPSB2ZXJzaW9uLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gdmVyc2lvbkNoYXJBcnJheS5sZW5ndGggLSAxOyBpIDwgdmVyc2lvbkNoYXJBcnJheS5sZW5ndGg7IGkrKywgai0tKQorICAgICAgICAgICAgcHJpb3JpdHkgKz0gKCgoaW50KSB2ZXJzaW9uQ2hhckFycmF5W2ldKSAqIE1hdGgucG93KDEwLCBqKSk7CisgICAgICAgIHJldHVybiBwcmlvcml0eTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL3RpbWUvY29udi9WZXJzaW9uQ29udmVydGVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvZmlsdGVyL3RpbWUvY29udi9WZXJzaW9uQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMjMxNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9maWx0ZXIvdGltZS9jb252L1ZlcnNpb25Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LmZpbHRlci50aW1lLmNvbnY7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEFuIGludGVyZmFjZSBmb3IgY29udmVydGluZyBhIFN0cmluZyB2ZXJzaW9uIGludG8gYSBwcmlvcml0eSBudW1iZXIKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFZlcnNpb25Db252ZXJ0ZXIgeworCisgICAgcHVibGljIGRvdWJsZSBjb252ZXJ0VG9Qcmlvcml0eShTdHJpbmcgdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvSkpUUXVlcnlQYXJzZXJTdGF0ZS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9KSlRRdWVyeVBhcnNlclN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YjBhMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvSkpUUXVlcnlQYXJzZXJTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpKVFF1ZXJ5UGFyc2VyU3RhdGUuamF2YSBWZXJzaW9uIDUuMCAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyOworCitwdWJsaWMgY2xhc3MgSkpUUXVlcnlQYXJzZXJTdGF0ZSB7CisgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8Tm9kZT4gbm9kZXM7CisgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8SW50ZWdlcj4gbWFya3M7CisKKyAgcHJpdmF0ZSBpbnQgc3A7ICAgICAgICAvLyBudW1iZXIgb2Ygbm9kZXMgb24gc3RhY2sKKyAgcHJpdmF0ZSBpbnQgbWs7ICAgICAgICAvLyBjdXJyZW50IG1hcmsKKyAgcHJpdmF0ZSBib29sZWFuIG5vZGVfY3JlYXRlZDsKKworICBwdWJsaWMgSkpUUXVlcnlQYXJzZXJTdGF0ZSgpIHsKKyAgICBub2RlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgbWFya3MgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgIHNwID0gMDsKKyAgICBtayA9IDA7CisgIH0KKworICAvKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgbm9kZSB3YXMgYWN0dWFsbHkgY2xvc2VkIGFuZAorICAgICBwdXNoZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgZmluYWwgdXNlciBhY3Rpb24gb2YgYQorICAgICBub2RlIHNjb3BlLiAgKi8KKyAgcHVibGljIGJvb2xlYW4gbm9kZUNyZWF0ZWQoKSB7CisgICAgcmV0dXJuIG5vZGVfY3JlYXRlZDsKKyAgfQorCisgIC8qIENhbGwgdGhpcyB0byByZWluaXRpYWxpemUgdGhlIG5vZGUgc3RhY2suICBJdCBpcyBjYWxsZWQKKyAgICAgYXV0b21hdGljYWxseSBieSB0aGUgcGFyc2VyJ3MgUmVJbml0KCkgbWV0aG9kLiAqLworICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICBub2Rlcy5jbGVhcigpOworICAgIG1hcmtzLmNsZWFyKCk7CisgICAgc3AgPSAwOworICAgIG1rID0gMDsKKyAgfQorCisgIC8qIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgQVNULiAgSXQgb25seSBtYWtlcyBzZW5zZSB0byBjYWxsCisgICAgIHRoaXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhcnNlLiAqLworICBwdWJsaWMgTm9kZSByb290Tm9kZSgpIHsKKyAgICByZXR1cm4gbm9kZXMuZ2V0KDApOworICB9CisKKyAgLyogUHVzaGVzIGEgbm9kZSBvbiB0byB0aGUgc3RhY2suICovCisgIHB1YmxpYyB2b2lkIHB1c2hOb2RlKE5vZGUgbikgeworICAgIG5vZGVzLmFkZChuKTsKKyAgICArK3NwOworICB9CisKKyAgLyogUmV0dXJucyB0aGUgbm9kZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZQorICAgICBzdGFjay4gICovCisgIHB1YmxpYyBOb2RlIHBvcE5vZGUoKSB7CisgICAgaWYgKC0tc3AgPCBtaykgeworICAgICAgbWsgPSBtYXJrcy5yZW1vdmUobWFya3Muc2l6ZSgpLTEpOworICAgIH0KKyAgICByZXR1cm4gbm9kZXMucmVtb3ZlKG5vZGVzLnNpemUoKS0xKTsKKyAgfQorCisgIC8qIFJldHVybnMgdGhlIG5vZGUgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLworICBwdWJsaWMgTm9kZSBwZWVrTm9kZSgpIHsKKyAgICByZXR1cm4gbm9kZXMuZ2V0KG5vZGVzLnNpemUoKS0xKTsKKyAgfQorCisgIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvbiB0aGUgc3RhY2sgaW4gdGhlIGN1cnJlbnQgbm9kZQorICAgICBzY29wZS4gKi8KKyAgcHVibGljIGludCBub2RlQXJpdHkoKSB7CisgICAgcmV0dXJuIHNwIC0gbWs7CisgIH0KKworCisgIHB1YmxpYyB2b2lkIGNsZWFyTm9kZVNjb3BlKE5vZGUgbikgeworICAgIHdoaWxlIChzcCA+IG1rKSB7CisgICAgICBwb3BOb2RlKCk7CisgICAgfQorICAgIG1rID0gbWFya3MucmVtb3ZlKG1hcmtzLnNpemUoKS0xKTsKKyAgfQorCisKKyAgcHVibGljIHZvaWQgb3Blbk5vZGVTY29wZShOb2RlIG4pIHsKKyAgICBtYXJrcy5hZGQobWspOworICAgIG1rID0gc3A7CisgICAgbi5qanRPcGVuKCk7CisgIH0KKworCisgIC8qIEEgZGVmaW5pdGUgbm9kZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICBjaGlsZHJlbi4gIFRoYXQgbnVtYmVyIG9mIG5vZGVzIGFyZSBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYW5kCisgICAgIG1hZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWZpbml0ZSBub2RlLiAgVGhlbiB0aGUgZGVmaW5pdGUgbm9kZQorICAgICBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrLiAqLworICBwdWJsaWMgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGludCBudW0pIHsKKyAgICBtayA9IG1hcmtzLnJlbW92ZShtYXJrcy5zaXplKCktMSk7CisgICAgd2hpbGUgKG51bS0tID4gMCkgeworICAgICAgTm9kZSBjID0gcG9wTm9kZSgpOworICAgICAgYy5qanRTZXRQYXJlbnQobik7CisgICAgICBuLmpqdEFkZENoaWxkKGMsIG51bSk7CisgICAgfQorICAgIG4uamp0Q2xvc2UoKTsKKyAgICBwdXNoTm9kZShuKTsKKyAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOworICB9CisKKworICAvKiBBIGNvbmRpdGlvbmFsIG5vZGUgaXMgY29uc3RydWN0ZWQgaWYgaXRzIGNvbmRpdGlvbiBpcyB0cnVlLiAgQWxsCisgICAgIHRoZSBub2RlcyB0aGF0IGhhdmUgYmVlbiBwdXNoZWQgc2luY2UgdGhlIG5vZGUgd2FzIG9wZW5lZCBhcmUKKyAgICAgbWFkZSBjaGlsZHJlbiBvZiB0aGUgY29uZGl0aW9uYWwgbm9kZSwgd2hpY2ggaXMgdGhlbiBwdXNoZWQKKyAgICAgb24gdG8gdGhlIHN0YWNrLiAgSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbm9kZSBpcyBub3QKKyAgICAgY29uc3RydWN0ZWQgYW5kIHRoZXkgYXJlIGxlZnQgb24gdGhlIHN0YWNrLiAqLworICBwdWJsaWMgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGJvb2xlYW4gY29uZGl0aW9uKSB7CisgICAgaWYgKGNvbmRpdGlvbikgeworICAgICAgaW50IGEgPSBub2RlQXJpdHkoKTsKKyAgICAgIG1rID0gbWFya3MucmVtb3ZlKG1hcmtzLnNpemUoKS0xKTsKKyAgICAgIHdoaWxlIChhLS0gPiAwKSB7CisgICAgICAgIE5vZGUgYyA9IHBvcE5vZGUoKTsKKyAgICAgICAgYy5qanRTZXRQYXJlbnQobik7CisgICAgICAgIG4uamp0QWRkQ2hpbGQoYywgYSk7CisgICAgICB9CisgICAgICBuLmpqdENsb3NlKCk7CisgICAgICBwdXNoTm9kZShuKTsKKyAgICAgIG5vZGVfY3JlYXRlZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1rID0gbWFya3MucmVtb3ZlKG1hcmtzLnNpemUoKS0xKTsKKyAgICAgIG5vZGVfY3JlYXRlZCA9IGZhbHNlOworICAgIH0KKyAgfQorfQorLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT1hMjI1YWQzYTVjNDg1N2U5ZjY0MzkyZTQ3ZDZhY2ZiOCAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9Ob2RlLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTcxMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9Ob2RlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBOb2RlLmphdmEgVmVyc2lvbiA0LjMgKi8KKy8qIEphdmFDQ09wdGlvbnM6TVVMVEk9ZmFsc2UsTk9ERV9VU0VTX1BBUlNFUj1mYWxzZSxWSVNJVE9SPWZhbHNlLFRSQUNLX1RPS0VOUz1mYWxzZSxOT0RFX1BSRUZJWD1BU1QsTk9ERV9FWFRFTkRTPSxOT0RFX0ZBQ1RPUlk9LFNVUFBPUlRfQ0xBU1NfVklTSUJJTElUWV9QVUJMSUM9dHJ1ZSAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyOworCisvKiBBbGwgQVNUIG5vZGVzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYmFzaWMKKyAgIG1hY2hpbmVyeSBmb3IgY29uc3RydWN0aW5nIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHJlbGF0aW9uc2hpcHMKKyAgIGJldHdlZW4gbm9kZXMuICovCisKK3B1YmxpYworaW50ZXJmYWNlIE5vZGUgeworCisgIC8qKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIG5vZGUgaGFzIGJlZW4gbWFkZSB0aGUgY3VycmVudAorICAgIG5vZGUuICBJdCBpbmRpY2F0ZXMgdGhhdCBjaGlsZCBub2RlcyBjYW4gbm93IGJlIGFkZGVkIHRvIGl0LiAqLworICBwdWJsaWMgdm9pZCBqanRPcGVuKCk7CisKKyAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGNoaWxkIG5vZGVzIGhhdmUgYmVlbgorICAgIGFkZGVkLiAqLworICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpOworCisgIC8qKiBUaGlzIHBhaXIgb2YgbWV0aG9kcyBhcmUgdXNlZCB0byBpbmZvcm0gdGhlIG5vZGUgb2YgaXRzCisgICAgcGFyZW50LiAqLworICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBuKTsKKyAgcHVibGljIE5vZGUgamp0R2V0UGFyZW50KCk7CisKKyAgLyoqIFRoaXMgbWV0aG9kIHRlbGxzIHRoZSBub2RlIHRvIGFkZCBpdHMgYXJndW1lbnQgdG8gdGhlIG5vZGUncworICAgIGxpc3Qgb2YgY2hpbGRyZW4uICAqLworICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKTsKKworICAvKiogVGhpcyBtZXRob2QgcmV0dXJucyBhIGNoaWxkIG5vZGUuICBUaGUgY2hpbGRyZW4gYXJlIG51bWJlcmVkCisgICAgIGZyb20gemVybywgbGVmdCB0byByaWdodC4gKi8KKyAgcHVibGljIE5vZGUgamp0R2V0Q2hpbGQoaW50IGkpOworCisgIC8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGUgbm9kZSBoYXMuICovCisgIHB1YmxpYyBpbnQgamp0R2V0TnVtQ2hpbGRyZW4oKTsKK30KKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09ZDgwM2I5OWI5ZGJlOWY0ODU2ODcxMWRkYmE1OThkMWQgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNiMzBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFBhcnNlRXhjZXB0aW9uLmphdmEgVmVyc2lvbiA1LjAgKi8KKy8qIEphdmFDQ09wdGlvbnM6S0VFUF9MSU5FX0NPTD1udWxsICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5wYXJzZXI7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KKyAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5CisgKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCisgKiBwYXJzZXIuCisgKgorICogWW91IGNhbiBtb2RpZnkgdGhpcyBjbGFzcyB0byBjdXN0b21pemUgeW91ciBlcnJvciByZXBvcnRpbmcKKyAqIG1lY2hhbmlzbXMgc28gbG9uZyBhcyB5b3UgcmV0YWluIHRoZSBwdWJsaWMgZmllbGRzLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgIC8qKgorICAgKiBUaGUgdmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIFNlcmlhbGl6YWJsZSBjbGFzcy4KKyAgICogSW5jcmVtZW50IG9ubHkgaWYgdGhlIDxpPnNlcmlhbGl6ZWQ8L2k+IGZvcm0gb2YgdGhlCisgICAqIGNsYXNzIGNoYW5nZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4KKyAgICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCisgICAgICAgICAgICAgICAgICAgICAgICkKKyAgeworICAgIHN1cGVyKGluaXRpYWxpc2UoY3VycmVudFRva2VuVmFsLCBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLCB0b2tlbkltYWdlVmFsKSk7CisgICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOworICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOworICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKKyAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcworICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcworICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KKyAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQorICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCisgICAqLworCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yIHdpdGggbWVzc2FnZS4gKi8KKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKKyAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCisgICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCisgICAqLworICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOworCisgIC8qKgorICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5CisgICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKKyAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgorICAgKi8KKyAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKKyAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCisgICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7CisKKyAgLyoqCisgICAqIEl0IHVzZXMgImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCisgICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCisgICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KKyAgICogZnJvbSB0aGUgcGFyc2VyKSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCisgICAqIGdldHMgZGlzcGxheWVkLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGluaXRpYWxpc2UoVG9rZW4gY3VycmVudFRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZSkgeworICAgIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoJyAnKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9ICIgIiArIHRva2VuSW1hZ2VbdG9rLmtpbmRdOworICAgICAgcmV0dmFsICs9ICIgXCIiOworICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICByZXR2YWwgKz0gIiBcIiI7CisgICAgICB0b2sgPSB0b2submV4dDsKKyAgICB9CisgICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOworICAgIHJldHZhbCArPSAiLiIgKyBlb2w7CisgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7CisgICAgfQorICAgIHJldHZhbCArPSBleHBlY3RlZC50b1N0cmluZygpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisKKyAgLyoqCisgICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KKyAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCisgICAqIHN0cmluZyBsaXRlcmFsLgorICAgKi8KKyAgc3RhdGljIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworfQorLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT0yZGM5NGVjNmU2YzRiZTUyZTMzMzg5MWIyMjBiOGVmMSAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9RdWVyeVBhcnNlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9RdWVyeVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzA4MTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1F1ZXJ5UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMDIyIEBACisvKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBRdWVyeVBhcnNlci5qYXZhICovCisgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlcjsKKworICAgICAgICBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKyAgICAgICAgaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CisgICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlMb2dpY2FsR3JvdXA7CisgICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuU3RkUXVlcnlFeHByZXNzaW9uOworICAgICAgICBpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LkNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb247CisgICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuQ3VzdG9tUXVlcnlFeHByZXNzaW9uOworICAgICAgICBpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybTsKKworICAgIHB1YmxpYyBjbGFzcyBRdWVyeVBhcnNlci8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBRdWVyeVBhcnNlclRyZWVDb25zdGFudHMsIFF1ZXJ5UGFyc2VyQ29uc3RhbnRzIHsvKkBiZ2VuKGpqdHJlZSkqLworICBwcm90ZWN0ZWQgSkpUUXVlcnlQYXJzZXJTdGF0ZSBqanRyZWUgPSBuZXcgSkpUUXVlcnlQYXJzZXJTdGF0ZSgpOworICAgICAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5RXhwcmVzc2lvbiBwYXJzZVF1ZXJ5RXhwcmVzc2lvbihTdHJpbmcgcXVlcnlFeHByZXNzaW9uU3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIFRva2VuTWdyRXJyb3IgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHF1ZXJ5RXhwcmVzc2lvblN0cmluZy5nZXRCeXRlcygpKSkucGFyc2VJbnB1dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIFRva2VuTWdyRXJyb3IgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgUXVlcnlQYXJzZXIoIFN5c3RlbS5pbiApLnBhcnNlSW5wdXQoKSk7CisgICAgICAgIH0KKworICBmaW5hbCBwdWJsaWMgUXVlcnlFeHByZXNzaW9uIHBhcnNlSW5wdXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworIC8qQGJnZW4oamp0cmVlKSBwYXJzZUlucHV0ICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVFBBUlNFSU5QVVQpOworICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOworICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTtRdWVyeUV4cHJlc3Npb24gcWUgPSBudWxsOworICAgIHRyeSB7CisgICAgICBxZSA9IFF1ZXJ5KG51bGwpOworICAgICAgampfY29uc3VtZV90b2tlbigwKTsKKyAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHFlO30KKyAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgeworICAgICAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7CisgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9CisgICAgICAgICAgfQorICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQorICAgIH0gZmluYWxseSB7CisgICAgICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUXVlcnlFeHByZXNzaW9uIFF1ZXJ5KFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworIC8qQGJnZW4oamp0cmVlKSBRdWVyeSAqLworICAgICAgICBTaW1wbGVOb2RlIGpqdG4wMDAgPSBuZXcgU2ltcGxlTm9kZShKSlRRVUVSWSk7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO1F1ZXJ5RXhwcmVzc2lvbiBxZTEgPSBudWxsOworICAgICAgICBRdWVyeUV4cHJlc3Npb24gcWUyID0gbnVsbDsKKyAgICAgICAgVG9rZW4gb3BlcmF0b3IgPSBudWxsOworICAgIHRyeSB7CisgICAgICBxZTEgPSBRdWVyeUV4cHJlc3Npb24oYnVja2V0TmFtZXMpOworICAgICAgbGFiZWxfMToKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChqal8yXzEoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgICA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBBTkQ6CisgICAgICAgICAgb3BlcmF0b3IgPSBqal9jb25zdW1lX3Rva2VuKEFORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1I6CisgICAgICAgICAgb3BlcmF0b3IgPSBqal9jb25zdW1lX3Rva2VuKE9SKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMF0gPSBqal9nZW47CisgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcWUyID0gUXVlcnkoYnVja2V0TmFtZXMpOworICAgICAgfQorICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICBpZiAocWUyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBxZTE7fQorICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgUXVlcnlMb2dpY2FsR3JvdXAgcXVlcnlMb2dpY2FsR3JvdXAgPSBuZXcgUXVlcnlMb2dpY2FsR3JvdXAoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVja2V0TmFtZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5TG9naWNhbEdyb3VwLnNldEJ1Y2tldE5hbWVzKG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpKTsKKyAgICAgICAgICAgICAgICBxdWVyeUxvZ2ljYWxHcm91cC5zZXRPcGVyYXRvcihRdWVyeUxvZ2ljYWxHcm91cC5PcGVyYXRvci52YWx1ZU9mKG9wZXJhdG9yLmltYWdlLnRyaW0oKS50b1VwcGVyQ2FzZSgpKSk7CisgICAgICAgICAgICAgICAgcXVlcnlMb2dpY2FsR3JvdXAuYWRkRXhwcmVzc2lvbihxZTEpOworICAgICAgICAgICAgICAgIHF1ZXJ5TG9naWNhbEdyb3VwLmFkZEV4cHJlc3Npb24ocWUyKTsKKyAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBxdWVyeUxvZ2ljYWxHcm91cDt9CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgeworICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOworICAgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBqanRyZWUucG9wTm9kZSgpOworICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9CisgICAgICB9CisgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7CisgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQorICAgICAgfQorICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBRdWVyeUV4cHJlc3Npb24gUXVlcnlFeHByZXNzaW9uKFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworIC8qQGJnZW4oamp0cmVlKSBRdWVyeUV4cHJlc3Npb24gKi8KKyAgICAgICAgU2ltcGxlTm9kZSBqanRuMDAwID0gbmV3IFNpbXBsZU5vZGUoSkpUUVVFUllFWFBSRVNTSU9OKTsKKyAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKKyAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7UXVlcnlFeHByZXNzaW9uIHFlID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgaWYgKGpqXzJfMigyMTQ3NDgzNjQ3KSkgeworICAgICAgICBxZSA9IFByaW9yaXR5UXVlcnlFeHByZXNzaW9uKGJ1Y2tldE5hbWVzKTsKKyAgICAgIH0gZWxzZSBpZiAoampfMl8zKDIxNDc0ODM2NDcpKSB7CisgICAgICAgIHFlID0gU3RkUXVlcnlFeHByZXNzaW9uKCk7CisgICAgICB9IGVsc2UgaWYgKGpqXzJfNCgyMTQ3NDgzNjQ3KSkgeworICAgICAgICBxZSA9IEN1c3RvbVF1ZXJ5RXhwcmVzc2lvbihidWNrZXROYW1lcyk7CisgICAgICB9IGVsc2UgaWYgKGpqXzJfNSgyMTQ3NDgzNjQ3KSkgeworICAgICAgICBxZSA9IENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24oYnVja2V0TmFtZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAge2lmICh0cnVlKSByZXR1cm4gcWU7fQorICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7CisgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7CisgICAgICB9CisgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9CisgICAgICB9CisgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFF1ZXJ5RXhwcmVzc2lvbiBTdGRRdWVyeUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworIC8qQGJnZW4oamp0cmVlKSBTdGRRdWVyeUV4cHJlc3Npb24gKi8KKyAgICAgICAgU2ltcGxlTm9kZSBqanRuMDAwID0gbmV3IFNpbXBsZU5vZGUoSkpUU1REUVVFUllFWFBSRVNTSU9OKTsKKyAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKKyAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7UXVlcnlFeHByZXNzaW9uIHFlID0gbnVsbDsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gYnVja2V0TmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICB0cnkgeworICAgICAgampfY29uc3VtZV90b2tlbihPUEVOX0JSQUNFUyk7CisgICAgICBsYWJlbF8yOgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgU1BBQ0U6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxXSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8yOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1BBQ0UpOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihCVUNLRVRfTkFNRV9LRVkpOworICAgICAgbGFiZWxfMzoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIFNQQUNFOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMl0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfMzsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNQQUNFKTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVFVQUxTKTsKKyAgICAgIGxhYmVsXzQ6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzNdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzQ7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihTUEFDRSk7CisgICAgICB9CisgICAgICBnZXRWYWx1ZXMoYnVja2V0TmFtZXMpOworICAgICAgbGFiZWxfNToKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIFNQQUNFOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNF0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfNTsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNQQUNFKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBTRU1JX0NPTE9OOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlfQ09MT04pOworICAgICAgICBsYWJlbF82OgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICAgIGNhc2UgU1BBQ0U6CisgICAgICAgICAgICA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzVdID0gampfZ2VuOworICAgICAgICAgICAgYnJlYWsgbGFiZWxfNjsKKyAgICAgICAgICB9CisgICAgICAgICAgampfY29uc3VtZV90b2tlbihTUEFDRSk7CisgICAgICAgIH0KKyAgICAgICAgcWUgPSBRdWVyeShidWNrZXROYW1lcyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzZdID0gampfZ2VuOworICAgICAgICA7CisgICAgICB9CisgICAgICBsYWJlbF83OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgU1BBQ0U6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVs3XSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF83OworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1BBQ0UpOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDTE9TRV9CUkFDRVMpOworICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICBpZiAocWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTdGRRdWVyeUV4cHJlc3Npb24obmV3IEhhc2hTZXQ8U3RyaW5nPihidWNrZXROYW1lcykpO30KKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHFlO30KKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7CisgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7CisgICAgICB9CisgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9CisgICAgICB9CisgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFF1ZXJ5RXhwcmVzc2lvbiBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uKFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworIC8qQGJnZW4oamp0cmVlKSBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVENPTVBBUklTT05RVUVSWUVYUFJFU1NJT04pOworICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOworICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0ZXJtTmFtZSA9IG51bGw7CisgICAgICAgIFRva2VuIG9wZXJhdG9yID0gbnVsbDsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgdHJ5IHsKKyAgICAgIHRlcm1OYW1lID0gampfY29uc3VtZV90b2tlbihURVJNKTsKKyAgICAgIGxhYmVsXzg6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzhdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzg7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihTUEFDRSk7CisgICAgICB9CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgRVE6CisgICAgICAgIG9wZXJhdG9yID0gampfY29uc3VtZV90b2tlbihFUSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHVDoKKyAgICAgICAgb3BlcmF0b3IgPSBqal9jb25zdW1lX3Rva2VuKEdUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdFOgorICAgICAgICBvcGVyYXRvciA9IGpqX2NvbnN1bWVfdG9rZW4oR0UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTFQ6CisgICAgICAgIG9wZXJhdG9yID0gampfY29uc3VtZV90b2tlbihMVCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMRToKKyAgICAgICAgb3BlcmF0b3IgPSBqal9jb25zdW1lX3Rva2VuKExFKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGxhYmVsXzk6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzEwXSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF85OworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1BBQ0UpOworICAgICAgfQorICAgICAgZ2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICAgIFRlcm0gdGVybSA9IG5ldyBUZXJtKHRlcm1OYW1lLmltYWdlKTsKKyAgICAgICAgdGVybS5zZXRWYWx1ZXModmFsdWVzKTsgLy9BcnJheXMuYXNMaXN0KHRlcm1WYWx1ZXMuaW1hZ2Uuc3BsaXQoIiwiKSkpOworICAgICAgICBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uIGNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24gPSBuZXcgQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbigpOworICAgICAgICBpZiAoYnVja2V0TmFtZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLnNldEJ1Y2tldE5hbWVzKG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpKTsKKyAgICAgICAgY29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5zZXRUZXJtKHRlcm0pOworICAgICAgICBjb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLnNldE9wZXJhdG9yKENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24uT3BlcmF0b3IuZ2V0T3BlcmF0b3JCeVNpZ24ob3BlcmF0b3IuaW1hZ2UpKTsKKyAgICAgICAge2lmICh0cnVlKSByZXR1cm4gY29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbjt9CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQorICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgIH0KKyAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQorICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUXVlcnlFeHByZXNzaW9uIFByaW9yaXR5UXVlcnlFeHByZXNzaW9uKFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworIC8qQGJnZW4oamp0cmVlKSBQcmlvcml0eVF1ZXJ5RXhwcmVzc2lvbiAqLworICAgICAgICBTaW1wbGVOb2RlIGpqdG4wMDAgPSBuZXcgU2ltcGxlTm9kZShKSlRQUklPUklUWVFVRVJZRVhQUkVTU0lPTik7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO1F1ZXJ5RXhwcmVzc2lvbiBxZSA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oT1BFTl9QQVJFTlMpOworICAgICAgcWUgPSBRdWVyeShidWNrZXROYW1lcyk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKENMT1NFX1BBUkVOUyk7CisgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICB7aWYgKHRydWUpIHJldHVybiBxZTt9CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQorICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgIH0KKyAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQorICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUXVlcnlFeHByZXNzaW9uIEN1c3RvbVF1ZXJ5RXhwcmVzc2lvbihWZWN0b3I8U3RyaW5nPiBidWNrZXROYW1lcykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAvKkBiZ2VuKGpqdHJlZSkgQ3VzdG9tUXVlcnlFeHByZXNzaW9uICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVENVU1RPTVFVRVJZRVhQUkVTU0lPTik7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIGN1c3RvbU5hbWVUb2tlbiA9IG51bGw7CisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgdHJ5IHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oT1BFTl9CUkFDRVMpOworICAgICAgbGFiZWxfMTA6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzExXSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8xMDsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNQQUNFKTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ1VTVE9NX05BTUVfS0VZKTsKKyAgICAgIGxhYmVsXzExOgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgU1BBQ0U6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMl0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTE7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihTUEFDRSk7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKEVRVUFMUyk7CisgICAgICBsYWJlbF8xMjoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIFNQQUNFOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTNdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzEyOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1BBQ0UpOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihRVU9URSk7CisgICAgICBjdXN0b21OYW1lVG9rZW4gPSBqal9jb25zdW1lX3Rva2VuKFRFUk0pOworICAgICAgampfY29uc3VtZV90b2tlbihRVU9URSk7CisgICAgICBpZiAoampfMl82KDIxNDc0ODM2NDcpKSB7CisgICAgICAgIGxhYmVsXzEzOgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICAgIGNhc2UgU1BBQ0U6CisgICAgICAgICAgICA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzE0XSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGJyZWFrIGxhYmVsXzEzOworICAgICAgICAgIH0KKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlfQ09MT04pOworICAgICAgICBnZXRQcm9wZXJ0aWVzKHApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgOworICAgICAgfQorICAgICAgbGFiZWxfMTQ6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8xNDsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNQQUNFKTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0xPU0VfQlJBQ0VTKTsKKyAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICAgICAgICAgIEN1c3RvbVF1ZXJ5RXhwcmVzc2lvbiBjcWUgPSBuZXcgQ3VzdG9tUXVlcnlFeHByZXNzaW9uKGN1c3RvbU5hbWVUb2tlbi5pbWFnZSwgcCk7CisgICAgICAgIGlmIChidWNrZXROYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNxZS5zZXRCdWNrZXROYW1lcyhuZXcgSGFzaFNldDxTdHJpbmc+KGJ1Y2tldE5hbWVzKSk7CisgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGNxZTt9CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOworICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQorICAgICAgICAgIH0KKyAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KKyAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIHZvaWQgZ2V0VmFsdWVzKFZlY3RvcjxTdHJpbmc+IHZhbHVlcykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAvKkBiZ2VuKGpqdHJlZSkgZ2V0VmFsdWVzICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVEdFVFZBTFVFUyk7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHZhbHVlID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgdmFsdWUgPSBqal9jb25zdW1lX3Rva2VuKFZBTFVFKTsKKyAgICAgIGxhYmVsXzE1OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGpqXzJfNygyMTQ3NDgzNjQ3KSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF8xNTsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgICAgZ2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICB9CisgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKDAsIHZhbHVlLmltYWdlLnJlcGxhY2VBbGwoIiciLCAiIikpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7CisgICAgICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgICAgICB9CisgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIH0KKyAgICB9CisgIH0KKworICBmaW5hbCBwdWJsaWMgdm9pZCBnZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAvKkBiZ2VuKGpqdHJlZSkgZ2V0UHJvcGVydGllcyAqLworICAgICAgICBTaW1wbGVOb2RlIGpqdG4wMDAgPSBuZXcgU2ltcGxlTm9kZShKSlRHRVRQUk9QRVJUSUVTKTsKKyAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKKyAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gcHJvcGVydHlLZXkgPSBudWxsOworICAgICAgICBUb2tlbiBwcm9wZXJ0eVZhbCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHByb3BlcnR5S2V5ID0gampfY29uc3VtZV90b2tlbihQX0tFWSk7CisgICAgICBsYWJlbF8xNjoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIFNQQUNFOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTZdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzE2OworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1BBQ0UpOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihFUVVBTFMpOworICAgICAgbGFiZWxfMTc6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzE3XSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8xNzsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNQQUNFKTsKKyAgICAgIH0KKyAgICAgIHByb3BlcnR5VmFsID0gampfY29uc3VtZV90b2tlbihWQUxVRSk7CisgICAgICBsYWJlbF8xODoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChqal8yXzgoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgICA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTg7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICAgIGdldFByb3BlcnRpZXMocCk7CisgICAgICB9CisgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwLnB1dChwcm9wZXJ0eUtleS5pbWFnZS5zdWJzdHJpbmcoMiksIHByb3BlcnR5VmFsLmltYWdlLnJlcGxhY2VBbGwoIiciLCAiIikpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7CisgICAgICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KKyAgICAgICAgICB9CisgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIH0KKyAgICB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDAsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDMsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl83KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDYsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM184KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfOCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oT1BFTl9CUkFDRVMpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfc2Nhbl90b2tlbig0KSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihCVUNLRVRfTkFNRV9LRVkpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE9QRU5fUEFSRU5TKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzEoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oNSkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDYpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihURVJNKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfc2Nhbl90b2tlbig0KSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JX0NPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihPUEVOX0JSQUNFUykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal9zY2FuX3Rva2VuKDQpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKENVU1RPTV9OQU1FX0tFWSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBRdWVyeVBhcnNlclRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7CisgIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOworICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OworICBwcml2YXRlIGludCBqal9udGs7CisgIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKKyAgcHJpdmF0ZSBpbnQgampfbGE7CisgIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gampfc2VtTEE7CisgIHByaXZhdGUgaW50IGpqX2dlbjsKKyAgZmluYWwgcHJpdmF0ZSBpbnRbXSBqal9sYTEgPSBuZXcgaW50WzE4XTsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzA7CisgIHN0YXRpYyB7CisgICAgICBqal9sYTFfMCgpOworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMCgpIHsKKyAgICAgIGpqX2xhMV8wID0gbmV3IGludFtdIHsweDYwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDIwMCwweDEwLDB4MTAsMHg3YzAwMDAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLH07CisgICB9CisgIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzhdOworICBwcml2YXRlIGJvb2xlYW4gampfcmVzY2FuID0gZmFsc2U7CisgIHByaXZhdGUgaW50IGpqX2djID0gMDsKKworICBwdWJsaWMgUXVlcnlQYXJzZXIoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgdGhpcyhzdHJlYW0sIG51bGwpOworICB9CisgIHB1YmxpYyBRdWVyeVBhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KKyAgICB0b2tlbl9zb3VyY2UgPSBuZXcgUXVlcnlQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxODsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICBSZUluaXQoc3RyZWFtLCBudWxsKTsKKyAgfQorICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgeworICAgIHRyeSB7IGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KKyAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqanRyZWUucmVzZXQoKTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTg7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICBwdWJsaWMgUXVlcnlQYXJzZXIoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7CisgICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKKyAgICB0b2tlbl9zb3VyY2UgPSBuZXcgUXVlcnlQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxODsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKKyAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7CisgICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgamp0cmVlLnJlc2V0KCk7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE4OyBpKyspIGpqX2xhMVtpXSA9IC0xOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOworICB9CisKKyAgcHVibGljIFF1ZXJ5UGFyc2VyKFF1ZXJ5UGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7CisgICAgdG9rZW5fc291cmNlID0gdG07CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTg7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoUXVlcnlQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqdHJlZS5yZXNldCgpOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxODsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBUb2tlbiBvbGRUb2tlbjsKKyAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKKyAgICAgIGpqX2dlbisrOworICAgICAgaWYgKCsrampfZ2MgPiAxMDApIHsKKyAgICAgICAgampfZ2MgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIEpKQ2FsbHMgYyA9IGpqXzJfcnRuc1tpXTsKKyAgICAgICAgICB3aGlsZSAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoYy5nZW4gPCBqal9nZW4pIGMuZmlyc3QgPSBudWxsOworICAgICAgICAgICAgYyA9IGMubmV4dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgdG9rZW4gPSBvbGRUb2tlbjsKKyAgICBqal9raW5kID0ga2luZDsKKyAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7CisgIH0KKworICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfQorICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgeworICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKKyAgICAgIGpqX2xhLS07CisgICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKKyAgICB9CisgICAgaWYgKGpqX3Jlc2NhbikgeworICAgICAgaW50IGkgPSAwOyBUb2tlbiB0b2sgPSB0b2tlbjsKKyAgICAgIHdoaWxlICh0b2sgIT0gbnVsbCAmJiB0b2sgIT0gampfc2NhbnBvcykgeyBpKys7IHRvayA9IHRvay5uZXh0OyB9CisgICAgICBpZiAodG9rICE9IG51bGwpIGpqX2FkZF9lcnJvcl90b2tlbihraW5kLCBpKTsKKyAgICB9CisgICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7CisgICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbisrOworICAgIHJldHVybiB0b2tlbjsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKKyAgICBUb2tlbiB0ID0gbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OworICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgaW50IGpqX250aygpIHsKKyAgICBpZiAoKGpqX250PXRva2VuLm5leHQpID09IG51bGwpCisgICAgICByZXR1cm4gKGpqX250ayA9ICh0b2tlbi5uZXh0PXRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKSkua2luZCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChqal9udGsgPSBqal9udC5raW5kKTsKKyAgfQorCisgIHByaXZhdGUgamF2YS51dGlsLlZlY3RvcjxpbnRbXT4gampfZXhwZW50cmllcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yPGludFtdPigpOworICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OworICBwcml2YXRlIGludCBqal9raW5kID0gLTE7CisgIHByaXZhdGUgaW50W10gampfbGFzdHRva2VucyA9IG5ldyBpbnRbMTAwXTsKKyAgcHJpdmF0ZSBpbnQgampfZW5kcG9zOworCisgIHByaXZhdGUgdm9pZCBqal9hZGRfZXJyb3JfdG9rZW4oaW50IGtpbmQsIGludCBwb3MpIHsKKyAgICBpZiAocG9zID49IDEwMCkgcmV0dXJuOworICAgIGlmIChwb3MgPT0gampfZW5kcG9zICsgMSkgeworICAgICAgampfbGFzdHRva2Vuc1tqal9lbmRwb3MrK10gPSBraW5kOworICAgIH0gZWxzZSBpZiAoampfZW5kcG9zICE9IDApIHsKKyAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFtqal9lbmRwb3NdOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9lbmRwb3M7IGkrKykgeworICAgICAgICBqal9leHBlbnRyeVtpXSA9IGpqX2xhc3R0b2tlbnNbaV07CisgICAgICB9CisgICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOworICAgICAgZm9yIChqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGpqX2V4cGVudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgaW50W10gb2xkZW50cnkgPSAoaW50W10pKGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIGlmIChvbGRlbnRyeS5sZW5ndGggPT0gampfZXhwZW50cnkubGVuZ3RoKSB7CisgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJ5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAob2xkZW50cnlbaV0gIT0gampfZXhwZW50cnlbaV0pIHsKKyAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFleGlzdHMpIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7CisgICAgICBpZiAocG9zICE9IDApIGpqX2xhc3R0b2tlbnNbKGpqX2VuZHBvcyA9IHBvcykgLSAxXSA9IGtpbmQ7CisgICAgfQorICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKSB7CisgICAgampfZXhwZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgIGJvb2xlYW5bXSBsYTF0b2tlbnMgPSBuZXcgYm9vbGVhblsyOF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyODsgaSsrKSB7CisgICAgICBsYTF0b2tlbnNbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGpqX2tpbmQgPj0gMCkgeworICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKKyAgICAgIGpqX2tpbmQgPSAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxODsgaSsrKSB7CisgICAgICBpZiAoampfbGExW2ldID09IGpqX2dlbikgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyBqKyspIHsKKyAgICAgICAgICBpZiAoKGpqX2xhMV8wW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbal0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI4OyBpKyspIHsKKyAgICAgIGlmIChsYTF0b2tlbnNbaV0pIHsKKyAgICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50WzFdOworICAgICAgICBqal9leHBlbnRyeVswXSA9IGk7CisgICAgICAgIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7CisgICAgICB9CisgICAgfQorICAgIGpqX2VuZHBvcyA9IDA7CisgICAgampfcmVzY2FuX3Rva2VuKCk7CisgICAgampfYWRkX2Vycm9yX3Rva2VuKDAsIDApOworICAgIGludFtdW10gZXhwdG9rc2VxID0gbmV3IGludFtqal9leHBlbnRyaWVzLnNpemUoKV1bXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGV4cHRva3NlcVtpXSA9IGpqX2V4cGVudHJpZXMuZWxlbWVudEF0KGkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuLCBleHB0b2tzZXEsIHRva2VuSW1hZ2UpOworICB9CisKKyAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7CisgIH0KKworICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7CisgIH0KKworICBmaW5hbCBwcml2YXRlIHZvaWQgampfcmVzY2FuX3Rva2VuKCkgeworICAgIGpqX3Jlc2NhbiA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICB0cnkgeworICAgICAgSkpDYWxscyBwID0gampfMl9ydG5zW2ldOworICAgICAgZG8geworICAgICAgICBpZiAocC5nZW4gPiBqal9nZW4pIHsKKyAgICAgICAgICBqal9sYSA9IHAuYXJnOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHAuZmlyc3Q7CisgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICBjYXNlIDA6IGpqXzNfMSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogampfM18yKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBqal8zXzMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IGpqXzNfNCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogampfM181KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiBqal8zXzYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IGpqXzNfNygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzogampfM184KCk7IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gcC5uZXh0OworICAgICAgfSB3aGlsZSAocCAhPSBudWxsKTsKKyAgICAgIH0gY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyB9CisgICAgfQorICAgIGpqX3Jlc2NhbiA9IGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3NhdmUoaW50IGluZGV4LCBpbnQgeGxhKSB7CisgICAgSkpDYWxscyBwID0gampfMl9ydG5zW2luZGV4XTsKKyAgICB3aGlsZSAocC5nZW4gPiBqal9nZW4pIHsKKyAgICAgIGlmIChwLm5leHQgPT0gbnVsbCkgeyBwID0gcC5uZXh0ID0gbmV3IEpKQ2FsbHMoKTsgYnJlYWs7IH0KKyAgICAgIHAgPSBwLm5leHQ7CisgICAgfQorICAgIHAuZ2VuID0gampfZ2VuICsgeGxhIC0gampfbGE7IHAuZmlyc3QgPSB0b2tlbjsgcC5hcmcgPSB4bGE7CisgIH0KKworICBzdGF0aWMgZmluYWwgY2xhc3MgSkpDYWxscyB7CisgICAgaW50IGdlbjsKKyAgICBUb2tlbiBmaXJzdDsKKyAgICBpbnQgYXJnOworICAgIEpKQ2FsbHMgbmV4dDsKKyAgfQorCisgICAgfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9RdWVyeVBhcnNlci5qaiBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUXVlcnlQYXJzZXIuamoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzNzYxNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUXVlcnlQYXJzZXIuamoKQEAgLTAsMCArMSw0OTcgQEAKKy8qQGJnZW4oamp0cmVlKSBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIC4vUXVlcnlQYXJzZXIuamogKi8KKy8qQGVnZW4qLy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitvcHRpb25zIHsKKyAgSkRLX1ZFUlNJT04gPSAiMS41IjsKKyAgU1RBVElDID0gZmFsc2U7Cit9CisKK1BBUlNFUl9CRUdJTihRdWVyeVBhcnNlcikKKwlwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5wYXJzZXI7CisKKwlpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKwlpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwlpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisJaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisJaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCWltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworCWltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlMb2dpY2FsR3JvdXA7CisJaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5TdGRRdWVyeUV4cHJlc3Npb247CisJaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5Db21wYXJpc29uUXVlcnlFeHByZXNzaW9uOworCWltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuQ3VzdG9tUXVlcnlFeHByZXNzaW9uOworCWltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybS5UZXJtOworCQorICAgIHB1YmxpYyBjbGFzcyBRdWVyeVBhcnNlci8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBRdWVyeVBhcnNlclRyZWVDb25zdGFudHMvKkBlZ2VuKi8gey8qQGJnZW4oamp0cmVlKSovCisgIHByb3RlY3RlZCBKSlRRdWVyeVBhcnNlclN0YXRlIGpqdHJlZSA9IG5ldyBKSlRRdWVyeVBhcnNlclN0YXRlKCk7CisKKy8qQGVnZW4qLworICAgIAkKKyAgICAJcHVibGljIHN0YXRpYyBRdWVyeUV4cHJlc3Npb24gcGFyc2VRdWVyeUV4cHJlc3Npb24oU3RyaW5nIHF1ZXJ5RXhwcmVzc2lvblN0cmluZykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBUb2tlbk1nckVycm9yIHsKKyAgICAJCXJldHVybiBuZXcgUXVlcnlQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHF1ZXJ5RXhwcmVzc2lvblN0cmluZy5nZXRCeXRlcygpKSkucGFyc2VJbnB1dCgpOworICAgIAl9CisgICAgCQorICAgICAgIAlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgVG9rZW5NZ3JFcnJvciB7CisgICAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgUXVlcnlQYXJzZXIoIFN5c3RlbS5pbiApLnBhcnNlSW5wdXQoKSk7CisgICAgICAgCX0gCisgICAgICAgCQorICAgIH0KK1BBUlNFUl9FTkQoUXVlcnlQYXJzZXIpCisKK1NLSVAgOiB7ICJcciIgfCAiXG4iIHwgIlxyXG4iIH0KK1RPS0VOOiB7IDwgU1BBQ0UgOiAiICIgPiB9CitUT0tFTjogeyA8IEFORCA6ICIgQU5EICIgPiB9CitUT0tFTjogeyA8IE9SIDogIiBPUiAiID4gfQorVE9LRU46IHsgPCBRVU9URSA6ICInIiA+IH0KK1RPS0VOOiB7IDwgRVFVQUxTIDogIj0iID4gfQorVE9LRU46IHsgPCBTRU1JX0NPTE9OIDogIjsiID4gfQorVE9LRU46IHsgPCBDT01NQSA6ICIsIiA+IH0KK1RPS0VOOiB7IDwgT1BFTl9CUkFDRVMgOiAieyIgPiB9CitUT0tFTjogeyA8IENMT1NFX0JSQUNFUyA6ICJ9IiA+IH0KK1RPS0VOOiB7IDwgT1BFTl9QQVJFTlMgOiAiKCIgPiB9CitUT0tFTjogeyA8IENMT1NFX1BBUkVOUyA6ICIpIiA+IH0KK1RPS0VOOiB7IDwgQlVDS0VUX05BTUVfS0VZIDogImJ1Y2tldE5hbWVzIiA+IH0KK1RPS0VOOiB7IDwgQ1VTVE9NX05BTUVfS0VZIDogIm5hbWUiID4gfQorVE9LRU46IHsgPCBQX0tFWSA6ICJwOiIgPFRFUk0+ID4gfQorVE9LRU46IHsKKyAgICAgIDwgRVEgOiAiPT0iID4KKyAgICB8IDwgR0UgOiAiPj0iID4KKyAgICB8IDwgR1QgOiAiPiIgPgorICAgIHwgPCBMRSA6ICI8PSIgPgorICAgIHwgPCBMVCA6ICI8IiA+Cit9CitUT0tFTjogeyA8IFRFUk06IChbImEiLSJ6IiwiQSItIloiXSkrICg8U1RSSU5HX0xJVEVSQUw+KSogPiB9CitUT0tFTjogeyA8IFZBTFVFIDogIiciICggPFRFUk0+IHwgPE5PTl9URVJNPiApICInIiA+IH0KK1RPS0VOOiB7IDwgI05PTl9URVJNOiAoPFNUUklOR19MSVRFUkFMPiB8IDxTUEVDSUFMX0NIQVJTPikrICg8U1RSSU5HX0xJVEVSQUw+IHwgIiAiPFNUUklOR19MSVRFUkFMPiB8ICIgIjxTUEVDSUFMX0NIQVJTPiB8IDxTUEVDSUFMX0NIQVJTPikqID4gfQorVE9LRU46IHsgPCAjU1RSSU5HX0xJVEVSQUw6IChbIjAiLSI5IiwiYSItInoiLCJBIi0iWiIsIi0iLCJfIiwiLiIsIjoiLCIvIl0pID4gfQorVE9LRU46IHsgPCAjU1BFQ0lBTF9DSEFSUzogKFsiLyIsIlxcIiwiPyIsIjwiLCI+IiwifiIsImAiLCIqIiwiIyIsIiYiLCIhIiwiQCIsIiQiLCIlIiwiXiIsIigiLCIpIiwieyIsIn0iLCJbIiwiXSJdKSA+IH0KKworUXVlcnlFeHByZXNzaW9uIHBhcnNlSW5wdXQoKSA6IAorey8qQGJnZW4oamp0cmVlKSBwYXJzZUlucHV0ICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVFBBUlNFSU5QVVQpOworICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOworICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKKy8qQGVnZW4qLworCVF1ZXJ5RXhwcmVzc2lvbiBxZSA9IG51bGw7Cit9Cit7LypAYmdlbihqanRyZWUpIHBhcnNlSW5wdXQgKi8KKyAgICAgICAgdHJ5IHsKKy8qQGVnZW4qLworICAgCXFlID0gUXVlcnkobnVsbCkgPEVPRj4vKkBiZ2VuKGpqdHJlZSkqLworICAgICAgICB7CisgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgfQorLypAZWdlbiovCisgICAJeyByZXR1cm4gcWU7IH0vKkBiZ2VuKGpqdHJlZSkqLworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgeworICAgICAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7CisgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisvKkBlZ2VuKi8KK30KKworUXVlcnlFeHByZXNzaW9uIFF1ZXJ5KFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSA6IAorey8qQGJnZW4oamp0cmVlKSBRdWVyeSAqLworICAgICAgICBTaW1wbGVOb2RlIGpqdG4wMDAgPSBuZXcgU2ltcGxlTm9kZShKSlRRVUVSWSk7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOworLypAZWdlbiovCisJUXVlcnlFeHByZXNzaW9uIHFlMSA9IG51bGw7CisJUXVlcnlFeHByZXNzaW9uIHFlMiA9IG51bGw7CisJVG9rZW4gb3BlcmF0b3IgPSBudWxsOworfQorey8qQGJnZW4oamp0cmVlKSBRdWVyeSAqLworICAgIHRyeSB7CisvKkBlZ2VuKi8KKyAgICBxZTEgPSBRdWVyeUV4cHJlc3Npb24oYnVja2V0TmFtZXMpICggTE9PS0FIRUFEKCA8QU5EPiB8IDxPUj4gKSAoIG9wZXJhdG9yID0gPEFORD4gfCBvcGVyYXRvciA9IDxPUj4gKSBxZTIgPSBRdWVyeShidWNrZXROYW1lcykgKSovKkBiZ2VuKGpqdHJlZSkqLworICAgIHsKKyAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICB9CisvKkBlZ2VuKi8KKyAgICB7IAorICAgIAlpZiAocWUyID09IG51bGwpIHsKKyAgICAJCXJldHVybiBxZTE7CisgICAgCX1lbHNlIHsKKyAgICAJCVF1ZXJ5TG9naWNhbEdyb3VwIHF1ZXJ5TG9naWNhbEdyb3VwID0gbmV3IFF1ZXJ5TG9naWNhbEdyb3VwKCk7CisgICAgCQlpZiAoYnVja2V0TmFtZXMgIT0gbnVsbCkKKyAgICAJCQlxdWVyeUxvZ2ljYWxHcm91cC5zZXRCdWNrZXROYW1lcyhuZXcgSGFzaFNldDxTdHJpbmc+KGJ1Y2tldE5hbWVzKSk7CisgICAgCQlxdWVyeUxvZ2ljYWxHcm91cC5zZXRPcGVyYXRvcihRdWVyeUxvZ2ljYWxHcm91cC5PcGVyYXRvci52YWx1ZU9mKG9wZXJhdG9yLmltYWdlLnRyaW0oKS50b1VwcGVyQ2FzZSgpKSk7CisgICAgCQlxdWVyeUxvZ2ljYWxHcm91cC5hZGRFeHByZXNzaW9uKHFlMSk7CisgICAgCQlxdWVyeUxvZ2ljYWxHcm91cC5hZGRFeHByZXNzaW9uKHFlMik7CisgICAgCQlyZXR1cm4gcXVlcnlMb2dpY2FsR3JvdXA7CisgICAgCX0KKyAgICB9LypAYmdlbihqanRyZWUpKi8KKyAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgeworICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOworICAgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBqanRyZWUucG9wTm9kZSgpOworICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7CisgICAgICB9CisgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgfQorICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisvKkBlZ2VuKi8KK30KKworUXVlcnlFeHByZXNzaW9uIFF1ZXJ5RXhwcmVzc2lvbihWZWN0b3I8U3RyaW5nPiBidWNrZXROYW1lcykgOgorey8qQGJnZW4oamp0cmVlKSBRdWVyeUV4cHJlc3Npb24gKi8KKyAgICAgICAgU2ltcGxlTm9kZSBqanRuMDAwID0gbmV3IFNpbXBsZU5vZGUoSkpUUVVFUllFWFBSRVNTSU9OKTsKKyAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKKyAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7CisvKkBlZ2VuKi8KKwlRdWVyeUV4cHJlc3Npb24gcWUgPSBudWxsOworfQorey8qQGJnZW4oamp0cmVlKSBRdWVyeUV4cHJlc3Npb24gKi8KKyAgICB0cnkgeworLypAZWdlbiovCisgICAgKCAKKyAgICAJTE9PS0FIRUFEICggPE9QRU5fUEFSRU5TPiApIAorICAgIAlxZSA9IFByaW9yaXR5UXVlcnlFeHByZXNzaW9uKGJ1Y2tldE5hbWVzKQorICAgIHwgCisgICAgCUxPT0tBSEVBRCAoIDxPUEVOX0JSQUNFUz4gKDxTUEFDRT4pKiA8QlVDS0VUX05BTUVfS0VZPiApIAorICAgIAlxZSA9IFN0ZFF1ZXJ5RXhwcmVzc2lvbigpCisgICAgfCAKKyAgICAJTE9PS0FIRUFEICggPE9QRU5fQlJBQ0VTPiAoPFNQQUNFPikqIDxDVVNUT01fTkFNRV9LRVk+ICkgCisgICAgCXFlID0gQ3VzdG9tUXVlcnlFeHByZXNzaW9uKGJ1Y2tldE5hbWVzKQorICAgIHwgCisgICAgICAgIExPT0tBSEVBRCAoIDxURVJNPiApIAorICAgIAlxZSA9IENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24oYnVja2V0TmFtZXMpIAorICAgICkvKkBiZ2VuKGpqdHJlZSkqLworICAgIHsKKyAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICB9CisvKkBlZ2VuKi8KKyAgICAKKyAgICB7IHJldHVybiBxZTsgfS8qQGJnZW4oamp0cmVlKSovCisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsKKyAgICAgIH0KKyAgICAgIHRocm93IChFcnJvcilqanRlMDAwOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorLypAZWdlbiovCit9CisKK1F1ZXJ5RXhwcmVzc2lvbiBTdGRRdWVyeUV4cHJlc3Npb24oKSA6IAorey8qQGJnZW4oamp0cmVlKSBTdGRRdWVyeUV4cHJlc3Npb24gKi8KKyAgICAgICAgU2ltcGxlTm9kZSBqanRuMDAwID0gbmV3IFNpbXBsZU5vZGUoSkpUU1REUVVFUllFWFBSRVNTSU9OKTsKKyAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKKyAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7CisvKkBlZ2VuKi8KKwlRdWVyeUV4cHJlc3Npb24gcWUgPSBudWxsOworCVZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Cit9Cit7LypAYmdlbihqanRyZWUpIFN0ZFF1ZXJ5RXhwcmVzc2lvbiAqLworICAgIHRyeSB7CisvKkBlZ2VuKi8KKyAgICA8T1BFTl9CUkFDRVM+ICg8U1BBQ0U+KSogPEJVQ0tFVF9OQU1FX0tFWT4gKDxTUEFDRT4pKiA8RVFVQUxTPiAoPFNQQUNFPikqIGdldFZhbHVlcyhidWNrZXROYW1lcykgKDxTUEFDRT4pKiBbPFNFTUlfQ09MT04+ICg8U1BBQ0U+KSogcWUgPSBRdWVyeShidWNrZXROYW1lcyldICg8U1BBQ0U+KSogPENMT1NFX0JSQUNFUz4vKkBiZ2VuKGpqdHJlZSkqLworICAgIHsKKyAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICB9CisvKkBlZ2VuKi8KKyAgICB7IAorICAgIAlpZiAocWUgPT0gbnVsbCkgeworICAgIAkJcmV0dXJuIG5ldyBTdGRRdWVyeUV4cHJlc3Npb24obmV3IEhhc2hTZXQ8U3RyaW5nPihidWNrZXROYW1lcykpOworICAgIAl9ZWxzZSB7CisgICAgCQlyZXR1cm4gcWU7IAorICAgIAl9CisgICAgfS8qQGJnZW4oamp0cmVlKSovCisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsKKyAgICAgIH0KKyAgICAgIHRocm93IChFcnJvcilqanRlMDAwOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorLypAZWdlbiovCit9CisKK1F1ZXJ5RXhwcmVzc2lvbiBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uKFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSA6IAorey8qQGJnZW4oamp0cmVlKSBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVENPTVBBUklTT05RVUVSWUVYUFJFU1NJT04pOworICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOworICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKKy8qQGVnZW4qLworCVRva2VuIHRlcm1OYW1lID0gbnVsbDsKKwlUb2tlbiBvcGVyYXRvciA9IG51bGw7CisJVmVjdG9yPFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Cit9Cit7LypAYmdlbihqanRyZWUpIENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24gKi8KKyAgICB0cnkgeworLypAZWdlbiovCisgICAgdGVybU5hbWUgPSA8VEVSTT4gKDxTUEFDRT4pKiAoIG9wZXJhdG9yID0gPEVRPiB8IG9wZXJhdG9yID0gPEdUPiB8IG9wZXJhdG9yID0gPEdFPiB8IG9wZXJhdG9yID0gPExUPiB8IG9wZXJhdG9yID0gPExFPiApICg8U1BBQ0U+KSogZ2V0VmFsdWVzKHZhbHVlcykvKkBiZ2VuKGpqdHJlZSkqLworICAgIHsKKyAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICB9CisvKkBlZ2VuKi8KKyAgICB7IAorICAgIAlUZXJtIHRlcm0gPSBuZXcgVGVybSh0ZXJtTmFtZS5pbWFnZSk7CisgICAgCXRlcm0uc2V0VmFsdWVzKHZhbHVlcyk7IC8vQXJyYXlzLmFzTGlzdCh0ZXJtVmFsdWVzLmltYWdlLnNwbGl0KCIsIikpKTsKKyAgICAJQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbiBjb21wYXJpc29uUXVlcnlFeHByZXNzaW9uID0gbmV3IENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24oKTsKKyAgICAJaWYgKGJ1Y2tldE5hbWVzICE9IG51bGwpCisgICAgCQljb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLnNldEJ1Y2tldE5hbWVzKG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpKTsKKyAgICAJY29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5zZXRUZXJtKHRlcm0pOworICAgIAljb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLnNldE9wZXJhdG9yKENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24uT3BlcmF0b3IuZ2V0T3BlcmF0b3JCeVNpZ24ob3BlcmF0b3IuaW1hZ2UpKTsKKyAgICAJcmV0dXJuIGNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb247IAorICAgIH0vKkBiZ2VuKGpqdHJlZSkqLworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7CisgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7CisgICAgICB9CisgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsKKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7CisgICAgICB9CisgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGpqdGMwMDApIHsKKyAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgfQorICAgIH0KKy8qQGVnZW4qLworfQorCitRdWVyeUV4cHJlc3Npb24gUHJpb3JpdHlRdWVyeUV4cHJlc3Npb24oVmVjdG9yPFN0cmluZz4gYnVja2V0TmFtZXMpIDoKK3svKkBiZ2VuKGpqdHJlZSkgUHJpb3JpdHlRdWVyeUV4cHJlc3Npb24gKi8KKyAgICAgICAgU2ltcGxlTm9kZSBqanRuMDAwID0gbmV3IFNpbXBsZU5vZGUoSkpUUFJJT1JJVFlRVUVSWUVYUFJFU1NJT04pOworICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOworICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKKy8qQGVnZW4qLworCVF1ZXJ5RXhwcmVzc2lvbiBxZSA9IG51bGw7Cit9Cit7LypAYmdlbihqanRyZWUpIFByaW9yaXR5UXVlcnlFeHByZXNzaW9uICovCisgICAgdHJ5IHsKKy8qQGVnZW4qLworICAgIDxPUEVOX1BBUkVOUz4gcWUgPSBRdWVyeShidWNrZXROYW1lcykgPENMT1NFX1BBUkVOUz4vKkBiZ2VuKGpqdHJlZSkqLworICAgIHsKKyAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICB9CisvKkBlZ2VuKi8KKyAgICB7IHJldHVybiBxZTsgfS8qQGJnZW4oamp0cmVlKSovCisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgIGlmIChqanRjMDAwKSB7CisgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKKyAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgfQorICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsKKyAgICAgIH0KKyAgICAgIHRocm93IChFcnJvcilqanRlMDAwOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorLypAZWdlbiovCit9CisKK1F1ZXJ5RXhwcmVzc2lvbiBDdXN0b21RdWVyeUV4cHJlc3Npb24oVmVjdG9yPFN0cmluZz4gYnVja2V0TmFtZXMpIDoKK3svKkBiZ2VuKGpqdHJlZSkgQ3VzdG9tUXVlcnlFeHByZXNzaW9uICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVENVU1RPTVFVRVJZRVhQUkVTU0lPTik7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOworLypAZWdlbiovCisJVG9rZW4gY3VzdG9tTmFtZVRva2VuID0gbnVsbDsKKwlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworfQorey8qQGJnZW4oamp0cmVlKSBDdXN0b21RdWVyeUV4cHJlc3Npb24gKi8KKyAgICAgICAgdHJ5IHsKKy8qQGVnZW4qLworCTxPUEVOX0JSQUNFUz4gKDxTUEFDRT4pKiA8Q1VTVE9NX05BTUVfS0VZPiAoPFNQQUNFPikqIDxFUVVBTFM+ICg8U1BBQ0U+KSogPFFVT1RFPiBjdXN0b21OYW1lVG9rZW4gPSA8VEVSTT4gPFFVT1RFPiBbIExPT0tBSEVBRCAoKDxTUEFDRT4pKiA8U0VNSV9DT0xPTj4pICg8U1BBQ0U+KSogPFNFTUlfQ09MT04+IGdldFByb3BlcnRpZXMocCkgXSAoPFNQQUNFPikqIDxDTE9TRV9CUkFDRVM+LypAYmdlbihqanRyZWUpKi8KKyAgICAgICAgeworICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKKyAgICAgICAgICBqanRjMDAwID0gZmFsc2U7CisgICAgICAgIH0KKy8qQGVnZW4qLworCXsgCisJCUN1c3RvbVF1ZXJ5RXhwcmVzc2lvbiBjcWUgPSBuZXcgQ3VzdG9tUXVlcnlFeHByZXNzaW9uKGN1c3RvbU5hbWVUb2tlbi5pbWFnZSwgcCk7CisgICAgCWlmIChidWNrZXROYW1lcyAhPSBudWxsKQorICAgIAkJY3FlLnNldEJ1Y2tldE5hbWVzKG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpKTsKKyAgICAJcmV0dXJuIGNxZTsKKwl9LypAYmdlbihqanRyZWUpKi8KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOworICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorLypAZWdlbiovCit9CisKK3ZvaWQgZ2V0VmFsdWVzKFZlY3RvcjxTdHJpbmc+IHZhbHVlcykgOiAKK3svKkBiZ2VuKGpqdHJlZSkgZ2V0VmFsdWVzICovCisgICAgICAgIFNpbXBsZU5vZGUgamp0bjAwMCA9IG5ldyBTaW1wbGVOb2RlKEpKVEdFVFZBTFVFUyk7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOworLypAZWdlbiovCisJVG9rZW4gdmFsdWUgPSBudWxsOworfQorey8qQGJnZW4oamp0cmVlKSBnZXRWYWx1ZXMgKi8KKyAgICAgICAgdHJ5IHsKKy8qQGVnZW4qLworCXZhbHVlID0gPFZBTFVFPiAoIExPT0tBSEVBRCAoPENPTU1BPikgPENPTU1BPiBnZXRWYWx1ZXModmFsdWVzKSApICovKkBiZ2VuKGpqdHJlZSkqLworICAgICAgICB7CisgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgfQorLypAZWdlbiovCisJeyAKKwkJdmFsdWVzLmFkZCgwLCB2YWx1ZS5pbWFnZS5yZXBsYWNlQWxsKCInIiwgIiIpKTsKKwl9LypAYmdlbihqanRyZWUpKi8KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOworICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorLypAZWdlbiovCit9CisKK3ZvaWQgZ2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHApIDogCit7LypAYmdlbihqanRyZWUpIGdldFByb3BlcnRpZXMgKi8KKyAgICAgICAgU2ltcGxlTm9kZSBqanRuMDAwID0gbmV3IFNpbXBsZU5vZGUoSkpUR0VUUFJPUEVSVElFUyk7CisgICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7CisgICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOworLypAZWdlbiovCisJVG9rZW4gcHJvcGVydHlLZXkgPSBudWxsOworCVRva2VuIHByb3BlcnR5VmFsID0gbnVsbDsKK30KK3svKkBiZ2VuKGpqdHJlZSkgZ2V0UHJvcGVydGllcyAqLworICAgICAgICB0cnkgeworLypAZWdlbiovCisJcHJvcGVydHlLZXkgPSA8UF9LRVk+ICg8U1BBQ0U+KSogPEVRVUFMUz4gKDxTUEFDRT4pKiBwcm9wZXJ0eVZhbCA9IDxWQUxVRT4gKCBMT09LQUhFQUQgKDxDT01NQT4pIDxDT01NQT4gZ2V0UHJvcGVydGllcyhwKSApICovKkBiZ2VuKGpqdHJlZSkqLworICAgICAgICB7CisgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKKyAgICAgICAgfQorLypAZWdlbiovCisJeyAKKwkJcC5wdXQocHJvcGVydHlLZXkuaW1hZ2Uuc3Vic3RyaW5nKDIpLCBwcm9wZXJ0eVZhbC5pbWFnZS5yZXBsYWNlQWxsKCInIiwgIiIpKTsKKwl9LypAYmdlbihqanRyZWUpKi8KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOworICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoamp0YzAwMCkgeworICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorLypAZWdlbiovCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1F1ZXJ5UGFyc2VyLmpqdCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUXVlcnlQYXJzZXIuamp0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjk3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1F1ZXJ5UGFyc2VyLmpqdApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK29wdGlvbnMgeworICBKREtfVkVSU0lPTiA9ICIxLjUiOworICBTVEFUSUMgPSBmYWxzZTsKK30KKworUEFSU0VSX0JFR0lOKFF1ZXJ5UGFyc2VyKQorCXBhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlcjsKKworCWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKwlpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKwlpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisJaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CisJaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUxvZ2ljYWxHcm91cDsKKwlpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlN0ZFF1ZXJ5RXhwcmVzc2lvbjsKKwlpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LkNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb247CisJaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5DdXN0b21RdWVyeUV4cHJlc3Npb247CisJaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy50ZXJtLlRlcm07CisJCisgICAgcHVibGljIGNsYXNzIFF1ZXJ5UGFyc2VyIHsKKyAgICAJCisgICAgCXB1YmxpYyBzdGF0aWMgUXVlcnlFeHByZXNzaW9uIHBhcnNlUXVlcnlFeHByZXNzaW9uKFN0cmluZyBxdWVyeUV4cHJlc3Npb25TdHJpbmcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgVG9rZW5NZ3JFcnJvciB7CisgICAgCQlyZXR1cm4gbmV3IFF1ZXJ5UGFyc2VyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShxdWVyeUV4cHJlc3Npb25TdHJpbmcuZ2V0Qnl0ZXMoKSkpLnBhcnNlSW5wdXQoKTsKKyAgICAJfQorICAgIAkKKyAgICAgICAJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIFRva2VuTWdyRXJyb3IgeworICAgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4obmV3IFF1ZXJ5UGFyc2VyKCBTeXN0ZW0uaW4gKS5wYXJzZUlucHV0KCkpOworICAgICAgIAl9IAorICAgICAgIAkKKyAgICB9CitQQVJTRVJfRU5EKFF1ZXJ5UGFyc2VyKQorCitTS0lQIDogeyAiXHIiIHwgIlxuIiB8ICJcclxuIiB9CitUT0tFTjogeyA8IFNQQUNFIDogIiAiID4gfQorVE9LRU46IHsgPCBBTkQgOiAiIEFORCAiID4gfQorVE9LRU46IHsgPCBPUiA6ICIgT1IgIiA+IH0KK1RPS0VOOiB7IDwgUVVPVEUgOiAiJyIgPiB9CitUT0tFTjogeyA8IEVRVUFMUyA6ICI9IiA+IH0KK1RPS0VOOiB7IDwgU0VNSV9DT0xPTiA6ICI7IiA+IH0KK1RPS0VOOiB7IDwgQ09NTUEgOiAiLCIgPiB9CitUT0tFTjogeyA8IE9QRU5fQlJBQ0VTIDogInsiID4gfQorVE9LRU46IHsgPCBDTE9TRV9CUkFDRVMgOiAifSIgPiB9CitUT0tFTjogeyA8IE9QRU5fUEFSRU5TIDogIigiID4gfQorVE9LRU46IHsgPCBDTE9TRV9QQVJFTlMgOiAiKSIgPiB9CitUT0tFTjogeyA8IEJVQ0tFVF9OQU1FX0tFWSA6ICJidWNrZXROYW1lcyIgPiB9CitUT0tFTjogeyA8IENVU1RPTV9OQU1FX0tFWSA6ICJuYW1lIiA+IH0KK1RPS0VOOiB7IDwgUF9LRVkgOiAicDoiIDxURVJNPiA+IH0KK1RPS0VOOiB7CisgICAgICA8IEVRIDogIj09IiA+CisgICAgfCA8IEdFIDogIj49IiA+CisgICAgfCA8IEdUIDogIj4iID4KKyAgICB8IDwgTEUgOiAiPD0iID4KKyAgICB8IDwgTFQgOiAiPCIgPgorfQorVE9LRU46IHsgPCBURVJNOiAoWyJhIi0ieiIsIkEiLSJaIl0pKyAoPFNUUklOR19MSVRFUkFMPikqID4gfQorVE9LRU46IHsgPCBWQUxVRSA6ICInIiAoIDxURVJNPiB8IDxOT05fVEVSTT4gKSAiJyIgPiB9CitUT0tFTjogeyA8ICNOT05fVEVSTTogKDxTVFJJTkdfTElURVJBTD4gfCA8U1BFQ0lBTF9DSEFSUz4pKyAoPFNUUklOR19MSVRFUkFMPiB8ICIgIjxTVFJJTkdfTElURVJBTD4gfCAiICI8U1BFQ0lBTF9DSEFSUz4gfCA8U1BFQ0lBTF9DSEFSUz4pKiA+IH0KK1RPS0VOOiB7IDwgI1NUUklOR19MSVRFUkFMOiAoWyIwIi0iOSIsImEiLSJ6IiwiQSItIloiLCItIiwiXyIsIi4iLCI6IiwiLyJdKSA+IH0KK1RPS0VOOiB7IDwgI1NQRUNJQUxfQ0hBUlM6IChbIi8iLCJcXCIsIj8iLCI8IiwiPiIsIn4iLCJgIiwiKiIsIiMiLCImIiwiISIsIkAiLCIkIiwiJSIsIl4iLCIoIiwiKSIsInsiLCJ9IiwiWyIsIl0iXSkgPiB9CisKK1F1ZXJ5RXhwcmVzc2lvbiBwYXJzZUlucHV0KCkgOiAKK3sKKwlRdWVyeUV4cHJlc3Npb24gcWUgPSBudWxsOworfQoreworICAgCXFlID0gUXVlcnkobnVsbCkgPEVPRj4KKyAgIAl7IHJldHVybiBxZTsgfQorfQorCitRdWVyeUV4cHJlc3Npb24gUXVlcnkoVmVjdG9yPFN0cmluZz4gYnVja2V0TmFtZXMpIDogCit7CisJUXVlcnlFeHByZXNzaW9uIHFlMSA9IG51bGw7CisJUXVlcnlFeHByZXNzaW9uIHFlMiA9IG51bGw7CisJVG9rZW4gb3BlcmF0b3IgPSBudWxsOworfQoreworICAgIHFlMSA9IFF1ZXJ5RXhwcmVzc2lvbihidWNrZXROYW1lcykgKCBMT09LQUhFQUQoIDxBTkQ+IHwgPE9SPiApICggb3BlcmF0b3IgPSA8QU5EPiB8IG9wZXJhdG9yID0gPE9SPiApIHFlMiA9IFF1ZXJ5KGJ1Y2tldE5hbWVzKSApKgorICAgIHsgCisgICAgCWlmIChxZTIgPT0gbnVsbCkgeworICAgIAkJcmV0dXJuIHFlMTsKKyAgICAJfWVsc2UgeworICAgIAkJUXVlcnlMb2dpY2FsR3JvdXAgcXVlcnlMb2dpY2FsR3JvdXAgPSBuZXcgUXVlcnlMb2dpY2FsR3JvdXAoKTsKKyAgICAJCWlmIChidWNrZXROYW1lcyAhPSBudWxsKQorICAgIAkJCXF1ZXJ5TG9naWNhbEdyb3VwLnNldEJ1Y2tldE5hbWVzKG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpKTsKKyAgICAJCXF1ZXJ5TG9naWNhbEdyb3VwLnNldE9wZXJhdG9yKFF1ZXJ5TG9naWNhbEdyb3VwLk9wZXJhdG9yLnZhbHVlT2Yob3BlcmF0b3IuaW1hZ2UudHJpbSgpLnRvVXBwZXJDYXNlKCkpKTsKKyAgICAJCXF1ZXJ5TG9naWNhbEdyb3VwLmFkZEV4cHJlc3Npb24ocWUxKTsKKyAgICAJCXF1ZXJ5TG9naWNhbEdyb3VwLmFkZEV4cHJlc3Npb24ocWUyKTsKKyAgICAJCXJldHVybiBxdWVyeUxvZ2ljYWxHcm91cDsKKyAgICAJfQorICAgIH0KK30KKworUXVlcnlFeHByZXNzaW9uIFF1ZXJ5RXhwcmVzc2lvbihWZWN0b3I8U3RyaW5nPiBidWNrZXROYW1lcykgOgoreworCVF1ZXJ5RXhwcmVzc2lvbiBxZSA9IG51bGw7Cit9Cit7CisgICAgKCAKKyAgICAJTE9PS0FIRUFEICggPE9QRU5fUEFSRU5TPiApIAorICAgIAlxZSA9IFByaW9yaXR5UXVlcnlFeHByZXNzaW9uKGJ1Y2tldE5hbWVzKQorICAgIHwgCisgICAgCUxPT0tBSEVBRCAoIDxPUEVOX0JSQUNFUz4gKDxTUEFDRT4pKiA8QlVDS0VUX05BTUVfS0VZPiApIAorICAgIAlxZSA9IFN0ZFF1ZXJ5RXhwcmVzc2lvbigpCisgICAgfCAKKyAgICAJTE9PS0FIRUFEICggPE9QRU5fQlJBQ0VTPiAoPFNQQUNFPikqIDxDVVNUT01fTkFNRV9LRVk+ICkgCisgICAgCXFlID0gQ3VzdG9tUXVlcnlFeHByZXNzaW9uKGJ1Y2tldE5hbWVzKQorICAgIHwgCisgICAgICAgIExPT0tBSEVBRCAoIDxURVJNPiApIAorICAgIAlxZSA9IENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24oYnVja2V0TmFtZXMpIAorICAgICkKKyAgICAKKyAgICB7IHJldHVybiBxZTsgfQorfQorCitRdWVyeUV4cHJlc3Npb24gU3RkUXVlcnlFeHByZXNzaW9uKCkgOiAKK3sKKwlRdWVyeUV4cHJlc3Npb24gcWUgPSBudWxsOworCVZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Cit9Cit7CisgICAgPE9QRU5fQlJBQ0VTPiAoPFNQQUNFPikqIDxCVUNLRVRfTkFNRV9LRVk+ICg8U1BBQ0U+KSogPEVRVUFMUz4gKDxTUEFDRT4pKiBnZXRWYWx1ZXMoYnVja2V0TmFtZXMpICg8U1BBQ0U+KSogWzxTRU1JX0NPTE9OPiAoPFNQQUNFPikqIHFlID0gUXVlcnkoYnVja2V0TmFtZXMpXSAoPFNQQUNFPikqIDxDTE9TRV9CUkFDRVM+CisgICAgeyAKKyAgICAJaWYgKHFlID09IG51bGwpIHsKKyAgICAJCXJldHVybiBuZXcgU3RkUXVlcnlFeHByZXNzaW9uKG5ldyBIYXNoU2V0PFN0cmluZz4oYnVja2V0TmFtZXMpKTsKKyAgICAJfWVsc2UgeworICAgIAkJcmV0dXJuIHFlOyAKKyAgICAJfQorICAgIH0KK30KKworUXVlcnlFeHByZXNzaW9uIENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24oVmVjdG9yPFN0cmluZz4gYnVja2V0TmFtZXMpIDogCit7CisJVG9rZW4gdGVybU5hbWUgPSBudWxsOworCVRva2VuIG9wZXJhdG9yID0gbnVsbDsKKwlWZWN0b3I8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKK30KK3sKKyAgICB0ZXJtTmFtZSA9IDxURVJNPiAoPFNQQUNFPikqICggb3BlcmF0b3IgPSA8RVE+IHwgb3BlcmF0b3IgPSA8R1Q+IHwgb3BlcmF0b3IgPSA8R0U+IHwgb3BlcmF0b3IgPSA8TFQ+IHwgb3BlcmF0b3IgPSA8TEU+ICkgKDxTUEFDRT4pKiBnZXRWYWx1ZXModmFsdWVzKQorICAgIHsgCisgICAgCVRlcm0gdGVybSA9IG5ldyBUZXJtKHRlcm1OYW1lLmltYWdlKTsKKyAgICAJdGVybS5zZXRWYWx1ZXModmFsdWVzKTsgLy9BcnJheXMuYXNMaXN0KHRlcm1WYWx1ZXMuaW1hZ2Uuc3BsaXQoIiwiKSkpOworICAgIAlDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uIGNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24gPSBuZXcgQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbigpOworICAgIAlpZiAoYnVja2V0TmFtZXMgIT0gbnVsbCkKKyAgICAJCWNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24uc2V0QnVja2V0TmFtZXMobmV3IEhhc2hTZXQ8U3RyaW5nPihidWNrZXROYW1lcykpOworICAgIAljb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLnNldFRlcm0odGVybSk7CisgICAgCWNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24uc2V0T3BlcmF0b3IoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5nZXRPcGVyYXRvckJ5U2lnbihvcGVyYXRvci5pbWFnZSkpOworICAgIAlyZXR1cm4gY29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbjsgCisgICAgfQorfQorCitRdWVyeUV4cHJlc3Npb24gUHJpb3JpdHlRdWVyeUV4cHJlc3Npb24oVmVjdG9yPFN0cmluZz4gYnVja2V0TmFtZXMpIDoKK3sKKwlRdWVyeUV4cHJlc3Npb24gcWUgPSBudWxsOworfQoreworICAgIDxPUEVOX1BBUkVOUz4gcWUgPSBRdWVyeShidWNrZXROYW1lcykgPENMT1NFX1BBUkVOUz4KKyAgICB7IHJldHVybiBxZTsgfQorfQorCitRdWVyeUV4cHJlc3Npb24gQ3VzdG9tUXVlcnlFeHByZXNzaW9uKFZlY3RvcjxTdHJpbmc+IGJ1Y2tldE5hbWVzKSA6Cit7CisJVG9rZW4gY3VzdG9tTmFtZVRva2VuID0gbnVsbDsKKwlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworfQoreworCTxPUEVOX0JSQUNFUz4gKDxTUEFDRT4pKiA8Q1VTVE9NX05BTUVfS0VZPiAoPFNQQUNFPikqIDxFUVVBTFM+ICg8U1BBQ0U+KSogPFFVT1RFPiBjdXN0b21OYW1lVG9rZW4gPSA8VEVSTT4gPFFVT1RFPiBbIExPT0tBSEVBRCAoKDxTUEFDRT4pKiA8U0VNSV9DT0xPTj4pICg8U1BBQ0U+KSogPFNFTUlfQ09MT04+IGdldFByb3BlcnRpZXMocCkgXSAoPFNQQUNFPikqIDxDTE9TRV9CUkFDRVM+CisJeyAKKwkJQ3VzdG9tUXVlcnlFeHByZXNzaW9uIGNxZSA9IG5ldyBDdXN0b21RdWVyeUV4cHJlc3Npb24oY3VzdG9tTmFtZVRva2VuLmltYWdlLCBwKTsKKyAgICAJaWYgKGJ1Y2tldE5hbWVzICE9IG51bGwpCisgICAgCQljcWUuc2V0QnVja2V0TmFtZXMobmV3IEhhc2hTZXQ8U3RyaW5nPihidWNrZXROYW1lcykpOworICAgIAlyZXR1cm4gY3FlOworCX0KK30KKwordm9pZCBnZXRWYWx1ZXMoVmVjdG9yPFN0cmluZz4gdmFsdWVzKSA6IAoreworCVRva2VuIHZhbHVlID0gbnVsbDsKK30KK3sKKwl2YWx1ZSA9IDxWQUxVRT4gKCBMT09LQUhFQUQgKDxDT01NQT4pIDxDT01NQT4gZ2V0VmFsdWVzKHZhbHVlcykgKSAqCisJeyAKKwkJdmFsdWVzLmFkZCgwLCB2YWx1ZS5pbWFnZS5yZXBsYWNlQWxsKCInIiwgIiIpKTsKKwl9Cit9CisKK3ZvaWQgZ2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHApIDogCit7CisJVG9rZW4gcHJvcGVydHlLZXkgPSBudWxsOworCVRva2VuIHByb3BlcnR5VmFsID0gbnVsbDsKK30KK3sKKwlwcm9wZXJ0eUtleSA9IDxQX0tFWT4gKDxTUEFDRT4pKiA8RVFVQUxTPiAoPFNQQUNFPikqIHByb3BlcnR5VmFsID0gPFZBTFVFPiAoIExPT0tBSEVBRCAoPENPTU1BPikgPENPTU1BPiBnZXRQcm9wZXJ0aWVzKHApICkgKgorCXsgCisJCXAucHV0KHByb3BlcnR5S2V5LmltYWdlLnN1YnN0cmluZygyKSwgcHJvcGVydHlWYWwuaW1hZ2UucmVwbGFjZUFsbCgiJyIsICIiKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9RdWVyeVBhcnNlckNvbnN0YW50cy5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9RdWVyeVBhcnNlckNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2RlZDYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1F1ZXJ5UGFyc2VyQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUXVlcnlQYXJzZXJDb25zdGFudHMuamF2YSAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyOworCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5UGFyc2VyQ29uc3RhbnRzIHsKKworICBpbnQgRU9GID0gMDsKKyAgaW50IFNQQUNFID0gNDsKKyAgaW50IEFORCA9IDU7CisgIGludCBPUiA9IDY7CisgIGludCBRVU9URSA9IDc7CisgIGludCBFUVVBTFMgPSA4OworICBpbnQgU0VNSV9DT0xPTiA9IDk7CisgIGludCBDT01NQSA9IDEwOworICBpbnQgT1BFTl9CUkFDRVMgPSAxMTsKKyAgaW50IENMT1NFX0JSQUNFUyA9IDEyOworICBpbnQgT1BFTl9QQVJFTlMgPSAxMzsKKyAgaW50IENMT1NFX1BBUkVOUyA9IDE0OworICBpbnQgQlVDS0VUX05BTUVfS0VZID0gMTU7CisgIGludCBDVVNUT01fTkFNRV9LRVkgPSAxNjsKKyAgaW50IFBfS0VZID0gMTc7CisgIGludCBFUSA9IDE4OworICBpbnQgR0UgPSAxOTsKKyAgaW50IEdUID0gMjA7CisgIGludCBMRSA9IDIxOworICBpbnQgTFQgPSAyMjsKKyAgaW50IFRFUk0gPSAyMzsKKyAgaW50IFZBTFVFID0gMjQ7CisgIGludCBOT05fVEVSTSA9IDI1OworICBpbnQgU1RSSU5HX0xJVEVSQUwgPSAyNjsKKyAgaW50IFNQRUNJQUxfQ0hBUlMgPSAyNzsKKworICBpbnQgREVGQVVMVCA9IDA7CisKKyAgU3RyaW5nW10gdG9rZW5JbWFnZSA9IHsKKyAgICAiPEVPRj4iLAorICAgICJcIlxcclwiIiwKKyAgICAiXCJcXG5cIiIsCisgICAgIlwiXFxyXFxuXCIiLAorICAgICJcIiBcIiIsCisgICAgIlwiIEFORCBcIiIsCisgICAgIlwiIE9SIFwiIiwKKyAgICAiXCJcXFwnXCIiLAorICAgICJcIj1cIiIsCisgICAgIlwiO1wiIiwKKyAgICAiXCIsXCIiLAorICAgICJcIntcIiIsCisgICAgIlwifVwiIiwKKyAgICAiXCIoXCIiLAorICAgICJcIilcIiIsCisgICAgIlwiYnVja2V0TmFtZXNcIiIsCisgICAgIlwibmFtZVwiIiwKKyAgICAiPFBfS0VZPiIsCisgICAgIlwiPT1cIiIsCisgICAgIlwiPj1cIiIsCisgICAgIlwiPlwiIiwKKyAgICAiXCI8PVwiIiwKKyAgICAiXCI8XCIiLAorICAgICI8VEVSTT4iLAorICAgICI8VkFMVUU+IiwKKyAgICAiPE5PTl9URVJNPiIsCisgICAgIjxTVFJJTkdfTElURVJBTD4iLAorICAgICI8U1BFQ0lBTF9DSEFSUz4iLAorICB9OworCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1F1ZXJ5UGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1F1ZXJ5UGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhYmYzYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUXVlcnlQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDc1NyBAQAorLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUXVlcnlQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5TG9naWNhbEdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5TdGRRdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LkNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LkN1c3RvbVF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybS5UZXJtOworCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJzZXJUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBRdWVyeVBhcnNlckNvbnN0YW50cworeworICBwdWJsaWMgIGphdmEuaW8uUHJpbnRTdHJlYW0gZGVidWdTdHJlYW0gPSBTeXN0ZW0ub3V0OworICBwdWJsaWMgIHZvaWQgc2V0RGVidWdTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSBkcykgeyBkZWJ1Z1N0cmVhbSA9IGRzOyB9Citwcml2YXRlIGZpbmFsIGludCBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoaW50IHBvcywgbG9uZyBhY3RpdmUwKQoreworICAgc3dpdGNoIChwb3MpCisgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDE4MDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjM7CisgICAgICAgICAgICByZXR1cm4gMTY7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMTA7CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDE4MDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjM7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOworICAgICAgICAgICAgcmV0dXJuIDE2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNjsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gODsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgOToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gOTsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIC0xOworICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIHJldHVybiBqak1vdmVOZmFfMChqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAocG9zLCBhY3RpdmUwKSwgcG9zICsgMSk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqalN0b3BBdFBvcyhpbnQgcG9zLCBpbnQga2luZCkKK3sKKyAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOworICAgamptYXRjaGVkUG9zID0gcG9zOworICAgcmV0dXJuIHBvcyArIDE7Cit9Citwcml2YXRlIGZpbmFsIGludCBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKGludCBwb3MsIGludCBraW5kLCBpbnQgc3RhdGUpCit7CisgICBqam1hdGNoZWRLaW5kID0ga2luZDsKKyAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBwb3MgKyAxOyB9CisgICByZXR1cm4gampNb3ZlTmZhXzAoc3RhdGUsIHBvcyArIDEpOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpCit7CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4OEwpOworICAgICAgY2FzZSAzMjoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg2MEwpOworICAgICAgY2FzZSAzOToKKyAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDAsIDcsIDEwKTsKKyAgICAgIGNhc2UgNDA6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTMpOworICAgICAgY2FzZSA0MToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxNCk7CisgICAgICBjYXNlIDQ0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDEwKTsKKyAgICAgIGNhc2UgNTk6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgOSk7CisgICAgICBjYXNlIDYwOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDIyOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwMDBMKTsKKyAgICAgIGNhc2UgNjE6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gODsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDBMKTsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjA7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwTCk7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDBMKTsKKyAgICAgIGNhc2UgMTIzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDExKTsKKyAgICAgIGNhc2UgMTI1OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDEyKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDMsIDApOworICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMChsb25nIGFjdGl2ZTApCit7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDAsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDhMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2MToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxOCk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxOSk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMjEpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMEwpOworICAgICAgY2FzZSA3OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDBMKTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDAsIG9sZDApOyAKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMSwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMjsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA3ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MjBMKTsKKyAgICAgIGNhc2UgODI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDEsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDIsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDM7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMywgNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDE2LCAxNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgzLCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA0OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDMyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDQsIDUpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDMsIG9sZDApOyAKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNCwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gNTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDQsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg0LCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDUsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDY7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNzg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDUsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg1LCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDYsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDc7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDgwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDYsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDcsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDg7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTA5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHg4MDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg4LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA5OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAweDgwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDgsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoOCwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg5LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxMDsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEwLCAxNSwgMTYpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCit7CisgICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCisgICB7CisgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKKyAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7CisgICB9Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgZG8geworICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKKyAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQoreworICAgampDaGVja05BZGQoc3RhdGUxKTsKKyAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgZG8geworICAgICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7CisgICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0KQoreworICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7CisgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnQgKyAxXSk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMChpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKK3sKKyAgIGludFtdIG5leHRTdGF0ZXM7CisgICBpbnQgc3RhcnRzQXQgPSAwOworICAgampuZXdTdGF0ZUNudCA9IDE2OworICAgaW50IGkgPSAxOworICAgampzdGF0ZVNldFswXSA9IHN0YXJ0U3RhdGU7CisgICBpbnQgaiwga2luZCA9IDB4N2ZmZmZmZmY7CisgICBmb3IgKDs7KQorICAgeworICAgICAgaWYgKCsrampyb3VuZCA9PSAweDdmZmZmZmZmKQorICAgICAgICAgUmVJbml0Um91bmRzKCk7CisgICAgICBpZiAoY3VyQ2hhciA8IDY0KQorICAgICAgeworICAgICAgICAgbG9uZyBsID0gMUwgPDwgY3VyQ2hhcjsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGQ3ZmZlNzdhMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCAyKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZlMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygzLCA0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNTgpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZTAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDE3KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDE3OworICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmUwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDgsIDkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSAmJiBraW5kID4gMjQpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzMikKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDUsIDYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmUwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDcsIDkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGQ3ZmZlNzdhMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg3LCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhkMDAwODc3YTAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNywgOSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZDdmZmU3N2EwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwLCAxMyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdXJDaGFyIDwgMTI4KQorICAgICAgeworICAgICAgICAgbG9uZyBsID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOworICAgICAgICAgTWF0Y2hMb29wOiBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4NmZmZmZmZmZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDIpOworICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmUwN2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE0LCAxNik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMzsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDUpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmUwN2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0LCA1KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmUwN2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0LCA1KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlMDdmZmZmZmVMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTcpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTc7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxLCAyKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxNykKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxNzsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTA3ZmZmZmZlTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIzKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIzOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNCwgNSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmUwN2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE0LCAxNik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg4LCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg3LCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg2ZmZmZmZmZmZmZmZmZmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNywgOSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4NjgwMDAwMDE3ODAwMDAwMUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDcsIDkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDZmZmZmZmZmZmZmZmZmZmZMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMCwgMTMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OworICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKKyAgICAgIHsKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOworICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOworICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICB9CisgICAgICArK2N1clBvczsKKyAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDE2IC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQorICAgICAgICAgcmV0dXJuIGN1clBvczsKKyAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KKyAgIH0KK30KK3N0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7CisgICA5LCAxMSwgMTUsIDcsIDEwLCAxMiwgMTQsIDEzLCA5LCAxMSwgMTMsIDksIDExLCAxNSwgNywgOCwgCisgICA5LCAKK307CitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGpqc3RyTGl0ZXJhbEltYWdlcyA9IHsKKyIiLCBudWxsLCBudWxsLCBudWxsLCAiXDQwIiwgIlw0MFwxMDFcMTE2XDEwNFw0MCIsICJcNDBcMTE3XDEyMlw0MCIsICJcNDciLCAKKyJcNzUiLCAiXDczIiwgIlw1NCIsICJcMTczIiwgIlwxNzUiLCAiXDUwIiwgIlw1MSIsIAorIlwxNDJcMTY1XDE0M1wxNTNcMTQ1XDE2NFwxMTZcMTQxXDE1NVwxNDVcMTYzIiwgIlwxNTZcMTQxXDE1NVwxNDUiLCBudWxsLCAiXDc1XDc1IiwgIlw3Nlw3NSIsICJcNzYiLCAiXDc0XDc1IiwgIlw3NCIsIG51bGwsIAorbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgfTsKK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV4U3RhdGVOYW1lcyA9IHsKKyAgICJERUZBVUxUIiwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7CisgICAweDFmZmZmZjFMLCAKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ta2lwID0geworICAgMHhlTCwgCit9OworcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOworcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbMTZdOworcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFszMl07Citwcm90ZWN0ZWQgY2hhciBjdXJDaGFyOworcHVibGljIFF1ZXJ5UGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKXsKKyAgIGlmIChTaW1wbGVDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVSUk9SOiBDYW5ub3QgdXNlIGEgc3RhdGljIENoYXJTdHJlYW0gY2xhc3Mgd2l0aCBhIG5vbi1zdGF0aWMgbGV4aWNhbCBhbmFseXplci4iKTsKKyAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKK30KK3B1YmxpYyBRdWVyeVBhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKXsKKyAgIHRoaXMoc3RyZWFtKTsKKyAgIFN3aXRjaFRvKGxleFN0YXRlKTsKK30KK3B1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKK3sKKyAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOworICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7CisgICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07CisgICBSZUluaXRSb3VuZHMoKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBSZUluaXRSb3VuZHMoKQoreworICAgaW50IGk7CisgICBqanJvdW5kID0gMHg4MDAwMDAwMTsKKyAgIGZvciAoaSA9IDE2OyBpLS0gPiAwOykKKyAgICAgIGpqcm91bmRzW2ldID0gMHg4MDAwMDAwMDsKK30KK3B1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQoreworICAgUmVJbml0KHN0cmVhbSk7CisgICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Cit9CitwdWJsaWMgdm9pZCBTd2l0Y2hUbyhpbnQgbGV4U3RhdGUpCit7CisgICBpZiAobGV4U3RhdGUgPj0gMSB8fCBsZXhTdGF0ZSA8IDApCisgICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcigiRXJyb3I6IElnbm9yaW5nIGludmFsaWQgbGV4aWNhbCBzdGF0ZSA6ICIgKyBsZXhTdGF0ZSArICIuIFN0YXRlIHVuY2hhbmdlZC4iLCBUb2tlbk1nckVycm9yLklOVkFMSURfTEVYSUNBTF9TVEFURSk7CisgICBlbHNlCisgICAgICBjdXJMZXhTdGF0ZSA9IGxleFN0YXRlOworfQorCitwcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKQoreworICAgVG9rZW4gdCA9IFRva2VuLm5ld1Rva2VuKGpqbWF0Y2hlZEtpbmQpOworICAgdC5raW5kID0gamptYXRjaGVkS2luZDsKKyAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKKyAgIHQuaW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOworICAgdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7CisgICB0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7CisgICB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOworICAgdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisgICByZXR1cm4gdDsKK30KKworaW50IGN1ckxleFN0YXRlID0gMDsKK2ludCBkZWZhdWx0TGV4U3RhdGUgPSAwOworaW50IGpqbmV3U3RhdGVDbnQ7CitpbnQgampyb3VuZDsKK2ludCBqam1hdGNoZWRQb3M7CitpbnQgamptYXRjaGVkS2luZDsKKworcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIAoreworICBpbnQga2luZDsKKyAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKKyAgVG9rZW4gbWF0Y2hlZFRva2VuOworICBpbnQgY3VyUG9zID0gMDsKKworICBFT0ZMb29wIDoKKyAgZm9yICg7OykKKyAgeyAgIAorICAgdHJ5ICAgCisgICB7ICAgICAKKyAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOworICAgfSAgICAgCisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCisgICB7ICAgICAgICAKKyAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOworICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKKyAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47CisgICB9CisKKyAgIHRyeSB7IGlucHV0X3N0cmVhbS5iYWNrdXAoMCk7CisgICAgICB3aGlsZSAoY3VyQ2hhciA8PSAxMCAmJiAoMHg0MDBMICYgKDFMIDw8IGN1ckNoYXIpKSAhPSAwTCkKKyAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOworICAgfQorICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgY29udGludWUgRU9GTG9vcDsgfQorICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICBqam1hdGNoZWRQb3MgPSAwOworICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOworICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKKyAgIHsKKyAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQorICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKKyAgICAgIGlmICgoamp0b1Rva2VuW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCisgICAgICB7CisgICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOworICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7CisgICAgICB9CisgICB9CisgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICBpbnQgZXJyb3JfY29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOworICAgU3RyaW5nIGVycm9yX2FmdGVyID0gbnVsbDsKKyAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOworICAgdHJ5IHsgaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7IH0KKyAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7CisgICAgICBFT0ZTZWVuID0gdHJ1ZTsKKyAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOworICAgICAgaWYgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdccicpIHsKKyAgICAgICAgIGVycm9yX2xpbmUrKzsKKyAgICAgICAgIGVycm9yX2NvbHVtbiA9IDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICBlcnJvcl9jb2x1bW4rKzsKKyAgIH0KKyAgIGlmICghRU9GU2VlbikgeworICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKKyAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOworICAgfQorICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXJyb3IuTEVYSUNBTF9FUlJPUik7CisgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9RdWVyeVBhcnNlclRyZWVDb25zdGFudHMuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUXVlcnlQYXJzZXJUcmVlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzNjI4YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvUXVlcnlQYXJzZXJUcmVlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiAuL1F1ZXJ5UGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlcjsKKworcHVibGljIGludGVyZmFjZSBRdWVyeVBhcnNlclRyZWVDb25zdGFudHMKK3sKKyAgcHVibGljIGludCBKSlRQQVJTRUlOUFVUID0gMDsKKyAgcHVibGljIGludCBKSlRRVUVSWSA9IDE7CisgIHB1YmxpYyBpbnQgSkpUUVVFUllFWFBSRVNTSU9OID0gMjsKKyAgcHVibGljIGludCBKSlRTVERRVUVSWUVYUFJFU1NJT04gPSAzOworICBwdWJsaWMgaW50IEpKVENPTVBBUklTT05RVUVSWUVYUFJFU1NJT04gPSA0OworICBwdWJsaWMgaW50IEpKVFBSSU9SSVRZUVVFUllFWFBSRVNTSU9OID0gNTsKKyAgcHVibGljIGludCBKSlRDVVNUT01RVUVSWUVYUFJFU1NJT04gPSA2OworICBwdWJsaWMgaW50IEpKVEdFVFZBTFVFUyA9IDc7CisgIHB1YmxpYyBpbnQgSkpUR0VUUFJPUEVSVElFUyA9IDg7CisKKworICBwdWJsaWMgU3RyaW5nW10gamp0Tm9kZU5hbWUgPSB7CisgICAgInBhcnNlSW5wdXQiLAorICAgICJRdWVyeSIsCisgICAgIlF1ZXJ5RXhwcmVzc2lvbiIsCisgICAgIlN0ZFF1ZXJ5RXhwcmVzc2lvbiIsCisgICAgIkNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24iLAorICAgICJQcmlvcml0eVF1ZXJ5RXhwcmVzc2lvbiIsCisgICAgIkN1c3RvbVF1ZXJ5RXhwcmVzc2lvbiIsCisgICAgImdldFZhbHVlcyIsCisgICAgImdldFByb3BlcnRpZXMiLAorICB9OworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9TaW1wbGVDaGFyU3RyZWFtLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1NpbXBsZUNoYXJTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E1YjVhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9TaW1wbGVDaGFyU3RyZWFtLmphdmEKQEAgLTAsMCArMSw0NzEgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gNS4wICovCisvKiBKYXZhQ0NPcHRpb25zOlNUQVRJQz1mYWxzZSxTVVBQT1JUX0NMQVNTX1ZJU0lCSUxJVFlfUFVCTElDPXRydWUgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlcjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgQ2hhclN0cmVhbSwgd2hlcmUgdGhlIHN0cmVhbSBpcyBhc3N1bWVkIHRvCisgKiBjb250YWluIG9ubHkgQVNDSUkgY2hhcmFjdGVycyAod2l0aG91dCB1bmljb2RlIHByb2Nlc3NpbmcpLgorICovCisKK3B1YmxpYyBjbGFzcyBTaW1wbGVDaGFyU3RyZWFtCit7CisvKiogV2hldGhlciBwYXJzZXIgaXMgc3RhdGljLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOworICBpbnQgYnVmc2l6ZTsKKyAgaW50IGF2YWlsYWJsZTsKKyAgaW50IHRva2VuQmVnaW47CisvKiogUG9zaXRpb24gaW4gYnVmZmVyLiAqLworICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOworICBwcm90ZWN0ZWQgaW50IGJ1ZmxpbmVbXTsKKyAgcHJvdGVjdGVkIGludCBidWZjb2x1bW5bXTsKKworICBwcm90ZWN0ZWQgaW50IGNvbHVtbiA9IDA7CisgIHByb3RlY3RlZCBpbnQgbGluZSA9IDE7CisKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0NSID0gZmFsc2U7CisgIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNMRiA9IGZhbHNlOworCisgIHByb3RlY3RlZCBqYXZhLmlvLlJlYWRlciBpbnB1dFN0cmVhbTsKKworICBwcm90ZWN0ZWQgY2hhcltdIGJ1ZmZlcjsKKyAgcHJvdGVjdGVkIGludCBtYXhOZXh0Q2hhckluZCA9IDA7CisgIHByb3RlY3RlZCBpbnQgaW5CdWYgPSAwOworICBwcm90ZWN0ZWQgaW50IHRhYlNpemUgPSA4OworCisgIHByb3RlY3RlZCB2b2lkIHNldFRhYlNpemUoaW50IGkpIHsgdGFiU2l6ZSA9IGk7IH0KKyAgcHJvdGVjdGVkIGludCBnZXRUYWJTaXplKGludCBpKSB7IHJldHVybiB0YWJTaXplOyB9CisKKworICBwcm90ZWN0ZWQgdm9pZCBFeHBhbmRCdWZmKGJvb2xlYW4gd3JhcEFyb3VuZCkKKyAgeworICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07CisgICAgaW50IG5ld2J1ZmxpbmVbXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOworICAgIGludCBuZXdidWZjb2x1bW5bXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOworCisgICAgdHJ5CisgICAgeworICAgICAgaWYgKHdyYXBBcm91bmQpCisgICAgICB7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld2J1ZmZlciwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7CisgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgMCwgbmV3YnVmY29sdW1uLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOworCisgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOworCisgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisKKyAgICBidWZzaXplICs9IDIwNDg7CisgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKKyAgICB0b2tlbkJlZ2luID0gMDsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIEZpbGxCdWZmKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCisgICAgeworICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQorICAgICAgeworICAgICAgICBpZiAodG9rZW5CZWdpbiA+IDIwNDgpCisgICAgICAgIHsKKyAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0b2tlbkJlZ2luIDwgMCkKKyAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA+IHRva2VuQmVnaW4pCisgICAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7CisgICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQorICAgICAgICBFeHBhbmRCdWZmKHRydWUpOworICAgICAgZWxzZQorICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOworICAgIH0KKworICAgIGludCBpOworICAgIHRyeSB7CisgICAgICBpZiAoKGkgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgbWF4TmV4dENoYXJJbmQsIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCisgICAgICB7CisgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgLS1idWZwb3M7CisgICAgICBiYWNrdXAoMCk7CisgICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKKyAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKy8qKiBTdGFydC4gKi8KKyAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICB0b2tlbkJlZ2luID0gLTE7CisgICAgY2hhciBjID0gcmVhZENoYXIoKTsKKyAgICB0b2tlbkJlZ2luID0gYnVmcG9zOworCisgICAgcmV0dXJuIGM7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBVcGRhdGVMaW5lQ29sdW1uKGNoYXIgYykKKyAgeworICAgIGNvbHVtbisrOworCisgICAgaWYgKHByZXZDaGFySXNMRikKKyAgICB7CisgICAgICBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKKyAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOworICAgIH0KKyAgICBlbHNlIGlmIChwcmV2Q2hhcklzQ1IpCisgICAgeworICAgICAgcHJldkNoYXJJc0NSID0gZmFsc2U7CisgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgeworICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgICAgY2FzZSAnXHInIDoKKyAgICAgICAgcHJldkNoYXJJc0NSID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcbicgOgorICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1x0JyA6CisgICAgICAgIGNvbHVtbi0tOworICAgICAgICBjb2x1bW4gKz0gKHRhYlNpemUgLSAoY29sdW1uICUgdGFiU2l6ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBidWZsaW5lW2J1ZnBvc10gPSBsaW5lOworICAgIGJ1ZmNvbHVtbltidWZwb3NdID0gY29sdW1uOworICB9CisKKy8qKiBSZWFkIGEgY2hhcmFjdGVyLiAqLworICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICBpZiAoaW5CdWYgPiAwKQorICAgIHsKKyAgICAgIC0taW5CdWY7CisKKyAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQorICAgICAgICBidWZwb3MgPSAwOworCisgICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107CisgICAgfQorCisgICAgaWYgKCsrYnVmcG9zID49IG1heE5leHRDaGFySW5kKQorICAgICAgRmlsbEJ1ZmYoKTsKKworICAgIGNoYXIgYyA9IGJ1ZmZlcltidWZwb3NdOworCisgICAgVXBkYXRlTGluZUNvbHVtbihjKTsKKyAgICByZXR1cm4gYzsKKyAgfQorCisgIEBEZXByZWNhdGVkCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZAorICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KKyAgICovCisKKyAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7CisgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOworICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkCisgICAqIEBzZWUgI2dldEVuZExpbmUKKyAgICovCisKKyAgcHVibGljIGludCBnZXRMaW5lKCkgeworICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107CisgIH0KKworICAvKiogR2V0IHRva2VuIGVuZCBjb2x1bW4gbnVtYmVyLiAqLworICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKKyAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107CisgIH0KKworICAvKiogR2V0IHRva2VuIGVuZCBsaW5lIG51bWJlci4gKi8KKyAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgeworICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOworICB9CisKKyAgLyoqIEdldCB0b2tlbiBiZWdpbm5pbmcgY29sdW1uIG51bWJlci4gKi8KKyAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKKyAgICByZXR1cm4gYnVmY29sdW1uW3Rva2VuQmVnaW5dOworICB9CisKKyAgLyoqIEdldCB0b2tlbiBiZWdpbm5pbmcgbGluZSBudW1iZXIuICovCisgIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgeworICAgIHJldHVybiBidWZsaW5lW3Rva2VuQmVnaW5dOworICB9CisKKy8qKiBCYWNrdXAgYSBudW1iZXIgb2YgY2hhcmFjdGVycy4gKi8KKyAgcHVibGljIHZvaWQgYmFja3VwKGludCBhbW91bnQpIHsKKworICAgIGluQnVmICs9IGFtb3VudDsKKyAgICBpZiAoKGJ1ZnBvcyAtPSBhbW91bnQpIDwgMCkKKyAgICAgIGJ1ZnBvcyArPSBidWZzaXplOworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOworICAgIGxpbmUgPSBzdGFydGxpbmU7CisgICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOworCisgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7CisgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07CisgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQorICB7CisgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKKyAgeworICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKKyAgICBsaW5lID0gc3RhcnRsaW5lOworICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpCisgICAgeworICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7CisgICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKKyAgICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgICB9CisgICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7CisgICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOworICAgIGJ1ZnBvcyA9IC0xOworICB9CisKKyAgLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKKyAgeworICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorICAvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICB0aGlzKGVuY29kaW5nID09IG51bGwgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworICAvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICB0aGlzKGRzdHJlYW0sIGVuY29kaW5nLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7CisgIH0KKworICAvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKKyAgeworICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgIFJlSW5pdChlbmNvZGluZyA9PSBudWxsID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQorICB7CisgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisgIC8qKiBSZWluaXRpYWxpc2UuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgUmVJbml0KGRzdHJlYW0sIGVuY29kaW5nLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQorICB7CisgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisgIC8qKiBHZXQgdG9rZW4gbGl0ZXJhbCB2YWx1ZS4gKi8KKyAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCisgIHsKKyAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCisgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZnBvcyArIDEpOworICB9CisKKyAgLyoqIEdldCB0aGUgc3VmZml4LiAqLworICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQorICB7CisgICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07CisKKyAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qKiBSZXNldCBidWZmZXIgd2hlbiBmaW5pc2hlZC4gKi8KKyAgcHVibGljIHZvaWQgRG9uZSgpCisgIHsKKyAgICBidWZmZXIgPSBudWxsOworICAgIGJ1ZmxpbmUgPSBudWxsOworICAgIGJ1ZmNvbHVtbiA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCisgICAqLworICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCisgIHsKKyAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOworICAgIGludCBsZW47CisKKyAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCisgICAgeworICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOworICAgIH0KKworICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOworICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOworCisgICAgd2hpbGUgKGkgPCBsZW4gJiYgYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pCisgICAgeworICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7CisgICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07CisgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOworICAgICAgY29sdW1uRGlmZiA9IG5leHRDb2xEaWZmOworICAgICAgaSsrOworICAgIH0KKworICAgIGlmIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7CisgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOworCisgICAgICB3aGlsZSAoaSsrIDwgbGVuKQorICAgICAgeworICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKKyAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOworICAgICAgICBlbHNlCisgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7CisgICAgICB9CisgICAgfQorCisgICAgbGluZSA9IGJ1ZmxpbmVbal07CisgICAgY29sdW1uID0gYnVmY29sdW1uW2pdOworICB9CisKK30KKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09MTIxYmY0MTllNmM1MmQ1MzM1Y2U0NGFjYjBiZDI3YWEgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvU2ltcGxlTm9kZS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9TaW1wbGVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmMmJjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvU2ltcGxlTm9kZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlTm9kZS5qYXZhIFZlcnNpb24gNC4zICovCisvKiBKYXZhQ0NPcHRpb25zOk1VTFRJPWZhbHNlLE5PREVfVVNFU19QQVJTRVI9ZmFsc2UsVklTSVRPUj1mYWxzZSxUUkFDS19UT0tFTlM9ZmFsc2UsTk9ERV9QUkVGSVg9QVNULE5PREVfRVhURU5EUz0sTk9ERV9GQUNUT1JZPSxTVVBQT1JUX0NMQVNTX1ZJU0lCSUxJVFlfUFVCTElDPXRydWUgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlcjsKKworcHVibGljCitjbGFzcyBTaW1wbGVOb2RlIGltcGxlbWVudHMgTm9kZSB7CisKKyAgcHJvdGVjdGVkIE5vZGUgcGFyZW50OworICBwcm90ZWN0ZWQgTm9kZVtdIGNoaWxkcmVuOworICBwcm90ZWN0ZWQgaW50IGlkOworICBwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOworICBwcm90ZWN0ZWQgUXVlcnlQYXJzZXIgcGFyc2VyOworCisgIHB1YmxpYyBTaW1wbGVOb2RlKGludCBpKSB7CisgICAgaWQgPSBpOworICB9CisKKyAgcHVibGljIFNpbXBsZU5vZGUoUXVlcnlQYXJzZXIgcCwgaW50IGkpIHsKKyAgICB0aGlzKGkpOworICAgIHBhcnNlciA9IHA7CisgIH0KKworICBwdWJsaWMgdm9pZCBqanRPcGVuKCkgeworICB9CisKKyAgcHVibGljIHZvaWQgamp0Q2xvc2UoKSB7CisgIH0KKworICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBuKSB7IHBhcmVudCA9IG47IH0KKyAgcHVibGljIE5vZGUgamp0R2V0UGFyZW50KCkgeyByZXR1cm4gcGFyZW50OyB9CisKKyAgcHVibGljIHZvaWQgamp0QWRkQ2hpbGQoTm9kZSBuLCBpbnQgaSkgeworICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisgICAgICBjaGlsZHJlbiA9IG5ldyBOb2RlW2kgKyAxXTsKKyAgICB9IGVsc2UgaWYgKGkgPj0gY2hpbGRyZW4ubGVuZ3RoKSB7CisgICAgICBOb2RlIGNbXSA9IG5ldyBOb2RlW2kgKyAxXTsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIGMsIDAsIGNoaWxkcmVuLmxlbmd0aCk7CisgICAgICBjaGlsZHJlbiA9IGM7CisgICAgfQorICAgIGNoaWxkcmVuW2ldID0gbjsKKyAgfQorCisgIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKSB7CisgICAgcmV0dXJuIGNoaWxkcmVuW2ldOworICB9CisKKyAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpIHsKKyAgICByZXR1cm4gKGNoaWxkcmVuID09IG51bGwpID8gMCA6IGNoaWxkcmVuLmxlbmd0aDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGpqdFNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeyB0aGlzLnZhbHVlID0gdmFsdWU7IH0KKyAgcHVibGljIE9iamVjdCBqanRHZXRWYWx1ZSgpIHsgcmV0dXJuIHZhbHVlOyB9CisKKyAgLyogWW91IGNhbiBvdmVycmlkZSB0aGVzZSB0d28gbWV0aG9kcyBpbiBzdWJjbGFzc2VzIG9mIFNpbXBsZU5vZGUgdG8KKyAgICAgY3VzdG9taXplIHRoZSB3YXkgdGhlIG5vZGUgYXBwZWFycyB3aGVuIHRoZSB0cmVlIGlzIGR1bXBlZC4gIElmCisgICAgIHlvdXIgb3V0cHV0IHVzZXMgbW9yZSB0aGFuIG9uZSBsaW5lIHlvdSBzaG91bGQgb3ZlcnJpZGUKKyAgICAgdG9TdHJpbmcoU3RyaW5nKSwgb3RoZXJ3aXNlIG92ZXJyaWRpbmcgdG9TdHJpbmcoKSBpcyBwcm9iYWJseSBhbGwKKyAgICAgeW91IG5lZWQgdG8gZG8uICovCisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIFF1ZXJ5UGFyc2VyVHJlZUNvbnN0YW50cy5qanROb2RlTmFtZVtpZF07IH0KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgcHJlZml4KSB7IHJldHVybiBwcmVmaXggKyB0b1N0cmluZygpOyB9CisKKyAgLyogT3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8gY3VzdG9taXplIGhvdyB0aGUgbm9kZSBkdW1wcworICAgICBvdXQgaXRzIGNoaWxkcmVuLiAqLworCisgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b1N0cmluZyhwcmVmaXgpKTsKKyAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgeworICAgICAgICBTaW1wbGVOb2RlIG4gPSAoU2ltcGxlTm9kZSljaGlsZHJlbltpXTsKKyAgICAgICAgaWYgKG4gIT0gbnVsbCkgeworICAgICAgICAgIG4uZHVtcChwcmVmaXggKyAiICIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09MDQwZTZkY2ZjODNhOGU5ZDIwNDkxNjZlZTMxMDU0ZjMgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvVG9rZW4uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9xdWVyeS9wYXJzZXIvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE4YmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuLmphdmEgVmVyc2lvbiA1LjAgKi8KKy8qIEphdmFDQ09wdGlvbnM6VE9LRU5fRVhURU5EUz0sS0VFUF9MSU5FX0NPTD1udWxsLFNVUFBPUlRfQ0xBU1NfVklTSUJJTElUWV9QVUJMSUM9dHJ1ZSAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyOworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgorICovCisKK3B1YmxpYyBjbGFzcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKworICAvKioKKyAgICogVGhlIHZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhpcyBTZXJpYWxpemFibGUgY2xhc3MuCisgICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZQorICAgKiBjbGFzcyBjaGFuZ2VzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgLyoqCisgICAqIEFuIGludGVnZXIgdGhhdCBkZXNjcmliZXMgdGhlIGtpbmQgb2YgdGhpcyB0b2tlbi4gIFRoaXMgbnVtYmVyaW5nCisgICAqIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGJ5IEphdmFDQ1BhcnNlciwgYW5kIGEgdGFibGUgb2YgdGhlc2UgbnVtYmVycyBpcworICAgKiBzdG9yZWQgaW4gdGhlIGZpbGUgLi4uQ29uc3RhbnRzLmphdmEuCisgICAqLworICBwdWJsaWMgaW50IGtpbmQ7CisKKyAgLyoqIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgVG9rZW4uICovCisgIHB1YmxpYyBpbnQgYmVnaW5MaW5lOworICAvKiogVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIFRva2VuLiAqLworICBwdWJsaWMgaW50IGJlZ2luQ29sdW1uOworICAvKiogVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIFRva2VuLiAqLworICBwdWJsaWMgaW50IGVuZExpbmU7CisgIC8qKiBUaGUgY29sdW1uIG51bWJlciBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyBUb2tlbi4gKi8KKyAgcHVibGljIGludCBlbmRDb2x1bW47CisKKyAgLyoqCisgICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBpbWFnZTsKKworICAvKioKKyAgICogQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuIGZyb20gdGhlIGlucHV0CisgICAqIHN0cmVhbS4gIElmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBpZiB0aGUKKyAgICogdG9rZW4gbWFuYWdlciBoYXMgbm90IHJlYWQgdG9rZW5zIGJleW9uZCB0aGlzIG9uZSwgdGhpcyBmaWVsZCBpcworICAgKiBzZXQgdG8gbnVsbC4gIFRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoaXMgdG9rZW4gaXMgYWxzbyBhIHJlZ3VsYXIKKyAgICogdG9rZW4uICBPdGhlcndpc2UsIHNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YKKyAgICogdGhpcyBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBuZXh0OworCisgIC8qKgorICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gYWNjZXNzIHNwZWNpYWwgdG9rZW5zIHRoYXQgb2NjdXIgcHJpb3IgdG8gdGhpcworICAgKiB0b2tlbiwgYnV0IGFmdGVyIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuLgorICAgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBzcGVjaWFsIHRva2VucywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gbnVsbC4KKyAgICogV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdWNoIHNwZWNpYWwgdG9rZW4sIHRoaXMgZmllbGQgcmVmZXJzCisgICAqIHRvIHRoZSBsYXN0IG9mIHRoZXNlIHNwZWNpYWwgdG9rZW5zLCB3aGljaCBpbiB0dXJuIHJlZmVycyB0byB0aGUgbmV4dAorICAgKiBwcmV2aW91cyBzcGVjaWFsIHRva2VuIHRocm91Z2ggaXRzIHNwZWNpYWxUb2tlbiBmaWVsZCwgYW5kIHNvIG9uCisgICAqIHVudGlsIHRoZSBmaXJzdCBzcGVjaWFsIHRva2VuICh3aG9zZSBzcGVjaWFsVG9rZW4gZmllbGQgaXMgbnVsbCkuCisgICAqIFRoZSBuZXh0IGZpZWxkcyBvZiBzcGVjaWFsIHRva2VucyByZWZlciB0byBvdGhlciBzcGVjaWFsIHRva2VucyB0aGF0CisgICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBpdCAod2l0aG91dCBhbiBpbnRlcnZlbmluZyByZWd1bGFyIHRva2VuKS4gIElmIHRoZXJlCisgICAqIGlzIG5vIHN1Y2ggdG9rZW4sIHRoaXMgZmllbGQgaXMgbnVsbC4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBzcGVjaWFsVG9rZW47CisKKyAgLyoqCisgICAqIEFuIG9wdGlvbmFsIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgVG9rZW4uCisgICAqIFRva2VucyB3aGljaCBhcmUgbm90IHVzZWQgYXMgc3ludGFjdGljIHN1Z2FyIHdpbGwgb2Z0ZW4gY29udGFpbgorICAgKiBtZWFuaW5nZnVsIHZhbHVlcyB0aGF0IHdpbGwgYmUgdXNlZCBsYXRlciBvbiBieSB0aGUgY29tcGlsZXIgb3IKKyAgICogaW50ZXJwcmV0ZXIuIFRoaXMgYXR0cmlidXRlIHZhbHVlIGlzIG9mdGVuIGRpZmZlcmVudCBmcm9tIHRoZSBpbWFnZS4KKyAgICogQW55IHN1YmNsYXNzIG9mIFRva2VuIHRoYXQgYWN0dWFsbHkgd2FudHMgdG8gcmV0dXJuIGEgbm9uLW51bGwgdmFsdWUgY2FuCisgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIGFwcHJvcHJpYXRlLgorICAgKi8KKyAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBOby1hcmd1bWVudCBjb25zdHJ1Y3RvcgorICAgKi8KKyAgcHVibGljIFRva2VuKCkge30KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB0b2tlbiBmb3IgdGhlIHNwZWNpZmllZCBJbWFnZS4KKyAgICovCisgIHB1YmxpYyBUb2tlbihpbnQga2luZCkKKyAgeworICAgIHRoaXMoa2luZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB0b2tlbiBmb3IgdGhlIHNwZWNpZmllZCBJbWFnZSBhbmQgS2luZC4KKyAgICovCisgIHB1YmxpYyBUb2tlbihpbnQga2luZCwgU3RyaW5nIGltYWdlKQorICB7CisgICAgdGhpcy5raW5kID0ga2luZDsKKyAgICB0aGlzLmltYWdlID0gaW1hZ2U7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW1hZ2UuCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgeworICAgIHJldHVybiBpbWFnZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQorICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgorICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KKyAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAorICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1wbHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKKyAgICoKKyAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbihvZktpbmQsIGltYWdlKTsKKyAgICoKKyAgICogdG8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LiBUaGVuIHlvdSBjYW4gY2FzdCBtYXRjaGVkVG9rZW4KKyAgICogdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgYW5kIHVzZSBzaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCisgICAqLworICBwdWJsaWMgc3RhdGljIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQsIFN0cmluZyBpbWFnZSkKKyAgeworICAgIHN3aXRjaChvZktpbmQpCisgICAgeworICAgICAgZGVmYXVsdCA6IHJldHVybiBuZXcgVG9rZW4ob2ZLaW5kLCBpbWFnZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQorICB7CisgICAgcmV0dXJuIG5ld1Rva2VuKG9mS2luZCwgbnVsbCk7CisgIH0KKworfQorLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT1hNzFiODMwNzY4YjhiN2RmNDgxNzIyY2U5Mzc3NWRjMyAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9Ub2tlbk1nckVycm9yLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcXVlcnkvcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmMTVjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3F1ZXJ5L3BhcnNlci9Ub2tlbk1nckVycm9yLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW5NZ3JFcnJvci5qYXZhIFZlcnNpb24gNS4wICovCisvKiBKYXZhQ0NPcHRpb25zOiAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyOworCisvKiogVG9rZW4gTWFuYWdlciBFcnJvci4gKi8KK3B1YmxpYyBjbGFzcyBUb2tlbk1nckVycm9yIGV4dGVuZHMgRXJyb3IKK3sKKworICAvKioKKyAgICogVGhlIHZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhpcyBTZXJpYWxpemFibGUgY2xhc3MuCisgICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZQorICAgKiBjbGFzcyBjaGFuZ2VzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgLyoKKyAgICogT3JkaW5hbHMgZm9yIHZhcmlvdXMgcmVhc29ucyB3aHkgYW4gRXJyb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSB0aHJvd24uCisgICAqLworCisgIC8qKgorICAgKiBMZXhpY2FsIGVycm9yIG9jY3VycmVkLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKKworICAvKioKKyAgICogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBjcmVhdGUgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgYSBzdGF0aWMgdG9rZW4gbWFuYWdlci4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0xFWEVSX0VSUk9SID0gMTsKKworICAvKioKKyAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKKworICAvKioKKyAgICogRGV0ZWN0ZWQgKGFuZCBiYWlsZWQgb3V0IG9mKSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSB0b2tlbiBtYW5hZ2VyLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKKworICAvKioKKyAgICogSW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBJdCB3aWxsIGhhdmUKKyAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KKyAgICovCisgIGludCBlcnJvckNvZGU7CisKKyAgLyoqCisgICAqIFJlcGxhY2VzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYnkgdGhlaXIgZXNjYXBlZCAob3IgdW5pY29kZSBlc2NhcGVkKQorICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBhZGRFc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGNoYXIgY2g7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgeworICAgICAgICBjYXNlIDAgOgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7CisgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKKyAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCisgICAqIFBhcmFtZXRlcnMgOgorICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2FsIGVycm9yCisgICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VycmVkCisgICAqICAgIGVycm9yTGluZSAgIDogbGluZSBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJyZWQKKyAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkCisgICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJyZWQKKyAgICogICAgY3VyY2hhciAgICAgOiB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcgorICAgKiBOb3RlOiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgbGV4aWNhbCBlcnJvciBtZXNzYWdlIGJ5IG1vZGlmeWluZyB0aGlzIG1ldGhvZC4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIExleGljYWxFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKSB7CisgICAgcmV0dXJuKCJMZXhpY2FsIGVycm9yIGF0IGxpbmUgIiArCisgICAgICAgICAgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKworICAgICAgICAgIGVycm9yQ29sdW1uICsgIi4gIEVuY291bnRlcmVkOiAiICsKKyAgICAgICAgICAoRU9GU2VlbiA/ICI8RU9GPiAiIDogKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArIChpbnQpY3VyQ2hhciArICIpLCAiKSArCisgICAgICAgICAgImFmdGVyIDogXCIiICsgYWRkRXNjYXBlcyhlcnJvckFmdGVyKSArICJcIiIpOworICB9CisKKyAgLyoqCisgICAqIFlvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgbWVzc2FnZXMuCisgICAqIEZvciBleGFtcGxlLCBjYXNlcyBsaWtlIExPT1BfREVURUNURUQgYW5kIElOVkFMSURfTEVYSUNBTF9TVEFURSBhcmUgbm90CisgICAqIG9mIGVuZC11c2VycyBjb25jZXJuLCBzbyB5b3UgY2FuIHJldHVybiBzb21ldGhpbmcgbGlrZSA6CisgICAqCisgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCisgICAqCisgICAqIGZyb20gdGhpcyBtZXRob2QgZm9yIHN1Y2ggY2FzZXMgaW4gdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIHBhcnNlci4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICB9CisKKyAgLyoKKyAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCisgICAqLworCisgIC8qKiBObyBhcmcgY29uc3RydWN0b3IuICovCisgIHB1YmxpYyBUb2tlbk1nckVycm9yKCkgeworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yIHdpdGggbWVzc2FnZSBhbmQgcmVhc29uLiAqLworICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IHJlYXNvbikgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKKyAgfQorCisgIC8qKiBGdWxsIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyLCBpbnQgcmVhc29uKSB7CisgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOworICB9Cit9CisvKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPWFhNGE0OTkxMTRlOTBkMGQ1NTk5NzUyOWU0OGY1ZWJlIChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9DYXRhbG9nUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvQ2F0YWxvZ1JlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI5MGUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvQ2F0YWxvZ1JlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogICAgICAgICAgPHA+CisgKiAgICAgICAgICBSZXBvc2l0b3J5IHdoZXJlIHRoZSBDYXRhbG9nU2VydmljZSBzdG9yZXMgaXRzIFRyYW5zYWN0aW9uSWQgTWFwcGluZworICogICAgICAgICAgYW5kIHNlcmlhbGl6ZXMgaXRzIENhdGFsb2dzCisgKiAgICAgICAgICA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBDYXRhbG9nUmVwb3NpdG9yeSB7CisvLworLy8JLyoqCisvLwkgKiBWZXJpZmllcyBpZiB0aGUgZ2l2ZW4gQ2F0YWxvZyBVUk4gaGFzIGJlZW4gc2VyaWFsaXplZCB2aWEge0BsaW5rCisvLwkgKiBzZXJpYWxpemVDYXRhbG9nKENhdGFsb2cpfQorLy8JICogCisvLwkgKiBAcGFyYW0gY2F0YWxvZ1VybgorLy8JICogICAgICAgICAgICBUaGUgVVJOIHRoYXQgdW5pcXVlIHJlcHJlc2VudHMgdGhlIENhdGFsb2cKKy8vCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgQ2F0YWxvZyBoYXMgYmVlbiBzZXJpYWxpemVkLCBmYWxzZSBvdGhlcndpc2UKKy8vCSAqIEB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24KKy8vCSAqICAgICAgICAgICAgIEFueSBFcnJvcgorLy8JICovCisvLwlwdWJsaWMgYm9vbGVhbiBpc0NhdGFsb2dTZXJpYWxpemVkKFN0cmluZyBjYXRhbG9nVXJuKQorLy8JCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisvLworCS8qKgorCSAqIFNlcmlhbGl6ZXMgYSBnaXZlbiBDYXRhbG9nIHRvIHRoZSBSZXBvc2l0b3J5CisJICogCisJICogQHBhcmFtIGNhdGFsb2cKKwkgKiAgICAgICAgICAgIFRoZSBDYXRhbG9nIHRvIGJlIHNlcmlhbGl6ZWQKKwkgKiBAdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uCisJICogICAgICAgICAgICAgQW55IEVycm9yCisJICovCisJcHVibGljIHZvaWQgc2VyaWFsaXplQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisvLworLy8JLyoqCisvLwkgKiBMb2FkcyBhIENhdGFsb2cgZnJvbSB0aGUgUmVwb3NpdG9yeQorLy8JICogCisvLwkgKiBAcGFyYW0gY2F0YWxvZ1VybgorLy8JICogICAgICAgICAgICBUaGUgVVJOIHRoYXQgdW5pcXVlIHJlcHJlc2VudHMgYSBDYXRhbG9nCisvLwkgKiBAcmV0dXJuIFRoZSBDYXRhbG9nIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBVUk4KKy8vCSAqIEB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24KKy8vCSAqICAgICAgICAgICAgIEFueSBFcnJvcgorLy8JICovCisvLwlwdWJsaWMgQ2F0YWxvZyBkZXNlcmlhbGl6ZUNhdGFsb2coU3RyaW5nIGNhdGFsb2dVcm4pCisvLwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKy8vCisJLyoqCisJICogUmVtb3ZlcyBhIENhdGFsb2cgZnJvbSB0aGUgUmVwb3NpdG9yeQorCSAqIAorCSAqIEBwYXJhbSBjYXRhbG9nVXJuCisJICogICAgICAgICAgICBUaGUgVVJOIHRoYXQgdW5pcXVlIHJlcHJlc2VudHMgdGhlIENhdGFsb2cgdG8gYmUgcmVtb3ZlZAorCSAqIEBwYXJhbSBwcmVzZXJ2ZU1hcHBpbmcKKwkgKiAgICAgICAgICAgIElmIHRydWUsIGRvbid0IGVyYXNlIFRyYW5zYWN0aW9uSWQgbWFwcGluZyBmb3IgdGhpcyBjYXRhbG9nCisJICogQHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIEFueSBFcnJvcgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcmlhbGl6ZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCisJLyoqCisJICogTG9hZHMgYWxsIENhdGFsb2dzIHNlcmlhbGl6ZWQgaW4gdGhpcyBSZXBvc2l0b3J5CisJICogCisJICogQHJldHVybiBBbGwgdGhlIENhdGFsb2dzIHNlcmlhbGl6ZWQgaW4gdGhpcyBSZXBvc2l0b3J5CisJICogQHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIEFueSBFcnJvcgorCSAqLworCXB1YmxpYyBTZXQ8Q2F0YWxvZz4gZGVzZXJpYWxpemVBbGxDYXRhbG9ncygpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCBzZXJpYWxpemVQbHVnaW5VUkxzKExpc3Q8UGx1Z2luVVJMPiB1cmxzKSAKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgTGlzdDxQbHVnaW5VUkw+IGRlc2VyaWFsaXplUGx1Z2luVVJMcygpIAorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCQorCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9yZXBvc2l0b3J5L0NhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3MTE1NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9yZXBvc2l0b3J5L0NhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBGYWN0b3J5IGZvciBjcmVhdGluZyBDYXRhbG9nUmVwb3NpdG9yeQorICogPHA+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IHsKKworCXB1YmxpYyBDYXRhbG9nUmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KCkgdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvTWVtb3J5QmFzZWRDYXRhbG9nUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvTWVtb3J5QmFzZWRDYXRhbG9nUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODJlOTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9NZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogICAgICAgICAgPHA+CisgKiAgICAgICAgICBNZW1vcnkgYmFzZWQgUmVwb3NpdG9yeSB3aGVyZSB0aGUgQ2F0YWxvZ1NlcnZpY2Ugc3RvcmVzIGl0cworICogICAgICAgICAgVHJhbnNhY3Rpb25JZCBNYXBwaW5nIGFuZCBzZXJpYWxpemVzIGl0cyBDYXRhbG9ncworICogICAgICAgICAgPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5IGltcGxlbWVudHMgQ2F0YWxvZ1JlcG9zaXRvcnkgeworCQorCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQ2F0YWxvZz4gY2F0YWxvZ01hcDsKKwlwcm90ZWN0ZWQgTGlzdDxQbHVnaW5VUkw+IGNsYXNzTG9hZGVyVXJsczsKKworCXB1YmxpYyBNZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5KCkgeworCQl0aGlzLmNhdGFsb2dNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENhdGFsb2c+KCk7CisJCXRoaXMuY2xhc3NMb2FkZXJVcmxzID0gbmV3IFZlY3RvcjxQbHVnaW5VUkw+KCk7CisJfQorCQorCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWVvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5DYXRhbG9nUmVwb3NpdG9yeSMKKwkgKiBkZWxldGVTZXJpYWxpemVkQ2F0YWxvZyhqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcmlhbGl6ZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJdGhpcy5jYXRhbG9nTWFwLnJlbW92ZShjYXRhbG9nVXJuKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2Vlb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuQ2F0YWxvZ1JlcG9zaXRvcnkjCisJICogZGVzZXJpYWxpemVBbGxDYXRhbG9ncygpCisJICovCisJcHVibGljIFNldDxDYXRhbG9nPiBkZXNlcmlhbGl6ZUFsbENhdGFsb2dzKCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgSGFzaFNldDxDYXRhbG9nPih0aGlzLmNhdGFsb2dNYXAudmFsdWVzKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5DYXRhbG9nUmVwb3NpdG9yeSNkZXNlcmlhbGl6ZUNhdGFsb2cKKwkgKiAoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZyBkZXNlcmlhbGl6ZUNhdGFsb2coU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jYXRhbG9nTWFwLmdldChjYXRhbG9nVXJuKTsKKwl9CisJCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZW9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5IworCSAqIGlzQ2F0YWxvZ1NlcmlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NhdGFsb2dTZXJpYWxpemVkKFN0cmluZyBjYXRhbG9nVXJuKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY2F0YWxvZ01hcC5jb250YWluc0tleShjYXRhbG9nVXJuKTsKKwl9CisJCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZQorCSAqIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5I3NlcmlhbGl6ZUNhdGFsb2cKKwkgKiAob3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLkNhdGFsb2cpCisJICovCisJcHVibGljIHZvaWQgc2VyaWFsaXplQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQl0aGlzLmNhdGFsb2dNYXAucHV0KGNhdGFsb2cuZ2V0SWQoKSwgY2F0YWxvZyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZVBsdWdpblVSTHMoTGlzdDxQbHVnaW5VUkw+IHVybHMpIAorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJdGhpcy5jbGFzc0xvYWRlclVybHMuYWRkQWxsKHVybHMpOworCX0KKworCXB1YmxpYyBMaXN0PFBsdWdpblVSTD4gZGVzZXJpYWxpemVQbHVnaW5VUkxzKCkgCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFZlY3RvcjxQbHVnaW5VUkw+KHRoaXMuY2xhc3NMb2FkZXJVcmxzKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9yZXBvc2l0b3J5L01lbW9yeUJhc2VkQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9NZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjUwNjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9NZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBGYWN0b3J5IGZvciBjcmVhdGluZyBNZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5CisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIE1lbW9yeUJhc2VkQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMKKwkJQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IHsKKworCXB1YmxpYyBNZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5IGNyZWF0ZVJlcG9zaXRvcnkoKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBNZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9TZXJpYWxpemVkQ2F0YWxvZ1JlcG9zaXRvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9yZXBvc2l0b3J5L1NlcmlhbGl6ZWRDYXRhbG9nUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzAyODAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9TZXJpYWxpemVkQ2F0YWxvZ1JlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy51dGlsLlBsdWdpblVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5TZXJpYWxpemVyOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQ2F0YWxvZyBSZXBvc2l0b3J5IHRoYXQgc2VyaWFsaXplcyBDYXRhbG9ncyB2aWEgWFN0cmVhbSB1dGlsaXR5CisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFNlcmlhbGl6ZWRDYXRhbG9nUmVwb3NpdG9yeSBpbXBsZW1lbnRzIENhdGFsb2dSZXBvc2l0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNlcmlhbGl6ZWRDYXRhbG9nUmVwb3NpdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCXByb3RlY3RlZCBTdHJpbmcgc3RvcmFnZURpcjsKKwkKKwlwdWJsaWMgU2VyaWFsaXplZENhdGFsb2dSZXBvc2l0b3J5KFN0cmluZyBzdG9yYWdlRGlyKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLnN0b3JhZ2VEaXIgPSBzdG9yYWdlRGlyOworCQkJbmV3IEZpbGUodGhpcy5zdG9yYWdlRGlyICsgIi9jYXRhbG9ncyIpLm1rZGlycygpOworCQkJbmV3IEZpbGUodGhpcy5zdG9yYWdlRGlyICsgIi9jbGFzc2xvYWRlcnMiKS5ta2RpcnMoKTsKKwkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBTZXJpYWxpemVkQ2F0YWxvZ1JlcG9zaXRvcnkgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5NZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5I2RlbGV0ZVNlcmlhbGl6ZWRDYXRhbG9nKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlU2VyaWFsaXplZENhdGFsb2coU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlMT0cubG9nKExldmVsLklORk8sICJEZWxldGluZyBDYXRhbG9nOiAnIiArIGNhdGFsb2dVcm4gKyAiJyAuIC4gLiAiKTsKKwkJYm9vbGVhbiBjYXRhbG9nRmlsZURlbGV0ZSA9IHRoaXMuZ2V0Q2F0YWxvZ0ZpbGUoY2F0YWxvZ1VybikuZGVsZXRlKCk7CisJCWlmICghY2F0YWxvZ0ZpbGVEZWxldGUpCisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24oIkZhaWxlZCB0byBkZXNlcmlhbGl6ZSBjYXRhbG9nICciICsgY2F0YWxvZ1VybiArICInLCBkZWxldGUgZmlsZXMgcmV0dXJuZWQgZmFsc2UiKTsKKwkJZWxzZSAKKwkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlN1Y2Nlc3NmdWxseSBkZWxldGluZyBDYXRhbG9nOiAnIiArIGNhdGFsb2dVcm4gKyAiJyIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuTWVtb3J5QmFzZWRDYXRhbG9nUmVwb3NpdG9yeSNkZXNlcmlhbGl6ZUNhdGFsb2coamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZyBkZXNlcmlhbGl6ZUNhdGFsb2coU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlMT0cubG9nKExldmVsLklORk8sICJEZXNlcmlhbGl6aW5nIENhdGFsb2c6ICIgKyBjYXRhbG9nVXJuKTsKKwkJRmlsZUlucHV0U3RyZWFtIGNhdGFsb2dJbiA9IG51bGw7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZU9iamVjdChDYXRhbG9nLmNsYXNzLCBjYXRhbG9nSW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoaXMuZ2V0Q2F0YWxvZ0ZpbGUoY2F0YWxvZ1VybikpKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKCJGYWlsZWQgdG8gRGVzZXJpYWxpemVkIENhdGFsb2dzIGZyb20gJyIgKyB0aGlzLnN0b3JhZ2VEaXIgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY2F0YWxvZ0luLmNsb3NlKCk7CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCQorCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuTWVtb3J5QmFzZWRDYXRhbG9nUmVwb3NpdG9yeSNkZXNlcmlhbGl6ZUFsbENhdGFsb2dzKCkKKwkgKi8KKwlwdWJsaWMgU2V0PENhdGFsb2c+IGRlc2VyaWFsaXplQWxsQ2F0YWxvZ3MoKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJSGFzaFNldDxDYXRhbG9nPiBjYXRhbG9ncyA9IG5ldyBIYXNoU2V0PENhdGFsb2c+KCk7CisJCWZvciAoU3RyaW5nIGNhdGFsb2dGaWxlIDogbmV3IEZpbGUodGhpcy5zdG9yYWdlRGlyICsgIi9jYXRhbG9ncyIpLmxpc3QoKSkgeworCQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5kZXNlcmlhbGl6ZUNhdGFsb2coY2F0YWxvZ0ZpbGUuc3BsaXQoIlxcLnNlciIpWzBdKTsKKwkJCWNhdGFsb2dzLmFkZChjYXRhbG9nKTsKKwkJfQorCQlyZXR1cm4gY2F0YWxvZ3M7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5NZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5I2lzQ2F0YWxvZ1NlcmlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NhdGFsb2dTZXJpYWxpemVkKFN0cmluZyBjYXRhbG9nVXJuKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ0ZpbGUoY2F0YWxvZ1VybikuZXhpc3RzKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5NZW1vcnlCYXNlZENhdGFsb2dSZXBvc2l0b3J5I3NlcmlhbGl6ZUNhdGFsb2cob3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLkNhdGFsb2cpCisJICovCisJcHVibGljIHZvaWQgc2VyaWFsaXplQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlMT0cubG9nKExldmVsLklORk8sICJTZXJpYWxpemluZyBDYXRhbG9nOiAiICsgY2F0YWxvZy5nZXRJZCgpKTsKKwkJRmlsZU91dHB1dFN0cmVhbSBjYXRhbG9nT3V0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vc2VyaWFsaXplIENhdGFsb2cKKwkJCW5ldyBTZXJpYWxpemVyKCkuc2VyaWFsaXplT2JqZWN0KGNhdGFsb2csIChjYXRhbG9nT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhpcy5nZXRDYXRhbG9nRmlsZVdvcmtlcihjYXRhbG9nLmdldElkKCkpKSkpOworCQkJaWYgKHRoaXMuZ2V0Q2F0YWxvZ0ZpbGUoY2F0YWxvZy5nZXRJZCgpKS5leGlzdHMoKSkKKwkJCQlGaWxlVXRpbHMuY29weUZpbGUodGhpcy5nZXRDYXRhbG9nRmlsZShjYXRhbG9nLmdldElkKCkpLCB0aGlzLmdldENhdGFsb2dGaWxlQmt1cChjYXRhbG9nLmdldElkKCkpLCB0cnVlKTsKKwkJCUZpbGVVdGlscy5jb3B5RmlsZSh0aGlzLmdldENhdGFsb2dGaWxlV29ya2VyKGNhdGFsb2cuZ2V0SWQoKSksIHRoaXMuZ2V0Q2F0YWxvZ0ZpbGUoY2F0YWxvZy5nZXRJZCgpKSwgdHJ1ZSk7CisJCQl0aGlzLmdldENhdGFsb2dGaWxlV29ya2VyKGNhdGFsb2cuZ2V0SWQoKSkuZGVsZXRlKCk7CisJCQl0aGlzLmdldENhdGFsb2dGaWxlQmt1cChjYXRhbG9nLmdldElkKCkpLmRlbGV0ZSgpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24oIkZhaWxlZCB0byBTZXJpYWxpemVkIENhdGFsb2dzIHRvICciICsgdGhpcy5zdG9yYWdlRGlyICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCWNhdGFsb2dPdXQuY2xvc2UoKTsKKwkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCX0JCisJfQorCQorCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZVBsdWdpblVSTHMoTGlzdDxQbHVnaW5VUkw+IHVybHMpIAorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJRmlsZU91dHB1dFN0cmVhbSB1cmxzT3V0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vc2VyaWFsaXplIFVSTHMKKwkJCW5ldyBTZXJpYWxpemVyKCkuc2VyaWFsaXplT2JqZWN0KHVybHMsICh1cmxzT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhpcy5nZXRDbGFzc0xvYWRlclVybHNGaWxlV29ya2VyKCkpKSk7CisJCQlpZiAodGhpcy5nZXRDbGFzc0xvYWRlclVybHNGaWxlKCkuZXhpc3RzKCkpCisJCQkJRmlsZVV0aWxzLmNvcHlGaWxlKHRoaXMuZ2V0Q2xhc3NMb2FkZXJVcmxzRmlsZSgpLCB0aGlzLmdldENsYXNzTG9hZGVyVXJsc0ZpbGVCa3VwKCksIHRydWUpOworCQkJRmlsZVV0aWxzLmNvcHlGaWxlKHRoaXMuZ2V0Q2xhc3NMb2FkZXJVcmxzRmlsZVdvcmtlcigpLCB0aGlzLmdldENsYXNzTG9hZGVyVXJsc0ZpbGUoKSwgdHJ1ZSk7CisJCQl0aGlzLmdldENsYXNzTG9hZGVyVXJsc0ZpbGVXb3JrZXIoKS5kZWxldGUoKTsKKwkJCXRoaXMuZ2V0Q2xhc3NMb2FkZXJVcmxzRmlsZUJrdXAoKS5kZWxldGUoKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKCJGYWlsZWQgdG8gU2VyaWFsaXplZCBDbGFzc0xvYWRlciBVUkxzIHRvICciICsgdGhpcy5zdG9yYWdlRGlyICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCXVybHNPdXQuY2xvc2UoKTsKKwkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCX0JCisJfQorCisJcHVibGljIExpc3Q8UGx1Z2luVVJMPiBkZXNlcmlhbGl6ZVBsdWdpblVSTHMoKSB0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlGaWxlSW5wdXRTdHJlYW0gdXJsc0luID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmICh0aGlzLmdldENsYXNzTG9hZGVyVXJsc0ZpbGUoKS5leGlzdHMoKSkKKwkJCQlyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCAodXJsc0luID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGlzLmdldENsYXNzTG9hZGVyVXJsc0ZpbGUoKSkpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbigiRmFpbGVkIHRvIERlc2VyaWFsaXplZCBBbGwgQ2xhc3NMb2FkZXIgVVJMcyBmcm9tICciICsgdGhpcy5zdG9yYWdlRGlyICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCXVybHNJbi5jbG9zZSgpOworCQkJfWNhdGNoIChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIAorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJvdGVjdGVkIEZpbGUgZ2V0Q2F0YWxvZ0ZpbGUoU3RyaW5nIGNhdGFsb2dVcm4pIHsKKwkJcmV0dXJuIG5ldyBGaWxlKHRoaXMuc3RvcmFnZURpciArICIvY2F0YWxvZ3MvIiArIGNhdGFsb2dVcm4gKyAiLnNlciIpOworCX0KKworCXByb3RlY3RlZCBGaWxlIGdldENhdGFsb2dGaWxlQmt1cChTdHJpbmcgY2F0YWxvZ1VybikgeworCQlyZXR1cm4gbmV3IEZpbGUodGhpcy5zdG9yYWdlRGlyICsgIi9jYXRhbG9ncy8iICsgY2F0YWxvZ1VybiArICIuc2VyLWJrdXAiKTsKKwl9CisJCisJcHJvdGVjdGVkIEZpbGUgZ2V0Q2F0YWxvZ0ZpbGVXb3JrZXIoU3RyaW5nIGNhdGFsb2dVcm4pIHsKKwkJcmV0dXJuIG5ldyBGaWxlKHRoaXMuc3RvcmFnZURpciArICIvY2F0YWxvZ3MvIiArIGNhdGFsb2dVcm4gKyAiLnNlci13b3JrZXIiKTsKKwl9CisJCisJcHJvdGVjdGVkIEZpbGUgZ2V0Q2xhc3NMb2FkZXJVcmxzRmlsZSgpIHsKKwkJcmV0dXJuIG5ldyBGaWxlKHRoaXMuc3RvcmFnZURpciArICIvY2xhc3Nsb2FkZXJzL3VybHMuc2VyIik7CisJfQorCQorCXByb3RlY3RlZCBGaWxlIGdldENsYXNzTG9hZGVyVXJsc0ZpbGVCa3VwKCkgeworCQlyZXR1cm4gbmV3IEZpbGUodGhpcy5zdG9yYWdlRGlyICsgIi9jbGFzc2xvYWRlcnMvdXJscy5zZXItYmt1cCIpOworCX0KKwkKKwlwcm90ZWN0ZWQgRmlsZSBnZXRDbGFzc0xvYWRlclVybHNGaWxlV29ya2VyKCkgeworCQlyZXR1cm4gbmV3IEZpbGUodGhpcy5zdG9yYWdlRGlyICsgIi9jbGFzc2xvYWRlcnMvdXJscy5zZXItd29ya2VyIik7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvU2VyaWFsaXplZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvU2VyaWFsaXplZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDdiNDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9TZXJpYWxpemVkQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5OworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBGYWN0b3J5IGZvciBjcmVhdGluZyBTZXJpYWxpemVkTWVtb3J5QmFzZWRDYXRhbG9nUmVwb3NpdG9yeQorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBTZXJpYWxpemVkQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMgQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IHsKKworCXByb3RlY3RlZCBTdHJpbmcgc3RvcmFnZURpcjsKKworCXB1YmxpYyBTZXJpYWxpemVkQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5KCkge30KKwkKKwlAUmVxdWlyZWQKKwlwdWJsaWMgdm9pZCBzZXRTdG9yYWdlRGlyKFN0cmluZyBzdG9yYWdlRGlyKSB7CisJCXRoaXMuc3RvcmFnZURpciA9IHN0b3JhZ2VEaXI7CisJfQorCisJcHVibGljIFNlcmlhbGl6ZWRDYXRhbG9nUmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFNlcmlhbGl6ZWRDYXRhbG9nUmVwb3NpdG9yeShQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQodGhpcy5zdG9yYWdlRGlyKSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBTZXJpYWxpemVkIENhdGFsb2cgUmVwb3NpdG9yeSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9yZXBvc2l0b3J5L1NwcmluZ0NhdGFsb2dSZXBvc2l0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9TcHJpbmdDYXRhbG9nUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OGY3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9TcHJpbmdDYXRhbG9nUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy51dGlsLlBsdWdpblVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5TZXJpYWxpemVyOworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgU3ByaW5nIEZyYW1ld29yayBiYXNlZCBDYXRhbG9nUmVwb3NpdG9yeQorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdDYXRhbG9nUmVwb3NpdG9yeSBpbXBsZW1lbnRzIENhdGFsb2dSZXBvc2l0b3J5IHsKKworCXByb3RlY3RlZCBTdHJpbmcgYmVhblJlcG87CisJCisJcHVibGljIFNwcmluZ0NhdGFsb2dSZXBvc2l0b3J5KFN0cmluZyBiZWFuUmVwbykgeworCQl0aGlzLmJlYW5SZXBvID0gYmVhblJlcG87CisJfQorCQorCXB1YmxpYyBTZXQ8Q2F0YWxvZz4gZGVzZXJpYWxpemVBbGxDYXRhbG9ncygpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQl0cnkgeworCSAgICAgICAgRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0ID0gbmV3IEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQobmV3IFN0cmluZ1tdIHsgdGhpcy5iZWFuUmVwbyB9LCBmYWxzZSk7CisJICAgICAgICBhcHBDb250ZXh0LnNldENsYXNzTG9hZGVyKG5ldyBTZXJpYWxpemVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisJICAgICAgICBhcHBDb250ZXh0LnJlZnJlc2goKTsKKwkgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDYXRhbG9nPihhcHBDb250ZXh0LmdldEJlYW5zT2ZUeXBlKENhdGFsb2cuY2xhc3MpLnZhbHVlcygpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGVTZXJpYWxpemVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybikKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbigiTW9kaWZpY2F0aW9uIG5vdCBhbGxvd2VkIGR1cmluZyBydW50aW1lIik7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZUNhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKQorCQkJdGhyb3dzIENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IENhdGFsb2dSZXBvc2l0b3J5RXhjZXB0aW9uKCJNb2RpZmljYXRpb24gbm90IGFsbG93ZWQgZHVyaW5nIHJ1bnRpbWUiKTsJCQorCX0KKworCXB1YmxpYyBMaXN0PFBsdWdpblVSTD4gZGVzZXJpYWxpemVQbHVnaW5VUkxzKCkKKwkJCXRocm93cyBDYXRhbG9nUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZVBsdWdpblVSTHMoTGlzdDxQbHVnaW5VUkw+IHVybHMpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQl0aHJvdyBuZXcgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24oIk1vZGlmaWNhdGlvbiBub3QgYWxsb3dlZCBkdXJpbmcgcnVudGltZSIpOwkJCisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvU3ByaW5nQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvcmVwb3NpdG9yeS9TcHJpbmdDYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdhNzFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3JlcG9zaXRvcnkvU3ByaW5nQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIFNwcmluZ0NhdGFsb2dSZXBvc2l0b3J5CisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFNwcmluZ0NhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSB7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2dCZWFuUmVwbzsKKwkKKwlwdWJsaWMgQ2F0YWxvZ1JlcG9zaXRvcnkgY3JlYXRlUmVwb3NpdG9yeSgpCisJCQl0aHJvd3MgQ2F0YWxvZ1JlcG9zaXRvcnlFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFNwcmluZ0NhdGFsb2dSZXBvc2l0b3J5KHRoaXMuY2F0YWxvZ0JlYW5SZXBvKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0JlYW5SZXBvKFN0cmluZyBjYXRhbG9nQmVhblJlcG8pIHsKKwkJdGhpcy5jYXRhbG9nQmVhblJlcG8gPSBjYXRhbG9nQmVhblJlcG87CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL0NhdGFsb2dTZXJ2aWNlQ29tbWFuZExpbmVDbGllbnQuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvQ2F0YWxvZ1NlcnZpY2VDb21tYW5kTGluZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTM1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL0NhdGFsb2dTZXJ2aWNlQ29tbWFuZExpbmVDbGllbnQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLkNtZExpbmVVdGlsaXR5OworCisvKioKKyAqIENsaWVudCBVdGlsaXR5IGZvciBzZW5kaW5nIGNvbW1hbmRzIHRvIHNlcnZlcnMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1NlcnZpY2VDb21tYW5kTGluZUNsaWVudCB7CisKKyAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgLy8gTG9hZCBDYXRhbG9nIFNlcnZpY2UgcHJvcGVydGllcy4KKyAgICAgIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSA9IFN5c3RlbQorICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucHJvcGVydGllcy5maWxlIik7CisgICAgICBpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUpKTsKKyAgICAgIH0KKworICAgICAgLy8gUnVuIENvbW1hbmQgbGluZS4KKyAgICAgIENtZExpbmVVdGlsaXR5IGNtZExpbmVVdGlsaXR5ID0gbmV3IENtZExpbmVVdGlsaXR5KCk7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oYXJncyk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL0NhdGFsb2dTZXJ2aWNlU2VydmVyTGF1bmNoZXIuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvQ2F0YWxvZ1NlcnZpY2VTZXJ2ZXJMYXVuY2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTExYWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL0NhdGFsb2dTZXJ2aWNlU2VydmVyTGF1bmNoZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLkNtZExpbmVVdGlsaXR5OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogVXRpbGl0eSBmb3IgbGF1bmNoaW5nIENvbW11bmljYXRpb25DaGFubmVsU2VydmVycworICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbG9nU2VydmljZVNlcnZlckxhdW5jaGVyIHsKKwkJCisJcHJpdmF0ZSBDYXRhbG9nU2VydmljZVNlcnZlckxhdW5jaGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24ge30KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIC8vIExvYWQgQ2F0YWxvZyBTZXJ2aWNlIHByb3BlcnRpZXMuCisgICAgICBTdHJpbmcgcHJvcGVydGllc0ZpbGUgPSBTeXN0ZW0KKyAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnByb3BlcnRpZXMuZmlsZSIpOworICAgICAgaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKKyAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJ1biBDb21tYW5kIGxpbmUuCisgICAgICBDbWRMaW5lVXRpbGl0eSBjbWRMaW5lVXRpbGl0eSA9IG5ldyBDbWRMaW5lVXRpbGl0eSgpOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKGFyZ3MpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9BYnN0cmFjdENvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMGFlNmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuU2VyaWFsaXplcjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEFuIEFic3RyYWN0IENvbW11bmljYXRpb24gQ2hhbm5lbCBDbGllbnQgSW50ZXJmYWNlIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIHRocm93IGV4ZWNlcHRpb25zCisgKiA8cD4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQgaW1wbGVtZW50cyBDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCB7CisJCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5jbGFzcy5nZXROYW1lKCkpOworCXByb3RlY3RlZCBTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisKKwlwdWJsaWMgQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCgpIHsKKwkJdGhpcy5zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoZmFsc2UpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9BYnN0cmFjdENvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDlkODYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlRyYW5zYWN0aW9uUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQW4gQWJzdHJhY3QgQ29tbXVuaWNhdGlvbiBDaGFubmVsIFNlcnZlciBJbnRlcmZhY2UgdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdGhyb3cgZXhjZXB0aW9ucworICogPHA+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbW11bmljYXRpb25DaGFubmVsU2VydmVyIGltcGxlbWVudHMgQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIgeworCQorCXByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFic3RyYWN0Q29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwlwcm90ZWN0ZWQgQ2F0YWxvZ1NlcnZpY2UgY2F0YWxvZ1NlcnZpY2U7CisJcHJvdGVjdGVkIGludCBwb3J0OworCXByb3RlY3RlZCBTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisJCisJcHVibGljIEFic3RyYWN0Q29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIoKSB7CisJCXRoaXMuc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldENhdGFsb2dTZXJ2aWNlKENhdGFsb2dTZXJ2aWNlIGNhdGFsb2dTZXJ2aWNlKSB7CisJCXRoaXMuY2F0YWxvZ1NlcnZpY2UgPSBjYXRhbG9nU2VydmljZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeyAKKwkJdGhpcy5wb3J0ID0gcG9ydDsKKwl9CisJCisJcHVibGljIGludCBnZXRQb3J0KCkgeworCQlyZXR1cm4gdGhpcy5wb3J0OworCX0KKworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNhdGFsb2dTZXJ2aWNlLnNodXRkb3duKCk7CisJCQl0aGlzLmNhdGFsb2dTZXJ2aWNlID0gbnVsbDsKKwkJCVN5c3RlbS5nYygpOyAvLyB1c2VkIHRvIHNwZWVkIHVwIHNodXRkb3duIHByb2Nlc3MgKGdpdmVzIGphdmEgYSBib29zdC1zdGFydCBhdCBjbGVhbmluZyB1cCBldmVyeXRoaW5nIHNvIHNlcnZlciB3aWxsIGRpZSkKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gc2h1dGRvd24gc2VydmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBzaHV0ZG93biBzZXJ2ZXIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5pc1Jlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBjaGVja2luZyBzZXJ2ZXIgcXVlcnkgcGVybWlzc2lvbnMgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGNoZWNraW5nIHNlcnZlciBxdWVyeSBwZXJtaXNzaW9ucyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisvLworLy8JcHVibGljIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworLy8JCXRoaXMuY2F0YWxvZ1NlcnZpY2Uuc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucyk7CisvLwl9CisvLworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuaXNSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGNoZWNraW5nIHNlcnZlciBpbmdlc3QgcGVybWlzc2lvbnMgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGNoZWNraW5nIHNlcnZlciBpbmdlc3QgcGVybWlzc2lvbnMgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorLy8KKy8vCXB1YmxpYyB2b2lkIHNldEhhc0luZ2VzdFBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKy8vCQl0aGlzLmNhdGFsb2dTZXJ2aWNlLnNldEhhc0luZ2VzdFBlcm1pc3Npb25zKHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMpOworLy8JfQorCisvLwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFRyYW5zYWN0aW9uSWRDbGFzcygpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisvLwkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0VHJhbnNhY3Rpb25JZENsYXNzKCk7CisvLwl9CisvLworLy8JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25JZENsYXNzKENsYXNzPD8gZXh0ZW5kcyBUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkQ2xhc3MpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisvLwkJdGhpcy5jYXRhbG9nU2VydmljZS5zZXRUcmFuc2FjdGlvbklkQ2xhc3ModHJhbnNhY3Rpb25JZENsYXNzKTsKKy8vCX0KKy8vCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jYXRhbG9nU2VydmljZS5hZGRDYXRhbG9nKGNhdGFsb2cpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBhZGRpbmcgY2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyB0byBzZXJ2ZXIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGFkZGluZyBjYXRhbG9nICciICsgY2F0YWxvZyArICInIHRvIHNlcnZlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVwbGFjZUNhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UucmVwbGFjZUNhdGFsb2coY2F0YWxvZyk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIHJlcGxhY2luZyBjYXRhbG9nICciICsgY2F0YWxvZyArICInIHRvIHNlcnZlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgcmVwbGFjaW5nIGNhdGFsb2cgJyIgKyBjYXRhbG9nICsgIicgdG8gc2VydmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UuYWRkQ2F0YWxvZyhjYXRhbG9nSWQsIGluZGV4KTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgYWRkaW5nIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyB3aXRoIGluZGV4ICciICsgaW5kZXggKyAiJyB0byBzZXJ2ZXIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGFkZGluZyBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgd2l0aCBpbmRleCAnIiArIGluZGV4ICsgIicgdG8gc2VydmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4LCBMaXN0PERpY3Rpb25hcnk+IGRpY3Rpb25hcmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNhdGFsb2dTZXJ2aWNlLmFkZENhdGFsb2coY2F0YWxvZ0lkLCBpbmRleCwgZGljdGlvbmFyaWVzKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgYWRkaW5nIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyB3aXRoIGluZGV4ICciICsgaW5kZXggKyAiJyBhbmQgZGljdGlvbmFyaWVzICciICsgZGljdGlvbmFyaWVzICsgIicgdG8gc2VydmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBhZGRpbmcgY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIHdpdGggaW5kZXggJyIgKyBpbmRleCArICInIGFuZCBkaWN0aW9uYXJpZXMgJyIgKyBkaWN0aW9uYXJpZXMgKyAiJyB0byBzZXJ2ZXIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24sIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UuYWRkQ2F0YWxvZyhjYXRhbG9nSWQsIGluZGV4LCBkaWN0aW9uYXJpZXMsIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uLCByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24pOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBhZGRpbmcgY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIHdpdGggaW5kZXggJyIgKyBpbmRleCArICInIGFuZCBkaWN0aW9uYXJpZXMgJyIgKyBkaWN0aW9uYXJpZXMgKyAiJyBhbmQgcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24gJyIgKyByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbiArICInIGFuZCByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24gJyIgKyByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24gKyAiJyB0byBzZXJ2ZXIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGFkZGluZyBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgd2l0aCBpbmRleCAnIiArIGluZGV4ICsgIicgYW5kIGRpY3Rpb25hcmllcyAnIiArIGRpY3Rpb25hcmllcyArICInIGFuZCByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbiAnIiArIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uICsgIicgYW5kIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbiAnIiArIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbiArICInIHRvIHNlcnZlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhZGREaWN0aW9uYXJ5KFN0cmluZyBjYXRhbG9nSWQsIERpY3Rpb25hcnkgZGljdGlvbmFyeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNhdGFsb2dTZXJ2aWNlLmFkZERpY3Rpb25hcnkoY2F0YWxvZ0lkLCBkaWN0aW9uYXJ5KTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgYWRkaW5nIGRpY3Rpb25hcnkgJyIgKyBkaWN0aW9uYXJ5ICsgIicgdG8gY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBhZGRpbmcgZGljdGlvbmFyeSAnIiArIGRpY3Rpb25hcnkgKyAiJyB0byBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlcGxhY2VEaWN0aW9uYXJpZXMoU3RyaW5nIGNhdGFsb2dJZCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jYXRhbG9nU2VydmljZS5yZXBsYWNlRGljdGlvbmFyaWVzKGNhdGFsb2dJZCwgZGljdGlvbmFyaWVzKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgcmVwbGFjaW5nIGRpY3Rpb25hcmllcyAnIiArIGRpY3Rpb25hcmllcyArICInIGluIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgcmVwbGFjaW5nIGRpY3Rpb25hcmllcyAnIiArIGRpY3Rpb25hcmllcyArICInIGluIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlSW5kZXgoU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jYXRhbG9nU2VydmljZS5yZXBsYWNlSW5kZXgoY2F0YWxvZ0lkLCBpbmRleCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIHJlcGxhY2luZyBpbmRleCAnIiArIGluZGV4ICsgIicgaW4gY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSByZXBsYWNpbmcgaW5kZXggJyIgKyBpbmRleCArICInIGluIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBtb2RpZnlJbmdlc3RQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UubW9kaWZ5SW5nZXN0UGVybWlzc2lvbihjYXRhbG9nSWQsIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbik7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGNoYW5naW5nIGluZ2VzdCBwZXJtaXNzaW9ucyBmb3IgY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIHRvICciICsgcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGNoYW5naW5nIGluZ2VzdCBwZXJtaXNzaW9ucyBmb3IgY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIHRvICciICsgcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIG1vZGlmeVF1ZXJ5UGVybWlzc2lvbihTdHJpbmcgY2F0YWxvZ0lkLCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UubW9kaWZ5UXVlcnlQZXJtaXNzaW9uKGNhdGFsb2dJZCwgcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24pOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBjaGFuZ2luZyBxdWVyeSBwZXJtaXNzaW9ucyBmb3IgY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIHRvICciICsgcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24gKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgY2hhbmdpbmcgcXVlcnkgcGVybWlzc2lvbnMgZm9yIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyB0byAnIiArIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNhdGFsb2dTZXJ2aWNlLnJlbW92ZUNhdGFsb2coY2F0YWxvZ0lkKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgcmVtb3ZpbmcgY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSByZW1vdmluZyBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisvLwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuLCBib29sZWFuIHByZXNlcnZlTWFwcGluZykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKy8vCQl0aGlzLmNhdGFsb2dTZXJ2aWNlLnJlbW92ZUNhdGFsb2coY2F0YWxvZ1VybiwgcHJlc2VydmVNYXBwaW5nKTsKKy8vCX0KKworCXB1YmxpYyBMaXN0PFBsdWdpblVSTD4gZ2V0UGx1Z2luVXJscygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0UGx1Z2luVXJscygpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBnZXR0aW5nIHBsdWdpbiBVUkxzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBnZXR0aW5nIHBsdWdpbiBVUkxzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5VcmxzKExpc3Q8UGx1Z2luVVJMPiBwbHVnaW5VUkxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UuYWRkUGx1Z2luVXJscyhwbHVnaW5VUkxzKTsKKwkJCXRoaXMuc2VyaWFsaXplci5yZWZyZXNoQ2xhc3NMb2FkZXIoKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgYWRkaW5nIHBsdWdpbiBVUkxzICciICsgcGx1Z2luVVJMcyArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBhZGRpbmcgcGx1Z2luIFVSTHMgJyIgKyBwbHVnaW5VUkxzICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBVUkwgZ2V0UGx1Z2luU3RvcmFnZURpcigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0UGx1Z2luU3RvcmFnZURpcigpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBnZXR0aW5nIHBsdWdpbiBzdG9yYWdlIGRpcmVjdG9yeSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0dGluZyBwbHVnaW4gc3RvcmFnZSBkaXJlY3RvcnkgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorLy8JcHVibGljIFNldDxDYXRhbG9nPiBnZXRDdXJyZW50Q2F0YWxvZ0xpc3QoKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldEN1cnJlbnRDYXRhbG9nTGlzdCgpOworLy8JfQorLy8JCisvLwlwdWJsaWMgQ2F0YWxvZyBnZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldENhdGFsb2coY2F0YWxvZ1Vybik7CisvLwl9CisKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q3VycmVudENhdGFsb2dJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldEN1cnJlbnRDYXRhbG9nSWRzKCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldHRpbmcgY3VycmVudCBjYXRhbG9nIGlkcyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0dGluZyBjdXJyZW50IGNhdGFsb2cgaWRzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQkKKwl9CisJCQorCXB1YmxpYyBUcmFuc2FjdGlvblJlY2VpcHQgaW5nZXN0KE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmluZ2VzdChtZXRhZGF0YSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIHBlcmZvcm1pbmcgaW5nZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBwZXJmb3JtaW5nIGluZ2VzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgZGVsZXRlKE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ1NlcnZpY2UuZGVsZXRlKG1ldGFkYXRhKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgcGVyZm9ybWluZyBkZWxldGlvbiA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgcGVyZm9ybWluZyBkZWxldGlvbiA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCisJfQorCQorCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRQcm9wZXJ0eShrZXkpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBnZXR0aW5nIHByb3BlcnR5ICciICsga2V5ICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGdldHRpbmcgcHJvcGVydHkgJyIgKyBrZXkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCisJfQorCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldENhbGFsb2dQcm9wZXJ0aWVzKCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldHRpbmcgY2F0YWxvZyBwcm9wZXJ0aWVzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBnZXR0aW5nIGNhdGFsb2cgcHJvcGVydGllcyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCQorCX0KKwkKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldENhbGFsb2dQcm9wZXJ0aWVzKGNhdGFsb2dJZCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldHRpbmcgY2F0YWxvZyBwcm9wZXJ0aWVzIGZvciBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGdldHRpbmcgY2F0YWxvZyBwcm9wZXJ0aWVzIGZvciBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CQorCX0KKworLy8JcHVibGljIFBhZ2UgZ2V0Rmlyc3RQYWdlKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldEZpcnN0UGFnZShxdWVyeUV4cHJlc3Npb24pOworLy8JfQorLy8KKy8vCXB1YmxpYyBQYWdlIGdldEZpcnN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRGaXJzdFBhZ2UocXVlcnlFeHByZXNzaW9uLCBjYXRhbG9nSWRzKTsKKy8vCX0KKwkKKwlwdWJsaWMgUGFnZSBnZXROZXh0UGFnZShQYWdlIHBhZ2UpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0TmV4dFBhZ2UocGFnZSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldHRpbmcgbmV4dCBwYWdlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBnZXR0aW5nIG5leHQgcGFnZSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCisJfQorCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0UGFnZShwYWdlSW5mbywgcXVlcnlFeHByZXNzaW9uKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgZ2V0dGluZyBuZXh0IHBhZ2UgW3BhZ2VJbmZvPSciICsgcGFnZUluZm8gKyAiJyxxdWVyeT0nIiArIHF1ZXJ5RXhwcmVzc2lvbiArICInXSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0dGluZyBuZXh0IHBhZ2UgW3BhZ2VJbmZvPSciICsgcGFnZUluZm8gKyAiJyxxdWVyeT0nIiArIHF1ZXJ5RXhwcmVzc2lvbiArICInXSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIFBhZ2UgZ2V0UGFnZShQYWdlSW5mbyBwYWdlSW5mbywgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRQYWdlKHBhZ2VJbmZvLCBxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBnZXR0aW5nIG5leHQgcGFnZSBbcGFnZUluZm89JyIgKyBwYWdlSW5mbyArICInLHF1ZXJ5PSciICsgcXVlcnlFeHByZXNzaW9uICsgIicsY2F0YWxvZ0lkcz0nIiArIGNhdGFsb2dJZHMgKyAiJ10gOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHdoaWxlIGdldHRpbmcgbmV4dCBwYWdlIFtwYWdlSW5mbz0nIiArIHBhZ2VJbmZvICsgIicscXVlcnk9JyIgKyBxdWVyeUV4cHJlc3Npb24gKyAiJyxjYXRhbG9nSWRzPSciICsgY2F0YWxvZ0lkcyArICInXSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisvLwlwdWJsaWMgUGFnZSBnZXRMYXN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRMYXN0UGFnZShxdWVyeUV4cHJlc3Npb24pOworLy8JfQorLy8JCisvLwlwdWJsaWMgUGFnZSBnZXRMYXN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRMYXN0UGFnZShxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpOworLy8JfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGEoUGFnZSBwYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldE1ldGFkYXRhKHBhZ2UpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBnZXR0aW5nIG1ldGFkYXRhIGZvciBwYWdlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBnZXR0aW5nIG1ldGFkYXRhIGZvciBwYWdlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLnF1ZXJ5KHF1ZXJ5RXhwcmVzc2lvbik7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIHBlcmZvcm1pbmcgcXVlcnkgJyIgKyBxdWVyeUV4cHJlc3Npb24gKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgcGVyZm9ybWluZyBxdWVyeSAnIiArIHF1ZXJ5RXhwcmVzc2lvbiArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLnF1ZXJ5KHF1ZXJ5RXhwcmVzc2lvbiwgY2F0YWxvZ0lkcyk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIHBlcmZvcm1pbmcgcXVlcnkgJyIgKyBxdWVyeUV4cHJlc3Npb24gKyAiJyB0byBjYXRhbG9ncyAnIiArIGNhdGFsb2dJZHMgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgcGVyZm9ybWluZyBxdWVyeSAnIiArIHF1ZXJ5RXhwcmVzc2lvbiArICInIHRvIGNhdGFsb2dzICciICsgY2F0YWxvZ0lkcyArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKy8vCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIGJvb2xlYW4gc29ydFJlc3VsdHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisvLwkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UucXVlcnkocXVlcnlFeHByZXNzaW9uLCBzb3J0UmVzdWx0cyk7CisvLwl9CisgCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXROZXh0UGFnZShRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0TmV4dFBhZ2UocXVlcnlQYWdlcik7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldCBuZXh0IHBhZ2UgZnJvbSBxdWVyeSBwYWdlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0IG5leHQgcGFnZSBmcm9tIHF1ZXJ5IHBhZ2VyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQkKKwl9CisKKy8vCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFRyYW5zYWN0aW9uSWRzRm9yQWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldFRyYW5zYWN0aW9uSWRzRm9yQWxsUGFnZXMocXVlcnlQYWdlcik7CisvLwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRBbGxQYWdlcyhRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0QWxsUGFnZXMocXVlcnlQYWdlcik7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldCBhbGwgcGFnZXMgZnJvbSBxdWVyeSBwYWdlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0IGFsbCBwYWdlcyBmcm9tIHF1ZXJ5IHBhZ2VyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQkKKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncyhMaXN0PFN0cmluZz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5ncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncyhjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmdzKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgZ2V0dGluZyBtZXRhZGF0YSBmb3IgY2F0YWxvZyBzZXJ2aWNlIHRyYW5zYWN0aW9uIGlkcyAnIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZFN0cmluZ3MgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0dGluZyBtZXRhZGF0YSBmb3IgY2F0YWxvZyBzZXJ2aWNlIHRyYW5zYWN0aW9uIGlkcyAnIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZFN0cmluZ3MgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCisJfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRzKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB3aGlsZSBnZXR0aW5nIG1ldGFkYXRhIGZvciBjYXRhbG9nIHNlcnZpY2UgdHJhbnNhY3Rpb24gaWRzICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBnZXR0aW5nIG1ldGFkYXRhIGZvciBjYXRhbG9nIHNlcnZpY2UgdHJhbnNhY3Rpb24gaWRzICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQkKKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyhMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dUcmFuc2FjdGlvbklkcywgU3RyaW5nIGNhdGFsb2dJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKGNhdGFsb2dUcmFuc2FjdGlvbklkcywgY2F0YWxvZ0lkKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgZ2V0dGluZyBjYXRhbG9nIHNlcnZpY2UgdHJhbnNhY3Rpb24gaWRzIGZvciBjYXRhbG9nIHRyYW5zYWN0aW9uIGlkcyAnIiArIGNhdGFsb2dUcmFuc2FjdGlvbklkcyArICInIGZyb20gY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB3aGlsZSBnZXR0aW5nIGNhdGFsb2cgc2VydmljZSB0cmFuc2FjdGlvbiBpZHMgZm9yIGNhdGFsb2cgdHJhbnNhY3Rpb24gaWRzICciICsgY2F0YWxvZ1RyYW5zYWN0aW9uSWRzICsgIicgZnJvbSBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CQorCX0KKwkKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCwgU3RyaW5nIGNhdGFsb2dJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIGNhdGFsb2dJZCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHdoaWxlIGdldHRpbmcgY2F0YWxvZyBzZXJ2aWNlIHRyYW5zYWN0aW9uIGlkIGZvciBjYXRhbG9nIHRyYW5zYWN0aW9uIGlkICciICsgY2F0YWxvZ1RyYW5zYWN0aW9uSWQgKyAiJyBmcm9tIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0dGluZyBjYXRhbG9nIHNlcnZpY2UgdHJhbnNhY3Rpb24gaWQgZm9yIGNhdGFsb2cgdHJhbnNhY3Rpb24gaWQgJyIgKyBjYXRhbG9nVHJhbnNhY3Rpb25JZCArICInIGZyb20gY2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQkJCisJfQorCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwgYm9vbGVhbiBnZW5lcmF0ZU5ldykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoY2F0YWxvZ1JlY2VpcHQsIGdlbmVyYXRlTmV3KTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgd2hpbGUgZ2V0dGluZyBtZXRhZGF0YSBmb3IgY2F0YWxvZyBzZXJ2aWNlIHRyYW5zYWN0aW9uIGlkIGZvciBjYXRhbG9nIHJlY2VpcHQgJyIgKyBjYXRhbG9nUmVjZWlwdCArICInIHdpdGggZ2VuZXJhdGUgbmV3IGVxdWFsICciICsgZ2VuZXJhdGVOZXcgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgd2hpbGUgZ2V0dGluZyBtZXRhZGF0YSBmb3IgY2F0YWxvZyBzZXJ2aWNlIHRyYW5zYWN0aW9uIGlkIGZvciBjYXRhbG9nIHJlY2VpcHQgJyIgKyBjYXRhbG9nUmVjZWlwdCArICInIHdpdGggZ2VuZXJhdGUgbmV3IGVxdWFsICciICsgZ2VuZXJhdGVOZXcgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCQorCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9Db21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkOWIzYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9Db21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5DYXRhbG9nUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlBhZ2VJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlF1ZXJ5UGFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuVHJhbnNhY3Rpb25SZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5EaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgQ29tbXVuaWNhdGlvbiBDaGFubmVsIEludGVyZmFjZQorICogPHA+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQgeworCisJcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworLy8JcHVibGljIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIGJvb2xlYW4gaXNSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworLy8JcHVibGljIHZvaWQgc2V0SGFzSW5nZXN0UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKSB0aHJvd3MgRXhjZXB0aW9uOworCisvLwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFRyYW5zYWN0aW9uSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb247CisvLworLy8JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25JZENsYXNzKENsYXNzPD8gZXh0ZW5kcyBUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkQ2xhc3MpIHRocm93cyBFeGNlcHRpb247CisvLworCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24sIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkRGljdGlvbmFyeShTdHJpbmcgY2F0YWxvZ0lkLCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlRGljdGlvbmFyaWVzKFN0cmluZyBjYXRhbG9nSWQsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgcmVwbGFjZUluZGV4KFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgbW9kaWZ5SW5nZXN0UGVybWlzc2lvbihTdHJpbmcgY2F0YWxvZ0lkLCBib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCBtb2RpZnlRdWVyeVBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uOworCisvLwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuLCBib29sZWFuIHByZXNlcnZlTWFwcGluZykgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyBMaXN0PFBsdWdpblVSTD4gZ2V0UGx1Z2luVXJscygpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5VcmxzKExpc3Q8UGx1Z2luVVJMPiBwbHVnaW5VcmxzKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIFVSTCBnZXRQbHVnaW5TdG9yYWdlRGlyKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCB0cmFuc2ZlclVybChVUkwgZnJvbVVybCwgVVJMIHRvVXJsKSB0aHJvd3MgRXhjZXB0aW9uOworCQorLy8JcHVibGljIFNldDxDYXRhbG9nPiBnZXRDdXJyZW50Q2F0YWxvZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uOworLy8JCisvLwlwdWJsaWMgQ2F0YWxvZyBnZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIFNldDxTdHJpbmc+IGdldEN1cnJlbnRDYXRhbG9nSWRzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkJCisJcHVibGljIFRyYW5zYWN0aW9uUmVjZWlwdCBpbmdlc3QoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgZGVsZXRlKE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyBQcm9wZXJ0aWVzIGdldENhbGFsb2dQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKy8vCXB1YmxpYyBQYWdlIGdldEZpcnN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworLy8KKy8vCXB1YmxpYyBQYWdlIGdldEZpcnN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBQYWdlIGdldE5leHRQYWdlKFBhZ2UgcGFnZSkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgUGFnZSBnZXRQYWdlKFBhZ2VJbmZvIHBhZ2VJbmZvLCBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBFeGNlcHRpb247CisJCisvLwlwdWJsaWMgUGFnZSBnZXRMYXN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworLy8KKy8vCXB1YmxpYyBQYWdlIGdldExhc3RQYWdlKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YShQYWdlIHBhZ2UpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIFF1ZXJ5UGFnZXIgcXVlcnkoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKy8vCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIGJvb2xlYW4gc29ydFJlc3VsdHMpIHRocm93cyBFeGNlcHRpb247CisgCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXROZXh0UGFnZShRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBnZXRUcmFuc2FjdGlvbklkc0ZvckFsbFBhZ2VzKFF1ZXJ5UGFnZXIgcXVlcnlQYWdlcikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldEFsbFBhZ2VzKFF1ZXJ5UGFnZXIgcXVlcnlQYWdlcikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRTdHJpbmdzKExpc3Q8U3RyaW5nPiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmdzKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMoTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nVHJhbnNhY3Rpb25JZHMsIFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoQ2F0YWxvZ1JlY2VpcHQgY2F0YWxvZ1JlY2VpcHQsIGJvb2xlYW4gZ2VuZXJhdGVOZXcpIHRocm93cyBFeGNlcHRpb247CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzNjNTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcgQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeSB7CisKKwlwdWJsaWMgQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQgY3JlYXRlQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQoKTsKKwkKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJVcmwoU3RyaW5nIHVybCk7CisJCisJcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJVcmwoKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9Db21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4NmE1OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9Db21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWV0YWRhdGEuVHJhbnNhY3Rpb25hbE1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkNhdGFsb2dSZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUXVlcnlQYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5UcmFuc2FjdGlvblJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuUGx1Z2luVVJMOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIENvbW11bmljYXRpb24gQ2hhbm5lbCBTZXJ2ZXIKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbW11bmljYXRpb25DaGFubmVsU2VydmVyIHsKKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2dTZXJ2aWNlKENhdGFsb2dTZXJ2aWNlIGNhdGFsb2dTZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgaW50IGdldFBvcnQoKTsKKwkKKwlwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKy8vCisvLwlwdWJsaWMgdm9pZCBzZXRSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMpIHRocm93cyBFeGNlcHRpb247CisvLworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucygpIHRocm93cyBFeGNlcHRpb247CisvLworLy8JcHVibGljIHZvaWQgc2V0SGFzSW5nZXN0UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKSB0aHJvd3MgRXhjZXB0aW9uOworCisvLwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFRyYW5zYWN0aW9uSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb247CisvLworLy8JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25JZENsYXNzKENsYXNzPD8gZXh0ZW5kcyBUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkQ2xhc3MpIHRocm93cyBFeGNlcHRpb247CisvLwkKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKENhdGFsb2cgY2F0YWxvZykgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIHJlcGxhY2VDYXRhbG9nKENhdGFsb2cgY2F0YWxvZykgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24sIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkRGljdGlvbmFyeShTdHJpbmcgY2F0YWxvZ0lkLCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkpIHRocm93cyBFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlRGljdGlvbmFyaWVzKFN0cmluZyBjYXRhbG9nSWQsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyB2b2lkIHJlcGxhY2VJbmRleChTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIG1vZGlmeUluZ2VzdFBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24pIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgbW9kaWZ5UXVlcnlQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24pIHRocm93cyBFeGNlcHRpb247CisJCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGFsb2coU3RyaW5nIGNhdGFsb2dVcm4pIHRocm93cyBFeGNlcHRpb247CisJCisvLwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuLCBib29sZWFuIHByZXNlcnZlTWFwcGluZykgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyBMaXN0PFBsdWdpblVSTD4gZ2V0UGx1Z2luVXJscygpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgYWRkUGx1Z2luVXJscyhMaXN0PFBsdWdpblVSTD4gcGx1Z2luVVJMcykgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgVVJMIGdldFBsdWdpblN0b3JhZ2VEaXIoKSB0aHJvd3MgRXhjZXB0aW9uOworCQorLy8JcHVibGljIFNldDxDYXRhbG9nPiBnZXRDdXJyZW50Q2F0YWxvZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uOworLy8JCisvLwlwdWJsaWMgQ2F0YWxvZyBnZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uOworCisJcHVibGljIFNldDxTdHJpbmc+IGdldEN1cnJlbnRDYXRhbG9nSWRzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkJCisJcHVibGljIFRyYW5zYWN0aW9uUmVjZWlwdCBpbmdlc3QoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgZGVsZXRlKE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyBQcm9wZXJ0aWVzIGdldENhbGFsb2dQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKy8vCXB1YmxpYyBQYWdlIGdldEZpcnN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworLy8KKy8vCXB1YmxpYyBQYWdlIGdldEZpcnN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBQYWdlIGdldE5leHRQYWdlKFBhZ2UgcGFnZSkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgUGFnZSBnZXRQYWdlKFBhZ2VJbmZvIHBhZ2VJbmZvLCBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBFeGNlcHRpb247CisJCisvLwlwdWJsaWMgUGFnZSBnZXRMYXN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOworLy8KKy8vCXB1YmxpYyBQYWdlIGdldExhc3RQYWdlKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YShQYWdlIHBhZ2UpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIFF1ZXJ5UGFnZXIgcXVlcnkoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKKworCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBFeGNlcHRpb247CisKKy8vCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIGJvb2xlYW4gc29ydFJlc3VsdHMpIHRocm93cyBFeGNlcHRpb247CisgCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXROZXh0UGFnZShRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpIHRocm93cyBFeGNlcHRpb247CisKKy8vCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldFRyYW5zYWN0aW9uSWRzRm9yQWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0QWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZFN0cmluZ3MoTGlzdDxTdHJpbmc+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZFN0cmluZ3MpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkcyhMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyhMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dUcmFuc2FjdGlvbklkcywgU3RyaW5nIGNhdGFsb2dVcm4pIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKFRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwgYm9vbGVhbiBnZW5lcmF0ZU5ldykgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9Db21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9Db21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc0ZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nU2VydmljZUZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIGNyZWF0aW5nIENvbW11bmljYXRpb25DaGFubmVsU2VydmVyCisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3RvcnkgeworCQorCXB1YmxpYyBDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlciBjcmVhdGVDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlcigpOworCQorCXB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpOworCQorCXB1YmxpYyBpbnQgZ2V0UG9ydCgpOworCQorCXB1YmxpYyB2b2lkIHNldENhdGFsb2dTZXJ2aWNlRmFjdG9yeShDYXRhbG9nU2VydmljZUZhY3RvcnkgY2F0YWxvZ1NlcnZpY2VGYWN0b3J5KTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9ybWkvUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9ybWkvUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2MxYjkwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3JtaS9SbWlDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLnJtaTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5ybWkuc2VydmVyLlVuaWNhc3RSZW1vdGVPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWV0YWRhdGEuVHJhbnNhY3Rpb25hbE1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkNhdGFsb2dSZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUXVlcnlQYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5UcmFuc2FjdGlvblJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWwuQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5EaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFJtaUNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50IGV4dGVuZHMgVW5pY2FzdFJlbW90ZU9iamVjdCBpbXBsZW1lbnRzIENvbW11bmljYXRpb25DaGFubmVsQ2xpZW50eworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDYxODA1MTA2OTM2NzMzMTY3OUw7CisKKwlwcm90ZWN0ZWQgUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKENhdGFsb2cgY2F0YWxvZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwKKwkJCUxpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4LAorCQkJTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24sCisJCQlib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgYWRkRGljdGlvbmFyeShTdHJpbmcgY2F0YWxvZ0lkLCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5VcmxzKExpc3Q8UGx1Z2luVVJMPiBwbHVnaW5VcmxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGUoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0QWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCwgU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwgYm9vbGVhbiBnZW5lcmF0ZU5ldykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMoCisJCQlMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dUcmFuc2FjdGlvbklkcywgU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q3VycmVudENhdGFsb2dJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhKFBhZ2UgcGFnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncygKKwkJCUxpc3Q8U3RyaW5nPiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRzKAorCQkJTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFBhZ2UgZ2V0TmV4dFBhZ2UoUGFnZSBwYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE5leHRQYWdlKFF1ZXJ5UGFnZXIgcXVlcnlQYWdlcikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgUGFnZSBnZXRQYWdlKFBhZ2VJbmZvIHBhZ2VJbmZvLCBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLAorCQkJU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFVSTCBnZXRQbHVnaW5TdG9yYWdlRGlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIExpc3Q8UGx1Z2luVVJMPiBnZXRQbHVnaW5VcmxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBnZXRUcmFuc2FjdGlvbklkc0ZvckFsbFBhZ2VzKAorCQkJUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25SZWNlaXB0IGluZ2VzdChNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIG1vZGlmeUluZ2VzdFBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwKKwkJCWJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBtb2RpZnlRdWVyeVBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwKKwkJCWJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sCisJCQlTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyB2b2lkIHJlcGxhY2VEaWN0aW9uYXJpZXMoU3RyaW5nIGNhdGFsb2dJZCwKKwkJCUxpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlSW5kZXgoU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgdHJhbnNmZXJVcmwoVVJMIGZyb21VcmwsIFVSTCB0b1VybCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvcm1pL1JtaUNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50SW50ZXJmYWNlLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvcm1pL1JtaUNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50SW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkMTRlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9ybWkvUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC5ybWk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGU7CitpbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmcuSW5nZXN0TWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUXVlcnlQYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGludGVyZmFjZSBSbWlDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEludGVyZmFjZSBleHRlbmRzIFJlbW90ZSB7CisJCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZ1JlcG9zaXRvcnkoQ2F0YWxvZ1JlcG9zaXRvcnkgY2F0YWxvZ1JlcG9zaXRvcnkpOworCQorCXB1YmxpYyBDYXRhbG9nUmVwb3NpdG9yeSBnZXRDYXRhbG9nUmVwb3NpdG9yeSgpIHRocm93cyBFeGNlcHRpb247CisJCisJcHVibGljIEluZ2VzdE1hcHBlciBnZXRJbmdlc3RNYXBwZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgc2V0SW5nZXN0TWFwcGVyKEluZ2VzdE1hcHBlciBpbmdlc3RNYXBwZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKwlwdWJsaWMgYm9vbGVhbiBpc0hhc0luZ2VzdFBlcm1pc3Npb25zKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIHNldEhhc0luZ2VzdFBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgVHJhbnNhY3Rpb25JZDw/Pj4gZ2V0VHJhbnNhY3Rpb25JZENsYXNzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uSWRDbGFzcyhDbGFzczw/IGV4dGVuZHMgVHJhbnNhY3Rpb25JZDw/Pj4gdHJhbnNhY3Rpb25JZENsYXNzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2csIGJvb2xlYW4gYWxsb3dPdmVycmlkZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgcmVtb3ZlQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybiwgYm9vbGVhbiBwcmVzZXJ2ZU1hcHBpbmcpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKwlwdWJsaWMgU2V0PENhdGFsb2c+IGdldEN1cnJlbnRDYXRhbG9nTGlzdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisJCisJcHVibGljIENhdGFsb2cgZ2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDdXJyZW50Q2F0YWxvZ0lkcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisJCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGluZ2VzdChNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCBkZWxldGUoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCQorCXB1YmxpYyBQcm9wZXJ0aWVzIGdldENhbGFsb2dQcm9wZXJ0aWVzKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCQorCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisJCisJcHVibGljIFF1ZXJ5UGFnZXIgcXVlcnkoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgYm9vbGVhbiBzb3J0UmVzdWx0cykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAKKwlwdWJsaWMgU2V0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TmV4dFBhZ2UoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisJcHVibGljIFNldDxUcmFuc2FjdGlvbklkPD8+PiBnZXRUcmFuc2FjdGlvbklkc0ZvckFsbFBhZ2VzKFF1ZXJ5UGFnZXIgcXVlcnlQYWdlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgU2V0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0QWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCQorCXB1YmxpYyBTZXQ8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncyhMaXN0PFN0cmluZz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5ncykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgU2V0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCQorCXB1YmxpYyBTZXQ8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyhMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dUcmFuc2FjdGlvbklkcywgU3RyaW5nIGNhdGFsb2dVcm4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisJCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKFRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ1VybiwgYm9vbGVhbiBnZW5lcmF0ZU5ldykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9ybWkvUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRNQmVhbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3JtaS9SbWlDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudE1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyNWFiNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9ybWkvUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWwucm1pOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJtaUNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50TUJlYW4geworCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvcm1pL1JtaUNvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwvcm1pL1JtaUNvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhMDYxMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC9ybWkvUm1pQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC5ybWk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlRyYW5zYWN0aW9uUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC5Db21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuUGx1Z2luVVJMOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSbWlDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlciBpbXBsZW1lbnRzCisJCUNvbW11bmljYXRpb25DaGFubmVsU2VydmVyIHsKKworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJfQorCisJcHVibGljIHZvaWQgc3RhcnR1cCgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKENhdGFsb2cgY2F0YWxvZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwKKwkJCUxpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4LAorCQkJTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24sCisJCQlib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgYWRkRGljdGlvbmFyeShTdHJpbmcgY2F0YWxvZ0lkLCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5VcmxzKExpc3Q8UGx1Z2luVVJMPiBwbHVnaW5VUkxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGUoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0QWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKAorCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCwgU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwgYm9vbGVhbiBnZW5lcmF0ZU5ldykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMoCisJCQlMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dUcmFuc2FjdGlvbklkcywgU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q3VycmVudENhdGFsb2dJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhKFBhZ2UgcGFnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncygKKwkJCUxpc3Q8U3RyaW5nPiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRzKAorCQkJTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFBhZ2UgZ2V0TmV4dFBhZ2UoUGFnZSBwYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE5leHRQYWdlKFF1ZXJ5UGFnZXIgcXVlcnlQYWdlcikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgUGFnZSBnZXRQYWdlKFBhZ2VJbmZvIHBhZ2VJbmZvLCBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLAorCQkJU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFVSTCBnZXRQbHVnaW5TdG9yYWdlRGlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIExpc3Q8UGx1Z2luVVJMPiBnZXRQbHVnaW5VcmxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGludCBnZXRQb3J0KCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiAwOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uUmVjZWlwdCBpbmdlc3QoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb2RpZnlJbmdlc3RQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsCisJCQlib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgbW9kaWZ5UXVlcnlQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsCisJCQlib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLAorCQkJU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgcmVwbGFjZUNhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlRGljdGlvbmFyaWVzKFN0cmluZyBjYXRhbG9nSWQsCisJCQlMaXN0PERpY3Rpb25hcnk+IGRpY3Rpb25hcmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJcHVibGljIHZvaWQgcmVwbGFjZUluZGV4KFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nU2VydmljZShDYXRhbG9nU2VydmljZSBjYXRhbG9nU2VydmljZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCXB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC94bWxycGMvWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC94bWxycGMvWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZlZTYwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3htbHJwYy9YbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5qYXZhCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLnhtbHJwYzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlRyYW5zYWN0aW9uUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC5BYnN0cmFjdENvbW11bmljYXRpb25DaGFubmVsQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuUGx1Z2luVVJMOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5Db21tb25zWG1sUnBjVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNDbGllbnQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIENvbW11bmljYXRpb24gQ2hhbm5lbCBDbGllbnQgb3ZlciBYTUwtUlBDCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCB7CisKKwlwcm90ZWN0ZWQgWG1sUnBjQ2xpZW50IGNsaWVudDsKKwlwcm90ZWN0ZWQgaW50IGNodW5rU2l6ZTsKKwkKKwlwdWJsaWMgWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQoVVJMIHNlcnZlclVybCwgaW50IGNvbm5lY3Rpb25UaW1lb3V0LCBpbnQgcmVxdWVzdFRpbWVvdXQsIGludCBjaHVua1NpemUpIHsKKwkJc3VwZXIoKTsKKyAgICAgICAgQ29tbW9uc1htbFJwY1RyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBDb21tb25zWG1sUnBjVHJhbnNwb3J0RmFjdG9yeShzZXJ2ZXJVcmwpOworICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LnNldENvbm5lY3Rpb25UaW1lb3V0KGNvbm5lY3Rpb25UaW1lb3V0ICogNjAgKiAxMDAwKTsKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeS5zZXRUaW1lb3V0KHJlcXVlc3RUaW1lb3V0ICogNjAgKiAxMDAwKTsgICAgICAgIAorCQl0aGlzLmNsaWVudCA9IG5ldyBYbWxScGNDbGllbnQoc2VydmVyVXJsLCB0cmFuc3BvcnRGYWN0b3J5KTsKKwkJdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19zaHV0ZG93biIsIGFyZ3MpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KGNhdGFsb2cpKTsKKwkJdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19hZGRDYXRhbG9nIiwgYXJncyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlcGxhY2VDYXRhbG9nKENhdGFsb2cgY2F0YWxvZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChjYXRhbG9nKSk7CisJCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfcmVwbGFjZUNhdGFsb2ciLCBhcmdzKTsJCisJfQorCQorCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgpIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKGNhdGFsb2dJZCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoaW5kZXgpKTsKKwkJdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19hZGRDYXRhbG9nIiwgYXJncyk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZChjYXRhbG9nSWQpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KGluZGV4KSk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoZGljdGlvbmFyaWVzKSk7CisJCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfYWRkQ2F0YWxvZyIsIGFyZ3MpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzLCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uLCBib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQoY2F0YWxvZ0lkKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChpbmRleCkpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KGRpY3Rpb25hcmllcykpOworCQlhcmdzLmFkZChyZXN0cmljdFF1ZXJ5UGVybWlzc2lvbik7CisJCWFyZ3MuYWRkKHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbik7CisJCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfYWRkQ2F0YWxvZyIsIGFyZ3MpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZERpY3Rpb25hcnkoU3RyaW5nIGNhdGFsb2dJZCwgRGljdGlvbmFyeSBkaWN0aW9uYXJ5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZChjYXRhbG9nSWQpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KGRpY3Rpb25hcnkpKTsKKwkJdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19hZGREaWN0aW9uYXJ5IiwgYXJncyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlcGxhY2VEaWN0aW9uYXJpZXMoU3RyaW5nIGNhdGFsb2dJZCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKGNhdGFsb2dJZCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoZGljdGlvbmFyaWVzKSk7CisJCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfYWRkRGljdGlvbmFyeSIsIGFyZ3MpOworCX0KKworCXB1YmxpYyB2b2lkIHJlcGxhY2VJbmRleChTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQoY2F0YWxvZ0lkKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChpbmRleCkpOworCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX3JlcGxhY2VJbmRleCIsIGFyZ3MpOworCX0KKworCXB1YmxpYyB2b2lkIG1vZGlmeUluZ2VzdFBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKGNhdGFsb2dJZCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QocmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSk7CisJCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfbW9kaWZ5SW5nZXN0UGVybWlzc2lvbiIsIGFyZ3MpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb2RpZnlRdWVyeVBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQoY2F0YWxvZ0lkKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChyZXN0cmljdFF1ZXJ5UGVybWlzc2lvbikpOworCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX21vZGlmeVF1ZXJ5UGVybWlzc2lvbiIsIGFyZ3MpOworCX0KKwkKKwlwdWJsaWMgTGlzdDxQbHVnaW5VUkw+IGdldFBsdWdpblVybHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KExpc3QuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0UGx1Z2luVXJscyIsIGFyZ3MpKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkUGx1Z2luVXJscyhMaXN0PFBsdWdpblVSTD4gcGx1Z2luVVJMcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChwbHVnaW5VUkxzKSk7CisJCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfYWRkUGx1Z2luVXJscyIsIGFyZ3MpOworCX0KKwkKKwlwdWJsaWMgVVJMIGdldFBsdWdpblN0b3JhZ2VEaXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFVSTC5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRQbHVnaW5TdG9yYWdlRGlyIiwgYXJncykpOwkKKwl9CisJCisJcHVibGljIHZvaWQgdHJhbnNmZXJVcmwoVVJMIGZyb21VcmwsIFVSTCB0b1VSTCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmZXJpbmcgJyIgKyBmcm9tVXJsICsgIicgdG8gJyIgKyB0b1VSTCArICInIik7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbdGhpcy5jaHVua1NpemVdOworCSAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZyb21VcmwuZ2V0UGF0aCgpKSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGludCBudW1CeXRlcyA9IDA7CisJICAgICAgICB3aGlsZSAoKG51bUJ5dGVzID0gaXMucmVhZChidWYsIG9mZnNldCwgY2h1bmtTaXplKSkgIT0gLTEpCisJICAgICAgICAgICAgdGhpcy50cmFuc2ZlckZpbGUobmV3IEZpbGUodG9VUkwuZ2V0UGF0aCgpKS5nZXRBYnNvbHV0ZVBhdGgoKSwgYnVmLCBvZmZzZXQsIG51bUJ5dGVzKTsKKyAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAJdGhyb3cgZTsKKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAJdHJ5IHsKKyAgICAgICAgCQlpcy5jbG9zZSgpOworICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9CisJfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHRyYW5zZmVyRmlsZShTdHJpbmcgZmlsZVBhdGgsIGJ5dGVbXSBmaWxlRGF0YSwgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBudW1CeXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoZmlsZVBhdGgpOworICAgICAgICBhcmdMaXN0LmFkZChmaWxlRGF0YSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKG5ldyBJbnRlZ2VyKG9mZnNldCkpOworICAgICAgICBhcmdMaXN0LmFkZChuZXcgSW50ZWdlcihudW1CeXRlcykpOworICAgICAgICBjbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY190cmFuc2ZlckZpbGUiLCBhcmdMaXN0KTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBkZWxldGUoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QobWV0YWRhdGEpKTsKKwkJdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19kZWxldGUiLCBhcmdzKTsJCQorCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0QWxsUGFnZXMoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHF1ZXJ5UGFnZXIpKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldEFsbFBhZ2VzIiwgYXJncykpOworCX0KKworCXB1YmxpYyBQcm9wZXJ0aWVzIGdldENhbGFsb2dQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUHJvcGVydGllcy5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRDYWxhbG9nUHJvcGVydGllcyIsIG5ldyBWZWN0b3I8T2JqZWN0PigpKSk7CisJfQorCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZChjYXRhbG9nVXJuKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChQcm9wZXJ0aWVzLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldENhbGFsb2dQcm9wZXJ0aWVzIiwgYXJncykpOworCX0KKworLy8JcHVibGljIENhdGFsb2cgZ2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworLy8JCWFyZ3MuYWRkKGNhdGFsb2dVcm4pOworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoQ2F0YWxvZy5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRDYXRhbG9nIiwgYXJncykpOworLy8JfQorCisvLwlwdWJsaWMgQ2F0YWxvZ1JlcG9zaXRvcnkgZ2V0Q2F0YWxvZ1JlcG9zaXRvcnkoKQorLy8JCQl0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KENhdGFsb2dSZXBvc2l0b3J5LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldENhdGFsb2dSZXBvc2l0b3J5IiwgbmV3IFZlY3RvcjxPYmplY3Q+KCkpKTsKKy8vCX0KKworCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCgKKwkJCVRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIFN0cmluZyBjYXRhbG9nVXJuKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChjYXRhbG9nVHJhbnNhY3Rpb25JZCkpOworCQlhcmdzLmFkZChjYXRhbG9nVXJuKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChUcmFuc2FjdGlvbklkLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCIsIGFyZ3MpKTsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwKKwkJCWJvb2xlYW4gZ2VuZXJhdGVOZXcpIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoY2F0YWxvZ1JlY2VpcHQpKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChuZXcgQm9vbGVhbihnZW5lcmF0ZU5ldykpKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChUcmFuc2FjdGlvbklkLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZDIiLCBhcmdzKSk7CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcygKKwkJCUxpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1RyYW5zYWN0aW9uSWRzLCBTdHJpbmcgY2F0YWxvZ1VybikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoY2F0YWxvZ1RyYW5zYWN0aW9uSWRzKSk7CisJCWFyZ3MuYWRkKGNhdGFsb2dVcm4pOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KExpc3QuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkIiwgYXJncykpOworCX0KKworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDdXJyZW50Q2F0YWxvZ0lkcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFNldC5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRDdXJyZW50Q2F0YWxvZ0lkcyIsIG5ldyBWZWN0b3I8T2JqZWN0PigpKSk7CisJfQorCisvLwlwdWJsaWMgU2V0PENhdGFsb2c+IGdldEN1cnJlbnRDYXRhbG9nTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoU2V0LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldEN1cnJlbnRDYXRhbG9nTGlzdCIsIG5ldyBWZWN0b3I8T2JqZWN0PigpKSk7CisvLwl9CisvLworLy8JcHVibGljIEluZ2VzdE1hcHBlciBnZXRJbmdlc3RNYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCisvLwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChJbmdlc3RNYXBwZXIuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0SW5nZXN0TWFwcGVyIiwgbmV3IFZlY3RvcjxPYmplY3Q+KCkpKTsKKy8vCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZFN0cmluZ3MoCisJCQlMaXN0PFN0cmluZz4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5ncykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5ncykpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KExpc3QuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZFN0cmluZ3MiLCBhcmdzKSk7CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkcygKKwkJCUxpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcykpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KExpc3QuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMiLCBhcmdzKSk7CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXROZXh0UGFnZShRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHF1ZXJ5UGFnZXIpKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldE5leHRQYWdlIiwgYXJncykpOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQoa2V5KTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldFByb3BlcnR5IiwgYXJncykpOworCX0KKworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgVHJhbnNhY3Rpb25JZDw/Pj4gZ2V0VHJhbnNhY3Rpb25JZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoQ2xhc3MuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0VHJhbnNhY3Rpb25JZENsYXNzIiwgbmV3IFZlY3RvcjxPYmplY3Q+KCkpKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBnZXRUcmFuc2FjdGlvbklkc0ZvckFsbFBhZ2VzKAorCQkJUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHF1ZXJ5UGFnZXIpKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldFRyYW5zYWN0aW9uSWRzRm9yQWxsUGFnZXMiLCBhcmdzKSk7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uUmVjZWlwdCBpbmdlc3QoTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KG1ldGFkYXRhKSk7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoVHJhbnNhY3Rpb25SZWNlaXB0LmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2luZ2VzdCIsIGFyZ3MpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChCb29sZWFuLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2lzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyIsIG5ldyBWZWN0b3I8T2JqZWN0PigpKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChCb29sZWFuLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2lzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zIiwgbmV3IFZlY3RvcjxPYmplY3Q+KCkpKTsKKwl9CisKKwlwdWJsaWMgUGFnZSBnZXRGaXJzdFBhZ2UoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChQYWdlLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldEZpcnN0UGFnZSIsIGFyZ3MpKTsKKwl9CisKKwlwdWJsaWMgUGFnZSBnZXRGaXJzdFBhZ2UoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChjYXRhbG9nSWRzKSk7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUGFnZS5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRGaXJzdFBhZ2UiLCBhcmdzKSk7CisJfQorCQorCXB1YmxpYyBQYWdlIGdldE5leHRQYWdlKFBhZ2UgcGFnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChwYWdlKSk7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUGFnZS5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXROZXh0UGFnZTIiLCBhcmdzKSk7CisJfQorCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QocGFnZUluZm8pKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChQYWdlLmNsYXNzLCAoU3RyaW5nKSB0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX2dldFBhZ2UiLCBhcmdzKSk7CisJfQorCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QocGFnZUluZm8pKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChjYXRhbG9nSWRzKSk7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUGFnZS5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRQYWdlIiwgYXJncykpOworCX0KKwkKKwlwdWJsaWMgUGFnZSBnZXRMYXN0UGFnZShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHF1ZXJ5RXhwcmVzc2lvbikpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFBhZ2UuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0TGFzdFBhZ2UiLCBhcmdzKSk7CisJfQorCisJcHVibGljIFBhZ2UgZ2V0TGFzdFBhZ2UoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChjYXRhbG9nSWRzKSk7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUGFnZS5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19nZXRMYXN0UGFnZSIsIGFyZ3MpKTsKKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YShQYWdlIHBhZ2UpIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QocGFnZSkpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KExpc3QuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfZ2V0TWV0YWRhdGEiLCBhcmdzKSk7CisJfQorCQorCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHF1ZXJ5RXhwcmVzc2lvbikpOworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFF1ZXJ5UGFnZXIuY2xhc3MsIChTdHJpbmcpIHRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfcXVlcnkiLCBhcmdzKSk7CisJfQorCisJcHVibGljIFF1ZXJ5UGFnZXIgcXVlcnkoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChjYXRhbG9nSWRzKSk7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUXVlcnlQYWdlci5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19xdWVyeSIsIGFyZ3MpKTsKKwl9CisJCisvLwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBib29sZWFuIHNvcnRSZXN1bHRzKQorLy8JCQl0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisvLwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChxdWVyeUV4cHJlc3Npb24pKTsKKy8vCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KG5ldyBCb29sZWFuKHNvcnRSZXN1bHRzKSkpOworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUXVlcnlQYWdlci5jbGFzcywgKFN0cmluZykgdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19xdWVyeSIsIGFyZ3MpKTsKKy8vCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGFsb2coU3RyaW5nIGNhdGFsb2dVcm4pIHRocm93cyBFeGNlcHRpb24geworCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisJCWFyZ3MuYWRkKGNhdGFsb2dVcm4pOworCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX3JlbW92ZUNhdGFsb2ciLCBhcmdzKTsJCQorCX0KKworLy8JcHVibGljIHZvaWQgcmVtb3ZlQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybiwgYm9vbGVhbiBwcmVzZXJ2ZU1hcHBpbmcpCisvLwkJCXRocm93cyBFeGNlcHRpb24geworLy8JCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKy8vCQlhcmdzLmFkZChjYXRhbG9nVXJuKTsKKy8vCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KG5ldyBCb29sZWFuKHByZXNlcnZlTWFwcGluZykpKTsKKy8vCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX3JlbW92ZUNhdGFsb2ciLCBhcmdzKTsJCQorLy8JfQorCisvLwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nUmVwb3NpdG9yeShDYXRhbG9nUmVwb3NpdG9yeSBjYXRhbG9nUmVwb3NpdG9yeSkKKy8vCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworLy8JCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QoY2F0YWxvZ1JlcG9zaXRvcnkpKTsKKy8vCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX3NldENhdGFsb2dSZXBvc2l0b3J5IiwgYXJncyk7CisvLwl9CisKKy8vCXB1YmxpYyB2b2lkIHNldEhhc0luZ2VzdFBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworLy8JCWFyZ3MuYWRkKHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QobmV3IEJvb2xlYW4ocmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucykpKTsKKy8vCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX3NldEhhc0luZ2VzdFBlcm1pc3Npb25zIiwgYXJncyk7CQkKKy8vCX0KKworLy8JcHVibGljIHZvaWQgc2V0SW5nZXN0TWFwcGVyKEluZ2VzdE1hcHBlciBpbmdlc3RNYXBwZXIpIHRocm93cyBFeGNlcHRpb24geworLy8JCVZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKy8vCQlhcmdzLmFkZCh0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KGluZ2VzdE1hcHBlcikpOworLy8JCXRoaXMuY2xpZW50LmV4ZWN1dGUoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi54bWxycGNfc2V0SW5nZXN0TWFwcGVyIiwgYXJncyk7CQkKKy8vCX0KKworLy8JcHVibGljIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisvLwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChuZXcgQm9vbGVhbihyZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMpKSk7CisvLwkJdGhpcy5jbGllbnQuZXhlY3V0ZShYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLnhtbHJwY19zZXRSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMiLCBhcmdzKTsJCQkKKy8vCX0KKworLy8JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25JZENsYXNzKAorLy8JCQlDbGFzczw/IGV4dGVuZHMgVHJhbnNhY3Rpb25JZDw/Pj4gdHJhbnNhY3Rpb25JZENsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlWZWN0b3I8T2JqZWN0PiBhcmdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisvLwkJYXJncy5hZGQodGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0cmFuc2FjdGlvbklkQ2xhc3MpKTsKKy8vCQl0aGlzLmNsaWVudC5leGVjdXRlKFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIueG1scnBjX3NldFRyYW5zYWN0aW9uSWRDbGFzcyIsIGFyZ3MpOwkJCisvLwl9CisKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3htbHJwYy9YbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC94bWxycGMvWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwMWFjMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC94bWxycGMvWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC54bWxycGM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC5Db21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWwuQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5OworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8vT09EVCBpbXBvcnRzCisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIGNyZWF0aW5nIFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeSBpbXBsZW1lbnRzCisJCUNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJVcmw7CisJcHJvdGVjdGVkIGludCBjb25uZWN0aW9uVGltZW91dDsKKwlwcm90ZWN0ZWQgaW50IHJlcXVlc3RUaW1lb3V0OworCXByb3RlY3RlZCBpbnQgY2h1bmtTaXplOworCQorCXB1YmxpYyBYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEZhY3RvcnkoKSB7fQorCQorCXB1YmxpYyBDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCBjcmVhdGVDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQobmV3IFVSTCh0aGlzLnNlcnZlclVybCksIHRoaXMuY29ubmVjdGlvblRpbWVvdXQsIHRoaXMucmVxdWVzdFRpbWVvdXQsIHRoaXMuY2h1bmtTaXplKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gY3JlYXRlIFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsQ2xpZW50IDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFNlcnZlclVybChTdHJpbmcgc2VydmVyVXJsKSB7CisJCXRoaXMuc2VydmVyVXJsID0gc2VydmVyVXJsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZlclVybCgpIHsKKwkJcmV0dXJuIHRoaXMuc2VydmVyVXJsOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gY29ubmVjdGlvblRpbWVvdXQgdGltZW91dCBmb3IgY2xpZW50IGluIG1pbnV0ZXMKKwkgKi8KKwlAUmVxdWlyZWQKKwlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVGltZW91dChpbnQgY29ubmVjdGlvblRpbWVvdXQpIHsKKwkJdGhpcy5jb25uZWN0aW9uVGltZW91dCA9IGNvbm5lY3Rpb25UaW1lb3V0OworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdFRpbWVvdXQgdGltb3V0IGZvciBjbGllbnQgaW4gbWludXRlcworCSAqLworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RUaW1lb3V0KGludCByZXF1ZXN0VGltZW91dCkgeworCQl0aGlzLnJlcXVlc3RUaW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQ7CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldENodW5rU2l6ZShpbnQgY2h1bmtTaXplKSB7CisJCXRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3htbHJwYy9YbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3htbHJwYy9YbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjJjYTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc2VydmVyL2NoYW5uZWwveG1scnBjL1htbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyLmphdmEKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWwueG1scnBjOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLkFic3RyYWN0Q29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5EaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuV2ViU2VydmVyOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBDb21tdW5pY2F0aW9uIENoYW5uZWwgU2VydmVyIG92ZXIgWE1MLVJQQworICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlciBleHRlbmRzCisJCUFic3RyYWN0Q29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIgeworCisJcHJpdmF0ZSBXZWJTZXJ2ZXIgd2ViU2VydmVyOworCQorCXB1YmxpYyBYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLndlYlNlcnZlciA9IG5ldyBXZWJTZXJ2ZXIodGhpcy5wb3J0KTsKKwkJdGhpcy53ZWJTZXJ2ZXIuYWRkSGFuZGxlcih0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCB0aGlzKTsKKwkJdGhpcy53ZWJTZXJ2ZXIuc3RhcnQoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4geG1scnBjX3NodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuc2h1dGRvd24oKTsKKwkJdGhpcy53ZWJTZXJ2ZXIuc2h1dGRvd24oKTsKKwkJdGhpcy53ZWJTZXJ2ZXIgPSBudWxsOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4geG1scnBjX2FkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmFkZENhdGFsb2codGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KENhdGFsb2cuY2xhc3MsIGNhdGFsb2dPYmplY3QpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHhtbHJwY19yZXBsYWNlQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMucmVwbGFjZUNhdGFsb2codGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KENhdGFsb2cuY2xhc3MsIGNhdGFsb2dPYmplY3QpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHhtbHJwY19hZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyBpbmRleE9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuYWRkQ2F0YWxvZyhjYXRhbG9nSWQsIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChJbmRleC5jbGFzcywgaW5kZXhPYmplY3QpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHhtbHJwY19hZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyBpbmRleE9iamVjdCwgU3RyaW5nIGRpY3Rpb25hcmllc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuYWRkQ2F0YWxvZyhjYXRhbG9nSWQsIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChJbmRleC5jbGFzcywgaW5kZXhPYmplY3QpLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoTGlzdC5jbGFzcywgZGljdGlvbmFyaWVzT2JqZWN0KSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIHhtbHJwY19hZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyBpbmRleE9iamVjdCwgU3RyaW5nIGRpY3Rpb25hcmllc09iamVjdCwgU3RyaW5nIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uT2JqZWN0LCBTdHJpbmcgcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5hZGRDYXRhbG9nKGNhdGFsb2dJZCwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KEluZGV4LmNsYXNzLCBpbmRleE9iamVjdCksIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCBkaWN0aW9uYXJpZXNPYmplY3QpLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoQm9vbGVhbi5jbGFzcywgcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25PYmplY3QpLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoQm9vbGVhbi5jbGFzcywgcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uT2JqZWN0KSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIHhtbHJwY19hZGREaWN0aW9uYXJ5KFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyBkaWN0aW9uYXJ5T2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5hZGREaWN0aW9uYXJ5KGNhdGFsb2dJZCwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KERpY3Rpb25hcnkuY2xhc3MsIGRpY3Rpb25hcnlPYmplY3QpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHhtbHJwY19yZXBsYWNlRGljdGlvbmFyaWVzKFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyBkaWN0aW9uYXJpZXNPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnJlcGxhY2VEaWN0aW9uYXJpZXMoY2F0YWxvZ0lkLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoTGlzdC5jbGFzcywgZGljdGlvbmFyaWVzT2JqZWN0KSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIHhtbHJwY19yZXBsYWNlSW5kZXgoU3RyaW5nIGNhdGFsb2dJZCwgU3RyaW5nIGluZGV4T2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5yZXBsYWNlSW5kZXgoY2F0YWxvZ0lkLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoSW5kZXguY2xhc3MsIGluZGV4T2JqZWN0KSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIHhtbHJwY19tb2RpZnlJbmdlc3RQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25PYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLm1vZGlmeUluZ2VzdFBlcm1pc3Npb24oY2F0YWxvZ0lkLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoQm9vbGVhbi5jbGFzcywgcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uT2JqZWN0KSk7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB4bWxycGNfbW9kaWZ5UXVlcnlQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsIFN0cmluZyByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbk9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMubW9kaWZ5SW5nZXN0UGVybWlzc2lvbihjYXRhbG9nSWQsIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChCb29sZWFuLmNsYXNzLCByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbk9iamVjdCkpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4geG1scnBjX2RlbGV0ZShTdHJpbmcgbWV0YWRhdGFPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmRlbGV0ZSh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoTWV0YWRhdGEuY2xhc3MsIG1ldGFkYXRhT2JqZWN0KSk7CQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIFN0cmluZyB4bWxycGNfZ2V0UGx1Z2luVXJscygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldFBsdWdpblVybHMoKSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHhtbHJwY19hZGRQbHVnaW5VcmxzKFN0cmluZyBwbHVnaW5VcmxzT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5hZGRQbHVnaW5VcmxzKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCBwbHVnaW5VcmxzT2JqZWN0KSk7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRQbHVnaW5TdG9yYWdlRGlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0UGx1Z2luU3RvcmFnZURpcigpKTsKKwl9CisJCisgICAgcHVibGljIGJvb2xlYW4geG1scnBjX3RyYW5zZmVyRmlsZShTdHJpbmcgZmlsZVBhdGgsIGJ5dGVbXSBmaWxlRGF0YSwgaW50IG9mZnNldCwgaW50IG51bUJ5dGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmT3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKwkgICAgICAgIGlmIChvdXRGaWxlLmV4aXN0cygpKSAKKwkgICAgICAgIAlmT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSwgdHJ1ZSk7CisJICAgICAgICBlbHNlIAorCSAgICAgICAgCWZPdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlLCBmYWxzZSk7CisJCisJICAgICAgICBmT3V0LndyaXRlKGZpbGVEYXRhLCAoaW50KSBvZmZzZXQsIChpbnQpIG51bUJ5dGVzKTsKKyAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAJdGhyb3cgZTsKKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAJdHJ5IHsKKyAgICAgICAgCQlmT3V0LmNsb3NlKCk7CisgICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisJcHVibGljIFN0cmluZyB4bWxycGNfZ2V0QWxsUGFnZXMoU3RyaW5nIHF1ZXJ5UGFnZXJPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldEFsbFBhZ2VzKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChRdWVyeVBhZ2VyLmNsYXNzLCBxdWVyeVBhZ2VyT2JqZWN0KSkpOwkKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRDYWxhbG9nUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldENhbGFsb2dQcm9wZXJ0aWVzKCkpOwkKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldENhbGFsb2dQcm9wZXJ0aWVzKGNhdGFsb2dVcm4pKTsJCisJfQorCisvLwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldENhdGFsb2coY2F0YWxvZ1VybikpOwkKKy8vCX0KKworCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCgKKwkJCVN0cmluZyBjYXRhbG9nVHJhbnNhY3Rpb25JZE9iamVjdCwgU3RyaW5nIGNhdGFsb2dVcm4pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQodGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFRyYW5zYWN0aW9uSWQuY2xhc3MsIGNhdGFsb2dUcmFuc2FjdGlvbklkT2JqZWN0KSwgY2F0YWxvZ1VybikpOwkKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQyKAorCQkJU3RyaW5nIGNhdGFsb2dSZWNlaXB0T2JqZWN0LAorCQkJU3RyaW5nIGdlbmVyYXRlTmV3T2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQodGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KENhdGFsb2dSZWNlaXB0LmNsYXNzLCBjYXRhbG9nUmVjZWlwdE9iamVjdCksIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChCb29sZWFuLmNsYXNzLCBnZW5lcmF0ZU5ld09iamVjdCkpKTsJCisJfQorCisJcHVibGljIFN0cmluZyB4bWxycGNfZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcygKKwkJCVN0cmluZyBjYXRhbG9nVHJhbnNhY3Rpb25JZHNPYmplY3QsIFN0cmluZyBjYXRhbG9nVXJuKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoTGlzdC5jbGFzcywgY2F0YWxvZ1RyYW5zYWN0aW9uSWRzT2JqZWN0KSwgY2F0YWxvZ1VybikpOwkKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRDdXJyZW50Q2F0YWxvZ0lkcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldEN1cnJlbnRDYXRhbG9nSWRzKCkpOwkKKwl9CisKKy8vCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldEN1cnJlbnRDYXRhbG9nTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0Q3VycmVudENhdGFsb2dMaXN0KCkpOwkKKy8vCX0KKworCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRTdHJpbmdzKAorCQkJU3RyaW5nIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZFN0cmluZ3NPYmplY3QpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncyh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoTGlzdC5jbGFzcywgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5nc09iamVjdCkpKTsJCisJfQorCisJcHVibGljIFN0cmluZyB4bWxycGNfZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoCisJCQlTdHJpbmcgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkc09iamVjdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRzKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChMaXN0LmNsYXNzLCBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzT2JqZWN0KSkpOwkKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXROZXh0UGFnZShTdHJpbmcgcXVlcnlQYWdlck9iamVjdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldE5leHRQYWdlKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChRdWVyeVBhZ2VyLmNsYXNzLCBxdWVyeVBhZ2VyT2JqZWN0KSkpOwkKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXRQcm9wZXJ0eShrZXkpKTsJCisJfQorLy8KKy8vCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldFRyYW5zYWN0aW9uSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0VHJhbnNhY3Rpb25JZENsYXNzKCkpOwkKKy8vCX0KKworLy8JcHVibGljIFN0cmluZyB4bWxycGNfZ2V0VHJhbnNhY3Rpb25JZHNGb3JBbGxQYWdlcygKKy8vCQkJU3RyaW5nIHF1ZXJ5UGFnZXJPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0VHJhbnNhY3Rpb25JZHNGb3JBbGxQYWdlcyh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUXVlcnlQYWdlci5jbGFzcywgcXVlcnlQYWdlck9iamVjdCkpKTsJCisvLwl9CisKKwlwdWJsaWMgU3RyaW5nIHhtbHJwY19pbmdlc3QoU3RyaW5nIG1ldGFkYXRhT2JqZWN0KQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuaW5nZXN0KHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChNZXRhZGF0YS5jbGFzcywgbWV0YWRhdGFPYmplY3QpKSk7CQorCX0KKworCXB1YmxpYyBTdHJpbmcgeG1scnBjX2lzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdChuZXcgQm9vbGVhbih0aGlzLmlzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucygpKSk7CQorCX0KKworCXB1YmxpYyBTdHJpbmcgeG1scnBjX2lzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KG5ldyBCb29sZWFuKHRoaXMuaXNSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMoKSkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgeG1scnBjX3F1ZXJ5KFN0cmluZyBxdWVyeUV4cHJlc3Npb25PYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLnF1ZXJ5KHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChRdWVyeUV4cHJlc3Npb24uY2xhc3MsIHF1ZXJ5RXhwcmVzc2lvbk9iamVjdCkpKTsJCisJfQorCisJcHVibGljIFN0cmluZyB4bWxycGNfcXVlcnkoU3RyaW5nIHF1ZXJ5RXhwcmVzc2lvbk9iamVjdCwgU3RyaW5nIGNhdGFsb2dJZHNPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLnF1ZXJ5KHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChRdWVyeUV4cHJlc3Npb24uY2xhc3MsIHF1ZXJ5RXhwcmVzc2lvbk9iamVjdCksIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChTZXQuY2xhc3MsIGNhdGFsb2dJZHNPYmplY3QpKSk7CQorCX0KKwkKKy8vCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldEZpcnN0UGFnZShTdHJpbmcgcXVlcnlFeHByZXNzaW9uT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldEZpcnN0UGFnZSh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUXVlcnlFeHByZXNzaW9uLmNsYXNzLCBxdWVyeUV4cHJlc3Npb25PYmplY3QpKSk7CQorLy8JfQorLy8KKy8vCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldEZpcnN0UGFnZShTdHJpbmcgcXVlcnlFeHByZXNzaW9uT2JqZWN0LCBTdHJpbmcgY2F0YWxvZ0lkc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXRGaXJzdFBhZ2UodGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFF1ZXJ5RXhwcmVzc2lvbi5jbGFzcywgcXVlcnlFeHByZXNzaW9uT2JqZWN0KSwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFNldC5jbGFzcywgY2F0YWxvZ0lkc09iamVjdCkpKTsJCisvLwl9CisJCisJcHVibGljIFN0cmluZyB4bWxycGNfZ2V0TmV4dFBhZ2UyKFN0cmluZyBwYWdlT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXROZXh0UGFnZSh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUGFnZS5jbGFzcywgcGFnZU9iamVjdCkpKTsJCisJfQorCQorCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldFBhZ2UoU3RyaW5nIHBhZ2VJbmZvT2JqZWN0LCBTdHJpbmcgcXVlcnlFeHByZXNzaW9uT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemVPYmplY3QodGhpcy5nZXRQYWdlKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChQYWdlSW5mby5jbGFzcywgcGFnZUluZm9PYmplY3QpLCB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUXVlcnlFeHByZXNzaW9uLmNsYXNzLCBxdWVyeUV4cHJlc3Npb25PYmplY3QpKSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgeG1scnBjX2dldFBhZ2UoU3RyaW5nIHBhZ2VJbmZvT2JqZWN0LCBTdHJpbmcgcXVlcnlFeHByZXNzaW9uT2JqZWN0LCBTdHJpbmcgY2F0YWxvZ0lkc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0UGFnZSh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoUGFnZUluZm8uY2xhc3MsIHBhZ2VJbmZvT2JqZWN0KSwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFF1ZXJ5RXhwcmVzc2lvbi5jbGFzcywgcXVlcnlFeHByZXNzaW9uT2JqZWN0KSwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFNldC5jbGFzcywgY2F0YWxvZ0lkc09iamVjdCkpKTsKKwl9CisJCisvLwlwdWJsaWMgU3RyaW5nIHhtbHJwY19nZXRMYXN0UGFnZShTdHJpbmcgcXVlcnlFeHByZXNzaW9uT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldExhc3RQYWdlKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChRdWVyeUV4cHJlc3Npb24uY2xhc3MsIHF1ZXJ5RXhwcmVzc2lvbk9iamVjdCkpKTsJCisvLwl9CisvLworLy8JcHVibGljIFN0cmluZyB4bWxycGNfZ2V0TGFzdFBhZ2UoU3RyaW5nIHF1ZXJ5RXhwcmVzc2lvbk9iamVjdCwgU3RyaW5nIGNhdGFsb2dJZHNPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworLy8JCXJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KHRoaXMuZ2V0TGFzdFBhZ2UodGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFF1ZXJ5RXhwcmVzc2lvbi5jbGFzcywgcXVlcnlFeHByZXNzaW9uT2JqZWN0KSwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KFNldC5jbGFzcywgY2F0YWxvZ0lkc09iamVjdCkpKTsJCisvLwl9CisJCisJcHVibGljIFN0cmluZyB4bWxycGNfZ2V0TWV0YWRhdGEoU3RyaW5nIHBhZ2VPYmplY3QpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLmdldE1ldGFkYXRhKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChQYWdlLmNsYXNzLCBwYWdlT2JqZWN0KSkpOworCX0KKwkKKy8vCXB1YmxpYyBTdHJpbmcgeG1scnBjX3F1ZXJ5KFN0cmluZyBxdWVyeUV4cHJlc3Npb25PYmplY3QsIFN0cmluZyBzb3J0UmVzdWx0c09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKy8vCQlyZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZU9iamVjdCh0aGlzLnF1ZXJ5KHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChRdWVyeUV4cHJlc3Npb24uY2xhc3MsIHF1ZXJ5RXhwcmVzc2lvbk9iamVjdCksIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChCb29sZWFuLmNsYXNzLCBzb3J0UmVzdWx0c09iamVjdCkpKTsJCisvLwl9CisKKwlwdWJsaWMgYm9vbGVhbiB4bWxycGNfcmVtb3ZlQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMucmVtb3ZlQ2F0YWxvZyhjYXRhbG9nVXJuKTsKKwkJcmV0dXJuIHRydWU7CisJfQorLy8KKy8vCXB1YmxpYyBib29sZWFuIHhtbHJwY19yZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuLCBTdHJpbmcgcHJlc2VydmVNYXBwaW5nT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQl0aGlzLnJlbW92ZUNhdGFsb2coY2F0YWxvZ1VybiwgdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KEJvb2xlYW4uY2xhc3MsIHByZXNlcnZlTWFwcGluZ09iamVjdCkpOwkKKy8vCQlyZXR1cm4gdHJ1ZTsKKy8vCX0KKy8vCQorLy8JcHVibGljIGJvb2xlYW4geG1scnBjX3NldEhhc0luZ2VzdFBlcm1pc3Npb25zKFN0cmluZyByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQl0aGlzLnNldEhhc0luZ2VzdFBlcm1pc3Npb25zKHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZU9iamVjdChCb29sZWFuLmNsYXNzLCByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zT2JqZWN0KSk7CQorLy8JCXJldHVybiB0cnVlOworLy8JfQorLy8KKy8vCXB1YmxpYyBib29sZWFuIHhtbHJwY19zZXRSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMoU3RyaW5nIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJdGhpcy5zZXRSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnModGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplT2JqZWN0KEJvb2xlYW4uY2xhc3MsIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uc09iamVjdCkpOwkJCisvLwkJcmV0dXJuIHRydWU7CisvLwl9CisKKy8vCXB1YmxpYyBib29sZWFuIHNldFRyYW5zYWN0aW9uSWRDbGFzcyhTdHJpbmcgdHJhbnNhY3Rpb25JZENsYXNzT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQl0aGlzLnNldFRyYW5zYWN0aW9uSWRDbGFzcyh0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPYmplY3QoQ2xhc3MuY2xhc3MsIHRyYW5zYWN0aW9uSWRDbGFzc09iamVjdCkpOwkKKy8vCQlyZXR1cm4gdHJ1ZTsKKy8vCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jaGFubmVsL3htbHJwYy9YbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC94bWxycGMvWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1ZDRkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2hhbm5lbC94bWxycGMvWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC54bWxycGM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLkNvbW11bmljYXRpb25DaGFubmVsU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC5Db21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nU2VydmljZUZhY3Rvcnk7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLy9PT0RUIGltcG9ydHMKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcgWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5IHsKKwkKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwlwcm90ZWN0ZWQgaW50IHBvcnQ7CisJcHJvdGVjdGVkIENhdGFsb2dTZXJ2aWNlRmFjdG9yeSBjYXRhbG9nU2VydmljZUZhY3Rvcnk7CisJCisJcHVibGljIFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyRmFjdG9yeSgpIHt9CisJCisJcHVibGljIENvbW11bmljYXRpb25DaGFubmVsU2VydmVyIGNyZWF0ZUNvbW11bmljYXRpb25DaGFubmVsU2VydmVyKCkgeworCQl0cnkgeworCQkJWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXIgc2VydmVyID0gbmV3IFhtbFJwY0NvbW11bmljYXRpb25DaGFubmVsU2VydmVyKCk7CisJCQlzZXJ2ZXIuc2V0Q2F0YWxvZ1NlcnZpY2UodGhpcy5jYXRhbG9nU2VydmljZUZhY3RvcnkuY3JlYXRlQ2F0YWxvZ1NlcnZpY2UoKSk7CisJCQlzZXJ2ZXIuc2V0UG9ydCh0aGlzLnBvcnQpOworCQkJcmV0dXJuIHNlcnZlcjsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gY3JlYXRlIFhNTC1SUEMgc2VydmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKwkJdGhpcy5wb3J0ID0gcG9ydDsKKwl9CisJCisJcHVibGljIGludCBnZXRQb3J0KCkgeworCQlyZXR1cm4gdGhpcy5wb3J0OworCX0KKwkKKwlAUmVxdWlyZWQKKwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nU2VydmljZUZhY3RvcnkoQ2F0YWxvZ1NlcnZpY2VGYWN0b3J5IGNhdGFsb2dTZXJ2aWNlRmFjdG9yeSkgeworCQl0aGlzLmNhdGFsb2dTZXJ2aWNlRmFjdG9yeSA9IGNhdGFsb2dTZXJ2aWNlRmFjdG9yeTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2xpL2FjdGlvbi9DYXRhbG9nU2VydmljZVNlcnZlckNsaUFjdGlvbi5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jbGkvYWN0aW9uL0NhdGFsb2dTZXJ2aWNlU2VydmVyQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjYmIzZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2xpL2FjdGlvbi9DYXRhbG9nU2VydmljZVNlcnZlckNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmcuSW5nZXN0TWFwcGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5DYXRhbG9nUmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CisKKy8qKgorICogQmFzZSBDYXRhbG9nIFNlcnZpY2UgU2VydmVyIHtAbGluayBDbWRMaW5lQWN0aW9ufS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENhdGFsb2dTZXJ2aWNlU2VydmVyQ2xpQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgIHJldHVybiBJbnRlZ2VyLmdldEludGVnZXIoIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wb3J0Iik7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKyAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy50cmFuc2FjdGlvbmlkIik7CisgICB9CisKKyAgIHB1YmxpYyBDYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkgZ2V0UmVwb3NpdG9yeSgpCisgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgcmV0dXJuIChDYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkpIENsYXNzLmZvck5hbWUoCisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5IikpCisgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgIH0KKworICAgcHVibGljIEluZ2VzdE1hcHBlckZhY3RvcnkgZ2V0SW5nZXN0TWFwcGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiAoSW5nZXN0TWFwcGVyRmFjdG9yeSkgQ2xhc3MuZm9yTmFtZSgKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmluZ2VzdG1hcHBlciIpKQorICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIGdldFJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpIHsKKyAgICAgIHJldHVybiBCb29sZWFuCisgICAgICAgICAgICAuZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlc3RyaWN0LnF1ZXJ5LnBlcm1pc3Npb25zIik7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIGdldFJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMoKSB7CisgICAgICByZXR1cm4gQm9vbGVhbgorICAgICAgICAgICAgLmdldEJvb2xlYW4oIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXN0cmljdC5pbmdlc3QucGVybWlzc2lvbnMiKTsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gZ2V0T25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCgpIHsKKyAgICAgIHJldHVybiBCb29sZWFuCisgICAgICAgICAgICAuZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm9uZUNhdGFsb2dGYWlsc0FsbEZhaWwiKTsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gZ2V0U2ltcGxpZnlRdWVyaWVzKCkgeworICAgICAgcmV0dXJuIEJvb2xlYW4uZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNpbXBsaWZ5UXVlcmllcyIpOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlSW50ZXJzZWN0aW5nQ3Jvc3NDYXRhbG9nUXVlcmllcygpIHsKKyAgICAgIHJldHVybiBCb29sZWFuCisgICAgICAgICAgICAuZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzIik7CisgICB9CisKKyAgIHB1YmxpYyBpbnQgZ2V0Q3Jvc3NDYXRhbG9nUmVzdWx0U29ydGluZ1RocmVzaG9sZCgpIHsKKyAgICAgIHJldHVybiBJbnRlZ2VyCisgICAgICAgICAgICAuZ2V0SW50ZWdlcigib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQiKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2xpL2FjdGlvbi9MYXVuY2hYbWxScGNTZXJ2ZXJDbGlBY3Rpb24uamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zZXJ2ZXIvY2xpL2FjdGlvbi9MYXVuY2hYbWxScGNTZXJ2ZXJDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY0NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3NlcnZlci9jbGkvYWN0aW9uL0xhdW5jaFhtbFJwY1NlcnZlckNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLnhtbHJwYy5YbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5pbXBsLkNhdGFsb2dTZXJ2aWNlTG9jYWxGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBMYXVuY2hYbWxScGNTZXJ2ZXJDbGlBY3Rpb24gZXh0ZW5kcyBDYXRhbG9nU2VydmljZVNlcnZlckNsaUFjdGlvbiB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3RhcnRpbmcgWE1MLVJQQyBzZXJ2ZXIgb24gcG9ydCAiICsgZ2V0UG9ydCgpKTsKKyAgICAgICAgIGdldFhtbFJwY0ZhY3RvcnkoKS5jcmVhdGVDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlcigpLnN0YXJ0dXAoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHN0YXJ0dXAgc2VydmVyIDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHByb3RlY3RlZCBYbWxScGNDb21tdW5pY2F0aW9uQ2hhbm5lbFNlcnZlckZhY3RvcnkgZ2V0WG1sUnBjRmFjdG9yeSgpCisgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5KCk7CisgICAgICBmYWN0b3J5LnNldFBvcnQoZ2V0UG9ydCgpKTsKKyAgICAgIGZhY3Rvcnkuc2V0Q2F0YWxvZ1NlcnZpY2VGYWN0b3J5KGdldENhdGFsb2dTZXJ2aWNlRmFjdG9yeSgpKTsKKyAgICAgIHJldHVybiBmYWN0b3J5OworICAgfQorCisgICBwcm90ZWN0ZWQgQ2F0YWxvZ1NlcnZpY2VMb2NhbEZhY3RvcnkgZ2V0Q2F0YWxvZ1NlcnZpY2VGYWN0b3J5KCkKKyAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICBDYXRhbG9nU2VydmljZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IENhdGFsb2dTZXJ2aWNlTG9jYWxGYWN0b3J5KCk7CisgICAgICBmYWN0b3J5LnNldFRyYW5zYWN0aW9uSWRGYWN0b3J5KGdldFRyYW5zYWN0aW9uSWQoKSk7CisgICAgICBmYWN0b3J5LnNldENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeShnZXRSZXBvc2l0b3J5KCkpOworICAgICAgZmFjdG9yeS5zZXRJbmdlc3RNYXBwZXJGYWN0b3J5KGdldEluZ2VzdE1hcHBlcigpKTsKKyAgICAgIGZhY3Rvcnkuc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGdldFJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpKTsKKyAgICAgIGZhY3Rvcnkuc2V0UmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyhnZXRSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKCkpOworICAgICAgZmFjdG9yeS5zZXRPbmVDYXRhbG9nRmFpbHNBbGxGYWlsKGdldE9uZUNhdGFsb2dGYWlsc0FsbEZhaWwoKSk7CisgICAgICBmYWN0b3J5LnNldFNpbXBsaWZ5UXVlcmllcyhnZXRTaW1wbGlmeVF1ZXJpZXMoKSk7CisgICAgICBmYWN0b3J5LnNldERpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzKAorICAgICAgICAgICAgZ2V0RGlzYWJsZUludGVyc2VjdGluZ0Nyb3NzQ2F0YWxvZ1F1ZXJpZXMoKSk7CisgICAgICBmYWN0b3J5LnNldENyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQoCisgICAgICAgICAgICBnZXRDcm9zc0NhdGFsb2dSZXN1bHRTb3J0aW5nVGhyZXNob2xkKCkpOworICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0RpY3Rpb25hcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOWQ1MTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0RpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybUJ1Y2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBEaWN0aW9uYXJ5IGZvciBjcmVhdGUgQ2F0YWxvZyB1bmRlcnN0YW5kYWJsZSBUZXJtcyBmcm9tIE1ldGFkYXRhCisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBEaWN0aW9uYXJ5IHsKKworCS8qKgorCSAqIEdpdmVuIGEgTWV0YWRhdGEgb2JqZWN0IGEgbG9va3VwIGNhbGwgdG8gYSBnaXZlbiBkaWN0aW9uYXJ5IHdpbGwKKwkgKiBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIFRlcm1CdWNrZXQuICBIb3dldmVyLCBjYWxscyB0byBzZXZlcmFsCisJICogRGljdGlvbmFyeSdzIGxvb2t1cCBtZXRob2QgbWF5IHJldHVybiBkaWZmZXJlbnQgVGVybUJ1Y2tldHMgZm9yCisJICogYSBnaXZlbiBNZXRhZGF0YSBvYmplY3QuCisJICogQHBhcmFtIG1ldGFkYXRhIFRoZSBNZXRhZGF0YSBmb3Igd2hpY2ggYSBUZXJtQnVja2V0IHdpbGwgYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gVGVybUJ1Y2tldCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIE1ldGFkYXRhIGZvciB0aGlzIERpY3Rpb25hcnkgb3IKKwkgKiBudWxsIGlmIE1ldGFkYXRhIGlzIG5vdCByZWNvZ25pemVkIGJ5IHRoaXMgRGljdGlvbmFyeQorCSAqLworCXB1YmxpYyBUZXJtQnVja2V0IGxvb2t1cChNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uOworCisJLyoqCisJICogR2VuZXJhdGVzIE1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gVGVybUJ1Y2tldC4gIEEgY2FsbCB0byBsb29rdXAoTWV0YWRhdGEpIGFuZAorCSAqIHRoZW4gcmV2ZXJzZUxvb2t1cChUZXJtQnVja2V0KSBtYXkgbm90IGdpdmUgeW91IGJhY2sgdGhlIG9yaWdpbmFsIE1ldGFkYXRhCisJICogYmVjYXVzZSBsb29rdXAgbWF5IGlnbm9yZSBrZXkvdmFsdWVzIGluIE1ldGFkYXRhIGZvciB3aGljaCBpdCBkb2VzIG5vdAorCSAqIHVuZGVyc3RhbmQuCisJICogQHBhcmFtIHRlcm1CdWNrZXQgVGhlIFRlcm1CdWNrZXQgZm9yIHdoaWNoIE1ldGFkYXRhIHdpbGwgYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gTWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBUZXJtQnVja2V0LiAgSWYgdGhlIFRlcm1CdWNrZXQgaXMgbm90IHVuZGVyc3Rvb2QsCisJICogdGhlbiBhbiBlbXB0eSBNZXRhZGF0YSBvYmplY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBNZXRhZGF0YSByZXZlcnNlTG9va3VwKFRlcm1CdWNrZXQgdGVybUJ1Y2tldCkgdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uOworCQkJCisJLyoqCisJICogCisJICogQHBhcmFtIHF1ZXJ5RXhwcmVzc2lvbgorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHMoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9EaWN0aW9uYXJ5RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9EaWN0aW9uYXJ5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODllNDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0RpY3Rpb25hcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGljdGlvbmFyeUZhY3RvcnkgeworCisJcHVibGljIERpY3Rpb25hcnkgY3JlYXRlRGljdGlvbmFyeSgpOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9JbmRleC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9JbmRleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzNlZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0luZGV4LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dJbmRleEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5JbmRleFBhZ2VyOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBJbnRlcmZhY2UgZm9yIENvbW11bmljYXRpbmcgd2l0aCBhbiBUZXJtIEluZGV4LiAgU2hvdWxkIGFsc28gaW1wbGVtZW50CisgKiBJbmdlc3RTZXJ2aWNlIHRvIGFsbG93IFRlcm0gaW5nZXN0IHRvIHRoaXMgSW5kZXggYW5kL29yIGltcGxlbWVudCAKKyAqIFF1ZXJ5U2VydmljZSB0byBhbGxvdyBUZXJtIHF1ZXJ5IG9uIHRoaXMgSW5kZXguCisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBJbmRleCB7CisJCisJcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHRocm93cyBDYXRhbG9nSW5kZXhFeGNlcHRpb247CisJCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uOworCQorCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIFRyYW5zYWN0aW9uSWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCisJICogZ2l2ZW4gSW5kZXggcGFnZS4KKwkgKiBAcGFyYW0gaW5kZXhQYWdlIFRoZSBwYWdlIGZvciB3aGljaCBUcmFuc2FjdGlvbklkcyB3aWxsIGJlIHJldHVybmVkCisJICogQHJldHVybiBBIHBhZ2Ugb2YgVHJhbnNhY3Rpb25JZHMsIGlmIHBhZ2UgZG9lcyBub3QgZXhpc3QsCisJICogdGhlbiByZXR1cm5zIG51bGwuCisJICovCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0UGFnZShJbmRleFBhZ2VyIGluZGV4UGFnZSkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFRyYW5zYWN0aW9uSWRGYWN0b3J5IGdldFRyYW5zYWN0aW9uSWRGYWN0b3J5KCkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gY2F0YWxvZ1RyYW5zYWN0aW9uaWQKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDYXRhbG9nSW5kZXhFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNUcmFuc2FjdGlvbklkKFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25pZCkgIHRocm93cyBDYXRhbG9nSW5kZXhFeGNlcHRpb247CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0luZGV4RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9JbmRleEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODRlZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9JbmRleEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJbmRleEZhY3RvcnkgeworCisJcHVibGljIEluZGV4IGNyZWF0ZUluZGV4KCk7CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0luZ2VzdFNlcnZpY2UuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvSW5nZXN0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDRlZGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L0luZ2VzdFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uSW5nZXN0U2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5Jbmdlc3RSZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy50ZXJtLlRlcm1CdWNrZXQ7CisKKy8vT09EVCBpbXBvcnRzCisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBpbmdlc3RzIHRvIGFuIEluZGV4CisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBJbmdlc3RTZXJ2aWNlIHsKKwkKKwkvKioKKwkgKiBJbmRleGVzIHRoZSBnaXZlbiBUZXJtQnVja2V0IHRvIGEgVHJhbnNhY3Rpb25JZCwgYW5kIHJldHVybnMgYSBJbmdlc3RSZWNlaXB0CisJICogQHBhcmFtIHRlcm1CdWNrZXRzIFRoZSBMaXN0IG9mIFRlcm1CdWNrZXQgdG8gYmUgaW5nZXN0ZWQKKwkgKiBAcmV0dXJuIEluZ2VzdFJlY2VpcHQgUmVjZWlwdCBvZiBpbmdlc3QKKwkgKiBAdGhyb3dzIEluZ2VzdFNlcnZpY2VFeGNlcHRpb24gQW55IGVycm9yIAorCSAqLworCXB1YmxpYyBJbmdlc3RSZWNlaXB0IGluZ2VzdChMaXN0PFRlcm1CdWNrZXQ+IHRlcm1CdWNrZXRzKSB0aHJvd3MgSW5nZXN0U2VydmljZUV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBUZXJtQnVja2V0IHVwZGF0ZXMgdG8gZ2l2ZW4gVHJhbnNhY3Rpb25JZC4gIEEgbmV3IFRyYW5zYWN0aW9uSWQgY2FuIGJlIHJldHVybmVkIGluIEluZ2VzdFJlY2VpcHQKKwkgKiBpZiBzbyBkZXNpcmVkIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IHJlbWFwcGVkIGJ5IENhdGFsb2dTZXJ2aWNlLiAgRXhpc3RpbmcgbWV0YWRhdGEgCisJICogZm9yIGdpdmVuIFRyYW5zYWN0aW9uSWQgc2hvdWxkIG5vdCBiZSBkZWxldGVkLCBqdXN0IHRoZSB0ZXJtcyBpbiB0aGUgZ2l2ZW4gdGVybSBidWNrZXRzIHNob3VsZAorCSAqIGJlIG1vZGlmaWVkLiAgRm9yIGEgY29tcGxldGUgcmUtaW5nZXN0LCBvbmUgc2hvdWxkIGluc3RlYWQgZGVsZXRlKCkgdGhlbiBpbmdlc3QoKS4KKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZAorCSAqIEBwYXJhbSB0ZXJtQnVja2V0cworCSAqIEB0aHJvd3MgSW5nZXN0U2VydmljZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBJbmdlc3RSZWNlaXB0IHVwZGF0ZShUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQsIExpc3Q8VGVybUJ1Y2tldD4gdGVybUJ1Y2tldHMpIHRocm93cyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uOworCQorCS8qKgorCSAqIERlbGV0ZXMgYWxsIFRlcm1CdWNrZXRzIGF0dGFjaGVkIHRvIGdpdmVuIFRyYW5zYWN0aW9uSWQgLS0gdGhlcmUgc2hvdWxkIGJlIG5vIHRyYWNlIG9mIAorCSAqIGdpdmVuIHRyYW5zYWN0aW9uIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgSUQgZm9yIGdpdmVuIHRyYW5zYWN0aW9uIHdoaWNoIHNob3VsZCBiZSBlcmFzZWQKKwkgKiBAdGhyb3dzIEluZ2VzdFNlcnZpY2VFeGNlcHRpb24gQW55IGVycm9yIAorCSAqLworCXB1YmxpYyBib29sZWFuIGRlbGV0ZShUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQpIHRocm93cyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uOworCQorCS8qKgorCSAqIERlbGV0ZXMgb25seSB0aGUgVGVybXMgaW4gdGhlIGdpdmVuIFRlcm1CdWNrZXRzIGZyb20gdGhlIGdpdmVuIFRyYW5zYWN0aW9uSWQKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgVHJhbnNhY3Rpb25JZCBmb3Igd2hpY2ggVGVybXMgd2lsbCBiZSBkZWxldGVkCisJICogQHBhcmFtIHRlcm1CdWNrZXRzIFRoZSByZWR1Y3Rpb24gc2V0IG9mIFRlcm1zIGZvciBlYWNoIFRlcm1CdWNrZXQKKwkgKiBAdGhyb3dzIEluZ2VzdFNlcnZpY2VFeGNlcHRpb24gQW55IGVycm9yCisJICovCisJcHVibGljIGJvb2xlYW4gcmVkdWNlKFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25JZCwgTGlzdDxUZXJtQnVja2V0PiB0ZXJtQnVja2V0cykgdGhyb3dzIEluZ2VzdFNlcnZpY2VFeGNlcHRpb247CisJCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9RdWVyeVNlcnZpY2UuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvUXVlcnlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiNzI5YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvUXVlcnlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uUXVlcnlTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkluZ2VzdFJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuVHJhbnNhY3Rpb25SZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybUJ1Y2tldDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgSW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIHF1ZXJpZXMgdG8gYSBDYXRhbG9nCisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBRdWVyeVNlcnZpY2UgeworCisJLyoqCisJICogUmV0dXJucyBhbGwgdGhlIFRyYW5zYWN0aW9uSWRzIHRoYXQgZmFsbCB1bmRlciB0aGUgZ2l2ZW4gcXVlcnkKKwkgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IGZvciBUcmFuc2FjdGlvbklkcworCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3Qgb2YgVHJhbnNhY3Rpb25JZHMgdGhhdCBtZWV0IHRoZSBxdWVyeSwgb3RoZXJ3aXNlCisJICogYW4gZW1wdHkgTGlzdCBpcyBubyBUcmFuc2FjdGlvbklkcyBhcmUgZm91bmQgZm9yIHRoZSBnaXZlbiBxdWVyeQorCSAqLworCXB1YmxpYyBMaXN0PEluZ2VzdFJlY2VpcHQ+IHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBRdWVyeVNlcnZpY2VFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0cyBvZiB0aGUgZ2l2ZW4gcXVlcnkgc3VjaCB0aGF0OiBbc3RhcnRJbmRleCwgZW5kSW5kZXgpCisJICogQHBhcmFtIHF1ZXJ5RXhwcmVzc2lvbiBUaGUgcXVlcnkgZm9yIHdoaWNoIHJlc3VsdHMgd2lsbCBiZSByZXR1cm5lZAorCSAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydCBpbmRleCBvZiBzdWJzZXQgb2YgcmVzdWx0cyB0byBiZSByZXR1cm5lZAorCSAqIEBwYXJhbSBlbmRJbmRleCBUaGUgZW5kIGluZGV4IG9mIHRoZSBzdWJzZXQgb2YgcmVzdWx0cyB0byBiZSByZXR1cm5lZAorCSAqIEByZXR1cm4gVGhlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHF1ZXJ5IHN1Y2ggdGhhdDogW3N0YXJ0SW5kZXgsIGVuZEluZGV4KQorCSAqIEB0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uIG9uIGFuIGVycm9yCisJICovCisJcHVibGljIExpc3Q8SW5nZXN0UmVjZWlwdD4gcXVlcnkoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgdGhyb3dzIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZXN1bHRzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcXVlcnkKKwkgKiBAcGFyYW0gcXVlcnlFeHByZXNzaW9uIFRoZSBxdWVyeSB3aG9zZSBzaXplIGluIHF1ZXN0aW9uCisJICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJlc3VsdHMgZm91bmQgZm9yIHRoZSBnaXZlbiBxdWVyeQorCSAqIEB0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uIG9uIGFuIGVycm9yCisJICovCisJcHVibGljIGludCBzaXplT2YoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgTGlzdCBvZiBUZXJtQnVja2V0cyBpbmdlc3RlZCBmb3IgYSBnaXZlbiBUcmFuc2FjdGlvbklkCisJICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIFRyYW5zYWN0aW9uSWQgaW4gcXVlc3Rpb24KKwkgKiBAcmV0dXJuIEEgTGlzdCBvZiBUZXJtQnVja2V0cyBmb3IgdGhlIGdpdmVuIFRyYW5zYWN0aW9uSWQgb3IgZW1wdHkgbGlzdAorCSAqIGlmIG5vIHJlY29yZCBvZiB0aGUgZ2l2ZSBUcmFuYWN0aW9uSWQgZXhpc3RzCisJICovCisJcHVibGljIExpc3Q8VGVybUJ1Y2tldD4gZ2V0QnVja2V0cyhUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQpIHRocm93cyBRdWVyeVNlcnZpY2VFeGNlcHRpb247CisJCisJLyoqCisJICogRG9lcyB0aGUgc2FtZSBhcyBnZXRCdWNrZXRzKFRyYW5zYWN0aW9uSWQpLCBleGNlcHQgaXMgcGVyZm9ybWVkIG92ZXIgYSBsaXN0CisJICogb2YgVHJhbnNhY3Rpb25JZHMKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZHMgQSBMaXN0IG9mIFRyYW5zYWN0aW9uSWRzIGZvciB3aGljaCBUZXJtQnVja2V0cyBhcmUgd2FudGVkCisJICogQHJldHVybiBBIE1hcCBvZiBUcmFuc2FjdGlvbklkcyB0byBUZXJtQnVja2V0cworCSAqLworCXB1YmxpYyBNYXA8VHJhbnNhY3Rpb25JZDw/PiwgTGlzdDxUZXJtQnVja2V0Pj4gZ2V0QnVja2V0cyhMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IHRyYW5zYWN0aW9uSWRzKSB0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L1RyYW5zYWN0aW9uSWQuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvVHJhbnNhY3Rpb25JZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjE4MzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L1RyYW5zYWN0aW9uSWQuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgSW50ZXJmYWNlIGZvciBzdG9yaW5nIFRyYW5zYWN0aW9uSWRzCisgKiA8cD4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uSWQ8TmF0aXZlVHlwZT4geworCisJcHJvdGVjdGVkIE5hdGl2ZVR5cGUgbmF0aXZlSWQ7CisJCisJcHVibGljIFRyYW5zYWN0aW9uSWQoKSB7fQorCisJcHVibGljIFRyYW5zYWN0aW9uSWQoTmF0aXZlVHlwZSBuYXRpdmVJZCkgeworCQl0aGlzLm5hdGl2ZUlkID0gbmF0aXZlSWQ7CisJfQorCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkKFN0cmluZyBzdHJpbmdJZCkgeworCQl0aGlzLm5hdGl2ZUlkID0gdGhpcy5mcm9tU3RyaW5nKHN0cmluZ0lkKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRoaXMudG9TdHJpbmcoKS5oYXNoQ29kZSgpOworCX0KKwkKKwlwdWJsaWMgTmF0aXZlVHlwZSBnZXROYXRpdmVJZCgpIHsKKwkJcmV0dXJuIHRoaXMubmF0aXZlSWQ7CisJfQorCQkKKwkvKioKKwkgKiBTaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgTmF0aXZlVHlwZS50b1N0cmluZygpCisJICogZG9lcyBub3QgcHJvcGVybHkgcmVwcmVzZW50IHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlCisJICogbmF0aXZlIHR5cGUuICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBOYXRpdmVUeXBlIHNob3VsZAorCSAqIGJlIGFzIHVuaXF1ZSBhcyBpbiBpdHMgbmF0aXZlIGZvcm0uCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRoaXMubmF0aXZlSWQudG9TdHJpbmcoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uSWQ8Pz4pCisJCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLmVxdWFscyhvYmoudG9TdHJpbmcoKSk7CisJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykKKwkJCXJldHVybiB0aGlzLnRvU3RyaW5nKCkuZXF1YWxzKChTdHJpbmcpIG9iaik7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IE5hdGl2ZVR5cGUgZnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nSWQpOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9UcmFuc2FjdGlvbklkRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9UcmFuc2FjdGlvbklkRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzM4M2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L1RyYW5zYWN0aW9uSWRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JZEZhY3RvcnkgeworCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gY3JlYXRlTmV3VHJhbnNhY3Rpb25JZCgpOworCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGNyZWF0ZVRyYW5zYWN0aW9uSWQoU3RyaW5nIHRyYW5zYWN0aW9uSWRTdHJpbmcpOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2RpY3Rpb25hcnkvV29ya2Zsb3dNYW5hZ2VyRGljdGlvbmFyeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2RpY3Rpb25hcnkvV29ya2Zsb3dNYW5hZ2VyRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvZGljdGlvbmFyeS9Xb3JrZmxvd01hbmFnZXJEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC5kaWN0aW9uYXJ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLkNhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5Db21wYXJpc29uUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5Ob3RRdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlMb2dpY2FsR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlN0ZFF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuVGVybVF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybS5UZXJtQnVja2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd01hbmFnZXJEaWN0aW9uYXJ5IGltcGxlbWVudHMgRGljdGlvbmFyeSB7CisKKwlwdWJsaWMgVGVybUJ1Y2tldCBsb29rdXAoTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb24geworCQlpZiAobWV0YWRhdGEuZ2V0TWV0YWRhdGEoIlByb2R1Y3RUeXBlIikgIT0gbnVsbCAmJiBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgiUHJvZHVjdFR5cGUiKS5jb250YWlucygiV29ya2Zsb3dzIikpIHsKKwkJCVRlcm1CdWNrZXQgd29ya2Zsb3dCdWNrZXQgPSBuZXcgVGVybUJ1Y2tldCgiV29ya2Zsb3dzIik7CisJCQlmb3IgKE9iamVjdCBrZXkgOiBtZXRhZGF0YS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKSkgCisJCQkJd29ya2Zsb3dCdWNrZXQuYWRkVGVybShuZXcgVGVybSgoU3RyaW5nKSBrZXksIG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKChTdHJpbmcpIGtleSkpKTsKKwkJCXJldHVybiB3b3JrZmxvd0J1Y2tldDsKKwkJfWVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgTWV0YWRhdGEgcmV2ZXJzZUxvb2t1cChUZXJtQnVja2V0IHRlcm1CdWNrZXQpCisJCQl0aHJvd3MgQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb24geworCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCQlpZiAodGVybUJ1Y2tldC5nZXROYW1lKCkuZXF1YWxzKCJXb3JrZmxvd3MiKSkgeworCQkJZm9yIChUZXJtIHRlcm0gOiB0ZXJtQnVja2V0LmdldFRlcm1zKCkpCisJCQkJbWV0YWRhdGEuYWRkTWV0YWRhdGEodGVybS5nZXROYW1lKCksIHRlcm0uZ2V0VmFsdWVzKCkpOworCQl9CisJCXJldHVybiBtZXRhZGF0YTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kcyhRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKQorCQkJdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uIHsKKwkJU2V0PFN0cmluZz4gYnVja2V0TmFtZXMgPSBxdWVyeUV4cHJlc3Npb24uZ2V0QnVja2V0TmFtZXMoKTsKKwkJaWYgKGJ1Y2tldE5hbWVzID09IG51bGwgfHwgYnVja2V0TmFtZXMuY29udGFpbnMoIldvcmtmbG93cyIpKSB7CisJCQlpZiAocXVlcnlFeHByZXNzaW9uIGluc3RhbmNlb2YgTm90UXVlcnlFeHByZXNzaW9uIAorCQkJCQl8fCBxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uIAorCQkJCQl8fCBxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdGRRdWVyeUV4cHJlc3Npb24gCisJCQkJCXx8IHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1ZXJ5TG9naWNhbEdyb3VwKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gZmFsc2U7CQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC9kaWN0aW9uYXJ5L1dvcmtmbG93TWFuYWdlckRpY3Rpb25hcnlGYWN0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvZGljdGlvbmFyeS9Xb3JrZmxvd01hbmFnZXJEaWN0aW9uYXJ5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Mjk2NjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvZGljdGlvbmFyeS9Xb3JrZmxvd01hbmFnZXJEaWN0aW9uYXJ5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwuZGljdGlvbmFyeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnlGYWN0b3J5OworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93TWFuYWdlckRpY3Rpb25hcnlGYWN0b3J5IGltcGxlbWVudHMgRGljdGlvbmFyeUZhY3RvcnkgeworCisJcHVibGljIFdvcmtmbG93TWFuYWdlckRpY3Rpb25hcnkgY3JlYXRlRGljdGlvbmFyeSgpIHsKKwkJcmV0dXJuIG5ldyBXb3JrZmxvd01hbmFnZXJEaWN0aW9uYXJ5KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvRGF0YVNvdXJjZUluZGV4LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvRGF0YVNvdXJjZUluZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NjI2MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC9pbmRleC9EYXRhU291cmNlSW5kZXguamF2YQpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC5pbmRleDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9TUUwgaW1wb3J0cworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ0luZGV4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uSW5nZXN0U2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuZXhjZXB0aW9uLlF1ZXJ5U2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5JbmRleFBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkluZ2VzdFJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUHJvY2Vzc2VkUGFnZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LkNvbXBhcmlzb25RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5Lk5vdFF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUxvZ2ljYWxHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuU3RkUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5Jbmdlc3RTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC50cmFuc2FjdGlvbi5VdWlkVHJhbnNhY3Rpb25JZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybS5UZXJtQnVja2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLkRhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CisKKy8qKgorICogCisgKiBEYXRhU291cmNlIEluZGV4ZXIgd2hpY2ggc3VwcG9ydHMgYm90aCBpbmdlc3QgYW5kIHF1ZXJ5CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VJbmRleCBpbXBsZW1lbnRzIEluZGV4LCBJbmdlc3RTZXJ2aWNlLCBRdWVyeVNlcnZpY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRGF0YVNvdXJjZUluZGV4LmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHJvdGVjdGVkIERhdGFTb3VyY2UgZGF0YVNvdXJjZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VVVEY4OworCQorCXB1YmxpYyBEYXRhU291cmNlSW5kZXgoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzLCBTdHJpbmcgZHJpdmVyLCBTdHJpbmcgamRiY1VybCwgYm9vbGVhbiB1c2VVVEY4KSB7CisJCXRoaXMuZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsIGRyaXZlciwgamRiY1VybCk7CisJCXRoaXMudXNlVVRGOCA9IHVzZVVURjg7CisJfQorCQorCXB1YmxpYyBJbmRleFBhZ2VyIGdldFBhZ2VyKFBhZ2VJbmZvIHBhZ2VJbmZvKSB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBJbmRleFBhZ2VyKG5ldyBQcm9jZXNzZWRQYWdlSW5mbyhwYWdlSW5mby5nZXRQYWdlU2l6ZSgpLCBwYWdlSW5mby5nZXRQYWdlTnVtKCksIHRoaXMuZ2V0TnVtT2ZUcmFuc2FjdGlvbnMoKSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGdldE51bU9mVHJhbnNhY3Rpb25zKCkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgQ09VTlQodHJhbnNhY3Rpb25faWQpIEFTIG51bVRyYW5zSWRzIEZST00gdHJhbnNhY3Rpb25zIik7CisJCQlpZiAocnMubmV4dCgpKQorCQkJCXJldHVybiBycy5nZXRJbnQoIm51bVRyYW5zSWRzIik7CisJCQllbHNlCisJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIHF1ZXJ5IGZvciBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIik7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nSW5kZXhFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXJzLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0UGFnZShJbmRleFBhZ2VyIGluZGV4UGFnZSkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisvLwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKy8vCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisvLwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKy8vCQl0cnkgeworLy8JCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKy8vCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisvLwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCB0cmFuc2FjdGlvbl9pZCx0cmFuc2FjdGlvbl9jbGFzcyx0cmFuc2FjdGlvbl9kYXRlIEZST00gdHJhbnNhY3Rpb25zIik7CisvLwkJCWludCBzdGFydExvYyA9IHBhZ2VyLmdldFBhZ2VOdW0oKSAqIHBhZ2VyLmdldFBhZ2VTaXplKCk7CisvLwkJCWludCBlbmRMb2MgPSBzdGFydExvYyArIHBhZ2VyLmdldFBhZ2VTaXplKCk7CisvLwkJCUxpc3Q8SW5nZXN0UmVjZWlwdD4gcmVjZWlwdHMgPSBuZXcgVmVjdG9yPEluZ2VzdFJlY2VpcHQ+KCk7CisvLwkJCWZvciAoaW50IGkgPSBzdGFydExvYzsgaSA8IGVuZExvYyAmJiBycy5uZXh0KCk7IGkrKykgeworLy8JCQkJcmVjZWlwdHMuYWRkKG5ldyBJbmdlc3RSZWNlaXB0KCgoVHJhbnNhY3Rpb25JZDw/PikgQ2xhc3MuZm9yTmFtZShycy5nZXRTdHJpbmcoInRyYW5zYWN0aW9uX2NsYXNzIikpLmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcykubmV3SW5zdGFuY2UocnMuZ2V0U3RyaW5nKCJ0cmFuc2FjdGlvbl9pZCIpKSksIERhdGVVdGlscy50b0NhbGVuZGFyKHJzLmdldFN0cmluZygidHJhbnNhY3Rpb25fZGF0ZSIpLCBEYXRlVXRpbHMuRm9ybWF0VHlwZS5MT0NBTF9GT1JNQVQpLmdldFRpbWUoKSkpOworLy8JCQl9CisvLwkJCXJldHVybiBycy5uZXh0KCk7CisvLwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworLy8JCQl0aHJvdyBuZXcgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uKCJGYWlsZWQgdG8gY2hlY2sgZm9yIHRyYW5zYWN0aW9uIGlkICciICsgdHJhbnNhY3Rpb25JZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKy8vCQl9ZmluYWxseSB7CisvLwkJCXRyeSB7CisvLwkJCQljb25uLmNsb3NlKCk7CisvLwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKy8vCQkJdHJ5IHsKKy8vCQkJCXN0bXQuY2xvc2UoKTsKKy8vCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorLy8JCQl0cnkgeworLy8JCQkJcnMuY2xvc2UoKTsKKy8vCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorLy8JCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0aWVzKCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgVHJhbnNhY3Rpb25JZEZhY3RvcnkgZ2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoKQorCQkJdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgVXVpZFRyYW5zYWN0aW9uSWRGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1RyYW5zYWN0aW9uSWQoVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkKQorCQkJdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgRElTVElOQ1QgdHJhbnNhY3Rpb25faWQgRlJPTSB0cmFuc2FjdGlvbnMgV0hFUkUgdHJhbnNhY3Rpb25faWQgPSAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyIpOworCQkJcmV0dXJuIHJzLm5leHQoKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dJbmRleEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNoZWNrIGZvciB0cmFuc2FjdGlvbiBpZCAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXJzLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIGJvb2xlYW4gZGVsZXRlKFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25JZCkKKwkJCXRocm93cyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXN0bXQuZXhlY3V0ZSgiREVMRVRFIEZST00gdHJhbnNhY3Rpb25zIFdIRVJFIHRyYW5zYWN0aW9uX2lkID0gJyIgKyB0cmFuc2FjdGlvbklkICsgIiciKTsKKwkJCXN0bXQuZXhlY3V0ZSgiREVMRVRFIEZST00gdHJhbnNhY3Rpb25fdGVybXMgV0hFUkUgdHJhbnNhY3Rpb25faWQgPSAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyIpOworCQkJY29ubi5jb21taXQoKTsKKwkJCXJldHVybiB0cnVlOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSW5nZXN0U2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSB0cmFuc2FjdGlvbiBpZCAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIEluZ2VzdFJlY2VpcHQgaW5nZXN0KExpc3Q8VGVybUJ1Y2tldD4gdGVybUJ1Y2tldHMpIHRocm93cyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNhdGFsb2dUcmFuc2FjdGlvbklkID0gdGhpcy5nZXRUcmFuc2FjdGlvbklkRmFjdG9yeSgpLmNyZWF0ZU5ld1RyYW5zYWN0aW9uSWQoKTsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlDYWxlbmRhciBjYWxlbmRhciA9IERhdGVVdGlscy5nZXRDdXJyZW50TG9jYWxUaW1lKCk7CisJCQlzdG10LmV4ZWN1dGUoIklOU0VSVCBJTlRPIHRyYW5zYWN0aW9ucyBWQUxVRVMgKCciICsgY2F0YWxvZ1RyYW5zYWN0aW9uSWQgKyAiJywnIiArIERhdGVVdGlscy50b1N0cmluZyhjYWxlbmRhcikgKyAiJykiKTsKKwkJCWZvciAoVGVybUJ1Y2tldCB0ZXJtQnVja2V0IDogdGVybUJ1Y2tldHMpIHsKKwkJCQlmb3IgKFRlcm0gdGVybSA6IHRlcm1CdWNrZXQuZ2V0VGVybXMoKSkgeworCQkJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHRlcm0uZ2V0VmFsdWVzKCkpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJc3RtdC5leGVjdXRlKCJJTlNFUlQgSU5UTyB0cmFuc2FjdGlvbl90ZXJtcyBWQUxVRVMgKCciICsgY2F0YWxvZ1RyYW5zYWN0aW9uSWQgKyAiJywnIiArIHRlcm1CdWNrZXQuZ2V0TmFtZSgpICsgIicsJyIgKyB0ZXJtLmdldE5hbWUoKSArICInLCciICsgKHRoaXMudXNlVVRGOCA/IFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCAiVVRGOCIpIDogdmFsdWUpICsgIicpIik7CisJCQkJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGluZ2VzdCB0ZXJtOiAnIiArIGNhdGFsb2dUcmFuc2FjdGlvbklkICsgIicsJyIgKyB0ZXJtQnVja2V0LmdldE5hbWUoKSArICInLCciICsgdGVybS5nZXROYW1lKCkgKyAiJywnIiArIHZhbHVlICsgIiciKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvbm4uY29tbWl0KCk7CisJCQlyZXR1cm4gbmV3IEluZ2VzdFJlY2VpcHQoY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIGNhbGVuZGFyLmdldFRpbWUoKSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5nZXN0IG1ldGFkYXRhIGZvciB0cmFuc2FjdGlvbiBpZCAnIiArIGNhdGFsb2dUcmFuc2FjdGlvbklkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCWNvbm4uY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJc3RtdC5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBib29sZWFuIHJlZHVjZShUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQsCisJCQlMaXN0PFRlcm1CdWNrZXQ+IHRlcm1CdWNrZXRzKSB0aHJvd3MgSW5nZXN0U2VydmljZUV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlmb3IgKFRlcm1CdWNrZXQgdGVybUJ1Y2tldCA6IHRlcm1CdWNrZXRzKSAKKwkJCQlmb3IgKFRlcm0gdGVybSA6IHRlcm1CdWNrZXQuZ2V0VGVybXMoKSkgCisJCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogdGVybS5nZXRWYWx1ZXMoKSkgCisJCQkJCQl0cnkgeworCQkJCQkJCXN0bXQuZXhlY3V0ZSgiREVMRVRFIEZST00gdHJhbnNhY3Rpb25fdGVybXMgV0hFUkUgdHJhbnNhY3Rpb25faWQgPSAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyBBTkQgYnVja2V0X25hbWUgPSAnIiArIHRlcm1CdWNrZXQuZ2V0TmFtZSgpICsgIicgQU5EIHRlcm1fbmFtZSA9ICciICsgdGVybS5nZXROYW1lKCkgKyAiJyBBTkQgdGVybV92YWx1ZSA9ICciICsgKHRoaXMudXNlVVRGOCA/IFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCAiVVRGOCIpIDogdmFsdWUpICsgIiciKTsKKwkJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gZGVsZXRlIHRlcm06ICciICsgdHJhbnNhY3Rpb25JZCArICInLCciICsgdGVybUJ1Y2tldC5nZXROYW1lKCkgKyAiJywnIiArIHRlcm0uZ2V0TmFtZSgpICsgIicsJyIgKyB2YWx1ZSArICInIik7CisJCQkJCQl9CisJCQljb25uLmNvbW1pdCgpOworCQkJcmV0dXJuIHRydWU7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlIHRyYW5zYWN0aW9uIGlkICciICsgdHJhbnNhY3Rpb25JZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgSW5nZXN0UmVjZWlwdCB1cGRhdGUoVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkLAorCQkJTGlzdDxUZXJtQnVja2V0PiB0ZXJtQnVja2V0cykgdGhyb3dzIEluZ2VzdFNlcnZpY2VFeGNlcHRpb24geworCQlDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisJCXRyeSB7CisJCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKwkJCXN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCQkJZm9yIChUZXJtQnVja2V0IHRlcm1CdWNrZXQgOiB0ZXJtQnVja2V0cykgCisJCQkJZm9yIChUZXJtIHRlcm0gOiB0ZXJtQnVja2V0LmdldFRlcm1zKCkpIAorCQkJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHRlcm0uZ2V0VmFsdWVzKCkpCisJCQkJCQl0cnkgeworCQkJCQkJCXN0bXQuZXhlY3V0ZSgiREVMRVRFIEZST00gdHJhbnNhY3Rpb25fdGVybXMgV0hFUkUgdHJhbnNhY3Rpb25faWQgPSAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyBBTkQgYnVja2V0X25hbWUgPSAnIiArIHRlcm1CdWNrZXQuZ2V0TmFtZSgpICsgIicgQU5EIHRlcm1fbmFtZSA9ICciICsgdGVybS5nZXROYW1lKCkgKyAiJyIpOworCQkJCQkJCXN0bXQuZXhlY3V0ZSgiSU5TRVJUIElOVE8gdHJhbnNhY3Rpb25fdGVybXMgVkFMVUVTICgnIiArIHRyYW5zYWN0aW9uSWQgKyAiJywnIiArIHRlcm1CdWNrZXQuZ2V0TmFtZSgpICsgIicsJyIgKyB0ZXJtLmdldE5hbWUoKSArICInLCciICsgKHRoaXMudXNlVVRGOCA/IFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCAiVVRGOCIpIDogdmFsdWUpICsgIicpIik7CisJCQkJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGluZ2VzdCB0ZXJtOiAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJywnIiArIHRlcm1CdWNrZXQuZ2V0TmFtZSgpICsgIicsJyIgKyB0ZXJtLmdldE5hbWUoKSArICInLCciICsgdmFsdWUgKyAiJyIpOworCQkJCQkJfQorCQkJQ2FsZW5kYXIgY2FsZW5kYXIgPSBEYXRlVXRpbHMuZ2V0Q3VycmVudExvY2FsVGltZSgpOworCQkJc3RtdC5leGVjdXRlKCJVUERBVEUgdHJhbnNhY3Rpb25zIFNFVCB0cmFuc2FjdGlvbl9kYXRlID0gJyIgKyBEYXRlVXRpbHMudG9TdHJpbmcoY2FsZW5kYXIpICsgIicgV0hFUkUgdHJhbnNhY3Rpb25faWQgPSAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyIpOworCQkJcmV0dXJuIG5ldyBJbmdlc3RSZWNlaXB0KHRyYW5zYWN0aW9uSWQsIGNhbGVuZGFyLmdldFRpbWUoKSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbmdlc3RTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5nZXN0IG1ldGFkYXRhIGZvciB0cmFuc2FjdGlvbiBpZCAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIExpc3Q8VGVybUJ1Y2tldD4gZ2V0QnVja2V0cyhUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJSGFzaE1hcDxTdHJpbmcsIFRlcm1CdWNrZXQ+IHRlcm1CdWNrZXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUZXJtQnVja2V0PigpOworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCBidWNrZXRfbmFtZSx0ZXJtX25hbWUsdGVybV92YWx1ZSBGUk9NIHRyYW5zYWN0aW9uX3Rlcm1zIFdIRVJFIHRyYW5zYWN0aW9uX2lkID0gJyIgKyB0cmFuc2FjdGlvbklkICsgIiciKTsKKwkJCXdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnVja2V0TmFtZSA9IHJzLmdldFN0cmluZygiYnVja2V0X25hbWUiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGVybU5hbWUgPSBycy5nZXRTdHJpbmcoInRlcm1fbmFtZSIpOworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXJtVmFsdWUgPSBycy5nZXRTdHJpbmcoInRlcm1fdmFsdWUiKTsKKyAgICAgICAgICAgICAgICBUZXJtQnVja2V0IGJ1Y2tldCA9IHRlcm1CdWNrZXRzLmdldChidWNrZXROYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVja2V0ID09IG51bGwpCisgICAgICAgICAgICAgICAgCWJ1Y2tldCA9IG5ldyBUZXJtQnVja2V0KGJ1Y2tldE5hbWUpOworICAgICAgICAgICAgICAgIFRlcm0gdGVybSA9IG5ldyBUZXJtKHRlcm1OYW1lLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCh0aGlzLnVzZVVURjggPyBVUkxEZWNvZGVyLmRlY29kZSh0ZXJtVmFsdWUsICJVVEY4IikgOiB0ZXJtVmFsdWUpKSk7CisgICAgICAgICAgICAgICAgYnVja2V0LmFkZFRlcm0odGVybSk7CisgICAgICAgICAgICAgICAgdGVybUJ1Y2tldHMucHV0KGJ1Y2tldE5hbWUsIGJ1Y2tldCk7CisJCQl9CisJCQlyZXR1cm4gbmV3IFZlY3RvcjxUZXJtQnVja2V0Pih0ZXJtQnVja2V0cy52YWx1ZXMoKSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBRdWVyeVNlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgdGVybSBidWNrZXRzIGZvciB0cmFuc2FjdGlvbiBpZCAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXJzLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIE1hcDxUcmFuc2FjdGlvbklkPD8+LCBMaXN0PFRlcm1CdWNrZXQ+PiBnZXRCdWNrZXRzKAorCQkJTGlzdDxUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkcykgdGhyb3dzIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbiB7CisJCUhhc2hNYXA8VHJhbnNhY3Rpb25JZDw/PiwgTGlzdDxUZXJtQnVja2V0Pj4gbWFwID0gbmV3IEhhc2hNYXA8VHJhbnNhY3Rpb25JZDw/PiwgTGlzdDxUZXJtQnVja2V0Pj4oKTsKKwkJZm9yIChUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQgOiB0cmFuc2FjdGlvbklkcykgCisJCQltYXAucHV0KHRyYW5zYWN0aW9uSWQsIHRoaXMuZ2V0QnVja2V0cyh0cmFuc2FjdGlvbklkKSk7CisJCXJldHVybiBtYXA7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBMaXN0PEluZ2VzdFJlY2VpcHQ+IHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pCisJCQl0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCVN0cmluZyBzcWxRdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1QgdHJhbnNhY3Rpb25faWQsdHJhbnNhY3Rpb25fZGF0ZSBGUk9NIHRyYW5zYWN0aW9ucyBXSEVSRSB0cmFuc2FjdGlvbl9pZCBJTiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkocXVlcnlFeHByZXNzaW9uKSArICIpIjsKKwkgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlBlcmZvcm1pbmcgUXVlcnk6ICIgKyBzcWxRdWVyeSk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KHNxbFF1ZXJ5KTsJCisKKwkJCUxpc3Q8SW5nZXN0UmVjZWlwdD4gcmVjZWlwdHMgPSBuZXcgVmVjdG9yPEluZ2VzdFJlY2VpcHQ+KCk7CisJCQl3aGlsZSAocnMubmV4dCgpKSAKKwkJCQlyZWNlaXB0cy5hZGQobmV3IEluZ2VzdFJlY2VpcHQodGhpcy5nZXRUcmFuc2FjdGlvbklkRmFjdG9yeSgpLmNyZWF0ZVRyYW5zYWN0aW9uSWQocnMuZ2V0U3RyaW5nKCJ0cmFuc2FjdGlvbl9pZCIpKSwgRGF0ZVV0aWxzLnRvQ2FsZW5kYXIocnMuZ2V0U3RyaW5nKCJ0cmFuc2FjdGlvbl9kYXRlIiksIERhdGVVdGlscy5Gb3JtYXRUeXBlLkxPQ0FMX0ZPUk1BVCkuZ2V0VGltZSgpKSk7CisJCQlyZXR1cm4gcmVjZWlwdHM7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBRdWVyeVNlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBxdWVyeSBXb3JrZmxvdyBJbnN0YW5jZXMgRGF0YWJhc2UgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCWNvbm4uY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJc3RtdC5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlycy5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCQorCXB1YmxpYyBMaXN0PEluZ2VzdFJlY2VpcHQ+IHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHRocm93cyBRdWVyeVNlcnZpY2VFeGNlcHRpb24geworCQlDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisJCVJlc3VsdFNldCBycyA9IG51bGw7CisJCXRyeSB7CisJCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKwkJCXN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCQkJU3RyaW5nIHNxbFF1ZXJ5ID0gIlNFTEVDVCBESVNUSU5DVCB0cmFuc2FjdGlvbl9pZCx0cmFuc2FjdGlvbl9kYXRlIEZST00gdHJhbnNhY3Rpb25zIFdIRVJFIHRyYW5zYWN0aW9uX2lkIElOICgiICsgdGhpcy5nZXRTcWxRdWVyeShxdWVyeUV4cHJlc3Npb24pICsgIikiOworCSAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUGVyZm9ybWluZyBRdWVyeTogIiArIHNxbFF1ZXJ5KTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoc3FsUXVlcnkpOwkKKworCQkJTGlzdDxJbmdlc3RSZWNlaXB0PiByZWNlaXB0cyA9IG5ldyBWZWN0b3I8SW5nZXN0UmVjZWlwdD4oKTsKKwkJCWludCBpbmRleCA9IDA7CisJCQl3aGlsZSAoc3RhcnRJbmRleCA+IGluZGV4ICYmIHJzLm5leHQoKSkgaW5kZXgrKzsKKwkJCXdoaWxlIChycy5uZXh0KCkgJiYgaW5kZXgrKyA8PSBlbmRJbmRleCkgCisJCQkJcmVjZWlwdHMuYWRkKG5ldyBJbmdlc3RSZWNlaXB0KHRoaXMuZ2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoKS5jcmVhdGVUcmFuc2FjdGlvbklkKHJzLmdldFN0cmluZygidHJhbnNhY3Rpb25faWQiKSksIERhdGVVdGlscy50b0NhbGVuZGFyKHJzLmdldFN0cmluZygidHJhbnNhY3Rpb25fZGF0ZSIpLCBEYXRlVXRpbHMuRm9ybWF0VHlwZS5MT0NBTF9GT1JNQVQpLmdldFRpbWUoKSkpOworCQkJcmV0dXJuIHJlY2VpcHRzOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcXVlcnkgV29ya2Zsb3cgSW5zdGFuY2VzIERhdGFiYXNlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBpbnQgc2l6ZU9mKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pCisJCQl0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCVN0cmluZyBzcWxRdWVyeSA9ICJTRUxFQ1QgQ09VTlQodHJhbnNhY3Rpb25faWQpIEFTIG51bVRyYW5zYWN0aW9ucyBGUk9NIHRyYW5zYWN0aW9ucyBXSEVSRSB0cmFuc2FjdGlvbl9pZCBJTiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkocXVlcnlFeHByZXNzaW9uKSArICIpIjsKKwkgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlBlcmZvcm1pbmcgUXVlcnk6ICIgKyBzcWxRdWVyeSk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KHNxbFF1ZXJ5KTsJCisKKwkJCWludCBudW1UcmFuc2FjdGlvbnMgPSAwOworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkKKyAgICAgICAgICAgIAludW1UcmFuc2FjdGlvbnMgPSBycy5nZXRJbnQoIm51bVRyYW5zYWN0aW9ucyIpOworICAgICAgICAgICAgCisJCQlyZXR1cm4gbnVtVHJhbnNhY3Rpb25zOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHNpemUgb2YgcXVlcnkgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCWNvbm4uY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJc3RtdC5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlycy5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCQorCQorICAgIHByaXZhdGUgU3RyaW5nIGdldFNxbFF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBRdWVyeVNlcnZpY2VFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc3FsUXVlcnkgPSBudWxsOworCQlTdHJpbmcgYnVja2V0TmFtZUZpbHRlciA9ICIiOworCQlpZiAocXVlcnlFeHByZXNzaW9uLmdldEJ1Y2tldE5hbWVzKCkgIT0gbnVsbCkgeworCQkJaWYgKHF1ZXJ5RXhwcmVzc2lvbi5nZXRCdWNrZXROYW1lcygpLnNpemUoKSA9PSAxKQorCQkJCWJ1Y2tldE5hbWVGaWx0ZXIgKz0gImJ1Y2tldF9uYW1lID0gJyIgKyBxdWVyeUV4cHJlc3Npb24uZ2V0QnVja2V0TmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSArICInIEFORCAiOworCQkJZWxzZSBpZiAocXVlcnlFeHByZXNzaW9uLmdldEJ1Y2tldE5hbWVzKCkuc2l6ZSgpID4gMSkKKwkJCQlidWNrZXROYW1lRmlsdGVyICs9ICIoYnVja2V0X25hbWUgPSAnIiArIFN0cmluZ1V0aWxzLmpvaW4ocXVlcnlFeHByZXNzaW9uLmdldEJ1Y2tldE5hbWVzKCkuaXRlcmF0b3IoKSwgIicgT1IgYnVja2V0X25hbWUgPSAnIikgKyAiJykgQU5EICI7CisJCX0KKyAgICAgICAgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1ZXJ5TG9naWNhbEdyb3VwKSB7CisgICAgICAgIAlRdWVyeUxvZ2ljYWxHcm91cCBxbGcgPSAoUXVlcnlMb2dpY2FsR3JvdXApIHF1ZXJ5RXhwcmVzc2lvbjsKKyAgICAgICAgICAgIHNxbFF1ZXJ5ID0gIigiICsgdGhpcy5nZXRTcWxRdWVyeShxbGcuZ2V0RXhwcmVzc2lvbnMoKS5nZXQoMCkpOworICAgICAgICAgICAgU3RyaW5nIG9wID0gcWxnLmdldE9wZXJhdG9yKCkgPT0gUXVlcnlMb2dpY2FsR3JvdXAuT3BlcmF0b3IuQU5EID8gIklOVEVSU0VDVCIgOiAiVU5JT04iOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBxbGcuZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCk7IGkrKykgCisgICAgICAgICAgICAgICAgc3FsUXVlcnkgKz0gIikgIiArIG9wICsgIiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkocWxnLmdldEV4cHJlc3Npb25zKCkuZ2V0KGkpKTsKKyAgICAgICAgICAgIHNxbFF1ZXJ5ICs9ICIpIjsKKyAgICAgICAgfWVsc2UgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24peworICAgICAgICAJQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbiBjcWUgPSAoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbikgcXVlcnlFeHByZXNzaW9uOworICAgICAgICAJU3RyaW5nIG9wZXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjcWUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5FUVVBTF9UTykpIHsKKyAgICAgICAgICAgIAlvcGVyYXRvciA9ICI9IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3FlLmdldE9wZXJhdG9yKCkuZXF1YWxzKENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUl9USEFOKSkgeworICAgICAgICAgICAgCW9wZXJhdG9yID0gIj4iOworICAgICAgICAgICAgfSBlbHNlIGlmIChjcWUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSX1RIQU5fRVFVQUxfVE8pKSB7CisgICAgICAgICAgICAJb3BlcmF0b3IgPSAiPj0iOworICAgICAgICAgICAgfSBlbHNlIGlmIChjcWUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTX1RIQU4pKSB7CisgICAgICAgICAgICAJb3BlcmF0b3IgPSAiPCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNxZS5nZXRPcGVyYXRvcigpLmVxdWFscyhDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1NfVEhBTl9FUVVBTF9UTykpIHsKKyAgICAgICAgICAgIAlvcGVyYXRvciA9ICI8PSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVNlcnZpY2VFeGNlcHRpb24oIkludmFsaWQgQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbiBPcGVyYXRvciAnIiArIGNxZS5nZXRPcGVyYXRvcigpICsgIiciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3FsUXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHRyYW5zYWN0aW9uX2lkIEZST00gdHJhbnNhY3Rpb25fdGVybXMgV0hFUkUgIiArIGJ1Y2tldE5hbWVGaWx0ZXIgKyAiIHRlcm1fbmFtZSA9ICciICsgY3FlLmdldFRlcm0oKS5nZXROYW1lKCkgKyAiJyBBTkQgKCI7CisgICAgICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGNxZS5nZXRUZXJtKCkuZ2V0VmFsdWVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgCQlTdHJpbmcgdmFsdWUgPSBjcWUuZ2V0VGVybSgpLmdldFZhbHVlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBzcWxRdWVyeSArPSAidGVybV92YWx1ZSAiICsgb3BlcmF0b3IgKyAiICciICsgKHRoaXMudXNlVVRGOCA/IFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCAiVVRGLTgiKSA6IHZhbHVlKSArICInIjsKKwkgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IGNxZS5nZXRUZXJtKCkuZ2V0VmFsdWVzKCkuc2l6ZSgpKQorCSAgICAgICAgICAgIAlzcWxRdWVyeSArPSAiIE9SICI7CisgICAgICAgIAl9CisgICAgICAgIAlzcWxRdWVyeSArPSAiKSI7CisgICAgICAgIH1lbHNlIGlmIChxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBOb3RRdWVyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgCU5vdFF1ZXJ5RXhwcmVzc2lvbiBucWUgPSAoTm90UXVlcnlFeHByZXNzaW9uKSBxdWVyeUV4cHJlc3Npb247CisgICAgICAgICAgICBzcWxRdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1QgdHJhbnNhY3Rpb25faWQgRlJPTSB0cmFuc2FjdGlvbl90ZXJtcyBXSEVSRSAiICsgYnVja2V0TmFtZUZpbHRlciArICIgTk9UICgiICsgdGhpcy5nZXRTcWxRdWVyeShucWUuZ2V0UXVlcnlFeHByZXNzaW9uKCkpICsgIikiOworICAgICAgICB9ZWxzZSBpZiAocXVlcnlFeHByZXNzaW9uIGluc3RhbmNlb2YgU3RkUXVlcnlFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBzcWxRdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1QgdHJhbnNhY3Rpb25faWQgRlJPTSB0cmFuc2FjdGlvbl90ZXJtcyAiICsgYnVja2V0TmFtZUZpbHRlcjsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5U2VydmljZUV4Y2VwdGlvbigiSW52YWxpZCBRdWVyeUV4cHJlc3Npb24gJyIgKyBxdWVyeUV4cHJlc3Npb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcWxRdWVyeTsKKyAgICB9CisKK30KKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvRGF0YVNvdXJjZUluZGV4RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2luZGV4L0RhdGFTb3VyY2VJbmRleEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZkMWJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2luZGV4L0RhdGFTb3VyY2VJbmRleEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5pbXBsLmluZGV4OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleEZhY3Rvcnk7CisKKy8qKgorICogCisgKiBGYWN0b3J5IGZvciBjcmVhdGluZyBEYXRhU291cmNlSW5kZXgocykuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VJbmRleEZhY3RvcnkgaW1wbGVtZW50cyBJbmRleEZhY3RvcnkgeworCisgICAgcHJvdGVjdGVkIFN0cmluZyBqZGJjVXJsOworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXI7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVRGODsKKwkKKyAgICBwdWJsaWMgRGF0YVNvdXJjZUluZGV4RmFjdG9yeSgpIHsKKyAgICAJdGhpcy51c2VVVEY4ID0gZmFsc2U7CisgICAgfQorICAgIAorCXB1YmxpYyBJbmRleCBjcmVhdGVJbmRleCgpIHsKKwkJcmV0dXJuIG5ldyBEYXRhU291cmNlSW5kZXgodGhpcy51c2VyLCB0aGlzLnBhc3MsIHRoaXMuZHJpdmVyLCB0aGlzLmpkYmNVcmwsIHRoaXMudXNlVVRGOCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEpkYmNVcmwoU3RyaW5nIGpkYmNVcmwpIHsKKwkJdGhpcy5qZGJjVXJsID0gamRiY1VybDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisJCXRoaXMudXNlciA9IHVzZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGFzcyhTdHJpbmcgcGFzcykgeworCQl0aGlzLnBhc3MgPSBwYXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgZHJpdmVyKSB7CisJCXRoaXMuZHJpdmVyID0gZHJpdmVyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRVc2VVVEY4KGJvb2xlYW4gdXNlVVRGOCkgeworCQl0aGlzLnVzZVVURjggPSB1c2VVVEY4OworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2luZGV4L0luTWVtb3J5SW5kZXguamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC9pbmRleC9Jbk1lbW9yeUluZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3YjFiMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC9pbmRleC9Jbk1lbW9yeUluZGV4LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC5pbmRleDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5TcWxTY3JpcHQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIGluIG1lbW9yeSBJbmRleCB3aGljaCBpcyBpbmdlc3RhYmxlCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5SW5kZXggZXh0ZW5kcyBEYXRhU291cmNlSW5kZXggeworCisJcHVibGljIEluTWVtb3J5SW5kZXgoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzLCBTdHJpbmcgZHJpdmVyLAorCQkJU3RyaW5nIGpkYmNVcmwsIGJvb2xlYW4gdXNlVVRGOCwgU3RyaW5nIHRhYmxlc0ZpbGUpIHRocm93cyBTUUxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJc3VwZXIodXNlciwgcGFzcywgZHJpdmVyLCBqZGJjVXJsLCB1c2VVVEY4KTsKKyAgICAgICAgU3FsU2NyaXB0IGNvcmVTY2hlbWFTY3JpcHQgPSBuZXcgU3FsU2NyaXB0KG5ldyBGaWxlKHRhYmxlc0ZpbGUpLmdldEFic29sdXRlUGF0aCgpLCB0aGlzLmRhdGFTb3VyY2UpOworICAgICAgICBjb3JlU2NoZW1hU2NyaXB0LmxvYWRTY3JpcHQoKTsKKyAgICAgICAgY29yZVNjaGVtYVNjcmlwdC5leGVjdXRlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvSW5NZW1vcnlJbmRleEZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC9pbmRleC9Jbk1lbW9yeUluZGV4RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmNhZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvSW5NZW1vcnlJbmRleEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5pbXBsLmluZGV4OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5SW5kZXhGYWN0b3J5IGV4dGVuZHMgRGF0YVNvdXJjZUluZGV4RmFjdG9yeSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihJbk1lbW9yeUluZGV4RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCQorCXByb3RlY3RlZCBTdHJpbmcgdGFibGVzRmlsZTsKKwkKKwlwdWJsaWMgSW5NZW1vcnlJbmRleCBjcmVhdGVJbmRleCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgSW5NZW1vcnlJbmRleCh0aGlzLnVzZXIsIHRoaXMucGFzcywgdGhpcy5kcml2ZXIsIHRoaXMuamRiY1VybCwgdGhpcy51c2VVVEY4LCB0aGlzLnRhYmxlc0ZpbGUpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBjcmVhdGUgSW5NZW1vcnlJbmRleCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRUYWJsZXNGaWxlKFN0cmluZyB0YWJsZXNGaWxlKSB7CisJCXRoaXMudGFibGVzRmlsZSA9IHRhYmxlc0ZpbGU7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2luZGV4L1dvcmtmbG93TWFuYWdlckRhdGFTb3VyY2VJbmRleC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL2luZGV4L1dvcmtmbG93TWFuYWdlckRhdGFTb3VyY2VJbmRleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjE5YmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4LmphdmEKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwuaW5kZXg7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9TUUwgaW1wb3J0cworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ0luZGV4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uUXVlcnlTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkluZGV4UGFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuSW5nZXN0UmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuTm90UXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5TG9naWNhbEdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5TdGRRdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwudHJhbnNhY3Rpb24uTG9uZ1RyYW5zYWN0aW9uSWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy50ZXJtLlRlcm07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybUJ1Y2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyOworCisvL0VEQSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgcXVlcmlhYmxlIGluZGV4IGZvciBxdWVyeWluZyBmb3Igb3JpZ2luYWwgY2FzLXdvcmtmbG93IGluc3RhbmNlIG1ldGFkYXRhIChub3QgZm9yIGNhcy13b3JrZmxvdzIpCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93TWFuYWdlckRhdGFTb3VyY2VJbmRleCBpbXBsZW1lbnRzIEluZGV4LCBRdWVyeVNlcnZpY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4LmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHJvdGVjdGVkIERhdGFTb3VyY2UgZGF0YVNvdXJjZTsKKwkKKwlwdWJsaWMgV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4KFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcywgU3RyaW5nIGRyaXZlciwgU3RyaW5nIGpkYmNVcmwpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKwkJdGhpcy5kYXRhU291cmNlID0gRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5idWlsZERhdGFTb3VyY2UodXNlciwgcGFzcywgZHJpdmVyLCBqZGJjVXJsKTsKKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0UGFnZShJbmRleFBhZ2VyIGluZGV4UGFnZSkKKwkJCXRocm93cyBDYXRhbG9nSW5kZXhFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0aWVzKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uSWRGYWN0b3J5IGdldFRyYW5zYWN0aW9uSWRGYWN0b3J5KCkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgTG9uZ1RyYW5zYWN0aW9uSWRGYWN0b3J5KCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzVHJhbnNhY3Rpb25JZChUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQpCisJCQl0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCBESVNUSU5DVCB3b3JrZmxvd19pbnN0YW5jZV9pZCBGUk9NIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhIFdIRVJFIHdvcmtmbG93X2luc3RhbmNlX2lkID0gJyIgKyB0cmFuc2FjdGlvbklkICsgIiciKTsJCisJCQlyZXR1cm4gcnMubmV4dCgpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uKCJGYWlsZWQgdG8gY2hlY2sgZm9yIHdvcmtmbG93IGlkICciICsgdHJhbnNhY3Rpb25JZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBMaXN0PFRlcm1CdWNrZXQ+IGdldEJ1Y2tldHMoVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkKQorCQkJdGhyb3dzIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhIFdIRVJFIHdvcmtmbG93X2luc3RhbmNlX2lkID0gJyIgKyB0cmFuc2FjdGlvbklkICsgIiciKTsJCisJCQkKKwkJCVRlcm1CdWNrZXQgdGIgPSBuZXcgVGVybUJ1Y2tldCgiV29ya2Zsb3dzIik7CisJCQl3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHJzLmdldFN0cmluZygid29ya2Zsb3dfbWV0X2tleSIpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKHJzLmdldFN0cmluZygid29ya2Zsb3dfbWV0X3ZhbCIpLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICB0Yi5hZGRUZXJtKG5ldyBUZXJtKGtleSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2YWx1ZSkpKTsKKyAgICAgICAgICAgIH0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRiKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFF1ZXJ5U2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBXb3JrZmxvdyBJbnN0YW5jZSBNZXRhZGF0YSBmb3Igd29ya2Zsb3cgaWQgJyIgKyB0cmFuc2FjdGlvbklkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCWNvbm4uY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJc3RtdC5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlycy5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCisJcHVibGljIE1hcDxUcmFuc2FjdGlvbklkPD8+LCBMaXN0PFRlcm1CdWNrZXQ+PiBnZXRCdWNrZXRzKAorCQkJTGlzdDxUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkcykgdGhyb3dzIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbiB7CisJCU1hcDxUcmFuc2FjdGlvbklkPD8+LCBMaXN0PFRlcm1CdWNrZXQ+PiByZXR1cm5NYXAgPSBuZXcgSGFzaE1hcDxUcmFuc2FjdGlvbklkPD8+LCBMaXN0PFRlcm1CdWNrZXQ+PigpOworCQlmb3IgKFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25JZCA6IHRyYW5zYWN0aW9uSWRzKSAKKwkJCXJldHVybk1hcC5wdXQodHJhbnNhY3Rpb25JZCwgdGhpcy5nZXRCdWNrZXRzKHRyYW5zYWN0aW9uSWQpKTsKKwkJcmV0dXJuIHJldHVybk1hcDsKKwl9CisKKwlwdWJsaWMgTGlzdDxJbmdlc3RSZWNlaXB0PiBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKQorCQkJdGhyb3dzIFF1ZXJ5U2VydmljZUV4Y2VwdGlvbiB7CisJCUNvbm5lY3Rpb24gY29ubiA9IG51bGw7CisJCVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKwkJUmVzdWx0U2V0IHJzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworCQkJc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisJCQlTdHJpbmcgc3FsUXVlcnkgPSAiU0VMRUNUIHdvcmtmbG93X2luc3RhbmNlX2lkLHN0YXJ0X2RhdGVfdGltZSBGUk9NIHdvcmtmbG93X2luc3RhbmNlcyBXSEVSRSB3b3JrZmxvd19pbnN0YW5jZV9pZCBJTiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkocXVlcnlFeHByZXNzaW9uKSArICIpIjsKKwkgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlBlcmZvcm1pbmcgUXVlcnk6ICIgKyBzcWxRdWVyeSk7CisJCQlycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KHNxbFF1ZXJ5KTsKKwkJCQorCQkJTGlzdDxJbmdlc3RSZWNlaXB0PiByZWNlaXB0cyA9IG5ldyBWZWN0b3I8SW5nZXN0UmVjZWlwdD4oKTsKKwkJCXdoaWxlIChycy5uZXh0KCkpIAorICAgICAgICAgICAgICAgIHJlY2VpcHRzLmFkZChuZXcgSW5nZXN0UmVjZWlwdChuZXcgTG9uZ1RyYW5zYWN0aW9uSWRGYWN0b3J5KCkuY3JlYXRlVHJhbnNhY3Rpb25JZChycy5nZXRTdHJpbmcoIndvcmtmbG93X2luc3RhbmNlX2lkIikpLCBEYXRlQ29udmVydC5pc29QYXJzZShycy5nZXRTdHJpbmcoInN0YXJ0X2RhdGVfdGltZSIpKSkpOworCQkJcmV0dXJuIHJlY2VpcHRzOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcXVlcnkgV29ya2Zsb3cgSW5zdGFuY2VzIERhdGFiYXNlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJCXRyeSB7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX1jYXRjaChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKwkKKwlwdWJsaWMgTGlzdDxJbmdlc3RSZWNlaXB0PiBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKwkJU3RhdGVtZW50IHN0bXQgPSBudWxsOworCQlSZXN1bHRTZXQgcnMgPSBudWxsOworCQl0cnkgeworCQkJY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisJCQlzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJCVN0cmluZyBzcWxRdWVyeSA9ICJTRUxFQ1Qgd29ya2Zsb3dfaW5zdGFuY2VfaWQsc3RhcnRfZGF0ZV90aW1lIEZST00gd29ya2Zsb3dfaW5zdGFuY2VzIFdIRVJFIHdvcmtmbG93X2luc3RhbmNlX2lkIElOICgiICsgdGhpcy5nZXRTcWxRdWVyeShxdWVyeUV4cHJlc3Npb24pICsgIikiOworCSAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUGVyZm9ybWluZyBRdWVyeTogIiArIHNxbFF1ZXJ5KTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoc3FsUXVlcnkpOworCQkJCisJCQlMaXN0PEluZ2VzdFJlY2VpcHQ+IHJlY2VpcHRzID0gbmV3IFZlY3RvcjxJbmdlc3RSZWNlaXB0PigpOworCQkJaW50IGluZGV4ID0gMDsKKwkJCXdoaWxlIChzdGFydEluZGV4ID4gaW5kZXggJiYgcnMubmV4dCgpKSBpbmRleCsrOworCQkJd2hpbGUgKHJzLm5leHQoKSAmJiBpbmRleCsrIDw9IGVuZEluZGV4KSAKKwkJCQlyZWNlaXB0cy5hZGQobmV3IEluZ2VzdFJlY2VpcHQobmV3IExvbmdUcmFuc2FjdGlvbklkRmFjdG9yeSgpLmNyZWF0ZVRyYW5zYWN0aW9uSWQocnMuZ2V0U3RyaW5nKCJ3b3JrZmxvd19pbnN0YW5jZV9pZCIpKSwgRGF0ZUNvbnZlcnQuaXNvUGFyc2UocnMuZ2V0U3RyaW5nKCJzdGFydF9kYXRlX3RpbWUiKSkpKTsKKwkJCXJldHVybiByZWNlaXB0czsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFF1ZXJ5U2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHF1ZXJ5IFdvcmtmbG93IEluc3RhbmNlcyBEYXRhYmFzZSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJY29ubi5jbG9zZSgpOworCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCQl0cnkgeworCQkJCXJzLmNsb3NlKCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisJCisJcHVibGljIGludCBzaXplT2YoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikKKwkJCXRocm93cyBRdWVyeVNlcnZpY2VFeGNlcHRpb24geworCQlDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCQlTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisJCVJlc3VsdFNldCBycyA9IG51bGw7CisJCXRyeSB7CisJCQljb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKwkJCXN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCQkJU3RyaW5nIHNxbFF1ZXJ5ID0gIlNFTEVDVCBDT1VOVCh3b3JrZmxvd19pbnN0YW5jZV9pZCkgQVMgbnVtSW5zdGFuY2VzIEZST00gd29ya2Zsb3dfaW5zdGFuY2VzIFdIRVJFIHdvcmtmbG93X2luc3RhbmNlX2lkIElOICgiICsgdGhpcy5nZXRTcWxRdWVyeShxdWVyeUV4cHJlc3Npb24pICsgIikiOworCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiUGVyZm9ybWluZyBRdWVyeTogIiArIHNxbFF1ZXJ5KTsKKwkJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoc3FsUXVlcnkpOworCisJCQlpbnQgbnVtSW5zdGFuY2VzID0gMDsKKwkJCXdoaWxlIChycy5uZXh0KCkpCisJCQkJbnVtSW5zdGFuY2VzID0gcnMuZ2V0SW50KCJudW1JbnN0YW5jZXMiKTsKKworCQkJcmV0dXJuIG51bUluc3RhbmNlczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBRdWVyeVNlcnZpY2VFeGNlcHRpb24oCisJCQkJCSJGYWlsZWQgdG8gZ2V0IHNpemUgb2YgcXVlcnkgaW4gV29ya2Zsb3cgSW5zdGFuY2VzIERhdGFiYXNlIDogIgorCQkJCQkJCSsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQljb25uLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJfQorCQkJdHJ5IHsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJfQorCQkJdHJ5IHsKKwkJCQlycy5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCX0KKwkKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTcWxRdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgUXVlcnlTZXJ2aWNlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNxbFF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1ZXJ5TG9naWNhbEdyb3VwKSB7CisgICAgICAgIAlRdWVyeUxvZ2ljYWxHcm91cCBxbGcgPSAoUXVlcnlMb2dpY2FsR3JvdXApIHF1ZXJ5RXhwcmVzc2lvbjsKKyAgICAgICAgICAgIHNxbFF1ZXJ5ID0gIigiICsgdGhpcy5nZXRTcWxRdWVyeShxbGcuZ2V0RXhwcmVzc2lvbnMoKS5nZXQoMCkpOworICAgICAgICAgICAgU3RyaW5nIG9wID0gcWxnLmdldE9wZXJhdG9yKCkgPT0gUXVlcnlMb2dpY2FsR3JvdXAuT3BlcmF0b3IuQU5EID8gIklOVEVSU0VDVCIgOiAiVU5JT04iOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBxbGcuZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCk7IGkrKykgCisgICAgICAgICAgICAgICAgc3FsUXVlcnkgKz0gIikgIiArIG9wICsgIiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkocWxnLmdldEV4cHJlc3Npb25zKCkuZ2V0KGkpKTsKKyAgICAgICAgICAgIHNxbFF1ZXJ5ICs9ICIpIjsKKyAgICAgICAgfWVsc2UgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24peworICAgICAgICAJQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbiBjcWUgPSAoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbikgcXVlcnlFeHByZXNzaW9uOworICAgICAgICAJU3RyaW5nIG9wZXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjcWUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5FUVVBTF9UTykpIHsKKyAgICAgICAgICAgIAlvcGVyYXRvciA9ICI9IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3FlLmdldE9wZXJhdG9yKCkuZXF1YWxzKENvbXBhcmlzb25RdWVyeUV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUl9USEFOKSkgeworICAgICAgICAgICAgCW9wZXJhdG9yID0gIj4iOworICAgICAgICAgICAgfSBlbHNlIGlmIChjcWUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSX1RIQU5fRVFVQUxfVE8pKSB7CisgICAgICAgICAgICAJb3BlcmF0b3IgPSAiPj0iOworICAgICAgICAgICAgfSBlbHNlIGlmIChjcWUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTX1RIQU4pKSB7CisgICAgICAgICAgICAJb3BlcmF0b3IgPSAiPCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNxZS5nZXRPcGVyYXRvcigpLmVxdWFscyhDb21wYXJpc29uUXVlcnlFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1NfVEhBTl9FUVVBTF9UTykpIHsKKyAgICAgICAgICAgIAlvcGVyYXRvciA9ICI8PSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVNlcnZpY2VFeGNlcHRpb24oIkludmFsaWQgQ29tcGFyaXNvblF1ZXJ5RXhwcmVzc2lvbiBPcGVyYXRvciAnIiArIGNxZS5nZXRPcGVyYXRvcigpICsgIiciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3FsUXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHdvcmtmbG93X2luc3RhbmNlX2lkIEZST00gd29ya2Zsb3dfaW5zdGFuY2VfbWV0YWRhdGEgV0hFUkUgd29ya2Zsb3dfbWV0X2tleSA9ICciICsgY3FlLmdldFRlcm0oKS5nZXROYW1lKCkgKyAiJyBBTkQgKCI7CisgICAgICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGNxZS5nZXRUZXJtKCkuZ2V0VmFsdWVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgCQlTdHJpbmcgdmFsdWUgPSBjcWUuZ2V0VGVybSgpLmdldFZhbHVlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBzcWxRdWVyeSArPSAid29ya2Zsb3dfbWV0X3ZhbCAiICsgb3BlcmF0b3IgKyAiICciICsgVVJMRW5jb2Rlci5lbmNvZGUodmFsdWUsICJVVEYtOCIpICsgIiciOworCSAgICAgICAgICAgIGlmICgoaSArIDEpIDwgY3FlLmdldFRlcm0oKS5nZXRWYWx1ZXMoKS5zaXplKCkpCisJICAgICAgICAgICAgCXNxbFF1ZXJ5ICs9ICJPUiI7CisgICAgICAgIAl9CisgICAgICAgIAlzcWxRdWVyeSArPSAiKSI7CisgICAgICAgIH1lbHNlIGlmIChxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBOb3RRdWVyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgCU5vdFF1ZXJ5RXhwcmVzc2lvbiBucWUgPSAoTm90UXVlcnlFeHByZXNzaW9uKSBxdWVyeUV4cHJlc3Npb247CisgICAgICAgICAgICBzcWxRdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1Qgd29ya2Zsb3dfaW5zdGFuY2VfaWQgRlJPTSB3b3JrZmxvd19pbnN0YW5jZV9tZXRhZGF0YSBXSEVSRSBOT1QgKCIgKyB0aGlzLmdldFNxbFF1ZXJ5KG5xZS5nZXRRdWVyeUV4cHJlc3Npb24oKSkgKyAiKSI7CisgICAgICAgIH1lbHNlIGlmIChxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdGRRdWVyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHNxbFF1ZXJ5ID0gIlNFTEVDVCBESVNUSU5DVCB3b3JrZmxvd19pbnN0YW5jZV9pZCBGUk9NIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhIjsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5U2VydmljZUV4Y2VwdGlvbigiSW52YWxpZCBRdWVyeUV4cHJlc3Npb24gJyIgKyBxdWVyeUV4cHJlc3Npb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcWxRdWVyeTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC9pbmRleC9Xb3JrZmxvd01hbmFnZXJEYXRhU291cmNlSW5kZXhGYWN0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWJlM2MKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvaW5kZXgvV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwuaW5kZXg7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4RmFjdG9yeSBpbXBsZW1lbnRzIEluZGV4RmFjdG9yeSB7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGpkYmNVcmw7CisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyOworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlcjsKKwkKKwlwdWJsaWMgV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4IGNyZWF0ZUluZGV4KCkgeworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBXb3JrZmxvd01hbmFnZXJEYXRhU291cmNlSW5kZXgodGhpcy51c2VyLCB0aGlzLnBhc3MsIHRoaXMuZHJpdmVyLCB0aGlzLmpkYmNVcmwpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvL2xvZworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRKZGJjVXJsKFN0cmluZyBqZGJjVXJsKSB7CisJCXRoaXMuamRiY1VybCA9IGpkYmNVcmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgdXNlcikgeworCQl0aGlzLnVzZXIgPSB1c2VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3MoU3RyaW5nIHBhc3MpIHsKKwkJdGhpcy5wYXNzID0gcGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlcikgeworCQl0aGlzLmRyaXZlciA9IGRyaXZlcjsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvdHJhbnNhY3Rpb24vTG9uZ1RyYW5zYWN0aW9uSWRGYWN0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvdHJhbnNhY3Rpb24vTG9uZ1RyYW5zYWN0aW9uSWRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YTU3MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC90cmFuc2FjdGlvbi9Mb25nVHJhbnNhY3Rpb25JZEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5pbXBsLnRyYW5zYWN0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWRGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIExvbmdUcmFuc2FjdGlvbklkRmFjdG9yeSBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uSWRGYWN0b3J5IHsKKworCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGNyZWF0ZU5ld1RyYW5zYWN0aW9uSWQoKSB7CisJCXJldHVybiBuZXcgVHJhbnNhY3Rpb25JZDxMb25nPihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMb25nIGZyb21TdHJpbmcoU3RyaW5nIHN0cmluZ0lkKSB7CisJCQkJcmV0dXJuIExvbmcucGFyc2VMb25nKHN0cmluZ0lkKTsKKwkJCX0KKwkJCQorCQl9OworCX0KKworCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGNyZWF0ZVRyYW5zYWN0aW9uSWQoU3RyaW5nIHRyYW5zYWN0aW9uSWRTdHJpbmcpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2FjdGlvbklkPExvbmc+KHRyYW5zYWN0aW9uSWRTdHJpbmcpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTG9uZyBmcm9tU3RyaW5nKFN0cmluZyBzdHJpbmdJZCkgeworCQkJCXJldHVybiBMb25nLnBhcnNlTG9uZyhzdHJpbmdJZCk7CisJCQl9CisJCQkKKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC90cmFuc2FjdGlvbi9TdHJpbmdUcmFuc2FjdGlvbklkRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N0cnVjdC9pbXBsL3RyYW5zYWN0aW9uL1N0cmluZ1RyYW5zYWN0aW9uSWRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxYmMxOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC90cmFuc2FjdGlvbi9TdHJpbmdUcmFuc2FjdGlvbklkRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwudHJhbnNhY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nVHJhbnNhY3Rpb25JZEZhY3RvcnkgaW1wbGVtZW50cyBUcmFuc2FjdGlvbklkRmFjdG9yeSB7CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDxTdHJpbmc+IGNyZWF0ZU5ld1RyYW5zYWN0aW9uSWQoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nVHJhbnNhY3Rpb25JZChMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisJfQorCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gY3JlYXRlVHJhbnNhY3Rpb25JZChTdHJpbmcgdHJhbnNhY3Rpb25JZFN0cmluZykgeworCQlyZXR1cm4gbmV3IFN0cmluZ1RyYW5zYWN0aW9uSWQodHJhbnNhY3Rpb25JZFN0cmluZyk7CisJfQorCQorCXByaXZhdGUgY2xhc3MgU3RyaW5nVHJhbnNhY3Rpb25JZCBleHRlbmRzIFRyYW5zYWN0aW9uSWQ8U3RyaW5nPiB7CisKKwkJcHVibGljIFN0cmluZ1RyYW5zYWN0aW9uSWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCQl0aGlzLm5hdGl2ZUlkID0gc3RyaW5nVmFsdWU7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGZyb21TdHJpbmcoU3RyaW5nIHN0cmluZ0lkKSB7CisJCQlyZXR1cm4gc3RyaW5nSWQ7CisJCX0KKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvdHJhbnNhY3Rpb24vVXVpZFRyYW5zYWN0aW9uSWRGYWN0b3J5LmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3RydWN0L2ltcGwvdHJhbnNhY3Rpb24vVXVpZFRyYW5zYWN0aW9uSWRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhZWRhOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zdHJ1Y3QvaW1wbC90cmFuc2FjdGlvbi9VdWlkVHJhbnNhY3Rpb25JZEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5pbXBsLnRyYW5zYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgVXVpZFRyYW5zYWN0aW9uSWRGYWN0b3J5IGltcGxlbWVudHMgVHJhbnNhY3Rpb25JZEZhY3RvcnkgeworCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gY3JlYXRlTmV3VHJhbnNhY3Rpb25JZCgpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2FjdGlvbklkPFVVSUQ+KFVVSUQucmFuZG9tVVVJRCgpKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFVVSUQgZnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nSWQpIHsKKwkJCQlyZXR1cm4gVVVJRC5mcm9tU3RyaW5nKHN0cmluZ0lkKTsKKwkJCX0KKwkJCQorCQl9OworCX0KKworCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGNyZWF0ZVRyYW5zYWN0aW9uSWQoU3RyaW5nIHRyYW5zYWN0aW9uSWRTdHJpbmcpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2FjdGlvbklkPFVVSUQ+KHRyYW5zYWN0aW9uSWRTdHJpbmcpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVVVJRCBmcm9tU3RyaW5nKFN0cmluZyBzdHJpbmdJZCkgeworCQkJCXJldHVybiBVVUlELmZyb21TdHJpbmcoc3RyaW5nSWQpOworCQkJfQorCQkJCisJCX07CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL0NhdGFsb2cuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNWZjOTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL0NhdGFsb2cuamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW07CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ0luZGV4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uSW5nZXN0U2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5DYXRhbG9nUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5JbmRleFBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkluZ2VzdFJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkluZ2VzdFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnRlcm0uVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybS5UZXJtQnVja2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIENhbGF0b2cgaXMgYSBjb21tdW5pY2F0aW9uIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBDYXRhbG9nU2VydmljZSBhbmQgYW4gdW5kZXJseWluZworICogZGF0YWJhc2Ugb3IgaW5kZXggc2VydmljZQorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbG9nIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKENhdGFsb2cuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCisJcHJvdGVjdGVkIFZlY3RvcjxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXM7CisJcHJvdGVjdGVkIEluZGV4IGluZGV4OworCXByb3RlY3RlZCBTdHJpbmcgaWQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zID0gdHJ1ZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zID0gdHJ1ZTsKKwkKKwlwdWJsaWMgQ2F0YWxvZyhTdHJpbmcgaWQsIEluZGV4IGluZGV4LCBMaXN0PERpY3Rpb25hcnk+IGRpY3Rpb25hcmllcywgYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMsIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucykgeworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuaW5kZXggPSBpbmRleDsKKwkJaWYgKGRpY3Rpb25hcmllcyAhPSBudWxsKQorCQkJdGhpcy5kaWN0aW9uYXJpZXMgPSBuZXcgVmVjdG9yPERpY3Rpb25hcnk+KGRpY3Rpb25hcmllcyk7CisJCXRoaXMucmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zID0gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zOworCQl0aGlzLnJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMgPSByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gdGhpcy5pZDsKKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZEZhY3RvcnkgZ2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoKSB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5kZXguZ2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0SW5kZXgoSW5kZXggaW5kZXgpIHsKKwkJdGhpcy5pbmRleCA9IGluZGV4OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXREaWN0aW9uYXJpZXMoTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHsKKwkJdGhpcy5kaWN0aW9uYXJpZXMgPSBuZXcgVmVjdG9yPERpY3Rpb25hcnk+KGRpY3Rpb25hcmllcyk7CisJfQorCQorCXB1YmxpYyBMaXN0PERpY3Rpb25hcnk+IGdldERpY3Rpb25hcmllcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5kaWN0aW9uYXJpZXMpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGREaWN0aW9uYXJ5KERpY3Rpb25hcnkgZGljdGlvbmFyeSkgeworCQlpZiAodGhpcy5kaWN0aW9uYXJpZXMgPT0gbnVsbCkKKwkJCXRoaXMuZGljdGlvbmFyaWVzID0gbmV3IFZlY3RvcjxEaWN0aW9uYXJ5PigpOworCQl0aGlzLmRpY3Rpb25hcmllcy5hZGQoZGljdGlvbmFyeSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zID0gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyA9IHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNRdWVyaWFibGUoKSB7CisJCXJldHVybiB0aGlzLmluZGV4IGluc3RhbmNlb2YgUXVlcnlTZXJ2aWNlICYmICF0aGlzLnJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uczsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNJbmdlc3RhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5pbmRleCBpbnN0YW5jZW9mIEluZ2VzdFNlcnZpY2UgJiYgIXRoaXMucmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uczsKKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0UGFnZShJbmRleFBhZ2VyIGluZGV4UGFnZSkgdGhyb3dzIENhdGFsb2dJbmRleEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmluZGV4LmdldFBhZ2UoaW5kZXhQYWdlKTsKKwl9CisJCisJcHVibGljIFRyYW5zYWN0aW9uSWQ8Pz4gZ2V0VHJhbnNhY3Rpb25JZEZyb21TdHJpbmcoU3RyaW5nIGNhdGFsb2dUcmFuc2FjdGlvbklkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBDYXRhbG9nSW5kZXhFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbklkRmFjdG9yeSgpLmNyZWF0ZVRyYW5zYWN0aW9uSWQoY2F0YWxvZ1RyYW5zYWN0aW9uSWQpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBoYXNUcmFuc2FjdGlvbklkKFRyYW5zYWN0aW9uSWQ8Pz4gY2F0YWxvZ1RyYW5zYWN0aW9uaWQpICB0aHJvd3MgQ2F0YWxvZ0luZGV4RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5kZXguaGFzVHJhbnNhY3Rpb25JZChjYXRhbG9nVHJhbnNhY3Rpb25pZCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmluZGV4LmdldFByb3BlcnR5KGtleSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHByb3BlcnR5ICciICsga2V5ICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5pbmRleC5nZXRQcm9wZXJ0aWVzKCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbklkCisJICogQHBhcmFtIG1ldGFkYXRhCisJICogQHJldHVybiBUcmFuc2FjdGlvbklkIHBhcmFtIGlmIHVzZWQgYnkgdW5kZXJseWluZyBjYXRhbG9nLCBvdGhlcndpc2UKKwkgKiB0aGUgVHJhbnNhY3Rpb25JZCBnZW5lcmF0ZWQgYW5kIHVzZWQgYnkgdW5kZXJseWluZyBjYXRhbG9nLiAgaWYgbm8KKwkgKiBUZXJtQnVja2V0cyB3aGVyZSBjcmVhdGVkIGZyb20gdGhlIE1ldGFkYXRhIHRoZW4gbnVsbCBpcyByZXR1cm5lZAorCSAqIEB0aHJvd3MgSW5nZXN0U2VydmljZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBDYXRhbG9nUmVjZWlwdCBpbmdlc3QoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWlmICh0aGlzLmlzSW5nZXN0YWJsZSgpKSB7CisJCQkJTGlzdDxUZXJtQnVja2V0PiB0ZXJtQnVja2V0cyA9IHRoaXMuZ2V0VGVybUJ1Y2tldHMobWV0YWRhdGEpOworCQkJCWlmICh0ZXJtQnVja2V0cy5zaXplKCkgPiAwKSB7CisJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgYXR0ZW1waW5nIGluZ2VzdCBtZXRhZGF0YSIpOworCQkJCQlyZXR1cm4gbmV3IENhdGFsb2dSZWNlaXB0KCgoSW5nZXN0U2VydmljZSkgdGhpcy5pbmRleCkuaW5nZXN0KHRlcm1CdWNrZXRzKSwgdGhpcy5nZXRJZCgpKTsKKwkJCQl9ZWxzZSB7CisJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgZGljdGlvbmFyaWVzIGRpZCBub3QgZ2VuZXJhdGUgYW55IFRlcm1CdWNrZXRzIGZyb20gTWV0YWRhdGEiKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfWVsc2UgeworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgaXMgbm90IGluZ2VzdGFibGUiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBDYXRhbG9nUmVjZWlwdCB1cGRhdGUoVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkLCBNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKHRoaXMuaXNJbmdlc3RhYmxlKCkpIHsKKwkJCQlMaXN0PFRlcm1CdWNrZXQ+IHRlcm1CdWNrZXRzID0gdGhpcy5nZXRUZXJtQnVja2V0cyhtZXRhZGF0YSk7CisJCQkJaWYgKHRlcm1CdWNrZXRzLnNpemUoKSA+IDApIHsKKwkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ2F0YWxvZyAnIiArIHRoaXMgKyAiJyBhdHRlbXBpbmcgdXBkYXRlIG1ldGFkYXRhIGZvciBjYXRhbG9nIFRyYW5zYWN0aW9uSWQgW2lkID0gJyIgKyB0cmFuc2FjdGlvbklkICsgIiddIik7CisJCQkJCUluZ2VzdFJlY2VpcHQgaW5nZXN0UmVjZWlwdCA9ICgoSW5nZXN0U2VydmljZSkgdGhpcy5pbmRleCkudXBkYXRlKHRyYW5zYWN0aW9uSWQsIHRlcm1CdWNrZXRzKTsKKwkJCQkJaWYgKGluZ2VzdFJlY2VpcHQgIT0gbnVsbCkKKwkJCQkJCXJldHVybiBuZXcgQ2F0YWxvZ1JlY2VpcHQoaW5nZXN0UmVjZWlwdCwgdGhpcy5nZXRJZCgpKTsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJfWVsc2UgeworCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJDYXRhbG9nICciICsgdGhpcyArICInIGRpZCBub3QgZ2VuZXJhdGUgYW55IFRlcm1CdWNrZXRzIGZyb20gTWV0YWRhdGEgZm9yIGNhdGFsb2cgVHJhbnNhY3Rpb25JZCBbaWQgPSAnIiArIHRyYW5zYWN0aW9uSWQgKyAiJ10iKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfWVsc2UgeworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgaXMgbm90IGluZ2VzdGFibGUiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGRlbGV0ZShUcmFuc2FjdGlvbklkPD8+IHRyYW5zYWN0aW9uSWQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWlmICh0aGlzLmlzSW5nZXN0YWJsZSgpKSB7CisJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ2F0YWxvZyAnIiArIHRoaXMgKyAiJyBhdHRlbXBpbmcgdG8gZGVsZXRlIGFsbCBUZXJtQnVja2V0cyBhc3NvY2lhdGVkIHdpdGggY2F0YWxvZyBUcmFuc2FjdGlvbklkIFtpZCA9ICciICsgdHJhbnNhY3Rpb25JZCArICInXSIpOworCQkJCXJldHVybiAoKEluZ2VzdFNlcnZpY2UpIHRoaXMuaW5kZXgpLmRlbGV0ZSh0cmFuc2FjdGlvbklkKTsKKwkJCX1lbHNlIHsKKwkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJDYXRhbG9nICciICsgdGhpcyArICInIGlzIG5vdCBpbmdlc3RhYmxlIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIGJvb2xlYW4gcmVkdWNlKFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25JZCwgTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWlmICh0aGlzLmlzSW5nZXN0YWJsZSgpKSB7CisJCQkJTGlzdDxUZXJtQnVja2V0PiB0ZXJtQnVja2V0cyA9IHRoaXMuZ2V0VGVybUJ1Y2tldHMobWV0YWRhdGEpOworCQkJCWlmICh0ZXJtQnVja2V0cy5zaXplKCkgPiAwKSB7CisJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgYXR0ZW1waW5nIHJlZHVjZSBtZXRhZGF0YSBmb3IgY2F0YWxvZyBUcmFuc2FjdGlvbklkIFtpZCA9ICciICsgdHJhbnNhY3Rpb25JZCArICInXSIpOworCQkJCQlyZXR1cm4gKChJbmdlc3RTZXJ2aWNlKSB0aGlzLmluZGV4KS5yZWR1Y2UodHJhbnNhY3Rpb25JZCwgdGVybUJ1Y2tldHMpOworCQkJCX1lbHNlIHsKKwkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2F0YWxvZyAnIiArIHRoaXMgKyAiJyBkaWQgbm90IGdlbmVyYXRlIGFueSBUZXJtQnVja2V0cyBmcm9tIE1ldGFkYXRhIGZvciBjYXRhbG9nIFRyYW5zYWN0aW9uSWQgW2lkID0gJyIgKyB0cmFuc2FjdGlvbklkICsgIiddIC0tIG5vIG1ldGFkYXRhIHJlZHVjdGlvbiB0b29rIHBsYWNlIik7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9ZWxzZSB7CisJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2F0YWxvZyAnIiArIHRoaXMgKyAiJyBpcyBub3QgaW5nZXN0YWJsZSIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCQorCXB1YmxpYyBMaXN0PENhdGFsb2dSZWNlaXB0PiBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpZiAodGhpcy5pc1F1ZXJpYWJsZSgpKSB7CisJCQkJUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSA9IChRdWVyeVNlcnZpY2UpIHRoaXMuaW5kZXg7CisJCQkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzID0gbmV3IFZlY3RvcjxDYXRhbG9nUmVjZWlwdD4oKTsKKwkJCQlmb3IgKEluZ2VzdFJlY2VpcHQgaW5nZXN0UmVjZWlwdCA6IHF1ZXJ5U2VydmljZS5xdWVyeShxdWVyeUV4cHJlc3Npb24pKSAKKwkJCQkJY2F0YWxvZ1JlY2VpcHRzLmFkZChuZXcgQ2F0YWxvZ1JlY2VpcHQoaW5nZXN0UmVjZWlwdCwgdGhpcy5nZXRJZCgpKSk7CisJCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoY2F0YWxvZ1JlY2VpcHRzKTsKKwkJCX1lbHNlIHsKKwkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJDYXRhbG9nICciICsgdGhpcyArICInIGlzIG5vdCBxdWVyaWFibGUiKTsKKwkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCQl9CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKworCXB1YmxpYyBMaXN0PENhdGFsb2dSZWNlaXB0PiBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpZiAodGhpcy5pc1F1ZXJpYWJsZSgpKSB7CisJCQkJUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSA9IChRdWVyeVNlcnZpY2UpIHRoaXMuaW5kZXg7CisJCQkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzID0gbmV3IFZlY3RvcjxDYXRhbG9nUmVjZWlwdD4oKTsKKwkJCQlmb3IgKEluZ2VzdFJlY2VpcHQgaW5nZXN0UmVjZWlwdCA6IHF1ZXJ5U2VydmljZS5xdWVyeShxdWVyeUV4cHJlc3Npb24sIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkgCisJCQkJCWNhdGFsb2dSZWNlaXB0cy5hZGQobmV3IENhdGFsb2dSZWNlaXB0KGluZ2VzdFJlY2VpcHQsIHRoaXMuZ2V0SWQoKSkpOworCQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNhdGFsb2dSZWNlaXB0cyk7CisJCQl9ZWxzZSB7CisJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2F0YWxvZyAnIiArIHRoaXMgKyAiJyBpcyBub3QgcXVlcmlhYmxlIik7CisJCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQkJfQorCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIGludCBzaXplT2YoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKHRoaXMuaXNRdWVyaWFibGUoKSkgeworCQkJCVF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UgPSAoUXVlcnlTZXJ2aWNlKSB0aGlzLmluZGV4OworCQkJCXJldHVybiBxdWVyeVNlcnZpY2Uuc2l6ZU9mKHF1ZXJ5RXhwcmVzc2lvbik7CisJCQl9ZWxzZSB7CisJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2F0YWxvZyAnIiArIHRoaXMgKyAiJyBpcyBub3QgcXVlcmlhYmxlIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpZiAodGhpcy5pc1F1ZXJpYWJsZSgpKSB7CisJCQkJUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSA9IChRdWVyeVNlcnZpY2UpIHRoaXMuaW5kZXg7CisJCQkJcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFGcm9tQnVja2V0cyhxdWVyeVNlcnZpY2UuZ2V0QnVja2V0cyh0cmFuc2FjdGlvbklkKSk7CisJCQl9ZWxzZSB7IAorCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgaXMgbm90IHF1ZXJpYWJsZSIpOworCQkJCXJldHVybiBuZXcgTWV0YWRhdGEoKTsKKwkJCX0KKwkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIE1hcDxUcmFuc2FjdGlvbklkPD8+LCBNZXRhZGF0YT4gZ2V0TWV0YWRhdGEoTGlzdDxUcmFuc2FjdGlvbklkPD8+PiB0cmFuc2FjdGlvbklkcykgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQl0cnkgeworCQkJTWFwPFRyYW5zYWN0aW9uSWQ8Pz4sIE1ldGFkYXRhPiBtZXRhZGF0YU1hcCA9IG5ldyBIYXNoTWFwPFRyYW5zYWN0aW9uSWQ8Pz4sIE1ldGFkYXRhPigpOworCQkJaWYgKHRoaXMuaXNRdWVyaWFibGUoKSkgeworCQkJCVF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UgPSAoUXVlcnlTZXJ2aWNlKSB0aGlzLmluZGV4OworCQkJCU1hcDxUcmFuc2FjdGlvbklkPD8+LCBMaXN0PFRlcm1CdWNrZXQ+PiB0ZXJtQnVja2V0TWFwID0gcXVlcnlTZXJ2aWNlLmdldEJ1Y2tldHModHJhbnNhY3Rpb25JZHMpOworCQkJCWZvciAoVHJhbnNhY3Rpb25JZDw/PiB0cmFuc2FjdGlvbklkIDogdGVybUJ1Y2tldE1hcC5rZXlTZXQoKSkKKwkJCQkJbWV0YWRhdGFNYXAucHV0KHRyYW5zYWN0aW9uSWQsIHRoaXMuZ2V0TWV0YWRhdGFGcm9tQnVja2V0cyh0ZXJtQnVja2V0TWFwLmdldCh0cmFuc2FjdGlvbklkKSkpOworCQkJfWVsc2UgeworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkNhdGFsb2cgJyIgKyB0aGlzICsgIicgaXMgbm90IHF1ZXJpYWJsZSIpOworCQkJfQorCQkJcmV0dXJuIG1ldGFkYXRhTWFwOworCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKHRoaXMuZGljdGlvbmFyaWVzICE9IG51bGwpIHsKKwkJCQlmb3IgKERpY3Rpb25hcnkgZGljdGlvbmFyeSA6IHRoaXMuZGljdGlvbmFyaWVzKQorCQkJCQlpZiAoZGljdGlvbmFyeS51bmRlcnN0YW5kcyhxdWVyeUV4cHJlc3Npb24pKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfWVsc2UgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgTWV0YWRhdGEgZ2V0TWV0YWRhdGFGcm9tQnVja2V0cyhMaXN0PFRlcm1CdWNrZXQ+IHRlcm1CdWNrZXRzKSB0aHJvd3MgQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb24geworCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCQlmb3IgKFRlcm1CdWNrZXQgdGVybUJ1Y2tldCA6IHRlcm1CdWNrZXRzKSB7CisJCQlpZiAodGhpcy5kaWN0aW9uYXJpZXMgIT0gbnVsbCkgeworCQkJCWZvciAoRGljdGlvbmFyeSBkaWN0aW9uYXJ5IDogdGhpcy5kaWN0aW9uYXJpZXMpIAorCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YShkaWN0aW9uYXJ5LnJldmVyc2VMb29rdXAodGVybUJ1Y2tldCkpOworCQkJfWVsc2UgeworCQkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKHRoaXMuYXNNZXRhZGF0YSh0ZXJtQnVja2V0cykpOworCQkJfQorCQl9CisJCXJldHVybiBtZXRhZGF0YTsKKwl9CisJCisJcHJvdGVjdGVkIE1ldGFkYXRhIGFzTWV0YWRhdGEoTGlzdDxUZXJtQnVja2V0PiB0ZXJtQnVja2V0cykgeworCQlNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisJCWZvciAoVGVybUJ1Y2tldCBidWNrZXQgOiB0ZXJtQnVja2V0cykKKwkJCWZvciAoVGVybSB0ZXJtIDogYnVja2V0LmdldFRlcm1zKCkpCisJCQkJbS5hZGRNZXRhZGF0YSh0ZXJtLmdldE5hbWUoKSwgdGVybS5nZXRWYWx1ZXMoKSk7CisJCXJldHVybiBtOworCX0KKyAgICAKKwlwcm90ZWN0ZWQgTGlzdDxUZXJtQnVja2V0PiBnZXRUZXJtQnVja2V0cyhNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uIHsKKwkJTGlzdDxUZXJtQnVja2V0PiB0ZXJtQnVja2V0cyA9IG5ldyBWZWN0b3I8VGVybUJ1Y2tldD4oKTsKKwkJaWYgKHRoaXMuZGljdGlvbmFyaWVzICE9IG51bGwpIHsKKwkJCWZvciAoRGljdGlvbmFyeSBkaWN0aW9uYXJ5IDogdGhpcy5kaWN0aW9uYXJpZXMpIHsKKwkJCQlUZXJtQnVja2V0IHRlcm1CdWNrZXQgPSBkaWN0aW9uYXJ5Lmxvb2t1cChtZXRhZGF0YSk7CisJCQkJaWYgKHRlcm1CdWNrZXQgIT0gbnVsbCkKKwkJCQkJdGVybUJ1Y2tldHMuYWRkKHRlcm1CdWNrZXQpOworCQkJfQorCQl9ZWxzZSB7CisJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJDYXRhbG9nICciICsgdGhpcyArICInIGhhcyBubyBkaWN0aW9uYXJpZXMgZGVmaW5lZCwgYXR0ZW1wdGluZyB0byBzZW5kIGFsbCBNZXRhZGF0YSBpbiBhIGRlZmF1bHQgVGVybUJ1Y2tldCIpOworCQkJVGVybUJ1Y2tldCBidWNrZXQgPSBuZXcgVGVybUJ1Y2tldCgpOworCQkJZm9yIChTdHJpbmcga2V5IDogbWV0YWRhdGEuZ2V0QWxsS2V5cygpKQorCQkJCWJ1Y2tldC5hZGRUZXJtKG5ldyBUZXJtKGtleSwgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSkpOworCQkJdGVybUJ1Y2tldHMuYWRkKGJ1Y2tldCk7CisJCX0KKwkJcmV0dXJuIHRlcm1CdWNrZXRzOworCX0KKwkKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLmhhc2hDb2RlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogaW5zdGFuY2VvZiBDYXRhbG9nKSAKKwkJCXJldHVybiAoKENhdGFsb2cpIG9iaikuZ2V0SWQoKS5lcXVhbHModGhpcy5nZXRJZCgpKTsKKwkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSAKKwkJCXJldHVybiB0aGlzLmdldElkKCkuZXF1YWxzKChTdHJpbmcpIG9iaik7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAJcmV0dXJuIHRoaXMuZ2V0SWQoKTsKKyAgICB9CisJCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9DYXRhbG9nRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9DYXRhbG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWI5NDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL0NhdGFsb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW07CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5EaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuRGljdGlvbmFyeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleEZhY3Rvcnk7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbG9nRmFjdG9yeSB7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2dJZDsKKwlwcm90ZWN0ZWQgSW5kZXhGYWN0b3J5IGluZGV4RmFjdG9yeTsKKwlwcm90ZWN0ZWQgTGlzdDxEaWN0aW9uYXJ5RmFjdG9yeT4gZGljdGlvbmFyeUZhY3RvcmllczsKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnM7CisJcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uczsKKwkKKwlwdWJsaWMgQ2F0YWxvZyBjcmVhdGVDYXRhbG9nKCkgeworCQlWZWN0b3I8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzID0gbnVsbDsKKwkJaWYgKHRoaXMuZGljdGlvbmFyeUZhY3RvcmllcyAhPSBudWxsKSB7CisJCQlkaWN0aW9uYXJpZXMgPSBuZXcgVmVjdG9yPERpY3Rpb25hcnk+KCk7CisJCQlmb3IgKERpY3Rpb25hcnlGYWN0b3J5IGRpY3Rpb25hcnlGYWN0b3J5IDogdGhpcy5kaWN0aW9uYXJ5RmFjdG9yaWVzKQorCQkJCWRpY3Rpb25hcmllcy5hZGQoZGljdGlvbmFyeUZhY3RvcnkuY3JlYXRlRGljdGlvbmFyeSgpKTsKKwkJfQorCQlyZXR1cm4gbmV3IENhdGFsb2codGhpcy5jYXRhbG9nSWQsIHRoaXMuaW5kZXhGYWN0b3J5LmNyZWF0ZUluZGV4KCksIGRpY3Rpb25hcmllcywgdGhpcy5yZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMsIHRoaXMucmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyk7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0lkKFN0cmluZyBjYXRhbG9nSWQpIHsKKwkJdGhpcy5jYXRhbG9nSWQgPSBjYXRhbG9nSWQ7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0SW5kZXhGYWN0b3J5KEluZGV4RmFjdG9yeSBpbmRleEZhY3RvcnkpIHsKKwkJdGhpcy5pbmRleEZhY3RvcnkgPSBpbmRleEZhY3Rvcnk7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0RGljdGlvbmFyeUZhY3RvcmllcyhMaXN0PERpY3Rpb25hcnlGYWN0b3J5PiBkaWN0aW9uYXJ5RmFjdG9yaWVzKSB7CisJCXRoaXMuZGljdGlvbmFyeUZhY3RvcmllcyA9IGRpY3Rpb25hcnlGYWN0b3JpZXM7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zID0gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zOworCX0KKworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyA9IHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnM7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9DYXRhbG9nU2VydmljZS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9DYXRhbG9nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Mzc0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL0NhdGFsb2dTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWV0YWRhdGEuVHJhbnNhY3Rpb25hbE1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLkNhdGFsb2dSZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUXVlcnlQYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5UcmFuc2FjdGlvblJlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuUGx1Z2luVVJMOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBbiBpbnRlcmZhY2UgZm9yIGEgTWV0YWRhdGEgQ2F0YWxvZyBNYW5hZ2VyIFNlcnZpY2UKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIENhdGFsb2dTZXJ2aWNlIHsKKwkJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19TRVJWSUNFX1RSQU5TQUNUSU9OX0lEX01FVF9LRVkgPSAidXJuOkNhdGFsb2dTZXJ2aWNlOlRyYW5zYWN0aW9uSWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfSURTX01FVF9LRVkgPSAidXJuOkNhdGFsb2dTZXJ2aWNlOkNhdGFsb2dJZHMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9VUERBVEVfTUVUX0tFWSA9ICJ1cm46Q2F0YWxvZ1NlcnZpY2U6RW5hYmxlVXBkYXRlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX1RSQU5TQUNUSU9OX0lEX01FVF9LRVkgPSAidXJuOkNhdGFsb2c6VHJhbnNhY3Rpb25JZCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19JRF9NRVRfS0VZID0gInVybjpDYXRhbG9nOklkIjsKKworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQorCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCisJcHVibGljIGJvb2xlYW4gaXNSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCByZXBsYWNlQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzLCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uLCBib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCisJcHVibGljIHZvaWQgYWRkRGljdGlvbmFyeShTdHJpbmcgY2F0YWxvZ0lkLCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIHJlcGxhY2VEaWN0aW9uYXJpZXMoU3RyaW5nIGNhdGFsb2dJZCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCByZXBsYWNlSW5kZXgoU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKworCXB1YmxpYyB2b2lkIG1vZGlmeUluZ2VzdFBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24pIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCBtb2RpZnlRdWVyeVBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQkKKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKworCXB1YmxpYyBVUkwgZ2V0UGx1Z2luU3RvcmFnZURpcigpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgTGlzdDxQbHVnaW5VUkw+IGdldFBsdWdpblVybHMoKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5VcmxzKExpc3Q8UGx1Z2luVVJMPiBwbHVnaW5VUkxzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q3VycmVudENhdGFsb2dJZHMoKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCQorCXB1YmxpYyBUcmFuc2FjdGlvblJlY2VpcHQgaW5nZXN0KE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCisJcHVibGljIHZvaWQgZGVsZXRlKE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcygpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQorCXB1YmxpYyBQYWdlIGdldE5leHRQYWdlKFBhZ2UgcGFnZSkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQkKKwlwdWJsaWMgUGFnZSBnZXRQYWdlKFBhZ2VJbmZvIHBhZ2VJbmZvLCBRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCisJcHVibGljIFBhZ2UgZ2V0UGFnZShQYWdlSW5mbyBwYWdlSW5mbywgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YShQYWdlIHBhZ2UpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJIAorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TmV4dFBhZ2UoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRBbGxQYWdlcyhRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRTdHJpbmdzKExpc3Q8U3RyaW5nPiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmdzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkcyhMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1RyYW5zYWN0aW9uSWRzLCBTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQorCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCwgYm9vbGVhbiBnZW5lcmF0ZU5ldykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9DYXRhbG9nU2VydmljZUZhY3RvcnkuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vQ2F0YWxvZ1NlcnZpY2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZDZjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vQ2F0YWxvZ1NlcnZpY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW07CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIENhdGFsb2dTZXJ2aWNlCisgKiA8cD4KKyAqLworcHVibGljIGludGVyZmFjZSBDYXRhbG9nU2VydmljZUZhY3RvcnkgeworCisJcHVibGljIENhdGFsb2dTZXJ2aWNlIGNyZWF0ZUNhdGFsb2dTZXJ2aWNlKCk7CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL2ltcGwvQ2F0YWxvZ1NlcnZpY2VDbGllbnQuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vaW1wbC9DYXRhbG9nU2VydmljZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2Q4YjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL2ltcGwvQ2F0YWxvZ1NlcnZpY2VDbGllbnQuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uaW1wbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1ldGFkYXRhLlRyYW5zYWN0aW9uYWxNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5DYXRhbG9nUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlBhZ2VJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlF1ZXJ5UGFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuVHJhbnNhY3Rpb25SZWNlaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5jaGFubmVsLkNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuVHJhbnNhY3Rpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgQ2xpZW50IHRoYXQgYXBwZWFycyB0byBiZSBhIENhdGFsb2dTZXJ2aWNlLCBidXQgY29tbXVuaWNhdGVzIHdpdGggYSBDYXRhbG9nU2VydmljZSBTZXJ2ZXIKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1NlcnZpY2VDbGllbnQgaW1wbGVtZW50cyBDYXRhbG9nU2VydmljZSB7CisKKwlwcm90ZWN0ZWQgQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQgY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQ7CisJcHJvdGVjdGVkIGludCBhdXRvUGFnZXJTaXplOworCQorCXB1YmxpYyBDYXRhbG9nU2VydmljZUNsaWVudChDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCBjb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCwgaW50IGF1dG9QYWdlclNpemUpIHsKKwkJdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudCA9IGNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50OworCQl0aGlzLmF1dG9QYWdlclNpemUgPSBhdXRvUGFnZXJTaXplOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiAgeworCQl0cnkgeworCQkJdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5zaHV0ZG93bigpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBMaXN0PFBsdWdpblVSTD4gdHJhbnNmZXJUb1NlcnZlclNpZGUoTGlzdDxQbHVnaW5VUkw+IGNsaWVudFNpZGVVcmxzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJVVJMIGN1c3RvbVVybFN0b3JhZ2VEaXIgPSB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldFBsdWdpblN0b3JhZ2VEaXIoKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiR290IFRtcCBkaXIgOiAiICsgY3VzdG9tVXJsU3RvcmFnZURpcik7CisJCQlWZWN0b3I8UGx1Z2luVVJMPiBzZXJ2ZXJTaWRlVXJscyA9IG5ldyBWZWN0b3I8UGx1Z2luVVJMPigpOworCQkJZm9yIChQbHVnaW5VUkwgcGx1Z2luVVJMIDogY2xpZW50U2lkZVVybHMpIHsKKwkJCQlQbHVnaW5VUkwgc2VydmVyU2lkZVVSTCA9IG5ldyBQbHVnaW5VUkwocGx1Z2luVVJMLmdldENhdGFsb2dJZCgpLCBuZXcgVVJMKGN1c3RvbVVybFN0b3JhZ2VEaXIsIG5ldyBGaWxlKHBsdWdpblVSTC5nZXRVUkwoKS5nZXRGaWxlKCkpLmdldE5hbWUoKSkpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZ2VuZXJhdGVkIHNlcnZlciBzaWRlIHVybCA6ICIgKyBjdXN0b21VcmxTdG9yYWdlRGlyKTsKKwkJCQl0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LnRyYW5zZmVyVXJsKHBsdWdpblVSTC5nZXRVUkwoKSwgc2VydmVyU2lkZVVSTC5nZXRVUkwoKSk7CisJCQkJc2VydmVyU2lkZVVybHMuYWRkKHNlcnZlclNpZGVVUkwpOworCQkJfQorCQkJcmV0dXJuIHNlcnZlclNpZGVVcmxzOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkJCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmFkZENhdGFsb2coY2F0YWxvZyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVwbGFjZUNhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKQorCQkJdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQucmVwbGFjZUNhdGFsb2coY2F0YWxvZyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgpCisJCQl0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5hZGRDYXRhbG9nKGNhdGFsb2dJZCwgaW5kZXgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5hZGRDYXRhbG9nKGNhdGFsb2dJZCwgaW5kZXgsIGRpY3Rpb25hcmllcyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb24sCisJCQlib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuYWRkQ2F0YWxvZyhjYXRhbG9nSWQsIGluZGV4LCBkaWN0aW9uYXJpZXMsIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uLCByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZERpY3Rpb25hcnkoU3RyaW5nIGNhdGFsb2dJZCwgRGljdGlvbmFyeSBkaWN0aW9uYXJ5KQorCQkJdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuYWRkRGljdGlvbmFyeShjYXRhbG9nSWQsIGRpY3Rpb25hcnkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlcGxhY2VEaWN0aW9uYXJpZXMoU3RyaW5nIGNhdGFsb2dJZCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LnJlcGxhY2VEaWN0aW9uYXJpZXMoY2F0YWxvZ0lkLCBkaWN0aW9uYXJpZXMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBtb2RpZnlJbmdlc3RQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsCisJCQlib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQubW9kaWZ5SW5nZXN0UGVybWlzc2lvbihjYXRhbG9nSWQsIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgbW9kaWZ5UXVlcnlQZXJtaXNzaW9uKFN0cmluZyBjYXRhbG9nSWQsCisJCQlib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5tb2RpZnlRdWVyeVBlcm1pc3Npb24oY2F0YWxvZ0lkLCByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVwbGFjZUluZGV4KFN0cmluZyBjYXRhbG9nSWQsIEluZGV4IGluZGV4KQorCQkJdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQucmVwbGFjZUluZGV4KGNhdGFsb2dJZCwgaW5kZXgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LnJlbW92ZUNhdGFsb2coY2F0YWxvZ0lkKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIFVSTCBnZXRQbHVnaW5TdG9yYWdlRGlyKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldFBsdWdpblN0b3JhZ2VEaXIoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIExpc3Q8UGx1Z2luVVJMPiBnZXRQbHVnaW5VcmxzKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldFBsdWdpblVybHMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5VcmxzKExpc3Q8UGx1Z2luVVJMPiB1cmxzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5hZGRQbHVnaW5VcmxzKHRoaXMudHJhbnNmZXJUb1NlcnZlclNpZGUodXJscykpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBkZWxldGUoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQl0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmRlbGV0ZShtZXRhZGF0YSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRBbGxQYWdlcyhRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpCisJCQl0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IG1ldGFkYXRhID0gbmV3IFZlY3RvcjxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+KCk7CisJCQlpZiAocXVlcnlQYWdlci5nZXRUb3RhbFBhZ2VzKCkgPiAwKSB7CisJCQkJcXVlcnlQYWdlci5zZXRQYWdlSW5mbyhuZXcgUGFnZUluZm8odGhpcy5hdXRvUGFnZXJTaXplLCBQYWdlSW5mby5GSVJTVF9QQUdFKSk7CisJCQkJd2hpbGUgKCFxdWVyeVBhZ2VyLmlzTGFzdFBhZ2UoKSkgeworCQkJCQltZXRhZGF0YS5hZGRBbGwodGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXROZXh0UGFnZShxdWVyeVBhZ2VyKSk7CisJCQkJCXF1ZXJ5UGFnZXIuaW5jcmVtZW50UGFnZU51bWJlcigpOworCQkJCX0KKwkJCQltZXRhZGF0YS5hZGRBbGwodGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXROZXh0UGFnZShxdWVyeVBhZ2VyKSk7CisJCQl9CisJCQlyZXR1cm4gbWV0YWRhdGE7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRDYWxhbG9nUHJvcGVydGllcyhTdHJpbmcgY2F0YWxvZ1VybikKKwkJCXRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXRDYWxhbG9nUHJvcGVydGllcyhjYXRhbG9nVXJuKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoCisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkLCBTdHJpbmcgY2F0YWxvZ1VybikKKwkJCXRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIGNhdGFsb2dVcm4pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCXB1YmxpYyBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCgKKwkJCUNhdGFsb2dSZWNlaXB0IGNhdGFsb2dSZWNlaXB0LCBib29sZWFuIGdlbmVyYXRlTmV3KSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKGNhdGFsb2dSZWNlaXB0LCBnZW5lcmF0ZU5ldyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcygKKwkJCUxpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1RyYW5zYWN0aW9uSWRzLCBTdHJpbmcgY2F0YWxvZ1VybikKKwkJCXRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKGNhdGFsb2dUcmFuc2FjdGlvbklkcywgY2F0YWxvZ1Vybik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIFNldDxTdHJpbmc+IGdldEN1cnJlbnRDYXRhbG9nSWRzKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldEN1cnJlbnRDYXRhbG9nSWRzKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YUZyb21UcmFuc2FjdGlvbklkU3RyaW5ncygKKwkJCUxpc3Q8U3RyaW5nPiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmdzKQorCQkJdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldE1ldGFkYXRhRnJvbVRyYW5zYWN0aW9uSWRTdHJpbmdzKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZFN0cmluZ3MpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoCisJCQlMaXN0PFRyYW5zYWN0aW9uSWQ8Pz4+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMpCisJCQl0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXROZXh0UGFnZShRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpCisJCQl0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuZ2V0TmV4dFBhZ2UocXVlcnlQYWdlcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuZ2V0UHJvcGVydHkoa2V5KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBnZXRUcmFuc2FjdGlvbklkc0ZvckFsbFBhZ2VzKAorCQkJUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnQuZ2V0VHJhbnNhY3Rpb25JZHNGb3JBbGxQYWdlcyhxdWVyeVBhZ2VyKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVHJhbnNhY3Rpb25SZWNlaXB0IGluZ2VzdChNZXRhZGF0YSBtZXRhZGF0YSkKKwkJCXRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5pbmdlc3QobWV0YWRhdGEpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucygpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5pc1Jlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5pc1Jlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUGFnZSBnZXROZXh0UGFnZShQYWdlIHBhZ2UpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXROZXh0UGFnZShwYWdlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIFBhZ2UgZ2V0UGFnZShQYWdlSW5mbyBwYWdlSW5mbywgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldFBhZ2UocGFnZUluZm8sIHF1ZXJ5RXhwcmVzc2lvbik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5nZXRQYWdlKHBhZ2VJbmZvLCBxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+IGdldE1ldGFkYXRhKFBhZ2UgcGFnZSkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LmdldE1ldGFkYXRhKHBhZ2UpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKQorCQkJdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50LnF1ZXJ5KHF1ZXJ5RXhwcmVzc2lvbik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyBRdWVyeVBhZ2VyIHF1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudC5xdWVyeShxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9pbXBsL0NhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9pbXBsL0NhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTVmZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL2ltcGwvQ2F0YWxvZ1NlcnZpY2VDbGllbnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uaW1wbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmNoYW5uZWwuQ29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZ1NlcnZpY2VGYWN0b3J5OworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8vT09EVCBpbXBvcnRzCisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIENhdGFsb2dTZXJ2aWNlQ2xpZW50CisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIENhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yeSBpbXBsZW1lbnRzIENhdGFsb2dTZXJ2aWNlRmFjdG9yeSB7CisJCisJcHJvdGVjdGVkIENvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeSBjb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEZhY3Rvcnk7CisJcHJvdGVjdGVkIGludCBhdXRvUGFnZXJTaXplOworCQorCXB1YmxpYyBDYXRhbG9nU2VydmljZUNsaWVudEZhY3RvcnkoKSB7CisJCXRoaXMuYXV0b1BhZ2VyU2l6ZSA9IDUwMDsKKwl9CisJCisJcHVibGljIENhdGFsb2dTZXJ2aWNlQ2xpZW50IGNyZWF0ZUNhdGFsb2dTZXJ2aWNlKCkgeworCQlyZXR1cm4gbmV3IENhdGFsb2dTZXJ2aWNlQ2xpZW50KHRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5LmNyZWF0ZUNvbW11bmljYXRpb25DaGFubmVsQ2xpZW50KCksIHRoaXMuYXV0b1BhZ2VyU2l6ZSk7CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldENvbW11bmljYXRpb25DaGFubmVsQ2xpZW50RmFjdG9yeShDb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEZhY3RvcnkgY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5KSB7CisJCXRoaXMuY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5ID0gY29tbXVuaWNhdGlvbkNoYW5uZWxDbGllbnRGYWN0b3J5OworCX0KKwkKKwlAUmVxdWlyZWQKKwlwdWJsaWMgdm9pZCBzZXRBdXRvUGFnZXJTaXplKGludCBhdXRvUGFnZXJTaXplKSB7CisJCWlmIChhdXRvUGFnZXJTaXplID4gMCkKKwkJCXRoaXMuYXV0b1BhZ2VyU2l6ZSA9IGF1dG9QYWdlclNpemU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyVXJsKCkgeworCQlyZXR1cm4gdGhpcy5jb21tdW5pY2F0aW9uQ2hhbm5lbENsaWVudEZhY3RvcnkuZ2V0U2VydmVyVXJsKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL2ltcGwvQ2F0YWxvZ1NlcnZpY2VMb2NhbC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9pbXBsL0NhdGFsb2dTZXJ2aWNlTG9jYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRiOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9pbXBsL0NhdGFsb2dTZXJ2aWNlTG9jYWwuamF2YQpAQCAtMCwwICsxLDEyNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLmltcGw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ0RpY3Rpb25hcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmV4Y2VwdGlvbi5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ0luZGV4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmcuSW5nZXN0TWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuQ2F0YWxvZ1JlY2VpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5Qcm9jZXNzZWRQYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlRyYW5zYWN0aW9uUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5RdWVyeUxvZ2ljYWxHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5DYXRhbG9nUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5UcmFuc2FjdGlvbklkRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3lzdGVtLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5QbHVnaW5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWwuUXVlcnlVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBDYWxhdG9nIFNlcnZpY2UgdGhhdCBtYW5hZ2VzIE1ldGFkYXRhIHZpYSBvbmUgb3IgbW9yZSB1bmRlcmx5aW5nIENhdGFsb2dzCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIENhdGFsb2dTZXJ2aWNlTG9jYWwgaW1wbGVtZW50cyBDYXRhbG9nU2VydmljZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ2F0YWxvZ1NlcnZpY2VMb2NhbC5jbGFzcy5nZXROYW1lKCkpOworCQorCXByb3RlY3RlZCBTZXQ8Q2F0YWxvZz4gY2F0YWxvZ3M7CisJcHJvdGVjdGVkIFJlYWRXcml0ZUxvY2sgY2F0YWxvZ3NMb2NrOworCXByb3RlY3RlZCBDYXRhbG9nUmVwb3NpdG9yeSBjYXRhbG9nUmVwb3NpdG9yeTsKKwlwcm90ZWN0ZWQgSW5nZXN0TWFwcGVyIGluZ2VzdE1hcHBlcjsKKwlwcm90ZWN0ZWQgUmVhZFdyaXRlTG9jayBpbmdlc3RNYXBwZXJMb2NrOworCXByb3RlY3RlZCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uczsKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zOworCXByb3RlY3RlZCBUcmFuc2FjdGlvbklkRmFjdG9yeSB0cmFuc2FjdGlvbklkRmFjdG9yeTsKKwlwcm90ZWN0ZWQgRmlsZSBwbHVnaW5TdG9yYWdlRGlyOworCXByb3RlY3RlZCBib29sZWFuIG9uZUNhdGFsb2dGYWlsc0FsbEZhaWw7CisJcHJvdGVjdGVkIGJvb2xlYW4gc2ltcGxpZnlRdWVyaWVzOworCXByb3RlY3RlZCBib29sZWFuIGRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzOworCXByb3RlY3RlZCBpbnQgY3Jvc3NDYXRhbG9nUmVzdWx0U29ydGluZ1RocmVzaG9sZDsKKwkKKwlwdWJsaWMgQ2F0YWxvZ1NlcnZpY2VMb2NhbChDYXRhbG9nUmVwb3NpdG9yeSBjYXRhbG9nUmVwb3NpdG9yeSwgSW5nZXN0TWFwcGVyIGluZ2VzdE1hcHBlciwgRmlsZSBwbHVnaW5TdG9yYWdlRGlyLCBUcmFuc2FjdGlvbklkRmFjdG9yeSB0cmFuc2FjdGlvbklkRmFjdG9yeSwgYm9vbGVhbiByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMsIGJvb2xlYW4gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucywgYm9vbGVhbiBvbmVDYXRhbG9nRmFpbHNBbGxGYWlsLCBib29sZWFuIHNpbXBsaWZ5UXVlcmllcywgYm9vbGVhbiBkaXNhYmxlSW50ZXJzZWN0aW5nQ3Jvc3NDYXRhbG9nUXVlcmllcywgaW50IGNyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY2F0YWxvZ3MgPSBuZXcgSGFzaFNldDxDYXRhbG9nPigpOworCQkJdGhpcy5jYXRhbG9nc0xvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKwkJCXRoaXMuc2V0UGx1Z2luU3RvcmFnZURpcihwbHVnaW5TdG9yYWdlRGlyKTsKKwkJCXRoaXMuc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucyk7CisJCQl0aGlzLnNldFJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMocmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyk7CisJCQl0aGlzLnNldFRyYW5zYWN0aW9uSWRGYWN0b3J5KHRyYW5zYWN0aW9uSWRGYWN0b3J5KTsKKwkJCXRoaXMuc2V0SW5nZXN0TWFwcGVyKGluZ2VzdE1hcHBlcik7CisJCQl0aGlzLnNldENhdGFsb2dSZXBvc2l0b3J5KGNhdGFsb2dSZXBvc2l0b3J5KTsJCisJCQl0aGlzLm9uZUNhdGFsb2dGYWlsc0FsbEZhaWwgPSBvbmVDYXRhbG9nRmFpbHNBbGxGYWlsOworCQkJdGhpcy5zaW1wbGlmeVF1ZXJpZXMgPSBzaW1wbGlmeVF1ZXJpZXM7CisJCQl0aGlzLmRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzID0gZGlzYWJsZUludGVyc2VjdGluZ0Nyb3NzQ2F0YWxvZ1F1ZXJpZXM7CisJCQl0aGlzLmNyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQgPSBjcm9zc0NhdGFsb2dSZXN1bHRTb3J0aW5nVGhyZXNob2xkOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCQorCS8qKgorCSAqIFNldCB0aGUgQ2F0YWxvZ1JlcG9zaXRvcnkgZm9yIHRoaXMgQ2F0YWxvZ1NlcnZpY2UsIHdpdGggcmVwbGFjZSBleGlzdGluZyBDYXRhbG9nUmVwb3NpdG9yeQorCSAqIGFuZCBpbW1lZGlhdGVseSBsb2FkIGFsbCBDYXRhbG9ncyBmcm9tIGl0LgorCSAqIEBwYXJhbSByZXBvc2l0b3J5IFRoZSBDYXRhbG9nUmVwb3NpdG9yeSB0byBiZSB1c2VkIGJ5IHRoaXMgQ2F0YWxvZ1NlcnZpY2UKKwkgKiBAdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIE9uIEVycm9yIGxvYWRpbmcgZ2l2ZW4gQ2F0YWxvZ1JlcG9zaXRvcnkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRDYXRhbG9nUmVwb3NpdG9yeShDYXRhbG9nUmVwb3NpdG9yeSBjYXRhbG9nUmVwb3NpdG9yeSkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJaWYgKGNhdGFsb2dSZXBvc2l0b3J5ICE9IG51bGwpIHsKKwkJCXRoaXMuY2F0YWxvZ3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKwkJCUNhdGFsb2dSZXBvc2l0b3J5IGJhY2t1cFJlcG9zaXRvcnkgPSBudWxsOworCQkJU2V0PENhdGFsb2c+IGJhY2t1cENhdGFsb2dzID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiVXNpbmcgQ2F0YWxvZ1JlcG9zaXRvcnkgJyIgKyBjYXRhbG9nUmVwb3NpdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICInIik7CisJCQkJYmFja3VwUmVwb3NpdG9yeSA9IHRoaXMuY2F0YWxvZ1JlcG9zaXRvcnk7CisJCQkJYmFja3VwQ2F0YWxvZ3MgPSBuZXcgSGFzaFNldDxDYXRhbG9nPih0aGlzLmNhdGFsb2dzKTsKKwkJCQlMT0cubG9nKExldmVsLklORk8sICJMb2FkaW5nIENhdGFsb2dzIGZyb20gQ2F0YWxvZ1JlcG9zaXRvcnkgLiAuIC4iKTsKKwkJCQl0aGlzLmNhdGFsb2dzID0gY2F0YWxvZ1JlcG9zaXRvcnkuZGVzZXJpYWxpemVBbGxDYXRhbG9ncygpOworCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIkxvYWRlZCBDYXRhbG9nczogJyIgKyB0aGlzLmNhdGFsb2dzICsgIiciKTsKKwkJCQl0aGlzLmNhdGFsb2dSZXBvc2l0b3J5ID0gY2F0YWxvZ1JlcG9zaXRvcnk7CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5jYXRhbG9ncyA9IGJhY2t1cENhdGFsb2dzOworCQkJCXRoaXMuY2F0YWxvZ1JlcG9zaXRvcnkgPSBiYWNrdXBSZXBvc2l0b3J5OworCQkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCBDYXRhbG9nUmVwb3NpdG9yeSAnIiArIGNhdGFsb2dSZXBvc2l0b3J5ICsgIicsIHJldmVydGluZyBiYWNrIHRvIG9yaWdpbmFsIHNldHRpbmdzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCX1maW5hbGx5IHsKKwkJCQl0aGlzLmNhdGFsb2dzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJCX0KKwkJfWVsc2UgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJDYW5ub3QgYWRkIE5VTEwgQ2F0YWxvZ1JlcG9zaXRvcnkgdG8gQ2F0YWxvZ1NlcnZpY2UsIHJldmVydGluZyBiYWNrIHRvIG9yaWdpbmFsIHNldHRpbmdzIik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbmdlc3RNYXBwZXIoSW5nZXN0TWFwcGVyIGluZ2VzdE1hcHBlcikgeworCQl0aGlzLmluZ2VzdE1hcHBlckxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQl0cnkgeworCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiVXNpbmcgSW5nZXN0TWFwcGVyICciICsgaW5nZXN0TWFwcGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiciKTsKKwkJCXRoaXMuaW5nZXN0TWFwcGVyID0gaW5nZXN0TWFwcGVyOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBzZXQgaW5nZXN0IG1hcHBlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRoaXMuaW5nZXN0TWFwcGVyTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdGhpcy5jYXRhbG9nc0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQl0aGlzLmluZ2VzdE1hcHBlckxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBDYXRhbG9nU2VydmljZSBpcyByZXN0cmljdGluZyBhbnkgcXVlcmllcworCSAqIGZyb20gYmVpbmcgbWFkZSB0byB0aGUgQ2F0YWxvZ3MgaXQgaXMgbWFuYWdpbmcKKwkgKiBAcmV0dXJuIFRydWUgaXMgcmVzdHJpY3RpbmcgcXVlcmllcywgZmFsc2UgaWYgcmVzdHJpY3Rpb24gaXMKKwkgKiBvbiBhIHBlciBDYXRhbG9nIGJhc2VzLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKCkgeworCQlyZXR1cm4gdGhpcy5yZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zOworCX0KKworCS8qKgorCSAqIE1vZGlmeSB0aGlzIENhdGFsb2dTZXJ2aWNlcyBxdWVyeSByZXN0cmljdGlvbiwgZGVmYXVsdCBpcyBmYWxzZS4KKwkgKiBAcGFyYW0gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zIFRydWUgdG8gYmxvY2sgYWxsIHF1ZXJ5cyB0byBtYW5hZ2luZworCSAqIENhdGFsb2dzIG9yIGZhbHNlIHRvIGxlYXZlIGl0IGF0IGEgcGVyIENhdGFsb2cgYmFzZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zID0gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIENhdGFsb2dTZXJ2aWNlIGlzIHJlc3RyaWN0aW5nIGFueSBpbmdlc3Rpb25zCisJICogZnJvbSBiZWluZyBtYWRlIHRvIHRoZSBDYXRhbG9ncyBpdCBpcyBtYW5hZ2luZworCSAqIEByZXR1cm4gVHJ1ZSBpcyByZXN0cmljdGluZyBpbmdlc3Rpb25zLCBmYWxzZSBpZiByZXN0cmljdGlvbiBpcworCSAqIG9uIGEgcGVyIENhdGFsb2cgYmFzZXMuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKCkgeworCQlyZXR1cm4gdGhpcy5yZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zOworCX0KKworCS8qKgorCSAqIE1vZGlmeSB0aGlzIENhdGFsb2dTZXJ2aWNlcyBpbmdlc3QgcmVzdHJpY3Rpb24sIGRlZmF1bHQgaXMgZmFsc2UuCisJICogQHBhcmFtIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMgVHJ1ZSB0byBibG9jayBhbGwgaW5nZXN0aW9ucyB0byBtYW5hZ2luZworCSAqIENhdGFsb2dzIG9yIGZhbHNlIHRvIGxlYXZlIGl0IGF0IGEgcGVyIENhdGFsb2cgYmFzZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyhib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMpIHsKKwkJdGhpcy5yZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zID0gcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uczsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZENsYXNzCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoCisJCQlUcmFuc2FjdGlvbklkRmFjdG9yeSB0cmFuc2FjdGlvbklkRmFjdG9yeSkgeworCQl0aGlzLnRyYW5zYWN0aW9uSWRGYWN0b3J5ID0gdHJhbnNhY3Rpb25JZEZhY3Rvcnk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCWlmICghdGhpcy5jb250YWluc0NhdGFsb2coY2F0YWxvZ0lkKSkgeworCQkJdHJ5IHsKKwkJCQl0aGlzLnJlcGxhY2VDYXRhbG9nKG5ldyBDYXRhbG9nKGNhdGFsb2dJZCwgaW5kZXgsIG51bGwsIGZhbHNlLCBmYWxzZSkpOworCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQorCQkJfQorCQl9IGVsc2UgeworCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQXR0ZW1wdCB0byBvdmVycmlkZSBhbiBleGlzdGluZyBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgYWxyZWFkeSB1c2VkIGluIENhdGFsb2dTZXJ2aWNlLCByZW1lZHkgYW5kIHJldHJ5IGFkZCAtLSBubyBjaGFuZ2VzIHRvb2sgcGxhY2UhIik7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCWlmICghdGhpcy5jb250YWluc0NhdGFsb2coY2F0YWxvZ0lkKSkgeworCQkJdHJ5IHsKKwkJCQl0aGlzLnJlcGxhY2VDYXRhbG9nKG5ldyBDYXRhbG9nKGNhdGFsb2dJZCwgaW5kZXgsIGRpY3Rpb25hcmllcywgZmFsc2UsIGZhbHNlKSk7CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCisJCQl9CisJCX0gZWxzZSB7CisJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJBdHRlbXB0IHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyBhbHJlYWR5IHVzZWQgaW4gQ2F0YWxvZ1NlcnZpY2UsIHJlbWVkeSBhbmQgcmV0cnkgYWRkIC0tIG5vIGNoYW5nZXMgdG9vayBwbGFjZSEiKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZENhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgSW5kZXggaW5kZXgsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzLCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uLCBib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJaWYgKCF0aGlzLmNvbnRhaW5zQ2F0YWxvZyhjYXRhbG9nSWQpKSB7CisJCQl0cnkgeworCQkJCXRoaXMucmVwbGFjZUNhdGFsb2cobmV3IENhdGFsb2coY2F0YWxvZ0lkLCBpbmRleCwgZGljdGlvbmFyaWVzLCByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbiwgcmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9uKSk7CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCisJCQl9CisJCX0gZWxzZSB7CisJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJBdHRlbXB0IHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyBhbHJlYWR5IHVzZWQgaW4gQ2F0YWxvZ1NlcnZpY2UsIHJlbWVkeSBhbmQgcmV0cnkgYWRkIC0tIG5vIGNoYW5nZXMgdG9vayBwbGFjZSEiKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZERpY3Rpb25hcnkoU3RyaW5nIGNhdGFsb2dJZCwgRGljdGlvbmFyeSBkaWN0aW9uYXJ5KSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlpZiAodGhpcy5jb250YWluc0NhdGFsb2coY2F0YWxvZ0lkKSkgeworCQkJU2V0PENhdGFsb2c+IGJhY2t1cENhdGFsb2dzID0gbnVsbDsKKwkJCXRoaXMuY2F0YWxvZ3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKwkJCXRyeSB7CisJCQkJYmFja3VwQ2F0YWxvZ3MgPSBuZXcgSGFzaFNldDxDYXRhbG9nPih0aGlzLmNhdGFsb2dzKTsKKwkJCQlmb3IgKENhdGFsb2cgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKKwkJCQkJaWYgKGNhdGFsb2cuZ2V0SWQoKS5lcXVhbHMoY2F0YWxvZ0lkKSkgeworCQkJCQkJY2F0YWxvZy5hZGREaWN0aW9uYXJ5KGRpY3Rpb25hcnkpOworCQkJCQkJdGhpcy5jYXRhbG9nUmVwb3NpdG9yeS5zZXJpYWxpemVDYXRhbG9nKGNhdGFsb2cpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5jYXRhbG9ncyA9IGJhY2t1cENhdGFsb2dzOworCQkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNlcmlhbGl6ZSBDYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgLS0gaWYgQ2F0YWxvZ1NlcnZpY2UgZ29lcyBkb3duLCBDYXRhbG9nIHdpbGwgaGF2ZSB0byBiZSByZWFkZGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCX1maW5hbGx5IHsKKwkJCQl0aGlzLmNhdGFsb2dzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkF0dGVtcHQgdG8gY2hhbmdlIGFuIGV4aXN0aW5nIGNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyBhbHJlYWR5IHVzZWQgaW4gQ2F0YWxvZ1NlcnZpY2UsIHJlbWVkeSBhbmQgcmV0cnkgYWRkIC0tIG5vIGNoYW5nZXMgdG9vayBwbGFjZSEiKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZXBsYWNlRGljdGlvbmFyaWVzKFN0cmluZyBjYXRhbG9nSWQsIExpc3Q8RGljdGlvbmFyeT4gZGljdGlvbmFyaWVzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0aGlzLm1vZGlmeUNhdGFsb2coY2F0YWxvZ0lkLCBkaWN0aW9uYXJpZXMsIG51bGwsIG51bGwsIG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHJlcGxhY2VJbmRleChTdHJpbmcgY2F0YWxvZ0lkLCBJbmRleCBpbmRleCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdGhpcy5tb2RpZnlDYXRhbG9nKGNhdGFsb2dJZCwgbnVsbCwgaW5kZXgsIG51bGwsIG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIG1vZGlmeUluZ2VzdFBlcm1pc3Npb24oU3RyaW5nIGNhdGFsb2dJZCwgYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb24pIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRoaXMubW9kaWZ5Q2F0YWxvZyhjYXRhbG9nSWQsIG51bGwsIG51bGwsIG51bGwsIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbik7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vZGlmeVF1ZXJ5UGVybWlzc2lvbihTdHJpbmcgY2F0YWxvZ0lkLCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0aGlzLm1vZGlmeUNhdGFsb2coY2F0YWxvZ0lkLCBudWxsLCBudWxsLCByZXN0cmljdFF1ZXJ5UGVybWlzc2lvbiwgbnVsbCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIG1vZGlmeUNhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCwgTGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMsIEluZGV4IGluZGV4LCBCb29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9uLCBCb29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMuY29udGFpbnNDYXRhbG9nKGNhdGFsb2dJZCkpIHsKKwkJCVNldDxDYXRhbG9nPiBiYWNrdXBDYXRhbG9ncyA9IG51bGw7CisJCQl0aGlzLmNhdGFsb2dzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQl0cnkgeworCQkJCWJhY2t1cENhdGFsb2dzID0gbmV3IEhhc2hTZXQ8Q2F0YWxvZz4odGhpcy5jYXRhbG9ncyk7CisJCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiB0aGlzLmNhdGFsb2dzKSB7CisJCQkJCWlmIChjYXRhbG9nLmdldElkKCkuZXF1YWxzKGNhdGFsb2dJZCkpIHsKKwkJCQkJCWlmIChkaWN0aW9uYXJpZXMgIT0gbnVsbCkKKwkJCQkJCQljYXRhbG9nLnNldERpY3Rpb25hcmllcyhkaWN0aW9uYXJpZXMpOworCQkJCQkJaWYgKGluZGV4ICE9IG51bGwpCisJCQkJCQkJY2F0YWxvZy5zZXRJbmRleChpbmRleCk7CisJCQkJCQlpZiAocmVzdHJpY3RRdWVyeVBlcm1pc3Npb24gIT0gbnVsbCkKKwkJCQkJCQljYXRhbG9nLnNldFJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucyhyZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMpOworCQkJCQkJaWYgKHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbiAhPSBudWxsKQorCQkJCQkJCWNhdGFsb2cuc2V0UmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyhyZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKTsKKwkJCQkJCXRoaXMuY2F0YWxvZ1JlcG9zaXRvcnkuc2VyaWFsaXplQ2F0YWxvZyhjYXRhbG9nKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXRoaXMuY2F0YWxvZ3MgPSBiYWNrdXBDYXRhbG9nczsKKwkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBzZXJpYWxpemUgQ2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIC0tIGlmIENhdGFsb2dTZXJ2aWNlIGdvZXMgZG93biwgQ2F0YWxvZyB3aWxsIGhhdmUgdG8gYmUgcmVhZGRlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9ZmluYWxseSB7CisJCQkJdGhpcy5jYXRhbG9nc0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0NhdGFsb2coU3RyaW5nIGNhdGFsb2dJZCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdGhpcy5jYXRhbG9nc0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5jYXRhbG9ncy5jb250YWlucyhjYXRhbG9nSWQpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBjaGVjayBpZiBjYXRhbG9nICciICsgY2F0YWxvZ0lkICsgIicgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGlzIENhdGFsb2dTZXJ2aWNlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdGhpcy5jYXRhbG9nc0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBYmlsaXR5IHRvIGR5bmFtaWNhbGx5IGFkZCBhIENhdGFsb2cgdG8gdGhpcyBDYXRhbG9nU2VydmljZSBmb3IgbWFuYWdpbmcKKwkgKiBAcGFyYW0gY2F0YWxvZyBDYXRhbG9nIGZvciB0aGlzIENhdGFsb2dTZXJ2aWNlIHRvIG1hbmFnZQorCSAqIEByZXR1cm4gVHJ1ZSBpZiBjYXRhbG9ncyB3aGVyZSBhZGRlZCB0byBsaXN0CisJICogQHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiBJZiBvbmUgb2YgdGhlIGFkZGluZyBDYXRhbG9nCisJICogVVJOcyBlcXVhbHMgdGhhdCBvZiBhbiBleGlzdGluZyBDYXRhbG9nLiAKKwkgKi8JCisJcHVibGljIHZvaWQgYWRkQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCWlmICghdGhpcy5jb250YWluc0NhdGFsb2coY2F0YWxvZy5nZXRJZCgpKSkKKwkJCXRoaXMucmVwbGFjZUNhdGFsb2coY2F0YWxvZyk7CisJCWVsc2UKKwkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkF0dGVtcHQgdG8gb3ZlcnJpZGUgYW4gZXhpc3RpbmcgY2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyBhbHJlYWR5IHVzZWQgaW4gQ2F0YWxvZ1NlcnZpY2UsIHJlbWVkeSBhbmQgcmV0cnkgYWRkIC0tIG5vIGNoYW5nZXMgdG9vayBwbGFjZSEiKTsKKwl9CisJCisJLyoqCisJICogQWJpbGl0eSB0byBkeW5hbWljYWxseSBhZGQgYSBDYXRhbG9nIHRvIHRoaXMgQ2F0YWxvZ1NlcnZpY2UgZm9yIG1hbmFnaW5nCisJICogQHBhcmFtIGNhdGFsb2cgQ2F0YWxvZyBmb3IgdGhpcyBDYXRhbG9nU2VydmljZSB0byBtYW5hZ2UKKwkgKiBAcGFyYW0gYWxsb3dPdmVycmlkZSBUcnVlIHRvIGFsbG93IGFkZGluZyBDYXRhbG9nIHRvIG92ZXJyaWRlIGV4aXN0aW5nIENhdGFsb2cgd2l0aCBzYW1lIFVSTgorCSAqIEB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24gV2hlbiBhbGxvd092ZXJyaWRlPWZhbHNlIGFuZCBvbmUgb2YgdGhlIGFkZGluZyBDYXRhbG9nCisJICogVVJOcyBlcXVhbHMgdGhhdCBvZiBhbiBleGlzdGluZyBDYXRhbG9nLiAKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBsYWNlQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCVNldDxDYXRhbG9nPiBiYWNrdXBDYXRhbG9ncyA9IG51bGw7CisJCXRoaXMuY2F0YWxvZ3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKwkJdHJ5IHsKKwkJCWJhY2t1cENhdGFsb2dzID0gbmV3IEhhc2hTZXQ8Q2F0YWxvZz4odGhpcy5jYXRhbG9ncyk7CisJCQl0aGlzLmNhdGFsb2dzLnJlbW92ZShjYXRhbG9nKTsKKwkJCXRoaXMuY2F0YWxvZ3MuYWRkKGNhdGFsb2cpOworCQkJdGhpcy5jYXRhbG9nUmVwb3NpdG9yeS5zZXJpYWxpemVDYXRhbG9nKGNhdGFsb2cpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aGlzLmNhdGFsb2dzID0gYmFja3VwQ2F0YWxvZ3M7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBzZXJpYWxpemUgQ2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyAtLSBpZiBDYXRhbG9nU2VydmljZSBnb2VzIGRvd24sIENhdGFsb2cgd2lsbCBoYXZlIHRvIGJlIHJlYWRkZWQgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0aGlzLmNhdGFsb2dzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0aGlzLnJlbW92ZUNhdGFsb2coY2F0YWxvZ1VybiwgZmFsc2UpOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gY2F0YWxvZ1VybgorCSAqIEB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nKFN0cmluZyBjYXRhbG9nSWQsIGJvb2xlYW4gcHJlc2VydmVNYXBwaW5nKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQkJdGhpcy5jYXRhbG9nc0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlDYXRhbG9nIHJtQ2F0YWxvZyA9IG51bGw7CisJCQl0cnkgeworCQkJCWZvciAoQ2F0YWxvZyBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgeworCQkJCQlpZiAoY2F0YWxvZy5nZXRJZCgpLmVxdWFscyhjYXRhbG9nSWQpKSB7CisJCQkJCQlybUNhdGFsb2cgPSBjYXRhbG9nOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZmluZCBjYXRhbG9nIG9iamVjdCBmb3IgY2F0YWxvZyBVUk4gJyIgKyBjYXRhbG9nSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9ZmluYWxseSB7CisJCQkJdGhpcy5jYXRhbG9nc0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJCX0KKwkJCQorCQkJaWYgKHJtQ2F0YWxvZyAhPSBudWxsKSB7CisJCQkJdGhpcy5jYXRhbG9nc0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQkJCXRyeSB7CisJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlJlbW92aW5nIGNhdGFsb2cgJyIgKyBybUNhdGFsb2cgKyAiJyIpOworCQkJCQl0aGlzLmNhdGFsb2dzLnJlbW92ZShybUNhdGFsb2cpOworCQkJCQl0aGlzLmNhdGFsb2dSZXBvc2l0b3J5LmRlbGV0ZVNlcmlhbGl6ZWRDYXRhbG9nKGNhdGFsb2dJZCk7CisJCQkJCWlmICghcHJlc2VydmVNYXBwaW5nKSB7CisJCQkJCQl0aGlzLmluZ2VzdE1hcHBlckxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQkJCQkJdHJ5IHsKKwkJCQkJCQlMT0cubG9nKExldmVsLklORk8sICJEZWxldGluZyBhbGwgaW5kZXggbWFwcGluZ3MgZm9yIGNhdGFsb2cgJyIgKyBybUNhdGFsb2cgKyAiJyIpOworCQkJCQkJCXRoaXMuaW5nZXN0TWFwcGVyLmRlbGV0ZUFsbE1hcHBpbmdzRm9yQ2F0YWxvZyhjYXRhbG9nSWQpOworCQkJCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCXRocm93IGU7CisJCQkJCQl9ZmluYWxseSB7CisJCQkJCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byByZW1vdmUgQ2F0YWxvZyAnIiArIGNhdGFsb2dJZCArICInIGZyb20gdGhpcyBDYXRhbG9nU2VydmljZSIpOworCQkJCX1maW5hbGx5IHsKKwkJCQkJdGhpcy5jYXRhbG9nc0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisJCQkJfQorCQkJfWVsc2UgeworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkNhdGFsb2cgJyIgKyBjYXRhbG9nSWQgKyAiJyBpcyBub3QgY3VycmVudGx5IG1hbmFnZWQgYnkgdGhpcyBDYXRhbG9nU2VydmljZSIpOworCQkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQbHVnaW5TdG9yYWdlRGlyKEZpbGUgcGx1Z2luU3RvcmFnZURpcikgeworCQl0aGlzLnBsdWdpblN0b3JhZ2VEaXIgPSBwbHVnaW5TdG9yYWdlRGlyOworCQl0aGlzLnBsdWdpblN0b3JhZ2VEaXIubWtkaXJzKCk7CisJfQorCQorCXB1YmxpYyBVUkwgZ2V0UGx1Z2luU3RvcmFnZURpcigpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFVSTCgiZmlsZTovLyIgKyB0aGlzLnBsdWdpblN0b3JhZ2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgcGx1Z2luIHN0b3JhZ2UgZGlyIGRpcmVjdG9yeSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIExpc3Q8UGx1Z2luVVJMPiBnZXRQbHVnaW5VcmxzKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmNhdGFsb2dSZXBvc2l0b3J5LmRlc2VyaWFsaXplUGx1Z2luVVJMcygpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFBsdWdpblVybHMoTGlzdDxQbHVnaW5VUkw+IHVybHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlMaXN0PFBsdWdpblVSTD4gY3VycmVudFVybHMgPSBuZXcgVmVjdG9yPFBsdWdpblVSTD4odGhpcy5jYXRhbG9nUmVwb3NpdG9yeS5kZXNlcmlhbGl6ZVBsdWdpblVSTHMoKSk7CisJCQljdXJyZW50VXJscy5hZGRBbGwodXJscyk7CisJCQl0aGlzLmNhdGFsb2dSZXBvc2l0b3J5LnNlcmlhbGl6ZVBsdWdpblVSTHMoY3VycmVudFVybHMpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uCisJICovCisJcHVibGljIFNldDxDYXRhbG9nPiBnZXRDdXJyZW50Q2F0YWxvZ0xpc3QoKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0aGlzLmNhdGFsb2dzTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgSGFzaFNldDxDYXRhbG9nPih0aGlzLmNhdGFsb2dzKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgY2F0YWxvZyBsaXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdGhpcy5jYXRhbG9nc0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nVXJuKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0aGlzLmNhdGFsb2dzTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKwkJdHJ5IHsKKwkJCWZvciAoQ2F0YWxvZyBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykKKwkJCQlpZiAoY2F0YWxvZy5nZXRJZCgpLmVxdWFscyhjYXRhbG9nVXJuKSkKKwkJCQkJcmV0dXJuIGNhdGFsb2c7CisJCQlyZXR1cm4gbnVsbDsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGNhdGFsb2cgY2F0YWxvZyAnIiArICBjYXRhbG9nVXJuICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0aGlzLmNhdGFsb2dzTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworCQl9CisJfQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldEN1cnJlbnRDYXRhbG9nSWRzKCkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdGhpcy5jYXRhbG9nc0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCXRyeSB7CisJCQlTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiB0aGlzLmNhdGFsb2dzKSAKKwkJCQljYXRhbG9nSWRzLmFkZChjYXRhbG9nLmdldElkKCkpOworCQkJcmV0dXJuIGNhdGFsb2dJZHM7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBjdXJyZW50IGNhdGFsb2cgaWRzIGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0aGlzLmNhdGFsb2dzTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworCQl9CisJfQorCQkKKwlwdWJsaWMgVHJhbnNhY3Rpb25SZWNlaXB0IGluZ2VzdChNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMucmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucykgCisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkluZ2VzdCBwZXJtaXNzaW9ucyBhcmUgcmVzdHJpY3RlZCBmb3IgdGhpcyBDYXRhbG9nU2VydmljZSAtLSByZXF1ZXN0IGRlbmllZCIpOworCQl0cnkgewkKKwkJCWJvb2xlYW4gcGVyZm9ybVVwZGF0ZSA9IGZhbHNlOworCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgPSB0aGlzLmdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChtZXRhZGF0YSk7CisJCQlpZiAocGVyZm9ybVVwZGF0ZSA9IHRoaXMuaW5nZXN0TWFwcGVyLmhhc0NhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQpKSAKKwkJCQlMT0cubG9nKExldmVsLklORk8sICJUcmFuc2FjdGlvbklkICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIicgaXMgYW4gZXhpc3RpbmcgVHJhbnNhY3Rpb25JZCwgc3dpdGNoaW5nIHRvIHVwZGF0ZSBtb2RlIik7CisJCQlMaXN0PENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHMgPSBuZXcgVmVjdG9yPENhdGFsb2dSZWNlaXB0PigpOworCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiB0aGlzLmdldEZpbHRlcmVkQ2F0YWxvZ0xpc3QobWV0YWRhdGEpKSB7CQkJCisJCQkJaWYgKGNhdGFsb2cuaXNJbmdlc3RhYmxlKCkpIHsKKwkJCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIHBlcmZvcm0gdXBkYXRlCisJCQkJCQlpZiAocGVyZm9ybVVwZGF0ZSkgeworCQkJCQkJCWlmICghQm9vbGVhbi5wYXJzZUJvb2xlYW4obWV0YWRhdGEuZ2V0TWV0YWRhdGEoRU5BQkxFX1VQREFURV9NRVRfS0VZKSkpCisJCQkJCQkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiVHJhbnNhY3Rpb25JZCAnIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICInIGFscmVhZHkgZXhpc3RzIC0tIGVuYWJsZSB1cGRhdGUgYnkgc2V0dGluZyBtZXRhZGF0YSBrZXkgJyIgKyBFTkFCTEVfVVBEQVRFX01FVF9LRVkgKyAiJz10cnVlIik7CisJCQkJCQkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCA9IHRoaXMuaW5nZXN0TWFwcGVyLmdldENhdGFsb2dUcmFuc2FjdGlvbklkKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCwgY2F0YWxvZy5nZXRJZCgpKTsKKwkJCQkJCQlpZiAoY2F0YWxvZ1RyYW5zYWN0aW9uSWQgIT0gbnVsbCkgeworCQkJCQkJCQlDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA9IGNhdGFsb2cudXBkYXRlKGNhdGFsb2dUcmFuc2FjdGlvbklkLCBtZXRhZGF0YSk7CisJCQkJCQkJCWlmIChjYXRhbG9nUmVjZWlwdCAhPSBudWxsKSB7CisJCQkJCQkJCQlpZiAoIWNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKS5lcXVhbHMoY2F0YWxvZ1RyYW5zYWN0aW9uSWQpKSB7CisJCQkJCQkJCQkJdGhpcy5pbmdlc3RNYXBwZXIuZGVsZXRlVHJhbnNhY3Rpb25JZE1hcHBpbmcoY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIGNhdGFsb2cuZ2V0SWQoKSk7CisJCQkJCQkJCQkJdGhpcy5pbmdlc3RNYXBwZXIuc3RvcmVUcmFuc2FjdGlvbklkTWFwcGluZyhjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQsIHRoaXMudHJhbnNhY3Rpb25JZEZhY3RvcnksIGNhdGFsb2dSZWNlaXB0LCBjYXRhbG9nLmdldFRyYW5zYWN0aW9uSWRGYWN0b3J5KCkpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJY2F0YWxvZ1JlY2VpcHRzLmFkZChjYXRhbG9nUmVjZWlwdCk7CisJCQkJCQkJCQlMT0cubG9nKExldmVsLklORk8sICJTdWNjZXNzZnVsbHkgdXBkYXRlZCBtZXRhZGF0YSB0byBjYXRhbG9nICciICsgY2F0YWxvZyArICInIGZvciBUcmFuc2FjdGlvbklkICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIiciKTsKKwkJCQkJCQkJfWVsc2UgeworCQkJCQkJCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJVcGRhdGUgYXR0ZW1wdCB0byBjYXRhbG9nICciICsgY2F0YWxvZyArICInIGZhaWxlZCBmb3IgVHJhbnNhY3Rpb25JZCAnIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICInIC0tIHVwZGF0ZSByZXR1cm5lZCBmYWxzZSIpOworCQkJCQkJCQl9CisJCQkJCQkJfWVsc2UgeworCQkJCQkJCQlMT0cubG9nKExldmVsLklORk8sICJDYXRhbG9nICciICsgY2F0YWxvZyArICInIHdhcyBub3Qgb24gaW5nZXN0IGxpc3QgZm9yIFRyYW5zYWN0aW9uSWQgJyIgKyBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgKyAiJyAtLSBza2lwcGluZyIpOworCQkJCQkJCX0KKwkJCQkJCS8vIHBlcmZvcm0gaW5nZXN0CQorCQkJCQkJfWVsc2UgeworCQkJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlBlcmZvcm1pbmcgaW5nZXN0IGZvciBUcmFuc2FjdGlvbklkICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIicgdG8gY2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyIpOworCQkJCQkJCUNhdGFsb2dSZWNlaXB0IGNhdGFsb2dSZWNlaXB0ID0gY2F0YWxvZy5pbmdlc3QobWV0YWRhdGEpOworCQkJCQkJCWlmIChjYXRhbG9nUmVjZWlwdCAhPSBudWxsKSB7CisJCQkJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlN1Y2Nlc3NmdWxseSBpbmdlc3RlZCBtZXRhZGF0YSAtLSBJbmRleGluZyBUcmFuc2FjdGlvbklkIGluZm9ybWF0aW9uIGZvciBpbmdlc3QgKENhdGFsb2dTZXJ2aWNlIFRyYW5zYWN0aW9uSWQgPSAnIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICInLCBDYXRhbG9nIFRyYW5zYWN0aW9uSWQgPSAnIiArIGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKSArICInLCBjYXRhbG9nID0gJyIgKyBjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSArICInKSIpOworCQkJCQkJCQl0aGlzLmluZ2VzdE1hcHBlci5zdG9yZVRyYW5zYWN0aW9uSWRNYXBwaW5nKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCwgdGhpcy50cmFuc2FjdGlvbklkRmFjdG9yeSwgY2F0YWxvZ1JlY2VpcHQsIGNhdGFsb2cuZ2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoKSk7CisJCQkJCQkJCWNhdGFsb2dSZWNlaXB0cy5hZGQoY2F0YWxvZ1JlY2VpcHQpOworCQkJCQkJCX1lbHNlIHsKKwkJCQkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyBub3QgaW50ZXJlc3RlZCBpbiBhbnkgTWV0YWRhdGEgZm9yIFRyYW5zYWN0aW9uSWQgJyIgKyBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgKyAiJyIpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGFkZCBtZXRhZGF0YSB0byBjYXRhbG9nICciICsgY2F0YWxvZy5nZXRJZCgpICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQkJaWYgKHRoaXMub25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCkKKwkJCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBhZGQgbWV0YWRhdGEgdG8gY2F0YWxvZyAnIiArIGNhdGFsb2cuZ2V0SWQoKSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJfWZpbmFsbHkgeworCQkJCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQkJCQl9CisJCQkJfWVsc2UgeworCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJJbmdlc3Qgbm90IHBlcm1pdHRlZCB0byBjYXRhbG9nICciICsgY2F0YWxvZyArICInIC0tIHNraXBwaW5nIG92ZXIgY2F0YWxvZyIpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAoY2F0YWxvZ1JlY2VpcHRzLnNpemUoKSA+IDApID8gbmV3IFRyYW5zYWN0aW9uUmVjZWlwdChjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQsIGNhdGFsb2dSZWNlaXB0cykgOiBudWxsOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkVycm9yIG9jY3VyZWQgZHVyaW5nIE1ldGFkYXRhIGluZ2VzdCBhdHRlbXB0IDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gbWV0YWRhdGEKKwkgKiBAdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlKE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlpZiAodGhpcy5yZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKQorCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJEZWxldGUgcGVybWlzc2lvbnMgYXJlIHJlc3RyaWN0ZWQgZm9yIHRoaXMgQ2F0YWxvZ1NlcnZpY2UgLS0gcmVxdWVzdCBkZW5pZWQiKTsKKwkJVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgPSB0aGlzLmdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChtZXRhZGF0YSwgZmFsc2UpOworCQlpZiAoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICE9IG51bGwpIHsKKwkJCWZvciAoQ2F0YWxvZyBjYXRhbG9nIDogdGhpcy5nZXRGaWx0ZXJlZENhdGFsb2dMaXN0KG1ldGFkYXRhKSkgeworCQkJCWlmIChjYXRhbG9nLmlzSW5nZXN0YWJsZSgpKSB7CisJCQkJCXRoaXMuaW5nZXN0TWFwcGVyTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQkJCXRyeSB7CisJCQkJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkID0gdGhpcy5pbmdlc3RNYXBwZXIuZ2V0Q2F0YWxvZ1RyYW5zYWN0aW9uSWQoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBjYXRhbG9nLmdldElkKCkpOworCQkJCQkJaWYgKGNhdGFsb2dUcmFuc2FjdGlvbklkICE9IG51bGwpIHsKKwkJCQkJCQlpZiAodGhpcy5kb1JlZHVjZShtZXRhZGF0YSkpIHsKKwkJCQkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGVsZXRpbmcgbWV0YWRhdGEgZnJvbSBUcmFuc2FjdGlvbklkICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIicgZm9yIGNhdGFsb2cgJyIgKyBjYXRhbG9nICsgIiciKTsKKwkJCQkJCQkJaWYgKGNhdGFsb2cucmVkdWNlKGNhdGFsb2dUcmFuc2FjdGlvbklkLCBtZXRhZGF0YSkpIHsKKwkJCQkJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIG1ldGFkYXRhIGZyb20gY2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyBmb3IgVHJhbnNhY3Rpb25JZCBbaWQgPSAiICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIl0iKTsKKwkJCQkJCQkJfWVsc2UgeworCQkJCQkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiRmFpbGVkIHRvIGRlbGV0ZWQgbWV0YWRhdGEgZnJvbSBjYXRhbG9nICciICsgY2F0YWxvZyArICInIGZvciBUcmFuc2FjdGlvbklkIFtpZCA9ICIgKyBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgKyAiXSAtLSBkZWxldGUgcmV0dXJuZWQgZmFsc2UiKTsKKwkJCQkJCQkJfQorCQkJCQkJCX1lbHNlIHsKKwkJCQkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGVsZXRpbmcgYWxsIHJlY29yZHMgb2YgVHJhbnNhY3Rpb25JZCBmcm9tIGNhdGFsb2cgJyIgKyBjYXRhbG9nICsgIiciKTsKKwkJCQkJCQkJaWYgKGNhdGFsb2cuZGVsZXRlKGNhdGFsb2dUcmFuc2FjdGlvbklkKSkgeworCQkJCQkJCQkJdGhpcy5pbmdlc3RNYXBwZXIuZGVsZXRlVHJhbnNhY3Rpb25JZE1hcHBpbmcoY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIGNhdGFsb2cuZ2V0SWQoKSk7CisJCQkJCQkJCQlMT0cubG9nKExldmVsLklORk8sICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBtZXRhZGF0YSBmcm9tIGNhdGFsb2cgJyIgKyBjYXRhbG9nICsgIicgZm9yIFRyYW5zYWN0aW9uSWQgW2lkID0gIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICJdIik7CisJCQkJCQkJCX1lbHNlIHsKKwkJCQkJCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIkZhaWxlZCB0byBkZWxldGVkIG1ldGFkYXRhIGZyb20gY2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyBmb3IgVHJhbnNhY3Rpb25JZCBbaWQgPSAiICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIl0gLS0gZGVsZXRlIHJldHVybmVkIGZhbHNlIik7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9ZWxzZSB7CisJCQkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyB3YXMgbm90IG9uIGRlbGV0ZSBsaXN0IGZvciBUcmFuc2FjdGlvbklkICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIicgLS0gc2tpcHBpbmciKTsKKwkJCQkJCX0KKwkJCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3Igb2NjdXJlZCB3aGlsZSBkZWxldGluZyBtZXRhZGF0YSBmb3IgVHJhbnNhY3Rpb25JZCBbaWQgPSAiICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIl0gOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQkJaWYgKHRoaXMub25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCkKKwkJCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkVycm9yIG9jY3VyZWQgd2hpbGUgZGVsZXRpbmcgbWV0YWRhdGEgZm9yIFRyYW5zYWN0aW9uSWQgW2lkID0gIiArIGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJfWZpbmFsbHkgeworCQkJCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQkJCQl9CisJCQkJfWVsc2UgeworCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJEZWxldGlvbiBpcyBub3QgcGVybWl0dGVkIHRvIGNhdGFsb2cgJyIgKyBjYXRhbG9nICsgIicgLS0gc2tpcHBpbmcgb3ZlciBjYXRhbG9nIik7CisJCQkJfQkKKwkJCX0KKwkJfWVsc2UgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgYSBUcmFuc2FjdGlvbklkIHRvIGRlbGV0ZSIpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGRvUmVkdWNlKE1ldGFkYXRhIG1ldGFkYXRhKSB7CisJCWZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKwkJCWlmICghKGtleS5lcXVhbHMoQ0FUQUxPR19TRVJWSUNFX1RSQU5TQUNUSU9OX0lEX01FVF9LRVkpIHx8IGtleS5lcXVhbHMoQ0FUQUxPR19JRFNfTUVUX0tFWSkgfHwga2V5LmVxdWFscyhDQVRBTE9HX1RSQU5TQUNUSU9OX0lEX01FVF9LRVkpIHx8IGtleS5lcXVhbHMoQ0FUQUxPR19JRF9NRVRfS0VZKSkpCisJCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlMaXN0PFN0cmluZz4gdmFscyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCQlmb3IgKENhdGFsb2cgY2F0YWxvZyA6IHRoaXMuZ2V0Q3VycmVudENhdGFsb2dMaXN0KCkpIHsKKwkJCXRyeSB7CisJCQkJU3RyaW5nIHZhbCA9IGNhdGFsb2cuZ2V0UHJvcGVydHkoa2V5KTsKKwkJCQlpZiAodmFsICE9IG51bGwpCisJCQkJCXZhbHMuYWRkKHZhbCk7CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKHRoaXMub25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCkKKwkJCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGNhdGFsb2cgcHJvcGVydHkgJyIgKyBrZXkgKyAiJyBmcm9tIGNhdGFsb2cgJyIgKyBjYXRhbG9nLmdldElkKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQkJZWxzZQorCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gZ2V0IGNhdGFsb2cgcHJvcGVydHkgJyIgKyBrZXkgKyAiJyBmcm9tIGNhdGFsb2cgJyIgKyBjYXRhbG9nLmdldElkKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHM7CisJfQorCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCQlmb3IgKENhdGFsb2cgY2F0YWxvZyA6IHRoaXMuZ2V0Q3VycmVudENhdGFsb2dMaXN0KCkpIHsKKwkJCXRyeSB7CisJCQkJUHJvcGVydGllcyBjYXRhbG9nUHJvcGVydGllcyA9IGNhdGFsb2cuZ2V0UHJvcGVydGllcygpOworCQkJCWZvciAoT2JqZWN0IGtleSA6IGNhdGFsb2dQcm9wZXJ0aWVzLmtleVNldCgpKSB7CisJCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoKFN0cmluZykga2V5KTsKKwkJCQkJaWYgKHZhbHVlICE9IG51bGwpCisJCQkJCQl2YWx1ZSArPSAiLCIgKyBjYXRhbG9nUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgoU3RyaW5nKSBrZXkpOworCQkJCQllbHNlIAorCQkJCQkJdmFsdWUgPSBjYXRhbG9nUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgoU3RyaW5nKSBrZXkpOworCQkJCQlwcm9wZXJ0aWVzLnNldFByb3BlcnR5KChTdHJpbmcpIGtleSwgdmFsdWUpOworCQkJCX0KKwkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAodGhpcy5vbmVDYXRhbG9nRmFpbHNBbGxGYWlsKQorCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgY2F0YWxvZyBwcm9wZXJ0aWVzIGZyb20gY2F0YWxvZyAnIiArIGNhdGFsb2cuZ2V0SWQoKSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQllbHNlCisJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkZhaWxlZCB0byBnZXQgY2F0YWxvZyBwcm9wZXJ0aWVzIGZyb20gY2F0YWxvZyAnIiArIGNhdGFsb2cuZ2V0SWQoKSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisJCisJcHVibGljIFByb3BlcnRpZXMgZ2V0Q2FsYWxvZ1Byb3BlcnRpZXMoU3RyaW5nIGNhdGFsb2dVcm4pIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coY2F0YWxvZ1Vybik7CisJCQlpZiAoY2F0YWxvZyAhPSBudWxsKQorCQkJCXJldHVybiBjYXRhbG9nLmdldFByb3BlcnRpZXMoKTsKKwkJCWVsc2UgCisJCQkJcmV0dXJuIG51bGw7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBjYXRhbG9nIHByb3BlcnRpZXMgZnJvbSBjYXRhbG9nICciICsgY2F0YWxvZ1VybiArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUGFnZSBnZXROZXh0UGFnZShQYWdlIHBhZ2UpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCVF1ZXJ5UGFnZXIgcXVlcnlQYWdlciA9IG5ldyBRdWVyeVBhZ2VyKHRoaXMuX3F1ZXJ5KHBhZ2UuZ2V0UXVlcnlFeHByZXNzaW9uKCksIHBhZ2UuZ2V0UmVzdHJpY3RUb0NhdGFsb2dJZHMoKSkpOworCQlxdWVyeVBhZ2VyLnNldFBhZ2VJbmZvKG5ldyBQYWdlSW5mbyhwYWdlLmdldFBhZ2VTaXplKCksIHBhZ2UuZ2V0UGFnZU51bSgpICsgMSkpOworCQlyZXR1cm4gdGhpcy5nZXRQYWdlKHBhZ2UuZ2V0UXVlcnlFeHByZXNzaW9uKCksIHBhZ2UuZ2V0UmVzdHJpY3RUb0NhdGFsb2dJZHMoKSwgcXVlcnlQYWdlcik7CisJfQorCQorCXB1YmxpYyBQYWdlIGdldFBhZ2UoUGFnZUluZm8gcGFnZUluZm8sIFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmdldFBhZ2UocGFnZUluZm8sIHF1ZXJ5RXhwcmVzc2lvbiwgdGhpcy5nZXRDdXJyZW50Q2F0YWxvZ0lkcygpKTsKKwl9CisJCisJcHVibGljIFBhZ2UgZ2V0UGFnZShQYWdlSW5mbyBwYWdlSW5mbywgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gY2F0YWxvZ0lkcykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMuZGlzYWJsZUludGVyc2VjdGluZ0Nyb3NzQ2F0YWxvZ1F1ZXJpZXMpIHsKKwkJCXRyeSB7CisJCQkJaW50IHRvdGFsUmVzdWx0cyA9IDA7CisJCQkJTGlua2VkSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGNhdGFsb2dUb1NpemVPZk1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKwkJCQlmb3IgKFN0cmluZyBjYXRhbG9nSWQgOiBjYXRhbG9nSWRzKSB7CisJCQkJCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZyhjYXRhbG9nSWQpOworCQkJCQlRdWVyeUV4cHJlc3Npb24gcWUgPSB0aGlzLnJlZHVjZVRvVW5kZXJzdG9vZEV4cHJlc3Npb25zKGNhdGFsb2csIHF1ZXJ5RXhwcmVzc2lvbik7CisJCQkJCWlmIChxZSAhPSBudWxsKSB7CisJCQkJCQlpbnQgY2F0YWxvZ1Jlc3VsdFNpemUgPSBjYXRhbG9nLnNpemVPZihxZSk7CisJCQkJCQl0b3RhbFJlc3VsdHMgKz0gY2F0YWxvZ1Jlc3VsdFNpemU7CisJCQkJCQljYXRhbG9nVG9TaXplT2ZNYXAucHV0KGNhdGFsb2dJZCwgY2F0YWxvZ1Jlc3VsdFNpemUpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlJvdXRpbmcgcXVlcnkgdG8gY2F0YWxvZ3MgYXMgbm9uLWNyb3NzIGNhdGFsb2cgaW50ZXJzZWN0aW5nIHF1ZXJpZXMgLiAuIC4iKTsKKwkJCQlpZiAodG90YWxSZXN1bHRzIDw9IHRoaXMuY3Jvc3NDYXRhbG9nUmVzdWx0U29ydGluZ1RocmVzaG9sZCkgeworCQkJCQlMaXN0PENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHMgPSBuZXcgVmVjdG9yPENhdGFsb2dSZWNlaXB0PigpOworCQkJCQlmb3IgKFN0cmluZyBjYXRhbG9nSWQgOiBjYXRhbG9nVG9TaXplT2ZNYXAua2V5U2V0KCkpIHsKKwkJCQkJCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZyhjYXRhbG9nSWQpOworCQkJCQkJUXVlcnlFeHByZXNzaW9uIHFlID0gdGhpcy5yZWR1Y2VUb1VuZGVyc3Rvb2RFeHByZXNzaW9ucyhjYXRhbG9nLCBxdWVyeUV4cHJlc3Npb24pOworCQkJCQkJaWYgKHFlICE9IG51bGwpCisJCQkJCQkJY2F0YWxvZ1JlY2VpcHRzLmFkZEFsbChjYXRhbG9nLnF1ZXJ5KHFlKSk7CisJCQkJCX0KKwkJCQkJTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IHRyYW5zYWN0aW9uUmVjZWlwdHMgPSB0aGlzLmdldFBvc3NpYmx5VW5pbmRleGVkVHJhbnNhY3Rpb25SZWNlaXB0cyhjYXRhbG9nUmVjZWlwdHMpOworCQkJCQlMT0cubG9nKExldmVsLklORk8sICJTb3J0aW5nIFF1ZXJ5IFJlc3VsdHMgLiAuIC4gIik7CisJCQkJCUNvbGxlY3Rpb25zLnNvcnQodHJhbnNhY3Rpb25SZWNlaXB0cywgbmV3IENvbXBhcmF0b3I8VHJhbnNhY3Rpb25SZWNlaXB0PigpIHsKKwkJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShUcmFuc2FjdGlvblJlY2VpcHQgbzEsCisJCQkJCQkJCVRyYW5zYWN0aW9uUmVjZWlwdCBvMikgeworCQkJCQkJCXJldHVybiBvMi5nZXRUcmFuc2FjdGlvbkRhdGUoKS5jb21wYXJlVG8obzEuZ2V0VHJhbnNhY3Rpb25EYXRlKCkpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQkJUXVlcnlQYWdlciBxdWVyeVBhZ2VyID0gbmV3IFF1ZXJ5UGFnZXIodHJhbnNhY3Rpb25SZWNlaXB0cyk7CisJCQkJCXF1ZXJ5UGFnZXIuc2V0UGFnZUluZm8ocGFnZUluZm8pOworCQkJCQlyZXR1cm4gdGhpcy5nZXRQYWdlKHF1ZXJ5RXhwcmVzc2lvbiwgY2F0YWxvZ0lkcywgcXVlcnlQYWdlcik7CisJCQkJfWVsc2UgeworCQkJCQlpbnQgY3VycmVudEluZGV4ID0gMDsKKwkJCQkJaW50IGRlc2lyZWRTdGFydGluZ0luZGV4ID0gcGFnZUluZm8uZ2V0UGFnZU51bSgpICogcGFnZUluZm8uZ2V0UGFnZVNpemUoKTsKKwkJCQkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gcGFnZU9mUmVjZWlwdHMgPSBuZXcgVmVjdG9yPENhdGFsb2dSZWNlaXB0PigpOworCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBjYXRhbG9nVG9TaXplT2ZNYXAuZW50cnlTZXQoKSkgeworCQkJCQkJaWYgKGRlc2lyZWRTdGFydGluZ0luZGV4IC0gY3VycmVudEluZGV4IDw9IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coZW50cnkuZ2V0S2V5KCkpOworCQkJCQkJCVF1ZXJ5RXhwcmVzc2lvbiBxZSA9IHRoaXMucmVkdWNlVG9VbmRlcnN0b29kRXhwcmVzc2lvbnMoY2F0YWxvZywgcXVlcnlFeHByZXNzaW9uKTsKKwkJCQkJCQlpZiAocWUgIT0gbnVsbCkgeworCQkJCQkJCQlMaXN0PENhdGFsb2dSZWNlaXB0PiByZWNlaXB0cyA9IGNhdGFsb2cucXVlcnkocWUsIGRlc2lyZWRTdGFydGluZ0luZGV4IC0gY3VycmVudEluZGV4LCBNYXRoLm1pbigoZGVzaXJlZFN0YXJ0aW5nSW5kZXggLSBjdXJyZW50SW5kZXgpICsgcGFnZUluZm8uZ2V0UGFnZVNpemUoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOworCQkJCQkJCQlwYWdlT2ZSZWNlaXB0cy5hZGRBbGwocmVjZWlwdHMpOworCQkJCQkJCQlpZiAocGFnZU9mUmVjZWlwdHMuc2l6ZSgpID49IHBhZ2VJbmZvLmdldFBhZ2VTaXplKCkpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9ZWxzZSB7CisJCQkJCQkJY3VycmVudEluZGV4ICs9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuIG5ldyBQYWdlKG5ldyBQcm9jZXNzZWRQYWdlSW5mbyhwYWdlSW5mby5nZXRQYWdlU2l6ZSgpLCBwYWdlSW5mby5nZXRQYWdlTnVtKCksIHRvdGFsUmVzdWx0cyksIHF1ZXJ5RXhwcmVzc2lvbiwgY2F0YWxvZ0lkcywgdGhpcy5pbmRleFJlY2VpcHRzKHRoaXMuZ2V0UG9zc2libHlVbmluZGV4ZWRUcmFuc2FjdGlvblJlY2VpcHRzKHBhZ2VPZlJlY2VpcHRzKSkpOworCQkJCX0KKwkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQkJfQorCQl9ZWxzZSB7CisJCQlRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIgPSBuZXcgUXVlcnlQYWdlcih0aGlzLl9xdWVyeShxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpKTsgCisJCQlxdWVyeVBhZ2VyLnNldFBhZ2VJbmZvKHBhZ2VJbmZvKTsKKwkJCXJldHVybiB0aGlzLmdldFBhZ2UocXVlcnlFeHByZXNzaW9uLCBjYXRhbG9nSWRzLCBxdWVyeVBhZ2VyKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5xdWVyeShxdWVyeUV4cHJlc3Npb24sIHRoaXMuZ2V0Q3VycmVudENhdGFsb2dJZHMoKSk7CisJfQorCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRNZXRhZGF0YShQYWdlIHBhZ2UpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmdldE1ldGFkYXRhKHBhZ2UuZ2V0UmVjZWlwdHMoKSk7CisJfQorCQorCXByb3RlY3RlZCBQYWdlIGdldFBhZ2UoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbiwgU2V0PFN0cmluZz4gcmVzdHJpY3RUb0NhdGFsb2dJZHMsIFF1ZXJ5UGFnZXIgcXVlcnlQYWdlcikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBQYWdlKG5ldyBQcm9jZXNzZWRQYWdlSW5mbyhxdWVyeVBhZ2VyLmdldFBhZ2VTaXplKCksIHF1ZXJ5UGFnZXIuZ2V0UGFnZU51bSgpLCBxdWVyeVBhZ2VyLmdldE51bU9mSGl0cygpKSwgcXVlcnlFeHByZXNzaW9uLCByZXN0cmljdFRvQ2F0YWxvZ0lkcywgdGhpcy5pbmRleFJlY2VpcHRzKHF1ZXJ5UGFnZXIuZ2V0Q3VycmVudFBhZ2UoKSkpOworCX0KKwkKKwlwdWJsaWMgUXVlcnlQYWdlciBxdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiBjYXRhbG9nSWRzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFF1ZXJ5UGFnZXIodGhpcy5pbmRleFJlY2VpcHRzKHRoaXMuX3F1ZXJ5KHF1ZXJ5RXhwcmVzc2lvbiwgY2F0YWxvZ0lkcykpKTsKKwl9CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHF1ZXJ5RXhwcmVzc2lvbgorCSAqIEBwYXJhbSBpbmRleFBhZ2UKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gX3F1ZXJ5KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IGNhdGFsb2dJZHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCWlmICh0aGlzLnJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucykKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiUXVlcnkgcGVybWlzc2lvbnMgYXJlIHJlc3RyaWN0ZWQgZm9yIHRoaXMgQ2F0YWxvZ1NlcnZpY2UgLS0gcmVxdWVzdCBkZW5pZWQiKTsKKwkJdHJ5IHsKKwkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlJlY2lldmVkIHF1ZXJ5ICciICsgcXVlcnlFeHByZXNzaW9uICsgIiciKTsKKwkJCWlmICh0aGlzLnNpbXBsaWZ5UXVlcmllcykgeworCQkJCXF1ZXJ5RXhwcmVzc2lvbiA9IFF1ZXJ5VXRpbHMuc2ltcGxpZnlRdWVyeShxdWVyeUV4cHJlc3Npb24pOworCQkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIlNpbXBsaWZpZWQgcXVlcnkgdG8gJyIgKyBxdWVyeUV4cHJlc3Npb24gKyAiJyAtLSByb3V0aW5nIHF1ZXJ5IHRvIGNhdGFsb2dzIik7CisJCQl9CisJCQlRdWVyeVJlc3VsdCBxdWVyeVJlc3VsdCA9IHRoaXMucXVlcnlSZWN1cihxdWVyeUV4cHJlc3Npb24sIGNhdGFsb2dJZHMpOworCQkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzID0gbmV3IFZlY3RvcjxDYXRhbG9nUmVjZWlwdD4oKTsKKwkJCWlmIChxdWVyeVJlc3VsdC5nZXRDYXRhbG9nUmVjZWlwdHMoKSA9PSBudWxsICYmIHF1ZXJ5UmVzdWx0LmdldEludGVyZXN0ZWRDYXRhbG9ncygpICE9IG51bGwpIHsKKwkJCQlmb3IgKENhdGFsb2cgY2F0YWxvZyA6IHRoaXMuZ2V0Q3VycmVudENhdGFsb2dMaXN0KCkpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWlmIChxdWVyeVJlc3VsdC5nZXRJbnRlcmVzdGVkQ2F0YWxvZ3MoKS5jb250YWlucyhjYXRhbG9nLmdldElkKCkpKSB7CisJCQkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiUmVzdHJpY3RpbmcgcXVlcnkgdG8gdW5kZXJzdG9vZCB0ZXJtcyBmb3IgQ2F0YWxvZyAnIiArIGNhdGFsb2cgKyAiJyIpOworCQkJCQkJCVF1ZXJ5RXhwcmVzc2lvbiByZWR1Y2VkRXhwcmVzc2lvbiA9IHRoaXMucmVkdWNlVG9VbmRlcnN0b29kRXhwcmVzc2lvbnMoY2F0YWxvZywgcXVlcnlFeHByZXNzaW9uKTsKKwkJCQkJCQlMT0cubG9nKExldmVsLklORk8sICJRdWVyeWluZyBDYXRhbG9nICciICsgY2F0YWxvZyArICInIHdpdGggcXVlcnkgJyIgKyByZWR1Y2VkRXhwcmVzc2lvbiArICInIik7CisJCQkJCQkJY2F0YWxvZ1JlY2VpcHRzLmFkZEFsbChjYXRhbG9nLnF1ZXJ5KHJlZHVjZWRFeHByZXNzaW9uKSk7CisJCQkJCQl9CisJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCWlmICh0aGlzLm9uZUNhdGFsb2dGYWlsc0FsbEZhaWwpCisJCQkJCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcXVlcnkgY2F0YWxvZyAnIiArIGNhdGFsb2cuZ2V0SWQoKSArICInIGZvciBxdWVyeSAnIiArIHF1ZXJ5RXhwcmVzc2lvbiArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gcXVlcnkgY2F0YWxvZyAnIiArIGNhdGFsb2cuZ2V0SWQoKSArICInIGZvciBxdWVyeSAnIiArIHF1ZXJ5RXhwcmVzc2lvbiArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJfQkKKwkJCQl9CisJCQl9CisJCQlMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gdHJhbnNhY3Rpb25SZWNlaXB0cyA9IHRoaXMuZ2V0UG9zc2libHlVbmluZGV4ZWRUcmFuc2FjdGlvblJlY2VpcHRzKGNhdGFsb2dSZWNlaXB0cyk7CisJCQlMT0cubG9nKExldmVsLklORk8sICJTb3J0aW5nIFF1ZXJ5IFJlc3VsdHMgLiAuIC4gIik7CisJCQlDb2xsZWN0aW9ucy5zb3J0KHRyYW5zYWN0aW9uUmVjZWlwdHMsIG5ldyBDb21wYXJhdG9yPFRyYW5zYWN0aW9uUmVjZWlwdD4oKSB7CisJCQkJcHVibGljIGludCBjb21wYXJlKFRyYW5zYWN0aW9uUmVjZWlwdCBvMSwKKwkJCQkJCVRyYW5zYWN0aW9uUmVjZWlwdCBvMikgeworCQkJCQlyZXR1cm4gbzIuZ2V0VHJhbnNhY3Rpb25EYXRlKCkuY29tcGFyZVRvKG8xLmdldFRyYW5zYWN0aW9uRGF0ZSgpKTsKKwkJCQl9CisJCQl9KTsKKworCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiUXVlcnkgcmV0dXJuZWQgIiArIHRyYW5zYWN0aW9uUmVjZWlwdHMuc2l6ZSgpICsgIiByZXN1bHRzIik7CisJCQlyZXR1cm4gdHJhbnNhY3Rpb25SZWNlaXB0czsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBUcmFuc2FjdGlvbklkIHRvIE1ldGFkYXRhIG1hcCBmb3IgcXVlcnkgJyIgKyBxdWVyeUV4cHJlc3Npb24gKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIExpc3Q8VHJhbnNhY3Rpb25SZWNlaXB0PiBnZXRQb3NzaWJseVVuaW5kZXhlZFRyYW5zYWN0aW9uUmVjZWlwdHMoTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IHJldHVybkxpc3QgPSBuZXcgVmVjdG9yPFRyYW5zYWN0aW9uUmVjZWlwdD4oKTsKKwkJCUxpbmtlZEhhc2hNYXA8VHJhbnNhY3Rpb25JZDw/PiwgTGlzdDxDYXRhbG9nUmVjZWlwdD4+IGV4aXN0aW5nID0gbmV3IExpbmtlZEhhc2hNYXA8VHJhbnNhY3Rpb25JZDw/PiwgTGlzdDxDYXRhbG9nUmVjZWlwdD4+KCk7CisgCQkJZm9yIChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA6IGNhdGFsb2dSZWNlaXB0cykgeworIAkJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCA9IHRoaXMuZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKSwgY2F0YWxvZ1JlY2VpcHQuZ2V0Q2F0YWxvZ0lkKCkpOworIAkJCQlpZiAoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICE9IG51bGwpIHsKKyAJCQkJCUxpc3Q8Q2F0YWxvZ1JlY2VpcHQ+IGZvdW5kID0gZXhpc3RpbmcuZ2V0KGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCk7CisgCQkJCQlpZiAoZm91bmQgPT0gbnVsbCkgCisgCQkJCQkJZm91bmQgPSBuZXcgVmVjdG9yPENhdGFsb2dSZWNlaXB0PigpOworIAkJCQkJZm91bmQuYWRkKGNhdGFsb2dSZWNlaXB0KTsJCisgCQkJCQlleGlzdGluZy5wdXQoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBmb3VuZCk7CisgCQkJCX1lbHNlIHsKKyAJCQkJCXJldHVybkxpc3QuYWRkKG5ldyBUcmFuc2FjdGlvblJlY2VpcHQobnVsbCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjYXRhbG9nUmVjZWlwdCkpKTsKKyAJCQkJfQorIAkJCX0KKyAJCQlmb3IgKFRyYW5zYWN0aW9uSWQ8Pz4gdHJhbnNhY3Rpb25JZCA6IGV4aXN0aW5nLmtleVNldCgpKQorIAkJCQlyZXR1cm5MaXN0LmFkZChuZXcgVHJhbnNhY3Rpb25SZWNlaXB0KHRyYW5zYWN0aW9uSWQsIGV4aXN0aW5nLmdldCh0cmFuc2FjdGlvbklkKSkpOworIAkJCXJldHVybiByZXR1cm5MaXN0OworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gaW5kZXhSZWNlaXB0cyhMaXN0PFRyYW5zYWN0aW9uUmVjZWlwdD4gdHJhbnNhY3Rpb25SZWNlaXB0cykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IGluZGV4ZWRSZWNlaXB0cyA9IG5ldyBWZWN0b3I8VHJhbnNhY3Rpb25SZWNlaXB0PigpOworCQlmb3IgKFRyYW5zYWN0aW9uUmVjZWlwdCB0cmFuc2FjdGlvblJlY2VpcHQgOiB0cmFuc2FjdGlvblJlY2VpcHRzKSB7CisJCQl0cnkgeworLy8JCQkJZm9yIChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA6IHRyYW5zYWN0aW9uUmVjZWlwdC5nZXRDYXRhbG9nUmVjZWlwdHMoKSkgeworCQkJCQlpZiAodHJhbnNhY3Rpb25SZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKSA9PSBudWxsKQorCQkJCQkJdHJhbnNhY3Rpb25SZWNlaXB0ID0gbmV3IFRyYW5zYWN0aW9uUmVjZWlwdCh0aGlzLmdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCh0cmFuc2FjdGlvblJlY2VpcHQuZ2V0Q2F0YWxvZ1JlY2VpcHRzKCkuZ2V0KDApLCB0cnVlKSwgdHJhbnNhY3Rpb25SZWNlaXB0LmdldENhdGFsb2dSZWNlaXB0cygpKTsKKy8vCQkJCX0KKwkJCQlpbmRleGVkUmVjZWlwdHMuYWRkKHRyYW5zYWN0aW9uUmVjZWlwdCk7CisJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQkJfQorCQl9CisJCXJldHVybiBpbmRleGVkUmVjZWlwdHM7CisJfQorIAorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TmV4dFBhZ2UoUXVlcnlQYWdlciBxdWVyeVBhZ2VyKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEocXVlcnlQYWdlci5nZXRDdXJyZW50UGFnZSgpKTsKKwkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IG5leHQgcGFnZSBvZiBNZXRhZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisJCisJcHVibGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBnZXRBbGxQYWdlcyhRdWVyeVBhZ2VyIHF1ZXJ5UGFnZXIpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5nZXRNZXRhZGF0YShxdWVyeVBhZ2VyLmdldFRyYW5zYWN0aW9uUmVjZWlwdHMoKSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBhbGwgcGFnZSBvZiBNZXRhZGF0YSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0JCisJfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZFN0cmluZ3MoTGlzdDxTdHJpbmc+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZFN0cmluZ3MpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCUxpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyA9IG5ldyBWZWN0b3I8VHJhbnNhY3Rpb25JZDw/Pj4oKTsKKwkJZm9yIChTdHJpbmcgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5nIDogY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkU3RyaW5ncykgCisJCQljYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzLmFkZCh0aGlzLmdlbmVyYXRlVHJhbnNhY3Rpb25JZChjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRTdHJpbmcpKTsKKwkJcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyk7CisJfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGEoTGlzdDxUcmFuc2FjdGlvblJlY2VpcHQ+IHRyYW5zYWN0aW9uUmVjZWlwdHMpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCUxpbmtlZEhhc2hTZXQ8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YVNldCA9IG5ldyBMaW5rZWRIYXNoU2V0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4oKTsKKwkJZm9yIChUcmFuc2FjdGlvblJlY2VpcHQgdHJhbnNhY3Rpb25SZWNlaXB0IDogdHJhbnNhY3Rpb25SZWNlaXB0cykgeworCQkJTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKwkJCVZlY3RvcjxDYXRhbG9nUmVjZWlwdD4gc3VjY2Vzc2Z1bENhdGFsb2dSZWNlaXB0cyA9IG5ldyBWZWN0b3I8Q2F0YWxvZ1JlY2VpcHQ+KCk7CisJCQlmb3IgKENhdGFsb2dSZWNlaXB0IGNhdGFsb2dSZWNlaXB0IDogdHJhbnNhY3Rpb25SZWNlaXB0LmdldENhdGFsb2dSZWNlaXB0cygpKSB7CisJCQkJdHJ5IHsKKwkJCQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKGNhdGFsb2dSZWNlaXB0LmdldENhdGFsb2dJZCgpKTsKKwkJCQkJbWV0YWRhdGEuYWRkTWV0YWRhdGEoY2F0YWxvZy5nZXRNZXRhZGF0YShjYXRhbG9nUmVjZWlwdC5nZXRUcmFuc2FjdGlvbklkKCkpKTsKKwkJCQkJc3VjY2Vzc2Z1bENhdGFsb2dSZWNlaXB0cy5hZGQoY2F0YWxvZ1JlY2VpcHQpOworCQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKHRoaXMub25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCkKKwkJCQkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgdHJhbnNhY3Rpb24gaWRzIGZvciBjYXRhbG9nICciICsgY2F0YWxvZ1JlY2VpcHQuZ2V0Q2F0YWxvZ0lkKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQkJCWVsc2UKKwkJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkZhaWxlZCB0byBnZXQgbWV0YWRhdGEgZm9yIHRyYW5zYWN0aW9uIGlkcyBmb3IgY2F0YWxvZyAnIiArIGNhdGFsb2dSZWNlaXB0LmdldENhdGFsb2dJZCgpICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtZXRhZGF0YS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKS5zaXplKCkgPiAwKQorCQkJCW1ldGFkYXRhU2V0LmFkZChuZXcgVHJhbnNhY3Rpb25hbE1ldGFkYXRhKG5ldyBUcmFuc2FjdGlvblJlY2VpcHQodHJhbnNhY3Rpb25SZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKSwgc3VjY2Vzc2Z1bENhdGFsb2dSZWNlaXB0cyksIG1ldGFkYXRhKSk7CisJCX0KKwkJcmV0dXJuIG5ldyBWZWN0b3I8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPihtZXRhZGF0YVNldCk7CisJfQorCQorCXB1YmxpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZ2V0TWV0YWRhdGFGcm9tVHJhbnNhY3Rpb25JZHMoTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24geworCQlMaW5rZWRIYXNoU2V0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gbWV0YWRhdGFTZXQgPSBuZXcgTGlua2VkSGFzaFNldDxUcmFuc2FjdGlvbmFsTWV0YWRhdGE+KCk7CisJCWZvciAoVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgOiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKSB7CisJCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCQkJVmVjdG9yPENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHMgPSBuZXcgVmVjdG9yPENhdGFsb2dSZWNlaXB0PigpOworCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiB0aGlzLmdldEN1cnJlbnRDYXRhbG9nTGlzdCgpKSB7CisJCQkJdHJ5IHsKKwkJCQkJQ2F0YWxvZ1JlY2VpcHQgY2F0YWxvZ1JlY2VpcHQgPSB0aGlzLmluZ2VzdE1hcHBlci5nZXRDYXRhbG9nUmVjZWlwdChjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQsIGNhdGFsb2cuZ2V0SWQoKSk7CisJCQkJCWlmIChjYXRhbG9nUmVjZWlwdCAhPSBudWxsKSB7CisJCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YShjYXRhbG9nLmdldE1ldGFkYXRhKGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKSkuZ2V0SGFzaHRhYmxlKCkpOworCQkJCQkJY2F0YWxvZ1JlY2VpcHRzLmFkZChjYXRhbG9nUmVjZWlwdCk7CisJCQkJCX0KKwkJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCWlmICh0aGlzLm9uZUNhdGFsb2dGYWlsc0FsbEZhaWwpCisJCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbWV0YWRhdGEgZm9yIHRyYW5zYWN0aW9uIGlkcyBmb3IgY2F0YWxvZyAnIiArIGNhdGFsb2cuZ2V0SWQoKSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJZWxzZQorCQkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgdHJhbnNhY3Rpb24gaWRzIGZvciBjYXRhbG9nICciICsgY2F0YWxvZy5nZXRJZCgpICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtZXRhZGF0YS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKS5zaXplKCkgPiAwKQorCQkJCW1ldGFkYXRhU2V0LmFkZChuZXcgVHJhbnNhY3Rpb25hbE1ldGFkYXRhKG5ldyBUcmFuc2FjdGlvblJlY2VpcHQoY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkLCBjYXRhbG9nUmVjZWlwdHMpLCBtZXRhZGF0YSkpOworCQl9CisJCXJldHVybiBuZXcgVmVjdG9yPFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4obWV0YWRhdGFTZXQpOworCX0KKwkKKwlwdWJsaWMgTGlzdDxUcmFuc2FjdGlvbklkPD8+PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzKExpc3Q8VHJhbnNhY3Rpb25JZDw/Pj4gY2F0YWxvZ1RyYW5zYWN0aW9uSWRzLCBTdHJpbmcgY2F0YWxvZ1VybikgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJTGlua2VkSGFzaFNldDxUcmFuc2FjdGlvbklkPD8+PiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWRzID0gbmV3IExpbmtlZEhhc2hTZXQ8VHJhbnNhY3Rpb25JZDw/Pj4oKTsKKwkJZm9yIChUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkIDogY2F0YWxvZ1RyYW5zYWN0aW9uSWRzKSB7CisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCA9IHRoaXMuZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKGNhdGFsb2dUcmFuc2FjdGlvbklkLCBjYXRhbG9nVXJuKTsKKwkJCWNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZHMuYWRkKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCk7CisJCX0KKwkJcmV0dXJuIG5ldyBWZWN0b3I8VHJhbnNhY3Rpb25JZDw/Pj4oY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkcyk7IAorCX0KKwkKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoVHJhbnNhY3Rpb25JZDw/PiBjYXRhbG9nVHJhbnNhY3Rpb25JZCwgU3RyaW5nIGNhdGFsb2dVcm4pIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRoaXMuaW5nZXN0TWFwcGVyTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmluZ2VzdE1hcHBlci5nZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoY2F0YWxvZ1RyYW5zYWN0aW9uSWQsIGNhdGFsb2dVcm4pOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0aGlzLmluZ2VzdE1hcHBlckxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgVHJhbnNhY3Rpb25JZDw/PiBnZXRDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQoQ2F0YWxvZ1JlY2VpcHQgY2F0YWxvZ1JlY2VpcHQsIGJvb2xlYW4gZ2VuZXJhdGVOZXcpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCA9IHRoaXMuZ2V0Q2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkKGNhdGFsb2dSZWNlaXB0LmdldFRyYW5zYWN0aW9uSWQoKSwgY2F0YWxvZ1JlY2VpcHQuZ2V0Q2F0YWxvZ0lkKCkpOworCQkJaWYgKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCA9PSBudWxsICYmIGdlbmVyYXRlTmV3KSB7CisJCQkJY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkID0gdGhpcy5nZW5lcmF0ZU5ld1VuaXF1ZVRyYW5zYWN0aW9uSWQoKTsKKwkJCQlMT0cubG9nKExldmVsLklORk8sICJDYXRhbG9nU2VydmVyIG1hcHBpbmcgdHJhbnNhY3Rpb246ICIgKyBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgKyAiLCIgKyBjYXRhbG9nUmVjZWlwdC5nZXRUcmFuc2FjdGlvbklkKCkgKyAiLCIgKyBjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSk7CisJCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKwkJCQl0cnkgeworCQkJCQl0aGlzLmluZ2VzdE1hcHBlci5zdG9yZVRyYW5zYWN0aW9uSWRNYXBwaW5nKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCwgdGhpcy50cmFuc2FjdGlvbklkRmFjdG9yeSwgY2F0YWxvZ1JlY2VpcHQsIHRoaXMuZ2V0Q2F0YWxvZyhjYXRhbG9nUmVjZWlwdC5nZXRDYXRhbG9nSWQoKSkuZ2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoKSk7CisJCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkZhaWxlZCB0byB3cml0ZSBUcmFuc2FjdGlvbklkICciICsgY2F0YWxvZ1NlcnZpY2VUcmFuc2FjdGlvbklkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCX1maW5hbGx5IHsKKwkJCQkJdGhpcy5pbmdlc3RNYXBwZXJMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQ7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBDYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIFRyYW5zYWN0aW9uSWQ8Pz4gZ2VuZXJhdGVOZXdVbmlxdWVUcmFuc2FjdGlvbklkKCkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25JZEZhY3RvcnkuY3JlYXRlTmV3VHJhbnNhY3Rpb25JZCgpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBnZW5lcmF0ZSBhIG5ldyBUcmFuc2FjdGlvbklkIGZyb20gZmFjdG9yeSAnIiArIHRoaXMudHJhbnNhY3Rpb25JZEZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25JZDw/PiBnZW5lcmF0ZVRyYW5zYWN0aW9uSWQoU3RyaW5nIHN0cmluZ1RyYW5zYWN0aW9uSWQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWRGYWN0b3J5LmNyZWF0ZVRyYW5zYWN0aW9uSWQoc3RyaW5nVHJhbnNhY3Rpb25JZCk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGdlbmVyYXRlIGEgbmV3IFRyYW5zYWN0aW9uSWQgZnJvbSBmYWN0b3J5ICciICsgdGhpcy50cmFuc2FjdGlvbklkRmFjdG9yeS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICInIGZvciBzdHJpbmcgdmFsdWUgJyIgKyBzdHJpbmdUcmFuc2FjdGlvbklkICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8vIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGlkIHdhcyBzcGVjaWZpZWQgYnkgdXNlciwgb3RoZXJ3aXNlIGdlbmVyYXRlIGEgbmV3IG9uZQorCXByb3RlY3RlZCBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChtZXRhZGF0YSwgdHJ1ZSk7CisJfQorCQorCXByb3RlY3RlZCBUcmFuc2FjdGlvbklkPD8+IGdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiBnZW5lcmF0ZU5ldykgdGhyb3dzIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWlmIChtZXRhZGF0YS5nZXRNZXRhZGF0YShDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfU0VSVklDRV9UUkFOU0FDVElPTl9JRF9NRVRfS0VZKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVUcmFuc2FjdGlvbklkKG1ldGFkYXRhLmdldE1ldGFkYXRhKENhdGFsb2dTZXJ2aWNlTG9jYWwuQ0FUQUxPR19TRVJWSUNFX1RSQU5TQUNUSU9OX0lEX01FVF9LRVkpKTsKKwkJCX1lbHNlIGlmIChtZXRhZGF0YS5nZXRNZXRhZGF0YShDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfVFJBTlNBQ1RJT05fSURfTUVUX0tFWSkgIT0gbnVsbCAmJiBtZXRhZGF0YS5nZXRNZXRhZGF0YShDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfSURfTUVUX0tFWSkgIT0gbnVsbCkgeworCQkJCVN0cmluZyBjYXRhbG9nSWQgPSBtZXRhZGF0YS5nZXRNZXRhZGF0YShDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfSURfTUVUX0tFWSk7CisJCQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKGNhdGFsb2dJZCk7CisJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgeworCQkJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dUcmFuc2FjdGlvbklkID0gY2F0YWxvZy5nZXRUcmFuc2FjdGlvbklkRnJvbVN0cmluZyhtZXRhZGF0YS5nZXRNZXRhZGF0YShDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfVFJBTlNBQ1RJT05fSURfTUVUX0tFWSkpOworCQkJCQlUcmFuc2FjdGlvbklkPD8+IGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCA9IHRoaXMuaW5nZXN0TWFwcGVyLmdldENhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZChjYXRhbG9nVHJhbnNhY3Rpb25JZCwgY2F0YWxvZ0lkKTsKKwkJCQkJaWYgKGNhdGFsb2dTZXJ2aWNlVHJhbnNhY3Rpb25JZCA9PSBudWxsKQorCQkJCQkJdGhyb3cgbmV3IENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uKCJDYXRhbG9nU2VydmljZSdzIENhdGFsb2cgJyIgKyBjYXRhbG9nLmdldElkKCkgKyAiJyBpcyBub3QgYXdhcmUgb2YgVHJhbnNhY3Rpb25JZCAnIiArIGNhdGFsb2dUcmFuc2FjdGlvbklkICsgIidzIik7CisJCQkJCXJldHVybiBjYXRhbG9nU2VydmljZVRyYW5zYWN0aW9uSWQ7CisJCQkJfWVsc2UgeworCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIlRoaXMgQ2F0YWxvZ1NlcnZpY2UgaGFzIG5vIENhdGFsb2cgd2l0aCBJRCA9ICciICsgY2F0YWxvZ0lkICsgIiciKTsKKwkJCQl9CisJCQl9ZWxzZSBpZiAoZ2VuZXJhdGVOZXcpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZU5ld1VuaXF1ZVRyYW5zYWN0aW9uSWQoKTsKKwkJCX1lbHNlIHsKKwkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIk1ldGFkYXRhIGZpZWxkcyBub3QgcHJlc2VudCB0byBkZXRlcm1pbmUgYSBUcmFuc2FjdGlvbklkIik7CisJCQl9CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIGRldGVybWluZSBUcmFuc2FjdGlvbklkIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgU2V0PENhdGFsb2c+IGdldEZpbHRlcmVkQ2F0YWxvZ0xpc3QoTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpZiAobWV0YWRhdGEuY29udGFpbnNLZXkoQ0FUQUxPR19JRF9NRVRfS0VZKSkgeworCQkJCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZyhtZXRhZGF0YS5nZXRNZXRhZGF0YShDQVRBTE9HX0lEX01FVF9LRVkpKTsKKwkJCQlpZiAoY2F0YWxvZyA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24oIkNhdGFsb2cgJyIgKyBtZXRhZGF0YS5nZXRNZXRhZGF0YShDQVRBTE9HX0lEX01FVF9LRVkpICsgIicgaXMgbm90IG1hbmFnZWQgYnkgdGhpcyBDYXRhbG9nU2VydmljZSIpOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihjYXRhbG9nKTsKKwkJCX1lbHNlIGlmIChtZXRhZGF0YS5jb250YWluc0tleShDQVRBTE9HX0lEU19NRVRfS0VZKSkgeworCQkJCUhhc2hTZXQ8Q2F0YWxvZz4gZmlsdGVyZWRDYXRhbG9nTGlzdCA9IG5ldyBIYXNoU2V0PENhdGFsb2c+KCk7CisJCQkJZm9yIChPYmplY3QgY2F0YWxvZ1VybiA6IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKENBVEFMT0dfSURTX01FVF9LRVkpKSB7CisJCQkJCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygoU3RyaW5nKSBjYXRhbG9nVXJuKTsKKwkJCQkJaWYgKGNhdGFsb2cgPT0gbnVsbCkKKwkJCQkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiQ2F0YWxvZyAnIiArIG1ldGFkYXRhLmdldE1ldGFkYXRhKENBVEFMT0dfSURfTUVUX0tFWSkgKyAiJyBpcyBub3QgbWFuYWdlZCBieSB0aGlzIENhdGFsb2dTZXJ2aWNlIik7CisJCQkJCWVsc2UKKwkJCQkJCWZpbHRlcmVkQ2F0YWxvZ0xpc3QuYWRkKGNhdGFsb2cpOworCQkJCX0KKwkJCQlyZXR1cm4gZmlsdGVyZWRDYXRhbG9nTGlzdDsKKwkJCX1lbHNlIHsKKwkJCQlyZXR1cm4gbmV3IEhhc2hTZXQ8Q2F0YWxvZz4odGhpcy5jYXRhbG9ncyk7CisJCQl9CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBmaWx0ZXJlZCBjYXRhbG9nIGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBRdWVyeVJlc3VsdCBxdWVyeVJlY3VyKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24sIFNldDxTdHJpbmc+IHJlc3RyaWN0VG9DYXRhbG9nSWRzKSB0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24sIENhdGFsb2dFeGNlcHRpb24geworCQkvLyBnZXQgUXVlcnlSZXN1bHRzIGZvciBzdWIgcXVlcmllcworCQlpZiAocXVlcnlFeHByZXNzaW9uIGluc3RhbmNlb2YgUXVlcnlMb2dpY2FsR3JvdXApIHsKKwkJCQorCQkJLy8gZ2V0IGNoaWxkcmVuIHF1ZXJ5IHJlc3VsdHMKKwkJCUxpc3Q8UXVlcnlSZXN1bHQ+IGNoaWxkcmVuUXVlcnlSZXN1bHRzID0gbmV3IFZlY3RvcjxRdWVyeVJlc3VsdD4oKTsKKwkJCWZvciAoUXVlcnlFeHByZXNzaW9uIHN1YlF1ZXJ5RXhwcmVzc2lvbiA6ICgoUXVlcnlMb2dpY2FsR3JvdXApIHF1ZXJ5RXhwcmVzc2lvbikuZ2V0RXhwcmVzc2lvbnMoKSkgCisJCQkJY2hpbGRyZW5RdWVyeVJlc3VsdHMuYWRkKHF1ZXJ5UmVjdXIoc3ViUXVlcnlFeHByZXNzaW9uLCByZXN0cmljdFRvQ2F0YWxvZ0lkcykpOworCQkJCisJCQkvLyBpZiAoUXVlcnlMb2dpY2FsR3JvdXAncyBvcGVyYXRvciBpcyBBTkQgYW5kIGlzIHVuYmFsYW5jZWQgb3IgYSBjaGlsZCBjb250YWlucyBxdWVyeSByZXN1bHRzKQorCQkJaWYgKCgoKFF1ZXJ5TG9naWNhbEdyb3VwKSBxdWVyeUV4cHJlc3Npb24pLmdldE9wZXJhdG9yKCkuZXF1YWxzKFF1ZXJ5TG9naWNhbEdyb3VwLk9wZXJhdG9yLkFORCkgJiYgY29udGFpbnNVbmJhbGFuY2VkQ2F0YWxvZ0ludGVyZXN0KGNoaWxkcmVuUXVlcnlSZXN1bHRzKSkgfHwgY29udGFpbnNUcmFuYWN0aW9uUmVjZWlwdHMoY2hpbGRyZW5RdWVyeVJlc3VsdHMpKSB7CisJCQkJCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblF1ZXJ5UmVzdWx0cy5zaXplKCk7IGkrKykgeworCQkJCQlRdWVyeVJlc3VsdCBjaGlsZFF1ZXJ5UmVzdWx0ID0gY2hpbGRyZW5RdWVyeVJlc3VsdHMuZ2V0KGkpOworCQkJCQkKKwkJCQkJLy8gaWYgY2hpbGRRdWVyeVJlc3VsdCBoYXMgbm90IGJlZW4gdXNlZCwgdXNlIGl0CisJCQkJCWlmIChjaGlsZFF1ZXJ5UmVzdWx0LmdldENhdGFsb2dSZWNlaXB0cygpID09IG51bGwpIHsgCisJCQkJCQlMaXN0PENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHMgPSBuZXcgVmVjdG9yPENhdGFsb2dSZWNlaXB0PigpOworCQkJCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiB0aGlzLmdldEN1cnJlbnRDYXRhbG9nTGlzdCgpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJaWYgKGNoaWxkUXVlcnlSZXN1bHQuZ2V0SW50ZXJlc3RlZENhdGFsb2dzKCkuY29udGFpbnMoY2F0YWxvZy5nZXRJZCgpKSkgCisJCQkJCQkJCQljYXRhbG9nUmVjZWlwdHMuYWRkQWxsKGNhdGFsb2cucXVlcnkodGhpcy5yZWR1Y2VUb1VuZGVyc3Rvb2RFeHByZXNzaW9ucyhjYXRhbG9nLCBjaGlsZFF1ZXJ5UmVzdWx0LmdldFF1ZXJ5RXhwcmVzc2lvbigpKSkpOworCQkJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJaWYgKHRoaXMub25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCkKKwkJCQkJCQkJCXRocm93IG5ldyBDYXRhbG9nU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHF1ZXJ5IGNhdGFsb2cgJyIgKyBjYXRhbG9nLmdldElkKCkgKyAiJyBmb3IgcXVlcnkgJyIgKyBxdWVyeUV4cHJlc3Npb24gKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkZhaWxlZCB0byBxdWVyeSBjYXRhbG9nICciICsgY2F0YWxvZy5nZXRJZCgpICsgIicgZm9yIHF1ZXJ5ICciICsgcXVlcnlFeHByZXNzaW9uICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWNoaWxkUXVlcnlSZXN1bHQuc2V0Q2F0YWxvZ1JlY2VpcHRzKGNhdGFsb2dSZWNlaXB0cyk7CisJCQkJCX0KKwkJCQkJCisJCQkJfQorCQkJCQorCQkJCS8vIGdldCBpbnRlcnNlY3Rpb24gb2YgcmVzdWx0cworCSAgIAkJCVF1ZXJ5UmVzdWx0IHF1ZXJ5UmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KHF1ZXJ5RXhwcmVzc2lvbik7CisJICAgCQkJcXVlcnlSZXN1bHQuc2V0Q2F0YWxvZ1JlY2VpcHRzKHRoaXMuZ2V0SW50ZXJzZWN0aW9uKGNoaWxkcmVuUXVlcnlSZXN1bHRzKSk7CisJCQkJcmV0dXJuIHF1ZXJ5UmVzdWx0OworCQkJfWVsc2UgeworCQkJCS8vIGdldCBtZXJnZSBvZiByZXN1bHRzCisJCQkJUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQgPSBuZXcgUXVlcnlSZXN1bHQocXVlcnlFeHByZXNzaW9uKTsKKwkJCQlIYXNoU2V0PFN0cmluZz4gaW50ZXJlc3RlZENhdGFsb2dzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkJCWZvciAoUXVlcnlSZXN1bHQgY2hpbGRRdWVyeVJlc3VsdCA6IGNoaWxkcmVuUXVlcnlSZXN1bHRzKQorCQkJCQlpbnRlcmVzdGVkQ2F0YWxvZ3MuYWRkQWxsKGNoaWxkUXVlcnlSZXN1bHQuZ2V0SW50ZXJlc3RlZENhdGFsb2dzKCkpOworCQkJCXF1ZXJ5UmVzdWx0LnNldEludGVyZXN0ZWRDYXRhbG9ncyhpbnRlcmVzdGVkQ2F0YWxvZ3MpOworCQkJCXJldHVybiBxdWVyeVJlc3VsdDsKKwkJCX0KKwkJfWVsc2UgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFdyYXBwZXJRdWVyeUV4cHJlc3Npb24pIHsKKworCQkJLy8gY2hlY2sgZm9yIGNhdGFsb2dzIGludGVyZXN0ZWQgaW4gd3JhcHBlciBxdWVyeSBleHByZXNzaW9uCisJCQlyZXN0cmljdFRvQ2F0YWxvZ0lkcy5yZXRhaW5BbGwoZ2V0SW50ZXJlc3RlZENhdGFsb2dzKHF1ZXJ5RXhwcmVzc2lvbiwgcmVzdHJpY3RUb0NhdGFsb2dJZHMpKTsKKwkJCQorCQkJLy8gY2hlY2sgZm9yIGNhdGFsb2dzIGludGVyZXN0ZWQgaW4gd3JhcHBlZCBxdWVyeSBleHByZXNzaW9uCisJCQlRdWVyeVJlc3VsdCB3cmFwcGVyRXhwclF1ZXJ5UmVzdWx0ID0gbnVsbDsKKwkJCVF1ZXJ5RXhwcmVzc2lvbiB3cmFwcGVyUUUgPSAoKFdyYXBwZXJRdWVyeUV4cHJlc3Npb24pIHF1ZXJ5RXhwcmVzc2lvbikuZ2V0UXVlcnlFeHByZXNzaW9uKCk7CisJCQlpZiAod3JhcHBlclFFIGluc3RhbmNlb2YgUXVlcnlMb2dpY2FsR3JvdXApIHsKKwkJCQl3cmFwcGVyRXhwclF1ZXJ5UmVzdWx0ID0gdGhpcy5xdWVyeVJlY3VyKChRdWVyeUxvZ2ljYWxHcm91cCkgd3JhcHBlclFFLCByZXN0cmljdFRvQ2F0YWxvZ0lkcyk7CisJCQl9ZWxzZSB7CisJCQkJd3JhcHBlckV4cHJRdWVyeVJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCh3cmFwcGVyUUUpOworCQkJCXdyYXBwZXJFeHByUXVlcnlSZXN1bHQuaW50ZXJlc3RlZENhdGFsb2dzID0gZ2V0SW50ZXJlc3RlZENhdGFsb2dzKHdyYXBwZXJRRSwgcmVzdHJpY3RUb0NhdGFsb2dJZHMpOworCQkJCXdyYXBwZXJFeHByUXVlcnlSZXN1bHQuaW50ZXJlc3RlZENhdGFsb2dzLnJldGFpbkFsbChyZXN0cmljdFRvQ2F0YWxvZ0lkcyk7CisJCQl9CQkJCQorCQkJcmV0dXJuIHdyYXBwZXJFeHByUXVlcnlSZXN1bHQ7CisJCX1lbHNlIHsKKwkJCS8vIGRldGVybWluZSBjYXRhbG9ncyBpbnRlcmVzdGVkIGluIHRoaXMgcXVlcnkgZXhwcmVzc2lvbgorCQkJUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQgPSBuZXcgUXVlcnlSZXN1bHQocXVlcnlFeHByZXNzaW9uKTsKKwkJCVNldDxTdHJpbmc+IGludGVyZXN0ZWRDYXRhbG9ncyA9IGdldEludGVyZXN0ZWRDYXRhbG9ncyhxdWVyeUV4cHJlc3Npb24sIHJlc3RyaWN0VG9DYXRhbG9nSWRzKTsKKwkJCWludGVyZXN0ZWRDYXRhbG9ncy5yZXRhaW5BbGwocmVzdHJpY3RUb0NhdGFsb2dJZHMpOworCQkJcXVlcnlSZXN1bHQuc2V0SW50ZXJlc3RlZENhdGFsb2dzKGludGVyZXN0ZWRDYXRhbG9ncyk7CisJCQlyZXR1cm4gcXVlcnlSZXN1bHQ7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIExpc3Q8Q2F0YWxvZ1JlY2VpcHQ+IGdldEludGVyc2VjdGlvbihMaXN0PFF1ZXJ5UmVzdWx0PiBxdWVyeVJlc3VsdHMpIHsKKwkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzID0gbmV3IFZlY3RvcjxDYXRhbG9nUmVjZWlwdD4oKTsKKwkJaWYgKHF1ZXJ5UmVzdWx0cy5zaXplKCkgPiAwKSB7CisJCQljYXRhbG9nUmVjZWlwdHMuYWRkQWxsKHF1ZXJ5UmVzdWx0cy5nZXQoMCkuZ2V0Q2F0YWxvZ1JlY2VpcHRzKCkpOworCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBxdWVyeVJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKKwkJCQlRdWVyeVJlc3VsdCBxciA9IHF1ZXJ5UmVzdWx0cy5nZXQoaSk7CitUUjoJCQkJZm9yIChDYXRhbG9nUmVjZWlwdCBjYXRhbG9nUmVjZWlwdCA6IHFyLmdldENhdGFsb2dSZWNlaXB0cygpKSB7CisJCQkJCWZvciAoQ2F0YWxvZ1JlY2VpcHQgY29tcENhdGFsb2dSZWNlaXB0IDogY2F0YWxvZ1JlY2VpcHRzKSB7CisJCQkJCQlpZiAoY2F0YWxvZ1JlY2VpcHQuZ2V0VHJhbnNhY3Rpb25JZCgpLmVxdWFscyhjb21wQ2F0YWxvZ1JlY2VpcHQuZ2V0VHJhbnNhY3Rpb25JZCgpKSkKKwkJCQkJCQljb250aW51ZSBUUjsKKwkJCQkJfQorCQkJCQljYXRhbG9nUmVjZWlwdHMucmVtb3ZlKGNhdGFsb2dSZWNlaXB0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGNhdGFsb2dSZWNlaXB0czsKKwl9CisKKwlwcm90ZWN0ZWQgUXVlcnlFeHByZXNzaW9uIHJlZHVjZVRvVW5kZXJzdG9vZEV4cHJlc3Npb25zKENhdGFsb2cgY2F0YWxvZywgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgdGhyb3dzIENhdGFsb2dEaWN0aW9uYXJ5RXhjZXB0aW9uLCBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1ZXJ5TG9naWNhbEdyb3VwKSB7CisgICAgICAgIAlRdWVyeUxvZ2ljYWxHcm91cCBxdWVyeUxvZ2ljYWxHcm91cCA9IChRdWVyeUxvZ2ljYWxHcm91cCkgcXVlcnlFeHByZXNzaW9uOworICAgICAgICAJTGlzdDxRdWVyeUV4cHJlc3Npb24+IHJlc3RyaWN0ZWRFeHByZXNzaW9ucyA9IG5ldyBWZWN0b3I8UXVlcnlFeHByZXNzaW9uPigpOworICAgICAgICAJZm9yIChRdWVyeUV4cHJlc3Npb24gcWUgOiBxdWVyeUxvZ2ljYWxHcm91cC5nZXRFeHByZXNzaW9ucygpKSB7CisgICAgICAgIAkJUXVlcnlFeHByZXNzaW9uIHJlc3RyaWN0ZWRRRSA9IHRoaXMucmVkdWNlVG9VbmRlcnN0b29kRXhwcmVzc2lvbnMoY2F0YWxvZywgcWUpOworICAgICAgICAJCWlmIChyZXN0cmljdGVkUUUgPT0gbnVsbCAmJiBxdWVyeUxvZ2ljYWxHcm91cC5nZXRPcGVyYXRvcigpLmVxdWFscyhRdWVyeUxvZ2ljYWxHcm91cC5PcGVyYXRvci5BTkQpICYmIHRoaXMuZGlzYWJsZUludGVyc2VjdGluZ0Nyb3NzQ2F0YWxvZ1F1ZXJpZXMpIHsKKyAgICAgICAgCQkJcmVzdHJpY3RlZEV4cHJlc3Npb25zLmNsZWFyKCk7CisgICAgICAgIAkJCWJyZWFrOworICAgICAgICAJCX0KKyAgICAgICAgCQlpZiAocmVzdHJpY3RlZFFFICE9IG51bGwpCisgICAgICAgIAkJCXJlc3RyaWN0ZWRFeHByZXNzaW9ucy5hZGQocmVzdHJpY3RlZFFFKTsKKyAgICAgICAgCX0KKyAgICAgICAgCWlmIChyZXN0cmljdGVkRXhwcmVzc2lvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAJCWlmIChyZXN0cmljdGVkRXhwcmVzc2lvbnMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgCQkJcmV0dXJuIHJlc3RyaWN0ZWRFeHByZXNzaW9ucy5nZXQoMCk7CisgICAgICAgIAkJfWVsc2UgeworCQkgICAgICAgIAlRdWVyeUxvZ2ljYWxHcm91cCByZXN0cmljdGVkUXVlcnlMb2dpY2FsR3JvdXAgPSBxdWVyeUxvZ2ljYWxHcm91cC5jbG9uZSgpOworCQkgICAgICAgIAlyZXN0cmljdGVkUXVlcnlMb2dpY2FsR3JvdXAuc2V0RXhwcmVzc2lvbnMocmVzdHJpY3RlZEV4cHJlc3Npb25zKTsKKwkJICAgICAgICAJcmV0dXJuIHJlc3RyaWN0ZWRRdWVyeUxvZ2ljYWxHcm91cDsKKyAgICAgICAgCQl9CisgICAgICAgIAl9ZWxzZSB7CisgICAgICAgIAkJcmV0dXJuIG51bGw7CisgICAgICAgIAl9CisJCX1lbHNlIGlmIChxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBXcmFwcGVyUXVlcnlFeHByZXNzaW9uKSB7CisJCQlXcmFwcGVyUXVlcnlFeHByZXNzaW9uIHdyYXBwZXJRdWVyeUV4cHJlc3NzaW9uID0gKFdyYXBwZXJRdWVyeUV4cHJlc3Npb24pIHF1ZXJ5RXhwcmVzc2lvbjsKKyAgICAgICAgCWlmIChjYXRhbG9nLmlzSW50ZXJlc3RlZChxdWVyeUV4cHJlc3Npb24pKSB7CisJICAgICAgICAJUXVlcnlFeHByZXNzaW9uIHFlID0gdGhpcy5yZWR1Y2VUb1VuZGVyc3Rvb2RFeHByZXNzaW9ucyhjYXRhbG9nLCB3cmFwcGVyUXVlcnlFeHByZXNzc2lvbi5nZXRRdWVyeUV4cHJlc3Npb24oKSk7CisJCQkJaWYgKHFlICE9IG51bGwpIHsKKwkJCQkJV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbiB3cWUgPSB3cmFwcGVyUXVlcnlFeHByZXNzc2lvbi5jbG9uZSgpOworCQkJCQl3cWUuc2V0UXVlcnlFeHByZXNzaW9uKHFlKTsKKwkJCQkJcmV0dXJuIHdxZTsKKwkJCQl9ZWxzZSBpZiAod3JhcHBlclF1ZXJ5RXhwcmVzc3Npb24uaXNWYWxpZFdpdGhOb1N1YkV4cHJlc3Npb24oKSl7CisJCQkJCVdyYXBwZXJRdWVyeUV4cHJlc3Npb24gd3FlID0gd3JhcHBlclF1ZXJ5RXhwcmVzc3Npb24uY2xvbmUoKTsKKwkJCQkJd3FlLnNldFF1ZXJ5RXhwcmVzc2lvbihudWxsKTsKKwkJCQkJcmV0dXJuIHdxZTsKKwkJCQl9ZWxzZSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKyAgICAgICAgCX1lbHNlIHsKKyAgICAgICAgCQlyZXR1cm4gbnVsbDsKKyAgICAgICAgCX0KKyAgICAgICAgCQorICAgICAgICB9ZWxzZSBpZiAoY2F0YWxvZy5pc0ludGVyZXN0ZWQocXVlcnlFeHByZXNzaW9uKSkgeworICAgICAgICAJcmV0dXJuIHF1ZXJ5RXhwcmVzc2lvbjsKKyAgICAJfWVsc2UgeworICAgIAkJcmV0dXJuIG51bGw7CisgICAgCX0KKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNUcmFuYWN0aW9uUmVjZWlwdHMoTGlzdDxRdWVyeVJlc3VsdD4gcXVlcnlSZXN1bHRzKSB7CisJCWZvciAoUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQgOiBxdWVyeVJlc3VsdHMpCisJCQlpZiAocXVlcnlSZXN1bHQuZ2V0Q2F0YWxvZ1JlY2VpcHRzKCkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zVW5iYWxhbmNlZENhdGFsb2dJbnRlcmVzdChMaXN0PFF1ZXJ5UmVzdWx0PiBxdWVyeVJlc3VsdHMpIHsKKwkJaWYgKHF1ZXJ5UmVzdWx0cy5zaXplKCkgPiAwKSB7CisJCQlRdWVyeVJlc3VsdCBmaXJzdFF1ZXJ5UmVzdWx0ID0gcXVlcnlSZXN1bHRzLmdldCgwKTsKKwkJCWZvciAoaW50IGkgPSAxOyBpIDwgcXVlcnlSZXN1bHRzLnNpemUoKTsgaSsrKSB7CisJCQkJUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQgPSBxdWVyeVJlc3VsdHMuZ2V0KGkpOworCQkJCWlmICghKHF1ZXJ5UmVzdWx0LmludGVyZXN0ZWRDYXRhbG9ncy5jb250YWluc0FsbChmaXJzdFF1ZXJ5UmVzdWx0LmludGVyZXN0ZWRDYXRhbG9ncykgJiYgZmlyc3RRdWVyeVJlc3VsdC5pbnRlcmVzdGVkQ2F0YWxvZ3MuY29udGFpbnNBbGwocXVlcnlSZXN1bHQuaW50ZXJlc3RlZENhdGFsb2dzKSkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9ZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSGFzaFNldDxTdHJpbmc+IGdldEludGVyZXN0ZWRDYXRhbG9ncyhRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uLCBTZXQ8U3RyaW5nPiByZXN0cmljdFRvQ2F0YWxvZ0lkcykgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24sIENhdGFsb2dTZXJ2aWNlRXhjZXB0aW9uIHsKKwkJSGFzaFNldDxTdHJpbmc+IGludGVyZXN0ZWRDYXRhbG9ncyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiB0aGlzLmdldEN1cnJlbnRDYXRhbG9nTGlzdCgpKSB7CisJCQl0cnkgeworCQkJCWlmIChyZXN0cmljdFRvQ2F0YWxvZ0lkcy5jb250YWlucyhjYXRhbG9nLmdldElkKCkpKSB7CisJCQkJCWlmIChjYXRhbG9nLmlzSW50ZXJlc3RlZChxdWVyeUV4cHJlc3Npb24pKQorCQkJCQkJaW50ZXJlc3RlZENhdGFsb2dzLmFkZChjYXRhbG9nLmdldElkKCkpOworCQkJCX0KKwkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAodGhpcy5vbmVDYXRhbG9nRmFpbHNBbGxGYWlsKQorCQkJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigiRmFpbGVkIHRvIGRldGVybWluZSBpZiBDYXRhbG9nICciICsgY2F0YWxvZy5nZXRJZCgpICsgIicgaXMgaW50ZXJlc3RlZCBpbiBxdWVyeSBleHByZXNzaW9uICciICsgcXVlcnlFeHByZXNzaW9uICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCWVsc2UKKwkJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGRldGVybWluZSBpZiBDYXRhbG9nICciICsgY2F0YWxvZy5nZXRJZCgpICsgIicgaXMgaW50ZXJlc3RlZCBpbiBxdWVyeSBleHByZXNzaW9uICciICsgcXVlcnlFeHByZXNzaW9uICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJfQorCQl9CisJCXJldHVybiBpbnRlcmVzdGVkQ2F0YWxvZ3M7CisJfQorCisJcHJvdGVjdGVkIGNsYXNzIFF1ZXJ5UmVzdWx0IHsKKwkJCisJCXByaXZhdGUgUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbjsKKwkJcHJpdmF0ZSBMaXN0PENhdGFsb2dSZWNlaXB0PiBjYXRhbG9nUmVjZWlwdHM7CisJCXByaXZhdGUgU2V0PFN0cmluZz4gaW50ZXJlc3RlZENhdGFsb2dzOworCQkKKwkJcHVibGljIFF1ZXJ5UmVzdWx0KFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHsKKwkJCXRoaXMucXVlcnlFeHByZXNzaW9uID0gcXVlcnlFeHByZXNzaW9uOworCQl9CisKKwkJcHVibGljIFF1ZXJ5RXhwcmVzc2lvbiBnZXRRdWVyeUV4cHJlc3Npb24oKSB7CisJCQlyZXR1cm4gcXVlcnlFeHByZXNzaW9uOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UXVlcnlFeHByZXNzaW9uKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHsKKwkJCXRoaXMucXVlcnlFeHByZXNzaW9uID0gcXVlcnlFeHByZXNzaW9uOworCQl9CisKKwkJcHVibGljIExpc3Q8Q2F0YWxvZ1JlY2VpcHQ+IGdldENhdGFsb2dSZWNlaXB0cygpIHsKKwkJCXJldHVybiBjYXRhbG9nUmVjZWlwdHM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nUmVjZWlwdHMoCisJCQkJTGlzdDxDYXRhbG9nUmVjZWlwdD4gY2F0YWxvZ1JlY2VpcHRzKSB7CisJCQl0aGlzLmNhdGFsb2dSZWNlaXB0cyA9IGNhdGFsb2dSZWNlaXB0czsKKwkJfQorCisJCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRJbnRlcmVzdGVkQ2F0YWxvZ3MoKSB7CisJCQlyZXR1cm4gaW50ZXJlc3RlZENhdGFsb2dzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0SW50ZXJlc3RlZENhdGFsb2dzKFNldDxTdHJpbmc+IGludGVyZXN0ZWRDYXRhbG9ncykgeworCQkJdGhpcy5pbnRlcmVzdGVkQ2F0YWxvZ3MgPSBpbnRlcmVzdGVkQ2F0YWxvZ3M7CisJCX0KKwkKKwl9CisJCisJcHJvdGVjdGVkIGNsYXNzIFF1ZXJ5UmVzdWx0R3JvdXAgeworCQlIYXNoU2V0PFRyYW5zYWN0aW9uUmVjZWlwdD4gdHJhbnNhY3Rpb25SZWNlaXB0czsKKwkJU3RyaW5nIGlkOworCQkKKwkJcHVibGljIFF1ZXJ5UmVzdWx0R3JvdXAoU3RyaW5nIGlkKSB7CisJCQl0aGlzLmlkID0gaWQ7CisJCQl0cmFuc2FjdGlvblJlY2VpcHRzID0gbmV3IEhhc2hTZXQ8VHJhbnNhY3Rpb25SZWNlaXB0PigpOworCQl9CisJCQorCQlwdWJsaWMgSGFzaFNldDxUcmFuc2FjdGlvblJlY2VpcHQ+IGdldFJlc3VsdHMoKSB7CisJCQlyZXR1cm4gdGhpcy50cmFuc2FjdGlvblJlY2VpcHRzOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBhZGRUcmFuc2FjdGlvblJlY2VpcHQoVHJhbnNhY3Rpb25SZWNlaXB0IHRyYW5zYWN0aW9uUmVjZWlwdCkgeworCQkJdGhpcy50cmFuc2FjdGlvblJlY2VpcHRzLmFkZCh0cmFuc2FjdGlvblJlY2VpcHQpOworCQl9CisJfQorCQkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vaW1wbC9DYXRhbG9nU2VydmljZUxvY2FsRmFjdG9yeS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3N5c3RlbS9pbXBsL0NhdGFsb2dTZXJ2aWNlTG9jYWxGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmODIwNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vaW1wbC9DYXRhbG9nU2VydmljZUxvY2FsRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5pbXBsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZy5Jbmdlc3RNYXBwZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LkNhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LlRyYW5zYWN0aW9uSWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZ1NlcnZpY2VGYWN0b3J5OworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8vT09EVCBpbXBvcnRzCisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEZhY3RvcnkgY2xhc3MgZm9yIENhdGFsb2dTZXJ2aWNlTG9jYWwKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1NlcnZpY2VMb2NhbEZhY3RvcnkgaW1wbGVtZW50cyBDYXRhbG9nU2VydmljZUZhY3RvcnkgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ2F0YWxvZ1NlcnZpY2VMb2NhbEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwlwcm90ZWN0ZWQgQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IGNhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSA9IG51bGw7CisJcHJvdGVjdGVkIEluZ2VzdE1hcHBlckZhY3RvcnkgaW5nZXN0TWFwcGVyRmFjdG9yeSAgPSBudWxsOworCXByb3RlY3RlZCBib29sZWFuIHJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucyA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25JZEZhY3RvcnkgdHJhbnNhY3Rpb25JZEZhY3RvcnkgPSBudWxsOworCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luU3RvcmFnZURpciA9IG51bGw7CisJcHJvdGVjdGVkIGJvb2xlYW4gb25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHNpbXBsaWZ5UXVlcmllcyA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIGRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzID0gZmFsc2U7CisJcHJvdGVjdGVkIGludCBjcm9zc0NhdGFsb2dSZXN1bHRTb3J0aW5nVGhyZXNob2xkID0gMjAwOworCQorCXB1YmxpYyBDYXRhbG9nU2VydmljZUxvY2FsRmFjdG9yeSgpIHt9IAorCQorCXB1YmxpYyBDYXRhbG9nU2VydmljZUxvY2FsIGNyZWF0ZUNhdGFsb2dTZXJ2aWNlKCkgeworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBDYXRhbG9nU2VydmljZUxvY2FsKHRoaXMuY2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5LmNyZWF0ZVJlcG9zaXRvcnkoKSwgdGhpcy5pbmdlc3RNYXBwZXJGYWN0b3J5LmNyZWF0ZU1hcHBlcigpLCBuZXcgRmlsZSh0aGlzLnBsdWdpblN0b3JhZ2VEaXIpLCB0aGlzLnRyYW5zYWN0aW9uSWRGYWN0b3J5LCB0aGlzLnJlc3RyaWN0UXVlcnlQZXJtaXNzaW9ucywgdGhpcy5yZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zLCB0aGlzLm9uZUNhdGFsb2dGYWlsc0FsbEZhaWwsIHRoaXMuc2ltcGxpZnlRdWVyaWVzLCB0aGlzLmRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzLCB0aGlzLmNyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBjcmVhdGUgQ2F0YWxvZ1NlcnZpY2VMb2NhbCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeShDYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkgY2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5KSB7CisJCXRoaXMuY2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5ID0gY2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5OworCX0KKworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldEluZ2VzdE1hcHBlckZhY3RvcnkoSW5nZXN0TWFwcGVyRmFjdG9yeSBpbmdlc3RNYXBwZXJGYWN0b3J5KSB7CisJCXRoaXMuaW5nZXN0TWFwcGVyRmFjdG9yeSA9IGluZ2VzdE1hcHBlckZhY3Rvcnk7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGJvb2xlYW4gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zID0gcmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zOworCX0KKworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnMoYm9vbGVhbiByZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKSB7CisJCXRoaXMucmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyA9IHJlc3RyaWN0SW5nZXN0UGVybWlzc2lvbnM7CisJfQorCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoU3RyaW5nIHRyYW5zYWN0aW9uSWRGYWN0b3J5KSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisJCXRoaXMudHJhbnNhY3Rpb25JZEZhY3RvcnkgPSAoVHJhbnNhY3Rpb25JZEZhY3RvcnkpIENsYXNzLmZvck5hbWUodHJhbnNhY3Rpb25JZEZhY3RvcnkpLm5ld0luc3RhbmNlKCk7CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldFBsdWdpblN0b3JhZ2VEaXIoU3RyaW5nIHBsdWdpblN0b3JhZ2VEaXIpIHsKKwkJdGhpcy5wbHVnaW5TdG9yYWdlRGlyID0gcGx1Z2luU3RvcmFnZURpcjsKKwl9CisJCisJQFJlcXVpcmVkCisJcHVibGljIHZvaWQgc2V0T25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbChib29sZWFuIG9uZUNhdGFsb2dGYWlsc0FsbEZhaWwpIHsKKwkJdGhpcy5vbmVDYXRhbG9nRmFpbHNBbGxGYWlsID0gb25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbDsKKwl9CisKKwlAUmVxdWlyZWQKKwlwdWJsaWMgdm9pZCBzZXRTaW1wbGlmeVF1ZXJpZXMoYm9vbGVhbiBzaW1wbGlmeVF1ZXJpZXMpIHsKKwkJdGhpcy5zaW1wbGlmeVF1ZXJpZXMgPSBzaW1wbGlmeVF1ZXJpZXM7CisJfQorCQorCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldERpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzKGJvb2xlYW4gZGlzYWJsZUludGVyc2VjdGluZ0Nyb3NzQ2F0YWxvZ1F1ZXJpZXMpIHsKKwkJdGhpcy5kaXNhYmxlSW50ZXJzZWN0aW5nQ3Jvc3NDYXRhbG9nUXVlcmllcyA9IGRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzOworCX0KKworCUBSZXF1aXJlZAorCXB1YmxpYyB2b2lkIHNldENyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQoCisJCQlpbnQgY3Jvc3NDYXRhbG9nUmVzdWx0U29ydGluZ1RocmVzaG9sZCkgeworCQl0aGlzLmNyb3NzQ2F0YWxvZ1Jlc3VsdFNvcnRpbmdUaHJlc2hvbGQgPSBjcm9zc0NhdGFsb2dSZXN1bHRTb3J0aW5nVGhyZXNob2xkOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy90ZXJtL0J1Y2tldC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3Rlcm0vQnVja2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5YjlhZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy90ZXJtL0J1Y2tldC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgQnVja2V0IHJlcHJlc2VudHMgYW4gaW5nZXN0YWJsZSBvciBxdWVyaWFibGUgZ3JvdXAKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgQnVja2V0IHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCisJcHVibGljIEJ1Y2tldCgpIHsKKwkJdGhpcy5uYW1lID0gIkRlZmF1bHQiOworCX0KKwkKKwlwdWJsaWMgQnVja2V0KFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3Rlcm0vVGVybS5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3Rlcm0vVGVybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2E5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdGVybS9UZXJtLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBpbmdlc3RhYmxlIG9yIHF1ZXJpYWJsZSBpdGVtCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFRlcm0gaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gdmFsdWVzOworCXByb3RlY3RlZCBUeXBlIHR5cGU7CisJcHVibGljIGVudW0gVHlwZSB7IAorCQl4bWxfYm9vbGVhbiwKKwkJeG1sX2Jhc2U2NEJpbmFyeSwKKwkJeG1sX2hleEJpbmFyeSwKKwkJeG1sX2FueVVSSSwKKwkJeG1sX2xhbmd1YWdlLAorCQl4bWxfbm9ybWFsaXplZFN0cmluZywKKwkJeG1sX3N0cmluZywKKwkJeG1sX3Rva2VuLAorCQl4bWxfYnl0ZSwKKwkJeG1sX2RlY2ltYWwsCisJCXhtbF9kb3VibGUsCisJCXhtbF9mbG9hdCwKKwkJeG1sX2ludCwKKwkJeG1sX2ludGVnZXIsCisJCXhtbF9sb25nLAorCQl4bWxfbmVnYXRpdmVJbnRlZ2VyLAorCQl4bWxfbm9uTmVnYXRpdmVJbnRlZ2VyLAorCQl4bWxfbm9uUG9zaXRpdmVJbnRlZ2VyLAorCQl4bWxfcG9zaXRpdmVJbnRlZ2VyLAorCQl4bWxfc2hvcnQsCisJCXhtbF91bnNpZ25lZEJ5dGUsCisJCXhtbF91bnNpZ25lZEludCwKKwkJeG1sX3Vuc2lnbmVkTG9uZywKKwkJeG1sX3Vuc2lnbmVkU2hvcnQsCisJCXhtbF9kYXRlLAorCQl4bWxfZGF0ZVRpbWUsCisJCXhtbF9kdXJhdGlvbiwKKwkJeG1sX2dEYXksCisJCXhtbF9nTW9udGgsCisJCXhtbF9nTW9udGhEYXksCisJCXhtbF9nWWVhciwKKwkJeG1sX2dZZWFyTW9udGgsCisJCXhtbF90aW1lLAorCQl4bWxfTmFtZSwKKwkJeG1sX05DTmFtZSwKKwkJeG1sX05PVEFUSU9OLAorCQl4bWxfUU5hbWUsCisJCXhtbF9FTlRJVFksCisJCXhtbF9FTlRJVElFUywKKwkJeG1sX0lELAorCQl4bWxfSURSRUYsCisJCXhtbF9JRFJFRlMsCisJCXhtbF9OTVRPS0VOLAorCQl4bWxfTk1UT0tFTlMsCisJCXhtbF9hbnlUeXBlLAorCQl4bWxfYW55U2ltcGxlVHlwZQorCX07CisJCisJcHVibGljIFRlcm0oKSB7CisJCXRoaXMudHlwZSA9IFR5cGUueG1sX3N0cmluZzsKKwkJdGhpcy52YWx1ZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwl9CisJCisJcHVibGljIFRlcm0oU3RyaW5nIG5hbWUpIHsKKwkJdGhpcygpOworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKwkKKwlwdWJsaWMgVGVybShTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlcykgeworCQl0aGlzKG5hbWUpOworCQl0aGlzLnNldFZhbHVlcyh2YWx1ZXMpOworCX0KKwkKKwlwdWJsaWMgVGVybShTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlcywgVHlwZSB0eXBlKSB7CisJCXRoaXMobmFtZSwgdmFsdWVzKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKKwkJdGhpcy52YWx1ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4odmFsdWVzKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRGaXJzdFZhbHVlKCkgeworCQlTdHJpbmcgZmlyc3RWYWx1ZSA9IG51bGw7CisJCWlmICh0aGlzLnZhbHVlcy5zaXplKCkgPiAwKQorCQkJZmlyc3RWYWx1ZSA9IHRoaXMudmFsdWVzLmdldCgwKTsKKwkJcmV0dXJuIGZpcnN0VmFsdWU7IAorCX0KKworCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLm5hbWUuaGFzaENvZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm0pIHsKKwkJCVRlcm0gY29tcGFyZVRvVGVybSA9IChUZXJtKSBvYmo7CisJCQlyZXR1cm4gKHRoaXMubmFtZS5lcXVhbHMoY29tcGFyZVRvVGVybS5uYW1lKQorCQkJCQkmJiB0aGlzLnR5cGUuZXF1YWxzKGNvbXBhcmVUb1Rlcm0udHlwZSkKKwkJCQkJJiYgdGhpcy52YWx1ZXMuY29udGFpbnNBbGwoY29tcGFyZVRvVGVybS52YWx1ZXMpICYmIGNvbXBhcmVUb1Rlcm0udmFsdWVzCisJCQkJCS5jb250YWluc0FsbCh0aGlzLnZhbHVlcykpOworCQl9ZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRlcm0gY2xvbmUoKSB7CisJCXJldHVybiBuZXcgVGVybSh0aGlzLm5hbWUsIHRoaXMudmFsdWVzLCB0aGlzLnR5cGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3Rlcm0vVGVybUJ1Y2tldC5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3Rlcm0vVGVybUJ1Y2tldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkM2VkNzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdGVybS9UZXJtQnVja2V0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudGVybTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIEJ1Y2tldCB3aGljaCBoYXMgVGVybXMgYXR0YWNoZWQgdG8gaXQKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgVGVybUJ1Y2tldCBleHRlbmRzIEJ1Y2tldCB7CisKKwlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBUZXJtPiB0ZXJtczsKKwkKKwlwdWJsaWMgVGVybUJ1Y2tldCgpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy50ZXJtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGVybT4oKTsKKwl9CisJCisJcHVibGljIFRlcm1CdWNrZXQoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCXRoaXMudGVybXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRlcm0+KCk7CisJfQorCQorCXB1YmxpYyBUZXJtQnVja2V0KFN0cmluZyBuYW1lLCBTZXQ8VGVybT4gdGVybXMpIHsKKwkJdGhpcyhuYW1lKTsKKwkJdGhpcy5zZXRUZXJtcyh0ZXJtcyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFRlcm1zKFNldDxUZXJtPiB0ZXJtcykgeworCQlpZiAodGVybXMgIT0gbnVsbCkgeworCQkJdGhpcy50ZXJtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGVybT4oKTsKKwkJCWZvciAoVGVybSB0ZXJtIDogdGVybXMpCisJCQkJdGhpcy50ZXJtcy5wdXQodGVybS5uYW1lLCB0ZXJtKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUZXJtcyhTZXQ8VGVybT4gdGVybXMpIHsKKwkJdGhpcy5hZGRUZXJtcyh0ZXJtcywgZmFsc2UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUZXJtcyhTZXQ8VGVybT4gdGVybXMsIGJvb2xlYW4gcmVwbGFjZSkgeworCQlpZiAocmVwbGFjZSkgeworCQkJZm9yIChUZXJtIHRlcm0gOiB0ZXJtcykKKwkJCQl0aGlzLnRlcm1zLnB1dCh0ZXJtLm5hbWUsIHRlcm0pOworCQl9ZWxzZSB7CisJCQlmb3IgKFRlcm0gdGVybSA6IHRlcm1zKSB7CisJCQkJVGVybSBmb3VuZCA9IHRoaXMudGVybXMuZ2V0KHRlcm0ubmFtZSk7CisJCQkJaWYgKGZvdW5kICE9IG51bGwpIHsKKwkJCQkJTGlzdDxTdHJpbmc+IG5ld1Rlcm1WYWx1ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKwkJCQkJbmV3VGVybVZhbHVlcy5hZGRBbGwoZm91bmQuZ2V0VmFsdWVzKCkpOworCQkJCQluZXdUZXJtVmFsdWVzLmFkZEFsbCh0ZXJtLmdldFZhbHVlcygpKTsKKwkJCQkJZm91bmQuc2V0VmFsdWVzKG5ld1Rlcm1WYWx1ZXMpOworCQkJCX1lbHNlIHsKKwkJCQkJdGhpcy50ZXJtcy5wdXQodGVybS5uYW1lLCB0ZXJtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgYWRkVGVybShUZXJtIHRlcm0pIHsKKwkJdGhpcy5hZGRUZXJtcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24odGVybSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUZXJtKFRlcm0gdGVybSwgYm9vbGVhbiByZXBsYWNlKSB7CisJCXRoaXMuYWRkVGVybXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHRlcm0pLCByZXBsYWNlKTsKKwl9CisJCisJcHVibGljIFNldDxUZXJtPiBnZXRUZXJtcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxUZXJtPih0aGlzLnRlcm1zLnZhbHVlcygpKSk7CisJfQorCQorCXB1YmxpYyBUZXJtIGdldFRlcm1CeU5hbWUoU3RyaW5nIHRlcm1OYW1lKSB7CisJCXJldHVybiB0aGlzLnRlcm1zLmdldCh0ZXJtTmFtZSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3V0aWwvQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy91dGlsL0Nhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxY2RjNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy91dGlsL0Nhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyIGV4dGVuZHMKKyAgICAgICAgUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0UHJvcGVydHlWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBudWxsOworICAgICAgICAJU3RyaW5nW10gc3BsaXRWYWx1ZSA9IHZhbHVlLnNwbGl0KCI7Iik7CisgICAgICAgIAlpZiAoc3BsaXRWYWx1ZS5sZW5ndGggPT0gMikgeworICAgICAgICAJCXZhbHVlID0gc3BsaXRWYWx1ZVswXTsKKyAgICAgICAgCQlkZWZhdWx0VmFsdWUgPSBzcGxpdFZhbHVlWzFdOworICAgICAgICAJfQorICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFBhdGhVdGlscy5kb0R5bmFtaWNSZXBsYWNlbWVudCh2YWx1ZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscygibnVsbCIpKQorICAgICAgICAgICAgCXJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy91dGlsL1BsdWdpbkNsYXNzTG9hZGVyLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdXRpbC9QbHVnaW5DbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzdkN2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdXRpbC9QbHVnaW5DbGFzc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5KYXZhIENsYXNzTG9hZGVyIGZvciBsb2FkaW5nIHBsdWdpbiBjbGFzc2VzIGluIENhdGFsb2dzIGFuZCBRdWVyeUV4cHJlc3Npb25zPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkNsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUGx1Z2luQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwlwdWJsaWMgUGx1Z2luQ2xhc3NMb2FkZXIoKSB7CisJCXN1cGVyKGdldFBsdWdpblVSTHMoKSk7CisJfQorCQorCXB1YmxpYyBQbHVnaW5DbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQpIHsKKwkJc3VwZXIobmV3IFVSTFswXSwgcGFyZW50KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRVUkwoUGx1Z2luVVJMIHBsdWdpblVSTCkgeworCQlzdXBlci5hZGRVUkwocGx1Z2luVVJMLmdldFVSTCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkVVJMcyhMaXN0PFVSTD4gdXJscykgeworCQlmb3IgKFVSTCB1cmwgOiB1cmxzKQorCQkJdGhpcy5hZGRVUkwodXJsKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBVUkxbXSBnZXRQbHVnaW5VUkxzKCkgeworCQlMaXN0PFVSTD4gdXJscyA9IG5ldyBWZWN0b3I8VVJMPigpOworCQl0cnkgeworCQkJU3RyaW5nIHBsdWdpbkRpcnMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wbHVnaW4uZGlycyIpOworCQkJaWYgKHBsdWdpbkRpcnMgIT0gbnVsbCkgeworCQkJCWZvciAoU3RyaW5nIHBsdWdpbkRpciA6IFBhdGhVdGlscy5kb0R5bmFtaWNSZXBsYWNlbWVudChwbHVnaW5EaXJzKS5zcGxpdCgiLCIpKSB7CisJCQkJCUZpbGVbXSBqYXJGaWxlcyA9IG5ldyBGaWxlKHBsdWdpbkRpcikubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgeworCQkJCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKwkJCQkJCQlyZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIik7CisJCQkJCQl9CQkJCQkKKwkJCQkJfSk7CisJCQkJCWZvciAoRmlsZSBqYXJGaWxlIDogamFyRmlsZXMpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJdXJscy5hZGQoamFyRmlsZS50b1VSTCgpKTsKKwkJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBsb2FkIGphciBmaWxlICciICsgamFyRmlsZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJCX0KKwkJCQkJCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCXJldHVybiB1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOworCX0KKwkKKwlwdWJsaWMgQ2xhc3M8Pz4gbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCUNsYXNzPD8+IGNsYXp6ID0gdGhpcy5maW5kTG9hZGVkQ2xhc3MobmFtZSk7CisJCQlpZiAoY2xhenogPT0gbnVsbCkKKwkJCQljbGF6eiA9IHRoaXMuZmluZENsYXNzKG5hbWUpOworCQkJcmV0dXJuIGNsYXp6OworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQlyZXR1cm4gc3VwZXIubG9hZENsYXNzKG5hbWUsIHJlc29sdmUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3V0aWwvUGx1Z2luVVJMLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdXRpbC9QbHVnaW5VUkwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjRkMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3V0aWwvUGx1Z2luVVJMLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+UGx1Z2luIFVSTCBmb3IgdHJhbnNmZXJpbmcgSmFycyB0byBzZXJ2ZXIgc2lkZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5VUkx7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2dJZDsKKwlwcm90ZWN0ZWQgVVJMIHVybDsKKwkKKwlwdWJsaWMgUGx1Z2luVVJMKFN0cmluZyBjYXRhbG9nSWQsIFVSTCB1cmwpIHsKKwkJdGhpcy5jYXRhbG9nSWQgPSBjYXRhbG9nSWQ7CisJCXRoaXMudXJsID0gdXJsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dJZCgpIHsKKwkJcmV0dXJuIHRoaXMuY2F0YWxvZ0lkOworCX0KKwkKKwlwdWJsaWMgVVJMIGdldFVSTCgpIHsKKwkJcmV0dXJuIHRoaXMudXJsOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy91dGlsL1F1ZXJ5VXRpbHMuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy91dGlsL1F1ZXJ5VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhjYWFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3V0aWwvUXVlcnlVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LlF1ZXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlMb2dpY2FsR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LldyYXBwZXJRdWVyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LmZpbHRlci5RdWVyeUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5wYXJzZXIuUXVlcnlQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlci5Ub2tlbk1nckVycm9yOworCisvL09PRFQgaW1wb3J0cworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogVXRpbGl0aWVzIGZvciBoZWxwaW5nIGZpbHRlciBxdWVyeSByZXN1bHRzCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5VXRpbHMgeworCisJcHVibGljIHN0YXRpYyBMaXN0PFRyYW5zYWN0aW9uYWxNZXRhZGF0YT4gZmlsdGVyTWV0YWRhdGEoUXVlcnlGaWx0ZXI8Pz4gcXVlcnlGaWx0ZXIsIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YUxpc3QpIHsKKwkJcmV0dXJuIHF1ZXJ5RmlsdGVyLmZpbHRlck1ldGFkYXRhTGlzdChtZXRhZGF0YUxpc3QpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBzb3J0KExpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YUxpc3QsIFN0cmluZyBzb3J0QnlNZXRhZGF0YUtleSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBRdWVyeUV4cHJlc3Npb24gc2ltcGxpZnlRdWVyeShRdWVyeUV4cHJlc3Npb24gcXVlcnlFeHByZXNzaW9uKSB7CisJCXJldHVybiBfc2ltcGxpZnlRdWVyeShxdWVyeUV4cHJlc3Npb24uY2xvbmUoKSk7CisJfQorCQorCS8qKgorCSAqIE1pZ2h0IGxhdGVyIGJlIGZhY3RvcmVkIG91dCBpbnRvIGEgUXVlcnkgTm9ybWFsaXplciBJbnRlcmZhY2UgLiAuIC4gdGhpcyBtZXRob2QgY3VycmVudGx5IGNvbXBhY3RzIEFORChzKS4KKwkgKiBAcGFyYW0gcXVlcnlFeHByZXNzaW9uIFF1ZXJ5IHRvIGJlIHNpbXBsaWZpZWQKKwkgKiBAcmV0dXJuIHNpbXBsaWZpZWQgcXVlcnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBRdWVyeUV4cHJlc3Npb24gX3NpbXBsaWZ5UXVlcnkoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgeworCQlpZiAocXVlcnlFeHByZXNzaW9uIGluc3RhbmNlb2YgUXVlcnlMb2dpY2FsR3JvdXApIHsKKwkJCVF1ZXJ5TG9naWNhbEdyb3VwLk9wZXJhdG9yIG9wZXJhdG9yID0gKChRdWVyeUxvZ2ljYWxHcm91cCkgcXVlcnlFeHByZXNzaW9uKS5nZXRPcGVyYXRvcigpOworCQkJYm9vbGVhbiBjaGFuZ2VkOworCQkJZG8geworCQkJCWNoYW5nZWQgPSBmYWxzZTsKKwkJCQlWZWN0b3I8UXVlcnlFeHByZXNzaW9uPiBjaGlsZHJlbiA9IG5ldyBWZWN0b3I8UXVlcnlFeHByZXNzaW9uPigpOworCQkJCWZvciAoUXVlcnlFeHByZXNzaW9uIHFlIDogKChRdWVyeUxvZ2ljYWxHcm91cCkgcXVlcnlFeHByZXNzaW9uKS5nZXRFeHByZXNzaW9ucygpKSB7CisJCQkJCWlmIChxZSBpbnN0YW5jZW9mIFF1ZXJ5TG9naWNhbEdyb3VwICYmICgoUXVlcnlMb2dpY2FsR3JvdXApIHFlKS5nZXRPcGVyYXRvcigpLmVxdWFscyhvcGVyYXRvcikpIHsKKwkJCQkJCWNoaWxkcmVuLmFkZEFsbCgoKFF1ZXJ5TG9naWNhbEdyb3VwKSBxZSkuZ2V0RXhwcmVzc2lvbnMoKSk7CisJCQkJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJCQkJfWVsc2UgeworCQkJCQkJY2hpbGRyZW4uYWRkKHFlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkoKFF1ZXJ5TG9naWNhbEdyb3VwKSBxdWVyeUV4cHJlc3Npb24pLnNldEV4cHJlc3Npb25zKGNoaWxkcmVuKTsKKwkJCX13aGlsZShjaGFuZ2VkKTsKKwkJfWVsc2UgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFdyYXBwZXJRdWVyeUV4cHJlc3Npb24pIHsKKwkJCSgoV3JhcHBlclF1ZXJ5RXhwcmVzc2lvbikgcXVlcnlFeHByZXNzaW9uKS5zZXRRdWVyeUV4cHJlc3Npb24oKChXcmFwcGVyUXVlcnlFeHByZXNzaW9uKSBxdWVyeUV4cHJlc3Npb24pLmdldFF1ZXJ5RXhwcmVzc2lvbigpKTsKKwkJfQorCQlyZXR1cm4gcXVlcnlFeHByZXNzaW9uOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIFRva2VuTWdyRXJyb3IgeworCQlRdWVyeUV4cHJlc3Npb24gcWUgPSBRdWVyeVBhcnNlci5wYXJzZVF1ZXJ5RXhwcmVzc2lvbigie2J1Y2tldE5hbWVzID0gJ2pvZSx0aW0nIDsgTmFtZSA9PSAnVGltLEpvZScgQU5EIENpdHkgPT0gJ1VwbGFuZCcgQU5EIFN0YXRlID09ICdDQSd9Iik7CisJCVN5c3RlbS5vdXQucHJpbnRsbihxZS50b1N0cmluZygpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHNpbXBsaWZ5UXVlcnkocWUpLnRvU3RyaW5nKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCQlxZSA9IFF1ZXJ5UGFyc2VyLnBhcnNlUXVlcnlFeHByZXNzaW9uKCJOYW1lID09ICdUaW0sSm9lJyBBTkQgKENpdHkgPT0gJ1VwbGFuZCcgQU5EIFN0YXRlID09ICdDQScpIik7CisJCVN5c3RlbS5vdXQucHJpbnRsbihxZS50b1N0cmluZygpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHNpbXBsaWZ5UXVlcnkocWUpLnRvU3RyaW5nKCkpOworCX0KKwkKKy8vCXB1YmxpYyBzdGF0aWMgUXVlcnlFeHByZXNzaW9uIGNvbnZlcnRBbmRzVG9PcnMoUXVlcnlFeHByZXNzaW9uIHF1ZXJ5RXhwcmVzc2lvbikgeworLy8JCWlmIChxdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWVyeUxvZ2ljYWxHcm91cCkgeworLy8JCQlpZiAoKChRdWVyeUxvZ2ljYWxHcm91cCkgcXVlcnlFeHByZXNzaW9uKS5nZXRPcGVyYXRvcigpLmVxdWFscyhRdWVyeUxvZ2ljYWxHcm91cC5PcGVyYXRvci5BTkQpKSB7CisvLwkJCQlRdWVyeUxvZ2ljYWxHcm91cCBjb252ZXJ0ZWRRdWVyeUV4cHJlc3Npb24gPSBuZXcgUXVlcnlMb2dpY2FsR3JvdXAoKTsKKy8vCQkJCWNvbnZlcnRlZFF1ZXJ5RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihRdWVyeUxvZ2ljYWxHcm91cC5PcGVyYXRvci5PUik7CisvLwkJCQlmb3IgKFF1ZXJ5RXhwcmVzc2lvbiBzdWJRdWVyeUV4cHJlc3Npb24gOiAoKFF1ZXJ5TG9naWNhbEdyb3VwKSBxdWVyeUV4cHJlc3Npb24pLmdldEV4cHJlc3Npb25zKCkpCisvLwkJCQkJY29udmVydGVkUXVlcnlFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IE5vdFF1ZXJ5RXhwcmVzc2lvbihjb252ZXJ0QW5kc1RvT3JzKHN1YlF1ZXJ5RXhwcmVzc2lvbikpKTsKKy8vCQkJCXJldHVybiBuZXcgTm90UXVlcnlFeHByZXNzaW9uKGNvbnZlcnRlZFF1ZXJ5RXhwcmVzc2lvbik7CisvLwkJCX1lbHNlIHsKKy8vCQkJCVF1ZXJ5TG9naWNhbEdyb3VwIGNvbnZlcnRlZFF1ZXJ5RXhwcmVzc2lvbiA9IG5ldyBRdWVyeUxvZ2ljYWxHcm91cCgpOworLy8JCQkJY29udmVydGVkUXVlcnlFeHByZXNzaW9uLnNldE9wZXJhdG9yKFF1ZXJ5TG9naWNhbEdyb3VwLk9wZXJhdG9yLk9SKTsKKy8vCQkJCWZvciAoUXVlcnlFeHByZXNzaW9uIHN1YlF1ZXJ5RXhwcmVzc2lvbiA6ICgoUXVlcnlMb2dpY2FsR3JvdXApIHF1ZXJ5RXhwcmVzc2lvbikuZ2V0RXhwcmVzc2lvbnMoKSkgCisvLwkJCQkJY29udmVydGVkUXVlcnlFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24oY29udmVydEFuZHNUb09ycyhzdWJRdWVyeUV4cHJlc3Npb24pKTsKKy8vCQkJCXJldHVybiBjb252ZXJ0ZWRRdWVyeUV4cHJlc3Npb247CisvLwkJCX0KKy8vCQl9ZWxzZSBpZiAocXVlcnlFeHByZXNzaW9uIGluc3RhbmNlb2YgTm90UXVlcnlFeHByZXNzaW9uKSB7CisvLwkJCXJldHVybiBuZXcgTm90UXVlcnlFeHByZXNzaW9uKGNvbnZlcnRBbmRzVG9PcnMoKChOb3RRdWVyeUV4cHJlc3Npb24pIHF1ZXJ5RXhwcmVzc2lvbikuZ2V0UXVlcnlFeHByZXNzaW9uKCkpKTsKKy8vCQl9ZWxzZSB7CisvLwkJCXJldHVybiBxdWVyeUV4cHJlc3Npb247CisvLwkJfQorLy8JfQorLy8JCisvLwlwdWJsaWMgc3RhdGljIFF1ZXJ5RXhwcmVzc2lvbiByZWR1Y2VOb3RzKFF1ZXJ5RXhwcmVzc2lvbiBxdWVyeUV4cHJlc3Npb24pIHsKKy8vCQlpZiAocXVlcnlFeHByZXNzaW9uIGluc3RhbmNlb2YgTm90UXVlcnlFeHByZXNzaW9uKSB7CisvLwkJCU5vdFF1ZXJ5RXhwcmVzc2lvbiBub3RRdWVyeUV4cHJlc3Npb24gPSAoTm90UXVlcnlFeHByZXNzaW9uKSBxdWVyeUV4cHJlc3Npb247CisvLwkJCWlmIChub3RRdWVyeUV4cHJlc3Npb24uZ2V0UXVlcnlFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBRdWVyeUxvZ2ljYWxHcm91cCAmJiAoKFF1ZXJ5TG9naWNhbEdyb3VwKSBub3RRdWVyeUV4cHJlc3Npb24uZ2V0UXVlcnlFeHByZXNzaW9uKCkpLmdldE9wZXJhdG9yKCkuZXF1YWxzKFF1ZXJ5TG9naWNhbEdyb3VwLk9wZXJhdG9yLk9SKSkgeworLy8JCQkJUXVlcnlMb2dpY2FsR3JvdXAgcXVlcnlMb2dpY2FsR3JvdXAgPSAoUXVlcnlMb2dpY2FsR3JvdXApIG5vdFF1ZXJ5RXhwcmVzc2lvbi5nZXRRdWVyeUV4cHJlc3Npb24oKTsKKy8vCQkJCVF1ZXJ5TG9naWNhbEdyb3VwIG5ld1F1ZXJ5TG9naWNhbEdyb3VwID0gbmV3IFF1ZXJ5TG9naWNhbEdyb3VwKCk7CisvLwkJCQluZXdRdWVyeUxvZ2ljYWxHcm91cC5zZXRPcGVyYXRvcihRdWVyeUxvZ2ljYWxHcm91cC5PcGVyYXRvci5BTkQpOworLy8JCQkJZm9yIChRdWVyeUV4cHJlc3Npb24gc3ViUXVlcnlFeHByZXNzaW9uIDogcXVlcnlMb2dpY2FsR3JvdXAuZ2V0RXhwcmVzc2lvbnMoKSkgeworLy8JCQkJCWlmIChzdWJRdWVyeUV4cHJlc3Npb24gaW5zdGFuY2VvZiBOb3RRdWVyeUV4cHJlc3Npb24pIHsKKy8vCQkJCQkJbmV3UXVlcnlMb2dpY2FsR3JvdXAuYWRkRXhwcmVzc2lvbihyZWR1Y2VOb3RzKCgoTm90UXVlcnlFeHByZXNzaW9uKSBzdWJRdWVyeUV4cHJlc3Npb24pLmdldFF1ZXJ5RXhwcmVzc2lvbigpKSk7CisvLwkJCQkJfWVsc2UgeworLy8JCQkJCQluZXdRdWVyeUxvZ2ljYWxHcm91cC5hZGRFeHByZXNzaW9uKG5ldyBOb3RRdWVyeUV4cHJlc3Npb24ocmVkdWNlTm90cyhzdWJRdWVyeUV4cHJlc3Npb24pKSk7CisvLwkJCQkJfQorLy8JCQkJfQorLy8JCQkJcmV0dXJuIG5ld1F1ZXJ5TG9naWNhbEdyb3VwOworLy8JCQl9ZWxzZSB7CisvLwkJCQlyZXR1cm4gbmV3IE5vdFF1ZXJ5RXhwcmVzc2lvbihyZWR1Y2VOb3RzKG5vdFF1ZXJ5RXhwcmVzc2lvbi5nZXRRdWVyeUV4cHJlc3Npb24oKSkpOworLy8JCQl9CisvLwkJfWVsc2UgaWYgKHF1ZXJ5RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1ZXJ5TG9naWNhbEdyb3VwKXsKKy8vCQkJUXVlcnlMb2dpY2FsR3JvdXAgcXVlcnlMb2dpY2FsR3JvdXAgPSAoUXVlcnlMb2dpY2FsR3JvdXApIHF1ZXJ5RXhwcmVzc2lvbjsKKy8vCQkJUXVlcnlMb2dpY2FsR3JvdXAgbmV3UXVlcnlMb2dpY2FsR3JvdXAgPSBuZXcgUXVlcnlMb2dpY2FsR3JvdXAoKTsKKy8vCQkJbmV3UXVlcnlMb2dpY2FsR3JvdXAuc2V0T3BlcmF0b3IocXVlcnlMb2dpY2FsR3JvdXAuZ2V0T3BlcmF0b3IoKSk7CisvLwkJCWZvciAoUXVlcnlFeHByZXNzaW9uIHN1YlF1ZXJ5RXhwcmVzc2lvbiA6IHF1ZXJ5TG9naWNhbEdyb3VwLmdldEV4cHJlc3Npb25zKCkpCisvLwkJCQluZXdRdWVyeUxvZ2ljYWxHcm91cC5hZGRFeHByZXNzaW9uKHJlZHVjZU5vdHMoc3ViUXVlcnlFeHByZXNzaW9uKSk7CisvLwkJCXJldHVybiBuZXdRdWVyeUxvZ2ljYWxHcm91cDsKKy8vCQl9ZWxzZSB7CisvLwkJCXJldHVybiBxdWVyeUV4cHJlc3Npb247CisvLwkJfQorLy8JfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3V0aWwvU2VyaWFsaXplci5qYXZhIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jYXRhbG9nL3V0aWwvU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDdiMDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdXRpbC9TZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLy9YU3RyZWFtIGltcG9ydHMKK2ltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uWFN0cmVhbTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJpYWxpemVyIHsKKworCXByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VQbHVnaW5VcmxzOworCQorCXB1YmxpYyBTZXJpYWxpemVyKCkgeworCQl0aGlzKHRydWUpOworCX0KKworCXB1YmxpYyBTZXJpYWxpemVyKGJvb2xlYW4gdXNlUGx1Z2luVXJscykgeworCQl0aGlzLnVzZVBsdWdpblVybHMgPSB1c2VQbHVnaW5VcmxzOworCQl0aGlzLnJlZnJlc2hDbGFzc0xvYWRlcigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZWZyZXNoQ2xhc3NMb2FkZXIoKSB7CisJCWlmICh1c2VQbHVnaW5VcmxzKQorCQkJdGhpcy5jbGFzc0xvYWRlciA9IG5ldyBQbHVnaW5DbGFzc0xvYWRlcigpOworCQllbHNlCisJCQl0aGlzLmNsYXNzTG9hZGVyID0gU2VyaWFsaXplci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRVc2VQbHVnaW5VcmxzKGJvb2xlYW4gdXNlUGx1Z2luVXJscykgeworCQl0aGlzLnVzZVBsdWdpblVybHMgPSB1c2VQbHVnaW5VcmxzOworCX0KKworCXB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKwkJcmV0dXJuIGNsYXNzTG9hZGVyOworCX0KKwkKKwkvKioKKwkgKiBTZXJpYWxpemVzIGFueSBqYXZhIG9iamVjdCBpbnRvIGEgamF2YSBTZXJpYWxpemFibGUgU3RyaW5nCisJICogQHBhcmFtIDxUPiBPYmplY3QgdHlwZSB0byBiZSBzZXJpYWxpemVkCisJICogQHBhcmFtIG9iamVjdCBUaGUgT2JqZWN0IG9mIHR5cGUgPFQ+IHRvIGJlIHNlcmlhbGl6ZWQKKwkgKiBAcmV0dXJuIEEgU3RyaW5nIGZvciBvZiB0aGUgb2JqZWN0IGFyZworCSAqLworCXB1YmxpYyA8VD4gU3RyaW5nIHNlcmlhbGl6ZU9iamVjdChUIG9iamVjdCkgeworCQlYU3RyZWFtIHhTdHJlYW0gPSBuZXcgWFN0cmVhbSgpOworCQlyZXR1cm4geFN0cmVhbS50b1hNTChvYmplY3QpOworCX0KKwkKKwlwdWJsaWMgPFQ+IHZvaWQgc2VyaWFsaXplT2JqZWN0KFQgb2JqZWN0LCBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB7CisJCVhTdHJlYW0geFN0cmVhbSA9IG5ldyBYU3RyZWFtKCk7CisJCXhTdHJlYW0udG9YTUwob2JqZWN0LCBvdXRTdHJlYW0pOworCX0KKwkKKwkvKioKKwkgKiBEZXNlcmlhbGl6ZXMgYW55IG9iamVjdCB0aGF0IGhhcyBiZWVuIHNlcmlhbGl6ZWQgYnkgdGhlIHNlcmlhbGl6ZWRPYmplY3QoVCkgbWV0aG9kCisJICogQHBhcmFtIDxUPiBUeXBlIG9mIE9iamVjdCB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlcmlhbGl6ZWQKKwkgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGUKKwkgKiBAcGFyYW0geG1sT2JqZWN0IFRoZSBTdHJpbmcgZm9yIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVzZXJpYWxpemVkCisJICogQHJldHVybiBUaGUgZGVzZXJpYWxpemVkIG9iamVjdAorCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyA8VD4gVCBkZXNlcmlhbGl6ZU9iamVjdChDbGFzczxUPiBjbGF6eiwgU3RyaW5nIHhtbE9iamVjdCkgeworCQlYU3RyZWFtIHhTdHJlYW0gPSBuZXcgWFN0cmVhbSgpOworCQl4U3RyZWFtLnNldENsYXNzTG9hZGVyKGdldENsYXNzTG9hZGVyKCkpOworCQlyZXR1cm4gKFQpIHhTdHJlYW0uZnJvbVhNTCh4bWxPYmplY3QpOworCX0KKwkKKwlwdWJsaWMgPFQ+IFQgZGVzZXJpYWxpemVPYmplY3QoQ2xhc3M8VD4gY2xhenosIElucHV0U3RyZWFtIGluU3RyZWFtKSB7CisJCVhTdHJlYW0geFN0cmVhbSA9IG5ldyBYU3RyZWFtKCk7CisJCXhTdHJlYW0uc2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3NMb2FkZXIoKSk7CisJCXJldHVybiAoVCkgeFN0cmVhbS5mcm9tWE1MKGluU3RyZWFtKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy91dGlsL1NwcmluZ1V0aWxzLmphdmEgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdXRpbC9TcHJpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YmJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvdXRpbC9TcHJpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uQ2F0YWxvZzsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoU3ByaW5nVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwlwdWJsaWMgc3RhdGljIEhhc2hTZXQ8Q2F0YWxvZz4gbG9hZENhdGFsb2dzKFN0cmluZyBjYXRhbG9nQmVhblJlcG8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQgPSBuZXcgRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dChjYXRhbG9nQmVhblJlcG8pOworICAgICAgICBNYXA8U3RyaW5nLCBDYXRhbG9nPiBjYXRhbG9nc01hcCA9IGFwcENvbnRleHQuZ2V0QmVhbnNPZlR5cGUoQ2F0YWxvZy5jbGFzcyk7CisgICAgICAgIEhhc2hTZXQ8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBuZXcgSGFzaFNldDxDYXRhbG9nPigpOworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBjYXRhbG9nc01hcC5rZXlTZXQoKSkgeworICAgICAgICAJQ2F0YWxvZyBjdXJDYXRhbG9nID0gY2F0YWxvZ3NNYXAuZ2V0KGtleSk7CisgICAgICAgIAlMT0cubG9nKExldmVsLklORk8sICJMb2FkaW5nIGNhdGFsb2cgY29uZmlndXJhdGlvbiBmb3IgQ2F0YWxvZzogJyIgKyBjdXJDYXRhbG9nICsgIiciKTsKKyAgICAgICAgCWlmIChjYXRhbG9ncy5jb250YWlucyhjdXJDYXRhbG9nKSkKKyAgICAgICAgCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYXRhbG9nIFVSTiA6ICciICsgY3VyQ2F0YWxvZyArICInIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgQ2F0YWxvZydzIFVSTi4gICoqTk9URTogVVJOcyBhcmUgY3JlYXRlZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJ1bGU6IHVybjo8bmFtZXNwYWNlPjo8aWQgb3IgbmFtZSAoaWYgc2V0KT4iKTsKKyAgICAgICAgCWNhdGFsb2dzLmFkZChjdXJDYXRhbG9nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2F0YWxvZ3M7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzA2YTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cKQEAgLTAsMCArMSwxOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworWW91IGNhbiByZW1vdmUgdGhpcyBmaWxlLiBJdCB3YXMgb25seSBpbmNsdWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgbG9nIGRpcmVjdG9yeSBmb3IgdGhpcworZGlzdHJpYnV0aW9uIHdhcyBjcmVhdGVkIG9uIGFzc2VtYmx5LgpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhhNDIyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgdHdvIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcgorCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgcm9vdCBsb2dnZXIKKy5sZXZlbCA9IEFMTAorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwgPSBBTEwKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxldmVsID0gQUxMCisgICAgICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKworIyBkZWZhdWx0IGZpbGUgb3V0cHV0IGlzIGluIHVzZXIncyBob21lIGRpcmVjdG9yeS4KK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm4gPSAuLi9sb2dzL2Nhc19jYXRhbG9nJWcubG9nCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5saW1pdCA9IDUwMDAwCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5jb3VudCA9IDUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmFwcGVuZCA9IHRydWUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjIAorb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmxldmVsID0gSU5GTworCisjIGFpcnMgZG9tIGxvZ2dpbgorc3VuLnJtaS5sZXZlbCA9IElORk8KKworIyBzcHJpbmcgZnJhbWV3b3JrIGxvZ2dpbmcKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gU0VWRVJFCitvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnV0aWwuQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIubGV2ZWwgPSBTRVZFUkUKK3N1bi5uZXQubGV2ZWwgPSBTRVZFUkUKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JhY2xlL2NyZWF0ZS10cmFuc2FjdGlvbi1pZC1tYXAtdGFibGUuc3FsIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9vcmFjbGUvY3JlYXRlLXRyYW5zYWN0aW9uLWlkLW1hcC10YWJsZS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmMDE4MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JhY2xlL2NyZWF0ZS10cmFuc2FjdGlvbi1pZC1tYXAtdGFibGUuc3FsCkBAIC0wLDAgKzEsMjkgQEAKKyAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAtLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAtLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgLS0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAtLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIC0tIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgLS0KKyAtLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgLS0KKyAtLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgLS0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAtLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAtLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgLS0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgCitDUkVBVEUgVEFCTEUgQ2F0YWxvZ1NlcnZpY2VNYXBwZXIgKAorICBDQVRfU0VSVl9UUkFOU19JRCBWQVJDSEFSMigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1NFUlZfVFJBTlNfRkFDVE9SWSBWQVJDSEFSMigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1RSQU5TX0lEIFZBUkNIQVIyKDI1NSkgTk9UIE5VTEwgLAorICBDQVRfVFJBTlNfRkFDVE9SWSBWQVJDSEFSMigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1RSQU5TX0RBVEUgVkFSQ0hBUjIoMjU1KSBOT1QgTlVMTCAsCisgIENBVEFMT0dfSUQgVkFSQ0hBUjIoMjU1KSBOT1QgTlVMTAorKTsKKworQ1JFQVRFIElOREVYIENhdGFsb2dTZXJ2aWNlTWFwcGVyX0NTVElkX2lkeCBPTiBDYXRhbG9nU2VydmljZU1hcHBlcihDQVRfU0VSVl9UUkFOU19JRCk7ICAKK0NSRUFURSBJTkRFWCBDYXRhbG9nU2VydmljZU1hcHBlcl9DVElkX2lkeCBPTiBDYXRhbG9nU2VydmljZU1hcHBlcihDQVRfVFJBTlNfSUQpOyAgCitDUkVBVEUgSU5ERVggQ2F0YWxvZ1NlcnZpY2VNYXBwZXJfQ2F0SWRfaWR4IE9OIENhdGFsb2dTZXJ2aWNlTWFwcGVyKENBVEFMT0dfSUQpOyAgCisKK0VYSVQ7CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL29yYWNsZS9jcmVhdGUtdHJhbnNhY3Rpb24taW5kZXgtdGFibGUuc3FsIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9vcmFjbGUvY3JlYXRlLXRyYW5zYWN0aW9uLWluZGV4LXRhYmxlLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODkyNzFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9vcmFjbGUvY3JlYXRlLXRyYW5zYWN0aW9uLWluZGV4LXRhYmxlLnNxbApAQCAtMCwwICsxLDMxIEBACisgLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIC0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAtLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIC0tCisgLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIC0tCisgLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIC0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIC0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIAorQ1JFQVRFIFRBQkxFIHRyYW5zYWN0aW9ucworKAorICB0cmFuc2FjdGlvbl9pZCB2YXJjaGFyMigyNTYpIE5PVCBOVUxMLAorICB0cmFuc2FjdGlvbl9kYXRlIHZhcmNoYXIyKDI1NikgTk9UIE5VTEwKKyk7CisKK0NSRUFURSBUQUJMRSB0cmFuc2FjdGlvbl90ZXJtcworKAorICB0cmFuc2FjdGlvbl9pZCB2YXJjaGFyMigyNTYpIE5PVCBOVUxMLAorICBidWNrZXRfbmFtZSB2YXJjaGFyMigyNTYpIE5PVCBOVUxMLAorICB0ZXJtX25hbWUgdmFyY2hhcjIoMjU2KSBOT1QgTlVMTCwKKyAgdGVybV92YWx1ZSB2YXJjaGFyMigxMDAwKSBOT1QgTlVMTAorKTsKKworQ1JFQVRFIElOREVYIHRyYW5zYWN0aW9uc190cmFuc2lkX2lkeCBPTiB0cmFuc2FjdGlvbnModHJhbnNhY3Rpb25faWQpOyAgCitDUkVBVEUgSU5ERVggdHJhbnNhY3Rpb25fdGVybXNfdHJhbnNpZF9pZHggT04gdHJhbnNhY3Rpb25fdGVybXModHJhbnNhY3Rpb25faWQpOyAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1iZWFucy54bWwgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LWJlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTlhNmUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1iZWFucy54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKwk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLnBvc3Rwcm9jZXNzb3IuU2V0SWRCZWFuUG9zdFByb2Nlc3NvciIgLz4KKworCTwhLS0gQ2F0YWxvZyBTZXJ2aWNlcyAtLT4KKwk8YmVhbiBpZD0iQ2F0YWxvZ1NlcnZpY2VMb2NhbEZhY3RvcnkiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uaW1wbC5DYXRhbG9nU2VydmljZUxvY2FsRmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0cmFuc2FjdGlvbklkRmFjdG9yeSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC50cmFuc2FjdGlvbi5VdWlkVHJhbnNhY3Rpb25JZEZhY3RvcnkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkiIHJlZj0iU2VyaWFsaXplZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImluZ2VzdE1hcHBlckZhY3RvcnkiIHJlZj0iSW5NZW1vcnlJbmdlc3RNYXBwZXJGYWN0b3J5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luU3RvcmFnZURpciIgdmFsdWU9IiR7cGNzLnN1cHBvcnQuaG9tZX0vY2FzLWNhdGFsb2cvcGx1Z2luLWphcnMvIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJvbmVDYXRhbG9nRmFpbHNBbGxGYWlsIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InNpbXBsaWZ5UXVlcmllcyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkaXNhYmxlSW50ZXJzZWN0aW5nQ3Jvc3NDYXRhbG9nUXVlcmllcyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY3Jvc3NDYXRhbG9nUmVzdWx0U29ydGluZ1RocmVzaG9sZCIgdmFsdWU9IjIwMCIgLz4KKwk8L2JlYW4+CisKKwk8IS0tIENvbW11bmljYXRpb24gQ2hhbm5lbHMgLS0+CisJPGJlYW4gaWQ9IlhtbFJwY1NlcnZlckZhY3RvcnkiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2hhbm5lbC54bWxycGMuWG1sUnBjQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5Ij4KKwkJPHByb3BlcnR5IG5hbWU9InBvcnQiIHZhbHVlPSIke2NhdGFsb2cucG9ydH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjYXRhbG9nU2VydmljZUZhY3RvcnkiIHJlZj0iQ2F0YWxvZ1NlcnZpY2VMb2NhbEZhY3RvcnkiIC8+CisJPC9iZWFuPgorCisJPCEtLSBDYXRhbG9nIFJlcG9zaXRvcmllcyAtLT4KKwk8YmVhbiBpZD0iU3ByaW5nQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVwb3NpdG9yeS5TcHJpbmdDYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkiPgorCQk8cHJvcGVydHkgbmFtZT0iY2F0YWxvZ0JlYW5SZXBvIiB2YWx1ZT0iJHtjYXRhbG9nLmhvbWV9L3BvbGljeS9maWxlbWdyLWNhdGFsb2ctYmVhbnMueG1sIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iV29ya2Zsb3dNYW5hZ2VyUmVwb3NpdG9yeUZhY3RvcnkiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5LlNwcmluZ0NhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJjYXRhbG9nQmVhblJlcG8iIHZhbHVlPSIke2NhdGFsb2cuaG9tZX0vcG9saWN5L3dvcmtmbG93LW1hbmFnZXItYmVhbnMueG1sIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iU2VyaWFsaXplZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuU2VyaWFsaXplZENhdGFsb2dSZXBvc2l0b3J5RmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdG9yYWdlRGlyIiB2YWx1ZT0iJHtwY3Muc3VwcG9ydC5ob21lfS9jYXMtY2F0YWxvZy9jYXRhbG9nLXJlcG8iIC8+CisJPC9iZWFuPgorCisJPCEtLSBNYXBwZXIgSW5kZXhlcyAtLT4KKwk8YmVhbiBpZD0iRGF0YVNvdXJjZUluZ2VzdE1hcHBlckZhY3RvcnkiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tYXBwaW5nLkRhdGFTb3VyY2VJbmdlc3RNYXBwZXJGYWN0b3J5Ij4KKwkJPHByb3BlcnR5IG5hbWU9ImpkYmNVcmwiIHZhbHVlPSJqZGJjOm9yYWNsZTp0aGluOkBkZXcuanBsLm5hc2EuZ292OjE1MjE6bnBwdGVzdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InVzZXIiIHZhbHVlPSJzYSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBhc3MiIHZhbHVlPSIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkcml2ZXIiIHZhbHVlPSJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iSW5NZW1vcnlJbmdlc3RNYXBwZXJGYWN0b3J5IiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cubWFwcGluZy5Jbk1lbW9yeUluZ2VzdE1hcHBlckZhY3RvcnkiPgorCQk8cHJvcGVydHkgbmFtZT0iamRiY1VybCIgdmFsdWU9ImpkYmM6aHNxbGRiOmZpbGU6JHtwY3Muc3VwcG9ydC5ob21lfS9oc3FsZGI7c2h1dGRvd249dHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InVzZXIiIHZhbHVlPSJzYSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBhc3MiIHZhbHVlPSIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkcml2ZXIiIHZhbHVlPSJvcmcuaHNxbGRiLmpkYmNEcml2ZXIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0YWJsZXNGaWxlIiB2YWx1ZT0iJHtjYXRhbG9nLmhvbWV9L3BvbGljeS9pbi1tZW1vcnktaW5nZXN0LW1hcHBlci5zcWwiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJNZW1vcnlCYXNlZEluZ2VzdE1hcHBlckZhY3RvcnkiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tYXBwaW5nLk1lbW9yeUJhc2VkSW5nZXN0TWFwcGVyRmFjdG9yeSIgLz4KKworPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NhdHNlcnYtY2xpZW50LWFjdGlvbi1iZWFucy54bWwgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LWNsaWVudC1hY3Rpb24tYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzY3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LWNsaWVudC1hY3Rpb24tYmVhbnMueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisgICAgCisgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLnNwcmluZy5wb3N0cHJvY2Vzc29yLlNldElkQmVhblBvc3RQcm9jZXNzb3IiLz4gICAgCisgICAgCisgICAgPGJlYW4gaWQ9InNodXRkb3duIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5hY3Rpb24uU2h1dGRvd25TZXJ2ZXJBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJTaHV0cyBkb3duIHRoZSBzZXJ2ZXIgZm9yIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiLz4KKyAgICA8L2JlYW4+CisgICAgPGJlYW4gaWQ9InF1ZXJ5X2FsbCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuYWN0aW9uLlF1ZXJ5U2VydmVyQWN0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUGVyZm9ybXMgYSB1bi1wYWdlZCBxdWVyeSB0byB0aGUgc2VydmVyIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiLz4gICAgICAgIAorICAgIDwvYmVhbj4KKyAgICA8YmVhbiBpZD0icmVkdWNlZF9xdWVyeV9hbGwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmFjdGlvbi5SZWR1Y2VkUXVlcnlTZXJ2ZXJBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQZXJmb3JtcyBhIHVuLXBhZ2VkIHF1ZXJ5IHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIvPiAgICAgICAgCisgICAgPC9iZWFuPgorICAgIDxiZWFuIGlkPSJxdWVyeV9wYWdlZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuYWN0aW9uLlBhZ2VkUXVlcnlTZXJ2ZXJBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQZXJmb3JtcyBhIHBhZ2VkIHF1ZXJ5IHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIvPiAgICAgICAgCisgICAgPC9iZWFuPgorICAgIDxiZWFuIGlkPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5hY3Rpb24uUmVkdWNlZFBhZ2VkUXVlcnlTZXJ2ZXJBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQZXJmb3JtcyBhIHBhZ2VkIHF1ZXJ5IHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIvPiAgICAgICAgCisgICAgPC9iZWFuPgorICAgIDxiZWFuIGlkPSJsb2FkX2NhdGFsb2dzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5hY3Rpb24uTG9hZENhdGFsb2dzU2VydmVyQWN0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTG9hZHMgdGhlIGNhdGFsb2dzIGZyb20gdGhlIGdpdmVuIHNwcmluZyB4bWwgZmlsZSBpbnRvIHRoZSBzZXJ2ZXIgZm9yIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiLz4gICAgICAgIAorICAgIDwvYmVhbj4KKyAgICA8YmVhbiBpZD0ibG9hZF9jYXRhbG9nX3JlcG8iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLmFjdGlvbi5Mb2FkQ2F0YWxvZ1JlcG9zaXRvcnlTZXJ2ZXJBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJMb2FkcyB0aGUgY2F0YWxvZ3MgZnJvbSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBmcm9tIHRoZSBnaXZlbiBzcHJpbmcgeG1sIGZpbGUgaW50byB0aGUgc2VydmVyIGZvciB3aGljaCB0aGUgZ2l2ZW4gY2xpZW50IGNvbm5lY3RzIi8+ICAgICAgICAKKyAgICA8L2JlYW4+CisgICAgPGJlYW4gaWQ9ImdldF9jYXRhbG9nX2lkcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuYWN0aW9uLkdldFN1cHBvcnRlZENhdGFsb2dJZHMiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGEgbGlzdCBvZiBzdXBwb3J0ZWQgY2F0YWxvZyBpZHMgZnJvbSB0aGUgc2VydmVyIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiLz4gICAgICAgIAorICAgIDwvYmVhbj4KKyAgICAKKzwvYmVhbnM+CisKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NhdHNlcnYtY2xpZW50LWNtZC1saW5lLWJlYW5zLnhtbCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NhdHNlcnYtY2xpZW50LWNtZC1saW5lLWJlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdmMTkxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1jbGllbnQtY21kLWxpbmUtYmVhbnMueG1sCkBAIC0wLDAgKzEsMzAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorICAgIAorICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcucG9zdHByb2Nlc3Nvci5TZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIi8+CisgICAgCisgICAgPCEtLSBDQVMtQ2F0YWxvZyBDbWQtTGluZS1PcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJhY3Rpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImEiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhY3Rpb24iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVGhlIENhdGFsb2dTZXJ2aWNlIEFjdGlvbiBCZWFuIHRvIHJ1biIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbkFyZ05hbWUiIHZhbHVlPSJiZWFuIGlkIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiLz4KKyAgICA8L2JlYW4+CisgICAgCisgICAgPGJlYW4gaWQ9ImNsaWVudEZhY3RvcnlCZWFuSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImNmYiIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNsaWVudEZhY3RvcnlCZWFuSWQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2F0YWxvZ1NlcnZpY2VDbGllbnRGYWN0b3J5IEJlYW4gSWQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25BcmdOYW1lIiB2YWx1ZT0iYmVhbiBpZCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIi8+CisgICAgPC9iZWFuPgorICAgIAorICAgIDxiZWFuIGlkPSJxdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5DbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InF1ZXJ5Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNhdGFsb2dTZXJ2aWNlIFN0cmluZyBRdWVyeSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbkFyZ05hbWUiIHZhbHVlPSJxdWVyeSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWRPcHRpb25zIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24ucmVxdWlyZWQuUmVxdWlyZWRPcHRpb24iPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uTG9uZ05hbWUiIHZhbHVlPSJhY3Rpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVBbGxWYWx1ZXMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uVmFsdWVzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5xdWVyeV9hbGw8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yZWR1Y2VkX3F1ZXJ5X2FsbDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnF1ZXJ5X3BhZ2VkPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmVkdWNlZF9xdWVyeV9wYWdlZDwvdmFsdWU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkNtZExpbmVPcHRpb25CZWFuSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9CZWFucyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YmVhbi1yZWY9InF1ZXJ5X2FsbCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YmVhbi1yZWY9InJlZHVjZWRfcXVlcnlfYWxsIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQmVhbkluZm8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpiZWFuLXJlZj0icXVlcnlfcGFnZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uaGFuZGxlci5CZWFuSW5mbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmJlYW4tcmVmPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIi8+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0icGFnZVNpemUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icGFnZVNpemUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUGFnZWQgUXVlcnkgUGFnZVNpemUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25BcmdOYW1lIiB2YWx1ZT0iaW50ZWdlciIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWRPcHRpb25zIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24ucmVxdWlyZWQuUmVxdWlyZWRPcHRpb24iPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uTG9uZ05hbWUiIHZhbHVlPSJhY3Rpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVBbGxWYWx1ZXMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uVmFsdWVzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5xdWVyeV9wYWdlZDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnJlZHVjZWRfcXVlcnlfcGFnZWQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkNtZExpbmVPcHRpb25CZWFuSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9CZWFucyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YmVhbi1yZWY9InF1ZXJ5X3BhZ2VkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQmVhbkluZm8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpiZWFuLXJlZj0icmVkdWNlZF9xdWVyeV9wYWdlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisgICAgCisgICAgPGJlYW4gaWQ9InBhZ2VOdW0iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBuIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icGFnZU51bSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQYWdlZCBRdWVyeSBQYWdlTnVtIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uQXJnTmFtZSIgdmFsdWU9ImludGVnZXIiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJpbnQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkT3B0aW9ucyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLnJlcXVpcmVkLlJlcXVpcmVkT3B0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbkxvbmdOYW1lIiB2YWx1ZT0iYWN0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlQWxsVmFsdWVzIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvblZhbHVlcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cXVlcnlfcGFnZWQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yZWR1Y2VkX3F1ZXJ5X3BhZ2VkPC92YWx1ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQ21kTGluZU9wdGlvbkJlYW5IYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0JlYW5zIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQmVhbkluZm8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpiZWFuLXJlZj0icXVlcnlfcGFnZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uaGFuZGxlci5CZWFuSW5mbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmJlYW4tcmVmPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIi8+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0icmVkdWNlZFRlcm1zIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLkNtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJydCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlZHVjZWRUZXJtcyIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUZXJtIGZpbHRlciBmb3IgcXVlcnkgcmVzdWx0cyIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbkFyZ05hbWUiIHZhbHVlPSJsaXN0Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiLz4gICAgICAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWRPcHRpb25zIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24ucmVxdWlyZWQuUmVxdWlyZWRPcHRpb24iPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uTG9uZ05hbWUiIHZhbHVlPSJhY3Rpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVBbGxWYWx1ZXMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uVmFsdWVzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yZWR1Y2VkX3F1ZXJ5X2FsbDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnJlZHVjZWRfcXVlcnlfcGFnZWQ8L3ZhbHVlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uaGFuZGxlci5DbWRMaW5lT3B0aW9uQmVhbkhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQmVhbnMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uaGFuZGxlci5CZWFuSW5mbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmJlYW4tcmVmPSJyZWR1Y2VkX3F1ZXJ5X2FsbCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YmVhbi1yZWY9InJlZHVjZWRfcXVlcnlfcGFnZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorICAgIAorICAgIDxiZWFuIGlkPSJiZWFuSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImJpZCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImJlYW5JZCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJTcHJpbmcgQmVhbiBJZCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbkFyZ05hbWUiIHZhbHVlPSJiZWFuIGlkIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZE9wdGlvbnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5yZXF1aXJlZC5SZXF1aXJlZE9wdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25Mb25nTmFtZSIgdmFsdWU9ImFjdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZUFsbFZhbHVlcyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25WYWx1ZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmxvYWRfY2F0YWxvZ19yZXBvPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uaGFuZGxlci5DbWRMaW5lT3B0aW9uQmVhbkhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQmVhbnMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uaGFuZGxlci5CZWFuSW5mbyIgcDpiZWFuLXJlZj0ibG9hZF9jYXRhbG9nX3JlcG8iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorICAgIAorICAgIDxiZWFuIGlkPSJjYXRhbG9nSWRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLkNtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjaWQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJjYXRhbG9nSWRzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgQ2F0YWxvZyBJRHMgdG8gcXVlcnkiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25BcmdOYW1lIiB2YWx1ZT0iY2F0YWxvZyBpZHMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQ21kTGluZU9wdGlvbkJlYW5IYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0JlYW5zIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQmVhbkluZm8iIHA6YmVhbi1yZWY9InF1ZXJ5X2FsbCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIiBwOmJlYW4tcmVmPSJyZWR1Y2VkX3F1ZXJ5X2FsbCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIiBwOmJlYW4tcmVmPSJxdWVyeV9wYWdlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIiBwOmJlYW4tcmVmPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIi8+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0iYmVhblJlcG8iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImJyIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iYmVhblJlcG8iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iU3ByaW5nIEJlYW4gWE1MIEZpbGUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25BcmdOYW1lIiB2YWx1ZT0iZmlsZSBwYXRoIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZE9wdGlvbnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5yZXF1aXJlZC5SZXF1aXJlZE9wdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25Mb25nTmFtZSIgdmFsdWU9ImFjdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZUFsbFZhbHVlcyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25WYWx1ZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmxvYWRfY2F0YWxvZ3M8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5sb2FkX2NhdGFsb2dfcmVwbzwvdmFsdWU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkNtZExpbmVPcHRpb25CZWFuSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9CZWFucyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5oYW5kbGVyLkJlYW5JbmZvIiBwOmJlYW4tcmVmPSJsb2FkX2NhdGFsb2dzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLmhhbmRsZXIuQmVhbkluZm8iIHA6YmVhbi1yZWY9ImxvYWRfY2F0YWxvZ19yZXBvIi8+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0icHJpbnRTdXBwb3J0ZWRBY3Rpb25zIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub3B0aW9uLkNtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwc2EiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmludFN1cHBvcnRlZEFjdGlvbnMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnRzIGEgbGlzdCBhbmQgZGVzY3JpcHRpb24gb2YgYWxsIHN1cHBvcnRlZCBDYXRhbG9nU2VydmljZVNlcnZlckFjdGlvbnMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGVyZm9ybUFuZFF1aXQiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLm9wdGlvbi5QcmludFN1cHBvcnRlZEFjdGlvbnNIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmVhblJlcG8iIHZhbHVlPSIvJHtjYXRhbG9nLmhvbWV9L3BvbGljeS9jYXRzZXJ2LWNsaWVudC1jb25maWcueG1sIi8+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorICAgIAorICAgIDxiZWFuIGlkPSJwcmludFN1cHBvcnRlZENsaWVudHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBzYyIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW50U3VwcG9ydGVkQ2xpZW50cyIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludHMgYSBsaXN0IGFuZCBkZXNjcmlwdGlvbiBvZiBhbGwgc3VwcG9ydGVkIENhdGFsb2dTZXJ2aWNlQ2xpZW50RmFjdG9yaWVzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InBlcmZvcm1BbmRRdWl0IiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnNlcnZlci5vcHRpb24uUHJpbnRTdXBwb3J0ZWRDbGllbnRzSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJlYW5SZXBvIiB2YWx1ZT0iLyR7Y2F0YWxvZy5ob21lfS9wb2xpY3kvY2F0c2Vydi1jbGllbnQtY29uZmlnLnhtbCIvPgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKyAgICAKKzwvYmVhbnM+CisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1jbGllbnQtY29uZmlnLnhtbCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NhdHNlcnYtY2xpZW50LWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwMjgxYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NhdHNlcnYtY2xpZW50LWNvbmZpZy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKyAgICAKKyAgICA8aW1wb3J0IHJlc291cmNlPSJjYXRzZXJ2LXByb3BlcnRpZXMueG1sIi8+CisgICAgPGltcG9ydCByZXNvdXJjZT0iY2F0c2Vydi1iZWFucy54bWwiLz4KKyAgICA8aW1wb3J0IHJlc291cmNlPSJjYXRzZXJ2LWNsaWVudC1hY3Rpb24tYmVhbnMueG1sIi8+CisgICAgPGltcG9ydCByZXNvdXJjZT0iY2F0c2Vydi1jbGllbnQtY21kLWxpbmUtYmVhbnMueG1sIi8+CisgICAgCis8L2JlYW5zPgorCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LXByb3BlcnRpZXMueG1sIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1wcm9wZXJ0aWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI2MjVjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1wcm9wZXJ0aWVzLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorICAgIAorICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cudXRpbC5DYXNQcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlciI+CisgICAgICAgIAorICAgICAgICA8IS0tIEFsbG93IGZvciBzeXN0ZW0tbGV2ZWwgcHJvcGVydGllcyB0byBvdmVycmlkZSBhbGwgcHJvcGVydGllcyBiZWxvdyAtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN5c3RlbVByb3BlcnRpZXNNb2RlIiB2YWx1ZT0iMiIvPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQcm9wZXJ0aWVzIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICA8cHJvcHM+CisgICAgICAgICAgICAgICAgPHByb3Aga2V5PSJjYXRhbG9nLnVybCI+W0NBVEFMT0dfVVJMXTtodHRwOi8vbG9jYWxob3N0OjEwMDAwPC9wcm9wPiAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPHByb3Aga2V5PSJjYXRhbG9nLnBvcnQiPltDQVRBTE9HX1BPUlRdOzEwMDAwPC9wcm9wPiAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPHByb3Aga2V5PSJwY3Muc3VwcG9ydC5ob21lIj5bUENTX1NVUFBPUlRfSE9NRV07L3RtcDwvcHJvcD4gICAgICAgCisgICAgICAgICAgICAgICAgPCEtLXByb3Aga2V5PSJmaWxlbWdyLmhvbWUiPltGSUxFTUdSX0hPTUVdOy90bXA8L3Byb3AtLT4gICAgICAgICAgIAorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0id29ya2Zsb3dtZ3IuaG9tZSI+W1dPUktGTE9XTUdSX0hPTUVdOy90bXA8L3Byb3A+ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8cHJvcCBrZXk9ImNhdGFsb2cuaG9tZSI+W0NBVEFMT0dfSE9NRV07L3RtcDwvcHJvcD4gICAgICAgICAgIAorICAgICAgICAgICAgPC9wcm9wcz4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgCisgICAgPC9iZWFuPgorICAgIAorPC9iZWFucz4KKwpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1zZXJ2ZXItY21kLWxpbmUtYmVhbnMueG1sIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY2F0c2Vydi1zZXJ2ZXItY21kLWxpbmUtYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjczOTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LXNlcnZlci1jbWQtbGluZS1iZWFucy54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcucG9zdHByb2Nlc3Nvci5TZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIi8+CisKKyAgICA8IS0tIENBUy1DYXRhbG9nIENtZC1MaW5lLU9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9InNlcnZlckZhY3RvcnlCZWFuSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vcHRpb24uQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNmYiIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InNlcnZlckZhY3RvcnlCZWFuSWQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3J5IEJlYW4gSWQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25BcmdOYW1lIiB2YWx1ZT0iYmVhbiBpZCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIi8+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9InByaW50U3VwcG9ydGVkU2VydmVycyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLm9wdGlvbi5DbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHNzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnRTdXBwb3J0ZWRTZXJ2ZXJzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50cyBhIGxpc3QgYW5kIGRlc2NyaXB0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgQ29tbXVuaWNhdGlvbkNoYW5uZWxTZXJ2ZXJGYWN0b3JpZXMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGVyZm9ybUFuZFF1aXQiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2VydmVyLm9wdGlvbi5QcmludFN1cHBvcnRlZFNlcnZlcnNIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmVhblJlcG8iIHZhbHVlPSIvJHtjYXRhbG9nLmhvbWV9L3BvbGljeS9jYXRzZXJ2LXNlcnZlci1jb25maWcueG1sIi8+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCis8L2JlYW5zPgorCisKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NhdHNlcnYtc2VydmVyLWNvbmZpZy54bWwgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LXNlcnZlci1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjkyOTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jYXRzZXJ2LXNlcnZlci1jb25maWcueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisgICAgCisgICAgPGltcG9ydCByZXNvdXJjZT0iY2F0c2Vydi1wcm9wZXJ0aWVzLnhtbCIvPgorICAgIDxpbXBvcnQgcmVzb3VyY2U9ImNhdHNlcnYtYmVhbnMueG1sIi8+CisgICAgPGltcG9ydCByZXNvdXJjZT0iY2F0c2Vydi1zZXJ2ZXItY21kLWxpbmUtYmVhbnMueG1sIi8+CisgICAgCis8L2JlYW5zPgorCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTZmODgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLnNwcmluZy5wb3N0cHJvY2Vzc29yLlNldElkQmVhblBvc3RQcm9jZXNzb3IiIC8+CisKKyAgPCEtLSBDb21tYW5kIExpbmUgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0ic2h1dGRvd24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY2xpLmFjdGlvbi5TaHV0ZG93bkNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlNodXRzIGRvd24gdGhlIHNlcnZlciBmb3Igd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9InF1ZXJ5X2FsbCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jbGkuYWN0aW9uLlF1ZXJ5Q2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUGVyZm9ybXMgYSB1bi1wYWdlZCBxdWVyeSB0byB0aGUgc2VydmVyIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJyZWR1Y2VkX3F1ZXJ5X2FsbCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jbGkuYWN0aW9uLlJlZHVjZWRRdWVyeUNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlBlcmZvcm1zIGEgdW4tcGFnZWQgcXVlcnkgdG8gdGhlIHNlcnZlciB3aGljaCB0aGUgZ2l2ZW4gY2xpZW50IGNvbm5lY3RzIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0icXVlcnlfcGFnZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY2xpLmFjdGlvbi5QYWdlZFF1ZXJ5Q2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUGVyZm9ybXMgYSBwYWdlZCBxdWVyeSB0byB0aGUgc2VydmVyIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb24uUmVkdWNlZFBhZ2VkUXVlcnlDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQZXJmb3JtcyBhIHBhZ2VkIHF1ZXJ5IHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImxvYWRfY2F0YWxvZ3MiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY2xpLmFjdGlvbi5Mb2FkQ2F0YWxvZ3NDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJMb2FkcyB0aGUgY2F0YWxvZ3MgZnJvbSB0aGUgZ2l2ZW4gc3ByaW5nIHhtbCBmaWxlIGludG8gdGhlIHNlcnZlciBmb3Igd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImxvYWRfY2F0YWxvZ19yZXBvIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmNsaS5hY3Rpb24uTG9hZENhdGFsb2dSZXBvc2l0b3J5Q2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTG9hZHMgdGhlIGNhdGFsb2dzIGZyb20gdGhlIGdpdmVuIHJlcG9zaXRvcnkgZnJvbSB0aGUgZ2l2ZW4gc3ByaW5nIHhtbCBmaWxlIGludG8gdGhlIHNlcnZlciBmb3Igd2hpY2ggdGhlIGdpdmVuIGNsaWVudCBjb25uZWN0cyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldF9jYXRhbG9nX2lkcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jbGkuYWN0aW9uLkdldFN1cHBvcnRlZENhdGFsb2dJZHNDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGEgbGlzdCBvZiBzdXBwb3J0ZWQgY2F0YWxvZyBpZHMgZnJvbSB0aGUgc2VydmVyIHdoaWNoIHRoZSBnaXZlbiBjbGllbnQgY29ubmVjdHMiIC8+CisJPC9iZWFuPgorCis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyNTNlZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sCkBAIC0wLDAgKzEsMzE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisgIDxiZWFuIGlkPSJ1cmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ1IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idXJsIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlNlcnZlciBVUkwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy51cmw8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgIDx2YWx1ZT5odHRwOi8vLio6XGQqPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8L2JlYW4+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJjaHVua1NpemUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNodW5rU2l6ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJYTUwtUlBDIGRhdGEgY2h1bmsgc2l6ZSBpbiBieXRlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5jaHVua1NpemU8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlcXVlc3RUaW1lb3V0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icnF0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVxdWVzdFRpbWVvdXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iWE1MLVJQQyByZXF1ZXN0IHRpbWVvdXQgaW4gc2Vjb25kcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXF1ZXN0VGltZW91dDwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iY29ubmVjdGlvblRpbWVvdXQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNvbm5lY3Rpb25UaW1lb3V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlhNTC1SUEMgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJpbnQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eU5hbWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY29ubmVjdGlvblRpbWVvdXQ8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKwk8YmVhbiBpZD0icXVlcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJxdWVyeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2F0YWxvZ1NlcnZpY2UgU3RyaW5nIFF1ZXJ5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJxdWVyeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icXVlcnlfYWxsIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVkdWNlZF9xdWVyeV9hbGwiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJxdWVyeV9wYWdlZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfcGFnZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InF1ZXJ5X2FsbCIgLz4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfYWxsIiAvPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icXVlcnlfcGFnZWQiIC8+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwYWdlU2l6ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwYWdlU2l6ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUGFnZWQgUXVlcnkgUGFnZVNpemUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImludGVnZXIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iaW50IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJxdWVyeV9wYWdlZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfcGFnZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InF1ZXJ5X3BhZ2VkIiAvPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVkdWNlZF9xdWVyeV9wYWdlZCIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0icGFnZU51bSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwYWdlTnVtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQYWdlZCBRdWVyeSBQYWdlTnVtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJpbnRlZ2VyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icXVlcnlfcGFnZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZWR1Y2VkX3F1ZXJ5X3BhZ2VkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJxdWVyeV9wYWdlZCIgLz4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfcGFnZWQiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InJlZHVjZWRUZXJtcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJydCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWR1Y2VkVGVybXMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRlcm0gZmlsdGVyIGZvciBxdWVyeSByZXN1bHRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJsaXN0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZWR1Y2VkX3F1ZXJ5X2FsbCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfcGFnZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfYWxsIiAvPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVkdWNlZF9xdWVyeV9wYWdlZCIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iY2F0YWxvZ1JlcG9zaXRvcnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjcmlkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNhdGFsb2dSZXBvc2l0b3J5SWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNhdGFsb2dSZXBvc2l0b3J5IFNwcmluZyBCZWFuIElkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJiZWFuIGlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsb2FkX2NhdGFsb2dfcmVwbyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibG9hZF9jYXRhbG9nX3JlcG8iIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImNhdGFsb2dJZHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY2lkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNhdGFsb2dJZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgQ2F0YWxvZyBJRHMgdG8gcXVlcnkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNhdGFsb2cgaWRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJxdWVyeV9hbGwiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZWR1Y2VkX3F1ZXJ5X2FsbCIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InF1ZXJ5X3BhZ2VkIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVkdWNlZF9xdWVyeV9wYWdlZCIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icXVlcnlfYWxsIiAvPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVkdWNlZF9xdWVyeV9hbGwiIC8+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJxdWVyeV9wYWdlZCIgLz4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlZHVjZWRfcXVlcnlfcGFnZWQiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImJlYW5SZXBvIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImJyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImJlYW5SZXBvIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJTcHJpbmcgQmVhbiBYTUwgRmlsZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZSBwYXRoIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsb2FkX2NhdGFsb2dzIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibG9hZF9jYXRhbG9nX3JlcG8iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxvYWRfY2F0YWxvZ3MiIC8+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsb2FkX2NhdGFsb2dfcmVwbyIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtc2VydmVyLWFjdGlvbnMueG1sIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtc2VydmVyLWFjdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODM1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1zZXJ2ZXItYWN0aW9ucy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcucG9zdHByb2Nlc3Nvci5TZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIiAvPgorCisgIDwhLS0gQ29tbWFuZCBMaW5lIEFjdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImxhdW5jaFhtbFJwY1NlcnZlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zZXJ2ZXIuY2xpLmFjdGlvbi5MYXVuY2hYbWxScGNTZXJ2ZXJDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJCcmluZ3MgdXAgYSBDYXRhbG9nIFNlcnZpY2UgYmVoaW5kIGFuIFhNTC1SUEMgc2VydmVyIiAvPgorCTwvYmVhbj4KKworPC9iZWFucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1zZXJ2ZXItb3B0aW9ucy54bWwgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1zZXJ2ZXItb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4YjEzOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLXNlcnZlci1vcHRpb25zLnhtbApAQCAtMCwwICsxLDIwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworICA8YmVhbiBpZD0icG9ydCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwb3J0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlBvcnQgbnVtYmVyIHRvIGJyaW5nIHVwIHNlcnZlciBvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5TZXRKYXZhUHJvcGVydGllc0hhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydHlOYW1lcyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBvcnQ8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgIDx2YWx1ZT5cZCs8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDwvYmVhbj4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InRyYW5zYWN0aW9uSWRGYWN0b3J5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idGlkZiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InRyYW5zYWN0aW9uSWRGYWN0b3J5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyYW5zYWN0aW9uSWRGYWN0b3J5IGNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy50cmFuc2FjdGlvbmlkPC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJyZXBvc2l0b3J5RmFjdG9yeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJmIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVwb3NpdG9yeUZhY3RvcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5IGNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXBvc2l0b3J5PC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJpbmdlc3RNYXBwZXJGYWN0b3J5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iaW1mIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaW5nZXN0TWFwcGVyRmFjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJJbmdlc3RNYXBwZXJGYWN0b3J5IGNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5pbmdlc3RtYXBwZXI8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlc3RyaWN0UXVlcmllcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJxIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVzdHJpY3RRdWVyaWVzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJlc3RyaWN0IHF1ZXJ5IHBlcm1pc3Npb25zIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eU5hbWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucmVzdHJpY3QucXVlcnkucGVybWlzc2lvbnM8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlc3RyaWN0SW5nZXN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icmkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXN0cmljdEluZ2VzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSZXN0cmljdCBpbmdlc3QgcGVybWlzc2lvbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5yZXN0cmljdC5pbmdlc3QucGVybWlzc2lvbnM8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Im9uZUNhdGFsb2dGYWlsc0FsbEZhaWwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJvZmFmIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib25lQ2F0YWxvZ0ZhaWxzQWxsRmFpbCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5vbmVDYXRhbG9nRmFpbHNBbGxGYWlsPC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJzaW1wbGlmeVF1ZXJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic3EiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzaW1wbGlmeVF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IldpbGwgb3B0aW1pemUgeW91ciBxdWVyeSBpZiB0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eU5hbWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc2ltcGxpZnlRdWVyaWVzPC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJkaXNhYmxlQ3Jvc3NDYXRhbG9nSm9pbnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkY2NqIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZGlzYWJsZUNyb3NzQ2F0YWxvZ0pvaW5zIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IldpbGwgZGlzYWJsZSBxdWVyaWVzIGZyb20gam9pbmluZyBtZXRhZGF0YSB0aGF0IGhhcyBiZWVuIHNwbGl0IGFjcm9zcyBtdWx0aXBsZSBjYXRhbG9ncyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5TZXRKYXZhUHJvcGVydGllc0hhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydHlOYW1lcyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLmRpc2FibGVJbnRlcnNlY3RpbmdDcm9zc0NhdGFsb2dRdWVyaWVzPC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJzb3J0aW5nVGhyZXNob2xkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzb3J0aW5nVGhyZXNob2xkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRocmVzaG9sZCBvZiBxdWVyeSByZXN1bHRzIGF0IHdoaWNoIHNvcnRpbmcgaXMgdHVybmVkIG9mZiBzbyBxdWVyeSByZXR1cm4gdGltZSBjYW4gYmUgb3B0aW1pemVkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eU5hbWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuY3Jvc3NDYXRhbG9nUmVzdWx0U29ydGluZ1RocmVzaG9sZDwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9pbi1tZW1vcnktaW5kZXgtY2F0LnNxbCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2luLW1lbW9yeS1pbmRleC1jYXQuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9pbi1tZW1vcnktaW5kZXgtY2F0LnNxbApAQCAtMCwwICsxLDMyIEBACisgLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIC0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAtLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIC0tCisgLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIC0tCisgLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIC0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIC0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIAorRFJPUCBUQUJMRSB0cmFuc2FjdGlvbnMgSUYgRVhJU1RTOworRFJPUCBUQUJMRSB0cmFuc2FjdGlvbl90ZXJtcyBJRiBFWElTVFM7CisKK0NSRUFURSBUQUJMRSB0cmFuc2FjdGlvbnMKKygKKyAgdHJhbnNhY3Rpb25faWQgdmFyY2hhcigyNTYpIE5PVCBOVUxMLAorICB0cmFuc2FjdGlvbl9kYXRlIHZhcmNoYXIoMjU2KSBOT1QgTlVMTAorKTsKKworQ1JFQVRFIFRBQkxFIHRyYW5zYWN0aW9uX3Rlcm1zCisoCisgIHRyYW5zYWN0aW9uX2lkIHZhcmNoYXIoMjU2KSBOT1QgTlVMTCwKKyAgYnVja2V0X25hbWUgdmFyY2hhcigyNTYpIE5PVCBOVUxMLAorICB0ZXJtX25hbWUgdmFyY2hhcigyNTYpIE5PVCBOVUxMLAorICB0ZXJtX3ZhbHVlIHZhcmNoYXIoMTAwMCkgTk9UIE5VTEwKKyk7CisKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2luLW1lbW9yeS1pbmdlc3QtbWFwcGVyLnNxbCBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2luLW1lbW9yeS1pbmdlc3QtbWFwcGVyLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFhMzZlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvaW4tbWVtb3J5LWluZ2VzdC1tYXBwZXIuc3FsCkBAIC0wLDAgKzEsMjYgQEAKKyAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAtLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAtLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgLS0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAtLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIC0tIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgLS0KKyAtLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgLS0KKyAtLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgLS0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAtLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAtLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgLS0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgCitEUk9QIFRBQkxFIENhdGFsb2dTZXJ2aWNlTWFwcGVyIElGIEVYSVNUUzsKKworQ1JFQVRFIFRBQkxFIENhdGFsb2dTZXJ2aWNlTWFwcGVyICgKKyAgQ0FUX1NFUlZfVFJBTlNfSUQgVkFSQ0hBUigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1NFUlZfVFJBTlNfRkFDVE9SWSBWQVJDSEFSKDI1NSkgTk9UIE5VTEwgLAorICBDQVRfVFJBTlNfSUQgVkFSQ0hBUigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1RSQU5TX0ZBQ1RPUlkgVkFSQ0hBUigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1RSQU5TX0RBVEUgVkFSQ0hBUigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUQUxPR19JRCBWQVJDSEFSKDI1NSkgTk9UIE5VTEwKKyk7CisKZGlmZiAtLWdpdCBhLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3dvcmtmbG93LWNhdGFsb2ctYmVhbnMueG1sIGIvMC4xMC9jYXRhbG9nL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvd29ya2Zsb3ctY2F0YWxvZy1iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0MWI4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3dvcmtmbG93LWNhdGFsb2ctYmVhbnMueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisgICAgCisgICAgPGJlYW4gaWQ9IldvcmtmbG93TWFuYWdlckNhdGFsb2ciIGZhY3RvcnktYmVhbj0iV29ya2Zsb3dNYW5hZ2VyQ2F0YWxvZ0ZhY3RvcnkiIGZhY3RvcnktbWV0aG9kPSJjcmVhdGVDYXRhbG9nIi8+CisgICAgPGJlYW4gaWQ9IldvcmtmbG93TWFuYWdlckNhdGFsb2dGYWN0b3J5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nRmFjdG9yeSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbG9nSWQiIHZhbHVlPSJ1cm46UEVBVEU6V29ya2Zsb3dJbnN0YW5jZXNDYXRhbG9nIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmRleEZhY3RvcnkiIHJlZj0iV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4RmFjdG9yeSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGljdGlvbmFyeUZhY3RvcmllcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8cmVmIGJlYW49IldvcmtmbG93TWFuYWdlckRpY3Rpb25hcnlGYWN0b3J5Ii8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyIgdmFsdWU9ImZhbHNlIi8+CisgICAgPC9iZWFuPgorICAgIAorICAgIDwhLS0gV29ya2Zsb3dNYW5hZ2VyIEluZGV4ZXMgLS0+CisgICAgPGJlYW4gaWQ9IldvcmtmbG93TWFuYWdlckRhdGFTb3VyY2VJbmRleEZhY3RvcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwuaW5kZXguV29ya2Zsb3dNYW5hZ2VyRGF0YVNvdXJjZUluZGV4RmFjdG9yeSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqZGJjVXJsIiB2YWx1ZT0iamRiYzpvcmFjbGU6dGhpbjpAZGV3LmpwbC5uYXNhLmdvdjoxNTIxOm5wcHRlc3QiLz4gICAgICAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlciIgdmFsdWU9Im5wcGludCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFzcyIgdmFsdWU9IlBlYXRlIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkcml2ZXIiIHZhbHVlPSJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIi8+CisgICAgPC9iZWFuPgorICAgIDxiZWFuIGlkPSJJbk1lbW9yeUluZGV4RmFjdG9yeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC5pbmRleC5Jbk1lbW9yeUluZGV4RmFjdG9yeSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqZGJjVXJsIiB2YWx1ZT0iamRiYzpoc3FsZGI6ZmlsZToke3Bjcy5zdXBwb3J0LmhvbWV9L2hzcWxkYjtzaHV0ZG93bj10cnVlIi8+ICAgICAgICAKKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZXIiIHZhbHVlPSJzYSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFzcyIgdmFsdWU9IiIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZHJpdmVyIiB2YWx1ZT0ib3JnLmhzcWxkYi5qZGJjRHJpdmVyIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJsZXNGaWxlIiB2YWx1ZT0iJHt3b3JrZmxvd21nci5ob21lfS9wb2xpY3kvaW4tbWVtb3J5LWluZGV4LWNhdC5zcWwiLz4KKyAgICA8L2JlYW4+CisgICAgCisgICAgPCEtLSBXb3JrZmxvd01hbmFnZXIgRGljdGlvbmFyeSAtLT4KKyAgICA8YmVhbiBpZD0iV29ya2Zsb3dNYW5hZ2VyRGljdGlvbmFyeUZhY3RvcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cuc3RydWN0LmltcGwuZGljdGlvbmFyeS5Xb3JrZmxvd01hbmFnZXJEaWN0aW9uYXJ5RmFjdG9yeSIvPgorICAgIAorPC9iZWFucz4KKworCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL2ltcGwvVGVzdENhdGFsb2dTZXJ2aWNlTG9jYWwuamF2YSBiLzAuMTAvY2F0YWxvZy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2F0YWxvZy9zeXN0ZW0vaW1wbC9UZXN0Q2F0YWxvZ1NlcnZpY2VMb2NhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGFhZjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NhdGFsb2cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NhdGFsb2cvc3lzdGVtL2ltcGwvVGVzdENhdGFsb2dTZXJ2aWNlTG9jYWwuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zeXN0ZW0uaW1wbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5leGNlcHRpb24uQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLm1hcHBpbmcuSW5NZW1vcnlJbmdlc3RNYXBwZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5tZXRhZGF0YS5UcmFuc2FjdGlvbmFsTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnBhZ2UuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5QYWdlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucGFnZS5RdWVyeVBhZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5wYWdlLlRyYW5zYWN0aW9uUmVjZWlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkuUXVlcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5xdWVyeS5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnF1ZXJ5LnBhcnNlci5RdWVyeVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNhdGFsb2cucXVlcnkucGFyc2VyLlRva2VuTWdyRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnJlcG9zaXRvcnkuTWVtb3J5QmFzZWRDYXRhbG9nUmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5pbXBsLmluZGV4LkRhdGFTb3VyY2VJbmRleEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN0cnVjdC5pbXBsLmluZGV4LkluTWVtb3J5SW5kZXhGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2F0YWxvZy5zdHJ1Y3QuaW1wbC50cmFuc2FjdGlvbi5VdWlkVHJhbnNhY3Rpb25JZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jYXRhbG9nLnN5c3RlbS5DYXRhbG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RDYXRhbG9nU2VydmljZUxvY2FsIGV4dGVuZHMgVGVzdENhc2UgeworCisJcHJpdmF0ZSBDYXRhbG9nU2VydmljZUxvY2FsIGNzOworCXByaXZhdGUgRmlsZSB0ZXN0RGlyOworCQorCXB1YmxpYyB2b2lkIHNldFVwKCkgeworCQl0cnkgeworCQkJRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZvbyIsICJiYXIiKTsKKwkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQkJdGVzdERpciA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgImNhcy1jYXRhbG9nIik7CisJCisJCQlDYXRhbG9nU2VydmljZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IENhdGFsb2dTZXJ2aWNlTG9jYWxGYWN0b3J5KCk7CisJCQlmYWN0b3J5CisJCQkJCS5zZXRDYXRhbG9nUmVwb3NpdG9yeUZhY3RvcnkobmV3IE1lbW9yeUJhc2VkQ2F0YWxvZ1JlcG9zaXRvcnlGYWN0b3J5KCkpOworCQkJZmFjdG9yeS5zZXRJbmdlc3RNYXBwZXJGYWN0b3J5KHRoaXMKKwkJCQkJLmdldE9yYWNsZUluZ2VzdE1hcHBlckZhY3RvcnkodGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvbWFwcGVyIikpOworCQkJZmFjdG9yeS5zZXRPbmVDYXRhbG9nRmFpbHNBbGxGYWlsKHRydWUpOworCQkJZmFjdG9yeS5zZXRTaW1wbGlmeVF1ZXJpZXModHJ1ZSk7CisJCQlmYWN0b3J5LnNldFBsdWdpblN0b3JhZ2VEaXIoIi9kZXYvbnVsbCIpOworCQkJZmFjdG9yeS5zZXRSZXN0cmljdEluZ2VzdFBlcm1pc3Npb25zKGZhbHNlKTsKKwkJCWZhY3Rvcnkuc2V0UmVzdHJpY3RRdWVyeVBlcm1pc3Npb25zKGZhbHNlKTsKKwkJCWZhY3Rvcnkuc2V0VHJhbnNhY3Rpb25JZEZhY3RvcnkoVXVpZFRyYW5zYWN0aW9uSWRGYWN0b3J5LmNsYXNzCisJCQkJCS5nZXRDYW5vbmljYWxOYW1lKCkpOworCQkJY3MgPSBmYWN0b3J5LmNyZWF0ZUNhdGFsb2dTZXJ2aWNlKCk7CisJCisJCQlDYXRhbG9nRmFjdG9yeSBjYXRhbG9nRmFjdG9yeSA9IG5ldyBDYXRhbG9nRmFjdG9yeSgpOworCQkJY2F0YWxvZ0ZhY3Rvcnkuc2V0Q2F0YWxvZ0lkKCJUZXN0Q2F0YWxvZzEiKTsKKwkJCWNhdGFsb2dGYWN0b3J5LnNldERpY3Rpb25hcnlGYWN0b3JpZXMobnVsbCk7CisJCQljYXRhbG9nRmFjdG9yeQorCQkJCQkuc2V0SW5kZXhGYWN0b3J5KGdldEluTWVtb3J5RFNGYWN0b3J5KHRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2luZGV4LzEvIikpOworCQkJY2F0YWxvZ0ZhY3Rvcnkuc2V0UmVzdHJpY3RJbmdlc3RQZXJtaXNzaW9ucyhmYWxzZSk7CisJCQljYXRhbG9nRmFjdG9yeS5zZXRSZXN0cmljdFF1ZXJ5UGVybWlzc2lvbnMoZmFsc2UpOworCQkJY3MuYWRkQ2F0YWxvZyhjYXRhbG9nRmFjdG9yeS5jcmVhdGVDYXRhbG9nKCkpOworCQkJY2F0YWxvZ0ZhY3Rvcnkuc2V0Q2F0YWxvZ0lkKCJUZXN0Q2F0YWxvZzIiKTsKKwkJCWNhdGFsb2dGYWN0b3J5CisJCQkJCS5zZXRJbmRleEZhY3RvcnkoZ2V0SW5NZW1vcnlEU0ZhY3RvcnkodGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvaW5kZXgvMi8iKSk7CisJCQljcy5hZGRDYXRhbG9nKGNhdGFsb2dGYWN0b3J5LmNyZWF0ZUNhdGFsb2coKSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlUZXN0Q2FzZS5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKwkJdHJ5IHsKKwkJCUZpbGVVdGlscy5mb3JjZURlbGV0ZSh0aGlzLnRlc3REaXIpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJVGVzdENhc2UuZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RGF0YVNvdXJjZUNhdGFsb2dJbmdlc3RRdWVyeUFuZERlbGV0ZSgpCisJCQl0aHJvd3MgQ2F0YWxvZ1NlcnZpY2VFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBUb2tlbk1nckVycm9yIHsKKwkJLy8gdGVzdCBpbmdlc3QKKwkJTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworCQltLmFkZE1ldGFkYXRhKCJ0ZXN0a2V5MSIsICJ0ZXN0dmFsMSIpOworCQlUcmFuc2FjdGlvblJlY2VpcHQgdHIgPSBjcy5pbmdlc3QobSk7CisJCVZlY3RvcjxUcmFuc2FjdGlvblJlY2VpcHQ+IHJlY2VpcHRzID0gbmV3IFZlY3RvcjxUcmFuc2FjdGlvblJlY2VpcHQ+KCk7CisJCXJlY2VpcHRzLmFkZCh0cik7CisJCUxpc3Q8VHJhbnNhY3Rpb25hbE1ldGFkYXRhPiBtZXRhZGF0YXMgPSBjcy5nZXRNZXRhZGF0YShyZWNlaXB0cyk7CisJCWFzc2VydEVxdWFscyhtZXRhZGF0YXMuc2l6ZSgpLCAxKTsKKwkJTWV0YWRhdGEgaW5nZXN0ZWRNZXRhZGF0YSA9IG1ldGFkYXRhcy5nZXQoMCkuZ2V0TWV0YWRhdGEoKTsKKwkJYXNzZXJ0RXF1YWxzKGluZ2VzdGVkTWV0YWRhdGEuZ2V0TWV0YWRhdGEoInRlc3RrZXkxIiksICJ0ZXN0dmFsMSIpOworCQlhc3NlcnRFcXVhbHMoaW5nZXN0ZWRNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgidGVzdGtleTEiKS5zaXplKCksIDIpOworCisJCS8vIHRlc3QgaW5nZXN0IHVwZGF0ZQorCQltLnJlcGxhY2VNZXRhZGF0YSgKKwkJCQlDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfU0VSVklDRV9UUkFOU0FDVElPTl9JRF9NRVRfS0VZLCB0ci5nZXRUcmFuc2FjdGlvbklkKCkudG9TdHJpbmcoKSk7CisJCW0ucmVwbGFjZU1ldGFkYXRhKENhdGFsb2dTZXJ2aWNlTG9jYWwuRU5BQkxFX1VQREFURV9NRVRfS0VZLCAidHJ1ZSIpOworCQl0ciA9IGNzLmluZ2VzdChtKTsKKwkJcmVjZWlwdHMgPSBuZXcgVmVjdG9yPFRyYW5zYWN0aW9uUmVjZWlwdD4oKTsKKwkJcmVjZWlwdHMuYWRkKHRyKTsKKwkJbWV0YWRhdGFzID0gY3MuZ2V0TWV0YWRhdGEocmVjZWlwdHMpOworCQlhc3NlcnRFcXVhbHMobWV0YWRhdGFzLnNpemUoKSwgMSk7CisJCWluZ2VzdGVkTWV0YWRhdGEgPSBtZXRhZGF0YXMuZ2V0KDApLmdldE1ldGFkYXRhKCk7CisJCWFzc2VydEVxdWFscyhpbmdlc3RlZE1ldGFkYXRhLmdldE1ldGFkYXRhKCJ0ZXN0a2V5MSIpLCAidGVzdHZhbDEiKTsKKwkJYXNzZXJ0RXF1YWxzKGluZ2VzdGVkTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoInRlc3RrZXkxIikuc2l6ZSgpLCAyKTsKKworCQkvLyB0ZXN0IHF1ZXJ5IHVzaW5nIHF1ZXJ5cGFnZXIKKwkJUXVlcnlFeHByZXNzaW9uIHFlID0gUXVlcnlQYXJzZXIKKwkJCQkucGFyc2VRdWVyeUV4cHJlc3Npb24oInRlc3RrZXkxID09ICd0ZXN0dmFsMSciKTsKKwkJUXVlcnlQYWdlciBwYWdlciA9IGNzLnF1ZXJ5KHFlKTsKKwkJbWV0YWRhdGFzID0gY3MuZ2V0TmV4dFBhZ2UocGFnZXIpOworCQlhc3NlcnRFcXVhbHMobWV0YWRhdGFzLnNpemUoKSwgMSk7CisJCWluZ2VzdGVkTWV0YWRhdGEgPSBtZXRhZGF0YXMuZ2V0KDApLmdldE1ldGFkYXRhKCk7CisJCWFzc2VydEVxdWFscyhpbmdlc3RlZE1ldGFkYXRhLmdldE1ldGFkYXRhKCJ0ZXN0a2V5MSIpLCAidGVzdHZhbDEiKTsKKwkJYXNzZXJ0RXF1YWxzKGluZ2VzdGVkTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoInRlc3RrZXkxIikuc2l6ZSgpLCAyKTsKKworCQkvLyB0ZXN0IHF1ZXJ5IHVzaW5nIHN0ZCBwYWdpbmcKKwkJcWUgPSBRdWVyeVBhcnNlci5wYXJzZVF1ZXJ5RXhwcmVzc2lvbigidGVzdGtleTEgPT0gJ3Rlc3R2YWwxJyIpOworCQlQYWdlIHBhZ2UgPSBjcy5nZXRQYWdlKG5ldyBQYWdlSW5mbygyMCwgUGFnZUluZm8uRklSU1RfUEFHRSksIHFlKTsKKwkJbWV0YWRhdGFzID0gY3MuZ2V0TWV0YWRhdGEocGFnZSk7CisJCWFzc2VydEVxdWFscyhtZXRhZGF0YXMuc2l6ZSgpLCAxKTsKKwkJaW5nZXN0ZWRNZXRhZGF0YSA9IG1ldGFkYXRhcy5nZXQoMCkuZ2V0TWV0YWRhdGEoKTsKKwkJYXNzZXJ0RXF1YWxzKGluZ2VzdGVkTWV0YWRhdGEuZ2V0TWV0YWRhdGEoInRlc3RrZXkxIiksICJ0ZXN0dmFsMSIpOworCQlhc3NlcnRFcXVhbHMoaW5nZXN0ZWRNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgidGVzdGtleTEiKS5zaXplKCksIDIpOworCisJCS8vIHRlc3QgcXVlcnkgdXNpbmcgc3RkIHBhZ2luZyB3aXRoIGNhdGFsb2cgcmVzdHJpY3Rpb24KKwkJcWUgPSBRdWVyeVBhcnNlci5wYXJzZVF1ZXJ5RXhwcmVzc2lvbigidGVzdGtleTEgPT0gJ3Rlc3R2YWwxJyIpOworCQlwYWdlID0gY3MuZ2V0UGFnZShuZXcgUGFnZUluZm8oMjAsIFBhZ2VJbmZvLkZJUlNUX1BBR0UpLCBxZSwKKwkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oIlRlc3RDYXRhbG9nMSIpKTsKKwkJbWV0YWRhdGFzID0gY3MuZ2V0TWV0YWRhdGEocGFnZSk7CisJCWFzc2VydEVxdWFscyhtZXRhZGF0YXMuc2l6ZSgpLCAxKTsKKwkJaW5nZXN0ZWRNZXRhZGF0YSA9IG1ldGFkYXRhcy5nZXQoMCkuZ2V0TWV0YWRhdGEoKTsKKwkJYXNzZXJ0RXF1YWxzKGluZ2VzdGVkTWV0YWRhdGEuZ2V0TWV0YWRhdGEoInRlc3RrZXkxIiksICJ0ZXN0dmFsMSIpOworCQlhc3NlcnRFcXVhbHMoaW5nZXN0ZWRNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgidGVzdGtleTEiKS5zaXplKCksIDEpOworCisJCS8vIHRlc3QgZGVsZXRlCisJCW0gPSBuZXcgTWV0YWRhdGEoKTsKKwkJbS5hZGRNZXRhZGF0YShDYXRhbG9nU2VydmljZUxvY2FsLkNBVEFMT0dfU0VSVklDRV9UUkFOU0FDVElPTl9JRF9NRVRfS0VZLCB0ci5nZXRUcmFuc2FjdGlvbklkKCkudG9TdHJpbmcoKSk7CisJCWNzLmRlbGV0ZShtKTsKKwkJYXNzZXJ0RXF1YWxzKGNzLmdldE1ldGFkYXRhKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodHIpKS5zaXplKCksIDApOworCX0KKworCXByaXZhdGUgSW5NZW1vcnlJbmdlc3RNYXBwZXJGYWN0b3J5IGdldE9yYWNsZUluZ2VzdE1hcHBlckZhY3RvcnkoCisJCQlTdHJpbmcgdG1wRGlyUGF0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlTdHJpbmcgdXNlciA9ICJzYSI7CisJCVN0cmluZyBwYXNzID0gIiI7CisJCVN0cmluZyBkcml2ZXIgPSAib3JnLmhzcWxkYi5qZGJjRHJpdmVyIjsKKwkJU3RyaW5nIHVybCA9ICJqZGJjOmhzcWxkYjpmaWxlOiIgKyB0bXBEaXJQYXRoICsgIjtzaHV0ZG93bj10cnVlIjsKKworCQlJbk1lbW9yeUluZ2VzdE1hcHBlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBJbk1lbW9yeUluZ2VzdE1hcHBlckZhY3RvcnkoKTsKKwkJZmFjdG9yeS5zZXREcml2ZXIoZHJpdmVyKTsKKwkJZmFjdG9yeS5zZXRKZGJjVXJsKHVybCk7CisJCWZhY3Rvcnkuc2V0UGFzcyhwYXNzKTsKKwkJZmFjdG9yeS5zZXRVc2VyKHVzZXIpOworCQlmYWN0b3J5LnNldFRhYmxlc0ZpbGUodGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvdGVzdC1tYXBwZXItY2F0LnNxbCIpLmdldFBhdGgoKSk7CisJCXJldHVybiBmYWN0b3J5OworCX0KKworCXByaXZhdGUgRGF0YVNvdXJjZUluZGV4RmFjdG9yeSBnZXRJbk1lbW9yeURTRmFjdG9yeShTdHJpbmcgdG1wRGlyUGF0aCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVzZXIgPSAic2EiOworCQlTdHJpbmcgcGFzcyA9ICIiOworCQlTdHJpbmcgZHJpdmVyID0gIm9yZy5oc3FsZGIuamRiY0RyaXZlciI7CisJCVN0cmluZyB1cmwgPSAiamRiYzpoc3FsZGI6ZmlsZToiICsgdG1wRGlyUGF0aCArICI7c2h1dGRvd249dHJ1ZSI7CisKKwkJSW5NZW1vcnlJbmRleEZhY3RvcnkgaW5kZXhGYWN0b3J5ID0gbmV3IEluTWVtb3J5SW5kZXhGYWN0b3J5KCk7CisJCWluZGV4RmFjdG9yeS5zZXREcml2ZXIoZHJpdmVyKTsKKwkJaW5kZXhGYWN0b3J5LnNldEpkYmNVcmwodXJsKTsKKwkJaW5kZXhGYWN0b3J5LnNldFBhc3MocGFzcyk7CisJCWluZGV4RmFjdG9yeS5zZXRVc2VyKHVzZXIpOworCQlpbmRleEZhY3Rvcnkuc2V0VGFibGVzRmlsZSh0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi90ZXN0LWluZGV4LWNhdC5zcWwiKS5nZXRQYXRoKCkpOworCQlyZXR1cm4gaW5kZXhGYWN0b3J5OworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jYXRhbG9nL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWluZGV4LWNhdC5zcWwgYi8wLjEwL2NhdGFsb2cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtaW5kZXgtY2F0LnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJkNDZlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jYXRhbG9nL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWluZGV4LWNhdC5zcWwKQEAgLTAsMCArMSwzMiBAQAorIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIC0tIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIC0tIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAtLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIC0tICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgLS0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAtLQorIC0tICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAtLQorIC0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAtLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIC0tIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIC0tIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAtLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAKK0RST1AgVEFCTEUgdHJhbnNhY3Rpb25zIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgdHJhbnNhY3Rpb25fdGVybXMgSUYgRVhJU1RTOworCitDUkVBVEUgVEFCTEUgdHJhbnNhY3Rpb25zCisoCisgIHRyYW5zYWN0aW9uX2lkIHZhcmNoYXIoMjU2KSBOT1QgTlVMTCwKKyAgdHJhbnNhY3Rpb25fZGF0ZSB2YXJjaGFyKDI1NikgTk9UIE5VTEwKKyk7CisKK0NSRUFURSBUQUJMRSB0cmFuc2FjdGlvbl90ZXJtcworKAorICB0cmFuc2FjdGlvbl9pZCB2YXJjaGFyKDI1NikgTk9UIE5VTEwsCisgIGJ1Y2tldF9uYW1lIHZhcmNoYXIoMjU2KSBOT1QgTlVMTCwKKyAgdGVybV9uYW1lIHZhcmNoYXIoMjU2KSBOT1QgTlVMTCwKKyAgdGVybV92YWx1ZSB2YXJjaGFyKDEwMDApIE5PVCBOVUxMCispOworCmRpZmYgLS1naXQgYS8wLjEwL2NhdGFsb2cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtbWFwcGVyLWNhdC5zcWwgYi8wLjEwL2NhdGFsb2cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtbWFwcGVyLWNhdC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxYTM2ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2F0YWxvZy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1tYXBwZXItY2F0LnNxbApAQCAtMCwwICsxLDI2IEBACisgLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIC0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAtLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIC0tCisgLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIC0tCisgLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIC0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIC0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIAorRFJPUCBUQUJMRSBDYXRhbG9nU2VydmljZU1hcHBlciBJRiBFWElTVFM7CisKK0NSRUFURSBUQUJMRSBDYXRhbG9nU2VydmljZU1hcHBlciAoCisgIENBVF9TRVJWX1RSQU5TX0lEIFZBUkNIQVIoMjU1KSBOT1QgTlVMTCAsCisgIENBVF9TRVJWX1RSQU5TX0ZBQ1RPUlkgVkFSQ0hBUigyNTUpIE5PVCBOVUxMICwKKyAgQ0FUX1RSQU5TX0lEIFZBUkNIQVIoMjU1KSBOT1QgTlVMTCAsCisgIENBVF9UUkFOU19GQUNUT1JZIFZBUkNIQVIoMjU1KSBOT1QgTlVMTCAsCisgIENBVF9UUkFOU19EQVRFIFZBUkNIQVIoMjU1KSBOT1QgTlVMTCAsCisgIENBVEFMT0dfSUQgVkFSQ0hBUigyNTUpIE5PVCBOVUxMCispOworCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9SRUFETUUudHh0IGIvMC4xMC9jbGkvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA1MDA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvUkVBRE1FLnR4dApAQCAtMCwwICsxLDExMjUgQEAKK0NBUy1DTEkgSW4gYSBOdXRzaGVsbAorCitUaGVyZSBhcmUgMiB0eXBlIG9mIENvbW1hbmQgTGluZSBPcHRpb246CistIFNpbXBsZUNtZExpbmVPcHRpb24KKy0gQWR2YW5jZWRDbWRMaW5lT3B0aW9uCisKK0FuIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBpcyBhIFNpbXBsZUNtZExpbmVPcHRpb24gd2hpY2ggaXMgYWxzbyBhIFZhbGlkYXRhYmxlQ21kTGluZU9wdGlvbiBhbmQgSGFuZGxlYWJsZUNtZExpbmVPcHRpb24sIHdoaWNoIG1lYW5zIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gcGx1ZyBpbiB2YWxpZGF0b3IgYW5kIGhhbmRsZXJzIHRvIHlvdXIgb3B0aW9uIGFuZCBsZXQgQ0FTLUNMSSBydW4gdGhlbSBhZ2FpbnN0IHRoZSBhcmd1bWVudCB2YWx1ZXMgZ2l2ZW4gdG8geW91ciBvcHRpb25zLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8ganVzdCBoYXZlIENBUy1DTEkgcGFyc2Ugb3V0IHlvdXIgYXJndW1lbnRzIGFuZCB5b3Ugd2FudCB0byBoYW5kbGUgYW5kIHZhbGlkIHRoZW0geW91cnNlbGYgaW4geW91ciBjb2RlIHRoZW4ganVzdCB1c2UgU2ltcGxlQ21kTGluZU9wdGlvbi4gIEhvd2V2ZXIsIEkgb2YgY291cnNlIHJlY29tbWVuZCB1c2luZyBBZHZhbmNlZENtZExpbmVPcHRpb24gZm9yIHJlYXNvbnMgd2hpY2ggdGhpcyBSRUFETUUgd2FzIHdyaXR0ZW4gOikuCisKK0hvdyBkbyBpIHVzZSBDQVMtQ0xJPworRmlyc3Qgb2ZmLCBzdGFydCBieSBjcmVhdGluZyBhIGRpcmVjdG9yeSB0byB3b3JrIGluOiBjbGktdGVzdC4gSW4gaXQgY3JlYXRlIHlvdXIgbWFpbiBjbGFzcyBNeU1haW4uamF2YToKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLkNtZExpbmVVdGlsaXR5OworCitwdWJsaWMgY2xhc3MgTXlNYWluIHsKKworICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgQ21kTGluZVV0aWxpdHkgY21kTGluZVV0aWxpdHkgPSBuZXcgQ21kTGluZVV0aWxpdHkoKTsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bihhcmdzKTsKKyAgIH0KK30KKworTmV4dGVkIGNyZWF0ZSAyIFhNTCBmaWxlcyAocHV0IHRoZW0gaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgTXlNYWluLmphdmEpOiBjbWQtbGluZS1vcHRpb25zLnhtbCBhbmQgY21kLWxpbmUtYWN0aW9ucy54bWwuICBjbWQtbGluZS1vcHRpb25zLnhtbCB3aWxsIGNvbnRhaW4gdGhlIGRlY2xhcmF0aW9uIG9mIHlvdXIgc3VwcG9ydGVkIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBhbmQgY21kLWxpbmUtYWN0aW9ucy54bWwgd2lsbCBjb250YWluIHlvdXIgc3VwcG9ydGVkIENtZExpbmVBY3Rpb25zLiAgRm9yIG5vdyB0aG91Z2gsIGluIG9yZGVyIHRvIHNob3cgeW91IHdoYXQgeW91IGdldCBmb3IgZnJlZSwgY3JlYXRlIGFuIGNtZC1saW5lLW9wdGlvbnMueG1sIGZpbGUgd2hpY2ggZGVmaW5lcyBub3cgQWR2YW5jZWRDbWRMaW5lT3B0aW9uOgorCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKzwvYmVhbnM+CisKK05leHQgY3JlYXRlIGFuIGNtZC1saW5lLWFjdGlvbnMueG1sIGZpbGUgd2l0aCB0aGUgZm9sbG93aW5nIENtZExpbmVBY3Rpb24gdGhhdCBwcmludHMgb3V0ICJIZWxsbyBXb3JsZCIgd2hlbiBpdCBpcyBleGVjdXRlZDoKKworPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKyAgPGJlYW4gaWQ9IlByaW50SGVsbG9Xb3JsZEFjdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5QcmludE1lc3NhZ2VBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50cyBvdXQgJ0hlbGxvIFdvcmxkJyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkhlbGxvIFdvcmxkIiAvPgorICA8L2JlYW4+Cis8L2JlYW5zPgorCitOb3cgY3JlYXRlIGEgbG9nZ2luZy5wcm9wZXJ0aWVzIGZpbGUgaW4geW91ciBjbGktdGVzdCBkaXJlY3Rvcnkgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOgorCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmxldmVsID0gV0FSTklORworb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmxldmVsID0gV0FSTklORworb3JnLnNwcmluZ2ZyYW1ld29yay5sZXZlbCA9IFdBUk5JTkcKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5sZXZlbCA9IFdBUk5JTkcKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcubGV2ZWwgPSBXQVJOSU5HCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gV0FSTklORworCisKK05leHQgY3JlYXRlIGEgc2NyaXB0OiBjbGktdGVzdC5zaC4gIFRoaXMgc2hvdWxkIGdvIGluIHRoZSBjbGktdGVzdCBkaXJlY3RvcnkgYW5kIHNob3VsZCBsb29rIGxpa2U6CisKKyMhL2Jpbi9zaAorCitqYXZhIFwKKyAgLURqYXZhLmV4dC5kaXJzPS4gXAorICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPS4vbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZz0uL2NtZC1saW5lLWFjdGlvbnMueG1sIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3ByaW5nLmNvbmZpZz0uL2NtZC1saW5lLW9wdGlvbnMueG1sIFwKKyAgTXlNYWluICIkQCIKKworVGhlbiBjaGVja291dCBjYXMtY2xpIGFuZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaXRzIHBvbS54bWwgZmlsZSBydW4gKHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBtYXZlbiAyIGlmIHlvdSBkbyBub3QgaGF2ZSBpdCk6CisKKyQgbXZuIHBhY2thZ2UKKwordW50YXIgdGhlICotZGlzdC50YXIgZmlsZSBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBhbmQgY29weSBhbGwgdGhlICouamFyIGZpbGVzIGZyb20gdGhlIGxpYiBkaXJlY3RvcnkgdG8geW91ciBjbGktdGVzdCBkaXJlY3RvcnkKKworTm93IGNvbXBpbGUgeW91ciBNeU1haW4uamF2YToKK2phdmFjIC1EamF2YS5leHQuZGlycz0uIE15TWFpbi5qYXZhCisKK1RoZW4gKGluIHlvdXIgY2xpLXRlc3QgZGlyZWN0b3J5KSBleGVjdXRlIGNsaS10ZXN0LnNoOgorCiskIC4vY2xpLXRlc3Quc2gKKworWW91IHNob3VsZCBzZWU6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTaG9ydCB8IExvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgLWEsICAgICAtLWFjdGlvbiA8YWN0aW9uLW5hbWU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gdHJpZ2dlcgorIC1oLCAgICAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRzIGhlbHAgbWVudQorIC1wc2EsICAgLS1wcmludFN1cHBvcnRlZEFjdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgU3VwcG9ydGVkIEFjdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1bm5pbmcgY2xpLXRlc3Quc2ggd2l0aG91dCBhbnkgYXJndW1lbnRzIGlzIHRoZSBzYW1lIGFzIHJ1bm5pbmc6CisKKyQgLi9jbGktdGVzdC5zaCAtaAorCitvcgorCiskIC4vY2xpLXRlc3Quc2ggLS1oZWxwCisKK05vdyB0byBzZWUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIENtZExpbmVBY3Rpb24gd2hpY2ggeW91IGNhbiBydW4sIGV4ZWN1dGU6CisKKyQgLi9jbGktdGVzdC5zaCAtcHNhCisKK1lvdSBzaG91bGQgc2VlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByaW50SGVsbG9Xb3JsZEFjdGlvbiAgICAgICAgICAgICAgIFByaW50cyBvdXQgJ0hlbGxvIFdvcmxkJworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBzZWUgaGVscCBmb3IgYSBzcGVjaWZpYyBhY3Rpb24gdXNlIHRoZSBoZWxwIG9wdGlvbiB3aXRoIHRoZSBhY3Rpb24gaWQgZ2l2ZW4gYXMgaXRzIGFyZ3VtZW50IHZhbHVlOgorCiskIC4vY2xpLXRlc3Quc2ggLWggUHJpbnRIZWxsb1dvcmxkQWN0aW9uCisKK1lvdSBzaG91bGQgc2VlOgorKiogQWN0aW9uIEhlbHAgZm9yICdQcmludEhlbGxvV29ybGRBY3Rpb24nICoqCis+IERFU0NSSVBUSU9OOgorIFByaW50cyBvdXQgJ0hlbGxvIFdvcmxkJworCis+IFVTQUdFOgorIFJlcXVpcmVkOgorICAgLWEgWy0tYWN0aW9uXSBQcmludEhlbGxvV29ybGRBY3Rpb24KKyBPcHRpb25hbDoKKworPiBFWEFNUExFUzoKKyAtIE4vQQorCitOb3cgdG8gcnVuIFByaW50SGVsbG9Xb3JsZEFjdGlvbjoKKworJCAuL2NsaS10ZXN0LnNoIC1hIFByaW50SGVsbG9Xb3JsZEFjdGlvbgorCitZb3Ugc2hvdWxkIHNlZToKK0hlbGxvIFdvcmxkCisKK1NvIGZhciBzbyBlYXN5IHJpZ2h0PyAgTm93IGxldHMgdGFrZSBhIGxvb2sgYXQgdGhlIGNsYXNzIGZvciB0aGUgYWN0aW9uIChpLmUuIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5QcmludE1lc3NhZ2VBY3Rpb24pIHdlIGp1c3QgcmFuIGFuZCBzZWUgaG93IGVhc3kgdGhlIGNvZGUgZm9yIGl0IGlzOgorCitwdWJsaWMgY2xhc3MgUHJpbnRNZXNzYWdlQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG1lc3NhZ2UpOworCisgICAgICBwcmludGVyLnByaW50KG1lc3NhZ2UpOworICAgfQorCisgICBAUmVxdWlyZWQKKyAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgIHJldHVybiBtZXNzYWdlOworICAgfQorfQorCitBcyB5b3VyIGNhbiBzZWUgaXQgaGFzIGEgc2V0dGVyIG1ldGhvZCBmb3IgaXRzIHZhcmlhYmxlICdtZXNzYWdlJy4gIFRoZSByZWFzb24gdGhlIFByaW50SGVsbG9Xb3JsZEFjdGlvbiBwcmludHMgb3V0IGhlbGxvIGlzIGJlY2F1c2Ugd2Ugc2V0IHRoZSBtZXNzYWdlIHByb3BlcnR5IGluIHRoZSBjbWQtbGluZS1hY3Rpb25zLnhtbCBmaWxlIGZvciBiZWFuIGlkIFByaW50TWVzc2FnZUFjdGlvbiB0byAiSGVsbG8gV29ybGQiOgorCisgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJIZWxsbyBXb3JsZCIgLz4KKworSWYgd2Ugd2hlcmUgdG8gY2hhbmdlIHRoYXQgdG8gc29tZXRoaW5nIGVsc2UsIHNheSAiQnllIFdvcmxkIiwgaXQgd291bGQgaW5zdGVhZCBwcmludCAiQnllIFdvcmxkIiB3aGVuIFByaW50SGVsbG9Xb3JsZEFjdGlvbiB3YXMgcnVuIChvZiBjb3Vyc2UgdGhlbiB5b3Ugd291bGQgcHJvYmFibHkgd2FudCB0byBjaGFuZ2UgaXRzIGlkIHRvICJCeWVIZWxsb1dvcmxkQWN0aW9uIi4gIE5vIGxldHMgc2VlIGhvdyBlYXN5IGl0IGlzIHRvIGFkZCBvdXIgb3duIG9wdGlvbnMuICBMZXQncyBtYWtlIGFub3RoZXIgYWN0aW9uIGluIGNtZC1saW5lLWFjdGlvbnMueG1sIGNhbGxlZCAiUHJpbnRNZXNzYWdlQWN0aW9uIiBzbyB0aGF0IGNtZC1saW5lLWFjdGlvbnMueG1sIG5vdyBsb29rcyBsaWtlIHRoaXM6CisKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisgIDxiZWFuIGlkPSJQcmludEhlbGxvV29ybGRBY3Rpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uUHJpbnRNZXNzYWdlQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludHMgb3V0ICdIZWxsbyBXb3JsZCciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJIZWxsbyBXb3JsZCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iUHJpbnRNZXNzYWdlQWN0aW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLlByaW50TWVzc2FnZUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnRzIG91dCBzcGVjaWZpZWQgbWVzc2FnZSIgLz4KKyAgPC9iZWFuPgorPC9iZWFucz4KKworTm90aWNlIHdlIHVzZWQgdGhlIHNhbWUgamF2YSBjbGFzcyBhbmQgd2UgZGlkbid0IHNldCB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gbm93IHNldCB0aGlzIHByb3BlcnR5IHZpYSB0aGUgY29tbWFuZCBsaW5lLiAgTm93IGluIGNtZC1saW5lLW9wdGlvbnMueG1sIGxldCdzIGNyZWF0ZSBhZGQgYW4gb3B0aW9uOgorCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworICA8YmVhbiBpZD0icHJpbnRNZXNzYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icG0iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmludE1lc3NhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWVzc2FnZSB0byBwcmludCBvdXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJtZXNzYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgorCitOb3cgcnVuOgorCiskIC4vY2xpLXRlc3Quc2ggLWgKKworWW91IHNob3VsZCBzZWU6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTaG9ydCB8IExvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgLWEsICAgICAtLWFjdGlvbiA8YWN0aW9uLW5hbWU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gdHJpZ2dlcgorIC1wbSwgICAgLS1wcmludE1lc3NhZ2UgPG1lc3NhZ2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSB0byBwcmludCBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQgUnVsZXM6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ByaW50TWVzc2FnZUFjdGlvbiA6IFJFUVVJUkVEXSAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbGwgaW52b2tlICdzZXRQcmludE1lc3NhZ2UnIG9uIGFjdGlvbiBzZWxlY3RlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgYWN0aW9uczogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHJpbnRNZXNzYWdlQWN0aW9uIDogc2V0TWVzc2FnZV0gCisKKyAtaCwgICAgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50cyBoZWxwIG1lbnUKKyAtcHNhLCAgIC0tcHJpbnRTdXBwb3J0ZWRBY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50IFN1cHBvcnRlZCBBY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RpY2Ugbm93IHRoYXQgd2UgaGF2ZSBhbiBvcHRpb24gLS1wcmludE1lc3NhZ2UuICBUaGUgZGVzY3JpcHRpb24gd2UgcHV0IHRoZSBmb3Igb3B0aW9uIHByaW50TWVzc2FnZSBpbiBjbWQtbGluZS1vcHRpb25zLnhtbCBpcyBub3cgdW5kZXIgZGVzY3JpcHRpb24gaW4geW91ciBjb21tYW5kIGxpbmUgaGVscC4gIEFsc28gbm90aWNlIHRoZSByZXF1aXJlbWVudCBydWxlcy4gIFRoZSByZXF1aXJlbWVudCBydWxlcyBzZXR1cCBmb3IgdGhpcyBvcHRpb24gaXM6IGlmIFByaW50TWVzc2FnZUFjdGlvbiBpcyBleGVjdXRlZCB0aGVuIHByaW50TWVzc2FnZSBvcHRpb24gYmVjb21lcyByZXF1aXJlZC4gIFlvdSBjYW4gYWxzbyBzZWUgdGhpcyByZXF1aXJlbWVudCBydWxlIHdoZW4gcnVubmluZzoKKworJCAuL2NsaS10ZXN0LnNoIC1oIFByaW50TWVzc2FnZUFjdGlvbgorCitZb3Ugc2hvdWxkIHNlZToKKyoqIEFjdGlvbiBIZWxwIGZvciAnUHJpbnRNZXNzYWdlQWN0aW9uJyAqKgorPiBERVNDUklQVElPTjoKKyBQcmludHMgb3V0ICdIZWxsbyBXb3JsZCcKKworPiBVU0FHRToKKyBSZXF1aXJlZDoKKyAgIC1hIFstLWFjdGlvbl0gUHJpbnRNZXNzYWdlQWN0aW9uCisgICAtcG0gWy0tcHJpbnRNZXNzYWdlXSA8bWVzc2FnZT4KKyBPcHRpb25hbDoKKworPiBFWEFNUExFUzoKKyAtIE4vQQorCitOb3RpY2UgdGhhdCBwcmludE1lc3NhZ2UgaXMgbm93IHVuZGVyIHRoZSByZXF1aXJlZCBvcHRpb25zLiAgTm93IGhlcmUgaXMgdGhlIHJlYWxseSBjb29sIG1hZ2ljLiAgUnVuOgorCiskIC4vY2xpLXRlc3Quc2ggLWEgUHJpbnRNZXNzYWdlQWN0aW9uIC1wbSAiSG9jdXMgUG9jdXMiCisKK1lvdSBzaG91bGQgc2VlOgorSG9jdXMgUG9jdXMKKworV2UgY2FuIG5vdyBkeW5hbWljYWxseSB0ZWxsIGl0IHdoYXQgd2Ugd2FudCBpdCB0byBwcmludCBvdXQuICBIb3cgZG9lcyB0aGlzIHdvcms/ICBUaGlzIHdvcmtzIGJlY2F1c2Ugd2UgYXNzaWduZWQgYSBoYW5kbGVyIHRvIHRoZSBwcmludE1lc3NhZ2Ugb3B0aW9uLiAgVGhlIGhhbmRsZXIgYXNzaWduZWQgd2FzOiBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlci4gIFRoaXMgaGFuZGxlciB0YWtlcyBhIGxpc3Qgb2Ygb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiBiZWFucyB3aGljaCB0ZWxsIGl0IHRoZSBhY3Rpb25OYW1lIGFuZCAob3B0aW9uYWxseSkgdGhlIG1ldGhvZCBuYW1lIHRvIGludm9rZSBvbiB0aGF0IGFjdGlvbi4gIFNvIHdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZ2l2ZW4gdG8gdGhlIG9wdGlvbiAoaW4gdGhpcyBjYXNlIHdhcyAiSG9jdXMgUG9jdXMiKSB3YXMgdGhlbiBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBtZXRob2Qgc2V0TWVzc2FnZShTdHJpbmcpIG9uIHRoZSBhY3Rpb24gUHJpbnRNZXNzYWdlQWN0aW9uLgorCitPcHRpb25zIGNhbiBhbHNvIGhhdmUgc3RhdGljIGFyZ3VtZW50IHZhbHVlcywgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlIG9yIGFzIGEgcGVybWFuZW50IGFyZ3VtZW50IGZvciBhbiBvcHRpb24uICBMZXQncyBtb2RpZnkgdGhlIGN1cnJlbnQgZXhhbXBsZSB0byBzaG93IHdoYXQgaSBtZWFuLiAgSGVyZSBpcyBob3cgeW91IHdvdWxkIHVzZSBzdGF0aWMgYXJndW1lbnQgdmFsdWVzIHRvIG1ha2UgIkhlbGxvIFdvcmxkIiB0aGUgZGVmYXVsdDoKKworPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKyAgPGJlYW4gaWQ9InByaW50TWVzc2FnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBtIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnRNZXNzYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1lc3NhZ2UgdG8gcHJpbnQgb3V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWVzc2FnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPkhlbGxvIFdvcmxkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgorCitOb3cgZXhlY3V0ZSB0aGUgZm9sbG93aW5nOgorCiskIC4vY2xpLXRlc3Quc2ggLWEgUHJpbnRNZXNzYWdlQWN0aW9uIC1wbQorCitZb3Ugc2hvdWxkIHNlZToKK0hlbGxvIFdvcmxkCisKK1RoZW4gZXhlY3V0ZToKKworLi9jbGktdGVzdC5zaCAtYSBQcmludE1lc3NhZ2VBY3Rpb24gLXBtICJIb2N1cyBQb2N1cyIKKworWW91IHNob3VsZCBzZWU6CitIb2N1cyBQb2N1cworCitTbyB0aGUgc3RhdGljIGFyZ3VtZW50IHZhbHVlIG1hZGUgcHJpbnRNZXNzYWdlIG9wdGlvbiB2YWx1ZSBvcHRpb25hbC4gIE5vdyB0aGUgb3RoZXIgd2F5IHRvIHVzZSBzdGF0aWMgYXJndW1lbnRzIGlzIHRvIG1ha2UgYW4gb3B0aW9uIG5vdCBzdXBwb3J0IGFyZ3VtZW50IHZhbHVlcyBhbmQgdXNlIHRoZSBzdGF0aWMgYXJndW1lbnQgdmFsdWUgYXMgaXRzIHBlcm1hbmVudCB2YWx1ZS4gIE1vZGlmeSB5b3VyIGNtZC1saW5lLW9wdGlvbnMueG1sIHRvIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworICA8YmVhbiBpZD0icHJpbnRNZXNzYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icG0iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmludE1lc3NhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWVzc2FnZSB0byBwcmludCBvdXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPkhlbGxvIFdvcmxkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgorCitOb3cgZXhlY3V0ZSB0aGUgZm9sbG93aW5nOgorCiskIC4vY2xpLXRlc3Quc2ggLWggUHJpbnRNZXNzYWdlQWN0aW9uCisKK1lvdSBzaG91bGQgc2VlOgorCisqKiBBY3Rpb24gSGVscCBmb3IgJ1ByaW50TWVzc2FnZUFjdGlvbicgKioKKz4gREVTQ1JJUFRJT046CisgUHJpbnRzIG91dCAnSGVsbG8gV29ybGQnCisKKz4gVVNBR0U6CisgUmVxdWlyZWQ6CisgICAtYSBbLS1hY3Rpb25dIFByaW50TWVzc2FnZUFjdGlvbgorICAgLXBtIFstLXByaW50TWVzc2FnZV0KKyBPcHRpb25hbDoKKworPiBFWEFNUExFUzoKKyAtIE4vQQorCitOb3RpY2UgdGhhdCAtcG0gZG9lcyBoYXZlIDxtZXNzYWdlPiBhbnltb3JlLCB0aGlzIG1lYW5zIGl0IGRvZXNuJ3Qgc3VwcG9ydCBhcmd1bWVudHMuICBOb3cgZXhlY3V0ZToKKworJCAuL2NsaS10ZXN0LnNoIC1hIFByaW50TWVzc2FnZUFjdGlvbiAtcG0KKworWW91IHNob3VsZCBzZWU6CitIZWxsbyBXb3JsZAorCitOb3cgaG93IGlzIHRoaXMgdXNlZnVsLCBsZXNzIGNoYW5nZSB0aGUgdGhlIGNtZC1saW5lLW9wdGlvbnMueG1sIGZpbGUsIHJlbmFtaW5nIHByaW50TWVzc2FnZSBvcHRpb24gdG8gcHJpbnRIZWxsb1dvcmxkIGFuZCBhZGQgYW5vdGhlciBhY3Rpb24gcHJpbnRCeWVXb3JsZDoKKworPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKyAgPGJlYW4gaWQ9InByaW50SGVsbG9Xb3JsZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBodyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW50SGVsbG9Xb3JsZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludCBvdXQgJ0hlbGxvIFdvcmxkJyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+SGVsbG8gV29ybGQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOm1ldGhvZE5hbWU9InNldE1lc3NhZ2UiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icHJpbnRCeWVXb3JsZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBidyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW50QnllV29ybGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgb3V0ICdCeWUgV29ybGQnIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5CeWUgV29ybGQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOm1ldGhvZE5hbWU9InNldE1lc3NhZ2UiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKzwvYmVhbnM+CisKK1RoZXJlIGFyZSBub3cgMiBvcHRpb25zLCBidXQgaSd2ZSBzZXQgdGhlbSBib3RoIHRvIG9wdGlvbmFsIGJlY2F1c2Ugb25seSBvbmUgc2hvdWxkIGJlIHNwZWNpZmllZC4gIEhvd2V2ZXIsIHRoaXMgaXMgYSBwcm9ibGVtIGJlY2F1c2Ugd2Ugd2FudCBhdCBsZWFzdCAxIHNwZWNpZmllZCAodGhpcyB3aWxsIGJlIGFkZHJlc3NlZCBuZXh0KS4gIEZvciBub3cgbGV0J3Mgc2VlIGhvdyB0aGVzZSB0d28gb3B0aW9ucyB3aXRoIHN0YXRpYyBhcmd1bWVudCB2YWx1ZXMgd29yay4gIEV4ZWN1dGUgdGhlIGZvbGxvd2luZzoKKworJCAuL2NsaS10ZXN0LnNoIC1oIFByaW50TWVzc2FnZUFjdGlvbgorCitZb3Ugc2hvdWxkIHNlZToKKyoqIEFjdGlvbiBIZWxwIGZvciAnUHJpbnRNZXNzYWdlQWN0aW9uJyAqKgorPiBERVNDUklQVElPTjoKKyBQcmludHMgb3V0ICdIZWxsbyBXb3JsZCcKKworPiBVU0FHRToKKyBSZXF1aXJlZDoKKyAgIC1hIFstLWFjdGlvbl0gUHJpbnRNZXNzYWdlQWN0aW9uCisgT3B0aW9uYWw6CisgICAtcGJ3IFstLXByaW50QnllV29ybGRdCisgICAtcGh3IFstLXByaW50SGVsbG9Xb3JsZF0KKworPiBFWEFNUExFUzoKKyAtIE4vQQorCitPdXIgdHdvIG9wdGlvbnMgbm93IGFwcGVhciB1bmRlciB0aGUgb3B0aW9uYWwgc2VjdGlvbi4gIE5vdyBleGVjdXRlOgorCiskIC4vY2xpLXRlc3Quc2ggLWEgUHJpbnRNZXNzYWdlQWN0aW9uIC1wYncKKworWW91IHNob3VsZCBzZWU6CitCeWUgV29ybGQKKworVGhlbiBleGVjdXRlOgorCiskIC4vY2xpLXRlc3Quc2ggLWEgUHJpbnRNZXNzYWdlQWN0aW9uIC1waHcKKworWW91IHNob3VsZCBzZWU6CitIZWxsbyBXb3JsZAorCitOb3cgdGhpcyB3b3JrcyBuaWNlLCBleGNlcHQgY2FzLWNsaSBpcyBhYmxlIHRvIGVuZm9yY2Ugb25lIG9mIHRoZSBvcHRpb25zIChpLmUuIC1wYncgYW5kIC1waHcpIHRvIGJlIHNwZWNpZmljIHNvIGlmIHlvdSBydW4gdGhlIGZvbGxvd2luZyBpdCBjYXVzZXMgdGhlIGFjdGlvbiB0byBwcmludCBvdXQgYW4gRVJST1I6CisKKyQgLi9jbGktdGVzdC5zaCAtYSBQcmludE1lc3NhZ2VBY3Rpb24KKworWW91IHNob3VsZCBzZWU6CitFUlJPUjogTXVzdCBzcGVjaWZ5IG1lc3NhZ2UKKworV2UgY2FuIHByZXZlbnQgdGhlIFByaW50TWVzc2FnZUFjdGlvbiBmcm9tIGhhdmluZyB0byB0aHJvdyB0aGlzIGV4Y2VwdGlvbiBieSwgY3JlYXRpbmcgYSBncm91cCBvcHRpb24gYW5kIGFkZGluZyBib3RoIC1wYncgYW5kIC1waHcgdG8gaXQuICBNb2RpZnkgeW91ciBjbWQtbGluZS1vcHRpb25zLnhtbCB0byB0aGUgZm9sbG93aW5nOgorCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworICA8YmVhbiBpZD0icHJpbnQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByaW50IGEgbWVzc2FnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJoZWxsb1dvcmxkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImJ5ZVdvcmxkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImhlbGxvV29ybGQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIiBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJodyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImhlbGxvV29ybGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgb3V0ICdIZWxsbyBXb3JsZCciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPkhlbGxvIFdvcmxkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImJ5ZVdvcmxkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYnciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJieWVXb3JsZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludCBvdXQgJ0J5ZSBXb3JsZCciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPkJ5ZSBXb3JsZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6bWV0aG9kTmFtZT0ic2V0TWVzc2FnZSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorPC9iZWFucz4KKworU28gd2hhdCB3YXMgY2hhbmdlZCBoZXJlIGlzICdwcmludEhlbGxvV29ybGQnIHdhcyByZW5hbWVkIHRvICdoZWxsb1dvcmxkJyBhbmQgcDppc1N1Yk9wdGlvbj0idHJ1ZSIgd2FzIGFkZGVkIHRvIGl0IChzaW1pbGFyIHdhcyBkb25lIHdpdGggJ3ByaW50QnllV29ybGQnKS4gIEFsc28gYSBncm91cCBvcHRpb24gd2FzIGNyZWF0ZWQgYW5kICdoZWxsb1dvcmxkJyBhbmQgJ2J5ZVdvcmxkJyB3aGVyZSBhZGRlZCBhcyBvcHRpb25hbCBzdWItb3B0aW9ucy4gIFdoZW4gYWxsIHN1Yi1vcHRpb25zIG9mIGEgZ3JvdXAgb3B0aW9uIGFyZSBvcHRpb24sIHRoZW4gb25lIG9mIHRoZSBzdWItb3B0aW9ucyB3aWxsIGJlIHJlcXVpcmVkLiAgTm93IGV4ZWN1dGU6CisKKyQgLi9jbGktdGVzdC5zaCAtaAorCitZb3Ugc2hvdWxkIHNlZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNob3J0IHwgTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAtYSwgICAgIC0tYWN0aW9uIDxhY3Rpb24tbmFtZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byB0cmlnZ2VyCisgLXAsICAgICAtLXByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJlIHRoYXQgeW91IHdpc2ggdG8gcHJpbnQgYSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50IFJ1bGVzOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBSRVFVSVJFRF0gCisKKyAgIFN1Yk9wdGlvbnM6CisgICA+IFJlcXVpcmVkOgorICAgPiBPcHRpb25hbDoKKyAgICAgIC1odywgICAgLS1oZWxsb1dvcmxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50IG91dCAnSGVsbG8gV29ybGQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50IFJ1bGVzOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBPUFRJT05BTF0gCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlcjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGludm9rZSAnc2V0SGVsbG9Xb3JsZCcgb24gYWN0aW9uIHNlbGVjdGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBhY3Rpb25zOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBzZXRNZXNzYWdlXSAKKyAgICAgIC1idywgICAgLS1ieWVXb3JsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50IG91dCAnQnllIFdvcmxkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCBSdWxlczogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHJpbnRNZXNzYWdlQWN0aW9uIDogT1BUSU9OQUxdIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBpbnZva2UgJ3NldEJ5ZVdvcmxkJyBvbiBhY3Rpb24gc2VsZWN0ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nIGFjdGlvbnM6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ByaW50TWVzc2FnZUFjdGlvbiA6IHNldE1lc3NhZ2VdIAorCisgLWgsICAgICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludHMgaGVscCBtZW51CisgLXBzYSwgICAtLXByaW50U3VwcG9ydGVkQWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCBTdXBwb3J0ZWQgQWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlbiBleGVjdXRlOgorCiskIC4vY2xpLXRlc3Quc2ggLWggUHJpbnRNZXNzYWdlQWN0aW9uCisKK1lvdSBzaG91bGQgc2VlOgorKiogQWN0aW9uIEhlbHAgZm9yICdQcmludE1lc3NhZ2VBY3Rpb24nICoqCis+IERFU0NSSVBUSU9OOgorIFByaW50cyBvdXQgJ0hlbGxvIFdvcmxkJworCis+IFVTQUdFOgorIFJlcXVpcmVkOgorICAgLWEgWy0tYWN0aW9uXSBQcmludE1lc3NhZ2VBY3Rpb24KKyAgIC1wIFstLXByaW50XQorICAgICBPbmUgb2Y6CisgICAgICAtaHcgWy0taGVsbG9Xb3JsZF0KKyAgICAgIC1idyBbLS1ieWVXb3JsZF0KKyBPcHRpb25hbDoKKworPiBFWEFNUExFUzoKKyAtIE4vQQorCitOb3RpY2UgaG93ICJPbmUgb2Y6IiBpcyBsaXN0ZWQgdW5kZXIgLXAgb3B0aW9uLCB0aGF0IG1lYW5zIHRoZSBvbiBvZiB0aGUgb3B0aW9uYWwgc3ViLW9wdGlvbnMgbXVzdCBiZSBzcGVjaWZpZWQuICBOb3cgbGV0J3MgcmVydW4gdGhlIGNvbW1hbmQgd2hpY2ggY2F1c2VkIFByaW50TWVzc2FnZUFjdGlvbiB0byB0aHJvdyB0aGUgRVJST1I6CisKKyQgLi9jbGktdGVzdC5zaCAtYSBQcmludE1lc3NhZ2VBY3Rpb24KKworWW91IHNob3VsZCBzZWU6CitFUlJPUjogTWlzc2luZyByZXF1aXJlZCBvcHRpb25zOgorIC0gW2xvbmdPcHRpb249J3ByaW50JyxzaG9ydE9wdGlvbj0ncCcsZGVzY3JpcHRpb249J0RlY2xhcmUgdGhhdCB5b3Ugd2lzaCB0byBwcmludCBhIG1lc3NhZ2UnXQorCitUaGlzIHRpbWUgY2FzLWNsaSB3YXMgYWJsZSB0byByZWFsaXplIHRoYXQgeW91IGFyZSBtaXNzaW5nIGFuIG9wdGlvbiBhbmQgdGVsbCB5b3UgdG8gc2V0IGl0LiAgTm93IGxldCdzIGFkZCB0aGUgLXAgb3B0aW9uIHRvIHRoZSBwcmV2aW91cyBjb21tYW5kOgorCiskIC4vY2xpLXRlc3Quc2ggLWEgUHJpbnRNZXNzYWdlQWN0aW9uIC1wCisKK1lvdSBzaG91bGQgc2VlOgorRVJST1I6IE11c3Qgc3BlY2lmeSBhIHN1Yk9wdGlvbiBmb3IgZ3JvdXAgb3B0aW9uICdbbG9uZ09wdGlvbj0ncHJpbnQnLHNob3J0T3B0aW9uPSdwJyxkZXNjcmlwdGlvbj0nRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByaW50IGEgbWVzc2FnZSddJworCitZb3UgYXJlIG5vdyB0b2xkIGJ5IGNhcy1jbGkgdGhhdCB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgc3VwLW9wdGlvbiBmb3IgcHJpbnQgKHRodXMgc29sdmluZyB0aGUgcHJvYmxlbSB3ZSBoYWQgYmVmb3JlIHdpdGggdHdvIG9wdGlvbmFsIG9wdGlvbnMpLiAgTm93IGV4ZWN1dGUgdGhlIGZvbGxvd2luZzoKKworJCAuL2NsaS10ZXN0LnNoIC1hIFByaW50TWVzc2FnZUFjdGlvbiAtcCAtaHcKKworWW91IHNob3VsZCBzZWU6CitIZWxsbyBXb3JsZAorCitUaGVuIGV4ZWN1dGU6CisKKy9jbGktdGVzdC5zaCAtYSBQcmludE1lc3NhZ2VBY3Rpb24gLXAgLWJ3CisKK1lvdSBzaG91bGQgc2VlOgorQnllIFdvcmxkCisKK0FzIHlvdSBjYW4gc2VlLCBzdGlsbCB0aGUgc2FtZSBvdXRwdXQgYXMgYmVmb3JlIHdpdGhvdXQgdGhlIGdyb3VwaW5nLCBidXQgaGF2ZSB3ZSBub3cgYWRkZWQgdGhlIGFiaWxpdHkgdG8gaGF2ZSBsaXN0IG9mIG9wdGlvbmFsIG9wdGlvbnMgd2hlcmUgYXQgbGVhc3Qgb25lIGlzIHJlcXVpcmVkLgorCitVcCB0aWwgbm93LCB3ZSBoYXZlIGp1c3QgYWNjZXB0ZWQgdGhhdCAtYSwgLWgsIGFuZCAtcHNhIG1hZ2ljYWxseSBhcHBlYXIuICBIb3dldmVyLCB0aGVzZSBhcmUgZGVmYXVsdHMgdGhhdCBhIGdpdmVuIHRvIHlvdSBmb3IgZnJlZSBpZiB5b3UgZG9uJ3Qgc3BlY2lmeSByZXBsYWNlbWVudHMuICBTYXkgZm9yIGV4YW1wbGUgd2UgZG9uJ3QgbGlrZSAtYSBvciAtLWFjdGlvbiBmb3IgdGhlIGFjdGlvbiBvcHRpb24gYW5kIGluc3RlYWQgd291bGQgbGlrZSAtZSBhbmQgLS1leGVjdXRlLiAgV2UgY2FuIGNoYW5nZSBvdXIgY21kLWxpbmUtb3B0aW9ucy54bWwgdG8gdGhlIGZvbGxvd2luZzoKKworPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKyAgPGJlYW4gaWQ9ImV4ZWN1dGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImV4ZWN1dGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBhY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icHJpbnQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByaW50IGEgbWVzc2FnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJoZWxsb1dvcmxkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImJ5ZVdvcmxkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImhlbGxvV29ybGQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIiBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJodyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImhlbGxvV29ybGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgb3V0ICdIZWxsbyBXb3JsZCciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPkhlbGxvIFdvcmxkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImJ5ZVdvcmxkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYnciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJieWVXb3JsZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludCBvdXQgJ0J5ZSBXb3JsZCciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPkJ5ZSBXb3JsZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6bWV0aG9kTmFtZT0ic2V0TWVzc2FnZSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorPC9iZWFucz4KKworTm93IGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBhbmQgbm90aWNlIHRoYXQgLWEgYW5kIC0tYWN0aW9uIGFyZSBubyBsb25nZXIgYW5kIC1lIGFuZCAtLWV4ZWN1dGUgYXJlIHRoZXJlIGluc3RlYWQ6CisKKyQgLi9jbGktdGVzdC5zaCAtaAorCitZb3Ugc2hvdWxkIHNlZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNob3J0IHwgTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAtZSwgICAgIC0tZXhlY3V0ZSA8YWN0aW9uLW5hbWU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgYWN0aW9uCisgLXAsICAgICAtLXByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJlIHRoYXQgeW91IHdpc2ggdG8gcHJpbnQgYSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50IFJ1bGVzOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBSRVFVSVJFRF0gCisKKyAgIFN1Yk9wdGlvbnM6CisgICA+IFJlcXVpcmVkOgorICAgPiBPcHRpb25hbDoKKyAgICAgIC1odywgICAgLS1oZWxsb1dvcmxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50IG91dCAnSGVsbG8gV29ybGQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50IFJ1bGVzOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBPUFRJT05BTF0gCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlcjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGludm9rZSAnc2V0SGVsbG9Xb3JsZCcgb24gYWN0aW9uIHNlbGVjdGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBhY3Rpb25zOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBzZXRNZXNzYWdlXSAKKyAgICAgIC1idywgICAgLS1ieWVXb3JsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50IG91dCAnQnllIFdvcmxkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCBSdWxlczogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHJpbnRNZXNzYWdlQWN0aW9uIDogT1BUSU9OQUxdIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBpbnZva2UgJ3NldEJ5ZVdvcmxkJyBvbiBhY3Rpb24gc2VsZWN0ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nIGFjdGlvbnM6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ByaW50TWVzc2FnZUFjdGlvbiA6IHNldE1lc3NhZ2VdIAorCisgLWgsICAgICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludHMgaGVscCBtZW51CisgLXBzYSwgICAtLXByaW50U3VwcG9ydGVkQWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCBTdXBwb3J0ZWQgQWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IHRyeSBleGVjdXRpbmcgYSBjb21tYW5kIHdlIHJhbiBiZWZvcmU6CisKKyQgLi9jbGktdGVzdC5zaCAtYSBQcmludE1lc3NhZ2VBY3Rpb24gLXAgLWJ3CisKK1lvdSBzaG91bGQgc2VlOgorRVJST1I6IEludmFsaWQgb3B0aW9uOiAnYScKKworVGhpcyBpcyBiZWNhdXNlIHlvdSBub3cgaGF2ZSB0byB1c2UgeW91ciBuZXcgYWN0aW9uIChpLmUuIC1lKToKKworJCAuL2NsaS10ZXN0LnNoIC1lIFByaW50TWVzc2FnZUFjdGlvbiAtcCAtYncKKworWW91IHNob3VsZCBzZWU6CitCeWUgV29ybGQKKworU2ltaWxhcmx5IHRoZSBzYW1lIGNhbiBiZSBkb25lIGZvciBoZWxwIGFuZCBwcmludCBzdXBwb3J0ZWQgYWN0aW9uczoKKworPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKyAgPGJlYW4gaWQ9ImV4ZWN1dGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImV4ZWN1dGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBhY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ibWFudWFsIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkhlbHBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtYW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtYW51YWwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgb3V0IG9wdGlvbiBoZWxwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ibGlzdEFjdGlvbnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibGEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJsaXN0QWN0aW9ucyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludCBvdXQgc3VwcG9ydGVkIGFjdGlvbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJwcmludCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWNsYXJlIHRoYXQgeW91IHdpc2ggdG8gcHJpbnQgYSBtZXNzYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImhlbGxvV29ybGQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iYnllV29ybGQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iaGVsbG9Xb3JsZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Imh3IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaGVsbG9Xb3JsZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludCBvdXQgJ0hlbGxvIFdvcmxkJyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+SGVsbG8gV29ybGQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOm1ldGhvZE5hbWU9InNldE1lc3NhZ2UiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iYnllV29ybGQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIiBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJidyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImJ5ZVdvcmxkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50IG91dCAnQnllIFdvcmxkJyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+QnllIFdvcmxkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgorCitOb3cgdHJ5IHJ1bm5pbmc6CisKKyQgLi9jbGktdGVzdC5zaCAtaAorCitZb3Ugc2hvdWxkIHNlZToKK0VSUk9SOiBJbnZhbGlkIG9wdGlvbjogJ2gnCisKK1RoaXMgaXMgYmVjYXVzZSB5b3UgaGF2ZSByZXBsYWNlIC1oIGFuZCAtLWhlbHAgd2l0aCAtbWFuIGFuZCAtLW1hbnVhbCBzbyBpbnN0ZWFkIHJ1bjoKKworJCAuL2NsaS10ZXN0LnNoIC1tYW4KKworWW91IHNob3VsZCBzZWU6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTaG9ydCB8IExvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgLWUsICAgICAtLWV4ZWN1dGUgPGFjdGlvbi1uYW1lPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGFjdGlvbgorIC1wLCAgICAgLS1wcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByaW50IGEgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCBSdWxlczogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHJpbnRNZXNzYWdlQWN0aW9uIDogUkVRVUlSRURdIAorCisgICBTdWJPcHRpb25zOgorICAgPiBSZXF1aXJlZDoKKyAgID4gT3B0aW9uYWw6CisgICAgICAtaHcsICAgIC0taGVsbG9Xb3JsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCBvdXQgJ0hlbGxvIFdvcmxkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCBSdWxlczogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHJpbnRNZXNzYWdlQWN0aW9uIDogT1BUSU9OQUxdIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBpbnZva2UgJ3NldEhlbGxvV29ybGQnIG9uIGFjdGlvbiBzZWxlY3RlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgYWN0aW9uczogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHJpbnRNZXNzYWdlQWN0aW9uIDogc2V0TWVzc2FnZV0gCisgICAgICAtYncsICAgIC0tYnllV29ybGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCBvdXQgJ0J5ZSBXb3JsZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQgUnVsZXM6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ByaW50TWVzc2FnZUFjdGlvbiA6IE9QVElPTkFMXSAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbGwgaW52b2tlICdzZXRCeWVXb3JsZCcgb24gYWN0aW9uIHNlbGVjdGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBhY3Rpb25zOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQcmludE1lc3NhZ2VBY3Rpb24gOiBzZXRNZXNzYWdlXSAKKworIC1sYSwgICAgLS1saXN0QWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgb3V0IHN1cHBvcnRlZCBhY3Rpb25zCisgLW1hbiwgICAtLW1hbnVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCBvdXQgb3B0aW9uIGhlbHAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdyBleGVjdXRlOgorCiskIC4vY2xpLXRlc3Quc2ggLWxhCisKK1lvdSBzaG91bGQgc2VlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByaW50SGVsbG9Xb3JsZEFjdGlvbiAgICAgICAgICAgICAgIFByaW50cyBvdXQgJ0hlbGxvIFdvcmxkJworCisgIFByaW50TWVzc2FnZUFjdGlvbiAgICAgICAgICAgICAgICAgIFByaW50cyBvdXQgc3BlY2lmaWVkIG1lc3NhZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXQgdGhlIGJlZ2luIG9mIHRoaXMgZ3VpZGUgaXQgd2FzIHN0YXRlZCB0aGF0IEFkdmFuY2VkQ21kTGluZU9wdGlvbiBpcyBhIFZhbGlkYXRhYmxlQ21kTGluZU9wdGlvbiBhbmQgSGFuZGxlYWJsZUNtZExpbmVPcHRpb24uICBJdCBoYXMgYWxyZWFkeSBiZWVuIHNob3VsZCBob3cgdGhleSBhcmUgSGFuZGxlYWJsZUNtZExpbmVPcHRpb24gYnkgZXhhbXBsZXMgdXNpbmcgaGFuZGxlcnMuICBOb3cgbGV0J3MgbG9vayBhdCBob3cgdGhleSBhcmUgVmFsaWRhdGFibGVDbWRMaW5lT3B0aW9uLiAgTGV0cyBhZGRlZCBhbm90aGVyIHN1Yi1vcHRpb24gdG8gLS1wcmludCB3aGljaCBhbGxvd3MgdXNlIHRvIHNwZWNpZnkgd2hhdGV2ZXIgbWVzc2FnZSB3ZSB3YW50LCBzbyBsb25nIGFzIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyAiPHNvbWV3b3JkPiBXb3JsZCI6CisKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisgIDxiZWFuIGlkPSJleGVjdXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJleGVjdXRlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgYWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Im1hbnVhbCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5IZWxwQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibWFuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWFudWFsIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50IG91dCBvcHRpb24gaGVscCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Imxpc3RBY3Rpb25zIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLlByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImxhIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibGlzdEFjdGlvbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgb3V0IHN1cHBvcnRlZCBhY3Rpb25zIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icHJpbnQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByaW50IGEgbWVzc2FnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJoZWxsb1dvcmxkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImJ5ZVdvcmxkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImN1c3RvbSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJoZWxsb1dvcmxkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iaHciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJoZWxsb1dvcmxkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50IG91dCAnSGVsbG8gV29ybGQnIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5IZWxsbyBXb3JsZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6bWV0aG9kTmFtZT0ic2V0TWVzc2FnZSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJieWVXb3JsZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImJ3IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iYnllV29ybGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgb3V0ICdCeWUgV29ybGQnIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5CeWUgV29ybGQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOm1ldGhvZE5hbWU9InNldE1lc3NhZ2UiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iY3VzdG9tIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImN1c3RvbSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludCBvdXQgY3VzdG9tIG1lc3NhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJQcmludE1lc3NhZ2VBY3Rpb24iIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgIDx2YWx1ZT5bXlxzXStcc1dvcmxkPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8L2JlYW4+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorPC9iZWFucz4KKworTm93IHRyeSBleGVjdXRpbmc6CisKKyQgLi9jbGktdGVzdC5zaCAtZSBQcmludE1lc3NhZ2VBY3Rpb24gLXAgLWMgIkhleSBXb3JsZCIKKworWW91IHNob3VsZCBzZWU6CitIZXkgV29ybGQKKworTGV0J3MgY2hhbmdlIGl0IGEgYml0OgorCiskIC4vY2xpLXRlc3Quc2ggLWUgUHJpbnRNZXNzYWdlQWN0aW9uIC1wIC1jICJIZXkgVGhlcmUgV29ybGQiCisKK1lvdSBzaG91bGQgc2VlOgorRVJST1I6IFZhbGlkYXRpb24gRmFpbHVyZXM6IC0gVmFsdWUgJ0hleSBUaGVyZSBXb3JsZCcgaXMgbm90IGFsbG93ZWQgZm9yIG9wdGlvbiBbbG9uZ09wdGlvbj0nY3VzdG9tJyxzaG9ydE9wdGlvbj0nYycsZGVzY3JpcHRpb249J1ByaW50IG91dCBjdXN0b20gbWVzc2FnZSddIC0gQWxsb3dlZCB2YWx1ZXMgPSBbW15cc10rXHNXb3JsZF0KKworVGhlIHZhbGlkYXRvciB1c2VkIHdhczogb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLiAgVGhpcyB2YWxpZGF0b3IgdGFrZXMgYSBqYXZhIFBhdHRlcm4gc3VwcG9ydGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyBlbmZvcmNlZCBhZ2FpbnN0IHRoZSBvcHRpb25zIGFyZ3VtZW50IHZhbHVlcy4gIE90aGVyIHN1cHBsaWVkIHZhbGlkYXRvcnMgYXJlOgorCitBbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IgLSBBcmd1bWVudCB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3VwcGxpZWQgdmFsdWVzCitDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IgLSBFeHBlY3RzIHRoZSBhcmd1bWVudCB2YWx1ZSB0byBiZSBhbiBleGlzdGluZyBqYXZhIGNsYXNzCitGaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIC0gRXhwZWN0cyB0aGUgYXJndW1lbnQgdmFsdWUgdG8gYmUgYW4gZXhpc3RpbmcgZmlsZQorCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9wb20ueG1sIGIvMC4xMC9jbGkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY2MzQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvcG9tLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwkJPHJlbGF0aXZlUGF0aD4uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKwk8L3BhcmVudD4KKwk8YXJ0aWZhY3RJZD5jYXMtY2xpPC9hcnRpZmFjdElkPgorCTxuYW1lPkNBUyBDb21tYW5kIExpbmUgSW50ZXJmYWNlPC9uYW1lPgorCTxwcm9maWxlcz4KKwkJPHByb2ZpbGU+CisJCQk8aWQ+YXVkaXQ8L2lkPgorCQkJPGFjdGl2YXRpb24+CisJCQkJPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorCQkJPC9hY3RpdmF0aW9uPgorCQkJPGJ1aWxkPgorCQkJCTxwbHVnaW5zPgorCQkJCQk8cGx1Z2luPgorCQkJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisJCQkJCQk8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGV4Y2x1ZGVzPgorCQkJCQkJCQk8ZXhjbHVkZT4qKi9yZXNvdXJjZXMvZXhhbXBsZXMvKiovKjwvZXhjbHVkZT4KKwkJCQkJCQk8L2V4Y2x1ZGVzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCQkJPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisJCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJCTxnb2FsPmNoZWNrPC9nb2FsPgorCQkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQkJPC9leGVjdXRpb25zPgorCQkJCQk8L3BsdWdpbj4KKwkJCQk8L3BsdWdpbnM+CisJCQk8L2J1aWxkPgorCQk8L3Byb2ZpbGU+CisJPC9wcm9maWxlcz4KKwk8YnVpbGQ+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxkZXNjcmlwdG9ycz4KKwkJCQkJCTxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKwkJCQkJPC9kZXNjcmlwdG9ycz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCTwvcGx1Z2lucz4KKwk8L2J1aWxkPgorCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi41LjQ8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWhpYmVybmF0ZTM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjAuODwvdmVyc2lvbj4KKwkJCTxleGNsdXNpb25zPgorCQkJCTxleGNsdXNpb24+CisJCQkJCTxncm91cElkPmphdmF4LnRyYW5zYWN0aW9uPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5qdGE8L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQk8L2V4Y2x1c2lvbnM+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xMC4wLjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwk8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvY2xpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk2YjFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorCTxpZD5kaXN0PC9pZD4KKwk8Zm9ybWF0cz4KKwkJPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KKwkJPGZvcm1hdD56aXA8L2Zvcm1hdD4KKwk8L2Zvcm1hdHM+CisJPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorCTxiYXNlRGlyZWN0b3J5PiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+CisJPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKwk8ZGVwZW5kZW5jeVNldHM+CisJCTxkZXBlbmRlbmN5U2V0PgorCQkJPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKwkJCTx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKwkJCTx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorCQkJPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKwkJCTx1bnBhY2tPcHRpb25zIC8+CisJCTwvZGVwZW5kZW5jeVNldD4KKwk8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvQ21kTGluZUFyZ3MuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvQ21kTGluZUFyZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk0MjRmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9DbWRMaW5lQXJncy5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGk7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5maW5kQWN0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5maW5kU3BlY2lmaWVkSGVscE9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZFNwZWNpZmllZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZFNwZWNpZmllZEFjdGlvbk9wdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5IZWxwQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbjsKKworLyoqCisgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB7QGxpbmsgQ21kTGluZVV0aWxpdHl9IGZvciBoZWxwaW5nIHVzZSBhbHJlYWR5IHBhcnNlZAorICogQ29tbWFuZC1MaW5lIGFyZ3VtZW50cy4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIENtZExpbmVBcmdzIHsKKworICAgcHJpdmF0ZSBDbWRMaW5lQWN0aW9uIHNwZWNpZmllZEFjdGlvbjsKKyAgIHByaXZhdGUgU2V0PENtZExpbmVBY3Rpb24+IHN1cHBvcnRlZEFjdGlvbnM7CisKKyAgIHByaXZhdGUgQ21kTGluZU9wdGlvbkluc3RhbmNlIGhlbHBPcHRpb25JbnN0OworICAgcHJpdmF0ZSBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgYWN0aW9uT3B0aW9uSW5zdDsKKyAgIHByaXZhdGUgQ21kTGluZU9wdGlvbkluc3RhbmNlIHBzYU9wdGlvbkluc3Q7CisgICBwcml2YXRlIFNldDxDbWRMaW5lT3B0aW9uPiBzdXBwb3J0ZWRPcHRpb25zOworICAgcHJpdmF0ZSBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBzcGVjaWZpZWRPcHRpb25zOworCisgICAvKiBwYWNrYWdlICovQ21kTGluZUFyZ3MoU2V0PENtZExpbmVBY3Rpb24+IHN1cHBvcnRlZEFjdGlvbnMsCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gc3VwcG9ydGVkT3B0aW9ucywKKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IHNwZWNpZmllZE9wdGlvbnMpIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoc3VwcG9ydGVkQWN0aW9ucyk7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHN1cHBvcnRlZE9wdGlvbnMpOworICAgICAgVmFsaWRhdGUubm90TnVsbChzcGVjaWZpZWRPcHRpb25zKTsKKworICAgICAgaGVscE9wdGlvbkluc3QgPSBmaW5kU3BlY2lmaWVkSGVscE9wdGlvbihzcGVjaWZpZWRPcHRpb25zKTsKKyAgICAgIHBzYU9wdGlvbkluc3QgPSBmaW5kU3BlY2lmaWVkUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKHNwZWNpZmllZE9wdGlvbnMpOworICAgICAgYWN0aW9uT3B0aW9uSW5zdCA9IGZpbmRTcGVjaWZpZWRBY3Rpb25PcHRpb24oc3BlY2lmaWVkT3B0aW9ucyk7CisKKyAgICAgIHRoaXMuc3VwcG9ydGVkT3B0aW9ucyA9IHN1cHBvcnRlZE9wdGlvbnM7CisgICAgICB0aGlzLnNwZWNpZmllZE9wdGlvbnMgPSBzcGVjaWZpZWRPcHRpb25zOworICAgICAgdGhpcy5zdXBwb3J0ZWRBY3Rpb25zID0gc3VwcG9ydGVkQWN0aW9uczsKKworICAgICAgaWYgKGFjdGlvbk9wdGlvbkluc3QgIT0gbnVsbCkgeworICAgICAgICAgc3BlY2lmaWVkQWN0aW9uID0gZmluZEFjdGlvbihhY3Rpb25PcHRpb25JbnN0LCBzdXBwb3J0ZWRBY3Rpb25zKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyoqCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSB3aGljaCBpcyB0aGUgc3BlY2lmaWVkCisgICAgKiAgICAgICAgIHtAbGluayBIZWxwQ21kTGluZU9wdGlvbn0sIG9yIG51bGwgaWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQKKyAgICAqLworICAgcHVibGljIENtZExpbmVPcHRpb25JbnN0YW5jZSBnZXRIZWxwT3B0aW9uSW5zdCgpIHsKKyAgICAgIHJldHVybiBoZWxwT3B0aW9uSW5zdDsKKyAgIH0KKworICAgLyoqCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSB3aGljaCBpcyB0aGUgc3BlY2lmaWVkCisgICAgKiAgICAgICAgIHtAbGluayBBY3Rpb25DbWRMaW5lT3B0aW9ufSwgb3IgbnVsbCBpZiBpdCB3YXMgbm90IHNwZWNpZmllZAorICAgICovCisgICBwdWJsaWMgQ21kTGluZU9wdGlvbkluc3RhbmNlIGdldEFjdGlvbk9wdGlvbkluc3QoKSB7CisgICAgICByZXR1cm4gYWN0aW9uT3B0aW9uSW5zdDsKKyAgIH0KKworICAgLyoqCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSB3aGljaCBpcyB0aGUgc3BlY2lmaWVkCisgICAgKiAgICAgICAgIHtAbGluayBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9ufSwgb3IgbnVsbCBpZiBpdCB3YXMgbm90CisgICAgKiAgICAgICAgIHNwZWNpZmllZAorICAgICovCisgICBwdWJsaWMgQ21kTGluZU9wdGlvbkluc3RhbmNlIGdldFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbkluc3QoKSB7CisgICAgICByZXR1cm4gcHNhT3B0aW9uSW5zdDsKKyAgIH0KKworICAgLyoqCisgICAgKiBAcmV0dXJuIEFsbCBzdXBwb3J0ZWQge0BsaW5rIENtZExpbmVPcHRpb259cworICAgICovCisgICBwdWJsaWMgU2V0PENtZExpbmVPcHRpb24+IGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7CisgICAgICByZXR1cm4gc3VwcG9ydGVkT3B0aW9uczsKKyAgIH0KKworICAgLyoqCisgICAgKiBAcmV0dXJuIEFsbCBzcGVjaWZpZWQge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX1zCisgICAgKi8KKyAgIHB1YmxpYyBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBnZXRTcGVjaWZpZWRPcHRpb25zKCkgeworICAgICAgcmV0dXJuIHNwZWNpZmllZE9wdGlvbnM7CisgICB9CisKKyAgIC8qKgorICAgICogQHJldHVybiBBbGwgc3VwcG9ydGVkIHtAbGluayBDbWRMaW5lQWN0aW9ufXMKKyAgICAqLworICAgcHVibGljIFNldDxDbWRMaW5lQWN0aW9uPiBnZXRTdXBwb3J0ZWRBY3Rpb25zKCkgeworICAgICAgcmV0dXJuIHN1cHBvcnRlZEFjdGlvbnM7CisgICB9CisKKyAgIC8qKgorICAgICogQHJldHVybiBUaGUge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHdhcyBzcGVjaWZpZWQKKyAgICAqLworICAgcHVibGljIENtZExpbmVBY3Rpb24gZ2V0U3BlY2lmaWVkQWN0aW9uKCkgeworICAgICAgcmV0dXJuIHNwZWNpZmllZEFjdGlvbjsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvQ21kTGluZVV0aWxpdHkuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvQ21kTGluZVV0aWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU0ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9DbWRMaW5lVXRpbGl0eS5qYXZhCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGk7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5hc0FkdmFuY2VkT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5kZXRlcm1pbmVGYWlsZWRWYWxpZGF0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5kZXRlcm1pbmVSZXF1aXJlZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZEZpcnN0QWN0aW9uT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5maW5kSGVscE9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZFBlcmZvcm1BbmRRdWl0T3B0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuaGFuZGxlUGVyZm9ybUFuZFF1aXRPcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmlzQWR2YW5jZWRPcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnN0b3JlLkNtZExpbmVBY3Rpb25TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nLlNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuY29uc3RydWN0LkNtZExpbmVDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5jb25zdHJ1Y3QuU3RkQ21kTGluZUNvbnN0cnVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVPcHRpb25TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZVBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5IZWxwQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3RvcmUuQ21kTGluZU9wdGlvblN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zdG9yZS5zcHJpbmcuU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNtZExpbmVPcHRpb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucGFyc2VyLkNtZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucGFyc2VyLlN0ZENtZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucHJlc2VudGVyLkNtZExpbmVQcmVzZW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucHJlc2VudGVyLlN0ZENtZExpbmVQcmVzZW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucHJpbnRlci5DbWRMaW5lUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5wcmludGVyLlN0ZENtZExpbmVQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuUGFyc2VkQXJnOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBBIGhpZ2hseSBjb25maWd1cmFibGUgdXRpbGl0eSBjbGFzcyB3aGljaCBzdXBwb3J0cyBwYXJzaW5nIGFuZCBoYW5kbGluZyBvZgorICogY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB2aWEgaXRzIGFjdGlvbiBkcml2ZW4gZGVzaWduLiBBZnRlciBwYXJzaW5nIHRoZQorICogY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpdCB3aWxsIGNoZWNrIGZvciByZXF1aXJlZCBhcmd1bWVudHMgbm90IHNwZWNpZmllZCwKKyAqIHZhbGlkYXRlIHRoZSBhcmd1bWVudHMsIHJ1biB0aGUgYXJndW1lbnRzIGhhbmRsZXJzIGFuZCB0aGVuIGludm9rZSB0aGUKKyAqIHNwZWNpZmllZCBhY3Rpb24uIEl0IGFsc28gc3VwcG9ydHMgcHJpbnQgb3V0IGhlbHAgbWVzc2FnZXMgYW5kIHByaW50aW5nCisgKiBzdXBwb3J0ZWQgYWN0aW9ucy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBDbWRMaW5lVXRpbGl0eSB7CisKKyAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z01vZGU7CisgICBwcml2YXRlIENtZExpbmVQYXJzZXIgcGFyc2VyOworICAgcHJpdmF0ZSBDbWRMaW5lQ29uc3RydWN0b3IgY29uc3RydWN0b3I7CisgICBwcml2YXRlIENtZExpbmVPcHRpb25TdG9yZSBvcHRpb25TdG9yZTsKKyAgIHByaXZhdGUgQ21kTGluZUFjdGlvblN0b3JlIGFjdGlvblN0b3JlOworICAgcHJpdmF0ZSBDbWRMaW5lUHJpbnRlciBwcmludGVyOworICAgcHJpdmF0ZSBDbWRMaW5lUHJlc2VudGVyIHByZXNlbnRlcjsKKworICAgcHVibGljIENtZExpbmVVdGlsaXR5KCkgeworICAgICAgcGFyc2VyID0gbmV3IFN0ZENtZExpbmVQYXJzZXIoKTsKKyAgICAgIGNvbnN0cnVjdG9yID0gbmV3IFN0ZENtZExpbmVDb25zdHJ1Y3RvcigpOworICAgICAgb3B0aW9uU3RvcmUgPSBuZXcgU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlRmFjdG9yeSgpLmNyZWF0ZVN0b3JlKCk7CisgICAgICBhY3Rpb25TdG9yZSA9IG5ldyBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5KCkuY3JlYXRlU3RvcmUoKTsKKyAgICAgIHByaW50ZXIgPSBuZXcgU3RkQ21kTGluZVByaW50ZXIoKTsKKyAgICAgIHByZXNlbnRlciA9IG5ldyBTdGRDbWRMaW5lUHJlc2VudGVyKCk7CisKKyAgICAgIGRlYnVnTW9kZSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZGVidWciKTsKKyAgIH0KKworICAgcHVibGljIENtZExpbmVPcHRpb25TdG9yZSBnZXRPcHRpb25TdG9yZSgpIHsKKyAgICAgIHJldHVybiBvcHRpb25TdG9yZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0T3B0aW9uU3RvcmUoQ21kTGluZU9wdGlvblN0b3JlIG9wdGlvblN0b3JlKSB7CisgICAgICB0aGlzLm9wdGlvblN0b3JlID0gb3B0aW9uU3RvcmU7CisgICB9CisKKyAgIHB1YmxpYyBDbWRMaW5lQWN0aW9uU3RvcmUgZ2V0QWN0aW9uU3RvcmUoKSB7CisgICAgICByZXR1cm4gYWN0aW9uU3RvcmU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEFjdGlvblN0b3JlKENtZExpbmVBY3Rpb25TdG9yZSBhY3Rpb25TdG9yZSkgeworICAgICAgdGhpcy5hY3Rpb25TdG9yZSA9IGFjdGlvblN0b3JlOworICAgfQorCisgICBwdWJsaWMgQ21kTGluZVByaW50ZXIgZ2V0UHJpbnRlcigpIHsKKyAgICAgIHJldHVybiBwcmludGVyOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcmludGVyKENtZExpbmVQcmludGVyIHByaW50ZXIpIHsKKyAgICAgIHRoaXMucHJpbnRlciA9IHByaW50ZXI7CisgICB9CisKKyAgIHB1YmxpYyBDbWRMaW5lUHJlc2VudGVyIGdldFByZXNlbnRlcigpIHsKKyAgICAgIHJldHVybiBwcmVzZW50ZXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByZXNlbnRlcihDbWRMaW5lUHJlc2VudGVyIHByZXNlbnRlcikgeworICAgICAgdGhpcy5wcmVzZW50ZXIgPSBwcmVzZW50ZXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHByaW50T3B0aW9uSGVscChDbWRMaW5lQXJncyBjbWRMaW5lQXJncykgeworICAgICAgcHJlc2VudGVyLnByZXNlbnRPcHRpb25IZWxwKHByaW50ZXIucHJpbnRPcHRpb25zSGVscChjbWRMaW5lQXJncworICAgICAgICAgICAgLmdldFN1cHBvcnRlZE9wdGlvbnMoKSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBwcmludEFjdGlvbkhlbHAoQ21kTGluZUFyZ3MgY21kTGluZUFyZ3MpIHsKKyAgICAgIFZhbGlkYXRlLm5vdEVtcHR5KGNtZExpbmVBcmdzLmdldEhlbHBPcHRpb25JbnN0KCkuZ2V0VmFsdWVzKCkpOworCisgICAgICBwcmVzZW50ZXIucHJlc2VudEFjdGlvbkhlbHAocHJpbnRlci5wcmludEFjdGlvbkhlbHAoCisgICAgICAgICAgICBDbWRMaW5lVXRpbHMuZmluZEFjdGlvbihjbWRMaW5lQXJncy5nZXRIZWxwT3B0aW9uSW5zdCgpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgICAuZ2V0KDApLCBjbWRMaW5lQXJncy5nZXRTdXBwb3J0ZWRBY3Rpb25zKCkpLAorICAgICAgICAgICAgY21kTGluZUFyZ3MuZ2V0U3VwcG9ydGVkT3B0aW9ucygpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHByaW50QWN0aW9uc0hlbHAoQ21kTGluZUFyZ3MgY21kTGluZUFyZ3MpIHsKKyAgICAgIHByZXNlbnRlci5wcmVzZW50QWN0aW9uc0hlbHAocHJpbnRlci5wcmludEFjdGlvbnNIZWxwKGNtZExpbmVBcmdzCisgICAgICAgICAgICAuZ2V0U3VwcG9ydGVkQWN0aW9ucygpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHByaW50QWN0aW9uTWVzc2FnZXMoTGlzdDxTdHJpbmc+IG1lc3NhZ2VzKSB7CisgICAgICBwcmVzZW50ZXIucHJlc2VudEFjdGlvbk1lc3NhZ2UocHJpbnRlci5wcmludEFjdGlvbk1lc3NhZ2VzKG1lc3NhZ2VzKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHByaW50VmFsaWRhdGlvbkVycm9ycyhMaXN0PENtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0PiByZXN1bHRzKSB7CisgICAgICBwcmVzZW50ZXIucHJlc2VudEVycm9yTWVzc2FnZShwcmludGVyCisgICAgICAgICAgICAucHJpbnRPcHRpb25WYWxpZGF0aW9uRXJyb3JzKHJlc3VsdHMpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgcHJpbnRNaXNzaW5nUmVxdWlyZWRPcHRpb25zRXJyb3IoCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gbWlzc2luZ09wdGlvbnMpIHsKKyAgICAgIHByZXNlbnRlci5wcmVzZW50RXJyb3JNZXNzYWdlKHByaW50ZXIKKyAgICAgICAgICAgIC5wcmludFJlcXVpcmVkT3B0aW9uc01pc3NpbmdFcnJvcihtaXNzaW5nT3B0aW9ucykpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBwcmludEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisgICAgICBwcmVzZW50ZXIucHJlc2VudEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOworICAgfQorCisgICAvKioKKyAgICAqIFBhcnNlcyBnaXZlbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCB0aGVuIGNoZWNrcyBmb3IgaGVscCBhbmQgcHJpbnQKKyAgICAqIHN1cHBvcnRlZCBhY3Rpb25zIG9wdGlvbnMsIHByaW50cyB0aGVtIG91dCBpZiBmb3VuZCwgb3RoZXJ3aXNlIHBlcmZvcm1zCisgICAgKiBleGVjdXRpb24gb24gdGhlIGFyZ3VtZW50cyAtIHNlZSBleGVjdXRlKENtZExpbmVBcmdzKS4KKyAgICAqIAorICAgICogQHBhcmFtIGFyZ3MKKyAgICAqICAgICAgICAgICBUaGUgd2hvIHdpbGwgYmUgcGFyc2VkIGFuZCBleGVjdXRlZC4KKyAgICAqLworICAgcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBDbWRMaW5lQXJncyBjbWRMaW5lQXJncyA9IHBhcnNlKGFyZ3MpOworICAgICAgICAgaWYgKGNtZExpbmVBcmdzLmdldFNwZWNpZmllZE9wdGlvbnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50T3B0aW9uSGVscChjbWRMaW5lQXJncyk7CisgICAgICAgICB9IGVsc2UgaWYgKCFoYW5kbGVIZWxwKGNtZExpbmVBcmdzKQorICAgICAgICAgICAgICAgJiYgIWhhbmRsZVByaW50U3VwcG9ydGVkQWN0aW9ucyhjbWRMaW5lQXJncykpIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoY21kTGluZUFyZ3MpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIGlmIChkZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgfQorICAgICAgICAgcHJpbnRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgfQorCisgICAvKioKKyAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgY29udmVydHMgaXQgdG8KKyAgICAqIHtAbGluayBDbWRMaW5lQXJnc30uCisgICAgKiAKKyAgICAqIEBwYXJhbSBhcmdzCisgICAgKiAgICAgICAgICAgVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UuCisgICAgKiBAcmV0dXJuIFRoZSBwYXJzZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbiB7QGxpbmsgQ21kTGluZUFyZ3N9IGZvcm0uCisgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgKiAgICAgICAgICAgIE9uIGVycm9yIHBhcnNpbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAqIEB0aHJvd3MgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbgorICAgICogICAgICAgICAgICBPbiBlcnJvciBjb25zdHJ1Y3RpbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAqIEB0aHJvd3MgQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uCisgICAgKi8KKyAgIHB1YmxpYyBDbWRMaW5lQXJncyBwYXJzZShTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ21kTGluZVBhcnNlckV4Y2VwdGlvbiwKKyAgICAgICAgIENtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbiwgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgIENtZExpbmVPcHRpb25TdG9yZUV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHBhcnNlcik7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvblN0b3JlKTsKKworICAgICAgLy8gTG9hZCBzdXBwb3J0ZWQgb3B0aW9ucy4KKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiB2YWxpZE9wdGlvbnMgPSBvcHRpb25TdG9yZS5sb2FkU3VwcG9ydGVkT3B0aW9ucygpOworICAgICAgaW5pdGlhbGl6ZUhhbmRsZXJzKHZhbGlkT3B0aW9ucyk7CisKKyAgICAgIC8vIEluc3VyZSBoZWxwIG9wdGlvbnMgaXMgcHJlc2VudCBpZiByZXF1aXJlZC4KKyAgICAgIGlmIChmaW5kSGVscE9wdGlvbih2YWxpZE9wdGlvbnMpID09IG51bGwpIHsKKyAgICAgICAgIHZhbGlkT3B0aW9ucy5hZGQobmV3IEhlbHBDbWRMaW5lT3B0aW9uKCkpOworICAgICAgfQorCisgICAgICAvLyBJbnN1cmUgYWN0aW9uIG9wdGlvbnMgYXJlIHByZXNlbnQgaWYgcmVxdWlyZWQuCisgICAgICBpZiAoZmluZEZpcnN0QWN0aW9uT3B0aW9uKHZhbGlkT3B0aW9ucykgPT0gbnVsbCkgeworICAgICAgICAgdmFsaWRPcHRpb25zLmFkZChuZXcgQWN0aW9uQ21kTGluZU9wdGlvbigpKTsKKyAgICAgIH0KKworICAgICAgLy8gSW5zdXJlIHByaW50IHN1cHBvcnRlZCBhY3Rpb25zIG9wdGlvbiBpcyBwcmVzZW50IGlmIHJlcXVpcmVkLgorICAgICAgaWYgKGZpbmRQcmludFN1cHBvcnRlZEFjdGlvbnNPcHRpb24odmFsaWRPcHRpb25zKSA9PSBudWxsKSB7CisgICAgICAgICB2YWxpZE9wdGlvbnMuYWRkKG5ldyBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uKCkpOworICAgICAgfQorCisgICAgICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAgcmV0dXJuIG5ldyBDbWRMaW5lQXJncyhhY3Rpb25TdG9yZS5sb2FkU3VwcG9ydGVkQWN0aW9ucygpLCB2YWxpZE9wdGlvbnMsCisgICAgICAgICAgICBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3QoCisgICAgICAgICAgICAgICAgICBuZXcgQ21kTGluZUl0ZXJhYmxlPFBhcnNlZEFyZz4ocGFyc2VyLnBhcnNlKGFyZ3MpKSwKKyAgICAgICAgICAgICAgICAgIHZhbGlkT3B0aW9ucykpOworICAgfQorCisgICAvKioKKyAgICAqIEluaXRpYWxpemVzIGVhY2gge0BsaW5rIENtZExpbmVPcHRpb25IYW5kbGVyfSB3aXRoIHRoZWlyIGFzc2lnbmVkCisgICAgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn0uCisgICAgKiAKKyAgICAqIEBwYXJhbSBvcHRpb25zCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVIYW5kbGVycyhTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucykgeworICAgICAgZm9yIChDbWRMaW5lT3B0aW9uIG9wdGlvbiA6IG9wdGlvbnMpIHsKKyAgICAgICAgIGlmIChpc0FkdmFuY2VkT3B0aW9uKG9wdGlvbikKKyAgICAgICAgICAgICAgICYmIGFzQWR2YW5jZWRPcHRpb24ob3B0aW9uKS5nZXRIYW5kbGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNBZHZhbmNlZE9wdGlvbihvcHRpb24pLmdldEhhbmRsZXIoKS5pbml0aWFsaXplKG9wdGlvbik7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qKgorICAgICogQ2hlY2tzIGlmIGhlbHAgb3B0aW9uIHdhcyBzcGVjaWZpZWQgYW5kIGlmIHNvIHByaW50cyBvdXQgaGVscC4KKyAgICAqIAorICAgICogQHBhcmFtIGNtZExpbmVBcmdzCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lQXJnc30gd2hpY2ggd2lsbCBiZSBjaGVja2VkIGZvciBoZWxwIG9wdGlvbgorICAgICogQHJldHVybiBUcnVlIGlmIGhlbHAgd2FzIHByaW50ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICovCisgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVIZWxwKENtZExpbmVBcmdzIGNtZExpbmVBcmdzKSB7CisgICAgICBpZiAoY21kTGluZUFyZ3MuZ2V0SGVscE9wdGlvbkluc3QoKSAhPSBudWxsKSB7CisgICAgICAgICBpZiAoY21kTGluZUFyZ3MuZ2V0SGVscE9wdGlvbkluc3QoKS5nZXRWYWx1ZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50T3B0aW9uSGVscChjbWRMaW5lQXJncyk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRBY3Rpb25IZWxwKGNtZExpbmVBcmdzKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvKioKKyAgICAqIENoZWNrcyBpZiBwcmludCBzdXBwb3J0ZWQgYWN0aW9ucyBvcHRpb24gd2FzIHNwZWNpZmllZCBhbmQgaWYgc28gcHJpbnRzCisgICAgKiBvdXQgc3VwcG9ydGVkIGFjdGlvbnMuCisgICAgKiAKKyAgICAqIEBwYXJhbSBjbWRMaW5lQXJncworICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZUFyZ3N9IHdoaWNoIHdpbGwgYmUgY2hlY2tlZCBmb3IgcHJpbnQKKyAgICAqICAgICAgICAgICBzdXBwb3J0ZWQgYWN0aW9uIG9wdGlvbnMKKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzdXBwb3J0ZWQgYWN0aW9ucyB3YXMgcHJpbnRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgKi8KKyAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVByaW50U3VwcG9ydGVkQWN0aW9ucyhDbWRMaW5lQXJncyBjbWRMaW5lQXJncykgeworICAgICAgaWYgKGNtZExpbmVBcmdzLmdldFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbkluc3QoKSAhPSBudWxsKSB7CisgICAgICAgICBwcmludEFjdGlvbnNIZWxwKGNtZExpbmVBcmdzKTsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvKioKKyAgICAqIENoZWNrcyBpZiByZXF1aXJlZCBvcHRpb25zIGFyZSBzZXQgYW5kIHZhbGlkYXRpb24gcGFzc2VzLCB0aGVuIHJ1bnMKKyAgICAqIGhhbmRsZXJzIGFuZCBleGVjdXRlcyBpdHMgYWN0aW9uLgorICAgICogCisgICAgKiBAcGFyYW0gY21kTGluZUFyZ3MKKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBcmdzfSBmb3Igd2hpY2ggZXhlY3V0aW9uIHByb2Nlc3Npbmcgd2lsbCBiZQorICAgICogICAgICAgICAgIHJ1bi4KKyAgICAqLworICAgcHVibGljIHZvaWQgZXhlY3V0ZShDbWRMaW5lQXJncyBjbWRMaW5lQXJncykKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uLCBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IHBlcmZvcm1BbmRRdWl0T3B0aW9ucyA9IGZpbmRQZXJmb3JtQW5kUXVpdE9wdGlvbnMoY21kTGluZUFyZ3MKKyAgICAgICAgICAgIC5nZXRTcGVjaWZpZWRPcHRpb25zKCkpOworICAgICAgaWYgKCFwZXJmb3JtQW5kUXVpdE9wdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICBmb3IgKENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb24gOiBwZXJmb3JtQW5kUXVpdE9wdGlvbnMpIHsKKyAgICAgICAgICAgIGhhbmRsZVBlcmZvcm1BbmRRdWl0T3B0aW9uKG9wdGlvbik7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChjbWRMaW5lQXJncy5nZXRBY3Rpb25PcHRpb25JbnN0KCkgPT0gbnVsbCkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGVjdXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGFuIGFjdGlvbiBvcHRpb24hIik7CisgICAgICB9CisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRPcHRpb25zTm90U2V0ID0gY2hlY2soY21kTGluZUFyZ3MpOworICAgICAgaWYgKCFyZXF1aXJlZE9wdGlvbnNOb3RTZXQuaXNFbXB0eSgpKSB7CisgICAgICAgICBwcmludE1pc3NpbmdSZXF1aXJlZE9wdGlvbnNFcnJvcihyZXF1aXJlZE9wdGlvbnNOb3RTZXQpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBMaXN0PENtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0PiBmYWlsZWRWYWxpZGF0aW9uUmVzdWx0cyA9IGRldGVybWluZUZhaWxlZFZhbGlkYXRpb24odmFsaWRhdGUoY21kTGluZUFyZ3MpKTsKKyAgICAgIGlmICghZmFpbGVkVmFsaWRhdGlvblJlc3VsdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICBwcmludFZhbGlkYXRpb25FcnJvcnMoZmFpbGVkVmFsaWRhdGlvblJlc3VsdHMpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBoYW5kbGUoY21kTGluZUFyZ3MpOworCisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBjbWRMaW5lQXJncy5nZXRTcGVjaWZpZWRBY3Rpb24oKS5leGVjdXRlKHByaW50ZXIpOworICAgICAgcHJpbnRBY3Rpb25NZXNzYWdlcyhwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBDaGVja3MgZm9yIHJlcXVpcmVkIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBzZXQgYW5kIHJldHVybnMgdGhlIG9uZXMgaXQKKyAgICAqIGZpbmRzLgorICAgICogCisgICAgKiBAcGFyYW0gY21kTGluZUFyZ3MKKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBcmdzfSB3aGljaCB3aWxsIGJlIGNoZWNrIGZvciByZXF1aXJlZAorICAgICogICAgICAgICAgIG9wdGlvbnMuCisgICAgKiBAcmV0dXJuIFRoZSByZXF1aXJlZCB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIG5vdCBzcGVjaWZpZWQuCisgICAgKi8KKyAgIHB1YmxpYyBzdGF0aWMgU2V0PENtZExpbmVPcHRpb24+IGNoZWNrKENtZExpbmVBcmdzIGNtZExpbmVBcmdzKSB7CisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRPcHRpb25zID0gZGV0ZXJtaW5lUmVxdWlyZWQoCisgICAgICAgICAgICBjbWRMaW5lQXJncy5nZXRTcGVjaWZpZWRBY3Rpb24oKSwgY21kTGluZUFyZ3MuZ2V0U3VwcG9ydGVkT3B0aW9ucygpKTsKKyAgICAgIEhhc2hTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRPcHRpb25zTm90U2V0ID0gbmV3IEhhc2hTZXQ8Q21kTGluZU9wdGlvbj4oCisgICAgICAgICAgICByZXF1aXJlZE9wdGlvbnMpOworICAgICAgZm9yIChDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugc3BlY2lmaWVkT3B0aW9uIDogY21kTGluZUFyZ3MKKyAgICAgICAgICAgIC5nZXRTcGVjaWZpZWRPcHRpb25zKCkpIHsKKyAgICAgICAgIHJlcXVpcmVkT3B0aW9uc05vdFNldC5yZW1vdmUoc3BlY2lmaWVkT3B0aW9uLmdldE9wdGlvbigpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXF1aXJlZE9wdGlvbnNOb3RTZXQ7CisgICB9CisKKyAgIC8qKgorICAgICogUnVucyB2YWxpZGF0aW9uIG9uIHtAbGluayBDbWRMaW5lQXJnc30gYW5kIHJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4KKyAgICAqIAorICAgICogQHBhcmFtIGNtZExpbmVBcmdzCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lQXJnc30gd2hpY2ggd2lsbCBiZSB2YWxpZGF0ZWQuCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHR9cyBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nCisgICAgKiAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfXMuCisgICAgKi8KKyAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdD4gdmFsaWRhdGUoCisgICAgICAgICBDbWRMaW5lQXJncyBjbWRMaW5lQXJncykgeworICAgICAgVmFsaWRhdGUubm90TnVsbChjbWRMaW5lQXJncyk7CisKKyAgICAgIExpc3Q8Q21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQ+IHJlc3VsdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIGZvciAoQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3QgOiBjbWRMaW5lQXJncy5nZXRTcGVjaWZpZWRPcHRpb25zKCkpIHsKKyAgICAgICAgIHJlc3VsdHMuYWRkQWxsKENtZExpbmVVdGlscy52YWxpZGF0ZShvcHRpb25JbnN0KSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgIH0KKworICAgLyoqCisgICAgKiBSdW5zIHRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkhhbmRsZXJ9cyBmb3Ige0BsaW5rIENtZExpbmVBcmdzfSBnaXZlbi4KKyAgICAqIAorICAgICogQHBhcmFtIGNtZExpbmVBcmdzCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lQXJnc30gd2hvc2Ugb3B0aW9uIGhhbmRsZXJzIHdpbGwgYmUgcnVuLgorICAgICovCisgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlKENtZExpbmVBcmdzIGNtZExpbmVBcmdzKSB7CisgICAgICBmb3IgKENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb24gOiBjbWRMaW5lQXJncy5nZXRTcGVjaWZpZWRPcHRpb25zKCkpIHsKKyAgICAgICAgIENtZExpbmVVdGlscy5oYW5kbGUoY21kTGluZUFyZ3MuZ2V0U3BlY2lmaWVkQWN0aW9uKCksIG9wdGlvbik7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9DbWRMaW5lQWN0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9DbWRMaW5lQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2OTU0YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL0NtZExpbmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBBY3Rpb24gd2hpY2ggaXMgc3BlY2lmaWVkIGFuZCBjb25maWd1cmVkIHZpYSB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIGFuZAorICogdGhlbiBleGVjdXRlZC4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbWRMaW5lQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgcHJpdmF0ZSBTdHJpbmcgZGV0YWlsZWREZXNjcmlwdGlvbjsKKyAgIHByaXZhdGUgU3RyaW5nIGV4YW1wbGVzOworCisgICBwdWJsaWMgQ21kTGluZUFjdGlvbigpIHsKKyAgIH0KKworICAgcHVibGljIENtZExpbmVBY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgcmV0dXJuIG5hbWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZERlc2NyaXB0aW9uKFN0cmluZyBkZXRhaWxlZERlc2NyaXB0aW9uKSB7CisgICAgICB0aGlzLmRldGFpbGVkRGVzY3JpcHRpb24gPSBkZXRhaWxlZERlc2NyaXB0aW9uOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbGVkRGVzY3JpcHRpb24oKSB7CisgICAgICByZXR1cm4gZGV0YWlsZWREZXNjcmlwdGlvbjsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RXhhbXBsZXMoU3RyaW5nIGV4YW1wbGVzKSB7CisgICAgICB0aGlzLmV4YW1wbGVzID0gZXhhbXBsZXM7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZXMoKSB7CisgICAgICByZXR1cm4gZXhhbXBsZXM7CisgICB9CisKKyAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGlvbk1lc3NhZ2VQcmludGVyIHsKKyAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1lc3NhZ2VzOworCisgICAgICBwdWJsaWMgQWN0aW9uTWVzc2FnZVByaW50ZXIoKSB7CisgICAgICAgICBtZXNzYWdlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICBwcmludChtZXNzYWdlKTsKKyAgICAgICAgIHByaW50bG4oKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHsKKyAgICAgICAgIG1lc3NhZ2VzLmFkZCgiXG4iKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcmludGVkTWVzc2FnZXMoKSB7CisgICAgICAgICByZXR1cm4gbWVzc2FnZXM7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9QcmludE1lc3NhZ2VBY3Rpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL1ByaW50TWVzc2FnZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YWFiZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9QcmludE1lc3NhZ2VBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggcHJpbnRzIG91dCBhIGdpdmVuIG1lc3NhZ2UuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUHJpbnRNZXNzYWdlQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG1lc3NhZ2UsICJNdXN0IHNwZWNpZnkgbWVzc2FnZSIpOworCisgICAgICBwcmludGVyLnByaW50KG1lc3NhZ2UpOworICAgfQorCisgICBAUmVxdWlyZWQKKyAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgIHJldHVybiBtZXNzYWdlOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9hY3Rpb24vc3RvcmUvQ21kTGluZUFjdGlvblN0b3JlLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9DbWRMaW5lQWN0aW9uU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJiNGYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9hY3Rpb24vc3RvcmUvQ21kTGluZUFjdGlvblN0b3JlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zdG9yZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbjsKKworLyoqCisgKiBTdG9yYWdlIGZvciBsb2FkaW5nIHN1cHBvcnRlZCB7QGxpbmsgQ21kTGluZUFjdGlvbn1zLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGludGVyZmFjZSBDbWRMaW5lQWN0aW9uU3RvcmUgeworCisgICBwdWJsaWMgU2V0PENtZExpbmVBY3Rpb24+IGxvYWRTdXBwb3J0ZWRBY3Rpb25zKCkKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9DbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5LmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9DbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5MDM4NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL3N0b3JlL0NtZExpbmVBY3Rpb25TdG9yZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnN0b3JlOworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBDbWRMaW5lQWN0aW9uU3RvcmV9cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ21kTGluZUFjdGlvblN0b3JlRmFjdG9yeSB7CisKKyAgIHB1YmxpYyBDbWRMaW5lQWN0aW9uU3RvcmUgY3JlYXRlU3RvcmUoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmUuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY3MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9hY3Rpb24vc3RvcmUvc3ByaW5nL1NwcmluZ0NtZExpbmVBY3Rpb25TdG9yZS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnN0b3JlLkNtZExpbmVBY3Rpb25TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dDsKKworLyoqCisgKiBBIFNwcmluZyBGcmFtZXdvcmsgYmFzZWQge0BsaW5rIENtZExpbmVBY3Rpb25TdG9yZX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlIGltcGxlbWVudHMgQ21kTGluZUFjdGlvblN0b3JlIHsKKworICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dDsKKworICAgcHVibGljIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZShTdHJpbmcgc3ByaW5nQ29uZmlnKSB7CisgICAgICBhcHBDb250ZXh0ID0gbmV3IEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQoc3ByaW5nQ29uZmlnKTsKKyAgICAgIGhhbmRsZVNwcmluZ1NldENvbnRleHRJbmplY3Rpb25UeXBlKCk7CisgICAgICBoYW5kbGVTZXR0aW5nTmFtZUZvckNtZExpbmVBY3Rpb25zKCk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFNldDxDbWRMaW5lQWN0aW9uPiBsb2FkU3VwcG9ydGVkQWN0aW9ucygpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgTWFwPFN0cmluZywgQ21kTGluZUFjdGlvbj4gYWN0aW9uc01hcCA9IGFwcENvbnRleHQKKyAgICAgICAgICAgIC5nZXRCZWFuc09mVHlwZShDbWRMaW5lQWN0aW9uLmNsYXNzKTsKKyAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbWRMaW5lQWN0aW9uPihhY3Rpb25zTWFwLnZhbHVlcygpKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSB7CisgICAgICByZXR1cm4gYXBwQ29udGV4dDsKKyAgIH0KKworICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNwcmluZ1NldENvbnRleHRJbmplY3Rpb25UeXBlKCkgeworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBNYXA8U3RyaW5nLCBTcHJpbmdTZXRDb250ZXh0SW5qZWN0aW9uVHlwZT4gYmVhbnMgPSBhcHBDb250ZXh0CisgICAgICAgICAgICAuZ2V0QmVhbnNPZlR5cGUoU3ByaW5nU2V0Q29udGV4dEluamVjdGlvblR5cGUuY2xhc3MpOworICAgICAgZm9yIChTcHJpbmdTZXRDb250ZXh0SW5qZWN0aW9uVHlwZSBiZWFuIDogYmVhbnMudmFsdWVzKCkpIHsKKyAgICAgICAgIGJlYW4uc2V0Q29udGV4dChhcHBDb250ZXh0KTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNldHRpbmdOYW1lRm9yQ21kTGluZUFjdGlvbnMoKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIE1hcDxTdHJpbmcsIENtZExpbmVBY3Rpb24+IGJlYW5zID0gYXBwQ29udGV4dAorICAgICAgICAgICAgLmdldEJlYW5zT2ZUeXBlKENtZExpbmVBY3Rpb24uY2xhc3MpOworICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIENtZExpbmVBY3Rpb24+IGVudHJ5IDogYmVhbnMuZW50cnlTZXQoKSkgeworICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKS5zZXROYW1lKGVudHJ5LmdldEtleSgpKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5LmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9zcHJpbmcvU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzk5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9zcHJpbmcvU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zdG9yZS5DbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmV9cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5IGltcGxlbWVudHMKKyAgICAgIENtZExpbmVBY3Rpb25TdG9yZUZhY3RvcnkgeworCisgICBwcml2YXRlIFN0cmluZyBjb25maWc7CisKKyAgIHB1YmxpYyBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmVGYWN0b3J5KCkgeworICAgICAgY29uZmlnID0gU3lzdGVtLmdldFByb3BlcnR5KAorICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnIiwgbnVsbCk7CisgICB9CisKKyAgIHB1YmxpYyBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmUgY3JlYXRlU3RvcmUoKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGNvbmZpZyk7CisKKyAgICAgIHJldHVybiBuZXcgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlKGNvbmZpZyk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9zcHJpbmcvU3ByaW5nU2V0Q29udGV4dEluamVjdGlvblR5cGUuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdTZXRDb250ZXh0SW5qZWN0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTFiNzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9zcHJpbmcvU3ByaW5nU2V0Q29udGV4dEluamVjdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnN0b3JlLnNwcmluZzsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8qKgorICogSW50ZXJmYWNlIHdoaWNoIGlmIGltcGxlbWVudGVkIHdpbGwgaGF2ZSB0aGUgU3ByaW5nIEZyYW1ld29yaworICoge0BsaW5rIEFwcGxpY2F0aW9uQ29udGV4dH0gaW5qZWN0ZWQgdmlhIHRoZSBzZXR0ZXIgbWV0aG9kIGFmdGVyIGxvYWRpbmcgZnJvbQorICogU3ByaW5nIFhNTCBjb25maWd1cmF0aW9uLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGludGVyZmFjZSBTcHJpbmdTZXRDb250ZXh0SW5qZWN0aW9uVHlwZSB7CisKKyAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQpOworCisgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0IGdldENvbnRleHQoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvY29uc3RydWN0L0NtZExpbmVDb25zdHJ1Y3Rvci5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9jb25zdHJ1Y3QvQ21kTGluZUNvbnN0cnVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjNDYxMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvY29uc3RydWN0L0NtZExpbmVDb25zdHJ1Y3Rvci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5jb25zdHJ1Y3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQ29uc3RydWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lSXRlcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5QYXJzZWRBcmc7CisKKy8qKgorICogUmVzcG9uc2libGUgZm9yIGNvbnN0cnVjdGluZyB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfXMgZnJvbSBwYXJzZWQKKyAqIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ21kTGluZUNvbnN0cnVjdG9yIHsKKworICAgcHVibGljIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IGNvbnN0cnVjdChDbWRMaW5lSXRlcmFibGU8UGFyc2VkQXJnPiBwYXJzZWRBcmdzLAorICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IHZhbGlkT3B0aW9ucykgdGhyb3dzIENtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvY29uc3RydWN0L1N0ZENtZExpbmVDb25zdHJ1Y3Rvci5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9jb25zdHJ1Y3QvU3RkQ21kTGluZUNvbnN0cnVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4ZGI2ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvY29uc3RydWN0L1N0ZENtZExpbmVDb25zdHJ1Y3Rvci5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuY29uc3RydWN0OworCisvL09PRFQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZ2V0T3B0aW9uQnlOYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5pc0hlbHBPcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmlzU3ViT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5zb3J0T3B0aW9uc0J5UmVxdWlyZWRTdGF0dXM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVJdGVyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLlBhcnNlZEFyZzsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCisvKioKKyAqIFN0YW5kYXJkIHtAbGluayBDbWRMaW5lQ29uc3RydWN0b3J9IHdoaWNoIHN1cHBvcnQgb3B0aW9ucyBhbmQgb3B0aW9uCisgKiBncm91cHMuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTdGRDbWRMaW5lQ29uc3RydWN0b3IgaW1wbGVtZW50cyBDbWRMaW5lQ29uc3RydWN0b3IgeworCisgICBwdWJsaWMgU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gY29uc3RydWN0KENtZExpbmVJdGVyYWJsZTxQYXJzZWRBcmc+IHBhcnNlZEFyZ3MsCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gdmFsaWRPcHRpb25zKSB0aHJvd3MgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBIYXNoU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gb3B0aW9uSW5zdGFuY2VzID0gbmV3IEhhc2hTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPigpOworCisgICAgICBTdGFjazxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IGdyb3VwT3B0aW9ucyA9IG5ldyBTdGFjazxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+KCk7CisgICAgICBmb3IgKFBhcnNlZEFyZyBhcmcgOiBwYXJzZWRBcmdzKSB7CisKKyAgICAgICAgIGlmIChhcmcuZ2V0VHlwZSgpLmVxdWFscyhQYXJzZWRBcmcuVHlwZS5PUFRJT04pKSB7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIG9wdGlvbiBpcyBhIHZhbGlkIG9uZQorICAgICAgICAgICAgQ21kTGluZU9wdGlvbiBvcHRpb24gPSBnZXRPcHRpb25CeU5hbWUoYXJnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgIHZhbGlkT3B0aW9ucyk7CisgICAgICAgICAgICBpZiAob3B0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQ29uc3RydWN0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIG9wdGlvbjogJyIgKyBhcmcuZ2V0TmFtZSgpICsgIiciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVhZCBmb3VuZCBvcHRpb24KKyAgICAgICAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBzcGVjaWZpZWRPcHRpb24gPSBnZXRPcHRpb24ocGFyc2VkQXJncywgb3B0aW9uKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSBsb2FkaW5nIHN1Yk9wdGlvbnMuCisgICAgICAgICAgICBpZiAoIWdyb3VwT3B0aW9ucy5pc0VtcHR5KCkpIHsKKworICAgICAgICAgICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIGN1cnJlbnRHcm91cCA9IGdyb3VwT3B0aW9ucy5wZWVrKCk7CisKKyAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG9wdGlvbiBpcyBOT1QgYSBzdWJPcHRpb24gZm9yIGN1cnJlbnQgZ3JvdXAuCisgICAgICAgICAgICAgICBpZiAoIWlzU3ViT3B0aW9uKGN1cnJlbnRHcm91cC5nZXRPcHRpb24oKSwgb3B0aW9uKSkgeworCisgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGdyb3VwIHdhcyBleHBlY3RpbmcgbW9yZSBzdWJPcHRpb25zLgorICAgICAgICAgICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IHJlcXVpcmVkU3ViT3B0aW9ucyA9IHZlcmlmeUdyb3VwSGFzUmVxdWlyZWRTdWJPcHRpb25zKGN1cnJlbnRHcm91cCk7CisgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmVkU3ViT3B0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQ29uc3RydWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgdGhlIGZvbGxvd2luZyByZXF1aXJlZCBzdWJPcHRpb25zIGZvciAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50R3JvdXAuZ2V0T3B0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIic6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29ydE9wdGlvbnNCeVJlcXVpcmVkU3RhdHVzKHJlcXVpcmVkU3ViT3B0aW9ucykpOworCisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRHcm91cC5nZXRTdWJPcHRpb25zKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBzdWJPcHRpb24gZm9yIGdyb3VwIG9wdGlvbiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50R3JvdXAuZ2V0T3B0aW9uKCkgKyAiJyIpOworCisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAvLyBwb3AgZ3JvdXAgYW5kIGFkZCB0byBsaXN0IG9mIHNwZWNpZmllZCBvcHRpb25zLgorICAgICAgICAgICAgICAgICAgICAgb3B0aW9uSW5zdGFuY2VzLmFkZChncm91cE9wdGlvbnMucG9wKCkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgLy8gSXQgaXMgYSBzdWItb3B0aW9uLi4uCisgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAvLyBBZGQgb3B0aW9uIHRvIGN1cnJlbnQgZ3JvdXAgc3ViT3B0aW9ucy4KKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cC5hZGRTdWJPcHRpb24oc3BlY2lmaWVkT3B0aW9uKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBHcm91cENtZExpbmVPcHRpb24pIHsKKworICAgICAgICAgICAgICAgLy8gUHVzaCBncm91cCBhcyBjdXJyZW50IGdyb3VwLgorICAgICAgICAgICAgICAgZ3JvdXBPcHRpb25zLnB1c2goc3BlY2lmaWVkT3B0aW9uKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBcmdzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgc3ViT3B0aW9uIGZvciBncm91cCBvcHRpb24gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3BlY2lmaWVkT3B0aW9uLmdldE9wdGlvbigpICsgIiciKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmlzU3ViT3B0aW9uKCkpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQ29uc3RydWN0aW9uRXhjZXB0aW9uKCJPcHRpb24gJyIgKyBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICsgIicgaXMgYSBzdWJPcHRpb24sIGJ1dCB3YXMgdXNlZCBhdCB0b3AgbGV2ZWwgT3B0aW9uIik7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgIC8vIE9wdGlvbiBnb29kIHRvIGdvLgorICAgICAgICAgICAgICAgb3B0aW9uSW5zdGFuY2VzLmFkZChzcGVjaWZpZWRPcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQ29uc3RydWN0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIGFyZ3VtZW50OiAnIiArIGFyZyArICInIik7CisgICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAoIWdyb3VwT3B0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBjdXJyZW50R3JvdXAgPSBncm91cE9wdGlvbnMucG9wKCk7CisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRTdWJPcHRpb25zID0gdmVyaWZ5R3JvdXBIYXNSZXF1aXJlZFN1Yk9wdGlvbnMoY3VycmVudEdyb3VwKTsKKyAgICAgICAgIGlmICghcmVxdWlyZWRTdWJPcHRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiTWlzc2luZyB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHN1Yk9wdGlvbnMgZm9yICciCisgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRHcm91cC5nZXRPcHRpb24oKSArICInOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHNvcnRPcHRpb25zQnlSZXF1aXJlZFN0YXR1cyhyZXF1aXJlZFN1Yk9wdGlvbnMpKTsKKworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wdGlvbkluc3RhbmNlcy5hZGQoY3VycmVudEdyb3VwKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBvcHRpb25JbnN0YW5jZXM7CisgICB9CisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgLyogcGFja2FnZSAqL3N0YXRpYyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgZ2V0T3B0aW9uKENtZExpbmVJdGVyYWJsZTxQYXJzZWRBcmc+IGFyZ3MsCisgICAgICAgICBDbWRMaW5lT3B0aW9uIG9wdGlvbikgdGhyb3dzIENtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb24geworICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIHNwZWNpZmllZE9wdGlvbiA9IG5ldyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UoKTsKKyAgICAgIHNwZWNpZmllZE9wdGlvbi5zZXRPcHRpb24ob3B0aW9uKTsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoYXJncyk7CisgICAgICBpZiAoaXNIZWxwT3B0aW9uKG9wdGlvbikpIHsKKyAgICAgICAgIHNwZWNpZmllZE9wdGlvbi5zZXRWYWx1ZXModmFsdWVzKTsgICAgICAgICAKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmhhc0FyZ3MoKSkgeworICAgICAgICAgaWYgKCF2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzcGVjaWZpZWRPcHRpb24uc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb24uaGFzU3RhdGljQXJncygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbigiT3B0aW9uICIgKyBvcHRpb24gKyAiIHJlcXVpcmVzIGFyZ3MiKTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbi5oYXNBcmdzKCkgJiYgIXZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQ29uc3RydWN0aW9uRXhjZXB0aW9uKCJPcHRpb24gIiArIG9wdGlvbiArICIgZG9lcyBub3Qgc3VwcG9ydCBhcmdzIik7CisgICAgICB9CisgICAgICByZXR1cm4gc3BlY2lmaWVkT3B0aW9uOworICAgfQorCisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgLyogcGFja2FnZSAqL3N0YXRpYyBTZXQ8Q21kTGluZU9wdGlvbj4gdmVyaWZ5R3JvdXBIYXNSZXF1aXJlZFN1Yk9wdGlvbnMoCisgICAgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgZ3JvdXApIHsKKyAgICAgIFZhbGlkYXRlLmlzVHJ1ZShncm91cC5pc0dyb3VwKCkpOworCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gbWlzc2luZ1N1Yk9wdGlvbnMgPSBuZXcgSGFzaFNldDxDbWRMaW5lT3B0aW9uPigpOworICAgICAgVE9QOiBmb3IgKEdyb3VwU3ViT3B0aW9uIHN1Yk9wdGlvbiA6ICgoR3JvdXBDbWRMaW5lT3B0aW9uKSBncm91cC5nZXRPcHRpb24oKSkKKyAgICAgICAgICAgIC5nZXRTdWJPcHRpb25zKCkpIHsKKyAgICAgICAgIGlmIChzdWJPcHRpb24uaXNSZXF1aXJlZCgpKSB7CisgICAgICAgICAgICBmb3IgKENtZExpbmVPcHRpb25JbnN0YW5jZSBzcGVjaWZpZWRTdWJPcHRpb24gOiBncm91cAorICAgICAgICAgICAgICAgICAgLmdldFN1Yk9wdGlvbnMoKSkgeworICAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFN1Yk9wdGlvbi5nZXRPcHRpb24oKS5lcXVhbHMoc3ViT3B0aW9uLmdldE9wdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgY29udGludWUgVE9QOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWlzc2luZ1N1Yk9wdGlvbnMuYWRkKHN1Yk9wdGlvbi5nZXRPcHRpb24oKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbWlzc2luZ1N1Yk9wdGlvbnM7CisgICB9CisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgLyogcGFja2FnZSAqL3N0YXRpYyBMaXN0PFN0cmluZz4gZ2V0VmFsdWVzKENtZExpbmVJdGVyYWJsZTxQYXJzZWRBcmc+IGFyZ3MpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgIFBhcnNlZEFyZyBuZXh0VmFsdWUgPSBhcmdzLmluY3JlbWVudEFuZEdldCgpOworICAgICAgd2hpbGUgKG5leHRWYWx1ZSAhPSBudWxsICYmIG5leHRWYWx1ZS5nZXRUeXBlKCkuZXF1YWxzKFBhcnNlZEFyZy5UeXBlLlZBTFVFKSkgeworICAgICAgICAgdmFsdWVzLmFkZChuZXh0VmFsdWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgIG5leHRWYWx1ZSA9IGFyZ3MuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICB9CisgICAgICBhcmdzLmRlc2NyZW1lbnRJbmRleCgpOworICAgICAgcmV0dXJuIHZhbHVlczsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVBY3Rpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVBY3Rpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQ1NmVjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9leGNlcHRpb24vQ21kTGluZUFjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb247CisKKy8qKgorICogQW4ge0BsaW5rIEV4Y2VwdGlvbn0gdGhyb3duIHdoZW4gZmFpbHVyZSB0byBleGVjdXRlIGEge0BsaW5rIENtZExpbmVBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY0MTYzMDI5NjMwNDc3MjYwMzJMOworCisgICBwdWJsaWMgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICBzdXBlcihtc2cpOworICAgfQorCisgICBwdWJsaWMgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobXNnLCB0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVBY3Rpb25FeGVjdXRpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVBY3Rpb25FeGVjdXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTcwOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9leGNlcHRpb24vQ21kTGluZUFjdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb247CisKKy8qKgorICogQW4ge0BsaW5rIEV4Y2VwdGlvbn0gdGhyb3duIHdoZW4gZmFpbHVyZSB0byBleGVjdXRlIGEge0BsaW5rIENtZExpbmVBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ21kTGluZUFjdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3ODQxMzk3OTMwODY1MzgyNDlMOworCisgICBwdWJsaWMgQ21kTGluZUFjdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICBzdXBlcihtc2cpOworICAgfQorCisgICBwdWJsaWMgQ21kTGluZUFjdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobXNnLCB0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9leGNlcHRpb24vQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlZWZlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb247CisKKy8qKgorICogQW4ge0BsaW5rIEV4Y2VwdGlvbn0gdGhyb3duIGJ5IHtAbGluayBDbWRMaW5lQWN0aW9uU3RvcmV9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDMwMzM3ODg4NzA5ODE4NjExM0w7CisKKyAgIHB1YmxpYyBDbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgc3VwZXIobXNnKTsKKyAgIH0KKworICAgcHVibGljIENtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobXNnLCB0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYyMTIwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9leGNlcHRpb24vQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIEV4Y2VwdGlvbn0gdGhyb3duIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBjb21tYW5kIGxpbmUKKyAqIGNvbnN0cnVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIENtZExpbmVDb25zdHJ1Y3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjM2NDczOTYwMDY5NDcyNjFMOworCisgICBwdWJsaWMgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICBzdXBlcihtc2cpOworICAgfQorCisgICBwdWJsaWMgQ21kTGluZUNvbnN0cnVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobXNnLCB0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVPcHRpb25TdG9yZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9leGNlcHRpb24vQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4MWNjNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVPcHRpb25TdG9yZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb247CisKKy8qKgorICogQW4ge0BsaW5rIEV4Y2VwdGlvbn0gdGhyb3duIGJ5IHtAbGluayBDbWRMaW5lT3B0aW9uU3RvcmV9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUyMjM3MTQzODAzMjQ0NzkwNThMOworCisgICBwdWJsaWMgQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgIHN1cGVyKG1zZyk7CisgICB9CisKKyAgIHB1YmxpYyBDbWRMaW5lT3B0aW9uU3RvcmVFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHQpIHsKKyAgICAgIHN1cGVyKG1zZywgdCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2V4Y2VwdGlvbi9DbWRMaW5lUGFyc2VyRXhjZXB0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2V4Y2VwdGlvbi9DbWRMaW5lUGFyc2VyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyNDFhNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVQYXJzZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uOworCisvKioKKyAqIEEge0BsaW5rIEV4Y2VwdGlvbn0gdGhyb3cgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIGNvbW1hbmQgbGluZSBhcmdzLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ21kTGluZVBhcnNlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkyNjYzNzMyMTgzNzMwMzA0Mkw7CisKKyAgIHB1YmxpYyBDbWRMaW5lUGFyc2VyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgIHN1cGVyKG1zZyk7CisgICB9CisKKyAgIHB1YmxpYyBDbWRMaW5lUGFyc2VyRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0KSB7CisgICAgICBzdXBlcihtc2csIHQpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9leGNlcHRpb24vQ21kTGluZVV0aWxpdHlFeGNlcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVVdGlsaXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwOWZmNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL0NtZExpbmVVdGlsaXR5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiB7QGxpbmsgRXhjZXB0aW9ufSB0aHJvd24gYnkge0BsaW5rIENtZExpbmVVdGlsaXR5fS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIENtZExpbmVVdGlsaXR5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjk3NzE0NzM4MTc2NDk4NTU5OEw7CisKKyAgIHB1YmxpYyBDbWRMaW5lVXRpbGl0eUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICBzdXBlcihtc2cpOworICAgfQorCisgICBwdWJsaWMgQ21kTGluZVV0aWxpdHlFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHQpIHsKKyAgICAgIHN1cGVyKG1zZywgdCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2V4Y2VwdGlvbi9PcHRpb25IZWxwRXhjZXB0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2V4Y2VwdGlvbi9PcHRpb25IZWxwRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjOTlmMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvZXhjZXB0aW9uL09wdGlvbkhlbHBFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHRvIGV4cHJlc3MgdGhhdCB7QGxpbmsgSGVscENtZExpbmVPcHRpb259IHNob3VsZCBiZSBnaXZlbgorICogdG8gc2VlIGhlbHAgbWVzc2FnZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25IZWxwRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODE5ODEwNjY0MTE1NTczMzIyMkw7CisKKyAgIHB1YmxpYyBPcHRpb25IZWxwRXhjZXB0aW9uKCkgeworICAgICAgc3VwZXIoKTsKKyAgIH0KKworICAgcHVibGljIE9wdGlvbkhlbHBFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9BY3Rpb25DbWRMaW5lT3B0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9BY3Rpb25DbWRMaW5lT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzYWQ3OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL0FjdGlvbkNtZExpbmVPcHRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uOworCisvKioKKyAqIHtAbGluayBDbWRMaW5lT3B0aW9ufSBmb3Igc3BlY2lmeWluZyB7QGxpbmsgQ21kTGluZUFjdGlvbn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQ21kTGluZU9wdGlvbiBleHRlbmRzIFNpbXBsZUNtZExpbmVPcHRpb24geworCisgICBwdWJsaWMgQWN0aW9uQ21kTGluZU9wdGlvbigpIHsKKyAgICAgIHRoaXMoImEiLCAiYWN0aW9uIiwgIlRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byB0cmlnZ2VyIiwgdHJ1ZSk7CisgICB9CisKKyAgIHB1YmxpYyBBY3Rpb25DbWRMaW5lT3B0aW9uKFN0cmluZyBzaG9ydE9wdGlvbiwgU3RyaW5nIGxvbmdPcHRpb24sCisgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaGFzQXJncykgeworICAgICAgc3VwZXIoc2hvcnRPcHRpb24sIGxvbmdPcHRpb24sIGRlc2NyaXB0aW9uLCBoYXNBcmdzKTsKKyAgICAgIHRoaXMuc2V0QXJnc0Rlc2NyaXB0aW9uKCJhY3Rpb24tbmFtZSIpOworICAgICAgdGhpcy5zZXRUeXBlKFN0cmluZy5jbGFzcyk7CisgICAgICB0aGlzLnNldFJlcXVpcmVkKHRydWUpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vQWR2YW5jZWRDbWRMaW5lT3B0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9BZHZhbmNlZENtZExpbmVPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjFiMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vQWR2YW5jZWRDbWRMaW5lT3B0aW9uLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQ21kTGluZU9wdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yOworCisvKioKKyAqIEFkdmFuY2VkIHZlcnNpb24gb2YgYSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hpY2ggc3VwcG9ydHMgdmFsaWRhdGlvbiBhbmQKKyAqIG9wdGlvbiBoYW5kbGluZy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBBZHZhbmNlZENtZExpbmVPcHRpb24gZXh0ZW5kcyBTaW1wbGVDbWRMaW5lT3B0aW9uIGltcGxlbWVudHMKKyAgICAgIFZhbGlkYXRhYmxlQ21kTGluZU9wdGlvbiwgSGFuZGxlYWJsZUNtZExpbmVPcHRpb24geworCisgICBwcml2YXRlIENtZExpbmVPcHRpb25IYW5kbGVyIGhhbmRsZXI7CisgICBwcml2YXRlIExpc3Q8Q21kTGluZU9wdGlvblZhbGlkYXRvcj4gdmFsaWRhdG9yczsKKyAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtQW5kUXVpdDsKKworICAgcHVibGljIEFkdmFuY2VkQ21kTGluZU9wdGlvbigpIHsKKyAgICAgIHN1cGVyKCk7CisgICAgICB2YWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdDxDbWRMaW5lT3B0aW9uVmFsaWRhdG9yPigpOworICAgfQorCisgICBwdWJsaWMgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKFN0cmluZyBzaG9ydE9wdGlvbiwgU3RyaW5nIGxvbmdPcHRpb24sCisgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaGFzQXJncykgeworICAgICAgc3VwZXIoc2hvcnRPcHRpb24sIGxvbmdPcHRpb24sIGRlc2NyaXB0aW9uLCBoYXNBcmdzKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihDbWRMaW5lT3B0aW9uSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgfQorCisgICBwdWJsaWMgQ21kTGluZU9wdGlvbkhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKKyAgICAgIHJldHVybiBoYW5kbGVyOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBoYXNIYW5kbGVyKCkgeworICAgICAgcmV0dXJuIGhhbmRsZXIgIT0gbnVsbDsKKyAgIH0KKyAgIAorICAgcHVibGljIExpc3Q8Q21kTGluZU9wdGlvblZhbGlkYXRvcj4gZ2V0VmFsaWRhdG9ycygpIHsKKyAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnM7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvcihDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIHZhbGlkYXRvcikgeworICAgICAgVmFsaWRhdGUubm90TnVsbCh2YWxpZGF0b3IpOworCisgICAgICB2YWxpZGF0b3JzLmFkZCh2YWxpZGF0b3IpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JzKExpc3Q8Q21kTGluZU9wdGlvblZhbGlkYXRvcj4gdmFsaWRhdG9ycykgeworICAgICAgVmFsaWRhdGUubm90TnVsbCh2YWxpZGF0b3JzKTsKKworICAgICAgdGhpcy52YWxpZGF0b3JzID0gdmFsaWRhdG9yczsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gaXNQZXJmb3JtQW5kUXVpdCgpIHsKKyAgICAgIHJldHVybiBwZXJmb3JtQW5kUXVpdDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UGVyZm9ybUFuZFF1aXQoYm9vbGVhbiBwZXJmb3JtQW5kUXVpdCkgeworICAgICAgdGhpcy5wZXJmb3JtQW5kUXVpdCA9IHBlcmZvcm1BbmRRdWl0OworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vQ21kTGluZU9wdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vQ21kTGluZU9wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiNjBmYjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9DbWRMaW5lT3B0aW9uLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb247DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisvL09PRFQgaW1wb3J0cw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5SZXF1aXJlbWVudFJ1bGU7DQorDQorLyoqDQorICogQ29tbWFuZCBMaW5lIG9wdGlvbiBpbnRlcmZhY2Ugc3BlYy4NCisgKiANCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIENtZExpbmVPcHRpb24gew0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldExvbmdPcHRpb24oU3RyaW5nIGxvbmdPcHRpb24pOw0KKw0KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ09wdGlvbigpOw0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFNob3J0T3B0aW9uKFN0cmluZyBzaG9ydE9wdGlvbik7DQorDQorICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE9wdGlvbigpOw0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7DQorDQorICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOw0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3M8Pz4gdHlwZSk7DQorDQorICAgcHVibGljIENsYXNzPD8+IGdldFR5cGUoKTsNCisNCisgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRpbmcoYm9vbGVhbiByZXBlYXRpbmcpOw0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0aW5nKCk7DQorDQorICAgcHVibGljIHZvaWQgc2V0SGFzQXJncyhib29sZWFuIGhhc0FyZ3MpOw0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGhhc0FyZ3MoKTsNCisNCisgICBwdWJsaWMgdm9pZCBzZXRBcmdzRGVzY3JpcHRpb24oU3RyaW5nIGFyZ0Rlc2NyaXB0aW9uKTsNCisNCisgICBwdWJsaWMgU3RyaW5nIGdldEFyZ3NEZXNjcmlwdGlvbigpOw0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFN0YXRpY0FyZ3MoTGlzdDxTdHJpbmc+IHZhbHVlcyk7DQorDQorICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTdGF0aWNBcmdzKCk7DQorDQorICAgcHVibGljIGJvb2xlYW4gaGFzU3RhdGljQXJncygpOw0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpOw0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKTsNCisNCisgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlbWVudFJ1bGVzKExpc3Q8UmVxdWlyZW1lbnRSdWxlPiByZXF1aXJlbWVudFJ1bGVzKTsNCisNCisgICBwdWJsaWMgTGlzdDxSZXF1aXJlbWVudFJ1bGU+IGdldFJlcXVpcmVtZW50UnVsZXMoKTsNCisNCisgICBwdWJsaWMgdm9pZCBzZXRJc1N1Yk9wdGlvbihib29sZWFuIGlzU3ViT3B0aW9uKTsNCisNCisgICBwdWJsaWMgYm9vbGVhbiBpc1N1Yk9wdGlvbigpOw0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsNCisNCisgICBwdWJsaWMgaW50IGhhc2hDb2RlKCk7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL0NtZExpbmVPcHRpb25JbnN0YW5jZS5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vQ21kTGluZU9wdGlvbkluc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWVmZDY5NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL0NtZExpbmVPcHRpb25JbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbjsNCisNCisvL0pESyBpbXBvcnRzDQoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5pc0FjdGlvbk9wdGlvbjsNCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmlzR3JvdXBPcHRpb247DQoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5pc0hlbHBPcHRpb247DQoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5pc1ByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbjsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KKy8vQXBhY2hlIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7DQorDQorLyoqDQorICogQSBzcGVjaWZpZWQge0BsaW5rIENtZExpbmVPcHRpb259IHdpdGggaXRzIHNwZWNpZmllZCBhcmd1bWVudCB2YWx1ZXMuDQorICogDQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpDQorICovDQorcHVibGljIGNsYXNzIENtZExpbmVPcHRpb25JbnN0YW5jZSB7DQorDQorICAgcHJpdmF0ZSBDbWRMaW5lT3B0aW9uIG9wdGlvbjsNCisgICBwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWx1ZXM7DQorICAgcHJpdmF0ZSBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBzdWJPcHRpb25zOw0KKw0KKyAgIHB1YmxpYyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UoKSB7DQorICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorICAgICAgc3ViT3B0aW9ucyA9IG5ldyBIYXNoU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4oKTsNCisgICB9DQorDQorICAgcHVibGljIENtZExpbmVPcHRpb25JbnN0YW5jZShDbWRMaW5lT3B0aW9uIG9wdGlvbiwgTGlzdDxTdHJpbmc+IHZhbHVlcykgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uKTsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHZhbHVlcyk7DQorDQorICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247DQorICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7DQorICAgICAgc3ViT3B0aW9ucyA9IG5ldyBIYXNoU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4oKTsNCisgICB9DQorDQorICAgcHVibGljIHZvaWQgc2V0T3B0aW9uKENtZExpbmVPcHRpb24gb3B0aW9uKSB7DQorICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBDbWRMaW5lT3B0aW9uIGdldE9wdGlvbigpIHsNCisgICAgICByZXR1cm4gb3B0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwKCkgew0KKyAgICAgIHJldHVybiBpc0dyb3VwT3B0aW9uKG9wdGlvbik7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uKCkgew0KKyAgICAgIHJldHVybiBpc0FjdGlvbk9wdGlvbihvcHRpb24pOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBpc0hlbHAoKSB7DQorICAgICAgcmV0dXJuIGlzSGVscE9wdGlvbihvcHRpb24pOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW50U3VwcG9ydGVkQWN0aW9ucygpIHsNCisgICAgICByZXR1cm4gaXNQcmludFN1cHBvcnRlZEFjdGlvbnNPcHRpb24ob3B0aW9uKTsNCisgICB9DQorDQorICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0YWJsZSgpIHsNCisgICAgICByZXR1cm4gb3B0aW9uIGluc3RhbmNlb2YgVmFsaWRhdGFibGVDbWRMaW5lT3B0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBpc0hhbmRsZWFibGUoKSB7DQorICAgICAgcmV0dXJuIG9wdGlvbiBpbnN0YW5jZW9mIEhhbmRsZWFibGVDbWRMaW5lT3B0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwodmFsdWVzKTsNCisNCisgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih2YWx1ZXMpOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgdmFsdWUpIHsNCisgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsNCisgICB9DQorDQorICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7DQorICAgICAgaWYgKHZhbHVlcy5pc0VtcHR5KCkgJiYgb3B0aW9uLmhhc1N0YXRpY0FyZ3MoKSkgew0KKyAgICAgICAgIHJldHVybiBvcHRpb24uZ2V0U3RhdGljQXJncygpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICAgcmV0dXJuIHZhbHVlczsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFN1Yk9wdGlvbnMoTGlzdDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IHN1Yk9wdGlvbnMpIHsNCisgICAgICBWYWxpZGF0ZS5pc1RydWUoaXNHcm91cCgpLCAiTXVzdCBiZSBncm91cCBvcHRpb24gdG8gaGF2ZSBzdWJPcHRpb25zIik7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChzdWJPcHRpb25zLCAiQ2Fubm90IHNldCBzdWJPcHRpb25zIHRvIE5VTEwiKTsNCisNCisgICAgICB0aGlzLnN1Yk9wdGlvbnMgPSBuZXcgSGFzaFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+KHN1Yk9wdGlvbnMpOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBhZGRTdWJPcHRpb24oQ21kTGluZU9wdGlvbkluc3RhbmNlIHN1Yk9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLmlzVHJ1ZShpc0dyb3VwKCksICJNdXN0IGJlIGdyb3VwIG9wdGlvbiB0byBoYXZlIHN1Yk9wdGlvbnMiKTsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHN1Yk9wdGlvbiwgIkNhbm5vdCBhZGQgTlVMTCBzdWJPcHRpb24iKTsNCisNCisgICAgICB0aGlzLnN1Yk9wdGlvbnMuYWRkKHN1Yk9wdGlvbik7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBnZXRTdWJPcHRpb25zKCkgew0KKyAgICAgIHJldHVybiBzdWJPcHRpb25zOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDbWRMaW5lT3B0aW9uSW5zdGFuY2UpIHsNCisgICAgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgY29tcGFyZU9iaiA9IChDbWRMaW5lT3B0aW9uSW5zdGFuY2UpIG9iajsNCisgICAgICAgICByZXR1cm4gY29tcGFyZU9iai5vcHRpb24uZXF1YWxzKHRoaXMub3B0aW9uKQ0KKyAgICAgICAgICAgICAgICYmIGNvbXBhcmVPYmoudmFsdWVzLmVxdWFscyh0aGlzLnZhbHVlcyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgIHJldHVybiAiW29wdGlvbj0gIiArIG9wdGlvbiArICIsdmFsdWVzPSIgKyB2YWx1ZXMgKyAiLHN1Yk9wdGlvbnM9Ig0KKyAgICAgICAgICAgICsgc3ViT3B0aW9ucyArICJdIjsNCisgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL0dyb3VwQ21kTGluZU9wdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vR3JvdXBDbWRMaW5lT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljMWU0ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL0dyb3VwQ21kTGluZU9wdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hpY2ggaXMgYSBncm91cCBvcHRpb24gKGkuZS4gc3VwcG9ydHMgc3ViLQorICoge0BsaW5rIENtZExpbmVPcHRpb259cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHcm91cENtZExpbmVPcHRpb24gZXh0ZW5kcyBTaW1wbGVDbWRMaW5lT3B0aW9uIHsKKworICAgcHJpdmF0ZSBMaXN0PEdyb3VwU3ViT3B0aW9uPiBzdWJPcHRpb25zOworICAgcHJpdmF0ZSBib29sZWFuIGFsbG93QW55U3ViT3B0aW9uOworCisgICBwdWJsaWMgR3JvdXBDbWRMaW5lT3B0aW9uKCkgeworICAgICAgc3VwZXIoKTsKKyAgICAgIHRoaXMuc2V0SGFzQXJncyhmYWxzZSk7CisgICAgICB0aGlzLnNldEFsbG93QW55U3ViT3B0aW9ucyhmYWxzZSk7CisgICAgICBzdWJPcHRpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICB9CisKKyAgIHB1YmxpYyBHcm91cENtZExpbmVPcHRpb24oU3RyaW5nIHNob3J0T3B0aW9uLCBTdHJpbmcgbG9uZ09wdGlvbiwKKyAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBoYXNBcmdzKSB7CisgICAgICBzdXBlcihzaG9ydE9wdGlvbiwgbG9uZ09wdGlvbiwgZGVzY3JpcHRpb24sIGhhc0FyZ3MpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0FueVN1Yk9wdGlvbnMoYm9vbGVhbiBhbGxvd0FueVN1Yk9wdGlvbikgeworICAgICAgdGhpcy5hbGxvd0FueVN1Yk9wdGlvbiA9IGFsbG93QW55U3ViT3B0aW9uOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG93QW55U3ViT3B0aW9ucygpIHsKKyAgICAgIHJldHVybiBzdWJPcHRpb25zLmlzRW1wdHkoKSAmJiBhbGxvd0FueVN1Yk9wdGlvbjsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0U3ViT3B0aW9ucyhMaXN0PEdyb3VwU3ViT3B0aW9uPiBzdWJPcHRpb25zKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHN1Yk9wdGlvbnMsICJDYW5ub3Qgc2V0IHN1Yk9wdGlvbnMgdG8gTlVMTCIpOworCisgICAgICB0aGlzLnN1Yk9wdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3Qoc3ViT3B0aW9ucyk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIGFkZFN1Yk9wdGlvbihHcm91cFN1Yk9wdGlvbiBzdWJPcHRpb24pIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoc3ViT3B0aW9uLCAiQ2Fubm90IGFkZCBOVUxMIHN1Yk9wdGlvbiIpOworCisgICAgICBzdWJPcHRpb25zLmFkZChzdWJPcHRpb24pOworICAgfQorCisgICBwdWJsaWMgTGlzdDxHcm91cFN1Yk9wdGlvbj4gZ2V0U3ViT3B0aW9ucygpIHsKKyAgICAgIHJldHVybiBzdWJPcHRpb25zOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJPcHRpb25zKCkgeworICAgICAgcmV0dXJuIHN1Yk9wdGlvbnMgIT0gbnVsbCAmJiAhc3ViT3B0aW9ucy5pc0VtcHR5KCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9Hcm91cFN1Yk9wdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vR3JvdXBTdWJPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDY2ODAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vR3JvdXBTdWJPcHRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uOworCisvKioKKyAqIEEgR3JvdXAgYWxsb3dhYmxlIHN1Yi17QGxpbmsgQ21kTGluZU9wdGlvbn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHcm91cFN1Yk9wdGlvbiB7CisKKyAgIHByaXZhdGUgQ21kTGluZU9wdGlvbiBvcHRpb247CisgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQ7CisKKyAgIHB1YmxpYyBHcm91cFN1Yk9wdGlvbigpIHsKKyAgICAgIHJlcXVpcmVkID0gZmFsc2U7CisgICB9CisKKyAgIHB1YmxpYyBHcm91cFN1Yk9wdGlvbihDbWRMaW5lT3B0aW9uIG9wdGlvbiwgYm9vbGVhbiByZXF1aXJlZCkgeworICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247CisgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbihDbWRMaW5lT3B0aW9uIG9wdGlvbikgeworICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247CisgICB9CisKKyAgIHB1YmxpYyBDbWRMaW5lT3B0aW9uIGdldE9wdGlvbigpIHsKKyAgICAgIHJldHVybiBvcHRpb247CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgIHRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKKyAgICAgIHJldHVybiByZXF1aXJlZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL0hhbmRsZWFibGVDbWRMaW5lT3B0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9IYW5kbGVhYmxlQ21kTGluZU9wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2QxNDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9IYW5kbGVhYmxlQ21kTGluZU9wdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQ21kTGluZU9wdGlvbkhhbmRsZXI7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hpY2ggaGFzIGEge0BsaW5rIENtZExpbmVPcHRpb25IYW5kbGVyfSBzaG91bGQKKyAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSGFuZGxlYWJsZUNtZExpbmVPcHRpb24geworCisgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKENtZExpbmVPcHRpb25IYW5kbGVyIGhhbmRsZXIpOworCisgICBwdWJsaWMgQ21kTGluZU9wdGlvbkhhbmRsZXIgZ2V0SGFuZGxlcigpOworCisgICBwdWJsaWMgYm9vbGVhbiBoYXNIYW5kbGVyKCk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9IZWxwQ21kTGluZU9wdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vSGVscENtZExpbmVPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg3NGUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vSGVscENtZExpbmVPcHRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uOworCisvKioKKyAqIFRoZSBIZWxwIHtAbGluayBDbWRMaW5lT3B0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxwQ21kTGluZU9wdGlvbiBleHRlbmRzIFNpbXBsZUNtZExpbmVPcHRpb24geworCisgICBwdWJsaWMgSGVscENtZExpbmVPcHRpb24oKSB7CisgICAgICB0aGlzKCJoIiwgImhlbHAiLCAiUHJpbnRzIGhlbHAgbWVudSIsIGZhbHNlKTsKKyAgIH0KKworICAgcHVibGljIEhlbHBDbWRMaW5lT3B0aW9uKFN0cmluZyBzaG9ydE9wdGlvbiwgU3RyaW5nIGxvbmdPcHRpb24sCisgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaGFzQXJncykgeworICAgICAgc3VwZXIoc2hvcnRPcHRpb24sIGxvbmdPcHRpb24sIGRlc2NyaXB0aW9uLCBoYXNBcmdzKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL1ByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL1ByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjcxODc5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb247CisKKy8qKgorICogVGhlIFByaW50IFN1cHBvcnRlZCBBY3Rpb25zIHtAbGluayBDbWRMaW5lT3B0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uIGV4dGVuZHMgU2ltcGxlQ21kTGluZU9wdGlvbiB7CisKKyAgIHB1YmxpYyBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uKCkgeworICAgICAgc3VwZXIoInBzYSIsICJwcmludFN1cHBvcnRlZEFjdGlvbnMiLCAiUHJpbnQgU3VwcG9ydGVkIEFjdGlvbnMiLCBmYWxzZSk7CisgICB9CisKKyAgIHB1YmxpYyBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uKFN0cmluZyBzaG9ydE9wdGlvbiwKKyAgICAgICAgIFN0cmluZyBsb25nT3B0aW9uLCBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaGFzQXJncykgeworICAgICAgc3VwZXIoc2hvcnRPcHRpb24sIGxvbmdPcHRpb24sIGRlc2NyaXB0aW9uLCBoYXNBcmdzKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL1NpbXBsZUNtZExpbmVPcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL1NpbXBsZUNtZExpbmVPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yM2JmOGIwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vU2ltcGxlQ21kTGluZU9wdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbjsNCisNCisvL0pESyBpbXBvcnRzDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KKy8vT09EVCBpbXBvcnRzDQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLlJlcXVpcmVtZW50UnVsZTsNCisNCisvKioNCisgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hpY2ggaW1wbGVtZW50cyB0aGUgYmFzaWMgbWV0aG9kcyBmb3IgYW55DQorICoge0BsaW5rIENtZExpbmVPcHRpb259LiBDYW4gYmUgdXNlZCBhcy1pcyBvciBleHRlbmRzIHRvIGFkZCBhZGRpdGlvbmFsIG9wdGlvbg0KKyAqIGZlYXR1cmVzLg0KKyAqIA0KKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW1wbGVDbWRMaW5lT3B0aW9uIGltcGxlbWVudHMgQ21kTGluZU9wdGlvbiB7DQorDQorICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnRPcHRpb247DQorDQorICAgcHJpdmF0ZSBTdHJpbmcgbG9uZ09wdGlvbjsNCisNCisgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCisNCisgICBwcml2YXRlIGJvb2xlYW4gcmVwZWF0aW5nOw0KKw0KKyAgIHByaXZhdGUgU3RyaW5nIGFyZ3NEZXNjcmlwdGlvbjsNCisNCisgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQ7DQorDQorICAgcHJpdmF0ZSBMaXN0PFJlcXVpcmVtZW50UnVsZT4gcmVxdWlyZW1lbnRSdWxlczsNCisNCisgICBwcml2YXRlIGJvb2xlYW4gaGFzQXJnczsNCisNCisgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzdGF0aWNBcmdzOw0KKw0KKyAgIHByaXZhdGUgYm9vbGVhbiBpc1N1Yk9wdGlvbjsNCisNCisgICBwcml2YXRlIENsYXNzPD8+IHR5cGU7DQorDQorICAgcHVibGljIFNpbXBsZUNtZExpbmVPcHRpb24oKSB7DQorICAgICAgYXJnc0Rlc2NyaXB0aW9uID0gImFyZyI7DQorICAgICAgcmVwZWF0aW5nID0gZmFsc2U7DQorICAgICAgcmVxdWlyZWQgPSBmYWxzZTsNCisgICAgICBoYXNBcmdzID0gZmFsc2U7DQorICAgICAgaXNTdWJPcHRpb24gPSBmYWxzZTsNCisgICAgICB0eXBlID0gU3RyaW5nLmNsYXNzOw0KKyAgICAgIHJlcXVpcmVtZW50UnVsZXMgPSBuZXcgQXJyYXlMaXN0PFJlcXVpcmVtZW50UnVsZT4oKTsNCisgICB9DQorDQorICAgcHVibGljIFNpbXBsZUNtZExpbmVPcHRpb24oU3RyaW5nIHNob3J0T3B0aW9uLCBTdHJpbmcgbG9uZ09wdGlvbiwNCisgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaGFzQXJncykgew0KKyAgICAgIHRoaXMoKTsNCisgICAgICB0aGlzLnNob3J0T3B0aW9uID0gc2hvcnRPcHRpb247DQorICAgICAgdGhpcy5sb25nT3B0aW9uID0gbG9uZ09wdGlvbjsNCisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQorICAgICAgdGhpcy5oYXNBcmdzID0gaGFzQXJnczsNCisgICB9DQorDQorICAgcHVibGljIENsYXNzPD8+IGdldFR5cGUoKSB7DQorICAgICAgcmV0dXJuIHR5cGU7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3M8Pz4gdHlwZSkgew0KKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRPcHRpb24oKSB7DQorICAgICAgcmV0dXJuIHNob3J0T3B0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBzZXRTaG9ydE9wdGlvbihTdHJpbmcgc2hvcnRPcHRpb24pIHsNCisgICAgICB0aGlzLnNob3J0T3B0aW9uID0gc2hvcnRPcHRpb247DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ09wdGlvbigpIHsNCisgICAgICByZXR1cm4gbG9uZ09wdGlvbjsNCisgICB9DQorDQorICAgcHVibGljIHZvaWQgc2V0TG9uZ09wdGlvbihTdHJpbmcgbG9uZ09wdGlvbikgew0KKyAgICAgIHRoaXMubG9uZ09wdGlvbiA9IGxvbmdPcHRpb247DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQorICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsNCisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0aW5nKCkgew0KKyAgICAgIHJldHVybiByZXBlYXRpbmc7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGluZyhib29sZWFuIHJlcGVhdGluZykgew0KKyAgICAgIHRoaXMucmVwZWF0aW5nID0gcmVwZWF0aW5nOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBoYXNBcmdzKCkgew0KKyAgICAgIHJldHVybiBoYXNBcmdzOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBzZXRIYXNBcmdzKGJvb2xlYW4gaGFzQXJncykgew0KKyAgICAgIHRoaXMuaGFzQXJncyA9IGhhc0FyZ3M7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldEFyZ3NEZXNjcmlwdGlvbihTdHJpbmcgYXJnRGVzY3JpcHRpb24pIHsNCisgICAgICB0aGlzLmFyZ3NEZXNjcmlwdGlvbiA9IGFyZ0Rlc2NyaXB0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgU3RyaW5nIGdldEFyZ3NEZXNjcmlwdGlvbigpIHsNCisgICAgICByZXR1cm4gYXJnc0Rlc2NyaXB0aW9uOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBzZXRTdGF0aWNBcmdzKExpc3Q8U3RyaW5nPiBzdGF0aWNBcmdzKSB7DQorICAgICAgdGhpcy5zdGF0aWNBcmdzID0gc3RhdGljQXJnczsNCisgICB9DQorDQorICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTdGF0aWNBcmdzKCkgew0KKyAgICAgIHJldHVybiBzdGF0aWNBcmdzOw0KKyAgIH0NCisNCisgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGF0aWNBcmdzKCkgew0KKyAgICAgIHJldHVybiBzdGF0aWNBcmdzICE9IG51bGw7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsNCisgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7DQorICAgICAgcmV0dXJuIHJlcXVpcmVkOw0KKyAgIH0NCisNCisgICBwdWJsaWMgTGlzdDxSZXF1aXJlbWVudFJ1bGU+IGdldFJlcXVpcmVtZW50UnVsZXMoKSB7DQorICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZW1lbnRSdWxlczsNCisgICB9DQorDQorICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRSdWxlcyhMaXN0PFJlcXVpcmVtZW50UnVsZT4gcmVxdWlyZW1lbnRSdWxlcykgew0KKyAgICAgIHRoaXMucmVxdWlyZW1lbnRSdWxlcyA9IHJlcXVpcmVtZW50UnVsZXM7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHNldElzU3ViT3B0aW9uKGJvb2xlYW4gaXNTdWJPcHRpb24pIHsNCisgICAgICB0aGlzLmlzU3ViT3B0aW9uID0gaXNTdWJPcHRpb247DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBib29sZWFuIGlzU3ViT3B0aW9uKCkgew0KKyAgICAgIHJldHVybiBpc1N1Yk9wdGlvbjsNCisgICB9DQorDQorICAgQE92ZXJyaWRlDQorICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCisgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ21kTGluZU9wdGlvbikgew0KKyAgICAgICAgIFNpbXBsZUNtZExpbmVPcHRpb24gY29tcGFyZU9iaiA9IChTaW1wbGVDbWRMaW5lT3B0aW9uKSBvYmo7DQorICAgICAgICAgcmV0dXJuIGNvbXBhcmVPYmouc2hvcnRPcHRpb24uZXF1YWxzKHRoaXMuc2hvcnRPcHRpb24pDQorICAgICAgICAgICAgICAgfHwgY29tcGFyZU9iai5sb25nT3B0aW9uLmVxdWFscyh0aGlzLmxvbmdPcHRpb24pOw0KKyAgICAgIH0gZWxzZQ0KKyAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICB9DQorDQorICAgQE92ZXJyaWRlDQorICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICByZXR1cm4gbG9uZ09wdGlvbi5oYXNoQ29kZSgpOw0KKyAgIH0NCisNCisgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgIHJldHVybiAiW2xvbmdPcHRpb249JyIgKyBsb25nT3B0aW9uICsgIicsc2hvcnRPcHRpb249JyINCisgICAgICAgICAgICArIHNob3J0T3B0aW9uICsgIicsZGVzY3JpcHRpb249JyIgKyBkZXNjcmlwdGlvbiArICInXSI7DQorICAgfQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9WYWxpZGF0YWJsZUNtZExpbmVPcHRpb24uamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL1ZhbGlkYXRhYmxlQ21kTGluZU9wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGM1MzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9WYWxpZGF0YWJsZUNtZExpbmVPcHRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVPcHRpb259IHdoaWNoIGhhcyB7QGxpbmsgQ21kTGluZU9wdGlvblZhbGlkYXRvcn1zIHNob3VsZAorICogaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGludGVyZmFjZSBWYWxpZGF0YWJsZUNtZExpbmVPcHRpb24geworCisgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JzKExpc3Q8Q21kTGluZU9wdGlvblZhbGlkYXRvcj4gdmFsaWRhdG9ycyk7CisKKyAgIHB1YmxpYyBMaXN0PENtZExpbmVPcHRpb25WYWxpZGF0b3I+IGdldFZhbGlkYXRvcnMoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9BcHBseVRvQWN0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL0FwcGx5VG9BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBlMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9BcHBseVRvQWN0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyOworCisvKioKKyAqIE1hcHBpbmcgb2Yge0BsaW5rIENtZExpbmVBY3Rpb259IG5hbWUgdG8gaXRzIG1ldGhvZCB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGJ5CisgKiB7QGxpbmsgQXBwbHlUb0FjdGlvbkhhbmRsZXJ9IHdoZW4gaW5qZWN0aW5nIGFyZ3VtZW50IHZhbHVlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEFwcGx5VG9BY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBhY3Rpb25OYW1lOworICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgcHJpdmF0ZSBTdHJpbmcgYXJnRGVzY3JpcHRpb247CisKKyAgIHB1YmxpYyBBcHBseVRvQWN0aW9uKCkgeworICAgfQorCisgICBwdWJsaWMgQXBwbHlUb0FjdGlvbihTdHJpbmcgYWN0aW9uTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgIHRoaXMuYWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7CisgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbk5hbWUoKSB7CisgICAgICByZXR1cm4gYWN0aW9uTmFtZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0QWN0aW9uTmFtZShTdHJpbmcgYWN0aW9uTmFtZSkgeworICAgICAgdGhpcy5hY3Rpb25OYW1lID0gYWN0aW9uTmFtZTsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldEFyZ0Rlc2NyaXB0aW9uKCkgeworICAgICAgcmV0dXJuIGFyZ0Rlc2NyaXB0aW9uOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRBcmdEZXNjcmlwdGlvbihTdHJpbmcgYXJnRGVzY3JpcHRpb24pIHsKKyAgICAgIHRoaXMuYXJnRGVzY3JpcHRpb24gPSBhcmdEZXNjcmlwdGlvbjsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBhY3Rpb25OYW1lICsgIiA6ICIgKyBtZXRob2ROYW1lOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9BcHBseVRvQWN0aW9uSGFuZGxlci5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9BcHBseVRvQWN0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjZiNmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL0FwcGx5VG9BY3Rpb25IYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlcjsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmNvbnZlcnRUb1R5cGU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICoge0BsaW5rIENtZExpbmVPcHRpb25IYW5kbGVyfSB3aGljaCBhcHBsaWVzIHtAbGluayBDbWRMaW5lT3B0aW9ufSB2YWx1ZXMgdG8KKyAqIGdpdmVuIHtAbGluayBDbWRMaW5lQWN0aW9ufS4gIElmIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyBhIHJlcGVhdGluZyBvcHRpb24KKyAqIHRoZW4gImFkZDxsb25nLW5hbWU+IiBpcyBpbnZva2VkIG9uIHtAbGluayBDbWRMaW5lQWN0aW9ufSwgb3RoZXJ3aXNlCisgKiAic2V0PGxvbmctbmFtZSIgaXMgaW52b2tlZCwgdW5sZXNzIHRoZSBtZXRob2QgbmFtZSB3YXMgc3VwcGxpZWQsIHRoZW4gdGhhdAorICogbWV0aG9kIHdpbGwgYmUgaW52b2tlZC4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBseVRvQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIENtZExpbmVPcHRpb25IYW5kbGVyIHsKKworICAgcHJpdmF0ZSBMaXN0PEFwcGx5VG9BY3Rpb24+IGFwcGx5VG9BY3Rpb25zOworCisgICBwdWJsaWMgdm9pZCBzZXRBcHBseVRvQWN0aW9ucyhMaXN0PEFwcGx5VG9BY3Rpb24+IGFwcGx5VG9BY3Rpb25zKSB7CisgICAgICB0aGlzLmFwcGx5VG9BY3Rpb25zID0gYXBwbHlUb0FjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PEFwcGx5VG9BY3Rpb24+IGdldEFwcGx5VG9BY3Rpb25zKCkgeworICAgICAgcmV0dXJuIGFwcGx5VG9BY3Rpb25zOworICAgfQorCisgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICAvLyBEbyBub3RoaW5nLgorICAgfQorCisgICBwdWJsaWMgdm9pZCBoYW5kbGVPcHRpb24oQ21kTGluZUFjdGlvbiBhY3Rpb24sCisgICAgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uSW5zdGFuY2UpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBDbGFzczw/PiB0eXBlID0gb3B0aW9uSW5zdGFuY2UuZ2V0T3B0aW9uKCkuZ2V0VHlwZSgpOworICAgICAgICAgTGlzdDw/PiB2YWxzID0gKG9wdGlvbkluc3RhbmNlLmdldFZhbHVlcygpLmlzRW1wdHkoKSkgPyBjb252ZXJ0VG9UeXBlKAorICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAidHJ1ZSIgfSksIHR5cGUgPSBCb29sZWFuLlRZUEUpCisgICAgICAgICAgICAgICA6IGNvbnZlcnRUb1R5cGUob3B0aW9uSW5zdGFuY2UuZ2V0VmFsdWVzKCksIHR5cGUpOworICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRNZXRob2ROYW1lKGFjdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYWN0aW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHR5cGUpCisgICAgICAgICAgICAgICAgICAuaW52b2tlKGFjdGlvbiwgdmFscy50b0FycmF5KG5ldyBPYmplY3RbdmFscy5zaXplKCldKSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWN0aW9uLmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uSW5zdGFuY2UuZ2V0T3B0aW9uKCkuaXNSZXBlYXRpbmcoKSA/ICJhZGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJzZXQiKSArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUob3B0aW9uSW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcHRpb24oKS5nZXRMb25nT3B0aW9uKCkpLCB0eXBlKQorICAgICAgICAgICAgICAgICAgLmludm9rZShhY3Rpb24sIHZhbHMudG9BcnJheShuZXcgT2JqZWN0W3ZhbHMuc2l6ZSgpXSkpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0aG9kTmFtZShTdHJpbmcgYWN0aW9uTmFtZSkgeworICAgICAgaWYgKGFwcGx5VG9BY3Rpb25zICE9IG51bGwpIHsKKyAgICAgICAgIGZvciAoQXBwbHlUb0FjdGlvbiBhcHBseVRvQWN0aW9uIDogYXBwbHlUb0FjdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChhcHBseVRvQWN0aW9uLmdldEFjdGlvbk5hbWUoKS5lcXVhbHMoYWN0aW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBhcHBseVRvQWN0aW9uLmdldE1ldGhvZE5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oU3RyaW5nIGFjdGlvbk5hbWUpIHsKKyAgICAgIGlmIChhcHBseVRvQWN0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICBmb3IgKEFwcGx5VG9BY3Rpb24gYXBwbHlUb0FjdGlvbiA6IGFwcGx5VG9BY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoYXBwbHlUb0FjdGlvbi5nZXRBY3Rpb25OYW1lKCkuZXF1YWxzKGFjdGlvbk5hbWUpKSB7CisgICAgICAgICAgICAgICByZXR1cm4gYXBwbHlUb0FjdGlvbi5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBcmdEZXNjcmlwdGlvbihTdHJpbmcgYWN0aW9uTmFtZSkgeworICAgICAgaWYgKGFwcGx5VG9BY3Rpb25zICE9IG51bGwpIHsKKyAgICAgICAgIGZvciAoQXBwbHlUb0FjdGlvbiBhcHBseVRvQWN0aW9uIDogYXBwbHlUb0FjdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChhcHBseVRvQWN0aW9uLmdldEFjdGlvbk5hbWUoKS5lcXVhbHMoYWN0aW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBhcHBseVRvQWN0aW9uLmdldEFyZ0Rlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXRIZWxwKENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICByZXR1cm4gIldpbGwgaW52b2tlICciICsgKG9wdGlvbi5pc1JlcGVhdGluZygpID8gImFkZCIgOiAic2V0IikKKyAgICAgICAgICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShvcHRpb24uZ2V0TG9uZ09wdGlvbigpKQorICAgICAgICAgKyAiJyBvbiBhY3Rpb24gc2VsZWN0ZWQsIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBhY3Rpb25zOiAiCisgICAgICAgICArIChhcHBseVRvQWN0aW9ucyAhPSBudWxsID8gYXBwbHlUb0FjdGlvbnMgOiBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oQ21kTGluZUFjdGlvbiBhY3Rpb24sIENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb24oYWN0aW9uLmdldE5hbWUoKSk7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnRGVzY3JpcHRpb24oQ21kTGluZUFjdGlvbiBhY3Rpb24sIENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICByZXR1cm4gZ2V0QXJnRGVzY3JpcHRpb24oYWN0aW9uLmdldE5hbWUoKSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL0NtZExpbmVPcHRpb25IYW5kbGVyLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL0NtZExpbmVPcHRpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThmNGFjYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL2hhbmRsZXIvQ21kTGluZU9wdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsKKworLyoqCisgKiBIYW5kbGVzIGEge0BsaW5rIENtZExpbmVPcHRpb259J3MgdmFsdWVzIGluIHJlbGF0aW9uIHRvIGdpdmVuCisgKiB7QGxpbmsgQ21kTGluZUFjdGlvbn1zLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGludGVyZmFjZSBDbWRMaW5lT3B0aW9uSGFuZGxlciB7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGFmdGVyIGhhbmRsZXIgY29uc3RydWN0aW9uIHRvIGFsbG93IGhhbmRsZXIgdG8gc2V0dXAKKyAgICAqIHN0YXRlIGJlZm9yZSBpdCBpcyByZXF1aXJlZCB0byBoYW5kbGUgdGhlIG9wdGlvbiBsYXRlci4gVGhpcworICAgICogaXMgYWxzbyBjYWxsZWQgd2hlbiBoZWxwIGlzIHJ1biBzbyBhbGxvd3MgcmVnaXN0cmF0aW9uIHRvIHRha2UKKyAgICAqIHBsYWNlIGlmIG5lY2Vzc2FyeSBmb3IgaGVscCBhbmFseXNpcy4KKyAgICAqLworICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZShDbWRMaW5lT3B0aW9uIG9wdGlvbik7CisKKyAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGhhbmRsZU9wdGlvbihDbWRMaW5lQWN0aW9uIHNlbGVjdGVkQWN0aW9uLAorICAgICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3RhbmNlKTsKKworICAgLyoqCisgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkhhbmRsZXJ9cyBoZWxwIG1lc3NhZ2Ugd2hlbiBhc3NvY2lhdGVkIHdpdGgKKyAgICAqIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufS4KKyAgICAqIAorICAgICogQHBhcmFtIG9wdGlvbgorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gd2hpY2ggdGhpcworICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9uSGFuZGxlcn0gd2FzIGFzc29jaWF0ZWQgd2l0aAorICAgICogQHJldHVybiBUaGUgaGVscCBtZXNzYWdlIGZvciB0aGlzIHtAbGluayBDbWRMaW5lT3B0aW9uSGFuZGxlcn0KKyAgICAqLworICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRIZWxwKENtZExpbmVPcHRpb24gb3B0aW9uKTsKKworICAgLyoqCisgICAgKiBJZiB0aGlzIGhhbmRsZXIgY2F1c2VzIHRoZSBhcmd1bWVudCBkZXNjcmlwdG9yIHRvIGJlIGRpZmZlcmVudCBmb3IKKyAgICAqIGNlcnRhaW4ge0BsaW5rIENtZExpbmVBY3Rpb259cywgdGhlbiBzaG91bGQgcmV0dXJuIHRoZSBhcmcKKyAgICAqIGRlc2NyaXB0aW9uIGhlcmUuCisgICAgKi8KKyAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QXJnRGVzY3JpcHRpb24oQ21kTGluZUFjdGlvbiBhY3Rpb24sCisgICAgICAgICBDbWRMaW5lT3B0aW9uIG9wdGlvbik7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL1NldEphdmFQcm9wZXJ0aWVzSGFuZGxlci5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9TZXRKYXZhUHJvcGVydGllc0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODc0NWI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9TZXRKYXZhUHJvcGVydGllc0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5PcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyOworCisvKioKKyAqIHtAbGluayBDbWRMaW5lT3B0aW9uSGFuZGxlcn0gd2hpY2ggc2V0cyBKYXZhIFByb3BlcnRpZXMgZXF1YWxzIHRvIHRoZQorICogdmFsdWVzIHNwZWNpZmllZCBieSB0aGUge0BsaW5rIENtZExpbmVPcHRpb259IHRoaXMgaGFuZGxlciBpcyBhdHRhY2hlZAorICogdG8uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTZXRKYXZhUHJvcGVydGllc0hhbmRsZXIgaW1wbGVtZW50cyBDbWRMaW5lT3B0aW9uSGFuZGxlciB7CisKKyAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHByb3BlcnR5TmFtZXM7CisKKyAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5IDogcHJvcGVydHlOYW1lcykgeworICAgICAgICAgT3B0aW9uUHJvcGVydHlSZWdpc3Rlci5yZWdpc3Rlck9wdGlvbihwcm9wZXJ0eSwgb3B0aW9uKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgaGFuZGxlT3B0aW9uKENtZExpbmVBY3Rpb24gc2VsZWN0ZWRBY3Rpb24sCisgICAgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uSW5zdGFuY2UpIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvcGVydHlOYW1lcyk7CisKKyAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHByb3BlcnR5TmFtZXMpIHsKKyAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICBTdHJpbmdVdGlscy5qb2luKG9wdGlvbkluc3RhbmNlLmdldFZhbHVlcygpLAorICAgICAgICAgICAgICAgICAgICAgb3B0aW9uSW5zdGFuY2UuZ2V0T3B0aW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhMaXN0LmNsYXNzKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCIgOiAgIiAiKSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZXMoTGlzdDxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKyAgICAgIHRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldEhlbHAoQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIHJldHVybiAiU2V0cyB0aGUgZm9sbG93aW5nIEphdmEgUHJvcGVydGllczogIiArIHRoaXMucHJvcGVydHlOYW1lczsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXRBcmdEZXNjcmlwdGlvbihDbWRMaW5lQWN0aW9uIGFjdGlvbiwgQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vcmVxdWlyZS9BY3Rpb25EZXBlbmRlbmN5UnVsZS5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vcmVxdWlyZS9BY3Rpb25EZXBlbmRlbmN5UnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjY1MGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9yZXF1aXJlL0FjdGlvbkRlcGVuZGVuY3lSdWxlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworCisvKioKKyAqIEEge0BsaW5rIFJlcXVpcmVtZW50UnVsZX0gd2hpY2ggbGlua3MgdGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufSB0byB0aGUKKyAqIHtAbGluayBDbWRMaW5lQWN0aW9ufSB2aWEgdGhlIHtAbGluayBDbWRMaW5lQWN0aW9ufSdzIG5hbWUgYW5kIGFsc28gc3BlY2lmaWVzCisgKiBpdHMgcmVsYXRpb25zaGlwIHRvIHRoZSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gKGkuZS4gUmVxdWlyZWQsIE9wdGlvbmFsLAorICogZXRjLi4uKS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25EZXBlbmRlbmN5UnVsZSBpbXBsZW1lbnRzIFJlcXVpcmVtZW50UnVsZSB7CisgICBTdHJpbmcgYWN0aW9uTmFtZTsKKyAgIFJlbGF0aW9uIHJlbGF0aW9uOworCisgICBwdWJsaWMgQWN0aW9uRGVwZW5kZW5jeVJ1bGUoKSB7CisgICB9CisKKyAgIHB1YmxpYyBBY3Rpb25EZXBlbmRlbmN5UnVsZShTdHJpbmcgYWN0aW9uTmFtZSwgUmVsYXRpb24gcmVsYXRpb24pIHsKKyAgICAgIHRoaXMuYWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7CisgICAgICB0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTmFtZSgpIHsKKyAgICAgIHJldHVybiBhY3Rpb25OYW1lOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25OYW1lKFN0cmluZyBhY3Rpb25OYW1lKSB7CisgICAgICB0aGlzLmFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lOworICAgfQorCisgICBwdWJsaWMgUmVsYXRpb24gZ2V0UmVsYXRpb24oKSB7CisgICAgICByZXR1cm4gcmVsYXRpb247CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFJlbGF0aW9uKFJlbGF0aW9uIHJlbGF0aW9uKSB7CisgICAgICB0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247CisgICB9CisKKyAgIHB1YmxpYyBSZWxhdGlvbiBnZXRSZWxhdGlvbihDbWRMaW5lQWN0aW9uIGFjdGlvbikgeworICAgICAgVmFsaWRhdGUubm90TnVsbChhY3Rpb25OYW1lKTsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwocmVsYXRpb24pOworICAgICAgVmFsaWRhdGUubm90TnVsbChhY3Rpb24pOworCisgICAgICBpZiAoYWN0aW9uLmdldE5hbWUoKS5lcXVhbHMoYWN0aW9uTmFtZSkpIHsKKyAgICAgICAgIHJldHVybiByZWxhdGlvbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBSZWxhdGlvbi5OT05FOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIGFjdGlvbk5hbWUgKyAiIDogIiArIHJlbGF0aW9uOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vcmVxdWlyZS9SZXF1aXJlbWVudFJ1bGUuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3JlcXVpcmUvUmVxdWlyZW1lbnRSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM4YzAyYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3JlcXVpcmUvUmVxdWlyZW1lbnRSdWxlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZTsNCisNCisvL09PRFQgaW1wb3J0cw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsNCisNCisvKioNCisgKiBBIHtAbGluayBDbWRMaW5lT3B0aW9ufSByZXF1aXJlbWVudCBydWxlIHdoaWNoIHNwZWNpZmllcyBpZiBpdCBpcyByZXF1aXJlZCwNCisgKiBvcHRpb25hbCwgb3Igbm90IHJlcXVpcmVkIGF0IGFsbC4NCisgKiANCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVpcmVtZW50UnVsZSB7DQorDQorICAgcHVibGljIGVudW0gUmVsYXRpb24gew0KKyAgICAgIFJFUVVJUkVELCBPUFRJT05BTCwgTk9ORQ0KKyAgIH0NCisNCisgICBwdWJsaWMgUmVsYXRpb24gZ2V0UmVsYXRpb24oQ21kTGluZUFjdGlvbiBhY3Rpb24pOw0KKw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9zdG9yZS9DbWRMaW5lT3B0aW9uU3RvcmUuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3N0b3JlL0NtZExpbmVPcHRpb25TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjgzZGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9zdG9yZS9DbWRMaW5lT3B0aW9uU3RvcmUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnN0b3JlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworCisvKioKKyAqIFN0b3JhZ2UgZm9yIGxvYWRpbmcgc3VwcG9ydGVkIHtAbGluayBDbWRMaW5lT3B0aW9ufXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIENtZExpbmVPcHRpb25TdG9yZSB7CisKKyAgIHB1YmxpYyBTZXQ8Q21kTGluZU9wdGlvbj4gbG9hZFN1cHBvcnRlZE9wdGlvbnMoKQorICAgICAgdGhyb3dzIENtZExpbmVPcHRpb25TdG9yZUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vc3RvcmUvQ21kTGluZU9wdGlvblN0b3JlRmFjdG9yeS5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vc3RvcmUvQ21kTGluZU9wdGlvblN0b3JlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWMwNjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9zdG9yZS9DbWRMaW5lT3B0aW9uU3RvcmVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zdG9yZTsKKworLyoqCisgKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgQ21kTGluZU9wdGlvblN0b3JlfXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIENtZExpbmVPcHRpb25TdG9yZUZhY3RvcnkgeworCisgICBwdWJsaWMgQ21kTGluZU9wdGlvblN0b3JlIGNyZWF0ZVN0b3JlKCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmUuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGIxYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vc3RvcmUvc3ByaW5nL1NwcmluZ0NtZExpbmVPcHRpb25TdG9yZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3RvcmUuc3ByaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lT3B0aW9uU3RvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnN0b3JlLkNtZExpbmVPcHRpb25TdG9yZTsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dDsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLyoqCisgKiBTcHJpbmcgRnJhbWV3b3JrIGJhc2VkIHtAbGluayBDbWRMaW5lT3B0aW9uU3RvcmV9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFNwcmluZ0NtZExpbmVPcHRpb25TdG9yZSBpbXBsZW1lbnRzIENtZExpbmVPcHRpb25TdG9yZSB7CisKKyAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQ7CisKKyAgIHB1YmxpYyBTcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmUoU3RyaW5nIHNwcmluZ0NvbmZpZykgeworICAgICAgYXBwQ29udGV4dCA9IG5ldyBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0KHNwcmluZ0NvbmZpZyk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFNldDxDbWRMaW5lT3B0aW9uPiBsb2FkU3VwcG9ydGVkT3B0aW9ucygpCisgICAgICAgICB0aHJvd3MgQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgTWFwPFN0cmluZywgQ21kTGluZU9wdGlvbj4gb3B0aW9uc01hcCA9IGFwcENvbnRleHQKKyAgICAgICAgICAgIC5nZXRCZWFuc09mVHlwZShDbWRMaW5lT3B0aW9uLmNsYXNzKTsKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBzdXBwb3J0ZWRPcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogb3B0aW9uc01hcC52YWx1ZXMoKSkgeworICAgICAgICAgaWYgKCFvcHRpb24uaXNTdWJPcHRpb24oKSkgeworICAgICAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQob3B0aW9uKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzdXBwb3J0ZWRPcHRpb25zOworICAgfQorCisgICBwcm90ZWN0ZWQgQXBwbGljYXRpb25Db250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKKyAgICAgIHJldHVybiBhcHBDb250ZXh0OworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vc3RvcmUvc3ByaW5nL1NwcmluZ0NtZExpbmVPcHRpb25TdG9yZUZhY3RvcnkuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ZmM2MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3N0b3JlL3NwcmluZy9TcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zdG9yZS5zcHJpbmc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnN0b3JlLkNtZExpbmVPcHRpb25TdG9yZUZhY3Rvcnk7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFNwcmluZ0NtZExpbmVPcHRpb25TdG9yZX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlRmFjdG9yeSBpbXBsZW1lbnRzCisgICAgICBDbWRMaW5lT3B0aW9uU3RvcmVGYWN0b3J5IHsKKworICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnOworCisgICBwdWJsaWMgU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlRmFjdG9yeSgpIHsKKyAgICAgIGNvbmZpZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3ByaW5nLmNvbmZpZyIsIG51bGwpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmUgY3JlYXRlU3RvcmUoKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGNvbmZpZyk7CisKKyAgICAgIHJldHVybiBuZXcgU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlKGNvbmZpZyk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyhTdHJpbmcgY29uZmlnKSB7CisgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9BbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9BbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzhjYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL0FsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvcjsNCisNCisvL0pESyBpbXBvcnRzDQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisvL09PRFQgaW1wb3J0cw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdC5HcmFkZTsNCisNCisvKioNCisgKiBBIHtAbGluayBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfSB3aGljaCBjaGVjayBhcmdzIGFnYWluc3QgYSBzdXBwbGllZCBsaXN0IG9mDQorICogdmFsaWQgYWxsb3dlZCBhcmd1bWVudHMuDQorICogDQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpDQorICovDQorcHVibGljIGNsYXNzIEFsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzDQorICAgICAgQ21kTGluZU9wdGlvblZhbGlkYXRvciB7DQorDQorICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYWxsb3dlZEFyZ3M7DQorDQorICAgcHVibGljIEFsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvcigpIHsNCisgICAgICB0aGlzLmFsbG93ZWRBcmdzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOw0KKyAgIH0NCisNCisgICBAT3ZlcnJpZGUNCisgICBwdWJsaWMgUmVzdWx0IHZhbGlkYXRlKENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb25JbnN0KSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25JbnN0KTsNCisNCisgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IG9wdGlvbkluc3QuZ2V0VmFsdWVzKCkpIHsNCisgICAgICAgICBpZiAoIWFsbG93ZWRBcmdzLmNvbnRhaW5zKHZhbHVlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KEdyYWRlLkZBSUwsICJWYWx1ZSAnIiArIHZhbHVlDQorICAgICAgICAgICAgICAgICAgKyAiJyBpcyBub3QgYWxsb3dlZCBmb3Igb3B0aW9uICINCisgICAgICAgICAgICAgICAgICArIG9wdGlvbkluc3QuZ2V0T3B0aW9uKCkuZ2V0TG9uZ09wdGlvbigpDQorICAgICAgICAgICAgICAgICAgKyAiIC0gQWxsb3dlZCB2YWx1ZXMgPSAiICsgdGhpcy5nZXRBbGxvd2VkQXJncygpKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBuZXcgUmVzdWx0KEdyYWRlLlBBU1MsICJTdWNjZXNzIik7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZEFyZ3MoKSB7DQorICAgICAgcmV0dXJuIGFsbG93ZWRBcmdzOw0KKyAgIH0NCisNCisgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQXJncyhMaXN0PFN0cmluZz4gYWxsb3dlZEFyZ3MpIHsNCisgICAgICB0aGlzLmFsbG93ZWRBcmdzID0gYWxsb3dlZEFyZ3M7DQorICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL0FyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2JkODUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL0FyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3I7DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCisNCisvL09PRFQgaW1wb3J0cw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdC5HcmFkZTsNCisNCisvKioNCisgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIG9uIG9wdGlvbiBpbnN0YW5jZXMgdmlhIGFsbG93ZWQgYXJncyB3aGljaCBhcmUgcmVndWxhcg0KKyAqIGV4cHJlc3Npb25zIGZvciBhbGxvd2VkIGFyZ3VtZW50IHZhbHVlcy4NCisgKiANCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikNCisgKi8NCitwdWJsaWMgY2xhc3MgQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvciBleHRlbmRzDQorICAgICAgQWxsb3dlZEFyZ3NDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIHsNCisNCisgICBAT3ZlcnJpZGUNCisgICBwdWJsaWMgUmVzdWx0IHZhbGlkYXRlKENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb25JbnN0KSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25JbnN0KTsNCisNCisgICAgICBUT1A6IGZvciAoU3RyaW5nIHZhbHVlIDogb3B0aW9uSW5zdC5nZXRWYWx1ZXMoKSkgew0KKyAgICAgICAgIGZvciAoU3RyaW5nIHJlZ2V4IDogZ2V0QWxsb3dlZEFyZ3MoKSkgew0KKyAgICAgICAgICAgIGlmIChQYXR0ZXJuLm1hdGNoZXMocmVnZXgsIHZhbHVlKSkgew0KKyAgICAgICAgICAgICAgIGNvbnRpbnVlIFRPUDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KEdyYWRlLkZBSUwsICJWYWx1ZSAnIiArIHZhbHVlDQorICAgICAgICAgICAgICAgKyAiJyBpcyBub3QgYWxsb3dlZCBmb3Igb3B0aW9uICIgKyBvcHRpb25JbnN0LmdldE9wdGlvbigpDQorICAgICAgICAgICAgICAgKyAiIC0gQWxsb3dlZCB2YWx1ZXMgPSAiICsgZ2V0QWxsb3dlZEFyZ3MoKSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBuZXcgUmVzdWx0KEdyYWRlLlBBU1MsICJTdWNjZXNzIik7DQorICAgfQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvQ2xhc3NFeGlzdHNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvQ2xhc3NFeGlzdHNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTY5OGU5OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9DbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3I7DQorDQorLy9PT0RUIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQuR3JhZGU7DQorDQorLyoqDQorICogVmFsaWRhdGVzIGFyZ3VtZW50cyB3aGljaCBhcmUgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBhcmUgdmFsaWQgY2xhc3NwYXRocy4NCisgKiANCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2xhc3NFeGlzdHNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMNCisgICAgICBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIHsNCisNCisgICBAT3ZlcnJpZGUNCisgICBwdWJsaWMgUmVzdWx0IHZhbGlkYXRlKENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb25JbnN0KSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25JbnN0KTsNCisNCisgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IG9wdGlvbkluc3QuZ2V0VmFsdWVzKCkpIHsNCisgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUodmFsdWUpOw0KKyAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoR3JhZGUuRkFJTCwgIlZhbHVlICciICsgdmFsdWUNCisgICAgICAgICAgICAgICAgICArICInIGZvciBvcHRpb24gIiArIG9wdGlvbkluc3QuZ2V0T3B0aW9uKCkuZ2V0TG9uZ09wdGlvbigpDQorICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIHZhbGlkIGNsYXNzIik7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbmV3IFJlc3VsdChHcmFkZS5QQVNTLCAiU3VjY2VzcyIpOw0KKyAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTZlZDE3NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yOw0KKw0KKy8vT09EVCBpbXBvcnRzDQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7DQorDQorLyoqDQorICogVmFsaWRhdG9yIGZvciBzcGVjaWZpZWQgdmFsdWVzIG9mIHtAbGluayBDbWRMaW5lT3B0aW9ufXMuDQorICogDQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpDQorICovDQorcHVibGljIGludGVyZmFjZSBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIHsNCisNCisgICBwdWJsaWMgY2xhc3MgUmVzdWx0IHsNCisgICAgICBwdWJsaWMgZW51bSBHcmFkZSB7DQorICAgICAgICAgUEFTUywgRkFJTDsNCisgICAgICB9DQorDQorICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsNCisgICAgICBwcml2YXRlIEdyYWRlIGdyYWRlOw0KKw0KKyAgICAgIHB1YmxpYyBSZXN1bHQoR3JhZGUgZ3JhZGUsIFN0cmluZyBtZXNzYWdlKSB7DQorICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsNCisgICAgICAgICB0aGlzLmdyYWRlID0gZ3JhZGU7DQorICAgICAgfQ0KKw0KKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsNCisgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCisgICAgICB9DQorDQorICAgICAgcHVibGljIEdyYWRlIGdldEdyYWRlKCkgew0KKyAgICAgICAgIHJldHVybiBncmFkZTsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIFRocm93cyB7QGxpbmsgQ21kTGluZVZhbGlkYXRpb25FeGNlcHRpb259IGlmIHZhbGlkYXRpb24gZmFpbHMsIG90aGVyd2lzZQ0KKyAgICAqIG1ldGhvZCBqdXN0IHJldHVybnMuDQorICAgICovDQorICAgcHVibGljIFJlc3VsdCB2YWxpZGF0ZShDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uSW5zdCk7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9GaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlN2QwZGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvcjsNCisNCisvL0pESyBpbXBvcnRzDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCisNCisvL09PRFQgaW1wb3J0cw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdC5HcmFkZTsNCisNCisvKioNCisgKiBBIHtAbGluayBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfSB3aGljaCBjaGVja3MgYXJncyBpZiB0aGV5IGFyZSBleGlzdGluZw0KKyAqIGZpbGVzLg0KKyAqIA0KKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMgQ21kTGluZU9wdGlvblZhbGlkYXRvciB7DQorDQorICAgQE92ZXJyaWRlDQorICAgcHVibGljIFJlc3VsdCB2YWxpZGF0ZShDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uSW5zdCkgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uSW5zdCk7DQorDQorICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBvcHRpb25JbnN0LmdldFZhbHVlcygpKSB7DQorICAgICAgICAgaWYgKCFuZXcgRmlsZSh2YWx1ZSkuZXhpc3RzKCkpIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChHcmFkZS5GQUlMLCAiVmFsdWUgJyIgKyB2YWx1ZQ0KKyAgICAgICAgICAgICAgICAgICsgIicgZm9yIG9wdGlvbiAiICsgb3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRMb25nT3B0aW9uKCkNCisgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGFuIGV4aXN0aW5nIGZpbGUiKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBuZXcgUmVzdWx0KEdyYWRlLlBBU1MsICJTdWNjZXNzIik7DQorICAgfQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvTm9SZXN0cmljdGlvbnNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvTm9SZXN0cmljdGlvbnNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODVjYTJkZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9Ob1Jlc3RyaWN0aW9uc0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3I7DQorDQorLy9PT0RUIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdC5HcmFkZTsNCisNCisvKioNCisgKiBBIHtAbGluayBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfSB3aGljaCBhbHdheXMgcmV0dXJucyB0cnVlLg0KKyAqIA0KKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBOb1Jlc3RyaWN0aW9uc0NtZExpbmVPcHRpb25WYWxpZGF0b3IgaW1wbGVtZW50cw0KKyAgICAgIENtZExpbmVPcHRpb25WYWxpZGF0b3Igew0KKw0KKyAgIHB1YmxpYyBSZXN1bHQgdmFsaWRhdGUoQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3QpIHsNCisgICAgICByZXR1cm4gbmV3IFJlc3VsdChHcmFkZS5QQVNTLCAiU3VjY2VzcyIpOw0KKyAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9wYXJzZXIvQ21kTGluZVBhcnNlci5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9wYXJzZXIvQ21kTGluZVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjUxOTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3BhcnNlci9DbWRMaW5lUGFyc2VyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnBhcnNlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuUGFyc2VkQXJnOworCisvKioKKyAqIENvbW1hbmQgTGluZSBwYXJzZXIgd2hpY2ggcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRvIGEge0BsaW5rIFNldH0gb2YKKyAqIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ21kTGluZVBhcnNlciB7CisKKyAgIHB1YmxpYyBMaXN0PFBhcnNlZEFyZz4gcGFyc2UoU3RyaW5nW10gYXJncykgdGhyb3dzIENtZExpbmVQYXJzZXJFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcGFyc2VyL1N0ZENtZExpbmVQYXJzZXIuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcGFyc2VyL1N0ZENtZExpbmVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYmIwMjhlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9wYXJzZXIvU3RkQ21kTGluZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnBhcnNlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuUGFyc2VkQXJnOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBTdGFuZGFyZCBDb21tYW5kLWxpbmUgcGFyc2VyIHdoaWNoIHBhcnNlciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvZiB0aGUgZm9ybQorICogLS1sb25nT3B0aW9uIG9yIC1zaG9ydE9wdGlvbiBmb2xsb3dlZCBieSAwIG9yIG1vcmUgdmFsdWVzLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFN0ZENtZExpbmVQYXJzZXIgaW1wbGVtZW50cyBDbWRMaW5lUGFyc2VyIHsKKworICAgcHVibGljIExpc3Q8UGFyc2VkQXJnPiBwYXJzZShTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ21kTGluZVBhcnNlckV4Y2VwdGlvbiB7CisgICAgICBMaXN0PFBhcnNlZEFyZz4gcGFyc2VkQXJncyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7CisgICAgICAgICBpZiAoaXNPcHRpb24oYXJnKSkgeworICAgICAgICAgICAgcGFyc2VkQXJncy5hZGQobmV3IFBhcnNlZEFyZyhnZXRPcHRpb25OYW1lKGFyZyksCisgICAgICAgICAgICAgICAgICBQYXJzZWRBcmcuVHlwZS5PUFRJT04pKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJzZWRBcmdzLmFkZChuZXcgUGFyc2VkQXJnKGFyZywgUGFyc2VkQXJnLlR5cGUuVkFMVUUpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBwYXJzZWRBcmdzOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIC8qIHBhY2thZ2UgKi9zdGF0aWMgYm9vbGVhbiBpc09wdGlvbihTdHJpbmcgYXJnKSB7CisgICAgICByZXR1cm4gKGFyZy5zdGFydHNXaXRoKCItIikpOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIC8qIHBhY2thZ2UgKi9zdGF0aWMgU3RyaW5nIGdldE9wdGlvbk5hbWUoU3RyaW5nIGFyZykgeworICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCItLSIpKSB7CisgICAgICAgICByZXR1cm4gYXJnLnN1YnN0cmluZygyKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIi0iKSkgeworICAgICAgICAgcmV0dXJuIGFyZy5zdWJzdHJpbmcoMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3ByZXNlbnRlci9DbWRMaW5lUHJlc2VudGVyLmphdmEgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3ByZXNlbnRlci9DbWRMaW5lUHJlc2VudGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhZmQzYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcHJlc2VudGVyL0NtZExpbmVQcmVzZW50ZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucHJlc2VudGVyOworCisvKioKKyAqIFByZXNlbnRlciB0byBkaXNwbGF5aW5nIGhlbHAgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IGhlbHAgcHJpbnRlcnMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIENtZExpbmVQcmVzZW50ZXIgeworCisgICBwdWJsaWMgdm9pZCBwcmVzZW50T3B0aW9uSGVscChTdHJpbmcgb3B0aW9uSGVscE1lc3NhZ2UpOworCisgICBwdWJsaWMgdm9pZCBwcmVzZW50QWN0aW9uSGVscChTdHJpbmcgYWN0aW9uSGVscE1lc3NhZ2UpOworCisgICBwdWJsaWMgdm9pZCBwcmVzZW50QWN0aW9uc0hlbHAoU3RyaW5nIGFjdGlvbnNIZWxwTWVzc2FnZSk7CisKKyAgIHB1YmxpYyB2b2lkIHByZXNlbnRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSk7CisKKyAgIHB1YmxpYyB2b2lkIHByZXNlbnRBY3Rpb25NZXNzYWdlKFN0cmluZyBhY3Rpb25NZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcHJlc2VudGVyL1N0ZENtZExpbmVQcmVzZW50ZXIuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcHJlc2VudGVyL1N0ZENtZExpbmVQcmVzZW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg3NjdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9wcmVzZW50ZXIvU3RkQ21kTGluZVByZXNlbnRlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5wcmVzZW50ZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8qKgorICogU3RhbmRhcmQgaGVscCBwcmVzZW50ZXIgd2hpY2ggc2VuZHMgaGVscCBtZXNzYWdlcyB0byB7QGxpbmsgU3lzdGVtLm91dH0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgU3RkQ21kTGluZVByZXNlbnRlciBpbXBsZW1lbnRzCisgICAgICBDbWRMaW5lUHJlc2VudGVyIHsKKworICAgcHJpdmF0ZSBQcmludFN0cmVhbSBwczsKKworICAgcHVibGljIFN0ZENtZExpbmVQcmVzZW50ZXIoKSB7CisgICAgICB0aGlzKFN5c3RlbS5vdXQpOworICAgfQorCisgICBwdWJsaWMgU3RkQ21kTGluZVByZXNlbnRlcihPdXRwdXRTdHJlYW0gb3MpIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3MpOworCisgICAgICBwcyA9IG5ldyBQcmludFN0cmVhbShvcyk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgcHJlc2VudE9wdGlvbkhlbHAoU3RyaW5nIG9wdGlvbkhlbHBNZXNzYWdlKSB7CisgICAgICBwcy5wcmludGxuKG9wdGlvbkhlbHBNZXNzYWdlKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBwcmVzZW50QWN0aW9uSGVscChTdHJpbmcgYWN0aW9uSGVscE1lc3NhZ2UpIHsKKyAgICAgIHBzLnByaW50bG4oYWN0aW9uSGVscE1lc3NhZ2UpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHByZXNlbnRBY3Rpb25zSGVscChTdHJpbmcgYWN0aW9uc0hlbHBNZXNzYWdlKSB7CisgICAgICBwcy5wcmludGxuKGFjdGlvbnNIZWxwTWVzc2FnZSk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgcHJlc2VudEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisgICAgICBwcy5wcmludGxuKCJFUlJPUjogIiArIGVycm9yTWVzc2FnZSk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgcHJlc2VudEFjdGlvbk1lc3NhZ2UoU3RyaW5nIGFjdGlvbk1lc3NhZ2UpIHsKKyAgICAgIHBzLnByaW50bG4oYWN0aW9uTWVzc2FnZSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3ByaW50ZXIvQ21kTGluZVByaW50ZXIuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcHJpbnRlci9DbWRMaW5lUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOWJlZWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3ByaW50ZXIvQ21kTGluZVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkucHJpbnRlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdDsKKworLyoqCisgKiBQcmludGVyIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEge0BsaW5rIFN0cmluZ30gcmVwcmVzZW50YXRpb24KKyAqIG9mIGhlbHAsIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgbWlzc2luZyByZXF1aXJlZCBvcHRpb25zIGVycm9ycy4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGludGVyZmFjZSBDbWRMaW5lUHJpbnRlciB7CisKKyAgIC8qKgorICAgICogU2hvdWxkIGdlbmVyYXRlIGhlbHAgbWVzc2FnZSBmb3IgYWN0aW9uIHNwZWNpZmllZCBieQorICAgICoge0BsaW5rICNDbWRMaW5lQXJncy5nZXRTcGVjaWZpZWRBY3Rpb24oKX0uCisgICAgKiAKKyAgICAqIEBwYXJhbSBhY3Rpb24KKyAgICAqICAgICAgICAgICB7QGxpbmsgQ21kTGluZUFjdGlvbn0gZm9yIHdoaWNoIGhlbHAgd2lsbCBiZSBnZW5lcmF0ZQorICAgICogQHBhcmFtIG9wdGlvbnMKKyAgICAqICAgICAgICAgICBTdXBwb3J0ZWQge0BsaW5rIENtZExpbmVPcHRpb259cworICAgICogQHJldHVybiBIZWxwIG1lc3NhZ2UgZm9yIHNwZWNpZmllZCBhY3Rpb24KKyAgICAqLworICAgcHVibGljIFN0cmluZyBwcmludEFjdGlvbkhlbHAoQ21kTGluZUFjdGlvbiBhY3Rpb24sIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKTsKKworICAgLyoqCisgICAgKiBHZW5lcmF0ZXMgaGVscCBtZXNzYWdlcyBnaXZlbiB7QGxpbmsgQ21kTGluZUFjdGlvbn1zLgorICAgICogCisgICAgKiBAcGFyYW0gYWN0aW9ucworICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lQWN0aW9ufXMgdG8gcHJpbnQgaGVscCBmb3IKKyAgICAqIEByZXR1cm4gSGVscCBtZXNzYWdlIGZvciBnaXZlbiB7QGxpbmsgQ21kTGluZUFjdGlvbn1zCisgICAgKi8KKyAgIHB1YmxpYyBTdHJpbmcgcHJpbnRBY3Rpb25zSGVscChTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyk7CisKKyAgIC8qKgorICAgICogR2VuZXJhdGVzIGhlbHAgbWVzc2FnZSBmb3IgZ2l2ZW4ge0BsaW5rIENtZExpbmVPcHRpb259cy4KKyAgICAqIAorICAgICogQHBhcmFtIG9wdGlvbnMKKyAgICAqICAgICAgICAgICB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIGZvciB3aGljaCBoZWxwIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQKKyAgICAqIEByZXR1cm4gSGVscCBtZXNzYWdlIGZvciBnaXZlbiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zCisgICAgKi8KKyAgIHB1YmxpYyBTdHJpbmcgcHJpbnRPcHRpb25zSGVscChTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucyk7CisKKyAgIC8qKgorICAgICogR2VuZXJhdGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlIGZvciByZXN1bHRzIG9mIGZhaWxlZCB2YWxpZGF0aW9ucy4KKyAgICAqIAorICAgICogQHBhcmFtIHJlc3VsdHMKKyAgICAqICAgICAgICAgICB7QGxpbmsgTGlzdH0gb2YgRkFJTGVkIHZhbGlkYXRpb25zCisgICAgKiBAcmV0dXJuIEdlbmVyYXRlZCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICAqLworICAgcHVibGljIFN0cmluZyBwcmludE9wdGlvblZhbGlkYXRpb25FcnJvcnMoTGlzdDxSZXN1bHQ+IHJlc3VsdHMpOworCisgICAvKioKKyAgICAqIEdlbmVyYXRlcyBtaXNzaW5nIHJlcXVpcmVkIG9wdGlvbnMgZXJyb3IgbWVzc2FnZSBmcm9tIGdpdmVuCisgICAgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIHdoaWNoIHdoZXJlIHJlcXVpcmVkIGFuZCBub3Qgc3BlY2lmaWVkLgorICAgICogCisgICAgKiBAcGFyYW0gbWlzc2luZ09wdGlvbnMKKyAgICAqICAgICAgICAgICB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIHdoaWNoIHdoZXJlIHJlcXVpcmVkIGFuZAorICAgICogICAgICAgICAgIG5vdCBzZXQuCisgICAgKiBAcmV0dXJuIEdlbmVyYXRlZCBtaXNzaW5nIHJlcXVpcmVkIG9wdGlvbnMgZXJyb3IgbWVzc2FnZS4KKyAgICAqLworICAgcHVibGljIFN0cmluZyBwcmludFJlcXVpcmVkT3B0aW9uc01pc3NpbmdFcnJvcigKKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBtaXNzaW5nT3B0aW9ucyk7CisKKyAgIC8qKgorICAgICogR2VuZXJhdGVzIHtAbGluayBDbWRMaW5lQWN0aW9ufSBtZXNzYWdlIGZyb20gbGlzdCBvZiBtZXNzYWdlcy4KKyAgICAqCisgICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzIGZyb20gYSB7QGxpbmsgQ21kTGluZUFjdGlvbn0KKyAgICAqIEByZXR1cm4gcHJpbnRlZCBtZXNzYWdlIGZyb20gbGlzdCBvZiBtZXNzYWdlcy4KKyAgICAqLworICAgcHVibGljIFN0cmluZyBwcmludEFjdGlvbk1lc3NhZ2VzKExpc3Q8U3RyaW5nPiBtZXNzYWdlcyk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3ByaW50ZXIvU3RkQ21kTGluZVByaW50ZXIuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcHJpbnRlci9TdGRDbWRMaW5lUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzNmYTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3ByaW50ZXIvU3RkQ21kTGluZVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnByaW50ZXI7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5hc0dyb3VwT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5kZXRlcm1pbmVPcHRpb25hbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZGV0ZXJtaW5lUmVsZXZhbnRTdWJPcHRpb25zOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5kZXRlcm1pbmVSZXF1aXJlZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZGV0ZXJtaW5lUmVxdWlyZWRTdWJPcHRpb25zOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5nZXRGb3JtYXR0ZWRTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmlzR3JvdXBPcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLnNvcnRBY3Rpb25zOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5zb3J0T3B0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuc29ydE9wdGlvbnNCeVJlcXVpcmVkU3RhdHVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdDsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogU3RhbmRhcmQge0BsaW5rIENtZExpbmVQcmludGVyfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTdGRDbWRMaW5lUHJpbnRlciBpbXBsZW1lbnRzIENtZExpbmVQcmludGVyIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIHByaW50QWN0aW9uSGVscChDbWRMaW5lQWN0aW9uIGFjdGlvbiwKKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgIHNiLmFwcGVuZChnZXRIZWFkZXIoYWN0aW9uKSkuYXBwZW5kKCJcbiIpOworICAgICAgc2IuYXBwZW5kKGdldERlc2NyaXB0aW9uKGFjdGlvbikpLmFwcGVuZCgiXG4iKTsKKyAgICAgIHNiLmFwcGVuZChnZXRVc2FnZShhY3Rpb24sIG9wdGlvbnMpKS5hcHBlbmQoIlxuIik7CisgICAgICBzYi5hcHBlbmQoZ2V0RXhhbXBsZXMoYWN0aW9uKSkuYXBwZW5kKCJcbiIpOworICAgICAgc2IuYXBwZW5kKGdldEZvb3RlcihhY3Rpb24pKS5hcHBlbmQoIlxuIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkZXIoQ21kTGluZUFjdGlvbiBhY3Rpb24pIHsKKyAgICAgIHJldHVybiAiKiogQWN0aW9uIEhlbHAgZm9yICciICsgYWN0aW9uLmdldE5hbWUoKSArICInICoqIjsKKyAgIH0KKworICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbihDbWRMaW5lQWN0aW9uIGFjdGlvbikgeworICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiPiBERVNDUklQVElPTjpcbiIpOworICAgICAgaWYgKGFjdGlvbi5nZXREZXRhaWxlZERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgc2IuYXBwZW5kKCIgIikuYXBwZW5kKGFjdGlvbi5nZXREZXRhaWxlZERlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCJeXFxzKiIsICIiKS5yZXBsYWNlQWxsKCJcXHMqJCIsICIiKSk7CisgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgIHNiLmFwcGVuZCgiICIpLmFwcGVuZCgKKyAgICAgICAgICAgICAgIGFjdGlvbi5nZXREZXNjcmlwdGlvbigpLnJlcGxhY2VBbGwoIl5cXHMqIiwgIiIpCisgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXFxzKiQiLCAiIikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHNiLmFwcGVuZCgiIC0gTi9BIik7CisgICAgICB9CisgICAgICByZXR1cm4gc2IuYXBwZW5kKCJcbiIpLnRvU3RyaW5nKCk7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXNhZ2UoQ21kTGluZUFjdGlvbiBhY3Rpb24sIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI+IFVTQUdFOlxuIik7CisgICAgICBzYi5hcHBlbmQoZ2V0UmVxdWlyZWRTdWJIZWFkZXIoKSkuYXBwZW5kKCJcbiIpOworICAgICAgU2V0PENtZExpbmVPcHRpb24+IHJlcXVpcmVkT3B0aW9ucyA9IGRldGVybWluZVJlcXVpcmVkKGFjdGlvbiwgb3B0aW9ucyk7CisgICAgICBMaXN0PENtZExpbmVPcHRpb24+IHNvcnRlZFJlcXVpcmVkT3B0aW9ucyA9IHNvcnRPcHRpb25zKHJlcXVpcmVkT3B0aW9ucyk7CisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogc29ydGVkUmVxdWlyZWRPcHRpb25zKSB7CisgICAgICAgICBzYi5hcHBlbmQoZ2V0UmVxdWlyZWRPcHRpb25IZWxwKGFjdGlvbiwgb3B0aW9uKSkuYXBwZW5kKCJcbiIpOworICAgICAgfQorCisgICAgICBzYi5hcHBlbmQoZ2V0T3B0aW9uYWxTdWJIZWFkZXIoKSkuYXBwZW5kKCJcbiIpOworICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbmFsT3B0aW9ucyA9IGRldGVybWluZU9wdGlvbmFsKGFjdGlvbiwgb3B0aW9ucyk7CisgICAgICBMaXN0PENtZExpbmVPcHRpb24+IHNvcnRlZE9wdGlvbmFsT3B0aW9ucyA9IHNvcnRPcHRpb25zKG9wdGlvbmFsT3B0aW9ucyk7CisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogc29ydGVkT3B0aW9uYWxPcHRpb25zKSB7CisgICAgICAgICBzYi5hcHBlbmQoZ2V0T3B0aW9uYWxPcHRpb25IZWxwKGFjdGlvbiwgb3B0aW9uKSkuYXBwZW5kKCJcbiIpOworICAgICAgfQorICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRTdWJIZWFkZXIoKSB7CisgICAgICByZXR1cm4gIiBSZXF1aXJlZDoiOworICAgfQorCisgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkT3B0aW9uSGVscChDbWRMaW5lQWN0aW9uIGFjdGlvbiwKKyAgICAgICAgIENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgR3JvdXBDbWRMaW5lT3B0aW9uKSB7CisgICAgICAgICByZXR1cm4gZ2V0R3JvdXBIZWxwKGFjdGlvbiwgKEdyb3VwQ21kTGluZU9wdGlvbikgb3B0aW9uLCAiICAgIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIGdldE9wdGlvbkhlbHAoYWN0aW9uLCBvcHRpb24sICIgICAiKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbFN1YkhlYWRlcigpIHsKKyAgICAgIHJldHVybiAiIE9wdGlvbmFsOiI7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxPcHRpb25IZWxwKENtZExpbmVBY3Rpb24gYWN0aW9uLAorICAgICAgICAgQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBHcm91cENtZExpbmVPcHRpb24pIHsKKyAgICAgICAgIHJldHVybiBnZXRHcm91cEhlbHAoYWN0aW9uLCAoR3JvdXBDbWRMaW5lT3B0aW9uKSBvcHRpb24sICIgICAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gZ2V0T3B0aW9uSGVscChhY3Rpb24sIG9wdGlvbiwgIiAgICIpOworICAgICAgfQorICAgfQorCisgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4YW1wbGVzKENtZExpbmVBY3Rpb24gYWN0aW9uKSB7CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI+IEVYQU1QTEVTOlxuIik7CisgICAgICBpZiAoYWN0aW9uLmdldEV4YW1wbGVzKCkgIT0gbnVsbCkgeworICAgICAgICAgc2IuYXBwZW5kKCIgIikuYXBwZW5kKGFjdGlvbi5nZXRFeGFtcGxlcygpLnJlcGxhY2VBbGwoIl5cXHMqIiwgIiIpCisgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXFxzKiQiLCAiIikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHNiLmFwcGVuZCgiIC0gTi9BIik7CisgICAgICB9CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGb290ZXIoQ21kTGluZUFjdGlvbiBhY3Rpb24pIHsKKyAgICAgIHJldHVybiAiIjsKKyAgIH0KKworICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25IZWxwKENtZExpbmVBY3Rpb24gYWN0aW9uLCBDbWRMaW5lT3B0aW9uIG9wdGlvbiwKKyAgICAgICAgIFN0cmluZyBpbmRlbnQpIHsKKyAgICAgIFN0cmluZyBhcmdEZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKSB7CisgICAgICAgICBhcmdEZXNjcmlwdGlvbiA9ICgoQWR2YW5jZWRDbWRMaW5lT3B0aW9uKSBvcHRpb24pLmdldEhhbmRsZXIoKQorICAgICAgICAgICAgICAgLmdldEFyZ0Rlc2NyaXB0aW9uKGFjdGlvbiwgb3B0aW9uKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIGFyZ0hlbHAgPSBudWxsOworICAgICAgaWYgKG9wdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkNtZExpbmVPcHRpb24gJiYgb3B0aW9uLmhhc0FyZ3MoKSkgeworICAgICAgICAgYXJnSGVscCA9ICIgIiArIGFjdGlvbi5nZXROYW1lKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgYXJnSGVscCA9IChvcHRpb24uaGFzQXJncygpID8gIiA8IgorICAgICAgICAgICAgICAgKyAoYXJnRGVzY3JpcHRpb24gIT0gbnVsbCA/IGFyZ0Rlc2NyaXB0aW9uIDogb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAuZ2V0QXJnc0Rlc2NyaXB0aW9uKCkpICsgIj4iIDogIiIpOworICAgICAgfQorICAgICAgcmV0dXJuIGluZGVudCArICItIiArIG9wdGlvbi5nZXRTaG9ydE9wdGlvbigpICsgIiBbLS0iCisgICAgICAgICAgICArIG9wdGlvbi5nZXRMb25nT3B0aW9uKCkgKyAiXSIgKyBhcmdIZWxwOworICAgfQorCisgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEdyb3VwSGVscChDbWRMaW5lQWN0aW9uIGFjdGlvbiwKKyAgICAgICAgIEdyb3VwQ21kTGluZU9wdGlvbiBvcHRpb24sIFN0cmluZyBpbmRlbnQpIHsKKyAgICAgIFN0cmluZyBoZWxwU3RyaW5nID0gZ2V0T3B0aW9uSGVscChhY3Rpb24sIG9wdGlvbiwgaW5kZW50KTsKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBzdWJPcHRpb25zID0gZGV0ZXJtaW5lUmVxdWlyZWRTdWJPcHRpb25zKGFjdGlvbiwKKyAgICAgICAgICAgIChHcm91cENtZExpbmVPcHRpb24pIG9wdGlvbik7CisgICAgICBpZiAoc3ViT3B0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgIGlmICghb3B0aW9uLmdldFN1Yk9wdGlvbnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGhlbHBTdHJpbmcgKz0gIlxuIiArIGluZGVudCArICIgIE9uZSBvZjoiOworICAgICAgICAgICAgZm9yIChHcm91cFN1Yk9wdGlvbiBzdWJPcHRpb24gOiBvcHRpb24uZ2V0U3ViT3B0aW9ucygpKSB7CisgICAgICAgICAgICAgICBoZWxwU3RyaW5nICs9ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICsgZ2V0T3B0aW9uSGVscChhY3Rpb24sIHN1Yk9wdGlvbi5nZXRPcHRpb24oKSwgIiAgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBmb3IgKENtZExpbmVPcHRpb24gc3ViT3B0aW9uIDogZGV0ZXJtaW5lUmVsZXZhbnRTdWJPcHRpb25zKGFjdGlvbiwKKyAgICAgICAgICAgICAgIG9wdGlvbikpIHsKKyAgICAgICAgICAgIGhlbHBTdHJpbmcgKz0gIlxuIjsKKyAgICAgICAgICAgIGlmIChzdWJPcHRpb24gaW5zdGFuY2VvZiBHcm91cENtZExpbmVPcHRpb24pIHsKKyAgICAgICAgICAgICAgIGhlbHBTdHJpbmcgKz0gZ2V0R3JvdXBIZWxwKGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIChHcm91cENtZExpbmVPcHRpb24pIHN1Yk9wdGlvbiwgIiAgIiArIGluZGVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgaGVscFN0cmluZyArPSBnZXRPcHRpb25IZWxwKGFjdGlvbiwgc3ViT3B0aW9uLCAiICAiICsgaW5kZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhlbHBTdHJpbmcgKz0gIiAiCisgICAgICAgICAgICAgICAgICArIChzdWJPcHRpb25zLmNvbnRhaW5zKHN1Yk9wdGlvbikgPyAiKHJlcXVpcmVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIihvcHRpb25hbCkiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBoZWxwU3RyaW5nOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTdHJpbmcgcHJpbnRBY3Rpb25zSGVscChTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucykgeworICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgIHNiLmFwcGVuZCgifCIgKyBTdHJpbmdVdGlscy5yaWdodFBhZCgiIEFjdGlvbiIsIDM1KSArICJ8IgorICAgICAgICAgICAgKyAiIERlc2NyaXB0aW9uXG4iKTsKKyAgICAgIHNiLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgZm9yIChDbWRMaW5lQWN0aW9uIGFjdGlvbiA6IHNvcnRBY3Rpb25zKGFjdGlvbnMpKSB7CisgICAgICAgICBzYi5hcHBlbmQoIiAgIikuYXBwZW5kKFN0cmluZ1V0aWxzLnJpZ2h0UGFkKGFjdGlvbi5nZXROYW1lKCksIDM1KSk7CisgICAgICAgICBzYi5hcHBlbmQoIiAiKS5hcHBlbmQoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFwcGVuZCgiXG5cbiIpOworICAgICAgfQorICAgICAgc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIHByaW50T3B0aW9uc0hlbHAoU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgTGlzdDxDbWRMaW5lT3B0aW9uPiBzb3J0ZWRPcHRpb25zID0gc29ydE9wdGlvbnNCeVJlcXVpcmVkU3RhdHVzKG9wdGlvbnMpOworICAgICAgc2IuYXBwZW5kKGdldEhlYWRlcigpKS5hcHBlbmQoIlxuIik7CisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogc29ydGVkT3B0aW9ucykgeworICAgICAgICAgc2IuYXBwZW5kKGdldE9wdGlvbkhlbHAob3B0aW9uLCAiIikpLmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICAgIHNiLmFwcGVuZChnZXRGb290ZXIoKSkuYXBwZW5kKCJcbiIpOworICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGVyKCkgeworICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgIHNiLmFwcGVuZCgifCIgKyBTdHJpbmdVdGlscy5yaWdodFBhZCgiIFNob3J0IiwgNykgKyAifCIKKyAgICAgICAgICAgICsgU3RyaW5nVXRpbHMucmlnaHRQYWQoIiBMb25nIiwgNTApICsgInwgRGVzY3JpcHRpb25cbiIpOworICAgICAgc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25IZWxwKENtZExpbmVPcHRpb24gb3B0aW9uLCBTdHJpbmcgaW5kZW50KSB7CisgICAgICBTdHJpbmcgYXJnTmFtZSA9IG9wdGlvbi5oYXNBcmdzKCkgPyAiIDwiICsgb3B0aW9uLmdldEFyZ3NEZXNjcmlwdGlvbigpCisgICAgICAgICAgICArICI+IiA6ICIiOworICAgICAgU3RyaW5nIG9wdGlvblVzYWdlID0gaW5kZW50CisgICAgICAgICAgICArICItIgorICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5yaWdodFBhZChvcHRpb24uZ2V0U2hvcnRPcHRpb24oKSArICIsIiwgNykKKyAgICAgICAgICAgICsgIi0tIgorICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5yaWdodFBhZCgob3B0aW9uLmdldExvbmdPcHRpb24oKSArIGFyZ05hbWUpLAorICAgICAgICAgICAgICAgICAgNDkgLSBpbmRlbnQubGVuZ3RoKCkpICsgb3B0aW9uLmdldERlc2NyaXB0aW9uKCk7CisKKyAgICAgIG9wdGlvblVzYWdlID0gIiAiICsgb3B0aW9uVXNhZ2U7CisKKyAgICAgIGlmICghb3B0aW9uLmdldFJlcXVpcmVtZW50UnVsZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgIG9wdGlvblVzYWdlICs9ICJcbiIKKyAgICAgICAgICAgICAgICsgZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZXF1aXJlbWVudCBSdWxlczoiLCA2MiwgMTEzKQorICAgICAgICAgICAgICAgKyBnZXRGb3JtYXR0ZWRTdHJpbmcob3B0aW9uLmdldFJlcXVpcmVtZW50UnVsZXMoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgNjMsIDExMyk7CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBBZHZhbmNlZENtZExpbmVPcHRpb24pIHsKKyAgICAgICAgIGlmICgoKEFkdmFuY2VkQ21kTGluZU9wdGlvbikgb3B0aW9uKS5oYXNIYW5kbGVyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBoYW5kbGVySGVscCA9ICgoQWR2YW5jZWRDbWRMaW5lT3B0aW9uKSBvcHRpb24pLmdldEhhbmRsZXIoKQorICAgICAgICAgICAgICAgICAgLmdldEhlbHAob3B0aW9uKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVySGVscCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICBvcHRpb25Vc2FnZSArPSAiXG4iCisgICAgICAgICAgICAgICAgICAgICArIGdldEZvcm1hdHRlZFN0cmluZygiSGFuZGxlcjoiLCA2MiwgMTEzKQorICAgICAgICAgICAgICAgICAgICAgKyBnZXRGb3JtYXR0ZWRTdHJpbmcoaGFuZGxlckhlbHAsIDYzLCAxMTMpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpc0dyb3VwT3B0aW9uKG9wdGlvbikpIHsKKyAgICAgICAgIEdyb3VwQ21kTGluZU9wdGlvbiBncm91cE9wdGlvbiA9IGFzR3JvdXBPcHRpb24ob3B0aW9uKTsKKyAgICAgICAgIG9wdGlvblVzYWdlICs9ICJcbiI7CisgICAgICAgICBvcHRpb25Vc2FnZSArPSAiICAgU3ViT3B0aW9uczpcbiI7CisgICAgICAgICBvcHRpb25Vc2FnZSArPSAiICAgPiBSZXF1aXJlZDpcbiI7CisKKyAgICAgICAgIExpc3Q8Q21kTGluZU9wdGlvbj4gb3B0aW9uYWxPcHRpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICBmb3IgKEdyb3VwU3ViT3B0aW9uIHN1Yk9wdGlvbiA6IGdyb3VwT3B0aW9uLmdldFN1Yk9wdGlvbnMoKSkgeworICAgICAgICAgICAgaWYgKHN1Yk9wdGlvbi5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgICAgIG9wdGlvblVzYWdlICs9IGdldE9wdGlvbkhlbHAoc3ViT3B0aW9uLmdldE9wdGlvbigpLCAiICAgICAiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBvcHRpb25hbE9wdGlvbnMuYWRkKHN1Yk9wdGlvbi5nZXRPcHRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBvcHRpb25Vc2FnZSArPSAiICAgPiBPcHRpb25hbDpcbiI7CisgICAgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uYWxPcHRpb24gOiBvcHRpb25hbE9wdGlvbnMpIHsKKyAgICAgICAgICAgIG9wdGlvblVzYWdlICs9IGdldE9wdGlvbkhlbHAob3B0aW9uYWxPcHRpb24sICIgICAgICIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gb3B0aW9uVXNhZ2U7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rm9vdGVyKCkgeworICAgICAgcmV0dXJuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFN0cmluZyBwcmludE9wdGlvblZhbGlkYXRpb25FcnJvcnMoTGlzdDxSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRpb24gRmFpbHVyZXM6Iik7CisgICAgICBmb3IgKFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgICBzYi5hcHBlbmQoIiAtICIpLmFwcGVuZChyZXN1bHQuZ2V0TWVzc2FnZSgpKS5hcHBlbmQoIlxuIik7CisgICAgICB9CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIHByaW50UmVxdWlyZWRPcHRpb25zTWlzc2luZ0Vycm9yKAorICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IG1pc3NpbmdPcHRpb25zKSB7CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNaXNzaW5nIHJlcXVpcmVkIG9wdGlvbnM6XG4iKTsKKyAgICAgIGZvciAoQ21kTGluZU9wdGlvbiBvcHRpb24gOiBtaXNzaW5nT3B0aW9ucykgeworICAgICAgICAgc2IuYXBwZW5kKCIgLSAiKS5hcHBlbmQob3B0aW9uLnRvU3RyaW5nKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTdHJpbmcgcHJpbnRBY3Rpb25NZXNzYWdlcyhMaXN0PFN0cmluZz4gbWVzc2FnZXMpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgZm9yIChTdHJpbmcgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7CisgICAgICAgICBzYi5hcHBlbmQobWVzc2FnZSk7CisgICAgICB9CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9DbWRMaW5lSXRlcmFibGUuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9DbWRMaW5lSXRlcmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEwZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL0NtZExpbmVJdGVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvKioKKyAqIEFuIHtAbGluayBJdGVyYWJsZX0gd2hpY2ggYWxsb3dzIG11bHRpcGxlIGNvbmN1cnJlbnQgaXRlcmF0b3JzIHdoaWNoIGFmZmVjdAorICogZWFjaCBvdGhlciwgYWxzbyBhbGxvd3MgeW91IHRvIGluY3JlbWVudCBpdGVyYXRvcnMgaW5kZXggbWFudWFsbHkuIEFsbAorICogaXRlcmF0b3JzIGhhbmRsZSB0ZXJtaW5hdGlvbiBzYWZlbHkuIEhvd2V2ZXIsIHRoZSBjYXRjaCBiZWluZyB0aGF0IHlvdSBjYW4KKyAqIG9ubHkgaXRlcmF0ZSB0aHJvdWdoIHRoaXMge0BsaW5rIEl0ZXJhYmxlfSBvbmNlLCB0aGVuIHlvdSBtdXN0IGNyZWF0ZSBhIG5ldworICogb2JqZWN0IG9mIGl0IHRvIGl0ZXJhdGUgb3ZlciBpdCBhZ2Fpbi4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBDbWRMaW5lSXRlcmFibGU8VD4gaW1wbGVtZW50cyBJdGVyYWJsZTxUPiB7CisgICBwcml2YXRlIGludCBjdXJJbmRleDsKKyAgIHByaXZhdGUgTGlzdDxUPiBhcmdzOworCisgICBwdWJsaWMgQ21kTGluZUl0ZXJhYmxlKExpc3Q8VD4gYXJncykgeworICAgICAgVmFsaWRhdGUubm90TnVsbChhcmdzKTsKKworICAgICAgY3VySW5kZXggPSAtMTsKKyAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PFQ+IGdldEFyZ3MoKSB7CisgICAgICByZXR1cm4gYXJnczsKKyAgIH0KKworICAgcHVibGljIExpc3Q8VD4gZ2V0QXJnc0xlZnQoKSB7CisgICAgICByZXR1cm4gYXJncy5zdWJMaXN0KGN1ckluZGV4LCBhcmdzLnNpemUoKSk7CisgICB9CisKKyAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEluZGV4KCkgeworICAgICAgcmV0dXJuIGN1ckluZGV4OworICAgfQorCisgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRJbmRleCgpIHsKKyAgICAgIGlmIChjdXJJbmRleCA8IGFyZ3Muc2l6ZSgpKSB7CisgICAgICAgICBjdXJJbmRleCsrOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBkZXNjcmVtZW50SW5kZXgoKSB7CisgICAgICBpZiAoY3VySW5kZXggPiAwKSB7CisgICAgICAgICBjdXJJbmRleC0tOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgVCBpbmNyZW1lbnRBbmRHZXQoKSB7CisgICAgICBpbmNyZW1lbnRJbmRleCgpOworICAgICAgcmV0dXJuIGdldEN1cnJlbnRBcmcoKTsKKyAgIH0KKworICAgcHVibGljIFQgZ2V0QW5kSW5jcmVtZW50KCkgeworICAgICAgVCBuZXh0ID0gZ2V0Q3VycmVudEFyZygpOworICAgICAgaW5jcmVtZW50SW5kZXgoKTsKKyAgICAgIHJldHVybiBuZXh0OworICAgfQorCisgICBwdWJsaWMgaW50IG51bUFyZ3MoKSB7CisgICAgICByZXR1cm4gYXJncy5zaXplKCk7CisgICB9CisKKyAgIHB1YmxpYyBUIGdldEFyZyhpbnQgaW5kZXgpIHsKKyAgICAgIHJldHVybiBhcmdzLmdldChpbmRleCk7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICByZXR1cm4gY3VySW5kZXggKyAxIDwgYXJncy5zaXplKCk7CisgICB9CisKKyAgIHB1YmxpYyBUIGdldEN1cnJlbnRBcmcoKSB7CisgICAgICBpZiAoY3VySW5kZXggPT0gLTEpIHsKKyAgICAgICAgIHJldHVybiBpbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgIH0gZWxzZSBpZiAoY3VySW5kZXggPiAtMSAmJiBjdXJJbmRleCA8IGFyZ3Muc2l6ZSgpKSB7CisgICAgICAgICByZXR1cm4gYXJncy5nZXQoY3VySW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPFQ+KCkgeworCisgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIENtZExpbmVJdGVyYWJsZS50aGlzLmhhc05leHQoKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcHVibGljIFQgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigoY3VySW5kZXggKyAxKSArICIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgfQorCisgICAgICB9OworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL0NtZExpbmVVdGlscy5qYXZhIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL0NtZExpbmVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2ZGYxZDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3V0aWwvQ21kTGluZVV0aWxzLmphdmEKQEAgLTAsMCArMSwxMTI4IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWw7DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuVVJMOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQorLy9PT0RUIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7DQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5IYW5kbGVhYmxlQ21kTGluZU9wdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkhlbHBDbWRMaW5lT3B0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLlNpbXBsZUNtZExpbmVPcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5WYWxpZGF0YWJsZUNtZExpbmVPcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLlJlcXVpcmVtZW50UnVsZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuUmVxdWlyZW1lbnRSdWxlLlJlbGF0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNtZExpbmVPcHRpb25WYWxpZGF0b3I7DQorDQorLy9Hb29nbGUgaW1wb3J0cw0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOw0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7DQorDQorLyoqDQorICogQ29sbGVjdGlvbiBvZiBjb21tb24gaGVscGVyIG1ldGhvZHMuDQorICogDQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpDQorICovDQorcHVibGljIGNsYXNzIENtZExpbmVVdGlscyB7DQorDQorICAgcHJpdmF0ZSBDbWRMaW5lVXRpbHMoKSB7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIERldGVybWluZXMgd2hpY2ggb2YgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgYXJlIGVpdGhlciBhbHdheXMNCisgICAgKiByZXF1aXJlZCBhbmQgYXJlIHJlcXVpcmVkIGJlY2F1c2UgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3YXMNCisgICAgKiBzcGVjaWZpZWQuDQorICAgICogDQorICAgICogQHBhcmFtIGFjdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHdhcyBzcGVjaWZpZWQuDQorICAgICogQHBhcmFtIG9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgaW4gcXVlc3Rpb24gb2YgYmVpbmcgcmVxdWlyZWQgb3Igbm90Lg0KKyAgICAqIEByZXR1cm4gVGhlIHtAbGluayBTZXR9IG9mIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgd2hpY2ggYXJlIGVpdGhlciBhbHdheXMNCisgICAgKiAgICAgICAgIHJlcXVpcmVkIG9yIGFyZSByZXF1aXJlZCBiZWNhdXNlIHRoZSBnaXZlbiB7QGxpbmsgQ21kTGluZUFjdGlvbn0NCisgICAgKiAgICAgICAgIHdhcyBzcGVjaWZpZWQuDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBTZXQ8Q21kTGluZU9wdGlvbj4gZGV0ZXJtaW5lUmVxdWlyZWQoQ21kTGluZUFjdGlvbiBhY3Rpb24sDQorICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMpIHsNCisgICAgICByZXR1cm4gZGV0ZXJtaW5lUmVxdWlyZWQoYWN0aW9uLCBvcHRpb25zLCBmYWxzZSk7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIFNhbWUgYXMgbWV0aG9kIGFib3ZlIGJ1dCBvcHRpb25hbGx5IGFsbG93cyBhY3Rpb24gb3B0aW9ucyB0byBiZSBpZ25vcmVkLg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgU2V0PENtZExpbmVPcHRpb24+IGRldGVybWluZVJlcXVpcmVkKENtZExpbmVBY3Rpb24gYWN0aW9uLA0KKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zLCBib29sZWFuIGlnbm9yZUFjdGlvbk9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoYWN0aW9uKTsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbnMpOw0KKw0KKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiByZXF1aXJlZE9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoKTsNCisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmICghKGlnbm9yZUFjdGlvbk9wdGlvbiAmJiBpc0FjdGlvbk9wdGlvbihvcHRpb24pKQ0KKyAgICAgICAgICAgICAgICYmIGlzUmVxdWlyZWQoYWN0aW9uLCBvcHRpb24pKSB7DQorICAgICAgICAgICAgcmVxdWlyZWRPcHRpb25zLmFkZChvcHRpb24pOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHJlcXVpcmVkT3B0aW9uczsNCisgICB9DQorDQorICAgLyoqDQorICAgICogRGV0ZXJtaW5lcyB0aGUgZ2l2ZW4ge0BsaW5rIEdyb3VwQ21kTGluZU9wdGlvbn0ncyBzdWItb3B0aW9ucyB3aGljaA0KKyAgICAqIGFmZmVjdCB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVBY3Rpb259Lg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBhY3Rpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lQWN0aW9ufSBmb3Igd2hpY2ggZ2l2ZW4NCisgICAgKiAgICAgICAgICAge0BsaW5rIEdyb3VwQ21kTGluZU9wdGlvbn0ncyBzdWItb3B0aW9ucyB3aWxsIGJlIGRldGVybWluZWQNCisgICAgKiAgICAgICAgICAgcmVsZXZhbnQgb3Igbm90DQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIEdyb3VwQ21kTGluZU9wdGlvbn0gd2hvc2Ugc3ViLW9wdGlvbnMgYXJlIGluIHF1ZXN0aW9uDQorICAgICogICAgICAgICAgIG9mIGJlaW5nIHJlbGV2YW50IHRvIHRoZSBnaXZlbiB7QGxpbmsgQ21kTGluZUFjdGlvbn0NCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufSdzIHN1Yi1vcHRpb25zIHdobyBhcmUgcmVsZXZhbnQgdG8NCisgICAgKiAgICAgICAgIGdpdmVuIHtAbGluayBDbWRMaW5lQWN0aW9ufQ0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgU2V0PENtZExpbmVPcHRpb24+IGRldGVybWluZVJlbGV2YW50U3ViT3B0aW9ucygNCisgICAgICAgICBDbWRMaW5lQWN0aW9uIGFjdGlvbiwgR3JvdXBDbWRMaW5lT3B0aW9uIG9wdGlvbikgew0KKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiByZWxldmFudE9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoKTsNCisgICAgICBmb3IgKEdyb3VwU3ViT3B0aW9uIHN1Yk9wdGlvbiA6IG9wdGlvbi5nZXRTdWJPcHRpb25zKCkpIHsNCisgICAgICAgICBpZiAoc3ViT3B0aW9uLmdldE9wdGlvbigpLmdldFJlcXVpcmVtZW50UnVsZXMoKS5pc0VtcHR5KCkNCisgICAgICAgICAgICAgICB8fCBpc1JlcXVpcmVkKGFjdGlvbiwgc3ViT3B0aW9uLmdldE9wdGlvbigpKQ0KKyAgICAgICAgICAgICAgIHx8IGlzU3RyaWN0bHlPcHRpb25hbChhY3Rpb24sIHN1Yk9wdGlvbi5nZXRPcHRpb24oKSkpIHsNCisgICAgICAgICAgICByZWxldmFudE9wdGlvbnMuYWRkKHN1Yk9wdGlvbi5nZXRPcHRpb24oKSk7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcmVsZXZhbnRPcHRpb25zOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBEZXRlcm1pbmVzIHRoZSBzdWItb3B0aW9ucyBvZiBnaXZlbiB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufSB3aG8gYXJlDQorICAgICogYWx3YXlzIHJlcXVpcmVkLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBvcHRpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBHcm91cENtZExpbmVPcHRpb259IHdob3NlIHN1Yi1vcHRpb25zIGFyZSBjaGVjayB3aGVyZQ0KKyAgICAqICAgICAgICAgICB0aGV5IGFyZSByZXF1aXJlZA0KKyAgICAqIEByZXR1cm4gVGhlIHJlcXVpcmVkIHN1Yi1vcHRpb25zIG9mIGdpdmVuIHtAbGluayBHcm91cENtZExpbmVPcHRpb259DQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBTZXQ8Q21kTGluZU9wdGlvbj4gZGV0ZXJtaW5lUmVxdWlyZWRTdWJPcHRpb25zKA0KKyAgICAgICAgIEdyb3VwQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbik7DQorDQorICAgICAgU2V0PENtZExpbmVPcHRpb24+IHJlcXVpcmVkT3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgpOw0KKyAgICAgIGZvciAoR3JvdXBTdWJPcHRpb24gc3ViT3B0aW9uIDogb3B0aW9uLmdldFN1Yk9wdGlvbnMoKSkgew0KKyAgICAgICAgIGlmIChzdWJPcHRpb24uaXNSZXF1aXJlZCgpKSB7DQorICAgICAgICAgICAgcmVxdWlyZWRPcHRpb25zLmFkZChzdWJPcHRpb24uZ2V0T3B0aW9uKCkpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHJlcXVpcmVkT3B0aW9uczsNCisgICB9DQorDQorICAgLyoqDQorICAgICogRGV0ZXJtaW5lcyB0aGUgc3ViLW9wdGlvbnMgb2YgZ2l2ZW4ge0BsaW5rIEdyb3VwQ21kTGluZU9wdGlvbn0gd2hvIGFyZQ0KKyAgICAqIGVpdGhlciBhbHdheXMgcmVxdWlyZWQgZm9yIGJlY29tZSByZXF1cmllZCB3aGVuIGdpdmVuDQorICAgICoge0BsaW5rIENtZExpbmVBY3Rpb259IGlzIHNwZWNpZmllZC4NCisgICAgKiANCisgICAgKiBAcGFyYW0gYWN0aW9uDQorICAgICogICAgICAgICAgIFRoZSBzcGVjaWZpZWQge0BsaW5rIENtZExpbmVBY3Rpb259DQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIEdyb3VwQ21kTGluZU9wdGlvbn0gd2hvc2Ugc3ViLW9wdGlvbnMgYXJlIGNoZWNrZWQgaWYNCisgICAgKiAgICAgICAgICAgdGhleSBhcmUgcmVxdWlyZWQNCisgICAgKiBAcmV0dXJuIFRoZSBnaXZlbiB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufSdzIHJlcXVpcmVkIHN1Yi1vcHRpb25zDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBTZXQ8Q21kTGluZU9wdGlvbj4gZGV0ZXJtaW5lUmVxdWlyZWRTdWJPcHRpb25zKA0KKyAgICAgICAgIENtZExpbmVBY3Rpb24gYWN0aW9uLCBHcm91cENtZExpbmVPcHRpb24gb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChhY3Rpb24pOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uKTsNCisNCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRPcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KCk7DQorICAgICAgZm9yIChHcm91cFN1Yk9wdGlvbiBzdWJPcHRpb24gOiBvcHRpb24uZ2V0U3ViT3B0aW9ucygpKSB7DQorICAgICAgICAgaWYgKHN1Yk9wdGlvbi5pc1JlcXVpcmVkKCkNCisgICAgICAgICAgICAgICB8fCBpc1JlcXVpcmVkKGFjdGlvbiwgc3ViT3B0aW9uLmdldE9wdGlvbigpKSkgew0KKyAgICAgICAgICAgIHJlcXVpcmVkT3B0aW9ucy5hZGQoc3ViT3B0aW9uLmdldE9wdGlvbigpKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiByZXF1aXJlZE9wdGlvbnM7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZQ0KKyAgICAqIGdpdmVuIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3YXMgc3BlY2lmaWVkIG9yIGJlY2F1c2UgaXQgaXMgYWx3YXlzIHJlcXVpcmVkLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBhY3Rpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCB3YXMgc3BlY2lmaWVkLg0KKyAgICAqIEBwYXJhbSBvcHRpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpbiBxdWVzdGlvbiBvZiBiZWluZyByZXF1aXJlZCBvciBub3QuDQorICAgICogQHJldHVybiBUcnVlIGlzIG9wdGlvbiBpcyByZXF1aXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkKENtZExpbmVBY3Rpb24gYWN0aW9uLCBDbWRMaW5lT3B0aW9uIG9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uKTsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGFjdGlvbik7DQorDQorICAgICAgZm9yIChSZXF1aXJlbWVudFJ1bGUgcmVxdWlyZW1lbnRSdWxlIDogb3B0aW9uLmdldFJlcXVpcmVtZW50UnVsZXMoKSkgew0KKyAgICAgICAgIGlmIChyZXF1aXJlbWVudFJ1bGUuZ2V0UmVsYXRpb24oYWN0aW9uKSA9PSBSZWxhdGlvbi5SRVFVSVJFRCkgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIG9wdGlvbi5nZXRSZXF1aXJlbWVudFJ1bGVzKCkuaXNFbXB0eSgpICYmIG9wdGlvbi5pc1JlcXVpcmVkKCk7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIERldGVybWluZXMgd2hpY2ggb2YgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgYXJlIG9wdGlvbmFsIGJlY2F1c2UNCisgICAgKiB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVBY3Rpb259IHdhcyBzcGVjaWZpZWQuDQorICAgICogDQorICAgICogQHBhcmFtIGFjdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHdhcyBzcGVjaWZpZWQuDQorICAgICogQHBhcmFtIG9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpbiBxdWVzdGlvbiBvZiBiZWluZyBvcHRpb25hbCBvciBub3QuDQorICAgICogQHJldHVybiBUaGUge0BsaW5rIFNldH0gb2Yge0BsaW5rIENtZExpbmVPcHRpb259cyB3aGVyZSBhcmUgb3B0aW9uYWwNCisgICAgKiAgICAgICAgIGJlY2F1c2UgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3YXMgc3BlY2lmaWVkLg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgU2V0PENtZExpbmVPcHRpb24+IGRldGVybWluZU9wdGlvbmFsKENtZExpbmVBY3Rpb24gYWN0aW9uLA0KKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChhY3Rpb24pOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9ucyk7DQorDQorICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbmFsT3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgpOw0KKyAgICAgIGZvciAoQ21kTGluZU9wdGlvbiBvcHRpb24gOiBvcHRpb25zKSB7DQorICAgICAgICAgaWYgKGlzT3B0aW9uYWwoYWN0aW9uLCBvcHRpb24pKSB7DQorICAgICAgICAgICAgb3B0aW9uYWxPcHRpb25zLmFkZChvcHRpb24pOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIG9wdGlvbmFsT3B0aW9uczsNCisgICB9DQorDQorICAgLyoqDQorICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVPcHRpb259IGlzIG9wdGlvbmFsIGVpdGhlciBiZWNhdXNlDQorICAgICogaXQgaXMgYWx3YXlzIG9wdGlvbmFsIG9yIGJlY2F1c2UgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3YXMNCisgICAgKiBzcGVjaWZpZWQuDQorICAgICogDQorICAgICogQHBhcmFtIGFjdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHdhcyBzcGVjaWZpZWQuDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IGluIHF1ZXN0aW9uIG9mIGJlaW5nIG9wdGlvbmFsIG9yIG5vdC4NCisgICAgKiBAcmV0dXJuIFRydWUgaXMgb3B0aW9uIGlzIG9wdGlvbmFsLCBmYWxzZSBvdGhlcndpc2UuDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3B0aW9uYWwoQ21kTGluZUFjdGlvbiBhY3Rpb24sIENtZExpbmVPcHRpb24gb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChhY3Rpb24pOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uKTsNCisNCisgICAgICBpZiAoaXNQZXJmb3JtQW5kUXVpdE9wdGlvbihvcHRpb24pKSB7DQorICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisNCisgICAgICBmb3IgKFJlcXVpcmVtZW50UnVsZSByZXF1aXJlbWVudFJ1bGUgOiBvcHRpb24uZ2V0UmVxdWlyZW1lbnRSdWxlcygpKSB7DQorICAgICAgICAgaWYgKHJlcXVpcmVtZW50UnVsZS5nZXRSZWxhdGlvbihhY3Rpb24pID09IFJlbGF0aW9uLk9QVElPTkFMKSB7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gb3B0aW9uLmdldFJlcXVpcmVtZW50UnVsZXMoKS5pc0VtcHR5KCkgJiYgIW9wdGlvbi5pc1JlcXVpcmVkKCk7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyBvcHRpb25hbCBPTkxZIGJlY2F1c2UgdGhlDQorICAgICogZ2l2ZW4ge0BsaW5rIENtZExpbmVBY3Rpb259IHdhcyBzcGVjaWZpZWQuDQorICAgICogDQorICAgICogQHBhcmFtIGFjdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHdhcyBzcGVjaWZpZWQuDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IGluIHF1ZXN0aW9uIG9mIGJlaW5nIG9wdGlvbmFsIG9yIG5vdC4NCisgICAgKiBAcmV0dXJuIFRydWUgaXMgb3B0aW9uIGlzIG9wdGlvbmFsLCBmYWxzZSBvdGhlcndpc2UuDQorICAgICovICAgDQorICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RyaWN0bHlPcHRpb25hbChDbWRMaW5lQWN0aW9uIGFjdGlvbiwgQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGFjdGlvbik7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKw0KKyAgICAgIGlmIChpc1BlcmZvcm1BbmRRdWl0T3B0aW9uKG9wdGlvbikpIHsNCisgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAoUmVxdWlyZW1lbnRSdWxlIHJlcXVpcmVtZW50UnVsZSA6IG9wdGlvbi5nZXRSZXF1aXJlbWVudFJ1bGVzKCkpIHsNCisgICAgICAgICBpZiAocmVxdWlyZW1lbnRSdWxlLmdldFJlbGF0aW9uKGFjdGlvbikgPT0gUmVsYXRpb24uT1BUSU9OQUwpIHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICB9DQorDQorICAgLyoqDQorICAgICogR2V0IHtAbGluayBDbWRMaW5lT3B0aW9ufXMgd2hpY2ggYXJlIGFsd2F5cyByZXF1aXJlZCByZWdhcmRsZXNzIG9mDQorICAgICoge0BsaW5rIENtZExpbmVBY3Rpb259IHNwZWNpZmllZC4gTk9URTogSWdub3JlcyB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIG9mDQorICAgICogdHlwZSB7QGxpbmsgQWN0aW9uQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufVMgdG8gY2hlY2sgZm9yIHJlcXVpcmVkDQorICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9ufXMNCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIHdoaWNoIHdpbGwgYmUgY2hlY2sgZm9yIGFsd2F5cyByZXF1aXJlZA0KKyAgICAqICAgICAgICAge0BsaW5rIENtZExpbmVPcHRpb259cw0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgU2V0PENtZExpbmVPcHRpb24+IGdldFJlcXVpcmVkT3B0aW9ucygNCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucykgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9ucyk7DQorDQorICAgICAgcmV0dXJuIGdldFJlcXVpcmVkT3B0aW9ucyhvcHRpb25zLCB0cnVlKTsNCisgICB9DQorDQorICAgLyoqDQorICAgICogR2V0IHtAbGluayBDbWRMaW5lT3B0aW9ufXMgd2hpY2ggYXJlIGFsd2F5cyByZXF1aXJlZCByZWdhcmRsZXNzIG9mDQorICAgICoge0BsaW5rIENtZExpbmVBY3Rpb259IHNwZWNpZmllZC4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9ucw0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259UyB0byBjaGVjayBmb3IgcmVxdWlyZWQNCisgICAgKiAgICAgICAgICAge0BsaW5rIENtZExpbmVPcHRpb259cw0KKyAgICAqIEBwYXJhbSBpZ25vcmVBY3Rpb25PcHRpb24NCisgICAgKiAgICAgICAgICAgV2hlcmUgb3Igbm90IHRvIGlnbm9yZSB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIG9mIHR5cGUNCisgICAgKiAgICAgICAgICAge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBUaGUge0BsaW5rIENtZExpbmVPcHRpb259cyB3aGljaCB3aWxsIGJlIGNoZWNrIGZvciBhbHdheXMgcmVxdWlyZWQNCisgICAgKiAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9ufXMNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIFNldDxDbWRMaW5lT3B0aW9uPiBnZXRSZXF1aXJlZE9wdGlvbnMoDQorICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMsIGJvb2xlYW4gaWdub3JlQWN0aW9uT3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRPcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KCk7DQorICAgICAgZm9yIChDbWRMaW5lT3B0aW9uIG9wdGlvbiA6IG9wdGlvbnMpIHsNCisgICAgICAgICBpZiAob3B0aW9uLmlzUmVxdWlyZWQoKQ0KKyAgICAgICAgICAgICAgICYmICEoaXNBY3Rpb25PcHRpb24ob3B0aW9uKSAmJiBpZ25vcmVBY3Rpb25PcHRpb24pKSB7DQorICAgICAgICAgICAgcmVxdWlyZWRPcHRpb25zLmFkZChvcHRpb24pOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHJlcXVpcmVkT3B0aW9uczsNCisgICB9DQorDQorICAgLyoqDQorICAgICogU29ydHMge0BsaW5rIENtZExpbmVPcHRpb259cyBieSByZXF1aXJlbWVudCBsZXZlbHMuIHtAbGluayBDbWRMaW5lT3B0aW9ufXMNCisgICAgKiB3aGljaCBhcmUgYWx3YXlzIHJlcXVpcmVkIGhhdmUgaGlnaGVzdCBzb3J0IHNjb3JlLCBmb2xsb3dlZCBieQ0KKyAgICAqIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgd2hpY2ggaGF2ZSB7QGxpbmsgUmVxdWlyZW1lbnRSdWxlfXMsIGZvbGxvd2VkIGJ5DQorICAgICogYWxsIG90aGVycy4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9ucw0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIFNldH0gb2Yge0BsaW5rIENtZExpbmVPcHRpb259cyB0byBzb3J0Lg0KKyAgICAqIEByZXR1cm4gVGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgc29ydGVkIGJ5IHJlcXVpcmVtZW50Lg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbWRMaW5lT3B0aW9uPiBzb3J0T3B0aW9uc0J5UmVxdWlyZWRTdGF0dXMoDQorICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMpIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbnMpOw0KKw0KKyAgICAgIExpc3Q8Q21kTGluZU9wdGlvbj4gb3B0aW9uc0xpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3Qob3B0aW9ucyk7DQorICAgICAgQ29sbGVjdGlvbnMuc29ydChvcHRpb25zTGlzdCwgbmV3IENvbXBhcmF0b3I8Q21kTGluZU9wdGlvbj4oKSB7DQorICAgICAgICAgcHVibGljIGludCBjb21wYXJlKENtZExpbmVPcHRpb24gb3B0aW9uMSwgQ21kTGluZU9wdGlvbiBvcHRpb24yKSB7DQorICAgICAgICAgICAgaW50IHRoaXNTY29yZSA9IChvcHRpb24xLmlzUmVxdWlyZWQoKSA/IDIgOiAwKQ0KKyAgICAgICAgICAgICAgICAgICsgKCFvcHRpb24xLmdldFJlcXVpcmVtZW50UnVsZXMoKS5pc0VtcHR5KCkgPyAxIDogMCk7DQorICAgICAgICAgICAgaW50IGNvbXBhcmVTY29yZSA9IChvcHRpb24yLmlzUmVxdWlyZWQoKSA/IDIgOiAwKQ0KKyAgICAgICAgICAgICAgICAgICsgKCFvcHRpb24yLmdldFJlcXVpcmVtZW50UnVsZXMoKS5pc0VtcHR5KCkgPyAxIDogMCk7DQorICAgICAgICAgICAgaWYgKHRoaXNTY29yZSA9PSBjb21wYXJlU2NvcmUpIHsNCisgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uMi5nZXRMb25nT3B0aW9uKCkNCisgICAgICAgICAgICAgICAgICAgICAuY29tcGFyZVRvKG9wdGlvbjEuZ2V0TG9uZ09wdGlvbigpKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih0aGlzU2NvcmUpLmNvbXBhcmVUbyhjb21wYXJlU2NvcmUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfSk7DQorICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShvcHRpb25zTGlzdCk7DQorICAgICAgcmV0dXJuIG9wdGlvbnNMaXN0Ow0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBTb3J0cyB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIGJ5IHRoZXJlIGxvbmcgbmFtZS4NCisgICAgKg0KKyAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIHRvIGJlIHNvcnRlZA0KKyAgICAqIEByZXR1cm4gU29ydGVkIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBMaXN0PENtZExpbmVPcHRpb24+IHNvcnRPcHRpb25zKFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7DQorICAgICAgTGlzdDxDbWRMaW5lT3B0aW9uPiBvcHRpb25MaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KG9wdGlvbnMpOw0KKyAgICAgIENvbGxlY3Rpb25zLnNvcnQob3B0aW9uTGlzdCwgbmV3IENvbXBhcmF0b3I8Q21kTGluZU9wdGlvbj4oKSB7DQorICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgcHVibGljIGludCBjb21wYXJlKENtZExpbmVPcHRpb24gbzEsIENtZExpbmVPcHRpb24gbzIpIHsNCisgICAgICAgICAgICByZXR1cm4gbzEuZ2V0TG9uZ09wdGlvbigpLmNvbXBhcmVUbyhvMi5nZXRMb25nT3B0aW9uKCkpOw0KKyAgICAgICAgIH0NCisgICAgICB9KTsNCisgICAgICByZXR1cm4gb3B0aW9uTGlzdDsNCisgICB9DQorICAgDQorICAgLyoqDQorICAgICogU29ydHMge0BsaW5rIENtZExpbmVBY3Rpb259cyBieSB0aGVyZSBuYW1lLg0KKyAgICAqDQorICAgICogQHBhcmFtIGFjdGlvbnMgVGhlIHtAbGluayBDbWRMaW5lQWN0aW9ufXMgdG8gYmUgc29ydGVkDQorICAgICogQHJldHVybiBTb3J0ZWQge0BsaW5rIExpc3R9IG9mIHtAbGluayBDbWRMaW5lQWN0aW9ufXMNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIExpc3Q8Q21kTGluZUFjdGlvbj4gc29ydEFjdGlvbnMoU2V0PENtZExpbmVBY3Rpb24+IGFjdGlvbnMpIHsNCisgICAgICBMaXN0PENtZExpbmVBY3Rpb24+IGFjdGlvbnNMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KGFjdGlvbnMpOw0KKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWN0aW9uc0xpc3QsIG5ldyBDb21wYXJhdG9yPENtZExpbmVBY3Rpb24+KCkgew0KKyAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShDbWRMaW5lQWN0aW9uIGExLCBDbWRMaW5lQWN0aW9uIGEyKSB7DQorICAgICAgICAgICAgcmV0dXJuIGExLmdldE5hbWUoKS5jb21wYXJlVG8oYTIuZ2V0TmFtZSgpKTsNCisgICAgICAgICB9DQorICAgICAgfSk7DQorICAgICAgcmV0dXJuIGFjdGlvbnNMaXN0Ow0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kcyB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hvc2Ugc2hvcnQgbmFtZSBvciBsb25nIG5hbWUgZXF1YWxzIGdpdmVuDQorICAgICogb3B0aW9uIG5hbWUuDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbk5hbWUNCisgICAgKiAgICAgICAgICAgVGhlIHNob3J0IG9yIGxvbmcgbmFtZSBvZiB0aGUge0BsaW5rIENtZExpbmVPcHRpb259IHRvIGZpbmQNCisgICAgKiBAcGFyYW0gb3B0aW9ucw0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259cyB0byBzZWFyY2ggaW4NCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gZm91bmQgb3IgbnVsbCBpZiBub3QgZm91bmQuDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBDbWRMaW5lT3B0aW9uIGdldE9wdGlvbkJ5TmFtZShTdHJpbmcgb3B0aW9uTmFtZSwNCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucykgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uTmFtZSk7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmIChvcHRpb24uZ2V0TG9uZ09wdGlvbigpLmVxdWFscyhvcHRpb25OYW1lKQ0KKyAgICAgICAgICAgICAgIHx8IG9wdGlvbi5nZXRTaG9ydE9wdGlvbigpLmVxdWFscyhvcHRpb25OYW1lKSkgew0KKyAgICAgICAgICAgIHJldHVybiBvcHRpb247DQorICAgICAgICAgfSBlbHNlIGlmIChpc0dyb3VwT3B0aW9uKG9wdGlvbikpIHsNCisgICAgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gc3ViT3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgpOyANCisgICAgICAgICAgICBmb3IgKEdyb3VwU3ViT3B0aW9uIHN1Yk9wdGlvbiA6IGFzR3JvdXBPcHRpb24ob3B0aW9uKS5nZXRTdWJPcHRpb25zKCkpIHsNCisgICAgICAgICAgICAgICBzdWJPcHRpb25zLmFkZChzdWJPcHRpb24uZ2V0T3B0aW9uKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDbWRMaW5lT3B0aW9uIGZvdW5kT3B0aW9uID0gZ2V0T3B0aW9uQnlOYW1lKG9wdGlvbk5hbWUsIHN1Yk9wdGlvbnMpOw0KKyAgICAgICAgICAgIGlmIChmb3VuZE9wdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kT3B0aW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kcyB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSB3aG9zZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0ncyBzaG9ydA0KKyAgICAqIG5hbWUgb3IgbG9uZyBuYW1lIGVxdWFscyBnaXZlbiBvcHRpb24gbmFtZS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uTmFtZQ0KKyAgICAqICAgICAgICAgICBUaGUgc2hvcnQgb3IgbG9uZyBuYW1lIG9mIHRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSdzDQorICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9ufSB0byBmaW5kDQorICAgICogQHBhcmFtIG9wdGlvbkluc3RzDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkludGFuY2V9cyB0byBzZWFyY2ggaW4NCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSBmb3VuZCBvciBudWxsIGlmIG5vdCBmb3VuZC4NCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIENtZExpbmVPcHRpb25JbnN0YW5jZSBnZXRPcHRpb25JbnN0YW5jZUJ5TmFtZSgNCisgICAgICAgICBTdHJpbmcgb3B0aW9uTmFtZSwgU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gb3B0aW9uSW5zdHMpIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbk5hbWUpOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uSW5zdHMpOw0KKw0KKyAgICAgIGZvciAoQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3QgOiBvcHRpb25JbnN0cykNCisgICAgICAgICBpZiAob3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRMb25nT3B0aW9uKCkuZXF1YWxzKG9wdGlvbk5hbWUpDQorICAgICAgICAgICAgICAgfHwgb3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRTaG9ydE9wdGlvbigpLmVxdWFscyhvcHRpb25OYW1lKSkNCisgICAgICAgICAgICByZXR1cm4gb3B0aW9uSW5zdDsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICB9DQorDQorICAgLyoqDQorICAgICogQ2hlY2tzIGlmIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyBhIHN1Yi1vcHRpb24gb2Ygb3RoZXIgZ2l2ZW4NCisgICAgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hpY2ggaXMgYmVpbmcgY2hlY2tlZCBpZiB0aGUgb3RoZXIgZ2l2ZW4NCisgICAgKiAgICAgICAgICAge0BsaW5rIENtZExpbmVPcHRpb259IGlzIG9uZSBvZiBpdHMgc3ViLW9wdGlvbnMNCisgICAgKiBAcGFyYW0gc3ViT3B0aW9uDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gd2hpY2ggaXMgYmVpbmcgY2hlY2sgaWYgaXQgaXMgYQ0KKyAgICAqICAgICAgICAgICBzdWItb3B0aW9uIG9mIHRoZSBvdGhlciBnaXZlbiB7QGxpbmsgQ21kTGluZU9wdGlvbn0NCisgICAgKiBAcmV0dXJuIFRydWUgaWYgc3ViT3B0aW9uIGlzIGEgc3ViLW9wdGlvbiBvZiBvcHRpb24NCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdWJPcHRpb24oQ21kTGluZU9wdGlvbiBvcHRpb24sDQorICAgICAgICAgQ21kTGluZU9wdGlvbiBzdWJPcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbik7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChzdWJPcHRpb24pOw0KKw0KKyAgICAgIGlmIChpc0dyb3VwT3B0aW9uKG9wdGlvbikpIHsNCisgICAgICAgICBmb3IgKEdyb3VwU3ViT3B0aW9uIGN1clN1Yk9wdGlvbiA6IGFzR3JvdXBPcHRpb24ob3B0aW9uKQ0KKyAgICAgICAgICAgICAgIC5nZXRTdWJPcHRpb25zKCkpIHsNCisgICAgICAgICAgICBpZiAoY3VyU3ViT3B0aW9uLmdldE9wdGlvbigpLmVxdWFscyhzdWJPcHRpb24pKSB7DQorICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kcyBhbGwgdGhlIHBlcmZvcm0tYW5kLXF1aXQgdHlwZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfXMgZnJvbQ0KKyAgICAqIHRoZSBnaXZlbiB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfXMuDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBTZXR9IG9mIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdobyB3aWxsIGJlDQorICAgICogICAgICAgICAgIGNoZWNrIGZvciBwZXJmb3JtLWFuZC1xdWl0IHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9cw0KKyAgICAqIEByZXR1cm4gVGhlIHBlcmZvcm0tYW5kLXF1aXQge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX1zIGZvdW5kDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBmaW5kUGVyZm9ybUFuZFF1aXRPcHRpb25zKA0KKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IG9wdGlvbnMpIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbnMpOw0KKw0KKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IHBlcmZvcm1BbmRRdWl0T3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgpOw0KKyAgICAgIGZvciAoQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbiA6IG9wdGlvbnMpIHsNCisgICAgICAgICBpZiAoaXNQZXJmb3JtQW5kUXVpdE9wdGlvbihvcHRpb24uZ2V0T3B0aW9uKCkpKSB7DQorICAgICAgICAgICAgcGVyZm9ybUFuZFF1aXRPcHRpb25zLmFkZChvcHRpb24pOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHBlcmZvcm1BbmRRdWl0T3B0aW9uczsNCisgICB9DQorDQorICAgLyoqDQorICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSBwZXJmb3JtLWFuZC1xdWl0IHR5cGUNCisgICAgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IGJlaW5nIGNoZWNrZWQgaWYgaXQgaXMNCisgICAgKiAgICAgICAgICAgcGVyZm9ybS1hbmQtcXVpdCB0eXBlLg0KKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSBwZXJmb3JtLWFuZC1xdWl0IHR5cGUsIGZhbHNlDQorICAgICogICAgICAgICBvdGhlcndpc2UuDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGVyZm9ybUFuZFF1aXRPcHRpb24oQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbik7DQorDQorICAgICAgaWYgKGlzSGVscE9wdGlvbihvcHRpb24pIHx8IGlzUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKG9wdGlvbikpIHsNCisgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9IGVsc2UgaWYgKGlzQWR2YW5jZWRPcHRpb24ob3B0aW9uKSkgew0KKyAgICAgICAgIHJldHVybiBhc0FkdmFuY2VkT3B0aW9uKG9wdGlvbikuaXNQZXJmb3JtQW5kUXVpdCgpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgLyoqDQorICAgICogRmluZHMgdGhlIGZpcnN0IHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdob3NlIHtAbGluayBDbWRMaW5lT3B0aW9ufQ0KKyAgICAqIGlzIHRoZSBnaXZlbiB7QGxpbmsgQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IHRvIGZpbmQuDQorICAgICogQHBhcmFtIHNwZWNpZmllZE9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdob3NlIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcw0KKyAgICAqICAgICAgICAgICB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBUaGUgZmlyc3Qge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0gd2hvc2UNCisgICAgKiAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVPcHRpb259LCBvciBudWxsDQorICAgICogICAgICAgICBpZiBub3QgZm91bmQNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIENtZExpbmVPcHRpb25JbnN0YW5jZSBmaW5kU3BlY2lmaWVkT3B0aW9uKA0KKyAgICAgICAgIENtZExpbmVPcHRpb24gb3B0aW9uLCBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBzcGVjaWZpZWRPcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoc3BlY2lmaWVkT3B0aW9ucyk7DQorDQorICAgICAgZm9yIChDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugc3BlY2lmaWVkT3B0aW9uIDogc3BlY2lmaWVkT3B0aW9ucykgew0KKyAgICAgICAgIGlmIChzcGVjaWZpZWRPcHRpb24uZ2V0T3B0aW9uKCkuZXF1YWxzKG9wdGlvbikpIHsNCisgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWVkT3B0aW9uOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIEZpbmRzIHRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfXMgd2hvc2Uge0BsaW5rIENtZExpbmVPcHRpb259IGlzDQorICAgICogdGhlIGdpdmVuIHtAbGluayBDbWRMaW5lT3B0aW9ufS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gZmluZC4NCisgICAgKiBAcGFyYW0gc3BlY2lmaWVkT3B0aW9ucw0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0gd2hvc2Uge0BsaW5rIENtZExpbmVPcHRpb259IGlzDQorICAgICogICAgICAgICAgIHRoZSBnaXZlbiB7QGxpbmsgQ21kTGluZU9wdGlvbn0NCisgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfXMgd2hvc2Uge0BsaW5rIENtZExpbmVPcHRpb259IGlzDQorICAgICogICAgICAgICB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVPcHRpb259DQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBmaW5kQWxsT2ZTcGVjaWZpZWRPcHRpb24oDQorICAgICAgICAgQ21kTGluZU9wdGlvbiBvcHRpb24sIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IHNwZWNpZmllZE9wdGlvbnMpIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbik7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChzcGVjaWZpZWRPcHRpb25zKTsNCisNCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBvcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KCk7DQorICAgICAgZm9yIChDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugc3BlY2lmaWVkT3B0aW9uIDogc3BlY2lmaWVkT3B0aW9ucykgew0KKyAgICAgICAgIGlmIChzcGVjaWZpZWRPcHRpb24uZ2V0T3B0aW9uKCkuZXF1YWxzKG9wdGlvbikpIHsNCisgICAgICAgICAgICBvcHRpb25zLmFkZChzcGVjaWZpZWRPcHRpb24pOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIG9wdGlvbnM7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIENoZWNrcyBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSB7QGxpbmsgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9ufS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaW4gcXVlc3Rpb24NCisgICAgKiBAcmV0dXJuIFRydWUgaXMge0BsaW5rIENtZExpbmVPcHRpb259IGlzIGENCisgICAgKiAgICAgICAgIHtAbGluayBQcmludFN1cHBvcnRlZEFjdGlvbnNPcHRpb259LCBmYWxzZSBvdGhlcndpc2UNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmludFN1cHBvcnRlZEFjdGlvbnNPcHRpb24oQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbik7DQorDQorICAgICAgcmV0dXJuIG9wdGlvbiBpbnN0YW5jZW9mIFByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb247DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIEZpbmRzIHtAbGluayBDbWRMaW5lT3B0aW9ufSBvZiB0eXBlDQorICAgICoge0BsaW5rIFByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb259Lg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBvcHRpb25zDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gZmluZCBhDQorICAgICogICAgICAgICAgIHtAbGluayBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9ufSBpbg0KKyAgICAqIEByZXR1cm4gVGhlIGZvdW5kIHtAbGluayBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9ufSwgb3IgbnVsbCBpZg0KKyAgICAqICAgICAgICAgbm90IGZvdW5kLg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbiBmaW5kUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKA0KKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmIChpc1ByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbihvcHRpb24pKSB7DQorICAgICAgICAgICAgcmV0dXJuIChQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uKSBvcHRpb247DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbnVsbDsNCisgICB9DQorDQorICAgLyoqDQorICAgICogRmluZHMge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0gd2hvc2Uge0BsaW5rIENtZExpbmVPcHRpb259IG9mIHR5cGUNCisgICAgKiB7QGxpbmsgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBTZXR9IG9mIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHRvIGZpbmQgdGhlDQorICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdob3NlIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyBvZg0KKyAgICAqICAgICAgICAgICB0eXBlIHtAbGluayBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9ufSBpbg0KKyAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQorICAgICogICAgICAgICAgICBJZiBtb3JlIHRoYW4gb25lIHByaW50IHN1cHBvcnRlZCBhY3Rpb25zIG9wdGlvbiBpcyBzcGVjaWZpZWQNCisgICAgKiBAcmV0dXJuIFRoZSBmb3VuZCB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSB3aG9zZQ0KKyAgICAqICAgICAgICAge0BsaW5rIENtZExpbmVPcHRpb259IGlzIG9mIHR5cGUNCisgICAgKiAgICAgICAgIHtAbGluayBQcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9ufSwgb3IgbnVsbCBpZiBub3QgZm91bmQuDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgZmluZFNwZWNpZmllZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbigNCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBvcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugc3BlY2lmaWVkUHNhID0gbnVsbDsNCisgICAgICBmb3IgKENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb24gOiBvcHRpb25zKSB7DQorICAgICAgICAgaWYgKGlzUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKG9wdGlvbi5nZXRPcHRpb24oKSkpIHsNCisgICAgICAgICAgICBpZiAoc3BlY2lmaWVkUHNhICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICJPbmx5IG9uIHByaW50IHN1cHBvcnRlZCBhY3Rpb25zIG9wdGlvbiBjYW4gYmUgc3BlY2lmaWVkISIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzcGVjaWZpZWRQc2EgPSBvcHRpb247DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gc3BlY2lmaWVkUHNhOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBDaGVja3MgaWYge0BsaW5rIENtZExpbmVPcHRpb259IGlzIGEge0BsaW5rIEFkdmFuY2VkQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IGNoZWNrZWQgaWYgaXQgaXMgYQ0KKyAgICAqICAgICAgICAgICB7QGxpbmsgQWR2YW5jZWRDbWRMaW5lT3B0aW9ufQ0KKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSB7QGxpbmsgQWR2YW5jZWRDbWRMaW5lT3B0aW9ufSwNCisgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQ0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FkdmFuY2VkT3B0aW9uKENtZExpbmVPcHRpb24gb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKw0KKyAgICAgIHJldHVybiBvcHRpb24gaW5zdGFuY2VvZiBBZHZhbmNlZENtZExpbmVPcHRpb247DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIENhc3RzIHRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gYSB7QGxpbmsgQWR2YW5jZWRDbWRMaW5lT3B0aW9ufS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gY2FzdCBhcyBhDQorICAgICogICAgICAgICAgIHtAbGluayBBZHZhbmNlZENtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBUaGUgY2FzdGVkIHtAbGluayBDbWRMaW5lT3B0aW9ufQ0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIGFzQWR2YW5jZWRPcHRpb24oQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5pc1RydWUoaXNBZHZhbmNlZE9wdGlvbihvcHRpb24pKTsNCisNCisgICAgICByZXR1cm4gKEFkdmFuY2VkQ21kTGluZU9wdGlvbikgb3B0aW9uOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBDaGVja3MgaWYge0BsaW5rIENtZExpbmVPcHRpb259IGlzIGEge0BsaW5rIFNpbXBsZUNtZExpbmVPcHRpb259Lg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBvcHRpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufSBjaGVja2VkIGlmIGl0IGlzIGENCisgICAgKiAgICAgICAgICAge0BsaW5rIFNpbXBsZUNtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBUcnVlIGlmIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyBhIHtAbGluayBTaW1wbGVDbWRMaW5lT3B0aW9ufSwNCisgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQ0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NpbXBsZU9wdGlvbihDbWRMaW5lT3B0aW9uIG9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uKTsNCisNCisgICAgICByZXR1cm4gb3B0aW9uIGluc3RhbmNlb2YgU2ltcGxlQ21kTGluZU9wdGlvbjsNCisgICB9DQorDQorICAgLyoqDQorICAgICogQ2FzdHMgdGhlIHtAbGluayBDbWRMaW5lT3B0aW9ufSB0byBhIHtAbGluayBTaW1wbGVDbWRMaW5lT3B0aW9ufS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gY2FzdCBhcyBhDQorICAgICogICAgICAgICAgIHtAbGluayBTaW1wbGVDbWRMaW5lT3B0aW9ufQ0KKyAgICAqIEByZXR1cm4gVGhlIGNhc3RlZCB7QGxpbmsgQ21kTGluZU9wdGlvbn0NCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIFNpbXBsZUNtZExpbmVPcHRpb24gYXNTaW1wbGVPcHRpb24oQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5pc1RydWUoaXNTaW1wbGVPcHRpb24ob3B0aW9uKSk7DQorDQorICAgICAgcmV0dXJuIChTaW1wbGVDbWRMaW5lT3B0aW9uKSBvcHRpb247DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIENoZWNrcyBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSB7QGxpbmsgQWN0aW9uQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICB7QGxpbmsgQ21kTGluZU9wdGlvbn0gY2hlY2sgaWYgYSB7QGxpbmsgQWN0aW9uQ21kTGluZU9wdGlvbn0NCisgICAgKiBAcmV0dXJuIFRydWUgaWYge0BsaW5rIENtZExpbmVPcHRpb259IGlzIGEge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259LA0KKyAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aW9uT3B0aW9uKENtZExpbmVPcHRpb24gb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKw0KKyAgICAgIHJldHVybiBvcHRpb24gaW5zdGFuY2VvZiBBY3Rpb25DbWRMaW5lT3B0aW9uOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kIHtAbGluayBBY3Rpb25DbWRMaW5lT3B0aW9ufSBpbiB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBvcHRpb25zDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gc2VhcmNoIHRocm91Z2ggZm9yIGENCisgICAgKiAgICAgICAgICAge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBUaGUgZm91bmQge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259LCBvciBudWxsIGlmIG5vdCBmb3VuZA0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uQ21kTGluZU9wdGlvbiBmaW5kRmlyc3RBY3Rpb25PcHRpb24oDQorICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMpIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbnMpOw0KKw0KKyAgICAgIGZvciAoQ21kTGluZU9wdGlvbiBvcHRpb24gOiBvcHRpb25zKSB7DQorICAgICAgICAgaWYgKGlzQWN0aW9uT3B0aW9uKG9wdGlvbikpIHsNCisgICAgICAgICAgICByZXR1cm4gKEFjdGlvbkNtZExpbmVPcHRpb24pIG9wdGlvbjsNCisgICAgICAgICB9IGVsc2UgaWYgKGlzR3JvdXBPcHRpb24ob3B0aW9uKSkgew0KKyAgICAgICAgICAgIEdyb3VwQ21kTGluZU9wdGlvbiBncm91cE9wdGlvbiA9IChHcm91cENtZExpbmVPcHRpb24pIG9wdGlvbjsNCisgICAgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gc3ViT3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgpOw0KKyAgICAgICAgICAgIGZvciAoR3JvdXBTdWJPcHRpb24gc3ViT3B0aW9uIDogZ3JvdXBPcHRpb24uZ2V0U3ViT3B0aW9ucygpKSB7DQorICAgICAgICAgICAgICAgc3ViT3B0aW9ucy5hZGQoc3ViT3B0aW9uLmdldE9wdGlvbigpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQWN0aW9uQ21kTGluZU9wdGlvbiBmb3VuZE9wdGlvbiA9IGZpbmRGaXJzdEFjdGlvbk9wdGlvbihzdWJPcHRpb25zKTsNCisgICAgICAgICAgICBpZiAoZm91bmRPcHRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgIHJldHVybiBmb3VuZE9wdGlvbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbnVsbDsNCisgICB9DQorDQorICAgLyoqDQorICAgICogRmluZHMgYWxsIHtAbGluayBDbWRMaW5lT3B0aW9ufXMgdGhhdCBhcmUge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259cy4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9ucw0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259cyB0byBsb29rIHRocm91Z2ggZm9yDQorICAgICogICAgICAgICAgIHtAbGluayBBY3Rpb25DbWRMaW5lT3B0aW9ufXMNCisgICAgKiBAcmV0dXJuIEFsbCB7QGxpbmsgQWN0aW9uQ21kTGluZU9wdGlvbn1zIGZvdW5kDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBMaXN0PEFjdGlvbkNtZExpbmVPcHRpb24+IGZpbmRBY3Rpb25PcHRpb25zKA0KKyAgICAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBMaXN0PEFjdGlvbkNtZExpbmVPcHRpb24+IGFjdGlvbk9wdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmIChpc0FjdGlvbk9wdGlvbihvcHRpb24pKSB7DQorICAgICAgICAgICAgYWN0aW9uT3B0aW9ucy5hZGQoKEFjdGlvbkNtZExpbmVPcHRpb24pIG9wdGlvbik7DQorICAgICAgICAgfSBlbHNlIGlmIChpc0dyb3VwT3B0aW9uKG9wdGlvbikpIHsNCisgICAgICAgICAgICBHcm91cENtZExpbmVPcHRpb24gZ3JvdXBPcHRpb24gPSAoR3JvdXBDbWRMaW5lT3B0aW9uKSBvcHRpb247DQorICAgICAgICAgICAgU2V0PENtZExpbmVPcHRpb24+IHN1Yk9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoKTsNCisgICAgICAgICAgICBmb3IgKEdyb3VwU3ViT3B0aW9uIHN1Yk9wdGlvbiA6IGdyb3VwT3B0aW9uLmdldFN1Yk9wdGlvbnMoKSkgew0KKyAgICAgICAgICAgICAgIHN1Yk9wdGlvbnMuYWRkKHN1Yk9wdGlvbi5nZXRPcHRpb24oKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGFjdGlvbk9wdGlvbnMuYWRkQWxsKGZpbmRBY3Rpb25PcHRpb25zKHN1Yk9wdGlvbnMpKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBhY3Rpb25PcHRpb25zOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kIHtAbGluayBBY3Rpb25DbWRMaW5lT3B0aW9ufSBpbiB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBvcHRpb25zDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdG8gc2VhcmNoIHRocm91Z2ggZm9yIGENCisgICAgKiAgICAgICAgICAge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259DQorICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCisgICAgKiAgICAgICAgICAgIElmIG1vcmUgdGhhbiBvbmUgYWN0aW9uIG9wdGlvbiBoYXMgYmUgc3BlY2lmaWVkDQorICAgICogQHJldHVybiBUaGUgZm91bmQge0BsaW5rIEFjdGlvbkNtZExpbmVPcHRpb259LCBvciBudWxsIGlmIG5vdCBmb3VuZA0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgQ21kTGluZU9wdGlvbkluc3RhbmNlIGZpbmRTcGVjaWZpZWRBY3Rpb25PcHRpb24oDQorICAgICAgICAgU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gb3B0aW9ucykgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9ucyk7DQorDQorICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIHNwZWNpZmllZEFjdGlvbiA9IG51bGw7DQorICAgICAgZm9yIChDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmIChvcHRpb24uaXNBY3Rpb24oKSkgew0KKyAgICAgICAgICAgIGlmIChzcGVjaWZpZWRBY3Rpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICAgICAgIk9ubHkgb25lIGFjdGlvbiBtYXkgYmUgc3BlY2lmaWVkISIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzcGVjaWZpZWRBY3Rpb24gPSBvcHRpb247DQorICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uaXNHcm91cCgpKSB7DQorICAgICAgICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIGZvdW5kQWN0aW9uID0gZmluZFNwZWNpZmllZEFjdGlvbk9wdGlvbihvcHRpb24NCisgICAgICAgICAgICAgICAgICAuZ2V0U3ViT3B0aW9ucygpKTsNCisgICAgICAgICAgICBpZiAoc3BlY2lmaWVkQWN0aW9uICE9IG51bGwgJiYgZm91bmRBY3Rpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICAgIk9ubHkgb25lIGFjdGlvbiBtYXkgYmUgc3BlY2lmaWVkISIpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmRBY3Rpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgIHNwZWNpZmllZEFjdGlvbiA9IGZvdW5kQWN0aW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBzcGVjaWZpZWRBY3Rpb247DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIENoZWNrcyBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uDQorICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpbiBxdWVzdGlvbg0KKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufSwNCisgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQ0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dyb3VwT3B0aW9uKENtZExpbmVPcHRpb24gb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKw0KKyAgICAgIHJldHVybiBvcHRpb24gaW5zdGFuY2VvZiBHcm91cENtZExpbmVPcHRpb247DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIENhc3Qge0BsaW5rIENtZExpbmVPcHRpb259IHRvIGEge0BsaW5rIEdyb3VwQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IHRvIGJlIGNhc3QgYXMgYQ0KKyAgICAqICAgICAgICAgICB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufQ0KKyAgICAqIEByZXR1cm4gQSB7QGxpbmsgR3JvdXBDbWRMaW5lT3B0aW9ufQ0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgR3JvdXBDbWRMaW5lT3B0aW9uIGFzR3JvdXBPcHRpb24oQ21kTGluZU9wdGlvbiBvcHRpb24pIHsNCisgICAgICBWYWxpZGF0ZS5pc1RydWUoaXNHcm91cE9wdGlvbihvcHRpb24pKTsNCisNCisgICAgICByZXR1cm4gKEdyb3VwQ21kTGluZU9wdGlvbikgb3B0aW9uOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBDaGVja3MgaWYge0BsaW5rIENtZExpbmVPcHRpb259IGlzIGEge0BsaW5rIEhlbHBDbWRMaW5lT3B0aW9ufS4NCisgICAgKiANCisgICAgKiBAcGFyYW0gb3B0aW9uDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbn0gdGhhdCBpcyBjaGVja2VkIGlmIGl0IGlzIGENCisgICAgKiAgICAgICAgICAge0BsaW5rIEhlbHBDbWRMaW5lT3B0aW9ufQ0KKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiB7QGxpbmsgQ21kTGluZU9wdGlvbn0gaXMgYSB7QGxpbmsgSGVscENtZExpbmVPcHRpb259LA0KKyAgICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGVscE9wdGlvbihDbWRMaW5lT3B0aW9uIG9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwob3B0aW9uKTsNCisNCisgICAgICByZXR1cm4gb3B0aW9uIGluc3RhbmNlb2YgSGVscENtZExpbmVPcHRpb247DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIENhc3RzIHtAbGluayBDbWRMaW5lT3B0aW9ufSB0byBhIHtAbGluayBIZWxwQ21kTGluZU9wdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb259IHRvIGJlIGNhc3QgYXMgYQ0KKyAgICAqICAgICAgICAgICB7QGxpbmsgSGVscENtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBBIHtAbGluayBIZWxwQ21kTGluZU9wdGlvbn0NCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIEhlbHBDbWRMaW5lT3B0aW9uIGFzSGVscE9wdGlvbihDbWRMaW5lT3B0aW9uIG9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLmlzVHJ1ZShpc0hlbHBPcHRpb24ob3B0aW9uKSk7DQorDQorICAgICAgcmV0dXJuIChIZWxwQ21kTGluZU9wdGlvbikgb3B0aW9uOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kcyB0aGUge0BsaW5rIEhlbHBDbWRMaW5lT3B0aW9ufSBpbiB0aGUge0BsaW5rIFNldH0gb2YNCisgICAgKiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBvcHRpb25zDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ21kTGluZU9wdGlvbn1zIHRvIHNlYXJjaCB0aHJvdWdoIGZvcg0KKyAgICAqICAgICAgICAgICB7QGxpbmsgSGVscENtZExpbmVPcHRpb259DQorICAgICogQHJldHVybiBUaGUgZm91bmQge0BsaW5rIEhlbHBDbWRMaW5lT3B0aW9ufSwgbnVsbCBpZiBub3QgZm91bmQNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIEhlbHBDbWRMaW5lT3B0aW9uIGZpbmRIZWxwT3B0aW9uKFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBmb3IgKENtZExpbmVPcHRpb24gb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmIChpc0hlbHBPcHRpb24ob3B0aW9uKSkgew0KKyAgICAgICAgICAgIHJldHVybiAoSGVscENtZExpbmVPcHRpb24pIG9wdGlvbjsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kcyB0aGUge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0gd2hvc2Uge0BsaW5rIENtZExpbmVPcHRpb259IGlzIG9mDQorICAgICogdHlwZSB7QGxpbmsgSGVscENtZExpbmVPcHRpb259DQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbnMNCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBTZXR9IG9mIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9cyB0byBzZWFyY2gNCisgICAgKiAgICAgICAgICAgdGhyb3VnaCBmb3IgdGhlIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdob3NlDQorICAgICogICAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9ufSBpcyBvZiB0eXBlIHtAbGluayBIZWxwQ21kTGluZU9wdGlvbn0NCisgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KKyAgICAqICAgICAgICAgICAgSWYgbW9yZSB0aGFuIG9uZSBoZWxwIG9wdGlvbiBpcyBzcGVjaWZpZWQNCisgICAgKiBAcmV0dXJuIFRoZSBmb3VuZCB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSwgbnVsbCBpZiBub3QgZm91bmQNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIENtZExpbmVPcHRpb25JbnN0YW5jZSBmaW5kU3BlY2lmaWVkSGVscE9wdGlvbigNCisgICAgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBvcHRpb25zKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb25zKTsNCisNCisgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugc3BlY2lmaWVkSGVscCA9IG51bGw7DQorICAgICAgZm9yIChDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uIDogb3B0aW9ucykgew0KKyAgICAgICAgIGlmIChpc0hlbHBPcHRpb24ob3B0aW9uLmdldE9wdGlvbigpKSkgew0KKyAgICAgICAgICAgIGlmIChzcGVjaWZpZWRIZWxwICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICJIZWxwIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbmNlISIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzcGVjaWZpZWRIZWxwID0gb3B0aW9uOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHNwZWNpZmllZEhlbHA7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIEZpbmRzIHRoZSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbg0KKyAgICAqIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9Lg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBhY3Rpb25PcHRpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdoaWNoIHNwZWNpZmllcyBhbg0KKyAgICAqICAgICAgICAgICB7QGxpbmsgQWN0aW9uQ21kTGluZU9wdGlvbn0NCisgICAgKiBAcGFyYW0gc3VwcG9ydGVkQWN0aW9ucw0KKyAgICAqICAgICAgICAgICB7QGxpbmsgU2V0fSBvZiBzdXBwb3J0ZWQge0BsaW5rIENtZExpbmVBY3Rpb259cw0KKyAgICAqIEByZXR1cm4gVGhlIGZvdW5kIHtAbGluayBDbWRMaW5lQWN0aW9ufSwgbnVsbCBpZiBub3QgZm91bmQNCisgICAgKi8NCisgICBwdWJsaWMgc3RhdGljIENtZExpbmVBY3Rpb24gZmluZEFjdGlvbihDbWRMaW5lT3B0aW9uSW5zdGFuY2UgYWN0aW9uT3B0aW9uLA0KKyAgICAgICAgIFNldDxDbWRMaW5lQWN0aW9uPiBzdXBwb3J0ZWRBY3Rpb25zKSB7DQorICAgICAgVmFsaWRhdGUuaXNUcnVlKGFjdGlvbk9wdGlvbi5pc0FjdGlvbigpKTsNCisgICAgICBWYWxpZGF0ZS5ub3RFbXB0eShhY3Rpb25PcHRpb24uZ2V0VmFsdWVzKCkpOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoc3VwcG9ydGVkQWN0aW9ucyk7DQorDQorICAgICAgcmV0dXJuIGZpbmRBY3Rpb24oYWN0aW9uT3B0aW9uLmdldFZhbHVlcygpLmdldCgwKSwgc3VwcG9ydGVkQWN0aW9ucyk7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIEZpbmRzIGEge0BsaW5rIENtZExpbmVBY3Rpb259IGJ5IGl0cyBuYW1lLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSBhY3Rpb25OYW1lDQorICAgICogICAgICAgICAgIE5hbWUgb2Yge0BsaW5rIENtZExpbmVBY3Rpb259IHRvIGZpbmQNCisgICAgKiBAcGFyYW0gc3VwcG9ydGVkQWN0aW9ucw0KKyAgICAqICAgICAgICAgICB7QGxpbmsgU2V0fSBvZiBzdXBwb3J0ZWQge0BsaW5rIENtZExpbmVBY3Rpb259cw0KKyAgICAqIEByZXR1cm4gRm91bmQge0BsaW5rIENtZExpbmVBY3Rpb259IG9yIG51bGwgaWYgbm90IGZvdW5kDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBDbWRMaW5lQWN0aW9uIGZpbmRBY3Rpb24oU3RyaW5nIGFjdGlvbk5hbWUsDQorICAgICAgICAgU2V0PENtZExpbmVBY3Rpb24+IHN1cHBvcnRlZEFjdGlvbnMpIHsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGFjdGlvbk5hbWUpOw0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoc3VwcG9ydGVkQWN0aW9ucyk7DQorDQorICAgICAgZm9yIChDbWRMaW5lQWN0aW9uIGFjdGlvbiA6IHN1cHBvcnRlZEFjdGlvbnMpIHsNCisgICAgICAgICBpZiAoYWN0aW9uLmdldE5hbWUoKS5lcXVhbHMoYWN0aW9uTmFtZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0gdG8gYmUgdmFsaWRhdGVkDQorICAgICogQHJldHVybiB7QGxpbmsgQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHR9cyBmcm9tIHJ1bm5pbmcNCisgICAgKiAgICAgICAgIHtAbGluayBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfXMuDQorICAgICovDQorICAgcHVibGljIHN0YXRpYyBMaXN0PENtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0PiB2YWxpZGF0ZSgNCisgICAgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKw0KKyAgICAgIExpc3Q8Q21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQ+IHJlc3VsdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgICBpZiAob3B0aW9uLmlzVmFsaWRhdGFibGUoKSkgew0KKyAgICAgICAgIGZvciAoQ21kTGluZU9wdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgOiAoKFZhbGlkYXRhYmxlQ21kTGluZU9wdGlvbikgb3B0aW9uDQorICAgICAgICAgICAgICAgLmdldE9wdGlvbigpKS5nZXRWYWxpZGF0b3JzKCkpIHsNCisgICAgICAgICAgICByZXN1bHRzLmFkZCh2YWxpZGF0b3IudmFsaWRhdGUob3B0aW9uKSk7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBpZiAob3B0aW9uLmlzR3JvdXAoKSkgew0KKyAgICAgICAgIGZvciAoQ21kTGluZU9wdGlvbkluc3RhbmNlIHN1Yk9wdGlvbiA6IG9wdGlvbi5nZXRTdWJPcHRpb25zKCkpIHsNCisgICAgICAgICAgICByZXN1bHRzLmFkZEFsbCh2YWxpZGF0ZShzdWJPcHRpb24pKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiByZXN1bHRzOw0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBGaW5kcyB0aGUge0BsaW5rIENtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0fXMgd2l0aCBncmFkZSBvZiBGQUlMLg0KKyAgICAqIA0KKyAgICAqIEBwYXJhbSByZXN1bHRzDQorICAgICogICAgICAgICAgIFRoZSB7QGxpbmsgQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHR9cyB3aGljaCBhcmUgY2hlY2tlZCBpZg0KKyAgICAqICAgICAgICAgICB0aGV5IGhhdmUgYSBmYWlsaW5nIGdyYWRlLg0KKyAgICAqIEByZXR1cm4ge0BsaW5rIENtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0fXMgd2l0aCBncmFkZSBvZiBGQUlMLg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdD4gZGV0ZXJtaW5lRmFpbGVkVmFsaWRhdGlvbigNCisgICAgICAgICBMaXN0PENtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0PiByZXN1bHRzKSB7DQorICAgICAgTGlzdDxDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdD4gZmFpbGVkUmVzdWx0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICAgIGZvciAoQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgew0KKyAgICAgICAgIGlmIChyZXN1bHQuZ2V0R3JhZGUoKS5lcXVhbHMoQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQuR3JhZGUuRkFJTCkpIHsNCisgICAgICAgICAgICBmYWlsZWRSZXN1bHRzLmFkZChyZXN1bHQpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIGZhaWxlZFJlc3VsdHM7DQorICAgfQ0KKw0KKyAgIC8qKg0KKyAgICAqIFJ1bnMgdGhlIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9J3MgaGFuZGxlciBpZiBpdCBhIHBlcmZvcm0gYW5kDQorICAgICogcXVpdCBvcHRpb24uDQorICAgICogDQorICAgICogQHBhcmFtIG9wdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVPcHRpb25JbnN0YW5jZX0gd2hvc2UgaGFuZGxlciB3aWxsIGJlIHJ1bg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVQZXJmb3JtQW5kUXVpdE9wdGlvbihDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uKSB7DQorICAgICAgVmFsaWRhdGUubm90TnVsbChvcHRpb24pOw0KKw0KKyAgICAgIGlmIChvcHRpb24uaXNIYW5kbGVhYmxlKCkNCisgICAgICAgICAgICAmJiAoKEhhbmRsZWFibGVDbWRMaW5lT3B0aW9uKSBvcHRpb24uZ2V0T3B0aW9uKCkpLmdldEhhbmRsZXIoKSAhPSBudWxsKSB7DQorICAgICAgICAgKChIYW5kbGVhYmxlQ21kTGluZU9wdGlvbikgb3B0aW9uLmdldE9wdGlvbigpKS5nZXRIYW5kbGVyKCkNCisgICAgICAgICAgICAgICAuaGFuZGxlT3B0aW9uKG51bGwsIG9wdGlvbik7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChvcHRpb24uaXNHcm91cCgpKSB7DQorICAgICAgICAgZm9yIChDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugc3ViT3B0aW9uIDogb3B0aW9uLmdldFN1Yk9wdGlvbnMoKSkgew0KKyAgICAgICAgICAgIGhhbmRsZVBlcmZvcm1BbmRRdWl0T3B0aW9uKHN1Yk9wdGlvbik7DQorICAgICAgICAgfQ0KKyAgICAgIH0gICAgIA0KKyAgIH0NCisNCisgICAvKioNCisgICAgKiBSdW5zIHRoZSB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSdzIGhhbmRsZXIgYWdhaW5zdCB0aGUgZ2l2ZW4NCisgICAgKiB7QGxpbmsgQ21kTGluZUFjdGlvbn0uDQorICAgICogDQorICAgICogQHBhcmFtIGFjdGlvbg0KKyAgICAqICAgICAgICAgICBUaGUge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHRoZSBnaXZlbg0KKyAgICAqICAgICAgICAgICB7QGxpbmsgQ21kTGluZU9wdGlvbkluc3RhbmNlfSdzIGhhbmRsZXIgd2lsbCBiZSBydW4gYWdhaW5zdA0KKyAgICAqIEBwYXJhbSBvcHRpb24NCisgICAgKiAgICAgICAgICAgVGhlIHtAbGluayBDbWRMaW5lT3B0aW9uSW5zdGFuY2V9IHdob3NlIGhhbmRsZXIgd2lsbCBiZSBydW4NCisgICAgKiAgICAgICAgICAgYWdhaW5zdCB0aGUgZ2l2ZW4ge0BsaW5rIENtZExpbmVBY3Rpb259DQorICAgICovDQorICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZShDbWRMaW5lQWN0aW9uIGFjdGlvbiwgQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbikgew0KKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoYWN0aW9uKTsNCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG9wdGlvbik7DQorDQorICAgICAgaWYgKG9wdGlvbi5pc0hhbmRsZWFibGUoKQ0KKyAgICAgICAgICAgICYmICgoSGFuZGxlYWJsZUNtZExpbmVPcHRpb24pIG9wdGlvbi5nZXRPcHRpb24oKSkuZ2V0SGFuZGxlcigpICE9IG51bGwpIHsNCisgICAgICAgICAoKEhhbmRsZWFibGVDbWRMaW5lT3B0aW9uKSBvcHRpb24uZ2V0T3B0aW9uKCkpLmdldEhhbmRsZXIoKQ0KKyAgICAgICAgICAgICAgIC5oYW5kbGVPcHRpb24oYWN0aW9uLCBvcHRpb24pOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAob3B0aW9uLmlzR3JvdXAoKSkgew0KKyAgICAgICAgIGZvciAoQ21kTGluZU9wdGlvbkluc3RhbmNlIHN1Yk9wdGlvbiA6IG9wdGlvbi5nZXRTdWJPcHRpb25zKCkpIHsNCisgICAgICAgICAgICBoYW5kbGUoYWN0aW9uLCBzdWJPcHRpb24pOw0KKyAgICAgICAgIH0NCisgICAgICB9ICAgICANCisgICB9DQorDQorICAgLyoqDQorICAgICogRm9ybWF0cyBnaXZlbiBzdHJpbmcgdG8gYSBzdHJpbmcgd2hlcmUgdHh0IHN0YXJ0cyBhdCBzdGFydEluZGV4IGFuZCB3cmFwcw0KKyAgICAqIGFyb3VuZCBhdCBlbmRJbmRleCwgYWxsIG90aGVyIGluZGV4ZXMgYXJlIGZpbGxlZCB3aXRoIGVtcHR5IHNwYWNlLg0KKyAgICAqLw0KKyAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnRJbmRleCwNCisgICAgICAgICBpbnQgZW5kSW5kZXgpIHsNCisgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7DQorICAgICAgU3RyaW5nW10gc3BsaXRTdHJpbmdzID0gU3RyaW5nVXRpbHMuc3BsaXQoc3RyaW5nLCAiICIpOw0KKyAgICAgIFN0cmluZ0J1ZmZlciBjdXJMaW5lID0gbnVsbDsNCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwbGl0U3RyaW5ncy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgIGN1ckxpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsNCisgICAgICAgICBjdXJMaW5lLmFwcGVuZChzcGxpdFN0cmluZ3NbaV0gKyAiICIpOw0KKw0KKyAgICAgICAgIGZvciAoOyBpICsgMSA8IHNwbGl0U3RyaW5ncy5sZW5ndGgNCisgICAgICAgICAgICAgICAmJiBjdXJMaW5lLmxlbmd0aCgpICsgc3BsaXRTdHJpbmdzW2kgKyAxXS5sZW5ndGgoKSA8PSAoZW5kSW5kZXggLSBzdGFydEluZGV4KTsgaSsrKQ0KKyAgICAgICAgICAgIGN1ckxpbmUuYXBwZW5kKHNwbGl0U3RyaW5nc1tpICsgMV0gKyAiICIpOw0KKw0KKyAgICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nVXRpbHMucmVwZWF0KCIgIiwgc3RhcnRJbmRleCkNCisgICAgICAgICAgICAgICArIGN1ckxpbmUudG9TdHJpbmcoKSArICJcbiIpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gb3V0cHV0U3RyaW5nLnRvU3RyaW5nKCk7DQorICAgfQ0KKw0KKyAgIHB1YmxpYyBzdGF0aWMgTGlzdDw/PiBjb252ZXJ0VG9UeXBlKExpc3Q8U3RyaW5nPiB2YWx1ZXMsIENsYXNzPD8+IHR5cGUpDQorICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwNCisgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsNCisgICAgICBpZiAodHlwZS5lcXVhbHMoRmlsZS5jbGFzcykpIHsNCisgICAgICAgICBMaXN0PE9iamVjdD4gZmlsZXMgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7DQorICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpDQorICAgICAgICAgICAgZmlsZXMuYWRkKG5ldyBGaWxlKHZhbHVlKSk7DQorICAgICAgICAgcmV0dXJuIGZpbGVzOw0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQm9vbGVhbi5jbGFzcykgfHwgdHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgew0KKyAgICAgICAgIExpc3Q8T2JqZWN0PiBib29sZWFucyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsNCisgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykNCisgICAgICAgICAgICBib29sZWFucy5hZGQodmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCkuZXF1YWxzKCJ0cnVlIikpOw0KKyAgICAgICAgIHJldHVybiBib29sZWFuczsNCisgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKFVSTC5jbGFzcykpIHsNCisgICAgICAgICBMaXN0PE9iamVjdD4gdXJscyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsNCisgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykNCisgICAgICAgICAgICB1cmxzLmFkZChuZXcgVVJMKHZhbHVlKSk7DQorICAgICAgICAgcmV0dXJuIHVybHM7DQorICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsNCisgICAgICAgICBMaXN0PE9iamVjdD4gY2xhc3NlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsNCisgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykNCisgICAgICAgICAgICBjbGFzc2VzLmFkZChDbGFzcy5mb3JOYW1lKHZhbHVlKSk7DQorICAgICAgICAgcmV0dXJuIGNsYXNzZXM7DQorICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhMaXN0LmNsYXNzKSkgew0KKyAgICAgICAgIExpc3Q8T2JqZWN0PiBsaXN0cyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsNCisgICAgICAgICBsaXN0cy5hZGQodmFsdWVzKTsNCisgICAgICAgICByZXR1cm4gbGlzdHM7DQorICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhJbnRlZ2VyLmNsYXNzKSB8fCB0eXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpKSB7DQorICAgICAgICAgTGlzdDxPYmplY3Q+IGludHMgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7DQorICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpDQorICAgICAgICAgICAgaW50cy5hZGQobmV3IEludGVnZXIodmFsdWUpKTsNCisgICAgICAgICByZXR1cm4gaW50czsNCisgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKExvbmcuY2xhc3MpIHx8IHR5cGUuZXF1YWxzKExvbmcuVFlQRSkpIHsNCisgICAgICAgICBMaXN0PE9iamVjdD4gbG9uZ3MgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7DQorICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpDQorICAgICAgICAgICAgbG9uZ3MuYWRkKG5ldyBMb25nKHZhbHVlKSk7DQorICAgICAgICAgcmV0dXJuIGxvbmdzOw0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoRG91YmxlLmNsYXNzKSB8fCB0eXBlLmVxdWFscyhEb3VibGUuVFlQRSkpIHsNCisgICAgICAgICBMaXN0PE9iamVjdD4gZG91YmxlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsNCisgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykNCisgICAgICAgICAgICBkb3VibGVzLmFkZChuZXcgRG91YmxlKHZhbHVlKSk7DQorICAgICAgICAgcmV0dXJuIGRvdWJsZXM7DQorICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7DQorICAgICAgICAgU3RyaW5nQnVmZmVyIGNvbWJpbmVkU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7DQorICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpDQorICAgICAgICAgICAgY29tYmluZWRTdHJpbmcuYXBwZW5kKHZhbHVlICsgIiAiKTsNCisgICAgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KGNvbWJpbmVkU3RyaW5nLnRvU3RyaW5nKCkudHJpbSgpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgIExpc3Q8T2JqZWN0PiBvYmplY3RzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOw0KKyAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7DQorICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IENsYXNzLmZvck5hbWUodmFsdWUpLm5ld0luc3RhbmNlKCk7DQorICAgICAgICAgICAgaWYgKCF0eXBlLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0LmdldENsYXNzKCkpKSB7DQorICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhIHZhbGlkIg0KKyAgICAgICAgICAgICAgICAgICAgICsgIiB0eXBlIG9yIHN1Yi10eXBlIG9mICIgKyB0eXBlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgb2JqZWN0cy5hZGQob2JqZWN0KTsNCisgICAgICAgICB9DQorICAgICAgICAgcmV0dXJuIG9iamVjdHM7DQorICAgICAgfQ0KKyAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL09wdGlvblByb3BlcnR5UmVnaXN0ZXIuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9PcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmNmZmNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9PcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLyoqCisgKiBSZWdpc3RlciBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBKYXZhIFByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIGFuZAorICogdGh1cyBkZXRlcm1pbmluZyB3aGljaCBvcHRpb25zIGJlY29tZSByZXF1aXJlZCBvciBvcHRpb25hbCBiZWNhdXNlCisgKiBzYWlkIHByb3BlcnR5IGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ21kTGluZU9wdGlvbj4gb3B0aW9uUmVnaXN0cmF0aW9ucyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgICBwcml2YXRlIE9wdGlvblByb3BlcnR5UmVnaXN0ZXIoKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRG8gbm90IGluc3RhbnRpYXRlIE9wdGlvblByb3BlcnR5UmVnaXN0ZXIiKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyT3B0aW9uKFN0cmluZyBwcm9wZXJ0eSwgQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIFZhbGlkYXRlLmlzVHJ1ZSghb3B0aW9uUmVnaXN0cmF0aW9ucy5jb250YWluc0tleShwcm9wZXJ0eSksCisgICAgICAgICAgICAiUHJvcGVydHkgJyIgKyBwcm9wZXJ0eSArICInIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB0bzogIgorICAgICAgICAgICAgKyBvcHRpb25SZWdpc3RyYXRpb25zLmdldChwcm9wZXJ0eSkpOworCisgICAgICBvcHRpb25SZWdpc3RyYXRpb25zLnB1dChwcm9wZXJ0eSwgb3B0aW9uKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBDbWRMaW5lT3B0aW9uIGdldFJlZ2lzdGVyZWRPcHRpb24oU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICBmb3IgKEVudHJ5PFN0cmluZywgQ21kTGluZU9wdGlvbj4gb3B0aW9uUmVnaXN0cmF0aW9uIDogb3B0aW9uUmVnaXN0cmF0aW9ucy5lbnRyeVNldCgpKSB7CisgICAgICAgICBpZiAob3B0aW9uUmVnaXN0cmF0aW9uLmdldEtleSgpLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25SZWdpc3RyYXRpb24uZ2V0VmFsdWUoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgfQorICAgCisgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldFByb3BlcnRpZXMoQ21kTGluZU9wdGlvbiBzcGVjaWZpZWRPcHRpb24pIHsKKyAgICAgIFNldDxTdHJpbmc+IHByb3BlcnRpZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBDbWRMaW5lT3B0aW9uPiBvcHRpb25SZWdpc3RyYXRpb24gOiBvcHRpb25SZWdpc3RyYXRpb25zLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgIGlmIChvcHRpb25SZWdpc3RyYXRpb24uZ2V0VmFsdWUoKS5lcXVhbHMoc3BlY2lmaWVkT3B0aW9uKSkgeworICAgICAgICAgICAgcHJvcGVydGllcy5hZGQob3B0aW9uUmVnaXN0cmF0aW9uLmdldEtleSgpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJSZWdpc3RlcigpIHsKKyAgICAgIG9wdGlvblJlZ2lzdHJhdGlvbnMuY2xlYXIoKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9QYXJzZWRBcmcuamF2YSBiLzAuMTAvY2xpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9QYXJzZWRBcmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y5YWNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL1BhcnNlZEFyZy5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsOworCisvKioKKyAqIAorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUGFyc2VkQXJnIHsKKworICAgcHVibGljIGVudW0gVHlwZSB7CisgICAgICBPUFRJT04sIFZBTFVFOworICAgfQorCisgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgIHB1YmxpYyBQYXJzZWRBcmcoU3RyaW5nIG5hbWUsIFR5cGUgdHlwZSkgeworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgIHJldHVybiBuYW1lOworICAgfQorCisgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgcmV0dXJuIHR5cGU7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gbmFtZSArICIgOiAiICsgdHlwZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvVGVzdENtZExpbmVBcmdzLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL1Rlc3RDbWRMaW5lQXJncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTU5NjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL1Rlc3RDbWRMaW5lQXJncy5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaTsKKworLy9Hb29nbGUgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0cy5uZXdBcnJheUxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5uZXdIYXNoU2V0OworCisvL09PRFQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsLlRlc3RVdGlscy5jcmVhdGVBY3Rpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlQWN0aW9uT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5DbWRMaW5lQXJnczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5IZWxwQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBDbWRMaW5lQXJnc30uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdENtZExpbmVBcmdzIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbWRMaW5lQWN0aW9uIFRFU1RfQUNUSU9OXzEgPSBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24xIik7CisgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbWRMaW5lQWN0aW9uIFRFU1RfQUNUSU9OXzIgPSBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24yIik7CisgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbWRMaW5lQWN0aW9uIFRFU1RfQUNUSU9OXzMgPSBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24zIik7CisKKyAgIHByaXZhdGUgZmluYWwgc3RhdGljIEFjdGlvbkNtZExpbmVPcHRpb24gQUNUSU9OX09QVElPTiA9IGNyZWF0ZUFjdGlvbk9wdGlvbigib3BlcmF0aW9uIik7CisgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBIZWxwQ21kTGluZU9wdGlvbiBIRUxQX09QVElPTiA9IG5ldyBIZWxwQ21kTGluZU9wdGlvbigpOworICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbiBQU0FfQUNUSU9OID0gbmV3IFByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb24oKTsKKworICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2V0PENtZExpbmVBY3Rpb24+IFNVUFBPUlRFRF9BQ1RJT05TID0gbmV3SGFzaFNldCgKKyAgICAgICAgIFRFU1RfQUNUSU9OXzEsIFRFU1RfQUNUSU9OXzIsIFRFU1RfQUNUSU9OXzMpOworICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2V0PENtZExpbmVPcHRpb24+IFNVUFBPUlRFRF9PUFRJT05TID0gbmV3SGFzaFNldCgKKyAgICAgICAgIChDbWRMaW5lT3B0aW9uKSBBQ1RJT05fT1BUSU9OLCAoQ21kTGluZU9wdGlvbikgSEVMUF9PUFRJT04sCisgICAgICAgICAoQ21kTGluZU9wdGlvbikgUFNBX0FDVElPTik7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RCYXNlQ2FzZSgpIHsKKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBzcGVjaWZpZWRBY3Rpb24gPSBjcmVhdGVPcHRpb25JbnN0YW5jZSgKKyAgICAgICAgICAgIEFDVElPTl9PUFRJT04sIFRFU1RfQUNUSU9OXzEuZ2V0TmFtZSgpKTsKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IHNwZWNpZmllZE9wdGlvbnMgPSBuZXdIYXNoU2V0KHNwZWNpZmllZEFjdGlvbik7CisgICAgICBDbWRMaW5lQXJncyBhcmdzID0gbmV3IENtZExpbmVBcmdzKFNVUFBPUlRFRF9BQ1RJT05TLCBTVVBQT1JURURfT1BUSU9OUywKKyAgICAgICAgICAgIHNwZWNpZmllZE9wdGlvbnMpOworICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQUNUSU9OXzEsIGFyZ3MuZ2V0U3BlY2lmaWVkQWN0aW9uKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGFyZ3MuZ2V0QWN0aW9uT3B0aW9uSW5zdCgpLCBzcGVjaWZpZWRBY3Rpb24pOworICAgICAgYXNzZXJ0RXF1YWxzKEFDVElPTl9PUFRJT04sIGFyZ3MuZ2V0QWN0aW9uT3B0aW9uSW5zdCgpLmdldE9wdGlvbigpKTsKKyAgICAgIGFzc2VydE51bGwoYXJncy5nZXRIZWxwT3B0aW9uSW5zdCgpKTsKKyAgICAgIGFzc2VydE51bGwoYXJncy5nZXRQcmludFN1cHBvcnRlZEFjdGlvbnNPcHRpb25JbnN0KCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZUFjdGlvbk5vdFN1cHBvcnRlZCgpIHsKKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBzcGVjaWZpZWRBY3Rpb24gPSBjcmVhdGVPcHRpb25JbnN0YW5jZSgKKyAgICAgICAgICAgIEFDVElPTl9PUFRJT04sICJOb3RTdXBwb3J0ZWRBY3Rpb25OYW1lIik7CisgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBzcGVjaWZpZWRPcHRpb25zID0gbmV3SGFzaFNldChzcGVjaWZpZWRBY3Rpb24pOworICAgICAgQ21kTGluZUFyZ3MgYXJncyA9IG5ldyBDbWRMaW5lQXJncyhTVVBQT1JURURfQUNUSU9OUywgU1VQUE9SVEVEX09QVElPTlMsCisgICAgICAgICAgICBzcGVjaWZpZWRPcHRpb25zKTsKKworICAgICAgLy8gVmVyaWZ5IHRoYXQgQ21kTGluZUFjdGlvbiBpcyBudWxsIHNpbmNlIGl0IHdhcyBub3QgYWJsZSB0byBiZSBsb2NhdGVkCisgICAgICAvLyBpbiBzZXQgb2Ygc3VwcG9ydGVkIGFjdGlvbnMuCisgICAgICBhc3NlcnROdWxsKGFyZ3MuZ2V0U3BlY2lmaWVkQWN0aW9uKCkpOworICAgICAgLy8gVmVyaWZ5IHRoYXQgaWYgZGlkIGZpbmQgdGhlIGFjdGlvbiBvcHRpb24uCisgICAgICBhc3NlcnRFcXVhbHMoc3BlY2lmaWVkQWN0aW9uLmdldE9wdGlvbigpLCBhcmdzLmdldEFjdGlvbk9wdGlvbkluc3QoKQorICAgICAgICAgICAgLmdldE9wdGlvbigpKTsKKyAgICAgIC8vIFZlcmlmeSB0aGF0IGlmIGZvdW5kIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdAorICAgICAgLy8gc3VwcG9ydGVkLgorICAgICAgYXNzZXJ0RXF1YWxzKG5ld0FycmF5TGlzdCgiTm90U3VwcG9ydGVkQWN0aW9uTmFtZSIpLCBhcmdzCisgICAgICAgICAgICAuZ2V0QWN0aW9uT3B0aW9uSW5zdCgpLmdldFZhbHVlcygpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvVGVzdENtZExpbmVVdGlsaXR5LmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL1Rlc3RDbWRMaW5lVXRpbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTE0MGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL1Rlc3RDbWRMaW5lVXRpbGl0eS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGk7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5DbWRMaW5lVXRpbGl0eS52YWxpZGF0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsLlRlc3RVdGlscy5jcmVhdGVBY3Rpb25PcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlQWR2YW5jZWRPcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlQXBwbHlUb0FjdGlvbkhhbmRsZXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmRldGVybWluZUZhaWxlZFZhbGlkYXRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuQ21kTGluZUFyZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuQ21kTGluZVV0aWxpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLlByaW50TWVzc2FnZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkhlbHBDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5QcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHM7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBDbWRMaW5lVXRpbGl0eX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdENtZExpbmVVdGlsaXR5IGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2soKSB7CisgICAgICBDbWRMaW5lQXJncyBhcmdzID0gZ2V0QXJncygpOworCisgICAgICAvLyBFeHBlY3QgcGFzcy4KKyAgICAgIGFzc2VydEVxdWFscygwLCBDbWRMaW5lVXRpbGl0eS5jaGVjayhhcmdzKS5zaXplKCkpOworCisgICAgICAvLyBFeHBlY3QgZmFpbC4KKyAgICAgIGFyZ3MuZ2V0U3VwcG9ydGVkT3B0aW9ucygpLmFkZCgKKyAgICAgICAgICAgIFRlc3RVdGlscy5jcmVhdGVTaW1wbGVPcHRpb24oIlJlcVRlc3RBY3Rpb24iLCB0cnVlKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgQ21kTGluZVV0aWxpdHkuY2hlY2soYXJncykuc2l6ZSgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgQ21kTGluZUFyZ3MgYXJncyA9IGdldEFyZ3MoKTsKKworICAgICAgLy8gRXhwZWN0IHBhc3MuCisgICAgICBhc3NlcnRFcXVhbHMoMSwgQ21kTGluZVV0aWxpdHkudmFsaWRhdGUoYXJncykuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhSZXN1bHQuR3JhZGUuUEFTUywgQ21kTGluZVV0aWxpdHkudmFsaWRhdGUoYXJncykuZ2V0KDApCisgICAgICAgICAgICAuZ2V0R3JhZGUoKSk7CisKKyAgICAgIC8vIEFkZCB2YWxpZGF0b3Igd2hpY2ggd2lsbCBjYXVzZSBmYWlsLgorICAgICAgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIG9wdGlvbiA9IChBZHZhbmNlZENtZExpbmVPcHRpb24pIGdldE9wdGlvbkJ5TmFtZSgibWVzc2FnZSIsIGFyZ3MuZ2V0U3VwcG9ydGVkT3B0aW9ucygpKTsKKyAgICAgIEFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IoKTsKKyAgICAgIHZhbGlkYXRvci5zZXRBbGxvd2VkQXJncyhMaXN0cy5uZXdBcnJheUxpc3QoIlxcZHsxLDJ9IikpOworICAgICAgb3B0aW9uLmFkZFZhbGlkYXRvcih2YWxpZGF0b3IpOworCisgICAgICAvLyBFeHBlY3QgZmFpbC4KKyAgICAgIGFzc2VydEZhbHNlKGRldGVybWluZUZhaWxlZFZhbGlkYXRpb24odmFsaWRhdGUoYXJncykpLmlzRW1wdHkoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGUoKSB7CisgICAgICBDbWRMaW5lQXJncyBhcmdzID0gZ2V0QXJncygpOworCisgICAgICAvLyBWZXJpZnkgaGFuZGxpbmcgd29ya3MuCisgICAgICBQcmludE1lc3NhZ2VBY3Rpb24gYWN0aW9uID0gKFByaW50TWVzc2FnZUFjdGlvbikgYXJncworICAgICAgICAgICAgLmdldFNwZWNpZmllZEFjdGlvbigpOworICAgICAgYXNzZXJ0TnVsbChhY3Rpb24uZ2V0TWVzc2FnZSgpKTsKKyAgICAgIENtZExpbmVVdGlsaXR5LmhhbmRsZShhcmdzKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGVzdCBNZXNzYWdlIiwgYWN0aW9uLmdldE1lc3NhZ2UoKSk7CisgICB9CisKKyAgIHByaXZhdGUgQ21kTGluZUFyZ3MgZ2V0QXJncygpIHsKKyAgICAgIC8vIFNldHVwIFN1cHBvcnRlZCBBY3Rpb25zLgorICAgICAgU3RyaW5nIGFjdGlvbk5hbWUgPSAiVGVzdEFjdGlvbiI7CisgICAgICBQcmludE1lc3NhZ2VBY3Rpb24gYWN0aW9uID0gbmV3IFByaW50TWVzc2FnZUFjdGlvbigpOworICAgICAgYWN0aW9uLnNldE5hbWUoYWN0aW9uTmFtZSk7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IFNldHMubmV3SGFzaFNldCgoQ21kTGluZUFjdGlvbikgYWN0aW9uKTsKKworICAgICAgLy8gU2V0dXAgU3VwcG9ydGVkIE9wdGlvbnMuCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgb3B0aW9ucy5hZGQobmV3IEhlbHBDbWRMaW5lT3B0aW9uKCkpOworICAgICAgb3B0aW9ucy5hZGQobmV3IFByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb24oKSk7CisgICAgICBvcHRpb25zLmFkZChjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpKTsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBvcHRpb24gPSBjcmVhdGVBZHZhbmNlZE9wdGlvbigibWVzc2FnZSIsCisgICAgICAgICAgICBjcmVhdGVBcHBseVRvQWN0aW9uSGFuZGxlcihhY3Rpb25OYW1lLCAic2V0TWVzc2FnZSIpKTsKKyAgICAgIEFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IoKTsKKyAgICAgIHZhbGlkYXRvci5zZXRBbGxvd2VkQXJncyhMaXN0cy5uZXdBcnJheUxpc3QoIi4qIikpOworICAgICAgb3B0aW9uLmFkZFZhbGlkYXRvcih2YWxpZGF0b3IpOworICAgICAgb3B0aW9ucy5hZGQob3B0aW9uKTsKKworICAgICAgLy8gU2V0dXAgU3BlY2lmaWVkIE9wdGlvbnMuCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBzcGVjaWZpZWRPcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBzcGVjaWZpZWRPcHRpb25zLmFkZChjcmVhdGVPcHRpb25JbnN0YW5jZShvcHRpb24sICJUZXN0IE1lc3NhZ2UiKSk7CisgICAgICBzcGVjaWZpZWRPcHRpb25zLmFkZChjcmVhdGVPcHRpb25JbnN0YW5jZShjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpLAorICAgICAgICAgICAgIlRlc3RBY3Rpb24iKSk7CisKKyAgICAgIC8vIFNldHVwIENtZExpbmVBcmdzLgorICAgICAgcmV0dXJuIG5ldyBDbWRMaW5lQXJncyhhY3Rpb25zLCBvcHRpb25zLCBzcGVjaWZpZWRPcHRpb25zKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvYWN0aW9uL3N0b3JlL3NwcmluZy9UZXN0U3ByaW5nQ21kTGluZUFjdGlvblN0b3JlLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9zcHJpbmcvVGVzdFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Mjk2NzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL2FjdGlvbi9zdG9yZS9zcHJpbmcvVGVzdFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnN0b3JlLnNwcmluZzsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmZpbmRBY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLlByaW50TWVzc2FnZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nLlNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0U2V0Q29udGV4dEluamVjdFR5cGVBY3Rpb247CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OworCisvKioKKyAqIFRlc3QgY2FzZSBmb3Ige0BsaW5rIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQUklOR19DT05GSUcgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NtZC1saW5lLWFjdGlvbnMueG1sIjsKKworICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbk5hbWVzQXV0b1NldCgpIHsKKyAgICAgIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSBzdG9yZSA9IG5ldyBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmUoCisgICAgICAgICAgICBTUFJJTkdfQ09ORklHKTsKKyAgICAgIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0ID0gc3RvcmUuZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIE1hcDxTdHJpbmcsIENtZExpbmVBY3Rpb24+IGFjdGlvbnNNYXAgPSBhcHBDb250ZXh0CisgICAgICAgICAgICAuZ2V0QmVhbnNPZlR5cGUoQ21kTGluZUFjdGlvbi5jbGFzcyk7CisgICAgICBmb3IgKEVudHJ5PFN0cmluZywgQ21kTGluZUFjdGlvbj4gZW50cnkgOiBhY3Rpb25zTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25Db250ZXh0QXV0b1NldCgpIHRocm93cyBDbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb24geworICAgICAgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlIHN0b3JlID0gbmV3IFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSgKKyAgICAgICAgICAgIFNQUklOR19DT05GSUcpOworICAgICAgVGVzdFNldENvbnRleHRJbmplY3RUeXBlQWN0aW9uIGFjdGlvbiA9IChUZXN0U2V0Q29udGV4dEluamVjdFR5cGVBY3Rpb24pIGZpbmRBY3Rpb24oCisgICAgICAgICAgICAiVGVzdFNldENvbnRleHRJbmplY3RBY3Rpb24iLCBzdG9yZS5sb2FkU3VwcG9ydGVkQWN0aW9ucygpKTsKKyAgICAgIGFzc2VydEVxdWFscyhhY3Rpb24uZ2V0Q29udGV4dCgpLCBzdG9yZS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkU3VwcG9ydGVkQWN0aW9ucygpIHRocm93cyBDbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb24geworICAgICAgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlIHN0b3JlID0gbmV3IFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSgKKyAgICAgICAgICAgIFNQUklOR19DT05GSUcpOworICAgICAgU2V0PENtZExpbmVBY3Rpb24+IGFjdGlvbnMgPSBzdG9yZS5sb2FkU3VwcG9ydGVkQWN0aW9ucygpOworCisgICAgICAvLyBDaGVjayB0aGF0IGFsbCBhY3Rpb25zIHdlcmUgbG9hZGVkLgorICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFjdGlvbnMuc2l6ZSgpKTsKKworICAgICAgLy8gTG9hZCBhbmQgdmVyaWZ5IFByaW50TWVzc2FnZUFjdGlvbiB3YXMgbG9hZGVkIGNvcnJlY3RseS4KKyAgICAgIENtZExpbmVBY3Rpb24gYWN0aW9uID0gZmluZEFjdGlvbigiUHJpbnRNZXNzYWdlQWN0aW9uIiwgYWN0aW9ucyk7CisgICAgICBhc3NlcnRUcnVlKGFjdGlvbiBpbnN0YW5jZW9mIFByaW50TWVzc2FnZUFjdGlvbik7CisgICAgICBQcmludE1lc3NhZ2VBY3Rpb24gcG1hID0gKFByaW50TWVzc2FnZUFjdGlvbikgYWN0aW9uOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcmludHMgb3V0IGEgZ2l2ZW4gbWVzc2FnZSIsIHBtYS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBwbWEuZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IC8qIGRvIG5vdGhpbmcgKi8gfQorICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKworICAgICAgLy8gTG9hZCBhbmQgdmVyaWZ5IFByaW50SGVsbG9Xb3JsZEFjdGlvbiB3YXMgbG9hZGVkIGNvcnJlY3RseS4KKyAgICAgIGFjdGlvbiA9IGZpbmRBY3Rpb24oIlByaW50SGVsbG9Xb3JsZEFjdGlvbiIsIGFjdGlvbnMpOworICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb24gaW5zdGFuY2VvZiBQcmludE1lc3NhZ2VBY3Rpb24pOworICAgICAgcG1hID0gKFByaW50TWVzc2FnZUFjdGlvbikgYWN0aW9uOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcmludHMgb3V0ICdIZWxsbyBXb3JsZCciLCBwbWEuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgcG1hLmdldE1lc3NhZ2UoKSk7CisgICAgICBwbWEuZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocG1hLmdldE1lc3NhZ2UoKSwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9UZXN0QXBwbHlUb0FjdGlvbi5qYXZhIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vaGFuZGxlci9UZXN0QXBwbHlUb0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTVhNGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RBcHBseVRvQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBBcHBseVRvQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXBwbHlUb0FjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlU2V0dGVycygpIHsKKyAgICAgIEFwcGx5VG9BY3Rpb24gYXBwbHlUb0FjdGlvbiA9IG5ldyBBcHBseVRvQWN0aW9uKCk7CisgICAgICBhc3NlcnROdWxsKGFwcGx5VG9BY3Rpb24uZ2V0QWN0aW9uTmFtZSgpKTsKKyAgICAgIGFzc2VydE51bGwoYXBwbHlUb0FjdGlvbi5nZXRNZXRob2ROYW1lKCkpOworCisgICAgICBTdHJpbmcgYWN0aW9uTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgIGFwcGx5VG9BY3Rpb24uc2V0QWN0aW9uTmFtZShhY3Rpb25OYW1lKTsKKyAgICAgIGFzc2VydEVxdWFscyhhY3Rpb25OYW1lLCBhcHBseVRvQWN0aW9uLmdldEFjdGlvbk5hbWUoKSk7CisKKyAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gInNldE1lc3NhZ2UiOworICAgICAgYXBwbHlUb0FjdGlvbi5zZXRNZXRob2ROYW1lKG1ldGhvZE5hbWUpOworICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZE5hbWUsIGFwcGx5VG9BY3Rpb24uZ2V0TWV0aG9kTmFtZSgpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL2hhbmRsZXIvVGVzdEFwcGx5VG9BY3Rpb25IYW5kbGVyLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RBcHBseVRvQWN0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGEwYTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RBcHBseVRvQWN0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXI7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZUFkdmFuY2VkT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZUFwcGx5VG9BY3Rpb25IYW5kbGVyOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5QcmludE1lc3NhZ2VBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlcjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBBcHBseVRvQWN0aW9uSGFuZGxlcn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFwcGx5VG9BY3Rpb25IYW5kbGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dEFwcGx5VG9BY3Rpb25NYXBwaW5nU2V0KCkgeworICAgICAgQXBwbHlUb0FjdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBseVRvQWN0aW9uSGFuZGxlcigpOworICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldEFwcGx5VG9BY3Rpb25zKCkpOworICAgICAgUHJpbnRNZXNzYWdlQWN0aW9uIGFjdGlvbiA9IG5ldyBQcmludE1lc3NhZ2VBY3Rpb24oKTsKKyAgICAgIGFjdGlvbi5zZXROYW1lKCJQcmludE1lc3NhZ2VBY3Rpb24iKTsKKworICAgICAgYXNzZXJ0TnVsbChhY3Rpb24uZ2V0TWVzc2FnZSgpKTsKKworICAgICAgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBBZHZhbmNlZENtZExpbmVPcHRpb24oKTsKKyAgICAgIG9wdGlvbi5zZXRMb25nT3B0aW9uKCJtZXNzYWdlIik7CisgICAgICBvcHRpb24uc2V0SGFuZGxlcihoYW5kbGVyKTsKKyAgICAgIG9wdGlvbi5nZXRIYW5kbGVyKCkuaGFuZGxlT3B0aW9uKGFjdGlvbiwKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKG9wdGlvbiwgIkhvd2R5IikpOworCisgICAgICBhc3NlcnRFcXVhbHMoIkhvd2R5IiwgYWN0aW9uLmdldE1lc3NhZ2UoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RBcHBseVRvQWN0aW9uc01hcHBpbmcoKSB7CisgICAgICBQcmludE1lc3NhZ2VBY3Rpb24gYWN0aW9uID0gbmV3IFByaW50TWVzc2FnZUFjdGlvbigpOworICAgICAgYWN0aW9uLnNldE5hbWUoIlByaW50TWVzc2FnZUFjdGlvbiIpOworICAgICAgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIG9wdGlvbiA9IGNyZWF0ZUFkdmFuY2VkT3B0aW9uKCJwcmludE1lc3NhZ2UiLAorICAgICAgICAgICAgY3JlYXRlQXBwbHlUb0FjdGlvbkhhbmRsZXIoYWN0aW9uLmdldE5hbWUoKSwgInNldE1lc3NhZ2UiKSk7CisgICAgICBvcHRpb24uZ2V0SGFuZGxlcigpLmhhbmRsZU9wdGlvbihhY3Rpb24sCisgICAgICAgICAgICBjcmVhdGVPcHRpb25JbnN0YW5jZShvcHRpb24sICJIb3dkeSIpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKCJIb3dkeSIsIGFjdGlvbi5nZXRNZXNzYWdlKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3JBZGRJbnZva2UoKSB7CisgICAgICBUZXN0Q21kTGluZUFjdGlvbiBhY3Rpb24gPSBuZXcgVGVzdENtZExpbmVBY3Rpb24oKTsKKyAgICAgIGFjdGlvbi5zZXROYW1lKCJUZXN0QWN0aW9uIik7CisgICAgICBBZHZhbmNlZENtZExpbmVPcHRpb24gb3B0aW9uID0gY3JlYXRlQWR2YW5jZWRPcHRpb24oIm1lc3NhZ2UiLAorICAgICAgICAgICAgY3JlYXRlQXBwbHlUb0FjdGlvbkhhbmRsZXIoYWN0aW9uLmdldE5hbWUoKSwgbnVsbCkpOworCisgICAgICAvLyBUZXN0IHRoYXQgZGVmYXVsdCBpc1JlcGVhdGluZygpIGlzIGZhbHNlLgorICAgICAgb3B0aW9uLmdldEhhbmRsZXIoKS5oYW5kbGVPcHRpb24oYWN0aW9uLAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2Uob3B0aW9uLCAiSG93ZHkiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoVGVzdENtZExpbmVBY3Rpb24uQ2FsbFR5cGUuU0VULCBhY3Rpb24uZ2V0Q2FsbFR5cGUoKSk7CisKKyAgICAgIC8vIFRlc3Qgd2hlbiBpc1JlcGVhdGluZygpIGlzIHNldCB0byBmYWxzZS4KKyAgICAgIG9wdGlvbi5zZXRSZXBlYXRpbmcoZmFsc2UpOworICAgICAgb3B0aW9uLmdldEhhbmRsZXIoKS5oYW5kbGVPcHRpb24oYWN0aW9uLAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2Uob3B0aW9uLCAiSG93ZHkiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoVGVzdENtZExpbmVBY3Rpb24uQ2FsbFR5cGUuU0VULCBhY3Rpb24uZ2V0Q2FsbFR5cGUoKSk7CisKKyAgICAgIC8vIFRlc3Qgd2hlbiBpc1JlcGVhdGluZygpIGlzIHNldCB0byB0cnVlLgorICAgICAgb3B0aW9uLnNldFJlcGVhdGluZyh0cnVlKTsKKyAgICAgIG9wdGlvbi5nZXRIYW5kbGVyKCkuaGFuZGxlT3B0aW9uKGFjdGlvbiwKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKG9wdGlvbiwgIkhvd2R5IikpOworICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RDbWRMaW5lQWN0aW9uLkNhbGxUeXBlLkFERCwgYWN0aW9uLmdldENhbGxUeXBlKCkpOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbWRMaW5lQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisgICAgICBwdWJsaWMgZW51bSBDYWxsVHlwZSB7IEFERCwgU0VUIH07CisgICAgICBwcml2YXRlIENhbGxUeXBlIGNhbGxUeXBlOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICBjYWxsVHlwZSA9IENhbGxUeXBlLkFERDsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgY2FsbFR5cGUgPSBDYWxsVHlwZS5TRVQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBDYWxsVHlwZSBnZXRDYWxsVHlwZSAoKSB7CisgICAgICAgICByZXR1cm4gY2FsbFR5cGU7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RTZXRKYXZhUHJvcGVydGllc0hhbmRsZXIuamF2YSBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL2hhbmRsZXIvVGVzdFNldEphdmFQcm9wZXJ0aWVzSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmNlNTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RTZXRKYXZhUHJvcGVydGllc0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXI7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZUFkdmFuY2VkT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlcjsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIFNldEphdmFQcm9wZXJ0aWVzSGFuZGxlcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dGluZ09mUHJvcGVydGllcygpIHsKKyAgICAgIFN0cmluZyBwcm9wZXJ0eSA9ICJ0ZXN0LnByb3BlcnR5IjsKKyAgICAgIFNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciBoYW5kbGVyID0gbmV3IFNldEphdmFQcm9wZXJ0aWVzSGFuZGxlcigpOworICAgICAgaGFuZGxlci5zZXRQcm9wZXJ0eU5hbWVzKExpc3RzLm5ld0FycmF5TGlzdChwcm9wZXJ0eSkpOworICAgICAgQ21kTGluZU9wdGlvbiBvcHRpb24gPSBjcmVhdGVBZHZhbmNlZE9wdGlvbigidGVzdE9wdGlvbiIsIGhhbmRsZXIpOworICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3RhbmNlID0gY3JlYXRlT3B0aW9uSW5zdGFuY2Uob3B0aW9uLCAiSGVsbG8iLCAiV29ybGQiKTsKKworICAgICAgYXNzZXJ0TnVsbChTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKKyAgICAgIAorICAgICAgaGFuZGxlci5oYW5kbGVPcHRpb24obnVsbCwgb3B0aW9uSW5zdGFuY2UpOworICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkpOworCisgICAgICBvcHRpb24uc2V0VHlwZShMaXN0LmNsYXNzKTsKKyAgICAgIGhhbmRsZXIuaGFuZGxlT3B0aW9uKG51bGwsIG9wdGlvbkluc3RhbmNlKTsKKyAgICAgIGFzc2VydEVxdWFscygiSGVsbG8sV29ybGQiLCBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3JlcXVpcmUvVGVzdEFjdGlvbkRlcGVuZGVuY3lSdWxlLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9yZXF1aXJlL1Rlc3RBY3Rpb25EZXBlbmRlbmN5UnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjNhMzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9yZXF1aXJlL1Rlc3RBY3Rpb25EZXBlbmRlbmN5UnVsZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsLlRlc3RVdGlscy5jcmVhdGVBY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuUmVxdWlyZW1lbnRSdWxlLlJlbGF0aW9uOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEFjdGlvbkRlcGVuZGVuY3lSdWxlfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QWN0aW9uRGVwZW5kZW5jeVJ1bGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsQ2FzZSgpIHsKKyAgICAgIEFjdGlvbkRlcGVuZGVuY3lSdWxlIGFjdGlvbkRlcGVuZGVuY3kgPSBuZXcgQWN0aW9uRGVwZW5kZW5jeVJ1bGUoKTsKKyAgICAgIGFzc2VydE51bGwoYWN0aW9uRGVwZW5kZW5jeS5nZXRBY3Rpb25OYW1lKCkpOworICAgICAgYXNzZXJ0TnVsbChhY3Rpb25EZXBlbmRlbmN5LmdldFJlbGF0aW9uKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVTZXR0aW5nKCkgeworICAgICAgU3RyaW5nIGFjdGlvbk5hbWUgPSAib3BlcmF0aW9uIjsKKyAgICAgIFJlbGF0aW9uIHJlbGF0aW9uID0gUmVsYXRpb24uT1BUSU9OQUw7CisgICAgICBBY3Rpb25EZXBlbmRlbmN5UnVsZSBhY3Rpb25EZXBlbmRlbmN5ID0gbmV3IEFjdGlvbkRlcGVuZGVuY3lSdWxlKAorICAgICAgICAgICAgYWN0aW9uTmFtZSwgcmVsYXRpb24pOworICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbk5hbWUsIGFjdGlvbkRlcGVuZGVuY3kuZ2V0QWN0aW9uTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhyZWxhdGlvbiwgYWN0aW9uRGVwZW5kZW5jeS5nZXRSZWxhdGlvbigpKTsKKworICAgICAgYWN0aW9uTmFtZSA9ICJhY3Rpb24iOworICAgICAgcmVsYXRpb24gPSBSZWxhdGlvbi5SRVFVSVJFRDsKKyAgICAgIGFjdGlvbkRlcGVuZGVuY3kuc2V0QWN0aW9uTmFtZShhY3Rpb25OYW1lKTsKKyAgICAgIGFjdGlvbkRlcGVuZGVuY3kuc2V0UmVsYXRpb24ocmVsYXRpb24pOworICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbk5hbWUsIGFjdGlvbkRlcGVuZGVuY3kuZ2V0QWN0aW9uTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhyZWxhdGlvbiwgYWN0aW9uRGVwZW5kZW5jeS5nZXRSZWxhdGlvbigpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFJlbGF0aW9uKCkgeworICAgICAgU3RyaW5nIGFjdGlvbk5hbWUgPSAib3BlcmF0aW9uIjsKKyAgICAgIFJlbGF0aW9uIHJlbGF0aW9uID0gUmVsYXRpb24uT1BUSU9OQUw7CisgICAgICBBY3Rpb25EZXBlbmRlbmN5UnVsZSBhY3Rpb25EZXBlbmRlbmN5ID0gbmV3IEFjdGlvbkRlcGVuZGVuY3lSdWxlKAorICAgICAgICAgICAgYWN0aW9uTmFtZSwgcmVsYXRpb24pOworICAgICAgYXNzZXJ0RXF1YWxzKHJlbGF0aW9uLAorICAgICAgICAgICAgYWN0aW9uRGVwZW5kZW5jeS5nZXRSZWxhdGlvbihjcmVhdGVBY3Rpb24oYWN0aW9uTmFtZSkpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3N0b3JlL3NwcmluZy9UZXN0U3ByaW5nQ21kTGluZU9wdGlvblN0b3JlLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9zdG9yZS9zcHJpbmcvVGVzdFNwcmluZ0NtZExpbmVPcHRpb25TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi9zdG9yZS9zcHJpbmcvVGVzdFNwcmluZ0NtZExpbmVPcHRpb25TdG9yZS5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnN0b3JlLnNwcmluZzsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmZpbmRBY3Rpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLlByaW50TWVzc2FnZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nLlNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lT3B0aW9uU3RvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5SZXF1aXJlbWVudFJ1bGUuUmVsYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnN0b3JlLnNwcmluZy5TcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmU7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3ByaW5nQ21kTGluZU9wdGlvblN0b3JlIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BSSU5HX09QVElPTl9DT05GSUcgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NtZC1saW5lLW9wdGlvbnMueG1sIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUFJJTkdfQUNUSU9OX0NPTkZJRyA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwiOworCisgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFN1cHBvcnRlZE9wdGlvbnMoKSB0aHJvd3MgQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uLAorICAgICAgICAgQ21kTGluZU9wdGlvblN0b3JlRXhjZXB0aW9uIHsKKyAgICAgIFNwcmluZ0NtZExpbmVPcHRpb25TdG9yZSBvcHRpb25TdG9yZSA9IG5ldyBTcHJpbmdDbWRMaW5lT3B0aW9uU3RvcmUoCisgICAgICAgICAgICBTUFJJTkdfT1BUSU9OX0NPTkZJRyk7CisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucyA9IG9wdGlvblN0b3JlLmxvYWRTdXBwb3J0ZWRPcHRpb25zKCk7CisgICAgICBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmUgYWN0aW9uU3RvcmUgPSBuZXcgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlKAorICAgICAgICAgICAgU1BSSU5HX0FDVElPTl9DT05GSUcpOworICAgICAgU2V0PENtZExpbmVBY3Rpb24+IGFjdGlvbnMgPSBhY3Rpb25TdG9yZS5sb2FkU3VwcG9ydGVkQWN0aW9ucygpOworCisgICAgICAvLyBDaGVjayB0aGF0IGFsbCBvcHRpb25zIHdlcmUgbG9hZGVkLgorICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wdGlvbnMuc2l6ZSgpKTsKKworICAgICAgLy8gTG9hZCBhbmQgdmVyaWZ5IHByaW50SGVsbG9Xb3JsZCB3YXMgbG9hZGVkIGNvcnJlY3RseS4KKyAgICAgIENtZExpbmVPcHRpb24gb3B0aW9uID0gZ2V0T3B0aW9uQnlOYW1lKCJwcmludEhlbGxvV29ybGQiLCBvcHRpb25zKTsKKyAgICAgIGFzc2VydFRydWUob3B0aW9uIGluc3RhbmNlb2YgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKTsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBhZHZhbmNlZE9wdGlvbiA9IChBZHZhbmNlZENtZExpbmVPcHRpb24pIG9wdGlvbjsKKyAgICAgIGFzc2VydEVxdWFscygicGh3IiwgYWR2YW5jZWRPcHRpb24uZ2V0U2hvcnRPcHRpb24oKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInByaW50SGVsbG9Xb3JsZCIsIGFkdmFuY2VkT3B0aW9uLmdldExvbmdPcHRpb24oKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByaW50IEhlbGxvIFdvcmxkIiwgYWR2YW5jZWRPcHRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICBhc3NlcnRGYWxzZShhZHZhbmNlZE9wdGlvbi5oYXNBcmdzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFkdmFuY2VkT3B0aW9uLmdldFN0YXRpY0FyZ3MoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEiLCBhZHZhbmNlZE9wdGlvbi5nZXRTdGF0aWNBcmdzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBhZHZhbmNlZE9wdGlvbi5nZXRSZXF1aXJlbWVudFJ1bGVzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiUHJpbnRNZXNzYWdlQWN0aW9uIiwgKChBY3Rpb25EZXBlbmRlbmN5UnVsZSkgYWR2YW5jZWRPcHRpb24KKyAgICAgICAgICAgIC5nZXRSZXF1aXJlbWVudFJ1bGVzKCkuZ2V0KDApKS5nZXRBY3Rpb25OYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFJlbGF0aW9uLk9QVElPTkFMLCAoKEFjdGlvbkRlcGVuZGVuY3lSdWxlKSBhZHZhbmNlZE9wdGlvbgorICAgICAgICAgICAgLmdldFJlcXVpcmVtZW50UnVsZXMoKS5nZXQoMCkpLmdldFJlbGF0aW9uKCkpOworCisgICAgICAvLyBMb2FkIGFuZCB2ZXJpZnkgcHJpbnRNZXNzYWdlIHdhcyBsb2FkZWQgY29ycmVjdGx5LgorICAgICAgb3B0aW9uID0gZ2V0T3B0aW9uQnlOYW1lKCJwcmludE1lc3NhZ2UiLCBvcHRpb25zKTsKKyAgICAgIGFzc2VydFRydWUob3B0aW9uIGluc3RhbmNlb2YgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKTsKKyAgICAgIGFkdmFuY2VkT3B0aW9uID0gKEFkdmFuY2VkQ21kTGluZU9wdGlvbikgb3B0aW9uOworICAgICAgYXNzZXJ0RXF1YWxzKCJwbSIsIGFkdmFuY2VkT3B0aW9uLmdldFNob3J0T3B0aW9uKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJwcmludE1lc3NhZ2UiLCBhZHZhbmNlZE9wdGlvbi5nZXRMb25nT3B0aW9uKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIHRvIHByaW50IG91dCIsIGFkdmFuY2VkT3B0aW9uLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGFkdmFuY2VkT3B0aW9uLmhhc0FyZ3MoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UiLCBhZHZhbmNlZE9wdGlvbi5nZXRBcmdzRGVzY3JpcHRpb24oKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgYWR2YW5jZWRPcHRpb24uZ2V0UmVxdWlyZW1lbnRSdWxlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByaW50TWVzc2FnZUFjdGlvbiIsICgoQWN0aW9uRGVwZW5kZW5jeVJ1bGUpIGFkdmFuY2VkT3B0aW9uCisgICAgICAgICAgICAuZ2V0UmVxdWlyZW1lbnRSdWxlcygpLmdldCgwKSkuZ2V0QWN0aW9uTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhSZWxhdGlvbi5SRVFVSVJFRCwgKChBY3Rpb25EZXBlbmRlbmN5UnVsZSkgYWR2YW5jZWRPcHRpb24KKyAgICAgICAgICAgIC5nZXRSZXF1aXJlbWVudFJ1bGVzKCkuZ2V0KDApKS5nZXRSZWxhdGlvbigpKTsKKyAgICAgIGFzc2VydE5vdE51bGwoYWR2YW5jZWRPcHRpb24uZ2V0SGFuZGxlcigpKTsKKyAgICAgIGFzc2VydFRydWUoYWR2YW5jZWRPcHRpb24uZ2V0SGFuZGxlcigpIGluc3RhbmNlb2YgQXBwbHlUb0FjdGlvbkhhbmRsZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsICgoQXBwbHlUb0FjdGlvbkhhbmRsZXIpIGFkdmFuY2VkT3B0aW9uLmdldEhhbmRsZXIoKSkKKyAgICAgICAgICAgIC5nZXRBcHBseVRvQWN0aW9ucygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoZmluZEFjdGlvbigiUHJpbnRNZXNzYWdlQWN0aW9uIiwgYWN0aW9ucykuZ2V0TmFtZSgpLAorICAgICAgICAgICAgKChBcHBseVRvQWN0aW9uSGFuZGxlcikgYWR2YW5jZWRPcHRpb24uZ2V0SGFuZGxlcigpKQorICAgICAgICAgICAgICAgICAgLmdldEFwcGx5VG9BY3Rpb25zKCkuZ2V0KDApLmdldEFjdGlvbk5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInNldE1lc3NhZ2UiLAorICAgICAgICAgICAgKChBcHBseVRvQWN0aW9uSGFuZGxlcikgYWR2YW5jZWRPcHRpb24uZ2V0SGFuZGxlcigpKQorICAgICAgICAgICAgICAgICAgLmdldEFwcGx5VG9BY3Rpb25zKCkuZ2V0KDApLmdldE1ldGhvZE5hbWUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVycygpIHRocm93cyBDbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb24sCisgICAgICAgICBDbWRMaW5lT3B0aW9uU3RvcmVFeGNlcHRpb24geworICAgICAgU3ByaW5nQ21kTGluZU9wdGlvblN0b3JlIHN0b3JlID0gbmV3IFNwcmluZ0NtZExpbmVPcHRpb25TdG9yZSgKKyAgICAgICAgICAgIFNQUklOR19PUFRJT05fQ09ORklHKTsKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zID0gc3RvcmUubG9hZFN1cHBvcnRlZE9wdGlvbnMoKTsKKyAgICAgIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSBhY3Rpb25TdG9yZSA9IG5ldyBTcHJpbmdDbWRMaW5lQWN0aW9uU3RvcmUoCisgICAgICAgICAgICBTUFJJTkdfQUNUSU9OX0NPTkZJRyk7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IGFjdGlvblN0b3JlLmxvYWRTdXBwb3J0ZWRBY3Rpb25zKCk7CisKKyAgICAgIC8vIExvYWQgUHJpbnRIZWxsb1dvcmxkQWN0aW9uCisgICAgICBQcmludE1lc3NhZ2VBY3Rpb24gcHJpbnRIZWxsb1dvcmxkQWN0aW9uID0gKFByaW50TWVzc2FnZUFjdGlvbikgZmluZEFjdGlvbigKKyAgICAgICAgICAgICJQcmludE1lc3NhZ2VBY3Rpb24iLCBhY3Rpb25zKTsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBwcmludEhlbGxvV29ybGRPcHRpb24gPSAoQWR2YW5jZWRDbWRMaW5lT3B0aW9uKSBnZXRPcHRpb25CeU5hbWUoCisgICAgICAgICAgICAicHJpbnRIZWxsb1dvcmxkIiwgb3B0aW9ucyk7CisgICAgICBwcmludEhlbGxvV29ybGRPcHRpb24uZ2V0SGFuZGxlcigpLmhhbmRsZU9wdGlvbihwcmludEhlbGxvV29ybGRBY3Rpb24sCisgICAgICAgICAgICBjcmVhdGVPcHRpb25JbnN0YW5jZShwcmludEhlbGxvV29ybGRPcHRpb24pKTsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIHByaW50SGVsbG9Xb3JsZEFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3RBbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YSBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9UZXN0QWxsb3dlZEFyZ3NDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1NGRkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9UZXN0QWxsb3dlZEFyZ3NDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3I7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZVNpbXBsZU9wdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdDsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEFsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvcn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdEludGlhbFN0YXRlKCkgeworICAgICAgLy8gVGVzdCBubyBudWxsIG9wdGlvbiBpbnN0YW5jZSBhbGxvd2VkLgorICAgICAgdHJ5IHsKKyAgICAgICAgIG5ldyBBbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IoKS52YWxpZGF0ZShudWxsKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsgLyogZXhwZWN0IHRocm93ICovCisgICAgICB9CisKKyAgICAgIC8vIFRlc3Qgbm8gYWxsb3dlZCBhcmdzIHNldCBhbmQgdmFsaWQgb3B0aW9uIGluc3RhbmNlCisgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgaW5zdGFuY2UgPSBjcmVhdGVPcHRpb25JbnN0YW5jZSgKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSwgInZhbHVlIik7CisgICAgICBhc3NlcnRFcXVhbHMoUmVzdWx0LkdyYWRlLkZBSUwsIG5ldyBBbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IoKQorICAgICAgICAgICAgLnZhbGlkYXRlKGluc3RhbmNlKS5nZXRHcmFkZSgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgQWxsb3dlZEFyZ3NDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBBbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IoKTsKKyAgICAgIHZhbGlkYXRvci5zZXRBbGxvd2VkQXJncyhMaXN0cy5uZXdBcnJheUxpc3QoInZhbHVlMSIsICJ2YWx1ZTIiKSk7CisKKyAgICAgIC8vIFRlc3Qgbm8gbnVsbCBvcHRpb24gaW5zdGFuY2UgYWxsb3dlZC4KKyAgICAgIHRyeSB7CisgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUobnVsbCk7CisgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7IC8qIGV4cGVjdCB0aHJvdyAqLworICAgICAgfQorCisgICAgICAvLyBUZXN0IHNob3VsZCBmYWlsIGNhc2UuCisgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgaW5zdGFuY2UgPSBjcmVhdGVPcHRpb25JbnN0YW5jZSgKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSwgInZhbHVlIik7CisgICAgICBhc3NlcnRFcXVhbHMoUmVzdWx0LkdyYWRlLkZBSUwsIHZhbGlkYXRvci52YWxpZGF0ZShpbnN0YW5jZSkuZ2V0R3JhZGUoKSk7CisKKyAgICAgIC8vIFRlc3Qgc2hvdWxkIHBhc3MgY2FzZS4KKyAgICAgIGluc3RhbmNlID0gY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLAorICAgICAgICAgICAgInZhbHVlMSIpOworICAgICAgYXNzZXJ0RXF1YWxzKFJlc3VsdC5HcmFkZS5QQVNTLCB2YWxpZGF0b3IudmFsaWRhdGUoaW5zdGFuY2UpLmdldEdyYWRlKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3RBcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvVGVzdEFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNiNjZiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3RBcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3I7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZVNpbXBsZU9wdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQ7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBBcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDYXNlKCkgeworICAgICAgLy8gVGVzdCBudWxsIG9wdGlvbiBpbnN0YW5jZCBub3QgYWxsb3dlZC4KKyAgICAgIHRyeSB7CisgICAgICAgICBuZXcgQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvcigpLnZhbGlkYXRlKG51bGwpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8KKyAgICAgIH0KKworICAgICAgLy8gVGVzdCBubyBhbGxvd2VkIGFyZ3Mgc2V0IGFuZCB2YWxpZCBvcHRpb24gaW5zdGFuY2UKKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBpbnN0YW5jZSA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLCAidmFsdWUiKTsKKyAgICAgIGFzc2VydEVxdWFscyhSZXN1bHQuR3JhZGUuRkFJTCwgbmV3IEFsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvcigpCisgICAgICAgICAgICAudmFsaWRhdGUoaW5zdGFuY2UpLmdldEdyYWRlKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB7CisgICAgICBBcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBBcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yKCk7CisgICAgICB2YWxpZGF0b3Iuc2V0QWxsb3dlZEFyZ3MoTGlzdHMubmV3QXJyYXlMaXN0KCJ2Lio/MSIsICJ2Lio/MiIpKTsKKworICAgICAgLy8gVGVzdCBubyBudWxsIG9wdGlvbiBpbnN0YW5jZSBhbGxvd2VkLgorICAgICAgdHJ5IHsKKyAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShudWxsKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsgLyogZXhwZWN0IHRocm93ICovCisgICAgICB9CisKKyAgICAgIC8vIFRlc3Qgc2hvdWxkIGZhaWwgY2FzZS4KKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBpbnN0YW5jZSA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLCAidmFsdWUiKTsKKyAgICAgIGFzc2VydEVxdWFscyhSZXN1bHQuR3JhZGUuRkFJTCwgdmFsaWRhdG9yLnZhbGlkYXRlKGluc3RhbmNlKS5nZXRHcmFkZSgpKTsKKworICAgICAgLy8gVGVzdCBzaG91bGQgcGFzcyBjYXNlLgorICAgICAgaW5zdGFuY2UgPSBjcmVhdGVPcHRpb25JbnN0YW5jZShjcmVhdGVTaW1wbGVPcHRpb24oInRlc3QiLCBmYWxzZSksCisgICAgICAgICAgICAidmFsdWUxIik7CisgICAgICBhc3NlcnRFcXVhbHMoUmVzdWx0LkdyYWRlLlBBU1MsIHZhbGlkYXRvci52YWxpZGF0ZShpbnN0YW5jZSkuZ2V0R3JhZGUoKSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL29wdGlvbi92YWxpZGF0b3IvVGVzdENsYXNzRXhpc3RzQ21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3RDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmFiZjlmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3RDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvcjsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlU2ltcGxlT3B0aW9uOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNsYXNzRXhpc3RzQ21kTGluZU9wdGlvblZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNtZExpbmVPcHRpb25WYWxpZGF0b3IuUmVzdWx0OworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3J9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHsKKyAgICAgIC8vIENoZWNrIG51bGwgb3B0aW9uIGluc3RhbmNlIG5vdCBhbGxvd2VkLgorICAgICAgdHJ5IHsKKyAgICAgICAgIG5ldyBDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IoKS52YWxpZGF0ZShudWxsKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsgLyogZXhwZWN0IHRocm93ICovCisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZhaWwgY2FzZS4KKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBpbnN0YW5jZSA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLCAiYm9ndXMiKTsKKyAgICAgIGFzc2VydEVxdWFscyhSZXN1bHQuR3JhZGUuRkFJTCwgbmV3IENsYXNzRXhpc3RzQ21kTGluZU9wdGlvblZhbGlkYXRvcigpCisgICAgICAgICAgICAudmFsaWRhdGUoaW5zdGFuY2UpLmdldEdyYWRlKCkpOworCisgICAgICAvLyBDaGVjayBwYXNzIGNhc2UuCisgICAgICBpbnN0YW5jZSA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSwKKyAgICAgICAgICAgICJqYXZhLmxhbmcuU3RyaW5nIik7CisgICAgICBhc3NlcnRFcXVhbHMoUmVzdWx0LkdyYWRlLlBBU1MsIG5ldyBDbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IoKQorICAgICAgICAgICAgLnZhbGlkYXRlKGluc3RhbmNlKS5nZXRHcmFkZSgpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9UZXN0RmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3RGaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NWY0NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9UZXN0RmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yOworCisvL09PRFQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsLlRlc3RVdGlscy5jcmVhdGVPcHRpb25JbnN0YW5jZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsLlRlc3RVdGlscy5jcmVhdGVTaW1wbGVPcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5GaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQ21kTGluZU9wdGlvblZhbGlkYXRvci5SZXN1bHQ7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3J9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RGaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgLy8gVGVzdCBudWxsIG9wdGlvbiBpbnN0YW5jZSBub3QgYWxsb3dlZC4KKyAgICAgIHRyeSB7CisgICAgICAgICBuZXcgRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvcigpLnZhbGlkYXRlKG51bGwpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8KKyAgICAgIH0KKworICAgICAgLy8gVGVzdCBmYWlsIGNhc2UuCisgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgaW5zdGFuY2UgPSBjcmVhdGVPcHRpb25JbnN0YW5jZSgKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSwgImJvZ3VzIik7CisgICAgICBhc3NlcnRFcXVhbHMoUmVzdWx0LkdyYWRlLkZBSUwsIG5ldyBGaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yKCkKKyAgICAgICAgICAgIC52YWxpZGF0ZShpbnN0YW5jZSkuZ2V0R3JhZGUoKSk7CisKKyAgICAgIC8vIFRlc3QgcGFzcyBjYXNlLgorICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJvZ3VzIiwgImJvZ3VzIik7CisgICAgICB0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKKyAgICAgIGluc3RhbmNlID0gY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLAorICAgICAgICAgICAgdGVtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFJlc3VsdC5HcmFkZS5QQVNTLCBuZXcgRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvcigpCisgICAgICAgICAgICAudmFsaWRhdGUoaW5zdGFuY2UpLmdldEdyYWRlKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9vcHRpb24vdmFsaWRhdG9yL1Rlc3ROb1Jlc3RyaWN0aW9uc0NtZExpbmVPcHRpb25WYWxpZGF0b3IuamF2YSBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9UZXN0Tm9SZXN0cmljdGlvbnNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1ZWY5YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvb3B0aW9uL3ZhbGlkYXRvci9UZXN0Tm9SZXN0cmljdGlvbnNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3I7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZVNpbXBsZU9wdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5Ob1Jlc3RyaWN0aW9uc0NtZExpbmVPcHRpb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbWRMaW5lT3B0aW9uVmFsaWRhdG9yLlJlc3VsdDsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgTm9SZXN0cmljdGlvbnNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Tm9SZXN0cmljdGlvbnNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB7CisgICAgICAvLyBUZXN0IHBhc3MgZm9yIG51bGwgb3B0aW9uIGluc3RhbmNlLgorICAgICAgYXNzZXJ0RXF1YWxzKFJlc3VsdC5HcmFkZS5QQVNTLAorICAgICAgICAgICAgbmV3IE5vUmVzdHJpY3Rpb25zQ21kTGluZU9wdGlvblZhbGlkYXRvcigpLnZhbGlkYXRlKG51bGwpCisgICAgICAgICAgICAgICAgICAuZ2V0R3JhZGUoKSk7CisKKyAgICAgIC8vIFRlc3QgcGFzcyBmb3Igbm90IG51bGwgb3B0aW9uIGluc3RhbmNlLgorICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIGluc3RhbmNlID0gY3JlYXRlT3B0aW9uSW5zdGFuY2UoCisgICAgICAgICAgICBjcmVhdGVTaW1wbGVPcHRpb24oInRlc3QiLCBmYWxzZSksICJib2d1cyIpOworICAgICAgYXNzZXJ0RXF1YWxzKFJlc3VsdC5HcmFkZS5QQVNTLAorICAgICAgICAgICAgbmV3IE5vUmVzdHJpY3Rpb25zQ21kTGluZU9wdGlvblZhbGlkYXRvcigpLnZhbGlkYXRlKGluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgLmdldEdyYWRlKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS9wYXJzZXIvVGVzdFN0ZENtZExpbmVPcHRpb25QYXJzZXIuamF2YSBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcGFyc2VyL1Rlc3RTdGRDbWRMaW5lT3B0aW9uUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4NjgzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvcGFyc2VyL1Rlc3RTdGRDbWRMaW5lT3B0aW9uUGFyc2VyLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnBhcnNlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuUGFyc2VkQXJnOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIFN0ZENtZExpbmVPcHRpb25QYXJzZXJ9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RTdGRDbWRMaW5lT3B0aW9uUGFyc2VyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyKCkgdGhyb3dzIENtZExpbmVQYXJzZXJFeGNlcHRpb24geworICAgICAgU3RyaW5nW10gYXJncyA9CisgICAgICAgICAgICAiLS1ncm91cCAtLWxpc3Qgb25lIHR3byB0aHJlZSBmb3VyIC0tc2NhbGFyIG9uZSAtLW5vbmUgLS1ncm91cCAtLWxpc3Qgb25lIC0tc2NhbGFyIG9uZSIKKyAgICAgICAgICAgICAgICAgIC5zcGxpdCgiICIpOworCisgICAgICAvLyBQYXJzZSBhcmdzLgorICAgICAgU3RkQ21kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgU3RkQ21kTGluZVBhcnNlcigpOworICAgICAgTGlzdDxQYXJzZWRBcmc+IHBhcnNlZEFyZ3MgPSBwYXJzZXIucGFyc2UoYXJncyk7CisKKyAgICAgIC8vIENoZWNrIHRoYXQgMTQgb3B0aW9uIGluc3RhbmNlcyB3aGVyZSByZXR1cm5lZC4KKyAgICAgIGFzc2VydEVxdWFscygxNCwgcGFyc2VkQXJncy5zaXplKCkpOworCisgICAgICAvLyBDaGVjayB0aGF0IGFsbCBhcmdzIHdoZXJlIGZvdW5kIGFuZCBhc3NpZ25lZCB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKyAgICAgIGFzc2VydEVxdWFscygiZ3JvdXAiLCBwYXJzZWRBcmdzLmdldCgwKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlZEFyZy5UeXBlLk9QVElPTiwgcGFyc2VkQXJncy5nZXQoMCkuZ2V0VHlwZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygibGlzdCIsIHBhcnNlZEFyZ3MuZ2V0KDEpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VkQXJnLlR5cGUuT1BUSU9OLCBwYXJzZWRBcmdzLmdldCgxKS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCBwYXJzZWRBcmdzLmdldCgyKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlZEFyZy5UeXBlLlZBTFVFLCBwYXJzZWRBcmdzLmdldCgyKS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCBwYXJzZWRBcmdzLmdldCgzKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlZEFyZy5UeXBlLlZBTFVFLCBwYXJzZWRBcmdzLmdldCgzKS5nZXRUeXBlKCkpOyAgICAgIAorICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHBhcnNlZEFyZ3MuZ2V0KDQpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VkQXJnLlR5cGUuVkFMVUUsIHBhcnNlZEFyZ3MuZ2V0KDQpLmdldFR5cGUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImZvdXIiLCBwYXJzZWRBcmdzLmdldCg1KS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlZEFyZy5UeXBlLlZBTFVFLCBwYXJzZWRBcmdzLmdldCg1KS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzY2FsYXIiLCBwYXJzZWRBcmdzLmdldCg2KS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlZEFyZy5UeXBlLk9QVElPTiwgcGFyc2VkQXJncy5nZXQoNikuZ2V0VHlwZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygib25lIiwgcGFyc2VkQXJncy5nZXQoNykuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQYXJzZWRBcmcuVHlwZS5WQUxVRSwgcGFyc2VkQXJncy5nZXQoNykuZ2V0VHlwZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygibm9uZSIsIHBhcnNlZEFyZ3MuZ2V0KDgpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VkQXJnLlR5cGUuT1BUSU9OLCBwYXJzZWRBcmdzLmdldCg4KS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJncm91cCIsIHBhcnNlZEFyZ3MuZ2V0KDkpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VkQXJnLlR5cGUuT1BUSU9OLCBwYXJzZWRBcmdzLmdldCg5KS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJsaXN0IiwgcGFyc2VkQXJncy5nZXQoMTApLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VkQXJnLlR5cGUuT1BUSU9OLCBwYXJzZWRBcmdzLmdldCgxMCkuZ2V0VHlwZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygib25lIiwgcGFyc2VkQXJncy5nZXQoMTEpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VkQXJnLlR5cGUuVkFMVUUsIHBhcnNlZEFyZ3MuZ2V0KDExKS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzY2FsYXIiLCBwYXJzZWRBcmdzLmdldCgxMikuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQYXJzZWRBcmcuVHlwZS5PUFRJT04sIHBhcnNlZEFyZ3MuZ2V0KDEyKS5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCBwYXJzZWRBcmdzLmdldCgxMykuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQYXJzZWRBcmcuVHlwZS5WQUxVRSwgcGFyc2VkQXJncy5nZXQoMTMpLmdldFR5cGUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJc09wdGlvbigpIHsKKyAgICAgIGFzc2VydFRydWUoU3RkQ21kTGluZVBhcnNlci5pc09wdGlvbigiLS1hcmciKSk7CisgICAgICBhc3NlcnRUcnVlKFN0ZENtZExpbmVQYXJzZXIuaXNPcHRpb24oIi1hcmciKSk7CisgICAgICBhc3NlcnRGYWxzZShTdGRDbWRMaW5lUGFyc2VyLmlzT3B0aW9uKCJhcmciKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25OYW1lKCkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJhcmciLCBTdGRDbWRMaW5lUGFyc2VyLmdldE9wdGlvbk5hbWUoIi0tYXJnIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJhcmciLCBTdGRDbWRMaW5lUGFyc2VyLmdldE9wdGlvbk5hbWUoIi1hcmciKSk7CisgICAgICBhc3NlcnROdWxsKFN0ZENtZExpbmVQYXJzZXIuZ2V0T3B0aW9uTmFtZSgiYXJnIikpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS90ZXN0L3V0aWwvVGVzdE91dHB1dFN0cmVhbS5qYXZhIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS90ZXN0L3V0aWwvVGVzdE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDM5OTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3Rlc3QvdXRpbC9UZXN0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogVGVzdCB7QGxpbmsgT3V0cHV0U3RyZWFtfSB3aGljaCB3cml0ZXMgZXZlcnl0aGluZyB0byBhIHtAbGluayBTdHJpbmdCdWZmZXJ9CisgKiB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHRvIHNlZSB3aGF0IHdhcyB3cml0dGVuLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjaGFyYWN0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBzYi5hcHBlbmQoKGNoYXIpIGNoYXJhY3Rlcik7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS90ZXN0L3V0aWwvVGVzdFNldENvbnRleHRJbmplY3RUeXBlQWN0aW9uLmphdmEgYi8wLjEwL2NsaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY2xpL3Rlc3QvdXRpbC9UZXN0U2V0Q29udGV4dEluamVjdFR5cGVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU5MzRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS90ZXN0L3V0aWwvVGVzdFNldENvbnRleHRJbmplY3RUeXBlQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nLlNwcmluZ1NldENvbnRleHRJbmplY3Rpb25UeXBlOworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKKworLyoqCisgKiBUZXN0IHtAbGluayBDbWRMaW5lQWN0aW9ufSBmb3IgdGVzdGluZyB7QGxpbmsgU3ByaW5nU2V0Q29udGV4dEluamVjdGlvblR5cGV9CisgKiBhcmUgaW5qZWN0ZWQgd2l0aCB0aGUge0BsaW5rIEFwcGxpY2F0aW9uQ29udGV4dH0gY29ycmVjdGx5LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RTZXRDb250ZXh0SW5qZWN0VHlwZUFjdGlvbiBleHRlbmRzIENtZExpbmVBY3Rpb24gaW1wbGVtZW50cworICAgICAgU3ByaW5nU2V0Q29udGV4dEluamVjdGlvblR5cGUgeworCisgICBwcml2YXRlIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0OworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikgeworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0KSB7CisgICAgICB0aGlzLmFwcENvbnRleHQgPSBhcHBDb250ZXh0OworICAgfQorCisgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICByZXR1cm4gYXBwQ29udGV4dDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdGVzdC91dGlsL1Rlc3RVdGlscy5qYXZhIGIvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS90ZXN0L3V0aWwvVGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1M2JiNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdGVzdC91dGlsL1Rlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5TaW1wbGVDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQ21kTGluZU9wdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuUmVxdWlyZW1lbnRSdWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLlJlcXVpcmVtZW50UnVsZS5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNtZExpbmVPcHRpb25WYWxpZGF0b3I7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIEJhc2UgVGVzdCBjYXNlIGZvciBDQVMtQ0wgdW5pdCB0ZXN0cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VXRpbHMgeworCisgICBwdWJsaWMgc3RhdGljIENtZExpbmVBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gbmV3IENtZExpbmVBY3Rpb24obmFtZSwgIlRoaXMgaXMgYW4gYWN0aW9uIGRlc2NyaXB0aW9uIikgeworCisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgfQorCisgICAgICB9OworICAgfQorCisgICBwdWJsaWMgc3RhdGljIEdyb3VwQ21kTGluZU9wdGlvbiBjcmVhdGVHcm91cE9wdGlvbihTdHJpbmcgbG9uZ05hbWUsCisgICAgICAgICBib29sZWFuIHJlcXVpcmVkKSB7CisgICAgICBHcm91cENtZExpbmVPcHRpb24gb3B0aW9uID0gbmV3IEdyb3VwQ21kTGluZU9wdGlvbigpOworICAgICAgb3B0aW9uLnNldExvbmdPcHRpb24obG9uZ05hbWUpOworICAgICAgb3B0aW9uLnNldFNob3J0T3B0aW9uKGxvbmdOYW1lKTsKKyAgICAgIG9wdGlvbi5zZXRSZXF1aXJlZChyZXF1aXJlZCk7CisgICAgICByZXR1cm4gb3B0aW9uOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIFNpbXBsZUNtZExpbmVPcHRpb24gY3JlYXRlU2ltcGxlT3B0aW9uKFN0cmluZyBsb25nTmFtZSwKKyAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgIHJldHVybiBjcmVhdGVTaW1wbGVPcHRpb24obG9uZ05hbWUsIGxvbmdOYW1lLCByZXF1aXJlZCk7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlQ21kTGluZU9wdGlvbiBjcmVhdGVTaW1wbGVPcHRpb24oU3RyaW5nIHNob3J0TmFtZSwKKyAgICAgICAgIFN0cmluZyBsb25nTmFtZSwgYm9vbGVhbiByZXF1aXJlZCkgeworICAgICAgU2ltcGxlQ21kTGluZU9wdGlvbiBvcHRpb24gPSBuZXcgU2ltcGxlQ21kTGluZU9wdGlvbigpOworICAgICAgb3B0aW9uLnNldFNob3J0T3B0aW9uKHNob3J0TmFtZSk7CisgICAgICBvcHRpb24uc2V0TG9uZ09wdGlvbihsb25nTmFtZSk7CisgICAgICBvcHRpb24uc2V0UmVxdWlyZWQocmVxdWlyZWQpOworICAgICAgcmV0dXJuIG9wdGlvbjsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBTaW1wbGVDbWRMaW5lT3B0aW9uIGNyZWF0ZVNpbXBsZU9wdGlvbihTdHJpbmcgbG9uZ05hbWUsCisgICAgICAgICBSZXF1aXJlbWVudFJ1bGUgcnVsZSkgeworICAgICAgcmV0dXJuIGNyZWF0ZVNpbXBsZU9wdGlvbihsb25nTmFtZSwgbG9uZ05hbWUsIHJ1bGUpOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIFNpbXBsZUNtZExpbmVPcHRpb24gY3JlYXRlU2ltcGxlT3B0aW9uKFN0cmluZyBzaG9ydE5hbWUsCisgICAgICAgICBTdHJpbmcgbG9uZ05hbWUsIFJlcXVpcmVtZW50UnVsZSBydWxlKSB7CisgICAgICBTaW1wbGVDbWRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBTaW1wbGVDbWRMaW5lT3B0aW9uKCk7CisgICAgICBvcHRpb24uc2V0U2hvcnRPcHRpb24oc2hvcnROYW1lKTsKKyAgICAgIG9wdGlvbi5zZXRMb25nT3B0aW9uKGxvbmdOYW1lKTsKKyAgICAgIG9wdGlvbi5zZXRSZXF1aXJlbWVudFJ1bGVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocnVsZSkpOworICAgICAgcmV0dXJuIG9wdGlvbjsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBBZHZhbmNlZENtZExpbmVPcHRpb24gY3JlYXRlQWR2YW5jZWRPcHRpb24oU3RyaW5nIGxvbmdOYW1lLAorICAgICAgICAgQ21kTGluZU9wdGlvbkhhbmRsZXIgaGFuZGxlcikgeworICAgICAgcmV0dXJuIGNyZWF0ZUFkdmFuY2VkT3B0aW9uKGxvbmdOYW1lLCBsb25nTmFtZSwgaGFuZGxlcik7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIGNyZWF0ZUFkdmFuY2VkT3B0aW9uKFN0cmluZyBzaG9ydE5hbWUsCisgICAgICAgICBTdHJpbmcgbG9uZ05hbWUsIENtZExpbmVPcHRpb25IYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBvcHRpb24gPSBuZXcgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKCk7CisgICAgICBvcHRpb24uc2V0U2hvcnRPcHRpb24oc2hvcnROYW1lKTsKKyAgICAgIG9wdGlvbi5zZXRMb25nT3B0aW9uKGxvbmdOYW1lKTsKKyAgICAgIG9wdGlvbi5zZXRIYW5kbGVyKGhhbmRsZXIpOworICAgICAgcmV0dXJuIG9wdGlvbjsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBBZHZhbmNlZENtZExpbmVPcHRpb24gY3JlYXRlVmFsaWRhdGlvbk9wdGlvbihTdHJpbmcgbG9uZ05hbWUsCisgICAgICAgICBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yLi4uIHZhbGlkYXRvcnMpIHsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBvcHRpb24gPSBuZXcgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKCk7CisgICAgICBvcHRpb24uc2V0TG9uZ09wdGlvbihsb25nTmFtZSk7CisgICAgICBvcHRpb24uc2V0U2hvcnRPcHRpb24obG9uZ05hbWUpOworICAgICAgb3B0aW9uLnNldFZhbGlkYXRvcnMoTGlzdHMubmV3QXJyYXlMaXN0KHZhbGlkYXRvcnMpKTsKKyAgICAgIHJldHVybiBvcHRpb247CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uQ21kTGluZU9wdGlvbiBjcmVhdGVBY3Rpb25PcHRpb24oU3RyaW5nIGxvbmdOYW1lKSB7CisgICAgICBBY3Rpb25DbWRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBBY3Rpb25DbWRMaW5lT3B0aW9uKCk7CisgICAgICBvcHRpb24uc2V0TG9uZ09wdGlvbihsb25nTmFtZSk7CisgICAgICBvcHRpb24uc2V0U2hvcnRPcHRpb24obG9uZ05hbWUpOworICAgICAgcmV0dXJuIG9wdGlvbjsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgY3JlYXRlT3B0aW9uSW5zdGFuY2UoCisgICAgICAgICBDbWRMaW5lT3B0aW9uIG9wdGlvbiwgU3RyaW5nLi4uIHZhbHVlcykgeworICAgICAgcmV0dXJuIG5ldyBDbWRMaW5lT3B0aW9uSW5zdGFuY2Uob3B0aW9uLCBMaXN0cy5uZXdBcnJheUxpc3QodmFsdWVzKSk7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgUmVxdWlyZW1lbnRSdWxlIGNyZWF0ZVJlcXVpcmVkUmVxdWlyZW1lbnRSdWxlKAorICAgICAgICAgQ21kTGluZUFjdGlvbiBhY3Rpb24pIHsKKyAgICAgIEFjdGlvbkRlcGVuZGVuY3lSdWxlIHJ1bGUgPSBuZXcgQWN0aW9uRGVwZW5kZW5jeVJ1bGUoKTsKKyAgICAgIHJ1bGUuc2V0QWN0aW9uTmFtZShhY3Rpb24uZ2V0TmFtZSgpKTsKKyAgICAgIHJ1bGUuc2V0UmVsYXRpb24oUmVsYXRpb24uUkVRVUlSRUQpOworICAgICAgcmV0dXJuIHJ1bGU7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgUmVxdWlyZW1lbnRSdWxlIGNyZWF0ZU9wdGlvbmFsUmVxdWlyZW1lbnRSdWxlKAorICAgICAgICAgQ21kTGluZUFjdGlvbiBhY3Rpb24pIHsKKyAgICAgIEFjdGlvbkRlcGVuZGVuY3lSdWxlIHJ1bGUgPSBuZXcgQWN0aW9uRGVwZW5kZW5jeVJ1bGUoKTsKKyAgICAgIHJ1bGUuc2V0QWN0aW9uTmFtZShhY3Rpb24uZ2V0TmFtZSgpKTsKKyAgICAgIHJ1bGUuc2V0UmVsYXRpb24oUmVsYXRpb24uT1BUSU9OQUwpOworICAgICAgcmV0dXJuIHJ1bGU7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgQXBwbHlUb0FjdGlvbkhhbmRsZXIgY3JlYXRlQXBwbHlUb0FjdGlvbkhhbmRsZXIoCisgICAgICAgICBTdHJpbmcgYWN0aW9uTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgIEFwcGx5VG9BY3Rpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbHlUb0FjdGlvbkhhbmRsZXIoKTsKKyAgICAgIGhhbmRsZXIuc2V0QXBwbHlUb0FjdGlvbnMoTGlzdHMubmV3QXJyYXlMaXN0KG5ldyBBcHBseVRvQWN0aW9uKAorICAgICAgICAgICAgYWN0aW9uTmFtZSwgbWV0aG9kTmFtZSkpKTsKKyAgICAgIHJldHVybiBoYW5kbGVyOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL1Rlc3RDbWRMaW5lSXRlcmFibGUuamF2YSBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9UZXN0Q21kTGluZUl0ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNzVlMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9UZXN0Q21kTGluZUl0ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnBhcnNlci5TdGRDbWRMaW5lUGFyc2VyOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEFyZ3N9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RDbWRMaW5lSXRlcmFibGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX1NUUklORyA9ICItLW9wZXJhdGlvbiBkb3dubG9hZCAtLXVybCBodHRwOi8vc29tZXdoZXJlLmNvbSAtLXVzZXIgZm9vIC0tcGFzcyBiYXIgLS10b0RpciAvdG1wIjsKKworICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdGlvbigpIHRocm93cyBDbWRMaW5lUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgIFN0cmluZ0J1ZmZlciBhcmdzU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICBDbWRMaW5lSXRlcmFibGU8UGFyc2VkQXJnPiBhcmdzID0gY3JlYXRlQXJncygpOworICAgICAgZm9yIChQYXJzZWRBcmcgYXJnIDogYXJncykgeworICAgICAgICAgaWYgKGFyZy5nZXRUeXBlKCkuZXF1YWxzKFBhcnNlZEFyZy5UeXBlLk9QVElPTikpIHsKKyAgICAgICAgICAgIGFyZ3NTdHJpbmcuYXBwZW5kKCItLSIpOworICAgICAgICAgfQorICAgICAgICAgYXJnc1N0cmluZy5hcHBlbmQoYXJnLmdldE5hbWUoKSkuYXBwZW5kKCIgIik7CisgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICBmb3IgKFBhcnNlZEFyZyBhcmdJbm5lciA6IGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChhcmdJbm5lci5nZXRUeXBlKCkuZXF1YWxzKFBhcnNlZEFyZy5UeXBlLk9QVElPTikpIHsKKyAgICAgICAgICAgICAgIGFyZ3NTdHJpbmcuYXBwZW5kKCItLSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnc1N0cmluZy5hcHBlbmQoYXJnSW5uZXIuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIGlmIChpKysgPiAxKSB7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGFyZyA9IGFyZ3MuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICBpZiAoYXJnLmdldFR5cGUoKS5lcXVhbHMoUGFyc2VkQXJnLlR5cGUuT1BUSU9OKSkgeworICAgICAgICAgICAgYXJnc1N0cmluZy5hcHBlbmQoIi0tIik7CisgICAgICAgICB9CisgICAgICAgICBhcmdzU3RyaW5nLmFwcGVuZChhcmcuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKworICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoQVJHU19TVFJJTkcuc3BsaXQoIiAiKSksCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGFyZ3NTdHJpbmcudG9TdHJpbmcoKS5zcGxpdCgiICIpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgdGhyb3dzIENtZExpbmVQYXJzZXJFeGNlcHRpb24geworICAgICAgQ21kTGluZUl0ZXJhYmxlPFBhcnNlZEFyZz4gYXJncyA9IG5ldyBDbWRMaW5lSXRlcmFibGU8UGFyc2VkQXJnPigKKyAgICAgICAgICAgIG5ldyBTdGRDbWRMaW5lUGFyc2VyKCkucGFyc2UobmV3IFN0cmluZ1tdIHt9KSk7CisgICAgICB0cnkgeworICAgICAgICAgYXJncy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlnbm9yZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8KKyAgICAgIH0KKyAgIH0KKworICAgcHJpdmF0ZSBDbWRMaW5lSXRlcmFibGU8UGFyc2VkQXJnPiBjcmVhdGVBcmdzKCkgdGhyb3dzIENtZExpbmVQYXJzZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIG5ldyBDbWRMaW5lSXRlcmFibGU8UGFyc2VkQXJnPigKKyAgICAgICAgICAgIG5ldyBTdGRDbWRMaW5lUGFyc2VyKCkucGFyc2UoQVJHU19TVFJJTkcuc3BsaXQoIiAiKSkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jbGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NsaS91dGlsL1Rlc3RDbWRMaW5lVXRpbHMuamF2YSBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9UZXN0Q21kTGluZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZTljYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jbGkvdXRpbC9UZXN0Q21kTGluZVV0aWxzLmphdmEKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsOworCisvL09PRFQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudGVzdC51dGlsLlRlc3RVdGlscy5jcmVhdGVBY3Rpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnRlc3QudXRpbC5UZXN0VXRpbHMuY3JlYXRlQWN0aW9uT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZUFkdmFuY2VkT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZUdyb3VwT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZU9wdGlvbmFsUmVxdWlyZW1lbnRSdWxlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZVJlcXVpcmVkUmVxdWlyZW1lbnRSdWxlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzLmNyZWF0ZVNpbXBsZU9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZGV0ZXJtaW5lRmFpbGVkVmFsaWRhdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZEZpcnN0QWN0aW9uT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5maW5kU3BlY2lmaWVkQWN0aW9uT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLkNtZExpbmVVdGlscy5maW5kU3BlY2lmaWVkSGVscE9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMuZmluZFNwZWNpZmllZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5DbWRMaW5lVXRpbHMudmFsaWRhdGU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkhlbHBDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5QcmludFN1cHBvcnRlZEFjdGlvbnNDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5TaW1wbGVDbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkNtZExpbmVPcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQWxsb3dlZEFyZ3NDbWRMaW5lT3B0aW9uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQ21kTGluZU9wdGlvblZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLnV0aWwuQ21kTGluZVV0aWxzOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIENtZExpbmVVdGlsc30uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdENtZExpbmVVdGlscyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdERldGVybWluZVJlcXVpcmVkKCkgeworICAgICAgQ21kTGluZUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24iKTsKKyAgICAgIENtZExpbmVPcHRpb24gdXJsT3B0aW9uLCBwYXNzT3B0aW9uLCBhY3Rpb25PcHRpb247CisKKyAgICAgIEhhc2hTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgIHVybE9wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigidXJsIiwKKyAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlcXVpcmVkUmVxdWlyZW1lbnRSdWxlKGFjdGlvbikpLAorICAgICAgICAgICAgcGFzc09wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigicGFzcyIsIGZhbHNlKSwKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidXNlciIsIGZhbHNlKSwKKyAgICAgICAgICAgIGFjdGlvbk9wdGlvbiA9IGNyZWF0ZUFjdGlvbk9wdGlvbigib3BlcmF0aW9uIikpOworCisgICAgICBTZXQ8Q21kTGluZU9wdGlvbj4gcmVxdWlyZWRPcHRpb25zID0gQ21kTGluZVV0aWxzLmRldGVybWluZVJlcXVpcmVkKAorICAgICAgICAgICAgYWN0aW9uLCBvcHRpb25zKTsKKyAgICAgIGFzc2VydEVxdWFscyhTZXRzLm5ld0hhc2hTZXQodXJsT3B0aW9uLCBhY3Rpb25PcHRpb24pLCByZXF1aXJlZE9wdGlvbnMpOworCisgICAgICBvcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgdXJsT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJ1cmwiLAorICAgICAgICAgICAgICAgICAgY3JlYXRlUmVxdWlyZWRSZXF1aXJlbWVudFJ1bGUoYWN0aW9uKSksCisgICAgICAgICAgICBwYXNzT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJwYXNzIiwgdHJ1ZSksCisgICAgICAgICAgICBjcmVhdGVTaW1wbGVPcHRpb24oInVzZXIiLCBmYWxzZSksCisgICAgICAgICAgICBhY3Rpb25PcHRpb24gPSBjcmVhdGVBY3Rpb25PcHRpb24oIm9wZXJhdGlvbiIpKTsKKworICAgICAgcmVxdWlyZWRPcHRpb25zID0gQ21kTGluZVV0aWxzLmRldGVybWluZVJlcXVpcmVkKGFjdGlvbiwgb3B0aW9ucyk7CisgICAgICBhc3NlcnRFcXVhbHMoU2V0cy5uZXdIYXNoU2V0KHVybE9wdGlvbiwgcGFzc09wdGlvbiwgYWN0aW9uT3B0aW9uKSwKKyAgICAgICAgICAgIHJlcXVpcmVkT3B0aW9ucyk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlcXVpcmVkKCkgeworICAgICAgQ21kTGluZUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24iKTsKKyAgICAgIGFzc2VydFRydWUoQ21kTGluZVV0aWxzLmlzUmVxdWlyZWQoYWN0aW9uLAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ1cmwiLCBjcmVhdGVSZXF1aXJlZFJlcXVpcmVtZW50UnVsZShhY3Rpb24pKSkpOworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMuaXNSZXF1aXJlZChhY3Rpb24sCisgICAgICAgICAgICBjcmVhdGVTaW1wbGVPcHRpb24oInVybCIsIHRydWUpKSk7CisgICAgICBhc3NlcnRGYWxzZShDbWRMaW5lVXRpbHMuaXNSZXF1aXJlZChhY3Rpb24sCisgICAgICAgICAgICBjcmVhdGVTaW1wbGVPcHRpb24oInVybCIsIGZhbHNlKSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5lT3B0aW9uYWwoKSB7CisgICAgICBDbWRMaW5lQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFjdGlvbigiVGVzdEFjdGlvbiIpOworICAgICAgQ21kTGluZU9wdGlvbiBhY3Rpb25PcHRpb24gPSBuZXcgQWN0aW9uQ21kTGluZU9wdGlvbigpOworICAgICAgQ21kTGluZU9wdGlvbiBwYXNzT3B0aW9uLCB1c2VyT3B0aW9uOworCisgICAgICBIYXNoU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICBjcmVhdGVTaW1wbGVPcHRpb24oInVybCIsIGNyZWF0ZVJlcXVpcmVkUmVxdWlyZW1lbnRSdWxlKGFjdGlvbikpLAorICAgICAgICAgICAgcGFzc09wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigicGFzcyIsIGZhbHNlKSwKKyAgICAgICAgICAgIHVzZXJPcHRpb24gPSBjcmVhdGVTaW1wbGVPcHRpb24oInVzZXIiLCBmYWxzZSksIGFjdGlvbk9wdGlvbik7CisKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25hbE9wdGlvbnMgPSBDbWRMaW5lVXRpbHMuZGV0ZXJtaW5lT3B0aW9uYWwoCisgICAgICAgICAgICBhY3Rpb24sIG9wdGlvbnMpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wdGlvbmFsT3B0aW9ucy5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFNldHMubmV3SGFzaFNldChwYXNzT3B0aW9uLCB1c2VyT3B0aW9uKSwgb3B0aW9uYWxPcHRpb25zKTsKKworICAgICAgb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldChjcmVhdGVTaW1wbGVPcHRpb24oInBhc3MiLCB0cnVlKSwKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidXNlciIsIHRydWUpLCBhY3Rpb25PcHRpb24pOworCisgICAgICBvcHRpb25hbE9wdGlvbnMgPSBDbWRMaW5lVXRpbHMuZGV0ZXJtaW5lT3B0aW9uYWwoYWN0aW9uLCBvcHRpb25zKTsKKyAgICAgIGFzc2VydFRydWUob3B0aW9uYWxPcHRpb25zLmlzRW1wdHkoKSk7CisKKyAgICAgIG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICBwYXNzT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJwYXNzIiwKKyAgICAgICAgICAgICAgICAgIGNyZWF0ZU9wdGlvbmFsUmVxdWlyZW1lbnRSdWxlKGFjdGlvbikpLAorICAgICAgICAgICAgdXNlck9wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigidXNlciIsCisgICAgICAgICAgICAgICAgICBjcmVhdGVPcHRpb25hbFJlcXVpcmVtZW50UnVsZShhY3Rpb24pKSwgYWN0aW9uT3B0aW9uKTsKKworICAgICAgb3B0aW9uYWxPcHRpb25zID0gQ21kTGluZVV0aWxzLmRldGVybWluZU9wdGlvbmFsKGFjdGlvbiwgb3B0aW9ucyk7CisgICAgICBhc3NlcnRFcXVhbHMoU2V0cy5uZXdIYXNoU2V0KHBhc3NPcHRpb24sIHVzZXJPcHRpb24pLCBvcHRpb25hbE9wdGlvbnMpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0SXNPcHRpb25hbCgpIHsKKyAgICAgIENtZExpbmVBY3Rpb24gYWN0aW9uID0gY3JlYXRlQWN0aW9uKCJUZXN0QWN0aW9uIik7CisgICAgICBhc3NlcnRUcnVlKENtZExpbmVVdGlscy5pc09wdGlvbmFsKGFjdGlvbiwKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidXJsIiwgY3JlYXRlT3B0aW9uYWxSZXF1aXJlbWVudFJ1bGUoYWN0aW9uKSkpKTsKKyAgICAgIGFzc2VydEZhbHNlKENtZExpbmVVdGlscy5pc09wdGlvbmFsKGFjdGlvbiwKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidXJsIiwgdHJ1ZSkpKTsKKyAgICAgIGFzc2VydFRydWUoQ21kTGluZVV0aWxzLmlzT3B0aW9uYWwoYWN0aW9uLAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ1cmwiLCBmYWxzZSkpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkT3B0aW9ucygpIHsKKyAgICAgIENtZExpbmVPcHRpb24gdXJsT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJ1cmwiLCB0cnVlKTsKKyAgICAgIEhhc2hTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCh1cmxPcHRpb24sCisgICAgICAgICAgICBjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpLCBjcmVhdGVTaW1wbGVPcHRpb24oInVzZXIiLCBmYWxzZSksCisgICAgICAgICAgICBjcmVhdGVTaW1wbGVPcHRpb24oInBhc3MiLCBmYWxzZSkpOworCisgICAgICBhc3NlcnRFcXVhbHMoU2V0cy5uZXdIYXNoU2V0KHVybE9wdGlvbiksCisgICAgICAgICAgICBDbWRMaW5lVXRpbHMuZ2V0UmVxdWlyZWRPcHRpb25zKG9wdGlvbnMpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkT3B0aW9uc0RvTm90SWdub3JlQWN0aW9uT3B0aW9ucygpIHsKKyAgICAgIENtZExpbmVPcHRpb24gYWN0aW9uT3B0aW9uLCB1cmxPcHRpb247CisgICAgICBIYXNoU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICBhY3Rpb25PcHRpb24gPSBjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpLAorICAgICAgICAgICAgdXJsT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJ1cmwiLCB0cnVlKSwKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigidXNlciIsIGZhbHNlKSwKKyAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9wdGlvbigicGFzcyIsIGZhbHNlKSk7CisKKyAgICAgIGFjdGlvbk9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKKyAgICAgIGFzc2VydEVxdWFscyhTZXRzLm5ld0hhc2hTZXQoYWN0aW9uT3B0aW9uLCB1cmxPcHRpb24pLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmdldFJlcXVpcmVkT3B0aW9ucyhvcHRpb25zLCBmYWxzZSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0U29ydE9wdGlvbnNCeVJlcXVpcmVkU3RhdHVzKCkgeworICAgICAgQ21kTGluZUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBY3Rpb24oImFjdGlvbiIpOworICAgICAgQ21kTGluZU9wdGlvbiB1c2VyT3B0aW9uLCB1cmxPcHRpb24sIHBhc3NPcHRpb24sIGFjdGlvbk9wdGlvbjsKKyAgICAgIEhhc2hTZXQ8Q21kTGluZU9wdGlvbj4gb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgIHVzZXJPcHRpb24gPSBjcmVhdGVTaW1wbGVPcHRpb24oInVzZXIiLCBmYWxzZSksCisgICAgICAgICAgICB1cmxPcHRpb24gPSBjcmVhdGVTaW1wbGVPcHRpb24oInVybCIsCisgICAgICAgICAgICAgICAgICBjcmVhdGVSZXF1aXJlZFJlcXVpcmVtZW50UnVsZShhY3Rpb24pKSwKKyAgICAgICAgICAgIHBhc3NPcHRpb24gPSBjcmVhdGVTaW1wbGVPcHRpb24oInBhc3MiLCBmYWxzZSksCisgICAgICAgICAgICBhY3Rpb25PcHRpb24gPSBjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpKTsKKworICAgICAgYWN0aW9uT3B0aW9uLnNldFJlcXVpcmVkKHRydWUpOworICAgICAgTGlzdDxDbWRMaW5lT3B0aW9uPiBzb3J0ZWRPcHRpb25zID0gQ21kTGluZVV0aWxzCisgICAgICAgICAgICAuc29ydE9wdGlvbnNCeVJlcXVpcmVkU3RhdHVzKG9wdGlvbnMpOworICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbnMuc2l6ZSgpLCBzb3J0ZWRPcHRpb25zLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uT3B0aW9uLCBzb3J0ZWRPcHRpb25zLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHModXJsT3B0aW9uLCBzb3J0ZWRPcHRpb25zLmdldCgxKSk7CisgICAgICBhc3NlcnRFcXVhbHMoU2V0cy5uZXdIYXNoU2V0KHVzZXJPcHRpb24sIHBhc3NPcHRpb24pLAorICAgICAgICAgICAgU2V0cy5uZXdIYXNoU2V0KHNvcnRlZE9wdGlvbnMuZ2V0KDIpLCBzb3J0ZWRPcHRpb25zLmdldCgzKSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0U29ydEFjdGlvbnMoKSB7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgIGNyZWF0ZUFjdGlvbigiVG9tIiksCisgICAgICAgICAgICBjcmVhdGVBY3Rpb24oIkJpbGwiKSwKKyAgICAgICAgICAgIGNyZWF0ZUFjdGlvbigiWW91bmciKSwKKyAgICAgICAgICAgIGNyZWF0ZUFjdGlvbigiQW5keSIpKTsKKyAgICAgIExpc3Q8Q21kTGluZUFjdGlvbj4gc29ydGVkQWN0aW9ucyA9IENtZExpbmVVdGlscy5zb3J0QWN0aW9ucyhhY3Rpb25zKTsKKyAgICAgIGFzc2VydEVxdWFscygiQW5keSIsIHNvcnRlZEFjdGlvbnMuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkJpbGwiLCBzb3J0ZWRBY3Rpb25zLmdldCgxKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUb20iLCBzb3J0ZWRBY3Rpb25zLmdldCgyKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJZb3VuZyIsIHNvcnRlZEFjdGlvbnMuZ2V0KDMpLmdldE5hbWUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25CeU5hbWUoKSB7CisgICAgICBDbWRMaW5lQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFjdGlvbigiYWN0aW9uIik7CisgICAgICBDbWRMaW5lT3B0aW9uIHVzZXJPcHRpb24sIHVybE9wdGlvbiwgcGFzc09wdGlvbiwgYWN0aW9uT3B0aW9uOworICAgICAgSGFzaFNldDxDbWRMaW5lT3B0aW9uPiBvcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgdXNlck9wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigidXNlciIsICJ1c2VybmFtZSIsIGZhbHNlKSwKKyAgICAgICAgICAgIHVybE9wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigidSIsICJ1cmwiLAorICAgICAgICAgICAgICAgICAgY3JlYXRlUmVxdWlyZWRSZXF1aXJlbWVudFJ1bGUoYWN0aW9uKSksCisgICAgICAgICAgICBwYXNzT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJwYXNzIiwgInBhc3N3b3JkIiwgZmFsc2UpLAorICAgICAgICAgICAgYWN0aW9uT3B0aW9uID0gY3JlYXRlQWN0aW9uT3B0aW9uKCJhY3Rpb24iKSk7CisKKyAgICAgIGFzc2VydEVxdWFscyh1c2VyT3B0aW9uLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZSh1c2VyT3B0aW9uLmdldFNob3J0T3B0aW9uKCksIG9wdGlvbnMpKTsKKyAgICAgIGFzc2VydEVxdWFscyh1c2VyT3B0aW9uLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZSh1c2VyT3B0aW9uLmdldExvbmdPcHRpb24oKSwgb3B0aW9ucykpOworICAgICAgYXNzZXJ0RXF1YWxzKHVybE9wdGlvbiwKKyAgICAgICAgICAgIENtZExpbmVVdGlscy5nZXRPcHRpb25CeU5hbWUodXJsT3B0aW9uLmdldFNob3J0T3B0aW9uKCksIG9wdGlvbnMpKTsKKyAgICAgIGFzc2VydEVxdWFscyh1cmxPcHRpb24sCisgICAgICAgICAgICBDbWRMaW5lVXRpbHMuZ2V0T3B0aW9uQnlOYW1lKHVybE9wdGlvbi5nZXRMb25nT3B0aW9uKCksIG9wdGlvbnMpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwYXNzT3B0aW9uLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZShwYXNzT3B0aW9uLmdldFNob3J0T3B0aW9uKCksIG9wdGlvbnMpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwYXNzT3B0aW9uLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZShwYXNzT3B0aW9uLmdldExvbmdPcHRpb24oKSwgb3B0aW9ucykpOworICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbk9wdGlvbiwgQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZSgKKyAgICAgICAgICAgIGFjdGlvbk9wdGlvbi5nZXRTaG9ydE9wdGlvbigpLCBvcHRpb25zKSk7CisgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uT3B0aW9uLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmdldE9wdGlvbkJ5TmFtZShhY3Rpb25PcHRpb24uZ2V0TG9uZ09wdGlvbigpLCBvcHRpb25zKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25JbnN0YW5jZUJ5TmFtZSgpIHsKKyAgICAgIENtZExpbmVBY3Rpb24gYWN0aW9uID0gY3JlYXRlQWN0aW9uKCJhY3Rpb24iKTsKKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSB1c2VyT3B0aW9uSW5zdCwgdXJsT3B0aW9uSW5zdCwgcGFzc09wdGlvbkluc3QsIGFjdGlvbk9wdGlvbkluc3Q7CisgICAgICBIYXNoU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gb3B0aW9uSW5zdHMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICB1c2VyT3B0aW9uSW5zdCA9IG5ldyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKAorICAgICAgICAgICAgICAgICAgInVzZXIiLCAidXNlcm5hbWUiLCBmYWxzZSksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKSwKKyAgICAgICAgICAgIHVybE9wdGlvbkluc3QgPSBuZXcgQ21kTGluZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidSIsCisgICAgICAgICAgICAgICAgICAidXJsIiwgY3JlYXRlUmVxdWlyZWRSZXF1aXJlbWVudFJ1bGUoYWN0aW9uKSksCisgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSksCisgICAgICAgICAgICBwYXNzT3B0aW9uSW5zdCA9IG5ldyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKAorICAgICAgICAgICAgICAgICAgInBhc3MiLCAicGFzc3dvcmQiLCBmYWxzZSksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKSwKKyAgICAgICAgICAgIGFjdGlvbk9wdGlvbkluc3QgPSBuZXcgQ21kTGluZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgY3JlYXRlQWN0aW9uT3B0aW9uKCJhY3Rpb24iKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJPcHRpb25JbnN0LCBDbWRMaW5lVXRpbHMuZ2V0T3B0aW9uSW5zdGFuY2VCeU5hbWUoCisgICAgICAgICAgICB1c2VyT3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRTaG9ydE9wdGlvbigpLCBvcHRpb25JbnN0cykpOworICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJPcHRpb25JbnN0LCBDbWRMaW5lVXRpbHMuZ2V0T3B0aW9uSW5zdGFuY2VCeU5hbWUoCisgICAgICAgICAgICB1c2VyT3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRMb25nT3B0aW9uKCksIG9wdGlvbkluc3RzKSk7CisgICAgICBhc3NlcnRFcXVhbHModXJsT3B0aW9uSW5zdCwgQ21kTGluZVV0aWxzLmdldE9wdGlvbkluc3RhbmNlQnlOYW1lKAorICAgICAgICAgICAgdXJsT3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRTaG9ydE9wdGlvbigpLCBvcHRpb25JbnN0cykpOworICAgICAgYXNzZXJ0RXF1YWxzKHVybE9wdGlvbkluc3QsIENtZExpbmVVdGlscy5nZXRPcHRpb25JbnN0YW5jZUJ5TmFtZSgKKyAgICAgICAgICAgIHVybE9wdGlvbkluc3QuZ2V0T3B0aW9uKCkuZ2V0TG9uZ09wdGlvbigpLCBvcHRpb25JbnN0cykpOworICAgICAgYXNzZXJ0RXF1YWxzKHBhc3NPcHRpb25JbnN0LCBDbWRMaW5lVXRpbHMuZ2V0T3B0aW9uSW5zdGFuY2VCeU5hbWUoCisgICAgICAgICAgICBwYXNzT3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRTaG9ydE9wdGlvbigpLCBvcHRpb25JbnN0cykpOworICAgICAgYXNzZXJ0RXF1YWxzKHBhc3NPcHRpb25JbnN0LCBDbWRMaW5lVXRpbHMuZ2V0T3B0aW9uSW5zdGFuY2VCeU5hbWUoCisgICAgICAgICAgICBwYXNzT3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRMb25nT3B0aW9uKCksIG9wdGlvbkluc3RzKSk7CisgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uT3B0aW9uSW5zdCwgQ21kTGluZVV0aWxzLmdldE9wdGlvbkluc3RhbmNlQnlOYW1lKAorICAgICAgICAgICAgYWN0aW9uT3B0aW9uSW5zdC5nZXRPcHRpb24oKS5nZXRTaG9ydE9wdGlvbigpLCBvcHRpb25JbnN0cykpOworICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbk9wdGlvbkluc3QsIENtZExpbmVVdGlscy5nZXRPcHRpb25JbnN0YW5jZUJ5TmFtZSgKKyAgICAgICAgICAgIGFjdGlvbk9wdGlvbkluc3QuZ2V0T3B0aW9uKCkuZ2V0TG9uZ09wdGlvbigpLCBvcHRpb25JbnN0cykpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0SXNTdWJPcHRpb24oKSB7CisgICAgICBDbWRMaW5lT3B0aW9uIHN1Yk9wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKTsKKyAgICAgIEdyb3VwQ21kTGluZU9wdGlvbiBncm91cE9wdGlvbiA9IGNyZWF0ZUdyb3VwT3B0aW9uKCJncm91cCIsIGZhbHNlKTsKKyAgICAgIGFzc2VydEZhbHNlKENtZExpbmVVdGlscy5pc1N1Yk9wdGlvbihncm91cE9wdGlvbiwgc3ViT3B0aW9uKSk7CisKKyAgICAgIGdyb3VwT3B0aW9uLmFkZFN1Yk9wdGlvbihuZXcgR3JvdXBTdWJPcHRpb24oc3ViT3B0aW9uLCBmYWxzZSkpOworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMuaXNTdWJPcHRpb24oZ3JvdXBPcHRpb24sIHN1Yk9wdGlvbikpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFBlcmZvcm1BbmRRdWl0T3B0aW9ucygpIHsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBwZXJmb3JtQW5kUXVpdE9wdGlvbiA9IGNyZWF0ZUFkdmFuY2VkT3B0aW9uKCJoZWxwIiwKKyAgICAgICAgICAgIG51bGwpOworICAgICAgcGVyZm9ybUFuZFF1aXRPcHRpb24uc2V0UGVyZm9ybUFuZFF1aXQodHJ1ZSk7CisgICAgICBBZHZhbmNlZENtZExpbmVPcHRpb24gb3RoZXJPcHRpb24gPSBjcmVhdGVBZHZhbmNlZE9wdGlvbigiaGVscCIsIG51bGwpOworICAgICAgb3RoZXJPcHRpb24uc2V0UGVyZm9ybUFuZFF1aXQoZmFsc2UpOworCisgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2UgcGVyZm9ybUFuZFF1aXRPcHRpb25JbnN0YW5jZSA9IG5ldyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UoCisgICAgICAgICAgICBwZXJmb3JtQW5kUXVpdE9wdGlvbiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIG90aGVySW5zdGFuY2UgPSBuZXcgQ21kTGluZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgb3RoZXJPcHRpb24sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKFNldHMubmV3SGFzaFNldChwZXJmb3JtQW5kUXVpdE9wdGlvbkluc3RhbmNlKSwKKyAgICAgICAgICAgIENtZExpbmVVdGlscy5maW5kUGVyZm9ybUFuZFF1aXRPcHRpb25zKFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgICAgICAgIHBlcmZvcm1BbmRRdWl0T3B0aW9uSW5zdGFuY2UsIG90aGVySW5zdGFuY2UpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJc1BlcmZvcm1BbmRRdWl0T3B0aW9uKCkgeworICAgICAgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIHBlcmZvcm1BbmRRdWl0T3B0aW9uID0gY3JlYXRlQWR2YW5jZWRPcHRpb24oImhlbHAiLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICBwZXJmb3JtQW5kUXVpdE9wdGlvbi5zZXRQZXJmb3JtQW5kUXVpdCh0cnVlKTsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBvdGhlck9wdGlvbiA9IGNyZWF0ZUFkdmFuY2VkT3B0aW9uKCJoZWxwIiwgbnVsbCk7CisgICAgICBvdGhlck9wdGlvbi5zZXRQZXJmb3JtQW5kUXVpdChmYWxzZSk7CisKKyAgICAgIGFzc2VydFRydWUoQ21kTGluZVV0aWxzLmlzUGVyZm9ybUFuZFF1aXRPcHRpb24ocGVyZm9ybUFuZFF1aXRPcHRpb24pKTsKKyAgICAgIGFzc2VydEZhbHNlKENtZExpbmVVdGlscy5pc1BlcmZvcm1BbmRRdWl0T3B0aW9uKG90aGVyT3B0aW9uKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kU3BlY2lmaWVkT3B0aW9uKCkgeworICAgICAgQ21kTGluZU9wdGlvbiBmaW5kT3B0aW9uID0gY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpOworICAgICAgU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdDEiLCBmYWxzZSkpLAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0MiIsIGZhbHNlKSkpOworCisgICAgICBhc3NlcnROdWxsKENtZExpbmVVdGlscy5maW5kU3BlY2lmaWVkT3B0aW9uKGZpbmRPcHRpb24sIG9wdGlvbnMpKTsKKyAgICAgIG9wdGlvbnMuYWRkKGNyZWF0ZU9wdGlvbkluc3RhbmNlKGZpbmRPcHRpb24pKTsKKyAgICAgIGFzc2VydEVxdWFscyhjcmVhdGVPcHRpb25JbnN0YW5jZShmaW5kT3B0aW9uKSwKKyAgICAgICAgICAgIENtZExpbmVVdGlscy5maW5kU3BlY2lmaWVkT3B0aW9uKGZpbmRPcHRpb24sIG9wdGlvbnMpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEZpbmRBbGxPZlNwZWNpZmllZE9wdGlvbigpIHsKKyAgICAgIENtZExpbmVPcHRpb24gZmluZE9wdGlvbiA9IGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKTsKKyAgICAgIFNldDxDbWRMaW5lT3B0aW9uSW5zdGFuY2U+IG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICBjcmVhdGVPcHRpb25JbnN0YW5jZShjcmVhdGVTaW1wbGVPcHRpb24oInRlc3QxIiwgZmFsc2UpKSwKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdDIiLCBmYWxzZSkpKTsKKworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMuZmluZEFsbE9mU3BlY2lmaWVkT3B0aW9uKGZpbmRPcHRpb24sIG9wdGlvbnMpCisgICAgICAgICAgICAuaXNFbXB0eSgpKTsKKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBmaXJzdE9wdGlvbiA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKGZpbmRPcHRpb24sCisgICAgICAgICAgICAiZmlyc3QiKTsKKyAgICAgIENtZExpbmVPcHRpb25JbnN0YW5jZSBzZWNvbmRPcHRpb24gPSBjcmVhdGVPcHRpb25JbnN0YW5jZShmaW5kT3B0aW9uLAorICAgICAgICAgICAgInNlY29uZCIpOworICAgICAgb3B0aW9ucy5hZGQoZmlyc3RPcHRpb24pOworICAgICAgYXNzZXJ0RXF1YWxzKFNldHMubmV3SGFzaFNldChmaXJzdE9wdGlvbiksCisgICAgICAgICAgICBDbWRMaW5lVXRpbHMuZmluZEFsbE9mU3BlY2lmaWVkT3B0aW9uKGZpbmRPcHRpb24sIG9wdGlvbnMpKTsKKyAgICAgIG9wdGlvbnMuYWRkKHNlY29uZE9wdGlvbik7CisgICAgICBhc3NlcnRFcXVhbHMoU2V0cy5uZXdIYXNoU2V0KGZpcnN0T3B0aW9uLCBzZWNvbmRPcHRpb24pLAorICAgICAgICAgICAgQ21kTGluZVV0aWxzLmZpbmRBbGxPZlNwZWNpZmllZE9wdGlvbihmaW5kT3B0aW9uLCBvcHRpb25zKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJc1ByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbigpIHsKKyAgICAgIGFzc2VydEZhbHNlKENtZExpbmVVdGlscworICAgICAgICAgICAgLmlzUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSkpOworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMKKyAgICAgICAgICAgIC5pc1ByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbihuZXcgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbigpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKCkgeworICAgICAgQ21kTGluZU9wdGlvbiBwc2FBY3Rpb24gPSBuZXcgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbigpOworICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAoQ21kTGluZU9wdGlvbikgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0MiIsIGZhbHNlKSk7CisKKyAgICAgIGFzc2VydE51bGwoQ21kTGluZVV0aWxzLmZpbmRQcmludFN1cHBvcnRlZEFjdGlvbnNPcHRpb24ob3B0aW9ucykpOworICAgICAgb3B0aW9ucy5hZGQocHNhQWN0aW9uKTsKKyAgICAgIGFzc2VydEVxdWFscyhwc2FBY3Rpb24sCisgICAgICAgICAgICBDbWRMaW5lVXRpbHMuZmluZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbihvcHRpb25zKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kU3BlY2lmaWVkUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKCkgeworICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIHBzYUFjdGlvbiA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgbmV3IFByaW50U3VwcG9ydGVkQWN0aW9uc0NtZExpbmVPcHRpb24oKSk7CisgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBvcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpKSwKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdDIiLCBmYWxzZSkpKTsKKworICAgICAgYXNzZXJ0TnVsbChmaW5kU3BlY2lmaWVkUHJpbnRTdXBwb3J0ZWRBY3Rpb25zT3B0aW9uKG9wdGlvbnMpKTsKKyAgICAgIG9wdGlvbnMuYWRkKHBzYUFjdGlvbik7CisgICAgICBhc3NlcnRFcXVhbHMocHNhQWN0aW9uLAorICAgICAgICAgICAgZmluZFNwZWNpZmllZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbihvcHRpb25zKSk7CisgICAgICBvcHRpb25zLmFkZChjcmVhdGVPcHRpb25JbnN0YW5jZShuZXcgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbigKKyAgICAgICAgICAgICJwc2EyIiwgIlByaW50U3VwcG9ydGVkQWN0aW9uczIiLCAiUHJpbnQgQWN0aW9ucyAyIiwgZmFsc2UpKSk7CisgICAgICB0cnkgeworICAgICAgICAgZmluZFNwZWNpZmllZFByaW50U3VwcG9ydGVkQWN0aW9uc09wdGlvbihvcHRpb25zKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsgLyogZXhwZWN0IHRocm93ICovIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdElzU2ltcGxlT3B0aW9uKCkgeworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMKKyAgICAgICAgICAgIC5pc1NpbXBsZU9wdGlvbihuZXcgUHJpbnRTdXBwb3J0ZWRBY3Rpb25zQ21kTGluZU9wdGlvbigpKSk7CisgICAgICBhc3NlcnRUcnVlKENtZExpbmVVdGlscy5pc1NpbXBsZU9wdGlvbihuZXcgSGVscENtZExpbmVPcHRpb24oKSkpOworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMuaXNTaW1wbGVPcHRpb24oY3JlYXRlU2ltcGxlT3B0aW9uKCJUZXN0IiwgdHJ1ZSkpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdElzQWN0aW9uT3B0aW9uKCkgeworICAgICAgYXNzZXJ0RmFsc2UoQ21kTGluZVV0aWxzLmlzQWN0aW9uT3B0aW9uKG5ldyBIZWxwQ21kTGluZU9wdGlvbigpKSk7CisgICAgICBhc3NlcnRUcnVlKENtZExpbmVVdGlscy5pc0FjdGlvbk9wdGlvbihjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kQWN0aW9uT3B0aW9uKCkgeworICAgICAgQWN0aW9uQ21kTGluZU9wdGlvbiBhY3Rpb25PcHRpb24gPSBjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbiIpOworICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAoQ21kTGluZU9wdGlvbikgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpKTsKKworICAgICAgYXNzZXJ0TnVsbChmaW5kRmlyc3RBY3Rpb25PcHRpb24ob3B0aW9ucykpOworICAgICAgb3B0aW9ucy5hZGQoYWN0aW9uT3B0aW9uKTsKKyAgICAgIGFzc2VydEVxdWFscyhhY3Rpb25PcHRpb24sIGZpbmRGaXJzdEFjdGlvbk9wdGlvbihvcHRpb25zKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kU3BlY2lmaWVkQWN0aW9uT3B0aW9uKCkgeworICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIGFjdGlvbk9wdGlvbiA9IGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZUFjdGlvbk9wdGlvbigiYWN0aW9uIikpOworICAgICAgU2V0PENtZExpbmVPcHRpb25JbnN0YW5jZT4gb3B0aW9ucyA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSksCisgICAgICAgICAgICBjcmVhdGVPcHRpb25JbnN0YW5jZShjcmVhdGVTaW1wbGVPcHRpb24oInRlc3QiLCBmYWxzZSkpKTsKKworICAgICAgYXNzZXJ0TnVsbChmaW5kU3BlY2lmaWVkQWN0aW9uT3B0aW9uKG9wdGlvbnMpKTsKKyAgICAgIG9wdGlvbnMuYWRkKGFjdGlvbk9wdGlvbik7CisgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uT3B0aW9uLAorICAgICAgICAgICAgZmluZFNwZWNpZmllZEFjdGlvbk9wdGlvbihvcHRpb25zKSk7CisgICAgICBvcHRpb25zLmFkZChjcmVhdGVPcHRpb25JbnN0YW5jZShjcmVhdGVBY3Rpb25PcHRpb24oImFjdGlvbjIiKSkpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGZpbmRTcGVjaWZpZWRBY3Rpb25PcHRpb24ob3B0aW9ucyk7CisgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7IC8qIGV4cGVjdCB0aHJvdyAqLyB9CisgICAgICAKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdElzR3JvdXBPcHRpb24oKSB7CisgICAgICBhc3NlcnRGYWxzZShDbWRMaW5lVXRpbHMuaXNHcm91cE9wdGlvbihuZXcgSGVscENtZExpbmVPcHRpb24oKSkpOworICAgICAgYXNzZXJ0VHJ1ZShDbWRMaW5lVXRpbHMuaXNHcm91cE9wdGlvbihjcmVhdGVHcm91cE9wdGlvbigidGVzdCIsIGZhbHNlKSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0QXNHcm91cE9wdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBDbWRMaW5lVXRpbHMuYXNHcm91cE9wdGlvbihjcmVhdGVTaW1wbGVPcHRpb24oInRlc3QiLCBmYWxzZSkpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8KKyAgICAgIH0KKyAgICAgIENtZExpbmVVdGlscy5hc0dyb3VwT3B0aW9uKGNyZWF0ZUdyb3VwT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdElzSGVscE9wdGlvbigpIHsKKyAgICAgIGFzc2VydEZhbHNlKENtZExpbmVVdGlscy5pc0hlbHBPcHRpb24oY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpKSk7CisgICAgICBhc3NlcnRUcnVlKENtZExpbmVVdGlscy5pc0hlbHBPcHRpb24obmV3IEhlbHBDbWRMaW5lT3B0aW9uKCkpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEFzSGVscE9wdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBDbWRMaW5lVXRpbHMuYXNIZWxwT3B0aW9uKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSk7CisgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7IC8qIGV4cGVjdCB0aHJvdyAqLyB9CisgICAgICBDbWRMaW5lVXRpbHMuYXNIZWxwT3B0aW9uKG5ldyBIZWxwQ21kTGluZU9wdGlvbigpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEZpbmRIZWxwT3B0aW9uKCkgeworICAgICAgSGVscENtZExpbmVPcHRpb24gaGVscE9wdGlvbiA9IG5ldyBIZWxwQ21kTGluZU9wdGlvbigpOworICAgICAgU2V0PENtZExpbmVPcHRpb24+IG9wdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAoQ21kTGluZU9wdGlvbikgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpLAorICAgICAgICAgICAgY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpKTsKKworICAgICAgYXNzZXJ0TnVsbChDbWRMaW5lVXRpbHMuZmluZEhlbHBPcHRpb24ob3B0aW9ucykpOworICAgICAgb3B0aW9ucy5hZGQoaGVscE9wdGlvbik7CisgICAgICBhc3NlcnRFcXVhbHMoaGVscE9wdGlvbiwgQ21kTGluZVV0aWxzLmZpbmRIZWxwT3B0aW9uKG9wdGlvbnMpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEZpbmRTcGVjaWZpZWRIZWxwT3B0aW9uKCkgeworICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIGhlbHBPcHRpb24gPSBjcmVhdGVPcHRpb25JbnN0YW5jZShuZXcgSGVscENtZExpbmVPcHRpb24oKSk7CisgICAgICBTZXQ8Q21kTGluZU9wdGlvbkluc3RhbmNlPiBvcHRpb25zID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlU2ltcGxlT3B0aW9uKCJ0ZXN0IiwgZmFsc2UpKSwKKyAgICAgICAgICAgIGNyZWF0ZU9wdGlvbkluc3RhbmNlKGNyZWF0ZVNpbXBsZU9wdGlvbigidGVzdCIsIGZhbHNlKSkpOworCisgICAgICBhc3NlcnROdWxsKGZpbmRTcGVjaWZpZWRIZWxwT3B0aW9uKG9wdGlvbnMpKTsKKyAgICAgIG9wdGlvbnMuYWRkKGhlbHBPcHRpb24pOworICAgICAgYXNzZXJ0RXF1YWxzKGhlbHBPcHRpb24sIGZpbmRTcGVjaWZpZWRIZWxwT3B0aW9uKG9wdGlvbnMpKTsKKyAgICAgIG9wdGlvbnMuYWRkKGNyZWF0ZU9wdGlvbkluc3RhbmNlKG5ldyBIZWxwQ21kTGluZU9wdGlvbigiaDIiLCAiaGVscDIiLCAiU2Vjb25kIEhlbHAgT3B0aW9uIiwgdHJ1ZSkpKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBmaW5kU3BlY2lmaWVkSGVscE9wdGlvbihvcHRpb25zKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsgLyogZXhwZWN0IHRocm93ICovIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBBZHZhbmNlZENtZExpbmVPcHRpb24oInQiLCAidGVzdCIsICIiLAorICAgICAgICAgICAgdHJ1ZSk7CisgICAgICBBbGxvd2VkQXJnc0NtZExpbmVPcHRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEFsbG93ZWRBcmdzQ21kTGluZU9wdGlvblZhbGlkYXRvcigpOworICAgICAgdmFsaWRhdG9yLnNldEFsbG93ZWRBcmdzKExpc3RzLm5ld0FycmF5TGlzdCgidmFsdWUiKSk7CisgICAgICBvcHRpb24uc2V0VmFsaWRhdG9ycyhMaXN0cworICAgICAgICAgICAgLm5ld0FycmF5TGlzdCgoQ21kTGluZU9wdGlvblZhbGlkYXRvcikgdmFsaWRhdG9yKSk7CisKKyAgICAgIC8vIFRlc3QgY2FzZSBmYWlsLgorICAgICAgYXNzZXJ0RmFsc2UoZGV0ZXJtaW5lRmFpbGVkVmFsaWRhdGlvbih2YWxpZGF0ZShjcmVhdGVPcHRpb25JbnN0YW5jZShvcHRpb24sICJ2YWx1ZTEiKSkpLmlzRW1wdHkoKSk7CisgICAgICAvLyBUZXN0IGNhc2UgcGFzcy4KKyAgICAgIGFzc2VydFRydWUoZGV0ZXJtaW5lRmFpbGVkVmFsaWRhdGlvbih2YWxpZGF0ZShjcmVhdGVPcHRpb25JbnN0YW5jZShvcHRpb24sICJ2YWx1ZSIpKSkuaXNFbXB0eSgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZSgpIHsKKyAgICAgIENtZExpbmVBY3Rpb24gYWN0aW9uID0gY3JlYXRlQWN0aW9uKCJ0ZXN0QWN0aW9uIik7CisgICAgICBhY3Rpb24uc2V0RGVzY3JpcHRpb24oInRlc3QgZGVzY3JpcHRpb24iKTsKKyAgICAgIEFkdmFuY2VkQ21kTGluZU9wdGlvbiBvcHRpb24gPSBuZXcgQWR2YW5jZWRDbWRMaW5lT3B0aW9uKCJ0IiwgInRlc3QiLCAiIiwKKyAgICAgICAgICAgIHRydWUpOworICAgICAgLy8gSW5zdXJlIHJ1bnMgd2l0aCBubyBlcnJvcnMgd2hlbiBhY3Rpb24gZG9lc24ndCBoYXZlIGEgaGFuZGxlci4KKyAgICAgIENtZExpbmVVdGlscy5oYW5kbGUoYWN0aW9uLCBjcmVhdGVPcHRpb25JbnN0YW5jZShvcHRpb24pKTsKKworICAgICAgLy8gVGVzdCBjYXNlIHdoZW4gb3B0aW9uIGhhcyBhIGhhbmRsZXIuCisgICAgICBvcHRpb24uc2V0SGFuZGxlcihuZXcgQ21kTGluZU9wdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ21kTGluZU9wdGlvbiBvcHRpb24pIHt9CisKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlT3B0aW9uKENtZExpbmVBY3Rpb24gc2VsZWN0ZWRBY3Rpb24sCisgICAgICAgICAgICAgICBDbWRMaW5lT3B0aW9uSW5zdGFuY2Ugb3B0aW9uSW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHNlbGVjdGVkQWN0aW9uLnNldERlc2NyaXB0aW9uKCJoYW5kbGVyIG1vZGlmaWVkIGRlc2NyaXB0aW9uIik7CisgICAgICAgICB9CisKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxwKENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgIH0KKworICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFyZ0Rlc2NyaXB0aW9uKENtZExpbmVBY3Rpb24gYWN0aW9uLAorICAgICAgICAgICAgICAgQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgfQorICAgICAgfSk7CisgICAgICBDbWRMaW5lVXRpbHMuaGFuZGxlKGFjdGlvbiwgY3JlYXRlT3B0aW9uSW5zdGFuY2Uob3B0aW9uKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImhhbmRsZXIgbW9kaWZpZWQgZGVzY3JpcHRpb24iLCBhY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kQWN0aW9uKCkgeworICAgICAgQ21kTGluZUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24xIik7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IFNldHMubmV3SGFzaFNldChhY3Rpb24sCisgICAgICAgICAgICBjcmVhdGVBY3Rpb24oIlRlc3RBY3Rpb24yIiksIGNyZWF0ZUFjdGlvbigiVGVzdEFjdGlvbjMiKSk7CisgICAgICBhc3NlcnROdWxsKENtZExpbmVVdGlscy5maW5kQWN0aW9uKAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlQWN0aW9uT3B0aW9uKCJhY3Rpb24iKSwgIlRlc3RBY3Rpb24iKSwKKyAgICAgICAgICAgIGFjdGlvbnMpKTsKKyAgICAgIGFzc2VydEVxdWFscyhhY3Rpb24sIENtZExpbmVVdGlscy5maW5kQWN0aW9uKAorICAgICAgICAgICAgY3JlYXRlT3B0aW9uSW5zdGFuY2UoY3JlYXRlQWN0aW9uT3B0aW9uKCJhY3Rpb24iKSwgIlRlc3RBY3Rpb24xIiksCisgICAgICAgICAgICBhY3Rpb25zKSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvdGVzdC9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwgYi8wLjEwL2NsaS9zcmMvdGVzdC9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzZmE3NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworCTxiZWFuIGlkPSJQcmludE1lc3NhZ2VBY3Rpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uUHJpbnRNZXNzYWdlQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnRzIG91dCBhIGdpdmVuIG1lc3NhZ2UiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJQcmludEhlbGxvV29ybGRBY3Rpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uUHJpbnRNZXNzYWdlQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnRzIG91dCAnSGVsbG8gV29ybGQnIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkhlbGxvIFdvcmxkIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iVGVzdFNldENvbnRleHRJbmplY3RBY3Rpb24iCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS50ZXN0LnV0aWwuVGVzdFNldENvbnRleHRJbmplY3RUeXBlQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkJdmFsdWU9IlRlc3QgYWN0aW9uIGZvciB0ZXN0aW5nIGFwcGxpY2F0aW9uIGNvbnRleHQgaW5qZWN0aW9uIiAvPgorCTwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL2NsaS9zcmMvdGVzdC9yZXNvdXJjZXMvY21kLWxpbmUtb3B0aW9ucy54bWwgYi8wLjEwL2NsaS9zcmMvdGVzdC9yZXNvdXJjZXMvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxODY5OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY2xpL3NyYy90ZXN0L3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworCTxiZWFuIGlkPSJwcmludEhlbGxvV29ybGQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGh3IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW50SGVsbG9Xb3JsZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnQgSGVsbG8gV29ybGQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5IZWxsbyBXb3JsZCE8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorCQkJCQkJCXA6YWN0aW9uTmFtZT0iUHJpbnRNZXNzYWdlQWN0aW9uIiBwOm1ldGhvZE5hbWU9InNldE1lc3NhZ2UiIC8+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwcmludE1lc3NhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icG0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnRNZXNzYWdlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNZXNzYWdlIHRvIHByaW50IG91dCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWVzc2FnZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKwkJCQkJCQlwOmFjdGlvbk5hbWU9IlByaW50TWVzc2FnZUFjdGlvbiIgcDptZXRob2ROYW1lPSJzZXRNZXNzYWdlIiAvPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3BvbS54bWwgYi8wLjEwL2NvbW1vbnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdjMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3BvbS54bWwKQEAgLTAsMCArMSwxNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxhcnRpZmFjdElkPm9vZHQtY29tbW9uczwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+Q29tbW9uIFV0aWxpdGllczwvbmFtZT4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPGRlc2NyaXB0aW9uPkFwYWNoZSBPT0RUIENvbW1vbiBVdGlsaXRpZXMgUHJvamVjdDwvZGVzY3JpcHRpb24+CisgIDxzY20+CisgICAJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvY29tbW9uczwvY29ubmVjdGlvbj4KKyAgIAk8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjEwLXJjMi9jb21tb25zPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgCTx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9vb2R0L3RhZ3MvMC4xMC1yYzIvY29tbW9uczwvdXJsPgorICA8L3NjbT4KKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9jb21tb25zPC90YXJnZXRQYXRoPgorICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9kdGQ8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5Db25maWd1cmF0aW9uLmR0ZDwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWw8L3RhcmdldFBhdGg+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2NvbmY8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5lbnRpdGllcy54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KKyAgICAgICAgICA8dXNlU3lzdGVtQ2xhc3NMb2FkZXI+ZmFsc2U8L3VzZVN5c3RlbUNsYXNzTG9hZGVyPgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDxuYW1lPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPC9uYW1lPgorICAgICAgICAgICAgICAgPHZhbHVlPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzPC92YWx1ZT4KKyAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICA8Zm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+MDwvZm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+CisgICAgICAgICAgIDxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPHJlZGlyZWN0VGVzdE91dHB1dFRvRmlsZT50cnVlPC9yZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4gCisgIDwvYnVpbGQ+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90ZXN0L3Jlc291cmNlcy8qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3BhY2thZ2UuaHRtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgPG51bVVuYXBwcm92ZWRMaWNlbnNlcz4xPC9udW1VbmFwcHJvdmVkTGljZW5zZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWRiY3A8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWRiY3A8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLXBvb2w8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXBvb2w8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuNS40PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctaGliZXJuYXRlMzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMC44PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudHJhbnNhY3Rpb248L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+anRhPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPnhtbHJwYzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+eG1scnBjPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuOS4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmF0aW9uLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkYTkxZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDczNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnM7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5Ob0luaXRpYWxDb250ZXh0RXhjZXB0aW9uOworaW1wb3J0IGphdmEucm1pLnJlZ2lzdHJ5LlJlZ2lzdHJ5OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKiBFREEgQ29uZmlndXJhdGlvbi4KKyAqCisgKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRURBIHNvZnR3YXJlLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb24geworCS8qKiBUaGUgc2luZ2xldG9uIGNvbmZpZ3VyYXRpb24uICovCisJc3RhdGljIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7CisKKwkvKiogTmFtZSBvZiBwcm9wZXJ0eSB0aGF0IHNwZWNpZmllcyB0aGUgZGlyZWNvdHJpZXMgdGhhdCBjb250YWlucyBYTUwgZW50aXRpZXMuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0RJUlNfUFJPUCA9ICJlbnRpdHkuZGlycyI7CisKKwkvKiogTmFtZSBvZiB0aGUgZGVmYXVsdCBjb25maWcgZmlsZS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTkZJR19GSUxFID0gIi5lZGFyYy54bWwiOworCisJLyoqIEFsdGVybmF0ZSBjb25maWcgZmlsZS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfQ09ORklHX0ZJTEUgPSAiLm9vZHRyYy54bWwiOworCisJLyoqIExpYnJhcnktbG9jYXRpb24gY29uZmlnIGZpbGUuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlIExJQl9DT05GSUdfRklMRSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIiwgIi8iKSArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKKwkJKyBGaWxlLnNlcGFyYXRvciArICJlZGFyYy54bWwiKTsKKworCS8qKiBOb24tSlJFIGxpYnJhcnkgbG9jYXRpb24gb2YgY29uZmlnIGZpbGUuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlIEFMVF9MSUJfQ09ORklHX0ZJTEUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIsICIvIikgKyBGaWxlLnNlcGFyYXRvciArICIuLiIKKwkJKyBGaWxlLnNlcGFyYXRvciArICJsaWIiICsgRmlsZS5zZXBhcmF0b3IgKyAiZWRhcmMueG1sIik7CisKKwkgLyoqIEdldCB0aGUgc2luZ2xldG9uIGNvbmZpZ3VyYXRpb24uCisJICAqCisJICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpbmdsZXRvbiBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgY3JlYXRlcyBpdCBpZiBpdAorCSAgKiBkb2Vzbid0IHlldCBleGlzdC4gIFRvIGNyZWF0ZSBpdCwgaXQgcmVhZHMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBzcGVjaWZpZWQgYnkKKwkgICogdGhlIHN5c3RlbSBwcm9wZXJ0eSA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uLnVybDwvY29kZT4gb3IgdGhlIGZpbGUgaW4gdGhlCisJICAqIHVzZXIncyBob21lIGRpcmVjdG9yeSBjYWxsZWQgLmVkYXJjLnhtbCBpZiB0aGUgc3lzdGVtIHByb3BlcnR5IGlzbid0CisJICAqIHNwZWNpZmllZC4gIEl0IHBhcnNlcyB0aGUgZmlsZSBhbmQgcmV0dXJucyBhIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdAorCSAgKiBpbml0aWFsaXplZCB3aXRoIHRoZSBkYXRhIHNwZWNpZmllZCB0aGVyZWluLgorCSAgKgorCSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmYWlscy4KKwkgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZhaWxzLgorCSAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBJZiB0aGUgVVJMIHNwZWNpZmljYXRpb24gaXMgaW52YWxpZC4KKwkgICogQHJldHVybiBBbiBpbml0aWFsaXplZCBjb25maWd1cmF0aW9uIG9iamVjdC4KKwkgICovCisJIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCSAvLyBHb3Qgb25lPyAgVXNlIGl0LgorCQkgaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisKKwkJIFVSTCB1cmw7CisKKwkJIC8vIEZpcnN0IHByZWZlcmVuY2U6IFVSTCB2aWEgdGhlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLkNvbmZpZ3VyYXRpb24udXJsIHByb3AuCisJCSBTdHJpbmcgdXJsU3RyaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uLnVybCIpOworCQkgaWYgKHVybFN0cmluZyAhPSBudWxsKSB7CisJCQkgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOworCQkgfSBlbHNlIHsKKwkJCSBGaWxlIGZpbGUgPSBudWxsOworCisJCQkgLy8gU2Vjb25kIHByZWZlcmVuY2U6IGZpbGUgdmlhIHRoZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uLmZpbGUgcHJvcC4KKwkJCSBTdHJpbmcgZmlsZW5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLkNvbmZpZ3VyYXRpb24uZmlsZSIpOworCQkJIGlmIChmaWxlbmFtZSAhPSBudWxsKSB7CisJCQkJIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisJCQkJIGlmICghZmlsZS5leGlzdHMoKSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGaWxlICIgKyBmaWxlICsgIiBub3QgZm91bmQiKTsKKwkJCSB9IGVsc2UgeworCQkJCSBMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJCQkgLy8gVGhpcmQgcHJlZmVyZW5jZTogfi8uZWRhcmMueG1sCisJCQkJIEZpbGUgaG9tZWRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIiwgIi8iKSk7CisJCQkJIEZpbGUgaG9tZWRpcmZpbGUgPSBuZXcgRmlsZShob21lZGlyLCBERUZBVUxUX0NPTkZJR19GSUxFKTsKKwkJCQkgY2FuZGlkYXRlcy5hZGQoaG9tZWRpcmZpbGUpOworCisJCQkJIC8vIEZvdXJ0aCBwcmVmZXJlbmNlOiB+Ly5vb2R0cmMueG1sCisJCQkJIEZpbGUgYWx0ID0gbmV3IEZpbGUoaG9tZWRpciwgQUxUX0NPTkZJR19GSUxFKTsKKwkJCQkgY2FuZGlkYXRlcy5hZGQoYWx0KTsKKworCQkJCSAvLyBGaWZ0aCBhbmQgc2l4dGggcHJlZmVyZW5jZXM6ICRFREFfSE9NRS9jb25mL2VkYXJjLnhtbCBhbmQgJEVEQV9IT01FL2V0Yy9lZGFyYy54bWwKKwkJCQkgU3RyaW5nIGVkYUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVkYS5ob21lIik7CisJCQkJIGlmIChlZGFIb21lICE9IG51bGwpIHsKKwkJCQkJIEZpbGUgZWRhSG9tZURpciA9IG5ldyBGaWxlKGVkYUhvbWUpOworCQkJCQkgY2FuZGlkYXRlcy5hZGQobmV3IEZpbGUobmV3IEZpbGUoZWRhSG9tZURpciwgImNvbmYiKSwgImVkYXJjLnhtbCIpKTsKKwkJCQkJIGNhbmRpZGF0ZXMuYWRkKG5ldyBGaWxlKG5ldyBGaWxlKGVkYUhvbWVEaXIsICJldGMiKSwgImVkYXJjLnhtbCIpKTsKKwkJCQkgfQorCisJCQkJIC8vIFNldmVudGggcHJlZmVyZW5jZTogSkFWQV9IT01FL2xpYi9lZGFyYy54bWwKKwkJCQkgY2FuZGlkYXRlcy5hZGQoTElCX0NPTkZJR19GSUxFKTsKKworCQkJCSAvLyBGaW5hbCBwcmVmZXJlbmNlOiBKQVZBX0hPTUUvLi4vbGliL2VkYXJjLnhtbCAodG8gZ2V0IG91dCBvZiBKUkUpCisJCQkJIGNhbmRpZGF0ZXMuYWRkKEFMVF9MSUJfQ09ORklHX0ZJTEUpOworCisJCQkJIC8vIE5vdyBmaW5kIG9uZS4KKwkJCQkgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJCSBmb3IgKEl0ZXJhdG9yIGkgPSBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCQkgZmlsZSA9IChGaWxlKSBpLm5leHQoKTsKKwkJCQkJIGlmIChmaWxlLmV4aXN0cygpKSB7CisJCQkJCQkgZm91bmQgPSB0cnVlOworCQkJCQkJIGJyZWFrOworCQkJCQkgfQorCQkJCSB9CisJCQkJIGlmIChmb3VuZCAmJiBmaWxlID09IGFsdCkKKwkJCQkJIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogVXNpbmcgb2xkZXIgY29uZmlnIGZpbGUgIiArIGFsdCArICI7IHJlbmFtZSB0byAiCisJCQkJCQkgKyBob21lZGlyZmlsZSArICIgYXMgc29vbiBhcyBwb3NzaWJsZS4iKTsKKwkJCQkgaWYgKCFmb3VuZCkgeworCQkJCQkgcmV0dXJuIGdldEVtcHR5Q29uZmlndXJhdGlvbigpOworCQkJCSB9CisJCQkgfQorCQkJIHVybCA9IGZpbGUudG9VUkwoKTsKKwkJIH0KKworCQkgcmV0dXJuIGdldENvbmZpZ3VyYXRpb24odXJsKTsKKworCSB9CisKKwkvKiogR2V0IHRoZSBzaW5nbGV0b24gY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpbmdsZXRvbiBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIGEgCisJICogc3BlY2lmaWVkIGZpbGUgdXJsLiAgSXQgcGFyc2VzIHRoZSBmaWxlIGFuZCByZXR1cm5zIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0CisJICogaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGF0YSBzcGVjaWZpZWQgdGhlcmVpbi4gIEFkZGVkIGJ5IENocmlzIE1hdHRtYW5uIDEyLzA1LzAzLgorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorCSAqIEByZXR1cm4gQW4gaW5pdGlhbGl6ZWQgY29uZmlndXJhdGlvbiBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oVVJMIGNvbmZpZ0ZpbGVVcmwpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJc3luY2hyb25pemVkIChDb25maWd1cmF0aW9uLmNsYXNzKSB7CisJCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQorCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWdGaWxlVXJsKTsKKwkJfQorCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uIGdldEVtcHR5Q29uZmlndXJhdGlvbigpIHsKKwkJc3luY2hyb25pemVkIChDb25maWd1cmF0aW9uLmNsYXNzKSB7CisJCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQorCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOworCQl9CisJCXJldHVybiBjb25maWd1cmF0aW9uOworCX0KKworCisJLyoqIEdldCB0aGUgc2luZ2xldG9uIGNvbmZpZ3VyYXRpb24gd2l0aG91dCBleGNlcHRpb24uCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBpZGVudGljYWwgdG8ge0BsaW5rICNnZXRDb25maWd1cmF0aW9ufSBidXQgdHJhcHMgYWxsIGNoZWNrZWQKKwkgKiBleGNlcHRpb25zLiAgSWYgdGhlIGNvbmZpZ3VyYXRpb24gY2FuJ3QgYmUgcmVhZCwgaXQgcmV0dXJucyBudWxsLgorCSAqCisJICogQHJldHVybiBBbiBpbml0aWFsaXplZCBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgbnVsbCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbldpdGhvdXRFeGNlcHRpb24oKSB7CisJCS8vIEdvdCBvbmU/ICBVc2UgaXQuICBEbyB0aGlzIG91dCBvZiBhIHRyeSBibG9jayBmb3IgcGVyZm9ybWFuY2UuCisJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHJldHVybiBjb25maWd1cmF0aW9uOworCisJCS8vIFRyeSB0byBnZXQgaXQuCisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBleDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiAiICsgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHdoaWxlIGdldHRpbmcgY29uZmlndXJhdGlvbjogIgorCQkJCSsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlDb25maWd1cmF0aW9uKCkgeworCQlzZXJ2ZXJNZ3JQb3J0ID0gNzU3NzsKKwkJbmFtZVNlcnZlclN0YXRlRnJlcXVlbmN5ID0gNjAwMDAwMDsKKwkJbmFtZVNlcnZlck9iamVjdEtleSA9ICJTdGFuZGFyZE5TJTIwUE9BIjsKKwkJbmFtZVNlcnZlclBvcnQgPSAiMTAwMDAiOworCQluYW1lU2VydmVySG9zdCA9ICJsb2NhbGhvc3QiOworCQluYW1lU2VydmVyVmVyc2lvbiA9ICIxLjAiOworCQluYW1lU2VydmVyVXNpbmdSSVJQcm90b2NvbCA9IGZhbHNlOworCQl3ZWJTZXJ2ZXJEb2N1bWVudERpcmVjdG9yeSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIiwgIi8iKSArICJ0b21jYXQvd2ViYXBwcy9ST09UIik7CisJCXdlYlBvcnQgPSAiODA4MCI7CisJCXdlYkhvc3QgPSAibG9jYWxob3N0IjsKKwkJU3lzdGVtLnNldFByb3BlcnR5KFdFQl9QUk9UT0NPTF9QUk9QRVJUWSwgImh0dHAiKTsKKwkJaW5pdGlhbGl6ZUNvbnRleHQoKTsKKwl9CisKKwkvKiogQ29uc3RydWN0IGEgY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSB1cmwgVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZhaWxzLgorCSAqIEB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gSWYgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZhaWxzLgorCSAqLworCUNvbmZpZ3VyYXRpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworCQl0aGlzKG5ldyBJbnB1dFNvdXJjZSh1cmwudG9TdHJpbmcoKSkpOworCX0KKworCUNvbmZpZ3VyYXRpb24oSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHN5c3RlbUlEID0gaW5wdXRTb3VyY2UuZ2V0U3lzdGVtSWQoKTsKKwkJaWYgKHN5c3RlbUlEID09IG51bGwpIGlucHV0U291cmNlLnNldFN5c3RlbUlkKCJmaWxlOi91bmtub3duIik7CisKKwkJLy8gR2V0IHRoZSBkb2N1bWVudAorCQlET01QYXJzZXIgcGFyc2VyID0gWE1MLmNyZWF0ZURPTVBhcnNlcigpOworCQlwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IENvbmZpZ3VyYXRpb25FbnRpdHlSZXNvbHZlcigpKTsKKwkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgeworCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24geworCQkJCXRocm93IGV4OworCQkJfQorCQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZhdGFsIHBhcnNlIGVycm9yOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJCQl0aHJvdyBleDsKKwkJCX0KKwkJfSk7CisJCXBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSk7CisJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VyLmdldERvY3VtZW50KCk7CisJCVhNTC5yZW1vdmVDb21tZW50cyhkb2N1bWVudCk7CisJCWRvY3VtZW50Lm5vcm1hbGl6ZSgpOworCQkKKwkJLy8gU2VlIGlmIHRoaXMgcmVhbGx5IGlzIGEgPGNvbmZpZ3VyYXRpb24+IGRvY3VtZW50LgorCQlpZiAoIWRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJjb25maWd1cmF0aW9uIikpCisJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJDb25maWd1cmF0aW9uICIgKyBpbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpICsgIiBpcyBub3QgYSA8Y29uZmlndXJhdGlvbj4gZG9jdW1lbnQiKTsKKworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBlYWNoQ2hpbGQgPSAwOyBlYWNoQ2hpbGQgPCBsaXN0LmdldExlbmd0aCgpOyArK2VhY2hDaGlsZCkgeworCQkJTm9kZSBjaGlsZE5vZGUgPSBsaXN0Lml0ZW0oZWFjaENoaWxkKTsKKwkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIndlYlNlcnZlciIpKSB7CisJCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJCQlOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCQlpZiAoImhvc3QiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCQkJd2ViSG9zdCA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJCQllbHNlIGlmICgicG9ydCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJCQl3ZWJQb3J0ID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQkJCWVsc2UgaWYgKCJkaXIiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCQkJd2ViU2VydmVyRG9jdW1lbnREaXJlY3RvcnkgPSBuZXcgRmlsZShYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCQkJfQkJCQkJCisJCQkJcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuQ29uZmlndXJhdGlvbi53ZWJTZXJ2ZXIuYmFzZVVSTCIsIGdldFdlYlNlcnZlckJhc2VVUkwoKSk7CisJCQkJaWYgKHdlYlNlcnZlckRvY3VtZW50RGlyZWN0b3J5ID09IG51bGwpCisJCQkJCXdlYlNlcnZlckRvY3VtZW50RGlyZWN0b3J5ID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiLCAiLyIpCisJCQkJCQkrICIvZGV2L2h0ZG9jcyIpOworCQkJfSBlbHNlIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIm5hbWVTZXJ2ZXIiKSkgeworCQkJCUVsZW1lbnQgbmFtZVNlcnZlck5vZGUgPSAoRWxlbWVudCkgY2hpbGROb2RlOworCQkJCVN0cmluZyBuYW1lU2VydmVyU3RhdGVGcmVxdWVuY3lTdHJpbmcgPSBuYW1lU2VydmVyTm9kZS5nZXRBdHRyaWJ1dGUoInN0YXRlRnJlcXVlbmN5Iik7CisJCQkJaWYgKG5hbWVTZXJ2ZXJTdGF0ZUZyZXF1ZW5jeVN0cmluZyA9PSBudWxsIHx8IG5hbWVTZXJ2ZXJTdGF0ZUZyZXF1ZW5jeVN0cmluZy5sZW5ndGgoKSA9PSAwKQorCQkJCQluYW1lU2VydmVyU3RhdGVGcmVxdWVuY3kgPSAwOworCQkJCWVsc2UgdHJ5IHsKKwkJCQkJbmFtZVNlcnZlclN0YXRlRnJlcXVlbmN5ID0gSW50ZWdlci5wYXJzZUludChuYW1lU2VydmVyU3RhdGVGcmVxdWVuY3lTdHJpbmcpOworCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworCQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJJbGxlZ2FsIG51bi1udW1lcmljIHZhbHVlIFwiIiArIG5hbWVTZXJ2ZXJTdGF0ZUZyZXF1ZW5jeVN0cmluZworCQkJCQkJKyAiXCIgZm9yIHN0YXRlRnJlcXVlbmN5IGF0dHJpYnV0ZSIpOworCQkJCX0KKwkJCQlpZiAoY2hpbGROb2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlTmFtZSgpLmVxdWFscygicmlyIikpIHsKKwkJCQkJbmFtZVNlcnZlclVzaW5nUklSUHJvdG9jb2wgPSB0cnVlOworCQkJCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGNoaWxkTm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Q2hpbGROb2RlcygpOworCQkJCQluYW1lU2VydmVyT2JqZWN0S2V5ID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgPT0gMT8gWE1MLnVud3JhcHBlZFRleHQoY2hpbGRyZW4uaXRlbSgwKSk6bnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lU2VydmVyVXNpbmdSSVJQcm90b2NvbCA9IGZhbHNlOworCQkJCQluYW1lU2VydmVyVmVyc2lvbiA9IG51bGw7CisJCQkJCW5hbWVTZXJ2ZXJQb3J0ID0gbnVsbDsKKwkJCQkJLy8gTXVzdCBiZSBzYW1lIGFzIENPUkJBTWdyLk5TX09CSkVDVF9LRVk6CisJCQkJCW5hbWVTZXJ2ZXJPYmplY3RLZXkgPSAiU3RhbmRhcmROUy9OYW1lU2VydmVyJTJEUE9BL19yb290IjsKKwkJCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZE5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldENoaWxkTm9kZXMoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQkJCQlOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInZlcnNpb24iKSkKKwkJCQkJCQluYW1lU2VydmVyVmVyc2lvbiA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygiaG9zdCIpKQorCQkJCQkJCW5hbWVTZXJ2ZXJIb3N0ID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJwb3J0IikpCisJCQkJCQkJbmFtZVNlcnZlclBvcnQgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIm9iamVjdEtleSIpKQorCQkJCQkJCW5hbWVTZXJ2ZXJPYmplY3RLZXkgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hpbGROb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSkgeworCQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hpbGROb2RlLmdldENoaWxkTm9kZXMoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpIHsKKwkJCQkJTm9kZSB4bWxOb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQkJaWYgKCJlbnRpdHlSZWYiLmVxdWFscyh4bWxOb2RlLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJCQlOb2RlTGlzdCBkaXJOb2RlcyA9IHhtbE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQkJCQkJU3RyaW5nQnVmZmVyIHJlZkRpcnMgPSBuZXcgU3RyaW5nQnVmZmVyKFN5c3RlbS5nZXRQcm9wZXJ0eShFTlRJVFlfRElSU19QUk9QLCAiIikpOworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXJOb2Rlcy5nZXRMZW5ndGgoKTsgKytqKQorCQkJCQkJCXJlZkRpcnMuYXBwZW5kKCcsJykuYXBwZW5kKFhNTC51bndyYXBwZWRUZXh0KGRpck5vZGVzLml0ZW0oaikpKTsKKwkJCQkJCWlmIChyZWZEaXJzLmxlbmd0aCgpID4gMCkKKwkJCQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoRU5USVRZX0RJUlNfUFJPUCwgcmVmRGlycy5jaGFyQXQoMCkgPT0gJywnPworCQkJCQkJCQlyZWZEaXJzLnN1YnN0cmluZygxKSA6IHJlZkRpcnMudG9TdHJpbmcoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKCJzZXJ2ZXJNZ3IiLmVxdWFscyhjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlzZXJ2ZXJNZ3JQb3J0ID0gSW50ZWdlci5wYXJzZUludChYTUwudW53cmFwcGVkVGV4dChjaGlsZE5vZGUuZ2V0Rmlyc3RDaGlsZCgpKSk7CisJCQl9IGVsc2UgaWYgKGNoaWxkTm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygicHJvcGVydGllcyIpKSB7CisJCQkJbG9hZFByb3BlcnRpZXMoY2hpbGROb2RlLCBwcm9wZXJ0aWVzKTsKKwkJCX0gZWxzZSBpZiAoY2hpbGROb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJwcm9ncmFtcyIpKSB7CisJCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJCQkvLyBUaGV5J3JlIGFsbCBvZiB0eXBlIGV4ZWNTZXJ2ZXItLS1mb3Igbm93LgorCQkJCQlFeGVjU2VydmVyQ29uZmlnIGVzYyA9IG5ldyBFeGVjU2VydmVyQ29uZmlnKGNoaWxkcmVuLml0ZW0oaSkpOworCQkJCQllc2MuZ2V0UHJvcGVydGllcygpLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uLnVybCIsIGlucHV0U291cmNlLmdldFN5c3RlbUlkKCkpOworCQkJCQlleGVjU2VydmVycy5hZGQoZXNjKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpbml0aWFsaXplQ29udGV4dCgpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udGV4dCgpIHsKKwkJY29udGV4dEVudmlyb25tZW50LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCAib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub2JqZWN0LmpuZGkuT2JqZWN0Q3R4RmFjdG9yeSIpOworCQlTdHJpbmcgcmVnaXN0cnlMaXN0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5ybWlyZWdpc3RyaWVzIiwgU3lzdGVtLmdldFByb3BlcnR5KCJybWlyZWdpc3RyaWVzIikpOworCQlpZiAocmVnaXN0cnlMaXN0ID09IG51bGwpIHsKKwkJCVN0cmluZyBob3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJybWlyZWdpc3RyeS5ob3N0IiwgImxvY2FsaG9zdCIpOworCQkJaW50IHBvcnQgPSBJbnRlZ2VyLmdldEludGVnZXIoInJtaXJlZ2lzdHJ5LnBvcnQiLCBSZWdpc3RyeS5SRUdJU1RSWV9QT1JUKS5pbnRWYWx1ZSgpOworCQkJcmVnaXN0cnlMaXN0ID0gInJtaTovLyIgKyBob3N0ICsgIjoiICsgcG9ydDsKKwkJfQorCQljb250ZXh0RW52aXJvbm1lbnQucHV0KCJybWlyZWdpc3RyaWVzIiwgcmVnaXN0cnlMaXN0KTsKKwl9CisKKwkvKiogU2VyaWFsaXplIHRoaXMgY29uZmlndXJhdGlvbiBpbnRvIGEgc2VyaWFsaXplZCBYTUwgZG9jdW1lbnQuCisJICoKKwkgKiBAcmV0dXJuIFNlcmlhbGl6ZWQgWE1MIHZlcnNpb24gb2YgdGhpcyBjb25maWd1cmF0aW9uLgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBjb25zdHJ1Y3RpbmcgdGhlIFhNTCBzdHJ1Y3R1cmUuCisJICovCisJcHVibGljIFN0cmluZyB0b1hNTCgpIHRocm93cyBET01FeGNlcHRpb24geworCQlEb2N1bWVudCBkb2MgPSBjcmVhdGVEb2N1bWVudCgiY29uZmlndXJhdGlvbiIpOworCQlkb2MucmVwbGFjZUNoaWxkKHRvWE1MKGRvYyksIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisJCXJldHVybiBYTUwuc2VyaWFsaXplKGRvYyk7CisJfQorCisJLyoqIAorCSAqCisJICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgWE1MIHN0cnVjdHVyZSB3aWxsIGJlbG9uZy4KKwkgKiBAcmV0dXJuIFRoZSByb290IG5vZGUgcmVwcmVzZW50aW5nIHRoaXMgY29uZmlndXJhdGlvbi4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgY29uc3RydWN0aW5nIHRoZSBYTUwgc3RydWN0dXJlLgorCSAqLworCXB1YmxpYyBOb2RlIHRvWE1MKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJLy8gPGNvbmZpZ3VyYXRpb24+CisJCUVsZW1lbnQgY29uZmlndXJhdGlvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjb25maWd1cmF0aW9uIik7CisKKwkJLy8gPHdlYlNlcnZlcj4KKwkJRWxlbWVudCB3ZWJTZXJ2ZXJOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgid2ViU2VydmVyIik7CisJCWNvbmZpZ3VyYXRpb25Ob2RlLmFwcGVuZENoaWxkKHdlYlNlcnZlck5vZGUpOworCisJCS8vIDx3ZWJTZXJ2ZXI+CisJCS8vICAgPGhvc3Q+Li4uPC9ob3N0Pjxwb3J0Pi4uLjwvcG9ydD48ZGlyPi4uLjwvZGlyPgorCQlYTUwuYWRkKHdlYlNlcnZlck5vZGUsICJob3N0Iiwgd2ViSG9zdCk7CisJCVhNTC5hZGQod2ViU2VydmVyTm9kZSwgInBvcnQiLCB3ZWJQb3J0KTsKKwkJWE1MLmFkZCh3ZWJTZXJ2ZXJOb2RlLCAiZGlyIiwgd2ViU2VydmVyRG9jdW1lbnREaXJlY3RvcnkudG9TdHJpbmcoKSk7CisKKwkJLy8gPG5hbWVTZXJ2ZXI+CisJCUVsZW1lbnQgbmFtZVNlcnZlck5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJuYW1lU2VydmVyIik7CisJCW5hbWVTZXJ2ZXJOb2RlLnNldEF0dHJpYnV0ZSgic3RhdGVGcmVxdWVuY3kiLCBTdHJpbmcudmFsdWVPZihuYW1lU2VydmVyU3RhdGVGcmVxdWVuY3kpKTsKKwkJY29uZmlndXJhdGlvbk5vZGUuYXBwZW5kQ2hpbGQobmFtZVNlcnZlck5vZGUpOworCisJCS8vIDxuYW1lU2VydmVyPgorCQkvLyAgIDxyaXI+IG9yIDxpaW9wPgorCQlpZiAobmFtZVNlcnZlclVzaW5nUklSUHJvdG9jb2wpIHsKKwkJCUVsZW1lbnQgcmlyTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInJpciIpOworCQkJbmFtZVNlcnZlck5vZGUuYXBwZW5kQ2hpbGQocmlyTm9kZSk7CisJCQlpZiAobmFtZVNlcnZlck9iamVjdEtleSAhPSBudWxsKQorCQkJCVhNTC5hZGQocmlyTm9kZSwgIm9iamVjdEtleSIsIG5hbWVTZXJ2ZXJPYmplY3RLZXkpOworCQl9IGVsc2UgeworCQkJRWxlbWVudCBpaW9wTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlpb3AiKTsKKwkJCW5hbWVTZXJ2ZXJOb2RlLmFwcGVuZENoaWxkKGlpb3BOb2RlKTsKKwkJCWlmIChuYW1lU2VydmVyVmVyc2lvbiAhPSBudWxsKQorCQkJCVhNTC5hZGQoaWlvcE5vZGUsICJ2ZXJzaW9uIiwgbmFtZVNlcnZlclZlcnNpb24pOworCQkJWE1MLmFkZChpaW9wTm9kZSwgImhvc3QiLCBuYW1lU2VydmVySG9zdCk7CisJCQlpZiAobmFtZVNlcnZlclBvcnQgIT0gbnVsbCkKKwkJCQlYTUwuYWRkKGlpb3BOb2RlLCAicG9ydCIsIG5hbWVTZXJ2ZXJQb3J0KTsKKwkJCWlmIChuYW1lU2VydmVyT2JqZWN0S2V5ICE9IG51bGwpCisJCQkJWE1MLmFkZChpaW9wTm9kZSwgIm9iamVjdEtleSIsIG5hbWVTZXJ2ZXJPYmplY3RLZXkpOworCQl9CisKKwkJLy8gPHhtbD48ZW50aXR5UmVmPjxkaXI+Li4uCisJCWlmICghZ2V0RW50aXR5UmVmRGlycygpLmlzRW1wdHkoKSkgeworCQkJRWxlbWVudCB4bWxOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgieG1sIik7CisJCQljb25maWd1cmF0aW9uTm9kZS5hcHBlbmRDaGlsZCh4bWxOb2RlKTsKKwkJCUVsZW1lbnQgZW50aXR5UmVmTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImVudGl0eVJlZiIpOworCQkJeG1sTm9kZS5hcHBlbmRDaGlsZChlbnRpdHlSZWZOb2RlKTsKKwkJCVhNTC5hZGQoZW50aXR5UmVmTm9kZSwgImRpciIsIGdldEVudGl0eVJlZkRpcnMoKSk7CisJCX0KKworCQkvLyA8c2VydmVyTWdyPjxwb3J0Pi4uLgorCQlpZiAoZ2V0U2VydmVyTWdyUG9ydCgpICE9IDApIHsKKwkJCUVsZW1lbnQgc2VydmVyTWdyTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlcnZlck1nciIpOworCQkJY29uZmlndXJhdGlvbk5vZGUuYXBwZW5kQ2hpbGQoc2VydmVyTWdyTm9kZSk7CisJCQlYTUwuYWRkKHNlcnZlck1nck5vZGUsICJwb3J0IiwgU3RyaW5nLnZhbHVlT2YoZ2V0U2VydmVyTWdyUG9ydCgpKSk7CisJCX0KKworCQkvLyBHbG9iYWwgPHByb3BlcnRpZXM+Li4uPC9wcm9wZXJ0aWVzPgorCQlpZiAocHJvcGVydGllcy5zaXplKCkgPiAwKQorCQkJZHVtcFByb3BlcnRpZXMocHJvcGVydGllcywgY29uZmlndXJhdGlvbk5vZGUpOworCisJCS8vIDxwcm9ncmFtcz4uLi4KKwkJaWYgKGV4ZWNTZXJ2ZXJzLnNpemUoKSA+IDApIHsKKwkJCUVsZW1lbnQgcHJvZ3JhbXNOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJvZ3JhbXMiKTsKKwkJCWNvbmZpZ3VyYXRpb25Ob2RlLmFwcGVuZENoaWxkKHByb2dyYW1zTm9kZSk7CisKKwkJCWZvciAoSXRlcmF0b3IgaSA9IGV4ZWNTZXJ2ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCUV4ZWNTZXJ2ZXJDb25maWcgZXNjID0gKEV4ZWNTZXJ2ZXJDb25maWcpIGkubmV4dCgpOworCQkJCUVsZW1lbnQgZXhlY1NlcnZlck5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJleGVjU2VydmVyIik7CisJCQkJcHJvZ3JhbXNOb2RlLmFwcGVuZENoaWxkKGV4ZWNTZXJ2ZXJOb2RlKTsKKwkJCQlYTUwuYWRkKGV4ZWNTZXJ2ZXJOb2RlLCAiY2xhc3MiLCBlc2MuZ2V0Q2xhc3NOYW1lKCkpOworCQkJCVhNTC5hZGQoZXhlY1NlcnZlck5vZGUsICJvYmplY3RLZXkiLCBlc2MuZ2V0T2JqZWN0S2V5KCkpOworCQkJCVhNTC5hZGQoZXhlY1NlcnZlck5vZGUsICJob3N0IiwgZXNjLmdldFByZWZlcnJlZEhvc3QoKS50b1N0cmluZygpKTsKKwkJCQlpZiAoZXNjLmdldFByb3BlcnRpZXMoKS5zaXplKCkgPiAwKQorCQkJCQlkdW1wUHJvcGVydGllcyhlc2MuZ2V0UHJvcGVydGllcygpLCBleGVjU2VydmVyTm9kZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gY29uZmlndXJhdGlvbk5vZGU7CisJfQorCisJLyoqIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBjb25maWd1cmF0aW9uIGludG8gdGhlIGdpdmVuIHByb3BlcnRpZXMuCisJICoKKwkgKiBQcm9wZXJ0aWVzIHRoYXQgYWxyZWFkeSBleGlzdCBpbiB0aGUgPHZhcj50YXJnZXRQcm9wczwvdmFyPiB3b24ndCBiZQorCSAqIG92ZXJ3cml0dGVuLgorCSAqCisJICogQHBhcmFtIHRhcmdldFByb3BzIFRoZSB0YXJnZXQgcHJvcGVydGllcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtZXJnZVByb3BlcnRpZXMoUHJvcGVydGllcyB0YXJnZXRQcm9wcykgeworCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKwkJCWlmICghdGFyZ2V0UHJvcHMuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKQorCQkJCXRhcmdldFByb3BzLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCX0KKwl9CisKKwkvKiogR2V0IHRoZSBleGVjLXNlcnZlciBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIEByZXR1cm4gQSBjb2xsZWN0aW9uIG9mIGV4ZWMgc2VydmVyIGNvbmZpZ3VyYXRpb25zLCBlYWNoIG9mIGNsYXNzIHtAbGluayBFeGVjU2VydmVyQ29uZmlnfS4KKwkgKi8KKwlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFeGVjU2VydmVyQ29uZmlncygpIHsKKwkJcmV0dXJuIGV4ZWNTZXJ2ZXJzOworCX0KKworICAgICAgICAvKiogR2V0IHRoZSBleGVjLXNlcnZlciBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyBvZiBleGVjIHNlcnZlcnMgdGhhdCB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICAgKiBAcmV0dXJuIEEgY29sbGVjdGlvbiBvZiBleGVjIHNlcnZlciBjb25maWd1cmF0aW9ucywgZWFjaCBvZiBjbGFzcyB7QGxpbmsgRXhlY1NlcnZlckNvbmZpZ30uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFeGVjU2VydmVyQ29uZmlncyhDbGFzcyBjbGF6eikgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGF6ei5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBleGVjU2VydmVyQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleGVjU2VydmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWNTZXJ2ZXJDb25maWcgZXhlYyA9IChFeGVjU2VydmVyQ29uZmlnKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKGV4ZWMuZ2V0Q2xhc3NOYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU2VydmVyQ29uZmlncy5hZGQoZXhlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBleGVjU2VydmVyQ29uZmlnczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBHZXQgYW4gZXhlYy1zZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdEtleSBUaGUgb2JqZWN0IGtleSBvZiB0aGUgRXhlYyBTZXJ2ZXIgdG8gcmV0cmlldmUuCisgICAgICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEV4ZWNTZXJ2ZXJDb25maWd9IG9yIG51bGwgaWYgb2JqZWN0IGtleSBub3QgZm91bmQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRXhlY1NlcnZlckNvbmZpZyBnZXRFeGVjU2VydmVyQ29uZmlnKFN0cmluZyBvYmplY3RLZXkpIHsKKyAgICAgICAgICAgICAgICBFeGVjU2VydmVyQ29uZmlnIGV4ZWNTZXJ2ZXJDb25maWcgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4ZWNTZXJ2ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpICYmIGV4ZWNTZXJ2ZXJDb25maWcgPT0gbnVsbDspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWNTZXJ2ZXJDb25maWcgZXhlYyA9IChFeGVjU2VydmVyQ29uZmlnKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RLZXkuZXF1YWxzKGV4ZWMuZ2V0T2JqZWN0S2V5KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU2VydmVyQ29uZmlnID0gZXhlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWNTZXJ2ZXJDb25maWc7CisgICAgICAgIH0KKworCS8qKiBHZXQgdGhlIHdlYiBzZXJ2ZXIgYmFzZSBVUkwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBiYXNlIHdlYiBzZXJ2ZXIgVVJMLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmVyQmFzZVVSTCgpIHsKKwkJU3RyaW5nIHByb3RvID0gU3lzdGVtLmdldFByb3BlcnR5KFdFQl9QUk9UT0NPTF9QUk9QRVJUWSk7CisJCWlmIChwcm90byA9PSBudWxsKSB7CisJCQlpZiAoIjQ0MyIuZXF1YWxzKHdlYlBvcnQpKSBwcm90byA9ICJodHRwcyI7CisJCQllbHNlIHByb3RvID0gImh0dHAiOworCQl9CisJCXJldHVybiBwcm90byArICI6Ly8iICsgd2ViSG9zdCArICI6IiArIHdlYlBvcnQ7CisJfQorCisJLyoqIEdldCB0aGUgd2ViIHNlcnZlciBkb2N1bWVudCBkaXJlY3RvcnkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBkaXJlY3RvcnkuCisJICovCisJcHVibGljIEZpbGUgZ2V0V2ViU2VydmVyRG9jdW1lbnREaXJlY3RvcnkoKSB7CisJCXJldHVybiB3ZWJTZXJ2ZXJEb2N1bWVudERpcmVjdG9yeTsKKwl9CisKKwkvKiogR2V0IHRoZSBuYW1lIHNlcnZlciBVUkwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIHNlcnZlciBVUkwuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lU2VydmVyVVJMKCkgeworCQlyZXR1cm4gZ2V0V2ViU2VydmVyQmFzZVVSTCgpICsgIi9ucy5pb3IiOworCX0KKworCS8qKiBHZXQgdGhlIG5hbWUgc2VydmVyIHBvcnQsIGlmIGFueS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHBvcnQuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lU2VydmVyUG9ydCgpIHsKKwkJcmV0dXJuIG5hbWVTZXJ2ZXJQb3J0OworCX0KKworCS8qKiBHZXQgdGhlIGZyZXF1ZW5jeSB3aXRoIHdoaWNoIHRoZSBuYW1lIHNlcnZlciBzYXZlcyBpdHMgc3RhdGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzdGF0ZS1zYXZlIGZyZXF1ZW5jeSBpbiBtaWxsaXNlY29uZHM7IDw9IDAgbWVhbnMgbmV2ZXIgc2F2ZSBzdGF0ZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5hbWVTZXJ2ZXJTdGF0ZUZyZXF1ZW5jeSgpIHsKKwkJcmV0dXJuIG5hbWVTZXJ2ZXJTdGF0ZUZyZXF1ZW5jeTsKKwl9CisKKwkvKiogR2V0IHRoZSBvYmplY3QgY29udGV4dC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG9iamVjdCBjb250ZXh0IGJhc2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbi4KKwkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBJZiB0aGUgY29udGV4dCBjYW4ndCBiZSBjcmVhdGVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0IGdldE9iamVjdENvbnRleHQoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJQ29udGV4dCBjID0gbnVsbDsKKwkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNvbnRleHRFbnZpcm9ubWVudC5nZXQoamF2YXgubmFtaW5nLkNvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOworCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCisJCQljID0gbmV3IEluaXRpYWxDb250ZXh0KGNvbnRleHRFbnZpcm9ubWVudCk7CisJCWVsc2UgdHJ5IHsKKwkJCS8vIFdvcmsgYXJvdW5kIGlQbGFuZXQgYnVnLiAgSk5ESSB1c2VzIHRoZSB0aHJlYWQncyBjb250ZXh0IGNsYXNzCisJCQkvLyBsb2FkZXIgdG8gbG9hZCB0aGUgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MuICBGb3Igc29tZQorCQkJLy8gcmVhc29uLCB0aGF0IGxvYWRlciBmYWlscyB0byBmaW5kIHRoaW5ncyBpbiBpUGxhbmV0J3MKKwkJCS8vIGNsYXNzcGF0aCwgc3VjaCBhcyB0aGUgRURBIGluaXRpYWwgY29udGV4dCBmYWN0b3J5LiAgSGVyZSwgd2UKKwkJCS8vIGN1dCBhIG5ldyB0aHJlYWQgYW5kIGV4cGxpY2l0bHkgc2V0IGl0cyBjb250ZXh0IGNsYXNzIGxvYWRlciB0bworCQkJLy8gdGhlIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlci4gIFdoZW4gSk5ESSBsb29rcyB1cCB0aGUgaW5pdGlhbAorCQkJLy8gY29udGV4dCBmYWN0b3J5LCB0aGUgdGhyZWFkJ3MgY29udGV4dCBjbGFzcyBsb2FkZXIgaXMgdGhlIGFwcAorCQkJLy8gY2xhc3MgbG9hZGVyLCB3aGljaCBzdWNjZWVkcy4KKwkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCQkJZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKTsKKwkJCUluaXRpYWxDb250ZXh0VGhyZWFkIHRocmVhZCA9IG5ldyBJbml0aWFsQ29udGV4dFRocmVhZChsb2FkZXIpOworCQkJdGhyZWFkLnN0YXJ0KCk7CisJCQl0cnkgeworCQkJCXRocmVhZC5qb2luKCk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworCQkJCXRocm93IG5ldyBOb0luaXRpYWxDb250ZXh0RXhjZXB0aW9uKCJJbml0aWFsIGNvbnRleHQgdGhyZWFkIGludGVycnVwdGVkOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJCX0KKwkJCWMgPSB0aHJlYWQuZ2V0Q29udGV4dCgpOworCQkJaWYgKGMgPT0gbnVsbCkKKwkJCQl0aHJvdyB0aHJlYWQuZ2V0RXhjZXB0aW9uKCk7CisJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBOb0luaXRpYWxDb250ZXh0RXhjZXB0aW9uKCJDbGFzcyAiICsgY2xhc3NOYW1lICsgIiBub3QgZm91bmQiKTsKKwkJfQorCQlyZXR1cm4gYzsKKwl9CisKKwkvKiogR2V0IHRoZSBlbnRpdHkgcmVmZXJlbmNlIGRpcmVjdG9yaWVzLgorCSAqCisJICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9cyBuYW1pbmcgZGlyZWN0b3JpZXMgZm9yIGVudGl0eSByZWZlcmVuY2VzLgorCSAqLworCXB1YmxpYyBMaXN0IGdldEVudGl0eVJlZkRpcnMoKSB7CisJCUxpc3QgZGlycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoU3lzdGVtLmdldFByb3BlcnR5KEVOVElUWV9ESVJTX1BST1AsICIiKSwgIiw7fCIpOyB0Lmhhc01vcmVUb2tlbnMoKTspCisJCQlkaXJzLmFkZCh0Lm5leHRUb2tlbigpKTsKKwkJcmV0dXJuIGRpcnM7CisJfQorCisJLyoqIEdldCB0aGUgcG9ydCBudW1iZXIgb24gd2hpY2ggdGhlIHNlcnZlciBtYW5hZ2VyIGlzIGxpc3RlbmluZy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyLCBvciAwIGlmIHRoZXJlIGlzIG5vIHNlcnZlciBtYW5hZ2VyLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0U2VydmVyTWdyUG9ydCgpIHsKKwkJcmV0dXJuIHNlcnZlck1nclBvcnQ7CisJfQorCisJLyoqIExvYWQgdGhlIHByb3BlcnRpZXMgZGVzY3JpYmVkIGluIGFuIFhNTCBwcm9wZXJ0aWVzIGVsZW1lbnQgaW50byB0aGUKKwkgKiBnaXZlbiBwcm9wZXJ0aWVzIG9iamVjdC4KKwkgKgorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzTm9kZSBUaGUgWE1MIG5vZGUgd2hpY2ggaXMgYSA8Y29kZT4mbHQ7cHJvcGVydGllcyZndDs8L2NvZGU+IGVsZW1lbnQuCisJICogQHBhcmFtIHByb3BzIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCB0byBsb2FkIHdpdGggcHJvcGVydGllcyBmcm9tIDx2YXI+cHJvcGVydGllc05vZGU8L3Zhcj4uCisJICovCisJc3RhdGljIHZvaWQgbG9hZFByb3BlcnRpZXMoTm9kZSBwcm9wZXJ0aWVzTm9kZSwgUHJvcGVydGllcyBwcm9wcykgeworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHByb3BlcnRpZXNOb2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSArPSAyKSB7CisJCQlTdHJpbmcga2V5ID0gWE1MLnVud3JhcHBlZFRleHQoY2hpbGRyZW4uaXRlbShpKSk7CisJCQlTdHJpbmcgdmFsdWUgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZHJlbi5pdGVtKGkrMSkpOworCQkJcHJvcHMuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisJCX0KKwl9CisKKwkvKiogRHVtcCB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIG9iamVjdCBpbiBYTUwgZm9ybSwgYXBwZW5kaW5nCisJICogdGhlbSB0byB0aGUgZ2l2ZW4gbm9kZSB1bmRlciBhICZsdDtwcm9wZXJ0aWVzJmd0OyBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIHByb3BzIFRoZSBwcm9wZXJ0aWVzIHRvIGR1bXAgaW4gWE1MIGZvcm0uCisJICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZSAmbHQ7cHJvcGVydGllcyZndDsgZWxlbWVudC4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhIERPTSBlcnJvciBvY2N1cnMuCisJICovCisJc3RhdGljIHZvaWQgZHVtcFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcywgTm9kZSBub2RlKSB7CisJCUVsZW1lbnQgcHJvcGVydGllc0VsZW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCJwcm9wZXJ0aWVzIik7CisJCW5vZGUuYXBwZW5kQ2hpbGQocHJvcGVydGllc0VsZW1lbnQpOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisJCQlYTUwuYWRkKHByb3BlcnRpZXNFbGVtZW50LCAia2V5IiwgKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpOworCQkJWE1MLmFkZChwcm9wZXJ0aWVzRWxlbWVudCwgInZhbHVlIiwgKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7CisJCX0KKwl9CisKKwkvKiogQ3JlYXRlIGEgbmV3IFhNTCBkb2N1bWVudCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIERURC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gZ2l2ZSB0byB0aGUgZG9jdW1lbnQgZWxlbWVudC4KKwkgKiBAcmV0dXJucyBBbiBYTUwgRE9NIGRvY3VtZW50IHdpdGggdGhlIGRvY3R5cGUgYW5kIHRoZSByb290IGRvY3VtZW50IGVtcHR5IGVsZW1lbnQgaW4gcGxhY2UuCisJICogQHRocm93cyBET01FeGNlcHRpb24gSWYgd2UgY2FuJ3QgY3JlYXRlIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlzdGF0aWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50RWxlbWVudE5hbWUpIHRocm93cyBET01FeGNlcHRpb24geworCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IFhNTC5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50VHlwZShkb2N1bWVudEVsZW1lbnROYW1lLCBEVERfRlBJLCBEVERfVVJMKTsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoLypuYW1lc3BhY2VVUkkqL251bGwsIGRvY3VtZW50RWxlbWVudE5hbWUsIGRvY1R5cGUpOworCQlyZXR1cm4gZG9jOworCX0KKworCS8qKiBUaGUgZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyIChGUEkpIG9mIHRoZSBjb25maWd1cmF0aW9uIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfRlBJID0gIi0vL0pQTC8vRFREIEVEQSBDb25maWd1cmF0aW9uIDEuMC8vRU4iOworCQorCS8qKiBUaGUgb2xkIGZvcm1hbCBwdWJsaWMgaWRlbnRpZmllciAoRlBJKSBvZiB0aGUgY29uZmlndXJhdGlvbiBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX09MRF9GUEkgPSAiLS8vSlBMLy9EVEQgT09EVCBDb25maWd1cmF0aW9uIDEuMC8vRU4iOworCisJLyoqIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgY29uZmlndXJhdGlvbiBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1VSTCA9ICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvZWRtLWNvbW1vbnMvQ29uZmlndXJhdGlvbi5kdGQiOworCisJLyoqIE5hbWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IG5hbWVzIHRoZSB3ZWIgcHJvdG9jb2wgdG8gdXNlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9UT0NPTF9QUk9QRVJUWSA9ICJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uLndlYlByb3RvY29sIjsKKworCS8qKiBHbG9iYWwgcHJvcGVydGllcy4gKi8KKwlwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKwkvKiogT2JqZWN0IGNvbnRleHQgZW52aXJvbm1lbnQuICovCisJSGFzaHRhYmxlIGNvbnRleHRFbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKKworCS8qKiBFeGVjLXNlcnZlcnMuICovCisJcHJpdmF0ZSBMaXN0IGV4ZWNTZXJ2ZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisJLyoqIFdlYiBzZXJ2ZXIgaG9zdC4gKi8KKwlwcml2YXRlIFN0cmluZyB3ZWJIb3N0OworCisJLyoqIFdlYiBzZXJ2ZXIgcG9ydC4gKi8KKwlwcml2YXRlIFN0cmluZyB3ZWJQb3J0OworCisJLyoqIFdlYiBzZXJ2ZXIgZG9jIGRpci4gKi8KKwlwcml2YXRlIEZpbGUgd2ViU2VydmVyRG9jdW1lbnREaXJlY3Rvcnk7CisKKwkvKiogTmFtZSBzZXJ2ZXIgdXNpbmcgcmlyIHByb3RvY29sLgorCSAqCisJICogSWYgZmFsc2UsIHRoZW4gaXQncyB1c2luZyBpaW9wLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBuYW1lU2VydmVyVXNpbmdSSVJQcm90b2NvbDsKKworCS8qKiBOYW1lIHNlcnZlciB2ZXJzaW9uLiAqLworCXByaXZhdGUgU3RyaW5nIG5hbWVTZXJ2ZXJWZXJzaW9uOworCisJLyoqIE5hbWUgc2VydmVyIGhvc3QuICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZVNlcnZlckhvc3Q7CisKKwkvKiogTmFtZSBzZXJ2ZXIgcG9ydC4gKi8KKwlwcml2YXRlIFN0cmluZyBuYW1lU2VydmVyUG9ydDsKKworCS8qKiBOYW1lIHNlcnZlciBvYmplY3Qga2V5LiAqLworCXByaXZhdGUgU3RyaW5nIG5hbWVTZXJ2ZXJPYmplY3RLZXk7CisKKwkvKiogSG93IG9mdGVuIHRoZSBuYW1lIHNlcnZlciBzYXZlcyBpdHMgc3RhdGUuICovCisJcHJpdmF0ZSBpbnQgbmFtZVNlcnZlclN0YXRlRnJlcXVlbmN5OworCisJLyoqIE9uIHdoYXQgcG9ydCB0aGUgc2VydmVyIG1hbmFnZXIgd2lsbCBsaXN0ZW4uICovCisJcHJpdmF0ZSBpbnQgc2VydmVyTWdyUG9ydDsKKworCS8qKiBUaHJlYWQgdG8gc2V0IGEgY29udGV4dCBjbGFzcyBsb2FkZXIgYW5kIGdldCBhIEpOREkgaW5pdGlhbCBjb250ZXh0LiAqLworCXByaXZhdGUgY2xhc3MgSW5pdGlhbENvbnRleHRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCQkvKiogQ3RvcgorCQkgKgorCQkgKiBAcGFyYW0gbG9hZGVyIFdoYXQgY2xhc3MgbG9hZGVyIHRvIHVzZSBhcyB0aHJlYWQncyBjb250ZXh0IGNsYXNzIGxvYWRlci4KKwkJICovCisJCXB1YmxpYyBJbml0aWFsQ29udGV4dFRocmVhZChDbGFzc0xvYWRlciBsb2FkZXIpIHsKKwkJCXNldENvbnRleHRDbGFzc0xvYWRlcihsb2FkZXIpOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJdHJ5IHsKKwkJCQljb250ZXh0ID0gbmV3IEluaXRpYWxDb250ZXh0KGNvbnRleHRFbnZpcm9ubWVudCk7CisJCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZXgpIHsKKwkJCQlleGNlcHRpb24gPSBleDsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJVbmV4cGVjdGVkIHRocm93YWJsZSAiICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZ2V0dGluZyBpbml0aWFsIGNvbnRleHQ6ICIKKwkJCQkJKyB0LmdldE1lc3NhZ2UoKSk7CisJCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCisJCS8qKiBHZXQgdGhlIGNvbnRleHQuCisJCSAqCisJCSAqIDxzdHJvbmc+V2FybmluZyE8L3N0cm9uZz4gRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgdW50aWwgdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgorCQkgKgorCQkgKiBAcmV0dXJuIFRoZSBjb250ZXh0LCBvciBudWxsIGlmIHRoZSBjb250ZXh0IGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQuCisJCSAqLworCQlwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworCQkJcmV0dXJuIGNvbnRleHQ7CisJCX0KKworCQkvKiogR2V0IGFueSBleGNlcHRpb24uCisJCSAqCisJCSAqIEByZXR1cm4gQW55IGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlIHJldHJpZXZpbmcgdGhlIGNvbnRleHQuCisJCSAqLworCQlwdWJsaWMgTmFtaW5nRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKwkJCXJldHVybiBleGNlcHRpb247CisJCX0KKworCQkvKiogSk5ESSBjb250ZXh0LiAqLworCQlwcml2YXRlIENvbnRleHQgY29udGV4dDsKKworCQkvKiogQW55IGV4Y2VwdGlvbi4gKi8KKwkJcHJpdmF0ZSBOYW1pbmdFeGNlcHRpb24gZXhjZXB0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0NvbmZpZ3VyYXRpb25FbnRpdHlSZXNvbHZlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvQ29uZmlndXJhdGlvbkVudGl0eVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3ODRkYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0NvbmZpZ3VyYXRpb25FbnRpdHlSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKiBYTUwgZW50aXR5IHJlc29sdmVyIGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICoKKyAqIFRoaXMgcmVzb2x2ZXIgYXR0ZW1wdHMgdG8gdXNlIGEgbG9jYWxseSBhY2Nlc3NpYmxlIGNvbmZpZ3VyYXRpb24uZHRkIHNvIHRoYXQgd2UgY2FuCisgKiBib290c3RyYXAgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgd2l0aG91dCBodHRwIGFjY2Vzcy4gIFlvdSBzZWUsIFRoZSBjb25maWcgZmlsZQorICogc3BlY2lmaWVzIHRoZSBsaXN0IG9mIGVudGl0eSBkaXJlY3RvcmllcywgYnV0IHRoZSBjb25maWcgZmlsZSBpdHNlbGYgaXMgYW4gWE1MIGRvY3VtZW50CisgKiB0aGF0IHJlZmVycyB0byBpdHMgZG9jdHlwZSBlbnRpdHkuICBXZSB0aGVyZWZvcmUgcmVzb2x2ZSB0aGUgY29uZmlnIERURCB0byBhCisgKiBjbGFzc3BhdGgtYWNlc3NpYmxlIGNvcHkuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitjbGFzcyBDb25maWd1cmF0aW9uRW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBFbnRpdHlSZXNvbHZlciB7CisJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJaWYgKENvbmZpZ3VyYXRpb24uRFREX0ZQSS5lcXVhbHMocHVibGljSUQpIHx8IENvbmZpZ3VyYXRpb24uRFREX09MRF9GUEkuZXF1YWxzKHB1YmxpY0lEKSkKKwkJCXJldHVybiBuZXcgSW5wdXRTb3VyY2UoQ29uZmlndXJhdGlvbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJDb25maWd1cmF0aW9uLmR0ZCIpKTsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvQ29uZmlndXJlZFRlc3RDYXNlLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmVkVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc1MzBhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvQ29uZmlndXJlZFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07DQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KKw0KKy8qKg0KKyAqIEJhc2UgdGVzdCBjYXNlIGZvciB0ZXN0cyB0aGF0IG5lZWQgdGhlIENvbmZpZ3VyYXRpb24gb2JqZWN0Lg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqLyANCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZmlndXJlZFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2Ugew0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29uZmlndXJlZFRlc3RDYXNlfSBpbnN0YW5jZS4NCisJICoNCisJICogQHBhcmFtIGNhc2VOYW1lIENhc2UgbmFtZS4NCisJICovDQorCXByb3RlY3RlZCBDb25maWd1cmVkVGVzdENhc2UoU3RyaW5nIGNhc2VOYW1lKSB7DQorCQlzdXBlcihjYXNlTmFtZSk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBTZXQgdXAgYSB0ZXN0IENvbmZpZ3VyYXRpb24gb2JqZWN0Lg0KKwkgKg0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KKwkJc3VwZXIuc2V0VXAoKTsNCisJCWlmIChDb25maWd1cmF0aW9uLmNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgew0KKwkJCXRyeSB7DQorCQkJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKFRTVERPQyk7DQorCQkJCUlucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7DQorCQkJCWlzLnNldEVuY29kaW5nKCJVVEYtOCIpOw0KKwkJCQlpcy5zZXRQdWJsaWNJZCgiLS8vSlBMLy9YTUwgRURNIFRlc3QgQ29uZmlndXJhdGlvbiAwLjAuMC8vRU4iKTsNCisJCQkJaXMuc2V0U3lzdGVtSWQoImludGVybmFsOnRlc3QtZWRhcmMueG1sIik7DQorCQkJCUNvbmZpZ3VyYXRpb24uY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKGlzKTsNCisJCQkJcmVhZGVyLmNsb3NlKCk7DQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCisJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKiogVGVzdCBjb25maWd1cmF0aW9uLCBhcyBhIGRvY3VtZW50LiAqLw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFNURE9DID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPCFET0NUWVBFIGNvbmZpZ3VyYXRpb24gUFVCTElDIg0KKwkJKyAiIFwiLS8vSlBMLy9EVEQgRURBIENvbmZpZ3VyYXRpb24gMS4wLy9FTlwiIFwiaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2VkbS1jb21tb25zL0NvbmZpZ3VyYXRpb24uZHRkXCI+XG4iDQorCQkrICI8Y29uZmlndXJhdGlvbj48d2ViU2VydmVyPjxob3N0Pnd3dy5qcGwubmFzYS5nb3Y8L2hvc3Q+PHBvcnQ+ODE8L3BvcnQ+PGRpcj4vbm9uL2V4aXN0ZW50L2h0ZG9jczwvZGlyPiINCisJCSsgIjwvd2ViU2VydmVyPjxuYW1lU2VydmVyPjxpaW9wPjx2ZXJzaW9uPjE8L3ZlcnNpb24+PGhvc3Q+b29kdC5qcGwubmFzYS5nb3Y8L2hvc3Q+PHBvcnQ+ODI8L3BvcnQ+Ig0KKwkJKyAiPG9iamVjdEtleT5TdGFuZGFyZE5TL05hbWVTZXJ2ZXIlMkRQT0EvX3Rlc3Q8L29iamVjdEtleT48L2lpb3A+PC9uYW1lU2VydmVyPjxsZGFwU2VydmVyPiINCisJCSsgIjxob3N0PmxkYXAuanBsLm5hc2EuZ292PC9ob3N0Pjxwb3J0PjgzPC9wb3J0PjxtYW5hZ2VyRE4+Y249R2VvcmdlVGVzdG9zdG9sZXMsZGM9dGVzdCxkYz16b25lPC9tYW5hZ2VyRE4+Ig0KKwkJKyAiPHBhc3N3b3JkPmgxZ2hseTtzM2NyM3Q8L3Bhc3N3b3JkPjwvbGRhcFNlcnZlcj48eG1sPjxwYXJzZXI+Y3JpbXNvbjwvcGFyc2VyPjxlbnRpdHlSZWY+Ig0KKwkJKyAiPGRpcj4vbm9uL2V4aXN0ZW50L2h0ZG9jcy94bWw8L2Rpcj48ZGlyPi9ub24vZXhpc3RlbnQvaHRkb2NzL2R0ZDwvZGlyPjwvZW50aXR5UmVmPjwveG1sPjxzZXJ2ZXJNZ3I+Ig0KKwkJKyAiPHBvcnQ+ODQ8L3BvcnQ+PC9zZXJ2ZXJNZ3I+PHByb3BlcnRpZXM+PGtleT5nbG9iYWw8L2tleT48dmFsdWU+MTwvdmFsdWU+PGtleT5vdmVycmlkZTwva2V5Pjx2YWx1ZT4yPC92YWx1ZT4iDQorCQkrICI8L3Byb3BlcnRpZXM+PHByb2dyYW1zPjxleGVjU2VydmVyPjxjbGFzcz5UZXN0U2VydmVyPC9jbGFzcz48b2JqZWN0S2V5PnVybjplZGE6cm1pOlRlc3RPYmplY3Q8L29iamVjdEtleT4iDQorCQkrICI8aG9zdD5vb2R0LmpwbC5uYXNhLmdvdjwvaG9zdD48cHJvcGVydGllcz48a2V5PmxvY2FsPC9rZXk+PHZhbHVlPjM8L3ZhbHVlPjxrZXk+b3ZlcnJpZGU8L2tleT48dmFsdWU+NDwvdmFsdWU+Ig0KKwkJKyAiPC9wcm9wZXJ0aWVzPjwvZXhlY1NlcnZlcj48Y2xpZW50PjxjbGFzcz5UZXN0Q2xpZW50PC9jbGFzcz48cHJvcGVydGllcz48a2V5PmxvY2FsPC9rZXk+PHZhbHVlPjU8L3ZhbHVlPiINCisJCSsgIjxrZXk+b3ZlcnJpZGU8L2tleT48dmFsdWU+NjwvdmFsdWU+PC9wcm9wZXJ0aWVzPjwvY2xpZW50PjwvcHJvZ3JhbXM+PC9jb25maWd1cmF0aW9uPiI7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0VEQUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvRURBRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5ZmU4OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0VEQUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCitwdWJsaWMgY2xhc3MgRURBRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKwlwdWJsaWMgRURBRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwkJc3VwZXIobXNnKTsKKwl9CisKKwlwdWJsaWMgRURBRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihjYXVzZSk7CisJfQorCisJcHVibGljIEVEQUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobXNnLCBjYXVzZSk7CisJfQorfQorCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9FeGVjU2VydmVyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9FeGVjU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4MjkzZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0V4ZWNTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnM7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEucm1pLlJNSVNlY3VyaXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuWG1sUnBjQ2xpZW50TGl0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNTZXJ2ZXI7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlU3R1YjsKK2ltcG9ydCBqYXZhLnJtaS5zZXJ2ZXIuVW5pY2FzdFJlbW90ZU9iamVjdDsKK2ltcG9ydCBqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN0OworaW1wb3J0IGphdmEucm1pLnNlcnZlci5SZW1vdGVSZWY7CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uQmFzZTY0RW5jb2RpbmdPdXRwdXRTdHJlYW07CisKKy8qKiBTZXJ2ZXIgZXhlY3V0aW9uIHByb2dyYW0uCisgKgorICogVGhpcyBpcyBhbiBleGVjdXRhYmxlIGNsYXNzIHRoYXQgc3RhcnRzIGEgSlBMIEVEQSBzZXJ2ZXIuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgRXhlY1NlcnZlciB7CisJLyoqIFN0YXJ0IGEgc2VydmVyLgorCSAqCisJICogVGhlIGNvbW1hbmQtbGluZSBzaG91bGQgaGF2ZSB0d28gYXJndW1lbnRzOgorCSAqCisJICogPG9sPgorCSAqICAgPGxpPlRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmVyIHRvIGV4ZWN1dGUuPC9saT4KKwkgKiAgIDxsaT5UaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZlciB0byByZWdpc3RlciB3aXRoIHRoZSBuYW1pbmcgc2VydmljZS48L2xpPgorCSAqIDwvb2w+CisJICoKKwkgKiBAcGFyYW0gYXJndiBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKKwkJaWYgKGFyZ3YubGVuZ3RoIDwgMikgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogY2xhc3MtbmFtZS1vZi1zZXJ2ZXIgb2JqZWN0LW5hbWUiKTsKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJU3RyaW5nIGNsYXNzTmFtZSA9IGFyZ3ZbMF07CisJCVN0cmluZyBuYW1lID0gYXJndlsxXTsKKworCQkvLyBFbmFibGUgc3VwcG9ydCBvZiBvdXIgc3BlY2lhbCBVUkxzLCBsaWtlIHN0ZGluOgorCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEucHJvdG9jb2wuaGFuZGxlci5wa2dzIiwgIm9yZy5hcGFjaGUub29kdC5jb21tb25zLm5ldC5wcm90b2NvbCIpOworCisJCXRyeSB7CisJCQkvLyBHZXQgdGhlIGNvbmZpZ3VyYXRpb24uCisJCQljb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uKCk7CisJCQljb25maWd1cmF0aW9uLm1lcmdlUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworCQkJLy8gU2V0IHVwIHRoZSBsb2dnZXIuCisJCQlMb2dJbml0LmluaXQoU3lzdGVtLmdldFByb3BlcnRpZXMoKSwgbmFtZSk7CisKKwkJCS8vIFJ1biBpbml0aWFsaXplcnMKKwkJCXRyeSB7CisJCQkJcnVuSW5pdGlhbGl6ZXJzKCk7CisJCQl9IGNhdGNoIChFREFFeGNlcHRpb24gZXgpIHsKKwkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJCX0KKworCQkJLy8gQ3JlYXRlIGl0LgorCQkJZmluYWwgRXhlY1NlcnZlciBzZXJ2ZXIgPSBuZXcgRXhlY1NlcnZlcihuYW1lLCBjbGFzc05hbWUpOworCisJCQkvLyBQcmludCBpdC4KKwkJCWlmIChCb29sZWFuLmdldEJvb2xlYW4oUFJJTlRfSU9SX1BST1BFUlRZKSkgeworCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmFudCgpIGluc3RhbmNlb2YgUmVtb3RlT2JqZWN0KSB7CisJCQkJCVJlbW90ZU9iamVjdCByZW1vdGVPYmplY3QgPSAoUmVtb3RlT2JqZWN0KSBzZXJ2ZXIuZ2V0U2VydmFudCgpOworCQkJCQlSZW1vdGVTdHViIHJlbW90ZVN0dWIgPSAoUmVtb3RlU3R1YikgUmVtb3RlT2JqZWN0LnRvU3R1YihyZW1vdGVPYmplY3QpOworCQkJCQlSZW1vdGVSZWYgcmVmID0gcmVtb3RlU3R1Yi5nZXRSZWYoKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludCgiUk1JOiIpOworCQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7CisJCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvYmpPdXQKKwkJCQkJCT0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQmFzZTY0RW5jb2RpbmdPdXRwdXRTdHJlYW0oU3lzdGVtLm91dCkpOworCQkJCQlvYmpPdXQud3JpdGVPYmplY3QocmVmKTsKKwkJCQkJb2JqT3V0LmZsdXNoKCk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQkJCX0gZWxzZSB7CisJCQkJCW9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudCBzZXJ2YW50PShvcmcub21nLlBvcnRhYmxlU2VydmVyLlNlcnZhbnQpc2VydmVyLmdldFNlcnZhbnQoKTsKKwkJCQkJb3JnLm9tZy5DT1JCQS5PUkIgb3JiID0gc2VydmFudC5fb3JiKCk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihvcmIub2JqZWN0X3RvX3N0cmluZyhzZXJ2YW50Ll90aGlzX29iamVjdChvcmIpKSk7CisJCQkJfQorCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKKwkJCX0KKworCQkJLy8gQmluZCBpdC4KKwkJCWlmICghQm9vbGVhbi5nZXRCb29sZWFuKERJU0FCTEVfQklORElORykpIHsKKwkJCQliaW5kZXIgPSBuZXcgQmluZGVyKG5hbWUsIHNlcnZlcik7CisJCQkJYmluZGVyLnN0YXJ0KCk7CisJCQl9CisKKwkJCS8vIFByZXBhcmUgZm9yIHRoZSBpbmV2aXRhYmxlCisJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZCgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCXNlcnZlci5zaHV0ZG93bjAoKTsKKwkJCQl9CisJCQl9KTsKKworCQkJLy8gV2UncmUgZG9uZSBoZXJlLgorCQkJZm9yICg7OykgdHJ5IHsKKwkJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiSS9PIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhdCBsaW5lICIgKyBleC5nZXRMaW5lTnVtYmVyKCkgKyAiLCBjb2x1bW4gIgorCQkJCSsgZXguZ2V0Q29sdW1uTnVtYmVyKCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yICIgKyBleC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgd2hpbGUgYXR0ZW1wdGluZyB0byBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiIKKwkJCQkrICIgZmlsZTogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTmFtaW5nL2RpcmVjdG9yeSBlcnJvcjogIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKwkJCVRocm93YWJsZSB0YXJnZXQgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ29uc3RydWN0b3IgZm9yIFwiIiArIGNsYXNzTmFtZSArICJcIiB0aHJldyAiICsgdGFyZ2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIgorCQkJCSsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJCXRhcmdldC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgZXg7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJFeGNlcHRpb24gIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbml0aWFsaXppbmcgc2VydmVyIFwiIiArIG5hbWUKKwkJCQkrICJcIiB3aXRoIGNsYXNzIFwiIiArIGNsYXNzTmFtZSArICJcIjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSAKKwkJU3lzdGVtLmV4aXQoMSk7CisJfQorCisJcHJvdGVjdGVkIEV4ZWNTZXJ2ZXIoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgbmV3IGV4ZWN1dGFibGUgc2VydmVyLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgc2VydmVyCisJICogQHBhcmFtIGNsYXNzTmFtZSBOYW1lIG9mIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgc2VydmVyLgorCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBJZiB0aGUgY2xhc3MgZm9yIDx2YXI+Y2xhc3NOYW1lPC92YXI+IGNhbid0IGJlIGZvdW5kLgorCSAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIElmIHRoZSBjb25zdHJ1Y3RvciBmb3IgPHZhcj5jbGFzc05hbWU8L3Zhcj4gdGFraW5nIGEgc2luZ2xlIDxjb2RlPkV4ZWNTZXJ2ZXI8L2NvZGU+CisJICogICAgICAgICBjYW4ndCBiZSBmb3VuZC4KKwkgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgdGhlIGNsYXNzIGZvciA8dmFyPmNsYXNzTmFtZTwvdmFyPiBpcyBhYnN0cmFjdCBvciBpcyBhbiBpbnRlcmZhY2UuCisJICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIElmIHRoZSBjbGFzcyBmb3IgPHZhcj5jbGFzc05hbWU8L3Zhcj4gaXNuJ3QgcHVibGljLgorCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBjb25zdHJ1Y3RvciBmb3IgPHZhcj5jbGFzc05hbWU8L3Zhcj4uCisJICogQHRocm93cyBET01FeGNlcHRpb24gSWYgdGhlIHNlcnZlcidzIHN0YXR1cyBkb2N1bWVudCBjYW4ndCBiZSBjcmVhdGVkLgorCSAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gSWYgdGhlIGxvY2FsIGhvc3QgbmFtZSBjYW4ndCBiZSBkZXRlcm1pbmVkLgorCSAqLworCXB1YmxpYyBFeGVjU2VydmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAorCQlJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBET01FeGNlcHRpb24sIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKworCQkvLyBGaW5kIHRoZSBjbGFzcyBhbmQgdGhlIHJlcXVpcmVkIGNvbnN0cnVjdG9yLgorCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJQ29uc3RydWN0b3IgY3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde0V4ZWNTZXJ2ZXIuY2xhc3N9KTsKKworCQkvLyBJbnZva2UgdGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSB0aGUgc2VydmFudC4KKwkJc2VydmFudCA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3RoaXN9KTsKKwkJRGF0ZSBzdGFydERhdGUgPSBuZXcgRGF0ZSgpOworCisJCS8vIENyZWF0ZSB0aGUgWE1MLVJQQyBpbnRlcmZhY2UgdG8gdGhpcyBzZXJ2ZXIuCisJCXhtbHJwY1NlcnZlciA9IG5ldyBYbWxScGNTZXJ2ZXIoKTsKKwkJeG1scnBjU2VydmVyLmFkZEhhbmRsZXIoInNlcnZlciIsIHRoaXMpOworCisJCS8vIENyZWF0ZSB0aGUgc2VydmVyIHN0YXR1cyBkb2N1bWVudC4KKwkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBYTUwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudFR5cGUoInNlcnZlciIsIFNUQVRVU19GUEksIFNUQVRVU19VUkwpOworCQlzdGF0dXNEb2N1bWVudCA9IFhNTC5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KC8qbmFtZXNwYWNlVVJJKi9udWxsLCAic2VydmVyIiwgZG9jVHlwZSk7CisJCUVsZW1lbnQgc2VydmVyRWxlbWVudCA9IHN0YXR1c0RvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOworCQlYTUwuYWRkKHNlcnZlckVsZW1lbnQsICJuYW1lIiwgbmFtZSk7CisJCVhNTC5hZGQoc2VydmVyRWxlbWVudCwgImNsYXNzIiwgY2xhc3NOYW1lKTsKKwkJWE1MLmFkZChzZXJ2ZXJFbGVtZW50LCAic3RhdGUiLCAidXAiKTsKKwkJRWxlbWVudCBzdGFydEVsZW1lbnQgPSBzdGF0dXNEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdGFydCIpOworCQlzZXJ2ZXJFbGVtZW50LmFwcGVuZENoaWxkKHN0YXJ0RWxlbWVudCk7CisJCUVsZW1lbnQgdXNlckVsZW1lbnQgPSBzdGF0dXNEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1c2VyIik7CisJCXN0YXJ0RWxlbWVudC5hcHBlbmRDaGlsZCh1c2VyRWxlbWVudCk7CisJCVhNTC5hZGQodXNlckVsZW1lbnQsICJuYW1lIiwgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiLCAiVU5LTk9XTiIpKTsKKwkJWE1MLmFkZCh1c2VyRWxlbWVudCwgImN3ZCIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiLCAiVU5LTk9XTiIpKTsKKwkJWE1MLmFkZCh1c2VyRWxlbWVudCwgImhvbWUiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIsICJVTktOT1dOIikpOworCQlFbGVtZW50IGRhdGVFbGVtZW50ID0gc3RhdHVzRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGF0ZSIpOworCQlzdGFydEVsZW1lbnQuYXBwZW5kQ2hpbGQoZGF0ZUVsZW1lbnQpOworCQlkYXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1zIiwgU3RyaW5nLnZhbHVlT2Yoc3RhcnREYXRlLmdldFRpbWUoKSkpOworCQlkYXRlRWxlbWVudC5hcHBlbmRDaGlsZChzdGF0dXNEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdGFydERhdGUudG9TdHJpbmcoKSkpOworCQlYTUwuYWRkKHN0YXJ0RWxlbWVudCwgImNvbmZpZyIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuQ29uZmlndXJhdGlvbi51cmwiLCAiVU5LTk9XTiIpKTsKKwkJRWxlbWVudCBob3N0RWxlbWVudCA9IHN0YXR1c0RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImhvc3QiKTsKKwkJc2VydmVyRWxlbWVudC5hcHBlbmRDaGlsZChob3N0RWxlbWVudCk7CisJCVhNTC5hZGQoaG9zdEVsZW1lbnQsICJuYW1lIiwgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSk7CisJCUVsZW1lbnQgb3NFbGVtZW50ID0gc3RhdHVzRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3MiKTsKKwkJaG9zdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3NFbGVtZW50KTsKKwkJWE1MLmFkZChvc0VsZW1lbnQsICJuYW1lIiwgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiwgIlVOS05PV04iKSk7CisJCVhNTC5hZGQob3NFbGVtZW50LCAidmVyc2lvbiIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MudmVyc2lvbiIsICJVTktOT1dOIikpOworCQlYTUwuYWRkKG9zRWxlbWVudCwgImFyY2giLCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giLCAiVU5LTk9XTiIpKTsKKwkJRWxlbWVudCB2bUVsZW1lbnQgPSBzdGF0dXNEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2bSIpOworCQlzZXJ2ZXJFbGVtZW50LmFwcGVuZENoaWxkKHZtRWxlbWVudCk7CisJCVhNTC5hZGQodm1FbGVtZW50LCAibmFtZSIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIiwgIlVOS05PV04iKSk7CisJCVhNTC5hZGQodm1FbGVtZW50LCAidmVyc2lvbiIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwgIlVOS05PV04iKSk7CisJCVhNTC5hZGQodm1FbGVtZW50LCAiY2xhc3NwYXRoIiwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiLCAiVU5LTk9XTiIpKTsKKwkJWE1MLmFkZCh2bUVsZW1lbnQsICJleHRkaXJzIiwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmV4dC5kaXJzIiwgIlVOS05PV04iKSk7CisJCWxvZ0VsZW1lbnQgPSBzdGF0dXNEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsb2ciKTsKKwkJc2VydmVyRWxlbWVudC5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTsKKwl9CisKKwkvKiogR2V0IG15IG5hbWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIHVuZGVyIHdoaWNoIEknbSByZWdpc3RlcmVkIGluIHRlaCBuYW1pbmcgY29udGV4dC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKiBSZXR1cm4gdGhlIHNlcnZhbnQgZm9yIHRoaXMgZXhlY3V0YWJsZSBzZXJ2ZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzZXJ2YW50LgorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0U2VydmFudCgpIHsKKwkJcmV0dXJuIHNlcnZhbnQ7CisJfQorCisJLyoqIENvbnRyb2wgdGhpcyBzZXJ2ZXIuCisJICoKKwkgKiBAcGFyYW0gY29tbWFuZCBDb21tYW5kIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KKwkgKiBAcmV0dXJuIFJlc3VsdHMgb2YgPHZhcj5jb21tYW5kPC92YXI+LgorCSAqLworCXB1YmxpYyBieXRlW10gY29udHJvbChieXRlW10gY29tbWFuZCkgeworCQlyZXR1cm4geG1scnBjU2VydmVyLmV4ZWN1dGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbW1hbmQpKTsKKwl9CisKKwkvKiogUmV0dXJuIHRoZSBzZXJ2ZXIncyBjbGFzcyBuYW1lLgorCSAqCisJICogQHJldHVybiBJdHMgY2xhc3MgbmFtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckNsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIGNsYXNzTmFtZTsKKwl9CisKKwkvKiogUmV0dXJuIHN0YXR1cyBvZiB0aGlzIHNlcnZlci4KKwkgKgorCSAqIEByZXR1cm4gSXRzIHN0YXR1cy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZlclN0YXR1cygpIHsKKwkJLy8gVXBkYXRlIHRoZSBzdGF0dXMgZG9jdW1lbnQgd2l0aCB0aGUgY3VycmVudCBsb2cuCisJCWZvciAoSXRlcmF0b3IgaSA9IExvZ0luaXQuTUVNT1JZX0xPR0dFUi5nZXRNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJU3RyaW5nIG1lc3NhZ2UgPSAoU3RyaW5nKSBpLm5leHQoKTsKKwkJCUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSBzdGF0dXNEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXNzYWdlIik7CisJCQltZXNzYWdlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsICJwcmVzZXJ2ZSIpOworCQkJbWVzc2FnZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc3RhdHVzRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWVzc2FnZSkpOworCQkJbG9nRWxlbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlRWxlbWVudCk7CisJCX0KKworCQkvLyBTZXJpYWxpemUgdGhlIGRvY3VtZW50LgorCQlTdHJpbmcgcmMgPSBYTUwuc2VyaWFsaXplKHN0YXR1c0RvY3VtZW50KTsKKworCQkvLyBSZW1vdmUgYWxsIHRoZSBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgZG9jdW1lbnQuCisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbG9nRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkKKwkJCWxvZ0VsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGRyZW4uaXRlbShpKSk7CisKKwkJLy8gUmV0dXJuIHRoZSBzZXJpYWxpemVkIGZvcm0sIHdoaWNoIGluY2x1ZGVkIHRoZSBsb2cgbWVzc2FnZXMuCisJCVN5c3RlbS5lcnIucHJpbnRsbihyYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiogU2V0IGEgc3lzdGVtIHByb3BlcnR5LgorCSAqCisJICogVGhpcyB1c2VzIHRoZSBwcm9wZXJ0eSBtYW5hZ2VyIHRvIG5vdGlmeSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzLgorCSAqCisJICogQHBhcmFtIGtleSBQcm9wZXJ0eSdzIG5hbWUuCisJICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS4KKwkgKiBAcmV0dXJuIFplcm8gKHJldHVybiByZXF1aXJlZCBmb3IgWE1MLVJQQyBhY2Nlc3MpLgorCSAqLworCXB1YmxpYyBpbnQgc2V0U3lzdGVtUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiU2V0dGluZyBzeXN0ZW0gcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHRvIFwiIiArIHZhbHVlICsgIlwiIik7CisJCVByb3BlcnR5TWdyLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKioKKwkgKiBDYWxsIHRoZSBzZXJ2ZXIgbWFuYWdlciBvbiB0aGUgbG9jYWwgc3lzdGVtLgorCSAqCisJICogQHBhcmFtIHBvcnQgV2hhdCBwb3J0IG9uIHRoZSBsb2NhbCBzeXN0ZW0gdGhlIHNlcnZlciBtYW5hZ2VyIGlzIGxpc3RlbmluZy4KKwkgKiBAcGFyYW0gdXNlciBVc2VyIG5hbWUgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbi4KKwkgKiBAcGFyYW0gcGFzc3dvcmQgQXV0aGVudGljYXRvciBmb3IgPHZhcj51c2VyPC92YXI+LgorCSAqIEBwYXJhbSBtZXRob2QgV2hhdCBtZXRob2QgaW4gdGhlIHNlcnZlciBtYW5hZ2VyIHRvIGNhbGwuCisJICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCBuYW1lZCBieSA8dmFyPm1ldGhvZDwvdmFyPi4KKwkgKiBAcmV0dXJuIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgbWV0aG9kIG5hbWVkIGJ5IDx2YXI+bWV0aG9kPC92YXI+LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIE9iamVjdCBjYWxsTG9jYWxTZXJ2ZXJNYW5hZ2VyKGludCBwb3J0LCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgbWV0aG9kLCBMaXN0IHBhcmFtcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVhtbFJwY0NsaWVudExpdGUgbG9jYWwgPSBuZXcgWG1sUnBjQ2xpZW50TGl0ZSgibG9jYWxob3N0IiwgcG9ydCk7CisJCWxvY2FsLnNldEJhc2ljQXV0aGVudGljYXRpb24odXNlciwgcGFzc3dvcmQpOworCQlyZXR1cm4gbG9jYWwuZXhlY3V0ZShtZXRob2QsIG5ldyBWZWN0b3IocGFyYW1zKSk7CisJfQorCisJLyoqIFNodXQgZG93biBhbmQgZXhpdC4KKwkgKgorCSAqIEByZXR1cm4gWmVyby4KKwkgKi8KKwlwdWJsaWMgaW50IHNodXRkb3duKCkgeworCQkvLyBMb2cgaXQuCisJCVN5c3RlbS5lcnIucHJpbnRsbigiUmVjZWl2ZWQgc2h1dGRvd24gY29tbWFuZCIpOworCisJCS8vIE1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBleGl0IHNvbWV0aW1lIHNvb24uCisJCW5ldyBUaHJlYWQoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJVGhyZWFkLnNsZWVwKDE1MDAwKTsKKwkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQl9CisJCX0uc3RhcnQoKTsKKworCQkvLyBDbGVhbiB1cC4KKwkJc2h1dGRvd24wKCk7CisKKwkJLy8gQW5kIGV4aXQuCisJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2FsbGluZyBTeXN0ZW0uZXhpdCB3aXRoIHN0YXR1cyBjb2RlIDAiKTsKKwkJU3lzdGVtLmV4aXQoMCk7CisJCXJldHVybiAwOworCX0KKworCXByaXZhdGUgdm9pZCBzaHV0ZG93bjAoKSB7CisJCS8vIFVuYmluZC4KKwkJaWYgKCFCb29sZWFuLmdldEJvb2xlYW4oRElTQUJMRV9CSU5ESU5HKSkgdHJ5IHsKKwkJCWJpbmRlci5zdG9wQmluZGluZygpOworCQkJQ29udGV4dCBvYmplY3RDb250ZXh0ID0gY29uZmlndXJhdGlvbi5nZXRPYmplY3RDb250ZXh0KCk7CisJCQlvYmplY3RDb250ZXh0LnVuYmluZChnZXROYW1lKCkpOworCQkJb2JqZWN0Q29udGV4dC5jbG9zZSgpOworCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gaWdub3JlKSB7fQorCisJCS8vIEtpbGwgdGhlIE9SQi4gIFlFQUghICBLSUxMIElULCBLSUxMIElULCBLSUlJSUlJSUlJSUlJSUlMIElJSUlJSUlJVCEhISEhISExCisJCXRyeSB7CisJCQlpZiAoc2VydmFudCBpbnN0YW5jZW9mIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudCkgeworCQkJCW9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudCBzID0gKG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudCkgc2VydmFudDsKKwkJCQlvcmcub21nLkNPUkJBLk9SQiBvcmIgPSBzLl9vcmIoKTsKKwkJCQlvcmIuc2h1dGRvd24oZmFsc2UvKj0+dGVybWluYXRlIHdpdGhvdXQgd2FpdGluZyBmb3IgcmVxcyB0byBjb21wbGV0ZSovKTsKKwkJCX0KKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZSkge30KKwl9CisKKwkvKioKKwkgKiBCaW5kaW5nIHRocmVhZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBUaHJlYWQgeworCQlwdWJsaWMgQmluZGVyKFN0cmluZyBuYW1lLCBFeGVjU2VydmVyIHNlcnZlcikgeworCQkJc3VwZXIoIkJpbmRlciBmb3IgIiArIG5hbWUpOworCQkJc2V0RGFlbW9uKHRydWUpOworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMuc2VydmVyID0gc2VydmVyOworCQkJa2VlcEJpbmRpbmcgPSB0cnVlOworCQl9CisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCXdoaWxlIChzaG91bGRLZWVwQmluZGluZygpKSB0cnkgeworCQkJCUNvbnRleHQgb2JqZWN0Q29udGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0T2JqZWN0Q29udGV4dCgpOworCQkJCW9iamVjdENvbnRleHQucmViaW5kKG5hbWUsIHNlcnZlci5nZXRTZXJ2YW50KCkpOworCQkJCW9iamVjdENvbnRleHQuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uIGJpbmRpbmcgYXQgIiArIG5ldyBEYXRlKCkgKyAiOyB3aWxsIGtlZXAgdHJ5aW5nLi4uIik7CisJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCSAgICAgICAgfSBmaW5hbGx5IHsKKwkJCQl0cnkgeworCQkJCQlUaHJlYWQuc2xlZXAoUkVCSU5EX1BFUklPRCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKSB7fQorCQkJfQorCQl9CisJCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wQmluZGluZygpIHsKKwkJCWtlZXBCaW5kaW5nID0gZmFsc2U7CisJCX0KKwkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzaG91bGRLZWVwQmluZGluZygpIHsKKwkJCXJldHVybiBrZWVwQmluZGluZzsKKwkJfQorCQlwcml2YXRlIGJvb2xlYW4ga2VlcEJpbmRpbmc7CisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgRXhlY1NlcnZlciBzZXJ2ZXI7CisJfQorCisJLyoqCisJICogUnVuIGFsbCBpbml0aWFsaXplcnMuCisJICoKKwkgKiBUaGlzIGluc3RhbnRpYXRlcyBhbmQgY2FsbHMgdGhlIHtAbGluayBJbml0aWFsaXplciNpbml0aWFsaXplfSBtZXRob2Qgb2YgZWFjaAorCSAqIGluaXRpYWxpemVyIHNwZWNpZmllZCBieSBjbGFzcyBuYW1lIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyBpbiB0aGUKKwkgKiBzeXN0ZW0gcHJvcGVydGllcy4gIFRoZSBwcm9wZXJ0eSBuYW1lIGlzIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLmluaXRpYWxpemVyczwvY29kZT4sIG9yCisJICogaWYgbm90IGRlZmluZWQsIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLkV4ZWNTZXJ2ZXIuaW5pdGlhbGl6ZXJzPC9jb2RlPiwgb3IgaWYgbm90CisJICogZGVmaW5lZCwgPGNvZGU+aW5pdGlhbGl6ZXJzPC9jb2RlPi4gIEFuZCBpZiB0aGF0IG9uZSdzIG5vdCBkZWZpbmVkLCB0aGVuIG5vbmUKKwkgKiBhcmUgcnVuLgorCSAqCisJICogQHRocm93cyBFREFFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5Jbml0aWFsaXplcnMoKSB0aHJvd3MgRURBRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGluaXRMaXN0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbml0aWFsaXplcnMiLAorCQkJU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5FeGVjU2VydmVyLmluaXRpYWxpemVycyIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiaW5pdGlhbGl6ZXJzIiwgIiIpKSk7CisJCWZvciAoSXRlcmF0b3IgaSA9IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuVXRpbGl0eS5wYXJzZUNvbW1hTGlzdChpbml0TGlzdCk7IGkuaGFzTmV4dCgpOykgeworCQkJU3RyaW5nIGluYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisJCQl0cnkgeworCQkJCUNsYXNzIGluaXRDbGFzcyA9IENsYXNzLmZvck5hbWUoaW5hbWUpOworCQkJCUluaXRpYWxpemVyIGluaXQgPSAoSW5pdGlhbGl6ZXIpIGluaXRDbGFzcy5uZXdJbnN0YW5jZSgpOworCQkJCWluaXQuaW5pdGlhbGl6ZSgpOworCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiSW5pdGlhbGl6ZXIgXCIiICsgaW5hbWUgKyAiXCIgbm90IGZvdW5kOyBhYm9ydGluZyIpOworCQkJCXRocm93IG5ldyBFREFFeGNlcHRpb24oZXgpOworCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiSW5pdGlhbGl6ZXIgXCIiICsgaW5hbWUgKyAiXCIgaXMgYWJzdHJhY3Q7IGFib3J0aW5nIik7CisJCQkJdGhyb3cgbmV3IEVEQUV4Y2VwdGlvbihleCk7CisJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJJbml0aWFsaXplciBcIiIgKyBpbmFtZSArICJcIiBpc24ndCBwdWJsaWM7IGFib3J0aW5nIik7CisJCQkJdGhyb3cgbmV3IEVEQUV4Y2VwdGlvbihleCk7CisJCQl9IGNhdGNoIChFREFFeGNlcHRpb24gZXgpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkluaXRpYWxpemVyIFwiIiArIGluYW1lICsgIlwiIGZhaWxlZDogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQkJdGhyb3cgbmV3IEVEQUV4Y2VwdGlvbihleCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogVGhlIGNvbmZpZ3VyYXRpb24uICovCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisJLyoqIE9iamVjdCBrZXkgbmFtZS4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKwkvKiogVGhlIHNlcnZhbnQuICovCisJcHJpdmF0ZSBPYmplY3Qgc2VydmFudDsKKworCS8qKiBUaGUgc2VydmVyIGNsYXNzIG5hbWUuICovCisJcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisJLyoqIEN1cnJlbnQgYmluZGVyLCBpZiBhbnkuICovCisJcHJpdmF0ZSBzdGF0aWMgQmluZGVyIGJpbmRlcjsKKworCS8qKiBTZXJ2ZXIncyBzdGF0dXMgZG9jdW1lbnQuICovCisJcHJpdmF0ZSBEb2N1bWVudCBzdGF0dXNEb2N1bWVudDsKKworCS8qKiBUaGUgJmx0O2xvZyZndDsgZWxlbWVudCB3aXRoaW4gdGhlIHN0YXR1cyBkb2N1bWVudC4gKi8KKwlwcml2YXRlIEVsZW1lbnQgbG9nRWxlbWVudDsKKworCS8qKiBUaGUgWE1MLVJQQyBpbnRlcmZhY2UgdG8gdGhpcyBzZXJ2ZXIuICovCisJcHJpdmF0ZSBYbWxScGNTZXJ2ZXIgeG1scnBjU2VydmVyOworCisJLyoqIFN0YXR1cyBEVEQgZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19GUEkgPSAiLS8vSlBMLy9EVEQgRURBIFNlcnZlciBTdGF0dXMgMS4wIjsKKwkKKwkvKiogU3RhdHVzIERURCBzeXN0ZW0gaWRlbnRpZmllci4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfVVJMID0gImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi9lZG0tY29tbW9ucy94bWwvc2VydmVyU3RhdHVzLmR0ZCI7CisKKwkvKiogTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBwcmludHMgdGhlIHNlcnZlcidzIElPUiBvciBSTUkgaGFuZGxlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5UX0lPUl9QUk9QRVJUWSA9ICJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5FeGVjU2VydmVyLnByaW50SU9SIjsKKworCS8qKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHByZXZlbnRzIGJpbmRpbmcgb2YgdGhpcyBvYmplY3Qgd2l0aCB0aGUgbmFtaW5nIHNlcnZpY2UuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9CSU5ESU5HID0gIm9yZy5hcGFjaGUub29kdC5jb21tb25zLkV4ZWNTZXJ2ZXIuZGlzYWJsZUJpbmRpbmciOworCisJLyoqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGJpbmQgYXR0ZW1wdHMsIGluIG1zLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVCSU5EX1BFUklPRCA9IExvbmcuZ2V0TG9uZygib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuRXhlY1NlcnZlci5yZWJpbmRQZXJpb2QiLCAzMCo2MCoxMDAwKS5sb25nVmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0V4ZWNTZXJ2ZXJDb25maWcuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0V4ZWNTZXJ2ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVhMjhmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvRXhlY1NlcnZlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9uczsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRvY3VtZW50YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqIENvbmZpZ3VyYXRpb24gZm9yIGFuIEVEQSBleGVjLXNlcnZlci4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjU2VydmVyQ29uZmlnIGV4dGVuZHMgRXhlY3V0YWJsZSBpbXBsZW1lbnRzIERvY3VtZW50YWJsZSB7CisJLyoqIENyZWF0ZSBhbiBleGVjLXNlcnZlciBjb25maWd1cmF0aW9uLgorCSAqCisJICogQHBhcmFtIGNsYXNzTmFtZSBOYW1lIG9mIHRoZSBjbGFzcyB0byBleGVjdXRlLgorCSAqIEBwYXJhbSBvYmplY3RLZXkgT2JqZWN0IGtleSB1bmRlciB3aGljaCBjbGFzcyB3aWxsIHJlZ2lzdGVyLgorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgZm9yIHRoZSBzZXJ2ZXIuCisJICovCisJcHVibGljIEV4ZWNTZXJ2ZXJDb25maWcoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG9iamVjdEtleSwgSW5ldEFkZHJlc3MgcHJlZmVycmVkSG9zdCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CisJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworCQl0aGlzLm9iamVjdEtleSA9IG9iamVjdEtleTsKKwkJdGhpcy5wcmVmZXJyZWRIb3N0ID0gcHJlZmVycmVkSG9zdDsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwkvKiogQ3JlYXRlIGFuIGV4ZWMtc2VydmVyIGNvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBAcGFyYW0geG1sIFhNTCBET00gZGVzY3JpcHRpb24sIG11c3QgYmUgYW4gJmx0O2V4ZWNTZXJ2ZXImZ3Q7IGVsZW1lbnQuCisJICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgPHZhcj54bWw8L3Zhcj4gaXMgaW52YWxpZC4KKwkgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIElmIHRoZSA8dmFyPnhtbDwvdmFyPiByZWZlcnMgdG8gYW4gdW5rbm93biBob3N0IG5hbWUuCisJICovCisJcHVibGljIEV4ZWNTZXJ2ZXJDb25maWcoTm9kZSB4bWwpIHRocm93cyBTQVhFeGNlcHRpb24sIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKwkJcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCXByZWZlcnJlZEhvc3QgPSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5uZXQuTmV0LmdldExvb3BiYWNrQWRkcmVzcygpOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHhtbC5nZXRDaGlsZE5vZGVzKCk7CisJCWNsYXNzTmFtZSA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkcmVuLml0ZW0oMCkpOworCQlvYmplY3RLZXkgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZHJlbi5pdGVtKDEpKTsKKwkJZm9yIChpbnQgaSA9IDI7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKKwkJCWlmICgiaG9zdCIuZXF1YWxzKG5hbWUpKQorCQkJCXByZWZlcnJlZEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoWE1MLnVud3JhcHBlZFRleHQoY2hpbGRyZW4uaXRlbSgyKSkpOworCQkJZWxzZSBpZiAoInByb3BlcnRpZXMiLmVxdWFscyhuYW1lKSkKKwkJCQlDb25maWd1cmF0aW9uLmxvYWRQcm9wZXJ0aWVzKGNoaWxkLCBwcm9wZXJ0aWVzKTsKKwkJCWVsc2UgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiVW5rbm93biBub2RlICIgKyBuYW1lICsgIiBpbiBleGVjIHNlcnZlciBYTUwiKTsKKwkJfQorCX0JCQorCisJLyoqIENyZWF0ZSBhbiBleGVjLXNlcnZlciBjb25maWd1cmF0aW9uLgorCSAqCisJICogQHBhcmFtIHhtbCBTZXJpYWxpemVkIFhNTCBkZXNjcmlwdGlvbi4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiB3ZSBjYW4ndCBwYXJzZSA8dmFyPnhtbDwvdmFyPi4KKwkgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIElmIHRoZSA8dmFyPnhtbDwvdmFyPiByZWZlcnMgdG8gYW4gdW5rbm93biBob3N0IG5hbWUuCisJICovCisJcHVibGljIEV4ZWNTZXJ2ZXJDb25maWcoU3RyaW5nIHhtbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24geworCQl0aGlzKFhNTC5wYXJzZSh4bWwpLmdldERvY3VtZW50RWxlbWVudCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tbWFuZExpbmUoKSB7CisJCVN0cmluZ1tdIGNvbW1hbmRMaW5lID0gbmV3IFN0cmluZ1s2ICsgcHJvcGVydGllcy5zaXplKCldOworCQljb21tYW5kTGluZVswXSA9ICJqYXZhIjsKKwkJY29tbWFuZExpbmVbMV0gPSAiLVhtcyIgKyBpbml0aWFsSGVhcDsKKwkJY29tbWFuZExpbmVbMl0gPSAiLVhteCIgKyBtYXhIZWFwOworCQlpbnQgaW5kZXggPSAzOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKwkJCWNvbW1hbmRMaW5lW2luZGV4KytdID0gIi1EIiArIGVudHJ5LmdldEtleSgpICsgIj0iICsgZW50cnkuZ2V0VmFsdWUoKTsKKwkJfQorCQljb21tYW5kTGluZVtpbmRleCsrXSA9ICJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5FeGVjU2VydmVyIjsKKwkJY29tbWFuZExpbmVbaW5kZXgrK10gPSBjbGFzc05hbWU7CisJCWNvbW1hbmRMaW5lW2luZGV4KytdID0gb2JqZWN0S2V5OworCQlyZXR1cm4gY29tbWFuZExpbmU7CisJfQorCisJLyoqIEdldCB0aGUgY2xhc3MgbmFtZSBJJ20gZ29pbmcgdG8gZXhlY3V0ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUuCisJICovCisJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisJCXJldHVybiBjbGFzc05hbWU7CisJfQorCisJLyoqIEdldCB0aGUgb2JqZWN0IGtleSBJJ20gZ29pbmcgdG8gdXNlLgorCSAqCisJICogQHJldHVybiBUaGUgb2JqZWN0IGtleS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE9iamVjdEtleSgpIHsKKwkJcmV0dXJuIG9iamVjdEtleTsKKwl9CisKKwkvKiogR2V0IHRoZSBwcm9wZXJ0aWVzIGZvciBteSBwcm9jZXNzLgorCSAqCisJICogQHJldHVybiBUaGUgcHJvcGVydGllcy4KKwkgKi8KKwlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKiogR2V0IHRoZSBwcmVmZXJyZWQgaG9zdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGhvc3Qgb24gd2hpY2ggdGhpcyBzZXJ2ZXIgcHJlZmVycyB0byBydW4uCisJICovCisJcHVibGljIEluZXRBZGRyZXNzIGdldFByZWZlcnJlZEhvc3QoKSB7CisJCXJldHVybiBwcmVmZXJyZWRIb3N0OworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBjbGFzc05hbWUuaGFzaENvZGUoKSBeIG9iamVjdEtleS5oYXNoQ29kZSgpIF4gcHJvcGVydGllcy5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIEV4ZWNTZXJ2ZXJDb25maWcpKSByZXR1cm4gZmFsc2U7CisJCUV4ZWNTZXJ2ZXJDb25maWcgb2JqID0gKEV4ZWNTZXJ2ZXJDb25maWcpIHJoczsKKwkJcmV0dXJuIGNsYXNzTmFtZS5lcXVhbHMob2JqLmNsYXNzTmFtZSkgJiYgb2JqZWN0S2V5LmVxdWFscyhvYmoub2JqZWN0S2V5KSAmJiBwcm9wZXJ0aWVzLmVxdWFscyhvYmoucHJvcGVydGllcyk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGNsYXNzTmFtZSArICIgIiArIG9iamVjdEtleTsKKwl9CisKKwlwdWJsaWMgTm9kZSB0b1hNTChEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlFbGVtZW50IGV4ZWNTZXJ2ZXJFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImV4ZWNTZXJ2ZXIiKTsKKwkJWE1MLmFkZChleGVjU2VydmVyRWxlbWVudCwgImNsYXNzIiwgZ2V0Q2xhc3NOYW1lKCkpOworCQlYTUwuYWRkKGV4ZWNTZXJ2ZXJFbGVtZW50LCAib2JqZWN0S2V5IiwgZ2V0T2JqZWN0S2V5KCkpOworCQlYTUwuYWRkKGV4ZWNTZXJ2ZXJFbGVtZW50LCAicHJlZmVycmVkSG9zdCIsIGdldFByZWZlcnJlZEhvc3QoKS50b1N0cmluZygpKTsKKwkJQ29uZmlndXJhdGlvbi5kdW1wUHJvcGVydGllcyhnZXRQcm9wZXJ0aWVzKCksIGV4ZWNTZXJ2ZXJFbGVtZW50KTsKKwkJcmV0dXJuIGV4ZWNTZXJ2ZXJFbGVtZW50OworCX0KKworCS8qKiBZaWVsZCB0aGlzIGV4Y2Utc2VydmVyIGNvbmZpZ3VyYXRpb24gYXMgc2VyaWFsaXplZCBYTUwuCisJICoKKwkgKiBAcmV0dXJuIFRoaXMgb2JqZWN0IGFzIGEgc3RyaW5nIHNlcmlhbGl6ZWQgWE1MIGRvY3VtZW50LgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIHdlIGNhbid0IGNyZWF0ZSB0aGUgWE1MIGRvY3VtZW50LgorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9YTUwoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJRG9jdW1lbnQgZG9jID0gQ29uZmlndXJhdGlvbi5jcmVhdGVEb2N1bWVudCgiZXhlY1NlcnZlciIpOworCQlkb2MucmVwbGFjZUNoaWxkKHRvWE1MKGRvYyksIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisJCXJldHVybiBYTUwuc2VyaWFsaXplKGRvYyk7CisJfQorCisJLyoqIENsYXNzIG5hbWUgZm9yIHRoZSBFeGVjU2VydmVyIHRvIGV4ZWN1dGUuICovCisJcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisJLyoqIEluc3RhbmNlIG5hbWUuICovCisJcHJpdmF0ZSBTdHJpbmcgb2JqZWN0S2V5OworCisJLyoqIFByb3BlcnRpZXMgZm9yIHRoZSBzZXJ2ZXIuICovCisJcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKKwkvKiogUHJlZmVycmVkIGhvc3QuICovCisJcHJpdmF0ZSBJbmV0QWRkcmVzcyBwcmVmZXJyZWRIb3N0OworCisJLyoqIEluaXRpYWwgaGVhcCBzaXplLiAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbml0aWFsSGVhcDsKKworCS8qKiBNYXggaGVhcCBzaXplLiAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYXhIZWFwOworCisJLyoqIEluaXRpYWxpemUgdGhlIGhlYXAgc2l6ZXMuICovCisJc3RhdGljIHsKKwkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCW9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuVXRpbGl0eS5sb2FkUHJvcGVydGllcyhwcm9wcywgRXhlY1NlcnZlckNvbmZpZy5jbGFzcywgIkV4ZWNTZXJ2ZXJDb25maWcucHJvcGVydGllcyIpOworCQlpbml0aWFsSGVhcCA9IHByb3BzLmdldFByb3BlcnR5KCJpbml0aWFsSGVhcCIsICIzMm0iKTsKKwkJbWF4SGVhcCA9IHByb3BzLmdldFByb3BlcnR5KCJtYXhIZWFwIiwgIjEyOG0iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9FeGVjdXRhYmxlLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9FeGVjdXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzOTQwYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0V4ZWN1dGFibGUuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnM7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBBbiBleGVjdXRhYmxlIG9iamVjdC4KKyAqCisgKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIHByb2dyYW1zIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5LiAgVGhlaXIgc3RhbmRhcmQKKyAqIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3Igc3RyZWFtcyBhcmUgc2hhcmVkIHdpdGggdGhlIHBhcmVudCBwcm9jZXNzJyBzdGFuZGFyZCBvdXRwdXQKKyAqIGFuZCBlcnJvciBzdHJlYW1zLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4ZWN1dGFibGUgeworCS8qKiBDb25zdHJ1Y3QgYW4gZXhlY3V0YWJsZS4KKwkgKi8KKwlwdWJsaWMgRXhlY3V0YWJsZSgpIHt9CisKKwkvKiogR2V0IHRoZSBjb21tYW5kLWxpbmUuCisJICoKKwkgKiBAcmV0dXJuIENvbW1hbmQtbGluZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0Q29tbWFuZExpbmUoKTsKKworCS8qKiBTdGFydCBleGVjdXRpbmcgdGhpcyBwcm9ncmFtLgorCSAqCisJICogSWYgYW55IGVycm9yIG9jY3VycyB3aGlsZSBsYXVuY2hpbmcgdGhlIHByb2dyYW0sIHRoaXMgbWV0aG9kIG5vdGVzIGEgbWVzc2FnZSB0bworCSAqIHN0ZGVyciwgYnV0IG90aGVyd2lzZSB0YWtlcyBubyBmdXJ0aGVyIGFjdGlvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworCQkvLyBXZSBmb3JjZSBwcm9ncmFtIGV4ZWN1dGlvbiB0byBiZSBhc3luY2hyb25vdXMgYnkgY3V0dGluZyBhIG5ldyB0aHJlYWQuCisJCW5ldyBUaHJlYWQoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoZ2V0Q29tbWFuZExpbmUoKSk7CisJCQkJCQorCQkJCQkvLyBSZWFkIGFsbCBvdXRwdXQgKHN0YW5kYXJkIGFuZCBlcnJvciBvdXRwdXQpCisJCQkJCS8vIGZyb20gdGhlIHByb2Nlc3MgYW5kIHBhc3MgaXQgdG8gdGhlIHVzZXIuCisJCQkJCXJlZGlyZWN0KHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwgU3lzdGVtLmVycik7CisJCQkJCXJlZGlyZWN0KHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgU3lzdGVtLm91dCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBleGVjdXRlIGNvbW1hbmQgXCIiICsgZ2V0Q29tbWFuZExpbmUoKVswXSArICJcIjogIgorCQkJCQkJKyBleC5nZXRNZXNzYWdlKCkpOworCQkJCX0KKwkJCX0KKworCQkJLyoqIFJlZGlyZWN0IHRoZSBnaXZlbiBpbnB1dCBvbnRvIHRoZSBnaXZlbiBvdXRwdXQuCisJCQkgKgorCQkJICogQHBhcmFtIGluIFRoZSBzdHJlYW0gdG8gcmVhZC4KKwkJCSAqIEBwYXJhbSBvdXQgV2hlcmUgdG8gd3JpdGUgaXQuCisJCQkgKi8KKwkJCXByaXZhdGUgdm9pZCByZWRpcmVjdChmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgeworCQkJCS8vIERvIHRoaXMgaW4gdGhlIGJhY2tncm91bmQsIHRvby4KKwkJCQluZXcgVGhyZWFkKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCQkJCQlmb3IgKDs7KSB7CisJCQkJCQkJCWludCBudW1SZWFkID0gaW4ucmVhZChidWYpOworCQkJCQkJCQlpZiAobnVtUmVhZCA9PSAtMSkgeworCQkJCQkJCQkJaW4uY2xvc2UoKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCW91dC53cml0ZShidWYsIDAsIG51bVJlYWQpOworCQkJCQkJCX0KKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJaW4uY2xvc2UoKTsKKwkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9LnN0YXJ0KCk7CisJCQl9CisJCX0uc3RhcnQoKTsKKworCQkvLyBTcGluIHVudGlsIHRoZSBwcm9jZXNzIGZpZWxkIGlzIHNldC4KKwkJd2hpbGUgKHByb2Nlc3MgPT0gbnVsbCkKKwkJCVRocmVhZC55aWVsZCgpOworCX0KKworCS8qKiBXYWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUuCisJICoKKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIElmIHRoZSB0aHJlYWQgd2FpdGluZyBmb3IgdGhlIHRlcm1pbmF0aW9uIGlzIGludGVycnVwdGVkLgorCSAqIEByZXR1cm4gVGhlIGV4aXQgdmFsdWUgb2YgdGhlIHByb2Nlc3MuCisJICovCisJcHVibGljIGludCB3YWl0Rm9yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHByb2Nlc3Mud2FpdEZvcigpOworCX0KKworCS8qKiBUZXJtaW5hdGUgdGhpcyBwcm9jZXNzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKKwkJcHJvY2Vzcy5kZXN0cm95KCk7CisJfQorCisJLyoqIFRoZSBwcm9jZXNzIGJhY2tpbmcgdGhpcyBleGVjdXRhYmxlLiAqLworCXByb3RlY3RlZCBQcm9jZXNzIHByb2Nlc3M7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0luaXRpYWxpemVyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Jbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjAzMDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Jbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCisvKioKKyAqIEluaXRpYWxpemVyIGZvciBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjEuMSAkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5pdGlhbGl6ZXIgeworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGFwcGxpY3Rpb24uCisJICoKKwkgKiBAdGhyb3dzIEVEQUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIEVEQUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL011bHRpU2VydmVyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9NdWx0aVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODlmOTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9NdWx0aVNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnM7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5ybWkucmVnaXN0cnkuUmVnaXN0cnk7DQoraW1wb3J0IGphdmEucm1pLnNlcnZlci5SZW1vdGVPYmplY3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5UaW1lcjsNCitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsNCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7DQoraW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247DQoraW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuTmFtaW5nTWFuYWdlcjsNCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkxvZ0luaXQ7DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOw0KK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsNCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7DQoraW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQorDQorLyoqDQorICogVGhlIE11bHRpU2VydmVyIHJ1bnMgbXVsdGlwbGUgc2VydmVyIG9iamVjdHMgaW4gYSBzaW5nbGUgSlZNLiAgSW5zdGVhZCBvZiBydW5uaW5nIGENCisgKiBzZXBhcmF0ZSBwcm9kdWN0IHNlcnZlciwgcHJvZmlsZSBzZXJ2ZXIsIHF1ZXJ5IHNlcnZlciwgYW5kIHNvIGZvcnRoLCBpbiB0aGVpciBvd24gSlZNcywNCisgKiB3aGljaCBhcmUgZXh0cmVtZWx5IGhlYXZ5LXdlaWdodCBvcGVyYXRpbmcgc3lzdGVtIHByb2Nlc3Nlcywgd2UgY2FuIHB1dCB0aGVtIGludG8gb25lDQorICogSlZNIHdoaWNoIHJlZHVjZXMgdGhlIG1lbW9yeSBmb290cHJpbnQgb24gYSBzaW5nbGUgY29tcHV0ZXIgZW5vcm1vdXNseS4NCisgKg0KKyAqIDxoMz5TcGVjaWZ5aW5nIHRoZSBDb25maWd1cmF0aW9uPC9oMz4NCisgKg0KKyAqIFRoZSBNdWx0aVNlcnZlciBjb25maWd1cmF0aW9uIGlzIGFuIFhNTCBkb2N1bWVudC4gIEhlcmUncw0KKyAqIGEgc2FtcGxlOg0KKyAqIDxwcmU+Jmx0O211bHRpc2VydmVyDQorICogICB4bWxucz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2VkbS1jb21tb25zL3htbC9tdWx0aXNlcnZlciINCisgKiAgIGlkPSJNeSBNdWx0aSBTZXJ2ZXIiJmd0Ow0KKyAqICAgJmx0O3NlcnZlcg0KKyAqICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMucHJvZHVjdC5ybWkuUHJvZHVjdFNlcnZpY2VJbXBsIg0KKyAqICAgICBpZD0idXJuOmVkYTpybWk6QmlvU2VydmVyIg0KKyAqICAgICBiaW5kPSJyZWJpbmQiIC8mZ3Q7DQorICogICAmbHQ7c2VydmVyDQorICogICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5wcm9kdWN0LnJtaS5Qcm9kdWN0U2VydmljZUltcGwiDQorICogICAgIGlkPSJ1cm46ZWRhOnJtaTpTcGFjZVNlcnZlciINCisgKiAgICAgYmluZD0iMTgwMDAwMCIgLyZndDsNCisgKiAgICZsdDtzZXJ2ZXINCisgKiAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLnByb2ZpbGUucm1pLlByb2ZpbGVTZXJ2aWNlSW1wbCINCisgKiAgICAgaWQ9InVybjplZGE6cm1pOlJlc291cmNlIg0KKyAqICAgICBiaW5kPSJiaW5kIiAvJmd0Ow0KKyAqICAgJmx0O3Byb3BlcnRpZXMmZ3Q7DQorICogICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJ1cm46ZWRhOnJtaTpCaW9TZXJ2ZXIuaGFuZGxlcnMiJmd0Ow0KKyAqICAgICAgIGVkcm4uTWVkSGFuZGxlcixlZHJuLlNwZWNpbWVuSGFuZGxlcg0KKyAqICAgICAmbHQ7L3Byb3BlcnR5Jmd0Ow0KKyAqICAgICAmbHQ7cHJvcGVydHkgbmFtZT0idXJuOmVkYTpybWk6U3BhY2VTZXJ2ZXIuaGFuZGxlcnMiJmd0Ow0KKyAqICAgICAgIHBkcy5QbGFuZXRvaWRIYW5kbGVyDQorICogICAgICZsdDsvcHJvcGVydHkmZ3Q7DQorICogICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5wcm9maWxlLkhhbmRsZXJzIiZndDsNCisgKiAgICAgICBjb20uc3VuLlJlc291cmNlSGFuZGxlcg0KKyAqICAgICAmbHQ7L3Byb3BlcnR5Jmd0Ow0KKyAqICAgJmx0Oy9wcm9wZXJ0aWVzJmd0Ow0KKyAqICZsdDsvbXVsdGlzZXJ2ZXImZ3Q7PC9wcmU+DQorICoNCisgKiA8cD5UaGlzIHdvdWxkIHN0YXJ0IHRocmVlIHNlcnZlcnMgKHR3byBwcm9kdWN0cywgb25lIHByb2ZpbGUpIHdpdGggdGhlIHZhcmlvdXMgcHJvcGVydHkNCisgKiBzZXR0aW5ncyBpbmRpY2F0ZWQuICBUaGUgTXVsdGlTZXJ2ZXIgZXhwZWN0cyB0aGUgcHJvcGVydHkNCisgKiA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5NdWx0aVNlcnZlci5jb25maWc8L2NvZGU+IHRvIGlkZW50aWZ5IHRoZSBVUkwgb2YgdGhlIGNvbmZpZ3VyYXRpb24uICBZb3UNCisgKiBjYW4gc2hvcnRlbiB0aGF0IHRvIDxjb2RlPk11bHRpU2VydmVyLmNvbmZpZzwvY29kZT4gb3IgPGNvZGU+bXVsdGlzZXJ2ZXIuY29uZmlnPC9jb2RlPg0KKyAqIG9yIGV2ZW4ganVzdCA8Y29kZT5jb25maWc8L2NvZGU+LCBpbiB0aGF0IG9yZGVyLiAgSWYgbm9uZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIGFyZQ0KKyAqIHNwZWNpZmllZCB0aGVuIHRoZSBNdWx0aVNlcnZlciB3aWxsIGV4cGVjdCB0aGUgVVJMIHRvIGJlIHRoZSBmaXJzdCAoYW5kIG9ubHkpIGNvbW1hbmQNCisgKiBsaW5lIGFyZ3VtZW50Lg0KKyAqDQorICogPHA+VGhlIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgb24gdGhlIDxjb2RlPm11bHRpc2VydmVyPC9jb2RlPiBlbGVtZW50IHRlbGxzIHRoZSBuYW1lDQorICogb2YgdGhlIHdob2xlIGFwcGxpY2F0aW9uOyBpdCdzIHVzZWQgdG8gcHJlZml4IGxvZyBtZXNzYWdlcy4NCisgKg0KKyAqIDxoMz5TZXJ2ZXIgU3BlY2lmaWNhdGlvbjwvaDM+DQorICoNCisgKiA8cD5FYWNoIDxjb2RlPiZsdDtzZXJ2ZXImZ3Q7PC9jb2RlPiBlbnRyeSBuYW1lcyBhIHNlcnZlciB0byBzdGFydC4gIFRoZQ0KKyAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgaXMgdGhlIG5hbWUgb2YgdGhlIFJNSS1jb21wYXRpYmxlIEphdmEgY2xhc3MgdGhhdCB0aGUNCisgKiBzZXJ2ZXIgd2lsbCBydW4uICAoTm90ZSB0aGF0IGN1cnJlbnRseSBvbmx5IFJNSSBzZXJ2ZXJzIGFyZSBzdXBwb3J0ZWQuKSAgVGhlDQorICogPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSB0ZWxscyB0aGUgbmFtZSB0aGUgc2VydmVyIHNob3VsZCB1c2UgdG8gcmVnaXN0ZXIgd2l0aCB0aGUNCisgKiBuYW1pbmcgY29udGV4dC4gIEFuZCB0aGUgPGNvZGU+YmluZDwvY29kZT4gYXR0cmlidXRlIHRlbGxzIGhvdyB0aGUgcmVnaXN0cmF0aW9uIHNob3VsZA0KKyAqIHByb2NlZWQuICBJdCBjYW4gdGFrZSBvbiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCisgKg0KKyAqIDx1bD4NCisgKiAgIDxsaT48Y29kZT50cnVlPC9jb2RlPiBtZWFuaW5nIHRoZSBvYmplY3Qgd2lsbCBhdHRlbXB0IGEgYmluZC4gIElmIHRoZSBJRCBpcyBhbHJlYWR5DQorICogICBib3VuZCBpbiB0aGUgY29udGV4dCwgdGhlIE11bHRpU2VydmVyIGZhaWxzLjwvbGk+DQorICoNCisgKiAgIDxsaT48Y29kZT5mYWxzZTwvY29kZT4gbWVhbmluZyB0aGUgb2JqZWN0IHdvbid0IGJlIGJvdW5kLjwvbGk+DQorICoNCisgKiAgIDxsaT48Y29kZT5yZWJpbmQ8L2NvZGU+IG1lYW5pbmcgdGhlIG9iamVjdCB3aWxsIHJlYmluZCBpdHMgSUQgaW4gdGhlIGNvbnRleHQsDQorICogICBvdmVyd3JpdGluZyBhbnkgcHJldmlvdXMgYmluZGluZy4NCisgKg0KKyAqICAgPGxpPjx2YXI+bnVtYmVyPC92YXI+IG1lYWluaW5nIHRoZSBvYmplY3Qgd2lsbCByZWJpbmQgaXRzIElEIG9uY2UgYXQgc3RhcnVwLCBhbmQNCisgKiAgIGV2ZXJ5IDx2YXI+bnVtYmVyPC92YXI+IG1pbGxpc2Vjb25kcyB0aGVyZWFmdGVyLiAgVGhpcyBpcywgaW4gT09EVCdzIGV4cGVyaWVuY2UsIHRoZQ0KKyAqICAgbW9zdCB1c2VmdWwgb3B0aW9uIGFzIGl0IGhlbHBzIGFuIGVudGlyZSBkcGVsb3llZCBuZXR3b3JrIG9mIHNlcnZlcnMgc2VsZi1oZWFsIGFmdGVyDQorICogICBhIG5hbWluZyBjb250ZXh0IHJlc3RhcnQuDQorICogPC91bD4NCisgKg0KKyAqIDxoMz5Qcm9wZXJ5IFNwZWNpZmljYXRpb248L2gzPg0KKyAqDQorICogPHA+Rm9yIGNvbnZlbmllbmNlLCBTeXN0ZW0gUHJvcGVydGllcyBtYXkgYmUgc3BlY2lmaWVkIGluIHRoZSBjb25maWdpcnV0YWlvbiBhcyB3ZWxsLg0KKyAqIEhvd2V2ZXIsIGFueSBwcm9wZXJ0aWVzIGFscmVhZHkgZGVmaW5lZCAoc3VjaCBhcyB1c2luZyB0aGUgPGNvZGU+LUQ8L2NvZGU+IGNvbW1hbmQtbGluZQ0KKyAqIGFyZ3VtZW50KSBnZXQgcHJpb3JpdHkgYW5kIHRoZWlyIHZhbHVlcyB3b24ndCBiZSBvdmVycmlkZGVuLiAgVG8gc3BlY2lmeSBwcm9wZXJ0aWVzLA0KKyAqIGxpc3QgYW55IG51bWJlciBvZiA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB1bmRlciB0aGUNCisgKiA8Y29kZT4mbHQ7cHJvcGVydGllcyZndDs8L2NvZGU+IGVsZW1lbnQgd2l0aCBhIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBuYW1pbmcgdGhlDQorICogU3lzdGVtIFByb3BlcnR5IGtleSBhbmQgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQgbmFtaW5nIGl0cyB2YWx1ZS4gIE5vdGUgdGhhdCB0aGUgdGV4dA0KKyAqIHdpbGwgYmUgdW53cmFwcGVkLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlTZXJ2ZXIgew0KKwkvKioNCisJICogU3RhcnQgdGhlIG11bHRpIHNlcnZlci4NCisJICoNCisJICogQHBhcmFtIGFyZ3YgQ29tbWFuZC1saW5lIGFyZ3VtZW50cy4NCisJICogQHRocm93cyBUaHJvd2FibGUgaWYgYW4gZXJyb3Igb2NjdXJzLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgdGhyb3dzIFRocm93YWJsZSB7DQorCQlTdHJpbmcgY29uZmlnID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5NdWx0aVNlcnZlci5jb25maWciLCBTeXN0ZW0uZ2V0UHJvcGVydHkoIk11bHRpU2VydmVyLmNvbmZpZyIsDQorCQkJU3lzdGVtLmdldFByb3BlcnR5KCJtdWx0aXNlcnZlci5jb25maWciLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbmZpZyIpKSkpOw0KKwkJaWYgKGNvbmZpZyA9PSBudWxsKSB7DQorCQkJaWYgKGFyZ3YubGVuZ3RoICE9IDEpDQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIG9yZy5hcGFjaGUub29kdC5jb21tb25zLk11bHRpU2VydmVyLmNvbmZpZyBwcm9wZXJ0eSBvciBjb25maWcgVVJMIGFyZ3VtZW50Iik7DQorCQkJZWxzZQ0KKwkJCQljb25maWcgPSBhcmd2WzBdOw0KKwkJfQ0KKw0KKwkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoQ09ORklHKTsNCisJCUNvbmZpZ3VyYXRpb24uY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKTsNCisJCXJlYWRlci5jbG9zZSgpOw0KKwkJcGFyc2VDb25maWcobmV3IElucHV0U291cmNlKGNvbmZpZykpOw0KKw0KKwkJSGFzaHRhYmxlIHQgPSBuZXcgSGFzaHRhYmxlKCk7DQorCQl0LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCAib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub2JqZWN0LmpuZGkuT2JqZWN0Q3R4RmFjdG9yeSIpOw0KKwkJU3RyaW5nIHJlZ2lzdHJ5TGlzdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMucm1pcmVnaXN0cmllcyIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgicm1pcmVnaXN0cmllcyIpKTsNCisJCWlmIChyZWdpc3RyeUxpc3QgPT0gbnVsbCkgew0KKwkJCVN0cmluZyBob3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJybWlyZWdpc3RyeS5ob3N0IiwgImxvY2FsaG9zdCIpOw0KKwkJCWludCBwb3J0ID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJybWlyZWdpc3RyeS5wb3J0IiwgUmVnaXN0cnkuUkVHSVNUUllfUE9SVCkuaW50VmFsdWUoKTsNCisJCQlyZWdpc3RyeUxpc3QgPSAicm1pOi8vIiArIGhvc3QgKyAiOiIgKyBwb3J0Ow0KKwkJfQ0KKwkJdC5wdXQoInJtaXJlZ2lzdHJpZXMiLCByZWdpc3RyeUxpc3QpOw0KKwkJY29udGV4dCA9IE5hbWluZ01hbmFnZXIuZ2V0SW5pdGlhbENvbnRleHQodCk7DQorCQlFeGVjU2VydmVyLnJ1bkluaXRpYWxpemVycygpOw0KKwkJdHJ5IHsNCisJCQlMb2dJbml0LmluaXQoU3lzdGVtLmdldFByb3BlcnRpZXMoKSwgZ2V0QXBwTmFtZSgpKTsNCisJCQlpZiAoc2VydmVycy5pc0VtcHR5KCkpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHNlcnZlcnMgZGVmaW5lZCBpbiBjb25maWciKTsNCisNCisJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZCgpIHsNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJc2h1dGRvd24oKTsNCisJCQkJfQ0KKwkJCX0pOw0KKwkJCXN0YXJ0dXAoKTsNCisJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgew0KKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCXRyeSB7DQorCQkJCXNodXRkb3duKCk7DQorCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZSkge30NCisJCQlTeXN0ZW0uZXhpdCgxKTsNCisJCX0NCisJCWZvciAoOzspIHRyeSB7DQorCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHt9DQorCX0NCisNCisJLyoqDQorCSAqIFBhcnNlIHRoZSBNdWx0aVNlcnZlciBjb25maWd1cmF0aW9uLg0KKwkgKg0KKwkgKiBAcGFyYW0gaXMgU291cmNlIG9mIHRoZSBjb25maWd1cmF0aW9uLg0KKwkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gSWYgd2UgY2FuJ3QgY3JlYXRlIGEgcGFyc2VyLg0KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiB0aGVyZSdzIGEgcGFyc2UgZXJyb3IuDQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUncyBhIHByb2JsZW0gcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbi4NCisJICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIElmIHdlIGNhbid0IGZpbmQgYSBzZXJ2ZXIgY2xhc3MuDQorCSAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIElmIHRoZSBzZXJ2ZXIgY2xhc3MgZG9lc24ndCBoYXZlIHRoZSByaWdodCBjb25zdHJ1Y3Rvci4NCisJICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIElmIHdlIGNhbiBjcmVhdGUgYSBzZXJ2ZXIgb2JqZWN0Lg0KKwkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjb25zdHJ1Y3RvciBpc24ndCBhY2Nlc3NpYmxlLg0KKwkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gZXhjZXB0aW9uLg0KKwkgKi8NCisJc3RhdGljIHZvaWQgcGFyc2VDb25maWcoSW5wdXRTb3VyY2UgaXMpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLA0KKwkJQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLA0KKwkJSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7DQorCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQorCQlmYWN0b3J5LnNldElnbm9yaW5nQ29tbWVudHModHJ1ZSk7DQorCQlmYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpOw0KKwkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCisJCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7DQorCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQorCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGlzKTsNCisJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsNCisJCWFwcE5hbWUgPSByb290LmdldEF0dHJpYnV0ZSgiaWQiKTsNCisJCWlmIChhcHBOYW1lID09IG51bGwpIHRocm93IG5ldyBTQVhFeGNlcHRpb24oImlkIGF0dHJpYnV0ZSBtaXNzaW5nIGZyb20gbXVsdGlzZXJ2ZXIgZWxlbWVudCIpOw0KKw0KKwkJLy8gU2V0IHByb3BlcnRpZXMNCisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgY2hpbGRyZW4uaXRlbShpKTsNCisJCQlpZiAoInByb3BlcnRpZXMiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKSB7DQorCQkJCU5vZGVMaXN0IHByb3BzID0gKChFbGVtZW50KSBub2RlKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcGVydHkiKTsNCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wcy5nZXRMZW5ndGgoKTsgKytqKSB7DQorCQkJCQlFbGVtZW50IHByb3BlcnR5ID0gKEVsZW1lbnQpIHByb3BzLml0ZW0oaik7DQorCQkJCQlTdHJpbmcgbmFtZSA9IHByb3BlcnR5LmdldEF0dHJpYnV0ZSgibmFtZSIpOw0KKwkJCQkJaWYgKCFTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KG5hbWUpKSB7DQorCQkJCQkJU3RyaW5nIHZhbHVlID0gWE1MLnVud3JhcHBlZFRleHQocHJvcGVydHkpOw0KKwkJCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9CQkNCisNCisJCS8vIENyZWF0ZSBzZXJ2ZXJzDQorCQlOb2RlTGlzdCBzZXJ2ZXJOb2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlcnZlciIpOw0KKwkJc2VydmVycyA9IG5ldyBIYXNoTWFwKCk7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlck5vZGVzLmdldExlbmd0aCgpOyArK2kpIHsNCisJCQlFbGVtZW50IHNlcnZlckVsZW0gPSAoRWxlbWVudCkgc2VydmVyTm9kZXMuaXRlbShpKTsNCisJCQlTdHJpbmcgbmFtZSA9IHNlcnZlckVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpOw0KKwkJCWlmIChuYW1lID09IG51bGwpIHRocm93IG5ldyBTQVhFeGNlcHRpb24oImlkIGF0dHJpYnV0ZSBtaXNzaW5nIGZyb20gc2VydmVyIGVsZW1lbnQiKTsNCisJCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VydmVyRWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7DQorCQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJjbGFzcyBhdHRyaWJ1dGUgbWlzc2luZyBmcm9tIHNlcnZlciBlbGVtZW50Iik7DQorCQkJU3RyaW5nIGJpbmRLaW5kID0gc2VydmVyRWxlbS5nZXRBdHRyaWJ1dGUoImJpbmQiKTsNCisJCQlpZiAoYmluZEtpbmQgPT0gbnVsbCkgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiYmluZCBhdHRyaWJ1dGUgbWlzc2luZyBmcm9tIHNlcnZlciBlbGVtZW50Iik7DQorCQkJU2VydmVyIHNlcnZlcjsNCisJCQlpZiAoInRydWUiLmVxdWFscyhiaW5kS2luZCkpDQorCQkJCXNlcnZlciA9IG5ldyBCaW5kaW5nU2VydmVyKG5hbWUsIGNsYXNzTmFtZSk7DQorCQkJZWxzZSBpZiAoImZhbHNlIi5lcXVhbHMoYmluZEtpbmQpKQ0KKwkJCQlzZXJ2ZXIgPSBuZXcgTm9uYmluZGluZ1NlcnZlcihuYW1lLCBjbGFzc05hbWUpOw0KKwkJCWVsc2UgaWYgKCJyZWJpbmQiLmVxdWFscyhiaW5kS2luZCkpDQorCQkJCXNlcnZlciA9IG5ldyBSZWJpbmRpbmdTZXJ2ZXIobmFtZSwgY2xhc3NOYW1lKTsNCisJCQllbHNlIHRyeSB7DQorCQkJCWxvbmcgcGVyaW9kID0gTG9uZy5wYXJzZUxvbmcoYmluZEtpbmQpOw0KKwkJCQlzZXJ2ZXIgPSBuZXcgQXV0b2JpbmRpbmdTZXJ2ZXIobmFtZSwgY2xhc3NOYW1lLCBwZXJpb2QpOw0KKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgew0KKwkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJFeHBlY3RlZCB0cnVlLCBmYWxzZSwgcmViaW5kLCBvciBhdXRvIGZvciBiaW5kIGF0dHJpYnV0ZSBidXQgZ290IGAiDQorCQkJCQkrIGJpbmRLaW5kICsgIiciKTsNCisJCQl9DQorCQkJc2VydmVycy5wdXQobmFtZSwgc2VydmVyKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogU3RhcnQgZWFjaCBzZXJ2ZXIuDQorCSAqDQorCSAqIEB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4NCisJICovDQorCXN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsNCisJCWZvciAoSXRlcmF0b3IgaSA9IHNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7DQorCQkJU2VydmVyIHMgPSAoU2VydmVyKSBpLm5leHQoKTsNCisJCQlzLnN0YXJ0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFN0b3AgZWFjaCBzZXJ2ZXIuDQorCSAqLw0KKwlzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsNCisJCWZvciAoSXRlcmF0b3IgaSA9IHNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB0cnkgew0KKwkJCVNlcnZlciBzID0gKFNlcnZlcikgaS5uZXh0KCk7DQorCQkJcy5zdG9wKCk7DQorCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gaWdub3JlKSB7fQ0KKwkJVElNRVIuY2FuY2VsKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24uDQorCSAqDQorCSAqIEByZXR1cm4gYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4NCisJICovDQorCXN0YXRpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsNCisJCXJldHVybiBhcHBOYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHZXQgdGhlIHNlcnZlcnMuICBLZXlzIGFyZSB7QFN0cmluZ30gbmFtZXMgYW5kIHZhbHVlcyBhcmUge0BsaW5rICNTZXJ2ZXJ9cy4NCisJICoNCisJICogQHJldHVybiBhIHtAbGluayBNYXB9IG9mIHRoZSBkZWZpbmVkIHNlcnZlcnMuDQorCSAqLw0KKwlzdGF0aWMgTWFwIGdldFNlcnZlcnMoKSB7DQorCQlyZXR1cm4gc2VydmVyczsNCisJfQ0KKw0KKwkvKioNCisJICogQSBzZXJ2ZXIuDQorCSAqLw0KKwlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyIGV4dGVuZHMgRXhlY1NlcnZlciB7DQorCQkvKioNCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNlcnZlcn0gaW5zdGFuY2UuDQorCQkgKg0KKwkJICogQHBhcmFtIG5hbWUgSUQgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIuDQorCQkgKiBAcGFyYW0gY2xhc3NOYW1lIENsYXNzIG9mIHNlcnZlciB0byBpbnN0YW50aWF0ZS4NCisJCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBzZXJ2ZXIgY2xhc3MuDQorCQkgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNsYXNzIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgY29uc3RydWN0b3IuDQorCQkgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgd2UgY2FuIGNyZWF0ZSB0aGUgc2VydmVyIG9iamVjdC4NCisJCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNvbnN0cnVjdG9yIGlzbid0IGFjY2Vzc2libGUuDQorCQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gZXhjZXB0aW9uLg0KKwkJICovDQorCQlwcm90ZWN0ZWQgU2VydmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLA0KKwkJCUluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gew0KKwkJCXN1cGVyKG5hbWUpOw0KKwkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KKwkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOw0KKwkJCUNvbnN0cnVjdG9yIGN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXsgRXhlY1NlcnZlci5jbGFzcyB9KTsNCisJCQlzZXJ2YW50ID0gKFJlbW90ZU9iamVjdCkgY3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117IHRoaXMgfSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgc2VydmVyIGNsYXNzIHRvIGluc3RhbnRpYXRlLg0KKwkJICoNCisJCSAqIEByZXR1cm4gYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4NCisJCSAqLw0KKwkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQorCQkJcmV0dXJuIGNsYXNzTmFtZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogR2V0IHRoZSB0eXBlIG9mIGJpbmRpbmcgdGhpcyBzZXJ2ZXIgd2lsbCBwZXJmb3JtLiAgUG9zc2libGUgdmFsdWVzIGFyZQ0KKwkJICoge0BsaW5rICNCSU5ESU5HfSwge0BsaW5rICNOT05CSU5ESU5HfSwge0BsaW5rICNSRUJJTkRJTkd9LCBvciB7QGxpbmsNCisJCSAqICNBVVRPfS4NCisJCSAqDQorCQkgKiBAcmV0dXJuIEFuIGludGVnZXIgaWRlbnRpZml5aW5nIHRoZSBiaW5kaW5nIGJlaGF2aW9yLg0KKwkJICovDQorCQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJpbmRpbmdCZWhhdmlvcigpOw0KKw0KKwkJLyoqDQorCQkgKiBTdGFydCB0aGlzIHNlcnZlci4NCisJCSAqDQorCQkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBiaW5kaW5nLg0KKwkJICovDQorCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydCgpIHRocm93cyBOYW1pbmdFeGNlcHRpb247DQorDQorCQkvKioNCisJCSAqIFN0b3AgdGhpcyBzZXJ2ZXIuDQorCQkgKg0KKwkJICogQHRocm93cyBOYW1pbmdFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB1bmJpbmRpbmcuDQorCQkgKi8NCisJCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOw0KKw0KKwkJLyoqIE5hbWUgb2Ygc2VydmVyIGNsYXNzLiAqLw0KKwkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7DQorDQorCQkvKiogU2VydmVyIG9iamVjdC4gKi8NCisJCXByb3RlY3RlZCBSZW1vdGVPYmplY3Qgc2VydmFudDsNCisJfQ0KKw0KKwkvKiogSW5pZGNhdGVzIHNlcnZlciB3aWxsIHRyeSBhIGJpbmQuICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkcgPSAxOw0KKw0KKwkvKiogSW5kaWNhdGVzIHNlcnZlciB3b24ndCBiZSBib3VuZC4gKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OQklORElORyA9IDI7DQorDQorCS8qKiBJbmRpY2F0ZXMgc2VydmVyIHdpbGwgdHJ5IGEgcmViaW5kLiAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUJJTkRJTkcgPSAzOw0KKw0KKwkvKiogSW5kaWNhdGVzIHNlcnZlciB3aWxsIHRyeSBwZXJpb2RpYyByZWJpbmRpbmcuICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE8gPSA0Ow0KKw0KKwkvKiogVGltZXIgdG8gc2NoZWR1bGUgcGVyaW9kaWMgcmViaW5pbmQuICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVyIFRJTUVSID0gbmV3IFRpbWVyKC8qaXNEYWVtb24qL3RydWUpOw0KKw0KKwkvKiogTmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uLiAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwTmFtZTsNCisNCisJLyoqIEtub3duIHNlcnZlcnMuICBLZXlzIGFyZSB7QFN0cmluZ30gbmFtZXMgYW5kIHZhbHVlcyBhcmUge0BsaW5rICNTZXJ2ZXJ9cy4gKi8NCisJcHJpdmF0ZSBzdGF0aWMgTWFwIHNlcnZlcnM7DQorDQorCS8qKiBUaGUgbmFtaW5nIGNvbnRleHQuICovDQorCXByaXZhdGUgc3RhdGljIENvbnRleHQgY29udGV4dDsNCisNCisJLyoqIFRoZSBlZGFyYy54bWwgZmlsZSB0byBzYXRpc2Z5IHRoZSBNdWx0aVNlcnZlcidzIHNlcnZlcnMuICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUcgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48IURPQ1RZUEUgY29uZmlndXJhdGlvbiBQVUJMSUMiDQorCQkrICIgXCItLy9KUEwvL0RURCBFREEgQ29uZmlndXJhdGlvbiAxLjAvL0VOXCIgXCJodHRwOi8vZW50ZXJwcmlzZS5qcGwubmFzYS5nb3YvZHRkL2NvbmZpZ3VyYXRpb24uZHRkXCI+XG4iDQorCQkrICI8Y29uZmlndXJhdGlvbj48d2ViU2VydmVyPjxob3N0PmxvY2FsaG9zdDwvaG9zdD48cG9ydD44MDwvcG9ydD48L3dlYlNlcnZlcj4iDQorCQkrICI8bmFtZVNlcnZlcj48aWlvcD48aG9zdD5sb2NhbGhvc3Q8L2hvc3Q+PHBvcnQ+MTAwMDA8L3BvcnQ+PC9paW9wPjwvbmFtZVNlcnZlcj48L2NvbmZpZ3VyYXRpb24+IjsNCisNCisJLyoqDQorCSAqIEEgc2VydmVyIHRoYXQgdHJpZXMgYSBzaW5nbGUgYmluZC4NCisJICovDQorCXN0YXRpYyBjbGFzcyBCaW5kaW5nU2VydmVyIGV4dGVuZHMgU2VydmVyIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQmluZGluZ1NlcnZlcn0gaW5zdGFuY2UuDQorCQkgKg0KKwkJICogQHBhcmFtIG5hbWUgSUQgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIuDQorCQkgKiBAcGFyYW0gY2xhc3NOYW1lIENsYXNzIG9mIHNlcnZlciB0byBpbnN0YW50aWF0ZS4NCisJCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBzZXJ2ZXIgY2xhc3MuDQorCQkgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNsYXNzIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgY29uc3RydWN0b3IuDQorCQkgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgd2UgY2FuIGNyZWF0ZSB0aGUgc2VydmVyIG9iamVjdC4NCisJCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNvbnN0cnVjdG9yIGlzbid0IGFjY2Vzc2libGUuDQorCQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gZXhjZXB0aW9uLg0KKwkJICovDQorCQlCaW5kaW5nU2VydmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLA0KKwkJCUluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gew0KKwkJCXN1cGVyKG5hbWUsIGNsYXNzTmFtZSk7DQorCQl9DQorDQorCQlwdWJsaWMgaW50IGdldEJpbmRpbmdCZWhhdmlvcigpIHsNCisJCQlyZXR1cm4gQklORElORzsNCisJCX0NCisNCisJCS8qKg0KKwkJICogU3RhcnQgYnkgYmluZGluZy4NCisJCSAqDQorCQkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7DQorCQkJY29udGV4dC5iaW5kKG5hbWUsIHNlcnZhbnQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBTdG9wIGJ5IHVuYmluZGluZy4NCisJCSAqDQorCQkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsNCisJCQljb250ZXh0LnVuYmluZChuYW1lKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQSAobmFtZWQsIGJ1dCBhbm9ueW1vdXMpIHNlcnZlciB0aGF0IGlzbid0IGJvdW5kIHRvIGEgbmFtaW5nIGNvbnRleHQuDQorCSAqLw0KKwlzdGF0aWMgY2xhc3MgTm9uYmluZGluZ1NlcnZlciBleHRlbmRzIFNlcnZlciB7DQorCQkvKioNCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE5vbmJpbmRpbmdTZXJ2ZXJ9IGluc3RhbmNlLg0KKwkJICoNCisJCSAqIEBwYXJhbSBuYW1lIElEIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyLg0KKwkJICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzcyBvZiBzZXJ2ZXIgdG8gaW5zdGFudGlhdGUuDQorCQkgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gSWYgd2UgY2FuJ3QgZmluZCB0aGUgc2VydmVyIGNsYXNzLg0KKwkJICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjbGFzcyBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IGNvbnN0cnVjdG9yLg0KKwkJICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIElmIHdlIGNhbiBjcmVhdGUgdGhlIHNlcnZlciBvYmplY3QuDQorCQkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjb25zdHJ1Y3RvciBpc24ndCBhY2Nlc3NpYmxlLg0KKwkJICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIElmIHRoZSBzZXJ2ZXIgY29uc3RydWN0b3IgdGhyb3dzIGFuIGV4Y2VwdGlvbi4NCisJCSAqLw0KKwkJTm9uYmluZGluZ1NlcnZlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwNCisJCQlJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsNCisJCQlzdXBlcihuYW1lLCBjbGFzc05hbWUpOw0KKwkJfQ0KKw0KKwkJcHVibGljIGludCBnZXRCaW5kaW5nQmVoYXZpb3IoKSB7DQorCQkJcmV0dXJuIE5PTkJJTkRJTkc7DQorCQl9DQorDQorCQkvKioNCisJCSAqIFN0YXJ0IGJ5IHRha2luZyBubyBhY3Rpb24uDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHN0YXJ0KCkge30NCisNCisJCS8qKg0KKwkJICogU3RvcCBieSB0YWtpbmcgbm8gYWN0aW9uLg0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzdG9wKCkge30NCisJfQ0KKw0KKwkvKioNCisJICogQSBzZXJ2ZXIgdGhhdCByZWJpbmRzIGl0cyBJRCBpbiB0aGUgbmFtaW5nIGNvbnRleHQuDQorCSAqLw0KKwlzdGF0aWMgY2xhc3MgUmViaW5kaW5nU2VydmVyIGV4dGVuZHMgQmluZGluZ1NlcnZlciB7DQorCQkvKioNCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFJlYmluZGluZ1NlcnZlcn0gaW5zdGFuY2UuDQorCQkgKg0KKwkJICogQHBhcmFtIG5hbWUgSUQgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIuDQorCQkgKiBAcGFyYW0gY2xhc3NOYW1lIENsYXNzIG9mIHNlcnZlciB0byBpbnN0YW50aWF0ZS4NCisJCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBzZXJ2ZXIgY2xhc3MuDQorCQkgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNsYXNzIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgY29uc3RydWN0b3IuDQorCQkgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgd2UgY2FuIGNyZWF0ZSB0aGUgc2VydmVyIG9iamVjdC4NCisJCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNvbnN0cnVjdG9yIGlzbid0IGFjY2Vzc2libGUuDQorCQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gSWYgdGhlIHNlcnZlciBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gZXhjZXB0aW9uLg0KKwkJICovDQorCQlSZWJpbmRpbmdTZXJ2ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sDQorCQkJSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7DQorCQkJc3VwZXIobmFtZSwgY2xhc3NOYW1lKTsNCisJCX0NCisNCisJCXB1YmxpYyBpbnQgZ2V0QmluZGluZ0JlaGF2aW9yKCkgew0KKwkJCXJldHVybiBSRUJJTkRJTkc7DQorCQl9DQorDQorCQkvKioNCisJCSAqIFN0YXJ0IGJ5IHJlYmluZGluZyBpbiBuYW1pbmcgY29udGV4dC4NCisJCSAqDQorCQkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7DQorCQkJY29udGV4dC5yZWJpbmQobmFtZSwgc2VydmFudCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEEgc2VydmVyIHRoYXQgcGVyaW9kaWNhbGx5IHJlYmluZHMgaXRzIElEIGluIHRoZSBuYW1pbmcgY29udGV4dC4NCisJICovDQorCXN0YXRpYyBjbGFzcyBBdXRvYmluZGluZ1NlcnZlciBleHRlbmRzIFNlcnZlciB7DQorCQkvKioNCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEF1dG9iaW5kaW5nU2VydmVyfSBpbnN0YW5jZS4NCisJCSAqDQorCQkgKiBAcGFyYW0gbmFtZSBJRCB1bmRlciB3aGljaCB0byByZWdpc3Rlci4NCisJCSAqIEBwYXJhbSBjbGFzc05hbWUgQ2xhc3Mgb2Ygc2VydmVyIHRvIGluc3RhbnRpYXRlLg0KKwkJICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIElmIHdlIGNhbid0IGZpbmQgdGhlIHNlcnZlciBjbGFzcy4NCisJCSAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIElmIHRoZSBzZXJ2ZXIgY2xhc3MgZG9lc24ndCBoYXZlIHRoZSByaWdodCBjb25zdHJ1Y3Rvci4NCisJCSAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBJZiB3ZSBjYW4gY3JlYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0Lg0KKwkJICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIElmIHRoZSBzZXJ2ZXIgY29uc3RydWN0b3IgaXNuJ3QgYWNjZXNzaWJsZS4NCisJCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBJZiB0aGUgc2VydmVyIGNvbnN0cnVjdG9yIHRocm93cyBhbiBleGNlcHRpb24uDQorCQkgKi8NCisJCUF1dG9iaW5kaW5nU2VydmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBsb25nIHBlcmlvZCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwNCisJCQlJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsNCisJCQlzdXBlcihuYW1lLCBjbGFzc05hbWUpOw0KKwkJCXRoaXMucGVyaW9kID0gcGVyaW9kOw0KKwkJfQ0KKw0KKwkJcHVibGljIGludCBnZXRCaW5kaW5nQmVoYXZpb3IoKSB7DQorCQkJcmV0dXJuIEFVVE87DQorCQl9DQorDQorCQkvKioNCisJCSAqIFN0YXJ0IGJ5IHNjaGVkdWxpbmcgdGhlIHRpbWVyIHRhc2sgdGhhdCByZWJpbmRzIHRoaXMgc2VydmVyLg0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsNCisJCQlUSU1FUi5zY2hlZHVsZShiaW5kZXIgPSBuZXcgQmluZGVyKCksIC8qZGVsYXkqLzBMLCAvKnBlcmlvZCovcGVyaW9kKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogU3RvcCBieSBjYW5jZWxpbmcgdGhlIHRpbWVyIHRhc2sgYW5kIHVuYmluZGluZyBmcm9tIHRoZSBzZXJ2ZXIuDQorCQkgKg0KKwkJICogQHRocm93cyBOYW1pbmdFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLg0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7DQorCQkJaWYgKGJpbmRlciAhPSBudWxsKSBiaW5kZXIuY2FuY2VsKCk7DQorCQkJY29udGV4dC51bmJpbmQobmFtZSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEdldCBob3cgb2Z0ZW4gdGhpcyBzZXJ2ZXIgcHJvY2VzcyB3aWxsIGJlIHJlYm91bmQuDQorCQkgKg0KKwkJICogQHJldHVybiBQZXJpb2QgaW4gbWlsbGlzZWNvbmRzLg0KKwkJICovDQorCQlwdWJsaWMgbG9uZyBnZXRQZXJpb2QoKSB7DQorCQkJcmV0dXJuIHBlcmlvZDsNCisJCX0NCisNCisJCS8qKiBIb3cgb2Z0ZW4gdG8gcmViaW5kIGluIG1pbGxpc2Vjb25kcy4gKi8NCisJCXByaXZhdGUgbG9uZyBwZXJpb2Q7DQorDQorCQkvKiogVGltZXIgdGFzayB0aGF0IHJlYmluZHMuICovDQorCQlwcml2YXRlIEJpbmRlciBiaW5kZXI7DQorDQorCQkvKioNCisJCSAqIFRpbWVyIHRhc2sgdGhhdCByZWJpbmRzIHRoaXMgc2VydmVyIHRvIHRoZSBuYW1pbmcgY29udGV4dC4NCisJCSAqLw0KKwkJcHJpdmF0ZSBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBUaW1lclRhc2sgew0KKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJdHJ5IHsNCisJCQkJCWNvbnRleHQucmViaW5kKG5hbWUsIHNlcnZhbnQpOw0KKwkJCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZXgpIHt9DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL1NlcnZpY2UuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU0YmZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCitpbXBvcnQgamF2YS5ybWkuUmVtb3RlOworaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiBlbnRlcnByaXNlIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UgZXh0ZW5kcyBSZW1vdGUgeworCS8qKgorCSAqIEdldCB0aGUgaW50ZXJmYWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UuCisJICoKKwkgKiBOb21pbmFsbHksIHRoaXMgc2hvdWxkIHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlCisJICogaW1wbGVtZW50YXRpb24gY2xhc3MsIG5vdCB0aGUgaW50ZXJmYWNlIG5hbWUuICBObyBpZGVhIGhvdyB0aGF0ICJzdGFuZGFyZCIgZ290CisJICogc3RhcnRlZC4gIFNvLCBhIGdvb2QgcmV0dXJuIHZhbHVlIG1pZ2h0IGJlCisJICogPGNvZGU+anBsLm9vZHQucHJvZHVjdC5ybWkuUHJvZHVjdFNlcnZpY2VJbXBsPC9jb2RlPiBhbmQgPHN0cm9uZz5ub3Q8L3N0cm9uZz4KKwkgKiA8Y29kZT5qcGwub29kdC5wcm9kdWN0LlByb2R1Y3RTZXJ2aWNlPC9jb2RlPi4KKwkgKgorCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlTdHJpbmcgZ2V0U2VydmVySW50ZXJmYWNlTmFtZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBDb250cm9sIHRoZSBzZXJ2ZXIuCisJICoKKwkgKiBAcGFyYW0gY29tbWFuZCBhIDxjb2RlPmJ5dGVbXTwvY29kZT4gdmFsdWUuCisJICogQHJldHVybiBSZXNwb25zZS4KKwkgKiBAdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJYnl0ZVtdIGNvbnRyb2woYnl0ZVtdIGNvbW1hbmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKwkKKwkvKioKKwkgKiBDb250cm9sIHRoZSBzZXJ2ZXIgYXN5bmNocm9ub3VzbHkuCisJICoKKwkgKiBAcGFyYW0gY29tbWFuZCBhIDxjb2RlPmJ5dGVbXTwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBSZW1vdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXZvaWQgY29udHJvbEFzeW5jKGJ5dGVbXSBjb21tYW5kKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHkuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0MTU3MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5OworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMubmV0Lk5ldDsKKworLyoqCisgKiBBbiBhY3Rpdml0eSBpcyBhbiBvY2N1cnJlbmNlIG9mIHNvbWUgYWN0aXZlIGFjdGlvbi4gIEl0IGhhcyBhIHVuaXF1ZSBJRCBpbiB0aGUKKyAqIHVuaXZlcnNlLCBhIHdheSB0byBsb2cgaW5jaWRlbnRzIHRoYXQgb2NjdXIgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIGFjdGl2aXR5LCBhbmQgYQorICogd2F5IHRvIGluZGljYXRlIHRoYXQgdGhlIGFjdGl2aXR5IGhhcyBzdG9wcGVkLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGl2aXR5IHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBY3Rpdml0eX0gaW5zdGFuY2UuCisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgQWN0aXZpdHkoKSB7CisJCXNldElEKGdlbmVyYXRlSUQoKSk7CisJfQorCisJLyoqCisJICogQ2hhbmdlIHRoZSBhY3Rpdml0eSdzIElEIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBpZCBOZXcgSUQuCisJICovCisJcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKSB7CisJCWlmIChpZCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJRCByZXF1aXJlZCIpOworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBhY3Rpdml0eSdzIElELgorCSAqCisJICogQHJldHVybiBhIHtAbGluayBTdHJpbmd9IElELgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiBTdG9wIHRoaXMgYWN0aXZpdHkuICBUaGlzIG1ldGhvZCBsb2dzIGEgPGNvZGU+QWN0aXZpdHlTdG9wcGVkPC9jb2RlPiBpbmNpZGVudC4gIE5vCisJICogZnVydGhlciBpbmNpZGVudHMgbWF5IGJlIGxvZ2dlZCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworCQlpZiAoIXN0YXJ0ZWQpIHJldHVybjsKKwkJdGhpcy5zdGFydGVkID0gZmFsc2U7CisJCWxvZyhuZXcgQWN0aXZpdHlTdG9wcGVkKCkpOworCX0KKworCS8qKgorCSAqIExvZyB0aGUgZ2l2ZW4gaW5jaWRlbnQuCisJICoKKwkgKiBAcGFyYW0gaW5jaWRlbnQgVGhlIGluY2lkZW50IHRvIGxvZy4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgbG9nKEluY2lkZW50IGluY2lkZW50KSB7CisJCWluY2lkZW50LnNldEFjdGl2aXR5SUQoaWQpOworCQlyZWNvcmRJbmNpZGVudChpbmNpZGVudCk7CisJfQorCisJLyoqCisJICogUmVjb3JkIHRoZSBnaXZlbiBpbmNpZGVudC4KKwkgKgorCSAqIEBwYXJhbSBpbmNpZGVudCBhbiB7QGxpbmsgSW5jaWRlbnR9IHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlY29yZEluY2lkZW50KEluY2lkZW50IGluY2lkZW50KTsKKworCS8qKgorCSAqIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGUgYWN0aXZpdHkgYmFzZWQgb24gSW50ZXJuZXQgYWRkcmVzcywgYSB1bmlxdWUKKwkgKiBjb3VudGVyLCB0aGUgdGltZSwgYW5kIHNvbWUgcmFuZG9tIGJ5dGVzLgorCSAqCisJICogQHJldHVybiBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlSUQoKSB7CisJCXRyeSB7CisJCQlJbmV0QWRkcmVzcyBhZGRyID0gTmV0LmdldExvY2FsSG9zdCgpOwkgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbG9jYWwgaG9zdCdzIElQIGFkZHJlc3MKKwkJCWxvbmcgbmV4dE51bSA9ICsrY291bnRlcjsJCQkJICAgICAgIC8vIEdldCB0aGUgbmV4dCA2NCBiaXQgbnVtYmVyCisJCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwkJCQkJICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0aW1lCisJCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVszMl07CQkJCSAgICAgICAvLyBNYWtlIHNwYWNlIGZvciAzMiByYW5kb20gYnl0ZXMKKwkJCVJBTkRPTS5uZXh0Qnl0ZXMoYnl0ZXMpOwkJCQkgICAgICAgLy8gRmlsbCBpbiAzMiByYW5kb20gYnl0ZXMKKwkJCVN0cmluZ0J1ZmZlciBpbnB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsJCSAgICAgICAvLyBNYWtlIHNwYWNlIHRvIHB1dCB0aGUgMXN0IDMgY29tcG9uZW50cy4uLgorCQkJaW5wdXQuYXBwZW5kKGFkZHIpLmFwcGVuZChuZXh0TnVtKS5hcHBlbmQoZGF0ZSk7CSAgICAgICAvLyAuLi50b2dldGhlciBhbmQgcHV0ICdlbSB0b2dldGhlcgorCQkJTWVzc2FnZURpZ2VzdCBtZXNzYWdlRGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ly8gUHJlcGFyZSB0byB0YWtlIGEgaGFzaAorCQkJbWVzc2FnZURpZ2VzdC51cGRhdGUoaW5wdXQudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsJICAgICAgIC8vIEFkZCB0aGUgMXN0IDMgY29tcG9uZW50cworCQkJYnl0ZVtdIHNpZyA9IG1lc3NhZ2VEaWdlc3QuZGlnZXN0KGJ5dGVzKTsJCSAgICAgICAvLyBBbmQgYWRkIHRoZSByYW5kb20gYnl0ZXMKKwkJCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CQkgICAgICAgLy8gTWFrZSBzcGFjZSB0byBzdG9yZSB0aGUgaGFzaCBhcyBhIHN0cmluZworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWcubGVuZ3RoOyArK2kpCQkJICAgICAgIC8vIEZvciBlYWNoIGJ5dGUgaW4gdGhlIGhhc2gKKwkJCQlvdXRwdXQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKChpbnQpc2lnW2ldKSYweGZmKSk7Ly8gU3RvcmUgaXQgYXMgYSBoZXggdmFsdWUKKwkJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsJCQkJICAgICAgIC8vIEFuZCByZXR1cm4gdGhlIHN0cmluZworCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1ENSBhbGdvcml0aG0gbm90IGF2YWlsYWJsZSIpOworCQl9CisJfQorCisJLyoqIFVuaXF1ZSBJRCBvZiB0aGUgYWN0aXZpdHkuICovCisJcHJvdGVjdGVkIFN0cmluZyBpZDsKKworCS8qKiBGbGFnIHRoYXQgdGVsbHMgaWYgdGhpcyBhY3Rpdml0eSBpcyBhY3RpdmUuICovCisJcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSB0cnVlOworCisJLyoqIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZvciB1bmlxdWUgSURzLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7CisKKwkvKiogQ291bnRlciBmb3IgdW5pcXVlIElEcy4gKi8KKwlwcml2YXRlIHN0YXRpYyBsb25nIGNvdW50ZXIgPSAwOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlFeGNlcHRpb24uamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZTNkMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7CisKKy8qKgorICAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB0aHJvd24gYXMgYW4gZXhjZXB0aW9uIGluIHRoZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eSBwYWNrYWdlLgorCisgICBAYXV0aG9yIFMuIEhhcmRtYW4KKyAgIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAvKioKKyAgICAgIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgdGhlIHtAbGluayBFeGNlcHRpb259IGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLgorICAgKi8KKyAgIHB1YmxpYyBBY3Rpdml0eUV4Y2VwdGlvbigpIHsKKyAgICAgIHN1cGVyKCk7CisgICB9CisKKworICAgLyoqCisgICAgICBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIHRoZSB7QGxpbmsgRXhjZXB0aW9ufSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4KKworICAgICAgQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCisgICAqLworICAgcHVibGljIEFjdGl2aXR5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgIH0KKworCisgICAvKioKKyAgICAgIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgdGhlIHtAbGluayBFeGNlcHRpb259IGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLgorCisgICAgICBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICovCisgICBwdWJsaWMgQWN0aXZpdHlFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICBzdXBlcihjYXVzZSk7CisgICB9CisKKworICAgLyoqCisgICAgICBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIHRoZSB7QGxpbmsgRXhjZXB0aW9ufSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4KKworICAgICAgQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCisgICAgICBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICovCisgICBwdWJsaWMgQWN0aXZpdHlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgfQorfQorCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9BY3Rpdml0eUZhY3RvcnkuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjA3M2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9BY3Rpdml0eUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQorLyoqDQorICogRmFjdG9yeSBmb3IgYWN0aXZpdGllcy4gIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYXJlIHJlc3BvbnNpYmxlIGZvcg0KKyAqIGdlbmVyYXRpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgQWN0aXZpdGllcyBvbiBkZW1hbmQuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlGYWN0b3J5IHsNCisJLyoqDQorCSAqIENyZWF0ZSBhbiBhY3Rpdml0eS4NCisJICoNCisJICogQHJldHVybiBhbiBuZXcge0BsaW5rIEFjdGl2aXR5fSBpbnN0YW5jZS4NCisJICovDQorCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5U3RvcHBlZC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlTdG9wcGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNWZmMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5U3RvcHBlZC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eTsNCisNCisvKioNCisgKiBBbiBpbmNpZGVudCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIGFjdGl2aXR5IGhhcyBzdG9wcGVkLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisgKi8NCitjbGFzcyBBY3Rpdml0eVN0b3BwZWQgZXh0ZW5kcyBJbmNpZGVudCB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBY3Rpdml0eVN0b3BwZWR9IGluc3RhbmNlLg0KKwkgKi8NCisJQWN0aXZpdHlTdG9wcGVkKCkge30NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlUcmFja2VyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9BY3Rpdml0eVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU1MmIwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlUcmFja2VyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eTsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQorDQorLyoqDQorICogVHJhY2tlciBvZiBhY3Rpdml0aWVzLiAgVGhpcyBpcyB0aGUgbWFpbiBjbGFzcyBhcHBsaWNhdGlvbnMgdXNlIHRvIGtlZXAgdHJhY2sNCisgKiBhY3Rpdml0aWVzLiAgVG8gdHJhY2sgYW4gYWN0aXZpdHksIGNhbGwgdGhlIHtAbGluayAjY3JlYXRlQWN0aXZpdHl9IG1ldGhvZCB0byBnZW5lcmF0ZQ0KKyAqIGEgbmV3IHtAbGluayBBY3Rpdml0eX0sIHRoZW4gbG9nIHtAbGluayBJbmNpZGVudH1zIGFnYWluc3QgaXQgd2l0aCB0aGUge0BsaW5rDQorICogQWN0aXZpdHkjbG9nfSBtZXRob2QuICBGaW5hbGx5LCB0b3AgdGhlIGFjdGl2aXR5IHdpdGgge0BsaW5rIEFjdGl2aXR5I3N0b3B9Lg0KKyAqDQorICogPHA+VGhlIDxjb2RlPkFjdGl2aXR5VHJhY2tlcjwvY29kZT4gZ2VuZXJhdGVzIGFjdGl2aXRpZXMgdXNpbmcgYW4ge0BsaW5rDQorICogQWN0aXZpdHlGYWN0b3J5fS4gIEl0IGNvbmZpZ3VyZXMgdGhlIGZhY3RvcnkgYnkgZXhhbWluaW5nIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4gIFRoZQ0KKyAqIHByb3BlcnR5IDxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LmZhY3RvcmllczwvY29kZT4gKG9yIHRoZQ0KKyAqIDxjb2RlPmFjdGl2aXR5LmZhY3RvcmllczwvY29kZT4gcHJvcGVydHkgZm9yIHRob3NlIHRoYXQgcHJlZmVyIGFuIGFiYnJldmlhdGVkIG5hbWUgYW5kDQorICogdGhlIHByaW9yIG9uZSBpc24ndCBkZWZpbmVkKSBpcyBhIGNvbW1hLSAob3IgdmVydGljYWwgYmFyLSkgc2VwZXJhdGVkIGxpc3Qgb2YgY2xhc3MNCisgKiBuYW1lcy4gIEVhY2ggY2xhc3MgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IHRoZSB7QGxpbmsgQWN0aXZpdHlGYWN0b3J5fSBpbnRlcmZhY2UuICBJZg0KKyAqIHRoZXJlIGFyZSBub25lIChvciBuZWl0aGVyIHByb3BlcnR5IGlzIGRlZmluZWQpLCB0aGVuIGEgc3BlY2lhbCBudWxsIGZhY3RvcnkgaXMgdXNlZA0KKyAqIHRoYXQgdGhyb3dzIGF3YXkgYWxsIGluY2lkZW50cy4gIElmIG1vcmUgdGhhbiBvbmUncyBkZWZpbmVkLCB0aGVuIGEgc3BlY2lhbCBmYWN0b3J5IGlzDQorICogdXNlZCB0aGF0IG11bHRpcGxleGVzIGFsbCBpbmNpZGVudHMgdG8gZWFjaCBvbmUuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eVRyYWNrZXIgew0KKwkvKioNCisJICogR2VuZXJhdGUgYW4gYWN0aXZpdHkuDQorCSAqDQorCSAqIEByZXR1cm4gYW4gbmV3IHtAbGluayBBY3Rpdml0eX0gaW5zdGFuY2UuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgew0KKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQWN0aXZpdHkoKTsNCisJfQ0KKw0KKwkvKiogV2hhdCBhY3R1YWxseSBtYWtlcyBBY3Rpdml0aWVzLiAqLw0KKwlzdGF0aWMgQWN0aXZpdHlGYWN0b3J5IGZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBFeGFtaW5lIHRoZSBwcm9wZQ0KKwkgKg0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQorCSAqLw0KKwlzdGF0aWMgdm9pZCBpbml0aWFsaXplRmFjdG9yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorCQlTdHJpbmcgZmFjTmFtZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LmZhY3RvcmllcyIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYWN0aXZpdHkuZmFjdG9yaWVzIiwgIiIpKTsNCisJCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOw0KKwkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihmYWNOYW1lcywgIix8Iik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7DQorCQkJU3RyaW5nIGZhY3RvcnlOYW1lID0gdG9rZW5zLm5leHRUb2tlbigpOw0KKwkJCUNsYXNzIGZhY3RvcnlDbGFzcyA9IENsYXNzLmZvck5hbWUoZmFjdG9yeU5hbWUpOw0KKwkJCWZhY3Rvcmllcy5hZGQoZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCkpOw0KKwkJfQ0KKwkJaWYgKGZhY3Rvcmllcy5pc0VtcHR5KCkpDQorCQkJZmFjdG9yeSA9IG5ldyBOdWxsQWN0aXZpdHlGYWN0b3J5KCk7DQorCQllbHNlIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDEpDQorCQkJZmFjdG9yeSA9IChBY3Rpdml0eUZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoMCk7DQorCQllbHNlDQorCQkJZmFjdG9yeSA9IG5ldyBDb21wb3NpdGVBY3Rpdml0eUZhY3RvcnkoZmFjdG9yaWVzKTsNCisJfQ0KKw0KKwkvKioNCisJICogSW5pdGlhbGl6ZSB0aGUgPGNvZGU+ZmFjdG9yeTwvY29kZT4uDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJdHJ5IHsNCisJCQlpbml0aWFsaXplRmFjdG9yaWVzKCk7DQorCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7DQorCQkJdGhyb3cgZXg7DQorCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgaW5pdGlhbGl6ZSBhY3Rpdml0eSBmYWN0b3JpZXM6ICIgKyBleC5nZXRNZXNzYWdlKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBTcGVjaWFsIGZhY3RvcnkgdGhhdCBjcmVhdGVzIG9ubHkgbnVsbCBhY3Rpdml0aWVzLiAgTnVsbCBhY3Rpdml0aWVzIHRvc3Mgb3V0IGV2ZXJ5IGluY2lkZW50Lg0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbEFjdGl2aXR5RmFjdG9yeSBpbXBsZW1lbnRzIEFjdGl2aXR5RmFjdG9yeSB7DQorCQkvKioNCisJCSAqIENyZWF0ZSBudWxsIGFjdGl2aXRpZXMuDQorCQkgKg0KKwkJICogQHJldHVybiBOdWxsIGFjdGl2aXR5Lg0KKwkJICovDQorCQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7DQorCQkJcmV0dXJuIG5ldyBOdWxsQWN0aXZpdHkoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogU3BlY2lhbCBmYWN0b3J5IHRoYXQgbXVsdGlwbGV4ZXMgYWN0aXZpdGVzLiAgVGhpcyBmYWN0b3J5IHRha2VzIGEgY29sbGVjdGlvbiBvZg0KKwkgKiBvdGhlciBmYWN0b3JpZXMuICBJdCBnZW5lcmF0ZXMgYWN0aXZpdGllcyB0aGF0IHRoZW4gZmFudGFpbCBpbmNpZGVudHMgdG8gb3RoZXINCisJICogZmFjdG9yaWVzJyBhY3Rpdml0aWVzLg0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9zaXRlQWN0aXZpdHlGYWN0b3J5IGltcGxlbWVudHMgQWN0aXZpdHlGYWN0b3J5IHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29tcG9zaXRlQWN0aXZpdHlGYWN0b3J5fSBpbnN0YW5jZS4NCisJCSAqDQorCQkgKiBAcGFyYW0gZmFjdG9yaWVzIGEge0BsaW5rIENvbGxlY3Rpb259IG9mIEFjdGl2aXR5RmFjdG9yaWVzLg0KKwkJICovDQorCQlwcml2YXRlIENvbXBvc2l0ZUFjdGl2aXR5RmFjdG9yeShDb2xsZWN0aW9uIGZhY3Rvcmllcykgew0KKwkJCXRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBDcmVhdGUgYW4gYWN0aXZpdHkgdGhhdCBmYW50YWlscyB0byBvdGhlciBmYWN0b3JpZXMnIGFjdGl2aXRpZXMuDQorCQkgKg0KKwkJICogQHJldHVybiBhbiB7QGxpbmsgQWN0aXZpdHl9IHZhbHVlLg0KKwkJICovDQorCQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7DQorCQkJTGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOw0KKwkJCWZvciAoSXRlcmF0b3IgaSA9IGZhY3Rvcmllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsNCisJCQkJQWN0aXZpdHlGYWN0b3J5IGZhY3RvcnkgPSAoQWN0aXZpdHlGYWN0b3J5KSBpLm5leHQoKTsNCisJCQkJYWN0aXZpdGllcy5hZGQoZmFjdG9yeS5jcmVhdGVBY3Rpdml0eSgpKTsNCisJCQl9DQorCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVBY3Rpdml0eShhY3Rpdml0aWVzKTsNCisJCX0NCisNCisJCS8qKiBDb2xsZWN0aW9uIG9mIHtAbGluayBBY3Rpdml0eUZhY3Rvcnl9IGluc3RhbmNlcy4gKi8NCisJCXByaXZhdGUgQ29sbGVjdGlvbiBmYWN0b3JpZXM7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQ29tcG9zaXRlQWN0aXZpdHkuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0NvbXBvc2l0ZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmYjc4OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0NvbXBvc2l0ZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KKy8qKg0KKyAqIEEgY29tcG9zaXRlIGFjdGl2aXR5IG11bHRpcGxleGVzIGluY2lkZW50cyB0byBtdWx0aXBsZSBvdGhlciBhY3Rpdml0aWVzLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb21wb3NpdGVBY3Rpdml0eX0gaW5zdGFuY2UuDQorCSAqDQorCSAqIEBwYXJhbSBhY3Rpdml0aWVzIGEge0BsaW5rIENvbGxlY3Rpb259IG9mIHtAbGluayBBY3Rpdml0eX0gaW5zdGFuY2VzLg0KKwkgKi8NCisJcHVibGljIENvbXBvc2l0ZUFjdGl2aXR5KENvbGxlY3Rpb24gYWN0aXZpdGllcykgew0KKwkJaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCkNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBY3Rpdml0aWVzIGNvbGxlY3Rpb24gcmVxdWlyZWQiKTsNCisJCWZvciAoSXRlcmF0b3IgaSA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQ0KKwkJCWlmICghKGkubmV4dCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpKQ0KKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb24tQWN0aXZpdHkgaW4gYWN0aXZpdGllcyBjb2xsZWN0aW9uIik7DQorCQl0aGlzLmFjdGl2aXRpZXMgPSBhY3Rpdml0aWVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZWNvcmQgdGhlIGdpdmVuIGluY2lkZW50IGluIGVhY2ggb2Ygb3VyIGRlbGVnYXRlIGFjdGl2aXRpZXMuDQorCSAqDQorCSAqIEBwYXJhbSBpbmNpZGVudCBUaGUge0BsaW5rIEluY2lkZW50fSB0byByZWNvcmQuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWNvcmRJbmNpZGVudChJbmNpZGVudCBpbmNpZGVudCkgew0KKwkJZm9yIChJdGVyYXRvciBpID0gYWN0aXZpdGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspDQorCQkJKChBY3Rpdml0eSkgaS5uZXh0KCkpLnJlY29yZEluY2lkZW50KGluY2lkZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBY3Rpdml0eX0gaW5zdGFuY2VzLg0KKwkgKi8NCisJcHJpdmF0ZSBDb2xsZWN0aW9uIGFjdGl2aXRpZXM7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0RhdGFncmFtTG9nZ2VyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9EYXRhZ3JhbUxvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZGMzZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9EYXRhZ3JhbUxvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLk9wdGlvbmFsRGF0YUV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb247DQoraW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0Ow0KK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorLyoqDQorICogVGhlIGRhdGFncmFtIGxvZ2dlciBhY2NlcHRzIGluY2lkZW50cyBpbiBVRFAgZGF0YWdyYW1zIGFuZCBzYXZlcyB0aGVtIGluIGEge0BsaW5rDQorICogU3RvcmFnZX0uICBUaGUgZGF0YWdyYW1zIGNvbnRhaW4gc2VyaWFsaXplZCB7QGxpbmsgSW5jaWRlbnR9cywgYW5kIGFyZSBwcm9iYWJseSBzZW50IGJ5DQorICogYSB7QGxpbmsgRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5fS4NCisgKg0KKyAqIEBhdXRob3IgS2VsbHkNCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkDQorICovDQorY2xhc3MgRGF0YWdyYW1Mb2dnZXIgew0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB0aHJvd3MgVGhyb3dhYmxlIHsNCisJCWlmIChhcmd2Lmxlbmd0aCA+IDApIHsNCisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRoaXMgcHJvZ3JhbSB0YWtlcyBOTyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIpOw0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU2V0IHRoZSBhY3Rpdml0eS5wb3J0IHByb3BlcnR5IHRvIGFkanVzdCB0aGUgcG9ydCBudW1iZXIuIik7DQorCQkJU3lzdGVtLmVyci5wcmludGxuKCJTZXQgdGhlIGFjdGl2aXR5LnN0b3JhZ2UgcHJvcGVydHkgdG8gc2V0IHRoZSBTdG9yYWdlIGNsYXNzIHRvIHVzZS4iKTsNCisJCQlTeXN0ZW0uZXhpdCgxKTsNCisJCX0NCisJCWludCBwb3J0ID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJhY3Rpdml0eS5wb3J0IiwgNDU1NikuaW50VmFsdWUoKTsNCisJCVN0cmluZyBjbGFzc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImFjdGl2aXR5LnN0b3JhZ2UiKTsNCisJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgew0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gU3RvcmFnZSBjbGFzcyBkZWZpbmVkIHZpYSB0aGUgYGFjdGl2aXR5LnN0b3JhZ2UnIHByb3BlcnR5OyBleGl0aW5nLi4uIik7DQorCQkJU3lzdGVtLmV4aXQoMSk7DQorCQl9DQorCQlDbGFzcyBzdG9yYWdlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7DQorCQlzdG9yYWdlID0gKFN0b3JhZ2UpIHN0b3JhZ2VDbGFzcy5uZXdJbnN0YW5jZSgpOw0KKwkJRGF0YWdyYW1Tb2NrZXQgc29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KHBvcnQpOw0KKwkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOw0KKwkJRGF0YWdyYW1QYWNrZXQgcGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KGJ1ZiwgYnVmLmxlbmd0aCk7DQorCQlmb3IgKDs7KSB7DQorCQkJc29ja2V0LnJlY2VpdmUocGFja2V0KTsNCisJCQlieXRlW10gcmVjZWl2ZWQgPSBuZXcgYnl0ZVtwYWNrZXQuZ2V0TGVuZ3RoKCldOw0KKwkJCVN5c3RlbS5hcnJheWNvcHkocGFja2V0LmdldERhdGEoKSwgcGFja2V0LmdldE9mZnNldCgpLCByZWNlaXZlZCwgMCwgcGFja2V0LmdldExlbmd0aCgpKTsNCisJCQluZXcgUmVjZWl2ZXJUaHJlYWQocmVjZWl2ZWQpLnN0YXJ0KCk7DQorCQl9IA0KKwl9DQorDQorCS8qKiBMb25nIHRlcm0gc3RvcmFnZSBmb3IgaW5jaWRlbnRzLiAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdG9yYWdlIHN0b3JhZ2U7DQorDQorCS8qKiBIaXN0b3J5IGF3YWl0aW5nIGxvbmctdGVybSBzdG9yYWdlLiAgS2V5cyBhcmUge0BsaW5rIFN0cmluZ30gYWN0aXZpdHkgSURzLCBhbmQgdmFsdWVzIGFyZSB7QGxpbmsgSGlzdG9yeX0gb2JqZWN0cy4gKi8NCisJcHJpdmF0ZSBzdGF0aWMgTWFwIGhpc3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7DQorDQorCS8qKg0KKwkgKiBUaHJlYWQgdGhhdCBzYXZlcyBvZmYgYW4gaW5jaWRlbnQgaW50byBhIGhpc3Rvcnkgc28gdGhlIG1haW4gdGhyZWFkIGNhbiBnbyBiYWNrDQorCSAqIHRvIHJlY2VpdmluZyBtb3JlIGRhdGFncmFtcy4NCisJICovDQorCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlY2VpdmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUmVjZWl2ZXJUaHJlYWR9IGluc3RhbmNlLg0KKwkJICoNCisJCSAqIEBwYXJhbSBkYXRhIENvcHkgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gYSBkYXRhZ3JhbS4NCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWNlaXZlclRocmVhZChieXRlW10gZGF0YSkgew0KKwkJCXRoaXMuZGF0YSA9IGRhdGE7DQorCQl9DQorDQorCQkvKioNCisJCSAqIFJlY29uc3RpdHV0ZSB0aGUgaW5jaWRlbnQgaW4gdGhlIHJlY2VpdmVkIGJ5dGUgYXJyYXkgYW5kIHN0b3JlIGl0IGludG8NCisJCSAqIGEge0BsaW5rIEhpc3Rvcnl9Lg0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJdHJ5IHsNCisJCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpKTsNCisJCQkJSW5jaWRlbnQgaW5jaWRlbnQgPSAoSW5jaWRlbnQpIGluLnJlYWRPYmplY3QoKTsNCisJCQkJU3RyaW5nIGlkID0gaW5jaWRlbnQuZ2V0QWN0aXZpdHlJRCgpOw0KKwkJCQlpbi5jbG9zZSgpOw0KKwkJCQlIaXN0b3J5IGhpc3Rvcnk7DQorCQkJCXN5bmNocm9uaXplZCAoaGlzdG9yaWVzKSB7DQorCQkJCQloaXN0b3J5ID0gKEhpc3RvcnkpIGhpc3Rvcmllcy5nZXQoaWQpOw0KKwkJCQkJaWYgKGhpc3RvcnkgPT0gbnVsbCkgew0KKwkJCQkJCWhpc3Rvcmllcy5wdXQoaWQsIG5ldyBIaXN0b3J5KGluY2lkZW50LCBzdG9yYWdlKSk7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWhpc3RvcnkuYWRkSW5jaWRlbnQoaW5jaWRlbnQpOw0KKwkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsNCisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJEcm9wcGluZyBJbmNpZGVudCBvZiB1bmtub3duIGNsYXNzOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsNCisJCQl9IGNhdGNoIChJbnZhbGlkQ2xhc3NFeGNlcHRpb24gZXgpIHsNCisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJEcm9wcGluZyBJbmNpZGVudCBvZiBpbnZhbGlkIGNsYXNzOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsNCisJCQl9IGNhdGNoIChTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gZXgpIHsNCisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gcmVhZCBJbmNpZGVudCBmcm9tIHBhY2tldDogIiArIGV4LmdldE1lc3NhZ2UoKSk7DQorCQkJfSBjYXRjaCAoT3B0aW9uYWxEYXRhRXhjZXB0aW9uIGV4KSB7DQorCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUHJpbWl0aXZlIGRhdGEgaW5zdGVhZCBvZiBJbmNpZGVudCBpbiBwYWNrZXQ6ICIgKyBleC5nZXRNZXNzYWdlKCkpOw0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOw0KKwkJCX0NCisJCX0NCisNCisJCS8qKiBCeXRlcyByZWNlaXZlZCBpbiBhIGRhdGFncmFtLiAqLw0KKwkJcHJpdmF0ZSBieXRlW10gZGF0YTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0RhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYmRhZTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQ7DQoraW1wb3J0IGphdmEubmV0LkRhdGFncmFtU29ja2V0Ow0KK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsNCitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGFjdGl2aXR5IGZhY3RvcnkgcHJvZHVjZXMgYWN0aXZpdGllcyB0aGF0IGxvZyB0aGVpciBpbmNpZGVudHMgdXNpbmcgZGF0YWdyYW1zLiAgSXQNCisgKiBleGFtaW5lcyB0aGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHNlbmQgdGhlIGluY2lkZW50cy4gIFRoZSBwcm9wZXJ0eQ0KKyAqIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkRhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5ob3N0PC9jb2RlPiAob3INCisgKiA8Y29kZT5hY3Rpdml0eS5ob3N0PC9jb2RlPiBpZiBub3QgZGVmaW5lZCkgdGVzbGxzIHRvIHdoYXQgaG9zdCB0byBzZW5kIHRoZSBkYXRhZ3JhbXMuDQorICogVGhlcmUncyBubyBkZWZhdWx0IHZhbHVlLCBhbmQgaXQncyBhbiBydW50aW1lIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIHByb3BlcnR5J3MgZGVmaW5lZC4NCisgKg0KKyAqIDxwPlRoZSBwcm9wZXJ0eSA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkucG9ydDwvY29kZT4gKG9yDQorICogPGNvZGU+YWN0aXZpdHkucG9ydDwvY29kZT4gaWYgbm90IGRlZmluZWQpIHRlbGxzIHRvIHdoYXQgcG9ydCB0byBzZW5kIHRoZSBkYXRhZ3JhbXMuDQorICogSXQgZGVmYXVsdHMgdG8gNDU1Ni4NCisgKg0KKyAqIDxwPk9uY2UgY3JlYXRlZCwgaXQgcmVjb3JkcyBpbmNpZGVudHMgYnkgc2VyaWFsaXppbmcgdGhlbSBpbnRvIGEgYnl0ZSBidWZmZXIgYW5kDQorICogc2VuZGluZyB0aGF0IGJ1ZmZlciBhcyBhIGRhdGFncmFtIHRvIHRoZSBhY3Rpdml0eSBob3N0L3BvcnQuICBUaGlzIGRvZXMgbGltaXQgdGhlIHNpemUNCisgKiBvZiBpbmNpZGVudHMgdGhhdCBjYW4gZ28gb3ZlciwgYnV0IG1vc3QgaW5jaWRlbnRzIGFyZSBwcmV0dHkgc21hbGwuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkgaW1wbGVtZW50cyBBY3Rpdml0eUZhY3Rvcnkgew0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5fSBpbnN0YW5jZS4NCisJICovDQorCXB1YmxpYyBEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkoKSB7DQorCQlTdHJpbmcgaG9zdG5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkRhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5ob3N0IiwNCisJCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImFjdGl2aXR5Lmhvc3QiLCAiIikpOw0KKwkJcG9ydCA9IEludGVnZXIuZ2V0SW50ZWdlcigib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5LnBvcnQiLA0KKwkJCUludGVnZXIuZ2V0SW50ZWdlcigiYWN0aXZpdHkucG9ydCIsIDQ1NTYpKS5pbnRWYWx1ZSgpOw0KKwkJaWYgKGhvc3RuYW1lLmxlbmd0aCgpID09IDApDQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3lzdGVtIHByb3BlcnR5IGBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkuaG9zdCciDQorCQkJCSsgIiAob3Igc2ltcGx5IGBhY3Rpdml0eS5ob3N0Jykgbm90IGRlZmluZWQgb3IgaXMgZW1wdHkiKTsNCisJCXRyeSB7DQorCQkJaG9zdCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZSk7DQorCQkJc29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KCk7DQorCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleCkgew0KKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGl2aXR5IGhvc3QgYCIgKyBob3N0ICsgIicgdW5rbm93biIpOw0KKwkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGV4KSB7DQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhbm9ueW1vdXMgZGF0YWdyYW0gc29ja2V0Iik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZSBhbiBhY3Rpdml0eSB0aGF0IHJlY29yZHMgaW5jaWRlbnRzIGluIGEgVURQIGRhdGFncmFtLg0KKwkgKg0KKwkgKiBAcmV0dXJuIGFuIHtAbGluayBBY3Rpdml0eX0gdmFsdWUuDQorCSAqLw0KKwlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7DQorCQlyZXR1cm4gbmV3IEFjdGl2aXR5KCkgew0KKwkJCXB1YmxpYyB2b2lkIHJlY29yZEluY2lkZW50KEluY2lkZW50IGluY2lkZW50KSB7DQorCQkJCXRyeSB7DQorCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisJCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOw0KKwkJCQkJb29zLndyaXRlT2JqZWN0KGluY2lkZW50KTsNCisJCQkJCW9vcy5jbG9zZSgpOw0KKwkJCQkJYmFvcy5jbG9zZSgpOw0KKwkJCQkJYnl0ZVtdIGJ1ZiA9IGJhb3MudG9CeXRlQXJyYXkoKTsNCisJCQkJCURhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIGJ1Zi5sZW5ndGgsIGhvc3QsIHBvcnQpOw0KKwkJCQkJc29ja2V0LnNlbmQocGFja2V0KTsNCisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQ0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqIFRvIHdoYXQgaG9zdCB0byBzZW5kIGRhdGFncmFtcy4gKi8NCisJSW5ldEFkZHJlc3MgaG9zdDsNCisNCisJLyoqIFRvIHdoYXQgcG9ydCBvbiB7QGxpbmsgI2hvc3R9LiAqLw0KKwlpbnQgcG9ydDsNCisNCisJLyoqIFRyYW5zbWlzc2lvbiBzb2NrZXQgZm9yIGRhdGFncmFtcy4gKi8NCisJRGF0YWdyYW1Tb2NrZXQgc29ja2V0Ow0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9IaXN0b3J5LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9IaXN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5YTUwNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0hpc3RvcnkuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7DQoraW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7DQorDQorLyoqDQorICogQSBoaXN0b3J5IG9mIGluY2lkZW50cyB0byBiZSBzdG9yZWQgaW4gbG9uZy10ZXJtIHN0b3JhZ2UuDQorICoNCisgKiBUaGUgPGNvZGU+SGlzdG9yeTwvY29kZT4gdHJhY2tzIEluY2lkZW50cyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgY291cnNlIG9mIGFuDQorICogYWN0aXZpdHkuICBJdCdzIGEgdGVtcG9yYXJ5IGNvbnRhaW5lciBmb3IgaW5jaWRlbnRzIGJlZm9yZSB0aGUgYWN0aXZpdHkgaXMgZGVlbWVkDQorICogY29tcGxldGUgYW5kIHN0b3JlZCBpbnRvIHdoYXRldmVyIHRoZSBsb25nLXRlcm0ge0BsaW5rIFN0b3JhZ2V9IGlzLiAgQQ0KKyAqIDxjb2RlPkhpc3Rvcnk8L2NvZGU+IHN0YXJ0cyBvdXQgd2l0aCBhdCBsZWFzdCBvbmUge0BsaW5rIEluY2lkZW50fSByZWNlaXZlZCBmcm9tDQorICogKHVzdWFsbHkgcmVtb3RlKSBwcm9jZXNzaW5nLiAgT3RoZXIgaW5jaWRlbnRzIGFycml2ZSB0aHJvdWdoIHtAbGluayAjYWRkSW5jaWRlbnR9IGFuZA0KKyAqIG11c3QgaGF2ZSB0aGUgc2FtZSBJRC4gIEV2ZW50dWFsbHksIG9uZSBvZiB0aG9zZSBpbmNpZGVudHMgd2lsbCBiZSBhbg0KKyAqIDxjb2RlPkFjdGl2aXR5U3RvcHBlZDwvY29kZT4gaW5jaWRlbnQsIHdoaWNoIHRoZW4gc2NoZWR1bGVzIHRoZSBIaXN0b3J5IHRvIGNvbW1pdA0KKyAqIGl0c2VsZi4NCisgKg0KKyAqIDxwPkl0IGRvZXNuJ3QgY29tbWl0IGl0c2VsZiByaWdodCBhd2F5IHRob3VnaDsgb3RoZXIgaW5jaWRlbnRzIG1heSBhcnJpdmUgdGhhdCBhcmUgcGFydA0KKyAqIG9mIHRoZSBhY3Rpdml0eSBvdXQgb2Ygb3JkZXIsIHNvIHRoZXJlJ3MgYSBkZWxheSBvZiB7QGxpbmsgI2Nsb3NlVGltZX0gbWlsbGlzZWNvbmRzDQorICogYmVmb3JlIGl0J3Mgc2VudCB0byB7QGxpbmsgU3RvcmFnZX0uICBPdGhlciBpbmNpZGVudHMgd2lsbCBiZSByZWNvcmRlZCBkdXJpbmcgdGhpcyBkZWxheS4NCisgKg0KKyAqIDxwPkl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZSA8Y29kZT5BY3Rpdml0eVN0b3BwZWQ8L2NvZGU+IGluY2lkZW50IG5ldmVyIGFycml2ZXMgZnJvbQ0KKyAqIHRoZSBwcm9jZXNzIHRoYXQgZGVlbXMgdGhlIGFjdGl2aXR5IHN0b3BwZWQuICBJbiB0aGF0IGNhc2UsIHRoZSBpZGxlIHRpbWVyICh3aGljaCBpcw0KKyAqIHJlc2V0IHdoZW5ldmVyIGFuIGluY2lkZW50IGFycml2ZXMpIGRldGVybWluZXMgd2hlbiB0byBwdXQgdGhlIDxjb2RlPkhpc3Rvcnk8L2NvZGU+DQorICogaW50byBpdHMgY29tbWl0YWwgc3RhdGUuICBUaGUgc3RvcCBjYW4gYXJyaXZlIGFmdGVyIHRoaXMgcG9pbnQgKGFuZCB3aWxsIGJlIHJlY29yZGVkKSwNCisgKiBidXQgaXQgb3RoZXJ3aXNlIGRvZXNuJ3QgYWZmZWN0IHRoZSBjb21taXQtdG8tY2xvc2UgdGltZS4NCisgKg0KKyAqIEBhdXRob3IgS2VsbHkNCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkDQorICovDQorZmluYWwgY2xhc3MgSGlzdG9yeSB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBIaXN0b3J5fSBpbnN0YW5jZS4NCisJICoNCisJICogQHBhcmFtIGluaXRpYWxJbmNpZGVudCBJbmNpZGVudCB3aGljaCBnaXZlcyB0aGUgaGlzdG9yeSBpdHMgSUQuDQorCSAqIEBwYXJhbSBzdG9yYWdlIFdoZXJlIHRvIHN0b3JlIHRoZSBpbmNpZGVudHMgd2hlbiB0aGUgaGlzdG9yeSdzIGRvbmUuDQorCSAqLw0KKwlIaXN0b3J5KEluY2lkZW50IGluaXRpYWxJbmNpZGVudCwgU3RvcmFnZSBzdG9yYWdlKSB7DQorCQlpZCA9IGluaXRpYWxJbmNpZGVudC5nZXRBY3Rpdml0eUlEKCk7DQorCQl0aGlzLnN0b3JhZ2UgPSBzdG9yYWdlOw0KKwkJaW5jaWRlbnRzLmFkZChpbml0aWFsSW5jaWRlbnQpOw0KKwkJc2NoZWR1bGVFeHBpcmF0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEFkZCBhbiBpbmNpZGVudCB0byB0aGlzIGhpc3RvcnkuDQorCSAqDQorCSAqIEBwYXJhbSBpbmNpZGVudCBhbiB7QGxpbmsgSW5jaWRlbnR9IHZhbHVlLg0KKwkgKi8NCisJc3luY2hyb25pemVkIHZvaWQgYWRkSW5jaWRlbnQoSW5jaWRlbnQgaW5jaWRlbnQpIHsNCisJCWlmICghaW5jaWRlbnQuZ2V0QWN0aXZpdHlJRCgpLmVxdWFscyhpZCkpDQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jaWRlbnQncyBhY3Rpdml0eSBJRCAiICsgaW5jaWRlbnQuZ2V0QWN0aXZpdHlJRCgpDQorCQkJCSsgIiBkb2Vzbid0IG1hdGNoIEhpc3RvcnkncyBJRCAiICsgaWQpOw0KKwkJaWYgKGluY2lkZW50cyA9PSBudWxsKSByZXR1cm47DQorCQlpbmNpZGVudHMuYWRkKGluY2lkZW50KTsNCisJCWlmIChleHBpcmVIaXN0b3J5VGFzayAhPSBudWxsKQ0KKwkJCWV4cGlyZUhpc3RvcnlUYXNrLmNhbmNlbCgpOw0KKwkJaWYgKGluY2lkZW50IGluc3RhbmNlb2YgQWN0aXZpdHlTdG9wcGVkKQ0KKwkJCWNvbW1pdCgpOw0KKwkJZWxzZSBpZiAoY2xvc2VIaXN0b3J5VGFzayA9PSBudWxsKQ0KKwkJCXNjaGVkdWxlRXhwaXJhdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDb21taXQgdGhpcyBoaXN0b3J5IGJ5IHN0YXJ0aW5nIHRoZSBjb21taXQtdG8tY2xvc2UgdGltZXIuDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgY29tbWl0KCkgew0KKwkJaWYgKGNsb3NlSGlzdG9yeVRhc2sgIT0gbnVsbCkgcmV0dXJuOw0KKwkJVElNRVIuc2NoZWR1bGUoY2xvc2VIaXN0b3J5VGFzayA9IG5ldyBDbG9zZUhpc3RvcnlUYXNrKCksIGNsb3NlVGltZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFNjaGVkdWxlIGV4cGlyYXRpb24gb2YgdGhpcyBoaXN0b3J5IGR1ZSB0byBpZGxlbmVzcy4NCisJICovDQorCXByaXZhdGUgdm9pZCBzY2hlZHVsZUV4cGlyYXRpb24oKSB7DQorCQlUSU1FUi5zY2hlZHVsZShleHBpcmVIaXN0b3J5VGFzayA9IG5ldyBFeHBpcmVIaXN0b3J5VGFzaygpLCBpZGxlVGltZSk7DQorCX0NCisNCisJLyoqDQorCSAqIENsb3NlIHRoaXMgaGlzdG9yeSBvdXQgYnkgc3RvcmluZyB0aGUgaW5jaWRlbnRzIHRvIGxvbmctdGVybSBzdG9yYWdlLg0KKwkgKi8NCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsNCisgCQlDb2xsZWN0aW9ucy5zb3J0KGluY2lkZW50cyk7DQorCQlzdG9yYWdlLnN0b3JlKGlkLCBpbmNpZGVudHMpOw0KKwkJaW5jaWRlbnRzID0gbnVsbDsNCisJfQ0KKw0KKwkvKiogSGlzdG9yeSdzIElELiAqLw0KKwlwcml2YXRlIFN0cmluZyBpZDsNCisNCisJLyoqIEluIHdoYXQgbG9uZy10ZXJtIHN0b3JhZ2UgdG8gc3RvcmUgaW5jaWRlbnRzLiAqLw0KKwlwcml2YXRlIFN0b3JhZ2Ugc3RvcmFnZTsNCisNCisJLyoqIFRpbWVyIHRhc2sgdGhhdCBleHBpcmVzIGFuIGlkbGUgaGlzdG9yeS4gIElmIG51bGwsIHRoaXMgaGlzdG9yeSBpcyBpbiBjb21taXQtdG8tY2xvc2Ugc3RhdGUuICovDQorCXByaXZhdGUgRXhwaXJlSGlzdG9yeVRhc2sgZXhwaXJlSGlzdG9yeVRhc2s7DQorDQorCS8qKiBUaW1lciB0YXNrIHRvIGNsb3NlIGEgaGlzdG9yeS4gIElmIG5vbm51bGwsIHRoaXMgaGlzdG9yeSBpcyBpbiBjb21taXQtdG8tY2xvc2Ugc3RhdGUuICovIA0KKwlwcml2YXRlIENsb3NlSGlzdG9yeVRhc2sgY2xvc2VIaXN0b3J5VGFzazsNCisNCisJLyoqIEluY2lkZW50cyB0byBzdG9yZS4gKi8NCisJcHJpdmF0ZSBMaXN0IGluY2lkZW50cyA9IG5ldyBBcnJheUxpc3QoKTsNCisNCisJLyoqDQorCSAqIFRpbWVyIHRhc2sgdGhhdCBleHBpcmVzIChjb21taXRzIGFuZCBjbG9zZXMpIGFuIGlkbGUgaGlzdG9yeS4NCisJICovDQorCXByaXZhdGUgY2xhc3MgRXhwaXJlSGlzdG9yeVRhc2sgZXh0ZW5kcyBUaW1lclRhc2sgew0KKwkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCXN5bmNocm9uaXplZCAoSGlzdG9yeS50aGlzKSB7DQorCQkJCS8vIENoZWNrIHRvIHNlZSBpZiBhIG5ldyBleHBpcmVIaXN0b3J5VGFzayBnb3QgZ2VuZXJhdGVkLg0KKwkJCQkvLyBJZiBpdCBkaWQsIGl0IG1lYW5zIGEgbmV3IGluY2lkZW50IGdvdCBsb2dnZWQgd2hpbGUgd2UNCisJCQkJLy8gd2VyZSBhYm91dCB0byBleHBpcmUgdGhlIGhpc3RvcnkuICBCdXQgaWYgdGhlIGhpc3Rvcnkncw0KKwkJCQkvLyBjdXJyZW50IGV4cGlyYXRpb24gdGFzayBpcyB0aGlzIHRhc2ssIHRoZW4gd2UncmUgY2xlYXINCisJCQkJLy8gdG8gY29tbWl0IHRoZSBoaXN0b3J5LCBhbmQgYW55IGluY2lkZW50cyB0aGF0IGFycml2ZQ0KKwkJCQkvLyB3b24ndCByZXNldCBpdC4NCisJCQkJaWYgKGV4cGlyZUhpc3RvcnlUYXNrID09IHRoaXMpIGNvbW1pdCgpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGltZXIgdGFzayB0aGF0IGdpdmVzIHRpbWUgZm9yIG1vcmUgaW5jaWRlbnRzIHRvIGFycml2ZSBiZWZvcmUgY2xvc2luZyBmb3JldmVyIGEgaGlzdG9yeS4NCisJICovDQorCXByaXZhdGUgY2xhc3MgQ2xvc2VIaXN0b3J5VGFzayBleHRlbmRzIFRpbWVyVGFzayB7DQorCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJY2xvc2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKiogT25seSB0aW1lciB3ZSdsbCBldmVyIG5lZWQuICovDQorIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lciBUSU1FUiA9IG5ldyBUaW1lcigvKmlzRGFlbW9uKi90cnVlKTsNCisNCisJLyoqIEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgb24gYW4gaWRsZSBoaXN0b3J5LiAqLw0KKwlzdGF0aWMgbG9uZyBpZGxlVGltZSA9IExvbmcuZ2V0TG9uZygib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuSGlzdG9yeS5pZGxlIiwgNSo2MCoxMDAwKS5sb25nVmFsdWUoKTsNCisNCisJLyoqIEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IHRvIGdpdmUgYSBoaXN0b3J5IGV4dHJhIHRpbWUgdG8gcmVjZWl2ZSBpbmNpZGVudHMgYmVmb3JlIHNhdmluZyBpdCB0byBzdG9yYWdlLiAqLw0KKwlzdGF0aWMgbG9uZyBjbG9zZVRpbWUgPSBMb25nLmdldExvbmcoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5Lkhpc3RvcnkuY2xvc2UiLCA1KjYwKjEwMDApLmxvbmdWYWx1ZSgpOw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9JbmNpZGVudC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvSW5jaWRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTUyOTNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvSW5jaWRlbnQuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5Ow0KKw0KK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCitpbXBvcnQgamF2YS51dGlsLkRhdGU7DQorDQorLyoqDQorICogQW4gaW5jaWRlbnQgc2lnbmlmaWVzIHNvbWUgb2NjdXJyZW5jZSB3aXRoaW4gYW4gYWN0aXZpdHkuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBJbmNpZGVudCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ29tcGFyYWJsZSB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBJbmNpZGVudH0gaW5zdGFuY2UsIHRpbWVzdGFtcGluZyBpdC4NCisJICovDQorCXB1YmxpYyBJbmNpZGVudCgpIHsNCisJCXRpbWUgPSBuZXcgRGF0ZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHZXQgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIGluY2lkZW50Lg0KKwkgKg0KKwkgKiBAcmV0dXJuIGEge0BsaW5rIERhdGV9IHZhbHVlLg0KKwkgKi8NCisJcHVibGljIERhdGUgZ2V0VGltZSgpIHsNCisJCXJldHVybiB0aW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHZXQgdGhlIElEIG9mIHRoZSBhY3Rpdml0eSB0byB3aGljaCB0aGUgaW5jaWRlbnQgYmVsb25ncy4NCisJICoNCisJICogQHJldHVybiBhIHtAbGluayBTdHJpbmd9IHZhbHVlLg0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUlEKCkgew0KKwkJcmV0dXJuIGlkOw0KKwl9DQorDQorCS8qKg0KKwkgKiBTZXQgdGhlIElEIG9mIHRoZSBhY3Rpdml0eSB0byB3aGljaCB0aGlzIGluY2lkZW50IGJlbG9uZ3MuDQorCSAqDQorCSAqIEBwYXJhbSBpZCBhIHtAbGluayBTdHJpbmd9IHZhbHVlLg0KKwkgKi8NCisJdm9pZCBzZXRBY3Rpdml0eUlEKFN0cmluZyBpZCkgew0KKwkJdGhpcy5pZCA9IGlkOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUd28gaW5jaWRlbnRzIGFyZSBlcXVhbCBpZiB0aGV5J3JlIHRoZSBzYW1lIG9iamVjdCwgb3IgaWYgdGhleSBib3RoIGhhdmUgdGhlDQorCSAqIGVxdWFsIHRpbWVzdGFtcHMgYW5kIGVpdGhlciBib3RoIHRoZWlyIElEcyBhcmUgbnVsbCBvciBhcmUgZXF1YWwuDQorCSAqDQorCSAqIEBwYXJhbSBvYmogYW4ge0BsaW5rIE9iamVjdH0gdmFsdWUuDQorCSAqIEByZXR1cm4gVHJ1ZSBpZiBpbmNpZGVudHMgYXJlIGVxdWFsLg0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCisJCWlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7DQorCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJbmNpZGVudCkpIHJldHVybiBmYWxzZTsNCisJCUluY2lkZW50IHJocyA9IChJbmNpZGVudCkgb2JqOw0KKwkJcmV0dXJuICgoaWQgPT0gbnVsbCAmJiByaHMuaWQgPT0gbnVsbCkgfHwgaWQuZXF1YWxzKHJocy5pZCkpICYmIHRpbWUuZXF1YWxzKHJocy50aW1lKTsNCisJfQ0KKw0KKwkvKioNCisJICogVHdvIGluY2lkZW50cyBjb21wYXJlIHdpdGggZWFjaCBvdGhlciBtb3N0bHkgYnkgdGhlaXIgdGltZXN0YW1wcw0KKwkgKg0KKwkgKiBAcGFyYW0gb2JqIGFuIHtAbGluayBPYmplY3R9IHZhbHVlLg0KKwkgKiBAcmV0dXJuIC0xIGlmIHRoaXMgb2JqZWN0IGlzIGxlc3MgdGhhbiA8dmFyPm9iajwvdmFyPiwgMCBpZiB0aGV5J3JlIGVxdWFsLA0KKwkgKiBvciAxIGlmIHRoaXMgb2JqZWN0IGlzIGdyZWF0ZXIgdGhhbiA8dmFyPm9iajwvdmFyPg0KKwkgKi8NCisJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaikgew0KKwkJSW5jaWRlbnQgcmhzID0gKEluY2lkZW50KSBvYmo7DQorCQlpbnQgaWRDb21wID0gaWQgPT0gbnVsbCAmJiByaHMuaWQgIT0gbnVsbD8gLTEgOiBpZCA9PSBudWxsICYmIHJocy5pZCA9PSBudWxsPyAwIDogaWQgIT0gbnVsbCAmJiByaHMuaWQgPT0gbnVsbD8gMQ0KKwkJCTogaWQuY29tcGFyZVRvKHJocy5pZCk7DQorCQlpZiAoaWRDb21wID09IDApDQorCQkJcmV0dXJuIHRpbWUuY29tcGFyZVRvKHJocy50aW1lKTsNCisJCWVsc2UNCisJCQlyZXR1cm4gaWRDb21wOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQorCX0NCisNCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisJCXJldHVybiB0aW1lLmhhc2hDb2RlKCkgXiAoaWQgPT0gbnVsbD8gMHhhYWFhYWFhYSA6IGlkLmhhc2hDb2RlKCkpOw0KKwl9DQorDQorCS8qKiBUaW1lc3RhbXAgb2YgdGhpcyBpbmNpZGVudC4gKi8NCisJcHJvdGVjdGVkIERhdGUgdGltZTsNCisNCisJLyoqIElEIG9mIHRoZSBhY3Rpdml0eSB0byB3aGljaCB0aGlzIGluY2lkZW50IGJlbG9uZ3MuICovDQorCXByaXZhdGUgU3RyaW5nIGlkOw0KKw0KKyAgICAgICAvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLw0KKyAgICAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgxMTkwNjE3OTU5NDQ5ODQ1ODFMOw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9OdWxsQWN0aXZpdHkuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L051bGxBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTE4NjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9OdWxsQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQorLyoqDQorICogQSBudWxsIGFjdGl2aXR5IGRvZXNuJ3QgcmVjb3JkIGFueSBpbmNpZGVudHMuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBOdWxsQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7DQorCS8qKg0KKwkgKiBJZ25vcmUgdGhlIGluY2lkZW50Lg0KKwkgKg0KKwkgKiBAcGFyYW0gaW5jaWRlbnQgSWdub3JlZC4NCisJICovDQorCXB1YmxpYyB2b2lkIHJlY29yZEluY2lkZW50KEluY2lkZW50IGluY2lkZW50KSB7fQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9OdWxsU3RvcmFnZS5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvTnVsbFN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYxMmZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvTnVsbFN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KKy8qKg0KKyAqIE51bGwgc3RvcmFnZSBkb2Vzbid0IHN0b3JlIGFueSB7QGxpbmsgSW5jaWRlbnR9cy4NCisgKg0KKyAqIEBhdXRob3IgS2VsbHkNCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkDQorICovDQorY2xhc3MgTnVsbFN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlIHsNCisJLyoqDQorCSAqIElnbm9yZSB0aGUgYWN0aXZpdHkgSUQgYW5kIHRoZSBsaXN0IG9mIHtAbGluayBJbmNpZGVudH1zLg0KKwkgKg0KKwkgKiBAcGFyYW0gaWQgSWdub3JlZCBhY3Rpdml0eSBJRC4NCisJICogQHBhcmFtIGluY2lkZW50cyBJZ25vcmVkIGluY2lkZW50cy4NCisJICovDQorCXB1YmxpYyB2b2lkIHN0b3JlKFN0cmluZyBpZCwgTGlzdCBpbmNpZGVudHMpIHt9DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1JldHJpZXZhbC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvUmV0cmlldmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlOTAyNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1JldHJpZXZhbC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eTsNCisNCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisvKioNCisgICBSZXRyaWV2YWwgaXMgYSB2ZWhpY2xlIGZvciBnZXR0aW5nIGFjdGl2aXRpZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgaW5jaWRlbnRzIGZyb20ge0BsaW5rIFN0b3JhZ2V9Lg0KKw0KKyAgIEBhdXRob3IgUy4gSGFyZG1hbg0KKyAgIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUmV0cmlldmFsIHsNCisNCisgICAvKioNCisgICAgICBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhY3Rpdml0aWVzLg0KKw0KKyAgICAgIEByZXR1cm4gQSBsaXN0IG9mIHtAbGluayBTdG9yZWRBY3Rpdml0eX0gY2xhc3Nlcy4NCisgICAgICBAdGhyb3dzIEFjdGl2aXR5RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIFN0b3JhZ2UuDQorICAgKi8NCisgICBMaXN0IHJldHJpZXZlKCkgdGhyb3dzIEFjdGl2aXR5RXhjZXB0aW9uOw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TUUxEYXRhYmFzZVJldHJpZXZhbC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvU1FMRGF0YWJhc2VSZXRyaWV2YWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDVjYjQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvU1FMRGF0YWJhc2VSZXRyaWV2YWwuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRyaXZlck1hbmFnZXI7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICAgPHA+VGhpcyBjbGFzcyBlbmFibGVzIHJldHJpZXZhbCBvZiBhY3Rpdml0eSBpbmNpZGVudHMgZnJvbSBqdXN0IGFib3V0CisgICBhbnkgZGF0YWJhc2UgbWFuYWdlbWVudCBzeXN0ZW0uIEl0IHNob3VsZCBzdXBwb3J0IE15U1FMLCBQb3N0Z3JlU1FMLAorICAgT3JhY2xlIGFuZCBTeWJhc2UuCisgICA8L3A+CisKKyAgIDxwPlRoaXMgY2xhc3MgdXNlcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICA8dWw+CisgICAgICA8bGk+PGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VSZXRyaWV2YWwuZHJpdmVyPC9jb2RlPjxicj4KKyAgICAgIE11c3QgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgY2xhc3MuIFNlZSB0aGUgZm9sbG93aW5nCisgICAgICBleGFtcGxlczoKKyAgICAgIDx1bD4KKyAgICAgICAgIDxsaT5jb20ubXlzcWwuamRiYy5Ecml2ZXI8L2xpPgorICAgICAgICAgPGxpPm9yZy5wb3N0Z3Jlc3FsLkRyaXZlcjwvbGk+CisgICAgICAgICA8bGk+b3JhY2xlLmpkYmMuZHJpdmVyLk9yYWNsZURyaXZlcjwvbGk+CisgICAgICAgICA8bGk+Y29tLnN5YmFzZS5qZGJjMi5qZGJjLlN5YkRyaXZlcjwvbGk+CisgICAgICA8L3VsPgorICAgICAgPC9saT4KKworICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LlNRTERhdGFiYXNlUmV0cmlldmFsLnVybDwvY29kZT48YnI+CisgICAgICBNdXN0IGNvbnRhaW4gdGhlIFVSTCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgdGFyZ2V0IGRhdGFiYXNlLiBTZWUgdGhlCisgICAgICBmb2xsb3dpbmcgZXhhbXBsZXM6CisgICAgICA8dWw+CisgICAgICAgICA8bGk+amRiYzpteXNxbDovL2hvc3Q6cG9ydC9kYXRhYmFzZTwvbGk+CisgICAgICAgICA8bGk+amRiYzpwb3N0Z3Jlc3FsOi8vaG9zdDpwb3J0L2RhdGFiYXNlPC9saT4KKyAgICAgICAgIDxsaT5qZGJjOm9yYWNsZTp0aGluOkBob3N0OnBvcnQ6ZGF0YWJhc2U8L2xpPgorICAgICAgICAgPGxpPmpkYmM6c3liYXNlOjpUZHM6aG9zdDpwb3J0L2RhdGFiYXNlPC9saT4KKyAgICAgIDwvdWw+CisgICAgICA8L2xpPgorCisgICAgICA8bGk+PGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VSZXRyaWV2YWwudXNlcjwvY29kZT48YnI+CisgICAgICBNdXN0IGNvbnRhaW4gdGhlIHVzZXIgbmFtZSBmb3IgdGhlIHRhcmdldCBkYXRhYmFzZS48L2xpPgorCisgICAgICA8bGk+PGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VSZXRyaWV2YWwucGFzc3dvcmQ8L2NvZGU+PGJyPgorICAgICAgTXVzdCBjb250YWluIHRoZSBwYXNzd29yZCBmb3IgdGhlIHRhcmdldCBkYXRhYmFzZS48L2xpPgorCisgICA8L3VsPgorICAgPC9wPgorCisgICA8cD5UaGlzIGNsYXNzIGV4cGVjdHMgdGhlIGZvbGxvd2luZyB0YWJsZSB0byBleGlzdCBpbiB0aGUgdGFyZ2V0CisgICBkYXRhYmFzZSAoZGF0YSB0eXBlcyB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2ZW5kb3IpOjxicj4KKyAgICAgIDxwcmU+CisgICAgICBjcmVhdGUgdGFibGUgaW5jaWRlbnRzICgKKyAgICAgICAgIGFjdGl2aXR5SUQgdmFyY2hhcigzMikgbm90IG51bGwsCisgICAgICAgICBjbGFzc05hbWUgdmFyY2hhcigyNTUpIG5vdCBudWxsLAorICAgICAgICAgb2NjdXJUaW1lIGJpZ2ludCBub3QgbnVsbCBkZWZhdWx0IDAsCisgICAgICAgICBkZXRhaWwgdGV4dCBudWxsLAorICAgICAgICAgcHJpbWFyeSBrZXkgKGFjdGl2aXR5SUQsIGNsYXNzTmFtZSwgb2NjdXJUaW1lKSkKKyAgICAgIDwvcHJlPgorICAgPC9wPgorCisgICBAYXV0aG9yIFMuIEhhcmRtYW4KKyAgIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyovCitwdWJsaWMgY2xhc3MgU1FMRGF0YWJhc2VSZXRyaWV2YWwgaW1wbGVtZW50cyBSZXRyaWV2YWwgeworCisgICAvKiogVGhlIGRhdGFiYXNlIGRyaXZlci4KKyAgICovCisgICBwcml2YXRlIFN0cmluZyBkcml2ZXI7CisKKyAgIC8qKiBUaGUgVVJMIGZvciB0aGUgZGF0YWJhc2UuCisgICAqLworICAgcHJpdmF0ZSBTdHJpbmcgdXJsOworCisgICAvKiogVGhlIHVzZXIgbmFtZSBmb3IgdGhlIGRhdGFiYXNlLgorICAgKi8KKyAgIHByaXZhdGUgU3RyaW5nIHVzZXI7CisKKyAgIC8qKiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIG5hbWUuCisgICAqLworICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7CisKKyAgIC8qKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICovCisgICBwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKworCisgICAvKioKKyAgICAgIFRoaXMgY29uc3RydWN0b3IgZ3JhYnMgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAqLworICAgcHVibGljIFNRTERhdGFiYXNlUmV0cmlldmFsKCkgeworCisgICAgICAvLyBHcmFiIHRoZSBwcm9wZXJ0aWVzIGFuZCBtYWtlIHN1cmUgdGhleSBhcmUgYWxsIHRoZXJlLgorICAgICAgZHJpdmVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5TUUxEYXRhYmFzZVJldHJpZXZhbC5kcml2ZXIiKTsKKyAgICAgIHVybCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VSZXRyaWV2YWwudXJsIik7CisgICAgICB1c2VyID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5TUUxEYXRhYmFzZVJldHJpZXZhbC51c2VyIik7CisgICAgICBwYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VSZXRyaWV2YWwucGFzc3dvcmQiKTsKKworICAgICAgaWYgKChkcml2ZXIgPT0gbnVsbCkgfHwgKHVybCA9PSBudWxsKSB8fCAodXNlciA9PSBudWxsKSB8fCAocGFzc3dvcmQgPT0gbnVsbCkpIHsKKyAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNRTERhdGFiYXNlUmV0cmlldmFsKCk6IFJlcXVpcmVkIHN5c3RlbSBwcm9wZXJ0aWVzIGBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5TUUxEYXRhYmFzZVJldHJpZXZhbC5bZHJpdmVyLHVybCx1c2VyLHBhc3N3b3JkXScgYXJlIG5vdCBjb21wbGV0ZWx5IGRlZmluZWQuIik7CisgICAgICB9CisgICB9CisKKworICAgLyoqCisgICAgICBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhY3Rpdml0aWVzLgorCisgICAgICBAcmV0dXJuIEEgbGlzdCBvZiB7QGxpbmsgU3RvcmVkQWN0aXZpdHl9IGNsYXNzZXMuCisgICAgICBAdGhyb3dzIEFjdGl2aXR5RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBvcGVuaW5nIG9yIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UuCisgICAqLworICAgcHVibGljIExpc3QgcmV0cmlldmUoKSB0aHJvd3MgQWN0aXZpdHlFeGNlcHRpb24geworCisgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgU3RhdGVtZW50IHN0bXQgPSBudWxsOworICAgICAgTGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICB0cnkgeworICAgICAgICAgY29ubiA9IG9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICBzdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgICAgIFN0cmluZyBzcWxDbWQgPSAiU0VMRUNUIGFjdGl2aXR5SUQsIGNsYXNzTmFtZSwgb2NjdXJUaW1lLCBkZXRhaWwgRlJPTSBpbmNpZGVudHMgT1JERVIgQlkgYWN0aXZpdHlJRCwgb2NjdXJUaW1lIjsKKyAgICAgICAgIFN0cmluZyBhY3Rpdml0eUlEID0gIiI7CisgICAgICAgICBTdG9yZWRBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7CisgICAgICAgICBSZXN1bHRTZXQgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeShzcWxDbWQpOworICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgIFN0cmluZyBjdXJyQWN0aXZpdHlJRCA9IHJzLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICBpZiAoIWFjdGl2aXR5SUQuZXF1YWxzKGN1cnJBY3Rpdml0eUlEKSkgeworICAgICAgICAgICAgICAgIGFjdGl2aXR5ID0gbmV3IFN0b3JlZEFjdGl2aXR5KGN1cnJBY3Rpdml0eUlEKTsKKyAgICAgICAgICAgICAgICBhY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgYWN0aXZpdHlJRCA9IGN1cnJBY3Rpdml0eUlEOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBhY3Rpdml0eS5hZGRJbmNpZGVudChuZXcgU3RvcmVkSW5jaWRlbnQocnMuZ2V0U3RyaW5nKDIpLCBycy5nZXRMb25nKDMpLCBycy5nZXRTdHJpbmcoNCkpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIChhY3Rpdml0aWVzKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBBY3Rpdml0eUV4Y2VwdGlvbigiU1FMRGF0YWJhc2VSZXRyaWV2YWwucmV0cmlldmUoKTogQW4gZXhjZXB0aW9uIG9jY3VycmVkIGxvY2F0aW5nIHRoZSBKREJDIGRyaXZlciBjbGFzcy4iLCBlKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IEFjdGl2aXR5RXhjZXB0aW9uKCJTUUxEYXRhYmFzZVJldHJpZXZhbC5yZXRyaWV2ZSgpOiBBbiBleGNlcHRpb24gb2NjdXJyZWQgb3BlbmluZyBvciBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLiIsIGUpOworICAgICAgfQorICAgICAgZmluYWxseSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgY29ubi5jbG9zZSgpOworICAgICAgICAgfQorICAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQorICAgICAgfQorICAgfQorCisKKyAgIC8qKgorICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisKKyAgICAgIEByZXR1cm5zIFRoZSBDb25uZWN0aW9uIG9iamVjdC4KKyAgICAgIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBJZiB0aGUgSkRCQyBkcml2ZXIgY2xhc3MgY2FuJ3QgYmUgbG9jYXRlZC4KKyAgICAgIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBvcGVuaW5nIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgKi8KKwlwcml2YXRlIENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgIENsYXNzLmZvck5hbWUoZHJpdmVyKTsKKyAgICAgIHJldHVybiAoRHJpdmVyTWFuYWdlci5nZXRDb25uZWN0aW9uKHVybCwgdXNlciwgcGFzc3dvcmQpKTsKKyAgIH0KKworCisgICAvKioKKyAgICAgIEV4ZWN1dGUgdGhlIFNRTERhdGFiYXNlUmV0cmlldmFsIGNsYXNzIHZpYSB0aGUgY29tbWFuZC1saW5lLgorCisgICAgICBUaGUgcHJvZ3JhbSBleGl0cyB3aXRoIHN0YXR1cyAwIG9uIHN1Y2Nlc3MsIDEgb24gZmFpbHVyZS4KKworICAgICAgQHBhcmFtIGFyZ3YgVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisgICAqLworICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgeworCisgICAgICB0cnkgeworICAgICAgICAgU1FMRGF0YWJhc2VSZXRyaWV2YWwgcmV0cmlldmFsID0gbmV3IFNRTERhdGFiYXNlUmV0cmlldmFsKCk7CisgICAgICAgICBMaXN0IGFjdGl2aXRpZXMgPSByZXRyaWV2YWwucmV0cmlldmUoKTsKKyAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdG9yZWRBY3Rpdml0eSBhY3Rpdml0eSA9IChTdG9yZWRBY3Rpdml0eSkgaS5uZXh0KCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjdGl2aXR5OiAiICsgYWN0aXZpdHkuZ2V0QWN0aXZpdHlJRCgpKTsKKyAgICAgICAgICAgIExpc3QgaW5jaWRlbnRzID0gYWN0aXZpdHkuZ2V0SW5jaWRlbnRzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBpbmNpZGVudHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICBTdG9yZWRJbmNpZGVudCBpbmNpZGVudCA9IChTdG9yZWRJbmNpZGVudCkgai5uZXh0KCk7CisgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEluY2lkZW50OiAiICsgaW5jaWRlbnQuZ2V0Q2xhc3NOYW1lKCkgKyAiLCAiICsgaW5jaWRlbnQuZ2V0T2NjdXJUaW1lKCkgKyAiLCAiICsgaW5jaWRlbnQuZ2V0RGV0YWlsKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICB9CisgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIiI7CisgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpICsgIiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uOiAiICsgY2F1c2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvU1FMRGF0YWJhc2VTdG9yYWdlLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TUUxEYXRhYmFzZVN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE2ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvU1FMRGF0YWJhc2VTdG9yYWdlLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5OworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLkRhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXI7CisKKy8qKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGVuYWJsZXMgc3RvcmFnZSBvZiBhY3Rpdml0eSBpbmNpZGVudHMgaW4ganVzdCBhYm91dCBhbnkgZGF0YWJhc2UKKyAqIG1hbmFnZW1lbnQgc3lzdGVtLiBJdCBzaG91bGQgc3VwcG9ydCBNeVNRTCwgUG9zdGdyZVNRTCwgT3JhY2xlIGFuZCBTeWJhc2UuCisgKiA8L3A+CisgKiAKKyAqIDxwPgorICogVGhpcyBjbGFzcyB1c2VzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5TUUxEYXRhYmFzZVN0b3JhZ2UuZHJpdmVyPC9jb2RlPjxicj4KKyAqIE11c3QgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgY2xhc3MuIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOgorICogPHVsPgorICogPGxpPmNvbS5teXNxbC5qZGJjLkRyaXZlcjwvbGk+CisgKiA8bGk+b3JnLnBvc3RncmVzcWwuRHJpdmVyPC9saT4KKyAqIDxsaT5vcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyPC9saT4KKyAqIDxsaT5jb20uc3liYXNlLmpkYmMyLmpkYmMuU3liRHJpdmVyPC9saT4KKyAqIDwvdWw+CisgKiA8L2xpPgorICogCisgKiA8bGk+PGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VTdG9yYWdlLnVybDwvY29kZT48YnI+CisgKiBNdXN0IGNvbnRhaW4gdGhlIFVSTCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgdGFyZ2V0IGRhdGFiYXNlLiBTZWUgdGhlIGZvbGxvd2luZworICogZXhhbXBsZXM6CisgKiA8dWw+CisgKiA8bGk+amRiYzpteXNxbDovL2hvc3Q6cG9ydC9kYXRhYmFzZTwvbGk+CisgKiA8bGk+amRiYzpwb3N0Z3Jlc3FsOi8vaG9zdDpwb3J0L2RhdGFiYXNlPC9saT4KKyAqIDxsaT5qZGJjOm9yYWNsZTp0aGluOkBob3N0OnBvcnQ6ZGF0YWJhc2U8L2xpPgorICogPGxpPmpkYmM6c3liYXNlOjpUZHM6aG9zdDpwb3J0L2RhdGFiYXNlPC9saT4KKyAqIDwvdWw+CisgKiA8L2xpPgorICogCisgKiA8bGk+PGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VTdG9yYWdlLnVzZXI8L2NvZGU+PGJyPgorICogTXVzdCBjb250YWluIHRoZSB1c2VyIG5hbWUgZm9yIHRoZSB0YXJnZXQgZGF0YWJhc2UuPC9saT4KKyAqIAorICogPGxpPjxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LlNRTERhdGFiYXNlU3RvcmFnZS5wYXNzd29yZDwvY29kZT4KKyAqIDxicj4KKyAqIE11c3QgY29udGFpbiB0aGUgcGFzc3dvcmQgZm9yIHRoZSB0YXJnZXQgZGF0YWJhc2UuPC9saT4KKyAqIAorICogPC91bD4KKyAqIDwvcD4KKyAqIAorICogPHA+CisgKiBUaGlzIGNsYXNzIGV4cGVjdHMgdGhlIGZvbGxvd2luZyB0YWJsZSB0byBleGlzdCBpbiB0aGUgdGFyZ2V0IGRhdGFiYXNlIChkYXRhCisgKiB0eXBlcyB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2ZW5kb3IpOjxicj4KKyAqIAorICogPHByZT4KKyAqIGNyZWF0ZSB0YWJsZSBpbmNpZGVudHMgKAorICogICAgICAgICAgYWN0aXZpdHlJRCB2YXJjaGFyKDMyKSBub3QgbnVsbCwKKyAqICAgICAgICAgIGNsYXNzTmFtZSB2YXJjaGFyKDI1NSkgbm90IG51bGwsCisgKiAgICAgICAgICBvY2N1clRpbWUgYmlnaW50IG5vdCBudWxsIGRlZmF1bHQgMCwKKyAqICAgICAgICAgIGRldGFpbCB0ZXh0IG51bGwsCisgKiAgICAgICAgICBwcmltYXJ5IGtleSAoYWN0aXZpdHlJRCwgY2xhc3NOYW1lLCBvY2N1clRpbWUpKQorICogPC9wcmU+CisgKiAKKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBTLiBIYXJkbWFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxEYXRhYmFzZVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlIHsKKworICAvKioKKyAgICogVGhlIGRhdGEgc291cmNlOworICAgKi8KKyAgcHJpdmF0ZSBEYXRhU291cmNlIGRzOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciBnaXZlbiBubyBhcmd1bWVudHMuCisgICAqIAorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGdyYWJzIHRoZSBuZWNlc3Nhcnkgc3lzdGVtIHByb3BlcnRpZXMgYW5kIG9wZW5zIHRoZQorICAgKiBkYXRhYmFzZSBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSB2YWx1ZXMuCisgICAqLworICBwdWJsaWMgU1FMRGF0YWJhc2VTdG9yYWdlKCkgeworCisgICAgLy8gR3JhYiB0aGUgcHJvcGVydGllcyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCB0aGVyZS4KKyAgICBTdHJpbmcgZHJpdmVyID0gU3lzdGVtCisgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VTdG9yYWdlLmRyaXZlciIpOworICAgIFN0cmluZyB1cmwgPSBTeXN0ZW0KKyAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5TUUxEYXRhYmFzZVN0b3JhZ2UudXJsIik7CisgICAgU3RyaW5nIHVzZXIgPSBTeXN0ZW0KKyAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5TUUxEYXRhYmFzZVN0b3JhZ2UudXNlciIpOworICAgIFN0cmluZyBwYXNzd29yZCA9IFN5c3RlbQorICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LlNRTERhdGFiYXNlU3RvcmFnZS5wYXNzd29yZCIpOworCisgICAgaWYgKChkcml2ZXIgPT0gbnVsbCkgfHwgKHVybCA9PSBudWxsKSB8fCAodXNlciA9PSBudWxsKQorICAgICAgICB8fCAocGFzc3dvcmQgPT0gbnVsbCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgIlNRTERhdGFiYXNlU3RvcmFnZSgpOiBSZXF1aXJlZCBzeXN0ZW0gcHJvcGVydGllcyBgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuU1FMRGF0YWJhc2VTdG9yYWdlLltkcml2ZXIsdXJsLHVzZXIscGFzc3dvcmRdJyBhcmUgbm90IGNvbXBsZXRlbHkgZGVmaW5lZC4iKTsKKyAgICB9CisKKyAgICB0aGlzLmRzID0gRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5idWlsZERhdGFTb3VyY2UodXNlciwgcGFzc3dvcmQsIGRyaXZlciwKKyAgICAgICAgdXJsKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBzdG9yZXMgdGhlIGxpc3Qgb2YgaW5jaWRlbnRzIGZvciB0aGUgYWN0aXZpdHkgaW4gdGhlIGRhdGFiYXNlCisgICAqIHRhYmxlIG5hbWVkICJpbmNpZGVudHMiLgorICAgKiAKKyAgICogQHBhcmFtIGlkCisgICAqICAgICAgICAgIFRoZSBhY3Rpdml0eSBpZGVudGlmaWVyLgorICAgKiBAcGFyYW0gaW5jaWRlbnRzCisgICAqICAgICAgICAgIEEgbGlzdCBvZiB7QGxpbmsgSW5jaWRlbnR9LgorICAgKi8KKyAgcHVibGljIHZvaWQgc3RvcmUoU3RyaW5nIGlkLCBMaXN0IGluY2lkZW50cykgeworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZHMuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2lkZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgSW5jaWRlbnQgaW5jaWRlbnQgPSAoSW5jaWRlbnQpIGkubmV4dCgpOworICAgICAgICBzdGF0ZW1lbnQKKyAgICAgICAgICAgIC5leGVjdXRlVXBkYXRlKCJpbnNlcnQgaW50byBpbmNpZGVudHMgKGFjdGl2aXR5SUQsIGNsYXNzTmFtZSwgb2NjdXJUaW1lLCBkZXRhaWwpIHZhbHVlcyAoJyIKKyAgICAgICAgICAgICAgICArIGlkCisgICAgICAgICAgICAgICAgKyAiJywgJyIKKyAgICAgICAgICAgICAgICArIGluY2lkZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiJywgIgorICAgICAgICAgICAgICAgICsgaW5jaWRlbnQuZ2V0VGltZSgpLmdldFRpbWUoKQorICAgICAgICAgICAgICAgICsgIiwgJyIKKyAgICAgICAgICAgICAgICArIGVzY2FwZVNpbmdsZVF1b3RlKGluY2lkZW50LnRvU3RyaW5nKCkpICsgIicpIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIKKyAgICAgICAgICAucHJpbnRsbigiU1FMRGF0YWJhc2VTdG9yYWdlLnN0b3JlKCk6IElnbm9yaW5nIGFuIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlIGluc2VydGluZyBhIHJvdyBpbnRvIHRoZSBkYXRhYmFzZS4gU3BlY2lmaWNhbGx5LCBleGNlcHRpb24gJyIKKyAgICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICsgIicgb2NjdXJyZWQgd2l0aCBtZXNzYWdlICciCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkgKyAiJyIpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGNsb3NlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICogCisgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAqICAgICAgICAgICBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgICovCisgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgdGhpcy5kcyA9IG51bGw7CisgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGVzY2FwZSBhbnkgc2luZ2xlIHF1b3RlcyBmb3VuZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGFuZAorICAgKiByZXR1cm4gdGhlIGVzY2FwZWQgc3RyaW5nLiBUaGlzIHdpbGwgcmVhZHkgdGhlIHN0cmluZyBmb3IgaW5zZXJ0aW9uIGludG8gYQorICAgKiBkYXRhYmFzZS4gVGhlIHNpbmdsZSBxdW90ZSBpcyBlc2NhcGVkIGJ5IGluc2VydGluZyBhbiBhZGRpdGlvbmFsIHNpbmdsZQorICAgKiBxdW90ZSBpbiBmcm9udCBvZiBpdCBpbiB0aGUgc3RyaW5nLiBJZiBzb21lIGNvbnNpZGVyYXRlIGRldmVsb3BlciBoYXMKKyAgICogYWxyZWFkeSBlc2NhcGVkIHRoZSBzaW5nbGUgcXVvdGVzIGluIHRoZSBpbnB1dCBzdHJpbmcsIHRoaXMgbWV0aG9kIHdpbGwKKyAgICogZXNzZW50aWFsbHkgZG8gbm90aGluZy4KKyAgICogCisgICAqIEBwYXJhbSBpbnB1dFN0cmluZworICAgKiAgICAgICAgICBUaGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQuCisgICAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlU2luZ2xlUXVvdGUoU3RyaW5nIGlucHV0U3RyaW5nKSB7CisgICAgaW50IGluZGV4ID0gaW5wdXRTdHJpbmcuaW5kZXhPZignXCcnKTsKKyAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgIHJldHVybiAoaW5wdXRTdHJpbmcpOworICAgIH0KKworICAgIFN0cmluZyBvdXRwdXRTdHJpbmcgPSBpbnB1dFN0cmluZzsKKyAgICB3aGlsZSAoaW5kZXggIT0gLTEpIHsKKworICAgICAgLy8gSWYgdGhlIHNpbmdsZSBxdW90ZSBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBvcgorICAgICAgLy8gdGhlIG5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbm90aGVyIHNpbmdsZSBxdW90ZSwgaW5zZXJ0IGEKKyAgICAgIC8vIHNpbmdsZSBxdW90ZSBpbiBmcm9udCBvZiB0aGUgY3VycmVudCBzaW5nbGUgcXVvdGUuCisgICAgICBpZiAoKGluZGV4ID09IChvdXRwdXRTdHJpbmcubGVuZ3RoKCkgLSAxKSkKKyAgICAgICAgICB8fCAob3V0cHV0U3RyaW5nLmNoYXJBdChpbmRleCArIDEpICE9ICdcJycpKSB7CisgICAgICAgIG91dHB1dFN0cmluZyA9IG91dHB1dFN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIiciCisgICAgICAgICAgICArIG91dHB1dFN0cmluZy5zdWJzdHJpbmcoaW5kZXgpOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBhcmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgY2hlY2sgZm9yIGFub3RoZXIKKyAgICAgIC8vIHNpbmdsZSBxdW90ZS4KKyAgICAgIGlmICgoaW5kZXggKyAyKSA8PSAob3V0cHV0U3RyaW5nLmxlbmd0aCgpIC0gMSkpIHsKKyAgICAgICAgaW5kZXggPSBvdXRwdXRTdHJpbmcuaW5kZXhPZignXCcnLCBpbmRleCArIDIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggPSAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChvdXRwdXRTdHJpbmcpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TdGFuZGFyZE91dHB1dFN0b3JhZ2UuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1N0YW5kYXJkT3V0cHV0U3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2NhYjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TdGFuZGFyZE91dHB1dFN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOw0KKw0KKy8qKg0KKyAqIFN0b3JhZ2UgdGhhdCBzZW5kcyBhY3Rpdml0eSByZXBvcnRzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgYXMgcGxhaW4gdGV4dC4NCisgKg0KKyAqIEBhdXRob3IgS2VsbHkNCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkDQorICovDQorcHVibGljIGNsYXNzIFN0YW5kYXJkT3V0cHV0U3RvcmFnZSBleHRlbmRzIFdyaXRlclN0b3JhZ2Ugew0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU3RhbmRhcmRPdXRwdXRTdG9yYWdlfSBpbnN0YW5jZS4NCisJICovDQorCXB1YmxpYyBTdGFuZGFyZE91dHB1dFN0b3JhZ2UoKSB7DQorCQlzdXBlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TdG9yYWdlLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3MzM4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1N0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KKy8qKg0KKyAqIEEgU3RvcmFnZSBpcyBhIHBsYWNlIHRvIHN0b3JlIGZvciB0aGUgbG9uZyB0ZXJtIHJlY29yZCBhbiBhY3Rpdml0eSBhbmQgdGhlIGluY2lkZW50cw0KKyAqIHRoYXQgZGVmaW5lIGl0Lg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2Ugew0KKwkvKioNCisJICogU3RvcmUgdGhlIGFjdGl2aXR5Lg0KKwkgKg0KKwkgKiBAcGFyYW0gaWQgQWN0aXZpdHkgSUQuDQorCSAqIEBwYXJhbSBpbmNpZGVudHMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIEluY2lkZW50fXMgdGhhdCBkZWZpbmVkIGl0Lg0KKwkgKi8NCisJdm9pZCBzdG9yZShTdHJpbmcgaWQsIExpc3QgaW5jaWRlbnRzKTsNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvU3RvcmVkQWN0aXZpdHkuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1N0b3JlZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNGIzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1N0b3JlZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICAgVGhpcyBjbGFzcyBob2xkcyBhbiBhY3Rpdml0eSByZXRyaWV2ZWQgZnJvbSBzdG9yYWdlLgorCisgICBAYXV0aG9yIFMuIEhhcmRtYW4KKyAgIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyAgIEBzZWUgU3RvcmVkSW5jaWRlbnQKKyovCitwdWJsaWMgY2xhc3MgU3RvcmVkQWN0aXZpdHkgeworCisgICAvKiogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBhY3Rpdml0eS4KKyAgICovCisgICBwcml2YXRlIFN0cmluZyBhY3Rpdml0eUlEOworCisgICAvKiogVGhlIGxpc3Qgb2YgaW5jaWRlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aXZpdHkuCisgICAqLworICAgcHJpdmF0ZSBMaXN0IGluY2lkZW50czsKKworCisgICAvKioKKyAgICAgIFRoaXMgY29udHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgYWN0aXZpdHkuCisKKyAgICAgIEBwYXJhbSBhY3Rpdml0eUlEIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgYWN0aXZpdHkuCisgICAqLworICAgcHVibGljIFN0b3JlZEFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlEKSB7CisgICAgICB0aGlzLmFjdGl2aXR5SUQgPSBhY3Rpdml0eUlEOworICAgICAgaW5jaWRlbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgfQorCisKKyAgIC8qKgorICAgICAgQWRkIGFuIGluY2lkZW50IHRvIHRoZSBsaXN0IG9mIGluY2lkZW50cy4KKworICAgICAgQHBhcmFtIGluY2lkZW50IFRoZSBTdG9yZWRJbmNpZGVudCBjbGFzcyB0byBhZGQgdG8gdGhlIGxpc3QuCisgICAqLworICAgcHVibGljIHZvaWQgYWRkSW5jaWRlbnQoU3RvcmVkSW5jaWRlbnQgaW5jaWRlbnQpIHsKKyAgICAgIGluY2lkZW50cy5hZGQoaW5jaWRlbnQpOworICAgfQorCisgICAvKioKKyAgICAgIFJldHVybiB0aGUgYWN0aXZpdHkgaWRlbnRpZmllci4KKworICAgICAgQHJldHVybiBUaGUgYWN0aXZpdHkgaWRlbnRpZmllci4KKyAgICovCisgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGl2aXR5SUQoKSB7CisgICAgICByZXR1cm4gKGFjdGl2aXR5SUQpOworICAgfQorCisKKyAgIC8qKgorICAgICAgUmV0dXJuIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgaW5jaWRlbnRzLgorCisgICAgICBAcmV0dXJuIFRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgaW5jaWRlbnRzLgorICAgKi8KKyAgIHB1YmxpYyBmaW5hbCBMaXN0IGdldEluY2lkZW50cygpIHsKKyAgICAgIHJldHVybiAoaW5jaWRlbnRzKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1N0b3JlZEluY2lkZW50LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TdG9yZWRJbmNpZGVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzI1NTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9TdG9yZWRJbmNpZGVudC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5OworCisKKy8qKgorICAgVGhpcyBjbGFzcyBob2xkcyBhbiBpbmNpZGVudCByZXRyaWV2ZWQgZnJvbSBzdG9yYWdlLgorCisgICBAYXV0aG9yIFMuIEhhcmRtYW4KKyAgIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyAgIEBzZWUgU3RvcmVkQWN0aXZpdHkKKyovCitwdWJsaWMgY2xhc3MgU3RvcmVkSW5jaWRlbnQgeworCisgICAvKiogVGhlIG5hbWUgb2YgdGhlIGluY2lkZW50IGNsYXNzLgorICAgKi8KKyAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgLyoqIFRoZSB0aW1lIHRoZSBpbmNpZGVudCBvY2N1cnJlZC4KKyAgICovCisgICBwcml2YXRlIGxvbmcgb2NjdXJUaW1lOworCisgICAvKiogRGV0YWlsZWQgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBpbmNpZGVudC4KKyAgICovCisgICBwcml2YXRlIFN0cmluZyBkZXRhaWw7CisKKworICAgLyoqCisgICAgICBUaGlzIGNvbnRydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIGluY2lkZW50LgorCisgICAgICBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBpbmNpZGVudCBjbGFzcy4KKyAgICAgIEBwYXJhbSBvY2N1clRpbWUgVGhlIHRpbWUgdGhlIGluY2lkZW50IG9jY3VycmVkLgorICAgICAgQHBhcmFtIGRldGFpbCBEZXRhaWxlZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGluY2lkZW50LgorICAgKi8KKyAgIHB1YmxpYyBTdG9yZWRJbmNpZGVudChTdHJpbmcgY2xhc3NOYW1lLCBsb25nIG9jY3VyVGltZSwgU3RyaW5nIGRldGFpbCkgeworICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICB0aGlzLm9jY3VyVGltZSA9IG9jY3VyVGltZTsKKyAgICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsOworICAgfQorCisKKyAgIC8qKgorICAgICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBpbmNpZGVudCBjbGFzcy4KKworICAgICAgQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgaW5jaWRlbnQgY2xhc3MuCisgICAqLworICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICByZXR1cm4gKGNsYXNzTmFtZSk7CisgICB9CisKKworICAgLyoqCisgICAgICBSZXR1cm4gdGhlIHRpbWUgdGhlIGluY2lkZW50IG9jY3VycmVkLgorCisgICAgICBAcmV0dXJuIFRoZSB0aW1lIHRoZSBpbmNpZGVudCBvY2N1cnJlZC4KKyAgICovCisgICBwdWJsaWMgZmluYWwgbG9uZyBnZXRPY2N1clRpbWUoKSB7CisgICAgICByZXR1cm4gKG9jY3VyVGltZSk7CisgICB9CisKKworICAgLyoqCisgICAgICBSZXR1cm4gdGhlIGRldGFpbGVkIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgaW5jaWRlbnQuCisKKyAgICAgIEByZXR1cm4gVGhlIGRldGFpbGVkIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgaW5jaWRlbnQuCisgICAqLworICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREZXRhaWwoKSB7CisgICAgICByZXR1cm4gKGRldGFpbCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9Xcml0ZXJTdG9yYWdlLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9Xcml0ZXJTdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjZmY5YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1dyaXRlclN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsNCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCisNCisvKioNCisgKiBTdG9yYWdlIHRoYXQgc2VuZHMgYWN0aXZpdHkgcmVwb3J0cyB0byBhIHtAbGluayBXcml0ZXJ9IGFzIHBsYWluIHRleHQuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXcml0ZXJTdG9yYWdlIGltcGxlbWVudHMgU3RvcmFnZSB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBXcml0ZXJTdG9yYWdlfSBpbnN0YW5jZS4NCisJICoNCisJICogQHBhcmFtIHdyaXRlciBXaGVyZSB0byB3cml0ZSBhY3Rpdml0eSByZXBvcnRzLg0KKwkgKi8NCisJcHJvdGVjdGVkIFdyaXRlclN0b3JhZ2UoV3JpdGVyIHdyaXRlcikgew0KKwkJdGhpcy53cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyLCAvKmF1dG9mbHVzaCovdHJ1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFdyaXRlIGEgbGluZSBvZiB0ZXh0IGZvciBhIHN0b3JlZCBhY3Rpdml0eS4NCisJICoNCisJICogVGhlIGZvcm1hdCBpcyA8Y29kZT48dmFyPmFjdGl2aXR5SUQ8L3Zhcj5bPHZhcj5pbmNpZGVudDwvdmFyPiw8dmFyPmluY2lkZW50PC92YXI+Li4uXTwvY29kZT4uDQorCSAqDQorCSAqIEBwYXJhbSBpZCBhIHtAbGluayBTdHJpbmd9IHZhbHVlLg0KKwkgKiBAcGFyYW0gaW5jaWRlbnRzIGEge0BsaW5rIExpc3R9IHZhbHVlLg0KKwkgKi8NCisJcHVibGljIHZvaWQgc3RvcmUoU3RyaW5nIGlkLCBMaXN0IGluY2lkZW50cykgew0KKwkJd3JpdGVyLnByaW50bG4oaWQgKyBpbmNpZGVudHMpOw0KKwl9DQorDQorCS8qKiBXaGVyZSB0byBzZW5kIHRoZSB0ZXh0LiAqLw0KKwlwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgd3JpdGVyOw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9YTUxTdGFuZGFyZE91dHB1dFN0b3JhZ2UuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1hNTFN0YW5kYXJkT3V0cHV0U3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDk4NzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9YTUxTdGFuZGFyZE91dHB1dFN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQorDQorLyoqDQorICogU2ltcGxlIHN0b3JhZ2UgdGhhdCB3cml0ZXMgWE1MIGRvY3VtZW50cyBkZXNjcmliaW5nIGFjdGl2aXRpZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4NCisgKg0KKyAqIEBhdXRob3IgS2VsbHkNCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkDQorICovDQorcHVibGljIGNsYXNzIFhNTFN0YW5kYXJkT3V0cHV0U3RvcmFnZSBleHRlbmRzIFhNTFN0b3JhZ2Ugew0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgWE1MU3RhbmRhcmRPdXRwdXRTdG9yYWdlfSBpbnN0YW5jZS4NCisJICovDQorCXB1YmxpYyBYTUxTdGFuZGFyZE91dHB1dFN0b3JhZ2UoKSB7DQorCQlzdXBlcigpOw0KKwkJZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChEb2N1bWVudCBkb2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorCQl0cnkgew0KKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KKwkJCURPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7DQorCQkJU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCk7DQorCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsNCisJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4KSB7DQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBUcmFuc2Zvcm1lckV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7DQorCQl9DQorCX0NCisNCisJLyoqIEZhY3RvcnkgZm9yIHRyYW5zZm9ybWVycyB0aGF0IHNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzIGludG8gcGxhaW4gdGV4dC4gKi8gDQorCXByaXZhdGUgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3Rvcnk7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1hNTFN0b3JhZ2UuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L1hNTFN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTcxYWMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvWE1MU3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eTsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsNCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCisNCisvKioNCisgKiBTdG9yYWdlIHRoYXQgc2F2ZXMgYWN0aXZpdGllcyBhcyBYTUwgZG9jdW1lbnRzLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MU3RvcmFnZSBpbXBsZW1lbnRzIFN0b3JhZ2Ugew0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgWE1MU3RvcmFnZX0gaW5zdGFuY2UuDQorCSAqLw0KKwlwcm90ZWN0ZWQgWE1MU3RvcmFnZSgpIHsNCisJCWZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQorCX0NCisNCisJcHVibGljIHZvaWQgc3RvcmUoU3RyaW5nIGlkLCBMaXN0IGluY2lkZW50cykgew0KKwkJdHJ5IHsNCisJCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQorCQkJRG9jdW1lbnQgZG9jID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOw0KKwkJCUVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJhY3Rpdml0eSIpOw0KKwkJCXJvb3Quc2V0QXR0cmlidXRlKCJpZCIsIGlkKTsNCisJCQlkb2MuYXBwZW5kQ2hpbGQocm9vdCk7DQorDQorCQkJZm9yIChJdGVyYXRvciBpID0gaW5jaWRlbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgew0KKwkJCQlJbmNpZGVudCBpbmNpZGVudCA9IChJbmNpZGVudCkgaS5uZXh0KCk7DQorCQkJCUVsZW1lbnQgZSA9IGRvYy5jcmVhdGVFbGVtZW50KGluY2lkZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCisJCQkJZS5zZXRBdHRyaWJ1dGUoInRpbWUiLCBTdHJpbmcudmFsdWVPZihpbmNpZGVudC5nZXRUaW1lKCkuZ2V0VGltZSgpKSk7DQorCQkJCWUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKGluY2lkZW50LnRvU3RyaW5nKCkpKTsNCisJCQkJcm9vdC5hcHBlbmRDaGlsZChlKTsNCisJCQl9DQorCQkJc2F2ZURvY3VtZW50KGRvYyk7DQorCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7DQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsNCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQorCQkJU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gc2F2ZSBhY3Rpdml0eSAiICsgaWQgKyAiIGR1ZSB0byAiICsgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiDQorCQkJCSsgZXguZ2V0TWVzc2FnZSgpKTsNCisJCQlleC5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogU2F2ZSBhIGNvbXBsZXRlZCBhY3Rpdml0eSByZWNvcmQuDQorCSAqDQorCSAqIEBwYXJhbSBkb2MgWE1MIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGFjdGl2aXR5J3MgaW5jaWRlbnRzLg0KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4NCisJICovDQorCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNhdmVEb2N1bWVudChEb2N1bWVudCBkb2MpIHRocm93cyBJT0V4Y2VwdGlvbjsNCisNCisJLyoqIEZhY3RvcnkgZm9yIGRvY3VtZW50IGJ1aWxkZXJzIHdoaWNoIHdlIHVzZSB0byBjcmVhdGUgWE1MIGRvY3VtZW50cy4gKi8NCisJcHJvdGVjdGVkIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeTsNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZGF0YWJhc2UvRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZGF0YWJhc2UvRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzBmNzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9kYXRhYmFzZS9EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuRHJpdmVyTWFuYWdlckNvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLlBvb2xhYmxlQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuUG9vbGluZ0RhdGFTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLnBvb2wuaW1wbC5HZW5lcmljT2JqZWN0UG9vbDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBjbGFzcyB0byBidWlsZCBkYXRhYmFzZSBjb25uZWN0aW9ucyBmcm9tIEpEQkMgaW5mb3JtYXRpb24uCisgKiA8L3A+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFTb3VyY2UgYnVpbGREYXRhU291cmNlKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcywKKyAgICAgICAgICAgIFN0cmluZyBkcml2ZXIsIFN0cmluZyB1cmwpIHsKKworICAgICAgICBEYXRhU291cmNlIGRzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShkcml2ZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgR2VuZXJpY09iamVjdFBvb2wgY29ubmVjdGlvblBvb2wgPSBuZXcgR2VuZXJpY09iamVjdFBvb2wobnVsbCk7CisgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5IGNvbm5lY3Rpb25GYWN0b3J5ID0gbmV3IERyaXZlck1hbmFnZXJDb25uZWN0aW9uRmFjdG9yeSgKKyAgICAgICAgICAgICAgICB1cmwsIHVzZXIsIHBhc3MpOworICAgICAgICBQb29sYWJsZUNvbm5lY3Rpb25GYWN0b3J5IHBvb2xhYmxlQ29ubmVjdGlvbkZhY3RvcnkgPSBuZXcgUG9vbGFibGVDb25uZWN0aW9uRmFjdG9yeSgKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uRmFjdG9yeSwgY29ubmVjdGlvblBvb2wsIG51bGwsIG51bGwsIGZhbHNlLCB0cnVlKTsKKworICAgICAgICBkcyA9IG5ldyBQb29saW5nRGF0YVNvdXJjZShjb25uZWN0aW9uUG9vbCk7CisKKyAgICAgICAgcmV0dXJuIGRzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZGF0YWJhc2UvU3FsU2NyaXB0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9kYXRhYmFzZS9TcWxTY3JpcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI3MjkzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZGF0YWJhc2UvU3FsU2NyaXB0LmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8qKgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQWJzdHJhY3QgbGF5ZXIgYXJvdW5kIGEgU1FMIHNjcmlwdAorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFNxbFNjcmlwdCB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgUVVFUllfRU5EUyA9ICc7JzsKKworICAgIHByaXZhdGUgRmlsZSBzY3JpcHQ7CisKKyAgICBwcml2YXRlIERhdGFTb3VyY2UgZHM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlQmF0Y2ggPSB0cnVlOworCisgICAgcHJpdmF0ZSBMaXN0IHN0YXRlbWVudExpc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgorICAgICAqLworCisgICAgcHVibGljIFNxbFNjcmlwdChTdHJpbmcgc2NyaXB0RmlsZU5hbWUsIERhdGFTb3VyY2UgZHMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzY3JpcHQgPSBuZXcgRmlsZShzY3JpcHRGaWxlTmFtZSk7CisgICAgICAgIHN0YXRlbWVudExpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRoaXMuZHMgPSBkczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJTcWxTY3JpcHQgW29wdGlvbnNdIDwvcGF0aC90by9zcWwvZmlsZT5cbiIKKyAgICAgICAgICAgICAgICArICItLXVzZXIgPHVzZXI+XG4iICsgIi0tcGFzcyA8cGFzcz5cbiIgKyAiLS11cmwgPGpkYmMgdXJsPlxuIgorICAgICAgICAgICAgICAgICsgIi0tZHJpdmVyIDxqYXZhIGNsYXNzIHNwZWM+XG4iOworCisgICAgICAgIFN0cmluZyB1c2VyID0gbnVsbCwgcGFzcyA9IG51bGwsIHVybCA9IG51bGwsIGRyaXZlciA9IG51bGw7CisgICAgICAgIFN0cmluZyBzcWxTY3JpcHRGaWxlUGF0aCA9IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdXNlciIpKSB7CisgICAgICAgICAgICAgICAgdXNlciA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tcGFzcyIpKSB7CisgICAgICAgICAgICAgICAgcGFzcyA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZHJpdmVyIikpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXIgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVybCIpKSB7CisgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmICghYXJnc1tpXS5zdGFydHNXaXRoKCItLSIpKSB7CisgICAgICAgICAgICAgICAgc3FsU2NyaXB0RmlsZVBhdGggPSBhcmdzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCB8fCBwYXNzID09IG51bGwgfHwgdXJsID09IG51bGwgfHwgZHJpdmVyID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBzcWxTY3JpcHRGaWxlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBEYXRhU291cmNlIGRzID0gRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5idWlsZERhdGFTb3VyY2UodXNlciwgcGFzcywKKyAgICAgICAgICAgICAgICBkcml2ZXIsIHVybCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNxbFNjcmlwdCBzcWxTY3JpcHQgPSBuZXcgU3FsU2NyaXB0KHNxbFNjcmlwdEZpbGVQYXRoLCBkcyk7CisgICAgICAgICAgICBzcWxTY3JpcHQubG9hZFNjcmlwdCgpOworICAgICAgICAgICAgc3FsU2NyaXB0LmV4ZWN1dGUoKTsKKworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjcmlwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzY3JpcHQpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHF1ZXJ5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYm9vbGVhbiBxdWVyeUVuZHMgPSBmYWxzZTsKKworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDb21tZW50KGxpbmUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBxdWVyeUVuZHMgPSBjaGVja1N0YXRlbWVudEVuZHMobGluZSk7CisgICAgICAgICAgICAgICAgcXVlcnkuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChxdWVyeUVuZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50TGlzdC5hZGQocXVlcnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVzZUJhdGNoKSB7CisgICAgICAgICAgICBkb0V4ZWN1dGVCYXRjaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudExpc3QgIT0gbnVsbCAmJiBzdGF0ZW1lbnRMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdGF0ZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3FsU3RhdGVtZW50ID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGRvRXhlY3V0ZUluZGl2aWR1YWwoc3FsU3RhdGVtZW50KTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VCYXRjaAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlQmF0Y2goKSB7CisgICAgICAgIHJldHVybiB1c2VCYXRjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdXNlQmF0Y2gKKyAgICAgKiAgICAgICAgICAgIHRoZSB1c2VCYXRjaCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VCYXRjaChib29sZWFuIHVzZUJhdGNoKSB7CisgICAgICAgIHRoaXMudXNlQmF0Y2ggPSB1c2VCYXRjaDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50KFN0cmluZyBsaW5lKSB7CisgICAgICAgIGlmICgobGluZSAhPSBudWxsKSAmJiAobGluZS5sZW5ndGgoKSA+IDApKQorICAgICAgICAgICAgcmV0dXJuIChsaW5lLmNoYXJBdCgwKSA9PSAnIycpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU3RhdGVtZW50RW5kcyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gKHMuaW5kZXhPZihRVUVSWV9FTkRTKSAhPSAtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvRXhlY3V0ZUluZGl2aWR1YWwoU3RyaW5nIHNxbCkgeworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRzLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKHNxbCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBleGVjdXRpbmcgU1FMOiBbIiArIHNxbAorICAgICAgICAgICAgICAgICAgICArICJdOiBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9FeGVjdXRlQmF0Y2goKSB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50TGlzdCAhPSBudWxsICYmIHN0YXRlbWVudExpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0YXRlbWVudExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcWxTdGF0ZW1lbnQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmFkZEJhdGNoKHNxbFN0YXRlbWVudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGVCYXRjaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dAorICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiRXhjZXB0aW9uIGV4ZWN1dGluZyBTUUwgYmF0Y2ggc3RhdGVtZW50OiBtZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZGF0ZS9EYXRlVXRpbHMuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2RhdGUvRGF0ZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4YTVlYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2RhdGUvRGF0ZVV0aWxzLmphdmEKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGF0ZVV0aWxzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBGb3JtYXRUeXBlIHsgVVRDX0ZPUk1BVCwgTE9DQUxfRk9STUFULCBUQUlfRk9STUFUIH07CisgICAgCisgICAgcHVibGljIHN0YXRpYyBDYWxlbmRhciB0YWk5M2Vwb2NoID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTMsIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgQ2FsZW5kYXIganVsaWFuRXBvY2ggPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk3MCwgR3JlZ29yaWFuQ2FsZW5kYXIuSkFOVUFSWSwgMSk7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCB1dGNGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICAgICAgICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCB0YWlGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICAgICAgICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBsb2NhbEZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAorICAgICAgICAgICAgInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NaIik7ICAgIAorICAgIAorICAgIHN0YXRpYyB7CisgICAgICAgIHV0Y0Zvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworICAgICAgICB0YWlGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGVudW0gSW5kZXhUeXBlIHsKKyAgICAgICAgREFURSgwKSwKKyAgICAgICAgTEVBUF9TRUNTKDEpOworICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBpbmRleDsKKyAgICAgICAgCisgICAgICAgIEluZGV4VHlwZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvL0luZm8gdGFrZW4gZnJvbSBmdHA6Ly9vY2VhbnMuZ3NmYy5uYXNhLmdvdi9DT01NT04vbGVhcHNlYy5kYXQKKyAgICBzdGF0aWMgbG9uZ1tdW10gZGF0ZUFuZExlYXBTZWNzID0geworICAgICAgICB7IDAgLCAxMCB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTcyLCBHcmVnb3JpYW5DYWxlbmRhci5KVUxZLCAgICAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDExIH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5NzMsIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMTIgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk3NCwgR3JlZ29yaWFuQ2FsZW5kYXIuSkFOVUFSWSwgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAxMyB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTc1LCBHcmVnb3JpYW5DYWxlbmRhci5KQU5VQVJZLCAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDE0IH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5NzYsIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMTUgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk3NywgR3JlZ29yaWFuQ2FsZW5kYXIuSkFOVUFSWSwgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAxNiB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTc4LCBHcmVnb3JpYW5DYWxlbmRhci5KQU5VQVJZLCAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDE3IH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5NzksIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMTggfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk4MCwgR3JlZ29yaWFuQ2FsZW5kYXIuSkFOVUFSWSwgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAxOSB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTgxLCBHcmVnb3JpYW5DYWxlbmRhci5KVUxZLCAgICAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDIwIH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5ODIsIEdyZWdvcmlhbkNhbGVuZGFyLkpVTFksICAgIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMjEgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk4MywgR3JlZ29yaWFuQ2FsZW5kYXIuSlVMWSwgICAgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAyMiB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTg1LCBHcmVnb3JpYW5DYWxlbmRhci5KVUxZLCAgICAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDIzIH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5ODgsIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMjQgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk5MCwgR3JlZ29yaWFuQ2FsZW5kYXIuSkFOVUFSWSwgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAyNSB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTkxLCBHcmVnb3JpYW5DYWxlbmRhci5KQU5VQVJZLCAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDI2IH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTIsIEdyZWdvcmlhbkNhbGVuZGFyLkpVTFksICAgIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMjcgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk5MywgR3JlZ29yaWFuQ2FsZW5kYXIuSlVMWSwgICAgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAyOCB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk0LCBHcmVnb3JpYW5DYWxlbmRhci5KVUxZLCAgICAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDI5IH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTYsIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMzAgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMTk5NywgR3JlZ29yaWFuQ2FsZW5kYXIuSlVMWSwgICAgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAzMSB9LAorICAgICAgICB7IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk5LCBHcmVnb3JpYW5DYWxlbmRhci5KQU5VQVJZLCAxKS5nZXRUaW1lSW5NaWxsaXMoKSAsIDMyIH0sCisgICAgICAgIHsgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDIwMDYsIEdyZWdvcmlhbkNhbGVuZGFyLkpBTlVBUlksIDEpLmdldFRpbWVJbk1pbGxpcygpICwgMzMgfSwKKyAgICAgICAgeyBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoMjAwOSwgR3JlZ29yaWFuQ2FsZW5kYXIuSkFOVUFSWSwgMSkuZ2V0VGltZUluTWlsbGlzKCkgLCAzNCB9LAorICAgIH07CisgICAgCisgICAgcHJpdmF0ZSBEYXRlVXRpbHMoKSB7fQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldExlYXBTZWNzRm9yRGF0ZShDYWxlbmRhciB1dGNDYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IHV0Y0NhbC5nZXRUaW1lSW5NaWxsaXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGRhdGVBbmRMZWFwU2Vjcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgaWYgKGRhdGVBbmRMZWFwU2Vjc1tpXVtJbmRleFR5cGUuREFURS5pbmRleF0gPCB0aW1lSW5NaWxsaXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIGRhdGVBbmRMZWFwU2Vjc1tpXVtJbmRleFR5cGUuTEVBUF9TRUNTLmluZGV4XTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBMZWFwIFNlY29uZCBmb3VuZCBmb3IgZ2l2ZW4gZGF0ZSEiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ2FsZW5kYXIgdG9UYWkoQ2FsZW5kYXIgY2FsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FsZW5kYXIgdGFpQ2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoY3JlYXRlVGFpVGltZVpvbmUoZ2V0TGVhcFNlY3NGb3JEYXRlKGNhbCkpKTsKKyAgICAgICAgdGFpQ2FsLnNldFRpbWVJbk1pbGxpcyhjYWwuZ2V0VGltZUluTWlsbGlzKCkgKyBnZXRMZWFwU2Vjc0ZvckRhdGUoY2FsKSAqIDEwMDApOworICAgICAgICByZXR1cm4gdGFpQ2FsOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ2FsZW5kYXIgdGFpVG9VdGMoQ2FsZW5kYXIgdGFpQ2FsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FsZW5kYXIgY2FsVXRjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKyAgICAgICAgY2FsVXRjLnNldFRpbWVJbk1pbGxpcyh0YWlDYWwuZ2V0VGltZUluTWlsbGlzKCkgLSB0YWlDYWwuZ2V0VGltZVpvbmUoKS5nZXRSYXdPZmZzZXQoKSk7CisgICAgICAgIHJldHVybiBjYWxVdGM7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIENhbGVuZGFyIHRhaVRvTG9jYWwoQ2FsZW5kYXIgdGFpQ2FsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRvTG9jYWwodGFpVG9VdGModGFpQ2FsKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ2FsZW5kYXIgdG9Mb2NhbChDYWxlbmRhciBjYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY2FsLmdldFRpbWVab25lKCkuZ2V0SUQoKS5lcXVhbHMoIlRBSSIpKSB7CisgICAgICAgICAgICByZXR1cm4gdGFpVG9Mb2NhbChjYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2FsZW5kYXIgY2FsTG9jYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgY2FsTG9jYWwuc2V0VGltZUluTWlsbGlzKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7CisgICAgICAgICAgICByZXR1cm4gY2FsTG9jYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDYWxlbmRhciB0b1V0YyhDYWxlbmRhciBjYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY2FsLmdldFRpbWVab25lKCkuZ2V0SUQoKS5lcXVhbHMoIlRBSSIpKSB7CisgICAgICAgICAgICByZXR1cm4gdGFpVG9VdGMoY2FsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENhbGVuZGFyIGNhbFV0YyA9IENhbGVuZGFyLmdldEluc3RhbmNlKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisgICAgICAgICAgICBjYWxVdGMuc2V0VGltZUluTWlsbGlzKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7CisgICAgICAgICAgICByZXR1cm4gY2FsVXRjOyAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgQ2FsZW5kYXIgZ2V0Q3VycmVudFV0Y1RpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRvVXRjKGdldEN1cnJlbnRMb2NhbFRpbWUoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgQ2FsZW5kYXIgZ2V0Q3VycmVudExvY2FsVGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBDYWxlbmRhciBnZXRDdXJyZW50VGFpVGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdG9UYWkoZ2V0Q3VycmVudFV0Y1RpbWUoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ3VzdG9tTG9jYWxGb3JtYXQoQ2FsZW5kYXIgY2FsLCBTdHJpbmcgZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpLmZvcm1hdChjYWwuZ2V0VGltZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoQ2FsZW5kYXIgY2FsKSB7CisgICAgICAgIFN0cmluZyB0aW1lWm9uZUlkID0gY2FsLmdldFRpbWVab25lKCkuZ2V0SUQoKTsKKyAgICAgICAgaWYgKHRpbWVab25lSWQuZXF1YWxzKCJVVEMiKSkgeworICAgICAgICAgICAgcmV0dXJuIHV0Y0Zvcm1hdC5mb3JtYXQoY2FsLmdldFRpbWUoKSk7CisgICAgICAgIH1lbHNlIGlmICh0aW1lWm9uZUlkLmVxdWFscygiVEFJIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWlGb3JtYXQuZm9ybWF0KGNhbC5nZXRUaW1lKCkpICsgIi0wMDAwIiAKKyAgICAgICAgICAgICAgICArIChjYWwuZ2V0VGltZVpvbmUoKS5nZXRSYXdPZmZzZXQoKSAvIDEwMDApOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbG9jYWxGb3JtYXQuZm9ybWF0KGNhbC5nZXRUaW1lKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENhbGVuZGFyIHRvTG9jYWxDdXN0b21Gb3JtYXRDYWxlbmRhcihTdHJpbmcgY2FsU3RyaW5nLCBTdHJpbmcgZm9ybWF0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBDYWxlbmRhciBsb2NhbENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGxvY2FsQ2FsLnNldFRpbWUobmV3IFNpbXBsZURhdGVGb3JtYXQoZm9ybWF0KS5wYXJzZShjYWxTdHJpbmcpKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsQ2FsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDYWxlbmRhciB0b0NhbGVuZGFyKFN0cmluZyBjYWxTdHJpbmcsIEZvcm1hdFR5cGUgZm9ybWF0VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0VHlwZSkgeworICAgICAgICAgICAgY2FzZSBMT0NBTF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgY2FsLnNldFRpbWVJbk1pbGxpcyhsb2NhbEZvcm1hdC5wYXJzZShjYWxTdHJpbmcpLmdldFRpbWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRBSV9GT1JNQVQ6CisgICAgICAgICAgICAgICAgY2FsLnNldFRpbWVab25lKGNyZWF0ZVRhaVRpbWVab25lKEludGVnZXIucGFyc2VJbnQoY2FsU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoY2FsU3RyaW5nLmxlbmd0aCgpIC0gMikpKSk7CisgICAgICAgICAgICAgICAgY2FsU3RyaW5nID0gY2FsU3RyaW5nLnN1YnN0cmluZygwLCBjYWxTdHJpbmcubGVuZ3RoKCkgLSA1KTsKKyAgICAgICAgICAgICAgICBjYWwuc2V0VGltZUluTWlsbGlzKHRhaUZvcm1hdC5wYXJzZShjYWxTdHJpbmcpLmdldFRpbWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVUQ19GT1JNQVQ6CisgICAgICAgICAgICAgICAgY2FsLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisgICAgICAgICAgICAgICAgY2FsLnNldFRpbWVJbk1pbGxpcyh1dGNGb3JtYXQucGFyc2UoY2FsU3RyaW5nKS5nZXRUaW1lKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjYWwuc2V0VGltZUluTWlsbGlzKGxvY2FsRm9ybWF0LnBhcnNlKGNhbFN0cmluZykuZ2V0VGltZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRUaW1lSW5TZWNzKENhbGVuZGFyIGNhbCwgQ2FsZW5kYXIgZXBvY2gpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0VGltZUluTWlsbGlzKGNhbCwgZXBvY2gpIC8gMTAwMC4wOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhkb3VibGUgc2Vjb25kcykgeworICAgICAgICByZXR1cm4gbmV3IERlY2ltYWxGb3JtYXQoIiMuMDAwIikuZm9ybWF0KHNlY29uZHMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VGltZUluTWlsbGlzKENhbGVuZGFyIGNhbCwgQ2FsZW5kYXIgZXBvY2gpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIGVwb2NoRGlmZkluTWlsbGk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaXhlcyBkYXRlIGNvbnZlcnNpb24gaXNzdWVzIHByZXZlbnRpbmcgdGVzdHMgcGFzc2luZyBpbiB0aGUgVUsgYnV0IHdvcmtpbmcgZWxzZXdoZXJlIGluIHRoZSB3b3JsZC4KKyAgICAgICAgICovCisgICAgICAgIGlmKGp1bGlhbkVwb2NoLmdldFRpbWVab25lKCkuZ2V0SUQoKS5lcXVhbHMoIkV1cm9wZS9Mb25kb24iKSl7CisgICAgICAgICAgICBlcG9jaERpZmZJbk1pbGxpID0gZXBvY2guZ2V0VGltZUluTWlsbGlzKCkgLSAoanVsaWFuRXBvY2guZ2V0VGltZUluTWlsbGlzKCkranVsaWFuRXBvY2guZ2V0VGltZVpvbmUoKS5nZXRPZmZzZXQoanVsaWFuRXBvY2guZ2V0VGltZUluTWlsbGlzKCkpKSA7CisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIGVwb2NoRGlmZkluTWlsbGkgPSBlcG9jaC5nZXRUaW1lSW5NaWxsaXMoKSAtIGp1bGlhbkVwb2NoLmdldFRpbWVJbk1pbGxpcygpIDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsLmdldFRpbWVab25lKCkuZ2V0SUQoKS5lcXVhbHMoIlRBSSIpKQorICAgICAgICAgICAgZXBvY2hEaWZmSW5NaWxsaSArPSBnZXRMZWFwU2Vjc0ZvckRhdGUoZXBvY2gpICogMTAwMDsKKyAgICAgICAgbG9uZyBtaWxsaXNlY29uZHMgPSBjYWwuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgICAgIHJldHVybiBtaWxsaXNlY29uZHMgLSBlcG9jaERpZmZJbk1pbGxpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBUaW1lWm9uZSBjcmVhdGVUYWlUaW1lWm9uZShpbnQgbGVhcFNlY3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUaW1lWm9uZShsZWFwU2VjcyAqIDEwMDAsICJUQUkiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENhbGVuZGFyIGN1clRpbWUgPSBnZXRDdXJyZW50TG9jYWxUaW1lKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBUaW1lOiAiICsgdG9TdHJpbmcodG9DYWxlbmRhcih0b1N0cmluZyh0b1RhaSh0b0NhbGVuZGFyKCIyMDA4LTAxLTIwVDE2OjI5OjU1LjAwMFoiLCAKKyAgICAgICAgICAgICAgICBGb3JtYXRUeXBlLlVUQ19GT1JNQVQpKSksIEZvcm1hdFR5cGUuVEFJX0ZPUk1BVCkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IExvY2FsIFRpbWU6ICIgKyB0b1N0cmluZyhjdXJUaW1lKSArICIgIiArIGN1clRpbWUuZ2V0VGltZUluTWlsbGlzKCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgVVRDIFRpbWU6ICIgKyB0b1N0cmluZygoY3VyVGltZSA9IHRvQ2FsZW5kYXIoIjIwMDgtMDEtMjBUMTY6Mjk6NTUuMDAwWiIsIAorICAgICAgICAgICAgICAgIEZvcm1hdFR5cGUuVVRDX0ZPUk1BVCkpKSArICIgIiArIHRvU3RyaW5nKGdldFRpbWVJblNlY3MoY3VyVGltZSwgdGFpOTNlcG9jaCkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IFRBSSBUaW1lOiAiICsgdG9TdHJpbmcoKGN1clRpbWUgPSB0b1RhaSh0b0NhbGVuZGFyKCIyMDA4LTAxLTIwVDE2OjI5OjU1LjAwMFoiLCAKKyAgICAgICAgICAgICAgICBGb3JtYXRUeXBlLlVUQ19GT1JNQVQpKSkpICsgIiAiICsgdG9TdHJpbmcoZ2V0VGltZUluU2VjcyhjdXJUaW1lLCB0YWk5M2Vwb2NoKSkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgVVRDIFRpbWU6ICIgKyB0b1N0cmluZyh0YWlUb1V0YyhjdXJUaW1lKSkpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2V4ZWMvRW52VXRpbGl0aWVzLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9leGVjL0VudlV0aWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDZlYWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9leGVjL0VudlV0aWxpdGllcy5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmV4ZWM7DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQoraW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCisNCisvKioNCisgKiBAYXV0aG9yIG1hdHRtYW5uDQorICogQGF1dGhvciBiZm9zdGVyDQorICogQGF1dGhvciBtc3RhcmNoDQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIA0KKyAqIDxwPg0KKyAqIEVudmlyb25tZW50IFV0aWxpdGllcyBmb3IgcmVhZGluZyB2YXJpYWJsZXMgYW5kIHNldHRpbmcgdGhlbSBhbmQgc3VjaC4NCisgKiA8L3A+Lg0KKyAqLw0KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbnZVdGlsaXRpZXMgew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihFbnZVdGlsaXRpZXMuY2xhc3MNCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsNCisNCisgICAgcHJpdmF0ZSBFbnZVdGlsaXRpZXMoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiRG9uJ3QgY29uc3RydWN0IHV0aWxpdHkgY2xhc3NlcyEiKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHBhcnRpY3VsYXIgbmFtZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgZnJvbSB0aGUgdXNlcidzDQorICAgICAqIHdvcmtpbmcgZW52aXJvbm1lbnQgdXNpbmcgdGhlIHtAbGluayAjZ2V0RW52KCl9IG1ldGhvZCB0byBncmFiIHRoYXQgZW52aXJvbm1lbnQuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gZW52VmFyTmFtZSBUaGUgbmFtZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcmV0dXJuLg0KKyAgICAgKiBAcmV0dXJuIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSwgYXMgYSBTdHJpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnYoU3RyaW5nIGVudlZhck5hbWUpIHsNCisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0ZW52KGVudlZhck5hbWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgYXMge0BsaW5rICNnZXRFbnZVc2luZ1dhaXRGb3IoKX0sDQorICAgICAqIGV4Y2VwdCBpdCB1c2VzIFN5c3RlbS5nZXRlbnYoKQ0KKyAgICAgKiANCisgICAgICogQHJldHVybiBUaGUgdXNlcidzIGN1cnJlbnQgZW52aXJvbm1lbnQsIGluIGEge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRFbnYoKSB7DQorICAgICAgICBQcm9wZXJ0aWVzIGVudlByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IFN5c3RlbS5nZXRlbnYoKS5lbnRyeVNldCgpKQ0KKyAgICAgICAgICAgIGVudlByb3BzLnNldFByb3BlcnR5KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsNCisgICAgICAgIHJldHVybiBlbnZQcm9wczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgZ3JhYnMgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgdXNpbmcgdGhlIExpbnV4IHNoZWxsIHByb2dyYW0NCisgICAgICogY2FsbGVkIDxjb2RlPmVudjwvY29kZT4uIFVuZm9ydHVuYXRlbHksIHRoaXMgbWV0aG9kIGFsc28gdXNlcw0KKyAgICAgKiB7QGxpbmsgUHJvY2VzcyN3YWl0Rm9yKCl9LCB3aGljaCBzZWVtcyB0byBoYW5nIHdoZW4gZm9sa3MgaGF2ZSB3ZWlyZA0KKyAgICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHN1Y2guDQorICAgICAqIA0KKyAgICAgKiBBIG1vcmUgYXBwcm9wcmlhdGUgbWV0aG9kIHRvIGNhbGwgaXMge0BsaW5rICNnZXRFbnYoKX0gYmVjYXVzZSBpdCB1c2VzDQorICAgICAqIHRoZSB7QGxpbmsgRXhlY0hlbHBlcn0gY2xhc3MsIHdoaWNoIHNlZW1zIHRvIGhhbmRsZSBwcm9jZXNzIHRlcm1pbmF0aW9uIGENCisgICAgICogYml0IG1vcmUgZWxlZ2FudGx5Lg0KKyAgICAgKiANCisgICAgICogQGRlcHJlY2F0ZWQNCisgICAgICogQHJldHVybiBBIHtAbGluayBQcm9wZXJpdGVzfSBvYmplY3QgY29udGFpbmluZyB0aGUgdXNlcidzIGN1cnJlbnQNCisgICAgICogICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0RW52VXNpbmdXYWl0Rm9yKCkgew0KKyAgICAgICAgU3RyaW5nIGNvbW1hbmRMaW5lID0gImVudiI7DQorDQorICAgICAgICBQcm9jZXNzIHAgPSBudWxsOw0KKyAgICAgICAgUHJvcGVydGllcyBlbnZQcm9wcyA9IG51bGw7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmRMaW5lKTsNCisgICAgICAgICAgICBpbnQgcmV0VmFsID0gcC53YWl0Rm9yKCk7DQorICAgICAgICAgICAgZW52UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOw0KKyAgICAgICAgICAgIGVudlByb3BzLmxvYWQocHJlUHJvY2Vzc0lucHV0U3RyZWFtKHAuZ2V0SW5wdXRTdHJlYW0oKSkpOw0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGV4ZWN1dGluZyBlbnYgY29tbWFuZDogTWVzc2FnZTogIg0KKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGlmIChwLmdldEVycm9yU3RyZWFtKCkgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHAuZ2V0RXJyb3JTdHJlYW0oKS5jbG9zZSgpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGlmIChwLmdldElucHV0U3RyZWFtKCkgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHAuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGlmIChwLmdldE91dHB1dFN0cmVhbSgpICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICBwLmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7DQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gZW52UHJvcHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbWV0aG9kIHR1cm5zIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gaW50byBhIFN0cmluZy4gTWV0aG9kIHRha2VuDQorICAgICAqIGZyb206PGJyPg0KKyAgICAgKiANCisgICAgICogPGENCisgICAgICogaHJlZj0iaHR0cDovL3NuaXBwZXRzLmR6b25lLmNvbS9wb3N0cy9zaG93LzU1NSI+aHR0cDovL3NuaXBwZXRzLmR6b25lLmNvbS9wb3N0cy9zaG93LzU1NTwvYT4uDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gaW4NCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIElucHV0U3RyZWFtfSB0byBTdHJpbmdpZnkuDQorICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29uc3RydWN0ZWQgZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfS4NCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2x1cnAoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVs0MDk2XTsNCisgICAgICAgIGZvciAoaW50IG47IChuID0gaW4ucmVhZChiKSkgIT0gLTE7KSB7DQorICAgICAgICAgICAgb3V0LmFwcGVuZChuZXcgU3RyaW5nKGIsIDAsIG4pKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIElucHV0U3RyZWFtIHByZVByb2Nlc3NJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykNCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIGJhc2ljYWxseSByZWFkIHRoaXMgc3Vja2VyIGludG8gYSBCdWZmZXJlZFJlYWRlcg0KKyAgICAgICAgLy8gbGluZSBieSBsaW5lLCBhbmQgcmVwbGFjZUFsbCBvbiBcIHdpdGggXFwNCisgICAgICAgIC8vIHNvIFxcXFwgd2l0aCBcXFxcXFxcXA0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOw0KKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOw0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisNCisgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgLy8gZml4IHRoZSBsaW5lDQorICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcXFxcXCIpOw0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZSArICJcbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7DQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgew0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZWFkZXIgPSBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWYudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9leGVjL0V4ZWNIZWxwZXIuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2V4ZWMvRXhlY0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTg5YjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9leGVjL0V4ZWNIZWxwZXIuamF2YQpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5leGVjOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgdGFrZW4gZnJvbSBTdGVwaGVuIE9zdGVybWlsbGVyJ3MgZXhhbXBsZSBhdDoKKyAqIGh0dHA6Ly9vc3Rlcm1pbGxlci5vcmcvdXRpbHMvRXhlY0hlbHBlci5qYXZhLmh0bWwKKyAqIAorICogSXQgcHJvdmlkZXMgc29tZSB1c2VmdWwgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIGFuZCByZWFkaW5nIGluIHRoZSBvdXRwdXQgb2YKKyAqIGEge0BsaW5rIFByb2Nlc3N9IHJlc3VsdGFudCBmcm9tIGEgY2FsbCB0byB7QGxpbmsgUnVudGltZSNnZXRSdW50aW1lKCl9CisgKiB3aXRob3V0IHVzaW5nIHRoZSB7QGxpbmsgUHJvY2VzcyN3YWl0Rm9yKCl9IG1ldGhvZCwgd2hpY2ggYXBwYXJlbnRseSBjYW4gaGFuZworICogb24gY2VydGFpbiB1bmRlcmx5aW5nIHN5c3RlbXMuCisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXhlY0hlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIGFuZAorICAgICAqIHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCisgICAgICogPHA+CisgICAgICogT3V0cHV0IGZyb20gdGhlIHByb2Nlc3MgaXMgZXhwZWN0ZWQgdG8gYmUgdGV4dCBpbiB0aGUgc3lzdGVtJ3MgZGVmYXVsdAorICAgICAqIGNoYXJhY3RlciBzZXQuCisgICAgICogPHA+CisgICAgICogTm8gaW5wdXQgaXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzIG9uIFNURElOLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWRhcnJheQorICAgICAqICAgICAgICAgICAgYXJyYXkgY29udGFpbmluZyB0aGUgY29tbWFuZCB0byBjYWxsIGFuZCBpdHMgYXJndW1lbnRzLgorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dGlvbiBpbiBhbiBFeGVjSGVscGVyIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzIGNoZWNrRXhlYyBtZXRob2QgZG9lc24ndAorICAgICAqICAgICAgICAgICAgIGFsbG93IGNyZWF0aW9uIG9mIGEgc3VicHJvY2Vzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY21kYXJyYXkgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY21kYXJyYXkgaXMgYW4gZW1wdHkgYXJyYXkgKGhhcyBsZW5ndGggMCkuCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeGVjSGVscGVyIGV4ZWMoU3RyaW5nW10gY21kYXJyYXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXhlY0hlbHBlcihSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZGFycmF5KSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIGFuZCBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzLCBhbmQKKyAgICAgKiB3YWl0cyBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoLgorICAgICAqIDxwPgorICAgICAqIE91dHB1dCBmcm9tIHRoZSBwcm9jZXNzIGlzIGV4cGVjdGVkIHRvIGJlIHRleHQgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQKKyAgICAgKiBjaGFyYWN0ZXIgc2V0LgorICAgICAqIDxwPgorICAgICAqIE5vIGlucHV0IGlzIHBhc3NlZCB0byB0aGUgcHJvY2VzcyBvbiBTVERJTi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY21kYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgdG8gY2FsbCBhbmQgaXRzIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gZW52cAorICAgICAqICAgICAgICAgICAgYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCBlbGVtZW50IG9mIHdoaWNoIGhhcyBlbnZpcm9ubWVudAorICAgICAqICAgICAgICAgICAgdmFyaWFibGUgc2V0dGluZ3MgaW4gZm9ybWF0IG5hbWU9dmFsdWUuCisgICAgICogQHJldHVybiBUaGUgcmVzdWx0cyBvZiB0aGUgZXhlY3V0aW9uIGluIGFuIEV4ZWNIZWxwZXIgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMgY2hlY2tFeGVjIG1ldGhvZCBkb2Vzbid0CisgICAgICogICAgICAgICAgICAgYWxsb3cgY3JlYXRpb24gb2YgYSBzdWJwcm9jZXNzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBjbWRhcnJheSBpcyBudWxsCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBjbWRhcnJheSBpcyBhbiBlbXB0eSBhcnJheSAoaGFzIGxlbmd0aCAwKS4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEV4ZWNIZWxwZXIgZXhlYyhTdHJpbmdbXSBjbWRhcnJheSwgU3RyaW5nW10gZW52cCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXhlY0hlbHBlcihSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZGFycmF5LCBlbnZwKSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIGFuZCBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzLCBhbmQKKyAgICAgKiB3YWl0cyBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoLgorICAgICAqIDxwPgorICAgICAqIE91dHB1dCBmcm9tIHRoZSBwcm9jZXNzIGlzIGV4cGVjdGVkIHRvIGJlIHRleHQgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQKKyAgICAgKiBjaGFyYWN0ZXIgc2V0LgorICAgICAqIDxwPgorICAgICAqIE5vIGlucHV0IGlzIHBhc3NlZCB0byB0aGUgcHJvY2VzcyBvbiBTVERJTi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY21kYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgdG8gY2FsbCBhbmQgaXRzIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gZW52cAorICAgICAqICAgICAgICAgICAgYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCBlbGVtZW50IG9mIHdoaWNoIGhhcyBlbnZpcm9ubWVudAorICAgICAqICAgICAgICAgICAgdmFyaWFibGUgc2V0dGluZ3MgaW4gZm9ybWF0IG5hbWU9dmFsdWUuCisgICAgICogQHBhcmFtIGRpcgorICAgICAqICAgICAgICAgICAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBzdWJwcm9jZXNzLCBvciBudWxsIGlmIHRoZQorICAgICAqICAgICAgICAgICAgc3VicHJvY2VzcyBzaG91bGQgaW5oZXJpdCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICogQHJldHVybiBUaGUgcmVzdWx0cyBvZiB0aGUgZXhlY3V0aW9uIGluIGFuIEV4ZWNIZWxwZXIgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMgY2hlY2tFeGVjIG1ldGhvZCBkb2Vzbid0CisgICAgICogICAgICAgICAgICAgYWxsb3cgY3JlYXRpb24gb2YgYSBzdWJwcm9jZXNzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBjbWRhcnJheSBpcyBudWxsCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBjbWRhcnJheSBpcyBhbiBlbXB0eSBhcnJheSAoaGFzIGxlbmd0aCAwKS4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEV4ZWNIZWxwZXIgZXhlYyhTdHJpbmdbXSBjbWRhcnJheSwgU3RyaW5nW10gZW52cCwgRmlsZSBkaXIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4ZWNIZWxwZXIoUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRhcnJheSwgZW52cCwgZGlyKSwKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIGFuZAorICAgICAqIHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCisgICAgICogPHA+CisgICAgICogTm8gaW5wdXQgaXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzIG9uIFNURElOLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWRhcnJheQorICAgICAqICAgICAgICAgICAgYXJyYXkgY29udGFpbmluZyB0aGUgY29tbWFuZCB0byBjYWxsIGFuZCBpdHMgYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBjaGFyc2V0CisgICAgICogICAgICAgICAgICBPdXRwdXQgZnJvbSB0aGUgZXhlY3V0ZWQgY29tbWFuZCBpcyBleHBlY3RlZCB0byBiZSBpbiB0aGlzCisgICAgICogICAgICAgICAgICBjaGFyYWN0ZXIgc2V0LgorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dGlvbiBpbiBhbiBFeGVjSGVscGVyIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzIGNoZWNrRXhlYyBtZXRob2QgZG9lc24ndAorICAgICAqICAgICAgICAgICAgIGFsbG93IGNyZWF0aW9uIG9mIGEgc3VicHJvY2Vzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY21kYXJyYXkgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY21kYXJyYXkgaXMgYW4gZW1wdHkgYXJyYXkgKGhhcyBsZW5ndGggMCkuCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeGVjSGVscGVyIGV4ZWMoU3RyaW5nW10gY21kYXJyYXksIFN0cmluZyBjaGFyc2V0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeGVjSGVscGVyKFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kYXJyYXkpLCBjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIGFuZAorICAgICAqIHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCisgICAgICogPHA+CisgICAgICogTm8gaW5wdXQgaXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzIG9uIFNURElOLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWRhcnJheQorICAgICAqICAgICAgICAgICAgYXJyYXkgY29udGFpbmluZyB0aGUgY29tbWFuZCB0byBjYWxsIGFuZCBpdHMgYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBlbnZwCisgICAgICogICAgICAgICAgICBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2ggaGFzIGVudmlyb25tZW50CisgICAgICogICAgICAgICAgICB2YXJpYWJsZSBzZXR0aW5ncyBpbiBmb3JtYXQgbmFtZT12YWx1ZS4KKyAgICAgKiBAcGFyYW0gY2hhcnNldAorICAgICAqICAgICAgICAgICAgT3V0cHV0IGZyb20gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhpcworICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyIHNldC4KKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRzIG9mIHRoZSBleGVjdXRpb24gaW4gYW4gRXhlY0hlbHBlciBvYmplY3QuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0cyBjaGVja0V4ZWMgbWV0aG9kIGRvZXNuJ3QKKyAgICAgKiAgICAgICAgICAgICBhbGxvdyBjcmVhdGlvbiBvZiBhIHN1YnByb2Nlc3MuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGNtZGFycmF5IGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGNtZGFycmF5IGlzIGFuIGVtcHR5IGFycmF5IChoYXMgbGVuZ3RoIDApLgorICAgICAqIAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXhlY0hlbHBlciBleGVjKFN0cmluZ1tdIGNtZGFycmF5LCBTdHJpbmdbXSBlbnZwLAorICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXhlY0hlbHBlcihSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZGFycmF5LCBlbnZwKSwKKyAgICAgICAgICAgICAgICBjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIGFuZAorICAgICAqIHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCisgICAgICogPHA+CisgICAgICogTm8gaW5wdXQgaXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzIG9uIFNURElOLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWRhcnJheQorICAgICAqICAgICAgICAgICAgYXJyYXkgY29udGFpbmluZyB0aGUgY29tbWFuZCB0byBjYWxsIGFuZCBpdHMgYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBlbnZwCisgICAgICogICAgICAgICAgICBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2ggaGFzIGVudmlyb25tZW50CisgICAgICogICAgICAgICAgICB2YXJpYWJsZSBzZXR0aW5ncyBpbiBmb3JtYXQgbmFtZT12YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGlyCisgICAgICogICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHN1YnByb2Nlc3MsIG9yIG51bGwgaWYgdGhlCisgICAgICogICAgICAgICAgICBzdWJwcm9jZXNzIHNob3VsZCBpbmhlcml0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gY2hhcnNldAorICAgICAqICAgICAgICAgICAgT3V0cHV0IGZyb20gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhpcworICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyIHNldC4KKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRzIG9mIHRoZSBleGVjdXRpb24gaW4gYW4gRXhlY0hlbHBlciBvYmplY3QuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0cyBjaGVja0V4ZWMgbWV0aG9kIGRvZXNuJ3QKKyAgICAgKiAgICAgICAgICAgICBhbGxvdyBjcmVhdGlvbiBvZiBhIHN1YnByb2Nlc3MuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGNtZGFycmF5IGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGNtZGFycmF5IGlzIGFuIGVtcHR5IGFycmF5IChoYXMgbGVuZ3RoIDApLgorICAgICAqIAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXhlY0hlbHBlciBleGVjKFN0cmluZ1tdIGNtZGFycmF5LCBTdHJpbmdbXSBlbnZwLCBGaWxlIGRpciwKKyAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4ZWNIZWxwZXIoUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRhcnJheSwgZW52cCwgZGlyKSwKKyAgICAgICAgICAgICAgICBjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgdXNpbmcgYSBzaGVsbC4gT24gd2luZG93cyB1c2VzIGNtZC5leGUgb3IKKyAgICAgKiBjb21tYW5kLmV4ZS4gT24gb3RoZXIgcGxhdGZvcm1zIGl0IHVzZXMgL2Jpbi9zaC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHNoZWxsIHNob3VsZCBiZSB1c2VkIHRvIGV4ZWN1dGUgY29tbWFuZHMgd2hlbiBmZWF0dXJlcyBzdWNoIGFzIGZpbGUKKyAgICAgKiByZWRpcmVjdGlvbiwgcGlwZXMsIGFyZ3VtZW50IHBhcnNpbmcgYXJlIGRlc2lyZWQuCisgICAgICogPHA+CisgICAgICogT3V0cHV0IGZyb20gdGhlIHByb2Nlc3MgaXMgZXhwZWN0ZWQgdG8gYmUgdGV4dCBpbiB0aGUgc3lzdGVtJ3MgZGVmYXVsdAorICAgICAqIGNoYXJhY3RlciBzZXQuCisgICAgICogPHA+CisgICAgICogTm8gaW5wdXQgaXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzIG9uIFNURElOLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb21tYW5kCisgICAgICogICAgICAgICAgICBTdHJpbmcgY29udGFpbmluZyBhIGNvbW1hbmQgdG8gYmUgcGFyc2VkIGJ5IHRoZSBzaGVsbCBhbmQKKyAgICAgKiAgICAgICAgICAgIGV4ZWN1dGVkLgorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dGlvbiBpbiBhbiBFeGVjSGVscGVyIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzIGNoZWNrRXhlYyBtZXRob2QgZG9lc24ndAorICAgICAqICAgICAgICAgICAgIGFsbG93IGNyZWF0aW9uIG9mIGEgc3VicHJvY2Vzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY29tbWFuZCBpcyBudWxsCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeGVjSGVscGVyIGV4ZWNVc2luZ1NoZWxsKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY1VzaW5nU2hlbGwoY29tbWFuZCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHVzaW5nIGEgc2hlbGwuIE9uIHdpbmRvd3MgdXNlcyBjbWQuZXhlIG9yCisgICAgICogY29tbWFuZC5leGUuIE9uIG90aGVyIHBsYXRmb3JtcyBpdCB1c2VzIC9iaW4vc2guCisgICAgICogPHA+CisgICAgICogQSBzaGVsbCBzaG91bGQgYmUgdXNlZCB0byBleGVjdXRlIGNvbW1hbmRzIHdoZW4gZmVhdHVyZXMgc3VjaCBhcyBmaWxlCisgICAgICogcmVkaXJlY3Rpb24sIHBpcGVzLCBhcmd1bWVudCBwYXJzaW5nIGFyZSBkZXNpcmVkLgorICAgICAqIDxwPgorICAgICAqIE5vIGlucHV0IGlzIHBhc3NlZCB0byB0aGUgcHJvY2VzcyBvbiBTVERJTi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tbWFuZAorICAgICAqICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5pbmcgYSBjb21tYW5kIHRvIGJlIHBhcnNlZCBieSB0aGUgc2hlbGwgYW5kCisgICAgICogICAgICAgICAgICBleGVjdXRlZC4KKyAgICAgKiBAcGFyYW0gY2hhcnNldAorICAgICAqICAgICAgICAgICAgT3V0cHV0IGZyb20gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhpcworICAgICAqICAgICAgICAgICAgY2hhcmFjdGVyIHNldC4KKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRzIG9mIHRoZSBleGVjdXRpb24gaW4gYW4gRXhlY0hlbHBlciBvYmplY3QuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0cyBjaGVja0V4ZWMgbWV0aG9kIGRvZXNuJ3QKKyAgICAgKiAgICAgICAgICAgICBhbGxvdyBjcmVhdGlvbiBvZiBhIHN1YnByb2Nlc3MuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIGNvbW1hbmQgaXMgbnVsbAorICAgICAqIAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXhlY0hlbHBlciBleGVjVXNpbmdTaGVsbChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIGNoYXJzZXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIFN0cmluZ1tdIGNtZGFycmF5OworICAgICAgICBTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKKyAgICAgICAgaWYgKG9zLmVxdWFscygiV2luZG93cyA5NSIpIHx8IG9zLmVxdWFscygiV2luZG93cyA5OCIpCisgICAgICAgICAgICAgICAgfHwgb3MuZXF1YWxzKCJXaW5kb3dzIE1FIikpIHsKKyAgICAgICAgICAgIGNtZGFycmF5ID0gbmV3IFN0cmluZ1tdIHsgImNvbW1hbmQuZXhlIiwgIi9DIiwgY29tbWFuZCB9OworICAgICAgICB9IGVsc2UgaWYgKG9zLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgeworICAgICAgICAgICAgY21kYXJyYXkgPSBuZXcgU3RyaW5nW10geyAiY21kLmV4ZSIsICIvQyIsIGNvbW1hbmQgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZGFycmF5ID0gbmV3IFN0cmluZ1tdIHsgIi9iaW4vc2giLCAiLWMiLCBjb21tYW5kIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBFeGVjSGVscGVyKFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kYXJyYXkpLCBjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGEgcHJvY2VzcywgcmVjb3JkIGl0cyBzdGFuZGFyZCBlcnJvciBhbmQgc3RhbmRhcmQgb3V0IHN0cmVhbXMsIHdhaXQKKyAgICAgKiBmb3IgaXQgdG8gZmluaXNoCisgICAgICogCisgICAgICogQHBhcmFtIHByb2Nlc3MKKyAgICAgKiAgICAgICAgICAgIHByb2Nlc3MgdG8gd2F0Y2gKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzIGNoZWNrRXhlYyBtZXRob2QgZG9lc24ndAorICAgICAqICAgICAgICAgICAgIGFsbG93IGNyZWF0aW9uIG9mIGEgc3VicHJvY2Vzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY21kYXJyYXkgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgY21kYXJyYXkgaXMgYW4gZW1wdHkgYXJyYXkgKGhhcyBsZW5ndGggMCkuCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHJpdmF0ZSBFeGVjSGVscGVyKFByb2Nlc3MgcHJvY2VzcywgU3RyaW5nIGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCXRyeSB7CisJICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQorCSAgICAgICAgUmVhZGVyIHN0ZG91dDsKKwkgICAgICAgIFJlYWRlciBzdGRlcnI7CisJCisJICAgICAgICBpZiAoY2hhcnNldCA9PSBudWxsKSB7CisJICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmUgdGltZSB0aGF0IHRoZSBzeXN0ZW0gY2hhcnNldCBpcyBhcHByb3ByaWF0ZSwKKwkgICAgICAgICAgICAvLyBkb24ndCBzcGVjaWZ5IGEgY2hhcmFjdGVyIHNldC4KKwkgICAgICAgICAgICBzdGRvdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKKwkgICAgICAgICAgICBzdGRlcnIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKKwkgICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgICAgc3Rkb3V0ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgY2hhcnNldCk7CisJICAgICAgICAgICAgc3RkZXJyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwgY2hhcnNldCk7CisJICAgICAgICB9CisJICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07CisJCisJICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKwkgICAgICAgIGJvb2xlYW4gc3Rkb3V0Y2xvc2VkID0gZmFsc2U7CisJICAgICAgICBib29sZWFuIHN0ZGVycmNsb3NlZCA9IGZhbHNlOworCSAgICAgICAgd2hpbGUgKCFkb25lKSB7CisJICAgICAgICAgICAgYm9vbGVhbiByZWFkU29tZXRoaW5nID0gZmFsc2U7CisJICAgICAgICAgICAgLy8gcmVhZCBmcm9tIHRoZSBwcm9jZXNzJ3Mgc3RhbmRhcmQgb3V0cHV0CisJICAgICAgICAgICAgaWYgKCFzdGRvdXRjbG9zZWQgJiYgc3Rkb3V0LnJlYWR5KCkpIHsKKwkgICAgICAgICAgICAgICAgcmVhZFNvbWV0aGluZyA9IHRydWU7CisJICAgICAgICAgICAgICAgIGludCByZWFkID0gc3Rkb3V0LnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgaWYgKHJlYWQgPCAwKSB7CisJICAgICAgICAgICAgICAgICAgICByZWFkU29tZXRoaW5nID0gdHJ1ZTsKKwkgICAgICAgICAgICAgICAgICAgIHN0ZG91dGNsb3NlZCA9IHRydWU7CisJICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZCA+IDApIHsKKwkgICAgICAgICAgICAgICAgICAgIHJlYWRTb21ldGhpbmcgPSB0cnVlOworCQkgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoYnVmZmVyLCAwLCByZWFkKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAvLyByZWFkIGZyb20gdGhlIHByb2Nlc3MncyBzdGFuZGFyZCBlcnJvcgorCSAgICAgICAgICAgIGlmICghc3RkZXJyY2xvc2VkICYmIHN0ZGVyci5yZWFkeSgpKSB7CisJICAgICAgICAgICAgICAgIGludCByZWFkID0gc3RkZXJyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgaWYgKHJlYWQgPCAwKSB7CisJICAgICAgICAgICAgICAgICAgICByZWFkU29tZXRoaW5nID0gdHJ1ZTsKKwkgICAgICAgICAgICAgICAgICAgIHN0ZGVycmNsb3NlZCA9IHRydWU7CisJICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZCA+IDApIHsKKwkgICAgICAgICAgICAgICAgICAgIHJlYWRTb21ldGhpbmcgPSB0cnVlOworCSAgICAgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKGJ1ZmZlciwgMCwgcmVhZCk7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGV4aXQgc3RhdHVzIG9ubHkgd2UgaGF2ZW4ndCByZWFkIGFueXRoaW5nLAorCSAgICAgICAgICAgIC8vIGlmIHNvbWV0aGluZyBoYXMgYmVlbiByZWFkLCB0aGUgcHJvY2VzcyBpcyBvYnZpb3VzbHkgbm90IGRlYWQKKwkgICAgICAgICAgICAvLyB5ZXQuCisJICAgICAgICAgICAgaWYgKCFyZWFkU29tZXRoaW5nKSB7CisJICAgICAgICAgICAgICAgIHRyeSB7CisJICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHByb2Nlc3MuZXhpdFZhbHVlKCk7CisJICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKwkgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGl0eCkgeworCSAgICAgICAgICAgICAgICAgICAgLy8gRXhpdCBzdGF0dXMgbm90IHJlYWR5IHlldC4KKwkgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgdGhlIHByb2Nlc3MgYSBsaXR0bGUgYnJlYXRoaW5nIHJvb20uCisJICAgICAgICAgICAgICAgICAgICB0cnkgeworCSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworCSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaXgpIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmRlc3Ryb3koKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludGVycnVwdGVkIC0gcHJvY2Vzc2VzIGtpbGxlZCIpOworCSAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorCQorCSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQudG9TdHJpbmcoKTsKKwkgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvci50b1N0cmluZygpOworICAgIAl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOworICAgIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQcm9jZXNzIGV4ZWMgZmFpbGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAJfWZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAlwcm9jZXNzLmdldEVycm9yU3RyZWFtKCkuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgIAlwcm9jZXNzLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAlwcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIGpvYiB0aGF0IHJhbi4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXQ7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG91dHB1dCBvZiB0aGUgam9iIHRoYXQgcmFuLgorICAgICAqIAorICAgICAqIEByZXR1cm4gRXZlcnl0aGluZyB0aGUgZXhlY3V0ZWQgcHJvY2VzcyB3cm90ZSB0byBpdHMgc3RhbmRhcmQgb3V0cHV0IGFzIGEKKyAgICAgKiAgICAgICAgIFN0cmluZy4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXJyb3Igb3V0cHV0IG9mIHRoZSBqb2IgdGhhdCByYW4uCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3I7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVycm9yIG91dHB1dCBvZiB0aGUgam9iIHRoYXQgcmFuLgorICAgICAqIAorICAgICAqIEByZXR1cm4gRXZlcnl0aGluZyB0aGUgZXhlY3V0ZWQgcHJvY2VzcyB3cm90ZSB0byBpdHMgc3RhbmRhcmQgZXJyb3IgYXMgYQorICAgICAqICAgICAgICAgU3RyaW5nLgorICAgICAqIAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBqb2IgdGhhdCByYW4uCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhdHVzOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIGpvYiB0aGF0IHJhbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGV4aXQgc3RhdHVzIG9mIHRoZSBleGVjdXRlZCBwcm9jZXNzLCBieSBjb252ZW50aW9uLCB0aGUgdmFsdWUgMAorICAgICAqICAgICAgICAgaW5kaWNhdGVzIG5vcm1hbCB0ZXJtaW5hdGlvbi4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9leGVjL0V4ZWNVdGlscy5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZXhlYy9FeGVjVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRiOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZXhlYy9FeGVjVXRpbHMuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmV4ZWM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uTG9nZ2VyT3V0cHV0U3RyZWFtOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgZXhlY3V0aW5nIHByb2dyYW1zLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXhlY1V0aWxzIHsKKworICAgcHJpdmF0ZSBFeGVjVXRpbHMoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiRG9uJ3QgY29uc3RydWN0IHV0aWxpdHkgY2xhc3NlcyEiKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRDb21tYW5kTGluZShTdHJpbmdbXSBhcmdzKSB7CisgICAgICBTdHJpbmdCdWZmZXIgY21kTGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY21kTGluZS5hcHBlbmQoYXJnc1tpXSk7CisgICAgICAgICAgICBjbWRMaW5lLmFwcGVuZCgiICIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gY21kTGluZS50b1N0cmluZygpOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIGludCBjYWxsUHJvZ3JhbShTdHJpbmcgY29tbWFuZExpbmUsIExvZ2dlciBsb2dnZXIpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIGNhbGxQcm9ncmFtKGNvbW1hbmRMaW5lLCBsb2dnZXIsIG51bGwpOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIGludCBjYWxsUHJvZ3JhbShTdHJpbmcgY29tbWFuZExpbmUsIE91dHB1dFN0cmVhbSBzdGRPdXRTdHJlYW0sCisgICAgICAgICBPdXRwdXRTdHJlYW0gc3RkRXJyU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIGNhbGxQcm9ncmFtKGNvbW1hbmRMaW5lLCBzdGRPdXRTdHJlYW0sIHN0ZEVyclN0cmVhbSwgbnVsbCk7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgaW50IGNhbGxQcm9ncmFtKFN0cmluZyBjb21tYW5kTGluZSwgTG9nZ2VyIGxvZ2dlciwgRmlsZSB3b3JrRGlyKQorICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIExvZ2dlck91dHB1dFN0cmVhbSBsb2dnZXJJbmZvU3RyZWFtID0gbnVsbDsKKyAgICAgIExvZ2dlck91dHB1dFN0cmVhbSBsb2dnZXJTZXZlcmVTdHJlYW0gPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgIHJldHVybiBjYWxsUHJvZ3JhbSgKKyAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgbG9nZ2VySW5mb1N0cmVhbSA9IG5ldyBMb2dnZXJPdXRwdXRTdHJlYW0obG9nZ2VyLCBMZXZlbC5JTkZPKSwKKyAgICAgICAgICAgICAgIGxvZ2dlclNldmVyZVN0cmVhbSA9IG5ldyBMb2dnZXJPdXRwdXRTdHJlYW0obG9nZ2VyLCBMZXZlbC5TRVZFUkUpLAorICAgICAgICAgICAgICAgd29ya0Rpcik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgIHRyeSB7IGxvZ2dlckluZm9TdHJlYW0uY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICB0cnkgeyBsb2dnZXJTZXZlcmVTdHJlYW0uY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgaW50IGNhbGxQcm9ncmFtKFN0cmluZyBjb21tYW5kTGluZSwgT3V0cHV0U3RyZWFtIHN0ZE91dFN0cmVhbSwKKyAgICAgICAgIE91dHB1dFN0cmVhbSBzdGRFcnJTdHJlYW0sIEZpbGUgd29ya0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIFByb2Nlc3MgcHJvZ1Byb2Nlc3MgPSBudWxsOworICAgICAgU3RyZWFtR29iYmxlciBlcnJvckdvYmJsZXIgPSBudWxsLCBvdXRwdXRHb2JibGVyID0gbnVsbDsKKyAgICAgIGludCByZXR1cm5WYWwgPSAtMTsKKyAgICAgIHRyeSB7CisgICAgICAgICBwcm9nUHJvY2VzcyA9ICh3b3JrRGlyID09IG51bGwpID8gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygKKyAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lKSA6IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZExpbmUsIG51bGwsCisgICAgICAgICAgICAgICB3b3JrRGlyKTsKKyAgICAgICAgIGVycm9yR29iYmxlciA9IG5ldyBTdHJlYW1Hb2JibGVyKHByb2dQcm9jZXNzLmdldEVycm9yU3RyZWFtKCksCisgICAgICAgICAgICAgICAiRVJST1IiLCBzdGRFcnJTdHJlYW0pOworICAgICAgICAgb3V0cHV0R29iYmxlciA9IG5ldyBTdHJlYW1Hb2JibGVyKHByb2dQcm9jZXNzLmdldElucHV0U3RyZWFtKCksCisgICAgICAgICAgICAgICAiT1VUUFVUIiwgc3RkT3V0U3RyZWFtKTsKKyAgICAgICAgIGVycm9yR29iYmxlci5zdGFydCgpOworICAgICAgICAgb3V0cHV0R29iYmxlci5zdGFydCgpOworICAgICAgICAgcmV0dXJuVmFsID0gcHJvZ1Byb2Nlc3Mud2FpdEZvcigpOworICAgICAgICAgcmV0dXJuIHJldHVyblZhbDsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gcnVuICciICsgY29tbWFuZExpbmUKKyAgICAgICAgICAgICAgICsgIicgLS0gcmV0dXJuIHZhbCA9ICIgKyByZXR1cm5WYWwgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgICBpZiAoZXJyb3JHb2JibGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVycm9yR29iYmxlci5zdG9wR29iYmxpbmdBbmREaWUoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChvdXRwdXRHb2JibGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dHB1dEdvYmJsZXIuc3RvcEdvYmJsaW5nQW5kRGllKCk7CisgICAgICAgICB9CisgICAgICAgICB0cnkgeyBwcm9nUHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgdHJ5IHsgcHJvZ1Byb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgIHRyeSB7IHByb2dQcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgfQorICAgfQorCisgICBwdWJsaWMgc3RhdGljIGludCBjYWxsUHJvZ3JhbShTdHJpbmcgY29tbWFuZExpbmUsIEZpbGUgd29ya0RpcikKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBQcm9jZXNzIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmRMaW5lLCBudWxsLCB3b3JrRGlyKTsKKyAgICAgIHJldHVybiBwcm9jZXNzUHJvZ3JhbShwKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBpbnQgY2FsbFByb2dyYW0oU3RyaW5nW10gYXJncywgRmlsZSB3b3JrRGlyKQorICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIFByb2Nlc3MgcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoYXJncywgbnVsbCwgd29ya0Rpcik7CisgICAgICByZXR1cm4gcHJvY2Vzc1Byb2dyYW0ocCk7CisgICB9CisKKyAgIHByaXZhdGUgc3RhdGljIGludCBwcm9jZXNzUHJvZ3JhbShQcm9jZXNzIHApIHsKKworICAgICAgU3RyZWFtR29iYmxlciBlcnJvckdvYmJsZXIgPSBuZXcgU3RyZWFtR29iYmxlcihwLmdldEVycm9yU3RyZWFtKCksCisgICAgICAgICAgICAiRVJST1IiLCBTeXN0ZW0uZXJyKTsKKworICAgICAgLy8gYW55IG91dHB1dD8KKyAgICAgIFN0cmVhbUdvYmJsZXIgb3V0cHV0R29iYmxlciA9IG5ldyBTdHJlYW1Hb2JibGVyKHAuZ2V0SW5wdXRTdHJlYW0oKSwKKyAgICAgICAgICAgICJPVVRQVVQiLCBTeXN0ZW0ub3V0KTsKKworICAgICAgZXJyb3JHb2JibGVyLnN0YXJ0KCk7CisgICAgICBvdXRwdXRHb2JibGVyLnN0YXJ0KCk7CisgICAgICBpbnQgcmV0VmFsID0gLTE7CisgICAgICB0cnkgeworICAgICAgICAgcmV0VmFsID0gcC53YWl0Rm9yKCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAvLyBmaXJzdCBzdG9wIHRoZSB0aHJlYWRzCisgICAgICAgICBpZiAob3V0cHV0R29iYmxlciAhPSBudWxsICYmIG91dHB1dEdvYmJsZXIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICBvdXRwdXRHb2JibGVyLnN0b3BHb2JibGluZ0FuZERpZSgpOworICAgICAgICAgICAgb3V0cHV0R29iYmxlciA9IG51bGw7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChlcnJvckdvYmJsZXIgIT0gbnVsbCAmJiBlcnJvckdvYmJsZXIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICBlcnJvckdvYmJsZXIuc3RvcEdvYmJsaW5nQW5kRGllKCk7CisgICAgICAgICAgICBlcnJvckdvYmJsZXIgPSBudWxsOworICAgICAgICAgfQorCisgICAgICAgICB0cnkgeyBwLmdldEVycm9yU3RyZWFtKCkuY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgIHRyeSB7IHAuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgIHRyeSB7IHAuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOyB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7fQorICAgICAgfQorICAgICAgcmV0dXJuIHJldFZhbDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2V4ZWMvU3RyZWFtR29iYmxlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZXhlYy9TdHJlYW1Hb2JibGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3YzgyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2V4ZWMvU3RyZWFtR29iYmxlci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYzsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+VGhpcyBjbGFzcyBpcyBhIFV0aWxpdHkgY2xhc3MgZm9yIGRlYWxpbmcgd2l0aCBqYXZhIDxjb2RlPlByb2Nlc3M8L2NvZGU+IHN0cmVhbXMuIEl0IHdhcworICogdGFrZW4gZnJvbSB0aGUgc2l0ZTogCisgKiA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTEyLTIwMDAvanctMTIyOS10cmFwcy5odG1sIj5odHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTEyLTIwMDAvanctMTIyOS10cmFwcy5odG1sPC9hPiwgCisgKiBhbmQgd2FzIHdyaXR0ZW4gYnkgTWljaGFlbCBEYWNvbnRhLjwvcD4KKyAqCisgKi8KKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1Hb2JibGVyIGV4dGVuZHMgVGhyZWFkIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihTdHJlYW1Hb2JibGVyLmNsYXNzLmdldE5hbWUoKSk7CisJCisgICAgSW5wdXRTdHJlYW0gaXM7CisKKyAgICBTdHJpbmcgdHlwZTsKKworICAgIE91dHB1dFN0cmVhbSBvczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBydW5uaW5nID0gdHJ1ZTsKKworICAgIHB1YmxpYyBTdHJlYW1Hb2JibGVyKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzKGlzLCB0eXBlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyZWFtR29iYmxlcihJbnB1dFN0cmVhbSBpcywgU3RyaW5nIHR5cGUsIE91dHB1dFN0cmVhbSByZWRpcmVjdCkgeworICAgICAgICB0aGlzLmlzID0gaXM7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMub3MgPSByZWRpcmVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG51bGw7CisgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwdyA9IG5ldyBQcmludFdyaXRlcihvcyk7CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCAmJiB0aGlzLnJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbih0aGlzLnR5cGUgKyAiOiAiICsgbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgCUxPRy5sb2coTGV2ZWwuRklORVNULCAiU3RyZWFtR29iYmxlciBmYWlsZWQgd2hpbGUgZ29iYmxpbmcgOiAiICsgaW9lLmdldE1lc3NhZ2UoKSwgaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3BHb2JibGluZ0FuZERpZSgpIHsKKyAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZmlsdGVyL09iamVjdFRpbWVFdmVudC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZmlsdGVyL09iamVjdFRpbWVFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTk4MjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9maWx0ZXIvT2JqZWN0VGltZUV2ZW50LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5maWx0ZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5BIHtAbGluayBUaW1lRXZlbnR9IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIge0BsaW5rIE9iamVjdH08L3A+LgorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0VGltZUV2ZW50PG9ialR5cGU+IGV4dGVuZHMgVGltZUV2ZW50IHsKKworICAgIHByaXZhdGUgb2JqVHlwZSB0aW1lT2JqOworCisgICAgcHVibGljIE9iamVjdFRpbWVFdmVudChsb25nIHN0YXJ0VGltZSwgbG9uZyBlbmRUaW1lLCBvYmpUeXBlIHRpbWVPYmopIHsKKyAgICAgICAgc3VwZXIoc3RhcnRUaW1lLCBlbmRUaW1lKTsKKyAgICAgICAgdGhpcy50aW1lT2JqID0gdGltZU9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0VGltZUV2ZW50KGxvbmcgc3RhcnRUaW1lLCBsb25nIGVuZFRpbWUsIGRvdWJsZSBwcmlvcml0eSwKKyAgICAgICAgICAgIG9ialR5cGUgdGltZU9iaikgeworICAgICAgICBzdXBlcihzdGFydFRpbWUsIGVuZFRpbWUsIHByaW9yaXR5KTsKKyAgICAgICAgdGhpcy50aW1lT2JqID0gdGltZU9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgb2JqVHlwZSBnZXRUaW1lT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gdGhpcy50aW1lT2JqOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RUaW1lRXZlbnQpIHsKKyAgICAgICAgICAgIE9iamVjdFRpbWVFdmVudDw/PiBvdGUgPSAoT2JqZWN0VGltZUV2ZW50PD8+KSBvYmo7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgJiYgdGhpcy50aW1lT2JqLmVxdWFscyhvdGUudGltZU9iaik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgLSAiICsgdGltZU9iajsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2ZpbHRlci9UaW1lRXZlbnQuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2ZpbHRlci9UaW1lRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODYzNDRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZmlsdGVyL1RpbWVFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmZpbHRlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgYmFzaXMgZm9yIHRpbWUtYmFzZWQgcXVlcmllcyByZXN1bHRzIG92ZXIgYSBzdGFydC9lbmQgZGF0ZXRpbWUgd2l0aAorICogYSBkdXJhdGlvbgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRpbWVFdmVudCBpbXBsZW1lbnRzIENvbXBhcmFibGU8VGltZUV2ZW50PiB7CisKKyAgICBwcm90ZWN0ZWQgbG9uZyBzdGFydFRpbWUsIGVuZFRpbWUsIGR1cjsKKworICAgIHByb3RlY3RlZCBkb3VibGUgcHJpb3JpdHk7CisKKyAgICBwdWJsaWMgVGltZUV2ZW50KGxvbmcgc3RhcnRUaW1lLCBsb25nIGVuZFRpbWUpIHsKKyAgICAgICAgdGhpcyhzdGFydFRpbWUsIGVuZFRpbWUsIDApOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lRXZlbnQobG9uZyBzdGFydFRpbWUsIGxvbmcgZW5kVGltZSwgZG91YmxlIHByaW9yaXR5KSB7CisgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOworICAgICAgICB0aGlzLmVuZFRpbWUgPSBlbmRUaW1lOworICAgICAgICB0aGlzLmR1ciA9IHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOworICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoZG91YmxlIHByaW9yaXR5KSB7CisgICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFByaW9yaXR5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcmlvcml0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRFbmRUaW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbmRUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kdXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRpbWVFdmVudCkgeworICAgICAgICAgICAgVGltZUV2ZW50IHRlID0gKFRpbWVFdmVudCkgb2JqOworICAgICAgICAgICAgcmV0dXJuIHRlLnN0YXJ0VGltZSA9PSB0aGlzLnN0YXJ0VGltZSAmJiB0ZS5lbmRUaW1lID09IHRoaXMuZW5kVGltZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJbIiArIHRoaXMuc3RhcnRUaW1lICsgIiwiICsgdGhpcy5lbmRUaW1lICsgIl0gLSAiCisgICAgICAgICAgICAgICAgKyB0aGlzLnByaW9yaXR5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFwcGVuQXRTYW1lVGltZShUaW1lRXZlbnQgdGUxLCBUaW1lRXZlbnQgdGUyKSB7CisgICAgICAgIHJldHVybiB0ZTEuZ2V0U3RhcnRUaW1lKCkgPT0gdGUyLmdldFN0YXJ0VGltZSgpICYmIHRlMS5nZXRFbmRUaW1lKCkgPT0gdGUyLmdldEVuZFRpbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUaW1lRXZlbnQgdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKHRoaXMuc3RhcnRUaW1lKS5jb21wYXJlVG8odGUuc3RhcnRUaW1lKTsKKyAgICB9CisgCisgICAgcHVibGljIHN0YXRpYyBMaXN0PD8gZXh0ZW5kcyBUaW1lRXZlbnQ+IGdldFRpbWVPcmRlcmVkRXZlbnRzKExpc3Q8PyBleHRlbmRzIFRpbWVFdmVudD4gZXZlbnRzKSB7CisgICAgICAgIFRpbWVFdmVudFtdIGV2ZW50c0FycmF5ID0gZXZlbnRzCisgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFRpbWVFdmVudFtldmVudHMuc2l6ZSgpXSk7CisgICAgICAgIEFycmF5cy5zb3J0KGV2ZW50c0FycmF5KTsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZXZlbnRzQXJyYXkpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2ZpbHRlci9UaW1lRXZlbnRXZWlnaHRlZEhhc2guamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2ZpbHRlci9UaW1lRXZlbnRXZWlnaHRlZEhhc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFhOGZkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZmlsdGVyL1RpbWVFdmVudFdlaWdodGVkSGFzaC5qYXZhCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmZpbHRlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyogCisqIEBhdXRob3IgYmZvc3RlcgorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqCisqIDxwPgorKiBCdWlsZHMgYSB0aW1lIHNvcnRlZCBoYXNoIHdoZXJlIHRoZSB0b3AgdmFsdWUgaGFzIHRoZSBlYXJsaWVzdCB0aW1lLiAgVGhpcyBoYXNoCisqIGlzIGEgZGlyZWN0aW9uYWwgZ3JhcGguICBJdCBidWlsZHMgYWxsIHBvc3NpYmxlIHBhdGhzIGZyb20gdG9wIG5vZGUgdG8gbGVhZgorKiBub2Rlcy4gIEF0IGFueSB0aW1lIHlvdSBjYW4gYXNrIGZvciB0aGUgZ3JlYXRlc3Qgd2VpZ2h0ZWQgcGF0aCBpbiB0aGUgaGFzaCAtLSB0aGF0CisqIGlzLCB0aGUgcGF0aCBmcm9tIHJvb3Qgbm9kZSB0byBhIGxlYWYgbm9kZSB3aGljaCBmaWxscyB0aGUgbW9zdCB0aW1lLiBFcHNpbG9uIGlzIAorKiBUaW1lRXZlbnQgb2JqZWN0cyBhbGxvd2VkIHRpbWUgb3ZlcmxhcCAoaXQgaXMgb2YgdGhlIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudCB0aGF0IAorKiBpcyB1c2VkIGluIHlvdSBUaW1lRXZlbnQgb2JqZWN0cyBhZGRlZCB0byB0aGlzIGhhc2gpLgorKiA8L3A+LgorKi8KK3B1YmxpYyBjbGFzcyBUaW1lRXZlbnRXZWlnaHRlZEhhc2ggeworCisgIHByaXZhdGUgVGltZUV2ZW50Tm9kZSByb290OworICAKKyAgcHJvdGVjdGVkIGxvbmcgZXBzaWxvbjsKKyAgCisgIHByaXZhdGUgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+IGxlYWZOb2RlczsKKyAgICAgIAorICBwcml2YXRlIFRpbWVFdmVudFdlaWdodGVkSGFzaCgpIHsKKyAgICAgIHJvb3QgPSBuZXcgVGltZUV2ZW50Tm9kZShuZXcgVGltZUV2ZW50KC0xLCAtMSkpOworICAgICAgbGVhZk5vZGVzID0gbmV3IE15TGlua2VkSGFzaFNldDxUaW1lRXZlbnROb2RlPigpOworICAgICAgbGVhZk5vZGVzLmFkZCh0aGlzLnJvb3QpOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIFRpbWVFdmVudFdlaWdodGVkSGFzaCBidWlsZEhhc2goTGlzdDw/IGV4dGVuZHMgVGltZUV2ZW50PiBldmVudHMpIHsKKwkgIHJldHVybiBidWlsZEhhc2goZXZlbnRzLCAwKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEdyZWF0ZXN0IFdlaWdodGVkIFBhdGggb2YgVGltZUV2ZW50cworICAgKi8KKyAgcHVibGljIHN0YXRpYyBUaW1lRXZlbnRXZWlnaHRlZEhhc2ggYnVpbGRIYXNoKExpc3Q8PyBleHRlbmRzIFRpbWVFdmVudD4gZXZlbnRzLCBsb25nIGVwc2lsb24pIHsKKwkgIFRpbWVFdmVudFdlaWdodGVkSGFzaCBoYXNoID0gbmV3IFRpbWVFdmVudFdlaWdodGVkSGFzaCgpOworCSAgaGFzaC5lcHNpbG9uID0gZXBzaWxvbjsKKyAgICAgIGV2ZW50cyA9IFRpbWVFdmVudC5nZXRUaW1lT3JkZXJlZEV2ZW50cyhldmVudHMpOworICAgICAgZm9yIChUaW1lRXZlbnQgZXZlbnQgOiBldmVudHMpCisgICAgCSAgaGFzaC5hZGRFdmVudChldmVudCk7CisgICAgICByZXR1cm4gaGFzaDsKKyAgfQorICAKKyAgcHVibGljIExpc3Q8PyBleHRlbmRzIFRpbWVFdmVudD4gZ2V0R3JlYXRlc3RXZWlnaHRlZFBhdGhBc09yZGVyZWRMaXN0KCkgeworICAgICAgV2VpZ2h0ZWROb2RlIHduID0gdGhpcy5nZXRHcmVhdGVzdFdlaWdodGVkUGF0aCgpOworICAgICAgTGlzdDxUaW1lRXZlbnQ+IGd3cEV2ZW50cyA9IG5ldyBMaW5rZWRMaXN0PFRpbWVFdmVudD4oKTsKKyAgICAgIHdoaWxlKHduICE9IG51bGwpIHsKKyAgICAgICAgICBnd3BFdmVudHMuYWRkKHduLmdldFRpbWVFdmVudCgpKTsKKyAgICAgICAgICB3biA9IHduLmdldENoaWxkKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBnd3BFdmVudHM7CisgIH0KKyAKKyAgcHJpdmF0ZSB2b2lkIGFkZEV2ZW50KFRpbWVFdmVudCBuZXdFdmVudCkgeworICAgICAgVGltZUV2ZW50Tm9kZSBuZXdFdmVudE5vZGUgPSBuZXcgVGltZUV2ZW50Tm9kZShuZXdFdmVudCk7CisgICAgICBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gcGFyZW50Tm9kZXMgPSB0aGlzLmZpbmRQYXJlbnRzKG5ld0V2ZW50KTsKKyAgICAgIE15TGlua2VkSGFzaFNldDxUaW1lRXZlbnROb2RlPiBjaGlsZHJlbk5vZGVzID0gdGhpcy5maW5kQ2hpbGRyZW4obmV3RXZlbnQsIHBhcmVudE5vZGVzKTsKKyAgICAgIAorICAgICAgaWYgKGNoaWxkcmVuTm9kZXMuc2l6ZSgpID09IDApCisgICAgICAgICAgbGVhZk5vZGVzLmFkZChuZXdFdmVudE5vZGUpOworICAgICAgCisgICAgICBuZXdFdmVudE5vZGUuYWRkUGFyZW50cyhwYXJlbnROb2Rlcyk7CisgICAgICBuZXdFdmVudE5vZGUuYWRkQ2hpbGRyZW4oY2hpbGRyZW5Ob2Rlcyk7CisgICAgICAKKyAgfQorICAKKyAgcHJpdmF0ZSBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gZmluZFBhcmVudHMoVGltZUV2ZW50IG5ld0V2ZW50KSB7CisgICAgICBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gcGFyZW50Tm9kZXMgPSBuZXcgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+KCk7CisgICAgICBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gcG9zc2libGVQYXJlbnROb2RlcyA9IG5ldyBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4oKTsKKyAgICAgIE15TGlua2VkSGFzaFNldDxUaW1lRXZlbnROb2RlPiBwb3NzaWJsZVBhcmVudE5vZGVzQWxyZWFkeUNoZWNrZWQgPSBuZXcgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+KCk7CisgICAgICAKKyAgICAgIC8vaXRlcmF0ZSB0aHJvdWdoIHBvc3NpYmxlIHBhcmVudCBub2RlcyBhZGQgcG9zc2libGUgcGFyZW50IGNoaWxkIGFzCisgICAgICAvLyBwb3NzaWJsZSBwYXJlbnRzIGlmIHRoZXkgZG8gbm90IGNvbmZsaWN0CisgICAgICBUaW1lRXZlbnROb2RlIGN1clBQTiA9IHRoaXMucm9vdDsKKyAgICAgIHdoaWxlIChjdXJQUE4gIT0gbnVsbCkgeworICAgICAgICAgIGJvb2xlYW4gcHBuTGlzdENoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICBmb3IgKFRpbWVFdmVudE5vZGUgY3VyQ2hpbGQgOiBjdXJQUE4uZ2V0Q2hpbGRyZW4oKSkgeworICAgICAgICAgICAgICAvL2lmIGN1ckNoaWxkIGRvZXMgbm90IGNvbmZpY3RzIHdpdGggdGUsIHRoZW4gaXQgaXMgYSBwb3NzaWJsZSBwYXJlbnQKKyAgICAgICAgICAgICAgaWYgKGhhcHBlbnNCZWZvcmUoY3VyQ2hpbGQuZ2V0VGltZUV2ZW50KCksIG5ld0V2ZW50KSAKKyAgICAgICAgICAgICAgICAgICAgICAmJiAhcG9zc2libGVQYXJlbnROb2Rlc0FscmVhZHlDaGVja2VkLmNvbnRhaW5zKGN1ckNoaWxkKSkgeworICAgICAgICAgICAgICAgICAgcG9zc2libGVQYXJlbnROb2Rlcy5hZGQoY3VyQ2hpbGQpOworICAgICAgICAgICAgICAgICAgcHBuTGlzdENoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vaWYgYWxsIGNoaWxkcmVuIHdoZXJlIG5vdCBwb3NzaWJsZSBwYXJlbnRzLCB0aGVuIGN1clBQTiBtdXN0IGJlIHBhcmVudAorICAgICAgICAgIGlmICghcHBuTGlzdENoYW5nZWQpCisgICAgICAgICAgICAgIHBhcmVudE5vZGVzLmFkZChjdXJQUE4pOworICAgICAgICAgIAorICAgICAgICAgIC8vZ2V0IG5leHQgY3VyUFBOCisgICAgICAgICAgcG9zc2libGVQYXJlbnROb2Rlcy5yZW1vdmUoY3VyUFBOKTsKKyAgICAgICAgICBwb3NzaWJsZVBhcmVudE5vZGVzQWxyZWFkeUNoZWNrZWQuYWRkKGN1clBQTik7CisgICAgICAgICAgd2hpbGUoKGN1clBQTiA9IHBvc3NpYmxlUGFyZW50Tm9kZXMuZ2V0KDApKSAhPSBudWxsIAorICAgICAgICAgICAgICAgICAgJiYgcG9zc2libGVQYXJlbnROb2Rlc0FscmVhZHlDaGVja2VkLmNvbnRhaW5zKGN1clBQTikpIHsKKyAgICAgICAgICAgICAgcG9zc2libGVQYXJlbnROb2Rlcy5yZW1vdmUoY3VyUFBOKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBwYXJlbnROb2RlczsKKyAgfQorICAKKyAgcHJpdmF0ZSBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gZmluZENoaWxkcmVuKFRpbWVFdmVudCBuZXdFdmVudCwgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+IHBhcmVudE5vZGVzKSB7CisgICAgICBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gY2hpbGRyZW5Ob2RlcyA9IG5ldyBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4oKTsKKyAgICAgIE15TGlua2VkSGFzaFNldDxUaW1lRXZlbnROb2RlPiBwb3NzaWJsZUNoaWxkcmVuTm9kZXMgPSBuZXcgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+KCk7CisgICAgICBmb3IgKFRpbWVFdmVudE5vZGUgcGFyZW50IDogcGFyZW50Tm9kZXMpIHsKKyAgICAgICAgICBwb3NzaWJsZUNoaWxkcmVuTm9kZXMuYWRkQWxsKHBhcmVudC5nZXRDaGlsZHJlbigpKTsKKyAgICAgICAgICBUaW1lRXZlbnROb2RlIGN1clBDTiA9IHBvc3NpYmxlQ2hpbGRyZW5Ob2Rlcy5nZXQoMCk7CisgICAgICAgICAgd2hpbGUgKGN1clBDTiAhPSBudWxsICYmICFwYXJlbnROb2Rlcy5jb250YWlucyhjdXJQQ04pKSB7CisgICAgICAgICAgICAgIGlmIChoYXBwZW5zQmVmb3JlKG5ld0V2ZW50LCBjdXJQQ04uZ2V0VGltZUV2ZW50KCkpKSB7CisgICAgICAgICAgICAgICAgICBjaGlsZHJlbk5vZGVzLmFkZChjdXJQQ04pOworICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICBwb3NzaWJsZUNoaWxkcmVuTm9kZXMuYWRkQWxsKGN1clBDTi5nZXRDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwb3NzaWJsZUNoaWxkcmVuTm9kZXMucmVtb3ZlKGN1clBDTik7CisgICAgICAgICAgICAgIGN1clBDTiA9IHBvc3NpYmxlQ2hpbGRyZW5Ob2Rlcy5nZXQoMCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGNoaWxkcmVuTm9kZXM7CisgIH0KKyAgCisgIHByaXZhdGUgYm9vbGVhbiBoYXBwZW5zQmVmb3JlKFRpbWVFdmVudCB0MSwgVGltZUV2ZW50IHQyKSB7CisgICAgICBsb25nIGJvdW5kYXJ5Q2hlY2sgPSB0Mi5nZXRTdGFydFRpbWUoKSAtIHQxLmdldEVuZFRpbWUoKTsKKyAgICAgIHJldHVybiB0MS5nZXRTdGFydFRpbWUoKSA8IHQyLmdldFN0YXJ0VGltZSgpICYmIChib3VuZGFyeUNoZWNrICsgZXBzaWxvbikgPiAwOworICB9CisgIAorICBwcml2YXRlIFdlaWdodGVkTm9kZSBnZXRHcmVhdGVzdFdlaWdodGVkUGF0aCgpIHsKKyAgICAgIFRpbWVFdmVudE5vZGUgbWF4ID0gdGhpcy5sZWFmTm9kZXMuZ2V0KDApOworICAgICAgZm9yIChUaW1lRXZlbnROb2RlIHRlbiA6IHRoaXMubGVhZk5vZGVzKSB7CisgICAgICAgICBpZiAodGVuLmdldFBhdGhXZWlnaHQoKSA+IG1heC5nZXRQYXRoV2VpZ2h0KCkgCisgICAgICAgICAgICAgICAgIHx8ICh0ZW4uZ2V0UGF0aFdlaWdodCgpID09IG1heC5nZXRQYXRoV2VpZ2h0KCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVuLmdldFBhdGhQcmlvcml0eVdlaWdodCgpID4gbWF4LmdldFBhdGhQcmlvcml0eVdlaWdodCgpKSkKKyAgICAgICAgICAgICBtYXggPSB0ZW47CisgICAgICB9CisgICAgICBXZWlnaHRlZE5vZGUgcm9vdCA9IG5ldyBXZWlnaHRlZE5vZGUobWF4LmdldFRpbWVFdmVudCgpKTsKKyAgICAgIFRpbWVFdmVudE5vZGUgY3VyVEVOID0gbWF4LmdyZWF0ZXN0V2llZ2h0ZWRQYXJlbnQ7CisgICAgICB3aGlsZSAoY3VyVEVOICE9IG51bGwpIHsKKyAgICAgICAgICBXZWlnaHRlZE5vZGUgdGVtcCA9IG5ldyBXZWlnaHRlZE5vZGUoY3VyVEVOLmdldFRpbWVFdmVudCgpKTsKKyAgICAgICAgICB0ZW1wLnNldENoaWxkKHJvb3QpOworICAgICAgICAgIHJvb3QgPSB0ZW1wOworICAgICAgICAgIGN1clRFTiA9IGN1clRFTi5ncmVhdGVzdFdpZWdodGVkUGFyZW50OworICAgICAgfQorICAgICAgcmV0dXJuIHJvb3QuZ2V0Q2hpbGQoKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBjbGFzcyBNeUxpbmtlZEhhc2hTZXQ8RT4gZXh0ZW5kcyBIYXNoU2V0PEU+IHsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTczMTkxNTQwODc0MzAwMjU4NDFMOworICAgICAgCisgICAgICBwcml2YXRlIExpbmtlZExpc3Q8RT4gbGlzdFNldDsKKyAgICAgIAorICAgICAgcHVibGljIE15TGlua2VkSGFzaFNldCgpIHsKKyAgICAgICAgICB0aGlzLmxpc3RTZXQgPSBuZXcgTGlua2VkTGlzdDxFPigpOworICAgICAgfQorICAgICAgCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGFkZChFIHRlbikgeworICAgICAgICAgIGJvb2xlYW4gd2FzQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICBpZiAod2FzQWRkZWQgPSBzdXBlci5hZGQodGVuKSkKKyAgICAgICAgICAgICAgbGlzdFNldC5hZGQodGVuKTsKKyAgICAgICAgICByZXR1cm4gd2FzQWRkZWQ7CisgICAgICB9CisgICAgICAKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICBib29sZWFuIHNldENoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICBmb3IgKEUgdGVuIDogY29sbGVjdGlvbikgeworICAgICAgICAgICAgICBpZiAodGhpcy5hZGQodGVuKSkKKyAgICAgICAgICAgICAgICAgIHNldENoYW5nZWQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gc2V0Q2hhbmdlZDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHRlbikgeworICAgICAgICAgIGlmIChzdXBlci5yZW1vdmUodGVuKSkgeworICAgICAgICAgICAgICB0aGlzLmxpc3RTZXQucmVtb3ZlKHRlbik7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH1lbHNlIAorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworICAgICAgICAgIGJvb2xlYW4gc2V0Q2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlKG9iaikpCisgICAgICAgICAgICAgICAgICBzZXRDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHNldENoYW5nZWQ7ICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgcHVibGljIEUgZ2V0KGludCBpbmRleCkgeworICAgICAgICAgIGlmICh0aGlzLmxpc3RTZXQuc2l6ZSgpID4gaW5kZXgpCisgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RTZXQuZ2V0KGluZGV4KTsKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcHVibGljIExpc3Q8RT4gZ2V0TGlzdCgpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5saXN0U2V0OworICAgICAgfQorICAgICAgCisgIH0KKworICBwcml2YXRlIGNsYXNzIFRpbWVFdmVudE5vZGUgeworCisgICAgICBwcml2YXRlIFRpbWVFdmVudCB0ZTsKKyAgICAgIAorICAgICAgcHJpdmF0ZSBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4gY2hpbGRyZW47CisKKyAgICAgIHByaXZhdGUgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+IHBhcmVudHM7CisgICAgICAKKyAgICAgIHByaXZhdGUgVGltZUV2ZW50Tm9kZSBncmVhdGVzdFdpZWdodGVkUGFyZW50OworICAgICAgICAgICAgICAKKyAgICAgIHB1YmxpYyBUaW1lRXZlbnROb2RlKFRpbWVFdmVudCB0ZSkgeworICAgICAgICAgIHRoaXMudGUgPSB0ZTsKKyAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBNeUxpbmtlZEhhc2hTZXQ8VGltZUV2ZW50Tm9kZT4oKTsKKyAgICAgICAgICBwYXJlbnRzID0gbmV3IE15TGlua2VkSGFzaFNldDxUaW1lRXZlbnROb2RlPigpOworICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgbG9uZyBnZXRQYXRoV2VpZ2h0KCkgeworICAgICAgICAgIGlmICh0aGlzLmdyZWF0ZXN0V2llZ2h0ZWRQYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgcmV0dXJuIHRlLmdldER1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuZ3JlYXRlc3RXaWVnaHRlZFBhcmVudC5nZXRQYXRoV2VpZ2h0KCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gdGUuZ2V0RHVyYXRpb24oKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIGRvdWJsZSBnZXRQYXRoUHJpb3JpdHlXZWlnaHQoKSB7CisgICAgICAgICAgaWYgKHRoaXMuZ3JlYXRlc3RXaWVnaHRlZFBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICByZXR1cm4gdGUuZ2V0UHJpb3JpdHkoKQorICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5ncmVhdGVzdFdpZWdodGVkUGFyZW50LmdldFBhdGhQcmlvcml0eVdlaWdodCgpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuIHRlLmdldFByaW9yaXR5KCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBUaW1lRXZlbnQgZ2V0VGltZUV2ZW50KCkgeworICAgICAgICAgIHJldHVybiB0aGlzLnRlOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lRXZlbnQoVGltZUV2ZW50IHRlKSB7CisgICAgICAgICAgdGhpcy50ZSA9IHRlOworICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChUaW1lRXZlbnROb2RlIGNoaWxkKSB7ICAgICAgICAgICAgCisgICAgICAgICAgLy9yZW1vdmUgcGFyZW50IHRvIGdyYW5kY2hpbGQgbGlua3MKKyAgICAgICAgICBmb3IgKFRpbWVFdmVudE5vZGUgcGFyZW50IDogdGhpcy5wYXJlbnRzKSB7CisgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICBjaGlsZC5wYXJlbnRzLnJlbW92ZShwYXJlbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvL2xpbmsgdG8gY2hpbGQKKyAgICAgICAgICB0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgICAgICAgY2hpbGQucGFyZW50cy5hZGQodGhpcyk7CisgICAgICAgICAgbGVhZk5vZGVzLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvL2RldGVybWluZSBjaGlsZCdzIGdyZWF0ZXN0IHdlaWdodGVkIHBhcmVudAorICAgICAgICAgIGNoaWxkLmdyZWF0ZXN0V2llZ2h0ZWRQYXJlbnQgPSB0aGlzOworICAgICAgICAgIGZvciAoVGltZUV2ZW50Tm9kZSBwYXJlbnQgOiBjaGlsZC5wYXJlbnRzKSB7CisgICAgICAgICAgICAgIGxvbmcgZ3dwUGFXID0gY2hpbGQuZ3JlYXRlc3RXaWVnaHRlZFBhcmVudC5nZXRQYXRoV2VpZ2h0KCk7CisgICAgICAgICAgICAgIGxvbmcgcFBhVyA9IHBhcmVudC5nZXRQYXRoV2VpZ2h0KCk7CisgICAgICAgICAgICAgIGRvdWJsZSBnd3BQaVcgPSBjaGlsZC5ncmVhdGVzdFdpZWdodGVkUGFyZW50LmdldFBhdGhQcmlvcml0eVdlaWdodCgpOworICAgICAgICAgICAgICBkb3VibGUgcFBpVyA9IHBhcmVudC5nZXRQYXRoUHJpb3JpdHlXZWlnaHQoKTsKKyAgICAgICAgICAgICAgaWYgKHBQYVcgPiBnd3BQYVcgfHwgKHBQYVcgPT0gZ3dwUGFXICYmIHBQaVcgPiBnd3BQaVcpKSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBjaGlsZC5ncmVhdGVzdFdpZWdodGVkUGFyZW50ID0gcGFyZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgcHVibGljIHZvaWQgYWRkUGFyZW50KFRpbWVFdmVudE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgcGFyZW50LmFkZENoaWxkKHRoaXMpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihDb2xsZWN0aW9uPFRpbWVFdmVudE5vZGU+IGNoaWxkcmVuKSB7CisgICAgICAgICAgZm9yIChUaW1lRXZlbnROb2RlIGNoaWxkIDogY2hpbGRyZW4pCisgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY2hpbGQpOworICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgdm9pZCBhZGRQYXJlbnRzKENvbGxlY3Rpb248VGltZUV2ZW50Tm9kZT4gcGFyZW50cykgeworICAgICAgICAgIGZvciAoVGltZUV2ZW50Tm9kZSBwYXJlbnQgOiBwYXJlbnRzKQorICAgICAgICAgICAgICB0aGlzLmFkZFBhcmVudChwYXJlbnQpOworICAgICAgfQorCisgICAgICBwdWJsaWMgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+IGdldENoaWxkcmVuKCkgeworICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuOworICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgTXlMaW5rZWRIYXNoU2V0PFRpbWVFdmVudE5vZGU+IGdldFBhcmVudHMoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50czsKKyAgICAgIH0KKworICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGltZUV2ZW50Tm9kZSkgeworICAgICAgICAgICAgICBUaW1lRXZlbnROb2RlIHRlbiA9IChUaW1lRXZlbnROb2RlKSBvYmo7CisgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRlLmVxdWFscyh0ZW4udGUpOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMudGUudG9TdHJpbmcoKSArICIgLS0gIiArIHRoaXMuZ2V0UGF0aFdlaWdodCgpOworICAgICAgfQorICAgICAgCisgIH0KKworICBwcml2YXRlIGNsYXNzIFdlaWdodGVkTm9kZSB7CisKKyAgICAgIHByaXZhdGUgbG9uZyBwYXRoV2VpZ2h0OworCisgICAgICBwcml2YXRlIFdlaWdodGVkTm9kZSBjaGlsZDsKKworICAgICAgcHJpdmF0ZSBUaW1lRXZlbnQgdGU7CisKKyAgICAgIHByaXZhdGUgV2VpZ2h0ZWROb2RlKFRpbWVFdmVudCB0ZSkgeworICAgICAgICAgIHRoaXMudGUgPSB0ZTsKKyAgICAgICAgICBwYXRoV2VpZ2h0ID0gdGUuZ2V0RHVyYXRpb24oKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSB2b2lkIHNldENoaWxkKFdlaWdodGVkTm9kZSBjaGlsZCkgeworICAgICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKKyAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgdGhpcy5wYXRoV2VpZ2h0ID0gdGhpcy50ZS5nZXREdXJhdGlvbigpICsgY2hpbGQuZ2V0UGF0aFdlaWdodCgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgVGltZUV2ZW50IGdldFRpbWVFdmVudCgpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy50ZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIFdlaWdodGVkTm9kZSBnZXRDaGlsZCgpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZDsKKyAgICAgIH0KKworICAgICAgcHVibGljIGxvbmcgZ2V0UGF0aFdlaWdodCgpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5wYXRoV2VpZ2h0OworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgIHJldHVybiB0ZS50b1N0cmluZygpICsgIlxuIiAKKyAgICAgICAgICAgICAgKyAoY2hpbGQgIT0gbnVsbCA/IGNoaWxkLnRvU3RyaW5nKCkgOiAiIik7CisgICAgICB9CisKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgIExpbmtlZExpc3Q8VGltZUV2ZW50Tm9kZT4gcHJpbnROb2RlcyA9IG5ldyBMaW5rZWRMaXN0PFRpbWVFdmVudE5vZGU+KCk7CisgICAgICBwcmludE5vZGVzLmFkZCh0aGlzLnJvb3QpOworICAgICAgc2IuYXBwZW5kKHByaW50Tm9kZXMocHJpbnROb2RlcywgIi0iLCAwKSk7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHByaW50Tm9kZXMoTGlzdDxUaW1lRXZlbnROb2RlPiBsaXN0LAorICAgICAgICAgIFN0cmluZyBzcGFjZXIsIGxvbmcgY3VyUGF0aFdlaWdodCkgeworICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgZm9yIChUaW1lRXZlbnROb2RlIG5vZGUgOiBsaXN0KSB7CisgICAgICAgICAgb3V0cHV0LmFwcGVuZChzcGFjZXIpOworICAgICAgICAgIG91dHB1dC5hcHBlbmQobm9kZS50ZSArICIgLS0gIiArIChjdXJQYXRoV2VpZ2h0ICsgbm9kZS50ZS5nZXREdXJhdGlvbigpKSArICJcbiIpOworICAgICAgICAgIG91dHB1dC5hcHBlbmQocHJpbnROb2Rlcyhub2RlLmdldENoaWxkcmVuKCkuZ2V0TGlzdCgpLCAiICIgKyBzcGFjZXIsIGN1clBhdGhXZWlnaHQgKyBub2RlLnRlLmdldER1cmF0aW9uKCkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbS5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDNjM2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9CYXNlNjREZWNvZGluZ0lucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5CYXNlNjQ7CisKKy8qKiBBbiBpbnB1dCBzdHJlYW0gdGhhdCBkZWNvZGVzIGl0cyBkYXRhIGZyb20gdGhlIFJGQy0xNTEyIGJhc2UgNjQgZm9ybWF0LgorICoKKyAqIFdyYXAgdGhpcyBpbnB1dCBzdHJlYW0gYXJvdW5kIGFub3RoZXIgaW5wdXQgc3RyZWFtLCBhbmQgYWxsIHRoZSBieXRlcyB3aWxsIGJlIGNvbnZlcnRlZAorICogZnJvbSB0aGVpciBiYXNlLTY0IGZvcm1hdCB3aGVuIHlvdSByZWFkIGZyb20gaXQuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKwkvKiogQ29uc3RydWN0IGEgYmFzZS02NCBkZWNvZGluZyBpbnB1dCBzdHJlYW0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gVGhlIGlucHV0IHN0cmVhbSB0byBkZWNvZGUuCisJICovCisJcHVibGljIEJhc2U2NERlY29kaW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKwkJc3VwZXIoaW5wdXRTdHJlYW0pOworCX0KKworCS8qKiBSZWFkIHRoZSBuZXh0IGJ5dGUuCisJICoKKwkgKiBEZWNvZGUgbW9yZSBiYXNlLTY0IGRhdGEgYW5kIHJldHVybiB0aGUgbmV4dCBkZWNvZGVkIGJ5dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBieXRlLCBvciAtMSBvbiBlbmQgb2Ygc3RyZWFtLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoaW4gPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW4ndCByZWFkIGZyb20gYSBjbG9zZWQgc3RyZWFtIik7CisKKwkJLy8gSWYgd2UndmUgdXNlZCB1cCB0aGUgZGVjb2RlZCBkYXRhIGJ1ZmZlciwgcmVhZCA0IG1vcmUgYnl0ZXMgYW5kIGRlY29kZSAnZW0uCisJCWlmIChidWZmZXIgPT0gbnVsbCB8fCBpbmRleCA9PSBidWZmZXIubGVuZ3RoKSB7CisJCQlieXRlW10gc3RyZWFtQnVmID0gbmV3IGJ5dGVbNF07CisJCQlpbnQgdG9SZWFkID0gNDsKKwkJCWludCBhdEluZGV4ID0gMDsKKwkJCWludCBhY3R1YWxseUdvdDsKKwkJCWJvb2xlYW4gZmlyc3RSZWFkID0gdHJ1ZTsKKwkJCXdoaWxlICh0b1JlYWQgPiAwKSB7CisJCQkJYWN0dWFsbHlHb3QgPSBpbi5yZWFkKHN0cmVhbUJ1ZiwgYXRJbmRleCwgdG9SZWFkKTsKKwkJCQlpZiAoYWN0dWFsbHlHb3QgPT0gLTEpIHsKKwkJCQkJaWYgKGZpcnN0UmVhZCkgcmV0dXJuIC0xOworCQkJCQllbHNlIGJyZWFrOworCQkJCX0KKwkJCQlmaXJzdFJlYWQgPSBmYWxzZTsKKwkJCQlhdEluZGV4ICs9IGFjdHVhbGx5R290OworCQkJCXRvUmVhZCAtPSBhY3R1YWxseUdvdDsKKwkJCX0KKwkJCWJ1ZmZlciA9IEJhc2U2NC5kZWNvZGUoc3RyZWFtQnVmKTsKKwkJCWlmIChidWZmZXIubGVuZ3RoID09IDApIHsKKwkJCQlidWZmZXIgPSBudWxsOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWluZGV4ID0gMDsKKwkJfQorCQlyZXR1cm4gYnVmZmVyW2luZGV4KytdICYgMHhmZjsKKwl9CisKKwkvKiogUmVhZCBhIGJ1bmNoIG9mIGJ5dGVzLgorCSAqCisJICogVGhpcyBkZWNvZGVzIGJhc2UtNjQgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8KKwkgKiB0aGUgZ2l2ZW4gYXJyYXkuCisJICoKKwkgKiBAcGFyYW0gYiBUaGUgYnVmZmVyIHRvIGZpbGwgd2l0aCBkZWNvZGVkIGJhc2UtNjQgZGF0YS4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIGluIHRoZSBidWZmZXIgdG8gc3RhcnQgZmlsbGluZy4KKwkgKiBAcGFyYW0gbGVuZ3RoIEhvdyBtYW55IGJ5dGVzIHRvIGZpbGwuCisJICogQHJldHVybiBUaGUgYWN0dWFsIG51bWJlciBvZiBkZWNvZGVkIGJ5dGVzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChiID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZGF0YSBpbnRvIGEgbnVsbCBhcnJheSIpOworCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gYi5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBkYXRhIGludG8gYW4gYXJyYXkgd2l0aCBpbmRleGVzIDAuLiIgKyAoYi5sZW5ndGgtMSkKKwkJCQkrICIgYXQgaW5kZXggIiArIG9mZnNldCk7CisJCWlmIChsZW5ndGggPCAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCByZWFkIGEgbmVnYXRpdmUgYW1vdW50IG9mIGRhdGEiKTsKKwkJaWYgKG9mZnNldCArIGxlbmd0aCA+IGIubGVuZ3RoKQorCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkNhbid0IHJlYWQgZGF0YSBwYXN0IHRoZSByaWdodCBlZGdlIG9mIGFuIGFycmF5Iik7CisJCWlmIChpbiA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBhIGNsb3NlZCBzdHJlYW0iKTsKKworCQlpbnQgYyA9IHJlYWQoKTsKKwkJaWYgKGMgPT0gLTEpIHJldHVybiAtMTsKKwkJYltvZmZzZXRdID0gKGJ5dGUpIGM7CisJCWludCBpID0gMTsKKwkJdHJ5IHsKKwkJCWZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKwkJCQljID0gcmVhZCgpOworCQkJCWlmIChjID09IC0xKSBicmVhazsKKwkJCQliW29mZnNldCArIGldID0gKGJ5dGUpIGM7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJcmV0dXJuIGk7CisJfQorCisJLyoqIFNraXAgYnl0ZXMuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBza2lwcyBhbmQgZGlzY2FyZHMgPHZhcj5uPC92YXI+IGRlY29kZWQgYnl0ZXMgb24gdGhlIGlucHV0IHN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbSBuIE51bWJlciBvZiBieXRlcyB0byBza2lwLgorCSAqIEByZXR1cm4gQWN0dWFsIG51bWJlciBvZiBieXRlcyBza2lwcGVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGluID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2FuJ3Qgc2tpcCBwYXN0IGRhdGEgb24gYSBjbG9zZWQgc3RyZWFtIik7CisJCWludCBhY3R1YWxseVNraXBwZWQgPSAwOworCQl3aGlsZSAobiA+IDApIHsKKwkJCWlmIChyZWFkKCkgPT0gLTEpIHJldHVybiBhY3R1YWxseVNraXBwZWQ7CisJCQktLW47CisJCQkrK2FjdHVhbGx5U2tpcHBlZDsKKwkJfQorCQlyZXR1cm4gYWN0dWFsbHlTa2lwcGVkOworCX0KKworCS8qKiBSZXR1cm4gYnl0ZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nIG9yIHNraXBwaW5nIHdpdGhvdXQgYmxvY2tpbmcuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgc3RyZWFtIG9yIHNraXBwZWQgb3ZlcgorCSAqIG9uIHRoZSBzdHJlYW0gd2l0aG91dCBibG9ja2luZy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoaW4gPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW4ndCBzZWUgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBvbiBhIGNsb3NlZCBzdHJlYW0iKTsKKwkJaWYgKGJ1ZmZlciAhPSBudWxsICYmIGluZGV4IDwgYnVmZmVyLmxlbmd0aCkKKwkJCXJldHVybiBidWZmZXIubGVuZ3RoIC0gaW5kZXg7CisJCXJldHVybiBpbi5hdmFpbGFibGUoKSA+PSA0PyAxIDogMDsKKwl9CisKKwkvKiogQ2xvc2UgdGhpcyBzdHJlYW0uCisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoaW4gPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW4ndCBjbG9zZSBhIGNsb3NlZCBzdHJlYW0iKTsKKwkJaW4uY2xvc2UoKTsKKwkJaW4gPSBudWxsOworCQlidWZmZXIgPSBudWxsOworCX0KKworCS8qKiBCdWZmZXIgZm9yIGRlY29kZWQgZGF0YS4KKwkgKi8KKwlwcml2YXRlIGJ5dGVbXSBidWZmZXI7CisKKwkvKiogV2hlcmUgd2UnbGwgbmV4dCByZWFkIG91dCBvZiB0aGUgYnVmZmVyLgorCSAqCisJICogU2luY2Ugd2UgYWx3YXlzIHJlYWQgNCBieXRlcyBhdCBhIHRpbWUgKGEgYmFzZS02NCBibG9jayksIHdlIGNhbiBkZWNvZGUgdGhhdAorCSAqIGludG8gYXMgbWFueSBhcyAzIGJ5dGVzLCBzbyBzdGFydCBvdXQgdGhlIGluZGV4IGluIGFuIGludmFsaWQgbG9jYXRpb24uCisJICovCisJcHJpdmF0ZSBpbnQgaW5kZXggPSAzOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vQmFzZTY0RW5jb2RpbmdPdXRwdXRTdHJlYW0uamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0Jhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0MTMxMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0Jhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkJhc2U2NDsKKworLyoqIEFuIG91dHB1dCBzdHJlYW0gdGhhdCBlbmNvZGVzIGl0cyBkYXRhIGludG8gUkZDLTE1MTIgYmFzZSA2NCBmb3JtYXQuCisgKgorICogV3JhcCB0aGlzIGlucHV0IHN0cmVhbSBhcm91bmQgYW5vdGhlciBvdXRwdXQgc3RyZWFtLCBhbmQgYWxsIHRoZSBieXRlcyB3aWxsIGJlCisgKiBjb252ZXJ0ZWQgaW50byB0aGVpciBiYXNlLTY0IGZvcm1hdCB3aGVuIHlvdSB3cml0ZSB0byBpdC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlNjRFbmNvZGluZ091dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7CisJLyoqIENvbnN0cnVjdCBhIGJhc2UtNjQgZW5jb2Rpbmcgb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdG8gd3JpdGUuCisJICovCisJcHVibGljIEJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKKwkJc3VwZXIob3V0cHV0U3RyZWFtKTsKKwl9CisKKwkvKiogV3JpdGUgYSBieXRlIG9mIGRhdGEuCisJICoKKwkgKiBUaGUgYnl0ZSB3aWxsIGJlIGVuY29kZWQgaW50byBiYXNlLTY0IGZvcm1hdCBvbiB0aGUgb3V0cHV0LgorCSAqCisJICogQHBhcmFtIGIgVGhlIGJ5dGUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYnVmZmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbid0IHdyaXRlIG9udG8gYSBjbG9zZWQgc3RyZWFtIik7CisJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSBiOworCQlpZiAoaW5kZXggPT0gYnVmZmVyLmxlbmd0aCkgc2hpcG91dCgpOworCX0KKworCS8qKiBXcml0ZSBhIGJ1bmNoIG9mIGJ5dGVzLgorCSAqCisJICogVGhlIGdpdmVuIGFycmF5IG9mIGJ5dGVzIHdpbGwgYmUgZW5jb2RlZCBpbnRvIGJhc2UtNjQgb24gdGhlIG91dHB1dC4KKwkgKgorCSAqIEBwYXJhbSBiIFRoZSBhcnJheSB0byB3cml0ZS4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIGluIHRoZSBkYXRhIHRvIHN0YXJ0IHdyaXRpbmcuCisJICogQHBhcmFtIGxlbmd0aCBIb3cgbWFueSBieXRlcyB0byB3cml0ZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChiID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHdyaXRlIGEgbnVsbCBhcnJheSIpOworCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gYi5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGJ5dGVzIGF0ICIgKyBvZmZzZXQgKyAiIGluIGFycmF5IHdpdGggaW5kZXhlcyAwLi4iCisJCQkJKyAoYi5sZW5ndGggLSAxKSk7CisJCWlmIChsZW5ndGggPCAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCB3cml0ZSBhIG5lZ2F0aXZlIGFtb3VudCBvZiBieXRlcyIpOworCQlpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYi5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGJ5dGVzIGJleW9uZCBlZGdlIG9mIGFycmF5Iik7CisJCWlmIChidWZmZXIgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2FuJ3Qgd3JpdGUgb250byBhIGNsb3NlZCBzdHJlYW0iKTsKKwkJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJCWludCBhdmFpbCA9IGJ1ZmZlci5sZW5ndGggLSBpbmRleDsKKwkJCWludCBhbW91bnQgPSBhdmFpbCA8IGxlbmd0aD8gYXZhaWwgOiBsZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZnNldCwgYnVmZmVyLCBpbmRleCwgYW1vdW50KTsKKwkJCWluZGV4ICs9IGFtb3VudDsKKwkJCW9mZnNldCArPSBhbW91bnQ7CisJCQlsZW5ndGggLT0gYW1vdW50OworCQkJaWYgKGluZGV4ID09IGJ1ZmZlci5sZW5ndGgpIHNoaXBvdXQoKTsKKwkJfQorCX0KKworCS8qKiBGbHVzaCB0aGUgc3RyZWFtLgorCSAqCisJICogVGhpcyBjYXVzZXMgYW55IGJ1ZmZlcmVkIGJ5dGVzIHRvIGJlIGVuY29kZWQgYW5kIHNoaXBwZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nCisJICogc3RyZWFtLCB3aGljaCBpcyBhbHNvIGZsdXNoZWQuCisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYnVmZmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbid0IGZsdXNoIGEgY2xvc2VkIHN0cmVhbSIpOworCQlzaGlwb3V0KCk7CisJCW91dC5mbHVzaCgpOworCX0KKworCS8qKiBDbG9zZSB0aGUgc3RyZWFtLgorCSAqCisJICogVGhpcyB3cml0ZXMgb3V0IGFueSB1bmZsdXNoZWQgZGF0YSBpbiBiYXNlLTY0IGZvcm1hdCBhbmQgY2xvc2VzIHRoZSB1bmRlcmx5aW5nCisJICogc3RyZWFtLgorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJ1ZmZlciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW4ndCBjbG9zZSBhbiBhbHJlYWR5IGNsb3NlZCBzdHJlYW0iKTsKKwkJZmx1c2goKTsKKwkJb3V0LmNsb3NlKCk7CisJCW91dCA9IG51bGw7CisJCWJ1ZmZlciA9IG51bGw7CisJfQorCisJLyoqIFNoaXAgb3V0IGEgYnVuY2ggb2YgYnVmZmVyZWQgZGF0YSBpbiBiYXNlLTY0IGZvcm1hdC4KKwkgKgorCSAqIFRoaXMgcmVzZXRzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBieXRlIHRvIGluc2VydCBiYWNrIHRvIHplcm8uCisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHJpdmF0ZSB2b2lkIHNoaXBvdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlieXRlW10gZW5jb2RlZCA9IEJhc2U2NC5lbmNvZGUoYnVmZmVyLCAwLCBpbmRleCk7CisJCW91dC53cml0ZShlbmNvZGVkKTsKKwkJaW5kZXggPSAwOworCX0KKworCS8qKiBTaXplIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXIuICBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAzMDA7CisKKwkvKiogQnVmZmVyIGZvciBvdXRwdXQgZGF0YS4KKwkgKi8KKwlwcml2YXRlIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisKKwkvKiogV2hlcmUgd2UgYXJlIGluIHRoZSBidWZmZXIuCisJICovCisJcHJpdmF0ZSBpbnQgaW5kZXggPSAwOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vQ291bnRpbmdPdXRwdXRTdHJlYW0uamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0NvdW50aW5nT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmZDNjMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0NvdW50aW5nT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIEFuIG91dHB1dCBzdHJlYW0gdGhhdCBjb3VudHMgdGhlIG51bWJlciBieXRlcyBpdCBwYXNzZXMgb24uCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqLworcHVibGljIGNsYXNzIENvdW50aW5nT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvdW50aW5nT3V0cHV0U3RyZWFtPC9jb2RlPiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBvdXQgV2hlcmUgdG8gc2VuZCBieXRlcyBvbnRvLgorCSAqLworCXB1YmxpYyBDb3VudGluZ091dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CisJCXN1cGVyKG91dCk7CisJfQorICAKKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJb3V0LndyaXRlKGIpOworCQkrK3dyaXR0ZW47CisJfQorICAKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJb3V0LndyaXRlKGIpOworCQl3cml0dGVuICs9IGIubGVuZ3RoOworCX0KKyAgCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW91dC53cml0ZShiLCBvZmZzZXQsIGxlbmd0aCk7CisJCXdyaXR0ZW4gKz0gbGVuZ3RoOworCX0KKyAgCisJLyoqCisJICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzbyBmYXIuCisJICoKKwkgKiBAcmV0dXJuIGEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUuCisJICovCisJcHVibGljIGxvbmcgZ2V0Qnl0ZXNXcml0dGVuKCkgeworCQlyZXR1cm4gd3JpdHRlbjsKKwl9CisgIAorCS8qKiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzbyBmYXIuICovCisJcHJpdmF0ZSBsb25nIHdyaXR0ZW4gPSAwTDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0RpcmVjdG9yeVNlbGVjdG9yLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9EaXJlY3RvcnlTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkN2M1YjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9EaXJlY3RvcnlTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBDbGFzcyB0aGF0IHRyYXZlcnNlcyBhIGRpcmVjdG9yeSB0cmVlIAorICogYW5kIHNlbGVjdHMgdGhvc2UgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIEFMTCBvZiB0aGUgcmVxdWVzdGVkIGZpbGVzLgorICogSWYgbm8gcmVxdWVzdGVkIGZpbGVzIGFyZSBzcGVjaWZpZWQsIGFuIGVtcHR5IGxpc3Qgd2lsbCBiZSByZXR1cm5lZC4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKi8KK3B1YmxpYyBjbGFzcyBEaXJlY3RvcnlTZWxlY3RvciB7CisJCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsZXM7CisJCisJcHJpdmF0ZSBGaWxlRmlsdGVyIGRpcmVjdG9yeUZpbHRlcjsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBzZWxlY3RvciBmb3IgdGhlIHNwZWNpZmllZCBmaWxlcworCSAqIAorCSAqIEBwYXJhbSBmaWxlcyB0aGUgbGlzdCBvZiBmaWxlcyB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBsb29rIGZvcgorCSAqLworCXB1YmxpYyBEaXJlY3RvcnlTZWxlY3RvcihMaXN0PFN0cmluZz4gZmlsZXMpIHsKKwkJCisJCS8vIGxpc3Qgb2YgcmVxdWVzdGVkIGZpbGVzCisJCXRoaXMuZmlsZXMgPSBmaWxlczsKKwkJCisJCS8vIEZpbGUgZmlsdGVyIHRoYXQgc2VsZWN0cyBkaXJlY3RvcmllcworCQl0aGlzLmRpcmVjdG9yeUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgeworCQkJCXJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCk7CisJCQl9CisJCX07CisJCQorCX0KKwkKKyAgICAvKioKKyAgICAgKiBMb29rcyBmb3IgZmlsZXMgaW4gYWxsIHN1Yi1kaXJlY3RvcmllcyBzdGFydGluZyBmcm9tIHJvb3REaXIuCisgICAgICogCisgICAgICogQHBhcmFtIHJvb3REaXIgc3RhcnRpbmcgcm9vdCBkaXJlY3RvcnkKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbWF0Y2hpbmcgc3ViLWRpcmVjdG9yaWVzIGFzICdmaWxlOi8vL3BhdGgvdG8vZGlyJyBVUklzCisgICAgICovCisJcHVibGljIExpc3Q8U3RyaW5nPiB0cmF2ZXJzZURpcihGaWxlIHJvb3REaXIpIHsKKwkJCQkKKwkJTGlzdDxTdHJpbmc+IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCisJCWlmIChyb290RGlyLmV4aXN0cygpICYmIGZpbGVzIT1udWxsICYmIGZpbGVzLnNpemUoKT4wKSB7CisJCQl0aGlzLnRyYXZlcnNlRGlyKHJvb3REaXIsIHN1YkRpcnMpOworCQl9CisJCQorCQlyZXR1cm4gc3ViRGlyczsKKwkJCisJfQorCQorCS8qKgorCSAqIEludGVybmFsIHJlY3Vyc2lvbiBtZXRob2QuCisJICogCisJICogQHBhcmFtIGRpcgorCSAqIEBwYXJhbSBzdWJEaXJzCisJICovCisgICAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlRGlyKEZpbGUgZGlyLCBMaXN0PFN0cmluZz4gc3ViRGlycykgeworICAgIAkKKyAgICAJLy8gbG9vcCBvdmVyIHJlcXVpcmVkIGZpbGVzLAorICAgIAkvLyBpbmNsdWRlIG9ubHkgaWYgYWxsIGZpbGVzIGFyZSBmb3VuZAorCQlib29sZWFuIGluY2x1ZGUgPSB0cnVlOworICAgICAJZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7CisgICAgIAkJRmlsZSByZXF1aXJlZEZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGUpOworICAgICAJCWlmICghcmVxdWlyZWRGaWxlLmV4aXN0cygpKSB7CisgICAgIAkJCWluY2x1ZGUgPSBmYWxzZTsKKyAgICAgCQl9CisgICAgIAl9CisgICAgIAkKKyAgICAgCS8vIGluY2x1ZGUgdGhpcyBkaXJlY3RvcnkKKyAgICAgCWlmIChpbmNsdWRlKSB7CisgICAgCQlzdWJEaXJzLmFkZCgiZmlsZTovLyIrZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAJfQorICAgIAkKKyAgICAJLy8gcmVjdXJzaW9uIG92ZXIgc3ViLWRpcmVjdG9yaWVzCisgICAgCUZpbGVbXSBzdWJkaXJzID0gZGlyLmxpc3RGaWxlcyggZGlyZWN0b3J5RmlsdGVyICk7CisgICAgICAgIGZvciAoRmlsZSBzdWJkaXIgOiBzdWJkaXJzKSB7CisgICAgICAgIAl0cmF2ZXJzZURpcihzdWJkaXIsIHN1YkRpcnMpOworICAgICAgICB9CisgICAgCQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW0uamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0ZpeGVkQnVmZmVyT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2MjE3ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0ZpeGVkQnVmZmVyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqIFRoaXMgc3RyZWFtIHdyaXRlcyBpdHMgb3V0cHV0IGludG8gYSBieXRlIGJ1ZmZlciBvZiBmaXhlZCBsZW5ndGguCisgKgorICogRm9yIGEgYnVmZmVyIG9mIHNpemUgPHZhcj5uPC92YXI+LCBvbmx5IHRoZSBsYXN0IDx2YXI+bjwvdmFyPiBieXRlcyB3cml0dGVuIGFyZSBldmVyCisgKiBhdmFpbGFibGUuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCS8qKiBDb25zdHJ1Y3QgYSBmaXhlZCBidWZmZXIgb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbSBuIFNpemUgb2YgdGhlIGJ1ZmZlci4KKwkgKi8KKwlwdWJsaWMgRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW0oaW50IG4pIHsKKwkJaWYgKG4gPCAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIG5vbm5lZ2F0aXZlIik7CisJCWJ1ZmZlciA9IG5ldyBieXRlW25dOworCQlsZW5ndGggPSBuOworCQlzaXplID0gMDsKKwkJc3RhcnQgPSAwOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljaGVja0lmQ2xvc2VkKCk7CisJCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuOworCQlpZiAoc2l6ZSA8IGxlbmd0aCkKKwkJCWJ1ZmZlcltzaXplKytdID0gKGJ5dGUpIGI7CisJCWVsc2UgeworCQkJYnVmZmVyW3N0YXJ0XSA9IChieXRlKSBiOworCQkJc3RhcnQgPSAoc3RhcnQgKyAxKSAlIGxlbmd0aDsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBhLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljaGVja0lmQ2xvc2VkKCk7CisJCWlmIChhID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2FuJ3Qgd3JpdGUgZnJvbSBhIG51bGwgYXJyYXkiKTsKKwkJZWxzZSBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBhLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8ICgob2ZmICsgbGVuKSA+IGEubGVuZ3RoKSB8fCAoKG9mZiArIGxlbikgPCAwKSkgeworCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIk9mZnNldCAiICsgb2ZmICsgIiBhbmQgbGVuZ3RoICIgKyBsZW4gKyAiIG5vdCB3aXRoaW4gYXJyYXkgYm91bmRzIik7CisJCX0gZWxzZSBpZiAobGVuID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobGVuID4gbGVuZ3RoKSB7CisJCQlvZmYgKz0gbGVuIC0gbGVuZ3RoOworCQkJbGVuID0gbGVuZ3RoOworCQl9CisJCWludCBjYXBhY2l0eSA9IGxlbmd0aCAtIHNpemU7CisJCWludCBpbnNlcnRpb25JbmRleCA9IHNpemUgPCBsZW5ndGg/IHNpemUgOiBzdGFydDsKKwkJaW50IGluc2VydGlvbkxlbmd0aCA9IE1hdGgubWluKGxlbmd0aCAtIGluc2VydGlvbkluZGV4LCBsZW4pOworCQlpbnQgcmVtYWluaW5nID0gbGVuIC0gaW5zZXJ0aW9uTGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KGEsIG9mZiwgYnVmZmVyLCBpbnNlcnRpb25JbmRleCwgaW5zZXJ0aW9uTGVuZ3RoKTsKKwkJaWYgKHJlbWFpbmluZyA+IDApIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYSwgb2ZmICsgaW5zZXJ0aW9uTGVuZ3RoLCBidWZmZXIsIDAsIHJlbWFpbmluZyk7CisJCQlzdGFydCA9IHJlbWFpbmluZzsKKwkJfSBlbHNlIGlmIChjYXBhY2l0eSA9PSAwKQorCQkJc3RhcnQgPSBpbnNlcnRpb25JbmRleCArIGluc2VydGlvbkxlbmd0aDsKKwkJc2l6ZSA9IE1hdGgubWluKGxlbmd0aCwgc2l6ZSArIGxlbik7CisJfQorCisJcHVibGljIHZvaWQgZmx1c2goKSB7CisJCS8vIE5vdGhpbmcgbmVlZCBiZSBkb25lIGhlcmUKKwl9CisKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJc3RhcnQgPSAtMTsKKwl9CisKKwkvKiogR2V0IHRoZSBidWZmZXIuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBjb25zdHJ1Y3RzIGEgbmV3IGFycmF5IHdob3NlIGNvbnRlbnRzIGlzIHRoZSBkYXRhIHdyaXR0ZW4uICBJdHMKKwkgKiBzaXplIGlzIGVxdWFsIHRvIHRoZSBzbWFsbGVyIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBmaXhlZCBidWZmZXIgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzLgorCSAqCisJICogQHJldHVybiBUaGUgYnVmZmVyLgorCSAqLworCXB1YmxpYyBieXRlW10gZ2V0QnVmZmVyKCkgeworCQlieXRlW10gcmMgPSBuZXcgYnl0ZVtNYXRoLm1pbihzaXplLCBsZW5ndGgpXTsKKwkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHN0YXJ0LCByYywgMCwgc2l6ZSAtIHN0YXJ0KTsKKwkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJjLCBzaXplIC0gc3RhcnQsIHN0YXJ0KTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgd2UndmUgYmVlbiBjbG9zZWQuCisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY2hlY2tJZkNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChzdGFydCA9PSAtMSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW4ndCB3cml0ZSB0byBjbG9zZWQgc3RyZWFtIik7CisJfQorCisJLyoqIExlbmd0aCBvZiB0aGUgYnVmZmVyLiAqLworCXByaXZhdGUgaW50IGxlbmd0aDsKKworCS8qKiBDdXJyZW50IHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4gKi8KKwlwcml2YXRlIGludCBzaXplOworCisJLyoqIEN1cnJlbnQgc3RhcnQgb2Zmc2V0IG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIuICBJZiBuZWdhdGl2ZSwgYnVmZmVyIGlzIGNsb3NlZC4gKi8KKwlwcml2YXRlIGludCBzdGFydDsKKworCS8qKiBUaGUgYnVmZmVyLiAqLworCXByaXZhdGUgYnl0ZVtdIGJ1ZmZlcjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZy5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0ZWUzYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZy5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKiBUaGUgbG9nLgorICoKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYXBwbGljYXRpb24tIG9yIGFwcGxldC13aWRlIGxvZ2dpbmcgZmFjaWxpdHkuICBJZiB5b3VyCisgKiBhcHBsaWNhdGlvbiBuZWVkcyB0byBsb2cgbWVzc2FnZXMsIGhlcmUncyB5b3VyIGNsYXNzLgorICoKKyAqIDxwPlRvIGxvZyBhIG1lc3NhZ2UsIHlvdSBjYWxsIG9uZSBvZiB0aGUgPGNvZGU+Z2V0PC9jb2RlPiBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdG8KKyAqIHlpZWxkIGEge0BsaW5rIExvZ1dyaXRlcn0gb2JqZWN0LiAgWW91IGNhbiB0aGVuIGNhbGwgbWV0aG9kcyBsaWtlIHtAbGluaworICogTG9nV3JpdGVyI3ByaW50bG4oU3RyaW5nKX0gdG8gbG9nIGEgbGluZSBvZiB0ZXh0LiAgQSB0eXBpY2FsIGludm9jYXRpb24gaXMKKyAqCisgKiA8cHJlPkxvZy5nZXQoKS5wcmludGxuKCJCdWZmZXIgb2YgbGVuZ3RoICIgKyBsZW5ndGggKyAiIGFsbG9jYXRlZC4iKTs8L3ByZT4KKyAqCisgKiA8cD5UaGlzIGxvZ3MgdGhlIGdpdmVuIHRleHQgdXNpbmcgdGhlIGRlZmF1bHQgc291cmNlIHN0cmluZywgYW5kIHVuZGVyIHRoZSBkZWZhdWx0CisgKiBjYXRlZ29yeSwgYW5kIHRpbWVzdGFtcGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZS4gIFlvdSBjYW4gcmV1c2UgdGhlCisgKiA8Y29kZT5Mb2dXcml0ZXI8L2NvZGU+LCBidXQgdGhlIHRpbWVzdGFtcCwgc291cmNlLCBhbmQgY2F0ZWdvcnkgd29uJ3QgY2hhbmdlLiAgWW91CisgKiBzaG91bGQgZ2V0IGEgZnJlc2ggPGNvZGU+TG9nV3JpdGVyPC9jb2RlPi4KKyAqCisgKiA8cD48c3Ryb25nPlNvdXJjZXM8L3N0cm9uZz4gaWRlbnRpZnkgaW5kZXBlbmRlbnQgb3JpZ2lucyBvZiBsb2cgbWVzc2FnZXMsIHN1Y2ggYXMKKyAqIGluZGVwZW5kZW50IHRocmVhZHMgaW4gYSBwcm9ncmFtLCBvciBpbmRlcGVuZGVudCBwcm9ncmFtcy4gIFNvdXJjZXMgYXJlIGp1c3Qgc3RyaW5ncy4KKyAqIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgc291cmNlLCB5b3UgZ2V0IGEgZGVmYXVsdCBzb3VyY2UuICBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdAorICogc291cmNlIHdpdGgge0BsaW5rICNzZXREZWZhdWx0U291cmNlfS4gIFlvdSA8ZW0+YWx3YXlzPC9lbT4gZ2V0IGEgc291cmNlIHdpdGggZXZlcnkKKyAqIG1lc3NhZ2UsIGV2ZW4gaWYgaXQncyBhIGRlZmF1bHQgc291cmNlLiAgSWYgeW91IGRvbid0IG90aGVyd2lzZSBzZXQgYSBkZWZhdWx0IHNvdXJjZQorICogc3RyaW5nLCB0aGUgc291cmNlIGlzICJhcHAiLgorICoKKyAqIDxwPjxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiBpZGVudGlmeSBkaWZmZXJlbnQgY2xhc3NlcyBvciBwcmlvcml0ZXMgb2YgbWVzc2FnZXMuCisgKiBDYXRlZ29yaWVzIGNhbiBiZSBzaW1wbGUgc3RyaW5ncyBsaWtlICJ3YXJuaW5nIiBvciAiZGVidWciLCBvciB0aGV5IGNhbiBiZSBjb21wbGV4CisgKiBvYmplY3RzLiAgWW91IGdldCB0byBkZWZpbmUgeW91ciBjYXRlZ29yaWVzLiAgWW91ciBncm91cCBvdWdodCB0byBhZ3JlZSBvbiBjYXRlZ29yaWVzLAorICogdGhvdWdoLiAgSWYgeW91IGRvbid0IHNwZWNpZnkgYSBjYXRlZ29yeSwgeW91IGdldCBhIGRlZmF1bHQgY2F0ZWdvcnkuICBZb3UgY2FuIHNldCB0aGUKKyAqIGRlZmF1bHQgY2F0ZWdvcnkgd2l0aCB7QGxpbmsgI3NldERlZmF1bHRDYXRlZ29yeX0uICBJZiB5b3UgZG9uJ3QgY2FsbCB0aGF0IG1ldGhvZCwgdGhlCisgKiBkZWZhdWx0IGNhdGVnb3J5IGlzIHRoZSBTdHJpbmcgb2JqZWN0ICJtZXNzYWdlIi4KKyAqCisgKiA8cD48c3Ryb25nPlN0cmVhbXM8L3N0cm9uZz4gaWRlbnRpZnkgaW5kZXBlbmRlbnQgYWN0aXZpdGllcyB3aXRoaW4gYSBwcm9ncmFtLCB3aGljaAorICogb2Z0ZW4gaGF2ZSB0cmFuc2llbnQgbGlmZXNwYW5zLiAgVGhleSdyZSA8ZW0+bm90PC9lbT4gc2VwYXJhdGUgb3V0cHV0IHN0cmVhbXMsIGJ1dAorICogaW5zdGVhZCBhcmUgc2VwYXJhdGUsIG5hbWVkIGVudGl0aWVzIHJlcHJlc2VudGluZyBzZXBhcmF0ZSBhY3Rpdml0aWVzIChhbHRob3VnaCBhCisgKiB7QGxpbmsgTG9nTGlzdGVuZXJ9IG1heSBwdXQgbWVzc2FnZXMgaW50byBzZXBhcmF0ZSBvdXRwdXQgc3RyZWFtcyBpZGVudGlmaWVkIGJ5IGVhY2gKKyAqIHN0cmVhbSkuICBBY3Rpdml0eSBzdHJlYW1zIGFyZSBpZGVudGlmaWVkIGJ5IHN0cmluZ3MuICBUbyBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIHN0b3AKKyAqIG9mIHN0cmVhbXMsIGNhbGwge0BsaW5rICNzdGFydFN0cmVhbX0gYW5kIHtAbGluayAjc3RvcFN0cmVhbX0uICBUaGVzZSBzZW5kCisgKiBzdHJlYW0tc3RhcnRlZCBhbmQgc3RyZWFtLXN0b3BwZWQgZXZlbnRzIHRvIHRoZSBsb2cgbGlzdGVuZXJzLCB3aG8gbWF5IGNob29zZSB0byBwYXkKKyAqIGF0dGVudGlvbiB0byB0aGVtIG9yIGlnbm9yZSB0aGVtLiAgWW91IGNhbiB1c2Ugc3RyZWFtcyB0byBpbmRpY2F0ZSB0byB0aGUgbG9nIHRoZSBzdGFydAorICogYW5kIHRoZSBzdG9wIG9mIGFjdGl2aXRpZXMgc3VjaCBhcyBhbiBhbmFseXN0IGV4YW1pbmluZyB0aGUgc3lzdGVtLCBvciBhIHNlcnZlcgorICogaGFuZGxpbmcgYSBwYXJ0aWN1bGFyIGNsaWVudC4KKyAqCisgKiA8cD5BbGwgbWVzc2FnZXMgbG9nZ2VkIHdpdGggdGhpcyBjbGFzcyBnbyB0byBvbmUgb3IgbW9yZSB7QGxpbmsgTG9nTGlzdGVuZXJ9IG9iamVjdHMuCisgKiBBIExvZ0xpc3RlbmVyIGFjY2VwdHMgbG9nZ2luZyBldmVudHMsIHN1Y2ggYXMgYSBtZXNzYWdlIGJlaW5nIGxvZ2dlZCwgYW5kIGRvZXMKKyAqIHNvbWV0aGluZyB3aXRoIGl0LCBzdWNoIGFzIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdG8gYSBmaWxlLiAgQ2FsbCB7QGxpbmsgI2FkZExvZ0xpc3RlbmVyfQorICogdG8gYWRkIGEgbG9nIGxpc3RlbmVyLiAgTG9nZ2luZyBvZiBhIG1lc3NhZ2UsIHN0YXJ0aW5nIGEgc3RyZWFtLCBhbmQgc3RvcHBpbmcgYSBzdHJlYW0KKyAqIGFsbCBnZXQgdHVybmVkIGludG8ge0BsaW5rIExvZ0V2ZW50fXMgYW5kIGFyZSBtdWx0aWNhc3RlZCB0byBldmVyeSByZWdpc3RlcmVkIGxpc3RlbmVyLgorICoKKyAqIDxwPlRoZSBsb2dnaW5nIGZhY2lsaXR5IGJvb3RzdHJhcHMgaXRzZWxmIHdpdGggb25lIG9yIG1vcmUgbG9nIGxpc3RlbmVycyBzcGVjaWZpZWQgYnkKKyAqIHRoZSBzeXN0ZW0gcHJvcGVydHkgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uTG9nLmxvZ2dlcnM8L2NvZGU+LiAgVGhpcyBwcm9wZXJ0eSBtdXN0IGJlIGEKKyAqIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNvbXBsZXRlIGNsYXNzIG5hbWVzLiAgVGhlIGxvZ2dpbmcgZmFjaWxpdHkgd2lsbCBjcmVhdGUgYW4KKyAqIG9iamVjdCBvZiBlYWNoIGNsYXNzIGxpc3RlZCBhbmQgYWRkIGl0IGFzIGlmIHlvdSBoYWQgY2FsbGVkCisgKiA8Y29kZT5hZGRMb2dMaXN0ZW5lcjwvY29kZT4uICAoWW91IGNhbiBzcGVjaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IKKyAqIGluIHRoZSBhcHBsZXQgdGFnLikKKyAqCisgKiBAc2VlIExvZ0xpc3RlbmVyCisgKiBAc2VlIExvZ1dyaXRlcgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgTG9nIHsKKwkvKiogQ3VycmVudGx5IHJlZ2lzdGVyZWQgTG9nTGlzdGVuZXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIFZlY3RvciBsaXN0ZW5lcnM7CisKKwlzdGF0aWMgeworCQlsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7CisJCVN0cmluZyBsb2dnZXJzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5Mb2cubG9nZ2VycyIsICIiKTsKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobG9nZ2Vycyk7CisJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQlTdHJpbmcgY2xhc3NOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJdHJ5IHsKKwkJCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJCQlMb2dMaXN0ZW5lciBsaXN0ZW5lciA9IChMb2dMaXN0ZW5lcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKwkJCQlhZGRMb2dMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2FuJ3QgY3JlYXRlIGxvZyBsaXN0ZW5lciBvYmplY3QgZnJvbSBjbGFzcyAiICsgY2xhc3NOYW1lICsgIjogIiArIGUpOworCQkJCVN5c3RlbS5leGl0KDEpOworCQkJfQorCQl9CisJfQorCisJLyoqIEdldCBhIHdyaXRlciB0byBsb2cgbWVzc2FnZXMuCisJICoKKwkgKiBUaGUgd3JpdGVyIHdpbGwgbG9nIG1lc3NhZ2VzIHdpdGggdGhlIGN1cnJlbnQgdGltZSwgZGVmYXVsdCBjYXRlZ29yeSwgYW5kCisJICogZGVmYXVsdCBzb3VyY2UuICBNZXNzYWdlcyB3aWxsIGdvIGludG8gdGhlIGdlbmVyYWwgbG9nLgorCSAqCisJICogQHJldHVybiBBIHdyaXRlciB3aXRoIHdoaWNoIHlvdSBjYW4gbG9nIG1lc3NhZ2VzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTG9nV3JpdGVyIGdldCgpIHsKKwkJaWYgKGxhc3RXcml0ZXIgIT0gbnVsbCAmJiAhbGFzdFdyaXRlci5pc0ZsdXNoZWQoKSkKKwkJCXJldHVybiBsYXN0V3JpdGVyOworCQllbHNlCisJCQlyZXR1cm4gZ2V0KG5ldyBEYXRlKCksIGdldERlZmF1bHRTb3VyY2UoKSwgZ2V0RGVmYXVsdENhdGVnb3J5KCkpOworCX0KKworCS8qKiBHZXQgYSB3cml0ZXIgdG8gbG9nIG1lc3NhZ2VzLgorCSAqCisJICogVGhlIHdyaXRlciB3aWxsIGxvZyBtZXNzYWdlcyB3aXRoIHRoZSBjdXJyZW50IHRpbWUsIHNwZWNpZmllZCBjYXRlZ29yeSwgYW5kCisJICogZGVmYXVsdCBzb3VyY2UuICBNZXNzYWdlcyB3aWxsIGdvIGludG8gdGhlIGdlbmVyYWwgbG9nLgorCSAqCisJICogQHBhcmFtIGNhdGVnb3J5IFRoZSBtZXNzYWdlcycgY2F0ZWdvcnkuCisJICogQHJldHVybiBBIHdyaXRlciB3aXRoIHdoaWNoIHlvdSBjYW4gbG9nIG1lc3NhZ2VzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTG9nV3JpdGVyIGdldChPYmplY3QgY2F0ZWdvcnkpIHsKKwkJcmV0dXJuIGdldChuZXcgRGF0ZSgpLCBnZXREZWZhdWx0U291cmNlKCksIGNhdGVnb3J5KTsKKwl9CisKKwkvKiogR2V0IGEgd3JpdGVyIHRvIGxvZyBtZXNzYWdlcy4KKwkgKgorCSAqIFRoZSB3cml0ZXIgd2lsbCBsb2cgbWVzc2FnZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRpbWUsIHNwZWNpZmllZCBjYXRlZ29yeSwgYW5kCisJICogc3BlY2lmaWVkIHNvdXJjZS4KKwkgKgorCSAqIEBwYXJhbSB0aW1lc3RhbXAgVGhlIHRpbWUgZm9yIG1lc3NhZ2VzIGxvZ2dlZCB3aXRoIHRoZSByZXR1cm5lZCB3cml0ZXIuCisJICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9mIHRoZSBsb2cgbWVzc2FnZS4KKwkgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIG1lc3NhZ2VzJyBjYXRlZ29yeS4KKwkgKiBAcmV0dXJuIEEgd3JpdGVyIHdpdGggd2hpY2ggeW91IGNhbiBsb2cgbWVzc2FnZXMuCisJICovCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTG9nV3JpdGVyIGdldChEYXRlIHRpbWVzdGFtcCwgU3RyaW5nIHNvdXJjZSwgT2JqZWN0IGNhdGVnb3J5KSB7CisJCWxhc3RXcml0ZXIgPSBuZXcgTG9nV3JpdGVyKHRpbWVzdGFtcCwgc291cmNlLCBjYXRlZ29yeSk7CisJCXJldHVybiBsYXN0V3JpdGVyOworCX0KKworCS8qKiBTdGFydCBhIG5ldyBsb2cgc3RyZWFtLgorCSAqCisJICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIHtAbGluayBMb2dMaXN0ZW5lcn1zIHRoYXQgYSBuZXcgbG9nZ2luZyBzdHJlYW0gaGFzCisJICogc3RhcnRlZC4KKwkgKgorCSAqIEBwYXJhbSBzdHJlYW0gVGhlIG5hbWUgb2YgdGhlIHN0cmVhbS4KKwkgKiBAcGFyYW0gdGltZXN0YW1wIFRoZSB0aW1lIHRoZSBzdHJlYW0gc3RhcnRlZC4gIFRvIHVzZSB0aGUgY3VycmVudCB0aW1lLCBwYXNzIGEgbmV3IHtAbGluayBEYXRlfSBvYmplY3QuCisJICogQHBhcmFtIHNvdXJjZSBBIHN0cmluZyBpZGVudGlmeWluZyB3aG8gb3Igd2hhdCBzdGFydGVkIHRoZSBzdHJlYW0uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0U3RyZWFtKFN0cmluZyBzdHJlYW0sIERhdGUgdGltZXN0YW1wLCBTdHJpbmcgc291cmNlKSB7CisJCUxvZ0V2ZW50IGV2ZW50ID0gbnVsbDsKKwkJZm9yIChFbnVtZXJhdGlvbiBlID0gbGlzdGVuZXJzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisJCQkvLyBMYXppbHkgY3JlYXRlIHRoZSBldmVudC4KKwkJCWlmIChldmVudCA9PSBudWxsKQorCQkJCWV2ZW50ID0gbmV3IExvZ0V2ZW50KHN0cmVhbSwgdGltZXN0YW1wLCBzb3VyY2UpOworCQkJKChMb2dMaXN0ZW5lcikgZS5uZXh0RWxlbWVudCgpKS5zdHJlYW1TdGFydGVkKGV2ZW50KTsKKwkJfQorCX0KKworCS8qKiBTdG9wIGEgc3RyZWFtLgorCSAqCSAgICAKKwkgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUge0BsaW5rIExvZ0xpc3RlbmVyfXMgdGhhdCBhIGxvZ2dpbmcgc3RyZWFtIGhhcyBzdG9wcGVkLgorCSAqCisJICogQHBhcmFtIHN0cmVhbSBUaGUgbmFtZSBvZiB0aGUgc3RyZWFtIHRoYXQgc3RvcHBlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcFN0cmVhbShTdHJpbmcgc3RyZWFtKSB7CisJCUxvZ0V2ZW50IGV2ZW50ID0gbnVsbDsKKwkJZm9yIChFbnVtZXJhdGlvbiBlID0gbGlzdGVuZXJzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisJCQkvLyBMYXppbHkgY3JlYXRlIHRoZSBldmVudC4KKwkJCWlmIChldmVudCA9PSBudWxsKQorCQkJCWV2ZW50ID0gbmV3IExvZ0V2ZW50KHN0cmVhbSk7CisJCQkoKExvZ0xpc3RlbmVyKSBlLm5leHRFbGVtZW50KCkpLnN0cmVhbVN0b3BwZWQoZXZlbnQpOworCQl9CisJfQorCisJLyoqIExvZyBhIG1lc3NhZ2UuCisJICoKKwkgKiBUaGUge0BsaW5rIExvZ1dyaXRlcn1zIGNhbGwgdGhpcyB3aGVuIHRoZXkndmUgYnVpbHQgdXAgYSBjb21wbGV0ZSBtZXNzYWdlIGFuZAorCSAqIHdhbnQgaXQgbXVsdGljYXN0ZWQgdG8gdGhlIHtAbGluayBMb2dMaXN0ZW5lcn1zLgorCSAqCisJICogQHBhcmFtIHRpbWVzdGFtcCBUaGUgbWVzc2FnZSdzIHRpbWVzdGFtcC4KKwkgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgbGFiZWwgb2YgdGhlIG1lc3NhZ2UuCisJICogQHBhcmFtIGNhdGVnb3J5IFRoZSBtZXNzYWdlJ3MgY2F0ZWdvcnkuCisJICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCisJICovCisJc3RhdGljIHZvaWQgbG9nTWVzc2FnZShEYXRlIHRpbWVzdGFtcCwgU3RyaW5nIHNvdXJjZSwgT2JqZWN0IGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgeworCQlMb2dFdmVudCBldmVudCA9IG51bGw7CisJCWZvciAoRW51bWVyYXRpb24gZSA9IGxpc3RlbmVycy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworCQkJLy8gTGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQuCisJCQlpZiAoZXZlbnQgPT0gbnVsbCkKKwkJCQlldmVudCA9IG5ldyBMb2dFdmVudCh0aW1lc3RhbXAsIHNvdXJjZSwgY2F0ZWdvcnksIG1lc3NhZ2UpOworCQkJKChMb2dMaXN0ZW5lcikgZS5uZXh0RWxlbWVudCgpKS5tZXNzYWdlTG9nZ2VkKGV2ZW50KTsKKwkJfQorCX0KKworCS8qKiBTZXQgdGhlIGRlZmF1bHQgc291cmNlLgorCSAqCisJICogVGhpcyBzZXRzIHRoZSBkZWZhdWx0IHNvdXJjZSBsYWJlbCB1c2VkIGZvciBsb2dnaW5nLgorCSAqCisJICogQHBhcmFtIHNvdXJjZSBUaGUgbmV3IGRlZmF1bHQgc291cmNlIGxhYmVsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKKwkJaWYgKHNvdXJjZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGEgbnVsbCBkZWZhdWx0IHNvdXJjZSIpOworCQlkZWZhdWx0U291cmNlID0gc291cmNlOworCX0KKworCS8qKiBHZXQgdGhlIGRlZmF1bHQgc291cmNlLgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCBzb3VyY2UgbGFiZWwuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNvdXJjZSgpIHsKKwkJcmV0dXJuIGRlZmF1bHRTb3VyY2U7CisJfQorCisJLyoqIFNldCB0aGUgZGVmYXVsdCBjYXRlZ29yeS4KKwkgKgorCSAqIFRoaXMgc2V0cyB0aGUgY2F0ZWdvcnkgb2JqZWN0IHRoYXQncyB1c2VkIGJ5IGRlZmF1bHQgZm9yIGxvZ2dpbmcuCisJICoKKwkgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIG5ldyBkZWZhdWx0IGNhdGVnb3J5IG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdENhdGVnb3J5KE9iamVjdCBjYXRlZ29yeSkgeworCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHNldCBhIG51bGwgZGVmYXVsdCBjYXRlZ29yeSIpOworCQlkZWZhdWx0Q2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwl9CisKKwkvKiogR2V0IHRoZSBkZWZhdWx0IGNhdGVnb3J5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCBjYXRlZ29yeSBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVmYXVsdENhdGVnb3J5KCkgeworCQlyZXR1cm4gZGVmYXVsdENhdGVnb3J5OworCX0KKwkKKwkvKiogQWRkIGEgbG9nIGxpc3RlbmVyLgorCSAqCisJICogVGhlIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgd2hlbmV2ZXIgYSBtZXNzYWdlIGlzIGxvZ2dlZCwgYSBzdHJlYW0gc3RhcnRlZCwKKwkgKiBvciBhIHN0cmVhbSBzdG9wcGVkLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZExvZ0xpc3RlbmVyKExvZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmIChsaXN0ZW5lciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgYWRkIGEgbnVsbCBsb2cgbGlzdGVuZXIiKTsKKwkJbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOworCX0KKworCS8qKiBSZW1vdmUgYSBsb2cgbGlzdGVuZXIuCisJICogIAorCSAqIFRoZSBsaXN0ZW5lciB3b24ndCByZWNlaXZlIGFueW1vcmUgZXZlbnRzIHVubGVzcyBpdCdzIGFkZGVkIGJhY2suCisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTG9nTGlzdGVuZXIoTG9nTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKGxpc3RlbmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCByZW1vdmUgYSBudWxsIGxvZyBsaXN0ZW5lciIpOworCQlsaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7CisJfQorCisJLyoqIFRoZSBkZWZhdWx0IHNvdXJjZSBsYWJlbC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNvdXJjZSA9ICJhcHAiOworCisJLyoqIFRoZSBkZWZhdWx0IGNhdGVnb3J5IG9iamVjdC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgZGVmYXVsdENhdGVnb3J5ID0gIm1lc3NhZ2UiOworCisJLyoqIExhc3QgbG9nIHdyaXRlciBjcmVhdGVkIHNvIGl0IGNhbiBiZSByZXVzZWQuICovCisJcHJpdmF0ZSBzdGF0aWMgTG9nV3JpdGVyIGxhc3RXcml0ZXI7CisKKwkvKiogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KKwkgKgorCSAqIFdoZW4gd2UgY29udmVydCB0byBKYXZhIDIsIHRoaXMgc2hvdWxkIHRocm93IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorCSAqLworCXByaXZhdGUgTG9nKCkge30KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ0V2ZW50LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9Mb2dFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjY4ODAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9Mb2dFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqIExvZ2dpbmcgZXZlbnQuCisgKgorICogQSBsb2dnaW5nIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgZGVsaXZlcmVkIHRvIGFsbCByZWdpc3RlcmVkIGxvZyBsaXN0ZW5lcnMgd2hlbiBhCisgKiBtZXNzYWdlIHdhcyBsb2dnZWQsIGEgbG9nZ2luZyBzdHJlYW0gd2FzIHN0YXJ0ZWQsIG9yIHdoZW4gYSBsb2dnaW5nIHN0cmVhbSB3YXMgc3RvcHBlZC4KKyAqCisgKiA8cD5Vc2UgdGhlIHZhcmlvdXMgcXVlcnkgbWV0aG9kcyB0byBkZXRlcm1pbmUgdGhlIGRldGFpbHMgb2YgdGhlIGV2ZW50LiAgVGhlIGV2ZW50CisgKiBzb3VyY2UgKGZyb20ge0BsaW5rIEV2ZW50T2JqZWN0I2dldFNvdXJjZX0pIGlzIGFsd2F5cyBhIHtAbGluayBTdHJpbmd9LgorICoKKyAqIEBzZWUgTG9nCisgKiBAc2VlIExvZ0xpc3RlbmVyCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBMb2dFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKwkvKiogQ3JlYXRlIGEgIm1lc3NhZ2UgbG9nZ2VkIiBldmVudC4KKwkgKgorCSAqIEBwYXJhbSB0aW1lc3RhbXAgVGhlIG1lc3NhZ2UncyB0aW1lc3RhbXAuCisJICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGxhYmVsIG9mIHRoZSBtZXNzYWdlLgorCSAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgbWVzc2FnZSdzIGNhdGVnb3J5LgorCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBMb2dFdmVudChEYXRlIHRpbWVzdGFtcCwgU3RyaW5nIHNvdXJjZSwgT2JqZWN0IGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihzb3VyY2UpOworCQl0eXBlID0gTVNHX0xPR0dFRDsKKwkJdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgInN0cmVhbSBzdGFydGVkIiBldmVudC4KKwkgKgorCSAqIEBwYXJhbSBzdHJlYW0gVGhlIG5hbWUgb2YgdGhlIHN0cmVhbS4KKwkgKiBAcGFyYW0gdGltZXN0YW1wIFRoZSB0aW1lIHRoZSBzdHJlYW0gc3RhcnRlZC4KKwkgKiBAcGFyYW0gc291cmNlIEEgc3RyaW5nIGlkZW50aWZ5aW5nIHdobyBvciB3aGF0IHN0YXJ0ZWQgdGhlIHN0cmVhbS4KKwkgKi8KKwlwdWJsaWMgTG9nRXZlbnQoU3RyaW5nIHN0cmVhbSwgRGF0ZSB0aW1lc3RhbXAsIFN0cmluZyBzb3VyY2UpIHsKKwkJc3VwZXIoc291cmNlKTsKKwkJdHlwZSA9IFNUUkVBTV9TVEFSVEVEOworCQl0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKwkJdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJfQorCisJLyoqIENyZWF0ZSBhICJzdHJlYW0gc3RvcHBlZCIgZXZlbnQuCisJICoKKwkgKiBAcGFyYW0gc3RyZWFtIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0uCisJICovCisJcHVibGljIExvZ0V2ZW50KFN0cmluZyBzdHJlYW0pIHsKKwkJc3VwZXIoc3RyZWFtKTsKKwkJdHlwZSA9IFNUUkVBTV9TVE9QUEVEOworCQl0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKwl9CisKKwkvKiogR2V0IHRoZSBjYXRlZ29yeS4KKwkgKgorCSAqIEZvciBtZXNzYWdlIGxvZ2dlZCBldmVudHMsIHRoaXMgaXMgdGhlIGNhdGVnb3J5IGZvciB0aGUgbWVzc2FnZS4gRm9yIGFsbCBvdGhlcgorCSAqIGV2ZW50cywgdGhpcyByZXR1cm5zIG51bGwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjYXRlZ29yeSwgb3IgbnVsbC4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldENhdGVnb3J5KCkgeworCQlyZXR1cm4gY2F0ZWdvcnk7CisJfQorCisJLyoqIEdldCB0aGUgbWVzc2FnZS4KKwkgKiAgCisJICogRm9yIG1lc3NhZ2UgbG9nZ2VkIGV2ZW50cywgdGhpcyBpcyB0aGUgYWN0dWFsIG1lc3NhZ2UgdGV4dC4gRm9yIGFsbCBvdGhlcgorCSAqIGV2ZW50cywgdGhpcyByZXR1cm5zIG51bGwuCisJICoKKwkgKkByZXR1cm4gVGhlIG1lc3NhZ2UsIG9yIG51bGwuCisJICovCisJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworCQlyZXR1cm4gbWVzc2FnZTsKKwl9CisKKwkvKiogR2V0IHRoZSBzdHJlYW0uCisJICoKKwkgKiBGb3Igc3RyZWFtIHN0YXJ0ZWQgYW5kIHN0b3BwZWQgZXZlbnRzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gdGhhdCB3YXMKKwkgKiBzdGFydGVkIG9yIHN0b3BwZWQuICBGb3IgbWVzc2FnZSBsb2dnZWQgZXZlbnRzLCB0aGlzIGlzIG51bGwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzdHJlYW0sIG9yIG51bGwuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJlYW0oKSB7CisJCXJldHVybiBzdHJlYW07CisJfQorCisJLyoqIEdldCB0aGUgdGltZXN0YW1wLgorCSAqCisJICogRm9yIG1lc3NhZ2UgbG9nZ2VkIGFuZCBzdHJlYW0gc3RhcnRlZCBldmVudHMsIHRoaXMgaXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUKKwkgKiBldmVudC4gIEZvciBzdHJlYW0gc3RvcHBlZCBldmVudHMsIHRoaXMgaXMgbnVsbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRpbWVzdGFtcCwgb3IgbnVsbC4KKwkgKi8KKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAoKSB7CisJCXJldHVybiB0aW1lc3RhbXA7CisJfQorCisJLyoqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGV2ZW50LgorCSAqCisJICogQHJldHVybiBBIHN0cmluZyBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiB0aGUgZXZlbnQuCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIE1TR19MT0dHRUQ6CisJCQkJcmV0dXJuICJMb2cgRXZlbnQgKG1lc3NhZ2UgbG9nZ2VkKSI7CisJCQljYXNlIFNUUkVBTV9TVEFSVEVEOgorCQkJCXJldHVybiAiTG9nIEV2ZW50IChzdHJlYW0gc3RhcnRlZCkiOworCQkJY2FzZSBTVFJFQU1fU1RPUFBFRDoKKwkJCQlyZXR1cm4gIkxvZyBFdmVudCAoc3RyZWFtIHN0b3BwZWQpIjsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuICJVbmtub3duIExvZyBFdmVudCBUeXBlIjsKKwkJfQorCX0KKworCS8qKiBUaGUgdGltZXN0YW1wOiBudWxsIGlmIHRoaXMgaXMgYSAic3RyZWFtIHN0b3BwZWQiIGV2ZW50LgorCSAqLworCXByaXZhdGUgRGF0ZSB0aW1lc3RhbXA7CisKKwkvKiogVGhlIHN0cmVhbTogbnVsbCBmb3IgbG9nZ2luZy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBzdHJlYW07CisKKwkvKiogVGhlIGNhdGVnb3J5OiBudWxsIGZvciBzdHJlYW0gc3RhcnRlZC9zdG9wcGVkIGV2ZW50cy4KKwkgKi8KKwlwcml2YXRlIE9iamVjdCBjYXRlZ29yeTsKKworCS8qKiBUaGUgbWVzc2FnZTogbm9ubnVsbCBvbmx5IGZvciAibWVzc2FnZSBsb2dnZWQiIGV2ZW50cy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisJLyoqIFRoZSB0eXBlIG9mIGV2ZW50IHRoaXMgaXMuCisJICoKKwkgKiBUaGlzIGdldHMgb25lIG9mIHRoZSB2YWx1ZXMgPGNvZGU+TVNHX0xPR0dFRDwvY29kZT4sIDxjb2RlPlNUUkVBTV9TVEFSVEVEPC9jb2RlPiwgb3IgPGNvZGU+U1RSRUFNX1NUT1BQRUQ8L2NvZGU+LgorCSAqLworCXByaXZhdGUgaW50IHR5cGU7CisKKwkvKiogVGhlICJtZXNzYWdlIGxvZ2dlZCIgZXZlbnQgdHlwZS4KKwkgKgorCSAqIEBzZWUgI3R5cGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xPR0dFRCA9IDE7CisKKwkvKiogVGhlICJzdHJlYW0gc3RhcnRlZCIgZXZlbnQgdHlwZS4KKwkgKgorCSAqIEBzZWUgI3R5cGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX1NUQVJURUQgPSAyOworCisJLyoqIFRoZSAic3RyZWFtIHN0b3BwZWQiIGV2ZW50IHR5cGUuCisJICoKKwkgKiBAc2VlICN0eXBlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUkVBTV9TVE9QUEVEID0gMzsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ0ZpbHRlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTG9nRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0YTE4NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKKy8qKiBBIGZpbHRlciBmb3IgbG9nIG1lc3NhZ2VzLgorICoKKyAqIFRoaXMgaXMgYSB7QGxpbmsgTG9nTGlzdGVuZXJ9IHRoYXQgZmlsdGVycyBvdXQgYW5kIHBhc3NlcyB0aHJvdWdoIGNlcnRhaW4gY2F0ZWdvcmllcyBvZgorICogbG9nIG1lc3NhZ2VzIHRvIGFub3RoZXIgPGNvZGU+TG9nTGlzdGVuZXI8L2NvZGU+LiAgV2hlbiB5b3UgY29uc3RydWN0IHRoaXMgbGlzdGVuZXIsCisgKiB5b3UgcGFzcyBhIGJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyBpdHMgcGFzcy10aHJvdWdoIG1vZGU6IGlmIHRydWUsIGl0IHBhc3NlcyBsb2cKKyAqIG1lc3NhZ2VzIGJ5IGRlZmF1bHQgYW5kIGZpbHRlcnMgb3V0IHNwZWNpZmllZCBjYXRlZ29yaWVzOyBpZiBmYWxzZSwgaXQgZmlsdGVycyBvdXQKKyAqIG1lc3NhZ2VzIGJ5IGRlZmF1bHQgYW5kIHBhc3NlcyB0aHJvdWdoIHNwZWNpZmllZCBjYXRlZ29yaWVzLgorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGlzIGZpbHRlciBvbmx5IGFmZmVjdHMgZXZlbnRzIHNlbnQgdG8ge0BsaW5rIExvZ0xpc3RlbmVyI21lc3NhZ2VMb2dnZWR9LgorICogRXZlbnRzIHNlbnQgdG8ge0BsaW5rIExvZ0xpc3RlbmVyI3N0cmVhbVN0YXJ0ZWR9IGFuZCB7QGxpbmsgTG9nTGlzdGVuZXIjc3RyZWFtU3RvcHBlZH0KKyAqIGFyZSBwYXNzZWQgdGhyb3VnaCByZWdhcmRsZXNzLgorICoKKyAqIDxwPkNhdGVnb3JpZXMgdXNlZCBieSB0aGlzIGZpbHRlciBzaG91bGQgaW1wbGVtZW50IHRoZWlyIHtAbGluayBPYmplY3QjaGFzaENvZGV9IGFuZAorICoge0BsaW5rIE9iamVjdCNlcXVhbHN9IG1ldGhvZHMuCisgKgorICogQHNlZSBMb2cKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIExvZ0ZpbHRlciBpbXBsZW1lbnRzIExvZ0xpc3RlbmVyIHsKKwkvKiogQ3JlYXRlIGEgbG9nIGZpbHRlci4KKwkgKgorCSAqIFRoZSBsb2cgZmlsdGVyIHBhc3NlcyB0aHJvdWdoIGFuZCBmaWx0ZXJzIG91dCBtZXNzYWdlcyBiZWZvcmUgc2VuZGluZyB0aGVtIG9udG8KKwkgKiB0aGUgZ2l2ZW4gbG9nIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyIFdoYXQgb2JqZWN0IHdpbGwgZ2V0IGZpbHRlcmVkIGxvZyBtZXNzYWdlcy4KKwkgKiBAcGFyYW0gcGFzc1Rocm91Z2ggSWYgdHJ1ZSwgcGFzcyBtZXNzYWdlcyB0aHJvdWdoIGJ5IGRlZmF1bHQgYW5kIGZpbHRlciBvdXQgdGhlCisJICogc3BlY2lmaWVkIDx2YXI+Y2F0ZWdvcmllczwvdmFyPiBvZiBtZXNzYWdlcy4gSWYgZmFsc2UsIGZpbHRlciBvdXQgbWVzc2FnZXMgYnkKKwkgKiBkZWZhdWx0IGFuZCBwYXNzIHRocm91Z2ggdGhlIHNwZWNpZmllZCA8dmFyPmNhdGVnb3JpZXM8L3Zhcj4uCisJICogQHBhcmFtIGNhdGVnb3JpZXMgQ2F0ZWdvcmllcyBvZiBtZXNzYWdlcyB0byBmaWx0ZXIgb3V0IChpZgorCSAqIDx2YXI+cGFzc1Rocm91Z2g8L3Zhcj4gaXMgdHJ1ZSkgb3IgdG8gcGFzcyB0aHJvdWdoIChpZiA8dmFyPnBhc3NUaHJvdWdoPC92YXI+CisJICogaXMgZmFsc2UpLgorCSAqLworCXB1YmxpYyBMb2dGaWx0ZXIoTG9nTGlzdGVuZXIgbGlzdGVuZXIsIGJvb2xlYW4gcGFzc1Rocm91Z2gsIE9iamVjdFtdIGNhdGVnb3JpZXMpIHsKKwkJaWYgKGxpc3RlbmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBmaWx0ZXIgbWVzc2FnZXMgdG8gYSBudWxsIGxpc3RlbmVyIik7CisJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKwkJdGhpcy5wYXNzVGhyb3VnaCA9IHBhc3NUaHJvdWdoOworCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSByZXR1cm47CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7ICsraSkKKwkJCXRoaXMuY2F0ZWdvcmllcy5wdXQoY2F0ZWdvcmllc1tpXSwgRFVNTVkpOworCX0KKworCS8qKiBDcmVhdGUgYSBsb2cgZmlsdGVyLgorCSAqICAKKwkgKiBUaGUgbG9nIGZpbHRlciBwYXNzZXMgdGhyb3VnaCBhbmQgZmlsdGVycyBvdXQgbWVzc2FnZXMgYmVmb3JlIHNlbmRpbmcgdGhlbSBvbnRvCisJICogdGhlIGdpdmVuIGxvZyBsaXN0ZW5lci4gVGhlIGZpbHRlciBzdGFydHMgb3V0IGVtcHR5ICh3aXRoIG5vIGNhdGVnb3JpZXMpLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyIFdoYXQgb2JqZWN0IHdpbGwgZ2V0IGZpbHRlcmVkIGxvZyBtZXNzYWdlcy4KKwkgKiBAcGFyYW0gcGFzc1Rocm91Z2ggSWYgdHJ1ZSwgcGFzcyBtZXNzYWdlcyB0aHJvdWdoIGJ5IGRlZmF1bHQuIElmIGZhbHNlLCBmaWx0ZXIgb3V0IG1lc3NhZ2VzIGJ5IGRlZmF1bHQuCisJICovCisJcHVibGljIExvZ0ZpbHRlcihMb2dMaXN0ZW5lciBsaXN0ZW5lciwgYm9vbGVhbiBwYXNzVGhyb3VnaCkgeworCQl0aGlzKGxpc3RlbmVyLCBwYXNzVGhyb3VnaCwgLypjYXRlZ29yaWVzKi9udWxsKTsKKwl9CisKKwkvKiogQWRkIGFuIGFkZGl0aW9uYWwgY2F0ZWdvcnkuCisJICoKKwkgKiBJZiB0aGUgZmlsdGVyIGlzIGluIHBhc3MtdGhyb3VnaCBtb2RlLCBtZXNzYWdlcyBpbiB0aGlzIGNhdGVnb3J5IHdpbGwgYmUKKwkgKiBmaWx0ZXJlZCBvdXQuIElmIHRoZSBmaWx0ZXIgaXMgaW4gZmlsdGVyIG1vZGUsIG1lc3NhZ2VzIGluIHRoaXMgY2F0ZWdvcnkgd2lsbAorCSAqIGJlIHBhc3NlZCB0aHJvdWdoLgorCSAqCisJICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQuCisJICovCisJcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoT2JqZWN0IGNhdGVnb3J5KSB7CisJCWNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LCBEVU1NWSk7CisJfQorCisJLyoqIFJlbW92ZSBhIGNhdGVnb3J5LgorCSAqCisJICogSWYgdGhlIGNhdGVnb3J5IGlzbid0IGluIHRoZSBmaWx0ZXIsIG5vdGhpbmcgaGFwcGVucy4KKwkgKgorCSAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gcmVtb3ZlLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGVnb3J5KE9iamVjdCBjYXRlZ29yeSkgeworCQljYXRlZ29yaWVzLnJlbW92ZShjYXRlZ29yeSk7CisJfQorCisJLyoqIFBhc3Mgb24gdGhlIGV2ZW50IHVubW9kaWZpZWQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXIuCisJICoKKwkgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHBhc3MuCisJICovCisJcHVibGljIHZvaWQgc3RyZWFtU3RhcnRlZChMb2dFdmVudCBldmVudCkgeworCQlsaXN0ZW5lci5zdHJlYW1TdGFydGVkKGV2ZW50KTsKKwl9CisKKwkvKiogUGFzcyBvbiB0aGUgZXZlbnQgdW5tb2RpZmllZCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gcGFzcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdHJlYW1TdG9wcGVkKExvZ0V2ZW50IGV2ZW50KSB7CisJCWxpc3RlbmVyLnN0cmVhbVN0b3BwZWQoZXZlbnQpOworCX0KKworCS8qKiBGaWx0ZXIgdGhlIGV2ZW50LCBhbmQgcG9zc2libHkgcGFzcyBpdCBvbnRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBmaWx0ZXIuCisJICovCisJcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChMb2dFdmVudCBldmVudCkgeworCQlib29sZWFuIGZvdW5kID0gY2F0ZWdvcmllcy5jb250YWluc0tleShldmVudC5nZXRDYXRlZ29yeSgpKTsKKwkJaWYgKChwYXNzVGhyb3VnaCAmJiAhZm91bmQpIHx8ICghcGFzc1Rocm91Z2ggJiYgZm91bmQpKQorCQkJbGlzdGVuZXIubWVzc2FnZUxvZ2dlZChldmVudCk7CisJfQorCisJLyoqIElnbm9yZSB0aGlzIGV2ZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCBpZ25vcmUpIHt9CisKKwkvKiogSWYgdHJ1ZSwgcGFzcyB0aHJvdWdoIGJ5IGRlZmF1bHQsIG90aGVyd2lzZSBmaWx0ZXIgb3V0IGJ5IGRlZmF1bHQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcGFzc1Rocm91Z2g7CisKKwkvKiogVGFibGUgb2YgY2F0ZWdvcmllcyB0byBmaWx0ZXIvcGFzcy4KKwkgKgorCSAqIFRoaXMgdGFibGUgbWFwcyBhbGwgdmFsdWVzIHRvIHtAbGluayAjRFVNTVl9LiAgSW4gSmF2YTIsIHdlIGNhbiBnZXQgcmlkIG9mCisJICogPGNvZGU+RFVNTVk8L2NvZGU+IGFuZCB1c2UgYSB7QGxpbmsgamF2YS51dGlsLkhhc2hTZXR9IGluc3RlYWQuCisJICovCisJcHJvdGVjdGVkIEhhc2h0YWJsZSBjYXRlZ29yaWVzID0gbmV3IEhhc2h0YWJsZSgpOworCisJLyoqIFRoZSBEVU1NWSB2YWx1ZSBmb3IgYWxsIG1hcHBpbmdzIGluIHRoZSB7QGxpbmsgI2NhdGVnb3JpZXN9IHRhYmxlLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVTU1ZID0gbmV3IE9iamVjdCgpOworCisJLyoqIFRoZSBsaXN0ZW5lciBvbiB3aG9zZSBiZWhhbGYgd2UgZmlsdGVyLgorCSAqLworCXByb3RlY3RlZCBMb2dMaXN0ZW5lciBsaXN0ZW5lcjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ0xpc3RlbmVyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9Mb2dMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjE4YTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9Mb2dMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisvKiogTGlzdGVuZXIgZm9yIGxvZ2dpbmcgZXZlbnRzLgorICoKKyAqIE9iamVjdHMgb2YgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhcmUgbm90aWZpZWQgd2hlbiBtZXNzYWdlcyBhcmUgbG9nZ2VkCisgKiBhbmQgd2hlbiBvdGhlciBsb2dnaW5nIGV2ZW50cyBvY2N1ci4KKyAqCisgKiBAc2VlIExvZworICogQHNlZSBMb2dFdmVudAorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgaW50ZXJmYWNlIExvZ0xpc3RlbmVyIGV4dGVuZHMgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKKwkvKiogQSBtZXNzYWdlIGdvdCBsb2dnZWQuCisJICoKKwkgKiBUaGUgPHZhcj5ldmVudDwvdmFyPiBjb250YWlucyB0aGUgZGV0YWlscyBvZiB0aGUgbWVzc2FnZSwgaW5jbHVkaW5nCisJICogCisJICogPHVsPgorCSAqICAgPGxpPlRoZSB0aW1lc3RhbXAgb2YgdGhlIG1lc3NhZ2UsIGZyb20ge0BsaW5rIExvZ0V2ZW50I2dldFRpbWVzdGFtcH0uPC9saT4KKwkgKiAgIDxsaT5UaGUgc291cmNlIG9mIHRoZSBtZXNzYWdlLCBmcm9tIHtAbGluayBFdmVudE9iamVjdCNnZXRTb3VyY2V9LCB3aGljaCBpcyBhbHdheXMKKwkgKiAgICAgYSB7QGxpbmsgU3RyaW5nfS48L2xpPgorCSAqICAgPGxpPlRoZSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgZnJvbSB7QGxpbmsgTG9nRXZlbnQjZ2V0Q2F0ZWdvcnl9LjwvbGk+CisJICogICA8bGk+VGhlIG1lc3NhZ2UgdGV4dCwgZnJvbSB7QGxpbmsgTG9nRXZlbnQjZ2V0TWVzc2FnZX0uPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIGV2ZW50IFRoZSBsb2dnaW5nIGV2ZW50LgorCSAqLworCXZvaWQgbWVzc2FnZUxvZ2dlZChMb2dFdmVudCBldmVudCk7CisKKwkvKiogQSBzdHJlYW0gZ290IHN0YXJ0ZWQuCisJICoKKwkgKiBUaGUgPHZhcj5ldmVudDwvdmFyPiBjb250YWlucyB0aGUgZGV0YWlscyBvZiBzdHJlYW0gc3RhcnQsIGluY2x1ZGluZyAKKwkgKgorCSAqIDx1bD4KKwkgKiAgIDxsaT5UaGUgbmFtZSBvZiB0aGUgc3RyZWFtLCBmcm9tIHtAbGluayBMb2dFdmVudCNnZXRTdHJlYW19LjwvbGk+CisJICogICA8bGk+VGhlIHRpbWUgdGhlIHN0cmVhbSBnb3Qgc3RhcnRlZCwgZnJvbSB7QGxpbmsgTG9nRXZlbnQjZ2V0VGltZXN0YW1wfTwvbGk+CisJICogICA8bGk+VGhlIHNvdXJjZSBvZiB0aGUgbmV3IHN0cmVhbSBzdGFydCwgZnJvbSB7QGxpbmsgRXZlbnRPYmplY3QjZ2V0U291cmNlfSAoYWx3YXlzIGEge0BsaW5rIFN0cmluZ30pLjwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEBwYXJhbSBldmVudCBUaGUgbG9nZ2luZyBldmVudC4KKwkgKi8KKwl2b2lkIHN0cmVhbVN0YXJ0ZWQoTG9nRXZlbnQgZXZlbnQpOworCisJLyoqIEEgc3RyZWFtIHdhcyBzdG9wcGVkLgorCSAqCisJICogVGhlIDx2YXI+ZXZlbnQ8L3Zhcj4gY29udGFpbnMgdGhlIGRldGFpbCBvZiB0aGUgc3RyZWFtIHN0b3AsIHdoaWNoIGlzIHRoZSBuYW1lCisJICogb2YgdGhlIHN0cmVhbSwgZnJvbSB7QGxpbmsgTG9nRXZlbnQjZ2V0U3RyZWFtfSBvciB7QGxpbmsgRXZlbnRPYmplY3QjZ2V0U291cmNlfQorCSAqIChhbHdheXMgYSB7QGxpbmsgU3RyaW5nfSkuCisJICoKKwkgKiBAcGFyYW0gZXZlbnQgVGhlIGxvZ2dpbmcgZXZlbnQuCisJICovCisJdm9pZCBzdHJlYW1TdG9wcGVkKExvZ0V2ZW50IGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ1dyaXRlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTG9nV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4ZjM3YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzc1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKiogQSB3cml0ZXIgZm9yIGxvZyBtZXNzYWdlcy4KKyAqCisgKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgbGV0IHlvdSB3cml0ZSBtZXNzYWdlcyBpbnRvIHRoZSBsb2dnaW5nIGZhY2lsaXR5LiBZb3UgZ2V0IHRoZXNlCisgKiBvYmplY3RzIGJ5IGNhbGxpbmcgb25lIG9mIHRoZSA8Y29kZT5nZXQ8L2NvZGU+IG1ldGhvZHMgb2YgY2xhc3Mge0BsaW5rIExvZ30gYW5kIHVzZSBpdAorICogYXMgeW91IHdvdWxkIHVzZSBhIHtAbGluayBqYXZhLmlvLlByaW50V3JpdGVyfS4gVGhpcyBjbGFzcyBhdXRvbWF0aWNhbGx5IGZsdXNoZXMgYSBtZXNzYWdlIHRvCisgKiB0aGUgbG9nZ2luZyBmYWNpbGl0eSB3aGVuZXZlciB5b3UgY2FsbCBvbmUgb2YgdGhlIDxjb2RlPnByaW50bG48L2NvZGU+IG1ldGhvZHMsIG9yCisgKiB7QGxpbmsgI2ZsdXNofS4gSXQgcHJpbnRzIGFsbCB2YWx1ZXMgYW5kIG9iamVjdHMgdXNpbmcgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKKyAqIGVuY29kaW5nLgorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGUgPGNvZGU+cHJpbnRsbjwvY29kZT4gbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGRvbid0IGFjdHVhbGx5IHdyaXRlCisgKiA8ZW0+YW55PC9lbT4gbGluZSBzZXBhcmF0aW9uIGNoYXJhY3RlcnMgaW50byB0aGUgbG9nLiAgTG9nIGxpc3RlbmVycyB3aWxsIHdhbnQgdGhlCisgKiBtZXNzYWdlcyB3aXRob3V0IHN1Y2ggY2hhcmFjdGVycyBhbnl3YXksIHNvIHRoaXMgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IuCisgKgorICogQHNlZSBMb2cKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIExvZ1dyaXRlciBleHRlbmRzIGphdmEuaW8uV3JpdGVyIHsKKwkvKiogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gdGltZXN0YW1wIFRoZSB0aW1lIGZvciBtZXNzYWdlcyBsb2dnZWQgd2l0aCB0aGUgcmV0dXJuZWQgd3JpdGVyLgorCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgbG9nIG1lc3NhZ2UuCisJICogQHBhcmFtIGNhdGVnb3J5IFRoZSBtZXNzYWdlcycgY2F0ZWdvcnkuCisJICovCisJTG9nV3JpdGVyKERhdGUgdGltZXN0YW1wLCBTdHJpbmcgc291cmNlLCBPYmplY3QgY2F0ZWdvcnkpIHsKKwkJYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigvKmxlbmd0aCovIDgwKTsKKwkJbG9jayA9IGJ1ZjsKKwkJdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCXRoaXMuc291cmNlID0gc291cmNlOworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJCWZsdXNoZWQgPSBmYWxzZTsKKwl9CisKKwkvKiogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgorCSAqCisJICogVGhpcyB3cml0ZXMgYSBzaW5nbGUgY2hhcmFjdGVyICh0aGUgbG93IG9yZGVyIDE2IGJpdHMgb2YgYykgdG8gdGhlIGxvZworCSAqIHdyaXRlci4gVGhlIGNoYXJhY3RlciBpc24ndCBmbHVzaGVkIHRvIHRoZSBsb2dnaW5nIGZhY2lsaXR5IHVudGlsIHlvdSBjYWxsIG9uZQorCSAqIG9mIHRoZSA8Y29kZT5wcmludGxuPC9jb2RlPiBtZXRob2RzIG9yIHtAbGluayAjZmx1c2h9LgorCSAqCisJICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byB3cml0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgeworCQlpZiAoYnVmID09IG51bGwpIHJldHVybjsKKwkJYnVmLmFwcGVuZCgoY2hhcikgYyk7CisJfQorCisJLyoqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgorCSAqCisJICogVGhpcyB3cml0ZXMgdGhlIGdpdmVuIGNoYXJhY3RlciBhcnJheSBzdGFydGluZyBhdCBvZmZzZXQgYW5kIGdvaW5nIGZvciBsZW5ndGggYnl0ZXMuCisJICoKKwkgKiBAcGFyYW0gYXJyYXkgVGhlIGNoYXJhY3RlciBhcnJheSB0byB3cml0ZS4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIGluIHRoZSBhcnJheSB0byBnZXQgY2hhcmFjdGVycyB0byB3cml0ZS4KKwkgKiBAcGFyYW0gbGVuZ3RoIEhvdyBtYW55IGNoYXJhY3RlcnMgdG8gd3JpdGUuCisJICovCisJcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGFycmF5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJCWlmIChidWYgPT0gbnVsbCB8fCBsZW5ndGggPT0gMCkgcmV0dXJuOworCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBhcnJheS5sZW5ndGggfHwgbGVuZ3RoIDwgMCB8fCAob2Zmc2V0K2xlbmd0aCkgPiBhcnJheS5sZW5ndGggfHwgKG9mZnNldCtsZW5ndGgpIDwgMCkKKwkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJDYW4ndCB3cml0ZSAiICsgbGVuZ3RoICsgIiBjaGFyYWN0ZXJzIGF0ICIgKyBvZmZzZXQKKwkJCQkrICIgZnJvbSBhcnJheSB3aG9zZSBsZW5ndGggaXMgIiArIGFycmF5Lmxlbmd0aCk7CisJCWJ1Zi5hcHBlbmQoYXJyYXksIG9mZnNldCwgbGVuZ3RoKTsKKwl9CisKKwkvKiogV3JpdGUgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KKwkgKgorCSAqIFRoaXMgd3JpdGVzIHRoZSBlbnRpcmUgZ2l2ZW4gYXJyYXkuCisJICoKKwkgKiBAcGFyYW0gYXJyYXkgQXJyYXkgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gYXJyYXkpIHsKKwkJd3JpdGUoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7CisJfQorCisJLyoqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIHN0cmluZy4KKwkgKgorCSAqIFRoaXMgd3JpdGVzIGxlbmd0aCBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHN0cmluZywgc3RhcnRpbmcgb2Zmc2V0IGNoYXJhY3RlcnMKKwkgKiBpbnRvIGl0LgorCSAqCisJICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHdyaXRlLgorCSAqIEBwYXJhbSBvZmZzZXQgV2hlcmUgaW4gdGhlIHN0cmluZyB0byBnZXQgY2hhcmFjdGVycyB0byB3cml0ZS4KKwkgKiBAcGFyYW0gbGVuZ3RoIEhvdyBtYW55IGNoYXJhY3RlcnMgdG8gd3JpdGUuCisJICovCisJcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0cmluZywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCQlpZiAoYnVmID09IG51bGwgfHwgbGVuZ3RoID09IDApIHJldHVybjsKKwkJYnVmLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7CisJfQorCisJLyoqIFdyaXRlIGEgc3RyaW5nLgorCSAqCisJICogVGhpcyB3cml0ZXMgdGhlIGVudGlyZSBnaXZlbiBzdHJpbmcuCisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIFN0cmluZyB0byB3cml0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyaW5nKSB7CisJCXdyaXRlKHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCgpKTsKKwl9CisKKwkvKiogRmx1c2ggdGhlIGxvZyB3cml0ZXIuCisJICoKKwkgKiBUaGlzIHNlbmRzIGFueSB0ZXh0IHNlbnQgdG8gdGhlIHdyaXRlciBvbiBpdHMgd2F5IHRvIHRoZSBsb2dnaW5nIGZhY2lsaXR5LCBhbmQgYmV5b25kLgorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCQlpZiAoYnVmID09IG51bGwpIHJldHVybjsKKwkJTG9nLmxvZ01lc3NhZ2UodGltZXN0YW1wLCBzb3VyY2UsIGNhdGVnb3J5LCBidWYudG9TdHJpbmcoKSk7CisJCWJ1Zi5zZXRMZW5ndGgoMCk7CisJCWZsdXNoZWQgPSB0cnVlOworCX0KKworCS8qKiBDbG9zZSB0aGUgbG9nIHdyaXRlci4KKwkgKgorCSAqIDxwPlRoaXMgZmx1c2hlcyBhbnkgcmVtYWluaW5nIHRleHQgdG8gdGhlIGxvZ2dpbmcgZmFjaWxpdHkgYW5kIHRoZW4gc2h1dHMgZG93bgorCSAqIHRoZSBsb2cgd3JpdGVyLiBZb3UgY2FuJ3QgdXNlIGl0IGFnYWluIGFmdGVyIHRoYXQgKGJ1dCBjbG9zaW5nIGEgcHJldmlvdXNseQorCSAqIGNsb3NlZCBsb2cgd3JpdGVyIGlzIE9LKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJZmx1c2goKTsKKwkJYnVmID0gbnVsbDsKKwl9CisKKwkvKiogUHJpbnQgYSBib29sZWFuIHZhbHVlLgorCSAqCisJICogVGhpcyBwcmludHMgYSBib29sZWFuIHZhbHVlICgidHJ1ZSIgb3IgImZhbHNlIikgaW50byB0aGUgbG9nLgorCSAqCisJICogQHBhcmFtIGIgVGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIHByaW50LgorCSAqLworCXB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgeworCQl3cml0ZShiPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwl9CisKKwkvKiogUHJpbnQgYSBjaGFyYWN0ZXIuCisJICoKKwkgKiBUaGUgY2hhcmFjdGVyIGlzIHRyYW5zbGF0ZWQgaW50byBvbmUgb3IgbW9yZSBieXRlcyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MKKwkgKiBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KKwkgKgorCSAqIEBwYXJhbSBjIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBwcmludC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludChjaGFyIGMpIHsKKwkJd3JpdGUoU3RyaW5nLnZhbHVlT2YoYykpOworCX0KKworCS8qKiBQcmludCBhbiBpbnRlZ2VyLgorCSAqCisJICogQHBhcmFtIGkgVGhlIDxjb2RlPmludDwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnQoaW50IGkpIHsKKwkJd3JpdGUoU3RyaW5nLnZhbHVlT2YoaSkpOworCX0KKworCS8qKiBQcmludCBhIGxvbmcgaW50ZWdlci4KKwkgKgorCSAqIEBwYXJhbSBsIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBwcmludC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludChsb25nIGwpIHsKKwkJd3JpdGUoU3RyaW5nLnZhbHVlT2YobCkpOworCX0KKworCS8qKiBQcmludCBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKwkgKgorCSAqIEBwYXJhbSBmIFRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnQoZmxvYXQgZikgeworCQl3cml0ZShTdHJpbmcudmFsdWVPZihmKSk7CisJfQorCisJLyoqIFByaW50IGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIuCisJICoKKwkgKiBAcGFyYW0gZCBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0byBwcmludC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgeworCQl3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisJfQorCisJLyoqIFByaW50IGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuCisJICoKKwkgKiBAcGFyYW0gYSBUaGUgYXJyYXkgb2YgY2hhcnMgdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIGEpIHsKKwkJd3JpdGUoYSk7CisJfQorCisJLyoqIFByaW50IGEgc3RyaW5nLgorCSAqCisJICogSWYgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHN0cmluZworCSAqICJudWxsIiBpcyBwcmludGVkLgorCSAqCisJICogQHBhcmFtIHMgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHsKKwkJaWYgKHMgPT0gbnVsbCkgcyA9ICJudWxsIjsKKwkJd3JpdGUocyk7CisJfQorCisJLyoqIFByaW50IGFuIG9iamVjdC4KKwkgKgorCSAqIEBwYXJhbSBvYmogVGhlIDxjb2RlPk9iamVjdDwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgeworCQl3cml0ZShTdHJpbmcudmFsdWVPZihvYmopKTsKKwl9CisKKwkvKiogUHJpbnQgYSBib29sZWFuIHZhbHVlIGFuZCB0ZXJtaW5hdGUgdGhlIG1lc3NhZ2UuCisJICoKKwkgKiBUaGlzIHByaW50cyBhIGJvb2xlYW4gaW50byB0aGUgbG9nLCBhbmQgZmx1c2hlcyB0aGUgbWVzc2FnZSB0byB0aGUgbG9nZ2luZworCSAqIGZhY2lsaXR5LgorCSAqCisJICogQHBhcmFtIGIgVGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIHByaW50LgorCSAqLworCXB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiBiKSB7CisJCXByaW50KGIpOworCQlwcmludGxuKCk7CisJfQorCisJLyoqIFByaW50IGEgY2hhcmFjdGVyIHZhbHVlIGFuZCB0ZXJtaW5hdGUgdGhlIG1lc3NhZ2UuCisJICoKKwkgKiBUaGlzIHByaW50cyBhIGNoYXJhY3RlciBpbnRvIHRoZSBsb2csIGFuZCBmbHVzaGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBsb2dnaW5nCisJICogZmFjaWxpdHkuCisJICoKKwkgKiBAcGFyYW0gYyBUaGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIGMpIHsKKwkJcHJpbnQoYyk7CisJCXByaW50bG4oKTsKKwl9CisKKwkvKiogUHJpbnQgYW4gaW50ZWdlciB2YWx1ZSBhbmQgdGVybWluYXRlIHRoZSBtZXNzYWdlLgorCSAqCisJICogVGhpcyBwcmludHMgYW4gaW50ZWdlciBpbnRvIHRoZSBsb2csIGFuZCBmbHVzaGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBsb2dnaW5nCisJICogZmFjaWxpdHkuCisJICoKKwkgKiBAcGFyYW0gaSBUaGUgPGNvZGU+aW50PC9jb2RlPiB0byBwcmludC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludGxuKGludCBpKSB7CisJCXByaW50KGkpOworCQlwcmludGxuKCk7CisJfQorCisJLyoqIFByaW50IGEgbG9uZyBpbnRlZ2VyIHZhbHVlIGFuZCB0ZXJtaW5hdGUgdGhlIG1lc3NhZ2UuCisJICoKKwkgKiBUaGlzIHByaW50cyBhIGxvbmcgaW50ZWdlciBpbnRvIHRoZSBsb2csIGFuZCBmbHVzaGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBsb2dnaW5nCisJICogZmFjaWxpdHkuCisJICoKKwkgKiBAcGFyYW0gbCBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnRsbihsb25nIGwpIHsKKwkJcHJpbnQobCk7CisJCXByaW50bG4oKTsKKwl9CisKKwkvKiogUHJpbnQgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBhbmQgdGVybWluYXRlIHRoZSBtZXNzYWdlLgorCSAqCisJICogVGhpcyBwcmludHMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBpbnRvIHRoZSBsb2csIGFuZCBmbHVzaGVzIHRoZSBtZXNzYWdlIHRvIHRoZQorCSAqIGxvZ2dpbmcgZmFjaWxpdHkuCisJICoKKwkgKiBAcGFyYW0gZiBUaGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHRvIHByaW50LgorCSAqLworCXB1YmxpYyB2b2lkIHByaW50bG4oZmxvYXQgZikgeworCQlwcmludChmKTsKKwkJcHJpbnRsbigpOworCX0KKworCS8qKiBQcmludCBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYW5kIHRlcm1pbmF0ZSB0aGUgbWVzc2FnZS4KKwkgKgorCSAqIFRoaXMgcHJpbnRzIGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBpbnRvIHRoZSBsb2csIGFuZCBmbHVzaGVzIHRoZQorCSAqIG1lc3NhZ2UgdG8gdGhlIGxvZ2dpbmcgZmFjaWxpdHkuCisJICoKKwkgKiBAcGFyYW0gZCBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0byBwcmludC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludGxuKGRvdWJsZSBkKSB7CisJCXByaW50KGQpOworCQlwcmludGxuKCk7CisJfQorCisJLyoqIFByaW50IGEgY2hhcmFjdGVyIGFycmF5IGFuZCB0ZXJtaW5hdGUgdGhlIG1lc3NhZ2UuCisJICoKKwkgKiBUaGlzIHByaW50cyBhIGNoYXJhY3RlciBhcnJheSBpbnRvIHRoZSBsb2csIGFuZCBmbHVzaGVzIHRoZSBtZXNzYWdlIHRvIHRoZQorCSAqIGxvZ2dpbmcgZmFjaWxpdHkuCisJICoKKwkgKiBAcGFyYW0gYSBUaGUgYXJyYXkgb2YgY2hhcnMgdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnRsbihjaGFyW10gYSkgeworCQlwcmludChhKTsKKwkJcHJpbnRsbigpOworCX0KKworCS8qKiBQcmludCBhIFN0cmluZyBhbmQgdGVybWluYXRlIHRoZSBtZXNzYWdlLgorCSAqCisJICogVGhpcyBwcmludHMgYSBTdHJpbmcgaW50byB0aGUgbG9nLCBhbmQgZmx1c2hlcyB0aGUgbWVzc2FnZSB0byB0aGUgbG9nZ2luZworCSAqIGZhY2lsaXR5LgorCSAqCisJICogQHBhcmFtIHMgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gcHJpbnQuCisJICovCisJcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgcykgeworCQlwcmludChzKTsKKwkJcHJpbnRsbigpOworCX0KKworCXB1YmxpYyB2b2lkIHByaW50bG4oVGhyb3dhYmxlIHQpIHsKKwkJaWYgKHQgPT0gbnVsbCkgCisJCQlwcmludGxuKCJOdWxsIHRocm93YWJsZSIpOworCQllbHNlIHsKKwkJCVN0YWNrVHJhY2VFbGVtZW50W10gZnJhbWVzID0gdC5nZXRTdGFja1RyYWNlKCk7CisJCQlpZiAoZnJhbWVzID09IG51bGwpCisJCQkJcHJpbnRsbigiTnVsbCBzdGFjayB0cmFjZSBpbiAiICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCQllbHNlIHsKKwkJCQlwcmludGxuKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgKytpKQorCQkJCQlwcmludGxuKGZyYW1lc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogUHJpbnQgYW4gT2JqZWN0IGFuZCB0ZXJtaW5hdGUgdGhlIG1lc3NhZ2UuCisJICoKKwkgKiBUaGlzIHByaW50cyBhbiBPYmplY3QgaW50byB0aGUgbG9nLCBhbmQgZmx1c2hlcyB0aGUgbWVzc2FnZSB0byB0aGUgbG9nZ2luZworCSAqIGZhY2lsaXR5LgorCSAqCisJICogQHBhcmFtIG9iaiBUaGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBwcmludC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCBvYmopIHsKKwkJcHJpbnQob2JqKTsKKwkJcHJpbnRsbigpOworCX0KKworCS8qKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgbWVzc2FnZS4KKwkgKgorCSAqIFRoaXMgdGVybWluYXRlcyBhbnkgbWVzc2FnZSB0ZXh0IGJ1aWx0IHVwIGFuZCBzZW5kcyBpdCB0byB0aGUgbG9nZ2luZyBmYWNpbGl0eS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludGxuKCkgeworCQlmbHVzaCgpOworCX0KKworCS8qKiBBcmUgd2UgZmx1c2hlZCB5ZXQ/CisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgZmx1c2hlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmx1c2hlZCgpIHsKKwkJcmV0dXJuIGZsdXNoZWQ7CisJfQorCisJLyoqIFRoZSBidWZmZXIgdXNlZCB0byBidWlsZCB1cCB0aGUgbWVzc2FnZS4gIElmIHRoaXMgaXMgbnVsbCwgdGhlbiB0aGUgd3JpdGVyIGlzIGNsb3NlZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWY7CisKKwkvKiogVGhlIHRpbWVzdGFtcCB0aGlzIExvZ1dyaXRlciB3aWxsIHVzZSBmb3IgbG9nIG1lc3NhZ2VzLgorCSAqLworCXByaXZhdGUgRGF0ZSB0aW1lc3RhbXA7CisKKwkvKiogVGhlIHNvdXJjZSBsYWJlbC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBzb3VyY2U7CisKKwkvKiogVGhlIGNhdGVnb3J5IG9mIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSB0aGlzIHdyaXRlci4KKwkgKi8KKwlwcml2YXRlIE9iamVjdCBjYXRlZ29yeTsKKworCS8qKiBGbHVzaGVkIHlldD8gKi8KKwlwcml2YXRlIGJvb2xlYW4gZmx1c2hlZDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ2dlck91dHB1dFN0cmVhbS5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTG9nZ2VyT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZTA5ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0xvZ2dlck91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICoge0BsaW5rIE91dHB1dFN0cmVhbX0gd3JhcHBlciBhcm91bmQgYSBqYXZhIHtAbGluayBMb2dnZXJ9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIExvZ2dlck91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTV9CWVRFU19QRVJfV1JJVEVfUFJPUEVSVFkgPQorICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLmxvZ2dlci5vcy5ieXRlcy5wZXIud3JpdGUiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9CWVRFU19QRVJfV1JJVEUgPSBJbnRlZ2VyLmdldEludGVnZXIoCisgICAgICAgICBOVU1fQllURVNfUEVSX1dSSVRFX1BST1BFUlRZLCA1MTIpOworCisgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7CisgICBwcml2YXRlIENoYXJCdWZmZXIgYnVmZmVyOworICAgcHJpdmF0ZSBMZXZlbCBsb2dMZXZlbDsKKworICAgcHVibGljIExvZ2dlck91dHB1dFN0cmVhbShMb2dnZXIgbG9nZ2VyKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzKGxvZ2dlciwgTGV2ZWwuSU5GTyk7CisgICB9CisKKyAgIHB1YmxpYyBMb2dnZXJPdXRwdXRTdHJlYW0oTG9nZ2VyIGxvZ2dlciwgTGV2ZWwgbG9nTGV2ZWwpCisgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzKGxvZ2dlciwgTlVNX0JZVEVTX1BFUl9XUklURSwgbG9nTGV2ZWwpOworICAgfQorCisgICBwdWJsaWMgTG9nZ2VyT3V0cHV0U3RyZWFtKExvZ2dlciBsb2dnZXIsIGludCBudW1PZkJ5dGVzUGVyV3JpdGUpCisgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzKGxvZ2dlciwgbnVtT2ZCeXRlc1BlcldyaXRlLCBMZXZlbC5JTkZPKTsKKyAgIH0KKworICAgcHVibGljIExvZ2dlck91dHB1dFN0cmVhbShMb2dnZXIgbG9nZ2VyLCBpbnQgbnVtT2ZCeXRlc1BlcldyaXRlLAorICAgICAgICAgTGV2ZWwgbG9nTGV2ZWwpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOworICAgICAgdGhpcy5idWZmZXIgPSBDaGFyQnVmZmVyLndyYXAobmV3IGNoYXJbbnVtT2ZCeXRlc1BlcldyaXRlXSk7CisgICAgICB0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoIWJ1ZmZlci5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgZmx1c2goKTsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci5wdXQoKGNoYXIpIGIpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgeworICAgICAgaWYgKGJ1ZmZlci5wb3NpdGlvbigpID4gMCkgeworICAgICAgICAgY2hhcltdIGZsdXNoQ29udGV4dCA9IG5ldyBjaGFyW2J1ZmZlci5wb3NpdGlvbigpXTsKKyAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLmFycmF5KCksIDAsIGZsdXNoQ29udGV4dCwgMCwgYnVmZmVyLnBvc2l0aW9uKCkpOworICAgICAgICAgbG9nZ2VyLmxvZyhsb2dMZXZlbCwgbmV3IFN0cmluZyhmbHVzaENvbnRleHQpKTsKKyAgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgfQorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZsdXNoKCk7CisgICAgICBzdXBlci5jbG9zZSgpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTnVsbElucHV0U3RyZWFtLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9OdWxsSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWU2ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTnVsbElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogQW4gaW5wdXQgc3RyZWFtIHRoYXQncyBhbHdheXMgZW1wdHkuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE51bGxJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICAgICAgLyoqCisJICogQ29uc3RydWN0IGEgbnVsbCBpbnB1dCBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTnVsbElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgICAgIG9wZW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisJICogUmVhZCBhIGJ5dGUsIHdoaWNoIHlvdSBjYW4ndCBkbywgc28geW91IGFsd2F5cyBnZXQgLTEgdG8gaW5kaWNhdGUgZW5kLW9mLWZpbGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gLTEgdG8gaW5kaWNhdGUgZW5kIG9mIGZpbGUuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNoZWNrT3BlbigpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjaGVja09wZW4oKTsKKyAgICAgICAgICAgICAgICBvcGVuID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKwkgKiBDaGVjayBpZiB3ZSdyZSBvcGVuLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHdlJ3JlIG5vdCBvcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKCFvcGVuKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBJcyB0aGUgc3RyZWFtIG9wZW4/ICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTnVsbE91dHB1dFN0cmVhbS5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTnVsbE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTBjMDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9OdWxsT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBBIG51bGwgb3V0cHV0IHN0cmVhbS4KKyAqCisgKiBUaGlzIG91dHB1dCBzdHJlYW0gdGhyb3dzIGF3YXkgYWxsIGRhdGEgaXQgZ2V0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKwkvKiogQ29uc3RydWN0IGEgbnVsbCBvdXRwdXQgc3RyZWFtLgorCSAqLworCXB1YmxpYyBOdWxsT3V0cHV0U3RyZWFtKCkgeworCQlvcGVuID0gdHJ1ZTsKKwl9CisKKwkvKiogV3JpdGUgYSBieXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLCB3aGljaCBpcyB0aHJvd24gYXdheS4KKwkgKgorCSAqIEBwYXJhbSBiIFRoZSBieXRlIHRvIHRvc3MuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJY2hlY2tPcGVuKCk7CisJfQorCisJLyoqIFdyaXRlIGEgYnl0ZSBhcnJheSB0byB0aGUgb3V0cHV0IHN0cmVhbSwgd2hpY2ggaXMgdGhyb3duIGF3YXkuCisJICoKKwkgKiBAcGFyYW0gYSBUaGUgYXJyYXkgdG8gd3JpdGUuCisJICogQHBhcmFtIG9mZnNldCBXaGVyZSBpbiB0aGUgYXJyYXkgdG8gaWdub3JlIGJ5dGVzIHRvIHdyaXRlLgorCSAqIEBwYXJhbSBsZW5ndGggSG93IG1hbnkgYnl0ZXMgdG8gaWdub3JlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQuCisJICovCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChhID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbid0IHdyaXRlIGEgbnVsbCBhcnJheSIpOworCQllbHNlIGlmICgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+IGEubGVuZ3RoKSB8fCAobGVuZ3RoIDwgMCkgfHwgKChvZmZzZXQgKyBsZW5ndGgpID4gYS5sZW5ndGgpCisJCQl8fCAoKG9mZnNldCArIGxlbmd0aCkgPCAwKSkKKwkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJPZmZzZXQgIiArIG9mZnNldCArICIgYW5kIGxlbmd0aCAiICsgbGVuZ3RoCisJCQkJKyAiIG5vdCBpbiBhcnJheSBvZiBsZW5ndGggIiArIGEubGVuZ3RoKTsKKwkJY2hlY2tPcGVuKCk7CisJfQorCisJLyoqIEZsdXNoIGFuIG91dHB1dCBzdHJlYW0sIHdoaWNoIGRvZXMgbm90aGluZy4KKwkgKgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQuCisJICovCisJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljaGVja09wZW4oKTsKKwl9CisKKwkvKiogQ2xvc2UgYW4gb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoZWNrT3BlbigpOworCQlvcGVuID0gZmFsc2U7CisJfQorCisJLyoqIENoZWNrIGlmIHdlJ3JlIG9wZW4uCisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHdlJ3JlIG5vdCBvcGVuLgorCSAqLworCXByaXZhdGUgdm9pZCBjaGVja09wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoIW9wZW4pIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworCX0KKworCS8qKiBJcyB0aGUgb3V0cHV0IHN0cmVhbSBvcGVuPyAqLworCXByaXZhdGUgYm9vbGVhbiBvcGVuOworfQorCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9Xcml0ZXJMb2dnZXIuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL1dyaXRlckxvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmRhZWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9Xcml0ZXJMb2dnZXIuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuKjsKKworLyoqIExvZyBtZXNzYWdlcyB0byBhIDxjb2RlPldyaXRlcjwvY29kZT4uCisgKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIGEge0BsaW5rIExvZ0xpc3RlbmVyfSB0aGF0IGxvZ3MgaXRzIG1lc3NhZ2VzIHRvIGEgY2hhcmFjdGVyIHN0cmVhbQorICoge0BsaW5rIFdyaXRlcn0uICBUaGlzIGZvcm1hdHMgYW5kIHdyaXRlcyB0byB0aGUgb3V0cHV0IHN0cmVhbSBhbGwgbG9nIGV2ZW50cyBwYXNzZWQgdG8KKyAqIHtAbGluayBMb2dMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkfSwgb25lIHBlciBsaW5lLiAgRWFjaCBsaW5lIGlzIHNlcGFyYXRlZCB3aXRoIHRoZQorICogc3lzdGVtJ3MgbGluZSBzZXBhcmF0b3IgY2hhcmFjdGVycywgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5saW5lLnNlcGFyYXRvcjwvY29kZT4gc3lzdGVtCisgKiBwcm9wZXJ0eS4KKyAqCisgKiA8cD5JdCBpZ25vcmVzIGFsbCBldmVudHMgcGFzc2VkIHRvIHtAbGluayBMb2dMaXN0ZW5lciNzdHJlYW1TdGFydGVkfSBhbmQKKyAqIHtAbGluayBMb2dMaXN0ZW5lciNzdHJlYW1TdG9wcGVkfS4KKyAqCisgKiA8cD5JdCBxdWlldGx5IGhpZGVzIGFsbCBJTyBlcnJvcnMgdGhhdCBtYXkgb2NjdXIgZHVyaW5nIHdyaXRpbmcuCisgKgorICogQHNlZSBMb2cKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIFdyaXRlckxvZ2dlciBpbXBsZW1lbnRzIExvZ0xpc3RlbmVyIHsKKwkvKiogQ29uc3RydWN0b3IgZ2l2ZW4gYW4gb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIENvbnN0cnVjdCBhIHdyaXRlciBsb2dnZXIgdGhhdCB3cml0ZXMgbWVzc2FnZSBldmVudHMgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0KKwkgKiBhbmQgZmx1c2hlcyB0aGUgc3RyZWFtIGFmdGVyIGV2ZXJ5IGxvZ2dlZCBtZXNzYWdlLgorCSAqCisJICogQHBhcmFtIG91dHB1dFN0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0byB3cml0ZSBldmVudHMuCisJICovCisJcHVibGljIFdyaXRlckxvZ2dlcihqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKKwkJdGhpcyhuZXcgamF2YS5pby5CdWZmZXJlZFdyaXRlcihuZXcgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKSksIC8qYXV0b0ZsdXNoKi8gdHJ1ZSk7CisJfQorCisJLyoqIENvbnN0cnVjdG9yIGdpdmVuIGEgd3JpdGVyLgorCSAqCisJICogQ29uc3RydWN0IGEgd3JpdGVyIGxvZ2dlciB0aGF0IHdyaXRlcyBtZXNzYWdlIGV2ZW50cyB0byB0aGUgZ2l2ZW4gd3JpdGVyIGFuZAorCSAqIGZsdXNoZXMgdGhlIHN0cmVhbSBhZnRlciBldmVyeSBsb2dnZWQgbWVzc2FnZS4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byB3aGljaCB0byB3cml0ZSBldmVudHMuCisJICovCisJcHVibGljIFdyaXRlckxvZ2dlcihXcml0ZXIgd3JpdGVyKSB7CisJCXRoaXMod3JpdGVyLCAvKmF1dG9GbHVzaCovIHRydWUpOworCX0KKworCS8qKiBHZW5lcmFsIGNvbnN0cnVjdG9yLgorCSAqCisJICogQ29uc3RydWN0IGEgd3JpdGVyIGxvZ2dlciB0aGF0IHdyaXRlcyBtZXNzYWdlIGV2ZW50cyB0byB0aGUgZ2l2ZW4gd3JpdGVyIGFuZAorCSAqIG9wdGlvbmFsbHkgZmx1c2hlcyB0aGUgc3RyZWFtIGFmdGVyIGV2ZXJ5IGxvZ2dlZCBtZXNzYWdlLgorCSAqCisJICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHdoaWNoIHRvIHdyaXRlIGV2ZW50cy4KKwkgKiBAcGFyYW0gYXV0b0ZsdXNoIElmIHRydWUsIGNhbGwgZmx1c2ggb24gdGhlIHdyaXRlciBhZnRlciBldmVyeSBtZXNzYWdlCisJICogbG9nZ2VkLiBJZiBmYWxzZSwgZG9uJ3QgY2FsbCBmbHVzaC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVyTG9nZ2VyKFdyaXRlciB3cml0ZXIsIGJvb2xlYW4gYXV0b0ZsdXNoKSB7CisJCWlmICh3cml0ZXIgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHdyaXRlIHRvIGEgbnVsbCB3cml0ZXIiKTsKKwkJdGhpcy53cml0ZXIgPSB3cml0ZXI7CisJCXRoaXMuYXV0b0ZsdXNoID0gYXV0b0ZsdXNoOworCQl0aGlzLmxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisJfQorCisJLyoqIENsb3NlIHRoZSB3cml0ZXIuCisJICoKKwkgKiBUaGlzIGNsb3NlcyB0aGUgd3JpdGVyIHRvIHdoaWNoIHRoaXMgbG9nZ2VyIHdhcyBsb2dnaW5nLiAgRnV0dXJlIG1lc3NhZ2UgZXZlbnRzCisJICogYXJlIGlnbm9yZWQgYW5kIG5vdCB3cml0dGVuLgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlKCkgeworCQlpZiAod3JpdGVyID09IG51bGwpIHJldHVybjsKKwkJdHJ5IHsKKwkJCXdyaXRlci5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCXdyaXRlciA9IG51bGw7CisJfQorCisJLyoqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIHdyaXRlci4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGZpcnN0IGNhbGxzIHtAbGluayAjZm9ybWF0TWVzc2FnZX0gdG8gZm9ybWF0IHRoZSBtZXNzYWdlLCBhbmQgdGhlbgorCSAqIHdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gIAorCSAqIAorCSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSB0aGF0IHdhcyBsb2dnZWQuCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgbWVzc2FnZUxvZ2dlZChMb2dFdmVudCBldmVudCkgeworCQlpZiAod3JpdGVyID09IG51bGwpIHJldHVybjsKKwkJdHJ5IHsKKwkJCXdyaXRlci53cml0ZShmb3JtYXRNZXNzYWdlKGV2ZW50LmdldFRpbWVzdGFtcCgpLCAoU3RyaW5nKSBldmVudC5nZXRTb3VyY2UoKSwgZXZlbnQuZ2V0Q2F0ZWdvcnkoKSwKKwkJCQlldmVudC5nZXRNZXNzYWdlKCkpICsgbGluZVNlcCk7CisJCQlpZiAoYXV0b0ZsdXNoKSB3cml0ZXIuZmx1c2goKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCX0KKworCS8qKiBGb3JtYXQgYSBtZXNzYWdlIGZvciBsb2dnaW5nLgorCSAqCisJICogVGhpcyBtZXRob2QgZm9ybWF0cyBhIG1lc3NhZ2UgYXMgZm9sbG93czogCisJICoKKwkgKiA8cD48Y29kZT48dmFyPmVwb2NoVGltZTwvdmFyPiAoPHZhcj50aW1lPC92YXI+KSA8dmFyPnNvdXJjZTwvdmFyPiA8dmFyPmNhdGVnb3J5PC92YXI+OgorCSAqIDx2YXI+bWVzc2FnZTwvdmFyPiAKKwkgKgorCSAqIDxwPndoZXJlIDx2YXI+ZXBvY2hUaW1lPC92YXI+IGlzIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgMXN0CisJICogSmFudWFyeSAxOTcwIEdNVCwgPHZhcj50aW1lPC92YXI+IGlzIGh1bWFuLXJlYWRhYmxlIHRpbWUsIDx2YXI+c291cmNlPC92YXI+IGlzCisJICogdGhlIHNvdXJjZSBvZiB0aGUgbWVzc2FnZSwgPHZhcj5jYXRlZ29yeTwvdmFyPiBpcyB0aGUgY2F0ZWdvcnkgdW5kZXIgd2hpY2ggdGhlCisJICogbWVzc2FnZSB3YXMgbG9nZ2VkLCBhbmQgPHZhcj5tZXNzYWdlPC92YXI+IGlzIHRoZSBtZXNzYWdlLgorCSAqCisJICogPHA+WW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgcHJvdmlkZSB5b3VyIG93biBmb3JtYXR0aW5nLgorCSAqCisJICogQHBhcmFtIHRpbWVzdGFtcCBUaW1lc3RhbXAgZm9yIHRoZSBtZXNzYWdlLgorCSAqIEBwYXJhbSBzb3VyY2UgU291cmNlIG9mIHRoZSBtZXNzYWdlLgorCSAqIEBwYXJhbSBjYXRlZ29yeSBDYXRlZ29yeSBvZiB0aGUgbWVzc2FnZS4KKwkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0ZXh0LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0TWVzc2FnZShqYXZhLnV0aWwuRGF0ZSB0aW1lc3RhbXAsIFN0cmluZyBzb3VyY2UsIE9iamVjdCBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJcmV0dXJuICgiXG4iICsgRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KHRpbWVzdGFtcCkgKyAiICIgKyBzb3VyY2UgKyAiICIgKyBjYXRlZ29yeSArICI6ICIgKyBtZXNzYWdlKTsKKwl9CisKKwkvKiogSWdub3JlIHRoZSBzdHJlYW0gc3RhcnRlZCBldmVudC4KKwkgKgorCSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gaWdub3JlLgorCSAqLworCXB1YmxpYyB2b2lkIHN0cmVhbVN0YXJ0ZWQoTG9nRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuOworCX0KKworCS8qKiBJZ25vcmUgdGhlIHN0cmVhbSBzdG9wcGVkIGV2ZW50LgorCSAqCisJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBpZ25vcmUuCisJICovCisJcHVibGljIHZvaWQgc3RyZWFtU3RvcHBlZChMb2dFdmVudCBldmVudCkgeworCQlyZXR1cm47CisJfQorCisJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGlnbm9yZSkge30KKworCS8qKiBUaGUgd3JpdGVyIHRvIHdoaWNoIHdlIHdyaXRlIGxvZyBtZXNzYWdlcy4KKwkgKgorCSAqIElmIG51bGwsIHRoZW4gd2Ugd2VyZSBjbG9zZWQuICBUaGlzIGlzIHByb3RlY3RlZCBzbyB5b3UgY2FuIGV4dGVuZCB0aGlzIGNsYXNzCisJICogYW5kIGxvZyBvdGhlciBldmVudHMgbm9ybWFsbHkgaWdub3JlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgV3JpdGVyIHdyaXRlcjsKKwkKKwkvKiogSWYgdHJ1ZSwgZmx1c2ggYWZ0ZXIgZXZlcnkgbWVzc2FnZSBsb2dnZWQuCisJICoKKwkgKiBUaGlzIGlzIHByb3RlY3RlZCBzbyB5b3UgY2FuIGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBsb2cgb3RoZXIgZXZlbnRzIG5vcm1hbGx5IGlnbm9yZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0ZsdXNoOworCisJLyoqIFdoYXQgdGhlIGxpbmUgc2VwYXJhdG9yIGlzLgorCSAqCisJICogVGhpcyBpcyBwcm90ZWN0ZWQgc28geW91IGNhbiBleHRlbmQgdGhpcyBjbGFzcyBhbmQgbG9nIG90aGVyIGV2ZW50cyBub3JtYWxseSBpZ25vcmVkLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbGluZVNlcDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL3BhY2thZ2UuaHRtbCBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg3ODAyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+QXBhY2hlIE9PRFQgQ29tbW9uczogSW5wdXQvT3V0cHV0CisgICAgPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5DbGFzc2VzIGZvciBoYW5kbGluZyBpbnB1dC9vdXRwdXQgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcyBhbmQKKyAgICAgIHNpbmtzLgorICAgIDwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvbmV0L05ldC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvbmV0L05ldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTI2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9uZXQvTmV0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMubmV0OworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKKy8qKiBOZXR3b3JrIHV0aWxpdGllcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5LgorICovCitwdWJsaWMgY2xhc3MgTmV0IHsKKwkvKiogUmV0dXJuIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSAibG9jYWxob3N0IiBsb29wYmFjayBhZGRyZXNzLgorCSAqCisJICogQHJldHVybiBUaGUgbG9vcGJhY2sgSVAgYWRkcmVzcywgMTI3LjAuMC4xLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0TG9vcGJhY2tBZGRyZXNzKCkgeworCQlyZXR1cm4gbG9vcGJhY2s7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBsb2NhbCBob3N0J3MgcHJpbWFyeSBJUCBpbnRlcmZhY2UuCisJICoKKwkgKiBAcmV0dXJuIGFuIDxjb2RlPkluZXRBZGRyZXNzPC9jb2RlPiB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEluZXRBZGRyZXNzIGdldExvY2FsSG9zdCgpIHsKKwkJcmV0dXJuIGxvY2FsSG9zdDsKKwl9CisKKwkvKiogVGhlIEluZXRBZGRyZXNzIG9mIHRoZSBsb29wYmFjayBJUCBhZGRyZXNzLCAxMjcuMC4wLjEuICovCisJcHJpdmF0ZSBzdGF0aWMgSW5ldEFkZHJlc3MgbG9vcGJhY2sgPSBudWxsOworCisJLyoqIFRoZSBJbmV0QWRkcmVzcyBvZiB0aGUgbG9jYWwgc3lzdGVtJ3MgcHJpbWFyeSBpbnRlcmZhY2UuICovCisJcHJpdmF0ZSBzdGF0aWMgSW5ldEFkZHJlc3MgbG9jYWxIb3N0ID0gbnVsbDsKKworCS8qKiBJbml0aWFsaXplIHRoaXMgY2xhc3MuICovCisJc3RhdGljIHsKKwkJdHJ5IHsKKwkJCWxvb3BiYWNrID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG51bGwpOworCQkJbG9jYWxIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZBVEFMIEVSUk9SOiBDYW5ub3QgcmV0cmlldmUgbG9vcGJhY2sgb3IgbG9jYWwgYWRkcmVzczogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL29iamVjdC9qbmRpL0hUVFBDb250ZXh0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9IVFRQQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjRmOTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9IVFRQQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaTsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29tcG9zaXRlTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW52YWxpZE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5vdENvbnRleHRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIGEgcHNldWRvIGNvbnRleHQgdGhhdCB5aWVsZHMgYW55IG5hbWUgcGFzc2VkIGluIGFzIGEgVVJMLCBpZiBpdCBjYW4gYmUgcGFyc2VkIGFzIGFuIFVSTC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCisgKi8KK3B1YmxpYyBjbGFzcyBIVFRQQ29udGV4dCBpbXBsZW1lbnRzIENvbnRleHQgeworCS8qKgorCSAqIE1ha2UgdGhlIEhUVFBDb250ZXh0LgorCSAqCisJICogQHBhcmFtIGVudmlyb25tZW50IEl0cyBlbnZpcm9ubWVudCwgY3VycmVudGx5IHVudXNlZC4KKwkgKi8KKyAgICAgICAgcHVibGljIEhUVFBDb250ZXh0KEhhc2h0YWJsZSBlbnZpcm9ubWVudCkgeworCQlpZiAoZW52aXJvbm1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vbm51bGwgZW52aXJvbm1lbnQgcmVxdWlyZWQ7IGRvbid0IGtub3cgd2h5LCBidXQgaXQgaXMiKTsKKyAgICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gKEhhc2h0YWJsZSkgZW52aXJvbm1lbnQuY2xvbmUoKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWNoZWNrTmFtZShuYW1lKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgVVJMKG5hbWUpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBPYmplY3QgbG9va3VwKE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBsb29rdXAobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJY2hlY2tOYW1lKG5hbWUpOworCQl0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3QgcG9zc2libGUiKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWJpbmQobmFtZS50b1N0cmluZygpLCBvYmopOworCX0KKworCXB1YmxpYyB2b2lkIHJlYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWNoZWNrTmFtZShuYW1lKTsKKwkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHBvc3NpYmxlIik7CisJfQorCisJcHVibGljIHZvaWQgcmViaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJlYmluZChuYW1lLnRvU3RyaW5nKCksIG9iaik7CisJfQorCisJcHVibGljIHZvaWQgdW5iaW5kKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJY2hlY2tOYW1lKG5hbWUpOworCQl0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3QgcG9zc2libGUiKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bmJpbmQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdW5iaW5kKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWNoZWNrTmFtZShuZXdOYW1lKTsKKwkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHBvc3NpYmxlIik7CisJfQorCisJcHVibGljIHZvaWQgcmVuYW1lKE5hbWUgb2xkTmFtZSwgTmFtZSBuZXdOYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmVuYW1lKG9sZE5hbWUudG9TdHJpbmcoKSwgbmV3TmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmIChuYW1lLmxlbmd0aCgpID4gMCkgCisJCQl0aHJvdyBuZXcgTm90Q29udGV4dEV4Y2VwdGlvbigiU3ViY29udGV4dHMgbm90IHN1cHBvcnRlZCIpOworCQkJCQorCQlyZXR1cm4gbmV3IE5hbWluZ0VudW1lcmF0aW9uKCkgeworCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7fQorCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZSgpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlyZXR1cm4gaGFzTW9yZSgpOworCQkJfQorCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwkJCQlyZXR1cm4gbmV4dCgpOworCQkJfQorCQl9OworCX0KKwkJCisJcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxpc3QobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKG5hbWUubGVuZ3RoKCkgPiAwKSAKKwkJCXRocm93IG5ldyBOb3RDb250ZXh0RXhjZXB0aW9uKCJTdWJjb250ZXh0cyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiBuZXcgTmFtaW5nRW51bWVyYXRpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJfQorCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworCQkJCXJldHVybiBoYXNNb3JlKCk7CisJCQl9CisJCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgeworCQkJCXJldHVybiBuZXh0KCk7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbGlzdEJpbmRpbmdzKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIHZvaWQgZGVzdHJveVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQl0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisJfQorCisJcHVibGljIHZvaWQgZGVzdHJveVN1YmNvbnRleHQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJZGVzdHJveVN1YmNvbnRleHQobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiU3ViY29udGV4dHMgbm90IHN1cHBvcnRlZCIpOworCX0KKworCXB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZVN1YmNvbnRleHQobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwKG5hbWUpOworCX0KKworCXB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwTGluayhuYW1lLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBOYW1lUGFyc2VyIGdldE5hbWVQYXJzZXIoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbmFtZVBhcnNlcjsKKwl9CisKKwlwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXROYW1lUGFyc2VyKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBjb21wb3NlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCU5hbWUgcmVzdWx0ID0gY29tcG9zZU5hbWUobmV3IENvbXBvc2l0ZU5hbWUobmFtZSksIG5ldyBDb21wb3NpdGVOYW1lKHByZWZpeCkpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIE5hbWUgY29tcG9zZU5hbWUoTmFtZSBuYW1lLCBOYW1lIHByZWZpeCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCU5hbWUgcmVzdWx0ID0gKE5hbWUpIHByZWZpeC5jbG9uZSgpOworCQlyZXN1bHQuYWRkQWxsKG5hbWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCBwcm9wVmFsKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKGVudmlyb25tZW50ID09IG51bGwpIGVudmlyb25tZW50ID0gbmV3IEhhc2h0YWJsZSgpOworCQlyZXR1cm4gZW52aXJvbm1lbnQucHV0KHByb3BOYW1lLCBwcm9wVmFsKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHJlbW92ZUZyb21FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAoZW52aXJvbm1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCXJldHVybiBlbnZpcm9ubWVudC5yZW1vdmUocHJvcE5hbWUpOworCX0KKworCXB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKGVudmlyb25tZW50ID09IG51bGwpIHJldHVybiBuZXcgSGFzaHRhYmxlKCk7CisJCXJldHVybiAoSGFzaHRhYmxlKSBlbnZpcm9ubWVudC5jbG9uZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiAiIjsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQllbnZpcm9ubWVudCA9IG51bGw7CisJfQorCisJLyoqCisJICogRW5zdXJlIHRoZSBuYW1lIGlzIGFuIEhUVFAgcHJvZHVjdCBjb250ZXh0IG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGNoZWNrLgorCSAqIEB0aHJvd3MgSW52YWxpZE5hbWVFeGNlcHRpb24gSWYgPHZhcj5uYW1lPC92YXI+J3Mgbm90IGFuIFJNSSBvYmplY3QgY29udGV4dCBuYW1lLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIEludmFsaWROYW1lRXhjZXB0aW9uIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGNoZWNrIGEgbnVsbCBuYW1lIik7CisJCWlmIChuYW1lLmxlbmd0aCgpID09IDApCisJCQl0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIk5hbWUncyBsZW5ndGggaXMgemVybyIpOworCQlpZiAobmFtZS5zdGFydHNXaXRoKCJodHRwOiIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiaHR0cHM6IikpCisJCQlyZXR1cm47CisJCXRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigiTm90IGFuIEhUVFAgbmFtZTsgdHJ5IGh0dHA6Ly9zb21lLmhvc3Qvc29tZS1jb250ZXh0Ly4uLiIpOworCX0KKworCS8qKiBDb250ZXh0J3MgZW52aXJvbm1lbnQ7IGN1cnJlbnRseSB1bnVzZWQuICovCisJcHJpdmF0ZSBIYXNodGFibGUgZW52aXJvbm1lbnQ7CisKKwkvKiogUGFyc2VyIGZvciBvYmplY3QgbmFtZXMuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZVBhcnNlciBuYW1lUGFyc2VyID0gbmV3IE9iamVjdE5hbWVQYXJzZXIoKTsKK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvT2JqZWN0Q29udGV4dC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvT2JqZWN0Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZDM4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9PYmplY3RDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0NjEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29tcG9zaXRlTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW52YWxpZE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVDbGFzc1BhaXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZVBhcnNlcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuVXRpbGl0eTsKKworLyoqCisgKiBDb250ZXh0IGZvciBiaW5kaW5nIGFuZCBsb29raW5nIHVwIGRpc3RyaWJ1dGVkIG9iamVjdHMuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAorICovCitjbGFzcyBPYmplY3RDb250ZXh0IGltcGxlbWVudHMgQ29udGV4dCB7CisJLyoqCisJICogQ29uc3RydWN0IHRoZSBvYmplY3QgY29udGV4dC4KKwkgKgorCSAqIEBwYXJhbSBlbnZpcm9ubWVudCBJdHMgZW52aXJvbm1lbnQsIGN1cnJlbnRseSB1bnVzZWQuCisJICovCisJT2JqZWN0Q29udGV4dChIYXNodGFibGUgZW52aXJvbm1lbnQpIHsKKwkJdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50ICE9IG51bGw/IChIYXNodGFibGUpIGVudmlyb25tZW50LmNsb25lKCkgOiBuZXcgSGFzaHRhYmxlKCk7CisKKwkJLy8gQWRkIHRoZSBDT1JCQSBjb250ZXh0LCBidXQgYnkgbmFtZSBzbyB3ZSBkb24ndCBnZXQgYSBjb21waWxlLXRpbWUKKwkJLy8gY291cGxpbmcgd2l0aCB0aGUgZWRtLWNvcmJhIGNvbXBvbmVudCwgYW5kIG9ubHkgaWYgQ09SQkEncyBhdmFpbGFibGUuCisJCXRyeSB7CisJCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpLkNPUkJBQ29udGV4dCIpOworCQkJQ29uc3RydWN0b3IgY3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde0hhc2h0YWJsZS5jbGFzc30pOworCQkJT2JqZWN0IGNvcmJhQ29udGV4dCA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3RoaXMuZW52aXJvbm1lbnR9KTsKKwkJCWNvbnRleHRzLmFkZChjb3JiYUNvbnRleHQpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHt9CisKKwkJU3RyaW5nIHJlZ2lzdHJ5TGlzdCA9IChTdHJpbmcpIGVudmlyb25tZW50LmdldCgicm1pcmVnaXN0cmllcyIpOworCQlpZiAocmVnaXN0cnlMaXN0ICE9IG51bGwpIGZvciAoSXRlcmF0b3IgaSA9IFV0aWxpdHkucGFyc2VDb21tYUxpc3QocmVnaXN0cnlMaXN0KTsgaS5oYXNOZXh0KCk7KSB7CisJCQlIYXNodGFibGUgcm1pRW52ID0gKEhhc2h0YWJsZSkgdGhpcy5lbnZpcm9ubWVudC5jbG9uZSgpOworCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGUoKFN0cmluZykgaS5uZXh0KCkpOworCQkJcm1pRW52LnB1dCgiaG9zdCIsIHVyaS5nZXRIb3N0KCkpOworCQkJcm1pRW52LnB1dCgicG9ydCIsIG5ldyBJbnRlZ2VyKHVyaS5nZXRQb3J0KCkpKTsKKwkJCWNvbnRleHRzLmFkZChuZXcgUk1JQ29udGV4dChybWlFbnYpKTsKKwkJfQorCisJCUhhc2h0YWJsZSBodHRwRW52ID0gKEhhc2h0YWJsZSkgdGhpcy5lbnZpcm9ubWVudC5jbG9uZSgpOworCQljb250ZXh0cy5hZGQobmV3IEhUVFBDb250ZXh0KGh0dHBFbnYpKTsKKworCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKKwkJZm9yIChJdGVyYXRvciBpID0gb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5VdGlsaXR5LnBhcnNlQ29tbWFMaXN0KFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub2JqZWN0LmNvbnRleHRzIiwgIiIpKTsKKwkJICAgICAgICBpLmhhc05leHQoKTspIHRyeSB7CisJCQljbGFzc05hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKwkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCQkJY29udGV4dHMuYWRkKGNsYXp6Lm5ld0luc3RhbmNlKCkpOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIklnbm9yaW5nIG5vdC1mb3VuZCBjb250ZXh0IGNsYXNzIGAiICsgY2xhc3NOYW1lICsgIic6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIklnbm9yaW5nIG5vbi1pbnN0YW50aWFibGUgY29udGV4dCBjbGFzcyBgIiArIGNsYXNzTmFtZSArICInOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJJZ25vcmluZyBjb250ZXh0IGNsYXNzIGAiICsgY2xhc3NOYW1lICsgIicgd2l0aCBub24tYWNjZXNzaWJsZSBuby1hcmdzIGMndG9yOiAiCisJCQkJKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisKKwkJaW5zdGFsbEFsaWFzZXMoKTsKKwkJU3lzdGVtLmVyci5wcmludGxuKCJPYmplY3QgY29udGV4dCByZWFkeTsgZGVsZWdhdGluZyB0bzogIiArIGNvbnRleHRzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9iamVjdENvbnRleHQ8L2NvZGU+IGluc3RhbmNlLiAgVGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBhCisJICogbGlzdCBvZiBkZWxlZ2F0ZSBjb250ZXh0cyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIHRoZW0gZnJvbSBhIHBhc3NlZC1pbgorCSAqIGVudmlyb25tZW50LiAgQ3VycmVudGx5LCBpdCdzIHVzZWQgc29sZWx5IGZvciB0aGlzIGNsYXNzJ3Mge0BsaW5rCisJICogT2JqZWN0Q29udGV4dFRlc3QgdW5pdCB0ZXN0fS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0cyBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBDb250ZXh0fXMuCisJICovCisJT2JqZWN0Q29udGV4dChMaXN0IGNvbnRleHRzKSB7CisJCXRoaXMuY29udGV4dHMgPSBjb250ZXh0czsKKwkJaW5zdGFsbEFsaWFzZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIGdpdmVuIG5hbWUgaXMgYm91bmQuICBCZWNhdXNlIHRoaXMgY29udGV4dAorCSAqIGRlbGVnYXRlcyB0byBtdWx0aXBsZSBvdGhlciBjb250ZXh0cywgdGhlIGxvb2t1cCByZXR1cm5zIHRoZSBmaXJzdCBzdWNjZXNzZnVsCisJICogbWF0Y2guCisJICoKKwkgKiBAcGFyYW0gbmFtZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHJldHVybiBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlLgorCSAqIEB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmIChuYW1lID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgcmVxdWlyZWQiKTsKKwkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIHRoaXM7CisKKwkJLy8gTGV0IGFsaWFzIHJlZGlyZWN0aW9uIGRvIGl0cyBtYWdpYworCQlTdHJpbmcgYWxpYXMgPSBhbGlhc2VzLmdldFByb3BlcnR5KG5hbWUpOworCQlpZiAoYWxpYXMgIT0gbnVsbCkgbmFtZSA9IGFsaWFzOworCisJCWZvciAoSXRlcmF0b3IgaSA9IGNvbnRleHRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJQ29udGV4dCBjID0gKENvbnRleHQpIGkubmV4dCgpOworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gYy5sb29rdXAobmFtZSk7CisJCQl9IGNhdGNoIChJbnZhbGlkTmFtZUV4Y2VwdGlvbiBpZ25vcmUpIHsKKwkJCX0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKwkJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBpZ25vcmUpe30KKwkJfQorCQl0aHJvdyBuZXcgTmFtZU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUgKyAiIG5vdCBmb3VuZCBpbiBhbnkgbWFuYWdlZCBzdWJjb250ZXh0Iik7CisJfQorCisJcHVibGljIE9iamVjdCBsb29rdXAoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvb2t1cChuYW1lLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSByZXF1aXJlZCIpOworCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIkNhbm5vdCBiaW5kIG9iamVjdCBuYW1lZCBhZnRlciBjb250ZXh0Iik7CisKKwkJLy8gSWYgaXQncyBhbiBhbGlhcyBuYW1lLCBzdG9wIGhlcmUuCisJCWlmIChhbGlhc2VzLmNvbnRhaW5zS2V5KG5hbWUpKQorCQkJdGhyb3cgbmV3IE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24oIk5hbWUgXCIiICsgbmFtZSArICJcIiBhbHJlYWR5IGJvdW5kIGFzIGFuIGFsaWFzZWQgbmFtZSIpOworCisJCS8vIE1ha2Ugc3VyZSBpdCBpc24ndCBib3VuZCBhbnl3aGVyZQorCQlmb3IgKE5hbWluZ0VudW1lcmF0aW9uIGUgPSBsaXN0KCIiKTsgZS5oYXNNb3JlKCk7KSB7CisJCQlOYW1lQ2xhc3NQYWlyIG5hbWVDbGFzc1BhaXIgPSAoTmFtZUNsYXNzUGFpcikgZS5uZXh0KCk7CisJCQlpZiAobmFtZS5lcXVhbHMobmFtZUNsYXNzUGFpci5nZXROYW1lKCkpKQorCQkJCXRocm93IG5ldyBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uKCJOYW1lIFwiIiArIG5hbWUgKyAiXCIgYWxyZWFkeSBib3VuZCBieSBhIG1hbmFnZWQgc3ViY29udGV4dCIpOworCQl9CisJCWRvUmViaW5kKG5hbWUsIG9iaik7CisJfQorCisJcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQliaW5kKG5hbWUudG9TdHJpbmcoKSwgb2JqKTsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAobmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIHJlcXVpcmVkIik7CisJCWlmIChuYW1lLmxlbmd0aCgpID09IDApIHRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigiQ2Fubm90IHJlYmluZCBvYmplY3QgbmFtZWQgYWZ0ZXIgY29udGV4dCIpOworCisJCS8vIElmIGl0J3MgYW4gYWxpYXMgbmFtZSwgcmVtb3ZlIHRoZSBhbGlhcworCQlpZiAoYWxpYXNlcy5jb250YWluc0tleShuYW1lKSkKKwkJCWFsaWFzZXMucmVtb3ZlKG5hbWUpOworCisJCWRvUmViaW5kKG5hbWUsIG9iaik7CisJfQorCisJLyoqCisJICogUmViaW5kIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBnaXZlbiBvYmplY3QuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIHJlYmluZAorCSAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHdoaWNoIGl0J3MgYm91bmQKKwkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHJpdmF0ZSB2b2lkIGRvUmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJYm9vbGVhbiBib3VuZCA9IGZhbHNlOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZXh0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCUNvbnRleHQgYyA9IChDb250ZXh0KSBpLm5leHQoKTsKKwkJCXRyeSB7CisJCQkJYy5yZWJpbmQobmFtZSwgb2JqKTsKKwkJCQlib3VuZCA9IHRydWU7CisJCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZXgpIHt9CisJCX0KKwkJaWYgKCFib3VuZCkgdGhyb3cgbmV3IEludmFsaWROYW1lRXhjZXB0aW9uKCJOYW1lIFwiIiArIG5hbWUgKyAiXCIgbm90IGNvbXBhdGlibGUgd2l0aCBhbnkgbWFuYWdlZCBzdWJjb250ZXh0Iik7CisJfQorCisJcHVibGljIHZvaWQgcmViaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJlYmluZChuYW1lLnRvU3RyaW5nKCksIG9iaik7CisJfQorCisJcHVibGljIHZvaWQgdW5iaW5kKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSByZXF1aXJlZCIpOworCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIkNhbm5vdCB1bmJpbmQgb2JqZWN0IG5hbWVkIGFmdGVyIGNvbnRleHQiKTsKKworCQkvLyBTZWUgaWYgaXQncyBhbiBhbGlhc2VkIG5hbWUKKwkJaWYgKGFsaWFzZXMuY29udGFpbnNLZXkobmFtZSkpIHsKKwkJCWFsaWFzZXMucmVtb3ZlKG5hbWUpOworCQkJcmV0dXJuOworCQl9CisKKwkJYm9vbGVhbiB1bmJvdW5kID0gZmFsc2U7CisJCWZvciAoSXRlcmF0b3IgaSA9IGNvbnRleHRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJQ29udGV4dCBjID0gKENvbnRleHQpIGkubmV4dCgpOworCQkJdHJ5IHsKKwkJCQljLnVuYmluZChuYW1lKTsKKwkJCQl1bmJvdW5kID0gdHJ1ZTsKKwkJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCX0KKwkJaWYgKCF1bmJvdW5kKSB0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIk5hbWUgXCIiICsgbmFtZSArICJcIiBub3QgY29tcGF0aWJsZSB3aXRoIGFueSBtYW5hZ2VkIHN1YmNvbnRleHQiKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bmJpbmQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdW5iaW5kKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmIChvbGROYW1lID09IG51bGwgfHwgbmV3TmFtZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSByZXF1aXJlZCIpOworCQlpZiAob2xkTmFtZS5sZW5ndGgoKSA9PSAwIHx8IG5ld05hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigiQ2Fubm90IHJlbmFtZSBvYmplY3QgbmFtZWQgYWZ0ZXIgY29udGV4dCIpOworCisJCS8vIFNlZSBpZiBpdCdzIGFuIGFsaWFzZWQgbmFtZQorCQlTdHJpbmcgb2xkVmFsdWUgPSAoU3RyaW5nKSBhbGlhc2VzLnJlbW92ZShvbGROYW1lKTsKKwkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKwkJCWFsaWFzZXMuc2V0UHJvcGVydHkobmV3TmFtZSwgb2xkTmFtZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlib29sZWFuIHJlbmFtZWQgPSBmYWxzZTsKKwkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlDb250ZXh0IGMgPSAoQ29udGV4dCkgaS5uZXh0KCk7CisJCQl0cnkgeworCQkJCWMucmVuYW1lKG9sZE5hbWUsIG5ld05hbWUpOworCQkJCXJlbmFtZWQgPSB0cnVlOworCQkJfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJfQorCQlpZiAoIXJlbmFtZWQpIHRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigiTmFtZXMgbm90IGNvbXBhdGlibGUgd2l0aCBhbnkgbWFuYWdlZCBzdWJjb250ZXh0Iik7CisJfQorCisJcHVibGljIHZvaWQgcmVuYW1lKE5hbWUgb2xkTmFtZSwgTmFtZSBuZXdOYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmVuYW1lKG9sZE5hbWUudG9TdHJpbmcoKSwgbmV3TmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWZpbmFsIEl0ZXJhdG9yIGVhY2hDb250ZXh0ID0gY29udGV4dHMuaXRlcmF0b3IoKTsKKwkJcmV0dXJuIG5ldyBOYW1pbmdFbnVtZXJhdGlvbigpIHsKKwkJCXByaXZhdGUgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24KKwkJCQk9IGVhY2hDb250ZXh0Lmhhc05leHQoKT8gKChDb250ZXh0KSBlYWNoQ29udGV4dC5uZXh0KCkpLmxpc3QobmFtZSkgOiBudWxsOworCQkJcHJpdmF0ZSBib29sZWFuIG9wZW4gPSB0cnVlOworCQkJcHVibGljIE9iamVjdCBuZXh0KCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCQkJaWYgKCFvcGVuKSB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uKCJjbG9zZWQiKTsKKwkJCQlpZiAoZW51bWVyYXRpb24gIT0gbnVsbCAmJiBlbnVtZXJhdGlvbi5oYXNNb3JlKCkpCisJCQkJCXJldHVybiBlbnVtZXJhdGlvbi5uZXh0KCk7CisJCQkJZWxzZSBpZiAoZWFjaENvbnRleHQuaGFzTmV4dCgpKSB7CisJCQkJCWVudW1lcmF0aW9uID0gKChDb250ZXh0KSBlYWNoQ29udGV4dC5uZXh0KCkpLmxpc3QobmFtZSk7CisJCQkJCWlmIChlbnVtZXJhdGlvbi5oYXNNb3JlKCkpCisJCQkJCQlyZXR1cm4gZW51bWVyYXRpb24ubmV4dCgpOworCQkJCX0KKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiTm8gbW9yZSBvYmplY3RzIGluIGNvbnRleHQiKTsKKwkJCX0KKwkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisJCQkJT2JqZWN0IHJjID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQlyYyA9IG5leHQoKTsKKwkJCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gaWdub3JlKSB7fQorCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmUoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJCQlpZiAoIW9wZW4pIHJldHVybiBmYWxzZTsKKwkJCQlpZiAoZW51bWVyYXRpb24gPT0gbnVsbCkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCWVsc2UgaWYgKGVudW1lcmF0aW9uLmhhc01vcmUoKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJZWxzZSBpZiAoZWFjaENvbnRleHQuaGFzTmV4dCgpKSB7CisJCQkJCWVudW1lcmF0aW9uID0gKChDb250ZXh0KSBlYWNoQ29udGV4dC5uZXh0KCkpLmxpc3QobmFtZSk7CisJCQkJCXJldHVybiBoYXNNb3JlKCk7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlib29sZWFuIGggPSBmYWxzZTsKKwkJCQl0cnkgeworCQkJCQloID0gaGFzTW9yZSgpOworCQkJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQkJcmV0dXJuIGg7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQkJCW9wZW4gPSBmYWxzZTsKKwkJCQlpZiAoZW51bWVyYXRpb24gIT0gbnVsbCkKKwkJCQkJZW51bWVyYXRpb24uY2xvc2UoKTsKKwkJCX0KKwkJfTsKKwl9CisJCQorCXB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBsaXN0KG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWZpbmFsIEl0ZXJhdG9yIGVhY2hDb250ZXh0ID0gY29udGV4dHMuaXRlcmF0b3IoKTsKKwkJcmV0dXJuIG5ldyBOYW1pbmdFbnVtZXJhdGlvbigpIHsKKwkJCXByaXZhdGUgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24KKwkJCQk9IGVhY2hDb250ZXh0Lmhhc05leHQoKT8gKChDb250ZXh0KSBlYWNoQ29udGV4dC5uZXh0KCkpLmxpc3RCaW5kaW5ncyhuYW1lKSA6IG51bGw7CisJCQlwcml2YXRlIGJvb2xlYW4gb3BlbiA9IHRydWU7CisJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJCQlpZiAoIW9wZW4pIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oImNsb3NlZCIpOworCQkJCWlmIChlbnVtZXJhdGlvbiAhPSBudWxsICYmIGVudW1lcmF0aW9uLmhhc01vcmUoKSkKKwkJCQkJcmV0dXJuIGVudW1lcmF0aW9uLm5leHQoKTsKKwkJCQllbHNlIGlmIChlYWNoQ29udGV4dC5oYXNOZXh0KCkpIHsKKwkJCQkJZW51bWVyYXRpb24gPSAoKENvbnRleHQpIGVhY2hDb250ZXh0Lm5leHQoKSkubGlzdEJpbmRpbmdzKG5hbWUpOworCQkJCQlpZiAoZW51bWVyYXRpb24uaGFzTW9yZSgpKQorCQkJCQkJcmV0dXJuIGVudW1lcmF0aW9uLm5leHQoKTsKKwkJCQl9CisJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk5vIG1vcmUgb2JqZWN0cyBpbiBjb250ZXh0Iik7CisJCQl9CisJCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgeworCQkJCU9iamVjdCByYyA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJcmMgPSBuZXh0KCk7CisJCQkJfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCQkJaWYgKCFvcGVuKSByZXR1cm4gZmFsc2U7CisJCQkJaWYgKGVudW1lcmF0aW9uID09IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQllbHNlIGlmIChlbnVtZXJhdGlvbi5oYXNNb3JlKCkpCisJCQkJCXJldHVybiB0cnVlOworCQkJCWVsc2UgaWYgKGVhY2hDb250ZXh0Lmhhc05leHQoKSkgeworCQkJCQllbnVtZXJhdGlvbiA9ICgoQ29udGV4dCkgZWFjaENvbnRleHQubmV4dCgpKS5saXN0QmluZGluZ3MobmFtZSk7CisJCQkJCXJldHVybiBoYXNNb3JlKCk7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlib29sZWFuIGggPSBmYWxzZTsKKwkJCQl0cnkgeworCQkJCQloID0gaGFzTW9yZSgpOworCQkJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQkJcmV0dXJuIGg7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQkJCW9wZW4gPSBmYWxzZTsKKwkJCQlpZiAoZW51bWVyYXRpb24gIT0gbnVsbCkKKwkJCQkJZW51bWVyYXRpb24uY2xvc2UoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBsaXN0QmluZGluZ3MobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oIlN1YmNvbnRleHRzIG5vdCBzdXBwb3J0ZWQgYnkgT2JqZWN0Q29udGV4dCIpOworCX0KKworCXB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWRlc3Ryb3lTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oIlN1YmNvbnRleHRzIG5vdCBzdXBwb3J0ZWQgYnkgT2JqZWN0Q29udGV4dCIpOworCX0KKworCXB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZVN1YmNvbnRleHQobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwKG5hbWUpOworCX0KKworCXB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwTGluayhuYW1lLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBOYW1lUGFyc2VyIGdldE5hbWVQYXJzZXIoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbmFtZVBhcnNlcjsKKwl9CisKKwlwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXROYW1lUGFyc2VyKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBjb21wb3NlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCU5hbWUgcmVzdWx0ID0gY29tcG9zZU5hbWUobmV3IENvbXBvc2l0ZU5hbWUobmFtZSksIG5ldyBDb21wb3NpdGVOYW1lKHByZWZpeCkpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIE5hbWUgY29tcG9zZU5hbWUoTmFtZSBuYW1lLCBOYW1lIHByZWZpeCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCU5hbWUgcmVzdWx0ID0gKE5hbWUpIHByZWZpeC5jbG9uZSgpOworCQlyZXN1bHQuYWRkQWxsKG5hbWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCBwcm9wVmFsKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKGVudmlyb25tZW50ID09IG51bGwpIGVudmlyb25tZW50ID0gbmV3IEhhc2h0YWJsZSgpOworCQlyZXR1cm4gZW52aXJvbm1lbnQucHV0KHByb3BOYW1lLCBwcm9wVmFsKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHJlbW92ZUZyb21FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAoZW52aXJvbm1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCXJldHVybiBlbnZpcm9ubWVudC5yZW1vdmUocHJvcE5hbWUpOworCX0KKworCXB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKGVudmlyb25tZW50ID09IG51bGwpIHJldHVybiBuZXcgSGFzaHRhYmxlKCk7CisJCXJldHVybiAoSGFzaHRhYmxlKSBlbnZpcm9ubWVudC5jbG9uZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiAiIjsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQllbnZpcm9ubWVudCA9IG51bGw7CisJfQorCisJLyoqCisJICogSW5zdGFsbCBhbGlhc2VzIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLiAgVGhlIHByb3BlcnRpZXMgZmlsZSBzaW1wbHkKKwkgKiBtYXBzIGEgc3RyaW5nIG9iamVjdCBuYW1lIHRvIGEgbmV3IG9iamVjdCBuYW1lLiAgVXNlIHRoZSBzeXN0ZW0gcHJvcGVydHkKKwkgKiA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaS5hbGlhc2VzPC9jb2RlPiAocHJlZmVycmVkKSBvciBzaW1wbHkKKwkgKiA8Y29kZT5hbGlhc2VzPC9jb2RlPiB0byB0ZWxsIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvcGVydGllcyBmaWxlLgorCSAqLworCXByaXZhdGUgdm9pZCBpbnN0YWxsQWxpYXNlcygpIHsKKwkJU3RyaW5nIGFsaWFzRmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpLmFsaWFzZXMiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImFsaWFzZXMiKSk7CisJCWlmIChhbGlhc0ZpbGVOYW1lICE9IG51bGwgJiYgYWxpYXNGaWxlTmFtZS5sZW5ndGgoKSA+IDApIHsKKwkJCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCQl0cnkgeworCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhbGlhc0ZpbGVOYW1lKTsKKwkJCQlhbGlhc2VzLmxvYWQoaW4pOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgaGFuZGxlIEkvTyBleGNlcHRpb24gcmVhZGluZyBhbGlhcyBmaWxlICIgKyBhbGlhc0ZpbGVOYW1lCisJCQkJCSsgIjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChpbiAhPSBudWxsKSB0cnkgeworCQkJCQlpbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJCX0KKwkJfQorCX0KKworCS8qKiBDb250ZXh0J3MgZW52aXJvbm1lbnQ7IGN1cnJlbnRseSB1bnVzZWQuICovCisJcHJpdmF0ZSBIYXNodGFibGUgZW52aXJvbm1lbnQ7CisKKwkvKiogUGFyc2VyIGZvciBvYmplY3QgbmFtZXMuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZVBhcnNlciBuYW1lUGFyc2VyID0gbmV3IE9iamVjdE5hbWVQYXJzZXIoKTsKKworCS8qKiBMaXN0IG9mIHtAbGluayBDb250ZXh0fXMgdG8gd2hpY2ggd2UgIm11bHRpcGxleCIuICovCisJcHJpdmF0ZSBMaXN0IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOworCisJLyoqIEFsaWFzZWQgbmFtZXMuICovCisJcHJpdmF0ZSBQcm9wZXJ0aWVzIGFsaWFzZXMgPSBuZXcgUHJvcGVydGllcygpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvT2JqZWN0Q3R4RmFjdG9yeS5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvT2JqZWN0Q3R4RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwY2Y3MTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9PYmplY3RDdHhGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub2JqZWN0LmpuZGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuSW5pdGlhbENvbnRleHRGYWN0b3J5OworCisvKiogSk5ESSBjb250ZXh0IGZhY3RvcnkgZm9yIG9iamVjdCBjb250ZXh0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RDdHhGYWN0b3J5IGltcGxlbWVudHMgSW5pdGlhbENvbnRleHRGYWN0b3J5IHsKKwlwdWJsaWMgQ29udGV4dCBnZXRJbml0aWFsQ29udGV4dChIYXNodGFibGUgZW52aXJvbm1lbnQpIHsKKwkJcmV0dXJuIG5ldyBPYmplY3RDb250ZXh0KGVudmlyb25tZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9PYmplY3ROYW1lUGFyc2VyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9PYmplY3ROYW1lUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5ZjA2ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL29iamVjdC9qbmRpL09iamVjdE5hbWVQYXJzZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaTsKKworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db21wb3VuZE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKKworLyoqIEpOREkgcGFyc2VyIGZvciBvYmplY3QgbmFtZXMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitjbGFzcyBPYmplY3ROYW1lUGFyc2VyIGltcGxlbWVudHMgTmFtZVBhcnNlciB7CisJcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBzeW50YXggPSBuZXcgUHJvcGVydGllcygpOyB7CisJCXN5bnRheC5wdXQoImpuZGkuc3ludGF4LmRpcmVjdGlvbiIsICJmbGF0Iik7CisJCXN5bnRheC5wdXQoImpuZGkuc3ludGF4Lmlnbm9yZWNhc2UiLCAiZmFsc2UiKTsKKwl9CisJcHVibGljIE5hbWUgcGFyc2UoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IENvbXBvdW5kTmFtZShuYW1lLCBzeW50YXgpOworCX0KK30KKworCQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvUk1JQ29udGV4dC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvUk1JQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWE3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9STUlDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpOworCitpbXBvcnQgamF2YS5ybWkuQWxyZWFkeUJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEucm1pLk5vdEJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5ybWkucmVnaXN0cnkuTG9jYXRlUmVnaXN0cnk7CitpbXBvcnQgamF2YS5ybWkucmVnaXN0cnkuUmVnaXN0cnk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbW11bmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbXBvc2l0ZU5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkludmFsaWROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQ2xhc3NQYWlyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5vdENvbnRleHRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb250ZXh0IGZvciBiaW5kaW5nIGFuZCBsb29raW5nIHVwIGRpc3RyaWJ1dGVkIG9iamVjdHMgaW4gUk1JLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyAqLworCisKKworcHVibGljIGNsYXNzIFJNSUNvbnRleHQgaW1wbGVtZW50cyBDb250ZXh0IHsKKwkvKgorCSogQ29uc3RydWN0IHRoZSBSTUkgb2JqZWN0IGNvbnRleHQuCisJKiAKKwkqIEBwYXJhbSBob3N0IEhvc3QgbmFtZS4KKwkqIEBwYXJhbSBwb3J0IFBvcnQgbnVtYmVyLgorCSovCisJcHVibGljIFJNSUNvbnRleHQoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CisgICAgICAgIAlIYXNodGFibGUgZW52aXJvbm1lbnQgPSBuZXcgSGFzaHRhYmxlKCk7CisJCWVudmlyb25tZW50LnB1dCgiaG9zdCIsIGhvc3QpOworCQllbnZpcm9ubWVudC5wdXQoInBvcnQiLCBuZXcgSW50ZWdlcihwb3J0KSk7CisJCWluaXRFbnYoZW52aXJvbm1lbnQpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgdGhlIFJNSSBvYmplY3QgY29udGV4dC4KKwkgKgorCSAqIEBwYXJhbSBlbnZpcm9ubWVudCBJdHMgZW52aXJvbm1lbnQsIGN1cnJlbnRseSB1bnVzZWQuCisJICovCisgICAgICAgIHB1YmxpYyBSTUlDb250ZXh0KEhhc2h0YWJsZSBlbnZpcm9ubWVudCkgeworICAgICAgICAgICAgICAgIGluaXRFbnYoZW52aXJvbm1lbnQpOworCX0KKworCS8qIEluaXRpYWxpemVzIGVudmlyb25tZW50CisJKgorCSogQHBhcmFtIGVudmlyb25tZW50IEl0cyBlbnZpcm9ubWVudCwgY3VycmVudGx5IHVudXNlZC4KKwkqLworCXByaXZhdGUgdm9pZCBpbml0RW52KEhhc2h0YWJsZSBlbnZpcm9ubWVudCkgeworCQlpZiAoZW52aXJvbm1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vbm51bGwgZW52aXJvbm1lbnQgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gKEhhc2h0YWJsZSkgZW52aXJvbm1lbnQuY2xvbmUoKTsKKyAgICAgICAgfQorCisJcHVibGljIE9iamVjdCBsb29rdXAoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQljaGVja05hbWUobmFtZSk7CisJCW5hbWUgPSB0b1JNSU5hbWUobmFtZSk7CisJCWlmIChuYW1lLmxlbmd0aCgpID09IDApIHJldHVybiBuZXcgUk1JQ29udGV4dChlbnZpcm9ubWVudCk7CisJCVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTsKKwkJdHJ5IHsKKwkJCXJldHVybiByZWdpc3RyeS5sb29rdXAobmFtZSk7CisJCX0gY2F0Y2ggKE5vdEJvdW5kRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgTmFtZU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUgKyAiIG5vdCBmb3VuZCBpbiBSTUkgcmVnaXN0cnkgIiArIHJlZ2lzdHJ5KTsKKwkJfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uKCJSZW1vdGUgZXhjZXB0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBPYmplY3QgbG9va3VwKE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBsb29rdXAobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJY2hlY2tOYW1lKG5hbWUpOworCQlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7CisJCXRyeSB7CisJCQlyZWdpc3RyeS5iaW5kKHRvUk1JTmFtZShuYW1lKSwgKFJlbW90ZSkgb2JqKTsKKwkJfSBjYXRjaCAoQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbihuYW1lICsgIiBhbHJlYWR5IGJvdW5kIGluIFJNSSByZWdpc3RyeSAiICsgcmVnaXN0cnkpOworCQl9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oIlJlbW90ZSBleGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQliaW5kKG5hbWUudG9TdHJpbmcoKSwgb2JqKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQljaGVja05hbWUobmFtZSk7CisJCXRyeSB7CisJCQlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7CisJCQlyZWdpc3RyeS5yZWJpbmQodG9STUlOYW1lKG5hbWUpLCAoUmVtb3RlKSBvYmopOworCQl9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbigiUmVtb3RlIGV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZWJpbmQoTmFtZSBuYW1lLCBPYmplY3Qgb2JqKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmViaW5kKG5hbWUudG9TdHJpbmcoKSwgb2JqKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bmJpbmQoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQljaGVja05hbWUobmFtZSk7CisJCVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTsKKwkJdHJ5IHsKKwkJCXJlZ2lzdHJ5LnVuYmluZCh0b1JNSU5hbWUobmFtZSkpOworCQl9IGNhdGNoIChOb3RCb3VuZEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbihuYW1lICsgIiBub3QgZm91bmQgaW4gUk1JIHJlZ2lzdHJ5ICIgKyByZWdpc3RyeSk7CisJCX0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbigiUmVtb3RlIGV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1bmJpbmQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdW5iaW5kKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWNoZWNrTmFtZShuZXdOYW1lKTsKKwkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZCIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbmFtZShOYW1lIG9sZE5hbWUsIE5hbWUgbmV3TmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJlbmFtZShvbGROYW1lLnRvU3RyaW5nKCksIG5ld05hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIAorCQkJdGhyb3cgbmV3IE5vdENvbnRleHRFeGNlcHRpb24oIlN1YmNvbnRleHRzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCQkKKwkJZmluYWwgSXRlcmF0b3IgaSA9IGdldEN1cnJlbnRCaW5kaW5ncygpLml0ZXJhdG9yKCk7CisJCXJldHVybiBuZXcgTmFtaW5nRW51bWVyYXRpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkgeworCQkJCXJldHVybiBpLmhhc05leHQoKTsKKwkJCX0KKwkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQkJCVN0cmluZyBuID0gInVybjplZGE6cm1pOiIgKyAoU3RyaW5nKSBpLm5leHQoKTsKKwkJCQlvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5TZXJ2aWNlIHNlcnZlciA9IChvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5TZXJ2aWNlKSBsb29rdXAobik7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIG5ldyBOYW1lQ2xhc3NQYWlyKG4sIHNlcnZlci5nZXRTZXJ2ZXJJbnRlcmZhY2VOYW1lKCkpOworCQkJCX0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworCQkJCQl0aHJvdyBuZXcgQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlyZXR1cm4gaGFzTW9yZSgpOworCQkJfQorCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwkJCQlPYmplY3QgbmV4dCA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJbmV4dCA9IG5leHQoKTsKKwkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisJCQkJCXRocm93IGV4OworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQkJcmV0dXJuIG5leHQ7CisJCQl9CisJCX07CisJfQorCQkKKwlwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbGlzdChuYW1lLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIAorCQkJdGhyb3cgbmV3IE5vdENvbnRleHRFeGNlcHRpb24oIlN1YmNvbnRleHRzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJZmluYWwgSXRlcmF0b3IgaSA9IGdldEN1cnJlbnRCaW5kaW5ncygpLml0ZXJhdG9yKCk7CisJCXJldHVybiBuZXcgTmFtaW5nRW51bWVyYXRpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkgeworCQkJCXJldHVybiBpLmhhc05leHQoKTsKKwkJCX0KKwkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQkJCVN0cmluZyBuID0gInVybjplZGE6cm1pOiIgKyAoU3RyaW5nKSBpLm5leHQoKTsKKwkJCQlyZXR1cm4gbmV3IGphdmF4Lm5hbWluZy5CaW5kaW5nKG4sIGxvb2t1cChuKSk7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisJCQkJcmV0dXJuIGhhc01vcmUoKTsKKwkJCX0KKwkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisJCQkJT2JqZWN0IG5leHQgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCW5leHQgPSBuZXh0KCk7CisJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworCQkJCQl0aHJvdyBleDsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7fQorCQkJCXJldHVybiBuZXh0OworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxpc3RCaW5kaW5ncyhuYW1lLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZCIpOworCX0KKworCXB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWRlc3Ryb3lTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oIlN1YmNvbnRleHRzIG5vdCBzdXBwb3J0ZWQiKTsKKwl9CisKKwlwdWJsaWMgQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIE9iamVjdCBsb29rdXBMaW5rKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvb2t1cChuYW1lKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvb2t1cExpbmsobmFtZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5hbWVQYXJzZXI7CisJfQorCisJcHVibGljIE5hbWVQYXJzZXIgZ2V0TmFtZVBhcnNlcihOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0TmFtZVBhcnNlcihuYW1lLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgY29tcG9zZU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlOYW1lIHJlc3VsdCA9IGNvbXBvc2VOYW1lKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBuZXcgQ29tcG9zaXRlTmFtZShwcmVmaXgpKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBOYW1lIGNvbXBvc2VOYW1lKE5hbWUgbmFtZSwgTmFtZSBwcmVmaXgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlOYW1lIHJlc3VsdCA9IChOYW1lKSBwcmVmaXguY2xvbmUoKTsKKwkJcmVzdWx0LmFkZEFsbChuYW1lKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGFkZFRvRW52aXJvbm1lbnQoU3RyaW5nIHByb3BOYW1lLCBPYmplY3QgcHJvcFZhbCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmIChlbnZpcm9ubWVudCA9PSBudWxsKSBlbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKKwkJcmV0dXJuIGVudmlyb25tZW50LnB1dChwcm9wTmFtZSwgcHJvcFZhbCk7CisJfQorCisJcHVibGljIE9iamVjdCByZW1vdmVGcm9tRW52aXJvbm1lbnQoU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKGVudmlyb25tZW50ID09IG51bGwpIHJldHVybiBudWxsOworCQlyZXR1cm4gZW52aXJvbm1lbnQucmVtb3ZlKHByb3BOYW1lKTsKKwl9CisKKwlwdWJsaWMgSGFzaHRhYmxlIGdldEVudmlyb25tZW50KCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmIChlbnZpcm9ubWVudCA9PSBudWxsKSByZXR1cm4gbmV3IEhhc2h0YWJsZSgpOworCQlyZXR1cm4gKEhhc2h0YWJsZSkgZW52aXJvbm1lbnQuY2xvbmUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWVJbk5hbWVzcGFjZSgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gIiI7CisJfQorCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJZW52aXJvbm1lbnQgPSBudWxsOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgY3VycmVudCBiaW5kaW5ncyBpbiB0aGUgUk1JIHJlZ2lzdHJ5LgorCSAqCisJICogQHJldHVybiBBIGxpc3Qgb2YgdGhlIGN1cnJlbnQgYmluZGluZ3MsIGFzIHNpbXBsZSBzdHJpbmcgbmFtZXMuCisJICovCisJcHJpdmF0ZSBMaXN0IGdldEN1cnJlbnRCaW5kaW5ncygpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlMaXN0IG5hbWVzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTsKKwkJCW5hbWVzID0gQXJyYXlzLmFzTGlzdChyZWdpc3RyeS5saXN0KCkpOworCQl9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKwkJCW5hbWVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCisJLyoqCisJICogQ29udmVydCB0aGUgY29udGV4dCBvYmplY3QgbmFtZSBpbnRvIGFuIHJtaXJlZ2lzdHJ5IG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBDb250ZXh0IG5hbWUuCisJICogQHJldHVybiBybWlyZWdpc3RyeSBuYW1lLgorCSAqLworCXByaXZhdGUgU3RyaW5nIHRvUk1JTmFtZShTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gIiI7CisJCWlmIChuYW1lLnN0YXJ0c1dpdGgoInVybjplZGE6cm1pOiIpKQorCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDEyKTsKKwkJaWYgKG5hbWUuc3RhcnRzV2l0aCgicm1pOiIpKQorCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDQpOworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIFJNSSByZWdpc3RyeS4KKwkgKgorCSAqIEByZXR1cm4gYSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBOYW1pbmdFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXByaXZhdGUgUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHJldHVybiByZWdpc3RyeTsKKwkJdHJ5IHsKKwkJCVN0cmluZyBob3N0ID0gZW52aXJvbm1lbnQuY29udGFpbnNLZXkoImhvc3QiKT8gKFN0cmluZykgZW52aXJvbm1lbnQuZ2V0KCJob3N0IikgOiAibG9jYWxob3N0IjsKKwkJCWludCBwb3J0ID0gZW52aXJvbm1lbnQuY29udGFpbnNLZXkoInBvcnQiKT8gKChJbnRlZ2VyKSBlbnZpcm9ubWVudC5nZXQoInBvcnQiKSkuaW50VmFsdWUoKQorCQkJCTogUmVnaXN0cnkuUkVHSVNUUllfUE9SVDsKKworCQkJCisJCQlyZWdpc3RyeSA9IExvY2F0ZVJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KGhvc3QsIHBvcnQpOworCQl9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oIlJlbW90ZSBleGNlcHRpb24gbG9jYXRpbmcgcmVnaXN0cnk6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisJCXJldHVybiByZWdpc3RyeTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgdGhlIG5hbWUgaXMgYW4gUk1JIG9iamVjdCBjb250ZXh0IG5hbWUuCisJICoKKwkgKiBSTUkgb2JqZWN0IGNvbnRleHQgbmFtZXMgYXJlIFVSTnMgaW4gdGhlIDxjb2RlPmVkYTwvY29kZT4gbmFtZXNwYWNlLCBpbiB0aGUKKwkgKiA8Y29kZT5ybWk8L2NvZGU+IHN1Ym5hbWVzcGFjZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gY2hlY2suCisJICogQHRocm93cyBJbnZhbGlkTmFtZUV4Y2VwdGlvbiBJZiA8dmFyPm5hbWU8L3Zhcj4ncyBub3QgYW4gUk1JIG9iamVjdCBjb250ZXh0IG5hbWUuCisJICovCisJcHJpdmF0ZSB2b2lkIGNoZWNrTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIEludmFsaWROYW1lRXhjZXB0aW9uIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGNoZWNrIGEgbnVsbCBuYW1lIik7CisJCWlmIChuYW1lLmxlbmd0aCgpID09IDApCisJCQl0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIk5hbWUncyBsZW5ndGggaXMgemVybyIpOworCQlpZiAoIW5hbWUuc3RhcnRzV2l0aCgidXJuOmVkYTpybWk6IikpCisJCQl0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIk5vdCBhbiBSTUkgbmFtZTsgdHJ5IHVybjplZGE6cm1pOnlhZGRhLXlhZGRhIik7CisJfQorCisJLyoqIENvbnRleHQncyBlbnZpcm9ubWVudDsgY3VycmVudGx5IHVudXNlZC4gKi8KKwlwcml2YXRlIEhhc2h0YWJsZSBlbnZpcm9ubWVudDsKKworCS8qKiBSTUkgUmVnaXN0cnkuICovCisJcHJpdmF0ZSBSZWdpc3RyeSByZWdpc3RyeTsKKworCS8qKiBQYXJzZXIgZm9yIG9iamVjdCBuYW1lcy4gKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lUGFyc2VyIG5hbWVQYXJzZXIgPSBuZXcgT2JqZWN0TmFtZVBhcnNlcigpOworfQorCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9wYWNrYWdlLmh0bWwgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjZDQ3MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL29iamVjdC9qbmRpL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDMwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkFwYWNoZSBPT0RUIENvbW1vbnM6IE9iamVjdCBTZXJ2aWNlcyBmb3IgSk5ESQorICAgIDwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+SmF2YSBOYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UgKEpOREkpIHNlcnZpY2UgcHJvdmlkZXIgZm9yCisgICAgICBjb21tb25zIG9iamVjdCBzZXJ2aWNlcy4gIFRoaXMgcGFja2FnZSBkZWZpbmVzIGEgc3RhbmRhcmQgSk5ESSBTUEkKKyAgICAgIChzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSkgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGJpbmRpbmcgYW5kCisgICAgICBsb29rdXAgb2Ygb2JqZWN0cyBpbiBhIGRpc3RyaWJ1dGVkIG5ldHdvcmsuCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3QvcGFja2FnZS5odG1sIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA5MGYzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDMwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkFwYWNoZSBPT0RUIENvbW1vbnM6IE9iamVjdCBTZXJ2aWNlcworICAgIDwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+VGhlIG9iamVjdCBzZXJ2aWNlcyBwYWNrYWdlIGluY2x1ZGVzIGludGVyZmFjZXMsIGNsYXNzZXMsIGFuZAorICAgICAgdXRpbGl0aWVzIGZvciB0aGUgbWFuYWdlbWVudCBvZiBvYmplY3RzLiAgT2JqZWN0IHNlcnZpY2VzCisgICAgICBpbmNsdWRlIGxvY2F0aW5nLCByZXNvbHZpbmcsIGFuZCBtYW5pcHVsYXRpbmcgb2JqZWN0cywgYXMgd2VsbAorICAgICAgYXMgbGlmZWN5Y2xlIG1hbmFnZW1lbnQuCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9wYWNrYWdlLmh0bWwgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhY2QyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkFwYWNoZSBPT0RUIENvbW1vbnMKKyAgICA8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkNvbW1vbiBKYXZhIHV0aWxpdGllcyBmb3IgQXBhY2hlIE9PRFQgQVBJcyBhbmQgYXBwbGljYXRpb25zLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvcGFnaW5hdGlvbi9QYWdpbmF0aW9uVXRpbHMuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3BhZ2luYXRpb24vUGFnaW5hdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlNDhjZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3BhZ2luYXRpb24vUGFnaW5hdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMucGFnaW5hdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNldCBvZiB1dGlsaXR5IG1ldGhvZHMgdG8gZG8gcGFnaW5hdGlvbi4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGFnaW5hdGlvblV0aWxzIHsKKworICAgIHByaXZhdGUgUGFnaW5hdGlvblV0aWxzKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiRG9uJ3QgY29uc3RydWN0IHV0aWxpdHkgY2xhc3NlcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBoYXNSZW1haW5kZXIoaW50IGRpdmlzb3IsIGludCBxdW90aWVudCkgeworICAgICAgICBpZiAoZGl2aXNvciAlIHF1b3RpZW50ICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlQ3VycmVudFBhZ2UoaW50IHN0YXJ0SWR4LCBpbnQgcHJvZHVjdHNQZXJQYWdlKSB7CisgICAgICAgIHJldHVybiAoKHN0YXJ0SWR4ICsgMSkgLyBwcm9kdWN0c1BlclBhZ2UpCisgICAgICAgICAgICAgICAgKyBoYXNSZW1haW5kZXIoc3RhcnRJZHggKyAxLCBwcm9kdWN0c1BlclBhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVDdXJyZW50V2luZG93KGludCBjdXJyUGFnZSwgaW50IHBhZ2VzUGVyUGFnZSkgeworICAgICAgICByZXR1cm4gKGN1cnJQYWdlIC8gcGFnZXNQZXJQYWdlKSArIGhhc1JlbWFpbmRlcihjdXJyUGFnZSwgcGFnZXNQZXJQYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWluUGFnZShpbnQgcGFnZXNQZXJQYWdlLCBpbnQgY3VycldpbmRvdykgeworICAgICAgICByZXR1cm4gKHBhZ2VzUGVyUGFnZSAqIChjdXJyV2luZG93IC0gMSkpICsgMTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWF4UGFnZShpbnQgbWluUGFnZSwgaW50IHBhZ2VzUGVyUGFnZSwKKyAgICAgICAgICAgIGludCBsYXN0SWR4LCBpbnQgcHJvZHVjdHNQZXJQYWdlKSB7CisgICAgICAgIHJldHVybiBNYXRoLm1pbihtaW5QYWdlICsgKHBhZ2VzUGVyUGFnZSAtIDEpLCBjb21wdXRlQ3VycmVudFBhZ2UoCisgICAgICAgICAgICAgICAgbGFzdElkeCwgcHJvZHVjdHNQZXJQYWdlKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUVuZElkeChpbnQgY3VyclBhZ2UsIGludCBwcm9kdWN0c1BlclBhZ2UsCisgICAgICAgICAgICBpbnQgdG90YWxQcm9kdWN0cykgeworICAgICAgICByZXR1cm4gTWF0aC5taW4oKGN1cnJQYWdlICogcHJvZHVjdHNQZXJQYWdlKSAtIDEsIHRvdGFsUHJvZHVjdHMgLSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlUHJldlN0YXJ0SWR4KGludCBtaW5QYWdlLCBpbnQgcHJvZHVjdHNQZXJQYWdlKSB7CisgICAgICAgIGludCBwcmV2UGFnZSA9IE1hdGgubWF4KG1pblBhZ2UgLSAyLCAxKTsKKyAgICAgICAgcmV0dXJuIChwcmV2UGFnZSAqIHByb2R1Y3RzUGVyUGFnZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU5leHRTdGFydElkeChpbnQgbWF4UGFnZSwgaW50IHByb2R1Y3RzUGVyUGFnZSkgeworICAgICAgICBpbnQgbmV4dFBhZ2UgPSBtYXhQYWdlOworICAgICAgICByZXR1cm4gKG5leHRQYWdlICogcHJvZHVjdHNQZXJQYWdlKTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBpdGVyYXRlRnJvbShmaW5hbCBpbnQgc3RhcnRJbmRleCwKKyAgICAgICAgICAgIGZpbmFsIExpc3Qgb3JpZ2luYWxMaXN0LCBpbnQgcGFnZVNpemUpIHsKKyAgICAgICAgZmluYWwgaW50IHRvdGFsU2l6ZSA9IG9yaWdpbmFsTGlzdC5zaXplKCk7CisKKyAgICAgICAgaW50IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHBhZ2VTaXplOworICAgICAgICBpZiAoZW5kSW5kZXggPiB0b3RhbFNpemUpCisgICAgICAgICAgICBlbmRJbmRleCA9IHRvdGFsU2l6ZTsKKworICAgICAgICByZXR1cm4gb3JpZ2luYWxMaXN0LnN1Ykxpc3Qoc3RhcnRJbmRleCwgZW5kSW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRvdGFsUGFnZShMaXN0IG9yaWdpbmFsTGlzdCwgaW50IHBhZ2VTaXplKSB7CisgICAgICAgIGlmIChvcmlnaW5hbExpc3QgPT0gbnVsbCB8fCBvcmlnaW5hbExpc3Quc2l6ZSgpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZmluYWwgaW50IHRvdGFsU2l6ZSA9IG9yaWdpbmFsTGlzdC5zaXplKCk7CisgICAgICAgIHJldHVybiAoKHRvdGFsU2l6ZSAtIDEpIC8gcGFnZVNpemUpICsgMTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUb3RhbFBhZ2UoaW50IG51bVRvdGFsLCBpbnQgcGFnZVNpemUpIHsKKyAgICAgICAgaWYgKG51bVRvdGFsIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuICgobnVtVG90YWwgLSAxKSAvIHBhZ2VTaXplKSArIDE7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9zcHJpbmcvU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9zcHJpbmcvU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWEwYjE0NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3NwcmluZy9TcHJpbmdTZXRJZEluamVjdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnNwcmluZzsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlJlcXVpcmVkOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBTcHJpbmdTZXRJZEluamVjdGlvblR5cGUgeworCisgICAgLyoqCisgICAgICogR2V0IGEgdW5pcXVlIFN0cmluZyBpZCB0aGF0IHJlcHJlc2VudHMgdGhpcyBvYmplY3RzIGluc3RhbmNlCisgICAgICogQHJldHVybiBVbmlxdWUgU3RyaW5nIGlkCisgICAgICovCisgICAgQFJlcXVpcmVkCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgdW5pcXVlIGlkIHRoYXQgcmVwcmVzZW50cyB0aGlzIG9iamVjdHMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gaWQgVW5pcXVlIFN0cmluZyBpZAorICAgICAqLworICAgIEBSZXF1aXJlZAorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3NwcmluZy9wb3N0cHJvY2Vzc29yL1NldElkQmVhblBvc3RQcm9jZXNzb3IuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3NwcmluZy9wb3N0cHJvY2Vzc29yL1NldElkQmVhblBvc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTMxODllCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvc3ByaW5nL3Bvc3Rwcm9jZXNzb3IvU2V0SWRCZWFuUG9zdFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLnBvc3Rwcm9jZXNzb3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLlNwcmluZ1NldElkSW5qZWN0aW9uVHlwZTsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbnNFeGNlcHRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5CZWFuUG9zdFByb2Nlc3NvcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBTZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIGltcGxlbWVudHMgQmVhblBvc3RQcm9jZXNzb3IgeworCisgICAgcHVibGljIE9iamVjdCBwb3N0UHJvY2Vzc0FmdGVySW5pdGlhbGl6YXRpb24oT2JqZWN0IGJlYW4sIFN0cmluZyBiZWFuTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBCZWFuc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlKQorICAgICAgICAgICAgKChTcHJpbmdTZXRJZEluamVjdGlvblR5cGUpIGJlYW4pLnNldElkKGJlYW5OYW1lKTsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBwb3N0UHJvY2Vzc0JlZm9yZUluaXRpYWxpemF0aW9uKE9iamVjdCBiZWFuLCBTdHJpbmcgYmVhbk5hbWUpCisgICAgICAgICAgICB0aHJvd3MgQmVhbnNFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvQmFzZTY0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0Jhc2U2NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NmMxM2MKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0Jhc2U2NC5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLio7CisKKy8qKiBCYXNlIDY0IGVuY29kaW5nIGFuZCBkZWNvZGluZy4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIFJGQy0xNTIxIHNwZWNpZmllZCAiYmFzZSA2NCIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mCisgKiBhcmJpdHJhcnkgZGF0YS4gIFBhc3MgYSBieXRlIGFycmF5IGludG8gdGhlIHtAbGluayAjZW5jb2RlfSBtZXRob2QgYW5kIHlvdSdsbCBnZXQgYQorICogYnl0ZSBhcnJheSByZXN1bHQgd2hlcmUgYWxsIG9mIHRoZSBieXRlcyBhcmUgcHJpbnRhYmxlIEFTQ0lJIHZhbHVlcy4gIFBhc3MgdGhhdCByZXN1bHQKKyAqIGludG8ge0BsaW5rICNkZWNvZGV9IGFuZCB5b3UnbGwgZ2V0IHlvdXIgb3JpZ2luYWwgYnl0ZSBhcnJheS4KKyAqCisgKiA8cD5TaW5jZXJlIHRoYW5rcyB0byBUb20gRGFsZXkgZm9yIHByb3ZpZGluZyBhIHNhbXBsZSBlbmNvZGVyIGFsZ29yaXRobSBhbmQgYSBncmVhdAorICogZXhwbGFuYXRpb24gb2YgaG93IFJGQy0xNTIxIGlzIHN1cHBvc2VkIHRvIHdvcmsuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgQmFzZTY0IHsKKwkvKiogRW5jb2RlIGludG8gYmFzZSA2NC4KKwkgKgorCSAqIEVuY29kZSB0aGUgZ2l2ZW4gZGF0YSBpbnRvIFJGQy0xNTIxIGJhc2UgNjQuICBFbmNvZGluZyBhIG51bGwgYXJyYXkgZ2l2ZXMgYQorCSAqIG51bGwgcmVzdWx0LgorCSAqCisJICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZW5jb2RlLgorCSAqIEByZXR1cm4gQmFzZS02NCBlbmNvZGVkIDx2YXI+ZGF0YTwvdmFyPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoZmluYWwgYnl0ZVtdIGRhdGEpIHsKKwkJcmV0dXJuIGVuY29kZShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisJfQorCisJLyoqIEVuY29kZSBpbnRvIGJhc2UgNjQuCisJICoKKwkgKiBFbmNvZGUgdGhlIGdpdmVuIGRhdGEgaW50byBSRkMtMTUyMSBiYXNlIDY0LiAgRW5jb2RpbmcgYSBudWxsIGFycmF5IGdpdmVzIGEKKwkgKiBudWxsIHJlc3VsdC4gIFN0YXJ0IGVuY29kaW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQgYW5kIGdvIGZvciB0aGUgZ2l2ZW4gYW1vdW50IG9mCisJICogYnl0ZXMuCisJICoKKwkgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBlbmNvZGUuCisJICogQHBhcmFtIG9mZnNldCBXaGVyZSB0byBzdGFydCBsb29raW5nIGZvciBkYXRhIHRvIGVuY29kZS4KKwkgKiBAcGFyYW0gbGVuZ3RoIEhvdyBtdWNoIGRhdGEgdG8gZW5jb2RlLgorCSAqIEByZXR1cm4gQmFzZS02NCBlbmNvZGVkIDx2YXI+ZGF0YTwvdmFyPgorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShmaW5hbCBieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gZGF0YS5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiQ2FuJ3QgZW5jb2RlIGF0IGluZGV4ICIgKyBvZmZzZXQgKyAiIHdoaWNoIGlzIGJleW9uZCBhcnJheSBib3VuZHMgMC4uIgorCQkJCSsgZGF0YS5sZW5ndGgpOworCQlpZiAobGVuZ3RoIDwgMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgZW5jb2RlIGEgbmVnYXRpdmUgYW1vdW50IG9mIGRhdGEiKTsKKwkJaWYgKG9mZnNldCArIGxlbmd0aCA+IGRhdGEubGVuZ3RoKQorCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkNhbid0IGVuY29kZSBiZXlvbmQgcmlnaHQgZWRnZSBvZiBhcnJheSIpOworCQkKKwkJaW50IGksIGo7CisJCWJ5dGUgZGVzdFtdID0gbmV3IGJ5dGVbKChsZW5ndGgrMikvMykqNF07CisKKwkJLy8gQ29udmVydCBncm91cHMgb2YgMyBieXRlcyBpbnRvIDQuCisJCWZvciAoaSA9IDAgKyBvZmZzZXQsIGogPSAwOyBpIDwgb2Zmc2V0ICsgbGVuZ3RoIC0gMjsgaSArPSAzKSB7CisJCQlkZXN0W2orK10gPSAoYnl0ZSkgKChkYXRhW2ldID4+PiAyKSAmIDA3Nyk7CisJCQlkZXN0W2orK10gPSAoYnl0ZSkgKChkYXRhW2krMV0gPj4+IDQpICYgMDE3IHwgKGRhdGFbaV0gPDwgNCkgJiAwNzcpOworCQkJZGVzdFtqKytdID0gKGJ5dGUpICgoZGF0YVtpKzJdID4+PiA2KSAmIDAwMyB8IChkYXRhW2krMV0gPDwgMikgJiAwNzcpOworCQkJZGVzdFtqKytdID0gKGJ5dGUpIChkYXRhW2krMl0gJiAwNzcpOworCQl9CisKKwkJLy8gQ29udmVydCBhbnkgbGVmdG92ZXIgYnl0ZXMuCisJCWlmIChpIDwgb2Zmc2V0ICsgbGVuZ3RoKSB7CisJCQlkZXN0W2orK10gPSAoYnl0ZSkgKChkYXRhW2ldID4+PiAyKSAmIDA3Nyk7CisJCQlpZiAoaSA8IG9mZnNldCArIGxlbmd0aCAtIDEpIHsKKwkJCQlkZXN0W2orK10gPSAoYnl0ZSkgKChkYXRhW2krMV0gPj4+IDQpICYgMDE3IHwgKGRhdGFbaV0gPDwgNCkgJiAwNzcpOworCQkJCWRlc3RbaisrXSA9IChieXRlKSAoKGRhdGFbaSsxXSA8PCAyKSAmIDA3Nyk7CisJCQl9IGVsc2UKKwkJCQlkZXN0W2orK10gPSAoYnl0ZSkgKChkYXRhW2ldIDw8IDQpICYgMDc3KTsKKwkJfQorCisJCS8vIE5vdywgbWFwIHRob3NlIG9udG8gYmFzZSA2NCBwcmludGFibGUgQVNDSUkuCisJCWZvciAoaSA9IDA7IGkgPGo7IGkrKykgeworCQkJaWYgICAgICAoZGVzdFtpXSA8IDI2KSAgZGVzdFtpXSA9IChieXRlKShkZXN0W2ldICsgJ0EnKTsKKwkJCWVsc2UgaWYgKGRlc3RbaV0gPCA1MikgIGRlc3RbaV0gPSAoYnl0ZSkoZGVzdFtpXSArICdhJy0yNik7CisJCQllbHNlIGlmIChkZXN0W2ldIDwgNjIpICBkZXN0W2ldID0gKGJ5dGUpKGRlc3RbaV0gKyAnMCctNTIpOworCQkJZWxzZSBpZiAoZGVzdFtpXSA8IDYzKSAgZGVzdFtpXSA9IChieXRlKSAnKyc7CisJCQllbHNlICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGJ5dGUpICcvJzsKKwkJfQorCisJCS8vIFBhZCB0aGUgcmVzdWx0IHdpdGggYW5kIHdlJ3JlIGRvbmUuCisJCWZvciAoOyBpIDwgZGVzdC5sZW5ndGg7IGkrKykgZGVzdFtpXSA9IChieXRlKSAnPSc7CisJCXJldHVybiBkZXN0OworCX0KKworCS8qKiBEZWNvZGUgZnJvbSBiYXNlIDY0LgorCSAqCisJICogRGVjb2RlIHRoZSBnaXZlbiBSRkMtMTUyMSBiYXNlIDY0IGVuY29kZWQgYnl0ZXMgaW50byB0aGUgb3JpZ2luYWwgZGF0YSB0aGV5CisJICogcmVwcmVzZW50LiAgRGVjb2RpbmcgbnVsbCBkYXRhIGdpdmVzIGEgbnVsbCByZXN1bHQuCisJICoKKwkgKiBAcGFyYW0gZGF0YSBCYXNlLTY0IGVuY29kZWQgZGF0YSB0byBkZWNvZGUuCisJICogQHJldHVybiBEZWNvZGVkIDx2YXI+ZGF0YTwvdmFyPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoZmluYWwgYnl0ZVtdIGRhdGEpIHsKKwkJcmV0dXJuIGRlY29kZShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisJfQorCisJLyoqIERlY29kZSBmcm9tIGJhc2UgNjQuCisJICoKKwkgKiBEZWNvZGUgdGhlIGdpdmVuIFJGQy0xNTIxIGJhc2UgNjQgZW5jb2RlZCBieXRlcyBpbnRvIHRoZSBvcmlnaW5hbCBkYXRhIHRoZXkKKwkgKiByZXByZXNlbnQuICBEZWNvZGluZyBudWxsIGRhdGEgZ2l2ZXMgYSBudWxsIHJlc3VsdC4KKwkgKgorCSAqIEBwYXJhbSBkYXRhIEJhc2UtNjQgZW5jb2RlZCBkYXRhIHRvIGRlY29kZS4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIGRhdGEgdG8gZGVjb2RlLgorCSAqIEBwYXJhbSBsZW5ndGggSG93IG11Y2ggZGF0YSB0byBkZWNvZGUuCisJICogQHJldHVybiBEZWNvZGVkIDx2YXI+ZGF0YTwvdmFyPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoZmluYWwgYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBkYXRhLmxlbmd0aCkKKwkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJDYW4ndCBkZWNvZGUgYXQgaW5kZXggIiArIG9mZnNldCArICIgd2hpY2ggaXMgYmV5b25kIGFycmF5IGJvdW5kcyAwLi4iCisJCQkJKyAoZGF0YS5sZW5ndGgtMSkpOworCQlpZiAobGVuZ3RoIDwgMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgZGVjb2RlIGEgbmVnYXRpdmUgYW1vdW50IG9mIGRhdGEiKTsKKwkJaWYgKG9mZnNldCArIGxlbmd0aCA+IGRhdGEubGVuZ3RoKQorCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkNhbid0IGRlY29kZSBiZXlvbmQgcmlnaHQgZWRnZSBvZiBhcnJheSIpOworCisJCS8vIElnbm9yZSBhbnkgcGFkZGluZyBhdCB0aGUgZW5kLgorCQlpbnQgdGFpbCA9IG9mZnNldCArIGxlbmd0aCAtIDE7CisJCXdoaWxlICh0YWlsID49IG9mZnNldCAmJiBkYXRhW3RhaWxdID09ICc9JykKKwkJCS0tdGFpbDsKKwkJYnl0ZSBkZXN0W10gPSBuZXcgYnl0ZVt0YWlsICsgb2Zmc2V0ICsgMSAtIGxlbmd0aC80XTsKKworCQkvLyBGaXJzdCwgY29udmVydCBmcm9tIGJhc2UtNjQgYXNjaWkgdG8gNiBiaXQgYnl0ZXMuCisJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQrbGVuZ3RoOyBpKyspIHsKKwkJCWlmICAgICAgKGRhdGFbaV0gPT0gJz0nKSBkYXRhW2ldID0gMDsKKwkJCWVsc2UgaWYgKGRhdGFbaV0gPT0gJy8nKSBkYXRhW2ldID0gNjM7CisJCQllbHNlIGlmIChkYXRhW2ldID09ICcrJykgZGF0YVtpXSA9IDYyOworCQkJZWxzZSBpZiAoZGF0YVtpXSA+PSAnMCcgJiYgZGF0YVtpXSA8PSAnOScpCisJCQkJZGF0YVtpXSA9IChieXRlKShkYXRhW2ldIC0gKCcwJyAtIDUyKSk7CisJCQllbHNlIGlmIChkYXRhW2ldID49ICdhJyAgJiYgIGRhdGFbaV0gPD0gJ3onKQorCQkJCWRhdGFbaV0gPSAoYnl0ZSkoZGF0YVtpXSAtICgnYScgLSAyNikpOworCQkJZWxzZSBpZiAoZGF0YVtpXSA+PSAnQScgICYmICBkYXRhW2ldIDw9ICdaJykKKwkJCQlkYXRhW2ldID0gKGJ5dGUpKGRhdGFbaV0gLSAnQScpOworCQl9CisKKwkJLy8gTWFwIHRob3NlIGZyb20gNCA2LWJpdCBieXRlIGdyb3VwcyBvbnRvIDMgOC1iaXQgYnl0ZSBncm91cHMuCisJCWludCBpLCBqOworCQlmb3IgKGkgPSAwICsgb2Zmc2V0LCBqID0gMDsgaiA8IGRlc3QubGVuZ3RoIC0gMjsgaSArPSA0LCBqICs9IDMpIHsKKwkJCWRlc3Rbal0gICA9IChieXRlKSAoKChkYXRhW2ldIDw8IDIpICYgMjU1KSB8ICgoZGF0YVtpKzFdID4+PiA0KSAmIDAwMykpOworCQkJZGVzdFtqKzFdID0gKGJ5dGUpICgoKGRhdGFbaSsxXSA8PCA0KSAmIDI1NSkgfCAoKGRhdGFbaSsyXSA+Pj4gMikgJiAwMTcpKTsKKwkJCWRlc3RbaisyXSA9IChieXRlKSAoKChkYXRhW2krMl0gPDwgNikgJiAyNTUpIHwgKGRhdGFbaSszXSAmIDA3NykpOworCQl9CisKKwkJLy8gQW5kIGdldCB0aGUgbGVmdG92ZXIgLi4uCisJCWlmIChqIDwgZGVzdC5sZW5ndGgpCisJCQlkZXN0W2pdID0gKGJ5dGUpICgoKGRhdGFbaV0gPDwgMikgJiAyNTUpIHwgKChkYXRhW2krMV0gPj4+IDQpICYgMDAzKSk7CisJCWlmICgrK2ogPCBkZXN0Lmxlbmd0aCkKKwkJCWRlc3Rbal0gPSAoYnl0ZSkgKCgoZGF0YVtpKzFdIDw8IDQpICYgMjU1KSB8ICgoZGF0YVtpKzJdID4+PiAyKSAmIDAxNykpOworCisJCS8vIFRoYXQncyBpdC4KKwkJcmV0dXJuIGRlc3Q7CisJfQorCisJLyoqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbmFtZXNwYWNlIGZvciB1dGlsaXR5IG1ldGhvZHMgYW5kIHNob3VsZG4ndCBiZSBpbnN0YW50aWF0ZWQuCisJICovCisJcHJpdmF0ZSBCYXNlNjQoKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIik7CisJfQorCisJLyoqIENvbW1hbmQtbGluZSBydW5uZXIgdGhhdCBlbmNvZGVzIG9yIGRlY29kZXMuCisJICoKKwkgKiBAcGFyYW0gYXJndiBDb21tYW5kLWxpbmUgYXJndW1lbnRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAoYXJndi5sZW5ndGggPCAxIHx8IGFyZ3YubGVuZ3RoID4gMikgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogZW5jb2RlfGRlY29kZSBbZmlsZV0iKTsKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisJCWJvb2xlYW4gZW5jb2RlID0gdHJ1ZTsKKwkJaWYgKCJlbmNvZGUiLmVxdWFscyhhcmd2WzBdKSkKKwkJCWVuY29kZSA9IHRydWU7CisJCWVsc2UgaWYgKCJkZWNvZGUiLmVxdWFscyhhcmd2WzBdKSkKKwkJCWVuY29kZSA9IGZhbHNlOworCQllbHNlIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU3BlY2lmeSBlaXRoZXIgXCJlbmNvZGVcIiBvciBcImRlY29kZVwiIik7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCQlJbnB1dFN0cmVhbSBzb3VyY2UgPSBhcmd2Lmxlbmd0aCA9PSAyPyBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGFyZ3ZbMV0pKSA6IFN5c3RlbS5pbjsKKwkJSW5wdXRTdHJlYW0gaW47CisJCU91dHB1dFN0cmVhbSBvdXQ7CisJCWlmIChlbmNvZGUpIHsKKwkJCWluID0gc291cmNlOworCQkJb3V0ID0gbmV3IEJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpOworCQl9IGVsc2UgeworCQkJaW4gPSBuZXcgQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbShzb3VyY2UpOworCQkJb3V0ID0gU3lzdGVtLm91dDsKKwkJfQorCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNTEyXTsKKwkJaW50IG51bVJlYWQ7CisJCXdoaWxlICgobnVtUmVhZCA9IGluLnJlYWQoYnVmKSkgIT0gLTEpCisJCQlvdXQud3JpdGUoYnVmLCAwLCBudW1SZWFkKTsKKwkJaW4uY2xvc2UoKTsKKwkJb3V0LmNsb3NlKCk7CisJCVN5c3RlbS5leGl0KDApOworCX0KK30KKworCQkJCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0NhY2hlTWFwLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0NhY2hlTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzZDkyZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvQ2FjaGVNYXAuamF2YQpAQCAtMCwwICsxLDIyOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvLyBEZWZpbml0aW9ucyBmb3IgaW50ZW5kZWQgZnVuY3Rpb25zOgorLy8KKy8vIERFRk4gc2l6ZSh4KSA9IFRoZSBzaXplIG9mIGFuIG9iamVjdCB4LCB1c3VhbGx5IGJ5IHRoZSBzaXplKCksIGxlbmd0aCgpLCBvciBnZXRMZW5ndGgoKQorLy8gICAgICAgICAgICAgICAgbWV0aG9kcyBkZWZpbmVkIGZvciB4LgorLy8gTkZFRAorLy8KKy8vIERFRk4ga2V5cyh4KSA9IFNldCBvZiBrZXlzIGZyb20gbWFwIHguCisvLyBORkVECisvLworLy8gREVGTiBkdXAoeCkgPSBEdXBsaWNhdGUgb2Ygb2JqZWN0IHguCisvLyBORkVECisvLworLy8gREVGTiBwcmVzZW5jZSh4LCB5KSA9IFRydWUgaWYgKHgsIHopIG9yICh6LCB4KSBleGlzdHMgaW4gbWFwIHkgZm9yIGFueSB6LgorLy8gTkZFRAorLy8KKy8vIERFRk4gYWR2YW5jZSh4LCB5KSA9IHNlcXVlbmNlIHkgc3VjaCB0aGF0IG9iamVjdCB4IGluIHkgaXMgbW92ZWQgdG8gdGhlIGZyb250IG9mIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UsIG9yIHkgaWYgeCBpcyBub3QgYW4gZWxlbWVudCBvZiB4LgorLy8gTkZFRAorLy8KKy8vIERFRk4gdmFsdWUodiwgeSkgPSB2YWx1ZSB2IG9mIChrLCB2KSBtYXBwaW5nIGluIHkuCisvLyBORkVECisvLworLy8gQSBjYWNoZS1tYXAgWiBpcyBhIHRyaXBsZSAoYywgQywgTSkgc3VjaCB0aGF0IGMgaXMgdGhlIGNhcGFjaXR5LCBDIGlzIGFuIG9yZGVyZWQKKy8vIHNlcXVlbmNlIG9mIG4ga2V5cyA9IHtrXzAsIGtfMSwgLi4uLCBrXyhuLTEpfSwgYW5kIE0gaXMgYSBzZXQgb2YgbWFwcGluZ3MgKGssIHYpIHN1Y2gKKy8vIHRoYXQgayBpcyB0aGUgZm9yIHZhbHVlIHYsIGFuZCBhbGwgaydzIGFyZSB1bmlxdWUuICBGb3IgYWxsIGtfaSBpbiBDLCB0aGVyZSBleGlzdHMKKy8vIChrX2ksIHZfaSkgaW4gTS4gIHNpemUoWikgPSBzaXplKEMpID0gc2l6ZShNKSA8PSBjLiAgVGhlIG1vc3QgcmVjZW50bHkgdXNlZCB2IGlzIGF0IHRoZQorLy8gaGVhZCBvZiBDLCBhbmQgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXMgYXQgdGhlIHRhaWwuICBXaGVuIGEgbmV3IChrX25ldywgdl9uZXcpIGlzCisvLyBhZGRlZCB0byBaLCBDID0ge2tfbmV3LCBrXzAsIC4uLiwga18obi0xKX0gYW5kIGlmIHNpemUoQykgPj0gYywgdGhlIHByZXZpb3VzIGtfKG4tMSkgaXMKKy8vIHJlbW92ZWQgZnJvbSBDIGFuZCBNOyBhbmQgTSA9IE0gVSAoa19uZXcsIHZfbmV3KS4KKworCisvKiogQSBjYWNoZSBtYXAgaXMgYSBtYXAgd2l0aCBhIGJ1aWx0LWluIGNhY2hlLgorICoKKyAqIEl0IG9wZXJhdGVzIGluIGFsbCB3YXlzIGxpa2UgYSByZWd1bGFyIHtAbGluayBqYXZhLnV0aWwuTWFwfSwgZXhjZXB0IHRoYXQgeW91IGNhbiBzdG9yZQorICogb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGVudHJpZXMuICBBZnRlciBhZGRpbmcgYW4gZW50cnkgdGhhdCBleGNlZWRzIHRoZSBzaXplIG9mIHRoZQorICogY2FjaGUsIHRoZSBtYXAgZWplY3RzIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGVudHJ5LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIENhY2hlTWFwIGltcGxlbWVudHMgTWFwIHsKKwkvKiogQ3JlYXRlIGEgY2FjaGUgbWFwIHdpdGggYSBkZWZhdWx0IGNhcGFjaXR5IG9mIDUgZW50cmllcy4KKwkgKi8KKwlwdWJsaWMgQ2FjaGVNYXAoKSB7CisJCS8vIEZYTjogWyBjLCBDLCBNIDo9IDUsIHt9LCB7fSBdCisJCXRoaXMoREVGQVVMVF9DQVBBQ0lUWSk7CisJfQorCisJLyoqIENyZWF0ZSBhIGNhY2hlIG1hcCB3aXRoIHRoZSBnaXZlbiBjYXBhY2l0eS4KKwkgKgorCSAqIEBwYXJhbSBjYXBhY2l0eSBIb3cgYmlnIHRoZSBjYWNoZSBpcy4KKwkgKi8KKwlwdWJsaWMgQ2FjaGVNYXAoaW50IGNhcGFjaXR5KSB7CisJCS8vIEZYTjogWyBjLCBDLCBNIDo9IGNhcGFjaXR5LCB7fSwge30gXQorCisJCWlmIChjYXBhY2l0eSA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBoYXZlIGEgbmVnYXRpdmUgc2l6ZSAiICsgY2FwYWNpdHkgKyAiIGNhY2hlIG1hcCIpOworCQl0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7CisJfQorCisJLyoqIEdldCB0aGUgY2FjaGUgbWFwJ3MgY2FwYWNpdHkuCisJICoKKwkgKiBAcmV0dXJuIEl0cyBjYXBhY2l0eS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldENhcGFjaXR5KCkgeworCQlyZXR1cm4gY2FwYWNpdHk7CisJfQorCisJLyoqIENyZWF0ZSBhIGNhY2hlIG1hcCBmcm9tIHRoZSBnaXZlbiBtYXAsIGhhdmluZyB0aGUgY2FwYWNpdHkgb2YgdGhlIGdpdmVuIG1hcC4KKwkgKgorCSAqIEBwYXJhbSBtYXAgVGhlIG1hcCB0byBjb3B5LgorCSAqLworCXB1YmxpYyBDYWNoZU1hcChNYXAgbWFwKSB7CisJCS8vIEZYTjogWyBjLCBDLCBNIDo9IHNpemUobWFwKSwga2V5cyhtYXApLCBkdXAobWFwKSBdCisKKwkJdGhpcy5jYXBhY2l0eSA9IG1hcC5zaXplKCk7CisJCXB1dEFsbChtYXApOworCX0KKworCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJLy8gRlhOOiBbIHJldHVybiB2YWx1ZSA6PSBzaXplKE0pIF0KKwkJcmV0dXJuIG1hcC5zaXplKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJLy8gRlhOOiBbIHJldHVybiB2YWx1ZSA6PSBzaXplKE0pID0gMD8gXQorCQlyZXR1cm4gbWFwLnNpemUoKSA9PSAwOworCX0KKworCS8qKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBjYWNoZSBtYXAuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBvdGhlcndpc2UgYWZmZWN0IHRoZSBjYWNoZS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgS2V5IHRvIGNoZWNrLgorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2FjaGUgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIDx2YXI+a2V5PC92YXI+LgorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKKwkJLy8gRlhOOiBbIHJldHVybiB2YWx1ZSA6PSBwcmVzZW5jZShrZXksIE0pIF0KKwkJcmV0dXJuIChtYXAuY29udGFpbnNLZXkoa2V5KSk7CisJfQorCisJLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSdzIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgY2FjaGUgbWFwLgorCSAqCisJICogVGhpcyBtZXRob2QgZG9lcyBub3Qgb3RoZXJ3aXNlIGFmZmVjdCB0aGUgY2FjaGUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2suCisJICogQHJldHVybiBUcnVlIGlmIHRoZSBjYWNoZSBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgPHZhcj52YWx1ZTwvdmFyPi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworCQkvLyBGWE46IFsgcmV0dXJuIHZhbHVlIDo9IHByZXNlbmNlKHZhbHVlLCBNKSBdCisJCXJldHVybiBtYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworCQkvLyBGWE46IFsga2V5IGluIE0gLT4gQywgcmV0dXJuIHZhbHVlIDo9IGFkdmFuY2Uoa2V5LCBDKSwgdmFsdWUoa2V5LCBNKQorCQkvLyAgICAgIHwgdHJ1ZSAgICAgLT4gQywgcmV0dXJuIHZhbHVlIDo9IEMsIG51bGwgXQorCisJCWFkdmFuY2Uoa2V5KTsKKwkJcmV0dXJuIG1hcC5nZXQoa2V5KTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJLy8gRlhOOiBbIGtleSBpbiBNIC0+IEMsIE0sIHJldHVybiB2YWx1ZSA6PSBhZHZhbmNlKGtleSwgQyksIE0gVSAoa2V5LCB2YWx1ZSksIHZhbHVlKGtleSwgTSkKKwkJLy8gICAgICB8IHNpemUoQykgPCBjIC0+IEMsIE0sIHJldHVybiB2YWx1ZSA6PSBrZXkgfHwgQywgTSBVIChrZXksIHZhbHVlKSwgbnVsbAorCQkvLyAgICAgIHwgdHJ1ZSAtPiBDLCBNLCByZXR1cm4gdmFsdWUgOj0ga2V5IHx8IHtrX2kgfCBrIGVsZW0gQywgMCA8PSBpIDw9IGMgLSAyfSwKKwkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNIFUgKGtleSwgdmFsdWUpKSAtIChrXyhjLTEpLCB2KSwgbnVsbCBdCisKKwkJT2JqZWN0IG9sZCA9IG1hcC5wdXQoa2V5LCB2YWx1ZSk7CisJCWlmIChvbGQgIT0gbnVsbCkgeworCQkJYWR2YW5jZShrZXkpOworCQkJcmV0dXJuIG9sZDsKKwkJfQorCisJCWNhY2hlLmFkZEZpcnN0KGtleSk7CisJCWlmIChjYWNoZS5zaXplKCkgPiBjYXBhY2l0eSkKKwkJCW1hcC5yZW1vdmUoY2FjaGUucmVtb3ZlTGFzdCgpKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKKwkJLy8gRlhOOiBbIGtleSBpbiBNIC0+IEMsIE0sIHJldHVybiB2YWx1ZSA6PSBDIC0ga2V5LCBNIC0gKGtleSwgdiksIHYKKwkJLy8gICAgICB8IHRydWUgLT4gcmV0dXJuIHZhbHVlIDo9IG51bGwgXQorCisJCWlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpCisJCQlyZXR1cm4gbnVsbDsKKwkJY2FjaGUucmVtb3ZlKGtleSk7CisJCXJldHVybiBtYXAucmVtb3ZlKGtleSk7CisJfQorCisJcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7CisJCS8vIEZYTjogWyBDLCBNIDo9IChrZXlzKHQpIHx8IEMpWzAuLihjLTEpXSwgeyAoa19pLCB2X2kpIHwga19pIGVsZW0gb2YgKGtleXModCkgfHwgQylbMC4uKGMtMSldfSBdCisJCWZvciAoSXRlcmF0b3IgaSA9IHQuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworCQkJcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQljYWNoZS5jbGVhcigpOworCQltYXAuY2xlYXIoKTsKKwl9CisKKwlwdWJsaWMgU2V0IGtleVNldCgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgZm9yIENhY2hlTWFwIik7CisJfQorCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgZm9yIENhY2hlTWFwIik7CisJfQorCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIGZvciBDYWNoZU1hcCIpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIENhY2hlTWFwKSkgcmV0dXJuIGZhbHNlOworCQlDYWNoZU1hcCBvYmogPSAoQ2FjaGVNYXApIHJoczsKKwkJcmV0dXJuIG9iai5jYWNoZS5lcXVhbHMoY2FjaGUpOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBjYWNoZS5oYXNoQ29kZSgpOworCX0KKworCS8qKiBBZHZhbmNlIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGZyb250IG9mIHRoZSBjYWNoZS4KKwkgKgorCSAqIElmIHRoZSBrZXkgaXNuJ3QgaW4gdGhlIGNhY2hlLCBsZWF2ZSB0aGUgY2FjaGUgYWxvbmUuCisJICoKKwkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gYWR2YW5jZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWR2YW5jZShPYmplY3Qga2V5KSB7CisJCS8vIEZYTjogWyBDID0gYWR2YW5jZShrZXksIEMpIF0KKworCQlib29sZWFuIHByZXNlbnQgPSBjYWNoZS5yZW1vdmUoa2V5KTsKKwkJaWYgKCFwcmVzZW50KSByZXR1cm47CisJCWNhY2hlLmFkZEZpcnN0KGtleSk7CisJfQorCisJLyoqIFdoYXQgdGhlIGRlZmF1bHQgY2FwYWNpdHkgb2YgYSBjYWNoZSBtYXAgaXMuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSA1OworCisJLyoqIFRoZSBjYWNoZSAoQykuICovCisJcHJpdmF0ZSBMaW5rZWRMaXN0IGNhY2hlID0gbmV3IExpbmtlZExpc3QoKTsKKworCS8qKiBUaGUgbWFwIChNKS4gKi8KKwlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworCisJLyoqIFRoZSBjYXBhY2l0eSBvZiB0aGlzIGNhY2hlIG1hcCAoYykuICovCisJcHJpdmF0ZSBpbnQgY2FwYWNpdHk7Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRE9NUGFyc2VyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0RPTVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTJiZmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0RPTVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CisKKy8qKiBBbiBYTUwgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIHBhcnNlci4KKyAqCisgKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIERPTSBwYXJzZXJzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIERPTVBhcnNlciB7CisJLyoqIENvbnN0cnVjdCB0aGUgRE9NIFBhcnNlci4KKwkgKi8KKwlET01QYXJzZXIoRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIpIHsKKwkJdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKKwl9CisKKwkvKiogR2V0IHRoZSBkb2N1bWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRvY3VtZW50LgorCSAqLworCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKKwkJaWYgKGRvY3VtZW50ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IHBhcnNlIHNvbWV0aGluZyBmaXJzdCIpOworCQlyZXR1cm4gZG9jdW1lbnQ7CisJfQorCisJLyoqIFJldHVybnMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgdGhpcyBwYXJzZXIgcmVjb2duaXplcy4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGw7IGlmIG5vIGZlYXR1cmVzIGFyZSByZWNvZ25pemVkLCB0aGlzCisJICogbWV0aG9kIHdpbGwgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIFJlY29nbml6ZWQgZmVhdHVyZXMuCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldEZlYXR1cmVzUmVjb2duaXplZCgpIHsKKwkJcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgdGhpcyBwYXJzZXIgcmVjb2duaXplcy4KKwkgKiBUaGlzIG1ldGhvZCB3aWxsIG5ldmVyIHJldHVybiBudWxsOyBpZiBubyBwcm9wZXJ0aWVzIGFyZQorCSAqIHJlY29nbml6ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIFJlY29nbml6ZWQgcHJvcGVydGllcy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydGllc1JlY29nbml6ZWQoKSB7CisJCXJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7CisJfQorCisJLyoqIFJlc2V0cyB0aGUgcGFyc2VyLiAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRvY3VtZW50ID0gbnVsbDsKKwl9CisKKwkvKiogUmVzZXRzIG9yIGNvcGllcyB0aGUgcGFyc2VyLiAqLworCXB1YmxpYyB2b2lkIHJlc2V0T3JDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc2V0KCk7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBzdGF0ZSBvZiBhbnkgZmVhdHVyZSBpbiBhIFNBWDIgcGFyc2VyLiAgVGhlIHBhcnNlcgorCSAqIG1pZ2h0IG5vdCByZWNvZ25pemUgdGhlIGZlYXR1cmUsIGFuZCBpZiBpdCBkb2VzIHJlY29nbml6ZQorCSAqIGl0LCBpdCBtaWdodCBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0LgorCSAqCisJICogQHBhcmFtIGZlYXR1cmVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgKFVSSSkgb2YgdGhlIGZlYXR1cmUuCisJICogQHBhcmFtIHN0YXRlIFRoZSByZXF1ZXN0ZWQgc3RhdGUgb2YgdGhlIGZlYXR1cmUgKHRydWUgb3IgZmFsc2UpLgorCSAqCisJICogQGV4Y2VwdGlvbiBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qga25vd24uCisJICogQGV4Y2VwdGlvbiBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24sIGJ1dCB0aGUgcmVxdWVzdGVkIHN0YXRlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlSWQsIGJvb2xlYW4gc3RhdGUpIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCQl0aHJvdyBuZXcgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHBhcnNlciBzdXBwb3J0cyBubyBmZWF0dXJlcyIpOworCX0KKworCS8qKgorCSAqIFF1ZXJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIGFueSBmZWF0dXJlIGluIGEgU0FYMiBwYXJzZXIuICBUaGUKKwkgKiBwYXJzZXIgbWlnaHQgbm90IHJlY29nbml6ZSB0aGUgZmVhdHVyZS4KKwkgKgorCSAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIChVUkkpIG9mIHRoZSBmZWF0dXJlCisJICogICAgICAgICAgICAgICAgICBiZWluZyBzZXQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmZWF0dXJlLgorCSAqCisJICogQGV4Y2VwdGlvbiBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qga25vd24uCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZUlkKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVGhpcyBwYXJzZXIgc3VwcG9ydHMgbm8gZmVhdHVyZXMiKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHZhbHVlIG9mIGFueSBwcm9wZXJ0eSBpbiBhIFNBWDIgcGFyc2VyLiAgVGhlIHBhcnNlcgorCSAqIG1pZ2h0IG5vdCByZWNvZ25pemUgdGhlIHByb3BlcnR5LCBhbmQgaWYgaXQgZG9lcyByZWNvZ25pemUKKwkgKiBpdCwgaXQgbWlnaHQgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBwcm9wZXJ0eUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciAoVVJJKSBvZiB0aGUgcHJvcGVydHkKKwkgKiAgICAgICAgICAgICAgICAgICBiZWluZyBzZXQuCisJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcHJvcGVydHkgaXMgYmVpbmcgc2V0LgorCSAqCisJICogQGV4Y2VwdGlvbiBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSByZXF1ZXN0ZWQgcHJvcGVydHkgaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGtub3duLgorCSAqIEBleGNlcHRpb24gU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIElmIHRoZSByZXF1ZXN0ZWQgcHJvcGVydHkgaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93biwgYnV0IHRoZSByZXF1ZXN0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUlkLCBPYmplY3QgdmFsdWUpIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCQl0aHJvdyBuZXcgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHBhcnNlciBzdXBwb3J0cyBubyBwcm9wZXJ0aWVzIik7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgcHJvcGVydHkgaW4gYSBTQVgyIHBhcnNlci4KKwkgKiBUaGUgcGFyc2VyIG1pZ2h0IG5vdCByZWNvZ25pemUgdGhlIHByb3BlcnR5LgorCSAqCisJICogQHBhcmFtIHByb3BlcnR5SWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIChVUkkpIG9mIHRoZSBwcm9wZXJ0eQorCSAqICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorCSAqCisJICogQGV4Y2VwdGlvbiBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIElmIHRoZSByZXF1ZXN0ZWQgcHJvcGVydHkgaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGtub3duLgorCSAqCisJICovCisJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlRoaXMgcGFyc2VyIHN1cHBvcnRzIG5vIHByb3BlcnRpZXMiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGlzIHJlY29nbml6ZWQuCisJICoKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVSZWNvZ25pemVkKFN0cmluZyBmZWF0dXJlSWQpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgcmVjb2duaXplZC4KKwkgKgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZWNvZ25pemVkKFN0cmluZyBwcm9wZXJ0eUlkKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm4gdGhlIGxvY2F0b3IgYmVpbmcgdXNlZCBieSB0aGUgcGFyc2VyCisJICoKKwkgKiBAcmV0dXJuIHRoZSBwYXJzZXIncyBhY3RpdmUgbG9jYXRvcgorCSAqLworCXB1YmxpYyBmaW5hbCBMb2NhdG9yIGdldExvY2F0b3IoKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxvY2F0b3JzIGFyIGVub3Qgc3VwcG9ydGVkIik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcmVzb2x2ZXIgdXNlZCB0byByZXNvbHZlIGV4dGVybmFsIGVudGl0aWVzLiBUaGUgRW50aXR5UmVzb2x2ZXIKKwkgKiBpbnRlcmZhY2Ugc3VwcG9ydHMgcmVzb2x1dGlvbiBvZiBwdWJsaWMgYW5kIHN5c3RlbSBpZGVudGlmaWVycy4KKwkgKgorCSAqIEBwYXJhbSByZXNvbHZlciBUaGUgbmV3IGVudGl0eSByZXNvbHZlci4gUGFzc2luZyBhIG51bGwgdmFsdWUgd2lsbAorCSAqICAgICAgICAgICAgICAgICB1bmluc3RhbGwgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgcmVzb2x2ZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKwkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IGVudGl0eSByZXNvbHZlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZW50aXR5IHJlc29sdmVyLCBvciBudWxsIGlmIG5vbmUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisJICogQHNlZSAjc2V0RW50aXR5UmVzb2x2ZXIKKwkgKi8KKwlwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSByZXNvbHZlciBjYW4gb25seSBiZSBzZXQsIG5vdCBxdWVyaWVkIik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZXJyb3IgaGFuZGxlci4KKwkgKgorCSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBuZXcgZXJyb3IgaGFuZGxlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGhhbmRsZXIpIHsKKwkJYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IGVycm9yIGhhbmRsZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGVycm9yIGhhbmRsZXIsIG9yIG51bGwgaWYgbm9uZQorCSAqICAgICAgICAgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KKwkgKiBAc2VlICNzZXRFcnJvckhhbmRsZXIKKwkgKi8KKwlwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGVycm9yIGhhbmRsZXIgY2FuIG9ubHkgYmUgc2V0LCBub3QgcXVlcmllZCIpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGlucHV0IHNvdXJjZS4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2UgVGhlIGlucHV0IHNvdXJjZS4KKwkgKgorCSAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIFRocm93cyBleGNlcHRpb24gb24gU0FYIGVycm9yLgorCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBUaHJvd3MgZXhjZXB0aW9uIG9uIGkvbyBlcnJvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFNvdXJjZSBzb3VyY2UpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKHNvdXJjZSk7CisJfQorCisJLyoqCisJICogUGFyc2VzIHRoZSBpbnB1dCBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBzeXN0ZW0gaWRlbnRpZmllci4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CisJICogPHByZT4KKwkgKiAgICAgcGFyc2UobmV3IElucHV0U291cmNlKHN5c3RlbUlkKSk7CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gc3lzdGVtSUQgVGhlIGlucHV0IHNvdXJjZS4KKwkgKgorCSAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIFRocm93cyBleGNlcHRpb24gb24gU0FYIGVycm9yLgorCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBUaHJvd3MgZXhjZXB0aW9uIG9uIGkvbyBlcnJvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3lzdGVtSUQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKHN5c3RlbUlEKTsKKwl9CisKKworCS8qKgorCSAqIFNldCB0aGUgbG9jYWxlIHRvIHVzZSBmb3IgbWVzc2FnZXMuCisJICoKKwkgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgb2JqZWN0IHRvIHVzZSBmb3IgbG9jYWxpemF0aW9uIG9mIG1lc3NhZ2VzLgorCSAqCisJICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gQW4gZXhjZXB0aW9uIHRocm93biBpZiB0aGUgcGFyc2VyIGRvZXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzIik7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKKwlwcml2YXRlIERvY3VtZW50IGRvY3VtZW50OworCXByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXI7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0RhdGVDb252ZXJ0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0RhdGVDb252ZXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2Y2M1YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRGF0ZUNvbnZlcnQuamF2YQpAQCAtMCwwICsxLDM5NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKKy8qKgorCVRoZSA8Y29kZT5EYXRlQ29udmVydDwvY29kZT4gY2xhc3MgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBkYXRlL3RpbWUKKwljb252ZXJzaW9uIGFuZCBwYXJzZSByb3V0aW5lcy4gRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGUKKwlmb3JtYXQgc3RyaW5ncyBzZWUge0BsaW5rIFNpbXBsZURhdGVGb3JtYXR9LgorCisJQGF1dGhvciBTLiBIYXJkbWFuCisJQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqLworcHVibGljIGNsYXNzIERhdGVDb252ZXJ0IHsKKworCS8qKgorCQlUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIG1pbnV0ZS4KKwkqLworCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTVNfSU5fTUlOVVRFID0gNjAwMDA7CisKKwkvKioKKwkJVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYW4gaG91ci4KKwkqLworCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTVNfSU5fSE9VUiA9IDM2MDAwMDA7CisKKwkvKioKKwkJVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSBkYXkuCisJKi8KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIE1TX0lOX0RBWSA9IDg2NDAwMDAwOworCisJLyoqCisJCVRoZSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSVNPIDg2MDEgZm9ybWF0LiBUaGUgZm9ybWF0CisJCWlzIGNsb3NlIHRvIENDU0RTIEFTQ0lJIFRpbWUgQ29kZSBBLiAKKwkqLworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJU09fRk9STUFUID0gInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MiOworCisJLyoqCisJCVRoZSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgQ0NTRFMgQVNDSUkgVGltZSBDb2RlIEIgZm9ybWF0CisJCWV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgIloiLgorCSovCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERPWV9GT1JNQVQgPSAieXl5eS1EREQnVCdISDptbTpzcy5TU1MiOworCisJLyoqCisJCVRoZSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgRURBIHRpbWUgc3RhbXAgZm9ybWF0LgorCSovCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRTX0ZPUk1BVCA9ICJ5eXl5TU1kZEhIbW1zc1NTUyI7CisKKwkvKioKKwkJVGhlIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBEQk1TIGZvcm1hdC4KKwkqLworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEQk1TX0ZPUk1BVCA9ICJkZC1NTU0teXl5eSBISDptbTpzcyI7CisKKwkvKioKKwkJVGhlIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBZZWFyLU1vbnRoLURheSBmb3JtYXQuCisJKi8KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWU1EX0ZPUk1BVCA9ICJ5eXl5LU1NLWRkIjsKKworCisJLyoqCisJCUNvbnN0cnVjdG9yIGdpdmVuIG5vIGFyZ3VtZW50cy4KKworCQlUaGlzIGlzIGEgc3RhdGljLW9ubHkgY2xhc3MgdGhhdCBtYXkgbm90IGJlIGluc3RhbnRpYXRlZC4KKworCQlAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkLgorCSovCisJcHVibGljIERhdGVDb252ZXJ0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluc3RhbnRpYXRpb24gb2YgdGhpcyBjbGFzcyBpcyBub3QgYWxsb3dlZC4iKTsKKwl9CisKKworCS8qKgorCQlGb3JtYXQgdGhlIGdpdmVuIGRhdGUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQuCisKKwkJVGhlIGZvcm1hdCBpcyBhcyBmb2xsb3dzOiAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1tafFsrfC1dSEg6bW1dIi4KKworCQlAcGFyYW0gaW5wdXREYXRlIFRoZSBkYXRlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHN0cmluZyBmb3JtYXQuCisJCUByZXR1cm4gVGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgc3RyaW5nLgorCSovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgaXNvRm9ybWF0KERhdGUgaW5wdXREYXRlKSB7CisKKwkJLy8gU2V0dXAgdGhlIGRhdGUgZm9ybWF0IGFuZCBjb252ZXJ0IHRoZSBnaXZlbiBkYXRlLgorCQlTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChJU09fRk9STUFUKTsKKwkJU3RyaW5nIGRhdGVTdHJpbmcgPSBkYXRlRm9ybWF0LmZvcm1hdChpbnB1dERhdGUpOworCisJCS8vIERldGVybWluZSB0aGUgdGltZSB6b25lIGFuZCBjb25jYXRlbmF0ZSB0aGUgdGltZSB6b25lIGRlc2lnbmF0b3IKKwkJLy8gb250byB0aGUgZm9ybWF0dGVkIGRhdGUvdGltZSBzdHJpbmcuCisJCVRpbWVab25lIHR6ID0gZGF0ZUZvcm1hdC5nZXRUaW1lWm9uZSgpOworCQlTdHJpbmcgdHpOYW1lID0gdHouZ2V0RGlzcGxheU5hbWUoKTsKKwkJaWYgKHR6TmFtZS5lcXVhbHMoIkdyZWVud2ljaCBNZWFuIFRpbWUiKSkgeworCQkJZGF0ZVN0cmluZyA9IGRhdGVTdHJpbmcuY29uY2F0KCJaIik7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBEZXRlcm1pbmUgdGhlIGhvdXIgb2Zmc2V0LiBBZGQgYW4gaG91ciBpZiBkYXlsaWdodCBzYXZpbmdzCisJCQkvLyBpcyBpbiBlZmZlY3QuCisJCQlsb25nIHR6T2Zmc2V0TVMgPSB0ei5nZXRSYXdPZmZzZXQoKTsKKwkJCWxvbmcgdHpPZmZzZXRISCA9IHR6T2Zmc2V0TVMgLyBNU19JTl9IT1VSOworCQkJaWYgKHR6LmluRGF5bGlnaHRUaW1lKGlucHV0RGF0ZSkpIHsKKwkJCQl0ek9mZnNldEhIID0gdHpPZmZzZXRISCArIDE7CisJCQl9CisJCQlTdHJpbmcgaG91clN0cmluZyA9IFN0cmluZy52YWx1ZU9mKE1hdGguYWJzKHR6T2Zmc2V0SEgpKTsKKwkJCWlmIChob3VyU3RyaW5nLmxlbmd0aCgpID09IDEpIHsKKwkJCQlob3VyU3RyaW5nID0gIjAiICsgaG91clN0cmluZzsKKwkJCX0KKworCQkJLy8gRGV0ZXJtaW5lIHRoZSBtaW51dGUgb2Zmc2V0LgorCQkJbG9uZyB0ek9mZnNldE1NTVMgPSB0ek9mZnNldE1TICUgTVNfSU5fSE9VUjsKKwkJCWxvbmcgdHpPZmZzZXRNTSA9IDA7CisJCQlpZiAodHpPZmZzZXRNTU1TICE9IDApIHsKKwkJCQl0ek9mZnNldE1NID0gdHpPZmZzZXRNTU1TIC8gTVNfSU5fTUlOVVRFOworCQkJfQorCQkJU3RyaW5nIG1pbnV0ZVN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHR6T2Zmc2V0TU0pOworCQkJaWYgKG1pbnV0ZVN0cmluZy5sZW5ndGgoKSA9PSAxKSB7CisJCQkJbWludXRlU3RyaW5nID0gIjAiICsgbWludXRlU3RyaW5nOworCQkJfQorCisJCQkvLyBEZXRlcm1pbmUgdGhlIHNpZ24gb2YgdGhlIG9mZnNldC4KKwkJCVN0cmluZyBzaWduID0gIisiOworCQkJaWYgKFN0cmluZy52YWx1ZU9mKHR6T2Zmc2V0TVMpLmluZGV4T2YoIi0iKSAhPSAtMSkgeworCQkJCXNpZ24gPSAiLSI7CisJCQl9CisKKwkJCWRhdGVTdHJpbmcgPSBkYXRlU3RyaW5nLmNvbmNhdChzaWduICsgaG91clN0cmluZyArICI6IiArIG1pbnV0ZVN0cmluZyk7CisJCX0KKworCQlyZXR1cm4oZGF0ZVN0cmluZyk7CisJfQorCisKKwkvKioKKwkJUGFyc2UgdGhlIGdpdmVuIGRhdGUvdGltZSBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0IGFuZCByZXR1cm4gdGhlCisJCXJlc3VsdGluZyA8Y29kZT5EYXRlPC9jb2RlPiBvYmplY3QuCisKKwkJVGhlIGZvcm1hdCBpcyBhcyBmb2xsb3dzOiAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1tafFsrfC1dSEg6bW1dIi4KKworCQlAcGFyYW0gaW5wdXRTdHJpbmcgVGhlIHN0cmluZyB0byBiZSBwYXJzZWQuCisJCUByZXR1cm4gVGhlIHJlc3VsdGluZyBEYXRlIG9iamVjdC4KKwkJQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBJZiB0aGUgc3RyaW5nIGlzIG51bGwgb3IgZG9lcyBub3QgbWF0Y2ggdGhlIGRhdGUvdGltZQorCQlmb3JtYXQuCisJKi8KKwlwdWJsaWMgc3RhdGljIERhdGUgaXNvUGFyc2UoU3RyaW5nIGlucHV0U3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisJCS8vIFNldHVwIHRoZSBkYXRlIGZvcm1hdC4KKwkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoSVNPX0ZPUk1BVCk7CisJCWRhdGVGb3JtYXQuc2V0TGVuaWVudChmYWxzZSk7CisKKwkJLy8gVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nIHNob3VsZCBiZSBhdCBsZWFzdCAyNCBjaGFyYWN0ZXJzLgorCQlpZiAoaW5wdXRTdHJpbmcgPT0gbnVsbCB8fCBpbnB1dFN0cmluZy5sZW5ndGgoKSA8IDI0KSB7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBiZWNhdXNlIHRoZSBpbnB1dCBkYXRlL3RpbWUgc3RyaW5nIHdhcyBudWxsIG9yIHVuZGVyIDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLiIsIGlucHV0U3RyaW5nLmxlbmd0aCgpKTsKKwkJfQorCisJCS8vIEV2YWx1YXRlIHRoZSB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgc2V0IHRoZSB0aW1lIHpvbmUuCisJCVN0cmluZyBvZmZzZXRTdHJpbmcgPSBpbnB1dFN0cmluZy5zdWJzdHJpbmcoMjMpOworCQlpZiAob2Zmc2V0U3RyaW5nLmVxdWFscygiWiIpKSB7CisJCQlkYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHcmVlbndpY2ggTWVhbiBUaW1lIikpOworCQl9CisJCWVsc2UgaWYgKG9mZnNldFN0cmluZy5zdGFydHNXaXRoKCItIikgfHwgb2Zmc2V0U3RyaW5nLnN0YXJ0c1dpdGgoIisiKSkgeworCQkJU2ltcGxlRGF0ZUZvcm1hdCBvZmZzZXRGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpOworCQkJaWYgKG9mZnNldFN0cmluZy5sZW5ndGgoKSA9PSAzKSB7CisJCQkJb2Zmc2V0Rm9ybWF0LmFwcGx5UGF0dGVybigiSEgiKTsKKwkJCX0KKwkJCWVsc2UgaWYgKG9mZnNldFN0cmluZy5sZW5ndGgoKSA9PSA2KSB7CisJCQkJb2Zmc2V0Rm9ybWF0LmFwcGx5UGF0dGVybigiSEg6bW0iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIGJlY2F1c2UgdGhlIG9mZnNldCBwb3J0aW9uIHdhcyBub3QgdGhlIHZhbGlkIGxlbmd0aCBvZiAzIG9yIDYgY2hhcmFjdGVycy4iLCAyNSk7CisJCQl9CisKKwkJCS8vIFZhbGlkYXRlIHRoZSBnaXZlbiBvZmZzZXQuCisJCQlvZmZzZXRGb3JtYXQuc2V0TGVuaWVudChmYWxzZSk7CisJCQlEYXRlIG9mZnNldERhdGUgPSBvZmZzZXRGb3JtYXQucGFyc2Uob2Zmc2V0U3RyaW5nLnN1YnN0cmluZygxKSk7CisKKwkJCS8vIFNldCB0aGUgdGltZSB6b25lIHdpdGggdGhlIHZhbGlkYXRlZCBvZmZzZXQuCisJCQlkYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiICsgb2Zmc2V0U3RyaW5nKSk7CisJCX0KKwkJZWxzZSB7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBiZWNhdXNlIHRoZSBvZmZzZXQgcG9ydGlvbiBvZiB0aGUgaW5wdXQgZGF0ZS90aW1lIHN0cmluZyB3YXMgbm90ICdaJyBvciBkaWQgbm90IHN0YXJ0IHdpdGggJysnIG9yICctJy4iLCAyNCk7CisJCX0KKworCQkvLyBQYXJzZSB0aGUgZ2l2ZW4gc3RyaW5nLgorCQlEYXRlIHBhcnNlRGF0ZSA9IGRhdGVGb3JtYXQucGFyc2UoaW5wdXRTdHJpbmcpOworCisJCXJldHVybihwYXJzZURhdGUpOworCX0KKworCisJLyoqCisJCUZvcm1hdCB0aGUgZ2l2ZW4gZGF0ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgc3RyaW5nIGluIENDU0RTCisJCUFTQ0lJIFRpbWUgQ29kZSBCIGZvcm1hdC4KKworCQlUaGUgZm9ybWF0IGlzIGFzIGZvbGxvd3M6ICJ5eXl5LURERCdUJ0hIOm1tOnNzLlNTUyIuCisKKwkJQHBhcmFtIGlucHV0RGF0ZSBUaGUgZGF0ZSB0byBiZSBjb252ZXJ0ZWQgaW50byBzdHJpbmcgZm9ybWF0LgorCQlAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgZGF0ZS90aW1lIHN0cmluZy4KKwkqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRveUZvcm1hdChEYXRlIGlucHV0RGF0ZSkgeworCisJCS8vIFNldHVwIHRoZSBkYXRlIGZvcm1hdCBhbmQgY29udmVydCB0aGUgZ2l2ZW4gZGF0ZS4KKwkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoRE9ZX0ZPUk1BVCk7CisJCVN0cmluZyBkYXRlU3RyaW5nID0gZGF0ZUZvcm1hdC5mb3JtYXQoaW5wdXREYXRlKTsKKworCQlyZXR1cm4oZGF0ZVN0cmluZyk7CisJfQorCisKKwkvKioKKwkJUGFyc2UgdGhlIGdpdmVuIGRhdGUvdGltZSBzdHJpbmcgaW4gQ0NTRFMgQVNDSUkgVGltZSBDb2RlIEIgZm9ybWF0CisJCWFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyA8Y29kZT5EYXRlPC9jb2RlPiBvYmplY3QuCisKKwkJVGhlIGZvcm1hdCBpcyBhcyBmb2xsb3dzOiAieXl5eS1EREQnVCdISDptbTpzcy5TU1MiLgorCisJCUBwYXJhbSBpbnB1dFN0cmluZyBUaGUgc3RyaW5nIHRvIGJlIHBhcnNlZC4KKwkJQHJldHVybiBUaGUgcmVzdWx0aW5nIERhdGUgb2JqZWN0LgorCQlAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIElmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIGRhdGUvdGltZQorCQlmb3JtYXQuCisJKi8KKwlwdWJsaWMgc3RhdGljIERhdGUgZG95UGFyc2UoU3RyaW5nIGlucHV0U3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisJCS8vIFNldHVwIHRoZSBkYXRlIGZvcm1hdCBhbmQgcGFyc2UgdGhlIGdpdmVuIHN0cmluZy4KKwkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoRE9ZX0ZPUk1BVCk7CisJCWRhdGVGb3JtYXQuc2V0TGVuaWVudChmYWxzZSk7CisJCURhdGUgcGFyc2VEYXRlID0gZGF0ZUZvcm1hdC5wYXJzZShpbnB1dFN0cmluZyk7CisKKwkJcmV0dXJuKHBhcnNlRGF0ZSk7CisJfQorCisKKwkvKioKKwkJRm9ybWF0IHRoZSBnaXZlbiBkYXRlIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBzdHJpbmcgaW4gYSB0aW1lc3RhbXAKKwkJZm9ybWF0LgorCisJCVRoZSBmb3JtYXQgaXMgYXMgZm9sbG93czogInl5eXlNTWRkSEhtbXNzU1NTIi4KKworCQlAcGFyYW0gaW5wdXREYXRlIFRoZSBkYXRlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHN0cmluZyBmb3JtYXQuCisJCUByZXR1cm4gVGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgc3RyaW5nLgorCSovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdHNGb3JtYXQoRGF0ZSBpbnB1dERhdGUpIHsKKworCQkvLyBTZXR1cCB0aGUgZGF0ZSBmb3JtYXQgYW5kIGNvbnZlcnQgdGhlIGdpdmVuIGRhdGUuCisJCVNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KFRTX0ZPUk1BVCk7CisJCVN0cmluZyBkYXRlU3RyaW5nID0gZGF0ZUZvcm1hdC5mb3JtYXQoaW5wdXREYXRlKTsKKworCQlyZXR1cm4oZGF0ZVN0cmluZyk7CisJfQorCisKKwkvKioKKwkJUGFyc2UgdGhlIGdpdmVuIGRhdGUvdGltZSBzdHJpbmcgaW4gdGltZXN0YW1wIGZvcm1hdAorCQlhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgPGNvZGU+RGF0ZTwvY29kZT4gb2JqZWN0LgorCisJCVRoZSBmb3JtYXQgaXMgYXMgZm9sbG93czogInl5eXlNTWRkSEhtbXNzU1NTIi4KKworCQlAcGFyYW0gaW5wdXRTdHJpbmcgVGhlIHN0cmluZyB0byBiZSBwYXJzZWQuCisJCUByZXR1cm4gVGhlIHJlc3VsdGluZyBEYXRlIG9iamVjdC4KKwkJQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHRoZSBkYXRlL3RpbWUKKwkJZm9ybWF0LgorCSovCisJcHVibGljIHN0YXRpYyBEYXRlIHRzUGFyc2UoU3RyaW5nIGlucHV0U3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisJCS8vIFNldHVwIHRoZSBkYXRlIGZvcm1hdCBhbmQgcGFyc2UgdGhlIGdpdmVuIHN0cmluZy4KKwkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoVFNfRk9STUFUKTsKKwkJZGF0ZUZvcm1hdC5zZXRMZW5pZW50KGZhbHNlKTsKKwkJRGF0ZSBwYXJzZURhdGUgPSBkYXRlRm9ybWF0LnBhcnNlKGlucHV0U3RyaW5nKTsKKworCQlyZXR1cm4ocGFyc2VEYXRlKTsKKwl9CisKKworCS8qKgorCQlGb3JtYXQgdGhlIGdpdmVuIGRhdGUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpbiBhIERCTVMKKwkJZm9ybWF0LgorCisJCVRoZSBmb3JtYXQgaXMgYXMgZm9sbG93czogImRkLU1NTS15eXl5IEhIOm1tOnNzIi4KKworCQlAcGFyYW0gaW5wdXREYXRlIFRoZSBkYXRlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHN0cmluZyBmb3JtYXQuCisJCUByZXR1cm4gVGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgc3RyaW5nLgorCSovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGJtc0Zvcm1hdChEYXRlIGlucHV0RGF0ZSkgeworCisJCS8vIFNldHVwIHRoZSBkYXRlIGZvcm1hdCBhbmQgY29udmVydCB0aGUgZ2l2ZW4gZGF0ZS4KKwkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoREJNU19GT1JNQVQpOworCQlTdHJpbmcgZGF0ZVN0cmluZyA9IGRhdGVGb3JtYXQuZm9ybWF0KGlucHV0RGF0ZSk7CisKKwkJcmV0dXJuKGRhdGVTdHJpbmcpOworCX0KKworCisJLyoqCisJCVBhcnNlIHRoZSBnaXZlbiBkYXRlL3RpbWUgc3RyaW5nIGluIERCTVMgZm9ybWF0CisJCWFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyA8Y29kZT5EYXRlPC9jb2RlPiBvYmplY3QuCisKKwkJVGhlIGZvcm1hdCBpcyBhcyBmb2xsb3dzOiAiZGQtTU1NLXl5eXkgSEg6bW06c3MiLgorCisJCUBwYXJhbSBpbnB1dFN0cmluZyBUaGUgc3RyaW5nIHRvIGJlIHBhcnNlZC4KKwkJQHJldHVybiBUaGUgcmVzdWx0aW5nIERhdGUgb2JqZWN0LgorCQlAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIElmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIGRhdGUvdGltZQorCQlmb3JtYXQuCisJKi8KKwlwdWJsaWMgc3RhdGljIERhdGUgZGJtc1BhcnNlKFN0cmluZyBpbnB1dFN0cmluZykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKworCQkvLyBTZXR1cCB0aGUgZGF0ZSBmb3JtYXQgYW5kIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcuCisJCVNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KERCTVNfRk9STUFUKTsKKwkJZGF0ZUZvcm1hdC5zZXRMZW5pZW50KGZhbHNlKTsKKwkJRGF0ZSBwYXJzZURhdGUgPSBkYXRlRm9ybWF0LnBhcnNlKGlucHV0U3RyaW5nKTsKKworCQlyZXR1cm4ocGFyc2VEYXRlKTsKKwl9CisKKworCS8qKgorCQlGb3JtYXQgdGhlIGdpdmVuIGRhdGUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpbiBhCisJCXllYXItbW9udGgtZGF5IGZvcm1hdC4KKworCQlUaGUgZm9ybWF0IGlzIGFzIGZvbGxvd3M6ICJ5eXl5LU1NLWRkIi4KKworCQlAcGFyYW0gaW5wdXREYXRlIFRoZSBkYXRlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHN0cmluZyBmb3JtYXQuCisJCUByZXR1cm4gVGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgc3RyaW5nLgorCSovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgeW1kRm9ybWF0KERhdGUgaW5wdXREYXRlKSB7CisKKwkJLy8gU2V0dXAgdGhlIGRhdGUgZm9ybWF0IGFuZCBjb252ZXJ0IHRoZSBnaXZlbiBkYXRlLgorCQlTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChZTURfRk9STUFUKTsKKwkJU3RyaW5nIGRhdGVTdHJpbmcgPSBkYXRlRm9ybWF0LmZvcm1hdChpbnB1dERhdGUpOworCisJCXJldHVybihkYXRlU3RyaW5nKTsKKwl9CisKKworCS8qKgorCQlQYXJzZSB0aGUgZ2l2ZW4gZGF0ZS90aW1lIHN0cmluZyBpbiB5ZWFyLW1vbnRoLWRheSBmb3JtYXQKKwkJYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIDxjb2RlPkRhdGU8L2NvZGU+IG9iamVjdC4KKworCQlUaGUgZm9ybWF0IGlzIGFzIGZvbGxvd3M6ICJ5eXl5LU1NLWRkIi4KKworCQlAcGFyYW0gaW5wdXRTdHJpbmcgVGhlIHN0cmluZyB0byBiZSBwYXJzZWQuCisJCUByZXR1cm4gVGhlIHJlc3VsdGluZyBEYXRlIG9iamVjdC4KKwkJQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHRoZSBkYXRlL3RpbWUKKwkJZm9ybWF0LgorCSovCisJcHVibGljIHN0YXRpYyBEYXRlIHltZFBhcnNlKFN0cmluZyBpbnB1dFN0cmluZykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKworCQkvLyBTZXR1cCB0aGUgZGF0ZSBmb3JtYXQgYW5kIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcuCisJCVNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KFlNRF9GT1JNQVQpOworCQlkYXRlRm9ybWF0LnNldExlbmllbnQoZmFsc2UpOworCQlEYXRlIHBhcnNlRGF0ZSA9IGRhdGVGb3JtYXQucGFyc2UoaW5wdXRTdHJpbmcpOworCisJCXJldHVybihwYXJzZURhdGUpOworCX0KKworCisJLyoqCisJCUdldCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIG1pbnV0ZS4KKworCQlAcmV0dXJuIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgbWludXRlLgorCSovCisJcHVibGljIHN0YXRpYyBsb25nIGdldE1zZWNzSW5NaW51dGUoKSB7CisJCXJldHVybihNU19JTl9NSU5VVEUpOworCX0KKworCisJLyoqCisJCUdldCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhbiBob3VyLgorCisJCUByZXR1cm4gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYW4gaG91ci4KKwkqLworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNc2Vjc0luSG91cigpIHsKKwkJcmV0dXJuKE1TX0lOX0hPVVIpOworCX0KKworCisJLyoqCisJCUdldCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIGRheS4KKworCQlAcmV0dXJuIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgZGF5LgorCSovCisJcHVibGljIHN0YXRpYyBsb25nIGdldE1zZWNzSW5EYXkoKSB7CisJCXJldHVybihNU19JTl9EQVkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9Eb2N1bWVudGFibGUuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRG9jdW1lbnRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjOWNlOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRG9jdW1lbnRhYmxlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCisvKiogQSBkb2N1bWVudGFibGUgb2JqZWN0LgorICoKKyAqIEFuIG9iamVjdCB0aGF0IGV4aGliaXRzIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBkb2N1bWVudGVkLCBpbiBYTUwsIGFzIGEgRE9NIG5vZGUuCisgKgorICogQGF1dGhvciBLZWxseS4KKyAqLworcHVibGljIGludGVyZmFjZSBEb2N1bWVudGFibGUgeworCS8qKiBEb2N1bWVudCAoYWthIHNlcmlhbGl6ZSkgdGhpcyBvYmplY3QgaW50byBhbiBYTUwgRE9NIG5vZGUuCisJICoKKwkgKiBAcGFyYW0gZG9jIFdoYXQgZG9jdW1lbnQgd2lsbCBvd24gdGhlIG5vZGUuCisJICogQHJldHVybiBUaGlzIG9iamVjdCBhcyBhbiBYTUwgRE9NIG5vZGUuCisJICogQHRocm93cyBET01FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBET00gc3RydWN0dXJlLgorCSAqLworCU5vZGUgdG9YTUwoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRE9NRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9FbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwMWI4YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CisKKy8qKiBYTUwgZW50aXR5IHJlc29sdmVyIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBUaGlzIHJlc29sdmVyIGF0dGVtcHRzIHRvIHJldHJpZXZlcyBlbnRpdGllcyBmcm9tIGxvY2FsIHNvdXJjZXMgYmVmb3JlIGRlZmVycmluZyB0byB0aGUKKyAqIGRlZmF1bHQgcGFyc2VyJ3MgZW50aXR5IHJlc29sdmVyLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIEVudGVycHJpc2VFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKKwkvKiogTWFwcGluZyBvZiBwdWJsaWMgaWRlbnRpZmllcnMgdG8ga25vd24gZmlsZSBuYW1lcy4gKi8KKwlzdGF0aWMgTWFwIGVudGl0aWVzOworCisJLyoqIEluaXRpYWxpemUgdGhlIGNsYXNzIGJ5IHJlYWRpbmcgdGhlIGVudGl0ZXMueG1sIGZpbGUuICovCisJc3RhdGljIHsKKwkJZW50aXRpZXMgPSBuZXcgSGFzaE1hcCgpOworCQl0cnkgeworCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CisJCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7CisJCQlqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgcCA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisJCQlwLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShFbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZW50aXRpZXMueG1sIikpLAorCQkJCW5ldyBEZWZhdWx0SGFuZGxlcigpIHsKKwkJCQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgdG9rZW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJCXByaXZhdGUgU3RyaW5nIHBpOworCQkJCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisJCQkJCQl0b2tlbi5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOworCQkJCQl9CisJCQkJCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHF1YWwpIHsKKwkJCQkJCWlmICgicGkiLmVxdWFscyhxdWFsKSkKKwkJCQkJCQlwaSA9IHRva2VuLnRvU3RyaW5nKCkudHJpbSgpOworCQkJCQkJZWxzZSBpZiAoImZpbGVuYW1lIi5lcXVhbHMocXVhbCkpIHsKKwkJCQkJCQllbnRpdGllcy5wdXQocGksIHRva2VuLnRvU3RyaW5nKCkudHJpbSgpKTsKKwkJCQkJCX0KKwkJCQkJCXRva2VuLmRlbGV0ZSgwLCB0b2tlbi5sZW5ndGgoKSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgcGFyc2luZyBlbnRpdGllcy54bWwgYXQgbGluZSAiICsgZXguZ2V0TGluZU51bWJlcigpICsgIiwgY29sdW1uICIKKwkJCQkrIGV4LmdldENvbHVtbk51bWJlcigpICsgIjsgaWdub3JpbmcgZW50aXR5IGxvb2t1cCIpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uIHBhcnNpbmcgZW50aXRpZXMueG1sOiAiICsgZXguZ2V0TWVzc2FnZSgpICsgIjsgaWdub3JpbmcgZW50aXR5IGxvb2t1cCIpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJJL08gZXJyb3IgcmVhZGluZyBlbnRpdGllcy54bWw6ICIgKyBleC5nZXRNZXNzYWdlKCkgKyAiOyBpZ25vcmluZyBlbnRpdHkgbG9va3VwIik7CisJCX0KKwl9CisKKwlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZmlsZW5hbWUgPSBjb21wdXRlRmlsZW5hbWUocHVibGljSUQsIHN5c3RlbUlEKTsKKwkJaWYgKGZpbGVuYW1lID09IG51bGwpIHJldHVybiBudWxsOworCisJCS8vIFJlc29sdmUgaXQgdXNpbmcgY2xhc3MgbG9hZGVyIGZpcnN0LiAgQW55IERURCBpbiB0aGUgdG9wbGV2ZWwgZGlyZWN0b3J5CisJCS8vIG9mIGFueSBqYXIgcHJlc2VudCB0byB0aGUgYXBwbGljYXRpb24gaXMgYSBwb3RlbnRpYWwgc291cmNlLgorCQlJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiLyIgKyBmaWxlbmFtZSk7CisJCWlmIChpbiAhPSBudWxsKQorCQkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSkpOworCisJCS8vIE9LLCB0cnkgdGhlIGZpbGVzeXN0ZW0gbmV4dC4gIFlvdSBjYW4gY29udHJvbCB3aGF0IGRpcmVjdG9yaWVzIGdldAorCQkvLyBzZWFyY2hlZCBieSBzZXR0aW5nIHRoZSBlbnRpdHkuZGlycyBwcm9wZXJ0eS4KKwkJRmlsZSBmaWxlID0gZmluZEZpbGUoZ2V0RW50aXR5UmVmRGlycyhTeXN0ZW0uZ2V0UHJvcGVydHkoImVudGl0eS5kaXJzIiwgIiIpKSwgZmlsZW5hbWUpOworCQlpZiAoZmlsZSAhPSBudWxsKSB0cnkgeworCQkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCisJCS8vIE5vIGx1Y2sgZWl0aGVyIHdheS4KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqIENvbXB1dGUgdGhlIHBvc3NpYmxlIGZpbGVuYW1lIGZyb20gcHVibGljIGFuZCBzeXN0ZW0gaWRlbnRpZmllcnMuCisJICoKKwkgKiBUaGlzIGF0dGVtcHRzIHRvIG1hcCB0aGUgcHVibGljIElEIHRvIGEga25vd24gZmlsZSBiYXNlZCBvbiBhIHRhYmxlIChzZWUKKwkgKiA8Y29kZT5lbnRpdHkueG1sPC9jb2RlPikuICBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgdGhlbiBpdCB3aWxsIHVzZSB0aGUKKwkgKiBmaWxlIHBhcnQgb2YgdGhlIHN5c3RlbSBJRC4gIElmIHRoZXJlJ3Mgbm8gZmlsZSBwYXJ0LCBpdCByZXR1cm5zIG51bGwuCisJICoKKwkgKiBAcGFyYW0gcHVibGljSUQgVGhlIHB1YmxpYyBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBzeXN0ZW1JRCBUaGUgc3lzdGVtIGlkZW50aWZpZXIuCisJICogQHJldHVybiBBIGZpbGUgY29tcHV0ZWQgZnJvbSA8dmFyPnB1YmxpY0lEPC92YXI+IGFuZCA8dmFyPnN5c3RlbUlEPC92YXI+LgorCSAqLworCXN0YXRpYyBTdHJpbmcgY29tcHV0ZUZpbGVuYW1lKFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7CisJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZW50aXRpZXMuZ2V0KHB1YmxpY0lEKTsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgdHJ5IHsKKwkJCVVSTCB1cmwgPSBuZXcgVVJMKHN5c3RlbUlEKTsKKwkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOworCQkJbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWdub3JlKSB7fQorCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgYSBsaXN0IG9mIGVudGl0eSBkaXJlY3RvcmllcyBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgc3BlY2lmaWNhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBzcGVjIERpcmVjdG9yeSBuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzLgorCSAqIEByZXR1cm4gYSB7QGxpbmsgTGlzdH0gb2YgdGhvc2UgZGlyZWN0b3J5IG5hbWVzLgorCSAqLworCXN0YXRpYyBMaXN0IGdldEVudGl0eVJlZkRpcnMoU3RyaW5nIHNwZWMpIHsKKwkJTGlzdCBkaXJzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcGVjLCAiLDt8Iik7IHQuaGFzTW9yZVRva2VucygpOykKKwkJCWRpcnMuYWRkKHQubmV4dFRva2VuKCkpOworCQlyZXR1cm4gZGlyczsKKwl9CisKKwkvKiogRmluZCBhIGZpbGUgdW5kZXIgYSBsaXN0IG9mIGRpcmVjdG9yaWVzLgorCSAqIAorCSAqIEBwYXJhbSBkaXJzIExpc3Qgb2Yge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IGRpcmVjdG9yeSBuYW1lcy4KKwkgKiBAcGFyYW0gZmlsZW5hbWUgTmFtZSBvZiB0aGUgZmlsZSB0byBmaW5kIHVuZGVyIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgbmFtZWQgaW4gPHZhcj5kaXJzPC92YXI+LgorCSAqIEByZXR1cm4gVGhlIGZpcnN0IHBhdGggdG8gdGhlIGZpbGUgbmFtZWQgYnkgPHZhcj5maWxlbmFtZTwvdmFyPiB1bmRlciBhIGRpcmVjdG9yeSBpbiA8dmFyPmRpcnM8L3Zhcj4sCisJICogb3IgbnVsbCBpZiBubyBkaXJlY3RvcnkgaW4gPHZhcj5kaXJzPC92YXI+IGNvbnRhaW5zIGEgZmlsZSBuYW1lZCA8dmFyPmZpbGVuYW1lPC92YXI+LgorCSAqLworCXN0YXRpYyBGaWxlIGZpbmRGaWxlKExpc3QgZGlycywgU3RyaW5nIGZpbGVuYW1lKSB7CisJCWZvciAoSXRlcmF0b3IgaSA9IGRpcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlGaWxlIHBvdGVudGlhbEZpbGUgPSBuZXcgRmlsZSgoU3RyaW5nKSBpLm5leHQoKSwgZmlsZW5hbWUpOworCQkJaWYgKHBvdGVudGlhbEZpbGUuaXNGaWxlKCkpIHJldHVybiBwb3RlbnRpYWxGaWxlOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRmlsZUxvZ2dlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9GaWxlTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmYWZhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRmlsZUxvZ2dlci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CisKKy8qKgorCVRoZSA8Y29kZT5GaWxlTG9nZ2VyPC9jb2RlPiBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlCisJe0BsaW5rIExvZ30gY2xhc3MgaW4gb3JkZXIgdG8gc2V0dXAgYSBsb2cgZmlsZSBhcyBhIHtAbGluayBMb2dMaXN0ZW5lcn0uCisKKwlAYXV0aG9yIFMuIEhhcmRtYW4KKwlAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCisqLworcHVibGljIGNsYXNzIEZpbGVMb2dnZXIgZXh0ZW5kcyBXcml0ZXJMb2dnZXIgeworCisJLyoqCisJCUNvbnN0cnVjdG9yIGdpdmVuIG5vIGFyZ3VtZW50cy4KKworCQlUaGlzIGNvbnN0cnVjdG9yIHdpbGwgY3JlYXRlIGEgbmV3IGxvZyBmaWxlIG9yIGFwcGVuZCB0byBhbiBleGlzdGluZworCQlsb2cgZmlsZSBpZiB0aGUgc3BlY2lmaWVkIGZpbGUgZXhpc3RzLiBUaGUgY29uc3RydWN0b3Igd2lsbCB0aGVuIGNhbGwKKwkJdGhlIG90aGVyIGNvbnN0cnVjdG9yIHdpdGggdGhlIG91dHB1dCBzdHJlYW0gYXJndW1lbnQuIFRoaXMgY29uc3RydWN0b3IKKwkJdXRpbGl6ZXMgdHdvIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciBzcGVjaWZ5aW5nIHRoZSBwYXRoIGFuZCBuYW1lIG9mIHRoZQorCQlsb2cgZmlsZS4gVGhleSBhcmUgYXMgZm9sbG93czoKKworCQk8cD5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkZpbGVMb2dnZXIucGF0aCAtIElmIHNwZWNpZmllZCwgdGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlCisJCQl0aGUgbG9nIGZpbGUgd2lsbCBiZSBmb3VuZCBvciBjcmVhdGVkLCBvdGhlcndpc2UgdGhlIGxvY2FsIGRpcmVjdG9yeQorCQkJd2lsbCBiZSB1dGlsaXplZC4KKworCQk8cD5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkZpbGVMb2dnZXIubmFtZSAtIElmIHNwZWNpZmllZCwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgbG9nCisJCQlmaWxlIHRvIGJlIGZvdW5kIG9yIGNyZWF0ZWQsIG90aGVyd2lzZSB0aGUgbmFtZSB3aWxsIGJlIGFzIGZvbGxvd3M6CisJCQkiZWRhX3l5eXltbWRkaGhtbXNzU1NTLmxvZyIuCisKKwkJQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBmb3IgYW55CisJCQlyZWFzb24uCisJKi8KKwlwdWJsaWMgRmlsZUxvZ2dlciAoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJdGhpcyhuZXcgRmlsZU91dHB1dFN0cmVhbShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRmlsZUxvZ2dlci5wYXRoIiwgIi4iKSArICIvIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5GaWxlTG9nZ2VyLm5hbWUiLCAiZWRhXyIgKyBEYXRlQ29udmVydC50c0Zvcm1hdChuZXcgRGF0ZSgpKSArICIubG9nIiksIHRydWUpKTsKKwl9CisKKworCS8qKgorCQlDb25zdHJ1Y3RvciBnaXZlbiBhbiBvdXRwdXQgc3RyZWFtLgorCisJCVRoaXMgY29uc3RydWN0b3IgY2FsbHMgdGhlIHtAbGluayBXcml0ZXJMb2dnZXJ9IGNvbnN0cnVjdG9yIHdpdGggdGhlCisJCXNhbWUgc2lnbmF0dXJlLgorCisJCUBwYXJhbSBvdXRwdXRTdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gcmVwcmVzZW50aW5nIHRoZSBsb2cgZGVzdGluYXRpb24uCisJKi8KKwlwdWJsaWMgRmlsZUxvZ2dlciAoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworCQlzdXBlcihvdXRwdXRTdHJlYW0pOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvSkRCQ19EQi5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9KREJDX0RCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MTc3NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvSkRCQ19EQi5qYXZhCkBAIC0wLDAgKzEsNDQxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKwlUaGlzIGNsYXNzIGlzIGEgd3JhcHBlciBmb3IgSkRCQy4KKworCUBhdXRob3IgRC4gQ3JpY2h0b24KKwlAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCisqLworcHVibGljIGNsYXNzIEpEQkNfREIKK3sKKwlQcm9wZXJ0aWVzIHNlcnZlclByb3BzOworCUNvbm5lY3Rpb24gY29ubmVjdDsKKwlTdHJpbmcgc3FsX2NvbW1hbmQ7CisJU3RhdGVtZW50IHN0bXQ7CisJUmVzdWx0U2V0IHJzOworCVJlc3VsdFNldE1ldGFEYXRhIHJzX21ldGE7CisJaW50IGFmZmVjdGVkOworCWJvb2xlYW4gbW9yZV9yb3dzOworCWJvb2xlYW4ga2VlcF9jb25uZWN0X29wZW47CisJcHJpdmF0ZSBib29sZWFuIGF1dG9Db21taXRNb2RlID0gZmFsc2U7CisJcHVibGljIGZpbmFsIFN0cmluZyBUT19EQVRFX0ZPUk1BVCA9ICJERC1NTS1ZWVlZIEhIMjQ6TUk6U1MiOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqCisJKiogSkRCQ19EQgorCSoqCisJKiogQ29uc3RydWN0b3IgbWV0aG9kIHdpbGwgY3JlYXRlIGNsYXNzIGluc3RhbmNlIGFuZCBsb2FkIHRoZQorCSoqIE9yYWNsZSBEQiBkcml2ZXIKKwkqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlwdWJsaWMgIEpEQkNfREIoCisJCQlqYXZhLnV0aWwuUHJvcGVydGllcyBzeXNfcHJvcHMpIHRocm93cyBTUUxFeGNlcHRpb24KKwl7CisJCQlTdHJpbmcgIGNsYXNzbmFtZTsKKworCQkJc2VydmVyUHJvcHMgPSBzeXNfcHJvcHM7CisJCQlrZWVwX2Nvbm5lY3Rfb3BlbiA9IHRydWU7CisKKwl9CisKKwlwdWJsaWMgIEpEQkNfREIoCisJCQlqYXZhLnV0aWwuUHJvcGVydGllcyBzeXNfcHJvcHMsCisJCQlDb25uZWN0aW9uIHNydl9jb25uZWN0KSB0aHJvd3MgU1FMRXhjZXB0aW9uCisJeworCQkJU3RyaW5nICBjbGFzc25hbWU7CisKKwkJCXNlcnZlclByb3BzID0gc3lzX3Byb3BzOworCQkJY29ubmVjdCA9IHNydl9jb25uZWN0OworCisJCQlpZiAoc3J2X2Nvbm5lY3QgPT0gbnVsbCkgeworCQkJCWtlZXBfY29ubmVjdF9vcGVuICA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlrZWVwX2Nvbm5lY3Rfb3BlbiA9IHRydWU7CisJCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0QXV0b0NvbW1pdE1vZGUoYm9vbGVhbiBhdXRvQ29tbWl0TW9kZSkgeworCQl0aGlzLmF1dG9Db21taXRNb2RlID0gYXV0b0NvbW1pdE1vZGU7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqCisJKiogb3BlbkNvbm5lY3Rpb24KKwkqKgorCSoqIE9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZS4KKwkqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJcHVibGljIHZvaWQgb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uCisKKwl7CisJCW9wZW5Db25uZWN0aW9uKHNlcnZlclByb3BzLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkpEQkNfREIudXNlciIsICJ1bmtub3duIiksCisJCQlzZXJ2ZXJQcm9wcy5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5KREJDX0RCLnBhc3N3b3JkIiksCisJCQlzZXJ2ZXJQcm9wcy5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5KREJDX0RCLmRhdGFiYXNlIikpOworCX0KKworCisJcHVibGljIHZvaWQgb3BlbkNvbm5lY3Rpb24oCisJCVN0cmluZyB1c2VybmFtZSwKKwkJU3RyaW5nIHBhc3N3b3JkLAorCQlTdHJpbmcgZGF0YWJhc2UpIHRocm93cyBTUUxFeGNlcHRpb24KKwl7CisJCVN0cmluZyB1cmwsIGNsYXNzbmFtZTsKKworCQlpZiAoc3RtdCAhPSBudWxsKQorCQkJc3RtdC5jbG9zZSgpOworCisJCWlmIChycyAhPSBudWxsKQorCQkJcnMuY2xvc2UoKTsKKworCQlpZiAoa2VlcF9jb25uZWN0X29wZW4pCisJCQlyZXR1cm47CisKKwkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKKwkJCWNvbm5lY3QuY2xvc2UoKTsKKworCisJCXJzX21ldGEgPSBudWxsOworCQljb25uZWN0ID0gbnVsbDsKKwkJc3RtdCA9IG51bGw7CisJCXJzID0gbnVsbDsKKworCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJcHJvcHMucHV0KCJ1c2VyIiwgdXNlcm5hbWUpOworCisJCWlmIChwYXNzd29yZCAhPSBudWxsKQorCQkJcHJvcHMucHV0KCJwYXNzd29yZCIsIHBhc3N3b3JkKTsKKworCisJCWNsYXNzbmFtZSA9IHNlcnZlclByb3BzLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkpEQkNfREIuZHJpdmVyIiwgIm9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiKTsKKwkJdHJ5IHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiQXR0ZW1wdGluZyB0byBsb2FkIGNsYXNzICIgKyBjbGFzc25hbWUpOworCQkJQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworCQkJU3lzdGVtLmVyci5wcmludGxuKCJMb2FkZWQgIiArIGNsYXNzbmFtZSk7CisJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBsb2FkIEpEQkMgZHJpdmVyIFwiIiArIGNsYXNzbmFtZSArICJcIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJdXJsID0gc2VydmVyUHJvcHMuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuSkRCQ19EQi51cmwiLCAiamRiYzpvcmFjbGU6QCIpOworCQl0cnkgeworCQkJaWYgKGRhdGFiYXNlICE9IG51bGwpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNvbm5lY3RpbmcgdG8gdXJsK2RhdGFiYXNlIGNvbWJvOiAiICsgdXJsICsgZGF0YWJhc2UpOworCQkJCWNvbm5lY3QgPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odXJsK2RhdGFiYXNlLCBwcm9wcyk7CisJCQl9IGVsc2UgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ29ubmVjdGluZyB0byBmdWxsIHVybDogIiArIHVybCk7CisJCQkJY29ubmVjdCA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbih1cmwsIHByb3BzKTsKKwkJCX0KKwkJfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU1FMIEV4Y2VwdGlvbiBkdXJpbmcgY29ubmVjdGlvbiBjcmVhdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl3aGlsZSAoZSAhPSBudWxsKSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQllID0gZS5nZXROZXh0RXhjZXB0aW9uKCk7CisJCQl9CisJCX0KKworCQljb25uZWN0LnNldEF1dG9Db21taXQoYXV0b0NvbW1pdE1vZGUpOworCisJfQorCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioKKwkqKiBjbG9zZUNvbm5lY3Rpb24KKwkqKgorCSoqIENsb3NlIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuCisJKioKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJcHVibGljIHZvaWQgY2xvc2VDb25uZWN0aW9uKCkgeworCQl0cnkgeworCQkJaWYgKHJzICE9IG51bGwpIHsKKwkJCQlycy5jbG9zZSgpOworCQkJfQorCQkJaWYgKHN0bXQgIT0gbnVsbCkgeworCQkJCXN0bXQuY2xvc2UoKTsKKwkJCX0KKwkJCWlmIChrZWVwX2Nvbm5lY3Rfb3BlbikgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjb25uZWN0ICE9IG51bGwpIHsKKwkJCQljb25uZWN0LmNsb3NlKCk7CisJCQl9CisJCQljb25uZWN0ID0gbnVsbDsKKwkJCXJzID0gbnVsbDsKKwkJCXN0bXQgPSBudWxsOworCQl9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJJZ25vcmluZyBkYXRhYmFzZSBjbG9zZSBjb25uZWN0aW9uIGV4Y2VwdGlvbiIpOworCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIklnbm9yaW5nIGV4Y2VwdGlvbiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioKKwkqKiBleGVjdXRlU1FMQ29tbWFuZAorCSoqCisJKiogU2VuZCBhbiBTUUwgY29tbWFuZCB0byB0aGUgREJNUyB0byBiZSBleGVjdXRlZC4KKwkqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlwdWJsaWMgdm9pZCBleGVjdXRlU1FMQ29tbWFuZChTdHJpbmcgY21kKSB0aHJvd3MgU1FMRXhjZXB0aW9uCisJeworCisKKwkJLyoKKwkJKiogR2V0IHRoZSBzdHJpbmcsIGFuZCBjcmVhdGUgdGhlIHN0YXRlbWVudAorCQkqLworCQlzcWxfY29tbWFuZCA9IGNtZDsKKworCQlpZiAoc3RtdCE9bnVsbCkKKwkJCXN0bXQuY2xvc2UoKTsKKworCQlpZiAoY29ubmVjdCA9PSBudWxsKSBvcGVuQ29ubmVjdGlvbigpOworCQlpZiAoY29ubmVjdCA9PSBudWxsKSB7CisJCQlrZWVwX2Nvbm5lY3Rfb3BlbiA9IGZhbHNlOworCQkJb3BlbkNvbm5lY3Rpb24oKTsKKwkJfQorCQlpZiAoY29ubmVjdCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29ubmVjdGlvbiBpcyBudWxsISEhIik7CisJCQorCQlpZiAoY29ubmVjdC5pc0Nsb3NlZCgpKSB7CisJCQljb25uZWN0ID0gbnVsbDsKKwkJCWtlZXBfY29ubmVjdF9vcGVuID0gZmFsc2U7CisJCQlvcGVuQ29ubmVjdGlvbigpOworCQl9CisJCWlmIChjb25uZWN0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIGlzIHN0aWxsIG51bGwhISEiKTsKKwkJaWYgKGNvbm5lY3QuaXNDbG9zZWQoKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbm5lY3Rpb24gZ290IGNsb3NlZCEiKTsKKworCQlzdG10ID0gY29ubmVjdC5jcmVhdGVTdGF0ZW1lbnQoKTsKKwkJYWZmZWN0ZWQgPSBzdG10LmV4ZWN1dGVVcGRhdGUoc3FsX2NvbW1hbmQpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKgorCSoqIGV4ZWN1dGVRdWVyeQorCSoqCisJKiogU2VuZCBhbiBTUUwgcXVlcnkgdG8gdGhlIERCTVMgdG8gYmUgZXhlY3V0ZWQuCisJKioKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXB1YmxpYyBSZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KFN0cmluZyBjbWQpIHRocm93cyBTUUxFeGNlcHRpb24KKwl7CisJCXNxbF9jb21tYW5kID0gY21kOworCisKKwkJaWYgKHN0bXQhPW51bGwpCisJCQlzdG10LmNsb3NlKCk7CisKKwkJaWYgKGNvbm5lY3QgPT0gbnVsbCkgb3BlbkNvbm5lY3Rpb24oKTsKKwkJaWYgKGNvbm5lY3QgPT0gbnVsbCkgeworCQkJa2VlcF9jb25uZWN0X29wZW4gPSBmYWxzZTsKKwkJCW9wZW5Db25uZWN0aW9uKCk7CisJCX0KKwkJaWYgKGNvbm5lY3QgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbm5lY3Rpb24gaXMgbnVsbCEhISIpOworCQkKKwkJaWYgKGNvbm5lY3QuaXNDbG9zZWQoKSkgeworCQkJY29ubmVjdCA9IG51bGw7CisJCQlrZWVwX2Nvbm5lY3Rfb3BlbiA9IGZhbHNlOworCQkJb3BlbkNvbm5lY3Rpb24oKTsKKwkJfQorCQlpZiAoY29ubmVjdCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29ubmVjdGlvbiBpcyBzdGlsbCBudWxsISEhIik7CisJCWlmIChjb25uZWN0LmlzQ2xvc2VkKCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIGdvdCBjbG9zZWQhIik7CisKKworCQkvL2xvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJc3RtdCA9IGNvbm5lY3QuY3JlYXRlU3RhdGVtZW50KCk7CisJCS8vbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCS8vU3lzdGVtLmVyci5wcmludGxuKCIjIyMjIyMgQ3JlYXRpbmcgYSBuZXcgc3RhdGVtZW50OiAiICsgKHRpbWUgLSB0aW1lMCkpOworCQkvL3RpbWUwID0gdGltZTsKKworCQlpZiAocnMhPW51bGwpCisJCQlycy5jbG9zZSgpOworCisJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoc3FsX2NvbW1hbmQpOworCQkvL3RpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIiMjIyMjIyBFeGVjdXRpbmcgdGhlIHF1ZXJ5OiAiICsgKHRpbWUgLSB0aW1lMCkpOworCisJCWlmIChycyA9PSBudWxsKQorCQl7CisJCQlyZXR1cm4obnVsbCk7CisJCX0KKworCQlyZXR1cm4ocnMpOworCisKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioKKwkqKiBnZXRDb3VudAorCSoqCisJKiogV2lsbCByZXR1cm4gYSBjb3VudCB3aGVuIHVzZXIgcGFzc2VzIHN0aW5nIHNlbGVjdCBjb3VudCgqKSBmcm9tIC4uLgorCSoqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwdWJsaWMgaW50IGdldENvdW50KFN0cmluZyBjbWQpIHRocm93cyBTUUxFeGNlcHRpb24KKwl7CisJCXNxbF9jb21tYW5kID0gY21kOworCQlpbnQgY291bnQ7CisKKworCQlpZiAoc3RtdCE9bnVsbCkKKwkJCXN0bXQuY2xvc2UoKTsKKworCQlzdG10ID0gY29ubmVjdC5jcmVhdGVTdGF0ZW1lbnQoKTsKKworCQlpZiAocnMhPW51bGwpCisJCQlycy5jbG9zZSgpOworCisJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoc3FsX2NvbW1hbmQpOworCisJCWlmIChycyA9PSBudWxsKQorCQl7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQljb3VudCA9IDA7CisKKwkJd2hpbGUgKHJzLm5leHQoKSkKKwkJeworCQkJY291bnQgPSBycy5nZXRJbnQoMSk7CisJCX0KKworCQlzdG10LmNsb3NlKCk7CisJCXJzLmNsb3NlKCk7CisKKworCQlyZXR1cm4oY291bnQpOworCisKKwl9CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqCisJKiogY29tbWl0CisJKioKKwkqKgorCSoqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uCisJeworCQljb25uZWN0LmNvbW1pdCgpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKgorCSoqIHJvbGxiYWNrCisJKioKKwkqKgorCSoqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwdWJsaWMgdm9pZCByb2xsYmFjaygpCisJeworCQl0cnkKKwkJeworCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKKwkJCQljb25uZWN0LnJvbGxiYWNrKCk7CisJCX0KKworCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCisJCXsKKworCQl9CisJfQorCisJIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZQorCXsKKwkJdHJ5CisJCXsKKwkJCWlmICgoY29ubmVjdCAhPSBudWxsKSAmJiAoIWtlZXBfY29ubmVjdF9vcGVuKSkKKwkJCXsKKwkJCQljb25uZWN0LmNsb3NlKCk7CisKKwkJCX0KKworCQkJaWYgKHJzICE9IG51bGwpCisJCQl7CisJCQkJcnMuY2xvc2UoKTsKKwkJCX0KKworCQkJaWYgKHN0bXQgIT0gbnVsbCkKKwkJCXsKKwkJCQlzdG10LmNsb3NlKCk7CisJCQl9CisKKwkJfQorCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCisJCXsKKwkJfQorCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKgorCSoqIENvbnZlcnQgRGF0ZSB0byBzdHJpbmcgaW4gZm9ybWF0IGZvcgorCSoqIE9yYWNsZSBUT19EQVRFIHByb2Nlc3NpbmcgLSBERC1NTS1ZWSBISDI0Ok1JOlNTCisJKioKKwkqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCXB1YmxpYyBTdHJpbmcgdG9EYXRlU3RyKGphdmEudXRpbC5EYXRlIGluRGF0ZSkKKwl7CisKKwkJU3RyaW5nIG91dERhdGU7CisvKgorCQlvdXREYXRlID0gSW50ZWdlci50b1N0cmluZyhpbkRhdGUuZ2V0RGF0ZSgpKSArICItIiArCisJCQkgICBJbnRlZ2VyLnRvU3RyaW5nKGluRGF0ZS5nZXRNb250aCgpICsgMSkgKyAiLSIgKworCQkJICAgSW50ZWdlci50b1N0cmluZyhpbkRhdGUuZ2V0WWVhcigpKSArICIgIiArCisJCQkgICBJbnRlZ2VyLnRvU3RyaW5nKGluRGF0ZS5nZXRIb3VycygpKSArICI6IiArCisJCQkgICBJbnRlZ2VyLnRvU3RyaW5nKGluRGF0ZS5nZXRNaW51dGVzKCkpICsgIjoiICsKKwkJCSAgIEludGVnZXIudG9TdHJpbmcoaW5EYXRlLmdldFNlY29uZHMoKSk7CisJCXJldHVybihvdXREYXRlKTsKKyovCisKKwkJU2ltcGxlRGF0ZUZvcm1hdCBmbXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQtTU0teXl5eSBISDptbTpzcyIpOworCQlTdHJpbmcgZGF0ZVN0ciA9IGZtdC5mb3JtYXQoaW5EYXRlKTsKKworCQlyZXR1cm4gZGF0ZVN0cjsKKworCisJfQorCisJcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24KKwl7CisJCWlmIChjb25uZWN0ID09IG51bGwpIG9wZW5Db25uZWN0aW9uKCk7CisJCWlmIChjb25uZWN0ID09IG51bGwpIHsKKwkJCWtlZXBfY29ubmVjdF9vcGVuID0gZmFsc2U7CisJCQlvcGVuQ29ubmVjdGlvbigpOworCQl9CisJCWlmIChjb25uZWN0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRDb25uZWN0aW9uIGNhbid0IGdldCBhIGNvbm5lY3Rpb24gcG9pbnRlciIpOworCQlyZXR1cm4oY29ubmVjdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9MREFQLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0xEQVAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWEwYzcwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9MREFQLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqIExEQVAgc2VydmljZXMuCisgKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBMREFQIGNvbnZlbmllbmNlIHNlcnZpY2VzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIExEQVAgeworCS8qKiBDb252ZXJ0IHRoZSBnaXZlbiBzdHJpbmcgaW50byBhbiBMREFQLXNhZmUgcXVlcnkgc3RyaW5nLgorCSAqCisJICogVGhpcyBtZXRob2QgZXNjYXBlcyBjZXJ0YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgc3BlY2lhbCBpbiBMREFQIHF1ZXJ5IHN0cmluZ3MuCisJICoKKwkgKiBAcmV0dXJuIEFuIGVzY2FwZWQsIExEQVAtc2FmZSBzdHJpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9MREFQU3RyaW5nKFN0cmluZyBzdHIpIHsKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7ICsraSkgeworCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7CisJCQlzd2l0Y2ggKGNoKSB7CisJCQkJY2FzZSAnKic6CisJCQkJCXJlc3VsdC5hcHBlbmQoIlxcMmEiKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKCc6CisJCQkJCXJlc3VsdC5hcHBlbmQoIlxcMjgiKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKSc6CisJCQkJCXJlc3VsdC5hcHBlbmQoIlxcMjkiKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXFwnOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXDVjIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJlc3VsdC5hcHBlbmQoY2gpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9Mb2dFdmVudE11bHRpcGxleGVyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0xvZ0V2ZW50TXVsdGlwbGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjgzMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9Mb2dFdmVudE11bHRpcGxleGVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5Mb2dFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5Mb2dMaXN0ZW5lcjsKKworLyoqIE11bHRpcGxleGVyIGZvciBsb2dnaW5nIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBMb2dFdmVudE11bHRpcGxleGVyIGltcGxlbWVudHMgTG9nTGlzdGVuZXIgeworCS8qKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuCisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdG8gYWRkLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExvZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuCisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVtb3ZlLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExvZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoTG9nRXZlbnQgZXZlbnQpIHsKKwkJZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJTG9nTGlzdGVuZXIgbGlzdGVuZXIgPSAoTG9nTGlzdGVuZXIpIGkubmV4dCgpOworCQkJbGlzdGVuZXIubWVzc2FnZUxvZ2dlZChldmVudCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzdHJlYW1TdGFydGVkKExvZ0V2ZW50IGV2ZW50KSB7CisJCWZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCUxvZ0xpc3RlbmVyIGxpc3RlbmVyID0gKExvZ0xpc3RlbmVyKSBpLm5leHQoKTsKKwkJCWxpc3RlbmVyLnN0cmVhbVN0YXJ0ZWQoZXZlbnQpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc3RyZWFtU3RvcHBlZChMb2dFdmVudCBldmVudCkgeworCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlMb2dMaXN0ZW5lciBsaXN0ZW5lciA9IChMb2dMaXN0ZW5lcikgaS5uZXh0KCk7CisJCQlsaXN0ZW5lci5zdHJlYW1TdG9wcGVkKGV2ZW50KTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJTG9nTGlzdGVuZXIgbGlzdGVuZXIgPSAoTG9nTGlzdGVuZXIpIGkubmV4dCgpOworCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOworCQl9CisJfQorCisJLyoqIExpc3Qgb2YgbGlzdGVuZXJzIHRvIHdoaWNoIEkgbXVsdGlwbGV4IGV2ZW50cy4gKi8KKwlwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9Mb2dJbml0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0xvZ0luaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQzZjAzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9Mb2dJbml0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby4qOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKKworLyoqCisJVGhlIDxjb2RlPkxvZ0luaXQ8L2NvZGU+IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQorCXRoZSBsb2dnaW5nIGNhcGFiaWxpdHkgaW1wbGVtZW50ZWQgYnkgdGhlIHtAbGluayBMb2d9IGNsYXNzLgorCisJTWF5YmUgc29tZWRheSB0aGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kIHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIAorCXtAbGluayBMb2d9IGNsYXNzLgorCisJQGF1dGhvciBTLiBIYXJkbWFuCisJQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKwlAc2VlIExvZworKi8KK3B1YmxpYyBjbGFzcyBMb2dJbml0IHsKKworCS8qKgorCQlDb25zdHJ1Y3RvciBnaXZlbiBubyBhcmd1bWVudHMuCisKKwkJVGhpcyBpcyBhIHN0YXRpYy1vbmx5IGNsYXNzIHRoYXQgbWF5IG5vdCBiZSBpbnN0YW50aWF0ZWQuCisKKwkJQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZC4KKwkqLworCXB1YmxpYyBMb2dJbml0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxvZ0luaXQoKTogSW5zdGFudGlhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIG5vdCBhbGxvd2VkLiIpOworCX0KKworCisJLyoqCisJCUluaXRpYWxpemUgdGhlIGxvZ2dpbmcgY2FwYWJpbGl0eSBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCisKKwkJQHBhcmFtIHByb3BzIFRoZSBzeXN0ZW0gcHJvcGVydGllcy4KKwkJQHBhcmFtIHNvdXJjZSBUaGUgZGVmYXVsdCBzb3VyY2UgdG8gYmUgaW5jbHVkZWQgaW4gbWVzc2FnZXMuCisJCUB0aHJvd3MgRXhjZXB0aW9uIElmIHRoZSBsb2dnaW5nIGNhcGFiaWxpdHkgY2Fubm90IGJlIGluaXRpYWxpemVkLgorCSovCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXQoUHJvcGVydGllcyBwcm9wcywgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFNldCB1cCB0aGUgbG9nIGV2ZW50IHBpcGVsaW5lOiBmaWx0ZXIgLT4gbXVsdGlwbGV4ZXIgLT4gbWVtb3J5CisJCS8vIGxvZy91c2VyLXNwZWNpZmllZCBsb2cuICBGaXJzdCB0aGUgbXVsdGlwbGV4ZXIuCisJCUxvZ0V2ZW50TXVsdGlwbGV4ZXIgbXV4ID0gbmV3IExvZ0V2ZW50TXVsdGlwbGV4ZXIoKTsKKworCQkvLyBPbmUgZGVzdGluYXRpb24gb3V0IG9mIHRoZSBtdWx0aXBsZXhlciBpcyB0aGUgaW4tbWVtb3J5IHJvdW5kLXJvYmluIGxvZ2dlci4KKwkJbXV4LmFkZExpc3RlbmVyKE1FTU9SWV9MT0dHRVIpOworCisJCS8vIEFub3RoZXIgZGVzdGluYXRpb24gaXMgYW55IHVzZXItc3BlY2lmaWVkIGxvZ2dlci4KKwkJU3RyaW5nIHVzZXJTcGVjaWZpZWRMaXN0ZW5lciA9IHByb3BzLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkxvZ0luaXQubGlzdGVuZXIiKTsKKwkJaWYgKHVzZXJTcGVjaWZpZWRMaXN0ZW5lciAhPSBudWxsKQorCQkJbXV4LmFkZExpc3RlbmVyKChMb2dMaXN0ZW5lcikgQ2xhc3MuZm9yTmFtZSh1c2VyU3BlY2lmaWVkTGlzdGVuZXIpLm5ld0luc3RhbmNlKCkpOworCisJCS8vIEFoZWFkIG9mIHRoZSBtdWx0aXBsZXhlciBpcyB0aGUgZmlsdGVyLgorCQlTdHJpbmcgY2F0ZWdvcnlMaXN0ID0gcHJvcHMuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuTG9nSW5pdC5jYXRlZ29yaWVzIiwgIiIpOworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjYXRlZ29yeUxpc3QpOworCQlPYmplY3RbXSBjYXRlZ29yaWVzID0gbmV3IE9iamVjdFt0b2tlbnMuY291bnRUb2tlbnMoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7ICsraSkKKwkJCWNhdGVnb3JpZXNbaV0gPSB0b2tlbnMubmV4dFRva2VuKCk7CisJCUVudGVycHJpc2VMb2dGaWx0ZXIgZmlsdGVyID0gbmV3IEVudGVycHJpc2VMb2dGaWx0ZXIobXV4LCB0cnVlLCBjYXRlZ29yaWVzKTsKKwkJTG9nLmFkZExvZ0xpc3RlbmVyKGZpbHRlcik7CisKKwkJLy8gQW5kIHNldCB0aGUgc291cmNlIGxhYmVsLgorCQlMb2cuc2V0RGVmYXVsdFNvdXJjZShzb3VyY2UpOworCX0KKworCS8qKiBMb2cgZmlsdGVyIHRoYXQgdXNlcyBzdHJpbmdzIGFzIGNhdGVnb3J5IG9iamVjdHMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBFbnRlcnByaXNlTG9nRmlsdGVyIGV4dGVuZHMgTG9nRmlsdGVyIHsKKwkJLyoqIENvbnN0cnVjdCBhbiBFbnRlcnByaXNlTG9nRmlsdGVyLgorCQkgKgorCQkgKiBAcGFyYW0gbGlzdGVuZXIgV2hhdCBvYmplY3Qgd2lsbCBnZXQgZmlsdGVyZWQgbG9nIG1lc3NhZ2VzLgorCQkgKiBAcGFyYW0gcGFzc1Rocm91Z2ggSWYgdHJ1ZSwgcGFzcyBtZXNzYWdlcyB0aHJvdWdoIGJ5IGRlZmF1bHQgYW5kIGZpbHRlciBvdXQgdGhlCisJCSAqIHNwZWNpZmllZCA8dmFyPmNhdGVnb3JpZXM8L3Zhcj4gb2YgbWVzc2FnZXMuIElmIGZhbHNlLCBmaWx0ZXIgb3V0IG1lc3NhZ2VzIGJ5CisJCSAqIGRlZmF1bHQgYW5kIHBhc3MgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIDx2YXI+Y2F0ZWdvcmllczwvdmFyPi4KKwkJICogQHBhcmFtIGNhdGVnb3JpZXMgQ2F0ZWdvcmllcyBvZiBtZXNzYWdlcyB0byBmaWx0ZXIgb3V0IChpZgorCQkgKiA8dmFyPnBhc3NUaHJvdWdoPC92YXI+IGlzIHRydWUpIG9yIHRvIHBhc3MgdGhyb3VnaCAoaWYgPHZhcj5wYXNzVGhyb3VnaDwvdmFyPgorCQkgKiBpcyBmYWxzZSkuCisJCSAqLworCQlwdWJsaWMgRW50ZXJwcmlzZUxvZ0ZpbHRlcihMb2dMaXN0ZW5lciBsaXN0ZW5lciwgYm9vbGVhbiBwYXNzVGhyb3VnaCwgT2JqZWN0W10gY2F0ZWdvcmllcykgeworCQkJc3VwZXIobGlzdGVuZXIsIHBhc3NUaHJvdWdoLCBjYXRlZ29yaWVzKTsKKwkJCVByb3BlcnR5TWdyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCX0KKworCQkvKiogVXBkYXRlIHRoZSBsaXN0IG9mIGNhdGVnb3JpZXMgdG8gZWl0aGVyIHBhc3MtdGhyb3VnaCBvciBmaWx0ZXIgb3V0LgorCQkgKgorCQkgKiBAcGFyYW0gZXZlbnQgUHJvcGVydHkgY2hhbmdlIGV2ZW50LgorCQkgKi8KKwkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJU3RyaW5nIGtleSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOworCQkJaWYgKCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkxvZ0luaXQuY2F0ZWdvcmllcyIuZXF1YWxzKGtleSkpIHsKKwkJCQlTdHJpbmcgY2F0ZWdvcmllc0xpc3QgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOworCQkJCWNhdGVnb3JpZXMuY2xlYXIoKTsKKwkJCQlpZiAoY2F0ZWdvcmllc0xpc3QgIT0gbnVsbCkgeworCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjYXRlZ29yaWVzTGlzdCk7CisJCQkJCWNhdGVnb3JpZXMucHV0KHRva2Vucy5uZXh0VG9rZW4oKSwgRFVNTVkpOworCQkJCX0KKwkJCQlMb2cuZ2V0KCJJbmZvIikucHJpbnRsbigiRW50ZXJwcmlzZSBsb2cgbm93IGZpbHRlcmluZyBvdXQgIiArIChjYXRlZ29yaWVzTGlzdCA9PSBudWxsPworCQkJCQkiYWxsIGNhdGVnb3JpZXMgb2YgbWVzc2FnZXMiIDogIm1lc3NhZ2VzIGluIGNhdGVnb3JpZXMgIiArIGNhdGVnb3JpZXNMaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogVGhlIHNpbmdsZSBtZW1vcnkgbG9nZ2VyIGZvciBhbiBhcHBsaWNhdGlvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIE1lbW9yeUxvZ2dlciBNRU1PUllfTE9HR0VSID0gbmV3IE1lbW9yeUxvZ2dlcigpOworfQorCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL01lbW9yeUxvZ2dlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9NZW1vcnlMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdkMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9NZW1vcnlMb2dnZXIuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uTG9nTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uTG9nRXZlbnQ7CisKKy8qKiBJbi1tZW1vcnkgbG9nZ2VyLgorICoKKyAqIFRoaXMgbG9nZ2VyIG1haW50YWlucyBsb2cgbWVzc2FnZXMgaW4gbWVtb3J5LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIE1lbW9yeUxvZ2dlciBpbXBsZW1lbnRzIExvZ0xpc3RlbmVyIHsKKwkvKiogQ3JlYXRlIGEgbWVtb3J5IGxvZ2dlci4KKwkgKgorCSAqIFRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIGNhY2hlIGNvbWVzIGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0eSA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLk1lbW9yeUxvZ2dlci5zaXplPC9jb2RlPiwKKwkgKiBvciB7QGxpbmsgI0RFRl9TSVpFfSBpZiB0aGF0IHByb3BlcnR5IGlzbid0IHNwZWNpZmllZC4KKwkgKi8KKwlwdWJsaWMgTWVtb3J5TG9nZ2VyKCkgeworCQl0aGlzKEludGVnZXIuZ2V0SW50ZWdlcigib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5NZW1vcnlMb2dnZXIuc2l6ZSIsIERFRl9TSVpFKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgbWVtb3J5IGxvZ2dlci4KKwkgKgorCSAqIEBwYXJhbSBzaXplIFNpemUgb2YgdGhlIG1lc3NhZ2UgY2FjaGUuCisJICovCisJcHVibGljIE1lbW9yeUxvZ2dlcihpbnQgc2l6ZSkgeworCQl0aGlzLnNpemUgPSBzaXplOworCX0KKworCS8qKiBHZXQgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgbG9nZ2VkIHNvIGZhci4KKwkgKgorCSAqIFRoaXMgcmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIFN0cmluZ31zIGluIHRpbWUgb3JkZXIuCisJICoKKwkgKiBAcmV0dXJuIEEgbGlzdCBvZiBtZXNzYWdlIHN0cmluZ3MuCisJICovCisJcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7CisJCXJldHVybiAoTGlzdCkgbWVzc2FnZXMuY2xvbmUoKTsKKwl9CisKKwkvKiogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLgorCSAqCisJICogQHJldHVybiBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFNpemUoKSB7CisJCXJldHVybiBzaXplOworCX0KKworCS8qKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuCisJICoKKwkgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IG1heGltdW0gY2FjaGUgc2l6ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7CisJCWlmIChzaXplIDwgMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9nIGNhY2hlIHNpemUgY2FuJ3QgYmUgbmVnYXRpdmUiKTsKKwkJaW50IGRlbHRhID0gdGhpcy5zaXplIC0gc2l6ZTsKKwkJdGhpcy5zaXplID0gc2l6ZTsKKwkJaWYgKGRlbHRhIDw9IDApIHJldHVybjsKKwkJaWYgKG1lc3NhZ2VzLnNpemUoKSA8IHNpemUpIHJldHVybjsKKwkJd2hpbGUgKGRlbHRhLS0gPiAwKQorCQkJbWVzc2FnZXMucmVtb3ZlRmlyc3QoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdHJlYW1TdGFydGVkKExvZ0V2ZW50IGlnbm9yZSkge30KKwlwdWJsaWMgdm9pZCBzdHJlYW1TdG9wcGVkKExvZ0V2ZW50IGlnbm9yZSkge30KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGlnbm9yZSkge30KKworCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoTG9nRXZlbnQgZXZlbnQpIHsKKwkJbWVzc2FnZXMuYWRkKERhdGVDb252ZXJ0Lmlzb0Zvcm1hdChldmVudC5nZXRUaW1lc3RhbXAoKSkgKyAiICIgKyBldmVudC5nZXRTb3VyY2UoKSArICIgIiArIGV2ZW50LmdldENhdGVnb3J5KCkKKwkJCSsgIjogIiArIGV2ZW50LmdldE1lc3NhZ2UoKSk7CisJCWlmIChtZXNzYWdlcy5zaXplKCkgPiBzaXplKQorCQkJbWVzc2FnZXMucmVtb3ZlRmlyc3QoKTsKKwl9CisKKwkvKiogVGhlIGxpc3Qgb2YgbWVzc2FnZXMuICovCisJcHJpdmF0ZSBMaW5rZWRMaXN0IG1lc3NhZ2VzID0gbmV3IExpbmtlZExpc3QoKTsKKworCS8qKiBNYXhpbXVtIHNpemUgb2YgbWVzc2FnZSBjYWNoZS4gKi8KKwlwcml2YXRlIGludCBzaXplOworCisJLyoqIFRoZSBkZWZhdWx0IHNpemUgb2YgdGhlIG1lc3NhZ2UgY2FjaGUsIDMyLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRl9TSVpFID0gMzI7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1Byb3BlcnR5TWdyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1Byb3BlcnR5TWdyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViNmFiNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvUHJvcGVydHlNZ3IuamF2YQpAQCAtMCwwICsxLDYxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5iZWFucy4qOworCisvKiogUHJvcGVydHkgbWFuYWdlciBtYW5hZ2VzIHVwZGF0ZXMgdG8gcHJvcGVydGllcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eU1nciB7CisJLyoqIEFkZCBhIGxpc3RlbmVyIGZvciBwcm9wZXJ0eSBjaGFuZ2VzLgorCSAqCisJICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRvIGFkZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKiBSZW1vdmUgYSBsaXN0ZW5lcidzIGludGVyZXN0IGluIHByb3BlcnR5IGNoYW5nZXMuCisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVtb3ZlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqIFNldCBhIHByb3BlcnR5IGFuZCBub3RpZnkgbGlzdGVuZXJzLgorCSAqCisJICogQHBhcmFtIGtleSBQcm9wZXJ0eSdzIG5hbWUuCisJICogQHBhcmFtIHZhbHVlIE5ldyBwcm9wZXJ0eSdzIHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZFZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KGtleSk7CisJCVN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKwkJaWYgKCFsaXN0ZW5lcnMuaXNFbXB0eSgpKSB7CisJCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoU3lzdGVtLmdldFByb3BlcnRpZXMoKSwga2V5LCBvbGRWYWx1ZSwgdmFsdWUpOworCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgaS5uZXh0KCk7CisJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOworCQkJfQorCQl9CisJfQorCisJLyoqIFByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMuICovCisJcHJpdmF0ZSBzdGF0aWMgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1NBWFBhcnNlci5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9TQVhQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlkYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9TQVhQYXJzZXIuamF2YQpAQCAtMCwwICsxLDMyMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIEFuIFhNTCBTaW1wbGUgQVBJIGZvciBYTUwgKFNBWCkgcGFyc2VyLgorICoKKyAqIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgU0FYIHBhcnNlcnMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgU0FYUGFyc2VyIHsKKwkvKiogQ29uc3RydWN0IGEgU0FYIFBhcnNlci4KKwkgKi8KKwlTQVhQYXJzZXIoamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIHBhcnNlcikgeworCQl0aGlzLnBhcnNlciA9IHBhcnNlcjsKKwl9CisKKwkvKiogUmV0dXJucyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCB0aGlzIHBhcnNlciByZWNvZ25pemVzLgorCSAqCisJICogVGhpcyBtZXRob2Qgd2lsbCBuZXZlciByZXR1cm4gbnVsbDsgaWYgbm8gZmVhdHVyZXMgYXJlIHJlY29nbml6ZWQsIHRoaXMKKwkgKiBtZXRob2Qgd2lsbCByZXR1cm4gYSB6ZXJvIGxlbmd0aCBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gUmVjb2duaXplZCBmZWF0dXJlcy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0RmVhdHVyZXNSZWNvZ25pemVkKCkgeworCQlyZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIHBhcnNlciByZWNvZ25pemVzLgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGw7IGlmIG5vIHByb3BlcnRpZXMgYXJlCisJICogcmVjb2duaXplZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSB6ZXJvIGxlbmd0aCBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gUmVjb2duaXplZCBwcm9wZXJ0aWVzLgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0aWVzUmVjb2duaXplZCgpIHsKKwkJcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKKwl9CisKKwkvKiogUmVzZXRzIHRoZSBwYXJzZXIuICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7fQorCisKKwkvKioKKwkgKiBTZXQgdGhlIHN0YXRlIG9mIGFueSBmZWF0dXJlIGluIGEgU0FYMiBwYXJzZXIuICBUaGUgcGFyc2VyCisJICogbWlnaHQgbm90IHJlY29nbml6ZSB0aGUgZmVhdHVyZSwgYW5kIGlmIGl0IGRvZXMgcmVjb2duaXplCisJICogaXQsIGl0IG1pZ2h0IG5vdCBiZSBhYmxlIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCisJICoKKwkgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciAoVVJJKSBvZiB0aGUgZmVhdHVyZS4KKwkgKiBAcGFyYW0gc3RhdGUgVGhlIHJlcXVlc3RlZCBzdGF0ZSBvZiB0aGUgZmVhdHVyZSAodHJ1ZSBvciBmYWxzZSkuCisJICoKKwkgKiBAZXhjZXB0aW9uIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBrbm93bi4KKwkgKiBAZXhjZXB0aW9uIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBJZiB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93biwgYnV0IHRoZSByZXF1ZXN0ZWQgc3RhdGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3Qgc3VwcG9ydGVkLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVJZCwgYm9vbGVhbiBzdGF0ZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlRoaXMgcGFyc2VyIHN1cHBvcnRzIG5vIGZlYXR1cmVzIik7CisJfQorCisJLyoqCisJICogUXVlcnkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW55IGZlYXR1cmUgaW4gYSBTQVgyIHBhcnNlci4gIFRoZQorCSAqIHBhcnNlciBtaWdodCBub3QgcmVjb2duaXplIHRoZSBmZWF0dXJlLgorCSAqCisJICogQHBhcmFtIGZlYXR1cmVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgKFVSSSkgb2YgdGhlIGZlYXR1cmUKKwkgKiAgICAgICAgICAgICAgICAgIGJlaW5nIHNldC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZlYXR1cmUuCisJICoKKwkgKiBAZXhjZXB0aW9uIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBrbm93bi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlSWQpIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCQl0aHJvdyBuZXcgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHBhcnNlciBzdXBwb3J0cyBubyBmZWF0dXJlcyIpOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgdmFsdWUgb2YgYW55IHByb3BlcnR5IGluIGEgU0FYMiBwYXJzZXIuICBUaGUgcGFyc2VyCisJICogbWlnaHQgbm90IHJlY29nbml6ZSB0aGUgcHJvcGVydHksIGFuZCBpZiBpdCBkb2VzIHJlY29nbml6ZQorCSAqIGl0LCBpdCBtaWdodCBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHByb3BlcnR5SWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIChVUkkpIG9mIHRoZSBwcm9wZXJ0eQorCSAqICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldC4KKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyBzZXQuCisJICoKKwkgKiBAZXhjZXB0aW9uIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qga25vd24uCisJICogQGV4Y2VwdGlvbiBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duLCBidXQgdGhlIHJlcXVlc3RlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5SWQsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlRoaXMgcGFyc2VyIHN1cHBvcnRzIG5vIHByb3BlcnRpZXMiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBwcm9wZXJ0eSBpbiBhIFNBWDIgcGFyc2VyLgorCSAqIFRoZSBwYXJzZXIgbWlnaHQgbm90IHJlY29nbml6ZSB0aGUgcHJvcGVydHkuCisJICoKKwkgKiBAcGFyYW0gcHJvcGVydHlJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgKFVSSSkgb2YgdGhlIHByb3BlcnR5CisJICogICAgICAgICAgICAgICAgICAgYmVpbmcgc2V0LgorCSAqCisJICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisJICoKKwkgKiBAZXhjZXB0aW9uIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qga25vd24uCisJICoKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUlkKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVGhpcyBwYXJzZXIgc3VwcG9ydHMgbm8gcHJvcGVydGllcyIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaXMgcmVjb2duaXplZC4KKwkgKgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmVhdHVyZVJlY29nbml6ZWQoU3RyaW5nIGZlYXR1cmVJZCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyByZWNvZ25pemVkLgorCSAqCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVJlY29nbml6ZWQoU3RyaW5nIHByb3BlcnR5SWQpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHJldHVybiB0aGUgbG9jYXRvciBiZWluZyB1c2VkIGJ5IHRoZSBwYXJzZXIKKwkgKgorCSAqIEByZXR1cm4gdGhlIHBhcnNlcidzIGFjdGl2ZSBsb2NhdG9yCisJICovCisJcHVibGljIGZpbmFsIExvY2F0b3IgZ2V0TG9jYXRvcigpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBwYXJzZXIgZG9lc24ndCBzdXBwb3J0IGxvY2F0b3JzIik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcmVzb2x2ZXIgdXNlZCB0byByZXNvbHZlIGV4dGVybmFsIGVudGl0aWVzLiBUaGUgRW50aXR5UmVzb2x2ZXIKKwkgKiBpbnRlcmZhY2Ugc3VwcG9ydHMgcmVzb2x1dGlvbiBvZiBwdWJsaWMgYW5kIHN5c3RlbSBpZGVudGlmaWVycy4KKwkgKgorCSAqIEBwYXJhbSByZXNvbHZlciBUaGUgbmV3IGVudGl0eSByZXNvbHZlci4gUGFzc2luZyBhIG51bGwgdmFsdWUgd2lsbAorCSAqICAgICAgICAgICAgICAgICB1bmluc3RhbGwgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgcmVzb2x2ZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKwkJdHJ5IHsKKwkJCXBhcnNlci5nZXRYTUxSZWFkZXIoKS5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IGVudGl0eSByZXNvbHZlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZW50aXR5IHJlc29sdmVyLCBvciBudWxsIGlmIG5vbmUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisJICogQHNlZSAjc2V0RW50aXR5UmVzb2x2ZXIKKwkgKi8KKwlwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgcGFyc2VyIHN1cHBvcnRzIG9ubHkgc2V0dGluZyBvZiB0aGUgZW50aXR5IHJlc29sdmVyLCBub3QgcXVlcnlpbmciKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBlcnJvciBoYW5kbGVyLgorCSAqCisJICogQHBhcmFtIGhhbmRsZXIgVGhlIG5ldyBlcnJvciBoYW5kbGVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIgaGFuZGxlcikgeworCQl0cnkgeworCQkJcGFyc2VyLmdldFhNTFJlYWRlcigpLnNldEVycm9ySGFuZGxlcihoYW5kbGVyKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGlnbm9yZSkge30KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZXJyb3IgaGFuZGxlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZXJyb3IgaGFuZGxlciwgb3IgbnVsbCBpZiBub25lCisJICogICAgICAgICBoYXMgYmVlbiByZWdpc3RlcmVkLgorCSAqIEBzZWUgI3NldEVycm9ySGFuZGxlcgorCSAqLworCXB1YmxpYyBFcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHBhcnNlciBzdXBwb3J0cyBvbmx5IHNldHRpbmcgb2YgdGhlIGVycm9yIGhhbmRsZXIsIG5vdCBxdWVyeWluZyIpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGlucHV0IHNvdXJjZS4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2UgVGhlIGlucHV0IHNvdXJjZS4KKwkgKgorCSAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIFRocm93cyBleGNlcHRpb24gb24gU0FYIGVycm9yLgorCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBUaHJvd3MgZXhjZXB0aW9uIG9uIGkvbyBlcnJvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFNvdXJjZSBzb3VyY2UpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJcGFyc2VyLmdldFhNTFJlYWRlcigpLnBhcnNlKHNvdXJjZSk7CisJfQorCisJLyoqCisJICogUGFyc2VzIHRoZSBpbnB1dCBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBzeXN0ZW0gaWRlbnRpZmllci4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CisJICogPHByZT4KKwkgKiAgICAgcGFyc2UobmV3IElucHV0U291cmNlKHN5c3RlbUlkKSk7CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gc3lzdGVtSUQgVGhlIGlucHV0IHNvdXJjZS4KKwkgKgorCSAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIFRocm93cyBleGNlcHRpb24gb24gU0FYIGVycm9yLgorCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBUaHJvd3MgZXhjZXB0aW9uIG9uIGkvbyBlcnJvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3lzdGVtSUQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJcGFyc2VyLmdldFhNTFJlYWRlcigpLnBhcnNlKHN5c3RlbUlEKTsKKwl9CisKKworCS8qKgorCSAqIFNldCB0aGUgbG9jYWxlIHRvIHVzZSBmb3IgbWVzc2FnZXMuCisJICoKKwkgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgb2JqZWN0IHRvIHVzZSBmb3IgbG9jYWxpemF0aW9uIG9mIG1lc3NhZ2VzLgorCSAqCisJICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gQW4gZXhjZXB0aW9uIHRocm93biBpZiB0aGUgcGFyc2VyIGRvZXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgcGFyc2VyIGRvZXNuJ3Qgc3VwcG9ydCBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMiKTsKKwl9CisKKwkvKioKKwkgKiBBbGxvdyBhbiBhcHBsaWNhdGlvbiB0byByZWdpc3RlciBhIERURCBldmVudCBoYW5kbGVyLgorCSAqCisJICogPHA+SWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlZ2lzdGVyIGEgRFREIGhhbmRsZXIsIGFsbCBEVEQKKwkgKiBldmVudHMgcmVwb3J0ZWQgYnkgdGhlIFNBWCBwYXJzZXIgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLjwvcD4KKwkgKgorCSAqIDxwPkFwcGxpY2F0aW9ucyBtYXkgcmVnaXN0ZXIgYSBuZXcgb3IgZGlmZmVyZW50IGhhbmRsZXIgaW4gdGhlCisJICogbWlkZGxlIG9mIGEgcGFyc2UsIGFuZCB0aGUgU0FYIHBhcnNlciBtdXN0IGJlZ2luIHVzaW5nIHRoZSBuZXcKKwkgKiBoYW5kbGVyIGltbWVkaWF0ZWx5LjwvcD4KKwkgKgorCSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBEVEQgaGFuZGxlci4KKwkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBJZiB0aGUgaGFuZGxlciAKKwkgKiAgICAgICAgICAgIGFyZ3VtZW50IGlzIG51bGwuCisJICogQHNlZSAjZ2V0RFRESGFuZGxlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldERUREhhbmRsZXIoRFRESGFuZGxlciBoYW5kbGVyKSB7CisJCXRyeSB7CisJCQlwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0RFRESGFuZGxlcihoYW5kbGVyKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGlnbm9yZSkge30KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgRFREIGhhbmRsZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IERURCBoYW5kbGVyLCBvciBudWxsIGlmIG5vbmUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisJICogQHNlZSAjc2V0RFRESGFuZGxlcgorCSAqLworCXB1YmxpYyBEVERIYW5kbGVyIGdldERUREhhbmRsZXIoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gcGFyc2VyLmdldFhNTFJlYWRlcigpLmdldERUREhhbmRsZXIoKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIFNBWEV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBbGxvdyBhbiBhcHBsaWNhdGlvbiB0byByZWdpc3RlciBhIGNvbnRlbnQgZXZlbnQgaGFuZGxlci4KKwkgKgorCSAqIDxwPklmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZWdpc3RlciBhIGNvbnRlbnQgaGFuZGxlciwgYWxsCisJICogY29udGVudCBldmVudHMgcmVwb3J0ZWQgYnkgdGhlIFNBWCBwYXJzZXIgd2lsbCBiZSBzaWxlbnRseQorCSAqIGlnbm9yZWQuPC9wPgorCSAqCisJICogPHA+QXBwbGljYXRpb25zIG1heSByZWdpc3RlciBhIG5ldyBvciBkaWZmZXJlbnQgaGFuZGxlciBpbiB0aGUKKwkgKiBtaWRkbGUgb2YgYSBwYXJzZSwgYW5kIHRoZSBTQVggcGFyc2VyIG11c3QgYmVnaW4gdXNpbmcgdGhlIG5ldworCSAqIGhhbmRsZXIgaW1tZWRpYXRlbHkuPC9wPgorCSAqCisJICogQHBhcmFtIGhhbmRsZXIgVGhlIGNvbnRlbnQgaGFuZGxlci4KKwkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBJZiB0aGUgaGFuZGxlciAKKwkgKiAgICAgICAgICAgIGFyZ3VtZW50IGlzIG51bGwuCisJICogQHNlZSAjZ2V0Q29udGVudEhhbmRsZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlciBoYW5kbGVyKSB7CisJCXRyeSB7CisJCQlwYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnQgaGFuZGxlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY29udGVudCBoYW5kbGVyLCBvciBudWxsIGlmIG5vbmUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisJICogQHNlZSAjc2V0Q29udGVudEhhbmRsZXIKKwkgKi8KKwlwdWJsaWMgQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gcGFyc2VyLmdldFhNTFJlYWRlcigpLmdldENvbnRlbnRIYW5kbGVyKCk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBTQVhFeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworCXByaXZhdGUgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIHBhcnNlcjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvU2NyZWVuTG9nZ2VyLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1NjcmVlbkxvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjAwYTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1NjcmVlbkxvZ2dlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uKjsKKworLyoqCisJVGhlIDxjb2RlPlNjcmVlbkxvZ2dlcjwvY29kZT4gY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZQorCXtAbGluayBMb2d9IGNsYXNzIGluIG9yZGVyIHRvIHNldHVwIHRoZSBTeXN0ZW0uZXJyIGFzIGEge0BsaW5rIExvZ0xpc3RlbmVyfS4KKworCUBhdXRob3IgUy4gSGFyZG1hbgorCUB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyovCitwdWJsaWMgY2xhc3MgU2NyZWVuTG9nZ2VyIGV4dGVuZHMgV3JpdGVyTG9nZ2VyIHsKKworCS8qKgorCQlDb25zdHJ1Y3RvciBnaXZlbiBubyBhcmd1bWVudHMuCisKKwkJVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHNwZWNpZnkgU3lzdGVtLmVyciBhcyB0aGUgb3V0cHV0IHN0cmVhbQorCQlhbmQgdGhlbiBjYWxsIHRoZSBvdGhlciBjb25zdHJ1Y3RvciB3aXRoIHRoZSBvdXRwdXQgc3RyZWFtIGFyZ3VtZW50LgorCSovCisJcHVibGljIFNjcmVlbkxvZ2dlciAoKSB7CisJCXRoaXMoU3lzdGVtLmVycik7CisJfQorCisKKwkvKioKKwkJQ29uc3RydWN0b3IgZ2l2ZW4gYW4gb3V0cHV0IHN0cmVhbS4KKworCQlUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIHRoZSB7QGxpbmsgV3JpdGVyTG9nZ2VyfSBjb25zdHJ1Y3RvciB3aXRoIHRoZQorCQlzYW1lIHNpZ25hdHVyZS4KKworCQlAcGFyYW0gb3V0cHV0U3RyZWFtIFRoZSBvdXRwdXQgc3RyZWFtIHJlcHJlc2VudGluZyB0aGUgbG9nIGRlc3RpbmF0aW9uLgorCSovCisJcHVibGljIFNjcmVlbkxvZ2dlciAoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworCQlzdXBlcihvdXRwdXRTdHJlYW0pOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvVXRpbGl0eS5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9VdGlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiMjU3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvVXRpbGl0eS5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKiBNaXNjZWxsYW5lb3VzIHV0aWxpdGllcy4KKyAqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHZhcmlvdXMgbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgYXMgc3RhdGljIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgVXRpbGl0eSB7CisJLyoqIExvYWQgcHJvcGVydGllcyBmcm9tIGEgcmVzb3VyY2UuCisJICoKKwkgKiBUaGlzIGxvYWRzIHByb3BlcnRpZXMgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgKHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBjbGFzcykKKwkgKiBpbnRvIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIG9iamVjdC4gIElmIGFueSBlcnJvciBvY2N1cnMsIHRoaXMgbWV0aG9kIHByaW50cyBhCisJICogbWVzc2FnZSB0byBzdGRlcnIgYnV0IG90aGVyd2lzZSB0YWtlcyBubyBzcGVjaWFsIGFjdGlvbi4KKwkgKgorCSAqIDxwPllvdSB0eXBpY2FsbHkgdXNlIHRoaXMgdG8gbWVyZ2UgcHJvcGVydGllcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBpbnRvIHRoZQorCSAqIFN5c3RlbSBwcm9wZXJ0aWVzIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QgYXMgZm9sbG93czoKKwkgKiA8cHJlPlV0aWxpdHkubG9hZFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSwgTXlDbGFzcy5jbGFzcywKKwkgKiAiTXlDbGFzcy5wcm9wZXJ0aWVzIik7PC9wcmU+IFRoaXMgYWRkcyB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBmaWxlCisJICogPGNvZGU+TXlDbGFzcy5wcm9wZXJ0aWVzPC9jb2RlPiAod2hpY2ggbXVzdCBleGlzdCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlCisJICogZmlsZSA8Y29kZT5NeUNsYXNzLmNsYXNzPC9jb2RlPiwgd2hldGhlciBpbiB0aGUgZmlsZXN5c3RlbSBvciBpbiBhIGphcikgaW50bworCSAqIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4gIFlvdSBjYW4gdGhlbiBmZXRjaCB0aGVzZSBwcm9wZXJ0aWVzIGZyb20gYW55d2hlcmUgaW4KKwkgKiB5b3VyIHByb2dyYW0gd2l0aCA8Y29kZT5TeXN0ZW0uZ2V0UHJvcGVydHkoU3RyaW5nKTwvY29kZT4sCisJICogPGNvZGU+SW50ZWdlci5nZXRJbnRlZ2VyPC9jb2RlPiwgZXRjLgorCSAqCisJICogPHA+WW91IGNhbiBhbHNvIHVzZSB0aGUgbWV0aG9kIHRvIGxvYWQgcHJvcGVydGllcyBpbnRvIGEgbmV3bHkgY3JlYXRlZAorCSAqIHByb3BlcnRpZXMgb2JqZWN0IHRoYXQgeW91IHByb3ZpZGUuICBUaGlzIGtlZXBzIHlvdXIgcHJvcGVydGllcyBzZXBhcmF0ZSwgYnV0CisJICogdGhlbiB5b3UgaGF2ZSB0byBwYXNzIGEgcHJvcGVydGllcyBvYmplY3QgYWxsIG92ZXIgdGhlIHBsYWNlLCBhbmQgeW91IGNhbid0CisJICogdGFrZSBhZHZhbnRhZ2Ugb2Ygbm9uLVN0cmluZyBwcm9wZXJ0aWVzIHRocm91Z2ggbWV0aG9kcyBsaWtlCisJICogPGNvZGU+TG9uZyNnZXRMb25nKFN0cmluZyk8L2NvZGU+LCBldGMuCisJICoKKwkgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2JqZWN0IHRvIGxvYWQuCisJICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyB1c2VkIHRvIGxvY2F0ZSB0aGUgcmVzb3VyY2UuCisJICogQHBhcmFtIHJlc291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvYWRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMsIGZpbmFsIENsYXNzIGNsYXp6LCBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQl0cnkgeworCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSkpOworCQkJcHJvcHMubG9hZChpbik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkkvTyBleGNlcHRpb24gd2hpbGUgbG9hZGluZyBcIiIgKyByZXNvdXJjZU5hbWUgKyAiXCI6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluICE9IG51bGwpIHRyeSB7CisJCQkJaW4uY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJfQorCX0KKworCS8qKiBQYXJzZSBhIGxpc3QuCisJICoKKwkgKiBUaGlzIHlpZWxkcyBhbiBpdGVyYXRvciBjcmVhdGVkIGZyb20gYSBsaXN0IHdoZXJlIGNvbW1hcyAoYW5kIG9wdGlvbmFsIGxlYWRpbmcKKwkgKiBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSkgc2VwYXJhdGUgZWFjaCBlbGVtZW50LiAgRWFjaCBlbGVtZW50IHdpbGwgb2NjdXIgb25seQorCSAqIG9uY2UgaW4gdGhlIGl0ZXJhdG9yIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgdGltZXMgaXQgYXBwZWFyZWQgaW4gdGhlIHN0cmluZy4KKwkgKgorCSAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0IHRvIHBhcnNlLgorCSAqIEByZXR1cm4gVGhlIGl0ZXJhdG9yIG92ZXIgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSA8dmFyPmxpc3Q8L3Zhcj4uCisJICovCisJcHVibGljIHN0YXRpYyBJdGVyYXRvciBwYXJzZUNvbW1hTGlzdChmaW5hbCBTdHJpbmcgbGlzdCkgeworCQlpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisJCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJUaGVyZSB3ZXJlbid0IEFOWSBlbGVtZW50cyBpbiB0aGlzIGl0ZXJhdG9yLCBldmVyIik7CisJCQl9CisJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGlzIGl0ZXJhdG9yIik7CisJCQl9CisJCX07CisJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGlzdCwgIiwiKTsKKwkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCisJCQlzZXQuYWRkKHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCkpOworCQlyZXR1cm4gc2V0Lml0ZXJhdG9yKCk7CisJfQorCisJLyoqIEFzeW5jaHJvbm91c2x5IHJlZGlyZWN0IGFuIGlucHV0IHN0cmVhbSBvbnRvIGFuIG91dHB1dCBzdHJlYW0uCisJICoKKwkgKiBUaGUgb3V0cHV0IHN0cmVhbSBpcyBuZXZlciBjbG9zZWQuCisJICoKKwkgKiBAcGFyYW0gaW4gSW5wdXQgc3RyZWFtIHRvIHJlZGlyZWN0LgorCSAqIEBwYXJhbSBvdXQgV2hlcmUgdG8gcmVkaXJlY3QgPHZhcj5pbjwvdmFyPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVkaXJlY3QoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHsKKwkJbmV3IFRocmVhZCgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisJCQkJCWZvciAoOzspIHsKKwkJCQkJCWludCBudW1SZWFkID0gaW4ucmVhZChidWYpOworCQkJCQkJaWYgKG51bVJlYWQgPT0gLTEpIHsKKwkJCQkJCQlpbi5jbG9zZSgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbnVtUmVhZCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJCQl0cnkgeworCQkJCQkJaW4uY2xvc2UoKTsKKwkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCQkJCX0KKwkJCX0KKwkJfS5zdGFydCgpOworCX0KKworCS8qKiBMb2cgc3RhdGlzdGljcyBvbiBtZW1vcnkgdG8gc3RkZXJyLgorCSAqCisJICogQHBhcmFtIG1zZyBUZXh0IHRvIGluY2x1ZGUgaW4gbG9nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZW1vcnlTdGF0cyhTdHJpbmcgbXNnKSB7CisJCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKwkJU3lzdGVtLmVyci5wcmludGxuKG1zZyArICI6IHRvdGFsPSIgKyAocnQudG90YWxNZW1vcnkoKSAvIDEwMjQpICsgIktCLCBmcmVlPSIgKyAocnQuZnJlZU1lbW9yeSgpIC8gMTAyNCkgKyAiS0IiKTsKKwl9CisKKwkvKiogQ2hlY2sgc3RyaW5nIHMgaXMgbnVtZXJpYy4gIE51bWVyaWMgc3RyaW5ncyBpbmNsdWRlIDUuNywgLTMuOSwgMTQuOTgxRTE2LCBldGMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzIFRleHQgdG8gYmUgY2hlY2tlZC4KKwkgKiBAcmV0dXJuIFRydWUgaXMgPHZhcj5zPC92YXI+IGlzIGEgbnVtZXJpYyBzdHJpbmcuCisgICAgICAgICAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bWVyaWMoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKHMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworCS8qKgorCSAqIERlbGV0ZSBhIGZpbGUgb3IgZGlyZWN0b3J5LiAgSWYgPHZhcj5maWxlPC92YXI+IHJlZmVyZW5jZXMgYSBkaXJlY3RvcnksIGl0CisJICogcmVjdXJzaXZlbHkgZGVsZXRlcyBhbGwgdGhlIGRpcmVjdG9yeSB0cmVlLgorCSAqCisJICogQHBhcmFtIGZpbGUgRmlsZSwgZGlyZWN0b3J5LCBvciBvdGhlciBmaWxlc3lzdGVtIGFydGlmYWN0IHRvIGRlbGV0ZS4KKwkgKiBAcmV0dXJuIFRydWUgaWYgPHZhcj5maWxlPC92YXI+IHdhcyBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZShGaWxlIGZpbGUpIHsKKwkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworCQkJRmlsZVtdIGVudHJpZXMgPSBmaWxlLmxpc3RGaWxlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKQorCQkJCWlmICghZGVsZXRlKGVudHJpZXNbaV0pKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGZpbGUuZGVsZXRlKCk7CisJfQorCisgICAvKioKKyAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZXNjYXBlIGFueSBzaW5nbGUgcXVvdGVzIGZvdW5kIGluIHRoZSBpbnB1dCBzdHJpbmcKKyAgICAqIGFuZCByZXR1cm4gdGhlIGVzY2FwZWQgc3RyaW5nLiBUaGlzIHdpbGwgcmVhZHkgdGhlIHN0cmluZyBmb3IKKyAgICAqIGluc2VydGlvbiBpbnRvIGEgZGF0YWJhc2UuIFRoZSBzaW5nbGUgcXVvdGUgaXMgZXNjYXBlZCBieSBpbnNlcnRpbmcKKyAgICAqIGFuIGFkZGl0aW9uYWwgc2luZ2xlIHF1b3RlIGluIGZyb250IG9mIGl0IGluIHRoZSBzdHJpbmcuIElmIHNvbWUKKyAgICAqIGNvbnNpZGVyYXRlIGRldmVsb3BlciBoYXMgYWxyZWFkeSBlc2NhcGVkIHRoZSBzaW5nbGUgcXVvdGVzIGluIHRoZQorICAgICogaW5wdXQgc3RyaW5nLCB0aGlzIG1ldGhvZCB3aWxsIGVzc2VudGlhbGx5IGRvIG5vdGhpbmcuCisgICAgKgorICAgICogQHBhcmFtIGlucHV0U3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgZXNjYXBlZC4KKyAgICAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgorICAgICovCisgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVTaW5nbGVRdW90ZShTdHJpbmcgaW5wdXRTdHJpbmcpIHsKKworICAgICAgaW50IGluZGV4ID0gaW5wdXRTdHJpbmcuaW5kZXhPZignXCcnKTsKKyAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgcmV0dXJuIChpbnB1dFN0cmluZyk7CisgICAgICB9CisKKyAgICAgIFN0cmluZyBvdXRwdXRTdHJpbmcgPSBpbnB1dFN0cmluZzsKKyAgICAgIHdoaWxlIChpbmRleCAhPSAtMSkgeworCisgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlIHF1b3RlIGlzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIG9yIAorICAgICAgICAgLy8gdGhlIG5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbm90aGVyIHNpbmdsZSBxdW90ZSwgaW5zZXJ0IGEKKyAgICAgICAgIC8vIHNpbmdsZSBxdW90ZSBpbiBmcm9udCBvZiB0aGUgY3VycmVudCBzaW5nbGUgcXVvdGUuCisgICAgICAgICBpZiAoKGluZGV4ID09IChvdXRwdXRTdHJpbmcubGVuZ3RoKCkgLSAxKSkgfHwgKG91dHB1dFN0cmluZy5jaGFyQXQoaW5kZXggKyAxKSAhPSAnXCcnKSkgeworICAgICAgICAgICAgb3V0cHV0U3RyaW5nID0gb3V0cHV0U3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyAiJyIgKyBvdXRwdXRTdHJpbmcuc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIGNoZWNrIGZvciBhbm90aGVyCisgICAgICAgICAvLyBzaW5nbGUgcXVvdGUuCisgICAgICAgICBpZiAoKGluZGV4ICsgMikgPD0gKG91dHB1dFN0cmluZy5sZW5ndGgoKSAtIDEpKSB7CisgICAgICAgICAgICBpbmRleCA9IG91dHB1dFN0cmluZy5pbmRleE9mKCdcJycsIGluZGV4ICsgMik7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGV4ID0gLTE7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gKG91dHB1dFN0cmluZyk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1hNTC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9YTUwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ1NTFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9YTUwuamF2YQpAQCAtMCwwICsxLDY1MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisvLworLy8gUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGNvbWUgZnJvbSB0aGUgQXBhY2hlIFhNTCBQcm9qZWN0J3MgWGVyY2VzIDEuMC4zIFhNTCBQYXJzZXIKKy8vIChzcGVjaWZpY2FsbHksIHRoZSBmdW5jdGlvbnMgZXNjYXBlIGFuZCBnZXRFbnRpdHlSZWYpLiAgQXBhY2hlIGxpY2Vuc2UgYXBwbGllczoKKy8vCisvLyBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisvLworLy8gQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisvLyBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZgorLy8gICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAorLy8gICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKy8vICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0IGluY2x1ZGUKKy8vICAgIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisvLworLy8gICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisvLworLy8gICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorLy8gICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKy8vCisvLyA0LiBUaGUgbmFtZXMgIlhlcmNlcyIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yCisvLyAgICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IKKy8vICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisvLworLy8gNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsIG5vciBtYXkgIkFwYWNoZSIKKy8vICAgIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCisvLyAgICBGb3VuZGF0aW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLAorLy8gQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorLy8gUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisvLyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy8vIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorLy8gQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKy8vIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gJElkOiBYTUwuamF2YSx2IDEuMiAyMDA1LTA1LTAxIDIyOjQ5OjU1IGNtYXR0bWFubiBFeHAgJAorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CisKKy8qKiBYTUwgc2VydmljZXMuCisgKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzZXZlcmFsIFhNTCBjb252ZW5pZW5jZSBzZXJ2aWNlcyBhbmQgZW5jYXBzdWxhdGVzIHRoZSB1bmRlcmx5aW5nCisgKiBYTUwgaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGl0IHRvIHZhcnkgd2l0aG91dCBpbXBhY3RpbmcgZGV2ZWxvcGVycy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBYTUwgeworCXByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXRTdGFuZGFyZERvY3VtZW50QnVpbGRlcigpIHsKKwkJdHJ5IHsKKwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCWZhY3Rvcnkuc2V0Q29hbGVzY2luZyhmYWxzZSk7CisJCQlmYWN0b3J5LnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZmFsc2UpOworCQkJZmFjdG9yeS5zZXRJZ25vcmluZ0NvbW1lbnRzKGZhbHNlKTsKKwkJCWZhY3Rvcnkuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7CisJCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOworCQkJcmV0dXJuIGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwkvKiogR2V0IHRoZSBET00gaW1wbGVtZW50YXRpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBET00gaW1wbGVtZW50YXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpIHsKKwkJcmV0dXJuIGdldFN0YW5kYXJkRG9jdW1lbnRCdWlsZGVyKCkuZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgRE9NIGRvY3VtZW50LgorCSAqCisJICogQHJldHVybiBBIG5ldyBET00gZG9jdW1lbnQuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKKwkJcmV0dXJuIGdldFN0YW5kYXJkRG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgRE9NIHBhcnNlci4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgRE9NIHBhcnNlciB0aGF0IGhhcyB2YWxpZGF0aW9uIHR1cm5lZCBvbiBhbmQKKwkgKiBpZ25vcmFibGUgd2hpdGVzcGFjZSBub3QgaW5jbHVkZWQsIGFuZCBoYXMgYSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgdGhhdCBwcmludHMKKwkgKiBlcnJvciBtZXNzYWdlcyBhbmQgd2FybmluZ3MgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KKwkgKgorCSAqIEByZXR1cm4gQSBuZXcgRE9NIHBhcnNlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERPTVBhcnNlciBjcmVhdGVET01QYXJzZXIoKSB7CisJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0U3RhbmRhcmREb2N1bWVudEJ1aWxkZXIoKTsKKwkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihFTlRFUlBSSVNFX0VOVElUWV9SRVNPTFZFUik7CisJCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUGFyc2UgZXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUGFyc2Ugd2FybmluZzogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJGYXRhbCBwYXJzZSBlcnJvcjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0pOworCQlyZXR1cm4gbmV3IERPTVBhcnNlcihidWlsZGVyKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgU0FYIHBhcnNlci4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcsIGRlZmF1bHQgU0FYIHBhcnNlci4gIEl0J3Mgc2V0IHVwIHdpdGggYSBkZWZhdWx0CisJICogZXJyb3IgaGFuZGxlciB0aGF0IGp1c3QgcHJpbnRzIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0uCisJICoKKwkgKiBAcmV0dXJuIEEgbmV3IFNBWCBwYXJzZXIuCisJICovCisJcHVibGljIHN0YXRpYyBTQVhQYXJzZXIgY3JlYXRlU0FYUGFyc2VyKCkgeworCQl0cnkgeworCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CisJCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOworCQkJamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIHNheFBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisJCQlzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCkuc2V0RW50aXR5UmVzb2x2ZXIoRU5URVJQUklTRV9FTlRJVFlfUkVTT0xWRVIpOworCQkJc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUGFyc2UgZXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUGFyc2Ugd2FybmluZzogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJGYXRhbCBwYXJzZSBlcnJvcjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJfSk7CisJCQlTQVhQYXJzZXIgcCA9IG5ldyBTQVhQYXJzZXIoc2F4UGFyc2VyKTsKKwkJCXJldHVybiBwOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgU0FYRXhjZXB0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCS8qKiBTZXJpYWxpemUgYW4gWE1MIERPTSBkb2N1bWVudCBpbnRvIGEgU3RyaW5nLgorCSAqCisJICogVGhpcyBtZXRob2QgdGFrZXMgYSBET00gZG9jdW1lbnQgYW5kIHByZXR0eS1wcmludHMgKG9yIHByZXR0eS1zZXJpYWxpemVzLCBpbgorCSAqIFhNTCBwYXJsYW5jZSkgaXQgaW50byBhIHN0cmluZy4KKwkgKgorCSAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50LgorCSAqIEBwYXJhbSBvbWl0WE1MRGVjbGFyYXRpb24gVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCB0aGUgWE1MIGRlY2xhcmF0aW9uLCBmYWxzZSB0byBrZWVwIHRoZSBYTUwgZGVjbGFyYXRpb24uCisJICogQHJldHVybiBUaGUgcHJldHR5LXNlcmlhbGl6ZWQsIHN0cmluZ2lmaWVkLCBkb2N1bWVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoRG9jdW1lbnQgZG9jLCBib29sZWFuIG9taXRYTUxEZWNsYXJhdGlvbikgeworCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQl0cnkgeworCQkJc2VyaWFsaXplKGRvYywgd3JpdGVyLCBvbWl0WE1MRGVjbGFyYXRpb24pOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBjYW50SGFwcGVuKSB7fQorCQlyZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqIFNlcmlhbGl6ZSBhbiBYTUwgRE9NIGRvY3VtZW50IGludG8gYSBTdHJpbmcuCisJICoKKwkgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIERPTSBkb2N1bWVudCBhbmQgcHJldHR5LXByaW50cyAob3IgcHJldHR5LXNlcmlhbGl6ZXMsIGluCisJICogWE1MIHBhcmxhbmNlKSBpdCBpbnRvIGEgc3RyaW5nLgorCSAqCisJICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQuCisJICogQHJldHVybiBUaGUgcHJldHR5LXNlcmlhbGl6ZWQsIHN0cmluZ2lmaWVkLCBkb2N1bWVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoRG9jdW1lbnQgZG9jKSB7CisJCXJldHVybiBzZXJpYWxpemUoZG9jLCAvKm9taXRYTUxEZWNsYXJhdGlvbiovZmFsc2UpOworCX0KKworCS8qKiBTZXJpYWxpemUgYW4gWE1MIERPTSBkb2N1bWVudCBpbnRvIGEgd3JpdGVyLgorCSAqCisJICogVGhpcyBtZXRob2QgdGFrZXMgYSBET00gZG9jdW1lbnQgYW5kIHByZXR0eS1wcmludHMgKG9yIHByZXR0eS1zZXJpYWxpemVzLCBpbgorCSAqIFhNTCBwYXJsYW5jZSkgaXQgaW50byBhIHdyaXRlci4KKwkgKgorCSAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50LgorCSAqIEBwYXJhbSB3cml0ZXIgV2hlcmUgdG8gd3JpdGUgaXQuCisJICogQHBhcmFtIG9taXRYTUxEZWNsYXJhdGlvbiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IHRoZSBYTUwgZGVjbGFyYXRpb24sIGZhbHNlIHRvIGtlZXAgdGhlIFhNTCBkZWNsYXJhdGlvbi4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShEb2N1bWVudCBkb2MsIFdyaXRlciB3cml0ZXIsIGJvb2xlYW4gb21pdFhNTERlY2xhcmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworCQkJCisJCQkvL3VwZGF0ZSAwNS8wMS8yMDA1CisJCQkvL2F1dGhvcjogQ2hyaXMgTWF0dG1hbm4KKwkJCS8vc2V0IHByb3BlcnRpZXMgdG8gcHJldHR5IHByaW50CisJCQkvL2FuZCBhbHNvIHRvIGluY2x1ZGUgdGhlIERPQ1RZUEUgd2hlbiBzZXJpYWxpemluZyB0aGUgWE1MCisJCQkKKwkJCS8vb25seSBzZXQgdGhpcyBpZiBpdCdzIG5vdCBudWxsIGVsc2Ugd2UgZ2V0IGEgbmljZSBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkJaWYoZG9jLmdldERvY3R5cGUoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpeworCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGRvYy5nZXREb2N0eXBlKCkuZ2V0UHVibGljSWQoKSk7CQkJICAgIAorCQkJfQorCisJCQkvL29ubHkgc2V0IHRoaXMgaWYgaXQncyBub3QgbnVsbCBlbHNlIHdlIGdldCBhIG5pY2UgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJCWlmKGRvYy5nZXREb2N0eXBlKCkuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKXsKKwkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBkb2MuZ2V0RG9jdHlwZSgpLmdldFN5c3RlbUlkKCkpOwkJCSAgICAKKwkJCX0KKworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsInllcyIpOworCQkJCisJCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOworCQkJU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsKKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBUcmFuc2Zvcm1lckV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwkvKiogU2VyaWFsaXplIGFuIFhNTCBET00gZG9jdW1lbnQgaW50byBhIHdyaXRlci4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHRha2VzIGEgRE9NIGRvY3VtZW50IGFuZCBwcmV0dHktcHJpbnRzIChvciBwcmV0dHktc2VyaWFsaXplcywgaW4KKwkgKiBYTUwgcGFybGFuY2UpIGl0IGludG8gYSB3cml0ZXIuCisJICoKKwkgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudC4KKwkgKiBAcGFyYW0gd3JpdGVyIFdoZXJlIHRvIHdyaXRlIGl0LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKERvY3VtZW50IGRvYywgV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJc2VyaWFsaXplKGRvYywgd3JpdGVyLCAvKm9taXRYTUxEZWNsYXJhdGlvbiovZmFsc2UpOworCX0KKworCS8qKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIGRvY3VtZW50IGludG8gYSBET00gdHJlZS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dFNvdXJjZSBUaGUgWE1MIGRvY3VtZW50IHRvIHBhcnNlLgorCSAqIEByZXR1cm4gQSBET00gdHJlZSBmb3IgdGhlIGdpdmVuIFhNTCBkb2N1bWVudC4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHBhcnNlIGVycm9yIG9jY3Vycy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlET01QYXJzZXIgcGFyc2VyID0gWE1MLmNyZWF0ZURPTVBhcnNlcigpOworCQlwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UpOworCQlyZXR1cm4gcGFyc2VyLmdldERvY3VtZW50KCk7CisJfQorCisJLyoqIFBhcnNlIHRoZSBnaXZlbiBYTUwgZG9jdW1lbnQgaW50byBhIERPTSB0cmVlLgorCSAqCisJICogQHBhcmFtIHN0cmluZyBUaGUgWE1MIGRvY3VtZW50IHRvIHBhcnNlLgorCSAqIEByZXR1cm4gQSBET00gdHJlZSBmb3IgdGhlIGdpdmVuIFhNTCBkb2N1bWVudC4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHBhcnNlIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBTQVhFeGNlcHRpb24geworCQlEb2N1bWVudCBkb2MgPSBudWxsOworCQl0cnkgeworCQkJRE9NUGFyc2VyIHBhcnNlciA9IFhNTC5jcmVhdGVET01QYXJzZXIoKTsKKwkJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7CisJCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOworCQkJZG9jID0gcGFyc2UoaW5wdXRTb3VyY2UpOworCQkJcmVhZGVyLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGNhbnRIYXBwZW4pIHsKKwkJCWNhbnRIYXBwZW4ucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSS9PIGV4Y2VwdGlvbiAiICsgY2FudEhhcHBlbi5nZXRDbGFzcygpLmdldE5hbWUoKQorCQkJCSsgIiBjYW4gTk9UIGhhdmUgaGFwcGVuZWQsIHlldCBpdCBkaWQhICBNZXNzYWdlOiAiICsgY2FudEhhcHBlbi5nZXRNZXNzYWdlKCkpOworCQl9CisJCXJldHVybiBkb2M7CisJfQorCisJLyoqIFBhcnNlIHRoZSBnaXZlbiBYTUwgZG9jdW1lbnQgaW50byBhIERPTSB0cmVlLgorCSAqCisJICogQHBhcmFtIHJlYWRlciBUaGUgWE1MIGRvY3VtZW50IHRvIHBhcnNlLgorCSAqIEByZXR1cm4gQSBET00gdHJlZSBmb3IgdGhlIGdpdmVuIFhNTCBkb2N1bWVudC4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhIHBhcnNlIGVycm9yIG9jY3Vycy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZShSZWFkZXIgcmVhZGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UocmVhZGVyKSk7CisJfQorCisJLyoqIFBhcnNlIHRoZSBnaXZlbiBYTUwgZG9jdW1lbnQgaW50byBhIERPTSB0cmVlLgorCSAqCisJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBYTUwgZG9jdW1lbnQgdG8gcGFyc2UuCisJICogQHJldHVybiBBIERPTSB0cmVlIGZvciB0aGUgZ2l2ZW4gWE1MIGRvY3VtZW50LgorCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIElmIGEgcGFyc2UgZXJyb3Igb2NjdXJzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZShuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKKwl9CisKKwkvKiogQWRkIGEgcmVwZWF0aW5nIGNoaWxkIGVsZW1lbnQgd2l0aCB0ZXh0IGZyb20gdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIGdpdmVuIG5vZGUuCisJICoKKwkgKiBGb3IgZXhhbXBsZSwgaWYgPHZhcj52YWx1ZXM8L3Zhcj4gaXMgYSB7QGxpbmsgamF2YS51dGlsLkxpc3R9IHdpdGggc3RyaW5ncyBpdGVtcworCSAqICJhIiwgImIiLCBhbmQgImMiLCBhbmQgPHZhcj5uYW1lPC92YXI+IGlzICJ2YWx1ZSIsIHRoZW4gdGhlIFhNTCBkb2N1bWVudCB3aWxsCisJICogaGF2ZQorCSAqIDxwcmU+Jmx0O3ZhbHVlJmd0O2EmbHQ7L3ZhbHVlJmd0OworCSAqICZsdDt2YWx1ZSZndDtiJmx0Oy92YWx1ZSZndDsKKwkgKiAmbHQ7dmFsdWUmZ3Q7YyZsdDsvdmFsdWUmZ3Q7PC9wcmU+CisJICogYXBwZW5kZWQgdG8gPHZhcj5ub2RlPC92YXI+LgorCSAqCisJICogQHBhcmFtIG5vZGUgTm9kZSB0byB3aGljaCB0byBhZGQgY2hpbGQgZWxlbWVudHMuCisJICogQHBhcmFtIG5hbWUgTmFtZSB0byBnaXZlIGVhY2ggY2hpbGQgZWxlbWVudC4KKwkgKiBAcGFyYW0gdmFsdWVzIENvbGxlY3Rpb24gb2YgdmFsdWVzIHRvIGFzc2lnbiB0byBlYWNoIGNoaWxkIGVsZW1lbnQsIGluIGl0ZXJhdG9yIG9yZGVyLgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIGEgRE9NIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIENvbGxlY3Rpb24gdmFsdWVzKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJZm9yIChJdGVyYXRvciBpID0gdmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKwkJCWFkZChub2RlLCBuYW1lLCBpLm5leHQoKSk7CisJfQorCisJLyoqIEFkZCBhIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHlvdXIgRE9NIHRyZWUgc28gdGhhdAorCSAqIDxwcmU+Jmx0O25vZGUmZ3Q7CisJICogICAuLi4KKwkgKiAmbHQ7L25vZGUmZ3Q7PC9wcmU+CisJICogYmVjb21lcworCSAqIDxwcmU+Jmx0O25vZGUmZ3Q7CisJICogICAuLi4KKwkgKiAgICZsdDtuYW1lJmd0O3RleHQmZ3Q7L25hbWUmZ3Q7CisJICogJmx0Oy9ub2RlJmd0OzwvcHJlPgorCSAqCisJICogQWRkaW5nIGEgbnVsbCA8dmFyPm5hbWU8L3Zhcj4gZG9lcyBub3RoaW5nLiAgQWRkaW5nIG51bGwgPHZhcj50ZXh0PC92YXI+CisJICogd29uJ3QgYWRkIHRoZSBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIG5vZGUgTm9kZSB0byB3aGljaCB0byBhZGQgYSBjaGlsZCBlbGVtZW50LgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIDx2YXI+bm9kZTwvdmFyPi4KKwkgKiBAcGFyYW0gdGV4dCBXaGF0IHRleHQgdGhlIHRleHQtbm9kZSBjaGlsZCB0aGUgY2hpbGQgZWxlbWVudCBuYW1lZCA8dmFyPm5hbWU8L3Zhcj4gc2hvdWxkIGhhdmUuICBJZiBudWxsLAorCSAqIG5vdGhpbmcgaGFwcGVucy4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhIERPTSBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZE5vbk51bGwoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHRleHQpIHRocm93cyBET01FeGNlcHRpb24geworCQlpZiAodGV4dCA9PSBudWxsKSByZXR1cm47CisJCWFkZChub2RlLCBuYW1lLCB0ZXh0KTsKKwl9CisKKwkvKiogQWRkIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBnaXZlbiBlbGVtZW50LgorCSAqCisJICogVGhpcyBtZXRob2QgbW9kaWZpZXMgeW91ciBET00gdHJlZSBzbyB0aGF0CisJICogPHByZT4mbHQ7bm9kZSZndDsKKwkgKiAgIC4uLgorCSAqICZsdDsvbm9kZSZndDs8L3ByZT4KKwkgKiBiZWNvbWVzCisJICogPHByZT4mbHQ7bm9kZSZndDsKKwkgKiAgIC4uLgorCSAqICAgJmx0O25hbWUmZ3Q7dGV4dCZndDsvbmFtZSZndDsKKwkgKiAmbHQ7L25vZGUmZ3Q7PC9wcmU+CisJICoKKwkgKiBBZGRpbmcgYSBudWxsIDx2YXI+bmFtZTwvdmFyPiBkb2VzIG5vdGhpbmcuICBBZGRpbmcgbnVsbCA8dmFyPnRleHQ8L3Zhcj4KKwkgKiByZXN1bHRzIGluIGFuIGVtcHR5IDx2YXI+bmFtZTwvdmFyPiB0YWcuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIHdoaWNoIHRvIGFkZCBhIGNoaWxkIGVsZW1lbnQuCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gPHZhcj5ub2RlPC92YXI+LgorCSAqIEBwYXJhbSB0ZXh0IFdoYXQgdGV4dCB0aGUgdGV4dC1ub2RlIGNoaWxkIHRoZSBjaGlsZCBlbGVtZW50IG5hbWVkIDx2YXI+bmFtZTwvdmFyPiBzaG91bGQgaGF2ZS4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhIERPTSBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZChOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCWlmIChuYW1lID09IG51bGwpIHJldHVybjsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgYWRkIHRvIGEgbnVsbCBub2RlIik7CisJCURvY3VtZW50IGRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOworCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChuYW1lKTsKKwkJaWYgKHRleHQgIT0gbnVsbCkgZWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCkpOworCQlub2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOworCX0KKworCS8qKiBBZGQgYSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4KKwkgKiA8dmFyPm9iamVjdDwvdmFyPiB0byB0aGUgZ2l2ZW4gPHZhcj5ub2RlPC92YXI+LgorCSAqCisJICogVGhpcyBtZXRob2QgbW9kaWZpZXMgeW91ciBET00gdHJlZSBzbyB0aGF0CisJICogPHByZT4mbHQ7bm9kZSZndDsKKwkgKiAgIC4uLgorCSAqICZsdDsvbm9kZSZndDs8L3ByZT4KKwkgKiBiZWNvbWVzCisJICogPHByZT4mbHQ7bm9kZSZndDsKKwkgKiAgIC4uLgorCSAqICAgJmx0O25hbWUmZ3Q7c3RyaW5nLXJlcCZndDsvbmFtZSZndDsKKwkgKiAmbHQ7L25vZGUmZ3Q7PC9wcmU+CisJICoKKwkgKiBBZGRpbmcgYSBudWxsIDx2YXI+bmFtZTwvdmFyPiBkb2VzIG5vdGhpbmcuICBBZGRpbmcgbnVsbCA8dmFyPm9iamVjdDwvdmFyPgorCSAqIHJlc3VsdHMgaW4gYW4gZW1wdHkgPHZhcj5uYW1lPC92YXI+IHRhZy4KKwkgKgorCSAqIEBwYXJhbSBub2RlIE5vZGUgdG8gd2hpY2ggdG8gYWRkIGEgY2hpbGQgZWxlbWVudC4KKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjaGlsZCBlbGVtZW50IHRvIGFkZCB0byA8dmFyPm5vZGU8L3Zhcj4uCisJICogQHBhcmFtIG9iamVjdCBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QgdG8gaGF2ZSBhcyB0aGUgdGV4dC1ub2RlCisJICogY2hpbGQgdGhlIGNoaWxkIGVsZW1lbnQgbmFtZWQgPHZhcj5uYW1lPC92YXI+LgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIGEgRE9NIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIE9iamVjdCBvYmplY3QpIHRocm93cyBET01FeGNlcHRpb24geworCQlhZGQobm9kZSwgbmFtZSwgb2JqZWN0ID09IG51bGw/IG51bGwgOiBvYmplY3QudG9TdHJpbmcoKSk7CisJfQorCisJLyoqIEdldCB1bndyYXBwZWQgdGV4dCBmcm9tIHRoZSBnaXZlbiBET00gbm9kZQorCSAqCisJICogVGhpcyBtZXRob2QgdW53cmFwcyBhbnkgd3JhcHBlZCB0ZXh0LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBkb2N1bWVudCBjb250YWlucworCSAqIDxwcmU+Jmx0O25vZGUmZ3Q7SGVsbG8sIHdvcmxkLiAgVGhpcyBpcworCSAqICAgIG15IGZpcnN0IGRvY3VtZW50LgorICAgICAgICAgKiAmbHQ7L25vZGUmZ3Q7PC9wcmU+CisJICogdGhlbiB0aGUgbm9kZSdzIHVud3JhcHBlZCB0ZXh0IGlzCisJICogPHByZT5IZWxsbywgd29ybGQuICBUaGlzIGlzIG15IGZpcnN0IGRvY3VtZW50LjwvcHJlPgorCSAqIHdoaWxlIHRoZSB7QGxpbmsgI3RleHR9IG1ldGhvZCB3b3VsZCByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUKKwkgKiA8cHJlPkhlbGxvLCB3b3JsZC4gIFRoaXMgaXMKKwkgKiAgICBteSBmaXJzdCBkb2N1bWVudC48L3ByZT4KKwkgKgorCSAqIDxwPkluIG90aGVyIHdvcmRzLCBpdCBjb2xsZWN0cyB0aGUgdGV4dCBub2RlcyB1bmRlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgcmVwbGFjZXMKKwkgKiBzdHJpbmdzIG9mIG5ld2xpbmVzIGFuZCBzcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZS4gIFVud3JhcHBpbmcgYSBudWxsIG5vZGUKKwkgKiByZXR1cm5zIGEgbnVsbCBzdHJpbmcuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZS4KKwkgKiBAcmV0dXJuIFRoZSB0ZXh0IGluIGl0cyBjaGlsZHJlbiwgdW53cmFwcGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVud3JhcHBlZFRleHQoTm9kZSBub2RlKSB7CisJCWlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlTdHJpbmdCdWZmZXIgd3JhcHBlZCA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dDEobm9kZSwgYnVmZmVyKSk7CisJCWJvb2xlYW4gbmV3bGluZSA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZWQubGVuZ3RoKCk7ICsraSkgeworCQkJaWYgKG5ld2xpbmUgPT0gZmFsc2UpIHsKKwkJCQlpZiAod3JhcHBlZC5jaGFyQXQoaSkgPT0gJ1xuJykgeworCQkJCQluZXdsaW5lID0gdHJ1ZTsKKwkJCQkJd3JhcHBlZC5zZXRDaGFyQXQoaSwgJyAnKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHdyYXBwZWQuY2hhckF0KGkpKSkgeworCQkJCQl3cmFwcGVkLmRlbGV0ZUNoYXJBdChpKTsKKwkJCQkJLS1pOworCQkJCX0gZWxzZQorCQkJCQluZXdsaW5lID0gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHdyYXBwZWQudG9TdHJpbmcoKS50cmltKCk7CisJfQorCisJLyoqIEdldCB0aGUgdGV4dCBmcm9tIHRoZSBnaXZlbiBET00gbm9kZS4KKwkgKgorCSAqIEdldHRpbmcgdGV4dCBmcm9tIGEgbnVsbCBub2RlIGdpdmVzIHlvdSBhIG51bGwgc3RyaW5nLgorCSAqCisJICogQHBhcmFtIG5vZGUgVGhlIG5vZGUuCisJICogQHJldHVybiBUaGUgdGV4dCBpbiBpdHMgY2hpbGRyZW4uCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdGV4dChOb2RlIG5vZGUpIHsKKwkJLy8gWyByZXR1cm4gdGV4dChub2RlKSBdCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXJldHVybiB0ZXh0MShub2RlLCBidWZmZXIpOworCX0KKworCS8qKiBEdW1wIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIERPTSB0cmVlIHJvb3RlZCBhdCB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgorCSAqCisJICogVGhpcyBvdXRwdXRzIHRoZSB0cmVlIHN0cnVjdHVyZSBpbmNsdWRpbmcgdGhlIHR5cGUgb2YgZWFjaCBub2RlLCBpdHMgbmFtZSwgYW5kCisJICogaXRzIHZhbHVlLiAgTm90ZSB0aGF0IGZvciBtYW55IG5vZGVzLCB0aGUgbmFtZSBpc24ndCB1c2VmdWwgKHRoZSBuYW1lIG9mIHRleHQKKwkgKiBub2RlcywgZm9yIGV4YW1wbGUsIGlzIDxjb2RlPiN0ZXh0PC9jb2RlPiksIGFuZCBmb3IgbWFueSBub2RlcywgdGhlIHZhbHVlIGlzCisJICogbnVsbC4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byB3aGljaCB3cml0ZSB0aGUgdHJlZSBzdHJ1Y3R1cmUuCisJICogQHBhcmFtIG5vZGUgVGhlIHRyZWUgdG8gb3V0cHV0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKFByaW50V3JpdGVyIHdyaXRlciwgTm9kZSBub2RlKSB7CisJCWR1bXAod3JpdGVyLCBub2RlLCAwKTsKKwl9CisKKwkvKiogUmVtb3ZlIGFsbCBjb21tZW50cyBmcm9tIHRoZSBnaXZlbiBkb2N1bWVudCBub2RlJ3Mgc3VidHJlZS4KKwkgKgorCSAqIEBwYXJhbSBub2RlIE5vZGUgZnJvbSB3aGljaCB0byBzZWFyY2ggZm9yIGNvbW1lbnRzIHRvIG51a2UuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNvbW1lbnRzKE5vZGUgbm9kZSkgeworCQlMaXN0IGNvbW1lbnROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZmluZENvbW1lbnROb2Rlcyhjb21tZW50Tm9kZXMsIG5vZGUpOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb21tZW50Tm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlOb2RlIGNvbW1lbnROb2RlID0gKE5vZGUpIGkubmV4dCgpOworCQkJY29tbWVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGNvbW1lbnROb2RlKTsKKwkJfQorCX0KKworCS8qKiBUaGUgcmVzb2x2ZXIgZm9yIGVudGl0aWVzIGZvciB0aGUgSlBMIGVudGVycHJpc2UuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHlSZXNvbHZlciBFTlRFUlBSSVNFX0VOVElUWV9SRVNPTFZFUiA9IG5ldyBFbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIoKTsKKworCS8qKiBBbiBlbXB0eSBYTUwgRE9NIGRvY3VtZW50LiAgVGhpcyBpcyBoYW5keSBmb3Igc29tZSBiYXNpYyBvcGVyYXRpb25zLCBhbmQgZm9yCisJICogZmV0Y2hpbmcgdGhlIERPTSBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIERvY3VtZW50IEVNUFRZX0RPQ1VNRU5UID0gb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5YTUwuY3JlYXRlRG9jdW1lbnQoKTsKKworCS8qKiBJZGVudGlmaWVzIHRoZSBsYXN0IHByaW50YWJsZSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUgcmFuZ2UgdGhhdCBpcyBzdXBwb3J0ZWQKKwkgKiBieSB0aGUgZW5jb2RpbmcgdXNlZCB3aXRoIHRoaXMgc2VyaWFsaXplci4gIEZvciA4LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIGVpdGhlcgorCSAqIDB4N0Ugb3IgMHhGRi4gIEZvciAxNi1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSAweEZGRkYuIENoYXJhY3RlcnMgdGhhdCBhcmUgbm90CisJICogcHJpbnRhYmxlIHdpbGwgYmUgZXNjYXBlZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKwkgKgorCSAqIDxwPlRha2VuIGZyb20gWGVyY2VzIDEuMC4zLiAgQXBhY2hlIGxpY2Vuc2UgYXBwbGllczsgc2VlIHNvdXJjZSBjb2RlIGZvcgorCSAqIGxpY2Vuc2UuCisJICoKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgTEFTVF9QUklOVEFCTEUgPSAweDdFOworCisJLyoqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uCisJICogcHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuICBXaGVyZSB0aGUgZm9ybWF0CisJICogc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eSByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQKKwkgKiAoZS5nLiA8Y29kZT4mYW1wO2x0OzwvY29kZT4pLgorCSAqCisJICogPHA+VGFrZW4gZnJvbSBYZXJjZXMgMS4wLjMuICBBcGFjaGUgbGljZW5zZSBhcHBsaWVzOyBzZWUgc291cmNlIGNvZGUgZm9yCisJICogbGljZW5zZS4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmluZyB0byBlc2NhcGUKKwkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc291cmNlKSB7CisJCVN0cmluZ0J1ZmZlciAgICByZXN1bHQ7CisJCWludCAgICAgICAgICAgICBpOworCQljaGFyICAgICAgICAgICAgY2g7CisJCVN0cmluZyAgICAgICAgICBjaGFyUmVmOworICAgICAgICAKKwkJcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UubGVuZ3RoKCkpOworCQlmb3IgKGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aCgpOyArK2kpIHsKKwkJCWNoID0gc291cmNlLmNoYXJBdChpKTsKKwkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IHByaW50YWJsZSwgcHJpbnQgYXMgY2hhcmFjdGVyCisJCQkvLyByZWZlcmVuY2UuICBOb24gcHJpbnRhYmxlcyBhcmUgYmVsb3cgQVNDSUkgc3BhY2UgYnV0IG5vdCB0YWIgb3IKKwkJCS8vIGxpbmUgdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZQorCQkJLy8gdGhyZXNob2xkLgorCQkJaWYgKChjaCA8ICcgJyAmJiBjaCAhPSAnXHQnICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJ1xyJykgfHwgY2ggPiBMQVNUX1BSSU5UQUJMRSB8fCBjaCA9PSAweEY3KQorCQkJCXJlc3VsdC5hcHBlbmQoIiYjIikuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoY2gpKS5hcHBlbmQoJzsnKTsKKwkJCWVsc2UgeworCQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcworCQkJCS8vIGNoYXJhY3RlciwgcHJpbnQgaXQuIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbnRpdHkKKwkJCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuIFhNTCBhbmQKKwkJCQkvLyBIVE1MLgorCQkJCWNoYXJSZWYgPSBnZXRFbnRpdHlSZWYoY2gpOworCQkJCWlmIChjaGFyUmVmID09IG51bGwpIHJlc3VsdC5hcHBlbmQoY2gpOworCQkJCWVsc2UgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyYnKS5hcHBlbmQoY2hhclJlZikuYXBwZW5kKCc7Jyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKiBGaW5kIGFsbCBjb21tZW50IG5vZGVzIHVuZGVyIHRoZSBnaXZlbiBub2RlIGFuZCBhZGQgdGhlbSB0byB0aGUgZ2l2ZW4gbGlzdC4KKwkgKgorCSAqIEBwYXJhbSBsaXN0IExpc3QgdG8gYWRkIHRvLgorCSAqIEBwYXJhbSBub2RlIE5vZGUgdG8gc2VhcmNoLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgZmluZENvbW1lbnROb2RlcyhMaXN0IGxpc3QsIE5vZGUgbm9kZSkgeworCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKQorCQkJbGlzdC5hZGQobm9kZSk7CisJCWVsc2UgeworCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJCWZpbmRDb21tZW50Tm9kZXMobGlzdCwgY2hpbGRyZW4uaXRlbShpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogR2V0IHRoZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyLgorCSAqCisJICogVGFrZW4gZnJvbSBYZXJjZXMgMS4wLjM7IHNlZSBzb3VyY2UgY29kZSBmb3IgbGljZW5zZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW50aXR5UmVmKGNoYXIgY2gpIHsKKwkJLy8gRW5jb2RlIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKwkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KKwkJc3dpdGNoIChjaCkgeworCQkJY2FzZSAnPCc6ICByZXR1cm4gImx0IjsKKwkJCWNhc2UgJz4nOiAgcmV0dXJuICJndCI7CisJCQljYXNlICciJzogIHJldHVybiAicXVvdCI7CisJCQljYXNlICdcJyc6IHJldHVybiAiYXBvcyI7CisJCQljYXNlICcmJzogIHJldHVybiAiYW1wIjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiogR2V0IHRoZSB0ZXh0IGZyb20gdGhlIGNoaWxkIG5vZGUgdXNpbmcgdGhlIGdpdmVuIGJ1ZmZlci4KKwkgKgorCSAqIEBwYXJhbSBub2RlIFRoZSBub2RlLgorCSAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1c2UuCisJICogQHJldHVybiBUaGUgdGV4dC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGV4dDEoTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWZvciAoTm9kZSBjaCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaCAhPSBudWxsOyBjaCA9IGNoLmdldE5leHRTaWJsaW5nKCkpIHsKKwkJCWlmIChjaC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFIHx8IGNoLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCisJCQkJYnVmZmVyLmFwcGVuZCh0ZXh0KGNoKSk7CisJCQllbHNlIGlmIChjaC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQorCQkJCWJ1ZmZlci5hcHBlbmQoY2guZ2V0Tm9kZVZhbHVlKCkpOworCQl9CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogRHVtcCB0aGUgc3RydWN0dXJlIG9mIHRoZSBET00gdHJlZSByb290ZWQgYXQgdGhlIGdpdmVuIG5vZGUgdG8gdGhlIGdpdmVuIHdyaXRlciwKKwkgKiBpbmRlbnRpbmcgdGhlIGNvbnRlbnRzLgorCSAqCisJICogQHBhcmFtIGluZGVudEFtdCBUaGUgbnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhlIG91dHB1dCBvZiB0aGlzIG5vZGU7CisJICogY2hpbGRyZW4gYXJlIGluZGVudGVkIHR3byBtb3JlIHRoYW4gdGhpcyBhbW91bnQuCisJICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHdoaWNoIHdyaXRlIHRoZSB0cmVlIHN0cnVjdHVyZS4KKwkgKiBAcGFyYW0gbm9kZSBUaGUgdHJlZSB0byBvdXRwdXQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wKFByaW50V3JpdGVyIHdyaXRlciwgTm9kZSBub2RlLCBpbnQgaW5kZW50QW10KSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50QW10OyArK2kpCisJCQl3cml0ZXIucHJpbnQoJyAnKTsKKwkJd3JpdGVyLnByaW50bG4odHlwZU9mKG5vZGUpICsgIigiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIiwgIiArIG5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAiKSIpOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpCisJCQlkdW1wKHdyaXRlciwgY2hpbGRyZW4uaXRlbShpKSwgaW5kZW50QW10ICsgMik7CisJfQorCisJLyoqIFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBub2RlLgorCSAqCisJICogRm9yIGV4YW1wbGUsIGFuIGF0dHJpYnV0ZSBub2RlIHJldHVybnMgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiwgd2hpbGUgYW4gZWxlbWVudAorCSAqIG5vZGUgcmV0dXJucyA8Y29kZT5FbGVtZW50PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBub2RlIFRoZSBub2RlLgorCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIG5vZGUncyB0eXBlLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyB0eXBlT2YoTm9kZSBub2RlKSB7CisJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7CisJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREU6ICAgICAgICAgICAgICByZXR1cm4gIkF0dHJpYnV0ZSI7CisJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOiAgICAgICAgICByZXR1cm4gIkNEQVRBLVNlY3Rpb24iOworCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTogICAgICAgICAgICAgICAgcmV0dXJuICJDb21tZW50IjsKKwkJCWNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAgICAgIHJldHVybiAiRG9jdW1lbnQtRnJhZ21lbnQiOworCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6ICAgICAgICAgICAgICAgcmV0dXJuICJEb2N1bWVudCI7CisJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOiAgICAgICAgICByZXR1cm4gIkRvY3VtZW50LVR5cGUiOworCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTogICAgICAgICAgICAgICAgcmV0dXJuICJFbGVtZW50IjsKKwkJCWNhc2UgTm9kZS5FTlRJVFlfTk9ERTogICAgICAgICAgICAgICAgIHJldHVybiAiRW50aXR5IjsKKwkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU6ICAgICAgIHJldHVybiAiRW50aXR5LVJlZiI7CisJCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERTogICAgICAgICAgICAgICByZXR1cm4gIk5vdGF0aW9uIjsKKwkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IHJldHVybiAiUHJvYy1JbnN0ciI7CisJCQljYXNlIE5vZGUuVEVYVF9OT0RFOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRleHQiOworCQkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duISI7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1hNTFJQQy5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9YTUxSUEMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTE5MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9YTUxSUEMuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworCisvKiogWE1MLVJQQyB1dGlsaXRpZXMuCisgKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzZXZlcmFsIFhNTC1SUEMgdXRpbGl0aWVzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIFhNTFJQQyB7CisJLyoqIEJ1aWxkIGFuIFhNTC1SUEMgbWV0aG9kIGNhbGwuCisJICoKKwkgKiBUaGlzIG1heSB0aHJvdyB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgPHZhcj5wYXJhbXM8L3Zhcj4KKwkgKiBjb250YWlucyBhbiBvYmplY3QgdGhhdCdzIGluY29tcGF0aWJsZSB3aXRoIFhNTC1SUEMuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbC4KKwkgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgY2FsbC4KKwkgKiBAcmV0dXJuIEFuIFhNTCBzdHJpbmcgZW5jYXBzdWxhdGlvbmcgdGhlIGNhbGwuCisJICogQHRocm93cyBET01FeGNlcHRpb24gSWYgd2UgY2FuJ3QgY29uc3RydWN0IHRoZSBjYWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNyZWF0ZU1ldGhvZENhbGwoU3RyaW5nIG5hbWUsIENvbGxlY3Rpb24gcGFyYW1zKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCUVsZW1lbnQgbWV0aG9kQ2FsbEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgibWV0aG9kQ2FsbCIpOworCQlkb2MuYXBwZW5kQ2hpbGQobWV0aG9kQ2FsbEVsZW1lbnQpOworCQlYTUwuYWRkKG1ldGhvZENhbGxFbGVtZW50LCAibWV0aG9kTmFtZSIsIG5hbWUpOworCQlpZiAocGFyYW1zICE9IG51bGwgJiYgIXBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCUVsZW1lbnQgcGFyYW1zRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbXMiKTsKKwkJCW1ldGhvZENhbGxFbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtc0VsZW1lbnQpOworCQkJZm9yIChJdGVyYXRvciBpID0gcGFyYW1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKwkJCQlwYXJhbXNFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZVZhbHVlRWxlbWVudChkb2MsIGkubmV4dCgpKSk7CisJCX0KKwkJcmV0dXJuIFhNTC5zZXJpYWxpemUoZG9jKS5nZXRCeXRlcygpOworCX0KKworCS8qKiBDcmVhdGUgYSAmbHQ7dmFsdWUmZ3Q7IGVsZW1lbnQgZm9yIGFuIFhNTC1SUEMgbWV0aG9kLgorCSAqCisJICogVGhpcyBtYXkgdGhyb3cge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIDx2YXI+dmFsdWU8L3Zhcj4gaXMKKwkgKiBpbmNvbXBhdGlibGUgd2l0aCBYTUwtUlBDLgorCSAqCisJICogQHBhcmFtIGRvYyBPd25pbmcgZG9jdW1lbnQuCisJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiB3ZSBjYW4ndCBjb25zdHJ1Y3QgdGhlICZsdDt2YWx1ZSZndDsuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBjcmVhdGVWYWx1ZUVsZW1lbnQoRG9jdW1lbnQgZG9jLCBPYmplY3QgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24geworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGxzIG5vdCBzdXBwb3J0ZWQgaW4gWE1MLVJQQyIpOworCQlFbGVtZW50IHZhbHVlRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJ2YWx1ZSIpOworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKKwkJCVhNTC5hZGQodmFsdWVFbGVtZW50LCAiaW50IiwgdmFsdWUudG9TdHJpbmcoKSk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisJCQlYTUwuYWRkKHZhbHVlRWxlbWVudCwgImJvb2xlYW4iLCAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKT8gIjEiIDogIjAiKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJRWxlbWVudCBzdHJpbmdFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0cmluZyIpOworCQkJdmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKHN0cmluZ0VsZW1lbnQpOworCQkJc3RyaW5nRWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKHZhbHVlLnRvU3RyaW5nKCkpKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0IHx8IHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7CisJCQlYTUwuYWRkKHZhbHVlRWxlbWVudCwgImRvdWJsZSIsIHZhbHVlLnRvU3RyaW5nKCkpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgeworCQkJWE1MLmFkZCh2YWx1ZUVsZW1lbnQsICJkYXRlVGltZS5pc284NjAxIiwgSVNPODYwMV9GT1JNQVQuZm9ybWF0KChEYXRlKSB2YWx1ZSkpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisJCQlFbGVtZW50IGJhc2U2NEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYmFzZTY0Iik7CisJCQl2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoYmFzZTY0RWxlbWVudCk7CisJCQliYXNlNjRFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24obmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKChieXRlW10pdmFsdWUpKSkpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisJCQlFbGVtZW50IHN0cnVjdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgic3RydWN0Iik7CisJCQl2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc3RydWN0RWxlbWVudCk7CisJCQlNYXAgbWFwID0gKE1hcCkgdmFsdWU7CisJCQlmb3IgKEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlFbGVtZW50IG1lbWJlckVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgibWVtYmVyIik7CisJCQkJdmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKG1lbWJlckVsZW1lbnQpOworCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworCQkJCWlmICghKGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgU3RyaW5nKSkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2V5cyBpbiBtYXBzIGZvciBYTUwtUlBDIHN0cnVjdHMgbXVzdCBiZSBTdHJpbmdzIik7CisJCQkJWE1MLmFkZChtZW1iZXJFbGVtZW50LCAibmFtZSIsIGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpOworCQkJCW1lbWJlckVsZW1lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlVmFsdWVFbGVtZW50KGRvYywgZW50cnkuZ2V0VmFsdWUoKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworCQkJRWxlbWVudCBhcnJheUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYXJyYXkiKTsKKwkJCXZhbHVlRWxlbWVudC5hcHBlbmRDaGlsZChhcnJheUVsZW1lbnQpOworCQkJRWxlbWVudCBkYXRhRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJkYXRhIik7CisJCQlhcnJheUVsZW1lbnQuYXBwZW5kQ2hpbGQoZGF0YUVsZW1lbnQpOworCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHZhbHVlOworCQkJZm9yIChJdGVyYXRvciBpID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCisJCQkJZGF0YUVsZW1lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlVmFsdWVFbGVtZW50KGRvYywgaS5uZXh0KCkpKTsKKwkJfSBlbHNlIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIG5vdCBzdXBwb3J0ZWQgaW4gWE1MLVJQQyIpOworCQlyZXR1cm4gdmFsdWVFbGVtZW50OworCX0KKworCS8qKiBQYXJzZSBhbiBYTUwtUlBDIG1ldGhvZCByZXNwb25zZS4KKwkgKgorCSAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgZGF0YS4KKwkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIDx2YXI+cmVzcG9uc2U8L3Zhcj4uCisJICogQHRocm93cyBYTUxSUENGYXVsdCBJZiB0aGUgPHZhcj5yZXNwb25zZTwvdmFyPiBjb250YWluZWQgYSBmYXVsdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdCBwYXJzZVJlc3BvbnNlKGJ5dGVbXSByZXNwb25zZSkgdGhyb3dzIFhNTFJQQ0ZhdWx0IHsKKwkJdHJ5IHsKKwkJCURPTVBhcnNlciBwYXJzZXIgPSBYTUwuY3JlYXRlRE9NUGFyc2VyKCk7CisJCQlwYXJzZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSk7CisJCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZSkpKTsKKwkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5nZXREb2N1bWVudCgpOworCQkJZG9jLm5vcm1hbGl6ZSgpOworCQkJWE1MLnJlbW92ZUNvbW1lbnRzKGRvYyk7CisJCQlFbGVtZW50IG1ldGhvZFJlc3BvbnNlRWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJCWlmICghIm1ldGhvZFJlc3BvbnNlIi5lcXVhbHMobWV0aG9kUmVzcG9uc2VFbGVtZW50LmdldE5vZGVOYW1lKCkpKQorCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIk5vdCBhIDxtZXRob2RSZXNwb25zZT4gZG9jdW1lbnQiKTsKKwkJCU5vZGUgY2hpbGQgPSBtZXRob2RSZXNwb25zZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOworCQkJaWYgKCJwYXJhbXMiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgeworCQkJCXJldHVybiBwYXJzZVZhbHVlKGNoaWxkLmdldEZpcnN0Q2hpbGQoKS5nZXRGaXJzdENoaWxkKCkpOworCQkJfSBlbHNlIGlmICgiZmF1bHQiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgeworCQkJCXRyeSB7CisJCQkJCU1hcCBtYXAgPSAoTWFwKSBwYXJzZVZhbHVlKGNoaWxkLmdldEZpcnN0Q2hpbGQoKSk7CisJCQkJCXRocm93IG5ldyBYTUxSUENGYXVsdCgoKEludGVnZXIpIG1hcC5nZXQoImZhdWx0Q29kZSIpKS5pbnRWYWx1ZSgpLAorCQkJCQkJKFN0cmluZykgbWFwLmdldCgiZmF1bHRTdHJpbmciKSk7CisJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7CisJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIlhNTC1SUEMgPGZhdWx0PiBpbnZhbGlkIik7CisJCQkJfQorCQkJfSBlbHNlIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIlhNTC1SUEMgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiA8cGFyYW1zPiBvciA8ZmF1bHQ+Iik7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgSS9PIGV4Y2VwdGlvbiB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBkaWQ6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJLyoqIFBhcnNlIGFuIFhNTC1SUEMgJmx0O3ZhbHVlJmd0Oy4KKwkgKgorCSAqIEBwYXJhbSBub2RlIFRoZSAmbHQ7dmFsdWUmZ3Q7IG5vZGUuCisJICogQHJldHVybiBUaGUgSmF2YSB2YWx1ZSBvZiA8dmFyPm5vZGU8L3Zhcj4uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHBhcnNlVmFsdWUoTm9kZSBub2RlKSB7CisJCVN0cmluZyBuID0gbm9kZS5nZXROb2RlTmFtZSgpOworCQlpZiAoISJ2YWx1ZSIuZXF1YWxzKG4pKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHBlY3RpbmcgYSA8dmFsdWU+LCBub3QgYSA8IiArIG4gKyAiPiIpOworCQlOb2RlIHQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKwkJbiA9IHQuZ2V0Tm9kZU5hbWUoKTsKKworCQkvLyBEZWZhdWx0IGlmIHRoZXJlJ3Mgbm8gbmVzdGVkIGVsZW1lbnQgaXMgYSBTdHJpbmcuCisJCWlmICh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgdC5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSB7CisJCQlyZXR1cm4gdC5nZXROb2RlVmFsdWUoKTsKKwkJfQorCisJCS8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgdHlwZSBpcyBmcm9tIHRoZSBuZXN0ZWQgZWxlbWVudC4KKwkJU3RyaW5nIHR4dCA9IFhNTC51bndyYXBwZWRUZXh0KHQpOworCQlpZiAoImk0Ii5lcXVhbHMobikgfHwgImludCIuZXF1YWxzKG4pKSB7CisJCQlyZXR1cm4gbmV3IEludGVnZXIodHh0KTsKKwkJfSBlbHNlIGlmICgiYm9vbGVhbiIuZXF1YWxzKG4pKSB7CisJCQlpZiAoIjEiLmVxdWFscyh0eHQpKSAgICAgIHJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKKwkJCWVsc2UgaWYgKCIwIi5lcXVhbHModHh0KSkgcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKKwkJCWVsc2UgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuICsgIiBkb2VzIG5vdCBjb250YWluIGEgMCBvciAxIik7CisJCX0gZWxzZSBpZiAoInN0cmluZyIuZXF1YWxzKG4pKSB7CisJCQlyZXR1cm4gdHh0OworCQl9IGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhuKSkgeworCQkJcmV0dXJuIG5ldyBEb3VibGUodHh0KTsKKwkJfSBlbHNlIGlmICgiZGF0ZVRpbWUuaXNvODYwMSIuZXF1YWxzKG4pKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBJU084NjAxX0ZPUk1BVC5wYXJzZSh0eHQpOworCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG4gKyAiIGRvZXMgbm90IGNvbnRhaW4gYW4gSVNPODYwMSBmb3JtYXQgZGF0ZS90aW1lIik7CisJCQl9CisJCX0gZWxzZSBpZiAoImJhc2U2NCIuZXF1YWxzKG4pKSB7CisJCQlyZXR1cm4gQmFzZTY0LmRlY29kZSh0eHQuZ2V0Qnl0ZXMoKSk7CisJCX0gZWxzZSBpZiAoInN0cnVjdCIuZXF1YWxzKG4pKSB7CisJCQlNYXAgbSA9IG5ldyBIYXNoTWFwKCk7CisJCQlOb2RlTGlzdCBtZW1iZXJOb2RlcyA9IHQuZ2V0Q2hpbGROb2RlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJOb2Rlcy5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQkJTm9kZSBtZW1iZXJOb2RlID0gbWVtYmVyTm9kZXMuaXRlbShpKTsKKwkJCQlpZiAoISJtZW1iZXIiLmVxdWFscyhtZW1iZXJOb2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG4gKyAiIGNvbnRhaW5zIDwiICsgbWVtYmVyTm9kZS5nZXROb2RlTmFtZSgpCisJCQkJCQkrICI+LCBub3QgPG1lbWJlcj4iKTsKKwkJCQlOb2RlIG5hbWVOb2RlID0gbWVtYmVyTm9kZS5nZXRGaXJzdENoaWxkKCk7CisJCQkJaWYgKG5hbWVOb2RlID09IG51bGwgfHwgISJuYW1lIi5lcXVhbHMobmFtZU5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIjxtZW1iZXI+IG1pc3NpbmcgPG5hbWU+IGVsZW1lbnQiKTsKKwkJCQlOb2RlIHZhbHVlTm9kZSA9IG5hbWVOb2RlLmdldE5leHRTaWJsaW5nKCk7CisJCQkJaWYgKHZhbHVlTm9kZSA9PSBudWxsIHx8ICEidmFsdWUiLmVxdWFscyh2YWx1ZU5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIjxtZW1iZXI+IG1pc3NpbmcgPHZhbHVlPiBlbGVtZW50Iik7CisJCQkJbS5wdXQoWE1MLnVud3JhcHBlZFRleHQobmFtZU5vZGUpLCBwYXJzZVZhbHVlKHZhbHVlTm9kZSkpOworCQkJfQorCQkJcmV0dXJuIG07CisJCX0gZWxzZSBpZiAoImFycmF5Ii5lcXVhbHMobikpIHsKKwkJCU5vZGUgZGF0YU5vZGUgPSB0LmdldEZpcnN0Q2hpbGQoKTsKKwkJCWlmIChkYXRhTm9kZSA9PSBudWxsIHx8ICEiZGF0YSIuZXF1YWxzKGRhdGFOb2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIjxhcnJheT4gbWlzc2luZyA8ZGF0YT4gZWxlbWVudCIpOworCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBkYXRhTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCQlMaXN0IHggPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuLmdldExlbmd0aCgpKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkKKwkJCQl4LmFkZChwYXJzZVZhbHVlKGNoaWxkcmVuLml0ZW0oaSkpKTsKKwkJCXJldHVybiB4OworCQl9IGVsc2UgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB0eXBlICIgKyBuICsgIiBpbiA8dmFsdWU+Iik7CisJfQorCisJLyoqIENvbnN0cnVjdG9yIHRoYXQgY2F1c2VzIGEgcnVudGltZSBleGNlcHRpb24gc2luY2UgdGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MuCisJICovCisJcHJpdmF0ZSBYTUxSUEMoKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRvIG5vdCBjb25zdHJ1Y3QgWE1MUlBDIG9iamVjdHMiKTsKKwl9CisKKwkvKiogSVNPODYwMSBkYXRlIGZvcm1hdCBmb3IgWE1MLVJQQyBkYXRlcy4gKi8KKwlwcml2YXRlIHN0YXRpYyBEYXRlRm9ybWF0IElTTzg2MDFfRk9STUFUID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXlNTWRkJ1QnSEg6bW06c3MiKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvWE1MUlBDRmF1bHQuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvWE1MUlBDRmF1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTU5YjE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9YTUxSUENGYXVsdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFhNTC1SUEMgZmF1bHQuCisgKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBmYXVsdCBpcyByZXR1cm5lZCBmcm9tIGFuIFhNTC1SUEMgY2FsbC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBYTUxSUENGYXVsdCBleHRlbmRzIEV4Y2VwdGlvbiB7CisJLyoqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvZGUgRmF1bHQgY29kZS4KKwkgKiBAcGFyYW0gc3RyaW5nIEZhdWx0IHN0cmluZy4KKwkgKi8KKwlwdWJsaWMgWE1MUlBDRmF1bHQoaW50IGNvZGUsIFN0cmluZyBzdHJpbmcpIHsKKwkJc3VwZXIoY29kZSArICI6ICIgKyBzdHJpbmcpOworCQl0aGlzLmNvZGUgPSBjb2RlOworCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKKwl9CisKKwkvKiogR2V0IHRoZSBmYXVsdCBjb2RlLgorCSAqCisJICogQHJldHVybiBUaGUgZmF1bHQgY29kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldENvZGUoKSB7CisJCXJldHVybiBjb2RlOworCX0KKworCS8qKiBHZXQgdGhlIGZhdWx0IHN0cmluZy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGZhdWx0IHN0cmluZy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKwkJcmV0dXJuIHN0cmluZzsKKwl9CisKKwkvKiogRmF1bHQgY29kZS4gKi8KKwlwcml2YXRlIGludCBjb2RlOworCisJLyoqIEZhdWx0IHN0cmluZy4gKi8KKwlwcml2YXRlIFN0cmluZyBzdHJpbmc7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL3BhY2thZ2UuaHRtbCBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGVmMjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkFwYWNoZSBPT0RUIENvbW1vbiBVdGlsaXRpZXMKKyAgICA8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPlV0aWxpdHkgY2xhc3NlcyBmb3IgQXBhY2hlIE9PRFQuCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy94bWwvRE9NVXRpbC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMveG1sL0RPTVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgwMzIzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMveG1sL0RPTVV0aWwuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWw7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworLyoqCisgKiAKKyAqIDxwPgorICogVGhpcyBjbGFzcyB3YXMgYWRhcHRlZCBmcm9tIGFuIE8nUmVpbGx5IHNpdGUgb24gRE9NIHV0aWxpdGllcy4gSXQgY29udGFpbnMgYQorICogZmV3IGhlbHBlciBtZXRob2RzIHRvIG1ha2UgZXh0cmFjdGluZyBvdXQgWE1MIHRleHQgZnJvbSBET00gcmVwcmVzZW50YXRpb25zIGEKKyAqIGxpdHRsZSBlYXNpZXIuCisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgRE9NVXRpbCB7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBNZXRob2QgcmV0dXJucyB0aGUgRmlyc3Qgb2NjdXJlbmNlIG9mIEVsZW1lbnQgJ25hbWUnIGluIHRoZSBET00gTm9kZQorICAgICAqICdlbGVtZW50Jy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIFRoZSBET00gRWxlbWVudCBub2RlIHRvIHRyYXZlcnNlLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBUaGUgWE1MIG5hbWUgb2YgdGhlIEVsZW1lbnQgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm4gRWxlbWVudCAiZWxlbWVudCIgd2l0aCBOYW1lICJuYW1lIidzIGZpcnN0IG9jY3VyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Rmlyc3RFbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTm9kZUxpc3QgbjEgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpOworCisgICAgICAgIGlmIChuMS5nZXRMZW5ndGgoKSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVsZW1lbnQ6ICIgKyBlbGVtZW50ICsgIiBkb2VzIG5vdCBjb250YWluOiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKEVsZW1lbnQpIG4xLml0ZW0oMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgd2hlbiB5b3UgaGF2ZSBhIERPTSBlbGVtZW50IHdpdGggbm8gb3RoZXIgRE9NCisgICAgICogZWxlbWVudHMgaW5zaWRlIChpLmUuIDxUYWc+PFRhZzI+aGVyZSBpcyB0ZXh0PC9UYWcyPjwvVGFnPikKKyAgICAgKiA8L3A+ICoKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm9kZQorICAgICAqICAgICAgICAgICAgVGhlIERPTSAnU2ltcGxlRWxlbWVudCcgYXMgZGVmaW5lZCBpbiB0aGUgRnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFRleHQgdG8gcmV0cmVpdmUuCisgICAgICogQHJldHVybiB0aGUgVGV4dCBpbmJldHdlZW4gdGhlIHNpbXBsZSBlbGVtZW50IHRhZ3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlRWxlbWVudFRleHQoRWxlbWVudCBub2RlLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFbGVtZW50IG5hbWVkRWxlbWVudCA9IGdldEZpcnN0RWxlbWVudChub2RlLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIGdldFNpbXBsZUVsZW1lbnRUZXh0KG5hbWVkRWxlbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIHlvdSBoYXZlIG1lcmVseSB0ZXh0IGJldHdlZW4gYW4KKyAgICAgKiBYTUwgRWxlbWVudCAoaS5lLiA8VGFnPnRleHQgaGVyZTwvVGFnPikuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBub2RlCisgICAgICogICAgICAgICAgICBUaGUgRE9NIFhNTCBUYWcsIHdpdGggdGV4dCBpbmJldHdlZW4uCisgICAgICogQHJldHVybiBTdHJpbmcgdGV4dCBpbmJldHdlZW4gdGhlIHNpbXBsZSBlbGVtZW50IHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVFbGVtZW50VGV4dChFbGVtZW50IG5vZGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoaWxkLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3htbC9YTUxVdGlscy5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMveG1sL1hNTFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzZWU5ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3htbC9YTUxVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogCisgKiA8cD4KKyAqIEEgVXRpbGl0eSBjbGFzcyBjb250YWluaW5nIG1ldGhvZHMgdG8gd3JpdGUgYW5kIHRyYW5zZm9ybSBYTUwgb2JqZWN0cy4KKyAqIDwvcD4KKyAqLworCitwdWJsaWMgY2xhc3MgWE1MVXRpbHMgeworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKFhNTFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3cml0ZXMgYSBET00gZG9jdW1lbnQgdG8gYSBmaWxlCisgICAgICogPC9wPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZG9jCisgICAgICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50IHRvIHdyaXRlLgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGZpbGVuYW1lIHRvIHdyaXRlIHRoZSBET00gZG9jdW1lbnQgdG8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlWG1sRmlsZShEb2N1bWVudCBkb2MsIFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChmaWxlbmFtZSk7CisgICAgICAgIHRyYW5zZm9ybShkb2MsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlWG1sVG9TdHJlYW0oRG9jdW1lbnQgZG9jLCBPdXRwdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHN0cmVhbSk7CisgICAgICAgIHRyYW5zZm9ybShkb2MsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oRG9jdW1lbnQgZG9jLCBSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBET00gZG9jdW1lbnQgZm9yIHdyaXRpbmcKKyAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBET00gZG9jdW1lbnQgdG8gdGhlIGZpbGUKKyAgICAgICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgIHhmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKyAgICAgICAgICAgIHhmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCByZWFkTWFueShFbGVtZW50IHJvb3QsIFN0cmluZyBlbHQpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRNYW55KHJvb3QsIGVsdCwgIlVURi04Iik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHJlYWRNYW55KEVsZW1lbnQgcm9vdCwgU3RyaW5nIGVsdCwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIE5vZGVMaXN0IHZhbHVlTm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKGVsdCk7CisgICAgICAgIExpc3QgdmFsdWVzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBFbGVtZW50IHZhbEVsZW0gPSAoRWxlbWVudCkgdmFsdWVOb2Rlcy5pdGVtKGkpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5nZXRTaW1wbGVFbGVtZW50VGV4dCh2YWxFbGVtKSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGRlY29kaW5nIHRhZzogWyIgKyBlbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IHZhbDogWyIgKyBET01VdGlsLmdldFNpbXBsZUVsZW1lbnRUZXh0KHZhbEVsZW0pCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIGZyb20gbWV0YWRhdGEuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWQoRWxlbWVudCByb290LCBTdHJpbmcgZWx0KSB7CisgICAgICAgIHJldHVybiByZWFkKHJvb3QsIGVsdCwgIlVURi04Iik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChFbGVtZW50IHJvb3QsIFN0cmluZyBlbHQsIFN0cmluZyBlbmNvZGluZykgeworCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKERPTVV0aWwuZ2V0U2ltcGxlRWxlbWVudFRleHQocm9vdCwgZWx0KSwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZGVjb2RpbmcgIiArIGVsdCArICJmcm9tIG1ldGFkYXRhLiAiCisgICAgICAgICAgICAgICAgICAgICsgIk1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRGaXJzdEVsZW1lbnQoU3RyaW5nIG5hbWUsIEVsZW1lbnQgcm9vdCkgeworICAgICAgICBOb2RlTGlzdCBsaXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKKyAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChFbGVtZW50KSBsaXN0Lml0ZW0oMCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlRWxlbWVudFRleHQoRWxlbWVudCBub2RlLCBib29sZWFuIHRyaW0pIHsKKyAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCkgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAgICAgICBTdHJpbmcgZWxlbVR4dCA9IG51bGw7CisgICAgICAgICAgICBpZiAodHJpbSkgeworICAgICAgICAgICAgICAgIGVsZW1UeHQgPSBub2RlLmdldENoaWxkTm9kZXMoKS5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWxlbVR4dCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCkuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlbGVtVHh0OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZUVsZW1lbnRUZXh0KEVsZW1lbnQgbm9kZSkgeworICAgICAgICByZXR1cm4gZ2V0U2ltcGxlRWxlbWVudFRleHQobm9kZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KFN0cmluZyBlbGVtTmFtZSwgRWxlbWVudCByb290LAorICAgICAgICAgICAgYm9vbGVhbiB0cmltKSB7CisgICAgICAgIEVsZW1lbnQgZWxlbSA9IGdldEZpcnN0RWxlbWVudChlbGVtTmFtZSwgcm9vdCk7CisgICAgICAgIGlmIChlbGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtLCB0cmltKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VGV4dChTdHJpbmcgZWxlbU5hbWUsIEVsZW1lbnQgcm9vdCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFRleHQoZWxlbU5hbWUsIHJvb3QsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50Um9vdChJbnB1dFN0cmVhbSBpcykgeworICAgICAgICAvLyBvcGVuIHVwIHRoZSBYTUwgZmlsZQorICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7CisKKyAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBwYXJzZSB4bWwgc3RyZWFtIgorICAgICAgICAgICAgICAgICAgICArICI6IFJlYXNvbiBpcyBbIiArIGUgKyAiXSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGFkZE5vZGUoRG9jdW1lbnQgZG9jLCBOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRWxlbWVudCBjaGlsZCA9IGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpOworICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOworICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5vZGUoRG9jdW1lbnQgZG9jLCBOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBTdHJpbmcgdGV4dCkgeworICAgICAgICBFbGVtZW50IGNoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSk7CisgICAgICAgIGNoaWxkLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CisgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5vZGUoRG9jdW1lbnQgZG9jLCBOb2RlIHBhcmVudCwgU3RyaW5nIG5zLAorICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyB0ZXh0LCBNYXAgTlNfTUFQKSB7CisgICAgICAgIEVsZW1lbnQgY2hpbGQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKChTdHJpbmcpIE5TX01BUC5nZXQobnMpLCBucyArICI6IgorICAgICAgICAgICAgICAgICsgbmFtZSk7CisgICAgICAgIGNoaWxkLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CisgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEF0dHJpYnV0ZShEb2N1bWVudCBkb2MsIEVsZW1lbnQgbm9kZSwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgQXR0ciBhdHRyaWJ1dGUgPSBkb2MuY3JlYXRlQXR0cmlidXRlKG5hbWUpOworICAgICAgICBhdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpOworICAgICAgICBub2RlLmdldEF0dHJpYnV0ZXMoKS5zZXROYW1lZEl0ZW0oYXR0cmlidXRlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZi9hcHAucHJvcGVydGllcyBiLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZi9hcHAucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFmNTRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL3Jlc291cmNlcy9jb25mL2FwcC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisjIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorIyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisjIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorIyB0aGUgTGljZW5zZS4KK2Zvbz1iYXIKZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZi9lbnRpdGllcy54bWwgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vcmVzb3VyY2VzL2NvbmYvZW50aXRpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDk3OTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vcmVzb3VyY2VzL2NvbmYvZW50aXRpZXMueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgZW50aXRpZXMgWworPCFFTEVNRU5UIGVudGl0aWVzIChwaSwgZmlsZW5hbWUpKj4KKzwhRUxFTUVOVCBwaSAoI1BDREFUQSk+Cis8IUVMRU1FTlQgZmlsZW5hbWUgKCNQQ0RBVEEpPgorXT4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZW50aXRpZXM+CisgIDxwaT4tLy9KUEwvL0RURCBFREEgRGlyZWN0b3J5IE9iamVjdHMgMS4wLy9FTjwvcGk+CisgIDxmaWxlbmFtZT5kaXIuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIEVEQSBFbWFpbCBUeXBlIFF1ZXJ5IDEuMC8vRU48L3BpPgorICA8ZmlsZW5hbWU+ZW1haWxUeXBlUXVlcnkuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIEVEQSBLZXJiZXJvcyBDcmVkZW50aWFsIDEuMC8vRU48L3BpPgorICA8ZmlsZW5hbWU+a2VyYmVyb3NDcmVkZW50aWFsLmR0ZDwvZmlsZW5hbWU+CisgIDxwaT4tLy9KUEwvL0RURCBFREEgTERBUCBDcmVkZW50aWFsIDEuMC8vRU48L3BpPgorICA8ZmlsZW5hbWU+bGRhcENyZWRlbnRpYWwuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIEVEQSBPcmdhbml6YXRpb24gUXVlcnkgMS4wLy9FTjwvcGk+CisgIDxmaWxlbmFtZT5vcmdhbml6YXRpb25RdWVyeS5kdGQ8L2ZpbGVuYW1lPgorICA8cGk+LS8vSlBMLy9EVEQgRURBIFBlcnNvbiBRdWVyeSAxLjAvL0VOPC9waT4KKyAgPGZpbGVuYW1lPnBlcnNvblF1ZXJ5LmR0ZDwvZmlsZW5hbWU+CisgIDxwaT4tLy9KUEwvL0RURCBFREEgUGVyc29uIFR5cGUgUXVlcnkgMS4wLy9FTjwvcGk+CisgIDxmaWxlbmFtZT5wZXJzb25UeXBlUXVlcnkuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIEVEQSBTZXJ2ZXIgU3RhdHVzIDEuMC8vRU48L3BpPgorICA8ZmlsZW5hbWU+c2VydmVyU3RhdHVzLmR0ZDwvZmlsZW5hbWU+CisgIDxwaT4tLy9KUEwvL0RURCBPT0RUIE1ldGFkYXRhIDEuMC8vRU48L3BpPgorICA8ZmlsZW5hbWU+bWV0YWRhdGEuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIE9PRFQgUXVlcnkgMS4wLy9FTjwvcGk+CisgIDxmaWxlbmFtZT5xdWVyeS5kdGQ8L2ZpbGVuYW1lPgorICA8cGk+LS8vSlBMLy9EVEQgUHJvZmlsZSAxLjAvL0VOPC9waT4KKyAgPGZpbGVuYW1lPnByb2YuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIFByb2ZpbGUgMS4xLy9FTjwvcGk+CisgIDxmaWxlbmFtZT5wcm9mLmR0ZDwvZmlsZW5hbWU+CisgIDxwaT4tLy9KUEwvL0RURCBFREEgU2VydmVyIE5ldHdvcmsgMS4wLjAvL0VOPC9waT4KKyAgPGZpbGVuYW1lPm5ldHdvcmsuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIE1ldGFkYXRhIFNjaGVtYSAxLjAuMC8vRU48L3BpPgorICA8ZmlsZW5hbWU+bWV0YWRhdGFTY2hlbWEuZHRkPC9maWxlbmFtZT4KKyAgPHBpPi0vL0pQTC8vRFREIFRFU1QgRU5UUlkgRE8gTk9UIFJFTU9WRS8vRU48L3BpPgorICA8ZmlsZW5hbWU+dGVzdC1lbnRyeS1kby1ub3QtcmVtb3ZlLmR0ZDwvZmlsZW5hbWU+Cis8L2VudGl0aWVzPgpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy9tYWluL3Jlc291cmNlcy9kdGQvQ29uZmlndXJhdGlvbi5kdGQgYi8wLjEwL2NvbW1vbnMvc3JjL21haW4vcmVzb3VyY2VzL2R0ZC9Db25maWd1cmF0aW9uLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGYxOWYzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9tYWluL3Jlc291cmNlcy9kdGQvQ29uZmlndXJhdGlvbi5kdGQKQEAgLTAsMCArMSw5OSBAQAorPCEtLQorRlBJIGlzICItLy9KUEwvL0RURCBFREEgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCisKK2NvbmZpZ3VyYXRpb24uZHRkCisKK0RvY3VtZW50IFR5cGUgZm9yIHRoZSBBcGFjaGUgT2JqZWN0IE9yaWVudGVkIERhdGEgVGVjaG5vbG9neQorY29uZmlndXJhdGlvbiBmaWxlLCB1c2VkIGJ5IHRoZSBjbGFzcyBDb25maWd1cmF0aW9uLgorLS0+CisKKzwhRUxFTUVOVCBjb25maWd1cmF0aW9uICh3ZWJTZXJ2ZXIsIG5hbWVTZXJ2ZXIsIGxkYXBTZXJ2ZXI/LCB4bWw/LCBzZXJ2ZXJNZ3I/LCBwcm9wZXJ0aWVzPywgcHJvZ3JhbXM/KT4KKworPCEtLSBMb2NhdGlvbiBvZiB0aGUgd2ViIHNlcnZlciAtLT4KKzwhRUxFTUVOVCB3ZWJTZXJ2ZXIgKGhvc3QsIHBvcnQsIGRpcj8pPgorCis8IS0tIExvY2F0aW9uIG9mIHRoZSBuYW1lIHNlcnZlciAtLT4KKzwhRUxFTUVOVCBuYW1lU2VydmVyIChpaW9wIHwgcmlyKT4KKworPCEtLSBIb3cgb2Z0ZW4gdG8gc2F2ZSBzdGF0ZTsgdW5zcGVjaWZpZWQgb3IgPD0gMCBtZWFucyBuZXZlciAtLT4KKzwhQVRUTElTVCBuYW1lU2VydmVyIHN0YXRlRnJlcXVlbmN5IENEQVRBICNJTVBMSUVEPgorCis8IS0tIEFuIElJT1AgYWRkcmVzcyAtLT4KKzwhRUxFTUVOVCBpaW9wICh2ZXJzaW9uPywgaG9zdCwgcG9ydD8sIG9iamVjdEtleT8pPgorCis8IS0tIEFuIFJJUiBhZGRyZXNzIC0tPgorPCFFTEVNRU5UIHJpciAob2JqZWN0S2V5Pyk+CisKKzwhLS0gTG9jYXRpb24gb2YgdGhlIExEQVAgc2VydmVyIC0tPgorPCFFTEVNRU5UIGxkYXBTZXJ2ZXIgKGhvc3QsIHBvcnQ/LCBtYW5hZ2VyRE4/LCBwYXNzd29yZD8pPgorCis8IS0tIFhNTCBjb25maWd1cmF0aW9uIC0tPgorPCFFTEVNRU5UIHhtbCAocGFyc2VyPywgZW50aXR5UmVmPyk+CisKKzwhLS0gUHJlZmVycmVkIFhNTCBwYXJzZXIgLS0+Cis8IUVMRU1FTlQgcGFyc2VyICgjUENEQVRBKT4KKworPCEtLSBXaGVyZSB0byByZXNvbHZlIGVudGl0eSByZWZlcmVuY2VzIC0tPgorPCFFTEVNRU5UIGVudGl0eVJlZiAoZGlyKik+CisKKzwhLS0gQSBkaXJlY3Rvcnkgd2hlcmUgYW4gZW50aXR5IHJlZmVyZW5jZSBtaWdodCBiZSByZXNvbHZlZCAtLT4KKzwhRUxFTUVOVCBkaXIgKCNQQ0RBVEEpPgorCis8IS0tIFRoZSBzZXJ2ZXIgbWFuYWdlciAtLT4KKzwhRUxFTUVOVCBzZXJ2ZXJNZ3IgKHBvcnQpPgorCis8IS0tIEEgY29sbGVjdGlvbiBvZiBKYXZhIHByb3BlcnRpZXMgLS0+Cis8IUVMRU1FTlQgcHJvcGVydGllcyAoa2V5LCB2YWx1ZSkqPgorCis8IS0tIEEgc2VyaWVzIG9mIHByb2dyYW1zIHRvIGV4ZWN1dGUgb3IgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgLS0+Cis8IUVMRU1FTlQgcHJvZ3JhbXMgKGV4ZWNTZXJ2ZXIgfCBjbGllbnQpKj4KKworPCEtLSBBIHByb2dyYW0gZXhlY3V0ZWQgYnkgdGhlIEV4ZWNTZXJ2ZXIgY2xhc3MgLS0+Cis8IUVMRU1FTlQgZXhlY1NlcnZlciAoY2xhc3MsIG9iamVjdEtleSwgaG9zdD8sIHByb3BlcnRpZXM/KT4KKworPCEtLSBBIHByb2dyYW0gdGhhdCB5b3UgZXhlY3V0ZSBieSBoYW5kIC0tPgorPCFFTEVNRU5UIGNsaWVudCAoY2xhc3MsIHByb3BlcnRpZXM/KT4KKworPCEtLSBBIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgLS0+Cis8IUVMRU1FTlQgY2xhc3MgKCNQQ0RBVEEpPgorCis8IS0tIEFuIEludGVybmV0IGhvc3QgbmFtZSBvciBkb3R0ZWQgSVAgZGVjaW1hbCBhZGRyZXNzIC0tPgorPCFFTEVNRU5UIGhvc3QgKCNQQ0RBVEEpPgorCis8IS0tIEFuIEludGVybmV0IHBvcnQgbnVtYmVyIC0tPgorPCFFTEVNRU5UIHBvcnQgKCNQQ0RBVEEpPgorCis8IS0tIEFuIEludGVybmV0IG9yIENPUkJBIHByb3RvY29sIG5hbWUgLS0+Cis8IUVMRU1FTlQgcHJvdG9jb2wgKCNQQ0RBVEEpPgorCis8IS0tIEEgQ09SQkEgb2JqZWN0IGtleSAtLT4KKzwhRUxFTUVOVCBvYmplY3RLZXkgKCNQQ0RBVEEpPgorCis8IS0tIEFuIExEQVAgbWFuYWdlcidzIGRpc3Rpbmd1aXNoZWQgbmFtZSAtLT4KKzwhRUxFTUVOVCBtYW5hZ2VyRE4gKCNQQ0RBVEEpPgorCis8IS0tIEEgcGFzc3dvcmQgLS0+Cis8IUVMRU1FTlQgcGFzc3dvcmQgKCNQQ0RBVEEpPgorCis8IS0tIEEgQ09SQkEgb2JqZWN0IHZlcnNpb24gLS0+Cis8IUVMRU1FTlQgdmVyc2lvbiAoI1BDREFUQSk+CisKKzwhLS0gQSBwcm9wZXJ0eSBrZXkgLS0+Cis8IUVMRU1FTlQga2V5ICgjUENEQVRBKT4KKworPCEtLSBBIHByb3BlcnR5IHZhbHVlIC0tPgorPCFFTEVNRU5UIHZhbHVlICgjUENEQVRBKT4KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jb21tb25zLmpwZyBiLzAuMTAvY29tbW9ucy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jb21tb25zLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTYzOTllCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLWNvbW1vbnMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0Fic3RyYWN0VGVzdENhc2UuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0Fic3RyYWN0VGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRkNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Imphc29uQHplbnBsZXguY29tIj5KYXNvbiB2YW4gWnlsPC9hPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0Q2FzZQorICAgIGV4dGVuZHMgVGVzdENhc2UgCit7CisgICAgLyoqIAorICAgICAqIEJhc2VkaXIgZm9yIGFsbCBmaWxlIEkvTy4gSW1wb3J0YW50IHdoZW4gcnVubmluZyB0ZXN0cyBmcm9tCisgICAgICogdGhlIHJlYWN0b3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBiYXNlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIik7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0VGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIodGVzdE5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGVzdCBpbnB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0ZXN0IGlucHV0IGZpbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0RmlsZShTdHJpbmcgcGF0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShiYXNlZGlyLHBhdGgpLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvQXBwVGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvQXBwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZTY1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9BcHBUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHplbnBsZXguY29tIj5KYXNvbiB2YW4gWnlsPC9hPgorICovCitwdWJsaWMgY2xhc3MgQXBwVGVzdCAKKyAgICBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UKK3sKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQorICAgICAqCisgICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAgICAqLworICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQorICAgIHsKKyAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoICJtYXZlbiBraWNrcyBhc3MiLCAibWF2ZW4ga2lja3MgYXNzIiApOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0NvbmZpZ3VyYXRpb25UZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGVlNDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9uczsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworCisvKiogVW5pdCB0ZXN0IHRoZSB7QGxpbmsgQ29uZmlndXJhdGlvbn0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBDb25maWd1cmF0aW9ufSBjbGFzcy4gKi8KKwlwdWJsaWMgQ29uZmlndXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHRlc3QgY29uZmlndXJhdGlvbiBmaWxlLgorCQl0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiY29uZiIsICIueG1sIik7CisJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSk7CisJCWJ5dGVbXSBkb2MgPSBURVNUX0RPQy5nZXRCeXRlcygpOworCQlvdXQud3JpdGUoZG9jLCAwLCBkb2MubGVuZ3RoKTsKKwkJb3V0LmNsb3NlKCk7CisJCW9sZFZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZ3VyYXRpb24uRU5USVRZX0RJUlNfUFJPUCk7CisJCVN5c3RlbS5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOVElUWV9ESVJTX1BST1AsICIvZGlyLzEsL2Rpci8yIik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTnVrZSB0aGUgdGVtcG9yYXJ5IHRlc3QgY29uZmlndXJhdGlvbiBmaWxlLgorCQl0bXBGaWxlLmRlbGV0ZSgpOworCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkKKwkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKENvbmZpZ3VyYXRpb24uRU5USVRZX0RJUlNfUFJPUCk7CisJCWVsc2UKKwkJCVN5c3RlbS5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOVElUWV9ESVJTX1BST1AsIG9sZFZhbHVlKTsKKwl9CisKKwkvKiogVGVzdCB0aGUgdmFyaW91cyBwcm9wZXJ0eSBtZXRob2RzLiAqLworCXB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCUNvbmZpZ3VyYXRpb24gYyA9IG5ldyBDb25maWd1cmF0aW9uKHRtcEZpbGUudG9VUkwoKSk7CisJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCQlwcm9wcy5zZXRQcm9wZXJ0eSgiZ2xvYmFsS2V5MSIsICJwcmVzZXQtdmFsdWUiKTsKKwkJYy5tZXJnZVByb3BlcnRpZXMocHJvcHMpOworCQlhc3NlcnRFcXVhbHMoInByZXNldC12YWx1ZSIsIHByb3BzLmdldFByb3BlcnR5KCJnbG9iYWxLZXkxIikpOworCQlhc3NlcnRFcXVhbHMoImdsb2JhbFZhbHVlMiIsIHByb3BzLmdldFByb3BlcnR5KCJnbG9iYWxLZXkyIikpOworCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0aG9zdC50ZXN0LmRvbWFpbjoxMjM0NSIsIGMuZ2V0V2ViU2VydmVyQmFzZVVSTCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdGhvc3QudGVzdC5kb21haW46MTIzNDUvbnMuaW9yIiwgYy5nZXROYW1lU2VydmVyVVJMKCkpOworCQlhc3NlcnRFcXVhbHMoNDIsIGMuZ2V0TmFtZVNlcnZlclN0YXRlRnJlcXVlbmN5KCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYy5nZXRFbnRpdHlSZWZEaXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjLmdldEVudGl0eVJlZkRpcnMoKS5jb250YWlucygiL2Rpci9vbmUiKSk7CisJCWFzc2VydFRydWUoYy5nZXRFbnRpdHlSZWZEaXJzKCkuY29udGFpbnMoIi9kaXIvdHdvIikpOworCQlhc3NlcnRUcnVlKGMuZ2V0RW50aXR5UmVmRGlycygpLmNvbnRhaW5zKCIvZGlyLzEiKSk7CisJCWFzc2VydFRydWUoYy5nZXRFbnRpdHlSZWZEaXJzKCkuY29udGFpbnMoIi9kaXIvMiIpKTsKKwkJYXNzZXJ0RXF1YWxzKCIvZGlyLzEsL2Rpci8yLC9kaXIvb25lLC9kaXIvdHdvIiwgU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZ3VyYXRpb24uRU5USVRZX0RJUlNfUFJPUCkpOworCQlDb2xsZWN0aW9uIHNlcnZlcnMgPSBjLmdldEV4ZWNTZXJ2ZXJDb25maWdzKCk7CisJCWFzc2VydEVxdWFscygyLCBzZXJ2ZXJzLnNpemUoKSk7CisJCWZvciAoSXRlcmF0b3IgZWFjaCA9IHNlcnZlcnMuaXRlcmF0b3IoKTsgZWFjaC5oYXNOZXh0KCk7KSB7CisJCQlFeGVjU2VydmVyQ29uZmlnIGVzYyA9IChFeGVjU2VydmVyQ29uZmlnKSBlYWNoLm5leHQoKTsKKwkJCWlmIChlc2MuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKCJ0ZXN0LkNsYXNzMSIpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJOYW1lMSIsIGVzYy5nZXRPYmplY3RLZXkoKSk7CisJCQkJYXNzZXJ0RXF1YWxzKDEsIGVzYy5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJCX0gZWxzZSBpZiAoZXNjLmdldENsYXNzTmFtZSgpLmVxdWFscygidGVzdC5DbGFzczIiKSkgeworCQkJCWFzc2VydEVxdWFscygiTmFtZTIiLCBlc2MuZ2V0T2JqZWN0S2V5KCkpOworCQkJCWFzc2VydEVxdWFscygzLCBlc2MuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCQkJZm9yIChJdGVyYXRvciBpID0gZXNjLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKwkJCQkJaWYgKGVudHJ5LmdldEtleSgpLmVxdWFscygibG9jYWxLZXkxIikpCisJCQkJCQlhc3NlcnRFcXVhbHMoImxvY2FsS2V5MiIsIGVudHJ5LmdldFZhbHVlKCkpOworCQkJCQllbHNlIGlmIChlbnRyeS5nZXRLZXkoKS5lcXVhbHMoImdsb2JhbEtleTIiKSkKKwkJCQkJCWFzc2VydEVxdWFscygibG9jYWwtb3ZlcnJpZGUiLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQkJZWxzZSBpZiAoZW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uLnVybCIpKQorCQkJCQkJOyAvLyBUaGlzIG9uZSdzIE9LLgorCQkJCQllbHNlIGZhaWwoIlVua25vd24gbG9jYWwgcHJvcGVydHkgXCIiICsgZW50cnkuZ2V0S2V5KCkgKyAiXCIgaW4gZXhlYyBzZXJ2ZXIiKTsKKwkJCQl9CisJCQl9IGVsc2UgZmFpbCgiVW5rbm93biBFeGVjU2VydmVyQ29uZmlnIFwiIiArIGVzYy5nZXRDbGFzc05hbWUoKSArICJcIiBpbiBzZXJ2ZXJzIGZyb20gQ29uZmlndXJhdGlvbiIpOworCQl9CisJfQorCisJLyoqIFRoZSB0ZW1wb3JhcnkgdGVzdCBjb25maWd1cmF0aW9uIGZpbGUuICovCisJcHJpdmF0ZSBGaWxlIHRtcEZpbGU7CisKKwkvKiogT2xkIHZhbHVlIG9mIHRoZSB7QGxpbmsgQ29uZmlndXJhdGlvbiNFTlRJVFlfRElSU19QUk9QfSBzeXN0ZW0gcHJvcGVydHkuICovCisJcHVibGljIFN0cmluZyBvbGRWYWx1ZTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RPQyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuPCFET0NUWVBFIGNvbmZpZ3VyYXRpb24gUFVCTElDIFwiLS8vSlBMLy9EVEQgRURBIENvbmZpZ3VyYXRpb24gMS4wLy9FTlwiIFwiaHR0cDovL2VudGVycHJpc2UuanBsLm5hc2EuZ292L2R0ZC9jb25maWd1cmF0aW9uLmR0ZFwiPlxuPGNvbmZpZ3VyYXRpb24+PHdlYlNlcnZlcj48aG9zdD50ZXN0aG9zdC50ZXN0LmRvbWFpbjwvaG9zdD48cG9ydD4xMjM0NTwvcG9ydD48L3dlYlNlcnZlcj48bmFtZVNlcnZlciBzdGF0ZUZyZXF1ZW5jeT1cIjQyXCI+PGlpb3A+PHZlcnNpb24+MS4yPC92ZXJzaW9uPjxob3N0PnRlc3Rob3N0LnRlc3QuZG9tYWluPC9ob3N0Pjxwb3J0PjEyMzQ1PC9wb3J0PjxvYmplY3RLZXk+VGVzdFNlcnZpY2U8L29iamVjdEtleT48L2lpb3A+PC9uYW1lU2VydmVyPjx4bWw+PGVudGl0eVJlZj48ZGlyPi9kaXIvb25lPC9kaXI+PGRpcj4vZGlyL3R3bzwvZGlyPjwvZW50aXR5UmVmPjwveG1sPjxwcm9wZXJ0aWVzPjxrZXk+Z2xvYmFsS2V5MTwva2V5Pjx2YWx1ZT5nbG9iYWxWYWx1ZTE8L3ZhbHVlPjxrZXk+Z2xvYmFsS2V5Mjwva2V5Pjx2YWx1ZT5nbG9iYWxWYWx1ZTI8L3ZhbHVlPjwvcHJvcGVydGllcz48cHJvZ3JhbXM+PGV4ZWNTZXJ2ZXI+PGNsYXNzPnRlc3QuQ2xhc3MxPC9jbGFzcz48b2JqZWN0S2V5Pk5hbWUxPC9vYmplY3RLZXk+PC9leGVjU2VydmVyPjxleGVjU2VydmVyPjxjbGFzcz50ZXN0LkNsYXNzMjwvY2xhc3M+PG9iamVjdEtleT5OYW1lMjwvb2JqZWN0S2V5Pjxwcm9wZXJ0aWVzPjxrZXk+bG9jYWxLZXkxPC9rZXk+PHZhbHVlPmxvY2FsS2V5MjwvdmFsdWU+PGtleT5nbG9iYWxLZXkyPC9rZXk+PHZhbHVlPmxvY2FsLW92ZXJyaWRlPC92YWx1ZT48L3Byb3BlcnRpZXM+PC9leGVjU2VydmVyPjwvcHJvZ3JhbXM+PC9jb25maWd1cmF0aW9uPiI7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmVkVGVzdENhc2VUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9Db25maWd1cmVkVGVzdENhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwNjJhMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL0NvbmZpZ3VyZWRUZXN0Q2FzZVRlc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9uczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBVbml0IHRlc3QgdGhlIENvbmZpZ3VyZWRUZXN0Q2FzZSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgQ29uZmlndXJlZFRlc3RDYXNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSBDb25maWd1cmVkVGVzdENhc2VUZXN0IGNsYXNzLgorCSAqCisJICogQHBhcmFtIG5hbWUgQ2FzZSBuYW1lCisJICovCisJcHVibGljIENvbmZpZ3VyZWRUZXN0Q2FzZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNhc2UgYyA9IG5ldyBDYXNlKCk7CisJCXRyeSB7CisgCQkJYy5zZXRVcCgpOworCQkJYXNzZXJ0Tm90TnVsbChDb25maWd1cmF0aW9uLmNvbmZpZ3VyYXRpb24pOworCQl9IGZpbmFsbHkgeworCQkJYy50ZWFyRG93bigpOworCQl9CQkJCisJfQorCisJcHVibGljIHZvaWQgdGVzdEl0QWdhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2FzZSBjID0gbmV3IENhc2UoKTsKKwkJdHJ5IHsKKwkJCWMuc2V0VXAoKTsKKwkJCWFzc2VydE5vdE51bGwoQ29uZmlndXJhdGlvbi5jb25maWd1cmF0aW9uKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWMudGVhckRvd24oKTsKKwkJfQkJCQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIENhc2UgZXh0ZW5kcyBDb25maWd1cmVkVGVzdENhc2UgeworCQlDYXNlKCkgeworCQkJc3VwZXIoInRlc3QiKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQkJc3VwZXIuc2V0VXAoKTsKKwkJfQorCQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQkJc3VwZXIudGVhckRvd24oKTsKKwkJfQorCX0JCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvTXVsdGlTZXJ2ZXJUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9NdWx0aVNlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGIxZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvTXVsdGlTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN0OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogVW5pdCB0ZXN0IHRoZSBNdWx0aVNlcnZlciBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgTXVsdGlTZXJ2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUgTXVsdGlTZXJ2ZXIgY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUKKwkgKi8KKwlwdWJsaWMgTXVsdGlTZXJ2ZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRlc3RDb25maWcgPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi90ZXN0LW11bHRpc2VydmVyLnhtbCIpOworCQlpZiAodGVzdENvbmZpZyA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBmaW5kIGB0ZXN0LW11bHRpc2VydmVyLnhtbCciKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJteS5vdGhlci5zZXR0aW5nIiwgIkRvbid0IG92ZXJyaWRlIik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFBhcnNpbmcoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKKwkJTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UodGVzdENvbmZpZyk7CisJCU11bHRpU2VydmVyLnBhcnNlQ29uZmlnKGlzKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LmFwcCIsIE11bHRpU2VydmVyLmdldEFwcE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyg0LCBNdWx0aVNlcnZlci5nZXRTZXJ2ZXJzKCkuc2l6ZSgpKTsKKworCQlNdWx0aVNlcnZlci5TZXJ2ZXIgc2VydmVyID0gKE11bHRpU2VydmVyLlNlcnZlcikgTXVsdGlTZXJ2ZXIuZ2V0U2VydmVycygpLmdldCgidXJuOmVkYTpybWk6VGVzdDEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5NdWx0aVNlcnZlclRlc3QkU3ZyMSIsIHNlcnZlci5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNdWx0aVNlcnZlci5CSU5ESU5HLCBzZXJ2ZXIuZ2V0QmluZGluZ0JlaGF2aW9yKCkpOworCisJCXNlcnZlciA9IChNdWx0aVNlcnZlci5TZXJ2ZXIpIE11bHRpU2VydmVyLmdldFNlcnZlcnMoKS5nZXQoInVybjplZGE6cm1pOlRlc3QyIik7CisJCWFzc2VydEVxdWFscygib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuTXVsdGlTZXJ2ZXJUZXN0JFN2cjIiLCBzZXJ2ZXIuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTXVsdGlTZXJ2ZXIuTk9OQklORElORywgc2VydmVyLmdldEJpbmRpbmdCZWhhdmlvcigpKTsKKworCQlzZXJ2ZXIgPSAoTXVsdGlTZXJ2ZXIuU2VydmVyKSBNdWx0aVNlcnZlci5nZXRTZXJ2ZXJzKCkuZ2V0KCJ1cm46ZWRhOnJtaTpUZXN0MyIpOworCQlhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLk11bHRpU2VydmVyVGVzdCRTdnIzIiwgc2VydmVyLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE11bHRpU2VydmVyLlJFQklORElORywgc2VydmVyLmdldEJpbmRpbmdCZWhhdmlvcigpKTsKKworCQlNdWx0aVNlcnZlci5BdXRvYmluZGluZ1NlcnZlciBzID0gKE11bHRpU2VydmVyLkF1dG9iaW5kaW5nU2VydmVyKSBNdWx0aVNlcnZlci5nZXRTZXJ2ZXJzKCkuZ2V0KCJ1cm46ZWRhOnJtaTpUZXN0NCIpOworCQlhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLk11bHRpU2VydmVyVGVzdCRTdnI0Iiwgcy5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNdWx0aVNlcnZlci5BVVRPLCBzLmdldEJpbmRpbmdCZWhhdmlvcigpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAwMEwsIHMuZ2V0UGVyaW9kKCkpOworCisJCWFzc2VydEVxdWFscygiTXkgVmFsdWUiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm15LnNldHRpbmciKSk7CisJCWFzc2VydEVxdWFscygiRG9uJ3Qgb3ZlcnJpZGUiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm15Lm90aGVyLnNldHRpbmciKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKHRlc3RDb25maWcgIT0gbnVsbCkgdHJ5IHsKKwkJCXRlc3RDb25maWcuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgibXkuc2V0dGluZyIpOworCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgibXkub3RoZXIuc2V0dGluZyIpOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKworCXByaXZhdGUgSW5wdXRTdHJlYW0gdGVzdENvbmZpZzsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3ZyMSBleHRlbmRzIFJlbW90ZU9iamVjdCB7CisJCXB1YmxpYyBTdnIxKEV4ZWNTZXJ2ZXIgZSkge30KKwl9CisJcHVibGljIHN0YXRpYyBjbGFzcyBTdnIyIGV4dGVuZHMgUmVtb3RlT2JqZWN0IHsKKwkJcHVibGljIFN2cjIoRXhlY1NlcnZlciBlKSB7fQorCX0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN2cjMgZXh0ZW5kcyBSZW1vdGVPYmplY3QgeworCQlwdWJsaWMgU3ZyMyhFeGVjU2VydmVyIGUpIHt9CisJfQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3ZyNCBleHRlbmRzIFJlbW90ZU9iamVjdCB7CisJCXB1YmxpYyBTdnI0KEV4ZWNTZXJ2ZXIgZSkge30KKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9OYXVnaHR5VGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvTmF1Z2h0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI1YjdlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvTmF1Z2h0eVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9uczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkB6ZW5wbGV4LmNvbSI+SmFzb24gdmFuIFp5bDwvYT4KKyAqLworcHVibGljIGNsYXNzIE5hdWdodHlUZXN0CisgICAgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlCit7CisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTmF1Z2h0eVRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCisgICAgeworICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIE5hdWdodHlUZXN0LmNsYXNzICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCisgICAgeworICAgICAgICAvLyBDcmFzaCBhbmQgYnVybiEKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9BY3Rpdml0eVN0b3BwZWRUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9BY3Rpdml0eVN0b3BwZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTc1ZjA1NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5U3RvcHBlZFRlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCisvKioNCisgKiBUZXN0IHRoZSA8Y29kZT5BY3Rpdml0eVN0b3BwZWQ8L2NvZGU+IGNsYXNzLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisgKi8NCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlTdG9wcGVkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEFjdGl2aXR5U3RvcHBlZFRlc3R9IGluc3RhbmNlLg0KKwkgKg0KKwkgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUuDQorCSAqLw0KKwlwdWJsaWMgQWN0aXZpdHlTdG9wcGVkVGVzdChTdHJpbmcgbmFtZSkgew0KKwkJc3VwZXIobmFtZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRlc3QgYmFzaWMgPGNvZGU+QWN0aXZpdHlTdG9wcGVkPC9jb2RlPiBtZXRob2RzLg0KKwkgKi8NCisJcHVibGljIHZvaWQgdGVzdEFjdGl2aXR5U3RvcHBlZCgpIHsNCisJCUFjdGl2aXR5U3RvcHBlZCBhID0gbmV3IEFjdGl2aXR5U3RvcHBlZCgpOw0KKwkJdHJ5IHsNCisJCQlUaHJlYWQuc2xlZXAoMTAwKTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkge30NCisJCUFjdGl2aXR5U3RvcHBlZCBiID0gbmV3IEFjdGl2aXR5U3RvcHBlZCgpOw0KKwkJYXNzZXJ0VHJ1ZSghYS5lcXVhbHMoYikpOw0KKwkJYXNzZXJ0VHJ1ZSghYi5lcXVhbHMoYSkpOw0KKwkJYXNzZXJ0VHJ1ZShhLmdldFRpbWUoKS5jb21wYXJlVG8oYi5nZXRUaW1lKCkpIDwgMCk7DQorCQkvLyBSZWFsbHkgbm90IG11Y2ggZWxzZSB3ZSBjYW4gdGVzdC4uLg0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5VGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGU0Mzc3MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0FjdGl2aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eTsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KKy8qKg0KKyAqIFRlc3QgdGhlIHtAbGluayBBY3Rpdml0eX0gY2xhc3MuDQorICoNCisgKiBAYXV0aG9yIEtlbGx5DQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBY3Rpdml0eVRlc3R9IGluc3RhbmNlLg0KKwkgKg0KKwkgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUuDQorCSAqLw0KKwlwdWJsaWMgQWN0aXZpdHlUZXN0KFN0cmluZyBuYW1lKSB7DQorCQlzdXBlcihuYW1lKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGVzdCBiYXNpYyBBY3Rpdml0eSBtZXRob2RzLg0KKwkgKi8NCisJcHVibGljIHZvaWQgdGVzdEFjdGl2aXRpZXMoKSB7DQorCQlUZXN0QWN0aXZpdHkgdGEgPSBuZXcgVGVzdEFjdGl2aXR5KCk7CQkJCSAgICAgICAvLyBDcmVhdGUgdGVzdCBhY3Rpdml0eQ0KKwkJYXNzZXJ0VHJ1ZSghIm5ldy1pZCIuZXF1YWxzKHRhLmdldElEKCkpKTsJCQkgICAgICAgLy8gSXQgc2hvdWxkIGdlbmVyYXRlIGEgdW5pcXVlIElEDQorCQl0YS5zZXRJRCgibmV3LWlkIik7CQkJCQkJICAgICAgIC8vIENoYW5nZSBpdHMgSUQNCisJCWFzc2VydEVxdWFscygibmV3LWlkIiwgdGEuZ2V0SUQoKSk7CQkJCSAgICAgICAvLyBNYWtlIHN1cmUgaXQgZ290IHRoZSBjaGFuZ2UNCisJCUluY2lkZW50IGkgPSBuZXcgSW5jaWRlbnQoKTsJCQkJCSAgICAgICAvLyBOb3cgY3JlYXRlIGFuIGluY2lkZW50IGFuZC4uLg0KKwkJdGEubG9nKGkpOwkJCQkJCQkgICAgICAgLy8gLi4ubG9nIGl0IHdpdGggdGhlIGFjdGl2aXR5DQorCQlhc3NlcnRFcXVhbHMoaW5jaWRlbnQsIGkpOwkJCQkJICAgICAgIC8vIFNlZSBpZiBpdCByZWNvcmRlZCB0aGUgaW5jaWRlbnQNCisJCXRhLnN0b3AoKTsJCQkJCQkJICAgICAgIC8vIE5vdyBzdG9wIHRoZSBhY3Rpdml0eQ0KKwkJYXNzZXJ0RXF1YWxzKEFjdGl2aXR5U3RvcHBlZC5jbGFzcywgaW5jaWRlbnQuZ2V0Q2xhc3MoKSk7CSAgICAgICAvLyBBbmQgc2VlIGlmIGl0IHJlY29yZGVkIGEgInN0b3AiIGluY2lkZW50DQorCX0NCisNCisJLyoqIExhc3QgcmVjZWl2ZWQgaW5jaWRlbnQgZnJvbSB0aGUgdGVzdCBhY3Rpdml0eS4gKi8NCisJcHJpdmF0ZSBJbmNpZGVudCBpbmNpZGVudDsNCisJDQorCS8qKg0KKwkgKiBUZXN0aW5nIGFjdGl2aXR5IHRoYXQgcmVjb3JkcyBpbmNpZGVudHMgdG8gdGhlIHRlc3QgY2FzZS4NCisJICovDQorCXByaXZhdGUgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgew0KKwkJLyoqDQorCQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0QWN0aXZpdHl9IGluc3RhbmNlLg0KKwkJICovDQorCQlwdWJsaWMgVGVzdEFjdGl2aXR5KCkgew0KKwkJCXN1cGVyKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIFJlY29yZCB0aGUgbGFzdCBpbmNpZGVudCB0byB0aGUgdGVzdCBjYXNlLg0KKwkJICoNCisJCSAqIEBwYXJhbSBpbmNpZGVudCBhbiB7QGxpbmsgSW5jaWRlbnR9IHZhbHVlLg0KKwkJICovDQorCQlwcm90ZWN0ZWQgdm9pZCByZWNvcmRJbmNpZGVudChJbmNpZGVudCBpbmNpZGVudCkgew0KKwkJCUFjdGl2aXR5VGVzdC50aGlzLmluY2lkZW50ID0gaW5jaWRlbnQ7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlUcmFja2VyVGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQWN0aXZpdHlUcmFja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwNjcyYjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9BY3Rpdml0eVRyYWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eTsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KKy8qKg0KKyAqIFRlc3QgdGhlIHtAbGluayBBY3Rpdml0eVRyYWNrZXJ9IGNsYXNzLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisgKi8NCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlUcmFja2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEFjdGl2aXR5VHJhY2tlclRlc3R9IGluc3RhbmNlLg0KKwkgKg0KKwkgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUuDQorCSAqLw0KKwlwdWJsaWMgQWN0aXZpdHlUcmFja2VyVGVzdChTdHJpbmcgbmFtZSkgew0KKwkJc3VwZXIobmFtZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFNhdmUgb2xkIHZhbHVlcyBvZiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuZmFjdG9yaWVzPC9jb2RlPiBhbmQNCisJICogPGNvZGU+YWN0aXZpdHkuZmFjdG9yaWVzPC9jb2RlPiBwcm9wZXJ0aWVzLg0KKwkgKg0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KKwkJc3VwZXIuc2V0VXAoKTsNCisJCWxvbmdOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5mYWN0b3JpZXMiKTsNCisJCXNob3J0TmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYWN0aXZpdHkuZmFjdG9yaWVzIik7DQorCX0NCisNCisJLyoqDQorCSAqIFRlc3QgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFjdGl2aXR5IHRyYWNrZXIuDQorCSAqDQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4NCisJICovDQorCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KKwkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LmZhY3RvcmllcyIpOyAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGxvbmcgcHJvcGVydHkNCisJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJhY3Rpdml0eS5mYWN0b3JpZXMiKTsJCSAgICAgICAvLyBBbmQgdGhlIHNob3J0IG9uZQ0KKwkJQWN0aXZpdHlUcmFja2VyLmluaXRpYWxpemVGYWN0b3JpZXMoKTsJCQkJICAgICAgIC8vIEFuZCBpbml0YWxpemUNCisJCUFjdGl2aXR5IGFjdGl2aXR5ID0gQWN0aXZpdHlUcmFja2VyLmNyZWF0ZUFjdGl2aXR5KCk7CQkgICAgICAgLy8gSGF2ZSBpdCBtYWtlIGFuIGFjdGl2aXR5DQorCQlhc3NlcnRUcnVlKGFjdGl2aXR5IGluc3RhbmNlb2YgTnVsbEFjdGl2aXR5KTsJCQkgICAgICAgLy8gV2l0aCBuZWl0aGVyIHNldCwgaXQgbXVzdCBiZSBOdWxsQWN0aXZpdHkNCisNCisJCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuZmFjdG9yaWVzIiwJCSAgICAgICAvLyBOb3cgc2V0IHRoZSBsb25nIG5hbWUNCisJCQkib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuQWN0aXZpdHlUcmFja2VyVGVzdCRUZXN0RmFjdG9yeSIpOwkgICAgICAgLy8gdG8gcG9pbnQgdG8gb3VyIHRlc3QgZmFjdG9yeQ0KKwkJU3lzdGVtLnNldFByb3BlcnR5KCJhY3Rpdml0eS5mYWN0b3JpZXMiLCAibm9uLWV4aXN0ZW50LWNsYXNzIik7CSAgICAgICAvLyBBbmQgc2V0IHRoZSBzaG9ydCBuYW1lIHRvIG5vbnNlbnNlDQorCQlBY3Rpdml0eVRyYWNrZXIuaW5pdGlhbGl6ZUZhY3RvcmllcygpOwkJCQkgICAgICAgLy8gQW5kIGluaXRpYWxpemUNCisJCWFjdGl2aXR5ID0gQWN0aXZpdHlUcmFja2VyLmNyZWF0ZUFjdGl2aXR5KCk7CQkJICAgICAgIC8vIEhhdmUgaXQgbWFrZSBhbiBhY3Rpdml0eQ0KKwkJYXNzZXJ0VHJ1ZShhY3Rpdml0eSBpbnN0YW5jZW9mIFRlc3RBY3Rpdml0eSk7CQkJICAgICAgIC8vIFdpdGgganVzdCBvbmUsIGl0IG11c3QgYmUgb3VyIFRlc3RBY3Rpdml0eQ0KKw0KKwkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LmZhY3RvcmllcyIpOyAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGxvbmcgc28gaXQgbXVzdCBsb29rIGF0IHNob3J0DQorCQlTeXN0ZW0uc2V0UHJvcGVydHkoImFjdGl2aXR5LmZhY3RvcmllcyIsCQkJICAgICAgIC8vIEFuZCBzZXQgdGhlIHNob3J0IG5hbWUgdG8uLi4NCisJCQkib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuQWN0aXZpdHlUcmFja2VyVGVzdCRUZXN0RmFjdG9yeSIJICAgICAgIC8vIC4uLm5vdCBvbmUsIGJ1dC4uLg0KKwkJCSsgIixvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5BY3Rpdml0eVRyYWNrZXJUZXN0JFRlc3RGYWN0b3J5Iik7CSAgICAgICAvLyAuLi50d28gZmFjdG9yaWVzDQorCQlBY3Rpdml0eVRyYWNrZXIuaW5pdGlhbGl6ZUZhY3RvcmllcygpOwkJCQkgICAgICAgLy8gQW5kIGluaXRpYWxpemUNCisJCWFjdGl2aXR5ID0gQWN0aXZpdHlUcmFja2VyLmNyZWF0ZUFjdGl2aXR5KCk7CQkJICAgICAgIC8vIE5vdyBjcmVhdGUgYW4gYWN0aXZpdHkNCisJCWFzc2VydFRydWUoYWN0aXZpdHkgaW5zdGFuY2VvZiBDb21wb3NpdGVBY3Rpdml0eSk7CQkgICAgICAgLy8gV2l0aCA+IDEsIGl0IG11c3QgYmUgYSBDb21wb3NpdGVBY3Rpdml0eQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXN0b3JlIG9sZCB2YWx1ZXMgb2YgdGhlIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LmZhY3RvcmllczwvY29kZT4gYW5kDQorCSAqIDxjb2RlPmFjdGl2aXR5LmZhY3RvcmllczwvY29kZT4gcHJvcGVydGllcy4NCisJICoNCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLg0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisJCWlmIChsb25nTmFtZSA9PSBudWxsKQ0KKwkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5mYWN0b3JpZXMiKTsNCisJCWVsc2UNCisJCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LmZhY3RvcmllcyIsIGxvbmdOYW1lKTsNCisJCWlmIChzaG9ydE5hbWUgPT0gbnVsbCkNCisJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgiYWN0aXZpdHkuZmFjdG9yaWVzIik7DQorCQllbHNlDQorCQkJU3lzdGVtLnNldFByb3BlcnR5KCJhY3Rpdml0eS5mYWN0b3JpZXMiLCBzaG9ydE5hbWUpOw0KKwkJc3VwZXIudGVhckRvd24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogQSB0ZXN0IGFjdGl2aXR5IHRoYXQgZG9lcyBub3RoaW5nLg0KKwkgKi8NCisJc3RhdGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsNCisJCXByb3RlY3RlZCB2b2lkIHJlY29yZEluY2lkZW50KEluY2lkZW50IGluY2lkZW50KSB7fQ0KKwl9DQorDQorCS8qKg0KKwkgKiBBIHRlc3QgYWN0aXZpdHkgZmFjdG9yeSB0aGF0IGdlbmVyYXRlcyB0ZXN0IGFjdGl2aXRpZXMuDQorCSAqLw0KKwlzdGF0aWMgY2xhc3MgVGVzdEZhY3RvcnkgaW1wbGVtZW50cyBBY3Rpdml0eUZhY3Rvcnkgew0KKwkJcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgew0KKwkJCXJldHVybiBuZXcgVGVzdEFjdGl2aXR5KCk7DQorCQl9DQorCX0NCisNCisJLyoqIE9sZCB2YWx1ZSBvZiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuZmFjdG9yaWVzPC9jb2RlPiBwcm9wZXJ0eS4gKi8NCisJcHJpdmF0ZSBTdHJpbmcgbG9uZ05hbWU7DQorDQorCS8qKiBPbGQgdmFsdWUgb2YgdGhlIDxjb2RlPmFjdGl2aXR5LmZhY3RvcmllczwvY29kZT4gcHJvcGVydHkuICovDQorCXByaXZhdGUgU3RyaW5nIHNob3J0TmFtZTsNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQ29tcG9zaXRlQWN0aXZpdHlUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9Db21wb3NpdGVBY3Rpdml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NDQ0ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvQ29tcG9zaXRlQWN0aXZpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCisvKioNCisgKiBUZXN0IHRoZSB7QGxpbmsgQ29tcG9zaXRlQWN0aXZpdHl9IGNsYXNzLg0KKyAqDQorICogQGF1dGhvciBLZWxseQ0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlQWN0aXZpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29tcG9zaXRlQWN0aXZpdHlUZXN0fSBpbnN0YW5jZS4NCisJICoNCisJICogQHBhcmFtIG5hbWUgQ2FzZSBuYW1lLg0KKwkgKi8NCisJcHVibGljIENvbXBvc2l0ZUFjdGl2aXR5VGVzdChTdHJpbmcgbmFtZSkgew0KKwkJc3VwZXIobmFtZSk7DQorCX0NCisNCisJcHVibGljIHZvaWQgdGVzdEl0KCkgew0KKwkJdHJ5IHsNCisJCQluZXcgQ29tcG9zaXRlQWN0aXZpdHkobnVsbCk7DQorCQkJZmFpbCgiQ2FuIGNvbnRydWN0IENvbXBvc2l0ZUFjdGl2aXR5IHdpdGggbnVsbCBjb2xsZWN0aW9uIik7DQorCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZ29vZCkge30NCisJCXRyeSB7DQorCQkJbmV3IENvbXBvc2l0ZUFjdGl2aXR5KENvbGxlY3Rpb25zLnNpbmdsZXRvbigiaGVsbG8iKSk7DQorCQkJZmFpbCgiQ2FuIGNvbnN0cnVjdCBDb21wb3NpdGVBY3Rpdml0eSB3aXRoIG5vbi1BY3Rpdml0eSBpbiBjb2xsZWN0aW9uIik7DQorCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZ29vZCkge30NCisJCUNvbXBvc2l0ZUFjdGl2aXR5IGNhID0gbmV3IENvbXBvc2l0ZUFjdGl2aXR5KENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgVGVzdEFjdGl2aXR5KCkpKTsNCisJCUluY2lkZW50IGkgPSBuZXcgSW5jaWRlbnQoKTsNCisJCWNhLmxvZyhpKTsNCisJCWFzc2VydEVxdWFscyhpLCBpbmNpZGVudCk7DQorCX0NCisNCisJLyoqIExhc3QgcmVjZWl2ZWQgaW5jaWRlbnQuICovDQorCXByaXZhdGUgSW5jaWRlbnQgaW5jaWRlbnQ7DQorDQorCS8qKg0KKwkgKiBUZXN0IGFjdGl2aXR5IHRoYXQgcmVjb3JkcyBsYXN0IGluY2lkZW50cyByZWNlaXZlZCBpbnRvIHRoZSB0ZXN0IGNhc2UuDQorCSAqLw0KKwlwcml2YXRlIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsNCisJCXByb3RlY3RlZCB2b2lkIHJlY29yZEluY2lkZW50KEluY2lkZW50IGkpIHsNCisJCQlpbmNpZGVudCA9IGk7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5VGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0OWM5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQ7CitpbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHRoZSB7QGxpbmsgRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5fSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeVRlc3R9IGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIG5hbWUgQ2FzZSBuYW1lLgorCSAqLworCXB1YmxpYyBEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnlUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCW9sZExvbmdIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkuaG9zdCIpOworCQlvbGRTaG9ydEhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImFjdGl2aXR5Lmhvc3QiKTsKKwkJb2xkTG9uZ1BvcnQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkRhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5wb3J0Iik7CisJCW9sZFNob3J0UG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYWN0aXZpdHkucG9ydCIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc3RvcmUoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkRhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5ob3N0Iiwgb2xkTG9uZ0hvc3QpOworCQlyZXN0b3JlKCJhY3Rpdml0eS5ob3N0Iiwgb2xkU2hvcnRIb3N0KTsKKwkJcmVzdG9yZSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5LnBvcnQiLCBvbGRMb25nUG9ydCk7CisJCXJlc3RvcmUoImFjdGl2aXR5LnBvcnQiLCBvbGRTaG9ydFBvcnQpOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKworCS8qKgorCSAqIFRlc3QgdXNlIG9mIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KKwkgKgorCSAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlQcmlvcml0eSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24geworCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5Lmhvc3QiKTsKKwkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkRhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5wb3J0Iik7CisJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJhY3Rpdml0eS5ob3N0Iik7CisJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJhY3Rpdml0eS5wb3J0Iik7CisJCXRyeSB7CisJCQluZXcgRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5KCk7CisJCQlmYWlsKCJDYW4gbWFrZSBhIERhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeSB3aXRob3V0IGhvc3QgcHJvcGVydHkgc2V0Iik7CisJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkge30KKworCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkRhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeS5ob3N0IiwgImxvY2FsaG9zdCIpOworCQlTeXN0ZW0uc2V0UHJvcGVydHkoImFjdGl2aXR5Lmhvc3QiLCAibm9uLWV4aXN0ZW50LWhvc3QiKTsKKwkJRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5IGZhYyA9IG5ldyBEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkoKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5hcGFjaGUub29kdC5jb21tb25zLm5ldC5OZXQuZ2V0TG9vcGJhY2tBZGRyZXNzKCksIGZhYy5ob3N0KTsKKwkJYXNzZXJ0RXF1YWxzKDQ1NTYsIGZhYy5wb3J0KTsKKwkJZmFjLnNvY2tldC5jbG9zZSgpOworCisJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkuaG9zdCIpOworCQlTeXN0ZW0uc2V0UHJvcGVydHkoImFjdGl2aXR5Lmhvc3QiLCAibG9jYWxob3N0Iik7CisJCWZhYyA9IG5ldyBEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkoKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5hcGFjaGUub29kdC5jb21tb25zLm5ldC5OZXQuZ2V0TG9vcGJhY2tBZGRyZXNzKCksIGZhYy5ob3N0KTsKKwkJYXNzZXJ0RXF1YWxzKDQ1NTYsIGZhYy5wb3J0KTsKKwkJZmFjLnNvY2tldC5jbG9zZSgpOworCisJCURhdGFncmFtU29ja2V0IHNvYyA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOworCQlpbnQgcG9ydE51bSA9IHNvYy5nZXRMb2NhbFBvcnQoKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkucG9ydCIsIFN0cmluZy52YWx1ZU9mKHBvcnROdW0pKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJhY3Rpdml0eS5wb3J0IiwgImlsbGVnYWwtcG9ydC12YWx1ZSIpOworCQlmYWMgPSBuZXcgRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5KCk7CisJCWFzc2VydEVxdWFscyhwb3J0TnVtLCBmYWMucG9ydCk7CisJCWZhYy5zb2NrZXQuY2xvc2UoKTsKKworCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5LnBvcnQiKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJhY3Rpdml0eS5wb3J0IiwgU3RyaW5nLnZhbHVlT2YocG9ydE51bSkpOworCQlmYWMgPSBuZXcgRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5KCk7CisJCWFzc2VydEVxdWFscyhwb3J0TnVtLCBmYWMucG9ydCk7CisJCWZhYy5zb2NrZXQuY2xvc2UoKTsKKwkJc29jLmNsb3NlKCk7CisJfQorCisJLyoqCisJICogVGVzdCBjb25zdHJ1Y3Rpb24gYW5kIHRyYW5zbWlzc2lvbiBvZiBkYXRhZ3JhbXMuCisJICoKKwkgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlSZWNlaXB0KCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCQlEYXRhZ3JhbVNvY2tldCBzb2NrZXQgPSBudWxsOworCQl0cnkgeworCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUxMl07CisJCQlEYXRhZ3JhbVBhY2tldCBwYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCBidWYubGVuZ3RoKTsKKwkJCXNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOworCQkJU3lzdGVtLnNldFByb3BlcnR5KCJhY3Rpdml0eS5ob3N0IiwgImxvY2FsaG9zdCIpOworCQkJU3lzdGVtLnNldFByb3BlcnR5KCJhY3Rpdml0eS5wb3J0IiwgU3RyaW5nLnZhbHVlT2Yoc29ja2V0LmdldExvY2FsUG9ydCgpKSk7CisJCQlEYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkgZmFjID0gbmV3IERhdGFncmFtTG9nZ2luZ0FjdGl2aXR5RmFjdG9yeSgpOworCQkJQWN0aXZpdHkgYSA9IGZhYy5jcmVhdGVBY3Rpdml0eSgpOworCQkJSW5jaWRlbnQgaSA9IG5ldyBJbmNpZGVudCgpOworCQkJYS5sb2coaSk7CisJCQlzb2NrZXQucmVjZWl2ZShwYWNrZXQpOworCQkJT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwYWNrZXQuZ2V0RGF0YSgpLCBwYWNrZXQuZ2V0T2Zmc2V0KCksCisJCQkJcGFja2V0LmdldExlbmd0aCgpKSk7CisJCQlJbmNpZGVudCBqID0gKEluY2lkZW50KSBvaXMucmVhZE9iamVjdCgpOworCQkJYXNzZXJ0RXF1YWxzKGksIGopOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHNvY2tldCAhPSBudWxsKQorCQkJCXNvY2tldC5jbG9zZSgpOworCQl9CisJfQorCisJLyoqCisJICogUmVzdG9yZSBhIHN5c3RlbSBwcm9wZXJ0eS4KKwkgKgorCSAqIEBwYXJhbSBwcm9wTmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXN0b3JlLgorCSAqIEBwYXJhbSB2YWx1ZSBPbGQgdmFsdWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgd2Fzbid0IHByZXZpb3VzbHkgc2V0LgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzdG9yZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKHByb3BOYW1lKTsKKwkJZWxzZQorCQkJU3lzdGVtLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSk7CisJfQorCisJLyoqIE9sZCB2YWx1ZSBvZiA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5EYXRhZ3JhbUxvZ2dpbmdBY3Rpdml0eUZhY3RvcnkuaG9zdDwvY29kZT4uICovCisJcHJpdmF0ZSBTdHJpbmcgb2xkTG9uZ0hvc3Q7CisKKwkvKiogT2xkIHZhbHVlIG9mIDxjb2RlPmFjdGl2aXR5Lmhvc3Q8L2NvZGU+LiAqLworCXByaXZhdGUgU3RyaW5nIG9sZFNob3J0SG9zdDsKKworCS8qKiBPbGQgdmFsdWUgb2YgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuRGF0YWdyYW1Mb2dnaW5nQWN0aXZpdHlGYWN0b3J5LnBvcnQ8L2NvZGU+LiAqLworCXByaXZhdGUgU3RyaW5nIG9sZExvbmdQb3J0OworCisJLyoqIE9sZCB2YWx1ZSBvZiA8Y29kZT5hY3Rpdml0eS5wb3J0PC9jb2RlPi4gKi8KKwlwcml2YXRlIFN0cmluZyBvbGRTaG9ydFBvcnQ7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9IaXN0b3J5VGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvSGlzdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTRlYzJmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvYWN0aXZpdHkvSGlzdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCB0aGUge0BsaW5rIEhpc3Rvcnl9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyAqLworcHVibGljIGNsYXNzIEhpc3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBTdG9yYWdlIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBIaXN0b3J5VGVzdH0gaW5zdGFuY2UuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUuCisJICovCisJcHVibGljIEhpc3RvcnlUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNhdmUgdGhlIG9sZCBpZGxlIGFuZCBjbG9zZSB0aW1lcy4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlvbGRJZGxlID0gSGlzdG9yeS5pZGxlVGltZTsKKwkJb2xkQ2xvc2UgPSBIaXN0b3J5LmNsb3NlVGltZTsKKwl9CisKKwkvKioKKwkgKiBSZXN0b3JlIHRoZSBvbGQgaWRsZSBhbmQgY2xvc2UgdGltZXMuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSGlzdG9yeS5pZGxlVGltZSA9IG9sZElkbGU7CisJCUhpc3RvcnkuY2xvc2VUaW1lID0gb2xkQ2xvc2U7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdElsbGVnYWxJbmNpZGVudHMoKSB7CisJCUhpc3RvcnkuY2xvc2VUaW1lID0gNTA7CisJCUluY2lkZW50IG9uZSA9IG5ldyBJbmNpZGVudCgpOworCQlvbmUuc2V0QWN0aXZpdHlJRChuZXcgU3RyaW5nKCJhIikpOwkJCQkgICAgICAgLy8gV2FudCB1bmlxdWUgb2JqZWN0cworCQlJbmNpZGVudCB0d28gPSBuZXcgSW5jaWRlbnQoKTsKKwkJdHdvLnNldEFjdGl2aXR5SUQobmV3IFN0cmluZygiYSIpKTsJCQkJICAgICAgIC8vIFdhbnQgdW5pcXVlIG9iamVjdHMKKwkJSW5jaWRlbnQgdGhyZWUgPSBuZXcgSW5jaWRlbnQoKTsKKwkJdGhyZWUuc2V0QWN0aXZpdHlJRCgiYiIpOworCQlIaXN0b3J5IGhpc3RvcnkgPSBuZXcgSGlzdG9yeShvbmUsIHRoaXMpOworCQloaXN0b3J5LmFkZEluY2lkZW50KHR3byk7CisJCXRyeSB7CisJCQloaXN0b3J5LmFkZEluY2lkZW50KHRocmVlKTsKKwkJCWZhaWwoIkFibGUgdG8gYWRkIEluY2lkZW50cyB3aXRoIG5vbi1tYXRjaGluZyBhY3Rpdml0eSBJRHMiKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGdvb2QpIHt9CisJfQorCisJLyoqCisJICogVGVzdCBhIG5vcm1hbCwgd2VsbC1iZWhhdmVkIGxpZmVjeWxjZSBvZiAoaW5jaWRlbnQsIGluY2lkZW50LCBzdG9wKSB3aXRoIG5vCisJICogaWRsZSB0aW1lcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TGlmZWN5Y2xlKCkgeworCQlIaXN0b3J5LmNsb3NlVGltZSA9IDUwOworCQlJbmNpZGVudCBvbmUgPSBuZXcgSW5jaWRlbnQoKTsKKwkJb25lLnNldEFjdGl2aXR5SUQoInRlc3QiKTsKKwkJSGlzdG9yeSBoaXN0b3J5ID0gbmV3IEhpc3Rvcnkob25lLCB0aGlzKTsKKwkJcmVzdCgpOworCQlJbmNpZGVudCB0d28gPSBuZXcgSW5jaWRlbnQoKTsKKwkJdHdvLnNldEFjdGl2aXR5SUQoInRlc3QiKTsKKwkJaGlzdG9yeS5hZGRJbmNpZGVudCh0d28pOworCQlyZXN0KCk7CisJCUFjdGl2aXR5U3RvcHBlZCB0aHJlZSA9IG5ldyBBY3Rpdml0eVN0b3BwZWQoKTsKKwkJdGhyZWUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCQloaXN0b3J5LmFkZEluY2lkZW50KHRocmVlKTsKKwkJcmVzdCgpOworCQlhc3NlcnROb3ROdWxsKCJIaXN0b3J5IG5ldmVyIGNhbGxlZCBzdG9yZSIsIGlkKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgaWQpOworCQlhc3NlcnROb3ROdWxsKGluY2lkZW50cyk7CisJCWFzc2VydEVxdWFscygzLCBpbmNpZGVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9uZSwgaW5jaWRlbnRzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyh0d28sIGluY2lkZW50cy5nZXQoMSkpOworCQlhc3NlcnRFcXVhbHModGhyZWUsIGluY2lkZW50cy5nZXQoMikpOworCX0KKworCS8qKgorCSAqIFRlc3QgYXJyaXZhbCBhbmQgcmVjb3JkaW5nIG9mIGluY2lkZW50cyA8aT5hZnRlcjwvaT4gdGhlIHN0b3AgaW5jaWRlbnQuCisJICovCisJcHVibGljIHZvaWQgdGVzdFBvc3RDbG9zZUluY2lkZW50cygpIHsKKwkJSGlzdG9yeS5jbG9zZVRpbWUgPSAzMDA7CisJCUluY2lkZW50IG9uZSA9IG5ldyBJbmNpZGVudCgpOworCQlvbmUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCQlyZXN0KCk7CisJCUFjdGl2aXR5U3RvcHBlZCB0d28gPSBuZXcgQWN0aXZpdHlTdG9wcGVkKCk7CisJCXR3by5zZXRBY3Rpdml0eUlEKCJ0ZXN0Iik7CisJCXJlc3QoKTsKKwkJSW5jaWRlbnQgdGhyZWUgPSBuZXcgSW5jaWRlbnQoKTsKKwkJdGhyZWUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCisJCUhpc3RvcnkgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG9uZSwgdGhpcyk7CisJCWhpc3RvcnkuYWRkSW5jaWRlbnQodHdvKTsKKwkJcmVzdCgpOworCQloaXN0b3J5LmFkZEluY2lkZW50KHRocmVlKTsKKwkJcmVzdCgxMjAwKTsKKworCQlhc3NlcnROb3ROdWxsKCJIaXN0b3J5IG5ldmVyIGNhbGxlZCBzdG9yZSIsIGlkKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgaWQpOworCQlhc3NlcnROb3ROdWxsKGluY2lkZW50cyk7CisJCWFzc2VydEVxdWFscygzLCBpbmNpZGVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9uZSwgaW5jaWRlbnRzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyh0d28sIGluY2lkZW50cy5nZXQoMSkpOworCQlhc3NlcnRFcXVhbHModGhyZWUsIGluY2lkZW50cy5nZXQoMikpOworCX0KKworCS8qKgorCSAqIFRlc3QgaWYgYW4gaWRsZSBoaXN0b3J5IGlzIGNvbW1pdHRlZCB3aGVuIGEgc3RvcCBpbmNpZGVudCBpcyBsYXRlLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJZGxlSGlzdG9yeSgpIHsKKwkJSGlzdG9yeS5pZGxlVGltZSA9IDMwMDsKKwkJSGlzdG9yeS5jbG9zZVRpbWUgPSAxMDA7CisJCUluY2lkZW50IG9uZSA9IG5ldyBJbmNpZGVudCgpOworCQlvbmUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCQlyZXN0KCk7CisJCUluY2lkZW50IHR3byA9IG5ldyBJbmNpZGVudCgpOworCQl0d28uc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCQlyZXN0KCk7CisJCUFjdGl2aXR5U3RvcHBlZCB0aHJlZSA9IG5ldyBBY3Rpdml0eVN0b3BwZWQoKTsKKwkJdGhyZWUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCisJCUhpc3RvcnkgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG9uZSwgdGhpcyk7CisJCXJlc3QoKTsKKwkJaGlzdG9yeS5hZGRJbmNpZGVudCh0d28pOworCQlyZXN0KDUwMCk7CisJCWhpc3RvcnkuYWRkSW5jaWRlbnQodGhyZWUpOworCisJCWFzc2VydE5vdE51bGwoIkhpc3RvcnkgbmV2ZXIgY2FsbGVkIHN0b3JlIiwgaWQpOworCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBpZCk7CisJCWFzc2VydE5vdE51bGwoaW5jaWRlbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGluY2lkZW50cy5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMob25lLCBpbmNpZGVudHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKHR3bywgaW5jaWRlbnRzLmdldCgxKSk7CisJfQorCisJLyoqCisJICogVGVzdCBpZiBhbiBpZGxlIGhpc3RvcnkgaXMgY29tbWl0dGVkIGFuZCB0aGUgc3RvcCBpbmNpZGVudCBhcnJpdmVzIGluIHRpbWUgdG8KKwkgKiBiZSByZWNvcmRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UG9zdENvbW1pdEFjdGl2aXR5U3RvcCgpIHsKKwkJSGlzdG9yeS5pZGxlVGltZSA9IDMwMDsKKwkJSGlzdG9yeS5jbG9zZVRpbWUgPSA1MDA7CisJCUluY2lkZW50IG9uZSA9IG5ldyBJbmNpZGVudCgpOworCQlvbmUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCQlyZXN0KCk7CisJCUluY2lkZW50IHR3byA9IG5ldyBJbmNpZGVudCgpOworCQl0d28uc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCQlyZXN0KCk7CisJCUFjdGl2aXR5U3RvcHBlZCB0aHJlZSA9IG5ldyBBY3Rpdml0eVN0b3BwZWQoKTsKKwkJdGhyZWUuc2V0QWN0aXZpdHlJRCgidGVzdCIpOworCisJCUhpc3RvcnkgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG9uZSwgdGhpcyk7CisJCXJlc3QoKTsKKwkJaGlzdG9yeS5hZGRJbmNpZGVudCh0d28pOworCQlyZXN0KDUwMCk7CisJCWhpc3RvcnkuYWRkSW5jaWRlbnQodGhyZWUpOworCQlyZXN0KDQwMCk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiSGlzdG9yeSBuZXZlciBjYWxsZWQgc3RvcmUiLCBpZCk7CisJCWFzc2VydEVxdWFscygidGVzdCIsIGlkKTsKKwkJYXNzZXJ0Tm90TnVsbChpbmNpZGVudHMpOworCQlhc3NlcnRFcXVhbHMoMywgaW5jaWRlbnRzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhvbmUsIGluY2lkZW50cy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHModHdvLCBpbmNpZGVudHMuZ2V0KDEpKTsKKwkJYXNzZXJ0RXF1YWxzKHRocmVlLCBpbmNpZGVudHMuZ2V0KDIpKTsKKwl9CisKKwkvKioKKwkgKiBPdXIgdGVzdCBzdG9yYWdlIGp1c3Qgc2F2ZXMgdGhlIGxhc3QgcmVjZWl2ZWQgSUQgYW5kIGxpc3Qgb2YgaW5jaWRlbnRzLgorCSAqCisJICogQHBhcmFtIGlkIElELCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIDxjb2RlPnRlc3Q8L2NvZGU+LgorCSAqIEBwYXJhbSBpbmNpZGVudHMge0BsaW5rIExpc3R9IG9mIHJlY2VpdmVkIHtAbGluayBJbmNpZGVudH1zLgorCSAqLworCXB1YmxpYyB2b2lkIHN0b3JlKFN0cmluZyBpZCwgTGlzdCBpbmNpZGVudHMpIHsKKwkJdGhpcy5pZCA9IGlkOworCQl0aGlzLmluY2lkZW50cyA9IGluY2lkZW50czsKKwl9CisKKwkvKioKKwkgKiBQYXVzZSB0aGUgY3VycmVudCB0aHJlYWQgZm9yIHRoZSBnaXZlbiB0aW1lLgorCSAqCisJICogQHBhcmFtIHRpbWUgTWlsbGlzZWNvbmRzIHRvIHNsZWVwLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzdChsb25nIHRpbWUpIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCh0aW1lKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKSB7fQorCX0KKworCS8qKgorCSAqIFBhdXNlIHRoZSBjdXJyZW50IHRocmVhZCBmb3IgMTAwIG1pbGxpc2Vjb25kcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc3QoKSB7CisJCXJlc3QoMTAwKTsKKwl9CisKKwkvKiogTGFzdCBzdG9yZWQgSUQuICovCisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwkvKiogTGFzdCBzdG9yZWQgbGlzdCBvZiB7QGxpbmsgSW5jaWRlbnR9cy4gKi8KKwlwcml2YXRlIExpc3QgaW5jaWRlbnRzOworCisJLyoqIElkbGUgdGltZSB0byByZXN0b3JlLiAqLworCXByaXZhdGUgbG9uZyBvbGRJZGxlOworCisJLyoqIENsb3NlIHRpbWUgdG8gcmVzdG9yZS4gKi8KKwlwcml2YXRlIGxvbmcgb2xkQ2xvc2U7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9JbmNpZGVudFRlc3QuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2FjdGl2aXR5L0luY2lkZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3OWQ0YzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9hY3Rpdml0eS9JbmNpZGVudFRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHk7DQorDQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQorLyoqDQorICogVGVzdCB0aGUge0BsaW5rIEluY2lkZW50fSBjbGFzcy4NCisgKg0KKyAqIEBhdXRob3IgS2VsbHkNCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkDQorICovDQorcHVibGljIGNsYXNzIEluY2lkZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEluY2lkZW50VGVzdH0gaW5zdGFuY2UuDQorCSAqDQorCSAqIEBwYXJhbSBuYW1lIENhc2UgbmFtZS4NCisJICovDQorCXB1YmxpYyBJbmNpZGVudFRlc3QoU3RyaW5nIG5hbWUpIHsNCisJCXN1cGVyKG5hbWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBNYWtlIHN1cmUgaW5jaWRlbnRzIGdldCB0aW1lc3RhbXBlZC4NCisJICovDQorCXB1YmxpYyB2b2lkIHRlc3RUaW1lc3RhbXBpbmcoKSB7DQorCQlJbmNpZGVudCBpID0gbmV3IEluY2lkZW50KCk7DQorCQlyZXN0KCk7DQorCQlhc3NlcnRUcnVlKG5ldyBEYXRlKCkuY29tcGFyZVRvKGkuZ2V0VGltZSgpKSA+IDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBTZWUgaWYgaW5jaWRlbnRzIGFyZSAid2VsbC1iZWhhdmVkIiBvYmplY3RzLg0KKwkgKi8NCisJcHVibGljIHZvaWQgdGVzdE9iamVjdE1ldGhvZHMoKSB7DQorCQlJbmNpZGVudCBhID0gbmV3IEluY2lkZW50KCk7DQorCQlyZXN0KCk7DQorCQlJbmNpZGVudCBiID0gbmV3IEluY2lkZW50KCk7DQorDQorCQlhc3NlcnRFcXVhbHMoYSwgYSk7DQorCQlhc3NlcnRUcnVlKCFhLmVxdWFscyhiKSk7DQorCQlhc3NlcnRUcnVlKGEuY29tcGFyZVRvKGIpIDwgMCk7DQorCQlhc3NlcnRUcnVlKGIuY29tcGFyZVRvKGEpID4gMCk7DQorCQlpbnQgaWdub3JlID0gYS5oYXNoQ29kZSgpOw0KKw0KKwkJYi5zZXRBY3Rpdml0eUlEKCJ0ZXN0Iik7DQorCQlhc3NlcnRUcnVlKCFiLmVxdWFscyhhKSk7DQorCQlhc3NlcnRUcnVlKGEuY29tcGFyZVRvKGIpIDwgMCk7DQorCQlhc3NlcnRUcnVlKGIuY29tcGFyZVRvKGEpID4gMCk7DQorCQlpZ25vcmUgPSBiLmhhc2hDb2RlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFBhdXNlIGN1cnJlbnQgdGhyZWFkIGZvciAxMCB3aG9sZSBtaWxsaXNlY29uZHMuDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc3QoKSB7DQorCQl0cnkgew0KKwkJCVRocmVhZC5zbGVlcCgxMCk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHt9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZXhlYy9UZXN0RW52VXRpbGl0aWVzLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9leGVjL1Rlc3RFbnZVdGlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQwMmRjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvZXhlYy9UZXN0RW52VXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmV4ZWM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vQXBhY2hlIENvbW1vbnMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TeXN0ZW1VdGlsczsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgbXN0YXJjaAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3QgY2FzZSBmb3Ige0BsaW5rIEVudlV0aWxpdGllc30KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RW52VXRpbGl0aWVzIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVudlZhclN0ciA9ICJUT01DQVRfSE9NRT0vdXNyL2xvY2FsL3RvbWNhdFxuUFJPTVBUPVxcdSBcXHBcbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRWYXJTdHIgPSAiVE9NQ0FUX0hPTUU9L3Vzci9sb2NhbC90b21jYXRcblBST01QVD1cXFxcdSBcXFxccFxuIjsKKworICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTE3OAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVQcm9jZXNzSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudlZhclN0ci5nZXRCeXRlcygpKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gdHJhbnNsYXRlZElzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zbGF0ZWRJcyA9IEVudlV0aWxpdGllcy5wcmVQcm9jZXNzSW5wdXRTdHJlYW0oaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHRyYW5zbGF0ZWRJcyk7CisgICAgICAgIFN0cmluZyB0cmFuc2xhdGVkRW52U3RyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zbGF0ZWRFbnZTdHIgPSBFbnZVdGlsaXRpZXMuc2x1cnAodHJhbnNsYXRlZElzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwodHJhbnNsYXRlZEVudlN0cik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cmFuc2xhdGVkRW52U3RyLCBleHBlY3RlZFZhclN0cik7CisKKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdHMgdHdvIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHNob3VsZCBleGlzdCBpbiBhbnkgYnVpbGQgCisgICAgICogZW52aXJvbm1lbnQuIFVTRVIsIEhPTUUKKyAgICAgKiBCeSBjYWxsaW5nIChFbnZVdGlsaXRpZXMuZ2V0RW52KFN0cmluZykpCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldEVudmlyb25tZW50VmFyKCkgeworICAgICAgICAvL1Rlc3QgaWYgYW4gb25seSBpZiBIT01FIGFuZCBVU0VSIGlzIGRlZmluZWQgKEFzc3VtZWQgdG8gYmUgdHJ1ZSBvbiB1bml4KQorICAgICAgICBpZiAoU3lzdGVtVXRpbHMuSVNfT1NfVU5JWCkgeworICAgICAgICAgICAgLy9NYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IFN5c3RlbS5wcm9wZXJ0aWVzKCkgaXMgY29ycmVjdC4KKyAgICAgICAgICAgIFN0cmluZyB1c2VySG9tZVRydXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyTmFtZVRydXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKTsKKyAgICAgICAgICAgIC8vVGVzdCB2YWx1ZXMKKyAgICAgICAgICAgIFN0cmluZyB1c2VySG9tZVRlc3QgPSBFbnZVdGlsaXRpZXMuZ2V0RW52KCJIT01FIik7CisgICAgICAgICAgICBTdHJpbmcgdXNlck5hbWVUZXN0ID0gRW52VXRpbGl0aWVzLmdldEVudigiVVNFUiIpOworICAgICAgICAgICAgLy9DaGVjayBhbGwgdGhyZWUgdGVzdHMKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1c2VySG9tZVRydXRoLHVzZXJIb21lVGVzdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlck5hbWVUcnV0aCx1c2VyTmFtZVRlc3QpOworICAgICAgICB9IAorICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0cyB0d28gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGV4aXN0IGluIGFueSBidWlsZCAKKyAgICAgKiBlbnZpcm9ubWVudC4gVVNFUiwgSE9NRQorICAgICAqIEJ5IGdldHRpbmcgdGhlIGVudmlyb25tZW50IChFbnZVdGlsaXRpZXMuZ2V0RW52KCkpIGFuZCByZWFkaW5nIGZyb20gdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RW52aXJvbm1lbnQoKSB7CisgICAgICAgIC8vVGVzdCBpZiBhbiBvbmx5IGlmIEhPTUUgYW5kIFVTRVIgaXMgZGVmaW5lZCAoQXNzdW1lZCB0byBiZSB0cnVlIG9uIHVuaXgpCisgICAgICAgIGlmIChTeXN0ZW1VdGlscy5JU19PU19VTklYKSB7CisgICAgICAgICAgICAvL01ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgU3lzdGVtLnByb3BlcnRpZXMoKSBpcyBjb3JyZWN0LgorICAgICAgICAgICAgU3RyaW5nIHVzZXJIb21lVHJ1dGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOworICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lVHJ1dGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpOworICAgICAgICAgICAgUHJvcGVydGllcyBlbnYgPSBFbnZVdGlsaXRpZXMuZ2V0RW52KCk7CisgICAgICAgICAgICAvL1Rlc3QgdmFsdWVzCisgICAgICAgICAgICBTdHJpbmcgdXNlckhvbWVUZXN0ID0gZW52LmdldFByb3BlcnR5KCJIT01FIik7CisgICAgICAgICAgICBTdHJpbmcgdXNlck5hbWVUZXN0ID0gZW52LmdldFByb3BlcnR5KCJVU0VSIik7CisgICAgICAgICAgICAvL0NoZWNrIGFsbCB0aHJlZSB0ZXN0cworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJIb21lVHJ1dGgsdXNlckhvbWVUZXN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1c2VyTmFtZVRydXRoLHVzZXJOYW1lVGVzdCk7CisgICAgICAgIH0gCisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3RzIGZvciBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0d28gbWV0aG9kcyBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgKiBpbiBFbnZVdGlsaXRpZXMgY2FsbGluZyBnZXRFbnYoU3RyaW5nKSBhbmQgY2FsbGluZyBnZXRFbnYoKS5nZXRQcm9wZXJ0eShTdHJpbmcpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbnZpcm9ubWVudENvbnNpc3RlbmN5KCkgeworICAgICAgICAvL1Rlc3QgaWYgYW4gb25seSBpZiBIT01FIGFuZCBVU0VSIGlzIGRlZmluZWQgKEFzc3VtZWQgdG8gYmUgdHJ1ZSBvbiB1bml4KQorICAgICAgICBpZiAoU3lzdGVtVXRpbHMuSVNfT1NfVU5JWCkgeworICAgICAgICAgICAgUHJvcGVydGllcyBlbnYgPSBFbnZVdGlsaXRpZXMuZ2V0RW52KCk7CisgICAgICAgICAgICAvL1Rlc3QgdmFsdWVzCisgICAgICAgICAgICBTdHJpbmcgdXNlckhvbWVUZXN0MSA9IGVudi5nZXRQcm9wZXJ0eSgiSE9NRSIpOworICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lVGVzdDEgPSBlbnYuZ2V0UHJvcGVydHkoIlVTRVIiKTsKKyAgICAgICAgICAgIFN0cmluZyB1c2VySG9tZVRlc3QyID0gRW52VXRpbGl0aWVzLmdldEVudigiSE9NRSIpOworICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lVGVzdDIgPSBFbnZVdGlsaXRpZXMuZ2V0RW52KCJVU0VSIik7CisgICAgICAgICAgICAvL0NoZWNrIGFsbCB0aHJlZSB0ZXN0cworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJIb21lVGVzdDEsdXNlckhvbWVUZXN0Mik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlck5hbWVUZXN0MSx1c2VyTmFtZVRlc3QyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2ZpbHRlci9UZXN0VGltZUV2ZW50V2VpZ2h0ZWRIYXNoLmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9maWx0ZXIvVGVzdFRpbWVFdmVudFdlaWdodGVkSGFzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzEyNDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9maWx0ZXIvVGVzdFRpbWVFdmVudFdlaWdodGVkSGFzaC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5maWx0ZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3QgY2FzZSBmb3Ige0BsaW5rIFRpbWVFdmVudFdlaWdodGVkSGFzaH0KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGltZUV2ZW50V2VpZ2h0ZWRIYXNoIGV4dGVuZHMgVGVzdENhc2UgeworCisJcHVibGljIHZvaWQgdGVzdEJ1aWxkSGFzaCgpIHsKKwkgICAgICBMaXN0PFRpbWVFdmVudD4gZXZlbnRzID0gbmV3IExpbmtlZExpc3Q8VGltZUV2ZW50PigpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDMxLCAzMiwgMiwgIjEiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMjAsIDMwLCAxLCAiMiIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxLCA4LCAyLCAiMyIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig4LCAxNSwgMSwgIjQiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTgsIDIwLCAzLCAiNSIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxMCwgMTIsIDEsICI2IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDIwLCAzMCwgMiwgIjciKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMSwgMjAsIDEsICI4IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDExLCAxMywgMSwgIjkiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTUsIDIwLCAxLCAiMTAiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTgsIDIwLCAyLCAiMTEiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMSwgMTUsIDEsICIxMiIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxLCAxOCwgMiwgIjEzIikpOworCSAgICAgIFRpbWVFdmVudFdlaWdodGVkSGFzaCB0aW1lRXZlbnRIYXNoID0gVGltZUV2ZW50V2VpZ2h0ZWRIYXNoLmJ1aWxkSGFzaChldmVudHMpOworCSAgICAgIAorCSAgICAgIExpc3Q8T2JqZWN0VGltZUV2ZW50PiBvcmRlcmVkRXZlbnRzID0gKExpc3Q8T2JqZWN0VGltZUV2ZW50PikgdGltZUV2ZW50SGFzaC5nZXRHcmVhdGVzdFdlaWdodGVkUGF0aEFzT3JkZXJlZExpc3QoKTsKKwkgICAgICBhc3NlcnRFcXVhbHMob3JkZXJlZEV2ZW50cy5zaXplKCksIDMpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgwKS5nZXRUaW1lT2JqZWN0KCkudG9TdHJpbmcoKSwgIjEzIik7CisJICAgICAgYXNzZXJ0RXF1YWxzKG9yZGVyZWRFdmVudHMuZ2V0KDEpLmdldFRpbWVPYmplY3QoKS50b1N0cmluZygpLCAiNyIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgyKS5nZXRUaW1lT2JqZWN0KCkudG9TdHJpbmcoKSwgIjEiKTsKKwkgICAgICAKKwkgICAgICBldmVudHMgPSBuZXcgTGlua2VkTGlzdDxUaW1lRXZlbnQ+KCk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMzMsIDIxNSwgMSwgIjEiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMjE1LCAzNTksIDEsICIyIikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDM1OCwgNTQxLCAxLCAiMyIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig1NDEsIDcyMywgMSwgIjQiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oNzIzLCA5MDQsIDEsICI1IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDkwNCwgOTA0LCAxLCAiNiIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig5MDQsIDEwNDUsIDEsICI3IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDkwNSwgOTA1LCAxLCAiOCIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig5MDYsIDkwNywgMSwgIjkiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oOTA3LCA5MDgsIDEsICIxMCIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig5MDgsIDkwOCwgMSwgIjExIikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDkwOCwgOTA5LCAxLCAiMTIiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oOTIzLCA5MjQsIDEsICIxMyIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig5MjYsIDkyNywgMSwgIjE0IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDkyNywgOTI4LCAxLCAiMTUiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oOTQyLCA5NDMsIDEsICIxNiIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPig5NDUsIDk0NiwgMSwgIjE3IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDk0NiwgOTQ2LCAxLCAiMTgiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oOTQ3LCA5NDcsIDEsICIxOSIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxMDA0LCAxMDA1LCAxLCAiMjAiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTAwNSwgMTAwNSwgMSwgIjIxIikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDEwMDYsIDEwMDYsIDEsICIyMiIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxMDA3LCAxMDA3LCAxLCAiMjMiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTAyNSwgMTAyNiwgMSwgIjI0IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDEwMjYsIDEwMjYsIDEsICIyNSIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxMDI3LCAxMDI4LCAxLCAiMjYiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTA0NSwgMTA0NiwgMSwgIjI3IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDEwNDUsIDEyMjUsIDEsICIyOCIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxMjI1LCAxNDA2LCAxLCAiMjkiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTIyNSwgMTIyNiwgMSwgIjMwIikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDEyMjYsIDEyMjcsIDEsICIzMSIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxMjI3LCAxMjI3LCAxLCAiMzIiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTIyOCwgMTIyOCwgMSwgIjMzIikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDE0MDYsIDE1NDYsIDEsICIzNCIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxNTQ1LCAxNzI1LCAxLCAiMzUiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTU0NSwgMTU1NCwgMSwgIjM2IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDE3MjUsIDE5MDYsIDEsICIzNyIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigxOTA2LCAyMDQ3LCAxLCAiMzgiKSk7CisJICAgICAgZXZlbnRzLmFkZChuZXcgT2JqZWN0VGltZUV2ZW50PFN0cmluZz4oMTkwNiwgMTkyMiwgMSwgIjM5IikpOworCSAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxTdHJpbmc+KDIwNDcsIDIyMjgsIDEsICI0MCIpKTsKKwkgICAgICBldmVudHMuYWRkKG5ldyBPYmplY3RUaW1lRXZlbnQ8U3RyaW5nPigyMjI4LCAyNDEyLCAxLCAiNDEiKSk7CisJICAgICAgdGltZUV2ZW50SGFzaCA9IFRpbWVFdmVudFdlaWdodGVkSGFzaC5idWlsZEhhc2goZXZlbnRzLCAyKTsKKwkgICAgICAKKwkgICAgICBvcmRlcmVkRXZlbnRzID0gKExpc3Q8T2JqZWN0VGltZUV2ZW50PikgdGltZUV2ZW50SGFzaC5nZXRHcmVhdGVzdFdlaWdodGVkUGF0aEFzT3JkZXJlZExpc3QoKTsKKwkgICAgICBhc3NlcnRFcXVhbHMob3JkZXJlZEV2ZW50cy5zaXplKCksIDE0KTsKKwkgICAgICBhc3NlcnRFcXVhbHMob3JkZXJlZEV2ZW50cy5nZXQoMCkuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICIxIik7CisJICAgICAgYXNzZXJ0RXF1YWxzKG9yZGVyZWRFdmVudHMuZ2V0KDEpLmdldFRpbWVPYmplY3QoKS50b1N0cmluZygpLCAiMiIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgyKS5nZXRUaW1lT2JqZWN0KCkudG9TdHJpbmcoKSwgIjMiKTsKKwkgICAgICBhc3NlcnRFcXVhbHMob3JkZXJlZEV2ZW50cy5nZXQoMykuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICI0Iik7CisJICAgICAgYXNzZXJ0RXF1YWxzKG9yZGVyZWRFdmVudHMuZ2V0KDQpLmdldFRpbWVPYmplY3QoKS50b1N0cmluZygpLCAiNSIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCg1KS5nZXRUaW1lT2JqZWN0KCkudG9TdHJpbmcoKSwgIjciKTsKKwkgICAgICBhc3NlcnRFcXVhbHMob3JkZXJlZEV2ZW50cy5nZXQoNikuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICIyOCIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCg3KS5nZXRUaW1lT2JqZWN0KCkudG9TdHJpbmcoKSwgIjI5Iik7CisJICAgICAgYXNzZXJ0RXF1YWxzKG9yZGVyZWRFdmVudHMuZ2V0KDgpLmdldFRpbWVPYmplY3QoKS50b1N0cmluZygpLCAiMzQiKTsKKwkgICAgICBhc3NlcnRFcXVhbHMob3JkZXJlZEV2ZW50cy5nZXQoOSkuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICIzNSIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgxMCkuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICIzNyIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgxMSkuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICIzOCIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgxMikuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICI0MCIpOworCSAgICAgIGFzc2VydEVxdWFscyhvcmRlcmVkRXZlbnRzLmdldCgxMykuZ2V0VGltZU9iamVjdCgpLnRvU3RyaW5nKCksICI0MSIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0RpcmVjdG9yeVNlbGVjdG9yVGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vRGlyZWN0b3J5U2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyMmYxZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL0RpcmVjdG9yeVNlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIERpcmVjdG9yeVNlbGVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkKKwlGaWxlIHdvcmtpbmdEaXI7CisJU3RyaW5nIHJlbFBhdGggPSAib3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vIjsKKwlGaWxlIHRoaXNEaXI7CisJU3RyaW5nIHRoaXNDbGFzcyA9ICJEaXJlY3RvcnlTZWxlY3RvclRlc3QuY2xhc3MiOworCQorCXB1YmxpYyBEaXJlY3RvcnlTZWxlY3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJCisJCXN1cGVyKG5hbWUpOworCQkKKwkJd29ya2luZ0RpciA9IG5ldyBGaWxlKERpcmVjdG9yeVNlbGVjdG9yVGVzdC5jbGFzcy5nZXRQcm90ZWN0aW9uRG9tYWluKCkuZ2V0Q29kZVNvdXJjZSgpLmdldExvY2F0aW9uKCkuZ2V0UGF0aCgpKTsKKwkJdGhpc0RpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXIsIHJlbFBhdGgpOworCisJfQorCQorCS8qKgorCSAqIFRlc3RzIHN0YXJ0aW5nIGZyb20gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBjbGFzcyBmaWxlLAorCSAqIG5vIHJlY3Vyc2lvbiBpbnZvbHZlZAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RQb3NpdGl2ZVNlbGVjdGlvbldpdGhvdXRSZWN1cnNpb24oKSB7CisJCQorCQlEaXJlY3RvcnlTZWxlY3RvciBkcyA9IG5ldyBEaXJlY3RvcnlTZWxlY3RvcihBcnJheXMuYXNMaXN0KCBuZXcgU3RyaW5nW10geyB0aGlzQ2xhc3MgfSApKTsKKwkJTGlzdDxTdHJpbmc+IGRpcnMgPSBkcy50cmF2ZXJzZURpcih0aGlzRGlyKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGRpcnMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmaWxlOi8vIit0aGlzRGlyLmdldEFic29sdXRlUGF0aCgpLCBkaXJzLmdldCgwKSk7CisJCQorCX0KKwkKKwkvKioKKwkgKiBUZXN0cyBzdGFydGluZyBmcm9tIHRvcC1sZXZlbCB0ZXN0cyBkaXJlY3RvcnksCisJICogaW52b2x2ZXMgcmVjdXJzaW9uCisJICovCisJcHVibGljIHZvaWQgdGVzdFBvc2l0aXZlU2VsZWN0aW9uV2l0aFJlY3Vyc2lvbigpIHsKKwkJCisJCURpcmVjdG9yeVNlbGVjdG9yIGRzID0gbmV3IERpcmVjdG9yeVNlbGVjdG9yKEFycmF5cy5hc0xpc3QoIG5ldyBTdHJpbmdbXSB7IHRoaXNDbGFzcyB9ICkpOworCQlMaXN0PFN0cmluZz4gZGlycyA9IGRzLnRyYXZlcnNlRGlyKHdvcmtpbmdEaXIpOworCQlhc3NlcnRFcXVhbHMoMSwgZGlycy5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImZpbGU6Ly8iK3RoaXNEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGRpcnMuZ2V0KDApKTsKKwkJCisJfQorCQorCS8qKgorCSAqIFRlc3RzIHRoYXQgbm8gZGlyZWN0b3JpZXMgYXJlIHNlbGVjdGVkIGlmIHBhc3NpbmcgYW4gaW52YWxpZCBmaWxlLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVNlbGVjdGlvbkZvckludmFsaWRGaWxlKCkgeworCQkKKwkJRGlyZWN0b3J5U2VsZWN0b3IgZHMgPSBuZXcgRGlyZWN0b3J5U2VsZWN0b3IoQXJyYXlzLmFzTGlzdCggbmV3IFN0cmluZ1tdIHsgImRvZXNOb3RFeGlzdC50eHQiIH0gKSk7CisJCUxpc3Q8U3RyaW5nPiBkaXJzID0gZHMudHJhdmVyc2VEaXIod29ya2luZ0Rpcik7CisJCWFzc2VydEVxdWFscygwLCBkaXJzLnNpemUoKSk7CisKKwl9CisJCisJLyoqCisJICogVGVzdHMgdGhhdCBubyBkaXJlY3RvcmllcyBhcmUgcmV0dXJuZWQgd2hlbiBubyBmaWxlcyBhcmUgc3BlY2lmaWVkLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVNlbGVjdGlvbkZvck5vRmlsZXMoKSB7CisJCQorCQlEaXJlY3RvcnlTZWxlY3RvciBkcyA9IG5ldyBEaXJlY3RvcnlTZWxlY3RvcihBcnJheXMuYXNMaXN0KCBuZXcgU3RyaW5nW10ge30gKSk7CisJCUxpc3Q8U3RyaW5nPiBkaXJzID0gZHMudHJhdmVyc2VEaXIod29ya2luZ0Rpcik7CisJCWFzc2VydEVxdWFscygwLCBkaXJzLnNpemUoKSk7CisJCQorCX0KKwkKKwkvKioKKwkgKiBUZXN0cyB0aGF0IG5vIGRpcmVjdG9yaWVzIGFyZSByZXR1cm5lZCB3aGVuIHN0YXJ0aW5nIGZyb20gYW4gaW52YWxpZCBkaXJlY3RvcnkuCisJICovCisJcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlU2VsZWN0aW9uRm9ySW52YWxpZERpcmVjdG9yeSgpIHsKKwkJCisJCURpcmVjdG9yeVNlbGVjdG9yIGRzID0gbmV3IERpcmVjdG9yeVNlbGVjdG9yKEFycmF5cy5hc0xpc3QoIG5ldyBTdHJpbmdbXSB7IHRoaXNDbGFzcyB9ICkpOworCQlMaXN0PFN0cmluZz4gZGlycyA9IGRzLnRyYXZlcnNlRGlyKCBuZXcgRmlsZSgiL3RtcC9kb2VzL25vdC9leGlzdCIpICk7CisJCWFzc2VydEVxdWFscygwLCBkaXJzLnNpemUoKSk7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9GaXhlZEJ1ZmZlck91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VmYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqIFVuaXQgdGVzdCBmb3IgdGhlIHtAbGluayBGaXhlZEJ1ZmZlck91dHB1dFN0cmVhbX0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBGaXhlZEJ1ZmZlck91dHB1dFN0cmVhbX0gY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUuCisJICovCisJcHVibGljIEZpeGVkQnVmZmVyT3V0cHV0U3RyZWFtVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKiogVGVzdCB0aGUgZml4ZWQgYnVmZmVyIG91dHB1dCBzdHJlYW0ncyBtZXRob2RzIHdpdGggdmFyaW91cyBpbGxlZ2FsIGFyZ3VtZW50cy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJbmV3IEZpeGVkQnVmZmVyT3V0cHV0U3RyZWFtKC0xKTsKKwkJCWZhaWwoIklsbGVnYWwgc2l6ZSBmYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBnb29kKSB7fQorCQlGaXhlZEJ1ZmZlck91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW0oMTAwKTsKKwkJdHJ5IHsKKwkJCW91dC53cml0ZShudWxsKTsKKwkJCWZhaWwoIldyaXRpbmcgYSBudWxsIGJ5dGUgYXJyYXkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOworCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBnb29kKSB7fQorCQl0cnkgeworCQkJb3V0LndyaXRlKG51bGwsIDAsIDEwKTsKKwkJCWZhaWwoIldyaXRpbmcgYSBudWxsIGJ5dGUgYXJyYXkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOworCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBnb29kKSB7fQorCQl0cnkgeworCQkJb3V0LndyaXRlKFRFU1RfREFUQSwgLTEsIDEwKTsKKwkJCWZhaWwoIldyaXRpbmcgd2l0aCBuZWdhdGl2ZSBvZmZzZXQgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGdvb2QpIHt9CisJCXRyeSB7CisJCQlvdXQud3JpdGUoVEVTVF9EQVRBLCBURVNUX0RBVEEubGVuZ3RoICsgMSwgMTApOworCQkJZmFpbCgiV3JpdGluZyB3aXRoIG9mZnNldCBwYXN0IGVuZCBvZiBhcnJheSBmYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIik7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZ29vZCkge30KKwkJdHJ5IHsKKwkJCW91dC53cml0ZShURVNUX0RBVEEsIDAsIC0xKTsKKwkJCWZhaWwoIldyaXRpbmcgd2l0aCBuZWdhdGl2ZSBsZW5ndGggYXJyYXkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGdvb2QpIHt9CisJCXRyeSB7CisJCQlvdXQud3JpdGUoVEVTVF9EQVRBLCAyLCA1KTsKKwkJCWZhaWwoIldyaXRpbmcgd2l0aCBvZmZzZXQgYW5kIGxlbmd0aCBleGNlZWRpbmcgZW5kIG9mIGFycmF5IGZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24iKTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBnb29kKSB7fQorCX0KKworCS8qKiBUZXN0IGEgc3RyZWFtIHdpdGggc3BhY2UgZm9yIG5vIGJ5dGVzIGF0IGFsbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0WmVyb1NpemVTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaXhlZEJ1ZmZlck91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW0oMCk7CQkJICAgIC8vIFNwYWNlIGZvciBubyBieXRlIGF0IGFsbAorCQlvdXQud3JpdGUoMSk7CQkJCQkJCQkJICAgIC8vIFdyaXRlIGEgMSAKKwkJb3V0LndyaXRlKDIpOwkJCQkJCQkJCSAgICAvLyAuLi5hbmQgYSAyCisJCW91dC53cml0ZSgzKTsJCQkJCQkJCQkgICAgLy8gLi4uYW5kIGEgMworCQlvdXQud3JpdGUoVEVTVF9EQVRBKTsJCQkJCQkJCSAgICAvLyAuLi5hbmQgYSBieXRlIGFycmF5CisJCWJ5dGVbXSBidWZmZXIgPSBvdXQuZ2V0QnVmZmVyKCk7CQkJCQkJICAgIC8vIEdldCB0aGUgYnVmZmVyCisJCWFzc2VydE5vdE51bGwoYnVmZmVyKTsJCQkJCQkJCSAgICAvLyBJdCBzaG91bGQgbmV2ZXIgYmUgbnVsbAorCQlhc3NlcnRFcXVhbHMoMCwgYnVmZmVyLmxlbmd0aCk7CQkJCQkJCSAgICAvLyBCdXQgaXQgc2hvdWxkIGJlIGVtcHR5CisJfQorCisJLyoqIFRlc3QgYSBzdHJlYW0gdW5kZXIgdmFyaW91cyBjb25kaXRpb25zLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaXhlZEJ1ZmZlck91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRml4ZWRCdWZmZXJPdXRwdXRTdHJlYW0oMTApOwkJCSAgICAvLyBTcGFjZSBmb3IgMTAgYnl0ZXMKKwkJYnl0ZVtdIGJ1ZmZlciA9IG91dC5nZXRCdWZmZXIoKTsJCQkJCQkgICAgLy8gR2V0IHRoZSBidWZmZXIKKwkJYXNzZXJ0Tm90TnVsbChidWZmZXIpOwkJCQkJCQkJICAgIC8vIEl0IHNob3VsZCBuZXZlciBiZSBudWxsCisJCWFzc2VydEVxdWFscygwLCBidWZmZXIubGVuZ3RoKTsJCQkJCQkJICAgIC8vIE5vdGhpbmcgd3JpdHRlbiA9PiAwIGxlbmd0aAorCQlvdXQud3JpdGUoMSk7CQkJCQkJCQkJICAgIC8vIFsxXQorCQlidWZmZXIgPSBvdXQuZ2V0QnVmZmVyKCk7CQkJCQkJCSAgICAvLyBHZXQgdGhlIGJ1ZmZlcgorCQlhc3NlcnROb3ROdWxsKGJ1ZmZlcik7CQkJCQkJCQkgICAgLy8gSXQgc2hvdWxkIG5ldmVyIGJlIG51bGwKKwkJYXNzZXJ0RXF1YWxzKDEsIGJ1ZmZlci5sZW5ndGgpOwkJCQkJCQkgICAgLy8gT25seSAxIGJ5dGUgc28gZmFyCisJCWFzc2VydEVxdWFscygxLCBidWZmZXJbMF0pOwkJCQkJCQkgICAgLy8gQW5kIGl0IHNob3VsZCBiZSBhIDEKKwkJb3V0LndyaXRlKDIpOwkJCQkJCQkJCSAgICAvLyBbMSwyXQorCQlidWZmZXIgPSBvdXQuZ2V0QnVmZmVyKCk7CQkJCQkJCSAgICAvLyBHZXQgdGhlIGJ1ZmZlcgorCQlhc3NlcnROb3ROdWxsKGJ1ZmZlcik7CQkJCQkJCQkgICAgLy8gSXQgc2hvdWxkIG5ldmVyIGJlIG51bGwKKwkJYXNzZXJ0RXF1YWxzKDIsIGJ1ZmZlci5sZW5ndGgpOwkJCQkJCQkgICAgLy8gVHdvIGJ5dGVzIHNvIGZhcgorCQlhc3NlcnRFcXVhbHMoMSwgYnVmZmVyWzBdKTsJCQkJCQkJICAgIC8vIEFuZCBpdCBzaG91bGQgYmUgYSAxLi4uCisJCWFzc2VydEVxdWFscygyLCBidWZmZXJbMV0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIGEgMgorCQlvdXQud3JpdGUoMyk7CQkJCQkJCQkJICAgIC8vIFsxLDIsM10KKwkJYnVmZmVyID0gb3V0LmdldEJ1ZmZlcigpOwkJCQkJCQkgICAgLy8gR2V0IHRoZSBidWZmZXIKKwkJYXNzZXJ0Tm90TnVsbChidWZmZXIpOwkJCQkJCQkJICAgIC8vIEl0IHNob3VsZCBuZXZlciBiZSBudWxsCisJCWFzc2VydEVxdWFscygzLCBidWZmZXIubGVuZ3RoKTsJCQkJCQkJICAgIC8vIDMgYnl0ZXMgc28gZmFyCisJCWFzc2VydEVxdWFscygxLCBidWZmZXJbMF0pOwkJCQkJCQkgICAgLy8gVGhleSBhcmUgMQorCQlhc3NlcnRFcXVhbHMoMiwgYnVmZmVyWzFdKTsJCQkJCQkJICAgIC8vIC4uLmFuZCAyCisJCWFzc2VydEVxdWFscygzLCBidWZmZXJbMl0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDMKKworCQlvdXQud3JpdGUoVEVTVF9EQVRBKTsJCQkJCQkJCSAgICAvLyBbMSwyLDMsOCw5LDEwLDExXQorCQlidWZmZXIgPSBvdXQuZ2V0QnVmZmVyKCk7CQkJCQkJCSAgICAvLyBHZXQgdGhlIGJ1ZmZlcgorCQlhc3NlcnROb3ROdWxsKGJ1ZmZlcik7CQkJCQkJCQkgICAgLy8gSXQgc2hvdWxkIG5ldmVyIGJlIG51bGwKKwkJYXNzZXJ0RXF1YWxzKDcsIGJ1ZmZlci5sZW5ndGgpOwkJCQkJCQkgICAgLy8gNyBieXRlcyBzbyBmYXIsIHJpZ2h0PworCQlhc3NlcnRFcXVhbHMoMSwgYnVmZmVyWzBdKTsJCQkJCQkJICAgIC8vIFRoZXkgYXJlIDEKKwkJYXNzZXJ0RXF1YWxzKDIsIGJ1ZmZlclsxXSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgMgorCQlhc3NlcnRFcXVhbHMoMywgYnVmZmVyWzJdKTsJCQkJCQkJICAgIC8vIC4uLmFuZCAzCisJCWFzc2VydEVxdWFscyg4LCBidWZmZXJbM10pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDgKKwkJYXNzZXJ0RXF1YWxzKDksIGJ1ZmZlcls0XSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgOQorCQlhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlcls1XSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgMTAKKwkJYXNzZXJ0RXF1YWxzKDExLCBidWZmZXJbNl0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDExCisKKwkJb3V0LndyaXRlKFRFU1RfREFUQSk7CQkJCQkJCQkgICAgLy8gWzIsMyw4LDksMTAsMTEsOCw5LDEwLDExXQorCQlvdXQud3JpdGUoVEVTVF9EQVRBLCAxLCAyKTsJCQkJCQkJICAgIC8vIFs4LDksMTAsMTEsOCw5LDEwLDExLDksMTBdCisJCWJ1ZmZlciA9IG91dC5nZXRCdWZmZXIoKTsJCQkJCQkJICAgIC8vIEdldCB0aGUgYnVmZmVyCisJCWFzc2VydE5vdE51bGwoYnVmZmVyKTsJCQkJCQkJCSAgICAvLyBJdCBzaG91bGQgbmV2ZXIgYmUgbnVsbAorCQlhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlci5sZW5ndGgpOwkJCQkJCSAgICAvLyBGdWxsIGJ1ZmZlcgorCQlhc3NlcnRFcXVhbHMoOCwgYnVmZmVyWzBdKTsJCQkJCQkJICAgIC8vIFRoZXkgYXJlIDgKKwkJYXNzZXJ0RXF1YWxzKDksIGJ1ZmZlclsxXSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgOQorCQlhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlclsyXSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgMTAKKwkJYXNzZXJ0RXF1YWxzKDExLCBidWZmZXJbM10pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDExCisJCWFzc2VydEVxdWFscyg4LCBidWZmZXJbNF0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDgKKwkJYXNzZXJ0RXF1YWxzKDksIGJ1ZmZlcls1XSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgOQorCQlhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlcls2XSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgMTAKKwkJYXNzZXJ0RXF1YWxzKDExLCBidWZmZXJbN10pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDExCisJCWFzc2VydEVxdWFscyg5LCBidWZmZXJbOF0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDkKKwkJYXNzZXJ0RXF1YWxzKDEwLCBidWZmZXJbOV0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDEwCisKKwkJb3V0LndyaXRlKFRFU1RfREFUQSk7CQkJCQkJCQkgICAgLy8gWzgsOSwxMCwxMSw5LDEwLDgsOSwxMCwxMV0KKwkJb3V0LndyaXRlKFRFU1RfREFUQSwgMCwgMSk7CQkJCQkJCSAgICAvLyBbOSwxMCwxMSw5LDEwLDgsOSwxMCwxMSw4XQorCQlvdXQud3JpdGUoNDIpOwkJCQkJCQkJCSAgICAvLyBbMTAsMTEsOSwxMCw4LDksMTAsMTEsOCw0Ml0KKwkJb3V0LndyaXRlKDk5KTsJCQkJCQkJCQkgICAgLy8gWzExLDksMTAsOCw5LDEwLDExLDgsNDIsOTldCisJCW91dC53cml0ZShURVNUX0RBVEEsIDEsIDMpOwkJCQkJCQkgICAgLy8gWzgsOSwxMCwxMSw4LDQyLDk5LDksMTAsMTFdCisJCWJ1ZmZlciA9IG91dC5nZXRCdWZmZXIoKTsJCQkJCQkJICAgIC8vIEdldCB0aGUgYnVmZmVyCisJCWFzc2VydE5vdE51bGwoYnVmZmVyKTsJCQkJCQkJCSAgICAvLyBJdCBzaG91bGQgbmV2ZXIgYmUgbnVsbAorCQlhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlci5sZW5ndGgpOwkJCQkJCSAgICAvLyBGdWxsIGJ1ZmZlcgorCQlhc3NlcnRFcXVhbHMoOCwgYnVmZmVyWzBdKTsJCQkJCQkJICAgIC8vIFRoZXkgYXJlIDgKKwkJYXNzZXJ0RXF1YWxzKDksIGJ1ZmZlclsxXSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgOQorCQlhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlclsyXSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgMTAKKwkJYXNzZXJ0RXF1YWxzKDExLCBidWZmZXJbM10pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDExCisJCWFzc2VydEVxdWFscyg4LCBidWZmZXJbNF0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDgKKwkJYXNzZXJ0RXF1YWxzKDQyLCBidWZmZXJbNV0pOwkJCQkJCQkgICAgLy8gLi4uYW5kIDQyCisJCWFzc2VydEVxdWFscyg5OSwgYnVmZmVyWzZdKTsJCQkJCQkJICAgIC8vIC4uLmFuZCA5OQorCQlhc3NlcnRFcXVhbHMoOSwgYnVmZmVyWzddKTsJCQkJCQkJICAgIC8vIC4uLmFuZCA5CisJCWFzc2VydEVxdWFscygxMCwgYnVmZmVyWzhdKTsJCQkJCQkJICAgIC8vIC4uLmFuZCAxMAorCQlhc3NlcnRFcXVhbHMoMTEsIGJ1ZmZlcls5XSk7CQkJCQkJCSAgICAvLyAuLi5hbmQgMTEKKworCQlieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVtidWZmZXIubGVuZ3RoXTsJCQkJCQkgICAgLy8gTmV3IHRlc3QgZGF0YSBhcnJheSB0aGF0J3MKKwkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGFycmF5LCAwLCBidWZmZXIubGVuZ3RoKTsJCQkJICAgIC8vIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IGJ1ZgorCQlvdXQud3JpdGUoYXJyYXkpOwkJCQkJCQkJICAgIC8vIC4uLmFuZCB3cml0ZSB0aGF0CisJCWJ1ZmZlciA9IG91dC5nZXRCdWZmZXIoKTsJCQkJCQkJICAgIC8vIEdldCB0aGUgYnVmZmVyCisJCWFzc2VydE5vdE51bGwoYnVmZmVyKTsJCQkJCQkJCSAgICAvLyBJdCBzaG91bGQgbmV2ZXIgYmUgbnVsbAorCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYXJyYXksIGJ1ZmZlcikpOwkJCQkJICAgIC8vIFNob3VsZCBnZXQgc2FtZSByZXN1bHQKKworCQlieXRlW10gYmlnID0gbmV3IGJ5dGVbYnVmZmVyLmxlbmd0aCAqIDNdOwkJCQkJICAgIC8vIE1vcmUgbmV3IHRlc3QgZGF0YSBhcnJheQorCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgYmlnLCAwLCBidWZmZXIubGVuZ3RoKTsJCQkJICAgIC8vIC4uLmFuZCBhZGQgc29tZSBkYXRhCisJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBiaWcsIGJ1ZmZlci5sZW5ndGgsIGJ1ZmZlci5sZW5ndGgpOwkJCSAgICAvLyAuLi5hbmQgbW9yZSBkYXRhCisJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBiaWcsIGJ1ZmZlci5sZW5ndGggKiAyLCBidWZmZXIubGVuZ3RoKTsJCSAgICAvLyAuLi5hbmQgTE9UUyBvZiBkYXRhCisJCW91dC53cml0ZShiaWcsIGJ1ZmZlci5sZW5ndGgsIGJ1ZmZlci5sZW5ndGggKiAyKTsJCQkJICAgIC8vIFdyaXRlIHRoZSBsYXN0IHRoaXJkIG9mIGl0CisJCWJ1ZmZlciA9IG91dC5nZXRCdWZmZXIoKTsJCQkJCQkJICAgIC8vIEdldCB0aGUgYnVmZmVyCisJCWFzc2VydE5vdE51bGwoYnVmZmVyKTsJCQkJCQkJCSAgICAvLyBJdCBzaG91bGQgbmV2ZXIgYmUgbnVsbAorCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYXJyYXksIGJ1ZmZlcikpOwkJCQkJICAgIC8vIFNob3VsZCBnZXQgc2FtZSByZXN1bHQhCisKKwkJb3V0LmNsb3NlKCk7CQkJCQkJCQkJICAgIC8vIENsb3NlIGl0CisJCXRyeSB7CQkJCQkJCQkJCSAgICAvLyAuLi5hbmQgdHJ5Li4uCisJCQlvdXQud3JpdGUoMSk7CQkJCQkJCQkgICAgLy8gLi4udG8gd3JpdGUgdG8gaXQKKwkJCWZhaWwoIldyaXRpbmcgdG8gYSBjbG9zZWQgc3RyZWFtIGZhaWxlZCB0byB0aHJvdyBhbiBleGNlcHRpb24iKTsJICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBnb29kKSB7fQkJCQkJCQkgICAgLy8gU2hvdWxkIGdldCBoZXJlCisJfQorCisJLyoqIFNvbWUgdGVzdCBkYXRhIGluIGFuIGFycmF5LiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBURVNUX0RBVEEgPSBuZXcgYnl0ZVtdIHsKKwkJKGJ5dGUpIDgsIChieXRlKSA5LCAoYnl0ZSkgMTAsIChieXRlKSAxMQorCX07Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9OdWxsSW5wdXRTdHJlYW1UZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9pby9OdWxsSW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5MmI3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL051bGxJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVW5pdCB0ZXN0IHRoZSB7QGxpbmsgTnVsbElucHV0U3RyZWFtfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgTnVsbElucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAgICAgLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OdWxsSW5wdXRTdHJlYW1UZXN0PC9jb2RlPiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRlc3QgY2FzZSBuYW1lLgorCSAqLworCXB1YmxpYyBOdWxsSW5wdXRTdHJlYW1UZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGluID0gbmV3IE51bGxJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdENsb3NpbmcoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGNsb3NlOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIGEgY2xvc2VkIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBjbG9zZSBhIGNsb3NlZCBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZygpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBvbiByZWFkaW5nOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogVGhlIHtAbGluayBOdWxsSW5wdXRTdHJlYW19IHdlJ3JlIHRlc3RpbmcuICovCisgICAgICAgIHByaXZhdGUgTnVsbElucHV0U3RyZWFtIGluOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vTnVsbE91dHB1dFN0cmVhbVRlc3QuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL051bGxPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhMjM0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL051bGxPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW87CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKy8qKiBVbml0IHRlc3QgdGhlIHtAbGluayBOdWxsT3V0cHV0U3RyZWFtfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgTnVsbE91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIE51bGxPdXRwdXRTdHJlYW19IGNsYXNzLiAqLworCXB1YmxpYyBOdWxsT3V0cHV0U3RyZWFtVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlvdXQgPSBuZXcgTnVsbE91dHB1dFN0cmVhbSgpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDbG9zaW5nKCkgeworCQl0cnkgeworCQkJb3V0LmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQlmYWlsKCJTaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBvbiBjbG9zZTogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJdHJ5IHsKKwkJCW91dC53cml0ZSgxKTsKKwkJCWZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byB3cml0ZSB0byBhIGNsb3NlZCBzdHJlYW0iKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCQl0cnkgeworCQkJb3V0LmZsdXNoKCk7CisJCQlmYWlsKCJTaG91bGQgbm90IGJlIGFibGUgdG8gZmx1c2ggYSBjbG9zZWQgc3RyZWFtIik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJdHJ5IHsKKwkJCW91dC5jbG9zZSgpOworCQkJZmFpbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNsb3NlIGEgY2xvc2VkIHN0cmVhbSIpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJfQorCisJcHVibGljIHZvaWQgdGVzdEZsdXNoKCkgeworCQl0cnkgeworCQkJb3V0LmZsdXNoKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQlmYWlsKCJTaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmbHVzaDogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0V3JpdGluZygpIHsKKwkJdHJ5IHsKKwkJCWJ5dGVbXSBhcnJheSA9IG5ldyBieXRlW117KGJ5dGUpMCwgKGJ5dGUpMSwgKGJ5dGUpMn07CisJCQlvdXQud3JpdGUoMSk7CisJCQlvdXQud3JpdGUoYXJyYXkpOworCQkJb3V0LndyaXRlKGFycmF5LCAxLCAxKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCWZhaWwoIlNob3VsZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIHdyaXRpbmc6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJLyoqIFRoZSB7QGxpbmsgTnVsbE91dHB1dFN0cmVhbX0gd2UncmUgdGVzdGluZy4gKi8KKwlwcml2YXRlIE51bGxPdXRwdXRTdHJlYW0gb3V0OworCit9CisKZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL1Rlc3RMb2dnZXJPdXRwdXRTdHJlYW0uamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL2lvL1Rlc3RMb2dnZXJPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzE3YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvaW8vVGVzdExvZ2dlck91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgTG9nZ2VyT3V0cHV0U3RyZWFtfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RMb2dnZXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIExpc3Q8TG9nUmVjb3JkPiByZWNvcmRzID0gbmV3IEFycmF5TGlzdDxMb2dSZWNvcmQ+KCk7CisgICAgICBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0TG9nZ2VyT3V0cHV0U3RyZWFtLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICBsb2dnZXIuYWRkSGFuZGxlcihuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24ge30KKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7fQorICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKExvZ1JlY29yZCByZWNvcmQpIHsKKyAgICAgICAgICAgIHJlY29yZHMuYWRkKHJlY29yZCk7CisgICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIExvZ2dlck91dHB1dFN0cmVhbSBsb3MgPSBuZXcgTG9nZ2VyT3V0cHV0U3RyZWFtKGxvZ2dlciwgMTAsIExldmVsLklORk8pOworICAgICAgbG9zLndyaXRlKCJUaGlzIGlzIGEgdGVzdCB3cml0ZSB0byBhIGxvZyBmaWxlIi5nZXRCeXRlcygpKTsKKyAgICAgIGxvcy5jbG9zZSgpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIGEgIiwgcmVjb3Jkcy5nZXQoMCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygidGVzdCB3cml0ZSIsIHJlY29yZHMuZ2V0KDEpLmdldE1lc3NhZ2UoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiB0byBhIGxvZyAiLCByZWNvcmRzLmdldCgyKS5nZXRNZXNzYWdlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIiwgcmVjb3Jkcy5nZXQoMykuZ2V0TWVzc2FnZSgpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL25ldC9OZXRUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9uZXQvTmV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5N2M3MDYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9uZXQvTmV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLm5ldDsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworCisvKiogVW5pdCB0ZXN0IHRoZSB7QGxpbmsgTmV0fSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgTmV0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSB7QGxpbmsgTmV0fSBjbGFzcy4KKwkgKi8KKwlwdWJsaWMgTmV0VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKiogVGVzdCB0aGUge0BsaW5rIE5ldCNnZXRMb29wYmFja0FkZHJlc3N9IG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TG9vcGJhY2tBZGRyZXNzKCkgeworCQlJbmV0QWRkcmVzcyBhZGRyID0gTmV0LmdldExvb3BiYWNrQWRkcmVzcygpOworCQlhc3NlcnROb3ROdWxsKGFkZHIpOworCQlieXRlW10gYnl0ZXMgPSBhZGRyLmdldEFkZHJlc3MoKTsKKwkJYXNzZXJ0Tm90TnVsbChieXRlcyk7CisJCWFzc2VydEVxdWFscyg0LCBieXRlcy5sZW5ndGgpOworCQlhc3NlcnRFcXVhbHMoMTI3LCBieXRlc1swXSk7CisJCWFzc2VydEVxdWFscygwLCBieXRlc1sxXSk7CisJCWFzc2VydEVxdWFscygwLCBieXRlc1syXSk7CisJCWFzc2VydEVxdWFscygxLCBieXRlc1szXSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldExvY2FsSG9zdCgpIHsKKwkJSW5ldEFkZHJlc3MgYWRkciA9IE5ldC5nZXRMb2NhbEhvc3QoKTsKKwkJYXNzZXJ0Tm90TnVsbChhZGRyKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL29iamVjdC9qbmRpL09iamVjdENvbnRleHRUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9PYmplY3RDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjhhZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9PYmplY3RDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQmluZGluZzsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaS5PYmplY3RDb250ZXh0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBPYmplY3RDb250ZXh0fS4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RDb250ZXh0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9iamVjdENvbnRleHRUZXN0PC9jb2RlPiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBjYXNlTmFtZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICovCisJcHVibGljIE9iamVjdENvbnRleHRUZXN0KFN0cmluZyBjYXNlTmFtZSkgeworCQlzdXBlcihjYXNlTmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKworCQlhbGlhc0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgIi5wcm9wZXJ0aWVzIik7CisJCWFsaWFzRmlsZS5kZWxldGVPbkV4aXQoKTsKKwkJUHJvcGVydGllcyBhbGlhc2VzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJYWxpYXNlcy5zZXRQcm9wZXJ0eSgidXJuOmFsaWFzOngiLCAidXJuOmE6eCIpOworCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFsaWFzRmlsZSk7CisJCWFsaWFzZXMuc2F2ZShvdXQsICJUZW1wb3JhcnkgcHJvcGVydGllcyIpOworCQlvdXQuY2xvc2UoKTsKKworCQlhMSA9IG5ldyBUZXN0Q29udGV4dCgidXJuOmEiKTsKKwkJYTIgPSBuZXcgVGVzdENvbnRleHQoInVybjphIik7CisJCWIgPSBuZXcgVGVzdENvbnRleHQoInVybjpiIik7CisKKwkJb2xkVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpLmFsaWFzZXMiKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaS5hbGlhc2VzIiwgYWxpYXNGaWxlLnRvU3RyaW5nKCkpOworCisJCUxpc3QgY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWNvbnRleHRzLmFkZChhMSk7CisJCWNvbnRleHRzLmFkZChhMik7CisJCWNvbnRleHRzLmFkZChiKTsKKwkJY29udGV4dCA9IG5ldyBPYmplY3RDb250ZXh0KGNvbnRleHRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlhbGlhc0ZpbGUuZGVsZXRlKCk7CisJCWlmIChvbGRWYWx1ZSA9PSBudWxsKQorCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoIm9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpLmFsaWFzZXMiKTsKKwkJZWxzZQorCQkJU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaS5hbGlhc2VzIiwgb2xkVmFsdWUpOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKworCS8qKgorCSAqIFRlc3QgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBvYmplY3QgY29udGV4dC4KKwkgKgorCSAqIEB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0Q29udGV4dCgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQkvLyBUZXN0IHJldHJpZXZhbCBvZiBub25leGlzdGVudCBiaW5kaW5ncworCQl0cnkgeworCQkJY29udGV4dC5sb29rdXAoInVybjphOngiKTsKKwkJCWZhaWwoIkZvdW5kIG5vbmV4aXN0ZW50IG9iamVjdCIpOworCQl9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZXgpIHt9CisKKwkJLy8gVGVzdCBiaW5kaW5nIG5hbWVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IGRlbGVnYXRlJ3MgbmFtZXNwYWNlIHByZWZpeC4KKwkJdHJ5IHsKKwkJCWNvbnRleHQuYmluZCgidXJuOmM6eCIsIHRoaXMpOworCQkJZmFpbCgiQm91bmQgbm9uY29uZm9ybWluZyBuYW1lIik7CisJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBleCkge30KKworCQkvLyBUZXN0IGJpbmRpbmcgYW5kIHJldHJpZXZhbAorCQljb250ZXh0LmJpbmQoInVybjphOngiLCB0aGlzKTsJCQkJCSAgICAgICAvLyBCaW5kIHNvbWV0aGluZworCQlhc3NlcnRTYW1lKHRoaXMsIGNvbnRleHQubG9va3VwKCJ1cm46YTp4IikpOwkJCSAgICAgICAvLyBMb29rIGl0IHVwCisJCWFzc2VydFNhbWUodGhpcywgY29udGV4dC5sb29rdXAoInVybjphbGlhczp4IikpOwkJICAgICAgIC8vIFRyeSB0aGUgYWxpYXMKKwkJYXNzZXJ0VHJ1ZShhMS5iaW5kaW5ncy52YWx1ZXMoKS5jb250YWlucyh0aGlzKSk7CQkgICAgICAgLy8gSXQgc2hvdWxkIGJlIGluIGJvdGggYTEuLi4KKwkJYXNzZXJ0VHJ1ZShhMi5iaW5kaW5ncy52YWx1ZXMoKS5jb250YWlucyh0aGlzKSk7CQkgICAgICAgLy8gLi4uYW5kIGEyCisJCWFzc2VydFRydWUoIWIuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnModGhpcykpOwkJICAgICAgIC8vIEJ1dCBub3QgYi4KKworCQljb250ZXh0LmJpbmQoInVybjpiOngiLCBnZXRDbGFzcygpKTsJCQkJICAgICAgIC8vIE5vdyBiaW5kIHNvbWV0aGluZyBmb3IgYgorCQlhc3NlcnRTYW1lKGdldENsYXNzKCksIGNvbnRleHQubG9va3VwKCJ1cm46Yjp4IikpOwkJICAgICAgIC8vIExvb2sgaXQgdXAKKwkJYXNzZXJ0VHJ1ZSghYTEuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnMoZ2V0Q2xhc3MoKSkpOwkJICAgICAgIC8vIEl0IHNob3VsZCBub3QgYmUgaW4gYTEuLi4KKwkJYXNzZXJ0VHJ1ZSghYTIuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnMoZ2V0Q2xhc3MoKSkpOwkJICAgICAgIC8vIC4uLm5vciBhMgorCQlhc3NlcnRUcnVlKGIuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnMoZ2V0Q2xhc3MoKSkpOwkJICAgICAgIC8vIEJ1dCBzaG91bGQgYmUgaW4gYi4KKworCQkvLyBUZXN0IGJpbmRpbmcgYSBib3VuZCBuYW1lCisJCXRyeSB7CisJCQljb250ZXh0LmJpbmQoInVybjphOngiLCAiIik7CisJCQlmYWlsKCJBYmxlIHRvIGJpbmQgYW4gYWxyZWFkeS1ib3VuZCBuYW1lIik7CisJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBleCkge30KKworCQkvLyBUZXN0IHJlYmluZGluZyBhIGJvdW5kIG5hbWUKKwkJY29udGV4dC5yZWJpbmQoInVybjphOngiLCBjb250ZXh0KTsJCQkJICAgICAgIC8vIEJpbmQgdG8gYSBkaWZmZXJlbnQgb2JqZWN0CisJCWFzc2VydFNhbWUoY29udGV4dCwgY29udGV4dC5sb29rdXAoInVybjphOngiKSk7CQkJICAgICAgIC8vIExvb2sgaXQgdXAKKwkJYXNzZXJ0VHJ1ZSghYTEuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnModGhpcykpOwkJICAgICAgIC8vIFRoZSBvbGQgb2JqZWN0IHNob3VsZCBiZSBnb25lIGZyb20gYTEuLi4KKwkJYXNzZXJ0VHJ1ZSghYTIuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnModGhpcykpOwkJICAgICAgIC8vIC4uLmFuZCBmcm9tIGEyCisJCWFzc2VydFRydWUoIWIuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnMoY29udGV4dCkpOwkJICAgICAgIC8vIEFuZCB0aGUgbmV3IG9iamVjdCBpc24ndCBpbiBiCisKKwkJLy8gVGVzdCByZW5hbWluZworCQljb250ZXh0LnJlbmFtZSgidXJuOmE6eCIsICJ1cm46YTp5Iik7CQkJCSAgICAgICAvLyBDaGFuZ2UgeCB0byB5CisJCXRyeSB7CisJCQljb250ZXh0Lmxvb2t1cCgidXJuOmE6eCIpOwkJCQkgICAgICAgLy8gTG9vayBpdCB1cAorCQkJZmFpbCgiRm91bmQgb2JqZWN0IHVuZGVyIG9sZCBuYW1lIik7CisJCX0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBleCkge30KKwkJYXNzZXJ0U2FtZShjb250ZXh0LCBjb250ZXh0Lmxvb2t1cCgidXJuOmE6eSIpKTsJCQkgICAgICAgLy8gSnVzdCB0aGUgbmFtZSBoYXMgY2hhbmdlZAorCQlhc3NlcnRUcnVlKGExLmJpbmRpbmdzLmtleVNldCgpLmNvbnRhaW5zKCJ1cm46YTp5IikpOwkJICAgICAgIC8vIFRoZSBuZXcgbmFtZSBpcyBpbiBhMQorCQlhc3NlcnRUcnVlKCFhMS5iaW5kaW5ncy5rZXlTZXQoKS5jb250YWlucygidXJuOmE6eCIpKTsJCSAgICAgICAvLyBCdXQgbm90IHRoZSBvbGQKKwkJYXNzZXJ0VHJ1ZShhMi5iaW5kaW5ncy5rZXlTZXQoKS5jb250YWlucygidXJuOmE6eSIpKTsJCSAgICAgICAvLyBUaGUgbmV3IG5hbWUgaXMgaW4gYTIKKwkJYXNzZXJ0VHJ1ZSghYTIuYmluZGluZ3Mua2V5U2V0KCkuY29udGFpbnMoInVybjphOngiKSk7CQkgICAgICAgLy8gQnV0IG5vdCB0aGUgb2xkCisJCWFzc2VydFRydWUoIWIuYmluZGluZ3MudmFsdWVzKCkuY29udGFpbnMoY29udGV4dCkpOwkJICAgICAgIC8vIEl0IHdhcyBuZXZlciBpbiBiCisKKwkJLy8gVGVzdCBsaXN0aW5nCisJCWludCBjb3VudCA9IDA7CisJCWJvb2xlYW4gc2F3QSA9IGZhbHNlOworCQlib29sZWFuIHNhd0IgPSBmYWxzZTsKKwkJTmFtaW5nRW51bWVyYXRpb24gZSA9IGNvbnRleHQubGlzdCgiIik7CisJCXdoaWxlIChlLmhhc01vcmUoKSkgeworCQkJTmFtZUNsYXNzUGFpciBwID0gKE5hbWVDbGFzc1BhaXIpIGUubmV4dCgpOworCQkJaWYgKCJ1cm46YTp5Ii5lcXVhbHMocC5nZXROYW1lKCkpICYmIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKHAuZ2V0Q2xhc3NOYW1lKCkpKQorCQkJCXNhd0EgPSB0cnVlOworCQkJZWxzZSBpZiAoInVybjpiOngiLmVxdWFscyhwLmdldE5hbWUoKSkgJiYgImphdmEubGFuZy5DbGFzcyIuZXF1YWxzKHAuZ2V0Q2xhc3NOYW1lKCkpKQorCQkJCXNhd0IgPSB0cnVlOworCQkJZWxzZQorCQkJCWZhaWwoIlVuZXhwZWN0ZWQgYmluZGluZyBcIiIgKyBwLmdldE5hbWUoKSArICJcIiB0byAiICsgcC5nZXRDbGFzc05hbWUoKSk7CisJCQkrK2NvdW50OworCQl9CisJCWFzc2VydEVxdWFscygzLCBjb3VudCk7CisJCWFzc2VydFRydWUoc2F3QSk7CisJCWFzc2VydFRydWUoc2F3Qik7CisKKwkJLy8gVGVzdCBsaXN0aW5nIG9mIGJpbmRpbmdzCisJCWNvdW50ID0gMDsKKwkJc2F3QSA9IGZhbHNlOworCQlzYXdCID0gZmFsc2U7CisJCWUgPSBjb250ZXh0Lmxpc3RCaW5kaW5ncygiIik7CisJCXdoaWxlIChlLmhhc01vcmUoKSkgeworCQkJQmluZGluZyBiID0gKEJpbmRpbmcpIGUubmV4dCgpOworCQkJaWYgKCJ1cm46YTp5Ii5lcXVhbHMoYi5nZXROYW1lKCkpICYmIGNvbnRleHQgPT0gYi5nZXRPYmplY3QoKSkKKwkJCQlzYXdBID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKCJ1cm46Yjp4Ii5lcXVhbHMoYi5nZXROYW1lKCkpICYmIGdldENsYXNzKCkgPT0gYi5nZXRPYmplY3QoKSkKKwkJCQlzYXdCID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlmYWlsKCJVbmV4cGVjdGVkIGJpbmRpbmcgXCIiICsgYi5nZXROYW1lKCkgKyAiXCIgdG8gIiArIGIuZ2V0T2JqZWN0KCkpOworCQkJKytjb3VudDsKKwkJfQorCQlhc3NlcnRFcXVhbHMoMywgY291bnQpOworCQlhc3NlcnRUcnVlKHNhd0EpOworCQlhc3NlcnRUcnVlKHNhd0IpOworCQkJCisJCS8vIFRlc3QgdW5iaW5kaW5nCisJCWNvbnRleHQudW5iaW5kKCJ1cm46YTp5Iik7CQkJCQkgICAgICAgLy8gVW5iaW5kIGl0CisJCXRyeSB7CisJCQljb250ZXh0Lmxvb2t1cCgidXJuOmE6eSIpOwkJCQkgICAgICAgLy8gTG9vayBpdCB1cAorCQkJZmFpbCgiRm91bmQgdW5ib3VuZCBvYmplY3QiKTsKKwkJfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGV4KSB7fQorCQlhc3NlcnRUcnVlKGExLmJpbmRpbmdzLmlzRW1wdHkoKSk7CQkJCSAgICAgICAvLyBJdCdzIG5vdCBpbiBhMS4uLgorCQlhc3NlcnRUcnVlKGEyLmJpbmRpbmdzLmlzRW1wdHkoKSk7CQkJCSAgICAgICAvLyAuLi5ub3IgaW4gYTIKKwl9CisKKwkvKiogRmlyc3QgZGVsZWdhdGUgY29udGV4dCBmb3IgInVybjphIiBuYW1lc3BhY2UuICovCisJcHJpdmF0ZSBUZXN0Q29udGV4dCBhMTsKKworCS8qKiBTZWNvbmQgZGVsZWdhdGUgY29udGV4dCBmb3IgInVybjphIiBuYW1lc3BhY2UuICovCisJcHJpdmF0ZSBUZXN0Q29udGV4dCBhMjsKKworCS8qKiBEZWxlZ2F0ZSBjb250ZXh0IGZvciAidXJuOmIiIG5hbWVzcGFjZS4gKi8KKwlwcml2YXRlIFRlc3RDb250ZXh0IGI7CisKKwkvKiogVGVzdCBzdWJqZWN0OiB0aGUgb2JqZWN0IGNvbnRleHQuICovCisJcHJpdmF0ZSBPYmplY3RDb250ZXh0IGNvbnRleHQ7CisKKwkvKiogVGVzdCBhbGlhcyBmaWxlLiAqLworCXByaXZhdGUgRmlsZSBhbGlhc0ZpbGU7CisKKwkvKiogT2xkIHZhbHVlIG9mIHN5cyBwcm9wIG9yZy5hcGFjaGUub29kdC5jb21tb25zLm9iamVjdC5qbmRpLmFsaWFzZXMuICovCisJcHJpdmF0ZSBTdHJpbmcgb2xkVmFsdWU7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9UZXN0Q29udGV4dC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvVGVzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWU1Y2M1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvb2JqZWN0L2puZGkvVGVzdENvbnRleHQuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMub2JqZWN0LmpuZGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4Lm5hbWluZy5CaW5kaW5nOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db21wb3NpdGVOYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lUGFyc2VyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5PcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CisKKy8qKgorICogQSBjb250ZXh0IGZvciB0ZXN0aW5nLiAgVGhpcyBjb250ZXh0IHVzZXMgYSBzaW1wbGUge0BsaW5rIE1hcH0gdG8gdHJhY2sgYmluZGluZ3MuCisgKiBOYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBnaXZlbiBwcmVmaXggc3RyaW5nIG9yIHRoZXkgY2F1c2Uge0BsaW5rCisgKiBJbnZhbGlkTmFtZUV4Y2VwdGlvbn1zLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKKyAqLworY2xhc3MgVGVzdENvbnRleHQgaW1wbGVtZW50cyBDb250ZXh0IHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRlc3RDb250ZXh0PC9jb2RlPiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBwcmVmaXggV2hhdCBldmVyeSBuYW1lIG11c3Qgc3RhcnQgd2l0aC4KKwkgKi8KKwlwdWJsaWMgVGVzdENvbnRleHQoU3RyaW5nIHByZWZpeCkgeworCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCXB1YmxpYyBPYmplY3QgbG9va3VwKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJT2JqZWN0IHJjID0gYmluZGluZ3MuZ2V0KG5hbWUpOworCQlpZiAocmMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOYW1lTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisJCXJldHVybiByYzsKKwl9CisJcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQliaW5kKG5hbWUudG9TdHJpbmcoKSwgb2JqKTsKKwl9CisJcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmICghbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigiTmFtZSBkb2Vzbid0IHN0YXJ0IHdpdGggIiArIHByZWZpeCk7CisJCWlmIChiaW5kaW5ncy5jb250YWluc0tleShuYW1lKSkKKwkJCXRocm93IG5ldyBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uKG5hbWUpOworCQliaW5kaW5ncy5wdXQobmFtZSwgb2JqKTsKKwl9CisJcHVibGljIHZvaWQgcmViaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJlYmluZChuYW1lLnRvU3RyaW5nKCksIG9iaik7CisJfQorCXB1YmxpYyB2b2lkIHJlYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmICghbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigiTmFtZSBkb2Vzbid0IHN0YXJ0IHdpdGggIiArIHByZWZpeCk7CisJCWJpbmRpbmdzLnB1dChuYW1lLCBvYmopOworCX0KKwlwdWJsaWMgdm9pZCB1bmJpbmQoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdW5iaW5kKG5hbWUudG9TdHJpbmcoKSk7CisJfQorCXB1YmxpYyB2b2lkIHVuYmluZChTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWlmIChiaW5kaW5ncy5yZW1vdmUobmFtZSkgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOYW1lTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisJfQorCXB1YmxpYyB2b2lkIHJlbmFtZShOYW1lIG9sZE5hbWUsIE5hbWUgbmV3TmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJlbmFtZShvbGROYW1lLnRvU3RyaW5nKCksIG5ld05hbWUudG9TdHJpbmcoKSk7CisJfQorCXB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAoIWJpbmRpbmdzLmNvbnRhaW5zS2V5KG9sZE5hbWUpKQorCQkJdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbihvbGROYW1lKTsKKwkJaWYgKGJpbmRpbmdzLmNvbnRhaW5zS2V5KG5ld05hbWUpKQorCQkJdGhyb3cgbmV3IE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24obmV3TmFtZSk7CisJCWlmICghbmV3TmFtZS5zdGFydHNXaXRoKHByZWZpeCkpCisJCQl0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oIk5hbWUgZG9lc24ndCBzdGFydCB3aXRoICIgKyBwcmVmaXgpOworCQliaW5kaW5ncy5wdXQobmV3TmFtZSwgYmluZGluZ3MucmVtb3ZlKG9sZE5hbWUpKTsKKwl9CisJcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxpc3QobmFtZS50b1N0cmluZygpKTsKKwl9CisJcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApCisJCQl0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJzdWJjb250ZXh0cyBub3Qgc3VwcG9ydGVkIik7CisJCWZpbmFsIEl0ZXJhdG9yIGkgPSBiaW5kaW5ncy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXJldHVybiBuZXcgTmFtaW5nRW51bWVyYXRpb24oKSB7CisJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisJCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKwkJCQlyZXR1cm4gbmV3IE5hbWVDbGFzc1BhaXIoKFN0cmluZykgZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmUoKSB7CisJCQkJcmV0dXJuIGkuaGFzTmV4dCgpOworCQkJfQorCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7fQorCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworCQkJCXJldHVybiBoYXNNb3JlKCk7CisJCQl9CisJCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgeworCQkJCXJldHVybiBuZXh0KCk7CisJCQl9CisJCX07CisJfQorCXB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoTmFtZSBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxpc3RCaW5kaW5ncyhuYW1lLnRvU3RyaW5nKCkpOworCX0KKwlwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJaWYgKG5hbWUubGVuZ3RoKCkgPiAwKQorCQkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigic3ViY29udGV4dHMgbm90IHN1cHBvcnRlZCIpOworCQlmaW5hbCBJdGVyYXRvciBpID0gYmluZGluZ3MuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQlyZXR1cm4gbmV3IE5hbWluZ0VudW1lcmF0aW9uKCkgeworCQkJcHVibGljIE9iamVjdCBuZXh0KCkgeworCQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisJCQkJcmV0dXJuIG5ldyBCaW5kaW5nKChTdHJpbmcpIGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkgeworCQkJCXJldHVybiBpLmhhc05leHQoKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGNsb3NlKCkge30KKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlyZXR1cm4gaGFzTW9yZSgpOworCQkJfQorCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwkJCQlyZXR1cm4gbmV4dCgpOworCQkJfQorCisJCX07CisJfQorCXB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCWRlc3Ryb3lTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisJfQorCXB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigic3ViY29udGV4dHMgbm90IHN1cHBvcnRlZCIpOworCX0KKwlwdWJsaWMgQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KE5hbWUgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisJfQorCXB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQl0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJzdWJjb250ZXh0cyBub3Qgc3VwcG9ydGVkIik7CisJfQorCXB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwTGluayhuYW1lLnRvU3RyaW5nKCkpOworCX0KKwlwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCQlyZXR1cm4gbG9va3VwKG5hbWUpOworCX0KKwlwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkgeworCQlyZXR1cm4gZ2V0TmFtZVBhcnNlcihuYW1lLnRvU3RyaW5nKCkpOworCX0KKwlwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuZXcgT2JqZWN0TmFtZVBhcnNlcigpOworCX0KKwlwdWJsaWMgU3RyaW5nIGNvbXBvc2VOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNvbXBvc2VOYW1lKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBuZXcgQ29tcG9zaXRlTmFtZShwcmVmaXgpKS50b1N0cmluZygpOworCX0KKwlwdWJsaWMgTmFtZSBjb21wb3NlTmFtZShOYW1lIG5hbWUsIE5hbWUgcHJlZml4KSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwkJTmFtZSByZXN1bHQgPSAoTmFtZSkgcHJlZml4LmNsb25lKCk7CisJCXJlc3VsdC5hZGRBbGwobmFtZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCXB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcga2V5LCBPYmplY3QgdmFsKSB7CisJCWlmIChlbnZpcm9ubWVudCA9PSBudWxsKSBlbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKKwkJcmV0dXJuIGVudmlyb25tZW50LnB1dChrZXksIHZhbCk7CisJfQorCXB1YmxpYyBPYmplY3QgcmVtb3ZlRnJvbUVudmlyb25tZW50KFN0cmluZyBrZXkpIHsKKwkJaWYgKGVudmlyb25tZW50ID09IG51bGwpIGVudmlyb25tZW50ID0gbmV3IEhhc2h0YWJsZSgpOworCQlyZXR1cm4gZW52aXJvbm1lbnQucmVtb3ZlKGtleSk7CisJfQorCXB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKSB7CisJCWlmIChlbnZpcm9ubWVudCA9PSBudWxsKSBlbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKKwkJcmV0dXJuIGVudmlyb25tZW50OworCX0KKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisJcHVibGljIFN0cmluZyBnZXROYW1lSW5OYW1lc3BhY2UoKSB7CisJCXJldHVybiAiIjsKKwl9CisKKwkvKiogV2hhdCBob2xkcyB0aGUgYmluZGluZ3MuICBLZXlzIGFyZSB7QGxpbmsgU3RyaW5nfXMsIHZhbHVlcyBhcmUge0BsaW5rIE9iamVjdH1zLiAqLworCU1hcCBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKiogV2hhdCBldmVyeSBrZXkgbXVzdCBzdGFydCB3aXRoLiAqLworCXByaXZhdGUgU3RyaW5nIHByZWZpeDsKKworCS8qKiBDb250ZXh0J3MgZW52aXJvbm1lbnQuICovCisJcHJpdmF0ZSBIYXNodGFibGUgZW52aXJvbm1lbnQ7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9UZXN0Q29udGV4dFRlc3QuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL29iamVjdC9qbmRpL1Rlc3RDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjE5NWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy9vYmplY3Qvam5kaS9UZXN0Q29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDk2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5vYmplY3Quam5kaTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5CaW5kaW5nOworaW1wb3J0IGphdmF4Lm5hbWluZy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHRoZSB0ZXN0IGNvbnRleHQuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAorICovCitwdWJsaWMgY2xhc3MgVGVzdENvbnRleHRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGVzdENvbnRleHRUZXN0PC9jb2RlPiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBjYXNlTmFtZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICovCisJcHVibGljIFRlc3RDb250ZXh0VGVzdChTdHJpbmcgY2FzZU5hbWUpIHsKKwkJc3VwZXIoY2FzZU5hbWUpOworCX0KKworCS8qKgorCSAqIFRlc3QgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSB0ZXN0IGNvbnRleHQuCisJICoKKwkgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFRlc3RDb250ZXh0KCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJCVRlc3RDb250ZXh0IGN0eCA9IG5ldyBUZXN0Q29udGV4dCgidXJuOng6Iik7CQkJICAgICAgIC8vIE1ha2UgaXQKKwkJdHJ5IHsKKwkJCWN0eC5sb29rdXAoInVybjp4OnkiKTsJCQkJCSAgICAgICAvLyBMb29rdXAgYSBub25leGlzdGVudCBiaW5kaW5nCisJCQlmYWlsKCJHb3QgYSBiaW5kaW5nIHRoYXQgZG9lc24ndCBleGlzdCIpOwkJICAgICAgIC8vIEdvdCBzb21ldGhpbmc/ICBZaWtlcy4KKwkJfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7fQorCisJCXRyeSB7CisJCQljdHguYmluZCgidXJuOnk6eiIsIHRoaXMpOwkJCQkgICAgICAgLy8gQmluZCBhbiBpbnZhbGlkIHByZWZpeAorCQkJZmFpbCgiQm91bmQgYW4gaW52YWxpZCBwcmVmaXgiKTsJCQkgICAgICAgLy8gV29ya2VkPyAgRGFuZy4KKwkJfSBjYXRjaCAoSW52YWxpZE5hbWVFeGNlcHRpb24gZXgpIHt9CisKKwkJY3R4LmJpbmQoInVybjp4OmEiLCB0aGlzKTsJCQkJCSAgICAgICAvLyBCaW5kIHNvbWV0aGluZy4KKwkJYXNzZXJ0U2FtZSh0aGlzLCBjdHgubG9va3VwKCJ1cm46eDphIikpOwkJCSAgICAgICAvLyBMb29rIGl0IHVwCisKKwkJdHJ5IHsKKwkJCWN0eC5iaW5kKCJ1cm46eDphIiwgZ2V0Q2xhc3MoKSk7CQkJICAgICAgIC8vIEJpbmQgaXQgYWdhaW4KKwkJCWZhaWwoIkFibGUgdG8gcmUtYmluZCIpOwkJCQkgICAgICAgLy8gV29ya2VkPyAgQ3JhcC4KKwkJfSBjYXRjaCAoTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBleCkge30KKworCQljdHgucmViaW5kKCJ1cm46eDphIiwgZ2V0Q2xhc3MoKSk7CQkJCSAgICAgICAvLyBSZWJpbmQgaXQgYWdhaW4KKwkJYXNzZXJ0U2FtZShnZXRDbGFzcygpLCBjdHgubG9va3VwKCJ1cm46eDphIikpOwkJCSAgICAgICAvLyBMb29rIGl0IHVwCisKKwkJY3R4LnJlbmFtZSgidXJuOng6YSIsICJ1cm46eDpiIik7CQkJCSAgICAgICAvLyBSZW5hbWUgdGhlIGJpbmRpbmcKKwkJYXNzZXJ0U2FtZShnZXRDbGFzcygpLCBjdHgubG9va3VwKCJ1cm46eDpiIikpOwkJCSAgICAgICAvLyBMb29rIGl0IHVwCisKKwkJTmFtaW5nRW51bWVyYXRpb24gZSA9IGN0eC5saXN0KCIiKTsJCQkJICAgICAgIC8vIExpc3QgdGhlIGNvbnRleHQKKwkJYXNzZXJ0VHJ1ZShlLmhhc01vcmUoKSk7CQkJCQkgICAgICAgLy8gR290IHNvbWV0aGluZz8gIEdvb2QuCisJCU5hbWVDbGFzc1BhaXIgcCA9IChOYW1lQ2xhc3NQYWlyKSBlLm5leHQoKTsJCQkgICAgICAgLy8gR2V0IGl0CisJCWFzc2VydEVxdWFscygidXJuOng6YiIsIHAuZ2V0TmFtZSgpKTsJCQkJICAgICAgIC8vIFJpZ2h0IG5hbWU/ICBHb29kLgorCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzcyIsIHAuZ2V0Q2xhc3NOYW1lKCkpOwkJICAgICAgIC8vIFJpZ2h0IGNsYXNzPyAgR29vZC4KKwkJYXNzZXJ0VHJ1ZSghZS5oYXNNb3JlKCkpOwkJCQkJICAgICAgIC8vIEdvdCBubyBtb3JlPyAgR29vZC4KKworCQllID0gY3R4Lmxpc3RCaW5kaW5ncygiIik7CQkJCQkgICAgICAgLy8gTGlzdCB0aGUgYmluZGluZ3MKKwkJYXNzZXJ0VHJ1ZShlLmhhc01vcmUoKSk7CQkJCQkgICAgICAgLy8gR290IHNvbWV0aGluZz8gIEdvb2QuCisJCUJpbmRpbmcgYiA9IChCaW5kaW5nKSBlLm5leHQoKTsJCQkJCSAgICAgICAvLyBHZXQgaXQKKwkJYXNzZXJ0RXF1YWxzKCJ1cm46eDpiIiwgcC5nZXROYW1lKCkpOwkJCQkgICAgICAgLy8gUmlnaHQgbmFtZT8gIEdvb2QuCisJCWFzc2VydFNhbWUoZ2V0Q2xhc3MoKSwgYi5nZXRPYmplY3QoKSk7CQkJCSAgICAgICAvLyBSaWdodCBvYmplY3Q/ICBHb29kLgorCQlhc3NlcnRUcnVlKCFlLmhhc01vcmUoKSk7CQkJCQkgICAgICAgLy8gR290IG5vIG1vcmU/ICBHb29kLgorCisJCWFzc2VydFNhbWUoZ2V0Q2xhc3MoKSwgY3R4Lmxvb2t1cExpbmsoInVybjp4OmIiKSk7CQkgICAgICAgLy8gTG9vayB1cCB2aWEgdGhlIGxpbmsKKworCQljdHgudW5iaW5kKCJ1cm46eDpiIik7CQkJCQkJICAgICAgIC8vIFVuYmluZCBpdAorCQllID0gY3R4Lmxpc3QoIiIpOwkJCQkJCSAgICAgICAvLyBMaXN0IHRoZSBjb250ZXh0CisJCWFzc2VydFRydWUoIWUuaGFzTW9yZSgpKTsJCQkJCSAgICAgICAvLyBHb3Qgbm8gbW9yZT8gIEdvb2QuCisJCWUgPSBjdHgubGlzdEJpbmRpbmdzKCIiKTsJCQkJCSAgICAgICAvLyBMaXN0IHRoZSBiaW5kaW5ncworCQlhc3NlcnRUcnVlKCFlLmhhc01vcmUoKSk7CQkJCQkgICAgICAgLy8gR290IG5vIG1vcmU/ICBHb29kLgorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvQmFzZTY0VGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9CYXNlNjRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1NGI2NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvQmFzZTY0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKy8qKiBVbml0IHRlc3QgdGhlIHtAbGluayBCYXNlNjR9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBCYXNlNjRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBCYXNlNjR9IGNsYXNzLiAqLworCXB1YmxpYyBCYXNlNjRUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKiBUZXN0IGVuY29kaW5nIGFuZCBkZWNvZGluZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RW5jRGVjKCkgeworCQlieXRlW10gYSA9IEJhc2U2NC5lbmNvZGUoImFiY2RlIi5nZXRCeXRlcygpKTsKKwkJYXNzZXJ0VHJ1ZSgiQmFzZS02NCBlbmNvZGluZyBmYWlsZWQiLCBBcnJheXMuZXF1YWxzKCJZV0pqWkdVPSIuZ2V0Qnl0ZXMoKSwgYSkpOworCQlieXRlW10gYiA9IEJhc2U2NC5kZWNvZGUoIllXSmpaR1U9Ii5nZXRCeXRlcygpKTsKKwkJYXNzZXJ0VHJ1ZSgiQmFzZS02NCBkZWNvZGluZyBmYWlsZWQiLCBBcnJheXMuZXF1YWxzKCJhYmNkZSIuZ2V0Qnl0ZXMoKSwgYikpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvQ2FjaGVNYXBUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0NhY2hlTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzgyZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL0NhY2hlTWFwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworCisvKiogVW5pdCB0ZXN0IHRoZSB7QGxpbmsgQ2FjaGVNYXB9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBDYWNoZU1hcFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIENhY2hlTWFwfSBjbGFzcy4gKi8KKwlwdWJsaWMgQ2FjaGVNYXBUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKiBUZXN0IHRoZSBjYWNoaW5nIG9wZXJhdGlvbi4gKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGUoKSB7CisJCUNhY2hlTWFwIGMgPSBuZXcgQ2FjaGVNYXAoMyk7CisJCWMucHV0KCJhbHBoYSIsICIxIik7CisJCWMucHV0KCJiZXRhIiwgIjIiKTsKKwkJYy5wdXQoImdhbW1hIiwgIjMiKTsKKwkJLy8gZ2FtbWEgYmV0YSBhbHBoYQorCQlhc3NlcnRFcXVhbHMoIjIiLCBjLmdldCgiYmV0YSIpKTsKKwkJLy8gYmV0YSBnYW1tYSBhbHBoYQorCQljLnB1dCgiZGVsdGEiLCAiNCIpOworCQkvLyBkZWx0YSBiZXRhIGdhbW1hCisJCWFzc2VydE51bGwoYy5nZXQoImFscGhhIikpOworCX0KKworCS8qKiBUZXN0IHRoZSB7QGxpbmsgQ2FjaGVNYXAjc2l6ZX0gYW5kIHtAbGluayBDYWNoZU1hcCNpc0VtcHR5fSBtZXRob2RzLiAqLworCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgeworCQlDYWNoZU1hcCBjID0gbmV3IENhY2hlTWFwKDMpOworCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOworCQlhc3NlcnRUcnVlKGMuaXNFbXB0eSgpKTsKKwkJYy5wdXQoImFscGhhIiwgIjEiKTsKKwkJLy8gYWxwaGEKKwkJYXNzZXJ0RXF1YWxzKDEsIGMuc2l6ZSgpKTsKKwkJYy5wdXQoImJldGEiLCAiMiIpOworCQkvLyBiZXRhIGFscGhhCisJCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7CisJCWMucHV0KCJnYW1tYSIsICIzIik7CisJCS8vIGdhbW1hIGJldGEgYWxwaGEKKwkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKKwkJYy5wdXQoImRlbHRhIiwgIjQiKTsKKwkJLy8gZGVsdGEgZ2FtbWEgYmV0YQorCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOworCQljLmNsZWFyKCk7CisJCWFzc2VydFRydWUoYy5pc0VtcHR5KCkpOworCX0KKworCS8qKiBUZXN0IHRoZSB7QGxpbmsgQ2FjaGVNYXAjY29udGFpbnNLZXl9IGFuZCB7QGxpbmsgQ2FjaGVNYXAjY29udGFpbnNWYWx1ZX0gbWV0aG9kcy4gKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisJCUNhY2hlTWFwIGMgPSBuZXcgQ2FjaGVNYXAoMyk7CisJCWMucHV0KCJhbHBoYSIsICIxIik7CisJCWMucHV0KCJiZXRhIiwgIjIiKTsKKwkJYy5wdXQoImdhbW1hIiwgIjMiKTsKKworCQlhc3NlcnRUcnVlKGMuY29udGFpbnNLZXkoImFscGhhIikpOworCQlhc3NlcnRUcnVlKCFjLmNvbnRhaW5zS2V5KCJodW5ndXMiKSk7CisJCWFzc2VydFRydWUoYy5jb250YWluc1ZhbHVlKCIyIikpOworCQlhc3NlcnRUcnVlKCFjLmNvbnRhaW5zVmFsdWUoIngiKSk7CisJfQorCisJLyoqIFRlc3QgdmFsdWUgcmVwbGFjZW1lbnQgZm9yIHRoZSBzYW1lIGtleS4gKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UmVQdXQoKSB7CisJCUNhY2hlTWFwIGMgPSBuZXcgQ2FjaGVNYXAoMyk7CisJCWMucHV0KCJhbHBoYSIsICIxIik7CisJCWMucHV0KCJiZXRhIiwgIjIiKTsKKwkJYy5wdXQoImdhbW1hIiwgIjMiKTsKKwkJLy8gKGdhbW1hLCAzKSAoYmV0YSwgMikgKGFscGhhLCAxKQorCQljLnB1dCgiYWxwaGEiLCAieCIpOworCQkvLyAoYWxwaGEsIHgpLCAoZ2FtbWEsIDMpIChiZXRhLCAyKQorCQlhc3NlcnRFcXVhbHMoIngiLCBjLmdldCgiYWxwaGEiKSk7CisJCS8vIChhbHBoYSwgeCksIChnYW1tYSwgMykgKGJldGEsIDIpCisJCWMucHV0KCJkZWx0YSIsICJ5Iik7CisJCS8vIChkZWx0YSwgeSkgKGFscGhhLCB4KSwgKGdhbW1hLCAzKQorCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOworCQlhc3NlcnROdWxsKGMuZ2V0KCJiZXRhIikpOworCX0KKworCS8qKiBUZXN0IHRoZSB7QGxpbmsgQ2FjaGVNYXAjcmVtb3ZlfSBtZXRob2QuICovCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKKwkJQ2FjaGVNYXAgYyA9IG5ldyBDYWNoZU1hcCgzKTsKKwkJYy5wdXQoImFscGhhIiwgIjEiKTsKKwkJYy5wdXQoImJldGEiLCAiMiIpOworCQljLnB1dCgiZ2FtbWEiLCAiMyIpOworCQkvLyBnYW1tYSBiZXRhIGFscGhhCisJCWMucHV0KCJkZWx0YSIsICI0Iik7CisJCS8vIGRlbHRhIGdhbW1hIGJldGEKKwkJYXNzZXJ0RXF1YWxzKCIzIiwgYy5yZW1vdmUoImdhbW1hIikpOworCQkvLyBkZWx0YSBiZXRhCisJCWFzc2VydE51bGwoYy5yZW1vdmUoImdhbW1hIikpOworCQlhc3NlcnROdWxsKGMucmVtb3ZlKCJhbHBoYSIpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyVGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9FbnRlcnByaXNlRW50aXR5UmVzb2x2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwZmRjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVW5pdCB0ZXN0IHRoZSBFbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIgY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIEVudGVycHJpc2VFbnRpdHlSZXNvbHZlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUgWE1MIGNsYXNzLgorCSAqCisJICogQHBhcmFtIG5hbWUgQ2FzZSBuYW1lCisJICovCisJcHVibGljIEVudGVycHJpc2VFbnRpdHlSZXNvbHZlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEgdGVtcG9yYXJ5IGZpbGUgYXMgdGhlIHRlc3QgZW50aXR5LgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRlc3REaXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJlZXQiLCAiLmRpciIpOworCQl0ZXN0RGlyLmRlbGV0ZSgpOworCQl0ZXN0RGlyLm1rZGlyKCk7CisJCXRlc3RGaWxlID0gbmV3IEZpbGUodGVzdERpciwgInRlc3QtZW50cnktZG8tbm90LXJlbW92ZS5kdGQiKTsKKwkJaWYgKCF0ZXN0RmlsZS5jcmVhdGVOZXdGaWxlKCkpCisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHRlc3RGaWxlICsgIiBhbHJlYWR5IGV4aXN0cywgYnV0IHNob3VsZG4ndCIpOworCX0KKworCS8qKgorCSAqIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgZW50aXR5IGFuZCB0ZXN0IGRpcmVjdG9yeS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb257CisJCXRlc3RGaWxlLmRlbGV0ZSgpOworCQl0ZXN0RGlyLmRlbGV0ZSgpOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKworCS8qKgorCSAqIFRlc3QgaWYgdGhlIGVudGl0eSBwYXJzZXIgd29ya3MgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5UGFyc2luZygpIHsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LWVudHJ5LWRvLW5vdC1yZW1vdmUuZHRkIiwKKwkJCUVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5lbnRpdGllcy5nZXQoIi0vL0pQTC8vRFREIFRFU1QgRU5UUlkgRE8gTk9UIFJFTU9WRS8vRU4iKSk7CisJfQorCisJLyoqCisJICogVGVzdCBpZiB0aGUgcmVzb2x2ZXIgY29tcHV0ZXMgZmlsZW5hbWVzIGJhc2VkIG9uIHB1YmxpYyBhbmQgc3lzdGVtIGlkZW50aWZpZXJzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaWxlbmFtZUNvbXB1dGF0aW9uKCkgeworCQlhc3NlcnROdWxsKEVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5jb21wdXRlRmlsZW5hbWUobnVsbCwgbnVsbCkpOworCQlhc3NlcnROdWxsKEVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5jb21wdXRlRmlsZW5hbWUobnVsbCwgInVua25vd24iKSk7CisJCWFzc2VydE51bGwoRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyLmNvbXB1dGVGaWxlbmFtZSgidW5rbm93biIsIG51bGwpKTsKKwkJYXNzZXJ0TnVsbChFbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIuY29tcHV0ZUZpbGVuYW1lKCJ1bmtub3duIiwgInVua25vd24iKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LWVudHJ5LWRvLW5vdC1yZW1vdmUuZHRkIiwKKwkJCUVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5jb21wdXRlRmlsZW5hbWUoIi0vL0pQTC8vRFREIFRFU1QgRU5UUlkgRE8gTk9UIFJFTU9WRS8vRU4iLCBudWxsKSk7CisJCWFzc2VydEVxdWFscygidGVzdC1lbnRyeS1kby1ub3QtcmVtb3ZlLmR0ZCIsCisJCQlFbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIuY29tcHV0ZUZpbGVuYW1lKG51bGwsICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvdGVzdC1lbnRyeS1kby1ub3QtcmVtb3ZlLmR0ZCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LWVudHJ5LWRvLW5vdC1yZW1vdmUuZHRkIiwKKwkJCUVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5jb21wdXRlRmlsZW5hbWUoIi0vL0pQTC8vRFREIFRFU1QgRU5UUlkgRE8gTk9UIFJFTU9WRS8vRU4iLAorCQkJCSJpbGxlZ2FsLXVybDp0ZXN0LWVudHJ5LWRvLW5vdC1yZW1vdmUuZHRkIikpOworCQlhc3NlcnRFcXVhbHMoInRlc3QtZW50cnktZG8tbm90LXJlbW92ZS5kdGQiLAorCQkJRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyLmNvbXB1dGVGaWxlbmFtZSgiaWxsZWdhbC1GUEkiLAorCQkJCSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvdGVzdC1lbnRyeS1kby1ub3QtcmVtb3ZlLmR0ZCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LWVudHJ5LWRvLW5vdC1yZW1vdmUuZHRkIiwKKwkJCUVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5jb21wdXRlRmlsZW5hbWUoIi0vL0pQTC8vRFREIFRFU1QgRU5UUlkgRE8gTk9UIFJFTU9WRS8vRU4iLAorCQkJCSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvdGVzdC1lbnRyeS1kby1ub3QtcmVtb3ZlLmR0ZCIpKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IGlmIHRoZSByZXNvbHZlciBmaW5kcyBhIGZpbGUgYmFzZWQgb24gYSBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZCBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaWxlRmluZGluZygpIHsKKwkJTGlzdCBkaXJzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0ZXN0RGlyLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHModGVzdEZpbGUsIEVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5maW5kRmlsZShkaXJzLCB0ZXN0RmlsZS5nZXROYW1lKCkpKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IGlmIHRoZSByZXNvbHZlciBjYW4gY29udmVydCBhIHN0cmluZyBzcGVjaWZpY2F0aW9uIG9mIGVudGl0eSByZWZlcmVuY2VzCisJICogaW50byBhIHtAbGluayBMaXN0fS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RGlyRmluZGluZygpIHsKKwkJTGlzdCBkaXJzID0gRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyLmdldEVudGl0eVJlZkRpcnMoIiIpOworCQlhc3NlcnRUcnVlKGRpcnMuaXNFbXB0eSgpKTsKKwkJZGlycyA9IEVudGVycHJpc2VFbnRpdHlSZXNvbHZlci5nZXRFbnRpdHlSZWZEaXJzKCIvdG1wLC91c3IvbG9jYWwveG1sIik7CisJCWFzc2VydEVxdWFscygyLCBkaXJzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiL3RtcCIsIGRpcnMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKCIvdXNyL2xvY2FsL3htbCIsIGRpcnMuZ2V0KDEpKTsKKwl9CisKKwkvKiogVGVzdCBkaXJlY3RvcnkgdG8gaG9sZCA8dmFyPnRlc3RGaWxlPC92YXI+LCB0aGUgdGVzdCBlbnRpdHkuICovCisJcHJpdmF0ZSBGaWxlIHRlc3REaXI7CisKKwkvKiogVGhlIHRlc3QgZW50aXR5LiAqLworCXByaXZhdGUgRmlsZSB0ZXN0RmlsZTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvTERBUFRlc3QuamF2YSBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvTERBUFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODc0NjQzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9MREFQVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKy8qKiBVbml0IHRlc3QgdGhlIHtAbGluayBMREFQfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgTERBUFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIExEQVB9IGNsYXNzLiAqLworCXB1YmxpYyBMREFQVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKiogVGVzdCB0aGUge0BsaW5rIExEQVAjdG9MREFQU3RyaW5nfSBtZXRob2QuICovCisJcHVibGljIHZvaWQgdGVzdFRvTERBUFN0cmluZygpIHsKKwkJU3RyaW5nIHN0ciA9ICJIZWxsbyAoV29ybGQpLCBcXEhvdyBhcmUgeW91Kj8iOworCQlTdHJpbmcgcmVzdWx0ID0gTERBUC50b0xEQVBTdHJpbmcoc3RyKTsKKwkJYXNzZXJ0RXF1YWxzKCJIZWxsbyBcXDI4V29ybGRcXDI5LCBcXDVjSG93IGFyZSB5b3VcXDJhPyIsIHJlc3VsdCk7CisJfQorfQorCmRpZmYgLS1naXQgYS8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1V0aWxpdHlUZXN0LmphdmEgYi8wLjEwL2NvbW1vbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY29tbW9ucy91dGlsL1V0aWxpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxYWE0NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvVXRpbGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVXRpbGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJcHVibGljIFV0aWxpdHlUZXN0KFN0cmluZyBjYXNlTmFtZSkgeworCQlzdXBlcihjYXNlTmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGUgdG9wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG9wZGlyIiwgIi5kaXIiKTsKKwkJdG9wLmRlbGV0ZSgpOworCQl0b3AubWtkaXIoKTsKKwkJRmlsZSBmMSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm5lc3RlZGRpciIsICIuZmlsZSIsIHRvcCk7CisJCUZpbGUgZjIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJuZXN0ZWRkaXIiLCAiLmZpbGUiLCB0b3ApOworCQlGaWxlIGQxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgibmVzdGVkZGlyIiwgIi5kaXIiLCB0b3ApOworCQlkMS5kZWxldGUoKTsKKwkJZDEubWtkaXIoKTsKKwkJRmlsZSBmMyA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm5lc3RlZGRpciIsICIuZmlsZSIsIGQxKTsKKwkJRmlsZSBkMiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm5lc3RlZGRpciIsICIuZGlyIiwgZDEpOworCQlkMi5kZWxldGUoKTsKKwkJZDIubWtkaXIoKTsKKwkJRmlsZSBmNCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm5lc3RlZGRpciIsICIuZmlsZSIsIGQyKTsKKworCQlhc3NlcnRUcnVlKFV0aWxpdHkuZGVsZXRlKHRvcCkpOworCQlhc3NlcnRUcnVlKCF0b3AuZXhpc3RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvWE1MVGVzdC5qYXZhIGIvMC4xMC9jb21tb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2NvbW1vbnMvdXRpbC9YTUxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyNmE4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jb21tb25zL3V0aWwvWE1MVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFVuaXQgdGVzdCB0aGUgWE1MIGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBYTUxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIFhNTCBjbGFzcy4gKi8KKwlwdWJsaWMgWE1MVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFhNTFRlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3Rlc3QueG1sIikpKTsKKwkJaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlyZWFkZXIuY2xvc2UoKTsKKwl9CisKKwkvKiogVGVzdCB0aGUge0BsaW5rIFhNTCNjcmVhdGVEb2N1bWVudH0gbWV0aG9kLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3REb2N1bWVudENyZWF0aW9uKCkgeworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJYXNzZXJ0VHJ1ZShkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCk7CisJfQorCisJLyoqIFRlc3QgdGhlIHtAbGluayBYTUwjY3JlYXRlRE9NUGFyc2VyfSBhbmQge0BsaW5rIFhNTCNzZXJpYWxpemV9IG1ldGhvZHMuCisJICovCisJcHVibGljIHZvaWQgdGVzdERPTSgpIHRocm93cyBFeGNlcHRpb24geworCQlET01QYXJzZXIgcCA9IFhNTC5jcmVhdGVET01QYXJzZXIoKTsKKwkJcC5wYXJzZShpbnB1dFNvdXJjZSk7CisJCURvY3VtZW50IGRvYyA9IHAuZ2V0RG9jdW1lbnQoKTsKKwkJZG9jLm5vcm1hbGl6ZSgpOworCQlhc3NlcnRFcXVhbHMoImxvZyIsIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRUYWdOYW1lKCkpOworCQlqYXZhLnV0aWwuemlwLkNSQzMyIGNyYyA9IG5ldyBqYXZhLnV0aWwuemlwLkNSQzMyKCk7CisJCVN0cmluZyByZXN1bHQgPSBYTUwuc2VyaWFsaXplKGRvYyk7CisJCWNyYy51cGRhdGUocmVzdWx0LmdldEJ5dGVzKCkpOworCQlsb25nIHZhbHVlID0gY3JjLmdldFZhbHVlKCk7CisJCWFzc2VydFRydWUoIlN0cmluZ2lmaWVkIERPTSBkb2N1bWVudCBDUkMgbWlzbWF0Y2gsIGdvdCB2YWx1ZSA9ICIgKyB2YWx1ZSwgMzg4MDQ4ODAzMEwgPT0gdmFsdWUgfHwgMjQzNTQxOTExNEwgPT0gdmFsdWUgfHwgLyogYWRkZWQgYnkgQ2hyaXMgTWF0dG1hbm46IHByZXR0eSBwcmludCBmaXggKi8zNjg4MzI4Mzg0TCA9PSB2YWx1ZSB8fCAvKiBvdGhlciBuZXdsaW5lIHRyZWF0bWVudCAqLyA3NTAyNjIxNjNMID09IHZhbHVlIHx8IDM3MzgyOTY0NjZMID09IHZhbHVlIC8qIEFwYWNoZSBpbmN1YmF0b3Igd2FybWVkIHVwIHRoZSBmaWxlLCBzbyBpdCBzdWZmZXJlZCB0aGVybWFsIGV4cGFuc2lvbiAqLyB8fCAxMTAyMDY5NTgxTCA9PSB2YWx1ZSAvKiBsZXdpc21jIGFuZCBoaXMgQUx2MiBoZWFkZXIuICovKTsKKwl9CisKKwkvKiogVGVzdCB0aGUge0BsaW5rIFhNTCNjcmVhdGVTQVhQYXJzZXJ9IG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U0FYUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNBWFBhcnNlciBwID0gWE1MLmNyZWF0ZVNBWFBhcnNlcigpOworCQlNeUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKKwkJcC5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKwkJcC5wYXJzZShpbnB1dFNvdXJjZSk7CisJCS8vIDI1IHJlZmVycyB0byB0aGUgMjUgZWxlbWVudHMgaW4gdGhlIHRlc3QueG1sIGRvY3VtZW50LgorCQlhc3NlcnRFcXVhbHMoMjUsIGhhbmRsZXIuZ2V0RWxlbWVudENvdW50KCkpOworCX0KKworCS8qKiBUZXN0IHRoZSB7QGxpbmsgWE1MI2R1bXAoUHJpbnRXcml0ZXIsTm9kZSl9IG1ldGhvZC4gKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RHVtcCgpIHRocm93cyBFeGNlcHRpb24geworCQlET01QYXJzZXIgcCA9IFhNTC5jcmVhdGVET01QYXJzZXIoKTsKKwkJcC5wYXJzZShpbnB1dFNvdXJjZSk7CisJCURvY3VtZW50IGRvYyA9IHAuZ2V0RG9jdW1lbnQoKTsKKwkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKwkJWE1MLmR1bXAocHJpbnRXcml0ZXIsIGRvYyk7CisJCXByaW50V3JpdGVyLmNsb3NlKCk7CisJCWphdmEudXRpbC56aXAuQ1JDMzIgY3JjID0gbmV3IGphdmEudXRpbC56aXAuQ1JDMzIoKTsKKwkJY3JjLnVwZGF0ZShzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKwkJbG9uZyB2YWx1ZSA9IGNyYy5nZXRWYWx1ZSgpOworCQlhc3NlcnRUcnVlKCJEdW1wZWQgRE9NIHRyZWUgQ1JDIG1pc21hdGNoOyBnb3QgIiArIHZhbHVlLCB2YWx1ZSA9PSA4Mjg3OTNMIHx8IHZhbHVlID09IDIyNDEzMTc2MDFMIHx8IHZhbHVlID09IDMyMDg5MzExNzBMIC8qIGxld2lzbWMgYW5kIGhpcyBBTHYyIGhlYWRlciAqLyk7CisJfQorCisJLyoqIFRlc3QgdGhlIHtAbGluayBYTUwjdW53cmFwcGVkVGV4dH0gbWV0aG9kLiAqLworCXB1YmxpYyB2b2lkIHRlc3RVbndyYXBwZWRUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURPTVBhcnNlciBwID0gWE1MLmNyZWF0ZURPTVBhcnNlcigpOworCQlwLnBhcnNlKGlucHV0U291cmNlKTsKKwkJRG9jdW1lbnQgZG9jID0gcC5nZXREb2N1bWVudCgpOworCQlkb2Mubm9ybWFsaXplKCk7CisKKwkJTm9kZSBub2RlID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKQorCQkJLmdldE5leHRTaWJsaW5nKCkuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkuZ2V0TmV4dFNpYmxpbmcoKS5nZXROZXh0U2libGluZygpLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygiR2VlYmEsIGdlZWJhLiAgR2VlYmEgZ2VlYmEgZ2VlYmEhICBHZWViYSwgZ2VlYmEsIGJsb29vcj8gQmxvb3JpZW4gYmxvcmVpbmRhISIsCisJCQlYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCWFzc2VydE51bGwoWE1MLnVud3JhcHBlZFRleHQobnVsbCkpOworCX0KKworCS8qKiBUZXN0IHRoZSB7QGxpbmsgWE1MI2FkZChOb2RlLFN0cmluZyxTdHJpbmcpfSBtZXRob2QuICovCisJcHVibGljIHZvaWQgdGVzdEFkZFN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInJvb3QiKTsKKwkJZG9jLmFwcGVuZENoaWxkKHJvb3QpOworCQlYTUwuYWRkKHJvb3QsICJjaGlsZCIsICJjaGlsZCB0ZXh0Iik7CisJCWFzc2VydEVxdWFscygiY2hpbGQiLCByb290LmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGlsZCB0ZXh0Iiwgcm9vdC5nZXRGaXJzdENoaWxkKCkuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKTsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSByb290LmdldENoaWxkTm9kZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkcmVuLmdldExlbmd0aCgpKTsKKwkJdHJ5IHsKKwkJCVhNTC5hZGQobnVsbCwgImNoaWxkIiwgImNoaWxkIHRleHQiKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisJCQlyZXR1cm47CisJCX0KKwkJZmFpbCgiQWRkaW5nIHRvIGEgbnVsbCBub2RlIHNob3VsZCBmYWlsIGJ5IHRocm93aW5nIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworCX0KKworCS8qKiBUZXN0IHRoZSB7QGxpbmsgWE1MI2FkZChOb2RlLFN0cmluZyxPYmplY3QpfSBtZXRob2QuICovCisJcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3Qgb2JqID0gbmV3IE9iamVjdCgpIHsKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJjaGlsZCB0ZXh0IjsKKwkJCX0KKwkJfTsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCUVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJyb290Iik7CisJCWRvYy5hcHBlbmRDaGlsZChyb290KTsKKwkJWE1MLmFkZChyb290LCAiY2hpbGQiLCBvYmopOworCQlhc3NlcnRFcXVhbHMoImNoaWxkIiwgcm9vdC5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hpbGQgdGV4dCIsIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5nZXRMZW5ndGgoKSk7CisJCXRyeSB7CisJCQlYTUwuYWRkKG51bGwsICJjaGlsZCIsIG9iaik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworCQkJcmV0dXJuOworCQl9CisJCWZhaWwoIkFkZGluZyB0byBhIG51bGwgbm9kZSBzaG91bGQgZmFpbCBieSB0aHJvd2luZyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKwl9CisJCisJLyoqIFRlc3QgdGhlIHtAbGluayBYTUwjZXNjYXBlfSBtZXRob2QuICovCisJcHVibGljIHZvaWQgdGVzdEVzY2FwZSgpIHsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBYTUwuZXNjYXBlKCIiKSk7CisJCWFzc2VydEVxdWFscygiU28gSSBzYWlkLCAmcXVvdDtTaGUgc2FpZCwgJmFwb3M7Qm90aCAzICZhbXA7IDIgYXJlICZsdDsgNSBidXQgJmd0OyAwJmFwb3M7IGJ1dCBoZSBzYWlkICYjNDM5ODE7IiwKKwkJCVhNTC5lc2NhcGUoIlNvIEkgc2FpZCwgXCJTaGUgc2FpZCwgJ0JvdGggMyAmIDIgYXJlIDwgNSBidXQgPiAwJyBidXQgaGUgc2FpZCBcdWFiY2QiKSk7CisJfQorCisKKwkvKiogVGVzdCB0aGUge0BsaW5rIFhNTCNnZXRET01JbXBsZW1lbnRhdGlvbn0gbWV0aG9kLiAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRET01JbXBsZW1lbnRhdGlvbigpIHsKKwkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IFhNTC5nZXRET01JbXBsZW1lbnRhdGlvbigpOworCQlhc3NlcnROb3ROdWxsKGltcGwpOworCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsMiA9IFhNTC5nZXRET01JbXBsZW1lbnRhdGlvbigpOworCQlhc3NlcnRTYW1lKGltcGwsIGltcGwyKTsKKwl9CisKKwkvKiogVXNlZCBieSB7QGxpbmsgI3Rlc3RTQVhQYXJzZXJ9ICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciB7CisJCXByaXZhdGUgaW50IGVsZW1lbnRDb3VudCA9IDA7CisJCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHJhd05hbWUpIHsKKwkJCSsrZWxlbWVudENvdW50OworCQl9CisJCXB1YmxpYyBpbnQgZ2V0RWxlbWVudENvdW50KCkgeworCQkJcmV0dXJuIGVsZW1lbnRDb3VudDsKKwkJfQorCX0KKworCS8qKiBSZWFkZXIgZm9yIHRoZSB0ZXN0IGRhdGEgZmlsZS4gKi8KKwlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjsKKworCS8qKiBJbnB1dCBzb3VyY2UgZm9yIHRoZSB7QGxpbmsgI3JlYWRlcn0uICovCisJcHJpdmF0ZSBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZTsKK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LW11bHRpc2VydmVyLnhtbCBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1tdWx0aXNlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhMzViYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1tdWx0aXNlcnZlci54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8bXVsdGlzZXJ2ZXIgeG1sbnM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi9lZG0tY29tbW9ucy94bWwvbXVsdGlzZXJ2ZXIiIGlkPSJ0ZXN0LmFwcCI+CisgIDxzZXJ2ZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLk11bHRpU2VydmVyVGVzdCRTdnIxIiBpZD0idXJuOmVkYTpybWk6VGVzdDEiIGJpbmQ9InRydWUiICAgLz4KKyAgPHNlcnZlciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuTXVsdGlTZXJ2ZXJUZXN0JFN2cjIiIGlkPSJ1cm46ZWRhOnJtaTpUZXN0MiIgYmluZD0iZmFsc2UiICAvPgorICA8c2VydmVyIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5NdWx0aVNlcnZlclRlc3QkU3ZyMyIgaWQ9InVybjplZGE6cm1pOlRlc3QzIiBiaW5kPSJyZWJpbmQiIC8+CisgIDxzZXJ2ZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLk11bHRpU2VydmVyVGVzdCRTdnI0IiBpZD0idXJuOmVkYTpybWk6VGVzdDQiIGJpbmQ9IjM2MDAwMCIgLz4KKyAgPHByb3BlcnRpZXM+CisgICAgPHByb3BlcnR5IG5hbWU9Im15LnNldHRpbmciPk15IFZhbHVlPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ibXkub3RoZXIuc2V0dGluZyI+TXkgT3RoZXIgVmFsdWU8L3Byb3BlcnR5PgorICA8L3Byb3BlcnRpZXM+Cis8L211bHRpc2VydmVyPgpkaWZmIC0tZ2l0IGEvMC4xMC9jb21tb25zL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LnhtbCBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFiYzcwZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29tbW9ucy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgbG9nIFsKKzwhRUxFTUVOVCBsb2cgKHN0cmVhbSopPgorPCFFTEVNRU5UIHN0cmVhbSAoc3RyZWFtSUQsIGFuYWx5c3QsIG1lc3NhZ2UqKT4KKzwhRUxFTUVOVCBzdHJlYW1JRCAoI1BDREFUQSk+Cis8IUVMRU1FTlQgYW5hbHlzdCAoI1BDREFUQSk+Cis8IUVMRU1FTlQgbWVzc2FnZSAoc2VydmVyLCBob3N0LCB0aW1lLCBjb2RlLCB0ZXh0KT4KKzwhRUxFTUVOVCBzZXJ2ZXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGhvc3QgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHRpbWUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGNvZGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHRleHQgKCNQQ0RBVEEpPgorXT4KKzxsb2c+CisgIDxzdHJlYW0+CisgICAgPHN0cmVhbUlEPjM8L3N0cmVhbUlEPgorICAgIDxhbmFseXN0Pmh5b248L2FuYWx5c3Q+CisKKyAgICA8bWVzc2FnZT4KKyAgICAgIDxzZXJ2ZXI+VERTPC9zZXJ2ZXI+CisgICAgICA8aG9zdD5sYXR0ZTwvaG9zdD4KKyAgICAgIDx0aW1lPjEzNTI8L3RpbWU+CisgICAgICA8Y29kZT4xMjE8L2NvZGU+CisgICAgICA8dGV4dD5HZWViYSwgZ2VlYmEuICBHZWViYSBnZWViYSBnZWViYSEgIEdlZWJhLCBnZWViYSwgYmxvb29yPworICAgICAgICBCbG9vcmllbiBibG9yZWluZGEhCisgICAgICA8L3RleHQ+CisgICAgPC9tZXNzYWdlPgorCisgICAgPG1lc3NhZ2U+CisgICAgICA8c2VydmVyPkluc3RydW1lbnQ8L3NlcnZlcj4KKyAgICAgIDxob3N0PnNvcnJlbnRvPC9ob3N0PgorICAgICAgPHRpbWU+MTM1MzwvdGltZT4KKyAgICAgIDxjb2RlPjIxMTwvY29kZT4KKyAgICAgIDx0ZXh0PkdlZWJhLCBibG9vci48L3RleHQ+CisgICAgPC9tZXNzYWdlPgorCisgIDwvc3RyZWFtPgorCisKKyAgPHN0cmVhbT4KKyAgICA8c3RyZWFtSUQ+NDwvc3RyZWFtSUQ+CisgICAgPGFuYWx5c3Q+a2VsbHk8L2FuYWx5c3Q+CisKKyAgICA8bWVzc2FnZT4KKyAgICAgIDxzZXJ2ZXI+QW5hbHlzdDwvc2VydmVyPgorICAgICAgPGhvc3Q+a2lsbGFtYW5qYXJvPC9ob3N0PgorICAgICAgPHRpbWU+MTM1NDwvdGltZT4KKyAgICAgIDxjb2RlPjIxMjwvY29kZT4KKyAgICAgIDx0ZXh0PldhaG9vPC90ZXh0PgorICAgIDwvbWVzc2FnZT4KKyAgPC9zdHJlYW0+Cis8L2xvZz4KZGlmZiAtLWdpdCBhLzAuMTAvY29yZS9wb20ueG1sIGIvMC4xMC9jb3JlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4MTJhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY29yZS9wb20ueG1sCkBAIC0wLDAgKzEsNDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8cGFyZW50PgorCSAgPGdyb3VwSWQ+b3JnLmFwYWNoZTwvZ3JvdXBJZD4KKwkgIDxhcnRpZmFjdElkPmFwYWNoZTwvYXJ0aWZhY3RJZD4KKwkgIDx2ZXJzaW9uPjE2PC92ZXJzaW9uPgorCSAgPHJlbGF0aXZlUGF0aCAvPgorCTwvcGFyZW50PiAgICAKKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPG5hbWU+T09EVCBDb3JlPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxvcmdhbml6YXRpb25Mb2dvPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbWFnZXMvZmVhdGhlci5naWY8L29yZ2FuaXphdGlvbkxvZ28+CisgICAgICAgIDxsb2dvPi9pbWFnZXMvJHtwcm9qZWN0LmFydGlmYWN0SWR9LmpwZzwvbG9nbz4KKyAgICAgICAgPHhkb2NWZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwveGRvY1ZlcnNpb24+CisgICAgICAgIDxnZW5Eb3dubG9hZExpbmtzPmZhbHNlPC9nZW5Eb3dubG9hZExpbmtzPgorICAgICAgICA8ZG9jc1NyYz4ke2Jhc2VkaXJ9L3NyYy9zaXRlL3hkb2M8L2RvY3NTcmM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgICAgICA8cHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QucmVwb3J0aW5nLm91dHB1dEVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKyAgICA8dXJsPmh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvPC91cmw+CisgICAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5KSVJBPC9zeXN0ZW0+CisgICAgICAgIDx1cmw+aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PT0RUPC91cmw+CisgICAgPC9pc3N1ZU1hbmFnZW1lbnQ+CisgICAgPGluY2VwdGlvblllYXI+MTk5OTwvaW5jZXB0aW9uWWVhcj4KKyAgICA8bWFpbGluZ0xpc3RzPgorICAgICAgICA8bWFpbGluZ0xpc3Q+CisgICAgICAgICAgICAgIDxuYW1lPmRldjwvbmFtZT4KKyAgICAgICAgICAgICAgPHN1YnNjcmliZT5kZXYtc3Vic2NyaWJlQG9vZHQuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgorICAgICAgICAgICAgICA8dW5zdWJzY3JpYmU+ZGV2LXVuc3Vic2NyaWJlQG9vZHQuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+CisgICAgICAgICAgICAgIDxwb3N0PmRldkBvb2R0LmFwYWNoZS5vcmc8L3Bvc3Q+CisgICAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvb29kdC1kZXYvPC9hcmNoaXZlPgorICAgICAgICA8L21haWxpbmdMaXN0PgorICAgICAgICA8bWFpbGluZ0xpc3Q+CisgICAgICAgICAgICAgIDxuYW1lPmNvbW1pdHM8L25hbWU+CisgICAgICAgICAgICAgIDxzdWJzY3JpYmU+Y29tbWl0cy1zdWJzY3JpYmVAb29kdC5hcGFjaGUub3JnPC9zdWJzY3JpYmU+CisgICAgICAgICAgICAgIDx1bnN1YnNjcmliZT5jb21taXRzLXVuc3Vic2NyaWJlQG9vZHQuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+CisgICAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvb29kdC1jb21taXRzLzwvYXJjaGl2ZT4KKyAgICAgICAgPC9tYWlsaW5nTGlzdD4KKyAgICAgICAgPG1haWxpbmdMaXN0PgorICAgICAgICAgICAgICA8bmFtZT5wcml2YXRlPC9uYW1lPgorICAgICAgICAgICAgICA8c3Vic2NyaWJlPnByaXZhdGUtc3Vic2NyaWJlQG9vZHQuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgorICAgICAgICAgICAgICA8dW5zdWJzY3JpYmU+cHJpdmF0ZS11bnN1YnNjcmliZUBvb2R0LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgorICAgICAgICAgICAgICA8cG9zdD5wcml2YXRlQG9vZHQuYXBhY2hlLm9yZzwvcG9zdD4KKyAgICAgICAgPC9tYWlsaW5nTGlzdD4KKyAgICA8L21haWxpbmdMaXN0cz4KKyAgICA8ZGV2ZWxvcGVycz4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD50aG9tYXM8L2lkPgorICAgICAgICAgICAgPG5hbWU+VGhvbWFzIEJlbm5ldHQ8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+dGhvbWFzQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5TS0EgU291dGggQWZyaWNhPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8dGltZXpvbmU+KzI8L3RpbWV6b25lPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPiAgICAKKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5jcmljaHRvbjwvaWQ+CisgICAgICAgICAgICA8bmFtZT5EYW5pZWwgQ3JpY2h0b248L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+Y3JpY2h0b25AYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPk5BU0EgSmV0IFByb3B1bHNpb24gTGFib3JhdG9yeTwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHRpbWV6b25lPi04PC90aW1lem9uZT4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5iZm9zdGVyPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkJyaWFuIEZvc3RlcjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5iZm9zdGVyQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Hb29nbGU8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4tODwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+ICAgICAKKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5qb3NodWFnYTwvaWQ+CisgICAgICAgICAgICA8bmFtZT5Kb3NodWEgR2FyY2lhPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPmpvc2h1YWdhQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Vbml2ZXJzaXR5IG9mIFNvdXRoZXJuIENhbGlmb3JuaWE8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4tODwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+ICAgICAgICAgICAKKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5nb29kYWxlPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkNhbWVyb24gR29vZGFsZTwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5nb29kYWxlQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5OQVNBIEpldCBQcm9wdWxzaW9uIExhYm9yYXRvcnk8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4tODwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxhaW0+bm9uZmx5dDwvYWltPgorICAgICAgICAgICAgICAgIDxndGFsaz5zaWdlcDMxMUBnbWFpbC5jb208L2d0YWxrPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5zaGFyZG1hbjwvaWQ+CisgICAgICAgICAgICA8bmFtZT5TZWFuIEhhcmRtYW48L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+c2hhcmRtYW5AYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPk5BU0EgSmV0IFByb3B1bHNpb24gTGFib3JhdG9yeTwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHRpbWV6b25lPi04PC90aW1lem9uZT4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4gICAgICAgIAorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPmFoYXJ0PC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkFuZHJldyBIYXJ0PC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPmFoYXJ0QGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5OQVNBIEpldCBQcm9wdWxzaW9uIExhYm9yYXRvcnk8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4tODwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+ICAKKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5kYXZla2FsZTwvaWQ+CisgICAgICAgICAgICA8bmFtZT5EYXZlIEthbGU8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+ZGF2ZWthbGVAYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPkNoaWxkcmVucyBIb3NwaXRhbCBMb3MgQW5nZWxlczwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHRpbWV6b25lPi04PC90aW1lem9uZT4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4gICAgICAgICAgICAgIAorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPmtlbGx5PC9pZD4KKyAgICAgICAgICAgIDxuYW1lPlNlYW4gS2VsbHk8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+a2VsbHlAYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly9zZWFua2VsbHkuYml6LzwvdXJsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JbmRlcGVuZGVudCBDb25zdWx0YW50PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgICAgIDxyb2xlPnRlY2hub2xvZ2lzdDwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgICAgICA8dGltZXpvbmU+LTY8L3RpbWV6b25lPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHBpY1VybD5odHRwOi8vc2VhbmtlbGx5LmJpei9NZW1iZXJzL2tlbGx5L3NlYW4ta2VsbHkvaW1hZ2U8L3BpY1VybD4KKyAgICAgICAgICAgICAgICA8YmxvZ1VybD5odHRwOi8vc2VhbmtlbGx5LmJpei9ibG9nPC9ibG9nVXJsPgorICAgICAgICAgICAgICAgIDxmb2FmPmh0dHA6Ly9zZWFua2VsbHkuYml6L01lbWJlcnMva2VsbHkvc2Vhbi1rZWxseXMtZm9hZjwvZm9hZj4KKyAgICAgICAgICAgICAgICA8YWltPkluc2FuaXR5UG9ldDwvYWltPgorICAgICAgICAgICAgICAgIDxza3lwZT5JbnNhbml0eVBvZXQ8L3NreXBlPgorICAgICAgICAgICAgICAgIDxndGFsaz5zZWFuLmMua2VsbHlAZ21haWwuY29tPC9ndGFsaz4KKyAgICAgICAgICAgICAgICA8bW9iaWxlbWU+c2Vhbi5jLmtlbGx5QG1lLmNvbTwvbW9iaWxlbWU+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPm1hdHRtYW5uPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkNocmlzIE1hdHRtYW5uPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPkNocmlzLk1hdHRtYW5uQGpwbC5uYXNhLmdvdjwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3ctc2NmLnVzYy5lZHUvfm1hdHRtYW5uLzwvdXJsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5OQVNBIEpldCBQcm9wdWxzaW9uIExhYm9yYXRvcnk8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4tODwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgICAgIDxyb2xlPm1lbnRvcjwvcm9sZT4KKyAgICAgICAgICAgICAgICA8cm9sZT5yZWxlYXNlIGVuZ2luZWVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8aWQ+cHJhbWlyZXo8L2lkPgorICAgICAgICAgICAgPG5hbWU+UGF1bCBSYW1pcmV6PC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPnByYW1pcmV6QGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5OQVNBIEpldCBQcm9wdWxzaW9uIExhYm9yYXRvcnk8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4tODwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8aWQ+c21jY2xlZXM8L2lkPgorICAgICAgICAgICAgPG5hbWU+U2VhbiBNY0NsZWVzZTwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5zbWNjbGVlc0BhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TkFTQSBKZXQgUHJvcHVsc2lvbiBMYWJvcmF0b3J5PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8dGltZXpvbmU+LTg8L3RpbWV6b25lPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPmdhYmU8L2lkPgorICAgICAgICAgICAgPG5hbWU+R2FiZSBSZXNuZWNrPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPmdhYnJpZWwubS5yZXNuZWNrQGpwbC5uYXNhLmdvdjwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPk5BU0EgSmV0IFByb3B1bHNpb24gTGFib3JhdG9yeTwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHRpbWV6b25lPi04PC90aW1lem9uZT4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4gICAgICAgIAorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPnB2ZWU8L2lkPgorICAgICAgICAgICAgPG5hbWU+UGF1bCBWZWU8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+cHZlZUBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Q2hpbGRyZW5zIEhvc3BpdGFsIExvcyBBbmdlbGVzPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8dGltZXpvbmU+LTg8L3RpbWV6b25lPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPnJpdmVybWE8L2lkPgorICAgICAgICAgICAgPG5hbWU+UmlzaGkgVmVybWE8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+cml2ZXJtYUBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TkFTQSBKZXQgUHJvcHVsc2lvbiBMYWJvcmF0b3J5PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8dGltZXpvbmU+LTg8L3RpbWV6b25lPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPndvb2xsYXJkPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkRhdmlkIFdvb2xsYXJkPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPndvb2xsYXJkQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Qcm9qZWN0IFdCUzwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHRpbWV6b25lPi04PC90aW1lem9uZT4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxpZD5zaXJpd2FyZGFuYTwvaWQ+CisgICAgICAgICAgICA8bmFtZT5SYWppdGggU2lyaXdhcmRhbmE8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+c2lyaXdhcmRhbmFAYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPkluZGVwZW5kZW50IENvbnN1bHRhbnQ8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDx0aW1lem9uZT4rNTozMDwvdGltZXpvbmU+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgPC9kZXZlbG9wZXJzPgorICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5BcGFjaGUgMjwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICAgICAgPGNvbW1lbnRzPlRoZSBzdGFuZGFyZCBPU0ktYXBwcm92ZWQgQXBhY2hlIGxpY2Vuc2UsIGZyaWVuZGx5IHRvIGNvbW1lcmNpYWwgaW50ZXJlc3RzIHlldCBvcGVuLjwvY29tbWVudHM+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPm1hbnVhbDwvZGlzdHJpYnV0aW9uPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKyAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgT09EVDwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vb29kdC5hcGFjaGUub3JnLzwvdXJsPgorICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDxzY20+CisgICAgCTxjb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL2NvcmU8L2Nvbm5lY3Rpb24+CisgICAgCTxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgCTx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9vb2R0L3RhZ3MvMC4xMC1yYzIvY29yZTwvdXJsPgorICAgIDwvc2NtPgorICAgIDxidWlsZD4KKyAgICAgICAgPHNvdXJjZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvdGVzdC9qYXZhPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lY2xpcHNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi45PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RW5jb2Rpbmc+VVRGLTg8L291dHB1dEVuY29kaW5nPgorICAgICAgICAgICAgICAgICAgICA8Y2hhcnNldD5VVEYtODwvY2hhcnNldD4KKyAgICAgICAgICAgICAgICAgICAgPGRvY2VuY29kaW5nPlVURi04PC9kb2NlbmNvZGluZz4KKyAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhZG9jPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm5ldC5hbGNoaW0zMS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpa2E8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGlrYS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTA8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpa2E8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGlrYS1wYXJzZXJzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5qZGsxLjg8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz4xLjg8L2pkaz4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxvdXRwdXRFbmNvZGluZz5VVEYtODwvb3V0cHV0RW5jb2Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxjaGFyc2V0PlVURi04PC9jaGFyc2V0PgorICAgICAgICAgICAgICAgICAgICA8ZG9jZW5jb2Rpbmc+VVRGLTg8L2RvY2VuY29kaW5nPgorICAgICAgICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphdmFkb2M8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxwYXJhbT4tWGRvY2xpbnQ6bm9uZTwvYWRkaXRpb25hbHBhcmFtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisKKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPiAgICAKKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICA8cmVwb3J0aW5nPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gRklYTUU6IGN1cnJlbnRseSBwcm9kdWNlcyBhIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQ+MTIzMTEwNzA8L2NvbXBvbmVudD4KKyAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb25JZHM+MTwvcmVzb2x1dGlvbklkcz4KKyAgICAgICAgICAgICAgICAgICAgPHN0YXR1c0lkcz41LDY8L3N0YXR1c0lkcz4KKyAgICAgICAgICAgICAgICAgICAgPGZpeFZlcnNpb25JZHM+JHtqaXJhLmZpeC52ZXJzaW9uLmlkc308L2ZpeFZlcnNpb25JZHM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxyZXBvcnRTZXRzPgorICAgICAgICAgICAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5qaXJhLXJlcG9ydDwvcmVwb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgICAgICA8L3BsdWdpbj4gLS0+CisgICAgICAgICAgICA8IS0tIFByb2R1Y2UgSmF2YURvYyAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi45PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RW5jb2Rpbmc+VVRGLTg8L291dHB1dEVuY29kaW5nPgorICAgICAgICAgICAgICAgICAgICA8Y2hhcnNldD5VVEYtODwvY2hhcnNldD4KKyAgICAgICAgICAgICAgICAgICAgPGRvY2VuY29kaW5nPlVURi04PC9kb2NlbmNvZGluZz4KKyAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgICAgICAgPGFnZ3JlZ2F0ZT50cnVlPC9hZ2dyZWdhdGU+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8IS0tIFByb2R1Y2UgU291cmNlIGNyb3NzIHJlZmVyZW5jZXMgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFnZ3JlZ2F0ZT50cnVlPC9hZ2dyZWdhdGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8IS0tIFVuaXQgdGVzdHMgcmVwb3J0IC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwhLS0gIlJlbGVhc2UgQXVkaXQiIHJlcG9ydCAoY2hlY2tzIGxpY2Vuc2UgaGVhZGVycyBldGMuKSAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtMzwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBGaW5kQnVncyBSZXBvcnQgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmZpbmRidWdzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx0aHJlc2hvbGQ+Tm9ybWFsPC90aHJlc2hvbGQ+CisgICAgICAgICAgICAgICAgICAgIDxlZmZvcnQ+RGVmYXVsdDwvZWZmb3J0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBDaGVja3N0eWxlIHJlcG9ydCAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLWNvbmZpZ0xvY2F0aW9uPmNoZWNrc3R5bGUueG1sPC9jb25maWdMb2NhdGlvbi0tPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlUnVsZXNTdW1tYXJ5PmZhbHNlPC9lbmFibGVSdWxlc1N1bW1hcnk+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8IS0tIFByb2plY3Qgd2Vic2l0ZSBnZW5lcmF0aW9uIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtNzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG91dHB1dEVuY29kaW5nPlVURi04PC9vdXRwdXRFbmNvZGluZz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvcmVwb3J0aW5nPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9jb3JlL3NyYy9zaXRlL3NpdGUueG1sIGIvMC4xMC9jb3JlL3NyYy9zaXRlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NvcmUvc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgICA8cHVibGlzaERhdGUgcG9zaXRpb249J2xlZnQnIGZvcm1hdD0nZGQtTU1NLXl5eXknLz4KKyAgICA8Ym9keT4KKyAgICAgICAgPG1lbnUgcmVmPSdyZXBvcnRzJy8+CisgICAgPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3BvbS54bWwgYi8wLjEwL2NyYXdsZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGVhYjBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3BvbS54bWwKQEAgLTAsMCArMSwxOTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisJCTxyZWxhdGl2ZVBhdGg+Li4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisJPC9wYXJlbnQ+CisJPGFydGlmYWN0SWQ+Y2FzLWNyYXdsZXI8L2FydGlmYWN0SWQ+CisJPG5hbWU+Q2F0YWxvZyBhbmQgQXJjaGl2ZSBDcmF3bGluZyBGcmFtZXdvcms8L25hbWU+CisJPGRlc2NyaXB0aW9uPlRoZSBDYXRhbG9nIGFuZCBBcmNoaXZlIFNlcnZpY2UgQ3Jhd2xpbmcgRnJhbWV3b3JrLjwvZGVzY3JpcHRpb24+CisJPHNjbT4KKwkJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvY3Jhd2xlcjwvY29ubmVjdGlvbj4KKwkJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvY3Jhd2xlcjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKwkJPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjEwLXJjMi9jcmF3bGVyPC91cmw+CisJPC9zY20+CisJPGJ1aWxkPgorCQk8cGx1Z2lucz4KKwkJCTxwbHVnaW4+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPGZvcmtNb2RlPnBlcnRlc3Q8L2ZvcmtNb2RlPgorCQkJCQk8dXNlU3lzdGVtQ2xhc3NMb2FkZXI+ZmFsc2U8L3VzZVN5c3RlbUNsYXNzTG9hZGVyPgorCQkJCQk8c3lzdGVtUHJvcGVydGllcz4KKwkJCQkJCTxwcm9wZXJ0eT4KKwkJCQkJCQk8bmFtZT5qYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZTwvbmFtZT4KKwkJCQkJCQk8dmFsdWU+JHtiYXNlZGlyfS9zcmMvdGVzdGRhdGEvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXM8L3ZhbHVlPgorCQkJCQkJPC9wcm9wZXJ0eT4KKwkJCQkJPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorCQkJCQk8Zm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+MDwvZm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+CisJCQkJCTxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgorCQkJCQk8aW5jbHVkZXM+CisJCQkJCQk8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKwkJCQkJPC9pbmNsdWRlcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8ZGVzY3JpcHRvcnM+CisJCQkJCQk8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisJCQkJCTwvZGVzY3JpcHRvcnM+CisJCQkJCTxhcmNoaXZlPgorCQkJCQkJPG1hbmlmZXN0PgorCQkJCQkJCTxtYWluQ2xhc3M+b3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5DcmF3bGVyTGF1bmNoZXI8L21haW5DbGFzcz4KKwkJCQkJCTwvbWFuaWZlc3Q+CisJCQkJCTwvYXJjaGl2ZT4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCTwvcGx1Z2lucz4KKwkJPHJlc291cmNlcz4KKwkJCTxyZXNvdXJjZT4KKwkJCQk8dGFyZ2V0UGF0aD5vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsPC90YXJnZXRQYXRoPgorCQkJCTxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKwkJCQk8aW5jbHVkZXM+CisJCQkJCTxpbmNsdWRlPmFjdGlvbi1iZWFucy54bWw8L2luY2x1ZGU+CisJCQkJCTxpbmNsdWRlPmNyYXdsZXItYmVhbnMueG1sPC9pbmNsdWRlPgorCQkJCQk8aW5jbHVkZT5jcmF3bGVyLWNvbmZpZy54bWw8L2luY2x1ZGU+CisJCQkJCTxpbmNsdWRlPnByZWNvbmRpdGlvbi1iZWFucy54bWw8L2luY2x1ZGU+CisJCQkJPC9pbmNsdWRlcz4KKwkJCTwvcmVzb3VyY2U+CisJCTwvcmVzb3VyY2VzPgorCTwvYnVpbGQ+CisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhcy1jbGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FzLWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FzLXdvcmtmbG93PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNS40PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNS40PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi41LjQ8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My4wPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPnhtbHJwYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnhtbHJwYzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9tYWlsPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS44LjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVhc3ltb2NrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWFzeW1vY2s8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2MmU5MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YXNzZW1ibHk+CisJPGlkPmRpc3Q8L2lkPgorCTxmb3JtYXRzPgorCQk8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorCQk8Zm9ybWF0PnppcDwvZm9ybWF0PgorCTwvZm9ybWF0cz4KKwk8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisJPGJhc2VEaXJlY3Rvcnk+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4KKwk8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5PgorCTxmaWxlU2V0cz4KKwkJPGZpbGVTZXQ+CisJCQk8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGluY2x1ZGVzPgorCQkJCTxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorCQkJCTxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorCQkJPC9pbmNsdWRlcz4KKwkJPC9maWxlU2V0PgorCQk8ZmlsZVNldD4KKwkJCTxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9iaW48L2RpcmVjdG9yeT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisJCQk8aW5jbHVkZXMgLz4KKwkJCTxmaWxlTW9kZT43NTU8L2ZpbGVNb2RlPgorCQk8L2ZpbGVTZXQ+CisJCTxmaWxlU2V0PgorCQkJPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKwkJCTxpbmNsdWRlcz4KKwkJCQk8aW5jbHVkZT5sb2dnaW5nLnByb3BlcnRpZXM8L2luY2x1ZGU+CisJCQk8L2luY2x1ZGVzPgorCQk8L2ZpbGVTZXQ+CisJCTxmaWxlU2V0PgorCQkJPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJPG91dHB1dERpcmVjdG9yeT5sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisJCQk8aW5jbHVkZXM+CisJCQkJPGluY2x1ZGU+UkVNT1ZFLmxvZzwvaW5jbHVkZT4KKwkJCTwvaW5jbHVkZXM+CisJCTwvZmlsZVNldD4KKwkJPGZpbGVTZXQ+CisJCQk8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzPC9kaXJlY3Rvcnk+CisJCQk8b3V0cHV0RGlyZWN0b3J5PnBvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGluY2x1ZGVzPgorCQkJCTxpbmNsdWRlPioueG1sPC9pbmNsdWRlPgorCQkJPC9pbmNsdWRlcz4KKwkJPC9maWxlU2V0PgorCQk8ZmlsZVNldD4KKwkJCTxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+cG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisJCQk8aW5jbHVkZXM+CisJCQkJPGluY2x1ZGU+Ki54bWw8L2luY2x1ZGU+CisJCQk8L2luY2x1ZGVzPgorCQk8L2ZpbGVTZXQ+CisJCTxmaWxlU2V0PgorCQkJPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9leHRlcm4tc2NyaXB0czwvZGlyZWN0b3J5PgorCQkJPG91dHB1dERpcmVjdG9yeT5wb2xpY3kvZXh0ZXJuLXNjcmlwdHM8L291dHB1dERpcmVjdG9yeT4KKwkJCTxpbmNsdWRlcyAvPgorCQk8L2ZpbGVTZXQ+CisJPC9maWxlU2V0cz4KKwk8ZGVwZW5kZW5jeVNldHM+CisJCTxkZXBlbmRlbmN5U2V0PgorCQkJPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKwkJCTx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKwkJCTx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorCQkJPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKwkJCTx1bnBhY2tPcHRpb25zIC8+CisJCTwvZGVwZW5kZW5jeVNldD4KKwk8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9iaW4vY3Jhd2xjdGwgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vYmluL2NyYXdsY3RsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzQzZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vYmluL2NyYXdsY3RsCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworamF2YSAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPS4uL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmRhZW1vbi5DcmF3bERhZW1vbkNvbnRyb2xsZXIgJCoKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9iaW4vY3Jhd2xlcl9sYXVuY2hlciBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9iaW4vY3Jhd2xlcl9sYXVuY2hlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdmODI0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2Jpbi9jcmF3bGVyX2xhdW5jaGVyCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZiBbIC16ICRKQVZBX0hPTUUgXSA7IHRoZW4KKyAgICAgICAgSkFWQV9IT01FPS9wYXRoL3RvL2phdmEvaG9tZQorZWxzZQorICAgICAgICBKQVZBX0hPTUU9JHtKQVZBX0hPTUV9CitmaQorCitleHBvcnQgSkFWQV9IT01FCisKKyRKQVZBX0hPTUUvYmluL2phdmEgXAorICAgICAgICAtRGphdmEuZXh0LmRpcnM9Li4vbGliIFwKKyAgICAgICAgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmJlYW4ucmVwbz0uLi9wb2xpY3kvY3Jhd2xlci1jb25maWcueG1sIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZz0uLi9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnPS4uL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBcCisJCS1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9L3BhdGgvdG8vZmlsZW1nci9wcm9wZXJ0aWVzIFwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5DcmF3bGVyTGF1bmNoZXIgJCoKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL0F1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDM3YmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL0F1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnR5cGVkZXRlY3Rpb24uTWV0RXh0cmFjdG9yU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnR5cGVkZXRlY3Rpb24uTWltZUV4dHJhY3RvckNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnR5cGVkZXRlY3Rpb24uTWltZUV4dHJhY3RvclJlcG87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5maWxlbmFtaW5nLk5hbWluZ0NvbnZlbnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLlByZUNvbmRFdmFsVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NaW1lVHlwZTsgLy9mb3IgamF2YWRvYworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8qKgorICogPHA+CisgKiBBIHtAbGluayBQcm9kdWN0Q3Jhd2xlcn0gdGhhdCB1c2VzIGEgc3VpdGUgb2YgZmlsZXMgdG8gZGVmaW5lIGl0cyBjcmF3bGluZworICogYW5kIGluZ2VzdGlvbiBwb2xpY3k6CisgKiAKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5hY3Rpb25zLW1hcC54bWw8L2NvZGU+IC0gVGhpcyBmaWxlIGlzIGFuIFhNTCBzcGVjaWZpY2F0aW9uIGZvcgorICogYWN0aW9ucyB0aGF0IHRoZSBjcmF3bGVyIHNob3VsZCB0YWtlIGluIHJlc3BvbnNlIHRvIGl0cyAzIGxpZmVjeWNsZSBwaGFzZXM6CisgKiBwcmVJbmdlc3QsIHBvc3RJbmdlc3RTdWNjZXNzLCBhbmQgcG9zdEluZ2VzdEZhaWwuIDwvbGk+CisgKiA8bGk+PGNvZGU+bWV0LWV4dHItcHJlY29uZGl0aW9ucy54bWw8L2NvZGU+IC0gVGhpcyBmaWxlIGRlZmluZXMKKyAqIHByZWNvbmRpdGlvbnMgdGhhdCB7QGxpbmsgTWV0RXh0cmFjdG9yfXMgbXVzdCBwYXNzIGJlZm9yZSBiZWluZyBjYWxsZWQgYnkKKyAqIHRoZSBBdXRvRGV0ZWN0Q3Jhd2xlci4gPC9saT4KKyAqIDxsaT48Y29kZT5taW1lLWV4dHJhY3Rvci1tYXAueG1sPC9jb2RlPiAtIFRoaXMgZmlsZSBtYXBzIHtAbGluayBNaW1lVHlwZX0KKyAqIG5hbWVzIHRvIG5hbWVzIG9mIHtAbGluayBNZXRFeHRyYWN0b3J9cyB0byBjYWxsIGZvciBhIHBhcnRpY3VsYXIKKyAqIHtAbGluayBQcm9kdWN0fSB7QGxpbmsgRmlsZX0gYXMgaXQgaXMgZW5jb3VudGVyZWQgZHVyaW5nIGEgY3Jhd2wgKGUuZy4sCisgKiBhc3N1bWluZyB0aGF0IHtAbGluayBNZXRhZGF0YX0gbmVlZHMgdG8gYmUgZ2VuZXJhdGVkLCBhcyBvcHBvc3NlZCB0byBiZWluZworICogYXZhaWxhYmxlIGFwcmlvcmkpLiBTZWUKKyAqIDxjb2RlPi4vc3JjL3Jlc291cmNlcy9leGFtcGxlcy9taW1lLWV4dHJhY3Rvci1tYXAueG1sPC9jb2RlPiBmb3IgYW4gZXhhbXBsZQorICogb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUuIDwvbGk+CisgKiA8bGk+PGNvZGU+bWltZXR5cGVzLnhtbDwvY29kZT4gLSBBbiA8YQorICogaHJlZj0iaHR0cDovL3Rpa2EuYXBhY2hlLm9yZy8iPkFwYWNoZSBUaWthPC9hPiBzdHlsZSBtaW1ldHlwZXMKKyAqIGZpbGUsIGF1Z21lbnRlZCB3aXRoIHRoZSBhYmlsaXR5IHRvIGhhdmUgYXJiaXRyYXJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdAorICogZGVmaW5lIGEgcGFydGljdWxhciB7QGxpbmsgUHJvZHVjdH0ge0BsaW5rIE1pbWVUeXBlfS4gVGhpcyB7QGxpbmsgTWltZVR5cGV9CisgKiBpcyB0aGVuIG1hcHBlZCB0byBhbiBleHRyYWN0b3IgdmFpIHRoZSA8Y29kZT5taW1lLWV4dHJhY3Rvci1tYXAueG1sPC9jb2RlPgorICogZmlsZSwgZGVzY3JpYmVkIGFib3ZlLiA8L2xpPgorICogPC9wPi4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIGV4dGVuZHMgUHJvZHVjdENyYXdsZXIgaW1wbGVtZW50cworICAgICAgQ29yZU1ldEtleXMgeworCisgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEVTX0hJRVJBUkNIWSA9ICJNaW1lVHlwZXNIaWVyYXJjaHkiOyAKKworICAgcHJpdmF0ZSBNaW1lRXh0cmFjdG9yUmVwbyBtaW1lRXh0cmFjdG9yUmVwbzsKKworICAgQE92ZXJyaWRlCisgICBwcm90ZWN0ZWQgTWV0YWRhdGEgZ2V0TWV0YWRhdGFGb3JQcm9kdWN0KEZpbGUgcHJvZHVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBMaXN0PE1ldEV4dHJhY3RvclNwZWM+IHNwZWNzID0gdGhpcy5taW1lRXh0cmFjdG9yUmVwbworICAgICAgICAgICAgLmdldEV4dHJhY3RvclNwZWNzRm9yRmlsZShwcm9kdWN0KTsKKyAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShNSU1FX1RZUEVTX0hJRVJBUkNIWSwKKyAgICAgICAgICAgIG1pbWVFeHRyYWN0b3JSZXBvLmdldE1pbWVUeXBlcyhwcm9kdWN0KSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICBNZXRhZGF0YSBtID0gKChNZXRFeHRyYWN0b3JTcGVjKSBzcGVjcy5nZXQoaSkpLmdldE1ldEV4dHJhY3RvcigpCisgICAgICAgICAgICAgICAuZXh0cmFjdE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICAgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEobS5nZXRIYXNodGFibGUoKSwgdHJ1ZSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbWV0YWRhdGE7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFzc2VzUHJlY29uZGl0aW9ucyhGaWxlIHByb2R1Y3QpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBMaXN0PE1ldEV4dHJhY3RvclNwZWM+IHNwZWNzID0gdGhpcy5taW1lRXh0cmFjdG9yUmVwbworICAgICAgICAgICAgICAgLmdldEV4dHJhY3RvclNwZWNzRm9yRmlsZShwcm9kdWN0KTsKKyAgICAgICAgIGlmIChzcGVjcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAodGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICBQcmVDb25kRXZhbFV0aWxzIGV2YWxVdGlscyA9IG5ldyBQcmVDb25kRXZhbFV0aWxzKAorICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJlQ29uZENvbXBhcmF0b3JJZHMgPSAoKE1ldEV4dHJhY3RvclNwZWMpIHNwZWNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGkpKS5nZXRQcmVDb25kQ29tcGFyYXRvcklkcygpOworICAgICAgICAgICAgICAgICAgaWYgKCFldmFsVXRpbHMuZXZhbChwcmVDb25kQ29tcGFyYXRvcklkcywgcHJvZHVjdCkpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJObyBleHRyYWN0b3Igc3BlY3Mgc3BlY2lmaWVkIGZvciAiCisgICAgICAgICAgICAgICAgICArIHByb2R1Y3QpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXZhbHVhdGUgcHJlY29uZGl0aW9ucyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHJvdGVjdGVkIEZpbGUgcmVuYW1lUHJvZHVjdChGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgU3RyaW5nIG5hbWluZ0NvbnZlbnRpb25JZCA9IG1pbWVFeHRyYWN0b3JSZXBvCisgICAgICAgICAgICAuZ2V0TmFtaW5nQ29udmVudGlvbklkKG1pbWVFeHRyYWN0b3JSZXBvLmdldE1pbWVUeXBlKHByb2R1Y3QpKTsKKyAgICAgIGlmIChuYW1pbmdDb252ZW50aW9uSWQgIT0gbnVsbCkgeworICAgICAgICAgTmFtaW5nQ29udmVudGlvbiBuYW1pbmdDb252ZW50aW9uID0gKE5hbWluZ0NvbnZlbnRpb24pIGdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAuZ2V0QmVhbihuYW1pbmdDb252ZW50aW9uSWQpOworICAgICAgICAgcmV0dXJuIG5hbWluZ0NvbnZlbnRpb24ucmVuYW1lKHByb2R1Y3QsIHByb2R1Y3RNZXRhZGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIHByb2R1Y3Q7CisgICAgICB9CisgICB9CisKKyAgIEBSZXF1aXJlZAorICAgcHVibGljIHZvaWQgc2V0TWltZUV4dHJhY3RvclJlcG8oU3RyaW5nIG1pbWVFeHRyYWN0b3JSZXBvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMubWltZUV4dHJhY3RvclJlcG8gPSBNaW1lRXh0cmFjdG9yQ29uZmlnUmVhZGVyCisgICAgICAgICAgICAucmVhZChtaW1lRXh0cmFjdG9yUmVwbyk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL0NyYXdsZXJMYXVuY2hlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9DcmF3bGVyTGF1bmNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQ2ODJjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9DcmF3bGVyTGF1bmNoZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuQ21kTGluZVV0aWxpdHk7CisKKy8qKgorICogQSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIHRvIHRoZSBuZXcgU3ByaW5nIGVuYWJsZWQgY3Jhd2xlci4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAc2luY2UgT09EVC0xOTAKKyAqLworcHVibGljIGNsYXNzIENyYXdsZXJMYXVuY2hlciB7CisKKyAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBDbWRMaW5lVXRpbGl0eSBjbWRMaW5lVXRpbGl0eSA9IG5ldyBDbWRMaW5lVXRpbGl0eSgpOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKGFyZ3MpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZThiYzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL01ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5maWxlbmFtaW5nLk5hbWluZ0NvbnZlbnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLlByZUNvbmRpdGlvbkNvbXBhcmF0b3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlJlcXVpcmVkOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgdmFyaWFudCBvZiB0aGUgU3RhbmRhcmQgUHJvZHVjdCBDcmF3bGVyIHdoZXJlIC5tZXQgZmlsZXMgYXJlIGdlbmVyYXRlZCBvbgorICogdGhlIGZseSBhcyBwcm9kdWN0IGZpbGVzIGFyZSBlbmNvdW50ZXJlZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIE1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIGV4dGVuZHMgUHJvZHVjdENyYXdsZXIgeworCisgICAgcHJpdmF0ZSBNZXRFeHRyYWN0b3IgbWV0RXh0cmFjdG9yOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0RXh0cmFjdG9yQ29uZmlnOworCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJlQ29uZElkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtaW5nQ29udmVudGlvbklkOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE1ldGFkYXRhIGdldE1ldGFkYXRhRm9yUHJvZHVjdChGaWxlIHByb2R1Y3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbWV0RXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShwcm9kdWN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXNzZXNQcmVjb25kaXRpb25zKEZpbGUgcHJvZHVjdCkgeworICAgICAgICBpZiAodGhpcy5nZXRQcmVDb25kSWRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJlQ29uZElkIDogdGhpcy5nZXRQcmVDb25kSWRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoISgoUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjw/PikgdGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJlYW4ocHJlQ29uZElkKSkucGFzc2VzKHByb2R1Y3QpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2R1Y3QuZXhpc3RzKCkgJiYgcHJvZHVjdC5sZW5ndGgoKSA+IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgcmVuYW1lUHJvZHVjdChGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICBpZiAoZ2V0TmFtaW5nQ29udmVudGlvbklkKCkgIT0gbnVsbCkgeworICAgICAgICAgIE5hbWluZ0NvbnZlbnRpb24gbmFtaW5nQ29udmVudGlvbiA9IChOYW1pbmdDb252ZW50aW9uKQorICAgICAgICAgICAgICAgIGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldEJlYW4oZ2V0TmFtaW5nQ29udmVudGlvbklkKCkpOworICAgICAgICAgIGlmIChuYW1pbmdDb252ZW50aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOYW1pbmdDb252ZW50aW9uIElkICciICsgZ2V0TmFtaW5nQ29udmVudGlvbklkKCkKKyAgICAgICAgICAgICAgICAgICArICInIGlzIG5vdCBkZWZpbmVkIik7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBuYW1pbmdDb252ZW50aW9uLnJlbmFtZShwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHByb2R1Y3Q7CisgICAgICAgfQorICAgIH0KKworICAgIEBSZXF1aXJlZAorICAgIHB1YmxpYyB2b2lkIHNldE1ldEV4dHJhY3RvcihTdHJpbmcgbWV0RXh0cmFjdG9yKQorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5tZXRFeHRyYWN0b3IgPSAoTWV0RXh0cmFjdG9yKSBDbGFzcy5mb3JOYW1lKG1ldEV4dHJhY3RvcikKKyAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKG1ldEV4dHJhY3RvckNvbmZpZyAhPSBudWxsICYmICFtZXRFeHRyYWN0b3JDb25maWcuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHRoaXMubWV0RXh0cmFjdG9yLnNldENvbmZpZ0ZpbGUobWV0RXh0cmFjdG9yQ29uZmlnKTsKKyAgICB9CisKKyAgICBAUmVxdWlyZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRFeHRyYWN0b3JDb25maWcoU3RyaW5nIG1ldEV4dHJhY3RvckNvbmZpZykKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5tZXRFeHRyYWN0b3JDb25maWcgPSBtZXRFeHRyYWN0b3JDb25maWc7CisgICAgICAgIGlmICh0aGlzLm1ldEV4dHJhY3RvciAhPSBudWxsICYmIG1ldEV4dHJhY3RvckNvbmZpZyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgIW1ldEV4dHJhY3RvckNvbmZpZy5lcXVhbHMoIiIpKQorICAgICAgICAgICAgdGhpcy5tZXRFeHRyYWN0b3Iuc2V0Q29uZmlnRmlsZShtZXRFeHRyYWN0b3JDb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJlQ29uZElkcygpIHsKKyAgICAgICAgcmV0dXJuIHByZUNvbmRJZHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJlQ29uZElkcyhMaXN0PFN0cmluZz4gcHJlQ29uZElkcykgeworICAgICAgICB0aGlzLnByZUNvbmRJZHMgPSBwcmVDb25kSWRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWluZ0NvbnZlbnRpb25JZChTdHJpbmcgbmFtaW5nQ29udmVudGlvbklkKSB7CisgICAgICAgIHRoaXMubmFtaW5nQ29udmVudGlvbklkID0gbmFtaW5nQ29udmVudGlvbklkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtaW5nQ29udmVudGlvbklkKCkgeworICAgICAgIHJldHVybiBuYW1pbmdDb252ZW50aW9uSWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9Qcm9kdWN0Q3Jhd2xlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9Qcm9kdWN0Q3Jhd2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzUyOWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL1Byb2R1Y3RDcmF3bGVyLmphdmEKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkNyYXdsZXJBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uQ3Jhd2xlckFjdGlvblJlcG87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jb25maWcuUHJvZHVjdENyYXdsZXJCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RhdHVzLkluZ2VzdFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkluZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuU3RkSW5nZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgUHJvZHVjdCBDcmF3bGluZy4gVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvCisgKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmaWxlIG1hbmFnZXIgYW5kIHBhcnNlIG1ldCBmaWxlcyB0aGF0IHNob3cgaG93IHRvIGluZ2VzdAorICogYSBwYXJ0aWN1bGFyIFByb2R1Y3QgaW50byB0aGUgRmlsZSBNYW5hZ2VyLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvZHVjdENyYXdsZXIgZXh0ZW5kcyBQcm9kdWN0Q3Jhd2xlckJlYW4geworCisgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQcm9kdWN0Q3Jhd2xlci5jbGFzcworICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgIC8vIGZpbHRlciB0byBvbmx5IGZpbmQgZGlyZWN0b3JpZXMgd2hlbiBkb2luZyBhIGxpc3RGaWxlcworICAgcHJvdGVjdGVkIHN0YXRpYyBGaWxlRmlsdGVyIERJUl9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKKyAgICAgICAgIHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCk7CisgICAgICB9CisgICB9OworCisgICAvLyBmaWx0ZXIgdG8gb25seSBmaW5kIHByb2R1Y3QgZmlsZXMsIG5vdCBtZXQgZmlsZXMKKyAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZUZpbHRlciBGSUxFX0ZJTFRFUiA9IG5ldyBGaWxlRmlsdGVyKCkgeworICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgeworICAgICAgICAgcmV0dXJuIGZpbGUuaXNGaWxlKCk7CisgICAgICB9CisgICB9OworCisgICBwcm90ZWN0ZWQgTGlzdDxJbmdlc3RTdGF0dXM+IGluZ2VzdFN0YXR1cyA9IG5ldyBWZWN0b3I8SW5nZXN0U3RhdHVzPigpOworICAgcHJvdGVjdGVkIENyYXdsZXJBY3Rpb25SZXBvIGFjdGlvblJlcG87CisgICBwcm90ZWN0ZWQgSW5nZXN0ZXIgaW5nZXN0ZXI7CisKKyAgIHB1YmxpYyB2b2lkIGNyYXdsKCkgeworICAgICAgY3Jhd2wobmV3IEZpbGUoZ2V0UHJvZHVjdFBhdGgoKSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBjcmF3bChGaWxlIGRpclJvb3QpIHsKKyAgICAgIC8vIFJlc2V0IGluZ2VzdCBzdGF0dXMuCisgICAgICBpbmdlc3RTdGF0dXMuY2xlYXIoKTsKKworICAgICAgLy8gTG9hZCBhY3Rpb25zLgorICAgICAgbG9hZEFuZFZhbGlkYXRlQWN0aW9ucygpOworCisgICAgICAvLyBDcmVhdGUgSW5nZXN0ZXIuCisgICAgICBzZXR1cEluZ2VzdGVyKCk7CisKKyAgICAgIC8vIFZlcmlmeSB2YWxpZCBjcmF3bCBkaXJlY3RvcnkuCisgICAgICBpZiAoZGlyUm9vdCA9PSBudWxsIHx8ICFkaXJSb290LmV4aXN0cygpKSB7CisgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkaXIgcm9vdCBpcyBudWxsIG9yIG5vbiBleGlzdGFudCEiKTsKKyAgICAgIH0KKworICAgICAgLy8gU3RhcnQgY3Jhd2xpbmcuCisgICAgICBTdGFjazxGaWxlPiBzdGFjayA9IG5ldyBTdGFjazxGaWxlPigpOworICAgICAgc3RhY2sucHVzaChkaXJSb290LmlzRGlyZWN0b3J5KCkgPyBkaXJSb290IDogZGlyUm9vdC5nZXRQYXJlbnRGaWxlKCkpOworICAgICAgd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgIEZpbGUgZGlyID0gKEZpbGUpIHN0YWNrLnBvcCgpOworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ3Jhd2xpbmcgIiArIGRpcik7CisKKyAgICAgICAgIEZpbGVbXSBwcm9kdWN0RmlsZXMgPSBudWxsOworICAgICAgICAgaWYgKGlzQ3Jhd2xGb3JEaXJzKCkpIHsKKyAgICAgICAgICAgIHByb2R1Y3RGaWxlcyA9IGRpci5saXN0RmlsZXMoRElSX0ZJTFRFUik7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvZHVjdEZpbGVzID0gZGlyLmxpc3RGaWxlcyhGSUxFX0ZJTFRFUik7CisgICAgICAgICB9CisKKyAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvZHVjdEZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBpbmdlc3RTdGF0dXMuYWRkKGhhbmRsZUZpbGUocHJvZHVjdEZpbGVzW2pdKSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICghaXNOb1JlY3VyKCkpIHsKKyAgICAgICAgICAgIEZpbGVbXSBzdWJkaXJzID0gZGlyLmxpc3RGaWxlcyhESVJfRklMVEVSKTsKKyAgICAgICAgICAgIGlmIChzdWJkaXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViZGlycy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdWJkaXJzW2pdKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIEluZ2VzdFN0YXR1cyBoYW5kbGVGaWxlKEZpbGUgcHJvZHVjdCkgeworICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiSGFuZGxpbmcgZmlsZSAiICsgcHJvZHVjdCk7CisKKyAgICAgIC8vIENoZWNrIHByZWNvbmRpdGlvbnMuCisgICAgICBpZiAoIXBhc3Nlc1ByZWNvbmRpdGlvbnMocHJvZHVjdCkpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcGFzcyBwcmVjb25kaXRpb25zIGZvciBpbmdlc3Qgb2YgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7CisgICAgICAgICByZXR1cm4gY3JlYXRlSW5nZXN0U3RhdHVzKHByb2R1Y3QsCisgICAgICAgICAgICAgICBJbmdlc3RTdGF0dXMuUmVzdWx0LlBSRUNPTkRTX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcGFzcyBwcmVjb25kaXRpb25zIik7CisgICAgICB9CisKKyAgICAgIC8vIEdlbmVyYXRlIE1ldGFkYXRhIGZvciBwcm9kdWN0LgorICAgICAgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBwcm9kdWN0TWV0YWRhdGEuYWRkTWV0YWRhdGEoZ2V0R2xvYmFsTWV0YWRhdGEoKSk7CisgICAgICB0cnkgeworICAgICAgICAgcHJvZHVjdE1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShnZXRNZXRhZGF0YUZvclByb2R1Y3QocHJvZHVjdCkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbWV0YWRhdGEgZm9yIHByb2R1Y3QgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgcGVyZm9ybVBvc3RJbmdlc3RPbkZhaWxBY3Rpb25zKHByb2R1Y3QsIHByb2R1Y3RNZXRhZGF0YSk7CisgICAgICAgICByZXR1cm4gY3JlYXRlSW5nZXN0U3RhdHVzKHByb2R1Y3QsCisgICAgICAgICAgICAgICBJbmdlc3RTdGF0dXMuUmVzdWx0LkZBSUxVUkUsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgcHJvZHVjdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJlbmFtZSB0aGUgcHJvZHVjdC4KKyAgICAgIHRyeSB7CisgICAgICAgICBwcm9kdWN0ID0gcmVuYW1lUHJvZHVjdChwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZW5hbWUgcHJvZHVjdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICBwZXJmb3JtUG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMocHJvZHVjdCwgcHJvZHVjdE1ldGFkYXRhKTsKKyAgICAgICAgIHJldHVybiBjcmVhdGVJbmdlc3RTdGF0dXMocHJvZHVjdCwgSW5nZXN0U3RhdHVzLlJlc3VsdC5GQUlMVVJFLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZW5hbWUgcHJvZHVjdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgICAgIC8vIFNldCBrbm93biBtZXRhZGF0YSBpZiBub3QgYWxyZWFkeSBzcGVjaWZpZWQuCisgICAgICBhZGRLbm93bk1ldGFkYXRhKHByb2R1Y3QsIHByb2R1Y3RNZXRhZGF0YSk7CisKKyAgICAgIC8vIENoZWNrIHRoYXQgbWV0YWRhdGEgY29udGFpbnMgcmVxdWlyZWQgbWV0YWRhdGEuCisgICAgICBpZiAoIWNvbnRhaW5zUmVxdWlyZWRNZXRhZGF0YShwcm9kdWN0TWV0YWRhdGEpKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIk1pc3NpbmcgcmVxdWlyZWQgbWV0YWRhdGEgZm9yIHByb2R1Y3QgJyIKKyAgICAgICAgICAgICAgICsgcHJvZHVjdCArICInIik7CisgICAgICAgICBwZXJmb3JtUG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMocHJvZHVjdCwgcHJvZHVjdE1ldGFkYXRhKTsKKyAgICAgICAgIHJldHVybiBjcmVhdGVJbmdlc3RTdGF0dXMocHJvZHVjdCwgSW5nZXN0U3RhdHVzLlJlc3VsdC5GQUlMVVJFLAorICAgICAgICAgICAgICAgIk1pc3NpbmcgcmVxdWlyZWQgbWV0YWRhdGEiKTsKKyAgICAgIH0KKworICAgICAgLy8gUnVuIHByZUluZ2VzdCBhY3Rpb25zLgorICAgICAgaWYgKCFwZXJmb3JtUHJlSW5nZXN0QWN0aW9ucyhwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpKSB7CisgICAgICAgICBwZXJmb3JtUG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMocHJvZHVjdCwgcHJvZHVjdE1ldGFkYXRhKTsKKyAgICAgICAgIHJldHVybiBjcmVhdGVJbmdlc3RTdGF0dXMocHJvZHVjdCwgSW5nZXN0U3RhdHVzLlJlc3VsdC5GQUlMVVJFLAorICAgICAgICAgICAgIlByZUluZ2VzdCBhY3Rpb25zIGZhaWxlZCB0byBjb21wbGV0ZSIpOyAgICAgICAgICAgIAorICAgICAgfQorCisgICAgICAvLyBDaGVjayBpZiBpbmdlc3QgaGFzIGJlZW4gdHVybmVkIG9mZi4KKyAgICAgIGlmIChpc1NraXBJbmdlc3QoKSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU2tpcHBpbmcgaW5nZXN0IG9mIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIpOworICAgICAgICAgcmV0dXJuIGNyZWF0ZUluZ2VzdFN0YXR1cyhwcm9kdWN0LCBJbmdlc3RTdGF0dXMuUmVzdWx0LlNLSVBQRUQsCisgICAgICAgICAgICAgICAiQ3Jhd2xlciBpbmdlc3QgdHVybmVkIE9GRiIpOworICAgICAgfQorCisgICAgICAvLyBJbmdlc3QgcHJvZHVjdC4KKyAgICAgIGJvb2xlYW4gaW5nZXN0U3VjY2VzcyA9IGluZ2VzdChwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpOworCisgICAgICAvLyBPbiBTdWNjZXNzZnVsIEluZ2VzdC4KKyAgICAgIGlmIChpbmdlc3RTdWNjZXNzKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJTdWNjZXNzZnVsIGluZ2VzdCBvZiBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldEFic29sdXRlUGF0aCgpICsgIl0iKTsKKyAgICAgICAgIHBlcmZvcm1Qb3N0SW5nZXN0T25TdWNjZXNzQWN0aW9ucyhwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpOworICAgICAgICAgcmV0dXJuIGNyZWF0ZUluZ2VzdFN0YXR1cyhwcm9kdWN0LAorICAgICAgICAgICAgICAgSW5nZXN0U3RhdHVzLlJlc3VsdC5TVUNDRVNTLCAiSW5nZXN0IHdhcyBzdWNjZXNzZnVsIik7CisKKyAgICAgIC8vIE9uIEZhaWxlZCBJbmdlc3QuCisgICAgICB9IGVsc2UgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGluZ2VzdCBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICArICJdOiBwZXJmb3JtaW5nIHBvc3RJbmdlc3RGYWlsIGFjdGlvbnMiKTsgICAgICAgICAKKyAgICAgICAgIHBlcmZvcm1Qb3N0SW5nZXN0T25GYWlsQWN0aW9ucyhwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpOworICAgICAgICAgcmV0dXJuIGNyZWF0ZUluZ2VzdFN0YXR1cyhwcm9kdWN0LCBJbmdlc3RTdGF0dXMuUmVzdWx0LkZBSUxVUkUsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluZ2VzdCBwcm9kdWN0Iik7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PEluZ2VzdFN0YXR1cz4gZ2V0SW5nZXN0U3RhdHVzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaW5nZXN0U3RhdHVzKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcGFzc2VzUHJlY29uZGl0aW9ucyhGaWxlIHByb2R1Y3QpOworCisgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWV0YWRhdGEgZ2V0TWV0YWRhdGFGb3JQcm9kdWN0KEZpbGUgcHJvZHVjdCkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIHJlbmFtZVByb2R1Y3QoRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOworCisgICBAVmlzaWJsZUZvclRlc3Rpbmcgdm9pZCBzZXR1cEluZ2VzdGVyKCkgeworICAgICAgaW5nZXN0ZXIgPSBuZXcgU3RkSW5nZXN0ZXIoZ2V0Q2xpZW50VHJhbnNmZXJlcigpKTsKKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nIHZvaWQgbG9hZEFuZFZhbGlkYXRlQWN0aW9ucygpIHsKKyAgICAgIGlmIChhY3Rpb25SZXBvID09IG51bGwgJiYgZ2V0QXBwbGljYXRpb25Db250ZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgYWN0aW9uUmVwbyA9IG5ldyBDcmF3bGVyQWN0aW9uUmVwbygpOworICAgICAgICAgYWN0aW9uUmVwby5sb2FkQWN0aW9uc0Zyb21CZWFuRmFjdG9yeSgKKyAgICAgICAgICAgICAgIGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBnZXRBY3Rpb25JZHMoKSk7CisgICAgICAgICB2YWxpZGF0ZUFjdGlvbnMoKTsKKyAgICAgIH0KKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nIHZvaWQgdmFsaWRhdGVBY3Rpb25zKCkgeworICAgICAgU3RyaW5nQnVmZmVyIGFjdGlvbkVycm9ycyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgZm9yIChDcmF3bGVyQWN0aW9uIGFjdGlvbiA6IGFjdGlvblJlcG8uZ2V0QWN0aW9ucygpKSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aW9uLnZhbGlkYXRlKCk7CisgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYWN0aW9uRXJyb3JzLmFwcGVuZCgiICIgKyBhY3Rpb24uZ2V0SWQoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgKyAiXG4iKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChhY3Rpb25FcnJvcnMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQWN0aW9ucyBmYWlsZWQgdmFsaWRhdGlvbjpcbiIKKyAgICAgICAgICAgICAgICsgYWN0aW9uRXJyb3JzKTsKKyAgICAgIH0KKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zUmVxdWlyZWRNZXRhZGF0YSgKKyAgICAgICAgIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkgeworICAgICAgZm9yIChTdHJpbmcgcmVxTWV0S2V5IDogZ2V0UmVxdWlyZWRNZXRhZGF0YSgpKSB7CisgICAgICAgICBpZiAoIXByb2R1Y3RNZXRhZGF0YS5jb250YWluc0tleShyZXFNZXRLZXkpKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJNaXNzaW5nIHJlcXVpcmVkIG1ldGFkYXRhIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICsgcmVxTWV0S2V5KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3Rpbmcgdm9pZCBhZGRLbm93bk1ldGFkYXRhKEZpbGUgcHJvZHVjdCwKKyAgICAgICAgIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkgeworICAgICAgLy8gQWRkIFByb2R1Y3ROYW1lIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgICBpZiAoIXByb2R1Y3RNZXRhZGF0YS5jb250YWluc0tleShQUk9EVUNUX05BTUUpKSB7CisgICAgICAgICBwcm9kdWN0TWV0YWRhdGEuYWRkTWV0YWRhdGEoUFJPRFVDVF9OQU1FLCBwcm9kdWN0LmdldE5hbWUoKSk7CisgICAgICB9CisgICAgICAvLyBBZGQgRmlsZW5hbWUgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgIGlmICghcHJvZHVjdE1ldGFkYXRhLmNvbnRhaW5zS2V5KEZJTEVOQU1FKSkgeworICAgICAgICAgcHJvZHVjdE1ldGFkYXRhLmFkZE1ldGFkYXRhKEZJTEVOQU1FLCBwcm9kdWN0LmdldE5hbWUoKSk7CisgICAgICB9CisgICAgICAvLyBBZGQgRmlsZUxvY2F0aW9uIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgICBpZiAoIXByb2R1Y3RNZXRhZGF0YS5jb250YWluc0tleShGSUxFX0xPQ0FUSU9OKSkgeworICAgICAgICAgcHJvZHVjdE1ldGFkYXRhLmFkZE1ldGFkYXRhKEZJTEVfTE9DQVRJT04sIHByb2R1Y3QKKyAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgfQorICAgICAgLy8gQWRkIEZpbGVTaXplIGlmIG5vdCBzcGVjaWZpZWQKKyAgICAgIGlmICghcHJvZHVjdE1ldGFkYXRhLmNvbnRhaW5zS2V5KEZJTEVfU0laRSkpIHsKKyAgICAgICAgIHByb2R1Y3RNZXRhZGF0YS5hZGRNZXRhZGF0YShGSUxFX1NJWkUsCisgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKHByb2R1Y3QubGVuZ3RoKCkpKTsKKyAgICAgIH0KKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nIEluZ2VzdFN0YXR1cyBjcmVhdGVJbmdlc3RTdGF0dXMoZmluYWwgRmlsZSBwcm9kdWN0LAorICAgICAgICAgZmluYWwgSW5nZXN0U3RhdHVzLlJlc3VsdCByZXN1bHQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICByZXR1cm4gbmV3IEluZ2VzdFN0YXR1cygpIHsKKyAgICAgICAgIHB1YmxpYyBGaWxlIGdldFByb2R1Y3QoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBSZXN1bHQgZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgIH0KKyAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICAgfQorICAgICAgfTsKKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nIGJvb2xlYW4gaW5nZXN0KEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgcHJvZHVjdE1ldGRhdGEpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJQcm9kdWN0Q3Jhd2xlcjogUmVhZHkgdG8gaW5nZXN0IHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICArIHByb2R1Y3QgKyAiXTogUHJvZHVjdFR5cGU6IFsiCisgICAgICAgICAgICAgICArIHByb2R1Y3RNZXRkYXRhLmdldE1ldGFkYXRhKFBST0RVQ1RfVFlQRSkgKyAiXSIpOworICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKGdldEZpbGVtZ3JVcmwoKSksCisgICAgICAgICAgICAgICBwcm9kdWN0LCBwcm9kdWN0TWV0ZGF0YSk7CisgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJTdWNjZXNzZnVsbHkgaW5nZXN0ZWQgcHJvZHVjdDogWyIgKyBwcm9kdWN0CisgICAgICAgICAgICAgICArICJdOiBwcm9kdWN0IGlkOiAiICsgcHJvZHVjdElkKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAiUHJvZHVjdENyYXdsZXI6IEV4Y2VwdGlvbiBpbmdlc3RpbmcgcHJvZHVjdDogWyIgKyBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIjogYXR0ZW1wdGluZyB0byBjb250aW51ZSBjcmF3bGluZyIsIGUpOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZyBib29sZWFuIHBlcmZvcm1QcmVJbmdlc3RBY3Rpb25zKEZpbGUgcHJvZHVjdCwKKyAgICAgICAgIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkgeworICAgICAgaWYgKGFjdGlvblJlcG8gIT0gbnVsbCkgeworICAgICAgICAgcmV0dXJuIHBlcmZvcm1Qcm9kdWN0Q3Jhd2xlckFjdGlvbnMoCisgICAgICAgICAgICAgICBhY3Rpb25SZXBvLmdldFByZUluZ2VzdEFjdGlvbnMoKSwgcHJvZHVjdCwgcHJvZHVjdE1ldGFkYXRhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nIGJvb2xlYW4gcGVyZm9ybVBvc3RJbmdlc3RPblN1Y2Nlc3NBY3Rpb25zKEZpbGUgcHJvZHVjdCwKKyAgICAgICAgIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkgeworICAgICAgaWYgKGFjdGlvblJlcG8gIT0gbnVsbCkgeworICAgICAgICAgcmV0dXJuIHBlcmZvcm1Qcm9kdWN0Q3Jhd2xlckFjdGlvbnMoCisgICAgICAgICAgICAgICBhY3Rpb25SZXBvLmdldFBvc3RJbmdlc3RPblN1Y2Nlc3NBY3Rpb25zKCksIHByb2R1Y3QsCisgICAgICAgICAgICAgICBwcm9kdWN0TWV0YWRhdGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcgYm9vbGVhbiBwZXJmb3JtUG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMoRmlsZSBwcm9kdWN0LAorICAgICAgICAgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhKSB7CisgICAgICBpZiAoYWN0aW9uUmVwbyAhPSBudWxsKSB7CisgICAgICAgICByZXR1cm4gcGVyZm9ybVByb2R1Y3RDcmF3bGVyQWN0aW9ucygKKyAgICAgICAgICAgICAgIGFjdGlvblJlcG8uZ2V0UG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMoKSwgcHJvZHVjdCwKKyAgICAgICAgICAgICAgIHByb2R1Y3RNZXRhZGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICB9CisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZyBib29sZWFuIHBlcmZvcm1Qcm9kdWN0Q3Jhd2xlckFjdGlvbnMoCisgICAgICAgICBMaXN0PENyYXdsZXJBY3Rpb24+IGFjdGlvbnMsIEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhKSB7CisgICAgICBib29sZWFuIGFsbFN1Y2NlZWRlZCA9IHRydWU7CisgICAgICBmb3IgKENyYXdsZXJBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlBlcmZvcm1pbmcgYWN0aW9uIChpZCA9ICIgKyBhY3Rpb24uZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgKyAiIDogZGVzY3JpcHRpb24gPSAiICsgYWN0aW9uLmdldERlc2NyaXB0aW9uKCkgKyAiKSIpOworICAgICAgICAgICAgaWYgKCFhY3Rpb24ucGVyZm9ybUFjdGlvbihwcm9kdWN0LCBwcm9kdWN0TWV0YWRhdGEpKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBY3Rpb24gKGlkID0gIiArIGFjdGlvbi5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgICArICIgOiBkZXNjcmlwdGlvbiA9ICIgKyBhY3Rpb24uZ2V0RGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgKyAiKSByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFsbFN1Y2NlZWRlZCA9IGZhbHNlOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBwZXJmb3JtIGNyYXdsZXIgYWN0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBhbGxTdWNjZWVkZWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL1N0ZFByb2R1Y3RDcmF3bGVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL1N0ZFByb2R1Y3RDcmF3bGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNzJhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvU3RkUHJvZHVjdENyYXdsZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5NZXRSZWFkZXJFeHRyYWN0b3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8qKgorICogQSBnZW5lcmljIFByb2R1Y3QgQ3Jhd2xlciBmb3IgUHJvZHVjdHMuIFRoZSBDcmF3bGVyIGlzIGdpdmVuIGEgcm9vdCBQcm9kdWN0CisgKiBQYXRoIGFuZCBpdCBzZWFyY2hlcyB0aHJvdWdoIGFsbCBkaXJlY3RvcmllcyBhbmQgc3ViLWRpcmVjdG9yaWVzIGZvciAubWV0CisgKiBmaWxlcywgd2hpY2ggaXQgdXNlcyB0byBkZXRlcm1pbmUgcHJvZHVjdHMgdG8gaW5nZXN0IGludG8gdGhlIGZpbGUgbWFuZ2VyLgorICogVGhlIGltcG9ydGFudCAubWV0IGZpbGUgZmllbGRzIHRoYXQgdGhpcyBjcmF3bGVyIHJlcXVpcmVzIGFyZToKKyAqIAorICogPHVsPgorICogPGxpPjxjb2RlPkZpbGVMb2NhdGlvbjwvY29kZT46IGRpcmVjdG9yeSBhYnNvbHV0ZSBwYXRoIHRvIGxvY2F0aW9uIG9mIHByb2R1Y3QKKyAqIGZpbGU8L2xpPgorICogPGxpPjxjb2RlPkZpbGVuYW1lPC9jb2RlPjogbmFtZSBvZiB0aGUgcHJvZHVjdCBmaWxlIHRvIGluZ2VzdDwvbGk+CisgKiA8bGk+PGNvZGU+UHJvZHVjdFR5cGU8L2NvZGU+OiB0aGUgUHJvZHVjdFR5cGUgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGZpbGUKKyAqIG1hbmFnZXIgZm9yIHRoZSBwcm9kdWN0IGZpbGUgZGVzY3JpYmVkIGJ5IHRoZSAubWV0IGZpbGUuPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTdGRQcm9kdWN0Q3Jhd2xlciBleHRlbmRzIFByb2R1Y3RDcmF3bGVyIHsKKworICAgU3RyaW5nIG1ldEZpbGVFeHRlbnNpb247CisKKyAgIHB1YmxpYyBTdGRQcm9kdWN0Q3Jhd2xlcigpIHsKKyAgICAgIHRoaXMubWV0RmlsZUV4dGVuc2lvbiA9ICJtZXQiOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHByb3RlY3RlZCBNZXRhZGF0YSBnZXRNZXRhZGF0YUZvclByb2R1Y3QoRmlsZSBwcm9kdWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIE1ldFJlYWRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgTWV0UmVhZGVyRXh0cmFjdG9yKAorICAgICAgICAgICAgdGhpcy5tZXRGaWxlRXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKHByb2R1Y3QpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHByb3RlY3RlZCBib29sZWFuIHBhc3Nlc1ByZWNvbmRpdGlvbnMoRmlsZSBwcm9kdWN0KSB7CisgICAgICByZXR1cm4gbmV3IEZpbGUocHJvZHVjdC5nZXRBYnNvbHV0ZVBhdGgoKSArICIuIiArIHRoaXMubWV0RmlsZUV4dGVuc2lvbikKKyAgICAgICAgICAgIC5leGlzdHMoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwcm90ZWN0ZWQgRmlsZSByZW5hbWVQcm9kdWN0KEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhKSB7CisgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0TWV0RmlsZUV4dGVuc2lvbihTdHJpbmcgbWV0RmlsZUV4dGVuc2lvbikgeworICAgICAgdGhpcy5tZXRGaWxlRXh0ZW5zaW9uID0gbWV0RmlsZUV4dGVuc2lvbjsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0NyYXdsZXJBY3Rpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0NyYXdsZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE5NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vQ3Jhd2xlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLlNwcmluZ1NldElkSW5qZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9ucy5DcmF3bGVyQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLyoqCisgKiBBbiBhY3Rpb24gdGFrZW4gYnkgdGhlIGNyYXdsZXIgZHVyaW5nIHN1Y2Nlc3Mgb3IgZmFpbCBvZiBvbmUgb2YgaXRzIGxpZmVjeWNsZQorICogc3RhdGVzOiBwcmVJbmdlc3QsIHBvc3RJbmdlc3RTdWNjZXNzLCBvciBwb3N0SW5nZXN0RmFpbCAuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDcmF3bGVyQWN0aW9uIGltcGxlbWVudHMgU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlIHsKKworICAgcHVibGljIExpc3Q8U3RyaW5nPiBwaGFzZXM7CisKKyAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ3Jhd2xlckFjdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKyAgIHB1YmxpYyBDcmF3bGVyQWN0aW9uKCkgeworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICByZXR1cm4gaWQ7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICB9CisKKyAgIEBSZXF1aXJlZAorICAgcHVibGljIHZvaWQgc2V0UGhhc2VzKExpc3Q8U3RyaW5nPiBwaGFzZXMpIHsKKyAgICAgIHRoaXMucGhhc2VzID0gcGhhc2VzOworICAgfQorCisgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBoYXNlcygpIHsKKyAgICAgIHJldHVybiB0aGlzLnBoYXNlczsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENyYXdsZXJBY3Rpb24pIHsKKyAgICAgICAgIHJldHVybiAoKENyYXdsZXJBY3Rpb24pIG9iaikuaWQuZXF1YWxzKGlkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBpZC5oYXNoQ29kZSgpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGlkLCAiTXVzdCBzcGVjaWZ5IGlkIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHBoYXNlcywgIk11c3Qgc3BlY2lmeSBwaGFzZXMiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybUFjdGlvbihGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9DcmF3bGVyQWN0aW9uUGhhc2VzLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9DcmF3bGVyQWN0aW9uUGhhc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjYzdmNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0NyYXdsZXJBY3Rpb25QaGFzZXMuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8qKgorICogU3VwcG9ydGVkIENyYXdsZXIgUGhhc2VzLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBlbnVtIENyYXdsZXJBY3Rpb25QaGFzZXMgeworICAgUFJFX0lOR0VTVCgicHJlSW5nZXN0IiksCisgICBQT1NUX0lOR0VTVF9TVUNDRVNTKCJwb3N0SW5nZXN0U3VjY2VzcyIpLAorICAgUE9TVF9JTkdFU1RfRkFJTFVSRSgicG9zdEluZ2VzdEZhaWx1cmUiKTsKKworICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgcHJpdmF0ZSBDcmF3bGVyQWN0aW9uUGhhc2VzKFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gbmFtZTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBDcmF3bGVyQWN0aW9uUGhhc2VzIGdldFBoYXNlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICBmb3IgKENyYXdsZXJBY3Rpb25QaGFzZXMgcGhhc2UgOiBDcmF3bGVyQWN0aW9uUGhhc2VzLnZhbHVlcygpKSB7CisgICAgICAgICBpZiAocGhhc2UuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHBoYXNlOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9DcmF3bGVyQWN0aW9uUmVwby5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vQ3Jhd2xlckFjdGlvblJlcG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGFkMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vQ3Jhd2xlckFjdGlvblJlcG8uamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLyoqCisgKiBBIHJlcG9zaXRvcnkgYW5kIHJlYWRlciBmb3Ige0BsaW5rIENyYXdsZXJBY3Rpb259cyBhc3NvY2lhdGVkIHdpdGggQ3Jhd2xlcgorICogbGlmZWN5Y2xlIHBoYXNlczogcHJlSW5nZXN0LCBwb3N0SW5nZXN0U3VjY2VzcyBhbmQgcG9zdEluZ2VzdEZhaWwuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBjbGFzcyBDcmF3bGVyQWN0aW9uUmVwbyB7CisKKyAgIHByaXZhdGUgTGlua2VkTGlzdDxDcmF3bGVyQWN0aW9uPiBwcmVJbmdlc3RBY3Rpb25zOworICAgcHJpdmF0ZSBMaW5rZWRMaXN0PENyYXdsZXJBY3Rpb24+IHBvc3RJbmdlc3RPbkZhaWxBY3Rpb25zOworICAgcHJpdmF0ZSBMaW5rZWRMaXN0PENyYXdsZXJBY3Rpb24+IHBvc3RJbmdlc3RPblN1Y2Nlc3NBY3Rpb25zOworCisgICBwdWJsaWMgQ3Jhd2xlckFjdGlvblJlcG8oKSB7CisgICAgICB0aGlzLnByZUluZ2VzdEFjdGlvbnMgPSBuZXcgTGlua2VkTGlzdDxDcmF3bGVyQWN0aW9uPigpOworICAgICAgdGhpcy5wb3N0SW5nZXN0T25GYWlsQWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PENyYXdsZXJBY3Rpb24+KCk7CisgICAgICB0aGlzLnBvc3RJbmdlc3RPblN1Y2Nlc3NBY3Rpb25zID0gbmV3IExpbmtlZExpc3Q8Q3Jhd2xlckFjdGlvbj4oKTsKKyAgIH0KKworICAgcHVibGljIFNldDxDcmF3bGVyQWN0aW9uPiBnZXRBY3Rpb25zKCkgeworICAgICAgU2V0PENyYXdsZXJBY3Rpb24+IGFjdGlvbnMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIGFjdGlvbnMuYWRkQWxsKHByZUluZ2VzdEFjdGlvbnMpOworICAgICAgYWN0aW9ucy5hZGRBbGwocG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMpOworICAgICAgYWN0aW9ucy5hZGRBbGwocG9zdEluZ2VzdE9uU3VjY2Vzc0FjdGlvbnMpOworICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PENyYXdsZXJBY3Rpb24+IGdldFByZUluZ2VzdEFjdGlvbnMoKSB7CisgICAgICByZXR1cm4gdGhpcy5wcmVJbmdlc3RBY3Rpb25zOworICAgfQorCisgICBwdWJsaWMgTGlzdDxDcmF3bGVyQWN0aW9uPiBnZXRQb3N0SW5nZXN0T25GYWlsQWN0aW9ucygpIHsKKyAgICAgIHJldHVybiB0aGlzLnBvc3RJbmdlc3RPbkZhaWxBY3Rpb25zOworICAgfQorCisgICBwdWJsaWMgTGlzdDxDcmF3bGVyQWN0aW9uPiBnZXRQb3N0SW5nZXN0T25TdWNjZXNzQWN0aW9ucygpIHsKKyAgICAgIHJldHVybiB0aGlzLnBvc3RJbmdlc3RPblN1Y2Nlc3NBY3Rpb25zOworICAgfQorCisgICBwdWJsaWMgdm9pZCBsb2FkQWN0aW9uc0Zyb21CZWFuRmFjdG9yeShBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCwKKyAgICAgICAgIExpc3Q8U3RyaW5nPiBhY3Rpb25JZHMpIHsKKyAgICAgIGZvciAoU3RyaW5nIGFjdGlvbklkIDogYWN0aW9uSWRzKSB7CisgICAgICAgICBDcmF3bGVyQWN0aW9uIGFjdGlvbiA9ICgoQ3Jhd2xlckFjdGlvbikgY29udGV4dC5nZXRCZWFuKGFjdGlvbklkLAorICAgICAgICAgICAgICAgQ3Jhd2xlckFjdGlvbi5jbGFzcykpOworICAgICAgICAgTGlzdDxTdHJpbmc+IHBoYXNlcyA9IGFjdGlvbi5nZXRQaGFzZXMoKTsKKyAgICAgICAgIGZvciAoU3RyaW5nIHBoYXNlIDogcGhhc2VzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKENyYXdsZXJBY3Rpb25QaGFzZXMuZ2V0UGhhc2VCeU5hbWUocGhhc2UpKSB7CisgICAgICAgICAgICAgICBjYXNlIFBSRV9JTkdFU1Q6CisgICAgICAgICAgICAgICAgICBwcmVJbmdlc3RBY3Rpb25zLmFkZChhY3Rpb24pOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIFBPU1RfSU5HRVNUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICBwb3N0SW5nZXN0T25TdWNjZXNzQWN0aW9ucy5hZGQoYWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSBQT1NUX0lOR0VTVF9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgcG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGhhc2UgJyIgKyBwaGFzZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9EZWxldGVGaWxlLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9EZWxldGVGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4YWQ4NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0RlbGV0ZUZpbGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBEZWxldGVzIGEgcHJvZHVjdCBmaWxlIGFzIGEge0BsaW5rIENyYXdsZXJBY3Rpb259IHJlc3BvbnNlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBsdWNhIChMdWNhIENpbnF1aW5pKQorICovCitwdWJsaWMgY2xhc3MgRGVsZXRlRmlsZSBleHRlbmRzIENyYXdsZXJBY3Rpb24geworCisgICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgIHByaXZhdGUgU3RyaW5nIGZpbGVFeHRlbnNpb247CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbihGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBGaWxlIGZpbGVUb0RlbGV0ZSA9IHByb2R1Y3Q7CisgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWxlVG9EZWxldGUgPSBmaWxlOworICAgICAgICAgfSBlbHNlIGlmIChmaWxlRXh0ZW5zaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGVUb0RlbGV0ZSA9IG5ldyBGaWxlKHByb2R1Y3QuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLiIgKyBmaWxlRXh0ZW5zaW9uKTsKKyAgICAgICAgIH0KKworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGVsZXRpbmcgZmlsZSAiICsgZmlsZVRvRGVsZXRlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgIGlmIChmaWxlVG9EZWxldGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgCS8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBkaXJlY3RvcnkgY2Fubm90IGJlIGRlbGV0ZWQKKyAgICAgICAgIAlGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KGZpbGVUb0RlbGV0ZSk7IAorICAgICAgICAgCXJldHVybiB0cnVlOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCSByZXR1cm4gZmlsZVRvRGVsZXRlLmRlbGV0ZSgpOworICAgICAgICAgfQorICAgICAgICAgCisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciB3aGlsZSBkZWxldGluZyBmaWxlIGZvciBwcm9kdWN0ICciCisgICAgICAgICAgICAgICArIHByb2R1Y3QgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBzdXBlci52YWxpZGF0ZSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLmlzVHJ1ZShmaWxlID09IG51bGwgfHwgZmlsZUV4dGVuc2lvbiA9PSBudWxsLAorICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBlaXRoZXIgZmlsZSBvciBmaWxlRXh0ZW5zaW9uIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENyYXdsZXJBY3Rpb25FeGNlcHRpb24oZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRGaWxlRXh0ZW5zaW9uKFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7CisgICAgICB0aGlzLmZpbGVFeHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vRW1haWxOb3RpZmljYXRpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0VtYWlsTm90aWZpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1MzlhYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0VtYWlsTm90aWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YXgubWFpbC5NZXNzYWdlOworaW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5tYWlsLlRyYW5zcG9ydDsKK2ltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkFkZHJlc3NFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5JbnRlcm5ldEFkZHJlc3M7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZTsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlJlcXVpcmVkOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uQ3Jhd2xlckFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9ucy5DcmF3bGVyQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogVGhpcyBhY3Rpb24gc2VuZHMgYW4gZW1haWwgbm90aWZpY2F0aW9uLiBJdCBwZXJmb3JtcyBtZXRhZGF0YSBhbmQgc3lzdGVtCisgKiBwcm9wZXJ0eSByZXBsYWNlbWVudCBvbiB0aGUgc3ViamVjdCwgcmVjaXBpZW50cywgYW5kIG1lc3NhZ2UuIFRoaXMgYWxsb3dzIHRoZQorICogbm90aWZpY2F0aW9ucyB0byBiZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQuCisgKiAKKyAqIEBhdXRob3IgcHJhbWlyZXogKFBhdWwgUmFtaXJleikKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogCisgKi8KK3B1YmxpYyBjbGFzcyBFbWFpbE5vdGlmaWNhdGlvbiBleHRlbmRzIENyYXdsZXJBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBtYWlsSG9zdDsKKyAgIHByaXZhdGUgU3RyaW5nIHN1YmplY3Q7CisgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVjaXBpZW50czsKKyAgIHByaXZhdGUgU3RyaW5nIHNlbmRlcjsKKyAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVJbnZhbGlkQWRkcmVzc2VzOworCisgICBwdWJsaWMgRW1haWxOb3RpZmljYXRpb24oKSB7CisgICAgICB0aGlzLmlnbm9yZUludmFsaWRBZGRyZXNzZXMgPSB0cnVlOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgIHByb3BzLnB1dCgibWFpbC5ob3N0IiwgdGhpcy5tYWlsSG9zdCk7CisgICAgICAgICBwcm9wcy5wdXQoIm1haWwudHJhbnNwb3J0LnByb3RvY29sIiwgInNtdHAiKTsKKyAgICAgICAgIHByb3BzLnB1dCgibWFpbC5mcm9tIiwgdGhpcy5zZW5kZXIpOworCisgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBTZXNzaW9uLmdldERlZmF1bHRJbnN0YW5jZShwcm9wcyk7CisgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNaW1lTWVzc2FnZShzZXNzaW9uKTsKKyAgICAgICAgIG1zZy5zZXRTdWJqZWN0KFBhdGhVdGlscy5kb0R5bmFtaWNSZXBsYWNlbWVudChzdWJqZWN0LCBtZXRhZGF0YSkpOworICAgICAgICAgbXNnLnNldFRleHQobmV3IFN0cmluZyhQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQobWVzc2FnZSwKKyAgICAgICAgICAgICAgIG1ldGFkYXRhKS5nZXRCeXRlcygpKSk7CisgICAgICAgICBmb3IgKFN0cmluZyByZWNpcGllbnQgOiByZWNpcGllbnRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgbXNnLmFkZFJlY2lwaWVudChNZXNzYWdlLlJlY2lwaWVudFR5cGUuVE8sIG5ldyBJbnRlcm5ldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhyZWNpcGllbnQudHJpbSgpLCBtZXRhZGF0YSksCisgICAgICAgICAgICAgICAgICAgICBpZ25vcmVJbnZhbGlkQWRkcmVzc2VzKSk7CisgICAgICAgICAgICAgICBMT0cuZmluZSgiUmVjaXBpZW50OiAiCisgICAgICAgICAgICAgICAgICAgICArIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHJlY2lwaWVudC50cmltKCksIG1ldGFkYXRhKSk7CisgICAgICAgICAgICB9IGNhdGNoIChBZGRyZXNzRXhjZXB0aW9uIGFlKSB7CisgICAgICAgICAgICAgICBMT0cuZmluZSgiUmVjaXBpZW50OiAiCisgICAgICAgICAgICAgICAgICAgICArIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHJlY2lwaWVudC50cmltKCksIG1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICBMT0cud2FybmluZyhhZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgTE9HLmZpbmUoIlN1YmplY3Q6ICIgKyBtc2cuZ2V0U3ViamVjdCgpKTsKKyAgICAgICAgIExPRy5maW5lKCJNZXNzYWdlOiAiCisgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcoUGF0aFV0aWxzLmRvRHluYW1pY1JlcGxhY2VtZW50KG1lc3NhZ2UsIG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgIFRyYW5zcG9ydC5zZW5kKG1zZyk7CisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cuc2V2ZXJlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLnZhbGlkYXRlKCk7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChtYWlsSG9zdCwgIk11c3Qgc3BlY2lmeSBtYWlsSG9zdCIpOworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChzdWJqZWN0LCAiTXVzdCBzcGVjaWZ5IHN1YmplY3QiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwobWVzc2FnZSwgIk11c3Qgc3BlY2lmeSBtZXNzYWdlIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHJlY2lwaWVudHMsICJNdXN0IHNwZWNpZnkgcmVjaXBpZW50cyIpOworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChzZW5kZXIsICJNdXN0IHNwZWNpZnkgc2VuZGVyIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENyYXdsZXJBY3Rpb25FeGNlcHRpb24oZSk7CisgICAgICB9CisgICB9CisKKyAgIEBSZXF1aXJlZAorICAgcHVibGljIHZvaWQgc2V0TWFpbEhvc3QoU3RyaW5nIHNtdHBIb3N0KSB7CisgICAgICB0aGlzLm1haWxIb3N0ID0gc210cEhvc3Q7CisgICB9CisKKyAgIEBSZXF1aXJlZAorICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCkgeworICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKKyAgIH0KKworICAgQFJlcXVpcmVkCisgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRSZWNpcGllbnRzKFN0cmluZyByZWNpcGllbnRzKSB7CisgICAgICBpZiAocmVjaXBpZW50cyAhPSBudWxsKSB7CisgICAgICAgICB0aGlzLnJlY2lwaWVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QocmVjaXBpZW50cy5zcGxpdCgiLCIpKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UmVjaXBpZW50cyhMaXN0PFN0cmluZz4gcmVjaXBpZW50cykgeworICAgICAgdGhpcy5yZWNpcGllbnRzID0gcmVjaXBpZW50czsKKyAgIH0KKworICAgQFJlcXVpcmVkCisgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoU3RyaW5nIHNlbmRlcikgeworICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUludmFsaWRBZGRyZXNzZXMoQm9vbGVhbiBpZ25vcmVJbnZhbGlkQWRkcmVzc2VzKSB7CisgICAgICB0aGlzLmlnbm9yZUludmFsaWRBZGRyZXNzZXMgPSBpZ25vcmVJbnZhbGlkQWRkcmVzc2VzOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSA1KSB7CisgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhICIgKyBFbWFpbE5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICsgIiA8bWFpbGhvc3Q+IDxzZW5kZXI+IDxyZWNpcGllbnRzPiA8c3ViamVjdD4gPG1lc3NhZ2U+Iik7CisgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICB9CisgICAgICBFbWFpbE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgRW1haWxOb3RpZmljYXRpb24oKTsKKyAgICAgIG5vdGlmaWNhdGlvbi5zZXRNYWlsSG9zdChhcmdzWzBdKTsKKyAgICAgIG5vdGlmaWNhdGlvbi5zZXRTZW5kZXIoYXJnc1sxXSk7CisgICAgICBub3RpZmljYXRpb24uc2V0UmVjaXBpZW50cyhhcmdzWzJdKTsKKyAgICAgIG5vdGlmaWNhdGlvbi5zZXRTdWJqZWN0KGFyZ3NbM10pOworICAgICAgbm90aWZpY2F0aW9uLnNldE1lc3NhZ2UoYXJnc1s0XSk7CisgICAgICBub3RpZmljYXRpb24ucGVyZm9ybUFjdGlvbihuZXcgRmlsZSgiIiksIG5ldyBNZXRhZGF0YSgpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0V4dGVybkFjdGlvbi5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vRXh0ZXJuQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiZTViYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0V4dGVybkFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbjsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9ucy5DcmF3bGVyQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYy5FeGVjVXRpbHM7CisKKy8qKgorICogRXhlY3V0ZSBzb21lIGV4dGVybmFsIGNvbW1hbmQgYXMgYSB7QGxpbmsgQ3Jhd2xlckFjdGlvbn0gcmVzcG9uc2UuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuQWN0aW9uIGV4dGVuZHMgQ3Jhd2xlckFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGVDb21tYW5kOworICAgcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpcjsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQWN0aW9uKEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhKQorICAgICAgICAgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFN0cmluZyBlbnZSZXBsYWNlZEV4ZWN1dGVDb21tYW5kID0gZG9EeW5hbWljUmVwbGFjZW1lbnQoCisgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZCwgcHJvZHVjdE1ldGFkYXRhKTsKKyAgICAgICAgIHJldHVybiBFeGVjVXRpbHMuY2FsbFByb2dyYW0oCisgICAgICAgICAgICAgICBlbnZSZXBsYWNlZEV4ZWN1dGVDb21tYW5kLAorICAgICAgICAgICAgICAgTE9HLAorICAgICAgICAgICAgICAgbmV3IEZpbGUod29ya2luZ0RpciAhPSBudWxsID8gZG9EeW5hbWljUmVwbGFjZW1lbnQod29ya2luZ0RpciwKKyAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RNZXRhZGF0YSkgOiBwcm9kdWN0LmdldFBhcmVudCgpKSkgPT0gMDsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBleGVjdXRlIGV4dGVybiBjb21tYW5kICciCisgICAgICAgICAgICAgICArIGV4ZWN1dGVDb21tYW5kICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgc3VwZXIudmFsaWRhdGUoKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGV4ZWN1dGVDb21tYW5kLCAiTXVzdCBzcGVjaWZ5IGV4ZWN1dGVDb21tYW5kIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENyYXdsZXJBY3Rpb25FeGNlcHRpb24oZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGVDb21tYW5kKFN0cmluZyBleGVjdXRlQ29tbWFuZCkgeworICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZCA9IGV4ZWN1dGVDb21tYW5kOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyKFN0cmluZyB3b3JraW5nRGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMud29ya2luZ0RpciA9IHdvcmtpbmdEaXI7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9GaWxlQmFzZWRBY3Rpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0ZpbGVCYXNlZEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2ZDdkYTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9GaWxlQmFzZWRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5DcmF3bGVyQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNvbWUgYmFzaWMgc3VwcG9ydCBmb3IgYWN0aW9ucyByZXZvbHZpbmcgYXJvdW5kIGZpbGVzLiBJdAorICogYWxsb3dzIGFjdGlvbiB0byBzdXBwb3J0IGZpbGUgc2VsZWN0aW9uIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24sIG1ldGFkYXRhLCBvcgorICogdGhlIGN1cnJlbnQgZmlsZSBiZWluZyBoYW5kbGVkIGJ5IHRoZSBjcmF3bGVyLiBJbiBhZGRpdGlvbiwgaXQgc3VwcG9ydHMgdGhlCisgKiB1c2FnZSBvZiBGaWxlU2V0dGluZ3MgdG8gcHJvdmlkZSBjb25mb3JtYW5jZSBhbW9uZ3N0IGV4dGVuZGluZyBhY3Rpb25zLgorICogRmluYWxseSwgaXQgY2FwdHVyZXMgYSBmbGFnIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFjdGlvbiBzaG91bGQgZmFpbAorICogc2hvdWxkIHRoZSBmaWxlIG5vdCBleGlzdC4KKyAqIAorICogQGF1dGhvciBwcmFtaXJleiAoUGF1bCBSYW1pcmV6KQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVCYXNlZEFjdGlvbiBleHRlbmRzIENyYXdsZXJBY3Rpb24geworICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlOworICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlS2V5OworICAgcHJvdGVjdGVkIEZpbGVTZXR0aW5ncyBmaWxlU2V0dGluZ3M7CisgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsTWlzc2luZ0ZpbGU7CisKKyAgIHB1YmxpYyBGaWxlQmFzZWRBY3Rpb24oKSB7CisgICAgICBmaWxlU2V0dGluZ3MgPSBuZXcgRmlsZVNldHRpbmdzKCk7CisgICAgICB0aGlzLmZhaWxNaXNzaW5nRmlsZSA9IGZhbHNlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRGaWxlUHJlZml4KFN0cmluZyBmaWxlUHJlZml4KSB7CisgICAgICBmaWxlU2V0dGluZ3Muc2V0RmlsZVByZWZpeChmaWxlUHJlZml4KTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZVN1ZmZpeChTdHJpbmcgZmlsZVN1ZmZpeCkgeworICAgICAgZmlsZVNldHRpbmdzLnNldEZpbGVTdWZmaXgoZmlsZVN1ZmZpeCk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEZpbGVFeHRlbnNpb24oU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKKyAgICAgIGZpbGVTZXR0aW5ncy5zZXRGaWxlRXh0ZW5zaW9uKGZpbGVFeHRlbnNpb24pOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRLZWVwRXhpc3RpbmdFeHRlbnNpb24oYm9vbGVhbiBrZWVwRXhpc3RpbmdFeHRlbnNpb24pIHsKKyAgICAgIGZpbGVTZXR0aW5ncy5zZXRLZWVwRXhpc3RpbmdFeHRlbnNpb24oa2VlcEV4aXN0aW5nRXh0ZW5zaW9uKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZUtleShTdHJpbmcgZmlsZUtleSkgeworICAgICAgdGhpcy5maWxlS2V5ID0gZmlsZUtleTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmFpbE1pc3NpbmdGaWxlKGJvb2xlYW4gZmFpbE1pc3NpbmdGaWxlKSB7CisgICAgICB0aGlzLmZhaWxNaXNzaW5nRmlsZSA9IGZhaWxNaXNzaW5nRmlsZTsKKyAgIH0KKworICAgcHVibGljIEZpbGUgZ2V0U2VsZWN0ZWRGaWxlKEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgIEZpbGUgc2VsZWN0ZWRGaWxlID0gbnVsbDsKKyAgICAgIGlmIChmaWxlID09IG51bGwgJiYgZmlsZUtleSA9PSBudWxsKSB7CisgICAgICAgICBzZWxlY3RlZEZpbGUgPSBwcm9kdWN0OworICAgICAgfSBlbHNlIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgIHNlbGVjdGVkRmlsZSA9IG5ldyBGaWxlKGZpbGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHNlbGVjdGVkRmlsZSA9IG5ldyBGaWxlKG1ldGFkYXRhLmdldE1ldGFkYXRhKGZpbGVLZXkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzZWxlY3RlZEZpbGU7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEZpbGUgc2VsZWN0ZWRGaWxlID0gdGhpcy5nZXRTZWxlY3RlZEZpbGUocHJvZHVjdCwgbWV0YWRhdGEpOworICAgICAgU3RyaW5nIHNlbGVjdGVkRmlsZVN0cmluZyA9IHRoaXMuZmlsZVNldHRpbmdzCisgICAgICAgICAgICAuZ2V0UHJlcGFyZWRGaWxlU3RyaW5nKHNlbGVjdGVkRmlsZSk7CisgICAgICBGaWxlIGFjdGlvbkZpbGUgPSBuZXcgRmlsZShzZWxlY3RlZEZpbGVTdHJpbmcpOworCisgICAgICBpZiAoZmFpbE1pc3NpbmdGaWxlICYmICFhY3Rpb25GaWxlLmV4aXN0cygpKSB7CisgICAgICAgICBMT0cuc2V2ZXJlKCJGaWxlIGRvZXMgbm90IGV4aXN0OiAiICsgYWN0aW9uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChhY3Rpb25GaWxlLmV4aXN0cygpKSB7CisgICAgICAgICByZXR1cm4gdGhpcy5wZXJmb3JtRmlsZUFjdGlvbihhY3Rpb25GaWxlLCBtZXRhZGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgTE9HLmZpbmUoIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICIgKyBhY3Rpb25GaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1GaWxlQWN0aW9uKEZpbGUgYWN0aW9uRmlsZSwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgICB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0ZpbGVTZXR0aW5ncy5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vRmlsZVNldHRpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjY2NjViNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0ZpbGVTZXR0aW5ncy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBjYXB0dXJlcyBzZXR0aW5ncyB1c2VkIGluIEZpbGVCYXNlZCBhY3Rpb25zIGFuZCB0aGUgRmlsZUV4aXN0cworICogcHJlY29uZGl0aW9uLiBJdCBzcGVjaWZpZXMgaG93IHRvIHByZXBhcmUgYSBmaWxlIHN0cmluZyBhbmQgcHJvdmlkZXMKKyAqIGNvbnNpc3RlbnQgZmVhdHVyZXMgYWNyb3NzIHRoZSBhZm9yZW1lbnRpb25lZC4gVGhpcyBwcmVwYXJhdGlvbiBzdXBwb3J0cyBzdWNoCisgKiBjb252ZXJ0aW5nIGZyb20gc29tZXRoaW5nIHN1Y2ggYXMgaW1hZ2UuanBnIHRvIGNvb2xfaW1hZ2VfYW5jaWxsYXJ5LnBuZy4gSW4KKyAqIHRoaXMgc2NlbmFyaW8gdGhlIGZpbGVQcmVmaXg9ImNvb2xfIiwgZmlsZVN1ZmZpeD0iX2FuY2lsbGFyeSIsCisgKiBmaWxlRXh0ZW5zaW9uPSJwbmciLCBhbmQga2VlcEV4aXN0aW5nRXh0ZW5zaW9uPXRydWUuIFRoaXMgY29udmVyc2lvbiBjb3VsZAorICogdGFrZSBwbGFjZSBieSBwYXNzaW5nIGNhbGxpbmcgdGhlIGdldFByZXBhcmVkRmlsZVN0cmluZyBtZXRob2QuCisgKiAKKyAqIEBhdXRob3IgcHJhbWlyZXogKFBhdWwgUmFtaXJleikKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU2V0dGluZ3MgeworICAgcHJpdmF0ZSBTdHJpbmcgZmlsZVByZWZpeDsKKyAgIHByaXZhdGUgU3RyaW5nIGZpbGVTdWZmaXg7CisgICBwcml2YXRlIFN0cmluZyBmaWxlRXh0ZW5zaW9uOworICAgcHJpdmF0ZSBib29sZWFuIGtlZXBFeGlzdGluZ0V4dGVuc2lvbjsKKworICAgcHVibGljIEZpbGVTZXR0aW5ncygpIHsKKyAgICAgIHRoaXMua2VlcEV4aXN0aW5nRXh0ZW5zaW9uID0gdHJ1ZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZVByZWZpeChTdHJpbmcgZmlsZVByZWZpeCkgeworICAgICAgdGhpcy5maWxlUHJlZml4ID0gZmlsZVByZWZpeDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZVN1ZmZpeChTdHJpbmcgZmlsZVN1ZmZpeCkgeworICAgICAgdGhpcy5maWxlU3VmZml4ID0gZmlsZVN1ZmZpeDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZUV4dGVuc2lvbihTdHJpbmcgZmlsZUV4dGVuc2lvbikgeworICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gZmlsZUV4dGVuc2lvbjsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0S2VlcEV4aXN0aW5nRXh0ZW5zaW9uKGJvb2xlYW4ga2VlcEV4aXN0aW5nRXh0ZW5zaW9uKSB7CisgICAgICB0aGlzLmtlZXBFeGlzdGluZ0V4dGVuc2lvbiA9IGtlZXBFeGlzdGluZ0V4dGVuc2lvbjsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXRQcmVwYXJlZEZpbGVTdHJpbmcoRmlsZSBmaWxlKSB7CisgICAgICBTdHJpbmdCdWZmZXIgZmlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgaWYgKGZpbGUuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoZmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIsCisgICAgICAgICAgICAgICAiLyIpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGVQcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoZmlsZVByZWZpeCk7CisgICAgICB9CisKKyAgICAgIFN0cmluZyBleGlzdGluZ0V4dGVuc2lvbiA9ICIiOworICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgICBpbnQgZXhpc3RpbmdJbmRleCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPSAtMSkgeworICAgICAgICAgZXhpc3RpbmdFeHRlbnNpb24gPSBmaWxlbmFtZS5zdWJzdHJpbmcoZXhpc3RpbmdJbmRleCk7CisgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBleGlzdGluZ0luZGV4KTsKKyAgICAgIH0KKworICAgICAgZmlsZVN0cmluZy5hcHBlbmQoZmlsZW5hbWUpOworCisgICAgICBpZiAoZmlsZVN1ZmZpeCAhPSBudWxsKSB7CisgICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZChmaWxlU3VmZml4KTsKKyAgICAgIH0KKworICAgICAgaWYgKGtlZXBFeGlzdGluZ0V4dGVuc2lvbikgeworICAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoZXhpc3RpbmdFeHRlbnNpb24pOworICAgICAgfQorCisgICAgICBpZiAoZmlsZUV4dGVuc2lvbiAhPSBudWxsKSB7CisgICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZCgiLiIpOworICAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoZmlsZUV4dGVuc2lvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmaWxlU3RyaW5nLnRvU3RyaW5nKCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9GaWxlbWdyVW5pcXVlbmVzc0NoZWNrZXIuamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0ZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjZkNWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9GaWxlbWdyVW5pcXVlbmVzc0NoZWNrZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXMuUFJPRFVDVF9OQU1FOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBwcm9kdWN0IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UgYWxyZWFkeQorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tlciBleHRlbmRzIENyYXdsZXJBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBmaWxlbWdyVXJsOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEpCisgICAgICAgICB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChwcm9kdWN0TWV0YWRhdGEuZ2V0TWV0YWRhdGEoUFJPRFVDVF9OQU1FKSwKKyAgICAgICAgICAgICAgIFBST0RVQ1RfTkFNRSArICIgd2FzIG5vdCBmb3VuZCBpbiBtZXRhZGF0YSIpOworCisgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCgKKyAgICAgICAgICAgICAgIG5ldyBVUkwodGhpcy5maWxlbWdyVXJsKSk7CisgICAgICAgICByZXR1cm4gIWZtQ2xpZW50Lmhhc1Byb2R1Y3QocHJvZHVjdE1ldGFkYXRhLmdldE1ldGFkYXRhKFBST0RVQ1RfTkFNRSkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKCJQcm9kdWN0IGZhaWxlZCB1bmlxdWVuZXNzIGNoZWNrIDogWyIKKyAgICAgICAgICAgICAgICsgcHJvZHVjdCArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLnZhbGlkYXRlKCk7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChmaWxlbWdyVXJsLCAiTXVzdCBzcGVjaWZ5IGZpbGVtZ3JVcmwiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RmlsZW1nclVybChTdHJpbmcgZmlsZW1nclVybCkgeworICAgICAgdGhpcy5maWxlbWdyVXJsID0gZmlsZW1nclVybDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0dyb3VwQWN0aW9uLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Hcm91cEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlNzBhNzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Hcm91cEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkNyYXdsZXJBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIFN1cHBvcnQgb2YgYSBHcm91cEFjdGlvbiBjb3VsZCBnbyBhIHdheXMgdG8gc2ltcGxpZnkgY29tbWFuZCBsaW5lCisgKiBzcGVjaWZpY2F0aW9uIG9mIGFjdGlvbnMgdG8gcnVuLiBJbnN0ZWFkIG9mIGhhdmluZyB0byBsaXN0IGFjdGlvbnMgdG8gcnVuIG9uZQorICogd291bGQgc2ltcGx5IGVuZCB1cCByZWZlcmVuY2luZyB0aGUgZ3JvdXAuIEluIGFkZGl0aW9uLCB0aGlzIG1heSBlbmQgdXAKKyAqIG9wZW5pbmcgdXAgdGhlIHBvc3NpYmlsaXR5IHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgR3JvdXBBY3Rpb25zIHN1Y2ggYXMKKyAqIG5vdCBjb250aW51aW5nIHRvIHJ1biBhY3Rpb25zIGlmIG9uZSBmYWlsZWQuIEN1cnJlbnRseSwgdGhlIGNyYXdsZXIgY29udGludWVzCisgKiBleGVjdXRpbmcgYWN0aW9ucyBldmVuIGlmIGFuIGFjdGlvbiBmYWlscyB0aGlzIGNvdWxkIGJlIGEgd2F5IHRvIHRhaWxvciB0aGF0CisgKiBiZWhhdmlvci4KKyAqIAorICogQGF1dGhvciBwcmFtaXJleiAoUGF1bCBSYW1pcmV6KQorICovCitwdWJsaWMgY2xhc3MgR3JvdXBBY3Rpb24gZXh0ZW5kcyBDcmF3bGVyQWN0aW9uIHsKKyAgIHByaXZhdGUgTGlzdDxDcmF3bGVyQWN0aW9uPiBhY3Rpb25zVG9DYWxsOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGJvb2xlYW4gYWxsU3VjY2VlZGVkID0gdHJ1ZTsKKyAgICAgIGZvciAoQ3Jhd2xlckFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zVG9DYWxsKSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HLmluZm8oIlBlcmZvcm1pbmcgYWN0aW9uIChpZCA9ICIgKyBhY3Rpb24uZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgKyAiIDogZGVzY3JpcHRpb24gPSAiICsgYWN0aW9uLmdldERlc2NyaXB0aW9uKCkgKyAiKSIpOworICAgICAgICAgICAgaWYgKCFhY3Rpb24ucGVyZm9ybUFjdGlvbihwcm9kdWN0LCBtZXRhZGF0YSkpCisgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBY3Rpb24gKGlkID0gIiArIGFjdGlvbi5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgICArICIgOiBkZXNjcmlwdGlvbiA9ICIgKyBhY3Rpb24uZ2V0RGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgKyAiKSByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFsbFN1Y2NlZWRlZCA9IGZhbHNlOworICAgICAgICAgICAgTE9HLndhcm5pbmcoIkZhaWxlZCB0byBwZXJmb3JtIGNyYXdsZXIgYWN0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgIH0KKworICAgICAgfQorICAgICAgcmV0dXJuIGFsbFN1Y2NlZWRlZDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLnZhbGlkYXRlKCk7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChhY3Rpb25zVG9DYWxsLCAiTXVzdCBzcGVjaWZ5IGFjdGlvbnNUb0NhbGwiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0QWN0aW9uc1RvQ2FsbChMaXN0PENyYXdsZXJBY3Rpb24+IGFjdGlvbnNUb0NhbGwpIHsKKyAgICAgIHRoaXMuYWN0aW9uc1RvQ2FsbCA9IGFjdGlvbnNUb0NhbGw7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Jbmdlc3RBbmNpbGxhcnkuamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL0luZ2VzdEFuY2lsbGFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjYWNkNjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Jbmdlc3RBbmNpbGxhcnkuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5Jbmdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LlN0ZEluZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLyoqCisgKiBUaGlzIGFjdGlvbiBhbGxvd3MgdGhlIGNyYXdsZXIgdG8gaW5nZXN0IGFuIGFuY2lsbGFyeSBmaWxlIHdoaWxlIGNyYXdsaW5nCisgKiBvdGhlciBmaWxlcy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjcmF3bGVyIGlzIGNvbmZpZ3VyZWQgdG8gcGljayB1cCBpbWFnZXMgdGhlbgorICogdGhpcyBhY3Rpb24gY291bGQgYmUgdXNlZCB0byBwaWNrIHVwIHRoZSB0aHVtYm5haWxzLiBUaGUgYW5jaWxsYXJ5IGZpbGUgd2lsbAorICogYmUgc3VibWl0dGVkIHRvIHRoZSBmaWxlIG1hbmFnZXIgZ2l2ZW4gdGhlIHByb2R1Y3QgdHlwZSBzcGVjaWZpZWQgYW5kIGFuCisgKiBpZGVudGlmaWVyIHBsYWNlZCBpbiB0aGUgbWV0YWRhdGEgb2YgdGhlIGZpbGUgYmVpbmcgaW5nZXN0ZWQuIE9uZSB3aWxsIGhhdmUKKyAqIHRvIHNldCB1cCB0aGUgcHJvZHVjdCB0eXBlIGluIHRoZSBmaWxlIG1hbmFnZXIgcG9saWN5IHRvIHN1cHBvcnQgdGhpcyBhY3Rpb24uCisgKiBUaGlzIGFjdGlvbiBkb2VzIG5vdCBwZXJmb3JtIG1ldGFkYXRhIGV4dHJhY3Rpb24gYW5kIGlmIHRoaXMgaXMgcmVxdWlyZWQgb25lCisgKiBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSBzZXJ2ZXIgc2lkZSBtZXRhZGF0YSBleHRyYWN0b3IgY29uZmlndXJlZCB3aXRoIHRoZQorICogZmlsZSBtYW5hZ2VyLgorICogCisgKiBAYXV0aG9yIHByYW1pcmV6IChQYXVsIFJhbWlyZXopCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqLworcHVibGljIGNsYXNzIEluZ2VzdEFuY2lsbGFyeSBleHRlbmRzIEZpbGVCYXNlZEFjdGlvbiB7CisgIHByaXZhdGUgU3RyaW5nIGZpbGVNYW5hZ2VyVXJsOworICBwcml2YXRlIFN0cmluZyBkYXRhVHJhbnNmZXJTZXJ2aWNlOworICBwcml2YXRlIFN0cmluZyByZWxhdGVkS2V5OworICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGFuY2lsbGFyeU1ldGFkYXRhOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjb3B5S2V5czsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVwbGFjZUR5bmFtaWNLZXlzOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiB3cml0ZUJhY2tLZXlzOworICBwcml2YXRlIFN0cmluZyB3cml0ZUJhY2tLZXlQcmVmaXg7CisKKyAgcHVibGljIEluZ2VzdEFuY2lsbGFyeSgpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaWxlQWN0aW9uKEZpbGUgYWN0aW9uRmlsZSwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgTWV0YWRhdGEgaW5nZXN0TWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBpZiAoYW5jaWxsYXJ5TWV0YWRhdGEgIT0gbnVsbCkgeworICAgICAgZm9yIChTdHJpbmcga2V5IDogdGhpcy5hbmNpbGxhcnlNZXRhZGF0YS5rZXlTZXQoKSkgeworICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHRoaXMuYW5jaWxsYXJ5TWV0YWRhdGEuZ2V0KGtleSkpIHsKKyAgICAgICAgICBpbmdlc3RNZXRhZGF0YS5hZGRNZXRhZGF0YShrZXksIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29weUtleXMgIT0gbnVsbCkgeworICAgICAgZm9yIChTdHJpbmcgY29weUtleSA6IGNvcHlLZXlzKSB7CisgICAgICAgIGlmIChtZXRhZGF0YS5jb250YWluc0tleShjb3B5S2V5KSkgeworICAgICAgICAgIGluZ2VzdE1ldGFkYXRhLmFkZE1ldGFkYXRhKGNvcHlLZXksIG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGNvcHlLZXkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmdlc3RNZXRhZGF0YS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKSA9PSBudWxsKSB7CisgICAgICBpbmdlc3RNZXRhZGF0YS5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLAorICAgICAgICAgIGFjdGlvbkZpbGUuZ2V0UGFyZW50KCkpOworICAgIH0KKyAgICBpZiAoaW5nZXN0TWV0YWRhdGEuZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUpID09IG51bGwpIHsKKyAgICAgIGluZ2VzdE1ldGFkYXRhLmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVOQU1FLCBhY3Rpb25GaWxlLmdldE5hbWUoKSk7CisgICAgfQorICAgIGlmIChpbmdlc3RNZXRhZGF0YS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX05BTUUpID09IG51bGwpIHsKKyAgICAgIGluZ2VzdE1ldGFkYXRhLmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLlBST0RVQ1RfTkFNRSwgYWN0aW9uRmlsZS5nZXROYW1lKCkKKyAgICAgICAgICAuc3Vic3RyaW5nKDAsIGFjdGlvbkZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoIi4iKSkpOworICAgIH0KKyAgICBpZiAoaW5nZXN0TWV0YWRhdGEuZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuUFJPRFVDVF9UWVBFKSA9PSBudWxsKSB7CisgICAgICBpbmdlc3RNZXRhZGF0YS5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX1RZUEUsIHByb2R1Y3RUeXBlKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgSW5nZXN0ZXIgaW5nZXN0ZXIgPSBuZXcgU3RkSW5nZXN0ZXIoZGF0YVRyYW5zZmVyU2VydmljZSk7CisgICAgICBTdHJpbmcgaWRlbnRpZmllciA9IGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKHRoaXMuZmlsZU1hbmFnZXJVcmwpLAorICAgICAgICAgIGFjdGlvbkZpbGUsIGluZ2VzdE1ldGFkYXRhKTsKKyAgICAgIGlmIChpZGVudGlmaWVyICE9IG51bGwpIHsKKyAgICAgICAgTE9HLmluZm8oIlN1Y2Nlc2Z1bGx5IGluZ2VzdGVkIGFuY2lsbGFyeSBmaWxlICIKKyAgICAgICAgICAgICsgYWN0aW9uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgd2l0aCBpZGVudGlmaWVyICIgKyBpZGVudGlmaWVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPRy5zZXZlcmUoIkZhaWxlZCB0byBpbmdlc3QgYW5jaWxsYXJ5IGZpbGUgIgorICAgICAgICAgICAgKyBhY3Rpb25GaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICArICIgaWRlbnRpZmVyIHdhcyBub3QgcmV0dXJuZWQgZnJvbSBmaWxlIG1hbmFnZXIiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlbGF0ZWRLZXkgIT0gbnVsbCkgeworICAgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShyZWxhdGVkS2V5LCBpZGVudGlmaWVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKHdyaXRlQmFja0tleXMgIT0gbnVsbCkgeworICAgICAgICBpZiAod3JpdGVCYWNrS2V5UHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICB3cml0ZUJhY2tLZXlQcmVmaXggPSAiIjsKKyAgICAgICAgfQorICAgICAgICBpbmdlc3RNZXRhZGF0YS5hZGRNZXRhZGF0YSh3cml0ZUJhY2tLZXlQcmVmaXggKyBDb3JlTWV0S2V5cy5QUk9EVUNUX0lELAorICAgICAgICAgICAgaWRlbnRpZmllcik7CisgICAgICAgIGZvciAoU3RyaW5nIHdyaXRlQmFja0tleSA6IHdyaXRlQmFja0tleXMpIHsKKyAgICAgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSh3cml0ZUJhY2tLZXlQcmVmaXggKyB3cml0ZUJhY2tLZXksCisgICAgICAgICAgICAgIGluZ2VzdE1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKHdyaXRlQmFja0tleSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChyZXBsYWNlRHluYW1pY0tleXMgIT0gbnVsbCkgeworICAgICAgICBmb3IgKFN0cmluZyByZXBsYWNlRHluYW1pY0tleSA6IHJlcGxhY2VEeW5hbWljS2V5cykgeworICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgICAgICBtZXRhZGF0YS5nZXRNZXRhZGF0YShyZXBsYWNlRHluYW1pY0tleSksIG1ldGFkYXRhKTsKKyAgICAgICAgICBtZXRhZGF0YS5yZW1vdmVNZXRhZGF0YShyZXBsYWNlRHluYW1pY0tleSk7CisgICAgICAgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEocmVwbGFjZUR5bmFtaWNLZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0cuc2V2ZXJlKCJGYWlsZWQgdG8gaW5nZXN0IGFuY2lsbGFyeSBmaWxlICIKKyAgICAgICAgICArIGFjdGlvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgTE9HLnNldmVyZShleC5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UmVwbGFjZUR5bmFtaWNLZXlzKExpc3Q8U3RyaW5nPiByZXBsYWNlRHluYW1pY0tleXMpIHsKKyAgICB0aGlzLnJlcGxhY2VEeW5hbWljS2V5cyA9IHJlcGxhY2VEeW5hbWljS2V5czsKKyAgfQorCisgIEBSZXF1aXJlZAorICBwdWJsaWMgdm9pZCBzZXRGaWxlTWFuYWdlclVybChTdHJpbmcgZmlsZU1hbmFnZXJVcmwpIHsKKyAgICB0aGlzLmZpbGVNYW5hZ2VyVXJsID0gZmlsZU1hbmFnZXJVcmw7CisgIH0KKworICBAUmVxdWlyZWQKKyAgcHVibGljIHZvaWQgc2V0RGF0YVRyYW5zZmVyU2VydmljZShTdHJpbmcgZGF0YVRyYW5zZmVyU2VydmljZSkgeworICAgIHRoaXMuZGF0YVRyYW5zZmVyU2VydmljZSA9IGRhdGFUcmFuc2ZlclNlcnZpY2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSZWxhdGVkS2V5KFN0cmluZyByZWxhdGVkS2V5KSB7CisgICAgdGhpcy5yZWxhdGVkS2V5ID0gcmVsYXRlZEtleTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEFuY2lsbGFyeU1ldGFkYXRhKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYW5jaWxsYXJ5TWV0YWRhdGEpIHsKKyAgICB0aGlzLmFuY2lsbGFyeU1ldGFkYXRhID0gYW5jaWxsYXJ5TWV0YWRhdGE7CisgIH0KKworICBAUmVxdWlyZWQKKyAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFR5cGUoU3RyaW5nIHByb2R1Y3RUeXBlKSB7CisgICAgdGhpcy5wcm9kdWN0VHlwZSA9IHByb2R1Y3RUeXBlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q29weUtleXMoTGlzdDxTdHJpbmc+IGNvcHlLZXlzKSB7CisgICAgdGhpcy5jb3B5S2V5cyA9IGNvcHlLZXlzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0V3JpdGVCYWNrS2V5cyhMaXN0PFN0cmluZz4gd3JpdGVCYWNrS2V5cykgeworICAgIHRoaXMud3JpdGVCYWNrS2V5cyA9IHdyaXRlQmFja0tleXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRXcml0ZUJhY2tLZXlQcmVmaXgoU3RyaW5nIHdyaXRlQmFja0tleVByZWZpeCkgeworICAgIHRoaXMud3JpdGVCYWNrS2V5UHJlZml4ID0gd3JpdGVCYWNrS2V5UHJlZml4OworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDYpIHsKKyAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAucHJpbnRsbigiVXNhZ2U6IGphdmEgIgorICAgICAgICAgICAgICArIEluZ2VzdEFuY2lsbGFyeS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgKyAiIDxzZXJ2aWNlVXJsPiA8dHJhbnNmZXJTZXJ2aWNlQ2xhc3M+IDxwcm9kdWN0RmlsZT4gPGZpbGVTdWZmaXg+IDxyZWxhdGVkS2V5PiA8cHJvZHVjdFR5cGUiKTsKKyAgICAgIFN5c3RlbS5leGl0KC0xKTsKKyAgICB9CisgICAgSW5nZXN0QW5jaWxsYXJ5IGluZ2VzdCA9IG5ldyBJbmdlc3RBbmNpbGxhcnkoKTsKKyAgICBpbmdlc3Quc2V0RmlsZU1hbmFnZXJVcmwoYXJnc1swXSk7CisgICAgaW5nZXN0LnNldERhdGFUcmFuc2ZlclNlcnZpY2UoYXJnc1sxXSk7CisgICAgRmlsZSBwcm9kdWN0ID0gbmV3IEZpbGUoYXJnc1syXSk7CisgICAgaW5nZXN0LnNldEZpbGVTdWZmaXgoYXJnc1szXSk7CisgICAgaW5nZXN0LnNldFJlbGF0ZWRLZXkoYXJnc1s0XSk7CisgICAgaW5nZXN0LnNldFByb2R1Y3RUeXBlKGFyZ3NbNV0pOworICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgaW5nZXN0LnBlcmZvcm1BY3Rpb24ocHJvZHVjdCwgbWV0YWRhdGEpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5nZXN0ZWQgIiArIGFyZ3NbNV0gKyAiOiAiCisgICAgICAgICsgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoYXJnc1s0XSkpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9NaW1lVHlwZUNyYXdsZXJBY3Rpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL01pbWVUeXBlQ3Jhd2xlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZThlZjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9NaW1lVHlwZUNyYXdsZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5NSU1FX1RZUEVTX0hJRVJBUkNIWTsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlJlcXVpcmVkOworCisvKioKKyAqIENhbGxzIGEge0BsaW5rIENyYXdsZXJBY3Rpb259IGlmIHRoaXMge0BsaW5rIEZpbGV9IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZXQKKyAqIG9mIGludGVybmFsIHtAbGluayAjbWltZVR5cGVzfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNaW1lVHlwZUNyYXdsZXJBY3Rpb24gZXh0ZW5kcyBDcmF3bGVyQWN0aW9uIHsKKworICAgcHJpdmF0ZSBDcmF3bGVyQWN0aW9uIGFjdGlvblRvQ2FsbDsKKyAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1pbWVUeXBlczsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQWN0aW9uKEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhKQorICAgICAgICAgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgTGlzdDxTdHJpbmc+IG1pbWVUeXBlSGllcmFyY2h5ID0gcHJvZHVjdE1ldGFkYXRhCisgICAgICAgICAgICAuZ2V0QWxsTWV0YWRhdGEoTUlNRV9UWVBFU19ISUVSQVJDSFkpOworICAgICAgaWYgKG1pbWVUeXBlSGllcmFyY2h5ID09IG51bGwpCisgICAgICAgICBtaW1lVHlwZUhpZXJhcmNoeSA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgaWYgKG1pbWVUeXBlcyA9PSBudWxsCisgICAgICAgICAgICB8fCAobWltZVR5cGVzICE9IG51bGwgJiYgIUNvbGxlY3Rpb25zLmRpc2pvaW50KG1pbWVUeXBlcywKKyAgICAgICAgICAgICAgICAgIG1pbWVUeXBlSGllcmFyY2h5KSkpIHsKKyAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvblRvQ2FsbC5wZXJmb3JtQWN0aW9uKHByb2R1Y3QsIHByb2R1Y3RNZXRhZGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU2tpcHBpbmcgYWN0aW9uIChpZCA9ICIgKyB0aGlzLmdldElkKCkKKyAgICAgICAgICAgICAgICsgIiA6IGRlc2NyaXB0aW9uID0gIiArIHRoaXMuZ2V0RGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgKyAiIC0gZG9lc24ndCBhcHBseSB0byBjdXJyZW50IHByb2R1Y3QiKTsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgc3VwZXIudmFsaWRhdGUoKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGFjdGlvblRvQ2FsbCwgIk11c3Qgc3BlY2lmeSBhY3Rpb25Ub0NhbGwiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgIH0KKworICAgQFJlcXVpcmVkCisgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25Ub0NhbGwoQ3Jhd2xlckFjdGlvbiBhY3Rpb25Ub0NhbGwpIHsKKyAgICAgIHRoaXMuYWN0aW9uVG9DYWxsID0gYWN0aW9uVG9DYWxsOworICAgICAgdGhpcy5zZXREZXNjcmlwdGlvbigiTWltZS10eXBlIHJlc3RyaWN0ZWQgdmVyc2lvbiBvZiAnIgorICAgICAgICAgICAgKyB0aGlzLmFjdGlvblRvQ2FsbC5nZXRJZCgpICsgIicgQ3Jhd2xlckFjdGlvbiIpOworICAgICAgdGhpcy5zZXRQaGFzZXModGhpcy5hY3Rpb25Ub0NhbGwuZ2V0UGhhc2VzKCkpOworICAgfQorCisgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1pbWVUeXBlcygpIHsKKyAgICAgIHJldHVybiBtaW1lVHlwZXM7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE1pbWVUeXBlcyhMaXN0PFN0cmluZz4gbWltZVR5cGVzKSB7CisgICAgICB0aGlzLm1pbWVUeXBlcyA9IG1pbWVUeXBlczsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL01vdmVGaWxlLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Nb3ZlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmQ1OTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Nb3ZlRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL1NwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUmVxdWlyZWQ7CisKKy8vRmlsZS5VdGlscyBpbXBvcnQgdG8gaGFuZGxlIE5GUyBtb3VudGVkIGRpcmVjdG9yaWVzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworCisvKioKKyAqIE1vdmVzIGEge0BsaW5rIFByb2R1Y3R9IGZpbGUgYXMgYSByZXBvbnNlIHRvIGEgQ3Jhd2xlciBsaWZlY3ljbGUgcGhhc2UKKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqLworcHVibGljIGNsYXNzIE1vdmVGaWxlIGV4dGVuZHMgQ3Jhd2xlckFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGZpbGU7CisgICBwcml2YXRlIFN0cmluZyB0b0RpcjsKKyAgIHByaXZhdGUgU3RyaW5nIGZpbGVFeHRlbnNpb247CisgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlVG9EaXI7CisKKyAgIHB1YmxpYyBNb3ZlRmlsZSgpIHsKKyAgICAgIHN1cGVyKCk7CisgICAgICB0aGlzLmNyZWF0ZVRvRGlyID0gZmFsc2U7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEpCisgICAgICAgICB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgbXZGaWxlID0gZmlsZTsKKyAgICAgIHRyeSB7CisgICAgICAgICBpZiAobXZGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIG12RmlsZSA9IHByb2R1Y3QuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBpZiAodGhpcy5maWxlRXh0ZW5zaW9uICE9IG51bGwpCisgICAgICAgICAgICAgICBtdkZpbGUgKz0gIi4iICsgdGhpcy5maWxlRXh0ZW5zaW9uOworICAgICAgICAgfQorICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUobXZGaWxlKTsKKyAgICAgICAgIEZpbGUgdG9GaWxlID0gbmV3IEZpbGUodG9EaXIgKyAiLyIgKyBzcmNGaWxlLmdldE5hbWUoKSk7CisgICAgICAgICBpZiAoY3JlYXRlVG9EaXIpCisgICAgICAgICAgICB0b0ZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiTW92aW5nIGZpbGUgIiArIHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICsgIiB0byAiICsgdG9GaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgIGlmKCFzcmNGaWxlLnJlbmFtZVRvKHRvRmlsZSkpIHsvL0lmIHRoZSBmaWxlIGZhaWxlZCB0byBjb3B5CisgICAgICAgIAkgTE9HLmxvZyhMZXZlbC5JTkZPLCAiTW92aW5nIGZhaWxlZCwgcG9zc2libHkgYmVjYXVzZSBpbmdlc3QgZGlyIGlzIG5mcyBtb3VudGVkLiBSZXRyeWluZyB0byBtb3ZlICIgKyBzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICArICIgdG8gIiArIHRvRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIAkgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3Rvcnkoc3JjRmlsZSwgdG9GaWxlLmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgIAkgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHNyY0ZpbGUpOyAvL05lZWQgdG8gZGVsZXRlIHRoZSBvbGQgZmlsZQorICAgICAgICAJIHJldHVybiB0cnVlOyAvL0ZpbGUgY29waWVkIG9uIHNlY29uZCBhdHRlbXB0CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgIAkgcmV0dXJuIHRydWU7IC8vRmlsZSBjb3BpZWQKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIG1vdmUgZmlsZSBmcm9tICIgKyBtdkZpbGUKKyAgICAgICAgICAgICAgICsgIiB0byAiICsgdGhpcy50b0RpciArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgc3VwZXIudmFsaWRhdGUoKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5pc1RydWUoZmlsZSA9PSBudWxsIHx8IGZpbGVFeHRlbnNpb24gPT0gbnVsbCwKKyAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgZWl0aGVyIGZpbGUgb3IgZmlsZUV4dGVuc2lvbiIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVUb0Rpcihib29sZWFuIGNyZWF0ZVRvRGlyKSB7CisgICAgICB0aGlzLmNyZWF0ZVRvRGlyID0gY3JlYXRlVG9EaXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICB9CisKKyAgIEBSZXF1aXJlZAorICAgcHVibGljIHZvaWQgc2V0VG9EaXIoU3RyaW5nIHRvRGlyKSB7CisgICAgICB0aGlzLnRvRGlyID0gdG9EaXI7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9EaXIoKSB7CisgICAgICByZXR1cm4gdG9EaXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEZpbGVFeHRlbnNpb24oU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKKyAgICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Tb2xySW5kZXhpbmdBY3Rpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL1NvbHJJbmRleGluZ0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmYyM2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9Tb2xySW5kZXhpbmdBY3Rpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbjsKKworLy8gSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5DcmF3bGVyQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzLlNvbHJJbmRleGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQ3Jhd2xlciBhY3Rpb24gdGhhdCBpbmdlc3RzIHRoZSBwcm9kdWN0IG1ldGFkYXRhIGludG8gdGhlIGNvbmZpZ3VyZWQgU29sciBpbmRleC4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgU29sckluZGV4aW5nQWN0aW9uIGV4dGVuZHMgQ3Jhd2xlckFjdGlvbiB7CisJCisJLy8gVVJMIG9mIFNvbHIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHZhbHVlLgorCXByaXZhdGUgU3RyaW5nIHNvbHJVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIiOworCQorCS8vIFVSTCBvZiBGaWxlIE1hbmFnZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHZhbHVlCisJcHJpdmF0ZSBTdHJpbmcgZmlsZU1hbmFnZXJVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo5MDAwLyI7CisJCisJLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzIChjb250YWluaW5nIGxvY2F0aW9uIG9mIGluZGV4ZXIucHJvcGVydGllcykKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52ID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKwkKKwkvLyBzZXJ2aWNlIHJlc3BvbnNpYmxlIGZvciBtZXRhZGF0YSBtaWdyYXRpb24KKwlwcml2YXRlIFNvbHJJbmRleGVyIHNvbHJJbmRleGVyID0gbnVsbDsKKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEpIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKwkJCisJCXRyeSB7CisJCQkKKwkJCVN0cmluZyBwcm9kdWN0TmFtZSA9IHByb2R1Y3RNZXRhZGF0YS5nZXRNZXRhZGF0YSgiUHJvZHVjdE5hbWUiKTsKKwkJCUxPRy5sb2coTGV2ZWwuSU5GTywgIkluZGV4aW5nIHByb2R1Y3Q6ICIrcHJvZHVjdE5hbWUrICIgZnJvbSBGaWxlIE1hbmFnZXIgY2F0YWxvZzogIitmaWxlTWFuYWdlclVybCsiIGludG8gU29sciBpbmRleDogIitzb2xyVXJsKTsKKwkJCXNvbHJJbmRleGVyLmluZGV4UHJvZHVjdEJ5TmFtZShwcm9kdWN0TmFtZSwgdHJ1ZSk7IC8vIGRlbGV0ZT10cnVlCisJCQlzb2xySW5kZXhlci5jb21taXQoKTsgLy8gbXVzdCBjb21taXQ6dworCQkJcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3MKKwkJCQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbihlKTsKKwkJfQorCQkKKwl9CisJCisJLyoqCisJICogSW5pdGlhbGl6YXRpb24gbWV0aG9kIGNvbmZpZ3VyZXMgdGhlIFNvbHJJbmRleGVyLgorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisJCQorCQkvLyBzZXQgZW52aXJvbm1lbnQgZnJvbSBiZWFuIGNvbmZpZ3VyYXRpb24KKwkJLy8gKGluY2x1ZGluZyBpbmRleGVyLnByb3BlcnRpZXMpCisJCWZvciAoU3RyaW5nIHMgOiBlbnYua2V5U2V0KCkpIHsKKwkJCVN5c3RlbS5zZXRQcm9wZXJ0eShzLCBlbnYuZ2V0KHMpKTsKKwkJfQorCQkKKwkJLy8gaW5zdGFudGlhdGUgaW5kZXhpbmcgc2VydmljZQorCQlzb2xySW5kZXhlciA9IG5ldyBTb2xySW5kZXhlcihzb2xyVXJsLCBmaWxlTWFuYWdlclVybCk7CisJCQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTb2xyVXJsKFN0cmluZyBzb2xyVXJsKSB7CisJCXRoaXMuc29sclVybCA9IHNvbHJVcmw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEZpbGVNYW5hZ2VyVXJsKFN0cmluZyBmaWxlTWFuYWdlclVybCkgeworCQl0aGlzLmZpbGVNYW5hZ2VyVXJsID0gZmlsZU1hbmFnZXJVcmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0RW52KE1hcDxTdHJpbmcsIFN0cmluZz4gZW52KSB7CisJCXRoaXMuZW52ID0gZW52OworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vVGVybmFyeUFjdGlvbi5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vVGVybmFyeUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjNDk2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2FjdGlvbi9UZXJuYXJ5QWN0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkNyYXdsZXJBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIFdoaWxlIGJyYW5jaGluZyBzZWVtcyBtb3JlIGFsb25nIHRoZSBsaW5lcyBvZiBhIHdvcmtmbG93IGRlYWwgaGF2aW5nIHN1cHBvcnQKKyAqIGZvciBkZWNpc2lvbnMgYmFzZWQgb24gc3VjY2VzcyBvciBmYWlsdXJlIG9mIGFuIGFjdGlvbiBjYW4gaGVscCBzdXBwb3J0CisgKiBzbGlnaHRseSBtb3JlIGNvbXBsZXggaW5nZXN0IHNjZW5hcmlvcy4gU2luY2UgYW4gYWN0aW9uIHJldHVybnMgYSB0cnVlIG9yCisgKiBmYWxzZSB0aGlzIGFjdGlvbiBjb3VsZCBiZSBhcyBzaW1wbGUgYXMgdGFraW5nIG9uZSBhY3Rpb24gYXMgYSBjb25kaXRpb24KKyAqIGFjdGlvbiBhbmQgdGhlbiBydW5uaW5nIGVpdGhlciBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY3Rpb24uIFRoaXMgYWN0aW9uCisgKiBzaG91bGQgYWxsb3cgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY3Rpb24gdG8gcmVtYWluIHVuc3BlY2lmaWVkLgorICogCisgKiBAc2luY2UgT09EVC0zNgorICogQGF1dGhvciBwcmFtaXJleiAoUGF1bCBSYW1pcmV6KQorICovCitwdWJsaWMgY2xhc3MgVGVybmFyeUFjdGlvbiBleHRlbmRzIENyYXdsZXJBY3Rpb24geworICAgcHJpdmF0ZSBDcmF3bGVyQWN0aW9uIGNvbmRpdGlvbkFjdGlvbjsKKyAgIHByaXZhdGUgQ3Jhd2xlckFjdGlvbiBzdWNjZXNzQWN0aW9uOworICAgcHJpdmF0ZSBDcmF3bGVyQWN0aW9uIGZhaWx1cmVBY3Rpb247CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbihGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgICAgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgTE9HLmluZm8oIlBlcmZvcm1pbmcgYWN0aW9uIChpZCA9ICIgKyBjb25kaXRpb25BY3Rpb24uZ2V0SWQoKQorICAgICAgICAgICAgKyAiIDogZGVzY3JpcHRpb24gPSAiICsgY29uZGl0aW9uQWN0aW9uLmdldERlc2NyaXB0aW9uKCkgKyAiKSIpOworICAgICAgYm9vbGVhbiBwYXNzZWRDb25kaXRpb24gPSBjb25kaXRpb25BY3Rpb24KKyAgICAgICAgICAgIC5wZXJmb3JtQWN0aW9uKHByb2R1Y3QsIG1ldGFkYXRhKTsKKyAgICAgIGlmIChwYXNzZWRDb25kaXRpb24pIHsKKyAgICAgICAgIExPRy5pbmZvKCJQZXJmb3JtaW5nIGFjdGlvbiAoaWQgPSAiICsgc3VjY2Vzc0FjdGlvbi5nZXRJZCgpCisgICAgICAgICAgICAgICArICIgOiBkZXNjcmlwdGlvbiA9ICIgKyBzdWNjZXNzQWN0aW9uLmdldERlc2NyaXB0aW9uKCkgKyAiKSIpOworICAgICAgICAgcmV0dXJuIChzdWNjZXNzQWN0aW9uID09IG51bGwpID8gdHJ1ZSA6IHN1Y2Nlc3NBY3Rpb24ucGVyZm9ybUFjdGlvbigKKyAgICAgICAgICAgICAgIHByb2R1Y3QsIG1ldGFkYXRhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBMT0cuaW5mbygiUGVyZm9ybWluZyBhY3Rpb24gKGlkID0gIiArIGZhaWx1cmVBY3Rpb24uZ2V0SWQoKQorICAgICAgICAgICAgICAgKyAiIDogZGVzY3JpcHRpb24gPSAiICsgZmFpbHVyZUFjdGlvbi5nZXREZXNjcmlwdGlvbigpICsgIikiKTsKKyAgICAgICAgIHJldHVybiAoZmFpbHVyZUFjdGlvbiA9PSBudWxsKSA/IHRydWUgOiBmYWlsdXJlQWN0aW9uLnBlcmZvcm1BY3Rpb24oCisgICAgICAgICAgICAgICBwcm9kdWN0LCBtZXRhZGF0YSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldENvbmRpdGlvbkFjdGlvbihDcmF3bGVyQWN0aW9uIGNvbmRpdGlvbkFjdGlvbikgeworICAgICAgdGhpcy5jb25kaXRpb25BY3Rpb24gPSBjb25kaXRpb25BY3Rpb247CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFN1Y2Nlc3NBY3Rpb24oQ3Jhd2xlckFjdGlvbiBzdWNjZXNzQWN0aW9uKSB7CisgICAgICB0aGlzLnN1Y2Nlc3NBY3Rpb24gPSBzdWNjZXNzQWN0aW9uOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlQWN0aW9uKENyYXdsZXJBY3Rpb24gZmFpbHVyZUFjdGlvbikgeworICAgICAgdGhpcy5mYWlsdXJlQWN0aW9uID0gZmFpbHVyZUFjdGlvbjsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL1RvZ2dsZUFjdGlvbi5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vVG9nZ2xlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3ZmM2MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL1RvZ2dsZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9ucy5DcmF3bGVyQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQWxsb3dzIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgb25lIG9mIHR3byAob3IgbW9yZSkgYWN0aW9ucyB3aGljaCBuZWVkcyB0bworICogcnVuLiBGb3IgZXhhbXBsZTogc29tZXRpbWVzIHRoZSBzYW1lIGZpbGUgdHlwZXMgaGF2ZSBkaWZmZXJlbnQgY2hlY2tzdW0gZmlsZXMKKyAqIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhpcyBhbGxvd3MgZm9yIGVpdGhlciBjYXNlLgorICogCisgKiBAYXV0aG9yIHByYW1pcmV6IChQYXVsIFJhbWlyZXopCisgKi8KK3B1YmxpYyBjbGFzcyBUb2dnbGVBY3Rpb24gZXh0ZW5kcyBDcmF3bGVyQWN0aW9uIHsKKworICAgcHJpdmF0ZSBMaXN0PFRvZ2dsZT4gdG9nZ2xlczsKKyAgIHByaXZhdGUgYm9vbGVhbiBzaG9ydENpcmN1aXQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbihGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmICh0aGlzLnRvZ2dsZXMgIT0gbnVsbCAmJiB0aGlzLnRvZ2dsZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgYm9vbGVhbiBnbG9iYWxTdWNjZXNzID0gZmFsc2U7CisgICAgICAgICBmb3IgKFRvZ2dsZSB0b2dnbGUgOiB0aGlzLnRvZ2dsZXMpIHsKKyAgICAgICAgICAgIENyYXdsZXJBY3Rpb24gY3VycmVudEFjdGlvbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgaWYgKHRvZ2dsZS5pc09uKHByb2R1Y3QsIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICYmIChjdXJyZW50QWN0aW9uID0gdG9nZ2xlLmdldENyYXdsZXJBY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJmb3JtQWN0aW9uKHByb2R1Y3QsIHByb2R1Y3RNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgIGdsb2JhbFN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvcnRDaXJjdWl0KQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIHJ1biB0b2dnbGUgYWN0aW9uICciCisgICAgICAgICAgICAgICAgICAgICArIChjdXJyZW50QWN0aW9uICE9IG51bGwgPyBjdXJyZW50QWN0aW9uLmdldElkKCkgOiBudWxsKQorICAgICAgICAgICAgICAgICAgICAgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gZ2xvYmFsU3VjY2VzczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0VG9nZ2xlcyhMaXN0PFRvZ2dsZT4gdG9nZ2xlcykgeworICAgICAgdGhpcy50b2dnbGVzID0gdG9nZ2xlczsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0U2hvcnRDaXJjdWl0KGJvb2xlYW4gc2hvcnRDaXJjdWl0KSB7CisgICAgICB0aGlzLnNob3J0Q2lyY3VpdCA9IHNob3J0Q2lyY3VpdDsKKyAgIH0KKworICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRvZ2dsZSB7CisKKyAgICAgIHByaXZhdGUgQ3Jhd2xlckFjdGlvbiBhY3Rpb247CisKKyAgICAgIHB1YmxpYyB2b2lkIHNldENyYXdsZXJBY3Rpb24oQ3Jhd2xlckFjdGlvbiBhY3Rpb24pIHsKKyAgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgICAgfQorCisgICAgICBwdWJsaWMgQ3Jhd2xlckFjdGlvbiBnZXRDcmF3bGVyQWN0aW9uKCkgeworICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uOworICAgICAgfQorCisgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09uKEZpbGUgcHJvZHVjdCwgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhKTsKKworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9hY3Rpb24vV29ya2Zsb3dNZ3JTdGF0dXNVcGRhdGUuamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL1dvcmtmbG93TWdyU3RhdHVzVXBkYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyYTg3NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvYWN0aW9uL1dvcmtmbG93TWdyU3RhdHVzVXBkYXRlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9ucy5DcmF3bGVyQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlJlcXVpcmVkOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIFdvcmtmbG93IE1hbmFnZXIgYW5kIG5vdGlmaWVzIGl0IHRoYXQgdGhlIGNyYXdsZWQge0BsaW5rIFByb2R1Y3R9CisgKiBoYXMgYmVlbiBpbmdlc3RlZCBzdWNjZXNzZnVsbHkuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd01nclN0YXR1c1VwZGF0ZSBleHRlbmRzIENyYXdsZXJBY3Rpb24gaW1wbGVtZW50cworICAgICAgQ29yZU1ldEtleXMgeworCisgICBwcml2YXRlIFN0cmluZyBpbmdlc3RTdWZmaXg7CisgICBwcml2YXRlIFN0cmluZyB3b3JrZmxvd01nclVybDsKKworICAgcHVibGljIFdvcmtmbG93TWdyU3RhdHVzVXBkYXRlKCkgeworICAgICAgaW5nZXN0U3VmZml4ID0gIkluZ2VzdCI7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oRmlsZSBwcm9kdWN0LCBNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEpCisgICAgICAgICB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IHdDbGllbnQgPSBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KAorICAgICAgICAgICAgICAgbmV3IFVSTCh0aGlzLndvcmtmbG93TWdyVXJsKSk7CisgICAgICAgICBTdHJpbmcgaW5nZXN0U3VmZml4ID0gdGhpcy5pbmdlc3RTdWZmaXg7CisgICAgICAgICByZXR1cm4gd0NsaWVudC5zZW5kRXZlbnQocHJvZHVjdE1ldGFkYXRhLmdldE1ldGFkYXRhKFBST0RVQ1RfVFlQRSkKKyAgICAgICAgICAgICAgICsgaW5nZXN0U3VmZml4LCBwcm9kdWN0TWV0YWRhdGEpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1cGRhdGUgd29ya2Zsb3cgbWFuYWdlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBzdXBlci52YWxpZGF0ZSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwoaW5nZXN0U3VmZml4LCAiTXVzdCBzcGVjaWZ5IGluZ2VzdFN1ZmZpeCIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRJbmdlc3RTdWZmaXgoU3RyaW5nIGluZ2VzdFN1ZmZpeCkgeworICAgICAgdGhpcy5pbmdlc3RTdWZmaXggPSBpbmdlc3RTdWZmaXg7CisgICB9CisKKyAgIEBSZXF1aXJlZAorICAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3dNZ3JVcmwoU3RyaW5nIHdvcmtmbG93TWdyVXJsKSB7CisgICAgICB0aGlzLndvcmtmbG93TWdyVXJsID0gd29ya2Zsb3dNZ3JVcmw7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9hY3Rpb24vQ3Jhd2xlckxhdW5jaGVyQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9hY3Rpb24vQ3Jhd2xlckxhdW5jaGVyQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlOGVhOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY2xpL2FjdGlvbi9DcmF3bGVyTGF1bmNoZXJDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkuYWN0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuUHJvZHVjdENyYXdsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5kYWVtb24uQ3Jhd2xEYWVtb247CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBsYXVuY2hpbmcgY3Jhd2xlcnMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ3Jhd2xlckxhdW5jaGVyQ2xpQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGJlYW5SZXBvOworICAgcHJpdmF0ZSBTdHJpbmcgY3Jhd2xlcklkOworCisgICBwdWJsaWMgQ3Jhd2xlckxhdW5jaGVyQ2xpQWN0aW9uKCkgeworICAgICAgdGhpcy5iZWFuUmVwbyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5iZWFuLnJlcG8iLAorICAgICAgICAgICAgImNsYXNzcGF0aDovb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jcmF3bGVyLWNvbmZpZy54bWwiKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgIEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCA9IG5ldyBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0KAorICAgICAgICAgICAgdGhpcy5iZWFuUmVwbyk7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBQcm9kdWN0Q3Jhd2xlciBwYyA9IChQcm9kdWN0Q3Jhd2xlcikgYXBwQ29udGV4dAorICAgICAgICAgICAgICAgLmdldEJlYW4oY3Jhd2xlcklkICE9IG51bGwgPyBjcmF3bGVySWQgOiBnZXROYW1lKCkpOworICAgICAgICAgcGMuc2V0QXBwbGljYXRpb25Db250ZXh0KGFwcENvbnRleHQpOworICAgICAgICAgaWYgKHBjLmdldERhZW1vblBvcnQoKSAhPSAtMSAmJiBwYy5nZXREYWVtb25XYWl0KCkgIT0gLTEpIHsKKyAgICAgICAgICAgIG5ldyBDcmF3bERhZW1vbihwYy5nZXREYWVtb25XYWl0KCksIHBjLCBwYy5nZXREYWVtb25Qb3J0KCkpCisgICAgICAgICAgICAgICAgICAuc3RhcnRDcmF3bGluZygpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBjLmNyYXdsKCk7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBsYXVuY2ggY3Jhd2xlciA6ICIKKyAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDcmF3bGVySWQoU3RyaW5nIGNyYXdsZXJJZCkgeworICAgICAgdGhpcy5jcmF3bGVySWQgPSBjcmF3bGVySWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9vcHRpb24vaGFuZGxlci9CZWFuSW5mb0hhbmRsZXIuamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY2xpL29wdGlvbi9oYW5kbGVyL0JlYW5JbmZvSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODY4NzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9vcHRpb24vaGFuZGxlci9CZWFuSW5mb0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5DbWRMaW5lT3B0aW9uSGFuZGxlcjsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5EZXNjcmliZSB5b3VyIGNsYXNzIGhlcmU8L3A+LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmVhbkluZm9IYW5kbGVyIGltcGxlbWVudHMgQ21kTGluZU9wdGlvbkhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtOworICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dDsKKworICAgIHB1YmxpYyBCZWFuSW5mb0hhbmRsZXIoKSB7CisgICAgICAgIHRoaXMub3V0U3RyZWFtID0gU3lzdGVtLm91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkNvbnRleHQoQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgeworICAgICAgICB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3V0U3RyZWFtOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB7CisgICAgICAgIHRoaXMub3V0U3RyZWFtID0gb3V0U3RyZWFtOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jbGkvb3B0aW9uL2hhbmRsZXIvQ3Jhd2xlckFjdGlvbkluZm9IYW5kbGVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9vcHRpb24vaGFuZGxlci9DcmF3bGVyQWN0aW9uSW5mb0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZlMmMyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jbGkvb3B0aW9uL2hhbmRsZXIvQ3Jhd2xlckFjdGlvbkluZm9IYW5kbGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkNyYXdsZXJBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTWltZVR5cGVDcmF3bGVyQWN0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBDcmF3bGVyQWN0aW9uSW5mb0hhbmRsZXIgZXh0ZW5kcyBCZWFuSW5mb0hhbmRsZXIgeworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIC8vIERvIG5vdGhpbmcuCisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgaGFuZGxlT3B0aW9uKENtZExpbmVBY3Rpb24gc2VsZWN0ZWRBY3Rpb24sIENtZExpbmVPcHRpb25JbnN0YW5jZSBvcHRpb25JbnN0YW5jZSkgeworICAgICAgU3RyaW5nW10gYWN0aW9uSWRzID0gdGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRCZWFuTmFtZXNGb3JUeXBlKAorICAgICAgICAgICAgQ3Jhd2xlckFjdGlvbi5jbGFzcyk7CisgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0odGhpcy5nZXRPdXRTdHJlYW0oKSk7CisgICAgcHMucHJpbnRsbigiQWN0aW9uczoiKTsKKyAgICBmb3IgKFN0cmluZyBhY3Rpb25JZCA6IGFjdGlvbklkcykgeworICAgICAgICBDcmF3bGVyQWN0aW9uIGNhID0gKENyYXdsZXJBY3Rpb24pIHRoaXMuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0QmVhbihhY3Rpb25JZCk7CisgICAgICAgIHBzLnByaW50bG4oIiAgQWN0aW9uOiIpOworICAgICAgICBwcy5wcmludGxuKCIgICAgSWQ6ICIgKyBjYS5nZXRJZCgpKTsKKyAgICAgICAgcHMucHJpbnRsbigiICAgIERlc2NyaXB0aW9uOiAiICsgY2EuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIHBzLnByaW50bG4oIiAgICBQaGFzZXM6ICIgKyBjYS5nZXRQaGFzZXMoKSk7CisgICAgICAgIGlmIChjYSBpbnN0YW5jZW9mIE1pbWVUeXBlQ3Jhd2xlckFjdGlvbikKKyAgICAgICAgICAgIHBzLnByaW50bG4oIiAgICBNaW1lVHlwZXM6ICIgCisgICAgICAgICAgICAgICAgICAgICsgKChNaW1lVHlwZUNyYXdsZXJBY3Rpb24pIGNhKS5nZXRNaW1lVHlwZXMoKSk7CisgICAgICAgIHBzLnByaW50bG4oKTsKKyAgICB9CisgICAgcHMuY2xvc2UoKTsgICAgICAKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIGdldEhlbHAoQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnRGVzY3JpcHRpb24oQ21kTGluZUFjdGlvbiBhY3Rpb24sIENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY2xpL29wdGlvbi9oYW5kbGVyL0NyYXdsZXJCZWFuc1Byb3BIYW5kbGVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9vcHRpb24vaGFuZGxlci9DcmF3bGVyQmVhbnNQcm9wSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNGI4OWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9vcHRpb24vaGFuZGxlci9DcmF3bGVyQmVhbnNQcm9wSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qICAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSAKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyOworCisvL0pESyBpbXBvcnRzIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cyAKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQ21kTGluZU9wdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkNtZExpbmVPcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5BY3Rpb25CZWFuUHJvcGVydGllczsKKworLyoqIAorICogQSB7QGxpbmsgQ21kTGluZU9wdGlvbkhhbmRsZXJ9IHdoaWNoIGFkZHMgYmVhbiBwcm9wZXJ0aWVzIHRvCisgKiB7QGxpbmsgQWN0aW9uQmVhblByb3BlcnRpZXN9IHNvIHRoYXQgdGhleSBjYW4gdGhlbiBiZSBpbmplY3RlZCBpbnRvIAorICoge0BsaW5rIFByb2R1Y3RDcmF3bGVyfXMgYW5kIHtAbGluayBDcmF3bGVyQWN0aW9ufXMuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpIAorICovCisKK3B1YmxpYyBjbGFzcyBDcmF3bGVyQmVhbnNQcm9wSGFuZGxlciBpbXBsZW1lbnRzIENtZExpbmVPcHRpb25IYW5kbGVyIHsKKworICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJvcGVydGllczsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICAvLyBEbyBub3RoaW5nLgorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGhhbmRsZU9wdGlvbihDbWRMaW5lQWN0aW9uIHNlbGVjdGVkQWN0aW9uLAorICAgICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3RhbmNlKSB7CisgICAgICBmb3IgKFN0cmluZyBiZWFuUHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7CisgICAgICAgICBpZiAob3B0aW9uSW5zdGFuY2UuZ2V0VmFsdWVzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25JbnN0YW5jZS5nZXRWYWx1ZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgQWN0aW9uQmVhblByb3BlcnRpZXMuc2V0UHJvcGVydHkoYmVhblByb3BlcnR5ICsgIlsiICsgaSArICJdIiwKKyAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkluc3RhbmNlLmdldFZhbHVlcygpLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25JbnN0YW5jZS5nZXRWYWx1ZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFjdGlvbkJlYW5Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KGJlYW5Qcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgIG9wdGlvbkluc3RhbmNlLmdldFZhbHVlcygpLmdldCgwKSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICBDcmF3bGVyQmVhbnNQcm9wSGFuZGxlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYW4ndCBhcHBseSBvcHRpb24gJyIgKyBvcHRpb25JbnN0YW5jZS5nZXRPcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBzaW5jZSBpdCBoYXMgbm8gdmFsdWUiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIGdldEhlbHAoQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIHJldHVybiAiU2V0IHRoZSBmb2xsb3dpbmcgYmVhbiBwcm9wZXJ0aWVzOiAiICsgcHJvcGVydGllczsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIGdldEFyZ0Rlc2NyaXB0aW9uKENtZExpbmVBY3Rpb24gYWN0aW9uLCBDbWRMaW5lT3B0aW9uIG9wdGlvbikgeworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTGlzdDxTdHJpbmc+IHByb3BlcnRpZXMpIHsKKyAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NsaS9vcHRpb24vaGFuZGxlci9QcmVjb25kaXRpb25JbmZvSGFuZGxlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jbGkvb3B0aW9uL2hhbmRsZXIvUHJlY29uZGl0aW9uSW5mb0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE2Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jbGkvb3B0aW9uL2hhbmRsZXIvUHJlY29uZGl0aW9uSW5mb0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5DbWRMaW5lT3B0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLlByZUNvbmRpdGlvbkNvbXBhcmF0b3I7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFByZWNvbmRpdGlvbkluZm9IYW5kbGVyIGV4dGVuZHMgQmVhbkluZm9IYW5kbGVyIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENtZExpbmVPcHRpb24gb3B0aW9uKSB7CisgICAgICAvLyBEbyBub3RoaW5nLgorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGhhbmRsZU9wdGlvbihDbWRMaW5lQWN0aW9uIHNlbGVjdGVkQWN0aW9uLAorICAgICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIG9wdGlvbkluc3RhbmNlKSB7CisgICAgICBTdHJpbmdbXSBwcmVDb25kSWRzID0gdGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRCZWFuTmFtZXNGb3JUeXBlKAorICAgICAgICAgICAgUHJlQ29uZGl0aW9uQ29tcGFyYXRvci5jbGFzcyk7CisgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbSh0aGlzLmdldE91dFN0cmVhbSgpKTsKKyAgICAgIHBzLnByaW50bG4oIlByZUNvbmRpdGlvbkNvbXBhcmF0b3JzOiIpOworICAgICAgZm9yIChTdHJpbmcgcHJlQ29uZElkIDogcHJlQ29uZElkcykgeworICAgICAgICAgUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjw/PiBwcmVDb25kID0gKFByZUNvbmRpdGlvbkNvbXBhcmF0b3I8Pz4pIHRoaXMKKyAgICAgICAgICAgICAgIC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRCZWFuKHByZUNvbmRJZCk7CisgICAgICAgICBwcy5wcmludGxuKCIgIFByZUNvbmRDb21wYXJhdG9yOiIpOworICAgICAgICAgcHMucHJpbnRsbigiICAgIElkOiAiICsgcHJlQ29uZElkKTsKKyAgICAgICAgIHBzLnByaW50bG4oIiAgICBEZXNjcmlwdGlvbjogIiArIHByZUNvbmQuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICBwcy5wcmludGxuKCk7CisgICAgICB9CisgICAgICBwcy5jbG9zZSgpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVscChDbWRMaW5lT3B0aW9uIG9wdGlvbikgeworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFN0cmluZyBnZXRBcmdEZXNjcmlwdGlvbihDbWRMaW5lQWN0aW9uIGFjdGlvbiwgQ21kTGluZU9wdGlvbiBvcHRpb24pIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jb21wYXJhdG9yL0ZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tDb21wYXJhdG9yLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NvbXBhcmF0b3IvRmlsZW1nclVuaXF1ZW5lc3NDaGVja0NvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTcyMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jb21wYXJhdG9yL0ZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNvbXBhcmF0b3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLlByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLlByZUNvbmRpdGlvbkNvbXBhcmF0b3I7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgcHJlLWluZ2VzdCwgTWV0YWRhdGEgZXh0cmFjdG9yIGxldmVsIGNvbXBhcmF0b3IgdGhhdCBjaGVja3Mgd2hldGhlciBhCisgKiBwcm9kdWN0IGV4aXN0cyBiZWZvcmUgZ2VuZXJhdGluZyBtZXRhZGF0YSBmb3IgaXQuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRmlsZW1nclVuaXF1ZW5lc3NDaGVja0NvbXBhcmF0b3IgZXh0ZW5kcworICAgICAgICBQcmVDb25kaXRpb25Db21wYXJhdG9yPEJvb2xlYW4+IHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVtZ3JVcmw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IHBlcmZvcm1DaGVjayhGaWxlIHByb2R1Y3QsIEJvb2xlYW4gY29tcGFyZUl0ZW0pCisgICAgICAgICAgICB0aHJvd3MgUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib29sZWFuIHJldHVyblZhbCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKAorICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVtZ3JVcmwpKS5oYXNQcm9kdWN0KHByb2R1Y3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihyZXR1cm5WYWwpLmNvbXBhcmVUbyhjb21wYXJlSXRlbSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjaGVjayBmb3IgcHJvZHVjdCAiICsgcHJvZHVjdCArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUmVxdWlyZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbWdyVXJsKFN0cmluZyBmaWxlbWdyVXJsKSB7CisgICAgICAgIHRoaXMuZmlsZW1nclVybCA9IGZpbGVtZ3JVcmw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NvbmZpZy9Qcm9kdWN0Q3Jhd2xlckJlYW4uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY29uZmlnL1Byb2R1Y3RDcmF3bGVyQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjU2YzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NvbmZpZy9Qcm9kdWN0Q3Jhd2xlckJlYW4uamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY29uZmlnOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnNwcmluZy5TcHJpbmdTZXRJZEluamVjdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OworCisvKiogCisgKiBUdXJucyBhIHtAbGluayBQcm9kdWN0Q3Jhd2xlcn0gaW50byBhIFNwcmluZy1jb25maWd1cmFibGUgZW50aXR5LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvZHVjdENyYXdsZXJCZWFuIGltcGxlbWVudHMKKyAgICAgIFNwcmluZ1NldElkSW5qZWN0aW9uVHlwZSwgQ29yZU1ldEtleXMgeworCisgICAgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gcmVxdWlyZWRNZXRhZGF0YTsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGFjdGlvbklkczsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVtZ3JVcmw7CisKKyAgICBwcml2YXRlIFN0cmluZyBjbGllbnRUcmFuc2ZlcmVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIG5vUmVjdXIsIGNyYXdsRm9yRGlycywgc2tpcEluZ2VzdDsKKworICAgIHByaXZhdGUgaW50IGRhZW1vbldhaXQsIGRhZW1vblBvcnQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0UGF0aDsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dDsKKworICAgIHByaXZhdGUgU3RyaW5nIGlkOworCisgICAgcHJpdmF0ZSBNZXRhZGF0YSBnbG9iYWxNZXRhZGF0YTsKKyAgICAKKyAgICBwdWJsaWMgUHJvZHVjdENyYXdsZXJCZWFuKCkgeworICAgICAgICB0aGlzLmFjdGlvbklkcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdGhpcy5yZXF1aXJlZE1ldGFkYXRhID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB0aGlzLnJlcXVpcmVkTWV0YWRhdGEuYWRkKFBST0RVQ1RfVFlQRSk7CisgICAgICAgIHRoaXMucmVxdWlyZWRNZXRhZGF0YS5hZGQoRklMRU5BTUUpOworICAgICAgICB0aGlzLnJlcXVpcmVkTWV0YWRhdGEuYWRkKEZJTEVfTE9DQVRJT04pOworICAgICAgICB0aGlzLm5vUmVjdXIgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5jcmF3bEZvckRpcnMgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5za2lwSW5nZXN0ID0gZmFsc2U7CisgICAgICAgIHRoaXMuZGFlbW9uUG9ydCA9IC0xOworICAgICAgICB0aGlzLmRhZW1vbldhaXQgPSAtMTsKKyAgICAgICAgdGhpcy5nbG9iYWxNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uQ29udGV4dChBcHBsaWNhdGlvbkNvbnRleHQgYXBwbGljYXRpb25Db250ZXh0KSB7CisgICAgICAgIHRoaXMuYXBwbGljYXRpb25Db250ZXh0ID0gYXBwbGljYXRpb25Db250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkNvbnRleHQgZ2V0QXBwbGljYXRpb25Db250ZXh0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvbkNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uSWRzKExpc3Q8U3RyaW5nPiBhY3Rpb25JZHMpIHsKKyAgICAgICAgdGhpcy5hY3Rpb25JZHMgPSBhY3Rpb25JZHM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBY3Rpb25JZHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbklkczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZE1ldGFkYXRhKExpc3Q8U3RyaW5nPiByZXF1aXJlZE1ldGFkYXRhKSB7CisgICAgCXRoaXMucmVxdWlyZWRNZXRhZGF0YS5hZGRBbGwocmVxdWlyZWRNZXRhZGF0YSk7CisgICAgfQorCisgICAgQFJlcXVpcmVkCisgICAgcHVibGljIHZvaWQgc2V0RmlsZW1nclVybChTdHJpbmcgZmlsZW1nclVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZmlsZW1nclVybCA9IGZpbGVtZ3JVcmw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbWdyVXJsKCkgeworICAgICAgICByZXR1cm4gdGhpcy5maWxlbWdyVXJsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVxdWlyZWRNZXRhZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRMaXN0PFN0cmluZz4odGhpcy5yZXF1aXJlZE1ldGFkYXRhKTsKKyAgICB9CisKKyAgICBAUmVxdWlyZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUcmFuc2ZlcmVyKFN0cmluZyBjbGllbnRUcmFuc2ZlcmVyKSB7CisgICAgICAgIHRoaXMuY2xpZW50VHJhbnNmZXJlciA9IGNsaWVudFRyYW5zZmVyZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRUcmFuc2ZlcmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRUcmFuc2ZlcmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vUmVjdXIoYm9vbGVhbiBub1JlY3VyKSB7CisgICAgICAgIHRoaXMubm9SZWN1ciA9IG5vUmVjdXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOb1JlY3VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ub1JlY3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENyYXdsRm9yRGlycyhib29sZWFuIGNyYXdsRm9yRGlycykgeworICAgICAgICB0aGlzLmNyYXdsRm9yRGlycyA9IGNyYXdsRm9yRGlyczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NyYXdsRm9yRGlycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY3Jhd2xGb3JEaXJzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTa2lwSW5nZXN0KGJvb2xlYW4gc2tpcEluZ2VzdCkgeworICAgICAgICB0aGlzLnNraXBJbmdlc3QgPSBza2lwSW5nZXN0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBJbmdlc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNraXBJbmdlc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGFlbW9uV2FpdChpbnQgZGFlbW9uV2FpdCkgeworICAgICAgICB0aGlzLmRhZW1vbldhaXQgPSBkYWVtb25XYWl0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGFlbW9uV2FpdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uV2FpdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYWVtb25Qb3J0KGludCBkYWVtb25Qb3J0KSB7CisgICAgICAgIHRoaXMuZGFlbW9uUG9ydCA9IGRhZW1vblBvcnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYWVtb25Qb3J0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25Qb3J0OworICAgIH0KKworICAgIEBSZXF1aXJlZAorICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RQYXRoKFN0cmluZyBwcm9kdWN0UGF0aCkgeworICAgICAgICB0aGlzLnByb2R1Y3RQYXRoID0gcHJvZHVjdFBhdGg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdFBhdGg7CisgICAgfQorCisJcHVibGljIE1ldGFkYXRhIGdldEdsb2JhbE1ldGFkYXRhKCkgeworCQlyZXR1cm4gZ2xvYmFsTWV0YWRhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0R2xvYmFsTWV0YWRhdGEoTWV0YWRhdGEgZ2xvYmFsTWV0YWRhdGEpIHsKKwkJdGhpcy5nbG9iYWxNZXRhZGF0YS5hZGRNZXRhZGF0YShnbG9iYWxNZXRhZGF0YS5nZXRIYXNodGFibGUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2RhZW1vbi9DcmF3bERhZW1vbi5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9kYWVtb24vQ3Jhd2xEYWVtb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNmZjRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9kYWVtb24vQ3Jhd2xEYWVtb24uamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmRhZW1vbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLlByb2R1Y3RDcmF3bGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuV2ViU2VydmVyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGRhZW1vbiB1dGlsaXR5IGNsYXNzIGZvciB7QGxpbmsgUHJvZHVjdENyYXdsZXJ9cyB0aGF0IGFsbG93cyBhIHJlZ3VsYXIKKyAqIFByb2R1Y3RDcmF3bGVyIHRvIGJlIHJ1biBhcyBhIGRhZW1vbiwgYW5kIHN0YXRpc3RpY3MgYWJvdXQgY3Jhd2xpbmcgdG8gYmUKKyAqIGtlcHQuIFRoZSBkYWVtb24gaXMgYW4gWE1MLVJQQyBhY2Nlc3NpYmxlIHdlYiBzZXJ2aWNlLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENyYXdsRGFlbW9uIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ3Jhd2xEYWVtb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qIGFyZSB3ZSBydW5uaW5nIG9yIG5vdD8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcnVubmluZyA9IHRydWU7CisKKyAgICAvKiB3YWl0IGludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiBjcmF3bHMgKi8KKyAgICBwcml2YXRlIGxvbmcgd2FpdEludGVydmFsID0gLTE7CisKKyAgICAvKiBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgY3Jhd2xlciBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgICBwcml2YXRlIGludCBudW1DcmF3bHMgPSAwOworCisgICAgLyogdGhlIGFtb3VudCBvZiBtaWxpc2Vjb25kcyBzcGVudCBjcmF3bGluZyAqLworICAgIHByaXZhdGUgbG9uZyBtaWxpc0NyYXdsaW5nID0gMEw7CisKKyAgICAvKiB0aGUgcHJvZHVjdCBjcmF3bGVyIHRoYXQgdGhpcyBkYWVtb24gc2hvdWxkIHVzZSAqLworICAgIHByaXZhdGUgUHJvZHVjdENyYXdsZXIgY3Jhd2xlciA9IG51bGw7CisKKyAgICAvKiB0aGUgcG9ydCB0aGF0IHRoaXMgY3Jhd2wgZGFlbW9uIHNob3VsZCBydW4gb24gKi8KKyAgICBwcml2YXRlIGludCBkYWVtb25Qb3J0ID0gOTk5OTsKKworICAgIHB1YmxpYyBDcmF3bERhZW1vbihpbnQgd2FpdCwgUHJvZHVjdENyYXdsZXIgY3Jhd2xlciwgaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy53YWl0SW50ZXJ2YWwgPSB3YWl0OworICAgICAgICB0aGlzLmNyYXdsZXIgPSBjcmF3bGVyOworICAgICAgICB0aGlzLmRhZW1vblBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q3Jhd2xpbmcoKSB7CisgICAgICAgIC8vIHN0YXJ0IHVwIHRoZSB3ZWIgc2VydmVyCisgICAgICAgIFdlYlNlcnZlciBzZXJ2ZXIgPSBuZXcgV2ViU2VydmVyKHRoaXMuZGFlbW9uUG9ydCk7CisgICAgICAgIHNlcnZlci5hZGRIYW5kbGVyKCJjcmF3bGRhZW1vbiIsIHRoaXMpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDcmF3bCBEYWVtb24gc3RhcnRlZCBieSAiCisgICAgICAgICAgICAgICAgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIsICJ1bmtub3duIikpOworCisgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICAvLyBva2F5LCB0aW1lIHRvIGNyYXdsCisgICAgICAgICAgICBsb25nIHRpbWVCZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGNyYXdsZXIuY3Jhd2woKTsKKyAgICAgICAgICAgIGxvbmcgdGltZUFmdGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtaWxpc0NyYXdsaW5nICs9ICh0aW1lQWZ0ZXIgLSB0aW1lQmVmb3JlKTsKKyAgICAgICAgICAgIG51bUNyYXdscysrOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJTbGVlcGluZyBmb3I6IFsiICsgd2FpdEludGVydmFsICsgIl0gc2Vjb25kcyIpOworICAgICAgICAgICAgLy8gdGFrZSBhIG5hcAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKHdhaXRJbnRlcnZhbCAqIDEwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDcmF3bCBEYWVtb246IFNodXR0aW5nIGRvd24gZ3JhY2VmdWxseSIpOworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJOdW0gQ3Jhd2xzOiBbIiArIHRoaXMubnVtQ3Jhd2xzICsgIl0iKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiVG90YWwgdGltZSBzcGVudCBjcmF3bGluZzogWyIKKyAgICAgICAgICAgICAgICArICh0aGlzLm1pbGlzQ3Jhd2xpbmcgLyAxMDAwLjApICsgIl0gc2Vjb25kcyIpOworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJBdmVyYWdlIENyYXdsIFRpbWU6IFsiCisgICAgICAgICAgICAgICAgKyAodGhpcy5nZXRBdmVyYWdlQ3Jhd2xUaW1lKCkgLyAxMDAwLjApICsgIl0gc2Vjb25kcyIpOworICAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEF2ZXJhZ2VDcmF3bFRpbWUoKSB7CisgICAgICAgIHJldHVybiAoMS4wICogbWlsaXNDcmF3bGluZykgLyAoMS4wICogbnVtQ3Jhd2xzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmF3bGVyCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RDcmF3bGVyIGdldENyYXdsZXIoKSB7CisgICAgICAgIHJldHVybiBjcmF3bGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjcmF3bGVyCisgICAgICogICAgICAgICAgICB0aGUgY3Jhd2xlciB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmF3bGVyKFByb2R1Y3RDcmF3bGVyIGNyYXdsZXIpIHsKKyAgICAgICAgdGhpcy5jcmF3bGVyID0gY3Jhd2xlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtaWxpc0NyYXdsaW5nCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaWxpc0NyYXdsaW5nKCkgeworICAgICAgICByZXR1cm4gKGludCkgbWlsaXNDcmF3bGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWlsaXNDcmF3bGluZworICAgICAqICAgICAgICAgICAgdGhlIG1pbGlzQ3Jhd2xpbmcgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWlsaXNDcmF3bGluZyhsb25nIG1pbGlzQ3Jhd2xpbmcpIHsKKyAgICAgICAgdGhpcy5taWxpc0NyYXdsaW5nID0gbWlsaXNDcmF3bGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1DcmF3bHMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUNyYXdscygpIHsKKyAgICAgICAgcmV0dXJuIG51bUNyYXdsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbnVtQ3Jhd2xzCisgICAgICogICAgICAgICAgICB0aGUgbnVtQ3Jhd2xzIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUNyYXdscyhpbnQgbnVtQ3Jhd2xzKSB7CisgICAgICAgIHRoaXMubnVtQ3Jhd2xzID0gbnVtQ3Jhd2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgIHJldHVybiBydW5uaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBydW5uaW5nCisgICAgICogICAgICAgICAgICB0aGUgcnVubmluZyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wKCkgeworICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRoaXMucnVubmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB3YWl0SW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdhaXRJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIHdhaXRJbnRlcnZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd2FpdEludGVydmFsCisgICAgICogICAgICAgICAgICB0aGUgd2FpdEludGVydmFsIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdhaXRJbnRlcnZhbChsb25nIHdhaXRJbnRlcnZhbCkgeworICAgICAgICB0aGlzLndhaXRJbnRlcnZhbCA9IHdhaXRJbnRlcnZhbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9uJ3QgY2FsbCBhIGNyYXdsIGRhZW1vbiBieSBpdHMgbWFpbiBmdW5jdGlvbiEiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvZGFlbW9uL0NyYXdsRGFlbW9uQ29udHJvbGxlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9kYWVtb24vQ3Jhd2xEYWVtb25Db250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyOGZhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvZGFlbW9uL0NyYXdsRGFlbW9uQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuZGFlbW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsRXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuWG1sUnBjRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIENvbnRyb2xsZXIgY2xhc3MgZm9yIHRoZSBDcmF3bCBEYWVtb25zCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ3Jhd2xEYWVtb25Db250cm9sbGVyIHsKKworICAgIC8qIG91ciB4bWwgcnBjIGNsaWVudCAqLworICAgIHByaXZhdGUgWG1sUnBjQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICBwdWJsaWMgQ3Jhd2xEYWVtb25Db250cm9sbGVyKFN0cmluZyBjcmF3bFVybFN0cikKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBYbWxScGNDbGllbnQobmV3IFVSTChjcmF3bFVybFN0cikpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRBdmVyYWdlQ3Jhd2xUaW1lKCkgdGhyb3dzIENyYXdsRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgZG91YmxlIGF2Z0NyYXdsVGltZSA9IC0xLjBkOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhdmdDcmF3bFRpbWUgPSAoKERvdWJsZSkgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJjcmF3bGRhZW1vbi5nZXRBdmVyYWdlQ3Jhd2xUaW1lIiwgYXJnTGlzdCkpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGF2Z0NyYXdsVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pbGlzQ3Jhd2xpbmcoKSB0aHJvd3MgQ3Jhd2xFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBpbnQgbWlsaXNDcmF3bGluZyA9IC0xOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtaWxpc0NyYXdsaW5nID0gKChJbnRlZ2VyKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImNyYXdsZGFlbW9uLmdldE1pbGlzQ3Jhd2xpbmciLCBhcmdMaXN0KSkuaW50VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDcmF3bEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDcmF3bEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWlsaXNDcmF3bGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdhaXRJbnRlcnZhbCgpIHRocm93cyBDcmF3bEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGludCB3YWl0SW50ZXJ2YWwgPSAtMTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FpdEludGVydmFsID0gKChJbnRlZ2VyKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImNyYXdsZGFlbW9uLmdldFdhaXRJbnRlcnZhbCIsIGFyZ0xpc3QpKS5pbnRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENyYXdsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENyYXdsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3YWl0SW50ZXJ2YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1DcmF3bHMoKSB0aHJvd3MgQ3Jhd2xFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW50IG51bUNyYXdscyA9IC0xOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBudW1DcmF3bHMgPSAoKEludGVnZXIpIGNsaWVudC5leGVjdXRlKCJjcmF3bGRhZW1vbi5nZXROdW1DcmF3bHMiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KSkuaW50VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDcmF3bEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDcmF3bEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVtQ3Jhd2xzOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgdGhyb3dzIENyYXdsRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5uaW5nID0gKChCb29sZWFuKSBjbGllbnQuZXhlY3V0ZSgiY3Jhd2xkYWVtb24uaXNSdW5uaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENyYXdsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENyYXdsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBydW5uaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgQ3Jhd2xFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJ1bm5pbmcgPSAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKCJjcmF3bGRhZW1vbi5zdG9wIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDcmF3bEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDcmF3bEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocnVubmluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IENyYXdsRXhjZXB0aW9uKCJTdG9wIGF0dGVtcHQgZmFpbGVkOiBjcmF3bCBkYWVtb246IFsiCisgICAgICAgICAgICAgICAgICAgICsgdGhpcy5jbGllbnQuZ2V0VVJMKCkgKyAiXSBzdGlsbCBydW5uaW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGF2Z0NyYXdsT3BlcmF0aW9uID0gIi0tZ2V0QXZlcmFnZUNyYXdsVGltZVxuIjsKKyAgICAgICAgU3RyaW5nIGdldE1pbGlzQ3Jhd2xPcGVyYXRpb24gPSAiLS1nZXRNaWxpc0NyYXdsaW5nXG4iOworICAgICAgICBTdHJpbmcgZ2V0TnVtQ3Jhd2xzT3BlcmF0aW9uID0gIi0tZ2V0TnVtQ3Jhd2xzXG4iOworICAgICAgICBTdHJpbmcgZ2V0V2FpdEludGVydmFsT3BlcmF0aW9uID0gIi0tZ2V0V2FpdEludGVydmFsXG4iOworICAgICAgICBTdHJpbmcgaXNSdW5uaW5nT3BlcmF0aW9uID0gIi0taXNSdW5uaW5nXG4iOworICAgICAgICBTdHJpbmcgc3RvcE9wZXJhdGlvbiA9ICItLXN0b3BcbiI7CisKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gIkNyYXdsQ29udHJvbGxlciAtLXVybCA8dXJsIHRvIHhtbCBycGMgc2VydmljZT4gLS1vcGVyYXRpb24gWzxvcGVyYXRpb24+IFtwYXJhbXNdXVxuIgorICAgICAgICAgICAgICAgICsgIm9wZXJhdGlvbnM6XG4iCisgICAgICAgICAgICAgICAgKyBhdmdDcmF3bE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICsgZ2V0TWlsaXNDcmF3bE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICsgZ2V0TnVtQ3Jhd2xzT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgKyBnZXRXYWl0SW50ZXJ2YWxPcGVyYXRpb24KKyAgICAgICAgICAgICAgICArIGlzUnVubmluZ09wZXJhdGlvbiArIHN0b3BPcGVyYXRpb247CisKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGwsIHVybCA9IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tb3BlcmF0aW9uIikpIHsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVybCIpKSB7CisgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbnRyb2xsZXIKKyAgICAgICAgQ3Jhd2xEYWVtb25Db250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ3Jhd2xEYWVtb25Db250cm9sbGVyKHVybCk7CisKKyAgICAgICAgaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi0tZ2V0QXZlcmFnZUNyYXdsVGltZSIpKSB7CisgICAgICAgICAgICBkb3VibGUgYXZnQ3Jhd2xUaW1lID0gY29udHJvbGxlci5nZXRBdmVyYWdlQ3Jhd2xUaW1lKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF2ZXJhZ2UgQ3Jhd2wgVGltZTogWyIgKyBhdmdDcmF3bFRpbWUgKyAiXSIpOworICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi0tZ2V0TWlsaXNDcmF3bGluZyIpKSB7CisgICAgICAgICAgICBpbnQgY3Jhd2xUaW1lID0gY29udHJvbGxlci5nZXRNaWxpc0NyYXdsaW5nKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIENyYXdsIFRpbWU6IFsiICsgY3Jhd2xUaW1lCisgICAgICAgICAgICAgICAgICAgICsgIl0gbWlsaXNlY29uZHMiKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uZXF1YWxzKCItLWdldE51bUNyYXdscyIpKSB7CisgICAgICAgICAgICBpbnQgbnVtQ3Jhd2xzID0gY29udHJvbGxlci5nZXROdW1DcmF3bHMoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtIENyYXdsczogWyIgKyBudW1DcmF3bHMgKyAiXSIpOworICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi0tZ2V0V2FpdEludGVydmFsIikpIHsKKyAgICAgICAgICAgIGludCB3YWl0SW50ZXJ2YWwgPSBjb250cm9sbGVyLmdldFdhaXRJbnRlcnZhbCgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXYWl0IEludGVydmFsOiBbIiArIHdhaXRJbnRlcnZhbCArICJdIik7CisgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmVxdWFscygiLS1pc1J1bm5pbmciKSkgeworICAgICAgICAgICAgYm9vbGVhbiBydW5uaW5nID0gY29udHJvbGxlci5pc1J1bm5pbmcoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihydW5uaW5nID8gIlllcyIgOiAiTm8iKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uZXF1YWxzKCItLXN0b3AiKSkgeworICAgICAgICAgICAgY29udHJvbGxlci5zdG9wKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyYXdsIERhZW1vbjogWyIgKyBjb250cm9sbGVyLmNsaWVudC5nZXRVUkwoKQorICAgICAgICAgICAgICAgICAgICArICJdOiBzaHV0ZG93biBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBPcGVyYXRpb24hIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvc3RhdHVzL0luZ2VzdFN0YXR1cy5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9zdGF0dXMvSW5nZXN0U3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2MTEwYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvc3RhdHVzL0luZ2VzdFN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RhdHVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgUHJvZHVjdCdzIEluZ2VzdCBTdGF0dXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5nZXN0U3RhdHVzIHsKKworCXB1YmxpYyBzdGF0aWMgZW51bSBSZXN1bHQgeworCQlTVUNDRVNTLCBGQUlMVVJFLCBTS0lQUEVELCBQUkVDT05EU19GQUlMRUQ7CisJfQorCQorCXB1YmxpYyBGaWxlIGdldFByb2R1Y3QoKTsKKwkKKwlwdWJsaWMgUmVzdWx0IGdldFJlc3VsdCgpOworCQorCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpOworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9zdHJ1Y3RzL2V4Y2VwdGlvbnMvQ3Jhd2xFeGNlcHRpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvc3RydWN0cy9leGNlcHRpb25zL0NyYXdsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZjljMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvc3RydWN0cy9leGNlcHRpb25zL0NyYXdsRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBnZW5lcmFsIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSBjb21wb25lbnQgaW4gdGhlIGNyYXdsaW5nIGZyYW1ld29yaworICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENyYXdsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIC8vIHNlcmlhbCB2ZXJzaW9uIFVJRAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQyNzEwNDc3NzI1NzI3MTA5NTNMOworCisgICAgLyoqCisgICAgICogCisgICAgICovCisgICAgcHVibGljIENyYXdsRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqIEBwYXJhbSBhcmcxCisgICAgICovCisgICAgcHVibGljIENyYXdsRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgeworICAgICAgICBzdXBlcihhcmcwLCBhcmcxKTsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyZzAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3Jhd2xFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKyAgICAgICAgc3VwZXIoYXJnMCk7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIENyYXdsRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvc3RydWN0cy9leGNlcHRpb25zL0NyYXdsZXJBY3Rpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvc3RydWN0cy9leGNlcHRpb25zL0NyYXdsZXJBY3Rpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYzNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9zdHJ1Y3RzL2V4Y2VwdGlvbnMvQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBBbiBFeGNlcHRpb24gdGhyb3duIGJ5IGEge0BsaW5rIENyYXdsZXJBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjE4ODY0MTcwNTQ2MTI1ODQ0TDsKKworICAgIHB1YmxpYyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgdCkgeworICAgICAgIHN1cGVyKHQpOworICAgIH0KKworICAgIHB1YmxpYyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0KSB7CisgICAgICAgc3VwZXIobXNnLCB0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3R5cGVkZXRlY3Rpb24vTWV0RXh0cmFjdG9yU3BlYy5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL01ldEV4dHJhY3RvclNwZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzgxZGZlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL01ldEV4dHJhY3RvclNwZWMuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnR5cGVkZXRlY3Rpb247CisKKy8vIE9PRFQgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBzcGVjaWZpY2F0aW9uIGZvciBpbnN0YW50aWF0aW5nIHtAbGluayBNZXRFeHRyYWN0b3J9cworICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE1ldEV4dHJhY3RvclNwZWMgeworCisgICAgcHJpdmF0ZSBNZXRFeHRyYWN0b3IgbWV0RXh0cmFjdG9yOworCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJlQ29uZENvbXBhcmF0b3JJZHM7CisKKyAgICBwcml2YXRlIFN0cmluZyBjb25maWdGaWxlOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0RXh0cmFjdG9yU3BlYygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwZWMgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUge0BsaW5rIE1ldEV4dHJhY3Rvcn0gaW1wbCBjbGFzcy4KKyAgICAgKiBAcGFyYW0gY29uZmlnRmlsZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VkIHRvIGNvbmZpZ3VyZSBUaGlzCisgICAgICogICAgICAgICAgICB7QGxpbmsgTWV0RXh0cmFjdG9yfSBkZXNjcmliZWQgYnkgdGhpcyBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0RXh0cmFjdG9yU3BlYyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgY29uZmlnRmlsZSwKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcmVDb25kQ29tcGFyYXRvcklkcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5zZXRNZXRFeHRyYWN0b3IoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIHRoaXMuc2V0RXh0cmFjdG9yQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgICAgIHRoaXMucHJlQ29uZENvbXBhcmF0b3JJZHMgPSBwcmVDb25kQ29tcGFyYXRvcklkczsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgTWV0RXh0cmFjdG9yU3BlYyBvYmplY3QgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0b3JDbGFzc05hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0RXh0cmFjdG9yIGdldE1ldEV4dHJhY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWV0RXh0cmFjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBleHRyYWN0b3JDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYWN0b3JDbGFzc05hbWUgdG8gc2V0CisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0RXh0cmFjdG9yKFN0cmluZyBleHRyYWN0b3JDbGFzc05hbWUpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLm1ldEV4dHJhY3RvciA9IChNZXRFeHRyYWN0b3IpIENsYXNzLmZvck5hbWUoZXh0cmFjdG9yQ2xhc3NOYW1lKQorICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOworICAgICAgICBpZiAodGhpcy5jb25maWdGaWxlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm1ldEV4dHJhY3Rvci5zZXRDb25maWdGaWxlKHRoaXMuY29uZmlnRmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGV4dHJhY3RvckNvbmZpZ0ZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYWN0b3JDb25maWdGaWxlIHRvIHNldAorICAgICAqIEB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhY3RvckNvbmZpZ0ZpbGUoU3RyaW5nIGV4dHJhY3RvckNvbmZpZ0ZpbGUpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29uZmlnRmlsZSA9IGV4dHJhY3RvckNvbmZpZ0ZpbGU7CisgICAgICAgIGlmICh0aGlzLmNvbmZpZ0ZpbGUgIT0gbnVsbCAmJiB0aGlzLm1ldEV4dHJhY3RvciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5tZXRFeHRyYWN0b3Iuc2V0Q29uZmlnRmlsZSh0aGlzLmNvbmZpZ0ZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gTGlzdDxQcmVjb25pZGl0aW9ucz4gc3BlY2lmaWVkIGluIHRoZSBleHRyYWN0b3IgcHJlY29uZGl0aW9ucworICAgICAqICAgICAgICAgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJlQ29uZENvbXBhcmF0b3JJZHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByZUNvbmRDb21wYXJhdG9ySWRzICE9IG51bGwgPyB0aGlzLnByZUNvbmRDb21wYXJhdG9ySWRzCisgICAgICAgICAgICAgICAgOiBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByZWNvbmRpdGlvbnNGaWxlCisgICAgICogICAgICAgICAgICBUaGUgZXh0cmFjdG9yIHByZWNvbmRpdGlvbnMgZmlsZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlQ29uZGl0aW9uQ29tcGFyYXRvcklkcyhMaXN0PFN0cmluZz4gcHJlQ29uZENvbXBhcmF0b3JJZHMpIHsKKyAgICAgICAgdGhpcy5wcmVDb25kQ29tcGFyYXRvcklkcyA9IHByZUNvbmRDb21wYXJhdG9ySWRzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL01pbWVFeHRyYWN0b3JDb25maWdNZXRLZXlzLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3R5cGVkZXRlY3Rpb24vTWltZUV4dHJhY3RvckNvbmZpZ01ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYThjYTRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL01pbWVFeHRyYWN0b3JDb25maWdNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnR5cGVkZXRlY3Rpb247CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogWE1MIENvbmZpZyBmaWxlIE1ldCBLZXlzIGZvciB0aGUge0BsaW5rIE1pbWVFeHRyYWN0b3JDb25maWd9CisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1pbWVFeHRyYWN0b3JDb25maWdNZXRLZXlzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BR0lDX0FUVFIgPSAibWFnaWMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9SRVBPX0FUVFIgPSAibWltZVJlcG8iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRSQUNUT1JfVEFHID0gImRlZmF1bHQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFDVE9SX1RBRyA9ICJleHRyYWN0b3IiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNSU5HX0NPTlZFTlRJT05fVEFHID0gIm5hbWluZ0NvbnZlbnRpb24iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFDVE9SX0NMQVNTX1RBRyA9ICJleHRyYWN0b3JDbGFzcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQUNUT1JfQ09ORklHX1RBRyA9ICJjb25maWciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFDVE9SX1BSRUNPTkRJVElPTlNfVEFHID0gInByZWNvbmRpdGlvbnMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UQUcgPSAibWltZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEVfQVRUUiA9ICJ0eXBlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFIgPSAiY2xhc3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9BVFRSID0gImZpbGUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX1JFUExBQ0VfQVRUUiA9ICJlbnZSZXBsYWNlIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fQ09NUEFSQVRPUlNfVEFHID0gInByZUNvbmRDb21wYXJhdG9ycyI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0NPTVBBUkFUT1JfVEFHID0gInByZUNvbmRDb21wYXJhdG9yIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSID0gImlkIjsKKyAgICAJCit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3R5cGVkZXRlY3Rpb24vTWltZUV4dHJhY3RvckNvbmZpZ1JlYWRlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL01pbWVFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM5YjM5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL01pbWVFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudHlwZWRldGVjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmZpbGVuYW1pbmcuTmFtaW5nQ29udmVudGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLy9XM0MgaW1wb3J0cworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKKy8qKgorICogU3RhdGljIHJlYWRlciBjbGFzcyBmb3Ige0BsaW5rIE1pbWVFeHRyYWN0b3J9cy4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWltZUV4dHJhY3RvckNvbmZpZ1JlYWRlciBpbXBsZW1lbnRzCisgICAgICAgIE1pbWVFeHRyYWN0b3JDb25maWdNZXRLZXlzIHsKKworICAgIHByaXZhdGUgTWltZUV4dHJhY3RvckNvbmZpZ1JlYWRlcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCByZWFkZXIgY2xhc3NlcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1pbWVFeHRyYWN0b3JSZXBvIHJlYWQoU3RyaW5nIG1hcEZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBtYXBGaWxlUGF0aCkpOworICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCisgICAgICAgICAgICBNaW1lRXh0cmFjdG9yUmVwbyBleHRyYWN0b3JSZXBvID0gbmV3IE1pbWVFeHRyYWN0b3JSZXBvKCk7CisgICAgICAgICAgICBleHRyYWN0b3JSZXBvLnNldE1hZ2ljKEJvb2xlYW4udmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgcm9vdC5nZXRBdHRyaWJ1dGUoTUFHSUNfQVRUUikpLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZUZpbGUgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhyb290CisgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKE1JTUVfUkVQT19BVFRSKSk7CisgICAgICAgICAgICBpZiAoIW1pbWVUeXBlRmlsZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgIG1pbWVUeXBlRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKG1hcEZpbGVQYXRoKS5nZXRQYXJlbnRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZUZpbGUpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXh0cmFjdG9yUmVwby5zZXRNaW1lUmVwb0ZpbGUobWltZVR5cGVGaWxlKTsKKworICAgICAgICAgICAgRWxlbWVudCBkZWZhdWx0RXh0cmFjdG9yRWxlbSA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9FWFRSQUNUT1JfVEFHLCByb290KTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0RXh0cmFjdG9yRWxlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTm9kZUxpc3QgZGVmYXVsdEV4dHJhY3RvckVsZW1zID0gZGVmYXVsdEV4dHJhY3RvckVsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShFWFRSQUNUT1JfVEFHKTsKKyAgICAgICAgICAgICAgICBMaW5rZWRMaXN0PE1ldEV4dHJhY3RvclNwZWM+IGRlZmF1bHRFeHRyYWN0b3JTcGVjcyA9IG5ldyBMaW5rZWRMaXN0PE1ldEV4dHJhY3RvclNwZWM+KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0RXh0cmFjdG9yRWxlbXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGV4dHJhY3RvckVsZW0gPSAoRWxlbWVudCkgZGVmYXVsdEV4dHJhY3RvckVsZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJlQ29uZHNFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVDT05ESVRJT05fQ09NUEFSQVRPUlNfVEFHLCBleHRyYWN0b3JFbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IHByZUNvbmRDb21wYXJhdG9ySWRzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJlQ29uZHNFbGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgcHJlQ29uZENvbXBhcmF0b3JzID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUNvbmRzRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShQUkVDT05ESVRJT05fQ09NUEFSQVRPUl9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHByZUNvbmRDb21wYXJhdG9ycy5nZXRMZW5ndGgoKTsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlQ29uZENvbXBhcmF0b3JJZHMuYWRkKCgoRWxlbWVudCkgcHJlQ29uZENvbXBhcmF0b3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtKGspKS5nZXRBdHRyaWJ1dGUoSURfQVRUUikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2VlbXMgd3JvbmcsIHNvIGFkZGVkIHN1cHBvcnQgZm9yIENMQVNTX0FUVFIgd2hpbGUgc3RpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gIHN1cHBvcnRpbmcgRVhUUkFDVE9SX0NMQVNTX1RBRyBhcyBhbiBhdHRyaWJ1dGUgZm9yIHNwZWNpZnlpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gIGV4dHJhY3RvciBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4dHJhY3RvckNsYXNzID0gZXh0cmFjdG9yRWxlbS5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUik7CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZXh0cmFjdG9yQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvckNsYXNzID0gZXh0cmFjdG9yRWxlbS5nZXRBdHRyaWJ1dGUoRVhUUkFDVE9SX0NMQVNTX1RBRyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4dHJhY3RvckNvbmZpZ0ZpbGUgPSBnZXRGaWxlUGF0aEZyb21FbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3JFbGVtLCBFWFRSQUNUT1JfQ09ORklHX1RBRyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYWN0b3JDb25maWdGaWxlICE9IG51bGwgJiYgIWV4dHJhY3RvckNvbmZpZ0ZpbGUuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvckNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShtYXBGaWxlUGF0aCkuZ2V0UGFyZW50RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3JDb25maWdGaWxlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RXh0cmFjdG9yU3BlY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBNZXRFeHRyYWN0b3JTcGVjKGV4dHJhY3RvckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yQ29uZmlnRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUNvbmRDb21wYXJhdG9ySWRzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4dHJhY3RvclJlcG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZWZhdWx0TWV0RXh0cmFjdG9yU3BlY3MoZGVmYXVsdEV4dHJhY3RvclNwZWNzKTsKKyAgICAgICAgICAgICAgICBleHRyYWN0b3JSZXBvLnNldERlZmF1bHROYW1pbmdDb252ZW50aW9uSWQoCisgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtaW5nQ29udmVudGlvbklkKGRlZmF1bHRFeHRyYWN0b3JFbGVtKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5vZGVMaXN0IG1pbWVFbGVtcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoTUlNRV9UQUcpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lRWxlbXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgbWltZUVsZW0gPSAoRWxlbWVudCkgbWltZUVsZW1zLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gbWltZUVsZW0uZ2V0QXR0cmlidXRlKE1JTUVfVFlQRV9BVFRSKTsKKyAgICAgICAgICAgICAgICBMaW5rZWRMaXN0PE1ldEV4dHJhY3RvclNwZWM+IHNwZWNzID0gbmV3IExpbmtlZExpc3Q8TWV0RXh0cmFjdG9yU3BlYz4oKTsKKworICAgICAgICAgICAgICAgIC8vIExvYWQgbmFtaW5nIGNvbnZlbnRpb24gY2xhc3MuCisgICAgICAgICAgICAgICAgZXh0cmFjdG9yUmVwby5zZXROYW1pbmdDb252ZW50aW9uSWQobWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtaW5nQ29udmVudGlvbklkKG1pbWVFbGVtKSk7CisKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBleHRyYWN0b3JTcGVjRWxlbXMgPSBtaW1lRWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKEVYVFJBQ1RPUl9UQUcpOworICAgICAgICAgICAgICAgIGlmIChleHRyYWN0b3JTcGVjRWxlbXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXh0cmFjdG9yU3BlY0VsZW1zLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4dHJhY3RvclNwZWNFbGVtcy5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGV4dHJhY3RvclNwZWNFbGVtID0gKEVsZW1lbnQpIGV4dHJhY3RvclNwZWNFbGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldEV4dHJhY3RvclNwZWMgc3BlYyA9IG5ldyBNZXRFeHRyYWN0b3JTcGVjKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGVjLnNldE1ldEV4dHJhY3RvcihleHRyYWN0b3JTcGVjRWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGNvbmZpZyBmaWxlIGlmIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGVQYXRoID0gZ2V0RmlsZVBhdGhGcm9tRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yU3BlY0VsZW0sIEVYVFJBQ1RPUl9DT05GSUdfVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdGaWxlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0ZpbGVQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSBuZXcgRmlsZShuZXcgRmlsZShtYXBGaWxlUGF0aCkuZ2V0UGFyZW50RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGgpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5zZXRFeHRyYWN0b3JDb25maWdGaWxlKGNvbmZpZ0ZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHByZWNvbmRpdGlvbnMgZmlsZSBpZiBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJlQ29uZHNFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFQ09ORElUSU9OX0NPTVBBUkFUT1JTX1RBRywgZXh0cmFjdG9yU3BlY0VsZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZUNvbmRzRWxlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBwcmVDb25kQ29tcGFyYXRvcnMgPSBwcmVDb25kc0VsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShQUkVDT05ESVRJT05fQ09NUEFSQVRPUl9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IHByZUNvbmRDb21wYXJhdG9ySWRzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwcmVDb25kQ29tcGFyYXRvcnMuZ2V0TGVuZ3RoKCk7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVDb25kQ29tcGFyYXRvcklkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgoKEVsZW1lbnQpIHByZUNvbmRDb21wYXJhdG9ycy5pdGVtKGspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKElEX0FUVFIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMuc2V0UHJlQ29uZGl0aW9uQ29tcGFyYXRvcklkcyhwcmVDb25kQ29tcGFyYXRvcklkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzLmFkZChzcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleHRyYWN0b3JSZXBvLmFkZE1ldEV4dHJhY3RvclNwZWNzKG1pbWVUeXBlLCBzcGVjcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yUmVwbzsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWluZ0NvbnZlbnRpb25JZChFbGVtZW50IHBhcmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgTm9kZUxpc3QgbmFtaW5nQ29udmVudGlvbnMgPSBwYXJlbnQKKyAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoTkFNSU5HX0NPTlZFTlRJT05fVEFHKTsKKyAgICAgICBpZiAobmFtaW5nQ29udmVudGlvbnMgIT0gbnVsbCAmJiBuYW1pbmdDb252ZW50aW9ucy5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBpZiAobmFtaW5nQ29udmVudGlvbnMuZ2V0TGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuIG9ubHkgaGF2ZSAxICciCisgICAgICAgICAgICAgICAgICAgKyBOQU1JTkdfQ09OVkVOVElPTl9UQUcgKyAiJyB0YWcgcGVyIG1pbWV0eXBlIik7CisgICAgICAgICAgfQorICAgICAgICAgIEVsZW1lbnQgbmFtaW5nQ29udmVudGlvbiA9IChFbGVtZW50KSBuYW1pbmdDb252ZW50aW9ucy5pdGVtKDApOworICAgICAgICAgIHJldHVybiBuYW1pbmdDb252ZW50aW9uLmdldEF0dHJpYnV0ZShJRF9BVFRSKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpbGVQYXRoRnJvbUVsZW1lbnQoRWxlbWVudCByb290LCBTdHJpbmcgZWxlbU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKKyAgICAgICAgRWxlbWVudCBlbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KGVsZW1OYW1lLCByb290KTsKKyAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZVBhdGggPSBlbGVtLmdldEF0dHJpYnV0ZShGSUxFX0FUVFIpOworICAgICAgICAgICAgaWYgKEJvb2xlYW4udmFsdWVPZihlbGVtLmdldEF0dHJpYnV0ZShFTlZfUkVQTEFDRV9BVFRSKSkKKyAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpKQorICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoZmlsZVBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlUGF0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3R5cGVkZXRlY3Rpb24vTWltZUV4dHJhY3RvclJlcG8uamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvdHlwZWRldGVjdGlvbi9NaW1lRXh0cmFjdG9yUmVwby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTViZWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3R5cGVkZXRlY3Rpb24vTWltZUV4dHJhY3RvclJlcG8uamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudHlwZWRldGVjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuTWltZVR5cGVVdGlsczsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworLyoqCisgKiBSZXBvIG9mIGV4dHJhY3RvciBzcGVjIGFuZCBuYW1pbmcgY29udmVudGlvbnMgbWFwcGVkIGJ5IG1pbWUtdHlwZS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgTWltZUV4dHJhY3RvclJlcG8geworCisJcHJpdmF0ZSBMaXN0PE1ldEV4dHJhY3RvclNwZWM+IGRlZmF1bHRFeHRyYWN0b3JTcGVjczsKKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0TmFtaW5nQ29udmVudGlvbklkOworCXByaXZhdGUgTWltZVR5cGVVdGlscyBtaW1lUmVwbzsKKwlwcml2YXRlIGJvb2xlYW4gbWFnaWM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PE1ldEV4dHJhY3RvclNwZWM+PiBtaW1lVHlwZVRvTWV0RXh0cmFjdG9yU3BlY3NNYXA7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1pbWVUeXBlVG9OYW1pbmdDb252ZW50aW9uSWRNYXA7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICogCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkgKiAKKwkgKi8KKwlwdWJsaWMgTWltZUV4dHJhY3RvclJlcG8oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJdGhpcyhuZXcgTGlua2VkTGlzdDxNZXRFeHRyYWN0b3JTcGVjPigpLCBudWxsLCBudWxsLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBNaW1lRXh0cmFjdG9yTWFwcGluZ0ZpbGUgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKwkgKiAKKwkgKiBAcGFyYW0gZGVmYXVsdEV4dHJhY3RvckNsYXNzTmFtZQorCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgZXh0cmFjdG9yIHRvIGNhbGwgaWYgdGhlIG1pbWUgdHlwZQorCSAqICAgICAgICAgICAgY2FuJ3QgYmUgZGV0ZXJtaW5lZC4KKwkgKiBAcGFyYW0gcmVwbworCSAqICAgICAgICAgICAgVGhlIE1pbWUgUmVwb3NpdG9yeSB0byB1c2UgZm9yIG1pbWUgcmVzb2x1dGlvbi4KKwkgKiBAcGFyYW0gbWFnaWMKKwkgKiAgICAgICAgICAgIFdoZXRoZXIgb3Igbm90IG1pbWUgbWFnaWMgc2hvdWxkIGJlIHVzZWQgb3Igbm90IGluIHJlc29sdXRpb24uCisJICogCisJICogQHBhcmFtIG1hcHBpbmdzCisJICogICAgICAgICAgICB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIE1pbWVFeHRyYWN0b3JNYXBwaW5nfXMuCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTWltZUV4dHJhY3RvclJlcG8oTGlzdDxNZXRFeHRyYWN0b3JTcGVjPiBkZWZhdWx0RXh0cmFjdG9yU3BlY3MsCisJICAgICAgU3RyaW5nIGRlZmF1bHROYW1pbmdDb252ZW50aW9uSWQsIFN0cmluZyBtaW1lUmVwb0ZpbGUsCisJICAgICAgYm9vbGVhbiBtYWdpYykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXNldERlZmF1bHRNZXRFeHRyYWN0b3JTcGVjcyhkZWZhdWx0RXh0cmFjdG9yU3BlY3MpOworCQlzZXREZWZhdWx0TmFtaW5nQ29udmVudGlvbklkKGRlZmF1bHROYW1pbmdDb252ZW50aW9uSWQpOworCQlzZXRNaW1lUmVwb0ZpbGUobWltZVJlcG9GaWxlKTsKKwkJc2V0TWFnaWMobWFnaWMpOworCQltaW1lVHlwZVRvTWV0RXh0cmFjdG9yU3BlY3NNYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKwkJbWltZVR5cGVUb05hbWluZ0NvbnZlbnRpb25JZE1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXROYW1pbmdDb252ZW50aW9uSWQoU3RyaW5nIG1pbWVUeXBlLAorCSAgICAgIFN0cmluZyBuYW1pbmdDb252ZW50aW9uSWQpIHsKKwkgICBtaW1lVHlwZVRvTmFtaW5nQ29udmVudGlvbklkTWFwLnB1dChtaW1lVHlwZSwgbmFtaW5nQ29udmVudGlvbklkKTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1pbmdDb252ZW50aW9uSWQoU3RyaW5nIG1pbWVUeXBlKSB7CisJICAgU3RyaW5nIG5hbWluZ0NvbnZlbnRpb25JZCA9ICBtaW1lVHlwZVRvTmFtaW5nQ29udmVudGlvbklkTWFwLmdldCgKKwkgICAgICAgICBtaW1lVHlwZSk7CisJICAgaWYgKG5hbWluZ0NvbnZlbnRpb25JZCA9PSBudWxsKSB7CisJICAgICAgcmV0dXJuIGdldERlZmF1bHROYW1pbmdDb252ZW50aW9uSWQoKTsKKwkgICB9CisJICAgcmV0dXJuIG5hbWluZ0NvbnZlbnRpb25JZDsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTWV0RXh0cmFjdG9yU3BlYyhTdHJpbmcgbWltZVR5cGUsCisJCQlNZXRFeHRyYWN0b3JTcGVjIHNwZWMpIHsKKwkJTGlzdDxNZXRFeHRyYWN0b3JTcGVjPiBzcGVjcyA9IHRoaXMubWltZVR5cGVUb01ldEV4dHJhY3RvclNwZWNzTWFwCisJCQkJLnJlbW92ZShtaW1lVHlwZSk7CisJCWlmIChzcGVjcyA9PSBudWxsKQorCQkJc3BlY3MgPSBuZXcgTGlua2VkTGlzdDxNZXRFeHRyYWN0b3JTcGVjPigpOworCQlzcGVjcy5hZGQoc3BlYyk7CisJCXRoaXMubWltZVR5cGVUb01ldEV4dHJhY3RvclNwZWNzTWFwLnB1dChtaW1lVHlwZSwgc3BlY3MpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNZXRFeHRyYWN0b3JTcGVjcyhTdHJpbmcgbWltZVR5cGUsCisJCQlMaXN0PE1ldEV4dHJhY3RvclNwZWM+IHNwZWNzKSB7CisJCUxpc3Q8TWV0RXh0cmFjdG9yU3BlYz4gZXhpc3RpbmdTcGVjcyA9IHRoaXMubWltZVR5cGVUb01ldEV4dHJhY3RvclNwZWNzTWFwCisJCQkJLnJlbW92ZShtaW1lVHlwZSk7CisJCWlmIChleGlzdGluZ1NwZWNzID09IG51bGwpCisJCQlleGlzdGluZ1NwZWNzID0gbmV3IExpbmtlZExpc3Q8TWV0RXh0cmFjdG9yU3BlYz4oKTsKKwkJZXhpc3RpbmdTcGVjcy5hZGRBbGwoc3BlY3MpOworCQl0aGlzLm1pbWVUeXBlVG9NZXRFeHRyYWN0b3JTcGVjc01hcC5wdXQobWltZVR5cGUsIGV4aXN0aW5nU3BlY3MpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxNZXRFeHRyYWN0b3JTcGVjPiBnZXRFeHRyYWN0b3JTcGVjc0Zvck1pbWVUeXBlKAorCQkJU3RyaW5nIG1pbWVUeXBlKSB7CisJCUxpc3Q8TWV0RXh0cmFjdG9yU3BlYz4gZXh0cmFjdG9yU3BlY3MgPSBuZXcgTGlua2VkTGlzdDxNZXRFeHRyYWN0b3JTcGVjPigpOworCQl3aGlsZSAobWltZVR5cGUgIT0gbnVsbCAmJiAhbWltZVR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgeworCQkJTGlzdDxNZXRFeHRyYWN0b3JTcGVjPiBzcGVjcyA9IHRoaXMubWltZVR5cGVUb01ldEV4dHJhY3RvclNwZWNzTWFwLmdldChtaW1lVHlwZSk7CisJCQlpZiAoc3BlY3MgIT0gbnVsbCkKKwkJCQlleHRyYWN0b3JTcGVjcy5hZGRBbGwoc3BlY3MpOworCQkJbWltZVR5cGUgPSB0aGlzLm1pbWVSZXBvLmdldFN1cGVyVHlwZUZvck1pbWVUeXBlKG1pbWVUeXBlKTsKKwkJfQorCQlyZXR1cm4gIWV4dHJhY3RvclNwZWNzLmlzRW1wdHkoKSA/IGV4dHJhY3RvclNwZWNzIDogdGhpcworCQkJCS5nZXREZWZhdWx0TWV0RXh0cmFjdG9yU3BlY3MoKTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8TWV0RXh0cmFjdG9yU3BlYz4gZ2V0RXh0cmFjdG9yU3BlY3NGb3JGaWxlKAorCQkJRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBtaW1lVHlwZSA9IHRoaXMubWltZVJlcG8uZ2V0TWltZVR5cGUoZmlsZSk7CisJCWlmIChtaW1lVHlwZSA9PSBudWxsICYmIG1hZ2ljKQorCQkJbWltZVR5cGUgPSB0aGlzLm1pbWVSZXBvLmdldE1pbWVUeXBlQnlNYWdpYyhNaW1lVHlwZVV0aWxzCisJCQkJCS5yZWFkTWFnaWNIZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkpOworCQlyZXR1cm4gdGhpcy5nZXRFeHRyYWN0b3JTcGVjc0Zvck1pbWVUeXBlKG1pbWVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0RXh0cmFjdG9yQ2xhc3NOYW1lCisJICovCisJcHVibGljIExpc3Q8TWV0RXh0cmFjdG9yU3BlYz4gZ2V0RGVmYXVsdE1ldEV4dHJhY3RvclNwZWNzKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0RXh0cmFjdG9yU3BlY3MgIT0gbnVsbCA/IHRoaXMuZGVmYXVsdEV4dHJhY3RvclNwZWNzCisJCQkJOiBuZXcgTGlua2VkTGlzdDxNZXRFeHRyYWN0b3JTcGVjPigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkZWZhdWx0RXh0cmFjdG9yQ2xhc3NOYW1lCisJICogICAgICAgICAgICB0aGUgZGVmYXVsdEV4dHJhY3RvckNsYXNzTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWV0RXh0cmFjdG9yU3BlY3MoCisJCQlMaXN0PE1ldEV4dHJhY3RvclNwZWM+IGRlZmF1bHRFeHRyYWN0b3JTcGVjcykgeworCQl0aGlzLmRlZmF1bHRFeHRyYWN0b3JTcGVjcyA9IGRlZmF1bHRFeHRyYWN0b3JTcGVjczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtaW5nQ29udmVudGlvbklkKAorCSAgICAgIFN0cmluZyBkZWZhdWx0TmFtaW5nQ29udmVudGlvbklkKSB7CisJICAgdGhpcy5kZWZhdWx0TmFtaW5nQ29udmVudGlvbklkID0gZGVmYXVsdE5hbWluZ0NvbnZlbnRpb25JZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1pbmdDb252ZW50aW9uSWQoKSB7CisJICAgcmV0dXJuIGRlZmF1bHROYW1pbmdDb252ZW50aW9uSWQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbWFnaWMKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01hZ2ljKCkgeworCQlyZXR1cm4gdGhpcy5tYWdpYzsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWFnaWMKKwkgKiAgICAgICAgICAgIHRoZSBtYWdpYyB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYWdpYyhib29sZWFuIG1hZ2ljKSB7CisJCXRoaXMubWFnaWMgPSBtYWdpYzsKKwkJaWYgKHRoaXMubWltZVJlcG8gIT0gbnVsbCkKKwkJCXRoaXMubWltZVJlcG8uc2V0TWltZU1hZ2ljKG1hZ2ljKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWltZVJlcG8KKwkgKiAgICAgICAgICAgIHRoZSBtaW1lUmVwbyB0byBzZXQKKwkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pbWVSZXBvRmlsZShTdHJpbmcgbWltZVJlcG9GaWxlKQorCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCWlmIChtaW1lUmVwb0ZpbGUgIT0gbnVsbCkKKwkJCXRoaXMubWltZVJlcG8gPSBuZXcgTWltZVR5cGVVdGlscyhtaW1lUmVwb0ZpbGUsIHRoaXMubWFnaWMpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoRmlsZSBmaWxlKSB7CisJICAgcmV0dXJuIG1pbWVSZXBvLmdldE1pbWVUeXBlKGZpbGUpOworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIG1pbWUtdHlwZSBoaWVyYXJjaHkuIEluZGV4IDAgaXMgdGhpcyBmaWxlcyBtaW1lLXR5cGUsCisJICogaW5kZXggMSBpcyBpbmRleCAwJ3MgbWltZS10eXBlJ3MgcGFyZW50IG1pbWUtdHlwZSwgYW5kIHNvIG9uLiAKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1pbWVUeXBlcyhGaWxlIGZpbGUpIHsKKwkgICAgTGlzdDxTdHJpbmc+IG1pbWVUeXBlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCSAgICBTdHJpbmcgbWltZVR5cGUgPSBnZXRNaW1lVHlwZShmaWxlKTsKKwkgICAgbWltZVR5cGVzLmFkZChtaW1lVHlwZSk7CisJICAgIHdoaWxlICgobWltZVR5cGUgPSB0aGlzLm1pbWVSZXBvLmdldFN1cGVyVHlwZUZvck1pbWVUeXBlKG1pbWVUeXBlKSkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICFtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKQorCSAgICAgICAgbWltZVR5cGVzLmFkZChtaW1lVHlwZSk7CisJICAgIHJldHVybiBtaW1lVHlwZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0FjdGlvbkJlYW5Qcm9wZXJ0aWVzLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3V0aWwvQWN0aW9uQmVhblByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTAwNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0FjdGlvbkJlYW5Qcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBiZWFuIHByb3BlcnRpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAqIHtAbGluayBDYXNQcm9wZXJ0eU92ZXJyaWRlQ29uZmlndXJlcn0gdG8gc2V0IHByb3BlcnRpZXMgb24KKyAqIHtAbGluayBQcm9kdWN0Q3Jhd2xlcn1zIGFuZCB7QGxpbmsgQ3Jhd2xlckFjdGlvbn1zLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmVhblByb3BlcnRpZXMgeworCisgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCisgICBwcml2YXRlIEFjdGlvbkJlYW5Qcm9wZXJ0aWVzKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvIG5vdCBpbnN0YW50aWF0ZSBBY3Rpb25CZWFuUHJvcGVydGllcyIpOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgcHJvcGVydHkgJyIgKyBrZXkgKyAiJyIpOworICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvdXRpbC9DYXNQcm9wZXJ0eUxpc3QuamF2YSBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvdXRpbC9DYXNQcm9wZXJ0eUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU1ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0Nhc1Byb3BlcnR5TGlzdC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENhc1Byb3BlcnR5TGlzdCBleHRlbmRzIExpbmtlZExpc3Q8U3RyaW5nPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTk1NjUwMDM5Nzk2NzU5MDcyNEw7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoU3RyaW5nIHZhbHVlcykgeworICAgICAgICB0aGlzLmFkZEFsbCh0aGlzLmdldEFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRBc0xpc3QoU3RyaW5nIHZhbHVlcykgeworICAgICAgICBWZWN0b3I8U3RyaW5nPiBwcm9wTGlzdCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlcywgIiwiKTsKKyAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgcHJvcExpc3QuYWRkKHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3BMaXN0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0Nhc1Byb3BlcnR5T3ZlcnJpZGVDb25maWd1cmVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3V0aWwvQ2FzUHJvcGVydHlPdmVycmlkZUNvbmZpZ3VyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTIxZjdkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0Nhc1Byb3BlcnR5T3ZlcnJpZGVDb25maWd1cmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5T3ZlcnJpZGVDb25maWd1cmVyOworCisvKioKKyAqIEEge0BsaW5rIFByb3BlcnR5T3ZlcnJpZGVDb25maWd1cmVyfSB3aGljaCBzZXRzIHByb3BlcnRpZXMgc3RvcmVkIGluCisgKiB7QGxpbmsgQWN0aW9uQmVhblByb3BlcnRpZXN9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ2FzUHJvcGVydHlPdmVycmlkZUNvbmZpZ3VyZXIgZXh0ZW5kcyBQcm9wZXJ0eU92ZXJyaWRlQ29uZmlndXJlciB7CisKKyAgIHB1YmxpYyBDYXNQcm9wZXJ0eU92ZXJyaWRlQ29uZmlndXJlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBzdXBlcigpOworICAgICAgc2V0UHJvcGVydGllcyhBY3Rpb25CZWFuUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0Nhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3V0aWwvQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTc4ZTRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC91dGlsL0Nhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnV0aWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5EZXNjcmliZSB5b3VyIGNsYXNzIGhlcmU8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIgZXh0ZW5kcworICAgICAgICBQcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRQcm9wZXJ0eVZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFBhdGhVdGlscy5kb0R5bmFtaWNSZXBsYWNlbWVudCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyN2QxNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDE4IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK1lvdSBjYW4gcmVtb3ZlIHRoaXMgZmlsZS4gSXQgd2FzIG9ubHkgaW5jbHVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZyBkaXJlY3RvcnkgZm9yIHRoaXMKK2Rpc3RyaWJ1dGlvbiB3YXMgY3JlYXRlZCBvbiBhc3NlbWJseS4KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvYWN0aW9uLWJlYW5zLnhtbCBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvYWN0aW9uLWJlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNiMDgxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9hY3Rpb24tYmVhbnMueG1sCkBAIC0wLDAgKzEsMjIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcucG9zdHByb2Nlc3Nvci5TZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIiAvPgorCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnV0aWwuQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIiPgorCisJCTwhLS0gQWxsb3cgZm9yIHN5c3RlbS1sZXZlbCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlIGFsbCBwcm9wZXJ0aWVzIGJlbG93IC0tPgorCQk8cHJvcGVydHkgbmFtZT0ic3lzdGVtUHJvcGVydGllc01vZGUiIHZhbHVlPSIyIiAvPgorCisJCTwhLS0gRGVmYXVsdCBQcm9wZXJ0aWVzIC0tPgorCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQk8cHJvcHM+CisJCQkJPHByb3Aga2V5PSJjcmF3bGVyLmZhaWx1cmUuZGlyIj5bRkFJTFVSRV9ESVJdPC9wcm9wPgorCQkJCTxwcm9wIGtleT0iY3Jhd2xlci5iYWNrdXAuZGlyIj5bQkFDS1VQX0RJUl08L3Byb3A+CisJCQkJPHByb3Aga2V5PSJjcmF3bGVyLndvcmtmbG93bWdyLnVybCI+W1dPUktGTE9XX1VSTF08L3Byb3A+CisJCQkJPHByb3Aga2V5PSJjcmF3bGVyLmZpbGVtZ3IudXJsIj5bRklMRU1HUl9VUkxdPC9wcm9wPgorCQkJCTxwcm9wIGtleT0iY3Jhd2xlci5jbGllbnQudHJhbnNmZXJlciI+b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3Rvcnk8L3Byb3A+CisJCQkJPHByb3Aga2V5PSJjcmF3bGVyLm1ldC5maWxlLmV4dCI+bWV0PC9wcm9wPgorCQkJCTxwcm9wIGtleT0iY3Jhd2xlci5wdXNocHVsbC5tZXQuZmlsZS5leHQiPltQVVNIUFVMTF9NRVRfRklMRV9FWFRdPC9wcm9wPgorCQkJCTxwcm9wIGtleT0iY3Jhd2xlci5hbmMuZmlsZS5leHQiPmFuYzwvcHJvcD4KKwkJCQk8cHJvcCBrZXk9ImNyYXdsZXIuYW5jLmZpbGUuc3VmZml4Ij48L3Byb3A+CisJCQkJPHByb3Aga2V5PSJub3RpZmljYXRpb24ubWFpbC5ob3N0Ij48L3Byb3A+CisJCQkJPHByb3Aga2V5PSJub3RpZmljYXRpb24uc2VuZGVyIj48L3Byb3A+CisJCQkJPHByb3Aga2V5PSJub3RpZmljYXRpb24uc3VjY2Vzcy5zdWJqZWN0Ij48L3Byb3A+CisJCQkJPHByb3Aga2V5PSJub3RpZmljYXRpb24uc3VjY2Vzcy5tZXNzYWdlIj48L3Byb3A+CisJCQkJPHByb3Aga2V5PSJub3RpZmljYXRpb24uc3VjY2Vzcy5yZWNpcGllbnRzIj48L3Byb3A+CisJCQk8L3Byb3BzPgorCQk8L3Byb3BlcnR5PgorCisJCTwhLS0gRmlsZSBQcm9wZXJ0aWVzIC0gb3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydGllcyAtLT4KKwkJPCEtLSBwcm9wZXJ0eSBuYW1lPSJsb2NhdGlvbiIgdmFsdWU9Ii9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL2NyYXdsZXIucHJvcGVydGllcyIgCisJCQkvIC0tPgorCTwvYmVhbj4KKworCTwhLS0gREVMRVRFIEFjdGlvbnMgLS0+CisJPGJlYW4gaWQ9IkRlbGV0ZURhdGFGaWxlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5EZWxldGVGaWxlIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVsZXRlcyB0aGUgY3VycmVudCBkYXRhIGZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RTdWNjZXNzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iRGVsZXRlTWV0YWRhdGFGaWxlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5EZWxldGVGaWxlIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVsZXRlcyB0aGUgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7Y3Jhd2xlci5tZXQuZmlsZS5leHR9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9IkRlbGV0ZVB1c2hwdWxsTWV0RmlsZSIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRGVsZXRlRmlsZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlbGV0ZXMgdGhlIHB1c2gtcHVsbCBtZXRhZGF0YSBmaWxlIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLnB1c2hwdWxsLm1ldC5maWxlLmV4dH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RTdWNjZXNzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIE1PVkUgdG8gRkFJTFVSRV9ESVIgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0iTW92ZURhdGFGaWxlVG9GYWlsdXJlRGlyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5Nb3ZlRmlsZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1vdmVzIHRoZSBjdXJyZW50IGRhdGEgZmlsZSB0byBmYWlsdXJlIGRpcmVjdG9yeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InRvRGlyIiB2YWx1ZT0iJHtjcmF3bGVyLmZhaWx1cmUuZGlyfSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImNyZWF0ZVRvRGlyIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cG9zdEluZ2VzdEZhaWx1cmU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJNb3ZlTWV0YWRhdGFGaWxlVG9GYWlsdXJlRGlyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5Nb3ZlRmlsZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1vdmVzIHRoZSBtZXRhZGF0YSBmaWxlIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gZmFpbHVyZSBkaXJlY3RvcnkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLm1ldC5maWxlLmV4dH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0b0RpciIgdmFsdWU9IiR7Y3Jhd2xlci5mYWlsdXJlLmRpcn0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjcmVhdGVUb0RpciIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RGYWlsdXJlPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iTW92ZVB1c2hwdWxsTWV0RmlsZVRvRmFpbHVyZURpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgcHVzaC1wdWxsIG1ldGFkYXRhIGZpbGUgZm9yIHRoZSBjdXJyZW50IGRhdGEgZmlsZSB0byBmYWlsdXJlIGRpcmVjdG9yeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImNyZWF0ZVRvRGlyIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSIke2NyYXdsZXIucHVzaHB1bGwubWV0LmZpbGUuZXh0fSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InRvRGlyIiB2YWx1ZT0iJHtjcmF3bGVyLmZhaWx1cmUuZGlyfSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cG9zdEluZ2VzdEZhaWx1cmU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gTU9WRSB0byBCQUNLVVBfRElSIEFjdGlvbnMgLS0+CisJPGJlYW4gaWQ9Ik1vdmVQdXNocHVsbE1ldEZpbGVUb0JhY2t1cERpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgcHVzaC1wdWxsIG1ldGFkYXRhIGZpbGUgZm9yIHRoZSBjdXJyZW50IGRhdGEgZmlsZSB0byBzdWNjZXNzIGRpcmVjdG9yeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSIke2NyYXdsZXIucHVzaHB1bGwubWV0LmZpbGUuZXh0fSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InRvRGlyIiB2YWx1ZT0iJHtjcmF3bGVyLmJhY2t1cC5kaXJ9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY3JlYXRlVG9EaXIiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Ik1vdmVNZXRhZGF0YUZpbGVUb0JhY2t1cERpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIHRvIHN1Y2Nlc3MgZGlyZWN0b3J5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7Y3Jhd2xlci5tZXQuZmlsZS5leHR9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idG9EaXIiIHZhbHVlPSIke2NyYXdsZXIuYmFja3VwLmRpcn0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjcmVhdGVUb0RpciIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RTdWNjZXNzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIFdvcmtmbG93IE1hbmFnZXIgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0iVHJpZ2dlclBvc3RJbmdlc3RXb3JrZmxvdyIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uV29ya2Zsb3dNZ3JTdGF0dXNVcGRhdGUiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyB3b3JrZmxvdyBldmVudCB3aXRoIHRoZSBuYW1lIFtQcm9kdWN0VHlwZV1Jbmdlc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJpbmdlc3RTdWZmaXgiIHZhbHVlPSJJbmdlc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ3b3JrZmxvd01nclVybCIgdmFsdWU9IiR7Y3Jhd2xlci53b3JrZmxvd21nci51cmx9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBGaWxlIE1hbmFnZXIgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0iVW5pcXVlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5GaWxlbWdyVW5pcXVlbmVzc0NoZWNrZXIiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDaGVja3MgdGhlIGZpbGVtZ3IgYWdhaW5zdCB0aGUgUFJPRFVDVF9OQU1FIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gbWFrZSBzdXJlIGl0IGhhcyBub3QgeWV0IGJlZW4gaW5nZXN0ZWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlbWdyVXJsIiB2YWx1ZT0iJHtjcmF3bGVyLmZpbGVtZ3IudXJsfSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cHJlSW5nZXN0PC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iSW5nZXN0QW5jaWxsYXJ5RmlsZSIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uSW5nZXN0QW5jaWxsYXJ5Ij4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVGhpcyB3aWxsIGluZ2VzdCBhbiBhc3NvY2lhdGVkIGZpbGUgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBmaWxlIGJlaW5nIGluZ2VzdGVkIGJ5IHRoZSBjcmF3bGVyLiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImZpbGVNYW5hZ2VyVXJsIiB2YWx1ZT0iJHtjcmF3bGVyLmZpbGVtZ3IudXJsfSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSIke2NyYXdsZXIuYW5jLmZpbGUuZXh0fSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImZpbGVTdWZmaXgiIHZhbHVlPSIke2NyYXdsZXIuYW5jLmZpbGUuc3VmZml4fSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImtlZXBFeGlzdGluZ0V4dGVuc2lvbiI+CisJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iPmZhbHNlPC92YWx1ZT4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImRhdGFUcmFuc2ZlclNlcnZpY2UiIHZhbHVlPSIke2NyYXdsZXIuY2xpZW50LnRyYW5zZmVyZXJ9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVsYXRlZEtleSIgdmFsdWU9IkNBUy5Qcm9kdWN0SWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjb3B5S2V5cyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+TWV0S2V5MTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJwcm9kdWN0VHlwZSIgdmFsdWU9IkdlbmVyaWNGaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZmFpbE1pc3NpbmdGaWxlIj4KKwkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiI+dHJ1ZTwvdmFsdWU+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnByZUluZ2VzdDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBFeGlzdGVuY2UgQ2hlY2sgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0iQ2hlY2tNZXRGaWxlRXhpc3RzIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5FeHRlcm5BY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDaGVja3MgaWYgbWV0YWRhdGEgZmlsZSB3YXMgY3JlYXRlZCAtLSBtYWtlIHN1cmUgY2hlY2stZXhpc3RzLnNoIGlzIG9uIHlvdXIgUEFUSCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImV4ZWN1dGVDb21tYW5kIiB2YWx1ZT0iLi9jaGVjay1leGlzdHMuc2ggW0ZpbGVuYW1lXS5tZXQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnByZUluZ2VzdDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBFbWFpbCBBY3Rpb25zIC0tPgorCTxiZWFuIGlkPSJTZW5kTm90aWZpY2F0aW9uIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5FbWFpbE5vdGlmaWNhdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRoaXMgd2lsbCBzZW5kIGFuIGVtYWlsIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWJtaXNzaW9uIHRvIHRoZSBjYXRhbG9nIHdhcyBzdWNjZXNzZnVsLiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Im1haWxIb3N0IiB2YWx1ZT0iJHtub3RpZmljYXRpb24ubWFpbC5ob3N0fSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InNlbmRlciIgdmFsdWU9IiR7bm90aWZpY2F0aW9uLnNlbmRlcn0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdWJqZWN0IiB2YWx1ZT0iJHtub3RpZmljYXRpb24uc3VjY2Vzcy5zdWJqZWN0fSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIke25vdGlmaWNhdGlvbi5zdWNjZXNzLm1lc3NhZ2V9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVjaXBpZW50cyIgdmFsdWU9IiR7bm90aWZpY2F0aW9uLnN1Y2Nlc3MucmVjaXBpZW50c30iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVJbnZhbGlkQWRkcmVzc2VzIj4KKwkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiI+dHJ1ZTwvdmFsdWU+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RTdWNjZXNzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbCBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzZmI4OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworICA8YmVhbiBpZD0ibGF1bmNoU3RkQ3Jhd2xlciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkuYWN0aW9uLkNyYXdsZXJMYXVuY2hlckNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgU3RkUHJvZHVjdENyYXdsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNyYXdsZXJJZCIgdmFsdWU9IlN0ZFByb2R1Y3RDcmF3bGVyIiAvPgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImxhdW5jaE1ldENyYXdsZXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLmFjdGlvbi5DcmF3bGVyTGF1bmNoZXJDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIE1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjcmF3bGVySWQiIHZhbHVlPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJsYXVuY2hBdXRvQ3Jhd2xlciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkuYWN0aW9uLkNyYXdsZXJMYXVuY2hlckNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjcmF3bGVySWQiIHZhbHVlPSJBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiIC8+CisgIDwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLW9wdGlvbnMueG1sIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOTJlZjg5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApAQCAtMCwwICsxLDkxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBBdXRob3I6IGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgPGJlYW4gaWQ9Im9wZXJhdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im9wIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib3BlcmF0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlY2xhcmUgdGhhdCB5b3Ugd2lzaCB0byBwcmVzZW50IGFuIG9wZXJhdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIGxhdW5jaFN0ZENyYXdsZXIgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImxhdW5jaFN0ZENyYXdsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzdGRQQyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImxhdW5jaFN0ZENyYXdsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgU3RkUHJvZHVjdENyYXdsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmxhdW5jaFN0ZENyYXdsZXI8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIGxhdW5jaE1ldENyYXdsZXIgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImxhdW5jaE1ldENyYXdsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtZXRQQyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImxhdW5jaE1ldENyYXdsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmxhdW5jaE1ldENyYXdsZXI8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIGxhdW5jaEF1dG9DcmF3bGVyIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJsYXVuY2hBdXRvQ3Jhd2xlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImF1dG9QQyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImxhdW5jaEF1dG9DcmF3bGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+bGF1bmNoQXV0b0NyYXdsZXI8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKwk8YmVhbiBpZD0icHJpbnRTdXBwb3J0ZWRDcmF3bGVyQWN0aW9ucyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwc2NhIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW50U3VwcG9ydGVkQ3Jhd2xlckFjdGlvbnMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50cyBhIGxpc3QgYW5kIGRlc2NyaXB0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgQ3Jhd2xlckFjdGlvbnMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGVyZm9ybUFuZFF1aXQiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckFjdGlvbkluZm9IYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0iYXBwbGljYXRpb25Db250ZXh0Ij4KKwkJCQkJPGJlYW4gY2xhc3M9Im9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQiPgorCQkJCQkJPGNvbnN0cnVjdG9yLWFyZyB2YWx1ZT0iLi4vcG9saWN5L2FjdGlvbi1iZWFucy54bWwiIC8+CisJCQkJCTwvYmVhbj4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwcmludFN1cHBvcnRlZFByZWNvbmRpdGlvbnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHNwIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW50U3VwcG9ydGVkUHJlY29uZGl0aW9ucyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnRzIGEgbGlzdCBhbmQgZGVzY3JpcHRpb24gb2YgYWxsIHN1cHBvcnRlZCBQcmVjb25kaXRpb25zIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBlcmZvcm1BbmRRdWl0IiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLlByZWNvbmRpdGlvbkluZm9IYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0iYXBwbGljYXRpb25Db250ZXh0Ij4KKwkJCQkJPGJlYW4gY2xhc3M9Im9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQiPgorCQkJCQkJPGNvbnN0cnVjdG9yLWFyZyB2YWx1ZT0iLi4vcG9saWN5L3ByZWNvbmRpdGlvbi1iZWFucy54bWwiIC8+CisJCQkJCTwvYmVhbj4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJmaWxlbWdyVXJsIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImZtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImZpbGVtZ3JVcmwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkZpbGUgTWFuYWdlciBVUkwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLmZpbGVtZ3JVcmw8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmZpbGVtZ3JVcmw8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5maWxlbWdyVXJsPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IiPgorCQkJCQk8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorCQkJCQkJPGxpc3Q+CisJCQkJCQkJPHZhbHVlPmh0dHA6Ly8uKjpcZCo8L3ZhbHVlPgorCQkJCQkJPC9saXN0PgorCQkJCQk8L3Byb3BlcnR5PgorCQkJCTwvYmVhbj4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iZmFpbHVyZURpciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJmZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJmYWlsdXJlRGlyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEaXJlY3Rvcnkgd2hlcmUgZmlsZXMgd2lsbCBiZSBtb3ZlZCBvbiBmYWlsdXJlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJkaXJlY3RvcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5Nb3ZlTWV0YWRhdGFGaWxlVG9GYWlsdXJlRGlyLnRvRGlyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5Nb3ZlUHVzaHB1bGxNZXRGaWxlVG9GYWlsdXJlRGlyLnRvRGlyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5Nb3ZlRGF0YUZpbGVUb0ZhaWx1cmVEaXIudG9EaXI8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvciIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0ic3VjY2Vzc0RpciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzdWNjZXNzRGlyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEaXJlY3Rvcnkgd2hlcmUgZmlsZXMgd2lsbCBiZSBtb3ZlZCBvbiBzdWNjZXNzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJkaXJlY3RvcnkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPk1vdmVQdXNocHVsbE1ldEZpbGVUb0JhY2t1cERpci50b0RpcjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZU1ldGFkYXRhRmlsZVRvQmFja3VwRGlyLnRvRGlyPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9IndvcmtmbG93TWdyVXJsIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9IndtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9IndvcmtmbG93TWdyVXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJXb3JrZmxvdyBNYW5hZ2VyIFVSTCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0idXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5VcGRhdGVXb3JrZmxvd1N0YXR1c1RvSW5nZXN0LndvcmtmbG93TWdyVXJsPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IiPgorCQkJCQk8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorCQkJCQkJPGxpc3Q+CisJCQkJCQkJPHZhbHVlPmh0dHA6Ly8uKjpcZCo8L3ZhbHVlPgorCQkJCQkJPC9saXN0PgorCQkJCQk8L3Byb3BlcnR5PgorCQkJCTwvYmVhbj4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iY2xpZW50VHJhbnNmZXJlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJjbGllbnRUcmFuc2ZlcmVyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJGaWxlIE1hbmFnZXIgZGF0YSB0cmFuc2ZlcmVyIGZhY3RvcnkgY2xhc3MiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5jbGllbnRUcmFuc2ZlcmVyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5jbGllbnRUcmFuc2ZlcmVyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuY2xpZW50VHJhbnNmZXJlcjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InJlcXVpcmVkTWV0YWRhdGEiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icnFtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlcXVpcmVkTWV0YWRhdGEiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1ldGFkYXRhIHJlcXVpcmVkIGZvciBpbmdlc3QgdG8gdGFrZSBwbGFjZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWV0YWRhdGFfZWxlbWVudHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLnJlcXVpcmVkTWV0YWRhdGE8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLnJlcXVpcmVkTWV0YWRhdGE8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5yZXF1aXJlZE1ldGFkYXRhPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImFjdGlvbklkcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJhaXMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iYWN0aW9uSWRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDcmF3bGVyQWN0aW9ucyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9IkNyYXdsZXJBY3Rpb24gaWRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5hY3Rpb25JZHM8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmFjdGlvbklkczwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmFjdGlvbklkczwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwcmVDb25kSWRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBpZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJlQ29uZElkcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJlQ29uZGl0aW9uQ29tcGFyYXRvciBpZHMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIGFueSBtZXRhZGF0YSBleHRyYWN0aW9uIHdpbGwgcnVuIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJQcmVDb25kaXRpb25Db21wYXJhdG9yIGlkcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIucHJlQ29uZElkczwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworICA8YmVhbiBpZD0ibmFtaW5nQ29udmVudGlvbklkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibmNpZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im5hbWluZ0NvbnZlbnRpb25JZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJJRCBvZiB0aGUgTmFtaW5nQ29udmVudGlvbiB0byB1c2UgdG8gcmVuYW1lIHByb2R1Y3RzIGJlZm9yZSBpbmdlc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJOYW1pbmdDb252ZW50aW9uIElEIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5uYW1pbmdDb252ZW50aW9uSWQ8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKwk8YmVhbiBpZD0ibm9SZWN1ciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJub1JlY3VyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUdXJucyBvZmYgcmVjdXJzaXZlIGNyYXdsaW5nIC0gd2lsbCBvbmx5IHByb2Nlc3MgZmlsZXMgaW4gcHJvZHVjdFBhdGggZGlyZWN0b3J5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImJvb2xlYW4iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5ub1JlY3VyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5ub1JlY3VyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIubm9SZWN1cjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJjcmF3bEZvckRpcnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY2ZkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNyYXdsRm9yRGlycyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iV2lsbCBjcmF3bCBmb3IgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiBmaWxlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJib29sZWFuIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLmNyYXdsRm9yRGlyczwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuY3Jhd2xGb3JEaXJzPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuY3Jhd2xGb3JEaXJzPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InNraXBJbmdlc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic2kiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic2tpcEluZ2VzdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iV2lsbCBza2lwIGluZ2VzdCB0byBmaWxlIG1hbmFnZXIgYW5kIGFueSBwb3N0IGluZ2VzdCBhY3Rpb25zIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImJvb2xlYW4iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuc2tpcEluZ2VzdDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuc2tpcEluZ2VzdDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLnNraXBJbmdlc3Q8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iZGFlbW9uUG9ydCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkcCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkYWVtb25Qb3J0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2F1c2UgY3Jhd2xlciB0byBiZWNvbWUgYSBkYWVtb24gd2l0aCBhIFhNTC1SUEMgd2Vic2VydmVyIHN0YXJ0ZWQgb24gdGhlIGdpdmVuIHBvcnQgbnVtYmVyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJwb3J0TnVtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5kYWVtb25Qb3J0PC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5kYWVtb25Qb3J0PC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuZGFlbW9uUG9ydDwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKwkJCQkJPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBcmdzIj4KKwkJCQkJCTxsaXN0PgorCQkJCQkJCTx2YWx1ZT5cZCo8L3ZhbHVlPgorCQkJCQkJPC9saXN0PgorCQkJCQk8L3Byb3BlcnR5PgorCQkJCTwvYmVhbj4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iZGFlbW9uV2FpdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkdyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkYWVtb25XYWl0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2F1c2UgY3Jhd2xlciB0byBiZWNvbWUgYSBkYWVtb24gYW5kIHNsZWVwIGZvciBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGNyYXdscyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ic2Vjb25kcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuZGFlbW9uV2FpdDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuZGFlbW9uV2FpdDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmRhZW1vbldhaXQ8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvciI+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJhbGxvd2VkQXJncyI+CisJCQkJCQk8bGlzdD4KKwkJCQkJCQk8dmFsdWU+XGQqPC92YWx1ZT4KKwkJCQkJCTwvbGlzdD4KKwkJCQkJPC9wcm9wZXJ0eT4KKwkJCQk8L2JlYW4+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InByb2R1Y3RQYXRoIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBwIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByb2R1Y3RQYXRoIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSb290IGRpcmVjdG9yeSB0byBjcmF3bCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGlyZWN0b3J5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIucHJvZHVjdFBhdGg8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLnByb2R1Y3RQYXRoPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIucHJvZHVjdFBhdGg8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvciIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0ibWV0RmlsZUV4dGVuc2lvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtZngiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWV0RmlsZUV4dGVuc2lvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIGV4aXN0aW5nIGFuZCB0byBiZSBjcmVhdGVkIFBDUyBtZXRhZGF0YSBmaWxlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZSBleHRlbnNpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLm1ldEZpbGVFeHRlbnNpb248L3ZhbHVlPgorCQkJCQkJPHZhbHVlPkRlbGV0ZU1ldGFkYXRhRmlsZS5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5Nb3ZlTWV0YWRhdGFGaWxlVG9CYWNrdXBEaXIuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZU1ldGFkYXRhRmlsZVRvRmFpbHVyZURpci5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im1ldEV4dHJhY3RvciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJteCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtZXRFeHRyYWN0b3IiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1ldGFkYXRhIGV4dHJhY3RvciBjbGFzcyB0byB1c2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5tZXRFeHRyYWN0b3I8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQ2xhc3NFeGlzdHNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJtZXRFeHRyYWN0b3JDb25maWciIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibXhjIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1ldEV4dHJhY3RvckNvbmZpZyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ29uZmlnIGZpbGUgZm9yIG1ldGFkYXRhIGV4dHJhY3RvciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIubWV0RXh0cmFjdG9yQ29uZmlnPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im1pbWVFeHRyYWN0b3JSZXBvIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im14ciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtaW1lRXh0cmFjdG9yUmVwbyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWltZS10eXBlIHRvIG1ldGFkYXRhIGV4dHJhY3RvciBtYXBwaW5nIHhtbCBmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLm1pbWVFeHRyYWN0b3JSZXBvPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InB1c2hwdWxsTWV0RmlsZUV4dGVuc2lvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcG1meCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwdXNocHVsbE1ldEZpbGVFeHRlbnNpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkZpbGUgZXh0ZW5zaW9uIG9mIHB1c2gtcHVsbCBtZXRhZGF0YSBmaWxlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZSBleHRlbnNpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPkRlbGV0ZVB1c2hwdWxsTWV0RmlsZS5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5Nb3ZlUHVzaHB1bGxNZXRGaWxlVG9CYWNrdXBEaXIuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZVB1c2hwdWxsTWV0RmlsZVRvRmFpbHVyZURpci5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5DaGVja1RoYXRQdXNoUHVsbE1ldEZpbGVFeGlzdHMuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworICA8YmVhbiBpZD0ibm90aWZpY2F0aW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im5vdGlmaWNhdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWNsYXJlIHRoYXQgeW91ciB3YW50IGVtYWlsIG5vdGlmaWNhdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWJPcHRpb25zIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0ibWFpbEhvc3QiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJzZW5kZXIiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJzdWJqZWN0IiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0ibWVzc2FnZSIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InJlY2lwaWVudHMiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJpZ25vcmVJbnZhbGlkQWRkcmVzc2VzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Im1haWxIb3N0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtaCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1haWxIb3N0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkVtYWlsIEhvc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJob3N0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5TZW5kTm90aWZpY2F0aW9uLmVtYWlsSG9zdDwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ic2VuZGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzZHIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzZW5kZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRW1haWwgc2VuZGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZW1haWwgYWRkcmVzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8dmFsdWU+U2VuZE5vdGlmaWNhdGlvbi5zZW5kZXI8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InN1YmplY3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InN1YiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InN1YmplY3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRW1haWwgc3ViamVjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImVtYWlsIHN1YmplY3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPlNlbmROb3RpZmljYXRpb24uc3ViamVjdDwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ibWVzc2FnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibXNnIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWVzc2FnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJFbWFpbCBtZXNzYWdlIGJvZHkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJlbWFpbCBtZXNzYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5TZW5kTm90aWZpY2F0aW9uLm1lc3NhZ2U8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlY2lwaWVudHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJjcHRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVjaXBpZW50cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJMaXN0IG9mIHJlY2lwaWVudCBlbWFpbHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImVtYWlsIGFkZHJlc3NlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8dmFsdWU+U2VuZE5vdGlmaWNhdGlvbi5yZWNpcGllbnRzPC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJpZ25vcmVJbnZhbGlkQWRkcmVzc2VzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJpaWFzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaWdub3JlSW52YWxpZEFkZHJlc3NlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJJZiBpbnZhbGlkIGFkZHJlc3NlcyBzaG91bGQganVzdCBiZSBpZ25vcmVkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iYm9vbGVhbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5TZW5kTm90aWZpY2F0aW9uLmlnbm9yZUludmFsaWRBZGRyZXNzZXM8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9jcmF3bGVyLWJlYW5zLnhtbCBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvY3Jhd2xlci1iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3OTExOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvY3Jhd2xlci1iZWFucy54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKwk8IS0tIFByb2R1Y3QgQ3Jhd2xlcnMgLS0+CisJPGJlYW4gaWQ9IlN0ZFByb2R1Y3RDcmF3bGVyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLlN0ZFByb2R1Y3RDcmF3bGVyIj4KKwkJPGRlc2NyaXB0aW9uPkluZ2VzdHMgZGF0YSBmaWxlcyBiYXNlZCBvbiBleGlzdGluZyBtZXRhZGF0YSBmaWxlczwvZGVzY3JpcHRpb24+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Ik1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIj4KKwkJPGRlc2NyaXB0aW9uPkluZ2VzdHMgZGF0YSBmaWxlcyBhZnRlciBnZW5lcmF0aW5nIGEgbWV0YWRhdGEgZmlsZSBmb3IgaXQgd2l0aCBhIGdpdmVuIG1ldGFkYXRhIGV4dHJhY3RvcjwvZGVzY3JpcHRpb24+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiPgorCQk8ZGVzY3JpcHRpb24+SW5nZXN0cyBkYXRhIGZpbGVzIGJ5IGNob29zaW5nIG1ldGFkYXRhIGV4dHJhY3RvcnMgYmFzZWQgb24gbWltZXR5cGVzIGdpdmVuIGluIHNwZWNpZmllZCBtaW1ldHlwZSB4bWwgZmlsZTwvZGVzY3JpcHRpb24+CisJPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvY3Jhd2xlci1jb25maWcueG1sIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9jcmF3bGVyLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDI1MGMzNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvY3Jhd2xlci1jb25maWcueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKwk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC51dGlsLkNhc1Byb3BlcnR5T3ZlcnJpZGVDb25maWd1cmVyIiAvPgorCisJPGltcG9ydCByZXNvdXJjZT0iY3Jhd2xlci1iZWFucy54bWwiIC8+CisJPGltcG9ydCByZXNvdXJjZT0iYWN0aW9uLWJlYW5zLnhtbCIgLz4KKwk8aW1wb3J0IHJlc291cmNlPSJwcmVjb25kaXRpb24tYmVhbnMueG1sIiAvPgorICA8aW1wb3J0IHJlc291cmNlPSJuYW1pbmctYmVhbnMueG1sIiAvPgorCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9taW1lLWV4dHJhY3Rvci1tYXAueG1sIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9taW1lLWV4dHJhY3Rvci1tYXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2FiMDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21pbWUtZXh0cmFjdG9yLW1hcC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOm1pbWV0eXBlbWFwIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc3NhLmdvdi8xLjAvY2FzIiBtYWdpYz0idHJ1ZSBvciBmYWxzZSIgbWltZVJlcG89InBhdGgvdG8vdGlrYS1taW1ldHlwZXMveG1sL2ZpbGUiPgorCQorCTwhLS0gZXh0cmFjdG9yIHNwZWNzIGZvciBtaW1lLXR5cGUgZnJvbSBtaW1ldHlwZXMueG1sIChvbmUgb3IgbW9yZSkgLS0+CisJPG1pbWUgdHlwZT0ic29tZS9taW1lLXR5cGUiPgorCisgICAgPCEtLSBuYW1pbmcgY29udmVudGlvbiBmb3IgcmVuYW1pbmcgZmlsZSAoemVybyBvciBvbmUpIC0tPgorICAgIDxuYW1pbmdDb252ZW50aW9uIGlkPSJpZF9mcm9tX2FwcGxpY2F0aW9uX2NvbnRleHRfYmVhbl9maWxlIiAvPgorCisJCTwhLS0gZXh0cmFjdG9yIHNwZWMgZm9yIGdpdmVuIG1pbWUtdHlwZSAob25lIG9yIG1vcmUpIC0tPgorCQk8ZXh0cmFjdG9yIGNsYXNzPSJleHRyYWN0b3IuY2xhc3MiPgorCQkJCisJCQk8IS0tIGV4dHJhY3RvciBjb25maWcgZmlsZSAoemVybyBvciBvbmUpIC0tPgorCQkJPGNvbmZpZyBmaWxlPSJleHRyYWN0b3IvY29uZmlnL2ZpbGUiLz4KKwkJCQorCQkJPCEtLSBwcmVjb25kaXRpb24gY29tcGFyYXRvcnMgKHplcm8gb3Igb25lKSAtLT4KKwkJCTxwcmVDb25kQ29tcGFyYXRvcnM+CisJCQkJCisJCQkJPCEtLSBwcmVjb25kaXRpb24gY29tcGFyYXRvciBpZCAob25lIG9yIG1vcmUpIC0tPgorCQkJCTxwcmVDb25kQ29tcGFyYXRvciBpZD0iaWRfZnJvbV9hcHBsaWNhdGlvbl9jb250ZXh0X2JlYW5fZmlsZSIvPgorCQkJCQorCQkJPC9wcmVDb25kQ29tcGFyYXRvcnM+CisJCQkKKwkJPC9leHRyYWN0b3I+CisJCQorCTwvbWltZT4KKwkKKzwvY2FzOm1pbWV0eXBlbWFwPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9taW1ldHlwZXMueG1sIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9taW1ldHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21pbWV0eXBlcy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8bWltZS1pbmZvPgorCQorCTwhLS0gbWltZS10eXBlIGRlY2xhcmF0aW9uIChvbmUgb3IgbW9yZSkgLS0+CisJPG1pbWUtdHlwZSB0eXBlPSJzb21lL21pbWUtdHlwZSI+CisJCQorCQk8IS0tIHN1cGVyLXR5cGUsIE1ldEV4dHJhY3RvclNwZWNzIGRlZmluZWQgZm9yIHRoaXMgdHlwZSBhbmQKKwkJCWl0J3MgcGFyZW50IHR5cGVzIHdpbGwgYWxzbyBiZSB1c2VkICh6ZXJvIG9yIG9uZSkgLS0+CisJCTxzdWItY2xhc3Mtb2YgdHlwZT0iYW5vdGhlci9taW1lLXR5cGUiLz4KKwkJCisJCTwhLS0gYW55IHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXJzYWJsZSBieSBKYXZhIFBhdHRlcm4gKG9uZSBvciBtb3JlKSAtLT4KKwkJPGdsb2IgcGF0dGVybj0icmVnRXhwciIvPgorCQkKKwk8L21pbWUtdHlwZT4KKwkKKzwvbWltZS1pbmZvPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leHRlcm4tc2NyaXB0cy9jaGVjay1kYXRhLWZpbGUtY29tcGxldGUucGwgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2V4dGVybi1zY3JpcHRzL2NoZWNrLWRhdGEtZmlsZS1jb21wbGV0ZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZWZjMTAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leHRlcm4tc2NyaXB0cy9jaGVjay1kYXRhLWZpbGUtY29tcGxldGUucGwKQEAgLTAsMCArMSw5NCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyNsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXh0ZXJuIHNjcmlwdCB0aGF0IGlzIHVzZWQgZm9yIGEgcHJlLWluZ2VzdAorIyBjb25kaXRpb24uIEluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIHN0cmluZyAnUEFSVElBTCcgb3IgJ0lOQ09NUExFVEUnCisjIGFyZSBmb3VuZCBpbiAKKyMKKyMgUmV0dXJuczogICAgIDAgdXBvbiBzdWNjZXNzLCAxIGZvciBmYWlsdXJlCisjCit1c2Ugc3RyaWN0OwordXNlIEVudjsKK3VzZSBGaWxlOjpCYXNlbmFtZTsKK3VzZSBUaW1lOjpQaWVjZTsKKyMKKyMgR2xvYmFscworIworbXkgICRzY3JpcHROYW1lID0gJDA7CisKKyMKKyMgRnVuY3Rpb24gUHJvdG90eXBlcworIworc3ViIE1haW4oKTsKKworIworIyBNYWluIFByb2dyYW0KKyMKK01haW4oKTsKK2V4aXQgMDsgICMgMCA9IHN1Y2Nlc3MKKworIworIyBGdW5jdGlvbnMKKyMKK3N1YiBNYWluKCkgCit7CisKKyAgICMgR2V0IHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQKKyAgIG15ICRmdWxsU3BlYyA9IHNoaWZ0KEBBUkdWKTsKKworICAgIworICAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGlucHV0IGZpbGUgZXhpc3RzLgorICAgIworICAgdW5sZXNzICggLWUgJGZ1bGxTcGVjICkgeworICAgICAgcHJpbnQgIkVSUk9SOiAiLiAkc2NyaXB0TmFtZSAuICI6IElucHV0IGZpbGUgXFskZnVsbFNwZWNcXSBEb2Vzbid0IGV4aXN0IVxuIjsKKyAgICAgIGV4aXQgMTsKKyAgIH0KKworICAgIworICAgIyBCcmVhayB1cCB0aGUgZmlsZSBzcGVjaWZpY2F0aW9uIGludG8gcGFydHMuIEluIHRoaXMgZm9ybSBvZiB0aGUgZmlsZXBhcnNlCisgICAjIGNvbW1hbmQsIHRoZSBmaWxlIGV4dGVuc2lvbiBpbmNsdWRlcyB0aGUgJy4nIGFuZCB0aGUgZGlyZWN0b3J5IG5hbWUgaW5jbHVkZXMKKyAgICMgdGhlICcvJyBhdCB0aGUgZW5kLgorICAgIworICAgbXkgKCRiYXNlTmFtZSwgJGRpciwgJGV4dCApID0gZmlsZXBhcnNlKCAkZnVsbFNwZWMgLCBxci9cLlteLl0qLyk7CisgICBwcmludCAiSU5GTzogIi4gJHNjcmlwdE5hbWUgLiAiOiBQcm9jZXNzaW5nIGZpbGU6IFxbJGZ1bGxTcGVjXF1cbiI7CisgICBjaG9wKCAkZGlyICk7ICMgcmVtb3ZlIGxhc3QgJy8nIGNoYXJhY3Rlci4KKworICAgIworICAgIyBJZiB0aGUgZmlsZSBpcyBhIC5vdXQgc2NpZW5jZSBmaWxlLCBjaGVjayB0aGF0IHRoZXJlIGlzIGEgY29yZXNwb25kaW5nIC5kdGwKKyAgICMgYXZhaWxhYmxlIHRvIGNoZWNrIGZvciB0aGUgLm91dCBmaWxlJ3MgY29tcGxldGUgc3RhdHVzLiAKKyAgICMKKyAgIGlmICggJGV4dCA9fiAvLipcLm91dC8gKSB7CisgICAgICBteSAkZHRsRmlsZSA9ICRmdWxsU3BlYzsKKyAgICAgICRkdGxGaWxlID1+IHMvXC5vdXQvXC5kdGwvOworICAgICAgdW5sZXNzICggLWUgJGR0bEZpbGUgKSB7CisgICAgICAgICAgcHJpbnQgIkVSUk9SOiAiLiAkc2NyaXB0TmFtZSAuICI6IC5kdGwgZmlsZSBcWyRkdGxGaWxlXF0gRG9lc24ndCBleGlzdCBmb3IgJGJhc2VOYW1lJGV4dCFcbiI7CisgICAgICAgICAgZXhpdCAxOworICAgICAgfQorICAgICAgIworICAgICAgIyBJZiB0aGUgLmR0bCBmaWxlIGRvZXMgZXhpc3QsIG9wZW4gaXQgYW5kIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHN0cmluZ3MKKyAgICAgICMgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSAub3V0IGZpbGUgaXMgYSBjb21wbGV0ZSBmaWxlIG9yIG5vdC4gCisgICAgICAjCisgICAgICBvcGVuIERUTEZJTEUsICI8JGR0bEZpbGUiOworICAgICAgbXkgQGR0bEluZm8gPSA8RFRMRklMRT47CisgICAgICBjbG9zZSBEVExGSUxFOworICAgICAgaWYgKCBncmVwIC9EQVRBX0lOQ09NUExFVEUvLCBAZHRsSW5mbyBvciBncmVwIC9QQVJUSUFMLywgQGR0bEluZm8gKSB7CisgICAgICAgICAgcHJpbnQgIklORk86ICIuICRzY3JpcHROYW1lIC4gIjogSW5wdXQgZmlsZSBcWyRmdWxsU3BlY1xdIElzIG5vdCBhIGNvbXBsZXRlIGZpbGUuXG4iOworICAgICAgICAgIGV4aXQgMTsKKyAgICAgIH0KKyAgIH0KKworfSAjIEVuZCBvZiBNYWluCisKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvZXh0ZXJuLXNjcmlwdHMvY2hlY2stZXhpc3RzLnNoIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9leHRlcm4tc2NyaXB0cy9jaGVjay1leGlzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5MjczNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvZXh0ZXJuLXNjcmlwdHMvY2hlY2stZXhpc3RzLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2lmIFsgISAtZiAkMSBdOyB0aGVuCisJZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9sZWdhY3ktY21kLWxpbmUtYWN0aW9ucy54bWwgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2xlZ2FjeS1jbWQtbGluZS1hY3Rpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjU5ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9sZWdhY3ktY21kLWxpbmUtYWN0aW9ucy54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKwk8IS0tIFByb2R1Y3QgQ3Jhd2xlcnMgLS0+CisJPGJlYW4gaWQ9IlN0ZFByb2R1Y3RDcmF3bGVyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5hY3Rpb24uQ3Jhd2xlckxhdW5jaGVyQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBTdGRQcm9kdWN0Q3Jhd2xlciIgLz4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLmFjdGlvbi5DcmF3bGVyTGF1bmNoZXJDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIE1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiAvPgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLmFjdGlvbi5DcmF3bGVyTGF1bmNoZXJDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgLz4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9sZWdhY3ktY21kLWxpbmUtb3B0aW9ucy54bWwgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2xlZ2FjeS1jbWQtbGluZS1vcHRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OWQyNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9sZWdhY3ktY21kLWxpbmUtb3B0aW9ucy54bWwKQEAgLTAsMCArMSw2NzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisJPGJlYW4gaWQ9ImNyYXdsZXJJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY2lkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNyYXdsZXJJZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVGhlIFByb2R1Y3RDcmF3bGVyIHRvIHVzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdENyYXdsZXIgaWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InByaW50U3VwcG9ydGVkQ3Jhd2xlckFjdGlvbnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHNjYSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmludFN1cHBvcnRlZENyYXdsZXJBY3Rpb25zIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludHMgYSBsaXN0IGFuZCBkZXNjcmlwdGlvbiBvZiBhbGwgc3VwcG9ydGVkIENyYXdsZXJBY3Rpb25zIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBlcmZvcm1BbmRRdWl0IiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJBY3Rpb25JbmZvSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9ImFwcGxpY2F0aW9uQ29udGV4dCI+CisJCQkJCTxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0Ij4KKwkJCQkJCTxjb25zdHJ1Y3Rvci1hcmcgdmFsdWU9Ii4uL3BvbGljeS9hY3Rpb24tYmVhbnMueG1sIiAvPgorCQkJCQk8L2JlYW4+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0icHJpbnRTdXBwb3J0ZWRQcmVjb25kaXRpb25zIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBzcCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmludFN1cHBvcnRlZFByZWNvbmRpdGlvbnMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW50cyBhIGxpc3QgYW5kIGRlc2NyaXB0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgUHJlY29uZGl0aW9ucyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwZXJmb3JtQW5kUXVpdCIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5QcmVjb25kaXRpb25JbmZvSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9ImFwcGxpY2F0aW9uQ29udGV4dCI+CisJCQkJCTxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0Ij4KKwkJCQkJCTxjb25zdHJ1Y3Rvci1hcmcgdmFsdWU9Ii4uL3BvbGljeS9wcmVjb25kaXRpb24tYmVhbnMueG1sIiAvPgorCQkJCQk8L2JlYW4+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iZmlsZW1nclVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJmbSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJmaWxlbWdyVXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJGaWxlIE1hbmFnZXIgVVJMIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5maWxlbWdyVXJsPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5maWxlbWdyVXJsPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuZmlsZW1nclVybDwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKwkJCQkJPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBcmdzIj4KKwkJCQkJCTxsaXN0PgorCQkJCQkJCTx2YWx1ZT5odHRwOi8vLio6XGQqPC92YWx1ZT4KKwkJCQkJCTwvbGlzdD4KKwkJCQkJPC9wcm9wZXJ0eT4KKwkJCQk8L2JlYW4+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImZhaWx1cmVEaXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZmQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZmFpbHVyZURpciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdpbGwgYmUgbW92ZWQgb24gZmFpbHVyZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGlyZWN0b3J5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJTdGRQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Ik1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+TW92ZU1ldGFkYXRhRmlsZVRvRmFpbHVyZURpci50b0RpcjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZVB1c2hwdWxsTWV0RmlsZVRvRmFpbHVyZURpci50b0RpcjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZURhdGFGaWxlVG9GYWlsdXJlRGlyLnRvRGlyPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InN1Y2Nlc3NEaXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic2QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic3VjY2Vzc0RpciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdpbGwgYmUgbW92ZWQgb24gc3VjY2VzcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGlyZWN0b3J5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iU3RkUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5Nb3ZlUHVzaHB1bGxNZXRGaWxlVG9CYWNrdXBEaXIudG9EaXI8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1vdmVNZXRhZGF0YUZpbGVUb0JhY2t1cERpci50b0RpcjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5GaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJ3b3JrZmxvd01nclVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ3bSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ3b3JrZmxvd01nclVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iV29ya2Zsb3cgTWFuYWdlciBVUkwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IlN0ZFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+VXBkYXRlV29ya2Zsb3dTdGF0dXNUb0luZ2VzdC53b3JrZmxvd01nclVybDwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKwkJCQkJPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBcmdzIj4KKwkJCQkJCTxsaXN0PgorCQkJCQkJCTx2YWx1ZT5odHRwOi8vLio6XGQqPC92YWx1ZT4KKwkJCQkJCTwvbGlzdD4KKwkJCQkJPC9wcm9wZXJ0eT4KKwkJCQk8L2JlYW4+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImNsaWVudFRyYW5zZmVyZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iY2xpZW50VHJhbnNmZXJlciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsZSBNYW5hZ2VyIGRhdGEgdHJhbnNmZXJlciBmYWN0b3J5IGNsYXNzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjbGFzcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IlN0ZFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuY2xpZW50VHJhbnNmZXJlcjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuY2xpZW50VHJhbnNmZXJlcjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmNsaWVudFRyYW5zZmVyZXI8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQ2xhc3NFeGlzdHNDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJyZXF1aXJlZE1ldGFkYXRhIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJxbSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXF1aXJlZE1ldGFkYXRhIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNZXRhZGF0YSByZXF1aXJlZCBmb3IgaW5nZXN0IHRvIHRha2UgcGxhY2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im1ldGFkYXRhX2VsZW1lbnRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iU3RkUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5yZXF1aXJlZE1ldGFkYXRhPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5yZXF1aXJlZE1ldGFkYXRhPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIucmVxdWlyZWRNZXRhZGF0YTwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJhY3Rpb25JZHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYWlzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImFjdGlvbklkcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ3Jhd2xlckFjdGlvbnMgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJDcmF3bGVyQWN0aW9uIGlkcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IlN0ZFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuYWN0aW9uSWRzPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5hY3Rpb25JZHM8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5hY3Rpb25JZHM8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0icHJlQ29uZElkcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwaWRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByZUNvbmRJZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByZUNvbmRpdGlvbkNvbXBhcmF0b3IgaWRzIHRoYXQgbXVzdCBwYXNzIGJlZm9yZSBhbnkgbWV0YWRhdGEgZXh0cmFjdGlvbiB3aWxsIHJ1biIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iUHJlQ29uZGl0aW9uQ29tcGFyYXRvciBpZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5wcmVDb25kSWRzPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im5vUmVjdXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibnIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibm9SZWN1ciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHVybnMgb2ZmIHJlY3Vyc2l2ZSBjcmF3bGluZyAtIHdpbGwgb25seSBwcm9jZXNzIGZpbGVzIGluIHByb2R1Y3RQYXRoIGRpcmVjdG9yeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJib29sZWFuIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJICAgICAgICA8bGlzdD4KKwkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+CisJICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iU3RkUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5ub1JlY3VyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5ub1JlY3VyPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIubm9SZWN1cjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJjcmF3bEZvckRpcnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY2ZkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNyYXdsRm9yRGlycyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iV2lsbCBjcmF3bCBmb3IgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiBmaWxlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJib29sZWFuIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJICAgICAgICA8bGlzdD4KKwkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+CisJICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iU3RkUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5jcmF3bEZvckRpcnM8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmNyYXdsRm9yRGlyczwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmNyYXdsRm9yRGlyczwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJza2lwSW5nZXN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNpIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InNraXBJbmdlc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IldpbGwgc2tpcCBpbmdlc3QgdG8gZmlsZSBtYW5hZ2VyIGFuZCBhbnkgcG9zdCBpbmdlc3QgYWN0aW9ucyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJTdGRQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9Ik1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLnNraXBJbmdlc3Q8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLnNraXBJbmdlc3Q8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5za2lwSW5nZXN0PC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImRhZW1vblBvcnQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZHAiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZGFlbW9uUG9ydCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJpbnQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNhdXNlIGNyYXdsZXIgdG8gYmVjb21lIGEgZGFlbW9uIHdpdGggYSBYTUwtUlBDIHdlYnNlcnZlciBzdGFydGVkIG9uIHRoZSBnaXZlbiBwb3J0IG51bWJlciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icG9ydE51bSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IlN0ZFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuZGFlbW9uUG9ydDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuZGFlbW9uUG9ydDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmRhZW1vblBvcnQ8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvciI+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJhbGxvd2VkQXJncyI+CisJCQkJCQk8bGlzdD4KKwkJCQkJCQk8dmFsdWU+XGQqPC92YWx1ZT4KKwkJCQkJCTwvbGlzdD4KKwkJCQkJPC9wcm9wZXJ0eT4KKwkJCQk8L2JlYW4+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImRhZW1vbldhaXQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZHciIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZGFlbW9uV2FpdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJpbnQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNhdXNlIGNyYXdsZXIgdG8gYmVjb21lIGEgZGFlbW9uIGFuZCBzbGVlcCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBjcmF3bHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InNlY29uZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJTdGRQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9Ik1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLmRhZW1vbldhaXQ8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmRhZW1vbldhaXQ8L3ZhbHVlPgorCQkJCQkJPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5kYWVtb25XYWl0PC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IiPgorCQkJCQk8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorCQkJCQkJPGxpc3Q+CisJCQkJCQkJPHZhbHVlPlxkKjwvdmFsdWU+CisJCQkJCQk8L2xpc3Q+CisJCQkJCTwvcHJvcGVydHk+CisJCQkJPC9iZWFuPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwcm9kdWN0UGF0aCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcm9kdWN0UGF0aCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUm9vdCBkaXJlY3RvcnkgdG8gY3Jhd2wiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRpcmVjdG9yeSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLnByb2R1Y3RQYXRoPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5wcm9kdWN0UGF0aDwvdmFsdWU+CisJCQkJCQk8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLnByb2R1Y3RQYXRoPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im1ldEZpbGVFeHRlbnNpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibWZ4IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1ldEZpbGVFeHRlbnNpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRoZSBmaWxlIGV4dGVuc2lvbiBvZiBleGlzdGluZyBhbmQgdG8gYmUgY3JlYXRlZCBQQ1MgbWV0YWRhdGEgZmlsZXMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUgZXh0ZW5zaW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iU3RkUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5tZXRGaWxlRXh0ZW5zaW9uPC92YWx1ZT4KKwkJCQkJCTx2YWx1ZT5EZWxldGVNZXRhZGF0YUZpbGUuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZU1ldGFkYXRhRmlsZVRvQmFja3VwRGlyLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1vdmVNZXRhZGF0YUZpbGVUb0ZhaWx1cmVEaXIuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJtZXRFeHRyYWN0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibXgiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWV0RXh0cmFjdG9yIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNZXRhZGF0YSBleHRyYWN0b3IgY2xhc3MgdG8gdXNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjbGFzcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9Ik1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLm1ldEV4dHJhY3RvcjwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im1ldEV4dHJhY3RvckNvbmZpZyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJteGMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWV0RXh0cmFjdG9yQ29uZmlnIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDb25maWcgZmlsZSBmb3IgbWV0YWRhdGEgZXh0cmFjdG9yIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIubWV0RXh0cmFjdG9yQ29uZmlnPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkZpbGVFeGlzdENtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im1pbWVFeHRyYWN0b3JSZXBvIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im14ciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtaW1lRXh0cmFjdG9yUmVwbyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWltZS10eXBlIHRvIG1ldGFkYXRhIGV4dHJhY3RvciBtYXBwaW5nIHhtbCBmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5taW1lRXh0cmFjdG9yUmVwbzwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5GaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwdXNocHVsbE1ldEZpbGVFeHRlbnNpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHBtZngiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHVzaHB1bGxNZXRGaWxlRXh0ZW5zaW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJGaWxlIGV4dGVuc2lvbiBvZiBwdXNoLXB1bGwgbWV0YWRhdGEgZmlsZXMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUgZXh0ZW5zaW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iU3RkUHJvZHVjdENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9IkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTx2YWx1ZT5EZWxldGVQdXNocHVsbE1ldEZpbGUuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+TW92ZVB1c2hwdWxsTWV0RmlsZVRvQmFja3VwRGlyLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorCQkJCQkJPHZhbHVlPk1vdmVQdXNocHVsbE1ldEZpbGVUb0ZhaWx1cmVEaXIuZmlsZUV4dGVuc2lvbjwvdmFsdWU+CisJCQkJCQk8dmFsdWU+Q2hlY2tUaGF0UHVzaFB1bGxNZXRGaWxlRXhpc3RzLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzI0NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgZGVmYXVsdCBmaWxlIG91dHB1dCBpcyBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuID0gLi4vbG9ncy9jYXNfY3Jhd2xlciVnLmxvZworamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGltaXQgPSA1MDAwMAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuY291bnQgPSA1CitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5hcHBlbmQgPSB0cnVlCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBzdWJzeXN0ZW1zCisKK29yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wubGV2ZWwgPSBBTEwKKworb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24ubGV2ZWwgPSBBTEwKKworb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC50eXBlZGV0ZWN0aW9uLmxldmVsID0gQUxMCisKK29yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5sZXZlbCA9IEFMTAorCitvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNvbmZpZy5sZXZlbCA9IEFMTAorCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjIAorb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmxldmVsID0gSU5GTworCisjIHNwcmluZyBmcmFtZXdvcmsgbG9nZ2luZworb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIubGV2ZWwgPSBTRVZFUkUKK29yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5DYXNQcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlci5sZXZlbCA9IFNFVkVSRQorc3VuLm5ldC5sZXZlbCA9IFNFVkVSRQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9uYW1pbmctYmVhbnMueG1sIGIvMC4xMC9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9uYW1pbmctYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGE1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL25hbWluZy1iZWFucy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisgIDxiZWFuIGlkPSJFeGFtcGxlTmFtaW5nQ29udiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZmlsZW5hbWluZy5QYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ibmFtaW5nQ29udiIgdmFsdWU9IltQcm9kdWN0VHlwZV0uW05vbWluYWxEYXRlXS50eHQiIC8+CisgIDwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL3ByZWNvbmRpdGlvbi1iZWFucy54bWwgYi8wLjEwL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL3ByZWNvbmRpdGlvbi1iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwYzlkMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcHJlY29uZGl0aW9uLWJlYW5zLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcucG9zdHByb2Nlc3Nvci5TZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIiAvPgorICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC51dGlsLkNhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyIj4KKworICAgIDwhLS0gQWxsb3cgZm9yIHN5c3RlbS1sZXZlbCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlIGFsbCBwcm9wZXJ0aWVzIGJlbG93IC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzeXN0ZW1Qcm9wZXJ0aWVzTW9kZSIgdmFsdWU9IjIiIC8+CisKKyAgICA8IS0tIERlZmF1bHQgUHJvcGVydGllcyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICA8cHJvcHM+CisgICAgICAgIDxwcm9wIGtleT0iY3Jhd2xlci5wdXNocHVsbC5tZXQuZmlsZS5leHQiPltQVVNIUFVMTF9NRVRfRklMRV9FWFRdPC9wcm9wPgorICAgICAgICA8cHJvcCBrZXk9ImNyYXdsZXIuZmlsZW1nci51cmwiPltGSUxFTUdSX1VSTF08L3Byb3A+CisgICAgICA8L3Byb3BzPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworCTwhLS0gUHJlY29uZGl0aW9uIENvbXBhcmF0b3JzIC0tPgorCTxiZWFuIGlkPSJDaGVja1RoYXRQdXNoUHVsbE1ldEZpbGVFeGlzdHMiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5FeGlzdGFuY2VDaGVja0NvbXBhcmF0b3IiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLnB1c2hwdWxsLm1ldC5maWxlLmV4dH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrcyBpZiB0aGUgcHVzaC1wdWxsIG1ldGFkYXRhIGZpbGUgZXhpc3RzIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iPnRydWU8L3ZhbHVlPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImVxdWFsX3RvIiAvPgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJDaGVja1RoYXREYXRhRmlsZVNpemVJc0dyZWF0ZXJUaGFuWmVybyIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLkZpbGVTaXplQ29tcGFyYXRvciI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrIGlmIHRoZSBjdXJyZW50IGRhdGEgZmlsZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Mb25nIj4wPC92YWx1ZT4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJncmVhdGVyX3RoYW4iIC8+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9IkFwcmlvcmlVbmlxdWVzc0NoZWNrV2l0aEZpbGVtZ3IiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY29tcGFyYXRvci5GaWxlbWdyVW5pcXVlbmVzc0NoZWNrQ29tcGFyYXRvciI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrcyB3aGVyZSB0aGUgY3VycmVudCBkYXRhIGZpbGUgZXhpc3RpbmcgaW4gdGhlIGZpbGVtZ3IgYmFzZWQgb24gaXRzIEZJTEVOQU1FIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIj5mYWxzZTwvdmFsdWU+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZXF1YWxfdG8iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlbWdyVXJsIiB2YWx1ZT0iJHtjcmF3bGVyLmZpbGVtZ3IudXJsfSIgLz4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iQ2hlY2tUaGF0RGF0YUZpbGVJc0NvbXBsZXRlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuRXh0ZXJuUHJlY29uZGl0aW9uQ29tcGFyYXRvciI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkV4ZWN1dGUgZXh0ZXJuYWwgc2NyaXB0IHRvIGNoZWNrIGZvciBmaWxlIGNvbXBsZXRlbmVzcy4iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkxvbmciPjA8L3ZhbHVlPgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImVxdWFsX3RvIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZXhlY3V0ZUNvbW1hbmQiIHZhbHVlPSJjaGVjay1kYXRhLWZpbGUtY29tcGxldGUucGwiIC8+CisJPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jcmF3bGVyLmpwZyBiLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jcmF3bGVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTEwMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLWNyYXdsZXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jcmF3bGVyLnBzZCBiLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jcmF3bGVyLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRlODk5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLWNyYXdsZXIucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXItZXh0ZW5zaW9uLXBvaW50cy5wbmcgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jcmF3bGVyLWV4dGVuc2lvbi1wb2ludHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmEzMTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jcmF3bGVyLWV4dGVuc2lvbi1wb2ludHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXItb2JqZWN0LW1vZGVsLnBuZyBiLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXItb2JqZWN0LW1vZGVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzMzOTRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY3Jhd2xlci1vYmplY3QtbW9kZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXItc3RhdGUtZGlhZ3JhbS5wbmcgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jcmF3bGVyLXN0YXRlLWRpYWdyYW0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTVlM2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jcmF3bGVyLXN0YXRlLWRpYWdyYW0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXItdXNlLWNhc2UtMS5wbmcgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jcmF3bGVyLXVzZS1jYXNlLTEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzA5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jcmF3bGVyLXVzZS1jYXNlLTEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXJfcGhhc2VzLnBuZyBiLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NyYXdsZXJfcGhhc2VzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI1MWVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY3Jhd2xlcl9waGFzZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ4Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iY2FzLWNyYXdsZXIiPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICA8L2xpbmtzPgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJib3R0b20iLz4KKyAgICA8bWVudSBuYW1lPSJTb2Z0d2FyZSBEb2N1bWVudGF0aW9uIj4KKyAgICAgIDxpdGVtIG5hbWU9IlVzZXIgR3VpZGUiIGhyZWY9InVzZXIvIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL3NpdGUveGRvYy91c2VyL2luZGV4LnhtbCBiLzAuMTAvY3Jhd2xlci9zcmMvc2l0ZS94ZG9jL3VzZXIvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL3NpdGUveGRvYy91c2VyL2luZGV4LnhtbApAQCAtMCwwICsxLDQ4NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgICA8cHJvcGVydGllcz4KKyAgICAgIDx0aXRsZT5DQVMgQ3Jhd2xlciBVc2VyIEd1aWRlPC90aXRsZT4KKyAgICAgIDxhdXRob3IgZW1haWw9IkNocmlzLk1hdHRtYW5uQGpwbC5uYXNhLmdvdiI+Q2hyaXMgTWF0dG1hbm48L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAgICA8c2VjdGlvbiBuYW1lPSJVc2VyIEd1aWRlIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgVGhpcyBpcyB0aGUgdXNlciBndWlkZSBmb3IgdGhlIE9PRFQgQ2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2aWNlIChDQVMpIENyYXdsZXIgRnJhbWV3b3JrLCAKKyAgICAgICAgICBvciBDQVMgQ3Jhd2xlciBmb3Igc2hvcnQuIFRoaXMgZ3VpZGUgZXhwbGFpbnMgdGhlIENBUyBDcmF3bGVyIGFyY2hpdGVjdHVyZSAKKyAgICAgICAgICBpbmNsdWRpbmcgaXRzIGV4dGVuc2lvbiBwb2ludHMuIFRoZSBndWlkZSBhbHNvIGRpc2N1c3NlcyBhdmFpbGFibGUgc2VydmljZXMgcHJvdmlkZWQgCisgICAgICAgICAgYnkgdGhlIENBUyBDcmF3bGVyLCBob3cgdG8gdXRpbGl6ZSB0aGVtLCBhbmQgdGhlIGRpZmZlcmVudCBBUElzIHRoYXQgZXhpc3QuIFRoZSBndWlkZSAKKyAgICAgICAgICBjb25jbHVkZXMgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIENBUyBDcmF3bGVyIHVzZSBjYXNlcy4KKyAgICAgICAgPC9wPiAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICAgICA8c2VjdGlvbiBuYW1lPSJBcmNoaXRlY3R1cmUiPgorICAgICAgICA8cD5UaGUgQ0FTIENyYXdsZXIgRnJhbWV3b3JrIHJlcHJlc2VudHMgYW4gZWZmb3J0IHRvIHN0YW5kYXJkaXplIHRoZSBjb21tb24gaW5nZXN0aW9uIGFjdGl2aXRpZXMgCisgICAgICAgIHRoYXQgb2NjdXIgaW4gZGF0YSBhY3F1aXNpdGlvbiBhbmQgYXJjaGl2YWwuIFRoZXNlIHR5cGVzIG9mIGFjdGl2aXRpZXMgcmVndWxhcmx5IGludm9sdmUgaWRlbnRpZmljYXRpb24gCisgICAgICAgIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBjcmF3bCAoYmFzZWQgb24gZS5nLiwgbWltZSB0eXBlLCByZWd1bGFyIGV4cHJlc3Npb25zLCBvciBkaXJlY3QgdXNlciAKKyAgICAgICAgaW5wdXQpLCBzYXRpc2ZhY3Rpb24gb2YgaW5nZXN0aW9uIHByZS1jb25kaXRpb25zIChlLmcuLCB0aGUgY3VycmVudCBjcmF3bGVkIGZpbGUgaGFzIG5vdCBiZWVuIAorICAgICAgICBwcmV2aW91c2x5IGluZ2VzdGVkKSwgZm9sbG93ZWQgYnkgbWV0YWRhdGEgZXh0cmFjdGlvbi4gQWZ0ZXIgbWV0YWRhdGEgZXh0cmFjdGlvbiwgY3Jhd2xlZCBkYXRhIGZvbGxvd3MgCisgICAgICAgIGEgc3RhbmRhcmQgdGhyZWUgc3RhdGUgbGlmZWN5Y2xlOgorICAgICAgICA8L3A+CisgICAgICAgICAgPG9sPgorICAgICAgICAgICA8bGk+cHJlSW5nZXN0aW9uIC0gd2hlcmUgZS5nLiwgYSBmaWxlIG1heSBiZSB1bnppcHBlZCBvciBwcmUtcHJvY2Vzc2VkIHByaW9yIHRvIGluZ2VzdGlvbjs8L2xpPgorICAgICAgICAgICA8bGk+cG9zdEluZ2VzdGlvbiBzdWNjZXNzLCBpbmRpY2F0aW5nIGEgc3VjY2Vzc2Z1bCBpbmdlc3Rpb24gdG8gdGhlIGZpbGUgbWFuYWdlbWVudCBjb21wb25lbnQgaGFzIG9jY3VycmVkIAorICAgICAgICAgICBhbmQgZS5nLiwgdGhlIG9yaWdpbiBkYXRhIGZpbGUgZnJvbSB0aGUgaW5nZXN0IGFyZWEgc2hvdWxkIGJlIGRlbGV0ZWQ7IGFuZDwvbGk+CisgICAgICAgICAgIDxsaT5wb3N0SW5nZXN0aW9uIGZhaWx1cmUsIGluZGljYXRpbmcgdGhhdCBpbmdlc3Rpb24gd2FzIG5vdCBzdWNjZXNzZnVsIGFuZCBzb21lIGNvcnJlY3RpdmUgYWN0aW9uLCAKKyAgICAgICAgICAgZS5nLiwgbW92aW5nIHRoZSBmYWlsZWQgZmlsZSB0byBhIGZhaWx1cmUgYXJlYSBmb3IgbGF0ZXIgZXhhbWluYXRpb24sIHNob3VsZCBvY2N1ci48L2xpPgorICAgICAgICAgIDwvb2w+CisKKyAgICAgICAgICA8cD48aW1nIHNyYz0nLi4vaW1hZ2VzL2NyYXdsZXJfcGhhc2VzLnBuZycgYWx0PSdDcmF3bGVyIFBoYXNlIE1vZGVsJy8+PC9wPgorICAgICAgICAgIDxwPjxpbWcgc3JjPScuLi9pbWFnZXMvY3Jhd2xlci1zdGF0ZS1kaWFncmFtLnBuZycgYWx0PSdEZXRhaWxlZCBDcmF3bGVyIFBoYXNlIE1vZGVsJy8+PC9wPgorICAgICAgICAgIAorICAgICAgICAgPHA+VGhlIGNyaXRpY2FsIG9iamVjdHMgbWFuYWdlZCBieSB0aGUgQ0FTIENyYXdsZXIgZnJhbWV3b3JrIGluY2x1ZGU6PC9wPgorICAgICAgICAKKyAgICAgICAgPHVsPgorICAgICAgICAgPGxpPkNyYXdsZXIgQ29uZmlnIC0gQ29uZmlndXJlcyBhIFByb2R1Y3QgQ3Jhd2xlciwgcHJvdmlkaW5nIHNwZWNpYWxpemVkIG9wdGlvbnMsIHN1Y2ggYXMgc3BlY2lmeWluZworICAgICAgICAgdGhlIENyYXdsZXIgRnJhbWV3b3JrIFVSTCB0byB0YWxrIHRvLCBzcGVjaWZ5aW5nIHRoZSBNZXQgRXh0cmFjdG9yIHRvIGNhbGwgKGluIHRoZSBjYXNlIG9mIHRoZSBNZXQgRXh0cmFjdG9yIFByb2R1Y3QKKyAgICAgICAgIENyYXdsZXIpLCBvciBzcGVjaWZ5aW5nIHNvbWUgcHJvcGVydHkgZm9yIGEgQ3Jhd2xlciBBY3Rpb24uPC9saT4KKyAgICAgICAgIDxsaT5Qcm9kdWN0IENyYXdsZXIgLSBDcmF3bGVycyBjcmF3bCBhIHN0YXJ0aW5nIHByb2R1Y3QgcGF0aCwgbG9va2luZyBmb3IgUHJvZHVjdHMsIHdoaWNoIGFyZSBjb2xsZWN0aW9ucyBvZiAKKyAgICAgICAgIG9uZSBvciBtb3JlIGZpbGVzLCBhbmQgYW4gYXNzb2NpYXRlZCBNZXRhZGF0YSBvYmplY3QuIE1ldGFkYXRhIGNhbiBiZToKKyAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPlByb3ZpZGVkIGFoZWFkIG9mIHRpbWUgLSBpbiB0aGlzIGNhc2UsIHRoZSBQcm9kdWN0IENyYXdsZXIgcmVhZHMgdGhlIE1ldGFkYXRhIGZpbGUsIGxvb2tpbmcgZm9yIDxjb2RlPkZpbGVuYW1lPC9jb2RlPiwgCisgICAgICAgICAgICA8Y29kZT5GaWxlTG9jYXRpb248L2NvZGU+LCBhbmQgPGNvZGU+UHJvZHVjdFR5cGU8L2NvZGU+IG1ldCBrZXlzLiBUaGUgQ3Jhd2xlciBGcmFtZXdvcmsgcHJvdmlkZXMgYSA8Y29kZT5TdGRQcm9kdWN0Q3Jhd2xlcjwvY29kZT4KKyAgICAgICAgICAgIGZvciB0aGlzIHNjZW5hcmlvLjwvbGk+CisgICAgICAgICAgICA8bGk+R2VuZXJhdGVkIG9uIHRoZSBmbHksIHVzaW5nIGEgQ0FTIE1ldCBFeHRyYWN0b3IgLSBpbiB0aGlzIGNhc2UsIHRoZSBQcm9kdWN0IENyYXdsZXIgY2FsbHMgYSBDQVMgTWV0IEV4dHJhY3RvciwgYW5kIGNvbmZpZ3VyZXMKKyAgICAgICAgICAgIGl0IHdpdGggYW4gYXNzb2NpYXRlZCBNZXQgRXh0cmFjdG9yIENvbmZpZyBGaWxlLCBhbmQgdXNlcyB0aGlzIG1lY2hhbmlzbSB0byBvYnRhaW4gdGhlIE1ldGFkYXRhIGZvciBhIFByb2R1Y3QuIEFmdGVyIHRoZSBNZXRhZGF0YSBpcworICAgICAgICAgICAgb2J0YWluZWQsIHRoZSBQcm9kdWN0IENyYXdsZXIgZW5nYWdlcyBpbiB0aGUgc2FtZSBwcm9jZWR1cmUgYXMgZm9yIHRoZSBTdGRQcm9kdWN0Q3Jhd2xlciBjYXNlLiBUaGUgQ3Jhd2xlciBGcmFtZXdvcmsgcHJvdmlkZXMgYQorICAgICAgICAgICAgPGNvZGU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXI8L2NvZGU+IGZvciB0aGlzIHNjZW5hcmlvLjwvbGk+CisgICAgICAgICAgICA8bGk+R2VuZXJhdGVkIG9uIHRoZSBmbHksIHVzaW5nIGEgQ0FTIE1ldCBFeHRyYWN0b3IgZGVmaW5lZCBieSBhIHBhcnRpY3VhbHIgUHJvZHVjdCBtaW1lIHR5cGUsIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBpZGVudGlmaWVyIC0gaW4gdGhpcworICAgICAgICAgICAgY2FzZSwgTWV0IEV4dHJhY3RvcnMgYXJlIGNhbGxlZCBvbiB0aGUgZmx5IHRvIGdlbmVyYXRlIGEgUHJvZHVjdCdzIG1ldGFkYXRhLiBUaGUgTWV0IEV4dHJhY3RvcnMgYXJlIGNhbGxlZCBiYXNlZCBvbiBhIFByb2R1Y3QncyBtaW1lIHR5cGUgYXNzb2NpYXRpb24sIAorICAgICAgICAgICAgb3IgYnkgYSByZWd1bGFyIGV4cHJlc3Npb24gaWRlbnRpZnlpbmcgdGhlIFByb2R1Y3QgZmlsZShzKSdzIHBhdHRlcm4uIFRoZSBDcmF3bGVyIEZyYW1ld29yayBwcm92aWRlcyBhbiA8Y29kZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXI8L2NvZGU+IGZvciB0aGlzCisgICAgICAgICAgICBzY2VuYXJpby48L2xpPgorICAgICAgICAgICA8L3VsPgorICAgICAgICAgPC9saT4KKyAgICAgICAgIDxsaT5BY3Rpb24gLSBDcmF3bGVyIEFjdGlvbnMgYXJlIHRhc2tzIHRoYXQgdGhlIENyYXdsZXIgY2FuIHBlcmZvcm0gdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgdGhyZWUgYWJvdmUgcGhhc2VzLiBFYWNoIEFjdGlvbiBjYW4gYmUgYXNzb2NpYXRlZAorICAgICAgICAgd2l0aCB6ZXJvIG9yIG1vcmUgQ3Jhd2xlciBQaGFzZXMuIEV4YW1wbGVzIG9mIENyYXdsZXIgQWN0aW9ucyBhcmUgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4LjwvbGk+CisgICAgICAgICA8bGk+Q3Jhd2xlciBQaGFzZSAtIENyYXdsZXIgUGhhc2VzIGFyZSBvbmUgb2YgdGhlIHRocmVlIGFmb3JlbWVudGlvbmVkIHBoYXNlcyBvZiB0aGUgQ3Jhd2xlciBsaWZlY3ljbGU6IHByZUluZ2VzdCwgcG9zdEluZ2VzdFN1Y2Nlc3MsIG9yIHBvc3RJbmdlc3RGYWlsdXJlLiBFYWNoCisgICAgICAgICBQaGFzZSBjYW4gaGF2ZSB6ZXJvIG9yIG1vcmUgYXNzb2NpYXRlZCBDcmF3bGVyIEFjdGlvbnMuPC9saT4KKyAgICAgICAgPC91bD4KKworICAgICAgICA8cD5FYWNoIFByb2R1Y3QgQ3Jhd2xlciBpcyBjb25maWd1cmVkIGJ5IGV4YWN0bHkgb25lIENyYXdsZXIgQ29uZmlnLiBFYWNoIFByb2R1Y3QgQ3Jhd2xlciBoYXMgMS4uLiogQ3Jhd2xlciBBY3Rpb25zCisgICAgICAgIHdoaWNoIGFyZSBlYWNoIGFzc29jaWF0ZWQgd2l0aCAxLi4uKiBDcmF3bGVyIFBoYXNlcy4gRWFjaCBQcm9kdWN0IENyYXdsZXIgY3Jhd2xzIDEuLi4qIFByb2R1Y3RzLCB3aGljaCBhcmUgZWFjaCBhc3NvY2lhdGVkCisgICAgICAgIHdpdGggZXhhY3RseSAxIE1ldGFkYXRhIG9iamVjdC4gVGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgc2hvd24gaW4gdGhlIGJlbG93IGZpZ3VyZS48L3A+CisgICAgICAgIAorICAgICAgICA8cD48aW1nIHNyYz0iLi4vaW1hZ2VzL2NyYXdsZXItb2JqZWN0LW1vZGVsLnBuZyIgYWx0PSJDcmF3bGVyIE9iamVjdCBNb2RlbCIvPjwvcD4KKyAgICAgIAorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJFeHRlbnNpb24gUG9pbnRzIj4KKyAgICAgICAgICA8cD4KKyAgICAgICAgICBUaGVyZSBhcmUgc2V2ZXJhbCBleHRlbnNpb24gcG9pbnRzIGZvciB0aGUgQ3Jhd2xlciBGcmFtZXdvcmsuIEFuIGV4dGVuc2lvbiBwb2ludCBpcyBhbiBpbnRlcmZhY2UgCisgICAgICAgICAgd2l0aGluIHRoZSBjcmF3bGVyIGZyYW1ld29yayB0aGF0IGNhbiBoYXZlIG1hbnkgaW1wbGVtZW50YXRpb25zLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiAKKyAgICAgICAgICBpdCBjb21lcyB0byBzb2Z0d2FyZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBiZWNhdXNlIGl0IGFsbG93cyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIGFuIAorICAgICAgICAgIGV4aXN0aW5nIGludGVyZmFjZSB0byBiZSBzZWxlY3RlZCBhdCBkZXBsb3ltZW50IHRpbWUuIFNvLCB0aGUgY3Jhd2xlciBmcmFtZXdvcmsgbWF5IAorICAgICAgICAgIGxldmVyYWdlIGEgcHJlSW5nZXN0IGFjdGlvbiB0aGF0IGNoZWNrcyBhZ2FpbnN0IGEgQ3Jhd2xlciBGcmFtZXdvcmsgQ2F0YWxvZyB0byBkZXRlcm1pbmUgaWYgYSBQcm9kdWN0IGhhcworICAgICAgICAgIGFscmVhZHkgYmVlbiBpbmdlc3RlZCwgb3IgdGhlIGNyYXdsZXIgbWF5IGNob29zZSBhIHByZUluZ2VzdCBhY3Rpb24gdGhhdCBwZXJmb3JtcyBhbiBNRDUgY2hlY2tzdW0KKyAgICAgICAgICBvbiB0aGUgUHJvZHVjdCBiZWZvcmUgaW5nZXN0aW5nLiBUaGUgc2VsZWN0aW9uIG9mIHRoZSBhY3R1YWwgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucyBpcyBoYW5kbGVkIAorICAgICAgICAgIGVudGlyZWx5IGJ5IHRoZSBleHRlbnNpb24gcG9pbnQgbWVjaGFuaXNtLiBVc2luZyBleHRlbnNpb24gcG9pbnRzLCBpdCBpcyBmYWlybHkgc2ltcGxlIHRvIHN1cHBvcnQgbWFueSAKKyAgICAgICAgICBkaWZmZXJlbnQgdHlwZXMgb2Ygd2hhdCBhcmUgdHlwaWNhbGx5IHJlZmVycmVkIHRvIGFzICZxdW90O3BsdWctaW4gYXJjaGl0ZWN0dXJlcyZxdW90OyBFYWNoIG9mIHRoZSBjb3JlIAorICAgICAgICAgIGV4dGVuc2lvbiBwb2ludHMgZm9yIHRoZSBDcmF3bGVyIEZyYW1ld29yayBpcyBkZXNjcmliZWQgYmVsb3c6PC9wPgorICAgICAgICAgIAorICAgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPkNyYXdsZXIgRGFlbW9uPC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBDcmF3bGVyIERhZW1vbiBleHRlbnNpb24gcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIHBlcmlvZGljYWxseSAoYXMgZGVmaW5lZCBieSB0aGUgVXNlcikgCisgICAgICAgICAgICAgIGV4ZWN1dGluZyBhIHBhcnRpY3VsYXIgUHJvZHVjdENyYXdsZXIsIGFzIHdlbGwgYXMgcHJvdmlkaW5nIHN0YXRpc3RpY3Mgb24gY3Jhd2xzIChudW1iZXIgb2YgY3Jhd2xzLAorICAgICAgICAgICAgICBhdmVyYWdlIGNyYXdsIHRpbWUsIGV0Yy4pLgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPlByb2R1Y3QgQ3Jhd2xlcjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgUHJvZHVjdCBDcmF3bGVyIGV4dGVuc2lvbiBwb2ludCBpcyByZXNwb25zaWJsZSBmb3IgZGVmaW5pbmcgdGhlIG1ldGhvZCBpbiB3aGljaCBDcmF3bGVyCisgICAgICAgICAgICAgIFByZWNvbmRpdGlvbnMgYXJlIGNoZWNrZWQgYmVmb3JlIGluZ2VzdGlvbiwgZm9yIG1hbmFnaW5nIHRoZSAzLXBoYXNlIGluZ2VzdGlvbiBwcm9jZXNzLCBhbmQgZm9yIGRpY3RhdGluZworICAgICAgICAgICAgICB0aGUgbWV0aG9kIGJ5IHdoaWNoIE1ldGFkYXRhIGlzIG9idGFpbmVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZHVjdC4gSW4gYWRkaXRpb24sIHRoZSBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgYWxzbyBzcGVjaWZpZXMgaG93IFByb2R1Y3QgZmlsZXMgYXJlIGNyYXdsZWQgb24gZGlzay4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5NaW1lIFR5cGUgRXh0cmFjdG9yIFJlcG9zaXRvcnk8L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIE1pbWUgVHlwZSBFeHRyYWN0b3IgUmVwb3NpdG9yeSBpcyBhbiBleHRlbnNpb24gcG9pbnQgdGhhdCBzcGVjaWZpZXMgaG93CisgICAgICAgICAgICAgIE1ldCBFeHRyYWN0b3JzIGFyZSBhc3NvY2lhdGVkIHdpdGggbWltZSB0eXBlcyByZWxhdGVkIHRvIGEgUHJvZHVjdCBmaWxlIGJlaW5nIGluZ2VzdGVkLiAKKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5DcmF3bGVyIEFjdGlvbiBSZXBvc2l0b3J5PC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBDcmF3bGVyIEFjdGlvbiBSZXBvc2l0b3J5IGlzIGEgaG9tZSBmb3IgYWxsIENyYXdsZXIgQWN0aW9ucywgbWFwcGluZyBlYWNoIEFjdGlvbgorICAgICAgICAgICAgICB0byBhIGxpZmVjeWNsZSBwaGFzZSAocHJlSW5nZXN0LCBwb3N0SW5nZXN0U3VjY2Vzcywgb3IgcG9zdEluZ2VzdEZhaWx1cmUpLgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5QcmVjb25kaXRpb24gQ29tcGFyYXRvcjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgUHJlY29uZGl0aW9uIENvbXBhcmF0b3IgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgcHJlY29uZGl0aW9ucworICAgICAgICAgICAgICB0aGF0IG11c3QgYmUgc2F0aXNmaWVkIGJlZm9yZSBtZXRhZGF0YSBpcyBleHRyYWN0ZWQgZm9yIGEgcGFydGljdWxhciBjcmF3bGVkIFByb2R1Y3QsIGFuZCB1bHRpbWF0ZWx5CisgICAgICAgICAgICAgIHdoaWNoIG11c3QgYmUgc2F0aXNmaWVkIGJlZm9yZSBpbmdlc3Rpb24uCisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPk1ldCBFeHRyYWN0b3IsIE1ldCBFeHRyYWN0b3IgQ29uZmlnLCBNZXQgRXh0cmFjdG9yIENvbmZpZyBSZWFkZXI8L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIENyYXdsZXIgRnJhbWV3b3JrIGxldmVyYWdlcyBDQVMgTWV0YWRhdGEncyBNZXQgRXh0cmFjdG9yLCBNZXQgRXh0cmFjdG9yIENvbmZpZywgYW5kCisgICAgICAgICAgICAgIE1ldCBFeHRyYWN0b3IgQ29uZmlnIFJlYWRlciBleHRlbnNpb24gcG9pbnQuIEVhY2ggTWV0IEV4dHJhY3RvciBpcyBwcm92aWRlZCBhIE1ldCBFeHRyYWN0b3IgQ29uZmlnCisgICAgICAgICAgICAgIGZpbGUsIHdoaWNoIGlzIHJlYWQgYnkgYW4gYXNzb2NpYXRlZCBNZXQgRXh0cmFjdG9yIENvbmZpZyBSZWFkZXIsIGFsbG93aW5nIGEgVXNlciB0byBlbnRpcmVseSBjdXN0b21pemUKKyAgICAgICAgICAgICAgaG93IE1ldGFkYXRhIGlzIGV4dHJhY3RlZCBmb3IgYSBwYXJ0aWN1bGFyIFByb2R1Y3QgZmlsZS4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+ICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgCisgICAgICAgICAgPHA+VGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgZXh0ZW5zaW9uIHBvaW50cyBmb3IgdGhlIENyYXdsZXIgRnJhbWV3b3JrIGFyZSBzaG93biBpbiB0aGUgYmVsb3cKKyAgICAgICAgICBmaWd1cmUuCisgICAgICAgICAgPC9wPgorICAgICAgICAgIAorICAgICAgICAgIDxwPjxpbWcgd2lkdGg9JzYwMCcgc3JjPSIuLi9pbWFnZXMvY3Jhd2xlci1leHRlbnNpb24tcG9pbnRzLnBuZyIgYWx0PSJDcmF3bGVyIEV4dGVuc2lvbiBQb2ludHMiLz48L3A+CisgICAgICAgIAorICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IktleSBDYXBhYmlsaXRpZXMiPgorICAgICAgICA8cD5UaGUgQ3Jhd2xlciBGcmFtZXdvcmsgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgbmVjZXNzYXJ5IGtleSBjYXBhYmlsaXRpZXMgZm9yIG1hbnVhbGx5IAorICAgICAgICBhbmQgYXV0b21hdGljYWxseSBpbmdlc3RpbmcgZmlsZXMgYW5kIG1ldGFkYXRhLiBFYWNoIGhpZ2ggbGV2ZWwgY2FwYWJpbGl0eSBwcm92aWRlZCBieSB0aGUgCisgICAgICAgIENyYXdsZXIgRnJhbWV3b3JrIGlzIGRldGFpbGVkIGJlbG93OjwvcD4KKyAgICAgICAgCisgICAgICAgIDxvbD4KKyAgICAgICAgICA8bGk+QXV0b21hdGljIGFuZCBtYW51YWwgaW5nZXN0aW5nIG9mIFByb2R1Y3RzIC0gVGhlIENyYXdsZXIgRnJhbWV3b3JrIGNhbiBlYXNpbHkgYmUgY29uZmlndXJlZAorICAgICAgICAgIGFzIGEgRGFlbW9uIHByb2Nlc3MgdGhhdCBwZXJpb2RpY2FsbHkgY3Jhd2xzIGEgc3RhcnRpbmcgZGlyZWN0b3J5IGZvciBQcm9kdWN0cywgb3IgYXMgYSAKKyAgICAgICAgICBzdGFuZGFsb25lIHByb2dyYW0sIHBlcmZvcm1pbmcgaW5nZXN0aW9uIGFuZCB0aGVuIHRlcm1pbmF0aW5nLgorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPkNvbW1hbmQtbGluZSBpbnRlcmZhY2UsIGFzIHdlbGwgYXMgQVBJcyAtIFRoZSBDcmF3bGVyIEZyYW1ld29yayBjYW4gYmUgY2FsbGVkIGZyb20gYSBzaW1wbGUKKyAgICAgICAgICBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLCBhbGxvd2luZyBHTlUtc3R5bGUgb3B0aW9ucyB0byBjb25maWd1cmUgYSBjcmF3bGVyLCBhbmQgc3RhcnQgaW5nZXN0aW5nLiBJbgorICAgICAgICAgIGFkZGl0aW9uLCB0aGUgQ3Jhd2xlciBhbHNvIHByb3ZpZGVzIEphdmEtYmFzZWQgQVBJcyB0aGF0IGFsbG93cyBhIHVzZXIgdG8gaW50ZWdyYXRlIGNyYXdsaW5nIGludG8KKyAgICAgICAgICBoZXIgSmF2YSBhcHBsaWNhdGlvbiB3aXRoIGVhc2UuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+Q29uZmlndXJhYmxlIEFjdGlvbnMsIGFuZCBBY3Rpb24gRXh0ZW5zaWJpbGl0eSBNZWNoYW5pc20gLSBUaGUgQ3Jhd2xlciBGcmFtZXdvcmsgc2hpcHMgd2l0aCBhIHNldAorICAgICAgICAgIG9mIHByZWRlZmluZWQgYWN0aW9ucyBvdXQgb2YgdGhlIGJveCAoZGVsZXRlIGRhdGEgZmlsZSwgYWZ0ZXIgcG9zdEluZ2VzdFN1Y2Nlc3MsIGRlbGV0ZSBtZXQgZmlsZSwgYWZ0ZXIKKyAgICAgICAgICB0aGUgc2FtZSwgY2hlY2sgb24gcHJlIGluZ2VzdCBmb3IgcHJvZHVjdCB1bmlxdWVuZXNzLCBldGMuKSB0aGF0IHByb3ZpZGUgYW4gZXhjZWxsZW50IHN0YXJ0aW5nIHBvaW50IGZvcgorICAgICAgICAgIGxldmVyYWdpbmcgdGhlIENyYXdsZXIgRnJhbWV3b3JrIGluIGEgdXNlcidzIGFwcGxpY2F0aW9uLiBJZiBtb3JlIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQsIGEKKyAgICAgICAgICB1c2VyIGhhcyB0aGUgYWJpbGl0eSB0byB3cml0ZSBoZXIgb3duIENyYXdsZXIgQWN0aW9uIGJ5IGltcGxlbWVudGluZyB0aGUgQ3Jhd2xlciBBY3Rpb24gaW50ZXJmYWNlLjwvbGk+ICAgIAorICAgICAgICAgIDxsaT5Db25maWd1cmFibGUgYW5kIGV4dGVuc2libGUgUHJlY29uZGl0aW9ucyBmb3IgTWV0IEV4dHJhY3Rpb24gLSBNdWNoIGxpa2UgQ3Jhd2xlciBBY3Rpb25zLCBQcmVjb25kaXRpb25zCisgICAgICAgICAgYWxsb3cgYSB1c2VyIHRvIGN1c3RvbWl6ZSB0aGUgQ3Jhd2xlciBGcmFtZXdvcmssIHNwZWNpZnlpbmcgaWYsIGhvdywgYW5kIHdoZW4sIE1ldCBFeHRyYWN0b3JzIHNob3VsZCBiZSBjYWxsZWQKKyAgICAgICAgICBieSBhIENyYXdsZXIgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIGFuIHVuZGVybHlpbmcgUHJvZHVjdC4KKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5TdXBwb3J0IGZvciBhIHdpZGUgdmFyaWV0eSBvZiBQcm9kdWN0IGZpbGUgaWRlbnRpZmljYXRpb24gbWVjaGFuaXNtcyAtIFRoZSBDcmF3bGVyIEZyYW1ld29yayBwcm92aWRlcyB0aHJlZQorICAgICAgICAgIGRpZmZlcmVudCBjcmF3bGVycyBvdXQgb2YgdGhlIGJveCB0aGF0IGVuZm9yY2UgYSBwYXJ0aWN1bGFyIFByb2R1Y3QgZmlsZSBpZGVudGlmaWNhdGlvbiBzdHJhdGVneSwgZS5nLiwgU3RkUHJvZHVjdENyYXdsZXIKKyAgICAgICAgICBsb29rcyBmb3IgTWV0YWRhdGEgZmlsZXMsIE1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyIGdlbmVyYXRlcyBNZXRhZGF0YSBmaWxlcyBvbiB0aGUgZmx5LCBhbmQgQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyCisgICAgICAgICAgdXNlcyBtaW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGZpbGUgcmVndWxhciBleHByZXNzaW9ucyB0byBpZGVudGlmeSBQcm91Y3QgZmlsZXMgdG8gY3Jhd2wuIElmIG1vcmUgY3VzdG9taXplZCBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgaXMgcmVxdWlyZWQsIHRoZSB1c2VyIGNhbiBleHRlbmQgb25lIG9mIHRoZXNlIGV4aXN0aW5nIFByb2R1Y3RDcmF3bGVycywgb3Igd3JpdGUgYW4gZW50aXJlbHkgbmV3IGNyYXdsZXIuPC9saT4KKyAgICAgICAgICA8bGk+QWJpbGl0eSB0byBwbHVnIGluIE1ldCBFeHRyYWN0aW9uIHJ1bGVzIC0gQSB1c2VyIGNhbiBsZXZlcmFnZSBhIGN1c3RvbSBkZXZlbG9wZWQgTWV0IEV4dHJhY3RvciB0byBnZW5lcmF0ZSBQcm9kdWN0IG1ldGFkYXRhCisgICAgICAgICAgdXNlZCBieSB0aGUgY3Jhd2xlciBkdXJpbmcgdGhlIGluZ2VzdGlvbiBwcm9jZXNzLiBNZXQgRXh0cmFjdG9ycyBhcmUgZWFzaWx5IHBsdWdnZWQgaW4gdXNpbmcgSmF2YSdzIGNsYXNzIGxvYWRpbmcgbWVjaGFuaXNtCisgICAgICAgICAgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgPGEgaHJlZj0iLi4vLi4vbWV0YWRhdGEvIj5DQVMgTWV0YWRhdGEgRnJhbWV3b3JrPC9hPi48L2xpPgorICAgICAgICAgIDxsaT5Db21tdW5pY2F0aW9uIG92ZXIgbGlnaHR3ZWlnaHQsIHN0YW5kYXJkIHByb3RvY29scyDigJMgVGhlIENyYXdsZXIgRnJhbWV3b3JrIHVzZXMgWE1MLVJQQywgYXMgaXRzIG1haW4gCisgICAgICAgICAgZXh0ZXJuYWwgaW50ZXJmYWNlLCB3aGVuIHRoZSBDcmF3bGVyIHJ1bnMgaW4gRGFlbW9uIG1vZGUuIFhNTC1SUEMsIHRoZSBsaXR0bGUgYnJvdGhlciBvZiBTT0FQLCBpcyAKKyAgICAgICAgICBmYXN0LCBleHRlbnNpYmxlLCBhbmQgdXNlcyB0aGUgdW5kZXJseWluZyBIVFRQIHByb3RvY29sIGZvciBkYXRhIHRyYW5zZmVyLjwvbGk+CisgICAgICAgICA8L29sPgorICAgICAgICAgIAorICAgICAgICAgIDxwPlRoaXMgY2FwYWJpbGl0eSBzZXQgaXMgbm90IGV4aGF1c3RpdmUsIGFuZCBpcyBtZWFudCB0byBnaXZlIHRoZSB1c2VyIGEgJnF1b3Q7ZmVlbCZxdW90OyBmb3Igd2hhdCAKKyAgICAgICAgICBnZW5lcmFsIGZlYXR1cmVzIGFyZSBwcm92aWRlZCBieSB0aGUgQ3Jhd2xlciBGcmFtZXdvcmsuIE1vc3QgbGlrZWx5IHRoZSB1c2VyIHdpbGwgZmluZCB0aGF0IHRoZSAKKyAgICAgICAgICBDcmF3bGVyIEZyYW1ld29yayBwcm92aWRlcyBtYW55IG90aGVyIGNhcGFiaWxpdGllcyBiZXNpZGVzIHRob3NlIGRlc2NyaWJlZCBoZXJlLjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDdXJyZW50IEV4dGVuc2lvbiBQb2ludCBJbXBsZW1lbnRhdGlvbnMiPgorICAgICAgICAKKyAgICAgICAgIDxwPlRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgb2YgdGhlIGFmb3JlbWVudGlvbmVkIGV4dGVuc2lvbiBwb2ludHMgZm9yIAorICAgICAgICAgQ3Jhd2xlciBGcmFtZXdvcmsuIEVhY2ggZXhpc3RpbmcgZXh0ZW5zaW9uIHBvaW50IGltcGxlbWVudGF0aW9uIGlzIGRldGFpbGVkIGJlbG93OjwvcD4KKworICAgICAgICAgPHVsPgorICAgICAgICAgICA8bGk+PGI+Q3Jhd2xlciBBY3Rpb25zPC9iPjxici8+CisgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgPGxpPkRlbGV0ZSBGaWxlIOKAkyBkZWxldGVzIGFuIG9yaWdpbiBkYXRhIGZpbGUgZnJvbSBpdHMgbG9jYXRpb24gaW4gdGhlIHN0YWdpbmcgYXJlYS4gVGllZCB0bworICAgICAgICAgICAgIHRoZSBwb3N0SW5nZXN0U3VjY2VzcyBzdGFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5GaWxlbWdyVW5pcXVlbmVzc0NoZWNrZXIgLSBDaGVja3Mgd2l0aCB0aGUgQ3Jhd2xlciBGcmFtZXdvcmsgYWZ0ZXIgTWV0YWRhdGEgZXh0cmFjdGlvbiBoYXMgb2NjdXJlZCBhbmQKKyAgICAgICAgICAgICBkZXRlcm1pbmVzIGlmIHRoZSBwcm9kdWN0IGhhcyBiZWVuIGluZ2VzdGVkIGludG8gdGhlIENyYXdsZXIgRnJhbWV3b3JrLiBUaWVkIHRvIHRoZSBwcmVJbmdlc3Qgc3RhZ2UuPC9saT4KKyAgICAgICAgICAgICA8bGk+TWltZVR5cGVDcmF3bGVyQWN0aW9uIC0gQ2FsbHMgYSBzcGVjaWZpZWQgQ3Jhd2xlciBBY3Rpb24gaXMgdGhlIFByb2R1Y3QgbWF0Y2hlcyBhIHNwZWNpZmllZCBsaXN0IG9mCisgICAgICAgICAgICAgbWltZS10eXBlcy4gVGllZCB0byB0aGUgcHJlSW5nZXN0IHN0YWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPldvcmtmbG93TWdyU3RhdHVzVXBkYXRlIC0gTm90aWZpZXMgdGhlIFdvcmtmbG93IE1hbmFnZXIgdGhhdCBhIGZpbGUgaGFzIGJlZW4gaW5nZXN0ZWQgaW50byB0aGUgRmlsZQorICAgICAgICAgICAgIE1hbmFnZXIgc3VjY2Vzc2Z1bGx5LiBUaWVkIHRvIHRoZSBwb3N0SW5nZXN0U3VjY2VzcyBzdGFnZS48L2xpPgorICAgICAgICAgICA8L29sPgorICAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8bGk+PGI+Q3Jhd2xlciBQcmVjb25kaXRpb24gQ29tcGFyYXRvcnM8L2I+PGJyLz4KKyAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICA8bGk+RmlsZW1nclVuaXF1bmVzc0NoZWNrQ29tcGFyYXRvciAtIERldGVybWluZXMsIGJlZm9yZSBNZXRhZGF0YSBleHRyYWN0aW9uIGhhcyBvY2N1cmVkLCB3aGV0aGVyIG9yIG5vdAorICAgICAgICAgICAgICAgYSBQcm9kdWN0IGhhcyBiZWVuIGluZ2VzdGVkIGludG8gdGhlIENyYXdsZXIgRnJhbWV3b3JrLgorICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8bGk+PGI+Q3Jhd2xlciBEYWVtb25zIChDb250cm9sbGVyIGFuZCBEYWVtb24pPC9iPjxici8+CisgICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgPGxpPlhNTC1SUEMg4oCTIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBDcmF3bCBEYWVtb24gQ29udHJvbGxlciBhbmQgdGhlIENyYXdsZXIgRGFlbW9uIGxldmVyYWdlCisgICAgICAgICAgICAgICBYTUwtUlBDLCB0aGUgbGl0dGxlIGJyb3RoZXIgb2YgU09BUCwgYXMgdGhlaXIgbW9kZSBvZiBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICA8L2xpPiAgCQorICAgICAgICAgICA8L3VsPiAgCisgICAgICAgIAorICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyYXRpb24gYW5kIEluc3RhbGxhdGlvbiI+CisgICAgICAgPHA+CisgICAgICAgVG8gaW5zdGFsbCB0aGUgQ3Jhd2xlciBGcmFtZXdvcmssIHlvdSBuZWVkIHRvIGRvd25sb2FkIGEgcmVsZWFzZQorICAgICAgIG9mIHRoZSBzb2Z0d2FyZSwgYXZhaWxhYmxlIGZyb20gaXRzIGhvbWUgd2ViIHNpdGUuIEZvciBibGVlZGluZy1lZGdlIGZlYXR1cmVzLCB5b3UgY2FuCisgICAgICAgYWxzbyBjaGVjayBvdXQgdGhlIGNhcy1jcmF3bGVyIHRydW5rIHByb2plY3QgZnJvbSB0aGUgQXBhY2hlIE9PRFQgc3VidmVyc2lvbiByZXBvc2l0b3J5LiBZb3UgY2FuIGJyb3dzZSAKKyAgICAgICB0aGUgcmVwb3NpdG9yeSB1c2luZyBWaWV3Q1ZTLCBsb2NhdGVkIGF0OjwvcD4KKyAgICAgICAKKyAgICAgICA8c2NyZWVuPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC88L3NjcmVlbj4KKyAgICAgICAKKyAgICAgICA8cD5UaGUgYWN0dWFsIHdlYiB1cmwgZm9yIHRoZSByZXBvc2l0b3J5IGlzIGxvY2F0ZWQgYXQ6PC9wPgorICAgICAgIAorICAgICAgIDxzY3JlZW4+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdDwvc2NyZWVuPgorCisgICAgICAgPHA+VG8gY2hlY2sgb3V0IHRoZSBDcmF3bGVyIEZyYW1ld29yaywgdXNlIHlvdXIgZmF2b3JpdGUgU3VidmVyc2lvbiBjbGllbnQuPC9wPgorICAgICAgCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJQcm9qZWN0IE9yZ2FuaXphdGlvbiI+CisgICAgICAgIDxwPgorICAgICAgIFRoZSBjYXMtY3Jhd2xlciBwcm9qZWN0IGZvbGxvd3MgdGhlIHRyYWRpdGlvbmFsIFN1YnZlcnNpb24tc3R5bGUgPGNvZGU+dHJ1bms8L2NvZGU+LCA8Y29kZT50YWc8L2NvZGU+CisgICAgICAgYW5kIDxjb2RlPmJyYW5jaGVzPC9jb2RlPiBmb3JtYXQuIFRydW5rIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXRlc3QgYW5kIGdyZWF0ZXN0IGRldmVsb3BtZW50IG9uIHRoZQorICAgICAgIGNhcy1jcmF3bGVyLiBUYWdzIGFyZSBvZmZpY2lhbCByZWxlYXNlIHZlcnNpb25zIG9mIHRoZSBwcm9qZWN0LiBCcmFuY2hlcyBjb3JyZXNwb25kIHRvIGRldmlhdGlvbnMgCisgICAgICAgZnJvbSB0aGUgdHJ1bmsgbGFyZ2UgZW5vdWdoIHRvIHdhcnJhbnQgYSBzZXBhcmF0ZSBkZXZlbG9wbWVudCB0cmVlLiA8L3A+CisKKyAgICAgICA8cD5Gb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgdGhlIFVzZXIgR3VpZGUsIHdlJ2xsIGFzc3VtZSB5b3UgYWxyZWFkeSBoYXZlIGRvd25sb2FkZWQgYSBidWlsdCByZWxlYXNlCisgICAgICAgb2YgdGhlIENyYXdsZXIgRnJhbWV3b3JrLCBmcm9tIGl0cyB3ZWIgc2l0ZS4gSWYgeW91IHdlcmUgYnVpbGRpbmcgY2FzLWNyYXdsZXIgZnJvbSB0aGUgdHJ1bmssIGEgdGFnZ2VkIHJlbGVhc2UgCisgICAgICAgKG9yIGJyYW5jaCkgdGhlIHByb2Nlc3Mgd291bGQgYmUgcXVpdGUgc2ltaWxhci4gVG8gYnVpbGQgY2FzLWNyYXdsZXIsIHlvdSB3b3VsZCBuZWVkIHRoZSBBcGFjaGUgTWF2ZW4gCisgICAgICAgc29mdHdhcmUuIE1hdmVuIGlzIGFuIFhNTC1iYXNlZCwgcHJvamVjdCBtYW5hZ2VtZW50IHN5c3RlbSBzaW1pbGFyIHRvIEFwYWNoZSBBbnQsIGJ1dCB3aXRoIG1hbnkgZXh0cmEgCisgICAgICAgYmVsbHMgYW5kIHdoaXN0bGVzLiBNYXZlbiBtYWtlcyBjcm9zcy1wbGF0Zm9ybSBwcm9qZWN0IGRldmVsb3BtZW50IGEgc25hcC4gWW91IGNhbiBkb3dubG9hZCBNYXZlbiBmcm9tOgorCisgICAgICAgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmciPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLzwvYT4KKworICAgICAgIEFsbCBjYXMtY3Jhd2xlciByZWxlYXNlcyBwb3N0IDEueC4wIGFyZSBub3cgPGI+TWF2ZW4gMiBjb21wYXRpYmxlPC9iPi4gVGhpcyBpcyA8Yj52ZXJ5PC9iPiBpbXBvcnRhbnQuIAorICAgICAgIFRoYXQgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBhbnkgY2FzLWNyYXdsZXIgcmVsZWFzZSA+IDEueC4wLCB5b3Ugd2lsbCBuZWVkIE1hdmVuIDIgdG8gY29tcGlsZSB0aGUgc29mdHdhcmUsIAorICAgICAgIGFuZCBNYXZlbiAxIHdpbGwgbm8gbG9uZ2VyIHdvcmsuPC9wPgorICAgICAgIAorICAgICAgIDxwPkZvbGxvdyB0aGUgcHJvY2VkdXJlcyBpbiB0aGUgYmVsb3cgU2VjdGlvbnMgdG8gYnVpbGQgYSBmcmVzaCBjb3B5IG9mIHRoZSBDcmF3bGVyIEZyYW1ld29yay4gVGhlc2UgcHJvY2VkdXJlcworICAgICAgIGFyZSBzcGVjaWZpY2FsbHkgdGFyZ2V0ZWQgb24gdXNpbmcgTWF2ZW4gMiB0byBidWlsZCB0aGUgc29mdHdhcmU6IAorICAgICAgICA8L3A+ICAgICAgCisgICAgICAKKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIAorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGRpbmcgdGhlIENyYXdsZXIgRnJhbWV3b3JrIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgPG9sPgorICAgICAgICAgICAgPGxpPmNkIHRvIGNhcy1jcmF3bGVyLCBhbmQgdGhlbiB0eXBlOgorICAgICAgICAgICA8c291cmNlPiMgbXZuIHBhY2thZ2U8L3NvdXJjZT4KKyAgICAgICAgICAgVGhpcyB3aWxsIHBlcmZvcm0gc2V2ZXJhbCB0YXNrcywgaW5jbHVkaW5nIGNvbXBpbGluZyB0aGUgc291cmNlIGNvZGUsIGRvd25sb2FkaW5nIAorICAgICAgICAgICByZXF1aXJlZCBqYXIgZmlsZXMsIHJ1bm5pbmcgdW5pdCB0ZXN0cywgYW5kIHNvIG9uLiBXaGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcywgY2QgCisgICAgICAgICAgIHRvIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+IGRpcmVjdG9yeSB3aXRoaW4gY2FzLWNyYXdsZXIuIFRoaXMgd2lsbCBjb250YWluIHRoZSBidWlsZCBvZiB0aGUgCisgICAgICAgICAgIENyYXdsZXIgRnJhbWV3b3JrIGNvbXBvbmVudCwgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorICAgICAgICAgICAKKyAgICAgICAgICAgPHNvdXJjZT4KKyAgICAgICAgICAgIGNhcy1jcmF3bGVyLSR7dmVyc2lvbn0tZGlzdC50YXIuZ3oKKyAgICAgICAgICAgPC9zb3VyY2U+CisgICAgICAgICAgIAorICAgICAgICAgICBUaGlzIGlzIGEgZGlzdHJpYnV0aW9uIHRhciBiYWxsLCB0aGF0IHlvdSB3b3VsZCBjb3B5IHRvIGEgZGVwbG95bWVudCBkaXJlY3RvcnksIHN1Y2ggYXMKKyAgICAgICAgICAgPGNvZGU+L3Vzci9sb2NhbC88L2NvZGU+LCBhbmQgdGhlbiB1bnBhY2sgdXNpbmcgPGNvZGU+IyB0YXIgeHZ6ZiA8L2NvZGU+LiBUaGUgcmVzdWx0YW50IGRpcmVjdG9yeSAKKyAgICAgICAgICAgbGF5b3V0IGZyb20gdGhlIHVucGFja2VkIHRhcmJhbGwgaXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgCisgICAgICAgICAgIDxzb3VyY2U+CisgICAgICAgICAgICBiaW4vIGV0Yy8gbG9ncy8gZG9jLyBsaWIvIHBvbGljeS8gTElDRU5TRS50eHQgQ0hBTkdFUy50eHQKKyAgICAgICAgICAgPC9zb3VyY2U+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaT5iaW4gLSBjb250YWlucyB0aGUgJnF1b3Q7Y3Jhd2xlcl9sYXVuY2hlciZxdW90OyBzZXJ2ZXIgc2NyaXB0LCBhbmQgdGhlICZxdW90O2NyYXdsY3RsJnF1b3Q7IGNsaWVudCBzY3JpcHQuPC9saT4KKyAgICAgICAgICAgICAgPGxpPmV0YyAtIGNvbnRhaW5zIHRoZSBsb2dnaW5nLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIENyYXdsZXIgRnJhbWV3b3JrLjwvbGk+CisgICAgICAgICAgICAgIDxsaT5sb2dzIC0gdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBsb2cgZmlsZXMgdG8gYmUgd3JpdHRlbiB0by48L2xpPgorICAgICAgICAgICAgICA8bGk+ZG9jIC0gY29udGFpbnMgSmF2YWRvYyBkb2N1bWVudGF0aW9uLCBhbmQgdXNlciBndWlkZXMgZm9yIHVzaW5nIHRoZSBwYXJ0aWN1bGFyIENBUyBjb21wb25lbnQuPC9saT4KKyAgICAgICAgICAgICAgPGxpPmxpYiAtIHRoZSByZXF1aXJlZCBKYXZhIGphciBmaWxlcyB0byBydW4gdGhlIENyYXdsZXIgRnJhbWV3b3JrLjwvbGk+CisgICAgICAgICAgICAgIDxsaT5wb2xpY3kg4oCTIHRoZSBkZWZhdWx0IFNwcmluZy1YTUwgYmFzZWQgY29uZmlndXJhdGlvbiBmb3IgQ3Jhd2xlciBBY3Rpb25zLCBQcmVjb25kaXRpb25zLCBDb21tYW5kIExpbmUgb3B0aW9ucywgYW5kIENyYXdsZXJzLjwvbGk+CisgICAgICAgICAgICAgIDxsaT5DSEFOR0VTLnR4dCAtIGNvbnRhaW5zIHRoZSBDSEFOR0VTIHByZXNlbnQgaW4gdGhpcyByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBDQVMgY29tcG9uZW50LjwvbGk+CisgICAgICAgICAgICAgIDxsaT5MSUNFTlNFLnR4dCAtIHRoZSBMSUNFTlNFIGZvciB0aGUgQ0FTIENyYXdsZXIgRnJhbWV3b3JrIHByb2plY3QuPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgIDwvb2w+ICAgICAgICAKKyAgICAgICAgPC9wPgorICAgICAgCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEZXBsb3lpbmcgdGhlIENyYXdsZXIgRnJhbWV3b3JrIj4KKyAgICAgIDxwPlRvIGRlcGxveSB0aGUgQ3Jhd2xlciBGcmFtZXdvcmssIHlvdSdsbCBuZWVkIHRvIGNyZWF0ZSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBUeXBpY2FsbHkgdGhpcyAKKyAgICAgIHdvdWxkIGJlIHNvbWV3aGVyZSBpbiAvdXNyL2xvY2FsIChvbiAqbml4IHN0eWxlIHN5c3RlbXMpLCBvciBDOlxQcm9ncmFtIEZpbGVzXCAob24gd2luZG93cyAKKyAgICAgIHN0eWxlIHN5c3RlbXMpLiBXZSdsbCBhc3N1bWUgdGhhdCB5b3UncmUgaW5zdGFsbGluZyBvbiBhICpuaXggc3R5bGUgc3lzdGVtIHRob3VnaCB0aGUgV2luZG93cyAKKyAgICAgIGluc3RydWN0aW9ucyBhcmUgcXVpdGUgc2ltaWxhci48L3A+CisKKyAgICAgIDxwPkZvbGxvdyB0aGUgcHJvY2VzcyBiZWxvdyB0byBkZXBsb3kgdGhlIENyYXdsZXIgRnJhbWV3b3JrOjwvcD4KKworICAgICAgICA8b2w+CisgICAgICAgICA8bGk+Q29weSB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiB0byB0aGUgZGVwbG95bWVudCBkaXJlY3RvcnkKKyAgICAgICAgIDxzb3VyY2U+IyBjcCAtUiBjYXMtY3Jhd2xlci90cnVuay90YXJnZXQvY2FzLWNyYXdsZXItJHt2ZXJzaW9ufS1kaXN0LnRhci5neiAvdXNyL2xvY2FsLzwvc291cmNlPgorICAgICAgICAgPC9saT4KKyAgICAgICAgIDxsaT5VbnRhciB0aGUgZGlzdHJpYnV0aW9uCisgICAgICAgICA8c291cmNlPiMgY2QgL3Vzci9sb2NhbCA7IHRhciB4dnpmIGNhcy1jcmF3bGVyLSR7dmVyc2lvbn0tZGlzdC50YXIuZ3o8L3NvdXJjZT4KKyAgICAgICAgIDwvbGk+CisgICAgICAgICA8bGk+U2V0IHVwIGEgc3ltbGluaworICAgICAgICAgPHNvdXJjZT4jIGxuIC1zIC91c3IvbG9jYWwvY2FzLWNyYXdsZXItJHt2ZXJzaW9ufSAvdXNyL2xvY2FsL2NyYXdsZXI8L3NvdXJjZT4KKyAgICAgICAgIDwvbGk+CisgICAgICAgICA8bGk+U2V0IHlvdXIgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gb2YgeW91ciAKKyAgICAgICAgIGluc3RhbGxlZCBKUkUgcnVudGltZS4KKyAgICAgICAgIDwvbGk+CisgICAgICAgPC9vbD4KKyAgIAorICAgICA8cD5PdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHBvc3NpYmxlOiBjaGVjayB0aGUgPGEgaHJlZj0iLi4vYXBpZG9jcyI+QVBJIGRvY3VtZW50YXRpb248L2E+LCAKKyAgICAgYXMgd2VsbCBhcyB0aGUgY29tbWVudHMgd2l0aGluIHRoZSBYTUwgZmlsZXMgaW4gdGhlIHBvbGljeSBkaXJlY3RvcnkgdG8gZmluZCBvdXQgdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyYWJsZSAKKyAgICAgcHJvcGVydGllcyBmb3IgdGhlIGV4dGVuc2lvbiBwb2ludHMgeW91IGNob29zZS4gQSBmdWxsIGxpc3Rpbmcgb2YgYWxsIHRoZSBleHRlbnNpb24gcG9pbnQgZmFjdG9yeSAKKyAgICAgY2xhc3MgbmFtZXMgYXJlIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeC4gQWZ0ZXIgc3RlcCA0LCB5b3UgYXJlIG9mZmljaWFsbHkgZG9uZSBjb25maWd1cmluZyB0aGUgQ3Jhd2xlcgorICAgICBGcmFtZXdvcmsgZm9yIGRlcGxveW1lbnQuPC9wPiAgIAorICAgICAgCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJSdW5uaW5nIHRoZSBDcmF3bGVyIEZyYW1ld29yayI+CisgICAgICA8cD5UbyBydW4gdGhlIGNyYXdsZXJfbGF1bmNoZXIsIGNkIHRvIDxjb2RlPi91c3IvbG9jYWwvY3Jhd2xlci9iaW48L2NvZGU+IGFuZCB0eXBlOjwvcD4KKworICAgICAgPHNvdXJjZT4jIC4vY3Jhd2xlcl9sYXVuY2hlciAtaDwvc291cmNlPgorCisgICAgICA8cD5UaGlzIHdpbGwgcHJpbnQgdGhlIGhlbHAgb3B0aW9ucyBmb3IgdGhlIENyYXdsZXIgbGF1bmNoZXIgc2NyaXB0LiBZb3VyIENyYXdsZXIgRnJhbWV3b3JrIAorICAgICAgaXMgbm93IHJlYWR5IHRvIHJ1biEgWW91IGNhbiB0ZXN0IG91dCB0aGUgQ3Jhd2xlciBGcmFtZXdvcmsgYnkgcnVubmluZyBhIHNpbXBsZSBpbmdlc3QgCisgICAgICBjb21tYW5kIHNob3duIGJlbG93LiBCZSBzdXJlIHRoYXQgYSBzZXBhcmF0ZSBGaWxlIE1hbmFnZXIgaW5zdGFuY2UgaXMgdXAgYW5kIHJ1bm5pbmcgb24gdGhlIGRlZmF1bHQKKyAgICAgIHBvcnQgb2YgOTAwMCwgcnVubmluZyBvbiBsb2NhbGhvc3QsIGJlZm9yZSBzdGFydGluZyB0aGlzIHRlc3QgY29tbWFuZCAoc2VlIHRoZSAKKyAgICAgIDxhIGhyZWY9Ii4uLy4uL2ZpbGVtZ3IvdXNlci8iPkZpbGUgTWFuYWdlciBVc2VyIEd1aWRlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisgICAgICAKKyAgICAgIEZpcnN0IGNyZWF0ZSBhIHNpbXBsZSB0ZXh0IGZpbGUgY2FsbGVkICZxdW90O2JsYWgudHh0JnF1b3Q7IGFuZCBwbGFjZSBpdCBpbnNpZGUgYSB0ZXN0IGRpcmVjdG9yeSwgZS5nLiwgPGNvZGU+L2RhdGEvdGVzdDwvY29kZT4uIFRoZW4sIGNyZWF0ZSBhIGRlZmF1bHQgCisgICAgICBtZXRhZGF0YSBmaWxlIGZvciB0aGUgcHJvZHVjdCwgdXNpbmcgdGhlIHNjaGVtYSBvciBEVEQKKyAgICAgIHByb3ZpZGVkIGluIHRoZSBjYXMtbWV0YWRhdGEgcHJvamVjdC4gQW4gZXhhbXBsZSBYTUwgZmlsZSBtaWdodCBiZTo8L3A+CisgICAgICAKKyAgICAgIDwhLS0gRklYTUU6IGNoYW5nZSBuYW1lc3BhY2UgVVJJPyAtLT4KKyAgICAgIDxzb3VyY2U+CisgICAgICAgICZsdDtjYXM6bWV0YWRhdGEgeG1sbnM6Y2FzPSZxdW90O2h0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzJnF1b3Q7Jmd0OworICAgICAgICAgJmx0O2tleXZhbCZndDsKKyAgICAgICAgICAgJmx0O2tleSZndDtGaWxlbmFtZSZsdDsva2V5Jmd0OworICAgICAgICAgICAmbHQ7dmFsJmd0O2JsYWgudHh0Jmx0Oy92YWwmZ3Q7CisgICAgICAgICAmbHQ7L2tleXZhbCZndDsKKyAgICAgICAgICZsdDtrZXl2YWwmZ3Q7CisgICAgICAgICAgICZsdDtrZXkmZ3Q7RmlsZUxvY2F0aW9uJmx0Oy9rZXkmZ3Q7CisgICAgICAgICAgICZsdDt2YWwmZ3Q7L2RhdGEvdGVzdCZsdDsvdmFsJmd0OworICAgICAgICAgJmx0Oy9rZXl2YWwmZ3Q7ICAgICAgICAgCisgICAgICAgICAmbHQ7a2V5dmFsJmd0OworICAgICAgICAgICAmbHQ7a2V5Jmd0O1Byb2R1Y3RUeXBlJmx0Oy9rZXkmZ3Q7CisgICAgICAgICAgICZsdDt2YWwmZ3Q7R2VuZXJpY0ZpbGUmbHQ7L3ZhbCZndDsKKyAgICAgICAgICZsdDsva2V5dmFsJmd0OyAgIAorICAgICAgICAmbHQ7L2NhczptZXRhZGF0YSZndDsKKyAgICAgIDwvc291cmNlPgorICAgICAgCisgICAgICA8cD5DYWxsIHRoaXMgbWV0YWRhdGEgZmlsZSA8Y29kZT5ibGFoLnR4dC5tZXQ8L2NvZGU+LCBhbmQgcGxhY2UgaXQgYWxzbyBpbiA8Y29kZT4vZGF0YS90ZXN0PC9jb2RlPi4gCisgICAgICBUaGVuLCBydW4gdGhlIGJlbG93IGNvbW1hbmQsIGFzc3VtaW5nIHRoYXQgeW91IHN0YXJ0ZWQgYSBGaWxlIE1hbmFnZXIgb24gbG9jYWxob3N0IG9uIHRoZSBkZWZhdWx0IHBvcnQgb2YgPGNvZGU+OTAwMDwvY29kZT46PC9wPgorCisgICAgICA8c291cmNlPiMgLi9jcmF3bGVyX2xhdW5jaGVyIFwKKyAgICAgICAgICAgICAgIC0tY3Jhd2xlcklkIFN0ZFByb2R1Y3RDcmF3bGVyIFwKKyAgICAgICAgICAgICAgIC0tcHJvZHVjdFBhdGggL2RhdGEvdGVzdCBcCisgICAgICAgICAgICAgICAtLWZpbGVtZ3JVcmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwLyBcCisgICAgICAgICAgICAgICAtLWZhaWx1cmVEaXIgL3RtcCBcCisgICAgICAgICAgICAgICAtLWFjdGlvbklkcyBEZWxldGVEYXRhRmlsZSBNb3ZlRGF0YUZpbGVUb0ZhaWx1cmVEaXIgVW5pcXVlIFwKKyAgICAgICAgICAgICAgIC0tbWV0RmlsZUV4dGVuc2lvbiBtZXQgXAorICAgICAgICAgICAgICAgLS1jbGllbnRUcmFuc2ZlcmVyIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5CisgICAgICA8L3NvdXJjZT4KKworICAgICAgPHA+WW91IHNob3VsZCBzZWUgYSByZXNwb25zZSBtZXNzYWdlIGF0IHRoZSBlbmQgc2ltaWxhciB0bzo8L3A+CisKKyAgICAgIDxzb3VyY2U+CisgICAgICBsb2c0ajpXQVJOIE5vIGFwcGVuZGVycyBjb3VsZCBiZSBmb3VuZCBmb3IgbG9nZ2VyIChvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0KS4KKyAgICAgIGxvZzRqOldBUk4gUGxlYXNlIGluaXRpYWxpemUgdGhlIGxvZzRqIHN5c3RlbSBwcm9wZXJseS4KKyAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMC8KKyAgICAgIFN0ZFByb2R1Y3RDcmF3bGVyCisgICAgICBKdW4gMzAsIDIwMDkgODoyNjo1NyBBTSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLlByb2R1Y3RDcmF3bGVyIGNyYXdsCisgICAgICBJTkZPOiBDcmF3bGluZyAvZGF0YS90ZXN0CisgICAgICBKdW4gMzAsIDIwMDkgODoyNjo1NyBBTSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLlByb2R1Y3RDcmF3bGVyIGhhbmRsZUZpbGUKKyAgICAgIElORk86IEhhbmRsaW5nIGZpbGUgL2RhdGEvdGVzdC9ibGFoLnR4dAorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLk1ldFJlYWRlckV4dHJhY3RvciBleHRyTWV0YWRhdGEKKyAgICAgIElORk86IFJlYWRpbmcgbWV0YWRhdGEgZnJvbSAvZGF0YS90ZXN0L2JsYWgudHh0Lm1ldAorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5Qcm9kdWN0Q3Jhd2xlciBpbmdlc3QKKyAgICAgIElORk86IFByb2R1Y3RDcmF3bGVyOiBSZWFkeSB0byBpbmdlc3QgcHJvZHVjdDogWy9kYXRhL3Rlc3QvYmxhaC50eHRdOiBQcm9kdWN0VHlwZTogW0dlbmVyaWNGaWxlXQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlciBzZXRGaWxlTWFuYWdlcgorICAgICAgSU5GTzogU3RkSW5nZXN0ZXI6IGNvbm5lY3RlZCB0byBmaWxlIG1hbmFnZXI6IFtodHRwOi8vbG9jYWxob3N0OjkwMDAvXQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlcmVyIHNldEZpbGVNYW5hZ2VyVXJsCisgICAgICBJTkZPOiBMb2NhbCBEYXRhIFRyYW5zZmVyIHRvOiBbaHR0cDovL2xvY2FsaG9zdDo5MDAwL10gZW5hYmxlZAorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlciBpbmdlc3QKKyAgICAgIElORk86IFN0ZEluZ2VzdGVyOiBpbmdlc3RpbmcgcHJvZHVjdDogUHJvZHVjdE5hbWU6IFtibGFoLnR4dF06IFByb2R1Y3RUeXBlOiBbR2VuZXJpY0ZpbGVdOiBGaWxlTG9jYXRpb246IFsvZGF0YS90ZXN0L10KKyAgICAgIEp1biAzMCwgMjAwOSA4OjI2OjU3IEFNIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLlZlcnNpb25pbmdVdGlscyBjcmVhdGVCYXNpY0RhdGFTdG9yZVJlZnNGbGF0CisgICAgICBGSU5FOiBWZXJzaW9uaW5nVXRpbHM6IEdlbmVyYXRlZCBkYXRhIHN0b3JlIHJlZjogZmlsZTovVXNlcnMvbWF0dG1hbm4vZmlsZXMvYmxhaC50eHQvYmxhaC50eHQgZnJvbSBvcmlnUmVmOiBmaWxlOi9kYXRhL3Rlc3QvYmxhaC50eHQKKyAgICAgIEp1biAzMCwgMjAwOSA4OjI2OjU3IEFNIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXIgcnVuRXh0cmFjdG9ycworICAgICAgSU5GTzogUnVubmluZyBNZXQgRXh0cmFjdG9yOiBbb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3Rvcl0gZm9yIHByb2R1Y3QgdHlwZTogW0dlbmVyaWNGaWxlXQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlciBydW5FeHRyYWN0b3JzCisgICAgICBJTkZPOiBSdW5uaW5nIE1ldCBFeHRyYWN0b3I6IFtvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlcy5NaW1lVHlwZUV4dHJhY3Rvcl0gZm9yIHByb2R1Y3QgdHlwZTogW0dlbmVyaWNGaWxlXQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZyB0b0RvYworICAgICAgV0FSTklORzogTm8gTWV0YWRhdGEgc3BlY2lmaWVkIGZvciBwcm9kdWN0IFtibGFoLnR4dF0gZm9yIHJlcXVpcmVkIGZpZWxkIFtEYXRhVmVyc2lvbl06IEF0dGVtcHRpbmcgdG8gY29udGludWUgcHJvY2Vzc2luZyBtZXRhZGF0YQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudCBpbmdlc3RQcm9kdWN0CisgICAgICBGSU5FU1Q6IEZpbGUgTWFuYWdlciBDbGllbnQ6IGNsaWVudFRyYW5zZmVyIGVuYWJsZWQ6IHRyYW5zZmVyaW5nIHByb2R1Y3QgW2JsYWgudHh0XQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlcmVyIG1vdmVGaWxlCisgICAgICBJTkZPOiBMb2NhbERhdGFUcmFuc2ZlcjogTW92aW5nIEZpbGU6IGZpbGU6L2RhdGEvdGVzdC9ibGFoLnR4dCB0byBmaWxlOi9Vc2Vycy9tYXR0bWFubi9maWxlcy9ibGFoLnR4dC9ibGFoLnR4dAorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZyB0b0RvYworICAgICAgV0FSTklORzogTm8gTWV0YWRhdGEgc3BlY2lmaWVkIGZvciBwcm9kdWN0IFtibGFoLnR4dF0gZm9yIHJlcXVpcmVkIGZpZWxkIFtEYXRhVmVyc2lvbl06IEF0dGVtcHRpbmcgdG8gY29udGludWUgcHJvY2Vzc2luZyBtZXRhZGF0YQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5Qcm9kdWN0Q3Jhd2xlciBpbmdlc3QKKyAgICAgIElORk86IFN1Y2Nlc3NmdWxseSBpbmdlc3RlZCBwcm9kdWN0OiBbL2RhdGEvdGVzdC9ibGFoLnR4dF06IHByb2R1Y3QgaWQ6IDcyZGI0YmJhLTY1OGEtMTFkZS1iZWRiLTc3ZjJkNzUyYzQzNgorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5Qcm9kdWN0Q3Jhd2xlciBoYW5kbGVGaWxlCisgICAgICBJTkZPOiBTdWNjZXNzZnVsIGluZ2VzdCBvZiBwcm9kdWN0OiBbL2RhdGEvdGVzdC9ibGFoLnR4dF0KKyAgICAgIEp1biAzMCwgMjAwOSA4OjI2OjU3IEFNIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuUHJvZHVjdENyYXdsZXIgcGVyZm9ybVByb2R1Y3RDcmF3bGVyQWN0aW9ucworICAgICAgSU5GTzogUGVyZm9ybWluZyBhY3Rpb24gKGlkID0gRGVsZXRlRGF0YUZpbGUgOiBkZXNjcmlwdGlvbiA9IERlbGV0ZXMgdGhlIGN1cnJlbnQgZGF0YSBmaWxlKQorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRGVsZXRlRmlsZSBwZXJmb3JtQWN0aW9uCisgICAgICBJTkZPOiBEZWxldGluZyBmaWxlIC9kYXRhL3Rlc3QvYmxhaC50eHQKKyAgICAgIEp1biAzMCwgMjAwOSA4OjI2OjU3IEFNIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuUHJvZHVjdENyYXdsZXIgaGFuZGxlRmlsZQorICAgICAgSU5GTzogSGFuZGxpbmcgZmlsZSAvZGF0YS90ZXN0L2JsYWgudHh0Lm1ldAorICAgICAgSnVuIDMwLCAyMDA5IDg6MjY6NTcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5Qcm9kdWN0Q3Jhd2xlciBoYW5kbGVGaWxlCisgICAgICBXQVJOSU5HOiBGYWlsZWQgdG8gcGFzcyBwcmVjb25kaXRpb25zIGZvciBpbmdlc3Qgb2YgcHJvZHVjdDogWy9kYXRhL3Rlc3QvYmxhaC50eHQubWV0XQorICAgICAgPC9zb3VyY2U+CisKKyAgICA8cD53aGljaCBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgaW5zdGFsbGVkIG9rYXkhPC9wPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlVzZSBDYXNlcyI+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoZSBDcmF3bGVyIEZyYW1ld29yayB3YXMgYnVpbHQgdG8gc3VwcG9ydCBzZXZlcmFsIG9mIHRoZSBhYm92ZSBjYXBhYmlsaXRpZXMgb3V0bGluZWQgaW4gCisgICAgICAgICAgU2VjdGlvbiAzLiBJbiBwYXJ0aWN1bGFyIHRoZXJlIHdlcmUgc2V2ZXJhbCB1c2UgY2FzZXMgdGhhdCB3ZSB3YW50ZWQgdG8gc3VwcG9ydCwgc29tZSAKKyAgICAgICAgICBvZiB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93LiAgICAgICAgCisgICAgICAgIDwvcD4KKyAgICAgIAorICAgICAgICAgPHA+PGltZyB3aWR0aD0nNjAwJyBzcmM9Ii4uL2ltYWdlcy9jcmF3bGVyLXVzZS1jYXNlLTEucG5nIiBhbHQ9IkNyYXdsZXIgRnJhbWV3b3JrIEluZ2VzdCBVc2UgQ2FzZSIvPjwvcD4KKyAgICAgICAgIAorICAgICAgICAgPHA+VGhlIG51bWJlcnMgaW4gdGhlIGFib3ZlIEZpZ3VyZSBjb3JyZXNwb25kIHRvIGEgc2VxdWVuY2Ugb2Ygc3RlcHMgdGhhdCBvY2N1cnMgYW5kIGEgCisgICAgICAgICBzZXJpZXMgb2YgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIGRpZmZlcmVudCBDcmF3bGVyIEZyYW1ld29yayBleHRlbnNpb24gcG9pbnRzIGluIG9yZGVyIHRvIAorICAgICAgICAgcGVyZm9ybSB0aGUgZmlsZSBpbmdlc3Rpb24gYWN0aXZpdHkuIEluIFN0ZXAgMSwgdGhlIENyYXdsZXIgRGFlbW9uIGRldGVybWluZXMgaWYgdGhlIFByb2R1Y3QgCisgICAgICAgICBmaWxlIGluIHRoZSBzdGFnaW5nIGFyZWEgbWF0Y2hlcyBhIHNwZWNpZmllZCBGaWxlIEZpbHRlciByZWd1bGFyIGV4cHJlc3Npb24uIEluIHN0ZXAgMiwgaWYgdGhlCisgICAgICAgICBQcm9kdWN0IGZpbGUgZG9lcyBtYXRjaCB0aGUgZGVzaXJlZCBmaWx0ZXIsIHRoZSBDcmF3bGVyIERhZW1vbiBjaGVja3Mgd2l0aCB0aGUgRmlsZSBNYW5hZ2VyIAorICAgICAgICAgKHVzaW5nIHRoZSBJbmdlc3RlcikgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBQcm9kdWN0IGZpbGUgaGFzIGJlZW4gaW5nZXN0ZWQuIEluIHN0ZXAgMywKKyAgICAgICAgIGFzc3VtaW5nIHRoYXQgdGhlIFByb2R1Y3QgZmlsZSBoYXMgPGI+bm90PC9iPiBiZWVuIGluZ2VzdGVkLCB0aGVuIHRoZSBDcmF3bGVyIERhZW1vbiBpbmdlc3RzCisgICAgICAgICB0aGUgUHJvZHVjdCBmaWxlIGludG8gdGhlIEZpbGUgTWFuYWdlciB1c2luZyB0aGUgSW5nZXN0ZXIgaW50ZXJmYWNlLiBEdXJpbmcgdGhlIGluZ2VzdGlvbiwgCisgICAgICAgICBNZXRhZGF0YSBpcyBmaXJzdCBleHRyYWN0ZWQgKGluIHN1Yi1zdGVwIDEpIGFuZCB0aGVuIHRoZSBGaWxlIE1hbmFnZXIgY2xpZW50IGludGVyZmFjZSBpcyAKKyAgICAgICAgIHVzZWQgKGluIHN1Yi1zdGVwIDIpIHRvIGluZ2VzdCBpbnRvIHRoZSBGaWxlIE1hbmFnZXIuIER1cmluZyBpbmdlc3Rpb24sIHRoZSBGaWxlIE1hbmFnZXIgaXMKKyAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBtb3ZpbmcgdGhlIFByb2R1Y3QgZmlsZShzKSBpbnRvIGNvbnRyb2xsZWQgYWNjZXNzLXN0b3JhZ2UgYW5kIGNhdGFsb2dpbmcgdGhlCisgICAgICAgICBwcm92aWRlZCBQcm9kdWN0IG1ldGFkYXRhLjwvcD4KKyAgICAgICAgIAorICAgICAgPC9zZWN0aW9uPgorICAgICAgPHNlY3Rpb24gbmFtZT0iQXBwZW5kaXgiPgorICAgICAgIDxwPgorICAgICAgICAgRnVsbCBsaXN0IG9mIENyYXdsZXIgRnJhbWV3b3JrIGV4dGVuc2lvbiBwb2ludCBjbGFzc2VzIGFuZCB0aGVpciBhc3NvY2lhdGVkIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIAorICAgICAgICAgU3ByaW5nIEJlYW4gWE1MIGZpbGVzOiAgICAgICAKKyAgICAgICA8L3A+CisgICAgCisgICAgICAgPHRhYmxlPgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+YWN0aW9uczwvdGQ+CisgICAgICAgICAgIDx0ZD5vcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5EZWxldGVGaWxlPGJyLz4KKyAgICAgICAgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tlcjxici8+CisgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5NaW1lVHlwZUNyYXdsZXJBY3Rpb248YnIvPgorICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGU8YnIvPgorICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uV29ya2Zsb3dNZ3JTdGF0dXNVcGRhdGUKKyAgICAgICAgICAgPC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5wcmVjb25kaXRpb25zPC90ZD4KKyAgICAgICAgICAgPHRkPm9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY29tcGFyYXRvci5GaWxlbWdyVW5pcXVlbmVzc0NoZWNrQ29tcGFyYXRvcgorICAgICAgICAgICA8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICA8L3RhYmxlPgorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICA8L2JvZHk+CisgICAKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS8wLjEwL2NyYXdsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL1N0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9TdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBmZjYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9TdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2w7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiB7QGxpbmsgUHJvZHVjdENyYXdsZXJ9IHVzZWQgZm9yIHRlc3RpbmcgdGhlIGFwcHJvcHJpYXRlZCBzdGF0ZXMgYXJlCisgKiBlbnRlcmVkIGZvciBlYWNoIHBhcnQgb2YgdGhlIGNyYXdsZXIncyB3b3JrZmxvdy4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFN0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlciBleHRlbmRzIFByb2R1Y3RDcmF3bGVyeworCisgICBwcml2YXRlIGJvb2xlYW4gcGFzc1ByZWNvbmRpdGlvbnMgPSB0cnVlOworICAgcHJpdmF0ZSBib29sZWFuIHBhc3NFeHRyYWN0aW9uID0gdHJ1ZTsKKyAgIHByaXZhdGUgYm9vbGVhbiBwYXNzUmVuYW1pbmcgPSB0cnVlOworICAgcHJpdmF0ZSBib29sZWFuIHBhc3NSZXF1aXJlZE1ldGFkYXRhID0gdHJ1ZTsKKyAgIHByaXZhdGUgYm9vbGVhbiBwYXNzUHJlSW5nZXN0QWN0aW9ucyA9IHRydWU7CisgICBwcml2YXRlIGJvb2xlYW4gcGFzc0luZ2VzdCA9IHRydWU7CisKKyAgIHByaXZhdGUgYm9vbGVhbiByYW5QcmVjb25kaXRpb25zID0gZmFsc2U7CisgICBwcml2YXRlIGJvb2xlYW4gcmFuRXh0cmFjdGlvbiA9IGZhbHNlOworICAgcHJpdmF0ZSBib29sZWFuIHJhblJlbmFtaW5nID0gZmFsc2U7CisgICBwcml2YXRlIGJvb2xlYW4gcmFuUmVxdWlyZWRNZXRhZGF0YSA9IGZhbHNlOworICAgcHJpdmF0ZSBib29sZWFuIHJhblByZUluZ2VzdEFjdGlvbnMgPSBmYWxzZTsKKyAgIHByaXZhdGUgYm9vbGVhbiByYW5Jbmdlc3QgPSBmYWxzZTsKKyAgIHByaXZhdGUgYm9vbGVhbiByYW5Qb3N0SW5nZXN0U3VjY2Vzc0FjdGlvbnMgPSBmYWxzZTsKKyAgIHByaXZhdGUgYm9vbGVhbiByYW5Qb3N0SW5nZXN0RmFpbEFjdGlvbnMgPSBmYWxzZTsKKworICAgcHVibGljIHZvaWQgbWFya0ZhaWxQcmVjb25kaXRpb25zKCkgeworICAgICAgcGFzc1ByZWNvbmRpdGlvbnMgPSBmYWxzZTsKKyAgIH0KKyAgIAorICAgcHVibGljIHZvaWQgbWFya0ZhaWxFeHRyYWN0aW9uKCkgeworICAgICAgcGFzc0V4dHJhY3Rpb24gPSBmYWxzZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgbWFya0ZhaWxSZW5hbWluZygpIHsKKyAgICAgIHBhc3NSZW5hbWluZyA9IGZhbHNlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBtYXJrRmFpbFJlcXVpcmVkTWV0YWRhdGEoKSB7CisgICAgICBwYXNzUmVxdWlyZWRNZXRhZGF0YSA9IGZhbHNlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBtYXJrRmFpbFByZUluZ2VzdEFjdGlvbnMoKSB7CisgICAgICBwYXNzUHJlSW5nZXN0QWN0aW9ucyA9IGZhbHNlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBtYXJrU2tpcEluZ2VzdCgpIHsKKyAgICAgIHRoaXMuc2V0U2tpcEluZ2VzdCh0cnVlKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgbWFya0ZhaWxJbmdlc3QoKSB7CisgICAgICBwYXNzSW5nZXN0ID0gZmFsc2U7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHJhblByZWNvbmRpdGlvbnMoKSB7CisgICAgICByZXR1cm4gcmFuUHJlY29uZGl0aW9uczsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gcmFuRXh0cmFjdGlvbigpIHsKKyAgICAgIHJldHVybiByYW5FeHRyYWN0aW9uOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiByYW5SZW5hbWluZygpIHsKKyAgICAgIHJldHVybiByYW5SZW5hbWluZzsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gcmFuUmVxdWlyZWRNZXRhZGF0YSgpIHsKKyAgICAgIHJldHVybiByYW5SZXF1aXJlZE1ldGFkYXRhOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiByYW5QcmVJbmdlc3RBY3Rpb25zKCkgeworICAgICAgcmV0dXJuIHJhblByZUluZ2VzdEFjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHJhbkluZ2VzdCgpIHsKKyAgICAgIHJldHVybiByYW5Jbmdlc3Q7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHJhblBvc3RJbmdlc3RTdWNjZXNzQWN0aW9ucygpIHsKKyAgICAgIHJldHVybiByYW5Qb3N0SW5nZXN0U3VjY2Vzc0FjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHJhblBvc3RJbmdlc3RGYWlsQWN0aW9ucygpIHsKKyAgICAgIHJldHVybiByYW5Qb3N0SW5nZXN0RmFpbEFjdGlvbnM7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFzc2VzUHJlY29uZGl0aW9ucyhGaWxlIHApIHsKKyAgICAgIHJhblByZWNvbmRpdGlvbnMgPSB0cnVlOworICAgICAgcmV0dXJuIHBhc3NQcmVjb25kaXRpb25zOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHByb3RlY3RlZCBNZXRhZGF0YSBnZXRNZXRhZGF0YUZvclByb2R1Y3QoRmlsZSBwKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICByYW5FeHRyYWN0aW9uID0gdHJ1ZTsKKyAgICAgIGlmIChwYXNzRXh0cmFjdGlvbikgeworICAgICAgICAgcmV0dXJuIG5ldyBNZXRhZGF0YSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCBFeHRyYWN0aW9uIik7CisgICAgICB9CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHJvdGVjdGVkIEZpbGUgcmVuYW1lUHJvZHVjdChGaWxlIHAsIE1ldGFkYXRhIG0pCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJhblJlbmFtaW5nID0gdHJ1ZTsKKyAgICAgIGlmIChwYXNzUmVuYW1pbmcpIHsKKyAgICAgICAgIHJldHVybiBwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCBSZW5hbWluZyIpOworICAgICAgfQorICAgfQorICAgCisgICBAT3ZlcnJpZGUKKyAgIGJvb2xlYW4gY29udGFpbnNSZXF1aXJlZE1ldGFkYXRhKE1ldGFkYXRhIG0pIHsKKyAgICAgIHJhblJlcXVpcmVkTWV0YWRhdGEgPSB0cnVlOworICAgICAgcmV0dXJuIHBhc3NSZXF1aXJlZE1ldGFkYXRhOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIGJvb2xlYW4gcGVyZm9ybVByZUluZ2VzdEFjdGlvbnMoRmlsZSBwLCBNZXRhZGF0YSBtKSB7CisgICAgICByYW5QcmVJbmdlc3RBY3Rpb25zID0gdHJ1ZTsKKyAgICAgIHJldHVybiBwYXNzUHJlSW5nZXN0QWN0aW9uczsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBib29sZWFuIGluZ2VzdChGaWxlIHAsIE1ldGFkYXRhIG0pIHsKKyAgICAgIHJhbkluZ2VzdCA9IHRydWU7CisgICAgICByZXR1cm4gcGFzc0luZ2VzdDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBib29sZWFuIHBlcmZvcm1Qb3N0SW5nZXN0T25TdWNjZXNzQWN0aW9ucyhGaWxlIHAsIE1ldGFkYXRhIG0pIHsKKyAgICAgIHJhblBvc3RJbmdlc3RTdWNjZXNzQWN0aW9ucyA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBib29sZWFuIHBlcmZvcm1Qb3N0SW5nZXN0T25GYWlsQWN0aW9ucyhGaWxlIHAsIE1ldGFkYXRhIG0pIHsKKyAgICAgIHJhblBvc3RJbmdlc3RGYWlsQWN0aW9ucyA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvVGVzdFByb2R1Y3RDcmF3bGVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL1Rlc3RQcm9kdWN0Q3Jhd2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYWNlZjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2NyYXdsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL1Rlc3RQcm9kdWN0Q3Jhd2xlci5qYXZhCkBAIC0wLDAgKzEsNjI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bDsKKworLy9FYXN5TW9jayBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlTW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdExhc3RDYWxsOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkNyYXdsZXJBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uQ3Jhd2xlckFjdGlvblJlcG87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5zdGF0dXMuSW5nZXN0U3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RydWN0cy5leGNlcHRpb25zLkNyYXdsZXJBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5Jbmdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Jbmdlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBQcm9kdWN0Q3Jhd2xlcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UHJvZHVjdENyYXdsZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkFXTEVSX0NPTkZJRyA9CisgICAgICAic3JjL21haW4vcmVzb3VyY2VzL2NyYXdsZXItY29uZmlnLnhtbCI7CisKKyAgIC8vIENhc2UxOgorICAgLy8gIC0gUHJlY29uZGl0aW9uczogZmFpbAorICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZpbGVDYXNlMSgpIHsKKyAgICAgIEZpbGUgcCA9IG5ldyBGaWxlKCIvdG1wL2RhdGEuZGF0Iik7CisKKyAgICAgIC8vIFNldHVwIENyYXdsZXIuCisgICAgICBTdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIgcGMgPSBuZXcgU3RhdGVBd2FyZVByb2R1Y3RDcmF3bGVyKCk7CisgICAgICBwYy5tYXJrRmFpbFByZWNvbmRpdGlvbnMoKTsKKworICAgICAgLy8gUnVuIENyYXdsZXIuCisgICAgICBJbmdlc3RTdGF0dXMgc3RhdHVzID0gcGMuaGFuZGxlRmlsZShwKTsKKworICAgICAgLy8gVmVyaWZ5IEluZ2VzdFN0YXR1cy4KKyAgICAgIGFzc2VydEVxdWFscyhJbmdlc3RTdGF0dXMuUmVzdWx0LlBSRUNPTkRTX0ZBSUxFRCwgc3RhdHVzLmdldFJlc3VsdCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwLCBzdGF0dXMuZ2V0UHJvZHVjdCgpKTsKKworICAgICAgLy8gVmVyaWZ5IGNvcnJlY3QgbWV0aG9kcyB3ZXJlIHJ1bi4gCisgICAgICBhc3NlcnRUcnVlKHBjLnJhblByZWNvbmRpdGlvbnMoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5FeHRyYWN0aW9uKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUmVuYW1pbmcoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5SZXF1aXJlZE1ldGFkYXRhKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUHJlSW5nZXN0QWN0aW9ucygpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhbkluZ2VzdCgpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhblBvc3RJbmdlc3RTdWNjZXNzQWN0aW9ucygpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhblBvc3RJbmdlc3RGYWlsQWN0aW9ucygpKTsKKyAgIH0KKworICAgLy8gQ2FzZTI6CisgICAvLyAgLSBQcmVjb25kaXRpb25zOiBwYXNzCisgICAvLyAgLSBGYWlsRXh0cmFjdGlvbjogZmFpbAorICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZpbGVDYXNlMigpIHsKKyAgICAgIEZpbGUgcCA9IG5ldyBGaWxlKCIvdG1wL2RhdGEuZGF0Iik7CisKKyAgICAgIC8vIFNldHVwIENyYXdsZXIuCisgICAgICBTdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIgcGMgPSBuZXcgU3RhdGVBd2FyZVByb2R1Y3RDcmF3bGVyKCk7CisgICAgICBwYy5tYXJrRmFpbEV4dHJhY3Rpb24oKTsKKworICAgICAgLy8gUnVuIENyYXdsZXIuCisgICAgICBJbmdlc3RTdGF0dXMgc3RhdHVzID0gcGMuaGFuZGxlRmlsZShwKTsKKworICAgICAgLy8gVmVyaWZ5IEluZ2VzdFN0YXR1cy4KKyAgICAgIGFzc2VydEVxdWFscyhJbmdlc3RTdGF0dXMuUmVzdWx0LkZBSUxVUkUsIHN0YXR1cy5nZXRSZXN1bHQoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocCwgc3RhdHVzLmdldFByb2R1Y3QoKSk7CisKKyAgICAgIC8vIFZlcmlmeSBjb3JyZWN0IG1ldGhvZHMgd2VyZSBydW4uIAorICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5QcmVjb25kaXRpb25zKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5FeHRyYWN0aW9uKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUmVuYW1pbmcoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5SZXF1aXJlZE1ldGFkYXRhKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUHJlSW5nZXN0QWN0aW9ucygpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhbkluZ2VzdCgpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhblBvc3RJbmdlc3RTdWNjZXNzQWN0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUG9zdEluZ2VzdEZhaWxBY3Rpb25zKCkpOworICAgfQorCisgICAvLyBDYXNlMzoKKyAgIC8vICAtIFByZWNvbmRpdGlvbnM6IHBhc3MKKyAgIC8vICAtIEZhaWxFeHRyYWN0aW9uOiBwYXNzCisgICAvLyAgLSBSZW5hbWVQcm9kdWN0OiBmYWlsCisgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRmlsZUNhc2UzKCkgeworICAgICAgRmlsZSBwID0gbmV3IEZpbGUoIi90bXAvZGF0YS5kYXQiKTsKKworICAgICAgLy8gU2V0dXAgQ3Jhd2xlci4KKyAgICAgIFN0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlciBwYyA9IG5ldyBTdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIoKTsKKyAgICAgIHBjLm1hcmtGYWlsUmVuYW1pbmcoKTsKKworICAgICAgLy8gUnVuIENyYXdsZXIuCisgICAgICBJbmdlc3RTdGF0dXMgc3RhdHVzID0gcGMuaGFuZGxlRmlsZShwKTsKKworICAgICAgLy8gVmVyaWZ5IEluZ2VzdFN0YXR1cy4KKyAgICAgIGFzc2VydEVxdWFscyhJbmdlc3RTdGF0dXMuUmVzdWx0LkZBSUxVUkUsIHN0YXR1cy5nZXRSZXN1bHQoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocCwgc3RhdHVzLmdldFByb2R1Y3QoKSk7CisKKyAgICAgIC8vIFZlcmlmeSBjb3JyZWN0IG1ldGhvZHMgd2VyZSBydW4uIAorICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5QcmVjb25kaXRpb25zKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5FeHRyYWN0aW9uKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5SZW5hbWluZygpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhblJlcXVpcmVkTWV0YWRhdGEoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5QcmVJbmdlc3RBY3Rpb25zKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuSW5nZXN0KCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUG9zdEluZ2VzdFN1Y2Nlc3NBY3Rpb25zKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5Qb3N0SW5nZXN0RmFpbEFjdGlvbnMoKSk7CisgICB9CisKKyAgIC8vIENhc2U0OgorICAgLy8gIC0gUHJlY29uZGl0aW9uczogcGFzcworICAgLy8gIC0gRmFpbEV4dHJhY3Rpb246IHBhc3MKKyAgIC8vICAtIFJlbmFtZVByb2R1Y3Q6IHBhc3MKKyAgIC8vICAtIFJlcXVpcmVkTWV0YWRhdGE6IGZhaWwKKyAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVGaWxlQ2FzZTQoKSB7CisgICAgICBGaWxlIHAgPSBuZXcgRmlsZSgiL3RtcC9kYXRhLmRhdCIpOworCisgICAgICAvLyBTZXR1cCBDcmF3bGVyLgorICAgICAgU3RhdGVBd2FyZVByb2R1Y3RDcmF3bGVyIHBjID0gbmV3IFN0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlcigpOworICAgICAgcGMubWFya0ZhaWxSZXF1aXJlZE1ldGFkYXRhKCk7CisKKyAgICAgIC8vIFJ1biBDcmF3bGVyLgorICAgICAgSW5nZXN0U3RhdHVzIHN0YXR1cyA9IHBjLmhhbmRsZUZpbGUocCk7CisKKyAgICAgIC8vIFZlcmlmeSBJbmdlc3RTdGF0dXMuCisgICAgICBhc3NlcnRFcXVhbHMoSW5nZXN0U3RhdHVzLlJlc3VsdC5GQUlMVVJFLCBzdGF0dXMuZ2V0UmVzdWx0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHAsIHN0YXR1cy5nZXRQcm9kdWN0KCkpOworCisgICAgICAvLyBWZXJpZnkgY29ycmVjdCBtZXRob2RzIHdlcmUgcnVuLiAKKyAgICAgIGFzc2VydFRydWUocGMucmFuUHJlY29uZGl0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuRXh0cmFjdGlvbigpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUmVuYW1pbmcoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblJlcXVpcmVkTWV0YWRhdGEoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5QcmVJbmdlc3RBY3Rpb25zKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuSW5nZXN0KCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUG9zdEluZ2VzdFN1Y2Nlc3NBY3Rpb25zKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5Qb3N0SW5nZXN0RmFpbEFjdGlvbnMoKSk7CisgICB9CisKKyAgIC8vIENhc2U1OgorICAgLy8gIC0gUHJlY29uZGl0aW9uczogcGFzcworICAgLy8gIC0gRmFpbEV4dHJhY3Rpb246IHBhc3MKKyAgIC8vICAtIFJlbmFtZVByb2R1Y3Q6IHBhc3MKKyAgIC8vICAtIFJlcXVpcmVkTWV0YWRhdGE6IHBhc3MKKyAgIC8vICAtIFByZUluZ2VzdEFjdGlvbnM6IGZhaWwKKyAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVGaWxlQ2FzZTUoKSB7CisgICAgICBGaWxlIHAgPSBuZXcgRmlsZSgiL3RtcC9kYXRhLmRhdCIpOworCisgICAgICAvLyBTZXR1cCBDcmF3bGVyLgorICAgICAgU3RhdGVBd2FyZVByb2R1Y3RDcmF3bGVyIHBjID0gbmV3IFN0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlcigpOworICAgICAgcGMubWFya0ZhaWxQcmVJbmdlc3RBY3Rpb25zKCk7CisKKyAgICAgIC8vIFJ1biBDcmF3bGVyLgorICAgICAgSW5nZXN0U3RhdHVzIHN0YXR1cyA9IHBjLmhhbmRsZUZpbGUocCk7CisKKyAgICAgIC8vIFZlcmlmeSBJbmdlc3RTdGF0dXMuCisgICAgICBhc3NlcnRFcXVhbHMoSW5nZXN0U3RhdHVzLlJlc3VsdC5GQUlMVVJFLCBzdGF0dXMuZ2V0UmVzdWx0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHAsIHN0YXR1cy5nZXRQcm9kdWN0KCkpOworCisgICAgICAvLyBWZXJpZnkgY29ycmVjdCBtZXRob2RzIHdlcmUgcnVuLiAKKyAgICAgIGFzc2VydFRydWUocGMucmFuUHJlY29uZGl0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuRXh0cmFjdGlvbigpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUmVuYW1pbmcoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblJlcXVpcmVkTWV0YWRhdGEoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblByZUluZ2VzdEFjdGlvbnMoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5Jbmdlc3QoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5Qb3N0SW5nZXN0U3VjY2Vzc0FjdGlvbnMoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblBvc3RJbmdlc3RGYWlsQWN0aW9ucygpKTsKKyAgIH0KKworICAgLy8gQ2FzZTY6CisgICAvLyAgLSBQcmVjb25kaXRpb25zOiBwYXNzCisgICAvLyAgLSBGYWlsRXh0cmFjdGlvbjogcGFzcworICAgLy8gIC0gUmVuYW1lUHJvZHVjdDogcGFzcworICAgLy8gIC0gUmVxdWlyZWRNZXRhZGF0YTogcGFzcworICAgLy8gIC0gUHJlSW5nZXN0QWN0aW9uczogcGFzcworICAgLy8gIC0gU2tpcEluZ2VzdDogdHJ1ZQorICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZpbGVDYXNlNigpIHsKKyAgICAgIEZpbGUgcCA9IG5ldyBGaWxlKCIvdG1wL2RhdGEuZGF0Iik7CisKKyAgICAgIC8vIFNldHVwIENyYXdsZXIuCisgICAgICBTdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIgcGMgPSBuZXcgU3RhdGVBd2FyZVByb2R1Y3RDcmF3bGVyKCk7CisgICAgICBwYy5tYXJrU2tpcEluZ2VzdCgpOworCisgICAgICAvLyBSdW4gQ3Jhd2xlci4KKyAgICAgIEluZ2VzdFN0YXR1cyBzdGF0dXMgPSBwYy5oYW5kbGVGaWxlKHApOworCisgICAgICAvLyBWZXJpZnkgSW5nZXN0U3RhdHVzLgorICAgICAgYXNzZXJ0RXF1YWxzKEluZ2VzdFN0YXR1cy5SZXN1bHQuU0tJUFBFRCwgc3RhdHVzLmdldFJlc3VsdCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwLCBzdGF0dXMuZ2V0UHJvZHVjdCgpKTsKKworICAgICAgLy8gVmVyaWZ5IGNvcnJlY3QgbWV0aG9kcyB3ZXJlIHJ1bi4gCisgICAgICBhc3NlcnRUcnVlKHBjLnJhblByZWNvbmRpdGlvbnMoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhbkV4dHJhY3Rpb24oKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblJlbmFtaW5nKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5SZXF1aXJlZE1ldGFkYXRhKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5QcmVJbmdlc3RBY3Rpb25zKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuSW5nZXN0KCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUG9zdEluZ2VzdFN1Y2Nlc3NBY3Rpb25zKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMucmFuUG9zdEluZ2VzdEZhaWxBY3Rpb25zKCkpOworICAgfQorCisgICAvLyBDYXNlNzoKKyAgIC8vICAtIFByZWNvbmRpdGlvbnM6IHBhc3MKKyAgIC8vICAtIEZhaWxFeHRyYWN0aW9uOiBwYXNzCisgICAvLyAgLSBSZW5hbWVQcm9kdWN0OiBwYXNzCisgICAvLyAgLSBSZXF1aXJlZE1ldGFkYXRhOiBwYXNzCisgICAvLyAgLSBQcmVJbmdlc3RBY3Rpb25zOiBwYXNzCisgICAvLyAgLSBTa2lwSW5nZXN0OiBmYWxzZQorICAgLy8gIC0gSW5nZXN0OiBmYWlsCisgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRmlsZUNhc2U3KCkgeworICAgICAgRmlsZSBwID0gbmV3IEZpbGUoIi90bXAvZGF0YS5kYXQiKTsKKworICAgICAgLy8gU2V0dXAgQ3Jhd2xlci4KKyAgICAgIFN0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlciBwYyA9IG5ldyBTdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIoKTsKKyAgICAgIHBjLm1hcmtGYWlsSW5nZXN0KCk7CisKKyAgICAgIC8vIFJ1biBDcmF3bGVyLgorICAgICAgSW5nZXN0U3RhdHVzIHN0YXR1cyA9IHBjLmhhbmRsZUZpbGUocCk7CisKKyAgICAgIC8vIFZlcmlmeSBJbmdlc3RTdGF0dXMuCisgICAgICBhc3NlcnRFcXVhbHMoSW5nZXN0U3RhdHVzLlJlc3VsdC5GQUlMVVJFLCBzdGF0dXMuZ2V0UmVzdWx0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHAsIHN0YXR1cy5nZXRQcm9kdWN0KCkpOworCisgICAgICAvLyBWZXJpZnkgY29ycmVjdCBtZXRob2RzIHdlcmUgcnVuLiAKKyAgICAgIGFzc2VydFRydWUocGMucmFuUHJlY29uZGl0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuRXh0cmFjdGlvbigpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUmVuYW1pbmcoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblJlcXVpcmVkTWV0YWRhdGEoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhblByZUluZ2VzdEFjdGlvbnMoKSk7CisgICAgICBhc3NlcnRUcnVlKHBjLnJhbkluZ2VzdCgpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLnJhblBvc3RJbmdlc3RTdWNjZXNzQWN0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUG9zdEluZ2VzdEZhaWxBY3Rpb25zKCkpOworICAgfQorCisgICAvLyBDYXNlODoKKyAgIC8vICAtIFByZWNvbmRpdGlvbnM6IHBhc3MKKyAgIC8vICAtIEZhaWxFeHRyYWN0aW9uOiBwYXNzCisgICAvLyAgLSBSZW5hbWVQcm9kdWN0OiBwYXNzCisgICAvLyAgLSBSZXF1aXJlZE1ldGFkYXRhOiBwYXNzCisgICAvLyAgLSBQcmVJbmdlc3RBY3Rpb25zOiBwYXNzCisgICAvLyAgLSBTa2lwSW5nZXN0OiBmYWxzZQorICAgLy8gIC0gSW5nZXN0OiBwYXNzCisgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRmlsZUNhc2U4KCkgeworICAgICAgRmlsZSBwID0gbmV3IEZpbGUoIi90bXAvZGF0YS5kYXQiKTsKKworICAgICAgLy8gU2V0dXAgQ3Jhd2xlci4KKyAgICAgIFN0YXRlQXdhcmVQcm9kdWN0Q3Jhd2xlciBwYyA9IG5ldyBTdGF0ZUF3YXJlUHJvZHVjdENyYXdsZXIoKTsKKworICAgICAgLy8gUnVuIENyYXdsZXIuCisgICAgICBJbmdlc3RTdGF0dXMgc3RhdHVzID0gcGMuaGFuZGxlRmlsZShwKTsKKworICAgICAgLy8gVmVyaWZ5IEluZ2VzdFN0YXR1cy4KKyAgICAgIGFzc2VydEVxdWFscyhJbmdlc3RTdGF0dXMuUmVzdWx0LlNVQ0NFU1MsIHN0YXR1cy5nZXRSZXN1bHQoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocCwgc3RhdHVzLmdldFByb2R1Y3QoKSk7CisKKyAgICAgIC8vIFZlcmlmeSBjb3JyZWN0IG1ldGhvZHMgd2VyZSBydW4uIAorICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5QcmVjb25kaXRpb25zKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5FeHRyYWN0aW9uKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5SZW5hbWluZygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUmVxdWlyZWRNZXRhZGF0YSgpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuUHJlSW5nZXN0QWN0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUocGMucmFuSW5nZXN0KCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5yYW5Qb3N0SW5nZXN0U3VjY2Vzc0FjdGlvbnMoKSk7CisgICAgICBhc3NlcnRGYWxzZShwYy5yYW5Qb3N0SW5nZXN0RmFpbEFjdGlvbnMoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RTZXR1cEluZ2VzdGVyKCkgeworICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVEdW1teUNyYXdsZXIoKTsKKyAgICAgIHBjLnNldENsaWVudFRyYW5zZmVyZXIoTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICBwYy5zZXR1cEluZ2VzdGVyKCk7CisgICAgICBhc3NlcnROb3ROdWxsKHBjLmluZ2VzdGVyKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdExvYWRBbmRWYWxpZGF0ZUFjdGlvbnMoKSB7CisgICAgICBQcm9kdWN0Q3Jhd2xlciBwYyA9IGNyZWF0ZUR1bW15Q3Jhd2xlcigpOworICAgICAgcGMuc2V0QXBwbGljYXRpb25Db250ZXh0KG5ldyBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0KAorICAgICAgICAgICAgQ1JBV0xFUl9DT05GSUcpKTsKKyAgICAgIHBjLmxvYWRBbmRWYWxpZGF0ZUFjdGlvbnMoKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCBwYy5hY3Rpb25SZXBvLmdldEFjdGlvbnMoKS5zaXplKCkpOworCisgICAgICBwYyA9IGNyZWF0ZUR1bW15Q3Jhd2xlcigpOworICAgICAgcGMuc2V0QXBwbGljYXRpb25Db250ZXh0KG5ldyBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0KAorICAgICAgICAgICAgQ1JBV0xFUl9DT05GSUcpKTsKKyAgICAgIHBjLnNldEFjdGlvbklkcyhMaXN0cy5uZXdBcnJheUxpc3QoIlVuaXF1ZSIsICJEZWxldGVEYXRhRmlsZSIpKTsKKyAgICAgIHBjLmxvYWRBbmRWYWxpZGF0ZUFjdGlvbnMoKTsKKyAgICAgIGFzc2VydEVxdWFscyhTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICBwYy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRCZWFuKCJVbmlxdWUiKSwKKyAgICAgICAgICAgIHBjLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldEJlYW4oIkRlbGV0ZURhdGFGaWxlIikpLAorICAgICAgICAgICAgcGMuYWN0aW9uUmVwby5nZXRBY3Rpb25zKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVBY3Rpb25zKCkgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgLy8gVGVzdCBjYXNlIGludmFsaWQgYWN0aW9uLgorICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVEdW1teUNyYXdsZXIoKTsKKyAgICAgIHBjLmFjdGlvblJlcG8gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb25SZXBvLmNsYXNzKTsKKworICAgICAgQ3Jhd2xlckFjdGlvbiBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgYWN0aW9uLnZhbGlkYXRlKCk7CisgICAgICBleHBlY3RMYXN0Q2FsbCgpLmFuZFRocm93KG5ldyBDcmF3bGVyQWN0aW9uRXhjZXB0aW9uKCkpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICByZXBsYXkoYWN0aW9uKTsKKworICAgICAgZXhwZWN0KHBjLmFjdGlvblJlcG8uZ2V0QWN0aW9ucygpKS5hbmRSZXR1cm4oCisgICAgICAgICAgICBTZXRzLm5ld0hhc2hTZXQoYWN0aW9uKSk7CisgICAgICByZXBsYXkocGMuYWN0aW9uUmVwbyk7CisgICAgICB0cnkgeworICAgICAgICAgcGMudmFsaWRhdGVBY3Rpb25zKCk7CisgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gUnVudGltZUV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7IC8qIGV4cGVjdCB0aHJvdyAqLyB9CisgICAgICB2ZXJpZnkocGMuYWN0aW9uUmVwbyk7CisgICAgICB2ZXJpZnkoYWN0aW9uKTsKKworICAgICAgLy8gVGVzdCBjYXNlIHZhbGlkIGFjdGlvbi4KKyAgICAgIHBjID0gY3JlYXRlRHVtbXlDcmF3bGVyKCk7CisgICAgICBwYy5hY3Rpb25SZXBvID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uUmVwby5jbGFzcyk7CisgICAgICBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KHBjLmFjdGlvblJlcG8uZ2V0QWN0aW9ucygpKS5hbmRSZXR1cm4oCisgICAgICAgICAgICBTZXRzLm5ld0hhc2hTZXQoYWN0aW9uKSk7CisgICAgICBhY3Rpb24udmFsaWRhdGUoKTsKKyAgICAgIHJlcGxheShwYy5hY3Rpb25SZXBvKTsKKyAgICAgIHJlcGxheShhY3Rpb24pOworICAgICAgcGMudmFsaWRhdGVBY3Rpb25zKCk7CisgICAgICB2ZXJpZnkocGMuYWN0aW9uUmVwbyk7CisgICAgICB2ZXJpZnkoYWN0aW9uKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zUmVxdWlyZWRNZXRhZGF0YSgpIHsKKyAgICAgIFByb2R1Y3RDcmF3bGVyIHBjID0gY3JlYXRlRHVtbXlDcmF3bGVyKCk7CisgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBtLnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX1RZUEUsICJHZW5lcmljRmlsZSIpOworICAgICAgbS5yZXBsYWNlTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUsICJUZXN0RmlsZS50eHQiKTsKKyAgICAgIG0ucmVwbGFjZU1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sICIvdG1wL2RpciIpOworICAgICAgbS5yZXBsYWNlTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9TSVpFLCAiMCIpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5jb250YWluc1JlcXVpcmVkTWV0YWRhdGEobSkpOworICAgICAgYXNzZXJ0RmFsc2UocGMuY29udGFpbnNSZXF1aXJlZE1ldGFkYXRhKG5ldyBNZXRhZGF0YSgpKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RBZGRLbm93TWV0YWRhdGEoKSB7CisgICAgICBGaWxlIHAgPSBuZXcgRmlsZSgiL3RtcC9kYXRhLmRhdCIpOworICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVEdW1teUNyYXdsZXIoKTsKKyAgICAgIHBjLmFkZEtub3duTWV0YWRhdGEocCwgbSk7CisgICAgICBhc3NlcnRFcXVhbHMoNCwgbS5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwLmdldE5hbWUoKSwgbS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX05BTUUpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwLmdldE5hbWUoKSwgbS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSkpOworICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgbS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKSk7CisgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YocC5sZW5ndGgoKSksIG0uZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9TSVpFKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJbmdlc3RTdGF0dXMoKSB7CisgICAgICBGaWxlIHAgPSBuZXcgRmlsZSgiL3RtcC9kYXRhLmRhdCIpOworICAgICAgSW5nZXN0U3RhdHVzLlJlc3VsdCByZXN1bHQgPSBJbmdlc3RTdGF0dXMuUmVzdWx0LlNVQ0NFU1M7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJJbmdlc3QgT0siOworICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVEdW1teUNyYXdsZXIoKTsKKyAgICAgIEluZ2VzdFN0YXR1cyBzdGF0dXMgPSBwYy5jcmVhdGVJbmdlc3RTdGF0dXMocCwgcmVzdWx0LCBtZXNzYWdlKTsKKyAgICAgIGFzc2VydEVxdWFscyhwLCBzdGF0dXMuZ2V0UHJvZHVjdCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIHN0YXR1cy5nZXRSZXN1bHQoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RJbmdlc3QoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJbmdlc3RFeGNlcHRpb24geworICAgICAgRmlsZSBwID0gbmV3IEZpbGUoIi90bXAvZGF0YS5kYXQiKTsKKyAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKworICAgICAgLy8gVGVzdCBzdWNjZXNzZnVsIGluZ2VzdC4KKyAgICAgIFByb2R1Y3RDcmF3bGVyIHBjID0gY3JlYXRlRHVtbXlDcmF3bGVyKCk7CisgICAgICBwYy5zZXRGaWxlbWdyVXJsKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKTsKKyAgICAgIHBjLmluZ2VzdGVyID0gY3JlYXRlTW9jayhJbmdlc3Rlci5jbGFzcyk7CisgICAgICBleHBlY3QocGMuaW5nZXN0ZXIuaW5nZXN0KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLCBwLCBtKSkKKyAgICAgICAgIC5hbmRSZXR1cm4oIlRlc3RQcm9kdWN0SWQiKTsKKyAgICAgIHJlcGxheShwYy5pbmdlc3Rlcik7CisgICAgICBhc3NlcnRUcnVlKHBjLmluZ2VzdChwLCBtKSk7CisgICAgICB2ZXJpZnkocGMuaW5nZXN0ZXIpOworCisgICAgICAvLyBUZXN0IGZhaWxlZCBpbmdlc3QuCisgICAgICBwYyA9IGNyZWF0ZUR1bW15Q3Jhd2xlcigpOworICAgICAgcGMuc2V0RmlsZW1nclVybCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIik7CisgICAgICBwYy5pbmdlc3RlciA9IGNyZWF0ZU1vY2soSW5nZXN0ZXIuY2xhc3MpOworICAgICAgZXhwZWN0KHBjLmluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwgcCwgbSkpCisgICAgICAgICAuYW5kVGhyb3cobmV3IEluZ2VzdEV4Y2VwdGlvbigpKTsKKyAgICAgIHJlcGxheShwYy5pbmdlc3Rlcik7CisgICAgICBhc3NlcnRGYWxzZShwYy5pbmdlc3QocCwgbSkpOworICAgICAgdmVyaWZ5KHBjLmluZ2VzdGVyKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFBlcmZvcm1QcmVJbmdlc3RBY3Rpb25zKCkgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVEdW1teUNyYXdsZXIoKTsKKyAgICAgIEZpbGUgcCA9IG5ldyBGaWxlKCIvdG1wL2RhdGEuZGF0Iik7CisgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisKKyAgICAgIC8vIFRlc3QgYWN0aW9uUmVwbyA9PSBudWxsLgorICAgICAgYXNzZXJ0VHJ1ZShwYy5wZXJmb3JtUHJlSW5nZXN0QWN0aW9ucyhwLCBtKSk7CisKKyAgICAgIC8vIFRlc3QgYWN0aW9uUmVwbyAhPSBudWxsIGFuZCBwZXJmb3JtQWN0aW9uIHJldHVybiB0cnVlLgorICAgICAgQ3Jhd2xlckFjdGlvbiBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICBleHBlY3QoYWN0aW9uLnBlcmZvcm1BY3Rpb24ocCwgbSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgIHJlcGxheShhY3Rpb24pOworCisgICAgICBwYy5hY3Rpb25SZXBvID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uUmVwby5jbGFzcyk7CisgICAgICBleHBlY3QocGMuYWN0aW9uUmVwby5nZXRQcmVJbmdlc3RBY3Rpb25zKCkpCisgICAgICAgICAuYW5kUmV0dXJuKExpc3RzLm5ld0FycmF5TGlzdChhY3Rpb24pKTsKKyAgICAgIHJlcGxheShwYy5hY3Rpb25SZXBvKTsKKworICAgICAgYXNzZXJ0VHJ1ZShwYy5wZXJmb3JtUHJlSW5nZXN0QWN0aW9ucyhwLCBtKSk7CisgICAgICB2ZXJpZnkoYWN0aW9uKTsKKyAgICAgIHZlcmlmeShwYy5hY3Rpb25SZXBvKTsKKworICAgICAgLy8gVGVzdCBhY3Rpb25SZXBvICE9IG51bGwgYW5kIHBlcmZvcm1BY3Rpb24gcmV0dXJuIGZhbHNlLgorICAgICAgYWN0aW9uID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uLmNsYXNzKTsKKyAgICAgIGV4cGVjdChhY3Rpb24uZ2V0SWQoKSkuYW5kUmV0dXJuKCJBY3Rpb25JZCIpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXREZXNjcmlwdGlvbigpKS5hbmRSZXR1cm4oIkFjdGlvbiBEZXNjcmlwdGlvbiIpOworICAgICAgZXhwZWN0KGFjdGlvbi5wZXJmb3JtQWN0aW9uKHAsIG0pKS5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICByZXBsYXkoYWN0aW9uKTsKKworICAgICAgcGMuYWN0aW9uUmVwbyA9IGNyZWF0ZU1vY2soQ3Jhd2xlckFjdGlvblJlcG8uY2xhc3MpOworICAgICAgZXhwZWN0KHBjLmFjdGlvblJlcG8uZ2V0UHJlSW5nZXN0QWN0aW9ucygpKQorICAgICAgICAgLmFuZFJldHVybihMaXN0cy5uZXdBcnJheUxpc3QoYWN0aW9uKSk7CisgICAgICByZXBsYXkocGMuYWN0aW9uUmVwbyk7CisKKyAgICAgIGFzc2VydEZhbHNlKHBjLnBlcmZvcm1QcmVJbmdlc3RBY3Rpb25zKHAsIG0pKTsKKyAgICAgIHZlcmlmeShhY3Rpb24pOworICAgICAgdmVyaWZ5KHBjLmFjdGlvblJlcG8pOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybVBvc3RJbmdlc3RPblN1Y2Nlc3NBY3Rpb25zKCkgdGhyb3dzIENyYXdsZXJBY3Rpb25FeGNlcHRpb24geworICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVEdW1teUNyYXdsZXIoKTsKKyAgICAgIEZpbGUgcCA9IG5ldyBGaWxlKCIvdG1wL2RhdGEuZGF0Iik7CisgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisKKyAgICAgIC8vIFRlc3QgYWN0aW9uUmVwbyA9PSBudWxsLgorICAgICAgYXNzZXJ0VHJ1ZShwYy5wZXJmb3JtUG9zdEluZ2VzdE9uU3VjY2Vzc0FjdGlvbnMocCwgbSkpOworCisgICAgICAvLyBUZXN0IGFjdGlvblJlcG8gIT0gbnVsbCBhbmQgcGVyZm9ybUFjdGlvbiByZXR1cm4gdHJ1ZS4KKyAgICAgIENyYXdsZXJBY3Rpb24gYWN0aW9uID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uLmNsYXNzKTsKKyAgICAgIGV4cGVjdChhY3Rpb24uZ2V0SWQoKSkuYW5kUmV0dXJuKCJBY3Rpb25JZCIpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXREZXNjcmlwdGlvbigpKS5hbmRSZXR1cm4oIkFjdGlvbiBEZXNjcmlwdGlvbiIpOworICAgICAgZXhwZWN0KGFjdGlvbi5wZXJmb3JtQWN0aW9uKHAsIG0pKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICByZXBsYXkoYWN0aW9uKTsKKworICAgICAgcGMuYWN0aW9uUmVwbyA9IGNyZWF0ZU1vY2soQ3Jhd2xlckFjdGlvblJlcG8uY2xhc3MpOworICAgICAgZXhwZWN0KHBjLmFjdGlvblJlcG8uZ2V0UG9zdEluZ2VzdE9uU3VjY2Vzc0FjdGlvbnMoKSkKKyAgICAgICAgIC5hbmRSZXR1cm4oTGlzdHMubmV3QXJyYXlMaXN0KGFjdGlvbikpOworICAgICAgcmVwbGF5KHBjLmFjdGlvblJlcG8pOworCisgICAgICBhc3NlcnRUcnVlKHBjLnBlcmZvcm1Qb3N0SW5nZXN0T25TdWNjZXNzQWN0aW9ucyhwLCBtKSk7CisgICAgICB2ZXJpZnkoYWN0aW9uKTsKKyAgICAgIHZlcmlmeShwYy5hY3Rpb25SZXBvKTsKKworICAgICAgLy8gVGVzdCBhY3Rpb25SZXBvICE9IG51bGwgYW5kIHBlcmZvcm1BY3Rpb24gcmV0dXJuIGZhbHNlLgorICAgICAgYWN0aW9uID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uLmNsYXNzKTsKKyAgICAgIGV4cGVjdChhY3Rpb24uZ2V0SWQoKSkuYW5kUmV0dXJuKCJBY3Rpb25JZCIpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXREZXNjcmlwdGlvbigpKS5hbmRSZXR1cm4oIkFjdGlvbiBEZXNjcmlwdGlvbiIpOworICAgICAgZXhwZWN0KGFjdGlvbi5wZXJmb3JtQWN0aW9uKHAsIG0pKS5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICByZXBsYXkoYWN0aW9uKTsKKworICAgICAgcGMuYWN0aW9uUmVwbyA9IGNyZWF0ZU1vY2soQ3Jhd2xlckFjdGlvblJlcG8uY2xhc3MpOworICAgICAgZXhwZWN0KHBjLmFjdGlvblJlcG8uZ2V0UG9zdEluZ2VzdE9uU3VjY2Vzc0FjdGlvbnMoKSkKKyAgICAgICAgIC5hbmRSZXR1cm4oTGlzdHMubmV3QXJyYXlMaXN0KGFjdGlvbikpOworICAgICAgcmVwbGF5KHBjLmFjdGlvblJlcG8pOworCisgICAgICBhc3NlcnRGYWxzZShwYy5wZXJmb3JtUG9zdEluZ2VzdE9uU3VjY2Vzc0FjdGlvbnMocCwgbSkpOworICAgICAgdmVyaWZ5KGFjdGlvbik7CisgICAgICB2ZXJpZnkocGMuYWN0aW9uUmVwbyk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtUG9zdEluZ2VzdE9uRmFpbEFjdGlvbnMoKSB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBQcm9kdWN0Q3Jhd2xlciBwYyA9IGNyZWF0ZUR1bW15Q3Jhd2xlcigpOworICAgICAgRmlsZSBwID0gbmV3IEZpbGUoIi90bXAvZGF0YS5kYXQiKTsKKyAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKworICAgICAgLy8gVGVzdCBhY3Rpb25SZXBvID09IG51bGwuCisgICAgICBhc3NlcnRUcnVlKHBjLnBlcmZvcm1Qb3N0SW5nZXN0T25GYWlsQWN0aW9ucyhwLCBtKSk7CisKKyAgICAgIC8vIFRlc3QgYWN0aW9uUmVwbyAhPSBudWxsIGFuZCBwZXJmb3JtQWN0aW9uIHJldHVybiB0cnVlLgorICAgICAgQ3Jhd2xlckFjdGlvbiBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICBleHBlY3QoYWN0aW9uLnBlcmZvcm1BY3Rpb24ocCwgbSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgIHJlcGxheShhY3Rpb24pOworCisgICAgICBwYy5hY3Rpb25SZXBvID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uUmVwby5jbGFzcyk7CisgICAgICBleHBlY3QocGMuYWN0aW9uUmVwby5nZXRQb3N0SW5nZXN0T25GYWlsQWN0aW9ucygpKQorICAgICAgICAgLmFuZFJldHVybihMaXN0cy5uZXdBcnJheUxpc3QoYWN0aW9uKSk7CisgICAgICByZXBsYXkocGMuYWN0aW9uUmVwbyk7CisKKyAgICAgIGFzc2VydFRydWUocGMucGVyZm9ybVBvc3RJbmdlc3RPbkZhaWxBY3Rpb25zKHAsIG0pKTsKKyAgICAgIHZlcmlmeShhY3Rpb24pOworICAgICAgdmVyaWZ5KHBjLmFjdGlvblJlcG8pOworCisgICAgICAvLyBUZXN0IGFjdGlvblJlcG8gIT0gbnVsbCBhbmQgcGVyZm9ybUFjdGlvbiByZXR1cm4gZmFsc2UuCisgICAgICBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICBleHBlY3QoYWN0aW9uLnBlcmZvcm1BY3Rpb24ocCwgbSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICBleHBlY3QoYWN0aW9uLmdldElkKCkpLmFuZFJldHVybigiQWN0aW9uSWQiKTsKKyAgICAgIGV4cGVjdChhY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSkuYW5kUmV0dXJuKCJBY3Rpb24gRGVzY3JpcHRpb24iKTsKKyAgICAgIHJlcGxheShhY3Rpb24pOworCisgICAgICBwYy5hY3Rpb25SZXBvID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uUmVwby5jbGFzcyk7CisgICAgICBleHBlY3QocGMuYWN0aW9uUmVwby5nZXRQb3N0SW5nZXN0T25GYWlsQWN0aW9ucygpKQorICAgICAgICAgLmFuZFJldHVybihMaXN0cy5uZXdBcnJheUxpc3QoYWN0aW9uKSk7CisgICAgICByZXBsYXkocGMuYWN0aW9uUmVwbyk7CisKKyAgICAgIGFzc2VydEZhbHNlKHBjLnBlcmZvcm1Qb3N0SW5nZXN0T25GYWlsQWN0aW9ucyhwLCBtKSk7CisgICAgICB2ZXJpZnkoYWN0aW9uKTsKKyAgICAgIHZlcmlmeShwYy5hY3Rpb25SZXBvKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFBlcmZvcm1Qcm9kdWN0Q3Jhd2xlckFjdGlvbnMoKSB0aHJvd3MgQ3Jhd2xlckFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBQcm9kdWN0Q3Jhd2xlciBwYyA9IGNyZWF0ZUR1bW15Q3Jhd2xlcigpOworICAgICAgRmlsZSBwID0gbmV3IEZpbGUoIi90bXAvZGF0YS5kYXQiKTsKKyAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKworICAgICAgLy8gVGVzdCBubyBhY3Rpb25zLgorICAgICAgYXNzZXJ0VHJ1ZShwYy5wZXJmb3JtUHJvZHVjdENyYXdsZXJBY3Rpb25zKAorICAgICAgICAgICAgQ29sbGVjdGlvbnMuPENyYXdsZXJBY3Rpb24+ZW1wdHlMaXN0KCksIHAsIG0pKTsKKworICAgICAgLy8gVGVzdCAxIGFjdGlvbiBwYXNzLgorICAgICAgQ3Jhd2xlckFjdGlvbiBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICBleHBlY3QoYWN0aW9uLnBlcmZvcm1BY3Rpb24ocCwgbSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgIHJlcGxheShhY3Rpb24pOworICAgICAgYXNzZXJ0VHJ1ZShwYy5wZXJmb3JtUHJvZHVjdENyYXdsZXJBY3Rpb25zKAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KGFjdGlvbiksIHAsIG0pKTsKKyAgICAgIHZlcmlmeShhY3Rpb24pOworCisgICAgICAvLyBUZXN0IDEgYWN0aW9uIGZhaWwuCisgICAgICBhY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KGFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoYWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICBleHBlY3QoYWN0aW9uLnBlcmZvcm1BY3Rpb24ocCwgbSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICBleHBlY3QoYWN0aW9uLmdldElkKCkpLmFuZFJldHVybigiQWN0aW9uSWQiKTsKKyAgICAgIGV4cGVjdChhY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSkuYW5kUmV0dXJuKCJBY3Rpb24gRGVzY3JpcHRpb24iKTsKKyAgICAgIHJlcGxheShhY3Rpb24pOworICAgICAgYXNzZXJ0RmFsc2UocGMucGVyZm9ybVByb2R1Y3RDcmF3bGVyQWN0aW9ucygKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdChhY3Rpb24pLCBwLCBtKSk7CisgICAgICB2ZXJpZnkoYWN0aW9uKTsKKworICAgICAgLy8gVGVzdCAxIGFjdGlvbiBwYXNzIGFuZCAxIGFjdGlvbiBmYWlsLgorICAgICAgQ3Jhd2xlckFjdGlvbiBwYXNzQWN0aW9uID0gY3JlYXRlTW9jayhDcmF3bGVyQWN0aW9uLmNsYXNzKTsKKyAgICAgIGV4cGVjdChwYXNzQWN0aW9uLmdldElkKCkpLmFuZFJldHVybigiQWN0aW9uSWQiKTsKKyAgICAgIGV4cGVjdChwYXNzQWN0aW9uLmdldERlc2NyaXB0aW9uKCkpLmFuZFJldHVybigiQWN0aW9uIERlc2NyaXB0aW9uIik7CisgICAgICBleHBlY3QocGFzc0FjdGlvbi5wZXJmb3JtQWN0aW9uKHAsIG0pKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICByZXBsYXkocGFzc0FjdGlvbik7CisgICAgICBDcmF3bGVyQWN0aW9uIGZhaWxBY3Rpb24gPSBjcmVhdGVNb2NrKENyYXdsZXJBY3Rpb24uY2xhc3MpOworICAgICAgZXhwZWN0KGZhaWxBY3Rpb24uZ2V0SWQoKSkuYW5kUmV0dXJuKCJBY3Rpb25JZCIpOworICAgICAgZXhwZWN0KGZhaWxBY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSkuYW5kUmV0dXJuKCJBY3Rpb24gRGVzY3JpcHRpb24iKTsKKyAgICAgIGV4cGVjdChmYWlsQWN0aW9uLnBlcmZvcm1BY3Rpb24ocCwgbSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICBleHBlY3QoZmFpbEFjdGlvbi5nZXRJZCgpKS5hbmRSZXR1cm4oIkFjdGlvbklkIik7CisgICAgICBleHBlY3QoZmFpbEFjdGlvbi5nZXREZXNjcmlwdGlvbigpKS5hbmRSZXR1cm4oIkFjdGlvbiBEZXNjcmlwdGlvbiIpOworICAgICAgcmVwbGF5KGZhaWxBY3Rpb24pOworICAgICAgYXNzZXJ0RmFsc2UocGMucGVyZm9ybVByb2R1Y3RDcmF3bGVyQWN0aW9ucygKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdChwYXNzQWN0aW9uLCBmYWlsQWN0aW9uKSwgcCwgbSkpOworICAgICAgdmVyaWZ5KHBhc3NBY3Rpb24pOworICAgICAgdmVyaWZ5KGZhaWxBY3Rpb24pOworICAgfQorCisgICBwcml2YXRlIHN0YXRpYyBQcm9kdWN0Q3Jhd2xlciBjcmVhdGVEdW1teUNyYXdsZXIoKSB7CisgICAgICByZXR1cm4gY3JlYXRlRHVtbXlDcmF3bGVyKHRydWUsIG5ldyBNZXRhZGF0YSgpLCBudWxsKTsgCisgICB9CisKKyAgIHByaXZhdGUgc3RhdGljIFByb2R1Y3RDcmF3bGVyIGNyZWF0ZUR1bW15Q3Jhd2xlcigKKyAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGFzc2VzUHJlY29uZGl0aW9ucywgZmluYWwgTWV0YWRhdGEgcHJvZHVjdE1ldGFkYXRhLAorICAgICAgICAgZmluYWwgRmlsZSByZW5hbWVkRmlsZSkgeworICAgICAgcmV0dXJuIG5ldyBQcm9kdWN0Q3Jhd2xlcigpIHsKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFzc2VzUHJlY29uZGl0aW9ucyhGaWxlIHByb2R1Y3QpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzZXNQcmVjb25kaXRpb25zOworICAgICAgICAgfQorICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwcm90ZWN0ZWQgTWV0YWRhdGEgZ2V0TWV0YWRhdGFGb3JQcm9kdWN0KEZpbGUgcHJvZHVjdCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RNZXRhZGF0YTsKKyAgICAgICAgIH0KKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHJvdGVjdGVkIEZpbGUgcmVuYW1lUHJvZHVjdChGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSkKKyAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlbmFtZWRGaWxlID09IG51bGwgPyBwcm9kdWN0IDogcmVuYW1lZEZpbGU7CisgICAgICAgICB9CisgICAgICB9OworICAgfSAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3Jhd2xlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RDcmF3bGVyQmVhbnNQcm9wSGFuZGxlci5qYXZhIGIvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jbGkvb3B0aW9uL2hhbmRsZXIvVGVzdENyYXdsZXJCZWFuc1Byb3BIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhOTBlOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3Jhd2xlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY2xpL29wdGlvbi9oYW5kbGVyL1Rlc3RDcmF3bGVyQmVhbnNQcm9wSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlcjsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5BY3Rpb25CZWFuUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkNtZExpbmVPcHRpb25JbnN0YW5jZTsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXJ9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdENyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlT3B0aW9uKCkgeworICAgICAgQWR2YW5jZWRDbWRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBBZHZhbmNlZENtZExpbmVPcHRpb24oKTsKKyAgICAgIG9wdGlvbi5zZXRTaG9ydE9wdGlvbigidCIpOworICAgICAgb3B0aW9uLnNldExvbmdPcHRpb24oInRlc3QiKTsKKyAgICAgIG9wdGlvbi5zZXRIYXNBcmdzKHRydWUpOworCisgICAgICAvLyBUZXN0IDEgdmFsdWUgc3BlY2lmaWVkLgorICAgICAgQ21kTGluZU9wdGlvbkluc3RhbmNlIGluc3RhbmNlID0gbmV3IENtZExpbmVPcHRpb25JbnN0YW5jZSgKKyAgICAgICAgICAgIG9wdGlvbiwgTGlzdHMubmV3QXJyYXlMaXN0KCJ2YWx1ZSIpKTsKKyAgICAgIENyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIoKTsKKyAgICAgIGhhbmRsZXIuaW5pdGlhbGl6ZShvcHRpb24pOworICAgICAgaGFuZGxlci5zZXRQcm9wZXJ0aWVzKExpc3RzLm5ld0FycmF5TGlzdCgiVGVzdEJlYW4ucHJvcCIpKTsKKyAgICAgIGhhbmRsZXIuaGFuZGxlT3B0aW9uKG51bGwsIGluc3RhbmNlKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBnZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBnZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIlRlc3RCZWFuLnByb3AiKSk7CisgICAgICBnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKworICAgICAgLy8gVGVzdCBtdWx0aXBsZSB2YWx1ZXMgc3BlY2lmaWVkLgorICAgICAgaW5zdGFuY2UgPSBuZXcgQ21kTGluZU9wdGlvbkluc3RhbmNlKAorICAgICAgICAgICAgb3B0aW9uLCBMaXN0cy5uZXdBcnJheUxpc3QoInZhbHVlMSIsICJ2YWx1ZTIiKSk7CisgICAgICBoYW5kbGVyID0gbmV3IENyYXdsZXJCZWFuc1Byb3BIYW5kbGVyKCk7CisgICAgICBoYW5kbGVyLmluaXRpYWxpemUob3B0aW9uKTsKKyAgICAgIGhhbmRsZXIuc2V0UHJvcGVydGllcyhMaXN0cy5uZXdBcnJheUxpc3QoIlRlc3RCZWFuLnByb3AiKSk7CisgICAgICBoYW5kbGVyLmhhbmRsZU9wdGlvbihudWxsLCBpbnN0YW5jZSk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgiVGVzdEJlYW4ucHJvcFswXSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJUZXN0QmVhbi5wcm9wWzFdIikpOworICAgICAgZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisKKyAgICAgIC8vIFRlc3Qgbm8gdmFsdWVzIHNwZWNpZmllZC4KKyAgICAgIHRyeSB7CisgICAgICAgICBpbnN0YW5jZSA9IG5ldyBDbWRMaW5lT3B0aW9uSW5zdGFuY2UoCisgICAgICAgICAgICAgICBvcHRpb24sIENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCkpOworICAgICAgICAgaGFuZGxlciA9IG5ldyBDcmF3bGVyQmVhbnNQcm9wSGFuZGxlcigpOworICAgICAgICAgaGFuZGxlci5pbml0aWFsaXplKG9wdGlvbik7CisgICAgICAgICBoYW5kbGVyLnNldFByb3BlcnRpZXMoTGlzdHMubmV3QXJyYXlMaXN0KCJUZXN0QmVhbi5wcm9wIikpOworICAgICAgICAgaGFuZGxlci5oYW5kbGVPcHRpb24obnVsbCwgaW5zdGFuY2UpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8gfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9vcHRpb24vVGVzdEJvb2xlYW5PcHRpb25zLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL29wdGlvbi9UZXN0Qm9vbGVhbk9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2QyYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9vcHRpb24vVGVzdEJvb2xlYW5PcHRpb25zLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5vcHRpb247CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuUHJvZHVjdENyYXdsZXI7IC8vIGZvciBqYXZhZG9jCisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQHNpbmNlIE9PRFQtMjQxCisgKiAKKyAqIDxwPgorICogQ2xhc3MgZW5zdXJlcyB0aGF0IGJvb2xlYW4gb3B0aW9ucyBzdWNoIGFzIC0tbm9SZWN1ciBhbmQgLS1jcmF3bEZvckRpcnMgYXJlCisgKiBzZXR0YWJsZSBpbiB7QGxpbmsgUHJvZHVjdENyYXdsZXJ9IGRlcml2YXRpdmVzCisgKiA8L3A+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGVzdEJvb2xlYW5PcHRpb25zIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFNldEJvb2xlYW5PcHRpb25zKCkgeworICAgICAgICBNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciBjcmF3bGVyID0gbmV3IE1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcmF3bGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXROb1JlY3VyIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBib29sZWFuLmNsYXNzIH0pLmludm9rZShjcmF3bGVyLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgQm9vbGVhbih0cnVlKSB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyYXdsZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldENyYXdsRm9yRGlycyIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYm9vbGVhbi5jbGFzcyB9KS5pbnZva2UoY3Jhd2xlciwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IEJvb2xlYW4odHJ1ZSkgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoY3Jhd2xlci5pc05vUmVjdXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoY3Jhd2xlci5pc0NyYXdsRm9yRGlycygpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL1Rlc3RNaW1lRXh0cmFjdG9yQ29uZmlnUmVhZGVyLmphdmEgYi8wLjEwL2NyYXdsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2NyYXdsL3R5cGVkZXRlY3Rpb24vVGVzdE1pbWVFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdlNDEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jcmF3bGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC90eXBlZGV0ZWN0aW9uL1Rlc3RNaW1lRXh0cmFjdG9yQ29uZmlnUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnR5cGVkZXRlY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5Db3B5QW5kUmV3cml0ZUV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuTWV0UmVhZGVyRXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZmlsZW5hbWluZy5QYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBNaW1lRXh0cmFjdG9yQ29uZmlnUmVhZGVyfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RNaW1lRXh0cmFjdG9yQ29uZmlnUmVhZGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIEZpbGUgbWltZVR5cGVzRmlsZTsKKyAgIHByaXZhdGUgRmlsZSBkZWZhdWx0RXh0cmFjdG9yQ29uZmlnOworICAgcHJpdmF0ZSBGaWxlIHRtcERpcjsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYm9ndXMiLCAiYm9ndXMiKTsKKyAgICAgIHRtcERpciA9IG5ldyBGaWxlKHRtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsKKyAgICAgIHRtcEZpbGUuZGVsZXRlKCk7CisgICAgICBpZiAoIXRtcERpci5ta2RpcnMoKSkgeworICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGRpcmVjdG9yeSIpOworICAgICAgfQorICAgICAgbWltZVR5cGVzRmlsZSA9IG5ldyBGaWxlKHRtcERpciwgIm1pbWUtdHlwZXMueG1sIik7CisgICAgICBGaWxlVXRpbHMudG91Y2gobWltZVR5cGVzRmlsZSk7CisgICAgICBkZWZhdWx0RXh0cmFjdG9yQ29uZmlnID0gbmV3IEZpbGUodG1wRGlyLCAiZGVmYXVsdC1leHRyYWN0b3IucHJvcGVydGllcyIpOworICAgICAgRmlsZVV0aWxzLnRvdWNoKGRlZmF1bHRFeHRyYWN0b3JDb25maWcpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBGaWxlVXRpbHMuZm9yY2VEZWxldGUodG1wRGlyKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFJlYWRXaXRoRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFN0cmluZyBuYW1pbmdDb252SWQgPSAiUGF0aFV0aWxzTkMiOworICAgICAgU3RyaW5nIGRlZmF1bHRQcmVjb25kaXRpb25JZCA9ICJUZXN0UHJlY29uZGl0aW9uIjsKKyAgICAgIFN0cmluZyBwcmVjb25kaXRpb25JZDEgPSAiUHJlY29uZGl0aW9uMSI7CisgICAgICBTdHJpbmcgcHJlY29uZGl0aW9uSWQyID0gIlByZWNvbmRpdGlvbjIiOworICAgICAgU3RyaW5nIHhtbEZpbGVDb250ZW50cyA9CisgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIKKyAgICAgICAgICsgIjxjYXM6bWltZXR5cGVtYXAgeG1sbnM6Y2FzPVwiaHR0cDovL29vZHQuanBsLm5hc3NhLmdvdi8xLjAvY2FzXCIiCisgICAgICAgICAgICAgICArICIgbWFnaWM9XCJmYWxzZVwiIG1pbWVSZXBvPVwiIgorICAgICAgICAgICAgICAgKyBtaW1lVHlwZXNGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIlwiPlxuIgorICAgICAgICAgKyAiPGRlZmF1bHQ+XG4iCisgICAgICAgICArICIgICA8bmFtaW5nQ29udmVudGlvbiBpZD1cIiIgKyBuYW1pbmdDb252SWQgKyAiXCIgLz5cbiIKKyAgICAgICAgICsgIiAgIDxleHRyYWN0b3IgY2xhc3M9XCIiCisgICAgICAgICAgICAgICArIENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSArICJcIj5cbiIKKyAgICAgICAgICsgIiAgICAgIDxjb25maWcgZmlsZT1cIiIgKyBkZWZhdWx0RXh0cmFjdG9yQ29uZmlnLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICArICJcIi8+XG4iCisgICAgICAgICArICIgICAgICA8cHJlQ29uZENvbXBhcmF0b3JzPlxuIgorICAgICAgICAgKyAiICAgICAgICAgPHByZUNvbmRDb21wYXJhdG9yIGlkPVwiIiArIGRlZmF1bHRQcmVjb25kaXRpb25JZCArICJcIi8+XG4iCisgICAgICAgICArICIgICAgICA8L3ByZUNvbmRDb21wYXJhdG9ycz5cbiIKKyAgICAgICAgICsgIiAgIDwvZXh0cmFjdG9yPlxuIgorICAgICAgICAgKyAiPC9kZWZhdWx0PlxuIgorICAgICAgICAgKyAiPG1pbWUgdHlwZT1cInNvbWUvbWltZS10eXBlXCI+XG4iCisgICAgICAgICArICIgICA8ZXh0cmFjdG9yIGNsYXNzPVwiIgorICAgICAgICAgICAgICAgKyBNZXRSZWFkZXJFeHRyYWN0b3IuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIlwiPlxuIgorICAgICAgICAgKyAiICAgICAgPGNvbmZpZyBmaWxlPVwiIiArIGRlZmF1bHRFeHRyYWN0b3JDb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIlwiLz5cbiIKKyAgICAgICAgICsgIiAgICAgIDxwcmVDb25kQ29tcGFyYXRvcnM+XG4iCisgICAgICAgICArICIgICAgICAgICA8cHJlQ29uZENvbXBhcmF0b3IgaWQ9XCIiICsgcHJlY29uZGl0aW9uSWQxICsgIlwiLz5cbiIKKyAgICAgICAgICsgIiAgICAgICAgIDxwcmVDb25kQ29tcGFyYXRvciBpZD1cIiIgKyBwcmVjb25kaXRpb25JZDIgKyAiXCIvPlxuIgorICAgICAgICAgKyAiICAgICAgPC9wcmVDb25kQ29tcGFyYXRvcnM+XG4iCisgICAgICAgICArICIgICA8L2V4dHJhY3Rvcj5cbiIKKyAgICAgICAgICsgIjwvbWltZT5cbiIKKyAgICAgICAgICsgIjwvY2FzOm1pbWV0eXBlbWFwPlxuIjsKKyAgICAgIEZpbGUgeG1sTWltZVJlcG8gPSBuZXcgRmlsZSh0bXBEaXIsICJtaW1lLXJlcG8ueG1sIik7CisgICAgICBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUoeG1sTWltZVJlcG8sIHhtbEZpbGVDb250ZW50cywgIlVURi04Iik7CisgICAgICBhc3NlcnRUcnVlKHhtbE1pbWVSZXBvLmV4aXN0cygpKTsKKyAgICAgIE1pbWVFeHRyYWN0b3JSZXBvIG1pbWVSZXBvID0gTWltZUV4dHJhY3RvckNvbmZpZ1JlYWRlci5yZWFkKAorICAgICAgICAgICAgeG1sTWltZVJlcG8uZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKG5hbWluZ0NvbnZJZCwgbWltZVJlcG8uZ2V0TmFtaW5nQ29udmVudGlvbklkKCJzb21lL21pbWUtdHlwZSIpKTsKKyAgICAgIExpc3Q8TWV0RXh0cmFjdG9yU3BlYz4gc3BlY3MgPSBtaW1lUmVwby5nZXRFeHRyYWN0b3JTcGVjc0Zvck1pbWVUeXBlKCJzb21lL21pbWUtdHlwZSIpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNwZWNzLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTWV0UmVhZGVyRXh0cmFjdG9yLmNsYXNzLAorICAgICAgICAgICAgc3BlY3MuZ2V0KDApLmdldE1ldEV4dHJhY3RvcigpLmdldENsYXNzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChwcmVjb25kaXRpb25JZDEsIHByZWNvbmRpdGlvbklkMiksCisgICAgICAgICAgICBzcGVjcy5nZXQoMCkuZ2V0UHJlQ29uZENvbXBhcmF0b3JJZHMoKSk7CisgICAgICBzcGVjcyA9IG1pbWVSZXBvLmdldEV4dHJhY3RvclNwZWNzRm9yTWltZVR5cGUoInNvbWVvdGhlci9taW1lLXR5cGUiKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBzcGVjcy5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yLmNsYXNzLAorICAgICAgICAgICAgc3BlY3MuZ2V0KDApLmdldE1ldEV4dHJhY3RvcigpLmdldENsYXNzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkZWZhdWx0UHJlY29uZGl0aW9uSWQpLAorICAgICAgICAgICAgc3BlY3MuZ2V0KDApLmdldFByZUNvbmRDb21wYXJhdG9ySWRzKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdpdGhvdXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgU3RyaW5nIG5hbWluZ0NvbnZJZCA9ICJQYXRoVXRpbHNOQyI7CisgICAgICBTdHJpbmcgcHJlY29uZGl0aW9uSWQxID0gIlByZWNvbmRpdGlvbjEiOworICAgICAgU3RyaW5nIHByZWNvbmRpdGlvbklkMiA9ICJQcmVjb25kaXRpb24yIjsKKyAgICAgIFN0cmluZyB4bWxGaWxlQ29udGVudHMgPQorICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iCisgICAgICAgICArICI8Y2FzOm1pbWV0eXBlbWFwIHhtbG5zOmNhcz1cImh0dHA6Ly9vb2R0LmpwbC5uYXNzYS5nb3YvMS4wL2Nhc1wiIgorICAgICAgICAgICAgICAgKyAiIG1hZ2ljPVwiZmFsc2VcIiBtaW1lUmVwbz1cIiIKKyAgICAgICAgICAgICAgICsgbWltZVR5cGVzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICJcIj5cbiIKKyAgICAgICAgICsgIjxtaW1lIHR5cGU9XCJzb21lL21pbWUtdHlwZVwiPlxuIgorICAgICAgICAgKyAiICAgPG5hbWluZ0NvbnZlbnRpb24gaWQ9XCIiICsgbmFtaW5nQ29udklkICsgIlwiIC8+XG4iCisgICAgICAgICArICIgICA8ZXh0cmFjdG9yIGNsYXNzPVwiIgorICAgICAgICAgICAgICAgKyBNZXRSZWFkZXJFeHRyYWN0b3IuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIlwiPlxuIgorICAgICAgICAgKyAiICAgICAgPGNvbmZpZyBmaWxlPVwiIiArIGRlZmF1bHRFeHRyYWN0b3JDb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIlwiLz5cbiIKKyAgICAgICAgICsgIiAgICAgIDxwcmVDb25kQ29tcGFyYXRvcnM+XG4iCisgICAgICAgICArICIgICAgICAgICA8cHJlQ29uZENvbXBhcmF0b3IgaWQ9XCIiICsgcHJlY29uZGl0aW9uSWQxICsgIlwiLz5cbiIKKyAgICAgICAgICsgIiAgICAgICAgIDxwcmVDb25kQ29tcGFyYXRvciBpZD1cIiIgKyBwcmVjb25kaXRpb25JZDIgKyAiXCIvPlxuIgorICAgICAgICAgKyAiICAgICAgPC9wcmVDb25kQ29tcGFyYXRvcnM+XG4iCisgICAgICAgICArICIgICA8L2V4dHJhY3Rvcj5cbiIKKyAgICAgICAgICsgIjwvbWltZT5cbiIKKyAgICAgICAgICsgIjwvY2FzOm1pbWV0eXBlbWFwPlxuIjsKKyAgICAgIEZpbGUgeG1sTWltZVJlcG8gPSBuZXcgRmlsZSh0bXBEaXIsICJtaW1lLXJlcG8ueG1sIik7CisgICAgICBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUoeG1sTWltZVJlcG8sIHhtbEZpbGVDb250ZW50cywgIlVURi04Iik7CisgICAgICBhc3NlcnRUcnVlKHhtbE1pbWVSZXBvLmV4aXN0cygpKTsKKyAgICAgIE1pbWVFeHRyYWN0b3JSZXBvIG1pbWVSZXBvID0gTWltZUV4dHJhY3RvckNvbmZpZ1JlYWRlci5yZWFkKAorICAgICAgICAgICAgeG1sTWltZVJlcG8uZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKG5hbWluZ0NvbnZJZCwgbWltZVJlcG8uZ2V0TmFtaW5nQ29udmVudGlvbklkKCJzb21lL21pbWUtdHlwZSIpKTsKKyAgICAgIExpc3Q8TWV0RXh0cmFjdG9yU3BlYz4gc3BlY3MgPSBtaW1lUmVwby5nZXRFeHRyYWN0b3JTcGVjc0Zvck1pbWVUeXBlKCJzb21lL21pbWUtdHlwZSIpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNwZWNzLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTWV0UmVhZGVyRXh0cmFjdG9yLmNsYXNzLAorICAgICAgICAgICAgc3BlY3MuZ2V0KDApLmdldE1ldEV4dHJhY3RvcigpLmdldENsYXNzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChwcmVjb25kaXRpb25JZDEsIHByZWNvbmRpdGlvbklkMiksCisgICAgICAgICAgICBzcGVjcy5nZXQoMCkuZ2V0UHJlQ29uZENvbXBhcmF0b3JJZHMoKSk7CisgICAgICBzcGVjcyA9IG1pbWVSZXBvLmdldEV4dHJhY3RvclNwZWNzRm9yTWltZVR5cGUoInNvbWVvdGhlci9taW1lLXR5cGUiKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCBzcGVjcy5zaXplKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3BvbS54bWwgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNjMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3BvbS54bWwKQEAgLTAsMCArMSwxNjYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxhcnRpZmFjdElkPmN1cmF0b3Itc2VydmljZXM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgIDxuYW1lPkNBUyBDdXJhdGlvbiBXZWIgU2VydmljZXM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5TZXJ2aWNlcyBmb3IgaW5nZXN0aW5nIGZpbGVzIGludG8gdGhlIGZpbGUgbWFuYWdlciBhbmQgaXRlcmF0aXZlbHkgZXh0cmFjdGluZyBtZXRhZGF0YS48L2Rlc2NyaXB0aW9uPgorICA8YnVpbGQ+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8dGVzdFJlc291cmNlcz4KKyAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+CisgICAgICAgIDwvdGVzdFJlc291cmNlcz4gIAorICAgIDxwbHVnaW5zPgorCQk8cGx1Z2luPgorCQkgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQubWF2ZW48L2dyb3VwSWQ+CisJCSAgICA8YXJ0aWZhY3RJZD50b21jYXQ3LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKwkJICAgIDxjb25maWd1cmF0aW9uPgorCQkgICAgICAgIDxwb3J0PjgxODE8L3BvcnQ+CisJCSAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisJCSAgICAgICAgICAgIDxDQVRBTElOQV9PUFRTPi1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSAtRGZpbGUuZW5jb2Rpbmc9VVRGLTgKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZXJ2ZXIgLVhtczE1MzZtIC1YbXgxNTM2bQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOk5ld1NpemU9MjU2bSAtWFg6TWF4TmV3U2l6ZT0yNTZtIC1YWDpQZXJtU2l6ZT0yNTZtCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6TWF4UGVybVNpemU9NTEybSAtWFg6K0Rpc2FibGVFeHBsaWNpdEdDCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6K1VzZUNvbmNNYXJrU3dlZXBHQworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOitDTVNJbmNyZW1lbnRhbE1vZGUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDorQ01TSW5jcmVtZW50YWxQYWNpbmcKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDpDTVNJbmNyZW1lbnRhbER1dHlDeWNsZU1pbj0wCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6LVRyYWNlQ2xhc3NVbmxvYWRpbmcKKwkJICAgICAgICAgICAgPC9DQVRBTElOQV9PUFRTPgorCQkgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKwkJICAgICAgICA8Y29udGV4dEZpbGU+JHtiYXNlZGlyfS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWw8L2NvbnRleHRGaWxlPgorCQkgICAgICAgIDxwYXRoPi8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfTwvcGF0aD4gIAorCQkgICAgPC9jb25maWd1cmF0aW9uPgkgICAgCisJCTwvcGx1Z2luPiAgICAKKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvTUlULUxpY2Vuc2UudHh0PC9leGNsdWRlPgorICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPiAgCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LXNzbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPiAgICAgIAorICAgICAgPHR5cGU+amFyPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jeGY8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jeGYtcnQtZnJvbnRlbmQtamF4cnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjYuMDwvdmVyc2lvbj4KKyAgIDwvZGVwZW5kZW5jeT4KKyAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnJlZmxlY3Rpb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cmVmbGVjdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjkuOS1SQzE8L3ZlcnNpb24+CisgICAgIDwvZGVwZW5kZW5jeT4gICAKKwk8ZGVwZW5kZW5jeT4KKwkgICAgPGdyb3VwSWQ+bmV0LnNmLmpzb24tbGliPC9ncm91cElkPgorCSAgICA8YXJ0aWZhY3RJZD5qc29uLWxpYjwvYXJ0aWZhY3RJZD4KKwkgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorCSAgICA8Y2xhc3NpZmllcj5qZGsxNTwvY2xhc3NpZmllcj4KKwk8L2RlcGVuZGVuY3k+ICAgICAKKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbWV0YWRhdGEvQ3VyYXRvckNvbmZNZXRLZXlzLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL21ldGFkYXRhL0N1cmF0b3JDb25mTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NWE1MWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL21ldGFkYXRhL0N1cmF0b3JDb25mTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5tZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIE1ldCBrZXlzIHVzZWQgaW4gdGhlIDxjb2RlPmNvbnRleHQueG1sPC9jb2RlPiBmaWxlIHRvIGNvbmZpZ3VyZSB0aGUgQ0FTCisgKiBjdXJhdG9yIHdlYmFwcC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ3VyYXRvckNvbmZNZXRLZXlzIHsKKworICBmaW5hbCBTdHJpbmcgTUVUX0VYVFJBQ1RPUl9DT05GX1VQTE9BRF9QQVRIID0gIm9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRFeHRyYWN0b3JDb25mLnVwbG9hZFBhdGgiOworCisgIGZpbmFsIFN0cmluZyBQT0xJQ1lfVVBMT0FEX1BBVEggPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmRhdGFEZWZpbml0aW9uLnVwbG9hZFBhdGgiOworCisgIGZpbmFsIFN0cmluZyBGTV9VUkwgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5mbS51cmwiOworCisgIGZpbmFsIFN0cmluZyBERUZBVUxUX1RSQU5TRkVSX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiOworCisgIGZpbmFsIFN0cmluZyBDUkFXTEVSX0NPTkZfRklMRSA9ICJjbGFzc3BhdGg6L29yZy5hcGFjaGUvb29kdC9jYXMvY3Jhd2wvY3Jhd2xlci1jb25maWcueG1sIjsKKworICBmaW5hbCBTdHJpbmcgU1RBR0lOR19BUkVBX1BBVEggPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnN0YWdpbmdBcmVhUGF0aCI7CisKKyAgZmluYWwgU3RyaW5nIE1FVF9BUkVBX1BBVEggPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLm1ldEFyZWFQYXRoIjsKKyAgCisgIGZpbmFsIFN0cmluZyBNRVRfRVhURU5TSU9OID0gIm9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRFeHRlbnNpb24iOworICAKKyAgZmluYWwgU3RyaW5nIEZNX1BST1BTID0gIm9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5mbVByb3BzIjsKKyAgCisgIGZpbmFsIFN0cmluZyBDQVRBTE9HX0ZBQ1RPUllfQ0xBU1MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmNhdGFsb2dGYWN0b3J5Q2xhc3MiOworICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc2VydmljZS9DdXJhdGlvblNlcnZpY2UuamF2YSBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc2VydmljZS9DdXJhdGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE0ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL0N1cmF0aW9uU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5tZXRhZGF0YS5DdXJhdG9yQ29uZk1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5TaW5nbGVTaWduT247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvL0pBWC1SUyBpbXBvcnRzCitpbXBvcnQgbmV0LnNmLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG5ldC5zZi5qc29uLkpTT05PYmplY3Q7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLyoqCisgKiAKKyAqIAorICogVGhlIE1haW4gQ3VyYXRpb24gV2ViIFNlcnZpY2UgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBiYXNpYyB0b29scyBhbmQKKyAqIGZ1bmN0aW9uYWxpdHkgZm9yIHBlcmZvcm1pbmcgaW5nZXN0aW9uIGludG8gdGhlIENBUyBmaWxlbWdyLCBhbmQgbWFuYWdlbWVudAorICogb2YgdGhlIHN0YWdpbmcgYXJlYSBmb3IgaW5nZXN0aW9uLgorICogCisgKiBAYXV0aG9yIHByYW1pcmV6CisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEN1cmF0aW9uU2VydmljZSBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMgQ3VyYXRvckNvbmZNZXRLZXlzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTM3MDY5NzU4MDU5NDY5MTY2OUw7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDdXJhdGlvblNlcnZpY2UuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworICAKKyAgcHJvdGVjdGVkIHN0YXRpYyBDdXJhdGlvblNlcnZpY2VDb25maWcgY29uZmlnID0gbnVsbDsKKyAgCisgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9KU09OID0gImpzb24iOworICAKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0hUTUwgPSAiaHRtbCI7CisgIAorICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBVTktOT1dOX09VVF9GT1JNQVQgPSAiVW5zdXBwb3J0ZWQgT3V0cHV0IEZvcm1hdCEiOworICAKKyAgcHJvdGVjdGVkIFNpbmdsZVNpZ25PbiBzc287CisKKyAgLyoqCisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAqLworICBwdWJsaWMgQ3VyYXRpb25TZXJ2aWNlKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25mKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuaW5pdChjb25mKTsKKyAgICB0aGlzLmNvbmZpZyA9IEN1cmF0aW9uU2VydmljZUNvbmZpZy5nZXRJbnN0YW5jZShjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIHRoZSBzdGFnaW5nIGFyZWEgYXMgYSBKU09OIGZvcm1hdHRlZCByZXNwb25zZSBvYmplY3QuCisgICAqIAorICAgKiBAcGFyYW0gYmFzZQorICAgKiAgICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gcmVhZCBmaWxlcyBmcm9tLCBzaG91bGQgYmUgdGhlIHN0YWdpbmcgYXJlYQorICAgKiAgICAgICAgICByb290LgorICAgKiBAcGFyYW0gcGF0aAorICAgKiAgICAgICAgICBUaGUgcGFydGljdWxhciBjaGlsZCBwYXRoIHdpdGhpbiB0aGUgc3RhZ2luZyBhcmVhLgorICAgKiBAcGFyYW0gc2hvd0ZpbGVzCisgICAqICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRvIHNob3cge0BsaW5rIEZpbGUjaXNGaWxlKCl9IGZpbGVzIG9yIG5vdC4KKyAgICogQHJldHVybiBBIFN0cmluZyByZXByZXNlbnRhdGlvbiBmb3JtYXR0aW5nIHVzaW5nCisgICAqICAgICAgICAge0BsaW5rIEpTT05PYmplY3QjdG9TdHJpbmcoKX0uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeUFyZWFBc0pTT04oU3RyaW5nIGJhc2UsIFN0cmluZyBwYXRoLAorICAgICAgYm9vbGVhbiBzaG93RmlsZXMpIHsKKyAgICBTdHJpbmcgc3RhcnRpbmdQYXRoID0gKGJhc2UgKyAiLyIgKyBwYXRoKTsKKyAgICBzdGFydGluZ1BhdGggPSBTdHJpbmdVdGlscy5yZXBsYWNlKHN0YXJ0aW5nUGF0aCwgInNvdXJjZSIsICIvIik7CisgICAgU3RyaW5nIGZbXSA9IGdldEZpbGVzSW5EaXJlY3Rvcnkoc3RhcnRpbmdQYXRoLCBzaG93RmlsZXMpOworCisgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGYubGVuZ3RoOyBpKyspIHsKKyAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgIFN0cmluZyBjaGlsZHJlbltdID0gZ2V0RmlsZXNJbkRpcmVjdG9yeShzdGFydGluZ1BhdGggKyAiLyIgKyBmW2ldLAorICAgICAgICAgIHNob3dGaWxlcyk7CisgICAgICBlbnRyeS5wdXQoInRleHQiLCBmW2ldKTsKKyAgICAgIGVudHJ5LnB1dCgiaWQiLCBwYXRoICsgIi8iICsgZltpXSk7CisgICAgICBlbnRyeS5wdXQoImV4cGFuZGVkIiwgZmFsc2UpOworICAgICAgZW50cnkucHV0KCJoYXNDaGlsZHJlbiIsIGNoaWxkcmVuICE9IG51bGwgJiYgKGNoaWxkcmVuLmxlbmd0aCA+IDApKTsKKyAgICAgIGVudHJ5LnB1dCgiaXNGaWxlIiwgbmV3IEZpbGUoc3RhcnRpbmdQYXRoICsgIi8iICsgZltpXSkuaXNGaWxlKCkpOworICAgICAgaXRlbXMuYWRkKGVudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gSlNPTkFycmF5LmZyb21PYmplY3QoaXRlbXMpLnRvU3RyaW5nKCk7CisgIH0KKworICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsZXNJbkRpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5LAorICAgICAgZmluYWwgYm9vbGVhbiBzaG93RmlsZXMpIHsKKyAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGRpcmVjdG9yeSk7CisgICAgRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworCisgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuICFuYW1lLnN0YXJ0c1dpdGgoIi4iKQorICAgICAgICAgICAgJiYgKHNob3dGaWxlcyB8fCAhbmV3IEZpbGUoZGlyLCBuYW1lKS5pc0ZpbGUoKSk7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gZGlyLmxpc3QoZmlsdGVyKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgcGFnZSwgVXJpSW5mbyB1cmlJbmZvLAorICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QodXJpSW5mby5nZXRCYXNlVXJpQnVpbGRlcigpLnBhdGgoIi4uLyIgKyBwYWdlKQorICAgICAgICAuYnVpbGQoKS50b0FTQ0lJU3RyaW5nKCkpOworICB9CisKKyAgcHJvdGVjdGVkIFN0cmluZyBjbGVhbnNlUGF0aChTdHJpbmcgcGF0aCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFN0cmluZyBuZXdQYXRoID0gcGF0aDsKKyAgICBpZiAobmV3UGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgIG5ld1BhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICB9CisgICAgbmV3UGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKG5ld1BhdGgsICJVVEYtOCIpOworICAgIHJldHVybiBuZXdQYXRoOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL0N1cmF0aW9uU2VydmljZUNvbmZpZy5qYXZhIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL0N1cmF0aW9uU2VydmljZUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzE2MDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvQ3VyYXRpb25TZXJ2aWNlQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24ubWV0YWRhdGEuQ3VyYXRvckNvbmZNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworLyoqCisgKiAKKyAqIAorICogQ29uZmlndXJlcyB0aGUge0BsaW5rIEN1cmF0aW9uU2VydmljZX0gYnkgcmVhZGluZyB0aGUgcGFyYW1ldGVycyBvdXQgb2YgdGhlCisgKiA8Y29kZT5jb250ZXh0LnhtbDwvY29kZT4gZmlsZSwgZG9pbmcgYQorICoge0BsaW5rIFBhdGhVdGlscyNyZXBsYWNlRW52VmFyaWFibGVzKFN0cmluZyl9IG9uIGVhY2ggcHJvcGVydHkgaW4gdGhlCisgKiBjb250ZXh0LnhtbC4gVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzaW5nIHRoZQorICogdHJhZGl0aW9uYWwgQ0FTIHN5bnRheCBvZjoKKyAqIAorICogPHByZT4KKyAqICAgW1ZBUl9OQU1FXSwgZS5nLiwgW0NBU19DVVJBVE9SX0hPTUVdL3NvbWUvb3RoZXIvcGF0aAorICogPC9wcmU+CisgKiAKKyAqIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHJlYWQgb25jZSB1cG9uIGxvYWRpbmcgdGhlIGluc3RhbmNlIG9mIHRoaXMKKyAqIG9iamVjdC4KKyAqIAorICogQGF1dGhvciBwcmFtaXJlegorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDdXJhdGlvblNlcnZpY2VDb25maWcgaW1wbGVtZW50cyBDdXJhdG9yQ29uZk1ldEtleXMgeworICBwcml2YXRlIHN0YXRpYyBDdXJhdGlvblNlcnZpY2VDb25maWcgaW5zdGFuY2U7CisKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICBwcml2YXRlIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbnVsbDsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEN1cmF0aW9uU2VydmljZUNvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworCisgIC8qKgorICAgKiBHZXRzIGEgc2luZ2xldG9uIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGUgZ2xvYmFsCisgICAqIHtAbGluayBDdXJhdGlvblNlcnZpY2VDb25maWd9IGZvciB0aGUgQ0FTIEN1cmF0b3IgV2ViYXBwLgorICAgKiAKKyAgICogQHBhcmFtIGNvbmYKKyAgICogICAgICAgICAgVGhlIHtAbGluayBTZXJ2bGV0Q29uZmlnfSByZWFkIG9uIHN0YXJ0dXAgb2YgdGhlIHdlYmFwcC4gVGhpcyBpcworICAgKiAgICAgICAgICB0eXBpY2FsbHkgc3BlY2lmaWVkIGluIGEgPGNvZGU+Y29udGV4dC54bWw8L2NvZGU+IGZpbGUsIGJ1dCBjYW4KKyAgICogICAgICAgICAgYWxzbyBiZSBzcGVjaWZpZWQgaW4gPGNvZGU+d2ViLnhtbDwvY29kZT4uCisgICAqIEByZXR1cm4gQSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGdsb2JhbCB7QGxpbmsgbGluaworICAgKiAgICAgICAgIEN1cmF0aW9uU2VydmljZUNvbmZpZ30uCisgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgdGhlcmUgaXMgYW55IGVycm9yIGNvbnN0cnVjdGluZyB0aGUgY29uZmlnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBDdXJhdGlvblNlcnZpY2VDb25maWcgZ2V0SW5zdGFuY2UoU2VydmxldENvbmZpZyBjb25mKSB7CisgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKKyAgICAgIGluc3RhbmNlID0gbmV3IEN1cmF0aW9uU2VydmljZUNvbmZpZyhjb25mKTsKKyAgICB9CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSBtZXRhZGF0YSBvdXRwdXQgZmlsZSBwYXRoLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNZXRBcmVhUGF0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZVBhcmFtZXRlcihNRVRfQVJFQV9QQVRIKTsKKyAgfQorICAKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gb2YgbWV0YWRhdGEgZmlsZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgY29uc3VtZWQKKyAgICogICAgICAgICBieSBDQVMgY3VyYXRvci4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0RXh0ZW5zaW9uKCkgeworICAgIHJldHVybiB0aGlzLmV2YWx1YXRlUGFyYW1ldGVyKE1FVF9FWFRFTlNJT04pOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSBwYXRoIHRvIHRoZSBzdGFnaW5nIGFyZWEgd2hlcmUgdGhlIENBUyBjdXJhdG9yIGlzIGluZ2VzdGluZworICAgKiAgICAgICAgIGZpbGVzIGZyb20uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN0YWdpbmdBcmVhUGF0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZVBhcmFtZXRlcihTVEFHSU5HX0FSRUFfUEFUSCk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gQSB7QGxpbmsgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ0FTIEZpbGUgTWFuYWdlciB7QGxpbmsgVVJMfQorICAgKiAgICAgICAgIC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU1nclVSTCgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZVBhcmFtZXRlcihGTV9VUkwpOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSBmdWxsIHtAbGluayBYbWxScGNGaWxlTWFuYWdlckNsaWVudH0gYnVpbHQgZnJvbSB0aGUgQ0FTIGN1cmF0b3IKKyAgICogICAgICAgICBwcm9wZXJ0eSA8Y29kZT5maWxlbWdyLnVybDwvY29kZT4uCisgICAqLworICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0RmlsZU1hbmFnZXJDbGllbnQoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCh0aGlzLmdldEZpbGVNZ3JVUkwoKSkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSB1cGxvYWQgcGF0aCBmb3IgbWV0YWRhdGEgZXh0cmFjdG9yIGNvbmZpZyBmaWxlcy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0RXh0ckNvbmZVcGxvYWRQYXRoKCkgeworICAgIHJldHVybiB0aGlzLmV2YWx1YXRlUGFyYW1ldGVyKE1FVF9FWFRSQUNUT1JfQ09ORl9VUExPQURfUEFUSCk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIGNyYXdsZXIgY29uZmlnIGZpbGUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENyYXdsZXJDb25mRmlsZSgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZVBhcmFtZXRlcihDUkFXTEVSX0NPTkZfRklMRSk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHBvbGljeSBkaXJlY3RvcmllcyBzaG91bGQgYmUKKyAgICogICAgICAgICB1cGxvYWRlZCB0by4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UG9saWN5VXBsb2FkUGF0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZVBhcmFtZXRlcihQT0xJQ1lfVVBMT0FEX1BBVEgpOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IENBUyBGaWxlIE1hbmFnZXIge0BsaW5rIERhdGFUcmFuc2ZlckZhY3Rvcnl9IGNsYXNzbmFtZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRyYW5zZmVyRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZVBhcmFtZXRlcihERUZBVUxUX1RSQU5TRkVSX0ZBQ1RPUlkpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSBwcm9wZXJ0eSBmcm9tIHRoZSBDQVMgQ3VyYXRvciBjb25maWcgd2l0aG91dCBjYWxsaW5nCisgICAqIHtAbGluayBQYXRoVXRpbHMjcmVwbGFjZUVudlZhcmlhYmxlcyhTdHJpbmcpfS4KKyAgICogCisgICAqIEBwYXJhbSBuYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gcmV0dXJuLgorICAgKiBAcmV0dXJuIFRoZSB1bi1ldmFsdWF0ZWQgcHJvcGVydHkgdmFsdWUgZnJvbSB0aGUgY29uZmlnLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmdldChuYW1lKTsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXRGaWxlTWdyUHJvcHMoKSB7CisgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVQYXJhbWV0ZXIoRk1fUFJPUFMpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZXZhbHVhdGVQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXModGhpcy5wYXJhbWV0ZXJzLmdldChuYW1lKSk7CisgIH0KKworICAvLyBOb3RlIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUKKyAgcHJpdmF0ZSBDdXJhdGlvblNlcnZpY2VDb25maWcoU2VydmxldENvbmZpZyBjb25mKSB7CisgICAgcmVhZENvbnRleHRQYXJhbXMoY29uZi5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKyAgICB0cnkgeworICAgICAgZm1DbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCh0aGlzLmdldEZpbGVNZ3JVUkwoKSkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIGJ1aWxkIEN1cmF0aW9uU2VydmljZUNvbmZpZzogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHJpdmF0ZSB2b2lkIHJlYWRDb250ZXh0UGFyYW1zKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICBmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gbmFtZXMgPSBjb250ZXh0LmdldEluaXRQYXJhbWV0ZXJOYW1lcygpOyBuYW1lcworICAgICAgICAuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICBwYXJhbWV0ZXJzLnB1dChuYW1lLCBjb250ZXh0LmdldEluaXRQYXJhbWV0ZXIobmFtZSkpOworICAgIH0KKyAgICBMT0cubG9nKExldmVsLklORk8sICJJbml0IFBhcmFtZXRlcnM6ICIgKyBwYXJhbWV0ZXJzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL0RpcmVjdG9yeVJlc291cmNlLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvRGlyZWN0b3J5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTVmZmFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL0RpcmVjdG9yeVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vSkFYLVJTIGltcG9ydHMKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitAUGF0aCgiZGlyZWN0b3J5IikKKy8qKgorICogCisgKiBBIHdlYiBzZXJ2aWNlIGVuZHBvaW50IHRvIGEgc2VydmljZSBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIHN0YWdpbmcgYXJlYSwgdGhlCisgKiBhcmNoaXZlIGFyZWEsIGFuZCB0aGUgbWV0IG91dHB1dCBhcmVhLgorICogCisgKiBAYXV0aG9yIHByYW1pcmV6CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBEaXJlY3RvcnlSZXNvdXJjZSBleHRlbmRzIEN1cmF0aW9uU2VydmljZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERpcmVjdG9yeVJlc291cmNlLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBAQ29udGV4dAorICBVcmlJbmZvIHVyaUluZm87CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzE1MTI2MjI3MzU3NjM3NDY0TDsKKworICBAR0VUCisgIEBQYXRoKCJzdGFnaW5nIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBzaG93U3RhZ2luZ0FyZWEoCisgICAgICBARGVmYXVsdFZhbHVlKCIvIikgQFF1ZXJ5UGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aCwKKyAgICAgIEBEZWZhdWx0VmFsdWUoInRydWUiKSBAUXVlcnlQYXJhbSgic2hvd0ZpbGVzIikgYm9vbGVhbiBzaG93RmlsZXMsCisgICAgICBARGVmYXVsdFZhbHVlKEZPUk1BVF9IVE1MKSBAUXVlcnlQYXJhbSgiZm9ybWF0IikgU3RyaW5nIGZvcm1hdCkgeworICAgIGlmIChGT1JNQVRfSFRNTC5lcXVhbHMoZm9ybWF0KSkgeworICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGhpcy5nZXREaXJlY3RvcnlBcmVhQXNIVE1MKAorICAgICAgICAgIEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0U3RhZ2luZ0FyZWFQYXRoKCksIHBhdGgsIHNob3dGaWxlcyk7CisgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorICAgIHJldHVybiB0aGlzLmdldERpcmVjdG9yeUFyZWFBc0pTT04oCisgICAgICAgIEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0U3RhZ2luZ0FyZWFQYXRoKCksIHBhdGgsIHNob3dGaWxlcyk7CisgIH0KKworICBAR0VUCisgIEBQYXRoKCJtZXRhZGF0YSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgc2hvd01ldEFyZWEoQERlZmF1bHRWYWx1ZSgiLyIpIEBRdWVyeVBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGgsCisgICAgICBARGVmYXVsdFZhbHVlKCJ0cnVlIikgQFF1ZXJ5UGFyYW0oInNob3dGaWxlcyIpIGJvb2xlYW4gc2hvd0ZpbGVzKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0RGlyZWN0b3J5QXJlYUFzSlNPTihDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldE1ldEFyZWFQYXRoKCksCisgICAgICAgIHBhdGgsIHNob3dGaWxlcyk7CisgIH0KKworICBAR0VUCisgIEBQYXRoKCJjYXRhbG9nIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBzaG93QXJjaGl2ZUFyZWEoQFF1ZXJ5UGFyYW0oInBvbGljeSIpIFN0cmluZyBwb2xpY3ksCisgICAgICBAUXVlcnlQYXJhbSgicHJvZHVjdFR5cGUiKSBTdHJpbmcgcHJvZHVjdFR5cGUsCisgICAgICBARGVmYXVsdFZhbHVlKCIyMCIpIEBRdWVyeVBhcmFtKCJudW0iKSBpbnQgbnVtYmVyT2ZSZXN1bHRzLAorICAgICAgQERlZmF1bHRWYWx1ZSgiMCIpIEBRdWVyeVBhcmFtKCJzdGFydCIpIGludCBzdGFydCkgeworCisgICAgLy8gRmlndXJlIG91dCB3aGVyZSB0aGUgcHJvZHVjdCB0eXBlIHJvb3QgcGF0aCBpcyBhbmQgZGlzcGxheSBjb250ZW50cworICAgIHJldHVybiBwcm9kdWN0VHlwZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5QXJlYUFzSFRNTChTdHJpbmcgYmFzZSwgU3RyaW5nIHBhdGgsCisgICAgICBib29sZWFuIHNob3dGaWxlcykgeworICAgIFN0cmluZ0J1ZmZlciBodG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSBudWxsOworICAgIHRyeSB7CisgICAgICByZWxhdGl2ZVBhdGggPSB0aGlzLmNsZWFuc2VQYXRoKHBhdGgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZGVjb2RpbmcgcGF0aDogWyIgKyBwYXRoICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgU3RyaW5nIHN0YXJ0aW5nUGF0aCA9IChiYXNlICsgIi8iICsgcmVsYXRpdmVQYXRoKTsKKyAgICBTdHJpbmcgZltdID0gdGhpcy5nZXRGaWxlc0luRGlyZWN0b3J5KHN0YXJ0aW5nUGF0aCwgc2hvd0ZpbGVzKTsKKworICAgIGh0bWwuYXBwZW5kKCI8dWwgY2xhc3M9XCJmaWxlVHJlZVwiPlxyXG4iKTsKKyAgICAvLyBMb29wIHRocm91Z2ggYW5kIGxpc3QgZGlyZWN0b3JpZXMgZmlyc3QuIE5pY2VyIGZvciBVSSB0byBnZXQgdGhlc2UgZmlyc3QKKworICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZi5sZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobmV3IEZpbGUoc3RhcnRpbmdQYXRoICsgIi8iICsgZltpXSkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPGxpIGNsYXNzPVwiZGlyZWN0b3J5IGNvbGxhcHNlZFwiPiIpOworICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiI1wiIHJlbD1cIiIpLmFwcGVuZChyZWxhdGl2ZVBhdGgpLmFwcGVuZCgiLyIpCisgICAgICAgICAgICAgIC5hcHBlbmQoZltpXSkuYXBwZW5kKCJcIj4iKS5hcHBlbmQoZltpXSkuYXBwZW5kKCI8L2E+Iik7CisgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvbGk+XHJcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBJZiB3ZSBhcmUgc2hvd2luZyBmaWxlcyBub3cgbG9vcCB0aHJvdWdoIGFuZCBzaG93IGZpbGVzCisgICAgICBpZiAoc2hvd0ZpbGVzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZi5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChuZXcgRmlsZShzdGFydGluZ1BhdGggKyAiLyIgKyBmW2ldKS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbmV3IEZpbGUoc3RhcnRpbmdQYXRoICsgIi8iICsgZltpXSkuZ2V0TmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIGV4dCA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxsaSBjbGFzcz1cImZpbGUgZHJhZ2d5IGV4dF8iKS5hcHBlbmQoZXh0KQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIjXCIgcmVsPVwiIikuYXBwZW5kKHJlbGF0aXZlUGF0aCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIvIikuYXBwZW5kKGZbaV0pLmFwcGVuZCgiXCI+IikuYXBwZW5kKGZbaV0pCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiPC9hPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvbGk+XHJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgfQorICAgIGh0bWwuYXBwZW5kKCI8L3VsPiIpOworCisgICAgcmV0dXJuIGh0bWwudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvSW5nZXN0aW9uUmVzb3VyY2UuamF2YSBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc2VydmljZS9Jbmdlc3Rpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTYxYmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvSW5nZXN0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zdHJ1Y3RzLkluZ2VzdGlvblRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi51dGlsLkRhdGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnV0aWwuRXh0cmFjdG9yQ29uZmlnUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuSW5nZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkluZ2VzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL0pBWC1SUyBpbXBvcnRzCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLy9KU09OIGltcG9ydHMKK2ltcG9ydCBuZXQuc2YuanNvbi5KU09OT2JqZWN0OworCisvKioKKyAqIAorICogTGV2ZXJhZ2VzIENBUyB7QGxpbmsgSW5nZXN0ZXJ9IGludGVyZmFjZSB0byBpbmdlc3QgUHJvZHVjdHMgaW50byB0aGUgQ0FTIEZpbGUKKyAqIE1hbmFnZXIgdmlhIENBUyBDdXJhdG9yIGFuZCBhIFJFU1QtZnVsIGludGVyZmFjZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK0BQYXRoKCJpbmdlc3QiKQorcHVibGljIGNsYXNzIEluZ2VzdGlvblJlc291cmNlIGV4dGVuZHMgQ3VyYXRpb25TZXJ2aWNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzUxNDE1MDc2Nzg5NzcwMDkzNkw7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoSW5nZXN0aW9uUmVzb3VyY2UuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RSQU5TRkVSX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQX1NVQ0NFU1MgPSAic3VjY2VzcyI7CisKKyAgcHJpdmF0ZSBJbmdlc3Rpb25UYXNrTGlzdCB0YXNrTGlzdDsKKworICBwdWJsaWMgSW5nZXN0aW9uUmVzb3VyY2UoKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLnRhc2tMaXN0ID0gbmV3IEluZ2VzdGlvblRhc2tMaXN0KCk7CisgICAgSW5nZXN0aW9uVGFzayB0YXNrID0gbmV3IEluZ2VzdGlvblRhc2soKTsKKyAgICB0YXNrLnNldENyZWF0ZURhdGUobmV3IERhdGUoKSk7CisKKyAgfQorCisgIEBDb250ZXh0CisgIFVyaUluZm8gdXJpSW5mbzsKKworICBAR0VUCisgIEBQYXRoKCJjcmVhdGUiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVRhc2soQFF1ZXJ5UGFyYW0oImZpbGVzIikgU3RyaW5nIGZpbGVMaXN0LAorICAgICAgQFF1ZXJ5UGFyYW0oIm51bWZpbGVzIikgSW50ZWdlciBudW1GaWxlcywKKyAgICAgIEBRdWVyeVBhcmFtKCJtZXRFeHRDZmdJZCIpIFN0cmluZyBtZXRFeHRyYWN0b3JDb25maWdJZCwKKyAgICAgIEBRdWVyeVBhcmFtKCJwb2xpY3kiKSBTdHJpbmcgcG9saWN5LAorICAgICAgQFF1ZXJ5UGFyYW0oInB0eXBlIikgU3RyaW5nIHByb2R1Y3RUeXBlKSB7CisKKyAgICBJbmdlc3Rpb25UYXNrIG5ld1Rhc2sgPSBuZXcgSW5nZXN0aW9uVGFzaygpOworICAgIG5ld1Rhc2suc2V0Q3JlYXRlRGF0ZShuZXcgRGF0ZSgpKTsKKyAgICB0cnkgeworICAgICAgbmV3VGFzay5zZXRFeHRDb25mKEV4dHJhY3RvckNvbmZpZ1JlYWRlci5yZWFkRnJvbURpcmVjdG9yeShuZXcgRmlsZSgKKyAgICAgICAgICBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldE1ldEV4dHJDb25mVXBsb2FkUGF0aCgpKSwKKyAgICAgICAgICBtZXRFeHRyYWN0b3JDb25maWdJZCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgU3RyaW5nIGVycm9yTXNnID0gIlVuYWJsZSB0byBsb2FkIGV4dHJhY3RvciBjb25maWcgZnJvbSBtZXRFeHRDZmdJZDogWyIKKyAgICAgICAgICArIG1ldEV4dHJhY3RvckNvbmZpZ0lkICsgIl0iOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBlcnJvck1zZyk7CisgICAgICByZXR1cm4gZXJyb3JNc2c7CisgICAgfQorICAgIG5ld1Rhc2suc2V0RmlsZUxpc3QoZGVkdWNlUGF0aHMoQXJyYXlzLmFzTGlzdChmaWxlTGlzdC5zcGxpdCgiLCIpKSkpOworICAgIG5ld1Rhc2suc2V0UG9saWN5KHBvbGljeSk7CisgICAgbmV3VGFzay5zZXRQcm9kdWN0VHlwZShwcm9kdWN0VHlwZSk7CisgICAgbmV3VGFzay5zZXRTdGF0dXMoSW5nZXN0aW9uVGFzay5OT1RfU1RBUlRFRCk7CisgICAgcmV0dXJuIHRoaXMudGFza0xpc3QuYWRkSW5nZXN0aW9uVGFzayhuZXdUYXNrKTsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInJlbW92ZSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyB2b2lkIHJlbW92ZVRhc2soQFF1ZXJ5UGFyYW0oInRhc2tJZCIpIFN0cmluZyBpbmdlc3RUYXNrSWQpIHsKKwkgIHRoaXMudGFza0xpc3QucmVtb3ZlSW5nZXN0aW9uVGFzayhpbmdlc3RUYXNrSWQpOworICB9CisKKyAgQEdFVAorICBAUGF0aCgibGlzdCIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgZ2V0SW5nZXN0VGFza0xpc3QoCisgICAgICBAUXVlcnlQYXJhbSgiZm9ybWF0IikgQERlZmF1bHRWYWx1ZShGT1JNQVRfSFRNTCkgU3RyaW5nIGZvcm1hdCkgeworICAgIGlmIChmb3JtYXQuZXF1YWxzKEZPUk1BVF9IVE1MKSkgeworICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlVGFza0xpc3RBc0hUTUwodGhpcy50YXNrTGlzdC5nZXRUYXNrTGlzdCgpKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdC5lcXVhbHMoRk9STUFUX0pTT04pKSB7CisgICAgICByZXR1cm4gdGhpcy5lbmNvZGVUYXNrTGlzdEFzSlNPTih0aGlzLnRhc2tMaXN0LmdldFRhc2tMaXN0KCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlVuc3VwcG9ydGVkIEZvcm1hdCEiOworICAgIH0KKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInN0YXJ0IikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBkb0luZ2VzdChAUXVlcnlQYXJhbSgidGFza0lkIikgU3RyaW5nIGluZ2VzdFRhc2tJZCkgeworICAgIEluZ2VzdGlvblRhc2sgdGFzayA9IHRoaXMudGFza0xpc3QuZ2V0SW5nZXN0aW9uVGFza0J5SWQoaW5nZXN0VGFza0lkKTsKKyAgICBpZiAodGFzayA9PSBudWxsKSB7CisgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAiVGFzayB3aXRoIElEIFsiICsgaW5nZXN0VGFza0lkCisgICAgICAgICAgKyAiXSBpcyBub3QgYmVpbmcgbWFuYWdlZCBieSB0aGlzIEluZ2VzdGlvbiBSZXNvdXJjZSEiOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBlcnJvck1zZyk7CisgICAgICByZXR1cm4gdGhpcy5lbmNvZGVJbmdlc3RSZXNwb25zZUFzSlNPTihmYWxzZSwgZXJyb3JNc2cpOworICAgIH0KKworICAgIEluZ2VzdGVyIGluZ2VzdCA9IHRoaXMuY29uZmlndXJlSW5nZXN0ZXIoKTsKKyAgICBNZXRhZGF0YVJlc291cmNlIG1ldFNlcnZpY2UgPSBuZXcgTWV0YWRhdGFSZXNvdXJjZSgpOworICAgIGZvciAoU3RyaW5nIGZpbGUgOiB0YXNrLmdldEZpbGVMaXN0KCkpIHsKKyAgICAgIE1ldGFkYXRhIGZpbGVNZXQgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIHZGaWxlUGF0aCA9IHRoaXMuZ2V0VmlydHVhbFBhdGgoQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZworICAgICAgICAgICAgLmdldFN0YWdpbmdBcmVhUGF0aCgpLCBmaWxlKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLAorICAgICAgICAgICAgIkluZ2VzdGlvblJlc291cmNlOiBnZXR0aW5nIHN0YWdpbmcgbWV0YWRhdGEgZm9yIHZpcnR1YWwgcGF0aDogWyIKKyAgICAgICAgICAgICAgICArIHZGaWxlUGF0aCArICJdIik7CisgICAgICAgIGZpbGVNZXQgPSBtZXRTZXJ2aWNlLmdldFN0YWdpbmdNZXRhZGF0YSh2RmlsZVBhdGgsIHRhc2suZ2V0RXh0Q29uZigpCisgICAgICAgICAgICAuZ2V0SWRlbnRpZmllcigpLCBmYWxzZSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVJbmdlc3RSZXNwb25zZUFzSFRNTChmYWxzZSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpbmdlc3QuaW5nZXN0KHNhZmVHZXRVcmwoQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZy5nZXRGaWxlTWdyVVJMKCkpLAorICAgICAgICAgICAgbmV3IEZpbGUoZmlsZSksIGZpbGVNZXQpOworICAgICAgfSBjYXRjaCAoSW5nZXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlSW5nZXN0UmVzcG9uc2VBc0hUTUwoZmFsc2UsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKworICAgICAgLy8gc2V0IHRhc2sgc3RhdHVzIHRvIHN1Y2Nlc3MKKyAgICAgIHRhc2suc2V0U3RhdHVzKEluZ2VzdGlvblRhc2suRklOSVNIRUQpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmVuY29kZUluZ2VzdFJlc3BvbnNlQXNIVE1MKHRydWUsIG51bGwpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlVGFza0xpc3RBc0hUTUwoTGlzdDxJbmdlc3Rpb25UYXNrPiB0YXNrTGlzdCkgeworICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICBmb3IgKEluZ2VzdGlvblRhc2sgdGFzayA6IHRhc2tMaXN0KSB7CisgICAgICBvdXQuYXBwZW5kKCI8dHI+Iik7CisgICAgICBvdXQuYXBwZW5kKCI8dGQ+Iik7CisgICAgICBvdXQuYXBwZW5kKHRhc2suZ2V0SWQoKSk7CisgICAgICBvdXQuYXBwZW5kKCI8L3RkPjx0ZD4iKTsKKyAgICAgIG91dC5hcHBlbmQoRGF0ZVV0aWxzLmdldERhdGVBc0lTTzg2MDFTdHJpbmcodGFzay5nZXRDcmVhdGVEYXRlKCkpKTsKKyAgICAgIG91dC5hcHBlbmQoIjwvdGQ+PHRkPiIpOworICAgICAgb3V0LmFwcGVuZCh0YXNrLmdldEZpbGVMaXN0KCkuc2l6ZSgpKTsKKyAgICAgIG91dC5hcHBlbmQoIjwvdGQ+PHRkPiIpOworICAgICAgb3V0LmFwcGVuZCh0YXNrLmdldFBvbGljeSgpKTsKKyAgICAgIG91dC5hcHBlbmQoIjwvdGQ+PHRkPiIpOworICAgICAgb3V0LmFwcGVuZCh0YXNrLmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgb3V0LmFwcGVuZCgiPC90ZD48dGQ+Iik7CisgICAgICBvdXQuYXBwZW5kKHRhc2suZ2V0RXh0Q29uZigpLmdldElkZW50aWZpZXIoKSk7CisgICAgICBvdXQuYXBwZW5kKCI8L3RkPjx0ZD4iKTsKKyAgICAgIG91dC5hcHBlbmQodGFzay5nZXRFeHRDb25mKCkuZ2V0Q29uZmlnRmlsZXMoKS5zaXplKCkpOworICAgICAgb3V0LmFwcGVuZCgiPC90ZD48dGQgaWQ9JyIpOworICAgICAgb3V0LmFwcGVuZCh0YXNrLmdldElkKCkpOworICAgICAgb3V0LmFwcGVuZCgiX1N0YXR1cyc+Iik7CisgICAgICBvdXQuYXBwZW5kKHRhc2suZ2V0U3RhdHVzKCkpOworICAgICAgb3V0LmFwcGVuZCgiPC90ZD4iKTsKKyAgICAgIGlmICghdGFzay5nZXRTdGF0dXMoKS5lcXVhbHMoSW5nZXN0aW9uVGFzay5GSU5JU0hFRCkpIHsKKyAgICAgICAgb3V0LmFwcGVuZCgiPHRkPjxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgcmVsPVwiX3Rhc2tpZF9cIiB2YWx1ZT1cIlN0YXJ0XCIgb25jbGljaz1cInN0YXJ0SW5nZXN0aW9uVGFzaygnIik7CisgICAgICAgIG91dC5hcHBlbmQodGFzay5nZXRJZCgpKTsKKyAgICAgICAgb3V0LmFwcGVuZCgiJylcIi8+PC90ZD4iKTsKKyAgICAgIH0gZWxzZSB7CisJCW91dC5hcHBlbmQoIjx0ZD48aW5wdXQgdHlwZT1cImJ1dHRvblwiIHJlbD1cIl90YXNraWRfXCIgdmFsdWU9XCJSZW1vdmVcIiBvbmNsaWNrPVwicmVtb3ZlSW5nZXN0aW9uVGFzaygnIik7CisJCW91dC5hcHBlbmQodGFzay5nZXRJZCgpKTsKKwkJb3V0LmFwcGVuZCgiJylcIj48L3RkPiIpOworICAgICAgfQorCisgICAgICBvdXQuYXBwZW5kKCI8L3RyPiIpOworICAgIH0KKyAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBlbmNvZGVUYXNrTGlzdEFzSlNPTihMaXN0PEluZ2VzdGlvblRhc2s+IHRhc2tMaXN0KSB7CisgICAgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBqc29uRnJpZW5kbHlUYXNrTGlzdCA9IG5ldyBWZWN0b3I8TWFwPFN0cmluZywgU3RyaW5nPj4oKTsKKyAgICBmb3IgKEluZ2VzdGlvblRhc2sgdGFzayA6IHRhc2tMaXN0KSB7CisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHRhc2tQcm9wTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICB0YXNrUHJvcE1hcC5wdXQoImlkIiwgdGFzay5nZXRJZCgpKTsKKyAgICAgIHRhc2tQcm9wTWFwLnB1dCgiY3JlYXRlRGF0ZSIsIERhdGVVdGlscy5nZXREYXRlQXNJU084NjAxU3RyaW5nKHRhc2sKKyAgICAgICAgICAuZ2V0Q3JlYXRlRGF0ZSgpKSk7CisgICAgICB0YXNrUHJvcE1hcC5wdXQoInBvbGljeSIsIHRhc2suZ2V0UG9saWN5KCkpOworICAgICAgdGFza1Byb3BNYXAucHV0KCJwcm9kdWN0VHlwZSIsIHRhc2suZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICB0YXNrUHJvcE1hcC5wdXQoInN0YXR1cyIsIHRhc2suZ2V0U3RhdHVzKCkpOworICAgICAgdGFza1Byb3BNYXAucHV0KCJmaWxlTGlzdCIsIHRhc2suZ2V0RmlsZUxpc3QoKS50b1N0cmluZygpKTsKKyAgICAgIHRhc2tQcm9wTWFwLnB1dCgiZXh0cmFjdG9yQ2xhc3MiLCB0YXNrLmdldEV4dENvbmYoKS5nZXRDbGFzc05hbWUoKSk7CisgICAgICB0YXNrUHJvcE1hcC5wdXQoImV4dHJhY3RvckNvbmZGaWxlcyIsIHRhc2suZ2V0RXh0Q29uZigpLmdldENvbmZpZ0ZpbGVzKCkKKyAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgICBqc29uRnJpZW5kbHlUYXNrTGlzdC5hZGQodGFza1Byb3BNYXApOworICAgIH0KKworICAgIEpTT05PYmplY3QgcmVzT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICByZXNPYmoucHV0KCJ0YXNrTGlzdCIsIGpzb25GcmllbmRseVRhc2tMaXN0KTsKKyAgICByZXR1cm4gcmVzT2JqLnRvU3RyaW5nKCk7CisKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGVuY29kZUluZ2VzdFJlc3BvbnNlQXNIVE1MKGJvb2xlYW4gc3VjY2VzcywgU3RyaW5nIG1zZykgeworICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgIG91dC5hcHBlbmQoIlN1Y2Nlc3MiKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0LmFwcGVuZChtc2cpOworICAgIH0KKyAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBlbmNvZGVJbmdlc3RSZXNwb25zZUFzSlNPTihib29sZWFuIHN1Y2Nlc3MsIFN0cmluZyBtc2cpIHsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIHJlc01hcC5wdXQoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKKyAgICByZXNNYXAucHV0KCJtc2ciLCBtc2cpOworICAgIEpTT05PYmplY3QgcmVzT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICByZXNPYmoucHV0QWxsKHJlc01hcCk7CisgICAgcmV0dXJuIHJlc09iai50b1N0cmluZygpOworCisgIH0KKworICBwcml2YXRlIEluZ2VzdGVyIGNvbmZpZ3VyZUluZ2VzdGVyKCkgeworICAgIFN0ZEluZ2VzdGVyIGluZ2VzdCA9IG5ldyBTdGRJbmdlc3RlcihEQVRBX1RSQU5TRkVSX1NFUlZJQ0UpOworICAgIHJldHVybiBpbmdlc3Q7CisgIH0KKworICBwcml2YXRlIFVSTCBzYWZlR2V0VXJsKFN0cmluZyB1cmxTdHIpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBVUkwodXJsU3RyKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlZHVjZVBhdGhzKExpc3Q8U3RyaW5nPiB2UGF0aHMpIHsKKyAgICBMaXN0PFN0cmluZz4gYWJzb2x1dGVQYXRocyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIFN0cmluZyBzdGFnaW5nSW5nZXN0UGF0aCA9IEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0U3RhZ2luZ0FyZWFQYXRoKCk7CisgICAgaWYgKCFzdGFnaW5nSW5nZXN0UGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICBzdGFnaW5nSW5nZXN0UGF0aCArPSAiLyI7CisgICAgfQorCisgICAgZm9yIChTdHJpbmcgdlBhdGggOiB2UGF0aHMpIHsKKyAgICAgIFN0cmluZyByZWFsUGF0aCA9IHN0YWdpbmdJbmdlc3RQYXRoICsgdlBhdGg7CisgICAgICBhYnNvbHV0ZVBhdGhzLmFkZChyZWFsUGF0aCk7CisgICAgfQorCisgICAgcmV0dXJuIGFic29sdXRlUGF0aHM7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRWaXJ0dWFsUGF0aChTdHJpbmcgc3RhZ2luZ0FyZWFQYXRoLCBTdHJpbmcgZnVsbEZpbGVQYXRoKSB7CisgICAgaW50IHN0YXJ0SWR4ID0gc3RhZ2luZ0FyZWFQYXRoLmxlbmd0aCgpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gZnVsbEZpbGVQYXRoLnN1YnN0cmluZyhzdGFydElkeCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBjbGFzcyBJbmdlc3Rpb25UYXNrTGlzdCB7CisKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJbmdlc3Rpb25UYXNrPiB0YXNrTWFwOworCisgICAgcHVibGljIEluZ2VzdGlvblRhc2tMaXN0KCkgeworICAgICAgdGhpcy50YXNrTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbmdlc3Rpb25UYXNrPigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGFkZEluZ2VzdGlvblRhc2soSW5nZXN0aW9uVGFzayB0YXNrKSB7CisgICAgICB0aGlzLnByb3ZpZGVUYXNrSWQodGFzayk7CisgICAgICB0YXNrTWFwLnB1dCh0YXNrLmdldElkKCksIHRhc2spOworICAgICAgcmV0dXJuIHRhc2suZ2V0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSW5nZXN0aW9uVGFzayhTdHJpbmcgdGFza0lkKSB7CisgICAgICB0YXNrTWFwLnJlbW92ZSh0YXNrSWQpOworICAgIH0KKworICAgIHB1YmxpYyBJbmdlc3Rpb25UYXNrIGdldEluZ2VzdGlvblRhc2tCeUlkKFN0cmluZyB0YXNrSWQpIHsKKyAgICAgIHJldHVybiB0YXNrTWFwLmdldCh0YXNrSWQpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEluZ2VzdGlvblRhc2s+IGdldFRhc2tMaXN0KCkgeworICAgICAgTGlzdDxJbmdlc3Rpb25UYXNrPiB0YXNrTGlzdCA9IEFycmF5cy5hc0xpc3QodGFza01hcC52YWx1ZXMoKS50b0FycmF5KAorICAgICAgICAgIG5ldyBJbmdlc3Rpb25UYXNrW3Rhc2tNYXAudmFsdWVzKCkuc2l6ZSgpXSkpOworICAgICAgQ29sbGVjdGlvbnMuc29ydCh0YXNrTGlzdCwgbmV3IENvbXBhcmF0b3I8SW5nZXN0aW9uVGFzaz4oKSB7CisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKEluZ2VzdGlvblRhc2sgbzEsIEluZ2VzdGlvblRhc2sgbzIpIHsKKyAgICAgICAgICBpZiAobzEuZ2V0Q3JlYXRlRGF0ZSgpLmJlZm9yZShvMi5nZXRDcmVhdGVEYXRlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfSBlbHNlIGlmIChvMS5nZXRDcmVhdGVEYXRlKCkuZXF1YWxzKG8yLmdldENyZWF0ZURhdGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIHRhc2tMaXN0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm92aWRlVGFza0lkKEluZ2VzdGlvblRhc2sgdGFzaykgeworICAgICAgVVVJRCBpZCA9IFVVSUQucmFuZG9tVVVJRCgpOworICAgICAgdGFzay5zZXRJZChpZC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvTWV0YWRhdGFSZXNvdXJjZS5qYXZhIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL01ldGFkYXRhUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VkM2RiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL01ldGFkYXRhUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDk3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8vSkFYLVJTIGltcG9ydHMKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisKKworLy9KU09OIGltcG9ydHMKK2ltcG9ydCBuZXQuc2YuanNvbi5KU09OQXJyYXk7CitpbXBvcnQgbmV0LnNmLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBuZXQuc2YuanNvbi5KU09OU2VyaWFsaXplcjsKKworCisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLkN1cmF0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnN0cnVjdHMuRXh0cmFjdG9yQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24udXRpbC5DdXJhdGlvblhtbFN0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi51dGlsLkV4dHJhY3RvckNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlhNTFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5HZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25MYXllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuU2VyaWFsaXphYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLkdlbmVyaWNNZXRhZGF0YU9iamVjdEZhY3Rvcnk7CisKKy8vU1BSSU5HIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuU3RyaW5nVXRpbHM7CisKK0BQYXRoKCJtZXRhZGF0YSIpCisvKioKKyAqIAorICogQSB3ZWItc2VydmljZSBlbmRwb2ludCBmb3IgZGVhbGluZyB3aXRoIENBUyB7QGxpbmsgTWV0YWRhdGF9IG9iamVjdC4KKyAqIAorICogQGF1dGhvciBwcmFtaXJlegorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFSZXNvdXJjZSBleHRlbmRzIEN1cmF0aW9uU2VydmljZSB7CisgIAorICBAQ29udGV4dAorICBVcmlJbmZvIHVyaUluZm87CisgIAorICBAQ29udGV4dCAKKyAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE5MzA5NDY5MjQyMTg3NjU3MjRMOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUdJTkcgPSAic3RhZ2luZyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPRyA9ICJjYXRhbG9nIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEUgPSAicHJvZHVjdFR5cGUiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFID0gInVwZGF0ZSI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEUgPSAiZGVsZXRlIjsKKyAgCisgIC8vIHNpbmdsZSBpbnN0YW5jZSBvZiBDQVMgY2F0YWxvZyBzaGFyZWQgYW1vbmcgYWxsIHJlcXVlc3RzCisgIHByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nID0gbnVsbDsKKyAgICAKKyAgcHVibGljIE1ldGFkYXRhUmVzb3VyY2UoKXsKKyAgICAKKyAgfQorCisgIHB1YmxpYyBNZXRhZGF0YVJlc291cmNlKEBDb250ZXh0IFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgCQorICB9CisKKyAgQEdFVAorICBAUGF0aChTVEFHSU5HKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdldFN0YWdpbmdNZXRhZGF0YShAUXVlcnlQYXJhbSgiaWQiKSBTdHJpbmcgaWQsCisgICAgICBARGVmYXVsdFZhbHVlKEZPUk1BVF9IVE1MKSBAUXVlcnlQYXJhbSgiZm9ybWF0IikgU3RyaW5nIGZvcm1hdCwKKyAgICAgIEBRdWVyeVBhcmFtKCJjb25maWdJZCIpIFN0cmluZyBjb25maWdJZCwKKyAgICAgIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgQFF1ZXJ5UGFyYW0oIm92ZXJ3cml0ZSIpIEJvb2xlYW4gb3ZlcndyaXRlLAorICAgICAgQENvbnRleHQgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgQENvbnRleHQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAKKyAgICAgIC8vIHRoaXMuc2VuZFJlZGlyZWN0KCJsb2dpbi5qc3AiLCB1cmlJbmZvLCByZXMpOworCisgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG51bGw7CisgICAgICAKKyAgICAgIHRyeSB7CisgICAgICAgIG1ldGFkYXRhID0gdGhpcy5nZXRTdGFnaW5nTWV0YWRhdGEoaWQsIGNvbmZpZ0lkLCBvdmVyd3JpdGUpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPVwiZXJyb3JcIj4iICsgZS5nZXRNZXNzYWdlKCkgKyAiPC9kaXY+IjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKEZPUk1BVF9IVE1MLmVxdWFscyhmb3JtYXQpKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhQXNIVE1MKG1ldGFkYXRhKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhQXNKU09OKG1ldGFkYXRhKS50b1N0cmluZygpOworICB9CisgIAorICBAR0VUCisgIEBQYXRoKCJleHRyYWN0b3IvY29uZmlnIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBnZXRNZXRFeHRyYWN0b3JDb25maWdMaXN0KAorICAgICAgQERlZmF1bHRWYWx1ZSgiIikgQFF1ZXJ5UGFyYW0oImN1cnJlbnQiKSBTdHJpbmcgY3VycmVudCwKKyAgICAgIEBEZWZhdWx0VmFsdWUoRk9STUFUX0hUTUwpIEBRdWVyeVBhcmFtKCJmb3JtYXQiKSBTdHJpbmcgZm9ybWF0KSB7CisgICAgU3RyaW5nW10gY29uZmlnSWRzID0gdGhpcy5nZXRGaWxlc0luRGlyZWN0b3J5KHRoaXMuY29uZmlnCisgICAgICAgIC5nZXRNZXRFeHRyQ29uZlVwbG9hZFBhdGgoKSwgZmFsc2UpOworCisgICAgaWYgKEZPUk1BVF9IVE1MLmVxdWFscyhmb3JtYXQpKSB7CisgICAgICByZXR1cm4gdGhpcy5nZXRFeHRyYWN0b3JDb25maWdJZHNBc0hUTUwoY29uZmlnSWRzLCBjdXJyZW50KTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuZ2V0RXh0cmFjdG9yQ29uZmlnSWRzQXNKU09OKGNvbmZpZ0lkcyk7CisgIH0KKworICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dHJhY3RvckNvbmZpZ0lkc0FzSFRNTChTdHJpbmdbXSBjb25maWdJZHMsCisgICAgICBTdHJpbmcgY3VycmVudCkgeworICAgIFN0cmluZ0J1ZmZlciBodG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnSWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBodG1sLmFwcGVuZCgiPG9wdGlvbiAiKTsKKyAgICAgIGlmIChjb25maWdJZHNbaV0uZXF1YWxzKGN1cnJlbnQpKSB7CisgICAgICAgIGh0bWwuYXBwZW5kKCJzZWxlY3RlZCAiKTsKKyAgICAgIH0KKyAgICAgIGh0bWwuYXBwZW5kKCJ2YWx1ZT1cIiIpOworICAgICAgaHRtbC5hcHBlbmQoY29uZmlnSWRzW2ldKTsKKyAgICAgIGh0bWwuYXBwZW5kKCJcIj4iKTsKKyAgICAgIGh0bWwuYXBwZW5kKGNvbmZpZ0lkc1tpXSk7CisgICAgICBodG1sLmFwcGVuZCgiPC9vcHRpb24+XHJcbiIpOworICAgIH0KKyAgICByZXR1cm4gaHRtbC50b1N0cmluZygpOworICB9CisgIAorICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dHJhY3RvckNvbmZpZ0lkc0FzSlNPTihTdHJpbmdbXSBjb25maWdJZHMpIHsKKyAgICAvLyBUT0RPOiBTdXBwb3J0IEpTT04KKyAgICByZXR1cm4gIk5vdCBJbXBsZW1lbnRlZC4uLiI7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEBwYXJhbSBpZAorICAgKiAgICAgICAgICBSZWxhdGl2ZSBwYXRoIGZyb20gc3RhZ2luZyByb290IHRvIHByb2R1Y3QuIFRoZSBtZXQgZXh0ZW5zaW9uIHdpbGwKKyAgICogICAgICAgICAgYmUgYWRkZWQgdG8gdGhpcyBpZCB0byBsb29rIHVwIGFuZCBzZWUgaWYgYSBtZXQgZmlsZSBleGlzdHMgd2l0aAorICAgKiAgICAgICAgICBpbiB0aGUgbWV0IGFyZWEuCisgICAqIEBwYXJhbSBjb25maWdJZAorICAgKiAgICAgICAgICBSZWZlcmVuY2UgdG8gdGhlIGV4dHJhY3RvciBjb25maWcuIHtAbGluayBFeHRyYWN0b3JDb25maWdSZWFkZXJ9CisgICAqICAgICAgICAgIHdpbGwgbG9hZCB0aGUgY29uZmlndXJhdGlvbgorICAgKiBAcGFyYW0gb3ZlcndyaXRlCisgICAqICAgICAgICAgIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlIGEgbWV0IGZpbGUgaWYgcHJlc2VudAorICAgKiAgICAgICAgICBpbiB0aGUgc3RhZ2luZyBhcmVhLgorICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTWV0YWRhdGF9IHJldHJpZXZlZCBmcm9tIHRoZSBtZXQgYXJlYSBwYXRoIGlmIHByZXNlbnQgb3IKKyAgICogICAgICAgICBleHRyYWN0ZWQgdXNpbmcgdGhlIG1ldCBleHRyYWN0b3IgY29uZmlnLgorICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24KKyAgICovCisgIHByb3RlY3RlZCBNZXRhZGF0YSBnZXRTdGFnaW5nTWV0YWRhdGEoU3RyaW5nIGlkLCBTdHJpbmcgY29uZmlnSWQsCisgICAgICBCb29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgIElPRXhjZXB0aW9uLCBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoY29uZmlnSWQgPT0gbnVsbCB8fCBjb25maWdJZC50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgcmV0dXJuIHRoaXMucmVhZE1ldEZpbGUoaWQgKyBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldE1ldEV4dGVuc2lvbigpKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIHJlbE1ldFBhdGggPSBpZC5zdGFydHNXaXRoKCIvIikgPyBpZCA6ICIvIiArIGlkOworICAgICAgU3RyaW5nIHBhdGhUb01ldEZpbGUgPSBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldE1ldEFyZWFQYXRoKCkKKyAgICAgICAgICArIHJlbE1ldFBhdGggKyBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldE1ldEV4dGVuc2lvbigpOworICAgICAgaWYgKCFvdmVyd3JpdGUgJiYgbmV3IEZpbGUocGF0aFRvTWV0RmlsZSkuZXhpc3RzKCkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZE1ldEZpbGUoaWQgKyBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldE1ldEV4dGVuc2lvbigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMKKyAgICAgICAgbmV3IEZpbGUocGF0aFRvTWV0RmlsZSkuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IHRoaXMucnVuTWV0RXh0cmFjdG9yKGlkLCBFeHRyYWN0b3JDb25maWdSZWFkZXIKKyAgICAgICAgICAgIC5yZWFkRnJvbURpcmVjdG9yeSgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShDdXJhdGlvblNlcnZpY2UuY29uZmlnCisgICAgICAgICAgICAgICAgLmdldE1ldEV4dHJDb25mVXBsb2FkUGF0aCgpKSwgY29uZmlnSWQpKTsKKyAgICAgICAgdGhpcy53cml0ZU1ldEZpbGUoaWQsIG1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogQHBhcmFtIGlkCisgICAqICAgICAgICAgIFJlbGF0aXZlIHBhdGggZnJvbSBzdGFnaW5nIHJvb3QgdG8gdGhlIHByb2R1Y3QKKyAgICogQHBhcmFtIGNvbmZpZworICAgKiAgICAgICAgICBDb25maWd1cmF0aW9uIHRvIHJ1biB0aGlzIG1ldCBleHRyYWN0b3IKKyAgICogQHJldHVybgorICAgKiBAdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24KKyAgICovCisgIHByb3RlY3RlZCBNZXRhZGF0YSBydW5NZXRFeHRyYWN0b3IoU3RyaW5nIGlkLCBFeHRyYWN0b3JDb25maWcgY29uZmlnKQorICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgIE1ldEV4dHJhY3RvciBtZXRFeHRyYWN0b3IgPSBHZW5lcmljTWV0YWRhdGFPYmplY3RGYWN0b3J5CisgICAgICAgIC5nZXRNZXRFeHRyYWN0b3JGcm9tQ2xhc3NOYW1lKGNvbmZpZy5nZXRDbGFzc05hbWUoKSk7CisgICAgbWV0RXh0cmFjdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnLmdldENvbmZpZ0ZpbGVzKCkuZ2V0KDApKTsKKyAgICByZXR1cm4gbWV0RXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShDdXJhdGlvblNlcnZpY2UuY29uZmlnCisgICAgICAgIC5nZXRTdGFnaW5nQXJlYVBhdGgoKQorICAgICAgICArICIvIiArIGlkKTsKKyAgfQorICAKKyAgQEdFVAorICBAUGF0aChDQVRBTE9HKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dNZXRhZGF0YShAUXVlcnlQYXJhbSgiaWQiKSBTdHJpbmcgaWQsCisgICAgICBARGVmYXVsdFZhbHVlKEZPUk1BVF9IVE1MKSBAUXVlcnlQYXJhbSgiZm9ybWF0IikgU3RyaW5nIGZvcm1hdCwKKyAgICAgIEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisKKyAgICAgIC8vIHRoaXMuc2VuZFJlZGlyZWN0KCJsb2dpbi5qc3AiLCB1cmlJbmZvLCByZXMpOworICAgICAgLy8gQ2FsbCBmaWxlIG1hbmFnZXIgdG8gZ2V0IG1ldGFkYXRhCisgICAgICBQcm9kdWN0IHByb2Q7CisgICAgICBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSBpZC5zdWJzdHJpbmcoaWQubGFzdEluZGV4T2YoIi8iKSArIDEpOworCisgICAgICB0cnkgeworICAgICAgICBwcm9kID0gQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZy5nZXRGaWxlTWFuYWdlckNsaWVudCgpLmdldFByb2R1Y3RCeUlkKAorICAgICAgICAgIHByb2R1Y3RJZCk7CisgICAgICAgIG1ldGFkYXRhID0gdGhpcy5nZXRDYXRhbG9nTWV0YWRhdGEocHJvZCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJlcnJvclwiPiIgKyBlLmdldE1lc3NhZ2UoKSArICI8L2Rpdj4iOworICAgICAgfQorCisgICAgICBpZiAoRk9STUFUX0hUTUwuZXF1YWxzKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFBc0hUTUwobWV0YWRhdGEpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFBc0pTT04obWV0YWRhdGEpLnRvU3RyaW5nKCk7CisgIH0KKworICBAUE9TVAorICBAUGF0aChDQVRBTE9HKQorICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgc2V0Q2F0YWxvZ01ldGFkYXRhKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zLAorICAgICAgQEZvcm1QYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgCQorICAgIFByb2R1Y3QgcHJvZDsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IHRoaXMuZ2V0TWV0YWRhdGFGcm9tTWFwKGZvcm1QYXJhbXMpOworICAgIAorICAgIFN0cmluZyBwcm9kdWN0SWQgPSBpZC5zdWJzdHJpbmcoaWQubGFzdEluZGV4T2YoIi8iKSArIDEpOworCisgICAgdHJ5IHsKKyAgICAgIHByb2QgPSBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldEZpbGVNYW5hZ2VyQ2xpZW50KCkuZ2V0UHJvZHVjdEJ5SWQoCisgICAgICAgICAgcHJvZHVjdElkKTsKKyAgICAgIHRoaXMudXBkYXRlQ2F0YWxvZ01ldGFkYXRhKHByb2QsIG1ldGFkYXRhKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiAiPGRpdiBjbGFzcz1cImVycm9yXCI+IiArIGUuZ2V0TWVzc2FnZSgpICsgIjwvZGl2PiI7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFBc0hUTUwobWV0YWRhdGEpOworICB9CisgIAorICBAR0VUCisgIEBQYXRoKFBST0RVQ1RfVFlQRSkKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0VHlwZU1ldGFkYXRhKEBRdWVyeVBhcmFtKCJpZCIpIFN0cmluZyBpZCwKKyAgICAgIEBEZWZhdWx0VmFsdWUoRk9STUFUX0hUTUwpIEBRdWVyeVBhcmFtKCJmb3JtYXQiKSBTdHJpbmcgZm9ybWF0LAorICAgICAgQENvbnRleHQgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgQENvbnRleHQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKworICAgIC8vIHRoaXMuc2VuZFJlZGlyZWN0KCJsb2dpbi5qc3AiLCB1cmlJbmZvLCByZXMpOworCisgICAgTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgU3RyaW5nW10gaWRQYXJ0cyA9IGlkLnNwbGl0KCIvIiwgMyk7CisgICAgU3RyaW5nIHBvbGljeSA9IGlkUGFydHNbMV07CisgICAgU3RyaW5nIHByb2R1Y3RUeXBlID0gaWRQYXJ0c1syXTsKKyAgICBwcm9kdWN0VHlwZSA9IHByb2R1Y3RUeXBlLnN1YnN0cmluZygwLCBwcm9kdWN0VHlwZS5sYXN0SW5kZXhPZigiLyIpKTsKKyAgICB0cnkgeworICAgICAgbWV0YWRhdGEgPSBnZXRQcm9kdWN0VHlwZU1ldGFkYXRhRm9yUG9saWN5KHBvbGljeSwgcHJvZHVjdFR5cGUpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJlcnJvclwiPiIgKyBlLmdldE1lc3NhZ2UoKSArICI8L2Rpdj4iOworICAgIH0KKworICAgIGlmIChGT1JNQVRfSFRNTC5lcXVhbHMoZm9ybWF0KSkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFBc0hUTUwobWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YUFzSlNPTihtZXRhZGF0YSkudG9TdHJpbmcoKTsKKyAgfQorICAKKworICBAUE9TVAorICBAUGF0aChQUk9EVUNUX1RZUEUpCisgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBzZXRQcm9kdWN0VHlwZU1ldGFkYXRhKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zKSB7CisgICAgU3RyaW5nW10gaWRQYXJ0cyA9IGZvcm1QYXJhbXMuZ2V0Rmlyc3QoImlkIikuc3BsaXQoIi8iKTsKKyAgICBTdHJpbmcgcG9saWN5ID0gaWRQYXJ0c1sxXTsKKyAgICBTdHJpbmcgcHJvZHVjdFR5cGUgPSBpZFBhcnRzWzJdOworICAgIHRyeSB7CisgICAgdGhpcy53cml0ZVByb2R1Y3RUeXBlTWV0YWRhdGEocG9saWN5LCBwcm9kdWN0VHlwZSwgdGhpcworICAgICAgICAuZ2V0TWV0YWRhdGFGcm9tTWFwKGZvcm1QYXJhbXMpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPVwiZXJyb3JcIj4iICsgZS5nZXRNZXNzYWdlKCkgKyAiPC9kaXY+IjsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgQFBPU1QKKyAgQFBhdGgoU1RBR0lORykKKyAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIHNldFN0YWdpbmdNZXRhZGF0YShNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybVBhcmFtcykgeworICAgIHRyeSB7CisgICAgICB0aGlzLndyaXRlTWV0RmlsZShmb3JtUGFyYW1zLmdldEZpcnN0KCJpZCIpLCB0aGlzCisgICAgICAgICAgLmdldE1ldGFkYXRhRnJvbU1hcChmb3JtUGFyYW1zKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiAiPGRpdiBjbGFzcz1cImVycm9yXCI+IiArIGUuZ2V0TWVzc2FnZSgpICsgIjwvZGl2PiI7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInN0YWdpbmcvaW5mbyIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YWRhdGFJbmZvKEBRdWVyeVBhcmFtKCJpZCIpIFN0cmluZyBpZCkgeworCisgICAgICByZXR1cm4gIlN0YWdpbmcgbWV0IGluZm8iOworICB9CisgIAorCisgIHByaXZhdGUgSlNPTk9iamVjdCBnZXRNZXRhZGF0YUFzSlNPTihNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgIHJldHVybiBKU09OT2JqZWN0LmZyb21PYmplY3QobWV0YWRhdGEuZ2V0SGFzaHRhYmxlKCkpOworICB9CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBnZXRNZXRhZGF0YUZyb21KU09OKFN0cmluZyBtZXRhZGF0YUpTT04pIHsKKyAgICBKU09OT2JqZWN0IGpzb24gPSAoSlNPTk9iamVjdCkgSlNPTlNlcmlhbGl6ZXIudG9KU09OKG1ldGFkYXRhSlNPTik7CisgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKworICAgIFNldDxTdHJpbmc+IGtleXMgPSBqc29uLmtleVNldCgpOworICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKKyAgICAgIExpc3QgdmFsdWVzID0gKExpc3QpIEpTT05TZXJpYWxpemVyLnRvSmF2YSgoSlNPTkFycmF5KSBqc29uLmdldChrZXkpKTsKKyAgICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKGtleSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0YWRhdGE7CisgIH0KKyAgCisgIHByaXZhdGUgTWV0YWRhdGEgZ2V0TWV0YWRhdGFGcm9tTWFwKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zKSB7CisgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAKKyAgICBmb3IgKFN0cmluZyBrZXkgOiBmb3JtUGFyYW1zLmtleVNldCgpKSB7CisgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoIm1ldGFkYXRhLiIpKSB7CisgICAgICAgIFN0cmluZyBuZXdLZXkgPSBrZXkuc3Vic3RyaW5nKGtleS5pbmRleE9mKCcuJykgKyAxKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBmb3JtUGFyYW1zLmdldChrZXkpKSB7CisgICAgICAgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEobmV3S2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIG1ldGFkYXRhOworICB9CisgIAorICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFkYXRhQXNIVE1MKE1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKKyAgICAgIHJldHVybiAiPHRhYmxlPjwvdGFibGU+IjsKKyAgICB9CisKKyAgICBTdHJpbmdCdWZmZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIGh0bWwuYXBwZW5kKCI8dGFibGU+XHJcbiIpOworICAgIGZvciAoU3RyaW5nIGtleSA6IChTZXQ8U3RyaW5nPikgbWV0YWRhdGEuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkpIHsKKyAgICAgIGh0bWwuYXBwZW5kKCIgPHRyPlxyXG4iKTsKKyAgICAgIGh0bWwuYXBwZW5kKCIgIDx0aD4iKS5hcHBlbmQoa2V5KS5hcHBlbmQoIjwvdGg+XHJcbiIpOworICAgICAgaHRtbC5hcHBlbmQoIiAgPHRkIGNsYXNzPVwiIikuYXBwZW5kKGtleSkuYXBwZW5kKCJcIj4iKTsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YShrZXkpOworICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8c3Bhbj4iKS5hcHBlbmQoaS5uZXh0KCkpLmFwcGVuZCgiPC9zcGFuPiIpOworICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBodG1sLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiAoTGlzdDxTdHJpbmc+KSBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YShrZXkpKSB7CisgICAgICB9CisgICAgICBodG1sLmFwcGVuZCgiPC90ZD5cclxuIik7CisgICAgICBodG1sLmFwcGVuZCgiIDwvdHI+XHJcbiIpOworICAgIH0KKyAgICBodG1sLmFwcGVuZCgiPC90YWJsZT5cclxuIik7CisKKyAgICByZXR1cm4gaHRtbC50b1N0cmluZygpOworICB9CisgIAorCisgIC8qKgorICAgKiBSZWFkcyBhIHtAbGluayBNZXRhZGF0YX0gb2JqZWN0IGZyb20gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSAubWV0CisgICAqIHtAbGluayBGaWxlfS4KKyAgICogCisgICAqIEBwYXJhbSBmaWxlCisgICAqICAgICAgICAgIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5tZXQge0BsaW5rIEZpbGV9LgorICAgKiBAcmV0dXJuIFRoZSByZWFkLWluIENBUyB7QGxpbmsgTWV0YWRhdGF9IG9iamVjdC4KKyAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW5zdGFudGlhdGluZyB0aGUge0BsaW5rIE1ldGFkYXRhfSBjbGFzcy4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgdGhlIC5tZXQge0BsaW5rIEZpbGV9IGlzIG5vdCBmb3VuZC4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgdGhlcmUgaXMgYW4gSU8gcHJvYmxlbSBvcGVuaW5nIHRoZSBtZXQgZmlsZS4KKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YSByZWFkTWV0RmlsZShTdHJpbmcgZmlsZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YSgiVVRGLTgiLCBmYWxzZSk7CisgICAgbWV0YWRhdGEubG9hZE1ldGFkYXRhRnJvbVhtbFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZworICAgICAgICAuZ2V0TWV0QXJlYVBhdGgoKQorICAgICAgICArICIvIiArIGZpbGUpKTsKKworICAgIHJldHVybiBtZXRhZGF0YTsKKyAgfQorCisgIC8qKgorICAgKiBSZXRyaWV2ZXMgdGhlIGNhdGFsb2dlZCB7QGxpbmsgTWV0YWRhdGF9IGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBQcm9kdWN0fS4KKyAgICogCisgICAqIEBwYXJhbSBwcm9kdWN0CisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgUHJvZHVjdH0gdG8gb2J0YWluIGNhdGFsb2dlZCB7QGxpbmsgTWV0YWRhdGF9IGZvci4KKyAgICogQHJldHVybiBUaGUgY2F0YWxvZ2VkIHtAbGluayBNZXRhZGF0YX0gZm9yIHtAbGluayBQcm9kdWN0fS4KKyAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGVyZSBpcyBhbiBlcnJvciB0YWxraW5nIHRvIHRoZSBDQVMgRmlsZSBNYW5hZ2VyCisgICAqICAgICAgICAgICB7QGxpbmsgQ2F0YWxvZ30uCisgICAqLworICBwdWJsaWMgTWV0YWRhdGEgZ2V0Q2F0YWxvZ01ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIHJldHVybiBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldEZpbGVNYW5hZ2VyQ2xpZW50KCkuZ2V0TWV0YWRhdGEoCisgICAgICAgIEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0RmlsZU1hbmFnZXJDbGllbnQoKS5nZXRQcm9kdWN0QnlJZCgKKyAgICAgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgYSBDQVMge0BsaW5rIE1ldGFkYXRhfSB7QGxpbmsgRmlsZX0gdXNpbmcgdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgICAqIAorICAgKiBAcGFyYW0gaWQKKyAgICogICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIC5tZXQgZmlsZSB0byB3cml0ZS4KKyAgICogQHBhcmFtIG1ldGFkYXRhCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgTWV0YWRhdGF9IG9iamVjdCB0byBwZXJzaXN0IGFuZCB3cml0ZSB0byBhIHtAbGluayBGaWxlfQorICAgKiAgICAgICAgICAuCisgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGUgLm1ldCB7QGxpbmsgRmlsZX0gY2Fubm90IGJlIHdyaXR0ZW4uCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFuIElPIGV4Y2VwdGlvbiB3cml0aW5nIHRoZSB7QGxpbmsgRmlsZX0uCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZU1ldEZpbGUoU3RyaW5nIGlkLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBzZXJNZXQgPSBuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEobWV0YWRhdGEsICJVVEYtOCIsCisgICAgICAgIGZhbHNlKTsKKyAgICBzZXJNZXQud3JpdGVNZXRhZGF0YVRvWG1sU3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGNvbmZpZworICAgICAgICAuZ2V0TWV0QXJlYVBhdGgoKSwgaWQgKyBjb25maWcuZ2V0TWV0RXh0ZW5zaW9uKCkpKSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBNZXRob2QgdG8gdXBkYXRlIHRoZSBjYXRhbG9nIG1ldGFkYXRhIGZvciBhIGdpdmVuIHByb2R1Y3QuIAorICAgKiBBbGwgY3VycmVudCBtZXRhZGF0YSBmaWVsZHMgd2lsbCBiZSBwcmVzZXJ2ZWQsIAorICAgKiBleGNlcHQgdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBIVFRQIFBPU1QgcmVxdWVzdCBhcyAnbWV0YWRhdGEuPGZpZWxkX25hbWU+PTxmaWVsZF92YWx1ZT4nLgorICAgKiAKKyAgICogQHBhcmFtIGlkCisgICAqIAlpZGVudGlmaWVyIG9mIENBUyBwcm9kdWN0IC0gZWl0aGVyICdpZCcgb3IgJ25hbWUnIG11c3QgYmUgc3BlY2lmaWVkCisgICAqIEBwYXJhbSBuYW1lCisgICAqIAluYW1lIG9mIENBUyBwcm9kdWN0IC0gZWl0aGVyICdpZCcgb3IgJ25hbWUnIG11c3QgYmUgc3BlY2lmaWVkCisgICAqIEBwYXJhbSBmb3JtUGFyYW1zCisgICAqIAlIVFRQIChuYW1lLCB2YWx1ZSkgZm9ybSBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVyIG5hbWVzIE1VU1Qgc3RhcnQgd2l0aCAibWV0YWRhdGEuIgorICAgKiBAcGFyYW0gcmVwbGFjZQorICAgKiAJb3B0aW9uYWwgZmxhZyBzZXQgdG8gZmFsc2UgdG8gYWRkIHRoZSBuZXcgbWV0YWRhdGEgdmFsdWVzIHRvIHRoZSBleGlzdGluZyB2YWx1ZXMsIGZvciB0aGUgZ2l2ZW4gZmxhZ3MKKyAgICovCisgIEBQT1NUCisgIEBQYXRoKFVQREFURSkKKyAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU1ldGFkYXRhKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zLCAKKwkJICBARm9ybVBhcmFtKCJpZCIpIFN0cmluZyBpZCwgCisJCSAgQEZvcm1QYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lLCAKKwkJICBARGVmYXVsdFZhbHVlKCJ0cnVlIikgQEZvcm1QYXJhbSgicmVwbGFjZSIpIGJvb2xlYW4gcmVwbGFjZSwKKwkJICBARGVmYXVsdFZhbHVlKCJmYWxzZSIpIEBGb3JtUGFyYW0oInJlbW92ZSIpIGJvb2xlYW4gcmVtb3ZlKSB7CisgIAkJICAgICAgCisgIAkvLyBuZXcgbWV0YWRhdGEgZnJvbSBIVFRQIFBPU1QgcmVxdWVzdAorICAgIE1ldGFkYXRhIG5ld01ldGFkYXRhID0gdGhpcy5nZXRNZXRhZGF0YUZyb21NYXAoZm9ybVBhcmFtcyk7CisgICAgCisgICAgLy8gY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIHJlbW90ZSBGaWxlIE1hbmFnZXIKKyAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0RmlsZU1hbmFnZXJDbGllbnQoKTsKKyAKKyAgICAvLyBlbXB0eSBtZXRhZGF0YQorICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgCisgICAgdHJ5IHsKKyAgICAKKyAgICAgIC8vIHJldHJpZXZlIHByb2R1Y3QgZnJvbSBjYXRhbG9nCisgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBudWxsOworICAgICAgaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQoaWQpKSB7CisgICAgCSAgaWQgPSBpZC5zdWJzdHJpbmcoaWQubGFzdEluZGV4T2YoIi8iKSArIDEpOworICAgIAkgIHByb2R1Y3QgPSBmbUNsaWVudC5nZXRQcm9kdWN0QnlJZChpZCk7CisgICAgICB9IGVsc2UgaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQobmFtZSkpIHsKKyAgICAJICBwcm9kdWN0ID0gZm1DbGllbnQuZ2V0UHJvZHVjdEJ5TmFtZShuYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRWl0aGVyIHRoZSBIVFRQIHBhcmFtZXRlciAnaWQnIG9yIHRoZSBIVFRQIHBhcmFtZXRlciAnbmFtZScgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgLy8gcmV0cmlldmUgZXhpc3RpbmcgbWV0YWRhdGEKKyAgICAgIG1ldGFkYXRhID0gZm1DbGllbnQuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisKKyAgICAgIC8vIHJlbW92ZSBwcm9kdWN0IHJlZmVyZW5jZXMgKGFzIHRoZXkgd2lsbCBiZSBhZGRlZCBsYXRlcikKKyAgICAgIG1ldGFkYXRhLnJlbW92ZU1ldGFkYXRhKCJyZWZlcmVuY2Vfb3JpZyIpOworICAgICAgbWV0YWRhdGEucmVtb3ZlTWV0YWRhdGEoInJlZmVyZW5jZV9kYXRhX3N0b3JlIik7CisgICAgICBtZXRhZGF0YS5yZW1vdmVNZXRhZGF0YSgicmVmZXJlbmNlX2ZpbGVTaXplIik7CisgICAgICBtZXRhZGF0YS5yZW1vdmVNZXRhZGF0YSgicmVmZXJlbmNlX21pbWVUeXBlIik7CisgICAgICAKKyAgICAgIC8vIG1lcmdlIG5ldyBhbmQgZXhpc3RpbmcgbWV0YWRhdGEKKyAgICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKG5ld01ldGFkYXRhKTsKKyAgICAgIAorICAgICAgLy8gcmVwbGFjZSBtZXRhZGF0YSB2YWx1ZXMgZm9yIGtleXMgc3BlY2lmaWVkIGluIEhUVFAgcmVxdWVzdCAobm90IG90aGVycykKKyAgICAgIGlmIChyZXBsYWNlKSB7CisgICAgCSAgZm9yIChTdHJpbmcga2V5IDogbmV3TWV0YWRhdGEuZ2V0QWxsS2V5cygpKSB7CisgICAgCQkgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShrZXksIG5ld01ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSkpOworICAgIAkgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gcmVtb3ZlIG1ldGFkYXRhIHRhZ3MKKyAgICAgIGlmIChyZW1vdmUpIHsKKwkgICAgICBmb3IgKFN0cmluZyBrZXkgOiBuZXdNZXRhZGF0YS5nZXRBbGxLZXlzKCkpIHsKKwkgICAgICAJbWV0YWRhdGEucmVtb3ZlTWV0YWRhdGEoa2V5KTsKKwkgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIGluc2VydCBvbGQgYW5kIG5ldyBtZXRhZGF0YQorICAgICAgZm1DbGllbnQudXBkYXRlTWV0YWRhdGEocHJvZHVjdCwgbWV0YWRhdGEpOworICAgICAgCisgICAgICAvLyByZXR1cm4gcHJvZHVjdCBpZCB0byBkb3duc3RyZWFtIHByb2Nlc3NvcnMKKyAgICAgIHJldHVybiAiaWQ9Iitwcm9kdWN0LmdldFByb2R1Y3RJZCgpOworICAgICAgICAgIAorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgCQorICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIC8vIHJldHVybiBlcnJvciBtZXNzYWdlCisgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oZSwgUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisKKyAgICB9CisKKyAgfQorCisgIC8qKgorICAgKiBVcGRhdGVzIHRoZSBjYXRhbG9nZWQge0BsaW5rIE1ldGFkYXRhfSBmb3IgYSB7QGxpbmsgUHJvZHVjdH0gaW4gdGhlIENBUworICAgKiBGaWxlIE1hbmFnZXIuCisgICAqIAorICAgKiBAcGFyYW0gcHJvZHVjdAorICAgKiAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3R9IHRvIHVwZGF0ZSB7QGxpbmsgTWV0YWRhdGF9IGZvci4KKyAgICogQHBhcmFtIG1ldGFkYXRhCisgICAqICAgICAgICAgIFRoZSBuZXcge0BsaW5rIE1ldGFkYXRhfSB0byBwZXJzaXN0IGludG8gdGhlIHtAbGluayBDYXRhbG9nfS4KKyAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdXBkYXRlLgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCB1cGRhdGVDYXRhbG9nTWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBuZXdNZXRhZGF0YSkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmxvYWQoCisgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZy5nZXRGaWxlTWdyUHJvcHMoKSkpOworICAgIENhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworICAgIAorICAgIE1ldGFkYXRhIG9sZE1ldGFkYXRhID0gY2F0YWxvZy5nZXRNZXRhZGF0YShwcm9kdWN0KTsKKyAgICBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IGNhdGFsb2cuZ2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCk7CisgICAgUHJvZHVjdCBuZXdQcm9kdWN0ID0gbmV3IFByb2R1Y3QocHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpLCBwcm9kdWN0CisgICAgICAgIC5nZXRQcm9kdWN0VHlwZSgpLCBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSwgcHJvZHVjdAorICAgICAgICAuZ2V0VHJhbnNmZXJTdGF0dXMoKSwgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICAvLyBDb25zdHJ1Y3RvciBpcyBidWdnZWQgYW5kIGRvZXNuJ3Qgc2V0IHRyYW5zZmVyIHN0YXR1cworICAgIG5ld1Byb2R1Y3Quc2V0VHJhbnNmZXJTdGF0dXMocHJvZHVjdC5nZXRUcmFuc2ZlclN0YXR1cygpKTsKKyAgICBjYXRhbG9nLnJlbW92ZU1ldGFkYXRhKG9sZE1ldGFkYXRhLCBwcm9kdWN0KTsKKyAgICBjYXRhbG9nLnJlbW92ZVByb2R1Y3QocHJvZHVjdCk7CisgICAgbmV3UHJvZHVjdC5zZXRQcm9kdWN0SWQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgY2F0YWxvZy5hZGRQcm9kdWN0KG5ld1Byb2R1Y3QpOworICAgIG5ld1Byb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMocmVmZXJlbmNlcyk7CisgICAgY2F0YWxvZy5hZGRQcm9kdWN0UmVmZXJlbmNlcyhuZXdQcm9kdWN0KTsKKyAgICBjYXRhbG9nLmFkZE1ldGFkYXRhKG5ld01ldGFkYXRhLCBuZXdQcm9kdWN0KTsKKyAgfQorCisgIC8qKgorICAgKiBNZXRob2QgdG8gZGVsZXRlIGEgc3BlY2lmaWMgcHJvZHVjdCBmcm9tIHRoZSBjYXRhbG9nCisgICAqIAorICAgKiBAcGFyYW0gaWQKKyAgICogCWlkZW50aWZpZXIgb2YgQ0FTIHByb2R1Y3QgLSBlaXRoZXIgJ2lkJyBvciAnbmFtZScgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICogQHBhcmFtIG5hbWUKKyAgICogCW5hbWUgb2YgQ0FTIHByb2R1Y3QgLSBlaXRoZXIgJ2lkJyBvciAnbmFtZScgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICogQHJldHVybiB0aGUgcHJvZHVjdCBJRCBvZiB0aGUgZGVsZXRlZCBwcm9kdWN0IGlmIGRlbGV0aW9uIHN1Y2Nlc3NmdWwKKyAgICovCisgIEBQT1NUCisgIEBQYXRoKERFTEVURSkKKyAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGRlbGV0ZUNhdGFsb2dNZXRhZGF0YSgKKwkJICBARm9ybVBhcmFtKCJpZCIpIFN0cmluZyBpZCwgCisJCSAgQEZvcm1QYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKSB7CisKKwkgIHRyeSB7CisJCSAgLy8gcmV0cmlldmUgcHJvZHVjdCBmcm9tIGNhdGFsb2cKKwkJICBQcm9kdWN0IHByb2R1Y3QgPSBudWxsOworCQkgIGlmIChTdHJpbmdVdGlscy5oYXNUZXh0KGlkKSkgeworCQkJICBpZCA9IGlkLnN1YnN0cmluZyhpZC5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisJCQkgIHByb2R1Y3QgPSBDdXJhdGlvblNlcnZpY2UuY29uZmlnLmdldEZpbGVNYW5hZ2VyQ2xpZW50KCkuZ2V0UHJvZHVjdEJ5SWQoaWQpOworCQkgIH0gZWxzZSBpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChuYW1lKSkgeworCQkJICBwcm9kdWN0ID0gQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZy5nZXRGaWxlTWFuYWdlckNsaWVudCgpLmdldFByb2R1Y3RCeU5hbWUobmFtZSk7CisJCSAgfSBlbHNlIHsKKwkJCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRWl0aGVyIHRoZSBIVFRQIHBhcmFtZXRlciAnaWQnIG9yIHRoZSBIVFRQIHBhcmFtZXRlciAnbmFtZScgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKwkJICB9CisKKwkJICAvLyByZW1vdmUgcHJvZHVjdCBmcm9tIGNhdGFsb2cKKwkJICB0aGlzLmRlbGV0ZUNhdGFsb2dQcm9kdWN0KHByb2R1Y3QpOworCisJCSAgLy8gcmV0dXJuIHByb2R1Y3QgaWQgdG8gZG93bnN0cmVhbSBwcm9jZXNzb3JzCisJCSAgcmV0dXJuICJpZD0iK3Byb2R1Y3QuZ2V0UHJvZHVjdElkKCk7CisKKwkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKwkJICBlLnByaW50U3RhY2tUcmFjZSgpOworCQkgIC8vIHJldHVybiBlcnJvciBtZXNzYWdlCisJCSAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKGUsIFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCisJICB9CisgIH0gIAorCisgIC8qKgorICAgKiBEZWxldGVzIGEgZ2l2ZW4gcHJvZHVjdCBmcm9tIHRoZSBjYXRhbG9nCisgICAqIAorICAgKiBAcGFyYW0gcHJvZHVjdAorICAgKiAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3R9IHRvIGRlbGV0ZQorICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3VycyBkdXJpbmcgdGhpcyBkZWxldGUgb3BlcmF0aW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgZGVsZXRlQ2F0YWxvZ1Byb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSAKKyAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENhdGFsb2dFeGNlcHRpb24geworCSAgQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZy5nZXRGaWxlTWFuYWdlckNsaWVudCgpLnJlbW92ZVByb2R1Y3QocHJvZHVjdCk7CisgIH0gIAorCisgIHByaXZhdGUgTWV0YWRhdGEgZ2V0UHJvZHVjdFR5cGVNZXRhZGF0YUZvclBvbGljeShTdHJpbmcgcG9saWN5LAorICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcm9vdFBvbGljeVBhdGggPSB0aGlzLmNsZWFuc2UoQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZworICAgICAgICAuZ2V0UG9saWN5VXBsb2FkUGF0aCgpKTsKKyAgICBTdHJpbmcgcG9saWN5UGF0aCA9IG5ldyBGaWxlKHJvb3RQb2xpY3lQYXRoICsgcG9saWN5KS50b1VSTCgpCisgICAgICAgIC50b0V4dGVybmFsRm9ybSgpOworICAgIFN0cmluZ1tdIHBvbGljaWVzID0geyBwb2xpY3lQYXRoIH07CisgICAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgcmVwTWdyID0gbmV3IFhNTFJlcG9zaXRvcnlNYW5hZ2VyKEFycmF5cworICAgICAgICAuYXNMaXN0KHBvbGljaWVzKSk7CisgICAgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUgPSByZXBNZ3IuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICAKKyAgICByZXR1cm4gcHJvZHVjdFR5cGUuZ2V0VHlwZU1ldGFkYXRhKCk7CisgIH0KKyAgCisgIHByaXZhdGUgTWV0YWRhdGEgd3JpdGVQcm9kdWN0VHlwZU1ldGFkYXRhKFN0cmluZyBwb2xpY3ksCisgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lLCBNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHJvb3RQb2xpY3lQYXRoID0gdGhpcy5jbGVhbnNlKEN1cmF0aW9uU2VydmljZS5jb25maWcKKyAgICAgICAgLmdldFBvbGljeVVwbG9hZFBhdGgoKSk7CisgICAgU3RyaW5nIHBvbGljeVBhdGggPSBuZXcgRmlsZShyb290UG9saWN5UGF0aCArIHBvbGljeSkudG9VUkwoKQorICAgICAgICAudG9FeHRlcm5hbEZvcm0oKTsKKyAgICBTdHJpbmdbXSBwb2xpY2llcyA9IHsgcG9saWN5UGF0aCB9OworICAgIFhNTFJlcG9zaXRvcnlNYW5hZ2VyIHJlcE1nciA9IG5ldyBYTUxSZXBvc2l0b3J5TWFuYWdlcihBcnJheXMKKyAgICAgICAgLmFzTGlzdChwb2xpY2llcykpOworCisgICAgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUgPSByZXBNZ3IuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICBwcm9kdWN0VHlwZS5zZXRUeXBlTWV0YWRhdGEobWV0YWRhdGEpOworICAgIAorICAgIEN1cmF0aW9uWG1sU3RydWN0RmFjdG9yeS53cml0ZVByb2R1Y3RUeXBlWG1sRG9jdW1lbnQocmVwTWdyCisgICAgICAgIC5nZXRQcm9kdWN0VHlwZXMoKSwgcm9vdFBvbGljeVBhdGggKyBwb2xpY3kgKyAiL3Byb2R1Y3QtdHlwZXMueG1sIik7CisKKyAgICAvLyByZWZyZXNoIHRoZSBjb25maWcgb24gdGhlIGZtIGVuZAorICAgIEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0RmlsZU1hbmFnZXJDbGllbnQoKS5yZWZyZXNoQ29uZmlnQW5kUG9saWN5KCk7CisgICAgCisgICAgcmV0dXJuIHByb2R1Y3RUeXBlLmdldFR5cGVNZXRhZGF0YSgpOworICB9CisgIAorICBwcml2YXRlIFN0cmluZyBjbGVhbnNlKFN0cmluZyBvcmlnUGF0aCkgeworICAgIFN0cmluZyByZXRTdHIgPSBvcmlnUGF0aDsKKyAgICBpZiAoIXJldFN0ci5lbmRzV2l0aCgiLyIpKSB7CisgICAgICByZXRTdHIgKz0gIi8iOworICAgIH0KKyAgICByZXR1cm4gcmV0U3RyOworICB9CisgIAorICAvLyBNZXRob2QgdG8gaW5zdGFudGlhdGUgdGhlIENBUyBjYXRhbG9nLCBpZiBub3QgZG9uZSBhbHJlYWR5LgorICBwcml2YXRlIHN5bmNocm9uaXplZCBDYXRhbG9nIGdldENhdGFsb2coKSB7CisgIAkKKyAgCWlmIChjYXRhbG9nPT1udWxsKSB7CisgIAkJU3RyaW5nIGNhdGFsb2dGYWN0b3J5Q2xhc3MgPSB0aGlzLmNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcihDQVRBTE9HX0ZBQ1RPUllfQ0xBU1MpOworICAJCS8vIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgCQlpZiAoIVN0cmluZ1V0aWxzLmhhc1RleHQoY2F0YWxvZ0ZhY3RvcnlDbGFzcykpCisgIAkJCWNhdGFsb2dGYWN0b3J5Q2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkiOworICAJCWNhdGFsb2cgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldENhdGFsb2dTZXJ2aWNlRnJvbUZhY3RvcnkoY2F0YWxvZ0ZhY3RvcnlDbGFzcyk7CisgIAl9CisgIAkKKyAgCXJldHVybiBjYXRhbG9nOworICB9CisgIAorICBAREVMRVRFCisgIEBQYXRoKFBST0RVQ1RfVFlQRSsiL3JlbW92ZSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBib29sZWFuIHJlbW92ZVByb2R1Y3RUeXBlKAorCQkgIEBGb3JtUGFyYW0oInBvbGljeSIpIFN0cmluZyBwb2xpY3ksIAorCQkgIEBGb3JtUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgeG1sUmVwbyA9IGdldFJlcG8ocG9saWN5KTsKKyAgICB0cnkgeworICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IHhtbFJlcG8uZ2V0UHJvZHVjdFR5cGVCeUlkKGlkKTsKKyAgICAgIHhtbFJlcG8ucmVtb3ZlUHJvZHVjdFR5cGUodHlwZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICAKKyAgQEdFVAorICBAUGF0aChQUk9EVUNUX1RZUEUrIi9wYXJlbnRtYXAiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudFR5cGVNYXAoCisgICAgICBARm9ybVBhcmFtKCJwb2xpY3kiKSBTdHJpbmcgcG9saWN5KSB7CisgICAgWE1MVmFsaWRhdGlvbkxheWVyIHZMYXllciA9IGdldFZhbGlkYXRpb25MYXllcihwb2xpY3kpOworICAgIHJldHVybiBKU09OU2VyaWFsaXplci50b0pTT04odkxheWVyLmdldFN1YlRvU3VwZXJNYXAoKSkudG9TdHJpbmcoKTsKKyAgfQorCSAKKyAgQFBPU1QKKyAgQFBhdGgoUFJPRFVDVF9UWVBFKyIvcGFyZW50L2FkZCIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBib29sZWFuIGFkZFBhcmVudEZvclByb2R1Y3RUeXBlKAorICAgICAgQEZvcm1QYXJhbSgicG9saWN5IikgU3RyaW5nIHBvbGljeSwgCisgICAgICBARm9ybVBhcmFtKCJpZCIpIFN0cmluZyBpZCwgCisgICAgICBARm9ybVBhcmFtKCJwYXJlbnRJZCIpIFN0cmluZyBwYXJlbnRJZCkgeworICAgIFhNTFZhbGlkYXRpb25MYXllciB2TGF5ZXIgPSBnZXRWYWxpZGF0aW9uTGF5ZXIocG9saWN5KTsKKyAgICBYTUxSZXBvc2l0b3J5TWFuYWdlciB4bWxSZXBvID0gZ2V0UmVwbyhwb2xpY3kpOworICAgIHRyeSB7CisgICAgICBQcm9kdWN0VHlwZSB0eXBlID0geG1sUmVwby5nZXRQcm9kdWN0VHlwZUJ5SWQoaWQpOworICAgICAgdkxheWVyLmFkZFBhcmVudEZvclByb2R1Y3RUeXBlKHR5cGUsIHBhcmVudElkKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgQERFTEVURQorICBAUGF0aChQUk9EVUNUX1RZUEUrIi9wYXJlbnQvcmVtb3ZlIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUGFyZW50Rm9yUHJvZHVjdFR5cGUoCisgICAgICBARm9ybVBhcmFtKCJwb2xpY3kiKSBTdHJpbmcgcG9saWN5LCAKKyAgICAgIEBGb3JtUGFyYW0oImlkIikgU3RyaW5nIGlkKSAKKyAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICBYTUxWYWxpZGF0aW9uTGF5ZXIgdkxheWVyID0gZ2V0VmFsaWRhdGlvbkxheWVyKHBvbGljeSk7CisgICAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgeG1sUmVwbyA9IGdldFJlcG8ocG9saWN5KTsKKyAgICB0cnkgeworICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IHhtbFJlcG8uZ2V0UHJvZHVjdFR5cGVCeUlkKGlkKTsKKyAgICAgIHZMYXllci5yZW1vdmVQYXJlbnRGb3JQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgQFBPU1QKKyAgQFBhdGgoUFJPRFVDVF9UWVBFKyIvZWxlbWVudHMvYWRkIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIGJvb2xlYW4gYWRkRWxlbWVudHNGb3JQcm9kdWN0VHlwZSgKKwkJICBARm9ybVBhcmFtKCJwb2xpY3kiKSBTdHJpbmcgcG9saWN5LCAKKwkJICBARm9ybVBhcmFtKCJpZCIpIFN0cmluZyBpZCwgIAorCQkgIEBGb3JtUGFyYW0oImVsZW1lbnRJZHMiKSBTdHJpbmcgZWxlbWVudElkcykgeworICAgIFhNTFZhbGlkYXRpb25MYXllciB2TGF5ZXIgPSBnZXRWYWxpZGF0aW9uTGF5ZXIocG9saWN5KTsKKyAgICBYTUxSZXBvc2l0b3J5TWFuYWdlciB4bWxSZXBvID0gZ2V0UmVwbyhwb2xpY3kpOworICAgIHRyeSB7CisgICAgICBQcm9kdWN0VHlwZSB0eXBlID0geG1sUmVwby5nZXRQcm9kdWN0VHlwZUJ5SWQoaWQpOworICAgICAgZm9yKFN0cmluZyBlbGVtZW50aWQ6IGVsZW1lbnRJZHMuc3BsaXQoIiwiKSkgeworICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSB2TGF5ZXIuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudGlkKTsKKyAgICAgICAgaWYoZWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGVsZW1lbnRpZCwgZWxlbWVudGlkLCAiIiwgIiIsICJBdXRvbWF0aWNhbGx5IGFkZGVkIiwgIiIpOworICAgICAgICAgIHZMYXllci5hZGRFbGVtZW50KGVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIHZMYXllci5hZGRFbGVtZW50VG9Qcm9kdWN0VHlwZSh0eXBlLCBlbGVtZW50KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIEBHRVQKKyAgQFBhdGgoUFJPRFVDVF9UWVBFKyIvZWxlbWVudHMiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRzRm9yUHJvZHVjdFR5cGUoCisJCSAgQEZvcm1QYXJhbSgicG9saWN5IikgU3RyaW5nIHBvbGljeSwgCisJCSAgQEZvcm1QYXJhbSgiaWQiKSBTdHJpbmcgaWQsIAorCQkgIEBGb3JtUGFyYW0oImRpcmVjdCIpIGJvb2xlYW4gZGlyZWN0KSB7CisgICAgWE1MVmFsaWRhdGlvbkxheWVyIHZMYXllciA9IGdldFZhbGlkYXRpb25MYXllcihwb2xpY3kpOworICAgIFhNTFJlcG9zaXRvcnlNYW5hZ2VyIHhtbFJlcG8gPSBnZXRSZXBvKHBvbGljeSk7CisgICAgdHJ5IHsKKyAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSB4bWxSZXBvLmdldFByb2R1Y3RUeXBlQnlJZChpZCk7CisgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBlbGVtZW50SWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICBmb3IoRWxlbWVudCBlbCA6IHZMYXllci5nZXRFbGVtZW50cyh0eXBlLCBkaXJlY3QpKSB7CisgICAgICAgIGVsZW1lbnRJZHMuYWRkKGVsLmdldEVsZW1lbnRJZCgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBKU09OU2VyaWFsaXplci50b0pTT04oZWxlbWVudElkcykudG9TdHJpbmcoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgCisgIEBERUxFVEUKKyAgQFBhdGgoUFJPRFVDVF9UWVBFKyIvZWxlbWVudHMvcmVtb3ZlL2FsbCIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbEVsZW1lbnRzRm9yUHJvZHVjdFR5cGUoCisJCSAgQEZvcm1QYXJhbSgicG9saWN5IikgU3RyaW5nIHBvbGljeSwgCisJCSAgQEZvcm1QYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgICBYTUxWYWxpZGF0aW9uTGF5ZXIgdkxheWVyID0gZ2V0VmFsaWRhdGlvbkxheWVyKHBvbGljeSk7CisgICAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgeG1sUmVwbyA9IGdldFJlcG8ocG9saWN5KTsKKyAgICB0cnkgeworICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IHhtbFJlcG8uZ2V0UHJvZHVjdFR5cGVCeUlkKGlkKTsKKyAgICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudExpc3QgPSB2TGF5ZXIuZ2V0RWxlbWVudHModHlwZSk7CisgICAgICBmb3IoRWxlbWVudCBlbGVtZW50OiBlbGVtZW50TGlzdCkgeworICAgICAgICB2TGF5ZXIucmVtb3ZlRWxlbWVudEZyb21Qcm9kdWN0VHlwZSh0eXBlLCBlbGVtZW50KTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVtb3ZlVW51c2VkRWxlbWVudHMoZWxlbWVudExpc3QsIHhtbFJlcG8sIHZMYXllcik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQERFTEVURQorICBAUGF0aChQUk9EVUNUX1RZUEUrIi9lbGVtZW50cy9yZW1vdmUiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGVtZW50c0ZvclByb2R1Y3RUeXBlKAorCQkgIEBGb3JtUGFyYW0oInBvbGljeSIpIFN0cmluZyBwb2xpY3ksIAorCQkgIEBGb3JtUGFyYW0oImlkIikgU3RyaW5nIGlkLCAKKwkJICBARm9ybVBhcmFtKCJlbGVtZW50SWRzIikgU3RyaW5nIGVsZW1lbnRJZHMpIHsKKyAgICBYTUxWYWxpZGF0aW9uTGF5ZXIgdkxheWVyID0gZ2V0VmFsaWRhdGlvbkxheWVyKHBvbGljeSk7CisgICAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgeG1sUmVwbyA9IGdldFJlcG8ocG9saWN5KTsKKyAgICB0cnkgeworICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IHhtbFJlcG8uZ2V0UHJvZHVjdFR5cGVCeUlkKGlkKTsKKyAgICAgIEFycmF5TGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKKyAgICAgIGZvcihTdHJpbmcgZWxlbWVudElkOiBlbGVtZW50SWRzLnNwbGl0KCIsIikpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gdkxheWVyLmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7CisgICAgICAgIGlmKGVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgIHZMYXllci5yZW1vdmVFbGVtZW50RnJvbVByb2R1Y3RUeXBlKHR5cGUsIGVsZW1lbnQpOworICAgICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy5yZW1vdmVVbnVzZWRFbGVtZW50cyhlbGVtZW50cywgeG1sUmVwbywgdkxheWVyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIEBHRVQKKyAgQFBhdGgoUFJPRFVDVF9UWVBFKyIvdHlwZXN3aXRoZWxlbWVudC97ZWxlbWVudElkfSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFR5cGVJZHNIYXZpbmdFbGVtZW50KAorCQkgIEBGb3JtUGFyYW0oInBvbGljeSIpIFN0cmluZyBwb2xpY3ksIAorCQkgIEBQYXRoUGFyYW0oImVsZW1lbnRJZCIpIFN0cmluZyBlbGVtZW50SWQpIHsKKwkgIFhNTFZhbGlkYXRpb25MYXllciB2TGF5ZXIgPSBnZXRWYWxpZGF0aW9uTGF5ZXIocG9saWN5KTsKKwkgIFhNTFJlcG9zaXRvcnlNYW5hZ2VyIHhtbFJlcG8gPSBnZXRSZXBvKHBvbGljeSk7CisJICBBcnJheUxpc3Q8U3RyaW5nPiB0eXBlaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICB0cnkgeworICAgIAkgIGZvcihQcm9kdWN0VHlwZSB0eXBlIDogeG1sUmVwby5nZXRQcm9kdWN0VHlwZXMoKSkgeworICAgIAkJICBmb3IoRWxlbWVudCBlbCA6IHZMYXllci5nZXRFbGVtZW50cyh0eXBlKSkgeworICAgIAkJCSAgaWYoZWwuZ2V0RWxlbWVudElkKCkuZXF1YWxzKGVsZW1lbnRJZCkpCisgICAgCQkJCSAgdHlwZWlkcy5hZGQodHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkpOworICAgIAkJICB9CisgICAgCSAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIEpTT05TZXJpYWxpemVyLnRvSlNPTih0eXBlaWRzKS50b1N0cmluZygpOworICB9CisgIAorICAKKyAgLyoKKyAgICogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zCisgICAqLworICBwcml2YXRlIHZvaWQgcmVtb3ZlVW51c2VkRWxlbWVudHMoTGlzdDxFbGVtZW50PiBlbGVtZW50cywgCisJCSAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgeG1sUmVwbywgWE1MVmFsaWRhdGlvbkxheWVyIHZMYXllcikgCisJCQkJICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uLCBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAvLyBSZW1vdmUgRWxlbWVudHMgdGhhdCBhcmVuJ3QgdXNlZCBpbiBhbnkgcHJvZHVjdCB0eXBlCisgICAgICBMaXN0PFByb2R1Y3RUeXBlPiBwdHlwZWxpc3QgPSB4bWxSZXBvLmdldFByb2R1Y3RUeXBlcygpOworICAgICAgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IHVzZWRFbGVtZW50SWRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOworICAgICAgZm9yKFByb2R1Y3RUeXBlIHB0eXBlOiBwdHlwZWxpc3QpIHsKKyAgICAgICAgICBMaXN0PEVsZW1lbnQ+IHB0eXBlRWxlbWVudHMgPSAKKyAgICAgICAgICAgICAgdkxheWVyLmdldEVsZW1lbnRzKHB0eXBlKTsKKyAgICAgICAgICBmb3IoRWxlbWVudCBlbDogcHR5cGVFbGVtZW50cykgeworICAgICAgICAgICAgICB1c2VkRWxlbWVudElkcy5wdXQoZWwuZ2V0RWxlbWVudElkKCksIHRydWUpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvcihFbGVtZW50IGVsOiBlbGVtZW50cykgeworICAgICAgICAgIGlmKCF1c2VkRWxlbWVudElkcy5jb250YWluc0tleShlbC5nZXRFbGVtZW50SWQoKSkpCisgICAgICAgICAgICAgdkxheWVyLnJlbW92ZUVsZW1lbnQoZWwpOworICAgICAgfQorICB9ICAKKworCXByaXZhdGUgWE1MUmVwb3NpdG9yeU1hbmFnZXIgZ2V0UmVwbyhTdHJpbmcgcG9saWN5KSB7CisJCVhNTFJlcG9zaXRvcnlNYW5hZ2VyIHhtbFJlcG8gPSBudWxsOworCQlTdHJpbmcgdXJsID0gImZpbGU6Ly8iICsgQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZy5nZXRQb2xpY3lVcGxvYWRQYXRoKCkgKyAiLyIgKyBwb2xpY3k7CisKKwkJdHJ5IHsKKwkJCXhtbFJlcG8gPSBuZXcgWE1MUmVwb3NpdG9yeU1hbmFnZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1cmwpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCQlyZXR1cm4geG1sUmVwbzsKKwl9CisKKwlwcml2YXRlIFhNTFZhbGlkYXRpb25MYXllciBnZXRWYWxpZGF0aW9uTGF5ZXIoU3RyaW5nIHBvbGljeSkgeworCQlYTUxWYWxpZGF0aW9uTGF5ZXIgdkxheWVyID0gbnVsbDsKKwkJU3RyaW5nIHVybCA9ICJmaWxlOi8vIiArIEN1cmF0aW9uU2VydmljZS5jb25maWcuZ2V0UG9saWN5VXBsb2FkUGF0aCgpICsgIi8iICsgcG9saWN5OworCisJCXRyeSB7CisJCQl2TGF5ZXIgPSBuZXcgWE1MVmFsaWRhdGlvbkxheWVyKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXJsKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiB2TGF5ZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL1BvbGljeVJlc291cmNlLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvUG9saWN5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk4NzUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL1BvbGljeVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ0VzY2FwZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlhNTFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9KQVgtUlMgaW1wb3J0cworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvL0pTT04gaW1wb3J0cworaW1wb3J0IG5ldC5zZi5qc29uLkpTT05PYmplY3Q7CisKK0BQYXRoKCJwb2xpY3kiKQorcHVibGljIGNsYXNzIFBvbGljeVJlc291cmNlIGV4dGVuZHMgQ3VyYXRpb25TZXJ2aWNlIHsKKworICBAQ29udGV4dAorICBVcmlJbmZvIHVyaUluZm87CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM3NTc0ODEyMjE1ODkyNjQ3MDlMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBvbGljeVJlc291cmNlLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlbmFtZUZpbHRlciBESVJfRklMVEVSID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIG5ldyBGaWxlKGRpciwgbmFtZSkuaXNEaXJlY3RvcnkoKQorICAgICAgICAgICYmICFuZXcgRmlsZShkaXIsIG5hbWUpLmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIik7CisgICAgfQorICB9OworICAKKyAgcHVibGljIFBvbGljeVJlc291cmNlKEBDb250ZXh0IFNlcnZsZXRDb250ZXh0IGNvbnRleHQpeworICAgIAorICB9CisKKyAgQEdFVAorICBAUGF0aCgiYnJvd3NlIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBicm93c2VDYXRhbG9nKAorICAgICAgQFF1ZXJ5UGFyYW0oInBhdGgiKSBARGVmYXVsdFZhbHVlKCIvIikgU3RyaW5nIHBhdGgsCisgICAgICBARGVmYXVsdFZhbHVlKEZPUk1BVF9IVE1MKSBAUXVlcnlQYXJhbSgiZm9ybWF0IikgU3RyaW5nIGZvcm1hdCwKKyAgICAgIEBEZWZhdWx0VmFsdWUoIjEiKSBAUXVlcnlQYXJhbSgicGFnZU51bSIpIEludGVnZXIgcGFnZU51bSwKKyAgICAgIEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAKKyAgICAvLyBUT0RPOiBTZW5kIGEgbm90IGF1dGhvcml6ZWQgcmVzcG9uc2UgaWYgbm90IGxvZ2dlZCBpbi4gVGhpcyBzaG91bGQgYmUgYQorICAgIC8vIHV0aWxpdHkgbWV0aG9kIGFzIGEgcGFydCBvZiBDdXJhdGlvblNlcnZpY2UgdGhhdCBldmVyeSBzZXJ2aWNlIGludGVyZmFjZQorICAgIC8vIGNhbGxzLgorCisgICAgU3RyaW5nW10gcGF0aFRva3MgPSB0b2tlbml6ZVZpcnR1YWxQYXRoKHBhdGgpOworICAgIFN0cmluZyBwb2xpY3kgPSBudWxsOworICAgIFN0cmluZyBwcm9kdWN0VHlwZSA9IG51bGw7CisKKyAgICBpZiAocGF0aFRva3MgPT0gbnVsbCkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAibWFsZm9ybWVkIHBhdGggdG9rZW4gc3RyaW5nOiAiCisgICAgICAgICAgKyBBcnJheXMuYXNMaXN0KHBhdGhUb2tzKSk7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgcG9saWN5ID0gcGF0aFRva3MubGVuZ3RoID4gMCA/IHBhdGhUb2tzWzBdOm51bGw7CisgICAgcHJvZHVjdFR5cGUgPSBwYXRoVG9rcy5sZW5ndGggPiAxID8gcGF0aFRva3NbMV0gOiBudWxsOworCisgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7CisgICAgICBpZiAocHJvZHVjdFR5cGUgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZ2V0UHJvZHVjdHNGb3JQcm9kdWN0VHlwZShwb2xpY3ksIHByb2R1Y3RUeXBlLCBmb3JtYXQsIHBhZ2VOdW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2R1Y3RUeXBlc0ZvclBvbGljeShwb2xpY3ksIGZvcm1hdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnZXRQb2xpY2llcyhmb3JtYXQpOworICAgIH0KKworICB9CisgIAorICBwcml2YXRlIFN0cmluZyBnZXRQcm9kdWN0c0ZvclByb2R1Y3RUeXBlKFN0cmluZyBwb2xpY3ksCisgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lLAorICAgICAgU3RyaW5nIGZvcm1hdCwgaW50IHBhZ2VOdW0pIHsKKyAgICAKKyAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZTsKKyAgICBQcm9kdWN0UGFnZSBwYWdlOworICAgIHRyeSB7CisgICAgICBwcm9kdWN0VHlwZSA9IHRoaXMuY29uZmlnLmdldEZpbGVNYW5hZ2VyQ2xpZW50KCkuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoCisgICAgICAgICAgcHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgIHBhZ2UgPSB0aGlzLmNvbmZpZy5nZXRGaWxlTWFuYWdlckNsaWVudCgpLnBhZ2VkUXVlcnkobmV3IFF1ZXJ5KCksCisgICAgICAgICAgcHJvZHVjdFR5cGUsIHBhZ2VOdW0pOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIG9idGFpbiBwcm9kdWN0cyBmb3IgcHJvZHVjdCB0eXBlOiBbIgorICAgICAgICAgICsgcHJvZHVjdFR5cGVOYW1lICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5lcXVhbHMoRk9STUFUX0hUTUwpKSB7CisgICAgICByZXR1cm4gZW5jb2RlUHJvZHVjdHNBc0hUTUwocGFnZSwgcG9saWN5LCBwcm9kdWN0VHlwZU5hbWUpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0LmVxdWFscyhGT1JNQVRfSlNPTikpIHsKKyAgICAgIHJldHVybiBlbmNvZGVQcm9kdWN0c0FzSlNPTihwYWdlLCBwb2xpY3ksIHByb2R1Y3RUeXBlTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBVTktOT1dOX09VVF9GT1JNQVQ7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIFN0cmluZyBlbmNvZGVQcm9kdWN0c0FzSFRNTChQcm9kdWN0UGFnZSBwYWdlLCBTdHJpbmcgcG9saWN5LAorICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgIFN0cmluZ0J1ZmZlciBodG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGh0bWwuYXBwZW5kKCI8dWwgY2xhc3M9XCJmaWxlVHJlZVwiID5cclxuIik7CisgICAgCisgICAgZm9yIChQcm9kdWN0IHByb2R1Y3QgOiBwYWdlLmdldFBhZ2VQcm9kdWN0cygpKSB7CisgICAgICBodG1sLmFwcGVuZCgiIDxsaSBjbGFzcz1cImZpbGVcIj4iKTsKKyAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiI1wiIHJlbD1cIi8iKTsKKyAgICAgIGh0bWwuYXBwZW5kKHBvbGljeSk7CisgICAgICBodG1sLmFwcGVuZCgiLyIpOworICAgICAgaHRtbC5hcHBlbmQocHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgIGh0bWwuYXBwZW5kKCIvIik7CisgICAgICBodG1sLmFwcGVuZChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgIGh0bWwuYXBwZW5kKCJcIj4iKTsKKyAgICAgIGh0bWwuYXBwZW5kKHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICBodG1sLmFwcGVuZCgiPC9hPiIpOworICAgICAgaHRtbC5hcHBlbmQoIjwvbGk+XHJcbiIpOworICAgIH0KKworICAgIGh0bWwuYXBwZW5kKCI8L3VsPiIpOworICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgIH0KKyAgCisgIHByaXZhdGUgU3RyaW5nIGVuY29kZVByb2R1Y3RzQXNKU09OKFByb2R1Y3RQYWdlIHBhZ2UsIFN0cmluZyBwb2xpY3ksCisgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKSB7CisgICAgcmV0dXJuICJOT1QgSU1QTEVOVEVEIFlFVCI7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRQb2xpY2llcyhTdHJpbmcgZm9ybWF0KSB7CisgICAgU3RyaW5nIHBvbGljeVBhdGggPSB0aGlzLmNsZWFuc2UoQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZworICAgICAgICAuZ2V0UG9saWN5VXBsb2FkUGF0aCgpKTsKKyAgICBTdHJpbmdbXSBwb2xpY3lEaXJzID0gbmV3IEZpbGUocG9saWN5UGF0aCkubGlzdChESVJfRklMVEVSKTsKKworICAgIGlmIChmb3JtYXQuZXF1YWxzKEZPUk1BVF9IVE1MKSkgeworICAgICAgcmV0dXJuIGVuY29kZVBvbGljaWVzQXNIVE1MKHBvbGljeURpcnMpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0LmVxdWFscyhGT1JNQVRfSlNPTikpIHsKKyAgICAgIHJldHVybiBlbmNvZGVQb2xpY2llc0FzSlNPTihwb2xpY3lEaXJzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFVOS05PV05fT1VUX0ZPUk1BVDsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFByb2R1Y3RUeXBlc0ZvclBvbGljeShTdHJpbmcgcG9saWN5LCBTdHJpbmcgZm9ybWF0KSB7CisgICAgU3RyaW5nW10gdHlwZU5hbWVzID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgdHlwZU5hbWVzID0gdGhpcy5nZXRQcm9kdWN0VHlwZU5hbWVzRm9yUG9saWN5KHBvbGljeSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCB0eXBlIG5hbWVzIGZvciBwb2xpY3k6IFsiICsgcG9saWN5CisgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5lcXVhbHMoRk9STUFUX0hUTUwpKSB7CisgICAgICByZXR1cm4gZW5jb2RlUHJvZHVjdFR5cGVzQXNIVE1MKHBvbGljeSwgdHlwZU5hbWVzKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdC5lcXVhbHMoRk9STUFUX0pTT04pKSB7CisgICAgICByZXR1cm4gZW5jb2RlUHJvZHVjdFR5cGVzQXNKU09OKHBvbGljeSwgdHlwZU5hbWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFVOS05PV05fT1VUX0ZPUk1BVDsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGVuY29kZVBvbGljaWVzQXNIVE1MKFN0cmluZ1tdIHBvbGljeURpcnMpIHsKKyAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIG91dC5hcHBlbmQoIjx1bCBjbGFzcz1cImZpbGVUcmVlXCIgPiIpOworICAgIGZvciAoU3RyaW5nIHBvbGljeSA6IHBvbGljeURpcnMpIHsKKyAgICAgIG91dC5hcHBlbmQoIjxsaSBjbGFzcz1cImRpcmVjdG9yeSBjb2xsYXBzZWRcIj48YSBocmVmPVwiI1wiIHJlbD1cIi8iKTsKKyAgICAgIG91dC5hcHBlbmQoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSHRtbChwb2xpY3kpKTsKKyAgICAgIG91dC5hcHBlbmQoIi9cIj4iKTsKKyAgICAgIG91dC5hcHBlbmQoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSHRtbChwb2xpY3kpKTsKKyAgICAgIG91dC5hcHBlbmQoIjwvYT48L2xpPiIpOworICAgIH0KKyAgICBvdXQuYXBwZW5kKCI8L3VsPiIpOworICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGVuY29kZVBvbGljaWVzQXNKU09OKFN0cmluZ1tdIHBvbGljeURpcnMpIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJldE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGZvciAoU3RyaW5nIHBvbGljeURpciA6IHBvbGljeURpcnMpIHsKKyAgICAgIHJldE1hcC5wdXQoInBvbGljeSIsIHBvbGljeURpcik7CisgICAgfQorICAgIEpTT05PYmplY3QgcmVzT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICByZXNPYmoucHV0KCJwb2xpY2llcyIsIHJldE1hcCk7CisgICAgcmVzT2JqLnB1dCgic3VjY2VlZCIsIHRydWUpOworICAgIHJldHVybiByZXNPYmoudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGVuY29kZVByb2R1Y3RUeXBlc0FzSFRNTChTdHJpbmcgcG9saWN5LCBTdHJpbmdbXSB0eXBlTmFtZXMpIHsKKyAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIG91dC5hcHBlbmQoIjx1bCBjbGFzcz1cImZpbGVUcmVlXCIgPiIpOworICAgIGZvciAoU3RyaW5nIHR5cGUgOiB0eXBlTmFtZXMpIHsKKyAgICAgIG91dAorICAgICAgICAgIC5hcHBlbmQoIjxsaSBjbGFzcz1cImRpcmVjdG9yeSBjb2xsYXBzZWQgcHJvZHVjdFR5cGVcIj48YSBocmVmPVwiI1wiIHJlbD1cIi8iKTsKKyAgICAgIG91dC5hcHBlbmQoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSHRtbChwb2xpY3kpKTsKKyAgICAgIG91dC5hcHBlbmQoIi8iKTsKKyAgICAgIG91dC5hcHBlbmQoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSHRtbCh0eXBlKSk7CisgICAgICBvdXQuYXBwZW5kKCIvXCI+Iik7CisgICAgICBvdXQuYXBwZW5kKFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUh0bWwodHlwZSkpOworICAgICAgb3V0LmFwcGVuZCgiPC9hPjwvbGk+Iik7CisgICAgfQorCisgICAgb3V0LmFwcGVuZCgiPC91bD4iKTsKKyAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBlbmNvZGVQcm9kdWN0VHlwZXNBc0pTT04oU3RyaW5nIHBvbGljeSwgU3RyaW5nW10gdHlwZU5hbWVzKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICByZXRNYXAucHV0KCJwb2xpY3kiLCBwb2xpY3kpOworICAgIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUxpc3QgPSBuZXcgVmVjdG9yPE1hcDxTdHJpbmcsIFN0cmluZz4+KCk7CisgICAgZm9yIChTdHJpbmcgdHlwZU5hbWUgOiB0eXBlTmFtZXMpIHsKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgdHlwZU1hcC5wdXQoIm5hbWUiLCB0eXBlTmFtZSk7CisgICAgICB0eXBlTGlzdC5hZGQodHlwZU1hcCk7CisgICAgfQorICAgIHJldE1hcC5wdXQoInByb2R1Y3RUeXBlcyIsIHR5cGVMaXN0KTsKKyAgICBKU09OT2JqZWN0IHJlc09iaiA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgcmVzT2JqLnB1dEFsbChyZXRNYXApOworICAgIHJldHVybiByZXNPYmoudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gZ2V0UHJvZHVjdFR5cGVOYW1lc0ZvclBvbGljeShTdHJpbmcgcG9saWN5KQorICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcm9vdFBvbGljeVBhdGggPSB0aGlzLmNsZWFuc2UoQ3VyYXRpb25TZXJ2aWNlLmNvbmZpZworICAgICAgICAuZ2V0UG9saWN5VXBsb2FkUGF0aCgpKTsKKyAgICBTdHJpbmcgcG9saWN5UGF0aCA9IG5ldyBGaWxlKHJvb3RQb2xpY3lQYXRoICsgcG9saWN5KS50b1VSTCgpCisgICAgICAgIC50b0V4dGVybmFsRm9ybSgpOworICAgIFN0cmluZ1tdIHBvbGljaWVzID0geyBwb2xpY3lQYXRoIH07CisgICAgWE1MUmVwb3NpdG9yeU1hbmFnZXIgcmVwTWdyID0gbmV3IFhNTFJlcG9zaXRvcnlNYW5hZ2VyKEFycmF5cworICAgICAgICAuYXNMaXN0KHBvbGljaWVzKSk7CisgICAgTGlzdDxQcm9kdWN0VHlwZT4gdHlwZXMgPSByZXBNZ3IuZ2V0UHJvZHVjdFR5cGVzKCk7CisgICAgU3RyaW5nW10gdHlwZU5hbWVzID0gbmV3IFN0cmluZ1t0eXBlcy5zaXplKCldOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKFByb2R1Y3RUeXBlIHR5cGUgOiB0eXBlcykgeworICAgICAgdHlwZU5hbWVzW2ldID0gdHlwZS5nZXROYW1lKCk7CisgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVOYW1lczsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGNsZWFuc2UoU3RyaW5nIG9yaWdQYXRoKSB7CisgICAgU3RyaW5nIHJldFN0ciA9IG9yaWdQYXRoOworICAgIGlmICghcmV0U3RyLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgIHJldFN0ciArPSAiLyI7CisgICAgfQorICAgIHJldHVybiByZXRTdHI7CisgIH0KKworICBwcml2YXRlIFN0cmluZ1tdIHRva2VuaXplVmlydHVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICBTdHJpbmcgdlBhdGggPSBwYXRoOworICAgIGlmICh2UGF0aC5zdGFydHNXaXRoKCIvIikgJiYgdlBhdGgubGVuZ3RoKCkgIT0gMSkgeworICAgICAgdlBhdGggPSB2UGF0aC5zdWJzdHJpbmcoMSk7CisgICAgfQorICAgIFN0cmluZ1tdIHBhdGhUb2tzID0gdlBhdGguc3BsaXQoIi8iKTsKKyAgICBMT0cubG9nKExldmVsLklORk8sICJvcmlnUGF0aDogWyIrcGF0aCsiXSIpOworICAgIExPRy5sb2coTGV2ZWwuSU5GTywgInBhdGhUb2tzOiAiK0FycmF5cy5hc0xpc3QocGF0aFRva3MpKTsKKyAgICByZXR1cm4gcGF0aFRva3M7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL1N5c3RlbVJlc291cmNlLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3NlcnZpY2UvU3lzdGVtUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODRkMzgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zZXJ2aWNlL1N5c3RlbVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2U7CisKKy8vSkFYLVJTIGltcG9ydHMKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitAUGF0aCgic3lzdGVtIikKK3B1YmxpYyBjbGFzcyBTeXN0ZW1SZXNvdXJjZSBleHRlbmRzIEN1cmF0aW9uU2VydmljZSB7CisKKyAgQENvbnRleHQKKyAgVXJpSW5mbyB1cmlJbmZvOworICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzMTg2MDc5NTU1MTc2MDU5OThMOworCisgIC8qKgorICAgKiBUaGlzIGlzIHdoYXQgd2lsbCBnbyBpbiB0aGUgdXBwZXIgbGVmdCBib3ggb24gbGFuZGluZyBwYWdlLiBUbyBnYXRoZXIKKyAgICogaW5mb3JtYXRpb24gc3VjaCBhcyBpcyB0aGUgZmlsZSBtYW5hZ2VyIHVwIElmIHRoaXMgbmVlZHMgdG8gYmUgc29tZXRoaW5nCisgICAqIHRoYXQgZ2V0cyB1cGRhdGVkIHBlcmlvZGljYWxseSB0aGVuIGl0IHdvdWxkIGNoYW5nZSBpbnRvIGEgSlNPTiBmZWVkCisgICAqLworICBAR0VUCisgIEBQYXRoKCJzdGF0cyIpCisgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgcHVibGljIFN0cmluZyBnZXRTdGF0aXN0aWNzKCkgeworICAgIHJldHVybiAiPGRpdj5TZXJ2ZXIgU3RhdHM8L2Rpdj4iOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgcmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGlzIHNldCBpbiB0aGUgY29udGV4dC54bWwKKyAgICogZmlsZS4KKyAgICovCisgIEBHRVQKKyAgQFBhdGgoImNvbmZpZyIpCisgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgcHVibGljIFN0cmluZyBnZXRDb25maWcoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIGluZm9ybWF0aW9uIHRoYXQgYXBwZWFycyBpbiB0aGUgdXBwZXIgcmlnaHQgYm94IG9uCisgICAqIGxhbmRpbmcgcGFnZS4KKyAgICovCisgIEBHRVQKKyAgQFBhdGgoImZlZWQiKQorICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgIHB1YmxpYyBTdHJpbmcgZ2V0RmVlZCgpIHsKKyAgICByZXR1cm4gIjxkaXY+TGF0ZXN0IFByb2R1Y3RzPzwvZGl2PiI7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc3RydWN0cy9FeHRyYWN0b3JDb25maWcuamF2YSBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc3RydWN0cy9FeHRyYWN0b3JDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkxNGFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zdHJ1Y3RzL0V4dHJhY3RvckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc3RydWN0czsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEV4dHJhY3RvckNvbmZpZyB7CisgIAorICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX0NMQVNTX05BTUUgPSAiZXh0cmFjdG9yLmNsYXNzbmFtZSI7CisKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9DT05GSUdfRklMRVMgPSAiZXh0cmFjdG9yLmNvbmZpZy5maWxlcyI7CisgIAorICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZT4gY29uZmlnRmlsZXM7CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOworCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkZW50aWZpZXI7CisgIAorICBwdWJsaWMgRXh0cmFjdG9yQ29uZmlnKFN0cmluZyBpZGVudGlmaWVyLCBTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgTGlzdDxGaWxlPiBjb25maWdGaWxlcykgeworICAgIHRoaXMuY29uZmlnRmlsZXMgPSBjb25maWdGaWxlczsKKyAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICB9CisgIAorICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRDb25maWdGaWxlcygpIHsKKyAgICByZXR1cm4gdGhpcy5jb25maWdGaWxlczsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisgICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllcjsKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc3RydWN0cy9Jbmdlc3Rpb25UYXNrLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3N0cnVjdHMvSW5nZXN0aW9uVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmI0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3N0cnVjdHMvSW5nZXN0aW9uVGFzay5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc3RydWN0czsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkluZ2VzdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIEEgc3BlY2lmaWNhdGlvbiBmb3IgaW5nZXN0aW9uIHVzaW5nIHRoZSB7QGxpbmsgSW5nZXN0ZXJ9IGludGVyZmFjZSBpbiB0aGUKKyAqIENBUy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBJbmdlc3Rpb25UYXNrIGltcGxlbWVudHMgSW5nZXN0aW9uVGFza1N0YXR1cyB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKyAgcHJpdmF0ZSBEYXRlIGNyZWF0ZURhdGU7CisKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsZUxpc3Q7CisKKyAgcHJpdmF0ZSBTdHJpbmcgcG9saWN5OworCisgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RUeXBlOworCisgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICBwcml2YXRlIEV4dHJhY3RvckNvbmZpZyBleHRDb25mOworCisgIHB1YmxpYyBJbmdlc3Rpb25UYXNrKCkgeworICAgIHRoaXMuaWQgPSBudWxsOworICAgIHRoaXMuY3JlYXRlRGF0ZSA9IG51bGw7CisgICAgdGhpcy5maWxlTGlzdCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIHRoaXMucG9saWN5ID0gbnVsbDsKKyAgICB0aGlzLnByb2R1Y3RUeXBlID0gbnVsbDsKKyAgICB0aGlzLmV4dENvbmYgPSBuZXcgRXh0cmFjdG9yQ29uZmlnKG51bGwsIG51bGwsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGlkCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgIHJldHVybiBpZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gaWQKKyAgICogICAgICAgICAgdGhlIGlkIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgdGhpcy5pZCA9IGlkOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNyZWF0ZURhdGUKKyAgICovCisgIHB1YmxpYyBEYXRlIGdldENyZWF0ZURhdGUoKSB7CisgICAgcmV0dXJuIGNyZWF0ZURhdGU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNyZWF0ZURhdGUKKyAgICogICAgICAgICAgdGhlIGNyZWF0ZURhdGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVEYXRlKERhdGUgY3JlYXRlRGF0ZSkgeworICAgIHRoaXMuY3JlYXRlRGF0ZSA9IGNyZWF0ZURhdGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZmlsZUxpc3QKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmlsZUxpc3QoKSB7CisgICAgcmV0dXJuIGZpbGVMaXN0OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmaWxlTGlzdAorICAgKiAgICAgICAgICB0aGUgZmlsZUxpc3QgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGaWxlTGlzdChMaXN0PFN0cmluZz4gZmlsZUxpc3QpIHsKKyAgICB0aGlzLmZpbGVMaXN0ID0gZmlsZUxpc3Q7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcG9saWN5CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFBvbGljeSgpIHsKKyAgICByZXR1cm4gcG9saWN5OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwb2xpY3kKKyAgICogICAgICAgICAgdGhlIHBvbGljeSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFBvbGljeShTdHJpbmcgcG9saWN5KSB7CisgICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcHJvZHVjdFR5cGUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFR5cGUoKSB7CisgICAgcmV0dXJuIHByb2R1Y3RUeXBlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwcm9kdWN0VHlwZQorICAgKiAgICAgICAgICB0aGUgcHJvZHVjdFR5cGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZShTdHJpbmcgcHJvZHVjdFR5cGUpIHsKKyAgICB0aGlzLnByb2R1Y3RUeXBlID0gcHJvZHVjdFR5cGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgc3RhdHVzCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzdGF0dXMKKyAgICogICAgICAgICAgdGhlIHN0YXR1cyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZXh0Q29uZgorICAgKi8KKyAgcHVibGljIEV4dHJhY3RvckNvbmZpZyBnZXRFeHRDb25mKCkgeworICAgIHJldHVybiBleHRDb25mOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBleHRDb25mCisgICAqICAgICAgICAgIHRoZSBleHRDb25mIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RXh0Q29uZihFeHRyYWN0b3JDb25maWcgZXh0Q29uZikgeworICAgIHRoaXMuZXh0Q29uZiA9IGV4dENvbmY7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9zdHJ1Y3RzL0luZ2VzdGlvblRhc2tTdGF0dXMuamF2YSBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc3RydWN0cy9Jbmdlc3Rpb25UYXNrU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyNzA2MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vc3RydWN0cy9Jbmdlc3Rpb25UYXNrU3RhdHVzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnN0cnVjdHM7CisKKy8qKgorICoKKyAqIE1ldCBrZXlzIGZvciB0aGUge0BsaW5rIEluZ2VzdGlvblRhc2sjZ2V0U3RhdHVzKCl9IGZpZWxkLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5nZXN0aW9uVGFza1N0YXR1cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIRUQgPSAiRmluaXNoZWQiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRFRCA9ICJTdGFydGVkIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TVEFSVEVEID0gIk5vdCBTdGFydGVkIjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vdXRpbC9DdXJhdGlvblhtbFN0cnVjdEZhY3RvcnkuamF2YSBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vdXRpbC9DdXJhdGlvblhtbFN0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzA0YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi91dGlsL0N1cmF0aW9uWG1sU3RydWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24udXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuWG1sU3RydWN0RmFjdG9yeTsKKworLyoqCisgKiAKKyAqIFVudGlsIHdlIHNvbHZlIHRoZSBzZXJpYWxpemF0aW9uIHByb2JsZW0gaW4gQ0FTIDEuOC4wIGZvciBhZGRpbmcgbWV0YWRhdGEgYW5kCisgKiBleHRyYWN0b3IgaW5mb3JtYXRpb24gdG8ge0BsaW5rIFhtbFN0cnVjdEZhY3Rvcnl9LCB0aGlzIGNsYXNzIHdpbGwgc3VmZmljZSB0bworICogZ2V0IHVzIHRoZSBhY3R1YWwgcG9saWN5IG1hbmFnZW1lbnQgdGhhdCB3ZSBuZWVkLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEN1cmF0aW9uWG1sU3RydWN0RmFjdG9yeSB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUHJvZHVjdFR5cGVYbWxEb2N1bWVudCgKKyAgICAgIExpc3Q8UHJvZHVjdFR5cGU+IHByb2R1Y3RUeXBlcywgU3RyaW5nIHhtbEZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBYTUxVdGlscy53cml0ZVhtbEZpbGUoZ2V0UHJvZHVjdFR5cGVYbWxEb2N1bWVudChwcm9kdWN0VHlwZXMpLCB4bWxGaWxlUGF0aCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldFByb2R1Y3RUeXBlWG1sRG9jdW1lbnQoCisgICAgICBMaXN0PFByb2R1Y3RUeXBlPiBwcm9kdWN0VHlwZXMpIHRocm93cyBFeGNlcHRpb24geworICAgIERvY3VtZW50IGRvYyA9IFhtbFN0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdFR5cGVYbWxEb2N1bWVudChwcm9kdWN0VHlwZXMpOworCisgICAgLy8gZm9yIGV2ZXJ5IHByb2R1Y3QgdHlwZSwgaSB3YW50IHRvIGFkZCBpbiB0aGUgdmVyc2lvbmVyIGluZm8gYW5kIHRoZQorICAgIC8vIG1ldCBleHRyYWN0b3IgaW5mbworCisgICAgRWxlbWVudCByb290RWxlbSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICBOb2RlTGlzdCB0eXBlTm9kZUxpc3QgPSByb290RWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHlwZSIpOworICAgIGlmICh0eXBlTm9kZUxpc3QgIT0gbnVsbCAmJiB0eXBlTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVOb2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIEVsZW1lbnQgdHlwZUVsZW0gPSAoRWxlbWVudCkgdHlwZU5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICAgIGF1Z21lbnRFbGVtZW50KHByb2R1Y3RUeXBlcywgdHlwZUVsZW0sIGRvYyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRvYzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXVnbWVudEVsZW1lbnQoTGlzdDxQcm9kdWN0VHlwZT4gcHJvZHVjdFR5cGVzLAorICAgICAgRWxlbWVudCB0eXBlRWxlbSwgRG9jdW1lbnQgZG9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lID0gdHlwZUVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIik7CisgICAgUHJvZHVjdFR5cGUgdHlwZSA9IGdldFR5cGUocHJvZHVjdFR5cGVzLCBwcm9kdWN0VHlwZU5hbWUpOworCisgICAgRWxlbWVudCBtZXRhZGF0YVJvb3RFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm1ldGFkYXRhIik7CisgICAgCisgICAgZm9yIChPYmplY3QgbWV0S2V5IDogdHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKSkgeworICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIG1ldEtleTsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWxzID0gdHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRBbGxNZXRhZGF0YShrZXkpOworCisgICAgICBFbGVtZW50IG1ldGFkYXRhRWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJrZXl2YWwiKTsKKyAgICAgIEVsZW1lbnQga2V5RWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJrZXkiKTsKKyAgICAgIGtleUVsZW0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKFVSTEVuY29kZXIuZW5jb2RlKGtleSwgIlVURi04IikpKTsKKworICAgICAgbWV0YWRhdGFFbGVtLmFwcGVuZENoaWxkKGtleUVsZW0pOworICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICBFbGVtZW50IHZhbEVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgidmFsIik7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkF0dGVtcHQgdG8gd3JpdGUgbnVsbCB2YWx1ZSAiCisgICAgICAgICAgICAgICsgImZvciBwcm9wZXJ0eTogWyIgKyBrZXkgKyAiXTogdmFsOiBbIiArIHZhbCArICJdIik7CisgICAgICAgIH0KKworICAgICAgICB2YWxFbGVtCisgICAgICAgICAgICAuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKFVSTEVuY29kZXIuZW5jb2RlKHZhbCwgIlVURi04IikpKTsKKyAgICAgICAgbWV0YWRhdGFFbGVtLmFwcGVuZENoaWxkKHZhbEVsZW0pOworICAgICAgfQorCisgICAgICBtZXRhZGF0YVJvb3RFbGVtLmFwcGVuZENoaWxkKG1ldGFkYXRhRWxlbSk7CisgICAgICB0eXBlRWxlbS5hcHBlbmRDaGlsZChtZXRhZGF0YVJvb3RFbGVtKTsKKworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUHJvZHVjdFR5cGUgZ2V0VHlwZShMaXN0PFByb2R1Y3RUeXBlPiB0eXBlcywgU3RyaW5nIG5hbWUpIHsKKyAgICBmb3IgKFByb2R1Y3RUeXBlIHR5cGUgOiB0eXBlcykgeworICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3V0aWwvRGF0ZVV0aWxzLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3V0aWwvRGF0ZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjYmFkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vdXRpbC9EYXRlVXRpbHMuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24udXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogCisgKiBTYW1wbGUgSVNPIDg2MDEgZGF0ZSB1dGlsaXR5IG1ldGhvZHMgdGFrZW4gZnJvbToKKyAqIAorICogPGEgaHJlZj0iaHR0cDovL3d3dy5keW5hbWljb2JqZWN0cy5jb20vZDJyL2FyY2hpdmVzLzAwMzA1Ny5odG1sIj5odHRwOi8vd3d3LgorICogZHluYW1pY29iamVjdHMuY29tL2Qyci9hcmNoaXZlcy8wMDMwNTcuaHRtbDwvYT4KKyAqIAorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERhdGVVdGlscyB7CisKKyAgcHVibGljIHN0YXRpYyBTaW1wbGVEYXRlRm9ybWF0IElTTzg2MDFGT1JNQVQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NaIik7CisKKyAgcHVibGljIHN0YXRpYyBTaW1wbGVEYXRlRm9ybWF0IFJGQzgyMkRBVEVGT1JNQVQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICJFRUUnLCAnZGQnICdNTU0nICd5eXl5JyAnSEg6bW06c3MnICdaIiwgTG9jYWxlLlVTKTsKKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRlQXNSRkM4MjJTdHJpbmcoRGF0ZSBkYXRlKSB7CisgICAgcmV0dXJuIFJGQzgyMkRBVEVGT1JNQVQuZm9ybWF0KGRhdGUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0ZUFzSVNPODYwMVN0cmluZyhEYXRlIGRhdGUpIHsKKyAgICBTdHJpbmcgcmVzdWx0ID0gSVNPODYwMUZPUk1BVC5mb3JtYXQoZGF0ZSk7CisgICAgLy8gY29udmVydCBZWVlZTU1ERFRISDptbTpzcytISDAwIGludG8gWVlZWU1NRERUSEg6bW06c3MrSEg6MDAKKyAgICAvLyAtIG5vdGUgdGhlIGFkZGVkIGNvbG9uIGZvciB0aGUgVGltZXpvbmUKKyAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDIpICsgIjoiCisgICAgICAgICsgcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQubGVuZ3RoKCkgLSAyKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vdXRpbC9FeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YSBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vdXRpbC9FeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU1ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi91dGlsL0V4dHJhY3RvckNvbmZpZ1JlYWRlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24udXRpbDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zdHJ1Y3RzLkV4dHJhY3RvckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworcHVibGljIGNsYXNzIEV4dHJhY3RvckNvbmZpZ1JlYWRlciB7CisgIHB1YmxpYyBzdGF0aWMgRXh0cmFjdG9yQ29uZmlnIHJlYWRGcm9tRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5LAorICAgICAgU3RyaW5nIGNvbmZpZ0lkKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZSBwcm9wc0ZpbGVEaXIgPSBuZXcgRmlsZShkaXJlY3RvcnksIGNvbmZpZ0lkKTsKKyAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBwcm9wcworICAgICAgICAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHByb3BzRmlsZURpciwKKyAgICAgICAgImNvbmZpZy5wcm9wZXJ0aWVzIikpKTsKKyAgICAKKyAgICBTdHJpbmcgaWRlbnRpZmllciA9IGNvbmZpZ0lkOworICAgIFN0cmluZyBjbGFzc05hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShFeHRyYWN0b3JDb25maWcuUFJPUF9DTEFTU19OQU1FKTsKKyAgICBMaXN0PEZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICAgIFN0cmluZ1tdIGZpbGVMaXN0ID0gcHJvcHMuZ2V0UHJvcGVydHkoRXh0cmFjdG9yQ29uZmlnLlBST1BfQ09ORklHX0ZJTEVTKQorICAgICAgICAuc3BsaXQoIiwiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICBmaWxlcy5hZGQobmV3IEZpbGUoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoZmlsZUxpc3RbMF0pKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXcgRXh0cmFjdG9yQ29uZmlnKGlkZW50aWZpZXIsIGNsYXNzTmFtZSwgZmlsZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3V0aWwvRXh0cmFjdG9yQ29uZmlnV3JpdGVyLmphdmEgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3V0aWwvRXh0cmFjdG9yQ29uZmlnV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNDg4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vdXRpbC9FeHRyYWN0b3JDb25maWdXcml0ZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnV0aWw7CisKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc3RydWN0cy5FeHRyYWN0b3JDb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgRXh0cmFjdG9yQ29uZmlnV3JpdGVyIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlVG9EaXJlY3RvcnkoRXh0cmFjdG9yQ29uZmlnIGNvbmZpZywgRmlsZSBkaXIpCisgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgcHJvcHMuc2V0UHJvcGVydHkoRXh0cmFjdG9yQ29uZmlnLlBST1BfQ0xBU1NfTkFNRSwgY29uZmlnLmdldENsYXNzTmFtZSgpKTsKKyAgICBGaWxlIGNvbmZpZ0RpciA9IG5ldyBGaWxlKGRpciwgY29uZmlnLmdldElkZW50aWZpZXIoKSk7CisgICAgY29uZmlnRGlyLm1rZGlycygpOworICAgIFN0cmluZ0J1ZmZlciBmaWxlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBmb3IgKEl0ZXJhdG9yPEZpbGU+IGkgPSBjb25maWcuZ2V0Q29uZmlnRmlsZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIEZpbGUgZmlsZSA9IGkubmV4dCgpOworICAgICAgZmlsZXMuYXBwZW5kKGZpbGUudG9VUkkoKSk7CisgICAgICBpZiAoaS5oYXNOZXh0KCkpCisgICAgICAgIGZpbGVzLmFwcGVuZCgiLCIpOworICAgIH0KKyAgICBwcm9wcy5zZXRQcm9wZXJ0eShFeHRyYWN0b3JDb25maWcuUFJPUF9DT05GSUdfRklMRVMsIGZpbGVzLnRvU3RyaW5nKCkpOworICAgIHByb3BzCisgICAgICAgIC5zdG9yZShuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShjb25maWdEaXIsICJjb25maWcucHJvcGVydGllcyIpKSwKKyAgICAgICAgIiIpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGIyODcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivc2VydmljZXMvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL2N1cmF0b3Itc2VydmljZXMiPgorCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0RXh0cmFjdG9yQ29uZi51cGxvYWRQYXRoIgorCQl2YWx1ZT0iW09PRFRfSE9NRV0vZXh0cmFjdG9ycyIgLz4KKworCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmRhdGFEZWZpbml0aW9uLnVwbG9hZFBhdGgiCisJCXZhbHVlPSJbRklMRU1HUl9IT01FXS9wb2xpY3kiIC8+CisJCQorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnN0YWdpbmdBcmVhUGF0aCIKKyAgICAgICAgdmFsdWU9IltPT0RUX0hPTUVdL2RhdGEvc3RhZ2luZyIvPgorICAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLm1ldEFyZWFQYXRoIgorICAgICAgICB2YWx1ZT0iW09PRFRfSE9NRV0vZGF0YS9tZXQiLz4KKyAgICAKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5mbVByb3BzIgorICAgICAgICB2YWx1ZT0iW0ZJTEVNR1JfSE9NRV0vZXRjL2ZpbGVtZ3IucHJvcGVydGllcyIvPgorICAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLm1ldEV4dGVuc2lvbiIKKyAgICAgICAgdmFsdWU9Ii5tZXQiLz4KKwkJCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZtLnVybCIKKwkgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iLz4KKwkJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuY2F0YWxvZ0ZhY3RvcnlDbGFzcyIgCisJCQkgICB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkiIC8+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvMC4xMC9jdXJhdG9yL3NlcnZpY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhODM0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci9zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHdlYi1hcHAgaWQ9IldlYkFwcF9JRCIgdmVyc2lvbj0iMi40IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIj4KKwk8ZGlzcGxheS1uYW1lPmN1cmF0b3Itc2VydmljZXM8L2Rpc3BsYXktbmFtZT4KKwk8c2VydmxldD4KKwkgPHNlcnZsZXQtbmFtZT5DWEZTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisJIDxzZXJ2bGV0LWNsYXNzPgorCSAgIG9yZy5hcGFjaGUuY3hmLmpheHJzLnNlcnZsZXQuQ1hGTm9uU3ByaW5nSmF4cnNTZXJ2bGV0CisJIDwvc2VydmxldC1jbGFzcz4KKwkgPGluaXQtcGFyYW0+CisJICA8cGFyYW0tbmFtZT5qYXhycy5zZXJ2aWNlQ2xhc3NlczwvcGFyYW0tbmFtZT4KKwkgIDxwYXJhbS12YWx1ZT4KKwkgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLkRpcmVjdG9yeVJlc291cmNlCisJICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZS5Jbmdlc3Rpb25SZXNvdXJjZQorCSAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2UuTWV0YWRhdGFSZXNvdXJjZQorCSAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2UuUG9saWN5UmVzb3VyY2UKKwkgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLlN5c3RlbVJlc291cmNlCisJICA8L3BhcmFtLXZhbHVlPgorCSA8L2luaXQtcGFyYW0+CisJPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisJPC9zZXJ2bGV0PgorCQorCTxzZXJ2bGV0PgorCSAgIDxkaXNwbGF5LW5hbWU+Q3VyYXRpb24gU2VydmljZTwvZGlzcGxheS1uYW1lPgorCSAgIDxzZXJ2bGV0LW5hbWU+Q3VyYXRpb24gU2VydmljZTwvc2VydmxldC1uYW1lPgorCSAgIDxzZXJ2bGV0LWNsYXNzPgorCQkgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLkN1cmF0aW9uU2VydmljZQorCSAgIDwvc2VydmxldC1jbGFzcz4KKwkgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKwk8L3NlcnZsZXQ+CisJCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5DWEZTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vc2VydmljZXMvKjwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvcG9tLnhtbCBiLzAuMTAvY3VyYXRvci93ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY0Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTcwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5jYXMtY3VyYXRvcjwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+Q0FTIEN1cmF0aW9uIEludGVyZmFjZTwvbmFtZT4KKyAgPHByb3BlcnRpZXM+CisgICA8d2lja2V0LnZlcnNpb24+MS40LjE3PC93aWNrZXQudmVyc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPiAgCisgIDxkZXNjcmlwdGlvbj5BIHdlYiBhcHBsaWNhdGlvbiBmb3IgbWFuYWdpbmcgcG9saWN5IGZvciBwcm9kdWN0cyBhbmQgZmlsZXMgYW5kIG1ldGFkYXRhIHRoYXQgaGF2ZSBiZWVuIGluZ2VzdGVkIHZpYSB0aGUgQ0FTIGNvbXBvbmVudC48L2Rlc2NyaXB0aW9uPgorICA8YnVpbGQ+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8dGVzdFJlc291cmNlcz4KKyAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+CisgICAgICAgIDwvdGVzdFJlc291cmNlcz4gIAorICAgIDxwbHVnaW5zPgorCQk8cGx1Z2luPgorCQkgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQubWF2ZW48L2dyb3VwSWQ+CisJCSAgICA8YXJ0aWZhY3RJZD50b21jYXQ3LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKwkJICAgIDxjb25maWd1cmF0aW9uPgorCQkgICAgICAgIDxwb3J0PjgxODE8L3BvcnQ+CisJCSAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisJCSAgICAgICAgICAgIDxDQVRBTElOQV9PUFRTPi1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSAtRGZpbGUuZW5jb2Rpbmc9VVRGLTgKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZXJ2ZXIgLVhtczE1MzZtIC1YbXgxNTM2bQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOk5ld1NpemU9MjU2bSAtWFg6TWF4TmV3U2l6ZT0yNTZtIC1YWDpQZXJtU2l6ZT0yNTZtCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6TWF4UGVybVNpemU9NTEybSAtWFg6K0Rpc2FibGVFeHBsaWNpdEdDCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6K1VzZUNvbmNNYXJrU3dlZXBHQworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOitDTVNJbmNyZW1lbnRhbE1vZGUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDorQ01TSW5jcmVtZW50YWxQYWNpbmcKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDpDTVNJbmNyZW1lbnRhbER1dHlDeWNsZU1pbj0wCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6LVRyYWNlQ2xhc3NVbmxvYWRpbmcKKwkJICAgICAgICAgICAgPC9DQVRBTElOQV9PUFRTPgorCQkgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKwkJICAgICAgICA8Y29udGV4dEZpbGU+JHtiYXNlZGlyfS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWw8L2NvbnRleHRGaWxlPgorCQkgICAgICAgIDxwYXRoPi8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfTwvcGF0aD4gIAorCQkgICAgPC9jb25maWd1cmF0aW9uPgkgICAgCisJCTwvcGx1Z2luPiAgICAKKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+ICAKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53aWNrZXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndpY2tldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHt3aWNrZXQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud2lja2V0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53aWNrZXQtZXh0ZW5zaW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHt3aWNrZXQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jdXJhdG9yLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LXdlYmFwcC1jb21wb25lbnRzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FzLXdvcmtmbG93PC9hcnRpZmFjdElkPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PiAgCisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgIDxhcnRpZmFjdElkPm9vZHQtc3NvPC9hcnRpZmFjdElkPgorICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgIAorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vQ3VyYXRpb25BcHAuamF2YSBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0N1cmF0aW9uQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyN2I4MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0N1cmF0aW9uQXBwLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLmxvZ2luLkxvZ2luUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuY3VyYXRpb24ud29ya2JlbmNoLldvcmtiZW5jaDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVzb3VyY2VSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYkFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LnJlcXVlc3QudGFyZ2V0LmNvZGluZy5NaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQudXRpbC5maWxlLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBDdXJhdGlvbkFwcCBleHRlbmRzIFdlYkFwcGxpY2F0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDdXJhdGlvbkFwcC5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9ESVNQTEFZX05BTUUgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnByb2plY3ROYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU09fSU1QTF9DTEFTUyA9ICJvcmcuYXBhY2hlLm9vZHQuc2VjdXJpdHkuc3NvLmltcGxDbGFzcyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSQVRPUl9IT01FUEFHRSA9ICJjdXJhdG9yLmhvbWVwYWdlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJBVE9SX1NLSU4gPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnNraW4iOworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XZWJBcHBsaWNhdGlvbiNpbml0KCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworICAgIHN1cGVyLmluaXQoKTsKKyAgICBTZXQ8U3RyaW5nPiBiZW5jaFJlc291cmNlcyA9IFdvcmtiZW5jaC5nZXRJbWFnZUZpbGVzKCk7CisgICAgU3RyaW5nIGxvY2FsUGF0aCA9IEhvbWVQYWdlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgU2V0PFN0cmluZz4gbG9jYWxSZXNvdXJjZXMgPSBXb3JrYmVuY2guZ2V0SW1hZ2VGaWxlcyhsb2NhbFBhdGgpOworICAgIGJlbmNoUmVzb3VyY2VzID0gZmlsdGVyQmVuY2hSZXNvdXJjZXMoYmVuY2hSZXNvdXJjZXMsIGxvY2FsUmVzb3VyY2VzLAorICAgICAgICBsb2NhbFBhdGgpOworICAgIGRvSW1hZ2VNb3VudHMoYmVuY2hSZXNvdXJjZXMsIChDbGFzczw/PikgV29ya2JlbmNoLmNsYXNzKTsKKyAgICBkb0ltYWdlTW91bnRzKGxvY2FsUmVzb3VyY2VzLCAoQ2xhc3M8Pz4pIEhvbWVQYWdlLmNsYXNzKTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSBsb2dpblBhZ2VNb3VudCA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJhdXRoIiwgTG9naW5QYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAiYWN0aW9uIiB9KTsKKyAgICBtb3VudChsb2dpblBhZ2VNb3VudCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBQYWdlPiBnZXRIb21lUGFnZSgpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIChDbGFzczw/IGV4dGVuZHMgUGFnZT4pIENsYXNzLmZvck5hbWUoZ2V0SG9tZVBhZ2VDbGFzcygpKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gSG9tZVBhZ2UuY2xhc3M7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIb21lUGFnZUNsYXNzKCkgeworICAgIHJldHVybiBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoQ1VSQVRPUl9IT01FUEFHRSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgeworICAgIHJldHVybiBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9ESVNQTEFZX05BTUUpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTU09JbXBsQ2xhc3MoKSB7CisgICAgcmV0dXJuIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihTU09fSU1QTF9DTEFTUyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFNraW4oKSB7CisgICAgcmV0dXJuIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihDVVJBVE9SX1NLSU4pOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYkFwcGxpY2F0aW9uI25ld1Nlc3Npb24ob3JnLmFwYWNoZS53aWNrZXQKKyAgICogLlJlcXVlc3QsIG9yZy5hcGFjaGUud2lja2V0LlJlc3BvbnNlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXNzaW9uIG5ld1Nlc3Npb24oUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgeworICAgIEN1cmF0aW9uU2Vzc2lvbiBzZXNzaW9uID0gbmV3IEN1cmF0aW9uU2Vzc2lvbihyZXF1ZXN0KTsKKyAgICBTdHJpbmcgc2tpbiA9IGdldFNraW4oKTsKKyAgICBpZiAoc2tpbiAhPSBudWxsICYmICFza2luLmVxdWFscygiIikpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlNldHRpbmcgc2tpbiB0bzogWyIgKyBza2luICsgIl0iKTsKKyAgICAgIHNlc3Npb24uc2V0U3R5bGUoc2tpbik7CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uOworICB9CisKKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBmaWx0ZXJCZW5jaFJlc291cmNlcyhTZXQ8U3RyaW5nPiBiZW5jaCwKKyAgICAgIFNldDxTdHJpbmc+IGxvY2FsLCBTdHJpbmcgbG9jYWxQcmVmaXgpIHsKKyAgICBpZiAobG9jYWwgPT0gbnVsbCB8fCAobG9jYWwgIT0gbnVsbCAmJiBsb2NhbC5zaXplKCkgPT0gMCkpCisgICAgICByZXR1cm4gYmVuY2g7CisgICAgaWYgKGJlbmNoID09IG51bGwgfHwgKGJlbmNoICE9IG51bGwgJiYgYmVuY2guc2l6ZSgpID09IDApKQorICAgICAgcmV0dXJuIGJlbmNoOworICAgIFNldDxTdHJpbmc+IGZpbHRlcmVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGZvciAoU3RyaW5nIGJSZXNvdXJjZSA6IGJlbmNoKSB7CisgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbmV3IEZpbGUoYlJlc291cmNlKS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgY29tcGFyZSA9IGxvY2FsUHJlZml4ICsgbG9jYWxOYW1lOworICAgICAgaWYgKCFsb2NhbC5jb250YWlucyhjb21wYXJlKSkgeworICAgICAgICBmaWx0ZXJlZC5hZGQoYlJlc291cmNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkZpbHRlcmVkIGNvbmZsaWN0aW5nIGJlbmNoIHJlc291cmNlOiBbIgorICAgICAgICAgICAgKyBiUmVzb3VyY2UgKyAiXSIpOworICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkb0ltYWdlTW91bnRzKFNldDxTdHJpbmc+IHJlc291cmNlcywgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgIGZvciAoU3RyaW5nIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisgICAgICAgIFN0cmluZyByZXNOYW1lID0gbmV3IEZpbGUocmVzb3VyY2UpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHJlc1BhdGggPSAiL2ltYWdlcy8iICsgcmVzTmFtZTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiTW91bnRpbmc6IFsiICsgcmVzUGF0aCArICJdIG9yaWdOYW1lOiBbIiArIHJlc05hbWUKKyAgICAgICAgICAgICsgIl06IHJlc291cmNlOiBbIiArIHJlc291cmNlICsgIl0iKTsKKyAgICAgICAgbW91bnRTaGFyZWRSZXNvdXJjZShyZXNQYXRoLAorICAgICAgICAgICAgbmV3IFJlc291cmNlUmVmZXJlbmNlKGNsYXp6LCByZXNOYW1lKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9DdXJhdGlvblNlc3Npb24uamF2YSBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0N1cmF0aW9uU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMWUzZDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9DdXJhdGlvblNlc3Npb24uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYlNlc3Npb247CisKK3B1YmxpYyBjbGFzcyBDdXJhdGlvblNlc3Npb24gZXh0ZW5kcyBXZWJTZXNzaW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDAwMzgzMTI0MTYxNzQ4NDc3TDsKKworICBwcml2YXRlIGJvb2xlYW4gbG9nZ2VkSW4gPSBmYWxzZTsKKworICBwcml2YXRlIFN0cmluZyBsb2dpblVzZXJuYW1lID0gbnVsbDsKKworICBwdWJsaWMgQ3VyYXRpb25TZXNzaW9uKFJlcXVlc3QgcmVxdWVzdCkgeworICAgIHN1cGVyKHJlcXVlc3QpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBDdXJhdGlvblNlc3Npb24gZ2V0KCkgeworICAgIHJldHVybiAoQ3VyYXRpb25TZXNzaW9uKSBTZXNzaW9uLmdldCgpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGxvZ2dlZEluCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2dlZEluKCkgeworICAgIHJldHVybiBsb2dnZWRJbjsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbG9nZ2VkSW4KKyAgICogICAgICAgICAgdGhlIGxvZ2dlZEluIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TG9nZ2VkSW4oYm9vbGVhbiBsb2dnZWRJbikgeworICAgIHRoaXMubG9nZ2VkSW4gPSBsb2dnZWRJbjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBsb2dpblVzZXJuYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldExvZ2luVXNlcm5hbWUoKSB7CisgICAgcmV0dXJuIGxvZ2luVXNlcm5hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGxvZ2luVXNlcm5hbWUKKyAgICogICAgICAgICAgdGhlIGxvZ2luVXNlcm5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRMb2dpblVzZXJuYW1lKFN0cmluZyBsb2dpblVzZXJuYW1lKSB7CisgICAgdGhpcy5sb2dpblVzZXJuYW1lID0gbG9naW5Vc2VybmFtZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9Ib21lUGFnZS5jc3MgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9Ib21lUGFnZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmNGNjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlLmNzcwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitAQ0hBUlNFVCAiVVRGLTgiOworCisKKy8qIERJVi5DQVMtSEVBREVSICovCitkaXYjY2FzLWhlYWRlciB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgaGVpZ2h0OjU2cHg7CisgICAgcGFkZGluZzo1cHg7CisgICAgdGV4dC1hbGlnbjpyaWdodDsKKyAgICBib3JkZXItYm90dG9tOnNvbGlkIDFweCAjMDAwOworICAgIG92ZXJmbG93Om5vbmU7CisgICAgYmFja2dyb3VuZDp1cmwoYmxhY2tmYWRlLXN5bmNkLmpwZykgc2Nyb2xsIDBweCAwcHggcmVwZWF0LXg7Cit9CisKKy8qIERJVi5DQVMtTE9HTy1MRUZUICovCitkaXYjY2FzLWxvZ28tbGVmdCB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgdG9wOjBweDsKKyAgICBsZWZ0OjBweDsKKyAgICBoZWlnaHQ6NjdweDsKKyAgICB3aWR0aDo1MDBweDsKK30KKy8qIERJVi5DQVMtTE9HTy1SSUdIVCAqLworZGl2I2Nhcy1sb2dvLXJpZ2h0IHsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICB0b3A6MHB4OworICAgIHJpZ2h0OjBweDsKKyAgICBoZWlnaHQ6NjdweDsKKyAgICB3aWR0aDoyOTBweDsKK30KKworLyogSDIuQVBQLVRJVExFICovCitoMi5hcHAtdGl0bGUgeworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIHRvcDo2N3B4OworICAgIHJpZ2h0OjBweDsKKyAgICBtYXJnaW46MHB4OworICAgIHdpZHRoOjEwMCU7CisgICAgcGFkZGluZzo1cHg7CisgICAgcGFkZGluZy1sZWZ0OjBweDsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgZm9udC1zaXplOjE1cHg7CisgICAgbGV0dGVyLXNwYWNpbmc6MC4wM2VtOworfQorLyogRElWLlVTRVJERVRBSUxTICovCitkaXYudXNlcmRldGFpbHMgeworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIHRvcDoxMDJweDsKKyAgICByaWdodDo1cHg7CisgICAgZm9udC1zaXplOjc1JTsKKyAgICB6LWluZGV4OjEwCit9CitkaXYudXNlcmRldGFpbHMgYSB7CisgICAgCit9CisKKy8qIERJViNCUkVBRENSVU1CUyAqLworZGl2I2JyZWFkY3J1bWJzIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBtYXJnaW4tdG9wOjMwcHg7CisgICAgcGFkZGluZzo0cHg7CisgICAgcGFkZGluZy1yaWdodDo1cHg7CisgICAgcGFkZGluZy1sZWZ0OjVweDsKKyAgICBwYWRkaW5nLWJvdHRvbTo1cHg7CisgICAgZm9udC1zaXplOjg1JTsKK30KK2RpdiNicmVhZGNydW1icyB1bCB7CisgICAgbGlzdC1zdHlsZTpub25lOworICAgIG1hcmdpbjowcHg7CisgICAgcGFkZGluZzowcHg7Cit9CitkaXYjYnJlYWRjcnVtYnMgdWwgbGkgeworICAgIGRpc3BsYXk6aW5saW5lOworfQorCitkaXYjYnJlYWRjcnVtYnMgdWwgbGkgYSB7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOworICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7ICAKK30KKworLyoqCisgKiBDQVMgRm9vdGVyIFN0eWxlcworICoKKyAqIFRoZXNlIGRlc2NyaWJlIHRoZSBiYXNpYyBsYXlvdXQgb2YgdGhlIGZvb3RlciBjb2RlIGluIC92aWV3cy9jb21tb24vY2FzLWN1cmF0b3ItZm9vdGVyLmpzcAorICovCisgCitkaXYjZm9vdGVyIHsKKyAgICBmb250LXNpemU6OTAlOworICAgIHRleHQtYWxpZ246Y2VudGVyOworICAgIG1hcmdpbi10b3A6MzVweDsKKyAgICBib3JkZXItdG9wOnNvbGlkIDFweCAjZGRkOworICAgIHBhZGRpbmctdG9wOjE1cHg7CisgICAgcGFkZGluZy1ib3R0b206OHB4OworfQorCitkaXYjZm9vdGVyIGltZyB7CisgICAgYm9yZGVyOm5vbmU7CisgICAgcGFkZGluZy1sZWZ0OjJweDsKKyAgICBtYXJnaW4tbGVmdDo1cHg7ICAgIAorfQorCisvKioKKyAqIENBUyBJbnRlcmZhY2UgU3R5bGVzCisgKgorICogVGhlc2UgZGVzY3JpYmUgdGhlIGxheW91dCBvZiB0aGUgbWFpbiBjdXJhdG9yIGludGVyZmFjZSBsb2NhdGVkIGF0IC9tYWluLmpzcAorICovCisgCisgCisgCisvKiBESVYuRVJST1IKKyAqIEEgcmVkICdlcnJvcicgYm94IHN1aXRhYmxlIGZvciBkaXNwbGF5aW5nIGVycm9yIG1lc3NhZ2VzLgorICovCitkaXYuZXJyb3IgeworICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBtYXJnaW4tcmlnaHQ6MTVweDsKKyAgICBib3JkZXI6c29saWQgMXB4ICNmNDQ7Cit9CisKKy8qIERJVi5TVUNDRVNTCisgKiBBIGdyZWVuICdzdWNjZXNzJyBib3ggc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgc3VjY2VzcyBtZXNzYWdlcy4KKyAqLworZGl2LnN1Y2Nlc3MgIHsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBib3JkZXI6c29saWQgMXB4IGdyZWVuOworICAgIGJhY2tncm91bmQtY29sb3I6I2NmYzsgIAorICAgIG1hcmdpbi1yaWdodDoxMHB4OworfQorCisvKiBIRUFERVJTIChIMSxIMixIMywuLi4uLi4pICovCitoMi50aXRsZSB7CisgICAgcGFkZGluZzo1cHg7CisgICAgbWFyZ2luOjBweDsKKyAgICBib3JkZXItdG9wOnNvbGlkIDJweCAjOTAwOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICMzMDA7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOworICAgIGZvbnQtc2l6ZToxNXB4OworfQorCitoNCB7CisgICAgYm9yZGVyLWJvdHRvbTpkb3R0ZWQgMXB4ICM4ODg7Cit9CisKKworLyoqCisgKiBQQUdFIFNUUlVDVFVSRQorICoKKyAqLworIAorLyogTE9HSU4gRk9STSAqLworZm9ybSNsb2dpbi1mb3JtIHsKKyAgICBib3JkZXI6c29saWQgMHB4ICNmNjY7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmOworICAgIG1hcmdpbjo1cHg7CisgICAgcGFkZGluZzozcHg7CisgICAgdGV4dC1hbGlnbjpjZW50ZXI7Cit9Citmb3JtI2xvZ2luLWZvcm0gaDMgeworICAgIGNvbG9yOiMzMzM7CisgICAgbWFyZ2luLXRvcDowcHg7CisgICAgYm9yZGVyLWJvdHRvbTpkb3R0ZWQgMHB4ICM0NDQ7CisgICAgICAgIAorfQorZm9ybSNsb2dpbi1mb3JtIGlucHV0W3R5cGU9dGV4dF0sIGZvcm0jbG9naW4tZm9ybSBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjODg4OworICAgIHBhZGRpbmc6M3B4OworICAgIHdpZHRoOjE1MHB4OworfQorZm9ybSNsb2dpbi1mb3JtIHRhYmxlIHsKKyAgICBjb2xvcjojMzMzOworICAgIG1hcmdpbjo1cHg7CisgICAgbWFyZ2luLXRvcDowcHg7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIHdpZHRoOjI0MnB4OworfQorZm9ybSNsb2dpbi1mb3JtIGlucHV0W3R5cGU9c3VibWl0XSB7CisgICAgcGFkZGluZzozcHg7Cit9CisKKy8qIElORk9STUFUSU9OQUwgTUVTU0FHRVMgKi8KKy8qIGFsbCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgaW5mb3MgYXJlIGF0IHotaW5kZXggMTAwMC0xMTAwKQorICovCitkaXYuaW5mbyB7CisgICAgZm9udC1zaXplOjEzcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjojYWNmOworICAgIGZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7CisgICAgY29sb3I6IzM0NTsgCisgICAgZGlzcGxheTpub25lOyAgIAorfQorZGl2LmluZm8gaW5wdXRbdHlwZT1idXR0b25dIHsKKyAgICBwYWRkaW5nOjJweDsKKyAgICBtYXJnaW46NXB4IDBweDsKK30KK2RpdiNpbmZvTm9NZXRhZGF0YUV4dHJhY3RvckRlZmluZWQgeworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKyAgICB0b3A6MjhweDsKKyAgICByaWdodDotMnB4OworICAgIHotaW5kZXg6MTAwMDsKKyAgICB3aWR0aDo2MCU7ICAKKyAgICBsaW5lLWhlaWdodDoxOHB4OworfQorZGl2LmluZm9Db250ZW50IHsKKyAgICBwYWRkaW5nOjVweDsgICAgCit9CisKKy8qIExJTktTICovCisKK2EgeworICAgIGNvbG9yOiMyMjI7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cit9CithOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOworfQorYS5hY3Rpb25saW5rIHsKKyAgICBjb2xvcjojNDhhOworICAgIHBhZGRpbmctbGVmdDo1cHg7ICAgCit9CitkaXYjYnJlYWRjcnVtYnMgYSB7CisgICAgY29sb3I6I2ZmZjsKK30KKworCisKZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlLmh0bWwgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9Ib21lUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjg3NmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9Ib21lUGFnZS5odG1sCkBAIC0wLDAgKzEsMTk1IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbAorICAgIHhtbG5zOndpY2tldD0iaHR0cDovL3dpY2tldC5hcGFjaGUub3JnL2R0ZHMuZGF0YS93aWNrZXQteGh0bWwxLjQtc3RyaWN0LmR0ZCI+Cis8aGVhZD4KKzx0aXRsZT5BcGFjaGUgT09EVCBDdXJhdGlvbiBJbnRlcmZhY2U8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KKzx3aWNrZXQ6bGluaz4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iSG9tZVBhZ2Vfd2lja2V0LmNzcyIvPgorPC93aWNrZXQ6bGluaz4gICAgCis8d2lja2V0OnJlbW92ZT4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iSG9tZVBhZ2UuY3NzIi8+Cis8L3dpY2tldDpyZW1vdmU+IAorPC9oZWFkPgorCis8Ym9keT4KKzxkaXYgaWQ9InBhZ2UiPgorICAgIDxkaXYgaWQ9ImNhcy1oZWFkZXIiPgorICAgICAgICA8ZGl2IGlkPSJjYXMtbG9nby1sZWZ0Ij48IS0tICBjYXMgbG9nbyBsaHMgLS0+PC9kaXY+CisgICAgICAgIDxkaXYgaWQ9ImNhcy1sb2dvLXJpZ2h0Ij48IS0tIGNhcyBsb2dvIHJocyAtLT48L2Rpdj4KKyAgICAgICAgPGgyIGNsYXNzPSJhcHAtdGl0bGUiIHdpY2tldDppZD0icHJvamVjdF9uYW1lIj5Qcm9qZWN0IE5hbWUgQ0FTIEN1cmF0aW9uPC9oMj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXJkZXRhaWxzIj4KKyAgICAgICAgICAgICAgIDxzcGFuIHdpY2tldDppZD0ibG9nZ2VkaW5fbGFiZWwiPkxvZ2dlZCBpbiBhcyBtYXR0bWFubjwvc3Bhbj4KKwkgICAgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0ibG9naW5fbGluayI+TG9nIEluPC9hPgorCSAgICAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJsb2dvdXRfbGluayI+TG9nIE91dDwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICAKKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgICAgPCEtLSBCcmVhZGNydW1icyBBcmVhIC0tPgorICAgICAgICA8ZGl2IGlkPSJicmVhZGNydW1icyI+CisgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O3BhZGRpbmctbGVmdDogMTBweDsiPgorICAgICAgICA8YSBocmVmPSIjIiBzdHlsZT0iY29sb3I6YmxhY2s7IiB3aWNrZXQ6aWQ9ImhvbWVfbGluayI+SG9tZTwvYT4gPiA8c3BhbiBzdHlsZT0iY29sb3I6YmxhY2s7IiB3aWNrZXQ6aWQ9ImNydW1iX25hbWUiPk1haW48L3NwYW4+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworPCEtLSBiZWdpbiBtYWluIGNvbnRlbnQgLS0+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0OjMwMHB4OyI+CisgIAorPHdpY2tldDpjaGlsZC8+CisgIAorICA8IS0tICBzbyB0aGF0IGl0IHByZXZpZXdzIHJpZ2h0IC0tPgorICA8d2lja2V0OnJlbW92ZT4JCisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2guY3NzIi8+CisJCisJPGRpdiBjbGFzcz0icGFnZSI+CisJICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciBicm93c2VycyI+CisJICAgICAgICA8ZGl2IGlkPSJicm93c2VTdGFnaW5nQ29udGFpbmVyIj4KKwkgICAgICAgIDxoNT5TdGFnaW5nIEFyZWE8L2g1PgorCSAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZVN0YWdpbmdQYXRoIiBjbGFzcz0icGF0aGJhciI+aW5pdGlhbGl6aW5nLi4uPC9kaXY+CisJICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlU3RhZ2luZyIgY2xhc3M9ImJyb3dzZXIiPgorCSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VTdGFnaW5nTmF2Ij4KKwkgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iZmlsZVRyZWUiPgorCSAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5IG5hdiI+PGEgaWQ9InN0YWdpbmdOYXZVcFJvb3QiIGhyZWY9IiMiIHJlbD0iLiI+LjwvYT48L2xpPgorCSAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5IG5hdiI+PGEgaWQ9InN0YWdpbmdOYXZVcE9uZSIgIGhyZWY9IiMiIHJlbD0iLi4iPi4uPC9hPjwvbGk+CisJICAgICAgICAgICAgICAgICAgICA8L3VsPgorCSAgICAgICAgICAgICAgICA8L2Rpdj4KKwkgICAgICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlU3RhZ2luZ0NvbnRlbnRzIj48L2Rpdj4KKwkgICAgICAgICAgICA8L2Rpdj4KKwkgICAgICAgICAgICA8ZGl2IGlkPSJzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaCIgICBjbGFzcz0iZWRpdG9yIj4KKwkgICAgICAgICAgICAgICAgPGRpdiBpZD0iaW5mb05vTWV0YWRhdGFFeHRyYWN0b3JEZWZpbmVkIiBjbGFzcz0iaW5mbyBvdmVybGF5Ij4KKwkgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZm9Db250ZW50Ij4KKwkgICAgICAgICAgICAgICAgICAgICAgICBObyBNZXRhZGF0YSBEZXRlY3RlZC4uLjxici8+CisJICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKwkgICAgICAgICAgICAgICAgPC9kaXY+CisJICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YWdpbmdNZXRDb250YWluZXIiPiAgICAgICAgICAgICAgCisJICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uIj4KKwkgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJzdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnTGlzdCI+CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii0xIj5Jbml0aWFsaXppbmcuLi48L29wdGlvbj4KKwkgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKwkgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InN0YWdpbmdNZXRFeHRyYWN0b3JSZWZyZXNoQnV0dG9uIiB0eXBlPSJidXR0b24iIHZhbHVlPSJSZWZyZXNoIi8+CisJICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CisJICAgICAgICAgICAgICAgICAgICAgICAgCisJICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKwkgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YWdlZE1ldGFkYXRhV29ya2JlbmNoQ29udGVudCI+PC9kaXY+CisJICAgICAgICAgICAgICAgIDwvZGl2PgorCSAgICAgICAgICAgIDwvZGl2PgorCSAgICAgICAgPC9kaXY+CisJICAgICAgICA8ZGl2IGlkPSJicm93c2VDYXRhbG9nQ29udGFpbmVyIj4KKwkgICAgICAgIDxoNT5GaWxlIE1hbmFnZXIgQ2F0YWxvZzwvaDU+CisJICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlQ2F0YWxvZ1BhdGgiIGNsYXNzPSJwYXRoYmFyIj5pbml0aWFsaXppbmcuLi48L2Rpdj4KKwkgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VDYXRhbG9nIiBjbGFzcz0iYnJvd3NlciI+CisJICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZUNhdGFsb2dOYXYiPgorCSAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJmaWxlVHJlZSI+CisJICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXJlY3RvcnkgbmF2Ij48YSBpZD0iY2F0YWxvZ05hdlVwUm9vdCIgaHJlZj0iIyIgcmVsPSIuIj4uPC9hPjwvbGk+CisJICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXJlY3RvcnkgbmF2Ij48YSBpZD0iY2F0YWxvZ05hdlVwT25lIiAgaHJlZj0iIyIgcmVsPSIuLiI+Li48L2E+PC9saT4KKwkgICAgICAgICAgICAgICAgICAgIDwvdWw+CisJICAgICAgICAgICAgICAgIDwvZGl2PgorCSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VDYXRhbG9nQ29udGVudHMiPjwvZGl2PgorCSAgICAgICAgICAgIDwvZGl2PgorCSAgICAgICAgICAgIDxkaXYgaWQ9ImNhdGFsb2dNZXRhZGF0YVdvcmtiZW5jaCIgY2xhc3M9ImVkaXRvciI+CisJICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNhdGFsb2dNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQiPjwvZGl2PgorCSAgICAgICAgICAgIDwvZGl2PgorCSAgICAgICAgPC9kaXY+CisJICAgICAgICA8YnIgY2xhc3M9ImNsciIvPgorCSAgICA8L2Rpdj4KKwkgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIHRhc2tzIj4KKwkgICAgICAgIDxkaXYgaWQ9ImluZ2VzdGlvblRhc2tMaXN0Ij4KKwkgICAgICAgICAgICA8aDU+RmlsZSBNYW5hZ2VyIEluZ2VzdGlvbiBUYXNrIExpc3Q8L2g1PgorCSAgICAgICAgICAgIDxkaXYgaWQ9ImluZ2VzdGlvblRhc2tMaXN0Q29udGVudCI+CisJICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgaWQ9ImluZ2VzdGlvblRhc2tMaXN0SXRlbXMiPgorCSAgICAgICAgICAgICAgPHRoZWFkPgorCSAgICAgICAgICAgICAgPHRyPgorCSAgICAgICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOjUwcHg7Ij5UYXNrSWQ8L3RoPgorCSAgICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+CisJICAgICAgICAgICAgICAgIDx0aD5GaWxlczwvdGg+CisJICAgICAgICAgICAgICAgIDx0aD5Qb2xpY3k8L3RoPgorCSAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdFR5cGU8L3RoPgorCSAgICAgICAgICAgICAgICA8dGg+TWV0RXh0cmFjdG9yPC90aD4KKwkgICAgICAgICAgICAgICAgPHRoPk1ldEV4dCBDb25maWc8L3RoPgorCSAgICAgICAgICAgICAgICA8dGg+U3RhdHVzPC90aD4KKwkgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJib3JkZXItcmlnaHQtd2lkdGg6MHB4OyI+QWN0aW9uPC90aD4KKwkgICAgICAgICAgICAgIDwvdHI+CisJICAgICAgICAgICAgICA8L3RoZWFkPgorCSAgICAgICAgICAgICAgPHRib2R5PgorCSAgICAgICAgICAgICAgCisJICAgICAgICAgICAgICA8L3Rib2R5PgorCSAgICAgICAgICAgICAgCisJICAgICAgICAgICAgPC90YWJsZT4KKwkgICAgICAgICAgICA8L2Rpdj4KKwkgICAgICAgIDwvZGl2PgorCSAgICA8L2Rpdj4KKwk8L2Rpdj4KKwkKKwk8IS0tIHByb2R1Y3QgdHlwZSB3b3JrYmVuY2ggLS0+CisJPGRpdiBpZD0icHJvZHVjdFR5cGVXb3JrYmVuY2hDb250ZW50cyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisJICAgIDx1bD4KKwkgICAgICAgIDxsaT48YSBocmVmPScjcHR3YkFkZFByb2R1Y3RzJz5BZGQgUHJvZHVjdHM8L2E+PC9saT4KKwkgICAgICAgIDxsaT48YSBocmVmPScjcHR3Yk1ldGFkYXRhJz5WaWV3IE1ldGFkYXRhPC9hPjwvbGk+CisJICAgIDwvdWw+PGJyIGNsYXNzPSJjbHIiLz4KKwkgICAgPGRpdiBpZD0icHR3YkFkZFByb2R1Y3RzIj4KKwkgICAgICAgIDxzcGFuIGNsYXNzPSJpbnN0cnVjdGlvbnMiPgorCSAgICAgICAgQWRkIGZpbGVzIGZyb20gdGhlIHN0YWdpbmcgYXJlYSBieSBkcmFnZ2luZyB0aGVtIGludG8gdGhlIHRhcmdldCBib3ggYmVsb3cuIE9uY2UgeW91IGhhdmUgCisJICAgICAgICBGaW5pc2hlZCwgY2xpY2sgJ1NhdmUgYXMgSW5nZXN0aW9uIFRhc2snIHRvIGZpbmFsaXplLgorCSAgICAgICAgPC9zcGFuPgorCSAgICAgICAgPGRpdiBpZD0iZHJvcHBlZEZpbGVUYXJnZXQiIGNsYXNzPSJwdHdiU2VjdGlvbkJveCI+CisJICAgICAgICAgICAgPGg1PkZpbGUgRHJvcCBUYXJnZXQuLi48L2g1PgorCSAgICAgICAgCisJICAgICAgICA8L2Rpdj4KKwkgICAgICAgIDxkaXYgaWQ9ImRyb3BwZWRGaWxlTGlzdCIgY2xhc3M9InB0d2JTZWN0aW9uQm94Ij4KKwkgICAgICAgICAgICA8aDU+RmlsZXMgdG8gYmUgaW5nZXN0ZWQuLi48L2g1PgorCSAgICAgICAgICAgIDx1bD48L3VsPgorCSAgICAgICAgPC9kaXY+CisJICAgICAgICA8ZGl2IGlkPSJpdE1ldEV4dHJhY3RvclNlbGVjdG9yIiBjbGFzcz0icHR3YlNlY3Rpb25Cb3giPgorCSAgICAgICAgICAgIDxoNT5NZXRhZGF0YSBFeHRyYWN0aW9uIENvbmZpZ3VyYXRpb24uLi48L2g1PgorCSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnN0cnVjdGlvbnMiPkNob29zZSBhIG1ldGFkYXRhIGV4dHJhY3RvciBjb25maWd1cmF0aW9uIGZyb20KKwkgICAgICAgICAgICAgICAgdGhlIGxpc3QgYmVsb3c6CisJICAgICAgICAgICAgPC9zcGFuPgorCSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iaXRNZXRFeHRyYWN0b3JDb25maWdJZCIgaWQ9Iml0TWV0RXh0cmFjdG9yQ29uZmlnSWQiPgorCSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPkluaXRpYWxpemluZy4uLjwvb3B0aW9uPgorCSAgICAgICAgICAgIDwvc2VsZWN0Pjxici8+PGJyLz4KKwkgICAgICAgIDwvZGl2PgorCSAgICAgICAgPGRpdiBpZD0iaXRDcmVhdGVJbmdlc3Rpb25UYXNrQnV0dG9uIj4KKwkgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj5DbGljayBoZXJlIHRvIGNyZWF0ZSBhbiBpbmdlc3Rpb24gdGFzayBmb3IgdGhlc2UgZmlsZXM8L3NwYW4+CisJICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlNhdmUgYXMgSW5nZXN0aW9uIFRhc2siIG9uY2xpY2s9ImNyZWF0ZUluZ2VzdGlvblRhc2soKTsiLz4KKwkgICAgICAgIDwvZGl2PgorCSAgICAKKwkgICAgPC9kaXY+CisJICAgIDxkaXYgaWQ9InB0d2JNZXRhZGF0YSI+CisJICAgICAgICA8c3BhbiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj4KKwkgICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1ldGFkYXRhIGhhcyBiZWVuIGRlZmluZWQgZm9yIHRoaXMgcHJvZHVjdCB0eXBlLgorCSAgICAgICAgPC9zcGFuPgorCSAgICAgICAgPGRpdiBjbGFzcz0icHR3Yk1ldGFkYXRhTGlzdCI+PC9kaXY+CisJICAgIDwvZGl2PgorCTwvZGl2PgorICAKKyAgPC93aWNrZXQ6cmVtb3ZlPgorICAKKzwvZGl2PgorCis8IS0tICBlbmQgbWFpbiBjb250ZW50IC0tPgorPGRpdiBpZD0iZm9vdGVyIj4KKyAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi48YnIvPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9hcGFjaGUub3JnLyI+YXBhY2hlLm9yZzwvYT48YnIvPgorICAgIEJ1aWx0IE9uIEFwYWNoZSA8YSBocmVmPSJodHRwOi8vb29kdC5hcGFjaGUub3JnIj5PT0RUPC9hPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlLmphdmEgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9Ib21lUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmQzOGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9Ib21lUGFnZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5sb2dpbi5Mb2dpblBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi53b3JrYmVuY2guV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluazsKKworcHVibGljIGNsYXNzIEhvbWVQYWdlIGV4dGVuZHMgV2ViUGFnZSB7CisgIAorICBwdWJsaWMgSG9tZVBhZ2UoKSB7CisgICAgc3VwZXIoKTsKKyAgICBDdXJhdGlvbkFwcCBhcHAgPSAoKEN1cmF0aW9uQXBwKSBBcHBsaWNhdGlvbi5nZXQoKSk7CisgICAgU3RyaW5nIGxvZ2dlZEluTGFiZWwgPSBudWxsOworICAgIFN0cmluZyBsb2dvdXRMYWJlbCA9ICJMb2cgT3V0IjsKKyAgICBDdXJhdGlvblNlc3Npb24gc2Vzc2lvbiA9IChDdXJhdGlvblNlc3Npb24pZ2V0U2Vzc2lvbigpOworCisgICAgaWYgKHNlc3Npb24uaXNMb2dnZWRJbigpKSB7CisgICAgICBsb2dnZWRJbkxhYmVsID0gIkxvZ2dlZCBpbiBhcyAiICsgc2Vzc2lvbi5nZXRMb2dpblVzZXJuYW1lKCkrICIuIjsKKyAgICAgIGFkZChuZXcgTGFiZWwoImxvZ2dlZGluX2xhYmVsIiwgbG9nZ2VkSW5MYWJlbCkpOworICAgICAgYWRkKG5ldyBMYWJlbCgibG9nb3V0X2xhYmVsIiwgbG9nb3V0TGFiZWwpLnNldFZpc2libGUoZmFsc2UpKTsKKyAgICAgIGFkZChuZXcgTGluazxTdHJpbmc+KCJsb2dpbl9saW5rIikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICBwYXJhbXMuYWRkKCJhY3Rpb24iLCAibG9naW4iKTsKKyAgICAgICAgICBzZXRSZXNwb25zZVBhZ2UoTG9naW5QYWdlLmNsYXNzLCBwYXJhbXMpOworICAgICAgICB9CisgICAgICB9LnNldFZpc2libGUoZmFsc2UpKTsKKyAgICAgIGFkZChuZXcgTGluazxTdHJpbmc+KCJsb2dvdXRfbGluayIpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgcGFyYW1zLmFkZCgiYWN0aW9uIiwgImxvZ291dCIpOworICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShMb2dpblBhZ2UuY2xhc3MsIHBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICBsb2dnZWRJbkxhYmVsID0gIk5vdCBsb2dnZWQgaW4uIjsKKyAgICAgIGFkZChuZXcgTGFiZWwoImxvZ2dlZGluX2xhYmVsIiwgbG9nZ2VkSW5MYWJlbCkpOworICAgICAgYWRkKG5ldyBMYWJlbCgibG9nb3V0X2xhYmVsIiwgbG9nb3V0TGFiZWwpLnNldFZpc2libGUoZmFsc2UpKTsKKyAgICAgIGFkZChuZXcgTGluazxTdHJpbmc+KCJsb2dpbl9saW5rIikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICBwYXJhbXMuYWRkKCJhY3Rpb24iLCAibG9naW4iKTsKKyAgICAgICAgICBzZXRSZXNwb25zZVBhZ2UoTG9naW5QYWdlLmNsYXNzLCBwYXJhbXMpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGFkZChuZXcgTGluazxTdHJpbmc+KCJsb2dvdXRfbGluayIpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgcGFyYW1zLmFkZCgiYWN0aW9uIiwgImxvZ291dCIpOworICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShMb2dpblBhZ2UuY2xhc3MsIHBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgIH0uc2V0VmlzaWJsZShmYWxzZSkpOworICAgIH0KKworICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGFwcC5nZXRQcm9qZWN0TmFtZSgpICsgIiBDQVMgQ3VyYXRpb24iOworICAgIGFkZChuZXcgTGFiZWwoInByb2plY3RfbmFtZSIsIHByb2plY3ROYW1lKSk7CisgICAgYWRkKG5ldyBMYWJlbCgiY3J1bWJfbmFtZSIsICJNYWluIikpOworICAgIGFkZChuZXcgTGluazxTdHJpbmc+KCJob21lX2xpbmsiKXsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFdvcmtiZW5jaFBhZ2UuY2xhc3MpOworICAgICAgfQorICAgIH0pOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlX2Vkcm4uaHRtbCBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlX2Vkcm4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQwYzFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vSG9tZVBhZ2VfZWRybi5odG1sCkBAIC0wLDAgKzEsMjE5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sCisgICAgeG1sbnM6d2lja2V0PSJodHRwOi8vd2lja2V0LmFwYWNoZS5vcmcvZHRkcy5kYXRhL3dpY2tldC14aHRtbDEuNC1zdHJpY3QuZHRkIj4KKzxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBpZD0icGFnZSI+CisgICAgPGRpdiBpZD0ibmNpYmFubmVyIj4KKworICAgICAgICA8ZGl2IGlkPSJuY2liYW5uZXItaW5uZXIiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2FuY2VyLmdvdi8iPjxoMiBjbGFzcz0ibmNpbG9nbyI+TmF0aW9uYWwgQ2FuY2VyIEluc3RpdHV0ZTwvaDI+PC9hPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2FuY2VyLmdvdi8iPjxoMiBjbGFzcz0iY2RnbG9nbyI+d3d3LmNhbmNlci5nb3Y8L2gyPjwvYT4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm5paC5nb3YvIj48aDIgY2xhc3M9Im5paGxvZ28iPk5hdGlvbmFsIEluc3RpdHV0ZXMgb2YgSGVhbHRoPC9oMj48L2E+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIDxiciBjbGFzcz0iY2xyIi8+CisKKyAgICA8ZGl2IGlkPSJlZHJubG9nbyI+CisgICAgICAgIDxoMSAgY2xhc3M9ImhlYWRlci10aXRsZSI+PHdpY2tldDpsaW5rPjxpbWcgaWQ9ImVkcm5sb2dvLWxvZ28iIHNyYz0iZWRybi1sb2dvLnBuZyIvPjwvd2lja2V0Omxpbms+RWFybHkgRGV0ZWN0aW9uIFJlc2VhcmNoIE5ldHdvcms8L2gxPgorICAgICAgICA8aDIgIGNsYXNzPSJoZWFkZXItdGl0bGUiPkJpb21hcmtlcnM6IFRoZSBLZXkgdG8gRWFybHkgRGV0ZWN0aW9uPC9oMj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJkY3Bsb2dvIj4KKyAgICAgICAgPGgyIGNsYXNzPSJkY3Bsb2dvIj48YSBocmVmPSJodHRwOi8vcHJldmVudGlvbi5jYW5jZXIuZ292Ij5EaXZpc2lvbiBvZiBDYW5jZXIgUHJldmVudGlvbjwvYT48L2gyPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0idXNlcmRldGFpbHMiPgorICAgICAgICA8c3BhbiB3aWNrZXQ6aWQ9ImxvZ2dlZGluX2xhYmVsIj5Ob3QgTG9nZ2VkIEluLjwvc3Bhbj4gJm5ic3A7PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJsb2dpbl9saW5rIj5Mb2cgSW48L2E+CisgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImxvZ291dF9saW5rIj5Mb2cgT3V0PC9hPgorICAgICAgICA8L2Rpdj4KKyAgICA8aDIgY2xhc3M9ImFwcC10aXRsZSIgc3R5bGU9Im1hcmdpbi10b3A6MTQ2cHg7IiB3aWNrZXQ6aWQ9InByb2plY3RfbmFtZSI+QXBwbGljYXRpb24gVGl0bGUgR29lcyBIZXJlPC9oMj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgICAgPCEtLSBCcmVhZGNydW1icyBBcmVhIC0tPgorICAgICAgICA8ZGl2IGlkPSJicmVhZGNydW1icyI+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJob21lX2xpbmsiPkhvbWU8L2E+Jm5ic3A7LyZuYnNwOzwvbGk+CisgICAgICAgICAgICA8bGk+PHNwYW4gd2lja2V0OmlkPSJjcnVtYl9uYW1lIj5NYWluPC9zcGFuPjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2Rpdj4gICAgICAgICAgICAKKyAgICA8L2Rpdj48IS0tIEVuZCBCcmVhZGNydW1icyAtLT4KKyAgIAorICAgPCEtLSAgcGFnZSBjb250ZW50IC0tPgorPHdpY2tldDpjaGlsZC8+CisgIAorICA8IS0tICBzbyB0aGF0IGl0IHByZXZpZXdzIHJpZ2h0IC0tPgorICA8d2lja2V0OnJlbW92ZT4gICAKKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL1dvcmtiZW5jaC5jc3MiLz4KKyAgICAgIAorICAgIDxkaXYgY2xhc3M9InBhZ2UiPgorICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgYnJvd3NlcnMiPgorICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlU3RhZ2luZ0NvbnRhaW5lciI+CisgICAgICAgICAgICA8aDU+U3RhZ2luZyBBcmVhPC9oNT4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VTdGFnaW5nUGF0aCIgY2xhc3M9InBhdGhiYXIiPmluaXRpYWxpemluZy4uLjwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZVN0YWdpbmciIGNsYXNzPSJicm93c2VyIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlU3RhZ2luZ05hdiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImZpbGVUcmVlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpcmVjdG9yeSBuYXYiPjxhIGlkPSJzdGFnaW5nTmF2VXBSb290IiBocmVmPSIjIiByZWw9Ii4iPi48L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpcmVjdG9yeSBuYXYiPjxhIGlkPSJzdGFnaW5nTmF2VXBPbmUiICBocmVmPSIjIiByZWw9Ii4uIj4uLjwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZVN0YWdpbmdDb250ZW50cyI+PC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBpZD0ic3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2giICAgY2xhc3M9ImVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImluZm9Ob01ldGFkYXRhRXh0cmFjdG9yRGVmaW5lZCIgY2xhc3M9ImluZm8gb3ZlcmxheSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvQ29udGVudCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gTWV0YWRhdGEgRGV0ZWN0ZWQuLi48YnIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzdGFnaW5nTWV0Q29udGFpbmVyIj4gICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ic3RhZ2luZ01ldEV4dHJhY3RvclNlbGVjdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0xpc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItMSI+SW5pdGlhbGl6aW5nLi4uPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzdGFnaW5nTWV0RXh0cmFjdG9yUmVmcmVzaEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iUmVmcmVzaCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlQ2F0YWxvZ0NvbnRhaW5lciI+CisgICAgICAgICAgICA8aDU+RmlsZSBNYW5hZ2VyIENhdGFsb2c8L2g1PgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZUNhdGFsb2dQYXRoIiBjbGFzcz0icGF0aGJhciI+aW5pdGlhbGl6aW5nLi4uPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlQ2F0YWxvZyIgY2xhc3M9ImJyb3dzZXIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VDYXRhbG9nTmF2Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iZmlsZVRyZWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5IG5hdiI+PGEgaWQ9ImNhdGFsb2dOYXZVcFJvb3QiIGhyZWY9IiMiIHJlbD0iLiI+LjwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5IG5hdiI+PGEgaWQ9ImNhdGFsb2dOYXZVcE9uZSIgIGhyZWY9IiMiIHJlbD0iLi4iPi4uPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlQ2F0YWxvZ0NvbnRlbnRzIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2giIGNsYXNzPSJlZGl0b3IiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50Ij48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGJyIGNsYXNzPSJjbHIiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciB0YXNrcyI+CisgICAgICAgICAgICA8ZGl2IGlkPSJpbmdlc3Rpb25UYXNrTGlzdCI+CisgICAgICAgICAgICAgICAgPGg1PkZpbGUgTWFuYWdlciBJbmdlc3Rpb24gVGFzayBMaXN0PC9oNT4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJpbmdlc3Rpb25UYXNrTGlzdENvbnRlbnQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGlkPSJpbmdlc3Rpb25UYXNrTGlzdEl0ZW1zIj4KKyAgICAgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDo1MHB4OyI+VGFza0lkPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPkNyZWF0ZWQ8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+RmlsZXM8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+UG9saWN5PC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3RUeXBlPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPk1ldEV4dHJhY3RvcjwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD5NZXRFeHQgQ29uZmlnPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPlN0YXR1czwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0iYm9yZGVyLXJpZ2h0LXdpZHRoOjBweDsiPkFjdGlvbjwvdGg+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICAgCisgICAgPCEtLSBwcm9kdWN0IHR5cGUgd29ya2JlbmNoIC0tPgorICAgIDxkaXYgaWQ9InByb2R1Y3RUeXBlV29ya2JlbmNoQ29udGVudHMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0nI3B0d2JBZGRQcm9kdWN0cyc+QWRkIFByb2R1Y3RzPC9hPjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0nI3B0d2JNZXRhZGF0YSc+VmlldyBNZXRhZGF0YTwvYT48L2xpPgorICAgICAgICA8L3VsPjxiciBjbGFzcz0iY2xyIi8+CisgICAgICAgIDxkaXYgaWQ9InB0d2JBZGRQcm9kdWN0cyI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj4KKyAgICAgICAgICAgIEFkZCBmaWxlcyBmcm9tIHRoZSBzdGFnaW5nIGFyZWEgYnkgZHJhZ2dpbmcgdGhlbSBpbnRvIHRoZSB0YXJnZXQgYm94IGJlbG93LiBPbmNlIHlvdSBoYXZlIAorICAgICAgICAgICAgRmluaXNoZWQsIGNsaWNrICdTYXZlIGFzIEluZ2VzdGlvbiBUYXNrJyB0byBmaW5hbGl6ZS4KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgIDxkaXYgaWQ9ImRyb3BwZWRGaWxlVGFyZ2V0IiBjbGFzcz0icHR3YlNlY3Rpb25Cb3giPgorICAgICAgICAgICAgICAgIDxoNT5GaWxlIERyb3AgVGFyZ2V0Li4uPC9oNT4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGlkPSJkcm9wcGVkRmlsZUxpc3QiIGNsYXNzPSJwdHdiU2VjdGlvbkJveCI+CisgICAgICAgICAgICAgICAgPGg1PkZpbGVzIHRvIGJlIGluZ2VzdGVkLi4uPC9oNT4KKyAgICAgICAgICAgICAgICA8dWw+PC91bD4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBpZD0iaXRNZXRFeHRyYWN0b3JTZWxlY3RvciIgY2xhc3M9InB0d2JTZWN0aW9uQm94Ij4KKyAgICAgICAgICAgICAgICA8aDU+TWV0YWRhdGEgRXh0cmFjdGlvbiBDb25maWd1cmF0aW9uLi4uPC9oNT4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj5DaG9vc2UgYSBtZXRhZGF0YSBleHRyYWN0b3IgY29uZmlndXJhdGlvbiBmcm9tCisgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IGJlbG93OgorICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Iml0TWV0RXh0cmFjdG9yQ29uZmlnSWQiIGlkPSJpdE1ldEV4dHJhY3RvckNvbmZpZ0lkIj4KKyAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5Jbml0aWFsaXppbmcuLi48L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8L3NlbGVjdD48YnIvPjxici8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgaWQ9Iml0Q3JlYXRlSW5nZXN0aW9uVGFza0J1dHRvbiI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imluc3RydWN0aW9ucyI+Q2xpY2sgaGVyZSB0byBjcmVhdGUgYW4gaW5nZXN0aW9uIHRhc2sgZm9yIHRoZXNlIGZpbGVzPC9zcGFuPgorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJTYXZlIGFzIEluZ2VzdGlvbiBUYXNrIiBvbmNsaWNrPSJjcmVhdGVJbmdlc3Rpb25UYXNrKCk7Ii8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgCisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJwdHdiTWV0YWRhdGEiPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imluc3RydWN0aW9ucyI+CisgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtZXRhZGF0YSBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGlzIHByb2R1Y3QgdHlwZS4KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InB0d2JNZXRhZGF0YUxpc3QiPjwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgCisgIDwvd2lja2V0OnJlbW92ZT4KKyAgIAorICAgCisgICAKKzwhLS0gIGVuZCBwYWdlIGNvbnRlbnQgLS0+CisgIDwvZGl2PiAKKworPGRpdiBpZD0iZm9vdGVyIj4KKyAgICBBIFNlcnZpY2Ugb2YgdGhlIE5hdGlvbmFsIENhbmNlciBJbnN0aXR1dGU8YnIvPjxici8+CisgIDx3aWNrZXQ6bGluaz4KKyAgICA8YSBocmVmPSJodHRwOi8vaGhzLmdvdiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+CisgICAgICAgIDxpbWcgc3JjPSJmb290ZXJfaGhzLmdpZiIgYWx0PSJEZXBhcnRtZW50IG9mIEhlYWx0aCBhbmQgSHVtYW4gU2VydmljZXMiLz4KKyAgICA8L2E+CisKKyAgICA8YSBocmVmPSJodHRwOi8vbmloLmdvdiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+ICAgICAgCisgICAgICAgIDxpbWcgc3JjPSJmb290ZXJfbmloLmdpZiIgYWx0PSJOYXRpb25hbCBJbnN0aXR1dGVzIG9mIEhlYWx0aCIvPgorICAgIDwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vdXNhLmdvdiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+CisgICAgICAgIDxpbWcgc3JjPSJmb290ZXJfdXNhZ292LmdpZiIvPgorICAgIDwvYT4KKyAgPC93aWNrZXQ6bGluaz4KKzwvZGl2PgorCisgICAgPHdpY2tldDpsaW5rPgorICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImVkcm4taW5mb3JtYXRpY3Nfd2lja2V0LmNzcyIvPiAgIAorICAgIDwvd2lja2V0Omxpbms+IAorICAgIAorICAgIDx3aWNrZXQ6cmVtb3ZlPgorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iZWRybi1pbmZvcm1hdGljcy5jc3MiLz4gICAKKyAgICA8L3dpY2tldDpyZW1vdmU+CisKKzwvYm9keT4KKzwvaHRtbD4gICAgCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vSG9tZVBhZ2Vfd2lja2V0LmNzcyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlX3dpY2tldC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiZjEyYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL0hvbWVQYWdlX3dpY2tldC5jc3MKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworQENIQVJTRVQgIlVURi04IjsKKworCisvKiBESVYuQ0FTLUhFQURFUiAqLworZGl2I2Nhcy1oZWFkZXIgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGhlaWdodDo1NnB4OworICAgIHBhZGRpbmc6NXB4OworICAgIHRleHQtYWxpZ246cmlnaHQ7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzAwMDsKKyAgICBvdmVyZmxvdzpub25lOworICAgIGJhY2tncm91bmQ6dXJsKC4uLy4uL2ltYWdlcy9ibGFja2ZhZGUtc3luY2QuanBnKSBzY3JvbGwgMHB4IDBweCByZXBlYXQteDsKK30KKworLyogRElWLkNBUy1MT0dPLUxFRlQgKi8KK2RpdiNjYXMtbG9nby1sZWZ0IHsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICB0b3A6MHB4OworICAgIGxlZnQ6MHB4OworICAgIGhlaWdodDo2N3B4OworICAgIHdpZHRoOjUwMHB4OworfQorLyogRElWLkNBUy1MT0dPLVJJR0hUICovCitkaXYjY2FzLWxvZ28tcmlnaHQgeworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIHRvcDowcHg7CisgICAgcmlnaHQ6MHB4OworICAgIGhlaWdodDo2N3B4OworICAgIHdpZHRoOjI5MHB4OworfQorCisvKiBIMi5BUFAtVElUTEUgKi8KK2gyLmFwcC10aXRsZSB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgdG9wOjY3cHg7CisgICAgcmlnaHQ6MHB4OworICAgIG1hcmdpbjowcHg7CisgICAgd2lkdGg6MTAwJTsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBwYWRkaW5nLWxlZnQ6MHB4OworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICBmb250LXNpemU6MTVweDsKKyAgICBsZXR0ZXItc3BhY2luZzowLjAzZW07Cit9CisvKiBESVYuVVNFUkRFVEFJTFMgKi8KK2Rpdi51c2VyZGV0YWlscyB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgdG9wOjEwMnB4OworICAgIHJpZ2h0OjVweDsKKyAgICBmb250LXNpemU6NzUlOworICAgIHotaW5kZXg6MTAKK30KK2Rpdi51c2VyZGV0YWlscyBhIHsKKyAgICAKK30KKworLyogRElWI0JSRUFEQ1JVTUJTICovCitkaXYjYnJlYWRjcnVtYnMgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIG1hcmdpbi10b3A6MzBweDsKKyAgICBwYWRkaW5nOjRweDsKKyAgICBwYWRkaW5nLXJpZ2h0OjVweDsKKyAgICBwYWRkaW5nLWxlZnQ6NXB4OworICAgIHBhZGRpbmctYm90dG9tOjVweDsKKyAgICBmb250LXNpemU6ODUlOworfQorZGl2I2JyZWFkY3J1bWJzIHVsIHsKKyAgICBsaXN0LXN0eWxlOm5vbmU7CisgICAgbWFyZ2luOjBweDsKKyAgICBwYWRkaW5nOjBweDsKK30KK2RpdiNicmVhZGNydW1icyB1bCBsaSB7CisgICAgZGlzcGxheTppbmxpbmU7Cit9CisKK2RpdiNicmVhZGNydW1icyB1bCBsaSBhIHsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgIAorfQorCisvKioKKyAqIENBUyBGb290ZXIgU3R5bGVzCisgKgorICogVGhlc2UgZGVzY3JpYmUgdGhlIGJhc2ljIGxheW91dCBvZiB0aGUgZm9vdGVyIGNvZGUgaW4gL3ZpZXdzL2NvbW1vbi9jYXMtY3VyYXRvci1mb290ZXIuanNwCisgKi8KKyAKK2RpdiNmb290ZXIgeworICAgIGZvbnQtc2l6ZTo5MCU7CisgICAgdGV4dC1hbGlnbjpjZW50ZXI7CisgICAgbWFyZ2luLXRvcDozNXB4OworICAgIGJvcmRlci10b3A6c29saWQgMXB4ICNkZGQ7CisgICAgcGFkZGluZy10b3A6MTVweDsKKyAgICBwYWRkaW5nLWJvdHRvbTo4cHg7Cit9CisKK2RpdiNmb290ZXIgaW1nIHsKKyAgICBib3JkZXI6bm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6MnB4OworICAgIG1hcmdpbi1sZWZ0OjVweDsgICAgCit9CisKKy8qKgorICogQ0FTIEludGVyZmFjZSBTdHlsZXMKKyAqCisgKiBUaGVzZSBkZXNjcmliZSB0aGUgbGF5b3V0IG9mIHRoZSBtYWluIGN1cmF0b3IgaW50ZXJmYWNlIGxvY2F0ZWQgYXQgL21haW4uanNwCisgKi8KKyAKKyAKKyAKKy8qIERJVi5FUlJPUgorICogQSByZWQgJ2Vycm9yJyBib3ggc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgZXJyb3IgbWVzc2FnZXMuCisgKi8KK2Rpdi5lcnJvciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjOworICAgIHBhZGRpbmc6NXB4OworICAgIG1hcmdpbi1yaWdodDoxNXB4OworICAgIGJvcmRlcjpzb2xpZCAxcHggI2Y0NDsKK30KKworLyogRElWLlNVQ0NFU1MKKyAqIEEgZ3JlZW4gJ3N1Y2Nlc3MnIGJveCBzdWl0YWJsZSBmb3IgZGlzcGxheWluZyBzdWNjZXNzIG1lc3NhZ2VzLgorICovCitkaXYuc3VjY2VzcyAgeworICAgIHBhZGRpbmc6NXB4OworICAgIGJvcmRlcjpzb2xpZCAxcHggZ3JlZW47CisgICAgYmFja2dyb3VuZC1jb2xvcjojY2ZjOyAgCisgICAgbWFyZ2luLXJpZ2h0OjEwcHg7Cit9CisKKy8qIEhFQURFUlMgKEgxLEgyLEgzLC4uLi4uLikgKi8KK2gyLnRpdGxlIHsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBtYXJnaW46MHB4OworICAgIGJvcmRlci10b3A6c29saWQgMnB4ICM5MDA7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzMwMDsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgZm9udC1zaXplOjE1cHg7Cit9CisKK2g0IHsKKyAgICBib3JkZXItYm90dG9tOmRvdHRlZCAxcHggIzg4ODsKK30KKworCisvKioKKyAqIFBBR0UgU1RSVUNUVVJFCisgKgorICovCisgCisvKiBMT0dJTiBGT1JNICovCitmb3JtI2xvZ2luLWZvcm0geworICAgIGJvcmRlcjpzb2xpZCAwcHggI2Y2NjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7CisgICAgbWFyZ2luOjVweDsKKyAgICBwYWRkaW5nOjNweDsKKyAgICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KK2Zvcm0jbG9naW4tZm9ybSBoMyB7CisgICAgY29sb3I6IzMzMzsKKyAgICBtYXJnaW4tdG9wOjBweDsKKyAgICBib3JkZXItYm90dG9tOmRvdHRlZCAwcHggIzQ0NDsKKyAgICAgICAgCit9Citmb3JtI2xvZ2luLWZvcm0gaW5wdXRbdHlwZT10ZXh0XSwgZm9ybSNsb2dpbi1mb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdIHsKKyAgICBib3JkZXI6c29saWQgMXB4ICM4ODg7CisgICAgcGFkZGluZzozcHg7CisgICAgd2lkdGg6MTUwcHg7Cit9Citmb3JtI2xvZ2luLWZvcm0gdGFibGUgeworICAgIGNvbG9yOiMzMzM7CisgICAgbWFyZ2luOjVweDsKKyAgICBtYXJnaW4tdG9wOjBweDsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7CisgICAgd2lkdGg6MjQycHg7Cit9Citmb3JtI2xvZ2luLWZvcm0gaW5wdXRbdHlwZT1zdWJtaXRdIHsKKyAgICBwYWRkaW5nOjNweDsKK30KKworLyogSU5GT1JNQVRJT05BTCBNRVNTQUdFUyAqLworLyogYWxsIGFic29sdXRlbHkgcG9zaXRpb25lZCBpbmZvcyBhcmUgYXQgei1pbmRleCAxMDAwLTExMDApCisgKi8KK2Rpdi5pbmZvIHsKKyAgICBmb250LXNpemU6MTNweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNhY2Y7CisgICAgZm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjsKKyAgICBjb2xvcjojMzQ1OyAKKyAgICBkaXNwbGF5Om5vbmU7ICAgCit9CitkaXYuaW5mbyBpbnB1dFt0eXBlPWJ1dHRvbl0geworICAgIHBhZGRpbmc6MnB4OworICAgIG1hcmdpbjo1cHggMHB4OworfQorZGl2I2luZm9Ob01ldGFkYXRhRXh0cmFjdG9yRGVmaW5lZCB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIHRvcDoyOHB4OworICAgIHJpZ2h0Oi0ycHg7CisgICAgei1pbmRleDoxMDAwOworICAgIHdpZHRoOjYwJTsgIAorICAgIGxpbmUtaGVpZ2h0OjE4cHg7Cit9CitkaXYuaW5mb0NvbnRlbnQgeworICAgIHBhZGRpbmc6NXB4OyAgICAKK30KKworLyogTElOS1MgKi8KKworYSB7CisgICAgY29sb3I6IzIyMjsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKK30KK2E6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Cit9CithLmFjdGlvbmxpbmsgeworICAgIGNvbG9yOiM0OGE7CisgICAgcGFkZGluZy1sZWZ0OjVweDsgICAKK30KK2RpdiNicmVhZGNydW1icyBhIHsKKyAgICBjb2xvcjojZmZmOworfQorCisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vYmctYm9keS5naWYgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9iZy1ib2R5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjkwMDYyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vYmctYm9keS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vYmxhY2tmYWRlLXN5bmNkLmpwZyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2JsYWNrZmFkZS1zeW5jZC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMDVlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2JsYWNrZmFkZS1zeW5jZC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZWRybi1pbmZvcm1hdGljcy5jc3MgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9lZHJuLWluZm9ybWF0aWNzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjczYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZWRybi1pbmZvcm1hdGljcy5jc3MKQEAgLTAsMCArMSw0MjEgQEAKK0BDSEFSU0VUICJVVEYtOCI7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2h0bWwsIGJvZHkgeworICAgIHBhZGRpbmc6MHB4OworICAgIG1hcmdpbjowcHggYXV0bzsKKyAgICBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IHVybChiZy1ib2R5LmdpZikgcmVwZWF0LXggc2Nyb2xsIDAgMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7CisgICAgZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCJBcmlhbCIsIkhlbHZldGljYSIsIlZlcmRhbmEiLCJzYW5zLXNlcmlmIjsKKyAgICBmb250LXNpemU6MTRweDsKK30KKworLyoqCisgKiBESVYuTkNJQkFOTkVSCisgKiBUaGlzIGlzIHRoZSByZWQgTmF0aW9uYWwgQ2FuY2VyIEluc3RpdHV0ZSBoZWFkZXIgYmFyCisgKi8KK2RpdiNuY2liYW5uZXIgeworICAgIGJhY2tncm91bmQ6I2E5MDEwMSBub25lIHJlcGVhdDsgCisgICAgcG9zaXRpb246cmVsYXRpdmU7Cit9CitkaXYjbmNpYmFubmVyLWlubmVyIHsKKyAgICB3aWR0aDo5NzRweDsKKyAgICBtYXJnaW46MHB4IGF1dG87CisgICAgcG9zaXRpb246cmVsYXRpdmU7ICAKK30KK2Rpdi4jbmNpYmFubmVyLWlubmVyIGEgeworICAgIGRpc3BsYXk6aW5saW5lOyAKK30KK2RpdiNkY3Bsb2dvIHsKKyAgICB3aWR0aDo5NzRweDsKKyAgICBtYXJnaW46YXV0bzsgICAgCit9CitoMi5uY2lsb2dvLCBoMi5uaWhsb2dvLCBoMi5jZGdsb2dvLCBoMi5kY3Bsb2dvIHsKKyAgICBib3JkZXItYm90dG9tOjAgbm9uZTsKKyAgICBkaXNwbGF5OmJsb2NrOworICAgIGZsb2F0OmxlZnQ7IAorICAgIG1hcmdpbjowOworICAgIHBhZGRpbmc6MDsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICB0ZXh0LWluZGVudDotOTk5OXB4OworfQorCitoMi5uY2lsb2dvIHsKKyAgICBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IHVybChsLW5jaS5naWYpIG5vLXJlcGVhdCBzY3JvbGwgMCAwOworICAgIGhlaWdodDo0M3B4OworICAgIHdpZHRoOjI3OHB4OworfQoraDIuY2RnbG9nbyB7CisgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwobC1jZGcuZ2lmKSBuby1yZXBlYXQgc2Nyb2xsIDAgMDsKKyAgICBmbG9hdDpyaWdodDsKKyAgICBoZWlnaHQ6NDNweDsKKyAgICB3aWR0aDo5MHB4OworfQoraDIubmlobG9nbyB7CisgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwobC1uaWguZ2lmKSBuby1yZXBlYXQgc2Nyb2xsIDAgMDsKKyAgICBmbG9hdDpyaWdodDsKKyAgICBoZWlnaHQ6NDNweDsKKyAgICB3aWR0aDoxNzNweDsKK30KK2gyLmRjcGxvZ28geworICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQgdXJsKGwtZGNwLmdpZikgbm8tcmVwZWF0IHNjcm9sbCAwIDA7CisgICAgZmxvYXQ6cmlnaHQ7CisgICAgaGVpZ2h0OjIzcHg7CisgICAgbWFyZ2luOi00NXB4IC0xMnB4IDE2cHg7CisgICAgd2lkdGg6MTY0cHg7Cit9CisKK2RpdiNwYWdlLCBkaXYjZm9vdGVyIHsKKyAgICB3aWR0aDo5NzRweDsgICAgCisgICAgbWFyZ2luOjBweCBhdXRvOworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworfQorCisvKioKKyAqIERJVi5FRFJOSU5GT1JNQVRJQ1MKKyAqIFRoaXMgaXMgdGhlIGhlYWRlciB0aGF0IHByZWNlZWRzIGFwcGxpY2F0aW9uIGNvbnRlbnQuIAorICovCitkaXYjZWRybmluZm9ybWF0aWNzIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBtYXJnaW46YXV0bzsKKyAgICB3aWR0aDo5NzRweDsKK30KKworLyoqCisgKiBESVYuQ0FTLUhFQURFUgorICogVGhpcyBpcyB0aGUgaGVhZGVyIHRoYXQgcHJlY2VkZXMgYXBwbGljYXRpb24gY29udGVudC4gCisgKi8KK2RpdiNlZHJuaW5mb3JtYXRpY3MuY2FzLWhlYWRlciB7CisgICAgYmFja2dyb3VuZDp1cmwoYmxhY2tmYWRlLXN5bmNkLmpwZykgc2Nyb2xsIDBweCAwcHggcmVwZWF0LXg7Cit9CitkaXYjZWRybmluZm9ybWF0aWNzLmNhcy1oZWFkZXIgZGl2Lm1lbnUgeworICAgIHBhZGRpbmctdG9wOjUwcHg7ICAgCit9CisKKy8qKgorICogRElWLkNBUy1MT0dPLUxFRlQKKyAqIFRoaXMgaXMgdGhlIE5DSS9FRFJOIGxvZ28gZGl2IHdoaWNoIGxpdmVzIGluc2lkZSBESVYuRURSTklORk9STUFUSUNTLgorICovCitkaXYjZWRybmxvZ28uY2FzLWxvZ28tbGVmdCB7CisgICAgYmFja2dyb3VuZDp1cmwobmNpLXNtYWxsLmpwZykgc2Nyb2xsIC0ycHggMXB4IG5vLXJlcGVhdDsKKyAgICBmb250LXNpemU6MTRweDsKK30KKy8qKgorICogRElWLkNBUy1MT0dPLVJJR0hUCisgKiBUaGlzIGlzIHRoZSBkb3VibGUtaGVsaXggZ3JhcGhpYworICovCitkaXYjZWRybi1kbmEuY2FzLWxvZ28tcmlnaHQgeworICAgIGJhY2tncm91bmQ6dXJsKGVkcm5fZG5hLWJpZ2dlci5qcGcpIHNjcm9sbCBsZWZ0IHRvcCBuby1yZXBlYXQ7Cit9CisKKworLyoqCisgKiBESVYuRURSTkxPR08KKyAqIFRoaXMgaXMgdGhlIE5DSS9FRFJOIGxvZ28gZGl2IHdoaWNoIGxpdmVzIGluc2lkZSBESVYuRURSTklORk9STUFUSUNTLgorICovCitkaXYjZWRybmxvZ28geworICAgIGhlaWdodDo2OHB4OworICAgIHdpZHRoOjk3NHB4OworICAgIG1hcmdpbjowcHggYXV0bzsgICAgCit9CitpbWcjZWRybmxvZ28tbG9nbyB7CisgICAgd2lkdGg6NjRweDsKKyAgICBtYXJnaW4tdG9wOi0yMHB4OworICAgIHBhZGRpbmc6M3B4OworICAgIG1hcmdpbi1yaWdodDo1cHg7CisgICAgdmVydGljYWwtYWxpZ246dG9wOworICAgIGZsb2F0OmxlZnQ7CisgICAgYm9yZGVyOnNvbGlkIDBweCAjOTU1OyAgCit9CitkaXYjZWRybmxvZ28gaDEuaGVhZGVyLXRpdGxlIHsKKyAgICBmb250LWZhbWlseToiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmOworICAgIHBhZGRpbmctdG9wOjI1cHg7CisgICAgcGFkZGluZy1ib3R0b206MTVweDsKKyAgICBtYXJnaW4tdG9wOjE1cHg7CisgICAgbGluZS1oZWlnaHQ6MTZweDsKKyAgICB0ZXh0LWFsaWduOmxlZnQ7CisgICAgd2lkdGg6OTc0cHg7CisgICAgZm9udC1zaXplOjMxcHg7CisgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICBib3JkZXI6bm9uZTsKK30KK2RpdiNlZHJubG9nbyBoMiB7CisgICAgY29sb3I6IzIyMjIyMjsKKyAgICBmb250LXNpemU6MTJweDsKKyAgICBmb250LXN0eWxlOml0YWxpYzsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgbWFyZ2luOi0xMHB4IGF1dG8gMTZweDsKK30KK2RpdiNlZHJubG9nbyBoMi5oZWFkZXItdGl0bGUgeworICAgIHBhZGRpbmc6YXV0bzsKKyAgICBtYXJnaW46LTEwcHggYXV0byAxNnB4IGF1dG87CisgICAgZm9udC1zaXplOjEycHg7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOworICAgIGZvbnQtc3R5bGU6aXRhbGljOworICAgIGNvbG9yOiMyMjI7CisgICAgYm9yZGVyOm5vbmU7Cit9CisKK2RpdiNlZHJubG9nbyBzcGFuLnNtYWxsZXIgeworICAgIGZvbnQtc2l6ZTo4NSU7CisgICAgY29sb3I6I2JiYjsgCit9CisvKioKKyAqIERJVi5FRFJOLUROQQorICogVGhpcyBpcyB0aGUgZG91YmxlLWhlbGl4IGdyYXBoaWMKKyAqLworZGl2I2Vkcm4tZG5hIHsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICB0b3A6MHB4OworICAgIHJpZ2h0OjBweDsKKyAgICBoZWlnaHQ6NjdweDsKKyAgICB3aWR0aDoyOTBweDsKKyAgICBiYWNrZ3JvdW5kOnVybChlZHJuX2RuYS1iaWdnZXIuanBnKSBzY3JvbGwgbGVmdCB0b3Agbm8tcmVwZWF0OworfQorCisKKy8qKgorICogSDIuQVBQLVRJVExFCisgKiBUaGlzIGlzIHRoZSB0aXRsZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJdCBsaXZlcyBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlCisgKiBvZiBESVYuRURSTklORk9STUFUSUNTLgorICovCitoMi5hcHAtdGl0bGUgeworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIHRvcDowcHg7CisgICAgcmlnaHQ6MHB4OworICAgIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7CisgICAgbWFyZ2luOjBweDsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBwYWRkaW5nLXJpZ2h0OjBweDsKKyAgICBjb2xvcjojNzIyOworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICBmb250LXNpemU6MTNweDsKKyAgICBmb250LXdlaWdodDpib2xkOworICAgIGxldHRlci1zcGFjaW5nOjAuMDBlbTsKKyAgICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7CisgICAgei1pbmRleDoxMDA7Cit9CisKKy8qKgorICogRElWLkVSUk9SCisgKiBUaGlzIHByb3ZpZGVzIGEgcmVkICdlcnJvcicgYm94IHN1aXRhYmxlIGZvciBkaXNwbGF5aW5nIGVycm9yCisgKiBtZXNzYWdlcy4KKyAqLworZGl2LmVycm9yIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2M7CisgICAgcGFkZGluZzo1cHg7CisgICAgbWFyZ2luLXJpZ2h0OjE1cHg7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjZjQ0OworfQorCisvKioKKyAqIERJVi5TVUNDRVNTCisgKiBUaGlzIHByb3ZpZGVzIGEgZ3JlZW4gJ3N1Y2Nlc3MnIGJveCBzdWl0YWJsZSBmb3IgZGlzcGxheWluZworICogc3VjY2Vzc2Z1bCBtZXNzYWdlcy4KKyAqLworZGl2LnN1Y2Nlc3MgIHsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBib3JkZXI6c29saWQgMXB4IGdyZWVuOworICAgIGJhY2tncm91bmQtY29sb3I6I2NmYzsgIAorICAgIG1hcmdpbi1yaWdodDoxMHB4OworfQorCisvKioKKyAqIERJVi5VU0VSREVUQUlMUworICogVGhpcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9naW4tc3RhdHVzIG9mIHRoZSB1c2VyLgorICogSXQgc2hvdWxkIGxpdmUgd2l0aGluIGRpdiNlZHJuaW5mb3JtYXRpY3MKKyAqLworZGl2LnVzZXJkZXRhaWxzIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICB0ZXh0LWFsaWduOnJpZ2h0OworICAgIHdpZHRoOjk3NHB4OworICAgIG1hcmdpbjphdXRvOworICAgIGNvbG9yOiMxMTE7CisgICAgZm9udC1zaXplOjExcHg7Cit9CitkaXYudXNlcmRldGFpbHMgYSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKKyAgICBjb2xvcjojNDQ0OyAKK30KKworLyoqCisgT3ZlcnJpZGVzIHJlcXVpcmVkIHRvIGVuYWJsZSB1c2VyIGRldGFpbHMgdG8gbm90IGJlIG92ZXJsYXllZAorIG9uIHRvcCBvZiBjb250YWluZXIgZm9yIHRoZSBzdGFnaW5nL2ZtIGFyZWEKKyoqLworZGl2LmNvbnRhaW5lcnsKKyAgICB0b3A6MTFweDsKK30KKworLyoqIAorICogRElWI0JSRUFEQ1JVTUJTCisgKiBUaGlzIHByb3ZpZGVzIHRoZSBhcmVhIGZvciBicmVhZGNydW1icyBuYXZpZ2F0aW9uIGxpbmtzCisgKi8KKyAKK2RpdiNicmVhZGNydW1icy5jYXMtYnJlYWRjcnVtYnMgYSB7CisgICAgY29sb3I6IzMzMzsKK30KKworZGl2I2JyZWFkY3J1bWJzIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBtYXJnaW4tdG9wOjJweDsKKyAgICBwYWRkaW5nOjRweDsKKyAgICBwYWRkaW5nLXJpZ2h0OjVweDsKKyAgICBwYWRkaW5nLWxlZnQ6NXB4OworICAgIGJvcmRlci10b3A6c29saWQgMHB4ICM3MDAwMDM7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzcwMDAwMzsKKyAgICBwYWRkaW5nLWJvdHRvbTo1cHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmOyAgCisgICAgY29sb3I6IzMzMzsKKyAgICBmb250LXNpemU6ODUlOworfQorZGl2I2JyZWFkY3J1bWJzIHVsIHsKKyAgICBsaXN0LXN0eWxlOm5vbmU7CisgICAgbWFyZ2luOjBweDsKKyAgICBwYWRkaW5nOjBweDsKK30KK2RpdiNicmVhZGNydW1icyB1bCBsaSB7CisgICAgZGlzcGxheTppbmxpbmU7Cit9CisKK2RpdiNicmVhZGNydW1icyB1bCBsaSBhIHsKKyAgICBjb2xvcjojMjIyOworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyAgCit9CisKKy8qKgorICogRElWI0ZPT1RFUgorICogVGhpcyBwcm92aWRlcyB0aGUgc3RhbmRhcmQgcGFnZSBmb290ZXIgd2l0aCBsaW5rcyB0byBOQ0ksTklILFVTQUdPVgorICogYW5kIGVudGVycHJpc2Utd2lkZSBpbmZvcm1hdGlvbmFsIGxpbmtzIChwcml2YWN5IHBvbGljeSwgZXRjKS4KKyAqLworZGl2I2Zvb3RlciB7CisgICAgZm9udC1zaXplOjkwJTsKKyAgICBjb2xvcjojNjY2OworICAgIHRleHQtYWxpZ246Y2VudGVyOworICAgIG1hcmdpbi10b3A6MzVweDsKKyAgICBib3JkZXItdG9wOnNvbGlkIDFweCAjZGRkOworICAgIHBhZGRpbmctdG9wOjE1cHg7CisgICAgcGFkZGluZy1ib3R0b206OHB4OworfQorZGl2I2Zvb3RlciBpbWcgeworICAgIGJvcmRlcjpub25lOworICAgIHBhZGRpbmctbGVmdDoycHg7CisgICAgbWFyZ2luLWxlZnQ6NXB4OyAgICAKK30KKworLyoqCisgKiBIRUFERVJTIChIMSxIMixIMywuLi4uLi4pCisgKi8KK2gyLnRpdGxlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiM1NTU7CisgICAgcGFkZGluZzo1cHg7CisgICAgbWFyZ2luOjBweDsKKyAgICBjb2xvcjojZmZmOworICAgIGJvcmRlci10b3A6c29saWQgMnB4ICM5MDA7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzMwMDsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgZm9udC1zaXplOjE1cHg7Cit9CisKK2gyLnRpdGxlIGEgeworICAgIGNvbG9yOiM4OWI7IAorICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKK30KKworaDIudGl0bGUgYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKKyAgICBmb250LXdlaWdodDpub3JtYWw7IAorfQorCitoNCB7CisgICAgYm9yZGVyLWJvdHRvbTpkb3R0ZWQgMXB4ICM4ODg7Cit9CisKKworLyoqCisgKiBMT0dJTiBGT1JNCisgKi8KK2Zvcm0jbG9naW4tZm9ybSB7CisgICAgYm9yZGVyOnNvbGlkIDBweCAjZjY2OworICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKKyAgICBtYXJnaW46NXB4OworICAgIHBhZGRpbmc6M3B4OworICAgIHRleHQtYWxpZ246Y2VudGVyOworfQorZm9ybSNsb2dpbi1mb3JtIGgzIHsKKyAgICBjb2xvcjojMzMzOworICAgIG1hcmdpbi10b3A6MHB4OworICAgIGJvcmRlci1ib3R0b206ZG90dGVkIDBweCAjNDQ0OworICAgICAgICAKK30KK2Zvcm0jbG9naW4tZm9ybSBpbnB1dFt0eXBlPXRleHRdLCBmb3JtI2xvZ2luLWZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0geworICAgIGJvcmRlcjpzb2xpZCAxcHggIzg4ODsKKyAgICBwYWRkaW5nOjNweDsKKyAgICB3aWR0aDoxNTBweDsKK30KK2Zvcm0jbG9naW4tZm9ybSB0YWJsZSB7CisgICAgY29sb3I6IzMzMzsKKyAgICBtYXJnaW46NXB4OworICAgIG1hcmdpbi10b3A6MHB4OworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKyAgICB3aWR0aDoyNDJweDsKK30KK2Zvcm0jbG9naW4tZm9ybSBpbnB1dFt0eXBlPXN1Ym1pdF0geworICAgIHBhZGRpbmc6M3B4OworfQorCisvKioKKyAqIC5DTFIKKyAqIFRoaXMgaXMgYSB1dGlsaXR5IHdoaWNoIHNlcnZlcyB0byByZXNldCB0aGluZ3MgYWZ0ZXIgYSAKKyAqIHNlcmllcyBvZiBmbG9hdGVkIGVsZW1lbnRzCisgKi8KKy5jbHIgeworICAgIGNsZWFyOmJvdGg7Cit9CisKK2Rpdi5pbmZvQ29udGVudCB7CisgICAgcGFkZGluZzo1cHg7ICAgIAorfQorCitkaXYjaW5mb05vTWV0YWRhdGFFeHRyYWN0b3JEZWZpbmVkIHsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7CisgICAgdG9wOjI4cHg7CisgICAgcmlnaHQ6LTJweDsKKyAgICB6LWluZGV4OjEwMDA7CisgICAgd2lkdGg6NjAlOyAgCisgICAgbGluZS1oZWlnaHQ6MThweDsKK30KKworZGl2LmluZm8geworICAgIGZvbnQtc2l6ZToxM3B4OworICAgIGJhY2tncm91bmQtY29sb3I6I2FjZjsKKyAgICBmb250LWZhbWlseTphcmlhbCxzYW5zLXNlcmlmOworICAgIGNvbG9yOiMzNDU7IAorICAgIGRpc3BsYXk6bm9uZTsgICAKK30KK2Rpdi5pbmZvIGlucHV0W3R5cGU9YnV0dG9uXSB7CisgICAgcGFkZGluZzoycHg7CisgICAgbWFyZ2luOjVweCAwcHg7Cit9CisKKyNjZW50ZXJlZHsKKyAgICB3aWR0aDo1MCU7IAorICAgIG1hcmdpbi1sZWZ0OjE1JTsgCisgICAgbWFyZ2luLXJpZ2h0OjE1JTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2Vkcm4taW5mb3JtYXRpY3Nfd2lja2V0LmNzcyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2Vkcm4taW5mb3JtYXRpY3Nfd2lja2V0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGFhZDRmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZWRybi1pbmZvcm1hdGljc193aWNrZXQuY3NzCkBAIC0wLDAgKzEsNDIxIEBACitAQ0hBUlNFVCAiVVRGLTgiOworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitodG1sLCBib2R5IHsKKyAgICBwYWRkaW5nOjBweDsKKyAgICBtYXJnaW46MHB4IGF1dG87CisgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoLi4vLi4vaW1hZ2VzL2JnLWJvZHkuZ2lmKSByZXBlYXQteCBzY3JvbGwgMCAwOworICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKKyAgICBmb250LWZhbWlseToiTHVjaWRhIEdyYW5kZSIsIkFyaWFsIiwiSGVsdmV0aWNhIiwiVmVyZGFuYSIsInNhbnMtc2VyaWYiOworICAgIGZvbnQtc2l6ZToxNHB4OworfQorCisvKioKKyAqIERJVi5OQ0lCQU5ORVIKKyAqIFRoaXMgaXMgdGhlIHJlZCBOYXRpb25hbCBDYW5jZXIgSW5zdGl0dXRlIGhlYWRlciBiYXIKKyAqLworZGl2I25jaWJhbm5lciB7CisgICAgYmFja2dyb3VuZDojYTkwMTAxIG5vbmUgcmVwZWF0OyAKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKK30KK2RpdiNuY2liYW5uZXItaW5uZXIgeworICAgIHdpZHRoOjk3NHB4OworICAgIG1hcmdpbjowcHggYXV0bzsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsgIAorfQorZGl2LiNuY2liYW5uZXItaW5uZXIgYSB7CisgICAgZGlzcGxheTppbmxpbmU7IAorfQorZGl2I2RjcGxvZ28geworICAgIHdpZHRoOjk3NHB4OworICAgIG1hcmdpbjphdXRvOyAgICAKK30KK2gyLm5jaWxvZ28sIGgyLm5paGxvZ28sIGgyLmNkZ2xvZ28sIGgyLmRjcGxvZ28geworICAgIGJvcmRlci1ib3R0b206MCBub25lOworICAgIGRpc3BsYXk6YmxvY2s7CisgICAgZmxvYXQ6bGVmdDsgCisgICAgbWFyZ2luOjA7CisgICAgcGFkZGluZzowOworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIHRleHQtaW5kZW50Oi05OTk5cHg7Cit9CisKK2gyLm5jaWxvZ28geworICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQgdXJsKC4uLy4uL2ltYWdlcy9sLW5jaS5naWYpIG5vLXJlcGVhdCBzY3JvbGwgMCAwOworICAgIGhlaWdodDo0M3B4OworICAgIHdpZHRoOjI3OHB4OworfQoraDIuY2RnbG9nbyB7CisgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoLi4vLi4vaW1hZ2VzL2wtY2RnLmdpZikgbm8tcmVwZWF0IHNjcm9sbCAwIDA7CisgICAgZmxvYXQ6cmlnaHQ7CisgICAgaGVpZ2h0OjQzcHg7CisgICAgd2lkdGg6OTBweDsKK30KK2gyLm5paGxvZ28geworICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQgdXJsKC4uLy4uL2ltYWdlcy9sLW5paC5naWYpIG5vLXJlcGVhdCBzY3JvbGwgMCAwOworICAgIGZsb2F0OnJpZ2h0OworICAgIGhlaWdodDo0M3B4OworICAgIHdpZHRoOjE3M3B4OworfQoraDIuZGNwbG9nbyB7CisgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoLi4vLi4vaW1hZ2VzL2wtZGNwLmdpZikgbm8tcmVwZWF0IHNjcm9sbCAwIDA7CisgICAgZmxvYXQ6cmlnaHQ7CisgICAgaGVpZ2h0OjIzcHg7CisgICAgbWFyZ2luOi00NXB4IC0xMnB4IDE2cHg7CisgICAgd2lkdGg6MTY0cHg7Cit9CisKK2RpdiNwYWdlLCBkaXYjZm9vdGVyIHsKKyAgICB3aWR0aDo5NzRweDsgICAgCisgICAgbWFyZ2luOjBweCBhdXRvOworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworfQorCisvKioKKyAqIERJVi5FRFJOSU5GT1JNQVRJQ1MKKyAqIFRoaXMgaXMgdGhlIGhlYWRlciB0aGF0IHByZWNlZWRzIGFwcGxpY2F0aW9uIGNvbnRlbnQuIAorICovCitkaXYjZWRybmluZm9ybWF0aWNzIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBtYXJnaW46YXV0bzsKKyAgICB3aWR0aDo5NzRweDsKK30KKworLyoqCisgKiBESVYuQ0FTLUhFQURFUgorICogVGhpcyBpcyB0aGUgaGVhZGVyIHRoYXQgcHJlY2VkZXMgYXBwbGljYXRpb24gY29udGVudC4gCisgKi8KK2RpdiNlZHJuaW5mb3JtYXRpY3MuY2FzLWhlYWRlciB7CisgICAgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1hZ2VzL2JsYWNrZmFkZS1zeW5jZC5qcGcpIHNjcm9sbCAwcHggMHB4IHJlcGVhdC14OworfQorZGl2I2Vkcm5pbmZvcm1hdGljcy5jYXMtaGVhZGVyIGRpdi5tZW51IHsKKyAgICBwYWRkaW5nLXRvcDo1MHB4OyAgIAorfQorCisvKioKKyAqIERJVi5DQVMtTE9HTy1MRUZUCisgKiBUaGlzIGlzIHRoZSBOQ0kvRURSTiBsb2dvIGRpdiB3aGljaCBsaXZlcyBpbnNpZGUgRElWLkVEUk5JTkZPUk1BVElDUy4KKyAqLworZGl2I2Vkcm5sb2dvLmNhcy1sb2dvLWxlZnQgeworICAgIGJhY2tncm91bmQ6dXJsKC4uLy4uL2ltYWdlcy9uY2ktc21hbGwuanBnKSBzY3JvbGwgLTJweCAxcHggbm8tcmVwZWF0OworICAgIGZvbnQtc2l6ZToxNHB4OworfQorLyoqCisgKiBESVYuQ0FTLUxPR08tUklHSFQKKyAqIFRoaXMgaXMgdGhlIGRvdWJsZS1oZWxpeCBncmFwaGljCisgKi8KK2RpdiNlZHJuLWRuYS5jYXMtbG9nby1yaWdodCB7CisgICAgYmFja2dyb3VuZDp1cmwoLi4vLi4vaW1hZ2VzL2Vkcm5fZG5hLWJpZ2dlci5qcGcpIHNjcm9sbCBsZWZ0IHRvcCBuby1yZXBlYXQ7Cit9CisKKworLyoqCisgKiBESVYuRURSTkxPR08KKyAqIFRoaXMgaXMgdGhlIE5DSS9FRFJOIGxvZ28gZGl2IHdoaWNoIGxpdmVzIGluc2lkZSBESVYuRURSTklORk9STUFUSUNTLgorICovCitkaXYjZWRybmxvZ28geworICAgIGhlaWdodDo2OHB4OworICAgIHdpZHRoOjk3NHB4OworICAgIG1hcmdpbjowcHggYXV0bzsgICAgCit9CitpbWcjZWRybmxvZ28tbG9nbyB7CisgICAgd2lkdGg6NjRweDsKKyAgICBtYXJnaW4tdG9wOi0yMHB4OworICAgIHBhZGRpbmc6M3B4OworICAgIG1hcmdpbi1yaWdodDo1cHg7CisgICAgdmVydGljYWwtYWxpZ246dG9wOworICAgIGZsb2F0OmxlZnQ7CisgICAgYm9yZGVyOnNvbGlkIDBweCAjOTU1OyAgCit9CitkaXYjZWRybmxvZ28gaDEuaGVhZGVyLXRpdGxlIHsKKyAgICBmb250LWZhbWlseToiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmOworICAgIHBhZGRpbmctdG9wOjI1cHg7CisgICAgcGFkZGluZy1ib3R0b206MTVweDsKKyAgICBtYXJnaW4tdG9wOjE1cHg7CisgICAgbGluZS1oZWlnaHQ6MTZweDsKKyAgICB0ZXh0LWFsaWduOmxlZnQ7CisgICAgd2lkdGg6OTc0cHg7CisgICAgZm9udC1zaXplOjMxcHg7CisgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICBib3JkZXI6bm9uZTsKK30KK2RpdiNlZHJubG9nbyBoMiB7CisgICAgY29sb3I6IzIyMjIyMjsKKyAgICBmb250LXNpemU6MTJweDsKKyAgICBmb250LXN0eWxlOml0YWxpYzsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgbWFyZ2luOi0xMHB4IGF1dG8gMTZweDsKK30KK2RpdiNlZHJubG9nbyBoMi5oZWFkZXItdGl0bGUgeworICAgIHBhZGRpbmc6YXV0bzsKKyAgICBtYXJnaW46LTEwcHggYXV0byAxNnB4IGF1dG87CisgICAgZm9udC1zaXplOjEycHg7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOworICAgIGZvbnQtc3R5bGU6aXRhbGljOworICAgIGNvbG9yOiMyMjI7CisgICAgYm9yZGVyOm5vbmU7Cit9CisKK2RpdiNlZHJubG9nbyBzcGFuLnNtYWxsZXIgeworICAgIGZvbnQtc2l6ZTo4NSU7CisgICAgY29sb3I6I2JiYjsgCit9CisvKioKKyAqIERJVi5FRFJOLUROQQorICogVGhpcyBpcyB0aGUgZG91YmxlLWhlbGl4IGdyYXBoaWMKKyAqLworZGl2I2Vkcm4tZG5hIHsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICB0b3A6MHB4OworICAgIHJpZ2h0OjBweDsKKyAgICBoZWlnaHQ6NjdweDsKKyAgICB3aWR0aDoyOTBweDsKKyAgICBiYWNrZ3JvdW5kOnVybCguLi8uLi9pbWFnZXMvZWRybl9kbmEtYmlnZ2VyLmpwZykgc2Nyb2xsIGxlZnQgdG9wIG5vLXJlcGVhdDsKK30KKworCisvKioKKyAqIEgyLkFQUC1USVRMRQorICogVGhpcyBpcyB0aGUgdGl0bGUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gSXQgbGl2ZXMgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZQorICogb2YgRElWLkVEUk5JTkZPUk1BVElDUy4KKyAqLworaDIuYXBwLXRpdGxlIHsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICB0b3A6MHB4OworICAgIHJpZ2h0OjBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OworICAgIG1hcmdpbjowcHg7CisgICAgcGFkZGluZzo1cHg7CisgICAgcGFkZGluZy1yaWdodDowcHg7CisgICAgY29sb3I6IzcyMjsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgZm9udC1zaXplOjEzcHg7CisgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICBsZXR0ZXItc3BhY2luZzowLjAwZW07CisgICAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOworICAgIHotaW5kZXg6MTAwOworfQorCisvKioKKyAqIERJVi5FUlJPUgorICogVGhpcyBwcm92aWRlcyBhIHJlZCAnZXJyb3InIGJveCBzdWl0YWJsZSBmb3IgZGlzcGxheWluZyBlcnJvcgorICogbWVzc2FnZXMuCisgKi8KK2Rpdi5lcnJvciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjOworICAgIHBhZGRpbmc6NXB4OworICAgIG1hcmdpbi1yaWdodDoxNXB4OworICAgIGJvcmRlcjpzb2xpZCAxcHggI2Y0NDsKK30KKworLyoqCisgKiBESVYuU1VDQ0VTUworICogVGhpcyBwcm92aWRlcyBhIGdyZWVuICdzdWNjZXNzJyBib3ggc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcKKyAqIHN1Y2Nlc3NmdWwgbWVzc2FnZXMuCisgKi8KK2Rpdi5zdWNjZXNzICB7CisgICAgcGFkZGluZzo1cHg7CisgICAgYm9yZGVyOnNvbGlkIDFweCBncmVlbjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNjZmM7ICAKKyAgICBtYXJnaW4tcmlnaHQ6MTBweDsKK30KKworLyoqCisgKiBESVYuVVNFUkRFVEFJTFMKKyAqIFRoaXMgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZ2luLXN0YXR1cyBvZiB0aGUgdXNlci4KKyAqIEl0IHNob3VsZCBsaXZlIHdpdGhpbiBkaXYjZWRybmluZm9ybWF0aWNzCisgKi8KK2Rpdi51c2VyZGV0YWlscyB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgdGV4dC1hbGlnbjpyaWdodDsKKyAgICB3aWR0aDo5NzRweDsKKyAgICBtYXJnaW46YXV0bzsKKyAgICBjb2xvcjojMTExOworICAgIGZvbnQtc2l6ZToxMXB4OworfQorZGl2LnVzZXJkZXRhaWxzIGEgeworICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisgICAgY29sb3I6IzQ0NDsgCit9CisKKy8qKgorIE92ZXJyaWRlcyByZXF1aXJlZCB0byBlbmFibGUgdXNlciBkZXRhaWxzIHRvIG5vdCBiZSBvdmVybGF5ZWQKKyBvbiB0b3Agb2YgY29udGFpbmVyIGZvciB0aGUgc3RhZ2luZy9mbSBhcmVhCisqKi8KK2Rpdi5jb250YWluZXJ7CisgICAgdG9wOjExcHg7Cit9CisKKy8qKiAKKyAqIERJViNCUkVBRENSVU1CUworICogVGhpcyBwcm92aWRlcyB0aGUgYXJlYSBmb3IgYnJlYWRjcnVtYnMgbmF2aWdhdGlvbiBsaW5rcworICovCisgCitkaXYjYnJlYWRjcnVtYnMuY2FzLWJyZWFkY3J1bWJzIGEgeworICAgIGNvbG9yOiMzMzM7Cit9CisKK2RpdiNicmVhZGNydW1icyB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgbWFyZ2luLXRvcDoycHg7CisgICAgcGFkZGluZzo0cHg7CisgICAgcGFkZGluZy1yaWdodDo1cHg7CisgICAgcGFkZGluZy1sZWZ0OjVweDsKKyAgICBib3JkZXItdG9wOnNvbGlkIDBweCAjNzAwMDAzOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICM3MDAwMDM7CisgICAgcGFkZGluZy1ib3R0b206NXB4OworICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjsgIAorICAgIGNvbG9yOiMzMzM7CisgICAgZm9udC1zaXplOjg1JTsKK30KK2RpdiNicmVhZGNydW1icyB1bCB7CisgICAgbGlzdC1zdHlsZTpub25lOworICAgIG1hcmdpbjowcHg7CisgICAgcGFkZGluZzowcHg7Cit9CitkaXYjYnJlYWRjcnVtYnMgdWwgbGkgeworICAgIGRpc3BsYXk6aW5saW5lOworfQorCitkaXYjYnJlYWRjcnVtYnMgdWwgbGkgYSB7CisgICAgY29sb3I6IzIyMjsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgIAorfQorCisvKioKKyAqIERJViNGT09URVIKKyAqIFRoaXMgcHJvdmlkZXMgdGhlIHN0YW5kYXJkIHBhZ2UgZm9vdGVyIHdpdGggbGlua3MgdG8gTkNJLE5JSCxVU0FHT1YKKyAqIGFuZCBlbnRlcnByaXNlLXdpZGUgaW5mb3JtYXRpb25hbCBsaW5rcyAocHJpdmFjeSBwb2xpY3ksIGV0YykuCisgKi8KK2RpdiNmb290ZXIgeworICAgIGZvbnQtc2l6ZTo5MCU7CisgICAgY29sb3I6IzY2NjsKKyAgICB0ZXh0LWFsaWduOmNlbnRlcjsKKyAgICBtYXJnaW4tdG9wOjM1cHg7CisgICAgYm9yZGVyLXRvcDpzb2xpZCAxcHggI2RkZDsKKyAgICBwYWRkaW5nLXRvcDoxNXB4OworICAgIHBhZGRpbmctYm90dG9tOjhweDsKK30KK2RpdiNmb290ZXIgaW1nIHsKKyAgICBib3JkZXI6bm9uZTsKKyAgICBwYWRkaW5nLWxlZnQ6MnB4OworICAgIG1hcmdpbi1sZWZ0OjVweDsgICAgCit9CisKKy8qKgorICogSEVBREVSUyAoSDEsSDIsSDMsLi4uLi4uKQorICovCitoMi50aXRsZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjojNTU1OworICAgIHBhZGRpbmc6NXB4OworICAgIG1hcmdpbjowcHg7CisgICAgY29sb3I6I2ZmZjsKKyAgICBib3JkZXItdG9wOnNvbGlkIDJweCAjOTAwOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICMzMDA7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOworICAgIGZvbnQtc2l6ZToxNXB4OworfQorCitoMi50aXRsZSBhIHsKKyAgICBjb2xvcjojODliOyAKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cit9CisKK2gyLnRpdGxlIGE6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOyAKK30KKworaDQgeworICAgIGJvcmRlci1ib3R0b206ZG90dGVkIDFweCAjODg4OworfQorCisKKy8qKgorICogTE9HSU4gRk9STQorICovCitmb3JtI2xvZ2luLWZvcm0geworICAgIGJvcmRlcjpzb2xpZCAwcHggI2Y2NjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7CisgICAgbWFyZ2luOjVweDsKKyAgICBwYWRkaW5nOjNweDsKKyAgICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KK2Zvcm0jbG9naW4tZm9ybSBoMyB7CisgICAgY29sb3I6IzMzMzsKKyAgICBtYXJnaW4tdG9wOjBweDsKKyAgICBib3JkZXItYm90dG9tOmRvdHRlZCAwcHggIzQ0NDsKKyAgICAgICAgCit9Citmb3JtI2xvZ2luLWZvcm0gaW5wdXRbdHlwZT10ZXh0XSwgZm9ybSNsb2dpbi1mb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdIHsKKyAgICBib3JkZXI6c29saWQgMXB4ICM4ODg7CisgICAgcGFkZGluZzozcHg7CisgICAgd2lkdGg6MTUwcHg7Cit9Citmb3JtI2xvZ2luLWZvcm0gdGFibGUgeworICAgIGNvbG9yOiMzMzM7CisgICAgbWFyZ2luOjVweDsKKyAgICBtYXJnaW4tdG9wOjBweDsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7CisgICAgd2lkdGg6MjQycHg7Cit9Citmb3JtI2xvZ2luLWZvcm0gaW5wdXRbdHlwZT1zdWJtaXRdIHsKKyAgICBwYWRkaW5nOjNweDsKK30KKworLyoqCisgKiAuQ0xSCisgKiBUaGlzIGlzIGEgdXRpbGl0eSB3aGljaCBzZXJ2ZXMgdG8gcmVzZXQgdGhpbmdzIGFmdGVyIGEgCisgKiBzZXJpZXMgb2YgZmxvYXRlZCBlbGVtZW50cworICovCisuY2xyIHsKKyAgICBjbGVhcjpib3RoOworfQorCitkaXYuaW5mb0NvbnRlbnQgeworICAgIHBhZGRpbmc6NXB4OyAgICAKK30KKworZGl2I2luZm9Ob01ldGFkYXRhRXh0cmFjdG9yRGVmaW5lZCB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIHRvcDoyOHB4OworICAgIHJpZ2h0Oi0ycHg7CisgICAgei1pbmRleDoxMDAwOworICAgIHdpZHRoOjYwJTsgIAorICAgIGxpbmUtaGVpZ2h0OjE4cHg7Cit9CisKK2Rpdi5pbmZvIHsKKyAgICBmb250LXNpemU6MTNweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNhY2Y7CisgICAgZm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjsKKyAgICBjb2xvcjojMzQ1OyAKKyAgICBkaXNwbGF5Om5vbmU7ICAgCit9CitkaXYuaW5mbyBpbnB1dFt0eXBlPWJ1dHRvbl0geworICAgIHBhZGRpbmc6MnB4OworICAgIG1hcmdpbjo1cHggMHB4OworfQorCisjY2VudGVyZWR7CisgICAgd2lkdGg6NTAlOyAKKyAgICBtYXJnaW4tbGVmdDoxNSU7IAorICAgIG1hcmdpbi1yaWdodDoxNSU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZWRybi1sb2dvLnBuZyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2Vkcm4tbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1MjA0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2Vkcm4tbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZm9vdGVyX2hocy5naWYgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9mb290ZXJfaGhzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTAzODAyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZm9vdGVyX2hocy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZm9vdGVyX25paC5naWYgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9mb290ZXJfbmloLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI1N2QxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZm9vdGVyX25paC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZm9vdGVyX3VzYWdvdi5naWYgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9mb290ZXJfdXNhZ292LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWJlMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vZm9vdGVyX3VzYWdvdi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1jZGcuZ2lmIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1jZGcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGM4OWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9sLWNkZy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1kY3AuZ2lmIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1kY3AuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzAxNTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9sLWRjcC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1uY2kuZ2lmIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1uY2kuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTNmY2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9sLW5jaS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1uaWguZ2lmIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbC1uaWguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MjEzMzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9sLW5paC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbG9naW4vTG9naW5QYWdlLmNzcyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2xvZ2luL0xvZ2luUGFnZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3OTU5MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2xvZ2luL0xvZ2luUGFnZS5jc3MKQEAgLTAsMCArMSw3MiBAQAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNsb2dpbnsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNsb2dpbl9mb3JteworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgbWFyZ2luOiAwIGF1dG87Cit9CisKKyNjZW50ZXJlZHsKKwl3aWR0aDo5MCU7IAorICAgIG1hcmdpbi1sZWZ0OjE1JTsgCisgICAgbWFyZ2luLXJpZ2h0OjE1JTsKK30KKyNpbnZhbGlkX2NyZWRzeworCWFsaWduOmNlbnRlcjsKKwltYXJnaW46MHB4OworCW1hcmdpbi1ib3R0b206NXB4OworCXdpZHRoOjIzMHB4OworCWZvbnQtc2l6ZTo5MCU7Cit9CisKKyNjb25uZWN0X2Vycm9yeworCWFsaWduOmNlbnRlcjsKKwltYXJnaW46MHB4OworCW1hcmdpbi1ib3R0b206NXB4OworCXdpZHRoOjIzMHB4OworCWZvbnQtc2l6ZTo5MCU7Cit9CisKKyNzcGFjZXJ7CisgICAgYWxpZ246Y2VudGVyOworICAgIG1hcmdpbjowcHg7CisgICAgbWFyZ2luLWJvdHRvbTo1cHg7CisgICAgd2lkdGg6MjMwcHg7CisgICAgZm9udC1zaXplOjkwJTsKK30KKworI3NlY3Rpb25fdGl0bGV7CisJIHdpZHRoOiBhdXRvOyAKKwkgZm9udC1zaXplOiAyMnB4OyAKKwkgZm9udC13ZWlnaHQ6IGJvbGQ7IAorCSBtYXJnaW4tdG9wOiAyNHB4OyAKKwkgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisjcGFzc3dvcmRfdHh0eworCXRleHQtYWxpZ246cmlnaHQ7Cit9CisKKyN1c2VybmFtZV90eHR7CisJdGV4dC1hbGlnbjpyaWdodDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9sb2dpbi9Mb2dpblBhZ2UuaHRtbCBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2xvZ2luL0xvZ2luUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTgzOWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi9sb2dpbi9Mb2dpblBhZ2UuaHRtbApAQCAtMCwwICsxLDk1IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx3aWNrZXQ6ZXh0ZW5kPgorPHdpY2tldDpyZW1vdmU+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL0hvbWVQYWdlLmNzcyIvPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmNzcyIvPiAKKzwvd2lja2V0OnJlbW92ZT4KKworPHdpY2tldDpsaW5rPgorPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iTG9naW5QYWdlLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKworPHdpY2tldDpyZW1vdmU+Cis8ZGl2IGlkPSJwYWdlIj4KKyAgICA8ZGl2IGlkPSJjYXMtaGVhZGVyIj4KKyAgICAgICAgPGRpdiBpZD0iY2FzLWxvZ28tbGVmdCI+PCEtLSAgY2FzIGxvZ28gbGhzIC0tPjwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJjYXMtbG9nby1yaWdodCI+PCEtLSBjYXMgbG9nbyByaHMgLS0+PC9kaXY+CisgICAgICAgIDxoMiBjbGFzcz0iYXBwLXRpdGxlIj5Qcm9qZWN0IE5hbWUgQ0FTIEN1cmF0aW9uPC9oMj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXJkZXRhaWxzIj4KKyAgICAgICAgICAgICAgIDxzcGFuID5Mb2dnZWQgaW4gYXMgbWF0dG1hbm48L3NwYW4+CisgICAgICAgICAgICAgICA8YSBocmVmPSIjIj5Mb2cgSW48L2E+CisgICAgICAgICAgICAgICA8YSBocmVmPSIjIj5Mb2cgT3V0PC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIAorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgICA8IS0tIEJyZWFkY3J1bWJzIEFyZWEgLS0+CisgICAgICAgIDxkaXYgaWQ9ImJyZWFkY3J1bWJzIj4KKyAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7cGFkZGluZy1sZWZ0OiAxMHB4OyI+CisgICAgICAgIDxhIGhyZWY9IiMiIHN0eWxlPSJjb2xvcjpibGFjazsiPkhvbWU8L2E+ID4gTWFpbgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKzwhLS0gYmVnaW4gbWFpbiBjb250ZW50IC0tPgorPC93aWNrZXQ6cmVtb3ZlPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0OjMwMHB4OyI+Cis8aDEgY2xhc3M9InNlY3Rpb25UaXRsZSIgaWQ9InNlY3Rpb25fdGl0bGUiPlBsZWFzZSBMb2cgSW4gdG8gdGhlIDxzcGFuIHdpY2tldDppZD0ibG9naW5fcHJvamVjdF9uYW1lIj5Qcm9qZWN0IE5hbWUgQ0FTIEN1cmF0aW9uIEludGVyZmFjZTwvc3Bhbj48L2gxPgorPGJyLz48YnIvPgorCis8ZGl2IGlkPSJsb2dpbiI+Cis8Zm9ybSBpZD0ibG9naW5fZm9ybSIgd2lja2V0OmlkPSJsb2dpbl9mb3JtIj4gCisgPGRpdiBpZD0iaW52YWxpZF9jcmVkcyIgY2xhc3M9ImVycm9yIiB3aWNrZXQ6aWQ9ImludmFsaWRfY3JlZHMiPkludmFsaWQgQ3JlZGVudGlhbHMuLi48YnIvPlBsZWFzZSB0cnkgYWdhaW4uPC9kaXY+CisgPGRpdiBpZD0iY29ubmVjdF9lcnJvciIgY2xhc3M9ImVycm9yIiB3aWNrZXQ6aWQ9ImNvbm5lY3RfZXJyb3IiPlVuYWJsZSB0byBjb250YWN0IExEQVAgYXV0aGVudGljYXRpb24gc2VydmVyLi4uPGJyLz5QbGVhc2UgdHJ5IGFnYWluIGxhdGVyLjwvZGl2PgorIAorICA8dGFibGUgaWQ9ImNlbnRlcmVkIj4KKyAgIDx0Ym9keT48dHI+CisgICAgIDx0ZCBpZD0idXNlcm5hbWVfdHh0Ij5Vc2VybmFtZTwvdGQ+CisgICAgIDx0ZD48aW5wdXQgd2lja2V0OmlkPSJsb2dpbl91c2VybmFtZSIgaWQ9ImxvZ2luX3VzZXJuYW1lIiB2YWx1ZT0iIiBzaXplPSIyMCIgbWF4bGVuZ3RoPSIyNTUiIHR5cGU9InRleHQiPjwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICA8dGQgaWQ9InBhc3N3b3JkX3R4dCI+UGFzc3dvcmQ8L3RkPgorICAgICA8dGQ+PGlucHV0IHdpY2tldDppZD0icGFzc3dvcmQiIGlkPSJwYXNzd29yZCIgdmFsdWU9IiIgc2l6ZT0iMjAiIG1heGxlbmd0aD0iMjU1IiB0eXBlPSJwYXNzd29yZCI+PC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgICA8dGQ+PGlucHV0IGlkPSJsb2dpbl9zdWJtaXQiIHZhbHVlPSJMb2cgSW4iIHR5cGU9InN1Ym1pdCI+PC90ZD4KKyAgIDwvdHI+CisgPC90Ym9keT48L3RhYmxlPgorPC9mb3JtPgorPC9kaXY+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW5fdXNlcm5hbWUnKS5mb2N1cygpOworPC9zY3JpcHQ+Cis8L2Rpdj4KKworPHdpY2tldDpyZW1vdmU+Cis8IS0tICBlbmQgbWFpbiBjb250ZW50IC0tPgorPGRpdiBpZD0iZm9vdGVyIj4KKyAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi48YnIvPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9hcGFjaGUub3JnLyI+YXBhY2hlLm9yZzwvYT48YnIvPgorICAgIEJ1aWx0IE9uIEFwYWNoZSA8YSBocmVmPSJodHRwOi8vb29kdC5hcGFjaGUub3JnIj5PT0RUPC9hPgorPC9kaXY+CisKKzwvd2lja2V0OnJlbW92ZT4KKworPC93aWNrZXQ6ZXh0ZW5kPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2xvZ2luL0xvZ2luUGFnZS5qYXZhIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvY3VyYXRpb24vbG9naW4vTG9naW5QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMDhmOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL2xvZ2luL0xvZ2luUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5sb2dpbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uQ3VyYXRpb25BcHA7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5DdXJhdGlvblNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5Ib21lUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLndvcmtiZW5jaC5Xb3JrYmVuY2hQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5zZWN1cml0eS5zc28uQWJzdHJhY3RXZWJCYXNlZFNpbmdsZVNpZ25PbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuc2VjdXJpdHkuc3NvLlNpbmdsZVNpZ25PbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVxdWVzdEN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYk1hcmt1cENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuZm9ybS5QYXNzd29yZFRleHRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLlRleHRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XZWJSZXNwb25zZTsKKworcHVibGljIGNsYXNzIExvZ2luUGFnZSBleHRlbmRzIEhvbWVQYWdlIHsKKworICBwdWJsaWMgTG9naW5QYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcigpOworICAgIGZpbmFsIEN1cmF0aW9uQXBwIGFwcCA9IChDdXJhdGlvbkFwcClBcHBsaWNhdGlvbi5nZXQoKTsKKyAgICBmaW5hbCBDdXJhdGlvblNlc3Npb24gc2Vzc2lvbiA9IChDdXJhdGlvblNlc3Npb24pZ2V0U2Vzc2lvbigpOworICAgIFN0cmluZyBzc29DbGFzcyA9IGFwcC5nZXRTU09JbXBsQ2xhc3MoKTsKKyAgICBmaW5hbCBBYnN0cmFjdFdlYkJhc2VkU2luZ2xlU2lnbk9uIHNzbyA9IFNpbmdsZVNpZ25PbkZhY3RvcnkKKyAgICAgICAgLmdldFdlYkJhc2VkU2luZ2xlU2lnbk9uKHNzb0NsYXNzKTsKKyAgICBzc28uc2V0UmVxKCgoV2ViUmVxdWVzdCkgUmVxdWVzdEN5Y2xlLmdldCgpLmdldFJlcXVlc3QoKSkKKyAgICAgICAgLmdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpKTsKKyAgICBzc28uc2V0UmVzKCgoV2ViUmVzcG9uc2UpIFJlcXVlc3RDeWNsZS5nZXQoKS5nZXRSZXNwb25zZSgpKQorICAgICAgICAuZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpKTsKKyAgICAKKyAgICBTdHJpbmcgYWN0aW9uID0gcGFyYW1ldGVycy5nZXRTdHJpbmcoImFjdGlvbiIpOworICAgIFN0cmluZyBhcHBOYW1lU3RyaW5nID0gYXBwLmdldFByb2plY3ROYW1lKCkrIiBDQVMgQ3VyYXRpb24gSW50ZXJmYWNlIjsKKyAgICBhZGQobmV3IExhYmVsKCJsb2dpbl9wcm9qZWN0X25hbWUiLCBhcHBOYW1lU3RyaW5nKSk7CisgICAgcmVwbGFjZShuZXcgTGFiZWwoImNydW1iX25hbWUiLCAiTG9naW4iKSk7CisgICAgZmluYWwgV2ViTWFya3VwQ29udGFpbmVyIGNyZWRzID0gbmV3IFdlYk1hcmt1cENvbnRhaW5lcigiaW52YWxpZF9jcmVkcyIpOworICAgIGZpbmFsIFdlYk1hcmt1cENvbnRhaW5lciBjb25uZWN0ID0gbmV3IFdlYk1hcmt1cENvbnRhaW5lcigiY29ubmVjdF9lcnJvciIpOworICAgIGNyZWRzLnNldFZpc2libGUoZmFsc2UpOworICAgIGNvbm5lY3Quc2V0VmlzaWJsZShmYWxzZSk7CisgICAgZmluYWwgVGV4dEZpZWxkPFN0cmluZz4gbG9naW5Vc2VyID0gbmV3IFRleHRGaWVsZDxTdHJpbmc+KCJsb2dpbl91c2VybmFtZSIsIG5ldyBNb2RlbDxTdHJpbmc+KCIiKSk7CisgICAgZmluYWwgUGFzc3dvcmRUZXh0RmllbGQgcGFzcyA9IG5ldyBQYXNzd29yZFRleHRGaWVsZCgicGFzc3dvcmQiLCBuZXcgTW9kZWw8U3RyaW5nPigiIikpOworICAgIAorICAgIAorICAgIEZvcm08Pz4gZm9ybSA9IG5ldyBGb3JtPFZvaWQ+KCJsb2dpbl9mb3JtIil7CisKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgICAgCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIG9uU3VibWl0KCkgeworICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBsb2dpblVzZXIuZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gcGFzcy5nZXRNb2RlbE9iamVjdCgpOworICAgICAgICAKKyAgICAgICAgaWYoc3NvLmxvZ2luKHVzZXJuYW1lLCBwYXNzd29yZCkpeworICAgICAgICAgIHNlc3Npb24uc2V0TG9nZ2VkSW4odHJ1ZSk7CisgICAgICAgICAgc2Vzc2lvbi5zZXRMb2dpblVzZXJuYW1lKHVzZXJuYW1lKTsKKyAgICAgICAgICBzZXRSZXNwb25zZVBhZ2UoV29ya2JlbmNoUGFnZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICBzZXNzaW9uLnNldExvZ2dlZEluKGZhbHNlKTsKKyAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXRMb2dpblVzZXJuYW1lKCkgPT0gbnVsbCl7CisgICAgICAgICAgICBjb25uZWN0LnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBjcmVkcy5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIH0KKyAgICAgIAorICAgIH07CisgICAgCisgICAgZm9ybS5hZGQobG9naW5Vc2VyKTsKKyAgICBmb3JtLmFkZChwYXNzKTsKKyAgICBmb3JtLmFkZChjcmVkcyk7CisgICAgZm9ybS5hZGQoY29ubmVjdCk7CisgICAgYWRkKGZvcm0pOworICAgIAorICAgIGlmKGFjdGlvbi5lcXVhbHMoImxvZ291dCIpKXsKKyAgICAgIHNzby5sb2dvdXQoKTsKKyAgICAgIHNlc3Npb24uc2V0TG9naW5Vc2VybmFtZShudWxsKTsKKyAgICAgIHNlc3Npb24uc2V0TG9nZ2VkSW4oZmFsc2UpOworICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICBwYXJhbXMuYWRkKCJhY3Rpb24iLCAibG9naW4iKTsKKyAgICAgIHNldFJlc3BvbnNlUGFnZShMb2dpblBhZ2UuY2xhc3MsIHBhcmFtcyk7CisgICAgfQorCisgIH0KKworICAKKyAgCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2hQYWdlLmh0bWwgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYmE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoUGFnZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworCis8d2lja2V0OmV4dGVuZD4KKyAgCisgIDxkaXYgaWQ9ImN1cmF0b3Jfd29ya2JlbmNoIiB3aWNrZXQ6aWQ9ImN1cmF0b3Jfd29ya2JlbmNoIj4KKyAgPC9kaXY+CisgIAorPC93aWNrZXQ6ZXh0ZW5kPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2hQYWdlLmphdmEgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmQxMDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLndvcmtiZW5jaDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uQ3VyYXRpb25TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uSG9tZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5sb2dpbi5Mb2dpblBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmN1cmF0aW9uLndvcmtiZW5jaC5Xb3JrYmVuY2g7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CisKK3B1YmxpYyBjbGFzcyBXb3JrYmVuY2hQYWdlIGV4dGVuZHMgSG9tZVBhZ2UgeworCisgIHB1YmxpYyBXb3JrYmVuY2hQYWdlKCkgeworICAgIHN1cGVyKCk7CisgICAgCisgICAgQ3VyYXRpb25TZXNzaW9uIHNlc3Npb24gPSAoQ3VyYXRpb25TZXNzaW9uKWdldFNlc3Npb24oKTsKKworICAgIGlmICghc2Vzc2lvbi5pc0xvZ2dlZEluKCkpIHsKKyAgICAgIFBhZ2VQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYWdlUGFyYW1ldGVycygpOworICAgICAgcGFyYW1zLmFkZCgiYWN0aW9uIiwgImxvZ2luIik7CisgICAgICBzZXRSZXNwb25zZVBhZ2UoTG9naW5QYWdlLmNsYXNzLCBwYXJhbXMpOworICAgIH0KKyAgICAKKyAgICBhZGQobmV3IFdvcmtiZW5jaCgKKyAgICAgICAgImN1cmF0b3Jfd29ya2JlbmNoIikpOworICAgIHJlcGxhY2UobmV3IExhYmVsKCJjcnVtYl9uYW1lIiwgIldvcmtiZW5jaCIpKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiNGQ0OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL2Nhcy1jdXJhdG9yIj4KKworICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnByb2plY3ROYW1lIgorICAgICAgICB2YWx1ZT0iT09EVCIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5zZWN1cml0eS5zc28uaW1wbENsYXNzIgorCSAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5EdW1teUltcGwiLz4KKwkgICAgICAgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJjdXJhdG9yLmhvbWVwYWdlIiB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi53b3JrYmVuY2guV29ya2JlbmNoUGFnZSIvPgkKKworICAgIDwhLS0gc3dpdGNoIHRvIGVkcm4gdG8gc2VlIHRoZSBOQ0kgRWFybHkgRGV0ZWN0aW9uIFJlc2VhcmNoIE5ldHdvcmsKKyAgICAgICAgIGN1cmF0b3Igc2tpbgorICAgICAtLT4KKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5za2luIgorICAgICAgICB2YWx1ZT0iIi8+CisgICAgICAgICAgICAKKyAgICA8IS0tICBuZWVkZWQgYnkgQ3VyYXRpb24gU2VydmljZXMgLS0+CQkgICAKKworICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLm1ldEV4dHJhY3RvckNvbmYudXBsb2FkUGF0aCIKKyAgICAgICAgdmFsdWU9IltPT0RUX0hPTUVdL2V4dHJhY3RvcnMiIC8+CisKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5kYXRhRGVmaW5pdGlvbi51cGxvYWRQYXRoIgorICAgICAgICB2YWx1ZT0iW0ZJTEVNR1JfSE9NRV0vcG9saWN5IiAvPgorICAgICAgICAKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5zdGFnaW5nQXJlYVBhdGgiCisgICAgICAgIHZhbHVlPSJbT09EVF9IT01FXS9kYXRhL3N0YWdpbmciLz4KKyAgICAKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRBcmVhUGF0aCIKKyAgICAgICAgdmFsdWU9IltPT0RUX0hPTUVdL2RhdGEvbWV0Ii8+CisgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuZm1Qcm9wcyIKKyAgICAgICAgdmFsdWU9IltGSUxFTUdSX0hPTUVdL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMiLz4KKyAgICAKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRFeHRlbnNpb24iCisgICAgICAgIHZhbHVlPSIubWV0Ii8+CisgICAgICAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5mbS51cmwiCisgICAgICAgIHZhbHVlPSJbRklMRU1HUl9VUkxdIi8+CisgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuY2F0YWxvZ0ZhY3RvcnlDbGFzcyIgCisgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkiIC8+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjUyNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHdlYi1hcHAgaWQ9IldlYkFwcF9JRCIgdmVyc2lvbj0iMi40IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIj4KKwk8ZGlzcGxheS1uYW1lPmN1cmF0b3I8L2Rpc3BsYXktbmFtZT4KKwkKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+d2lja2V0LmJyb3dzZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUud2lja2V0LnByb3RvY29sLmh0dHAuV2lja2V0RmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+YXBwbGljYXRpb25DbGFzc05hbWU8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5DdXJhdGlvbkFwcDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5jdXJhdG9yLmhvbWVwYWdlPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24ud29ya2JlbmNoLldvcmtiZW5jaFBhZ2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICA8ZmlsdGVyLW5hbWU+d2lja2V0LmJyb3dzZXI8L2ZpbHRlci1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICA8L2ZpbHRlci1tYXBwaW5nPgorICAgCisgICA8IS0tICBuZWVkZWQgYnkgQ3VyYXRpb24gU2VydmljZXMgLS0+CisgICAgPHNlcnZsZXQ+CisgICAgIDxzZXJ2bGV0LW5hbWU+Q1hGU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgICBvcmcuYXBhY2hlLmN4Zi5qYXhycy5zZXJ2bGV0LkNYRk5vblNwcmluZ0pheHJzU2VydmxldAorICAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+amF4cnMuc2VydmljZUNsYXNzZXM8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+CisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZS5EaXJlY3RvcnlSZXNvdXJjZQorICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2UuSW5nZXN0aW9uUmVzb3VyY2UKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLk1ldGFkYXRhUmVzb3VyY2UKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLlBvbGljeVJlc291cmNlCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZS5TeXN0ZW1SZXNvdXJjZQorICAgICAgPC9wYXJhbS12YWx1ZT4KKyAgICAgPC9pbml0LXBhcmFtPgorICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICAKKyAgICA8c2VydmxldD4KKyAgICAgICA8ZGlzcGxheS1uYW1lPkN1cmF0aW9uIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KKyAgICAgICA8c2VydmxldC1uYW1lPkN1cmF0aW9uIFNlcnZpY2U8L3NlcnZsZXQtbmFtZT4KKyAgICAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZS5DdXJhdGlvblNlcnZpY2UKKyAgICAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIAorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q1hGU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZpY2VzLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIAorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2V4dHJhY3Rvci5qcGcgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYmFzaWNfZXh0cmFjdG9yLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE5MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2V4dHJhY3Rvci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2ZpbGVtZ3IuanBnIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2ZpbGVtZ3IuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzY5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYmFzaWNfZmlsZW1nci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2luZ2VzdC5qcGcgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYmFzaWNfaW5nZXN0LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY4YzBmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2luZ2VzdC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX2xvZ2luLmpwZyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9iYXNpY19sb2dpbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0M2Y2NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9iYXNpY19sb2dpbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX3BhZ2UuanBnIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX3BhZ2UuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDkwM2MKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYmFzaWNfcGFnZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX3N0YWdpbmcuanBnIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Jhc2ljX3N0YWdpbmcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjRkMDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYmFzaWNfc3RhZ2luZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jdXJhdG9yLmpwZyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtY3VyYXRvci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyYTgyZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtY3VyYXRvci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1jdXJhdG9yLnBzZCBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtY3VyYXRvci5wc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyYzA2ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtY3VyYXRvci5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvbWVkaWEvQmFjaC1TdWl0ZU5vMi5tcDMgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3Jlc291cmNlcy9tZWRpYS9CYWNoLVN1aXRlTm8yLm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNkODA5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9yZXNvdXJjZXMvbWVkaWEvQmFjaC1TdWl0ZU5vMi5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2NDNhMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJjYXMtY3VyYXRvciI+CisKKyAgPGJvZHk+CisgICAgPGxpbmtzPgorICAgICAgPGl0ZW0gbmFtZT0iT09EVCIgaHJlZj0iLi4vb29kdC1zaXRlLyIvPgorICAgIDwvbGlua3M+CisKKyAgICA8bWVudSByZWY9InJlcG9ydHMiIGluaGVyaXQ9ImJvdHRvbSIvPgorICAgIDxtZW51IG5hbWU9IlNvZnR3YXJlIERvY3VtZW50YXRpb24iPgorICAgICAgPGl0ZW0gbmFtZT0iQmFzaWMgVXNlcidzIEd1aWRlIiBocmVmPSJ1c2VyL2Jhc2ljLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IkFkdmFuY2VkIFVzZXIncyBHdWlkZSIgaHJlZj0idXNlci9hZHZhbmNlZC5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJSRVNUIEFQSSBHdWlkZSIgaHJlZj0iYXBpL2luZGV4Lmh0bWwiLz4KKyAgICA8L21lbnU+CisgIDwvYm9keT4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUveGRvYy9hcGkvaW5kZXgueG1sIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS94ZG9jL2FwaS9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZTE2MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUveGRvYy9hcGkvaW5kZXgueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorIC0tPgorPGRvY3VtZW50PgorICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+SG93IHRvIHVzZSB0aGUgUkVTVCBBUEkgb2YgdGhlIENBUyBDdXJhdG9yPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSJqb3NodWFnYUBhcGFjaGUub3JnIj5Kb3NodWEgR2FyY2lhPC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ibWF0dG1hbm5AYXBhY2hlLm9yZyI+Q2hyaXMgTWF0dG1hbm48L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisgICAgICA8cD5UaGUgY3VyYXRvciBoYXMgYSBSRVNUIGludGVyZmFjZSB0aGF0IGFsbG93cyBzZXJ2aWNlcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIEhUVFAgcmVxdWVzdHMuICA8L3A+CisgICAgICAKKyAgICAgIDxwPlRoZSByZW1haW5kZXIgb2YgdGhpcyBndWlkZSBpcyBzZXBhcmF0ZWQgaW50byB0aGUgZm9sbG93aW5nIAorICAgICAgc2VjdGlvbnM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24xIj5SZXRyaWV2aW5nIGEgTGlzdCBvZiBJbmdlc3Rpb24gVGFza3M8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMiI+Q3JlYXRpbmcgYW4gSW5nZXN0aW9uIFRhc2sgaW4gdGhlIEN1cmF0b3IgUXVldWU8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMyI+U3RhcnRpbmcgYW4gSW5nZXN0aW9uIFRhc2s8L2E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgICAKKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPGEgbmFtZT0ic2VjdGlvbjEiLz4KKyAgICA8c2VjdGlvbiBuYW1lPSJSZXRyaWV2aW5nIGEgTGlzdCBvZiBJbmdlc3Rpb24gVGFza3MiPgorICAgICAgPHA+QSBsaXN0IG9mIGluZ2VzdGlvbiB0YXNrcyBjYW4gYmUgcmV0cmlldmVkIGluIGVpdGhlciA8YSBocmVmPSJodHRwOi8vd3d3Lmpzb24ub3JnLyI+anNvbjwvYT4gb3IgaHRtbCBmb3JtYXQ8L3A+CisgICAgICAKKyAgICAgIDxwPlRoZSBmb3JtYXQgb2YgdGhlIFVSTCBpcyB0aGUgZm9sbG93aW5nOiBodHRwOi8veW91cmhvc3QvY3VyYXRvci9zZXJ2aWNlcy9pbmdlc3QvbGlzdD9mb3JtYXQ9e2pzb258aHRtbH0gPGJyLz4KKyAgICAgIHlvdXJob3N0IGlzIHRoZSBob3N0IHRoYXQgaXMgcnVubmluZyB0aGUgdG9tY2F0IHNlcnZlciB3aXRoIHRoZSBjdXJhdG9yLiAgRm9yIGV4YW1wbGUsIHlvdXJob3N0IGNhbiBiZSB3d3cubXljdXJhdG9yLmNvbSA8YnIvPgorICAgICAgVGhlIGZvcm1hdCBwYXJhbWV0ZXIgdGFrZXMgZWl0aGVyIGpzb24gb3IgaHRtbCBhcyBhIHZhbHVlIGFuZCByZXR1cm5zIHRoZSByZXNwZWN0aXZlIGZvcm1hdHRlZCBsaXN0IG9mIGluZ2VzdGlvbiB0YXNrcy48L3A+CisgICAgICAKKyAgICAgIDxwPkZvciBleGFtcGxlLCB0aGUgVVJMIGh0dHA6Ly95b3VyaG9zdC9jdXJhdG9yL3NlcnZpY2VzL2luZ2VzdC9saXN0P2Zvcm1hdD1qc29uIHJldHVybnMgb3V0cHV0IHRoYXQgbG9va3MgbGlrZTogPC9wPgorICAgICAgCisgICAgICA8cD4KKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgICB7InRhc2tMaXN0IjpbeyJwcm9kdWN0VHlwZSI6ImhlNSIsInBvbGljeSI6Im1scyIsImV4dHJhY3RvckNsYXNzIjoib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkV4dGVybk1ldEV4dHJhY3RvciIsImV4dHJhY3RvckNvbmZGaWxlcyI6IlsvaG9tZS9qb3NodWFnYS9leHRyYWN0b3JzL29kbGV4dHJhY3Rvci9oZTVleHRyYWN0b3IuY29uZmlnXSIsInN0YXR1cyI6Ik5vdCBTdGFydGVkIiwiY3JlYXRlRGF0ZSI6IjIwMTAtMDUtMTBUMDA6NTk6MzUtMDc6MDAiLCJmaWxlTGlzdCI6IlsvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQxMDcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMS01Mi1jMDFfMjAwN2QwNTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMTE0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENOX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMl8yMDA4ZDEwNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDJfMjAwOGQxMDIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTEzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMl8yMDA4ZDA5Mi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMTE1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMS01Mi1jMDFfMjAwN2QwMzYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxNjguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTAzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDEtNTEtYzAxXzIwMDVkMzY1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMTE5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQwOTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDA5OC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMS01MS1jMDFfMjAwNWQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDExNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMDk1LmhlNV0iLCJpZCI6IjJjNmRmMWRjLWJmYzEtNGUyMi04ODllLTdiMmMyNjJjN2RiMyJ9LHsicHJvZHVjdFR5cGUiOiJoZTUiLCJwb2xpY3kiOiJtbHMiLCJleHRyYWN0b3JDbGFzcyI6Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5FeHRlcm5NZXRFeHRyYWN0b3IiLCJleHRyYWN0b3JDb25mRmlsZXMiOiJbL2hvbWUvam9zaHVhZ2EvZXh0cmFjdG9ycy9vZGxleHRyYWN0b3IvaGU1ZXh0cmFjdG9yLmNvbmZpZ10iLCJzdGF0dXMiOiJOb3QgU3RhcnRlZCIsImNyZWF0ZURhdGUiOiIyMDEwLTA1LTEwVDAwOjU5OjM1LTA3OjAwIiwiZmlsZUxpc3QiOiJbL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDEwMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMS01MS1jMDFfMjAwNWQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMDkzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQxMTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMTA4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTA0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDEwNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQxMTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAyXzIwMDhkMTA2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDEyMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDFfMjAwOGQxMDEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDEyMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDFfMjAwOGQxMTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDEyMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDFfMjAwOGQxMTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTA0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDA5My5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAyXzIwMDhkMTA2LmhlNV0iLCJpZCI6IjBjZGQ1NWY2LWI5NTQtNGFhZS1iOGRlLTc5ZGM1MmU4NTAyOSJ9LHsicHJvZHVjdFR5cGUiOiJoZTUiLCJwb2xpY3kiOiJtbHMiLCJleHRyYWN0b3JDbGFzcyI6Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5FeHRlcm5NZXRFeHRyYWN0b3IiLCJleHRyYWN0b3JDb25mRmlsZXMiOiJbL2hvbWUvam9zaHVhZ2EvZXh0cmFjdG9ycy9vZGxleHRyYWN0b3IvaGU1ZXh0cmFjdG9yLmNvbmZpZ10iLCJzdGF0dXMiOiJOb3QgU3RhcnRlZCIsImNyZWF0ZURhdGUiOiIyMDEwLTA1LTEwVDAwOjU5OjM1LTA3OjAwIiwiZmlsZUxpc3QiOiJbL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMl8yMDA4ZDEwNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQxMDQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQwOTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMTE5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMDk1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDEwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAxLTUyLWMwMV8yMDA3ZDAwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDA5My5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTAzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMDEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPQ2xfdjAyLTIzLWMwMV8yMDA4ZDExNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTE0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMl8yMDA4ZDEyMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTE2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDEyMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU9IX3YwMi0yMy1jMDFfMjAwOGQwOTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMl8yMDA4ZDA5Mi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAyXzIwMDhkMTIxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDEtNTItYzAxXzIwMDdkMDM2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDA5My5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAxXzIwMDhkMDkzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1XSIsImlkIjoiOTNiNWI4MDMtNGIyNS00OWRjLTlmZTctMDJmOTA3YzFkY2I1In0seyJwcm9kdWN0VHlwZSI6ImhlNSIsInBvbGljeSI6Im1scyIsImV4dHJhY3RvckNsYXNzIjoib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkV4dGVybk1ldEV4dHJhY3RvciIsImV4dHJhY3RvckNvbmZGaWxlcyI6IlsvaG9tZS9qb3NodWFnYS9leHRyYWN0b3JzL29kbGV4dHJhY3Rvci9oZTVleHRyYWN0b3IuY29uZmlnXSIsInN0YXR1cyI6Ik5vdCBTdGFydGVkIiwiY3JlYXRlRGF0ZSI6IjIwMTAtMDUtMTBUMDA6NTk6MzUtMDc6MDAiLCJmaWxlTGlzdCI6IlsvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTE0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDEtNTItYzAxXzIwMDdkMDU1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMl8yMDA4ZDEyMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQxMTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAyXzIwMDhkMTExLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMTE5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1HUEhfdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDExMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMl8yMDA4ZDEyMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTE1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDEtNTEtYzAxXzIwMDVkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMDkzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1HUEhfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMS01Mi1jMDFfMjAwN2QwMzYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDA5Ny5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMl8yMDA4ZDEwNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQxMDcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAyXzIwMDhkMTA2LmhlNV0iLCJpZCI6IjhjNTRiNGQ4LTBkYjUtNDM4OS04Yzk5LTNmZTNiYTZkN2E2YiJ9LHsicHJvZHVjdFR5cGUiOiJoZTUiLCJwb2xpY3kiOiJtbHMiLCJleHRyYWN0b3JDbGFzcyI6Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5FeHRlcm5NZXRFeHRyYWN0b3IiLCJleHRyYWN0b3JDb25mRmlsZXMiOiJbL2hvbWUvam9zaHVhZ2EvZXh0cmFjdG9ycy9vZGxleHRyYWN0b3IvaGU1ZXh0cmFjdG9yLmNvbmZpZ10iLCJzdGF0dXMiOiJOb3QgU3RhcnRlZCIsImNyZWF0ZURhdGUiOiIyMDEwLTA1LTEwVDAwOjU5OjM1LTA3OjAwIiwiZmlsZUxpc3QiOiJbL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENOX3YwMi0yMy1jMDFfMjAwOGQxMTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAxLTUxLWMwMV8yMDA1ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDEwMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTAzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMTE1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDExMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMDcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMDk0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDA5OS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDEwNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQxMTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMDk1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDA5My5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDJfMjAwOGQxMDIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQwOTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDJfMjAwOGQwOTIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAxXzIwMDhkMDkzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTE5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDMwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQwOTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDExNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQxMDEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPQ2xfdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMl8yMDA4ZDEyMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENOX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQxMDguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1HUEhfdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQzMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMTEyLmhlNV0iLCJpZCI6IjYwNDkxNjc1LWQ4NzAtNGZjOC1hYTFjLWZmNTUwM2FkMmFlOSJ9LHsicHJvZHVjdFR5cGUiOiJoZTUiLCJwb2xpY3kiOiJtbHMiLCJleHRyYWN0b3JDbGFzcyI6Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5FeHRlcm5NZXRFeHRyYWN0b3IiLCJleHRyYWN0b3JDb25mRmlsZXMiOiJbL2hvbWUvam9zaHVhZ2EvZXh0cmFjdG9ycy9vZGxleHRyYWN0b3IvaGU1ZXh0cmFjdG9yLmNvbmZpZ10iLCJzdGF0dXMiOiJOb3QgU3RhcnRlZCIsImNyZWF0ZURhdGUiOiIyMDEwLTA1LTEwVDAwOjU5OjM1LTA3OjAwIiwiZmlsZUxpc3QiOiJbL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAxLTUyLWMwMV8yMDA3ZDA1NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENOX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTEzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDEwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU9IX3YwMi0yMy1jMDFfMjAwOGQxNjguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxMTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDFfMjAwOGQxMDguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTA0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1HUEhfdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMl8yMDA4ZDEyMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENOX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAyXzIwMDhkMTExLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDEwMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDFfMjAwOGQwOTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQwOTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQwOTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMDk1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAyXzIwMDhkMTAyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDJfMjAwOGQwOTIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQwOTcuaGU1XSIsImlkIjoiMTllYzZiNGItZGMyYi00NDBkLTk2ZTItMGJmYzEzYzU0ZDM3In0seyJwcm9kdWN0VHlwZSI6ImhlNSIsInBvbGljeSI6Im1scyIsImV4dHJhY3RvckNsYXNzIjoib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkV4dGVybk1ldEV4dHJhY3RvciIsImV4dHJhY3RvckNvbmZGaWxlcyI6IlsvaG9tZS9qb3NodWFnYS9leHRyYWN0b3JzL29kbGV4dHJhY3Rvci9oZTVleHRyYWN0b3IuY29uZmlnXSIsInN0YXR1cyI6Ik5vdCBTdGFydGVkIiwiY3JlYXRlRGF0ZSI6IjIwMTAtMDUtMTBUMDA6NTk6MzUtMDc6MDAiLCJmaWxlTGlzdCI6IlsvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDA5OS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDEwMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAyXzIwMDhkMTIxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMTA4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMzAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDEwNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMl8yMDA4ZDEwNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQwOTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQxMDEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDEtNTEtYzAzXzIwMDVkMDAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDEwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMDk0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTA0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDA5OC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQxMDguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTE1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDExNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMS01Mi1jMDFfMjAwN2QwMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTEwLmhlNV0iLCJpZCI6ImFlMDA0M2RlLWYxYjAtNDQyYy1hMDk3LTE5ODk4MzRiZjZhMCJ9LHsicHJvZHVjdFR5cGUiOiJoZTUiLCJwb2xpY3kiOiJtbHMiLCJleHRyYWN0b3JDbGFzcyI6Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5FeHRlcm5NZXRFeHRyYWN0b3IiLCJleHRyYWN0b3JDb25mRmlsZXMiOiJbL2hvbWUvam9zaHVhZ2EvZXh0cmFjdG9ycy9vZGxleHRyYWN0b3IvaGU1ZXh0cmFjdG9yLmNvbmZpZ10iLCJzdGF0dXMiOiJOb3QgU3RhcnRlZCIsImNyZWF0ZURhdGUiOiIyMDEwLTA1LTEwVDAwOjU5OjM1LTA3OjAwIiwiZmlsZUxpc3QiOiJbL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAxXzIwMDhkMDk4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTE4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPQ2xfdjAyLTIzLWMwMV8yMDA4ZDExMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDExNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDA5OC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMl8yMDA4ZDA5Mi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDEtNTItYzAxXzIwMDdkMDU1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDA5OS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDExNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDEtNTEtYzAzXzIwMDVkMDAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMTE0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQxMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAyXzIwMDhkMTAyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDEwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQxMTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTE2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDExMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtT0hfdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMDcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMTE4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDEwNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQwOTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAyXzIwMDhkMTIxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMDk1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMDguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTVdIiwiaWQiOiI1NTMxZDIxNy1lOWY3LTRhYWMtYTdhNi1mNzkzMmVhNjFmNWQifSx7InByb2R1Y3RUeXBlIjoiaGU1IiwicG9saWN5IjoibWxzIiwiZXh0cmFjdG9yQ2xhc3MiOiJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRXh0ZXJuTWV0RXh0cmFjdG9yIiwiZXh0cmFjdG9yQ29uZkZpbGVzIjoiWy9ob21lL2pvc2h1YWdhL2V4dHJhY3RvcnMvb2RsZXh0cmFjdG9yL2hlNWV4dHJhY3Rvci5jb25maWddIiwic3RhdHVzIjoiTm90IFN0YXJ0ZWQiLCJjcmVhdGVEYXRlIjoiMjAxMC0wNS0xMFQwMDo1OTozNS0wNzowMCIsImZpbGVMaXN0IjoiWy9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAxXzIwMDhkMTY4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMTAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDExMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTA4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMDQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMS01Mi1jMDFfMjAwN2QwMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAyXzIwMDhkMDkyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDExMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxMDcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDFfMjAwOGQwOTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMDkzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMl8yMDA4ZDA5Mi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAxXzIwMDhkMTY4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDExOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMS01Mi1jMDFfMjAwN2QwMDkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTAzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAyXzIwMDhkMTA2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMTE5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDE2OC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQwOTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMDk0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDJfMjAwOGQwOTIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAyXzIwMDhkMTAyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAxXzIwMDhkMTE1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1HUEhfdjAyLTIzLWMwMV8yMDA4ZDExMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQwOTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPQ2xfdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAxLTUxLWMwMV8yMDA1ZDM2NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDA5OC5oZTVdIiwiaWQiOiJmZjU2NGU2ZC01OGNjLTQ4MzItOTcxYy0wOWVmYTgxNzU0NGYifSx7InByb2R1Y3RUeXBlIjoiaGU1IiwicG9saWN5IjoibWxzIiwiZXh0cmFjdG9yQ2xhc3MiOiJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRXh0ZXJuTWV0RXh0cmFjdG9yIiwiZXh0cmFjdG9yQ29uZkZpbGVzIjoiWy9ob21lL2pvc2h1YWdhL2V4dHJhY3RvcnMvb2RsZXh0cmFjdG9yL2hlNWV4dHJhY3Rvci5jb25maWddIiwic3RhdHVzIjoiTm90IFN0YXJ0ZWQiLCJjcmVhdGVEYXRlIjoiMjAxMC0wNS0xMFQwMDo1OTozNS0wNzowMCIsImZpbGVMaXN0IjoiWy9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxMDAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMl8yMDA4ZDA5Mi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU9IX3YwMi0yMy1jMDFfMjAwOGQxMDMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTA0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMzAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAyXzIwMDhkMTA2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTjJPX3YwMi0yMy1jMDJfMjAwOGQxMjEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU9IX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDA5My5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDJfMjAwOGQxMDIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMS01MS1jMDNfMjAwNWQwMDEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDEtNTEtYzAxXzIwMDVkMzY1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQwOTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMl8yMDA4ZDEwNi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTEzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDA5OC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxNjguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMTA1LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAxLTUyLWMwMV8yMDA3ZDAwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAyXzIwMDhkMTExLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTA3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDA5Ny5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMTYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTAzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAxXzIwMDhkMTEzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PM192MDItMjMtYzAyXzIwMDhkMTIxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMDk5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1PSF92MDItMjMtYzAxXzIwMDhkMzAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTVdIiwiaWQiOiJhNzU2YzU4Ny1kYWZkLTQwNzctOGFmYi1iMzIxMTU0ZTg4MzkifSx7InByb2R1Y3RUeXBlIjoiaGU1IiwicG9saWN5IjoibWxzIiwiZXh0cmFjdG9yQ2xhc3MiOiJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRXh0ZXJuTWV0RXh0cmFjdG9yIiwiZXh0cmFjdG9yQ29uZkZpbGVzIjoiWy9ob21lL2pvc2h1YWdhL2V4dHJhY3RvcnMvb2RsZXh0cmFjdG9yL2hlNWV4dHJhY3Rvci5jb25maWddIiwic3RhdHVzIjoiTm90IFN0YXJ0ZWQiLCJjcmVhdGVEYXRlIjoiMjAxMC0wNS0xMFQwMDo1OTozNS0wNzowMCIsImZpbGVMaXN0IjoiWy9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUdQSF92MDItMjMtYzAxXzIwMDhkMTE5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDEtNTItYzAxXzIwMDdkMDM2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1HUEhfdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDFfMjAwOGQxMTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAyXzIwMDhkMTIxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDJfMjAwOGQwOTIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNIM0NOX3YwMi0yMy1jMDFfMjAwOGQxMjAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAyXzIwMDhkMTAyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTE0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAxLTUxLWMwMV8yMDA1ZDM2NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMDk2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAxLTUxLWMwM18yMDA1ZDAwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtR1BIX3YwMi0yMy1jMDFfMjAwOGQxMTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPQ2xfdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDFfMjAwOGQxMDQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQwOTcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLURHR192MDItMjMtYzAyXzIwMDhkMTExLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1TTzJfdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAxXzIwMDhkMTAxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAyLTIzLWMwMV8yMDA4ZDEwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMTIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDExOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ0gzQ05fdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDJfMjAwOGQxMDIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTEyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExNy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtTzNfdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDFfMjAwOGQxMTguaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDTl92MDItMjMtYzAxXzIwMDhkMDkzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDItMjMtYzAyXzIwMDhkMTAyLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1OMk9fdjAyLTIzLWMwMV8yMDA4ZDEwNC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE5PM192MDItMjMtYzAyXzIwMDhkMTA2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ2xfdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDJfMjAwOGQxMDIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAxXzIwMDhkMTE4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDExNS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMTE2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMTEzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDJfMjAwOGQxMDYuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUlXQ192MDItMjMtYzAyXzIwMDhkMTAyLmhlNV0iLCJpZCI6ImJiZGUwNDk0LWE0YWMtNDYwYS05ZDEzLTU1Y2RkNzQ2NmJjZiJ9LHsicHJvZHVjdFR5cGUiOiJoZTUiLCJwb2xpY3kiOiJtbHMiLCJleHRyYWN0b3JDbGFzcyI6Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5FeHRlcm5NZXRFeHRyYWN0b3IiLCJleHRyYWN0b3JDb25mRmlsZXMiOiJbL2hvbWUvam9zaHVhZ2EvZXh0cmFjdG9ycy9vZGxleHRyYWN0b3IvaGU1ZXh0cmFjdG9yLmNvbmZpZ10iLCJzdGF0dXMiOiJOb3QgU3RhcnRlZCIsImNyZWF0ZURhdGUiOiIyMDEwLTA1LTEwVDAwOjU5OjM1LTA3OjAwIiwiZmlsZUxpc3QiOiJbL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDA5NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU9IX3YwMi0yMy1jMDFfMjAwOGQxMDcuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNsT192MDItMjMtYzAxXzIwMDhkMTA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTEzLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1Cck9fdjAxLTUxLWMwMV8yMDA1ZDM2NS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE8yX3YwMi0yMy1jMDFfMjAwOGQwOTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDA5OC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQwOTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAxXzIwMDhkMTE3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAyXzIwMDhkMTIxLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DSDNDTl92MDEtNTItYzAxXzIwMDdkMDA5LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMl8yMDA4ZDA5Mi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENOX3YwMi0yMy1jMDFfMjAwOGQxMDUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhOTzNfdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ2xPX3YwMi0yMy1jMDJfMjAwOGQxMDIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTEwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMTE4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IT0NsX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU9IX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUJyT192MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DT192MDItMjMtYzAxXzIwMDhkMTEwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtREdHX3YwMi0yMy1jMDFfMjAwOGQxMTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAyXzIwMDhkMTA2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITzJfdjAyLTIzLWMwMl8yMDA4ZDEwMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQxMTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU4yT192MDItMjMtYzAxXzIwMDhkMDk0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ER0dfdjAyLTIzLWMwMV8yMDA4ZDMwMC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDExMy5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtQnJPX3YwMi0yMy1jMDFfMjAwOGQxMDQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAxXzIwMDhkMTIwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1JV0NfdjAyLTIzLWMwMV8yMDA4ZDExMi5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSENsX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDEtNTItYzAxXzIwMDdkMDM2LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDA5OS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSVdDX3YwMi0yMy1jMDFfMjAwOGQxMDQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMi0yMy1jMDFfMjAwOGQxMTIuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVJISV92MDItMjMtYzAxXzIwMDhkMDk3LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDEwOS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtUkhJX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAxXzIwMDhkMTAwLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IQ05fdjAyLTIzLWMwMV8yMDA4ZDEwOC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQwOTUuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLU8zX3YwMi0yMy1jMDFfMjAwOGQxMTkuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhPMl92MDItMjMtYzAxXzIwMDhkMTA0LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1SSElfdjAyLTIzLWMwMl8yMDA4ZDExMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSE9DbF92MDItMjMtYzAxXzIwMDhkMTE4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1ITk8zX3YwMi0yMy1jMDFfMjAwOGQxMTAuaGU1XSIsImlkIjoiNTczNGZhMjctYWRmZi00MzliLWFkNDUtYjRkMzBhMWI3MDAxIn0seyJwcm9kdWN0VHlwZSI6ImhlNSIsInBvbGljeSI6Im1scyIsImV4dHJhY3RvckNsYXNzIjoib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkV4dGVybk1ldEV4dHJhY3RvciIsImV4dHJhY3RvckNvbmZGaWxlcyI6IlsvaG9tZS9qb3NodWFnYS9leHRyYWN0b3JzL29kbGV4dHJhY3Rvci9oZTVleHRyYWN0b3IuY29uZmlnXSIsInN0YXR1cyI6Ik5vdCBTdGFydGVkIiwiY3JlYXRlRGF0ZSI6IjIwMTAtMDUtMTBUMDA6NTk6MzUtMDc6MDAiLCJmaWxlTGlzdCI6IlsvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUhDbF92MDItMjMtYzAyXzIwMDhkMTExLmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1IMk9fdjAyLTIzLWMwMV8yMDA4ZDA5Ni5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtSDJPX3YwMi0yMy1jMDFfMjAwOGQwOTQuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUgyT192MDItMjMtYzAxXzIwMDhkMTE4LmhlNSwgL2hvbWUvam9zaHVhZ2Evc3RhZ2luZy9wcm9kdWN0cy9tbHMvTUxTLUF1cmFfTDJHUC1DbE9fdjAyLTIzLWMwMV8yMDA4ZDEwMS5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtVGVtcGVyYXR1cmVfdjAyLTIzLWMwMV8yMDA4ZDA5NC5oZTUsIC9ob21lL2pvc2h1YWdhL3N0YWdpbmcvcHJvZHVjdHMvbWxzL01MUy1BdXJhX0wyR1AtU08yX3YwMi0yMy1jMDFfMjAwOGQxMTMuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLUNPX3YwMi0yMy1jMDJfMjAwOGQxMTEuaGU1LCAvaG9tZS9qb3NodWFnYS9zdGFnaW5nL3Byb2R1Y3RzL21scy9NTFMtQXVyYV9MMkdQLVNPMl92MDItMjMtYzAxXzIwMDhkMTAwLmhlNV0iLCJpZCI6IjM2NjFlMTE4LTVhZTEtNGQ2YS1iMzQ5LWMwN2NkMDZhZmU1MCJ9XX0KKyAgICAgIF1dPjwvc291cmNlPgorICAgICAgPC9wPgorICAgICAgCisgICAgPC9zZWN0aW9uPiAKKyAgICAKKyAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgIDxzZWN0aW9uIG5hbWU9IkNyZWF0aW5nIGFuIEluZ2VzdGlvbiBUYXNrIGluIHRoZSBDdXJhdG9yIFF1ZXVlIj4KKyAgICAgIDxwPgorICAgICAgQW4gaW5nZXN0aW9uIHRhc2sgY2FuIGJlIGFkZGVkIHRvIHRoZSBjdXJhdG9yIHRocm91Z2ggdGhlIFJFU1QgaW50ZXJmYWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogPGJyLz4KKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgICBodHRwOi8veW91cmhvc3QvY3VyYXRvci9zZXJ2aWNlcy9pbmdlc3QvY3JlYXRlP2ZpbGVzPTxmaWxlMSxmaWxlMj4mbnVtZmlsZXM9TiZtZXRFeHRDZmdJZD1zb21ldGhpbmcmcG9saWN5PW1scyZwdHlwZT08cHJvZHVjdCB0eXBlPiA8YnIvPgorICAgICAgXV0+PC9zb3VyY2U+CisgICAgICA8L3A+CisgICAgICAKKyAgICAgIDxwPgorICAgICAgPHVsPgorICAgICAgICA8bGk+eW91cmhvc3QgaXMgdGhlIGhvc3QgdGhhdCBpcyBydW5uaW5nIHRoZSB0b21jYXQgc2VydmVyIHdpdGggdGhlIGN1cmF0b3IuIEZvciBleGFtcGxlLCB5b3VyIGhvc3QgY2FuIGJlIHd3dy5teWN1cmF0b3IuY29tPC9saT4KKyAgICAgICAgPGxpPmZpbGVzIHRha2VzIGFzIGEgdmFsdWUgYSBsaXN0IG9mIGZpbGVzIHRvIGJlIGluZ2VzdGVkPC9saT4KKyAgICAgICAgPGxpPm51bWZpbGVzIHRha2VzIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8gYmUgaW5nZXN0ZWQ8L2xpPgorICAgICAgICA8bGk+bWV0RXh0Q2ZnSWQgaXMgdGhlIG51bSBvZiB0aGUgbWV0YWRhdGEgZXh0cmFjdG9yIHRvIGJlIHVzZWQuICBGb3IgZXhhbXBsZSwgbXAzZXh0cmFjdG9yLjwvbGk+CisgICAgICAgIDxsaT5wb2xpY3kgaXMgPzwvbGk+CisgICAgICAgIDxsaT5wdHlwZSB0YWtlcyBhcyBhIHZhbHVlaXMgdGhlIHByb2R1Y3QgdHlwZSBvZiB0aGUgZmlsZXMgdG8gYmUgaW5nZXN0ZWQuICBGb3IgZXhhbXBsZSwgbXAzLjwvbGk+CisgICAgICA8L3VsPgorICAgICAgPC9wPgorICAgICAgCisgICAgICA8cD4KKyAgICAgIEFuIGV4YW1wbGUgVVJMIGlzIHRoZSBmb2xsb3dpbmc6PGJyLz4KKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgICBodHRwOi8veW91cmhvc3QvY3VyYXRvci9zZXJ2aWNlcy9pbmdlc3QvY3JlYXRlP2ZpbGVzPW1scyUyRk1MUy1BdXJhX0wyR1AtQ09fdjAyLTIzLWMwMV8yMDA4ZDEwNy5oZTUlMkNtbHMlMkZNTFMtQXVyYV9MMkdQLVRlbXBlcmF0dXJlX3YwMS01Mi1jMDFfMjAwN2QwNTUuaGU1JTJDbWxzJTJGTUxTLUF1cmFfTDJHUC1UZW1wZXJhdHVyZV92MDItMjMtYzAxXzIwMDhkMTEwLmhlNSZwb2xpY3k9bWxzJnB0eXBlPWhlNSZudW1maWxlcz0zJm1ldEV4dENmZ0lkPW9kbGV4dHJhY3RvcgorICAgICAgXV0+PC9zb3VyY2U+CisgICAgICBUaGUgcmVzdWx0IGlzIHRoZSB0YXNrIGlkIGZvciB0aGUgaW5nZXN0aW9uIHRhc2suIEZvciBleGFtcGxlLCAyYzZkZjFkYy1iZmMxLTRlMjItODg5ZS03YjJjMjYyYzdkYjMuCisgICAgICA8L3A+CisgICAgICAgIAorICAgIDwvc2VjdGlvbj4gCisgICAgCisgICAgPGEgbmFtZT0ic2VjdGlvbjMiLz4KKyAgICA8c2VjdGlvbiBuYW1lPSJTdGFydGluZyBhbiBJbmdlc3Rpb24gVGFzayI+CisgICAgICA8cD4KKyAgICAgIFRvIHJ1biB0aGUgaW5nZXN0aW9uIHRhc2ssIHRoZSBmb2xsb3dpbmcgVVJMIGNhbiBiZSB1c2VkOjxici8+CisgICAgICA8c291cmNlPjwhW0NEQVRBWworICAgICAgaHR0cDovL3lvdXJob3N0L2N1cmF0b3Ivc2VydmljZXMvaW5nZXN0L3N0YXJ0P3Rhc2tJZD08dGFzayBJZD4KKyAgICAgIF1dPjwvc291cmNlPgorICAgICAgPC9wPgorICAgICAgCisgICAgICA8cD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPnlvdXJob3N0IGlzIHRoZSBob3N0IHRoYXQgaXMgcnVubmluZyB0aGUgdG9tY2F0IHNlcnZlciB3aXRoIHRoZSBjdXJhdG9yLiBGb3IgZXhhbXBsZSwgeW91cmhvc3QgY2FuIGJlIHd3dy5teWN1cmF0b3IuY29tPC9saT4KKyAgICAgICAgPGxpPnRhc2sgSWQgaXMgdGhlIHRhc2sgaWQgZm9yIHRoZSBpbmdlc3Rpb24gdGFzay4gRm9yIGV4YW1wbGUsIDJjNmRmMWRjLWJmYzEtNGUyMi04ODllLTdiMmMyNjJjN2RiMywgd2hpY2ggd2FzIHRoZSByZXN1bHQgb2YgdGhlIGNyZWF0aW9uIHRhc2sgZXhhbXBsZSBvZiB0aGUgcHJldmlvdXMgc2VjdGlvbi48L2xpPgorICAgICAgPC91bD4KKyAgICAgIDwvcD4KKyAgICAgICAgICAKKyAgICA8L3NlY3Rpb24+IAorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9tYXZlbi54bWwgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvbWF2ZW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyMDdmYTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvbWF2ZW4ueG1sCkBAIC0wLDAgKzEsMTc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPlVzaW5nIE1hdmVuPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmlkIFdvb2xsYXJkPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJVc2luZyBNYXZlbiI+CisgICAgICA8cD5BcGFjaGUgT09EVCB1c2VzIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+TWF2ZW48L2E+IGZvciAKKyAgICAgIG1hbmFnaW5nIG91ciBidWlsZCBlbnZpcm9ubWVudC4gTWF2ZW4gaXMgYW4gb3BlbiBzb3VyY2UgcHJvZHVjdCBmcm9tIHRoZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPiB0aGF0IGltcHJvdmVzIAorICAgICAgb24gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiBpbiB0aGUgYXJlYSBvZiBidWlsZCBtYW5hZ2VtZW50LCAKKyAgICAgIHdoaWNoIGl0IHR1cm4gd2FzIGFuIGltcHJvdmVtZW50IG9uIE1ha2UuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgCisgICAgICBNYXZlbiBmb3IgT09EVCBidWlsZCBtYW5hZ2VtZW50LjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iU2V0dXAiPgorICAgICAgPHA+TWF2ZW4gY2FuIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgCisgICAgICA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIj5NYXZlbiBEb3dubG9hZDwvYT4gCisgICAgICBwYWdlLiBPT0RUIGlzIHVzaW5nIHZlcnNpb24gMi4wIGFuZCBhYm92ZS4gTWF2ZW4gd2FzIGRldmVsb3BlZCBpbiBKYXZhIHNvIGl0IAorICAgICAgd2lsbCBydW4gb24gdGhlIHBvcHVsYXIgcGxhdGZvcm1zIChlLmcuLCBXaW5kb3dzLCBNYWMgT1NYLCBldGMuKS4gQmV5b25kIAorICAgICAgbWFraW5nIHN1cmUgdGhlIDxpPm12bjwvaT4gZXhlY3V0YWJsZSBpcyBpbiB5b3VyIHBhdGgsIHRoZXJlIGlzIHZlcnkgbGl0dGxlIAorICAgICAgc2V0dXAgcmVxdWlyZWQuPC9wPgorCisgICAgICA8cD5NYXZlbiBpcyBiYXNlZCBvbiB0aGUgY29uY2VwdCBvZiBhIFByb2plY3QgT2JqZWN0IE1vZGVsIChQT00pIHdoaWNoIGlzIAorICAgICAgY29udGFpbmVkIGluIHRoZSA8aT5wb20ueG1sPC9pPiBmaWxlIGZvdW5kIGF0IHRoZSByb290IG9mIGVhY2ggcHJvamVjdC4gCisgICAgICBUaGUgUE9NIGFsbG93cyBNYXZlbiB0byBtYW5hZ2UgYSBwcm9qZWN0J3MgYnVpbGQsIHJlcG9ydGluZyBhbmQgZG9jdW1lbnRhdGlvbi4gCisgICAgICBGb3IgT09EVCwgbXVjaCBvZiB0aGUgZGVmYXVsdCBpbmZvcm1hdGlvbiBmb3IgbWFuYWdpbmcgdGhlIHByb2plY3RzIGlzIAorICAgICAgY29udGFpbmVkIGluIGEgcGFyZW50IFBPTSwgd2hpY2ggaXMgbG9jYXRlZCBpbiB0aGUgPGk+b29kdC1jb3JlPC9pPiBwcm9qZWN0LiBTbywgCisgICAgICBpbiBvcmRlciB0byBidWlsZCBhbnkgb2YgdGhlIG90aGVyIHByb2plY3RzIChlLmcuLCBjYXMtY3VyYXRvciwgY2FzLWZpbGVtZ3IsIAorICAgICAgZXRjLikgdGhlIHBhcmVudCBQT00gbXVzdCBiZSBkb3dubG9hZGVkIGZyb20gdGhlIE9PRFQgTWF2ZW4gcmVwb3NpdG9yeS4gVGhlIAorICAgICAgbG9jYWwgPGk+cG9tLnhtbDwvaT4gZmlsZXMgZm9yIGVhY2ggb2YgdGhlIHByb2plY3RzIGhhdmUgYmVlbiBjb25maWd1cmVkIHRvIAorICAgICAgcmV0cmlldmUgdGhlIHBhcmVudCBQT00gYXV0b21hdGljYWxseS48L3A+CisgICAgICAKKyAgICAgIDxwPk9uY2UgTWF2ZW4gaGFzIGJlZW4gc2V0dXAsIHRoZSBmaXJzdCBzdGVwIHRvIGJ1aWxkaW5nIGEgcHJvamVjdCB3aXRoIE1hdmVuIAorICAgICAgaXMgdG8gY2hlY2tvdXQgYSBwcm9qZWN0J3Mgc291cmNlIGNvZGUgaW50byB0aGUgZGV2ZWxvcGVyJ3Mgd29yayBhcmVhLiBTZWUgdGhlIAorICAgICAgPGEgaHJlZj0iLi4vZGV2ZWxvcG1lbnQvc3VidmVyc2lvbi5odG1sIj5Vc2luZyBTdWJ2ZXJzaW9uPC9hPiBkb2N1bWVudCBmb3IgaG93IHRvIAorICAgICAgY2hlY2sgb3V0IHByb2plY3RzIGZyb20gdGhlIENNIHJlcG9zaXRvcnkuPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8c2VjdGlvbiBuYW1lPSJQcm9qZWN0IFN0cnVjdHVyZSI+CisgICAgICA8cD5JbiBvcmRlciBmb3IgZGVmYXVsdCBNYXZlbiBmdW5jdGlvbnMgdG8gb3BlcmF0ZSBwcm9wZXJseSwgdGhlcmUgaXMgYSAKKyAgICAgIHN1Z2dlc3RlZCBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuIFRoZSBzdHJ1Y3R1cmUgaXMgYXMgZm9sbG93czo8L3A+CisgICAgICAKKyAgICAgIDxzb3VyY2U+CisvCisgIHNyYy8gICAgICAgICAgICAgU291cmNlIENvZGUgKGV2ZXJ5dGhpbmcpCisgICAgbWFpbi8gICAgICAgICAgICBQcm9ncmFtIFNvdXJjZQorICAgICAgYXNzZW1ibHkvICAgICAgICBQYWNrYWdlIERlc2NyaXB0b3IKKyAgICAgIGphdmEvICAgICAgICAgICAgSmF2YSBTb3VyY2UKKyAgICAgIHJlc291cmNlcy8gICAgICAgU2NyaXB0cywgQ29uZmlnIEZpbGUsIGV0Yy4KKyAgICAgICAgLi4uCisgICAgdGVzdC8gICAgICAgICAgICBUZXN0IFNvdXJjZQorICAgICAgamF2YS8KKyAgICAgIHJlc291cmNlcy8KKyAgICAgICAgLi4uCisgICAgc2l0ZS8gICAgICAgICAgICBTaXRlIERvY3VtZW50YXRpb24KKyAgICAgIGFwdC8gICAgICAgICAgICAgRG9jcyBpbiBBUFQgRm9ybWF0CisgICAgICAgIGluZGV4LmFwdAorICAgICAgICAuLi4KKyAgICAgIHhkb2MvICAgICAgICAgICAgRG9jcyBpbiBYRE9DIEZvcm1hdAorICAgICAgICBpbmRleC54bWwKKyAgICAgICAgLi4uCisgICAgICByZXNvdXJjZXMvCisgICAgICAgIGltYWdlcy8KKyAgICAgIHNpdGUueG1sICAgICAgICAgTWVudSBTdHJ1Y3R1cmUKKworICB0YXJnZXQvICAgICAgICAgIEJ1aWxkIFJlc3VsdHMgKGJpbmFyaWVzLCBkb2NzIGFuZCBwYWNrYWdlcykKKyAgICAuLi4KKworICBMSUNFTlNFLnR4dAorICBSRUFETUUudHh0CisgIHBvbS54bWwgICAgICAgICAgUHJvamVjdCBPYmplY3QgTW9kZWwgKFBPTSkKKyAgICAgIDwvc291cmNlPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8c2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBDb21tYW5kcyI+CisgICAgPHA+VGhlcmUgYXJlIGZldyBzdGFuZGFyZCBjb21tYW5kcyB0aGF0IGRldmVsb3BlcnMgd2lsbCB1c2Ugb24gYSBkYWlseSBiYXNpcyAKKyAgICBhbmQgdGhleSBhcmUgcmVsYXRlZCB0byBidWlsZGluZyBhbmQgY2xlYW5pbmcgYSBwcm9qZWN0LjwvcD4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJCdWlsZCBhIFByb2plY3QiPgorICAgICAgPHA+QnVpbGQgdGhlIHByb2plY3QncyBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIHdpdGggdGhlIGZvbGxvd2luZyAKKyAgICAgIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBjb21waWxlCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlRoZSBhYm92ZSBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIGFydGlmYWN0cyBpbiB0aGUgPGk+dGFyZ2V0LzwvaT4gCisgICAgICBkaXJlY3RvcnkuPC9wPiAgICAgIAorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbnN0YWxsIGEgUHJvamVjdCI+CisgICAgICA8cD5JbnN0YWxsIHRoZSBwcm9qZWN0J3MgYXJ0aWZhY3RzIGxvY2FsbHkgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBpbnN0YWxsCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlByaW9yIHRvIGluc3RhbGxhdGlvbiwgdGhlIGFib3ZlIGNvbW1hbmQgd2lsbCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSwgCisgICAgICBpZiBuZWNlc3NhcnksIGFuZCBleGVjdXRlIHRoZSB1bml0IHRlc3RzLiBUaGUgcmVzdWx0IG9mIHRoZSBhYm92ZSBjb21tYW5kIAorICAgICAgaXMgdG8gaW5zdGFsbCB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0cyAoZS5nLiBwb20sIGphciwgZXRjLikgaW4gdGhlIHVzZXIncyAKKyAgICAgIGxvY2FsIE1hdmVuIHJlcG9zaXRvcnkgKCRIT01FLy5tMi9yZXBvc2l0b3J5LykuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIAorICAgICAgYXJ0aWZhY3QgaXMgYSBkZXBlbmRlbmN5IGZvciBhbm90aGVyIHByb2plY3QgYnV0IGhhcyB5ZXQgdG8gYmUgZGVwbG95ZWQgCisgICAgICB0byB0aGUgU1dTQSBNYXZlbiByZXBvc2l0b3J5LjwvcD4KKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iUGFja2FnZSBhIFByb2plY3QiPgorICAgICAgPHA+Q3JlYXRlIHRoZSBwcm9qZWN0J3MgZGlzdHJpYnV0aW9uIHBhY2thZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBwYWNrYWdlCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlByaW9yIHRvIHBhY2thZ2UgY3JlYXRpb24sIHRoZSBhYm92ZSBjb21tYW5kIHdpbGwgY29tcGlsZSB0aGUgc291cmNlIAorICAgICAgY29kZSwgaWYgbmVjZXNzYXJ5LCBhbmQgZXhlY3V0ZSB0aGUgdW5pdCB0ZXN0cy4gVGhlIGFib3ZlIGNvbW1hbmQgd2lsbCAKKyAgICAgIGNyZWF0ZSB0aGUgcGFja2FnZShzKSBpbiB0aGUgdGFyZ2V0LyBkaXJlY3RvcnkuPC9wPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJCdWlsZCBhIFByb2plY3QncyBXZWIgU2l0ZSI+CisgICAgICA8cD5CdWlsZCB0aGUgcHJvamVjdCdzIHdlYiBzaXRlIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gc2l0ZQorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCB3aWxsIGdlbmVyYXRlIHRoZSB3ZWIgc2l0ZSBpbiB0aGUgPGk+dGFyZ2V0L3NpdGUvPC9pPgorICAgICAgZGlyZWN0b3J5LiBWaWV3IHRoZSBzaXRlIGJ5IHBvaW50aW5nIHlvdXIgd2ViIGJyb3dzZXIgYXQgdGhlIAorICAgICAgPGk+aW5kZXguaHRtbDwvaT4gZmlsZSB3aXRoaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgorICAgIDwvc3Vic2VjdGlvbj4gCisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ2xlYW4gYSBQcm9qZWN0Ij4KKyAgICAgIDxwPkNsZWFuIG91dCB0aGUgcHJvamVjdCBkaXJlY3Rvcnkgb2YgZ2VuZXJhdGVkIGFydGlmYWN0cyB3aXRoIHRoZSAKKyAgICAgIGZvbGxvd2luZyBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gY2xlYW4KKyAgICAgIDwvc291cmNlPgorICAgICAgPHA+VGhlIGFib3ZlIGNvbW1hbmQgd2lsbCByZW1vdmUgdGhlIDxpPnRhcmdldC88L2k+IGRpcmVjdG9yeSBhbmQgaXRzIAorICAgICAgY29udGVudHMuPC9wPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJVc2VmdWwgQ29tbWFuZCBBcmd1bWVudHMiPgorICAgICAgPHA+VGhlcmUgYSBjb3VwbGUgb2YgdXNlZnVsIGFyZ3VtZW50cyB3aGljaCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIAorICAgICAgY29tbWFuZHMgYWJvdmUgdG8gbGltaXQgdGhlIHNjb3BlIG9mIHRoZSBjb21tYW5kLjwvcD4KKyAgICAgIDxwPkluIG9yZGVyIHRvIHNraXAgdW5pdCB0ZXN0IGV4ZWN1dGlvbiwgYWRkIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBbY29tbWFuZF0gLURtYXZlbi50ZXN0LnNraXA9dHJ1ZQorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCBpcyBtb3N0IHVzZWZ1bCB3aXRoIHRoZSA8aT5pbnN0YWxsPC9pPiwgCisgICAgICA8aT5wYWNrYWdlPC9pPiBhbmQgPGk+c2l0ZTwvaT4gY29tbWFuZHMuPC9wPgorICAgICAgPHA+V2hlbiBhIHByb2plY3QgaGFzIG1vZHVsZXMgZGVmaW5lZCBpbiB0aGUgUE9NLCB0aGUgY29tbWFuZCBjYW4gYmUgCisgICAgICBwZXJmb3JtZWQgYWdhaW5zdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBwcm9qZWN0IGluc3RlYWQgb2YgdGhlIG1vZHVsZXMgYnkgCisgICAgICBhZGRpbmcgdGhlIGZvbGxvd2luZyBhcmd1bWVudDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIFtjb21tYW5kXSAtLW5vbi1yZWN1cnNpdmUKKyAgICAgIDwvc291cmNlPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iQWNrbm93bGVkZ21lbnRzIj4KKyAgICAgIDxwPk11Y2ggb2YgdGhlIG1hdGVyaWFsIGluIHRoaXMgTWF2ZW4gZ3VpZGUgd2FzIG9yaWdpbmFsbHkgYXV0aG9yZWQgCisgICAgICBieSBTZWFuIEhhcmRtYW4gdW5kZXIgdGhlIHNwb25zb3JzaGlwIG9mIE5BU0EgSmV0IFByb3B1bHNpb24gCisgICAgICBMYWJvcmF0b3J5J3MgUGxhbmV0YXJ5IERhdGEgU3lzdGVtLiA8L3A+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIG5hbWU9IlJlZmVyZW5jZXMiPgorICAgICAgPHA+SGVyZSBpcyBhIGxpc3Qgb2YgTWF2ZW4gcmVzb3VyY2VzOjwvcD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2d1aWRlcy9pbmRleC5odG1sIj5PbmxpbmUgCisgICAgICAgIERvY3VtZW50YXRpb24gSW5kZXg8L2E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS94ZG9jL3VzZXIvYWR2YW5jZWQueG1sIGIvMC4xMC9jdXJhdG9yL3dlYmFwcC9zcmMvc2l0ZS94ZG9jL3VzZXIvYWR2YW5jZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2ZlNzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3hkb2MvdXNlci9hZHZhbmNlZC54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5TZXR0aW5nIFVwIHRoZSBDQVMtQ3VyYXRvcjwvdGl0bGU+CisgICAgPGF1dGhvciBlbWFpbD0id29vbGxhcmRAanBsLm5hc2EuZ292Ij5EYXZpZCBXb29sbGFyZDwvYXV0aG9yPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKyAgICAKKyAgICA8cD5UaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhbiBhZHZhbmNlZCB1c2VyJ3MgZ3VpZGUgZm9yIHRoZSBDQVMtQ3VyYXRvcgorICAgICAgcHJvamVjdC4gVGhlIGdvYWwgb2YgdGhlIGRvY3VtZW50IGlzIHRvIGV4cGxvcmUgYWR2YW5jZWQgdG9waWNzIHN1Y2ggYXMgCisgICAgICBzZWN1cml0eSBzZXR1cCBhbmQgY2hhbmdpbmcgdGhlIGxvb2sgYW5kIGZlZWwgb2YgdGhlIENBUy1DdXJhdG9yCisgICAgICB0byBtYXRjaCB5b3VyIHByb2plY3QuIEZvciBiYXNpYyB0b3BpY3MsIHN1Y2ggYXMgY2hlY2tpbmcgb3V0LCAKKyAgICAgIGJ1aWxkaW5nLCBhbmQgaW5zdGFsbGluZyB0aGUgYmFzZSB2ZXJzaW9uIG9mIHRoZSBDQVMtQ3VyYXRvciwgYXMgd2VsbCAKKyAgICAgIGFzIHBlcmZvcm1pbmcgYmFzaWMgY29uZmlndXJhdGlvbiB0YXNrcywgcGxlYXNlIHNlZSBvdXIgCisgICAgICA8YSBocmVmPSIuLi91c2VyL2Jhc2ljLmh0bWwiPkJhc2ljIEd1aWRlLjwvYT48L3A+CisgICAgCisgICAgPHA+VGhlIHJlbWFpbmRlciBvZiB0aGlzIGd1aWRlIGlzIHNlcGFyYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgCisgICAgICBzZWN0aW9uczo8L3A+CisgICAgICAKKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24xIj5TZWN1cml0eSBTZXR1cDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMiI+TG9vayBhbmQgRmVlbDwvYT48L2xpPgorICAgIDwvdWw+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIAorICAgIDxhIG5hbWU9InNlY3Rpb24xIi8+CisgICAgPHNlY3Rpb24gbmFtZT0iU2VjdXJpdHkgU2V0dXAiPgorICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgIDxzZWN0aW9uIG5hbWU9Ikxvb2sgYW5kIEZlZWwiPgorICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgIAorICA8L2JvZHk+Cis8L2RvY3VtZW50PiAgCmRpZmYgLS1naXQgYS8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3hkb2MvdXNlci9iYXNpYy54bWwgYi8wLjEwL2N1cmF0b3Ivd2ViYXBwL3NyYy9zaXRlL3hkb2MvdXNlci9iYXNpYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxOTVkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvY3VyYXRvci93ZWJhcHAvc3JjL3NpdGUveGRvYy91c2VyL2Jhc2ljLnhtbApAQCAtMCwwICsxLDY5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5TZXR0aW5nIFVwIHRoZSBDQVMtQ3VyYXRvcjwvdGl0bGU+CisgICAgPGF1dGhvciBlbWFpbD0id29vbGxhcmRAanBsLm5hc2EuZ292Ij5EYXZpZCBXb29sbGFyZDwvYXV0aG9yPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKyAgICAgIDxwPlRoaXMgZG9jdW1lbnQgc2VydmVzIGFzIGEgYmFzaWMgdXNlcidzIGd1aWRlIGZvciB0aGUgQ0FTLUN1cmF0b3IKKyAgICAgIHByb2plY3QuIFRoZSBnb2FsIG9mIHRoZSBkb2N1bWVudCBpcyB0byBhbGxvdyB1c2VycyB0byBjaGVjayBvdXQsCisgICAgICBidWlsZCwgYW5kIGluc3RhbGwgdGhlIGJhc2UgdmVyc2lvbiBvZiB0aGUgQ0FTLUN1cmF0b3IsIGFzIHdlbGwKKyAgICAgIGFzIHBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiB0YXNrcy4gRm9yIGFkdmFuY2VkIHRvcGljcywgc3VjaCAKKyAgICAgIGFzIGN1c3RvbWl6aW5nIHRoZSBsb29rIGFuZCBmZWVsIG9mIHRoZSBDQVMtQ3VyYXRvciBmb3IgeW91cgorICAgICAgcHJvamVjdCwgcGxlYXNlIHNlZSBvdXIgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCAKKyAgICAgIEd1aWRlLjwvYT48L3A+CisgICAgICAKKyAgICAgIDxwPlRoZSByZW1haW5kZXIgb2YgdGhpcyBndWlkZSBpcyBzZXBhcmF0ZWQgaW50byB0aGUgZm9sbG93aW5nIAorICAgICAgc2VjdGlvbnM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24xIj5Eb3dubG9hZCBhbmQgQnVpbGQ8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMiI+VG9tY2F0IERlcGxveW1lbnQ8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMyI+U3RhZ2luZyBBcmVhIFNldHVwPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjQiPkV4dHJhY3RvciBTZXR1cDwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb241Ij5GaWxlIE1hbmFnZXIgQ29uZmlndXJhdGlvbjwvYT48L2xpPgorICAgICAgPC91bD4KKyAgICAgIAorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8YSBuYW1lPSJzZWN0aW9uMSIvPgorICAgIDxzZWN0aW9uIG5hbWU9IkRvd25sb2FkIEFuZCBCdWlsZCI+CisgICAgICA8cD5UaGUgbW9zdCByZWNlbnQgQ0FTLUN1cmF0b3IgcHJvamVjdCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tCisgICAgICB0aGUgT09EVCA8YSBocmVmPSJodHRwOi8vb29kdC5hcGFjaGUub3JnLyI+d2Vic2l0ZTwvYT4gb3IgaXQgY2FuCisgICAgICBiZSBjaGVja2VkIG91dCBmcm9tIHRoZSBPT0RUIHJlcG9zaXRvcnkgdXNpbmcgU3VidmVyc2lvbi4gVGhlIAorICAgICAgV2UgcmVjb21tZW5kIGNoZWNraW5nCisgICAgICBvdXQgdGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uICh2MS4wLjAgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZykuCisgICAgICA8L3A+CisgICAgICAKKyAgICAgIDxwPk1hdmVuIGlzIHRoZSBidWlsZCBtYW5hZ2VtZW50IHN5c3RlbSB1c2VkIGZvciBPT0RUIHByb2plY3RzLiBXZQorICAgICAgY3VycmVudGx5IHN1cHBvcnQgTWF2ZW4gMi4wIGFuZCBsYXRlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gCisgICAgICBNYXZlbiwgc2VlIG91ciA8YSBocmVmPSIuLi9kZXZlbG9wbWVudC9tYXZlbi5odG1sIj5NYXZlbiBHdWlkZS48L2E+CisgICAgICA8L3A+CisgICAgICAKKyAgICAgIDxwPkFzc3VtaW5nIGEgKm5peC1saWtlIGVudmlyb25tZW50LCB3aXRoIGJvdGggTWF2ZW4gYW5kIFN1YnZlcnNpb24gCisgICAgICBjbGllbnRzIGluc3RhbGxlZCBhbmQgb24geW91ciBwYXRoLCBhbiBleGFtcGxlIG9mIHRoZSBjaGVja291dCBhbmQgCisgICAgICBidWlsZCBwcm9jZXNzIGlzIHByZXNlbnRlZCBiZWxvdzo8L3A+CisgICAgICAKKyAgICAgIDxzb3VyY2U+Cis+IG1rZGlyIC91c3IvbG9jYWwvc3JjCis+IGNkIC91c3IvbG9jYWwvc3JjCis+IHN2biBjaGVja291dCBodHRwOi8vb29kdC9yZXBvL2Nhcy1jdXJhdG9yL3RhZ3MvMV8wXzBfcmVsZWFzZSBcCisgICAgY2FzLWN1cmF0b3ItdjEuMC4wICAgICAgIAorICAgICAgPC9zb3VyY2U+CisgICAgICAgIAorICAgICAgPHA+QWZ0ZXIgdGhlIFN1YnZlcnNpb24gY29tbWFuZCBjb21wbGV0ZXMsIHlvdSB3aWxsIGhhdmUgdGhlIHNvdXJjZQorICAgICAgZm9yIHRoZSBDQVMtQ3VyYXRvciBwcm9qZWN0IGluIHRoZSA8Y29kZT4vdXNyL2xvY2FsL3NyYy9jYXMtY3VyYXRvci12MS4wLjA8L2NvZGU+CisgICAgICBkaXJlY3RvcnkuPC9wPgorICAgICAgCisgICAgICA8cD5JbiBvcmRlciB0byBidWlsZCB0aGUgV0FSIChXZWIgQVJjaGl2ZSkgZmlsZSBmcm9tIHRoaXMgc291cmNlLAorICAgICAgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kczo8L3A+CisgICAgICAKKyAgICAgIDxzb3VyY2U+Cis+IGNkIC91c3IvbG9jYWwvc3JjL2Nhcy1jdXJhdG9yLXYxLjAuMAorPiBtdm4gcGFja2FnZSAgICAKKyAgICAgIDwvc291cmNlPiAgIAorICAgICAgCisgICAgICA8cD5PbmNlIHRoZSBNYXZlbiBjb21tYW5kIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHlvdSBzaG91bGQgaGF2ZSBhIAorICAgICAgPGNvZGU+dGFyZ2V0PC9jb2RlPiBkaXJlY3RvcnkgdW5kZXIgPGNvZGU+Y2FzLWN1cmF0b3ItdjEuMC4wLzwvY29kZT4uIFRoZSAKKyAgICAgIFdBUiBmaWxlLCBjYWxsZWQgPGNvZGU+Y2FzLWN1cmF0b3ItMS4wLjAud2FyPC9jb2RlPiwgY2FuIGJlIGZvdW5kIHVuZGVyIAorICAgICAgPGNvZGU+dGFyZ2V0LzwvY29kZT4uPC9wPgorICAgICAgCisgICAgICA8cD5JbiB0aGUgbmV4dCBzZWN0aW9uLCB3ZSB3aWxsIGRpc2N1c3MgZGVwbG95aW5nIHRoaXMgV0FSIGZpbGUgdG8KKyAgICAgIGEgVG9tY2F0IGluc3RhbmNlLjwvcD4gICAKKyAgICAgIAorICAgIDwvc2VjdGlvbj4gCisgICAgCisgICAgPGEgbmFtZT0ic2VjdGlvbjIiLz4KKyAgICA8c2VjdGlvbiBuYW1lPSJUb21jYXQgRGVwbG95bWVudCI+CisgICAgICA8cD5PbmNlIHlvdSBoYXZlIGJ1aWx0IGEgd2FyIGZpbGUsIGl0IGlzIG5lY2Vzc2FyeSB0byBkZXBsb3kgdGhlIHdlYgorICAgICAgYXBwbGljYXRpb24gdXNpbmcgYSBzZXJ2bGV0IGNvbnRhaW5lciBzdWNoIGFzIAorICAgICAgPGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLyI+VG9tY2F0PC9hPiBvciAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9ydGJheS5vcmcvamV0dHkvIj5KZXR0eTwvYT4uIEZvciB0aGUgcHVycG9zZXMgb2YgCisgICAgICB0aGlzIGd1aWRlLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHlvdSBhcmUgdXNpbmcgVG9tY2F0LiBUb21jYXQgY2FuIGJlCisgICAgICBpbnN0YWxsZWQgaW4gYSB1c2VyIGFjY291bnQgb3IgYXQgdGhlIHN5c3RlbSBsZXZlbC4gVGhlIGJhc2UgY29uZmlndXJhdGlvbgorICAgICAgbGF1bmNoZXMgYSB3ZWIgc2VydmVyIG9uIHBvcnQgODA4MC4gWW91IGNhbiBsZWFybiBtb3JlIGFib3V0IFRvbWNhdCBhbmQgCisgICAgICBkb3dubG9hZCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGVpciAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iPndlYnNpdGU8L2E+LiBOT1RFOiBUaGVyZSBhcmUgdHdvCisgICAgICBjb25jdXJyZW50IHZlcnNpb25zIG9mIFRvbWNhdDogNS41LlggYW5kIDYuMC5YLiBDQVMtQ3VyYXRvciBpcyBjb21wYXRpYmxlCisgICAgICB3aXRoIGJvdGggdmVyc2lvbnMuPC9wPgorICAgICAgCisgICAgICA8cD5XZSB3aWxsIGFzc3VtZSB0aGF0IHlvdSBoYXZlIGRvd25sb2FkZWQgVG9tY2F0IHRvIGFuIGFwcHJvcHJpYXRlIAorICAgICAgZGlyZWN0b3J5LCBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYW5kIGhhdmUgdGFrZW4gdGhlIAorICAgICAgYXBwcm9wcmlhdGUgc3RlcHMgdG8gYWxsb3cgYWNjZXNzIHRvIHBvcnQgODA4MC4gU2VlIHlvdXIgU3lzdGVtIAorICAgICAgQWRtaW5pc3RyYXRvciBpcyB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGFib3V0IGZpcmV3YWxsIHNlY3VyaXR5IGFuZCBwb2xpY3kKKyAgICAgIHJlZ2FyZGluZyBwb3J0IGFjY2Vzcy4gV2Ugd2lsbCBmdXJ0aGVyIGFzc3VtZSB0aGF0IHlvdSBoYXZlIHNldCBhbiAKKyAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlLCA8Y29kZT4kVE9NQ0FUX0hPTUU8L2NvZGU+LCB0byB0aGUgYmFzZSBkaXJlY3RvcnkKKyAgICAgIG9mIHlvdXIgVG9tY2F0IGluc3RhbGxhdGlvbi48L3A+CisgICAgICAKKyAgICAgIDxwPlRoZXJlIGFyZSBhIG51bWJlciBvZiB3YXlzIHRvIGRlcGxveSBhIFdBUiBmaWxlIHRvIFRvbWNhdCwgdGhvdWdoIHdlCisgICAgICByZWNvbW1lbmQgdXNpbmcgYSBjb250ZXh0IGZpbGUuIEEgY29udGV4dCBmaWxlIGlzIGEgWE1MIGZpbGUgdGhhdCBwcm92aWRlcworICAgICAgVG9tY2F0IHdpdGggImNvbnRleHQiIGZvciB1c2luZyBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLiBJbiBvcmRlciB0byAKKyAgICAgIGNyZWF0ZSBhIGNvbnRleHQgZmlsZSBmb3IgdGhlIENBUy1DdXJhdG9yLCBvcGVuIHlvdXIgZmF2b3JpdGUgdGV4dCBlZGl0b3IKKyAgICAgIGFuZCBjb3B5IGFuZCBwYXN0ZSB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgIAorICAgICAgPHNvdXJjZT48IVtDREFUQVs8Q29udGV4dCBwYXRoPSIvbXktY3VyYXRvciIKK2RvY0Jhc2U9Ii91c3IvbG9jYWwvc3JjL2Nhcy1jdXJhdG9yLXYxLjAuMC90YXJnZXQvY2FzLWN1cmF0b3ItMS4wLjAud2FyIj4gIAorICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5zZWN1cml0eS5zc28uaW1wbENsYXNzIgorICAgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5zZWN1cml0eS5zc28uRHVtbXlJbXBsIi8+CisgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnByb2plY3ROYW1lIgorICAgICAgICB2YWx1ZT0iTXkgUHJvamVjdCIvPgorPC9Db250ZXh0PiAgICAKKyAgICAgIF1dPjwvc291cmNlPgorICAgICAgIAorICAgICAgPHA+U2F2ZSB0aGUgY29udGV4dCBmaWxlIHRvIAorICAgICAgPGNvZGU+JFRPTUNBVF9IT01FL2NvbmYvQ2F0YWxpbmEvbG9jYWxob3N0L215LWN1cmF0b3IueG1sPC9jb2RlPi4gTm93IHlvdSAKKyAgICAgIGNhbiBwb2ludCBhIHdlYiBicm93c2VyIHRvIDxhIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teS1jdXJhdG9yLyI+CisgICAgICBodHRwOi8vbG9jYWxob3N0OjgwODAvbXktY3VyYXRvcjwvYT4gYW5kIHlvdSBzaG91bGQgc2VlIGEgbG9nLWluIHNjcmVlbgorICAgICAgZm9yIENBUy1DdXJhdG9yLiA8ZW0+Tm90ZTwvZW0+OiBUb21jYXQgd2lsbCBvbmx5IHVzZSB0aGUgcGF0aCBhdHRyaWJ1dGUgCisgICAgICBpZiB0aGUgY29udGV4dCBpcyBkZWZpbmVkIGluIHNlcnZlci54bWwuIFRvbWNhdCB1c2VzIHRoZSB4bWwgZmlsZSBuYW1lIAorICAgICAgaW5zdGVhZC4gU2VlIHRoZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNS41LWRvYy9jb25maWcvY29udGV4dC5odG1sIiBjbGFzcz0iZXh0ZXJuYWxMaW5rIj4gCisgICAgICBUb21jYXQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb248L3A+IAorICAgICAgCisgICAgICA8aW1nIHNyYz0iLi4vaW1hZ2VzL2Jhc2ljX2xvZ2luLmpwZyIvPgorICAgICAgCisgICAgICA8cD5UaGUgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5pbXBsQ2xhc3M8L2NvZGU+IHBhcmFtZXRlcgorICAgICAgdGhhdCB3ZSBzZXQgaW4gdGhlIGNvbnRleHQgZmlsZSBjb25maWd1cmVzIHRoZSBDQVMtQ3VyYXRvciBmb3IgYSAiZHVtbXkiCisgICAgICBsb2ctaW4gdG8gaXRzIFNpbmdsZSBTaWduIE9uIHNlcnZpY2UuIEJlY2F1c2Ugb2YgdGhpcywgd2UgYXJlIGFibGUgdG8gCisgICAgICBsb2cgaW50byB0aGUgd2ViIGFwcGxpY2F0aW9uIHdpdGggYSBibGFuayB1c2VyIG5hbWUgYW5kIGEgYmxhbmsgcGFzc3dvcmQuIAorICAgICAgRm9yIGhlbHAgaW4gaW1wbGVtZW50aW5nIHNlY3VyaXR5IHdpdGggQ0FTLUN1cmF0b3IsIHNlZSBvdXIgCisgICAgICA8YSBocmVmPSIuLi91c2VyL2FkdmFuY2VkLmh0bWwiPkFkdmFuY2VkIEd1aWRlLjwvYT48L3A+CisgICAgICAKKyAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvYmFzaWNfcGFnZS5qcGciLz4KKyAgICAgIAorICAgICAgPHA+SW4gdGhlIG5leHQgc2VjdGlvbnMsIHdlIHdpbGwgdGFsayBhYm91dCBzZXR0aW5nIHVwIHN0YWdpbmcgYXJlYXMsIAorICAgICAgbWV0YWRhdGEgZXh0cmFjdG9ycywgYW5kIGxhdW5jaGluZyBhIENBUy1GaWxlbWdyIGluc3RhbmNlIGludG8gd2hpY2ggCisgICAgICBDQVMtQ3VyYXRvciB3aWxsIGluZ2VzdCBkYXRhIHByb2R1Y3RzLjwvcD4KKyAgICAgICAgCisgICAgPC9zZWN0aW9uPiAKKyAgICAKKyAgICA8YSBuYW1lPSJzZWN0aW9uMyIvPgorICAgIDxzZWN0aW9uIG5hbWU9IlN0YWdpbmcgQXJlYSBTZXR1cCI+CisgICAgICA8cD5TdGFnaW5nIGFyZWFzIGFyZSBkaXJlY3RvcmllcyBvbiB5b3VyIGxvY2FsIG1hY2hpbmUgdGhhdCBob2xkIGRhdGEgCisgICAgICBwcm9kdWN0cyB0byBiZSBjdXJhdGVkLiBUaGUgc3RhZ2luZyBhcmVhIGNhbiBoYXZlIGFyYml0cmFyeSBzdHJ1Y3R1cmUuIAorICAgICAgVGhlIG9ubHkgcmVxdWlyZW1lbnQgdGhhdCBDQVMtQ3VyYXRvciBoYXMgd2l0aCByZWdhcmQgdG8gdGhpcyBzdHJ1Y3R1cmUgCisgICAgICBpcyB0aGF0IHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGJlIG1pcnJvcmVkIGluIGEgbWV0YWRhdGEgZ2VuZXJhdGlvbgorICAgICAgYXJlYS4gVGhpcyBnZW5lcmF0aW9uIGFyZWEgaXMgdXNlZCBieSBDQVMtQ3VyYXRvciB0byBjcmVhdGUgbWV0YWRhdGEKKyAgICAgIGZpbGVzIHRvIGFzc29jaWF0ZSB3aXRoIGRhdGEgcHJvZHVjdHMuPC9wPgorICAgICAgCisgICAgICA8cD5Gb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYSBwcm9kdWN0LCBzYXkgYW4gTVAzIGZpbGUgb2YgQmFjaCdzIDxpPkRlciAKKyAgICAgIEdlaXN0IGhpbGZ0IHVuc3JlciBTY2h3YWNoaGVpdCBhdWY8L2k+LCBpbiB0aGUgc3RhZ2luZyBhcmVhIGF0OjwvcD4KKyAgICAgIAorICAgICAgPHNvdXJjZT4gCitbc3RhZ2luZ19hcmVhX2Jhc2VdL2F1ZGlvL2NsYXNzaWNhbC9iYWNoL0Rlcl9HZWlzdF9oaWxmdC5tcDMgICAKKyAgICAgIDwvc291cmNlPgorICAgICAgCisgICAgICA8cD5UaGVuIHRoZSBDQVMtQ3VyYXRvciB3aWxsIGdlbmVyYXRlIGFsbCBhc3NvY2lhdGVkIG1ldGFkYXRhIHByb2R1Y3RzCisgICAgICBpbiA8Y29kZT5bbWV0YWRhdGFfZ2VuX2Jhc2VdL2F1ZGlvL2NsYXNzaWNhbC9iYWNoLzwvY29kZT4uPC9wPgorICAgICAgCisgICAgICA8cD5JbiBvcmRlciB0byBzZXQgdXAgdGhlIHN0YWdpbmcgYXJlYSBhbmQgdGhlIG1ldGFkYXRhIGdlbmVyYXRpb24gYXJlYSwKKyAgICAgIHdlIGZpcnN0IGNyZWF0ZSBiYXNlIGRpcmVjdG9yaWVzIGZvciBlYWNoLCBzaG93biBiZWxvdzo8L3A+CisgICAgICAKKyAgICAgIDxzb3VyY2U+Cis+IG1rZGlyIC91c3IvbG9jYWwvc3RhZ2luZworPiBta2RpciAvdXNyL2xvY2FsL3N0YWdpbmcvcHJvZHVjdHMKKz4gbWtkaXIgL3Vzci9sb2NhbC9zdGFnaW5nL21ldGFkYXRhCisgICAgICA8L3NvdXJjZT4KKyAgICAgIAorICAgICAgPHA+TmV4dCwgd2Ugd2lsbCBzZXQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGluIHRoZSBDQVMtQ3VyYXRvciBjb250ZXh0IGZpbGU6PC9wPgorICAgICAgCis8c291cmNlPjwhW0NEQVRBWzxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLnN0YWdpbmdBcmVhUGF0aCIKKyAgICAgICAgdmFsdWU9Ii91c3IvbG9jYWwvc3RhZ2luZy9wcm9kdWN0cyIvPgorICAgIAorPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0QXJlYVBhdGgiCisgICAgICAgIHZhbHVlPSIvdXNyL2xvY2FsL3N0YWdpbmcvbWV0YWRhdGEiLz4KKyAgICAKKzxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLm1ldEV4dGVuc2lvbiIKKyAgICAgICAgdmFsdWU9Ii5tZXQiLz5dXT48L3NvdXJjZT4KKyAgICAgIAorICAgIDxwPlRoZSA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3Iuc3RhZ2luZ0FyZWFQYXRoPC9jb2RlPiBwYXJhbWV0ZXIgc2hvdWxkIAorICAgIGJlIHNldCB0byB0aGUgcHJvZHVjdCBzdGFnaW5nIGFyZWEgYW5kIHRoZSAKKyAgICA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0QXJlYVBhdGg8L2NvZGU+IHNob3VsZCBiZSBzZXQgdG8gdGhlIG1ldGVkYXRhCisgICAgZ2VuZXJhdGlvbiBhcmVhLiBBZGRpdGlvbmFsbHksIHdlIHNwZWNpZmllZCB0aGUgcGFyYW1ldGVyIAorICAgIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRFeHRlbnNpb248L2NvZGU+IHRvIGJlIDxjb2RlPi5tZXQ8L2NvZGU+LiAKKyAgICBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGV4dGVuc2lvbiBmb3IgYWxsIG9mIHRoZSBtZXRhZGF0YSBmaWxlcyBwcm9kdWNlZCBpbgorICAgIHRoZSBtZXRhZGF0YSBnZW5lcmF0aW9uIGFyZWEuPC9wPgorICAgIAorICAgIDxwPkZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMsIHdlIHdpbGwgbG9hZCBhbiBtcDMgZmlsZSBpbnRvIHRoZSBzdGFnaW5nIGFyZWE6PC9wPgorICAgIAorICAgIDxzb3VyY2U+Cis+IG1rZGlyIC91c3IvbG9jYWwvc3RhZ2luZy9wcm9kdWN0cy9tcDMKKz4gY2QgL3Vzci9sb2NhbC9zdGFnaW5nL3Byb2R1Y3RzL21wMworPiBjdXJsIC1MTyBodHRwOi8vb29kdC5hcGFjaGUub3JnL2NvbXBvbmVudHMvbWF2ZW4vY3VyYXRvci9tZWRpYS9CYWNoLVN1aXRlTm8yLm1wMworICAgIDwvc291cmNlPgorICAgIAorICAgIDxwPldlIHNob3VsZCBub3RlIHRoYXQgdGhpcyBtdXNpYyBmaWxlIHdhcyBwcm9kdWNlZCBieSB0aGUgCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5mdWxkYWVyLXN5bXBob25pc2NoZXMtb3JjaGVzdGVyLmRlLyI+RnVsZGEgU3ltcGhvbmljIAorICAgIE9yY2hlc3RyYTwvYT4gYW5kIGlzIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVmZi5vcmcvYWJvdXQvIj5FRkYgT3BlbiBBdWRpbyBMaWNlbnNlPC9hPiwgdmVyc2lvbiAxLjAuIFdlIAorICAgIGhhdmUgZWRpdGVkIHRoZSBJRDMgdGFnIG9mIHRoaXMgZmlsZSAoaW4gb3JkZXIgdG8gbWFrZSB0aGUgbGF0ZXIgbWV0YWRhdGEgZXh0cmFjdGlvbgorICAgIGV4YW1wbGUgbW9yZSBpbnRlcmVzdGluZyksIGJ1dCBvcmlnaW5hbCBhdXRob3JzaGlwIGlzIHJldGFpbmVkLiBOb3cgYmFjayB0byB0aGUgCisgICAgdHV0b3JpYWwuLi48L3A+CisgICAgCisgICAgPHA+UmVtZW1iZXIgdGhhdCB3ZSBuZWVkIHRvIG1pcnJvciB0aGUgcHJvZHVjdCBzdGFnaW5nIGFyZWEgYW5kIHRoZSBtZXRhZGF0YSAKKyAgICBnZW5lcmF0aW9uIGFyZWEsIHNvIHdpbGwgYWxzbyBuZWVkIHRvIGNyZWF0ZSB0aGUgbWF0Y2hpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSAKKyAgICB0aGVyZTo8L3A+CisgICAgCisgICAgPHNvdXJjZT4KKz4gbWtkaXIgL3Vzci9sb2NhbC9zdGFnaW5nL21ldGFkYXRhL21wMworICAgIDwvc291cmNlPgorICAgIAorICAgIDxwPk9uY2UgeW91IHJlc3RhcnQgVG9tY2F0LCB0aGUgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIHRvIHRoZSBjb250ZXh0IGZpbGUgd2lsbCBiZQorICAgIHVzZWQuIFRoZSBzdGFnaW5nIGFyZWEgd2lsbCBub3cgYmUgc2V0IHRvIDxjb2RlPi91c3IvbG9jYWwvc3RhZ2luZy9wcm9kdWN0czwvY29kZT4uCisgICAgU2VlIHRoZSBzY3JlZW5zaG90IGJlbG93OjwvcD4KKyAKKyAgICA8aW1nIHNyYz0iLi4vaW1hZ2VzL2Jhc2ljX3N0YWdpbmcuanBnIi8+ICAgIAorICAgIAorICAgIDxwPkRvdWJsZS1jbGlja2luZyBvbiAibXAzIiwgd2UgY2FuIHNlZSB0aGF0IHRoZSBzdGFnaW5nIGFyZWEgcGF0aCBpbiB0aGUgdG9wIGxlZnQgCisgICAgaXMgbm93IDxjb2RlPi9tcDM8L2NvZGU+IGFuZCA8Y29kZT5CYWNoLVN1aXRlTm8yLm1wMzwvY29kZT4gY2FuIGJlIHNlZW4gdGhlIG1haW4gCisgICAgbGVmdCBzdGFnaW5nIHBhbmUuIEZvciB0aGUgdGltZS1iZWluZywgdGhlcmUgaXMgbm8gbWV0YWRhdGEgZGV0ZWN0ZWQgKGFzIHJlcG9ydGVkIAorICAgIGluIHRoZSBtYWluIHJpZ2h0IHN0YWdpbmcgcGFuZSksIGJ1dCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB3ZSB3aWxsIGJlIHNldHRpbmcgdXAgYSAKKyAgICBiYXNpYywgY29tbWFuZC1saW5lIG1ldGFkYXRhIGV4dHJhY3RvciBpbiBvcmRlciB0byBzaG93IGhvdyBleHRyYWN0b3JzIGFyZSAKKyAgICBpbnRlZ3JhdGVkIGludG8gQ0FTLUN1cmF0b3IuPC9wPgorICAgICAgICAgIAorICAgIDwvc2VjdGlvbj4gCisgICAgCisgICAgPGEgbmFtZT0ic2VjdGlvbjQiLz4KKyAgICA8c2VjdGlvbiBuYW1lPSJFeHRyYWN0b3IgU2V0dXAiPgorICAgIDxwPlRoZSBDQVMtQ3VyYXRvciB1c2VzIGFuY2lsbGFyeSBwcm9ncmFtcyBjYWxsZWQgbWV0YWRhdGEgZXh0cmFjdG9ycyB0byBwcm9kdWNlCisgICAgdGhlIG1ldGFkYXRhIHRoYXQgaXQgYXNzb2NpYXRlcyB3aXRoIHByb2R1Y3RzLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IG1ldGFkYXRhIAorICAgIGV4dHJhY3RvcnMgY2FuIGJlIGZvdW5kIGluIHRoZSAKKyAgICA8YSBocmVmPSIuLi8uLi9tZXRhZGF0YS91c2VyL2V4dHJhY3RvckJhc2ljcy5odG1sIj4KKyAgICBFeHRyYWN0b3IgQmFzaWNzPC9hPiBVc2VyJ3MgR3VpZGUuPC9wPgorICAgIAorICAgIDxwPkxpa2UgdGhlIHN0YWdpbmcgYXJlYSwgd2UgZmlyc3QgbmVlZCB0byBzZXQgdXAgYW4gYXJlYSBpbiB0aGUgZmlsZSBzeXN0ZW0gZm9yCisgICAgbWV0YWRhdGEgZXh0cmFjdG9ycy4gV2Ugd2lsbCBjYWxsIHRoaXMgZGlyZWN0b3J5IDxjb2RlPmV4dHJhY3RvcnM8L2NvZGU+OjwvcD4KKyAgICAKKyAgICA8c291cmNlPgorID4gbWtkaXIgL3Vzci9sb2NhbC9leHRyYWN0b3JzICAgCisgICAgPC9zb3VyY2U+IAorICAgIAorICAgIDxwPkluIG9yZGVyIHRvIHJlZ2lzdGVyIHRoZSBtZXRhZGF0YSBleHRyYWN0b3IgcGF0aCB3aXRoIHRoZSBDQVMtQ3VyYXRvciwgd2Ugd2lsbCAKKyAgICBuZWVkIHRvIGFkZCBhbm90aGVyIHBhcmFtZXRlciB0byB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgY29udGV4dCBmaWxlLiBBZGQgdGhlCisgICAgZm9sbG93aW5nIHBhcmFtZXRlcjo8L3A+CisgICAgCis8c291cmNlPjwhW0NEQVRBWzxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLm1ldEV4dHJhY3RvckNvbmYudXBsb2FkUGF0aCIKKwkJdmFsdWU9Ii91c3IvbG9jYWwvZXh0cmFjdG9ycyIgLz4gICAgCisgICAgXV0+PC9zb3VyY2U+CisgICAgCisgICAgPHA+V2UgYXJlIGdvaW5nIHRvIG1ha2UgYSBtZXRhZGF0YSBleHRyYWN0b3IgdGhhdCB3aWxsIGV4dHJhY3RvciBJRDMgdGFnIG1ldGFkYXRhLCAKKyAgICBzdWNoIGFzIGF1dGhvciwgdGl0bGUsIHJlc291cmNlIHR5cGUsIGV0YyBmcm9tIG1wM3MuIEFzIGEgZmlyc3Qgc3RlcCwgd2Ugd2lsbCBjcmVhdGUgCisgICAgYSBkaXJlY3RvcnkgZm9yIHRoZSBuZXcgZXh0cmFjdG9yLiBUaGUgbmFtZSBvZiB0aGlzIGRpcmVjdG9yeSBpcyBpbXBvcnRhbnQsIGJlY2F1c2UKKyAgICBDQVMtQ3VyYXRvciB3aWxsIHVzZSB0aGUgZGlyZWN0b3J5IG5hbWUgdG8gcmVnaXN0ZXIgdGhlIGV4dHJhY3Rvci4gV2Ugd2lsbCBuYW1lIHRoaXMKKyAgICBkaXJlY3RvcnkgPGNvZGU+bXAzZXh0cmFjdG9yPC9jb2RlPjwvcD4KKyAgICAKKzxzb3VyY2U+Cis+IG1rZGlyIC91c3IvbG9jYWwvZXh0cmFjdG9ycy9tcDNleHRyYWN0b3IKKzwvc291cmNlPgorCisgICAgPHA+V2hpbGUgd2UgY291bGQgd3JpdGUgYSBjdXN0b20gZXh0cmFjdG9yIGluIEphdmEgZm9yIHRoZSBDYXMtQ3VyYXRvciwgdGhlcmUgYXJlIAorICAgIG11bHRpcGxlIGV4aXN0aW5nIHNvZnR3YXJlIHBhY2thZ2VzIHRoYXQgcmVhZCBtcDMgSUQzIHRhZ3MuIEZvciB0aGVzZSBzaXR1YXRpb25zLAorICAgIHdoZXJlIGFuIGV4dGVybmFsLCBjb21tYW5kLWxpbmUgZXh0cmFjdG9yIGV4aXN0cywgd2UgaGF2ZSBkZXZlbG9wZWQgdGhlIAorICAgIDxjb2RlPkV4dGVybk1ldEV4dHJhY3RvcjwvY29kZT4gY2xhc3MgaW4gdGhlIENBUy1NZXRhZGF0YSBwcm9qZWN0LjwvcD4KKyAgICAKKyAgICA8cD5Gb3IgdGhpcyBleGFtcGxlLCB3ZSBhcmUgZ29pbmcgdG8gbGVhdmVyYWdlIGFuIGV4aXN0aW5nLCBvcGVuIHNvdXJjZSBtaW1lLXR5cGUKKyAgICBkZXRlY3RvciB3aXRoIHRleHQgYW5kIG1ldGFkYXRhIHBhcnNpbmcgY2FwYWJpbGl0aWVzIGNhbGxlZCAKKyAgICA8YSBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmcvdGlrYS8iPkFwYWNoZSBUaWthPC9hPi4gVGlrYSBwYXJzZXMgYSBudW1iZXIgb2YgCisgICAgZGlmZmVyZW50IGNvbW1vbiBkYXRhIGZvcm1hdHMsIGluY2x1ZGluZyBhIG51bWJlciBvZiBhdWRpbyBmb3JtYXRzIGxpa2UgbXAzLgorICAgIEknbGwgbGVhdmUgaXQgdG8gdGhlIHJlYWRlciBvZiB0aGlzIGd1aWRlIHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsIFRpa2EuIFdlCisgICAgd2lsbCBhc3N1bWUgdGhhdCB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2YgdGhlIHRpa2EtYXBwIGphciBpcyBpbiB0aGUgCisgICAgPGNvZGU+bXAzZXh0cmFjdG9yPC9jb2RlPiBkaXJlY3RvcnkuPC9wPgorICAgIAorICAgIDxwPldlIGhhdmUgYSBsaXR0bGUgd29yayB0byBkbyB0byBjb252ZXJ0IHRoZSBvdXRwdXQgb2YgVGlrYSBpbnRvIGEgbWV0YWRhdGEgZmlsZQorICAgIGNvbXBhdGlibGUgd2l0aCBDQVMtQ3VyYXRvci4gQnkgZGVmYXVsdCwgVGlrYSBwcm9kdWNlcyBtZXRhZGF0YSBpbiBhICJrZXk6IHZhbHVlIgorICAgIGZvcm1hdCBhcyBzaG93biBpbiB0aGUgY29tbWFuZC1saW5lIHNlc3Npb24gYmVsb3c6PC9wPgorICAgIAorPHNvdXJjZT48IVtDREFUQVsKKz4gamF2YSAtamFyIHRpa2EtYXBwLTAuNS1TTkFQU0hPVC5qYXIgLW0gXAorICAgIC91c3IvbG9jYWwvc3RhZ2luZy9wcm9kdWN0cy9tcDMvQmFjaC1TdWl0ZU5vMi5tcDMKK0F1dGhvcjogSm9oYW5uIFNlYmFzdGlhbiBCYWNoCitDb250ZW50LVR5cGU6IGF1ZGlvL21wZWcKK3Jlc291cmNlTmFtZTogQmFjaC1TdWl0ZU5vMi5tcDMKK3RpdGxlOiBCYWNoIENlbGxvIFN1aXRlIE5vIDIgIAorICAgIF1dPjwvc291cmNlPiAgIAorICAgIAorICAgIDxwPldpdGggYSBsaXR0bGUgQVdLIG1hZ2ljLCB3ZSBjYW4gY29udmVydCB0aGlzIG91dHB1dCB0byB0aGUgQ2FzLU1ldGFkYXRhIHhtbAorICAgIGZvcm1hdDo8L3A+CisgICAgPCEtLSBGSVhNRTogY2hhbmdlIG5hbWVzcGFjZSBVUkk/IC0tPgorPHNvdXJjZT48IVtDREFUQVsKKz4gamF2YSAtamFyIHRpa2EtYXBwLTAuNS1TTkFQU0hPVC5qYXIgLW0gXAorICAvdXNyL2xvY2FsL3N0YWdpbmcvcHJvZHVjdHMvbXAzL0JhY2gtU3VpdGVObzIubXAzIHwgYXdrIC1GOlwKKyAgJ0JFR0lOIFwKKyAge3ByaW50ICI8Y2FzOm1ldGFkYXRhIHhtbG5zOmNhcz1cImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzXCI+In1cCisgIHtwcmludCAiPGtleXZhbD48a2V5PiIkMSI8L2tleT48dmFsPiJzdWJzdHIoJDIsMikiPC92YWw+PC9rZXl2YWw+In1cCisgIEVORCB7cHJpbnQgIjwvY2FzOm1ldGFkYXRhPiJ9JworPGNhczptZXRhZGF0YSB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKzxrZXl2YWw+PGtleT5BdXRob3I8L2tleT48dmFsPkpvaGFubiBTZWJhc3RpYW4gQmFjaDwvdmFsPjwva2V5dmFsPgorPGtleXZhbD48a2V5PkNvbnRlbnQtVHlwZTwva2V5Pjx2YWw+YXVkaW8vbXBlZzwvdmFsPjwva2V5dmFsPgorPGtleXZhbD48a2V5PnJlc291cmNlTmFtZTwva2V5Pjx2YWw+QmFjaC1TdWl0ZU5vMi5tcDM8L3ZhbD48L2tleXZhbD4KKzxrZXl2YWw+PGtleT50aXRsZTwva2V5Pjx2YWw+QmFjaCBDZWxsbyBTdWl0ZSBObyAyPC92YWw+PC9rZXl2YWw+Cis8L2NhczptZXRhZGF0YT4gICAgICAgICAgICAKKyAgICBdXT48L3NvdXJjZT4gCisgICAgCisgICAgPHA+Q29vbCBhcyBhIG9uZSBsaW5lIGZvcm1hdCB0cmFuc2xhdGVyIGlzLCB3ZSBhcmUgYWN0dWFsbHkgZ29pbmcgdG8gaGF2ZSB0bworICAgIGRvIGEgbGl0dGxlIG1vcmUgd29yayB0byBjcmVhdGUgYW4gZXh0cmFjdG9yIGNhcGFibGUgb2YgcHJvZHVjaW5nIG1ldGFkYXRhCisgICAgZm9yIENBUy1DdXJhdG9yLiBBIHJlcXVpcmVtZW50IGZvciBtZXRhZGF0YSBleHRyYWN0b3JzIHRoYXQgYXJlIHRvIGJlIGludGVncmF0ZWQKKyAgICB3aXRoIENBUy1DdXJhdG9yIGlzIHRoYXQgdGhleSBwcm9kdWN0IHRocmVlIHBpZWNlcyBvZiBtZXRhZGF0YTo8L3A+CisgICAgCisgICAgPHVsPgorICAgICAgPGxpPlByb2R1Y3RUeXBlPC9saT4KKyAgICAgIDxsaT5GaWxlTG9jYXRpb248L2xpPgorICAgICAgPGxpPkZpbGVuYW1lPC9saT4KKyAgICA8L3VsPiAKKyAgICAKKyAgICA8cD5XZSBzaG91bGQgbm90ZSB0aGF0IHRoaXMgaXMgTk9UIGEgZ2VuZXJhbCByZXF1aXJlbWVudCBvZiBhbGwgbWV0YWRhdGEgCisgICAgZXh0cmFjdG9ycywgYnV0IGEgcmFtaWZpY2F0aW9uIG9mIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIENBUy1DdXJhdG9yLgorICAgIEluIG9yZGVyIHRvIHByb2R1Y3QgdGhpcyBleHRyYSBtZXRhZGF0YSwgd2Ugd2lsbCBkZXZlbG9wIGEgc21hbGwgUHl0aG9uCisgICAgc2NyaXB0OjwvcD4gCisKKzxzb3VyY2U+PCFbQ0RBVEFbCisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworZnVsbFBhdGggPSBzeXMuYXJndlsxXQorcGF0aEVsZW1lbnRzID0gZnVsbFBhdGguc3BsaXQoIi8iKTsKK2ZpbGVOYW1lID0gcGF0aEVsZW1lbnRzW2xlbihwYXRoRWxlbWVudHMpLTFdCitmaWxlTG9jYXRpb24gPSBmdWxsUGF0aFs6KGxlbihmdWxsUGF0aCktbGVuKGZpbGVOYW1lKSldCitwcm9kdWN0VHlwZSA9ICJNUDMiCisKK2NtZCA9ICJqYXZhIC1qYXIgL1VzZXJzL3dvb2xsYXJkL0Rlc2t0b3AvZXh0cmFjdG9ycy9tcDNleHRyYWN0b3IvIgorY21kICs9ICJ0aWthLWFwcC0wLjUtU05BUFNIT1QuamFyIC1tICIrZnVsbFBhdGgrIiB8IGF3ayAtRjoiCitjbWQgKz0gIiAnQkVHSU4ge3ByaW50IFwiPGNhczptZXRhZGF0YSB4bWxuczpjYXM9IgorY21kICs9ICJcXFwiaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXNcXFwiPlwifSIKK2NtZCArPSAiIHtwcmludCBcIjxrZXl2YWw+PGtleT5cIiQxXCI8L2tleT48dmFsPlwic3Vic3RyKCQyLDIpXCIiCitjbWQgKz0gIjwvdmFsPjwva2V5dmFsPlwifScgPiAiK2ZpbGVOYW1lKyIubWV0IgorCitvcy5zeXN0ZW0oY21kKQorCitmID0gb3BlbihmaWxlTmFtZSsiLm1ldCIsICdhJykKK2Yud3JpdGUoJzxrZXl2YWw+PGtleT5Qcm9kdWN0VHlwZTwva2V5Pjx2YWw+K3Byb2R1Y3RUeXBlKQorZi53cml0ZSgnPC92YWw+PC9rZXl2YWw+XG48a2V5dmFsPjxrZXk+RmlsZW5hbWU8L2tleT48dmFsPicpCitmLndyaXRlKGZpbGVOYW1lKyc8L3ZhbD48L2tleXZhbD5cbic8a2V5dmFsPjxrZXk+RmlsZUxvY2F0aW9uJykKK2Yud3JpdGUoJzwva2V5Pjx2YWw+JytmaWxlTG9jYXRpb24rJzwvdmFsPjwva2V5dmFsPlxuJykKK2Yud3JpdGUoJzwvY2FzOm1ldGFkYXRhPicpCitmLmNsb3NlKCkKK11dPjwvc291cmNlPgorCisgICAgPHA+V2UnbGwgYXNzdW1lIHRoYXQgeW91IGhhdmUgUHl0aG9uIGluc3RhbGxlZCBhdCA8Y29kZT4vdXNyL2Jpbi9weXRob248L2NvZGU+CisgICAgYW5kIHlvdSBoYXZlIG5hbWVkIHRoaXMgc2NyaXB0IDxjb2RlPm1wM1B5dGhvbkV4dHJhY3Rvci5weTwvY29kZT4gYW5kIHBsYWNlZAorICAgIGl0IGluIDxjb2RlPi91c3IvbG9jYWwvZXh0cmFjdG9ycy9tcDNleHRyYWN0b3I8L2NvZGU+LiBXZSdsbCBuZWVkCisgICAgdG8gbWFrZSBzdXJlIGl0IGlzIGV4ZWN1dGFibGUgZnJvbSB0aGUgY29tbWFuZC1saW5lOjwvcD4KKworPHNvdXJjZT48IVtDREFUQVsKKz4gY2QgL3Vzci9sb2NhbC9leHRyYWN0b3JzL21wM2V4dHJhY3RvcgorPiBjaG1vZCAreCBtcDNQeXRob25FeHRyYWN0b3IucHkKKz4gLi9tcDNQeXRob25FeHRyYWN0b3IucHkgXAorIC91c3IvbG9jYWwvc3RhZ2luZy9wcm9kdWN0cy9tcDMvQmFjaC1TdWl0ZU5vMi5tcDMKKzxjYXM6bWV0YWRhdGEgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+Cis8a2V5dmFsPjxrZXk+QXV0aG9yPC9rZXk+PHZhbD5Kb2hhbm4gU2ViYXN0aWFuIEJhY2g8L3ZhbD48L2tleXZhbD4KKzxrZXl2YWw+PGtleT5Db250ZW50LVR5cGU8L2tleT48dmFsPmF1ZGlvL21wZWc8L3ZhbD48L2tleXZhbD4KKzxrZXl2YWw+PGtleT5yZXNvdXJjZU5hbWU8L2tleT48dmFsPkJhY2gtU3VpdGVObzIubXAzPC92YWw+PC9rZXl2YWw+Cis8a2V5dmFsPjxrZXk+dGl0bGU8L2tleT48dmFsPkJhY2ggQ2VsbG8gU3VpdGUgTm8gMjwvdmFsPjwva2V5dmFsPgorPGtleXZhbD48a2V5PlByb2R1Y3RUeXBlPC9rZXk+PHZhbD5NUDM8L3ZhbD48L2tleXZhbD4KKzxrZXl2YWw+PGtleT5GaWxlbmFtZTwva2V5Pjx2YWw+QmFjaC1TdWl0ZU5vMi5tcDM8L3ZhbD48L2tleXZhbD4KKzxrZXl2YWw+PGtleT5GaWxlTG9jYXRpb248L2tleT48dmFsPi91c3IvbG9jYWwvc3RhZ2luZy9wcm9kdWN0cy9tcDMKKzwvdmFsPjwva2V5dmFsPgorPC9jYXM6bWV0YWRhdGE+CitdXT48L3NvdXJjZT4gIAorICAgIAorICAgIDxwPk5vdyB0aGF0IHdlIGhhdmUgYSBtZXRhZGF0YSBleHRyYWN0b3IgdGhhdCBtZWV0cyBvdXIgcmVxdWlyZW1lbnRzIChpdCdzCisgICAgY2FsbGFibGUgZnJvbSB0aGUgY29tbWFuZC1saW5lLCBpdCBwcm9kdWNlcyBDQVMtTWV0YWRhdGEgY29tcGF0aWJsZSBYTUwsIGFuZAorICAgIGl0IGV4dHJhY3RzIDxpPlByb2R1Y3RUeXBlPC9pPiwgPGk+RmlsZW5hbWU8L2k+LCBhbmQgPGk+RmlsZUxvY2F0aW9uPC9pPiksCisgICAgdGhlIG5leHQgc3RlcCBpcyB0byBjcmVhdGUgYW4gPGNvZGU+RXh0ZXJuTWV0RXh0cmFjdG9yPC9jb2RlPiBjb25maWd1cmF0aW9uCisgICAgZmlsZS4gVGhpcyBmaWxlIHdpbGwgY29uZmlndXJlIENBUy1NZXRhZGF0YSdzIDxjb2RlPkV4dGVybk1ldEV4dHJhY3RvcjwvY29kZT4KKyAgICB0byBjYWxsIHRoZSA8Y29kZT5tcDNQeXRob25FeHRyYWN0b3IucHk8L2NvZGU+IHNjcmlwdCBjb3JyZWN0bHkuPC9wPiAKKyAgICAKKyAgICA8cD5UaGVyZSBpcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxjb2RlPkV4dGVybk1ldEV4dHJhY3RvcjwvY29kZT4gCisgICAgY29uZmlndXJhdGlvbiBhdmFpbGFibGUgaW4gQ0FTLU1ldGFkYXRhJ3MgCisgICAgPGEgaHJlZj0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2Nhcy1tZXRhZGF0YS91c2VyL2V4dHJhY3RvckJhc2ljcy5odG1sIj4KKyAgICBFeHRyYWN0b3IgQmFzaWNzPC9hPiBVc2VyJ3MgR3VpZGUuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBndWlkZSwgd2Ugd2lsbCAKKyAgICBhc3N1bWUgdGhhdCB0aGUgcmVhZGVyIGlzIGZhbWlsaWFyIHdpdGggY29uZmlndXJhdGlvbiBvZiB0aGlzIGV4dHJhY3Rvciwgc28gd2UgCisgICAgd2lsbCBqdXN0IHByZXNlbnQgdGhlIGNvbmZpZ3VyYXRpb24gYmVsb3cgKHdlIGFzc3VtZSB0aGF0IHlvdSBuYW1lIHRoaXMgZmlsZSAKKyAgICA8Y29kZT5tcDNQeXRob25FeHRyYWN0b3IuY29uZmlnPC9jb2RlPik6PC9wPiAKKyAKKzxzb3VyY2U+PCFbQ0RBVEFbICAgIAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjYXM6ZXh0ZXJuZXh0cmFjdG9yIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorICAgPGV4ZWMgd29ya2luZ0Rpcj0iIj4KKyAgICAgIDxleHRyYWN0b3JCaW5QYXRoPgorL3Vzci9sb2NhbC9leHRyYWN0b3JzL21wM2V4dHJhY3Rvci9tcDNQeXRob25FeHRyYWN0b3IucHkKKyAgICAgIDwvZXh0cmFjdG9yQmluUGF0aD4KKyAgICAgIDxhcmdzPgorICAgICAgICAgPGFyZyBpc0RhdGFGaWxlPSJ0cnVlIi8+CisgICAgICA8L2FyZ3M+CisgICA8L2V4ZWM+Cis8L2NhczpleHRlcm5leHRyYWN0b3I+CitdXT48L3NvdXJjZT4gICAgCisgICAgCisgICAgPHA+VGhlIGxhc3Qgc3RlcCBpbiBjb25maWd1cmluZyBvdXIgbXAzIG1ldGFkYXRhIGV4dHJhY3RvciBpcyB0byBwcm92aWRlIGEgCisgICAgcHJvcGVydGllcyBmaWxlIGZvciBDQVMtQ3VyYXRvciBzbyB0aGF0IGl0IGtub3dzIGhvdyB0byBjYWxsIHRoZSAKKyAgICA8Y29kZT5FeHRlcm5NZXRFeHRyYWN0b3I8L2NvZGU+LiBFYWNoIGV4dHJhY3RvciB1c2VkIGJ5IENBUy1DdXJhdG9yIG5lZWRzCisgICAgYSA8Y29kZT5jb25maWcucHJvcGVydGllczwvY29kZT4gZmlsZS4gVGhpcyBmaWxlIHNldHMgdHdvIHByb3BlcnRpZXM6PC9wPgorICAgIAorICAgIDx1bD4KKyAgICAgIDxsaT48Y29kZT5leHRyYWN0b3IuY2xhc3NuYW1lPC9jb2RlPjwvbGk+CisgICAgICA8bGk+PGNvZGU+ZXh0cmFjdG9yLmNvbmZpZy5maWxlczwvY29kZT48L2xpPgorICAgIDwvdWw+ICAKKyAgICAKKyAgICA8cD5DcmVhdGUgYSA8Y29kZT5jb25maWcucHJvcGVydGllczwvY29kZT4gZmlsZSAodGhpcyBuYW1lIGlzIGltcG9ydGFudCBmb3IgCisgICAgQ0FTLUN1cmF0b3IgdG8gcGljayB1cCB0aGUgY29maWd1cmF0aW9uKSBpbiB0aGUgCisgICAgPGNvZGU+L3Vzci9sb2NhbC9leHRyYWN0b3JzL21wM2V4dHJhY3RvcjwvY29kZT4gZGlyZWN0b3J5LiBUaGlzIGZpbGUgc2hvdWxkCisgICAgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6PC9wPgorCis8c291cmNlPgorZXh0cmFjdG9yLmNsYXNzbmFtZT1vcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRXh0ZXJuTWV0RXh0cmFjdG9yCitleHRyYWN0b3IuY29uZmlnLmZpbGVzPS91c3IvbG9jYWwvZXh0cmFjdG9ycy9tcDNleHRyYWN0b3IvbXAzUHl0aG9uRXh0cmFjdG9yLmNvbmZpZworPC9zb3VyY2U+CisKKyAgICA8cD5UbyByZWNhcCwgd2UgZmlyc3QgY3JlYXRlZCBhIFB5dGhvbiBzY3JpcHQgdGhhdCBjYWxscworICAgIDxhIGhyZWY9Imh0dHA6Ly9sdWNlbmUuYXBhY2hlLm9yZy90aWthLyI+QXBhY2hlIFRpa2E8L2E+IHRvIGV4dHJhY3QgbWV0YWRhdGEKKyAgICBmcm9tIG1wMyBmaWxlcy4gVGhlbiB3ZSBjcmVhdGVkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgY29uZmlndXJlcyAKKyAgICBDQVMtTWV0YWRhdGEncyA8Y29kZT5FeHRlcm5NZXRFeHRyYWN0b3I8L2NvZGU+IHRvIGNhbGwgdGhpcyBweXRob24gc2NyaXB0LgorICAgIEZpbmFsbHksIHdlIGNyZWF0ZWQgYSBwcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBDQVMtQ3VyYXRvciB0byBjYWxsIHRoZSAKKyAgICA8Y29kZT5FeHRlcm5NZXRFeHRyYWN0b3I8L2NvZGU+LiBUbyBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgCisgICAgZXh0cmFjdG9yLCB3ZSBjYW4gbG9uZyBsaXN0IHRoZSBleHRyYWN0b3IgZGlyZWN0b3J5OjwvcD4KKyAgICAKKyAgICA8c291cmNlPgorPiBjZCAvdXNyL2xvY2FsL2V4dHJhY3RvcnMvbXAzZXh0cmFjdG9yCis+IGxzIC1sCit0b3RhbCA1MTQ0OAorLXJ3LXItLXItLSAgMSAtICAtICAgICAgIDE2NyBOb3YgMjcgMTM6NTAgY29uZmlnLnByb3BlcnRpZXMKKy1ydy1yLS1yLS0gIDEgLSAgLSAgICAgICAzMjggTm92IDI3IDEzOjQ5IG1wM1B5dGhvbkV4dHJhY3Rvci5jb25maWcKKy1yd3hyLXhyLXggIDEgLSAgLSAgICAgICA3MDIgTm92IDI3IDEzOjQ5IG1wM1B5dGhvbkV4dHJhY3Rvci5weQorLXJ3LXItLXItLSAgMSAtICAtICAyNjMyNTE1NSBOb3YgMjcgMTM6NDYgdGlrYS1hcHAtMC41LVNOQVBTSE9ULmphcgorICAgIDwvc291cmNlPiAgICAKKworICAgIDxwPk9uY2UgeW91IHJlc3RhcnQgVG9tY2F0LCB0aGUgY2hhbmdlIHlvdSBoYXZlIG1hZGUgdG8gdGhlIGNvbnRleHQgZmlsZSB3aWxsIGJlCisgICAgdXNlZC4gVGhlIGV4dHJhY3RvciBhcmVhIHdpbGwgbm93IGJlIHNldCB0byA8Y29kZT4vdXNyL2xvY2FsL2V4dHJhY3RvcnM8L2NvZGU+LgorICAgIFNlZSB0aGUgc2NyZWVuc2hvdCBiZWxvdzo8L3A+CisgCisgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9iYXNpY19leHRyYWN0b3IuanBnIi8+IAorICAgIAorICAgIDxwPkluIHRoZSBhYm92ZSBzY3JlZW5zaG90LCB3ZSBzZWUgdGhhdCwgdXBvbiBjbGlja2luZyBvbiB0aGUgbXAzIGZpbGUsIAorICAgIG1ldGFkYXRhIHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT5tcDNleHRyYWN0b3I8L2NvZGU+IGlzIHNob3duIGluIHRoZSBtYWluIHJpZ2h0IAorICAgIHN0YWdpbmcgcGFuZS4gTm93IHN0YWdpbmcgYW5kIGV4dHJhY3Rpb24gYXJlIHNldCB1cC4gSW4gdGhlIG5leHQgc2VjdGlvbiwgd2UKKyAgICB3aWxsIHNldCB1cCBhIENBUy1GaWxlbWdyIGluc3RhbmNlIGFuZCBzaG93IGhvdyBDQVMtQ3VyYXRvciBjYW4gYmUgdXNlZCB0byAKKyAgICBpbmdlc3QgcHJvZHVjdHMuPC9wPgorICAgIAorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8YSBuYW1lPSJzZWN0aW9uNSIvPgorICAgIDxzZWN0aW9uIG5hbWU9IkZpbGUgTWFuYWdlciBDb25maWd1cmF0aW9uIj4KKyAgICAKKyAgICA8cD5UaGUgZmluYWwgc3RlcCBpbiBvdXIgYmFzaWMgY29uZmlndXJhdGlvbiBvZiBDQVMtQ3VyYXRvciBpcyB0byBjb25maWd1cmUgYSAKKyAgICBDQVMtRmlsZW1nciBpbnN0YW5jZSBpbnRvIHdoaWNoIHdlIHdpbGwgaW5nZXN0IG91ciBtcDNzLiBUaGVyZSBpcyBhIGxvdCBvZgorICAgIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIHRoZSBDQVMtRmlsZW1nciBpbiBpdHMKKyAgICA8YSBocmVmPSIuLi8uLi9maWxlbWdyL3VzZXIvIj5Vc2VyJ3MgR3VpZGU8L2E+LiBXZSB3aWxsIAorICAgIGFzc3VtZSBmYW1pbGlhcml0eSB3aXRoIHRoZSBDQVMtRmlsZW1nciBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGd1aWRlLjwvcD4KKyAgICAKKyAgICA8cD5JbiB0aGlzIGd1aWRlLCB3ZSB3aWxsIGZvY3VzIG9uIHRoZSBiYXNpYyBjb25maWd1cmF0aW9uIG5lY2Vzc2FyeSB0byB0YWlsb3IKKyAgICBhIHZhbmlsbGEgYnVpbGQgb2YgdGhlIENBUy1GaWxlbWdyIGZvciB1c2Ugd2l0aCBvdXIgQ0FTLUN1cmF0b3IuIFdlIHdpbGwgYXNzdW1lIAorICAgIHRoYXQgeW91IGhhdmUgYnVpbHQgdGhlIGxhdGVzdCByZWxlYXNlIG9mIHRoZSBDQVMtRmlsZW1nciAodjEuOC4wIGF0IHRoZSB0aW1lIG9mIAorICAgIHRoaXMgd3JpdGluZykgYW5kIGluc3RhbGxlZCBpdCBhdDo8L3A+CisgICAgCisgICAgPHNvdXJjZT4KKy91c3IvbG9jYWwvc3JjL2Nhcy1maWxlbWdyLTEuOC4wLworICAgIDwvc291cmNlPgorICAgIAorICAgIDxwPlRoZSBmaXJzdCBzdGVwIGluIGNvbmZpZ3VyaW5nIHRoZSBDQVMtRmlsZW1nciBpcyB0byBlZGl0IHRoZSAKKyAgICA8Y29kZT5maWxlbWdyLnByb3BlcnRpZXM8L2NvZGU+IGZpbGUgaW4gdGhlIDxjb2RlPmV0YzwvY29kZT4gZGlyZWN0b3J5LiBUaGlzIAorICAgIGZpbGUgY29udHJvbHMgdGhlIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIENBUy1GaWxlbWdyLCBpbmNsdWRpbmcgaXRzCisgICAgdmFyaW91cyBleHRlbnNpb24gcG9pbnRzLiBGb3IgdGhpcyBleGFtcGxlLCB3ZSBhcmUgZ29pbmcgdG8gcnVuIHRoZSBDQVMtRmlsZW1ncgorICAgIGluIGEgdmVyeSBiYXNpYyBjb25maWd1cmF0aW9uLCB3aXRoIGJvdGggaXRzIHJlcG9zaXRvcnkgYW5kIHZhbGlkYXRpb24gbGF5ZXIKKyAgICBjb250cm9sbGVkIGJ5IFhNTCBjb25maWd1cmF0aW9uLCBhIGxvY2FsIGRhdGEgdHJhbnNmZXIgZmFjdG9yeSwgYW5kIGEgCisgICAgPGEgaHJlZj0iaHR0cDovL2x1Y2VuZS5hcGFjaGUub3JnL2phdmEvZG9jcy8iPkx1Y2VuZTwvYT4tYmFzZWQgbWV0YWRhdGEgCisgICAgY2F0YWxvZy48L3A+CisgICAgCisgICAgPHA+SW4gb3JkZXIgdG8gY3JlYXRlIHRoaXMgY29uZmlndXJhdGlvbiwgd2Ugd2lsbCBjaGFuZ2UgdGhlIGZvbGxvd2luZworICAgIHBhcmFtZXRlcnMgaW4gdGhlIDxjb2RlPmZpbGVtZ3IucHJvcGVydGllczwvY29kZT4gZmlsZTo8L3A+CisgICAgCisgICAgPHVsPgorICAgICAgPGxpPlNldCA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aDwvY29kZT4KKyAgICAgIHRvIDxjb2RlPi91c3IvbG9jYWwvc3JjL2Nhcy1maWxlbWdyLTEuOC4wL2NhdGFsb2c8L2NvZGU+LiBUaGlzIHBhcmFtZXRlcgorICAgICAgdGVsbHMgQ0FTLUZpbGVtZ3Igd2hlcmUgdG8gY3JlYXRlIHRoZSBMdWNlbmUgaW5kZXguIFRoZSBmaXJzdCB0aW1lIHlvdSBzdGFydCAKKyAgICAgIHRoZSBDQVMtRmlsZW1nciwgbWFrZSBzdXJlIHRoYXQgdGhpcyBmaWxlIGRvZXMgTk9UIGV4aXN0LiBUaGUgQ0FTLUZpbGVtZ3IgCisgICAgICB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyBpdCBhbmQgcG9wdWxhdGluZyBpdCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmaWxlcy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+U2V0IDxjb2RlPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRpcnM8L2NvZGU+IHRvCisgICAgICA8Y29kZT5maWxlOi8vL3Vzci9sb2NhbC9zcmMvY2FzLWZpbGVtZ3ItMS44LjAvcG9saWN5L21wMzwvY29kZT4uIFRoZSB2YWx1ZSBuZWVkcworICAgICAgdG8gYmUgYSBVUkwgYW5kIHdlIGFyZSBwb2ludGluZyB0byBhIHBvbGljeSBmb2xkZXIgd2Ugd2lsbCBjcmVhdGUuPC9saT4KKyAgICAgIDxsaT5TZXQgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlyczwvY29kZT4gdG8gCisgICAgICA8Y29kZT5maWxlOi8vL3Vzci9sb2NhbC9zcmMvY2FzLWZpbGVtZ3ItMS44LjAvcG9saWN5L21wMzwvY29kZT4uIExpa2UgdGhlIGxhc3QgCisgICAgICBwYXJhbWV0ZXIgd2UgY29uZmlndXJlZCwgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgVVJMIGFuZCBwb2ludCB0byB0aGUgCisgICAgICBzYW1lIHBvbGljeSBmb2xkZXIuPC9saT4KKyAgICA8L3VsPgorICAgIAorICAgIDxwPldpdGggdGhlc2UgY2hhbmdlcywgeW91IGFyZSByZWFkeSB0byBydW4gdGhlIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIAorICAgIENBUy1GaWxlbWdyLiBJbiBvcmRlciB0byBtYWtlIHRoaXMgaW5zdGFsbCBvZiBDQVMtRmlsZW1nciB3b3JrIHdpdGggb3VyIAorICAgIENBUy1DdXJhdG9yLCBob3dldmVyLCB3ZSB3aWxsIGFsc28gbmVlZCB0byBhdWdtZW50IHRoZSBiYXNpYyBwb2xpY3kgZm9yIGJvdGgKKyAgICB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIGFuZCB2YWxpZGF0aW9uIGxheWVyLjwvcD4KKyAgICAKKyAgICA8cD5GaXJzdCwgd2Ugd2lsbCBjcmVhdGUgYSBwb2xpY3kgZGlyZWN0b3J5IGZvciBvdXIgbXAzIGN1cmF0b3IuIFdlIGNhbiBkbyB0aGlzCisgICAgYnkgbW92aW5nIHRoZSBjdXJyZW50IHBvbGljeSBmaWxlcyBmcm9tIHRoZSBiYXNlIDxjb2RlPnBvbGljeTwvY29kZT4gZGlyZWN0b3J5IHRvCisgICAgYSA8Y29kZT5tcDM8L2NvZGU+IGRpcmVjdG9yeTo8L3A+CisgICAgCisgICAgPHNvdXJjZT4KKz4gY2QgL3Vzci9sb2NhbC9zcmMvY2FzLWZpbGVtZ3ItMS44LjAvcG9saWN5Cis+IG1rZGlyIG1wMworPiBtdiAqLnhtbCBtcDMvICAgIAorICAgIDwvc291cmNlPiAKKyAgICAKKyAgICA8cD5OZXh0LCB3ZSB3aWxsIGFkZCBhIHByb2R1Y3QgdHlwZSB0byBvdXIgaW5zdGFuY2Ugb2YgdGhlIENBUy1GaWxlbWdyLiBJbiBvcmRlciAKKyAgICB0byBkbyB0aGlzLCB3ZSB3aWxsIGVkaXQgdGhlIDxjb2RlPnByb2R1Y3QtdHlwZXMueG1sPC9jb2RlPiBmaWxlIGluIHRoZSAKKyAgICA8Y29kZT5wb2xpY3kvbXAzPC9jb2RlPiBkaXJlY3RvcnkuIFdlIHdpbGwgYWRkIHRoZSBmb2xsb3dpbmcgYXMgYSBjaGlsZCBvZiB0aGUgCisgICAgPGNvZGU+Jmx0O2Nhczpwcm9kdWN0dHlwZXMmZ3Q7PC9jb2RlPiBub2RlICh3ZSBwdXJwb3NlZnVsbHkgZWxpZGUgYW55CisgICAgY29tbWVudGFyeSBvbiB0aGUgZGV0YWlscyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gYW5kIGxlYXZlIGl0IHRvIHRoZSAKKyAgICByZWFkZXIpOjwvcD4KKworPHNvdXJjZT48IVtDREFUQVsgCis8dHlwZSBpZD0idXJuOmV4YW1wbGU6TVAzIiBuYW1lPSJNUDMiPgorICA8cmVwb3NpdG9yeSBwYXRoPSJmaWxlOi8vL3Vzci9sb2NhbC9hcmNoaXZlIi8+CisgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgIDxkZXNjcmlwdGlvbj5BIHByb2R1Y3QgdHlwZSBmb3IgbXAzIGF1ZGlvIGZpbGVzLjwvZGVzY3JpcHRpb24+CisgIDxtZXRFeHRyYWN0b3JzPgorICAgIDxleHRyYWN0b3IKKyAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5Db3JlTWV0RXh0cmFjdG9yIj4KKyAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibnNBd2FyZSIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50TnMiIHZhbHVlPSJDQVMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50cyIKKyAgICAgICAgICAgICAgdmFsdWU9IlByb2R1Y3RSZWNlaXZlZFRpbWUsUHJvZHVjdE5hbWUsUHJvZHVjdElkIiAvPgorICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDwvZXh0cmFjdG9yPgorICA8L21ldEV4dHJhY3RvcnM+Cis8L3R5cGU+CitdXT48L3NvdXJjZT4KKyAgICAKKyAgICA8cD5OZXh0LCB3ZSB3aWxsIGNyZWF0ZSBhIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgPGNvZGU+ZWxlbWVudHMueG1sPC9jb2RlPgorICAgIGZpbGUuIFRoZXJlIHdpbGwgYmUgYW4gZWxlbWVudCBub2RlIGZvciBlYWNoIG9mIHRoZSBtZXRhZGF0YSBlbGVtZW50cyB3ZQorICAgIHdhbnQgdG8gYXNzb2NpYXRlIHdpdGggTVAzIHByb2R1Y3RzLiBXZSBjYW4gZG8gdGhpcyBiZSBhZGRpbmcgdGhlIGZvbGxvd2luZyAKKyAgICBhcyBjaGlsZHJlbiBub2RlcyBvZiA8Y29kZT4mbHQ7Y2FzOmVsZW1lbnRzJmd0OzwvY29kZT4gdGFnOjwvcD4KKyAKKzxzb3VyY2U+PCFbQ0RBVEFbICAgICAKKzxlbGVtZW50IGlkPSJ1cm46ZXhhbXBsZTpGaWxlTG9jYXRpb24iIG5hbWU9IkZpbGVMb2NhdGlvbiI+CisgIDxkY0VsZW1lbnQvPgorICA8ZGVzY3JpcHRpb24vPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjpleGFtcGxlOlByb2R1Y3RUeXBlIiBuYW1lPSJQcm9kdWN0VHlwZSI+CisgIDxkY0VsZW1lbnQvPgorICA8ZGVzY3JpcHRpb24vPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjpleGFtcGxlOkF1dGhvciIgbmFtZT0iQXV0aG9yIj4KKyAgPGRjRWxlbWVudC8+CisgIDxkZXNjcmlwdGlvbi8+Cis8L2VsZW1lbnQ+Cis8ZWxlbWVudCBpZD0idXJuOmV4YW1wbGU6RmlsZW5hbWUiIG5hbWU9IkZpbGVuYW1lIj4KKyAgPGRjRWxlbWVudC8+CisgIDxkZXNjcmlwdGlvbi8+Cis8L2VsZW1lbnQ+Cis8ZWxlbWVudCBpZD0idXJuOmV4YW1wbGU6cmVzb3VyY2VOYW1lIiBuYW1lPSJyZXNvdXJjZU5hbWUiPgorICA8ZGNFbGVtZW50Lz4KKyAgPGRlc2NyaXB0aW9uLz4KKzwvZWxlbWVudD4KKzxlbGVtZW50IGlkPSJ1cm46ZXhhbXBsZTp0aXRsZSIgbmFtZT0idGl0bGUiPgorICA8ZGNFbGVtZW50Lz4KKyAgPGRlc2NyaXB0aW9uLz4KKzwvZWxlbWVudD4KKzxlbGVtZW50IGlkPSJ1cm46ZXhhbXBsZTpDb250ZW50LVR5cGUiIG5hbWU9InRDb250ZW50LVR5cGUiPgorICA8ZGNFbGVtZW50Lz4KKyAgPGRlc2NyaXB0aW9uLz4KKzwvZWxlbWVudD4gCitdXT48L3NvdXJjZT4gICAgCisKKyAgICA8cD5BZnRlciB3ZSBoYXZlIGNvbmZpZ3VyZWQgdGhlIG5ldyBtZXRhZGF0YSBlbGVtZW50cywgd2Ugd2lsbCBuZWVkIHRvIG1hcCAKKyAgICB0aGVzZSBlbGVtZW50cyB0byBvdXIgTVAzIHByb2R1Y3QuIFdlIGRvIHRoaXMgYnkgZWRpdGluZyB0aGUgCisgICAgPGNvZGU+cHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPGNvZGU+cG9saWN5L21wMzwvY29kZT4KKyAgICBkaXJlY3RvcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgYXMgYSBjaGlsZCBub2RlIHRvIAorICAgIDxjb2RlPiZsdDtjYXM6cHJvZHVjdHR5cGVtYXAmZ3Q7PC9jb2RlPjo8L3A+CisgICAgCis8c291cmNlPjwhW0NEQVRBWyAgICAgICAKKzx0eXBlIGlkPSJ1cm46ZXhhbXBsZTpNUDMiPgorICA8ZWxlbWVudCBpZD0idXJuOmV4YW1wbGU6RmlsZUxvY2F0aW9uIi8+CisgIDxlbGVtZW50IGlkPSJ1cm46ZXhhbXBsZTpQcm9kdWN0VHlwZSIvPgorICA8ZWxlbWVudCBpZD0idXJuOmV4YW1wbGU6QXV0aG9yIi8+CisgIDxlbGVtZW50IGlkPSJ1cm46ZXhhbXBsZTpGaWxlbmFtZSIvPgorICA8ZWxlbWVudCBpZD0idXJuOmV4YW1wbGU6cmVzb3VyY2VOYW1lIi8+CisgIDxlbGVtZW50IGlkPSJ1cm46ZXhhbXBsZTp0aXRsZSIvPgorICA8ZWxlbWVudCBpZD0idXJuOmV4YW1wbGU6Q29udGVudC1UeXBlIi8+IAorPC90eXBlPgorXV0+PC9zb3VyY2U+IAorICAgIAorICAgIDxwPkEgZmluYWwgY29uZmlndXJhdGlvbiBzdGVwIHdpbGwgYmUgdG8gY3JlYXRlIHRoZSBhcmNoaXZlIGFyZWEgZm9yIHRoZSAKKyAgICBDQVMtRmlsZW1nciAoWW91J2xsIHJlbWVtYmVyIHRoYXQgd2Ugc2V0IHRoZSByZXBvc2l0b3J5IHBhdGggZm9yIE1QMyBwcm9kdWN0cyAKKyAgICBpbiB0aGUgPGNvZGU+cHJvZHVjdC10eXBlcy54bWw8L2NvZGU+IGZpbGUpLiBJbiBvcmRlciB0byBkbyB0aGlzLCB3ZSB3aWxsIGp1c3QgCisgICAgbWFrZSB0aGUgZGlyZWN0b3J5OjwvcD4KKyAgICAKKyAgICA8c291cmNlPgorPiBta2RpciAvdXNyL2xvY2FsL2FyY2hpdmUKKyAgICA8L3NvdXJjZT4KKyAgICAKKyAgICA8cD5XZSB3aWxsIG5vdyBzdGFydCB0aGUgQ0FTLUZpbGVtZ3IgaW5zdGFuY2UuIFRoaXMgaW5zdGFuY2Ugd2lsbCBydW4gb24KKyAgICBwb3J0IDkwMDAgYnkgZGVmYXVsdC4gSW4gb3JkZXIgdG8gc3RhcnQgdGhlIEZpbGVtZ3IsIHdlIHdpbGwgaXNzdWUgdGhlIAorICAgIGZvbGxvd2luZyBjb21tYW5kczo8L3A+CisgICAgCisgICAgPHNvdXJjZT4KKz4gY2QgL3Vzci9sb2NhbC9zcmMvY2FzLWZpbGVtZ3ItMS44LjAvYmluCis+IC4vZmlsZW1nciBzdGFydAorICAgIDwvc291cmNlPgorICAgIAorICAgIDxwPk5vdyB0aGF0IHdlIGhhdmUgc3RhcnRlZCB0aGUgQ0FTLUZpbGVtZ3IsIHdlIHdpbGwgbmVlZCB0byBjb25maWd1cmUgdGhlCisgICAgQ0FTLUN1cmF0b3IgdG8gdXNlIHRoaXMgRmlsZW1nciBpbnN0YW5jZS4gSW4gb3JkZXIgdG8gZG8gdGhpcywgd2Ugd2lsbCBhZGQKKyAgICB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgdG8gdGhlIENBUy1DdXJhdG9yIGNvbnRleHQgZmlsZTo8L3A+CisgICAgCis8c291cmNlPjwhW0NEQVRBWyAgICAKKzxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5mbS51cmwiCisgICAgICAgIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OjkwMDAiLz4KKyAgICAgICAgICAgIAorPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuZGF0YURlZmluaXRpb24udXBsb2FkUGF0aCIKKyAgICAgICAgdmFsdWU9Ii91c3IvbG9jYWwvc3JjL2Nhcy1maWxlbWdyLTEuOC4wL3BvbGljeSIgLz4KKworPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuZm1Qcm9wcyIKKyAgICAgICAgdmFsdWU9Ii91c3IvbG9jYWwvc3JjL2Nhcy1maWxlbWdyLTEuOC4wL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMiLz4gICAgICAgIAorXV0+PC9zb3VyY2U+ICAgIAorICAgIAorICAgIDxwPk9uY2Ugd2UgcmVzdGFydCBUb21jYXQsIHRoZSBDQVMtQ3VyYXRvciB3aWxsIG5vdyByZWNvZ25pemUgdGhlIHBvbGljeQorICAgIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBjb25maWd1cmVkIENBUy1GaWxlbWdyIGluc3RhbmNlIGFuZCB1c2UgdGhpcyAKKyAgICBpbnN0YW5jZSBkdXJpbmcgdGhlIGluZ2VzdCBwcm9jZXNzLjwvcD4KKyAgICAKKyAgICA8aW1nIHNyYz0iLi4vaW1hZ2VzL2Jhc2ljX2ZpbGVtZ3IuanBnIi8+CisgICAgCisgICAgPHA+RnJvbSB0aGUgYWJvdmUgaW1hZ2UsIHlvdSBjYW4gc2VlIHRoYXQgdGhlIENBUy1GaWxlbWdyIGNvbmZpZ3VyYXRpb24KKyAgICBoYXMgYmVlbiBwaWNrZWQgdXAgYnkgQ0FTLUN1cmF0b3IuIElmIHlvdSBkb3VibGUtY2xpY2sgb24gTVAzIGluIHRoZSBsZWZ0CisgICAgZmlsZW1nciBtYWluIHBhbmUsIHlvdSB3aWxsIHNlZSB0aGUgcHJvZHVjdCB0eXBlcyB0aGF0IGFyZSBjb250YWluZWQgaW4KKyAgICB0aGUgbXAzIHBvbGljeTogPGNvZGU+R2VuZXJpY0ZpbGU8L2NvZGU+IHdoaWNoIHdhcyBwYXJ0IG9mIHRoZSBkZWZhdWx0CisgICAgY29uZmlndXJhdGlvbiwgYW5kIDxjb2RlPk1QMzwvY29kZT4gd2hpY2ggd2UgYWRkZWQuIENsaWNraW5nIG9uIE1QMywKKyAgICB3ZSBicmluZyB1cCB0aGUgaW5nZXN0IGludGVyZmFjZSBpbiB0aGUgcmlnaHQgZmlsZW1nciBtYWluIHBhbmUuPC9wPiAKKyAgICAKKyAgICA8aW1nIHNyYz0iLi4vaW1hZ2VzL2Jhc2ljX2luZ2VzdC5qcGciLz4KKyAgICAKKyAgICA8cD5PbmNlIHdlIGRyYWcgdGhlIEJhY2gtU3VpdGVObzIubXAzIGZyb20gdGhlIHN0YWdpbmcgcGFuZSB0byB0aGUgZ3JlZW4KKyAgICBib3ggaW4gdGhlIHJpZ2h0IGZpbGVtZ3IgbWFpbiBwYW5lLCB3ZSBjYW4gdGhlbiBzZWxlY3QgYSBtZXRhZGF0YSBleHRyYWN0b3IKKyAgICBmcm9tIHRoZSBwdWxsZG93biBtZW51IGFuZCBjbGljayBvbiB0aGUgIlNhdmUgYXMgSW5nZXN0aW9uIFRhc2suIiBUaGlzIHdpbGwKKyAgICBhZGQgdGhlIEluZ2VzdCB0YXNrIHRvIHRoZSBib3R0b20gcGFuZSBhcyBpbGx1c3RyYXRlZCBpbiB0aGUgYWJvdmUgCisgICAgc2NyZWVuc2hvdC4gSW4gb3JkZXIgdG8gdGVzdCBmaWxlIGluZ2VzdGlvbiwgd2Ugd2lsbCBjbGljayBvbiB0aGUgIlN0YXJ0IgorICAgIGJ1dHRvbi48L3A+CisgICAgCisgICAgPHA+QXMgYSBmaW5hbCBzdGVwLCB3ZSB3aWxsIGNvbmZpcm0gdGhhdCB0aGUgbXAzIGZpbGUgd2FzIGFyY2hpdmVkLiBXZSAKKyAgICBjYW4gZG8gdGhpcyBieSBsaXN0aW5nIHRoZSBhcmNoaXZlOjwvcD4KKyAgICAKKyAgICA8c291cmNlPgorPiBscyAtbFIgL3Vzci9sb2NhbC9hcmNoaXZlCit0b3RhbCAwCitkcnd4ci14ci14ICAzIC0gIC0gMTAyIE5vdiAyNyAyMzo1MyBCYWNoLVN1aXRlTm8yLm1wMworCisvdXNyL2xvY2FsL2FyY2hpdmUvL0JhY2gtU3VpdGVObzIubXAzOgordG90YWwgOTM0NAorLXJ3LXItLXItLSAgMSAtICAtICA0NzgxMDc5IE5vdiAyNSAyMDoxNCBCYWNoLVN1aXRlTm8yLm1wMworICAgIDwvc291cmNlPgorICAgIAorICAgIDxwPldvcnRoIG5vdGluZyBpcyB0aGUgZmFjdCB0aGF0IG91ciBjb25maWd1cmF0aW9uIG9mIHRoZSBDQVMtRmlsZW1ncgorICAgIGluY2x1ZGVkIGEgc2VsZWN0aW9uIG9mIHRoZSA8Y29kZT5CYXNpY1ZlcnNpb25lcjwvY29kZT4gYXMgdGhlIE1QMyAKKyAgICBwcm9kdWN0IHR5cGUgdmVyc2lvbmVyLiBUaGlzIG1lYW5zIHRoYXQgbXAzcyBhcmUgcGxhY2VkIGF0CisgICAgW2FyY2hpdmVfYmFzZV0vW2ZpbGVuYW1lXS9bZmlsZW5hbWVdIGR1cmluZyBpbmdlc3QuPC9wPgorICAgIAorICAgIDxwPldlIGhhdmUgbm93IGNvbXBsZXRlZCBhIGJhc2UgY29uZmlndXJhdGlvbiBvZiB0aGUgQ0FTLUN1cmF0b3IuIEluCisgICAgdGhlIDxhIGhyZWY9Ii4uL3VzZXIvYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgR3VpZGU8L2E+LCB3ZSB3aWxsIGNvdmVyIAorICAgIHRvcGljcyBsaWtlIGNoYW5naW5nIHRoZSBsb29rIGFuZCBmZWVsIG9mIHRoZSBDdXJhdG9yLCBhbmQgc2VjdXJpdHkgCisgICAgY29uZmlndXJhdGlvbi48L3A+CisgICAgCisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvMC4xMC9kb2NrZXIvRG9ja2VyZmlsZSBiLzAuMTAvZG9ja2VyL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4ZTliYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZG9ja2VyL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMiBAQAorRlJPTSB1YnVudHU6bGF0ZXN0CitNQUlOVEFJTkVSIFRvbSBCYXJiZXIKKworRU5WIEpBVkFfSE9NRSAvdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQvCisKK1JVTiBzdWRvIGFwdC1nZXQgdXBkYXRlIAorUlVOIHN1ZG8gYXB0LWdldCBpbnN0YWxsIC15IG9wZW5qZGstNy1qcmUtaGVhZGxlc3Mgb3Blbmpkay03LWpyZSBtYXZlbiBjdXJsCisjUlVOIHN1ZG8gYXB0LWdldCBpbnN0YWxsIG1hdmVuMgorV09SS0RJUiAvdXNyL3NyYworCitSVU4gY3VybCAtcyBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdHJ1bmsvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9yYWRpeCB8IGJhc2gKK1JVTiBtdiBvb2R0IG9vZHQtc3JjOyBjZCBvb2R0LXNyYzsgbXZuIHBhY2thZ2UKK1JVTiBta2RpciAvdXNyL3NyYy9vb2R0OyB0YXIgLXh2ZiAvdXNyL3NyYy9vb2R0LXNyYy9kaXN0cmlidXRpb24vdGFyZ2V0L29vZHQtZGlzdHJpYnV0aW9uLTAuMS1iaW4udGFyLmd6IC1DIC91c3Ivc3JjL29vZHQKKworRVhQT1NFIDgwODAKK0VYUE9TRSA5MDAwCitFWFBPU0UgMjAwMQorRVhQT1NFIDkwMDEKK0VYUE9TRSA5MjAwCitFWFBPU0UgOTAwMgorCitDTUQgY2QgL3Vzci9zcmMvb29kdC9iaW4vICYmIC4vb29kdCBzdGFydCAmJiB0YWlsIC1mIC91c3Ivc3JjL29vZHQvdG9tY2F0L2xvZ3MvY2F0YWxpbmEub3V0IApkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3BvbS54bWwgYi8wLjEwL2ZpbGVtZ3IvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTZlODU0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3BvbS54bWwKQEAgLTAsMCArMSwzMDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGFydGlmYWN0SWQ+Y2FzLWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkNhdGFsb2cgYW5kIEFyY2hpdmUgRmlsZSBNYW5hZ2VtZW50IENvbXBvbmVudDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlRoZSBmaWxlIG1hbmFnZW1lbnQgY29tcG9uZW50IG9mIGEgQ2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2aWNlLiBUaGlzIGNvbXBvbmVudAorICAgICBwdXJwb3NlZnVsbHkgc2VwYXJhdGVzIGRhdGEgc3RvcmVzIGFuZCBtZXRhZGF0YSBzdG9yZXMgYXMgc3RhbmRhcmQgaW50ZXJmYWNlcywgYW5kCisgICAgIHByb3ZpZGVzIHNvbWUgb3V0IG9mIHRoZSBib3ggYmFja2VuZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlbSAoaW5jbHVkaW5nIG9uZSBiYXNlZAorICAgICBvbiB0aGUgamF2YXguc3FsLkRhdGFTb3VyY2UgaW50ZXJmYWNlKS4gVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgZXZlcnl0aGluZyB0aGF0IHlvdSBuZWVkCisgICAgIHRvIGNhdGFsb2csIGFyY2hpdmUgYW5kIG1hbmFnZSBmaWxlcywgYW5kIGRpcmVjdG9yaWVzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZCBtZXRhZGF0YS48L2Rlc2NyaXB0aW9uPgorICA8c2NtPgorICAgCTxjb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL2ZpbGVtZ3I8L2Nvbm5lY3Rpb24+CisgICAJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvZmlsZW1ncjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgIAk8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyL2ZpbGVtZ3I8L3VybD4KKyAgPC9zY20+CisgIDxidWlsZD4KKyAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2ZpbmFsTmFtZT4KKyAgICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5PnRhcmdldC90ZXN0LWNsYXNzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+CisgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdC9qYXZhPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+CisgICAgICA8cmVzb3VyY2VzPgorICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKjwvZXhjbHVkZT4KKyAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L3Jlc291cmNlPgorICAgICAgPC9yZXNvdXJjZXM+CisgICAgICA8dGVzdFJlc291cmNlcz4KKyAgICAgICAgPHRlc3RSZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT4qKi8qPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8IS0tdGFyZ2V0UGF0aD4ke3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L2NsYXNzZXMvPC90YXJnZXRQYXRoLS0+CisgICAgICA8L3Rlc3RSZXNvdXJjZT4KKyAgICA8L3Rlc3RSZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLWZvcmtNb2RlPnBlcnRlc3Q8L2ZvcmtNb2RlLS0+CisgICAgICAgICAgPGZvcmtNb2RlPm5vbmU8L2ZvcmtNb2RlPiA8IS0tIHNvIHdlIGNhbiBERUJVRyAtLT4KKyAgICAgICAgICA8YXJnTGluZT4tZW5hYmxlYXNzZXJ0aW9uczwvYXJnTGluZT4KKyAgICAgICAgICA8dXNlU3lzdGVtQ2xhc3NMb2FkZXI+ZmFsc2U8L3VzZVN5c3RlbUNsYXNzTG9hZGVyPgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDxuYW1lPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPC9uYW1lPgorICAgICAgICAgICAgICAgPHZhbHVlPnNyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmxvZ2dpbmcucHJvcGVydGllczwvdmFsdWU+CisgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICA8Zm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+MDwvZm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+CisgICAgICAgICAgIDxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ8L21haW5DbGFzcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3Rlc3RkYXRhLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovdGVzdGRhdGEvKiovKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgPC9wcm9maWxlcz4KKyAgPHJlcG9zaXRvcmllcz4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgPHNuYXBzaG90cz4KKyAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+CisgICAgICAgIDwvc25hcHNob3RzPgorICAgICAgICA8cmVsZWFzZXM+CisgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgorICAgICAgICA8L3JlbGVhc2VzPgorICAgICAgICA8aWQ+c29uYXR5cGUtbmV4dXM8L2lkPgorICAgICAgICA8dXJsPmh0dHBzOi8vb3NzLnNvbmF0eXBlLm9yZy9jb250ZW50L2dyb3Vwcy9wdWJsaWM8L3VybD4KKyAgICA8L3JlcG9zaXRvcnk+CisgIDwvcmVwb3NpdG9yaWVzPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlrYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnRpa2EtcGFyc2VyczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPiAgICAKKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtbWV0YWRhdGE8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1jbGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4gICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEwLjAuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kYmNwPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kYmNwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1wb29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1wb29sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4gIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+ICAgIAorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jbGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zb2xyPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zb2xyLXNvbHJqPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMDwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubHVjZW5lPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bHVjZW5lLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc29scjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNvbHItbHVjZW5lLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc29scjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c29sci1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMDwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubHVjZW5lPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bHVjZW5lLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc29scjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNvbHItbHVjZW5lLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPndzdHgtYXNsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+d29vZHN0b3g8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubHVjZW5lPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bHVjZW5lLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjAuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc2FmZWhhdXMuanVnPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVnPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjA8L3ZlcnNpb24+CisgICAgICA8Y2xhc3NpZmllcj5hc2w8L2NsYXNzaWZpZXI+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+eG1scnBjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eG1scnBjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aHNxbGRiPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aHNxbGRiPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS44LjAuNzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcucHl0aG9uPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anl0aG9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4yLWJldGExPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm15c3FsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bXlzcWwtY29ubmVjdG9yLWphdmE8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj41LjEuMjY8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCTxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmFtYXpvbmF3czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmF3cy1qYXZhLXNkazwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNy40PC92ZXJzaW9uPgorCTwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisJPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS45LjU8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisJPC9kZXBlbmRlbmN5PgorCTxkZXBlbmRlbmN5PgorCSAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorCSAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtYWxsPC9hcnRpZmFjdElkPgorCSAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjUwOTAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApAQCAtMCwwICsxLDk3IEBACis8IS0tIAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyRJZCQKKy0tPg0KKzxhc3NlbWJseT4NCisgIDxpZD5kaXN0PC9pZD4NCisgIDxmb3JtYXRzPg0KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQorICA8L2Zvcm1hdHM+CisgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4NCisgIDxmaWxlU2V0cz4NCisgICAgPGZpbGVTZXQ+DQorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+DQorICAgICAgPG91dHB1dERpcmVjdG9yeT4uPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQorICAgICAgICA8aW5jbHVkZT5DSEFOR0VTLnR4dDwvaW5jbHVkZT4NCisgICAgICA8L2luY2x1ZGVzPg0KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vYmluPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmJpbjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzLz4KKyAgICAgIDxmaWxlTW9kZT43NTU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bG9nczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5SRU1PVkUubG9nPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmV0Yzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5maWxlbWdyLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPmxvZ2dpbmcucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+bWltZS10eXBlcy54bWw8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPnNjaGVtYS54bWw8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPmNtZC1saW5lLWFjdGlvbnMueG1sPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5jbWQtbGluZS1vcHRpb25zLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5wb2xpY3k8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc2l0ZS9hcGlkb2NzPC9kaXJlY3Rvcnk+CisgICAgICA8ZmlsdGVyZWQ+ZmFsc2U8L2ZpbHRlcmVkPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0Pg0KKyAgPC9maWxlU2V0cz4NCisgIDxkZXBlbmRlbmN5U2V0cz4NCisgICAgPGRlcGVuZGVuY3lTZXQ+DQorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4NCisgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+CisgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPnRydWU8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+DQorICAgICAgPHVucGFja09wdGlvbnMvPg0KKyAgICA8L2RlcGVuZGVuY3lTZXQ+DQorICA8L2RlcGVuZGVuY3lTZXRzPg0KKzwvYXNzZW1ibHk+DQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Jpbi9jb252ZXJ0X21hcCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vY29udmVydF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTJjODA4MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vY29udmVydF9tYXAKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL2Jhc2gKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKyMKKyMgVXNhZ2U6IGNvbnZlcnRfbWFwIFtwcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sXQorCithd2sgJ3tGUz0iXCIifSAvcGFyZW50LyB7cHJpbnQgIiAgPHR5cGUgaWQ9XCIiICQyICJcIj4iOyBwcmludCAiICAgICAgPHBhcmVudCBpZD1cIiIgJDQgIlwiLz4ifSBcCisgICAgJDAhfi9wYXJlbnQvIHtwcmludCAkMH0nICQxCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vYmluL2ZpbGVtZ3IgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vYmluL2ZpbGVtZ3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0OWRlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vZmlsZW1ncgpAQCAtMCwwICsxLDkyIEBACisjIS9iaW4vc2gKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKyMKKyMgaW5pdCBzY3JpcHQgZm9yIFhtbFJwY0ZpbGVNYW5hZ2VyCisjCisjIGNoa2NvbmZpZzogMzQ1IDg4IDIyCisjIGRlc2NyaXB0aW9uOiBDQVMgRmlsZSBNYW5hZ2VyCisjCisKK1sgLWYgL2V0Yy9zeXNjb25maWcvamF2YSBdICYmIC4gL2V0Yy9zeXNjb25maWcvamF2YQorCitTRVJWRVJfUE9SVD05MDAwCitleHBvcnQgU0VSVkVSX1BPUlQKKworaWYgWyAteiAkSkFWQV9IT01FIF0gOyB0aGVuCisJSkFWQV9IT01FPS9wYXRoL3RvL2phdmEvaG9tZQorZWxzZQorCUpBVkFfSE9NRT0ke0pBVkFfSE9NRX0KK2ZpCisKK2V4cG9ydCBKQVZBX0hPTUUKK0NBU19GSUxFTUdSX0hPTUU9Li4KK2V4cG9ydCBDQVNfRklMRU1HUl9IT01FCitSVU5fSE9NRT0ke0NBU19GSUxFTUdSX0hPTUV9Ly4uL3J1bgorZXhwb3J0IFJVTl9IT01FCitDQVNfRklMRU1HUl9QUk9QUz0uLi9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzCitleHBvcnQgQ0FTX0ZJTEVNR1JfUFJPUFMKKworUEFUSD0ke0pBVkFfSE9NRX0vYmluOiR7Q0FTX0ZJTEVNR1JfSE9NRX0vYmluOi91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluCitleHBvcnQgUEFUSAorCisjIyBtYWtlIHN1cmUgdGhhdCBjYXNmaWxlIG1hbmFnZXIgaGFzIGEgcnVuIGRpcmVjdG9yeQorIyMganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCitta2RpciAtcCAke1JVTl9IT01FfQorCitmb3IgZmlsZSBpbiBgZmluZCAuLi9saWIvKi5qYXJgOyBkbworICAgICBMSUJfREVQUz0iJHtmaWxlfToke0xJQl9ERVBTfSIKK2RvbmUKKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorICAgICAgICBlY2hvIC1uICJTdGFydGluZyBjYXMgZmlsZSBtYW5hZ2VyOiAiCisgICAgICAgICRKQVZBX0hPTUUvYmluL2phdmEgXAorICAgICAgICAJLWNwICR7TElCX0RFUFN9IFwKKyAgICAgICAgCS1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9JHtDQVNfRklMRU1HUl9IT01FfS9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAJICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9JHtDQVNfRklMRU1HUl9QUk9QU30gXAorICAgICAgICAJb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlciBcCisgICAgICAgIAktLXBvcnROdW0gJFNFUlZFUl9QT1JUICYgICAgICAgCisgICAgICAgIGVjaG8gJCEgPiAke1JVTl9IT01FfS9jYXMuZmlsZW1nci5waWQgCisgICAgICAgIGVjaG8gIk9LIgorICAgICAgICBzbGVlcCA1CisgICAgICAgIDs7CisgIHN0b3ApCisgICAgICAgIGVjaG8gLW4gIlNodXR0aW5nIGRvd24gY2FzIGZpbGUgbWFuYWdlcjogIgorICAgICAgICBraWxsIGBjYXQgJHtSVU5fSE9NRX0vY2FzLmZpbGVtZ3IucGlkYAorICAgICAgICBybSAtZiAke1JVTl9IT01FfS9jYXMuZmlsZW1nci5waWQKKyAgICAgICAgZWNobyAiT0siCisgICAgICAgIDs7CisgIHJlc3RhcnQpCisgICAgICAgICQwIHN0b3AKKyAgICAgICAgJDAgc3RhcnQKKyAgICAgICAgOzsKKyAgc3RhdHVzKQorICAgICAgICBpZiBbIC1lICR7UlVOX0hPTUV9L2Nhcy5maWxlbWdyLnBpZCBdIDsgdGhlbgorICAgICAgICAgICBwaWQ9YGNhdCAke1JVTl9IT01FfS9jYXMuZmlsZW1nci5waWRgCisgICAgICAgICAgIGVjaG8gImNhcyBmaWxlbWdyIGlzIHJ1bm5pbmcgd2l0aCBwaWQ6ICRwaWQiIAorICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gImNhcyBmaWxlbWdyIGlzIG5vdCBydW5uaW5nIgorICAgICAgICBmaQorICAgICAgICA7OworICAqKQorICAgICAgICBlY2hvICJVc2FnZTogJDAge3N0YXJ0fHN0b3B8cmVzdGFydHxzdGF0dXN9IgorICAgICAgICBleGl0IDEKK2VzYWMKKworZXhpdCAwCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vYmluL2ZpbGVtZ3ItY2xpZW50IGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Jpbi9maWxlbWdyLWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M2N2RkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Jpbi9maWxlbWdyLWNsaWVudApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKyMKK2lmIFsgLXogJEpBVkFfSE9NRSBdIDsgdGhlbgorCUpBVkFfSE9NRT0vcGF0aC90by9qYXZhL2hvbWUKK2Vsc2UKKwlKQVZBX0hPTUU9JHtKQVZBX0hPTUV9CitmaQorCitleHBvcnQgSkFWQV9IT01FCisKK2ZvciBmaWxlIGluIGBmaW5kIC4uL2xpYi8qLmphcmA7IGRvCisgICAgIExJQl9ERVBTPSIke2ZpbGV9OiR7TElCX0RFUFN9IgorZG9uZQorCiskSkFWQV9IT01FL2Jpbi9qYXZhIFwKKwktY3AgJHtMSUJfREVQU30gXAorCS1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9Li4vZXRjL2ZpbGVtZ3IucHJvcGVydGllcyBcCisJLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKwktRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnPS4uL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBcCisJLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3ByaW5nLmNvbmZpZz0uLi9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwgXAorCW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgJCoKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vbWlncmF0ZV94bWxfcG9saWN5IGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Jpbi9taWdyYXRlX3htbF9wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDMzMTk3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vbWlncmF0ZV94bWxfcG9saWN5CkBAIC0wLDAgKzEsNjIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKyMKKyMgdGhpcyB0b29sIG1pZ3JhdGVzIGNhcy1maWxlbWdyIDEuNiBmb3JtYXQgc3BlY2lmaWMgdG8gdGhlIHZlcnNpb25lcgorIyBhbmQgcmVwb3NpdG9yeSBwYXRoIHRvIHRoZSAxLjcgZm9ybWF0CisjIEF1dGhvcjogSm9obiBUcmFuCisjCisjIHVzYWdlOgorIyAuL21pZ3JhdGVfeG1sX3BvbGljeQorIyAKKyMgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvZHVjdC10eXBlcy54bWwgZmlsZSBpcyBsb2NhdGVkLgorCitgL2Jpbi9jcCBwcm9kdWN0LXR5cGVzLnhtbCBwcm9kdWN0LXR5cGVzLnhtbC5zYXZlYDsKKworb3BlbihGUF9JTiwgJ3Byb2R1Y3QtdHlwZXMueG1sLnNhdmUnKTsKK29wZW4oRlBfT1VULCAnPnByb2R1Y3QtdHlwZXMueG1sJyk7CisKK3doaWxlKDxGUF9JTj4pIHsKKyAgJGxpbmUgPSAkXzsKKyAgCisgIGlmICgvdmVyc2lvbmVyQ2xhc3MvKSB7CisgICAgICR2ID0gJkdpdmVNZUNsZWFuKCRsaW5lKTsKKyAgICAgcHJpbnQgRlBfT1VUICIgICA8dmVyc2lvbmVyIGNsYXNzPVwiJHZcIiAvPlxuIjsKKyAgfSBlbHNpZiAoL3JlcG9zaXRvcnlQYXRoLykgeworICAgICAkcCA9ICZHaXZlTWVDbGVhbigkbGluZSk7CisgICAgIHByaW50IEZQX09VVCAiICAgPHJlcG9zaXRvcnkgcGF0aD1cIiRwXCIgLz5cbiI7CisgIH0gZWxzZSB7CisgICAgIHByaW50IEZQX09VVCAkbGluZTsKKyAgfQorCit9CisKK2Nsb3NlIEZQX0lOOworY2xvc2UgRlBfT1VUOworCisxOworCitzdWIgR2l2ZU1lQ2xlYW4geworICAgJGxpbmUgPSBzaGlmdDsKKyAgICRsaW5lID1+IHMvXHMvL2c7CisgICAkbGluZSA9fiBzL1w+LyAvZzsKKyAgICRsaW5lID1+IHMvXDwvIC9nOworCisgICBAYSA9IHNwbGl0KC8gLywgJGxpbmUpOworICAgcHJpbnQgIkxJTkU6ICRsaW5lIFxuIjsKKyAgIHJldHVybiAkYVsyXTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vcXVlcnlfdG9vbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9iaW4vcXVlcnlfdG9vbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjYxMGNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2Jpbi9xdWVyeV90b29sCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIy8qCisjICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAqCisjICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAqCisjICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAqLworIworIyMjIyMjIyMjIyMjIFJFQURNRSAtIElNUE9SVEFOVCAjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkLi4uIHVzZSBTcWxRdWVyeSBhbmQgTHVjZW5lUXVlcnkgYWN0aW9ucyBpbnN0ZWFkLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJEpBVkFfSE9NRS9iaW4vamF2YSAtRGphdmEuZXh0LmRpcnM9Li4vbGliIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29scy5RdWVyeVRvb2wgIiRAIgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmNhMjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9DYXRhbG9nLmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlBhZ2luYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBDYXRhbG9nIGlzIHRoZSBmcm9udCBlbmQgb2JqZWN0IGludGVyZmFjZSBmb3IgYSBiYWNrIGVuZCBwZXJpc3RhbmNlIGxheWVyCisgKiBmb3Igc3RvcmluZyBwcm9kdWN0IHJlZmVyZW5jZXMgYW5kIG1ldGFkYXRhLiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzCisgKiBpbnRlcmZhY2UgaW1wbGVtZW50IG1ldGhvZHMgdG8gcmV0cmlldmUgYW5kIHN0b3JlIHByb2R1Y3QgcmVmZXJlbmNlcyBhbmQKKyAqIG1ldGFkYXRhIGZyb20gYSBwYXJ0aWN1bGFyIGJhY2tlbmQgcmVwb3NpdG9yeS4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIENhdGFsb2cgZXh0ZW5kcyBQYWdpbmF0aW9uIHsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhfUE9JTlRfSUQgPSBDYXRhbG9nLmNsYXNzLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEluZ2VzdHMge0BsaW5rIE1ldGFkYXRhfSBpbnRvIHRoZSBtZXRhZGF0YSBzdG9yZSwgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aAorICAgICAqIHRoZSBnaXZlbiA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBNZXRhZGF0YX0gdG8gaW5nZXN0LgorICAgICAqIEBwYXJhbSBwcm9kdWN0CisgICAgICogICAgICAgICAgICBUaGUgcHJvZHVjdCB0byBhZGQgdGhlIG1ldGFkYXRhIGZvci4KKyAgICAgKiBAdGhyb3dzIENhdGFsb2dFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZ2VuZXJhbCBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWV0YWRhdGEoTWV0YWRhdGEgbSwgUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBSZW1vdmVzIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUgbWV0YWRhdGEgc3RvcmUsIGFuZCBkaXNhc3NvY2lhdGVzIGl0CisgICAgICogZnJvbSB0aGUgZ2l2ZW4gPGNvZGU+cHJvZHVjdElkPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG0KKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgTWV0YWRhdGF9IHRvIHJlbW92ZS4KKyAgICAgKiBAcGFyYW0gcHJvZHVjdAorICAgICAqICAgICAgICAgICAgVGhlIHByb2R1Y3QgZm9yIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSByZW1vdmVkLgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBnZW5lcmFsIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXRhZGF0YShNZXRhZGF0YSBtLCBQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEFkZHMgYSBQcm9kdWN0IHRvIHRoZSBDYXRhbG9nLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdAorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBQcm9kdWN0fSB0byBhZGQuCisgICAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBNb2RpZmllcyBhbiBleGlzdGluZyBQcm9kdWN0IHdpdGhpbiB0aGUgQ2F0YWxvZy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcge0BsaW5rIFByb2R1Y3R9IGluZm9ybWF0aW9uIHRvIG1vZGlmeSB0aGUgZXhpc3RpbmcKKyAgICAgKiAgICAgICAgICAgIFByb2R1Y3Qgd2l0aC4KKyAgICAgKiBAdGhyb3dzIENhdGFsb2dFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIFJlbW92ZXMgYSB7QGxpbmsgUHJvZHVjdH0gZnJvbSB0aGUgQ2F0YWxvZy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAdGhyb3dzIENhdGFsb2dFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIFBlcnNpc3RzIHRoZSA8Y29kZT50cmFuc2ZlclN0YXR1czwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBQcm9kdWN0fSB0byB0aGUgQ2F0YWxvZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdAorICAgICAqICAgICAgICAgICAgVGhlIFByb2R1Y3Qgd2hvc2UgdHJhbnNmZXIgc3RhdHVzIHdpbGwgYmUgcGVyc2lzdGVkLiBUaGUKKyAgICAgKiAgICAgICAgICAgIGNhbGxlciBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIHByb2R1Y3QgSUQgZmllbGQgaXMgc2V0LgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RUcmFuc2ZlclN0YXR1cyhQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFJlZmVyZW5jZX1zIHRvIHRoZQorICAgICAqIHtAbGluayBDYXRhbG9nfSwgYW5kIGFzc29jaWF0ZXMgdGhlbSB3aXRoIHRoaXMge0BsaW5rIFByb2R1Y3R9IHNwZWNpZmllZAorICAgICAqIGJ5IGl0cyA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdAorICAgICAqICAgICAgICAgICAgVGhlIHByb2R1Y3QgdG8gYWRkIHJlZmVyZW5jZXMgZm9yLiBUaGUgcmVmZXJlbmNlcyBhcmUgcmVhZAorICAgICAqICAgICAgICAgICAgZnJvbSB0aGUgUHJvZHVjdHMgbGlzdCBvZiBSZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueXRoaW5nIGdvZXMgd3JvbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEdldHMgYSB7QGxpbmsgUHJvZHVjdH0sIHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdElkCisgICAgICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIG9mIHRoZSBQcm9kdWN0IHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgUHJvZHVjdH0sIHdpdGggdGhlIGdpdmVuIElELiBUaGUgaW1wbGVtZW50ZXIgb2YgdGhpcworICAgICAqICAgICAgICAgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgcHJvZHVjdCB7QGxpbmsgUmVmZXJlbmNlfXMgYXJlCisgICAgICogICAgICAgICBwb3B1bGF0ZWQgYXMgd2VsbC4KKyAgICAgKiBAdGhyb3dzIENhdGFsb2dFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogR2V0cyBhIHtAbGluayBQcm9kdWN0fSB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+cHJvZHVjdE5hbWU8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBQcm9kdWN0IHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgUHJvZHVjdH0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVGhlIGltcGxlbWVudGVyIG9mIHRoaXMKKyAgICAgKiAgICAgICAgIG1ldGhvZCBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHByb2R1Y3Qge0BsaW5rIFJlZmVyZW5jZX1zIGFyZQorICAgICAqICAgICAgICAgcG9wdWxhdGVkIGFzIHdlbGwuCisgICAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogR2V0cyB0aGUge0BsaW5rIFJlZmVyZW5jZX1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByb2R1Y3QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9kdWN0CisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3R9IHRvIG9idGFpbiB0aGUgUmVmZXJlbmNlcyBmb3IuCisgICAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUmVmZXJlbmNlfXMsIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBQcm9kdWN0LgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEdldHMgYWxsIHRoZSB7QGxpbmsgUHJvZHVjdH1zIGluIHRoZSB7QGxpbmsgQ2F0YWxvZ30uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3R9cyBpbiB0aGUge0BsaW5rIENhdGFsb2d9LgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEdldHMgdGhlIHtAbGluayBQcm9kdWN0fXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUHJvZHVjdFR5cGUgaW4KKyAgICAgKiB0aGUge0BsaW5rIENhdGFsb2d9LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBQcm9kdWN0VHlwZX0gdG8gb2J0YWluIHRoZSB7QGxpbmsgUHJvZHVjdH1zIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBQcm9kdWN0fXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHByb2R1Y3RUeXBlIGluIHRoZSB7QGxpbmsgQ2F0YWxvZ30uCisgICAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogR2V0cyB0aGUgTWV0YWRhdGEgZm9yIGEgZ2l2ZW4gUHJvZHVjdC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3QKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgUHJvZHVjdH0gdG8gb2J0YWluIHRoZSBNZXRhZGF0YSBmb3IuCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIE1ldGFkYXRhfSBmb3IgdGhlIGdpdmVuIDxjb2RlPnByb2R1Y3RJZDwvY29kZT4uCisgICAgICogICAgICAgICA8L3A+CisgICAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEdldHMgYSByZWR1Y2VkIHNldCBvZiBtZXRhZGF0YSBmb3IgYSBnaXZlIFByb2R1Y3QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9kdWN0CisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3R9IHRvIG9idGFpbiB0aGUgTWV0YWRhdGEgZm9yLgorICAgICAqIEBwYXJhbSBlbGVtZW50cworICAgICAqICAgICAgICAgICAgVGhlIHNldCBvZiBtZXRhZGF0YSBlbGVtZW50cyBvZiBpbnRlcmVzdC4KKyAgICAgKiBAcmV0dXJuIFRoZSByZWR1Y2VkIHtAbGluayBNZXRhZGF0YX0gZm9yIHRoZSBnaXZlbiA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGdldFJlZHVjZWRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsIExpc3Q8U3RyaW5nPiBlbGVtZW50cykKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogUXVlcmllcyB0aGUgQ2F0YWxvZyB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIFF1ZXJ5fQorICAgICAqIDwvcD4uCisgICAgICogCisgICAgICogQHBhcmFtIHF1ZXJ5CisgICAgICogICAgICAgICAgICBUaGUgc2V0IG9mIGNyaXRlcmlhIGJ5IHdoaWNoIHRvIHF1ZXJ5IHRoZSBDYXRhbG9nLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3RUeXBlfSB0aGF0IHNob3VsZCBiZSBxdWVyaWVkLgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2YgU3RyaW5nIHByb2R1Y3QgSURzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUKKyAgICAgKiAgICAgICAgIHByb2R1Y3RzIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5LgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBxdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBQZXJmb3JtcyBhIHF1ZXJ5IGFnYWluc3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIENhdGFsb2d9LCBhbmQgdGhlbgorICAgICAqIHByb3Blcmx5IGZvcm11bGF0ZXMgYSBwYWdlIG9mIHJlc3VsdHMgdG8gc2VuZCBiYWNrIHRvIHRoZSB1c2VyLiBUaGlzCisgICAgICogbWV0aG9kIGlzIHVzZWZ1bCB3aGVuIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnNlcnZlIG1lbW9yeSBhbmQgbm90IHNlbmQgYmFjaworICAgICAqIHRoZSBlbnRpcmUgbGlzdCBvZiByZXN1bHRzLCBub3IgbG9hZCB0aGVtIGludG8gbWVtb3J5LiBPZiBjb3Vyc2UsIHRoaXMKKyAgICAgKiBtZXRob2QgYXNzdW1lcyB0aGF0IHF1ZXJpZXMgYXJlIGRldGVybWluaXN0aWMsIGkuZS4sIHRoZSBzYW1lIHF1ZXJ5CisgICAgICogaXNzdWVkIDJ4IHdpdGhpbiBhIHBhZ2luYXRpbmcgc2Vzc2lvbiB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgc2V0IG9mCisgICAgICogcmVzdWx0cyB0byBwYWdpbmF0ZS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHF1ZXJ5CisgICAgICogICAgICAgICAgICBUaGUgcXVlcnkgdG8gcGVyZm9ybSBhZ2FpbnN0IHRoZSB1bmRlcmx5aW5nIENhdGFsb2cuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgUHJvZHVjdFR5cGV9IHRoYXQgeW91IGFyZSBxdWVyeWluZyBmb3IuCisgICAgICogQHBhcmFtIHBhZ2VOdW0KKyAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgdGhlIHtAbGluayBQcm9kdWN0UGFnZX0gdG8gcmV0dXJuIGJhY2sgdG8gdGhlCisgICAgICogICAgICAgICAgICB1c2VyLgorICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCB7QGxpbmsgUHJvZHVjdFBhZ2V9IG9mIHJlc3VsdHMuCisgICAgICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgcGFnZWRRdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSwgaW50IHBhZ2VOdW0pCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEdldHMgdGhlIHRvcCA8Y29kZT5OPC9jb2RlPiBtb3N0IHJlY2VudCBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbgorICAgICAqIGNhdGFsb2dlZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG4KKyAgICAgKiAgICAgICAgICAgIFRoZSBhbW91bnQgb2YgcmVjZW50IHByb2R1Y3RzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBQcm9kdWN0fXMgdGhhdCBoYXZlIGJlZW4gY2F0YWxvZ2VkCisgICAgICogICAgICAgICByZWNlbnRseS4KKyAgICAgKiBAdGhyb3dzIENhdGFsb2dFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFRvcE5Qcm9kdWN0cyhpbnQgbikgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBHZXRzIHRoZSB0b3AgPGNvZGU+TjwvY29kZT4gbW9zdCByZWNlbnQgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4KKyAgICAgKiBjYXRhbG9nZWQgZm9yIHRoZSBnaXZlbiB7QGxpbmsgUHJvZHVjdFR5cGV9LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbgorICAgICAqICAgICAgICAgICAgVGhlIGFtb3VudCBvZiByZWNlbnQgcHJvZHVjdHMgdG8gcmV0dXJuLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICBUaGUgUHJvZHVjdFR5cGUgdG8gbGltaXQgdGhlIHF1ZXJ5IHRvLgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3R9cyB0aGF0IGhhdmUgYmVlbiBjYXRhbG9nZWQKKyAgICAgKiAgICAgICAgIHJlY2VudGx5LgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0VG9wTlByb2R1Y3RzKGludCBuLCBQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVmFsaWRhdGlvbkxheWVyfSB0aGF0IGlzIHVzZWQgYnkgdGhpcyBDYXRhbG9nLgorICAgICAqIEB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMgKGUuZy4sIHRoZSBsYXllciBpc24ndCBpbml0aWFsaXplZCkuCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25MYXllciBnZXRWYWxpZGF0aW9uTGF5ZXIoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICBUaGUgUHJvZHVjdFR5cGUgdG8gY291bnQgdGhlIG51bWJlciBvZiBwcm9kdWN0cyBmb3IuCisgICAgICogQHJldHVybiBBbiBpbnRlZ2VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2Yge0BsaW5rIFByb2R1Y3R9cyBmb3IgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQge0BsaW5rIFByb2R1Y3RUeXBlfS4KKyAgICAgKiBAdGhyb3dzIENhdGFsb2dFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL0NhdGFsb2dGYWN0b3J5LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9DYXRhbG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTBmNzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9DYXRhbG9nRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBjcmVhdGluZyB7QGxpbmsgQ2F0YWxvZ31zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2F0YWxvZ0ZhY3RvcnkgeworCisJLyoqCisJICogQHJldHVybiBBIG5ldyB7QGxpbmsgQ2F0YWxvZ30gb2JqZWN0IGltcGxlbWVudGF0aW9uLgorCSAqLworCXB1YmxpYyBDYXRhbG9nIGNyZWF0ZUNhdGFsb2coKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL0RhdGFTb3VyY2VDYXRhbG9nLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9EYXRhU291cmNlQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWUyNjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9EYXRhU291cmNlQ2F0YWxvZy5qYXZhCkBAIC0wLDAgKzEsMjI5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2c7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuQm9vbGVhblF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuRGJTdHJ1Y3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnBhZ2luYXRpb24uUGFnaW5hdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRGF0ZUNvbnZlcnQ7CisKKy8vU1BSSU5HIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuU3RyaW5nVXRpbHM7CisKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbHVjYQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIENhdGFsb2d9IHRoYXQgaXMgYmFja2VkIGJ5IGEge0BsaW5rIERhdGFTb3VyY2V9CisgKiBmcm9udC1lbmQgdG8gYSBTUUwgREJNUy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUNhdGFsb2cgaW1wbGVtZW50cyBDYXRhbG9nIHsKKworICAgIC8qIG91ciBzcWwgZGF0YSBzb3VyY2UgKi8KKyAgICBwcm90ZWN0ZWQgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRGF0YVNvdXJjZUNhdGFsb2cuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciB2YWxpZGF0aW9uIGxheWVyICovCisgICAgcHJpdmF0ZSBWYWxpZGF0aW9uTGF5ZXIgdmFsaWRhdGlvbkxheWVyID0gbnVsbDsKKworICAgIC8qIGJvb2xlYW4gZmxhZyBvbiB3aGV0aGVyIG9yIG5vdCBwcm9kdWN0IHR5cGUgaWQgYW5kIGVsZW1lbnQgaWQgYXJlIHN0cmluZ3MgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWVsZElkU3RyaW5nRmxhZyA9IGZhbHNlOworCisgICAgLyogc2l6ZSBvZiBwYWdlcyBvZiBwcm9kdWN0cyB3aXRoaW4gdGhlIGNhdGFsb2cgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHBhZ2VTaXplID0gLTE7CisgICAgCisgICAgLyogZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSAicHJvZHVjdF9pZCIga2V5IHR5cGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcgKi8KKyAgICBib29sZWFuIHByb2R1Y3RJZFN0cmluZyA9IGZhbHNlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb3JkZXJlZFZhbHVlcyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBjYWNoZSBvZiBwcm9kdWN0cyBwZXIgcHJvZHVjdCB0eXBlOiBbcHJvZHVjdFR5cGVJZF09PihbSVNPODYwMSB0aW1lIG9mCisgICAgICogbGFzdCB1cGRhdGVdPT5bTGlzdCBvZiBwcm9kdWN0c10pCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVHJlZU1hcDxTdHJpbmcsIFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+PiBQUk9EVUNUX0NBQ0hFID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBUcmVlTWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKworICAgIC8qCisgICAgICogdGhlIGFtb3VudCBvZiBtaW51dGVzIGluYmV0d2VlbiB0aGUgdGltZSBpbiB3aGljaCB3ZSBzaG91bGQgdXBkYXRlIHRoZQorICAgICAqIFBST0RVQ1RfQ0FDSEUKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgY2FjaGVVcGRhdGVNaW51dGVzID0gMEw7CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisgICAgICogPC9wPi4KKyAgICAgKiBAdGhyb3dzICAKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YVNvdXJjZUNhdGFsb2coRGF0YVNvdXJjZSBkcywgVmFsaWRhdGlvbkxheWVyIHZhbExheWVyLAorCQkJICAgICBib29sZWFuIGZpZWxkSWQsIGludCBwYWdlU2l6ZSwgbG9uZyBjYWNoZVVwZGF0ZU1pbiwgYm9vbGVhbiBwcm9kdWN0SWRTdHJpbmcsIGJvb2xlYW4gb3JkZXJlZFZhbHVlcykgeworICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBkczsKKyAgICAgICAgdGhpcy52YWxpZGF0aW9uTGF5ZXIgPSB2YWxMYXllcjsKKyAgICAgICAgZmllbGRJZFN0cmluZ0ZsYWcgPSBmaWVsZElkOworICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICAgICAgIGNhY2hlVXBkYXRlTWludXRlcyA9IGNhY2hlVXBkYXRlTWluOworICAgICAgICB0aGlzLnByb2R1Y3RJZFN0cmluZyA9IHByb2R1Y3RJZFN0cmluZzsKKyAgICAgICAgdGhpcy5vcmRlcmVkVmFsdWVzID0gb3JkZXJlZFZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdGhhdCBhc3N1bWVzIHByb2R1Y3RJZFN0cmluZz1mYWxzZQorICAgICAqIHRvIHN1cHBvcnQgY3VycmVudCBzdWJjbGFzc2VzLgorICAgICAqIEBwYXJhbSBkcworICAgICAqIEBwYXJhbSB2YWxMYXllcgorICAgICAqIEBwYXJhbSBmaWVsZElkCisgICAgICogQHBhcmFtIHBhZ2VTaXplCisgICAgICogQHBhcmFtIGNhY2hlVXBkYXRlTWluCisgICAgICovCisgICAgcHVibGljIERhdGFTb3VyY2VDYXRhbG9nKERhdGFTb3VyY2UgZHMsIFZhbGlkYXRpb25MYXllciB2YWxMYXllciwKKyAgICAgICAgYm9vbGVhbiBmaWVsZElkLCBpbnQgcGFnZVNpemUsIGxvbmcgY2FjaGVVcGRhdGVNaW4pIHsKKyAgICAJdGhpcyhkcywgdmFsTGF5ZXIsIGZpZWxkSWQsIHBhZ2VTaXplLCBjYWNoZVVwZGF0ZU1pbiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjYWRkTWV0YWRhdGEob3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZE1ldGFkYXRhKE1ldGFkYXRhIG0sIFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxFbGVtZW50PiBtZXRhZGF0YVR5cGVzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YWRhdGFUeXBlcyA9IHZhbGlkYXRpb25MYXllci5nZXRFbGVtZW50cyhwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBvYnRhaW4gZWxlbWVudCBsaXN0IGZvciBwcm9kdWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yPEVsZW1lbnQ+IGkgPSBtZXRhZGF0YVR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gaS5uZXh0KCk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbS5nZXRBbGxNZXRhZGF0YShlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCisgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJObyBNZXRhZGF0YSBzcGVjaWZpZWQgZm9yIHByb2R1Y3QgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIl0gZm9yIHJlcXVpcmVkIGZpZWxkIFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogQXR0ZW1wdGluZyB0byBjb250aW51ZSBwcm9jZXNzaW5nIG1ldGFkYXRhIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBqID0gdmFsdWVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGoubmV4dCgpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWRkTWV0YWRhdGFWYWx1ZShlbGVtZW50LCBwcm9kdWN0LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGluZ2VzdGluZyBtZXRhZGF0YS4gRXJyb3IgaW5zZXJ0aW5nIGZpZWxkOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudElkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IEF0dGVtcHRpbmcgdG8gY29udGludWUgcHJvY2Vzc2luZyBtZXRhZGF0YSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2FkZE1ldGFkYXRhKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNZXRhZGF0YShNZXRhZGF0YSBtLCBQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8RWxlbWVudD4gbWV0YWRhdGFUeXBlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ldGFkYXRhVHlwZXMgPSB2YWxpZGF0aW9uTGF5ZXIuZ2V0RWxlbWVudHMocHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gb2J0YWluIGVsZW1lbnQgbGlzdCBmb3IgcHJvZHVjdCB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvcjxFbGVtZW50PiBpID0gbWV0YWRhdGFUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGkubmV4dCgpOworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG0uZ2V0QWxsTWV0YWRhdGEoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGogPSB2YWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGoubmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXRhZGF0YVZhbHVlKGVsZW1lbnQsIHByb2R1Y3QsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcmVtb3ZpbmcgbWV0YWRhdGEuIEVycm9yIGRlbGV0aW5nIGZpZWxkOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnRJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI9PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogQXR0ZW1wdGluZyB0byBjb250aW51ZSBwcm9jZXNzaW5nIG1ldGFkYXRhIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjYWRkUHJvZHVjdChvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgYWRkUHJvZHVjdFNxbCA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVJZFN0ciA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChmaWVsZElkU3RyaW5nRmxhZykgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlSWRTdHIgPSAiJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldFByb2R1Y3RUeXBlSWQoKSArICInIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVJZFN0ciA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRQcm9kdWN0VHlwZUlkKCk7CisgICAgICAgICAgICB9CisKKwkJCQkJCWlmIChwcm9kdWN0SWRTdHJpbmc9PWZhbHNlKSB7CisJCQkJCQkJCisJICAgICAgICAgICAgYWRkUHJvZHVjdFNxbCA9ICJJTlNFUlQgSU5UTyBwcm9kdWN0cyAocHJvZHVjdF9uYW1lLCBwcm9kdWN0X3N0cnVjdHVyZSwgcHJvZHVjdF90cmFuc2Zlcl9zdGF0dXMsIHByb2R1Y3RfdHlwZV9pZCkgIgorCSAgICAgICAgICAgICAgICArICJWQUxVRVMgKCciCisJICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpCisJICAgICAgICAgICAgICAgICsgIicsICciCisJICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkKKwkgICAgICAgICAgICAgICAgKyAiJywgJyIKKwkgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFRyYW5zZmVyU3RhdHVzKCkKKwkgICAgICAgICAgICAgICAgKyAiJywgIgorCSAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlSWRTdHIKKwkgICAgICAgICAgICAgICAgKyAiKSI7CisKKwkJCQkgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImFkZFByb2R1Y3Q6IEV4ZWN1dGluZzogIiArIGFkZFByb2R1Y3RTcWwpOworCQkJCSAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoYWRkUHJvZHVjdFNxbCk7CisJCQkJCisJCQkJICAgICAgICAvLyByZWFkICJwcm9kdWN0X2lkIiB2YWx1ZSB0aGF0IHdhcyBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGJ5IHRoZSBkYXRhYmFzZQorCQkJCSAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IG5ldyBTdHJpbmcoKTsKKwkJCQkKKwkJCQkgICAgICAgIFN0cmluZyBnZXRQcm9kdWN0SWRTcWwgPSAiU0VMRUNUIE1BWChwcm9kdWN0X2lkKSBBUyBtYXhfaWQgRlJPTSBwcm9kdWN0cyI7CisJCQkJCisJCQkJICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdElkU3FsKTsKKwkJCQkKKwkJCQkgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKwkJCQkgICAgICAgICAgICBwcm9kdWN0SWQgPSBTdHJpbmcudmFsdWVPZihycy5nZXRJbnQoIm1heF9pZCIpKTsKKwkJCQkgICAgICAgIH0KKwkJCQkgICAgICAgIAorCQkgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZChwcm9kdWN0SWQpOworCQkgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworCQkJCQkJCQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkKKwkJCQkJCQkvLyByZXVzZSB0aGUgZXhpc3RpbmcgcHJvZHVjdCBpZCBpZiBwb3NzaWJsZSwgb3IgZ2VuZXJhdGUgYSBuZXcgVVVJRCBzdHJpbmcKKyAgICAgICAgICAgIAlTdHJpbmcgcHJvZHVjdElkID0gcHJvZHVjdC5nZXRQcm9kdWN0SWQoKTsKKyAgICAgICAgICAgIAlpZiAoIVN0cmluZ1V0aWxzLmhhc1RleHQocHJvZHVjdElkKSkgcHJvZHVjdElkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIAkvLyBpbnNlcnQgcHJvZHVjdCBpbiBkYXRhYmFzZQorICAgICAgICAgICAgCWFkZFByb2R1Y3RTcWwgPSAiSU5TRVJUIElOVE8gcHJvZHVjdHMgKHByb2R1Y3RfaWQsIHByb2R1Y3RfbmFtZSwgcHJvZHVjdF9zdHJ1Y3R1cmUsIHByb2R1Y3RfdHJhbnNmZXJfc3RhdHVzLCBwcm9kdWN0X3R5cGVfaWQsIHByb2R1Y3RfZGF0ZXRpbWUpICIKKyAgICAgICAgICAgICAgICAgICAgKyAiVkFMVUVTICgnIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RJZAorICAgICAgICAgICAgICAgICAgICArICInLCAnIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICInLCAnIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpCisgICAgICAgICAgICAgICAgICAgICsgIicsICciCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRUcmFuc2ZlclN0YXR1cygpCisgICAgICAgICAgICAgICAgICAgICsgIicsICIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZUlkU3RyCisgICAgICAgICAgICAgICAgICAgICsiLCBub3coKSIKKyAgICAgICAgICAgICAgICAgICAgKyAiKSI7ICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgCUxPRy5sb2coTGV2ZWwuRklORSwgImFkZFByb2R1Y3Q6IEV4ZWN1dGluZzogIiArIGFkZFByb2R1Y3RTcWwpOworICAgICAgICAgICAgCXN0YXRlbWVudC5leGVjdXRlKGFkZFByb2R1Y3RTcWwpOworICAgICAgICAgICAgCQorICAgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZChwcm9kdWN0SWQpOworICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworCisJCQkJCQl9CisKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBhZGRpbmcgcHJvZHVjdC4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGFkZFByb2R1Y3QgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNtb2RpZnlQcm9kdWN0KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vZGlmeVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBtb2RpZnlQcm9kdWN0U3FsID0gIlVQREFURSBwcm9kdWN0cyBTRVQgcHJvZHVjdF9uYW1lPSciCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIicsIHByb2R1Y3Rfc3RydWN0dXJlPSciCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJywgcHJvZHVjdF90cmFuc2Zlcl9zdGF0dXM9JyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFRyYW5zZmVyU3RhdHVzKCkgKyAiJyAiCisgICAgICAgICAgICAgICAgICAgICsgIldIRVJFIHByb2R1Y3RfaWQgPSAiICsgcXVvdGVJdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuRklORSwgIm1vZGlmeVByb2R1Y3Q6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbW9kaWZ5UHJvZHVjdFNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShtb2RpZnlQcm9kdWN0U3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisKKyAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIHJlZnMKKyAgICAgICAgICAgIHVwZGF0ZVJlZmVyZW5jZXMocHJvZHVjdCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gbW9kaWZ5aW5nIHByb2R1Y3QuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBtb2RpZnlQcm9kdWN0IHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNyZW1vdmVQcm9kdWN0KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBkZWxldGVQcm9kdWN0U3FsID0gIkRFTEVURSBGUk9NIHByb2R1Y3RzIFdIRVJFIHByb2R1Y3RfaWQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgcXVvdGVJdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuRklORSwgInJlbW92ZVByb2R1Y3Q6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVsZXRlUHJvZHVjdFNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShkZWxldGVQcm9kdWN0U3FsKTsKKyAgICAgICAgICAgIGRlbGV0ZVByb2R1Y3RTcWwgPSAiREVMRVRFIEZST00gIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiX21ldGFkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgKyAiIFdIRVJFIHByb2R1Y3RfaWQgPSAiICsgcXVvdGVJdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLkZJTkUsICJyZW1vdmVQcm9kdWN0OiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlbGV0ZVByb2R1Y3RTcWwpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoZGVsZXRlUHJvZHVjdFNxbCk7CisgICAgICAgICAgICBkZWxldGVQcm9kdWN0U3FsID0gIkRFTEVURSBGUk9NICIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpICsgIl9yZWZlcmVuY2UgIgorICAgICAgICAgICAgICAgICAgICArICIgV0hFUkUgcHJvZHVjdF9pZCA9ICIgKyBxdW90ZUl0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuRklORSwgInJlbW92ZVByb2R1Y3Q6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVsZXRlUHJvZHVjdFNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShkZWxldGVQcm9kdWN0U3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gcmVtb3ZpbmcgcHJvZHVjdC4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIHJlbW92ZVByb2R1Y3QgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNzZXRQcm9kdWN0VHJhbnNmZXJTdGF0dXMob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgbW9kaWZ5UHJvZHVjdFNxbCA9ICJVUERBVEUgcHJvZHVjdHMgU0VUIHByb2R1Y3RfdHJhbnNmZXJfc3RhdHVzPSciCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRUcmFuc2ZlclN0YXR1cygpCisgICAgICAgICAgICAgICAgICAgICsgIicgIgorICAgICAgICAgICAgICAgICAgICArICJXSEVSRSBwcm9kdWN0X2lkID0gIiArIHF1b3RlSXQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgInNldFByb2R1Y3RUcmFuc2ZlclN0YXR1czogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgbW9kaWZ5UHJvZHVjdFNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShtb2RpZnlQcm9kdWN0U3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHNldHRpbmcgdHJhbnNmZXIgc3RhdHVzIGZvciBwcm9kdWN0LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBzZXRQcm9kdWN0VHJhbnNmZXJTdGF0dXMgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2FkZFByb2R1Y3RSZWZlcmVuY2VzKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RSZWZUYWJsZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICArICJfcmVmZXJlbmNlIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBpID0gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGkKKyAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2UgciA9IGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGFkZFJlZlNxbCA9ICJJTlNFUlQgSU5UTyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RSZWZUYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIihwcm9kdWN0X2lkLCBwcm9kdWN0X29yaWdfcmVmZXJlbmNlLCBwcm9kdWN0X2RhdGFzdG9yZV9yZWZlcmVuY2UsIHByb2R1Y3RfcmVmZXJlbmNlX2ZpbGVzaXplLCBwcm9kdWN0X3JlZmVyZW5jZV9taW1ldHlwZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiVkFMVUVTICgiCisgICAgICAgICAgICAgICAgICAgICAgICArIHF1b3RlSXQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgci5nZXRPcmlnUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicsICciCisgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgci5nZXRGaWxlU2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIsJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKChyLmdldE1pbWVUeXBlKCkgPT0gbnVsbCkgPyAiIiA6IHIuZ2V0TWltZVR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSArICInKSI7CisKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJhZGRQcm9kdWN0UmVmZXJlbmNlczogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGFkZFJlZlNxbCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoYWRkUmVmU3FsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBhZGRpbmcgcHJvZHVjdCByZWZlcmVuY2VzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBhZGRQcm9kdWN0UmVmZXJlbmNlcyB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldFByb2R1Y3RCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0UHJvZHVjdFNxbCA9ICJTRUxFQ1QgKiAiICsgIkZST00gcHJvZHVjdHMgIgorICAgICAgICAgICAgICAgICAgICArICJXSEVSRSBwcm9kdWN0X2lkID0gIiArIHF1b3RlSXQocHJvZHVjdElkKTsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0UHJvZHVjdEJ5SWQ6IEV4ZWN1dGluZzogIiArIGdldFByb2R1Y3RTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFByb2R1Y3RTcWwpOworCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdCA9IERiU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0KHJzLCBmYWxzZSwgcHJvZHVjdElkU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIHByb2R1Y3QuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRQcm9kdWN0QnlJZCB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRQcm9kdWN0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFByb2R1Y3RTcWwgPSAiU0VMRUNUIHByb2R1Y3RzLiogIiArICJGUk9NIHByb2R1Y3RzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiV0hFUkUgcHJvZHVjdF9uYW1lID0gJyIgKyBwcm9kdWN0TmFtZSArICInIjsKKworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuRklORSwgImdldFByb2R1Y3RCeU5hbWU6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJvZHVjdFNxbCk7CisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFNxbCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0ID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3QocnMsIGZhbHNlLCBwcm9kdWN0SWRTdHJpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgcHJvZHVjdC4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFByb2R1Y3RCeU5hbWUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjZ2V0UHJvZHVjdFJlZmVyZW5jZXMob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRQcm9kdWN0UmVmU3FsID0gIlNFTEVDVCAqIEZST00gIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiX3JlZmVyZW5jZSIKKwkJKyAiIFdIRVJFIHByb2R1Y3RfaWQgPSAiICsgcXVvdGVJdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKworICAgICAgICAgICAgaWYodGhpcy5vcmRlcmVkVmFsdWVzKSBnZXRQcm9kdWN0UmVmU3FsICs9ICIgT1JERVIgQlkgcGtleSI7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldFByb2R1Y3RSZWZlcmVuY2VzOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRQcm9kdWN0UmVmU3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRQcm9kdWN0UmVmU3FsKTsKKworICAgICAgICAgICAgcmVmZXJlbmNlcyA9IG5ldyBWZWN0b3I8UmVmZXJlbmNlPigpOworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZSByID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFJlZmVyZW5jZShycyk7CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlcy5hZGQocik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBwcm9kdWN0IHR5cGUuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRQcm9kdWN0VHlwZUJ5SWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVmZXJlbmNlczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjZ2V0UHJvZHVjdHMoKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFByb2R1Y3RzKCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFByb2R1Y3RTcWwgPSAiU0VMRUNUIHByb2R1Y3RzLiogIiArICJGUk9NIHByb2R1Y3RzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiT1JERVIgQlkgcHJvZHVjdHMucHJvZHVjdF9pZCBERVNDIjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0UHJvZHVjdHM6IEV4ZWN1dGluZzogIiArIGdldFByb2R1Y3RTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFByb2R1Y3RTcWwpOworICAgICAgICAgICAgcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdChycywgZmFsc2UsIHByb2R1Y3RJZFN0cmluZyk7CisgICAgICAgICAgICAgICAgcHJvZHVjdHMuYWRkKHByb2R1Y3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJvZHVjdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0cyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBwcm9kdWN0cy4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFByb2R1Y3RzdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldFByb2R1Y3RzQnlQcm9kdWN0VHlwZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRQcm9kdWN0U3FsID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZUlkU3RyID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVJZFN0ciA9ICInIiArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIiciOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZUlkU3RyID0gdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgPSAiU0VMRUNUIHByb2R1Y3RzLiogIiArICJGUk9NIHByb2R1Y3RzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiV0hFUkUgcHJvZHVjdHMucHJvZHVjdF90eXBlX2lkID0gIiArIHByb2R1Y3RUeXBlSWRTdHI7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZTogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJvZHVjdFNxbCk7CisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFNxbCk7CisgICAgICAgICAgICBwcm9kdWN0cyA9IG5ldyBWZWN0b3I8UHJvZHVjdD4oKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IERiU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0KHJzLCBmYWxzZSwgcHJvZHVjdElkU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBwcm9kdWN0cy5hZGQocHJvZHVjdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm9kdWN0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIHByb2R1Y3RzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RzOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIE1ldGFkYXRhIG0gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgbWV0YWRhdGFTcWwgPSAiU0VMRUNUICogRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSArICJfbWV0YWRhdGEiCisJCSsgIiBXSEVSRSBwcm9kdWN0X2lkID0gIiArIHF1b3RlSXQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgCisJICAgIGlmKHRoaXMub3JkZXJlZFZhbHVlcykgbWV0YWRhdGFTcWwgKz0gIiBPUkRFUiBCWSBwa2V5IjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0TWV0YWRhdGE6IEV4ZWN1dGluZzogIiArIG1ldGFkYXRhU3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShtZXRhZGF0YVNxbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gdmFsaWRhdGlvbkxheWVyLmdldEVsZW1lbnRzKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIG9idGFpbiBlbGVtZW50IGxpc3QgZm9yIHByb2R1Y3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxFbGVtZW50PiBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0IG5vdywgd2UganVzdCBzdXBwb3J0IFNUUklORworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbVZhbHVlID0gcnMuZ2V0U3RyaW5nKCJtZXRhZGF0YV92YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbUlkID0gcnMuZ2V0U3RyaW5nKCJlbGVtZW50X2lkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1JZC5lcXVhbHMoZS5nZXRFbGVtZW50SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1WYWx1ZSA9IChlbGVtVmFsdWUgIT0gbnVsbCA/IGVsZW1WYWx1ZSA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uYWRkTWV0YWRhdGEoZS5nZXRFbGVtZW50TmFtZSgpLCBlbGVtVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgbWV0YWRhdGEuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0UmVkdWNlZE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCwgTGlzdDxTdHJpbmc+IGVsZW1zKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICBNZXRhZGF0YSBtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRJZHMgPSAiIjsKKyAgICAgICAgICAgIGlmIChlbGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudElkcyArPSAiIEFORCAoZWxlbWVudF9pZCA9ICciICsgdGhpcy52YWxpZGF0aW9uTGF5ZXIuZ2V0RWxlbWVudEJ5TmFtZShlbGVtcy5nZXQoMCkpLmdldEVsZW1lbnRJZCgpICsgIiciOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZWxlbXMuc2l6ZSgpOyBpKyspIAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRzICs9ICIgT1IgZWxlbWVudF9pZCA9ICciICsgdGhpcy52YWxpZGF0aW9uTGF5ZXIuZ2V0RWxlbWVudEJ5TmFtZShlbGVtcy5nZXQoaSkpLmdldEVsZW1lbnRJZCgpICsgIiciOworICAgICAgICAgICAgICAgIGVsZW1lbnRJZHMgKz0gIikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIG1ldGFkYXRhU3FsID0gIlNFTEVDVCBlbGVtZW50X2lkLG1ldGFkYXRhX3ZhbHVlIEZST00gIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIgorCQkrICIgV0hFUkUgcHJvZHVjdF9pZCA9ICIgKyBxdW90ZUl0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpICsgZWxlbWVudElkczsKKyAgICAgICAgICAgIGlmKHRoaXMub3JkZXJlZFZhbHVlcykgbWV0YWRhdGFTcWwgKz0gIiBPUkRFUiBCWSBwa2V5IjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0TWV0YWRhdGE6IEV4ZWN1dGluZzogIiArIG1ldGFkYXRhU3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShtZXRhZGF0YVNxbCk7CisKKyAgICAgICAgICAgIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gdmFsaWRhdGlvbkxheWVyLmdldEVsZW1lbnRzKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIG9idGFpbiBlbGVtZW50IGxpc3QgZm9yIHByb2R1Y3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxFbGVtZW50PiBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0IG5vdywgd2UganVzdCBzdXBwb3J0IFNUUklORworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbVZhbHVlID0gcnMuZ2V0U3RyaW5nKCJtZXRhZGF0YV92YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbUlkID0gcnMuZ2V0U3RyaW5nKCJlbGVtZW50X2lkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1JZC5lcXVhbHMoZS5nZXRFbGVtZW50SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1WYWx1ZSA9IChlbGVtVmFsdWUgIT0gbnVsbCA/IGVsZW1WYWx1ZSA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uYWRkTWV0YWRhdGEoZS5nZXRFbGVtZW50TmFtZSgpLCBlbGVtVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgbWV0YWRhdGEuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNxdWVyeShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeQorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBxdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFnaW5hdGVRdWVyeShxdWVyeSwgdHlwZSwgLTEpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRUb3BOUHJvZHVjdHMoaW50KQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFRvcE5Qcm9kdWN0cyhpbnQgbikgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0VG9wTlByb2R1Y3RzKG4sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRUb3BOUHJvZHVjdHMoaW50LAorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAgICovCisgICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0VG9wTlByb2R1Y3RzKGludCBuLCBQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbnVsbDsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuc2V0TWF4Um93cyhuKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFByb2R1Y3RTcWwgPSAiU0VMRUNUIHByb2R1Y3RzLiogIiArICJGUk9NIHByb2R1Y3RzICI7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZElkU3RyaW5nRmxhZykgeworICAgICAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsICs9ICJXSEVSRSBwcm9kdWN0cy5wcm9kdWN0X3R5cGVfaWQgPSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiJyAiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgKz0gIldIRVJFIHByb2R1Y3RzLnByb2R1Y3RfdHlwZV9pZCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIiAiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRQcm9kdWN0U3FsICs9ICJPUkRFUiBCWSBwcm9kdWN0cy5wcm9kdWN0X2lkIERFU0MiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRUb3BOUHJvZHVjdHM6IGV4ZWN1dGluZzogIiArIGdldFByb2R1Y3RTcWwpOworCisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFNxbCk7CisgICAgICAgICAgICBwcm9kdWN0cyA9IG5ldyBWZWN0b3I8UHJvZHVjdD4oKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IERiU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0KHJzLCBmYWxzZSwgcHJvZHVjdElkU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBwcm9kdWN0cy5hZGQocHJvZHVjdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm9kdWN0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHRvcCBOIHByb2R1Y3RzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXQgdG9wIE4gcHJvZHVjdHMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldFZhbGlkYXRpb25MYXllcigpCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25MYXllciBnZXRWYWxpZGF0aW9uTGF5ZXIoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgCS8vIG5vdGUgdGhhdCB2YWxpZGF0aW9uTGF5ZXIgbWF5IGJlIG51bGwgdG8gYWxsb3cgZm9yIGxlbmllbmN5IGluIHN1YmNsYXNzZXMKKyAgICAJcmV0dXJuIHZhbGlkYXRpb25MYXllcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1ldGFkYXRhVmFsdWUoRWxlbWVudCBlbGVtZW50LAorICAgICAgICAgICAgUHJvZHVjdCBwcm9kdWN0LCBTdHJpbmcgdmFsdWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICBTdHJpbmcgbWV0YWRhdGFUYWJsZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIC8vIGJ1aWxkIHVwIHRoZSBzcWwgc3RhdGVtZW50CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgaW5zZXJ0Q2xhdXNlU3FsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlQ2xhdXNlU3FsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICBpbnNlcnRDbGF1c2VTcWwuYXBwZW5kKCJJTlNFUlQgSU5UTyAiICsgbWV0YWRhdGFUYWJsZQorICAgICAgICAgICAgICAgICAgICArICIgKHByb2R1Y3RfaWQsIGVsZW1lbnRfaWQsIG1ldGFkYXRhX3ZhbHVlKSAiKTsKKyAgICAgICAgICAgIHZhbHVlQ2xhdXNlU3FsLmFwcGVuZCgiVkFMVUVTICIpOworCisgICAgICAgICAgICAvLyBub3cgZG8gdGhlIHZhbHVlIGNsYXVzZQorICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgdmFsdWVDbGF1c2VTcWwuYXBwZW5kKCIoIiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgKyAiLCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnRJZCgpICsgIicsICciICsgdmFsdWUgKyAiJykiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsdWVDbGF1c2VTcWwuYXBwZW5kKCIoIiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudElkKCkgKyAiLCAnIiArIHZhbHVlICsgIicpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBtZXRhSW5nZXN0U3FsID0gaW5zZXJ0Q2xhdXNlU3FsLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZUNsYXVzZVNxbC50b1N0cmluZygpOworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuRklORSwgImFkZE1ldGFkYXRhVmFsdWU6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWV0YUluZ2VzdFNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShtZXRhSW5nZXN0U3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGFkZGluZyBtZXRhZGF0YSB2YWx1ZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGFkZCBtZXRhZGF0YSB2YWx1ZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTWV0YWRhdGFWYWx1ZShFbGVtZW50IGVsZW1lbnQsCisgICAgICAgICAgICBQcm9kdWN0IHByb2R1Y3QsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIFN0cmluZyBtZXRhZGF0YVRhYmxlID0gcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSArICJfbWV0YWRhdGEiOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgLy8gYnVpbGQgdXAgdGhlIHNxbCBzdGF0ZW1lbnQKKyAgICAgICAgICAgIFN0cmluZyBtZXRSZW1vdmVTcWwgPSAiREVMRVRFIEZST00gIiArIG1ldGFkYXRhVGFibGUgKyAiIFdIRVJFICI7CisgICAgICAgICAgICBpZiAoZmllbGRJZFN0cmluZ0ZsYWcpIHsKKyAgICAgICAgICAgICAgICBtZXRSZW1vdmVTcWwgKz0gIlBST0RVQ1RfSUQgPSAnIiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgQU5EICI7CisgICAgICAgICAgICAgICAgbWV0UmVtb3ZlU3FsICs9ICJFTEVNRU5UX0lEID0gJyIgKyBlbGVtZW50LmdldEVsZW1lbnRJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICInIEFORCAiOworICAgICAgICAgICAgICAgIG1ldFJlbW92ZVNxbCArPSAiTUVUQURBVEFfVkFMVUUgPSAnIiArIHZhbHVlICsgIiciOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXRSZW1vdmVTcWwgKz0gIlBST0RVQ1RfSUQgPSAiICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEFORCAiOworICAgICAgICAgICAgICAgIG1ldFJlbW92ZVNxbCArPSAiRUxFTUVOVF9JRCA9ICIgKyBlbGVtZW50LmdldEVsZW1lbnRJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgQU5EICI7CisgICAgICAgICAgICAgICAgbWV0UmVtb3ZlU3FsICs9ICJNRVRBREFUQV9WQUxVRSA9ICIgKyB2YWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAicmVtb3ZlTWV0YWRhdGFWYWx1ZTogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgbWV0UmVtb3ZlU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKG1ldFJlbW92ZVNxbCk7CisgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiByZW1vdmluZyBtZXRhZGF0YSB2YWx1ZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgcmVtb3ZlIG1ldGFkYXRhIHZhbHVlLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldE51bVByb2R1Y3RzKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBpbnQgbnVtUHJvZHVjdHMgPSAtMTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRQcm9kdWN0U3FsID0gIlNFTEVDVCBDT1VOVChwcm9kdWN0cy5wcm9kdWN0X2lkKSBBUyBudW1Qcm9kdWN0cyAiCisgICAgICAgICAgICAgICAgICAgICsgIkZST00gcHJvZHVjdHMgIjsKKworICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvZHVjdFNxbCArPSAiV0hFUkUgcHJvZHVjdHMucHJvZHVjdF90eXBlX2lkID0gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiJyAiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsICs9ICJXSEVSRSBwcm9kdWN0cy5wcm9kdWN0X3R5cGVfaWQgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXROdW1Qcm9kdWN0czogZXhlY3V0aW5nOiAiICsgZ2V0UHJvZHVjdFNxbCk7CisKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRQcm9kdWN0U3FsKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIG51bVByb2R1Y3RzID0gcnMuZ2V0SW50KCJudW1Qcm9kdWN0cyIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgbnVtIHByb2R1Y3RzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0IG51bSBwcm9kdWN0cy4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudW1Qcm9kdWN0czsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlBhZ2luYXRpb24jZ2V0Rmlyc3RQYWdlKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRGaXJzdFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICBQcm9kdWN0UGFnZSBmaXJzdFBhZ2UgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaXJzdFBhZ2UgPSBwYWdlZFF1ZXJ5KHF1ZXJ5LCB0eXBlLCAxKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBmaXJzdCBwYWdlOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaXJzdFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5QYWdpbmF0aW9uI2dldExhc3RQcm9kdWN0UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TGFzdFByb2R1Y3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgICAgUHJvZHVjdFBhZ2UgbGFzdFBhZ2UgPSBudWxsOworICAgICAgICBQcm9kdWN0UGFnZSBmaXJzdFBhZ2UgPSBnZXRGaXJzdFBhZ2UodHlwZSk7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsYXN0UGFnZSA9IHBhZ2VkUXVlcnkocXVlcnksIHR5cGUsIGZpcnN0UGFnZS5nZXRUb3RhbFBhZ2VzKCkpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIGxhc3QgcGFnZTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsYXN0UGFnZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlBhZ2luYXRpb24jZ2V0TmV4dFBhZ2Uob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TmV4dFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSwgUHJvZHVjdFBhZ2UgY3VycmVudFBhZ2UpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdFBhZ2UodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudFBhZ2UuaXNMYXN0UGFnZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0UGFnZSBuZXh0UGFnZSA9IG51bGw7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5leHRQYWdlID0gcGFnZWRRdWVyeShxdWVyeSwgdHlwZSwgY3VycmVudFBhZ2UuZ2V0UGFnZU51bSgpICsgMSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgbmV4dCBwYWdlOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5leHRQYWdlOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuUGFnaW5hdGlvbiNnZXRQcmV2UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlKQorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRQcmV2UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgICAgICBpZiAoY3VycmVudFBhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0UGFnZSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50UGFnZS5pc0ZpcnN0UGFnZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgUHJvZHVjdFBhZ2UgcHJldlBhZ2UgPSBudWxsOworICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmV2UGFnZSA9IHBhZ2VkUXVlcnkocXVlcnksIHR5cGUsIGN1cnJlbnRQYWdlLmdldFBhZ2VOdW0oKSAtIDEpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIHByZXYgcGFnZTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcmV2UGFnZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjcGFnZWRRdWVyeShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlLCBpbnQpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RQYWdlIHBhZ2VkUXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUsIGludCBwYWdlTnVtKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBpbnQgdG90YWxQYWdlcyA9IFBhZ2luYXRpb25VdGlscy5nZXRUb3RhbFBhZ2UoZ2V0UmVzdWx0TGlzdFNpemUocXVlcnksCisgICAgICAgICAgICAgICAgdHlwZSksIHRoaXMucGFnZVNpemUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIGlmIHRoZXJlIGFyZSAwIHRvdGFsIHBhZ2VzIGluIHRoZSByZXN1bHQgbGlzdCBzaXplIHRoZW4gZG9uJ3QgYm90aGVyCisgICAgICAgICAqIHJldHVybmluZyBhIHZhbGlkIHByb2R1Y3QgcGFnZSBpbnN0ZWFkLCByZXR1cm4gYmxhbmsgUHJvZHVjdFBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmICh0b3RhbFBhZ2VzID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQcm9kdWN0UGFnZS5ibGFua1BhZ2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3RQYWdlIHJldFBhZ2UgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgcmV0UGFnZS5zZXRQYWdlTnVtKHBhZ2VOdW0pOworICAgICAgICByZXRQYWdlLnNldFBhZ2VTaXplKHRoaXMucGFnZVNpemUpOworICAgICAgICByZXRQYWdlLnNldFRvdGFsUGFnZXModG90YWxQYWdlcyk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb2R1Y3RJZHMgPSBwYWdpbmF0ZVF1ZXJ5KHF1ZXJ5LCB0eXBlLCBwYWdlTnVtKTsKKworICAgICAgICBpZiAocHJvZHVjdElkcyAhPSBudWxsICYmIHByb2R1Y3RJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG5ldyBWZWN0b3I8UHJvZHVjdD4ocHJvZHVjdElkcy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHByb2R1Y3RJZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IGdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgICAgICAgICAgICAgcHJvZHVjdHMuYWRkKHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXRQYWdlLnNldFBhZ2VQcm9kdWN0cyhwcm9kdWN0cyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0UGFnZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFJlc3VsdExpc3RTaXplKFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBpbnQgcmVzdWx0Q291bnQgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0UHJvZHVjdFNxbCA9ICIiOworICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSI7CisgICAgICAgICAgICBTdHJpbmcgc3ViU2VsZWN0UXVlcnlCYXNlID0gIlNFTEVDVCBwcm9kdWN0X2lkIEZST00gIiArIHRhYmxlTmFtZQorICAgICAgICAgICAgICAgICAgICArICIgIjsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzZWxlY3RDbGF1c2UgPSBuZXcgU3RyaW5nQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIENPVU5UKERJU1RJTkNUIHAucHJvZHVjdF9pZCkgQVMgbnVtUmVzdWx0cyAiKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBmcm9tQ2xhdXNlID0gbmV3IFN0cmluZ0J1ZmZlcigiRlJPTSAiICsgdGFibGVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBwICIpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1ZmZlcigiV0hFUkUgIik7CisKKyAgICAgICAgICAgIGJvb2xlYW4gZ290Rmlyc3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBjbGF1c2VOdW0gPSAwOworCisgICAgICAgICAgICBpZiAocXVlcnkuZ2V0Q3JpdGVyaWEoKSAhPSBudWxsICYmIHF1ZXJ5LmdldENyaXRlcmlhKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8UXVlcnlDcml0ZXJpYT4gaSA9IHF1ZXJ5LmdldENyaXRlcmlhKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5Q3JpdGVyaWEgY3JpdGVyaWEgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2xhdXNlTnVtKys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRJZFN0ciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRTdHIgPSAiJyIgKyB0aGlzLnZhbGlkYXRpb25MYXllci5nZXRFbGVtZW50QnlOYW1lKGNyaXRlcmlhLmdldEVsZW1lbnROYW1lKCkpLmdldEVsZW1lbnRJZCgpICsgIiciOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkU3RyID0gdGhpcy52YWxpZGF0aW9uTGF5ZXIuZ2V0RWxlbWVudEJ5TmFtZShjcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpKS5nZXRFbGVtZW50SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGF1c2UgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmICghZ290Rmlyc3RDbGF1c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSA9ICIocC5lbGVtZW50X2lkID0gIiArIGVsZW1lbnRJZFN0ciArICIgQU5EICI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiIG1ldGFkYXRhX3ZhbHVlIExJS0UgJyUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKS5nZXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIlJykgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBSYW5nZVF1ZXJ5Q3JpdGVyaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRWYWwgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhcnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmRWYWwgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1c2l2ZSA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbmNsdXNpdmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnRWYWwgIT0gbnVsbCAmJiAhc3RhcnRWYWwuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChlbmRWYWwgIT0gbnVsbCAmJiAhZW5kVmFsLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiIG1ldGFkYXRhX3ZhbHVlICI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBnb3RTdGFydCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVzaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiPj0gJyIgKyBzdGFydFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIj4gJyIgKyBzdGFydFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiAhZW5kVmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3RTdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiIEFORCBtZXRhZGF0YV92YWx1ZSA8PSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIgQU5EIG1ldGFkYXRhX3ZhbHVlIDwgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVuZFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVzaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiPD0gJyIgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICI8ICciICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIpICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UuYXBwZW5kKGNsYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RGaXJzdENsYXVzZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViU2VsZWN0VGJsTmFtZSA9ICJwIiArIGNsYXVzZU51bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWJTZWxlY3RRdWVyeSA9IHN1YlNlbGVjdFF1ZXJ5QmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJXSEVSRSAoZWxlbWVudF9pZCA9ICIgKyBlbGVtZW50SWRTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEFORCAiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyaXRlcmlhIGluc3RhbmNlb2YgVGVybVF1ZXJ5Q3JpdGVyaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIG1ldGFkYXRhX3ZhbHVlIExJS0UgJyUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKS5nZXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIlJykiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcml0ZXJpYSBpbnN0YW5jZW9mIFJhbmdlUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGFydFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwgfHwgZW5kVmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIiBtZXRhZGF0YV92YWx1ZSAiOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZ290U3RhcnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCAmJiAhc3RhcnRWYWwuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIj49ICciICsgc3RhcnRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RTdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kVmFsICE9IG51bGwgJiYgIWVuZFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ290U3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIEFORCBtZXRhZGF0YV92YWx1ZSA8PSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiPD0gJyIgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiKSAiOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQ2xhdXNlLmFwcGVuZCgiSU5ORVIgSk9JTiAoIiArIHN1YlNlbGVjdFF1ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIHN1YlNlbGVjdFRibE5hbWUgKyAiIE9OICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdWJTZWxlY3RUYmxOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5wcm9kdWN0X2lkID0gcC5wcm9kdWN0X2lkICIpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgPSBzZWxlY3RDbGF1c2UudG9TdHJpbmcoKSArIGZyb21DbGF1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChnb3RGaXJzdENsYXVzZSkgeworICAgICAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgKz0gd2hlcmVDbGF1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJjYXRhbG9nIGdldCBudW0gcmVzdWx0czogZXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJvZHVjdFNxbCk7CisKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRQcm9kdWN0U3FsKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdENvdW50ID0gcnMuZ2V0SW50KCJudW1SZXN1bHRzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcGVyZm9ybWluZyBnZXQgbnVtIHJlc3VsdHMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldCBudW0gcmVzdWx0cyB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHRDb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RpbGxGcmVzaChTdHJpbmcgcHJvZHVjdFR5cGVJZCkgeworICAgICAgICBEYXRlIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTsKKworICAgICAgICBpZiAoUFJPRFVDVF9DQUNIRS5nZXQocHJvZHVjdFR5cGVJZCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVHJlZU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdExpc3RBbmRVcGRhdGVUaW1lID0gUFJPRFVDVF9DQUNIRQorICAgICAgICAgICAgICAgICAgICAuZ2V0KHByb2R1Y3RUeXBlSWQpOworICAgICAgICAgICAgU3RyaW5nIGxhc3RVcGRhdGVUaW1lID0gKFN0cmluZykgcHJvZHVjdExpc3RBbmRVcGRhdGVUaW1lCisgICAgICAgICAgICAgICAgICAgIC5nZXQoImxhc3RVcGRhdGVUaW1lIik7CisgICAgICAgICAgICBEYXRlIGxhc3RVcGRhdGVUaW1lRGF0ZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZVRpbWVEYXRlID0gRGF0ZUNvbnZlcnQuaXNvUGFyc2UobGFzdFVwZGF0ZVRpbWUpOworCisgICAgICAgICAgICAgICAgbG9uZyB0aW1lRGlmZmVyZW5jZU1pbGlzID0gY3VycmVudFRpbWUuZ2V0VGltZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAtIGxhc3RVcGRhdGVUaW1lRGF0ZS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lRGlmZmVyZW5jZVNlY29uZHMgPSB0aW1lRGlmZmVyZW5jZU1pbGlzICogMTAwMDsKKyAgICAgICAgICAgICAgICBsb25nIHRpbWVEaWZmZXJlbmNlTWludXRlcyA9IHRpbWVEaWZmZXJlbmNlU2Vjb25kcyAvIDYwOworCisgICAgICAgICAgICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlTWludXRlcyA+PSBjYWNoZVVwZGF0ZU1pbnV0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBsYXN0IHVwZGF0ZSB0aW1lIGZvciBwcm9kdWN0IHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVJZCArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBMaXN0PFByb2R1Y3Q+IGdldFByb2R1Y3RzRnJvbUNhY2hlKFN0cmluZyBwcm9kdWN0VHlwZUlkKSB7CisgICAgICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBudWxsOworCisgICAgICAgIGlmIChQUk9EVUNUX0NBQ0hFLmdldChwcm9kdWN0VHlwZUlkKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RMaXN0QW5kVXBkYXRlVGltZSA9IFBST0RVQ1RfQ0FDSEUKKyAgICAgICAgICAgICAgICAgICAgLmdldChwcm9kdWN0VHlwZUlkKTsKKyAgICAgICAgICAgIHByb2R1Y3RzID0gKExpc3Q8UHJvZHVjdD4pIHByb2R1Y3RMaXN0QW5kVXBkYXRlVGltZS5nZXQoInByb2R1Y3RMaXN0Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZsYWdDYWNoZVVwZGF0ZShTdHJpbmcgcHJvZHVjdFR5cGVJZCwgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cykgeworICAgICAgICBEYXRlIGN1cnJlbnREYXRlVGltZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIFN0cmluZyBpc29EYXRlU3RyID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KGN1cnJlbnREYXRlVGltZSk7CisgICAgICAgIFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RMaXN0QW5kVXBkYXRlVGltZSA9IG5ldyBUcmVlTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBwcm9kdWN0TGlzdEFuZFVwZGF0ZVRpbWUucHV0KCJwcm9kdWN0TGlzdCIsIHByb2R1Y3RzKTsKKyAgICAgICAgcHJvZHVjdExpc3RBbmRVcGRhdGVUaW1lLnB1dCgibGFzdFVwZGF0ZVRpbWUiLCBpc29EYXRlU3RyKTsKKyAgICAgICAgUFJPRFVDVF9DQUNIRS5wdXQocHJvZHVjdFR5cGVJZCwgcHJvZHVjdExpc3RBbmRVcGRhdGVUaW1lKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlQ2FjaGVkKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG51bGw7CisgICAgICAgIC8vIGNoZWNrIHRoZSBwcm9kdWN0IGNhY2hlIGZpcnN0CisgICAgICAgIGlmIChzdGlsbEZyZXNoKHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKSkgeworICAgICAgICAgICAgcHJvZHVjdHMgPSBnZXRQcm9kdWN0c0Zyb21DYWNoZSh0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBnbyBnZXQgYSBmcmVzaCBzZXQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdHMgPSBnZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgICAgICAgICAgZmxhZ0NhY2hlVXBkYXRlKHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLCBwcm9kdWN0cyk7CisgICAgICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2F0YWxvZ0V4Y2VwdGlvbiBnZXR0aW5nIGNhY2hlZCBwcm9kdWN0cyBmb3IgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwYWdpbmF0ZVF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlLCBpbnQgcGFnZU51bSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgYm9vbGVhbiBkb1NraXAgPSB0cnVlOworICAgICAgICBpbnQgbnVtUmVzdWx0cyA9IC0xOworCisgICAgICAgIGlmIChwYWdlTnVtID09IC0xKSB7CisgICAgICAgICAgICBkb1NraXAgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVJlc3VsdHMgPSBnZXRSZXN1bHRMaXN0U2l6ZShxdWVyeSwgdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudChSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsCisgICAgICAgICAgICAgICAgICAgIFJlc3VsdFNldC5DT05DVVJfUkVBRF9PTkxZKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFByb2R1Y3RTcWwgPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXByb2R1Y3RJZFN0cmluZykgeworICAgICAgICAgICAgCQorCSAgICAgICAgICAgIGlmIChxdWVyeS5nZXRDcml0ZXJpYSgpLnNpemUoKSA9PSAwKSB7CisJICAgICAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgPSAiU0VMRUNUIERJU1RJTkNUIHByb2R1Y3RfaWQgRlJPTSAiICsgdHlwZS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIjsKKwkgICAgICAgICAgICB9ZWxzZSBpZiAocXVlcnkuZ2V0Q3JpdGVyaWEoKS5zaXplKCkgPT0gMSkgeworCSAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsID0gdGhpcy5nZXRTcWxRdWVyeShxdWVyeS5nZXRDcml0ZXJpYSgpLmdldCgwKSwgdHlwZSk7CisJICAgICAgICAgICAgfWVsc2UgeworCSAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsID0gdGhpcy5nZXRTcWxRdWVyeShuZXcgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEocXVlcnkuZ2V0Q3JpdGVyaWEoKSwgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuQU5EKSwgdHlwZSk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgKz0gIiBPUkRFUiBCWSBwcm9kdWN0X2lkIERFU0MgIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgICAgaWYgKHF1ZXJ5LmdldENyaXRlcmlhKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsID0gIlNFTEVDVCBESVNUSU5DVCBwcm9kdWN0cy5wcm9kdWN0X2lkIEZST00gcHJvZHVjdHMsICIgKyB0eXBlLmdldE5hbWUoKSArICJfbWV0YWRhdGEiCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICsgIiBXSEVSRSBwcm9kdWN0cy5wcm9kdWN0X2lkPSIrdHlwZS5nZXROYW1lKCkgKyAiX21ldGFkYXRhLnByb2R1Y3RfaWQiOworICAgICAgICAgICAgICB9CWVsc2UgaWYgKHF1ZXJ5LmdldENyaXRlcmlhKCkuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsID0gdGhpcy5nZXRTcWxRdWVyeShxdWVyeS5nZXRDcml0ZXJpYSgpLmdldCgwKSwgdHlwZSk7CisgICAgICAgICAgICAgIH0JZWxzZSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvZHVjdFNxbCA9IHRoaXMuZ2V0U3FsUXVlcnkobmV3IEJvb2xlYW5RdWVyeUNyaXRlcmlhKHF1ZXJ5LmdldENyaXRlcmlhKCksIEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCksIHR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgKz0gIiBPUkRFUiBCWSBwcm9kdWN0cy5wcm9kdWN0X2RhdGV0aW1lIERFU0MgIjsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImNhdGFsb2cgcXVlcnk6IGV4ZWN1dGluZzogIiArIGdldFByb2R1Y3RTcWwpOworCisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFNxbCk7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9kdWN0SWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgICAgICBpZiAoZG9Ta2lwKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0TnVtID0gKHBhZ2VOdW0gLSAxKSAqIHBhZ2VTaXplOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0TnVtID4gbnVtUmVzdWx0cykgeworICAgICAgICAgICAgICAgICAgICBzdGFydE51bSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbXVzdCBjYWxsIG5leHQgZmlyc3QsIG9yIGVsc2Ugbm8gcmVsYXRpdmUgY3Vyc29yCisgICAgICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bUdyYWJiZWQgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZU51bSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1HcmFiYmVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZHMuYWRkKHJzLmdldFN0cmluZygicHJvZHVjdF9pZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUdyYWJiZWQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm93IG1vdmUgdGhlIGN1cnNvciB0byB0aGUgY29ycmVjdCBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICBpZiAocGFnZU51bSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBycy5yZWxhdGl2ZShzdGFydE51bSAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiB0aGUgcmVzdAorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpICYmIG51bUdyYWJiZWQgPCBwYWdlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IHJzLmdldFN0cmluZygicHJvZHVjdF9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkcy5hZGQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUdyYWJiZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSBycy5nZXRTdHJpbmcoInByb2R1Y3RfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkcy5hZGQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWN0SWRzOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIHBlcmZvcm1pbmcgcXVlcnkuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBxdWVyeSB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3FsUXVlcnkoUXVlcnlDcml0ZXJpYSBxdWVyeUNyaXRlcmlhLCBQcm9kdWN0VHlwZSB0eXBlKSB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uLCBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNxbFF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgaWYgKHF1ZXJ5Q3JpdGVyaWEgaW5zdGFuY2VvZiBCb29sZWFuUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgYnFjID0gKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBxdWVyeUNyaXRlcmlhOworICAgICAgICAgICAgaWYgKGJxYy5nZXRPcGVyYXRvcigpID09IEJvb2xlYW5RdWVyeUNyaXRlcmlhLk5PVCkgeyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAkJaWYgKCF0aGlzLnByb2R1Y3RJZFN0cmluZykgeworICAgICAgICAgICAgCQkJc3FsUXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHByb2R1Y3RfaWQgRlJPTSAiICsgdHlwZS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIFdIRVJFIHByb2R1Y3RfaWQgTk9UIElOICgiICsgdGhpcy5nZXRTcWxRdWVyeShicWMuZ2V0VGVybXMoKS5nZXQoMCksIHR5cGUpICsgIikiOworICAgICAgICAgICAgCQl9IGVsc2UgeworICAgICAgICAgICAgCQkJc3FsUXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHByb2R1Y3RzLnByb2R1Y3RfaWQgRlJPTSBwcm9kdWN0cywiICsgdHlwZS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIgorICAgICAgICAgICAgCQkJCQkJCSArICIgV0hFUkUgcHJvZHVjdHMucHJvZHVjdF9pZD0iK3R5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YS5wcm9kdWN0X2lkIiAKKyAgICAgICAgICAgIAkJCQkJCQkgKyAiIEFORCBwcm9kdWN0cy5wcm9kdWN0X2lkIE5PVCBJTiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkoYnFjLmdldFRlcm1zKCkuZ2V0KDApLCB0eXBlKSArICIpIjsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgIHNxbFF1ZXJ5ID0gIigiICsgdGhpcy5nZXRTcWxRdWVyeShicWMuZ2V0VGVybXMoKS5nZXQoMCksIHR5cGUpOworICAgICAgICAgICAgICAgIFN0cmluZyBvcCA9IGJxYy5nZXRPcGVyYXRvcigpID09IEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCA/ICJJTlRFUlNFQ1QiIDogIlVOSU9OIjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGJxYy5nZXRUZXJtcygpLnNpemUoKTsgaSsrKSAKKyAgICAgICAgICAgICAgICAgICAgc3FsUXVlcnkgKz0gIikgIiArIG9wICsgIiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkoYnFjLmdldFRlcm1zKCkuZ2V0KGkpLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBzcWxRdWVyeSArPSAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgCSAgU3RyaW5nIGVsZW1lbnRJZFN0ciA9IHRoaXMudmFsaWRhdGlvbkxheWVyLmdldEVsZW1lbnRCeU5hbWUocXVlcnlDcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpKS5nZXRFbGVtZW50SWQoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZElkU3RyaW5nRmxhZykgCisgICAgICAgICAgICAgICAgZWxlbWVudElkU3RyID0gIiciICsgZWxlbWVudElkU3RyICsgIiciOworICAgICAgICAgICAgaWYgKCF0aGlzLnByb2R1Y3RJZFN0cmluZykgeworICAgICAgICAgICAgCXNxbFF1ZXJ5ID0gIlNFTEVDVCBESVNUSU5DVCBwcm9kdWN0X2lkIEZST00gIiArIHR5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSBXSEVSRSBlbGVtZW50X2lkID0gIiArIGVsZW1lbnRJZFN0ciArICIgQU5EICI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCXNxbFF1ZXJ5ID0gIlNFTEVDVCBESVNUSU5DVCBwcm9kdWN0cy5wcm9kdWN0X2lkIEZST00gcHJvZHVjdHMsIiArIHR5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSIKKyAgICAgICAgICAgIAkgICAgICAgICArICIgV0hFUkUgcHJvZHVjdHMucHJvZHVjdF9pZD0iK3R5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YS5wcm9kdWN0X2lkIiAKKyAgICAgICAgICAgIAkJCSAgICAgKyAiIEFORCBlbGVtZW50X2lkID0gIiArIGVsZW1lbnRJZFN0ciArICIgQU5EICI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocXVlcnlDcml0ZXJpYSBpbnN0YW5jZW9mIFRlcm1RdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICAgICAgc3FsUXVlcnkgKz0gIm1ldGFkYXRhX3ZhbHVlID0gJyIgKyAoKFRlcm1RdWVyeUNyaXRlcmlhKSBxdWVyeUNyaXRlcmlhKS5nZXRWYWx1ZSgpICsgIiciOworICAgICAgICAgICAgfSBlbHNlIGlmIChxdWVyeUNyaXRlcmlhIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICAgICAgUmFuZ2VRdWVyeUNyaXRlcmlhIHJxYyA9IChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIHF1ZXJ5Q3JpdGVyaWE7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJhbmdlU3ViUXVlcnkgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChycWMuZ2V0U3RhcnRWYWx1ZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJhbmdlU3ViUXVlcnkgPSAibWV0YWRhdGFfdmFsdWUiICsgKHJxYy5nZXRJbmNsdXNpdmUoKSA/ICIgPj0gIiA6ICIgPiAiKSArICInIiArIHJxYy5nZXRTdGFydFZhbHVlKCkgKyAiJyI7CisgICAgICAgICAgICAgICAgaWYgKHJxYy5nZXRFbmRWYWx1ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlU3ViUXVlcnkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlU3ViUXVlcnkgPSAibWV0YWRhdGFfdmFsdWUiICsgKHJxYy5nZXRJbmNsdXNpdmUoKSA/ICIgPD0gIiA6ICIgPCAiKSArICInIiArIHJxYy5nZXRFbmRWYWx1ZSgpICsgIiciOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVN1YlF1ZXJ5ID0gIigiICsgcmFuZ2VTdWJRdWVyeSArICIgQU5EIG1ldGFkYXRhX3ZhbHVlIiArIChycWMuZ2V0SW5jbHVzaXZlKCkgPyAiIDw9ICIgOiAiIDwgIikgKyAiJyIgKyBycWMuZ2V0RW5kVmFsdWUoKSArICInKSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNxbFF1ZXJ5ICs9IHJhbmdlU3ViUXVlcnk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJJbnZhbGlkIFF1ZXJ5Q3JpdGVyaWEgWyIgKyBxdWVyeUNyaXRlcmlhLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzcWxRdWVyeTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBTdHJpbmcgcHJvZHVjdFJlZlRhYmxlID0gcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIl9yZWZlcmVuY2UiOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgLy8gZmlyc3QgcmVtb3ZlIHRoZSByZWZzCisgICAgICAgICAgICBTdHJpbmcgZGVsZXRlUHJvZHVjdFNxbCA9ICJERUxFVEUgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSArICJfcmVmZXJlbmNlICIKKyAgICAgICAgICAgICAgICAgICAgKyAiIFdIRVJFIHByb2R1Y3RfaWQgPSAiICsgcXVvdGVJdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgInVwZGF0ZVByb2R1Y3RSZWZlcmVuY2VzOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkZWxldGVQcm9kdWN0U3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKGRlbGV0ZVByb2R1Y3RTcWwpOworCisgICAgICAgICAgICAvLyBub3cgYWRkIHRoZSBuZXcgb25lcyBiYWNrIGluCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlZmVyZW5jZT4gaSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpCisgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSBpLm5leHQoKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBhZGRSZWZTcWwgPSAiSU5TRVJUIElOVE8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0UmVmVGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICIocHJvZHVjdF9pZCwgcHJvZHVjdF9vcmlnX3JlZmVyZW5jZSwgcHJvZHVjdF9kYXRhc3RvcmVfcmVmZXJlbmNlLCBwcm9kdWN0X3JlZmVyZW5jZV9maWxlc2l6ZSwiCisgICAgICAgICAgICAgICAgICAgICAgICArICJwcm9kdWN0X3JlZmVyZW5jZV9taW1ldHlwZSkgIiArICJWQUxVRVMgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSArICIsICciICsgci5nZXRPcmlnUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicsICciICsgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICInLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0RmlsZVNpemUoKSArICIsJyIgKyByLmdldE1pbWVUeXBlKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICInKSI7CisKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJ1cGRhdGVQcm9kdWN0UmVmZXJlbmNlczogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGFkZFJlZlNxbCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoYWRkUmVmU3FsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiB1cGRhdGluZyBwcm9kdWN0IHJlZmVyZW5jZXMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIHVwZGF0ZVByb2R1Y3RSZWZlcmVuY2VzIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gcXVvdGUgdGhlICJwcm9kdWN0SWQiIHZhbHVlIAorICAgICAqIGlmIHRoZSBjb2x1bW4gdHlwZSBpcyAic3RyaW5nIi4KKyAgICAgKiBAcGFyYW0gcHJvZHVjdElkCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcXVvdGVJdChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgCWlmICh0aGlzLnByb2R1Y3RJZFN0cmluZykgeworICAgIAkJcmV0dXJuICInIitwcm9kdWN0SWQrIiciOworICAgIAl9IGVsc2UgeworICAgIAkJcmV0dXJuIHByb2R1Y3RJZDsKKyAgICAJfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvRGF0YVNvdXJjZUNhdGFsb2dGYWN0b3J5LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9EYXRhU291cmNlQ2F0YWxvZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTc1Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvRGF0YVNvdXJjZUNhdGFsb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLkRhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHtAbGluayBEYXRhU291cmNlQ2F0YWxvZ31zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlQ2F0YWxvZ0ZhY3RvcnkgaW1wbGVtZW50cyBDYXRhbG9nRmFjdG9yeSB7CisgICAgLyogb3VyIGRhdGEgc291cmNlICovCisgICAgcHJvdGVjdGVkIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7CisKKyAgICAvKiBvdXIgdmFsaWRhdGlvbiBsYXllciAqLworICAgIHByb3RlY3RlZCBWYWxpZGF0aW9uTGF5ZXIgdmFsaWRhdGlvbkxheWVyID0gbnVsbDsKKworICAgIC8qIGZpZWxkIElkIFN0cjogc2hvdWxkIHByb2R1Y3RfdHlwZV9pZCBhbmQgZWxlbWVudF9pZCBiZSBxdW90ZWQ/ICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmllbGRJZFN0ciA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBwYWdlIHNpemU6IHNpemUgb2YgdGhlIHBhZ2VzIHVzZWQgYnkgdGhlIGNhdGFsb2cgdG8gcGFnaW5hdGUgcHJvZHVjdHMKKyAgICAgKiBiYWNrIHRvIHRoZSB1c2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwYWdlU2l6ZSA9IC0xOworCisgICAgLyogdGhlIGFtb3VudCBvZiBtaW51dGVzIHRvIGFsbG93IGJldHdlZW4gdXBkYXRpbmcgdGhlIHByb2R1Y3QgY2FjaGUgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBjYWNoZVVwZGF0ZU1pbnV0ZXMgPSAtMUw7CisgICAgCisgICAgLyogV2hldGhlciBvciBub3QgdG8gZW5mb3JjZSBzdHJpY3QgZGVmaW5pdGlvbiBvZiBtZXRhZGF0YSBmaWVsZHM6CisgIAkgKiAnbGVuaWVudD1mYWxzZScgbWVhbnMgdGhhdCBhbGwgbWV0YWRhdGEgZmllbGRzIG5lZWQgdG8gYmUgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSBYTUwgY29uZmlndXJhdGlvbiBmaWxlICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbGVuaWVudEZpZWxkcyA9IGZhbHNlOworICAJCisgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSAicHJvZHVjdF9pZCIga2V5IHR5cGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9kdWN0SWRTdHJpbmcgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIG9yZGVyZWRWYWx1ZXMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+LgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlQ2F0YWxvZ0ZhY3RvcnkoKSB7CisgICAgCQorICAgIAkgIC8vIGluc3RhbnRpYXRlIGRhdGEgc291cmNlCisgICAgICAgIFN0cmluZyBqZGJjVXJsID0gbnVsbCwgdXNlciA9IG51bGwsIHBhc3MgPSBudWxsLCBkcml2ZXIgPSBudWxsOworCisgICAgICAgIGpkYmNVcmwgPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVybCIpKTsKKyAgICAgICAgdXNlciA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXNlciIpKTsKKyAgICAgICAgcGFzcyA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMucGFzcyIpKTsKKyAgICAgICAgZHJpdmVyID0gUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy5kcml2ZXIiKSk7CisKKyAgICAgICAgZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsCisgICAgICAgICAgICAgICAgZHJpdmVyLCBqZGJjVXJsKTsKKworICAgICAgICB0aGlzLmNvbmZpZ3VyZSgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyBGYWN0b3J5IGZyb20gdGhlIHNwZWNpZmllZCB7QGxpbmsgRGF0YVNvdXJjZX0uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBkcworICAgICAqICAgICAgICAgICAgVGhlIERhdGFTb3VyY2UgdG8gY29uc3RydWN0IHRoaXMgZmFjdG9yeSBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlQ2F0YWxvZ0ZhY3RvcnkoRGF0YVNvdXJjZSBkcykgeworICAgICAgIAorICAgIAkJdGhpcy5kYXRhU291cmNlID0gZHM7CisgICAgICAgIAorICAgICAJCXRoaXMuY29uZmlndXJlKCk7CisgICAgCQkKKyAgICB9CisgICAgCisgICAgLyoqIE1ldGhvZCB0byBjb25maWd1cmUgdGhlIGZhY3RvcnkgKGFuZCB2YWxpZGF0aW9uIGxheWVyKSBmcm9tIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLAorICAgICAqICBiZWZvcmUgYW55IENhdGFsb2cgaW5zdGFuY2UgaXMgY3JlYXRlZCAKKyAgICAgKiovCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAKKyAgCQlsZW5pZW50RmllbGRzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5sZW5pZW50RmllbGRzIiwgImZhbHNlIikgKTsKKyAgCQlpZiAoIWxlbmllbnRGaWVsZHMpIHsKKwkgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uTGF5ZXJGYWN0b3J5Q2xhc3MgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoImZpbGVtZ3IudmFsaWRhdGlvbkxheWVyLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLkRhdGFTb3VyY2VWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5Iik7CisJICAgICAgICB2YWxpZGF0aW9uTGF5ZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uTGF5ZXJGcm9tRmFjdG9yeSh2YWxpZGF0aW9uTGF5ZXJGYWN0b3J5Q2xhc3MpOworICAJCX0gCisgIAkJCisgICAgICBmaWVsZElkU3RyID0gQm9vbGVhbgorICAgICAgCS5nZXRCb29sZWFuKCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnF1b3RlRmllbGRzIik7CisKKwkJCXBhZ2VTaXplID0gSW50ZWdlcgorCQkJICAgICAgLmdldEludGVnZXIoCisJCQkgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnBhZ2VTaXplIiwKKwkJCSAgICAgICAgICAgICAgMjApLmludFZhbHVlKCk7CisJCQljYWNoZVVwZGF0ZU1pbnV0ZXMgPSBMb25nCisJCQkgICAgICAuZ2V0TG9uZygKKwkJCSAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuY2FjaGVVcGRhdGVNaW51dGVzIiwKKwkJCSAgICAgICAgICAgICAgNUwpLmxvbmdWYWx1ZSgpOworCQkJCisJCQlwcm9kdWN0SWRTdHJpbmcgPSBCb29sZWFuLnBhcnNlQm9vbGVhbiggCisJCQkJU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnByb2R1Y3RJZC5zdHJpbmciLCAiZmFsc2UiKSApOworICAJCisJCQlvcmRlcmVkVmFsdWVzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLm9yZGVyZWRWYWx1ZXMiKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nRmFjdG9yeSNjcmVhdGVDYXRhbG9nKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2F0YWxvZyBjcmVhdGVDYXRhbG9nKCkgeworICAgIAlpZiAodmFsaWRhdGlvbkxheWVyPT1udWxsKSB7CisgICAgCQkJcmV0dXJuIG5ldyBMZW5pZW50RGF0YVNvdXJjZUNhdGFsb2coZGF0YVNvdXJjZSwgdmFsaWRhdGlvbkxheWVyLCBmaWVsZElkU3RyLAorCQkJCQkJCSAgICBwYWdlU2l6ZSwgY2FjaGVVcGRhdGVNaW51dGVzLCBwcm9kdWN0SWRTdHJpbmcsIG9yZGVyZWRWYWx1ZXMpOworICAgIAl9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VDYXRhbG9nKGRhdGFTb3VyY2UsIHZhbGlkYXRpb25MYXllciwgZmllbGRJZFN0ciwKKwkJCQkgICAgIHBhZ2VTaXplLCBjYWNoZVVwZGF0ZU1pbnV0ZXMsIHByb2R1Y3RJZFN0cmluZywgb3JkZXJlZFZhbHVlcyk7CisgICAgCX0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL0xlbmllbnREYXRhU291cmNlQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTGVuaWVudERhdGFTb3VyY2VDYXRhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1NjdkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL0xlbmllbnREYXRhU291cmNlQ2F0YWxvZy5qYXZhCkBAIC0wLDAgKzEsODI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworLy8gT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuQm9vbGVhblF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZhbGlkYXRpb25MYXllckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBsdWNhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRXh0ZW5zaW9uIG9mIHtAbGluayBEYXRhU291cmNlQ2F0YWxvZ30gdGhhdCBjYW4gYWNjb21vZGF0ZSBkeW5hbWljIGZpZWxkcy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgTGVuaWVudERhdGFTb3VyY2VDYXRhbG9nIGV4dGVuZHMgRGF0YVNvdXJjZUNhdGFsb2cgeworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihMZW5pZW50RGF0YVNvdXJjZUNhdGFsb2cuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAKKyAgICAvLyBJU08gZGF0ZS90aW1lIGZvcm1hdCBmb3IgQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUgCisJCXByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCBpc29Gb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1oiKTsKKwkJCisJCS8vIGRhdGUvdGltZSBmb3JtYXQgZm9yIGRhdGFiYXNlCisJCXByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCBkYkZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MiKTsKKworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICogQHRocm93cyAgCisgICAgICovCisgICAgcHVibGljIExlbmllbnREYXRhU291cmNlQ2F0YWxvZyhEYXRhU291cmNlIGRzLCBWYWxpZGF0aW9uTGF5ZXIgdmFsTGF5ZXIsCisJCQkJICAgIGJvb2xlYW4gZmllbGRJZCwgaW50IHBhZ2VTaXplLCBsb25nIGNhY2hlVXBkYXRlTWluLCBib29sZWFuIHByb2R1Y3RJZFN0cmluZywgYm9vbGVhbiBvcmRlcmVkVmFsdWVzKSB7CisgICAgCQorCXN1cGVyKGRzLCB2YWxMYXllciwgZmllbGRJZCwgcGFnZVNpemUsIGNhY2hlVXBkYXRlTWluLCBwcm9kdWN0SWRTdHJpbmcsIG9yZGVyZWRWYWx1ZXMpOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2FkZE1ldGFkYXRhKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNZXRhZGF0YShNZXRhZGF0YSBtLCBQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgCQorICAgIAkJLy8gcmVwbGFjZSAiQ0FTLlByb2R1Y3RJZCIKKyAgICAJCW0ucmVtb3ZlTWV0YWRhdGEoIkNBUy5Qcm9kdWN0SWQiKTsKKyAgICAJCW0uYWRkTWV0YWRhdGEoIkNBUy5Qcm9kdWN0SWQiLCBwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAJCisgICAgCQkvLyBtYXAgY29udGFpbmluZyBtZXRhZGF0YSB0eXBlIChpZCwgbmFtZSkgcGFpcnMKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YVR5cGVzID0gZ2V0TWV0YWRhdGFUeXBlcyhtLCBwcm9kdWN0KTsKKworICAgICAgICAvLyBsb29wIG92ZXIgbWV0YWRhdGEgdHlwZXMKKyAgICAgICAgZm9yIChTdHJpbmcgbWV0YWRhdGFJZCA6IG1ldGFkYXRhVHlwZXMua2V5U2V0KCkpIHsKKyAgICAgICAgCVN0cmluZyBtZXRhZGF0YU5hbWUgPSBtZXRhZGF0YVR5cGVzLmdldChtZXRhZGF0YUlkKTsKKyAgICAgICAgCQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG0uZ2V0QWxsTWV0YWRhdGEobWV0YWRhdGFOYW1lKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiTm8gTWV0YWRhdGEgc3BlY2lmaWVkIGZvciBwcm9kdWN0IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICJdIGZvciByZXF1aXJlZCBmaWVsZCBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhZGF0YU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IEF0dGVtcHRpbmcgdG8gY29udGludWUgcHJvY2Vzc2luZyBtZXRhZGF0YSIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaiA9IHZhbHVlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBqLm5leHQoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFkZE1ldGFkYXRhVmFsdWUobWV0YWRhdGFJZCwgcHJvZHVjdCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBpbmdlc3RpbmcgbWV0YWRhdGEuIEVycm9yIGluc2VydGluZyBmaWVsZDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhZGF0YUlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIj0+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBBdHRlbXB0aW5nIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcgbWV0YWRhdGEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byByZXR1cm4gYSBtYXAgb2YgbWV0YWRhdGEgKGZpZWxkIGlkLCBmaWVsZCBuYW1lKQorICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRNZXRhZGF0YVR5cGVzKE1ldGFkYXRhIG0sIFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIAkKKyAgCQkvLyBtYXAgY29udGFpbmluZyBtZXRhZGF0YSB0eXBlIChpZCwgbmFtZSkgcGFpcnMKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGFUeXBlcyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisKKyAgICAgIGlmIChnZXRWYWxpZGF0aW9uTGF5ZXIoKSE9bnVsbCkgeworICAgICAgCS8vIHZhbGlkYXRpb24gbGF5ZXI6IGFkZCB2YWxpZCBtZXRhZGF0YSBlbGVtZW50cyAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogZ2V0VmFsaWRhdGlvbkxheWVyKCkuZ2V0RWxlbWVudHMocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpKSkgeworICAgICAgICAgICAgCW1ldGFkYXRhVHlwZXMucHV0KGVsZW1lbnQuZ2V0RWxlbWVudElkKCksIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBvYnRhaW4gZWxlbWVudCBsaXN0IGZvciBwcm9kdWN0IHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgCQorICAgICAgCS8vIG5vIHZhbGlkYXRpb24gbGF5ZXI6IGFkZCBBTEwgbWV0YWRhdGEgZWxlbWVudHMKKyAgICAgIAkvLyB1c2UgKGtleSwga2V5KSBwYWlycyAoaS5lLiBtZXRhZGF0YSBpZCA9PSBtZXRhZGF0YSBuYW1lKQorICAgICAgCWZvciAoU3RyaW5nIGtleSA6IG0uZ2V0QWxsS2V5cygpKSB7CisgICAgICAJCW1ldGFkYXRhVHlwZXMucHV0KGtleSwga2V5KTsKKyAgICAgIAl9CisgICAgICAJCisgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBtZXRhZGF0YVR5cGVzOworICAgICAgCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2FkZE1ldGFkYXRhKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNZXRhZGF0YShNZXRhZGF0YSBtLCBQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgCQorICAJCQkvLyBtYXAgY29udGFpbmluZyBtZXRhZGF0YSB0eXBlIChpZCwgbmFtZSkgcGFpcnMKKyAgICAgIAlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhVHlwZXMgPSBnZXRNZXRhZGF0YVR5cGVzKG0sIHByb2R1Y3QpOworICAgICAgICAgICAgCisgICAgICAgIC8vIGxvb3Agb3ZlciBtZXRhZGF0YSB0eXBlcworICAgICAgICBmb3IgKFN0cmluZyBtZXRhZGF0YUlkIDogbWV0YWRhdGFUeXBlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAJU3RyaW5nIG1ldGFkYXRhTmFtZSA9IG1ldGFkYXRhVHlwZXMuZ2V0KG1ldGFkYXRhSWQpOworICAgICAgICAgICAgCQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG0uZ2V0QWxsTWV0YWRhdGEobWV0YWRhdGFOYW1lKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGogPSB2YWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGoubmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXRhZGF0YVZhbHVlKG1ldGFkYXRhSWQsIHByb2R1Y3QsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcmVtb3ZpbmcgbWV0YWRhdGEuIEVycm9yIGRlbGV0aW5nIGZpZWxkOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhZGF0YUlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI9PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogQXR0ZW1wdGluZyB0byBjb250aW51ZSBwcm9jZXNzaW5nIG1ldGFkYXRhIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICBNZXRhZGF0YSBtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIG1ldGFkYXRhU3FsID0gIlNFTEVDVCAqIEZST00gIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiX21ldGFkYXRhICIKKwkJKyAiV0hFUkUgcHJvZHVjdF9pZCA9ICciICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSsiJyI7CisgICAgICAgICAgICBpZih0aGlzLm9yZGVyZWRWYWx1ZXMpIG1ldGFkYXRhU3FsICs9ICIgT1JERVIgQlkgcGtleSIgOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRNZXRhZGF0YTogRXhlY3V0aW5nOiAiICsgbWV0YWRhdGFTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KG1ldGFkYXRhU3FsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gcGFyc2UgU1FMIHJlc3VsdHMKKyAgICAgICAgICAgIG0gPSBwb3B1bGF0ZVByb2R1Y3RNZXRhZGF0YShycywgcHJvZHVjdCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBtZXRhZGF0YS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorICAgIAorICAgIC8qKiBNZXRob2QgdG8gcG9wdWxhdGUgdGhlIHByb2R1Y3QgbWV0YWRhdGEgZnJvbSBhIFNRTCBSZXN1bHRTZXQuICoqLworICAgIHByaXZhdGUgTWV0YWRhdGEgcG9wdWxhdGVQcm9kdWN0TWV0YWRhdGEoUmVzdWx0U2V0IHJzLCBQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgICAKKyAgICAJTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworCisgICAgICBpZiAoZ2V0VmFsaWRhdGlvbkxheWVyKCkhPW51bGwpIHsKKyAgICAgICAgCisgICAgICAJLy8gdmFsaWRhdGlvbiBsYXllcjogcmV0cmlldmUgdmFsaWQgbWV0YWRhdGEgZWxlbWVudHMKKyAgICAgICAgTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IG51bGw7CisKKyAgICAgIAl0cnkgeworICAgICAgICAgICAgZWxlbWVudHMgPSBnZXRWYWxpZGF0aW9uTGF5ZXIoKS5nZXRFbGVtZW50cyhwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIG9idGFpbiBlbGVtZW50IGxpc3QgZm9yIHByb2R1Y3QgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RWxlbWVudD4gaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgbm93LCB3ZSBqdXN0IHN1cHBvcnQgU1RSSU5HCisgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1WYWx1ZSA9IHJzLmdldFN0cmluZygibWV0YWRhdGFfdmFsdWUiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbUlkID0gcnMuZ2V0U3RyaW5nKCJlbGVtZW50X2lkIik7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbUlkLmVxdWFscyhlLmdldEVsZW1lbnRJZCgpKSkgeworICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSAoZWxlbVZhbHVlICE9IG51bGwgPyBlbGVtVmFsdWUgOiAiIik7CisgICAgICAgICAgICAgICAgICAgIG0uYWRkTWV0YWRhdGEoZS5nZXRFbGVtZW50TmFtZSgpLCBlbGVtVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgCQorICAgICAgCS8vIG5vIHZhbGlkYXRpb24gbGF5ZXIgLSBhZGQgYWxsIChuYW1lLCB2YWx1ZSkgcGFpcnMgZm9yIHRoaXMgcHJvZHVjdF9pZCBxdWVyeQorICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAvLyByaWdodCBub3csIHdlIGp1c3Qgc3VwcG9ydCBTVFJJTkcKKyAgICAgICAgICAgIFN0cmluZyBlbGVtVmFsdWUgPSBycy5nZXRTdHJpbmcoIm1ldGFkYXRhX3ZhbHVlIik7CisgICAgICAgICAgICBTdHJpbmcgZWxlbUlkID0gcnMuZ2V0U3RyaW5nKCJlbGVtZW50X2lkIik7CisKKyAgICAgICAgICAgIGVsZW1WYWx1ZSA9IChlbGVtVmFsdWUgIT0gbnVsbCA/IGVsZW1WYWx1ZSA6ICIiKTsKKyAgICAgICAgICAgIG0uYWRkTWV0YWRhdGEoZWxlbUlkLCBlbGVtVmFsdWUpOyAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIG07CisgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIE1ldGFkYXRhIGdldFJlZHVjZWRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsIExpc3Q8U3RyaW5nPiBlbGVtcykgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgTWV0YWRhdGEgbSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBlbGVtZW50SWRzID0gIiI7CisgICAgICAgICAgICBpZiAoZWxlbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgCQorICAgICAgICAgICAgCSAgaWYgKGdldFZhbGlkYXRpb25MYXllcigpIT1udWxsKSB7CisgICAgICAgICAgICAJICAJLy8gdmFsaWRhdGlvbiBsYXllcjogY29sdW1uICJlbGVtZW50X2lkIiBjb250YWlucyB0aGUgZWxlbWVudCBpZGVudGlmaWVyIChlLmcuICJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIikKKwkgICAgICAgICAgICAgICAgZWxlbWVudElkcyArPSAiIEFORCAoZWxlbWVudF9pZCA9ICciICsgdGhpcy5nZXRWYWxpZGF0aW9uTGF5ZXIoKS5nZXRFbGVtZW50QnlOYW1lKGVsZW1zLmdldCgwKSkuZ2V0RWxlbWVudElkKCkgKyAiJyI7CisJICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZWxlbXMuc2l6ZSgpOyBpKyspIAorCSAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkcyArPSAiIE9SIGVsZW1lbnRfaWQgPSAnIiArIHRoaXMuZ2V0VmFsaWRhdGlvbkxheWVyKCkuZ2V0RWxlbWVudEJ5TmFtZShlbGVtcy5nZXQoaSkpLmdldEVsZW1lbnRJZCgpICsgIiciOworCSAgICAgICAgICAgICAgICBlbGVtZW50SWRzICs9ICIpIjsKKyAgICAgICAgICAgIAkgCisgICAgICAgICAgICAJICB9IGVsc2UgeworICAgICAgICAgICAgCSAgCS8vIG5vIHZhbGlkYXRpb24gbGF5ZXI6IGNvbHVtbiAiZWxlbWVudF9pZCIgY29udGFpbnMgdGhlIGVsZW1lbnQgbmFtZSAoZS5nLiAiQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiKQorCSAgICAgICAgICAgICAgICBlbGVtZW50SWRzICs9ICIgQU5EIChlbGVtZW50X2lkID0gJyIgKyBlbGVtcy5nZXQoMCkgKyAiJyI7CisJICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZWxlbXMuc2l6ZSgpOyBpKyspIAorCSAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkcyArPSAiIE9SIGVsZW1lbnRfaWQgPSAnIiArIGVsZW1zLmdldChpKSArICInIjsKKwkgICAgICAgICAgICAgICAgZWxlbWVudElkcyArPSAiKSI7CisJICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgfQorICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWV0YWRhdGFTcWwgPSAiU0VMRUNUIGVsZW1lbnRfaWQsbWV0YWRhdGFfdmFsdWUgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSArICJfbWV0YWRhdGEiCisJCSsgIiBXSEVSRSBwcm9kdWN0X2lkID0gIiArIHF1b3RlSXQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSkgKyBlbGVtZW50SWRzOworICAgICAgICAgICAgaWYodGhpcy5vcmRlcmVkVmFsdWVzKSBtZXRhZGF0YVNxbCArPSAiIE9SREVSIEJZIHBrZXkiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRNZXRhZGF0YTogRXhlY3V0aW5nOiAiICsgbWV0YWRhdGFTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KG1ldGFkYXRhU3FsKTsKKworICAgICAgICAgICAgLy8gcGFyc2UgU1FMIHJlc3VsdHMKKyAgICAgICAgICAgIG0gPSBwb3B1bGF0ZVByb2R1Y3RNZXRhZGF0YShycywgcHJvZHVjdCk7CisKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIG1ldGFkYXRhLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1ldGFkYXRhVmFsdWUoU3RyaW5nIGtleSwKKyAgICAgICAgICAgIFByb2R1Y3QgcHJvZHVjdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICAgICAgU3RyaW5nIG1ldGFkYXRhVGFibGUgPSBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSI7CisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICAvLyBidWlsZCB1cCB0aGUgc3FsIHN0YXRlbWVudAorICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGluc2VydENsYXVzZVNxbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB2YWx1ZUNsYXVzZVNxbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgaW5zZXJ0Q2xhdXNlU3FsLmFwcGVuZCgiSU5TRVJUIElOVE8gIiArIG1ldGFkYXRhVGFibGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIChwcm9kdWN0X2lkLCBlbGVtZW50X2lkLCBtZXRhZGF0YV92YWx1ZSkgIik7CisgICAgICAgICAgICB2YWx1ZUNsYXVzZVNxbC5hcHBlbmQoIlZBTFVFUyAiKTsKKworICAgICAgICAgICAgLy8gbm93IGRvIHRoZSB2YWx1ZSBjbGF1c2UKKyAgICAgICAgICAgIGlmIChmaWVsZElkU3RyaW5nRmxhZykgeworICAgICAgICAgICAgICAgIHZhbHVlQ2xhdXNlU3FsLmFwcGVuZCgiKCIgKyBxdW90ZUl0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpICsgIiwgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIicsICciICsgdmFsdWUgKyAiJykiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsdWVDbGF1c2VTcWwuYXBwZW5kKCIoIiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGtleSArICIsICciICsgdmFsdWUgKyAiJykiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG1ldGFJbmdlc3RTcWwgPSBpbnNlcnRDbGF1c2VTcWwudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICArIHZhbHVlQ2xhdXNlU3FsLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgLmxvZyhMZXZlbC5GSU5FLCAiYWRkTWV0YWRhdGFWYWx1ZTogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhSW5nZXN0U3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKG1ldGFJbmdlc3RTcWwpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSBDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSB3aXRoIHByb2R1Y3RzLnByb2R1Y3RfZGF0ZXRpbWUKKyAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIpICYmIHRoaXMucHJvZHVjdElkU3RyaW5nKSB7CisgICAgICAgICAgICAJCS8vIGNvbnZlcnQgZnJvbSAiMjAxMi0xMi0xOFQwOTowMDoxNC4wNjgtMDg6MDAiIC0tPiAiMjAxMi0xMi0xOFQwOTowMDoxNC4wNjgtMDgwMCIgLS0+ICIyMDEyLTEyLTE4VDEwOjAwOjE0IgorICAgICAgICAgICAgCQlTdHJpbmcgZGF0ZXRpbWUgPSBkYkZvcm1hdC5mb3JtYXQoIGlzb0Zvcm1hdC5wYXJzZSggdmFsdWUucmVwbGFjZUFsbCgiOjAwJCIsICIwMCIpICkpOworICAgICAgICAgICAgCQlTdHJpbmcgdXBkYXRlRGF0ZVRpbWVTcWwgPSAiVVBEQVRFIHByb2R1Y3RzIFNFVCBwcm9kdWN0X2RhdGV0aW1lPSciK2RhdGV0aW1lKyInIFdIRVJFIHByb2R1Y3RfaWQ9IitxdW90ZUl0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgICAgICAgCQlMT0cubG9nKExldmVsLkZJTkUsICJhZGRNZXRhZGF0YVZhbHVlOiBFeGVjdXRpbmc6ICIrdXBkYXRlRGF0ZVRpbWVTcWwpOworICAgICAgICAgICAgCQlzdGF0ZW1lbnQuZXhlY3V0ZSh1cGRhdGVEYXRlVGltZVNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGFkZGluZyBtZXRhZGF0YSB2YWx1ZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGFkZCBtZXRhZGF0YSB2YWx1ZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTWV0YWRhdGFWYWx1ZShTdHJpbmcgZWxlbWVudElkLAorICAgICAgICAgICAgUHJvZHVjdCBwcm9kdWN0LCBTdHJpbmcgdmFsdWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICBTdHJpbmcgbWV0YWRhdGFUYWJsZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIC8vIGJ1aWxkIHVwIHRoZSBzcWwgc3RhdGVtZW50CisgICAgICAgICAgICBTdHJpbmcgbWV0UmVtb3ZlU3FsID0gIkRFTEVURSBGUk9NICIgKyBtZXRhZGF0YVRhYmxlICsgIiBXSEVSRSAiOworICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgbWV0UmVtb3ZlU3FsICs9ICJQUk9EVUNUX0lEID0gJyIgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICInIEFORCAiOworICAgICAgICAgICAgICAgIG1ldFJlbW92ZVNxbCArPSAiRUxFTUVOVF9JRCA9ICciICsgZWxlbWVudElkCisgICAgICAgICAgICAgICAgICAgICAgICArICInIEFORCAiOworICAgICAgICAgICAgICAgIG1ldFJlbW92ZVNxbCArPSAiTUVUQURBVEFfVkFMVUUgPSAnIiArIHZhbHVlICsgIiciOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXRSZW1vdmVTcWwgKz0gIlBST0RVQ1RfSUQgPSAiICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEFORCAiOworICAgICAgICAgICAgICAgIG1ldFJlbW92ZVNxbCArPSAiRUxFTUVOVF9JRCA9ICIgKyBlbGVtZW50SWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBTkQgIjsKKyAgICAgICAgICAgICAgICBtZXRSZW1vdmVTcWwgKz0gIk1FVEFEQVRBX1ZBTFVFID0gIiArIHZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJyZW1vdmVNZXRhZGF0YVZhbHVlOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtZXRSZW1vdmVTcWwpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUobWV0UmVtb3ZlU3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHJlbW92aW5nIG1ldGFkYXRhIHZhbHVlLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayByZW1vdmUgbWV0YWRhdGEgdmFsdWUuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIG1ldGhvZCBmcm9tIHN1cGVyY2xhc3MgdG8gYWxsb3cgZm9yIG51bGwgdmFsaWRhdGlvbiBsYXllci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFJlc3VsdExpc3RTaXplKFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBpbnQgcmVzdWx0Q291bnQgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0UHJvZHVjdFNxbCA9ICIiOworICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSI7CisgICAgICAgICAgICBTdHJpbmcgc3ViU2VsZWN0UXVlcnlCYXNlID0gIlNFTEVDVCBwcm9kdWN0X2lkIEZST00gIiArIHRhYmxlTmFtZQorICAgICAgICAgICAgICAgICAgICArICIgIjsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzZWxlY3RDbGF1c2UgPSBuZXcgU3RyaW5nQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIENPVU5UKERJU1RJTkNUIHAucHJvZHVjdF9pZCkgQVMgbnVtUmVzdWx0cyAiKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBmcm9tQ2xhdXNlID0gbmV3IFN0cmluZ0J1ZmZlcigiRlJPTSAiICsgdGFibGVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBwICIpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1ZmZlcigiV0hFUkUgIik7CisKKyAgICAgICAgICAgIGJvb2xlYW4gZ290Rmlyc3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBjbGF1c2VOdW0gPSAwOworCisgICAgICAgICAgICBpZiAocXVlcnkuZ2V0Q3JpdGVyaWEoKSAhPSBudWxsICYmIHF1ZXJ5LmdldENyaXRlcmlhKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8UXVlcnlDcml0ZXJpYT4gaSA9IHF1ZXJ5LmdldENyaXRlcmlhKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5Q3JpdGVyaWEgY3JpdGVyaWEgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2xhdXNlTnVtKys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRJZFN0ciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIAkJaWYgKGdldFZhbGlkYXRpb25MYXllcigpIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAkJCWVsZW1lbnRJZFN0ciA9ICInIiArIHRoaXMuZ2V0VmFsaWRhdGlvbkxheWVyKCkuZ2V0RWxlbWVudEJ5TmFtZShjcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpKS5nZXRFbGVtZW50SWQoKSArICInIjsKKyAgICAgICAgICAgICAgICAgICAgCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJCQllbGVtZW50SWRTdHIgPSAiJyIgKyBjcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpICsgIiciOworICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCWlmIChnZXRWYWxpZGF0aW9uTGF5ZXIoKSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkU3RyID0gdGhpcy5nZXRWYWxpZGF0aW9uTGF5ZXIoKS5nZXRFbGVtZW50QnlOYW1lKGNyaXRlcmlhLmdldEVsZW1lbnROYW1lKCkpLmdldEVsZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCQllbGVtZW50SWRTdHIgPSBjcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXVzZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnb3RGaXJzdENsYXVzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlID0gIihwLmVsZW1lbnRfaWQgPSAiICsgZWxlbWVudElkU3RyICsgIiBBTkQgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcml0ZXJpYSBpbnN0YW5jZW9mIFRlcm1RdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIgbWV0YWRhdGFfdmFsdWUgTElLRSAnJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChUZXJtUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpLmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiUnKSAiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcml0ZXJpYSBpbnN0YW5jZW9mIFJhbmdlUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGFydFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVzaXZlID0gKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluY2x1c2l2ZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGFydFZhbCAhPSBudWxsICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGVuZFZhbCAhPSBudWxsICYmICFlbmRWYWwuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIgbWV0YWRhdGFfdmFsdWUgIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdvdFN0YXJ0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwgJiYgIXN0YXJ0VmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICI+PSAnIiArIHN0YXJ0VmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiPiAnIiArIHN0YXJ0VmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290U3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFZhbCAhPSBudWxsICYmICFlbmRWYWwuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdFN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1c2l2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIgQU5EIG1ldGFkYXRhX3ZhbHVlIDw9ICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIiBBTkQgbWV0YWRhdGFfdmFsdWUgPCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICI8PSAnIiArIGVuZFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIjwgJyIgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIikgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZS5hcHBlbmQoY2xhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdEZpcnN0Q2xhdXNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWJTZWxlY3RUYmxOYW1lID0gInAiICsgY2xhdXNlTnVtOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlNlbGVjdFF1ZXJ5ID0gc3ViU2VsZWN0UXVlcnlCYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIldIRVJFIChlbGVtZW50X2lkID0gIiArIGVsZW1lbnRJZFN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQU5EICI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNlbGVjdFF1ZXJ5ICs9ICIgbWV0YWRhdGFfdmFsdWUgTElLRSAnJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChUZXJtUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpLmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiUnKSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyaXRlcmlhIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXJ0VmFsID0gKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXJ0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kVmFsID0gKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuZFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCB8fCBlbmRWYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIG1ldGFkYXRhX3ZhbHVlICI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBnb3RTdGFydCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiPj0gJyIgKyBzdGFydFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiAhZW5kVmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3RTdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNlbGVjdFF1ZXJ5ICs9ICIgQU5EIG1ldGFkYXRhX3ZhbHVlIDw9ICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVuZFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNlbGVjdFF1ZXJ5ICs9ICI8PSAnIiArIGVuZFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNlbGVjdFF1ZXJ5ICs9ICIpICI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb21DbGF1c2UuYXBwZW5kKCJJTk5FUiBKT0lOICgiICsgc3ViU2VsZWN0UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgc3ViU2VsZWN0VGJsTmFtZSArICIgT04gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1YlNlbGVjdFRibE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnByb2R1Y3RfaWQgPSBwLnByb2R1Y3RfaWQgIik7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2V0UHJvZHVjdFNxbCA9IHNlbGVjdENsYXVzZS50b1N0cmluZygpICsgZnJvbUNsYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKGdvdEZpcnN0Q2xhdXNlKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvZHVjdFNxbCArPSB3aGVyZUNsYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImNhdGFsb2cgZ2V0IG51bSByZXN1bHRzOiBleGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRQcm9kdWN0U3FsKTsKKworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFByb2R1Y3RTcWwpOworCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Q291bnQgPSBycy5nZXRJbnQoIm51bVJlc3VsdHMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBwZXJmb3JtaW5nIGdldCBudW0gcmVzdWx0cy4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0IG51bSByZXN1bHRzIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIG1ldGhvZCBmcm9tIHN1cGVyY2xhc3MgdG8gYWxsb3cgZm9yIG51bGwgdmFsaWRhdGlvbiBsYXllci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNxbFF1ZXJ5KFF1ZXJ5Q3JpdGVyaWEgcXVlcnlDcml0ZXJpYSwgUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiwgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgc3FsUXVlcnkgPSBudWxsOworICAgICAgaWYgKHF1ZXJ5Q3JpdGVyaWEgaW5zdGFuY2VvZiBCb29sZWFuUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgIEJvb2xlYW5RdWVyeUNyaXRlcmlhIGJxYyA9IChCb29sZWFuUXVlcnlDcml0ZXJpYSkgcXVlcnlDcml0ZXJpYTsKKyAgICAgICAgICBpZiAoYnFjLmdldE9wZXJhdG9yKCkgPT0gQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuTk9UKSB7CisgICAgICAgICAgCSAgaWYgKCF0aGlzLnByb2R1Y3RJZFN0cmluZykgeworICAgICAgICAgIAkgIAlzcWxRdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1QgcHJvZHVjdF9pZCBGUk9NICIgKyB0eXBlLmdldE5hbWUoKSArICJfbWV0YWRhdGEgV0hFUkUgcHJvZHVjdF9pZCBOT1QgSU4gKCIgKyB0aGlzLmdldFNxbFF1ZXJ5KGJxYy5nZXRUZXJtcygpLmdldCgwKSwgdHlwZSkgKyAiKSI7CisgICAgICAgICAgCSAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIAlzcWxRdWVyeSA9ICJTRUxFQ1QgRElTVElOQ1QgcHJvZHVjdHMucHJvZHVjdF9pZCBGUk9NIHByb2R1Y3RzLCIgKyB0eXBlLmdldE5hbWUoKSArICJfbWV0YWRhdGEiCisgICAgICAgICAgICAgICAJCQkJCSArICIgV0hFUkUgcHJvZHVjdHMucHJvZHVjdF9pZD0iK3R5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YS5wcm9kdWN0X2lkIiAKKyAgICAgICAgICAJICAJCQkgICAgICsgIiBBTkQgcHJvZHVjdHMucHJvZHVjdF9pZCBOT1QgSU4gKCIgKyB0aGlzLmdldFNxbFF1ZXJ5KGJxYy5nZXRUZXJtcygpLmdldCgwKSwgdHlwZSkgKyAiKSI7CisgICAgICAgICAgCSAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNxbFF1ZXJ5ID0gIigiICsgdGhpcy5nZXRTcWxRdWVyeShicWMuZ2V0VGVybXMoKS5nZXQoMCksIHR5cGUpOworICAgICAgICAgICAgICBTdHJpbmcgb3AgPSBicWMuZ2V0T3BlcmF0b3IoKSA9PSBCb29sZWFuUXVlcnlDcml0ZXJpYS5BTkQgPyAiSU5URVJTRUNUIiA6ICJVTklPTiI7CisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYnFjLmdldFRlcm1zKCkuc2l6ZSgpOyBpKyspIAorICAgICAgICAgICAgICAgICAgc3FsUXVlcnkgKz0gIikgIiArIG9wICsgIiAoIiArIHRoaXMuZ2V0U3FsUXVlcnkoYnFjLmdldFRlcm1zKCkuZ2V0KGkpLCB0eXBlKTsKKyAgICAgICAgICAgICAgc3FsUXVlcnkgKz0gIikiOworICAgICAgICAgIH0KKyAgICAgIH1lbHNlIHsKKyAgICAgIAkgIFN0cmluZyBlbGVtZW50SWRTdHIgPSBxdWVyeUNyaXRlcmlhLmdldEVsZW1lbnROYW1lKCk7CisgICAgICAJICBpZiAodGhpcy5nZXRWYWxpZGF0aW9uTGF5ZXIoKSE9bnVsbCkgeworICAgICAgCSAgCWVsZW1lbnRJZFN0ciA9IHRoaXMuZ2V0VmFsaWRhdGlvbkxheWVyKCkuZ2V0RWxlbWVudEJ5TmFtZShxdWVyeUNyaXRlcmlhLmdldEVsZW1lbnROYW1lKCkpLmdldEVsZW1lbnRJZCgpOworICAgICAgCSAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChmaWVsZElkU3RyaW5nRmxhZykgCisgICAgICAgICAgICAgIGVsZW1lbnRJZFN0ciA9ICInIiArIGVsZW1lbnRJZFN0ciArICInIjsKKyAgICAgICAgICBpZiAoIXRoaXMucHJvZHVjdElkU3RyaW5nKSB7CisgICAgICAgICAgCXNxbFF1ZXJ5ID0gIlNFTEVDVCBESVNUSU5DVCBwcm9kdWN0X2lkIEZST00gIiArIHR5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSBXSEVSRSBlbGVtZW50X2lkID0gIiArIGVsZW1lbnRJZFN0ciArICIgQU5EICI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAJc3FsUXVlcnkgPSAiU0VMRUNUIERJU1RJTkNUIHByb2R1Y3RzLnByb2R1Y3RfaWQgRlJPTSBwcm9kdWN0cywiICsgdHlwZS5nZXROYW1lKCkgKyAiX21ldGFkYXRhIgorICAgICAgICAgIAkgICAgICAgICArICIgV0hFUkUgcHJvZHVjdHMucHJvZHVjdF9pZD0iK3R5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YS5wcm9kdWN0X2lkIiAKKyAgICAgICAgICAJCQkgICAgICsgIiBBTkQgZWxlbWVudF9pZCA9ICIgKyBlbGVtZW50SWRTdHIgKyAiIEFORCAiOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocXVlcnlDcml0ZXJpYSBpbnN0YW5jZW9mIFRlcm1RdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICAgIHNxbFF1ZXJ5ICs9ICJtZXRhZGF0YV92YWx1ZSA9ICciICsgKChUZXJtUXVlcnlDcml0ZXJpYSkgcXVlcnlDcml0ZXJpYSkuZ2V0VmFsdWUoKSArICInIjsKKyAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5Q3JpdGVyaWEgaW5zdGFuY2VvZiBSYW5nZVF1ZXJ5Q3JpdGVyaWEpIHsKKyAgICAgICAgICAgICAgUmFuZ2VRdWVyeUNyaXRlcmlhIHJxYyA9IChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIHF1ZXJ5Q3JpdGVyaWE7CisgICAgICAgICAgICAgIFN0cmluZyByYW5nZVN1YlF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgaWYgKHJxYy5nZXRTdGFydFZhbHVlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgIHJhbmdlU3ViUXVlcnkgPSAibWV0YWRhdGFfdmFsdWUiICsgKHJxYy5nZXRJbmNsdXNpdmUoKSA/ICIgPj0gIiA6ICIgPiAiKSArICInIiArIHJxYy5nZXRTdGFydFZhbHVlKCkgKyAiJyI7CisgICAgICAgICAgICAgIGlmIChycWMuZ2V0RW5kVmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VTdWJRdWVyeSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlU3ViUXVlcnkgPSAibWV0YWRhdGFfdmFsdWUiICsgKHJxYy5nZXRJbmNsdXNpdmUoKSA/ICIgPD0gIiA6ICIgPCAiKSArICInIiArIHJxYy5nZXRFbmRWYWx1ZSgpICsgIiciOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlU3ViUXVlcnkgPSAiKCIgKyByYW5nZVN1YlF1ZXJ5ICsgIiBBTkQgbWV0YWRhdGFfdmFsdWUiICsgKHJxYy5nZXRJbmNsdXNpdmUoKSA/ICIgPD0gIiA6ICIgPCAiKSArICInIiArIHJxYy5nZXRFbmRWYWx1ZSgpICsgIicpIjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzcWxRdWVyeSArPSByYW5nZVN1YlF1ZXJ5OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJJbnZhbGlkIFF1ZXJ5Q3JpdGVyaWEgWyIgKyBxdWVyeUNyaXRlcmlhLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIl0iKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBzcWxRdWVyeTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9MdWNlbmVDYXRhbG9nLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9MdWNlbmVDYXRhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzNzVjNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL0x1Y2VuZUNhdGFsb2cuamF2YQpAQCAtMCwwICsxLDE0OTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL0x1Y2VuZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQuU3RhbmRhcmRBbmFseXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuQ2xhdXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkhpdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkluZGV4U2VhcmNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlJhbmdlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNvcnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guVGVybVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5XaWxkY2FyZFF1ZXJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkJvb2xlYW5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJhbmdlUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnBhZ2luYXRpb24uUGFnaW5hdGlvblV0aWxzOworCisvL0pVRyBpbXBvcnRzCitpbXBvcnQgb3JnLnNhZmVoYXVzLnV1aWQuVVVJRDsKK2ltcG9ydCBvcmcuc2FmZWhhdXMudXVpZC5VVUlER2VuZXJhdG9yOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBsdWNhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBGaWxlIHtAbGluayBDYXRhbG9nfSB1c2luZyBBcGFjaGUncyBwb3B1bGFyIDxhCisgKiBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmciPkx1Y2VuZTwvYT4gdGV4dCBpbmRleGluZyBlbmdpbmUgYXMgYQorICogYmFja2VuZC4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgTHVjZW5lQ2F0YWxvZyBpbXBsZW1lbnRzIENhdGFsb2cgeworCisgICAgLyogdGhlIHBhdGggdG8gdGhlIGluZGV4IGRpcmVjdG9yeSBmb3IgdGhpcyBjYXRhbG9nICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5kZXhGaWxlUGF0aCA9IG51bGw7CisKKyAgICAvKiB2YWxpZGF0aW9uIGxheWVyICovCisgICAgcHJpdmF0ZSBWYWxpZGF0aW9uTGF5ZXIgdmFsTGF5ZXIgPSBudWxsOworCisgICAgLyoKKyAgICAgKiB0ZW1wb3JhcnkgQ2FjaGUgb2YgcHJvZHVjdC9tZXRhZGF0YS9yZWZlcmVuY2UgaW5mb3JtYXRpb24gYmVmb3JlIGl0IGlzCisgICAgICogd3JpdHRlbiB0byB0aGUgaW5kZXgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgQ29tcGxldGVQcm9kdWN0PiBDQVRBTE9HX0NBQ0hFID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21wbGV0ZVByb2R1Y3Q+KCk7CisKKyAgICAvKiBvdXIgcHJvZHVjdCBJRCBnZW5lcmF0b3IgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBVVUlER2VuZXJhdG9yIGdlbmVyYXRvciA9IFVVSURHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTHVjZW5lQ2F0YWxvZy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyogcGFnZSBzaXplIGZvciBwYWdpbmF0aW9uICovCisgICAgcHJpdmF0ZSBpbnQgcGFnZVNpemUgPSAtMTsKKworICAgIC8qIHdyaXRlIGxvY2sgdGltZW91dCBmb3Igd3JpdGluZyB0byB0aGUgaW5kZXggKi8KKyAgICBwcml2YXRlIGxvbmcgd3JpdGVMb2NrVGltZW91dCA9IC0xTDsKKworICAgIC8qIGNvbW1pdCBsb2NrIHRpbWVvdXQgZm9yIHdyaXRpbmcvcmVhZGluZyB0byB0aGUgaW5kZXggKi8KKyAgICBwcml2YXRlIGxvbmcgY29tbWl0TG9ja1RpbWVvdXQgPSAtMUw7CisKKyAgICAvKiBsdWNlbmUgaW5kZXggbWVyZ2UgZmFjdG9yICovCisgICAgcHJpdmF0ZSBpbnQgbWVyZ2VGYWN0b3IgPSAtMTsKKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBwYXJhbSBpZHhGaWxlUGF0aAorICAgICAqICAgICAgICAgICAgQSBmaWxlIHBhdGggcG9pbnRpbmcgdG8gdGhlIGx1Y2VuZSBpbmRleCBkaXJlY3RvcnkgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGNhdGFsb2cuCisgICAgICogQHBhcmFtIHZMYXllcgorICAgICAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gbGF5ZXIgdG8gYmUgdXNlZCBmb3IgdGhpcyBjYXRhbG9nLgorICAgICAqIEBwYXJhbSBwZ1NpemUKKyAgICAgKiAgICAgICAgICAgIFRoZSBzaXplIG9mIHBhZ2VzIHRvIGJlIHVzZWQgd2hlbiBkb2luZyBwYWdpbmF0aW9uIG9mIHRoZQorICAgICAqICAgICAgICAgICAgY2F0YWxvZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tbWl0VGltZW91dAorICAgICAqICAgICAgICAgICAgVGhlIGFtb3VudCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHNob3VsZCBiZSBmbG93ZWQgZG93biB0bworICAgICAqICAgICAgICAgICAgdGhlIEx1Y2VuZSBJbmRleFJlYWRlciBhbmQgSW5kZXhXcml0ZXJzIGZvciB0aGVpciBjb21taXQgbG9jaworICAgICAqICAgICAgICAgICAgdGltZW91dCBwcm9wZXJ0eS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVUaW1lb3V0CisgICAgICogICAgICAgICAgICBUaGUgYW1vdW50IG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgc2hvdWxkIGJlIGZsb3dlZCBkb3duIHRvCisgICAgICogICAgICAgICAgICB0aGUgTHVjZW5lIEluZGV4V3JpdGVycyBmb3IgdGhlaXIgY29tbWl0IGxvY2sgdGltZW91dAorICAgICAqICAgICAgICAgICAgcHJvcGVydHkuCisgICAgICogCisgICAgICogQHBhcmFtIG1lcmdlRmFjdG9yCisgICAgICogICAgICAgICAgICBUaGUgbWVyZ2UgZmFjdG9yIHRvIHVzZSB3aGVuIHdyaXRpbmcgdG8gdGhlIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBMdWNlbmVDYXRhbG9nKFN0cmluZyBpZHhGaWxlUGF0aCwgVmFsaWRhdGlvbkxheWVyIHZMYXllciwKKyAgICAgICAgICAgIGludCBwZ1NpemUsIGxvbmcgY29tbWl0VGltZW91dCwgbG9uZyB3cml0ZVRpbWVvdXQsIGludCBtZXJnZUZhY3RvcikgeworICAgICAgICB0aGlzLmluZGV4RmlsZVBhdGggPSBpZHhGaWxlUGF0aDsKKyAgICAgICAgdGhpcy52YWxMYXllciA9IHZMYXllcjsKKyAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBnU2l6ZTsKKyAgICAgICAgdGhpcy53cml0ZUxvY2tUaW1lb3V0ID0gd3JpdGVUaW1lb3V0OworICAgICAgICB0aGlzLmNvbW1pdExvY2tUaW1lb3V0ID0gY29tbWl0VGltZW91dDsKKyAgICAgICAgdGhpcy5tZXJnZUZhY3RvciA9IG1lcmdlRmFjdG9yOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNhZGRNZXRhZGF0YShvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhLAorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTWV0YWRhdGEoTWV0YWRhdGEgbSwgUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBDb21wbGV0ZVByb2R1Y3QgcCA9IENBVEFMT0dfQ0FDSEUuZ2V0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworCisgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgCS8vIG1vdmUgcHJvZHVjdCBmcm9tIGluZGV4IHRvIGNhY2hlCisgICAgICAgIAkvLyBpdCB3aWxsIGJlIG1vdmVkIGJhY2sgYWZ0ZXIgbWV0YWRhdGEgaXMgYWRkZWQKKyAgICAgICAgCXAgPSBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksIHRydWUsIHRydWUpOworICAgICAgICAJTE9HLmxvZyhMZXZlbC5GSU5FLCAiUHJvZHVjdCBub3QgZm91bmQgaW4gbG9jYWwgY2FjaGUsIHJldHJpZXZlZCBmcm9tIGluZGV4Iik7CisgICAgICAgIAlyZW1vdmVQcm9kdWN0KHByb2R1Y3QpOyAgICAgICAgCQkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oIlByb2R1Y3QgWyIrIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICArICJdIG5vdCBmb3VuZCBlaXRoZXIgaW4gbG9jYWwgY2FjaGUgb3IgaW4gaW5kZXgiKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC5zZXRNZXRhZGF0YShtKTsKKyAgICAgICAgICAgIGlmIChoYXNNZXRhZGF0YUFuZFJlZnMocCkpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWRhdGEgYW5kIHJlZmVyZW5jZXMgcHJlc2VudCBmb3IgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpICsgIl0iKTsKKyAgICAgICAgICAgICAgICBhZGRDb21wbGV0ZVByb2R1Y3RUb0luZGV4KHApOworICAgICAgICAgICAgICAgIC8vIG5vdyByZW1vdmUgaXRzIGVudHJ5IGZyb20gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgQ0FUQUxPR19DQUNIRS5yZW1vdmUocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjcmVtb3ZlTWV0YWRhdGEob3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZU1ldGFkYXRhKE1ldGFkYXRhIG0sIFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGxldGVQcm9kdWN0IHAgPSBDQVRBTE9HX0NBQ0hFLmdldChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbiBsb2NhbCBjYWNoZSwgZ2V0IGRvYyBhbmQgcmV3cml0ZSBpbmRleAorICAgICAgICAgICAgU3RyaW5nIHByb2RJZCA9IHByb2R1Y3QuZ2V0UHJvZHVjdElkKCk7CisgICAgICAgICAgICBwID0gZ2V0Q29tcGxldGVQcm9kdWN0QnlJZChwcm9kSWQsIHRydWUsIHRydWUpOworICAgICAgICAgICAgcmVtb3ZlUHJvZHVjdERvY3VtZW50KHByb2R1Y3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm90IGluIGluZGV4CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gcmVtb3ZlIG1ldGFkYXRhIHRvIGEgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gdGhhdCBpc24ndCBpbiB0aGUgaW5kZXggb3IgdGhlIGxvY2FsIGNhY2hlISIpOworCisgICAgICAgIH0KKworICAgICAgICBNZXRhZGF0YSBjdXJyTWV0ID0gcC5nZXRNZXRhZGF0YSgpOworICAgICAgICBMaXN0PFN0cmluZz4gbWV0YWRhdGFUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgIGlmICh2YWxMYXllciE9bnVsbCkgeworCSAgICAgICAgdHJ5IHsKKwkgICAgICAgIAkJLy8gcmVtb3ZlIG1ldGFkYXRhIGVsZW1lbnRzIHNwZWNpZmllZCBieSB2YWxpZGF0aW9uIGxheWVyCisJICAgICAgICAJCWZvciAoRWxlbWVudCBlbGVtZW50IDogdmFsTGF5ZXIuZ2V0RWxlbWVudHMocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpKSkgeworCSAgICAgICAgCQkJbWV0YWRhdGFUeXBlcy5hZGQoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkgICAgICAgIAkJfQorCSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCSAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKAorCSAgICAgICAgICAgICAgICAgICAgIlZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBvYnRhaW4gZWxlbWVudCBsaXN0IGZvciBwcm9kdWN0IHR5cGU6ICIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCS8vIHJlbW92ZSBhbGwgbWV0YWRhdGEKKyAgICAgICAgCW1ldGFkYXRhVHlwZXMgPSBjdXJyTWV0LmdldEFsbEtleXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBtZXRhZGF0YVR5cGVzKSB7CisgICAgICAgICAgICBjdXJyTWV0LnJlbW92ZU1ldGFkYXRhKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcC5zZXRNZXRhZGF0YShjdXJyTWV0KTsKKworICAgICAgICBpZiAoaGFzTWV0YWRhdGFBbmRSZWZzKHApKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsCisgICAgICAgICAgICAgICAgICAgICJtZXRhZGF0YSBhbmQgcmVmZXJlbmNlcyBwcmVzZW50IGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSArICJdIik7CisgICAgICAgICAgICBhZGRDb21wbGV0ZVByb2R1Y3RUb0luZGV4KHApOworICAgICAgICAgICAgLy8gbm93IHJlbW92ZSBpdHMgZW50cnkgZnJvbSB0aGUgY2FjaGUKKyAgICAgICAgICAgIENBVEFMT0dfQ0FDSEUucmVtb3ZlKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2FkZFByb2R1Y3Qob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBsZXRlUHJvZHVjdCBwID0gQ0FUQUxPR19DQUNIRS5nZXQocHJvZHVjdAorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0SWQoKSk7CisKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaGF2ZW4ndCBjYWNoZWQgdGhpcyBwcm9kdWN0IHlldCwgc28gbGV0J3MgY2FjaGUgaXQKKyAgICAgICAgICAgIENvbXBsZXRlUHJvZHVjdCBjb21wbGV0ZVByb2R1Y3QgPSBuZXcgQ29tcGxldGVQcm9kdWN0KCk7CisKKyAgICAgICAgICAgIC8vIE5PVEU6IHJldXNlIGV4aXN0aW5nIElEIGlmIHBvc3NpYmxlCisgICAgICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSA9PSBudWxsKSB7CisJICAgICAgICAgICAgc3luY2hyb25pemVkIChjb21wbGV0ZVByb2R1Y3QpIHsKKwkgICAgICAgICAgICAgICAgLy8gbm93IGdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGUgcHJvZHVjdAorCSAgICAgICAgICAgICAgICBVVUlEIHByb2RVVUlEID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGltZUJhc2VkVVVJRCgpOworCSAgICAgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZChwcm9kVVVJRC50b1N0cmluZygpKTsKKwkgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbXBsZXRlUHJvZHVjdC5zZXRQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICAgICAgQ0FUQUxPR19DQUNIRS5wdXQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSwgY29tcGxldGVQcm9kdWN0KTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIGFkZCBhIHByb2R1Y3QgdGhhdCBhbHJlYWR5IGV4aXN0ZWQ6IHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiXSIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjbW9kaWZ5UHJvZHVjdChvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb2RpZnlQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKENBVEFMT0dfQ0FDSEUuZ2V0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIk1vZGlmeWluZyBwcm9kdWN0OiBbIiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXTogZm91bmQgcHJvZHVjdCBpbiBjYWNoZSEiKTsKKyAgICAgICAgICAgIENvbXBsZXRlUHJvZHVjdCBjcCA9IENBVEFMT0dfQ0FDSEUuZ2V0KHByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgICAgIGNwLnNldFByb2R1Y3QocHJvZHVjdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGdyYWIgdGhlIG1ldGFkYXRhIGZvciB0aGUgZXhpc3RpbmcgcHJvZHVjdCwgYW5kIG1ha2Ugc3VyZQorICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbG9zZSBpdAorICAgICAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YShwcm9kdWN0KTsKKworICAgICAgICAgICAgQ29tcGxldGVQcm9kdWN0IGNvbXBsZXRlUHJvZHVjdCA9IG5ldyBDb21wbGV0ZVByb2R1Y3QoKTsKKyAgICAgICAgICAgIGNvbXBsZXRlUHJvZHVjdC5zZXRNZXRhZGF0YShtZXRhZGF0YSk7CisKKyAgICAgICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIHByb2R1Y3QncyBkb2N1bWVudCBmcm9tIHRoZSBjYXRhbG9nCisgICAgICAgICAgICByZW1vdmVQcm9kdWN0RG9jdW1lbnQocHJvZHVjdCk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgaXQgYmFjaworICAgICAgICAgICAgY29tcGxldGVQcm9kdWN0LnNldFByb2R1Y3QocHJvZHVjdCk7CisgICAgICAgICAgICBhZGRDb21wbGV0ZVByb2R1Y3RUb0luZGV4KGNvbXBsZXRlUHJvZHVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjcmVtb3ZlUHJvZHVjdChvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgcmVtb3ZlUHJvZHVjdERvY3VtZW50KHByb2R1Y3QpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNzZXRQcm9kdWN0VHJhbnNmZXJTdGF0dXMob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLAorICAgICAgICAgICAgICAgICJMdWNlbmVDYXRhbG9nOiBzZXRpbmcgcHJvZHVjdCB0cmFuc2ZlciBzdGF0dXMgdG86IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSArICJdIGZvciAiICsgInByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgKyAiXSIpOworICAgICAgICBtb2RpZnlQcm9kdWN0KHByb2R1Y3QpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNhZGRQcm9kdWN0UmVmZXJlbmNlcyhvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBsZXRlUHJvZHVjdCBwID0gQ0FUQUxPR19DQUNIRS5nZXQocHJvZHVjdAorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0SWQoKSk7CisKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAJLy8gbW92ZSBwcm9kdWN0IGZyb20gaW5kZXggdG8gY2FjaGUKKyAgICAgICAgCS8vIGl0IHdpbGwgYmUgbW92ZWQgYmFjayBhZnRlciBtZXRhZGF0YSBpcyBhZGRlZAorICAgICAgICAJcCA9IGdldENvbXBsZXRlUHJvZHVjdEJ5SWQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIAlMT0cubG9nKExldmVsLkZJTkUsICJQcm9kdWN0IG5vdCBmb3VuZCBpbiBsb2NhbCBjYWNoZSwgcmV0cmlldmVkIGZyb20gaW5kZXgiKTsKKyAgICAgICAgCXJlbW92ZVByb2R1Y3QocHJvZHVjdCk7ICAgICAgICAJCQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigiUHJvZHVjdCBbIisgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICsgIl0gbm90IGZvdW5kIGVpdGhlciBpbiBsb2NhbCBjYWNoZSBvciBpbiBpbmRleCIpOworIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC5nZXRQcm9kdWN0KCkuc2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICAgICAgICAgIGlmIChoYXNNZXRhZGF0YUFuZFJlZnMocCkpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWRhdGEgYW5kIHJlZmVyZW5jZXMgcHJlc2VudCBmb3IgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpICsgIl0iKTsKKyAgICAgICAgICAgICAgICBhZGRDb21wbGV0ZVByb2R1Y3RUb0luZGV4KHApOworICAgICAgICAgICAgICAgIC8vIG5vdyByZW1vdmUgaXRzIGVudHJ5IGZyb20gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgQ0FUQUxPR19DQUNIRS5yZW1vdmUocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRQcm9kdWN0QnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGxldGVQcm9kdWN0IHByb2QgPSBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKHByb2R1Y3RJZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gcHJvZC5nZXRQcm9kdWN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQsIGJvb2xlYW4gZ2V0UmVmcykKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGxldGVQcm9kdWN0IHByb2QgPSBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKHByb2R1Y3RJZCwgZ2V0UmVmcyk7CisgICAgICAgIHJldHVybiBwcm9kLmdldFByb2R1Y3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBsZXRlUHJvZHVjdCBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKHByb2R1Y3RJZCwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGxldGVQcm9kdWN0IGdldENvbXBsZXRlUHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCwKKyAgICAgICAgICAgIGJvb2xlYW4gZ2V0UmVmcykgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGVQcm9kdWN0QnlJZChwcm9kdWN0SWQsIGdldFJlZnMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBsZXRlUHJvZHVjdCBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQsCisgICAgICAgICAgICBib29sZWFuIGdldFJlZnMsIGJvb2xlYW4gZ2V0TWV0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpbmRleEZpbGVQYXRoKTsKKyAgICAgICAgICAgIFRlcm0gcHJvZHVjdElkVGVybSA9IG5ldyBUZXJtKCJwcm9kdWN0X2lkIiwgcHJvZHVjdElkKTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSBxdWVyeSA9IG5ldyBUZXJtUXVlcnkocHJvZHVjdElkVGVybSk7CisgICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnkpOworCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgZXhhY3RseSAxIGhpdAorICAgICAgICAgICAgaWYgKGhpdHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJQcm9kdWN0OiBbIiArIHByb2R1Y3RJZCArICJdIE5PVCBmb3VuZCBpbiB0aGUgY2F0YWxvZyEiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGl0cy5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigiUHJvZHVjdDogWyIgKyBwcm9kdWN0SWQrICJdIGlzIG5vdCB1bmlxdWUgaW4gdGhlIGNhdGFsb2chIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERvY3VtZW50IHByb2R1Y3REb2MgPSBoaXRzLmRvYygwKTsKKyAgICAgICAgICAgIENvbXBsZXRlUHJvZHVjdCBwcm9kID0gdG9Db21wbGV0ZVByb2R1Y3QocHJvZHVjdERvYywgZ2V0UmVmcywKKyAgICAgICAgICAgICAgICAgICAgZ2V0TWV0KTsKKyAgICAgICAgICAgIHJldHVybiBwcm9kOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXhGaWxlUGF0aCArICJdIGZvciBzZWFyY2g6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRQcm9kdWN0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2R1Y3RCeU5hbWUocHJvZHVjdE5hbWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUsIGJvb2xlYW4gZ2V0UmVmcykKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWFyY2hlciA9IG5ldyBJbmRleFNlYXJjaGVyKGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgVGVybSBwcm9kdWN0SWRUZXJtID0gbmV3IFRlcm0oInByb2R1Y3RfbmFtZSIsIHByb2R1Y3ROYW1lKTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSBxdWVyeSA9IG5ldyBUZXJtUXVlcnkocHJvZHVjdElkVGVybSk7CisgICAgICAgICAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsCisgICAgICAgICAgICAgICAgICAgIFNvcnRGaWVsZC5TVFJJTkcsIHRydWUpKTsKKyAgICAgICAgICAgIEhpdHMgaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxdWVyeSwgc29ydCk7CisKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSA+IDAgaGl0cworICAgICAgICAgICAgaWYgKGhpdHMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8ganVzdCBnZXQgdGhlIGZpcnN0IGhpdCBiYWNrCisgICAgICAgICAgICAgICAgRG9jdW1lbnQgcHJvZHVjdERvYyA9IGhpdHMuZG9jKDApOworICAgICAgICAgICAgICAgIENvbXBsZXRlUHJvZHVjdCBwcm9kID0gdG9Db21wbGV0ZVByb2R1Y3QocHJvZHVjdERvYywgZ2V0UmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZC5nZXRQcm9kdWN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiUmVxdWVzdCBmb3IgcHJvZHVjdCBieSBuYW1lOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0TmFtZSArICJdIHJldHVybmVkIG5vIHJlc3VsdHMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXhGaWxlUGF0aCArICJdIGZvciBzZWFyY2g6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRQcm9kdWN0UmVmZXJlbmNlcyhvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3QgcHJvZCA9IGdldFByb2R1Y3RCeUlkKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksIHRydWUpOworICAgICAgICBpZiAocHJvZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRQcm9kdWN0cygpCisgICAgICovCisgICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRQcm9kdWN0cyhmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFByb2R1Y3Q+IGdldFByb2R1Y3RzKGJvb2xlYW4gZ2V0UmVmcykgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaW5kZXhGaWxlUGF0aCk7CisgICAgICAgICAgICBUZXJtIHByb2R1Y3RJZFRlcm0gPSBuZXcgVGVybSgibXlmaWVsZCIsICJteXZhbHVlIik7CisgICAgICAgICAgICBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnkgcXVlcnkgPSBuZXcgVGVybVF1ZXJ5KHByb2R1Y3RJZFRlcm0pOworICAgICAgICAgICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgiQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiLAorICAgICAgICAgICAgICAgICAgICBTb3J0RmllbGQuU1RSSU5HLCB0cnVlKSk7CisgICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnksIHNvcnQpOworCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgPiAwIGhpdHMKKyAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RzID0gbmV3IFZlY3RvcjxQcm9kdWN0PihoaXRzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpdHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBwcm9kdWN0RG9jID0gaGl0cy5kb2MoaSk7CisgICAgICAgICAgICAgICAgICAgIENvbXBsZXRlUHJvZHVjdCBwcm9kID0gdG9Db21wbGV0ZVByb2R1Y3QocHJvZHVjdERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWZzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzLmFkZChwcm9kLmdldFByb2R1Y3QoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZvciBwcm9kdWN0cyByZXR1cm5lZCBubyByZXN1bHRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBvcGVuaW5nIGluZGV4IGRpcmVjdG9yeTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZGV4RmlsZVBhdGggKyAiXSBmb3Igc2VhcmNoOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2VhcmNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWFyY2hlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldFByb2R1Y3RzQnlQcm9kdWN0VHlwZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZSh0eXBlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFByb2R1Y3Q+IGdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZShQcm9kdWN0VHlwZSB0eXBlLCBib29sZWFuIGdldFJlZnMpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpbmRleEZpbGVQYXRoKTsKKyAgICAgICAgICAgIFRlcm0gcHJvZHVjdElkVGVybSA9IG5ldyBUZXJtKCJwcm9kdWN0X3R5cGVfaWQiLCB0eXBlCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUlkKCkpOworICAgICAgICAgICAgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5IHF1ZXJ5ID0gbmV3IFRlcm1RdWVyeShwcm9kdWN0SWRUZXJtKTsKKyAgICAgICAgICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIiwKKyAgICAgICAgICAgICAgICAgICAgU29ydEZpZWxkLlNUUklORywgdHJ1ZSkpOworICAgICAgICAgICAgSGl0cyBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5LCBzb3J0KTsKKworICAgICAgICAgICAgLy8gc2hvdWxkIGJlID4gMCBoaXRzCisgICAgICAgICAgICBpZiAoaGl0cy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0cyA9IG5ldyBWZWN0b3I8UHJvZHVjdD4oaGl0cy5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaXRzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgcHJvZHVjdERvYyA9IGhpdHMuZG9jKGkpOworICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVByb2R1Y3QgcHJvZCA9IHRvQ29tcGxldGVQcm9kdWN0KHByb2R1Y3REb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVmcywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBwcm9kdWN0cy5hZGQocHJvZC5nZXRQcm9kdWN0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FU1QsICJSZXF1ZXN0IGZvciBwcm9kdWN0cyBieSB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSArICJdIHJldHVybmVkIG5vIHJlc3VsdHMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXhGaWxlUGF0aCArICJdIGZvciBzZWFyY2g6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0czsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpbmRleEZpbGVQYXRoKTsKKyAgICAgICAgICAgIFRlcm0gcHJvZHVjdElkVGVybSA9IG5ldyBUZXJtKCJwcm9kdWN0X2lkIiwgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgICAgICBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnkgcXVlcnkgPSBuZXcgVGVybVF1ZXJ5KHByb2R1Y3RJZFRlcm0pOworICAgICAgICAgICAgSGl0cyBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5KTsKKworICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGV4YWN0bHkgMSBoaXQKKyAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigiUHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBub3QgdW5pcXVlIGluIHRoZSBjYXRhbG9nISBOdW0gSGl0czogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaGl0cy5sZW5ndGgoKSArICJdIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERvY3VtZW50IHByb2R1Y3REb2MgPSBoaXRzLmRvYygwKTsKKyAgICAgICAgICAgIENvbXBsZXRlUHJvZHVjdCBwcm9kID0gdG9Db21wbGV0ZVByb2R1Y3QocHJvZHVjdERvYywgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHByb2QuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBvcGVuaW5nIGluZGV4IGRpcmVjdG9yeTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZGV4RmlsZVBhdGggKyAiXSBmb3Igc2VhcmNoOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2VhcmNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWFyY2hlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIE1ldGFkYXRhIGdldFJlZHVjZWRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsIExpc3Q8U3RyaW5nPiBlbGVtZW50cykgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBNZXRhZGF0YSBmdWxsTWV0YWRhdGEgPSBnZXRNZXRhZGF0YShwcm9kdWN0KTsKKyAgICAgICAgTWV0YWRhdGEgcmVkdWNlZE1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBlbGVtZW50cykgeworICAgICAgICAgICAgaWYgKGZ1bGxNZXRhZGF0YS5jb250YWluc0tleShlbGVtZW50KSkKKyAgICAgICAgICAgICAgICByZWR1Y2VkTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGVsZW1lbnQsIGZ1bGxNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YShlbGVtZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZHVjZWRNZXRhZGF0YTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjcXVlcnkob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnksCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBhZ2luYXRlIHByb2R1Y3RzIHJldHVybnMgZnVsbCBwcm9kdWN0cywgYnV0IHRoZSBxdWVyeSBtZXRob2QKKyAgICAgICAgLy8gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHByb2R1Y3QgaWRzCisgICAgICAgIExpc3Q8UHJvZHVjdD4gZnVsbFByb2R1Y3RzID0gcGFnaW5hdGVRdWVyeShxdWVyeSwgdHlwZSwgLTEsIG51bGwpOworICAgICAgICBMaXN0PFN0cmluZz4gcHJvZHVjdElkcyA9IG51bGw7CisKKyAgICAgICAgaWYgKGZ1bGxQcm9kdWN0cyAhPSBudWxsICYmIGZ1bGxQcm9kdWN0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9kdWN0SWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KGZ1bGxQcm9kdWN0cy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFByb2R1Y3Q+IGkgPSBmdWxsUHJvZHVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgcHJvZHVjdElkcy5hZGQocC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdElkczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2cjZ2V0VG9wTlByb2R1Y3RzKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRUb3BOUHJvZHVjdHMoaW50IG4pIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG51bGw7CisgICAgICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWFyY2hlciA9IG5ldyBJbmRleFNlYXJjaGVyKGluZGV4RmlsZVBhdGgpOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBCb29sZWFuIHF1ZXJ5IGhlcmUKKyAgICAgICAgICAgIEJvb2xlYW5RdWVyeSBib29sZWFuUXVlcnkgPSBuZXcgQm9vbGVhblF1ZXJ5KCk7CisgICAgICAgICAgICBUZXJtUXVlcnkgdHEgPSBuZXcgVGVybVF1ZXJ5KG5ldyBUZXJtKCJteWZpZWxkIiwgIm15dmFsdWUiKSk7CisgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKHRxLCBCb29sZWFuQ2xhdXNlLk9jY3VyLk1VU1QpOworCisgICAgICAgICAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsCisgICAgICAgICAgICAgICAgICAgIFNvcnRGaWVsZC5TVFJJTkcsIHRydWUpKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlF1ZXJ5aW5nIEx1Y2VuZUNhdGFsb2c6IHE6IFsiICsgYm9vbGVhblF1ZXJ5CisgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgICAgICAgIEhpdHMgaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChib29sZWFuUXVlcnksIHNvcnQpOworICAgICAgICAgICAgaWYgKGhpdHMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KG4pOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAocHJvZHVjdHMuc2l6ZSgpIDwgTWF0aC5taW4obiwgaGl0cy5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgcHJvZHVjdERvYyA9IGhpdHMuZG9jKGkpOworICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVByb2R1Y3QgcHJvZCA9IHRvQ29tcGxldGVQcm9kdWN0KHByb2R1Y3REb2MsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMuYWRkKHByb2QuZ2V0UHJvZHVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVG9wIE4gcXVlcnkgcHJvZHVjZWQgbm8gcHJvZHVjdHMhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBvcGVuaW5nIGluZGV4IGRpcmVjdG9yeTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZGV4RmlsZVBhdGggKyAiXSBmb3Igc2VhcmNoOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2VhcmNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWFyY2hlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldFRvcE5Qcm9kdWN0cyhpbnQsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRUb3BOUHJvZHVjdHMoaW50IG4sIFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBudW1QYWdlcyA9IDE7CisgICAgICAgIGlmIChuID4gdGhpcy5wYWdlU2l6ZSkgeworICAgICAgICAgICAgbnVtUGFnZXMgPSBuIC8gdGhpcy5wYWdlU2l6ZSArIChuICUgdGhpcy5wYWdlU2l6ZSA9PSAwID8gMCA6IDEpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG5ldyBWZWN0b3I8UHJvZHVjdD4obik7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisKKyAgICAgICAgZm9yIChpbnQgcGFnZU51bSA9IDE7IHBhZ2VOdW0gPCBudW1QYWdlcyArIDE7IHBhZ2VOdW0rKykgeworICAgICAgICAgICAgTGlzdDxQcm9kdWN0PiBwYWdlUHJvZHVjdHMgPSBwYWdpbmF0ZVF1ZXJ5KHF1ZXJ5LCB0eXBlLCBwYWdlTnVtLCBudWxsKTsKKyAgICAgICAgICAgIHByb2R1Y3RzLmFkZEFsbChwYWdlUHJvZHVjdHMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZyNnZXRWYWxpZGF0aW9uTGF5ZXIoKQorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uTGF5ZXIgZ2V0VmFsaWRhdGlvbkxheWVyKCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdmFsTGF5ZXI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI2dldE51bVByb2R1Y3RzKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICByZXR1cm4gZ2V0TnVtSGl0cyhxdWVyeSwgdHlwZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5QYWdpbmF0aW9uI2dldEZpcnN0UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0Rmlyc3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgICAgUHJvZHVjdFBhZ2UgZmlyc3RQYWdlID0gbmV3IFByb2R1Y3RQYWdlKCk7CisgICAgICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBudWxsOworICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICAKKyAgICAgICAgLy8gbm93IGNvbnN0cnVjdCB0aGUgcGFnZQorICAgICAgICBmaXJzdFBhZ2Uuc2V0UGFnZU51bSgxKTsKKyAgICAgICAgZmlyc3RQYWdlLnNldFBhZ2VTaXplKHBhZ2VTaXplKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwcm9kdWN0cyA9IHBhZ2luYXRlUXVlcnkocXVlcnksIHR5cGUsIDEsIGZpcnN0UGFnZSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiQ2F0YWxvZ0V4Y2VwdGlvbiBnZXR0aW5nIGZpcnN0IHBhZ2UgZm9yIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBmcm9tIGNhdGFsb2c6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGVyZSBhcmUgbm8gcHJvZHVjdHMgYW5kIHRodXMgbm8gZmlyc3QgcGFnZQorICAgICAgICBpZiAocHJvZHVjdHMgPT0gbnVsbCB8fCAocHJvZHVjdHMgIT0gbnVsbCAmJiBwcm9kdWN0cy5zaXplKCkgPT0gMCkpIHsKKyAgICAgICAgCQlyZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpcnN0UGFnZS5zZXRQYWdlUHJvZHVjdHMocHJvZHVjdHMpOworCisgICAgICAgIHJldHVybiBmaXJzdFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5QYWdpbmF0aW9uI2dldExhc3RQcm9kdWN0UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TGFzdFByb2R1Y3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgICAgUHJvZHVjdFBhZ2UgbGFzdFBhZ2UgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgUHJvZHVjdFBhZ2UgZmlyc3RQYWdlID0gZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbnVsbDsKKyAgICAgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKyAgICAgICAgCisgICAgICAgIC8vIG5vdyBjb25zdHJ1Y3QgdGhlIHBhZ2UKKyAgICAgICAgbGFzdFBhZ2Uuc2V0UGFnZU51bShmaXJzdFBhZ2UuZ2V0VG90YWxQYWdlcygpKTsKKyAgICAgICAgbGFzdFBhZ2Uuc2V0UGFnZVNpemUocGFnZVNpemUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdHMgPSBwYWdpbmF0ZVF1ZXJ5KHF1ZXJ5LCB0eXBlLCBmaXJzdFBhZ2UuZ2V0VG90YWxQYWdlcygpLCBsYXN0UGFnZSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgIAlMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAiQ2F0YWxvZ0V4Y2VwdGlvbiBnZXR0aW5nIGxhc3QgcGFnZSBmb3IgcHJvZHVjdCB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZnJvbSBjYXRhbG9nOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGVyZSBhcmUgbm8gcHJvZHVjdHMgdGh1cyB0aGVyZSBpcyBubyBsYXN0IHBhZ2UKKyAgICAgICAgaWYgKHByb2R1Y3RzID09IG51bGwgfHwgKHByb2R1Y3RzICE9IG51bGwgJiYgcHJvZHVjdHMuc2l6ZSgpID09IDApKSB7CisgICAgICAgIAkgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGxhc3RQYWdlLnNldFBhZ2VQcm9kdWN0cyhwcm9kdWN0cyk7CisKKyAgICAgICAgcmV0dXJuIGxhc3RQYWdlOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuUGFnaW5hdGlvbiNnZXROZXh0UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlKQorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXROZXh0UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgICAgICBpZiAoY3VycmVudFBhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0UGFnZSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50UGFnZS5pc0xhc3RQYWdlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBudWxsOworICAgICAgICBQcm9kdWN0UGFnZSBuZXh0UGFnZSA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworCisgICAgICAgIC8vIG5vdyBjb25zdHJ1Y3QgdGhlIHBhZ2UKKyAgICAgICAgbmV4dFBhZ2Uuc2V0UGFnZU51bShjdXJyZW50UGFnZS5nZXRQYWdlTnVtKCkgKyAxKTsKKyAgICAgICAgbmV4dFBhZ2Uuc2V0UGFnZVNpemUocGFnZVNpemUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdHMgPSBwYWdpbmF0ZVF1ZXJ5KHF1ZXJ5LCB0eXBlLCBjdXJyZW50UGFnZS5nZXRQYWdlTnVtKCkgKyAxLCBuZXh0UGFnZSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgIkNhdGFsb2dFeGNlcHRpb24gZ2V0dGluZyBuZXh0IHBhZ2UgZm9yIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGZyb20gY2F0YWxvZzogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIGFyZSBubyBwcm9kdWN0cyBhbmQgdGh1cyBubyBuZXh0IHBhZ2UKKyAgICAgICAgaWYgKHByb2R1Y3RzID09IG51bGwgfHwgKHByb2R1Y3RzICE9IG51bGwgJiYgcHJvZHVjdHMuc2l6ZSgpID09IDApKSB7CisgICAgICAgIAkgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIG5leHRQYWdlLnNldFBhZ2VQcm9kdWN0cyhwcm9kdWN0cyk7CisKKyAgICAgICAgcmV0dXJuIG5leHRQYWdlOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuUGFnaW5hdGlvbiNnZXRQcmV2UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlKQorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRQcmV2UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgICAgICBpZiAoY3VycmVudFBhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0UGFnZSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50UGFnZS5pc0ZpcnN0UGFnZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0cyA9IG51bGw7CisgICAgICAgIFByb2R1Y3RQYWdlIHByZXZQYWdlID0gbmV3IFByb2R1Y3RQYWdlKCk7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisKKyAgICAgICAgLy8gbm93IGNvbnN0cnVjdCB0aGUgcGFnZQorICAgICAgICBwcmV2UGFnZSA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgICBwcmV2UGFnZS5zZXRQYWdlTnVtKGN1cnJlbnRQYWdlLmdldFBhZ2VOdW0oKSAtIDEpOworICAgICAgICBwcmV2UGFnZS5zZXRQYWdlU2l6ZShwYWdlU2l6ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0cyA9IHBhZ2luYXRlUXVlcnkocXVlcnksIHR5cGUsIGN1cnJlbnRQYWdlLmdldFBhZ2VOdW0oKSAtIDEsIHByZXZQYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJDYXRhbG9nRXhjZXB0aW9uIGdldHRpbmcgcHJldiBwYWdlIGZvciBwcm9kdWN0IHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZnJvbSBjYXRhbG9nOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoZXJlIGFyZSBubyBwcm9kdWN0cyBhbmQgdGh1cyBubyBwYWdlcworICAgICAgICBpZiAocHJvZHVjdHMgPT0gbnVsbCB8fCAocHJvZHVjdHMgIT0gbnVsbCAmJiBwcm9kdWN0cy5zaXplKCkgPT0gMCkpIHsKKyAgICAgICAgCSAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcHJldlBhZ2Uuc2V0UGFnZVByb2R1Y3RzKHByb2R1Y3RzKTsKKworICAgICAgICByZXR1cm4gcHJldlBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI3BhZ2VkUXVlcnkob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnksCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBwYWdlZFF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlLCBpbnQgcGFnZU51bSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb2R1Y3RQYWdlIHJldFBhZ2UgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgICAgIHJldFBhZ2Uuc2V0UGFnZU51bShwYWdlTnVtKTsKKyAgICAgICAgICAgIHJldFBhZ2Uuc2V0UGFnZVNpemUocGFnZVNpemUpOworICAgICAgICAgICAgcmV0UGFnZS5zZXRQYWdlUHJvZHVjdHMocGFnaW5hdGVRdWVyeShxdWVyeSwgdHlwZSwgcGFnZU51bSwgcmV0UGFnZSkpOworICAgICAgICAgICAgcmV0dXJuIHJldFBhZ2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiQ2F0YWxvZ0V4Y2VwdGlvbiB3aGVuIGRvaW5nIHBhZ2VkIHByb2R1Y3QgcXVlcnk6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9kdWN0RG9jdW1lbnQoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBJbmRleFJlYWRlciByZWFkZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBJbmRleFJlYWRlci5vcGVuKGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLAorICAgICAgICAgICAgICAgICAgICAiTHVjZW5lQ2F0YWxvZzogcmVtb3ZlIGRvY3VtZW50IGZyb20gaW5kZXggZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpICsgIl0iKTsKKyAgICAgICAgICAgIHJlYWRlci5kZWxldGVEb2N1bWVudHMobmV3IFRlcm0oInByb2R1Y3RfaWQiLCBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0SWQoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gcmVtb3ZpbmcgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiXSBmcm9tIGluZGV4OiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkQ29tcGxldGVQcm9kdWN0VG9JbmRleChDb21wbGV0ZVByb2R1Y3QgY3ApCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG51bGw7CisKKyAgICAgICAgRmlsZSBpbmRleERpciA9IG5ldyBGaWxlKGluZGV4RmlsZVBhdGgpOworCisgICAgICAgIGJvb2xlYW4gY3JlYXRlSW5kZXggPSBmYWxzZTsKKworICAgICAgICBpZiAoaW5kZXhEaXIuZXhpc3RzKCkgJiYgaW5kZXhEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgY3JlYXRlSW5kZXggPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjcmVhdGVJbmRleCA9IHRydWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihpbmRleEZpbGVQYXRoLCBuZXcgU3RhbmRhcmRBbmFseXplcigpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmRleCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0Q29tbWl0TG9ja1RpbWVvdXQodGhpcy5jb21taXRMb2NrVGltZW91dCAqIDEwMDApOworICAgICAgICAgICAgd3JpdGVyLnNldFdyaXRlTG9ja1RpbWVvdXQodGhpcy53cml0ZUxvY2tUaW1lb3V0ICogMTAwMCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0TWVyZ2VGYWN0b3IodGhpcy5tZXJnZUZhY3Rvcik7CisKKyAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IHRvRG9jKGNwLmdldFByb2R1Y3QoKSwgY3AuZ2V0TWV0YWRhdGEoKSk7CisgICAgICAgICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKKyAgICAgICAgICAgIC8vIHRha2UgdGhpcyBvdXQgZm9yIG5vdworICAgICAgICAgICAgLy8gVE9ETzogZGV0ZXJtaW5lIGEgYmV0dGVyIHdheSB0byBvcHRpbWl6ZSB0aGUgaW5kZXgKKyAgICAgICAgICAgIC8vIHdyaXRlci5vcHRpbWl6ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gaW5kZXggcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBjcC5nZXRQcm9kdWN0KCkuZ2V0UHJvZHVjdE5hbWUoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oIlVuYWJsZSB0byBpbmRleCBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICArIGNwLmdldFByb2R1Y3QoKS5nZXRQcm9kdWN0TmFtZSgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBDb21wbGV0ZVByb2R1Y3QgdG9Db21wbGV0ZVByb2R1Y3QoRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIHJldHVybiB0b0NvbXBsZXRlUHJvZHVjdChkb2MsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGxldGVQcm9kdWN0IHRvQ29tcGxldGVQcm9kdWN0KERvY3VtZW50IGRvYywgYm9vbGVhbiBnZXRSZWZzLAorICAgICAgICAgICAgYm9vbGVhbiBnZXRNZXRhZGF0YSkgeworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBDb21wbGV0ZVByb2R1Y3QgY29tcGxldGVQcm9kdWN0ID0gbmV3IENvbXBsZXRlUHJvZHVjdCgpOworCisgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdElkKGRvYy5nZXQoInByb2R1Y3RfaWQiKSk7CisgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdE5hbWUoZG9jLmdldCgicHJvZHVjdF9uYW1lIikpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUoZG9jLmdldCgicHJvZHVjdF9zdHJ1Y3R1cmUiKSk7CisgICAgICAgIHByb2R1Y3Quc2V0VHJhbnNmZXJTdGF0dXMoZG9jLmdldCgicHJvZHVjdF90cmFuc2Zlcl9zdGF0dXMiKSk7CisKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICB0eXBlLnNldERlc2NyaXB0aW9uKGRvYy5nZXQoInByb2R1Y3RfdHlwZV9kZXNjIikpOworICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQoZG9jLmdldCgicHJvZHVjdF90eXBlX2lkIikpOworICAgICAgICB0eXBlLnNldE5hbWUoZG9jLmdldCgicHJvZHVjdF90eXBlX25hbWUiKSk7CisgICAgICAgIHR5cGUuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKGRvYy5nZXQoInByb2R1Y3RfdHlwZV9yZXBvUGF0aCIpKTsKKyAgICAgICAgdHlwZS5zZXRWZXJzaW9uZXIoZG9jLmdldCgicHJvZHVjdF90eXBlX3ZlcnNpb25lciIpKTsKKyAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0VHlwZSh0eXBlKTsKKworICAgICAgICBpZiAoZ2V0TWV0YWRhdGEpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgICAgICBpZiAodmFsTGF5ZXIhPW51bGwpIHsKKyAgICAgICAgICAgIAkvLyBvbmx5IGFkZCBtZXRhZGF0YSBlbGVtZW50cyBzcGVjaWZpZWQgYnkgdmFsaWRhdGlvbiBsYXllcgorCSAgICAgICAgICAgIHRyeSB7CisJICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogdmFsTGF5ZXIuZ2V0RWxlbWVudHModHlwZSkpIHsKKwkgICAgICAgICAgICAgICAgCW5hbWVzLmFkZChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorCSAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gb2J0YWluIG1ldGFkYXRhIGZvciBwcm9kdWN0OiBbIgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiXTogTWVzc2FnZTogIgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisJICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIAkvLyBhZGQgYWxsIG1ldGFkYXRhIGVsZW1lbnRzIGZvdW5kIGluIGRvY3VtZW50CisgICAgICAgICAgICAJRW51bWVyYXRpb248RmllbGQ+IGZpZWxkcyA9IGRvYy5maWVsZHMoKTsKKyAgICAgICAgICAgIAl3aGlsZSAoZmllbGRzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAJCUZpZWxkIGZpZWxkID0gZmllbGRzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAJCWlmICghbmFtZXMuY29udGFpbnMoZmllbGQubmFtZSgpKSkgeworICAgICAgICAgICAgCQkJCW5hbWVzLmFkZChmaWVsZC5uYW1lKCkpOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb29wIG92ZXIgZmllbGQgbmFtZXMgdG8gYWRkIHRvIG1ldGFkYXRhCisgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKKyAgICAgICAgICAgIAkJaWYgKG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKG5hbWUpPT1udWxsIHx8IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKG5hbWUpLnNpemUoKT09MCkgeworCSAgICAgICAgICAgICAgICBTdHJpbmdbXSBlbGVtVmFsdWVzID0gZG9jLmdldFZhbHVlcyhuYW1lKTsKKwkgICAgICAgICAgICAgICAgCQorCSAgICAgICAgICAgICAgICBpZiAoZWxlbVZhbHVlcyAhPSBudWxsICYmIGVsZW1WYWx1ZXMubGVuZ3RoID4gMCkgeworCSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtVmFsdWVzLmxlbmd0aDsgaisrKSB7CisJICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEobmFtZSwgZWxlbVZhbHVlc1tqXSk7CisJICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21wbGV0ZVByb2R1Y3Quc2V0TWV0YWRhdGEobWV0YWRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldFJlZnMpIHsKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhlIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIFN0cmluZ1tdIG9yaWdSZWZzID0gZG9jLmdldFZhbHVlcygicmVmZXJlbmNlX29yaWciKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGRhdGFTdG9yZVJlZnMgPSBkb2MuZ2V0VmFsdWVzKCJyZWZlcmVuY2VfZGF0YV9zdG9yZSIpOworICAgICAgICAgICAgU3RyaW5nW10gcmVmTGVuZ3RocyA9IGRvYy5nZXRWYWx1ZXMoInJlZmVyZW5jZV9maWxlU2l6ZSIpOworICAgICAgICAgICAgU3RyaW5nW10gcmVmTWltZVR5cGVzID0gZG9jLmdldFZhbHVlcygicmVmZXJlbmNlX21pbWVUeXBlIik7CisKKyAgICAgICAgICAgIGlmICgob3JpZ1JlZnMubGVuZ3RoID09IGRhdGFTdG9yZVJlZnMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAmJiAob3JpZ1JlZnMubGVuZ3RoID09IHJlZkxlbmd0aHMubGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gbmV3IFZlY3RvcjxSZWZlcmVuY2U+KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnUmVmcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5zZXRPcmlnUmVmZXJlbmNlKG9yaWdSZWZzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgci5zZXREYXRhU3RvcmVSZWZlcmVuY2UoZGF0YVN0b3JlUmVmc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIHIuc2V0RmlsZVNpemUoKExvbmcucGFyc2VMb25nKHJlZkxlbmd0aHNbaV0pKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZNaW1lVHlwZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0TWltZVR5cGUocmVmTWltZVR5cGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlcy5hZGQocik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiTnVtYmVyIG9mIG9yaWdpbmFsIHJlZnM6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIG9yaWdSZWZzLmxlbmd0aCArICJdIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gbm90IGVxdWl2YWxlbnQgdG8gbnVtYmVyIG9mIGRhdGEgc3RvcmUgcmVmczogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVN0b3JlUmVmcy5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IFNraXBwaW5nIHByb2R1Y3QgcmVmZXJlbmNlcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29tcGxldGVQcm9kdWN0LnNldFByb2R1Y3QocHJvZHVjdCk7CisgICAgICAgIHJldHVybiBjb21wbGV0ZVByb2R1Y3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBEb2N1bWVudCB0b0RvYyhQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOworCisgICAgICAgIC8vIGFkZCB0aGUgcHJvZHVjdCBpbmZvcm1hdGlvbgorICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgicHJvZHVjdF9pZCIsIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksCisgICAgICAgICAgICAgICAgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoInByb2R1Y3RfbmFtZSIsIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSwKKyAgICAgICAgICAgICAgICBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgicHJvZHVjdF9zdHJ1Y3R1cmUiLCBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSwKKyAgICAgICAgICAgICAgICBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICBkb2MKKyAgICAgICAgICAgICAgICAuYWRkKG5ldyBGaWVsZCgicHJvZHVjdF90cmFuc2Zlcl9zdGF0dXMiLCBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmZXJTdGF0dXMoKSwgRmllbGQuU3RvcmUuWUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQuSW5kZXguVU5fVE9LRU5JWkVEKSk7CisKKyAgICAgICAgLy8gcHJvZHVjdCB0eXBlCisgICAgICAgIGRvYworICAgICAgICAgICAgICAgIC5hZGQobmV3IEZpZWxkKCJwcm9kdWN0X3R5cGVfaWQiLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUlkKCksIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgicHJvZHVjdF90eXBlX25hbWUiLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgicHJvZHVjdF90eXBlX2Rlc2MiLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsID8gcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgLmdldERlc2NyaXB0aW9uKCkgOiAiIiwgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5OTykpOworICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgicHJvZHVjdF90eXBlX3JlcG9QYXRoIiwgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpICE9IG51bGwgPyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkgOiAiIiwgRmllbGQuU3RvcmUuWUVTLAorICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4Lk5PKSk7CisgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJwcm9kdWN0X3R5cGVfdmVyc2lvbmVyIiwgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lcigpICE9IG51bGwgPyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAuZ2V0VmVyc2lvbmVyKCkgOiAiIiwgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5OTykpOworICAgICAgICAKKyAgICAgICAgLy8gd3JpdGUgbWV0YWRhdGEgZmllbGRzIHRvIHRoZSBMdWNlbmUgZG9jdW1lbnQKKyAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgLy8gdmFsaWRhdGlvbiBsYXllcjogYWRkIG9ubHkgc3BlY2lmaWNhbGx5IGNvbmZpZ3VyZWQga2V5cworICAgICAgICBpZiAodmFsTGF5ZXIhPW51bGwpIHsKKyAgICAgICAgCUxpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBxdWlldEdldEVsZW1lbnRzKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgIAlmb3IgKEl0ZXJhdG9yPEVsZW1lbnQ+IGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOworICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSk7CisgICAgICAgIAl9CisgICAgICAgIC8vIG5vIHZhbGlkYXRpb24gbGF5ZXI6IGFkZCBhbGwga2V5cyB0aGF0IGFyZSBOT1QgYWxyZWFkeSBpbiBkb2MKKyAgICAgICAgLy8gKG90aGVyd2lzZSBzb21lIGtleXMgc3VjaCBhcyB0aGUgcHJvZHVjdF8qIGtleXMgYXJlIGR1cGxpY2F0ZWQpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlmb3IgKFN0cmluZyBrZXkgOiBtZXRhZGF0YS5nZXRBbGxLZXlzKCkpIHsKKyAgICAgICAgCQlpZiAoZG9jLmdldEZpZWxkKGtleSk9PW51bGwpIHsKKyAgICAgICAgCQkJCWtleXMuYWRkKGtleSk7CisgICAgICAgIAkJfQorICAgICAgICAJfQorICAgICAgICB9CisKKworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7CisgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSk7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIE1ldGFkYXRhIHNwZWNpZmllZCBmb3IgcHJvZHVjdCBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBmb3IgcmVxdWlyZWQgZmllbGQgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IEF0dGVtcHRpbmcgdG8gY29udGludWUgcHJvY2Vzc2luZyBtZXRhZGF0YSIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaiA9IHZhbHVlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gai5uZXh0KCk7CisgICAgICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoa2V5LCB2YWwsIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHRoZSBwcm9kdWN0IHJlZmVyZW5jZXMKKyAgICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGkgPSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgciA9IGkubmV4dCgpOworICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoInJlZmVyZW5jZV9vcmlnIiwgci5nZXRPcmlnUmVmZXJlbmNlKCksCisgICAgICAgICAgICAgICAgICAgIEZpZWxkLlN0b3JlLllFUywgRmllbGQuSW5kZXguTk8pKTsKKyAgICAgICAgICAgIGRvYworICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBGaWVsZCgicmVmZXJlbmNlX2RhdGFfc3RvcmUiLCByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpLCBGaWVsZC5TdG9yZS5ZRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQuSW5kZXguTk8pKTsKKyAgICAgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJyZWZlcmVuY2VfZmlsZVNpemUiLCBTdHJpbmcudmFsdWVPZihyCisgICAgICAgICAgICAgICAgICAgIC5nZXRGaWxlU2l6ZSgpKSwgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5OTykpOworICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoInJlZmVyZW5jZV9taW1lVHlwZSIsIHIuZ2V0TWltZVR5cGUoKSAhPSBudWxsID8gcgorICAgICAgICAgICAgICAgICAgICAuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkgOiAiIiwgRmllbGQuU3RvcmUuWUVTLAorICAgICAgICAgICAgICAgICAgICBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBzcGVjaWFsIGZpZWxkIGZvciBhbGwgcHJvZHVjdHMKKyAgICAgICAgLy8gdGhlbiBjYW4gdXNlIHRoYXQgZmllbGQgdG8gcmV0cmlldmUgYmFjayBhbGwgcHJvZHVjdHMKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIm15ZmllbGQiLCAibXl2YWx1ZSIsIEZpZWxkLlN0b3JlLk5PLAorICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4LlRPS0VOSVpFRCkpOworCisgICAgICAgIHJldHVybiBkb2M7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc01ldGFkYXRhQW5kUmVmcyhDb21wbGV0ZVByb2R1Y3QgY3ApIHsKKyAgICAgICAgaWYgKGNwLmdldE1ldGFkYXRhKCkgIT0gbnVsbCAmJiBjcC5nZXRQcm9kdWN0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNwLmdldFJlZmVyZW5jZXMoKSAhPSBudWxsICYmIGNwLmdldFJlZmVyZW5jZXMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXJlIGlzIGEgZGF0YSBzdG9yZSByZWYgZm9yIGVhY2ggb2YgdGhlIHJlZnMKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlZmVyZW5jZT4gaSA9IGNwLmdldFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChyLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpICE9IG51bGwgJiYgcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXROdW1IaXRzKFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKKworICAgICAgICBpbnQgbnVtSGl0cyA9IC0xOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWFyY2hlciA9IG5ldyBJbmRleFNlYXJjaGVyKGluZGV4RmlsZVBhdGgpOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBCb29sZWFuIHF1ZXJ5IGhlcmUKKyAgICAgICAgICAgIEJvb2xlYW5RdWVyeSBib29sZWFuUXVlcnkgPSBuZXcgQm9vbGVhblF1ZXJ5KCk7CisKKyAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvZHVjdCB0eXBlIGFzIHRoZSBmaXJzdCBjbGF1c2UKKyAgICAgICAgICAgIFRlcm1RdWVyeSBwcm9kVHlwZVRlcm1RdWVyeSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oCisgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0X3R5cGVfaWQiLCB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgICAgYm9vbGVhblF1ZXJ5LmFkZChwcm9kVHlwZVRlcm1RdWVyeSwgQm9vbGVhbkNsYXVzZS5PY2N1ci5NVVNUKTsKKworICAgICAgICAgICAgLy9jb252ZXJ0IGZpbGVtZ3IgcXVlcnkgaW50byBhIGx1Y2VuZSBxdWVyeQorICAgICAgICAgICAgZm9yIChRdWVyeUNyaXRlcmlhIHF1ZXJ5Q3JpdGVyaWEgOiBxdWVyeS5nZXRDcml0ZXJpYSgpKSAKKyAgICAgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKHRoaXMuZ2V0UXVlcnkocXVlcnlDcml0ZXJpYSksIEJvb2xlYW5DbGF1c2UuT2NjdXIuTVVTVCk7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlF1ZXJ5aW5nIEx1Y2VuZUNhdGFsb2c6IHE6IFsiICsgYm9vbGVhblF1ZXJ5CisgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgICAgICAgIEhpdHMgaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChib29sZWFuUXVlcnkpOworICAgICAgICAgICAgbnVtSGl0cyA9IGhpdHMubGVuZ3RoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIHdoZW4gb3BlbmluZyBpbmRleCBkaXJlY3Rvcnk6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmRleEZpbGVQYXRoICsgIl0gZm9yIHNlYXJjaDogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlYXJjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZWFyY2hlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VhcmNoZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bUhpdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFByb2R1Y3Q+IHBhZ2luYXRlUXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUsIGludCBwYWdlTnVtLCBQcm9kdWN0UGFnZSBwYWdlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbnVsbDsKKyAgICAgICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG51bGw7CisKKyAgICAgICAgYm9vbGVhbiBkb1NraXAgPSB0cnVlOworCisgICAgICAgIGlmIChwYWdlTnVtID09IC0xKSB7CisgICAgICAgICAgICBkb1NraXAgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWFyY2hlciA9IG5ldyBJbmRleFNlYXJjaGVyKGluZGV4RmlsZVBhdGgpOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBCb29sZWFuIHF1ZXJ5IGhlcmUKKyAgICAgICAgICAgIEJvb2xlYW5RdWVyeSBib29sZWFuUXVlcnkgPSBuZXcgQm9vbGVhblF1ZXJ5KCk7CisKKyAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvZHVjdCB0eXBlIGFzIHRoZSBmaXJzdCBjbGF1c2UKKyAgICAgICAgICAgIFRlcm1RdWVyeSBwcm9kVHlwZVRlcm1RdWVyeSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oCisgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0X3R5cGVfaWQiLCB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgICAgYm9vbGVhblF1ZXJ5LmFkZChwcm9kVHlwZVRlcm1RdWVyeSwgQm9vbGVhbkNsYXVzZS5PY2N1ci5NVVNUKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9jb252ZXJ0IGZpbGVtZ3IgcXVlcnkgaW50byBhIGx1Y2VuZSBxdWVyeQorICAgICAgICAgICAgZm9yIChRdWVyeUNyaXRlcmlhIHF1ZXJ5Q3JpdGVyaWEgOiBxdWVyeS5nZXRDcml0ZXJpYSgpKSAKKyAgICAgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKHRoaXMuZ2V0UXVlcnkocXVlcnlDcml0ZXJpYSksIEJvb2xlYW5DbGF1c2UuT2NjdXIuTVVTVCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIiwKKyAgICAgICAgICAgICAgICAgICAgU29ydEZpZWxkLlNUUklORywgdHJ1ZSkpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiUXVlcnlpbmcgTHVjZW5lQ2F0YWxvZzogcTogWyIgKyBib29sZWFuUXVlcnkKKyAgICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgICAgSGl0cyBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKGJvb2xlYW5RdWVyeSwgc29ydCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBwYWdlIHNpemUgYW5kIHNldCBpdCB3aGlsZSB3ZSBoYXZlIHRoZSByZXN1bHRzCisgICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAJcGFnZS5zZXRUb3RhbFBhZ2VzKFBhZ2luYXRpb25VdGlscy5nZXRUb3RhbFBhZ2UoaGl0cy5sZW5ndGgoKSwgcGFnZVNpemUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGhpdHMubGVuZ3RoKCkgPiAwKSB7CisKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnROdW0gPSAocGFnZU51bSAtIDEpICogcGFnZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKGRvU2tpcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnROdW0gPiBoaXRzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE51bSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcm9kdWN0cyA9IG5ldyBWZWN0b3I8UHJvZHVjdD4ocGFnZVNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydE51bTsgaSA8IE1hdGgubWluKGhpdHMubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0TnVtICsgcGFnZVNpemUpKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBwcm9kdWN0RG9jID0gaGl0cy5kb2MoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVByb2R1Y3QgcHJvZCA9IHRvQ29tcGxldGVQcm9kdWN0KHByb2R1Y3REb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0cy5hZGQocHJvZC5nZXRQcm9kdWN0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KGhpdHMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpdHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgcHJvZHVjdERvYyA9IGhpdHMuZG9jKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGVQcm9kdWN0IHByb2QgPSB0b0NvbXBsZXRlUHJvZHVjdChwcm9kdWN0RG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMuYWRkKHByb2QuZ2V0UHJvZHVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiUXVlcnk6IFsiICsgcXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZm9yIFByb2R1Y3QgVHlwZTogWyIgKyB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSByZXR1cm5lZCBubyByZXN1bHRzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXhGaWxlUGF0aCArICJdIGZvciBzZWFyY2g6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSBnZXRRdWVyeShRdWVyeUNyaXRlcmlhIHF1ZXJ5Q3JpdGVyaWEpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHF1ZXJ5Q3JpdGVyaWEgaW5zdGFuY2VvZiBCb29sZWFuUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgQm9vbGVhblF1ZXJ5IGJvb2xlYW5RdWVyeSA9IG5ldyBCb29sZWFuUXVlcnkoKTsKKyAgICAgICAgICAgIEJvb2xlYW5DbGF1c2UuT2NjdXIgb2NjdXIgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoICgoKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBxdWVyeUNyaXRlcmlhKS5nZXRPcGVyYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORDoKKyAgICAgICAgICAgICAgICBvY2N1ciA9IEJvb2xlYW5DbGF1c2UuT2NjdXIuTVVTVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuT1I6CisgICAgICAgICAgICAgICAgb2NjdXIgPSBCb29sZWFuQ2xhdXNlLk9jY3VyLlNIT1VMRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuTk9UOgorICAgICAgICAgICAgICAgIG9jY3VyID0gQm9vbGVhbkNsYXVzZS5PY2N1ci5NVVNUX05PVDsKKyAgICAgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKG5ldyBXaWxkY2FyZFF1ZXJ5KG5ldyBUZXJtKCgoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpIHF1ZXJ5Q3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGVybXMoKS5nZXQoMCkuZ2V0RWxlbWVudE5hbWUoKSwgIioiKSksIEJvb2xlYW5DbGF1c2UuT2NjdXIuU0hPVUxEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oIkludmFsaWQgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgb3BlcnRvciBbIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKChCb29sZWFuUXVlcnlDcml0ZXJpYSkgcXVlcnlDcml0ZXJpYSkuZ2V0T3BlcmF0b3IoKSArICJdIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKFF1ZXJ5Q3JpdGVyaWEgcWMgOiAoKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBxdWVyeUNyaXRlcmlhKS5nZXRUZXJtcygpKQorICAgICAgICAgICAgICAgIGJvb2xlYW5RdWVyeS5hZGQodGhpcy5nZXRRdWVyeShxYyksIG9jY3VyKTsKKworICAgICAgICAgICAgcmV0dXJuIGJvb2xlYW5RdWVyeTsKKyAgICAgICAgfSBlbHNlIGlmIChxdWVyeUNyaXRlcmlhIGluc3RhbmNlb2YgVGVybVF1ZXJ5Q3JpdGVyaWEpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoKFRlcm1RdWVyeUNyaXRlcmlhKSBxdWVyeUNyaXRlcmlhKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXJtUXVlcnkobmV3IFRlcm0ocXVlcnlDcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpLCB2YWwpKTsKKyAgICAgICAgfSBlbHNlIGlmIChxdWVyeUNyaXRlcmlhIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RhcnRWYWwgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgcXVlcnlDcml0ZXJpYSkuZ2V0U3RhcnRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBxdWVyeUNyaXRlcmlhKS5nZXRFbmRWYWx1ZSgpOworICAgICAgICAgICAgYm9vbGVhbiBpbmNsdXNpdmUgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgcXVlcnlDcml0ZXJpYSkuZ2V0SW5jbHVzaXZlKCk7CisgICAgICAgICAgICBUZXJtIHN0YXJ0VGVybSA9IG51bGwsIGVuZFRlcm0gPSBudWxsOworICAgICAgICAgICAgaWYgKCFzdGFydFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgc3RhcnRUZXJtID0gbmV3IFRlcm0ocXVlcnlDcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpLCBzdGFydFZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZW5kVmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBlbmRUZXJtID0gbmV3IFRlcm0ocXVlcnlDcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpLCBlbmRWYWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlUXVlcnkoc3RhcnRUZXJtLCBlbmRUZXJtLCBpbmNsdXNpdmUpOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigiSW52YWxpZCBRdWVyeUNyaXRlcmlhIFsiCisgICAgICAgICAgICAgICAgICAgICsgcXVlcnlDcml0ZXJpYS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICJdIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBMaXN0PEVsZW1lbnQ+IHF1aWV0R2V0RWxlbWVudHMoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgICBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRMaXN0ID0gbmV3IFZlY3RvcjxFbGVtZW50PigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbGVtZW50TGlzdCA9IHZhbExheWVyLmdldEVsZW1lbnRzKHR5cGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9idGFpbmluZyBlbGVtZW50cyBmb3IgcHJvZHVjdCB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbGVtZW50TGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvbXBsZXRlUHJvZHVjdCB7CisgICAgICAgIHByaXZhdGUgTWV0YWRhdGEgbWV0YWRhdGEgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgQ29tcGxldGVQcm9kdWN0KE1ldGFkYXRhIG1ldCwgTGlzdDxSZWZlcmVuY2U+IHJlZnMsIFByb2R1Y3QgcCkgeworICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldDsKKyAgICAgICAgICAgIHRoaXMucHJvZHVjdCA9IHA7CisgICAgICAgICAgICB0aGlzLnByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMocmVmcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGxldGVQcm9kdWN0KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWV0YWRhdGEuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhCisgICAgICAgICAqICAgICAgICAgICAgVGhlIG1ldGFkYXRhIHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKE1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9kdWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWN0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBwcm9kdWN0CisgICAgICAgICAqICAgICAgICAgICAgVGhlIHByb2R1Y3QgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgICAgICAgIHRoaXMucHJvZHVjdCA9IHByb2R1Y3Q7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWZlcmVuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8UmVmZXJlbmNlPiBnZXRSZWZlcmVuY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gcmVmZXJlbmNlcworICAgICAgICAgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2VzIHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VzKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9MdWNlbmVDYXRhbG9nRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJmZTdjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2c7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLkdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXI7CisKKy8vTHVjZW5lIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5TdGFuZGFyZEFuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBMdWNlbmV9LWJhc2VkIHtAbGluayBDYXRhbG9nfXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIEx1Y2VuZUNhdGFsb2dGYWN0b3J5IGltcGxlbWVudHMgQ2F0YWxvZ0ZhY3RvcnkgeworCisJLyogcGF0aCB0byB0aGUgaW5kZXggZGlyZWN0b3J5IGZvciBsdWNlbmUgY2F0YWxvZ3MgKi8KKwlwcml2YXRlIFN0cmluZyBpbmRleEZpbGVQYXRoID0gbnVsbDsKKworCS8qIG91ciB2YWxpZGF0aW9uIGxheWVyICovCisJcHJpdmF0ZSBWYWxpZGF0aW9uTGF5ZXIgdmFsaWRhdGlvbkxheWVyID0gbnVsbDsKKwkKKwkvKiB0aGUgcGFnZSBzaXplIGZvciBwYWdpbmF0aW9uICovCisJcHJpdmF0ZSBpbnQgcGFnZVNpemUgPSAtMTsKKwkKKwkvKiB0aGUgd3JpdGUgbG9jayB0aW1lb3V0ICovCisJcHJpdmF0ZSBsb25nIHdyaXRlTG9ja1RpbWVPdXQgPSAtMUw7CisJCisJLyogdGhlIGNvbW1pdCBsb2NrIHRpbWVvdXQgKi8KKwlwcml2YXRlIGxvbmcgY29tbWl0TG9ja1RpbWVPdXQgPSAtMUw7CisJCisJLyogdGhlIG1lcmdlIGZhY3RvciAqLworCXByaXZhdGUgaW50IG1lcmdlRmFjdG9yID0gLTE7CisJCisJLyogV2hldGhlciBvciBub3QgdG8gZW5mb3JjZSBzdHJpY3QgZGVmaW5pdGlvbiBvZiBtZXRhZGF0YSBmaWVsZHM6CisJICogJ2xlbmllbnQ9ZmFsc2UnIG1lYW5zIHRoYXQgYWxsIG1ldGFkYXRhIGZpZWxkcyBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGVmaW5lZCBpbiB0aGUgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCXByaXZhdGUgYm9vbGVhbiBsZW5pZW50RmllbGRzID0gZmFsc2U7CisJCisJLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihMdWNlbmVDYXRhbG9nRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworICAgIAorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBMdWNlbmVDYXRhbG9nRmFjdG9yeSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCQlpbmRleEZpbGVQYXRoID0gU3lzdGVtCisJCQkJLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aCIpOworCQlpZiAoaW5kZXhGaWxlUGF0aCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiZXJyb3IgaW5pdGlhbGl6aW5nIGx1Y2VuZSBjYXRhbG9nOiAiCisJCQkJCQkJKyAiW29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoPSIKKwkJCQkJCQkrIGluZGV4RmlsZVBhdGgpOworCQl9CisKKwkJLy9kbyBlbnYgdmFyIHJlcGxhY2VtZW50CisJCWluZGV4RmlsZVBhdGggPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhpbmRleEZpbGVQYXRoKTsKKwkJCisJCS8vIGluc3RhbnRpYXRlIHZhbGlkYXRpb24gbGF5ZXIsIHVubGVzcyBjYXRhbG9nIGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZCBmb3IgbGVuaWVudCBmaWVsZHMKKwkJbGVuaWVudEZpZWxkcyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5sZW5pZW50RmllbGRzIiwgImZhbHNlIikgKTsKKwkJaWYgKCFsZW5pZW50RmllbGRzKSB7CisJCQlTdHJpbmcgdmFsaWRhdGlvbkxheWVyRmFjdG9yeUNsYXNzID0gU3lzdGVtCisJCQkJLmdldFByb3BlcnR5KCJmaWxlbWdyLnZhbGlkYXRpb25MYXllci5mYWN0b3J5IiwKKwkJCQkJCSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5Iik7CisJCQl2YWxpZGF0aW9uTGF5ZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisJCQkJLmdldFZhbGlkYXRpb25MYXllckZyb21GYWN0b3J5KHZhbGlkYXRpb25MYXllckZhY3RvcnlDbGFzcyk7CisJCX0KKwkJCisJCXBhZ2VTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUucGFnZVNpemUiLCAyMCkuaW50VmFsdWUoKTsKKwkJCisJCWNvbW1pdExvY2tUaW1lT3V0ID0gTG9uZworCQkJCS5nZXRMb25nKAorCQkJCQkJIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5jb21taXRMb2NrVGltZW91dC5zZWNvbmRzIiwKKwkJCQkJCTYwKS5sb25nVmFsdWUoKTsKKwkJd3JpdGVMb2NrVGltZU91dCA9IExvbmcKKwkJCQkuZ2V0TG9uZygKKwkJCQkJCSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUud3JpdGVMb2NrVGltZW91dC5zZWNvbmRzIiwKKwkJCQkJCTYwKS5sb25nVmFsdWUoKTsKKwkJbWVyZ2VGYWN0b3IgPSBJbnRlZ2VyLmdldEludGVnZXIoCisJCQkJIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5tZXJnZUZhY3RvciIsIDIwKQorCQkJCS5pbnRWYWx1ZSgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZ0ZhY3RvcnkjY3JlYXRlQ2F0YWxvZygpCisJICovCisJcHVibGljIENhdGFsb2cgY3JlYXRlQ2F0YWxvZygpIHsKKwkgICAgRmlsZSBpbmRleERpciA9IG5ldyBGaWxlKGluZGV4RmlsZVBhdGgpOworCSAgICAvLyBDcmVhdGUgdGhlIGluZGV4IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QKKwkgICAgSW5kZXhXcml0ZXIgd3JpdGVyID0gbnVsbDsKKwkgICAgaWYgKCFpbmRleERpci5leGlzdHMoKSkgeworCSAgICAgICAgdHJ5IHsgCisJICAgICAgICAgICAgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGluZGV4RGlyLCBuZXcgU3RhbmRhcmRBbmFseXplcigpLCB0cnVlKTsKKwkgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJICAgICAgICAgICAgTE9HLnNldmVyZSgiVW5hYmxlIHRvIGNyZWF0ZSBpbmRleDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkgICAgICAgIH0gZmluYWxseSB7CisJICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgICAgICAgICAgICAgIHRyeSB7CisJICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKwkgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgICAgICAgICAgIExPRy5zZXZlcmUoIlVuYWJsZSB0byBjbG9zZSBpbmRleDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKwkgICAgICAgIH0KKwkgICAgfQorCQlyZXR1cm4gbmV3IEx1Y2VuZUNhdGFsb2coaW5kZXhGaWxlUGF0aCwgdmFsaWRhdGlvbkxheWVyLCBwYWdlU2l6ZSwKKwkJCQljb21taXRMb2NrVGltZU91dCwgd3JpdGVMb2NrVGltZU91dCwgbWVyZ2VGYWN0b3IpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTWFwcGVkRGF0YVNvdXJjZUNhdGFsb2cuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL01hcHBlZERhdGFTb3VyY2VDYXRhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmNTE2NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL01hcHBlZERhdGFTb3VyY2VDYXRhbG9nLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuRGF0YVNvdXJjZUNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBleHRlbnNpb24gdG8gdGhlIHtAbGluayBEYXRhU291cmNlQ2F0YWxvZ30gd2hlcmUgcHJvZHVjdCB0eXBlIG5hbWVzIGFyZQorICogbWFwcGVkIHRvIHRoZSB0YWJsZSBuYW1lcyBpbiB0aGUgZGF0YWJhc2UgKHRvIGRlYWwgd2l0aCBsYXJnZSBwcm9kdWN0IHR5cGUKKyAqIG5hbWVzLCB3aGljaCBPcmFjbGUgZG9lc24ndCBsaWtlKQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nIGV4dGVuZHMgRGF0YVNvdXJjZUNhdGFsb2cgeworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHR5cGVNYXA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkcworICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBEYXRhU291cmNlfSBjb25uZWN0aW9uIHRvIGEgREJNUyBjYXRhbG9nLgorICAgICAqIEBwYXJhbSB2YWxMYXllcgorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBWYWxpZGF0aW9uTGF5ZXJ9IHN0b3JpZ24gdGhlIGVsZW1lbnQgcG9saWN5LgorICAgICAqIEBwYXJhbSBmaWVsZElkCisgICAgICogICAgICAgICAgICBXaGV0aGVyIG9yIG5vdCBmaWVsZCBpZHMgc2hvdWxkIGJlIHF1b3RlZC4KKyAgICAgKiBAcGFyYW0gcGFnZVNpemUKKyAgICAgKiAgICAgICAgICAgIFRoZSBwYWdlIHNpemUgb2YgcmV0dXJuZWQgcHJvZHVjdHMgdmlhIFBhZ2luYXRpb24gQVBJLgorICAgICAqIEBwYXJhbSBjYWNoZVVwZGF0ZU1pbgorICAgICAqICAgICAgICAgICAgVGhlIGFtb3VudCBvZiBtaW51dGVzIGluYmV0d2VlbiBjYWNoZSB1cGRhdGVzIChpZiBuZWVkZWQpLgorICAgICAqIEBwYXJhbSB0eXBlTWFwCisgICAgICogICAgICAgICAgICBUaGUgbWFwcGluZyBwcm9wZXJ0aWVzIG1hcHBpbmcgcHJvZHVjdCB0eXBlIG5hbWVzIHRvIHRhYmxlCisgICAgICogICAgICAgICAgICBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwZWREYXRhU291cmNlQ2F0YWxvZyhEYXRhU291cmNlIGRzLCBWYWxpZGF0aW9uTGF5ZXIgdmFsTGF5ZXIsCisgICAgICAgICAgICBib29sZWFuIGZpZWxkSWQsIGludCBwYWdlU2l6ZSwgbG9uZyBjYWNoZVVwZGF0ZU1pbiwKKyAgICAgICAgICAgIFByb3BlcnRpZXMgdHlwZU1hcCkgeworICAgICAgICBzdXBlcihkcywgdmFsTGF5ZXIsIGZpZWxkSWQsIHBhZ2VTaXplLCBjYWNoZVVwZGF0ZU1pbik7CisgICAgICAgIHRoaXMudHlwZU1hcCA9IHR5cGVNYXA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5EYXRhU291cmNlQ2F0YWxvZyNhZGRNZXRhZGF0YSgKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSwgUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ1Byb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKAorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RUeXBlVGFibGVOYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgICAgc3VwZXIuYWRkTWV0YWRhdGEobWV0YWRhdGEsIHByb2R1Y3QpOworICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuc2V0TmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nI2FkZFByb2R1Y3RSZWZlcmVuY2VzKAorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ1Byb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKAorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RUeXBlVGFibGVOYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgICAgc3VwZXIuYWRkUHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuRGF0YVNvdXJjZUNhdGFsb2cjZ2V0TWV0YWRhdGEoCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG9yaWdQcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpOworICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuc2V0TmFtZSgKKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0VHlwZVRhYmxlTmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKSk7CisgICAgICAgIE1ldGFkYXRhIG1ldCA9IHN1cGVyLmdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuc2V0TmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIG1ldDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nI2dldFByb2R1Y3RSZWZlcmVuY2VzKAorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ1Byb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKAorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RUeXBlVGFibGVOYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBzdXBlci5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLnNldE5hbWUob3JpZ1Byb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgIHJldHVybiByZWZzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuRGF0YVNvdXJjZUNhdGFsb2cjbW9kaWZ5UHJvZHVjdCgKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vZGlmeVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ1Byb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKAorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RUeXBlVGFibGVOYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgICAgc3VwZXIubW9kaWZ5UHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLnNldE5hbWUob3JpZ1Byb2R1Y3RUeXBlTmFtZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5EYXRhU291cmNlQ2F0YWxvZyNyZW1vdmVNZXRhZGF0YSgKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSwgUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ1Byb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKAorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RUeXBlVGFibGVOYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgICAgc3VwZXIucmVtb3ZlTWV0YWRhdGEobWV0YWRhdGEsIHByb2R1Y3QpOworICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuc2V0TmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nI3JlbW92ZVByb2R1Y3QoCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG9yaWdQcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpOworICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuc2V0TmFtZSgKKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0VHlwZVRhYmxlTmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKSk7CisgICAgICAgIHN1cGVyLnJlbW92ZVByb2R1Y3QocHJvZHVjdCk7CisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuRGF0YVNvdXJjZUNhdGFsb2cjcGFnZWRRdWVyeShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlLCBpbnQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByb2R1Y3RQYWdlIHBhZ2VkUXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUsIGludCBwYWdlTnVtKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ1Byb2R1Y3RUeXBlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworICAgICAgICB0eXBlLnNldE5hbWUoZ2V0UHJvZHVjdFR5cGVUYWJsZU5hbWUob3JpZ1Byb2R1Y3RUeXBlTmFtZSkpOworICAgICAgICBQcm9kdWN0UGFnZSBwYWdlID0gc3VwZXIucGFnZWRRdWVyeShxdWVyeSwgdHlwZSwgcGFnZU51bSk7CisgICAgICAgIHR5cGUuc2V0TmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5EYXRhU291cmNlQ2F0YWxvZyNxdWVyeShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG9yaWdQcm9kdWN0VHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgdHlwZS5zZXROYW1lKGdldFByb2R1Y3RUeXBlVGFibGVOYW1lKG9yaWdQcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBzdXBlci5xdWVyeShxdWVyeSwgdHlwZSk7CisgICAgICAgIHR5cGUuc2V0TmFtZShvcmlnUHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9kdWN0VHlwZVRhYmxlTmFtZShTdHJpbmcgb3JpZ05hbWUpIHsKKyAgICAgICAgaWYgKHR5cGVNYXAgIT0gbnVsbCAmJiB0eXBlTWFwLmNvbnRhaW5zS2V5KG9yaWdOYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGVNYXAuZ2V0UHJvcGVydHkob3JpZ05hbWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBvcmlnTmFtZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL01hcHBlZERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTWFwcGVkRGF0YVNvdXJjZUNhdGFsb2dGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjOTU5MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL01hcHBlZERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBGYWN0b3J5IGZvciBjb25zdHJ1Y3RpbmcgYSBzcGVjaWFsIHtAbGluayBEYXRhU291cmNlQ2F0YWxvZ30gY2FsbGVkCisgKiB7QGxpbmsgTWFwcGVkRGF0YVNvdXJjZUNhdGFsb2d9IHdoaWNoIGlzIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKyAqIHBvbGljeSBvZiB7QGxpbmsgUHJvZHVjdFR5cGUjZ2V0TmFtZSgpfV9tZXRhZGF0YSBhbmQge0BsaW5rIFByb2R1Y3RUeXBlI2dldE5hbWUoKX1fcmVmZXJlbmNlCisgKiBhcyB0aGUgdW5kZXJseWluZyB0YWJsZSBuYW1lcworICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSBleHRlbmRzIERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSB7CisKKyAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyB0eXBlTWFwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQX0tFWSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuIgorICAgICAgICAgICAgKyAiY2F0YWxvZy5tYXBwZWRkYXRhc291cmNlLm1hcEZpbGUiOworCisgICAgcHVibGljIE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIFN0cmluZyBtYXBGaWxlUGF0aCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShUWVBFX01BUF9LRVkpKTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShtYXBGaWxlUGF0aCkpOworICAgICAgICB0aGlzLnR5cGVNYXAgPSBwcm9wczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSNjcmVhdGVDYXRhbG9nKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2F0YWxvZyBjcmVhdGVDYXRhbG9nKCkgeworICAgICAgICByZXR1cm4gbmV3IE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nKGRhdGFTb3VyY2UsIHZhbGlkYXRpb25MYXllciwKKyAgICAgICAgICAgICAgICBmaWVsZElkU3RyLCBwYWdlU2l6ZSwgY2FjaGVVcGRhdGVNaW51dGVzLCB0eXBlTWFwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL1NjaWVuY2VEYXRhQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvU2NpZW5jZURhdGFDYXRhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3NGJiNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL1NjaWVuY2VEYXRhQ2F0YWxvZy5qYXZhCkBAIC0wLDAgKzEsMTIzMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLkRiU3RydWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRlLkRhdGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5wYWdpbmF0aW9uLlBhZ2luYXRpb25VdGlsczsKKworLyoqCisgKiAKKyAqIFByb3ZpZGVzIGEgQ2F0YWxvZyBpbXBsZW1lbnRhdGlvbiB0aGF0IGZhY2lsaXRhdGUgbGFyZ2Utc2NhbGUgaW5nZXN0IG9mCisgKiBvYnNlcnZhdGlvbmFsIGRhdGEgaW50byBhIHJlbGF0aW9uYWwgc2NoZW1hLgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiBAYXV0aG9yIGNnb29kYWxlCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNjaWVuY2VEYXRhQ2F0YWxvZyBpbXBsZW1lbnRzIENhdGFsb2cgeworCisgIC8vIE91ciBTUUwgZGF0YSBzb3VyY2UKKyAgcHJvdGVjdGVkIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7CisKKyAgLy8gT3VyIFdSTSB2YWwgbGF5ZXIKKyAgcHJvdGVjdGVkIFZhbGlkYXRpb25MYXllciB2YWxpZGF0aW9uTGF5ZXIgPSBudWxsOworCisgIHByb3RlY3RlZCBpbnQgcGFnZVNpemUgPSAtMTsKKworICAvLyBPdXIgbG9nIHN0cmVhbQorICBwcml2YXRlIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNjaWVuY2VEYXRhQ2F0YWxvZy5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHVibGljIFNjaWVuY2VEYXRhQ2F0YWxvZyhEYXRhU291cmNlIGRhdGFTb3VyY2UsCisgICAgICBWYWxpZGF0aW9uTGF5ZXIgdmFsaWRhdGlvbkxheWVyLCBpbnQgcGFnZVNpemUpIHsKKyAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlOworICAgIHRoaXMudmFsaWRhdGlvbkxheWVyID0gdmFsaWRhdGlvbkxheWVyOworICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKE1ldGFkYXRhIG0sIFByb2R1Y3QgcCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCisgICAgdHJ5IHsKKyAgICAgIC8vIEZpcnN0LCB1bmRlcnN0YW5kIHdoaWNoIGRhdGFzZXQgdGhpcyBtZXRhZGF0YSBiZWxvbmdzIHRvCisgICAgICAvLyBieSBleGFtaW5pbmcgdGhlIGRhdGFzZXRfaWQgbWV0YWRhdGEgZmllbGQKKyAgICAgIGludCBkYXRhc2V0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ2V0TWV0YWRhdGEoImRhdGFzZXRfaWQiKSk7CisKKyAgICAgIC8vIFRoZW4sIGNyZWF0ZSBhIHJlY29yZCBmb3IgdGhlIGdyYW51bGUgaW4gdGhlIGRhdGFiYXNlLAorICAgICAgLy8gYW5kIHN0b3JlIGl0cyBpZC4KKyAgICAgIGludCBncmFudWxlSWQgPSB0aGlzLmNyZWF0ZUdyYW51bGUoZGF0YXNldElkLAorICAgICAgICAgIG0uZ2V0TWV0YWRhdGEoImdyYW51bGVfZmlsZW5hbWUiKSk7CisKKyAgICAgIC8vIFRoZW4sIGNyZWF0ZSBhIHJlY29yZCBmb3IgYW55IHBhcmFtZXRlcnMgZGV0ZWN0ZWQgaW4gZmlsZQorICAgICAgLy8gdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgZGF0YWJhc2UKKyAgICAgIE1ldGFkYXRhIHBhcmFtTWV0YWRhdGEgPSBnZXRNZXRhZGF0YVN1YnNldChtLCBQYXR0ZXJuLmNvbXBpbGUoInBhcmFtXyoiKSk7CisKKyAgICAgIGZvciAoRW51bWVyYXRpb24ga2V5cyA9IHBhcmFtTWV0YWRhdGEuZ2V0SGFzaHRhYmxlKCkua2V5cygpOyBrZXlzCisgICAgICAgICAgLmhhc01vcmVFbGVtZW50cygpOykgeworCisgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7CisgICAgICAgIFN0cmluZyBrZXlOYW1lID0ga2V5LnN1YnN0cmluZyg2KTsgLy8gdHJpbSAicGFyYW1fIgorCisgICAgICAgIGludCBwYXJhbUlkID0gdGhpcy5jcmVhdGVQYXJhbWV0ZXIoZGF0YXNldElkLCBrZXlOYW1lKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ3VycmVudGx5IGV4dHJhY3RpbmcgZGF0YSBmb3IgdmFyaWFibGUgJyIKKyAgICAgICAgICAgICsga2V5TmFtZSArICInICIpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgZWFjaCBkYXRhUG9pbnQgZm9yIGVhY2ggcGFyYW1ldGVyCisgICAgICAgIC8vIGRldGVjdGVkIGluIHRoZSBmaWxlCisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGRhdGFQb2ludHMgPSBtLmdldEFsbE1ldGFkYXRhKCJkYXRhXyIgKyBrZXlOYW1lKTsKKworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJXaWxsIG5vdyBleHRyYWN0ICIgKyBkYXRhUG9pbnRzLnNpemUoKQorICAgICAgICAgICAgKyAiIGRhdGEgcG9pbnRzIGZvciB2YXJpYWJsZSAnIiArIGtleU5hbWUgKyAiJy4uLiAiKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgcXVlcnlCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKAorICAgICAgICAgICAgIklOU0VSVCBJTlRPIGBkYXRhUG9pbnRgIChgZ3JhbnVsZV9pZGAsYGRhdGFzZXRfaWRgLGBwYXJhbWV0ZXJfaWRgLCIKKyAgICAgICAgICAgICAgICArICJgbGF0aXR1ZGVgLGBsb25naXR1ZGVgLGB2ZXJ0aWNhbGAsYHRpbWVgLGB2YWx1ZWApIFZBTFVFUyAiKTsKKyAgICAgICAgLy8gZ3JhYiBhIGNvdW50IG9mIGl0ZW1zIGluIHRoZSBkYXRhUG9pbnRzIGxpc3QKKworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJ0aGVyZSBhcmUgIiArIGRhdGFQb2ludHMuc2l6ZSgpCisgICAgICAgICAgICArICIgZGF0YSBwb2ludHMgaW4gdGhlIExpc3QiKTsKKworICAgICAgICAvLyBDR09PREFMRSBpbnQgdG8gY291bnQgaG93IG1hbnkgdGltZXMgdGhpcyB0aGluZyBsb29wcworICAgICAgICBpbnQgaXRlckNvdW50ID0gMDsKKyAgICAgICAgLy8gU3RyaW5nIGxvb3BDb3VudGVyU3RyaW5nID0gIiI7CisKKyAgICAgICAgZm9yIChTdHJpbmcgZGF0YVBvaW50IDogZGF0YVBvaW50cykgeworCisgICAgICAgICAgLy8gRGVjb21wb3NlIGVhY2ggZGF0YVBvaW50IGludG8gaXRzIGNvbXBvbmVudCBwYXJ0czoKKyAgICAgICAgICAvLyBsYXQsbG9uLHZlcnRpY2FsLHRpbWUsdmFsdWUKKyAgICAgICAgICBTdHJpbmdbXSBjb21wb25lbnRzID0gZGF0YVBvaW50LnNwbGl0KCIsIik7CisKKyAgICAgICAgICAvLyBBcHBlbmQgdGhlIGRhdGFQb2ludCB0byB0aGUgU3RyaW5nQnVmZmVyCisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCIgKCAiKTsKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoZ3JhbnVsZUlkKTsgLy8gZ3JhbnVsZUlkCisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCIgLCAiKTsKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoZGF0YXNldElkKTsgLy8gZGF0YXNldElkCisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCIgLCAiKTsKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQocGFyYW1JZCk7IC8vIHBhcmFtZXRlcklkCisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCIgLCAiKTsKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoY29tcG9uZW50c1swXSk7IC8vIExhdAorICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZCgiICwgIik7CisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKGNvbXBvbmVudHNbMV0pOyAvLyBMb24KKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIiAsICIpOworICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZChjb21wb25lbnRzWzJdKTsgLy8gdmVydGljYWwKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIiAsICIpOworICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZCgnIicpOyAvLyBDb252ZXJzaW9uIGZyb20gSVNPIHRvIE15U1FMIENvbXBsaWFudAorICAgICAgICAgIC8vIERhdGVUaW1lIEZvcm1hdAorICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZChjb21wb25lbnRzWzNdLnN1YnN0cmluZygwLCA0KSk7IC8vIFlZWVkKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIi0iKTsKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoY29tcG9uZW50c1szXS5zdWJzdHJpbmcoNCwgNikpOyAvLyBNTQorICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZCgiLSIpOworICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZChjb21wb25lbnRzWzNdLnN1YnN0cmluZyg2LCA4KSk7IC8vIERECisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCIgIik7CisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKGNvbXBvbmVudHNbM10uc3Vic3RyaW5nKDksIDExKSk7IC8vIEhICisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKGNvbXBvbmVudHNbM10uc3Vic3RyaW5nKDExLCAxMykpOyAvLyBtbQorICAgICAgICAgIC8vIG5vIGRhdGFzZXRzIGNvbnRhaW4gc2Vjb25kcyBhdCB0aGlzIHRpbWUKKyAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhpcyBjb2RlIHdvdWxkIGNhdXNlIHNvbWUgZGF0YXNldHMgdG8KKyAgICAgICAgICAvLyBwYXJzZSBaLCBpbnRvIHNlY29uZHMKKyAgICAgICAgICAvLyBxdWVyeUJ1ZmZlci5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAvLyBxdWVyeUJ1ZmZlci5hcHBlbmQoY29tcG9uZW50c1szXS5zdWJzdHJpbmcoMTMsIDE1KSk7IC8vc3MKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoJyInKTsgLy8gRW5kIHRpbWUKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIiAsICIpOworICAgICAgICAgIHF1ZXJ5QnVmZmVyLmFwcGVuZChjb21wb25lbnRzWzRdKTsgLy8gVmFsdWUKKyAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIiApICIpOworCisgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCcsJyk7Ly8gU3RhdGVtZW50IHNlcGVyYXRvcgorCisgICAgICAgICAgLy8gUGVyaW9kaWNhbGx5IGNvbW1pdCB0aGUgcXVlcnkKKyAgICAgICAgICBpZiAoaXRlckNvdW50ID4gMTAwKSB7CisKKyAgICAgICAgICAgIHF1ZXJ5QnVmZmVyLmRlbGV0ZUNoYXJBdChxdWVyeUJ1ZmZlci5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCI7Iik7CisKKyAgICAgICAgICAgIC8vIENvbW1pdCB0aGUgcXVlcnk7CisgICAgICAgICAgICB0aGlzLmNvbW1pdFF1ZXJ5KHF1ZXJ5QnVmZmVyLCBudWxsKTsKKworICAgICAgICAgICAgLy8gUkVTRVQgcXVlcnkKKyAgICAgICAgICAgIHF1ZXJ5QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gYGRhdGFQb2ludGAgKGBncmFudWxlX2lkYCxgZGF0YXNldF9pZGAsYHBhcmFtZXRlcl9pZGAsYGxhdGl0dWRlYCwiCisgICAgICAgICAgICAgICAgICAgICsgImBsb25naXR1ZGVgLGB2ZXJ0aWNhbGAsYHRpbWVgLGB2YWx1ZWApIFZBTFVFUyAiKTsKKworICAgICAgICAgICAgLy8gUkVTRVQgaXRlckNvdW50CisgICAgICAgICAgICBpdGVyQ291bnQgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIGNvdW50ZXIKKyAgICAgICAgICAgIGl0ZXJDb3VudCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbW1pdCBhbnkgcmVtYWluaW5nIGRhdGEgcG9pbnRzCisgICAgICAgIHF1ZXJ5QnVmZmVyLmRlbGV0ZUNoYXJBdChxdWVyeUJ1ZmZlci5sZW5ndGgoKSAtIDEpOworICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIjsiKTsKKyAgICAgICAgdGhpcy5jb21taXRRdWVyeShxdWVyeUJ1ZmZlciwgbnVsbCk7CisKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRXh0cmFjdGVkICIgKyBkYXRhUG9pbnRzLnNpemUoKQorICAgICAgICAgICAgKyAiIGRhdGEgcG9pbnRzIGZvciB2YXJpYWJsZSAnIiArIGtleU5hbWUgKyAiJyAiKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBhZGRpbmcgcHJvZHVjdCBtZXRhZGF0YS4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBjcmVhdGVHcmFudWxlKGludCBkYXRhc2V0SWQsIFN0cmluZyBmaWxlbmFtZSkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgIC8vIERldGVjdCBkdXBsaWNhdGUgZ3JhbnVsZQorICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgYm9vbGVhbiBhbHJlYWR5RXhpc3RzID0gZmFsc2U7CisgICAgaW50IGdyYW51bGVJZCA9IDA7CisgICAgU3RyaW5nIHF1ZXJ5RXhpc3RzID0gIlNFTEVDVCBncmFudWxlX2lkIEZST00gYGdyYW51bGVgIFdIRVJFIGBmaWxlbmFtZWA9JyIKKyAgICAgICAgKyBmaWxlbmFtZSArICInIEFORCBgZGF0YXNldF9pZGA9JyIgKyBkYXRhc2V0SWQgKyAiJzsgIjsKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBjb25uLnNldEF1dG9Db21taXQodHJ1ZSk7CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIFJlc3VsdFNldCBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkocXVlcnlFeGlzdHMudG9TdHJpbmcoKSk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIGdyYW51bGVJZCA9IHJzLmdldEludCgiZ3JhbnVsZV9pZCIpOworICAgICAgfQorICAgICAgYWxyZWFkeUV4aXN0cyA9IChncmFudWxlSWQgPiAwKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJTUUwgRXhjZXB0aW9uIHF1ZXJ5aW5nIGZvciBncmFudWxlIGV4aXN0ZW5jZS4gTGFzdCBxdWVyeSB3YXM6ICIKKyAgICAgICAgICAgICAgKyBxdWVyeUV4aXN0cyArICIgLCBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsKKyAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyBgZ3JhbnVsZWAgKGBkYXRhc2V0X2lkYCxgZmlsZW5hbWVgKSBWQUxVRVMgKCciCisgICAgICAgICAgKyBkYXRhc2V0SWQgKyAiJywnIiArIGZpbGVuYW1lICsgIicpOyI7CisgICAgICB0cnkgeworICAgICAgICBTdHJpbmcgbWF4UXVlcnkgPSAiU0VMRUNUIE1BWChncmFudWxlX2lkKSBBUyBtYXhfaWQgRlJPTSBncmFudWxlIjsKKyAgICAgICAgZ3JhbnVsZUlkID0gdGhpcy5jb21taXRRdWVyeShuZXcgU3RyaW5nQnVmZmVyKHF1ZXJ5KSwgbWF4UXVlcnkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgZ3JhbnVsZSBpZAorICAgIHJldHVybiBncmFudWxlSWQ7CisgIH0KKworICBwdWJsaWMgaW50IGNyZWF0ZVBhcmFtZXRlcihpbnQgZGF0YXNldElkLCBTdHJpbmcgbG9uZ05hbWUpCisgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAvLyBEZXRlY3QgZHVwbGljYXRlIHBhcmFtZXRlcgorICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgYm9vbGVhbiBhbHJlYWR5RXhpc3RzID0gZmFsc2U7CisgICAgaW50IHBhcmFtZXRlcklkID0gMDsKKyAgICBTdHJpbmcgcXVlcnlFeGlzdHMgPSAiU0VMRUNUIHBhcmFtZXRlcl9pZCBGUk9NIGBwYXJhbWV0ZXJgIFdIRVJFIGBsb25nTmFtZWA9JyIKKyAgICAgICAgKyBsb25nTmFtZSArICInIEFORCBgZGF0YXNldF9pZGA9JyIgKyBkYXRhc2V0SWQgKyAiJzsgIjsKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBjb25uLnNldEF1dG9Db21taXQodHJ1ZSk7CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIFJlc3VsdFNldCBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkocXVlcnlFeGlzdHMudG9TdHJpbmcoKSk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHBhcmFtZXRlcklkID0gcnMuZ2V0SW50KCJwYXJhbWV0ZXJfaWQiKTsKKyAgICAgIH0KKyAgICAgIGFscmVhZHlFeGlzdHMgPSAocGFyYW1ldGVySWQgPiAwKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJTUUwgRXhjZXB0aW9uIHF1ZXJ5aW5nIGZvciBwYXJhbWV0ZXIgZXhpc3RlbmNlLiBMYXN0IHF1ZXJ5IHdhczogIgorICAgICAgICAgICAgICArIHF1ZXJ5RXhpc3RzICsgIiAsIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIGlmICghYWxyZWFkeUV4aXN0cykgeworICAgICAgLy8gSW5zZXJ0IHRoZSBwYXJhbWV0ZXIgaW50byB0aGUgZGF0YWJhc2UKKyAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyBgcGFyYW1ldGVyYCAoYGxvbmdOYW1lYCxgZGF0YXNldF9pZGAsYGRlc2NyaXB0aW9uYCkgVkFMVUVTICgnIgorICAgICAgICAgICsgbG9uZ05hbWUgKyAiJywnIiArIGRhdGFzZXRJZCArICInLCcnKSAiOworCisgICAgICB0cnkgeworICAgICAgICBTdHJpbmcgbWF4UXVlcnkgPSAiU0VMRUNUIE1BWChwYXJhbWV0ZXJfaWQpIEFTIG1heF9pZCBGUk9NIHBhcmFtZXRlciI7CisgICAgICAgIHBhcmFtZXRlcklkID0gdGhpcy5jb21taXRRdWVyeShuZXcgU3RyaW5nQnVmZmVyKHF1ZXJ5KSwgbWF4UXVlcnkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgaWQgb2YgdGhlIHBhcmFtZXRlcgorICAgIHJldHVybiBwYXJhbWV0ZXJJZDsKKyAgfQorCisgIHB1YmxpYyBpbnQgY29tbWl0UXVlcnkoU3RyaW5nQnVmZmVyIHF1ZXJ5LCBTdHJpbmcgbWF4UXVlcnkpCisgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIGludCByZXR1cm5JZCA9IDA7CisKKyAgICAvLyBUcnkgdG8gY29tbWl0IHRoZSBxdWVyeQorICAgIHRyeSB7CisgICAgICAvLyBMT0cubG9nKExldmVsLklORk8sIlF1ZXJ5OiAiICsgcXVlcnkpOworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHN0YXRlbWVudC5leGVjdXRlKHF1ZXJ5LnRvU3RyaW5nKCkpOworCisgICAgICBpZiAobWF4UXVlcnkgIT0gbnVsbCkgeworICAgICAgICBSZXN1bHRTZXQgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KG1heFF1ZXJ5KTsKKyAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgIHJldHVybklkID0gcnMuZ2V0SW50KCJtYXhfaWQiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY29ubi5jb21taXQoKTsKKyAgICAgIHJldHVybiByZXR1cm5JZDsKKworICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlNRTCBFeGNlcHRpb24gYWRkaW5nIHByb2R1Y3QgbWV0YWRhdGEuIExhc3QgcXVlcnkgd2FzOiAiICsgcXVlcnkKKyAgICAgICAgICAgICAgKyAiICwgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKAorICAgICAgICAgICAgTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBhZGRNZXRhZGF0YSB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYWRkUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgcHVibGljIE1ldGFkYXRhIGdldE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIC8vIG1ldC5hZGRNZXRhZGF0YSgiU3RhcnREYXRlVGltZSIsIHRoaXMuZ2V0U3RhcnREYXRlVGltZShwcm9kdWN0KSk7CisgICAgLy8gbWV0LmFkZE1ldGFkYXRhKCJFbmREYXRlVGltZSIsIHRoaXMuZ2V0RW5kRGF0ZVRpbWUocHJvZHVjdCkpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiRmlsZW5hbWUiLCBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiUHJvZHVjdFR5cGUiLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICBtZXQuYWRkTWV0YWRhdGEoIkZpbGVMb2NhdGlvbiIsICJVbmtub3duIik7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsCisgICAgICAgIERhdGVVdGlscy50b1N0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpKSk7CisgICAgcmV0dXJuIG1ldDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBDT1VOVChncmFudWxlX2lkKSBhcyBudW1fcHJvZHVjdHMgRlJPTSBncmFudWxlICIKKyAgICAgICAgKyAiICAgICAgICAgIFdIRVJFIGRhdGFzZXRfaWQgSU4gKFNFTEVDVCBkYXRhc2V0X2lkIEZST00gZGF0YXNldCAiCisgICAgICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBzaG9ydE5hbWUgPSAnIgorICAgICAgICArIHByb2R1Y3RUeXBlLmdldE5hbWUoKSArICInIiArICIgICAgICAgICAgICAgICAgICAgICAgICAgICApIjsKKworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBpbnQgbnVtUHJvZHVjdHMgPSAwOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBudW1Qcm9kdWN0cyA9IHJzLmdldEludCgibnVtX3Byb2R1Y3RzIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bVByb2R1Y3RzOworICB9CisKKyAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIGdyYW51bGVfaWQsIGRhdGFzZXRfaWQsIGZpbGVuYW1lIEZST00gZ3JhbnVsZSBXSEVSRSBncmFudWxlX2lkID0gIgorICAgICAgICArIHByb2R1Y3RJZDsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgcHJvZHVjdCA9IERiU3RydWN0RmFjdG9yeS50b1NjaWVuY2VEYXRhUHJvZHVjdChycyk7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gcHJvZHVjdDsKKyAgfQorCisgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeU5hbWUoU3RyaW5nIHByb2R1Y3ROYW1lKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZ3JhbnVsZV9pZCwgZGF0YXNldF9pZCwgZmlsZW5hbWUgRlJPTSBncmFudWxlIFdIRVJFIGZpbGVOYW1lID0gJyIKKyAgICAgICAgKyBwcm9kdWN0TmFtZSArICInIjsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgcHJvZHVjdCA9IERiU3RydWN0RmFjdG9yeS50b1NjaWVuY2VEYXRhUHJvZHVjdChycyk7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gcHJvZHVjdDsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICB9CisKKyAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZ3JhbnVsZV9pZCwgZGF0YXNldF9pZCwgZmlsZW5hbWUgRlJPTSBncmFudWxlIE9SREVSIEJZIGdyYW51bGVfaWQgREVTQyI7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KCk7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHByb2R1Y3RzLmFkZChEYlN0cnVjdEZhY3RvcnkudG9TY2llbmNlRGF0YVByb2R1Y3QocnMpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBwcm9kdWN0czsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZShQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBncmFudWxlX2lkLCBkYXRhc2V0X2lkLCBmaWxlbmFtZSBGUk9NIGdyYW51bGUgV0hFUkUgZGF0YXNldF9pZCA9ICIKKyAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiIE9SREVSIEJZIGdyYW51bGVfaWQgREVTQyI7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KCk7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHByb2R1Y3RzLmFkZChEYlN0cnVjdEZhY3RvcnkudG9TY2llbmNlRGF0YVByb2R1Y3QocnMpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBwcm9kdWN0czsKKyAgfQorCisgIHB1YmxpYyBNZXRhZGF0YSBnZXRSZWR1Y2VkTWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0LCBMaXN0PFN0cmluZz4gbWV0TGlzdCkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKworICAgIE1ldGFkYXRhIG1ldCA9IHRoaXMuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisgICAgTWV0YWRhdGEgZmluYWxNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBmb3IgKFN0cmluZyBtZXRLZXkgOiBtZXRMaXN0KSB7CisgICAgICBmaW5hbE1ldC5hZGRNZXRhZGF0YShtZXRLZXksIG1ldC5nZXRBbGxNZXRhZGF0YShtZXRLZXkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmluYWxNZXQ7CisKKyAgfQorCisgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFRvcE5Qcm9kdWN0cyhpbnQgbnVtKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZ3JhbnVsZV9pZCwgZGF0YXNldF9pZCwgZmlsZW5hbWUgRlJPTSBncmFudWxlIE9SREVSIEJZIGdyYW51bGVfaWQgREVTQyBMSU1JVCAiCisgICAgICAgICsgbnVtOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IFZlY3RvcjxQcm9kdWN0PigpOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkV4ZWN1dGluZzogWyIgKyBzcWwgKyAiXSIpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHByb2R1Y3RzLmFkZChEYlN0cnVjdEZhY3RvcnkudG9TY2llbmNlRGF0YVByb2R1Y3QocnMpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBwcm9kdWN0czsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFRvcE5Qcm9kdWN0cyhpbnQgbnVtLCBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBncmFudWxlX2lkLCBkYXRhc2V0X2lkLCBmaWxlbmFtZSBGUk9NIGdyYW51bGUgV0hFUkUgZGF0YXNldF9pZCA9ICIKKyAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkKKyAgICAgICAgKyAiIE9SREVSIEJZIGdyYW51bGVfaWQgREVTQyBMSU1JVCAiCisgICAgICAgICsgbnVtOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IFZlY3RvcjxQcm9kdWN0PigpOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkV4ZWN1dGluZzogWyIgKyBzcWwgKyAiXSIpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHByb2R1Y3RzLmFkZChEYlN0cnVjdEZhY3RvcnkudG9TY2llbmNlRGF0YVByb2R1Y3QocnMpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBwcm9kdWN0czsKKyAgfQorCisgIHB1YmxpYyBWYWxpZGF0aW9uTGF5ZXIgZ2V0VmFsaWRhdGlvbkxheWVyKCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25MYXllcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG1vZGlmeVByb2R1Y3QoUHJvZHVjdCBhcmcwKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IHF1ZXJ5KFF1ZXJ5IGFyZzAsIFByb2R1Y3RUeXBlIGFyZzEpCisgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlTWV0YWRhdGEoTWV0YWRhdGEgYXJnMCwgUHJvZHVjdCBhcmcxKQorICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlUHJvZHVjdChQcm9kdWN0IGFyZzApIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RUcmFuc2ZlclN0YXR1cyhQcm9kdWN0IGFyZzApIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuUGFnaW5hdGlvbiNnZXRGaXJzdFBhZ2Uob3JnLmFwYWNoZS5vb2R0CisgICAqIC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgKi8KKyAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSB0eXBlKSB7CisgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKyAgICBQcm9kdWN0UGFnZSBmaXJzdFBhZ2UgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGZpcnN0UGFnZSA9IHBhZ2VkUXVlcnkocXVlcnksIHR5cGUsIDEpOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBmaXJzdCBwYWdlOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICByZXR1cm4gZmlyc3RQYWdlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5QYWdpbmF0aW9uI2dldExhc3RQcm9kdWN0UGFnZShvcmcuYXBhY2hlCisgICAqIC5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAqLworICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TGFzdFByb2R1Y3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICBQcm9kdWN0UGFnZSBsYXN0UGFnZSA9IG51bGw7CisgICAgUHJvZHVjdFBhZ2UgZmlyc3RQYWdlID0gZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgdHJ5IHsKKyAgICAgIGxhc3RQYWdlID0gcGFnZWRRdWVyeShxdWVyeSwgdHlwZSwgZmlyc3RQYWdlLmdldFRvdGFsUGFnZXMoKSk7CisgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIGxhc3QgcGFnZTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFzdFBhZ2U7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlBhZ2luYXRpb24jZ2V0TmV4dFBhZ2Uob3JnLmFwYWNoZS5vb2R0CisgICAqIC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlLAorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZSkKKyAgICovCisgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXROZXh0UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgIGlmIChjdXJyZW50UGFnZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgIH0KKworICAgIGlmIChjdXJyZW50UGFnZS5pc0xhc3RQYWdlKCkpIHsKKyAgICAgIHJldHVybiBjdXJyZW50UGFnZTsKKyAgICB9CisKKyAgICBQcm9kdWN0UGFnZSBuZXh0UGFnZSA9IG51bGw7CisgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKworICAgIHRyeSB7CisgICAgICBuZXh0UGFnZSA9IHBhZ2VkUXVlcnkocXVlcnksIHR5cGUsIGN1cnJlbnRQYWdlLmdldFBhZ2VOdW0oKSArIDEpOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBuZXh0IHBhZ2U6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5leHRQYWdlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5QYWdpbmF0aW9uI2dldFByZXZQYWdlKG9yZy5hcGFjaGUub29kdAorICAgKiAuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2UpCisgICAqLworICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0UHJldlBhZ2UoUHJvZHVjdFR5cGUgdHlwZSwgUHJvZHVjdFBhZ2UgY3VycmVudFBhZ2UpIHsKKyAgICBpZiAoY3VycmVudFBhZ2UgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGdldEZpcnN0UGFnZSh0eXBlKTsKKyAgICB9CisKKyAgICBpZiAoY3VycmVudFBhZ2UuaXNGaXJzdFBhZ2UoKSkgeworICAgICAgcmV0dXJuIGN1cnJlbnRQYWdlOworICAgIH0KKyAgICBQcm9kdWN0UGFnZSBwcmV2UGFnZSA9IG51bGw7CisgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKworICAgIHRyeSB7CisgICAgICBwcmV2UGFnZSA9IHBhZ2VkUXVlcnkocXVlcnksIHR5cGUsIGN1cnJlbnRQYWdlLmdldFBhZ2VOdW0oKSAtIDEpOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBwcmV2IHBhZ2U6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHByZXZQYWdlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nI3BhZ2VkUXVlcnkob3JnLmFwYWNoZS5vb2R0LgorICAgKiBjYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5LCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICogaW50KQorICAgKi8KKyAgcHVibGljIFByb2R1Y3RQYWdlIHBhZ2VkUXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUsIGludCBwYWdlTnVtKQorICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgIGludCB0b3RhbFBhZ2VzID0gUGFnaW5hdGlvblV0aWxzLmdldFRvdGFsUGFnZSgKKyAgICAgICAgZ2V0UmVzdWx0TGlzdFNpemUocXVlcnksIHR5cGUpLCB0aGlzLnBhZ2VTaXplKTsKKworICAgIC8qCisgICAgICogaWYgdGhlcmUgYXJlIDAgdG90YWwgcGFnZXMgaW4gdGhlIHJlc3VsdCBsaXN0IHNpemUgdGhlbiBkb24ndCBib3RoZXIKKyAgICAgKiByZXR1cm5pbmcgYSB2YWxpZCBwcm9kdWN0IHBhZ2UgaW5zdGVhZCwgcmV0dXJuIGJsYW5rIFByb2R1Y3RQYWdlCisgICAgICovCisgICAgaWYgKHRvdGFsUGFnZXMgPT0gMCkgeworICAgICAgcmV0dXJuIFByb2R1Y3RQYWdlLmJsYW5rUGFnZSgpOworICAgIH0KKworICAgIFByb2R1Y3RQYWdlIHJldFBhZ2UgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICByZXRQYWdlLnNldFBhZ2VOdW0ocGFnZU51bSk7CisgICAgcmV0UGFnZS5zZXRQYWdlU2l6ZSh0aGlzLnBhZ2VTaXplKTsKKyAgICByZXRQYWdlLnNldFRvdGFsUGFnZXModG90YWxQYWdlcyk7CisKKyAgICBMaXN0PFN0cmluZz4gcHJvZHVjdElkcyA9IHBhZ2luYXRlUXVlcnkocXVlcnksIHR5cGUsIHBhZ2VOdW0pOworCisgICAgaWYgKHByb2R1Y3RJZHMgIT0gbnVsbCAmJiBwcm9kdWN0SWRzLnNpemUoKSA+IDApIHsKKyAgICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KHByb2R1Y3RJZHMuc2l6ZSgpKTsKKworICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBwcm9kdWN0SWRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICBTdHJpbmcgcHJvZHVjdElkID0gaS5uZXh0KCk7CisgICAgICAgIFByb2R1Y3QgcCA9IGdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgICAgIHByb2R1Y3RzLmFkZChwKTsKKyAgICAgIH0KKworICAgICAgcmV0UGFnZS5zZXRQYWdlUHJvZHVjdHMocHJvZHVjdHMpOworICAgIH0KKworICAgIHJldHVybiByZXRQYWdlOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFnaW5hdGVRdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSwgaW50IHBhZ2VOdW0pCisgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIExpc3Q8U3RyaW5nPiBwcm9kdWN0SWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisKKyAgICBib29sZWFuIGRvU2tpcCA9IHRydWU7CisgICAgaW50IG51bVJlc3VsdHMgPSAtMTsKKworICAgIGlmIChwYWdlTnVtID09IC0xKSB7CisgICAgICBkb1NraXAgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbnVtUmVzdWx0cyA9IGdldFJlc3VsdExpc3RTaXplKHF1ZXJ5LCB0eXBlKTsKKyAgICB9CisKKyAgICB0cnkgeworCisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudChSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsCisgICAgICAgICAgUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkpOworCisgICAgICBTdHJpbmcgZ2V0UHJvZHVjdFNxbCA9ICJTRUxFQ1QgRElTVElOQ1QgZ3JhbnVsZV9pZCBGUk9NIGdyYW51bGUgV0hFUkUgIgorICAgICAgICAgICsgImRhdGFzZXRfaWQgPSAiICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkKKyAgICAgICAgICArICIgT1JERVIgQlkgZ3JhbnVsZV9pZCBERVNDICI7CisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJFeGVjdXRpbmc6IFsiICsgZ2V0UHJvZHVjdFNxbCArICJdIik7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFNxbCk7CisKKyAgICAgIGlmIChkb1NraXApIHsKKyAgICAgICAgaW50IHN0YXJ0TnVtID0gKHBhZ2VOdW0gLSAxKSAqIHBhZ2VTaXplOworICAgICAgICBpZiAoc3RhcnROdW0gPiBudW1SZXN1bHRzKSB7CisgICAgICAgICAgc3RhcnROdW0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gbXVzdCBjYWxsIG5leHQgZmlyc3QsIG9yIGVsc2Ugbm8gcmVsYXRpdmUgY3Vyc29yCisgICAgICAgIGlmIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAvLyBncmFiIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgICBpbnQgbnVtR3JhYmJlZCA9IC0xOworCisgICAgICAgICAgaWYgKHBhZ2VOdW0gPT0gMSkgeworICAgICAgICAgICAgbnVtR3JhYmJlZCA9IDE7CisgICAgICAgICAgICBwcm9kdWN0SWRzLmFkZChycy5nZXRTdHJpbmcoImdyYW51bGVfaWQiKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bUdyYWJiZWQgPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIG5vdyBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24KKyAgICAgICAgICBpZiAocGFnZU51bSAhPSAxKSB7CisgICAgICAgICAgICBycy5yZWxhdGl2ZShzdGFydE51bSAtIDEpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGdyYWIgdGhlIHJlc3QKKyAgICAgICAgICB3aGlsZSAocnMubmV4dCgpICYmIG51bUdyYWJiZWQgPCBwYWdlU2l6ZSkgeworICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IHJzLmdldFN0cmluZygiZ3JhbnVsZV9pZCIpOworICAgICAgICAgICAgcHJvZHVjdElkcy5hZGQocHJvZHVjdElkKTsKKyAgICAgICAgICAgIG51bUdyYWJiZWQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSBycy5nZXRTdHJpbmcoImdyYW51bGVfaWQiKTsKKyAgICAgICAgICBwcm9kdWN0SWRzLmFkZChwcm9kdWN0SWQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiRXhjZXB0aW9uIHBlcmZvcm1pbmcgcXVlcnkuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0cnkgeworICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJVbmFibGUgdG8gcm9sbGJhY2sgcXVlcnkgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworCisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2R1Y3RJZHM7CisKKyAgfQorCisgIHByaXZhdGUgaW50IGdldFJlc3VsdExpc3RTaXplKFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSkgeworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIENPVU5UKGdyYW51bGVfaWQpIGFzIHJlc3VsdF9zaXplIEZST00gZ3JhbnVsZSB3aGVyZSBkYXRhc2V0X2lkID0gIgorICAgICAgICArIHByb2R1Y3RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKTsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgaW50IHNpemUgPSAtMTsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBMT0cubG9nKExldmVsLklORk8sICJFeGVjdXRpbmc6IFsiICsgc3FsICsgIl0iKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBzaXplID0gcnMuZ2V0SW50KCJyZXN1bHRfc2l6ZSIpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRTdGFydERhdGVUaW1lKFByb2R1Y3QgcHJvZHVjdCkgeworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIE1JTih0aW1lKSBhcyBzdGFydF9kYXRlX3RpbWUgRlJPTSBkYXRhUG9pbnQgIgorICAgICAgICArICIgICAgICAgICAgV0hFUkUgZ3JhbnVsZV9pZCBJTiAoU0VMRUNUIGdyYW51bGVfaWQgRlJPTSBncmFudWxlICIKKyAgICAgICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGZpbGVuYW1lID0gJyIKKyAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiJyIgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgKSI7CisKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RyaW5nIHN0YXJ0RGF0ZVRpbWUgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjYWwuc2V0VGltZShycy5nZXREYXRlKCJzdGFydF9kYXRlX3RpbWUiKSk7CisgICAgICAgIHN0YXJ0RGF0ZVRpbWUgPSBEYXRlVXRpbHMudG9TdHJpbmcoY2FsKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhcnREYXRlVGltZTsKKworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0RW5kRGF0ZVRpbWUoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgTUFYKHRpbWUpIGFzIGVuZF9kYXRlX3RpbWUgRlJPTSBkYXRhUG9pbnQgIgorICAgICAgICArICIgICAgICAgICAgV0hFUkUgZ3JhbnVsZV9pZCBJTiAoU0VMRUNUIGdyYW51bGVfaWQgRlJPTSBncmFudWxlICIKKyAgICAgICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGZpbGVuYW1lID0gJyIKKyAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiJyIgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgKSI7CisKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RyaW5nIGVuZERhdGVUaW1lID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsLnNldFRpbWUocnMuZ2V0RGF0ZSgiZW5kX2RhdGVfdGltZSIpKTsKKyAgICAgICAgZW5kRGF0ZVRpbWUgPSBEYXRlVXRpbHMudG9TdHJpbmcoY2FsKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZW5kRGF0ZVRpbWU7CisKKyAgfQorCisgIC8qKgorICAgKiBnZXRNZXRhZGF0YVN1YnNldAorICAgKiAKKyAgICogUmV0dXJucyB0aGUgc3Vic2V0IG9mIG1ldGFkYXRhIGtleXMgaW4gdGhlIHByb3ZpZGVkIE1ldGFkYXRhIG9iamVjdCB0aGF0CisgICAqIG1hdGNoIGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzcGVjaWZpZWQgaW4gcGF0dGVybi4gTm90ZSB0aGF0CisgICAqIGNvbXBsZXRlIG1hdGNoIGlzIG5vdCByZXF1aXJlZCBmb3Igc3VjY2Vzcy4gVGhpcyBmdW5jdGlvbiB1dGlsaXplcyB0aGUKKyAgICogJ2xvb2tpbmdBdCgpJyBmdW5jdGlvbiBvZiB0aGUgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXIgY2xhc3MgdG8gZGV0ZXJtaW5lCisgICAqIHdoZXRoZXIgdGhlIGNhbmRpZGF0ZSBzdHJpbmcgY29udGFpbnMgdGhlIHBhdHRlcm4gYXMgYSBzdWJzdHJpbmcgd2hlbgorICAgKiBzdGFydGluZyBmcm9tIHRoZSB6ZXJvdGggaW5kZXggKHRoZSBiZWdpbm5pbmcpLgorICAgKiAKKyAgICogQHBhcmFtIG0KKyAgICogICAgICAgICAgVGhlIE1ldGFkYXRhIG9iamVjdCBjb250YWluaW5nIGtleXMgZnJvbSB3aGljaCBhIHN1YnNldCB3aWxsIGJlCisgICAqICAgICAgICAgIGV4dHJhY3RlZAorICAgKiBAcGFyYW0gcGF0dGVybgorICAgKiAgICAgICAgICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHVzZSBpbiBkZXRlcm1pbmluZyBtYXRjaGluZyBrZXlzCisgICAqIEByZXR1cm4gQSBNZXRhZGF0YSBvYmplY3QgY29udGFpbmluZyBvbmx5IHRob3NlIGtleXMgd2hpY2ggbWF0Y2hlZAorICAgKiAgICAgICAgICdwYXR0ZXJuJworICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGFTdWJzZXQoTWV0YWRhdGEgbSwgUGF0dGVybiBwYXR0ZXJuKSB7CisKKyAgICBNZXRhZGF0YSBzdWJzZXQgPSBuZXcgTWV0YWRhdGEoKTsKKworICAgIGZvciAoT2JqZWN0IGtleSA6IG0uZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkpIHsKKworICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKChTdHJpbmcpIGtleSk7CisgICAgICBpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgeworICAgICAgICBzdWJzZXQuYWRkTWV0YWRhdGEoKFN0cmluZykga2V5LCBtLmdldE1ldGFkYXRhKChTdHJpbmcpIGtleSkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdWJzZXQ7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL1NjaWVuY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL1NjaWVuY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkxMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvU2NpZW5jZURhdGFDYXRhbG9nRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLkRhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlNjaWVuY2VEYXRhVmFsaWRhdGlvbkxheWVyRmFjdG9yeTsKKworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBDYXRhbG9nRmFjdG9yeSBpbnRlcmZhY2UgdG8gcHJvdmlkZSBhIGZhY3RvcnkgZm9yCisgKiB7QGxpbmsgU2NpZW5jZURhdGFDYXRhbG9nfS4gVGhlIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBpbiB0aGlzIGNsYXNzIGNhbiBiZQorICogZWRpdGVkIGluIHRoZSBmaWxlbWdyLnByb3BlcnRpZXMgZmlsZSBpbgorICogW2ZpbGVtZ3JfaG9tZV0vZXRjL2ZpbGVtZ3IucHJvcGVydGllcworICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiBAYXV0aG9yIGNnb29kYWxlCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNjaWVuY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkgaW1wbGVtZW50cyBDYXRhbG9nRmFjdG9yeSB7CisKKyAgLy8gVGhlIGRhdGEgc291cmNlCisgIHByb3RlY3RlZCBEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBudWxsOworCisgIC8vIFRoZSBwYWdlIHNpemUKKyAgcHJvdGVjdGVkIGludCBwYWdlU2l6ZTsKKworICBwdWJsaWMgU2NpZW5jZURhdGFDYXRhbG9nRmFjdG9yeSgpIHsKKworICAgIFN0cmluZyBqZGJjVXJsID0gbnVsbCwgdXNlciA9IG51bGwsIHBhc3MgPSBudWxsLCBkcml2ZXIgPSBudWxsOworCisgICAgamRiY1VybCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zY2llbmNlLmpkYmMudXJsIikpOworICAgIHVzZXIgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLnVzZXIiKSk7CisgICAgcGFzcyA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zY2llbmNlLmpkYmMucGFzcyIpKTsKKyAgICBkcml2ZXIgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLmRyaXZlciIpKTsKKworICAgIGRhdGFTb3VyY2UgPSBEYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyLmJ1aWxkRGF0YVNvdXJjZSh1c2VyLCBwYXNzLCBkcml2ZXIsCisgICAgICAgIGpkYmNVcmwpOworICAgIHBhZ2VTaXplID0gSW50ZWdlci52YWx1ZU9mKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zY2llbmNlLnBhZ2VTaXplIikpKTsKKworICB9CisKKyAgcHVibGljIENhdGFsb2cgY3JlYXRlQ2F0YWxvZygpIHsKKyAgICByZXR1cm4gbmV3IFNjaWVuY2VEYXRhQ2F0YWxvZyhkYXRhU291cmNlLAorICAgICAgICBuZXcgU2NpZW5jZURhdGFWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5KCkuY3JlYXRlVmFsaWRhdGlvbkxheWVyKCksCisgICAgICAgIHBhZ2VTaXplKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL0NvbXBsZXRlUHJvZHVjdC5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Db21wbGV0ZVByb2R1Y3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTI3MDdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Db21wbGV0ZVByb2R1Y3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29scjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBDbGFzcyB0aGF0IGNvbWJpbmVzIGEgUHJvZHVjdCBhbmQgaXRzIGFzc29jaWF0ZWQgTWV0YWRhdGEuCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIENvbXBsZXRlUHJvZHVjdCB7CisJCisJcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisJCisJcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKwkKKwlwdWJsaWMgQ29tcGxldGVQcm9kdWN0KCkgeworCQkKKwkJcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisJCXByb2R1Y3Quc2V0UHJvZHVjdFR5cGUobmV3IFByb2R1Y3RUeXBlKCkpOworCQltZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCQkKKwl9CisKKwlwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0KCkgeworCQlyZXR1cm4gcHJvZHVjdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgeworCQl0aGlzLnByb2R1Y3QgPSBwcm9kdWN0OworCX0KKworCXB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKwkJcmV0dXJuIG1ldGFkYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKE1ldGFkYXRhIG1ldGFkYXRhKSB7CisJCXRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvRGVmYXVsdFByb2R1Y3RTZXJpYWxpemVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL0RlZmF1bHRQcm9kdWN0U2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjBhNWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL0RlZmF1bHRQcm9kdWN0U2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29scjsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByb2R1Y3RTZXJpYWxpemVyfSAKKyAqIHRoYXQgdHJhbnNmb3JtcyBhIENBUyBwcm9kdWN0IGludG8gYSBzaW5nbGUgU29sciBkb2N1bWVudCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJ1bGVzOiAKKyAqIG8pIHRoZSBjb3JlIHByb2R1Y3QgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBnZW5lcmF0ZSBTb2xyIGZpZWxkcyBzdGFydGluZyB3aXRoICJDQVMuLi4uIgorICogbykgdGhlIHByb2R1Y3QgcmVmZXJlbmNlcyBhcmUgY29udmVydGVkIHRvIFNvbHIgZmllbGRzIHN0YXJ0aW5nIHdpdGggIkNBUy5SZWZlcmVuY2UuLi4iIG9yICJDQVMuUm9vdFJlZmVyZW5jZS4uLiIKKyAqIG8pIGFsbCBvdGhlciBtZXRhZGF0YSBmaWVsZHMgYXJlIGNvbnZlcnRlZCBpbnRvIFNvbHIgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbnVtYmVyIG9mIHZhbHVlcy4gCisgKiAgICBOb3RlIHRoYXQgdGhlIGZpZWxkIG11bHRpcGxpY2l0eSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgU29sciBzY2hlbWEueG1sLgorICogICAgCisgKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhbGwgU29sciBkb2N1bWVudHMgaW4gWE1MIGZvcm1hdC4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdFByb2R1Y3RTZXJpYWxpemVyIGltcGxlbWVudHMgUHJvZHVjdFNlcmlhbGl6ZXIgeworCQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworCQlyZXR1cm4gUGFyYW1ldGVycy5NSU1FX1RZUEVfWE1MOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IHNlcmlhbGl6ZShQcm9kdWN0IHByb2R1Y3QsIGJvb2xlYW4gY3JlYXRlKSB7CisJCQorCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGZpZWxkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworCQlMaXN0PFN0cmluZz4gZG9jcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkKKwkJLy8gYWRkIGNvcmUgcHJvZHVjdCBhdHRyaWJ1dGVzIHRvIG1hcAorCQl0aGlzLmFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlBST0RVQ1RfSUQsIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworCQl0aGlzLmFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlBST0RVQ1RfTkFNRSwgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKwkJdGhpcy5hZGRLZXlWYWx1ZVRvTWFwKGZpZWxkcywgUGFyYW1ldGVycy5QUk9EVUNUX1NUUlVDVFVSRSwgcHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkpOworCQl0aGlzLmFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlBST0RVQ1RfVFJBTlNGRVJfU1RBVFVTLCBwcm9kdWN0LmdldFRyYW5zZmVyU3RhdHVzKCkpOworCQlQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKTsKKwkJaWYgKHByb2R1Y3RUeXBlIT1udWxsKSB7CisJCQl0aGlzLmFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlBST0RVQ1RfVFlQRV9OQU1FLCBwcm9kdWN0VHlwZS5nZXROYW1lKCkpOworCQkJdGhpcy5hZGRLZXlWYWx1ZVRvTWFwKGZpZWxkcywgUGFyYW1ldGVycy5QUk9EVUNUX1RZUEVfSUQsIHByb2R1Y3RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKSk7CQkJCQorCQl9CisJCWlmIChjcmVhdGUpIHsKKwkJCS8vIG9ubHkgaW5zZXJ0IGRhdGUvdGltZSB3aGVuIHByb2R1Y3QgaXMgZmlyc3QgY3JlYXRlZAorCQkJRGF0ZSBwcm9kdWN0RGF0ZVRpbWUgPSBuZXcgRGF0ZSgpOyAvLyBjdXJyZW50IGRhdGV0aW1lCisJCQl0aGlzLmFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlBST0RVQ1RfUkVDRUlWRURfVElNRSwgUGFyYW1ldGVycy5TT0xSX0RBVEVfVElNRV9GT1JNQVRURVIuZm9ybWF0KHByb2R1Y3REYXRlVGltZSkpOworCQl9CisJCQorCQkvLyBjcmVhdGUgbmV3IHByb2R1Y3Q6IHVzZSBTb2xyIGlkID09IENBUyBpZAorCQlpZiAoY3JlYXRlKSB7CQkJCisJCQlkb2NzLmFkZCggdGhpcy5nZW5lcmF0ZUluc2VydERvY3VtZW50cyhwcm9kdWN0LmdldFByb2R1Y3RJZCgpLCBmaWVsZHMpICk7CisJCQkKKwkJLy8gdXBkYXRlIGV4aXN0aW5nIHByb2R1Y3QKKwkJfSBlbHNlIHsJCQkKKwkJCWRvY3MuYWRkQWxsKCB0aGlzLmdlbmVyYXRlVXBkYXRlRG9jdW1lbnRzKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksIGZpZWxkcywgdHJ1ZSkgKTsgLy8gcmVwbGFjZT10cnVlCisJCQorCQl9CisJCQorCQlyZXR1cm4gZG9jczsKKwkJCisJfQorCQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IHNlcmlhbGl6ZShTdHJpbmcgcHJvZHVjdElkLCBSZWZlcmVuY2Ugcm9vdFJlZmVyZW5jZSwgTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZXMsIGJvb2xlYW4gcmVwbGFjZSkgeworCQkKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBmaWVsZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKKwkJCisJCS8vIHByb2R1Y3Qgcm9vdCByZWZlcmVuY2UKKwkJaWYgKHJvb3RSZWZlcmVuY2UhPW51bGwpIHsKKwkJCQorCQkJYWRkS2V5VmFsdWVUb01hcChmaWVsZHMsIFBhcmFtZXRlcnMuUk9PVF9SRUZFUkVOQ0VfT1JJR0lOQUwsIHJvb3RSZWZlcmVuY2UuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKwkJCWFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlJPT1RfUkVGRVJFTkNFX0RBVEFTVE9SRSwgcm9vdFJlZmVyZW5jZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisJCQlhZGRLZXlWYWx1ZVRvTWFwKGZpZWxkcywgUGFyYW1ldGVycy5ST09UX1JFRkVSRU5DRV9GSUxFU0laRSwgIiIrcm9vdFJlZmVyZW5jZS5nZXRGaWxlU2l6ZSgpKTsKKwkJCWFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlJPT1RfUkVGRVJFTkNFX01JTUVUWVBFLCByb290UmVmZXJlbmNlLmdldE1pbWVUeXBlKCkudG9TdHJpbmcoKSk7CisJCQkKKwkJfQorCQkKKwkJLy8gYWxsIG90aGVyIHByb2R1Y3QgcmVmZXJlbmNlcworCSAgLy8gbm90ZSB0aGF0IFNvbHIgd2lsbCBwcmVzZXJ2ZSB0aGUgaW5kZXhpbmcgb3JkZXIuCisJCWZvciAoUmVmZXJlbmNlIHJlZmVyZW5jZSA6IHJlZmVyZW5jZXMpIHsKKwkJCQorCQkJYWRkS2V5VmFsdWVUb01hcChmaWVsZHMsIFBhcmFtZXRlcnMuUkVGRVJFTkNFX09SSUdJTkFMLCByZWZlcmVuY2UuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKwkJCWFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlJFRkVSRU5DRV9EQVRBU1RPUkUsIHJlZmVyZW5jZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisJCQlhZGRLZXlWYWx1ZVRvTWFwKGZpZWxkcywgUGFyYW1ldGVycy5SRUZFUkVOQ0VfRklMRVNJWkUsICIiK3JlZmVyZW5jZS5nZXRGaWxlU2l6ZSgpKTsKKwkJCWFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBQYXJhbWV0ZXJzLlJFRkVSRU5DRV9NSU1FVFlQRSwgcmVmZXJlbmNlLmdldE1pbWVUeXBlKCkudG9TdHJpbmcoKSk7CisJCQkKKwkJfQorCQkKKwkJcmV0dXJuIGdlbmVyYXRlVXBkYXRlRG9jdW1lbnRzKHByb2R1Y3RJZCwgZmllbGRzLCByZXBsYWNlKTsKKwkJCisJfQorCQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgUXVlcnlSZXNwb25zZSBkZXNlcmlhbGl6ZShTdHJpbmcgeG1sKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQl0cnkgeworCQkJCisJCQlRdWVyeVJlc3BvbnNlIHF1ZXJ5UmVzcG9uc2UgPSBuZXcgUXVlcnlSZXNwb25zZSgpOworCQkJCisJCQkvLyBwYXJzZSBYTUwgaW50byBET00KKwkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VYbWwoeG1sKTsKKwkJCQorCQkJLy8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIERPTSB0byBQcm9kdWN0CisJCQlFbGVtZW50IHJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJCQlOb2RlIHJlc3VsdCA9IHJlc3BvbnNlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJyZXN1bHQiKS5pdGVtKDApOworCQkJcXVlcnlSZXNwb25zZS5zZXROdW1Gb3VuZCggSW50ZWdlci5wYXJzZUludCggKChFbGVtZW50KXJlc3VsdCkuZ2V0QXR0cmlidXRlKCJudW1Gb3VuZCIpICkgKTsKKwkJCXF1ZXJ5UmVzcG9uc2Uuc2V0U3RhcnQoIEludGVnZXIucGFyc2VJbnQoICgoRWxlbWVudClyZXN1bHQpLmdldEF0dHJpYnV0ZSgic3RhcnQiKSApICk7CQkJCisJCQlOb2RlTGlzdCBkb2NzID0gcmVzdWx0LmdldENoaWxkTm9kZXMoKTsKKwkJCWZvciAoaW50IGk9MDsgaTwgZG9jcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQkJTm9kZSBub2RlID0gZG9jcy5pdGVtKGkpOworCQkJCWlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJkb2MiKSkgeworCQkJCQlFbGVtZW50IGRvYyA9IChFbGVtZW50KW5vZGU7CQkJCQkKKwkJCQkJQ29tcGxldGVQcm9kdWN0IGNwID0gdGhpcy5kZXNlcmlhbGl6ZShkb2MpOworCQkJCQlxdWVyeVJlc3BvbnNlLmdldENvbXBsZXRlUHJvZHVjdHMoKS5hZGQoY3ApOworCQkJCX0KKwkJCX0JCQorCQkJcmV0dXJuIHF1ZXJ5UmVzcG9uc2U7CisJCQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisJCQorCX0KKwkKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBzZXJpYWxpemUoU3RyaW5nIHByb2R1Y3RJZCwgTWV0YWRhdGEgbWV0YWRhdGEsIGJvb2xlYW4gcmVwbGFjZSkgeworCQkKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBmaWVsZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKKwkJCisJCWZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEtleXMoKSkgeworCQkJaWYgKCEgKGtleS5zdGFydHNXaXRoKFBhcmFtZXRlcnMuTlMpICAgICAgICAgICAgICAvLyBza2lwIG1ldGFkYXRhIGtleXMgc3RhcnRpbmcgd2l0aCByZXNlcnZlZCBuYW1lc3BhY2UKKwkJCQkgICAgIHx8IFBhcmFtZXRlcnMuUFJPRFVDVF9UWVBFX05BTUUuaW5kZXhPZihrZXkpPj0wIC8vIHNraXAgJ1Byb2R1Y3RUeXBlJyBhcyBhbHJlYWR5IHN0b3JlZCBhcyAnQ0FTLlByb2R1Y3RUeXBlTmFtZScKKwkJCQkgICAgIHx8IFBhcmFtZXRlcnMuUFJPRFVDVF9TVFJVQ1RVUkUuaW5kZXhPZihrZXkpPj0wKSkgeyAvLyBza2lwICdQcm9kdWN0VHlwZScgYXMgYWxyZWFkeSBzdG9yZWQgYXMgJ0NBUy5Qcm9kdWN0U3RydWN0dXJlJworCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSkgeworCQkJCQl0aGlzLmFkZEtleVZhbHVlVG9NYXAoZmllbGRzLCBrZXksIHZhbHVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiB0aGlzLmdlbmVyYXRlVXBkYXRlRG9jdW1lbnRzKHByb2R1Y3RJZCwgZmllbGRzLCByZXBsYWNlKTsKKwkJCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBhZGQgYSAoa2V5LCB2YWx1ZSkgdG8gYSBtdWx0aS12YWx1ZWQgbWFwIHdpdGggYXBwcm9wcmlhdGUgY2hlY2tzLgorCSAqIEBwYXJhbSBtYXAKKwkgKiBAcGFyYW0ga2V5CisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkS2V5VmFsdWVUb01hcChNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG1hcCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisJCQorCQlpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSB7CisJCQltYXAucHV0KGtleSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQl9CisJCWlmICh2YWx1ZSE9bnVsbCkgeworCQkJbWFwLmdldChrZXkpLmFkZCh2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQkvLyB1c2Ugc3BlY2lhbCB2YWx1ZSB0byB0cmlnZ2VyIGtleSByZW1vdmFsCisJCQltYXAuZ2V0KGtleSkuYWRkKFBhcmFtZXRlcnMuTlVMTCk7CisJCX0KKwl9CisJCisJLyoqCisJICogVXRpbGl0eSBtZXRob2QgdG8gZ2VuZXJhdGUgYSBTb2xyIGluc2VydCBkb2N1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvZHVjdElkCisJICogQHBhcmFtIGZpZWxkcworCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlSW5zZXJ0RG9jdW1lbnRzKFN0cmluZyBwcm9kdWN0SWQsIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBmaWVsZHMpIHsKKwkJCisJCVN0cmluZ0J1aWxkZXIgZG9jID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZG9jLmFwcGVuZCgiPGRvYz4iKTsKKwkJCisJCS8vIHByb2R1Y3QgU29sciBpZCBmaWVsZAorCQlkb2MuYXBwZW5kKCBlbmNvZGVJbmRleEZpZWxkKFBhcmFtZXRlcnMuSUQsIHByb2R1Y3RJZCkgKTsKKwkJCisJCS8vIGFsbCBvdGhlciBmaWVsZHMKKwkJZm9yIChTdHJpbmcga2V5IDogZmllbGRzLmtleVNldCgpKSB7CisJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IGZpZWxkcy5nZXQoa2V5KSkgeworCQkJCWRvYy5hcHBlbmQoIGVuY29kZUluZGV4RmllbGQoa2V5LCB2YWx1ZSkgKTsKKwkJCX0KKwkJfQorCisJCWRvYy5hcHBlbmQoIjwvZG9jPiIpOworCQlyZXR1cm4gZG9jLnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGdlbmVyYXRlIFNvbHIgdXBkYXRlIGRvY3VtZW50cy4KKwkgKiBOb3RlIHRoYXQgdGhlIHJlcXVlc3RzIGZvciBzZXR0aW5nL2FkZGluZy9kZWxldGluZyBmaWVsZHMgbXVzdCBiZSBzZW50IGFzIHNlcGFyYXRlIGRvY3VtZW50cyB0byBTb2xyCisJICogQHBhcmFtIHByb2R1Y3RJZAorCSAqIEBwYXJhbSBmaWVsZHMKKwkgKiBAcGFyYW0gcmVwbGFjZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdlbmVyYXRlVXBkYXRlRG9jdW1lbnRzKFN0cmluZyBwcm9kdWN0SWQsIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBmaWVsZHMsIGJvb2xlYW4gcmVwbGFjZSkgeworCQkKKwkJLy8gbGlzdCBmb3IgZGlmZmVyZW50IGluc3RydWN0aW9uIHR5cGVzCisJCUxpc3Q8U3RyaW5nPiBzZXRGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJTGlzdDxTdHJpbmc+IGFkZEZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gZGVsRmllbGRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQorCQkvLyBlbmNvZGUgdXBkYXRlIGluc3RydWN0aW9ucworCQlmb3IgKFN0cmluZyBrZXkgOiBmaWVsZHMua2V5U2V0KCkpIHsKKwkJCQorCQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IGZpZWxkcy5nZXQoa2V5KTsKKwkJCQorCQkJaWYgKHJlcGxhY2UpIHsKKwkJCQkKKwkJCQlpZiAodmFsdWVzLmlzRW1wdHkoKSkgeworCQkJCQkvLyB1c2Ugc3BlY2lhbCB2YWx1ZSB0byBmbGFnIHJlbW92YWwKKwkJCQkJZGVsRmllbGRzLmFkZCggdGhpcy5lbmNvZGVVcGRhdGVGaWVsZChrZXksIFBhcmFtZXRlcnMuTlVMTCwgcmVwbGFjZSkgKTsKKwkJCQkJCisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCQkJCXNldEZpZWxkcy5hZGQoIHRoaXMuZW5jb2RlVXBkYXRlRmllbGQoa2V5LCB2YWx1ZSwgcmVwbGFjZSkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCQkJYWRkRmllbGRzLmFkZCggdGhpcy5lbmNvZGVVcGRhdGVGaWVsZChrZXksIHZhbHVlLCByZXBsYWNlKSApOworCQkJCX0KKwkJCX0KKwkJCQorCQl9CisJCQorCQlMaXN0PFN0cmluZz4gZG9jcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZiAoIWRlbEZpZWxkcy5pc0VtcHR5KCkpIGRvY3MuYWRkKCB0b0RvYyhwcm9kdWN0SWQsIGRlbEZpZWxkcykgKTsKKwkJaWYgKCFzZXRGaWVsZHMuaXNFbXB0eSgpKSBkb2NzLmFkZCggdG9Eb2MocHJvZHVjdElkLCBzZXRGaWVsZHMpICk7CisJCWlmICghYWRkRmllbGRzLmlzRW1wdHkoKSkgZG9jcy5hZGQoIHRvRG9jKHByb2R1Y3RJZCwgYWRkRmllbGRzKSApOworCQlyZXR1cm4gZG9jczsKKwkJCisJfQorCQorCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIG1lcmdlIGZpZWxkIHVwZGF0ZSBpbnN0cnVjdGlvbnMgaW50byBhIHNpbmdsZSBkb2N1bWVudC4KKwkgKiBAcGFyYW0gcHJvZHVjdElkCisJICogQHBhcmFtIHVwZGF0ZXMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdG9Eb2MoU3RyaW5nIHByb2R1Y3RJZCwgTGlzdDxTdHJpbmc+IHVwZGF0ZXMpIHsKKwkJCisJCVN0cmluZ0J1aWxkZXIgZG9jID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZG9jLmFwcGVuZCgiPGRvYz4iKTsKKwkJCisJCS8vIHJlZmVyZW5jZSBwcm9kdWN0IHJlY29yZCBpZAorCQlkb2MuYXBwZW5kKCBlbmNvZGVJbmRleEZpZWxkKFBhcmFtZXRlcnMuSUQsIHByb2R1Y3RJZCkgKTsKKwkJCisJCS8vIGxvb3Agb3ZlciBmaWVsZCB1cGRhdGUgaW5zdHJ1Y3Rpb25zCisJCWZvciAoU3RyaW5nIHVwZGF0ZSA6IHVwZGF0ZXMpIHsKKwkJCWRvYy5hcHBlbmQodXBkYXRlKTsKKwkJfQorCQkKKwkJZG9jLmFwcGVuZCgiPC9kb2M+Iik7CisJCQorCQlyZXR1cm4gZG9jLnRvU3RyaW5nKCk7CisJCQorCX0KKwkKKwkvKioKKwkgKiBNZXRob2QgdG8gZW5jb2RlIGEgU29sciBmaWVsZCBpbmRleGluZyBpbnN0cnVjdGlvbi4KKwkgKiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKwkgKiBAcGFyYW0ga2V5CisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZW5jb2RlSW5kZXhGaWVsZChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlPT1udWxsIHx8IHZhbHVlLmVxdWFscyhQYXJhbWV0ZXJzLk5VTEwpKSB7CisJCQlyZXR1cm4gIiI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIjxmaWVsZCBuYW1lPVwiIitrZXkrIlwiPiIgKyB2YWx1ZSArICI8L2ZpZWxkPiI7CisJCX0KKwl9CisJCisJLyoqCisJICogTWV0aG9kIHRvIGVuY29kZSBhIGZpZWxkIHVwZGF0ZSBpbnN0cnVjdGlvbiBmb3IgdGhlIHRocmVlIHBvc3NpYmxlIGNhc2VzOgorCSAqIGFkZCBuZXcgdmFsdWVzIHRvIGEga2V5ICgxKSwgcmVwbGFjZSBjdXJyZW50IHZhbHVlcyBmb3IgYSBrZXkgKDIpLCByZW1vdmUgYWxsIHZhbHVlcyBmb3IgYSBrZXkgKDMpLgorCSAqIAorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcGFyYW0gcmVwbGFjZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGVuY29kZVVwZGF0ZUZpZWxkKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiByZXBsYWNlKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlzYi5hcHBlbmQoIjxmaWVsZCBuYW1lPVwiIitrZXkrIlwiIik7CisJCQorCQlpZiAocmVwbGFjZSkgeworCQkJCisJCQlpZiAodmFsdWU9PW51bGwgfHwgdmFsdWUuZXF1YWxzKFBhcmFtZXRlcnMuTlVMTCkpIHsKKwkJCQkKKwkJCQkvLyAoMykgcmVtb3ZlIGFsbCB2YWx1ZXMgZm9yIGdpdmVuIGtleQorCQkJCXNiLmFwcGVuZCgiIHVwZGF0ZT1cInNldFwiIG51bGw9XCJ0cnVlXCIgLz4iKTsKKwkJCQkKKwkJCX0gZWxzZSB7CisJCQkJCisJCQkJLy8gKDIpIHJlcGxhY2UgZXhpc3RpbmcgdmFsdWVzIHdpdGggbmV3IHZhbHVlcworCQkJCXNiLmFwcGVuZCgiIHVwZGF0ZT1cInNldFwiPiIgKyB2YWx1ZSArICI8L2ZpZWxkPiIpOworCQkJfQorCQkJCisJCX0gZWxzZSB7CisJCQkKKwkJCS8vICgxKSBhZGQgbmV3IHZhbHVlcyB0byBleGlzdGluZyB2YWx1ZXMKKwkJCXNiLmFwcGVuZCgiIHVwZGF0ZT1cImFkZFwiPiIrdmFsdWUrIjwvZmllbGQ+Iik7CisJCQkKKwkJfQorCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKwkKKworCQorCS8qKgorCSAqIE1ldGhvZCB0aGF0IHBhcnNlcyBhIHNpbmdsZSBTb2xyIGRvY3VtZW50IHNuaXBwZXQKKwkgKiB0byBleHRyYWN0IFByb2R1Y3QgYW5kIE1ldGFkYXRhIGF0dHJpYnV0ZXMuCisJICogCisJICogQHBhcmFtIGRvYworCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIENvbXBsZXRlUHJvZHVjdCBkZXNlcmlhbGl6ZShFbGVtZW50IGRvYykgeworCQkKKwkJQ29tcGxldGVQcm9kdWN0IGNwID0gbmV3IENvbXBsZXRlUHJvZHVjdCgpOworCQlQcm9kdWN0IHByb2R1Y3QgPSBjcC5nZXRQcm9kdWN0KCk7CisJCVByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpOworCQlNZXRhZGF0YSBtZXRhZGF0YSA9IGNwLmdldE1ldGFkYXRhKCk7CisJCUxpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpOworCQlSZWZlcmVuY2Ugcm9vdFJlZmVyZW5jZSA9IHByb2R1Y3QuZ2V0Um9vdFJlZigpOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBkb2MuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBqPTA7IGo8Y2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgeworCQkJCisJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShqKTsKKwkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWNoaWxkOworCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworCQkJCisJCQkvKioKKwkJCSAqPGFyciBuYW1lPSJTY2FuUG9pbnRpbmdTb3VyY2UiPgorCQkJICoJPHN0cj5HMDczLjY1KzAuMTk8L3N0cj4KKwkJCSAqCTxzdHI+SjIwMTUrMzQxMDwvc3RyPgorCSAgICAgKiAgLi4uLi4uLi4uLgorCQkJICovCisJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImFyciIpKSB7CisJCQkJCisJCQkJTm9kZUxpc3QgdmFsdWVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCQkJTGlzdDxTdHJpbmc+IHZhbHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlmb3IgKGludCBrPTA7IGs8dmFsdWVzLmdldExlbmd0aCgpOyBrKyspIHsKKwkJCQkJU3RyaW5nIHZhbHVlID0gKChFbGVtZW50KXZhbHVlcy5pdGVtKGspKS5nZXRUZXh0Q29udGVudCgpOworCQkJCQl2YWxzLmFkZCh2YWx1ZSk7CisJCQkJfQorCQkJCS8vIENBUy5yZWZlcmVuY2UuLi4uIGZpZWxkcworCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoUGFyYW1ldGVycy5OUykpIHsJCQkJCQorCQkJCQkJZm9yIChpbnQgaz0wOyBrPHZhbHVlcy5nZXRMZW5ndGgoKTsgaysrKSB7CisJCQkJCQkJLy8gY3JlYXRlIHRoaXMgcmVmZXJlbmNlCisJCQkJCQkJaWYgKHJlZmVyZW5jZXMuc2l6ZSgpPD1rKSByZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKCkpOworCQkJCQkJCWlmIChuYW1lLmVxdWFscyhQYXJhbWV0ZXJzLlJFRkVSRU5DRV9PUklHSU5BTCkpIHsKKwkJCQkJCQkJcmVmZXJlbmNlcy5nZXQoaykuc2V0T3JpZ1JlZmVyZW5jZSh2YWxzLmdldChrKSk7CisJCQkJCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYXJhbWV0ZXJzLlJFRkVSRU5DRV9EQVRBU1RPUkUpKSB7CisJCQkJCQkJCXJlZmVyZW5jZXMuZ2V0KGspLnNldERhdGFTdG9yZVJlZmVyZW5jZSh2YWxzLmdldChrKSk7CisJCQkJCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYXJhbWV0ZXJzLlJFRkVSRU5DRV9GSUxFU0laRSkpIHsKKwkJCQkJCQkJcmVmZXJlbmNlcy5nZXQoaykuc2V0RmlsZVNpemUoTG9uZy5wYXJzZUxvbmcodmFscy5nZXQoaykpKTsKKwkJCQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuUkVGRVJFTkNFX01JTUVUWVBFKSkgeworCQkJCQkJCQlyZWZlcmVuY2VzLmdldChrKS5zZXRNaW1lVHlwZSh2YWxzLmdldChrKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCS8vIGFsbCBvdGhlciBtdWx0aS12YWx1ZWQgZmllbGRzCisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5kZXNlcmlhbGl6ZU11bHRpVmFsdWVGaWVsZChuYW1lLCB2YWxzLCBtZXRhZGF0YSk7CisJCQkJfQorCQkJCQorCQkJLyoqCisJCQkgKiAJPHN0ciBuYW1lPSJpZCI+NjY4NGQ3OWQtYTAxMS00YmMwLWIzYjMtNGYxMTgxNzA5MWM4PC9zdHI+CisJCQkgKiAgPHN0ciBuYW1lPSJDQVMuUHJvZHVjdElkIj42Njg0ZDc5ZC1hMDExLTRiYzAtYjNiMy00ZjExODE3MDkxYzg8L3N0cj4KKwkJCSAqICA8c3RyIG5hbWU9IkNBUy5Qcm9kdWN0TmFtZSI+dG5zX2JyMTQ1eDRfMjA8L3N0cj4KKwkJCSAqICA8c3RyIG5hbWU9IkZpbGVMb2NhdGlvbiI+L3Vzci9sb2NhbC9za2EtZGMvZGF0YS9hcmNoaXZlPC9zdHI+CisgICAgICAgKiAgLi4uLi4uLi4uLi4KKwkJCSAqLworCQkJfSBlbHNlIHsKKwkJCQkKKwkJCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldFRleHRDb250ZW50KCk7CisJCQkJCisJCQkJLy8gY29yZSBDQVMgZmllbGRzCisJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChQYXJhbWV0ZXJzLk5TKSkgeworCQkJCQlpZiAobmFtZS5lcXVhbHMoUGFyYW1ldGVycy5QUk9EVUNUX0lEKSkgeworCQkJCQkJcHJvZHVjdC5zZXRQcm9kdWN0SWQodmFsdWUpOworCQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuUFJPRFVDVF9OQU1FKSkgeworCQkJCQkJcHJvZHVjdC5zZXRQcm9kdWN0TmFtZSh2YWx1ZSk7CisJCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFyYW1ldGVycy5QUk9EVUNUX1NUUlVDVFVSRSkpIHsKKwkJCQkJCXByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZSh2YWx1ZSk7CisJCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFyYW1ldGVycy5QUk9EVUNUX1RSQU5TRkVSX1NUQVRVUykpIHsKKwkJCQkJCXByb2R1Y3Quc2V0VHJhbnNmZXJTdGF0dXModmFsdWUpOworCQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuUFJPRFVDVF9UWVBFX05BTUUpKSB7CisJCQkJCQlwcm9kdWN0VHlwZS5zZXROYW1lKHZhbHVlKTsKKwkJCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYXJhbWV0ZXJzLlBST0RVQ1RfVFlQRV9JRCkpIHsKKwkJCQkJCXByb2R1Y3RUeXBlLnNldFByb2R1Y3RUeXBlSWQodmFsdWUpOworCQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuUFJPRFVDVF9SRUNFSVZFRF9USU1FKSkgeworCQkJCQkJLy8gaWdub3JlID8KKwkJCQkJCQorCQkJCQkvLyBDQVMgcm9vdCByZWZlcmVuY2UKKwkJCQkJfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoUGFyYW1ldGVycy5OUytQYXJhbWV0ZXJzLlJPT1QpKSB7CisJCQkJCQlpZiAocm9vdFJlZmVyZW5jZT09bnVsbCkgcm9vdFJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UoKTsKKwkJCQkJCWlmIChuYW1lLmVxdWFscyhQYXJhbWV0ZXJzLlJPT1RfUkVGRVJFTkNFX09SSUdJTkFMKSkgeworCQkJCQkJCXJvb3RSZWZlcmVuY2Uuc2V0T3JpZ1JlZmVyZW5jZSh2YWx1ZSk7CisJCQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuUk9PVF9SRUZFUkVOQ0VfREFUQVNUT1JFKSkgeworCQkJCQkJCXJvb3RSZWZlcmVuY2Uuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKHZhbHVlKTsKKwkJCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFyYW1ldGVycy5ST09UX1JFRkVSRU5DRV9GSUxFU0laRSkpIHsKKwkJCQkJCQlyb290UmVmZXJlbmNlLnNldEZpbGVTaXplKExvbmcucGFyc2VMb25nKHZhbHVlKSk7CisJCQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuUk9PVF9SRUZFUkVOQ0VfTUlNRVRZUEUpKSB7CisJCQkJCQkJcm9vdFJlZmVyZW5jZS5zZXRNaW1lVHlwZSh2YWx1ZSk7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQkKKwkJCQkvLyBub24gY29yZSBzaW5nbGUtdmFsdWVkIGZpZWxkcworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuZGVzZXJpYWxpemVTaW5nbGVWYWx1ZUZpZWxkKG5hbWUsIHZhbHVlLCBtZXRhZGF0YSk7CisJCQkJfSAvLyAiQ0FTIi4uLi4gb3Igbm90CisJCQkJCisJCQl9IC8vICJhcnIiIG9yIGFueXRoaW5nIGVsc2UKKwkJCQorCQl9IC8vIGxvb3Agb3ZlciA8ZG9jPiBjaGlsZHJlbgorCQkKKwkJcmV0dXJuIGNwOworCQkKKwl9CisJCisJcHJpdmF0ZSBEb2N1bWVudCBwYXJzZVhtbChTdHJpbmcgeG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoIG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHhtbCkpICk7CisgICAgcmV0dXJuIGRvY3VtZW50OworICAgIAorCX0KKwkKKwkvKioKKwkgKiBNZXRob2QgdGhhdCBkZXNlcmlhbGl6ZXMgYSBzaW5nbGUtdmFsdWVkIFNvbHIgZmllbGQgaW50byBhIE1ldGFkYXRhIGVsZW1lbnQuCisJICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViLWNsYXNzZXMgdG8gcHJvdmlkZSBjdXN0b20gYmVoYXZpb3IuCisJICogCisJICogQHBhcmFtIG5hbWUgOiB0aGUgU29sciBmaWVsZCBuYW1lCisJICogQHBhcmFtIHZhbHVlIDogdGhlIFNvbHIgZmllbGQgc2luZ2xlIHZhbHVlCisJICogQHBhcmFtIG1ldGFkYXRhIDogdGhlIG1ldGFkYXRhIGNvbnRhaW5lcgorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplU2luZ2xlVmFsdWVGaWVsZChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBNZXRhZGF0YSBtZXRhZGF0YSkgeworCQkKKwkJaWYgKG5hbWUuZXF1YWxzKFBhcmFtZXRlcnMuSUQpKSB7CisJCQkvLyBpZ25vcmUgU29sciBpbnRlcm5hbCBpZGVudGlmaWVyIChhcyBpdCBpcyBkdXBsaWNhdGUgaW5mb3JtYXRpb24gb2YgQ0FTLlByb2R1Y3RJZCkKKwkJfSBlbHNlIHsKKwkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKG5hbWUsIHZhbHVlKTsKKwkJfQorCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0aGF0IGRlc2VyaWFsaXplcyBhIG11bHRpLXZhbHVlZCBTb2xyIGZpZWxkIGludG8gYSBNZXRhZGF0YSBlbGVtZW50LgorCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzIHRvIHByb3ZpZGUgY3VzdG9tIGJlaGF2aW9yLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIDogdGhlIFNvbHIgZmllbGQgbmFtZQorCSAqIEBwYXJhbSB2YWx1ZXMgOiB0aGUgU29sciBmaWVsZCBtdWx0aXBsZSB2YWx1ZXMKKwkgKiBAcGFyYW0gbWV0YWRhdGEgOiB0aGUgbWV0YWRhdGEgY29udGFpbmVyCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemVNdWx0aVZhbHVlRmllbGQoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiB2YWx1ZXMsIE1ldGFkYXRhIG1ldGFkYXRhKSB7CisJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKG5hbWUsIHZhbHVlcyk7CisJfQorCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvTmFtZVByb2R1Y3RJZEdlbmVyYXRvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9OYW1lUHJvZHVjdElkR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwOGY5MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvTmFtZVByb2R1Y3RJZEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zb2xyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUHJvZHVjdElkR2VuZXJhdG9yfSAKKyAqIHRoYXQgc2V0cyB0aGUgUHJvZHVjdCBpZGVudGlmaWVyIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG5hbWUuCisgKiBUaGlzIGdlbmVyYXRvciB3aWxsIGNhdXNlIGEgc2Vjb25kIHN1Ym1pc3Npb24gb2YgdGhlIHNhbWUgbmFtZWQgUHJvZHVjdAorICogdG8gb3ZlcnJpZGUgdGhlIHByZXZpb3VzIHJlY29yZCBpbnNpZGUgdGhlIFNvbHIgaW5kZXguCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIE5hbWVQcm9kdWN0SWRHZW5lcmF0b3IgaW1wbGVtZW50cyBQcm9kdWN0SWRHZW5lcmF0b3IgeworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZW5lcmF0ZUlkKFByb2R1Y3QgcHJvZHVjdCkgeworCQlyZXR1cm4gcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9QYXJhbWV0ZXJzLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1BhcmFtZXRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzYyZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9QYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHI7CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKKworCisvKioKKyAqIENsYXNzIGhvbGRpbmcgcGFyYW1ldGVycyBmb3IgU29sciBpbXBsZW1lbnRhdGlvbiBvZiBDQVMgRmlsZSBNYW5hZ2VyLgorICogCisgKiBAYXV0aG9yIEx1Y2EgQ2lucXVpbmkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJzIHsKKwkKKwkvLyB0aGUgU29sciB1bmlxdWUgaWRlbnRpZmllciBmaWVsZAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gImlkIjsKKwkKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOUyA9ICJDQVMuIjsKKwkJCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPRFVDVF9JRCA9IE5TKyJQcm9kdWN0SWQiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0RVQ1RfTkFNRSA9IE5TKyJQcm9kdWN0TmFtZSI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPRFVDVF9TVFJVQ1RVUkUgPSBOUysiUHJvZHVjdFN0cnVjdHVyZSI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPRFVDVF9UUkFOU0ZFUl9TVEFUVVMgPSBOUysiUHJvZHVjdFRyYW5zZmVyU3RhdHVzIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9EVUNUX1JFQ0VJVkVEX1RJTUUgPSBOUysiUHJvZHVjdFJlY2VpdmVkVGltZSI7CQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0RVQ1RfVFlQRV9OQU1FID0gTlMrIlByb2R1Y3RUeXBlTmFtZSI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPRFVDVF9UWVBFX0lEID0gTlMrIlByb2R1Y3RUeXBlSWQiOworCQkKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUZFUkVOQ0VfT1JJR0lOQUwgPSBOUysiUmVmZXJlbmNlT3JpZ2luYWwiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFRkVSRU5DRV9EQVRBU1RPUkUgPSBOUysiUmVmZXJlbmNlRGF0YXN0b3JlIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUZFUkVOQ0VfRklMRVNJWkUgPSBOUysiUmVmZXJlbmNlRmlsZVNpemUiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFRkVSRU5DRV9NSU1FVFlQRSA9IE5TKyJSZWZlcmVuY2VNaW1lVHlwZSI7CisJCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUk9PVCA9ICJSb290IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBST09UX1JFRkVSRU5DRV9PUklHSU5BTCA9IE5TK1JPT1QrUkVGRVJFTkNFX09SSUdJTkFMOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJPT1RfUkVGRVJFTkNFX0RBVEFTVE9SRSA9IE5TK1JPT1QrUkVGRVJFTkNFX0RBVEFTVE9SRTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBST09UX1JFRkVSRU5DRV9GSUxFU0laRSA9IE5TK1JPT1QrUkVGRVJFTkNFX0ZJTEVTSVpFOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJPT1RfUkVGRVJFTkNFX01JTUVUWVBFID0gTlMrUk9PVCtSRUZFUkVOQ0VfTUlNRVRZUEU7CisKKyAgLy8gcmVxdWlyZWQgZGF0ZS90aW1lIGZvcm1hdCBmb3IgU29sciBkb2N1bWVudHMKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MUl9EQVRFX0ZPUk1BVCA9ICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MnWiciOworICBwdWJsaWMgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgU09MUl9EQVRFX1RJTUVfRk9STUFUVEVSID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoU09MUl9EQVRFX0ZPUk1BVCk7CisKKyAgLy8gcG9zc2libGUgbWltZSB0eXBlcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIFNvbHIKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFX1hNTCA9ICJhcHBsaWNhdGlvbi94bWwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEVfSlNPTiA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKyAgCisgIC8vIHBhZ2Ugc2l6ZSBmb3IgcGFnaW5hdGlvbgorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkUgPSAyMDsKKwkKKwkvLyBzcGVjaWFsIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG1ldGFkYXRhIGZpZWxkIG11c3QgYmUgZGVsZXRlZAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTEwgPSAiX19OVUxMX18iOworCQorCXByaXZhdGUgUGFyYW1ldGVycygpIHt9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1Byb2R1Y3RJZEdlbmVyYXRvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Qcm9kdWN0SWRHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU3N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Qcm9kdWN0SWRHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29scjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CisKKy8qKgorICogQVBJIGZvciBnZW5lcmF0aW5nIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgQ0FTIFByb2R1Y3QuCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGludGVyZmFjZSBQcm9kdWN0SWRHZW5lcmF0b3IgeworCQorCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJZChQcm9kdWN0IHByb2R1Y3QpOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1Byb2R1Y3RTZXJpYWxpemVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1Byb2R1Y3RTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZTQ4NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvUHJvZHVjdFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29scjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQVBJIGZvciBzZXJpYWxpemluZyBDQVMgb2JqZWN0cyAoUHJvZHVjdHMsIE1ldGFkYXRhIGFuZCBSZWZlcmVuY2VzKSBpbnRvIGRvY3VtZW50cyB0byBiZSBpbmRleGVkIGJ5IFNvbHIsCisgKiBhbmQgdmljZS12ZXJzYSBkZXNlcmlhbGl6aW5nIFNvbHIgcmVzcG9uc2UgZG9jdW1lbnRzIGludG8gQ0FTIG9iamVjdHMuCisgKiAKKyAqIEltcGxlbWVudGluZyBjbGFzc2VzIGFyZSByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGUgQ0FTIGZpZWxkcworICogaW50byBjb3JyZXNwb25kaW5nIFNvbHIgZmllbGRzIGFzIGRlZmluZWQgaW4gdGhlaXIgc3BlY2lmaWMgU29sciBzY2hlbWEueG1sLCAKKyAqIGFuZCB2aWNlLXZlcnNhIGZvciB0cmFuc2Zvcm1pbmcgdGhlIFNvbHIgZmllbGRzIGludG8gY29ycmVzcG9uZGluZyBDQVMgZmllbGRzLgorICogCisgKiBAYXV0aG9yIEx1Y2EgQ2lucXVpbmkKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvZHVjdFNlcmlhbGl6ZXIgeworCQorCS8qKgorCSAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gYSBDQVMgUHJvZHVjdCBpbnRvIG9uZSBvciBtb3JlIGRvY3VtZW50cyB0byBiZSBpbmRleGVkIGJ5IFNvbHIuCisJICogCisJICogQHBhcmFtIHByb2R1Y3QgOiB0aGUgcHJvZHVjdCB0byBiZSBpbmRleGVkCisJICogQHBhcmFtIGNyZWF0ZTogdHJ1ZSB0byBjcmVhdGUgYSBuZXcgcHJvZHVjdCwgZmFsc2UgdG8gdXBkYXRlIGFuIGV4aXN0aW5nIG9uZS4KKwkgKiBAcmV0dXJuCisJICovCisJTGlzdDxTdHJpbmc+IHNlcmlhbGl6ZShQcm9kdWN0IHByb2R1Y3QsIGJvb2xlYW4gY3JlYXRlKTsKKwkKKwkvKioKKwkgKiBNZXRob2QgdG8gdHJhbnNmb3JtIGEgQ0FTIE1ldGFkYXRhIG9iamVjdCBpbnRvIG9uZSBvciBtb3JlIFNvbHIgInVwZGF0ZSIgZG9jdW1lbnRzCisJICogKGkuZS4gZG9jdW1lbnRzIGNvbnRhaW5pbmcgYXR0cmlidXRlcyBvZiBhbiBleGlzdGluZyBwcm9kdWN0KS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvZHVjdElkIDogdGhlIHByb2R1Y3QgdW5pcXVlIGlkZW50aWZpZXIKKwkgKiBAcGFyYW0gbWV0YWRhdGEgOiB0aGUgQ0FTIG1ldGFkYXRhIGhhc2ggdGFibGUKKwkgKiBAcGFyYW0gcmVwbGFjZSA6IHRydWUgdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIG1ldGFkYXRhIHZhbHVlcywgZmFsc2UgdG8gYWRkIG5ldyB2YWx1ZXMgdG8gdGhlIGV4aXN0aW5nIG9uZXMuCisJICogICAgICAgICAgICAgICAgICBFeGlzdGluZyBtZXRhZGF0YSBmaWVsZHMgbm90IGNvbnRhaW5lZCBpbiB0aGUgaGFzaCBhcmUgbGVmdCB1bmNoYW5nZWQuCisJICogICAgICAgICAgICAgICAgICBOb3RlOiB0aGUgc3BlY2lhbCB2YWx1ZSBQYXJhbWV0ZXJzLk5VTEwgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGtleSBtdXN0IGJlIHJlbW92ZWQKKwkgKiAgICAgICAgICAgICAgICAgIChhcyB0aGUgTWV0YWRhdGEgb2JqZWN0IGNhbm5vdCBzdG9yZSBudWxsIG9yIGVtcHR5IGxpc3RzKS4KKwkgKiBAcmV0dXJuCisJICovCisJTGlzdDxTdHJpbmc+IHNlcmlhbGl6ZShTdHJpbmcgcHJvZHVjdElkLCBNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiByZXBsYWNlKTsKKwkKKwkvKioKKwkgKiBNZXRob2QgdG8gdHJhbnNmb3JtIGEgQ0FTIFByb2R1Y3QgUmVmZXJlbmNlcyBvYmplY3QgaW50byBvbmUgb3IgbW9yZSBTb2xyICJ1cGRhdGUiIGRvY3VtZW50cworCSAqIChpLmUuIGRvY3VtZW50cyBjb250YWluaW5nIGF0dHJpYnV0ZXMgb2YgYW4gZXhpc3RpbmcgcHJvZHVjdCkuCisJICogCisJICogQHBhcmFtIHByb2R1Y3RJZAorCSAqIEBwYXJhbSByb290UmVmZXJlbmNlIDogdGhlIHByb2R1Y3Qgcm9vdCByZWZlcmVuY2UsIG1heSBiZSBudWxsCisJICogQHBhcmFtIHJlZmVyZW5jZXMgOiBsaXN0IG9mIHByb2R1Y3QgcmVmZXJlbmNlcywgbWF5IGJlIGVtcHR5CisJICogQHBhcmFtIHJlcGxhY2UgOiB0cnVlIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHJlZmVyZW5jZXMsIGZhbHNlIHRvIGFkZCBuZXcgcmVmZXJlbmNlcyB0byB0aGUgZXhpc3Rpbmcgb25lcworCSAqIEByZXR1cm4KKwkgKi8KKwlMaXN0PFN0cmluZz4gc2VyaWFsaXplKFN0cmluZyBwcm9kdWN0SWQsIFJlZmVyZW5jZSByb290UmVmZXJlbmNlLCBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlcywgYm9vbGVhbiByZXBsYWNlKTsKKwkKKwkvKioKKwkgKiBNZXRob2QgdG8gcGFyc2UgYSBmdWxsIFhNTCByZXNwb25zZSBkb2N1bWVudCBpbnRvIGEgbGlzdCBvZiBQcm9kdWN0LCBSZWZlcmVuY2VzIGFuZCBNZXRhZGF0YSBvYmplY3RzLgorCSAqIAorCSAqIEBwYXJhbSB4bWwgOiB0aGUgU29sciBYTUwgZG9jdW1lbnQgdG8gcGFyc2UgKGlucHV0KQorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCVF1ZXJ5UmVzcG9uc2UgZGVzZXJpYWxpemUoU3RyaW5nIHhtbCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb247CisJCisJLyoqCisJICogTWltZSB0eXBlIG9mIHRoZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGJ5IHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiAoWE1MLCBKU09OIGV0Yy4pCisJICogQHJldHVybgorCSAqLworCVN0cmluZyBnZXRNaW1lVHlwZSgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9RdWVyeVJlc3BvbnNlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1F1ZXJ5UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM1YTQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9RdWVyeVJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKKworLyoqCisgKiBDbGFzcyBob2xkaW5nIGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gcXVlcnlpbmcgdGhlIFNvbHIgc2VydmVyLgorICogCisgKiBAYXV0aG9yIEx1Y2EgQ2lucXVpbmkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeVJlc3BvbnNlIHsKKworCS8qKgorCSAqIFRvdGFsIG51bWJlciBvZiByZXN1bHRzIG1hdGNoaW5nIHRoZSBxdWVyeQorCSAqIChOT1QgdGhlIG51bWJlciBvZiByZXN1bHRzIHJldHVybmVkLCB3aGljaCBpcyB0eXBpY2FsbHkgbGVzcykuCisJICovCisJcHJpdmF0ZSBpbnQgbnVtRm91bmQgPSAwOworCQorCS8qKgorCSAqIE9mZnNldCBpbnRvIHJldHVybmVkIHJlc3VsdHMuCisJICovCisJcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOworCQorCS8qKgorCSAqIExpc3Qgb2YgcHJvZHVjdHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5LAorCSAqIHdpdGggYXNzb2NpYXRlZCBtZXRhZGF0YSBhbmQgcmVmZXJlbmNlcy4KKwkgKi8KKwlwcml2YXRlIExpc3Q8Q29tcGxldGVQcm9kdWN0PiBjb21wbGV0ZVByb2R1Y3RzOworCQorCXB1YmxpYyBRdWVyeVJlc3BvbnNlKCkgeworCQljb21wbGV0ZVByb2R1Y3RzID0gbmV3IEFycmF5TGlzdDxDb21wbGV0ZVByb2R1Y3Q+KCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TnVtRm91bmQoaW50IG51bUZvdW5kKSB7CisJCXRoaXMubnVtRm91bmQgPSBudW1Gb3VuZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKKwkJdGhpcy5zdGFydCA9IHN0YXJ0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc3VsdHMoTGlzdDxDb21wbGV0ZVByb2R1Y3Q+IHJlc3VsdHMpIHsKKwkJdGhpcy5jb21wbGV0ZVByb2R1Y3RzID0gcmVzdWx0czsKKwl9CisKKwlwdWJsaWMgaW50IGdldE51bUZvdW5kKCkgeworCQlyZXR1cm4gbnVtRm91bmQ7CisJfQorCisJcHVibGljIGludCBnZXRTdGFydCgpIHsKKwkJcmV0dXJuIHN0YXJ0OworCX0KKworCXB1YmxpYyBMaXN0PENvbXBsZXRlUHJvZHVjdD4gZ2V0Q29tcGxldGVQcm9kdWN0cygpIHsKKwkJcmV0dXJuIGNvbXBsZXRlUHJvZHVjdHM7CisJfQorCQorCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHJldHVybiBvbmx5IHRoZSAncHJvZHVjdCcgcGFydCBvZiB0aGUgY29tcGxldGUgcmVzdWx0cy4KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHMoKSB7CisJCUxpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBuZXcgQXJyYXlMaXN0PFByb2R1Y3Q+KCk7CisJCWZvciAoQ29tcGxldGVQcm9kdWN0IGNwIDogY29tcGxldGVQcm9kdWN0cykgeworCQkJcHJvZHVjdHMuYWRkKGNwLmdldFByb2R1Y3QoKSk7CisJCX0KKwkJcmV0dXJuIHByb2R1Y3RzOworCX0KKwkKKwkKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvU29sckNhdGFsb2cuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvU29sckNhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTljYTRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Tb2xyQ2F0YWxvZy5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29scjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnBhZ2luYXRpb24uUGFnaW5hdGlvblV0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0FTIHtAbGluayBDYXRhbG9nfSBpbnRlcmZhY2UKKyAqIHRoYXQgdXNlcyBhIFNvbHIgYmFjay1lbmQgbWV0YWRhdGEgc3RvcmUuCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIFNvbHJDYXRhbG9nIGltcGxlbWVudHMgQ2F0YWxvZyB7CisJCisJLy8gQ2xhc3MgcmVzcG9uc2libGUgZm9yIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgQ0FTIHByb2R1Y3RzIGludG8gU29sciBkb2N1bWVudHMKKwlQcm9kdWN0U2VyaWFsaXplciBwcm9kdWN0U2VyaWFsaXplcjsKKwkJCisJLy8gQ2xhc3MgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBpbmNvbWluZyBQcm9kdWN0cworCVByb2R1Y3RJZEdlbmVyYXRvciBwcm9kdWN0SWRHZW5lcmF0b3I7CisJCisJLy8gQ2xhc3MgcmVzcG9uc2libGUgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIFNvbHIgc2VydmVyCisJU29sckNsaWVudCBzb2xyQ2xpZW50OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNvbHJDYXRhbG9nLmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHVibGljIFNvbHJDYXRhbG9nKFN0cmluZyBzb2xyVXJsLCBQcm9kdWN0SWRHZW5lcmF0b3IgcHJvZHVjdElkR2VuZXJhdG9yLCBQcm9kdWN0U2VyaWFsaXplciBwcm9kdWN0U2VyaWFsaXplcikgeworCQl0aGlzLnByb2R1Y3RJZEdlbmVyYXRvciA9IHByb2R1Y3RJZEdlbmVyYXRvcjsKKwkJdGhpcy5wcm9kdWN0U2VyaWFsaXplciA9IHByb2R1Y3RTZXJpYWxpemVyOworCQl0aGlzLnNvbHJDbGllbnQgPSBuZXcgU29sckNsaWVudChzb2xyVXJsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSwgUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQlMT0cuaW5mbygiQWRkaW5nIG1ldGFkYXRhIGZvciBwcm9kdWN0OiIrcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKwkJCisJCS8vIHNlcmlhbGl6ZSBtZXRhZGFkdGEgdG8gU29sciBkb2N1bWVudChzKQorCSAgLy8gcmVwbGFjZT1mYWxzZSBpLmUuIGFkZCBtZXRhZGF0YSB0byBleGlzdGluZyB2YWx1ZXMKKwkJTGlzdDxTdHJpbmc+IGRvY3MgPSBwcm9kdWN0U2VyaWFsaXplci5zZXJpYWxpemUocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSwgbWV0YWRhdGEsIGZhbHNlKTsgCisJCQkJCisJCS8vIHNlbmQgZG9jdW1lbnRzIHRvIFNvbHIgc2VydmVyCisJCXNvbHJDbGllbnQuaW5kZXgoZG9jcywgdHJ1ZSwgcHJvZHVjdFNlcmlhbGl6ZXIuZ2V0TWltZVR5cGUoKSk7CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB3aWxsIHJlbW92ZSB0aGUgc3BlY2lmaWVkIGtleXMgYW5kIHZhbHVlcyBmcm9tIHRoZSBwcm9kdWN0IG1ldGFkYXRhLAorCSAqIGxlYXZpbmcgYWxsIG90aGVyIG1ldGFkYXRhIGtleXMgYW5kIHZhbHVlcyB1bmNoYW5nZWQuCisJICogTm90ZTogQUxMIG9jY3VycmVuY2VzIG9mIGVhY2ggc3BlY2lmaWVkIChrZXksIHZhbHVlKSBwYWlyIHdpbGwgYmUgcmVtb3ZlZCwgbm90IGp1c3QgdGhlIGZpcnN0LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZU1ldGFkYXRhKE1ldGFkYXRhIG1ldGFkYXRhLCBQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCS8vIHJldHJpZXZlIGZ1bGwgZXhpc3RpbmcgbWV0YWRhdGEKKwkJTWV0YWRhdGEgY3VycmVudE1ldGFkYXRhID0gZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisJCQorCQkvLyBtZXRhZGF0YSB0byBiZSB1cGRhdGVkCisJCU1ldGFkYXRhIHVwZGF0ZU1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisJCQorCQkvLyBsb29wIG92ZXIga2V5cyBvZiBtZXRhZGF0YSBiZSB1cGRhdGVkCisJCWZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEtleXMoKSkgeworCQkJCisJCQkvLyBsaXN0IG9mIHZhbHVlcyByZW1haW5pbmcgYWZ0ZXIgcmVtb3ZhbAorCQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJaWYgKGN1cnJlbnRNZXRhZGF0YS5jb250YWluc0tleShrZXkpKSB7CisJCQkJZm9yIChTdHJpbmcgdmFsdWUgOiBjdXJyZW50TWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSkgeworCQkJCQlpZiAoIW1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSkuY29udGFpbnModmFsdWUpKSB7CisJCQkJCQl2YWx1ZXMuYWRkKHZhbHVlKTsKKwkJCQkJfQkJCQkJCisJCQkJfQorCisJCQkJLy8gYWRkIHJlbWFpbmluZyB2YWx1ZXMgdG8gdXBkYXRlZCBtZXRhZGF0YQorCQkJCWlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7CisJCQkJCS8vIHNwZWNpYWwgdmFsdWUgYmVjYXVzZSBNZXRhZGF0YSB3aWxsIE5PVCBzdG9yZSBhbiBlbXB0eSBsaXN0CisJCQkJCXZhbHVlcy5hZGQoUGFyYW1ldGVycy5OVUxMKTsKKwkJCQl9IAorCQkJCXVwZGF0ZU1ldGFkYXRhLmFkZE1ldGFkYXRhKGtleSwgdmFsdWVzKTsKKwkJCQkKKwkJCX0KKwkJfQorCQkKKwkJLy8gZ2VuZXJhdGUgU29sciB1cGRhdGUgZG9jdW1lbnRzCisJCS8vIHJlcGxhY2U9dHJ1ZSB0byBvdmVycmlkZSBleGlzdGluZyB2YWx1ZXMKKwkJTGlzdDxTdHJpbmc+IGRvY3MgPSBwcm9kdWN0U2VyaWFsaXplci5zZXJpYWxpemUocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSwgdXBkYXRlTWV0YWRhdGEsIHRydWUpOworCQkJCQorCQkvLyBzZW5kIGRvY3VtZW50cyB0byBTb2xyIHNlcnZlcgorCQlzb2xyQ2xpZW50LmluZGV4KGRvY3MsIHRydWUsIHByb2R1Y3RTZXJpYWxpemVyLmdldE1pbWVUeXBlKCkpOworCisJfQorCisJLyoqCisJICogTWV0aG9kIHRoYXQgYWRkcyBhIFByb2R1Y3QgdG8gdGhlIENhdGFsb2csCisJICogcGVyc2lzdGluZyBpdHMgZnVuZGFtZW50YWwgQ0FTIGF0dHJpYnV0ZXMgKGlkLCBuYW1lLCB0eXBlLCBpbmdlc3Rpb24gdGltZSwgZXRjLikuCisJICogVGhpcyBtZXRob2QgYXNzaWducyB0aGUgcHJvZHVjdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBpZiBub3QgZXhpc3RpbmcgYWxyZWFkeS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkKKwkJTE9HLmluZm8oIkFkZGluZyBwcm9kdWN0OiIrcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKwkJCisJCS8vIGdlbmVyYXRlIHByb2R1Y3QgaWRlbnRpZmllciBpZiBub3QgZXhpc3RpbmcgYWxyZWFkeQorCQlpZiAoIVN0cmluZ1V0aWxzLmhhc1RleHQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSkpIHsKKwkJCVN0cmluZyBwcm9kdWN0SWQgPSB0aGlzLnByb2R1Y3RJZEdlbmVyYXRvci5nZW5lcmF0ZUlkKHByb2R1Y3QpOworCQkJcHJvZHVjdC5zZXRQcm9kdWN0SWQocHJvZHVjdElkKTsKKwkJfQorCQkKKwkJLy8gc2VyaWFsaXplIHByb2R1Y3QgZm9yIGluZ2VzdGlvbiBpbnRvIFNvbHIKKwkJTGlzdDxTdHJpbmc+IGRvY3MgPSBwcm9kdWN0U2VyaWFsaXplci5zZXJpYWxpemUocHJvZHVjdCwgdHJ1ZSk7IC8vIGNyZWF0ZT10cnVlCisJCQkJCisJCS8vIHNlbmQgcmVjb3JkcyB0byBTb2xyCisJCXNvbHJDbGllbnQuaW5kZXgoZG9jcywgdHJ1ZSwgcHJvZHVjdFNlcmlhbGl6ZXIuZ2V0TWltZVR5cGUoKSk7CisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1vZGlmeVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQlMT0cuaW5mbygiTW9kaWZ5aW5nIHByb2R1Y3Q6Iitwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkpOworCQkKKwkJLy8gc2VyaWFsaXplIHRoZSB1cGRhdGUgcHJvZHVjdCBpbmZvcm1hdGlvbiB0byBTb2xyIGRvY3VtZW50KHMpCisJCUxpc3Q8U3RyaW5nPiBkb2NzID0gcHJvZHVjdFNlcmlhbGl6ZXIuc2VyaWFsaXplKHByb2R1Y3QsIGZhbHNlKTsgLy8gY3JlYXRlPWZhbHNlCisJCQkJCisJCS8vIHNlbmQgcmVjb3JkcyB0byBTb2xyCisJCXNvbHJDbGllbnQuaW5kZXgoZG9jcywgdHJ1ZSwgcHJvZHVjdFNlcmlhbGl6ZXIuZ2V0TWltZVR5cGUoKSk7CisJCQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVtb3ZlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCQkKKwkJLy8gc2VuZCBtZXNzYWdlIHRvIFNvbHIgc2VydmVyCisJCXNvbHJDbGllbnQuZGVsZXRlKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksIHRydWUpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkKKwkJdGhpcy5tb2RpZnlQcm9kdWN0KHByb2R1Y3QpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkUHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQkJCisJCS8vIGdlbmVyYXRlIHVwZGF0ZSBkb2N1bWVudHMgKHdpdGggcmVwbGFjZT10cnVlKQorCQlMaXN0PFN0cmluZz4gZG9jcyA9IHByb2R1Y3RTZXJpYWxpemVyLnNlcmlhbGl6ZShwcm9kdWN0LmdldFByb2R1Y3RJZCgpLCBwcm9kdWN0LmdldFJvb3RSZWYoKSwgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLCB0cnVlKTsgCisJCQorCQkvLyBzZW5kIGRvY3VtZW50cyB0byBTb2xyIHNlcnZlcgorCQlzb2xyQ2xpZW50LmluZGV4KGRvY3MsIHRydWUsIHByb2R1Y3RTZXJpYWxpemVyLmdldE1pbWVUeXBlKCkpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkJCQorCQkJQ29tcGxldGVQcm9kdWN0IGNwID0gZ2V0Q29tcGxldGVQcm9kdWN0QnlJZChwcm9kdWN0SWQpOworCQkJcmV0dXJuIGNwLmdldFByb2R1Y3QoKTsKKwkJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCUNvbXBsZXRlUHJvZHVjdCBjcCA9IGdldENvbXBsZXRlUHJvZHVjdEJ5TmFtZShwcm9kdWN0TmFtZSk7CQorCQlpZiAoY3AhPW51bGwpIHsKKwkJICAgIExPRy5pbmZvKCJGb3VuZCBwcm9kdWN0IG5hbWU9Iitwcm9kdWN0TmFtZSsiIGlkPSIrY3AuZ2V0UHJvZHVjdCgpLmdldFByb2R1Y3RJZCgpKTsKKwkJICAgIHJldHVybiBjcC5nZXRQcm9kdWN0KCk7CisJCX0gZWxzZSB7CisJCSAgICBMT0cuaW5mbygiUHJvZHVjdCB3aXRoIG5hbWU9Iitwcm9kdWN0TmFtZSsiIG5vdCBmb3VuZCIpOworCQkgICAgcmV0dXJuIG51bGw7CisJCX0KKwkJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVmZXJlbmNlPiBnZXRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCUNvbXBsZXRlUHJvZHVjdCBjcCA9IGdldENvbXBsZXRlUHJvZHVjdEJ5SWQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisJCXJldHVybiBjcC5nZXRQcm9kdWN0KCkuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKTsKKwkJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQkJCisJCS8vIGJ1aWxkIHF1ZXJ5IHBhcmFtZXRlcnMKKwkJTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7CisJCXBhcmFtcy5wdXQoInEiLCBuZXcgU3RyaW5nW10geyAiKjoqIiB9ICk7CisJCS8vcGFyYW1zLnB1dCgicm93cyIsIG5ldyBTdHJpbmdbXSB7ICIyMCIgfSApOyAvLyBjb250cm9sIHBhZ2luYXRpb24gPworCQkKKwkJLy8gcXVlcnkgU29sciBmb3IgYWxsIG1hdGNoaW5nIHByb2R1Y3RzCisJCXJldHVybiBnZXRQcm9kdWN0cyhwYXJhbXMsIDAsIC0xKS5nZXRQcm9kdWN0cygpOyAvLyBnZXQgQUxMIHByb2R1Y3RzCisJCQorCX0KKwkKKwkvKioKKwkgKiBDb21tb24gdXRpbGl0eSB0byByZXRyaWV2ZSBhIHJhbmdlIG9mIHByb2R1Y3RzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQge0BsaW5rIFF1ZXJ5fSBhbmQge0BsaW5rIFByb2R1Y3RUeXBlfS4KKwkgKiBUaGlzIG1ldGhvZCB0cmFuc2Zvcm1zIHRoZSBnaXZlbiBjb25zdHJhaW50cyBpbiBhIG1hcCBvZiBIVFRQIChuYW1lLCB2YWx1ZSkgcGFpcnMgYW5kIGRlbGVnYXRlcyB0byB0aGUgZm9sbG93aW5nIG1ldGhvZC4KKwkgKiAKKwkgKiBAcGFyYW0gcXVlcnkKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBvZmZzZXQKKwkgKiBAcGFyYW0gbGltaXQKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBRdWVyeVJlc3BvbnNlIGdldFByb2R1Y3RzKFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCS8vIGJ1aWxkIEhUVFAgcmVxdWVzdAorCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7CisJCS8vIHByb2R1Y3QgdHlwZSBjb25zdHJhaW50CisJCXBhcmFtcy5wdXQoInEiLCBuZXcgU3RyaW5nW117UGFyYW1ldGVycy5QUk9EVUNUX1RZUEVfTkFNRSsiOiIrdHlwZS5nZXROYW1lKCl9ICk7CisgICAgLy8gY29udmVydCBmaWxlbWdyIHF1ZXJ5IGludG8gYSBTb2xyIHF1ZXJ5CisJCUxpc3Q8U3RyaW5nPiBxYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIGZvciAoUXVlcnlDcml0ZXJpYSBxdWVyeUNyaXRlcmlhIDogcXVlcnkuZ2V0Q3JpdGVyaWEoKSkgeworICAgIAkJTE9HLmluZm8oIlF1ZXJ5IGNyaXRlcmlhPSIrcXVlcnlDcml0ZXJpYS50b1N0cmluZygpKTsKKyAgICAJCXFjLmFkZChxdWVyeUNyaXRlcmlhLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICBwYXJhbXMucHV0KCJmcSIsIHFjLnRvQXJyYXkoIG5ldyBTdHJpbmdbIHFjLnNpemUoKSBdICkpOworICAgIC8vIHNvcnQKKyAgICBwYXJhbXMucHV0KCJzb3J0IiwgbmV3IFN0cmluZ1tdeyBQYXJhbWV0ZXJzLlBST0RVQ1RfUkVDRUlWRURfVElNRSsiIGRlc2MifSApOworCisgICAgcmV0dXJuIHRoaXMuZ2V0UHJvZHVjdHMocGFyYW1zLCBvZmZzZXQsIGxpbWl0KTsKKwkJCisJfQorCQorCS8qKgorCSAqIENvbW1vbiB1dGlsaXR5IHRvIHJldHJpZXZlIGEgcmFuZ2Ugb2YgcHJvZHVjdHMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbWV0ZXJzCisJICogQHBhcmFtIHBhcmFtcyA6IEhUVFAgcXVlcnkgcGFyYW1ldGVycyB1c2VkIGZvciBxdWVyeSB0byBTb2xyCisJICogQHBhcmFtIG9mZnNldCA6IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmVzdWx0LCBzdGFydGluZyBhdCAwCisJICogQHBhcmFtIGxpbWl0IDogdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHVybmVkIHJlc3VsdHMgKHVzZSAtMSB0byByZXR1cm4gQUxMIHJlc3VsdHMpCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgUXVlcnlSZXNwb25zZSBnZXRQcm9kdWN0cyhNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1zLCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCS8vIGNvbWJpbmVkIHJlc3VsdHMgZnJvbSBwYWdpbmF0aW9uCisJCVF1ZXJ5UmVzcG9uc2UgcXVlcnlSZXNwb25zZSA9IG5ldyBRdWVyeVJlc3BvbnNlKCk7CisJCXF1ZXJ5UmVzcG9uc2Uuc2V0U3RhcnQob2Zmc2V0KTsKKwkJaW50IHN0YXJ0ID0gb2Zmc2V0OworCQl3aGlsZSAocXVlcnlSZXNwb25zZS5nZXRDb21wbGV0ZVByb2R1Y3RzKCkuc2l6ZSgpPGxpbWl0IHx8IGxpbWl0PDApIHsKKwkJCQorCQkJcGFyYW1zLnB1dCgic3RhcnQiLCBuZXcgU3RyaW5nW10geyAiIitzdGFydCB9ICk7CisJCQlTdHJpbmcgcmVzcG9uc2UgPSBzb2xyQ2xpZW50LnF1ZXJ5KHBhcmFtcywgcHJvZHVjdFNlcmlhbGl6ZXIuZ2V0TWltZVR5cGUoKSk7CisJCQlRdWVyeVJlc3BvbnNlIHFyID0gcHJvZHVjdFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzcG9uc2UpOworCQkJCisJCQlmb3IgKENvbXBsZXRlUHJvZHVjdCBjcCA6IHFyLmdldENvbXBsZXRlUHJvZHVjdHMoKSkgeworCQkJCWlmIChxdWVyeVJlc3BvbnNlLmdldENvbXBsZXRlUHJvZHVjdHMoKS5zaXplKCk8bGltaXQpIHsKKwkJCQkJcXVlcnlSZXNwb25zZS5nZXRDb21wbGV0ZVByb2R1Y3RzKCkuYWRkKCBjcCApOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcXVlcnlSZXNwb25zZS5zZXROdW1Gb3VuZCggcXIuZ2V0TnVtRm91bmQoKSApOworCQkJc3RhcnQgPSBvZmZzZXQrcXVlcnlSZXNwb25zZS5nZXRDb21wbGV0ZVByb2R1Y3RzKCkuc2l6ZSgpOworCQkJaWYgKGxpbWl0PDApIGxpbWl0ID0gcXVlcnlSZXNwb25zZS5nZXROdW1Gb3VuZCgpOyAvLyByZXRyaWV2ZSBBTEwgcmVzdWx0cworCQkJaWYgKHN0YXJ0Pj1xdWVyeVJlc3BvbnNlLmdldE51bUZvdW5kKCkpIGJyZWFrOyAvLyBkb24ndCBxdWVyeSBhbnkgbG9uZ2VyCisJCQkKKwkJfQorCQkKKwkJTE9HLmluZm8oIlRvdGFsIG51bWJlciBvZiBwcm9kdWN0cyBmb3VuZD0iK3F1ZXJ5UmVzcG9uc2UuZ2V0TnVtRm91bmQoKSk7CisJCUxPRy5pbmZvKCJUb3RhbCBudW1iZXIgb2YgcHJvZHVjdHMgcmV0dXJuZWQ9IitxdWVyeVJlc3BvbnNlLmdldENvbXBsZXRlUHJvZHVjdHMoKS5zaXplKCkpOworCQlyZXR1cm4gcXVlcnlSZXNwb25zZTsKKwkJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKworCQkvLyBidWlsZCBxdWVyeSBwYXJhbWV0ZXJzCisJCU1hcDxTdHJpbmcsIFN0cmluZ1tdPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZ1tdPigpOworCQlwYXJhbXMucHV0KCJxIiwgbmV3IFN0cmluZ1tdIHsgIio6KiIgfSApOworCQkvLyB1c2UgdGhlIHByb2R1Y3QgdHlwZSBuYW1lIGFzIHF1ZXJ5IHBhcmFtZXRlcgorCQlwYXJhbXMucHV0KCJmcSIsIG5ldyBTdHJpbmdbXSB7IFBhcmFtZXRlcnMuUFJPRFVDVF9UWVBFX05BTUUrIjoiK3R5cGUuZ2V0TmFtZSgpIH0gKTsKKwkJCisJCS8vIHF1ZXJ5IFNvbHIgZm9yIGFsbCBtYXRjaGluZyBwcm9kdWN0cworCQlyZXR1cm4gZ2V0UHJvZHVjdHMocGFyYW1zLCAwLCAtMSkuZ2V0UHJvZHVjdHMoKTsgLy8gZ2V0IEFMTCBwcm9kdWN0cworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1ldGFkYXRhIGdldE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkKKwkJQ29tcGxldGVQcm9kdWN0IGNwID0gZ2V0Q29tcGxldGVQcm9kdWN0QnlJZChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKwkJcmV0dXJuIGNwLmdldE1ldGFkYXRhKCk7CisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNZXRhZGF0YSBnZXRSZWR1Y2VkTWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0LCBMaXN0PFN0cmluZz4gZWxlbWVudHMpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCS8vIGJ1aWxkIEhUVFAgcmVxdWVzdAorCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7CisJCXBhcmFtcy5wdXQoInEiLCBuZXcgU3RyaW5nW117UGFyYW1ldGVycy5QUk9EVUNUX0lEKyI6Iitwcm9kdWN0LmdldFByb2R1Y3RJZCgpfSApOworCQkvLyByZXF1ZXN0IG1ldGFkYXRhIGVsZW1lbnRzIGV4cGxpY2l0bHkKKwkJcGFyYW1zLnB1dCgiZmwiLCBlbGVtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbZWxlbWVudHMuc2l6ZSgpXSkgKTsKKwkJCisJCS8vIGV4ZWN1dGUgcmVxdWVzdAorCQlTdHJpbmcgZG9jID0gc29sckNsaWVudC5xdWVyeShwYXJhbXMsIHByb2R1Y3RTZXJpYWxpemVyLmdldE1pbWVUeXBlKCkpOworCQkKKwkJLy8gcGFyc2UgcmVzcG9uc2UKKwkJQ29tcGxldGVQcm9kdWN0IGNwID0gZXh0cmFjdENvbXBsZXRlUHJvZHVjdChkb2MpOworCQlyZXR1cm4gY3AuZ2V0TWV0YWRhdGEoKTsKKwkJCisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB3aWxsIHJldHVybiBBTEwgcHJvZHVjdHMgaW4gdGhlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlIHF1ZXJ5IGNyaXRlcmlhLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFN0cmluZz4gcXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisgICAgLy8gZXhlY3V0ZSByZXF1ZXN0IGZvciBBTEwgcmVzdWx0cworICAgIFF1ZXJ5UmVzcG9uc2UgcXVlcnlSZXNwb25zZSA9ICB0aGlzLmdldFByb2R1Y3RzKHF1ZXJ5LCB0eXBlLCAwLCAtMSk7IC8vIGdldCBBTEwgcHJvZHVjdHMgCisKKwkJLy8gZXh0cmFjdCBpZHMgZnJvbSBwcm9kdWN0cworCQlMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoQ29tcGxldGVQcm9kdWN0IGNwIDogcXVlcnlSZXNwb25zZS5nZXRDb21wbGV0ZVByb2R1Y3RzKCkpIHsKKwkJCWlkcy5hZGQoY3AuZ2V0UHJvZHVjdCgpLmdldFByb2R1Y3RJZCgpKTsKKwkJfQorCQkKKwkJcmV0dXJuIGlkczsKKwkJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0VG9wTlByb2R1Y3RzKGludCBuKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CQkKKwkJCQkKKwkJLy8gcmV0cmlldmUgbW9zdCByZWNlbnQgbiBwcm9kdWN0cyBmcm9tIFNvbHIKKwkJU3RyaW5nIGRvYyA9IHNvbHJDbGllbnQucXVlcnlQcm9kdWN0c0J5RGF0ZShuLCBwcm9kdWN0U2VyaWFsaXplci5nZXRNaW1lVHlwZSgpKTsKKwkJCisJCS8vIHBhcnNlIFNvbHIgcmVzcG9uc2UgaW50byBQcm9kdWN0IG9iamVjdHMKKwkJcmV0dXJuIHRoaXMuZ2V0UHJvZHVjdHNGcm9tRG9jdW1lbnQoZG9jKTsKKwkJCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQcm9kdWN0UGFnZSBwYWdlZFF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlLCBpbnQgcGFnZU51bSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkJCQorCQkKKyAgICAvLyBleGVjdXRlIHJlcXVlc3QgZm9yIG9uZSBwYWdlIG9mIHJlc3VsdHMKKyAgICBpbnQgb2Zmc2V0ID0gKHBhZ2VOdW0tMSkqUGFyYW1ldGVycy5QQUdFX1NJWkU7CisgICAgaW50IGxpbWl0ID0gUGFyYW1ldGVycy5QQUdFX1NJWkU7CisgICAgUXVlcnlSZXNwb25zZSBxdWVyeVJlc3BvbnNlID0gdGhpcy5nZXRQcm9kdWN0cyhxdWVyeSwgdHlwZSwgb2Zmc2V0LCBsaW1pdCk7CisKKyAgICAvLyBidWlsZCBwcm9kdWN0IHBhZ2UgZnJvbSBxdWVyeSByZXNwb25zZQorICAgIHJldHVybiBuZXdQcm9kdWN0UGFnZShwYWdlTnVtLCBxdWVyeVJlc3BvbnNlKTsKKwkJCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQcm9kdWN0UGFnZSBnZXRGaXJzdFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMucGFnZWRRdWVyeShuZXcgUXVlcnkoKSwgdHlwZSwgMSk7CisJCQkKKwkJfSBjYXRjaChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBQcm9kdWN0UGFnZSBnZXRMYXN0UHJvZHVjdFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSkgeworCQkKKwkJdHJ5IHsKKwkJCQorCQkJLy8gcXVlcnkgZm9yIHRvdGFsIG51bWJlciBvZiBwcm9kdWN0cyBvZiB0aGlzIHR5cGUKKwkJCWludCBudW1Ub3RhbFJlc3VsdHMgPSB0aGlzLmdldE51bVByb2R1Y3RzKHR5cGUpOworCQkJCisJCQkvLyBjb21wdXRlIGxhc3QgcGFnZSBudW1iZXIKKwkJCWludCBudW1PZlBhZ2VzID0gUGFnaW5hdGlvblV0aWxzLmdldFRvdGFsUGFnZShudW1Ub3RhbFJlc3VsdHMsIFBhcmFtZXRlcnMuUEFHRV9TSVpFKTsKKwkJCQorCQkJLy8gcmVxdWVzdCBsYXN0IHBhZ2UKKwkJCXJldHVybiBwYWdlZFF1ZXJ5KG5ldyBRdWVyeSgpLCB0eXBlLCBudW1PZlBhZ2VzKTsKKwkJCisJCX0gY2F0Y2goQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFByb2R1Y3RQYWdlIGdldE5leHRQYWdlKFByb2R1Y3RUeXBlIHR5cGUsIFByb2R1Y3RQYWdlIGN1cnJlbnRQYWdlKSB7CisJCQorCQlpbnQgbmV4dFBhZ2VOdW1iZXIgPSBjdXJyZW50UGFnZS5nZXRQYWdlTnVtKCkrMTsKKwkJaWYgKG5leHRQYWdlTnVtYmVyPmN1cnJlbnRQYWdlLmdldFRvdGFsUGFnZXMoKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgbmV4dCBwYWdlIG51bWJlcjogIituZXh0UGFnZU51bWJlcik7CisKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLnBhZ2VkUXVlcnkobmV3IFF1ZXJ5KCksIHR5cGUsIGN1cnJlbnRQYWdlLmdldFBhZ2VOdW0oKSsxKTsKKwkJCQorCQl9IGNhdGNoKENhdGFsb2dFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBQcm9kdWN0UGFnZSBnZXRQcmV2UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworCQkKKwkJaW50IHByZXZQYWdlTnVtYmVyID0gY3VycmVudFBhZ2UuZ2V0UGFnZU51bSgpLTE7CisJCWlmIChwcmV2UGFnZU51bWJlcjw9MCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJldmlvdXMgcGFnZSBudW1iZXI6ICIrcHJldlBhZ2VOdW1iZXIpOworCQkKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLnBhZ2VkUXVlcnkobmV3IFF1ZXJ5KCksIHR5cGUsIHByZXZQYWdlTnVtYmVyKTsKKwkJCQorCQl9IGNhdGNoKENhdGFsb2dFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisJCQorCX0KKwkKKwkvKioKKwkgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgZXh0cmFjdGluZyBwcm9kdWN0cyBmcm9tIGEgU29sciByZXNwb25zZSBkb2N1bWVudC4KKwkgKiBAcGFyYW0gZG9jCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0c0Zyb21Eb2N1bWVudChTdHJpbmcgZG9jKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQkvLyBleHRyYWN0IGZ1bGwgcHJvZHVjdCBpbmZvcm1hdGlvbiBmcm9tIFNvbHIgcmVzcG9uc2UKKwkJUXVlcnlSZXNwb25zZSBxdWVyeVJlc3BvbnNlID0gcHJvZHVjdFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZG9jKTsKKwkJCisJCS8vIHJldHVybiBwcm9kdWN0cyBvbmx5CisJCXJldHVybiBxdWVyeVJlc3BvbnNlLmdldFByb2R1Y3RzKCk7CisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFRvcE5Qcm9kdWN0cyhpbnQgbiwgUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkKKwkJLy8gcmV0cmlldmUgbW9zdCByZWNlbnQgbiBwcm9kdWN0cyBmcm9tIFNvbHIKKwkJU3RyaW5nIGRvYyA9IHNvbHJDbGllbnQucXVlcnlQcm9kdWN0c0J5RGF0ZUFuZFR5cGUobiwgdHlwZSwgcHJvZHVjdFNlcmlhbGl6ZXIuZ2V0TWltZVR5cGUoKSk7CisJCQorCQkvLyBwYXJzZSBTb2xyIHJlc3BvbnNlIGludG8gUHJvZHVjdCBvYmplY3RzCisJCXJldHVybiB0aGlzLmdldFByb2R1Y3RzRnJvbURvY3VtZW50KGRvYyk7CisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBWYWxpZGF0aW9uTGF5ZXIgZ2V0VmFsaWRhdGlvbkxheWVyKCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkvLyBGSVhNRTogbXVzdCBwYXJzZSBTb2xyIHNjaGVtYS54bW5sIGZyb206CisJCS8vIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zb2xyL2FkbWluL2ZpbGUvP2NvbnRlbnRUeXBlPXRleHQveG1sO2NoYXJzZXQ9dXRmLTgmZmlsZT1zY2hlbWEueG1sCisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNZXRob2QgJ2dldFZhbGlkYXRpb25MYXllcicgbm90IHlldCBpbXBsZW1lbnRlZCIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkKKwkJLy8gYnVpbGQgcXVlcnkgcGFyYW1ldGVycworCQlNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKKwkJcGFyYW1zLnB1dCgicSIsIG5ldyBTdHJpbmdbXSB7ICIqOioiIH0gKTsKKwkJcGFyYW1zLnB1dCgicm93cyIsIG5ldyBTdHJpbmdbXSB7ICIwIiB9ICk7IC8vIGRvbid0IHJldHVybiBhbnkgcmVzdWx0cworCQkKKwkJLy8gZXhlY3V0ZSBxdWVyeQorCQlTdHJpbmcgcmVzcG9uc2UgPSBzb2xyQ2xpZW50LnF1ZXJ5KHBhcmFtcywgcHJvZHVjdFNlcmlhbGl6ZXIuZ2V0TWltZVR5cGUoKSk7CisJCQorCQkvLyBwYXJzZSByZXNwb25zZQorCQlRdWVyeVJlc3BvbnNlIHF1ZXJ5UmVzcG9uc2UgPSBwcm9kdWN0U2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNwb25zZSk7CisJCXJldHVybiBxdWVyeVJlc3BvbnNlLmdldE51bUZvdW5kKCk7CisJCQorCX0KKwkKKwlwcml2YXRlIENvbXBsZXRlUHJvZHVjdCBnZXRDb21wbGV0ZVByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCQkJCQkKKwkJLy8gcmVxdWVzdCBkb2N1bWVudCB3aXRoIGdpdmVuIGlkCisJCVN0cmluZyBkb2MgPSBzb2xyQ2xpZW50LnF1ZXJ5UHJvZHVjdEJ5SWQocHJvZHVjdElkLCBwcm9kdWN0U2VyaWFsaXplci5nZXRNaW1lVHlwZSgpKTsKKwkJCisJCS8vIHBhcnNlIGRvY3VtZW50IGludG8gY29tcGxldGUgcHJvZHVjdAorCQlyZXR1cm4gZXh0cmFjdENvbXBsZXRlUHJvZHVjdChkb2MpOworCQkKKwl9CisJCisJcHJpdmF0ZSBDb21wbGV0ZVByb2R1Y3QgZ2V0Q29tcGxldGVQcm9kdWN0QnlOYW1lKFN0cmluZyBwcm9kdWN0TmFtZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24gewkKKwkJCisJCS8vIHJlcXVlc3QgZG9jdW1lbnQgd2l0aCBnaXZlbiBpZAorCQlTdHJpbmcgZG9jID0gc29sckNsaWVudC5xdWVyeVByb2R1Y3RCeU5hbWUocHJvZHVjdE5hbWUsIHByb2R1Y3RTZXJpYWxpemVyLmdldE1pbWVUeXBlKCkpOworCQkKKwkJLy8gcGFyc2UgZG9jdW1lbnQgaW50byBjb21wbGV0ZSBwcm9kdWN0CisJCXJldHVybiBleHRyYWN0Q29tcGxldGVQcm9kdWN0KGRvYyk7CisJCQorCX0KKwkKKwlwcml2YXRlIENvbXBsZXRlUHJvZHVjdCBleHRyYWN0Q29tcGxldGVQcm9kdWN0KFN0cmluZyBkb2MpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCS8vIGRlc2VyaWFsaXplIGRvY3VtZW50IGludG8gUHJvZHVjdAorCQlMT0cuaW5mbygiUGFyc2luZyBTb2xyIGRvY3VtZW50OiAiK2RvYyk7CisJCVF1ZXJ5UmVzcG9uc2UgcXVlcnlSZXNwb25zZSA9IHByb2R1Y3RTZXJpYWxpemVyLmRlc2VyaWFsaXplKGRvYyk7CisJCWludCBudW1Gb3VuZCA9IHF1ZXJ5UmVzcG9uc2UuZ2V0TnVtRm91bmQoKTsKKwkJaWYgKG51bUZvdW5kPjEpIHsKKwkJCXRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJQcm9kdWN0IHF1ZXJ5IHJldHVybmVkICIrbnVtRm91bmQrIiByZXN1bHRzIGluc3RlYWQgb2YgMSEiKTsKKwkJfSBlbHNlIGlmIChudW1Gb3VuZD09MCkgeworCQkJcmV0dXJuIG51bGw7IC8vIG5vIHByb2R1Y3QgZm91bmQKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBxdWVyeVJlc3BvbnNlLmdldENvbXBsZXRlUHJvZHVjdHMoKS5nZXQoMCk7CisJCX0KKwkJCQorCX0KKworCS8qKgorCSAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHtAbGluayBQcm9kdWN0UGFnZX0gZnJvbSBhIHtAbGluayBRdWVyeVJlc3BvbnNlfS4KKwkgKiBAcGFyYW0gcGFnZU51bWJlcgorCSAqIEBwYXJhbSBxdWVyeVJlc3BvbnNlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgUHJvZHVjdFBhZ2UgbmV3UHJvZHVjdFBhZ2UoaW50IHBhZ2VOdW0sIFF1ZXJ5UmVzcG9uc2UgcXVlcnlSZXNwb25zZSkgeworCQkKKwkJUHJvZHVjdFBhZ2UgcGFnZSA9IG5ldyBQcm9kdWN0UGFnZSgpOworCQlwYWdlLnNldFBhZ2VOdW0ocGFnZU51bSk7CisJCXBhZ2Uuc2V0UGFnZVNpemUocXVlcnlSZXNwb25zZS5nZXRQcm9kdWN0cygpLnNpemUoKSk7CisJCXBhZ2Uuc2V0TnVtT2ZIaXRzKHF1ZXJ5UmVzcG9uc2UuZ2V0TnVtRm91bmQoKSk7CisJCXBhZ2Uuc2V0UGFnZVByb2R1Y3RzKHF1ZXJ5UmVzcG9uc2UuZ2V0UHJvZHVjdHMoKSk7CisJCXBhZ2Uuc2V0VG90YWxQYWdlcyhQYWdpbmF0aW9uVXRpbHMuZ2V0VG90YWxQYWdlKHF1ZXJ5UmVzcG9uc2UuZ2V0TnVtRm91bmQoKSwgUGFyYW1ldGVycy5QQUdFX1NJWkUpKTsKKwkJcmV0dXJuIHBhZ2U7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Tb2xyQ2F0YWxvZ0ZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvU29sckNhdGFsb2dGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhZWFiZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL3NvbHIvU29sckNhdGFsb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHI7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyB0aGF0IGNyZWF0ZXMgYSB7QGxpbmsgU29sckNhdGFsb2d9IGluc3RhbmNlCisgKiBjb25maWd1cmVkIHdpdGggdGhlIHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIGZpbGVtZ3IucHJvcGVydGllcy4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKgorICovCitwdWJsaWMgY2xhc3MgU29sckNhdGFsb2dGYWN0b3J5IGltcGxlbWVudHMgQ2F0YWxvZ0ZhY3RvcnkgeworCQorCXByaXZhdGUgU3RyaW5nIHNvbHJVcmw7CisJcHJpdmF0ZSBQcm9kdWN0SWRHZW5lcmF0b3IgcHJvZHVjdElkR2VuZXJhdG9yOworCXByaXZhdGUgUHJvZHVjdFNlcmlhbGl6ZXIgcHJvZHVjdFNlcmlhbGl6ZXI7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoU29sckNhdGFsb2dGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHVibGljIFNvbHJDYXRhbG9nRmFjdG9yeSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCQkKKwkJLy8gYmFzZSBTb2xyIFVSTAorCQlTdHJpbmcgc29sclVybCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci51cmwiKTsKKwkJaWYgKHNvbHJVcmw9PW51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgU29sciBVUkwgc3BlY2lmaWVkIGZyb20gcHJvcGVydHkgJ29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIudXJsJyIpOworCQl9CisJCQorCQl0aGlzLnNvbHJVcmwgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyggc29sclVybCApOworCQl0aGlzLmNvbmZpZ3VyZSgpOworCQkKKwl9CisJCisJLyoqCisJICogTWV0aG9kIHRvIGNvbmZpZ3VyZSB0aGUgc3BlY2lmaWMgZmxhdm9yIG9mIHRoZSBTb2xyIGNhdGFsb2cgaW1wbGVtZW50YXRpb24KKwkgKiBiZWZvcmUgdGhlIGNhdGFsb2cgaXMgaW5zdGFudGlhdGVkLgorCSAqLworCXByaXZhdGUgdm9pZCBjb25maWd1cmUoKSB7CisJCQorCQkvLyBwcm9kdWN0IHNlcmlhbGl6ZXIKKwkJU3RyaW5nIHByb2R1Y3RTZXJpYWxpemVyQ2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdFNlcmlhbGl6ZXIiKTsKKwkJaWYgKHByb2R1Y3RTZXJpYWxpemVyQ2xhc3MhPW51bGwpIHsKKwkJCXRyeSB7CisJCQkJcHJvZHVjdFNlcmlhbGl6ZXIgPSAoUHJvZHVjdFNlcmlhbGl6ZXIpQ2xhc3MuZm9yTmFtZSggUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMocHJvZHVjdFNlcmlhbGl6ZXJDbGFzcykgKS5uZXdJbnN0YW5jZSgpOworCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCUxPRy5zZXZlcmUoZS5nZXRNZXNzYWdlKCkpOworCQkJCVN5c3RlbS5leGl0KC0xKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByb2R1Y3RTZXJpYWxpemVyID0gbmV3IERlZmF1bHRQcm9kdWN0U2VyaWFsaXplcigpOworCQl9CisJCQorCQkvLyBwcm9kdWN0IGlkIGdlbmVyYXRvcgorCQlTdHJpbmcgcHJvZHVjdElkR2VuZXJhdG9yQ2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdElkR2VuZXJhdG9yIik7CisJCWlmIChwcm9kdWN0SWRHZW5lcmF0b3JDbGFzcyE9bnVsbCkgeworCQkJdHJ5IHsKKwkJCQlwcm9kdWN0SWRHZW5lcmF0b3IgPSAoUHJvZHVjdElkR2VuZXJhdG9yKUNsYXNzLmZvck5hbWUoIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHByb2R1Y3RJZEdlbmVyYXRvckNsYXNzKSApLm5ld0luc3RhbmNlKCk7CisJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJTE9HLnNldmVyZShlLmdldE1lc3NhZ2UoKSk7CisJCQkJU3lzdGVtLmV4aXQoLTEpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJvZHVjdElkR2VuZXJhdG9yID0gbmV3IFVVSURQcm9kdWN0SWRHZW5lcmF0b3IoKTsKKwkJfQorCQkKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2F0YWxvZyBjcmVhdGVDYXRhbG9nKCkgeworCQlMT0cuaW5mbygiQ3JlYXRpbmcgU29sciBDYXRhbG9nIGZvciBVUkw9Iit0aGlzLnNvbHJVcmwpOworCQlyZXR1cm4gbmV3IFNvbHJDYXRhbG9nKHNvbHJVcmwsIHByb2R1Y3RJZEdlbmVyYXRvciwgcHJvZHVjdFNlcmlhbGl6ZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Tb2xyQ2xpZW50LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1NvbHJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE5NmM2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9Tb2xyQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zb2xyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuTmFtZVZhbHVlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkdldE1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5TdHJpbmdSZXF1ZXN0RW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBDbGFzcyBjb250YWluaW5nIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkgZm9yIGludGVyYWN0aW5nIHdpdGggYSBTb2xyIHNlcnZlci4KKyAqIFRoaXMgY2xhc3MgdXNlcyBhbiB7QGxpbmsgSHR0cENsaWVudH0gZm9yIGFsbCBIVFRQIGNvbW11bmljYXRpb24uCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIFNvbHJDbGllbnQgeworCQkKKwkvLyBiYXNlIFVSTCBvZiBTb2xyIHNlcnZlcgorCXByaXZhdGUgU3RyaW5nIHNvbHJVcmw7CisJCisJcHJpdmF0ZSBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgU29sciBVUkwKKwkgKiBAcGFyYW0gdXJsCisJICovCisJcHVibGljIFNvbHJDbGllbnQoZmluYWwgU3RyaW5nIHVybCkgeworCQkKKwkJc29sclVybCA9IHVybDsKKwkJCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBzZW5kIG9uZSBvciBtb3JlIGRvY3VtZW50cyB0byBiZSBpbmRleGVkIHRvIFNvbHIuCisJICogCisJICogQHBhcmFtIGRvY3VtZW50CisJICogQHBhcmFtIGNvbW1pdAorCSAqIEBwYXJhbSBtaW1lVHlwZSA6IHRoZSBtaW1lLXR5cGUgZm9ybWF0IG9mIHRoZSBkb2N1bWVudHMKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGluZGV4KExpc3Q8U3RyaW5nPiBkb2NzLCBib29sZWFuIGNvbW1pdCwgU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQl0cnkgeworCQkJCisJCQlmaW5hbCBTdHJpbmcgdXJsID0gdGhpcy5idWlsZFVwZGF0ZVVybCgpOworCQkJCisJCQkvLyBidWlsZCBtZXNzYWdlCisJCQlTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigiPGFkZD4iKTsKKwkJCWZvciAoU3RyaW5nIGRvYyA6IGRvY3MpIHsKKwkJCQltZXNzYWdlLmFwcGVuZChkb2MpOworCQkJfQorCQkJbWVzc2FnZS5hcHBlbmQoIjwvYWRkPiIpOwkKKwkgICAgCisJICAgIC8vIHNlbmQgUE9TVCByZXF1ZXN0CisJICAgIExPRy5pbmZvKCJQb3N0aW5nIG1lc3NhZ2U6IittZXNzYWdlKyIgdG8gVVJMOiIrdXJsKTsKKwkgICAgU3RyaW5nIHJlc3BvbnNlID0gZG9Qb3N0KHVybCwgbWVzc2FnZS50b1N0cmluZygpLCBtaW1lVHlwZSk7CisJICAgIExPRy5pbmZvKHJlc3BvbnNlKTsKKwkgICAgCisJICAgIC8vIGNvbW1pdCBjaGFuZ2VzID8KKwkgICAgaWYgKGNvbW1pdCkgdGhpcy5jb21taXQoKTsKKwkgICAgCisJICAgIExPRy5pbmZvKHJlc3BvbnNlKTsKKwkgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIAorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisgICAgCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBzZW5kIGEgbWVzc2FnZSBjb250YWluaW5nIGEgJ2RlbGV0ZScgaW5zdHJ1Y3Rpb24gdG8gU29sci4KKwkgKiBAcGFyYW0gaWQKKwkgKiBAcGFyYW0gY29tbWl0CisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmluZyBkZWxldGUoU3RyaW5nIGlkLCBib29sZWFuIGNvbW1pdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworCQkKKwkJdHJ5IHsKKwkJCQorCQkJLy8gYnVpbGQgUE9TVCByZXF1ZXN0CisJCQlTdHJpbmcgdXJsID0gdGhpcy5idWlsZFVwZGF0ZVVybCgpOworCQkJaWYgKGNvbW1pdCkgdXJsICs9ICI/Y29tbWl0PXRydWUiOworCQkJU3RyaW5nIG1lc3NhZ2UgPSAiPGRlbGV0ZT48cXVlcnk+aWQ6IitpZCsiPC9xdWVyeT48L2RlbGV0ZT4iOworCQkJCisJICAgIC8vIHNlbmQgUE9TVCByZXF1ZXN0CisJICAgIExPRy5pbmZvKCJQb3N0aW5nIG1lc3NhZ2U6IittZXNzYWdlKyIgdG8gVVJMOiIrdXJsKTsKKwkgICAgU3RyaW5nIHJlc3BvbnNlID0gZG9Qb3N0KHVybCwgbWVzc2FnZSwgUGFyYW1ldGVycy5NSU1FX1RZUEVfWE1MKTsKKworCSAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgCisJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBxdWVyeSB0aGUgU29sciBpbmRleCBmb3IgYSBwcm9kdWN0IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KKwkgKiBAcGFyYW0gaWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBxdWVyeVByb2R1Y3RCeUlkKFN0cmluZyBpZCwgU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7CisJCXBhcmFtcy5wdXQoInEiLCBuZXcgU3RyaW5nW117UGFyYW1ldGVycy5QUk9EVUNUX0lEKyI6IitpZH0gKTsKKwkJcmV0dXJuIHF1ZXJ5KHBhcmFtcywgbWltZVR5cGUpOworCQkKKwl9CisJCisJLyoqCisJICogTWV0aG9kIHRvIHF1ZXJ5IHRoZSBTb2xyIGluZGV4IGZvciBhIHByb2R1Y3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogQHBhcmFtIGlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgcXVlcnlQcm9kdWN0QnlOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgbWltZVR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKKwkJcGFyYW1zLnB1dCgicSIsIG5ldyBTdHJpbmdbXXtQYXJhbWV0ZXJzLlBST0RVQ1RfTkFNRSsiOiIrbmFtZX0gKTsKKwkJcmV0dXJuIHF1ZXJ5KHBhcmFtcywgbWltZVR5cGUpOworCQkKKwl9CisJCisJLyoqCisJICogTWV0aG9kIHRvIHF1ZXJ5IFNvbHIgZm9yIHRoZSBtb3N0IHJlY2VudCAnbicgcHJvZHVjdHMuCisJICogQHBhcmFtIG4KKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmluZyBxdWVyeVByb2R1Y3RzQnlEYXRlKGludCBuLCBTdHJpbmcgbWltZVR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkJCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKKwkJcGFyYW1zLnB1dCgicSIsIG5ldyBTdHJpbmdbXXsgIio6KiJ9ICk7CisJCXBhcmFtcy5wdXQoInJvd3MiLCBuZXcgU3RyaW5nW117ICIiK259ICk7CisJCXBhcmFtcy5wdXQoInNvcnQiLCBuZXcgU3RyaW5nW117IFBhcmFtZXRlcnMuUFJPRFVDVF9SRUNFSVZFRF9USU1FKyIgZGVzYyJ9ICk7CisJCXJldHVybiBxdWVyeShwYXJhbXMsIG1pbWVUeXBlKTsKKwkJCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBxdWVyeSBTb2xyIGZvciB0aGUgbW9zdCByZWNlbnQgJ24nIHByb2R1Y3RzIG9mIGEgc3BlY2lmaWVkIHR5cGUuCisJICogQHBhcmFtIG4KKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDYXRhbG9nRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmluZyBxdWVyeVByb2R1Y3RzQnlEYXRlQW5kVHlwZShpbnQgbiwgUHJvZHVjdFR5cGUgdHlwZSwgU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7CisJCXBhcmFtcy5wdXQoInEiLCBuZXcgU3RyaW5nW117IFBhcmFtZXRlcnMuUFJPRFVDVF9UWVBFX05BTUUrdHlwZS5nZXROYW1lKCkgfSApOworCQlwYXJhbXMucHV0KCJyb3dzIiwgbmV3IFN0cmluZ1tdeyAiIitufSApOworCQlwYXJhbXMucHV0KCJzb3J0IiwgbmV3IFN0cmluZ1tdeyBQYXJhbWV0ZXJzLlBST0RVQ1RfUkVDRUlWRURfVElNRSsiIGRlc2MifSApOworCQlyZXR1cm4gcXVlcnkocGFyYW1zLCBtaW1lVHlwZSk7CisJCQorCX0KKwkKKwkvKioKKwkgKiBNZXRob2QgdG8gY29tbWl0IHRoZSBjdXJyZW50IGNoYW5nZXMgdG8gdGhlIFNvbHIgaW5kZXguCisJICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCVN0cmluZyBtZXNzYWdlID0gIjxjb21taXQgd2FpdFNlYXJjaGVyPVwidHJ1ZVwiLz4iOworCQlTdHJpbmcgdXJsID0gIHRoaXMuYnVpbGRVcGRhdGVVcmwoKTsKKwkJZG9Qb3N0KHVybCwgbWVzc2FnZSwgUGFyYW1ldGVycy5NSU1FX1RZUEVfWE1MKTsKKwkJCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBzZW5kIGEgZ2VuZXJpYyBxdWVyeSB0byB0aGUgU29sciBzZXJ2ZXIuCisJICogCisJICogQHBhcmFtIHBhcmFtZXRlcnMKKwkgKiBAcGFyYW0gbWltZVR5cGUgOiB0aGUgZGVzaXJlZCBtaW1lIHR5cGUgZm9yIHRoZSByZXN1bHRzIChYTUwsIEpTT04sIC4uLikKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBxdWVyeShNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1ldGVycywgU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisJCQorCQl0cnkgeworCQkJCisJCQkvLyBidWlsZCBIVFRQIHJlcXVlc3QKKwkJCVN0cmluZyB1cmwgPSB0aGlzLmJ1aWxkU2VsZWN0VXJsKCk7CisJCQkKKwkJCS8vIGV4ZWN1dGUgcmVxdWVzdAorCQkJU3RyaW5nIHJlc3BvbnNlID0gdGhpcy5kb0dldCh1cmwsIHBhcmFtZXRlcnMsIG1pbWVUeXBlKTsKKwkJCXJldHVybiByZXNwb25zZTsKKwkJCisJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJCisJfQorCQkKKwkvKioKKwkgKiBNZXRob2QgdG8gZXhlY3V0ZSBhIEdFVCByZXF1ZXN0IHRvIHRoZSBnaXZlbiBVUkwgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKwkgKiBAcGFyYW0gdXJsCisJICogQHBhcmFtIHBhcmFtZXRlcnMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZG9HZXQoU3RyaW5nIHVybCwgTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtZXRlcnMsIFN0cmluZyBtaW1lVHlwZSkgIHRocm93cyBFeGNlcHRpb24geworCQkJCSAgICAKKwkJLy8gYnVpbGQgSFRUUC9HRVQgcmVxdWVzdAorICAgIEdldE1ldGhvZCBtZXRob2QgPSBuZXcgR2V0TWV0aG9kKHVybCk7CisgICAgTGlzdDxOYW1lVmFsdWVQYWlyPiBudnBzID0gbmV3IEFycmF5TGlzdDxOYW1lVmFsdWVQYWlyPigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IHBhcmFtZXRlcnMua2V5U2V0KCkpIHsKKyAgICAJZm9yIChTdHJpbmcgdmFsdWUgOiBwYXJhbWV0ZXJzLmdldChrZXkpKSB7CisgICAgCQludnBzLmFkZChuZXcgTmFtZVZhbHVlUGFpcihrZXksIHZhbHVlKSk7CisgICAgCX0KKyAgICB9CisgICAgLy8gcmVxdWVzdCByZXN1bHRzIGluIEpTT04gZm9ybWF0CisgICAgaWYgKG1pbWVUeXBlLmVxdWFscyhQYXJhbWV0ZXJzLk1JTUVfVFlQRV9KU09OKSkgbnZwcy5hZGQobmV3IE5hbWVWYWx1ZVBhaXIoInd0IiwgImpzb24iKSk7CisgICAgbWV0aG9kLnNldFF1ZXJ5U3RyaW5nKCBudnBzLnRvQXJyYXkoIG5ldyBOYW1lVmFsdWVQYWlyW252cHMuc2l6ZSgpXSApICk7CisgICAgTE9HLmluZm8oIkdFVCB1cmw6ICIrdXJsKyIgcXVlcnkgc3RyaW5nOiAiK21ldGhvZC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAKKyAgICAvLyBzZW5kIEhUVFAvR0VUIHJlcXVlc3QsIHJldHVybiByZXNwb25zZQorICAgIHJldHVybiBkb0h0dHAobWV0aG9kKTsKKyAgICAKKyAgfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBleGVjdXRlIGEgUE9TVCByZXF1ZXN0IHRvIHRoZSBnaXZlbiBVUkwuCisJICogQHBhcmFtIHVybAorCSAqIEBwYXJhbSBkb2N1bWVudAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBkb1Bvc3QoU3RyaW5nIHVybCwgU3RyaW5nIGRvY3VtZW50LCBTdHJpbmcgbWltZVR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgIAorCQkvLyBidWlsZCBIVFRQL1BPU1QgcmVxdWVzdAorICAgIFBvc3RNZXRob2QgbWV0aG9kID0gbmV3IFBvc3RNZXRob2QodXJsKTsKKyAgICBTdHJpbmdSZXF1ZXN0RW50aXR5IHJlcXVlc3RFbnRpdHkgPSBuZXcgU3RyaW5nUmVxdWVzdEVudGl0eShkb2N1bWVudCwgbWltZVR5cGUsICJVVEYtOCIpOworICAgIG1ldGhvZC5zZXRSZXF1ZXN0RW50aXR5KHJlcXVlc3RFbnRpdHkpOworICAgIAorICAgIC8vIHNlbmQgSFRUUC9QT1NUIHJlcXVlc3QsIHJldHVybiByZXNwb25zZQorICAgIHJldHVybiBkb0h0dHAobWV0aG9kKTsKKwkJCisJfQorCQorCS8qKgorCSAqIENvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBIVFRQIEdFVCBhbmQgUE9TVCByZXF1ZXN0cy4KKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZG9IdHRwKEh0dHBNZXRob2QgbWV0aG9kKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCVN0cmluZ0J1aWxkZXIgcmVzcG9uc2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7CisJCXRyeSB7CisJCQkKKwkgICAgLy8gc2VuZCByZXF1ZXN0CisJICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CisgICAgICAgICAgICAvLyBPT0RULTcxOSBQcmV2ZW50IGh0dHBjbGllbnQgZnJvbSBzcGF3bmluZyBjbG9zZXdhaXQgdGNwIGNvbm5lY3Rpb25zCisgICAgICAgICAgICBtZXRob2Quc2V0UmVxdWVzdEhlYWRlcigiQ29ubmVjdGlvbiIsICJjbG9zZSIpOworCisJICAgIGludCBzdGF0dXNDb2RlID0gaHR0cENsaWVudC5leGVjdXRlTWV0aG9kKG1ldGhvZCk7CSAgICAKKwkgICAgCisJICAgIC8vIHJlYWQgcmVzcG9uc2UKKwkgICAgaWYgKHN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5TQ19PSykgeworCSAgICAJCisJICAgIAkvLyBzdGlsbCBjb25zdW1lIHRoZSByZXNwb25zZQorCSAgICAJbWV0aG9kLmdldFJlc3BvbnNlQm9keUFzU3RyaW5nKCk7CisJICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oIkhUVFAgbWV0aG9kIGZhaWxlZDogIiArIG1ldGhvZC5nZXRTdGF0dXNMaW5lKCkpOworCSAgICAgIAorCSAgICB9IGVsc2UgeworCQorCQkgICAgLy8gcmVhZCB0aGUgcmVzcG9uc2UgYm9keS4KKwkJICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihtZXRob2QuZ2V0UmVzcG9uc2VCb2R5QXNTdHJlYW0oKSkpOworICAgICAgICBTdHJpbmcgcmVhZExpbmU7CisgICAgICAgIHdoaWxlKCgocmVhZExpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSkgeworICAgICAgICAgIHJlc3BvbnNlLmFwcGVuZChyZWFkTGluZSk7CisgICAgICAgIH0KKwkgICAgCisJICAgIH0KKwkgIAkKKwkgIH0gZmluYWxseSB7CisJICAgIC8vIG11c3QgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBldmVuIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZAorCSAgICBtZXRob2QucmVsZWFzZUNvbm5lY3Rpb24oKTsKKwkgICAgaWYgKGJyIT1udWxsKSB0cnkgeyBici5jbG9zZSgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwkgIH0gIAorICAKKwkgIHJldHVybiByZXNwb25zZS50b1N0cmluZygpOworICAKKwl9CisJCisJLyoqCisJICogQnVpbGRzIHRoZSBVUkwgdXNlZCB0byB1cGRhdGUgdGhlIFNvbHIgaW5kZXguCisJICogCisJICogRXhhbXBsZTogaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvdXBkYXRlPworCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBidWlsZFVwZGF0ZVVybCgpIHsKKwkJCisJCXJldHVybiBzb2xyVXJsICsgKHNvbHJVcmwuZW5kc1dpdGgoIi8iKSA/ICIiIDogIi8iKSArICJ1cGRhdGUiOworCQkKKwl9CisJCisJLyoqCisJICogQnVpbGRzIHRoZSBVUkwgdXNlZCB0byBxdWVyeSB0aGUgU29sciBpbmRleC4KKwkgKiAKKwkgKiBFeGFtcGxlOiBodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9zZWxlY3Q/CisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2VsZWN0VXJsKCkgeworCQkKKwkJcmV0dXJuIHNvbHJVcmwgKyAoc29sclVybC5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyIpICsgInNlbGVjdCI7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9VVUlEUHJvZHVjdElkR2VuZXJhdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9zb2xyL1VVSURQcm9kdWN0SWRHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM0ODhkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvc29sci9VVUlEUHJvZHVjdElkR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByb2R1Y3RJZEdlbmVyYXRvcn0gdGhhdCBhc3NpZ25zIHRoZSBwcm9kdWN0CisgKiBpZGVudGlmaWVyIGFzIGEgbmV3bHkgZ2VuZXJhdGVkIFVVSUQuCisgKiBOb3RlIHRoYXQgdGhpcyBnZW5lcmF0b3Igd2lsbCBjYXVzZSBtdWx0aXBsZSBzdWJtaXNzaW9ucyBvZiB0aGUgc2FtZSBuYW1lZCBwcm9kdWN0CisgKiB0byByZXN1bHQgaW4gYXMgbWFueSByZWNvcmRzIGluIHRoZSBTb2xyIGluZGV4LgorICogCisgKiBAYXV0aG9yIEx1Y2EgQ2lucXVpbmkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVVUlEUHJvZHVjdElkR2VuZXJhdG9yIGltcGxlbWVudHMgUHJvZHVjdElkR2VuZXJhdG9yIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJZChQcm9kdWN0IHByb2R1Y3QpIHsKKwkJcmV0dXJuIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9BYnN0cmFjdERlbGV0ZVByb2R1Y3RDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0Fic3RyYWN0RGVsZXRlUHJvZHVjdENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZTRiZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9BYnN0cmFjdERlbGV0ZVByb2R1Y3RDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEgYWJzdHJhY3Qge0BsaW5rIENtZExpbmVBY3Rpb259IGZvciBkZWxldGluZyB7QGxpbmsgUHJvZHVjdH1zLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGVsZXRlUHJvZHVjdENsaUFjdGlvbiBleHRlbmRzCisgICAgICBGaWxlTWFuYWdlckNsaUFjdGlvbiB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgUHJvZHVjdCBwID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgIHAgPSBnZXRQcm9kdWN0VG9EZWxldGUoKTsKKyAgICAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZzID0gY2xpZW50LmdldFByb2R1Y3RSZWZlcmVuY2VzKHApOworICAgICAgICAgaWYgKHJlZnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBSZWZlcmVuY2VzIik7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKFJlZmVyZW5jZSByZWYgOiByZWZzKSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudC5yZW1vdmVGaWxlKG5ldyBGaWxlKG5ldyBVUkkocmVmLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSkKKyAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBkZWxldGUgZmlsZSAnIgorICAgICAgICAgICAgICAgICAgICAgKyByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkgKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgaWYgKGNsaWVudC5yZW1vdmVQcm9kdWN0KHApKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlN1Y2Nlc3NmdWxseSBkZWxldGVkIHByb2R1Y3QgJyIKKyAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIiciKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJEZWxldGUgcHJvZHVjdCByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlIHByb2R1Y3QgJyIgKyBwCisgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIGFic3RyYWN0IFByb2R1Y3QgZ2V0UHJvZHVjdFRvRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0Fic3RyYWN0R2V0UHJvZHVjdENsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vQWJzdHJhY3RHZXRQcm9kdWN0Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2NmQ3OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0Fic3RyYWN0R2V0UHJvZHVjdENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEge0BsaW5rIFByb2R1Y3R9CisgKiBieSBJRC4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R2V0UHJvZHVjdENsaUFjdGlvbiBleHRlbmRzIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBQcm9kdWN0IHAgPSBnZXRQcm9kdWN0KCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb2R1Y3Q6Iik7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIiAtIElEOiAiICsgcC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIiAtIE5hbWU6ICIgKyBwLmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCIgLSBQcm9kdWN0VHlwZTogIiArIHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCIgLSBTdHJ1Y3R1cmU6ICIgKyBwLmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIiAtIFN0YXR1czogIiArIHAuZ2V0VHJhbnNmZXJTdGF0dXMoKSk7CisgICAgICAgICBpZiAocC5nZXRSb290UmVmKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIgLSBSb290UmVmOiAiICsgcC5nZXRSb290UmVmKCkuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgICAgICAgfQorICAgICAgICAgaWYgKCFwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiAtIFJlZmVyZW5jZXM6ICIpOworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2UgcmVmIDogcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKSB7CisgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiAgICAtICIgKyByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIHJlZi5nZXRGaWxlU2l6ZSgpICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBwcm9kdWN0IGluZm8gOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIGFic3RyYWN0IFByb2R1Y3QgZ2V0UHJvZHVjdCgpIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9BYnN0cmFjdFF1ZXJ5Q2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9BYnN0cmFjdFF1ZXJ5Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxNWE0NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0Fic3RyYWN0UXVlcnlDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5Db21wbGV4UXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuY29udi5WZXJzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvcjsKKworLyoqCisgKiBBYnN0cmFjdCBxdWVyeSB7QGxpbmsgQ21kTGluZUFjdGlvbn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFF1ZXJ5Q2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBzb3J0Qnk7CisgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGb3JtYXQ7CisgICBwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXI7CisKKyAgIHByaXZhdGUgRmlsdGVyQWxnb3IgZmlsdGVyQWxnb3I7CisgICBwcml2YXRlIFN0cmluZyBzdGFydERhdGVUaW1lTWV0S2V5OworICAgcHJpdmF0ZSBTdHJpbmcgZW5kRGF0ZVRpbWVNZXRLZXk7CisgICBwcml2YXRlIFN0cmluZyBwcmlvcml0eU1ldEtleTsKKyAgIHByaXZhdGUgVmVyc2lvbkNvbnZlcnRlciB2ZXJzaW9uQ29udmVydGVyOworCisgICBwdWJsaWMgQWJzdHJhY3RRdWVyeUNsaUFjdGlvbigpIHsKKyAgICAgIGRlbGltaXRlciA9ICJcbiI7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkgPSBnZXRRdWVyeSgpOworICAgICAgICAgY29tcGxleFF1ZXJ5LnNldFNvcnRCeU1ldEtleShzb3J0QnkpOworICAgICAgICAgY29tcGxleFF1ZXJ5LnNldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CisKKyAgICAgICAgIGlmIChmaWx0ZXJBbGdvciAhPSBudWxsKSB7CisgICAgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHN0YXJ0RGF0ZVRpbWVNZXRLZXksCisgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IHN0YXJ0RGF0ZVRpbWVNZXRLZXkiKTsKKyAgICAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwoZW5kRGF0ZVRpbWVNZXRLZXksCisgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGVuZERhdGVUaW1lTWV0S2V5Iik7CisgICAgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByaW9yaXR5TWV0S2V5LCAiTXVzdCBzcGVjaWZ5IHByaW9yaXR5TWV0S2V5Iik7CisgICAgICAgICAgICBRdWVyeUZpbHRlciBmaWx0ZXIgPSBuZXcgUXVlcnlGaWx0ZXIoc3RhcnREYXRlVGltZU1ldEtleSwKKyAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lTWV0S2V5LCBwcmlvcml0eU1ldEtleSwgZmlsdGVyQWxnb3IpOworICAgICAgICAgICAgaWYgKHZlcnNpb25Db252ZXJ0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgZmlsdGVyLnNldENvbnZlcnRlcih2ZXJzaW9uQ29udmVydGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBsZXhRdWVyeS5zZXRRdWVyeUZpbHRlcihmaWx0ZXIpOworICAgICAgICAgfQorICAgICAgICAgTGlzdDxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IGdldENsaWVudCgpLmNvbXBsZXhRdWVyeShjb21wbGV4UXVlcnkpOworICAgICAgICAgU3RyaW5nQnVmZmVyIHJldHVyblN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIHJldHVyblN0cmluZy5hcHBlbmQocXIudG9TdHJpbmcoKSArIGRlbGltaXRlcik7CisgICAgICAgICB9CisgICAgICAgICBpZiAocmV0dXJuU3RyaW5nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKHJldHVyblN0cmluZy5zdWJzdHJpbmcoMCwgcmV0dXJuU3RyaW5nLmxlbmd0aCgpCisgICAgICAgICAgICAgICAtIGRlbGltaXRlci5sZW5ndGgoKSkpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0cyIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGVyZm9ybSBzcWwgcXVlcnkgOiAiCisgICAgICAgICAgICAgICArICJzb3J0QnkgJyIKKyAgICAgICAgICAgICAgICsgc29ydEJ5CisgICAgICAgICAgICAgICArICInLCAiCisgICAgICAgICAgICAgICArICJvdXRwdXRGb3JtYXQgJyIKKyAgICAgICAgICAgICAgICsgb3V0cHV0Rm9ybWF0CisgICAgICAgICAgICAgICArICInLCBhbmQgZGVsaW1pdGVyICciCisgICAgICAgICAgICAgICArIGRlbGltaXRlcgorICAgICAgICAgICAgICAgKyAiJywgZmlsdGVyQWxnb3IgJyIKKyAgICAgICAgICAgICAgICsgKGZpbHRlckFsZ29yICE9IG51bGwgPyBmaWx0ZXJBbGdvci5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsTmFtZSgpIDogbnVsbCkKKyAgICAgICAgICAgICAgICsgIicsIHN0YXJ0RGF0ZVRpbWVNZXRLZXkgJyIKKyAgICAgICAgICAgICAgICsgc3RhcnREYXRlVGltZU1ldEtleQorICAgICAgICAgICAgICAgKyAiJywgZW5kRGF0ZVRpbWVNZXRLZXkgJyIKKyAgICAgICAgICAgICAgICsgZW5kRGF0ZVRpbWVNZXRLZXkKKyAgICAgICAgICAgICAgICsgIicsIHByaW9yaXR5TWV0S2V5ICciCisgICAgICAgICAgICAgICArIHByaW9yaXR5TWV0S2V5CisgICAgICAgICAgICAgICArICInLCAiCisgICAgICAgICAgICAgICArICh2ZXJzaW9uQ29udmVydGVyICE9IG51bGwgPyB2ZXJzaW9uQ29udmVydGVyLmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxOYW1lKCkgOiBudWxsKSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGFic3RyYWN0IENvbXBsZXhRdWVyeSBnZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb247CisKKyAgIHB1YmxpYyB2b2lkIHNldFNvcnRCeShTdHJpbmcgc29ydEJ5KSB7CisgICAgICB0aGlzLnNvcnRCeSA9IHNvcnRCeTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0T3V0cHV0Rm9ybWF0KFN0cmluZyBvdXRwdXRGb3JtYXQpIHsKKyAgICAgIHRoaXMub3V0cHV0Rm9ybWF0ID0gb3V0cHV0Rm9ybWF0OworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgeworICAgICAgdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEZpbHRlckFsZ29yKEZpbHRlckFsZ29yIGZpbHRlckFsZ29yKSB7CisgICAgICB0aGlzLmZpbHRlckFsZ29yID0gZmlsdGVyQWxnb3I7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZVRpbWVNZXRLZXkoU3RyaW5nIHN0YXJ0RGF0ZVRpbWVNZXRLZXkpIHsKKyAgICAgIHRoaXMuc3RhcnREYXRlVGltZU1ldEtleSA9IHN0YXJ0RGF0ZVRpbWVNZXRLZXk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEVuZERhdGVUaW1lTWV0S2V5KFN0cmluZyBlbmREYXRlVGltZU1ldEtleSkgeworICAgICAgdGhpcy5lbmREYXRlVGltZU1ldEtleSA9IGVuZERhdGVUaW1lTWV0S2V5OworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcmlvcml0eU1ldEtleShTdHJpbmcgcHJpb3JpdHlNZXRLZXkpIHsKKyAgICAgIHRoaXMucHJpb3JpdHlNZXRLZXkgPSBwcmlvcml0eU1ldEtleTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbkNvbnZlcnRlcihWZXJzaW9uQ29udmVydGVyIHZlcnNpb25Db252ZXJ0ZXIpIHsKKyAgICAgIHRoaXMudmVyc2lvbkNvbnZlcnRlciA9IHZlcnNpb25Db252ZXJ0ZXI7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9BZGRQcm9kdWN0VHlwZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vQWRkUHJvZHVjdFR5cGVDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzAwZWFjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vQWRkUHJvZHVjdFR5cGVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBhZGRzIGEge0BsaW5rIFByb2R1Y3RUeXBlfSB0byB0aGUgZmlsZSBtYW5hZ2VyLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqIEBhdXRob3Igcml2ZXJtYSAoUmlzaGkgVmVybWEpCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRQcm9kdWN0VHlwZUNsaUFjdGlvbiBleHRlbmRzIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdFR5cGVJZDsKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZTsKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RUeXBlRGVzY3JpcHRpb247CisgICBwcml2YXRlIFN0cmluZyBmaWxlUmVwb3NpdG9yeVBhdGg7CisgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uZXI7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFR5cGVJZCwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0VHlwZUlkIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3RUeXBlTmFtZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0VHlwZU5hbWUiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFR5cGVEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgcHJvZHVjdFR5cGVEZXNjcmlwdGlvbiIpOworICAgICAgICAgVmFsaWRhdGUKKyAgICAgICAgICAgICAgIC5ub3ROdWxsKGZpbGVSZXBvc2l0b3J5UGF0aCwgIk11c3Qgc3BlY2lmeSBmaWxlUmVwb3NpdG9yeVBhdGgiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwodmVyc2lvbmVyLCAiTXVzdCBzcGVjaWZ5IHZlcnNpb25lciIpOworCisgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQocHJvZHVjdFR5cGVJZCk7CisgICAgICAgICB0eXBlLnNldE5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgIHR5cGUuc2V0RGVzY3JpcHRpb24ocHJvZHVjdFR5cGVEZXNjcmlwdGlvbik7CisgICAgICAgICB0eXBlLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aChmaWxlUmVwb3NpdG9yeVBhdGgpOworICAgICAgICAgdHlwZS5zZXRWZXJzaW9uZXIodmVyc2lvbmVyKTsKKworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJhZGRQcm9kdWN0VHlwZTogUmVzdWx0OiAiCisgICAgICAgICAgICAgICArIGdldENsaWVudCgpLmFkZFByb2R1Y3RUeXBlKHR5cGUpKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGFkZCBwcm9kdWN0IHR5cGUgd2l0aCAiCisgICAgICAgICAgICAgICArICJpZCAnIiArIHByb2R1Y3RUeXBlSWQgKyAiJywgbmFtZSAnIiArIHByb2R1Y3RUeXBlTmFtZSArICInLCBkZXNjcmlwdGlvbiAnIgorICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZURlc2NyaXB0aW9uICsgIicsIHJlcG9zaXRvcnkgJyIKKyAgICAgICAgICAgICAgICsgZmlsZVJlcG9zaXRvcnlQYXRoICsgIiwgYW5kIHZlcnNpb25lciAnIiArIHZlcnNpb25lciArICInIDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RUeXBlSWQoU3RyaW5nIHByb2R1Y3RUeXBlSWQpIHsKKyAgICAgIHRoaXMucHJvZHVjdFR5cGVJZCA9IHByb2R1Y3RUeXBlSWQ7CisgICB9CisJCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZU5hbWUoU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgICAgdGhpcy5wcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0VHlwZU5hbWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RUeXBlRGVzY3JpcHRpb24oU3RyaW5nIHByb2R1Y3RUeXBlRGVzY3JpcHRpb24pIHsKKyAgICAgIHRoaXMucHJvZHVjdFR5cGVEZXNjcmlwdGlvbiA9IHByb2R1Y3RUeXBlRGVzY3JpcHRpb247CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEZpbGVSZXBvc2l0b3J5UGF0aChTdHJpbmcgZmlsZVJlcG9zaXRvcnlQYXRoKSB7CisgICAgICB0aGlzLmZpbGVSZXBvc2l0b3J5UGF0aCA9IGZpbGVSZXBvc2l0b3J5UGF0aDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbmVyKFN0cmluZyB2ZXJzaW9uZXIpIHsKKyAgICAgIHRoaXMudmVyc2lvbmVyID0gdmVyc2lvbmVyOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0RlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhYjY0MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0RlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGRlbGV0ZXMgYSB7QGxpbmsgUHJvZHVjdH0gYnkgSUQuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdERlbGV0ZVByb2R1Y3RDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0SWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdFRvRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3RJZCwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0SWQiKTsKKworICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICBQcm9kdWN0IHAgPSBjbGllbnQuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKTsKKyAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgZm9yIHByb2R1Y3QgJyIKKyAgICAgICAgICAgICAgICsgcHJvZHVjdElkICsgIiciKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0SWQoU3RyaW5nIHByb2R1Y3RJZCkgeworICAgICAgdGhpcy5wcm9kdWN0SWQgPSBwcm9kdWN0SWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9EZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9EZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0ZDAyZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0RlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGRlbGV0ZXMgYSB7QGxpbmsgUHJvZHVjdH0gYnkgbmFtZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIGV4dGVuZHMKKyAgICAgIEFic3RyYWN0RGVsZXRlUHJvZHVjdENsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lOworCisgICBAT3ZlcnJpZGUKKyAgIHByb3RlY3RlZCBQcm9kdWN0IGdldFByb2R1Y3RUb0RlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgVmFsaWRhdGUubm90TnVsbChwcm9kdWN0TmFtZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0TmFtZSIpOworCisgICAgICBQcm9kdWN0IHAgPSBnZXRDbGllbnQoKS5nZXRQcm9kdWN0QnlOYW1lKHByb2R1Y3ROYW1lKTsKKyAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgZm9yIHByb2R1Y3QgJyIgKyBwcm9kdWN0TmFtZSArICInIik7CisgICAgICB9CisgICAgICByZXR1cm4gcDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdE5hbWUoU3RyaW5nIHByb2R1Y3ROYW1lKSB7CisgICAgICB0aGlzLnByb2R1Y3ROYW1lID0gcHJvZHVjdE5hbWU7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9EdW1wTWV0YWRhdGFDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0R1bXBNZXRhZGF0YUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjgzNWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9EdW1wTWV0YWRhdGFDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL09PRFQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzLkZJTEVOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXMuUFJPRFVDVF9OQU1FOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZHVtcHMgb3V0IG1ldGFkYXRhIGZvciBhIGdpdmVuIHtAbGluayBQcm9kdWN0fS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1wTWV0YWRhdGFDbGlBY3Rpb24gZXh0ZW5kcyBGaWxlTWFuYWdlckNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RJZDsKKyAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXI7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdElkLCAiTXVzdCBzcGVjaWZ5IHByb2R1Y3RJZCIpOworCisgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBnZXRDbGllbnQoKS5nZXRQcm9kdWN0QnlJZChwcm9kdWN0SWQpOworICAgICAgICAgaWYgKHByb2R1Y3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBwcm9kdWN0Iik7CisgICAgICAgICB9CisgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IGdldENsaWVudCgpLmdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgbWV0YWRhdGEiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChvdXRwdXREaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG91dHB1dERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGVYbWxGaWxlKAorICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG1ldGFkYXRhKS50b1hNTCgpLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpci5nZXRBYnNvbHV0ZUZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlRmlsZW5hbWUobWV0YWRhdGEpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiT3V0cHV0IGRpciAnIiArIG91dHB1dERpcgorICAgICAgICAgICAgICAgICAgICAgKyAiJyBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworCisgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjaGFyYWN0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGNoYXJhY3Rlcik7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKAorICAgICAgICAgICAgICAgICAgbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG1ldGFkYXRhKS50b1hNTCgpLAorICAgICAgICAgICAgICAgICAgb3MpOyAKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgcHJvZHVjdCAnIiArIHByb2R1Y3RJZCArICInIDogIgorICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICB0aGlzLnByb2R1Y3RJZCA9IHByb2R1Y3RJZDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyKEZpbGUgb3V0cHV0RGlyKSB7CisgICAgICB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKyAgIH0KKworICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVGaWxlbmFtZShNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbWV0YWRhdGEuZ2V0TWV0YWRhdGEoRklMRU5BTUUpICE9IG51bGwgPyBtZXRhZGF0YQorICAgICAgICAgICAgLmdldE1ldGFkYXRhKEZJTEVOQU1FKSA6IG1ldGFkYXRhLmdldE1ldGFkYXRhKFBST0RVQ1RfTkFNRSk7CisgICAgICByZXR1cm4gZmlsZW5hbWUgKyAiLm1ldCI7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9GaWxlTWFuYWdlckNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vRmlsZU1hbmFnZXJDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTFkNWFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vRmlsZU1hbmFnZXJDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQmFzZSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gZm9yIEZpbGUgTWFuYWdlci4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50OworCisgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51cmwiKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpCisgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoZ2V0VXJsKCksICJNdXN0IHNwZWNpZnkgdXJsIik7CisKKyAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZ2V0VXJsKCkpLCBmYWxzZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldENsaWVudChYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmJmYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgdGhlIGN1cnJlbnQge0BsaW5rIFByb2R1Y3R9IGZpbGUgdHJhbnNmZXIuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gZ2V0Q2xpZW50KCkuZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcigpOworICAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCB0cmFuc2ZlciBzdGF0dXMiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiRmlsZSBUcmFuc2ZlcjogW3JlZj17b3JpZz0iCisgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRGaWxlUmVmKCkuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIixkcz0iCisgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRGaWxlUmVmKCkuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkgKyAifSxwcm9kdWN0PSIKKyAgICAgICAgICAgICAgICsgc3RhdHVzLmdldFBhcmVudFByb2R1Y3QoKS5nZXRQcm9kdWN0TmFtZSgpICsgIixmaWxlU2l6ZT0iCisgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRGaWxlUmVmKCkuZ2V0RmlsZVNpemUoKSArICIsYW10VHJhbnNmZXJyZWQ9IgorICAgICAgICAgICAgICAgKyBzdGF0dXMuZ2V0Qnl0ZXNUcmFuc2ZlcnJlZCgpICsgIixwY3Q9IgorICAgICAgICAgICAgICAgKyBzdGF0dXMuY29tcHV0ZVBjdFRyYW5zZmVycmVkKCkgKyAiXSIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgY3VycmVudCBmaWxlIHRyYW5zZmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldEN1cnJlbnRUcmFuc2ZlcnNDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldEN1cnJlbnRUcmFuc2ZlcnNDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTFlZjdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgbGlzdCBvZiBjdXJyZW50IHtAbGluayBQcm9kdWN0fSBmaWxlCisgKiB0cmFuc2ZlcnMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiBleHRlbmRzIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgTGlzdDxGaWxlVHJhbnNmZXJTdGF0dXM+IHN0YXR1c2VzID0gZ2V0Q2xpZW50KCkKKyAgICAgICAgICAgICAgIC5nZXRDdXJyZW50RmlsZVRyYW5zZmVycygpOworICAgICAgICAgaWYgKHN0YXR1c2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICJGaWxlTWFuYWdlciByZXR1cm5lZCBudWxsIGZpbGUgdHJhbnNmZXJzIik7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXMgOiBzdGF0dXNlcykgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJGaWxlIFRyYW5zZmVyOiBbcmVmPXtvcmlnPSIKKyAgICAgICAgICAgICAgICAgICsgc3RhdHVzLmdldEZpbGVSZWYoKS5nZXRPcmlnUmVmZXJlbmNlKCkgKyAiLGRzPSIKKyAgICAgICAgICAgICAgICAgICsgc3RhdHVzLmdldEZpbGVSZWYoKS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICJ9LHByb2R1Y3Q9IgorICAgICAgICAgICAgICAgICAgKyBzdGF0dXMuZ2V0UGFyZW50UHJvZHVjdCgpLmdldFByb2R1Y3ROYW1lKCkgKyAiLGZpbGVTaXplPSIKKyAgICAgICAgICAgICAgICAgICsgc3RhdHVzLmdldEZpbGVSZWYoKS5nZXRGaWxlU2l6ZSgpICsgIixhbXRUcmFuc2ZlcnJlZD0iCisgICAgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRCeXRlc1RyYW5zZmVycmVkKCkgKyAiLHBjdD0iCisgICAgICAgICAgICAgICAgICArIHN0YXR1cy5jb21wdXRlUGN0VHJhbnNmZXJyZWQoKSArICJdIik7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBsaXN0IG9mIGN1cnJlbnQgZmlsZSB0cmFuc2ZlcnMgOiAiCisgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFlM2FjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0IHBlcmNlbnQgdHJhbnNmZXJyZWQgZm9yIGEgZ2l2ZW4gZGF0YSBmaWxlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gZXh0ZW5kcyBGaWxlTWFuYWdlckNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIG9yaWdSZWY7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwob3JpZ1JlZiwgIk11c3Qgc3BlY2lmeSBvcmlnUmVmIik7CisKKyAgICAgICAgIFJlZmVyZW5jZSByZWYgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgICAgICByZWYuc2V0T3JpZ1JlZmVyZW5jZShnZXRVcmkob3JpZ1JlZikudG9TdHJpbmcoKSk7CisKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUmVmZXJlbmNlOiBbb3JpZ1JlZj0iICsgb3JpZ1JlZiArICIsdHJhbnNmZXJQY3Q9IgorICAgICAgICAgICAgICAgKyBnZXRDbGllbnQoKS5nZXRSZWZQY3RUcmFuc2ZlcnJlZChyZWYpICsgIl0iKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHBlcmNlbnQgdHJhbnNmZXJlZCBmb3IiICsgIiBmaWxlICciICsgb3JpZ1JlZgorICAgICAgICAgICAgICAgICAgICAgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE9yaWdSZWYoU3RyaW5nIG9yaWdSZWYpIHsKKyAgICAgIHRoaXMub3JpZ1JlZiA9IG9yaWdSZWY7CisgICB9CisKKyAgIHByaXZhdGUgVVJJIGdldFVyaShTdHJpbmcgZmlsZVBhdGgpIHsKKyAgICAgIGlmIChuZXcgRmlsZShmaWxlUGF0aCkuZXhpc3RzKCkpIHsKKyAgICAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlUGF0aCkudG9VUkkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gVVJJLmNyZWF0ZShmaWxlUGF0aCk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRGaXJzdFBhZ2VDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldEZpcnN0UGFnZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWQyYzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRGaXJzdFBhZ2VDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0cyB0aGUgZmlyc3QgcGFnZSBvZiB7QGxpbmsgUHJvZHVjdH1zIG9mIGEKKyAqIGdpdmVuIHtAbGluayBQcm9kdWN0VHlwZX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZU5hbWU7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFR5cGVOYW1lLCAiTXVzdCBzcGVjaWZ5IHByb2R1Y3RUeXBlTmFtZSIpOworCisgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBjbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgUHJvZHVjdFR5cGUiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIFByb2R1Y3RQYWdlIGZpcnN0UGFnZSA9IGNsaWVudC5nZXRGaXJzdFBhZ2UodHlwZSk7CisgICAgICAgICBpZiAoZmlyc3RQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgcHJvZHVjdCBwYWdlIik7CisgICAgICAgICB9CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlBhZ2U6IFtudW09IiArIGZpcnN0UGFnZS5nZXRQYWdlTnVtKCkKKyAgICAgICAgICAgICAgICsgIiwgdG90YWxQYWdlcz0iICsgZmlyc3RQYWdlLmdldFRvdGFsUGFnZXMoKSArICIsIHBhZ2VTaXplPSIKKyAgICAgICAgICAgICAgICsgZmlyc3RQYWdlLmdldFBhZ2VTaXplKCkgKyAiXSIpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJQcm9kdWN0czoiKTsKKworICAgICAgICAgaWYgKGZpcnN0UGFnZS5nZXRQYWdlUHJvZHVjdHMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQYWdlIFByb2R1Y3RzIGlzIG51bGwiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGZvciAoUHJvZHVjdCBwIDogZmlyc3RQYWdlLmdldFBhZ2VQcm9kdWN0cygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb2R1Y3Q6IFtpZD0iICsgcC5nZXRQcm9kdWN0SWQoKSArICIsbmFtZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdE5hbWUoKSArICIsdHlwZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiLHN0cnVjdHVyZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpICsgIiwgdHJhbnNmZXJTdGF0dXM9IgorICAgICAgICAgICAgICAgICAgKyBwLmdldFRyYW5zZmVyU3RhdHVzKCkgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgZmlyc3QgcGFnZSBvZiBwcm9kdWN0cyBmb3IiCisgICAgICAgICAgICAgICAgICAgICArICIgUHJvZHVjdFR5cGUgbmFtZSAnIiArIHByb2R1Y3RUeXBlTmFtZSArICInIDogIgorICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RUeXBlTmFtZShTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKSB7CisgICAgICB0aGlzLnByb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3RUeXBlTmFtZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldExhc3RQYWdlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRMYXN0UGFnZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjZjNWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRMYXN0UGFnZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIHRoZSBsYXN0IHBhZ2Ugb2Yge0BsaW5rIFByb2R1Y3R9cyBvZiBhCisgKiBnaXZlbiB7QGxpbmsgUHJvZHVjdFR5cGV9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldExhc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZU5hbWU7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFR5cGVOYW1lLCAiTXVzdCBzcGVjaWZ5IHByb2R1Y3RUeXBlTmFtZSIpOworCisgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKworICAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5TmFtZShwcm9kdWN0VHlwZU5hbWUpOworICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBQcm9kdWN0VHlwZSIpOworICAgICAgICAgfQorICAgICAgICAgUHJvZHVjdFBhZ2UgbGFzdFBhZ2UgPSBjbGllbnQuZ2V0TGFzdFBhZ2UodHlwZSk7CisgICAgICAgICBpZiAobGFzdFBhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBQcm9kdWN0UGFnZSIpOworICAgICAgICAgfQorICAgICAgICAgcHJpbnRlci5wcmludGxuKCJQYWdlOiBbbnVtPSIgKyBsYXN0UGFnZS5nZXRQYWdlTnVtKCkKKyAgICAgICAgICAgICAgICsgIiwgdG90YWxQYWdlcz0iICsgbGFzdFBhZ2UuZ2V0VG90YWxQYWdlcygpICsgIiwgcGFnZVNpemU9IgorICAgICAgICAgICAgICAgKyBsYXN0UGFnZS5nZXRQYWdlU2l6ZSgpICsgIl0iKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUHJvZHVjdHM6Iik7CisKKyAgICAgICAgIGlmIChsYXN0UGFnZS5nZXRQYWdlUHJvZHVjdHMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBwYWdlIFByb2R1Y3RzIik7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKFByb2R1Y3QgcCA6IGxhc3RQYWdlLmdldFBhZ2VQcm9kdWN0cygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb2R1Y3Q6IFtpZD0iICsgcC5nZXRQcm9kdWN0SWQoKSArICIsbmFtZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdE5hbWUoKSArICIsdHlwZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiLHN0cnVjdHVyZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpICsgIiwgdHJhbnNmZXJTdGF0dXM9IgorICAgICAgICAgICAgICAgICAgKyBwLmdldFRyYW5zZmVyU3RhdHVzKCkgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGxhc3QgcGFnZSBvZiAiCisgICAgICAgICAgICAgICArICJwcm9kdWN0IGZvciBQcm9kdWN0VHlwZSBuYW1lICciICsgcHJvZHVjdFR5cGVOYW1lICsgIicgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFR5cGVOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpIHsKKyAgICAgIHRoaXMucHJvZHVjdFR5cGVOYW1lID0gcHJvZHVjdFR5cGVOYW1lOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0TmV4dFBhZ2VDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldE5leHRQYWdlQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZDI4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldE5leHRQYWdlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldHMgdGhlIG5leHQgcGFnZSBvZiB7QGxpbmsgUHJvZHVjdH1zIGZvciBhCisgKiBnaXZlbiB7QGxpbmsgUHJvZHVjdFR5cGV9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldE5leHRQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZU5hbWU7CisgICBwcml2YXRlIGludCBjdXJyZW50UGFnZU51bSA9IC0xOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFR5cGVOYW1lLCAiTXVzdCBzcGVjaWZ5IHByb2R1Y3RUeXBlTmFtZSIpOworICAgICAgICAgVmFsaWRhdGUuaXNUcnVlKGN1cnJlbnRQYWdlTnVtICE9IC0xLCAiTXVzdCBzcGVjaWZ5IGN1cnJlbnRQYWdlTnVtIik7CisKKyAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworCisgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gY2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlTWFuYWdlciByZXR1cm5lZCBudWxsIFByb2R1Y3RUeXBlIik7CisgICAgICAgICB9CisgICAgICAgICBQcm9kdWN0UGFnZSBmaXJzdFBhZ2UgPSBjbGllbnQuZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgICAgICAgaWYgKGZpcnN0UGFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlTWFuYWdlciByZXR1cm5lZCBudWxsIGZpcnN0IFByb2R1Y3RQYWdlIik7CisgICAgICAgICB9CisgICAgICAgICBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgICAgY3VycmVudFBhZ2Uuc2V0UGFnZU51bShjdXJyZW50UGFnZU51bSk7CisgICAgICAgICBjdXJyZW50UGFnZS5zZXRQYWdlU2l6ZShmaXJzdFBhZ2UuZ2V0UGFnZVNpemUoKSk7CisgICAgICAgICBjdXJyZW50UGFnZS5zZXRUb3RhbFBhZ2VzKGZpcnN0UGFnZS5nZXRUb3RhbFBhZ2VzKCkpOworICAgICAgICAgUHJvZHVjdFBhZ2UgbmV4dFBhZ2UgPSBjbGllbnQuZ2V0TmV4dFBhZ2UodHlwZSwgY3VycmVudFBhZ2UpOworICAgICAgICAgaWYgKG5leHRQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgbmV4dCBQcm9kdWN0UGFnZSIpOworICAgICAgICAgfQorICAgICAgICAgcHJpbnRlci5wcmludGxuKCJQYWdlOiBbbnVtPSIgKyBuZXh0UGFnZS5nZXRQYWdlTnVtKCkKKyAgICAgICAgICAgICAgICsgIiwgdG90YWxQYWdlcz0iICsgbmV4dFBhZ2UuZ2V0VG90YWxQYWdlcygpICsgIiwgcGFnZVNpemU9IgorICAgICAgICAgICAgICAgKyBuZXh0UGFnZS5nZXRQYWdlU2l6ZSgpICsgIl0iKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUHJvZHVjdHM6Iik7CisKKyAgICAgICAgIGlmIChuZXh0UGFnZS5nZXRQYWdlUHJvZHVjdHMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBwYWdlIFByb2R1Y3RzIik7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKFByb2R1Y3QgcCA6IG5leHRQYWdlLmdldFBhZ2VQcm9kdWN0cygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb2R1Y3Q6IFtpZD0iICsgcC5nZXRQcm9kdWN0SWQoKSArICIsbmFtZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdE5hbWUoKSArICIsdHlwZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiLHN0cnVjdHVyZT0iCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpICsgIiwgdHJhbnNmZXJTdGF0dXM9IgorICAgICAgICAgICAgICAgICAgKyBwLmdldFRyYW5zZmVyU3RhdHVzKCkgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IG5leHQgcHJvZHVjdCBwYWdlIGZvciIKKyAgICAgICAgICAgICAgICsgIiBQcm9kdWN0VHlwZSBuYW1lICciICsgcHJvZHVjdFR5cGVOYW1lCisgICAgICAgICAgICAgICArICInICBhbmQgY3VycmVudCBwYWdlICciICsgY3VycmVudFBhZ2VOdW0gKyAiJyA6ICIKKyAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZU5hbWUoU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgICAgdGhpcy5wcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0VHlwZU5hbWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQYWdlTnVtKGludCBjdXJyZW50UGFnZU51bSkgeworICAgICAgdGhpcy5jdXJyZW50UGFnZU51bSA9IGN1cnJlbnRQYWdlTnVtOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0TnVtUHJvZHVjdHNDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldE51bVByb2R1Y3RzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4MDQ5NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldE51bVByb2R1Y3RzQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIG51bWJlciBvZiB7QGxpbmsgUHJvZHVjdH1zIG9mIGEgZ2l2ZW4KKyAqIHtAbGluayBQcm91Y3RUeXBlfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXROdW1Qcm9kdWN0c0NsaUFjdGlvbiBleHRlbmRzIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3RUeXBlTmFtZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0VHlwZU5hbWUiKTsKKworICAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgICBQcm9kdWN0VHlwZSBwdCA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5TmFtZShwcm9kdWN0VHlwZU5hbWUpOworICAgICAgICAgaWYgKHB0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgUHJvZHVjdFR5cGUiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiVHlwZTogWyIKKyAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVOYW1lCisgICAgICAgICAgICAgICArICJdLCBOdW0gUHJvZHVjdHM6IFsiCisgICAgICAgICAgICAgICArIGNsaWVudC5nZXROdW1Qcm9kdWN0cyhwdCkgKyAiXSIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbnVtYmVyIG9mIHByb2R1Y3RzIGZvciIgKyAiIFByb2R1Y3RUeXBlIG5hbWUgJyIKKyAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVOYW1lICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZU5hbWUoU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgICAgdGhpcy5wcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0VHlwZU5hbWU7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcmV2UGFnZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0UHJldlBhZ2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzAxMTdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0UHJldlBhZ2VDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0cyB0aGUgcHJldmlvdXMgcGFnZSBvZiB7QGxpbmsgUHJvZHVjdH1zIGZvcgorICogYSBnaXZlbiB7QGxpbmsgUHJvZHVjdFR5cGV9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldFByZXZQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZU5hbWU7CisgICBwcml2YXRlIGludCBjdXJyZW50UGFnZU51bTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChwcm9kdWN0VHlwZU5hbWUsICJNdXN0IHNwZWNpZnkgcHJvZHVjdFR5cGVOYW1lIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGN1cnJlbnRQYWdlTnVtLCAiTXVzdCBzcGVjaWZ5IGN1cnJlbnRQYWdlTnVtIik7CisKKyAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworCisgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gY2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlTWFuYWdlciByZXR1cm5lZCBudWxsIFByb2R1Y3RUeXBlIik7CisgICAgICAgICB9CisgICAgICAgICBQcm9kdWN0UGFnZSBmaXJzdFBhZ2UgPSBjbGllbnQuZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgICAgICAgaWYgKGZpcnN0UGFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlTWFuYWdlciByZXR1cm5lZCBudWxsIGZpcnN0IFByb2R1Y3RQYWdlIik7CisgICAgICAgICB9CisgICAgICAgICBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgICAgY3VycmVudFBhZ2Uuc2V0UGFnZU51bShjdXJyZW50UGFnZU51bSk7CisgICAgICAgICBjdXJyZW50UGFnZS5zZXRQYWdlU2l6ZShmaXJzdFBhZ2UuZ2V0UGFnZVNpemUoKSk7CisgICAgICAgICBjdXJyZW50UGFnZS5zZXRUb3RhbFBhZ2VzKGZpcnN0UGFnZS5nZXRUb3RhbFBhZ2VzKCkpOworICAgICAgICAgUHJvZHVjdFBhZ2UgcHJldlBhZ2UgPSBjbGllbnQuZ2V0UHJldlBhZ2UodHlwZSwgY3VycmVudFBhZ2UpOworICAgICAgICAgaWYgKHByZXZQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgcHJldmlvdXMgUHJvZHVjdFBhZ2UiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUGFnZTogW251bT0iICsgcHJldlBhZ2UuZ2V0UGFnZU51bSgpCisgICAgICAgICAgICAgICArICIsIHRvdGFsUGFnZXM9IiArIHByZXZQYWdlLmdldFRvdGFsUGFnZXMoKSArICIsIHBhZ2VTaXplPSIKKyAgICAgICAgICAgICAgICsgcHJldlBhZ2UuZ2V0UGFnZVNpemUoKSArICJdIik7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb2R1Y3RzOiIpOworCisgICAgICAgICBpZiAocHJldlBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgcGFnZSBQcm9kdWN0cyIpOworICAgICAgICAgfQorICAgICAgICAgZm9yIChQcm9kdWN0IHAgOiBwcmV2UGFnZS5nZXRQYWdlUHJvZHVjdHMoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJQcm9kdWN0OiBbaWQ9IiArIHAuZ2V0UHJvZHVjdElkKCkgKyAiLG5hbWU9IgorICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3ROYW1lKCkgKyAiLHR5cGU9IgorICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpICsgIixzdHJ1Y3R1cmU9IgorICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSArICIsIHRyYW5zZmVyU3RhdHVzPSIKKyAgICAgICAgICAgICAgICAgICsgcC5nZXRUcmFuc2ZlclN0YXR1cygpICsgIl0iKTsKKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHByZXZpb3VzIHBhZ2Ugb2YgcHJvZHVjdHMiCisgICAgICAgICAgICAgICAgICAgICArICIgZm9yIFByb2R1Y3RUeXBlIG5hbWUgJyIgKyBwcm9kdWN0VHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICsgIicgYW5kIGN1cnJlbnQgIiArICIgcGFnZSAnIiArIGN1cnJlbnRQYWdlTnVtICsgIicgOiAiCisgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFR5cGVOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpIHsKKyAgICAgIHRoaXMucHJvZHVjdFR5cGVOYW1lID0gcHJvZHVjdFR5cGVOYW1lOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UGFnZU51bShpbnQgY3VycmVudFBhZ2VOdW0pIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2VOdW0gPSBjdXJyZW50UGFnZU51bTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldFByb2R1Y3RCeUlkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0QnlJZENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2N2I5YzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0QnlJZENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHtAbGluayBQcm9kdWN0fQorICogYnkgSUQuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRQcm9kdWN0QnlJZENsaUFjdGlvbiBleHRlbmRzIEFic3RyYWN0R2V0UHJvZHVjdENsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RJZDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3RJZCwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0SWQiKTsKKworICAgICAgUHJvZHVjdCBwID0gZ2V0Q2xpZW50KCkuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKTsKKyAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgcHJvZHVjdCBmb3IgaWQgJyIKKyAgICAgICAgICAgICAgICsgcHJvZHVjdElkICsgIiciKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0SWQoU3RyaW5nIHByb2R1Y3RJZCkgeworICAgICAgdGhpcy5wcm9kdWN0SWQgPSBwcm9kdWN0SWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNTcxNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSB7QGxpbmsgUHJvZHVjdH0KKyAqIGJ5IG5hbWUuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RHZXRQcm9kdWN0Q2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWU7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgVmFsaWRhdGUubm90TnVsbChwcm9kdWN0TmFtZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0TmFtZSIpOworCisgICAgICBQcm9kdWN0IHAgPSBnZXRDbGllbnQoKS5nZXRQcm9kdWN0QnlOYW1lKHByb2R1Y3ROYW1lKTsKKyAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgcHJvZHVjdCBmb3IgbmFtZSAnIgorICAgICAgICAgICAgICAgKyBwcm9kdWN0TmFtZSArICInIik7CisgICAgICB9CisgICAgICByZXR1cm4gcDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdE5hbWUoU3RyaW5nIHByb2R1Y3ROYW1lKSB7CisgICAgICB0aGlzLnByb2R1Y3ROYW1lID0gcHJvZHVjdE5hbWU7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MTI2OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0dldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0IGEge0BsaW5rIFByb2R1Y3R9J3MgZGF0YSBmaWxlIHRyYW5zZmVycworICogcGVyY2VudCBjb21wbGV0ZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gZXh0ZW5kcyBGaWxlTWFuYWdlckNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RJZDsKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChwcm9kdWN0SWQsICJNdXN0IHNwZWNpZnkgcHJvZHVjdGlkIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3RUeXBlTmFtZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0VHlwZU5hbWUiKTsKKworICAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisKKyAgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAvLyBUT0RPKGJmb3N0ZXIpOiBOb3Qgc3VyZSB3aHkgUHJvZHVjdFR5cGUgaXMgbmVlZGVkIGhlcmUuCisgICAgICAgICBQcm9kdWN0VHlwZSBwdCA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5TmFtZShwcm9kdWN0VHlwZU5hbWUpOworICAgICAgICAgaWYgKHB0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgUHJvZHVjdFR5cGUiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUocHQpOworICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0SWQocHJvZHVjdElkKTsKKworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJQcm9kdWN0OiBbaWQ9IiArIHByb2R1Y3RJZCArICIsIHRyYW5zZmVyUGN0PSIKKyAgICAgICAgICAgICAgICsgY2xpZW50LmdldFByb2R1Y3RQY3RUcmFuc2ZlcnJlZChwcm9kdWN0KSArICJdIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgcGVyY2VudCB0cmFuc2ZlcnJlZCIKKyAgICAgICAgICAgICAgICsgIiBmb3IgcHJvZHVjdCBpZCAnIiArIHByb2R1Y3RJZCArICInIGFuZCBQcm9kdWN0VHlwZSBuYW1lICciCisgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlTmFtZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdElkKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgIHRoaXMucHJvZHVjdElkID0gcHJvZHVjdElkOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZU5hbWUoU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgICAgdGhpcy5wcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0VHlwZU5hbWU7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9HZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWE5ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vR2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIGEge0BsaW5rIFByb2R1Y3RUeXBlfSBieSBuYW1lLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldFByb2R1Y3RUeXBlQnlOYW1lQ2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZU5hbWU7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFR5cGVOYW1lLCAiTXVzdCBzcGVjaWZ5IHByb2R1Y3RUeXBlTmFtZSIpOworCisgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gZ2V0Q2xpZW50KCkuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgUHJvZHVjdFR5cGUiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiZ2V0UHJvZHVjdFR5cGVCeU5hbWU6IFJlc3VsdDogW25hbWU9IgorICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICIsIGRlc2NyaXB0aW9uPSIgKyB0eXBlLmdldERlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICsgIiwgaWQ9IiArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIiwgdmVyc2lvbmVyQ2xhc3M9IgorICAgICAgICAgICAgICAgKyB0eXBlLmdldFZlcnNpb25lcigpICsgIiwgcmVwb3NpdG9yeVBhdGg9IgorICAgICAgICAgICAgICAgKyB0eXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpICsgIl0iKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHByb2R1Y3QgdHlwZSBieSBuYW1lICciICsgcHJvZHVjdFR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFR5cGVOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpIHsKKyAgICAgIHRoaXMucHJvZHVjdFR5cGVOYW1lID0gcHJvZHVjdFR5cGVOYW1lOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vSGFzUHJvZHVjdENsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vSGFzUHJvZHVjdENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDUzMjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9IYXNQcm9kdWN0Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBjaGVja3MgaWYgdGhlIEZpbGUgTWFuYWdlciBoYXMgYSBnaXZlbgorICoge0BsaW5rIFByb2R1Y3R9IGluZ2VzdGVkLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEhhc1Byb2R1Y3RDbGlBY3Rpb24gZXh0ZW5kcyBGaWxlTWFuYWdlckNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3ROYW1lLCAiTXVzdCBzcGVjaWZ5IHByb2R1Y3ROYW1lIik7CisKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiaGFzUHJvZHVjdDogUmVzdWx0OiAiCisgICAgICAgICAgICAgICArIGdldENsaWVudCgpLmhhc1Byb2R1Y3QocHJvZHVjdE5hbWUpKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGNoZWNrIGZvciBwcm9kdWN0ICciCisgICAgICAgICAgICAgICArIHByb2R1Y3ROYW1lICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHsKKyAgICAgIHRoaXMucHJvZHVjdE5hbWUgPSBwcm9kdWN0TmFtZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0luZ2VzdFByb2R1Y3RDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL0luZ2VzdFByb2R1Y3RDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjZiZjlmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vSW5nZXN0UHJvZHVjdENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QuU1RSVUNUVVJFX1NUUkVBTTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeS5nZXREYXRhVHJhbnNmZXJTZXJ2aWNlRnJvbUZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLlZlcnNpb25pbmdVdGlscy5hZGRSZWZzRnJvbVVyaXM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLlZlcnNpb25pbmdVdGlscy5nZXRVUklzRnJvbURpcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggaW5nZXN0cyBhIHtAbGluayBQcm9kdWN0fS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uIGV4dGVuZHMgRmlsZU1hbmFnZXJDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0TmFtZTsKKyAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RTdHJ1Y3R1cmU7CisgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZU5hbWU7CisgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGU7CisgICBwcml2YXRlIFN0cmluZyBkYXRhVHJhbnNmZXJlcjsKKyAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZXM7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdE5hbWUsICJNdXN0IHNwZWNpZnkgcHJvZHVjdE5hbWUiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocHJvZHVjdFN0cnVjdHVyZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0U3RydWN0dXJlIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHByb2R1Y3RUeXBlTmFtZSwgIk11c3Qgc3BlY2lmeSBwcm9kdWN0VHlwZU5hbWUiKTsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwobWV0YWRhdGFGaWxlLCAiTXVzdCBzcGVjaWZ5IG1ldGFkYXRhRmlsZSIpOworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChyZWZlcmVuY2VzLCAiTXVzdCBzcGVjaWZ5IHJlZmVyZW5jZXMiKTsKKworICAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisKKyAgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gY2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgICBpZiAocHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBQcm9kdWN0VHlwZSIpOworICAgICAgICAgfQorCisgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0TmFtZShwcm9kdWN0TmFtZSk7CisgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUocHJvZHVjdFN0cnVjdHVyZSk7CisgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHB0KTsKKworICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsaWVudC5zZXREYXRhVHJhbnNmZXIoZ2V0RGF0YVRyYW5zZmVyU2VydmljZUZyb21GYWN0b3J5KGRhdGFUcmFuc2ZlcmVyKSk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8vIG5lZWQgdG8gYnVpbGQgdXAgdGhlIHJlZiB1cmkgbGlzdCBpbiBjYXNlIHRoZSBQcm9kdWN0IHN0cnVjdHVyZQorICAgICAgICAgLy8gaXMgaGVpcmFyY2hpY2FsCisgICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFNUUlVDVFVSRV9ISUVSQVJDSElDQUwpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdXJpUmVmcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgVVJJIGhpZXJSZWZVcmkgPSBnZXRVcmkocmVmZXJlbmNlcy5nZXQoMCkpOworICAgICAgICAgICAgdXJpUmVmcy5hZGQoaGllclJlZlVyaS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHVyaVJlZnMuYWRkQWxsKGdldFVSSXNGcm9tRGlyKG5ldyBGaWxlKGhpZXJSZWZVcmkuZ2V0UGF0aCgpKSkpOworICAgICAgICAgICAgcmVmZXJlbmNlcyA9IHVyaVJlZnM7CisgICAgICAgICB9IGVsc2UgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpLmVxdWFscyhTVFJVQ1RVUkVfU1RSRUFNKSkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHVyaVJlZnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHJlZiA6IHJlZmVyZW5jZXMpIHsKKyAgICAgICAgICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHJlZik7CisgICAgICAgICAgICAgICBpZiAoIXVyaS5nZXRTY2hlbWUoKS5lcXVhbHMoInN0cmVhbSIpKQorICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtaW5nIGRhdGEgbXVzdCB1c2UgJ3N0cmVhbScgc2NoZW1lIG5vdCAiK3VyaS5nZXRTY2hlbWUoKSk7CisgICAgICAgICAgICAgICB1cmlSZWZzLmFkZCh1cmkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWZlcmVuY2VzID0gdXJpUmVmczsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdXJpUmVmcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVmZXJlbmNlIDogcmVmZXJlbmNlcykgeworICAgICAgICAgICAgICAgdXJpUmVmcy5hZGQoZ2V0VXJpKHJlZmVyZW5jZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWZlcmVuY2VzID0gdXJpUmVmczsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gYWRkIFByb2R1Y3QgUmVmZXJlbmNlcyBmcm9tIHRoZSBVUkkgbGlzdAorICAgICAgICAgYWRkUmVmc0Zyb21VcmlzKHByb2R1Y3QsIHJlZmVyZW5jZXMpOworCisgICAgICAgICBwcmludGVyLnByaW50bG4oImluZ2VzdFByb2R1Y3Q6IFJlc3VsdDogIgorICAgICAgICAgICAgICAgKyBjbGllbnQuaW5nZXN0UHJvZHVjdChwcm9kdWN0LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKGdldFVyaShtZXRhZGF0YUZpbGUpLnRvVVJMKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuU3RyZWFtKCkpLCBkYXRhVHJhbnNmZXJlciAhPSBudWxsKSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5nZXN0IHByb2R1Y3QgJyIKKyAgICAgICAgICAgICAgICsgcHJvZHVjdE5hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3ROYW1lKFN0cmluZyBwcm9kdWN0TmFtZSkgeworICAgICAgdGhpcy5wcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0U3RydWN0dXJlKFN0cmluZyBwcm9kdWN0U3RydWN0dXJlKSB7CisgICAgICB0aGlzLnByb2R1Y3RTdHJ1Y3R1cmUgPSBwcm9kdWN0U3RydWN0dXJlOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZU5hbWUoU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgICAgdGhpcy5wcm9kdWN0VHlwZU5hbWUgPSBwcm9kdWN0VHlwZU5hbWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhRmlsZShTdHJpbmcgbWV0YWRhdGFGaWxlKSB7CisgICAgICB0aGlzLm1ldGFkYXRhRmlsZSA9IG1ldGFkYXRhRmlsZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RGF0YVRyYW5zZmVyZXIoU3RyaW5nIGRhdGFUcmFuc2ZlcmVyKSB7CisgICAgICB0aGlzLmRhdGFUcmFuc2ZlcmVyID0gZGF0YVRyYW5zZmVyZXI7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoTGlzdDxTdHJpbmc+IHJlZmVyZW5jZXMpIHsKKyAgICAgIHRoaXMucmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7CisgICB9CisKKyAgIHByaXZhdGUgVVJJIGdldFVyaShTdHJpbmcgZmlsZVBhdGgpIHsKKyAgICAgIGlmIChuZXcgRmlsZShmaWxlUGF0aCkuZXhpc3RzKCkpIHsKKyAgICAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlUGF0aCkuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gVVJJLmNyZWF0ZShmaWxlUGF0aCk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9MdWNlbmVRdWVyeUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vTHVjZW5lUXVlcnlDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjFmMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vTHVjZW5lUXVlcnlDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlF1ZXJ5UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuQ2xhdXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlBocmFzZVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUmFuZ2VRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guVGVybVF1ZXJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkJvb2xlYW5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LkNvbXBsZXhRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHMuQ0FTQW5hbHl6ZXI7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGNvbnZlcnRzIGEgTHVjZW5lLWxpa2UgcXVlcnkgaW50byBhIEZpbGUKKyAqIE1hbmFnZXIge0BsaW5rIFF1ZXJ5fSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBMdWNlbmVRdWVyeUNsaUFjdGlvbiBleHRlbmRzIEFic3RyYWN0UXVlcnlDbGlBY3Rpb24geworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJFRV9URVhUX0JMT0NLID0gIl9fRlJFRV9fIjsKKworICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnk7CisgICBwcml2YXRlIExpc3Q8U3RyaW5nPiByZWR1Y2VkUHJvZHVjdFR5cGVzOworICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVkdWNlZE1ldGFkYXRhS2V5czsKKworICAgcHVibGljIEx1Y2VuZVF1ZXJ5Q2xpQWN0aW9uKCkgeworICAgICAgc3VwZXIoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgQ29tcGxleFF1ZXJ5IGdldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHF1ZXJ5LCAiTXVzdCBzcGVjaWZ5IHF1ZXJ5Iik7CisKKyAgICAgIENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkgPSBuZXcgQ29tcGxleFF1ZXJ5KCk7CisgICAgICBjb21wbGV4UXVlcnkuc2V0Q3JpdGVyaWEoTGlzdHMubmV3QXJyYXlMaXN0KGdlbmVyYXRlQ0FTUXVlcnkocGFyc2VRdWVyeShxdWVyeSkpKSk7CisgICAgICBjb21wbGV4UXVlcnkuc2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMocmVkdWNlZFByb2R1Y3RUeXBlcyk7CisgICAgICBjb21wbGV4UXVlcnkuc2V0UmVkdWNlZE1ldGFkYXRhKHJlZHVjZWRNZXRhZGF0YUtleXMpOworICAgICAgcmV0dXJuIGNvbXBsZXhRdWVyeTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFJlZHVjZWRQcm9kdWN0VHlwZXMoTGlzdDxTdHJpbmc+IHJlZHVjZWRQcm9kdWN0VHlwZXMpIHsKKyAgICAgIHRoaXMucmVkdWNlZFByb2R1Y3RUeXBlcyA9IHJlZHVjZWRQcm9kdWN0VHlwZXM7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFJlZHVjZWRNZXRhZGF0YUtleXMoTGlzdDxTdHJpbmc+IHJlZHVjZWRNZXRhZGF0YUtleXMpIHsKKyAgICAgIHRoaXMucmVkdWNlZE1ldGFkYXRhS2V5cyA9IHJlZHVjZWRNZXRhZGF0YUtleXM7CisgICB9CisKKyAgIHByaXZhdGUgUXVlcnkgcGFyc2VRdWVyeShTdHJpbmcgcXVlcnkpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAvLyBub3RlIHRoYXQgIl9fRlJFRV9fIiBpcyBhIGNvbnRyb2wgd29yayBmb3IgZnJlZSB0ZXh0IHNlYXJjaGluZworICAgICAgcmV0dXJuIChRdWVyeSkgbmV3IFF1ZXJ5UGFyc2VyKEZSRUVfVEVYVF9CTE9DSywgbmV3IENBU0FuYWx5emVyKCkpCisgICAgICAgICAgICAucGFyc2UocXVlcnkpOworICAgfQorCisgICBwcml2YXRlIFF1ZXJ5Q3JpdGVyaWEgZ2VuZXJhdGVDQVNRdWVyeShRdWVyeSBsdWNlbmVRdWVyeSkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgaWYgKGx1Y2VuZVF1ZXJ5IGluc3RhbmNlb2YgVGVybVF1ZXJ5KSB7CisgICAgICAgICBUZXJtIHQgPSAoKFRlcm1RdWVyeSkgbHVjZW5lUXVlcnkpLmdldFRlcm0oKTsKKyAgICAgICAgIGlmICh0LmZpZWxkKCkuZXF1YWxzKEZSRUVfVEVYVF9CTE9DSykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZyZWUgdGV4dCBibG9ja3Mgbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRlcm1RdWVyeUNyaXRlcmlhKHQuZmllbGQoKSwgdC50ZXh0KCkpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChsdWNlbmVRdWVyeSBpbnN0YW5jZW9mIFBocmFzZVF1ZXJ5KSB7CisgICAgICAgICBUZXJtW10gdCA9ICgoUGhyYXNlUXVlcnkpIGx1Y2VuZVF1ZXJ5KS5nZXRUZXJtcygpOworICAgICAgICAgaWYgKHRbMF0uZmllbGQoKS5lcXVhbHMoRlJFRV9URVhUX0JMT0NLKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRnJlZSB0ZXh0IGJsb2NrcyBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJvb2xlYW5RdWVyeUNyaXRlcmlhIGJxYyA9IG5ldyBCb29sZWFuUXVlcnlDcml0ZXJpYSgpOworICAgICAgICAgICAgYnFjLnNldE9wZXJhdG9yKEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgIGJxYy5hZGRUZXJtKG5ldyBUZXJtUXVlcnlDcml0ZXJpYSh0W2ldLmZpZWxkKCksIHRbaV0KKyAgICAgICAgICAgICAgICAgICAgIC50ZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBicWM7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGx1Y2VuZVF1ZXJ5IGluc3RhbmNlb2YgUmFuZ2VRdWVyeSkgeworICAgICAgICAgVGVybSBzdGFydFQgPSAoKFJhbmdlUXVlcnkpIGx1Y2VuZVF1ZXJ5KS5nZXRMb3dlclRlcm0oKTsKKyAgICAgICAgIFRlcm0gZW5kVCA9ICgoUmFuZ2VRdWVyeSkgbHVjZW5lUXVlcnkpLmdldFVwcGVyVGVybSgpOworICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVF1ZXJ5Q3JpdGVyaWEoc3RhcnRULmZpZWxkKCksIHN0YXJ0VAorICAgICAgICAgICAgICAgLnRleHQoKSwgZW5kVC50ZXh0KCksICgoUmFuZ2VRdWVyeSkgbHVjZW5lUXVlcnkpLmlzSW5jbHVzaXZlKCkpOworICAgICAgfSBlbHNlIGlmIChsdWNlbmVRdWVyeSBpbnN0YW5jZW9mIEJvb2xlYW5RdWVyeSkgeworICAgICAgICAgQm9vbGVhbkNsYXVzZVtdIGNsYXVzZXMgPSAoKEJvb2xlYW5RdWVyeSkgbHVjZW5lUXVlcnkpLmdldENsYXVzZXMoKTsKKyAgICAgICAgIEJvb2xlYW5RdWVyeUNyaXRlcmlhIGJxYyA9IG5ldyBCb29sZWFuUXVlcnlDcml0ZXJpYSgpOworICAgICAgICAgYnFjLnNldE9wZXJhdG9yKEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCk7CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXVzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjbGF1c2VzW2ldLmdldE9jY3VyKCkuZXF1YWxzKEJvb2xlYW5DbGF1c2UuT2NjdXIuU0hPVUxEKSkgeworICAgICAgICAgICAgICAgYnFjLnNldE9wZXJhdG9yKEJvb2xlYW5RdWVyeUNyaXRlcmlhLk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJxYy5hZGRUZXJtKGdlbmVyYXRlQ0FTUXVlcnkoY2xhdXNlc1tpXS5nZXRRdWVyeSgpKSk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gYnFjOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBxdWVyeSEgQ2Fubm90IGRldGVybWluZSBjbGF1c2UgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICsgbHVjZW5lUXVlcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAhIik7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9SZXRyaWV2ZUZpbGVzQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9SZXRyaWV2ZUZpbGVzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZWY5MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1JldHJpZXZlRmlsZXNDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLyoqCisgKiBSZXRyaWV2ZXMgZmlsZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIFByb2R1Y3R9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUmV0cmlldmVGaWxlc0NsaUFjdGlvbiBleHRlbmRzIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdElkOworICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWU7CisgICBwcml2YXRlIERhdGFUcmFuc2ZlciBkdDsKKyAgIHByaXZhdGUgRmlsZSBkZXN0aW5hdGlvbjsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1DbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgIGR0LnNldEZpbGVNYW5hZ2VyVXJsKGZtQ2xpZW50LmdldEZpbGVNYW5hZ2VyVXJsKCkpOworICAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKyAgICAgICAgIGlmIChwcm9kdWN0SWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvZHVjdCA9IGZtQ2xpZW50LmdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgICAgICB9IGVsc2UgaWYgKHByb2R1Y3ROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb2R1Y3QgPSBmbUNsaWVudC5nZXRQcm9kdWN0QnlOYW1lKHByb2R1Y3ROYW1lKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBlaXRoZXIgcHJvZHVjdElkIG9yIHByb2R1Y3ROYW1lIik7CisgICAgICAgICB9CisgICAgICAgICBpZiAocHJvZHVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKGZtQ2xpZW50LmdldFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpKTsKKyAgICAgICAgICAgIGR0LnJldHJpZXZlUHJvZHVjdChwcm9kdWN0LCBkZXN0aW5hdGlvbik7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUHJvZHVjdCB3YXMgbm90IGZvdW5kIik7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byByZXRyaWV2ZSBmaWxlcyBmb3IgcHJvZHVjdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICB0aGlzLnByb2R1Y3RJZCA9IHByb2R1Y3RJZDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdE5hbWUoU3RyaW5nIHByb2R1Y3ROYW1lKSB7CisgICAgICB0aGlzLnByb2R1Y3ROYW1lID0gcHJvZHVjdE5hbWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldERhdGFUcmFuc2ZlckZhY3RvcnkoRGF0YVRyYW5zZmVyRmFjdG9yeSBkdEZhY3RvcnkpIHsKKyAgICAgIGR0ID0gZHRGYWN0b3J5LmNyZWF0ZURhdGFUcmFuc2ZlcigpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihGaWxlIGRlc3RpbmF0aW9uKSB7CisgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9TcWxRdWVyeUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vU3FsUXVlcnlDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA2MDNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vU3FsUXVlcnlDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5Db21wbGV4UXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuU3FsUGFyc2VyOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHF1ZXJpZXMgdGhlIEZpbGVNYW5hZ2VyIGJ5IHBhcnNpbmcgYW4gU1FMIGxpa2UKKyAqIHF1ZXJ5IGludG8gYSBGaWxlTWFuYWdlciB7QGxpbmsgUXVlcnl9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFNxbFF1ZXJ5Q2xpQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RRdWVyeUNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5OworCisgICBwdWJsaWMgU3FsUXVlcnlDbGlBY3Rpb24oKSB7CisgICAgICBzdXBlcigpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBDb21wbGV4UXVlcnkgZ2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwocXVlcnksICJNdXN0IHNwZWNpZnkgcXVlcnkiKTsKKworICAgICAgcmV0dXJuIFNxbFBhcnNlci5wYXJzZVNxbFF1ZXJ5KHF1ZXJ5KTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2Zlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDcwOGUyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7DQorDQorLy9PT0RUIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEubmV0LlVSTDsNCisNCisvKioNCisgKiBAYXV0aG9yIG1hdHRtYW5uDQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIA0KKyAqIDxwPg0KKyAqIE9iamVjdHMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGRlZmluZSBob3cgdG8gdHJhbnNmZXIgcHJvZHVjdHMgdG8gdGhlDQorICoge0BsaW5rIERhdGFTdG9yZX0gcmVwb3NpdG9yeS4NCisgKiA8L3A+DQorICogDQorICovDQorcHVibGljIGludGVyZmFjZSBEYXRhVHJhbnNmZXIgew0KKwkvKiBleHRlbnNpb24gcG9pbnQgSUQgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9QT0lOVF9JRCA9IERhdGFUcmFuc2Zlci5jbGFzcy5nZXROYW1lKCk7DQorCQ0KKwkvKioNCisJICogDQorCSAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB0aGUgRmlsZSBNYW5hZ2VyIHRoYXQgdGhpcyB0cmFuc2ZlcmVyIHdpbGwgYmUNCisJICogdHJhbnNmZXJyaW5nIFByb2R1Y3RzIHRvLg0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RmlsZU1hbmFnZXJVcmwoVVJMIHVybCk7DQorCQ0KKwkvKioNCisJICogDQorCSAqIEBwYXJhbSBwcm9kdWN0DQorCSAqICAgICAgICAgICAgVGhlIHByb2R1Y3QgdGhhdCBpcyBiZWluZyB0cmFuc2ZlcnJlZC4gVGhlIHByb2R1Y3Qgc2hvdWxkIGhhdmUNCisJICogICAgICAgICAgICBib3RoIGl0cyBvcmlnRmlsZUxvY2F0aW9uLCBhcyB3ZWxsIGFzIGl0cyBkYXRhU3RvcmVSZWZzIGZpbGxlZA0KKwkgKiAgICAgICAgICAgIGluIHRvIHBlcmZvcm0gdGhlIHRyYW5zZmVyLg0KKwkgKiBAdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbg0KKwkgKiAgICAgICAgICAgICBJZiBhIGdlbmVyYWwgZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdHJhbnNmZXIuDQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisJICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYW4gSU8gZWVycm9yIHdoZW4gcGVyZm9ybWluZyB0aGUgdHJhbnNmZXIuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0cmFuc2ZlclByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLA0KKwkJCUlPRXhjZXB0aW9uOw0KKw0KKwkgIC8qKg0KKyAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc3RvcmUgcmVmZXJlbmNlIGJlIHNldCwgbm90aGluZyBlbHNlIGlzIHVzZWQNCisgICAgKiBAcGFyYW0gcHJvZHVjdCBUaGUgcHJvZHVjdCB3aG9zZSBkYXRhIHN0b3JlIHJlZmVyZW5jZSB3aWxsIGJlIGNvcGllZA0KKyAgICAqIEBwYXJhbSBkaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGF0YSBzdG9yZSByZWZlcmVuY2Ugd2lsbCBiZSBjb3BpZWQgdG8NCisgICAgKiBAdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbg0KKyAgICAqICAgICAgICAgICAgIElmIGEgZ2VuZXJhbCBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSB0cmFuc2Zlci4NCisgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQorICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYW4gSU8gZWVycm9yIHdoZW4gcGVyZm9ybWluZyB0aGUgdHJhbnNmZXIuDQorICAgICovDQorICAgcHVibGljIHZvaWQgcmV0cmlldmVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCwgRmlsZSBkaXJlY3RvcnkpIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24sDQorICAgICAgICAgSU9FeGNlcHRpb247DQorICAgDQorICAgcHVibGljIHZvaWQgZGVsZXRlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uOw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvRGF0YVRyYW5zZmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDlkMWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7DQorDQorLyoqDQorICogQGF1dGhvciBtYXR0bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiANCisgKiA8cD5BIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBEYXRhVHJhbnNmZXJ9IGltcGxlbWVudGF0aW9uIG9iamVjdHMuPC9wPg0KKyAqIA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YVRyYW5zZmVyRmFjdG9yeSB7DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBEYXRhVHJhbnNmZXJ9IGltcGxlbWVudGF0aW9uLg0KKyAgICAgKi8NCisgICAgcHVibGljIERhdGFUcmFuc2ZlciBjcmVhdGVEYXRhVHJhbnNmZXIoKTsNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9JblBsYWNlRGF0YVRyYW5zZmVyRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9JblBsYWNlRGF0YVRyYW5zZmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NGY5MzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL0luUGxhY2VEYXRhVHJhbnNmZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyOw0KKw0KKy8qKg0KKyAqIEBhdXRob3Igd29vbGxhcmQNCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kDQorICogDQorICogPHA+Q3JlYXRlcyBuZXcge0BsaW5rIEluUGxhY2VEYXRhVHJhbnNmZXJlcn1zLjwvcD4NCisgKiANCisgKi8NCitwdWJsaWMgY2xhc3MgSW5QbGFjZURhdGFUcmFuc2ZlckZhY3RvcnkgaW1wbGVtZW50cyBEYXRhVHJhbnNmZXJGYWN0b3J5IHsNCisNCisgICAgLyoqDQorICAgICAqIDxwPkRlZmF1bHQgQ29uc3RydWN0b3I8L3A+DQorICAgICAqLw0KKyAgICBwdWJsaWMgSW5QbGFjZURhdGFUcmFuc2ZlckZhY3RvcnkoKSB7DQorICAgICAgICBzdXBlcigpOw0KKyAgICB9DQorDQorICAgIC8qIChub24tSmF2YWRvYykNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJGYWN0b3J5I2NyZWF0ZURhdGFUcmFuc2ZlcigpDQorICAgICAqLw0KKyAgICBwdWJsaWMgRGF0YVRyYW5zZmVyIGNyZWF0ZURhdGFUcmFuc2ZlcigpIHsNCisgICAgICAgIHJldHVybiBuZXcgSW5QbGFjZURhdGFUcmFuc2ZlcmVyKCk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9JblBsYWNlRGF0YVRyYW5zZmVyZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvSW5QbGFjZURhdGFUcmFuc2ZlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3YTIzOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvSW5QbGFjZURhdGFUcmFuc2ZlcmVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyOw0KKw0KKy8vT09EVCBpbXBvcnRzDQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQoraW1wb3J0IGphdmEubmV0LlVSTDsNCisNCisvKiogDQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBEYXRhVHJhbnNmZXJ9IGludGVyZmFjZSB0aGF0IGxlYXZlcw0KKyAqIHByb2R1Y3RzIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuLCAiaW4gcGxhY2UiKSBhbmQgZG9lc24ndCB0cmFuc2Zlcg0KKyAqIHRoZW0gYXQgYWxsLg0KKyAqDQorICogQGF1dGhvciBtYXR0bWFubkBhcGFjaGUub3JnIChDaHJpcyBNYXR0bWFubikNCisgKi8NCitwdWJsaWMgY2xhc3MgSW5QbGFjZURhdGFUcmFuc2ZlcmVyIGltcGxlbWVudHMgRGF0YVRyYW5zZmVyIHsNCisNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEluUGxhY2VEYXRhVHJhbnNmZXJlci5jbGFzcy5nZXROYW1lKCkpOw0KKw0KKyAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBudWxsOw0KKw0KKyAgcHVibGljIEluUGxhY2VEYXRhVHJhbnNmZXJlcigpIHt9DQorDQorICBwdWJsaWMgdm9pZCBzZXRGaWxlTWFuYWdlclVybChVUkwgdXJsKSB7DQorICAgIHRyeSB7DQorICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KHVybCk7DQorICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiSW4gUGxhY2UgRGF0YSBUcmFuc2ZlciB0bzogWyIgKyBjbGllbnQuZ2V0RmlsZU1hbmFnZXJVcmwoKS50b1N0cmluZygpDQorICAgICAgICAgICsgIl0gZW5hYmxlZCIpOw0KKyAgICB9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsNCisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJDb25uZWN0aW9uIGV4Y2VwdGlvbiBmb3IgZmlsZW1ncjogWyIgKyB1cmwgKyAiXSIpOw0KKyAgICB9DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHRyYW5zZmVyUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgLy8gZG8gbm90aGluZw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCByZXRyaWV2ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0LCBGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwNCisgICAgICBJT0V4Y2VwdGlvbiB7DQorICAgIC8vIGRvIG5vdGhpbmcNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgZGVsZXRlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgLy8gZG8gbm90aGluZw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL0xvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA0MjkzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7DQorDQorLyoqDQorICogQGF1dGhvciBtYXR0bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiANCisgKiA8cD5DcmVhdGVzIG5ldyB7QGxpbmsgTG9jYWxEYXRhVHJhbnNmZXJlcn1zLjwvcD4NCisgKiANCisgKi8NCitwdWJsaWMgY2xhc3MgTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IGltcGxlbWVudHMgRGF0YVRyYW5zZmVyRmFjdG9yeSB7DQorDQorICAgIC8qKg0KKyAgICAgKiA8cD5EZWZhdWx0IENvbnN0cnVjdG9yPC9wPg0KKyAgICAgKi8NCisgICAgcHVibGljIExvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSgpIHsNCisgICAgICAgIHN1cGVyKCk7DQorICAgIH0NCisNCisgICAgLyogKG5vbi1KYXZhZG9jKQ0KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlckZhY3RvcnkjY3JlYXRlRGF0YVRyYW5zZmVyKCkNCisgICAgICovDQorICAgIHB1YmxpYyBEYXRhVHJhbnNmZXIgY3JlYXRlRGF0YVRyYW5zZmVyKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbERhdGFUcmFuc2ZlcmVyKCk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9Mb2NhbERhdGFUcmFuc2ZlcmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL0xvY2FsRGF0YVRyYW5zZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg1ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9Mb2NhbERhdGFUcmFuc2ZlcmVyLmphdmEKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7CisKKy8vQVBBQ0hFIEltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuRGF0YVRyYW5zZmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5WZXJzaW9uaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NaW1lVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NaW1lVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVzRmFjdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiAgICAgICAgICA8cD4KKyAqICAgICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgRGF0YVRyYW5zZmVyfSBpbnRlcmZhY2UgdGhhdCBtb3ZlcworICogICAgICAgICAgcHJvZHVjdHMgdGhhdCBhcmUgYXZhaWxhYmxlIHZpYSBVUklzIG9uIHRoZSBzYW1lIG1hY2hpbmUsIHRocm91Z2ggYW4KKyAqICAgICAgICAgIE5GUyBtb3VudGVkIGRpc2ssIG9yIHZpYSB0aGUgbG9jYWxseSBtb3VudGVkIGZpbGUgcmVwb3NpdG9yeS4KKyAqICAgICAgICAgIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgTG9jYWxEYXRhVHJhbnNmZXJlciBpbXBsZW1lbnRzIERhdGFUcmFuc2ZlciB7CisKKyAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihMb2NhbERhdGFUcmFuc2ZlcmVyLmNsYXNzCisgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgLyogZmlsZSBtYW5hZ2VyIGNsaWVudCAqLworICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAvKioKKyAgICAqIDxwPgorICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICogPC9wPgorICAgICovCisgICBwdWJsaWMgTG9jYWxEYXRhVHJhbnNmZXJlcigpIHsKKyAgIH0KKworICAgLyoKKyAgICAqIChub24tSmF2YWRvYykKKyAgICAqIAorICAgICogQHNlZQorICAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXIjc2V0RmlsZU1hbmFnZXJVcmwKKyAgICAqIChqYXZhLm5ldC5VUkwpCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHNldEZpbGVNYW5hZ2VyVXJsKFVSTCB1cmwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQodXJsKTsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkxvY2FsIERhdGEgVHJhbnNmZXIgdG86IFsiCisgICAgICAgICAgICAgICArIGNsaWVudC5nZXRGaWxlTWFuYWdlclVybCgpLnRvU3RyaW5nKCkgKyAiXSBlbmFibGVkIik7CisgICAgICB9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB9CisgICB9CisKKyAgIC8qCisgICAgKiAobm9uLUphdmFkb2MpCisgICAgKiAKKyAgICAqIEBzZWUKKyAgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlciN0cmFuc2ZlclByb2R1Y3Qob3JnLmFwYWNoZQorICAgICogLm9vZHQuY2FzLmRhdGEuc3RydWN0cy5Qcm9kdWN0KQorICAgICovCisgICBwdWJsaWMgdm9pZCB0cmFuc2ZlclByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLAorICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgd2hldGhlciBvciBub3QgaXQncyBhIHNldCBvZiBmaWxlcywgb3IgaXQncyBhY3R1YWxseSBhIGRpcgorICAgICAgLy8gc3RydWN0dXJlCisgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0hJRVJBUkNISUNBTCkpIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtb3ZlRGlyVG9Qcm9kdWN0UmVwbyhwcm9kdWN0KTsKKyAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKAorICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICJVUkkgU3ludGF4IEV4Y2VwdGlvbiB3aGVuIG1vdmluZyBkaXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFJlZmVyZW5jZSkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcmlnUmVmZXJlbmNlKCkgKyAiOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZSk7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpLmVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKSkgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vdmVGaWxlc1RvUHJvZHVjdFJlcG8ocHJvZHVjdCk7CisgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAiVVJJIFN5bnRheCBFeGNlcHRpb24gd2hlbiBtb3ZpbmcgZmlsZXM6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiU3RyZWFtaW5nIHByb2R1Y3RzIGFyZSBub3QgbW92ZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJDYW5ub3QgdHJhbnNmZXIgcHJvZHVjdCBvbiB1bmtub3duIFByb2R1Y3RTdHJ1Y3R1cmU6ICIKKyAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkpOworICAgICAgfQorICAgfQorCisgICAvKgorICAgICogKG5vbi1KYXZhZG9jKQorICAgICogCisgICAgKiBAc2VlCisgICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlciNyZXRyaWV2ZVByb2R1Y3Qob3JnLgorICAgICogYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0LCBqYXZhLmlvLkZpbGUpCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHJldHJpZXZlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QsIEZpbGUgZGlyZWN0b3J5KQorICAgICAgICAgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgd2hldGhlciBvciBub3QgaXQncyBhIHNldCBvZiBmaWxlcywgb3IgaXQncyBhY3R1YWxseSBhIGRpcgorICAgICAgLy8gc3RydWN0dXJlCisgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0hJRVJBUkNISUNBTCkpIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3B5RGlyVG9EaXIocHJvZHVjdCwgZGlyZWN0b3J5KTsKKyAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKAorICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICJVUkkgU3ludGF4IEV4Y2VwdGlvbiB3aGVuIG1vdmluZyBkaXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFJlZmVyZW5jZSkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpKSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgY29weUZpbGVzVG9EaXIocHJvZHVjdCwgZGlyZWN0b3J5KTsKKyAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKAorICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICJVUkkgU3ludGF4IEV4Y2VwdGlvbiB3aGVuIG1vdmluZyBmaWxlczogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKS5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfU1RSRUFNKSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCJTdHJlYW1pbmcgcHJvZHVjdHMgYXJlIG5vdCB0cmFuc2ZlcmVkLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAiQ2Fubm90IHRyYW5zZmVyIHByb2R1Y3Qgb24gdW5rbm93biBQcm9kdWN0U3RydWN0dXJlOiAiCisgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICAgIH0KKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBkZWxldGVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICBmb3IgKFJlZmVyZW5jZSByZWYgOiBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpIHsKKyAgICAgICBGaWxlIGRhdGFGaWxlID0gbmV3IEZpbGUoVVJJLmNyZWF0ZShyZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpLnRvVVJMKCkuZ2V0UGF0aCgpKTsKKyAgICAgICBpZiAoIWRhdGFGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gZGVsZXRlIGZpbGUgJXMgLSBkZWxldGUgcmV0dXJuZWQgZmFsc2UiLAorICAgICAgICAgICAgZGF0YUZpbGUpKTsKKyAgICAgICB9CisgICAgIH0KKyAgIH0KKyAgIAorICAgLyoqCisgICAgKiBAcGFyYW0gYXJncworICAgICovCisgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLAorICAgICAgICAgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgdXNhZ2UgPSAiTG9jYWxGaWxlVHJhbnNmZXIgLS1wcm9kdWN0TmFtZSA8bmFtZT4gLS1wcm9kdWN0UmVwbyA8cmVwbz4gWy0tZGlyIDxkaXJSZWY+XSBbLS1maWxlcyA8b3JpZ1JlZiAxPi4uLjxvcmlnUmVmIE4+XVxuIjsKKworICAgICAgTWltZVR5cGVzIG1pbWVUeXBlUmVwbzsKKyAgICAgIHRyeSB7CisgICAgICAgICBtaW1lVHlwZVJlcG8gPSBNaW1lVHlwZXNGYWN0b3J5CisgICAgICAgICAgICAgICAuY3JlYXRlKFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiKSk7CisgICAgICB9IGNhdGNoIChNaW1lVHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIHByb2R1Y3ROYW1lID0gbnVsbDsKKyAgICAgIFN0cmluZyBwcm9kdWN0UmVwbyA9IG51bGw7CisgICAgICBTdHJpbmcgdHJhbnNmZXJUeXBlID0gbnVsbDsKKyAgICAgIFJlZmVyZW5jZSBkaXJSZWZlcmVuY2UgPSBudWxsOworCisgICAgICBMaXN0PFJlZmVyZW5jZT4gZmlsZVJlZmVyZW5jZXMgPSBudWxsOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1kaXIiKSkgeworICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gImRpciI7CisgICAgICAgICAgICBkaXJSZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgICAgICAgICBkaXJSZWZlcmVuY2Uuc2V0T3JpZ1JlZmVyZW5jZShuZXcgRmlsZShuZXcgVVJJKGFyZ3NbKytpXSkpLnRvVVJJKCkKKyAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsCisgICAgICAgICAgICAgICAgICAiTG9jYWxGaWxlVHJhbnNmZXIubWFpbjogR2VuZXJhdGVkIG9yaWcgcmVmZXJlbmNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRpclJlZmVyZW5jZS5nZXRPcmlnUmVmZXJlbmNlKCkpOworICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1maWxlcyIpKSB7CisgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSAiZmlsZXMiOworICAgICAgICAgICAgZmlsZVJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yPFJlZmVyZW5jZT4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGFyZ3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsICJMb2NhbEZpbGVUcmFuc2Zlci5tYWluOiBBZGRpbmcgZmlsZSByZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICsgYXJnc1tqXSk7CisgICAgICAgICAgICAgICBmaWxlUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZShhcmdzW2pdLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoYXJnc1tqXSkubGVuZ3RoKCksIG1pbWVUeXBlUmVwbworICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1pbWVUeXBlKGFyZ3Nbal0pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXByb2R1Y3ROYW1lIikpIHsKKyAgICAgICAgICAgIHByb2R1Y3ROYW1lID0gYXJnc1srK2ldOworICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1wcm9kdWN0UmVwbyIpKSB7CisgICAgICAgICAgICBwcm9kdWN0UmVwbyA9IGFyZ3NbKytpXTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRyYW5zZmVyVHlwZSA9PSBudWxsCisgICAgICAgICAgICB8fCAodHJhbnNmZXJUeXBlICE9IG51bGwgJiYgKCh0cmFuc2ZlclR5cGUuZXF1YWxzKCJkaXIiKSAmJiBkaXJSZWZlcmVuY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgIHx8ICh0cmFuc2ZlclR5cGUuZXF1YWxzKCJmaWxlcyIpICYmIGZpbGVSZWZlcmVuY2VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICB8fCAodHJhbnNmZXJUeXBlICE9IG51bGwgJiYgISh0cmFuc2ZlclR5cGUuZXF1YWxzKCJkaXIiKSB8fCB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoImZpbGVzIikpKSB8fCBwcm9kdWN0TmFtZSA9PSBudWxsIHx8IHByb2R1Y3RSZXBvID09IG51bGwpKSkgeworICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgfQorCisgICAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgUHJvZHVjdAorICAgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgIHAuc2V0UHJvZHVjdE5hbWUocHJvZHVjdE5hbWUpOworCisgICAgICBpZiAodHJhbnNmZXJUeXBlLmVxdWFscygiZGlyIikpIHsKKyAgICAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUwpOworICAgICAgICAgZGlyUmVmZXJlbmNlLnNldERhdGFTdG9yZVJlZmVyZW5jZShuZXcgRmlsZShuZXcgVVJJKHByb2R1Y3RSZXBvKSkKKyAgICAgICAgICAgICAgIC50b1VSSSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKQorICAgICAgICAgICAgICAgKyBVUkxFbmNvZGVyLmVuY29kZShwLmdldFByb2R1Y3ROYW1lKCksICJVVEYtOCIpICsgIi8iKTsKKyAgICAgICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQoZGlyUmVmZXJlbmNlKTsKKyAgICAgICAgIC8qIHdlJ2xsIGRvIGEgc2ltcGxlIHZlcnNpb25pbmcgc2NoZW1lIG91cnNlbHZlczogbm8gdmVyc2lvbmluZyEgKi8KKyAgICAgICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGRBbGwoCisgICAgICAgICAgICAgICBWZXJzaW9uaW5nVXRpbHMuZ2V0UmVmZXJlbmNlc0Zyb21EaXIobmV3IEZpbGUobmV3IFVSSSgKKyAgICAgICAgICAgICAgICAgICAgIGRpclJlZmVyZW5jZS5nZXRPcmlnUmVmZXJlbmNlKCkpKSkpOworICAgICAgICAgVmVyc2lvbmluZ1V0aWxzLmNyZWF0ZUJhc2ljRGF0YVN0b3JlUmVmc0hpZXJhcmNoaWNhbChwCisgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSk7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zZmVyVHlwZS5lcXVhbHMoImZpbGVzIikpIHsKKyAgICAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZSgiRmxhdCIpOworICAgICAgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZEFsbChmaWxlUmVmZXJlbmNlcyk7CisgICAgICAgICBWZXJzaW9uaW5nVXRpbHMuY3JlYXRlQmFzaWNEYXRhU3RvcmVSZWZzRmxhdChwcm9kdWN0TmFtZSwgcHJvZHVjdFJlcG8sCisgICAgICAgICAgICAgICBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworICAgICAgfQorCisgICAgICBEYXRhVHJhbnNmZXIgdHJhbnNmZXIgPSBuZXcgTG9jYWxEYXRhVHJhbnNmZXJlcigpOworICAgICAgdHJhbnNmZXIudHJhbnNmZXJQcm9kdWN0KHApOworCisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBjb3B5RGlyVG9EaXIoUHJvZHVjdCBwcm9kdWN0LCBGaWxlIGRpcmVjdG9yeSkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgIFJlZmVyZW5jZSBkaXJSZWYgPSAoUmVmZXJlbmNlKSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApOworICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgIExldmVsLklORk8sCisgICAgICAgICAgICAiTG9jYWxEYXRhVHJhbnNmZXJlcjogU3RhZ2luZyBEaXJlY3Rvcnk6ICIKKyAgICAgICAgICAgICAgICAgICsgZGlyUmVmLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpICsgIiBpbnRvIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBpID0gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGkKKyAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICBSZWZlcmVuY2UgciA9IGkubmV4dCgpOworICAgICAgICAgRmlsZSBmaWxlUmVmID0gbmV3IEZpbGUobmV3IFVSSShyLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSk7CisKKyAgICAgICAgIGlmIChmaWxlUmVmLmlzRmlsZSgpKSB7CisgICAgICAgICAgICBjb3B5RmlsZShyLCBkaXJlY3RvcnkpOworICAgICAgICAgfSBlbHNlIGlmIChmaWxlUmVmLmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICAgICYmIChmaWxlUmVmLmxpc3QoKSAhPSBudWxsICYmIGZpbGVSZWYubGlzdCgpLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgLy8gaWYgaXQncyBhIGRpcmVjdG9yeSBhbmQgaXQgZG9lc24ndCBleGlzdCB5ZXQsIHdlIHNob3VsZAorICAgICAgICAgICAgLy8gY3JlYXRlIGl0CisgICAgICAgICAgICAgLy8ganVzdCBpbiBjYXNlIHRoZXJlJ3Mgbm8gZmlsZXMgaW4gaXQKKyAgICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZShkaXJlY3RvcnksIGZpbGVSZWYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICBpZiAoIW5ldyBGaWxlKG5ldyBVUkkoZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSkpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsICJEaXJlY3Rvcnk6IFsiICsgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZG9lc24ndCBleGlzdDogY3JlYXRpbmcgaXQiKTsKKyAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5mb3JjZU1rZGlyKG5ldyBGaWxlKG5ldyBVUkkoZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSkpKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3QuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGluIGxvY2FsIGRhdGEgdHJhbnNmZXJlciIpOworCisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBtb3ZlRGlyVG9Qcm9kdWN0UmVwbyhQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBSZWZlcmVuY2UgZGlyUmVmID0gKFJlZmVyZW5jZSkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKTsKKyAgICAgIExPRy5sb2coCisgICAgICAgICAgICBMZXZlbC5JTkZPLAorICAgICAgICAgICAgIkxvY2FsRGF0YVRyYW5zZmVyZXI6IE1vdmluZyBEaXJlY3Rvcnk6ICIKKyAgICAgICAgICAgICAgICAgICsgZGlyUmVmLmdldE9yaWdSZWZlcmVuY2UoKSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgKyBkaXJSZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworCisgICAgICAvLyBub3RpZnkgdGhlIGZpbGUgbWFuYWdlciB0aGF0IHdlIHN0YXJ0ZWQKKyAgICAgIHF1aWV0Tm90aWZ5VHJhbnNmZXJQcm9kdWN0KHByb2R1Y3QpOworCisgICAgICBmb3IgKEl0ZXJhdG9yPFJlZmVyZW5jZT4gaSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpCisgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgUmVmZXJlbmNlIHIgPSBpLm5leHQoKTsKKyAgICAgICAgIEZpbGUgZmlsZVJlZiA9IG5ldyBGaWxlKG5ldyBVUkkoci5nZXRPcmlnUmVmZXJlbmNlKCkpKTsKKworICAgICAgICAgaWYgKGZpbGVSZWYuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIG1vdmVGaWxlKHIsIGZhbHNlKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoZmlsZVJlZi5pc0RpcmVjdG9yeSgpCisgICAgICAgICAgICAgICAmJiAoZmlsZVJlZi5saXN0KCkgIT0gbnVsbCAmJiBmaWxlUmVmLmxpc3QoKS5sZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBkaXJlY3RvcnkgYW5kIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LCB3ZSBzaG91bGQKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBpdAorICAgICAgICAgICAgLy8ganVzdCBpbiBjYXNlIHRoZXJlJ3Mgbm8gZmlsZXMgaW4gaXQKKyAgICAgICAgICAgICBpZiAoIW5ldyBGaWxlKG5ldyBVUkkoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsICJEaXJlY3Rvcnk6IFsiICsgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZG9lc24ndCBleGlzdDogY3JlYXRpbmcgaXQiKTsKKyAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5mb3JjZU1rZGlyKG5ldyBGaWxlKG5ldyBVUkkoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGluIGxvY2FsIGRhdGEgdHJhbnNmZXJlciIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBub3RpZnkgdGhlIGZpbGUgbWFuYWdlciB0aGF0IHdlJ3JlIGRvbmUKKyAgICAgIHF1aWV0Tm90aWZ5UHJvZHVjdFRyYW5zZmVyQ29tcGxldGUocHJvZHVjdCk7CisKKyAgIH0KKworICAgcHJpdmF0ZSB2b2lkIG1vdmVGaWxlc1RvUHJvZHVjdFJlcG8oUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCk7CisKKyAgICAgIC8vIG5vdGlmeSB0aGUgZmlsZSBtYW5hZ2VyIHRoYXQgd2Ugc3RhcnRlZAorICAgICAgcXVpZXROb3RpZnlUcmFuc2ZlclByb2R1Y3QocHJvZHVjdCk7CisKKyAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBpID0gcmVmcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgIFJlZmVyZW5jZSByID0gKFJlZmVyZW5jZSkgaS5uZXh0KCk7CisgICAgICAgICBtb3ZlRmlsZShyLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgLy8gbm90aWZ5IHRoZSBmaWxlIG1hbmFnZXIgdGhhdCB3ZSdyZSBkb25lCisgICAgICBxdWlldE5vdGlmeVByb2R1Y3RUcmFuc2ZlckNvbXBsZXRlKHByb2R1Y3QpOworICAgfQorCisgICBwcml2YXRlIHZvaWQgY29weUZpbGVzVG9EaXIoUHJvZHVjdCBwcm9kdWN0LCBGaWxlIGRpcmVjdG9yeSkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZzID0gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpOworICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGkgPSByZWZzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgUmVmZXJlbmNlIHIgPSAoUmVmZXJlbmNlKSBpLm5leHQoKTsKKyAgICAgICAgIGNvcHlGaWxlKHIsIGRpcmVjdG9yeSk7CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBtb3ZlRmlsZShSZWZlcmVuY2UgciwgYm9vbGVhbiBsb2cpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBpZiAobG9nKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLklORk8sCisgICAgICAgICAgICAgICAiTG9jYWxEYXRhVHJhbnNmZXI6IE1vdmluZyBGaWxlOiAiICsgci5nZXRPcmlnUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisgICAgICB9CisgICAgICBGaWxlIHNyY0ZpbGVSZWYgPSBuZXcgRmlsZShuZXcgVVJJKHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKSk7CisgICAgICBGaWxlIGRlc3RGaWxlUmVmID0gbmV3IEZpbGUobmV3IFVSSShyLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSk7CisKKyAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShzcmNGaWxlUmVmLCBkZXN0RmlsZVJlZik7CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBjb3B5RmlsZShSZWZlcmVuY2UgciwgRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBGaWxlIHNyY0ZpbGVSZWYgPSBuZXcgRmlsZShuZXcgVVJJKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICJMb2NhbERhdGFUcmFuc2ZlcjogQ29weWluZyBGaWxlOiAiICsgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICAgKyAiIHRvIGZpbGU6IiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIgorICAgICAgICAgICAgICAgICAgKyBzcmNGaWxlUmVmLmdldE5hbWUoKSk7CisgICAgICBGaWxlVXRpbHMuY29weUZpbGUoc3JjRmlsZVJlZiwgbmV3IEZpbGUoZGlyZWN0b3J5LCBzcmNGaWxlUmVmLmdldE5hbWUoKSkpOworICAgfQorCisgICBwcml2YXRlIHZvaWQgcXVpZXROb3RpZnlUcmFuc2ZlclByb2R1Y3QoUHJvZHVjdCBwKSB7CisgICAgICBpZiAoY2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICJGaWxlIE1hbmFnZXIgc2VydmljZSBub3QgZGVmaW5lZDogdGhpcyB0cmFuc2ZlciB3aWxsIG5vdCBiZSB0cmFja2VkIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGllbnQudHJhbnNmZXJyaW5nUHJvZHVjdChwKTsKKyAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9yIG5vdGlmeWluZyBmaWxlIG1hbmFnZXIgb2YgcHJvZHVjdCB0cmFuc2ZlciBpbml0aWF0aW9uIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBxdWlldE5vdGlmeVByb2R1Y3RUcmFuc2ZlckNvbXBsZXRlKFByb2R1Y3QgcCkgeworICAgICAgaWYgKGNsaWVudCA9PSBudWxsKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAiRmlsZSBNYW5hZ2VyIHNlcnZpY2Ugbm90IGRlZmluZWQ6IHRoaXMgdHJhbnNmZXIgd2lsbCBub3QgYmUgdHJhY2tlZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICAgY2xpZW50LnJlbW92ZVByb2R1Y3RUcmFuc2ZlclN0YXR1cyhwKTsKKyAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9yIG5vdGlmeWluZyBmaWxlIG1hbmFnZXIgb2YgcHJvZHVjdCB0cmFuc2ZlciBjb21wbGV0aW9uIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1JlbW90ZURhdGFUcmFuc2ZlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvUmVtb3RlRGF0YVRyYW5zZmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1JlbW90ZURhdGFUcmFuc2ZlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIGNvbnN0cnVjdGluZyB7QGxpbmsgUmVtb3RlRGF0YVRyYW5zZmVyZXJ9IG9iamVjdHMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFJlbW90ZURhdGFUcmFuc2ZlckZhY3RvcnkgaW1wbGVtZW50cyBEYXRhVHJhbnNmZXJGYWN0b3J5IHsKKworICAgIC8qIHRoZSBjaHVuayBzaXplIGZvciBzZW5kaW5nIGZpbGVzIHJlbW90ZWx5ICovCisgICAgcHJpdmF0ZSBpbnQgY2h1bmtTaXplID0gMDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihSZW1vdGVEYXRhVHJhbnNmZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVtb3RlRGF0YVRyYW5zZmVyRmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY2h1bmtTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnJlbW90ZS5jaHVua1NpemUiLAorICAgICAgICAgICAgICAgIDEwMjQpLmludFZhbHVlKCk7CisKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUmVtb3RlRGF0YVRyYW5zZmVyIGVuYWJsZWQ6IHVzaW5nIGNodW5rIHNpemU6IFsiCisgICAgICAgICAgICAgICAgKyBjaHVua1NpemUgKyAiXSIpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJGYWN0b3J5I2NyZWF0ZURhdGFUcmFuc2ZlcigpCisgICAgICovCisgICAgcHVibGljIERhdGFUcmFuc2ZlciBjcmVhdGVEYXRhVHJhbnNmZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVtb3RlRGF0YVRyYW5zZmVyZXIoY2h1bmtTaXplKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvUmVtb3RlRGF0YVRyYW5zZmVyZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvUmVtb3RlRGF0YVRyYW5zZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ExZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9SZW1vdGVEYXRhVHJhbnNmZXJlci5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkRhdGFUcmFuc2ZlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogICAgICAgICAgPHA+CisgKiAgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIERhdGFUcmFuc2Zlcn0gaW50ZXJmYWNlIHRoYXQKKyAqICAgICAgICAgIHRyYW5zZmVycyBmaWxlcyB0byBhIHJlbW90ZSBmaWxlIG1hbmFnZXIgb3ZlciBYTUwtUlBDLCB1c2luZyB0aGUKKyAqICAgICAgICAgIEZpbGUgTWFuYWdlciBDbGllbnQuCisgKiAgICAgICAgICA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFJlbW90ZURhdGFUcmFuc2ZlcmVyIGltcGxlbWVudHMgRGF0YVRyYW5zZmVyIHsKKworICAgLyoKKyAgICAqIHRoZSB1cmwgcG9pbnRlciB0byB0aGUgZmlsZSBtYW5hZ2VyIHRoYXQgd2UnbGwgcmVtb3RlbHkgdHJhbnNmZXIgdGhlIGZpbGUKKyAgICAqIHRvCisgICAgKi8KKyAgIHByaXZhdGUgVVJMIGZpbGVNYW5hZ2VyVXJsID0gbnVsbDsKKworICAgLyoKKyAgICAqIHRoZSBzaXplIG9mIHRoZSBjaHVua3MgdGhhdCBmaWxlcyBzaG91bGQgYmUgdHJhbnNmZXJyZWQgb3ZlciBYTUwtUlBDIHVzaW5nCisgICAgKi8KKyAgIHByaXZhdGUgaW50IGNodW5rU2l6ZSA9IDEwMjQ7CisKKyAgIC8qIG91ciBmaWxlIG1hbmFnZXIgY2xpZW50ICovCisgICBwcml2YXRlIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAuZ2V0TG9nZ2VyKFJlbW90ZURhdGFUcmFuc2ZlcmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgIC8qKgorICAgICAqIAorICAgICAqLworICAgcHVibGljIFJlbW90ZURhdGFUcmFuc2ZlcmVyKGludCBjaHVua1N6KSB7CisgICAgICB0aGlzLmNodW5rU2l6ZSA9IGNodW5rU3o7CisgICB9CisKKyAgIC8qCisgICAgKiAobm9uLUphdmFkb2MpCisgICAgKiAKKyAgICAqIEBzZWUKKyAgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyI3NldEZpbGVNYW5hZ2VyVXJsCisgICAgKiAoamF2YS5uZXQuVVJMKQorICAgICovCisgICBwdWJsaWMgdm9pZCBzZXRGaWxlTWFuYWdlclVybChVUkwgdXJsKSB7CisgICAgICB0cnkgeworICAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KHVybCk7CisgICAgICAgICB0aGlzLmZpbGVNYW5hZ2VyVXJsID0gdXJsOworICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUmVtb3RlIERhdGEgVHJhbnNmZXIgdG86IFsiCisgICAgICAgICAgICAgICArIGNsaWVudC5nZXRGaWxlTWFuYWdlclVybCgpLnRvU3RyaW5nKCkgKyAiXSBlbmFibGVkIik7CisgICAgICB9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkNvbm5lY3Rpb24gZXhjZXB0aW9uIGZvciBmaWxlbWdyOiBbIiArIHVybAorICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgfQorICAgfQorCisgICAvKgorICAgICogKG5vbi1KYXZhZG9jKQorICAgICogCisgICAgKiBAc2VlCisgICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlciN0cmFuc2ZlclByb2R1Y3QoCisgICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0KQorICAgICovCisgICBwdWJsaWMgdm9pZCB0cmFuc2ZlclByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLAorICAgICAgICAgSU9FeGNlcHRpb24geworCisgICAgICBpZiAoZmlsZU1hbmFnZXJVcmwgPT0gbnVsbCkgeworICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJObyBmaWxlIG1hbmFnZXIgdXJsIHNwZWNpZmllZCBmb3IgcmVtb3RlIGRhdGEgdHJhbnNmZXI6IGNhbm5vdCB0cmFuc2ZlciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiXSEiKTsKKyAgICAgIH0KKworICAgICAgcXVpZXROb3RpZnlUcmFuc2ZlclByb2R1Y3QocHJvZHVjdCk7CisKKyAgICAgIC8vIGZvciBlYWNoIGZpbGUgcmVmZXJlbmNlLCB0cmFuc2ZlciB0aGUgZmlsZSB0byB0aGUgcmVtb3RlIGZpbGUgbWFuYWdlcgorICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGkgPSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgIFJlZmVyZW5jZSByID0gaS5uZXh0KCk7CisgICAgICAgICAvLyB0ZXN0IHdoZXRoZXIgb3Igbm90IHRoZSByZWZlcmVuY2UgaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlCisgICAgICAgICBGaWxlIHJlZkZpbGUgPSBudWxsOworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZkZpbGUgPSBuZXcgRmlsZShuZXcgVVJJKHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKSk7CisgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byB0ZXN0IGlmIHJlZmVyZW5jZTogWyIgKyByLmdldE9yaWdSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBhIGRpcmVjdG9yeTogc2tpcHBpbmcgaXQiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoIXJlZkZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiUmVmZXJlbmNlOiBbIiArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICArICJdIGlzIGZpbGU6IHRyYW5zZmVycmluZyBpdCIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgcmVtb3RlVHJhbnNmZXIociwgcHJvZHVjdCk7CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHRyYW5zZmVycmluZyBmaWxlOiBbIiArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBVUklTeW50YXhFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgICAgICAgIExldmVsLkZJTkUsCisgICAgICAgICAgICAgICAgICAiUmVtb3RlVHJhbnNmZXI6IHNraXBwaW5nIHJlZmVyZW5jZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIG9mIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICJdOiByZWYgaXMgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcXVpZXROb3RpZnlQcm9kdWN0VHJhbnNmZXJDb21wbGV0ZShwcm9kdWN0KTsKKworICAgfQorCisgICAvKgorICAgICogKG5vbi1KYXZhZG9jKQorICAgICogCisgICAgKiBAc2VlCisgICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlciNyZXRyaWV2ZVByb2R1Y3Qob3JnLgorICAgICogYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0LCBqYXZhLmlvLkZpbGUpCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHJldHJpZXZlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QsIEZpbGUgZGlyZWN0b3J5KQorICAgICAgICAgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgZm9yIChSZWZlcmVuY2UgcmVmZXJlbmNlIDogcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKSB7CisgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZPdXQgPSBudWxsOworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZGF0YVN0b3JlRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkkoCisgICAgICAgICAgICAgICAgICByZWZlcmVuY2UuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKTsKKyAgICAgICAgICAgIEZpbGUgZGVzdCA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgZGF0YVN0b3JlRmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgZk91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QsIGZhbHNlKTsKKyAgICAgICAgICAgIExPRy5sb2coCisgICAgICAgICAgICAgICAgICBMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgIlJlbW90ZURhdGFUcmFuc2ZlcjogQ29weWluZyBGaWxlOiAiICsgImZtcDoiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFTdG9yZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHRvICIgKyAiZmlsZToiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgYnl0ZVtdIGZpbGVEYXRhID0gbnVsbDsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgIGZpbGVEYXRhID0gKGJ5dGVbXSkgY2xpZW50LnJldHJpZXZlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgIGRhdGFTdG9yZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG9mZnNldCwgMTAyNCk7CisgICAgICAgICAgICAgICBpZiAoZmlsZURhdGEubGVuZ3RoIDw9IDApCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGZPdXQud3JpdGUoZmlsZURhdGEpOworICAgICAgICAgICAgICAgaWYgKGZpbGVEYXRhLmxlbmd0aCA8IDEwMjQpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIG9mZnNldCArPSAxMDI0OworICAgICAgICAgICAgfQorICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oIiIsIGUpOworICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICBmT3V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGRlbGV0ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgIGZvciAoUmVmZXJlbmNlIHJlZiA6IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSkgeworICAgICAgIEZpbGUgZGF0YUZpbGUgPSBuZXcgRmlsZShVUkkuY3JlYXRlKHJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkudG9VUkwoKS5nZXRQYXRoKCkpOworICAgICAgIGlmICghZGF0YUZpbGUuZGVsZXRlKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBkZWxldGUgZmlsZSAlcyAtIGRlbGV0ZSByZXR1cm5lZCBmYWxzZSIsCisgICAgICAgICAgICBkYXRhRmlsZSkpOworICAgICAgIH0KKyAgICAgfQorICAgfQorICAgCisgICBwcml2YXRlIHZvaWQgcmVtb3RlVHJhbnNmZXIoUmVmZXJlbmNlIHJlZmVyZW5jZSwgUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAvLyBnZXQgdGhlIGZpbGUgcGF0aAorICAgICAgRmlsZSBvcmlnRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkkocmVmZXJlbmNlLmdldE9yaWdSZWZlcmVuY2UoKSkpOworICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKG5ldyBVUkkocmVmZXJlbmNlLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSk7CisgICAgICBTdHJpbmcgb3JpZ0ZpbGVQYXRoID0gb3JpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICBTdHJpbmcgZGVzdEZpbGVQYXRoID0gZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgIC8vIHJlYWQgdGhlIGZpbGUgaW4gY2h1bmsgYnkgY2h1bmsKKworICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2NodW5rU2l6ZV07CisKKyAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob3JpZ0ZpbGUpOworICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICBpbnQgbnVtQnl0ZXMgPSAwOworCisgICAgICAgICAvLyByZW1vdmUgdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHM6IHRoaXMgb3BlcmF0aW9uCisgICAgICAgICAvLyBpcyBhbiBvdmVyd3JpdGUKKyAgICAgICAgIGlmICghY2xpZW50LnJlbW92ZUZpbGUoZGVzdEZpbGVQYXRoKSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgIlJlbW90ZURhdGFUcmFuc2ZlcjogYXR0ZW1wdCB0byBwZXJmb3JtIG92ZXJ3cml0ZSBvZiBkZXN0IGZpbGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3RGaWxlUGF0aCArICJdIGZhaWxlZCIpOworICAgICAgICAgfQorCisgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzID0gaXMucmVhZChidWYsIG9mZnNldCwgY2h1bmtTaXplKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGNsaWVudC50cmFuc2ZlckZpbGUoZGVzdEZpbGVQYXRoLCBidWYsIG9mZnNldCwgbnVtQnl0ZXMpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9yIG9wZW5pbmcgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZmlsZSB0byB0cmFuc2ZlcjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChEYXRhVHJhbnNmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAiRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHdoZW4gdHJhbnNmZXJpbmcgZmlsZTogWyIgKyBvcmlnRmlsZVBhdGgKKyAgICAgICAgICAgICAgICAgICAgICsgIl0gdG8gWyIgKyBkZXN0RmlsZVBhdGggKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpcyA9IG51bGw7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBxdWlldE5vdGlmeVRyYW5zZmVyUHJvZHVjdChQcm9kdWN0IHApIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGllbnQudHJhbnNmZXJyaW5nUHJvZHVjdChwKTsKKyAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9yIG5vdGlmeWluZyBmaWxlIG1hbmFnZXIgb2YgcHJvZHVjdCB0cmFuc2ZlciBpbml0aWF0aW9uIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBxdWlldE5vdGlmeVByb2R1Y3RUcmFuc2ZlckNvbXBsZXRlKFByb2R1Y3QgcCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaWVudC5yZW1vdmVQcm9kdWN0VHJhbnNmZXJTdGF0dXMocCk7CisgICAgICB9IGNhdGNoIChEYXRhVHJhbnNmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICJFcnJvciBub3RpZnlpbmcgZmlsZSBtYW5hZ2VyIG9mIHByb2R1Y3QgdHJhbnNmZXIgY29tcGxldGlvbiBmb3IgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0SWQoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1MzRGF0YVRyYW5zZmVyZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvUzNEYXRhVHJhbnNmZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjEzOGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1MzRGF0YVRyYW5zZmVyZXIuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFtYXpvbmF3cy5zZXJ2aWNlcy5zMy5tb2RlbC5PYmplY3RNZXRhZGF0YS5BRVNfMjU2X1NFUlZFUl9TSURFX0VOQ1JZUFRJT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkRhdGFUcmFuc2ZlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EuaW8uSU9VdGlsczsKKworaW1wb3J0IGNvbS5hbWF6b25hd3MuQW1hem9uQ2xpZW50RXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMuQW1hem9uUzM7CitpbXBvcnQgY29tLmFtYXpvbmF3cy5zZXJ2aWNlcy5zMy5tb2RlbC5EZWxldGVPYmplY3RSZXF1ZXN0OworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMubW9kZWwuR2V0T2JqZWN0UmVxdWVzdDsKK2ltcG9ydCBjb20uYW1hem9uYXdzLnNlcnZpY2VzLnMzLm1vZGVsLk9iamVjdE1ldGFkYXRhOworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMubW9kZWwuUHV0T2JqZWN0UmVxdWVzdDsKK2ltcG9ydCBjb20uYW1hem9uYXdzLnNlcnZpY2VzLnMzLm1vZGVsLlMzT2JqZWN0OworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMubW9kZWwuUzNPYmplY3RJbnB1dFN0cmVhbTsKKworLyoqCisgKiB7QGxpbmsgRGF0YVRyYW5zZmVyfSB3aGljaCBwdXQvZ2V0cyBmaWxlcyBpbi9mcm9tIEFtYXpvbiBTMyBzdG9yYWdlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXJAYXBhY2hlLm9yZyAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUzNEYXRhVHJhbnNmZXJlciBpbXBsZW1lbnRzIERhdGFUcmFuc2ZlciB7CisKKwlwcml2YXRlIGZpbmFsIEFtYXpvblMzIHMzQ2xpZW50OworCXByaXZhdGUgZmluYWwgU3RyaW5nIGJ1Y2tldE5hbWU7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuY3J5cHQ7CisKKwlwdWJsaWMgUzNEYXRhVHJhbnNmZXJlcihBbWF6b25TMyBzM0NsaWVudCwgU3RyaW5nIGJ1Y2tldE5hbWUsIGJvb2xlYW4gZW5jcnlwdCkgeworCQl0aGlzLnMzQ2xpZW50ID0gY2hlY2tOb3ROdWxsKHMzQ2xpZW50KTsKKwkJdGhpcy5idWNrZXROYW1lID0gY2hlY2tOb3ROdWxsKGJ1Y2tldE5hbWUpOworCQl0aGlzLmVuY3J5cHQgPSBlbmNyeXB0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZpbGVNYW5hZ2VyVXJsKFVSTCB1cmwpIHt9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0cmFuc2ZlclByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWZvciAoUmVmZXJlbmNlIHJlZiA6IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSkgeworICAgICAgU3RyaW5nIG9yaWdSZWYgPSBzdHJpcFByb3RvY29sKHJlZi5nZXRPcmlnUmVmZXJlbmNlKCksIGZhbHNlKTsKKwkJICBTdHJpbmcgZGF0YVN0b3JlUmVmID0gc3RyaXBQcm90b2NvbChyZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCksIHRydWUpOworCQkJdHJ5IHsKKwkJCSAgUHV0T2JqZWN0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFB1dE9iamVjdFJlcXVlc3QoCisJCQkgICAgICBidWNrZXROYW1lLCBkYXRhU3RvcmVSZWYsIG5ldyBGaWxlKG9yaWdSZWYpKTsKKwkJCSAgaWYgKGVuY3J5cHQpIHsKKyAgCQkJCU9iamVjdE1ldGFkYXRhIHJlcXVlc3RNZXRhZGF0YSA9IG5ldyBPYmplY3RNZXRhZGF0YSgpOworICAJCQkJcmVxdWVzdE1ldGFkYXRhLnNldFNlcnZlclNpZGVFbmNyeXB0aW9uKEFFU18yNTZfU0VSVkVSX1NJREVfRU5DUllQVElPTik7ICAgICAKKyAgCQkJCXJlcXVlc3Quc2V0TWV0YWRhdGEocmVxdWVzdE1ldGFkYXRhKTsKKwkJCSAgfQorICAgICAgICBzM0NsaWVudC5wdXRPYmplY3QocmVxdWVzdCk7CisJCQl9IGNhdGNoIChBbWF6b25DbGllbnRFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKwkJCQkgICAgIkZhaWxlZCB0byB1cGxvYWQgcHJvZHVjdCByZWZlcmVuY2UgJXMgdG8gUzMgYXQgJXMiLCBvcmlnUmVmLAorCQkJCSAgICBkYXRhU3RvcmVSZWYpLCBlKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJldHJpZXZlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QsIEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLAorCSAgICBJT0V4Y2VwdGlvbiB7CisJCWZvciAoUmVmZXJlbmNlIHJlZiA6IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSkgeworICAgICAgR2V0T2JqZWN0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IEdldE9iamVjdFJlcXVlc3QoYnVja2V0TmFtZSwgc3RyaXBQcm90b2NvbCgKKyAgICAgICAgICByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCksIHRydWUpKTsKKwkJCVMzT2JqZWN0IGZpbGUgPSBzM0NsaWVudC5nZXRPYmplY3QocmVxdWVzdCk7CisJCQlzdGFnZUZpbGUoZmlsZSwgcmVmLCBkaXJlY3RvcnkpOworCQl9CisJfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkZWxldGVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGZvciAoUmVmZXJlbmNlIHJlZiA6IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSkgeworICAgICAgRGVsZXRlT2JqZWN0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IERlbGV0ZU9iamVjdFJlcXVlc3QoYnVja2V0TmFtZSwgc3RyaXBQcm90b2NvbCgKKyAgICAgICAgICByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCksIHRydWUpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHMzQ2xpZW50LmRlbGV0ZU9iamVjdChyZXF1ZXN0KTsKKyAgICAgIH0gY2F0Y2ggKEFtYXpvbkNsaWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJGYWlsZWQgdG8gZGVsZXRlIHByb2R1Y3QgcmVmZXJlbmNlICVzIGZyb20gUzMiLCByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCXByaXZhdGUgdm9pZCBzdGFnZUZpbGUoUzNPYmplY3QgZmlsZSwgUmVmZXJlbmNlIHJlZiwgRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVMzT2JqZWN0SW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOworCQlGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG51bGw7CisJCXRyeSB7CisJCQlpblN0cmVhbSA9IGZpbGUuZ2V0T2JqZWN0Q29udGVudCgpOworCQkJb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGlyZWN0b3J5LCBuZXcgRmlsZSgKKwkJCSAgICBzdHJpcFByb3RvY29sKHJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwgZmFsc2UpKS5nZXROYW1lKCkpKTsKKwkJCUlPVXRpbHMuY29weShpblN0cmVhbSwgb3V0U3RyZWFtKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7IGluU3RyZWFtLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQkJdHJ5IHsgb3V0U3RyZWFtLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgc3RyaXBQcm90b2NvbChTdHJpbmcgcmVmLCBib29sZWFuIHN0cmlwTGVhZGluZ1NlcGFyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkgIHRyeSB7CisgICAgICBTdHJpbmcgcGF0aCA9IG5ldyBVUkkocmVmKS5nZXRQYXRoKCk7CisgICAgICBpZiAoc3RyaXBMZWFkaW5nU2VwYXJhdG9yKSB7CisgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoIl4vIiwgIiIpOworICAgICAgfQorICAgICAgcmV0dXJuIHBhdGg7CisgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9TM0RhdGFUcmFuc2ZlcmVyRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9TM0RhdGFUcmFuc2ZlcmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4N2RkMzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1MzRGF0YVRyYW5zZmVyZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7CisKK2ltcG9ydCBjb20uYW1hem9uYXdzLmF1dGguQmFzaWNBV1NDcmVkZW50aWFsczsKK2ltcG9ydCBjb20uYW1hem9uYXdzLnJlZ2lvbnMuUmVnaW9uOworaW1wb3J0IGNvbS5hbWF6b25hd3MucmVnaW9ucy5SZWdpb25zOworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMuQW1hem9uUzNDbGllbnQ7CisKKy8qKgorICoge0BsaW5rIERhdGFUcmFuc2ZlckZhY3Rvcnl9IHdoaWNoIGNyZWF0ZXMge0BsaW5rIFMzRGF0YVRyYW5zZmVyZXJ9cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyQGFwYWNoZS5vcmcgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFMzRGF0YVRyYW5zZmVyZXJGYWN0b3J5IGltcGxlbWVudHMgRGF0YVRyYW5zZmVyRmFjdG9yeSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVDS0VUX05BTUVfUFJPUEVSVFkgPQorCQkJIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuYnVja2V0Lm5hbWUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJT05fUFJPUEVSVFkgPQorCQkJIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMucmVnaW9uIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0tFWV9QUk9QRVJUWSA9CisJCQkib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5hY2Nlc3Mua2V5IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDUkVUX0tFWV9QUk9QRVJUWSA9CisJCQkib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5zZWNyZXQua2V5IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ1JZUFRfUFJPUEVSVFkgPQorICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuZW5jcnlwdCI7CisKKwlAT3ZlcnJpZGUKKyAgcHVibGljIFMzRGF0YVRyYW5zZmVyZXIgY3JlYXRlRGF0YVRyYW5zZmVyKCkgeworCQlTdHJpbmcgYnVja2V0TmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShCVUNLRVRfTkFNRV9QUk9QRVJUWSk7CisJCVN0cmluZyByZWdpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUkVHSU9OX1BST1BFUlRZKTsJCQorCQlTdHJpbmcgYWNjZXNzS2V5ID0gU3lzdGVtLmdldFByb3BlcnR5KEFDQ0VTU19LRVlfUFJPUEVSVFkpOworICAgIFN0cmluZyBzZWNyZXRLZXkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU0VDUkVUX0tFWV9QUk9QRVJUWSk7CisgICAgYm9vbGVhbiBlbmNyeXB0ID0gQm9vbGVhbi5nZXRCb29sZWFuKEVOQ1JZUFRfUFJPUEVSVFkpOworCisJCUFtYXpvblMzQ2xpZW50IHMzID0gbmV3IEFtYXpvblMzQ2xpZW50KG5ldyBCYXNpY0FXU0NyZWRlbnRpYWxzKGFjY2Vzc0tleSwgc2VjcmV0S2V5KSk7CisgICAgczMuc2V0UmVnaW9uKFJlZ2lvbi5nZXRSZWdpb24oUmVnaW9ucy52YWx1ZU9mKHJlZ2lvbikpKTsKKworICAgIHJldHVybiBuZXcgUzNEYXRhVHJhbnNmZXJlcihzMywgYnVja2V0TmFtZSwgZW5jcnlwdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVHJhbnNmZXJTdGF0dXNUcmFja2VyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1RyYW5zZmVyU3RhdHVzVHJhY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjg2MjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1RyYW5zZmVyU3RhdHVzVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRmlsZVRyYW5zZmVyU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkYXRhIHRyYW5zZmVycyB0aGF0IHVzZXMgYW4gaW4tbWVtb3J5IEhhc2hNYXAgdG8KKyAqIGtlZXAgdHJhY2sgb2YgZGF0YSB0cmFuc2ZlciBzdGF0dXMgaW5mb3JtYXRpb24uCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRyYW5zZmVyU3RhdHVzVHJhY2tlciB7CisgICAgLyogSGFzaE1hcCBjb250YWluaW5nIGEgbGlzdCBvZiBjdXJyZW50IHByb2R1Y3QgdHJhbnNmZXJzICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBQcm9kdWN0PiBjdXJyZW50UHJvZHVjdFRyYW5zZmVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvZHVjdD4oKTsKKworICAgIC8qIG91ciBjYXRhbG9nIG9iamVjdCAqLworICAgIHByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoVHJhbnNmZXJTdGF0dXNUcmFja2VyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYXRhbG9nCisgICAgICogICAgICAgICAgICBUaGUgQ2F0YWxvZyBpbnRlcmZhY2UgaGFuZGVkIHRvIGl0IGJ5IHRoZSBGaWxlIE1hbmFnZXIuIEl0CisgICAgICogICAgICAgICAgICBuZWVkcyB0aGlzIG9iamVjdCB0byBsb29rIHVwIHJlZmVyZW5jZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJhbnNmZXJTdGF0dXNUcmFja2VyKENhdGFsb2cgY2F0YWxvZykgeworICAgICAgICB0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlVHJhbnNmZXJTdGF0dXMgZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcigpIHsKKyAgICAgICAgTGlzdDxGaWxlVHJhbnNmZXJTdGF0dXM+IHRyYW5zZmVycyA9IGdldEN1cnJlbnRGaWxlVHJhbnNmZXJzKCk7CisKKyAgICAgICAgaWYgKHRyYW5zZmVycyAhPSBudWxsICYmIHRyYW5zZmVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gKEZpbGVUcmFuc2ZlclN0YXR1cykgdHJhbnNmZXJzLmdldCgwKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cmFuc2ZlcnJpbmdQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgeworICAgICAgICBjdXJyZW50UHJvZHVjdFRyYW5zZmVycy5wdXQocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSwgcHJvZHVjdCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RmlsZVRyYW5zZmVyU3RhdHVzPiBnZXRDdXJyZW50RmlsZVRyYW5zZmVycygpIHsKKyAgICAgICAgTGlzdDxGaWxlVHJhbnNmZXJTdGF0dXM+IGN1cnJUcmFuc2ZlcnMgPSBuZXcgVmVjdG9yPEZpbGVUcmFuc2ZlclN0YXR1cz4oKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGN1cnJlbnRQcm9kdWN0VHJhbnNmZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkKKyAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IGkubmV4dCgpOworICAgICAgICAgICAgUHJvZHVjdCBwID0gKFByb2R1Y3QpIGN1cnJlbnRQcm9kdWN0VHJhbnNmZXJzLmdldChwcm9kdWN0SWQpOworCisgICAgICAgICAgICAvLyBnZXQgaXRzIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZzID0gcXVpZXRHZXRSZWZlcmVuY2VzKHApOworCisgICAgICAgICAgICBpZiAocmVmcyAhPSBudWxsICYmIHJlZnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBqID0gcmVmcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSBqLm5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICBsb25nIGJ5dGVzVHJhbnNmZXJyZWQgPSBnZXRCeXRlc1RyYW5zZmVycmVkKHIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1RyYW5zZmVycmVkID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVzVHJhbnNmZXJyZWQgPCByLmdldEZpbGVTaXplKCkgJiYgIWlzRGlyKHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gbmV3IEZpbGVUcmFuc2ZlclN0YXR1cygpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldEJ5dGVzVHJhbnNmZXJyZWQoYnl0ZXNUcmFuc2ZlcnJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0RmlsZVJlZihyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRQYXJlbnRQcm9kdWN0KHApOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyclRyYW5zZmVycy5hZGQoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjdXJyVHJhbnNmZXJzOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0UGN0VHJhbnNmZXJyZWQoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgIC8vIGdldCBpdHMgcmVmZXJlbmNlcworICAgICAgICBMaXN0PFJlZmVyZW5jZT4gcmVmcyA9IHF1aWV0R2V0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICAgICAgbG9uZyB0b3RhbEJ5dGVzVHJhbnNmZXJyZWQgPSAwTDsKKyAgICAgICAgbG9uZyB0b3RhbFByb2R1Y3RTaXplID0gMEw7CisKKyAgICAgICAgaWYgKHJlZnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGogPSByZWZzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZSByID0gKFJlZmVyZW5jZSkgai5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBsb25nIGJ5dGVzVHJhbnNmZXJyZWQgPSBnZXRCeXRlc1RyYW5zZmVycmVkKHIpOworCisgICAgICAgICAgICAgICAgaWYgKCFpc0RpcihyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFkZCB0aGlzIGlmID4gMAorICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNUcmFuc2ZlcnJlZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNUcmFuc2ZlcnJlZCArPSBieXRlc1RyYW5zZmVycmVkOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoaXMgbm8gbWF0dGVyIHdoYXQKKyAgICAgICAgICAgICAgICAgICAgdG90YWxQcm9kdWN0U2l6ZSArPSByLmdldEZpbGVTaXplKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKChkb3VibGUpICgoMS4wICogdG90YWxCeXRlc1RyYW5zZmVycmVkKSAvICgxLjAgKiB0b3RhbFByb2R1Y3RTaXplKSkpOworCisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRQY3RUcmFuc2ZlcnJlZChSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGxvbmcgYnl0ZXNUcmFuc2ZlcnJlZCA9IGdldEJ5dGVzVHJhbnNmZXJyZWQocmVmKTsKKyAgICAgICAgcmV0dXJuICgoZG91YmxlKSAoKDEuMCAqIGJ5dGVzVHJhbnNmZXJyZWQpIC8gKDEuMCAqIHJlZi5nZXRGaWxlU2l6ZSgpKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2R1Y3RUcmFuc2ZlclN0YXR1cyhQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRQcm9kdWN0VHJhbnNmZXJzLmdldChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJyZW50UHJvZHVjdFRyYW5zZmVycy5yZW1vdmUocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zZmVyQ29tcGxldGUoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgIHJldHVybiBnZXRQY3RUcmFuc2ZlcnJlZChwcm9kdWN0KSA9PSAxLjA7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldEJ5dGVzVHJhbnNmZXJyZWQoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUobmV3IFVSSShyLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSk7CisgICAgICAgICAgICBsb25nIGJ5dGVzVHJhbnNmZXJyZWQgPSBkZXN0RmlsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHJldHVybiBieXRlc1RyYW5zZmVycmVkOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiVVJJU3ludGF4RXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgc2l6ZSBvZiBkZXN0RmlsZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIC0xTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSZWZlcmVuY2U+IHF1aWV0R2V0UmVmZXJlbmNlcyhQcm9kdWN0IHApIHsKKyAgICAgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWZzID0gY2F0YWxvZy5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgcmV0cmVpdmluZyByZWZlcmVuY2VzIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdElkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXSBmcm9tIGNhdGFsb2cgaW4gdHJhbnNmZXIgc3RhdHVzIHRyYWNrZXI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZWZzID0gbmV3IFZlY3RvcjxSZWZlcmVuY2U+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVmczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXIoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgRmlsZSBmaWxlUmVmID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZVJlZiA9IG5ldyBGaWxlKG5ldyBVUkkoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpOworICAgICAgICAgICAgcmV0dXJuIGZpbGVSZWYuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvQWJzdHJhY3RDYWNoZVNlcnZlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvQWJzdHJhY3RDYWNoZVNlcnZlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzhlYWNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9BYnN0cmFjdENhY2hlU2VydmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENhY2hlU2VydmVyRmFjdG9yeSBpbXBsZW1lbnRzIENhY2hlRmFjdG9yeSB7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJhbmdlUXVlcnlFbGVtZW50TmFtZTsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgcmFuZ2VTdGFydERhdGVUaW1lOworCisgICAgcHJvdGVjdGVkIFN0cmluZyByYW5nZUVuZERhdGVUaW1lOworCisgICAgcHJvdGVjdGVkIFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZTsKKworICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gcHJvZHVjdFR5cGVOYW1lczsKKworICAgIHByb3RlY3RlZCBVUkwgZm1Vcmw7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RDYWNoZVNlcnZlckZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJhbmdlUXVlcnlFbGVtZW50TmFtZSA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5yYW5nZVF1ZXJ5RWxlbWVudE5hbWUiKTsKKworICAgICAgICAvLyBiZWZvcmUgd2UgcmVwbGFjZSBlbnYgdmFycywgdHJ5IHRvIHJlcGxhY2UgZGF0ZSB2YXJzCisgICAgICAgIHJhbmdlU3RhcnREYXRlVGltZSA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5yYW5nZS5zdGFydCIpOworICAgICAgICByYW5nZUVuZERhdGVUaW1lID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLnJhbmdlLmVuZCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZVN0YXJ0RGF0ZVRpbWUgPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgLmRvRHluYW1pY1JlcGxhY2VtZW50KHJhbmdlU3RhcnREYXRlVGltZSk7CisgICAgICAgICAgICByYW5nZUVuZERhdGVUaW1lID0gUGF0aFV0aWxzLmRvRHluYW1pY1JlcGxhY2VtZW50KHJhbmdlRW5kRGF0ZVRpbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdW5pcXVlRWxlbWVudE5hbWUgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuY2FjaGUudW5pcXVlRWxlbWVudE5hbWUiKTsKKyAgICAgICAgcHJvZHVjdFR5cGVOYW1lcyA9IEFycmF5cy5hc0xpc3QoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImNhY2hlLnByb2R1Y3RUeXBlIikpLnNwbGl0KCIsIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbVVybCA9IG5ldyBVUkwoCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5maWxlbWdyLnVybCIpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNvbnN0cnVjdCBmaWxlIG1hbmFnZXIgdXJsIGZvcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLmZpbGVtZ3IudXJsIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBtYWxmb3JtZWQgVVJMIGV4Y2VwdGlvbi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZUZhY3RvcnkjY3JlYXRlQ2FjaGUoKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDYWNoZSBjcmVhdGVDYWNoZSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0NhY2hlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhODU3OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvQ2FjaGUuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhY2hlRXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBjb3JlIGludGVyZmFjZSBmb3IgYSBjYWNoZSBvZiB7QGxpbmsgUHJvZHVjdH1zIChpZGVudGlmaWVkIGJ5IGEKKyAqIHBhcnRpY3VsYXIgPGNvZGU+dW5pcXVlRWxlbWVudDwvY29kZT4pIGZyb20gYSBGaWxlIE1hbmFnZXIuCisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIENhY2hlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVU5JUVVFX01FVF9LRVkgPSAiQ0FTLlByb2R1Y3ROYW1lIjsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY3VycmVudCBjYWNoZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBiZWZvcmUgYSByZS17QGxpbmsgI3N5bmMoU3RyaW5nLCBTdHJpbmcpKX0KKyAgICAgKiBvY2N1cnMuCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgY2FjaGUgdG8gZGV0ZXJtaW5lIGlmIGEge0BsaW5rIFByb2R1Y3R9IHdpdGggdGhlIGdpdmVuCisgICAgICogPGNvZGU+cHJvZHVjdE5hbWU8L2NvZGU+IGV4aXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgUHJvZHVjdH0gdG8gY2hlY2sgZm9yIGluIHRoZSBDYWNoZS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHtAbGluayBQcm9kdWN0fSBpcyBmb3VkbiBpbiB0aGUgQ2FjaGUsIEZhbHNlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBwcm9kdWN0TmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHtAbGluayBVUkx9IHRvIHRoZSBGaWxlIE1hbmFnZXIgdG8gY29ubmVjdCB0aGlzIENhY2hlIHRvLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmbVVybAorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBVUkx9IG9mIHRoZSBGaWxlIE1hbmFnZXIgdG8gY2FjaGUge0BsaW5rIFByb2R1Y3R9cworICAgICAqICAgICAgICAgICAgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTWFuYWdlcihVUkwgZm1VcmwpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgc2l6ZSBvZiB0aGUgY3VycmVudCB7QGxpbmsgUHJvZHVjdH0gY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCk7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZXMgdGhpcyBDYWNoZSB3aXRoIHRoZSBGaWxlIE1hbmFnZXIgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAqIHtAbGluayAjc2V0RmlsZU1hbmFnZXIoVVJMKX0gbWV0aG9kLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcworICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBMaXN0fSB7QGxpbmsgUHJvZHVjdFR5cGV9cyB0byBjYWNoZQorICAgICAqICAgICAgICAgICAge0BsaW5rIFByb2R1Y3R9cyBmcm9tLgorICAgICAqIEB0aHJvd3MgQ2FjaGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhbnkgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luYyhMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMpIHRocm93cyBDYWNoZUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplcyB0aGlzIENhY2hlIHdpdGggdGhlIEZpbGUgTWFuYWdlciBzcGVjaWZpZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNzZXRGaWxlTWFuYWdlcihVUkwpfSBtZXRob2QuCisgICAgICogCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbWV0IGtleSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgZGV0ZXJtaW5pbmcge0BsaW5rIFByb2R1Y3R9CisgICAgICogICAgICAgICAgICBleGlzdGFuY2UgKGlmIGRpZmZlcmVudCB0aGFuIHtAdmFsdWUgI0RFRkFVTFRfVU5JUVVFX01FVF9LRVl9KS4KKyAgICAgKiBAcGFyYW0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3RUeXBlfXMgdG8gY2FjaGUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQcm9kdWN0fXMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIENhY2hlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYW55IGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmMoU3RyaW5nIHVuaXF1ZUVsZW1lbnROYW1lLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKSB0aHJvd3MgQ2FjaGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZXMgdGhpcyBDYWNoZSB3aXRoIHRoZSBGaWxlIE1hbmFnZXIgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAqIHtAbGluayAjc2V0RmlsZU1hbmFnZXIoVVJMKX0gbWV0aG9kLiBUaGlzIG1ldGhvZCBhbHNvIGFzc3VtZXMgdGhhdCB0aGUKKyAgICAgKiB1bmlxdWUgZWxlbWVudCAoaWRlbnRpZmllZCBieSB7QGxpbmsgI3NldFVuaXF1ZUVsZW1lbnROYW1lKFN0cmluZyl9IGFuZAorICAgICAqIHRoZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3RUeXBlfXMgaGF2ZSBhbHNvIGJlZW4gc2V0IGFwcHJvcHJpYXRlCisgICAgICogKGUuZy4sIGJ5IHVzaW5nIHtAbGluayAjc2V0VW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMoTGlzdCl9LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2FjaGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmMoKSB0aHJvd3MgQ2FjaGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lcyBvZiB0aGUge0BsaW5rIFByb2R1Y3RUeXBlfXMgdG8gY2FjaGUuCisgICAgICogCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzCisgICAgICogICAgICAgICAgICBBIHtAbGluayBMaXN0fSBvZiBqYXZhLnV0aWwuU3RyaW5nIG5hbWVzIG9mCisgICAgICogICAgICAgICAgICB7QGxpbmsgUHJvZHVjdFR5cGV9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcygKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXQgZWxlbWVudCB0byB1c2UgYXMgdGhlIGlkZW50aWZpZXIgb2YgYQorICAgICAqIHtAbGluayBQcm9kdWN0fSBmb3IgdXNlIGluIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIFByb2R1Y3QgaXMgaW4gdGhlCisgICAgICogQ2FjaGUuCisgICAgICogCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbWV0IGVsZW1lbnQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeQorICAgICAqICAgICAgICAgICAge0BsaW5rIFByb2R1Y3R9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVFbGVtZW50TmFtZShTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIFVSTH0gb2YgdGhlIEZpbGUgTWFuYWdlciB0aGF0IHRoaXMgQ2FjaGUgY29tbXVuaWNhdGVzCisgICAgICogd2l0aC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVVJMfSBvZiB0aGUgRmlsZSBNYW5hZ2VyIHRoYXQgdGhpcyBDYWNoZSBjb21tdW5pY2F0ZXMKKyAgICAgKiAgICAgICAgIHdpdGguCisgICAgICovCisgICAgcHVibGljIFVSTCBnZXRGaWxlTWFuYWdlclVybCgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9DYWNoZUZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvQ2FjaGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwMWFkYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvQ2FjaGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyB7QGxpbmsgQ2FjaGV9cworICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBDYWNoZUZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBDYWNoZX0uCisgICAgICogCisgICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgQ2FjaGV9LCBjb25zdHJ1Y3RlZCBieSB0aGUgaW1wbGVtZW50aW5nIEZhY3RvcnkuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIElmIHRoZSB0aGUgcGFydGljdWxhciB7QGxpbmsgQ2FjaGV9IGNhbgorICAgICAqIG5vdCBiZSBjcmVhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGUgY3JlYXRlQ2FjaGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9DYWNoZWRJbmdlc3Rlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9DYWNoZWRJbmdlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDhiMWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0NhY2hlZEluZ2VzdGVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhY2hlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5HZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBleHRlbnNpb24gb2YgdGhlIHtAbGluayBTdGRJbmdlc3Rlcn0gdGhhdCB1c2VzIGEge0BsaW5rIENhY2hlfSB0byBrZWVwCisgKiB0cmFjayBvZiB7QGxpbmsgUHJvZHVjdH0gaW5nZXN0aW9uIHN0YXR1cy4gSWYgdGhlIGV4aXN0aW5nIHtAbGluayBDYWNoZX0gdXNlZAorICogaXMgYWxyZWFkeSBzeW5jJ2VkIHRvIHRoZSByZXF1ZXN0ZWQgRmlsZSBNYW5hZ2VyIChzcGVjaWZpZWQgYnkgdGhlCisgKiA8Y29kZT5mbVVybDwvY29kZT4gcGFyYW1ldGVyIGluIHtAbGluayAjaGFzUHJvZHVjdChVUkwsIEZpbGUpfSBvcgorICoge0BsaW5rICNoYXNQcm9kdWN0KFVSTCwgU3RyaW5nKX0pLCB0aGVuIHRoZSB7QGxpbmsgQ2FjaGV9IHdpbGwgc2ltcGx5IHJldHVybgorICogdGhlIHZhbHVlIG9mIHtAbGluayBDYWNoZSNjb250YWlucyhTdHJpbmcpfS4gT3RoZXJ3aXNlIHRoZSB7QGxpbmsgQ2FjaGV9CisgKiB3aWxsIGJlIHJlLXtAbGluayBDYWNoZSNzeW5jKCl9J2VkIHRvIHRoZSBnaXZlbiBGaWxlIE1hbmFnZXIgYmVmb3JlIHRoZQorICogY29udGFpbnMgbWV0aG9kIGlzIGludm9rZWQuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVkSW5nZXN0ZXIgZXh0ZW5kcyBTdGRJbmdlc3RlciB7CisKKyAgICBwcml2YXRlIENhY2hlIGNhY2hlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ2FjaGVkSW5nZXN0ZXIuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHRyYW5zZmVyU2VydmljZQorICAgICAqICAgICAgICAgICAgVGhlIHVuZGVybHlpbmcgZGF0YSB0cmFuc2ZlciBzZXJ2aWNlIHRvIHVzZSB0byBpbmdlc3QKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQcm9kdWN0fXMuCisgICAgICogQHBhcmFtIGNhY2hlU2VydmljZUZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgQ2FjaGVGYWN0b3J5fSB0byB1c2UgdG8gY29uc3RydWN0IHRoaXMKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJbmdlc3Rlcn0ncyB7QGxpbmsgQ2FjaGV9LgorICAgICAqIEBwYXJhbSBjYWNoZVByb3BGaWxlCisgICAgICogICAgICAgICAgICBUaGUgZmlsZSBwYXRoIHRvIHRoZSBjYWNoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gbG9hZCB0bworICAgICAqICAgICAgICAgICAgY29uZmlndXJlIHRoZSB7QGxpbmsgQ2FjaGV9LgorICAgICAqLworICAgIHB1YmxpYyBDYWNoZWRJbmdlc3RlcihTdHJpbmcgdHJhbnNmZXJTZXJ2aWNlLCBTdHJpbmcgY2FjaGVTZXJ2aWNlRmFjdG9yeSwKKyAgICAgICAgICAgIFN0cmluZyBjYWNoZVByb3BGaWxlKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRyYW5zZmVyU2VydmljZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShjYWNoZVByb3BGaWxlKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBsb2FkIGNhY2hlIHByb3BlcnRpZXMgZnJvbSBmaWxlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2FjaGVQcm9wRmlsZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jYWNoZSA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0Q2FjaGVGcm9tRmFjdG9yeShjYWNoZVNlcnZpY2VGYWN0b3J5KTsKKyAgICAgICAgaW5pdCh0aGlzLmNhY2hlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFuc2ZlclNlcnZpY2UKKyAgICAgKiAgICAgICAgICAgIFRoZSB1bmRlcmx5aW5nIGRhdGEgdHJhbnNmZXIgc2VydmljZSB0byB1c2UgdG8gaW5nZXN0CisgICAgICogICAgICAgICAgICB7QGxpbmsgUHJvZHVjdH1zLgorICAgICAqIEBwYXJhbSBjYWNoZQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBDYWNoZX0gdGhhdCB0aGlzIHtAbGluayBJbmdlc3Rlcn0gd2lsbCB1c2UuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGVkSW5nZXN0ZXIoU3RyaW5nIHRyYW5zZmVyU2VydmljZSwgQ2FjaGUgY2FjaGUpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRyYW5zZmVyU2VydmljZSk7CisgICAgICAgIGluaXQoY2FjaGUpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlciNoYXNQcm9kdWN0KGphdmEubmV0LlVSTCwKKyAgICAgKiAgICAgIGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9kdWN0KFVSTCBmbVVybCwgRmlsZSBwcm9kRmlsZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaGFzUHJvZHVjdChmbVVybCwgcHJvZEZpbGUuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuU3RkSW5nZXN0ZXIjaGFzUHJvZHVjdChqYXZhLm5ldC5VUkwsCisgICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb2R1Y3QoVVJMIGZtVXJsLCBTdHJpbmcgcHJvZHVjdE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYWNoZS5nZXRGaWxlTWFuYWdlclVybCgpLmVxdWFscyhmbVVybCkpIHsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZS5jb250YWlucyhwcm9kdWN0TmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIHJlLXN5bmMKKyAgICAgICAgICAgIGNhY2hlLnNldEZpbGVNYW5hZ2VyKGZtVXJsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FjaGUuc3luYygpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2FjaGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcmUtc3luY2luZyBjYWNoZSB0byBmaWxlIG1hbmFnZXI6IFsiICsgZm1VcmwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcmUtc3luY2luZyBjYWNoZSB0byBmaWxlIG1hbmFnZXI6IFsiICsgZm1VcmwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZS5jb250YWlucyhwcm9kdWN0TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIENhY2hlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzeW5zYygpIHRocm93cyBDYWNoZUV4Y2VwdGlvbiB7CisgICAgICAgIGNhY2hlLnN5bmMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChDYWNoZSBjYWNoZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgICAgIC8vIHVwb24gaW5jZXB0aW9uLCBkbyBhbiBpbml0aWFsIHN5bmMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlLnN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FjaGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc3luYyBjYWNoZSBmb3IgQ2FjaGVkSW5nZXN0ZXI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvQ21kTGluZUluZ2VzdGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0NtZExpbmVJbmdlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzA2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0NtZExpbmVJbmdlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Jbmdlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuR2VuZXJpY01ldGFkYXRhT2JqZWN0RmFjdG9yeTsKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBjb21tYW5kIGxpbmUgSS9GIGZvciB7QGxpbmsgUHJvZHVjdH0gaW5nZXN0aW9uLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENtZExpbmVJbmdlc3RlciBleHRlbmRzIFN0ZEluZ2VzdGVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ21kTGluZUluZ2VzdGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBDbWRMaW5lSW5nZXN0ZXIoU3RyaW5nIHNlcnZpY2VGYWN0b3J5KSB7CisgICAgICAgIHN1cGVyKHNlcnZpY2VGYWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqIEB0aHJvd3MgSW5nZXN0RXhjZXB0aW9uCisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gQ21kTGluZUluZ2VzdGVyLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIiAtLXVybCA8ZmlsZW1nciB1cmw+IFtvcHRpb25zXVxuIgorICAgICAgICAgICAgICAgICsgIlstLWV4dHJhY3RvciA8bWV0IGV4dHJhY3RvciBjbGFzcyBuYW1lPiA8bWV0IGNvbmYgZmlsZSBwYXRoPnwiCisgICAgICAgICAgICAgICAgKyAiLS1tZXRGaWxlIDxtZXQgZmlsZSBwYXRoPl1cbiIKKyAgICAgICAgICAgICAgICArICItLXRyYW5zZmVyZXIgPGRhdGEgdHJhbnNmZXIgc2VydmljZSBmYWN0b3J5PlxuIgorICAgICAgICAgICAgICAgICsgIlstLWZpbGUgPGZ1bGwgcGF0aD4gfCAtLWluIHJlYWRzIGxpc3Qgb2YgZmlsZXMgZnJvbSBTVERJTl1cbiI7CisKKyAgICAgICAgU3RyaW5nIGZtVXJsU3RyID0gbnVsbCwgZXh0cmFjdG9yQ2xhc3NOYW1lID0gbnVsbCwgZmlsZVBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgdHJhbnNmZXJTZXJ2aWNlRmFjdG9yeSA9IG51bGwsIG1ldENvbmZGaWxlUGF0aCA9IG51bGw7CisgICAgICAgIFN0cmluZyBtZXRGaWxlUGF0aCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gcmVhZEZyb21TdGRpbiA9IGZhbHNlOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVybCIpKSB7CisgICAgICAgICAgICAgICAgZm1VcmxTdHIgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWV4dHJhY3RvciIpKSB7CisgICAgICAgICAgICAgICAgZXh0cmFjdG9yQ2xhc3NOYW1lID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgIG1ldENvbmZGaWxlUGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWluIikpIHsKKyAgICAgICAgICAgICAgICByZWFkRnJvbVN0ZGluID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdHJhbnNmZXJlciIpKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmZXJTZXJ2aWNlRmFjdG9yeSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tbWV0RmlsZSIpKSB7CisgICAgICAgICAgICAgICAgbWV0RmlsZVBhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm1VcmxTdHIgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8ICgoZXh0cmFjdG9yQ2xhc3NOYW1lID09IG51bGwgfHwgbWV0Q29uZkZpbGVQYXRoID09IG51bGwpICYmIG1ldEZpbGVQYXRoID09IG51bGwpCisgICAgICAgICAgICAgICAgfHwgKG1ldEZpbGVQYXRoICE9IG51bGwgJiYgKG1ldENvbmZGaWxlUGF0aCAhPSBudWxsIHx8IGV4dHJhY3RvckNsYXNzTmFtZSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICB8fCB0cmFuc2ZlclNlcnZpY2VGYWN0b3J5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAoZmlsZVBhdGggPT0gbnVsbCAmJiAhcmVhZEZyb21TdGRpbikKKyAgICAgICAgICAgICAgICB8fCAocmVhZEZyb21TdGRpbiAmJiBtZXRGaWxlUGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHx8IChyZWFkRnJvbVN0ZGluICYmIGZpbGVQYXRoICE9IG51bGwpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBDbWRMaW5lSW5nZXN0ZXIgaW5nZXN0ZXIgPSBuZXcgQ21kTGluZUluZ2VzdGVyKHRyYW5zZmVyU2VydmljZUZhY3RvcnkpOworICAgICAgICBNZXRFeHRyYWN0b3IgZXh0cmFjdG9yID0gbnVsbDsKKyAgICAgICAgaWYgKHJlYWRGcm9tU3RkaW4pIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9kcyA9IHJlYWRQcm9kRmlsZXNGcm9tU3RkaW4oKTsKKyAgICAgICAgICAgIGV4dHJhY3RvciA9IEdlbmVyaWNNZXRhZGF0YU9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldE1ldEV4dHJhY3RvckZyb21DbGFzc05hbWUoZXh0cmFjdG9yQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKGZtVXJsU3RyKSwgcHJvZHMsIGV4dHJhY3RvciwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgIG1ldENvbmZGaWxlUGF0aCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJRCA9IG51bGw7CisgICAgICAgICAgICBpZiAobWV0RmlsZVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RJRCA9IGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKGZtVXJsU3RyKSwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCksIG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0obWV0RmlsZVBhdGgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dHJhY3RvciA9IEdlbmVyaWNNZXRhZGF0YU9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRFeHRyYWN0b3JGcm9tQ2xhc3NOYW1lKGV4dHJhY3RvckNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgcHJvZHVjdElEID0gaW5nZXN0ZXIuaW5nZXN0KG5ldyBVUkwoZm1VcmxTdHIpLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoKSwgZXh0cmFjdG9yLCBuZXcgRmlsZShtZXRDb25mRmlsZVBhdGgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQ6ICIgKyBwcm9kdWN0SUQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZFByb2RGaWxlc0Zyb21TdGRpbigpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb2RGaWxlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7CisKKyAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOworCisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2RGaWxlcy5hZGQobGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIHJlYWRpbmcgcHJvZCBmaWxlOiBsaW5lOiBbIiArIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kRmlsZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9Jbmdlc3Rlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9Jbmdlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTcxZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0luZ2VzdGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5nZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIGludGVyZmFjZSBmb3IgaW5nZXN0aW5nIHtAbGluayBQcm9kdWN0fXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5nZXN0ZXIgeworCisgICAgLyoqCisgICAgICogSW5nZXN0cyBhIHtAbGluayBQcm9kdWN0fSB0byB0aGUgZmlsZSBtYW5hZ2VyIHNlcnZpY2Ugb2JqZWN0IGlkZW50aWZpZWQKKyAgICAgKiBieSB0aGUgZ2l2ZW4ge0BsaW5rIFVSTH0gcGFyYW1ldGVyLiBUaGUgcHJvZHVjdCB7QGxpbmsgTWV0YWRhdGF9IGlzCisgICAgICogZXh0cmFjdGVkIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBwcm92aWRlZCB7QGxpbmsgTWV0RXh0cmFjdG9yfSBpbnRlcmZhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGZtVXJsCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFVSTH0gcG9pbnRlciB0byB0aGUgZmlsZSBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICogQHBhcmFtIHByb2RGaWxlCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIEZpbGV9IHBvaW50ZXIgdG8gdGhlIHByb2R1Y3QgZmlsZS4KKyAgICAgKiBAcGFyYW0gZXh0cmFjdG9yCisgICAgICogICAgICAgICAgICBUaGUgZ2l2ZW4ge0BsaW5rIE1ldEV4dHJhY3Rvcn0gdG8gdXNlIHRvIGV4dHJhY3QKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUge0BsaW5rIFByb2R1Y3R9LgorICAgICAqIEBwYXJhbSBtZXRDb25mRmlsZQorICAgICAqICAgICAgICAgICAgQSBDb25maWd7QGxpbmsgRmlsZX0gZm9yIHRoZSB7QGxpbmsgTWV0RXh0cmFjdG9yfS4KKyAgICAgKiBAcmV0dXJuIFRoZSBJRCByZXR1cm5lZCBieSB0aGUgZmlsZSBtYW5hZ2VyIGZvciB0aGUgbmV3bHkgaW5nZXN0ZWQKKyAgICAgKiAgICAgICAgIHByb2R1Y3QuCisgICAgICogQHRocm93cyBJbmdlc3RFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbmdlc3RpbmcgdGhlIHtAbGluayBQcm9kdWN0fQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaW5nZXN0KFVSTCBmbVVybCwgRmlsZSBwcm9kRmlsZSwgTWV0RXh0cmFjdG9yIGV4dHJhY3RvciwKKyAgICAgICAgICAgIEZpbGUgbWV0Q29uZkZpbGUpIHRocm93cyBJbmdlc3RFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbmdlc3RzIGEge0BsaW5rIFByb2R1Y3R9IHRvIHRoZSBmaWxlIG1hbmFnZXIgc2VydmljZSBvYmplY3QgaWRlbnRpZmllZAorICAgICAqIGJ5IHRoZSBnaXZlbiB7QGxpbmsgVVJMfSBwYXJhbWV0ZXIuIFRoZSBwcm9kdWN0IHtAbGluayBNZXRhZGF0YX0gaXMKKyAgICAgKiBwcm92aWRlZCBhIHByaW9yaS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm1VcmwKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgVVJMfSBwb2ludGVyIHRvIHRoZSBmaWxlIG1hbmFnZXIgc2VydmljZS4KKyAgICAgKiBAcGFyYW0gcHJvZEZpbGUKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgRmlsZX0gcG9pbnRlciB0byB0aGUgcHJvZHVjdCBmaWxlLgorICAgICAqIEBwYXJhbSBtZXQKKyAgICAgKiAgICAgICAgICAgIFRoZSBnaXZlbiB7QGxpbmsgTWV0YWRhdGF9IG9iamVjdCBhbHJlYWR5IGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAqICAgICAgICAgICAge0BsaW5rIFByb2R1Y3R9LgorICAgICAqIEByZXR1cm4gVGhlIElEIHJldHVybmVkIGJ5IHRoZSBmaWxlIG1hbmFnZXIgZm9yIHRoZSBuZXdseSBpbmdlc3RlZAorICAgICAqICAgICAgICAgcHJvZHVjdC4KKyAgICAgKiBAdGhyb3dzIEluZ2VzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGFuIGVycm9yIGluZ2VzdGluZyB0aGUge0BsaW5rIFByb2R1Y3R9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBpbmdlc3QoVVJMIGZtVXJsLCBGaWxlIHByb2RGaWxlLCBNZXRhZGF0YSBtZXQpCisgICAgICAgICAgICB0aHJvd3MgSW5nZXN0RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGZtVXJsCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFVSTH0gcG9pbnRlciB0byB0aGUgZmlsZSBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICogQHBhcmFtIHByb2RGaWxlcworICAgICAqICAgICAgICAgICAgQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gZmlsZVBhdGhzIHBvaW50aW5nIHRvCisgICAgICogICAgICAgICAgICB7QGxpbmsgUHJvZHVjdH0gZmlsZXMgdG8gaW5nZXN0LgorICAgICAqIEBwYXJhbSBleHRyYWN0b3IKKyAgICAgKiAgICAgICAgICAgIFRoZSBnaXZlbiB7QGxpbmsgTWV0RXh0cmFjdG9yfSB0byB1c2UgdG8gZXh0cmFjdAorICAgICAqICAgICAgICAgICAge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSB7QGxpbmsgUHJvZHVjdH1zLgorICAgICAqIEBwYXJhbSBtZXRDb25mRmlsZQorICAgICAqICAgICAgICAgICAgQSBDb25maWd7QGxpbmsgRmlsZX0gZm9yIHRoZSB7QGxpbmsgTWV0RXh0cmFjdG9yfS4KKyAgICAgKiBAdGhyb3dzIEluZ2VzdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGFuIGVycm9yIGluZ2VzdGluZyB0aGUge0BsaW5rIFByb2R1Y3R9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmdlc3QoVVJMIGZtVXJsLCBMaXN0PFN0cmluZz4gcHJvZEZpbGVzLCBNZXRFeHRyYWN0b3IgZXh0cmFjdG9yLAorICAgICAgICAgICAgRmlsZSBtZXRDb25mRmlsZSkgdGhyb3dzIEluZ2VzdEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgZmlsZSBtYW5hZ2VyIGF0IHRoZSBnaXZlbiB7QGxpbmsgVVJMfSB0byBzZWUgd2hldGhlciBvciBub3QgaXQKKyAgICAgKiBrbm93cyBhYm91dCB0aGUgcHJvdmlkZWQge0BsaW5rIFByb2R1Y3R9IHtAbGluayBGaWxlfSBwYXJhbWV0ZXIuIFRvIGRvCisgICAgICogdGhpcywgaXQgdXNlcyB7QGxpbmsgRmlsZSNnZXROYW1lKCl9IGFzIHRoZSB7QGxpbmsgTWV0YWRhdGF9IGtleQorICAgICAqIDxjb2RlPkZpbGVuYW1lPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZEZpbGUKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgRmlsZX0gdG8gY2hlY2sgZm9yIGV4aXN0YW5jZSBvZiB3aXRoaW4gdGhlIGZpbGUKKyAgICAgKiAgICAgICAgICAgIG1hbmFnZXIgYXQgZ2l2ZW4ge0BsaW5rIFVSTH0uCisgICAgICogQHVybCBUaGUge0BsaW5rIFVSTH0gcG9pbnRlciB0byB0aGUgZmlsZSBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb2R1Y3QoVVJMIGZtVXJsLCBGaWxlIHByb2RGaWxlKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgZmlsZSBtYW5hZ2VyIGF0IHRoZSBnaXZlbiB7QGxpbmsgVVJMfSB0byBzZWUgd2hldGhlciBvciBub3QgaXQKKyAgICAgKiBrbm93cyBhYm91dCB0aGUgcHJvdmlkZWQge0BsaW5rIFByb2R1Y3R9IHdpdGggdGhlIGdpdmVuCisgICAgICogPGNvZGU+cHJvZHVjdE5hbWU8L2NvZGU+IHBhcmFtZXRlci4gVG8gZG8gdGhpcywgaXQgdXNlcyB0aGUgcHJvdmlkZWQKKyAgICAgKiA8Y29kZT5wcm9kdWN0TmFtZTwvY29kZT4ga2V5IGFzIHRoZSB7QGxpbmsgTWV0YWRhdGF9IGtleSB0byBzZWFyY2ggZm9yCisgICAgICogaW4gdGhlIGNhdGFsb2cuCisgICAgICogCisgICAgICogQHBhcmFtIGZtVXJsCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFVSTH0gcG9pbnRlciB0byB0aGUgZmlsZSBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICogQHBhcmFtIHByb2R1Y3ROYW1lCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3R9IHRvIHNlYXJjaCBmb3IsIGlkZW50aWZpZWQgYnkgaXRzIChwb3NzaWJseQorICAgICAqICAgICAgICAgICAgbm90IHVuaXF1ZSkgbmFtZS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgbWFuYWdlciBoYXMgdGhlIHByb2R1Y3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9kdWN0KFVSTCBmbVVybCwgU3RyaW5nIHByb2R1Y3ROYW1lKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9Mb2NhbENhY2hlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0xvY2FsQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTVhYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9Mb2NhbENhY2hlLmphdmEKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SYW5nZVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2FjaGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICogPHA+CisgKiBBIGNhY2hlZCB3YXkgdG8gZGV0ZXJtaW5lIHByb2R1Y3QgaW5nZXN0aW9uIGFnYWluc3QgYSBGaWxlIE1hbmFnZXIuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIExvY2FsQ2FjaGUgaW1wbGVtZW50cyBDYWNoZSB7CisKKyAgICBwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiB1bmlxdWVFbGVtZW50czsKKworICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUVsZW1lbnROYW1lOworCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXM7CisKKyAgICBwcml2YXRlIFN0cmluZyByYW5nZVF1ZXJ5RWxlbWVudE5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBzdGFydE9mUXVlcnk7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmRPZlF1ZXJ5OworCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvY2FsQ2FjaGUuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGZtVXJsCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogQHBhcmFtIHJhbmdlUXVlcnlFbGVtZW50TmFtZQorICAgICAqIEBwYXJhbSBzdGFydE9mUXVlcnkKKyAgICAgKiBAcGFyYW0gZW5kT2ZRdWVyeQorICAgICAqLworICAgIHB1YmxpYyBMb2NhbENhY2hlKFVSTCBmbVVybCwgU3RyaW5nIHJhbmdlUXVlcnlFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBzdGFydE9mUXVlcnksIFN0cmluZyBlbmRPZlF1ZXJ5KSB7CisgICAgICAgIHRoaXMoZm1VcmwsIG51bGwsIG51bGwsIHJhbmdlUXVlcnlFbGVtZW50TmFtZSwgc3RhcnRPZlF1ZXJ5LCBlbmRPZlF1ZXJ5KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBwYXJhbSBmbVVybAorICAgICAqIEBwYXJhbSB1bmlxdWVFbGVtZW50TmFtZQorICAgICAqIEBwYXJhbSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGUKKyAgICAgKiBAcGFyYW0gcmFuZ2VRdWVyeUVsZW1lbnROYW1lCisgICAgICogQHBhcmFtIHN0YXJ0T2ZRdWVyeQorICAgICAqIEBwYXJhbSBlbmRPZlF1ZXJ5CisgICAgICovCisgICAgcHVibGljIExvY2FsQ2FjaGUoVVJMIGZtVXJsLCBTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUsCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlcywgU3RyaW5nIHJhbmdlUXVlcnlFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBzdGFydE9mUXVlcnksIFN0cmluZyBlbmRPZlF1ZXJ5KSB7CisgICAgICAgIHRoaXMudW5pcXVlRWxlbWVudHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIHRoaXMudW5pcXVlRWxlbWVudE5hbWUgPSB1bmlxdWVFbGVtZW50TmFtZTsKKyAgICAgICAgdGhpcy51bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyA9IHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZXM7CisgICAgICAgIHRoaXMucmFuZ2VRdWVyeUVsZW1lbnROYW1lID0gcmFuZ2VRdWVyeUVsZW1lbnROYW1lOworICAgICAgICB0aGlzLnN0YXJ0T2ZRdWVyeSA9IHN0YXJ0T2ZRdWVyeTsKKyAgICAgICAgdGhpcy5lbmRPZlF1ZXJ5ID0gZW5kT2ZRdWVyeTsKKyAgICAgICAgc2V0RmlsZU1hbmFnZXIoZm1VcmwpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNzeW5jKGphdmEudXRpbC5MaXN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmMoTGlzdDxTdHJpbmc+IHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKSB0aHJvd3MgQ2FjaGVFeGNlcHRpb24geworICAgICAgICBzeW5jKERFRkFVTFRfVU5JUVVFX01FVF9LRVksIHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjc3luYyhqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgamF2YS51dGlsLkxpc3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luYyhTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUsCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMpIHRocm93cyBDYWNoZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnROYW1lID0gdW5pcXVlRWxlbWVudE5hbWU7ICAgICAgICAgICAgCisgICAgICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzID0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXM7CisgICAgICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IFZlY3RvcjxQcm9kdWN0PigpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvZHVjdFR5cGUgOiB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKQorICAgICAgICAgICAgICAgIHByb2R1Y3RzLmFkZEFsbChnZXRQcm9kdWN0c092ZXJEYXRlUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VRdWVyeUVsZW1lbnROYW1lLCBwcm9kdWN0VHlwZSwgdGhpcy5zdGFydE9mUXVlcnksCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kT2ZRdWVyeSkpOworICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8UHJvZHVjdD4gaSA9IHByb2R1Y3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVGb3JNZXRhZGF0YShwcm9kdWN0LCB1bmlxdWVFbGVtZW50TmFtZSk7CisgICAgICAgICAgICAgICAgdGhpcy51bmlxdWVFbGVtZW50cy5hZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhY2hlRXhjZXB0aW9uKCJGYWlsZWQgdG8gc3luYyB3aXRoIGRhdGFiYXNlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNjbGVhcigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHRoaXMudW5pcXVlRWxlbWVudHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjc2l6ZSgpCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gdGhpcy51bmlxdWVFbGVtZW50cy5zaXplKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkNhY2hlI2NvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHByb2R1Y3ROYW1lKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVuaXF1ZUVsZW1lbnRzLmNvbnRhaW5zKHByb2R1Y3ROYW1lKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjc2V0RmlsZU1hbmFnZXIoamF2YS5uZXQuVVJMKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNYW5hZ2VyKFVSTCBmbVVybCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5mbSA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChmbVVybCk7CisgICAgICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHNldHRpbmcgZmlsZSBtYW5hZ2VyIGNvbm5lY3Rpb24gdG86IFsiICsgZm1VcmwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjc3luYygpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luYygpIHRocm93cyBDYWNoZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLnVuaXF1ZUVsZW1lbnROYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAodGhpcy51bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyA9PSBudWxsIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMgIT0gbnVsbCAmJiB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzLnNpemUoKSA9PSAwKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkJvdGggdW5pcXVlRWxlbWVudE5hbWUgYW5kIHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWUgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgdGhpcyBmb3JtIG9mIHRoZSBzeW5jIG9wZXJhdGlvbiEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmModGhpcy51bmlxdWVFbGVtZW50TmFtZSwgdGhpcy51bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyk7CisKKyAgICB9CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNnZXRGaWxlTWFuYWdlclVybCgpCisgICAgICovCisgICAgcHVibGljIFVSTCBnZXRGaWxlTWFuYWdlclVybCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZm0uZ2V0RmlsZU1hbmFnZXJVcmwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHtAbGluayBYbWxScGNGaWxlTWFuYWdlckNsaWVudCNoYXNQcm9kdWN0KFN0cmluZyl9IGNoZWNrCisgICAgICogYWdhaW5zdCBhIGxpdmUgRmlsZSBNYW5hZ2VyLCBieXBhc3NpbmcgdGhlIHtAbGluayBDYWNoZX0uCisgICAgICogCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgcHJvZHVjdCBpZGVudGlmaWVyIGVsZW1lbnQgdG8gaWRlbnRpZnkgd2hldGhlciB0aGUgcHJvZHVjdAorICAgICAqICAgICAgICAgICAgd2FzIHJlY2VpdmVkIHlldC4KKyAgICAgKiBAcGFyYW0gdW5pcXVlRWxlbWVudFZhbHVlCisgICAgICogICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHByb2R1Y3QgaWRlbnRpZmllciBlbGVtZW50LgorICAgICAqIEBwYXJhbSBwcm9kdWN0VHlwZU5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgUHJvZHVjdFR5cGV9IG9mIHRoZSBQcm9kdWN0IHRoYXQgeW91IHdvdWxkIGxpa2UgdG8KKyAgICAgKiAgICAgICAgICAgIGNoZWNrIGV4aXN0ZW5jZSBmb3IuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBQcm9kdWN0IChpZGVudGlmaWVkIGJ5IGl0cworICAgICAqICAgICAgICAgPGNvZGU+dW5pcXVlRWxlbWVudDwvY29kZT4pIGV4aXN0cywgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgQ2FjaGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGxpdmVIYXNQcm9kdWN0KFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyB1bmlxdWVFbGVtZW50VmFsdWUsIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgQ2FjaGVFeGNlcHRpb24geworICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICBxdWVyeS5hZGRDcml0ZXJpb24obmV3IFRlcm1RdWVyeUNyaXRlcmlhKHVuaXF1ZUVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgIHVuaXF1ZUVsZW1lbnRWYWx1ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICEoZm0ucXVlcnkocXVlcnksIGZtLmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSkpCisgICAgICAgICAgICAgICAgICAgIC5pc0VtcHR5KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhY2hlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNoZWNrIGZvciBwcm9kdWN0IHJlY2VwdGlvbiBmcm9tIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZtLmdldEZpbGVNYW5hZ2VyVXJsKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlRWxlbWVudE5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlRWxlbWVudE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgdW5pcXVlRWxlbWVudE5hbWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlRWxlbWVudE5hbWUoU3RyaW5nIHVuaXF1ZUVsZW1lbnROYW1lKSB7CisgICAgICAgIHRoaXMudW5pcXVlRWxlbWVudE5hbWUgPSB1bmlxdWVFbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcygKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcykgeworICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzID0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFByb2R1Y3Q+IGdldFByb2R1Y3RzT3ZlckRhdGVSYW5nZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBwcm9kdWN0VHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBzdGFydE9mUXVlcnksIFN0cmluZyBlbmRPZlF1ZXJ5KSB0aHJvd3MgQ2FjaGVFeGNlcHRpb24geworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IFZlY3RvcjxQcm9kdWN0PigpOworICAgICAgICB0cnkgeyAgICAgICAgCisgICAgICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICAgICAgcXVlcnkuYWRkQ3JpdGVyaW9uKG5ldyBSYW5nZVF1ZXJ5Q3JpdGVyaWEoZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZRdWVyeSwgZW5kT2ZRdWVyeSkpOworICAgICAgICAgICAgaWYodGhpcy51bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyAhPSBudWxsICYmIAorICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzLnNpemUoKSA+IDApeworICAgICAgICAgICAgICAgIGZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzLmFkZEFsbChnZXRQcm9kdWN0cyhxdWVyeSwgcHJvZHVjdFR5cGVOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhY2hlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcXVlcnkgZm9yIHByb2R1Y3QgdmlhIGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnROYW1lICsgIiBhbmQgcmFuZ2UgIiArIHN0YXJ0T2ZRdWVyeSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgICArIGVuZE9mUXVlcnkgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RzOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0cyhRdWVyeSBxdWVyeSwgU3RyaW5nIHByb2R1Y3RUeXBlKQorICAgICAgICAgICAgdGhyb3dzIENhY2hlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmbS5xdWVyeShxdWVyeSwgZm0uZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGUpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBwcm9kdWN0IGxpc3QgZm9yIHF1ZXJ5ICIKKyAgICAgICAgICAgICAgICAgICAgKyBxdWVyeSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWVGb3JNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsCisgICAgICAgICAgICBTdHJpbmcgbWV0YWRhdGFFbGVtZW50TmFtZSkgdGhyb3dzIENhY2hlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmbS5nZXRNZXRhZGF0YShwcm9kdWN0KS5nZXRNZXRhZGF0YShtZXRhZGF0YUVsZW1lbnROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSB2YWx1ZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIG1ldGFkYXRhRWxlbWVudE5hbWUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9Mb2NhbENhY2hlRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9Mb2NhbENhY2hlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDdkMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L0xvY2FsQ2FjaGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQ29uc3RydWN0cyBuZXcge0BsaW5rIExvY2FsQ2FjaGV9cworICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIExvY2FsQ2FjaGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RDYWNoZVNlcnZlckZhY3RvcnkgeworCisgICAgcHVibGljIExvY2FsQ2FjaGVGYWN0b3J5KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5BYnN0cmFjdENhY2hlU2VydmVyRmFjdG9yeSNjcmVhdGVDYWNoZSgpCisgICAgICovCisgICAgcHVibGljIENhY2hlIGNyZWF0ZUNhY2hlKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IExvY2FsQ2FjaGUoZm1VcmwsIHVuaXF1ZUVsZW1lbnROYW1lLCBwcm9kdWN0VHlwZU5hbWVzLAorICAgICAgICAgICAgICAgIHJhbmdlUXVlcnlFbGVtZW50TmFtZSwgcmFuZ2VTdGFydERhdGVUaW1lLCByYW5nZUVuZERhdGVUaW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvUmVtb3RlYWJsZUNhY2hlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1JlbW90ZWFibGVDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNWFkOTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1JlbW90ZWFibGVDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogIEEgSmF2YSBSTUkge0BsaW5rIFJlbW90ZX0tYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIENhY2hlfQorICogIGludGVyZmFjZS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVtb3RlYWJsZUNhY2hlIGV4dGVuZHMgUmVtb3RleworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VTklRVUVfTUVUX0tFWSA9ICJDQVMuUHJvZHVjdE5hbWUiOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IGNhY2hlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBhIHJlLXtAbGluayAjc3luYyhTdHJpbmcsIFN0cmluZykpfQorICAgICAqIG9jY3Vycy4KKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhlIGNhY2hlIHRvIGRldGVybWluZSBpZiBhIHtAbGluayBQcm9kdWN0fSB3aXRoIHRoZSBnaXZlbgorICAgICAqIDxjb2RlPnByb2R1Y3ROYW1lPC9jb2RlPiBleGlzdHMuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3ROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUge0BsaW5rIFByb2R1Y3R9IHRvIGNoZWNrIGZvciBpbiB0aGUgQ2FjaGUuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB7QGxpbmsgUHJvZHVjdH0gaXMgZm91ZG4gaW4gdGhlIENhY2hlLCBGYWxzZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHtAbGluayBVUkx9IHRvIHRoZSBGaWxlIE1hbmFnZXIgdG8gY29ubmVjdCB0aGlzIENhY2hlIHRvLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmbVVybAorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBVUkx9IG9mIHRoZSBGaWxlIE1hbmFnZXIgdG8gY2FjaGUge0BsaW5rIFByb2R1Y3R9cworICAgICAqICAgICAgICAgICAgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTWFuYWdlcihVUkwgZm1VcmwpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHtAbGluayBQcm9kdWN0fSBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3luY2hyb25pemVzIHRoaXMgQ2FjaGUgd2l0aCB0aGUgRmlsZSBNYW5hZ2VyIHNwZWNpZmllZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgI3NldEZpbGVNYW5hZ2VyKFVSTCl9IG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgTGlzdH0ge0BsaW5rIFByb2R1Y3RUeXBlfXMgdG8gY2FjaGUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQcm9kdWN0fXMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jKExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplcyB0aGlzIENhY2hlIHdpdGggdGhlIEZpbGUgTWFuYWdlciBzcGVjaWZpZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNzZXRGaWxlTWFuYWdlcihVUkwpfSBtZXRob2QuCisgICAgICogCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbWV0IGtleSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgZGV0ZXJtaW5pbmcge0BsaW5rIFByb2R1Y3R9CisgICAgICogICAgICAgICAgICBleGlzdGFuY2UgKGlmIGRpZmZlcmVudCB0aGFuIHtAdmFsdWUgI0RFRkFVTFRfVU5JUVVFX01FVF9LRVl9KS4KKyAgICAgKiBAcGFyYW0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3RUeXBlfXMgdG8gY2FjaGUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQcm9kdWN0fXMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jKFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplcyB0aGlzIENhY2hlIHdpdGggdGhlIEZpbGUgTWFuYWdlciBzcGVjaWZpZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNzZXRGaWxlTWFuYWdlcihVUkwpfSBtZXRob2QuIFRoaXMgbWV0aG9kIGFsc28gYXNzdW1lcyB0aGF0IHRoZQorICAgICAqIHVuaXF1ZSBlbGVtZW50IChpZGVudGlmaWVkIGJ5IHtAbGluayAjc2V0VW5pcXVlRWxlbWVudE5hbWUoU3RyaW5nKX0gYW5kCisgICAgICogdGhlIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUHJvZHVjdFR5cGV9cyBoYXZlIGFsc28gYmVlbiBzZXQgYXBwcm9wcmlhdGUKKyAgICAgKiAoZS5nLiwgYnkgdXNpbmcge0BsaW5rICNzZXRVbmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyhMaXN0KX0uCisgICAgICogCisgICAgICogQHRocm93cyBSZW1vdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZXMgb2YgdGhlIHtAbGluayBQcm9kdWN0VHlwZX1zIHRvIGNhY2hlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcworICAgICAqICAgICAgICAgICAgQSB7QGxpbmsgTGlzdH0gb2YgamF2YS51dGlsLlN0cmluZyBuYW1lcyBvZgorICAgICAqICAgICAgICAgICAge0BsaW5rIFByb2R1Y3RUeXBlfXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMoCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXQgZWxlbWVudCB0byB1c2UgYXMgdGhlIGlkZW50aWZpZXIgb2YgYQorICAgICAqIHtAbGluayBQcm9kdWN0fSBmb3IgdXNlIGluIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIFByb2R1Y3QgaXMgaW4gdGhlCisgICAgICogQ2FjaGUuCisgICAgICogCisgICAgICogQHBhcmFtIHVuaXF1ZUVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbWV0IGVsZW1lbnQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeQorICAgICAqICAgICAgICAgICAge0BsaW5rIFByb2R1Y3R9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVFbGVtZW50TmFtZShTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIFVSTH0gb2YgdGhlIEZpbGUgTWFuYWdlciB0aGF0IHRoaXMgQ2FjaGUgY29tbXVuaWNhdGVzCisgICAgICogd2l0aC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVVJMfSBvZiB0aGUgRmlsZSBNYW5hZ2VyIHRoYXQgdGhpcyBDYWNoZSBjb21tdW5pY2F0ZXMKKyAgICAgKiAgICAgICAgIHdpdGguCisgICAgICovCisgICAgcHVibGljIFVSTCBnZXRGaWxlTWFuYWdlclVybCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1JtaUNhY2hlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1JtaUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzZTJhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvUm1pQ2FjaGUuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhY2hlRXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEucm1pLk5hbWluZzsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gUk1JIGNsaWVudCB0byB0aGUge0BsaW5rIFJtaUNhY2hlU2VydmVyfSwgaW1wbGVtZW50aW5nIGFuIFJNSSBmcm9udCBlbmQKKyAqIHRvIGEge0BsaW5rIExvY2FsQ2FjaGV9LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFJtaUNhY2hlIGltcGxlbWVudHMgQ2FjaGUgeworCisgICAgcHJpdmF0ZSBSZW1vdGVhYmxlQ2FjaGUgcm1pQ2FjaGVTZXJ2ZXI7CisKKyAgICBwdWJsaWMgUm1pQ2FjaGUoU3RyaW5nIHJtaUNhY2hlU2VydmVyVXJuKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBybWlDYWNoZVNlcnZlciA9IChSZW1vdGVhYmxlQ2FjaGUpIE5hbWluZy5sb29rdXAocm1pQ2FjaGVTZXJ2ZXJVcm4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNvbm5lY3QgdG8gUm1pIENhY2hlIFNlcnZlciBhdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJtaUNhY2hlU2VydmVyVXJuICsgIl0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNjbGVhcigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBybWlDYWNoZVNlcnZlci5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjY29udGFpbnMoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcHJvZHVjdE5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBybWlDYWNoZVNlcnZlci5jb250YWlucyhwcm9kdWN0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjc2V0RmlsZU1hbmFnZXIoamF2YS5uZXQuVVJMKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNYW5hZ2VyKFVSTCBmbVVybCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcm1pQ2FjaGVTZXJ2ZXIuc2V0RmlsZU1hbmFnZXIoZm1VcmwpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNzaXplKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcm1pQ2FjaGVTZXJ2ZXIuc2l6ZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkNhY2hlI3N5bmMoamF2YS51dGlsLkxpc3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luYyhMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMpIHRocm93cyBDYWNoZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBybWlDYWNoZVNlcnZlci5zeW5jKHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNzeW5jKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBqYXZhLnV0aWwuTGlzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jKFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcykgdGhyb3dzIENhY2hlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJtaUNhY2hlU2VydmVyLnN5bmModW5pcXVlRWxlbWVudE5hbWUsIHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgdGhyb3cgbmV3IENhY2hlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkNhY2hlI3NldFVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWUoamF2YS51dGlsLkxpc3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMoCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJtaUNhY2hlU2VydmVyCisgICAgICAgICAgICAgICAgICAgIC5zZXRVbmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyh1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZSNzeW5jKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jKCkgdGhyb3dzIENhY2hlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJtaUNhY2hlU2VydmVyLnN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjc2V0VW5pcXVlRWxlbWVudE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVFbGVtZW50TmFtZShTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJtaUNhY2hlU2VydmVyLnNldFVuaXF1ZUVsZW1lbnROYW1lKHVuaXF1ZUVsZW1lbnROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGUjZ2V0RmlsZU1hbmFnZXJVcmwoKQorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0RmlsZU1hbmFnZXJVcmwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcm1pQ2FjaGVTZXJ2ZXIuZ2V0RmlsZU1hbmFnZXJVcmwoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1JtaUNhY2hlRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9SbWlDYWNoZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA5OTcyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9SbWlDYWNoZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIENvbnN0cnVjdHMgbmV3IHtAbGluayBSbWlDYWNoZX1zLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFJtaUNhY2hlRmFjdG9yeSBpbXBsZW1lbnRzIENhY2hlRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBybWlDYWNoZVNlcnZlclVybjsKKworICAgIHB1YmxpYyBSbWlDYWNoZUZhY3RvcnkoKSB7CisgICAgICAgIHJtaUNhY2hlU2VydmVyVXJuID0gUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuY2FjaGUucm1pLnNlcnZlclVybiIpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGVGYWN0b3J5I2NyZWF0ZUNhY2hlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGUgY3JlYXRlQ2FjaGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgUm1pQ2FjaGUocm1pQ2FjaGVTZXJ2ZXJVcm4pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9SbWlDYWNoZVNlcnZlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9SbWlDYWNoZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNGYwYzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1JtaUNhY2hlU2VydmVyLmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYWNoZUV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnJtaS5OYW1pbmc7CitpbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGphdmEucm1pLnJlZ2lzdHJ5LkxvY2F0ZVJlZ2lzdHJ5OworaW1wb3J0IGphdmEucm1pLnJlZ2lzdHJ5LlJlZ2lzdHJ5OworaW1wb3J0IGphdmEucm1pLnNlcnZlci5VbmljYXN0UmVtb3RlT2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqIEEgSmF2YSBSTUkgYmFzZWQgaW50ZXJmYWNlIHRvIGEgYmFja2VuZCB7QGxpbmsgTG9jYWxDYWNoZX0uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJtaUNhY2hlU2VydmVyIGV4dGVuZHMgVW5pY2FzdFJlbW90ZU9iamVjdCBpbXBsZW1lbnRzIFJlbW90ZWFibGVDYWNoZSwgU2VyaWFsaXphYmxleworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUzODMyOTQwMzM2MzE1NjM3OUw7CisKKyAgICBwcml2YXRlIExvY2FsQ2FjaGUgY2FjaGU7CisKKyAgICBwcml2YXRlIFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzOworICAgIAorICAgIHByaXZhdGUgUmVnaXN0cnkgcmVnOworCisgICAgcHVibGljIFJtaUNhY2hlU2VydmVyKFVSTCBmbVVybCwgU3RyaW5nIHJhbmdlUXVlcnlFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyByYW5nZVN0YXJ0RGF0ZVRpbWUsIFN0cmluZyByYW5nZUVuZERhdGVUaW1lLAorICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUVsZW1lbnROYW1lLCBMaXN0PFN0cmluZz4gcHJvZHVjdFR5cGVOYW1lcykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWNoZQorICAgICAgICBjYWNoZSA9IG5ldyBMb2NhbENhY2hlKGZtVXJsLCByYW5nZVF1ZXJ5RWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgcmFuZ2VTdGFydERhdGVUaW1lLCByYW5nZUVuZERhdGVUaW1lKTsKKyAgICAgICAgdGhpcy51bmlxdWVFbGVtZW50TmFtZSA9IHVuaXF1ZUVsZW1lbnROYW1lOworICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzID0gcHJvZHVjdFR5cGVOYW1lczsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxhdW5jaFNlcnZlcihpbnQgcm1pUG9ydCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGxhdW5jaFNlcnZlcih0aGlzLmNhY2hlLmdldEZpbGVNYW5hZ2VyVXJsKCksIHJtaVBvcnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxhdW5jaFNlcnZlcihVUkwgZmlsZW1nclVybCwgaW50IHJtaVBvcnQpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY1dpdGgoZmlsZW1nclVybCk7CisgICAgICAgIGxhdW5jaFJtaVNlcnZlcihybWlQb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKGludCBwb3J0KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5hbWluZy51bmJpbmQoInJtaTovL2xvY2FsaG9zdDoiICsgcG9ydCArICIvUm1pRGF0YWJhc2VTZXJ2ZXIiKTsKKyAgICAgICAgICAgIFVuaWNhc3RSZW1vdGVPYmplY3QudW5leHBvcnRPYmplY3QocmVnLHRydWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gdW5iaW5kIERhdGFiYXNlIFNlcnZlcjogcmVhc29uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBjYWNoZS5jbGVhcigpOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHByb2R1Y3ROYW1lKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlLmNvbnRhaW5zKHByb2R1Y3ROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTWFuYWdlcihVUkwgZm1VcmwpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBjYWNoZS5zZXRGaWxlTWFuYWdlcihmbVVybCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjYWNoZS5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3luYyhMaXN0PFN0cmluZz4gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FjaGUuc3luYyh1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyk7CisgICAgICAgIH0gY2F0Y2ggKENhY2hlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzeW5jKFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSwKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWNoZS5zeW5jKHVuaXF1ZUVsZW1lbnROYW1lLCB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyk7CisgICAgICAgIH0gY2F0Y2ggKENhY2hlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzeW5jKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLnVuaXF1ZUVsZW1lbnROYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAodGhpcy51bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyA9PSBudWxsIHx8ICh0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzICE9IG51bGwgJiYgdGhpcy51bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSA9PSAwKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJCb3RoIHVuaXF1ZUVsZW1lbnROYW1lIGFuZCB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSBkZWZpbmVkIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZvcm0gb2YgdGhlIHN5bmMgb3BlcmF0aW9uISIpOworICAgICAgICB9CisKKyAgICAgICAgc3luYyh0aGlzLnVuaXF1ZUVsZW1lbnROYW1lLCB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKTsKKworICAgIH0KKworICAgIHB1YmxpYyBVUkwgZ2V0RmlsZU1hbmFnZXJVcmwoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlLmdldEZpbGVNYW5hZ2VyVXJsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcygKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMudW5pcXVlRWxlbWVudFByb2R1Y3RUeXBlTmFtZXMgPSB1bmlxdWVFbGVtZW50UHJvZHVjdFR5cGVOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWVFbGVtZW50TmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHVuaXF1ZUVsZW1lbnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB1bmlxdWVFbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHVuaXF1ZUVsZW1lbnROYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZUVsZW1lbnROYW1lKFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnROYW1lID0gdW5pcXVlRWxlbWVudE5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN5bmNXaXRoKFVSTCB1cmwpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBjYWNoZS5zZXRGaWxlTWFuYWdlcih1cmwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FjaGUuc3luYyh0aGlzLnVuaXF1ZUVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZUVsZW1lbnRQcm9kdWN0VHlwZU5hbWVzKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FjaGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzeW5jIGNhY2hlIHdpdGggZmlsZSBtYW5hZ2VyOiBbIiArIHVybAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoUm1pU2VydmVyKGludCBwb3J0KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZyA9IExvY2F0ZVJlZ2lzdHJ5LmNyZWF0ZVJlZ2lzdHJ5KHBvcnQpOworICAgICAgICAgICAgTmFtaW5nLnJlYmluZCgicm1pOi8vbG9jYWxob3N0OiIgKyBwb3J0ICsgIi9SbWlEYXRhYmFzZVNlcnZlciIsIHRoaXMpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSTUkgc2VydmVyIGNyZWF0ZWQgYXQgcm1pOi8vbG9jYWxob3N0OiIgKyBwb3J0CisgICAgICAgICAgICAgICAgICAgICsgIi9SbWlEYXRhYmFzZVNlcnZlciIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBSTUkgU2VydmVyIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9SbWlDYWNoZVNlcnZlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvUm1pQ2FjaGVTZXJ2ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlYmE5ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvUm1pQ2FjaGVTZXJ2ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQ29uc3RydWN0cyBuZXcge0BsaW5rIFJtaUNhY2hlU2VydmVyfXMuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUm1pQ2FjaGVTZXJ2ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RDYWNoZVNlcnZlckZhY3Rvcnl7CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUm1pQ2FjaGVTZXJ2ZXJGYWN0b3J5KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2FjaGUgY3JlYXRlQ2FjaGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbnsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNhbGwgdGhpcyBtZXRob2QgZm9yIHRoZSBSbWlDYWNoZVNlcnZlciEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm1pQ2FjaGVTZXJ2ZXIgY3JlYXRlUmVtb3RlQ2FjaGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJtaUNhY2hlU2VydmVyKGZtVXJsLCByYW5nZVF1ZXJ5RWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJhbmdlU3RhcnREYXRlVGltZSwgcmFuZ2VFbmREYXRlVGltZSwgdW5pcXVlRWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlTmFtZXMpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBwcm9wRmlsZVBhdGggPSBudWxsLCBmaWxlTWFuYWdlclVybCA9IG51bGw7CisgICAgICAgIGludCBybWlQb3J0ID0gLTE7CisKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gIlJtaUNhY2hlU2VydmVyIFtvcHRpb25zXSBcbiIKKyAgICAgICAgICAgICAgICArICItLWZpbGVNYW5hZ2VyVXJsIDx1cmw+IFxuIiArICItLXJtaVBvcnQgPHBvcnQgbnVtYmVyPiBcbiIKKyAgICAgICAgICAgICAgICArICItLXByb3BGaWxlIDxwYXRoPlxuIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1maWxlTWFuYWdlclVybCIpKSB7CisgICAgICAgICAgICAgICAgZmlsZU1hbmFnZXJVcmwgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXByb3BGaWxlIikpIHsKKyAgICAgICAgICAgICAgICBwcm9wRmlsZVBhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXJtaVBvcnQiKSkgeworICAgICAgICAgICAgICAgIHJtaVBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcEZpbGVQYXRoID09IG51bGwgfHwgZmlsZU1hbmFnZXJVcmwgPT0gbnVsbCB8fCBybWlQb3J0ID09IC0xKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BGaWxlUGF0aCkpOworICAgICAgICAgICAgUm1pQ2FjaGVTZXJ2ZXJGYWN0b3J5IHN2ckZhY3RvcnkgPSBuZXcgUm1pQ2FjaGVTZXJ2ZXJGYWN0b3J5KCk7CisgICAgICAgICAgICBSbWlDYWNoZVNlcnZlciBjYWNoZSA9IChSbWlDYWNoZVNlcnZlcilzdnJGYWN0b3J5LmNyZWF0ZVJlbW90ZUNhY2hlKCk7CisgICAgICAgICAgICBjYWNoZS5sYXVuY2hTZXJ2ZXIobmV3IFVSTChmaWxlTWFuYWdlclVybCksIHJtaVBvcnQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gbGF1bmNoIFJtaUNhY2hlU2VydmVyIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9TdGRJbmdlc3Rlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9TdGRJbmdlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjMyMWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1N0ZEluZ2VzdGVyLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkluZ2VzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5WZXJzaW9uaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgSW5nc3Rlcn0gaW50ZXJmYWNlIHRoYXQgdXNlcyB0aGUgZm9sbG93aW5nCisgKiBwaWVjZXMgb2Yge0BsaW5rIE1ldGFkYXRhfSBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgaG93IHRvIGluZ2VzdCBhCisgKiB7QGxpbmsgUHJvZHVjdH06CisgKiAKKyAqIDx1bD4KKyAqIDxsaT5GaWxlbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBQcm9kdWN0IGZpbGUgdG8gaW5nZXN0LjwvbGk+CisgKiA8bGk+UHJvZHVjdFR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgUHJvZHVjdCB0byBpbmdlc3QuPC9saT4KKyAqIDxsaT5GaWxlTG9jYXRpb24gLSBBIGZ1bGwgcGF0aCBwb2ludGVyIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBQcm9kdWN0CisgKiBmaWxlIHRvIGluZ2VzdC48L2xpPgorICogPC91bD4KKyAqIAorICogVGhlIHtAbGluayBJbmdlc3Rlcn0gc3VwcG9ydHMgb3ZlcnJpZGluZyBjZXJ0YWluIHtAbGluayBQcm9kdWN0fSBwcm9wZXJ0aWVzLAorICogaW5jbHVkaW5nOgorICogCisgKiA8dWw+CisgKiA8bGk+U3BlY2lmaWNhdGlvbiBvZiA8Y29kZT5Qcm9kdWN0U3RydWN0dXJlPC9jb2RlPiBwYXJhbWV0ZXIgdGhhdCB3aWxsCisgKiB0ZWxsIHRoZSB7QGxpbmsgSW5nZXN0ZXJ9IHdoZXRoZXIgb3Igbm90IHRoZSB7QGxpbmsgUHJvZHVjdH0gaXMgYSBkaXJlY3RvcnkKKyAqIG9yIGEgcmVndWxhciBmaWxlLjwvbGk+CisgKiA8bGk+U3BlY2lmaWNhdGlvbiBvZiA8Y29kZT5Qcm9kdWN0TmFtZTwvY29kZT4gcGFyYW1ldGVyIHRoYXQgd2lsbCB0ZWxsIHRoZQorICoge0BsaW5rIEluZ2VzdGVyfSBhIG5hbWUgZm9yIHRoZSB7QGxpbmsgUHJvZHVjdH0gdG8gdXNlIChkZWZhdWx0IGlzIHVzaW5nIHRoZQorICogc3BlY2lmaWVkIHtAbGluayBNZXRhZGF0YX0gZmllbGQsIDxjb2RlPkZpbGVuYW1lPC9jb2RlPi48L2xpPgorICogPC91bD4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBTdGRJbmdlc3RlciBpbXBsZW1lbnRzIEluZ2VzdGVyLCBDb3JlTWV0S2V5cyB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFN0ZEluZ2VzdGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciBmaWxlIG1hbmFnZXIgY2xpZW50ICovCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG51bGw7CisKKyAgICAvKiBjbGllbnQgdHJhbnNmZXIgc2VydmljZSBmYWN0b3J5ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50VHJhbnNmZXJTZXJ2aWNlRmFjdG9yeSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RkSW5nZXN0ZXIoU3RyaW5nIHRyYW5zZmVyU2VydmljZSkgeworICAgICAgICB0aGlzLmNsaWVudFRyYW5zZmVyU2VydmljZUZhY3RvcnkgPSB0cmFuc2ZlclNlcnZpY2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkluZ2VzdGVyI2luZ2VzdChqYXZhLm5ldC5VUkwsCisgICAgICogICAgICBqYXZhLmlvLkZpbGUsIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yLAorICAgICAqICAgICAgamF2YS5pby5GaWxlKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaW5nZXN0KFVSTCBmbVVybCwgRmlsZSBwcm9kRmlsZSwgTWV0RXh0cmFjdG9yIGV4dHJhY3RvciwKKyAgICAgICAgICAgIEZpbGUgbWV0Q29uZkZpbGUpIHRocm93cyBJbmdlc3RFeGNlcHRpb24geworICAgICAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShwcm9kRmlsZSwgbWV0Q29uZkZpbGUpOworICAgICAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5nZXN0RXhjZXB0aW9uKCJNZXQgZXh0cmFjdGlvbiBleGNlcHRpb24gb24gcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kRmlsZSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluZ2VzdChmbVVybCwgcHJvZEZpbGUsIG1ldCk7CisgICAgfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkluZ2VzdGVyI2luZ2VzdChqYXZhLm5ldC5VUkwsCisJICogamF2YS51dGlsLkxpc3QsIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yLCBqYXZhLmlvLkZpbGUpCisJICovCisJcHVibGljIHZvaWQgaW5nZXN0KFVSTCBmbVVybCwgTGlzdDxTdHJpbmc+IHByb2RGaWxlcywKKwkJCU1ldEV4dHJhY3RvciBleHRyYWN0b3IsIEZpbGUgbWV0Q29uZkZpbGUpIHRocm93cyBJbmdlc3RFeGNlcHRpb24geworCQlpZiAocHJvZEZpbGVzICE9IG51bGwgJiYgcHJvZEZpbGVzLnNpemUoKSA+IDApIHsKKwkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gcHJvZEZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCVN0cmluZyBwcm9kRmlsZVBhdGggPSBpLm5leHQoKTsKKwkJCQlTdHJpbmcgcHJvZHVjdElEID0gbnVsbDsKKworCQkJCXRyeSB7CisJCQkJCXByb2R1Y3RJRCA9IGluZ2VzdChmbVVybCwgbmV3IEZpbGUocHJvZEZpbGVQYXRoKSwKKwkJCQkJCQlleHRyYWN0b3IsIG1ldENvbmZGaWxlKTsKKwkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiUHJvZHVjdDogWyIgKyBwcm9kRmlsZVBhdGgKKwkJCQkJCQkrICJdIGluZ2VzdGVkIHN1Y2Nlc3NmdWxseSEgSUQ6IFsiICsgcHJvZHVjdElECisJCQkJCQkJKyAiXSIpOworCQkJCX0gY2F0Y2ggKEluZ2VzdEV4Y2VwdGlvbiBlKSB7CisJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkJCQkiSW5nZXN0RXhjZXB0aW9uIGhhbmRsaW5nIHByb2R1Y3Q6IFsiCisJCQkJCQkJCQkrIHByb2RGaWxlUGF0aAorCQkJCQkJCQkJKyAiXTogRXhjZXB0aW9uOiBbIgorCQkJCQkJCQkJKyBlLmdldE1lc3NhZ2UoKQorCQkJCQkJCQkJKyAiXTogQ29udGludWluZyBpbmdlc3Qgb2YgcmVtYWluZGVyIG9mIHByb2R1Y3RzLiIpOworCQkJCX0KKworCQkJfQorCQl9CisKKwl9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuSW5nZXN0ZXIjaW5nZXN0KGphdmEubmV0LlVSTCwKKyAgICAgKiAgICAgIGphdmEuaW8uRmlsZSwgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGluZ2VzdChVUkwgZm1VcmwsIEZpbGUgcHJvZEZpbGUsIE1ldGFkYXRhIG1ldCkKKyAgICAgICAgICAgIHRocm93cyBJbmdlc3RFeGNlcHRpb24geworICAgICAgICBjaGVja09yU2V0RmlsZU1hbmFnZXIoZm1VcmwpOworICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGUgPSBtZXQuZ2V0TWV0YWRhdGEoUFJPRFVDVF9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG1ldC5nZXRNZXRhZGF0YShGSUxFX0xPQ0FUSU9OKTsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbWV0LmdldE1ldGFkYXRhKEZJTEVOQU1FKTsKKworICAgICAgICBpZiAoIWNoZWNrKHByb2R1Y3RUeXBlLCBQUk9EVUNUX1RZUEUpCisgICAgICAgICAgICAgICAgfHwgIWNoZWNrKGZpbGVMb2NhdGlvbiwgRklMRV9MT0NBVElPTikKKyAgICAgICAgICAgICAgICB8fCAhY2hlY2soZmlsZU5hbWUsIEZJTEVOQU1FKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZ2VzdEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5OiAiICsgUFJPRFVDVF9UWVBFICsgIiBhbmQgIgorICAgICAgICAgICAgICAgICAgICArIEZJTEVOQU1FICsgIiBhbmQgIiArIEZJTEVfTE9DQVRJT04KKyAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGhpbiBtZXRhZGF0YSBmaWxlLiBDYW5ub3QgaW5nZXN0IHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWxsb3cgdXNlciB0byBvdmVycmlkZSBkZWZhdWx0IHByb2R1Y3QgbmFtZSAoRmlsZW5hbWUpCisgICAgICAgIFN0cmluZyBwcm9kdWN0TmFtZSA9IG1ldC5nZXRNZXRhZGF0YShQUk9EVUNUX05BTUUpICE9IG51bGwgPyBtZXQKKyAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoUFJPRFVDVF9OQU1FKSA6IGZpbGVOYW1lOworCisgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBwcm9kdWN0IHN0cnVjdHVyZSB3YXMgc3BlY2lmaWVkCisgICAgICAgIFN0cmluZyBwcm9kdWN0U3RydWN0dXJlID0gbWV0LmdldE1ldGFkYXRhKFBST0RVQ1RfU1RSVUNUVVJFKTsKKyAgICAgICAgaWYgKHByb2R1Y3RTdHJ1Y3R1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdHJ5IGFuZCBndWVzcyB0aGUgc3RydWN0dXJlCisgICAgICAgICAgICBpZiAocHJvZEZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RTdHJ1Y3R1cmUgPSBQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUw7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwcm9kdWN0U3RydWN0dXJlID0gUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcHJvZHVjdAorICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3ROYW1lKHByb2R1Y3ROYW1lKTsKKyAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0U3RydWN0dXJlKHByb2R1Y3RTdHJ1Y3R1cmUpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKGdldFByb2R1Y3RUeXBlKHByb2R1Y3RUeXBlKSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgaWYgKCFmaWxlTG9jYXRpb24uZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgZmlsZUxvY2F0aW9uICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBmdWxsRmlsZVBhdGggPSBmaWxlTG9jYXRpb24gKyBmaWxlTmFtZTsKKworICAgICAgICByZWZlcmVuY2VzLmFkZChuZXcgRmlsZShmdWxsRmlsZVBhdGgpLnRvVVJJKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKHByb2R1Y3RTdHJ1Y3R1cmUuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0hJRVJBUkNISUNBTCkpIHsKKyAgICAgICAgICAgIHJlZmVyZW5jZXMuYWRkQWxsKFZlcnNpb25pbmdVdGlscy5nZXRVUklzRnJvbURpcihuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgZnVsbEZpbGVQYXRoKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgcmVmcyBhbmQgYXR0YWNoIHRvIHByb2R1Y3QKKyAgICAgICAgVmVyc2lvbmluZ1V0aWxzLmFkZFJlZnNGcm9tVXJpcyhwcm9kdWN0LCByZWZlcmVuY2VzKTsKKworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJTdGRJbmdlc3RlcjogaW5nZXN0aW5nIHByb2R1Y3Q6ICIgKyBQUk9EVUNUX05BTUUKKyAgICAgICAgICAgICAgICArICI6IFsiICsgcHJvZHVjdE5hbWUgKyAiXTogIiArIFBST0RVQ1RfVFlQRSArICI6IFsiCisgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZSArICJdOiAiICsgRklMRV9MT0NBVElPTiArICI6IFsiICsgZmlsZUxvY2F0aW9uCisgICAgICAgICAgICAgICAgKyAiXSIpOworCisgICAgICAgIFN0cmluZyBwcm9kdWN0SUQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0SUQgPSBmbUNsaWVudC5pbmdlc3RQcm9kdWN0KHByb2R1Y3QsIG1ldCwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiZXhjZXB0aW9uIGluZ2VzdGluZyBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3ROYW1lICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5nZXN0RXhjZXB0aW9uKCJleGNlcHRpb24gaW5nZXN0aW5nIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdE5hbWUgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0SUQ7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuSW5nZXN0ZXIjaGFzUHJvZHVjdChqYXZhLm5ldC5VUkwsCisgICAgICogICAgICBqYXZhLmlvLkZpbGUpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJvZHVjdChVUkwgZm1VcmwsIEZpbGUgcHJvZEZpbGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9ueworICAgICAgICByZXR1cm4gaGFzUHJvZHVjdChmbVVybCwgcHJvZEZpbGUuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2soU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgcHJvcE5hbWUpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlByb3BlcnR5OiBbIiArIHByb3BOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIl0gaXMgbm90IHByb3ZpZGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3JTZXRGaWxlTWFuYWdlcihVUkwgdXJsKSB7CisgICAgICAgIGlmICh0aGlzLmZtQ2xpZW50ICE9IG51bGwgJiYgdGhpcy5mbUNsaWVudC5nZXRGaWxlTWFuYWdlclVybCgpICE9IG51bGwpIHsKKworICAgICAgICAgICAgaWYgKCF0aGlzLmZtQ2xpZW50LmdldEZpbGVNYW5hZ2VyVXJsKCkuZXF1YWxzKHVybCkpIHsKKyAgICAgICAgICAgICAgICBzZXRGaWxlTWFuYWdlcih1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RmlsZU1hbmFnZXIodXJsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRGaWxlTWFuYWdlcihVUkwgdXJsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCh1cmwpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU3RkSW5nZXN0ZXI6IGNvbm5lY3RlZCB0byBmaWxlIG1hbmFnZXI6IFsiCisgICAgICAgICAgICAgICAgICAgICsgdXJsICsgIl0iKTsKKyAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjbGllbnQgdHJhbnNmZXIgb2JqZWN0CisgICAgICAgICAgICAvLyB0aGUgY3Jhd2xlciB3aWxsIGhhdmUgdGhlIGNsaWVudCBwZXJmb3JtIHRoZSB0cmFuc2ZlcgorICAgICAgICAgICAgZm1DbGllbnQKKyAgICAgICAgICAgICAgICAgICAgLnNldERhdGFUcmFuc2ZlcihHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGFUcmFuc2ZlclNlcnZpY2VGcm9tRmFjdG9yeSh0aGlzLmNsaWVudFRyYW5zZmVyU2VydmljZUZhY3RvcnkpKTsKKyAgICAgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIGNvbm5lY3QgdG8gZmlsZSBtYW5hZ2VyOiBbIiArIHVybAorICAgICAgICAgICAgICAgICAgICArICJdOiBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHR5cGUgPSBmbUNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5TmFtZShwcm9kdWN0VHlwZU5hbWUpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZU5hbWUgKyAiXSBmcm9tIEZpbGUgTWFuYWdlciBhdDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBmbUNsaWVudC5nZXRGaWxlTWFuYWdlclVybCgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuSW5nZXN0ZXIjaGFzUHJvZHVjdChqYXZhLm5ldC5VUkwsCisgICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb2R1Y3QoVVJMIGZtVXJsLCBTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9ueworICAgICAgICBjaGVja09yU2V0RmlsZU1hbmFnZXIoZm1VcmwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZtQ2xpZW50Lmhhc1Byb2R1Y3QocHJvZHVjdE5hbWUpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjaGVjayBmb3IgZXhpc3RhbmNlIG9mIHByb2R1Y3Q6IFsiICsgcHJvZHVjdE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL0NvcmVNZXRLZXlzLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvQ29yZU1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQxNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL0NvcmVNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29yZU1ldEtleXMgeworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FID0gIlByb2R1Y3ROYW1lIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSUQgPSAiUHJvZHVjdElkIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfUkVDRVZJRURfVElNRSA9ICJQcm9kdWN0UmVjZWl2ZWRUaW1lIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTE9DQVRJT04gPSAiRmlsZUxvY2F0aW9uIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FID0gIkZpbGVuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NJWkUgPSAiRmlsZVNpemUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRSA9ICJQcm9kdWN0VHlwZSI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUUlVDVFVSRSA9ICJQcm9kdWN0U3RydWN0dXJlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAiTWltZVR5cGUiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvUHJvZHVjdE1ldEtleXMuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9Qcm9kdWN0TWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTU5YjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvUHJvZHVjdE1ldEtleXMuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogCisgKiBNZXQga2V5IGZpZWxkIG5hbWVzIHVzZWQgdG8gYXVnbWVudCB7QGxpbmsgUHJvZHVjdH0ge0BsaW5rIE1ldGFkYXRhfSBpbgorICoge0BsaW5rIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50I2dldE1ldGFkYXRhKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QpfQorICogYW5kIGluCisgKiB7QGxpbmsgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQjZ2V0UmVkdWNlZE1ldGFkYXRhKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QsIGphdmEudXRpbC5MaXN0KX0KKyAqIC4KKyAqIAorICogQHNlZSBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT09EVC03MgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvZHVjdE1ldEtleXMgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSUQgPSAiUHJvZHVjdElkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiUHJvZHVjdE5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfU1RSVUNUVVJFID0gIlByb2R1Y3RTdHJ1Y3R1cmUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFJBTlNGRVJfU1RBVFVTID0gIlByb2R1Y3RUcmFuc2ZlclN0YXR1cyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9ST09UX1JFRkVSRU5DRSA9ICJQcm9kdWN0Um9vdFJlZmVyZW5jZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9EQVRBU1RPUkVfUkVGUyA9ICJQcm9kdWN0RGF0YVN0b3JlUmVmZXJlbmNlcyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9PUklHX1JFRlMgPSAiUHJvZHVjdE9yaWdSZWZlcmVuY2VzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX01JTUVfVFlQRVMgPSAiUHJvZHVjdE1pbWVUeXBlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0ZJTEVfU0laRVMgPSAiUHJvZHVjdEZpbGVTaXplIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9BYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBmNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBwcm92aWRpbmcgZnVuY3Rpb25hbGl0eSB0byBhbnkgc3ViLWNsYXNzaW5nCisgKiB7QGxpbmsgRmlsZW1nck1ldEV4dHJhY3Rvcn1zLgorICogPC9wPi4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3RvciBpbXBsZW1lbnRzCisgICAgICAgIEZpbGVtZ3JNZXRFeHRyYWN0b3IgeworCisgICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgY29uZmlndXJhdGlvbjsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuCisgICAgICogICAgICBGaWxlbWdyTWV0RXh0cmFjdG9yI2V4dHJhY3RNZXRhZGF0YShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0LAorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0KQorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZVByb2R1Y3QocHJvZHVjdCwgbWV0KTsKKyAgICAgICAgcmV0dXJuIGRvRXh0cmFjdChwcm9kdWN0LCBtZXQpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW1nck1ldEV4dHJhY3RvciNjb25maWd1cmUoamF2YS51dGlsLlByb3BlcnRpZXMpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gcHJvcHM7CisgICAgICAgIGRvQ29uZmlndXJlKCk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IE1ldGFkYXRhIGRvRXh0cmFjdChQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZG9Db25maWd1cmUoKTsKKworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSAhPSBudWxsICYmIChwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgPT0gbnVsbCB8fCAocHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpICE9IG51bGwgJiYgcHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiIikpKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKCJQcm9kdWN0IFR5cGUgdW5kZWZpbmVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpICE9IG51bGwgJiYgcHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpID09IDApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigiUHJvZHVjdCByZWZlcmVuY2VzIHVuZGVmaW5lZCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgKG1ldCA9PSBudWxsIHx8IChtZXQgIT0gbnVsbCAmJiAobWV0LmdldEhhc2h0YWJsZSgpID09IG51bGwgfHwKKyAgICAgICAgICogKG1ldCAuZ2V0SGFzaHRhYmxlKCkgIT0gbnVsbCAmJiBtZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkgLnNpemUoKSA9PQorICAgICAgICAgKiAwKSkpKSB7IHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKCJNZXRhZGF0YSB1bmRlZmluZWQiKTsgfQorICAgICAgICAgKi8KKworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZE1ldGFkYXRhSWZVbmRlZmluZWQoTWV0YWRhdGEgb3JpZ01ldCwgTWV0YWRhdGEgZGVzdE1ldCwKKyAgICAgICAgICAgIFN0cmluZyBrZXksIFN0cmluZyB2YWwpIHsKKyAgICAgICAgaWYgKCFvcmlnTWV0LmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgIGRlc3RNZXQuYWRkTWV0YWRhdGEoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2UoTWV0YWRhdGEgc3JjLCBNZXRhZGF0YSBkZXN0KSB7CisgICAgICAgIGRlc3QuYWRkTWV0YWRhdGEoc3JjLmdldEhhc2h0YWJsZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRQcm9kdWN0RmlsZShQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgcHJvZEZpbGUgPSBudWxsOworCisgICAgICAgIGlmIChwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9kRmlsZSA9IG5ldyBGaWxlKGdldFJvb3RSZWZQYXRoKHByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKCJVUkkgZXhjZXB0aW9uIHBhcnNpbmc6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0Um9vdFJlZigpLmdldE9yaWdSZWZlcmVuY2UoKSArICJdIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2RGaWxlID0gbmV3IEZpbGUobmV3IFVSSSgoKFJlZmVyZW5jZSkgcHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApKS5nZXRPcmlnUmVmZXJlbmNlKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oIlVSSSBleGNlcHRpb24gcGFyc2luZzogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKChSZWZlcmVuY2UpIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcmlnUmVmZXJlbmNlKCkgKyAiXSIpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZEZpbGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb290UmVmUGF0aChMaXN0PFJlZmVyZW5jZT4gcmVmcywKKyAgICAgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZVJlcG9QYXRoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG5ldyBVUkkocmVmcy5nZXQoMCkKKyAgICAgICAgICAgICAgICAuZ2V0T3JpZ1JlZmVyZW5jZSgpKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9Db3JlTWV0RXh0cmFjdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9Db3JlTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4YWY3OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL0NvcmVNZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBjb3JlIHtAbGluayBGaWxlbWdyTWV0RXh0cmFjdG9yfSBwcm92aWRpbmcgdGhlIHtAbGluayBDb3JlTWV0S2V5c30KKyAqIGZvciB0aGlzIHtAbGluayBQcm9kdWN0fS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBDb3JlTWV0RXh0cmFjdG9yIGV4dGVuZHMgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yIGltcGxlbWVudHMKKyAgICAgICAgQ29yZU1ldEtleXMgeworCisgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZUF3YXJlID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50TnM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnNTZXBhcmF0b3IgPSAiLiI7CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBuc1JlcGxhY2VFbGVtZW50czsKKworICAgIHB1YmxpYyBDb3JlTWV0RXh0cmFjdG9yKCkgeworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuCisgICAgICogICAgICBBYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IjZG9FeHRyYWN0KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhKQorICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBkb0V4dHJhY3QoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXQpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGFkYXRhIGV4dHJhY3RNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgLyogY29weSB0aHJvdWdoIG9yaWdpbmFsIG1ldGFkYXRhICovCisgICAgICAgIG1lcmdlKG1ldCwgZXh0cmFjdE1ldCk7CisgICAgICAgIEZpbGUgcHJvZEZpbGUgPSBudWxsOworICAgICAgICBpZiAoIXByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpLmVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9TVFJFQU0pKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9kRmlsZSA9IGdldFByb2R1Y3RGaWxlKHByb2R1Y3QpOworICAgICAgICB9CisgICAgICAgIC8vR1VJRCB1c2VkIHdoZW4gbm8gZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggcHJvZHVjdCBpLmUuIHN0cmVhbQorICAgICAgICBTdHJpbmcgZ3VpZD1VVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgICAgICBleHRyYWN0TWV0CisgICAgICAgICAgICAgICAgLmFkZE1ldGFkYXRhKGlzTnNSZXBsYWNlKFBST0RVQ1RfSUQpID8gZWxlbWVudE5zICsgbnNTZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICsgUFJPRFVDVF9JRCA6IFBST0RVQ1RfSUQsIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgICBhZGRNZXRhZGF0YUlmVW5kZWZpbmVkKG1ldCwgZXh0cmFjdE1ldCwKKyAgICAgICAgICAgICAgICBpc05zUmVwbGFjZShGSUxFTkFNRSkgPyBlbGVtZW50TnMgKyBuc1NlcGFyYXRvciArIEZJTEVOQU1FCisgICAgICAgICAgICAgICAgICAgICAgICA6IEZJTEVOQU1FLCAocHJvZEZpbGUgPT0gbnVsbCk/Z3VpZDpwcm9kRmlsZS5nZXROYW1lKCkpOworICAgICAgICBhZGRNZXRhZGF0YUlmVW5kZWZpbmVkKG1ldCwgZXh0cmFjdE1ldCwKKyAgICAgICAgICAgICAgICBpc05zUmVwbGFjZShGSUxFX0xPQ0FUSU9OKSA/IGVsZW1lbnROcyArIG5zU2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICArIEZJTEVfTE9DQVRJT04gOiBGSUxFX0xPQ0FUSU9OLCAocHJvZEZpbGU9PW51bGwpP2d1aWQ6cHJvZEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBhZGRNZXRhZGF0YUlmVW5kZWZpbmVkKG1ldCwgZXh0cmFjdE1ldCwKKyAgICAgICAgICAgICAgICBpc05zUmVwbGFjZShQUk9EVUNUX05BTUUpID8gZWxlbWVudE5zICsgbnNTZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICsgUFJPRFVDVF9OQU1FIDogUFJPRFVDVF9OQU1FLCBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgICBhZGRNZXRhZGF0YUlmVW5kZWZpbmVkKG1ldCwgZXh0cmFjdE1ldCwKKyAgICAgICAgICAgICAgICBpc05zUmVwbGFjZShQUk9EVUNUX1NUUlVDVFVSRSkgPyBlbGVtZW50TnMgKyBuc1NlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgKyBQUk9EVUNUX1NUUlVDVFVSRSA6IFBST0RVQ1RfU1RSVUNUVVJFLCBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICAgICAgZXh0cmFjdE1ldC5hZGRNZXRhZGF0YShpc05zUmVwbGFjZShQUk9EVUNUX1JFQ0VWSUVEX1RJTUUpID8gZWxlbWVudE5zCisgICAgICAgICAgICAgICAgKyBuc1NlcGFyYXRvciArIFBST0RVQ1RfUkVDRVZJRURfVElNRSA6IFBST0RVQ1RfUkVDRVZJRURfVElNRSwKKyAgICAgICAgICAgICAgICBEYXRlQ29udmVydC5pc29Gb3JtYXQobmV3IERhdGUoKSkpOworICAgICAgICBhZGRNZXRhZGF0YUlmVW5kZWZpbmVkKG1ldCwgZXh0cmFjdE1ldCwKKyAgICAgICAgICAgICAgICBpc05zUmVwbGFjZShQUk9EVUNUX1RZUEUpID8gZWxlbWVudE5zICsgbnNTZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICsgUFJPRFVDVF9UWVBFIDogUFJPRFVDVF9UWVBFLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgICAgIHJldHVybiBleHRyYWN0TWV0OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yI2RvQ29uZmlndXJlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0NvbmZpZ3VyZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBuYW1lc3BhY2VBd2FyZSA9IEJvb2xlYW4udmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJuc0F3YXJlIikpLmJvb2xlYW5WYWx1ZSgpOworCisgICAgICAgICAgICBpZiAobmFtZXNwYWNlQXdhcmUpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50TnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoImVsZW1lbnROcyIpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXBsYWNlRWxlbVN0ciA9IHRoaXMuY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJlbGVtZW50cyIpOworICAgICAgICAgICAgICAgIG5zUmVwbGFjZUVsZW1lbnRzID0gQXJyYXlzLmFzTGlzdChyZXBsYWNlRWxlbVN0ci5zcGxpdCgiLCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc05zUmVwbGFjZShTdHJpbmcgZWxlbU5hbWUpIHsKKyAgICAgICAgaWYgKHRoaXMubnNSZXBsYWNlRWxlbWVudHMgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8ICh0aGlzLm5zUmVwbGFjZUVsZW1lbnRzICE9IG51bGwgJiYgdGhpcy5uc1JlcGxhY2VFbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUF3YXJlICYmIHRoaXMubnNSZXBsYWNlRWxlbWVudHMuY29udGFpbnMoZWxlbU5hbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW1nck1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW1nck1ldEV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjFlODcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9GaWxlbWdyTWV0RXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBjb3JlIGludGVyZmFjZSBmb3Ige0BsaW5rIE1ldGFkYXRhfSBleHRyYWN0aW9uIG9uIHRoZSBGaWxlIE1hbmFnZXIgc2VydmVyCisgKiBzaWRlLgorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBGaWxlbWdyTWV0RXh0cmFjdG9yIHsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIFByb2R1Y3R9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9kdWN0CisgICAgICogICAgICAgICAgICBUaGUgZ2l2ZW4ge0BsaW5rIFByb2R1Y3R9LgorICAgICAqIEBwYXJhbSBtZXQKKyAgICAgKiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB7QGxpbmsgTWV0YWRhdGF9IHByb3ZpZGVkIGR1cmluZyBpbmdlc3Rpb24uCisgICAgICogQHJldHVybiBFeHRyYWN0ZWQge0BsaW5rIE1ldGFkYXRhfSBkZXJpdmVkIGZyb20gdGhlIGV4aXN0aW5nCisgICAgICogICAgICAgICB7QGxpbmsgTWV0YWRhdGF9IGFuZCB7QGxpbmsgUHJvZHVjdH0gcHJvdmlkZWQuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJhY3RNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBNZXRhZGF0YSBleHRyYWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BzCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdCB0byBjb25maWd1cmUgdGhpcyBNZXRhZGF0YQorICAgICAqICAgICAgICAgICAgZXh0cmFjdG9yIHdpdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgcHJvcHMpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvRGF0ZVRpbWVFeHBhbmRNZXRFeHRyYWN0b3IuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL0RhdGVUaW1lRXhwYW5kTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1NTk0YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL0RhdGVUaW1lRXhwYW5kTWV0RXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlczsKKworLy8gT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvLyBHb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKKworLyoqCisgKiBFeHBhbmRzIGEgZ2l2ZW4gbWV0YWRhdGEgZGF0ZSB0aW1lIGZpZWxkIG91dCBpbnRvIG11bHRpcGxlIG1ldGFkYXRhIGZpZWxkcyAoaS5lLiB5ZWFyLCBtb250aCwKKyAqIGRheSwgaG91ciwgbWludXRlLCBhbmQgc2Vjb25kKS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyQGFwYWNoZS5vcmcgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIERhdGVUaW1lRXhwYW5kTWV0RXh0cmFjdG9yIGV4dGVuZHMgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTF9EQVRFX1RJTUVfS0VZID0gIkZ1bGxEYXRlVGltZUtleSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX0RBVEVfVElNRV9GT1JNQVQgPSAiRnVsbERhdGVUaW1lRm9ybWF0IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVBUl9LRVkgPSAiWWVhcktleSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT05USF9LRVkgPSAiTW9udGhLZXkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFZX0tFWSA9ICJEYXlLZXkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9VUl9LRVkgPSAiSG91cktleSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VVEVfS0VZID0gIk1pbnV0ZUtleSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfS0VZID0gIlNlY29uZEtleSI7CisKKyAgcHJpdmF0ZSBTdHJpbmcgZnVsbERhdGVUaW1lS2V5OworICBwcml2YXRlIFN0cmluZyBmdWxsRGF0ZVRpbWVGb3JtYXQ7CisgIHByaXZhdGUgU3RyaW5nIHllYXJLZXk7CisgIHByaXZhdGUgU3RyaW5nIG1vbnRoS2V5OworICBwcml2YXRlIFN0cmluZyBkYXlLZXk7CisgIHByaXZhdGUgU3RyaW5nIGhvdXJLZXk7CisgIHByaXZhdGUgU3RyaW5nIG1pbnV0ZUtleTsKKyAgcHJpdmF0ZSBTdHJpbmcgc2Vjb25kS2V5OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb0NvbmZpZ3VyZSgpIHsKKyAgICBmdWxsRGF0ZVRpbWVLZXkgPSBnZXRLZXkoRlVMTF9EQVRFX1RJTUVfS0VZKTsKKyAgICBmdWxsRGF0ZVRpbWVGb3JtYXQgPSBnZXRLZXkoRlVMTF9EQVRFX1RJTUVfRk9STUFUKTsKKyAgICB5ZWFyS2V5ID0gZ2V0S2V5KFlFQVJfS0VZKTsKKyAgICBtb250aEtleSA9IGdldEtleShNT05USF9LRVkpOworICAgIGRheUtleSA9IGdldEtleShEQVlfS0VZKTsKKyAgICBob3VyS2V5ID0gZ2V0S2V5KEhPVVJfS0VZKTsKKyAgICBtaW51dGVLZXkgPSBnZXRLZXkoTUlOVVRFX0tFWSk7CisgICAgc2Vjb25kS2V5ID0gZ2V0S2V5KFNFQ09ORF9LRVkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNZXRhZGF0YSBkb0V4dHJhY3QoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgIFN0cmluZyBmdWxsRGF0ZVRpbWUgPSBnZXRGdWxsRGF0ZVRpbWUobWV0YWRhdGEpOworCisgICAgY3JlYXRlRGF0ZUZpZWxkKG1ldGFkYXRhLCB5ZWFyS2V5LCBmdWxsRGF0ZVRpbWUsIGZ1bGxEYXRlVGltZUZvcm1hdCwgInl5eXkiKTsKKyAgICBjcmVhdGVEYXRlRmllbGQobWV0YWRhdGEsIG1vbnRoS2V5LCBmdWxsRGF0ZVRpbWUsIGZ1bGxEYXRlVGltZUZvcm1hdCwgIk1NIik7CisgICAgY3JlYXRlRGF0ZUZpZWxkKG1ldGFkYXRhLCBkYXlLZXksIGZ1bGxEYXRlVGltZSwgZnVsbERhdGVUaW1lRm9ybWF0LCAiZGQiKTsKKyAgICBjcmVhdGVEYXRlRmllbGQobWV0YWRhdGEsIGhvdXJLZXksIGZ1bGxEYXRlVGltZSwgZnVsbERhdGVUaW1lRm9ybWF0LCAiSEgiKTsKKyAgICBjcmVhdGVEYXRlRmllbGQobWV0YWRhdGEsIG1pbnV0ZUtleSwgZnVsbERhdGVUaW1lLCBmdWxsRGF0ZVRpbWVGb3JtYXQsICJtbSIpOworICAgIGNyZWF0ZURhdGVGaWVsZChtZXRhZGF0YSwgc2Vjb25kS2V5LCBmdWxsRGF0ZVRpbWUsIGZ1bGxEYXRlVGltZUZvcm1hdCwgInNzIik7CisgICAgcmV0dXJuIG1ldGFkYXRhOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KFN0cmluZyBrZXkpIHsKKyAgICBpZiAoY29uZmlndXJhdGlvbi5jb250YWluc0tleShrZXkpKSB7CisgICAgICByZXR1cm4gY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShrZXkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRGdWxsRGF0ZVRpbWUoTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGZ1bGxEYXRlVGltZUtleSkpIHsKKyAgICAgIHJldHVybiBtZXRhZGF0YS5nZXRNZXRhZGF0YShmdWxsRGF0ZVRpbWVLZXkpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbmQgRGF0ZVRpbWVLZXkgIiArIGZ1bGxEYXRlVGltZUtleSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURhdGVGaWVsZChNZXRhZGF0YSBtZXRhZGF0YSwgU3RyaW5nIGZpZWxkS2V5LCBTdHJpbmcgZnVsbERhdGVUaW1lLAorICAgICAgU3RyaW5nIGZ1bGxEYXRlVGltZUZvcm1hdCwgU3RyaW5nIGZpZWxkRm9ybWF0KSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZmllbGRLZXkpKSB7CisgICAgICB0cnkgeworICAgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShmaWVsZEtleSwgUGF0aFV0aWxzLmRvRHluYW1pY1JlcGxhY2VtZW50KFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiW0ZPUk1BVCglcywlcywlcyldIiwgZnVsbERhdGVUaW1lRm9ybWF0LCBmdWxsRGF0ZVRpbWUsIGZpZWxkRm9ybWF0KSkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGZpZWxkIGZvciBrZXkgJXMgZnJvbSBmdWxsRGF0ZVRpbWUgJXMgYW5kIGZ1bGxEYXRlVGltZUZvcm1hdCAlcyIsCisgICAgICAgICAgICBmaWVsZEtleSwgZnVsbERhdGVUaW1lLCBmdWxsRGF0ZVRpbWVGb3JtYXQpLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL0ZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL0ZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODlhZjYzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvRmlsZW5hbWVSZWdleE1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5BYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5NZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgbmNodW5nCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRXh0cmFjdHMge0BsaW5rIE1ldGFkYXRhfSBmcm9tIGEge0BsaW5rIFByb2R1Y3R9IGZpbGVuYW1lIHRoYXQgbWF0Y2hlcyAKKyAqIGEgcHJvdmlkZWQgcmVndWxhciBleHByZXNzaW9uLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIEZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IgeworCisgICBwcml2YXRlIFN0cmluZyBmaWxlbmFtZVBhdHRlcm47CisgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtZXRhZGF0YUtleXM7CisKKyAgIHB1YmxpYyB2b2lkIGRvQ29uZmlndXJlKCkgeworICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICB0aGlzLmZpbGVuYW1lUGF0dGVybiA9IHRoaXMuY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJmaWxlbmFtZVBhdHRlcm4iKTsKKyAgICAgICAgIHRoaXMubWV0YWRhdGFLZXlzID0gQXJyYXlzLmFzTGlzdCh0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAibWV0YWRhdGFLZXlzIikuc3BsaXQoIiwiKSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBNZXRhZGF0YSBkb0V4dHJhY3QoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXQpCisgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBNZXRhZGF0YSBleHRyYWN0TWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBtZXJnZShtZXQsIGV4dHJhY3RNZXQpOworICAgICAgCisgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodGhpcy5maWxlbmFtZVBhdHRlcm4pOworICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGdldFByb2R1Y3RGaWxlKHByb2R1Y3QpLmdldE5hbWUoKSk7CisgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZXRhZGF0YUtleXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSB0aGlzLm1ldGFkYXRhS2V5cy5nZXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtYXRjaGVyLmdyb3VwKGkgKyAxKTsKKyAgICAgICAgICAgIGV4dHJhY3RNZXQuYWRkTWV0YWRhdGEoa2V5LCB2YWx1ZSk7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oIkZpbGVuYW1lIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHBhdHRlcm4gIgorICAgICAgICAgICAgICAgKyB0aGlzLmZpbGVuYW1lUGF0dGVybik7CisgICAgICB9CisgICAgICByZXR1cm4gZXh0cmFjdE1ldDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL0ZpbmFsRmlsZUxvY2F0aW9uRXh0cmFjdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9GaW5hbEZpbGVMb2NhdGlvbkV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzg2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9GaW5hbEZpbGVMb2NhdGlvbkV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLkFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5WZXJzaW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuVmVyc2lvbmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogCisgKiBFeHRyYWN0cyB0aGUgZmluYWwgPGNvZGU+RklMRV9MT0NBVElPTjwvY29kZT4gbWV0IGZpZWxkIGZyb20gdGhlIHVuZGVybHlpbmcKKyAqIHtAbGluayBQcm9kdWN0fSBhbmQgc2V0cyBpdCBhcHByb3ByaWF0ZWx5IGluIHRoZSB7QGxpbmsgUHJvZHVjdH0KKyAqIHtAbGluayBNZXRhZGF0YX0uCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbmFsRmlsZUxvY2F0aW9uRXh0cmFjdG9yIGV4dGVuZHMgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yCisgICAgaW1wbGVtZW50cyBDb3JlTWV0S2V5cyB7CisKKyAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VMb2NhdGlvbjsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLkFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3RvcgorICAgKiAjZG9Db25maWd1cmUoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvQ29uZmlndXJlKCkgeworICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgeworICAgICAgdGhpcy5yZXBsYWNlTG9jYXRpb24gPSBCb29sZWFuLnBhcnNlQm9vbGVhbih0aGlzLmNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAuZ2V0UHJvcGVydHkoInJlcGxhY2UiKSk7CisgICAgfQorCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLkFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3RvcgorICAgKiAjZG9FeHRyYWN0KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QsCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIE1ldGFkYXRhIGRvRXh0cmFjdChQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkKKyAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICBNZXRhZGF0YSBleHRyYWN0TWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWVyZ2UobWV0LCBleHRyYWN0TWV0KTsKKyAgICAvLyBnZXQgdGhlIFZlcnNpb25lcgorICAgIFZlcnNpb25lciB2ZXJzaW9uZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgIC5nZXRWZXJzaW9uZXJGcm9tQ2xhc3NOYW1lKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRWZXJzaW9uZXIoKSk7CisgICAgdHJ5IHsKKyAgICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2R1Y3QsIG1ldCk7CisgICAgfSBjYXRjaCAoVmVyc2lvbmluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVW5hYmxlIHRvIGdlbmVyYXRlIGZpbmFsIEZpbGVMb2NhdGlvbjogUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIFJlZmVyZW5jZSByID0gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKTsKKyAgICBTdHJpbmcgZmluYWxMb2NhdGlvbiA9IFZlcnNpb25pbmdVdGlscy5nZXRBYnNvbHV0ZVBhdGhGcm9tVXJpKHIKKyAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKyAgICBpZiAodGhpcy5yZXBsYWNlTG9jYXRpb24pIHsKKyAgICAgIGV4dHJhY3RNZXQucmVwbGFjZU1ldGFkYXRhKEZJTEVfTE9DQVRJT04sCisgICAgICAgICAgbmV3IEZpbGUoZmluYWxMb2NhdGlvbikuZ2V0UGFyZW50KCkpOworICAgIH0gZWxzZSB7CisgICAgICBleHRyYWN0TWV0CisgICAgICAgICAgLmFkZE1ldGFkYXRhKEZJTEVfTE9DQVRJT04sIG5ldyBGaWxlKGZpbmFsTG9jYXRpb24pLmdldFBhcmVudCgpKTsKKyAgICB9CisKKyAgICB0aGlzLnNjcnViUmVmcyhwcm9kdWN0KTsKKworICAgIHJldHVybiBleHRyYWN0TWV0OworCisgIH0KKworICBwcml2YXRlIHZvaWQgc2NydWJSZWZzKFByb2R1Y3QgcCkgeworICAgIGlmIChwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkgPT0gbnVsbCkKKyAgICAgIHJldHVybjsKKworICAgIGZvciAoUmVmZXJlbmNlIHIgOiBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpIHsKKyAgICAgIHIuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKCIiKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvTWltZVR5cGVFeHRyYWN0b3IuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL01pbWVUeXBlRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NjVmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL01pbWVUeXBlRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXMuKjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gZXhhbXBsZSB7QGxpbmsgRmlsZW1nck1ldEV4dHJhY3Rvcn0gdG8gZXh0cmFjdCBvdXQgYSBQcm9kdWN0J3MgCisgKiBNaW1lIFR5cGUuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgTWltZVR5cGVFeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IgeworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5BYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IjZG9Db25maWd1cmUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvQ29uZmlndXJlKCkgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLkFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3RvciNkb0V4dHJhY3Qob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGRvRXh0cmFjdChQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0YWRhdGEgZXh0cmFjdE1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtZXJnZShtZXQsIGV4dHJhY3RNZXQpOworCisgICAgICAgIGlmIChwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKS5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCkpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSBwcm9kUmVmID0gKFJlZmVyZW5jZSkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAvKlJlZmVyZW5jZSBtaW1lUmVmID0gbmV3IFJlZmVyZW5jZShwcm9kUmVmLmdldE9yaWdSZWZlcmVuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvZFJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwgcHJvZFJlZi5nZXRGaWxlU2l6ZSgpKTsqLworCisgICAgICAgICAgICBleHRyYWN0TWV0LmFkZE1ldGFkYXRhKE1JTUVfVFlQRSwgcHJvZFJlZi5nZXRNaW1lVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBleHRyYWN0TWV0LmFkZE1ldGFkYXRhKE1JTUVfVFlQRSwgcHJvZFJlZi5nZXRNaW1lVHlwZSgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIGV4dHJhY3RNZXQuYWRkTWV0YWRhdGEoTUlNRV9UWVBFLCBwcm9kUmVmLmdldE1pbWVUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKS5nZXRTdWJ0eXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV4dHJhY3RNZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9UaWthQXV0b0RldGVjdEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGlrYUF1dG9EZXRlY3RFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI4ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGlrYUF1dG9EZXRlY3RFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworLy9USUtBIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EuZXhjZXB0aW9uLlRpa2FFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLnBhcnNlci4qOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCisKK3B1YmxpYyBjbGFzcyBUaWthQXV0b0RldGVjdEV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3RvciAgeworCisgICAgcHVibGljIHZvaWQgZG9Db25maWd1cmUoKSB7CisgICAgfQorCisgICAgcHVibGljIE1ldGFkYXRhIGRvRXh0cmFjdChQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICBNZXRhZGF0YSBvdXRNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCisgICAgICAgIG1lcmdlKG1ldCwgb3V0TWV0YWRhdGEpOworICAgICAgICBNZXRhZGF0YSB0aWthTWV0YWRhdGEgPSBnZXRNZXRhZGF0YUZyb21UaWthKHByb2R1Y3QpOworICAgICAgICBtZXJnZSh0aWthTWV0YWRhdGEsIG91dE1ldGFkYXRhKTsKKworICAgICAgICByZXR1cm4gb3V0TWV0YWRhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhZGF0YSBnZXRNZXRhZGF0YUZyb21UaWthKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gZ2V0UHJvZHVjdEZpbGUocHJvZHVjdCk7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgb3JnLmFwYWNoZS50aWthLm1ldGFkYXRhLk1ldGFkYXRhIHRpa2FNZXRhZGF0YSA9IG5ldyBvcmcuYXBhY2hlLnRpa2EubWV0YWRhdGEuTWV0YWRhdGEoKTsKKyAgICAgICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgQXV0b0RldGVjdFBhcnNlcigpOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlucHV0U3RyZWFtLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSwgdGlrYU1ldGFkYXRhLCBuZXcgUGFyc2VDb250ZXh0KCkpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSh0aWthTWV0YWRhdGEpOworCisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGZpbGU6IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoVGlrYUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSB0aGUgZG9jdW1lbnQ6IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiIFVuYWJsZSB0byBwcm9jZXNzIHRoZSBTQVggZXZlbnRzIDogUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZWFkIHRoZSBkb2N1bWVudCBzdHJlYW06IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWV0YWRhdGEgdHJhbnNmb3JtKG9yZy5hcGFjaGUudGlrYS5tZXRhZGF0YS5NZXRhZGF0YSB0aWthTWV0YWRhdGEpeworICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gdGlrYU1ldGFkYXRhLm5hbWVzKCk7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcyl7CisgICAgICAgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShuYW1lLCBBcnJheXMuYXNMaXN0KHRpa2FNZXRhZGF0YS5nZXRWYWx1ZXMobmFtZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXRhZGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9EYXRhU291cmNlUmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9yZXBvc2l0b3J5L0RhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Njk0NjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9EYXRhU291cmNlUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5EYlN0cnVjdEZhY3Rvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUmVwb3NpdG9yeU1hbmFnZXJ9IGludGVyZmFjZSB0aGF0IGlzIGJhY2tlZAorICogYnkgYSB7QGxpbmsgRGF0YVNvdXJjZX0gZm9yIHN0b3JpbmcgYW5kIHJldHJlaXZpbmcge0BsaW5rIFByb2R1Y3R9IHBvbGljeSBpbgorICogdGhlIGZvcm0gb2Yge0BsaW5rIFByb2R1Y3RUeXBlfXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlciBpbXBsZW1lbnRzIFJlcG9zaXRvcnlNYW5hZ2VyIHsKKworICAgIC8qIG91ciBzcWwgZGF0YSBzb3VyY2UgKi8KKyAgICBwcml2YXRlIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisgICAgICogPC9wPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZHMKKyAgICAgKiAgICAgICAgICAgIFRoZSBEYXRhU291cmNlIHRvIGluaXRpYWxpemUgdGhpcyByZXBvc2l0b3J5IG1hbmFnZXIgd2l0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YVNvdXJjZVJlcG9zaXRvcnlNYW5hZ2VyKERhdGFTb3VyY2UgZHMpIHsKKyAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlciNhZGRQcm9kdWN0VHlwZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBhZGRQcm9kdWN0VHlwZVNxbCA9ICJJTlNFUlQgSU5UTyBwcm9kdWN0X3R5cGVzIChwcm9kdWN0X3R5cGVfbmFtZSwgcHJvZHVjdF90eXBlX2Rlc2NyaXB0aW9uLCBwcm9kdWN0X3R5cGVfcmVwb3NpdG9yeV9wYXRoLCBwcm9kdWN0X3R5cGVfdmVyc2lvbmVyX2NsYXNzKSAiCisgICAgICAgICAgICAgICAgICAgICsgIlZBTFVFUyAoJyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJywgJyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXREZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIicsICciCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJywgJyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXRWZXJzaW9uZXIoKSArICInKSI7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImFkZFByb2R1Y3RUeXBlOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBhZGRQcm9kdWN0VHlwZVNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShhZGRQcm9kdWN0VHlwZVNxbCk7CisKKyAgICAgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZUlkID0gbmV3IFN0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGdldFByb2R1Y3RUeXBlSWRTcWwgPSAiU0VMRUNUIE1BWChwcm9kdWN0X3R5cGVfaWQpIEFTIG1heF9pZCBGUk9NIHByb2R1Y3RfdHlwZXMiOworCisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFR5cGVJZFNxbCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZUlkID0gU3RyaW5nLnZhbHVlT2YocnMuZ2V0SW50KCJtYXhfaWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2R1Y3RUeXBlLnNldFByb2R1Y3RUeXBlSWQocHJvZHVjdFR5cGVJZCk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcmVmZXJlbmNlcyB0YWJsZQorICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZVJlZlNxbCA9ICJDUkVBVEUgVEFCTEUgcHJvZHVjdF9yZWZlcmVuY2VfIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIChwcm9kdWN0X2lkIGludCBOT1QgTlVMTCwgcHJvZHVjdF9vcmlnX3JlZmVyZW5jZSB2YXJjaGFyKDI1NSksIHByb2R1Y3RfZGF0YXN0b3JlX3JlZmVyZW5jZSB2YXJjaGFyKDI1NSkpIjsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImFkZFByb2R1Y3RUeXBlOiBFeGVjdXRpbmc6ICIgKyBjcmVhdGVSZWZTcWwpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoY3JlYXRlUmVmU3FsKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBtZXRhZGF0YSB0YWJsZQorICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZU1ldGFTcWwgPSAiQ1JFQVRFIFRBQkxFIHByb2R1Y3RfbWV0YWRhdGFfIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIChwcm9kdWN0X2lkIGludCBOT1QgTlVMTCwgZWxlbWVudF9pZCBpbnQgTk9UIE5VTEwsIG1ldGFkYXRhX3ZhbHVlIHZhcmNoYXIoMjAwMCkgTk9UIE5VTEwpIjsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImFkZFByb2R1Y3RUeXBlOiBFeGVjdXRpbmc6ICIgKyBjcmVhdGVNZXRhU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKGNyZWF0ZU1ldGFTcWwpOworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBhZGRpbmcgcHJvZHVjdCB0eXBlLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgYWRkUHJvZHVjdFR5cGUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyI21vZGlmeVByb2R1Y3RUeXBlKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb2RpZnlQcm9kdWN0VHlwZShQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIG1vZGlmeVByb2R1Y3RUeXBlU3FsID0gIlVQREFURSBwcm9kdWN0X3R5cGVzIFNFVCBwcm9kdWN0X3R5cGVfbmFtZT0nIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICInLCBwcm9kdWN0X3R5cGVfZGVzY3JpcHRpb249JyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXREZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIicsICIKKyAgICAgICAgICAgICAgICAgICAgKyAicHJvZHVjdF90eXBlX3ZlcnNpb25lcl9jbGFzcz0nIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlLmdldFZlcnNpb25lcigpCisgICAgICAgICAgICAgICAgICAgICsgIicsIHByb2R1Y3RfdHlwZV9yZXBvc2l0b3J5X3BhdGg9JyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKQorICAgICAgICAgICAgICAgICAgICArICInICIKKyAgICAgICAgICAgICAgICAgICAgKyAiV0hFUkUgcHJvZHVjdF90eXBlX2lkID0gIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKTsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAibW9kaWZ5UHJvZHVjdFR5cGU6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICArIG1vZGlmeVByb2R1Y3RUeXBlU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKG1vZGlmeVByb2R1Y3RUeXBlU3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gbW9kaWZ5aW5nIHByb2R1Y3QgdHlwZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgbW9kaWZ5UHJvZHVjdFR5cGUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjcmVtb3ZlUHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBkZWxldGVQcm9kdWN0VHlwZVNxbCA9ICJERUxFVEUgRlJPTSBwcm9kdWN0X3R5cGVzIFdIRVJFIHByb2R1Y3RfdHlwZV9pZCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCk7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgInJlbW92ZVByb2R1Y3RUeXBlOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkZWxldGVQcm9kdWN0VHlwZVNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShkZWxldGVQcm9kdWN0VHlwZVNxbCk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IERlY2lkZSBpZiBpdCBtYWtlcyBzZW5zZSB0byBkZWxldGUgdGhlIHJlZmVyZW5jZXMgdGFibGUKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgbWV0YWRhdGEgdGFibGUgaGVyZS4gRm9yIG5vdywgd2Ugd29uJ3QgYmVjYXVzZSBtYXliZQorICAgICAgICAgICAgLy8gdGhleSdsbCBqdXN0IHdhbnQgdG8gcmVtb3ZlIHRoZSBhYmlsaXR5IHRvIGRlYWwgd2l0aCB0aGlzIHByb2R1Y3QKKyAgICAgICAgICAgIC8vIHR5cGUKKyAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHJlbW92ZSBhbGwgb2YgdGhlIG1ldGRhdGEgYW5kIHJlZmVyZW5jZXMgZm9yIHRoZQorICAgICAgICAgICAgLy8gcHJvZHVjdHMgd2l0aCBpdAorICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiByZW1vdmluZyBwcm9kdWN0IHR5cGUuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayByZW1vdmVQcm9kdWN0VHlwZSB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjZ2V0UHJvZHVjdFR5cGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlJZChTdHJpbmcgcHJvZHVjdFR5cGVJZCkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFByb2R1Y3RUeXBlU3FsID0gIlNFTEVDVCAqIGZyb20gcHJvZHVjdF90eXBlcyBXSEVSRSBwcm9kdWN0X3R5cGVfaWQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVJZDsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0UHJvZHVjdFR5cGVCeUlkOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRQcm9kdWN0VHlwZVNxbCk7CisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFR5cGVTcWwpOworCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGUgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdFR5cGUocnMpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgcHJvZHVjdCB0eXBlLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0UHJvZHVjdFR5cGVCeUlkIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0VHlwZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyI2dldFByb2R1Y3RUeXBlQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRQcm9kdWN0VHlwZVNxbCA9ICJTRUxFQ1QgKiBmcm9tIHByb2R1Y3RfdHlwZXMgV0hFUkUgcHJvZHVjdF90eXBlX25hbWUgPSAnIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlTmFtZSArICInIjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0UHJvZHVjdFR5cGVCeU5hbWU6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICArIGdldFByb2R1Y3RUeXBlU3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRQcm9kdWN0VHlwZVNxbCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZSA9IERiU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0VHlwZShycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBwcm9kdWN0IHR5cGUuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRQcm9kdWN0VHlwZUJ5TmFtZSB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdFR5cGU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlciNnZXRQcm9kdWN0VHlwZXMoKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3RUeXBlPiBnZXRQcm9kdWN0VHlwZXMoKSB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBMaXN0PFByb2R1Y3RUeXBlPiBwcm9kdWN0VHlwZXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0UHJvZHVjdFR5cGVTcWwgPSAiU0VMRUNUICogZnJvbSBwcm9kdWN0X3R5cGVzIjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0UHJvZHVjdFR5cGVzOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRQcm9kdWN0VHlwZVNxbCk7CisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFR5cGVTcWwpOworCisgICAgICAgICAgICBwcm9kdWN0VHlwZXMgPSBuZXcgVmVjdG9yPFByb2R1Y3RUeXBlPigpOworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RUeXBlKHJzKTsKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZXMuYWRkKHByb2R1Y3RUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByb2R1Y3RUeXBlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlcyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBwcm9kdWN0IHR5cGVzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0UHJvZHVjdFR5cGVzIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0VHlwZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9EYXRhU291cmNlUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9EYXRhU291cmNlUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2OWJjOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9yZXBvc2l0b3J5L0RhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIERhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlcn1zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5IGltcGxlbWVudHMKKyAgICAgICAgUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5IHsKKworICAgIC8qIG91ciBkYXRhIHNvdXJjZSAqLworICAgIHByaXZhdGUgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+LgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqZGJjVXJsID0gbnVsbCwgdXNlciA9IG51bGwsIHBhc3MgPSBudWxsLCBkcml2ZXIgPSBudWxsOworCisgICAgICAgIGpkYmNVcmwgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy51cmwiKTsKKyAgICAgICAgdXNlciA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnVzZXIiKTsKKyAgICAgICAgcGFzcyA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnBhc3MiKTsKKyAgICAgICAgZHJpdmVyID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMuZHJpdmVyIik7CisKKyAgICAgICAgZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsCisgICAgICAgICAgICAgICAgZHJpdmVyLCBqZGJjVXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgUmVwb3NpdG9yeU1hbmFnZXIgZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIERhdGFTb3VyY2V9LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZHMKKyAgICAgKiAgICAgICAgICAgIFRoZSBEYXRhU291cmNlIHRvIGNvbnN0cnVjdCB0aGUgUmVwb3NpdG9yeU1hbmFnZXIgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YVNvdXJjZVJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeShEYXRhU291cmNlIGRzKSB7CisgICAgICAgIGRhdGFTb3VyY2UgPSBkczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeSNjcmVhdGVSZXBvc2l0b3J5TWFuYWdlcigpCisgICAgICovCisgICAgcHVibGljIFJlcG9zaXRvcnlNYW5hZ2VyIGNyZWF0ZVJlcG9zaXRvcnlNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlcihkYXRhU291cmNlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9yZXBvc2l0b3J5L1JlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWRkOWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogQSBSZXBvc2l0b3J5IE1hbmFnZXIgaXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nCisgKiB7QGxpbmsgUHJvZHVjdFR5cGV9IGluZm9ybWF0aW9uIHdoaWNoIGJvaWxzIGRvd24gdG8gcG9saWN5IGluZm9ybWF0aW9uIGFib3V0CisgKiB7QGxpbmsgUHJvZHVjdH1zIHRoYXQgYXJlIGluZ2VzdGVkIGludG8gdGhlIEZpbGUgTWFuYWdlci4gVGhpcyBpbmNsdWRlcworICogaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcm9vdCByZXBvc2l0b3J5IHBhdGggZm9yIGEgcHJvZHVjdCB0eXBlLCB3aGF0IHR5cGUgb2YKKyAqIFVSSSBnZW5lcmF0aW9uIHNjaGVtZSB0byBhcHBseSwgZXRjLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVwb3NpdG9yeU1hbmFnZXIgeworCisgICAgLyogZXh0ZW5zaW9uIHBvaW50IElEICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWF9QT0lOVF9JRCA9IFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEFkZHMgYSBQcm9kdWN0VHlwZSB0byB0aGUgUmVwb3NpdG9yeU1hbmFnZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9kdWN0VHlwZQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBQcm9kdWN0VHlwZX0gdG8gYWRkLgorICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9kdWN0VHlwZShQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIE1vZGlmaWVzIGEgUHJvZHVjdFR5cGUgaW4gdGhlIFJlcG9zaXRvcnlNYW5hZ2VyIHdpdGggdGhlIHNwZWNpZmllZCBJRAorICAgICAqIGZpZWxkIG9mIHRoZSA8Y29kZT5wcm9kdWN0VHlwZTwvY29kZT4uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9kdWN0VHlwZQorICAgICAqICAgICAgICAgICAgVGhlIG5ldyB7QGxpbmsgUHJvZHVjdFR5cGV9IGluZm9ybWF0aW9uLgorICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeVByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogUmVtb3ZlcyBhIFByb2R1Y3RUeXBlIGZyb20gdGhlIFJlcG9zaXRvcnlNYW5hZ2VyCisgICAgICogPC9wPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdFR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0VHlwZSB0byByZW1vdmUuCisgICAgICogQHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSByZW1vdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogR2V0cyBhIHtsaW5rIFByb2R1Y3RUeXBlfSBmcm9tIHRoZSBSZXBvc2l0b3J5TWFuYWdlciBpZGVudGlmaWVkIGJ5IGl0cworICAgICAqIDxjb2RlPnByb2R1Y3RUeXBlSWQ8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdFR5cGVJZAorICAgICAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBQcm9kdWN0VHlwZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJvZHVjdFR5cGV9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgPGNvZGU+cHJvZHVjdFR5cGVJZDwvY29kZT4uCisgICAgICogQHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlJZChTdHJpbmcgcHJvZHVjdFR5cGVJZCkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEdldHMgYSB7QGxpbmsgUHJvZHVjdFR5cGV9IHNwZWNpZmllZCBieSBpdHMgPGNvZGU+cHJvZHVjdFR5cGVOYW1lPC9jb2RlPiwKKyAgICAgKiBmcm9tIHRoZSBSZXBvc2l0b3J5TWFuYWdlci4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3RUeXBlTmFtZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFByb2R1Y3RUeXBlIHRvIGdldC4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIFByb2R1Y3RUeXBlfSwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICogQHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBHZXRzIGFsbCB0aGUge0BsaW5rIFByb2R1Y3RUeXBlfXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUHJvZHVjdFR5cGV9cyBmcm9tIHRoZSByZXBvc2l0b3J5LgorICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3RUeXBlPiBnZXRQcm9kdWN0VHlwZXMoKSB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9yZXBvc2l0b3J5L1JlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzNkNWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBGYWN0b3J5IGludGVyZmFjZSBmb3IgY3JlYXRpbmcge0BsaW5rIFJlcG9zaXRvcnlNYW5hZ2VyfSBvYmplY3RzLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5IHsKKworICAgIHB1YmxpYyBSZXBvc2l0b3J5TWFuYWdlciBjcmVhdGVSZXBvc2l0b3J5TWFuYWdlcigpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvU2NpZW5jZURhdGFSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvU2NpZW5jZURhdGFSZXBvc2l0b3J5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODg5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9TY2llbmNlRGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5EYlN0cnVjdEZhY3Rvcnk7CisKKy8qKgorICogCisgKiBMZXZlcmFnZXMgdGhlIGluZm9ybWF0aW9uIGluIHRoZSB7QGxpbmsgU2NpZW5jZURhdGFDYXRhbG9nfSdzIGRhdGFzZXQgdGFibGUKKyAqIHRvIGxpc3Qgb3V0IHtAbGluayBQcm9kdWN0VHlwZX1zLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNjaWVuY2VEYXRhUmVwb3NpdG9yeU1hbmFnZXIgaW1wbGVtZW50cyBSZXBvc2l0b3J5TWFuYWdlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihTY2llbmNlRGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHJpdmF0ZSBEYXRhU291cmNlIGRhdGFTb3VyY2U7CisKKyAgcHVibGljIFNjaWVuY2VEYXRhUmVwb3NpdG9yeU1hbmFnZXIoRGF0YVNvdXJjZSBkYXRhU291cmNlKSB7CisgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjYWRkUHJvZHVjdFR5cGUKKyAgICogKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgIFN0cmluZyBzcWwgPSAiSU5TRVJUIElOVE8gZGF0YXNldCAobG9uZ05hbWUsIHNob3J0TmFtZSwgZGVzY3JpcHRpb24pIFZBTFVFUyAoJyIKKyAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXROYW1lKCkKKyAgICAgICAgKyAiJywgJyIKKyAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXROYW1lKCkKKyAgICAgICAgKyAiJywgJyIKKyAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXREZXNjcmlwdGlvbigpICsgIiciOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjZ2V0UHJvZHVjdFR5cGVCeUlkCisgICAqIChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlJZChTdHJpbmcgcHJvZHVjdFR5cGVJZCkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZGF0YXNldF9pZCwgc2hvcnROYW1lLCBsb25nTmFtZSwgc291cmNlLCByZWZlcmVuY2VVUkwsIGRlc2NyaXB0aW9uIGZyb20gZGF0YXNldCBXSEVSRSBkYXRhc2V0X2lkID0gIgorICAgICAgICArIHByb2R1Y3RUeXBlSWQ7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJFeGVjdXRpbmc6IFsiICsgc3FsICsgIl0iKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBwcm9kdWN0VHlwZSA9IERiU3RydWN0RmFjdG9yeS50b1NjaWVuY2VEYXRhUHJvZHVjdFR5cGUocnMpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIHByb2R1Y3RUeXBlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlciNnZXRQcm9kdWN0VHlwZUJ5TmFtZQorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBkYXRhc2V0X2lkLCBzaG9ydE5hbWUsIGxvbmdOYW1lLCBzb3VyY2UsIHJlZmVyZW5jZVVSTCwgZGVzY3JpcHRpb24gZnJvbSBkYXRhc2V0IFdIRVJFIHNob3J0TmFtZSA9ICciCisgICAgICAgICsgcHJvZHVjdFR5cGVOYW1lICsgIiciOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHByb2R1Y3RUeXBlID0gRGJTdHJ1Y3RGYWN0b3J5LnRvU2NpZW5jZURhdGFQcm9kdWN0VHlwZShycyk7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gcHJvZHVjdFR5cGU7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyI2dldFByb2R1Y3RUeXBlcyAoKQorICAgKi8KKyAgcHVibGljIExpc3Q8UHJvZHVjdFR5cGU+IGdldFByb2R1Y3RUeXBlcygpIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgZGF0YXNldF9pZCwgc2hvcnROYW1lLCBsb25nTmFtZSwgc291cmNlLCByZWZlcmVuY2VVUkwsIGRlc2NyaXB0aW9uIGZyb20gZGF0YXNldCBPUkRFUiBCWSBkYXRhc2V0X2lkIERFU0MiOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICBMaXN0PFByb2R1Y3RUeXBlPiBwcm9kdWN0VHlwZXMgPSBuZXcgVmVjdG9yPFByb2R1Y3RUeXBlPigpOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBwcm9kdWN0VHlwZXMuYWRkKERiU3RydWN0RmFjdG9yeS50b1NjaWVuY2VEYXRhUHJvZHVjdFR5cGUocnMpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcHJvZHVjdFR5cGVzOworCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyI21vZGlmeVByb2R1Y3RUeXBlCisgICAqIChvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICovCisgIHB1YmxpYyB2b2lkIG1vZGlmeVByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlVQREFURSBkYXRhc2V0IFNFVCBzaG9ydE5hbWU9JyIgKyBwcm9kdWN0VHlwZS5nZXROYW1lKCkKKyAgICAgICAgKyAiJyxkZXNjcmlwdGlvbj0nIiArIHByb2R1Y3RUeXBlLmdldERlc2NyaXB0aW9uKCkKKyAgICAgICAgKyAiJyBXSEVSRSBkYXRhc2V0X2lkID0gIiArIHByb2R1Y3RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKTsKKworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjcmVtb3ZlUHJvZHVjdFR5cGUKKyAgICogKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgIFN0cmluZyBzcWwgPSAiREVMRVRFIEZST00gZGF0YXNldCBXSEVSRSBkYXRhc2V0X2lkID0gIgorICAgICAgICArIHByb2R1Y3RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKTsKKworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9TY2llbmNlRGF0YVJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvU2NpZW5jZURhdGFSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE1YzUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvU2NpZW5jZURhdGFSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvKioKKyAqIAorICogQ29uc3RydWN0cyBuZXcge0BsaW5rIFNjaWVuY2VEYXRhUmVwb3NpdG9yeU1hbmFnZXJ9cy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTY2llbmNlRGF0YVJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeSBpbXBsZW1lbnRzCisgICAgUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5IHsKKworICBwcml2YXRlIERhdGFTb3VyY2UgZGF0YVNvdXJjZTsKKworICBwdWJsaWMgU2NpZW5jZURhdGFSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkoKSB7CisgICAgU3RyaW5nIGpkYmNVcmwgPSBudWxsLCB1c2VyID0gbnVsbCwgcGFzcyA9IG51bGwsIGRyaXZlciA9IG51bGw7CisKKyAgICBqZGJjVXJsID0gUGF0aFV0aWxzCisgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMudXJsIikpOworICAgIHVzZXIgPSBQYXRoVXRpbHMKKyAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoU3lzdGVtCisgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLnNjaWVuY2UuamRiYy51c2VyIikpOworICAgIHBhc3MgPSBQYXRoVXRpbHMKKyAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoU3lzdGVtCisgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLnNjaWVuY2UuamRiYy5wYXNzIikpOworICAgIGRyaXZlciA9IFBhdGhVdGlscworICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3Iuc2NpZW5jZS5qZGJjLmRyaXZlciIpKTsKKworICAgIHRoaXMuZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsCisgICAgICAgIGRyaXZlciwgamRiY1VybCk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2Vlb3JnLmFwYWNoZS5vb2R0Lm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkjCisgICAqIGNyZWF0ZVJlcG9zaXRvcnlNYW5hZ2VyKCkKKyAgICovCisgIHB1YmxpYyBSZXBvc2l0b3J5TWFuYWdlciBjcmVhdGVSZXBvc2l0b3J5TWFuYWdlcigpIHsKKyAgICByZXR1cm4gbmV3IFNjaWVuY2VEYXRhUmVwb3NpdG9yeU1hbmFnZXIodGhpcy5kYXRhU291cmNlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9YTUxSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvWE1MUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzMwZTFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvWE1MUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5YbWxTdHJ1Y3RGYWN0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgUmVwb3NpdG9yeU1hbmFnZXJ9IHRoYXQgbWFuYWdlcyB7QGxpbmsgUHJvZHVjdH0gcG9saWN5IGJhc2VkIG9uIGFuCisgKiB4bWwgZmlsZSBjYWxsZWQgPGNvZGU+cHJvZHVjdC10eXBlcy54bWw8L2NvZGU+LgorICogPC9wPgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxSZXBvc2l0b3J5TWFuYWdlciBpbXBsZW1lbnRzIFJlcG9zaXRvcnlNYW5hZ2VyIHsKKworICAgIC8qIFVSSXMgcG9pbnRpbmcgdG8gZGlyZWN0b3JpZXMgY29udGFpbmluZyBwcm9kdWN0LXR5cGVzLnhtbCBmaWxlcyAqLworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHByb2R1Y3RUeXBlSG9tZVVyaXMgPSBudWxsOworCisgICAgLyogb3VyIG1hcCBvZiBwcm9kdWN0IHR5cGVzIHRoYXQgdGhlIHN5c3RlbSBrbm93cyBhYm91dCAqLworICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFByb2R1Y3RUeXBlPiBwcm9kdWN0VHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvZHVjdFR5cGU+KCk7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhNTFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBYTUxSZXBvc2l0b3J5TWFuYWdlcihMaXN0PFN0cmluZz4gdXJpcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICBpZiAodXJpcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gY29uc3RydWN0IFhNTFJlcG9zaXRvcnlNYW5hZ2VyIHdpdGggYSBOVUxMIGxpc3Qgb2YgIHByb2R1Y3QgdHlwZSBob21lIFVSSXMhIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnByb2R1Y3RUeXBlSG9tZVVyaXMgPSB1cmlzOworICAgICAgICBsb2FkUHJvZHVjdFR5cGVzKHByb2R1Y3RUeXBlSG9tZVVyaXMpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjYWRkUHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBwcm9kdWN0VHlwZU1hcC5wdXQocHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLCBwcm9kdWN0VHlwZSk7CisgICAgICAgIHNhdmVQcm9kdWN0VHlwZXMoKTsKKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjbW9kaWZ5UHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBwcm9kdWN0VHlwZU1hcC5wdXQocHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLCBwcm9kdWN0VHlwZSk7CisgICAgICAgIHNhdmVQcm9kdWN0VHlwZXMoKTsKKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjcmVtb3ZlUHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBwcm9kdWN0VHlwZU1hcC5yZW1vdmUocHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKyAgICAgICAgc2F2ZVByb2R1Y3RUeXBlcygpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIjZ2V0UHJvZHVjdFR5cGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlJZChTdHJpbmcgcHJvZHVjdFR5cGVJZCkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoUHJvZHVjdFR5cGUpIHByb2R1Y3RUeXBlTWFwLmdldChwcm9kdWN0VHlwZUlkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyI2dldFByb2R1Y3RUeXBlQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHByb2R1Y3RUeXBlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IChQcm9kdWN0VHlwZSkgcHJvZHVjdFR5cGVNYXAuZ2V0KHR5cGVJZCk7CisgICAgICAgICAgICBpZiAodHlwZS5nZXROYW1lKCkuZXF1YWxzKHByb2R1Y3RUeXBlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAiWE1MUmVwb3NpdG9yeU1hbmFnZXI6IFVuYWJsZSB0byBmaW5kIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVOYW1lICsgIl0sIHJldHVybmluZyBudWxsIik7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlciNnZXRQcm9kdWN0VHlwZXMoKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3RUeXBlPiBnZXRQcm9kdWN0VHlwZXMoKSB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChwcm9kdWN0VHlwZU1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBQcm9kdWN0VHlwZVtwcm9kdWN0VHlwZU1hcC52YWx1ZXMoKS5zaXplKCldKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVQcm9kdWN0VHlwZXMoKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gcHJvZHVjdFR5cGVIb21lVXJpcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXJVcmkgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIEZpbGUgcHJvZHVjdFR5cGVEaXIgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlRGlyID0gbmV3IEZpbGUobmV3IFVSSShkaXJVcmkpKTsKKworICAgICAgICAgICAgICAgIGlmICghcHJvZHVjdFR5cGVEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWN0IHR5cGUgZGlyZWN0b3J5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIGRpcmVjdG9yeTogc2tpcHBpbmcgcHJvZHVjdCB0eXBlIHNhdmluZyB0byBpdC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlRGlyU3RyID0gcHJvZHVjdFR5cGVEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKCFwcm9kdWN0VHlwZURpclN0ci5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlRGlyU3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVYbWxGaWxlID0gcHJvZHVjdFR5cGVEaXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInByb2R1Y3QtdHlwZXMueG1sIjsKKyAgICAgICAgICAgICAgICBYbWxTdHJ1Y3RGYWN0b3J5LndyaXRlUHJvZHVjdFR5cGVYbWxEb2N1bWVudChBcnJheXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc0xpc3QocHJvZHVjdFR5cGVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgUHJvZHVjdFR5cGVbcHJvZHVjdFR5cGVNYXAudmFsdWVzKCkuc2l6ZSgpXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVYbWxGaWxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVSSVN5bnRheEV4Y2VwdGlvbiB3aGVuIHNhdmluZyBwcm9kdWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHlwZSBkaXJlY3RvcnkgVVJJOiAiICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogU2tpcHBpbmcgUHJvZHVjdCBUeXBlIHNhdmluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm9yIGl0OiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkUHJvZHVjdFR5cGVzKExpc3Q8U3RyaW5nPiBkaXJVcmlzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gZGlyVXJpcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZpbGUgcHJvZHVjdFR5cGVEaXIgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGRpclVyaSA9IGkubmV4dCgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlRGlyID0gbmV3IEZpbGUobmV3IFVSSShkaXJVcmkpKTsKKworICAgICAgICAgICAgICAgIGlmICghcHJvZHVjdFR5cGVEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWN0IHR5cGUgZGlyZWN0b3J5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIGRpcmVjdG9yeTogc2tpcHBpbmcgcHJvZHVjdCB0eXBlIGxvYWRpbmcgZnJvbSBpdC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlRGlyU3RyID0gcHJvZHVjdFR5cGVEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKCFwcm9kdWN0VHlwZURpclN0ci5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlRGlyU3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVYbWxGaWxlID0gcHJvZHVjdFR5cGVEaXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInByb2R1Y3QtdHlwZXMueG1sIjsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBwcm9kdWN0VHlwZURvYyA9IGdldERvY3VtZW50Um9vdChwcm9kdWN0VHlwZVhtbEZpbGUpOworCisgICAgICAgICAgICAgICAgLy8gbm93IGxvYWQgdGhlIHByb2R1Y3QgdHlwZXMgZnJvbSBpdAorICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0VHlwZURvYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvZHVjdFR5cGVSb290ID0gcHJvZHVjdFR5cGVEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgcHJvZHVjdFR5cGVOb2RlTGlzdCA9IHByb2R1Y3RUeXBlUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHlwZSIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0VHlwZU5vZGVMaXN0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcm9kdWN0VHlwZU5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9kdWN0VHlwZU5vZGVMaXN0LmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHByb2R1Y3RUeXBlTm9kZSA9IHByb2R1Y3RUeXBlTm9kZUxpc3QuaXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlKHByb2R1Y3RUeXBlTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlhNTFJlcG9zaXRvcnlNYW5hZ2VyOiBmb3VuZCBwcm9kdWN0IHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiXSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlTWFwLnB1dCh0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUklTeW50YXhFeGNlcHRpb24gd2hlbiBsb2FkaW5nIHByb2R1Y3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0eXBlIGRpcmVjdG9yeSBVUkk6ICIgKyBkaXJVcmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBTa2lwcGluZyBQcm9kdWN0IFR5cGUgbG9hZGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm9yIGl0OiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudFJvb3QoU3RyaW5nIHhtbEZpbGUpIHsKKyAgICAgICAgLy8gb3BlbiB1cCB0aGUgWE1MIGZpbGUKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IG51bGw7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKyAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOworCisgICAgICAgIElucHV0U3RyZWFtIHhtbElucHV0U3RyZWFtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgeG1sSW5wdXRTdHJlYW0gPSBuZXcgRmlsZSh4bWxGaWxlKS50b1VSSSgpLnRvVVJMKCkub3BlblN0cmVhbSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIGdldHRpbmcgaW5wdXQgc3RyZWFtIGZyb20gWyIgKyB4bWxGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogcmV0dXJuaW5nIG51bGwgZG9jdW1lbnQgcm9vdCIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh4bWxJbnB1dFN0cmVhbSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLndhcm5pbmcoIlVuYWJsZSB0byBwYXJzZSB4bWwgZmlsZSBbIiArIHhtbEZpbGUgKyAiXS4iCisgICAgICAgICAgICAgICAgICAgICsgIlJlYXNvbiBpcyBbIiArIGUgKyAiXSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9YTUxSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9yZXBvc2l0b3J5L1hNTFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGQxM2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9YTUxSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5EaXJlY3RvcnlTZWxlY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbHVjYQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcge0BsaW5rIFhNTFJlcG9zaXRvcnlNYW5hZ2VyfSBvYmplY3RzLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkgaW1wbGVtZW50cyBSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkgeworCisgICAgLyogbGlzdCBvZiBkaXIgdXJpcyBzcGVjaWZ5aW5nIGZpbGUgcGF0aHMgdG8gcHJvZHVjdFR5cGUgZGlyZWN0b3JpZXMgKi8KKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwcm9kdWN0VHlwZURpckxpc3QgPSBudWxsOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKFhNTFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIFhNTFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeSgpIHsKKyAgICAJCisgICAgCQorICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVEaXJVcmlzID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzIik7CisgICAgICAgIAorICAgICAgICAvLyBvbmx5IHJldHVybnMgdHJ1ZSBpZiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzLnJlY3Vyc2l2ZT10cnVlCisgICAgICAgIGJvb2xlYW4gcmVjdXJzaXZlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oIAorICAgICAgICAJCVN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycy5yZWN1cnNpdmUiKSApOworCisgICAgICAgIGlmIChwcm9kdWN0VHlwZURpclVyaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGVEaXJVcmlzID0gUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKHByb2R1Y3RUeXBlRGlyVXJpcyk7CisgICAgICAgICAgICBTdHJpbmdbXSBkaXJVcmlzID0gcHJvZHVjdFR5cGVEaXJVcmlzLnNwbGl0KCIsIik7CisKKyAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgbGlzdGluZworICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgCQorICAgICAgICAgICAgCS8vIGVtcHR5IGxpc3QKKyAgICAgICAgICAgIAlwcm9kdWN0VHlwZURpckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAkvLyBsb29wIG92ZXIgc3BlY2lmaWVkIHJvb3QgZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAJLy8gYWRkIGRpcmVjdG9yaWVzIGFuZCBzdWItZGlyZWN0b3JpZXMgdGhhdCBjb250YWluICJwcm9kdWN0LXR5cGVzLnhtbCIKKyAgICAgICAgICAgIAlmb3IgKFN0cmluZyByb290RGlyIDogZGlyVXJpcykgeworICAgICAgICAgICAgCQl0cnkgeworICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAJCQlEaXJlY3RvcnlTZWxlY3RvciBkaXJzZWwgPSBuZXcgRGlyZWN0b3J5U2VsZWN0b3IoCisgICAgICAgICAgICAJCQkJCUFycmF5cy5hc0xpc3QoIAorICAgICAgICAgICAgCQkJCQkJCW5ldyBTdHJpbmdbXSB7InByb2R1Y3QtdHlwZXMueG1sIn0gKSk7CisgICAgICAgICAgICAJCQlwcm9kdWN0VHlwZURpckxpc3QuYWRkQWxsKCBkaXJzZWwudHJhdmVyc2VEaXIobmV3IEZpbGUobmV3IFVSSShyb290RGlyKSkpICk7CisgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgIAkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIAkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIlVSSVN5bnRheEV4Y2VwdGlvbiB3aGVuIHRyYXZlcnNpbmcgZGlyZWN0b3J5OiAiK3Jvb3REaXIpOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJfSAgICAgICAgCQkKKworICAgICAgICAJLy8gbm9uLXJlY3Vyc2l2ZSBkaXJlY3RvcnkgbGlzdGluZworICAgICAgICAgICAgfSBlbHNlIHsJCisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVEaXJMaXN0ID0gQXJyYXlzLmFzTGlzdChkaXJVcmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCJDb2xsZWN0aW5nIFhNTCBwb2xpY2llcyBmcm9tIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXM6Iik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwZGlyIDogcHJvZHVjdFR5cGVEaXJMaXN0KSB7CisgICAgICAgICAgICAJTE9HLmxvZyhMZXZlbC5GSU5FLCBwZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkjY3JlYXRlUmVwb3NpdG9yeU1hbmFnZXIoKQorICAgICAqLworICAgIHB1YmxpYyBSZXBvc2l0b3J5TWFuYWdlciBjcmVhdGVSZXBvc2l0b3J5TWFuYWdlcigpIHsKKyAgICAgICAgaWYgKHByb2R1Y3RUeXBlRGlyTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBSZXBvc2l0b3J5TWFuYWdlciByZXBvc2l0b3J5TWFuYWdlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlNYW5hZ2VyID0gbmV3IFhNTFJlcG9zaXRvcnlNYW5hZ2VyKHByb2R1Y3RUeXBlRGlyTGlzdCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5TWFuYWdlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgWE1MIFJlcG9zaXRvcnkgTWFuYWdlcjogbm8gcHJvZHVjdCB0eXBlIGRpciB1cmlzIHNwZWNpZmllZDogdmFsdWU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9Cb29sZWFuUXVlcnlDcml0ZXJpYS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjJkOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIEJvb2xlYW4gUXVlcnkgQ2l0ZXJpYSB0aGF0IGFsbG93cyBjb21iaW5hdGlvbiBvZiBhIG51bWJlciBvZiB0ZXJtcyBpbnRvIGEKKyAqIHF1ZXJ5IHdpdGggYSBib29sZWFuIG9wZXJhdG9yIChBTkQsIE9SLCBOT1QpLiBUaGUgTk9UIG9wZXJhdG9yIGNhbiBvbmx5IGJlCisgKiBhcHBsaWVkIHRvIG9uZSB0ZXJtLgorICogPC9wPgorICogCisgKi8KKworcHVibGljIGNsYXNzIEJvb2xlYW5RdWVyeUNyaXRlcmlhIGV4dGVuZHMgUXVlcnlDcml0ZXJpYSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTkQgPSAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1IgPSAxOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3MTg5NDgyMzc2ODI3NzI2NzFMOworCisgICAgcHJpdmF0ZSBpbnQgb3BlcmF0b3I7CisKKyAgICBwcml2YXRlIExpc3Q8UXVlcnlDcml0ZXJpYT4gdGVybXM7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBVc2VzIHRoZSBBTkQgb3BlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW5RdWVyeUNyaXRlcmlhKCkgeworICAgICAgICBvcGVyYXRvciA9IEFORDsKKyAgICAgICAgdGVybXMgPSBuZXcgVmVjdG9yPFF1ZXJ5Q3JpdGVyaWE+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQm9vbGVhbiBxdWVyeSBjb25zdHJ1Y3Rvci4gVGhpcyBxdWVyeSBpcyBhIGJvb2xlYW4gY29tYmluYXRpb24gb2YgdGVybSwKKyAgICAgKiByYW5nZSwgYW5kIG90aGVyIGJvb2xlYW4gcXVlcmllcy4gVGhlIHN1cHBvcnRlZCBvcGVyYXRvcnMgYXJlIEFORCwgT1IgYW5kCisgICAgICogTk9ULiBOb3RlIHRoYXQgdGhlIE5PVCBvcGVyYXRvciBjYW4gb25seSBiZSB1c2VkIHdpdGggb25lICgxKSB0ZXJtLiBUaGlzCisgICAgICogbWV0aG9kIHRocm93cyB0aGUgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiBpZiBtb3JlIHRoYW4gb25lIHRlcm0gaXMgdXNlZAorICAgICAqIHdpdGggTk9ULgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXJtcworICAgICAqICAgICAgICAgICAgVGhlIGNyaXRlcmlhIG9udG8gd2hpY2ggdG8gYXBwbHkgdGhlIGJvb2xlYW4gb3BlcmF0b3IKKyAgICAgKiBAcGFyYW0gb3AKKyAgICAgKiAgICAgICAgICAgIFRoZSBib29sZWFuIG9wZXJhdG9yIHRvIGJlIGFwcGxpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEoTGlzdDxRdWVyeUNyaXRlcmlhPiB0ZXJtcywgaW50IG9wKQorICAgICAgICAgICAgdGhyb3dzIFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24geworICAgICAgICBvcGVyYXRvciA9IG9wOworICAgICAgICBpZiAob3AgPT0gTk9UICYmIHRlcm1zLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQm9vbGVhblF1ZXJ5Q3JpdGVyaWE6IE5PVCBvcGVyYXRvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2Fubm90IGJlIGFwcGxpZWQgdG8gbXVsdGlwbGUgdGVybXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMudGVybXMgPSB0ZXJtczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0byBhZGQgYSB0ZXJtIHRvIHRoZSBib29sZWFuIHF1ZXJ5LiBOb3RlIHRoYXQgYSBOT1Qgb3BlcmF0b3IgY2FuCisgICAgICogb25seSBiZSBhcHBsaWVkIHRvIG9uZSB0ZXJtLiBNZXRob2QgdGhyb3dzIHRoZSBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uCisgICAgICogaWYgdGhpcyBydWxlIGlzIHZpb2xhdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICBUZXJtIHRvIGJlIGFkZGVkIHRvIHRoZSBxdWVyeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRlcm0oUXVlcnlDcml0ZXJpYSB0KSB0aHJvd3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcGVyYXRvciA9PSBOT1QgJiYgIXRlcm1zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJCb29sZWFuUXVlcnlDcml0ZXJpYTogTk9UIG9wZXJhdG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjYW5ub3QgYmUgYXBwbGllZCB0byBtdWx0aXBsZSB0ZXJtcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVybXMuYWRkKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgbGlzdCBvZiB0ZXJtcyBpbiB0aGUgcXVlcnkuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0ZXJtcworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFF1ZXJ5Q3JpdGVyaWE+IGdldFRlcm1zKCkgeworICAgICAgICByZXR1cm4gdGVybXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXV0YXRvciBtZXRob2QgZm9yIHRoZSBib29sZWFuIG9wZXJhdG9yLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgdGhyb3dzIHRoZQorICAgICAqIFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24gaWYgdGhlIG9wZXJhdG9yIGlzIHNldCB0byBOT1QgYW5kIG11bHRpcGxlCisgICAgICogdGVybXMgYXJlIGFscmVhZHkgZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3AKKyAgICAgKiAgICAgICAgICAgIEJvb2xlYW4gb3BlcmF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihpbnQgb3ApIHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9wID09IE5PVCAmJiB0ZXJtcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW5RdWVyeUNyaXRlcmlhOiBOT1Qgb3BlcmF0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNhbm5vdCBiZSBhcHBsaWVkIHRvIG11bHRpcGxlIHRlcm1zIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGVyYXRvciA9IG9wOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgYm9vbGVhbiBvcGVyYXRvci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuIG9wZXJhdG9yCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpcyBub3QgdXNlZCBpbiB0aGlzIGNsYXNzLi4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGlzIG5vdCB1c2VkIGluIHRoaXMgY2xhc3MuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gY29udmVydCB0aGUgcXVlcnkgdG8gYSBzdHJpbmcuCisgICAgICogCisgICAgICogQHJldHVybiBzdHJpbmcgZXF1aXZlbWVudCBvZiB0aGUgcXVlcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgcXVlcnkgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgIGlmIChvcGVyYXRvciA9PSBBTkQpCisgICAgICAgICAgICBxdWVyeSArPSAiQU5EKCI7CisgICAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09IE9SKQorICAgICAgICAgICAgcXVlcnkgKz0gIk9SKCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHF1ZXJ5ICs9ICJOT1QoIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlcm1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBxdWVyeSArPSAoKFF1ZXJ5Q3JpdGVyaWEpIHRlcm1zLmdldChpKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChpIDwgKHRlcm1zLnNpemUoKSAtIDEpKQorICAgICAgICAgICAgICAgIHF1ZXJ5ICs9ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgcXVlcnkgKz0gIikiOworICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvRWxlbWVudC5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmM2MjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9FbGVtZW50LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMudHlwZS5UeXBlSGFuZGxlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBtZXRhZGF0YSBlbGVtZW50LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBFbGVtZW50IHsKKworICAgIC8qIHRoZSBlbGVtZW50IGlkICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudElkID0gbnVsbDsKKworICAgIC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZSA9IG51bGw7CisKKyAgICAvKiB0aGUgY29ycmVzcG9uZGluZyBEQyBlbGVtZW50IGZvciB0aGlzIENBUyBlbGVtZW50ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGNFbGVtZW50ID0gbnVsbDsKKworICAgIC8qIHRoZSBlbGVtZW50J3Mgc3RyaW5nIGRlc2NyaXB0aW9uLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICovCisgICAgcHVibGljIEVsZW1lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyBDQVMgZWxlbWVudAorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudElkCisgICAgICogICAgICAgICAgICBUaGUgZWxlbWVudCdzIElkIGZyb20gdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudAorICAgICAqICAgICAgICAgICAgVGhlIERDIGVsZW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGFyY2hpdmUgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnQncyBkZXNjcmlwdGlvbi4KKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudChTdHJpbmcgZWxlbWVudElkLCBTdHJpbmcgZWxlbWVudE5hbWUsCisgICAgICAgICAgICBTdHJpbmcgZWxlbU1ldGFkYXRhQ29sdW1uLCBTdHJpbmcgZWxlbWVudCwgCisgICAgICAgICAgICBTdHJpbmcgZGVzYywgU3RyaW5nIHR5cGVIYW5kbGVyKSB7CisgICAgICAgIHRoaXMuZWxlbWVudElkID0gZWxlbWVudElkOworICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisgICAgICAgIHRoaXMuZGNFbGVtZW50ID0gZWxlbWVudDsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50SWQuaGFzaENvZGUoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkY0VsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREQ0VsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBkY0VsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIFRoZSBkY0VsZW1lbnQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERDRWxlbWVudChTdHJpbmcgZWxlbWVudCkgeworICAgICAgICBkY0VsZW1lbnQgPSBlbGVtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWxlbWVudElkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlbGVtZW50SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbGVtZW50SWQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRJZChTdHJpbmcgZWxlbWVudElkKSB7CisgICAgICAgIHRoaXMuZWxlbWVudElkID0gZWxlbWVudElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWxlbWVudE5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnROYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbgorICAgICAqICAgICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0gIAorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9FeHRyYWN0b3JTcGVjLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9FeHRyYWN0b3JTcGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxOWFlNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL0V4dHJhY3RvclNwZWMuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNwZWNpZmljYXRpb24gY2xhc3Mgc2hvd2luZyBob3cgdG8gY29uc3RyYWN0CisgKiBhIHtAbGluayBGaWxlbWdyTWV0RXh0cmFjdG9yfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRyYWN0b3JTcGVjIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgIHByaXZhdGUgUHJvcGVydGllcyBjb25maWd1cmF0aW9uOworCisgICAgcHVibGljIEV4dHJhY3RvclNwZWMoKSB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0cmFjdG9yU3BlYyhTdHJpbmcgY2xhc3NOYW1lLCBQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2xhc3NOYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzTmFtZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oUHJvcGVydGllcyBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9GaWxlVHJhbnNmZXJTdGF0dXMuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL0ZpbGVUcmFuc2ZlclN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZGZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9GaWxlVHJhbnNmZXJTdGF0dXMuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgY2xhc3MgdG8gcmVwcmVzZW50IHRoZSBzdGF0dXMgb2YgYSB0cmFuc2ZlciBmb3IgYSBmaWxlIHJlZmVyZW5jZSBiZWxvbmdpbmcKKyAqIHRvIGEge0BsaW5rIFByb2R1Y3R9LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVHJhbnNmZXJTdGF0dXMgeworCisgICAgLyogdGhlIGZpbGUgcmVmZXJlbmNlIHRoYXQgaXMgYmVpbmcgdHJhbnNmZXJyZWQgKi8KKyAgICBwcml2YXRlIFJlZmVyZW5jZSBmaWxlUmVmID0gbnVsbDsKKworICAgIC8qIHRoZSBhbW91bnQgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyICovCisgICAgcHJpdmF0ZSBsb25nIGJ5dGVzVHJhbnNmZXJyZWQgPSAwTDsKKworICAgIC8qIHRoZSBhc3NvY2lhdGVkIFByb2R1Y3QgKi8KKyAgICBwcml2YXRlIFByb2R1Y3QgcGFyZW50UHJvZHVjdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisgICAgICogPC9wPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVRyYW5zZmVyU3RhdHVzKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZmlsZVJlZgorICAgICAqICAgICAgICAgICAgVGhlIGZpbGUgcmVmZXJlbmNlIGJlaW5nIHRyYW5zZmVycmVkLgorICAgICAqIEBwYXJhbSBieXRlc1RyYW5zZmVycmVkCisgICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhciBmb3IgdGhpcyBmaWxlLgorICAgICAqIEBwYXJhbSBwYXJlbnRQcm9kdWN0CisgICAgICogICAgICAgICAgICBUaGUgcGFyZW50IFByb2R1Y3QgdGhhdCB0aGlzIGZpbGUgcmVmZXJlbmNlIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIEZpbGVUcmFuc2ZlclN0YXR1cyhSZWZlcmVuY2UgZmlsZVJlZiwgbG9uZyBmaWxlU2l6ZSwKKyAgICAgICAgICAgIGxvbmcgYnl0ZXNUcmFuc2ZlcnJlZCwgUHJvZHVjdCBwYXJlbnRQcm9kdWN0KSB7CisgICAgICAgIHRoaXMuZmlsZVJlZiA9IGZpbGVSZWY7CisgICAgICAgIHRoaXMuYnl0ZXNUcmFuc2ZlcnJlZCA9IGJ5dGVzVHJhbnNmZXJyZWQ7CisgICAgICAgIHRoaXMucGFyZW50UHJvZHVjdCA9IHBhcmVudFByb2R1Y3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBieXRlc1RyYW5zZmVycmVkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVzVHJhbnNmZXJyZWQoKSB7CisgICAgICAgIHJldHVybiBieXRlc1RyYW5zZmVycmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBieXRlc1RyYW5zZmVycmVkCisgICAgICogICAgICAgICAgICBUaGUgYnl0ZXNUcmFuc2ZlcnJlZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXNUcmFuc2ZlcnJlZChsb25nIGJ5dGVzVHJhbnNmZXJyZWQpIHsKKyAgICAgICAgdGhpcy5ieXRlc1RyYW5zZmVycmVkID0gYnl0ZXNUcmFuc2ZlcnJlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbGVSZWYuCisgICAgICovCisgICAgcHVibGljIFJlZmVyZW5jZSBnZXRGaWxlUmVmKCkgeworICAgICAgICByZXR1cm4gZmlsZVJlZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZmlsZVJlZgorICAgICAqICAgICAgICAgICAgVGhlIGZpbGVSZWYgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVSZWYoUmVmZXJlbmNlIGZpbGVSZWYpIHsKKyAgICAgICAgdGhpcy5maWxlUmVmID0gZmlsZVJlZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudFByb2R1Y3QuCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QgZ2V0UGFyZW50UHJvZHVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudFByb2R1Y3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhcmVudFByb2R1Y3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXJlbnRQcm9kdWN0IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRQcm9kdWN0KFByb2R1Y3QgcGFyZW50UHJvZHVjdCkgeworICAgICAgICB0aGlzLnBhcmVudFByb2R1Y3QgPSBwYXJlbnRQcm9kdWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGZpbGUgdGhhdCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBzbyBmYXIuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBjb21wdXRlUGN0VHJhbnNmZXJyZWQoKSB7CisgICAgICAgIHJldHVybiAoKGRvdWJsZSkgKGJ5dGVzVHJhbnNmZXJyZWQgKiAxLjApIC8gKGZpbGVSZWYuZ2V0RmlsZVNpemUoKSAqIDEuMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvRnJlZVRleHRRdWVyeUNyaXRlcmlhLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9GcmVlVGV4dFF1ZXJ5Q3JpdGVyaWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY5ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvRnJlZVRleHRRdWVyeUNyaXRlcmlhLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRnJlZSBUZXh0IENyaXRlcmlhIGVsZW1lbnQgZm9yIGEgUXVlcnkgdG8gdGhlIENhdGFsb2cuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIEZyZWVUZXh0UXVlcnlDcml0ZXJpYSBleHRlbmRzIFF1ZXJ5Q3JpdGVyaWEgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbHVlczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG5vaXNlV29yZHMgPSB7ICJhIiwgImFsbCIsICJhbSIsICJhbiIsICJhbmQiLAorICAgICAgICAgICAgImFueSIsICJhcmUiLCAiYXMiLCAiYXQiLCAiYmUiLCAiYnV0IiwgImNhbiIsICJkaWQiLCAiZG8iLCAiZG9lcyIsCisgICAgICAgICAgICAiZm9yIiwgImZyb20iLCAiaGFkIiwgImhhcyIsICJoYXZlIiwgImhlcmUiLCAiaG93IiwgImkiLCAiaWYiLAorICAgICAgICAgICAgImluIiwgImlzIiwgIml0IiwgIm5vIiwgIm5vdCIsICJvZiIsICJvbiIsICJvciIsICJzbyIsICJ0aGF0IiwKKyAgICAgICAgICAgICJ0aGUiLCAidGhlbiIsICJ0aGVyZSIsICJ0aGlzIiwgInRvIiwgInRvbyIsICJ1cCIsICJ1c2UiLCAid2hhdCIsCisgICAgICAgICAgICAid2hlbiIsICJ3aGVyZSIsICJ3aG8iLCAid2h5IiwgInlvdSIgfTsKKworICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBub2lzZVdvcmRIYXNoOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJlZVRleHRRdWVyeUNyaXRlcmlhKCkgeworICAgICAgICBlbGVtZW50TmFtZSA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgbm9pc2VXb3JkSGFzaCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2lzZVdvcmRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgbm9pc2VXb3JkSGFzaC5hZGQobm9pc2VXb3Jkc1tpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBGcmVlVGV4dFF1ZXJ5RUNyaXRlcmlhIENsYXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgQSBMaXN0IG9mIHRlcm1zIHRvIHNlYXJjaCBmb3IuCisgICAgICovCisgICAgcHVibGljIEZyZWVUZXh0UXVlcnlDcml0ZXJpYShTdHJpbmcgZWxlbWVudE5hbWUsIExpc3Q8U3RyaW5nPiB2KSB7CisgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKKyAgICAgICAgdmFsdWVzID0gdjsKKworICAgICAgICBub2lzZVdvcmRIYXNoID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vaXNlV29yZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBub2lzZVdvcmRIYXNoLmFkZChub2lzZVdvcmRzW2ldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSB2YWx1ZXMgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlcyBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24gYXMgYSBMaXN0IG9mIFN0cmluZ3MuCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXV0YXRvciBtZXRob2QgZm9yIHRoZSB2YWx1ZXMgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBiZSB1c2VkIHdoZW4ga2V5d29yZHMgaGF2ZSBiZWVuIHBhcnNlZCBvdXQgb2YgdXNlci1lbnRlcmVkIGZyZWUKKyAgICAgKiB0ZXh0LiBUaGUgcXVlcnkgd2lsbCBKT0lOIG9uIGFsbCBvZiB0aGVzZSB2YWx1ZXMuIEluIG9yZGVyIHRvIGFkZAorICAgICAqIHVucGFyc2VkIGZyZWUgdGV4dCB0byBhIFF1ZXJ5LCBzZWUgdGhlIGFkZEZyZWVUZXh0IG1ldGhvZCBvZiB0aGlzIGNsYXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgVGhlIHZhbHVlcyBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24gYXMgYSBMaXN0IG9mIFN0cmluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoTGlzdDxTdHJpbmc+IHYpIHsKKyAgICAgICAgdGhpcy52YWx1ZXMgPSB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWV0aG9kIGZvciBhZGRpbmcgYSB2YWx1ZSB0byBzZWFyY2ggb24gdG8gdGhlIGxpc3Qgb2YgdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgdikgeworICAgICAgICB2YWx1ZXMuYWRkKHYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWV0aG9kIGZvciBhZGRpbmcgdW5wYXJzZWQgZnJlZSB0ZXh0IHRvIHRoZSBGcmVlVGV4dENyaXRlcmlhLiBGcmVlIHRleHQKKyAgICAgKiBlbnRlcmVkIGFzIGEgc3RyaW5nIGlzIHRva2VuaXplZCBhbmQgcHVuY3R1YXRpb24gYW5kIGNvbW1vbiB3b3JkcyBhcmUKKyAgICAgKiBkcm9wcGVkIGJlZm9yZSB0aGUgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgcXVlcnkuIEluIG9yZGVyIHRvIHF1ZXJ5IGZvcgorICAgICAqIHByZS1wYXJzZWQga2V5d29yZHMsIHNlZSB0aGUgc2V0VmFsdWVzIG1ldGhvZCBvZiB0aGlzIGNsYXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0CisgICAgICogICAgICAgICAgICBUaGUgZnJlZSB0ZXh0IHRvIGJlIHBhcnNlZCBhbmQgc2VhcmNoZWQgb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRnJlZVRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgLy8gcmVtb3ZlIHB1bmN0dWF0aW9uIGZyb20gdGhlIHRleHQKKyAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbCgiXFxwe1B1bmN0fSsiLCAiIik7CisKKyAgICAgICAgLy8gdG9rZW5pemUgc3RyaW5nIHVzaW5nIGRlZmF1bHQgZGVsaW1pdGVycworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0KTsKKyAgICAgICAgU3RyaW5nIHRva2VuID0gbnVsbDsKKworICAgICAgICAvLyBmaWx0ZXIgbm9pc2Ugd29yZHMgYW5kIGFkZCB0byB2YWx1ZXMgdmVjdG9yCisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHRva2VuID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKCFub2lzZVdvcmRIYXNoLmNvbnRhaW5zKHRva2VuKSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgaW5oZXJpdGVkIGZyb20gUXVlcnlDcml0ZXJpYSBmb3IKKyAgICAgKiBhY2Nlc3NpbmcgdGhlIGVsZW1lbnQgSUQgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgSUQgdG8gc2VhcmNoIG9uIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGluaGVyaXRlZCBmcm9tIFF1ZXJ5Q3JpdGVyaWEgZm9yCisgICAgICogbXV0YXRpbmcgdGhlIGVsZW1lbnQgSUQgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IElEIHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgaW5oZXJpdGVkIGZyb20gUXVlcnlDcml0ZXJpYSBmb3IKKyAgICAgKiBnZW5lcmF0aW5nIGEgaHVtYW4tcGFyc2FibGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIHF1ZXJ5IGNyaXRlcmlhLiBOb3RlCisgICAgICogdGhhdCB0aGUgcmV0dXJuZWQgU3RyaW5nIGZvbGxvd3MgdGhlIEx1Y2VuZSBxdWVyeSBsYW5ndWFnZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBxdWVyeSBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgc2VyaWFsID0gZWxlbWVudE5hbWUgKyAiOigiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHNlcmlhbCArPSAiKyIgKyAoU3RyaW5nKSB2YWx1ZXMuZ2V0KGkpOworICAgICAgICBzZXJpYWwgKz0gIikiOworICAgICAgICByZXR1cm4gc2VyaWFsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUHJvZHVjdC5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUHJvZHVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTMxNTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9Qcm9kdWN0LmphdmEKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2c7IC8vZm9yIGphdmFkb2MKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBQcm9kdWN0IGlzIGEgc2V0IG9mIGZpbGVzLCBvciBhIGhlaXJhcmNoaWNhbCwgZGlyZWN0b3J5IHN0cnVjdHVyZSB0aGF0CisgKiBzaG91bGQgYmUgaW5nZXN0ZWQgaW50byB0aGUge0BsaW5rIENhdGFsb2d9LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0IHsKKworICAgIC8qIG91ciBwcm9kdWN0IGlkICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdElkID0gbnVsbDsKKworICAgIC8qIG91ciBwcm9kdWN0IG5hbWUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0TmFtZSA9IG51bGw7CisKKyAgICAvKiBvdXIgcHJvZHVjdCB0eXBlICovCisgICAgcHJpdmF0ZSBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG51bGw7CisKKyAgICAvKiBvdXIgcHJvZHVjdCBzdHJ1Y3R1cmU6IGNhbiBiZSBIZWlyYXJjaGljYWwsIG9yIEZsYXQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0U3RydWN0dXJlID0gbnVsbDsKKworICAgIC8qIGEgc2V0IG9mIHtAbGluayBSZWZlcmVuY2VzfSB0byB0aGUgaXRlbXMgdGhhdCBtYWtlIHVwIHRoaXMgcHJvZHVjdCAqLworICAgIHByaXZhdGUgTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZXMgPSBudWxsOworCisgICAgLyoKKyAgICAgKiB0aGUgdHJhbnNmZXIgc3RhdHVzIG9mIHRoaXMgcHJvZHVjdDogaXMgaXQgVFJBTlNGRVJJTkcsIGhhcyBpdCBiZWVuCisgICAgICogUkVDRUlWRUQ/CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNmZXJTdGF0dXMgPSBudWxsOworCisgICAgLyoKKyAgICAgKiB0aGUgcm9vdCByZWZlcmVuY2UgZm9yIHRoaXMgcHJvZHVjdDogaWYgaXQncyBhIGRpciwgaXQncyB0aGUgcm9vdCBvZiB0aGUKKyAgICAgKiBkaXIgdHJlZSBpZiB0aGUgcHJvZHVjdCBpcyBmbGF0LCBpdCdzIHRoZSBmaXJzdCAoYW5kIHBvc3NpYmx5KSBvbmx5IHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlZmVyZW5jZSByb290UmVmOworCisgICAgLyogYSBjb3VwbGUgb2Ygc3RhdGljIGZpbmFsIFN0cmluZ3MgdG8gcmVwcmVzZW50IHRoZSBUcmFuc2ZlclN0YXR1cyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19UUkFOU0ZFUiA9ICJUUkFOU0ZFUklORyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfUkVDRUlWRUQgPSAiUkVDRUlWRUQiOworCisgICAgLyogYSBjb3VwbGUgb2Ygc3RhdGljIGZpbmFsIFN0cmluZ3MgdG8gcmVwcmVzZW50IHRoZSBwcm9kdWN0U3RydWN0dXJlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFX0ZMQVQgPSAiRmxhdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMID0gIkhpZXJhcmNoaWNhbCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkVfU1RSRUFNID0gIlN0cmVhbSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBWQUxJRF9TVFJVQ1RVUkVTID0gbmV3IFN0cmluZ1tde1NUUlVDVFVSRV9GTEFULFNUUlVDVFVSRV9ISUVSQVJDSElDQUwsU1RSVUNUVVJFX1NUUkVBTX07CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb2R1Y3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QoKSB7CisgICAgICAgIHJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yPFJlZmVyZW5jZT4oKTsKKworICAgIH0KKworICAgIHB1YmxpYyBQcm9kdWN0KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBwcm9kdWN0IHN0cmVhbTogc3RyZWFtIG5vdCBzZXQhIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIHJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yPFJlZmVyZW5jZT4oKTsKKyAgICAgICAgICAgIHBhcnNlKHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaXMpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBtZXRhZGF0YSBzdHJlYW0uWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByb2R1Y3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBUaGUgUHJvZHVjdCdzIG5hbWUuCisgICAgICogQHBhcmFtIHBUeXBlCisgICAgICogICAgICAgICAgICBUaGUgUHJvZHVjdCdzIHtAbGluayBQcm9kdWN0VHlwZX0uCisgICAgICogQHBhcmFtIHN0cnVjdHVyZQorICAgICAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgcHJvZHVjdDogZWl0aGVyIEhpZXJhcmNoaWNhbCwgb3IgRmxhdC4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJTdGF0dXMKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGF0dXMgb2YgdGhpcyBwcm9kdWN0J3MgdHJhbnNmZXIgdG8gdGhlIERhdGFTdG9yZToKKyAgICAgKiAgICAgICAgICAgIFRSQU5TRkVSSU5HLCBvciBSRUNFSVZFRCB3b3VsZCB3b3JrCisgICAgICogQHBhcmFtIHJlZnMKKyAgICAgKiAgICAgICAgICAgIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBSZWZlcmVuY2V9cyBwb2ludGluZyB0byB0aGUgaXRlbXMKKyAgICAgKiAgICAgICAgICAgIHRoYXQgbWFrZSB1cCB0aGlzIHByb2R1Y3QuCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3QoU3RyaW5nIG5hbWUsIFByb2R1Y3RUeXBlIHBUeXBlLCBTdHJpbmcgc3RydWN0dXJlLAorICAgICAgICAgICAgU3RyaW5nIHRyYW5zZmVyU3RhdHVzLCBMaXN0PFJlZmVyZW5jZT4gcmVmcykgeworICAgICAgICBwcm9kdWN0TmFtZSA9IG5hbWU7CisgICAgICAgIHByb2R1Y3RUeXBlID0gcFR5cGU7CisgICAgICAgIHByb2R1Y3RTdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7CisgICAgICAgIHJlZmVyZW5jZXMgPSByZWZzOworICAgICAgICB0aGlzLnRyYW5zZmVyU3RhdHVzID0gdHJhbnNmZXJTdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9kdWN0VHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGUoKSB7CisgICAgICAgIHJldHVybiBwcm9kdWN0VHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvZHVjdFR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0VHlwZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpIHsKKyAgICAgICAgdGhpcy5wcm9kdWN0VHlwZSA9IHByb2R1Y3RUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvZHVjdFN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RTdHJ1Y3R1cmUoKSB7CisgICAgICAgIHJldHVybiBwcm9kdWN0U3RydWN0dXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm9kdWN0U3RydWN0dXJlCisgICAgICogICAgICAgICAgICBUaGUgcHJvZHVjdFN0cnVjdHVyZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFN0cnVjdHVyZShTdHJpbmcgcHJvZHVjdFN0cnVjdHVyZSkgeworICAgICAgICAvL0d1YXJkIGNsYXVzZSwgYWNjb3JkaW5nIHRvIGEgdW5pdCB0ZXN0IG51bGwgaXMgYSB2YWxpZCB2YWx1ZQorICAgICAgICBpZiAoIWphdmEudXRpbC5BcnJheXMuYXNMaXN0KFZBTElEX1NUUlVDVFVSRVMpLmNvbnRhaW5zKHByb2R1Y3RTdHJ1Y3R1cmUpICYmIHByb2R1Y3RTdHJ1Y3R1cmUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZGVmaW5lZCBwcm9kdWN0IHN0cnVjdHVyZTogIitwcm9kdWN0U3RydWN0dXJlKTsKKyAgICAgICAgdGhpcy5wcm9kdWN0U3RydWN0dXJlID0gcHJvZHVjdFN0cnVjdHVyZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlZmVyZW5jZXMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVmZXJlbmNlPiBnZXRQcm9kdWN0UmVmZXJlbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2VzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0UmVmZXJlbmNlcyhMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlcykgeworICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvZHVjdE5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2R1Y3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm9kdWN0TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIHByb2R1Y3ROYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHsKKyAgICAgICAgdGhpcy5wcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvZHVjdElkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdElkKCkgeworICAgICAgICByZXR1cm4gcHJvZHVjdElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm9kdWN0SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0SWQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICAgIHRoaXMucHJvZHVjdElkID0gcHJvZHVjdElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHJhbnNmZXJTdGF0dXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUcmFuc2ZlclN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zZmVyU3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclN0YXR1cworICAgICAqICAgICAgICAgICAgVGhlIHRyYW5zZmVyU3RhdHVzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2ZlclN0YXR1cyhTdHJpbmcgdHJhbnNmZXJTdGF0dXMpIHsKKyAgICAgICAgdGhpcy50cmFuc2ZlclN0YXR1cyA9IHRyYW5zZmVyU3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJvb3RSZWYKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVmZXJlbmNlIGdldFJvb3RSZWYoKSB7CisgICAgICAgIHJldHVybiByb290UmVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByb290UmVmCisgICAgICogICAgICAgICAgICB0aGUgcm9vdFJlZiB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb290UmVmKFJlZmVyZW5jZSByb290UmVmKSB7CisgICAgICAgIHRoaXMucm9vdFJlZiA9IHJvb3RSZWY7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcm9kdWN0IGdldERlZmF1bHRGbGF0UHJvZHVjdChTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UHJvZHVjdFR5cGVJZCkgeworICAgICAgICBQcm9kdWN0IGRlZmF1bHRQcm9kdWN0ID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgICAgZGVmYXVsdFByb2R1Y3Quc2V0UHJvZHVjdE5hbWUobmFtZSk7CisgICAgICAgIGRlZmF1bHRQcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKG5ldyBWZWN0b3I8UmVmZXJlbmNlPigpKTsKKyAgICAgICAgZGVmYXVsdFByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKyAgICAgICAgUHJvZHVjdFR5cGUgcFR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgcFR5cGUuc2V0UHJvZHVjdFR5cGVJZChkZWZhdWx0UHJvZHVjdFR5cGVJZCk7CisgICAgICAgIGRlZmF1bHRQcm9kdWN0LnNldFByb2R1Y3RUeXBlKHBUeXBlKTsKKyAgICAgICAgZGVmYXVsdFByb2R1Y3Quc2V0VHJhbnNmZXJTdGF0dXMoUHJvZHVjdC5TVEFUVVNfVFJBTlNGRVIpOworICAgICAgICByZXR1cm4gZGVmYXVsdFByb2R1Y3Q7CisgICAgfQorCisgICAgcHVibGljIERvY3VtZW50IHRvWE1MKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZG9jID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOworCisgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSAoRWxlbWVudCkgZG9jLmNyZWF0ZUVsZW1lbnQoImNhczpwcm9kdWN0Iik7CisgICAgICAgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByb290LCAieG1sbnM6Y2FzIiwKKyAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIik7CisgICAgICAgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByb290LCAiaWQiLCB0aGlzLnByb2R1Y3RJZCk7CisgICAgICAgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByb290LCAibmFtZSIsIFVSTEVuY29kZXIuZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3ROYW1lLCAiVVRGLTgiKSk7CisgICAgICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdCk7CisKKyAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByb290LCAic3RydWN0dXJlIiwgdGhpcy5wcm9kdWN0U3RydWN0dXJlKTsKKyAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByb290LCAidHJhbnNmZXJTdGF0dXMiLCB0aGlzLnRyYW5zZmVyU3RhdHVzKTsKKyAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByb290LCAidHlwZSIsCisgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdFR5cGUgIT0gbnVsbCA/IHRoaXMucHJvZHVjdFR5cGUuZ2V0TmFtZSgpIDogIiIpOworCisgICAgICAgICAgICBpZiAodGhpcy5nZXRQcm9kdWN0UmVmZXJlbmNlcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHJlZnNFbGVtID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIHJvb3QsICJyZWZlcmVuY2VzIik7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGkgPSB0aGlzLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZWZFbGVtID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIHJlZnNFbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcmVmRWxlbSwgIm9yaWciLCByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJlZkVsZW0sICJkYXRhU3RvcmUiLCByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcmVmRWxlbSwgInNpemUiLCBTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVPZihyLmdldEZpbGVTaXplKCkpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZ2VuZXJhdGluZyBwcm9kdWN0IHhtbCBmaWxlITogIgorICAgICAgICAgICAgICAgICAgICArIHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBwcm9kdWN0IHhtbCBmaWxlITogIgorICAgICAgICAgICAgICAgICAgICArIHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvYzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgICAgICB0aGlzLnByb2R1Y3RJZCA9IHJvb3QuZ2V0QXR0cmlidXRlKCJpZCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5wcm9kdWN0TmFtZSA9IFVSTERlY29kZXIuZGVjb2RlKHJvb3QuZ2V0QXR0cmlidXRlKCJuYW1lIiksCisgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgcHJvZHVjdCBuYW1lOiBlcnJvciBkZWNvZGluZyBlbmNvZGVkIHN0cmluZzogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIH0KKworICAgICAgICB0aGlzLnByb2R1Y3RTdHJ1Y3R1cmUgPSBYTUxVdGlscy5nZXRFbGVtZW50VGV4dCgic3RydWN0dXJlIiwgcm9vdCk7CisgICAgICAgIHRoaXMucHJvZHVjdFR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgdGhpcy5wcm9kdWN0VHlwZS5zZXROYW1lKFhNTFV0aWxzLmdldEVsZW1lbnRUZXh0KCJ0eXBlIiwgcm9vdCkpOworICAgICAgICB0aGlzLnRyYW5zZmVyU3RhdHVzID0gWE1MVXRpbHMuZ2V0RWxlbWVudFRleHQoInRyYW5zZmVyU3RhdHVzIiwgcm9vdCk7CisKKyAgICAgICAgRWxlbWVudCByZWZzRWxlbSA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudCgicmVmZXJlbmNlcyIsIHJvb3QpOworCisgICAgICAgIGlmIChyZWZzRWxlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBOb2RlTGlzdCByZWZOb2RlTGlzdCA9IHJlZnNFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJyZWZlcmVuY2UiKTsKKworICAgICAgICAgICAgaWYgKHJlZk5vZGVMaXN0ICE9IG51bGwgJiYgcmVmTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZOb2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmVmRWxlbSA9IChFbGVtZW50KSByZWZOb2RlTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5zZXRPcmlnUmVmZXJlbmNlKHJlZkVsZW0uZ2V0QXR0cmlidXRlKCJvcmlnIikpOworICAgICAgICAgICAgICAgICAgICByLnNldERhdGFTdG9yZVJlZmVyZW5jZShyZWZFbGVtLmdldEF0dHJpYnV0ZSgiZGF0YVN0b3JlIikpOworICAgICAgICAgICAgICAgICAgICByLnNldEZpbGVTaXplKExvbmcudmFsdWVPZihyZWZFbGVtLmdldEF0dHJpYnV0ZSgic2l6ZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlcy5hZGQocik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1Byb2R1Y3RQYWdlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9Qcm9kdWN0UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGMxOWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9Qcm9kdWN0UGFnZS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBQYWdlIG9mIHtAbGluayBQcm9kdWN0fXMgcmV0dXJuZWQgZnJvbSB0aGUgPGNvZGU+RmlsZSBNYW5hZ2VyPC9jb2RlPi4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFBhZ2UgeworCisgICAgLyogdGhlIG51bWJlciBvZiB0aGlzIHBhZ2UgKi8KKyAgICBwcml2YXRlIGludCBwYWdlTnVtID0gLTE7CisKKyAgICAvKiB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzZXQgKi8KKyAgICBwcml2YXRlIGludCB0b3RhbFBhZ2VzID0gLTE7CisKKyAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgbnVtYmVyIG9mIHByb2R1Y3RzIG9uIHRoaXMgcGFnZSAqLworICAgIHByaXZhdGUgaW50IHBhZ2VTaXplID0gLTE7CisKKyAgICAvKiB0aGUgbGlzdCBvZiBwcm9kdWRjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZSAqLworICAgIHByaXZhdGUgTGlzdDxQcm9kdWN0PiBwYWdlUHJvZHVjdHMgPSBudWxsOworICAgIAorICAgIC8qIHRoZSBjb21wdXRlZCBudW1iZXIgb2YgdG90YWwgaGl0cyBmb3IgdGhlIHF1ZXJ5ICovCisgICAgcHJpdmF0ZSBsb25nIG51bU9mSGl0czsKKworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RQYWdlKCkgeworICAgICAgICBwYWdlUHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhZ2VOdW0KKyAgICAgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgdGhpcyBwYWdlLgorICAgICAqIEBwYXJhbSB0b3RhbFBhZ2VzCisgICAgICogICAgICAgICAgICBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzZXQuCisgICAgICogQHBhcmFtIHBhZ2VTaXplCisgICAgICogICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGlzIHBhZ2UuCisgICAgICogQHBhcmFtIHBhZ2VQcm9kdWN0cworICAgICAqICAgICAgICAgICAgVGhlIHByb2R1Y3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIFByb2R1Y3RQYWdlKGludCBwYWdlTnVtLCBpbnQgdG90YWxQYWdlcywgaW50IHBhZ2VTaXplLAorICAgICAgICAgICAgTGlzdDxQcm9kdWN0PiBwYWdlUHJvZHVjdHMpIHsKKyAgICAgICAgdGhpcy5wYWdlTnVtID0gcGFnZU51bTsKKyAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gdG90YWxQYWdlczsKKyAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplOworICAgICAgICB0aGlzLnBhZ2VQcm9kdWN0cyA9IHBhZ2VQcm9kdWN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhZ2VOdW0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYWdlTnVtKCkgeworICAgICAgICByZXR1cm4gcGFnZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFnZU51bQorICAgICAqICAgICAgICAgICAgVGhlIHBhZ2VOdW0gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VOdW0oaW50IHBhZ2VOdW0pIHsKKyAgICAgICAgdGhpcy5wYWdlTnVtID0gcGFnZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhZ2VQcm9kdWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRQYWdlUHJvZHVjdHMoKSB7CisgICAgICAgIHJldHVybiBwYWdlUHJvZHVjdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhZ2VQcm9kdWN0cworICAgICAqICAgICAgICAgICAgVGhlIHBhZ2VQcm9kdWN0cyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFnZVByb2R1Y3RzKExpc3Q8UHJvZHVjdD4gcGFnZVByb2R1Y3RzKSB7CisgICAgICAgIHRoaXMucGFnZVByb2R1Y3RzID0gcGFnZVByb2R1Y3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFnZVNpemUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYWdlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYWdlU2l6ZQorICAgICAqICAgICAgICAgICAgVGhlIHBhZ2VTaXplIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWdlU2l6ZShpbnQgcGFnZVNpemUpIHsKKyAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG90YWxQYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRvdGFsUGFnZXMoKSB7CisgICAgICAgIHJldHVybiB0b3RhbFBhZ2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0b3RhbFBhZ2VzCisgICAgICogICAgICAgICAgICBUaGUgdG90YWxQYWdlcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG90YWxQYWdlcyhpbnQgdG90YWxQYWdlcykgeworICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSB0b3RhbFBhZ2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UgaW4gdGhlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTGFzdFBhZ2UoKSB7CisgICAgICAgIHJldHVybiBwYWdlTnVtID09IHRvdGFsUGFnZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgaXMgdGhlIGZpc3QgcGFnZSBvZiB0aGUgc2V0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXJzdFBhZ2UoKSB7CisgICAgICAgIHJldHVybiBwYWdlTnVtID09IDE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1PZkhpdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROdW1PZkhpdHMoKSB7CisgICAgICByZXR1cm4gbnVtT2ZIaXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBudW1PZkhpdHMgdGhlIG51bU9mSGl0cyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdW1PZkhpdHMobG9uZyBudW1PZkhpdHMpIHsKKyAgICAgIHRoaXMubnVtT2ZIaXRzID0gbnVtT2ZIaXRzOworICAgIH0gICAgCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgYmxhbmssIHVucG9wdWxhdGVkIHtAbGluayBQcm9kdWN0UGFnZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9kdWN0UGFnZSBibGFua1BhZ2UoKSB7CisgICAgICAgIFByb2R1Y3RQYWdlIGJsYW5rID0gbmV3IFByb2R1Y3RQYWdlKCk7CisgICAgICAgIGJsYW5rLnNldFBhZ2VOdW0oMCk7CisgICAgICAgIGJsYW5rLnNldFRvdGFsUGFnZXMoMCk7CisgICAgICAgIGJsYW5rLnNldFBhZ2VTaXplKDApOworICAgICAgICByZXR1cm4gYmxhbms7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUHJvZHVjdFR5cGUuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1Byb2R1Y3RUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhNmQ5OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1Byb2R1Y3RUeXBlLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy50eXBlLlR5cGVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBQcm9kdWN0VHlwZSBpcyBhIHR5cGUgb2YgY29udGVudCB0aGF0IHdpbGwgYmUgaW5nZXN0ZWQgaW50byB0aGUgZGF0YSBzdG9yZQorICogZWxlbWVudCBvZiB0aGUgQ0FTIEZpbGUgTWFuYWdlci4gVGhlIHtAbGluayBNZXRhZGF0YVN0b3JlfSBhbHNvIG5lZWRzIHRvIGtub3cKKyAqIGFib3V0IHRoZSBQcm9kdWN0VHlwZSwgYmVjYXVzZSB7QGxpbmsgRWxlbWVudH1zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlbSB0bworICogZGVmaW5lIGhvdyB0aGUgbWV0YWRhdGEgaXMgc3RvcmVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZHVjdC4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFR5cGUgeworCisgICAgLyogdGhlIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhpcyBwcm9kdWN0IHR5cGUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZUlkID0gbnVsbDsKKworICAgIC8qIHRoZSBuYW1lIG9mIHRoaXMgcHJvZHVjdCB0eXBlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAvKiBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvZHVjdCB0eXBlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgLyogdGhlIHBhdGggdG8gdGhlIHJlcG9zaXRvcnkgZm9yIHRoaXMgcHJvZHVjdCB0eXBlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdFJlcG9zaXRvcnlQYXRoID0gbnVsbDsKKworICAgIC8qCisgICAgICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgdmVyc2lvbmluZyBzY2hlbWUgZm9yIHRoaXMKKyAgICAgKiBwcm9kdWN0IHR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uZXIgPSBudWxsOworCisgICAgLyogbWV0YWRhdGEgZGVzY3JpYmluZyB0aGUgcHJvZHVjdCB0eXBlICovCisgICAgcHJpdmF0ZSBNZXRhZGF0YSB0eXBlTWV0YWRhdGEgPSBudWxsOworCisgICAgLyogbGlzdCBvZiB7QGxpbmsgRXh0cmFjdG9yU3BlY31zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2R1Y3QgdHlwZSAqLworICAgIHByaXZhdGUgTGlzdDxFeHRyYWN0b3JTcGVjPiBleHRyYWN0b3JzID0gbnVsbDsKKworICAgIHByaXZhdGUgTGlzdDxUeXBlSGFuZGxlcj4gaGFuZGxlcnMgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBQcm9kdWN0VHlwZSgpIHsKKyAgICAgICAgdHlwZU1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIGV4dHJhY3RvcnMgPSBuZXcgVmVjdG9yPEV4dHJhY3RvclNwZWM+KCk7CisgICAgfQorCisgICAgcHVibGljIFByb2R1Y3RUeXBlKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5LCBTdHJpbmcgdmVyc2lvbmVyKSB7CisgICAgICAgIHByb2R1Y3RUeXBlSWQgPSBpZDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICBwcm9kdWN0UmVwb3NpdG9yeVBhdGggPSByZXBvc2l0b3J5OworICAgICAgICB0aGlzLnZlcnNpb25lciA9IHZlcnNpb25lcjsKKyAgICAgICAgdHlwZU1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uCisgICAgICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9kdWN0VHlwZUlkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFR5cGVJZCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RUeXBlSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb2R1Y3RUeXBlSWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0VHlwZUlkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZUlkKFN0cmluZyBwcm9kdWN0VHlwZUlkKSB7CisgICAgICAgIHRoaXMucHJvZHVjdFR5cGVJZCA9IHByb2R1Y3RUeXBlSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9kdWN0UmVwb3NpdG9yeVBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKSB7CisgICAgICAgIHJldHVybiBwcm9kdWN0UmVwb3NpdG9yeVBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb2R1Y3RSZXBvc2l0b3J5UGF0aAorICAgICAqICAgICAgICAgICAgVGhlIHByb2R1Y3RSZXBvc2l0b3J5UGF0aCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKFN0cmluZyBwcm9kdWN0UmVwb3NpdG9yeVBhdGgpIHsKKyAgICAgICAgdGhpcy5wcm9kdWN0UmVwb3NpdG9yeVBhdGggPSBwcm9kdWN0UmVwb3NpdG9yeVBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uZXIoKSB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHZlcnNpb25lcgorICAgICAqICAgICAgICAgICAgVGhlIHZlcnNpb25lciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbmVyKFN0cmluZyB2ZXJzaW9uZXIpIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uZXIgPSB2ZXJzaW9uZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdHlwZU1ldGFkYXRhCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGdldFR5cGVNZXRhZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVNZXRhZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdHlwZU1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgdHlwZU1ldGFkYXRhIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVNZXRhZGF0YShNZXRhZGF0YSB0eXBlTWV0YWRhdGEpIHsKKyAgICAgICAgdGhpcy50eXBlTWV0YWRhdGEgPSB0eXBlTWV0YWRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZXh0cmFjdG9ycworICAgICAqLworICAgIHB1YmxpYyBMaXN0PEV4dHJhY3RvclNwZWM+IGdldEV4dHJhY3RvcnMoKSB7CisgICAgICAgIHJldHVybiBleHRyYWN0b3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBleHRyYWN0b3JzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmFjdG9ycyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYWN0b3JzKExpc3Q8RXh0cmFjdG9yU3BlYz4gZXh0cmFjdG9ycykgeworICAgICAgICB0aGlzLmV4dHJhY3RvcnMgPSBleHRyYWN0b3JzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFR5cGVIYW5kbGVyPiBnZXRIYW5kbGVycygpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJzKExpc3Q8VHlwZUhhbmRsZXI+IGhhbmRsZXJzKSB7CisgICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVyczsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUXVlcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1F1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0ZjE5YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1F1ZXJ5LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgUXVlcnkgaXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFF1ZXJ5Q3JpdGVyaWF9LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeSB7CisKKyAgICAvKiB0aGUgc2V0IG9mIHtAbGluayBRdWVyeUNyaXRlcmlhfSBmb3IgdGhpcyBRdWVyeSAqLworICAgIHByaXZhdGUgTGlzdDxRdWVyeUNyaXRlcmlhPiBjcml0ZXJpYSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5KCkgeworICAgICAgICBjcml0ZXJpYSA9IG5ldyBWZWN0b3I8UXVlcnlDcml0ZXJpYT4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY3JpdGVyaWEKKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnkoTGlzdDxRdWVyeUNyaXRlcmlhPiBjcml0ZXJpYSkgeworICAgICAgICBpZiAoY3JpdGVyaWEgPT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuY3JpdGVyaWEgPSBuZXcgVmVjdG9yPFF1ZXJ5Q3JpdGVyaWE+KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuY3JpdGVyaWEgPSBjcml0ZXJpYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNyaXRlcmlhLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFF1ZXJ5Q3JpdGVyaWE+IGdldENyaXRlcmlhKCkgeworICAgICAgICByZXR1cm4gY3JpdGVyaWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNyaXRlcmlhCisgICAgICogICAgICAgICAgICBUaGUgY3JpdGVyaWEgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyaXRlcmlhKExpc3Q8UXVlcnlDcml0ZXJpYT4gY3JpdGVyaWEpIHsKKyAgICAgICAgaWYgKGNyaXRlcmlhICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gY3JpdGVyaWE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ3JpdGVyaW9uKFF1ZXJ5Q3JpdGVyaWEgcWMpIHsKKyAgICAgICAgY3JpdGVyaWEuYWRkKHFjKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBBIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIHJTdHIuYXBwZW5kKCJxPSIpOworCisgICAgICAgIGludCBudW1Dcml0ZXJpYSA9IGNyaXRlcmlhLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Dcml0ZXJpYTsgaSsrKSB7CisgICAgICAgICAgICBRdWVyeUNyaXRlcmlhIGMgPSAoUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEuZ2V0KGkpOworICAgICAgICAgICAgclN0ci5hcHBlbmQoYy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChpICE9IG51bUNyaXRlcmlhIC0gMSkKKyAgICAgICAgICAgICAgICByU3RyLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByU3RyLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9RdWVyeUNyaXRlcmlhLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9RdWVyeUNyaXRlcmlhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxNzc3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1F1ZXJ5Q3JpdGVyaWEuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0czsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBjcml0ZXJpYSBzZWFyY2hlcworICogc3VjaCBhcyB0ZXJtIHNlYXJjaCwgcmFuZ2Ugc2VhcmNoIGFuZCBmcmVlIHRleHQgc2VhcmNoLiBTdWJjbGFzc2VzIGFyZSBhZGRlZAorICogdG8gUXVlcnkgaW5zdGFuY2VzIGluIG9yZGVyIHRvIHNlYXJjaCB0aGUgQ2F0YWxvZy4KKyAqIDwvcD4KKyAqIAorICogPHVsPgorICogPGxoPktub3duIFN1YmNsYXNzZXM6PC9saD4KKyAqIDxsaT5GcmVlVGV4dFF1ZXJ5Q3JpdGVyaWEKKyAqIDxsaT5SYW5nZVF1ZXJ5Q3JpdGVyaWEKKyAqIDxsaT5UZXJtUXVlcnlDcml0ZXJpYQorICogPC91bD4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFF1ZXJ5Q3JpdGVyaWEgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgLyoqCisgICAgICogQWJzdHJhY3QgYWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgRWxlbWVudCBuYW1lIHRvIHNlYXJjaCBvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBFbGVtZW50TmFtZSBpbiB0aGUgZm9ybSBvZiBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBtdXRhdG9yIG1ldGhvZCBmb3IgdGhlIEVsbWVudCBuYW1lIHRvIHNlYXJjaCBvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gRWxlbWVudCBOYW1lCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKTsKKworICAgIC8qKgorICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3IgY29udmVydGluZyB0aGUgUXVlcnlDcml0ZXJpYSB0byBhIGh1bWFuLXBhcnNhYmxlCisgICAgICogU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUmFuZ2VRdWVyeUNyaXRlcmlhLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9SYW5nZVF1ZXJ5Q3JpdGVyaWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE3NGRjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUmFuZ2VRdWVyeUNyaXRlcmlhLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgUmFuZ2UgQ3JpdGVyaWEgZWxlbWVudCBmb3IgYSBRdWVyeSB0byB0aGUgQ2F0YWxvZy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUmFuZ2VRdWVyeUNyaXRlcmlhIGV4dGVuZHMgUXVlcnlDcml0ZXJpYSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhcnRWYWx1ZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVuZFZhbHVlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1c2l2ZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFJhbmdlUXVlcnlDcml0ZXJpYSgpIHsKKyAgICAgICAgZWxlbWVudE5hbWUgPSBudWxsOworICAgICAgICBzdGFydFZhbHVlID0gbnVsbDsKKyAgICAgICAgZW5kVmFsdWUgPSBudWxsOworICAgICAgICBpbmNsdXNpdmUgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgUmFuZ2VRdWVyeWNyaXRlcmlhIGNsYXNzLiBOb3RlIHRoYXQgdGhpcyBkZWZhdWx0CisgICAgICogcmFuZ2UgaXMgaW5jbHVzaXZlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgVGhlIHN0YXJ0IHZhbHVlIGZvciB0aGUgcmFuZ2Ugc2VhcmNoIGFzIGEgU3RyaW5nLgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbmQgdmFsdWUgZm9yIHRoZSByYW5nZSBzZWFyY2ggYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFJhbmdlUXVlcnlDcml0ZXJpYShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgeworICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisgICAgICAgIHN0YXJ0VmFsdWUgPSBzdGFydDsKKyAgICAgICAgZW5kVmFsdWUgPSBlbmQ7CisgICAgICAgIGluY2x1c2l2ZSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBSYW5nZVF1ZXJ5Q3JpdGVyaWEgY2xhcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAgICAgKiBib3RoIGluY2x1c2l2ZSBhbmQgZXhjbHVzaXZlIHJhbmdlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydCB2YWx1ZSBmb3IgdGhlIHJhbmdlIHNlYXJjaCBhcyBhIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICBUaGUgZW5kIHZhbHVlIGZvciB0aGUgcmFuZ2Ugc2VhcmNoIGFzIGEgU3RyaW5nLgorICAgICAqIEBwYXJhbSBpbmNsdXNpdmUKKyAgICAgKiAgICAgICAgICAgIEJvb2xlYW46IHRydWUgZm9yIGluY2x1c2l2ZSwgZmFsc2UgZm9yIGV4Y2x1c2l2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmFuZ2VRdWVyeUNyaXRlcmlhKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHN0YXJ0LCBTdHJpbmcgZW5kLAorICAgICAgICAgICAgYm9vbGVhbiBpbmNsdXNpdmUpIHsKKyAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOworICAgICAgICBzdGFydFZhbHVlID0gc3RhcnQ7CisgICAgICAgIGVuZFZhbHVlID0gZW5kOworICAgICAgICB0aGlzLmluY2x1c2l2ZSA9IGluY2x1c2l2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBzdGFydCB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXV0YXRvciBtZXRob2QgZm9yIHRoZSBzdGFydCB2YWx1ZSBmbyB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHJhbmdlIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHN0YXJ0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBlbmQgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGVuZCB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24gYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11dGF0b3IgbWV0aG9kIGZvciB0aGUgZW5kIHZhbHVlIGZvIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbmQgdmFsdWUgb2YgdGhlIHJhbmdlIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuZFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBlbmRWYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2Vzc29yIG1ldGhvZCBmb3IgdGhlIGluY2x1c2l2ZSBzZXR0aW5nIGZvciB0aGUgcmFuZ2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgYm9vbGVhbiBpbmNsdXNpdmUvZXhjbHVzaXZlIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVzaXZlKCkgeworICAgICAgICByZXR1cm4gaW5jbHVzaXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11dGF0b3IgbWV0aG9kIGZvciB0aGUgaW5jbHVzaXZlIHNldHRpbmcgZm9yIHRoZSByYW5nZS4gTm90ZSB0aGF0IGZsYWcKKyAgICAgKiBzaG91bGQgYmUgc2V0IHRvIHRydWUgZm9yIGluY2x1c2l2ZSwgZmFsc2UgZm9yIGV4Y2x1c2l2ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5jbHVzaXZlCisgICAgICogICAgICAgICAgICBUaGUgYm9vbGVhbiBpbmNsdXNpdmUvZXhjbHVzaXZlIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVzaXZlKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpbmNsdXNpdmUgPSBmbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgaW5oZXJpdGVkIGZyb20gUXVlcnlDcml0ZXJpYSBmb3IKKyAgICAgKiBhY2Nlc3NpbmcgdGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBpbmhlcml0ZWQgZnJvbSBRdWVyeUNyaXRlcmlhIGZvcgorICAgICAqIG11dGF0aW5nIHRoZSBlbGVtZW50IG5hbWUgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24gYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGluaGVyaXRlZCBmcm9tIFF1ZXJ5Q3JpdGVyaWEgZm9yCisgICAgICogZ2VuZXJhdGluZyBhIGh1bWFuLXBhcnNhYmxlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBxdWVyeSBjcml0ZXJpYS4gTm90ZQorICAgICAqIHRoYXQgdGhlIHJldHVybmVkIFN0cmluZyBmb2xsb3dzIHRoZSBMdWNlbmUgcXVlcnkgbGFuZ3VhZ2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgcXVlcnkgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHNlcmlhbCA9IGVsZW1lbnROYW1lICsgIjpbIiArIHN0YXJ0VmFsdWUgKyAiIFRPICIgKyBlbmRWYWx1ZSArICJdIjsKKyAgICAgICAgcmV0dXJuIHNlcmlhbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1JlZmVyZW5jZS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzZTM2ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1JlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EuVGlrYTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EuY29uZmlnLlRpa2FDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlc0ZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSByZWZlcmVuY2Ugc3RvcmVzIHRoZSBvcmlnaW5hbCBpdGVtIHJlZmVyZW5jZSwgYW5kIGFsc28gdGhlIGl0ZW0ncyBkYXRhCisgKiBzdG9yZSByZWZlcmVuY2UsIHdoaWNoIGRlc2NyaWJlcyBpdHMgbG9jYXRpb24gd2l0aGluIHRoZSBkYXRhIHN0b3JlLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZlcmVuY2UgeworCisgICAgLyogdGhlIGl0ZW0ncyBvcmlnaW5hbCBsb2NhdGlvbiAqLworICAgIHByaXZhdGUgU3RyaW5nIG9yaWdSZWZlcmVuY2UgPSBudWxsOworCisgICAgLyogdGhlIGxvY2F0aW9uIG9mIHRoZSBpdGVtIHdpdGhpbiB0aGUgZGF0YSBzdG9yZSAqLworICAgIHByaXZhdGUgU3RyaW5nIGRhdGFTdG9yZVJlZmVyZW5jZSA9IG51bGw7CisKKyAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB0aGF0IHRoaXMgcmVmZXJlbmNlIHJlZmVycyB0byAqLworICAgIHByaXZhdGUgbG9uZyBmaWxlU2l6ZSA9IDBMOworCisgICAgLyogdGhlIG1pbWUtdHlwZSBvZiB0aGUgZmlsZSB0aGF0IHRoaXMgcmVmZXJlbmNlIHJlZmVycyB0byAqLworICAgIHByaXZhdGUgTWltZVR5cGUgbWltZVR5cGUgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWltZVR5cGVzIG1pbWVUeXBlUmVwb3NpdG9yeTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNUUkVBTV9SRUZFUkVOQ0VfREVMSU1JVEVSID0gIi0iOworCisgICAgLyogdGhlIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIE1pbWUtVHlwZSByZXBvc2l0b3J5ICovCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBtaW1lVHlwZVJlcG9zaXRvcnkgPSBNaW1lVHlwZXNGYWN0b3J5LmNyZWF0ZShuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoU3lzdGVtLmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbWUtdHlwZXMueG1sIikpKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgbWltZVR5cGVSZXBvc2l0b3J5ID0gVGlrYUNvbmZpZy5nZXREZWZhdWx0Q29uZmlnKCkuZ2V0TWltZVJlcG9zaXRvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENvcHkgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIFRoZSBSZWZlcmVuY2Ugb2JqZWN0IHRvIGNvcHkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVmZXJlbmNlKFJlZmVyZW5jZSByKSB7CisgICAgICAgIHRoaXMoci5nZXRPcmlnUmVmZXJlbmNlKCksIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCksIHIuZ2V0RmlsZVNpemUoKSwKKyAgICAgICAgICAgICAgICByLmdldE1pbWVUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIFJlZmVyZW5jZSgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG9yaWdSZWYKKyAgICAgKiAgICAgICAgICAgIFRoZSBpdGVtJ3Mgb3JpZ2luYWwgbG9jYXRpb24uCisgICAgICogQHBhcmFtIGRhdGFSZWYKKyAgICAgKiAgICAgICAgICAgIFRoZSBpdGVtJ3MgbG9jYXRpb24gd2l0aGluIHRoZSBkYXRhIHN0b3JlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgZmlsZSB0aGF0IHRoaXMgcmVmZXJlbmNlIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVmZXJlbmNlKFN0cmluZyBvcmlnUmVmLCBTdHJpbmcgZGF0YVJlZiwgbG9uZyBzaXplKSB7CisgICAgICAgIG9yaWdSZWZlcmVuY2UgPSBvcmlnUmVmOworICAgICAgICBkYXRhU3RvcmVSZWZlcmVuY2UgPSBkYXRhUmVmOworICAgICAgICBmaWxlU2l6ZSA9IHNpemU7CisgICAgICAgIC8vIFRPRE86IHNpbmNlIG5vIG1pbWV0eXBlIHdhcyBzcGVjaWZpZWQsIGRvIHRoZSBkaXJ0eSB3b3JrCisgICAgICAgIC8vIG91cnNlbHZlcyB0byBkZXRlcm1pbmUgdGhlIHdoaWNoIE1pbWVUeXBlIGNsYXNzIHRvIGFzc29jaWF0ZQorICAgICAgICAvLyB3aXRoIHRoaXMgcmVmZXJlbmNlLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlUmVwb3NpdG9yeS5mb3JOYW1lKG5ldyBUaWthKCkuZGV0ZWN0KG9yaWdSZWYpKTsKKyAgICAgICAgfSBjYXRjaCAoTWltZVR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyBSZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIEluIHBhcnRpY3VsYXIsCisgICAgICogYSBNaW1lVHlwZSBvYmplY3QgaXMgZXhwbGljaXRseSBzdXBwbGllZC4gVGhpcyBvYmplY3QgcmVwcmVzZW50cyB0aGUKKyAgICAgKiBtaW1lLXR5cGUgb2YgdGhlIGl0ZW0gdGhpcyByZWZlcmVuY2UgcmVmZXJzIHRvCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcmlnUmVmCisgICAgICogICAgICAgICAgICBUaGUgaXRlbSdzIG9yaWdpbmFsIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBkYXRhUmVmCisgICAgICogICAgICAgICAgICBUaGUgaXRlbSdzIGxvY2F0aW9uIHdpdGhpbiB0aGUgZGF0YSBzdG9yZS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGZpbGUgdGhhdCB0aGlzIHJlZmVyZW5jZSByZWZlcnMgdG8uCisgICAgICogQHBhcmFtIG1pbWUKKyAgICAgKiAgICAgICAgICAgIEEgTWltZVR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbWltZS10eXBlIG9mIHRoZSBpdGVtCisgICAgICovCisgICAgcHVibGljIFJlZmVyZW5jZShTdHJpbmcgb3JpZ1JlZiwgU3RyaW5nIGRhdGFSZWYsIGxvbmcgc2l6ZSwgTWltZVR5cGUgbWltZSkgeworICAgICAgICBvcmlnUmVmZXJlbmNlID0gb3JpZ1JlZjsKKyAgICAgICAgZGF0YVN0b3JlUmVmZXJlbmNlID0gZGF0YVJlZjsKKyAgICAgICAgZmlsZVNpemUgPSBzaXplOworICAgICAgICBtaW1lVHlwZSA9IG1pbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkYXRhU3RvcmVSZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhU3RvcmVSZWZlcmVuY2UoKSB7CisgICAgICAgIHJldHVybiBkYXRhU3RvcmVSZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRhdGFTdG9yZVJlZmVyZW5jZQorICAgICAqICAgICAgICAgICAgVGhlIGRhdGFTdG9yZVJlZmVyZW5jZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVN0b3JlUmVmZXJlbmNlKFN0cmluZyBkYXRhU3RvcmVSZWZlcmVuY2UpIHsKKyAgICAgICAgdGhpcy5kYXRhU3RvcmVSZWZlcmVuY2UgPSBkYXRhU3RvcmVSZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcmlnUmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ1JlZmVyZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG9yaWdSZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG9yaWdSZWZlcmVuY2UKKyAgICAgKiAgICAgICAgICAgIFRoZSBvcmlnUmVmZXJlbmNlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmlnUmVmZXJlbmNlKFN0cmluZyBvcmlnUmVmZXJlbmNlKSB7CisgICAgICAgIHRoaXMub3JpZ1JlZmVyZW5jZSA9IG9yaWdSZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWxlU2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRGaWxlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBmaWxlU2l6ZQorICAgICAqICAgICAgICAgICAgVGhlIGZpbGVTaXplIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlU2l6ZShsb25nIGZpbGVTaXplKSB7CisgICAgICAgIHRoaXMuZmlsZVNpemUgPSBmaWxlU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgYSBNaW1lVHlwZSBvYmogcmVwcmVzZW50aW5nIHRoZSBtaW1lLXR5cGUgb2YgdGhpcworICAgICAqICAgICAgICAgcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIE1pbWVUeXBlIGdldE1pbWVUeXBlKCkgeworICAgICAgICByZXR1cm4gbWltZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG1pbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBNaW1lVHlwZSBvYmplY3QgdG8gc2V0IGZvciB0aGlzIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKE1pbWVUeXBlIG1pbWUpIHsKKyAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgbmFtZSBvZiB0aGUgbWltZXR5cGUgb2YgdGhpcyByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZihuYW1lID09IG51bGwgfHwgKG5hbWUgIT0gbnVsbCAmJiAKKyAgICAgICAgICAgIG5hbWUuZXF1YWxzKCIiKSkpIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlUmVwb3NpdG9yeS5mb3JOYW1lKG5hbWUpOworICAgICAgICB9IGNhdGNoIChNaW1lVHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIltvcmlnPSIpOworICAgICAgICBidWYuYXBwZW5kKHRoaXMub3JpZ1JlZmVyZW5jZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIixkZXN0PSIpOworICAgICAgICBidWYuYXBwZW5kKHRoaXMuZGF0YVN0b3JlUmVmZXJlbmNlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLHNpemU9Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQodGhpcy5maWxlU2l6ZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIixtaW1lPSIpOworICAgICAgICBidWYuYXBwZW5kKHRoaXMubWltZVR5cGUgIT0gbnVsbCA/IHRoaXMubWltZVR5cGUudG9TdHJpbmcoKSA6ICJOL0EiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9UZXJtUXVlcnlDcml0ZXJpYS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvVGVybVF1ZXJ5Q3JpdGVyaWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU0MWIxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvVGVybVF1ZXJ5Q3JpdGVyaWEuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHM7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBUZXJtIENyaXRlcmlhIGVsZW1lbnQgZm9yIGEgUXVlcnkgdG8gdGhlIENhdGFsb2cuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlcm1RdWVyeUNyaXRlcmlhIGV4dGVuZHMgUXVlcnlDcml0ZXJpYSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBUZXJtUXVlcnlDcml0ZXJpYSgpIHsKKyAgICAgICAgZWxlbWVudE5hbWUgPSBudWxsOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBUZXJtUXVlcnlFQ3JpdGVyaWEgQ2xhc3MuCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24uCisgICAgICogQHBhcmFtIHYKKyAgICAgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdGVybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVybVF1ZXJ5Q3JpdGVyaWEoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgdikgeworICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisgICAgICAgIHZhbHVlID0gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXRhdG9yIG1ldGhvZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgaW5oZXJpdGVkIGZyb20gUXVlcnlDcml0ZXJpYSBmb3IKKyAgICAgKiBhY2Nlc3NpbmcgdGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBpbmhlcml0ZWQgZnJvbSBRdWVyeUNyaXRlcmlhIGZvcgorICAgICAqIG11dGF0aW5nIHRoZSBlbGVtZW50IG5hbWUgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24gYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGluaGVyaXRlZCBmcm9tIFF1ZXJ5Q3JpdGVyaWEgZm9yCisgICAgICogZ2VuZXJhdGluZyBhIGh1bWFuLXBhcnNhYmxlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBxdWVyeSBjcml0ZXJpYS4gTm90ZQorICAgICAqIHRoYXQgdGhlIHJldHVybmVkIFN0cmluZyBmb2xsb3dzIHRoZSBMdWNlbmUgcXVlcnkgbGFuZ3VhZ2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgcXVlcnkgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHNlcmlhbCA9IHRoaXMuZWxlbWVudE5hbWUgKyAiOiIgKyB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHNlcmlhbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvQ2FjaGVFeGNlcHRpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvQ2FjaGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI3OGNiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvZXhjZXB0aW9ucy9DYWNoZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE1NDg0MzA5Njk0NDE3NDMxOUw7CisKKyAgICBwdWJsaWMgQ2FjaGVFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIENhY2hlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL0NhdGFsb2dFeGNlcHRpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvQ2F0YWxvZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzc0YzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL0NhdGFsb2dFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnM7DQorDQorLyoqDQorICogQGF1dGhvciBtYXR0bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiANCisgKiA8cD5BIGdlbmVyaWMgZXhjZXB0aW9uIHRoYXQgb2NjdXJlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUNCisgKiBDYXRhbG9nLjwvcD4NCisgKiANCisgKi8NCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2OTA3NTM5OTA2ODYwMjkxMTBMOw0KKw0KKyAgICBwdWJsaWMgQ2F0YWxvZ0V4Y2VwdGlvbigpIHsNCisgICAgICAgIHN1cGVyKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIENhdGFsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsNCisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDYXRhbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgew0KKyAgICAgICAgc3VwZXIobWVzc2FnZSwgdCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvZXhjZXB0aW9ucy9Db25uZWN0aW9uRXhjZXB0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL0Nvbm5lY3Rpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNmYzdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvZXhjZXB0aW9ucy9Db25uZWN0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPkFuIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGEgY29ubmVjdGlvbiBjYW5ub3QKKyAqIGJlIGVzdGFibGlzaGVkIGJ5IGEgY2xpZW50LjwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzI2MDQ3ODc4Nzg4NjYwMzQwMUw7CisKKyAgICAvKioKKyAgICAgKiA8cD5EZWZhdWx0IENvbnN0cnVjdG9yPC9wPgorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvZXhjZXB0aW9ucy9EYXRhVHJhbnNmZXJFeGNlcHRpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvRGF0YVRyYW5zZmVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzBjYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvRGF0YVRyYW5zZmVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgbWF0dG1hbm4NCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kDQorICogDQorICogPHA+QW4gZXhjZXB0aW9uIHRocm93biBkdXJpbmcgZGF0YSB0cmFuc2Zlci48L3A+DQorICogDQorICovDQorcHVibGljIGNsYXNzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQorDQorICAgIC8qIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTc2NzQxMzU0NDI2NDc5OTI0TDsNCisNCisgICAgLyoqDQorICAgICAqIA0KKyAgICAgKi8NCisgICAgcHVibGljIERhdGFUcmFuc2ZlckV4Y2VwdGlvbigpIHsNCisgICAgICAgIHN1cGVyKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtZXNzYWdlDQorICAgICAqLw0KKyAgICBwdWJsaWMgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQorICAgICAgICBzdXBlcihtZXNzYWdlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIGNhdXNlDQorICAgICAqLw0KKyAgICBwdWJsaWMgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgew0KKyAgICAgICAgc3VwZXIoY2F1c2UpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KKyAgICAgKiBAcGFyYW0gY2F1c2UNCisgICAgICovDQorICAgIHB1YmxpYyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KKyAgICB9DQorDQorDQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvSW5nZXN0RXhjZXB0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL0luZ2VzdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL0luZ2VzdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkFuIGV4Y2VwdGlvbiB3aGVuIGluZ2VzdGluZyBhIHByb2R1Y3QuPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIEluZ2VzdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwkvKioKKyAgICogCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MTM0MDc4ODY2NjUwNzc3MjgxTDsKKworICAvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgSW5nZXN0RXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYXJnMAorCSAqLworCXB1YmxpYyBJbmdlc3RFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICogQHBhcmFtIGFyZzEKKwkgKi8KKwlwdWJsaWMgSW5nZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgeworCQlzdXBlcihhcmcwLCBhcmcxKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyoqCisJICogQHBhcmFtIGFyZzAKKwkgKi8KKwlwdWJsaWMgSW5nZXN0RXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL1F1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWQ2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL1F1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+QSBnZW5lcmljIGV4Y2VwdGlvbiB0aGF0IG9jY3VyZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCisgKiBDYXRhbG9nLjwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjQxMzgxNjI5ODg2NTgxMzgyTDsKKworCS8qKgorICAgICAqIDxwPkRlZmF1bHQgQ29uc3RydWN0b3I8L3A+CisgICAgICovCisgICAgcHVibGljIFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL1JlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL1JlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZWQxMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnM7DQorDQorLyoqDQorICogQGF1dGhvciBtYXR0bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiANCisgKiA8cD5BbiBleGNlcHRpb24gdGhyb3duIGZyb20gdGhlIHtAbGluayBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlcn0gDQorICogaW50ZXJmYWNlLjwvcD4NCisgKiANCisgKi8NCitwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjg4NTAyMjA4MDE4OTIwNDk3TDsNCisNCisgICAgLyoqDQorICAgICAqIA0KKyAgICAgKi8NCisgICAgcHVibGljIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uKCkgew0KKyAgICAgICAgc3VwZXIoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG1lc3NhZ2UNCisgICAgICovDQorICAgIHB1YmxpYyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgew0KKyAgICAgICAgc3VwZXIobWVzc2FnZSk7DQorICAgIH0NCisNCisNCit9DQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvZXhjZXB0aW9ucy9WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMDIwMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+QW4gZXhjZXB0aW9uIHRocm93biBieSB0aGUgdmFsaWRhdGlvbiBsYXllci48L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIC8qIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjkyOTMyOTkzOTNMOworCisJLyoqCisJICogCisJICovCisJcHVibGljIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbigpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyoqCisJICogQHBhcmFtIGFyZzAKKwkgKi8KKwlwdWJsaWMgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYXJnMAorCSAqIEBwYXJhbSBhcmcxCisJICovCisJcHVibGljIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKKwkJc3VwZXIoYXJnMCwgYXJnMSk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL1ZlcnNpb25pbmdFeGNlcHRpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL2V4Y2VwdGlvbnMvVmVyc2lvbmluZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmQ4MTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9leGNlcHRpb25zL1ZlcnNpb25pbmdFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnM7DQorDQorLy9PT0RUIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuVmVyc2lvbmVyOyAvL2ZvciBqYXZhZG9jDQorDQorDQorLyoqDQorICogQGF1dGhvciBtYXR0bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiANCisgKiA8cD5BbiBleGNlcHRpb24gdGhyb3duIGR1cmluZyBWZXJzaW9uaW5nIGJ5IGEge0BsaW5rIFZlcnNpb25lcn0uPC9wPg0KKyAqIA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBWZXJzaW9uaW5nRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCisNCisgICAgLyogZGVmYXVsdCBzZXJpYWwgVUlEICovDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY5OTk5NjA1NTI2MTU5ODRMOw0KKw0KKyAgICAvKioNCisgICAgICogDQorICAgICAqLw0KKyAgICBwdWJsaWMgVmVyc2lvbmluZ0V4Y2VwdGlvbigpIHsNCisgICAgICAgIHN1cGVyKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtZXNzYWdlDQorICAgICAqLw0KKyAgICBwdWJsaWMgVmVyc2lvbmluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgew0KKyAgICAgICAgc3VwZXIobWVzc2FnZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBjYXVzZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFZlcnNpb25pbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7DQorICAgICAgICBzdXBlcihjYXVzZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtZXNzYWdlDQorICAgICAqIEBwYXJhbSBjYXVzZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFZlcnNpb25pbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L0NvbXBsZXhRdWVyeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvQ29tcGxleFF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2OTZlOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L0NvbXBsZXhRdWVyeS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5Q3JpdGVyaWE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIENvbXBsZXggcXVlcnkgYWxsb3dzIGZvciBxdWVyeWluZyB0aGUgZmlsZW1nciBhY3Jvc3MgbXVsdGlwbGUgcHJvZHVjdC10eXBlcywKKyAqIHJlZHVjaW5nIHRoZSBtZXRhZGF0YSBxdWVyaWVkIGZvciwgZmlsdGVyaW5nIHRoZSByZXN1bHRzLCBhbmQgc29ydGluZyB0aGUgcmVzdWx0cworICogaW4gYSBzaW5nbGUgcXVlcnkKKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIENvbXBsZXhRdWVyeSBleHRlbmRzIFF1ZXJ5IHsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJlZHVjZWRNZXRhZGF0YTsKKyAgICBwcml2YXRlIFF1ZXJ5RmlsdGVyIHF1ZXJ5RmlsdGVyOworICAgIHByaXZhdGUgU3RyaW5nIHNvcnRCeU1ldEtleTsKKyAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZ1Jlc3VsdEZvcm1hdDsKKyAgICAKKyAgICBwdWJsaWMgQ29tcGxleFF1ZXJ5KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29tcGxleFF1ZXJ5KExpc3Q8UXVlcnlDcml0ZXJpYT4gY3JpdGVyaWEpIHsKKyAgICAgICAgc3VwZXIoY3JpdGVyaWEpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gcmVkdWNlZFByb2R1Y3RUeXBlTmFtZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoTGlzdDxTdHJpbmc+IHJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzKSB7CisgICAgICAgIHRoaXMucmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMgPSByZWR1Y2VkUHJvZHVjdFR5cGVOYW1lczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZHVjZWRNZXRhZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZHVjZWRNZXRhZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWR1Y2VkTWV0YWRhdGEoTGlzdDxTdHJpbmc+IHJlZHVjZWRNZXRhZGF0YSkgeworICAgICAgICB0aGlzLnJlZHVjZWRNZXRhZGF0YSA9IHJlZHVjZWRNZXRhZGF0YTsKKyAgICAgICAgaWYgKHRoaXMuc29ydEJ5TWV0S2V5ICE9IG51bGwgJiYgdGhpcy5yZWR1Y2VkTWV0YWRhdGEgIT0gbnVsbCAKKyAgICAgICAgICAgICAgICAmJiAhdGhpcy5yZWR1Y2VkTWV0YWRhdGEuY29udGFpbnModGhpcy5zb3J0QnlNZXRLZXkpKQorICAgICAgICAgICAgdGhpcy5yZWR1Y2VkTWV0YWRhdGEuYWRkKHRoaXMuc29ydEJ5TWV0S2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUXVlcnlGaWx0ZXIgZ2V0UXVlcnlGaWx0ZXIoKSB7CisgICAgICAgIHJldHVybiBxdWVyeUZpbHRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUZpbHRlcihRdWVyeUZpbHRlciBxdWVyeUZpbHRlcikgeworICAgICAgICB0aGlzLnF1ZXJ5RmlsdGVyID0gcXVlcnlGaWx0ZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29ydEJ5TWV0S2V5KCkgeworICAgICAgICByZXR1cm4gc29ydEJ5TWV0S2V5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvcnRCeU1ldEtleShTdHJpbmcgc29ydEJ5TWV0S2V5KSB7CisgICAgICAgIHRoaXMuc29ydEJ5TWV0S2V5ID0gc29ydEJ5TWV0S2V5OworICAgICAgICBpZiAodGhpcy5yZWR1Y2VkTWV0YWRhdGEgIT0gbnVsbCAmJiB0aGlzLnNvcnRCeU1ldEtleSAhPSBudWxsIAorICAgICAgICAgICAgICAgICYmICF0aGlzLnJlZHVjZWRNZXRhZGF0YS5jb250YWlucyh0aGlzLnNvcnRCeU1ldEtleSkpCisgICAgICAgICAgICB0aGlzLnJlZHVjZWRNZXRhZGF0YS5hZGQodGhpcy5zb3J0QnlNZXRLZXkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCkgeworICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZ1Jlc3VsdEZvcm1hdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb1N0cmluZ1Jlc3VsdEZvcm1hdChTdHJpbmcgdG9TdHJpbmdSZXN1bHRGb3JtYXQpIHsKKyAgICAgICAgdGhpcy50b1N0cmluZ1Jlc3VsdEZvcm1hdCA9IHRvU3RyaW5nUmVzdWx0Rm9ybWF0OworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L1F1ZXJ5RmlsdGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9RdWVyeUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzg0MTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9RdWVyeUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmNvbnYuQXNjaWlTb3J0YWJsZVZlcnNpb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuY29udi5WZXJzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvcjsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgcXVlcnkgZmlsdGVyIHRoYXQgYWxsb3dzIHVzZXIgdG8gZmlsdGVyIHJlc3VsdHMgaW4gYSBjb21wbGV4IHF1ZXJ5CisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5RmlsdGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YXJ0RGF0ZVRpbWVNZXRLZXksIGVuZERhdGVUaW1lTWV0S2V5LCBwcmlvcml0eU1ldEtleTsKKyAgICBwcml2YXRlIEZpbHRlckFsZ29yIGZpbHRlckFsZ29yOworICAgIHByaXZhdGUgVmVyc2lvbkNvbnZlcnRlciBjb252ZXJ0ZXI7CisKKyAgICBwdWJsaWMgUXVlcnlGaWx0ZXIoU3RyaW5nIHN0YXJ0RGF0ZVRpbWVNZXRLZXksIFN0cmluZyBlbmREYXRlVGltZU1ldEtleSwKKyAgICAgICAgICAgIFN0cmluZyBwcmlvcml0eU1ldEtleSwgRmlsdGVyQWxnb3IgZmlsdGVyQWxnb3IpIHsKKyAgICAgICAgdGhpcy5zdGFydERhdGVUaW1lTWV0S2V5ID0gc3RhcnREYXRlVGltZU1ldEtleTsKKyAgICAgICAgdGhpcy5lbmREYXRlVGltZU1ldEtleSA9IGVuZERhdGVUaW1lTWV0S2V5OworICAgICAgICB0aGlzLnByaW9yaXR5TWV0S2V5ID0gcHJpb3JpdHlNZXRLZXk7CisgICAgICAgIHRoaXMuZmlsdGVyQWxnb3IgPSBmaWx0ZXJBbGdvcjsKKyAgICAgICAgdGhpcy5jb252ZXJ0ZXIgPSBuZXcgQXNjaWlTb3J0YWJsZVZlcnNpb25Db252ZXJ0ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0RGF0ZVRpbWVNZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBzdGFydERhdGVUaW1lTWV0S2V5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZVRpbWVNZXRLZXkoU3RyaW5nIHN0YXJ0RGF0ZVRpbWVNZXRLZXkpIHsKKyAgICAgICAgdGhpcy5zdGFydERhdGVUaW1lTWV0S2V5ID0gc3RhcnREYXRlVGltZU1ldEtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZERhdGVUaW1lTWV0S2V5KCkgeworICAgICAgICByZXR1cm4gZW5kRGF0ZVRpbWVNZXRLZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW5kRGF0ZVRpbWVNZXRLZXkoU3RyaW5nIGVuZERhdGVUaW1lTWV0S2V5KSB7CisgICAgICAgIHRoaXMuZW5kRGF0ZVRpbWVNZXRLZXkgPSBlbmREYXRlVGltZU1ldEtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByaW9yaXR5TWV0S2V5KCkgeworICAgICAgICByZXR1cm4gcHJpb3JpdHlNZXRLZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHlNZXRLZXkoU3RyaW5nIHByaW9yaXR5TWV0S2V5KSB7CisgICAgICAgIHRoaXMucHJpb3JpdHlNZXRLZXkgPSBwcmlvcml0eU1ldEtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsdGVyQWxnb3IgZ2V0RmlsdGVyQWxnb3IoKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJBbGdvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJBbGdvcihGaWx0ZXJBbGdvciBmaWx0ZXJBbGdvcikgeworICAgICAgICBpZiAoZmlsdGVyQWxnb3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyQWxnb3IgPSBmaWx0ZXJBbGdvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVmVyc2lvbkNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7CisgICAgICAgIHJldHVybiBjb252ZXJ0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFZlcnNpb25Db252ZXJ0ZXIgY29udmVydGVyKSB7CisgICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuY29udmVydGVyID0gY29udmVydGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvUXVlcnlSZXN1bHQuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L1F1ZXJ5UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjOTgzYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L1F1ZXJ5UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5TdHJpbmdVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgY29tYmluYXRpb24gb2YgYSBQcm9kdWN0IGFuZCBpdHMgTWV0YWRhdGEKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgUXVlcnlSZXN1bHQgeworCisgICAgcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisgICAgcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZ0Zvcm1hdDsKKyAgICAKKyAgICBwdWJsaWMgUXVlcnlSZXN1bHQoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgIHRoaXMucHJvZHVjdCA9IHByb2R1Y3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgIHRoaXMucHJvZHVjdCA9IHByb2R1Y3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGE7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKE1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9TdHJpbmdGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nRm9ybWF0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvU3RyaW5nRm9ybWF0KFN0cmluZyB0b1N0cmluZ0Zvcm1hdCkgeworICAgICAgICB0aGlzLnRvU3RyaW5nRm9ybWF0ID0gdG9TdHJpbmdGb3JtYXQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRNZXRhZGF0YVRvU3RyaW5nKHRoaXMubWV0YWRhdGEsIHRoaXMudG9TdHJpbmdGb3JtYXQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE1ldGFkYXRhVG9TdHJpbmcoTWV0YWRhdGEgbWV0YWRhdGEsIFN0cmluZyBmb3JtYXQpIHsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNvbmNhdE1ldGFkYXRhSW50b1N0cmluZyhtZXRhZGF0YSk7CisgICAgICAgIFN0cmluZyBvdXRwdXRTdHJpbmcgPSBmb3JtYXQ7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgICAgICAgIG91dHB1dFN0cmluZyA9IG91dHB1dFN0cmluZy5yZXBsYWNlQWxsKCJcXCQiICsga2V5LAorICAgICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmNvbGxlY3Rpb25Ub0NvbW1hRGVsaW1pdGVkU3RyaW5nKG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSkpKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dFN0cmluZzsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbmNhdE1ldGFkYXRhSW50b1N0cmluZyhNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICBMaXN0PFN0cmluZz4gb3V0cHV0U3RyaW5nID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgICAgICAgIG91dHB1dFN0cmluZy5hZGQoU3RyaW5nVXRpbHMuY29sbGVjdGlvblRvQ29tbWFEZWxpbWl0ZWRTdHJpbmcobWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSkpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuY29sbGVjdGlvblRvQ29tbWFEZWxpbWl0ZWRTdHJpbmcob3V0cHV0U3RyaW5nKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIFF1ZXJ5UmVzdWx0IG90aGVyID0gKFF1ZXJ5UmVzdWx0KSBvYmo7CisgICAgICBpZiAobWV0YWRhdGEgPT0gbnVsbCkgeworICAgICAgICBpZiAob3RoZXIubWV0YWRhdGEgIT0gbnVsbCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKCFtZXRhZGF0YS5lcXVhbHMob3RoZXIubWV0YWRhdGEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAocHJvZHVjdCA9PSBudWxsKSB7CisgICAgICAgIGlmIChvdGhlci5wcm9kdWN0ICE9IG51bGwpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmICghcHJvZHVjdC5lcXVhbHMob3RoZXIucHJvZHVjdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0b1N0cmluZ0Zvcm1hdCA9PSBudWxsKSB7CisgICAgICAgIGlmIChvdGhlci50b1N0cmluZ0Zvcm1hdCAhPSBudWxsKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoIXRvU3RyaW5nRm9ybWF0LmVxdWFscyhvdGhlci50b1N0cmluZ0Zvcm1hdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvUXVlcnlSZXN1bHRDb21wYXJhdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9RdWVyeVJlc3VsdENvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUyZDExCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvUXVlcnlSZXN1bHRDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBDb21wYXJhdG9yIHRoYXQgYWxsb3dzIGZvciBzb3J0aW5nIG9mIFF1ZXJ5UmVzdWx0cyBiYXNlZCBvbiBhIAorICogTWV0YWRhdGEgZWxlbWVudAorICogPHA+CisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeVJlc3VsdENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFF1ZXJ5UmVzdWx0PiB7CisKKyAgICBwcml2YXRlIFN0cmluZyBzb3J0QnlNZXRLZXk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvcnRCeU1ldEtleSgpIHsKKyAgICAgICAgcmV0dXJuIHNvcnRCeU1ldEtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3J0QnlNZXRLZXkoU3RyaW5nIHNvcnRCeU1ldEtleSkgeworICAgICAgICB0aGlzLnNvcnRCeU1ldEtleSA9IHNvcnRCeU1ldEtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoUXVlcnlSZXN1bHQgcXIxLCBRdWVyeVJlc3VsdCBxcjIpIHsKKyAgICAgICAgU3RyaW5nIG0xID0gcXIxLmdldE1ldGFkYXRhKCkuZ2V0TWV0YWRhdGEoc29ydEJ5TWV0S2V5KTsKKyAgICAgICAgU3RyaW5nIG0yID0gcXIyLmdldE1ldGFkYXRhKCkuZ2V0TWV0YWRhdGEoc29ydEJ5TWV0S2V5KTsKKyAgICAgICAgaWYgKG0xID09IG0yKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8vIHJldHVybiBudWxsIGxhc3QsIHNpbmNlIHRoZXkgYXJlIHRoZSBsZWFzdCBpbnRlcmVzdGluZworICAgICAgICBpZiAobTEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBpZiAobTIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIG0xLmNvbXBhcmVUbyhtMik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9jb252L0FzY2lpU29ydGFibGVWZXJzaW9uQ29udmVydGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9jb252L0FzY2lpU29ydGFibGVWZXJzaW9uQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ZGZlZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L2NvbnYvQXNjaWlTb3J0YWJsZVZlcnNpb25Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5jb252OworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBDb252ZXJ0cyBhIGFzY2lpIHNvcnRhYmxlIFN0cmluZyB2ZXJzaW9uIGludG8gYSBwcmlvcml0eSBudW1iZXIKKyAqIDxwPgorICovCitwdWJsaWMgY2xhc3MgQXNjaWlTb3J0YWJsZVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBWZXJzaW9uQ29udmVydGVyIHsKKworICAgIHB1YmxpYyBkb3VibGUgY29udmVydFRvUHJpb3JpdHkoU3RyaW5nIHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb3VibGUgcHJpb3JpdHkgPSAwOworICAgICAgICBjaGFyW10gdmVyc2lvbkNoYXJBcnJheSA9IHZlcnNpb24udG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSB2ZXJzaW9uQ2hhckFycmF5Lmxlbmd0aCAtIDE7IGkgPCB2ZXJzaW9uQ2hhckFycmF5Lmxlbmd0aDsgaSsrLCBqLS0pCisgICAgICAgICAgICBwcmlvcml0eSArPSAoKChpbnQpIHZlcnNpb25DaGFyQXJyYXlbaV0pICogTWF0aC5wb3coMTAsIGopKTsKKyAgICAgICAgcmV0dXJuIHByaW9yaXR5OworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L2NvbnYvVmVyc2lvbkNvbnZlcnRlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvY29udi9WZXJzaW9uQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjYjI1MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L2NvbnYvVmVyc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmNvbnY7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEFuIGludGVyZmFjZSBmb3IgY29udmVydGluZyBhIFN0cmluZyB2ZXJzaW9uIGludG8gYSBwcmlvcml0eSBudW1iZXIKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFZlcnNpb25Db252ZXJ0ZXIgeworCisgICAgcHVibGljIGRvdWJsZSBjb252ZXJ0VG9Qcmlvcml0eShTdHJpbmcgdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L2ZpbHRlci9GaWx0ZXJBbGdvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvZmlsdGVyL0ZpbHRlckFsZ29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmZmFkYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L2ZpbHRlci9GaWx0ZXJBbGdvci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBbiBhbGdvcml0aG0gaW50ZXJmYWNlIGZvciBkZWZpbmluZyBob3cgUXVlcnlGaWx0ZXIgZmlsdGVycyBxdWVyeSByZXN1bHRzCisgKiA8cD4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlckFsZ29yIHsKKworICAgIHByb3RlY3RlZCBsb25nIGVwc2lsb247CisgICAgCisgICAgcHVibGljIEZpbHRlckFsZ29yKCkgeworICAgICAgICB0aGlzLmVwc2lsb24gPSAwOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRFcHNpbG9uKGxvbmcgZXBzaWxvbikgeworICAgICAgICB0aGlzLmVwc2lsb24gPSBlcHNpbG9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgbG9uZyBnZXRFcHNpbG9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lcHNpbG9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxUaW1lRXZlbnQ+IGZpbHRlckV2ZW50cyhMaXN0PFRpbWVFdmVudD4gZXZlbnRzKTsgCisgICAgCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9maWx0ZXIvT2JqZWN0VGltZUV2ZW50LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9maWx0ZXIvT2JqZWN0VGltZUV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxNjgwNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L2ZpbHRlci9PYmplY3RUaW1lRXZlbnQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5maWx0ZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5BIHtAbGluayBUaW1lRXZlbnR9IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIge0BsaW5rIE9iamVjdH08L3A+LgorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0VGltZUV2ZW50PG9ialR5cGU+IGV4dGVuZHMgVGltZUV2ZW50IHsKKworICAgIHByaXZhdGUgb2JqVHlwZSB0aW1lT2JqOworCisgICAgcHVibGljIE9iamVjdFRpbWVFdmVudChsb25nIHN0YXJ0VGltZSwgbG9uZyBlbmRUaW1lLCBvYmpUeXBlIHRpbWVPYmopIHsKKyAgICAgICAgc3VwZXIoc3RhcnRUaW1lLCBlbmRUaW1lKTsKKyAgICAgICAgdGhpcy50aW1lT2JqID0gdGltZU9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0VGltZUV2ZW50KGxvbmcgc3RhcnRUaW1lLCBsb25nIGVuZFRpbWUsIGRvdWJsZSBwcmlvcml0eSwKKyAgICAgICAgICAgIG9ialR5cGUgdGltZU9iaikgeworICAgICAgICBzdXBlcihzdGFydFRpbWUsIGVuZFRpbWUsIHByaW9yaXR5KTsKKyAgICAgICAgdGhpcy50aW1lT2JqID0gdGltZU9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgb2JqVHlwZSBnZXRUaW1lT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gdGhpcy50aW1lT2JqOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RUaW1lRXZlbnQpIHsKKyAgICAgICAgICAgIE9iamVjdFRpbWVFdmVudDw/PiBvdGUgPSAoT2JqZWN0VGltZUV2ZW50PD8+KSBvYmo7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgJiYgdGhpcy50aW1lT2JqLmVxdWFscyhvdGUudGltZU9iaik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAtICIgKyB0aW1lT2JqOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvZmlsdGVyL1RpbWVFdmVudC5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvZmlsdGVyL1RpbWVFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzBhOTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9maWx0ZXIvVGltZUV2ZW50LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuZmlsdGVyOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIGJhc2lzIGZvciB0aW1lLWJhc2VkIHF1ZXJpZXMgcmVzdWx0cyBvdmVyIGEgc3RhcnQvZW5kIGRhdGV0aW1lIHdpdGgKKyAqIGEgZHVyYXRpb24KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lRXZlbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlPFRpbWVFdmVudD4geworCisgICAgcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lLCBlbmRUaW1lLCBkdXI7CisKKyAgICBwcm90ZWN0ZWQgZG91YmxlIHByaW9yaXR5OworCisgICAgcHVibGljIFRpbWVFdmVudChsb25nIHN0YXJ0VGltZSwgbG9uZyBlbmRUaW1lKSB7CisgICAgICAgIHRoaXMoc3RhcnRUaW1lLCBlbmRUaW1lLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZUV2ZW50KGxvbmcgc3RhcnRUaW1lLCBsb25nIGVuZFRpbWUsIGRvdWJsZSBwcmlvcml0eSkgeworICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKKyAgICAgICAgdGhpcy5lbmRUaW1lID0gZW5kVGltZTsKKyAgICAgICAgdGhpcy5kdXIgPSB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKKyAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW9yaXR5KGRvdWJsZSBwcmlvcml0eSkgeworICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRQcmlvcml0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJpb3JpdHk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdGFydFRpbWU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RW5kVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW5kVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZHVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUaW1lRXZlbnQpIHsKKyAgICAgICAgICAgIFRpbWVFdmVudCB0ZSA9IChUaW1lRXZlbnQpIG9iajsKKyAgICAgICAgICAgIHJldHVybiB0ZS5zdGFydFRpbWUgPT0gdGhpcy5zdGFydFRpbWUgJiYgdGUuZW5kVGltZSA9PSB0aGlzLmVuZFRpbWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiWyIgKyB0aGlzLnN0YXJ0VGltZSArICIsIiArIHRoaXMuZW5kVGltZSArICJdIC0gIgorICAgICAgICAgICAgICAgICsgdGhpcy5wcmlvcml0eTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhcHBlbkF0U2FtZVRpbWUoVGltZUV2ZW50IHRlMSwgVGltZUV2ZW50IHRlMikgeworICAgICAgICByZXR1cm4gdGUxLmdldFN0YXJ0VGltZSgpID09IHRlMi5nZXRTdGFydFRpbWUoKSAmJiB0ZTEuZ2V0RW5kVGltZSgpID09IHRlMi5nZXRFbmRUaW1lKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVG8oVGltZUV2ZW50IHRlKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9uZyh0aGlzLnN0YXJ0VGltZSkuY29tcGFyZVRvKHRlLnN0YXJ0VGltZSk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvdHlwZS9UeXBlSGFuZGxlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvdHlwZS9UeXBlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZjYyMjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy90eXBlL1R5cGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnR5cGU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Cb29sZWFuUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJhbmdlUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBBIE1ldGFkYXRhIG1vZGlmaWNhdGlvbiBjbGFzcyB0aGF0IGludGVyY2VwdHMgYWxsIE1ldGFkYXRhIGZsb3dpbmcgaW4gYW5kIG91dAorICogb2YgdGhlIENhdGFsb2cuICBBbGxvd3MgdGhlIENhdGFsb2cgdG8gY29udGFpbiBhZGRpdGlvbmFsIE1ldGFkYXRhIG9yIG1vZGlmaWVkCisgKiBNZXRhZGF0YSB3aGlsZSBrZWVwaW5nIGl0IGludmlzaWJsZSB0byB0aGUgdXNlci4gIFRoZSBwdXJwb3NlIGl0IHRvIGNyZWF0ZSAKKyAqIFN0cmluZyBxdWVyaWFibGUgTWV0YWRhdGEgc28gdGhhdCB0aGUgQ2F0YWxvZyBjYW4gYmUgcXVlcmllcyBhY2N1cmF0ZWx5IGFuZAorICogd2l0aG91dCBleHRyYSBrbm93bGVkZ2UgcmVxdWlyZWQgb24gdGhlIHVzZXIgZW5kLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUhhbmRsZXIgeworICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudE5hbWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBFbGVtZW50IG5hbWUgdGhhdCB0aGlzIFR5cGVIYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZworICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSBUaGUgRWxlbWVudCBuYW1lIGZvciB0aGlzIFR5cGVIYW5kbGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBFbGVtZW50IG5hbWUgdGhhdCB0aGlzIFR5cGVIYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZworICAgICAqIEByZXR1cm4gVGhlIEVsZW1lbnQgbmFtZSBmb3IgdGhpcyBUeXBlSGFuZGxlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnROYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIFR5cGVIYW5kbGVyJ3MgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gUXVlcnkgaW50byBhIFF1ZXJ5CisgICAgICogd2l0aCB0aGUgbmVjZXNzYXJ5IGVsZW1lbnRzIGFuZCB2YWx1ZXMgc28gdGhlIENhdGFsb2cgY2FuIGJlIHF1ZXJpZWQuCisgICAgICogICAgCisgICAgICogICAgTk9URTogT3JpZ2luYWwgUXVlcnkgaXMgbW9kaWZpZWQgLiAuIC4gdGhlIGFyZ3VtZW50IHF1ZXJ5IGJlY29tZXMKKyAgICAgKiAgICBlcXVhbCB0byB0aGUgcmV0dXJuZWQgcXVlcnkgKHJldHVybiBvZiBxdWVyeSBpcyBhIGNvbnZlbmllbmNlKS4KKyAgICAgKiAgICAKKyAgICAgKiBAcGFyYW0gcXVlcnkgUXVlcnkgZm9yIHdoaWNoIHRoZSBDYXRhbG9nIFF1ZXJ5IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIEEgUXVlcnkgd2l0aCBDYXRhbG9nIGVsZW1lbnQgdmFsdWVzCisgICAgICogQHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIAorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiAKKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnkgcHJlUXVlcnlIYW5kbGUoUXVlcnkgcXVlcnkpIHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgTGlua2VkTGlzdDxRdWVyeUNyaXRlcmlhPiBxY0xpc3QgPSBuZXcgTGlua2VkTGlzdDxRdWVyeUNyaXRlcmlhPigpOworICAgICAgICBmb3IgKFF1ZXJ5Q3JpdGVyaWEgcWMgOiBxdWVyeS5nZXRDcml0ZXJpYSgpKQorICAgICAgICAgICAgcWNMaXN0LmFkZCh0aGlzLmhhbmRsZVF1ZXJ5Q3JpdGVyaWEocWMpKTsKKyAgICAgICAgcXVlcnkuc2V0Q3JpdGVyaWEocWNMaXN0KTsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFF1ZXJ5Q3JpdGVyaWEgaGFuZGxlUXVlcnlDcml0ZXJpYShRdWVyeUNyaXRlcmlhIHFjKSB0aHJvd3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChxYyBpbnN0YW5jZW9mIEJvb2xlYW5RdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICBMaW5rZWRMaXN0PFF1ZXJ5Q3JpdGVyaWE+IHFjTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFF1ZXJ5Q3JpdGVyaWE+KCk7CisgICAgICAgICAgICBmb3IgKFF1ZXJ5Q3JpdGVyaWEgY3JpdGVyaWEgOiAoKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBxYykuZ2V0VGVybXMoKSkgCisgICAgICAgICAgICAgICAgcWNMaXN0LmFkZCh0aGlzLmhhbmRsZVF1ZXJ5Q3JpdGVyaWEoY3JpdGVyaWEpKTsKKyAgICAgICAgICAgIEJvb2xlYW5RdWVyeUNyaXRlcmlhIGJxYyA9IG5ldyBCb29sZWFuUXVlcnlDcml0ZXJpYSgpOworICAgICAgICAgICAgYnFjLnNldE9wZXJhdG9yKCgoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpIHFjKS5nZXRPcGVyYXRvcigpKTsKKyAgICAgICAgICAgIGJxYy5zZXRFbGVtZW50TmFtZShxYy5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgICAgICAgIGZvciAoUXVlcnlDcml0ZXJpYSBjcml0ZXJpYSA6IHFjTGlzdCkKKyAgICAgICAgICAgICAgICBicWMuYWRkVGVybShjcml0ZXJpYSk7CisgICAgICAgICAgICByZXR1cm4gYnFjOworICAgICAgICB9ZWxzZSBpZiAocWMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpICYmIHFjIGluc3RhbmNlb2YgVGVybVF1ZXJ5Q3JpdGVyaWEpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVRlcm1RdWVyeUNyaXRlcmlhKChUZXJtUXVlcnlDcml0ZXJpYSkgcWMpOworICAgICAgICB9ZWxzZSBpZiAocWMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpICYmIHFjIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSYW5nZVF1ZXJ5Q3JpdGVyaWEoKFJhbmdlUXVlcnlDcml0ZXJpYSkgcWMpOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcWM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFuZGxlcyBjb252ZXJ0aW5nIGFueSBDYXRhbG9nIG1ldGFkYXRhIGVsZW1lbnQgdmFsdWVzIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gIAorICAgICAqIE1ldGFkYXRhIGVsZW1lbnRzIGNhbiBiZSBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlcGxhY2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgQ2F0YWxvZyBNZXRhZGF0YQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHBvc3RHZXRNZXRhZGF0YUhhbmRsZShNZXRhZGF0YSBtZXRhZGF0YSk7CisgICAgCisgICAgLyoqCisgICAgICogSGFuZGxlcyBjb252ZXJ0aW5nIGFueSBtZXRhZGF0YSBlbGVtZW50IHRvIENhdGFsb2cgZWxlbWVudCB2YWx1ZXMuICAKKyAgICAgKiBNZXRhZGF0YSBlbGVtZW50cyBjYW4gYmUgYWRkZWQsIG1vZGlmaWVkLCBvciByZXBsYWNlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIE9yaWdpbmFsIE1ldGFkYXRhCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJlQWRkTWV0YWRhdGFIYW5kbGUoTWV0YWRhdGEgbWV0YWRhdGEpOworICAgIAorICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBSYW5nZVF1ZXJ5Q3JpdGVyaWEgaW50byBhIFF1ZXJ5Q3JpdGVyaWEgd2l0aCB0aGUgbmVjZXNzYXJ5CisgICAgICogQ2F0YWxvZyBlbGVtZW50cyBhbmQgdmFsdWVzIHRvIHBlcmZvcm0gdGhlIHF1ZXJ5CisgICAgICogCisgICAgICogCisgICAgICogQHBhcmFtIHFjCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBRdWVyeUNyaXRlcmlhIGhhbmRsZVJhbmdlUXVlcnlDcml0ZXJpYShSYW5nZVF1ZXJ5Q3JpdGVyaWEgcWMpOworICAgIAorICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBUZXJtUXVlcnlDcml0ZXJpYSBpbnRvIGEgUXVlcnlDcml0ZXJpYSB3aXRoIHRoZSBuZWNlc3NhcnkKKyAgICAgKiBDYXRhbG9nIGVsZW1lbnRzIGFuZCB2YWx1ZXMgdG8gcGVyZm9ybSB0aGUgcXVlcnkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcWMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFF1ZXJ5Q3JpdGVyaWEgaGFuZGxlVGVybVF1ZXJ5Q3JpdGVyaWEoVGVybVF1ZXJ5Q3JpdGVyaWEgcWMpOworCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy90eXBlL1ZhbHVlUmVwbGFjZVR5cGVIYW5kbGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy90eXBlL1ZhbHVlUmVwbGFjZVR5cGVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ZmFiZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3R5cGUvVmFsdWVSZXBsYWNlVHlwZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMudHlwZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJhbmdlUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEEgU3Vic2V0LVR5cGVIYW5kbGVyIHdoaWNoIG9ubHkgYWxsb3dzIGZvciBtZXRhZGF0YSB2YWx1ZSBtb2RpZmljYXRpb24uCisgKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHJlcGxhY2UgdGhlIG1ldGFkYXRhIHZhbHVlcyBmb3IgCisgKiB0aGUgbWV0YWRhdGEgZWxlbWVudCB3aGljaCBpdCBpcyByZXNwb25zaWJsZSBmb3IuICBBbGwgdGhlIGRldmVsb3BlcgorICogbmVlZHMgdG8gc3VwcGx5IGlzIHRoZSBjb252ZXJ0aW9uIG1ldGhvZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCB2YWx1ZQorICogYW5kIHRoZSBDYXRhbG9nIHZhbHVlCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZVJlcGxhY2VUeXBlSGFuZGxlciBleHRlbmRzIFR5cGVIYW5kbGVyIHsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3N0R2V0TWV0YWRhdGFIYW5kbGUoTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKG1ldGFkYXRhLmNvbnRhaW5zS2V5KGVsZW1lbnROYW1lKSkgeworICAgICAgICAgICAgbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGVsZW1lbnROYW1lLCAKKyAgICAgICAgICAgICAgICB0aGlzLmdldE9yaWdWYWx1ZShtZXRhZGF0YS5nZXRNZXRhZGF0YShlbGVtZW50TmFtZSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVBZGRNZXRhZGF0YUhhbmRsZShNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICBpZiAobWV0YWRhdGEuY29udGFpbnNLZXkoZWxlbWVudE5hbWUpKSB7CisgICAgICAgICAgICBtZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoZWxlbWVudE5hbWUsIAorICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2F0YWxvZ1ZhbHVlKG1ldGFkYXRhLmdldE1ldGFkYXRhKGVsZW1lbnROYW1lKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBRdWVyeUNyaXRlcmlhIGhhbmRsZVJhbmdlUXVlcnlDcml0ZXJpYShSYW5nZVF1ZXJ5Q3JpdGVyaWEgcnFjKSB7CisgICAgICAgIGlmIChycWMuZ2V0RW5kVmFsdWUoKSAhPSBudWxsKQorICAgICAgICAgICAgcnFjLnNldEVuZFZhbHVlKHRoaXMuZ2V0Q2F0YWxvZ1ZhbHVlKHJxYy5nZXRFbmRWYWx1ZSgpKSk7CisgICAgICAgIGlmIChycWMuZ2V0U3RhcnRWYWx1ZSgpICE9IG51bGwpCisgICAgICAgICAgICBycWMuc2V0U3RhcnRWYWx1ZSh0aGlzLmdldENhdGFsb2dWYWx1ZShycWMuZ2V0U3RhcnRWYWx1ZSgpKSk7CisgICAgICAgIHJldHVybiBycWM7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBRdWVyeUNyaXRlcmlhIGhhbmRsZVRlcm1RdWVyeUNyaXRlcmlhKFRlcm1RdWVyeUNyaXRlcmlhIHRxYykgeworICAgICAgICBpZiAodHFjLmdldFZhbHVlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRxYy5zZXRWYWx1ZSh0aGlzLmdldENhdGFsb2dWYWx1ZSh0cWMuZ2V0VmFsdWUoKSkpOworICAgICAgICByZXR1cm4gdHFjOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgbWV0YWRhdGEgZWxlbWVudCwgZm9yIHRoaXMgVHlwZUhhbmRsZXIsIHZhbHVlIHRvIHRoZSAKKyAgICAgKiBDYXRhbG9nIHZhbHVlCisgICAgICogQHBhcmFtIG9yaWdWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBlbGVtZW50IHdoaWNoIHRoaXMgVHlwZUhhbmRsZXIKKyAgICAgKiAgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogQHJldHVybiBUaGUgQ2F0YWxvZyB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2F0YWxvZ1ZhbHVlKFN0cmluZyBvcmlnVmFsdWUpOworICAgIAorICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBtZXRhZGF0YSBlbGVtZW50LCBmb3IgdGhpcyBUeXBlSGFuZGxlciwgdmFsdWUgZnJvbSB0aGUgCisgICAgICogQ2F0YWxvZyB2YWx1ZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUKKyAgICAgKiBAcGFyYW0gb3JpZ1ZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBUeXBlSGFuZGxlcgorICAgICAqICBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBAcmV0dXJuIFRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0T3JpZ1ZhbHVlKFN0cmluZyBkYXRhYmFzZVZhbHVlKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvdHlwZS9leGFtcGxlcy9NYWpvck1pbm9yVmVyc2lvblR5cGVIYW5kbGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy90eXBlL2V4YW1wbGVzL01ham9yTWlub3JWZXJzaW9uVHlwZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDAzNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvdHlwZS9leGFtcGxlcy9NYWpvck1pbm9yVmVyc2lvblR5cGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMudHlwZS5leGFtcGxlczsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnR5cGUuVmFsdWVSZXBsYWNlVHlwZUhhbmRsZXI7CisKKy8qKgorICogSGFuZGxlciBtZXRhZGF0YSBlbGVtZW50IHZhbHVlcyB3aG9zZSBvcmlnaW5hbCBmb3JtYXQgaXM6IFxkezEsMn0uXGR7MCwyfQorICogCisgKiBSZXR1cm4gQ2F0YWxvZyB2YWx1ZSBmb3JtYXQ6ICBcZFxkLlxkXGQKKyAqIFJldHVybiBvcmlnaW5hbCB2YWx1ZSBmb3JtYXQ6IFxkezEsMn0uXGR7MSwyfQorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTWFqb3JNaW5vclZlcnNpb25UeXBlSGFuZGxlciBleHRlbmRzIFZhbHVlUmVwbGFjZVR5cGVIYW5kbGVyIHsKKworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZ1ZhbHVlKFN0cmluZyBvcmlnVmFsdWUpIHsKKyAgICAgICAgU3RyaW5nW10gb3JpZ1ZhbHVlU3BsaXQgPSBvcmlnVmFsdWUuc3BsaXQoIlxcLiIpOworICAgICAgICBTdHJpbmcgbWFqb3JWZXJzaW9uID0gb3JpZ1ZhbHVlU3BsaXRbMF07CisgICAgICAgIFN0cmluZyBtaW5vclZlcnNpb24gPSBvcmlnVmFsdWVTcGxpdFsxXTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmxlZnRQYWQobWFqb3JWZXJzaW9uLCAyLCAiMCIpICsgIi4iIAorICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5yaWdodFBhZChtaW5vclZlcnNpb24sIDIsICIwIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcmlnVmFsdWUoU3RyaW5nIGRhdGFiYXNlVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIERvdWJsZS50b1N0cmluZyhEb3VibGUucGFyc2VEb3VibGUoZGF0YWJhc2VWYWx1ZSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N5c3RlbS9YbWxScGNGaWxlTWFuYWdlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N5c3RlbS9YbWxScGNGaWxlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMzg1NDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL1htbFJwY0ZpbGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMzY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuV2ViU2VydmVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuUHJvZHVjdE1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW1nck1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkV4dHJhY3RvclNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRmlsZVRyYW5zZmVyU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkRhdGFUcmFuc2ZlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZhbGlkYXRpb25MYXllckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuQ29tcGxleFF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LlF1ZXJ5RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LlF1ZXJ5UmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LlF1ZXJ5UmVzdWx0Q29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5maWx0ZXIuT2JqZWN0VGltZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5UaW1lRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMudHlwZS5UeXBlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5HZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlhtbFJwY1N0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuVmVyc2lvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLlZlcnNpb25pbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLlRyYW5zZmVyU3RhdHVzVHJhY2tlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKworCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBYTUwgUlBDLWJhc2VkIEZpbGUgbWFuYWdlci4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgWG1sUnBjRmlsZU1hbmFnZXIgeworCisgICAgLyogdGhlIHBvcnQgdG8gcnVuIHRoZSBYTUwgUlBDIHdlYiBzZXJ2ZXIgb24sIGRlZmF1bHQgaXMgMTk5OSAqLworICAgIHByaXZhdGUgaW50IHdlYlNlcnZlclBvcnQgPSAxOTk5OworCisgICAgLyogb3VyIENhdGFsb2cgKi8KKyAgICBwcml2YXRlIENhdGFsb2cgY2F0YWxvZyA9IG51bGw7CisKKyAgICAvKiBvdXIgUmVwb3NpdG9yeU1hbmFnZXIgKi8KKyAgICBwcml2YXRlIFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9zaXRvcnlNYW5hZ2VyID0gbnVsbDsKKworICAgIC8qIG91ciBEYXRhVHJhbnNmZXIgKi8KKyAgICBwcml2YXRlIERhdGFUcmFuc2ZlciBkYXRhVHJhbnNmZXIgPSBudWxsOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihYbWxScGNGaWxlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyogb3VyIHhtbCBycGMgd2ViIHNlcnZlciAqLworICAgIHByaXZhdGUgV2ViU2VydmVyIHdlYlNlcnZlciA9IG51bGw7CisKKyAgICAvKiBvdXIgZGF0YSB0cmFuc2ZlciBzdGF0dXMgdHJhY2tlciAqLworICAgIHByaXZhdGUgVHJhbnNmZXJTdGF0dXNUcmFja2VyIHRyYW5zZmVyU3RhdHVzVHJhY2tlciA9IG51bGw7CisgICAgCisgICAgLyogd2hldGhlciBvciBub3QgdG8gZXhwYW5kIGEgcHJvZHVjdCBpbnN0YW5jZSBpbnRvIG1ldCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBleHBhbmRQcm9kdWN0TWV0OworICAgIAorICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENyZWF0ZXMgYSBuZXcgWG1sUnBjRmlsZU1hbmFnZXIgd2l0aCB0aGUgZ2l2ZW4gbWV0YWRhdGEgc3RvcmUgZmFjdG9yeSwKKyAgICAgKiBhbmQgdGhlIGdpdmVuIGRhdGEgc3RvcmUgZmFjdG9yeSwgb24gdGhlIGdpdmVuIHBvcnQuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICAgICAgICBUaGUgd2ViIHNlcnZlciBwb3J0IHRvIHJ1biB0aGUgWE1MIFJwYyBzZXJ2ZXIgb24sIGRlZmF1bHRzIHRvCisgICAgICogICAgICAgICAgICAxOTk5LgorICAgICAqLworICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlcihpbnQgcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlYlNlcnZlclBvcnQgPSBwb3J0OworCisgICAgICAgIC8vIHN0YXJ0IHVwIHRoZSB3ZWIgc2VydmVyCisgICAgICAgIHdlYlNlcnZlciA9IG5ldyBXZWJTZXJ2ZXIod2ViU2VydmVyUG9ydCk7CisgICAgICAgIHdlYlNlcnZlci5hZGRIYW5kbGVyKCJmaWxlbWdyIiwgdGhpcyk7CisgICAgICAgIHdlYlNlcnZlci5zdGFydCgpOworCisgICAgICAgIHRoaXMubG9hZENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRmlsZSBNYW5hZ2VyIHN0YXJ0ZWQgYnkgIgorICAgICAgICAgICAgICAgICsgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiLCAidW5rbm93biIpKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKENhdGFsb2cgY2F0YWxvZykgeworICAgICAgICB0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWxpdmUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZWZyZXNoQ29uZmlnQW5kUG9saWN5KCkgeworICAgICAgYm9vbGVhbiBzdGF0dXMgPSBmYWxzZTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5sb2FkQ29uZmlndXJhdGlvbigpOworICAgICAgICBzdGF0dXMgPSB0cnVlOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgTE9HCisgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJlZnJlc2ggY29uZmlndXJhdGlvbiBmb3IgZmlsZSBtYW5hZ2VyICIgKworICAgICAgICAgICAgICAgICJzZXJ2ZXI6IHNlcnZlciBtYXkgYmUgaW4gaW5vcGVyYWJsZSBzdGF0ZTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgCisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRyYW5zZmVycmluZ1Byb2R1Y3QoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCkgeworICAgICAgICBQcm9kdWN0IHAgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKHByb2R1Y3RIYXNoKTsKKyAgICAgICAgdHJhbnNmZXJTdGF0dXNUcmFja2VyLnRyYW5zZmVycmluZ1Byb2R1Y3QocCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldEN1cnJlbnRGaWxlVHJhbnNmZXIoKSB7CisgICAgICAgIEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXMgPSB0cmFuc2ZlclN0YXR1c1RyYWNrZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcigpOworICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY0ZpbGVUcmFuc2ZlclN0YXR1cyhzdGF0dXMpOworICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcnMoKSB7CisgICAgICAgIExpc3Q8RmlsZVRyYW5zZmVyU3RhdHVzPiBjdXJyZW50VHJhbnNmZXJzID0gdHJhbnNmZXJTdGF0dXNUcmFja2VyLmdldEN1cnJlbnRGaWxlVHJhbnNmZXJzKCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnRUcmFuc2ZlcnMgIT0gbnVsbCAmJiBjdXJyZW50VHJhbnNmZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRYbWxScGNGaWxlVHJhbnNmZXJTdGF0dXNlcyhjdXJyZW50VHJhbnNmZXJzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PigpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2gpIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisgICAgICAgIGRvdWJsZSBwY3QgPSB0cmFuc2ZlclN0YXR1c1RyYWNrZXIuZ2V0UGN0VHJhbnNmZXJyZWQocHJvZHVjdCk7CisgICAgICAgIHJldHVybiBwY3Q7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRSZWZQY3RUcmFuc2ZlcnJlZChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHJlZkhhc2gpIHsKKyAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0UmVmZXJlbmNlRnJvbVhtbFJwYyhyZWZIYXNoKTsKKyAgICAgICAgZG91YmxlIHBjdCA9IDAuMDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGN0ID0gdHJhbnNmZXJTdGF0dXNUcmFja2VyLmdldFBjdFRyYW5zZmVycmVkKHJlZmVyZW5jZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgdHJhbnNmZXIgcGVyY2VudGFnZSBmb3IgcmVmOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVmZXJlbmNlLmdldE9yaWdSZWZlcmVuY2UoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVQcm9kdWN0VHJhbnNmZXJTdGF0dXMoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCkgeworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKHByb2R1Y3RIYXNoKTsKKyAgICAgICAgdHJhbnNmZXJTdGF0dXNUcmFja2VyLnJlbW92ZVByb2R1Y3RUcmFuc2ZlclN0YXR1cyhwcm9kdWN0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2ZlckNvbXBsZXRlKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2gpIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisgICAgICAgIHJldHVybiB0cmFuc2ZlclN0YXR1c1RyYWNrZXIuaXNUcmFuc2ZlckNvbXBsZXRlKHByb2R1Y3QpOworICAgIH0KKworICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHBhZ2VkUXVlcnkoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHF1ZXJ5SGFzaCwKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoLAorICAgICAgICAgICAgaW50IHBhZ2VOdW0pIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVGcm9tWG1sUnBjKHByb2R1Y3RUeXBlSGFzaCk7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRRdWVyeUZyb21YbWxScGMocXVlcnlIYXNoKTsKKworICAgICAgICBQcm9kdWN0UGFnZSBwcm9kUGFnZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2RQYWdlID0gY2F0YWxvZy5wYWdlZFF1ZXJ5KHRoaXMuZ2V0Q2F0YWxvZ1F1ZXJ5KHF1ZXJ5LCB0eXBlKSwgdHlwZSwgcGFnZU51bSk7CisKKyAgICAgICAgICAgIGlmIChwcm9kUGFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvZFBhZ2UgPSBQcm9kdWN0UGFnZS5ibGFua1BhZ2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgaGVyZSB0aGF0IHRoZSB1bmRlcmx5aW5nIGNhdGFsb2cgZGlkIG5vdAorICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgUHJvZHVjdFR5cGUKKyAgICAgICAgICAgICAgICAvLyB0byBvYmV5IHRoZSBjb250cmFjdCBvZiB0aGUgRmlsZSBNYW5hZ2VyLCB3ZSBuZWVkIHRvIG1ha2UKKyAgICAgICAgICAgICAgICAvLyBzdXJlIGl0cyBzZXQgaGVyZQorICAgICAgICAgICAgICAgIHNldFByb2R1Y3RUeXBlKHByb2RQYWdlLmdldFBhZ2VQcm9kdWN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJDYXRhbG9nIGV4Y2VwdGlvbiBwZXJmb3JtaW5nIHBhZ2VkIHF1ZXJ5IGZvciBwcm9kdWN0IHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSArICJdIHF1ZXJ5OiBbIiArIHF1ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RQYWdlKHByb2RQYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRGaXJzdFBhZ2UoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RUeXBlSGFzaCkgeworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgUHJvZHVjdFBhZ2UgcGFnZSA9IGNhdGFsb2cuZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0UHJvZHVjdFR5cGUocGFnZS5nZXRQYWdlUHJvZHVjdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHByb2R1Y3QgdHlwZXMgZm9yIHByb2R1Y3QgcGFnZSBsaXN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFBhZ2UocGFnZSk7CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0TGFzdFBhZ2UoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RUeXBlSGFzaCkgeworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgUHJvZHVjdFBhZ2UgcGFnZSA9IGNhdGFsb2cuZ2V0TGFzdFByb2R1Y3RQYWdlKHR5cGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0UHJvZHVjdFR5cGUocGFnZS5nZXRQYWdlUHJvZHVjdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHByb2R1Y3QgdHlwZXMgZm9yIHByb2R1Y3QgcGFnZSBsaXN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFBhZ2UocGFnZSk7CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0TmV4dFBhZ2UoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RUeXBlSGFzaCwKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gY3VycmVudFBhZ2VIYXNoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwcm9kdWN0VHlwZUhhc2gpOworICAgICAgICBQcm9kdWN0UGFnZSBjdXJyUGFnZSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFBhZ2VGcm9tWG1sUnBjKGN1cnJlbnRQYWdlSGFzaCk7CisgICAgICAgIFByb2R1Y3RQYWdlIHBhZ2UgPSBjYXRhbG9nLmdldE5leHRQYWdlKHR5cGUsIGN1cnJQYWdlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldFByb2R1Y3RUeXBlKHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCBwcm9kdWN0IHR5cGVzIGZvciBwcm9kdWN0IHBhZ2UgbGlzdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2UgKyAiXSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RQYWdlKHBhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldFByZXZQYWdlKAorICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0VHlwZUhhc2gsCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGN1cnJlbnRQYWdlSGFzaCkgeworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgUHJvZHVjdFBhZ2UgY3VyclBhZ2UgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RQYWdlRnJvbVhtbFJwYyhjdXJyZW50UGFnZUhhc2gpOworICAgICAgICBQcm9kdWN0UGFnZSBwYWdlID0gY2F0YWxvZy5nZXRQcmV2UGFnZSh0eXBlLCBjdXJyUGFnZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRQcm9kdWN0VHlwZShwYWdlLmdldFBhZ2VQcm9kdWN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgcHJvZHVjdCB0eXBlcyBmb3IgcHJvZHVjdCBwYWdlIGxpc3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlICsgIl0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0UGFnZShwYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGFkZFByb2R1Y3RUeXBlKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwcm9kdWN0VHlwZUhhc2gpOworICAgICAgICByZXBvc2l0b3J5TWFuYWdlci5hZGRQcm9kdWN0VHlwZShwcm9kdWN0VHlwZSk7CisgICAgICAgIHJldHVybiBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKAorICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisgICAgICAgIGNhdGFsb2cuc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKHByb2R1Y3QpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bVByb2R1Y3RzKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBpbnQgbnVtUHJvZHVjdHMgPSAtMTsKKworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbnVtUHJvZHVjdHMgPSBjYXRhbG9nLmdldE51bVByb2R1Y3RzKHR5cGUpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hlbiBnZXR0aW5nIG51bSBwcm9kdWN0czogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bVByb2R1Y3RzOworICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0VG9wTlByb2R1Y3RzKGludCBuKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBMaXN0PFByb2R1Y3Q+IHRvcE5Qcm9kdWN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRvcE5Qcm9kdWN0cyA9IGNhdGFsb2cuZ2V0VG9wTlByb2R1Y3RzKG4pOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdExpc3QodG9wTlByb2R1Y3RzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hlbiBnZXR0aW5nIHRvcE4gcHJvZHVjdHM6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0VG9wTlByb2R1Y3RzKGludCBuLAorICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0VHlwZUhhc2gpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwcm9kdWN0VHlwZUhhc2gpOworICAgICAgICBMaXN0PFByb2R1Y3Q+IHRvcE5Qcm9kdWN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRvcE5Qcm9kdWN0cyA9IGNhdGFsb2cuZ2V0VG9wTlByb2R1Y3RzKG4sIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdExpc3QodG9wTlByb2R1Y3RzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hlbiBnZXR0aW5nIHRvcE4gcHJvZHVjdHMgYnkgcHJvZHVjdCB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9kdWN0KFN0cmluZyBwcm9kdWN0TmFtZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0IHAgPSBjYXRhbG9nLmdldFByb2R1Y3RCeU5hbWUocHJvZHVjdE5hbWUpOworICAgICAgICByZXR1cm4gcCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgcC5nZXRUcmFuc2ZlclN0YXR1cygpLmVxdWFscyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCk7CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0TWV0YWRhdGEoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdEZyb21YbWxScGMocHJvZHVjdEhhc2gpOworICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YShwcm9kdWN0KS5nZXRIYXNodGFibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRSZWR1Y2VkTWV0YWRhdGEoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoLCBWZWN0b3I8U3RyaW5nPiBlbGVtZW50cykKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisgICAgICAgIHJldHVybiB0aGlzLmdldFJlZHVjZWRNZXRhZGF0YShwcm9kdWN0LCBlbGVtZW50cykuZ2V0SGFzaHRhYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBnZXRQcm9kdWN0VHlwZXMoKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxQcm9kdWN0VHlwZT4gcHJvZHVjdFR5cGVMaXN0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGVMaXN0ID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVzKCk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdFR5cGVMaXN0KHByb2R1Y3RUeXBlTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCB0eXBlcyBmcm9tIHJlcG9zaXRvcnkgbWFuYWdlcjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlTGlzdCA9IG51bGw7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdEZyb21YbWxScGMocHJvZHVjdEhhc2gpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWZlcmVuY2VMaXN0ID0gY2F0YWxvZy5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1JlZmVyZW5jZXMocmVmZXJlbmNlTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiVW5hYmxlIHRvIG9idGFpbiByZWZlcmVuY2VzIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRQcm9kdWN0QnlJZChTdHJpbmcgcHJvZHVjdElkKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0ID0gY2F0YWxvZy5nZXRQcm9kdWN0QnlJZChwcm9kdWN0SWQpOworICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgaGVyZSB0aGF0IHRoZSB1bmRlcmx5aW5nIGNhdGFsb2cgZGlkIG5vdAorICAgICAgICAgICAgLy8gc2V0IHRoZSBQcm9kdWN0VHlwZQorICAgICAgICAgICAgLy8gdG8gb2JleSB0aGUgY29udHJhY3Qgb2YgdGhlIEZpbGUgTWFuYWdlciwgd2UgbmVlZCB0byBtYWtlCisgICAgICAgICAgICAvLyBzdXJlIGl0cyBzZXQgaGVyZQorICAgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0VHlwZSh0aGlzLnJlcG9zaXRvcnlNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgYnkgaWQ6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdElkICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCB0eXBlIGJ5IGlkOiBbIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRQcm9kdWN0VHlwZUlkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3QgPSBjYXRhbG9nLmdldFByb2R1Y3RCeU5hbWUocHJvZHVjdE5hbWUpOworICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgaGVyZSB0aGF0IHRoZSB1bmRlcmx5aW5nIGNhdGFsb2cgZGlkIG5vdAorICAgICAgICAgICAgLy8gc2V0IHRoZSBQcm9kdWN0VHlwZQorICAgICAgICAgICAgLy8gdG8gb2JleSB0aGUgY29udHJhY3Qgb2YgdGhlIEZpbGUgTWFuYWdlciwgd2UgbmVlZCB0byBtYWtlCisgICAgICAgICAgICAvLyBzdXJlIGl0cyBzZXQgaGVyZQorICAgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0VHlwZSh0aGlzLnJlcG9zaXRvcnlNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgYnkgbmFtZTogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0TmFtZSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgdHlwZSBieSBpZDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0UHJvZHVjdFR5cGVJZCgpCisgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZSgKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0TGlzdCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RMaXN0ID0gY2F0YWxvZy5nZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0TGlzdChwcm9kdWN0TGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gb2J0YWluaW5nIHByb2R1Y3RzIGJ5IHByb2R1Y3QgdHlwZSBmb3IgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0TmFtZSgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZSgKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwcm9kdWN0VHlwZUhhc2gpOworICAgICAgICBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRMaXN0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZWxlbWVudExpc3QgPSBjYXRhbG9nLmdldFZhbGlkYXRpb25MYXllcigpLmdldEVsZW1lbnRzKHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjRWxlbWVudExpc3QoZWxlbWVudExpc3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9idGFpbmluZyBlbGVtZW50cyBmb3IgcHJvZHVjdCB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW1lbnQgPSBjYXRhbG9nLmdldFZhbGlkYXRpb25MYXllcigpLmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNFbGVtZW50KGVsZW1lbnQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiZXhjZXB0aW9uIHJldHJpZXZpbmcgZWxlbWVudCBieSBpZDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50SWQgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0RWxlbWVudEJ5TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZWxlbWVudCA9IGNhdGFsb2cuZ2V0VmFsaWRhdGlvbkxheWVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRCeU5hbWUoZWxlbWVudE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjRWxlbWVudChlbGVtZW50KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgImV4Y2VwdGlvbiByZXRyaWV2aW5nIGVsZW1lbnQgYnkgbmFtZTogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGNvbXBsZXhRdWVyeSgKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gY29tcGxleFF1ZXJ5SGFzaCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29tcGxleFF1ZXJ5IGNvbXBsZXhRdWVyeSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbXBsZXhRdWVyeUZyb21YbWxScGMoY29tcGxleFF1ZXJ5SGFzaCk7CisKKyAgICAgICAgICAgIC8vIGdldCBQcm9kdWN0VHlwZXMKKyAgICAgICAgICAgIExpc3Q8UHJvZHVjdFR5cGU+IHByb2R1Y3RUeXBlcyA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29tcGxleFF1ZXJ5LmdldFJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlcyA9IHRoaXMucmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlcyA9IG5ldyBWZWN0b3I8UHJvZHVjdFR5cGU+KCk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvZHVjdFR5cGVOYW1lIDogY29tcGxleFF1ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVzLmFkZCh0aGlzLnJlcG9zaXRvcnlNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgTWV0YWRhdGEKKyAgICAgICAgICAgIExpc3Q8UXVlcnlSZXN1bHQ+IHF1ZXJ5UmVzdWx0cyA9IG5ldyBMaW5rZWRMaXN0PFF1ZXJ5UmVzdWx0PigpOworICAgICAgICAgICAgZm9yIChQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA6IHByb2R1Y3RUeXBlcykgeworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9kdWN0SWRzID0gY2F0YWxvZy5xdWVyeSh0aGlzLmdldENhdGFsb2dRdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhRdWVyeSwgcHJvZHVjdFR5cGUpLCBwcm9kdWN0VHlwZSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvZHVjdElkIDogcHJvZHVjdElkcykgeworICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBjYXRhbG9nLmdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUocHJvZHVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICBRdWVyeVJlc3VsdCBxciA9IG5ldyBRdWVyeVJlc3VsdChwcm9kdWN0LCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlZHVjZWRNZXRhZGF0YShwcm9kdWN0LCBjb21wbGV4UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZWR1Y2VkTWV0YWRhdGEoKSkpOworICAgICAgICAgICAgICAgICAgICBxci5zZXRUb1N0cmluZ0Zvcm1hdChjb21wbGV4UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VG9TdHJpbmdSZXN1bHRGb3JtYXQoKSk7CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cy5hZGQocXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUXVlcnkgcmV0dXJuZWQgIiArIHF1ZXJ5UmVzdWx0cy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHJlc3VsdHMiKTsKKworICAgICAgICAgICAgLy8gZmlsdGVyIHF1ZXJ5IHJlc3VsdHMKKyAgICAgICAgICAgIGlmIChjb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHRzID0gYXBwbHlGaWx0ZXJUb1Jlc3VsdHMocXVlcnlSZXN1bHRzLCBjb21wbGV4UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRRdWVyeUZpbHRlcigpKTsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJGaWx0ZXIgcmV0dXJuZWQgIiArIHF1ZXJ5UmVzdWx0cy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXN1bHRzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNvcnQgcXVlcnkgcmVzdWx0cworICAgICAgICAgICAgaWYgKGNvbXBsZXhRdWVyeS5nZXRTb3J0QnlNZXRLZXkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cyA9IHNvcnRRdWVyeVJlc3VsdExpc3QocXVlcnlSZXN1bHRzLCBjb21wbGV4UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTb3J0QnlNZXRLZXkoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1F1ZXJ5UmVzdWx0cyhxdWVyeVJlc3VsdHMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGVyZm9ybSBjb21wbGV4IHF1ZXJ5IDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IHF1ZXJ5KAorICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBxdWVyeUhhc2gsCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RUeXBlSGFzaCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgUXVlcnkgcXVlcnkgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFF1ZXJ5RnJvbVhtbFJwYyhxdWVyeUhhc2gpOworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdExpc3QodGhpcy5xdWVyeShxdWVyeSwgdHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFR5cGUodHlwZSk7CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvZHVjdFR5cGVCeUlkKFN0cmluZyBwcm9kdWN0VHlwZUlkKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHR5cGUgPSByZXBvc2l0b3J5TWFuYWdlci5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZHVjdFR5cGVJZCk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBvYnRhaW5pbmcgcHJvZHVjdCB0eXBlIGJ5IGlkIGZvciBwcm9kdWN0IHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZUlkICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVNZXRhZGF0YShIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoLCAKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBtZXRhZGF0YUhhc2gpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9ueworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKHByb2R1Y3RIYXNoKTsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YShtZXRhZGF0YUhhc2gpOworICAgICAgICBNZXRhZGF0YSBvbGRNZXRhZGF0YSA9IGNhdGFsb2cuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisgICAgICAgIGNhdGFsb2cucmVtb3ZlTWV0YWRhdGEob2xkTWV0YWRhdGEsIHByb2R1Y3QpOworICAgICAgICBjYXRhbG9nLmFkZE1ldGFkYXRhKG1ldCwgcHJvZHVjdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGNhdGFsb2dQcm9kdWN0KEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2gpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3QgcCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdEZyb21YbWxScGMocHJvZHVjdEhhc2gpOworICAgICAgICByZXR1cm4gY2F0YWxvZ1Byb2R1Y3QocCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZE1ldGFkYXRhKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2gsCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3QgcCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdEZyb21YbWxScGMocHJvZHVjdEhhc2gpOworICAgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG0uYWRkTWV0YWRhdGEoKEhhc2h0YWJsZSltZXRhZGF0YSk7CisgICAgICAgIHJldHVybiBhZGRNZXRhZGF0YShwLCBtKSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRQcm9kdWN0UmVmZXJlbmNlcyhIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKHByb2R1Y3RIYXNoKTsKKyAgICAgICAgcmV0dXJuIGFkZFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgaW5nZXN0UHJvZHVjdChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoLAorICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSwgYm9vbGVhbiBjbGllbnRUcmFuc2ZlcikKKyAgICAgIHRocm93cyBWZXJzaW9uaW5nRXhjZXB0aW9uLCBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiwKKyAgICAgIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisKKyAgICBQcm9kdWN0IHAgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKHByb2R1Y3RIYXNoKTsKKworICAgIHRyeSB7CisgICAgICAvLyBmaXJzdCwgY3JlYXRlIHRoZSBwcm9kdWN0CisgICAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QuU1RBVFVTX1RSQU5TRkVSKTsKKyAgICAgIGNhdGFsb2dQcm9kdWN0KHApOworCisgICAgICAvLyBub3cgYWRkIHRoZSBtZXRhZGF0YQorICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgbS5hZGRNZXRhZGF0YSgoSGFzaHRhYmxlKW1ldGFkYXRhKTsKKyAgICAgIE1ldGFkYXRhIGV4cGFuZGVkTWV0ZGF0YSA9IGFkZE1ldGFkYXRhKHAsIG0pOworCisgICAgICAvLyB2ZXJzaW9uIHRoZSBwcm9kdWN0CisgICAgICBpZiAoIWNsaWVudFRyYW5zZmVyIHx8IChjbGllbnRUcmFuc2ZlcgorICAgICAgICAgICYmIEJvb2xlYW4uZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnNlcnZlcnNpZGUudmVyc2lvbmluZyIpKSkgeworICAgICAgICBWZXJzaW9uZXIgdmVyc2lvbmVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB2ZXJzaW9uZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgIC5nZXRWZXJzaW9uZXJGcm9tQ2xhc3NOYW1lKHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXRWZXJzaW9uZXIoKSk7CisgICAgICAgICAgdmVyc2lvbmVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocCwgZXhwYW5kZWRNZXRkYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgImluZ2VzdFByb2R1Y3Q6IFZlcnNpb25pbmdFeGNlcHRpb24gd2hlbiB2ZXJzaW9uaW5nIFByb2R1Y3Q6ICIKKyAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIiB3aXRoIFZlcnNpb25lciAiCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXRWZXJzaW9uZXIoKSArICI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgIHRocm93IG5ldyBWZXJzaW9uaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHRoZSBuZXdseSB2ZXJzaW9uZWQgcmVmZXJlbmNlcyB0byB0aGUgZGF0YSBzdG9yZQorICAgICAgICBhZGRQcm9kdWN0UmVmZXJlbmNlcyhwKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFjbGllbnRUcmFuc2ZlcikgeworICAgICAgICBMT0cubG9nKExldmVsLkZJTkVTVCwKKyAgICAgICAgICAgICAgIkZpbGUgTWFuYWdlcjogaW5nZXN0OiBubyBjbGllbnQgdHJhbnNmZXIgZW5hYmxlZCwgIgorICAgICAgICAgICAgICAgICAgKyAic2VydmVyIHRyYW5zZmVyaW5nIHByb2R1Y3Q6IFsiICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIl0iKTsKKworICAgICAgICAvLyBub3cgdHJhbnNmZXIgdGhlIHByb2R1Y3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkYXRhVHJhbnNmZXIudHJhbnNmZXJQcm9kdWN0KHApOworICAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIHByb2R1Y3QncyB0cmFuc2ZlciBzdGF0dXMgaW4gdGhlIGRhdGEgc3RvcmUKKyAgICAgICAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QuU1RBVFVTX1JFQ0VJVkVEKTsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYXRhbG9nLnNldFByb2R1Y3RUcmFuc2ZlclN0YXR1cyhwKTsKKyAgICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiaW5nZXN0UHJvZHVjdDogQ2F0YWxvZ0V4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgKyAid2hlbiB1cGRhdGluZyBwcm9kdWN0IHRyYW5zZmVyIHN0YXR1cyBmb3IgUHJvZHVjdDogIgorICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICJpbmdlc3RQcm9kdWN0OiBEYXRhVHJhbnNmZXJFeGNlcHRpb24gd2hlbiB0cmFuc2ZlcmluZyBQcm9kdWN0OiAiCisgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdE5hbWUoKSArICI6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyB0aGF0J3MgaXQhCisgICAgICByZXR1cm4gcC5nZXRQcm9kdWN0SWQoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKCJFcnJvciBpbmdlc3RpbmcgcHJvZHVjdCBbIiArIHAgKyAiXSA6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgfQorCisgICBwdWJsaWMgYnl0ZVtdIHJldHJpZXZlRmlsZShTdHJpbmcgZmlsZVBhdGgsIGludCBvZmZzZXQsIGludCBudW1CeXRlcykKKyAgICAgICAgIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24geworICAgICAgRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgICBieXRlW10gZmlsZURhdGEgPSBuZXcgYnl0ZVtudW1CeXRlc107CisgICAgICAgICAoaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSkuc2tpcChvZmZzZXQpOworICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQoZmlsZURhdGEpOworICAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSAtMSkgeworICAgICAgICAgICAgYnl0ZVtdIGZpbGVEYXRhVHJ1bmNhdGVkID0gbmV3IGJ5dGVbYnl0ZXNSZWFkXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZmlsZURhdGEsIDAsIGZpbGVEYXRhVHJ1bmNhdGVkLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgcmV0dXJuIGZpbGVEYXRhVHJ1bmNhdGVkOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byByZWFkICciICsgbnVtQnl0ZXMKKyAgICAgICAgICAgICAgICsgIicgYnl0ZXMgZnJvbSBmaWxlICciICsgZmlsZVBhdGggKyAiJyBhdCBpbmRleCAnIiArIG9mZnNldAorICAgICAgICAgICAgICAgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCAnIiArIG51bUJ5dGVzCisgICAgICAgICAgICAgICArICInIGJ5dGVzIGZyb20gZmlsZSAnIiArIGZpbGVQYXRoICsgIicgYXQgaW5kZXggJyIgKyBvZmZzZXQKKyAgICAgICAgICAgICAgICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgIHRyeSB7IGlzLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgfQorICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHRyYW5zZmVyRmlsZShTdHJpbmcgZmlsZVBhdGgsIGJ5dGVbXSBmaWxlRGF0YSwgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBudW1CeXRlcykgeworICAgICAgICBGaWxlIG91dEZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmT3V0ID0gbnVsbDsKKworICAgICAgICBpZiAob3V0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIHVzZSBSYW5kb21BY2Nlc3MgZmlsZSBvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZVBhdGggKyAiOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeQorICAgICAgICAgICAgU3RyaW5nIG91dEZpbGVEaXJQYXRoID0gb3V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgb3V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sYXN0SW5kZXhPZigiLyIpKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIk91dGZpbGUgZGlyZWN0b3J5OiAiICsgb3V0RmlsZURpclBhdGgpOworICAgICAgICAgICAgRmlsZSBvdXRGaWxlRGlyID0gbmV3IEZpbGUob3V0RmlsZURpclBhdGgpOworICAgICAgICAgICAgb3V0RmlsZURpci5ta2RpcnMoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byB1c2UgUmFuZG9tQWNjZXNzIGZpbGUgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVQYXRoICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmT3V0LndyaXRlKGZpbGVEYXRhLCAoaW50KSBvZmZzZXQsIChpbnQpIG51bUJ5dGVzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiSU9FeGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gd3JpdGUgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVQYXRoICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChmT3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZPdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZk91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0RmlsZSA9IG51bGw7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1vdmVQcm9kdWN0KEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2gsIFN0cmluZyBuZXdQYXRoKQorICAgICAgICAgICAgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJvZHVjdCBwID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisKKyAgICAgICAgLy8gZmlyc3QgdGhpbmcgd2UgY2FyZSBhYm91dCBpcyBpZiB0aGUgcHJvZHVjdCBpcyBmbGF0IG9yIGhlaXJhcmNoaWNhbAorICAgICAgICBpZiAocC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpKSB7CisgICAgICAgICAgICAvLyB3ZSBqdXN0IG5lZWQgdG8gZ2V0IGl0cyBmaXJzdCByZWZlcmVuY2UKKyAgICAgICAgICAgIGlmIChwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCAocC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpICE9IG51bGwgJiYgcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSAhPSAxKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmxhdCBwcm9kdWN0cyBtdXN0IGhhdmUgYSBzaW5nbGUgcmVmZXJlbmNlOiBjYW5ub3QgbW92ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBva2F5LCBpdCdzIGZpbmUgdG8gbW92ZSBpdAorICAgICAgICAgICAgLy8gZmlyc3QsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBkYXRhIHN0b3JlIHJlZgorICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSAoUmVmZXJlbmNlKSBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApOworICAgICAgICAgICAgaWYgKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShuZXdQYXRoKS50b1VSSSgpLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbigiY2Fubm90IG1vdmUgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIl0gdG8gc2FtZSBsb2NhdGlvbjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICJdIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZGF0YSBzdG9yZSBwYXRoOiB3ZSdsbCBuZWVkIGl0IHRvCisgICAgICAgICAgICAvLyBkbyB0aGUgZGF0YSB0cmFuc2ZlcgorICAgICAgICAgICAgUmVmZXJlbmNlIGNvcHlSZWYgPSBuZXcgUmVmZXJlbmNlKHIpOworCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvcHlSZWYgdG8gaGF2ZSB0aGUgZGF0YSBzdG9yZSByZWYgYXMgdGhlIG9yaWcgcmVmCisgICAgICAgICAgICAvLyB0aGUgdGhlIG5ld0xvYyBhcyB0aGUgbmV3IHJlZgorICAgICAgICAgICAgY29weVJlZi5zZXRPcmlnUmVmZXJlbmNlKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgICAgICAgICAgY29weVJlZi5zZXREYXRhU3RvcmVSZWZlcmVuY2UobmV3IEZpbGUobmV3UGF0aCkudG9VUkkoKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmNsZWFyKCk7CisgICAgICAgICAgICBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKGNvcHlSZWYpOworCisgICAgICAgICAgICAvLyBub3cgdHJhbnNmZXIgaXQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5kYXRhVHJhbnNmZXIudHJhbnNmZXJQcm9kdWN0KHApOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3cgZGVsZXRlIHRoZSBvcmlnaW5hbCBjb3B5CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghbmV3IEZpbGUobmV3IFVSSShjb3B5UmVmLmdldE9yaWdSZWZlcmVuY2UoKSkpLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkRlbGV0aW9uIG9mIG9yaWdpbmFsIGZpbGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBvbiBwcm9kdWN0IG1vdmUgcmV0dXJuZWQgZmFsc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVVJJIFN5bnRheCBleGNlcHRpb24gdHJ5aW5nIHRvIHJlbW92ZSBvcmlnaW5hbCBwcm9kdWN0IHJlZjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm93IHNhdmUgdGhlIHVwZGF0ZWQgcmVmZXJlbmNlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuY2F0YWxvZy5tb2RpZnlQcm9kdWN0KHApOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTW92aW5nIG9mIGhlaXJhcmhpY2FsIGFuZCBzdHJlYW0gcHJvZHVjdHMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgLy8gVE9ETyhiZm9zdGVyKTogQ2xlYW4gdGhpcyB1cCBzbyB0aGF0IGl0IGRlbGV0ZXMgYnkgcHJvZHVjdCBub3QgZmlsZS4KKyAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICBSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoKTsKKyAgICAgIHIuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKGZpbGVQYXRoKTsKKyAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KHIpKTsKKyAgICAgIGRhdGFUcmFuc2Zlci5kZWxldGVQcm9kdWN0KHByb2R1Y3QpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbW9kaWZ5UHJvZHVjdChIYXNodGFibGU8PywgPz4gcHJvZHVjdEhhc2gpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdCBwID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhdGFsb2cubW9kaWZ5UHJvZHVjdChwKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gbW9kaWZ5aW5nIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0SWQoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVByb2R1Y3QoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0IHAgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKHByb2R1Y3RIYXNoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2F0YWxvZy5yZW1vdmVQcm9kdWN0KHApOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBtb2RpZnlpbmcgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldENhdGFsb2dWYWx1ZXMoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IG1ldGFkYXRhSGFzaCwKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtLmFkZE1ldGFkYXRhKG1ldGFkYXRhSGFzaCk7CisgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ1ZhbHVlcyhtLCBwcm9kdWN0VHlwZSkuZ2V0SGFzaHRhYmxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldE9yaWdWYWx1ZXMoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IG1ldGFkYXRhSGFzaCwKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtLmFkZE1ldGFkYXRhKG1ldGFkYXRhSGFzaCk7CisgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JpZ1ZhbHVlcyhtLCBwcm9kdWN0VHlwZSkuZ2V0SGFzaHRhYmxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldENhdGFsb2dRdWVyeSgKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcXVlcnlIYXNoLAorICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0VHlwZUhhc2gpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24sIFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24geworICAgICAgICBRdWVyeSBxdWVyeSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UXVlcnlGcm9tWG1sUnBjKHF1ZXJ5SGFzaCk7CisgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUXVlcnkodGhpcy5nZXRDYXRhbG9nUXVlcnkocXVlcnksIHByb2R1Y3RUeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBwb3J0TnVtID0gLTE7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJGaWxlTWFuYWdlciAtLXBvcnROdW0gPHBvcnQgbnVtYmVyIGZvciB4bWwgcnBjIHNlcnZpY2U+XG4iOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXBvcnROdW0iKSkgeworICAgICAgICAgICAgICAgIHBvcnROdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydE51bSA9PSAtMSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBYbWxScGNGaWxlTWFuYWdlcihwb3J0TnVtKTsKKworICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNodXRkb3duKCkgeworICAgICAgICBpZiAodGhpcy53ZWJTZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy53ZWJTZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIHRoaXMud2ViU2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTdHJpbmcgY2F0YWxvZ1Byb2R1Y3QoUHJvZHVjdCBwKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2F0YWxvZy5hZGRQcm9kdWN0KHApOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiaW5nZXN0UHJvZHVjdDogQ2F0YWxvZ0V4Y2VwdGlvbiB3aGVuIGFkZGluZyBQcm9kdWN0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3ROYW1lKCkgKyAiIHRvIENhdGFsb2c6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcC5nZXRQcm9kdWN0SWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBNZXRhZGF0YSBhZGRNZXRhZGF0YShQcm9kdWN0IHAsIE1ldGFkYXRhIG0pCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvL2FwcGx5IGhhbmRsZXJzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtID0gdGhpcy5nZXRDYXRhbG9nVmFsdWVzKG0sIHAuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBnZXQgaGFuZGxlcnMgZm9yIHByb2R1Y3QgJyIgKyBwCisgICAgICAgICAgICAgICAgICAgICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBmaXJzdCBkbyBzZXJ2ZXIgc2lkZSBtZXRhZGF0YSBleHRyYWN0aW9uCisgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gcnVuRXh0cmFjdG9ycyhwLCBtKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2F0YWxvZy5hZGRNZXRhZGF0YShtZXRhZGF0YSwgcCk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJpbmdlc3RQcm9kdWN0OiBDYXRhbG9nRXhjZXB0aW9uIHdoZW4gYWRkaW5nIG1ldGFkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1ldGFkYXRhICsgIiBmb3IgcHJvZHVjdDogIiArIHAuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJpbmdlc3RQcm9kdWN0OiBHZW5lcmFsIEV4Y2VwdGlvbiB3aGVuIGFkZGluZyBtZXRhZGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhZGF0YSArICIgZm9yIHByb2R1Y3Q6ICIgKyBwLmdldFByb2R1Y3ROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWV0YWRhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhZGF0YSBydW5FeHRyYWN0b3JzKFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHByb2R1Y3QgdHlwZSBkZWZpbml0aW9uIGlzIHByZXNlbnQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUocmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeUlkKHByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlKCkuZ2V0UHJvZHVjdFR5cGVJZCgpKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGxvYWQgUHJvZHVjdFR5cGUgIiArIHByb2R1Y3QKKyAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlKCkuZ2V0UHJvZHVjdFR5cGVJZCgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YShtZXRhZGF0YS5nZXRIYXNodGFibGUoKSk7CisKKyAgICAgICAgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRFeHRyYWN0b3JzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChFeHRyYWN0b3JTcGVjIHNwZWM6IHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRFeHRyYWN0b3JzKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlbWdyTWV0RXh0cmFjdG9yIGV4dHJhY3RvciA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFeHRyYWN0b3JGcm9tQ2xhc3NOYW1lKHNwZWMuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgIGV4dHJhY3Rvci5jb25maWd1cmUoc3BlYy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlJ1bm5pbmcgTWV0IEV4dHJhY3RvcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIGZvciBwcm9kdWN0IHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkgKyAiXSIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1ldCA9IGV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEocHJvZHVjdCwgbWV0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBleHRyYWN0b3IgbWV0YWRhdGEgZnJvbSBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IHVzaW5nIGV4dHJhY3RvcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIGNhdGFsb2cuYWRkUHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRQcm9kdWN0VHlwZShMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb2R1Y3RzICE9IG51bGwgJiYgcHJvZHVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxQcm9kdWN0PiBpID0gcHJvZHVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0VHlwZShyZXBvc2l0b3J5TWFuYWdlci5nZXRQcm9kdWN0VHlwZUJ5SWQocAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZSgpLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgTGlzdDxQcm9kdWN0PiBxdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb2R1Y3RJZExpc3QgPSBudWxsOworICAgICAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RMaXN0ID0gbnVsbDsKKworICAgICAgICB0cnkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgcHJvZHVjdElkTGlzdCA9IGNhdGFsb2cucXVlcnkodGhpcy5nZXRDYXRhbG9nUXVlcnkocXVlcnksIHByb2R1Y3RUeXBlKSwgcHJvZHVjdFR5cGUpOworCisgICAgICAgICAgICBpZiAocHJvZHVjdElkTGlzdCAhPSBudWxsICYmIHByb2R1Y3RJZExpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RMaXN0ID0gbmV3IFZlY3RvcjxQcm9kdWN0Pihwcm9kdWN0SWRMaXN0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBwcm9kdWN0SWRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdElkID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IGNhdGFsb2cuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgaGVyZSB0aGF0IHRoZSB1bmRlcmx5aW5nIGNhdGFsb2cgZGlkIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIFByb2R1Y3RUeXBlCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIG9iZXkgdGhlIGNvbnRyYWN0IG9mIHRoZSBGaWxlIE1hbmFnZXIsIHdlIG5lZWQgdG8gbWFrZQorICAgICAgICAgICAgICAgICAgICAvLyBzdXJlIGl0cyBzZXQgaGVyZQorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHRoaXMucmVwb3NpdG9yeU1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVCeUlkKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgICAgICAgICAgICBwcm9kdWN0TGlzdC5hZGQocHJvZHVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0TGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8UHJvZHVjdD4oKTsgLy8gbnVsbCB2YWx1ZXMgbm90IHN1cHBvcnRlZCBieSBYTUwtUlBDCisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcGVyZm9ybWluZyBxdWVyeSBhZ2FpbnN0IGNhdGFsb2cgZm9yIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlLmdldE5hbWUoKSArICJdIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBNZXRhZGF0YSBnZXRSZWR1Y2VkTWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0LCBMaXN0PFN0cmluZz4gZWxlbWVudHMpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGFkYXRhIG0gPSBudWxsOworICAgICAgICAgICAgaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG0gPSBjYXRhbG9nLmdldFJlZHVjZWRNZXRhZGF0YShwcm9kdWN0LCBlbGVtZW50cyk7CisgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgbSA9IHRoaXMuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZih0aGlzLmV4cGFuZFByb2R1Y3RNZXQpIG0gPSB0aGlzLmJ1aWxkUHJvZHVjdE1ldGFkYXRhKHByb2R1Y3QsIG0pOyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JpZ1ZhbHVlcyhtLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9idGFpbmluZyBtZXRhZGF0YSBmcm9tIGNhdGFsb2cgZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1ldGFkYXRhIGdldE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0YWRhdGEgbSA9IGNhdGFsb2cuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisgICAgICAgICAgICBpZih0aGlzLmV4cGFuZFByb2R1Y3RNZXQpIG0gPSB0aGlzLmJ1aWxkUHJvZHVjdE1ldGFkYXRhKHByb2R1Y3QsIG0pOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JpZ1ZhbHVlcyhtLCBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9idGFpbmluZyBtZXRhZGF0YSBmcm9tIGNhdGFsb2cgZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1ldGFkYXRhIGdldE9yaWdWYWx1ZXMoTWV0YWRhdGEgbWV0YWRhdGEsIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKSAKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8VHlwZUhhbmRsZXI+IGhhbmRsZXJzID0gdGhpcy5yZXBvc2l0b3J5TWFuYWdlci5nZXRQcm9kdWN0VHlwZUJ5SWQoCisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKS5nZXRIYW5kbGVycygpOworICAgICAgICBpZiAoaGFuZGxlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxUeXBlSGFuZGxlcj4gaXRlciA9IGhhbmRsZXJzLml0ZXJhdG9yKCk7IGl0ZXIKKyAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgaXRlci5uZXh0KCkucG9zdEdldE1ldGFkYXRhSGFuZGxlKG1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0YWRhdGE7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgTWV0YWRhdGEgZ2V0Q2F0YWxvZ1ZhbHVlcyhNZXRhZGF0YSBtZXRhZGF0YSwgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpIAorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxUeXBlSGFuZGxlcj4gaGFuZGxlcnMgPSB0aGlzLnJlcG9zaXRvcnlNYW5hZ2VyLmdldFByb2R1Y3RUeXBlQnlJZCgKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkpLmdldEhhbmRsZXJzKCk7CisgICAgICAgIGlmIChoYW5kbGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFR5cGVIYW5kbGVyPiBpdGVyID0gaGFuZGxlcnMuaXRlcmF0b3IoKTsgaXRlcgorICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICBpdGVyLm5leHQoKS5wcmVBZGRNZXRhZGF0YUhhbmRsZShtZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFF1ZXJ5IGdldENhdGFsb2dRdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24sIFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24geworICAgICAgICBMaXN0PFR5cGVIYW5kbGVyPiBoYW5kbGVycyA9IHRoaXMucmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeUlkKAorICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKSkuZ2V0SGFuZGxlcnMoKTsKKyAgICAgICAgaWYgKGhhbmRsZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8VHlwZUhhbmRsZXI+IGl0ZXIgPSBoYW5kbGVycy5pdGVyYXRvcigpOyBpdGVyCisgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgIGl0ZXIubmV4dCgpLnByZVF1ZXJ5SGFuZGxlKHF1ZXJ5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBMaXN0PFF1ZXJ5UmVzdWx0PiBhcHBseUZpbHRlclRvUmVzdWx0cygKKyAgICAgICAgICAgIExpc3Q8UXVlcnlSZXN1bHQ+IHF1ZXJ5UmVzdWx0cywgUXVlcnlGaWx0ZXIgcXVlcnlGaWx0ZXIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxUaW1lRXZlbnQ+IGV2ZW50cyA9IG5ldyBMaW5rZWRMaXN0PFRpbWVFdmVudD4oKTsKKyAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxdWVyeVJlc3VsdCA6IHF1ZXJ5UmVzdWx0cykgeworICAgICAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICAgICAgbS5hZGRNZXRhZGF0YShxdWVyeUZpbHRlci5nZXRQcmlvcml0eU1ldEtleSgpLCBxdWVyeVJlc3VsdAorICAgICAgICAgICAgICAgIC5nZXRNZXRhZGF0YSgpLmdldE1ldGFkYXRhKHF1ZXJ5RmlsdGVyLmdldFByaW9yaXR5TWV0S2V5KCkpKTsKKyAgICAgICAgICAgIGV2ZW50cy5hZGQobmV3IE9iamVjdFRpbWVFdmVudDxRdWVyeVJlc3VsdD4oCisgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLmdldFRpbWVJbk1pbGxpcyhEYXRlVXRpbHMudG9DYWxlbmRhcihxdWVyeVJlc3VsdAorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoKS5nZXRNZXRhZGF0YShxdWVyeUZpbHRlci5nZXRTdGFydERhdGVUaW1lTWV0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICBEYXRlVXRpbHMuRm9ybWF0VHlwZS5VVENfRk9STUFUKSwgRGF0ZVV0aWxzLmp1bGlhbkVwb2NoKSwgCisgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLmdldFRpbWVJbk1pbGxpcyhEYXRlVXRpbHMudG9DYWxlbmRhcihxdWVyeVJlc3VsdC5nZXRNZXRhZGF0YSgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRhZGF0YShxdWVyeUZpbHRlci5nZXRFbmREYXRlVGltZU1ldEtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLkZvcm1hdFR5cGUuVVRDX0ZPUk1BVCksCisgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLmp1bGlhbkVwb2NoKSwgcXVlcnlGaWx0ZXIuZ2V0Q29udmVydGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRUb1ByaW9yaXR5KHRoaXMuZ2V0Q2F0YWxvZ1ZhbHVlcyhtLAorICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdC5nZXRQcm9kdWN0KCkuZ2V0UHJvZHVjdFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKHF1ZXJ5RmlsdGVyLmdldFByaW9yaXR5TWV0S2V5KCkpKSwKKyAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIGV2ZW50cyA9IHF1ZXJ5RmlsdGVyLmdldEZpbHRlckFsZ29yKCkuZmlsdGVyRXZlbnRzKGV2ZW50cyk7CisgICAgICAgIExpc3Q8UXVlcnlSZXN1bHQ+IGZpbHRlcmVkUXVlcnlSZXN1bHRzID0gbmV3IExpbmtlZExpc3Q8UXVlcnlSZXN1bHQ+KCk7CisgICAgICAgIGZvciAoVGltZUV2ZW50IGV2ZW50IDogZXZlbnRzKQorICAgICAgICAgICAgZmlsdGVyZWRRdWVyeVJlc3VsdHMuYWRkKCgoT2JqZWN0VGltZUV2ZW50PFF1ZXJ5UmVzdWx0PikgZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIC5nZXRUaW1lT2JqZWN0KCkpOworCisgICAgICAgIHJldHVybiBmaWx0ZXJlZFF1ZXJ5UmVzdWx0czsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UXVlcnlSZXN1bHQ+IHNvcnRRdWVyeVJlc3VsdExpc3QoTGlzdDxRdWVyeVJlc3VsdD4gcXVlcnlSZXN1bHRzLAorICAgICAgU3RyaW5nIHNvcnRCeU1ldEtleSkgeworICAgIFF1ZXJ5UmVzdWx0W10gcmVzdWx0c0FycmF5ID0gcXVlcnlSZXN1bHRzCisgICAgICAgIC50b0FycmF5KG5ldyBRdWVyeVJlc3VsdFtxdWVyeVJlc3VsdHMuc2l6ZSgpXSk7CisgICAgUXVlcnlSZXN1bHRDb21wYXJhdG9yIHFyQ29tcGFyYXRvciA9IG5ldyBRdWVyeVJlc3VsdENvbXBhcmF0b3IoKTsKKyAgICBxckNvbXBhcmF0b3Iuc2V0U29ydEJ5TWV0S2V5KHNvcnRCeU1ldEtleSk7CisgICAgQXJyYXlzLnNvcnQocmVzdWx0c0FycmF5LCBxckNvbXBhcmF0b3IpOworICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHJlc3VsdHNBcnJheSk7CisgIH0KKworICAgIHByaXZhdGUgTWV0YWRhdGEgYnVpbGRQcm9kdWN0TWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICBNZXRhZGF0YSBwTWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgcE1ldC5yZXBsYWNlTWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9JRCwgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSAhPSBudWxsID8gCisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCk6InVua25vd24iKTsKKyAgICBwTWV0LnJlcGxhY2VNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX05BTUUsIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSAhPSBudWxsID8gCisgICAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKToidW5rbm93biIpOworICAgIHBNZXQucmVwbGFjZU1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfU1RSVUNUVVJFLCBwcm9kdWN0CisgICAgICAgIC5nZXRQcm9kdWN0U3RydWN0dXJlKCkgIT0gbnVsbCA/IHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpOiJ1bmtub3duIik7CisgICAgcE1ldC5yZXBsYWNlTWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9UUkFOU0ZFUl9TVEFUVVMsIHByb2R1Y3QKKyAgICAgICAgLmdldFRyYW5zZmVyU3RhdHVzKCkgIT0gbnVsbCA/IHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKToidW5rbm93biIpOworICAgIHBNZXQucmVwbGFjZU1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfUk9PVF9SRUZFUkVOQ0UsIHByb2R1Y3QuZ2V0Um9vdFJlZigpICE9IG51bGwgPyAKKyAgICAgICAgVmVyc2lvbmluZ1V0aWxzCisgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGhGcm9tVXJpKHByb2R1Y3QuZ2V0Um9vdFJlZigpLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKToidW5rbm93biIpOworCisgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCk7CisKKyAgICBpZiAocmVmcyA9PSBudWxsIHx8IChyZWZzICE9IG51bGwgJiYgcmVmcy5zaXplKCkgPT0gMCkpIHsKKyAgICAgIHJlZnMgPSB0aGlzLmNhdGFsb2cuZ2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCk7CisgICAgfQorCisgICAgZm9yIChSZWZlcmVuY2UgciA6IHJlZnMpIHsKKyAgICAgIHBNZXQucmVwbGFjZU1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfT1JJR19SRUZTLCByLmdldE9yaWdSZWZlcmVuY2UoKSAhPSBudWxsCisgICAgICAgICAgPyBWZXJzaW9uaW5nVXRpbHMKKyAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoRnJvbVVyaShyLmdldE9yaWdSZWZlcmVuY2UoKSk6InVua25vd24iKTsKKyAgICAgIHBNZXQucmVwbGFjZU1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfREFUQVNUT1JFX1JFRlMsCisgICAgICAgICAgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSAhPSBudWxsID8gCisgICAgICAgICAgICAgIFZlcnNpb25pbmdVdGlscy5nZXRBYnNvbHV0ZVBhdGhGcm9tVXJpKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOiJ1bmtub3duIik7CisgICAgICBwTWV0LnJlcGxhY2VNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX0ZJTEVfU0laRVMsIFN0cmluZy52YWx1ZU9mKHIKKyAgICAgICAgICAuZ2V0RmlsZVNpemUoKSkpOworICAgICAgcE1ldC5yZXBsYWNlTWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9NSU1FX1RZUEVTLAorICAgICAgICAgIHIuZ2V0TWltZVR5cGUoKSAhPSBudWxsID8gci5nZXRNaW1lVHlwZSgpLmdldE5hbWUoKSA6ICJ1bmtub3duIik7CisgICAgfQorCisgICAgcmV0dXJuIHBNZXQ7CisgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgLy8gc2V0IHVwIHRoZSBjb25maWd1cmF0aW9uLCBpZiB0aGVyZSBpcyBhbnkKKyAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucHJvcGVydGllcyIpICE9IG51bGwpIHsKKyAgICAgIFN0cmluZyBjb25maWdGaWxlID0gU3lzdGVtCisgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICJMb2FkaW5nIEZpbGUgTWFuYWdlciBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgZnJvbTogWyIgKyBjb25maWdGaWxlCisgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGNvbmZpZ0ZpbGUpKSk7CisgICAgfQorCisgICAgU3RyaW5nIG1ldGFGYWN0b3J5ID0gbnVsbCwgZGF0YUZhY3RvcnkgPSBudWxsLCB0cmFuc2ZlckZhY3RvcnkgPSBudWxsOworCisgICAgbWV0YUZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGVtZ3IuY2F0YWxvZy5mYWN0b3J5IiwKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSIpOworICAgIGRhdGFGYWN0b3J5ID0gU3lzdGVtCisgICAgICAgIC5nZXRQcm9wZXJ0eSgiZmlsZW1nci5yZXBvc2l0b3J5LmZhY3RvcnkiLAorICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LkRhdGFTb3VyY2VSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkiKTsKKyAgICB0cmFuc2ZlckZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGVtZ3IuZGF0YXRyYW5zZmVyLmZhY3RvcnkiLAorICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiKTsKKworICAgIGNhdGFsb2cgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgIC5nZXRDYXRhbG9nU2VydmljZUZyb21GYWN0b3J5KG1ldGFGYWN0b3J5KTsKKyAgICByZXBvc2l0b3J5TWFuYWdlciA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgLmdldFJlcG9zaXRvcnlNYW5hZ2VyU2VydmljZUZyb21GYWN0b3J5KGRhdGFGYWN0b3J5KTsKKyAgICBkYXRhVHJhbnNmZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgIC5nZXREYXRhVHJhbnNmZXJTZXJ2aWNlRnJvbUZhY3RvcnkodHJhbnNmZXJGYWN0b3J5KTsKKworICAgIHRyYW5zZmVyU3RhdHVzVHJhY2tlciA9IG5ldyBUcmFuc2ZlclN0YXR1c1RyYWNrZXIoY2F0YWxvZyk7CisKKyAgICAvLyBnb3QgdG8gc3RhcnQgdGhlIHNlcnZlciBiZWZvcmUgc2V0dGluZyB1cCB0aGUgdHJhbnNmZXIgY2xpZW50IHNpbmNlCisgICAgLy8gaXQKKyAgICAvLyBjaGVja3MgZm9yIGEgbGl2ZSBzZXJ2ZXIKKyAgICBkYXRhVHJhbnNmZXIKKyAgICAgICAgLnNldEZpbGVNYW5hZ2VyVXJsKG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIHdlYlNlcnZlclBvcnQpKTsKKworICAgIGV4cGFuZFByb2R1Y3RNZXQgPSBCb29sZWFuCisgICAgICAgIC5nZXRCb29sZWFuKCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXhwYW5kUHJvZHVjdCIpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWEzMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N5c3RlbS9YbWxScGNGaWxlTWFuYWdlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTM4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbTsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLkNvbW1vbnNYbWxScGNUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuWG1sUnBjQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY0NsaWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuWG1sUnBjVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY1RyYW5zcG9ydEZhY3Rvcnk7CisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kUmV0cnlIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcy5IdHRwTWV0aG9kUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuQ21kTGluZVV0aWxpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5GaWxlVHJhbnNmZXJTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5YbWxScGNTdHJ1Y3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLlZlcnNpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LkNvbXBsZXhRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5RdWVyeVJlc3VsdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBYTUwgUlBDIGJhc2VkIGZpbGUgbWFuYWdlciBjbGllbnQuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IHsKKworICAgIC8qIG91ciB4bWwgcnBjIGNsaWVudCAqLworICAgIHByaXZhdGUgWG1sUnBjQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50LmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIGZpbGUgbWFuYWdlciB1cmwgKi8KKyAgICBwcml2YXRlIFVSTCBmaWxlTWFuYWdlclVybCA9IG51bGw7CisKKyAgICAvKiBkYXRhIHRyYW5zZmVyZXIgbmVlZGVkIGlmIGNsaWVudCBpcyByZXF1ZXN0IHRvIG1vdmUgZmlsZXMgaXRzZWxmICovCisgICAgcHJpdmF0ZSBEYXRhVHJhbnNmZXIgZGF0YVRyYW5zZmVyID0gbnVsbDsKKworICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChmaW5hbCBVUkwgdXJsKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgdGhpcyh1cmwsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+dXJsPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHVybAorICAgICAqICAgICAgICAgICAgVGhlIHVybCBwb2ludGVyIHRvIHRoZSB4bWwgcnBjIGZpbGUgbWFuYWdlciBzZXJ2aWNlLgorICAgICAqIEBwYXJhbSB0ZXN0Q29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgV2hldGhlciBvciBub3QgdG8gY2hlY2sgaWYgc2VydmVyIGF0IGdpdmVuIHVybCBpcyBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQoZmluYWwgVVJMIHVybCwgYm9vbGVhbiB0ZXN0Q29ubmVjdGlvbikKKyAgICAgICAgICB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB1cCB0aGUgY29uZmlndXJhdGlvbiwgaWYgdGhlcmUgaXMgYW55CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5wcm9wZXJ0aWVzIikgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgICAiTG9hZGluZyBGaWxlIE1hbmFnZXIgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIGZyb206IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlICsgIl0iKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShjb25maWdGaWxlKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbG9hZGluZyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZnJvbTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlICsgIl0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgWG1sUnBjVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFhtbFJwY1RyYW5zcG9ydEZhY3RvcnkoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBYbWxScGNUcmFuc3BvcnQgY3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFJwY0NsaWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOworICAgICAgICAgICAgICAgIGNsaWVudC5nZXRQYXJhbXMoKS5zZXRQYXJhbWV0ZXIoSHR0cE1ldGhvZFBhcmFtcy5SRVRSWV9IQU5ETEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEh0dHBNZXRob2RSZXRyeUhhbmRsZXIoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRyeU1ldGhvZChIdHRwTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPCBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvbi5yZXRyaWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpLmludFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xlZXAoSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvbi5yZXRyeS5pbnRlcnZhbC5zZWNvbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKS5pbnRWYWx1ZSgpICogMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBDb21tb25zWG1sUnBjVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBDb21tb25zWG1sUnBjVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsLCBjbGllbnQpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbm5lY3Rpb25UaW1lb3V0KEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLmNvbm5lY3Rpb25UaW1lb3V0Lm1pbnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwKS5pbnRWYWx1ZSgpICogNjAgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaW1lb3V0KEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLnJlcXVlc3RUaW1lb3V0Lm1pbnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwKS5pbnRWYWx1ZSgpICogNjAgKiAxMDAwKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICAgICAgfQorCisgICAgICAgIH07CisKKyAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0NsaWVudCh1cmwsIHRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICBmaWxlTWFuYWdlclVybCA9IHVybDsKKworICAgICAgICBpZiAodGVzdENvbm5lY3Rpb24gJiYgIWlzQWxpdmUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkV4Y2VwdGlvbiBjb25uZWN0aW5nIHRvIGZpbGVtZ3I6IFsiCisgICAgICAgICAgICAgICAgICAgICsgdGhpcy5maWxlTWFuYWdlclVybCArICJdIik7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZWZyZXNoQ29uZmlnQW5kUG9saWN5KCkgeworICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgIAorICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgdHJ5IHsKKyAgICAgICAgc3VjY2VzcyA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IucmVmcmVzaENvbmZpZ0FuZFBvbGljeSIsCisgICAgICAgICAgICBhcmdMaXN0KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJYbWxScGNFeGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGZpbGVtZ3I6IFsiCisgICAgICAgICAgICArIHRoaXMuZmlsZU1hbmFnZXJVcmwgKyAiXSIpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIklPRXhjZXB0aW9uIHdoZW4gY29ubmVjdGluZyB0byBmaWxlbWdyOiBbIgorICAgICAgICAgICAgKyB0aGlzLmZpbGVNYW5hZ2VyVXJsICsgIl0iKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgfQorICAKKyAgICAgIHJldHVybiBzdWNjZXNzOworICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkgeworICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworCisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3RlZCA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IuaXNBbGl2ZSIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJYbWxScGNFeGNlcHRpb24gd2hlbiBjb25uZWN0aW5nIHRvIGZpbGVtZ3I6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmZpbGVNYW5hZ2VyVXJsICsgIl0iKTsKKyAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJJT0V4Y2VwdGlvbiB3aGVuIGNvbm5lY3RpbmcgdG8gZmlsZW1ncjogWyIKKyAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmZpbGVNYW5hZ2VyVXJsICsgIl0iKTsKKyAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbm5lY3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0cmFuc2ZlcnJpbmdQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFhtbFJwY1Byb2R1Y3QocHJvZHVjdCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RIYXNoKTsKKworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VjY2VzcyA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IudHJhbnNmZXJyaW5nUHJvZHVjdCIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVByb2R1Y3RUcmFuc2ZlclN0YXR1cyhQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0SGFzaCk7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5yZW1vdmVQcm9kdWN0VHJhbnNmZXJTdGF0dXMiLCBhcmdMaXN0KSkKKyAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2ZlckNvbXBsZXRlKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24geworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RIYXNoKTsKKworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VjY2VzcyA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IuaXNUcmFuc2ZlckNvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbW92ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0LCBTdHJpbmcgbmV3UGF0aCkKKyAgICAgICAgICAgIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24geworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RIYXNoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQobmV3UGF0aCk7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKCJmaWxlbWdyLm1vdmVQcm9kdWN0IiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1vZGlmeVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFhtbFJwY1Byb2R1Y3QocHJvZHVjdCk7CisKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0SGFzaCk7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKCJmaWxlbWdyLm1vZGlmeVByb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWNjZXNzOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RIYXNoKTsKKworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VjY2VzcyA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IucmVtb3ZlUHJvZHVjdCIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgRmlsZVRyYW5zZmVyU3RhdHVzIGdldEN1cnJlbnRGaWxlVHJhbnNmZXIoKQorICAgICAgICAgICAgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHN0YXR1c0hhc2ggPSBudWxsOworICAgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RhdHVzSGFzaCA9IChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImZpbGVtZ3IuZ2V0Q3VycmVudEZpbGVUcmFuc2ZlciIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1c0hhc2ggIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhdHVzID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZVRyYW5zZmVyU3RhdHVzRnJvbVhtbFJwYyhzdGF0dXNIYXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIExpc3Q8RmlsZVRyYW5zZmVyU3RhdHVzPiBnZXRDdXJyZW50RmlsZVRyYW5zZmVycygpCisgICAgICAgICAgICB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBzdGF0dXNWZWN0b3IgPSBudWxsOworICAgICAgICBMaXN0PEZpbGVUcmFuc2ZlclN0YXR1cz4gc3RhdHVzZXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF0dXNWZWN0b3IgPSAoVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImZpbGVtZ3IuZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcnMiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXNWZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhdHVzZXMgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRGaWxlVHJhbnNmZXJTdGF0dXNlc0Zyb21YbWxScGMoc3RhdHVzVmVjdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGF0dXNlczsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFByb2R1Y3RQY3RUcmFuc2ZlcnJlZChQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICAgICB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0SGFzaCk7CisgICAgICAgIERvdWJsZSBwY3QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwY3QgPSAoRG91YmxlKSBjbGllbnQuZXhlY3V0ZSgiZmlsZW1nci5nZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHBjdC5kb3VibGVWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC0xLjA7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRSZWZQY3RUcmFuc2ZlcnJlZChSZWZlcmVuY2UgcmVmZXJlbmNlKQorICAgICAgICAgICAgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiByZWZIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNSZWZlcmVuY2UocmVmZXJlbmNlKTsKKyAgICAgICAgYXJnTGlzdC5hZGQocmVmSGFzaCk7CisgICAgICAgIERvdWJsZSBwY3QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwY3QgPSAoRG91YmxlKSBjbGllbnQuZXhlY3V0ZSgiZmlsZW1nci5nZXRSZWZQY3RUcmFuc2ZlcnJlZCIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBjdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcGN0LmRvdWJsZVZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gLTEuMDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgcGFnZWRRdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSwgaW50IHBhZ2VOdW0pCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBxdWVyeUhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFhtbFJwY1F1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiB0eXBlSGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHF1ZXJ5SGFzaCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHR5cGVIYXNoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQobmV3IEludGVnZXIocGFnZU51bSkpOworCisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcGFnZUhhc2ggPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWdlSGFzaCA9IChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImZpbGVtZ3IucGFnZWRRdWVyeSIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0UGFnZUZyb21YbWxScGMocGFnZUhhc2gpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRGaXJzdFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFR5cGUodHlwZSkpOworCisgICAgICAgIFByb2R1Y3RQYWdlIHBhZ2UgPSBudWxsOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHBhZ2VIYXNoID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFnZUhhc2ggPSAoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJmaWxlbWdyLmdldEZpcnN0UGFnZSIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFnZUhhc2ggIT0gbnVsbCkgeworICAgICAgICAgICAgcGFnZSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdFBhZ2VGcm9tWG1sUnBjKHBhZ2VIYXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYWdlOworCisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldExhc3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RUeXBlKHR5cGUpKTsKKworICAgICAgICBQcm9kdWN0UGFnZSBwYWdlID0gbnVsbDsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwYWdlSGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhZ2VIYXNoID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRMYXN0UGFnZSIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFnZUhhc2ggIT0gbnVsbCkgeworICAgICAgICAgICAgcGFnZSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdFBhZ2VGcm9tWG1sUnBjKHBhZ2VIYXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYWdlOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXROZXh0UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyUGFnZSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RUeXBlKHR5cGUpKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0UGFnZShjdXJyUGFnZSkpOworCisgICAgICAgIFByb2R1Y3RQYWdlIHBhZ2UgPSBudWxsOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHBhZ2VIYXNoID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFnZUhhc2ggPSAoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJmaWxlbWdyLmdldE5leHRQYWdlIiwgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWdlSGFzaCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWdlID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0UGFnZUZyb21YbWxScGMocGFnZUhhc2gpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldFByZXZQYWdlKFByb2R1Y3RUeXBlIHR5cGUsIFByb2R1Y3RQYWdlIGN1cnJQYWdlKQorICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFR5cGUodHlwZSkpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RQYWdlKGN1cnJQYWdlKSk7CisKKyAgICAgICAgUHJvZHVjdFBhZ2UgcGFnZSA9IG51bGw7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcGFnZUhhc2ggPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWdlSGFzaCA9IChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImZpbGVtZ3IuZ2V0UHJldlBhZ2UiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhZ2VIYXNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhZ2UgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RQYWdlRnJvbVhtbFJwYyhwYWdlSGFzaCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGFkZFByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVJZCA9IG51bGw7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiB0eXBlSGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHR5cGVIYXNoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGVJZCA9IChTdHJpbmcpIGNsaWVudC5leGVjdXRlKCJmaWxlbWdyLmFkZFByb2R1Y3RUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RUeXBlSWQ7CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9kdWN0KFN0cmluZyBwcm9kdWN0TmFtZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3ROYW1lKTsKKworICAgICAgICBib29sZWFuIGhhc1Byb2R1Y3QgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFzUHJvZHVjdCA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IuaGFzUHJvZHVjdCIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhc1Byb2R1Y3Q7CisKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bVByb2R1Y3RzKFByb2R1Y3RUeXBlIHR5cGUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RUeXBlKHR5cGUpKTsKKworICAgICAgICBJbnRlZ2VyIG51bVByb2R1Y3RzID0gbmV3IEludGVnZXIoLTEpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBudW1Qcm9kdWN0cyA9IChJbnRlZ2VyKSBjbGllbnQuZXhlY3V0ZSgiZmlsZW1nci5nZXROdW1Qcm9kdWN0cyIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVtUHJvZHVjdHMuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRUb3BOUHJvZHVjdHMoaW50IG4pIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChuZXcgSW50ZWdlcihuKSk7CisKKyAgICAgICAgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IHRvcE5Qcm9kdWN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRvcE5Qcm9kdWN0cyA9IChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRUb3BOUHJvZHVjdHMiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxQcm9kdWN0PiB0b3BOUHJvZHVjdExpc3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RMaXN0RnJvbVhtbFJwYyh0b3BOUHJvZHVjdHMpOworICAgICAgICByZXR1cm4gdG9wTlByb2R1Y3RMaXN0OworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IGdldFRvcE5Qcm9kdWN0cyhpbnQgbiwgUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChuZXcgSW50ZWdlcihuKSk7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgYXJnTGlzdC5hZGQocHJvZHVjdFR5cGVIYXNoKTsKKworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gdG9wTlByb2R1Y3RzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG9wTlByb2R1Y3RzID0gKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJmaWxlbWdyLmdldFRvcE5Qcm9kdWN0cyIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFByb2R1Y3Q+IHRvcE5Qcm9kdWN0TGlzdCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdExpc3RGcm9tWG1sUnBjKHRvcE5Qcm9kdWN0cyk7CisgICAgICAgIHJldHVybiB0b3BOUHJvZHVjdExpc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0SGFzaCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKCJmaWxlbWdyLnNldFByb2R1Y3RUcmFuc2ZlclN0YXR1cyIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFhtbFJwY1Byb2R1Y3QocHJvZHVjdCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RIYXNoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IuYWRkUHJvZHVjdFJlZmVyZW5jZXMiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisKKyAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpKTsKKyAgICBhcmdMaXN0LmFkZChtZXRhZGF0YS5nZXRIYXNodGFibGUoKSk7CisKKyAgICB0cnkgeworICAgICAgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IuYWRkTWV0YWRhdGEiLCBhcmdMaXN0KTsKKyAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldCkKKyAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpKTsKKyAgICBhcmdMaXN0LmFkZChtZXQuZ2V0SGFzaHRhYmxlKCkpOworCisgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworICAgIHRyeSB7CisgICAgICByZXN1bHQgPSAoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IudXBkYXRlTWV0YWRhdGEiLCBhcmdMaXN0KTsKKyAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworCisgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgY2F0YWxvZ1Byb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpKTsKKworICAgICAgICBTdHJpbmcgcHJvZHVjdElkID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdElkID0gKFN0cmluZykgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IuY2F0YWxvZ1Byb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RJZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgYXJnTGlzdC5hZGQocHJvZHVjdEhhc2gpOworCisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gbWV0YWRhdGEgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtZXRhZGF0YSA9IChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgImZpbGVtZ3IuZ2V0TWV0YWRhdGEiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtLmFkZE1ldGFkYXRhKG1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIG07CisKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisgICAgcHVibGljIE1ldGFkYXRhIGdldFJlZHVjZWRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QsIExpc3Q8Pz4gZWxlbWVudHMpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgYXJnTGlzdC5hZGQocHJvZHVjdEhhc2gpOworICAgICAgICBhcmdMaXN0LmFkZChuZXcgVmVjdG9yKGVsZW1lbnRzKSk7CisKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBtZXRhZGF0YSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ldGFkYXRhID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRSZWR1Y2VkTWV0YWRhdGEiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtLmFkZE1ldGFkYXRhKG1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIG07CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoZmlsZVBhdGgpOworCisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdWNjZXNzID0gKChCb29sZWFuKSBjbGllbnQuZXhlY3V0ZSgiZmlsZW1nci5yZW1vdmVGaWxlIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgcHVibGljIGJ5dGVbXSByZXRyaWV2ZUZpbGUoU3RyaW5nIGZpbGVQYXRoLCBpbnQgb2Zmc2V0LCBpbnQgbnVtQnl0ZXMpCisgICAgICAgICB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHsKKyAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgIGFyZ0xpc3QuYWRkKGZpbGVQYXRoKTsKKyAgICAgIGFyZ0xpc3QuYWRkKG5ldyBJbnRlZ2VyKG9mZnNldCkpOworICAgICAgYXJnTGlzdC5hZGQobmV3IEludGVnZXIobnVtQnl0ZXMpKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgIHJldHVybiAoYnl0ZVtdKSBjbGllbnQuZXhlY3V0ZSgiZmlsZW1nci5yZXRyaWV2ZUZpbGUiLCBhcmdMaXN0KTsKKyAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgRGF0YVRyYW5zZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgfQorCisgICAgcHVibGljIHZvaWQgdHJhbnNmZXJGaWxlKFN0cmluZyBmaWxlUGF0aCwgYnl0ZVtdIGZpbGVEYXRhLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IG51bUJ5dGVzKSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChmaWxlUGF0aCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGZpbGVEYXRhKTsKKyAgICAgICAgYXJnTGlzdC5hZGQobmV3IEludGVnZXIob2Zmc2V0KSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKG5ldyBJbnRlZ2VyKG51bUJ5dGVzKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKCJmaWxlbWdyLnRyYW5zZmVyRmlsZSIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFUcmFuc2ZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0VHlwZUhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFhtbFJwY1Byb2R1Y3RUeXBlKHR5cGUpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0VHlwZUhhc2gpOworCisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBwcm9kdWN0VmVjdG9yID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFZlY3RvciA9IChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2R1Y3RWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0TGlzdEZyb21YbWxScGMocHJvZHVjdFZlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50c0J5UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0VHlwZSh0eXBlKTsKKworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0VHlwZUhhc2gpOworCisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBlbGVtZW50VmVjdG9yID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZWxlbWVudFZlY3RvciA9IChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRFbGVtZW50c0J5UHJvZHVjdFR5cGUiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbGVtZW50VmVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0RWxlbWVudExpc3RGcm9tWG1sUnBjKGVsZW1lbnRWZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGVsZW1lbnRJZCkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGVsZW1lbnRJZCk7CisKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBlbGVtZW50SGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW1lbnRIYXNoID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRFbGVtZW50QnlJZCIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVsZW1lbnRIYXNoID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0RWxlbWVudEZyb21YbWxScGMoZWxlbWVudEhhc2gpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChlbGVtZW50TmFtZSk7CisKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBlbGVtZW50SGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW1lbnRIYXNoID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRFbGVtZW50QnlOYW1lIiwgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZWxlbWVudEhhc2ggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRFbGVtZW50RnJvbVhtbFJwYyhlbGVtZW50SGFzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlOYW1lKFN0cmluZyBlbGVtZW50TmFtZSwgUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGVsZW1lbnROYW1lKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0VHlwZSh0eXBlKSk7CisKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBlbGVtZW50SGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW1lbnRIYXNoID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRFbGVtZW50QnlOYW1lIiwgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZWxlbWVudEhhc2ggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRFbGVtZW50RnJvbVhtbFJwYyhlbGVtZW50SGFzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxRdWVyeVJlc3VsdD4gY29tcGxleFF1ZXJ5KENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkpCisgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGNvbXBsZXhRdWVyeUhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRYbWxScGNDb21wbGV4UXVlcnkoY29tcGxleFF1ZXJ5KTsKKyAgICAgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKGNvbXBsZXhRdWVyeUhhc2gpOworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gcXVlcnlSZXN1bHRIYXNoVmVjdG9yID0gKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PikgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCJmaWxlbWdyLmNvbXBsZXhRdWVyeSIsIGFyZ0xpc3QpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFF1ZXJ5UmVzdWx0c0Zyb21YbWxScGMocXVlcnlSZXN1bHRIYXNoVmVjdG9yKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBxdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHF1ZXJ5SGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUXVlcnkocXVlcnkpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHR5cGVIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgYXJnTGlzdC5hZGQocXVlcnlIYXNoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQodHlwZUhhc2gpOworCisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBwcm9kdWN0VmVjdG9yID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFZlY3RvciA9IChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5xdWVyeSIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2R1Y3RWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0TGlzdEZyb21YbWxScGMocHJvZHVjdFZlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0VHlwZU5hbWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0VHlwZUhhc2ggPSAoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJmaWxlbWdyLmdldFByb2R1Y3RUeXBlQnlOYW1lIiwgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2R1Y3RUeXBlSGFzaCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVGcm9tWG1sUnBjKHByb2R1Y3RUeXBlSGFzaCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlJZChTdHJpbmcgcHJvZHVjdFR5cGVJZCkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0VHlwZUlkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGVIYXNoID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRQcm9kdWN0VHlwZUJ5SWQiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZHVjdFR5cGVIYXNoID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTGlzdDxQcm9kdWN0VHlwZT4gZ2V0UHJvZHVjdFR5cGVzKCkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gcHJvZHVjdFR5cGVWZWN0b3IgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0VHlwZVZlY3RvciA9IChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIGNsaWVudAorICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgiZmlsZW1nci5nZXRQcm9kdWN0VHlwZXMiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZHVjdFR5cGVWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVMaXN0RnJvbVhtbFJwYyhwcm9kdWN0VHlwZVZlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBwcm9kdWN0UmVmZXJlbmNlVmVjdG9yID0gbnVsbDsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgYXJnTGlzdC5hZGQocHJvZHVjdEhhc2gpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0UmVmZXJlbmNlVmVjdG9yID0gKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PikgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCJmaWxlbWdyLmdldFByb2R1Y3RSZWZlcmVuY2VzIiwgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9kdWN0UmVmZXJlbmNlVmVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlZmVyZW5jZXNGcm9tWG1sUnBjKHByb2R1Y3RSZWZlcmVuY2VWZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IG51bGw7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RJZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RIYXNoID0gKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAiZmlsZW1nci5nZXRQcm9kdWN0QnlJZCIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2F0YWxvZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZHVjdEhhc2ggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlOYW1lKFN0cmluZyBwcm9kdWN0TmFtZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IG51bGw7CisgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3ROYW1lKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdEhhc2ggPSAoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJmaWxlbWdyLmdldFByb2R1Y3RCeU5hbWUiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDYXRhbG9nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2R1Y3RIYXNoID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdEZyb21YbWxScGMocHJvZHVjdEhhc2gpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBpbmdlc3RQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEsCisgICAgICAgICAgICBib29sZWFuIGNsaWVudFRyYW5zZmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGluZ2VzdCBwcm9kdWN0CisgICAgICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RIYXNoID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKHByb2R1Y3RIYXNoKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKG1ldGFkYXRhLmdldEhhc2h0YWJsZSgpKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKEJvb2xlYW4udmFsdWVPZihjbGllbnRUcmFuc2ZlcikpOworICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IChTdHJpbmcpIGNsaWVudC5leGVjdXRlKCJmaWxlbWdyLmluZ2VzdFByb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKworICAgICAgICAgICAgaWYgKGNsaWVudFRyYW5zZmVyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBNYW5hZ2VyIENsaWVudDogY2xpZW50VHJhbnNmZXIgZW5hYmxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0cmFuc2ZlcmluZyBwcm9kdWN0IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIl0iKTsKKworICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHByb2R1Y3Qgb3Vyc2VsdmVzCisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIHByb2R1Y3QgSUQKKyAgICAgICAgICAgICAgICBpZiAocHJvZHVjdElkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVxdWVzdCB0byBpbmdlc3QgcHJvZHVjdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBubyBwcm9kdWN0IElEIHJldHVybmVkIGZyb20gRmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWFuYWdlciBpbmdlc3QiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVxdWVzdCB0byBpbmdlc3QgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gdXNpbmcgY2xpZW50IHRyYW5zZmVyLCBidXQgbm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRhdGFUcmFuc2ZlcmVyIHNwZWNpZmllZCEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZChwcm9kdWN0SWQpOworCisgICAgICAgICAgICAgICAgaWYgKCFCb29sZWFuLmdldEJvb2xlYW4oIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zZXJ2ZXJzaWRlLnZlcnNpb25pbmciKSkgeworICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiB0aGUgcHJvZHVjdAorICAgICAgICAgICAgICAgICAgVmVyc2lvbmVyIHZlcnNpb25lciA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lckZyb21DbGFzc05hbWUocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lcigpKTsKKyAgICAgICAgICAgICAgICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2R1Y3QsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXdseSB2ZXJzaW9uZWQgcmVmZXJlbmNlcyB0byB0aGUgZGF0YSBzdG9yZQorICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICBhZGRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5nZXN0UHJvZHVjdDogUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gYWRkaW5nIFByb2R1Y3QgUmVmZXJlbmNlcyBmb3IgUHJvZHVjdCA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBSZXBvc2l0b3J5TWFuYWdlcjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMoZ2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBub3cgdHJhbnNmZXIgdGhlIHByb2R1Y3QKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIudHJhbnNmZXJQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBwcm9kdWN0J3MgdHJhbnNmZXIgc3RhdHVzIGluIHRoZSBkYXRhCisgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Quc2V0VHJhbnNmZXJTdGF0dXMoUHJvZHVjdC5TVEFUVVNfUkVDRUlWRUQpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0VHJhbnNmZXJTdGF0dXMocHJvZHVjdCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmdlc3RQcm9kdWN0OiBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHVwZGF0aW5nIHByb2R1Y3QgdHJhbnNmZXIgc3RhdHVzIGZvciBQcm9kdWN0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZ2VzdFByb2R1Y3Q6IERhdGFUcmFuc2ZlckV4Y2VwdGlvbiB3aGVuIHRyYW5zZmVyaW5nIFByb2R1Y3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhVHJhbnNmZXJFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdElkOworCisgICAgICAgICAgICAvLyBlcnJvciB2ZXJzaW9uaW5nIGZpbGUKKyAgICAgICAgfSBjYXRjaCAoVmVyc2lvbmluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgImluZ2VzdFByb2R1Y3Q6IFZlcnNpb25pbmdFeGNlcHRpb24gd2hlbiB2ZXJzaW9uaW5nIFByb2R1Y3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIiB3aXRoIFZlcnNpb25lciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRWZXJzaW9uZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25pbmdFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gaW5nZXN0IHByb2R1Y3QgWyIgKyBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICsgIl0gOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiIC0tIHJvbGxpbmcgYmFjayBpbmdlc3QiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2ggPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjUHJvZHVjdChwcm9kdWN0KTsKKyAgICAgICAgICAgICAgICBhcmdMaXN0LmFkZChwcm9kdWN0SGFzaCk7CisgICAgICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGUoImZpbGVtZ3IucmVtb3ZlUHJvZHVjdCIsIGFyZ0xpc3QpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gcm9sbGJhY2sgaW5nZXN0IG9mIHByb2R1Y3QgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdCArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBpbmdlc3QgcHJvZHVjdCBbIiArIHByb2R1Y3QgKyAiXSA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRDYXRhbG9nVmFsdWVzKE1ldGFkYXRhIG1ldGFkYXRhLCBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxScGNFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJncyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBhcmdzLmFkZChtZXRhZGF0YS5nZXRIYXNodGFibGUoKSk7CisgICAgICAgIGFyZ3MuYWRkKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFR5cGUocHJvZHVjdFR5cGUpKTsKKworICAgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG0uYWRkTWV0YWRhdGEoKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIHRoaXMuY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgImZpbGVtZ3IuZ2V0Q2F0YWxvZ1ZhbHVlcyIsIGFyZ3MpKTsKKworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0T3JpZ1ZhbHVlcyhNZXRhZGF0YSBtZXRhZGF0YSwgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgWG1sUnBjRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgYXJncy5hZGQobWV0YWRhdGEuZ2V0SGFzaHRhYmxlKCkpOworICAgICAgICBhcmdzLmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RUeXBlKHByb2R1Y3RUeXBlKSk7CisKKyAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtLmFkZE1ldGFkYXRhKChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSB0aGlzLmNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICJmaWxlbWdyLmdldE9yaWdWYWx1ZXMiLCBhcmdzKSk7CisKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFF1ZXJ5IGdldENhdGFsb2dRdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpCisgICAgICAgICAgICB0aHJvd3MgWG1sUnBjRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ3MgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgYXJncy5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNRdWVyeShxdWVyeSkpOworICAgICAgICBhcmdzLmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3RUeXBlKHByb2R1Y3RUeXBlKSk7CisgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFF1ZXJ5RnJvbVhtbFJwYygoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgdGhpcy5jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCJmaWxlbWdyLmdldENhdGFsb2dRdWVyeSIsIGFyZ3MpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgQ21kTGluZVV0aWxpdHkgY21kTGluZVV0aWxpdHkgPSBuZXcgQ21kTGluZVV0aWxpdHkoKTsKKyAgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWxlTWFuYWdlclVybC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldEZpbGVNYW5hZ2VyVXJsKCkgeworICAgICAgICByZXR1cm4gZmlsZU1hbmFnZXJVcmw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGZpbGVNYW5hZ2VyVXJsCisgICAgICogICAgICAgICAgICBUaGUgZmlsZU1hbmFnZXJVcmwgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNYW5hZ2VyVXJsKFVSTCBmaWxlTWFuYWdlclVybCkgeworICAgICAgICB0aGlzLmZpbGVNYW5hZ2VyVXJsID0gZmlsZU1hbmFnZXJVcmw7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlIGNsaWVudAorICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBYbWxScGNDbGllbnQoZmlsZU1hbmFnZXJVcmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGF0YVRyYW5zZmVyLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhVHJhbnNmZXIgZ2V0RGF0YVRyYW5zZmVyKCkgeworICAgICAgICByZXR1cm4gZGF0YVRyYW5zZmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkYXRhVHJhbnNmZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBkYXRhVHJhbnNmZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGFUcmFuc2ZlcihEYXRhVHJhbnNmZXIgZGF0YVRyYW5zZmVyKSB7CisgICAgICAgIHRoaXMuZGF0YVRyYW5zZmVyID0gZGF0YVRyYW5zZmVyOworICAgICAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXRGaWxlTWFuYWdlclVybCh0aGlzLmZpbGVNYW5hZ2VyVXJsKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vYXV0aC9EaXNwYXRjaGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL2F1dGgvRGlzcGF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDY4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL2F1dGgvRGlzcGF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uYXV0aDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgZ3VhcmQgdG8gZW5zdXJlIHRoYXQgYW55IFhNTC1SUEMgbWV0aG9kIGNhbGxlZCBmb3IgdGhlIGZpbGVtZ3Igc2VydmVyIGlzCisgKiBwcm9wZXJseSBhdXRoZW50aWNhdGVkIHdpdGggYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCisgKiAKKyAqIAorICogQGF1dGhvciBrZWxseQorICovCitwdWJsaWMgaW50ZXJmYWNlIERpc3BhdGNoZXIgeworCisgICAgLyoqCisgICAgICogSGFuZGxlcyBhbiBYTUwtUlBDIHJlcXVlc3QsIHByb3ZpZGVkIHRoYXQgdGhlIGdpdmVuIDxjb2RlPnVzZXI8L2NvZGU+bmFtZQorICAgICAqIGFuZCA8Y29kZT5wYXNzd29yZDwvY29kZT4gYXJlIGNvcnJlY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG1ldGhvZFNwZWNpZmllcgorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFhNTC1SUEMgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgdG8gdGhlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdXNlcgorICAgICAqICAgICAgICAgICAgVGhlIHVzZXIgbmFtZSB3aG8gaXMgY2FsbGluZyB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBwYXNzd29yZAorICAgICAqICAgICAgICAgICAgVGhlIHVzZXIncyBwYXNzd29yZC4KKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0IGhhbmRsZVJlcXVlc3QoU3RyaW5nIG1ldGhvZFNwZWNpZmllciwgTGlzdCBwYXJhbXMsCisgICAgICAgICAgICBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N5c3RlbS9hdXRoL1Jlc3VsdC5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N5c3RlbS9hdXRoL1Jlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjQ0M2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL2F1dGgvUmVzdWx0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5hdXRoOworCisvKioKKyAqIEEgUHl0aG9uLWZyaWVuZGx5IHdyYXBwZXIgdGhhdCB3cmFwcyBhbiBYTUwtUlBDIHJlc3VsdC4KKyAqIAorICogQGF1dGhvciBrZWxseQorICovCitwdWJsaWMgY2xhc3MgUmVzdWx0IHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGtpbmQKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSByZXR1cm4gcmVzdWx0LgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgVGhlIHJlc3VsdCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdChDbGFzcyBraW5kLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoa2luZCAhPSBudWxsKSB7CisgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yID0ga2luZC5nZXRDb25zdHJ1Y3RvcihBUkdTKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByZXN1bHQgdmFsdWUuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gQVJHUyA9IHsgU3RyaW5nLmNsYXNzIH07Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL2F1dGgvU2VjdXJlV2ViU2VydmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL2F1dGgvU2VjdXJlV2ViU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmYzg2MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vYXV0aC9TZWN1cmVXZWJTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLmF1dGg7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vWE1MLVJQQyBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuQXV0aGVudGljYXRlZFhtbFJwY0hhbmRsZXI7CisKKy8qKgorICogQW4gWE1MLVJQQyBXZWIgU2VydmVyIHRoYXQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24uCisgKiAKKyAqIEBhdXRob3Iga2VsbHkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlY3VyZVdlYlNlcnZlciBleHRlbmRzIG9yZy5hcGFjaGUueG1scnBjLldlYlNlcnZlcgorICAgICAgICBpbXBsZW1lbnRzIEF1dGhlbnRpY2F0ZWRYbWxScGNIYW5kbGVyIHsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBYTUwtUlBDIHdlYiBzZXJ2ZXIgb24gdGhlIGdpdmVuIDxjb2RlPnBvcnQ8L2NvZGU+IGFuZAorICAgICAqIGFkZHMgYSBkZWZhdWx0IGhhbmRsZXIgdGhhdCB0cmFwcyBhbGwgY2FsbHMgYW5kIG1ha2VzIHRoZW0gYXV0aGVudGljYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9ydAorICAgICAqICAgICAgICAgICAgVGhlIHBvcnQgdG8gcnVuIHRoZSBYTUwtUlBDIHdlYnNlcnZlciBvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJlV2ViU2VydmVyKGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcihwb3J0KTsKKyAgICAgICAgYWRkSGFuZGxlcigiJGRlZmF1bHQiLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgWE1MLVJQQyBtZXRob2QsIGZpcnN0IGF1dGhlbnRpY2F0aW5nIHRoZSBnaXZlbiB1c2VyIGFuZAorICAgICAqIGF1dGhvcml6aW5nIGhpbSBiYXNlZCBvbiBoaXMgcm9sZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG1ldGhvZFNwZWNpZmllcgorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIFhNTC1SUEMgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHBhcmFtcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBtZXRob2QuCisgICAgICogQHVzZXIgVGhlIHVzZXJuYW1lIHRvIGF1dGhlbnRpY2F0ZSB0byBjYWxsIHRoZSBtZXRob2QuCisgICAgICogQHBhc3MgVGhlIHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIHVzZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBleGVjdXRlKFN0cmluZyBtZXRob2RTcGVjaWZpZXIsIFZlY3RvciBwYXJhbXMsIFN0cmluZyB1c2VyLAorICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGlzcGF0Y2hlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBSZXN1bHQgcmMgPSAoKERpc3BhdGNoZXIpIGkubmV4dCgpKS5oYW5kbGVSZXF1ZXN0KG1ldGhvZFNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCB1c2VyLCBwYXNzd29yZCk7CisgICAgICAgICAgICBpZiAocmMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmMuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJObyByZXF1ZXN0IGRpc3BhdGNoZXIgd2FzIGFibGUgdG8gcmV0dXJuIGEgbm9uLW51bGwgdmFsdWUgdG8gdGhlIFhNTC1SUEMgY2FsbGVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBhdXRoZW50aWNhdGVkIFhNTC1SUEMgZGlzcGF0Y2hlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzcGF0Y2hlcgorICAgICAqICAgICAgICAgICAgVGhlIGRpc3BhdGNoZXIgdG8gYWRkIHdoaWNoIHdpbGwgc2VydmljZSB0aGUgYXV0aGVudGljYXRlZAorICAgICAqICAgICAgICAgICAgWE1MLVJQQyBtZXRob2QgY2FsbHMKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaXNwYXRjaGVyKERpc3BhdGNoZXIgZGlzcGF0Y2hlcikgeworICAgICAgICBpZiAoZGlzcGF0Y2hlciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5vbi1udWxsIGRpc3BhdGNoZXJzIGFyZSBpbGxlZ2FsIik7CisgICAgICAgIGRpc3BhdGNoZXJzLmFkZChkaXNwYXRjaGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgZGlzcGF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvQ0FTQW5hbHl6ZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9DQVNBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODgzYmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvQ0FTQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL0x1Y2VuZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuU3RvcEFuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlN0b3BGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuV2hpdGVzcGFjZVRva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5TdGFuZGFyZEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5TdGFuZGFyZFRva2VuaXplcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBhbmFseXplciB1c2VkIGluIHRoZSBDYXRhbG9nU2VhcmNoIHByb2dyYW0uCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIENBU0FuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIgeworICAgIHByaXZhdGUgU2V0IHN0b3BTZXQ7CisKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHNvbWUgY29tbW9uIEVuZ2xpc2ggd29yZHMgdGhhdCBhcmUgdXN1YWxseSBub3QgdXNlZnVsCisgICAgICogZm9yIHNlYXJjaGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNUT1BfV09SRFMgPSBTdG9wQW5hbHl6ZXIuRU5HTElTSF9TVE9QX1dPUkRTOworCisgICAgLyoqIEJ1aWxkcyBhbiBhbmFseXplci4gKi8KKyAgICBwdWJsaWMgQ0FTQW5hbHl6ZXIoKSB7CisgICAgICAgIHRoaXMoU1RPUF9XT1JEUyk7CisgICAgfQorCisgICAgLyoqIEJ1aWxkcyBhbiBhbmFseXplciB3aXRoIHRoZSBnaXZlbiBzdG9wIHdvcmRzLiAqLworICAgIHB1YmxpYyBDQVNBbmFseXplcihTdHJpbmdbXSBzdG9wV29yZHMpIHsKKyAgICAgICAgc3RvcFNldCA9IFN0b3BGaWx0ZXIubWFrZVN0b3BTZXQoc3RvcFdvcmRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIFN0YW5kYXJkVG9rZW5pemVyfSBmaWx0ZXJlZCBieSBhIHtAbGluaworICAgICAqIFN0YW5kYXJkRmlsdGVyfSwgYSB7QGxpbmsgTG93ZXJDYXNlRmlsdGVyfSBhbmQgYSB7QGxpbmsgU3RvcEZpbHRlcn0uCisgICAgICovCisgICAgcHVibGljIFRva2VuU3RyZWFtIHRva2VuU3RyZWFtKFN0cmluZyBmaWVsZE5hbWUsIFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgVG9rZW5TdHJlYW0gcmVzdWx0ID0gbmV3IFdoaXRlc3BhY2VUb2tlbml6ZXIocmVhZGVyKTsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFN0YW5kYXJkRmlsdGVyKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IG5ldyBTdG9wRmlsdGVyKHJlc3VsdCwgc3RvcFNldCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL0NhdGFsb2dTZWFyY2guamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9DYXRhbG9nU2VhcmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxOWE4ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9DYXRhbG9nU2VhcmNoLmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29sczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL0x1Y2VuZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlci5RdWVyeVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guQm9vbGVhbkNsYXVzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guQm9vbGVhblF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5QaHJhc2VRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlJhbmdlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlRlcm1RdWVyeTsKKworLyoqCisgKiAKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGNvbW1hbmQgbGluZS1zZWFyY2ggdG9vbCBmb3IgdGhlIEZpbGUgTWFuYWdlci4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1NlYXJjaCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBRdWVyeVBhcnNlciBwYXJzZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnJlZVRleHRCbG9jayA9ICJfX0ZSRUVfXyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJvZHVjdEZpbHRlciA9ICIiOworCisgICAgcHVibGljIENhdGFsb2dTZWFyY2goKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFBvc3RRdWVyeSgKKyAgICAgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGNhc1F1ZXJ5KSB7CisgICAgICAgIFZlY3RvciBwcm9kdWN0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RzID0gKFZlY3RvcikgY2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJFcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBwcm9kdWN0IHR5cGVzIGZyb20gdGhlIEZpbGUgTWFuYWdlci4iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9kdWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUG9zdFF1ZXJ5KCgoUHJvZHVjdFR5cGUpIHByb2R1Y3RzLmdldChpKSkuZ2V0UHJvZHVjdFR5cGVJZCgpLAorICAgICAgICAgICAgICAgICAgICBjYXNRdWVyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUG9zdFF1ZXJ5KFN0cmluZyBwcm9kdWN0LAorICAgICAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkgY2FzUXVlcnkpIHsKKyAgICAgICAgVmVjdG9yIHJlc3VsdHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGUgPSBjbGllbnQuZ2V0UHJvZHVjdFR5cGVCeUlkKHByb2R1Y3QpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBhY2Nlc3MgUHJvZHVjdCBUeXBlIGluZm9ybWF0aW9uIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzdWx0cyA9IChWZWN0b3IpIGNsaWVudC5xdWVyeShjYXNRdWVyeSwgcHJvZHVjdFR5cGUpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBxdWVyeWluZyB0aGUgRmlsZSBNYW5hZ2VyIik7CisgICAgICAgICAgICBpZ25vcmUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gUHJvZHVjdHMgRm91bmQgTWF0Y2hpbmcgVGhpcyBDcml0ZXJpYS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZHVjdHMgTWF0Y2hpbmcgUXVlcnkiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoKChQcm9kdWN0KSByZXN1bHRzLmdldChpKSkuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHQiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKChQcm9kdWN0KSByZXN1bHRzLmdldChpKSkuZ2V0UHJvZHVjdElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKSB7CisgICAgICAgIHByb2R1Y3RGaWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQuZ2V0UHJvZHVjdFR5cGVCeUlkKGZpbHRlcik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gcHJvZHVjdCBmb3VuZCB3aXRoIElEOiAiICsgZmlsdGVyKTsKKyAgICAgICAgICAgIHByb2R1Y3RGaWx0ZXIgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXByb2R1Y3RGaWx0ZXIuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsdGVyaW5nIGZvciAiICsgcHJvZHVjdEZpbHRlciArICIgcHJvZHVjdHMuIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpbHRlcigpIHsKKyAgICAgICAgcHJvZHVjdEZpbHRlciA9ICIiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBMaXN0UHJvZHVjdHMoKSB7CisgICAgICAgIFZlY3RvciBwcm9kdWN0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RzID0gKFZlY3RvcikgY2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJFcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBwcm9kdWN0IHR5cGVzIGZyb20gdGhlIEZpbGUgTWFuYWdlci4iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9kdWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgoKFByb2R1Y3RUeXBlKSBwcm9kdWN0cy5nZXQoaSkpLmdldFByb2R1Y3RUeXBlSWQoKQorICAgICAgICAgICAgICAgICAgICArICJcdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCgoUHJvZHVjdFR5cGUpIHByb2R1Y3RzLmdldChpKSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsaXN0RWxlbWVudHMoKSB7CisgICAgICAgIFZlY3RvciBwcm9kdWN0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RzID0gKFZlY3RvcikgY2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9kdWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGxpc3RFbGVtZW50cygoKFByb2R1Y3RUeXBlKSBwcm9kdWN0cy5nZXQoaSkpLmdldFByb2R1Y3RUeXBlSWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIkVycm9yIGdldHRpbmcgYXZhaWxhYmxlIHByb2R1Y3QgdHlwZXMgZnJvbSB0aGUgRmlsZSBNYW5hZ2VyLiIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxpc3RFbGVtZW50cyhTdHJpbmcgcHJvZElEKSB7CisgICAgICAgIFZlY3RvciBlbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHlwZSA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZElEKTsKKyAgICAgICAgICAgIGVsZW1lbnRzID0gKFZlY3RvcikgY2xpZW50LmdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGZpbmQgYSBQcm9kdWN0VHlwZSB3aXRoIHRoZSBJRDogIgorICAgICAgICAgICAgICAgICAgICArIHByb2RJRCk7CisgICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRWxlbWVudCBlID0gKEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoZS5nZXRFbGVtZW50SWQoKSArICJcdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkgeworICAgICAgICBTdHJpbmcgYWRkX2ZpbHRlciA9ICJhZGQgZmlsdGVyIFtwcm9kdWN0VHlwZV1cbiI7CisgICAgICAgIGFkZF9maWx0ZXIgKz0gIlx0QWRkIGEgZmlsdGVyIG9uIHF1ZXJ5IHJlc3VsdHMgdG8gb25seSByZXR1cm4gcHJvZHVjdHNcbiI7CisgICAgICAgIGFkZF9maWx0ZXIgKz0gIlx0bWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwcm9kdWN0VHlwZS4iOworCisgICAgICAgIFN0cmluZyByZW1vdmVfZmlsdGVyID0gInJlbW92ZSBmaWx0ZXJcbiI7CisgICAgICAgIHJlbW92ZV9maWx0ZXIgKz0gIlx0UmVtb3ZlIGZpbHRlcnMgb24gcXVlcnkgcmVzdWx0cy4iOworCisgICAgICAgIFN0cmluZyBnZXRfcHJvZHVjdHMgPSAiZ2V0IHByb2R1Y3RzXG4iOworICAgICAgICBnZXRfcHJvZHVjdHMgKz0gIlx0UmV0dXJucyBhbGwgUHJvZHVjdFR5cGVJRHMga25vd24gdG8gdGhlIFJlcG9zaXRvcnkuIjsKKworICAgICAgICBTdHJpbmcgZ2V0X2VsZW1lbnRzID0gImdldCBlbGVtZW50c1xuIjsKKyAgICAgICAgZ2V0X2VsZW1lbnRzICs9ICJcdFJldHVybnMgYWxsIEVsZW1lbnRzIGtub3duIHRvIHRoZSBWYWxpZGF0aW9uIExheWVyLiI7CisKKyAgICAgICAgU3RyaW5nIGdldF9lbGVtZW50c19mb3JfcHJvZHVjdCA9ICJnZXQgZWxlbWVudHMgZm9yIFtwcm9kdWN0VHlwZV1cbiI7CisgICAgICAgIGdldF9lbGVtZW50c19mb3JfcHJvZHVjdCArPSAiXHRSZXR1cm5zIGFsbCBFbGVtZW50cyBrbm93biB0byB0aGUgIjsKKyAgICAgICAgZ2V0X2VsZW1lbnRzX2Zvcl9wcm9kdWN0ICs9ICJWYWxpZGF0aW9uIExheWVyXG5cdGZvciB0aGUgc3BlY2lmaWVkICI7CisgICAgICAgIGdldF9lbGVtZW50c19mb3JfcHJvZHVjdCArPSAicHJvZHVjdFR5cGUuIjsKKworICAgICAgICBTdHJpbmcgcXVlcnkgPSAicXVlcnkgW3F1ZXJ5XVxuIjsKKyAgICAgICAgcXVlcnkgKz0gIlx0UXVlcmllcyB0aGUgQ2F0YWxvZyBmb3IgYWxsIHByb2R1Y3RzIG1hdGNoaW5nIHRoZSBcbiI7CisgICAgICAgIHF1ZXJ5ICs9ICJcdHNwZWNpZmllZCBxdWVyeS4gSWYgdGhlIGZpbHRlciBpcyBzZXQsIG9ubHkgcHJvZHVjdHNcbiI7CisgICAgICAgIHF1ZXJ5ICs9ICJcdG1hdGNoaW5nIHRoZSBwcm9kdWN0VHlwZSBzZXQgaW4gdGhlIGZpbHRlciB3aWxsIGJlXG4iOworICAgICAgICBxdWVyeSArPSAiXHRyZXR1cm5lZC4gTW9yZSBkZXRhaWxzIGFib3V0IHF1ZXJ5IHN5bnRheCBjYW4gYmUgZm91bmRcbiI7CisgICAgICAgIHF1ZXJ5ICs9ICJcdGF0IGh0dHA6Ly9sdWNlbmUuYXBhY2hlLm9yZy9qYXZhL2RvY3MvcXVlcnlwYXJzZXJzeW50YXguaHRtbCI7CisKKyAgICAgICAgU3RyaW5nIHF1aXQgPSAicXVpdFxuIjsKKyAgICAgICAgcXVpdCArPSAiXHRFeGl0cyB0aGUgcHJvZ3JhbS4iOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXZhaWxhYmxlIENvbW1hbmRzOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYWRkX2ZpbHRlcik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZW1vdmVfZmlsdGVyKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldF9wcm9kdWN0cyk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRfZWxlbWVudHMpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0X2VsZW1lbnRzX2Zvcl9wcm9kdWN0KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHF1ZXJ5KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHF1aXQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUXVlcnkgUGFyc2VRdWVyeShTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgLy8gbm90ZSB0aGF0ICJfX0ZSRUVfXyIgaXMgYSBjb250cm9sIHdvcmsgZm9yIGZyZWUgdGV4dCBzZWFyY2hpbmcKKyAgICAgICAgcGFyc2VyID0gbmV3IFF1ZXJ5UGFyc2VyKGZyZWVUZXh0QmxvY2ssIG5ldyBDQVNBbmFseXplcigpKTsKKyAgICAgICAgUXVlcnkgbHVjZW5lUSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsdWNlbmVRID0gKFF1ZXJ5KSBwYXJzZXIucGFyc2UocXVlcnkpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgcXVlcnkgdGV4dC4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbHVjZW5lUTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgR2VuZXJhdGVDQVNRdWVyeSgKKyAgICAgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGNhc1F1ZXJ5LAorICAgICAgICAgICAgUXVlcnkgbHVjZW5lUXVlcnkpIHsKKyAgICAgICAgaWYgKGx1Y2VuZVF1ZXJ5IGluc3RhbmNlb2YgVGVybVF1ZXJ5KSB7CisgICAgICAgICAgICBUZXJtIHQgPSAoKFRlcm1RdWVyeSkgbHVjZW5lUXVlcnkpLmdldFRlcm0oKTsKKyAgICAgICAgICAgIGlmICh0LmZpZWxkKCkuZXF1YWxzKGZyZWVUZXh0QmxvY2spKSB7CisgICAgICAgICAgICAgICAgLy8gaWYoY2FzUXVlcnkuZ2V0Q3JpdGVyaWEoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgLy8gY2FzUXVlcnkuYWRkQ3JpdGVyaW9uKG5ldyBGcmVlVGV4dFF1ZXJ5Q3JpdGVyaWEoKSk7CisgICAgICAgICAgICAgICAgLy8gKChGcmVlVGV4dFF1ZXJ5Q3JpdGVyaWEpY2FzUXVlcnkuZ2V0Q3JpdGVyaWEoKS5nZXQoMCkpLmFkZFZhbHVlKHQudGV4dCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FzUXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDcml0ZXJpb24obmV3IFRlcm1RdWVyeUNyaXRlcmlhKHQuZmllbGQoKSwgdC50ZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsdWNlbmVRdWVyeSBpbnN0YW5jZW9mIFBocmFzZVF1ZXJ5KSB7CisgICAgICAgICAgICBUZXJtW10gdCA9ICgoUGhyYXNlUXVlcnkpIGx1Y2VuZVF1ZXJ5KS5nZXRUZXJtcygpOworICAgICAgICAgICAgaWYgKHRbMF0uZmllbGQoKS5lcXVhbHMoZnJlZVRleHRCbG9jaykpIHsKKyAgICAgICAgICAgICAgICAvLyBpZihjYXNRdWVyeS5nZXRDcml0ZXJpYSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAvLyBjYXNRdWVyeS5hZGRDcml0ZXJpb24obmV3IEZyZWVUZXh0UXVlcnlDcml0ZXJpYSgpKTsKKyAgICAgICAgICAgICAgICAvLyBmb3IoaW50IGk9MDtpPHQubGVuZ3RoO2krKykKKyAgICAgICAgICAgICAgICAvLyAoKEZyZWVUZXh0UXVlcnlDcml0ZXJpYSljYXNRdWVyeS5nZXRDcml0ZXJpYSgpLmdldCgwKSkuYWRkVmFsdWUodFtpXS50ZXh0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNhc1F1ZXJ5LmFkZENyaXRlcmlvbihuZXcgVGVybVF1ZXJ5Q3JpdGVyaWEodFtpXS5maWVsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbaV0udGV4dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobHVjZW5lUXVlcnkgaW5zdGFuY2VvZiBSYW5nZVF1ZXJ5KSB7CisgICAgICAgICAgICBUZXJtIHN0YXJ0VCA9ICgoUmFuZ2VRdWVyeSkgbHVjZW5lUXVlcnkpLmdldExvd2VyVGVybSgpOworICAgICAgICAgICAgVGVybSBlbmRUID0gKChSYW5nZVF1ZXJ5KSBsdWNlbmVRdWVyeSkuZ2V0VXBwZXJUZXJtKCk7CisgICAgICAgICAgICBjYXNRdWVyeS5hZGRDcml0ZXJpb24obmV3IFJhbmdlUXVlcnlDcml0ZXJpYShzdGFydFQuZmllbGQoKSwgc3RhcnRUCisgICAgICAgICAgICAgICAgICAgIC50ZXh0KCksIGVuZFQudGV4dCgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAobHVjZW5lUXVlcnkgaW5zdGFuY2VvZiBCb29sZWFuUXVlcnkpIHsKKyAgICAgICAgICAgIEJvb2xlYW5DbGF1c2VbXSBjbGF1c2VzID0gKChCb29sZWFuUXVlcnkpIGx1Y2VuZVF1ZXJ5KS5nZXRDbGF1c2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXVzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBHZW5lcmF0ZUNBU1F1ZXJ5KGNhc1F1ZXJ5LCAoY2xhdXNlc1tpXSkuZ2V0UXVlcnkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIFBhcnNpbmcgUXVlcnkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDb21tYW5kUGFyc2VyKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbW1hbmQsICIgIik7CisgICAgICAgIGludCB0b2tDb3VudCA9IHRvay5jb3VudFRva2VucygpOworCisgICAgICAgIGlmICh0b2tDb3VudCA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBjb20gPSB0b2submV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoY29tLmVxdWFsc0lnbm9yZUNhc2UoImdldCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRva0NvdW50ID4gMSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViY29tID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ViY29tLmVxdWFsc0lnbm9yZUNhc2UoInByb2R1Y3RzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3RQcm9kdWN0cygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YmNvbS5lcXVhbHNJZ25vcmVDYXNlKCJlbGVtZW50cyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rQ291bnQgPT0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0b2submV4dFRva2VuKCkuZXF1YWxzSWdub3JlQ2FzZSgiZm9yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZEVsZW1lbnRzID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RFbGVtZW50cyhwcm9kRWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rQ291bnQgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgY29tbWFuZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwYXJzaW5nIGNvbW1hbmQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tLmVxdWFsc0lnbm9yZUNhc2UoImFkZCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRva0NvdW50ID09IDMgJiYgdG9rLm5leHRUb2tlbigpLmVxdWFsc0lnbm9yZUNhc2UoImZpbHRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEZpbHRlcih0b2submV4dFRva2VuKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgcGFyc2luZyBjb21tYW5kIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbS5lcXVhbHNJZ25vcmVDYXNlKCJyZW1vdmUiKSkgeworICAgICAgICAgICAgICAgIGlmICh0b2tDb3VudCA9PSAyICYmIHRvay5uZXh0VG9rZW4oKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWx0ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgY29tbWFuZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb20uZXF1YWxzSWdub3JlQ2FzZSgiaGVscCIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRIZWxwKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbS5lcXVhbHNJZ25vcmVDYXNlKCJleGl0IikKKyAgICAgICAgICAgICAgICAgICAgfHwgY29tLmVxdWFsc0lnbm9yZUNhc2UoInF1aXQiKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdGluZy4uLiIpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb20uZXF1YWxzSWdub3JlQ2FzZSgicXVlcnkiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSB0b2submV4dFRva2VuKCkgKyAiICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicXVlcnlpbmcgZm9yOiAiICsgcXVlcnkpOworICAgICAgICAgICAgICAgIFF1ZXJ5IHBhcnNlZFF1ZXJ5ID0gUGFyc2VRdWVyeShxdWVyeSk7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkgY2FzUXVlcnkgPSBuZXcgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkoKTsKKworICAgICAgICAgICAgICAgIEdlbmVyYXRlQ0FTUXVlcnkoY2FzUXVlcnksIHBhcnNlZFF1ZXJ5KTsKKyAgICAgICAgICAgICAgICBQb3N0UXVlcnkocHJvZHVjdEZpbHRlciwgY2FzUXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisgICAgICAgIFN0cmluZyBmaWxlTWFuYWdlclVybCA9IG51bGw7CisgICAgICAgIFN0cmluZyB3ZWxjb21lTWVzc2FnZSA9ICJDYXRhbG9nU2VhcmNoIHYwLjFcbiI7CisgICAgICAgIHdlbGNvbWVNZXNzYWdlICs9ICJDb3B5cmlnaHQgMjAwNi4gQ2FsaWZvcm5pYSBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neS5cbiI7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJDYXRhbG9nU2VhcmNoIC0tdXJsIDx1cmwgdG8gRmlsZSBNYW5hZ2VyIHNlcnZpY2U+XG4iOworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CisgICAgICAgIENhdGFsb2dTZWFyY2ggY3MgPSBuZXcgQ2F0YWxvZ1NlYXJjaCgpOworCisgICAgICAgIC8vIGRldGVybWluZSB1cmwKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdXJsIikpIHsKKyAgICAgICAgICAgICAgICBmaWxlTWFuYWdlclVybCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlTWFuYWdlclVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25uZWN0IHdpdGggRmlsZW1nciBDbGllbnQKKyAgICAgICAgYm9vbGVhbiBjbGllbnRDb25uZWN0ID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKGZpbGVNYW5hZ2VyVXJsKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJFeGNlcHRpb24gd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggZmlsZSBtYW5hZ2VyLCBlcnJvcnMgdG8gZm9sbG93OiBtZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBjbGllbnRDb25uZWN0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpZW50Q29ubmVjdCkgeworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od2VsY29tZU1lc3NhZ2UpOworCisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICIiOworCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiQ2F0YWxvZ1NlYXJjaD4iKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBpbi5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICBDb21tYW5kUGFyc2VyKGNvbW1hbmQpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuRXJyb3IgUmVhZGluZyBRdWVyeVxuIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9EZWxldGVQcm9kdWN0LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvRGVsZXRlUHJvZHVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmIyMzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvRGVsZXRlUHJvZHVjdC5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuRGF0YVRyYW5zZmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHV0aWxpdHkgY2xhc3MgdGhhdCBkZWxldGVzIHByb2R1Y3RzIGluIHRoZSBGaWxlIE1hbmFnZXIgQ2F0YWxvZyBiYXNlZCBvbgorICogcHJvZHVjdElELgorICogPC9wPgorICogCisgKi8KK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgRGVsZXRlUHJvZHVjdCB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERlbGV0ZVByb2R1Y3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciBGaWxlIE1hbmFnZXIgY2xpZW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gbnVsbDsKKworICAgIC8qIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjb21taXQgb3VyIGRlbGV0aW9ucyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb21taXQgPSB0cnVlOworCisgICAgcHVibGljIERlbGV0ZVByb2R1Y3QoU3RyaW5nIGZpbGVNYW5hZ2VyVXJsLCBib29sZWFuIGNvbW1pdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZmlsZU1hbmFnZXJVcmwpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIG1hbmFnZXIgY2xpZW50OiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSArICI6IGVycm9ycyB0byBmb2xsb3ciKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY29tbWl0ID0gY29tbWl0OworCisgICAgICAgIGlmICghdGhpcy5jb21taXQpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNvbW1pdCBkaXNhYmxlZC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNvbW1pdCBlbmFibGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSBudWxsOworICAgICAgICBTdHJpbmcgZmlsZU1hbmFnZXJVcmwgPSBudWxsOworICAgICAgICBib29sZWFuIGNvbW1pdENoYW5nZXMgPSB0cnVlOworICAgICAgICBib29sZWFuIHJlYWRGcm9tU3RkSW4gPSBmYWxzZTsKKworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiRGVsZXRlUHJvZHVjdCAtLXByb2R1Y3RJRCA8cHJvZHVjdCBpZD4gIgorICAgICAgICAgICAgICAgICsgIi0tZmlsZU1hbmFnZXJVcmwgPHVybCB0byBmaWxlIG1hbmFnZXI+IFstLXJlYWRdIFstLW5vY29tbWl0XVxuIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1wcm9kdWN0SUQiKSkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RJZCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZmlsZU1hbmFnZXJVcmwiKSkgeworICAgICAgICAgICAgICAgIGZpbGVNYW5hZ2VyVXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1yZWFkIikpIHsKKyAgICAgICAgICAgICAgICByZWFkRnJvbVN0ZEluID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tbm9jb21taXQiKSkgeworICAgICAgICAgICAgICAgIGNvbW1pdENoYW5nZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgocHJvZHVjdElkID09IG51bGwgJiYgIXJlYWRGcm9tU3RkSW4pIHx8IGZpbGVNYW5hZ2VyVXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbGV0ZVByb2R1Y3QgcmVtb3ZlciA9IG5ldyBEZWxldGVQcm9kdWN0KGZpbGVNYW5hZ2VyVXJsLCBjb21taXRDaGFuZ2VzKTsKKyAgICAgICAgaWYgKHJlYWRGcm9tU3RkSW4pIHsKKyAgICAgICAgICAgIExpc3QgcHJvZElkcyA9IHJlYWRQcm9kSWRzRnJvbVN0ZGluKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9kSWRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9kSWQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVyLnJlbW92ZShwcm9kSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJlbW92ZXIucmVtb3ZlKHByb2R1Y3RJZCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0IHJlYWRQcm9kSWRzRnJvbVN0ZGluKCkgeworICAgICAgICBMaXN0IHByb2RJZHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKworICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvZElkcy5hZGQobGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIHJlYWRpbmcgcHJvZCBpZDogbGluZTogWyIgKyBsaW5lCisgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYnIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kSWRzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmUoU3RyaW5nIHByb2R1Y3RJZCkgeworICAgICAgICBQcm9kdWN0IHRhcmdldCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCA9IGNsaWVudC5nZXRQcm9kdWN0QnlJZChwcm9kdWN0SWQpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCA6IFsiICsgcHJvZHVjdElkCisgICAgICAgICAgICAgICAgICAgICsgIl0gZnJvbSBmaWxlIG1hbmFnZXI6IFsiICsgY2xpZW50LmdldEZpbGVNYW5hZ2VyVXJsKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY291bGQgbm90IGZpbGUgcHJvZHVjdAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVsZXRlIHJlZmVyZW5jZXMgZmlyc3QKKyAgICAgICAgVmVjdG9yIHJlZnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZnMgPSAoVmVjdG9yKSBjbGllbnQuZ2V0UHJvZHVjdFJlZmVyZW5jZXModGFyZ2V0KTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gb2J0YWluIHJlZmVyZW5jZXMgZm9yIHByb2R1Y3QgOiBbIiArIHByb2R1Y3RJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZnJvbSBmaWxlIG1hbmFnZXI6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0RmlsZU1hbmFnZXJVcmwoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSByZWZzLmdldChpKTsKKworICAgICAgICAgICAgaWYgKGNvbW1pdCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZW1vdmVGaWxlKG5ldyBGaWxlKG5ldyBVUkkocmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBkZWxldGUgcmVmZXJlbmNlIDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICJdIGZvciBwcm9kdWN0IDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RJZCArICJdIGZyb20gZmlsZSBtYW5hZ2VyIDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsaWVudC5nZXRGaWxlTWFuYWdlclVybCgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyaSBzeW50YXggZXhjZXB0aW9uIGdldHRpbmcgZmlsZSBhYnNvbHV0ZSBwYXRoIGZyb20gVVJJOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJEZWxldGUgZmlsZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVmLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpICsgIl0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbW1pdCkgeworCisgICAgICAgICAgICAvLyBub3cgZGVsZXRlIHByb2R1Y3QKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xpZW50LnJlbW92ZVByb2R1Y3QodGFyZ2V0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byByZW1vdmUgcHJvZHVjdCA6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RJZCArICJdIGZyb20gZmlsZSBtYW5hZ2VyOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0RmlsZU1hbmFnZXJVcmwoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlJlbW90ZSBjYXRhbG9nIGVudHJ5IGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICArIHRhcmdldC5nZXRQcm9kdWN0TmFtZSgpICsgIl0iKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL0R1bXBEYkVsZW1lbnRzVG9YbWwuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9EdW1wRGJFbGVtZW50c1RvWG1sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4MjIxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9EdW1wRGJFbGVtZW50c1RvWG1sLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlhtbFN0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uRGF0YVNvdXJjZVZhbGlkYXRpb25MYXllckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIFNpbXBsZSBwcm9ncmFtIHRvIGR1bXAgWE1MIGVsZW1lbnRzIG91dCBvZiBhIERhdGFTb3VyY2VWYWxpZGF0aW9uTGF5ZXIgYW5kCisgKiBpbnRvIGFuIFhNTCBmaWxlLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEdW1wRGJFbGVtZW50c1RvWG1sIHsKKworICAgIHByaXZhdGUgRHVtcERiRWxlbWVudHNUb1htbCgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRvbid0IGNvbnN0cnVjdCBwcml2YXRlIGNvbnN0cnVjdG9ycyEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcHJvcEZpbGUgPSBudWxsLCBvdXRYbWxGaWxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gIkR1bXBEYkVsZW1lbnRzVG9YbWwgLS1wcm9wRmlsZSA8L3BhdGgvdG8vcHJvcEZpbGU+IC0tb3V0IDwvcGF0aC90by94bWwvZmlsZT5cbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tcHJvcEZpbGUiKSkgeworICAgICAgICAgICAgICAgIHByb3BGaWxlID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1vdXQiKSkgeworICAgICAgICAgICAgICAgIG91dFhtbEZpbGUgPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcEZpbGUgPT0gbnVsbCB8fCBvdXRYbWxGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBwcm9wZXJ0aWVzIGZpbGU6IFsiICsgcHJvcEZpbGUgKyAiXSIpOworICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShwcm9wRmlsZSkpKTsKKworICAgICAgICBWYWxpZGF0aW9uTGF5ZXIgZGJMYXllciA9IG5ldyBEYXRhU291cmNlVmFsaWRhdGlvbkxheWVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRpb25MYXllcigpOworCisgICAgICAgIExpc3QgZWxlbWVudExpc3QgPSBkYkxheWVyLmdldEVsZW1lbnRzKCk7CisgICAgICAgIFhtbFN0cnVjdEZhY3Rvcnkud3JpdGVFbGVtZW50WG1sRG9jdW1lbnQoZWxlbWVudExpc3QsIG91dFhtbEZpbGUpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvRXhwSW1wQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL0V4cEltcENhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDEyNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL0V4cEltcENhdGFsb2cuamF2YQpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzOworCisvLyBKREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvLyBPT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLkdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBUb29sIHRvIGV4cG9ydCBmcm9tIGEgc291cmNlIGZpbGUgbWFuYWdlciBjYXRhbG9nIGFuZCBpbXBvcnQgaW50byBhIGRlc3QKKyAqIGZpbGUgbWFuYWdlciBjYXRhbG9nLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBJbXBDYXRhbG9nIHsKKworICAgIC8qIHRoZSBjbGllbnQgdG8gdGhlIHNvdXJjZSBjYXRhbG9nIHRvIGV4cG9ydCAqLworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgc291cmNlQ2xpZW50ID0gbnVsbDsKKworICAgIC8qIHRoZSBjbGllbnQgdG8gdGhlIGRlc3QgY2F0YWxvZyB0byBpbXBvcnQgaW50byAqLworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZGVzdENsaWVudCA9IG51bGw7CisKKyAgICAvKiBhIHNvdXJjZSBjYXRhbG9nIEkvRiB0byBleHBvcnQgZnJvbSAoaWYgbm8gZm0gY2xpZW50IGlzIGRlc2lyZWQpICovCisgICAgcHJpdmF0ZSBDYXRhbG9nIHNyY0NhdGFsb2cgPSBudWxsOworCisgICAgLyogYSBkZXN0IGNhdGFsb2cgSS9GIHRvIGltcG9ydCBpbnRvIChpZiBubyBmbSBjbGllbnQgaXMgZGVzaXJlZCkgKi8KKyAgICBwcml2YXRlIENhdGFsb2cgZGVzdENhdGFsb2cgPSBudWxsOworCisgICAgLyogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGVuc3VyZSBhIHByb2R1Y3QgZG9lc24ndCBleGlzdCBiZWZvcmUgY29weWluZyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlbnN1cmVVbmlxdWUgPSBmYWxzZTsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRXhwSW1wQ2F0YWxvZy5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzVXJsCisgICAgICogICAgICAgICAgICBUaGUgdXJsIHRvIHRoZSBzb3VyY2UgZmlsZSBtYW5hZ2VyIHRvIGV4cG9ydCBmcm9tLgorICAgICAqIEBwYXJhbSBkVXJsCisgICAgICogICAgICAgICAgICBUaGUgdXJsIHRvIHRoZSBkZXN0IGZpbGUgbWFuYWdlciB0byBpbXBvcnQgaW50by4KKyAgICAgKiBAcGFyYW0gdW5pcXVlCisgICAgICogICAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgaW1wb3J0IHRvb2wgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBwcm9kdWN0CisgICAgICogICAgICAgICAgICBmcm9tIHRoZSBzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRlc3QuCisgICAgICovCisgICAgcHVibGljIEV4cEltcENhdGFsb2coVVJMIHNVcmwsIFVSTCBkVXJsLCBib29sZWFuIHVuaXF1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc291cmNlQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KHNVcmwpOworICAgICAgICB9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBjb25uZWN0IHRvIHNvdXJjZSBmaWxlbWdyOiBbIgorICAgICAgICAgICAgICAgICAgICArIHNVcmwgKyAiXSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVzdENsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChkVXJsKTsKKyAgICAgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gY29ubmVjdCB0byBkZXN0IGZpbGVtZ3I6IFsiCisgICAgICAgICAgICAgICAgICAgICsgZFVybCArICJdIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlID0gdW5pcXVlOworICAgIH0KKworICAgIHB1YmxpYyBFeHBJbXBDYXRhbG9nKFN0cmluZyBzUHJvcEZpbGVQYXRoLCBTdHJpbmcgZFByb3BGaWxlUGF0aCwKKyAgICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlID0gdW5pcXVlOworCisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNvbnN0cnVjdGluZyB0b29sIHVzaW5nIGNhdGFsb2cgaW50ZXJmYWNlcyIpOworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBzb3VyY2UgcHJvcCBmaWxlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmxvYWQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHNQcm9wRmlsZVBhdGgpLnRvVVJMKCkub3BlblN0cmVhbSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBjb25zdHJ1Y3QgdGhlIHNvdXJjZSBjYXRhbG9nCisgICAgICAgIFN0cmluZyBzcmNDYXRGYWN0b3J5U3RyID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlbWdyLmNhdGFsb2cuZmFjdG9yeSIpOworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJzb3VyY2UgY2F0YWxvZyBmYWN0b3J5OiBbIiArIHNyY0NhdEZhY3RvcnlTdHIKKyAgICAgICAgICAgICAgICArICJdIik7CisgICAgICAgIHRoaXMuc3JjQ2F0YWxvZyA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0Q2F0YWxvZ1NlcnZpY2VGcm9tRmFjdG9yeShzcmNDYXRGYWN0b3J5U3RyKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBkZXN0IHByb3AgZmlsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShkUHJvcEZpbGVQYXRoKS50b1VSTCgpLm9wZW5TdHJlYW0oKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGVzdENhdEZhY3RvcnlTdHIgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoImZpbGVtZ3IuY2F0YWxvZy5mYWN0b3J5Iik7CisgICAgICAgIExPRworICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuSU5GTywgImRlc3QgY2F0YWxvZyBmYWN0b3J5OiBbIiArIGRlc3RDYXRGYWN0b3J5U3RyCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7CisgICAgICAgIHRoaXMuZGVzdENhdGFsb2cgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldENhdGFsb2dTZXJ2aWNlRnJvbUZhY3RvcnkoZGVzdENhdEZhY3RvcnlTdHIpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9FeHBJbXBvcnQoTGlzdCBzb3VyY2VQcm9kdWN0VHlwZXMpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmICh0aGlzLnNvdXJjZUNsaWVudCAhPSBudWxsICYmIHRoaXMuZGVzdENsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBkbyB2YWxpZGF0aW9uIG9mIHNvdXJjZS9kZXN0IHR5cGVzCisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZXIgaXMgb24gdGhlaXIgb3duIGRpc2NyZXRpb24KKyAgICAgICAgICAgIExpc3QgZGVzdFByb2R1Y3RUeXBlcyA9IGRlc3RDbGllbnQuZ2V0UHJvZHVjdFR5cGVzKCk7CisKKyAgICAgICAgICAgIGlmICghdHlwZXNFeGlzdChzb3VyY2VQcm9kdWN0VHlwZXMsIGRlc3RQcm9kdWN0VHlwZXMpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc291cmNlIHByb2R1Y3QgdHlwZXMgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBkZXN0IGZpbGUgbWFuYWdlciEiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3VyY2UgdHlwZXMgYW5kIERlc3QgdHlwZXMgbWF0Y2g6IGJlZ2lubmluZyBwcm9jZXNzaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgdHlwZSB2YWxpZGF0aW9uOiBjYXRhbG9nIGkvZiBpbXBscyBiZWluZyB1c2VkLiIpOworCisgICAgICAgIC8vIHdlJ2xsIHVzZSB0aGUgZ2V0IHByb2R1Y3QgcGFnZSBtZXRob2QgZm9yIGVhY2ggcHJvZHVjdCB0eXBlCisgICAgICAgIC8vIHBhZ2luYXRlIHRocm91Z2ggcHJvZHVjdHMgdXNpbmcgc291cmNlIHByb2R1Y3QgdHlwZQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZVByb2R1Y3RUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSAoUHJvZHVjdFR5cGUpIGkubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleHBvcnRUeXBlVG9EZXN0KHR5cGUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBleHBvcnRpbmcgcHJvZHVjdCB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICJdIGZyb20gc291cmNlIHRvIGRlc3Q6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvRXhwSW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzb3VyY2VDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlcXVlc3QgZXhwL2ltcCBvZiBhbGwgcHJvZHVjdCB0eXBlcyBpZiBubyBmaWxlbWdyIHVybCBzcGVjaWZpZWQhIik7CisgICAgICAgIExpc3Qgc291cmNlUHJvZHVjdFR5cGVzID0gc291cmNlQ2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICBkb0V4cEltcG9ydChzb3VyY2VQcm9kdWN0VHlwZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBvcnRUeXBlVG9EZXN0KFByb2R1Y3RUeXBlIHR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0UGFnZSBwYWdlID0gbnVsbDsKKworICAgICAgICBpZiAodGhpcy5zcmNDYXRhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhZ2UgPSBzcmNDYXRhbG9nLmdldEZpcnN0UGFnZSh0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhZ2UgPSBzb3VyY2VDbGllbnQuZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBleHBvcnRQcm9kdWN0c1RvRGVzdChwYWdlLmdldFBhZ2VQcm9kdWN0cygpLCB0eXBlKTsKKyAgICAgICAgd2hpbGUgKCFwYWdlLmlzTGFzdFBhZ2UoKSkgeworICAgICAgICAgICAgaWYgKHRoaXMuc3JjQ2F0YWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFnZSA9IHNyY0NhdGFsb2cuZ2V0TmV4dFBhZ2UodHlwZSwgcGFnZSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwYWdlID0gc291cmNlQ2xpZW50LmdldE5leHRQYWdlKHR5cGUsIHBhZ2UpOworICAgICAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGV4cG9ydFByb2R1Y3RzVG9EZXN0KHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCksIHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cG9ydFByb2R1Y3RzVG9EZXN0KExpc3QgcHJvZHVjdHMsIFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb2R1Y3RzICE9IG51bGwgJiYgcHJvZHVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZHVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gKFByb2R1Y3QpIGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgaWYgKGVuc3VyZVVuaXF1ZSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1Byb2R1Y3QgPSBzYWZlSGFzUHJvZHVjdFR5cGVCeU5hbWUocAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Byb2R1Y3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlNraXBwaW5nIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IGVuc3VyZSB1bmlxdWUgZW5hYmxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwcm9kdWN0IGV4aXN0cyBpbiBkZXN0IGNhdGFsb2ciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhzb3VyY2VDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoc3JjQ2F0YWxvZy5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwKSk7CisKKyAgICAgICAgICAgICAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldCA9IHNvdXJjZUNsaWVudC5nZXRNZXRhZGF0YShwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZXQgPSBzcmNDYXRhbG9nLmdldE1ldGFkYXRhKHApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXJjZSBQcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogTWV0IEV4dHJhY3Rpb24gYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJSZWZlcmVuY2UgRXh0cmFjdGlvbiBzdWNjZXNzZnVsOiB3cml0aW5nIHRvIGRlc3QgZmlsZSBtYW5hZ2VyIik7CisKKyAgICAgICAgICAgICAgICAvLyBPT0RULTU0MworICAgICAgICAgICAgICAgIGlmKHNvdXJjZUNsaWVudCAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZGVmYXVsdCBDQVMgZmllbGRzIGZvciBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgbWV0LnJlbW92ZU1ldGFkYXRhKCJDQVMuUHJvZHVjdElkIik7CisgICAgICAgICAgICAgICAgICBtZXQucmVtb3ZlTWV0YWRhdGEoIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIik7CisgICAgICAgICAgICAgICAgICBtZXQucmVtb3ZlTWV0YWRhdGEoIkNBUy5Qcm9kdWN0TmFtZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFByb2R1Y3QgZGVzdFByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhyb3VnaAorICAgICAgICAgICAgICAgIGRlc3RQcm9kdWN0LnNldFByb2R1Y3ROYW1lKHAuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZGVzdFByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZShwLmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICAgICAgICAgICAgZGVzdFByb2R1Y3Quc2V0UHJvZHVjdFR5cGUoKGRlc3RDbGllbnQgIT0gbnVsbCkgPyBkZXN0Q2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVCeUlkKHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKSA6IHR5cGUpOworICAgICAgICAgICAgICAgIGRlc3RQcm9kdWN0LnNldFRyYW5zZmVyU3RhdHVzKHAuZ2V0VHJhbnNmZXJTdGF0dXMoKSk7CisKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDYXRhbG9naW5nIFByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdE5hbWUoKSArICJdIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlc3RQcm9kdWN0SWQgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChkZXN0Q2F0YWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RDYXRhbG9nLmFkZFByb2R1Y3QoZGVzdFByb2R1Y3QpOworICAgICAgICAgICAgICAgICAgICBkZXN0UHJvZHVjdElkID0gZGVzdFByb2R1Y3QuZ2V0UHJvZHVjdElkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc3RQcm9kdWN0SWQgPSBkZXN0Q2xpZW50LmNhdGFsb2dQcm9kdWN0KGRlc3RQcm9kdWN0KTsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDYXRhbG9nIHN1Y2Nlc3NmdWw6IGRlc3QgcHJvZHVjdCBpZDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzdFByb2R1Y3RJZCArICJdIik7CisgICAgICAgICAgICAgICAgZGVzdFByb2R1Y3Quc2V0UHJvZHVjdElkKGRlc3RQcm9kdWN0SWQpOworCisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQWRkaW5nIHJlZmVyZW5jZXMgZm9yIGRlc3QgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzdFByb2R1Y3RJZCArICJdIik7CisgICAgICAgICAgICAgICAgZGVzdFByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMocC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdENhdGFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXN0Q2F0YWxvZy5hZGRQcm9kdWN0UmVmZXJlbmNlcyhkZXN0UHJvZHVjdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc3RDbGllbnQuYWRkUHJvZHVjdFJlZmVyZW5jZXMoZGVzdFByb2R1Y3QpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgYWRkaXRpb24gc3VjY2Vzc2Z1bCBmb3IgZGVzdCBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3RQcm9kdWN0SWQgKyAiXSIpOworCisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQWRkaW5nIG1ldGFkYXRhIGZvciBkZXN0IHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3RQcm9kdWN0SWQgKyAiXSIpOworICAgICAgICAgICAgICAgIGlmIChkZXN0Q2F0YWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RDYXRhbG9nLmFkZE1ldGFkYXRhKG1ldCwgZGVzdFByb2R1Y3QpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXN0Q2xpZW50LmFkZE1ldGFkYXRhKGRlc3RQcm9kdWN0LCBtZXQpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXQgYWRkaXRpb24gc3VjY2Vzc2Z1bCBmb3IgZGVzdCBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3RQcm9kdWN0SWQgKyAiXSIpOworCisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU3VjY2Vzc2Z1bCBpbXBvcnQgb2YgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIl0gaW50byBkZXN0IGZpbGUgbWFuYWdlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlbnN1cmVVbmlxdWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbnN1cmVVbmlxdWUoKSB7CisgICAgICAgIHJldHVybiBlbnN1cmVVbmlxdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGVuc3VyZVVuaXF1ZQorICAgICAqICAgICAgICAgICAgVGhlIGVuc3VyZVVuaXF1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5zdXJlVW5pcXVlKGJvb2xlYW4gZW5zdXJlVW5pcXVlKSB7CisgICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlID0gZW5zdXJlVW5pcXVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzb3VyY2VVcmwgPSBudWxsLCBkZXN0VXJsID0gbnVsbCwgc3JjQ2F0UHJvcEZpbGUgPSBudWxsLCBkZXN0Q2F0UHJvcEZpbGUgPSBudWxsOworICAgICAgICBib29sZWFuIHVuaXF1ZSA9IGZhbHNlOworICAgICAgICBMaXN0IHR5cGVzID0gbnVsbDsKKworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiRXhwSW1wQ2F0YWxvZyBbb3B0aW9uc10gXG4iICsgIi0tc291cmNlIDx1cmw+XG4iCisgICAgICAgICAgICAgICAgKyAiLS1kZXN0IDx1cmw+XG4gIiArICItLXVuaXF1ZVxuIgorICAgICAgICAgICAgICAgICsgIlstLXR5cGVzIDxjb21tYSBzZXBhcmF0ZSBsaXN0IG9mIHByb2R1Y3QgdHlwZSBuYW1lcz5dXG4iCisgICAgICAgICAgICAgICAgKyAiWy0tc291cmNlQ2F0UHJvcHMgPGZpbGU+IC0tZGVzdENhdFByb3BzIDxmaWxlPl1cbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tc291cmNlIikpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VVcmwgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWRlc3QiKSkgeworICAgICAgICAgICAgICAgIGRlc3RVcmwgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVuaXF1ZSIpKSB7CisgICAgICAgICAgICAgICAgdW5pcXVlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdHlwZXMiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVzQW5kSWRzRW5jID0gYXJnc1srK2ldLnNwbGl0KCIsIik7CisKKyAgICAgICAgICAgICAgICB0eXBlcyA9IG5ldyBWZWN0b3IodHlwZXNBbmRJZHNFbmMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzQW5kSWRzRW5jLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVJZFRva3MgPSB0eXBlc0FuZElkc0VuY1tqXS5zcGxpdCgiXFx8Iik7CisgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXROYW1lKHR5cGVJZFRva3NbMF0pOworICAgICAgICAgICAgICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQodHlwZUlkVG9rc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZCh0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXNvdXJjZUNhdFByb3BzIikpIHsKKyAgICAgICAgICAgICAgICBzcmNDYXRQcm9wRmlsZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZGVzdENhdFByb3BzIikpIHsKKyAgICAgICAgICAgICAgICBkZXN0Q2F0UHJvcEZpbGUgPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChzb3VyY2VVcmwgPT0gbnVsbCB8fCBkZXN0VXJsID09IG51bGwpICYmIChzcmNDYXRQcm9wRmlsZSA9PSBudWxsIHx8IGRlc3RDYXRQcm9wRmlsZSA9PSBudWxsKSkKKyAgICAgICAgICAgICAgICB8fCAoc291cmNlVXJsICE9IG51bGwgJiYgZGVzdFVybCAhPSBudWxsICYmIChzcmNDYXRQcm9wRmlsZSAhPSBudWxsIHx8IGRlc3RDYXRQcm9wRmlsZSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICB8fCAoKHNyY0NhdFByb3BGaWxlICE9IG51bGwgJiYgZGVzdENhdFByb3BGaWxlID09IG51bGwpIHx8IChkZXN0Q2F0UHJvcEZpbGUgIT0gbnVsbCAmJiBzcmNDYXRQcm9wRmlsZSA9PSBudWxsKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIEV4cEltcENhdGFsb2cgdG9vbCA9IG51bGw7CisKKyAgICAgICAgaWYgKHNyY0NhdFByb3BGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvb2wgPSBuZXcgRXhwSW1wQ2F0YWxvZyhzcmNDYXRQcm9wRmlsZSwgZGVzdENhdFByb3BGaWxlLCB1bmlxdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRvb2wgPSBuZXcgRXhwSW1wQ2F0YWxvZyhuZXcgVVJMKHNvdXJjZVVybCksIG5ldyBVUkwoZGVzdFVybCksCisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSk7CisKKyAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdG9vbC5kb0V4cEltcG9ydCh0eXBlcyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdG9vbC5kb0V4cEltcG9ydCgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB0eXBlc0V4aXN0KExpc3Qgc291cmNlTGlzdCwgTGlzdCBkZXN0TGlzdCkgeworICAgICAgICBpZiAoc291cmNlTGlzdCA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgKHNvdXJjZUxpc3QgIT0gbnVsbCAmJiBzb3VyY2VMaXN0LnNpemUoKSA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RMaXN0ID09IG51bGwgfHwgKGRlc3RMaXN0ICE9IG51bGwgJiYgZGVzdExpc3Quc2l6ZSgpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHNvdXJjZSB0eXBlcyBhbmQgdHJ5IGFuZCBmaW5kIHRoZSB0eXBlIGluIHRoZQorICAgICAgICAvLyBkZXN0TGlzdAorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IChQcm9kdWN0VHlwZSkgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIXR5cGVJbkxpc3QodHlwZSwgZGVzdExpc3QpKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiU291cmNlIHR5cGU6IFsiICsgdHlwZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gbm90IHByZXNlbnQgaW4gZGVzdCBmaWxlIG1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdHlwZUluTGlzdChQcm9kdWN0VHlwZSB0eXBlLCBMaXN0IHR5cGVMaXN0KSB7CisgICAgICAgIGlmICh0eXBlTGlzdCA9PSBudWxsIHx8ICh0eXBlTGlzdCAhPSBudWxsICYmIHR5cGVMaXN0LnNpemUoKSA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBQcm9kdWN0VHlwZSBkZXN0VHlwZSA9IChQcm9kdWN0VHlwZSkgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZGVzdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLmVxdWFscyh0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVzdFR5cGUuZ2V0TmFtZSgpLmVxdWFscyh0eXBlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2FmZUhhc1Byb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBwcm9kdWN0TmFtZSkgeworCisgICAgICAgIGlmIChkZXN0Q2F0YWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoZGVzdENhdGFsb2cuZ2V0UHJvZHVjdEJ5TmFtZShwcm9kdWN0TmFtZSkgIT0gbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAgICAgLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uZyBjaGVja2luZyBmb3IgcHJvZHVjdCB0eXBlIGJ5IG5hbWU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0TmFtZSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzdENsaWVudC5oYXNQcm9kdWN0KHByb2R1Y3ROYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb25nIGNoZWNraW5nIGZvciBwcm9kdWN0IHR5cGUgYnkgbmFtZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3ROYW1lICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9NZXRhZGF0YUJhc2VkUHJvZHVjdE1vdmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvTWV0YWRhdGFCYXNlZFByb2R1Y3RNb3Zlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzQzMDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvTWV0YWRhdGFCYXNlZFByb2R1Y3RNb3Zlci5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgdG9vbCB0byBtb3ZlIHByb2R1Y3RzIGJhc2VkIG9uIHRoZWlyIG1ldGFkYXRhIGF0dHJpYnV0ZXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhQmFzZWRQcm9kdWN0TW92ZXIgeworCisgICAgLyoKKyAgICAgKiB0aGUgbWV0YWRhdGEgcGF0aCBzZXBjIHN0cmluZywgZS5nLiwKKyAgICAgKiAvcGF0aC90by9maW5hbC9sb2MvW0xvY2FsRGF5XS9bRmlsZW5hbWVdCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFNwZWMgPSBudWxsOworCisgICAgLyogdGhlIGNsaWVudCB0byB0aGUgZmlsZSBtYW5hZ2VyICovCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbWdyQ2xpZW50ID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihNZXRhZGF0YUJhc2VkUHJvZHVjdE1vdmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXRoU3BlYworICAgICAqICAgICAgICAgICAgQSBwYXRoIHNwZWNpZmljYXRpb24gYmFzZWQgb24gdGhlIHByb2R1Y3QgbWV0YWRhdGEgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgZmluYWwgZGF0YSBzdG9yZSBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gZm1VcmwKKyAgICAgKiAgICAgICAgICAgIEEgc3RyaW5nIFVSTCB0byB0aGUgZmlsZSBtYW5hZ2VyLgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZSBwYXNzZWQgaW4gdXJsIGlzIG1hbGZvcm1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGFCYXNlZFByb2R1Y3RNb3ZlcihTdHJpbmcgcGF0aFNwZWMsIFN0cmluZyBmbVVybCkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5wYXRoU3BlYyA9IHBhdGhTcGVjOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5mbWdyQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZm1VcmwpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3ZlUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBhZ2luYXRlIHRocm91Z2ggdGhlIHByb2R1Y3QgbGlzdAorCisgICAgICAgIFByb2R1Y3RQYWdlIHBhZ2UgPSBmbWdyQ2xpZW50LmdldEZpcnN0UGFnZSh0eXBlKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2UuZ2V0VG90YWxQYWdlcygpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYWdlLmdldFBhZ2VQcm9kdWN0cygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gcGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5pdGVyYXRvcigpOyBqCisgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IHAgPSAoUHJvZHVjdCkgai5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoZm1nckNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwKSk7CisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhIG1ldCA9IGZtZ3JDbGllbnQuZ2V0TWV0YWRhdGEocCk7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSByID0gKChSZWZlcmVuY2UpIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TG9jUGF0aCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF0aFNwZWMsIG1ldCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25zTWF0Y2goci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwgbmV3TG9jUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgCUxPRy5sb2coTGV2ZWwuSU5GTywgIkN1cnJlbnQgYW5kIE5ldyBsb2NhdGlvbnMgbWF0Y2guICIrcC5nZXRQcm9kdWN0TmFtZSgpKyIgd2FzIG5vdCBtb3ZlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJNb3ZpbmcgcHJvZHVjdDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHAuZ2V0UHJvZHVjdE5hbWUoKSArICJdIGZyb206IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShuZXcgVVJJKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gdG86IFsiICsgbmV3TG9jUGF0aCArICJdIik7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZUJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBmbWdyQ2xpZW50Lm1vdmVQcm9kdWN0KHAsIG5ld0xvY1BhdGgpOworICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVBZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2Vjb25kcyA9ICgodGltZUFmdGVyIC0gdGltZUJlZm9yZSkgKiAxLjApIC8gKDEwMDAuMCk7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlByb2R1Y3Q6IFsiICsgcC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBtb3ZlIHN1Y2Nlc3NmdWw6IHRvb2s6IFsiICsgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gc2Vjb25kcyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghcGFnZS5pc0xhc3RQYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZSA9IGZtZ3JDbGllbnQuZ2V0TmV4dFBhZ2UodHlwZSwgcGFnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGxvY2F0aW9uc01hdGNoKFN0cmluZyBjdXJyZW50TG9jYXRpb24sIFN0cmluZyBuZXdMb2NhdGlvbikgdGhyb3dzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgCVN0cmluZyBjdXJyZW50TG9jYXRpb25VUkkgPSBuZXcgVVJJKGN1cnJlbnRMb2NhdGlvbikuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCk7CisgICAgCVN0cmluZyBuZXdMb2NhdGlvblVSSSA9IG5ldyBVUkkobmV3TG9jYXRpb24pLmdldFNjaGVtZVNwZWNpZmljUGFydCgpOworCisgICAgCWlmIChjdXJyZW50TG9jYXRpb25VUkkuZXF1YWxzKG5ld0xvY2F0aW9uVVJJKSkgeworICAgIAkJcmV0dXJuIHRydWU7CisgICAgCX0KKyAgICAJZWxzZSB7CisgICAgCQlyZXR1cm4gZmFsc2U7CisgICAgCX0KKyAgICAJCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG1vdmVQcm9kdWN0cyhTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtb3ZlUHJvZHVjdHMoZm1nckNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5TmFtZSh0eXBlTmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IG51bGwsIHBhdGhTcGVjID0gbnVsbCwgZm1VcmxTdHIgPSBudWxsOworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiTWV0YWRhdGFCYXNlZFByb2R1Y3RNb3ZlciBbb3B0aW9uc11cbiIKKyAgICAgICAgICAgICAgICArICItLXR5cGVOYW1lIDxwcm9kdWN0IHR5cGU+XG4iCisgICAgICAgICAgICAgICAgKyAiLS1maWxlTWFuYWdlclVybCA8dXJsIHRvIGZpbGUgbWFuYWdlcj5cbiIKKyAgICAgICAgICAgICAgICArICItLXBhdGhTcGVjIDxwYXRoIHNwZWMgdXNpbmcgJ1snIGFuZCAnXScgdG8gZGVsaW1pdCBtZXQgZmllbGRzPlxuIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS10eXBlTmFtZSIpKSB7CisgICAgICAgICAgICAgICAgdHlwZU5hbWUgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXBhdGhTcGVjIikpIHsKKyAgICAgICAgICAgICAgICBwYXRoU3BlYyA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZmlsZU1hbmFnZXJVcmwiKSkgeworICAgICAgICAgICAgICAgIGZtVXJsU3RyID0gYXJnc1srK2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwgfHwgcGF0aFNwZWMgPT0gbnVsbCB8fCBmbVVybFN0ciA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBNZXRhZGF0YUJhc2VkUHJvZHVjdE1vdmVyIG1vdmVyID0gbmV3IE1ldGFkYXRhQmFzZWRQcm9kdWN0TW92ZXIoCisgICAgICAgICAgICAgICAgcGF0aFNwZWMsIGZtVXJsU3RyKTsKKyAgICAgICAgbW92ZXIubW92ZVByb2R1Y3RzKHR5cGVOYW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9NZXRhZGF0YUR1bXBlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL01ldGFkYXRhRHVtcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhMGNmOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9NZXRhZGF0YUR1bXBlci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuU2VyaWFsaXphYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNpbXBsZSB0b29sIHRvIHdyaXRlIG91dCBhIC5tZXQge0BsaW5rIE1ldGFkYXRhfSBmaWxlIGZvciBhIHNwZWNpZmllZAorICoge0BsaW5rIFByb2R1Y3R9LgorICogPC9wPi4KKyAqLworQERlcHJlY2F0ZWQKK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXRhZGF0YUR1bXBlciB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1ldGFkYXRhRHVtcGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciBmaWxlIG1hbmFnZXIgY2xpZW50ICovCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG51bGw7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRU5BTUUgPSAiRmlsZW5hbWUiOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0RVQ1RfTkFNRSA9ICJDQVMuUHJvZHVjdE5hbWUiOworCisgICAgcHVibGljIE1ldGFkYXRhRHVtcGVyKFN0cmluZyBmbVVybFN0cikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5mbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKGZtVXJsU3RyKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIm1hbGZvcm1lZCBmaWxlIG1hbmFnZXIgdXJsOiBbIiArIGZtVXJsU3RyCisgICAgICAgICAgICAgICAgICAgICsgIl0iLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgInVuYWJsZSB0byBjb25uZWN0IHRvIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBmbVVybFN0ciArICJdIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGFkYXRhIGdldE1ldGFkYXRhKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdCA9IHRoaXMuZm1DbGllbnQuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV0cmlldmUgcHJvZHVjdDpbIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RJZCArICJdIGJ5IGlkIik7CisgICAgICAgIH0KKworICAgICAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtZXQgPSB0aGlzLmZtQ2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgbWV0YWRhdGEgZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIl0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWV0RmlsZVRvRGlyKE1ldGFkYXRhIG1ldCwgU3RyaW5nIGZ1bGxNZXRGaWxlUGF0aCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgWE1MVXRpbHMud3JpdGVYbWxGaWxlKG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShtZXQpLnRvWE1MKCksIGZ1bGxNZXRGaWxlUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJNZXQgZmlsZSBub3QgZ2VuZXJhdGVkOiByZWFzb246ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyB0aGUge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSB7QGxpbmsgUHJvZHVjdH0gaWRlbnRpZmllZCBieSB0aGUKKyAgICAgKiBnaXZlbiA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LiBUaGUge0BsaW5rIE1ldGFkYXRhfSBpcyB3cml0dGVuIHRvIHRoZQorICAgICAqIGxvY2FsIGRpcmVjdG9yeSA8Y29kZT4uPC9jb2RlPiwgd2hlcmUgdGhpcyBwcm9ncmFtIHdhcyBpbnZva2VkIGZyb20uCisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3RJZAorICAgICAqICAgICAgICAgICAgVGhlIHN0cmluZyBpZGVudGlmaWVyIG9mIHRoZSBwcm9kdWN0IHRvIGR1bXAge0BsaW5rIE1ldGFkYXRhfQorICAgICAqICAgICAgICAgICAgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wTWV0YWRhdGEoU3RyaW5nIHByb2R1Y3RJZCkgeworICAgICAgICBkdW1wTWV0YWRhdGEocHJvZHVjdElkLCBuZXcgRmlsZSgiLiIpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyB0aGUge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSB7QGxpbmsgUHJvZHVjdH0gaWRlbnRpZmllZCBieSB0aGUKKyAgICAgKiBnaXZlbiA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LiBUaGUge0BsaW5rIE1ldGFkYXRhfSBpcyB3cml0dGVuIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5vdXREaXJQYXRoPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdElkCisgICAgICogICAgICAgICAgICBUaGUgc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgdG8gZHVtcCB7QGxpbmsgTWV0YWRhdGF9CisgICAgICogICAgICAgICAgICBmcm9tLgorICAgICAqIEBwYXJhbSBvdXREaXJQYXRoCisgICAgICogICAgICAgICAgICBUaGUgcGF0aCBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byB3cml0ZSB0aGUge0BsaW5rIE1ldGFkYXRhfQorICAgICAqICAgICAgICAgICAgZmlsZSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wTWV0YWRhdGEoU3RyaW5nIHByb2R1Y3RJZCwgU3RyaW5nIG91dERpclBhdGgpIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gZ2V0TWV0YWRhdGEocHJvZHVjdElkKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxNZXRGaWxlUGF0aCA9IG91dERpclBhdGg7CisgICAgICAgIGZ1bGxNZXRGaWxlUGF0aCA9IChmdWxsTWV0RmlsZVBhdGguZW5kc1dpdGgoIi8iKSkgPyBmdWxsTWV0RmlsZVBhdGgKKyAgICAgICAgICAgICAgICA6IGZ1bGxNZXRGaWxlUGF0aCArICIvIjsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbWV0LmdldE1ldGFkYXRhKEZJTEVOQU1FKSAhPSBudWxsID8gbWV0CisgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKEZJTEVOQU1FKSA6IG1ldC5nZXRNZXRhZGF0YShQUk9EVUNUX05BTUUpOworICAgICAgICBmdWxsTWV0RmlsZVBhdGggKz0gZmlsZW5hbWUgKyAiLm1ldCI7CisgICAgICAgIHdyaXRlTWV0RmlsZVRvRGlyKG1ldCwgZnVsbE1ldEZpbGVQYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmlsZU1hbmFnZXJVcmxTdHIgPSBudWxsLCBwcm9kdWN0SWQgPSBudWxsLCBvdXREaXJQYXRoID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gIk1ldGFkYXRhRHVtcGVyIC0tdXJsIDxmaWxlbWdyIHVybD4gLS1wcm9kdWN0SWQgPGlkPiBbLS1vdXQgPGRpciBwYXRoPl1cbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdXJsIikpIHsKKyAgICAgICAgICAgICAgICBmaWxlTWFuYWdlclVybFN0ciA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tcHJvZHVjdElkIikpIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0SWQgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLW91dCIpKSB7CisgICAgICAgICAgICAgICAgb3V0RGlyUGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlTWFuYWdlclVybFN0ciA9PSBudWxsIHx8IHByb2R1Y3RJZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBNZXRhZGF0YUR1bXBlciBkdW1wZXIgPSBuZXcgTWV0YWRhdGFEdW1wZXIoZmlsZU1hbmFnZXJVcmxTdHIpOworICAgICAgICBpZiAob3V0RGlyUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBkdW1wZXIuZHVtcE1ldGFkYXRhKHByb2R1Y3RJZCwgb3V0RGlyUGF0aCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZHVtcGVyLmR1bXBNZXRhZGF0YShwcm9kdWN0SWQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL09wdGltaXplTHVjZW5lQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL09wdGltaXplTHVjZW5lQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTBlMjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvT3B0aW1pemVMdWNlbmVDYXRhbG9nLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29sczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL0x1Y2VuZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQuU3RhbmRhcmRBbmFseXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBUb29sIHRvIG9wdGltaXplIGEge0BsaW5rIEx1Y2VuZUNhdGFsb2d9J3MgaW5kZXggZGlyZWN0b3J5IGZvciBzZWFyY2guCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIE9wdGltaXplTHVjZW5lQ2F0YWxvZyB7CisKKyAgICAvKiB0aGUgcGF0aCB0byB0aGUgbHVjZW5lIGluZGV4IGRpcmVjdG9yeSAqLworICAgIHByaXZhdGUgU3RyaW5nIGNhdGFsb2dQYXRoID0gbnVsbDsKKworICAgIC8qIHRoZSBtZXJnZSBmYWN0b3IgdG8gdXNlIHdoZW4gb3B0aW1pemluZyB0aGUgaW5kZXggKi8KKyAgICBwcml2YXRlIGludCBtZXJnZUZhY3RvciA9IDIwOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihPcHRpbWl6ZUx1Y2VuZUNhdGFsb2cuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW1pemVMdWNlbmVDYXRhbG9nKFN0cmluZyBjYXRQYXRoLCBpbnQgbWYpIHsKKyAgICAgICAgdGhpcy5jYXRhbG9nUGF0aCA9IGNhdFBhdGg7CisgICAgICAgIHRoaXMubWVyZ2VGYWN0b3IgPSBtZjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb09wdGltaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gY3JlYXRlSW5kZXggPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGNhdGFsb2dQYXRoLCBuZXcgU3RhbmRhcmRBbmFseXplcigpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmRleCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0TWVyZ2VGYWN0b3IodGhpcy5tZXJnZUZhY3Rvcik7CisgICAgICAgICAgICBsb25nIHRpbWVCZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHdyaXRlci5vcHRpbWl6ZSgpOworICAgICAgICAgICAgbG9uZyB0aW1lQWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGRvdWJsZSBudW1TZWNvbmRzID0gKCh0aW1lQWZ0ZXIgLSB0aW1lQmVmb3JlKSAqIDEuMCkgLyAxMDAwLjA7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJMdWNlbmVDYXRhbG9nOiBbIiArIHRoaXMuY2F0YWxvZ1BhdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiXSBvcHRpbWl6ZWQ6IHRvb2s6IFsiICsgbnVtU2Vjb25kcyArICJdIHNlY29uZHMiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIG9wdGltaXplIGx1Y2VuZSBpbmRleDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBjYXRhbG9nUGF0aCArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiT3B0aW1pemVMdWNlbmVDYXRhbG9nIFtvcHRpb25zXVxuIgorICAgICAgICAgICAgICAgICsgIi0tY2F0YWxvZ1BhdGggPHBhdGggdG8gbHVjZW5lIGNhdGFsb2c+XG4iCisgICAgICAgICAgICAgICAgKyAiWy0tbWVyZ2VGYWN0b3IgPG1lcmdlIGZhY3RvciBmb3IgaW5kZXg+XVxuIjsKKworICAgICAgICBTdHJpbmcgY2F0UGF0aCA9IG51bGw7CisgICAgICAgIGludCBtZXJnZUZhY3RvciA9IC0xOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWNhdGFsb2dQYXRoIikpIHsKKyAgICAgICAgICAgICAgICBjYXRQYXRoID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1tZXJnZUZhY3RvciIpKSB7CisgICAgICAgICAgICAgICAgbWVyZ2VGYWN0b3IgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2F0UGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWVyZ2VGYWN0b3IgPT0gLTEpIHsKKyAgICAgICAgICAgIG1lcmdlRmFjdG9yID0gMjA7IC8vIGRlZmF1bHQKKyAgICAgICAgfQorCisgICAgICAgIE9wdGltaXplTHVjZW5lQ2F0YWxvZyBvcHRpbWl6ZXIgPSBuZXcgT3B0aW1pemVMdWNlbmVDYXRhbG9nKGNhdFBhdGgsCisgICAgICAgICAgICAgICAgbWVyZ2VGYWN0b3IpOworICAgICAgICBvcHRpbWl6ZXIuZG9PcHRpbWl6ZSgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvUHJvZHVjdER1bXBlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Byb2R1Y3REdW1wZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDUxODVlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Byb2R1Y3REdW1wZXIuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNpbXBsZSB0b29sIHRvIHdyaXRlIG91dCBhIC5wcm9kdWN0IHtAbGluayBQcm9kdWN0fSBmaWxlIGNvbnRhaW5pbmcgcHJvZHVjdAorICogaW5mb3JtYXRpb24gYW5kIHtAbGluayBSZWZlcmVuY2V9cy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm9kdWN0RHVtcGVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUHJvZHVjdER1bXBlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICAvKiBvdXIgZmlsZSBtYW5hZ2VyIGNsaWVudCAqLworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1DbGllbnQgPSBudWxsOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVOQU1FID0gIkZpbGVuYW1lIjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiQ0FTLlByb2R1Y3ROYW1lIjsKKworICAgIHB1YmxpYyBQcm9kdWN0RHVtcGVyKFN0cmluZyBmbVVybFN0cikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5mbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKGZtVXJsU3RyKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIm1hbGZvcm1lZCBmaWxlIG1hbmFnZXIgdXJsOiBbIiArIGZtVXJsU3RyCisgICAgICAgICAgICAgICAgICAgICsgIl0iLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgInVuYWJsZSB0byBjb25uZWN0IHRvIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBmbVVybFN0ciArICJdIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFByb2R1Y3QgZ2V0UHJvZHVjdChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3QgPSB0aGlzLmZtQ2xpZW50LmdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHJpZXZlIHByb2R1Y3Q6WyIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0SWQgKyAiXSBieSBpZCIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKHRoaXMuZm1DbGllbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgcmVmZXJlbmNlcyEgTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUHJvZHVjdEZpbGVUb0RpcihQcm9kdWN0IHAsIFN0cmluZyBmdWxsUHJvZEZpbGVQYXRoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYTUxVdGlscy53cml0ZVhtbEZpbGUocC50b1hNTCgpLCBmdWxsUHJvZEZpbGVQYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgInByb2R1Y3QgeG1sIGZpbGUgbm90IGdlbmVyYXRlZDogcmVhc29uOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhZGF0YSBnZXRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0ID0gdGhpcy5mbUNsaWVudC5nZXRNZXRhZGF0YShwcm9kdWN0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IG1ldGFkYXRhIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICJdIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIER1bXBzIGEge0BsaW5rIFByb2R1Y3R9IGluIFhNTCBmb3JtYXQgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4KKyAgICAgKiA8Y29kZT5wcm9kdWN0SWQ8L2NvZGU+LiBUaGUge0BsaW5rIFByb2R1Y3R9WE1MIGlzIHdyaXR0ZW4gdG8gdGhlCisgICAgICogbG9jYWwgZGlyZWN0b3J5IDxjb2RlPi48L2NvZGU+LCB3aGVyZSB0aGlzIHByb2dyYW0gd2FzIGludm9rZWQgZnJvbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvZHVjdElkCisgICAgICogICAgICAgICAgICBUaGUgc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgdG8gZHVtcCB7QGxpbmsgUHJvZHVjdH0KKyAgICAgKiAgICAgICAgICAgIGluZm8gZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wUHJvZHVjdChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICAgIGR1bXBQcm9kdWN0KHByb2R1Y3RJZCwgbmV3IEZpbGUoIi4iKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcHMgYSB7QGxpbmsgUHJvZHVjdH0gaW4gWE1MIGZvcm1hdCBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbgorICAgICAqIDxjb2RlPnByb2R1Y3RJZDwvY29kZT4uIFRoZSB7QGxpbmsgUHJvZHVjdH1YTUwgaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+b3V0RGlyUGF0aDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y3RJZAorICAgICAqICAgICAgICAgICAgVGhlIHN0cmluZyBpZGVudGlmaWVyIG9mIHRoZSBwcm9kdWN0IHRvIGR1bXAge0BsaW5rIFByb2R1Y3R9CisgICAgICogICAgICAgICAgICBpbmZvIGZyb20uCisgICAgICogQHBhcmFtIG91dERpclBhdGgKKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXRoIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHdyaXRlIHRoZSB7QGxpbmsgUHJvZHVjdH0KKyAgICAgKiAgICAgICAgICAgIHhtbCBmaWxlIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1bXBQcm9kdWN0KFN0cmluZyBwcm9kdWN0SWQsIFN0cmluZyBvdXREaXJQYXRoKSB7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IGdldFByb2R1Y3QocHJvZHVjdElkKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxQcm9kRmlsZVBhdGggPSBvdXREaXJQYXRoOworICAgICAgICBmdWxsUHJvZEZpbGVQYXRoID0gKGZ1bGxQcm9kRmlsZVBhdGguZW5kc1dpdGgoIi8iKSkgPyBmdWxsUHJvZEZpbGVQYXRoCisgICAgICAgICAgICAgICAgOiBmdWxsUHJvZEZpbGVQYXRoICsgIi8iOworICAgICAgICBNZXRhZGF0YSBtZXQgPSBnZXRNZXRhZGF0YShwcm9kdWN0KTsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbWV0LmdldE1ldGFkYXRhKEZJTEVOQU1FKSAhPSBudWxsID8gbWV0CisgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKEZJTEVOQU1FKSA6IG1ldC5nZXRNZXRhZGF0YShQUk9EVUNUX05BTUUpOworICAgICAgICBmdWxsUHJvZEZpbGVQYXRoICs9IGZpbGVuYW1lICsgIi5wcm9kdWN0IjsKKyAgICAgICAgd3JpdGVQcm9kdWN0RmlsZVRvRGlyKHByb2R1Y3QsIGZ1bGxQcm9kRmlsZVBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlTWFuYWdlclVybFN0ciA9IG51bGwsIHByb2R1Y3RJZCA9IG51bGwsIG91dERpclBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiUHJvZHVjdER1bXBlciAtLXVybCA8ZmlsZW1nciB1cmw+IC0tcHJvZHVjdElkIDxpZD4gWy0tb3V0IDxkaXIgcGF0aD5dXG4iOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVybCIpKSB7CisgICAgICAgICAgICAgICAgZmlsZU1hbmFnZXJVcmxTdHIgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXByb2R1Y3RJZCIpKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdElkID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1vdXQiKSkgeworICAgICAgICAgICAgICAgIG91dERpclBhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsZU1hbmFnZXJVcmxTdHIgPT0gbnVsbCB8fCBwcm9kdWN0SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgUHJvZHVjdER1bXBlciBkdW1wZXIgPSBuZXcgUHJvZHVjdER1bXBlcihmaWxlTWFuYWdlclVybFN0cik7CisgICAgICAgIGlmIChvdXREaXJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGR1bXBlci5kdW1wUHJvZHVjdChwcm9kdWN0SWQsIG91dERpclBhdGgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGR1bXBlci5kdW1wUHJvZHVjdChwcm9kdWN0SWQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Byb2R1Y3RUeXBlRG9jVG9vbC5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Byb2R1Y3RUeXBlRG9jVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzE5MGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvUHJvZHVjdFR5cGVEb2NUb29sLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29sczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB0b29sIHRvIG91dHB1dCBIVE1MIGRvY3VtZW50YXRpb24gZm9yIHtAbGluayBQcm9kdWN0VHlwZX0gcG9saWN5IHhtbCBmaWxlcy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm9kdWN0VHlwZURvY1Rvb2wgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgeHNsRmlsZVBhdGg7CisKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJQYXRoOworCisgICAgcHVibGljIFByb2R1Y3RUeXBlRG9jVG9vbChTdHJpbmcgeHNsRmlsZVBhdGgsIFN0cmluZyBvdXRwdXREaXJQYXRoKSB7CisgICAgICAgIHRoaXMueHNsRmlsZVBhdGggPSB4c2xGaWxlUGF0aDsKKyAgICAgICAgdGhpcy5vdXRwdXREaXJQYXRoID0gb3V0cHV0RGlyUGF0aDsKKyAgICAgICAgaWYgKCF0aGlzLm91dHB1dERpclBhdGguZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdGhpcy5vdXRwdXREaXJQYXRoICs9ICIvIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUHJvZHVjdFR5cGVEb2MoU3RyaW5nIHByb2R1Y3RUeXBlWG1sRmlsZVBhdGgsCisgICAgICAgICAgICBTdHJpbmcgZWxlbWVudFhtbEZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29weSBlbGVtZW50IHhtbCB0byBjdXJyZW50IHBhdGgKKyAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkobmV3IEZpbGUoZWxlbWVudFhtbEZpbGVQYXRoKSwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgIi4iKSk7CisgICAgICAgIC8vIGNvcHkgcHJvZHVjdCB0eXBlIHhzbCB0byBjdXJyZW50IHBhdGgKKyAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkobmV3IEZpbGUoeHNsRmlsZVBhdGgpLCBuZXcgRmlsZSgiLiIpKTsKKworICAgICAgICBTdHJpbmcgeHNsTG9jYWxGaWxlUGF0aCA9IG5ldyBGaWxlKCIuIikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIGlmICgheHNsTG9jYWxGaWxlUGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB4c2xMb2NhbEZpbGVQYXRoICs9ICIvIjsKKyAgICAgICAgfQorICAgICAgICB4c2xMb2NhbEZpbGVQYXRoICs9IG5ldyBGaWxlKHhzbEZpbGVQYXRoKS5nZXROYW1lKCk7CisKKyAgICAgICAgU3RyaW5nIGVsZW1lbnRMb2NhbEZpbGVQYXRoID0gbmV3IEZpbGUoIi4iKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgaWYgKCFlbGVtZW50TG9jYWxGaWxlUGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBlbGVtZW50TG9jYWxGaWxlUGF0aCArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICBlbGVtZW50TG9jYWxGaWxlUGF0aCArPSBuZXcgRmlsZShlbGVtZW50WG1sRmlsZVBhdGgpLmdldE5hbWUoKTsKKworICAgICAgICBUcmFuc2Zvcm1lciB4Zm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoCisgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVNvdXJjZShuZXcgRmlsZSh4c2xMb2NhbEZpbGVQYXRoKSkpOworCisgICAgICAgIHhmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlRmlsZU5hbWUgPSBuZXcgRmlsZShwcm9kdWN0VHlwZVhtbEZpbGVQYXRoKS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBvdXRwdXRQcm9kdWN0VHlwZURvY0ZpbGVOYW1lID0gcHJvZHVjdFR5cGVGaWxlTmFtZS5yZXBsYWNlQWxsKAorICAgICAgICAgICAgICAgICJ4bWwiLCAiaHRtbCIpOworCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlKG91dHB1dERpclBhdGgKKyAgICAgICAgICAgICAgICArIG91dHB1dFByb2R1Y3RUeXBlRG9jRmlsZU5hbWUpKTsKKworICAgICAgICB4Zm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKG5ldyBGaWxlKHByb2R1Y3RUeXBlWG1sRmlsZVBhdGgpKSwKKyAgICAgICAgICAgICAgICByZXN1bHQpOworCisgICAgICAgIC8vIG5vdyBjbGVhbnVwCisgICAgICAgIG5ldyBGaWxlKHhzbExvY2FsRmlsZVBhdGgpLmRlbGV0ZSgpOworICAgICAgICBuZXcgRmlsZShlbGVtZW50TG9jYWxGaWxlUGF0aCkuZGVsZXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZVhtbEZpbGVQYXRoID0gbnVsbCwgeHNsRmlsZVBhdGggPSBudWxsLCBvdXRwdXREaXJQYXRoID0gbnVsbCwgZWxlbWVudFhtbEZpbGVQYXRoID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gIlByb2R1Y3RUeXBlRG9jVG9vbCAtLXByb2R1Y3RUeXBlWG1sIDxwYXRoPiAiCisgICAgICAgICAgICAgICAgKyAiLS1lbGVtZW50WG1sIDxwYXRoPiAtLXhzbCA8cGF0aD4gLS1vdXQgPGRpciBwYXRoPlxuIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1wcm9kdWN0VHlwZVhtbCIpKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVYbWxGaWxlUGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0teHNsIikpIHsKKyAgICAgICAgICAgICAgICB4c2xGaWxlUGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tb3V0IikpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREaXJQYXRoID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1lbGVtZW50WG1sIikpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50WG1sRmlsZVBhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZHVjdFR5cGVYbWxGaWxlUGF0aCA9PSBudWxsIHx8IHhzbEZpbGVQYXRoID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBvdXRwdXREaXJQYXRoID09IG51bGwgfHwgZWxlbWVudFhtbEZpbGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3RUeXBlRG9jVG9vbCB0b29sID0gbmV3IFByb2R1Y3RUeXBlRG9jVG9vbCh4c2xGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICBvdXRwdXREaXJQYXRoKTsKKyAgICAgICAgdG9vbC5kb1Byb2R1Y3RUeXBlRG9jKHByb2R1Y3RUeXBlWG1sRmlsZVBhdGgsIGVsZW1lbnRYbWxGaWxlUGF0aCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvUXVlcnlUb29sLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvUXVlcnlUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MTUzMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9RdWVyeVRvb2wuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SYW5nZVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5Db21wbGV4UXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5TcWxQYXJzZXI7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlF1ZXJ5UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuQ2xhdXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Cb29sZWFuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlBocmFzZVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUmFuZ2VRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guVGVybVF1ZXJ5OworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgdG9vbCB0byByZXR1cm4gcHJvZHVjdCBpZHMgZ2l2ZW4gYSB7QGxpbmsgUXVlcnl9IGFnYWluc3QgdGhlIEZpbGUgTWFuYWdlci4KKyAqIDwvcD4KKyAqLworQERlcHJlY2F0ZWQKK3B1YmxpYyBmaW5hbCBjbGFzcyBRdWVyeVRvb2wgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZyZWVUZXh0QmxvY2sgPSAiX19GUkVFX18iOworCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZW51bSBRdWVyeVR5cGUgeyBMVUNFTkUsIFNRTCB9OyAKKyAgICAKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFF1ZXJ5VG9vbC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHVibGljIFF1ZXJ5VG9vbChVUkwgZm1VcmwpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChmbVVybCk7CisgICAgICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBRdWVyeSBwYXJzZVF1ZXJ5KFN0cmluZyBxdWVyeSkgeworICAgICAgICBRdWVyeVBhcnNlciBwYXJzZXI7CisgICAgICAgIC8vIG5vdGUgdGhhdCAiX19GUkVFX18iIGlzIGEgY29udHJvbCB3b3JrIGZvciBmcmVlIHRleHQgc2VhcmNoaW5nCisgICAgICAgIHBhcnNlciA9IG5ldyBRdWVyeVBhcnNlcihmcmVlVGV4dEJsb2NrLCBuZXcgQ0FTQW5hbHl6ZXIoKSk7CisgICAgICAgIFF1ZXJ5IGx1Y2VuZVEgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbHVjZW5lUSA9IChRdWVyeSkgcGFyc2VyLnBhcnNlKHF1ZXJ5KTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwYXJzaW5nIHF1ZXJ5IHRleHQuIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGx1Y2VuZVE7CisgICAgfQorCisgICAgcHVibGljIExpc3QgcXVlcnkob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgTGlzdCBwcm9kSWRzID0gbmV3IFZlY3RvcigpOworICAgICAgICBMaXN0IHByb2R1Y3RzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIExpc3QgcHJvZHVjdFR5cGVzID0gc2FmZUdldFByb2R1Y3RUeXBlcygpOworCisgICAgICAgIGlmIChwcm9kdWN0VHlwZXMgIT0gbnVsbCAmJiBwcm9kdWN0VHlwZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZHVjdFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSAoUHJvZHVjdFR5cGUpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzID0gY2xpZW50LnF1ZXJ5KHF1ZXJ5LCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RzICE9IG51bGwgJiYgcHJvZHVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gcHJvZHVjdHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gKFByb2R1Y3QpIGoubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2RJZHMuYWRkKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBxdWVyeWluZyBmb3I6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICJdIHByb2R1Y3RzOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kSWRzOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVDQVNRdWVyeSgKKyAgICAgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGNhc1F1ZXJ5LAorICAgICAgICAgICAgUXVlcnkgbHVjZW5lUXVlcnkpIHsKKyAgICAgICAgaWYgKGx1Y2VuZVF1ZXJ5IGluc3RhbmNlb2YgVGVybVF1ZXJ5KSB7CisgICAgICAgICAgICBUZXJtIHQgPSAoKFRlcm1RdWVyeSkgbHVjZW5lUXVlcnkpLmdldFRlcm0oKTsKKyAgICAgICAgICAgIGlmICh0LmZpZWxkKCkuZXF1YWxzKGZyZWVUZXh0QmxvY2spKSB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmb3Igbm93CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhc1F1ZXJ5LmFkZENyaXRlcmlvbihuZXcgVGVybVF1ZXJ5Q3JpdGVyaWEodC5maWVsZCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHQudGV4dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobHVjZW5lUXVlcnkgaW5zdGFuY2VvZiBQaHJhc2VRdWVyeSkgeworICAgICAgICAgICAgVGVybVtdIHQgPSAoKFBocmFzZVF1ZXJ5KSBsdWNlbmVRdWVyeSkuZ2V0VGVybXMoKTsKKyAgICAgICAgICAgIGlmICh0WzBdLmZpZWxkKCkuZXF1YWxzKGZyZWVUZXh0QmxvY2spKSB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmb3Igbm93CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY2FzUXVlcnkuYWRkQ3JpdGVyaW9uKG5ldyBUZXJtUXVlcnlDcml0ZXJpYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2ldLmZpZWxkKCksIHRbaV0udGV4dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobHVjZW5lUXVlcnkgaW5zdGFuY2VvZiBSYW5nZVF1ZXJ5KSB7CisgICAgICAgICAgICBUZXJtIHN0YXJ0VCA9ICgoUmFuZ2VRdWVyeSkgbHVjZW5lUXVlcnkpLmdldExvd2VyVGVybSgpOworICAgICAgICAgICAgVGVybSBlbmRUID0gKChSYW5nZVF1ZXJ5KSBsdWNlbmVRdWVyeSkuZ2V0VXBwZXJUZXJtKCk7CisgICAgICAgICAgICBjYXNRdWVyeS5hZGRDcml0ZXJpb24obmV3IFJhbmdlUXVlcnlDcml0ZXJpYShzdGFydFQKKyAgICAgICAgICAgICAgICAgICAgLmZpZWxkKCksIHN0YXJ0VC50ZXh0KCksIGVuZFQudGV4dCgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAobHVjZW5lUXVlcnkgaW5zdGFuY2VvZiBCb29sZWFuUXVlcnkpIHsKKyAgICAgICAgICAgIEJvb2xlYW5DbGF1c2VbXSBjbGF1c2VzID0gKChCb29sZWFuUXVlcnkpIGx1Y2VuZVF1ZXJ5KS5nZXRDbGF1c2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXVzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUNBU1F1ZXJ5KGNhc1F1ZXJ5LCAoY2xhdXNlc1tpXSkuZ2V0UXVlcnkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgcXVlcnkhIENhbm5vdCBkZXRlcm1pbmUgY2xhdXNlIHR5cGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsdWNlbmVRdWVyeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdCBzYWZlR2V0UHJvZHVjdFR5cGVzKCkgeworICAgICAgICBMaXN0IHByb2RUeXBlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2RUeXBlcyA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2J0YWluaW5nIHByb2R1Y3QgdHlwZXMgZnJvbSBmaWxlIG1hbmFnZXI6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0RmlsZU1hbmFnZXJVcmwoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZFR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiVXNhZ2U6IFF1ZXJ5VG9vbCBbb3B0aW9uc10gXG4iCisgICAgICAgICAgICArICJvcHRpb25zOiBcbiIKKyAgICAgICAgICAgICsgIi0tdXJsIDxmbSB1cmw+IFxuIgorICAgICAgICAgICAgKyAiICBMdWNlbmUgbGlrZSBxdWVyeSBvcHRpb25zOiBcbiIKKyAgICAgICAgICAgICsgIiAgICAtLWx1Y2VuZSBcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgIC1xdWVyeSA8cXVlcnk+IFxuIgorICAgICAgICAgICAgKyAiICBTUUwgbGlrZSBxdWVyeSBvcHRpb25zOiBcbiIKKyAgICAgICAgICAgICsgIiAgICAtLXNxbCBcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgIC1xdWVyeSA8cXVlcnk+IFxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgLXNvcnRCeSA8bWV0YWRhdGEta2V5PiBcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgIC1vdXRwdXRGb3JtYXQgPG91dHB1dC1mb3JtYXQtc3RyaW5nPiBcbiI7CisgICAgICAgICAgICAJCQorICAgICAgICBTdHJpbmcgZm1VcmxTdHIgPSBudWxsLCBxdWVyeVN0ciA9IG51bGwsIHNvcnRCeSA9IG51bGwsIG91dHB1dEZvcm1hdCA9IG51bGwsIGRlbGltaXRlciA9IG51bGw7CisgICAgICAgIFF1ZXJ5VHlwZSBxdWVyeVR5cGUgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1sdWNlbmUiKSkgeworICAgICAgICAgICAgICAgIGlmIChxdWVyeVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgiRVJST1I6IENhbiBvbmx5IHBlcmZvcm0gb25lIHF1ZXJ5IGF0IGEgdGltZSEgXG4iICsgdXNhZ2UpOworICAgICAgICAgICAgICAgIGlmIChhcmdzWysraV0uZXF1YWxzKCItcXVlcnkiKSkKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHIgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgiRVJST1I6IE11c3Qgc3BlY2lmeSBhIHF1ZXJ5ISBcbiIgKyB1c2FnZSk7CisgICAgICAgICAgICAgICAgcXVlcnlUeXBlID0gUXVlcnlUeXBlLkxVQ0VORTsKKyAgICAgICAgICAgIH1lbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zcWwiKSkgeworICAgICAgICAgICAgICAgIGlmIChxdWVyeVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgiRVJST1I6IENhbiBvbmx5IHBlcmZvcm0gb25lIHF1ZXJ5IGF0IGEgdGltZSEgXG4iICsgdXNhZ2UpOworICAgICAgICAgICAgICAgIGlmIChhcmdzWysraV0uZXF1YWxzKCItcXVlcnkiKSkKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHIgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgiRVJST1I6IE11c3Qgc3BlY2lmeSBhIHF1ZXJ5ISBcbiIgKyB1c2FnZSk7CisgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLXNvcnRCeSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW91dHB1dEZvcm1hdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0ID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWRlbGltaXRlciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxdWVyeVR5cGUgPSBRdWVyeVR5cGUuU1FMOworICAgICAgICAgICAgfWVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVybCIpKSB7CisgICAgICAgICAgICAgICAgZm1VcmxTdHIgPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVlcnlTdHIgPT0gbnVsbCB8fCBmbVVybFN0ciA9PSBudWxsKSAKKyAgICAgICAgICAgIGV4aXQoIk11c3Qgc3BlY2lmeSBhIHF1ZXJ5IGFuZCBmaWxlbWdyIHVybCEgXG4iICsgdXNhZ2UpOworICAgICAgICAKKyAgICAgICAgaWYgKHF1ZXJ5VHlwZSA9PSBRdWVyeVR5cGUuTFVDRU5FKSB7CisgICAgICAgICAgICBVUkwgZm1VcmwgPSBuZXcgVVJMKGZtVXJsU3RyKTsKKyAgICAgICAgICAgIFF1ZXJ5VG9vbCBxdWVyeVRvb2wgPSBuZXcgUXVlcnlUb29sKGZtVXJsKTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5IGNhc1F1ZXJ5ID0gbmV3IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5KCk7CisgICAgICAgICAgICBxdWVyeVRvb2wuZ2VuZXJhdGVDQVNRdWVyeShjYXNRdWVyeSwgcGFyc2VRdWVyeShxdWVyeVN0cikpOworICAgIAorICAgICAgICAgICAgTGlzdCBwcm9kSWRzID0gcXVlcnlUb29sLnF1ZXJ5KGNhc1F1ZXJ5KTsKKyAgICAgICAgICAgIGlmIChwcm9kSWRzICE9IG51bGwgJiYgcHJvZElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZElkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb2RJZCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJvZElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwZXJmb3JtU3FsUXVlcnkocXVlcnlTdHIsIHNvcnRCeSwgb3V0cHV0Rm9ybWF0LCBkZWxpbWl0ZXIgIT0gbnVsbCA/IGRlbGltaXRlciA6ICJcbiIsIGZtVXJsU3RyKSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGVyZm9ybVNxbFF1ZXJ5KFN0cmluZyBxdWVyeSwgU3RyaW5nIHNvcnRCeSwgU3RyaW5nIG91dHB1dEZvcm1hdCwgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nIGZpbGVtZ3JVcmwpIAorICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ2F0YWxvZ0V4Y2VwdGlvbiwgQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkgPSBTcWxQYXJzZXIucGFyc2VTcWxRdWVyeShxdWVyeSk7CisgICAgICAgIGNvbXBsZXhRdWVyeS5zZXRTb3J0QnlNZXRLZXkoc29ydEJ5KTsKKyAgICAgICAgY29tcGxleFF1ZXJ5LnNldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CisgICAgICAgIExpc3Q8UXVlcnlSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTChmaWxlbWdyVXJsKSkuY29tcGxleFF1ZXJ5KGNvbXBsZXhRdWVyeSk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXR1cm5TdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHJlc3VsdHMpIAorICAgICAgICAgICAgcmV0dXJuU3RyaW5nLmFwcGVuZChxci50b1N0cmluZygpICsgZGVsaW1pdGVyKTsKKyAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZy5zdWJzdHJpbmcoMCwgcmV0dXJuU3RyaW5nLmxlbmd0aCgpIC0gZGVsaW1pdGVyLmxlbmd0aCgpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleGl0KFN0cmluZyBtc2cpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9SYW5nZVF1ZXJ5VGVzdGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvUmFuZ2VRdWVyeVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDYwMjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvUmFuZ2VRdWVyeVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9MdWNlbmUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm07CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkJvb2xlYW5DbGF1c2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkJvb2xlYW5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSGl0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSW5kZXhTZWFyY2hlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUmFuZ2VRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU29ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU29ydEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5UZXJtUXVlcnk7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgVXRpbGl0eSBjb21tYW5kIGxpbmUgcHJvZ3JhbSB0byB0ZXN0IFJhbmdlUXVlcmllcyBhZ2FpbnN0IGFuIHVuZGVybHlpbmcKKyAqIEx1Y2VuZS1iYXNlZCBQcm9kdWN0IENhdGFsb2cuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJhbmdlUXVlcnlUZXN0ZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhcnRGaWVsZE5hbWUgPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5kRmllbGROYW1lID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YXJ0RmllbGRTdGFydFZhbHVlID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YXJ0RmllbGRFbmRWYWx1ZSA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmRGaWVsZFN0YXJ0VmFsdWUgPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5kRmllbGRFbmRWYWx1ZSA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBpbmRleFBhdGggPSBudWxsOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihSYW5nZVF1ZXJ5VGVzdGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBSYW5nZVF1ZXJ5VGVzdGVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGRvUmFuZ2VRdWVyeShTdHJpbmcgcHJvZHVjdFR5cGVJZCkgeworICAgICAgICBMaXN0IHByb2R1Y3RzID0gbnVsbDsKKyAgICAgICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIodGhpcy5pbmRleFBhdGgpOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBCb29sZWFuIHF1ZXJ5IGhlcmUKKyAgICAgICAgICAgIEJvb2xlYW5RdWVyeSBib29sZWFuUXVlcnkgPSBuZXcgQm9vbGVhblF1ZXJ5KCk7CisKKyAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvZHVjdCB0eXBlIGFzIHRoZSBmaXJzdCBjbGF1c2UKKyAgICAgICAgICAgIFRlcm1RdWVyeSBwcm9kVHlwZVRlcm1RdWVyeSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oCisgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0X3R5cGVfaWQiLCBwcm9kdWN0VHlwZUlkKSk7CisgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKHByb2RUeXBlVGVybVF1ZXJ5LCBCb29sZWFuQ2xhdXNlLk9jY3VyLk1VU1QpOworCisgICAgICAgICAgICBUZXJtIHN0YXJ0RmllbGRTdGFydFRlcm0gPSBudWxsLCBzdGFydEZpZWxkRW5kVGVybSA9IG51bGw7CisKKyAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0RmllbGRTdGFydFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFydEZpZWxkU3RhcnRUZXJtID0gbmV3IFRlcm0odGhpcy5zdGFydEZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZFN0YXJ0VmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5zdGFydEZpZWxkRW5kVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0YXJ0RmllbGRFbmRUZXJtID0gbmV3IFRlcm0odGhpcy5zdGFydEZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZEVuZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmFuZ2VRdWVyeSBxdWVyeTEgPSBuZXcgUmFuZ2VRdWVyeShzdGFydEZpZWxkU3RhcnRUZXJtLAorICAgICAgICAgICAgICAgICAgICBzdGFydEZpZWxkRW5kVGVybSwgdHJ1ZSk7CisgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKHF1ZXJ5MSwgQm9vbGVhbkNsYXVzZS5PY2N1ci5NVVNUKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuZW5kRmllbGROYW1lICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuZW5kRmllbGRTdGFydFZhbHVlICE9IG51bGwgfHwgdGhpcy5lbmRGaWVsZEVuZFZhbHVlICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgVGVybSBlbmRGaWVsZEVuZFRlcm0gPSBudWxsLCBlbmRGaWVsZFN0YXJ0VGVybSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmRGaWVsZFN0YXJ0VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbmRGaWVsZFN0YXJ0VGVybSA9IG5ldyBUZXJtKHRoaXMuZW5kRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kRmllbGRTdGFydFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmRGaWVsZEVuZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kRmllbGRFbmRUZXJtID0gbmV3IFRlcm0odGhpcy5lbmRGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRGaWVsZEVuZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBSYW5nZVF1ZXJ5IHF1ZXJ5MiA9IG5ldyBSYW5nZVF1ZXJ5KGVuZEZpZWxkU3RhcnRUZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kRmllbGRFbmRUZXJtLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKHF1ZXJ5MiwgQm9vbGVhbkNsYXVzZS5PY2N1ci5NVVNUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgiQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiLAorICAgICAgICAgICAgICAgICAgICBTb3J0RmllbGQuU1RSSU5HLCB0cnVlKSk7CisgICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2goYm9vbGVhblF1ZXJ5LCBzb3J0KTsKKyAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RzID0gbmV3IFZlY3RvcihoaXRzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpdHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBwcm9kdWN0RG9jID0gaGl0cy5kb2MoaSk7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzLmFkZChwcm9kdWN0RG9jLmdldCgicmVmZXJlbmNlX2RhdGFfc3RvcmUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJRdWVyeTogWyIgKyBxdWVyeTEKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZm9yIFByb2R1Y3QgVHlwZTogWyIgKyBwcm9kdWN0VHlwZUlkCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIHJldHVybmVkIG5vIHJlc3VsdHMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5pbmRleFBhdGggKyAiXSBmb3Igc2VhcmNoOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2VhcmNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWFyY2hlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJSYW5nZVF1ZXJ5VGVzdGVyIFtvcHRpb25zXVxuIgorICAgICAgICAgICAgICAgICsgIlx0LS1pZHhQYXRoIDwvcGF0aC90by9sdWNlbmUvaW5kZXg+XG4iCisgICAgICAgICAgICAgICAgKyAiXHQtLXByb2R1Y3RUeXBlSWQgPHByb2R1Y3QgdHlwZT5cbiIKKyAgICAgICAgICAgICAgICArICJcdC0tc3RhcnRGaWVsZCA8ZmllbGQgZm9yIHN0YXJ0IHJhbmdlPlxuIgorICAgICAgICAgICAgICAgICsgIlx0LS1lbmRGaWVsZCA8ZmllbGQgZm9yIGVuZCByYW5nZT5cbiIKKyAgICAgICAgICAgICAgICArICJcdC0tc3RhcnRGaWVsZFN0YXJ0IDx2YWx1ZT5cbiIKKyAgICAgICAgICAgICAgICArICJcdC0tc3RhcnRGaWVsZEVuZCA8dmFsdWU+XG4iICsgIlx0LS1lbmRGaWVsZFN0YXJ0IDx2YWx1ZT5cbiIKKyAgICAgICAgICAgICAgICArICJcdC0tZW5kRmllbGRFbmQgPHZhbHVlPlxuIjsKKworICAgICAgICBTdHJpbmcgaWR4UGF0aCA9IG51bGwsIHN0YXJ0RmllbGQgPSBudWxsLCBlbmRGaWVsZCA9IG51bGw7CisgICAgICAgIFN0cmluZyBzdGFydEZpZWxkU3RhcnQgPSBudWxsLCBzdGFydEZpZWxkRW5kID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGVuZEZpZWxkU3RhcnQgPSBudWxsLCBlbmRGaWVsZEVuZCA9IG51bGw7CisgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZUlkID0gbnVsbDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1pZHhQYXRoIikpIHsKKyAgICAgICAgICAgICAgICBpZHhQYXRoID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zdGFydEZpZWxkIikpIHsKKyAgICAgICAgICAgICAgICBzdGFydEZpZWxkID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1lbmRGaWVsZCIpKSB7CisgICAgICAgICAgICAgICAgZW5kRmllbGQgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXN0YXJ0RmllbGRTdGFydCIpKSB7CisgICAgICAgICAgICAgICAgc3RhcnRGaWVsZFN0YXJ0ID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zdGFydEZpZWxkRW5kIikpIHsKKyAgICAgICAgICAgICAgICBzdGFydEZpZWxkRW5kID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1lbmRGaWVsZFN0YXJ0IikpIHsKKyAgICAgICAgICAgICAgICBlbmRGaWVsZFN0YXJ0ID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1lbmRGaWVsZEVuZCIpKSB7CisgICAgICAgICAgICAgICAgZW5kRmllbGRFbmQgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXByb2R1Y3RUeXBlSWQiKSkgeworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlSWQgPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaWR4UGF0aCA9PSBudWxsIHx8IHByb2R1Y3RUeXBlSWQgPT0gbnVsbCB8fCBzdGFydEZpZWxkID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAoc3RhcnRGaWVsZFN0YXJ0ID09IG51bGwgJiYgc3RhcnRGaWVsZEVuZCA9PSBudWxsKSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgUmFuZ2VRdWVyeVRlc3RlciBxdWVyeVRlc3RlciA9IG5ldyBSYW5nZVF1ZXJ5VGVzdGVyKCk7CisgICAgICAgIHF1ZXJ5VGVzdGVyLnNldEluZGV4UGF0aChpZHhQYXRoKTsKKyAgICAgICAgcXVlcnlUZXN0ZXIuc2V0U3RhcnRGaWVsZEVuZFZhbHVlKHN0YXJ0RmllbGRFbmQpOworICAgICAgICBxdWVyeVRlc3Rlci5zZXRTdGFydEZpZWxkU3RhcnRWYWx1ZShzdGFydEZpZWxkU3RhcnQpOworICAgICAgICBxdWVyeVRlc3Rlci5zZXRTdGFydEZpZWxkTmFtZShzdGFydEZpZWxkKTsKKyAgICAgICAgcXVlcnlUZXN0ZXIuc2V0RW5kRmllbGROYW1lKGVuZEZpZWxkKTsKKyAgICAgICAgcXVlcnlUZXN0ZXIuc2V0RW5kRmllbGRTdGFydFZhbHVlKGVuZEZpZWxkU3RhcnQpOworICAgICAgICBxdWVyeVRlc3Rlci5zZXRFbmRGaWVsZEVuZFZhbHVlKGVuZEZpZWxkRW5kKTsKKworICAgICAgICBMaXN0IHByb2R1Y3RGaWxlcyA9IHF1ZXJ5VGVzdGVyLmRvUmFuZ2VRdWVyeShwcm9kdWN0VHlwZUlkKTsKKworICAgICAgICBpZiAocHJvZHVjdEZpbGVzICE9IG51bGwgJiYgcHJvZHVjdEZpbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RGaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdEZpbGUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJvZHVjdEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gcmVzdWx0cyBmb3VuZCEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuZEZpZWxkTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZEZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZW5kRmllbGROYW1lCisgICAgICogICAgICAgICAgICBUaGUgZW5kRmllbGROYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmRGaWVsZE5hbWUoU3RyaW5nIGVuZEZpZWxkTmFtZSkgeworICAgICAgICB0aGlzLmVuZEZpZWxkTmFtZSA9IGVuZEZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluZGV4UGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZGV4UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4UGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaW5kZXhQYXRoCisgICAgICogICAgICAgICAgICBUaGUgaW5kZXhQYXRoIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleFBhdGgoU3RyaW5nIGluZGV4UGF0aCkgeworICAgICAgICB0aGlzLmluZGV4UGF0aCA9IGluZGV4UGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0RmllbGROYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRGaWVsZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydEZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RhcnRGaWVsZE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydEZpZWxkTmFtZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRGaWVsZE5hbWUoU3RyaW5nIHN0YXJ0RmllbGROYW1lKSB7CisgICAgICAgIHRoaXMuc3RhcnRGaWVsZE5hbWUgPSBzdGFydEZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuZEZpZWxkRW5kVmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmRGaWVsZEVuZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZW5kRmllbGRFbmRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZW5kRmllbGRFbmRWYWx1ZQorICAgICAqICAgICAgICAgICAgVGhlIGVuZEZpZWxkRW5kVmFsdWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuZEZpZWxkRW5kVmFsdWUoU3RyaW5nIGVuZEZpZWxkRW5kVmFsdWUpIHsKKyAgICAgICAgdGhpcy5lbmRGaWVsZEVuZFZhbHVlID0gZW5kRmllbGRFbmRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuZEZpZWxkU3RhcnRWYWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZEZpZWxkU3RhcnRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZEZpZWxkU3RhcnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZW5kRmllbGRTdGFydFZhbHVlCisgICAgICogICAgICAgICAgICBUaGUgZW5kRmllbGRTdGFydFZhbHVlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmRGaWVsZFN0YXJ0VmFsdWUoU3RyaW5nIGVuZEZpZWxkU3RhcnRWYWx1ZSkgeworICAgICAgICB0aGlzLmVuZEZpZWxkU3RhcnRWYWx1ZSA9IGVuZEZpZWxkU3RhcnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0RmllbGRFbmRWYWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0RmllbGRFbmRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0RmllbGRFbmRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RhcnRGaWVsZEVuZFZhbHVlCisgICAgICogICAgICAgICAgICBUaGUgc3RhcnRGaWVsZEVuZFZhbHVlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydEZpZWxkRW5kVmFsdWUoU3RyaW5nIHN0YXJ0RmllbGRFbmRWYWx1ZSkgeworICAgICAgICB0aGlzLnN0YXJ0RmllbGRFbmRWYWx1ZSA9IHN0YXJ0RmllbGRFbmRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0RmllbGRTdGFydFZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRGaWVsZFN0YXJ0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydEZpZWxkU3RhcnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RhcnRGaWVsZFN0YXJ0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydEZpZWxkU3RhcnRWYWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRGaWVsZFN0YXJ0VmFsdWUoU3RyaW5nIHN0YXJ0RmllbGRTdGFydFZhbHVlKSB7CisgICAgICAgIHRoaXMuc3RhcnRGaWVsZFN0YXJ0VmFsdWUgPSBzdGFydEZpZWxkU3RhcnRWYWx1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9Tb2xySW5kZXhlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1NvbHJJbmRleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM2ZmIxZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9Tb2xySW5kZXhlci5qYXZhCkBAIC0wLDAgKzEsODAyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkdudVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkhlbHBGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLlNlcmlhbGl6YWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5Tb2xyU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouU29sclNlcnZlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLmltcGwuQ29tbW9uc0h0dHBTb2xyU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIEluZGV4ZXMgcHJvZHVjdHMgZnJvbSB0aGUgRmlsZSBNYW5hZ2VyIGNhdGFsb2cgdG8gYSBTb2xyIGluc3RhbmNlLiBVc2VzIGFuCisgKiBhc3NvY2lhdGVkIGNvbmZpZyBmaWxlLCBpbmRleGVyLnByb3BlcnRpZXMgdG8gc3BlY2lmeSBob3cgdG8gcGVyZm9ybSB0aGUKKyAqIGluZGV4aW5nLiBTZWUgaW5kZXhlci5wcm9wZXJ0aWVzIGluIHRoZSBzcmMvbWFpbi9yZXNvdXJjZXMgZGlyZWN0b3J5IGZvcgorICogc3BlY2lmaWMgZG9jdW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFNvbHJJbmRleGVyIHsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU09MUl9JTkRFWEVSX0NPTkZJRyA9ICJTT0xSX0lOREVYRVJfQ09ORklHIjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU09MUl9VUkwgPSAic29sci51cmwiOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFTUdSX1VSTCA9ICJmaWxlbWdyLnVybCI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDQ0VTU19LRVkgPSAiYWNjZXNzLmtleSI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDQ0VTU19VUkwgPSAiYWNjZXNzLnVybCI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0RVQ1RfTkFNRSA9ICJDQVMuUHJvZHVjdE5hbWUiOworCXByaXZhdGUgSW5kZXhlckNvbmZpZyBjb25maWcgPSBudWxsOworCXByaXZhdGUgZmluYWwgU29sclNlcnZlciBzZXJ2ZXI7CisJcHJpdmF0ZSBTdHJpbmcgZm1Vcmw7CisJcHJpdmF0ZSBTdHJpbmcgc29sclVybDsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihTb2xySW5kZXhlci5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgZmluYWwgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgc29sckZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAorCSAgICAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOworCisJLyoqCisJICogQ29uc3RydWN0b3IgcmVhZHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGluaXRpYXRlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUKKwkgKiBTb2xyIGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBzb2xyVXJsCisJICogICAgICAgICAgVVJMIGZvciB0aGUgU29sciBpbnN0YW5jZS4KKwkgKiBAcGFyYW0gZm1VcmwKKwkgKiAgICAgICAgICBVUkwgZm9yIHRoZSBGaWxlIE1hbmFnZXIgaW5zdGFuY2UuCisJICovCisJcHVibGljIFNvbHJJbmRleGVyKFN0cmluZyBzb2xyVXJsLCBTdHJpbmcgZm1VcmwpCisJICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOworCQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOworCisJCXRyeSB7CisJCQlMT0cuaW5mbygiU3lzdGVtIHByb3BlcnR5ICIgKyBTT0xSX0lOREVYRVJfQ09ORklHICsgIiBzZXQgdG8gIgorCQkJICAgICsgU3lzdGVtLmdldFByb3BlcnR5KFNPTFJfSU5ERVhFUl9DT05GSUcpKTsKKwkJCWZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KFNPTFJfSU5ERVhFUl9DT05GSUcpOworCQkJaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKKwkJCQlMT0cuaW5mbygiUmVhZGluZyBjb25maWcgZnJvbSAiICsgZmlsZW5hbWUpOworCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCUxPRy5pbmZvKCJDb25maWcgZmlsZSBub3QgZm91bmQsIHJlYWRpbmcgY29uZmlnIGZyb20gY2xhc3NwYXRoIik7CisJCQkJaW5wdXQgPSBTb2xySW5kZXhlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvaW5kZXhlci5wcm9wZXJ0aWVzIik7CisJCQl9CisJCQljb25maWcgPSBuZXcgSW5kZXhlckNvbmZpZyhpbnB1dCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUxPRworCQkJICAgIC5zZXZlcmUoIkNvdWxkIG5vdCByZWFkIGluIGNvbmZpZ3VyYXRpb24gZm9yIGluZGV4ZXIgZnJvbSBjbGFzc3BhdGggb3IgZmlsZSIpOworCQkJdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlpbnB1dC5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gbm8gb3AKKwkJCQl9CisJCQl9CisJCX0KKworCQl0aGlzLnNvbHJVcmwgPSBzb2xyVXJsOworCQlpZiAodGhpcy5zb2xyVXJsID09IG51bGwpIHsKKwkJCXRoaXMuc29sclVybCA9IGNvbmZpZy5nZXRQcm9wZXJ0eShTT0xSX1VSTCk7CisJCX0KKworCQl0aGlzLmZtVXJsID0gZm1Vcmw7CisJCWlmICh0aGlzLmZtVXJsID09IG51bGwpIHsKKwkJCXRoaXMuZm1VcmwgPSBjb25maWcuZ2V0UHJvcGVydHkoRklMRU1HUl9VUkwpOworCQl9CisKKwkJTE9HLmluZm8oIlVzaW5nIFNvbHI6ICIgKyB0aGlzLnNvbHJVcmwgKyAiIEZpbGVNYW5hZ2VyOiAiICsgdGhpcy5mbVVybCk7CisKKwkJdHJ5IHsKKwkJCXNlcnZlciA9IG5ldyBDb21tb25zSHR0cFNvbHJTZXJ2ZXIodGhpcy5zb2xyVXJsKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkNvdWxkIG5vdCBjb25uZWN0IHRvIFNvbHIgc2VydmVyICIgKyB0aGlzLnNvbHJVcmwpOworCQkJdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBkZWxldGVzIGFsbCBlbnRyaWVzIGZyb20gdGhlIFNvbHIgaW5kZXguCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIFNvbHJTZXJ2ZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJc2VydmVyLmRlbGV0ZUJ5UXVlcnkoIio6KiIpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGNvbW1pdHMgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIHRvIHRoZSBTb2xyIGluZGV4LgorCSAqLworCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBTb2xyU2VydmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXNlcnZlci5jb21taXQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvcHRpbWl6ZXMgdGhlIFNvbHIgaW5kZXguCisJICovCisJcHVibGljIHZvaWQgb3B0aW1pemUoKSB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlzZXJ2ZXIub3B0aW1pemUoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCB0cmFuc2Zvcm1zIHRoZSBwcm9kdWN0IG1ldGFkYXRhIGludG8gYSBTb2xyIGRvY3VtZW50LgorCSAqIAorCSAqIEBwYXJhbSBtZXRhZGF0YQorCSAqICAgICAgICAgIFRoZSBtZXRhZGF0YSBvYmplY3QgZm9yIHRoZSBwcm9kdWN0IHRvIGluZGV4LgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgU29scklucHV0RG9jdW1lbnQgY29udGFpbmluZyBwcm9kdWN0IG1ldGFkYXRhLgorCSAqLworCXByaXZhdGUgU29scklucHV0RG9jdW1lbnQgZ2V0U29sckRvY3VtZW50KE1ldGFkYXRhIG1ldGFkYXRhKSB7CisJCVNvbHJJbnB1dERvY3VtZW50IGRvYyA9IG5ldyBTb2xySW5wdXREb2N1bWVudCgpOworCQkvLyBPbmx5IGdyYWIgbWV0YWRhdGEgd2hpY2ggaGF2ZSBhIG1hcHBpbmcgaW4gdGhlIGluZGV4ZXIucHJvcGVydGllcworCQlmb3IgKE9iamVjdCBvYmpLZXkgOiBjb25maWcuZ2V0TWFwUHJvcGVydGllcygpLmtleVNldCgpKSB7CisJCQkvLyBUaGUga2V5IGluIHRoZSBtZXRhZGF0YSBvYmplY3QKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBvYmpLZXk7CisJCQkvLyBUaGUgc29sciBmaWVsZCBuYW1lIHRoaXMgbWV0YWRhdGEga2V5IHdpbGwgYmUgbWFwcGVkIHRvCisJCQlTdHJpbmcgZmllbGROYW1lID0gY29uZmlnLmdldE1hcFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShrZXkpOworCQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSk7CisJCQlpZiAodmFsdWVzICE9IG51bGwpIHsKKwkJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworCQkJCQkvLyBBZGQgZWFjaCBtZXRhZGF0YSB2YWx1ZSBpbnRvIHRoZQorCQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAhY29uZmlnLmdldElnbm9yZVZhbHVlcygpLmNvbnRhaW5zKHZhbHVlLnRyaW0oKSkpIHsKKwkJCQkJCUxPRy5maW5lKCJBZGRpbmcgZmllbGQ6ICIgKyBmaWVsZE5hbWUgKyAiIHZhbHVlOiAiICsgdmFsdWUpOworCQkJCQkJZG9jLmFkZEZpZWxkKGZpZWxkTmFtZSwgdmFsdWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBkb2M7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgYWRkcyBhIHNpbmdsZSBwcm9kdWN0IGV4dHJhY3RlZCBmcm9tIGEgbWV0YWRhdGEgZmlsZSB0byB0aGUKKwkgKiBTb2xyIGluZGV4LgorCSAqIAorCSAqIEBwYXJhbSBmaWxlCisJICogICAgICAgICAgVGhlIGZpbGUgY29udGFpbmluZyBwcm9kdWN0IG1ldGFkYXRhLgorCSAqIEBwYXJhbSBkZWxldGUKKwkgKiAgICAgICAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZW50cnkgc2hvdWxkIGJlIGRlbGV0ZWQgZnJvbSB0aGUKKwkgKiAgICAgICAgICBpbmRleC4KKwkgKiBAdGhyb3dzIFNvbHJTZXJ2ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgV2hlbiBhbiBlcnJvciBvY2N1cnMgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBTb2xyIHNlcnZlciBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbmRleE1ldEZpbGUoRmlsZSBmaWxlLCBib29sZWFuIGRlbGV0ZSkKKwkgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisJICAgIFNvbHJTZXJ2ZXJFeGNlcHRpb24geworCQlMT0cuaW5mbygiQXR0ZW1wdGluZyB0byBpbmRleCBwcm9kdWN0IGZyb20gbWV0YWRhdGEgZmlsZS4iKTsKKwkJdHJ5IHsKKwkJCVNlcmlhbGl6YWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKCJVVEYtOCIsIGZhbHNlKTsKKwkJCW1ldGFkYXRhLmxvYWRNZXRhZGF0YUZyb21YbWxTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisJCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiaWQiLCBtZXRhZGF0YS5nZXRNZXRhZGF0YSgiQ0FTLiIKKwkJCSAgICArIENvcmVNZXRLZXlzLlBST0RVQ1RfSUQpKTsKKwkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKGNvbmZpZy5nZXRQcm9wZXJ0eShBQ0NFU1NfS0VZKSwgY29uZmlnCisJCQkgICAgLmdldFByb3BlcnR5KEFDQ0VTU19VUkwpCisJCQkgICAgKyBtZXRhZGF0YS5nZXRNZXRhZGF0YSgiQ0FTLiIgKyBDb3JlTWV0S2V5cy5QUk9EVUNUX0lEKSk7CisJCQlpZiAoZGVsZXRlKSB7CisJCQkJc2VydmVyCisJCQkJICAgIC5kZWxldGVCeUlkKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJDQVMuIiArIENvcmVNZXRLZXlzLlBST0RVQ1RfSUQpKTsKKwkJCX0KKwkJCXNlcnZlci5hZGQodGhpcy5nZXRTb2xyRG9jdW1lbnQobWV0YWRhdGEpKTsKKwkJCUxPRy5pbmZvKCJJbmRleGVkIHByb2R1Y3Q6ICIKKwkJCSAgICArIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJDQVMuIiArIENvcmVNZXRLZXlzLlBST0RVQ1RfSUQpKTsKKwkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlMT0cuc2V2ZXJlKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgbWV0YWRhdGEgb2JqZWN0OiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IGRlbGV0ZSBwcm9kdWN0IGZyb20gaW5kZXg6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpbmRleGVzIGFsbCBwcm9kdWN0IHR5cGVzIHJldHJpZXZlZCBmcm9tIHRoZSBGaWxlIE1hbmFnZXIgdG8KKwkgKiB0aGUgU29sciBpbmRleC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVsZXRlCisJICogICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZWFjaCBwcm9kdWN0IHR5cGUgcmV0cmlldmVkIGZyb20gdGhlIEZpbGUKKwkgKiAgICAgICAgICBNYW5hZ2VyIHNob3VsZCBiZSBkZWxldGVkIGZyb20gdGhlIGluZGV4LgorCSAqIEB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICBXaGVuIGFuIGVycm9yIG9jY3VycyBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFNvbHIgc2VydmVyIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyB2b2lkIGluZGV4UHJvZHVjdFR5cGVzKGJvb2xlYW4gZGVsZXRlKSB7CisJCUxPRy5pbmZvKCJJbmRleGluZyBwcm9kdWN0IHR5cGVzLi4uIik7CisJCXRyeSB7CisJCQlYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKAorCQkJICAgIHRoaXMuZm1VcmwpKTsKKwkJCUxPRy5pbmZvKCJSZXRyaWV2aW5nIGxpc3Qgb2YgcHJvZHVjdCB0eXBlcy4iKTsKKwkJCUxpc3Q8UHJvZHVjdFR5cGU+IHR5cGVzID0gZm1DbGllbnQuZ2V0UHJvZHVjdFR5cGVzKCk7CisJCQlmb3IgKFByb2R1Y3RUeXBlIHR5cGUgOiB0eXBlcykgeworCQkJCWlmICghY29uZmlnLmdldElnbm9yZVR5cGVzKCkuY29udGFpbnModHlwZS5nZXROYW1lKCkudHJpbSgpKSkgeworCQkJCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiaWQiLCB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSk7CisJCQkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKCJDQVMuUHJvZHVjdFR5cGVJZCIsIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKwkJCQkJbWV0YWRhdGEuYWRkTWV0YWRhdGEoIkNBUy5Qcm9kdWN0VHlwZURlc2NyaXB0aW9uIiwgdHlwZQorCQkJCQkgICAgLmdldERlc2NyaXB0aW9uKCkpOworCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3RUeXBlUmVwb3NpdG9yeVBhdGgiLCB0eXBlCisJCQkJCSAgICAuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkpOworCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3RUeXBlVmVyc2lvbmVyIiwgdHlwZS5nZXRWZXJzaW9uZXIoKSk7CisJCQkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKCJDQVMuUHJvZHVjdFR5cGVOYW1lIiwgdHlwZS5nZXROYW1lKCkpOworCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiUHJvZHVjdFR5cGUiLCAiUHJvZHVjdFR5cGUiKTsKKwkJCQkJbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkpOworCQkJCQlpZiAoZGVsZXRlKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXNlcnZlci5kZWxldGVCeUlkKHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IGRlbGV0ZSBwcm9kdWN0IHR5cGUgIiArIHR5cGUuZ2V0TmFtZSgpCisJCQkJCQkJICAgICsgIiBmcm9tIGluZGV4OiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXRyeSB7CisJCQkJCQlwZXJmb3JtU3Vic3RpdHV0aW9uKG1ldGFkYXRhKTsKKwkJCQkJCXNlcnZlci5hZGQodGhpcy5nZXRTb2xyRG9jdW1lbnQobWV0YWRhdGEpKTsKKwkJCQkJCUxPRy5pbmZvKCJJbmRleGVkIHByb2R1Y3QgdHlwZTogIiArIHR5cGUuZ2V0TmFtZSgpKTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUxPRy5zZXZlcmUoIkNvdWxkIG5vdCBpbmRleCAiICsgdHlwZS5nZXROYW1lKCkgKyAiOiAiCisJCQkJCQkgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlMT0cuaW5mbygiSWdub3JpbmcgcHJvZHVjdCB0eXBlOiAiICsgdHlwZS5nZXROYW1lKCkpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkZpbGUgTWFuYWdlciBVUkwgaXMgbWFsZm9ybWVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkNvdWxkIG5vdCBjb25uZWN0IHRvIEZpbGUgTWFuYWdlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IHJldHJpZXZlIHByb2R1Y3QgdHlwZXMgZnJvbSBGaWxlIE1hbmFnZXI6ICIKKwkJCSAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlMT0cuaW5mbygiRmluaXNoZWQgaW5kZXhpbmcgcHJvZHVjdCB0eXBlcy4iKTsKKwl9CisJCisJLyoqCisJICogU3VwcHJlc3NlcyBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aXRoIG9sZGVyIGZpbGUgbWFuYWdlcnMuIAorCSAqLworCXByaXZhdGUgUHJvZHVjdFBhZ2Ugc2FmZUZpcnN0UGFnZShYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCwgUHJvZHVjdFR5cGUgdHlwZSkgeworCQlQcm9kdWN0UGFnZSBwYWdlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXBhZ2UgPSBmbUNsaWVudC5nZXRGaXJzdFBhZ2UodHlwZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cuaW5mbygiTm8gcHJvZHVjdHMgZm91bmQgZm9yOiAiICsgdHlwZS5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiBwYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGluZGV4ZXMgYWxsIHByb2R1Y3RzIHJldHJpZXZlZCBmcm9tIHRoZSBGaWxlIE1hbmFnZXIgdG8gdGhlCisJICogU29sciBpbmRleC4gTWV0YWRhdGEgZnJvbSB0aGUgcHJvZHVjdCdzIGFzc29jaWF0ZWQgUHJvZHVjdFR5cGUgaXMgYWxzbworCSAqIGluY2x1ZGVkLgorCSAqIAorCSAqIEBwYXJhbSBkZWxldGUKKwkgKiAgICAgICAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciBlYWNoIHByb2R1Y3QgcmV0cmlldmVkIGZyb20gdGhlIEZpbGUKKwkgKiAgICAgICAgICBNYW5hZ2VyIHNob3VsZCBiZSBkZWxldGVkIGZyb20gdGhlIGluZGV4LgorCSAqIEB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICBXaGVuIGFuIGVycm9yIG9jY3VycyBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFNvbHIgc2VydmVyIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyB2b2lkIGluZGV4QWxsKGJvb2xlYW4gZGVsZXRlKSB7CisJCUxPRy5pbmZvKCJJbmRleGluZyBwcm9kdWN0cy4uLiIpOworCQl0cnkgeworCQkJWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1DbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgKKwkJCSAgICB0aGlzLmZtVXJsKSk7CisJCQlMT0cuaW5mbygiUmV0cmlldmluZyBsaXN0IG9mIHByb2R1Y3QgdHlwZXMuIik7CisJCQlMaXN0PFByb2R1Y3RUeXBlPiB0eXBlcyA9IGZtQ2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworCQkJZm9yIChQcm9kdWN0VHlwZSB0eXBlIDogdHlwZXMpIHsKKwkJCQlpZiAoIWNvbmZpZy5nZXRJZ25vcmVUeXBlcygpLmNvbnRhaW5zKHR5cGUuZ2V0TmFtZSgpLnRyaW0oKSkpIHsKKwkJCQkJTE9HLmluZm8oIlBhZ2luZyB0aHJvdWdoIHByb2R1Y3RzIGZvciBwcm9kdWN0IHR5cGU6ICIKKwkJCQkJICAgICsgdHlwZS5nZXROYW1lKCkpOworCQkJCQlQcm9kdWN0UGFnZSBwYWdlID0gc2FmZUZpcnN0UGFnZShmbUNsaWVudCwgdHlwZSk7IAorCQkJCQl3aGlsZSAocGFnZSAhPSBudWxsKSB7CisJCQkJCSAgICBmb3IgKFByb2R1Y3QgcHJvZHVjdCA6IHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQl0aGlzLmluZGV4UHJvZHVjdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpLCBmbUNsaWVudAorCQkJCQkJCQkgICAgLmdldE1ldGFkYXRhKHByb2R1Y3QpLCB0eXBlLmdldFR5cGVNZXRhZGF0YSgpKTsKKwkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQlMT0cuc2V2ZXJlKCJDb3VsZCBub3QgaW5kZXggIiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgKyAiOiAiCisJCQkJCQkJCSAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCSAgICBpZiAocGFnZS5pc0xhc3RQYWdlKCkpIHsKKwkJCQkJICAgICAgICBicmVhazsKKwkJCQkJICAgIH0KKwkJCQkJICAgIHBhZ2UgPSBmbUNsaWVudC5nZXROZXh0UGFnZSh0eXBlLCBwYWdlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUxPRy5pbmZvKCJGaW5pc2hlZCBpbmRleGluZyBwcm9kdWN0cy4iKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkZpbGUgTWFuYWdlciBVUkwgaXMgbWFsZm9ybWVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkNvdWxkIG5vdCBjb25uZWN0IHRvIEZpbGUgTWFuYWdlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisJCQlMT0cuc2V2ZXJlKCJDb3VsZCBub3QgcmV0cmlldmUgcHJvZHVjdHMgZnJvbSBGaWxlIE1hbmFnZXI6ICIKKwkJCSAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IHJldHJpZXZlIHByb2R1Y3QgdHlwZXMgZnJvbSBGaWxlIE1hbmFnZXI6ICIKKwkJCSAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBzaW5nbGUgcHJvZHVjdCByZXRyaWV2ZWQgZnJvbSB0aGUgRmlsZSBNYW5hZ2VyIGJ5IGl0cworCSAqIHByb2R1Y3QgaWRlbnRpZmllciB0byB0aGUgU29sciBpbmRleC4gTWV0YWRhdGEgZnJvbSB0aGUgUHJvZHVjdFR5cGUgaXMgYWxzbworCSAqIGluY2x1ZGVkLgorCSAqIAorCSAqIEBwYXJhbSBwcm9kdWN0SWQKKwkgKiAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCAoQ0FTLlByb2R1Y3RJZCkuCisJICogQHRocm93cyBTb2xyU2VydmVyRXhjZXB0aW9uCisJICogICAgICAgICAgIFdoZW4gYW4gZXJyb3Igb2NjdXJzIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgU29sciBzZXJ2ZXIgaW5zdGFuY2UuCisJICovCisJcHVibGljIHZvaWQgaW5kZXhQcm9kdWN0KFN0cmluZyBwcm9kdWN0SWQpCisJICAgIHRocm93cyBTb2xyU2VydmVyRXhjZXB0aW9uIHsKKwkJTE9HLmluZm8oIkF0dGVtcHRpbmcgdG8gaW5kZXggcHJvZHVjdDogIiArIHByb2R1Y3RJZCk7CisJCXRyeSB7CisJCQlYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKAorCQkJICAgIHRoaXMuZm1VcmwpKTsKKwkJCVByb2R1Y3QgcHJvZHVjdCA9IGZtQ2xpZW50LmdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisJCQlNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEgPSBmbUNsaWVudC5nZXRNZXRhZGF0YShwcm9kdWN0KTsKKwkJCWluZGV4UHJvZHVjdChwcm9kdWN0LmdldFByb2R1Y3RJZCgpLCBwcm9kdWN0TWV0YWRhdGEsIHByb2R1Y3QKKwkJCSAgICAuZ2V0UHJvZHVjdFR5cGUoKS5nZXRUeXBlTWV0YWRhdGEoKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cuc2V2ZXJlKCJGaWxlIE1hbmFnZXIgVVJMIGlzIG1hbGZvcm1lZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlMT0cuc2V2ZXJlKCJDb3VsZCBub3QgY29ubmVjdCB0byBGaWxlIE1hbmFnZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IHJldHJpZXZlIHByb2R1Y3QgZnJvbSBGaWxlIE1hbmFnZXI6ICIKKwkJCSAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkNvdWxkIG5vdCBmb3JtYXQgZGF0ZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgc2luZ2xlIHByb2R1Y3QgcmV0cmlldmVkIGZyb20gdGhlIEZpbGUgTWFuYWdlciBieSBpdHMKKwkgKiBwcm9kdWN0IG5hbWUgdG8gdGhlIFNvbHIgaW5kZXguIE1ldGFkYXRhIGZyb20gdGhlIFByb2R1Y3RUeXBlIGlzIGFsc28KKwkgKiBpbmNsdWRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvZHVjdE5hbWUKKwkgKiAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCAoQ0FTLlByb2R1Y3RJZCkuCisJICogQHBhcmFtIGRlbGV0ZQorCSAqICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbnRyeSBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIHRoZQorCSAqICAgICAgICAgIGluZGV4LgorCSAqIEB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICBXaGVuIGFuIGVycm9yIG9jY3VycyBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFNvbHIgc2VydmVyIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyB2b2lkIGluZGV4UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUsIGJvb2xlYW4gZGVsZXRlKSB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiB7CisJCQorCQlMT0cuaW5mbygiQXR0ZW1wdGluZyB0byBpbmRleCBwcm9kdWN0OiAiICsgcHJvZHVjdE5hbWUpOworCQl0cnkgeworCisJCQkvLyBUcnkgdG8gZGVsZXRlIHByb2R1Y3QgYnkgbmFtZQorCQkJLy8gTm90ZTogdGhlIHN0YW5kYXJkIGZpZWxkICJDQVMuUHJvZHVjdE5hbWUiIG11c3QgYmUgbWFwcGVkIHRvIHNvbWUgU29sciBmaWVsZCBpbiBmaWxlIGluZGV4ZXIucHJvcGVydGllcworCQkJaWYgKGRlbGV0ZSkgeworCQkJCXRyeSB7CisJCQkJCVN0cmluZyBwcm9kdWN0TmFtZUZpZWxkID0gY29uZmlnLm1hcFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPRFVDVF9OQU1FKTsKKwkJCQkJaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQocHJvZHVjdE5hbWVGaWVsZCkpIHsKKwkJCQkJCXNlcnZlci5kZWxldGVCeVF1ZXJ5KHByb2R1Y3ROYW1lRmllbGQrIjoiK3Byb2R1Y3ROYW1lKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUxPRy53YXJuaW5nKCJNZXRhZGF0YSBmaWVsZCAiK1BST0RVQ1RfTkFNRSsiIGlzIG5vdCBtYXBwZWQgdG8gYW55IFNvbHIgZmllbGQsIGNhbm5vdCBkZWxldGUgcHJvZHVjdCBieSBuYW1lIik7CisJCQkJCX0KKwkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJCUxPRy53YXJuaW5nKCJDb3VsZCBub3QgZGVsZXRlIHByb2R1Y3Q6ICIrcHJvZHVjdE5hbWUrIiBmcm9tIFNvbHIgaW5kZXgiKTsKKwkJCQl9CisJCQl9CisKKwkJCVhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoCisJCQkgICAgdGhpcy5mbVVybCkpOworCQkJUHJvZHVjdCBwcm9kdWN0ID0gZm1DbGllbnQuZ2V0UHJvZHVjdEJ5TmFtZShwcm9kdWN0TmFtZSk7CisJCQlNZXRhZGF0YSBwcm9kdWN0TWV0YWRhdGEgPSBmbUNsaWVudC5nZXRNZXRhZGF0YShwcm9kdWN0KTsKKwkJCS8vIE5PVEU6IGRlbGV0ZSAoYnkgaWQpIGlzIG5vdyBmYWxzZQorCQkJaW5kZXhQcm9kdWN0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksIHByb2R1Y3RNZXRhZGF0YSwgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldFR5cGVNZXRhZGF0YSgpKTsKKwkJCQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiRmlsZSBNYW5hZ2VyIFVSTCBpcyBtYWxmb3JtZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IGNvbm5lY3QgdG8gRmlsZSBNYW5hZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5zZXZlcmUoIkNvdWxkIG5vdCByZXRyaWV2ZSBwcm9kdWN0IGZyb20gRmlsZSBNYW5hZ2VyOiAiCisJCQkgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlMT0cuc2V2ZXJlKCJDb3VsZCBub3QgZm9ybWF0IGRhdGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5kZXhQcm9kdWN0KFN0cmluZyBwcm9kdWN0SWQsIE1ldGFkYXRhIHByb2R1Y3RNZXRhZGF0YSwKKwkgICAgTWV0YWRhdGEgdHlwZU1ldGFkYXRhKSB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiwKKwkgICAgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIHsKKwkJTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKwkJbWV0YWRhdGEuYWRkTWV0YWRhdGEoImlkIiwgcHJvZHVjdElkKTsKKwkJLy8gQWRkIGluIHByb2R1Y3QgdHlwZSBtZXRhZGF0YQorCQlpZiAodHlwZU1ldGFkYXRhICE9IG51bGwpIHsKKwkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKHR5cGVNZXRhZGF0YSk7CisJCX0KKwkJaWYgKHByb2R1Y3RNZXRhZGF0YSAhPSBudWxsKSB7CisJCQlTdHJpbmcgYWNjZXNzS2V5ID0gY29uZmlnLmdldFByb3BlcnR5KEFDQ0VTU19LRVkpOworCQkJLy8gUHJvZHVjdCBtZXRhZGF0YSB0YWtlcyBwcmVjZWRlbmNlCisJCQltZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEocHJvZHVjdE1ldGFkYXRhKTsKKwkJCS8vIElmIHRoZXJlIGlzIGFuIGFjY2VzcyB1cmwgY29uZmlndXJlZCBhZGQgaXQgdG8gdGhlIG1ldGFkYXRhCisJCQlpZiAoY29uZmlnLmdldFByb3BlcnR5KEFDQ0VTU19VUkwpICE9IG51bGwpIHsKKwkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YShhY2Nlc3NLZXksIGNvbmZpZy5nZXRQcm9wZXJ0eShBQ0NFU1NfVVJMKSk7CisJCQl9CisJCQkvLyBSZXBsYWNlIHZhbHVlcyBmb3IgbWV0YWRhdGEga2V5cyBzcGVjaWZpZWQgaW4gY29uZmlnLiBUaGlzIGFsbG93cworCQkJLy8gZm9yIG1ldGFkYXRhIHN1YnN0aXR1dGlvbi4gRm9yIGluc3RhbmNlLCBpZiBhIGtleSBuYW1lZCAicHJvZHVjdF91cmwiCisJCQkvLyBoYXMgYSB2YWx1ZSBvZgorCQkJLy8gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Nhcy1wcm9kdWN0L2RhdGE/cHJvZHVjdElEPVtDQVMuUHJvZHVjdElkXQorCQkJLy8gdGhlIHZhbHVlIGluIGJyYWtldHMgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHZhbHVlIGZyb20gdGhlCisJCQkvLyBDQVMuUHJvZHVjdElkLgorCQkJcGVyZm9ybVN1YnN0aXR1dGlvbihtZXRhZGF0YSk7CisJCQl0cnkgeworCQkJCXNlcnZlci5hZGQodGhpcy5nZXRTb2xyRG9jdW1lbnQobWV0YWRhdGEpKTsKKwkJCQlMT0cuaW5mbygiSW5kZXhlZCBwcm9kdWN0OiAiICsgcHJvZHVjdElkKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlMT0cuc2V2ZXJlKCJDb3VsZCBub3QgaW5kZXggcHJvZHVjdDogIiArIHByb2R1Y3RJZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlMT0cuaW5mbygiQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yIHByb2R1Y3Q6ICIgKyBwcm9kdWN0SWQpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgZGVsZXRlcyBhIHNpbmdsZSBwcm9kdWN0IGlkZW50aWZpZWQgYnkgYSBwcm9kdWN0SUQgZnJvbSB0aGUgU29sciBpbmRleAorCSAqIAorCSAqIEBwYXJhbSBwcm9kdWN0SWQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogQHRocm93cyBTb2xyU2VydmVyRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlUHJvZHVjdChTdHJpbmcgcHJvZHVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvbHJTZXJ2ZXJFeGNlcHRpb24geworCQlMT0cuaW5mbygiQXR0ZW1wdGluZyB0byBkZWxldGUgcHJvZHVjdDogIiArIHByb2R1Y3RJZCk7CisJCXRoaXMuZGVsZXRlUHJvZHVjdEZyb21JbmRleChwcm9kdWN0SWQpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSBwcm9kdWN0KHMpIGZyb20gdGhlIFNvbHIgaW5kZXggaWRlbnRpZmllZCBieSBhIGdpdmVuIG5hbWUKKwkgKiAKKwkgKiBAcGFyYW0gcHJvZHVjdE5hbWUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogQHRocm93cyBTb2xyU2VydmVyRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlUHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgU29sclNlcnZlckV4Y2VwdGlvbiB7CisJCUxPRy5pbmZvKCJBdHRlbXB0aW5nIHRvIGRlbGV0ZSBwcm9kdWN0OiAiICsgcHJvZHVjdE5hbWUpOworCisJCXRyeSB7CisJCQlTdHJpbmcgcHJvZHVjdE5hbWVGaWVsZCA9IGNvbmZpZy5tYXBQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST0RVQ1RfTkFNRSk7CisJCQlpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChwcm9kdWN0TmFtZUZpZWxkKSkgeworCQkJCXNlcnZlci5kZWxldGVCeVF1ZXJ5KHByb2R1Y3ROYW1lRmllbGQrIjoiK3Byb2R1Y3ROYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HLndhcm5pbmcoIk1ldGFkYXRhIGZpZWxkICIrUFJPRFVDVF9OQU1FKyIgaXMgbm90IG1hcHBlZCB0byBhbnkgU29sciBmaWVsZCwgY2Fubm90IGRlbGV0ZSBwcm9kdWN0IGJ5IG5hbWUiKTsKKwkJCX0KKwkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJTE9HLndhcm5pbmcoIkNvdWxkIG5vdCBkZWxldGUgcHJvZHVjdDogIitwcm9kdWN0TmFtZSsiIGZyb20gU29sciBpbmRleCIpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlUHJvZHVjdEZyb21JbmRleChTdHJpbmcgcHJvZHVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvbHJTZXJ2ZXJFeGNlcHRpb24geworCQlzZXJ2ZXIuZGVsZXRlQnlJZChwcm9kdWN0SWQpOworCX0KKwkKKwkvKioKKwkgKiBRdWljayBoZWxwZXIgbWV0aG9kIHRvIGRvIHN1YnN0aXR1dGlvbiBvbiB0aGUga2V5cyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZworCSAqIAorCSAqIEBwYXJhbSBtZXRhZGF0YQorCSAqICAgICAgICAgIHRvIHN1YnN0aXR1dGUgb24KKwkgKiBAdGhyb3dzIGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBwZXJmb3JtU3Vic3RpdHV0aW9uKE1ldGFkYXRhIG1ldGFkYXRhKQorCSAgICB0aHJvd3MgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIHsKKwkJLy8gRG8gbWV0YWRhdGEgcmVwbGFjZW1lbnQKKwkJZm9yIChTdHJpbmcga2V5IDogY29uZmlnLmdldFJlcGxhY2VtZW50S2V5cygpKSB7CisJCQlMaXN0PFN0cmluZz4gdmFsdWVzID0gbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KTsKKwkJCWlmICh2YWx1ZXMgIT0gbnVsbCkgeworCQkJCUxpc3Q8U3RyaW5nPiBuZXdWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworCQkJCQluZXdWYWx1ZXMuYWRkKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHZhbHVlLCBtZXRhZGF0YSkpOworCQkJCX0KKwkJCQltZXRhZGF0YS5yZW1vdmVNZXRhZGF0YShrZXkpOworCQkJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKGtleSwgbmV3VmFsdWVzKTsKKwkJCX0KKwkJfQorCQkvLyBGb3JtYXQgZGF0ZXMKKwkJZm9yIChPYmplY3Qga2V5IDogY29uZmlnLmdldEZvcm1hdFByb3BlcnRpZXMoKS5rZXlTZXQoKSkgeworCQkJU3RyaW5nIGtleVN0cmluZyA9IChTdHJpbmcpIGtleTsKKwkJCWlmIChtZXRhZGF0YS5jb250YWluc0tleShrZXlTdHJpbmcpKSB7CisJCQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleVN0cmluZyk7CisJCQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisJCQkJCUxpc3Q8U3RyaW5nPiBuZXdWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQkJU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChjb25maWcKKwkJCQkJICAgIC5nZXRGb3JtYXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoa2V5U3RyaW5nKS50cmltKCkpOworCQkJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworCQkJCQkJbmV3VmFsdWVzLmFkZChmb3JtYXREYXRlKGZvcm1hdCwgdmFsdWUpKTsKKwkJCQkJfQorCQkJCQltZXRhZGF0YS5yZW1vdmVNZXRhZGF0YShrZXlTdHJpbmcpOworCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0YShrZXlTdHJpbmcsIG5ld1ZhbHVlcyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZm9ybWF0RGF0ZShTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCwgU3RyaW5nIHZhbHVlKQorCSAgICB0aHJvd3MgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIHsKKwkJLy8gSWdub3JlIGZvcm1hdGluZyBpZiBpdHMgYW4gaWdub3JlIHZhbHVlCisJCWlmIChjb25maWcuZ2V0SWdub3JlVmFsdWVzKCkuY29udGFpbnModmFsdWUudHJpbSgpKSkKKwkJCXJldHVybiB2YWx1ZTsKKwkJcmV0dXJuIHNvbHJGb3JtYXQuZm9ybWF0KGZvcm1hdC5wYXJzZSh2YWx1ZSkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGJ1aWxkcyB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJICogCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgT3B0aW9ucy4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygic3RhdGljLWFjY2VzcyIpCisJcHVibGljIHN0YXRpYyBPcHRpb25zIGJ1aWxkQ29tbWFuZExpbmUoKSB7CisJCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7CisKKwkJb3B0aW9ucy5hZGRPcHRpb24obmV3IE9wdGlvbigiaCIsICJoZWxwIiwgZmFsc2UsICJQcmludCB0aGlzIG1lc3NhZ2UiKSk7CisJCW9wdGlvbnMuYWRkT3B0aW9uKG5ldyBPcHRpb24oIm8iLCAib3B0aW1pemUiLCBmYWxzZSwKKwkJICAgICJPcHRpbWl6ZSB0aGUgU29sciBpbmRleCIpKTsKKwkJb3B0aW9ucy5hZGRPcHRpb24obmV3IE9wdGlvbigiZCIsICJkZWxldGUiLCBmYWxzZSwKKwkJICAgICJEZWxldGUgaXRlbSBiZWZvcmUgaW5kZXhpbmciKSk7CisJCW9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIud2l0aEFyZ05hbWUoIlNvbHIgVVJMIikuaGFzQXJnKCkKKwkJICAgIC53aXRoRGVzY3JpcHRpb24oIlVSTCB0byB0aGUgU29sciBpbnN0YW5jZSIpLndpdGhMb25nT3B0KCJzb2xyVXJsIikKKwkJICAgIC5jcmVhdGUoInN1IikpOworCQlvcHRpb25zLmFkZE9wdGlvbihPcHRpb25CdWlsZGVyLndpdGhBcmdOYW1lKCJGaWxlbWdyIFVSTCIpLmhhc0FyZygpCisJCSAgICAud2l0aERlc2NyaXB0aW9uKCJVUkwgdG8gdGhlIEZpbGUgTWFuYWdlciIpLndpdGhMb25nT3B0KCJmbVVybCIpCisJCSAgICAuY3JlYXRlKCJmbXUiKSk7CisKKwkJT3B0aW9uR3JvdXAgZ3JvdXAgPSBuZXcgT3B0aW9uR3JvdXAoKTsKKwkJT3B0aW9uIGFsbCA9IG5ldyBPcHRpb24oImEiLCAiYWxsIiwgZmFsc2UsCisJCSAgICAiSW5kZXggYWxsIHByb2R1Y3RzIGZyb20gdGhlIEZpbGUgTWFuYWdlciIpOworCQlPcHRpb24gcHJvZHVjdCA9IE9wdGlvbkJ1aWxkZXIud2l0aEFyZ05hbWUoInByb2R1Y3RJZCIpLmhhc0FyZygpCisJCSAgICAud2l0aERlc2NyaXB0aW9uKCJJbmRleCB0aGUgcHJvZHVjdCBmcm9tIHRoZSBGaWxlIE1hbmFnZXIiKQorCQkgICAgLndpdGhMb25nT3B0KCJwcm9kdWN0IikuY3JlYXRlKCJwIik7CisJCU9wdGlvbiBtZXQgPSBPcHRpb25CdWlsZGVyLndpdGhBcmdOYW1lKCJmaWxlIikuaGFzQXJnKCkud2l0aERlc2NyaXB0aW9uKAorCQkgICAgIkluZGV4IHRoZSBwcm9kdWN0IGZyb20gYSBtZXRhZGF0YSBmaWxlIikud2l0aExvbmdPcHQoIm1ldEZpbGUiKQorCQkgICAgLmNyZWF0ZSgibWYiKTsKKwkJT3B0aW9uIHJlYWQgPSBuZXcgT3B0aW9uKCJyIiwgInJlYWQiLCBmYWxzZSwKKwkJICAgICJJbmRleCBhbGwgcHJvZHVjdHMgYmFzZWQgb24gYSBsaXN0IG9mIHByb2R1Y3QgaWRlbnRpZmllcnMgcGFzc2VkIGluIik7CisJCU9wdGlvbiB0eXBlcyA9IG5ldyBPcHRpb24oInQiLCAidHlwZXMiLCBmYWxzZSwKKwkJICAgICJJbmRleCBhbGwgcHJvZHVjdCB0eXBlcyBmcm9tIHRoZSBGaWxlIE1hbmFnZXIiKTsKKwkJT3B0aW9uIGRlbGV0ZUFsbCA9IG5ldyBPcHRpb24oImRhIiwgImRlbGV0ZUFsbCIsIGZhbHNlLAorCQkgICAgIkRlbGV0ZSBhbGwgcHJvZHVjdHMvdHlwZXMgZnJvbSB0aGUgU29sciBpbmRleCIpOworCisJCWdyb3VwLmFkZE9wdGlvbihhbGwpOworCQlncm91cC5hZGRPcHRpb24ocHJvZHVjdCk7CisJCWdyb3VwLmFkZE9wdGlvbihtZXQpOworCQlncm91cC5hZGRPcHRpb24ocmVhZCk7CisJCWdyb3VwLmFkZE9wdGlvbih0eXBlcyk7CisJCWdyb3VwLmFkZE9wdGlvbihkZWxldGVBbGwpOworCQlvcHRpb25zLmFkZE9wdGlvbkdyb3VwKGdyb3VwKTsKKworCQlyZXR1cm4gb3B0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGUgbWFpbiBtZXRob2QuIEV4ZWN1dGlvbiB3aXRob3V0IGFyZ3VtZW50IGRpc3BsYXlzIGhlbHAgbWVzc2FnZS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqICAgICAgICAgIENvbW1hbmQtbGluZSBhcmd1bWVudHMuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9wdGlvbnMgb3B0aW9ucyA9IFNvbHJJbmRleGVyLmJ1aWxkQ29tbWFuZExpbmUoKTsKKwkJQ29tbWFuZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IEdudVBhcnNlcigpOworCQlDb21tYW5kTGluZSBsaW5lID0gbnVsbDsKKworCQl0cnkgeworCQkJbGluZSA9IHBhcnNlci5wYXJzZShvcHRpb25zLCBhcmdzKTsKKwkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJTE9HLnNldmVyZSgiQ291bGQgbm90IHBhcnNlIGNvbW1hbmQgbGluZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCisJCWlmIChsaW5lID09IG51bGwgfHwgbGluZS5oYXNPcHRpb24oImhlbHAiKSB8fCBsaW5lLmdldE9wdGlvbnMoKS5sZW5ndGggPT0gMCkgeworCQkJSGVscEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgSGVscEZvcm1hdHRlcigpOworCQkJZm9ybWF0dGVyLnByaW50SGVscCgiamF2YSAiICsgU29sckluZGV4ZXIuY2xhc3MuZ2V0TmFtZSgpLCBvcHRpb25zKTsKKwkJfSBlbHNlIGlmIChsaW5lLmhhc09wdGlvbigiYWxsIikgfHwgbGluZS5oYXNPcHRpb24oInByb2R1Y3QiKQorCQkgICAgfHwgbGluZS5oYXNPcHRpb24oIm1ldEZpbGUiKSB8fCBsaW5lLmhhc09wdGlvbigicmVhZCIpCisJCSAgICB8fCBsaW5lLmhhc09wdGlvbigidHlwZXMiKSB8fCBsaW5lLmhhc09wdGlvbigiZGVsZXRlQWxsIikpIHsKKwkJCVNvbHJJbmRleGVyIGluZGV4ZXIgPSBudWxsOworCQkJU3RyaW5nIHNvbHJVcmwgPSBudWxsOworCQkJU3RyaW5nIGZtVXJsID0gbnVsbDsKKwkJCWlmIChsaW5lLmhhc09wdGlvbigic29sclVybCIpKSB7CisJCQkJc29sclVybCA9IGxpbmUuZ2V0T3B0aW9uVmFsdWUoInNvbHJVcmwiKTsKKwkJCX0KKwkJCWlmIChsaW5lLmhhc09wdGlvbigiZm1VcmwiKSkgeworCQkJCWZtVXJsID0gbGluZS5nZXRPcHRpb25WYWx1ZSgiZm1VcmwiKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJaW5kZXhlciA9IG5ldyBTb2xySW5kZXhlcihzb2xyVXJsLCBmbVVybCk7CisJCQkJaWYgKGxpbmUuaGFzT3B0aW9uKCJhbGwiKSkgeworCQkJCQlpbmRleGVyLmluZGV4QWxsKGxpbmUuaGFzT3B0aW9uKCJkZWxldGUiKSk7CisJCQkJfSBlbHNlIGlmIChsaW5lLmhhc09wdGlvbigicHJvZHVjdCIpKSB7CisJCQkJCWluZGV4ZXIuaW5kZXhQcm9kdWN0KGxpbmUuZ2V0T3B0aW9uVmFsdWUoInByb2R1Y3QiKSk7CisJCQkJfSBlbHNlIGlmIChsaW5lLmhhc09wdGlvbigibWV0RmlsZSIpKSB7CisJCQkJCWluZGV4ZXIuaW5kZXhNZXRGaWxlKG5ldyBGaWxlKGxpbmUuZ2V0T3B0aW9uVmFsdWUoIm1ldEZpbGUiKSksIGxpbmUKKwkJCQkJICAgIC5oYXNPcHRpb24oImRlbGV0ZSIpKTsKKwkJCQl9IGVsc2UgaWYgKGxpbmUuaGFzT3B0aW9uKCJyZWFkIikpIHsKKwkJCQkJZm9yIChTdHJpbmcgcHJvZHVjdElkIDogcmVhZFByb2R1Y3RJZHNGcm9tU3RkaW4oKSkgeworCQkJCQkJaW5kZXhlci5pbmRleFByb2R1Y3QocHJvZHVjdElkKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAobGluZS5oYXNPcHRpb24oInR5cGVzIikpIHsKKwkJCQkJaW5kZXhlci5pbmRleFByb2R1Y3RUeXBlcyhsaW5lLmhhc09wdGlvbigiZGVsZXRlIikpOworCQkJCX0gZWxzZSBpZiAobGluZS5oYXNPcHRpb24oImRlbGV0ZUFsbCIpKSB7CisJCQkJCWluZGV4ZXIuZGVsZXRlKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJTE9HLnNldmVyZSgiT3B0aW9uIG5vdCBzdXBwb3J0ZWQuIik7CisJCQkJfQorCQkJCWluZGV4ZXIuY29tbWl0KCk7CisJCQkJaWYgKGxpbmUuaGFzT3B0aW9uKCJvcHRpbWl6ZSIpKSB7CisJCQkJCWluZGV4ZXIub3B0aW1pemUoKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCUxPRy5zZXZlcmUoIkFuIGVycm9yIG9jY3VycmVkIGluZGV4aW5nOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCUxPRworCQkJCSAgICAuc2V2ZXJlKCJJZiB0aGUgYWJvdmUgbWVzc2FnZSBpcyByZWxhdGVkIHRvIGFjY2Vzc2luZyB0aGUgU29sciBpbnN0YW5jZSwgc2VlIHRoZSBBcHBsaWNhdGlvbiBTZXJ2ZXIncyBsb2cgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uIik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZWFkcyBwcm9kdWN0IGlkZW50aWZpZXJzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorCSAqIAorCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3Qgb2YgcHJvZHVjdCBpZGVudGlmaWVycy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZFByb2R1Y3RJZHNGcm9tU3RkaW4oKSB7CisJCUxpc3Q8U3RyaW5nPiBwcm9kdWN0SWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKworCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CisJCVN0cmluZyBsaW5lID0gbnVsbDsKKworCQl0cnkgeworCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCXByb2R1Y3RJZHMuYWRkKGxpbmUpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlMT0cuc2V2ZXJlKCJFcnJvciByZWFkaW5nIHByb2R1Y3QgaWQ6IGxpbmU6IFsiICsgbGluZSArICJdOiBNZXNzYWdlOiAiCisJCQkgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoYnIgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWJyLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworCQkJCX0KKwkJCQliciA9IG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2R1Y3RJZHM7CisJfQorCisJLyoqCisJICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBJbmRleGVyIGNvbmZpZ3VyYXRpb24uCisJICovCisJcHVibGljIGNsYXNzIEluZGV4ZXJDb25maWcgeworCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRklYX0NPTkZJRyA9ICJjb25maWcuIjsKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZJWF9NRVQgPSAibWFwLiI7CisJCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVhfRk9STUFUID0gImZvcm1hdC4iOworCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUdOT1JFX1RZUEVTID0gImlnbm9yZS50eXBlcyI7CisJCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJR05PUkVfVkFMVUVTID0gImlnbm9yZS52YWx1ZXMiOworCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVQTEFDRU1FTlRfS0VZUyA9ICJyZXBsYWNlbWVudC5rZXlzIjsKKwkJLy8gVXNlZCB0byBob2xkIGdlbmVyYWwgcHJvcGVydGllcyBmb3IgaW5kZXhlciBjb25maWd1cmF0aW9uCisJCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJLy8gVXNlZCB0byBob2xkIG1hcHBpbmdzIGZvciBmaWxlbWFuYWdlciAtPiBzb2xyIGZvciBrZXlzCisJCXByaXZhdGUgUHJvcGVydGllcyBtYXBQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJLy8gVXNlZCB0byBkZWZpbmUgdGhlIGRhdGUgZm9ybWF0IGZvciBhIGZpZWxkCisJCXByaXZhdGUgUHJvcGVydGllcyBmb3JtYXRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gaWdub3JlVHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gaWdub3JlVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXByaXZhdGUgTGlzdDxTdHJpbmc+IHJlcGxhY2VtZW50S2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCXB1YmxpYyBJbmRleGVyQ29uZmlnKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCQlwcm9wcy5sb2FkKGlucHV0U3RyZWFtKTsKKwkJCWZvciAoT2JqZWN0IG9iaktleSA6IHByb3BzLmtleVNldCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIG9iaktleTsKKwkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgoUFJFRklYX0NPTkZJRykpIHsKKwkJCQkJcHJvcGVydGllcy5wdXQoa2V5LnN1YnN0cmluZyhQUkVGSVhfQ09ORklHLmxlbmd0aCgpKSwgcHJvcHMKKwkJCQkJICAgIC5nZXRQcm9wZXJ0eShrZXkpKTsKKwkJCQl9IGVsc2UgaWYgKGtleS5zdGFydHNXaXRoKFBSRUZJWF9NRVQpKSB7CisJCQkJCW1hcFByb3BlcnRpZXMucHV0KGtleS5zdWJzdHJpbmcoUFJFRklYX01FVC5sZW5ndGgoKSksIHByb3BzCisJCQkJCSAgICAuZ2V0UHJvcGVydHkoa2V5KSk7CisJCQkJfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChQUkVGSVhfRk9STUFUKSkgeworCQkJCQlmb3JtYXRQcm9wZXJ0aWVzLnB1dChrZXkuc3Vic3RyaW5nKFBSRUZJWF9GT1JNQVQubGVuZ3RoKCkpLCBwcm9wcworCQkJCQkgICAgLmdldFByb3BlcnR5KGtleSkpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSUdOT1JFX1RZUEVTKSAhPSBudWxsKSB7CisJCQkJU3RyaW5nW10gdmFsdWVzID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShJR05PUkVfVFlQRVMpLnRyaW0oKQorCQkJCSAgICAuc3BsaXQoIiwiKTsKKwkJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworCQkJCQlpZ25vcmVUeXBlcy5hZGQodmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSUdOT1JFX1ZBTFVFUykgIT0gbnVsbCkgeworCQkJCVN0cmluZ1tdIHZhbHVlcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSUdOT1JFX1ZBTFVFUykudHJpbSgpLnNwbGl0KAorCQkJCSAgICAiLCIpOworCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7CisJCQkJCWlnbm9yZVZhbHVlcy5hZGQodmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUkVQTEFDRU1FTlRfS0VZUykgIT0gbnVsbCkgeworCQkJCVN0cmluZ1tdIHZhbHVlcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUkVQTEFDRU1FTlRfS0VZUykudHJpbSgpCisJCQkJICAgIC5zcGxpdCgiLCIpOworCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7CisJCQkJCXJlcGxhY2VtZW50S2V5cy5hZGQodmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgeworCQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworCQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5LCBkZWZhdWx0VmFsdWUpOworCQl9CisKKwkJcHVibGljIFByb3BlcnRpZXMgZ2V0TWFwUHJvcGVydGllcygpIHsKKwkJCXJldHVybiBtYXBQcm9wZXJ0aWVzOworCQl9CisKKwkJcHVibGljIFByb3BlcnRpZXMgZ2V0Rm9ybWF0UHJvcGVydGllcygpIHsKKwkJCXJldHVybiBmb3JtYXRQcm9wZXJ0aWVzOworCQl9CisKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJZ25vcmVUeXBlcygpIHsKKwkJCXJldHVybiB0aGlzLmlnbm9yZVR5cGVzOworCQl9CisKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJZ25vcmVWYWx1ZXMoKSB7CisJCQlyZXR1cm4gdGhpcy5pZ25vcmVWYWx1ZXM7CisJCX0KKworCQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlcGxhY2VtZW50S2V5cygpIHsKKwkJCXJldHVybiB0aGlzLnJlcGxhY2VtZW50S2V5czsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvRGJTdHJ1Y3RGYWN0b3J5LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9EYlN0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODlmYjljCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvRGJTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldnNpb24kCisgKiAKKyAqIDxwPgorICogT2JqZWN0IGNyZWF0aW9uIHV0aWxpdGllcyB0byBjcmVhdGUgRmlsZSBNYW5hZ2VyIG9iamVjdHMgZnJvbSBTUUwKKyAqIHtAbGluayBSZXN1bHRTZXR9cy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGJTdHJ1Y3RGYWN0b3J5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGUoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICB0eXBlLnNldERlc2NyaXB0aW9uKHJzLmdldFN0cmluZygicHJvZHVjdF90eXBlX2Rlc2NyaXB0aW9uIikpOworICAgICAgICB0eXBlLnNldE5hbWUocnMuZ2V0U3RyaW5nKCJwcm9kdWN0X3R5cGVfbmFtZSIpKTsKKyAgICAgICAgdHlwZS5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgocnMKKyAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJwcm9kdWN0X3R5cGVfcmVwb3NpdG9yeV9wYXRoIikpOworICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQoU3RyaW5nLnZhbHVlT2YocnMuZ2V0SW50KCJwcm9kdWN0X3R5cGVfaWQiKSkpOworICAgICAgICB0eXBlLnNldFZlcnNpb25lcihycy5nZXRTdHJpbmcoInByb2R1Y3RfdHlwZV92ZXJzaW9uZXJfY2xhc3MiKSk7CisKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9kdWN0IGdldFByb2R1Y3QoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2R1Y3QocnMsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb2R1Y3QgZ2V0UHJvZHVjdChSZXN1bHRTZXQgcnMsIGJvb2xlYW4gZ2V0VHlwZSwgYm9vbGVhbiBwcm9kdWN0SWRTdHJpbmcpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgICAgaWYgKHByb2R1Y3RJZFN0cmluZykgeworICAgICAgICAJcHJvZHVjdC5zZXRQcm9kdWN0SWQocnMuZ2V0U3RyaW5nKCJwcm9kdWN0X2lkIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJcHJvZHVjdC5zZXRQcm9kdWN0SWQoU3RyaW5nLnZhbHVlT2YocnMuZ2V0SW50KCJwcm9kdWN0X2lkIikpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3ROYW1lKHJzLmdldFN0cmluZygicHJvZHVjdF9uYW1lIikpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUocnMuZ2V0U3RyaW5nKCJwcm9kdWN0X3N0cnVjdHVyZSIpKTsKKyAgICAgICAgcHJvZHVjdC5zZXRUcmFuc2ZlclN0YXR1cyhycy5nZXRTdHJpbmcoInByb2R1Y3RfdHJhbnNmZXJfc3RhdHVzIikpOworICAgICAgICBpZiAoZ2V0VHlwZSkgeworICAgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0VHlwZShnZXRQcm9kdWN0VHlwZShycykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc3RpbGwgZ3JhYiB0aGUgSUQKKyAgICAgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgICAgIHR5cGUuc2V0UHJvZHVjdFR5cGVJZChycy5nZXRTdHJpbmcoInByb2R1Y3RfdHlwZV9pZCIpKTsKKyAgICAgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgICAgIHIuc2V0T3JpZ1JlZmVyZW5jZShycy5nZXRTdHJpbmcoInByb2R1Y3Rfb3JpZ19yZWZlcmVuY2UiKSk7CisgICAgICAgIHIuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKHJzLmdldFN0cmluZygicHJvZHVjdF9kYXRhc3RvcmVfcmVmZXJlbmNlIikpOworICAgICAgICByLnNldEZpbGVTaXplKHJzLmdldExvbmcoInByb2R1Y3RfcmVmZXJlbmNlX2ZpbGVzaXplIikpOworICAgICAgICByLnNldE1pbWVUeXBlKHJzLmdldFN0cmluZygicHJvZHVjdF9yZWZlcmVuY2VfbWltZXR5cGUiKSk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRFbGVtZW50KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5ldyBFbGVtZW50KCk7CisgICAgICAgIGVsZW1lbnQuc2V0RWxlbWVudElkKFN0cmluZy52YWx1ZU9mKHJzLmdldEludCgiZWxlbWVudF9pZCIpKSk7CisgICAgICAgIGVsZW1lbnQuc2V0RWxlbWVudE5hbWUocnMuZ2V0U3RyaW5nKCJlbGVtZW50X25hbWUiKSk7CisgICAgICAgIGVsZW1lbnQuc2V0RENFbGVtZW50KHJzLmdldFN0cmluZygiZGNfZWxlbWVudCIpKTsKKyAgICAgICAgZWxlbWVudC5zZXREZXNjcmlwdGlvbihycy5nZXRTdHJpbmcoImVsZW1lbnRfZGVzY3JpcHRpb24iKSk7CisgICAgICAgIHJldHVybiBlbGVtZW50OworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFyZW50KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSBycy5nZXRTdHJpbmcoInBhcmVudF9pZCIpOworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgdG9TY2llbmNlRGF0YUVsZW1lbnQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5ldyBFbGVtZW50KCk7CisgICAgICBlbGVtZW50LnNldEVsZW1lbnRJZChycy5nZXRTdHJpbmcoInBhcmFtZXRlcl9pZCIpKTsKKyAgICAgIGVsZW1lbnQuc2V0RWxlbWVudE5hbWUocnMuZ2V0U3RyaW5nKCJzaG9ydE5hbWUiKSk7CisgICAgICBlbGVtZW50LnNldERlc2NyaXB0aW9uKHJzLmdldFN0cmluZygiZGVzY3JpcHRpb24iKSk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb2R1Y3QgdG9TY2llbmNlRGF0YVByb2R1Y3QoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZChycy5nZXRTdHJpbmcoImdyYW51bGVfaWQiKSk7CisgICAgICBwcm9kdWN0LnNldFByb2R1Y3ROYW1lKHJzLmdldFN0cmluZygiZmlsZW5hbWUiKSk7CisgICAgICBwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCk7CisgICAgICBwcm9kdWN0LnNldFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QuU1RBVFVTX1JFQ0VJVkVEKTsKKyAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgIHR5cGUuc2V0UHJvZHVjdFR5cGVJZChycy5nZXRTdHJpbmcoImRhdGFzZXRfaWQiKSk7CisgICAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHR5cGUpOworICAgICAgcmV0dXJuIHByb2R1Y3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9kdWN0VHlwZSB0b1NjaWVuY2VEYXRhUHJvZHVjdFR5cGUoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgIHR5cGUuc2V0UHJvZHVjdFR5cGVJZChycy5nZXRTdHJpbmcoImRhdGFzZXRfaWQiKSk7CisgICAgICB0eXBlLnNldERlc2NyaXB0aW9uKHJzLmdldFN0cmluZygiZGVzY3JpcHRpb24iKSk7CisgICAgICB0eXBlLnNldE5hbWUocnMuZ2V0U3RyaW5nKCJzaG9ydE5hbWUiKSk7CisgICAgICB0eXBlLnNldFZlcnNpb25lcigiZ292Lm5hc2EuanBsLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5CYXNpY1ZlcnNpb25lciIpOyAvLyB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uZXIKKyAgICAgIHR5cGUuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi8vL3RtcCIpOyAvLyBub3QgbW92aW5nIGZpbGVzIGFueXdheXMKKworICAgICAgTWV0YWRhdGEgdHlwZU1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgdHlwZU1ldC5hZGRNZXRhZGF0YSgiRGF0YXNldElkIiwgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkpOworICAgICAgdHlwZU1ldC5hZGRNZXRhZGF0YSgiRGF0YXNldFNob3J0TmFtZSIsCisgICAgICAgICAgdHlwZS5nZXROYW1lKCkgIT0gbnVsbCA/IHR5cGUuZ2V0TmFtZSgpIDogIiIpOworICAgICAgdHlwZU1ldC5hZGRNZXRhZGF0YSgiRGF0YXNldExvbmdOYW1lIiwKKyAgICAgICAgICBycy5nZXRTdHJpbmcoImxvbmdOYW1lIikgIT0gbnVsbCA/IHJzLmdldFN0cmluZygibG9uZ05hbWUiKSA6ICIiKTsKKyAgICAgIHR5cGVNZXQuYWRkTWV0YWRhdGEoIkRlc2NyaXB0aW9uIiwKKyAgICAgICAgICB0eXBlLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCA/IHR5cGUuZ2V0RGVzY3JpcHRpb24oKSA6ICIiKTsKKyAgICAgIHR5cGVNZXQuYWRkTWV0YWRhdGEoIlNvdXJjZSIsCisgICAgICAgICAgcnMuZ2V0U3RyaW5nKCJzb3VyY2UiKSAhPSBudWxsID8gcnMuZ2V0U3RyaW5nKCJzb3VyY2UiKSA6ICIiKTsKKyAgICAgIHR5cGVNZXQuYWRkTWV0YWRhdGEoIlJlZmVyZW5jZVVSTCIsCisgICAgICAgICAgcnMuZ2V0U3RyaW5nKCJyZWZlcmVuY2VVUkwiKSAhPSBudWxsID8gcnMuZ2V0U3RyaW5nKCJyZWZlcmVuY2VVUkwiKQorICAgICAgICAgICAgICA6ICIiKTsKKyAgICAgIHR5cGUuc2V0VHlwZU1ldGFkYXRhKHR5cGVNZXQpOworICAgICAgcmV0dXJuIHR5cGU7CisgICAgfSAgICAKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTQzNDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9HZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisKKworCisKKworCisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5EYXRhVHJhbnNmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW1nck1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5SZXBvc2l0b3J5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuY29udi5WZXJzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy50eXBlLlR5cGVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuVmVyc2lvbmVyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEdlbmVyaWMgb2JqZWN0IGNyZWF0aW9uIHV0aWxpdGllcyBmb3IgRmlsZU1hbmFnZXIgb2JqZWN0cyBmcm9tIHRoZWlyCisgKiBpbnRlcmZhY2UgY2xhc3MgbmFtZXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkgeworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRvbid0IGNvbnN0cnVjdCBmaW5hbCBmYWN0b3J5IGNsYXNzZXMhIik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIERhdGFUcmFuc2Zlcn0gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+c2VydmljZUZhY3Rvcnk8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VydmljZUZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBTZXJ2aWNlIEZhY3RvcnkgY2xhc3MgbmFtZSB0aGF0IHdpbGwgYmUgaW5zdGFudGlhdGVkIHRvCisgICAgICogICAgICAgICAgICBwcm92aWRlIERhdGFUcmFuc2ZlciBvYmplY3RzLgorICAgICAqIEByZXR1cm4gQSBuZXdseSBpbnN0YW50aWF0ZWQge0BsaW5rIERhdGFUcmFuc2Zlcn0gb2JqZWN0LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgRGF0YVRyYW5zZmVyIGdldERhdGFUcmFuc2ZlclNlcnZpY2VGcm9tRmFjdG9yeSgKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlRmFjdG9yeSkgeworICAgICAgICBEYXRhVHJhbnNmZXJGYWN0b3J5IGRhdGFUcmFuc2ZlckZhY3RvcnkgPSBudWxsOworICAgICAgICBDbGFzczxEYXRhVHJhbnNmZXJGYWN0b3J5PiBkYXRhVHJhbnNmZXJGYWN0b3J5Q2xhc3MgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYXRhVHJhbnNmZXJGYWN0b3J5Q2xhc3MgPSAoQ2xhc3M8RGF0YVRyYW5zZmVyRmFjdG9yeT4pIENsYXNzLmZvck5hbWUoc2VydmljZUZhY3RvcnkpOworICAgICAgICAgICAgZGF0YVRyYW5zZmVyRmFjdG9yeSA9IGRhdGFUcmFuc2ZlckZhY3RvcnlDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgcmV0dXJuIGRhdGFUcmFuc2ZlckZhY3RvcnkuY3JlYXRlRGF0YVRyYW5zZmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGRhdGEgdHJhbnNmZXIgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgZGF0YSB0cmFuc2ZlciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBkYXRhIHRyYW5zZmVyIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBSZXBvc2l0b3J5TWFuYWdlcn0gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+c2VydmljZUZhY3Rvcnk8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VydmljZUZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2aWNlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbmV3CisgICAgICogICAgICAgICAgICBSZXBvc2l0b3J5TWFuYWdlciBvYmplY3RzLgorICAgICAqIEByZXR1cm4gQSBuZXdseSBjb25zdHJ1Y3RlZCB7QGxpbmsgUmVwb3NpdG9yeU1hbmFnZXJ9IG9iamVjdC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnlNYW5hZ2VyIGdldFJlcG9zaXRvcnlNYW5hZ2VyU2VydmljZUZyb21GYWN0b3J5KAorICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VGYWN0b3J5KSB7CisgICAgICAgIFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgQ2xhc3M8UmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5PiBjbGF6eiA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsYXp6ID0gKENsYXNzPFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeT4pIENsYXNzLmZvck5hbWUoc2VydmljZUZhY3RvcnkpOworICAgICAgICAgICAgZmFjdG9yeSA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVSZXBvc2l0b3J5TWFuYWdlcigpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBkYXRhIHN0b3JlIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIGRhdGEgc3RvcmUgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgZGF0YSBzdG9yZSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ30gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+c2VydmljZUZhY3Rvcnk8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VydmljZUZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2aWNlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbmV3CisgICAgICogICAgICAgICAgICBDYXRhbG9nIG9iamVjdHMuCisgICAgICogQHJldHVybiBBIG5ld2x5IGNvbnN0cnVjdGVkIHtAbGluayBDYXRhbG9nfSBvYmplY3QuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBDYXRhbG9nIGdldENhdGFsb2dTZXJ2aWNlRnJvbUZhY3RvcnkoU3RyaW5nIHNlcnZpY2VGYWN0b3J5KSB7CisgICAgICAgIENhdGFsb2dGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICBDbGFzczxDYXRhbG9nRmFjdG9yeT4gY2xhenogPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGF6eiA9IChDbGFzczxDYXRhbG9nRmFjdG9yeT4pIENsYXNzLmZvck5hbWUoc2VydmljZUZhY3RvcnkpOworICAgICAgICAgICAgZmFjdG9yeSA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVDYXRhbG9nKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1ldGFkYXRhIHN0b3JlIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1ldGFkYXRhIHN0b3JlIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1ldGFkYXRhIHN0b3JlIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFZhbGlkYXRpb25MYXllcn0gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+c2VydmljZUZhY3Rvcnk8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VydmljZUZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzc25hbWUgb2YgdGhlIFZhbGlkYXRpb25MYXllckZhY3RvcnkgdG8gdXNlIHRvIGNyZWF0ZQorICAgICAqICAgICAgICAgICAgdGhlIFZhbGlkYXRpb25MYXllci4KKyAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBWYWxpZGF0aW9uTGF5ZXJ9LCBjcmVhdGVkIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgVmFsaWRhdGlvbkxheWVyRmFjdG9yeS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25MYXllciBnZXRWYWxpZGF0aW9uTGF5ZXJGcm9tRmFjdG9yeSgKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlRmFjdG9yeSkgeworICAgICAgICBWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICBDbGFzczxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5PiBjbGF6eiA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsYXp6ID0gKENsYXNzPFZhbGlkYXRpb25MYXllckZhY3Rvcnk+KSBDbGFzcy5mb3JOYW1lKHNlcnZpY2VGYWN0b3J5KTsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlVmFsaWRhdGlvbkxheWVyKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIHZhbGlkYXRpb24gbGF5ZXIgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgdmFsaWRhdGlvbiBsYXllciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyB2YWxpZGF0aW9uIGxheWVyIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBDYWNoZSBnZXRDYWNoZUZyb21GYWN0b3J5KFN0cmluZyBzZXJ2aWNlRmFjdG9yeSl7CisgICAgICAgIENhY2hlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgQ2xhc3M8Q2FjaGVGYWN0b3J5PiBjbGF6eiA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsYXp6ID0gKENsYXNzPENhY2hlRmFjdG9yeT4pIENsYXNzLmZvck5hbWUoc2VydmljZUZhY3RvcnkpOworICAgICAgICAgICAgZmFjdG9yeSA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVDYWNoZSgpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBjYWNoZSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBjYWNoZSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBjYWNoZSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBWZXJzaW9uZXJ9IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBWZXJzaW9uZXIgb2JqZWN0IHRvIGNyZWF0ZS4KKyAgICAgKiBAcmV0dXJuIEEgbmV3bHkgY29uc3RydWN0ZWQge0BsaW5rIFZlcnNpb25lcn0gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmVyc2lvbmVyIGdldFZlcnNpb25lckZyb21DbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBDbGFzczxWZXJzaW9uZXI+IHZlcnNpb25lckNsYXNzID0gKENsYXNzPFZlcnNpb25lcj4pIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uZXJDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyB2ZXJzaW9uZXIgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoZW4gbG9hZGluZyB2ZXJzaW9uZXIgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyB2ZXJzaW9uZXIgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlbWdyTWV0RXh0cmFjdG9yIGdldEV4dHJhY3RvckZyb21DbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBDbGFzczxGaWxlbWdyTWV0RXh0cmFjdG9yPiBleHRyYWN0b3JDbGFzcyA9IChDbGFzczxGaWxlbWdyTWV0RXh0cmFjdG9yPikgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RvckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGV4dHJhY3RvciBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIGV4dHJhY3RvciBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGV4dHJhY3RvciBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVHlwZUhhbmRsZXIgZ2V0VHlwZUhhbmRsZXJGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoVHlwZUhhbmRsZXIpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGxvYWQgVHlwZUhhbmRsZXIgY2xhc3MgJyIgKyBjbGFzc05hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgRmlsdGVyQWxnb3IgZ2V0RmlsdGVyQWxnb3JGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoRmlsdGVyQWxnb3IpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGxvYWQgVHlwZUhhbmRsZXIgY2xhc3MgJyIgKyBjbGFzc05hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVmVyc2lvbkNvbnZlcnRlciBnZXRWZXJzaW9uQ29udmVydGVyRnJvbUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFZlcnNpb25Db252ZXJ0ZXIpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGxvYWQgVHlwZUhhbmRsZXIgY2xhc3MgJyIgKyBjbGFzc05hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9QYWdpbmF0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9QYWdpbmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NTgyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1BhZ2luYXRpb24uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbDsKKworLy9DQVMgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7IC8vZm9yIGphdmFkb2MKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OyAvL2ZvciBqYXZhZG9jCisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIGludGVyZmFjZSBmb3IgcGFnaW5hdGlvbiBvZiB7QGxpbmsgUHJvZHVjdH0ge0BsaW5rIExpc3R9cy4uCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBQYWdpbmF0aW9uIHsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICBUaGUgUHJvZHVjdFR5cGUgdG8gb2J0YWluIHRoZSBmaXJzdCB7QGxpbmsgUHJvZHVjdFBhZ2V9IGZvci4KKyAgICAgKiBAcmV0dXJuIFRoZSBmaXJzdCBwYWdlIG9mIHByb2R1Y3RzIGZvciBhIHBhcnRpY3VsYXIge0BsaW5rIFByb2R1Y3RUeXBlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0Rmlyc3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBQcm9kdWN0VHlwZSB0byBvYnRhaW4gdGhlIGxhc3Qge0BsaW5rIFByb2R1Y3RQYWdlfSBmb3IuCisgICAgICogQHJldHVybiBUaGUgbGFzdCBwYWdlIG9mIHByb2R1Y3RzIGZvciBhIHBhcnRpY3VsYXIge0BsaW5rIFByb2R1Y3RUeXBlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TGFzdFByb2R1Y3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBQcm9kdWN0VHlwZSB0byBvYnRhaW4gdGhlIG5leHQgcGFnZSBmb3IsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgICAgPGNvZGU+Y3VycmVudFBhZ2U8L2NvZGU+LgorICAgICAqIEBwYXJhbSBjdXJyZW50UGFnZQorICAgICAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgcGFnZSB0aGF0IHRlbGxzIHRoZSBmdW5jdGlvbiB3aGF0IHRoZSBuZXh0IHBhZ2UgdG8KKyAgICAgKiAgICAgICAgICAgIG9idGFpbiBpcy4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXh0IHBhZ2UgaW4gdGhlIFByb2R1Y3RUeXBlIHByb2R1Y3QgbGlzdCwgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICBjdXJyZW50UGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TmV4dFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSwgUHJvZHVjdFBhZ2UgY3VycmVudFBhZ2UpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBQcm9kdWN0VHlwZSB0byBvYnRhaW4gdGhlIHByZXZpb3VzIHBhZ2UgZm9yLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPmN1cnJlbnRQYWdlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gY3VycmVudFBhZ2UKKyAgICAgKiAgICAgICAgICAgIFRoZSBjdXJyZW50UGFnZSB0aGF0IHRlbGxzIHRoZSBmdW5jdGlvbiB3aGF0IHRoZSBwcmV2aW91cyBwYWdlCisgICAgICogICAgICAgICAgICB0byBvYnRhaW4gaXMuCisgICAgICogQHJldHVybiBUaGUgcHJldmlvdXMgcGFnZSBpbiB0aGUgUHJvZHVjdFR5cGUgcHJvZHVjdCBsaXN0LCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIGN1cnJlbnRQYWdlLgorICAgICAqLworICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRQcmV2UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9RdWVyeVV0aWxzLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9RdWVyeVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlZTRhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1F1ZXJ5VXRpbHMuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5RdWVyeVJlc3VsdDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2c2lvbiQKKyAqIAorICogPHA+CisgKiBVdGlsaXR5IENsYXNzCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5VXRpbHMgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVlcnlSZXN1bHRzQXNTdHJpbmcoTGlzdDxRdWVyeVJlc3VsdD4gcXVlcnlSZXN1bHRzKSB7CisgICAgICAgIHJldHVybiBnZXRRdWVyeVJlc3VsdHNBc1N0cmluZyhxdWVyeVJlc3VsdHMsICIsIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1ZXJ5UmVzdWx0c0FzU3RyaW5nKAorICAgICAgICAgICAgTGlzdDxRdWVyeVJlc3VsdD4gcXVlcnlSZXN1bHRzLCBTdHJpbmcgZGVsaW1pdGVyKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXR1cm5TdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHF1ZXJ5UmVzdWx0cykgCisgICAgICAgICAgICByZXR1cm5TdHJpbmcuYXBwZW5kKHFyLnRvU3RyaW5nKCkgKyBkZWxpbWl0ZXIpOworICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nLnN1YnN0cmluZygwLCByZXR1cm5TdHJpbmcubGVuZ3RoKCkgLSBkZWxpbWl0ZXIubGVuZ3RoKCkpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1NxbFBhcnNlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvU3FsUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlYmM0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1NxbFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Cb29sZWFuUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJhbmdlUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuQ29tcGxleFF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LlF1ZXJ5RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvcjsKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogICAgICAgICAgPHA+CisgKiAgICAgICAgICBBIGZhaXJseSByb2J1c3QgU1FMIHBhcnNlciwgYmFzZWQgb24gdGhlIFNodW50aW5nIHlhcmQKKyAqICAgICAgICAgIGFsZ29yaXRobQorICogICAgICAgICAgPC9wPgorICogICAgICAgICAgCisgKiAgICAgICAgICA8cD4KKyAqICAgICAgICAgIEV2YWx1YXRlcyBTUUwgbGlrZSBzdHJpbmcgc3RhdGVtZW50cyBjb250YWluZWQgaW4gYSBzdHJpbmcuIFRoZSBTUUwKKyAqICAgICAgICAgIHN0YXRlbWVudCBzaG91bGQgYmUgZW5jbG9zZWQgd2l0aGluOiBTUUwgKHtAbGl0ZXJhbCA8c3FsX2FyZ3VtZW50cz59CisgKiAgICAgICAgICApIHsge0BsaXRlcmFsIDxzcWxfc3RhdGVtZW50Pn0gLiB0aGUge0BsaXRlcmFsIDxzcWxfYXJndW1lbnRzPn0gY2FuCisgKiAgICAgICAgICBiZSBlaXRoZXIgRk9STUFULCBTT1JUX0JZLCBvciBGSUxURVIuIFN5bnRheDogU1FMIChGT1JNQVQ9JzxtZXRhZGF0YQorICogICAgICAgICAgZm9ybWF0ZWQgb3V0cHV0PicsU09SVF9CWT0nPG1ldGFkYXRhIG5hbWU+JywgRklMVEVSPSc8c3RhcnRfdGltZQorICogICAgICAgICAgbWV0YWRhdGEgZWxlbWVudD4sIDxlbmRfdGltZSBtZXRhZGF0YSBlbGVtZW50PiwgPHByaW9yaXR5IG1ldGFkYXRhCisgKiAgICAgICAgICBlbGVtZW50PiwgPGZpbHRlciB0eXBlPicpIHsgU0VMRUNUCisgKiAgICAgICAgICA8bGlzdC1vZi1jb21tYS1zZWdyZWdhdGVkLW1ldGFkYXRhLWVsZW1lbnRzLXRvLXF1ZXJ5LW9uPiBGUk9NCisgKiAgICAgICAgICA8cHJvZHVjdFR5cGVzLWNvbW1hLXNlZ3JlZ2F0ZWQ+IFdIRVJFIDxtZXRhZGF0YS1ib29sZWFuLWV4cHJlc3Npb25zPgorICogICAgICAgICAgfSBIZXJlIGlzIGFuIGV4YW1wbGUgU1FMIHN0YXRlbWVudDogU1FMIChGT1JNQVQ9J0ZpbGVMb2NhdGlvbi9GaWxlbmFtZScsCisgKiAgICAgICAgICBTT1JUX0JZPSdGaWxlU2l6ZScsRklMVEVSPTxTdGFydERhdGVUaW1lLEVuZERhdGVUaW1lLERhdGFWZXJzaW9uLAorICogICAgICAgICAgVGFrZUhpZ2hlc3RQcmlvcml0eSkgeyBTRUxFQ1QgRmlsZUxvY2F0aW9uLEZpbGVuYW1lLEZpbGVTaXplIEZST00gSUFTSV9MMUMgCisgKiAgICAgICAgICBXSEVSRSBQcm9kdWN0aW9uRGF0ZVRpbWUgPj0gJzIwMDctMTItMDFUMDA6MDA6MDAuMDAwMDAwWicgfSBUaGlzIGV4YW1wbGUKKyAqICAgICAgICAgIHdvdWxkIHF1ZXJ5IHRoZSBjYXMtZmlsZW1nciBmb3IgbWV0YWRhdGEgdmFsdWVzOgorICogICAgICAgICAgRmlsZUxvY2F0aW9uLEZpbGVuYW1lLEZpbGVTaXplIGZvciBhbnkgZGF0YSBmaWxlIHdoZXJlIHRoZQorICogICAgICAgICAgUHJvZHVjdFR5cGUgPT0gSUFTSV9MMUMgYW5kIHRoZSBQcm9kdWN0aW9uRGF0ZVRpbWUgPj0KKyAqICAgICAgICAgIDIwMDctMTItMDFUMDA6MDA6MDAuMDAwMDAwWi4gSXQgd291bGQgdGhlbiBjb21iaW5lIHRoZSByZXR1cm4gZGF0YQorICogICAgICAgICAgZmlsZXMgbWV0YWRhdGEgdmlhIHRoZSBzcGVjaWZpZWQgRk9STUFULiBFYWNoIGRhdGEgZmlsZSdzIG1ldGFkYXRhCisgKiAgICAgICAgICB3aWxsIGJlIGZvcm1hdGVkIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICh3aXRoIHRoZSBhY3R1YWwKKyAqICAgICAgICAgIHZhbHVlcyByZXBsYWNlZCBpbiB0aGUgbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIGtleXMpOgorICogICAgICAgICAgRmlsZUxvY2F0aW9uL0ZpbGVuYW1lLiBUaGV5IHdpbGwgYmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLCBpbgorICogICAgICAgICAgRmlsZVNpemUgb3JkZXIuCisgKiAgICAgICAgICA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBTcWxQYXJzZXIgeworICAgIAorICAgIHByaXZhdGUgU3FsUGFyc2VyKCkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhRdWVyeSBwYXJzZVNxbFF1ZXJ5TWV0aG9kKFN0cmluZyBzcWxTdHJpbmdRdWVyeU1ldGhvZCkKKyAgICAgICAgICAgIHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFQYXR0ZXJuLm1hdGNoZXMoIigoPzpTUUwpfCg/OnNxbCkpXFxzKiguKilcXHMqXFx7XFxzKlNFTEVDVC4qRlJPTS4qKD86V0hFUkUuKil7MCwxfVxcfSIsIHNxbFN0cmluZ1F1ZXJ5TWV0aG9kKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uKCJNYWxmb3JtZWQgU1FMIG1ldGhvZCIpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkgPSBwYXJzZVNxbFF1ZXJ5KHN0cmlwT3V0U3FsRGVmaW5pdGlvbihzcWxTdHJpbmdRdWVyeU1ldGhvZCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gZXhwciA6IGdldFNxbFN0YXRlbWVudEFyZ3Moc3FsU3RyaW5nUXVlcnlNZXRob2QpKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4cHIuZ2V0S2V5KCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIkZPUk1BVCIpKQorICAgICAgICAgICAgICAgICAgICBjb21wbGV4UXVlcnkuc2V0VG9TdHJpbmdSZXN1bHRGb3JtYXQoZXhwci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmdldEtleSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJTT1JUX0JZIikpCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhRdWVyeS5zZXRTb3J0QnlNZXRLZXkoZXhwci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmdldEtleSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJGSUxURVIiKSkgCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhRdWVyeS5zZXRRdWVyeUZpbHRlcihjcmVhdGVGaWx0ZXIoZXhwcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gY29tcGxleFF1ZXJ5OworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBTUUwgbWV0aG9kIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhRdWVyeSBwYXJzZVNxbFF1ZXJ5KFN0cmluZyBzcWxTdHJpbmdRdWVyeSkKKyAgICAgICAgICAgIHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gc3BsaXRTcWxTdGF0ZW1lbnQgPSBzcWxTdHJpbmdRdWVyeQorICAgICAgICAgICAgICAgIC5zcGxpdCgiKCg/OlNFTEVDVCl8KD86RlJPTSl8KD86V0hFUkUpKSIpOworICAgICAgICBTdHJpbmdbXSBzZWxlY3RWYWx1ZXMgPSAoc3BsaXRTcWxTdGF0ZW1lbnRbMV0udHJpbSgpICsgIiwiKS5zcGxpdCgiLCIpOworICAgICAgICBTdHJpbmdbXSBmcm9tVmFsdWVzID0gKHNwbGl0U3FsU3RhdGVtZW50WzJdLnRyaW0oKSArICIsIikuc3BsaXQoIiwiKTsKKyAgICAgICAgQ29tcGxleFF1ZXJ5IHNxID0gbmV3IENvbXBsZXhRdWVyeSgpOworICAgICAgICBMaXN0PFN0cmluZz4gc2VsZWN0VmFsdWVzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VsZWN0VmFsdWVzKTsKKyAgICAgICAgaWYgKCFzZWxlY3RWYWx1ZXNMaXN0LmNvbnRhaW5zKCIqIikpCisgICAgICAgICAgICBzcS5zZXRSZWR1Y2VkTWV0YWRhdGEoQXJyYXlzLmFzTGlzdChzZWxlY3RWYWx1ZXMpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGZyb21WYWx1ZXNMaXN0ID0gQXJyYXlzLmFzTGlzdChmcm9tVmFsdWVzKTsKKyAgICAgICAgaWYgKCFmcm9tVmFsdWVzTGlzdC5jb250YWlucygiKiIpKQorICAgICAgICAgICAgc3Euc2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoZnJvbVZhbHVlc0xpc3QpOworICAgICAgICAKKyAgICAgICAgaWYgKHNwbGl0U3FsU3RhdGVtZW50Lmxlbmd0aCA+IDMpCisgICAgICAgICAgICBzcS5hZGRDcml0ZXJpb24ocGFyc2VTdGF0ZW1lbnQodG9Qb3N0Rml4KHNwbGl0U3FsU3RhdGVtZW50WzNdCisgICAgICAgICAgICAgICAgICAgIC50cmltKCkpKSk7CisgICAgICAgIHJldHVybiBzcTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBRdWVyeUNyaXRlcmlhIHBhcnNlU3FsV2hlcmVDbGF1c2UoU3RyaW5nIHNxbFdoZXJlQ2xhdXNlKSAKKyAgICAgICAgICAgIHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlU3RhdGVtZW50KHRvUG9zdEZpeChzcWxXaGVyZUNsYXVzZS50cmltKCkpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5wYXJzZVNxbFF1ZXJ5KENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkpIHRocm93cyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IG91dHB1dEFyZ3MgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGlmIChjb21wbGV4UXVlcnkuZ2V0VG9TdHJpbmdSZXN1bHRGb3JtYXQoKSAhPSBudWxsKQorICAgICAgICAgICAgb3V0cHV0QXJncy5hZGQoIkZPUk1BVCA9ICciICsgY29tcGxleFF1ZXJ5LmdldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCkgKyAiJyIpOworICAgICAgICBpZiAoY29tcGxleFF1ZXJ5LmdldFNvcnRCeU1ldEtleSgpICE9IG51bGwpCisgICAgICAgICAgICBvdXRwdXRBcmdzLmFkZCgiU09SVF9CWSA9ICciICsgY29tcGxleFF1ZXJ5LmdldFNvcnRCeU1ldEtleSgpICsgIiciKTsKKyAgICAgICAgaWYgKGNvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJTdHJpbmcgPSAiRklMVEVSID0gJyIKKyAgICAgICAgICAgICAgICAgICAgKyBjb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRTdGFydERhdGVUaW1lTWV0S2V5KCkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgKyBjb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRFbmREYXRlVGltZU1ldEtleSgpICsgIiwiCisgICAgICAgICAgICAgICAgICAgICsgY29tcGxleFF1ZXJ5LmdldFF1ZXJ5RmlsdGVyKCkuZ2V0UHJpb3JpdHlNZXRLZXkoKSArICIsIgorICAgICAgICAgICAgICAgICAgICArIGNvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpLmdldEZpbHRlckFsZ29yKCkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgKyBjb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRGaWx0ZXJBbGdvcigpLmdldEVwc2lsb24oKTsKKyAgICAgICAgICAgIG91dHB1dEFyZ3MuYWRkKGZpbHRlclN0cmluZyArICInIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHNxbFF1ZXJ5U3RyaW5nID0gZ2V0SW5maXhDcml0ZXJpYVN0cmluZyhjb21wbGV4UXVlcnkuZ2V0Q3JpdGVyaWEoKSk7CisgICAgICAgIGlmIChzcWxRdWVyeVN0cmluZyAhPSBudWxsICYmIHNxbFF1ZXJ5U3RyaW5nLnN0YXJ0c1dpdGgoIigiKSAmJiBzcWxRdWVyeVN0cmluZy5lbmRzV2l0aCgiKSIpKQorICAgICAgICAgICAgICAgIHNxbFF1ZXJ5U3RyaW5nID0gc3FsUXVlcnlTdHJpbmcuc3Vic3RyaW5nKDEsIHNxbFF1ZXJ5U3RyaW5nLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIHJldHVybiAiU1FMICgiCisgICAgICAgICAgICAgICAgKyBsaXN0VG9TdHJpbmcob3V0cHV0QXJncykKKyAgICAgICAgICAgICAgICArICIpIHsgU0VMRUNUICIgKyBsaXN0VG9TdHJpbmcoY29tcGxleFF1ZXJ5LmdldFJlZHVjZWRNZXRhZGF0YSgpKQorICAgICAgICAgICAgICAgICsgIiBGUk9NICIgKyAoY29tcGxleFF1ZXJ5LmdldFJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzKCkgIT0gbnVsbCA/IGxpc3RUb1N0cmluZyhjb21wbGV4UXVlcnkuZ2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKSkgOiAiKiIpCisgICAgICAgICAgICAgICAgKyAoc3FsUXVlcnlTdHJpbmcgIT0gbnVsbCA/ICIgV0hFUkUgIiArIHNxbFF1ZXJ5U3RyaW5nIDogIiIpICsgIiB9IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbmZpeENyaXRlcmlhU3RyaW5nKExpc3Q8UXVlcnlDcml0ZXJpYT4gY3JpdGVyaWFMaXN0KSB0aHJvd3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjcml0ZXJpYUxpc3Quc2l6ZSgpID4gMSkKKyAgICAgICAgICAgIHJldHVybiBnZXRJbmZpeENyaXRlcmlhU3RyaW5nKG5ldyBCb29sZWFuUXVlcnlDcml0ZXJpYShjcml0ZXJpYUxpc3QsIEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCkpOworICAgICAgICBlbHNlIGlmIChjcml0ZXJpYUxpc3Quc2l6ZSgpID09IDEpCisgICAgICAgICAgICByZXR1cm4gZ2V0SW5maXhDcml0ZXJpYVN0cmluZyhjcml0ZXJpYUxpc3QuZ2V0KDApKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbmZpeENyaXRlcmlhU3RyaW5nKFF1ZXJ5Q3JpdGVyaWEgY3JpdGVyaWEpIHsKKyAgICAgICAgU3RyaW5nIHJldHVyblN0cmluZyA9ICIiOworICAgICAgICBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBCb29sZWFuUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgYnFjID0gKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBjcml0ZXJpYTsKKyAgICAgICAgICAgIExpc3Q8UXVlcnlDcml0ZXJpYT4gdGVybXMgPSBicWMuZ2V0VGVybXMoKTsKKyAgICAgICAgICAgIHN3aXRjaChicWMuZ2V0T3BlcmF0b3IoKSl7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gIigiICsgZ2V0SW5maXhDcml0ZXJpYVN0cmluZygoUXVlcnlDcml0ZXJpYSkgdGVybXMuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHRlcm1zLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHJpbmcgKz0gIiBBTkQgIiArIGdldEluZml4Q3JpdGVyaWFTdHJpbmcoKFF1ZXJ5Q3JpdGVyaWEpIHRlcm1zLmdldChpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nICs9ICIpIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSAiKCIgKyBnZXRJbmZpeENyaXRlcmlhU3RyaW5nKChRdWVyeUNyaXRlcmlhKSB0ZXJtcy5nZXQoMCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdGVybXMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0cmluZyArPSAiIE9SICIgKyBnZXRJbmZpeENyaXRlcmlhU3RyaW5nKChRdWVyeUNyaXRlcmlhKSB0ZXJtcy5nZXQoaSkpOworICAgICAgICAgICAgICAgIHJldHVyblN0cmluZyArPSAiKSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgUXVlcnlDcml0ZXJpYSBxYyA9IGJxYy5nZXRUZXJtcygpLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAocWMgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICBUZXJtUXVlcnlDcml0ZXJpYSB0cWMgPSAoVGVybVF1ZXJ5Q3JpdGVyaWEpIHFjOworICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSB0cWMuZ2V0RWxlbWVudE5hbWUoKSArICIgIT0gJyIgKyB0cWMuZ2V0VmFsdWUoKSArICInIjsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0cmluZyA9ICJOT1QoIiArIGdldEluZml4Q3JpdGVyaWFTdHJpbmcocWMpICsgIikiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UgaWYgKGNyaXRlcmlhIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICBSYW5nZVF1ZXJ5Q3JpdGVyaWEgcnFjID0gKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWE7CisgICAgICAgICAgICBTdHJpbmcgb3BTdHJpbmcgPSBycWMuZ2V0SW5jbHVzaXZlKCkgPyAiPSIgOiAiIjsKKyAgICAgICAgICAgIGlmIChycWMuZ2V0U3RhcnRWYWx1ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcFN0cmluZyA9ICI+IiArIG9wU3RyaW5nICsgIiAnIiArIHJxYy5nZXRTdGFydFZhbHVlKCkgKyAiJyI7CisgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgIG9wU3RyaW5nID0gIjwiICsgb3BTdHJpbmcgKyAiICciICsgcnFjLmdldEVuZFZhbHVlKCkgKyAiJyI7CisgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSBycWMuZ2V0RWxlbWVudE5hbWUoKSArICIgIiArIG9wU3RyaW5nOworICAgICAgICB9ZWxzZSBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgVGVybVF1ZXJ5Q3JpdGVyaWEgdHFjID0gKFRlcm1RdWVyeUNyaXRlcmlhKSBjcml0ZXJpYTsKKyAgICAgICAgICAgIHJldHVyblN0cmluZyA9IHRxYy5nZXRFbGVtZW50TmFtZSgpICsgIiA9PSAnIiArIHRxYy5nZXRWYWx1ZSgpICsgIiciOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5TdHJpbmc7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpcE91dFNxbERlZmluaXRpb24oU3RyaW5nIHNxbFN0cmluZ1F1ZXJ5TWV0aG9kKSB7CisgICAgICAgIHJldHVybiBzcWxTdHJpbmdRdWVyeU1ldGhvZC50cmltKCkucmVwbGFjZUFsbCgiKCg/OlNRTCl8KD86c3FsKSlcXHMqKC4qKVxccypcXHsiLCAiIikucmVwbGFjZUFsbCgifSQiLCAiIikudHJpbSgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEV4cHJlc3Npb24+IGdldFNxbFN0YXRlbWVudEFyZ3MoU3RyaW5nIHNxbFN0cmluZ1F1ZXJ5TWV0aG9kKSB0aHJvd3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gaW5FeHByID0gZmFsc2U7CisgICAgICAgIGludCBzdGFydEFyZ3MgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNxbFN0cmluZ1F1ZXJ5TWV0aG9kLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgY3VyQ2hhciA9IHNxbFN0cmluZ1F1ZXJ5TWV0aG9kLmNoYXJBdChpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoY3VyQ2hhcikgeworICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgc3RhcnRBcmdzID0gaSArIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgICAgICBpZiAoIWluRXhwcikgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gc3FsU3RyaW5nUXVlcnlNZXRob2Quc3Vic3RyaW5nKHN0YXJ0QXJncywgaSkudHJpbSgpLnNwbGl0KCInXFxzKiwiKTsKKyAgICAgICAgICAgICAgICAgICAgTGlua2VkTGlzdDxFeHByZXNzaW9uPiBhcmdzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEV4cHJlc3Npb24+KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzTGlzdC5hZGQobmV3IEV4cHJlc3Npb24oKGFyZyA9IGFyZy50cmltKCkpLmVuZHNXaXRoKCInIikgPyBhcmcgOiAoYXJnICsgIiciKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnc0xpc3Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIGluRXhwciA9ICFpbkV4cHI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byByZWFkIGluIGFyZ3MiKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgUXVlcnlGaWx0ZXIgY3JlYXRlRmlsdGVyKEV4cHJlc3Npb24gZXhwcikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBmaWx0ZXJBcmdzID0gZXhwci5nZXRWYWx1ZSgpLnNwbGl0KCIsIik7CisgICAgICAgIEZpbHRlckFsZ29yIGZpbHRlckFsZ29yID0gKEZpbHRlckFsZ29yKSBDbGFzcy5mb3JOYW1lKGZpbHRlckFyZ3NbM10pLm5ld0luc3RhbmNlKCk7CisgICAgICAgIFF1ZXJ5RmlsdGVyIHFmID0gbmV3IFF1ZXJ5RmlsdGVyKGZpbHRlckFyZ3NbMF0sIGZpbHRlckFyZ3NbMV0sIGZpbHRlckFyZ3NbMl0sIGZpbHRlckFsZ29yKTsKKyAgICAgICAgZmlsdGVyQWxnb3Iuc2V0RXBzaWxvbihJbnRlZ2VyLnBhcnNlSW50KGZpbHRlckFyZ3NbNF0pKTsKKyAgICAgICAgcmV0dXJuIHFmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZXMgIlNodW50aW5nIHlhcmQgYWxnb3JpdGhtIiAoc2VlOgorICAgICAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2h1bnRpbmdfeWFyZF9hbGdvcml0aG0pCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlua2VkTGlzdDxTdHJpbmc+IHRvUG9zdEZpeChTdHJpbmcgc3RhdGVtZW50KSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBwb3N0Rml4ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFN0YWNrPFN0cmluZz4oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGN1ckNoYXIgPSBzdGF0ZW1lbnQuY2hhckF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChjdXJDaGFyKSB7CisgICAgICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ldyBTdHJpbmcoIigiKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgIHdoaWxlICghKHZhbHVlID0gc3RhY2sucG9wKCkpLmVxdWFscygiKCIpKQorICAgICAgICAgICAgICAgICAgICBwb3N0Rml4LmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YWNrLnBlZWsoKS5lcXVhbHMoIk5PVCIpKQorICAgICAgICAgICAgICAgICAgICBwb3N0Rml4LmFkZChzdGFjay5wb3AoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5zdWJzdHJpbmcoaSwgaSArIDMpLmVxdWFscygiQU5EIikpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3RhY2sucGVlaygpLmVxdWFscygiQU5EIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEZpeC5hZGQoc3RhY2sucG9wKCkpOworICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCJBTkQiKTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LnN1YnN0cmluZyhpLCBpICsgMikuZXF1YWxzKCJPUiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RhY2suaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0YWNrLnBlZWsoKS5lcXVhbHMoIkFORCIpIHx8IHN0YWNrLnBlZWsoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiT1IiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0Rml4LmFkZChzdGFjay5wb3AoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIk9SIik7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5zdWJzdHJpbmcoaSwgaSArIDMpLmVxdWFscygiTk9UIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgiTk9UIik7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBzdGF0ZW1lbnQuaW5kZXhPZignXCcnLCBzdGF0ZW1lbnQuaW5kZXhPZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnLCBpKSArIDEpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdEZpeC5hZGQoc3RhdGVtZW50LnN1YnN0cmluZyhpLCBlbmRJbmRleCkpOworICAgICAgICAgICAgICAgICAgICBpID0gZW5kSW5kZXggLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghc3RhY2suaXNFbXB0eSgpKQorICAgICAgICAgICAgcG9zdEZpeC5hZGQoc3RhY2sucG9wKCkpOworCisgICAgICAgIHJldHVybiBwb3N0Rml4OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFF1ZXJ5Q3JpdGVyaWEgcGFyc2VTdGF0ZW1lbnQoTGlua2VkTGlzdDxTdHJpbmc+IHBvc3RGaXhTdGF0ZW1lbnQpCisgICAgICAgICAgICB0aHJvd3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0YWNrPFF1ZXJ5Q3JpdGVyaWE+IHN0YWNrID0gbmV3IFN0YWNrPFF1ZXJ5Q3JpdGVyaWE+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGl0ZW0gOiBwb3N0Rml4U3RhdGVtZW50KSB7CisgICAgICAgICAgICBpZiAoaXRlbS5lcXVhbHMoIkFORCIpKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgYlFDID0gbmV3IEJvb2xlYW5RdWVyeUNyaXRlcmlhKCk7CisgICAgICAgICAgICAgICAgYlFDLmFkZFRlcm0oc3RhY2sucG9wKCkpOworICAgICAgICAgICAgICAgIGJRQy5hZGRUZXJtKHN0YWNrLnBvcCgpKTsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGJRQyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZXF1YWxzKCJPUiIpKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgYlFDID0gbmV3IEJvb2xlYW5RdWVyeUNyaXRlcmlhKCk7CisgICAgICAgICAgICAgICAgYlFDLnNldE9wZXJhdG9yKEJvb2xlYW5RdWVyeUNyaXRlcmlhLk9SKTsKKyAgICAgICAgICAgICAgICBiUUMuYWRkVGVybShzdGFjay5wb3AoKSk7CisgICAgICAgICAgICAgICAgYlFDLmFkZFRlcm0oc3RhY2sucG9wKCkpOworICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYlFDKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5lcXVhbHMoIk5PVCIpKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgYlFDID0gbmV3IEJvb2xlYW5RdWVyeUNyaXRlcmlhKCk7CisgICAgICAgICAgICAgICAgYlFDLnNldE9wZXJhdG9yKEJvb2xlYW5RdWVyeUNyaXRlcmlhLk5PVCk7CisgICAgICAgICAgICAgICAgYlFDLmFkZFRlcm0oc3RhY2sucG9wKCkpOworICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYlFDKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXcgRXhwcmVzc2lvbihpdGVtKS5jb252ZXJ0VG9RdWVyeUNyaXRlcmlhKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGFjay5wb3AoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbGlzdFRvU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KSB7CisgICAgICAgIFN0cmluZyBhcnJheVN0cmluZyA9ICIiOworICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBhcnJheVN0cmluZyA9IGxpc3QuZ2V0KDApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgIGFycmF5U3RyaW5nICs9ICIsIiArIGxpc3QuZ2V0KGkpOworICAgICAgICB9ICAKKyAgICAgICAgcmV0dXJuIGFycmF5U3RyaW5nOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhwcmVzc2lvbiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBHUkVBVEVSX1RIQU4gPSAxMjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IExFU1NfVEhBTiA9IDM7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFUVVBTF9UTyA9IDk7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBOT1RfRVFVQUxfVE8gPSAxNTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEdSRUFURVJfVEhBTl9PUl9FUVVBTF9UTyA9IDEzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTEVTU19USEFOX09SX0VRVUFMX1RPID0gMTE7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBOT1QgPSA2OworCisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gc3RyaW5nVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgImAiLCAiYCIsICJgIiwgIjwiLCAiYCIsCisgICAgICAgICAgICAgICAgImAiLCAiISIsICJgIiwgImAiLCAiPSIsICJgIiwgIjw9IiwgIj4iLCAiPj0iLCAiYCIsICIhPSIgfTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGtleTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWw7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgb3A7CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHRoaXMucGFyc2VFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb24oU3RyaW5nIGtleSwgaW50IG9wLCBTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleS50cmltKCk7CisgICAgICAgICAgICB0aGlzLm9wID0gb3A7CisgICAgICAgICAgICB0aGlzLnZhbCA9IHRoaXMucmVtb3ZlVGlja0JvdW5kcyh2YWwudHJpbSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiKCg/Oj49KXwoPzo8PSl8KD86PT0pfCg/OiE9KXwoPzo9KXwoPzo+KXwoPzo8KSkiKS5tYXRjaGVyKGV4cHJlc3Npb24pOworICAgICAgICAgICAgbWF0Y2hlci5maW5kKCk7CisgICAgICAgICAgICB0aGlzLmtleSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIG1hdGNoZXIuc3RhcnQoKSkudHJpbSgpOworICAgICAgICAgICAgdGhpcy52YWwgPSB0aGlzLnJlbW92ZVRpY2tCb3VuZHMoZXhwcmVzc2lvbi5zdWJzdHJpbmcobWF0Y2hlci5lbmQoKSkudHJpbSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBvcFN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoKTsKKyAgICAgICAgICAgIGZvciAoY2hhciBjIDogb3BTdHJpbmcudG9DaGFyQXJyYXkoKSkKKyAgICAgICAgICAgICAgICB0aGlzLm9wID0gdGhpcy5vcCB8IHRoaXMuZ2V0U2hvcnRWYWx1ZUZvck9wKGMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVGlja0JvdW5kcyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCInIikgJiYgdmFsdWUuZW5kc1dpdGgoIiciKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0U2hvcnRWYWx1ZUZvck9wKGNoYXIgb3ApIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgIHJldHVybiBHUkVBVEVSX1RIQU47CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gTEVTU19USEFOOworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEVRVUFMX1RPOworICAgICAgICAgICAgY2FzZSAnISc6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUXVlcnlDcml0ZXJpYSBjb252ZXJ0VG9RdWVyeUNyaXRlcmlhKCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzd2l0Y2ggKHRoaXMub3ApIHsKKyAgICAgICAgICAgIGNhc2UgR1JFQVRFUl9USEFOOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2VRdWVyeUNyaXRlcmlhKHRoaXMua2V5LCB0aGlzLnZhbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgY2FzZSBMRVNTX1RIQU46CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVF1ZXJ5Q3JpdGVyaWEodGhpcy5rZXksIG51bGwsIHRoaXMudmFsLCBmYWxzZSk7CisgICAgICAgICAgICBjYXNlIEVRVUFMX1RPOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGVybVF1ZXJ5Q3JpdGVyaWEodGhpcy5rZXksIHRoaXMudmFsKTsKKyAgICAgICAgICAgIGNhc2UgTk9UX0VRVUFMX1RPOgorICAgICAgICAgICAgICAgIEJvb2xlYW5RdWVyeUNyaXRlcmlhIG5vdEVxQlFDID0gbmV3IEJvb2xlYW5RdWVyeUNyaXRlcmlhKCk7CisgICAgICAgICAgICAgICAgbm90RXFCUUMuc2V0T3BlcmF0b3IoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuTk9UKTsKKyAgICAgICAgICAgICAgICBub3RFcUJRQy5hZGRUZXJtKG5ldyBUZXJtUXVlcnlDcml0ZXJpYSh0aGlzLmtleSwgdGhpcy52YWwpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm90RXFCUUM7CisgICAgICAgICAgICBjYXNlIEdSRUFURVJfVEhBTl9PUl9FUVVBTF9UTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlUXVlcnlDcml0ZXJpYSh0aGlzLmtleSwgdGhpcy52YWwsIG51bGwsIHRydWUpOworICAgICAgICAgICAgY2FzZSBMRVNTX1RIQU5fT1JfRVFVQUxfVE86CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVF1ZXJ5Q3JpdGVyaWEodGhpcy5rZXksIG51bGwsIHRoaXMudmFsLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiV2FzIG5vdCBhYmxlIHRvIGZvcm0gcXVlcnkgLiAuIC4gcHJvYmFibHkgYW4gaW52YWxpZCBvcGVyYXRvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5rZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRPcCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5rZXkgKyAiICIgKyB0aGlzLnN0cmluZ1ZhbHVlc1t0aGlzLm9wXSArICIgIiArIHRoaXMudmFsOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiU0VMRUNUICogRlJPTSBJQVNJX0wxQyBXSEVSRSBvbmUgPT0gJzEnIEFORCB0d28gPT0gJzInIE9SIE5PVChmaXZlID09ICc1JykgT1IgdGhyZWUgPT0gJzMnIEFORCBmb3VyID09ICc0JyI7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicXVlcnk6ICIgKyBxdWVyeSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicXVlcnkgYWZ0ZXIgOiAiICsgdW5wYXJzZVNxbFF1ZXJ5KHBhcnNlU3FsUXVlcnkocXVlcnkpKSk7CisgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gSUFTSV9MMUMiOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInF1ZXJ5OiAiICsgcXVlcnkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInF1ZXJ5IGFmdGVyIDogIiArIHVucGFyc2VTcWxRdWVyeShwYXJzZVNxbFF1ZXJ5KHF1ZXJ5KSkpOworICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICoiOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInF1ZXJ5OiAiICsgcXVlcnkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInF1ZXJ5IGFmdGVyIDogIiArIHVucGFyc2VTcWxRdWVyeShwYXJzZVNxbFF1ZXJ5KHF1ZXJ5KSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1htbFJwY1N0cnVjdEZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1htbFJwY1N0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVjZDMwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvWG1sUnBjU3RydWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Cb29sZWFuUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FeHRyYWN0b3JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5Db21wbGV4UXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuZmlsdGVyLkZpbHRlckFsZ29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnR5cGUuVHlwZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBmYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBGaWxlIE1hbmFnZXIgc3RydWN0dXJlcyBzdWl0YWJsZSBmb3IgdHJhbnNmZXIKKyAqIG92ZXIgdGhlIFhNTC1SUEMgcGlwZSwgYW5kIGZvciByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgWE1MLVJQQyBwaXBlIGludG8KKyAqIEZpbGUgTWFuYWdlciBzdHJ1Y3RzLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBYbWxScGNTdHJ1Y3RGYWN0b3J5IHsKKworICAgIHByaXZhdGUgWG1sUnBjU3RydWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRvbid0IGluc3RhbnRpYXRlIFhtbFJwY1N0cnVjdEZhY3RvcmllcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjRmlsZVRyYW5zZmVyU3RhdHVzKAorICAgICAgICAgICAgRmlsZVRyYW5zZmVyU3RhdHVzIHN0YXR1cykgeworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHN0YXR1c0hhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBzdGF0dXNIYXNoLnB1dCgiYnl0ZXNUcmFuc2ZlcnJlZCIsTG9uZy50b1N0cmluZyhzdGF0dXMKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXNUcmFuc2ZlcnJlZCgpKSk7CisgICAgICAgIHN0YXR1c0hhc2gucHV0KCJwYXJlbnRQcm9kdWN0IiwgZ2V0WG1sUnBjUHJvZHVjdChzdGF0dXMKKyAgICAgICAgICAgICAgICAuZ2V0UGFyZW50UHJvZHVjdCgpKSk7CisgICAgICAgIHN0YXR1c0hhc2gucHV0KCJmaWxlUmVmIiwgZ2V0WG1sUnBjUmVmZXJlbmNlKHN0YXR1cy5nZXRGaWxlUmVmKCkpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1c0hhc2g7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBGaWxlVHJhbnNmZXJTdGF0dXMgZ2V0RmlsZVRyYW5zZmVyU3RhdHVzRnJvbVhtbFJwYygKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gc3RhdHVzSGFzaCkgeworICAgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gbmV3IEZpbGVUcmFuc2ZlclN0YXR1cygpOworICAgICAgICBzdGF0dXMuc2V0Qnl0ZXNUcmFuc2ZlcnJlZChMb25nLnBhcnNlTG9uZyhzdGF0dXNIYXNoCisgICAgICAgICAgICAgICAgLmdldCgiYnl0ZXNUcmFuc2ZlcnJlZCIpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgc3RhdHVzLnNldFBhcmVudFByb2R1Y3QoZ2V0UHJvZHVjdEZyb21YbWxScGMoKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIHN0YXR1c0hhc2guZ2V0KCJwYXJlbnRQcm9kdWN0IikpKTsKKyAgICAgICAgc3RhdHVzLnNldEZpbGVSZWYoZ2V0UmVmZXJlbmNlRnJvbVhtbFJwYygoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pikgc3RhdHVzSGFzaC5nZXQoImZpbGVSZWYiKSkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGdldFhtbFJwY0ZpbGVUcmFuc2ZlclN0YXR1c2VzKExpc3Q8RmlsZVRyYW5zZmVyU3RhdHVzPiBzdGF0dXNlcykgeworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gc3RhdHVzVmVjdG9yID0gbmV3IFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PigpOworCisgICAgICAgIGlmIChzdGF0dXNlcyAhPSBudWxsICYmIHN0YXR1c2VzLnNpemUoKSA+IDApIHsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxGaWxlVHJhbnNmZXJTdGF0dXM+IGkgPSBzdGF0dXNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc3RhdHVzVmVjdG9yLmFkZChnZXRYbWxScGNGaWxlVHJhbnNmZXJTdGF0dXMoc3RhdHVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzVmVjdG9yOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxGaWxlVHJhbnNmZXJTdGF0dXM+IGdldEZpbGVUcmFuc2ZlclN0YXR1c2VzRnJvbVhtbFJwYyhWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gc3RhdHVzVmVjdG9yKSB7CisgICAgICAgIExpc3Q8RmlsZVRyYW5zZmVyU3RhdHVzPiBzdGF0dXNlcyA9IG5ldyBWZWN0b3I8RmlsZVRyYW5zZmVyU3RhdHVzPigpOworCisgICAgICAgIGlmIChzdGF0dXNWZWN0b3IgIT0gbnVsbCAmJiBzdGF0dXNWZWN0b3Iuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBpID0gc3RhdHVzVmVjdG9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gc3RhdHVzSGFzaCA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXMgPSBnZXRGaWxlVHJhbnNmZXJTdGF0dXNGcm9tWG1sUnBjKHN0YXR1c0hhc2gpOworICAgICAgICAgICAgICAgIHN0YXR1c2VzLmFkZChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXR1c2VzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRYbWxScGNQcm9kdWN0UGFnZShQcm9kdWN0UGFnZSBwYWdlKSB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD5wcm9kdWN0UGFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBwcm9kdWN0UGFnZUhhc2gucHV0KCJ0b3RhbFBhZ2VzIiwgbmV3IEludGVnZXIocGFnZS5nZXRUb3RhbFBhZ2VzKCkpKTsKKyAgICAgICAgcHJvZHVjdFBhZ2VIYXNoLnB1dCgicGFnZU51bSIsIG5ldyBJbnRlZ2VyKHBhZ2UuZ2V0UGFnZU51bSgpKSk7CisgICAgICAgIHByb2R1Y3RQYWdlSGFzaC5wdXQoInBhZ2VTaXplIiwgbmV3IEludGVnZXIocGFnZS5nZXRQYWdlU2l6ZSgpKSk7CisgICAgICAgIHByb2R1Y3RQYWdlSGFzaC5wdXQoInBhZ2VQcm9kdWN0cyIsIGdldFhtbFJwY1Byb2R1Y3RMaXN0KHBhZ2UKKyAgICAgICAgICAgICAgICAuZ2V0UGFnZVByb2R1Y3RzKCkpKTsKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RQYWdlSGFzaDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIFByb2R1Y3RQYWdlIGdldFByb2R1Y3RQYWdlRnJvbVhtbFJwYyhIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RQYWdlSGFzaCkgeworICAgICAgICBQcm9kdWN0UGFnZSBwYWdlID0gbmV3IFByb2R1Y3RQYWdlKCk7CisgICAgICAgIHBhZ2Uuc2V0UGFnZU51bSgoKEludGVnZXIpIHByb2R1Y3RQYWdlSGFzaC5nZXQoInBhZ2VOdW0iKSkuaW50VmFsdWUoKSk7CisgICAgICAgIHBhZ2UKKyAgICAgICAgICAgICAgICAuc2V0UGFnZVNpemUoKChJbnRlZ2VyKSBwcm9kdWN0UGFnZUhhc2guZ2V0KCJwYWdlU2l6ZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmludFZhbHVlKCkpOworICAgICAgICBwYWdlLnNldFRvdGFsUGFnZXMoKChJbnRlZ2VyKSBwcm9kdWN0UGFnZUhhc2guZ2V0KCJ0b3RhbFBhZ2VzIikpCisgICAgICAgICAgICAgICAgLmludFZhbHVlKCkpOworICAgICAgICBwYWdlLnNldFBhZ2VQcm9kdWN0cyhnZXRQcm9kdWN0TGlzdEZyb21YbWxScGMoKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PikgcHJvZHVjdFBhZ2VIYXNoCisgICAgICAgICAgICAgICAgLmdldCgicGFnZVByb2R1Y3RzIikpKTsKKyAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRYbWxScGNDb21wbGV4UXVlcnkoQ29tcGxleFF1ZXJ5IGNvbXBsZXhRdWVyeSkgeworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGNvbXBsZXhRdWVyeUhhc2ggPSBnZXRYbWxScGNRdWVyeShjb21wbGV4UXVlcnkpOworICAgICAgICBpZiAoY29tcGxleFF1ZXJ5LmdldFJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbXBsZXhRdWVyeUhhc2gucHV0KCJyZWR1Y2VkUHJvZHVjdFR5cGVOYW1lcyIsIG5ldyBWZWN0b3I8U3RyaW5nPihjb21wbGV4UXVlcnkuZ2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKSkpOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgY29tcGxleFF1ZXJ5SGFzaC5wdXQoInJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzIiwgbmV3IFZlY3RvcjxTdHJpbmc+KCkpOworICAgICAgICBpZiAoY29tcGxleFF1ZXJ5LmdldFJlZHVjZWRNZXRhZGF0YSgpICE9IG51bGwpCisgICAgICAgICAgICBjb21wbGV4UXVlcnlIYXNoLnB1dCgicmVkdWNlZE1ldGFkYXRhIiwgbmV3IFZlY3RvcjxTdHJpbmc+KGNvbXBsZXhRdWVyeS5nZXRSZWR1Y2VkTWV0YWRhdGEoKSkpOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgY29tcGxleFF1ZXJ5SGFzaC5wdXQoInJlZHVjZWRNZXRhZGF0YSIsIG5ldyBWZWN0b3I8U3RyaW5nPigpKTsKKyAgICAgICAgaWYgKGNvbXBsZXhRdWVyeS5nZXRTb3J0QnlNZXRLZXkoKSAhPSBudWxsKQorICAgICAgICAgICAgY29tcGxleFF1ZXJ5SGFzaC5wdXQoInNvcnRCeU1ldEtleSIsIGNvbXBsZXhRdWVyeS5nZXRTb3J0QnlNZXRLZXkoKSk7CisgICAgICAgIGlmIChjb21wbGV4UXVlcnkuZ2V0VG9TdHJpbmdSZXN1bHRGb3JtYXQoKSAhPSBudWxsKQorICAgICAgICAgICAgY29tcGxleFF1ZXJ5SGFzaC5wdXQoInRvU3RyaW5nUmVzdWx0Rm9ybWF0IiwgY29tcGxleFF1ZXJ5LmdldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCkpOworICAgICAgICBpZiAoY29tcGxleFF1ZXJ5LmdldFF1ZXJ5RmlsdGVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbXBsZXhRdWVyeUhhc2gucHV0KCJxdWVyeUZpbHRlciIsIGdldFhtbFJwY1F1ZXJ5RmlsdGVyKGNvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpKSk7CisgICAgICAgIHJldHVybiBjb21wbGV4UXVlcnlIYXNoOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhRdWVyeSBnZXRDb21wbGV4UXVlcnlGcm9tWG1sUnBjKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gY29tcGxleFF1ZXJ5SGFzaCkgeworICAgICAgICBDb21wbGV4UXVlcnkgY29tcGxleFF1ZXJ5ID0gbmV3IENvbXBsZXhRdWVyeSgpOworICAgICAgICBjb21wbGV4UXVlcnkuc2V0Q3JpdGVyaWEoZ2V0UXVlcnlGcm9tWG1sUnBjKGNvbXBsZXhRdWVyeUhhc2gpLmdldENyaXRlcmlhKCkpOworICAgICAgICBpZiAoKChWZWN0b3I8U3RyaW5nPikgY29tcGxleFF1ZXJ5SGFzaC5nZXQoInJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzIikpLnNpemUoKSA+IDApCisgICAgICAgICAgICBjb21wbGV4UXVlcnkuc2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKFZlY3RvcjxTdHJpbmc+KSBjb21wbGV4UXVlcnlIYXNoLmdldCgicmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMiKSk7CisgICAgICAgIGlmICgoKFZlY3RvcjxTdHJpbmc+KSBjb21wbGV4UXVlcnlIYXNoLmdldCgicmVkdWNlZE1ldGFkYXRhIikpLnNpemUoKSA+IDApCisgICAgICAgICAgICBjb21wbGV4UXVlcnkuc2V0UmVkdWNlZE1ldGFkYXRhKChWZWN0b3I8U3RyaW5nPikgY29tcGxleFF1ZXJ5SGFzaC5nZXQoInJlZHVjZWRNZXRhZGF0YSIpKTsKKyAgICAgICAgY29tcGxleFF1ZXJ5LnNldFNvcnRCeU1ldEtleSgoU3RyaW5nKSBjb21wbGV4UXVlcnlIYXNoLmdldCgic29ydEJ5TWV0S2V5IikpOworICAgICAgICBjb21wbGV4UXVlcnkuc2V0VG9TdHJpbmdSZXN1bHRGb3JtYXQoKFN0cmluZykgY29tcGxleFF1ZXJ5SGFzaC5nZXQoInRvU3RyaW5nUmVzdWx0Rm9ybWF0IikpOworICAgICAgICBpZiAoY29tcGxleFF1ZXJ5SGFzaC5nZXQoInF1ZXJ5RmlsdGVyIikgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbXBsZXhRdWVyeS5zZXRRdWVyeUZpbHRlcihnZXRRdWVyeUZpbHRlckZyb21YbWxScGMoKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4pIGNvbXBsZXhRdWVyeUhhc2guZ2V0KCJxdWVyeUZpbHRlciIpKSk7CisgICAgICAgIHJldHVybiBjb21wbGV4UXVlcnk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRYbWxScGNRdWVyeUZpbHRlcihRdWVyeUZpbHRlciBxdWVyeUZpbHRlcikgeworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHF1ZXJ5RmlsdGVySGFzaCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIHF1ZXJ5RmlsdGVySGFzaC5wdXQoInN0YXJ0RGF0ZVRpbWVNZXRLZXkiLCBxdWVyeUZpbHRlci5nZXRTdGFydERhdGVUaW1lTWV0S2V5KCkpOworICAgICAgICBxdWVyeUZpbHRlckhhc2gucHV0KCJlbmREYXRlVGltZU1ldEtleSIsIHF1ZXJ5RmlsdGVyLmdldEVuZERhdGVUaW1lTWV0S2V5KCkpOworICAgICAgICBxdWVyeUZpbHRlckhhc2gucHV0KCJwcmlvcml0eU1ldEtleSIsIHF1ZXJ5RmlsdGVyLmdldFByaW9yaXR5TWV0S2V5KCkpOworICAgICAgICBxdWVyeUZpbHRlckhhc2gucHV0KCJmaWx0ZXJBbGdvciIsIGdldFhtbFJwY0ZpbHRlckFsZ29yKHF1ZXJ5RmlsdGVyLmdldEZpbHRlckFsZ29yKCkpKTsKKyAgICAgICAgcXVlcnlGaWx0ZXJIYXNoLnB1dCgidmVyc2lvbkNvbnZlcnRlckNsYXNzIiwgcXVlcnlGaWx0ZXIuZ2V0Q29udmVydGVyKCkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICByZXR1cm4gcXVlcnlGaWx0ZXJIYXNoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5RmlsdGVyIGdldFF1ZXJ5RmlsdGVyRnJvbVhtbFJwYyhIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHF1ZXJ5RmlsdGVySGFzaCkgeworICAgICAgICBTdHJpbmcgc3RhcnREYXRlVGltZU1ldEtleSA9IChTdHJpbmcpIHF1ZXJ5RmlsdGVySGFzaC5nZXQoInN0YXJ0RGF0ZVRpbWVNZXRLZXkiKTsKKyAgICAgICAgU3RyaW5nIGVuZERhdGVUaW1lTWV0S2V5ID0gKFN0cmluZykgcXVlcnlGaWx0ZXJIYXNoLmdldCgiZW5kRGF0ZVRpbWVNZXRLZXkiKTsKKyAgICAgICAgU3RyaW5nIHByaW9yaXR5TWV0S2V5ID0gKFN0cmluZykgcXVlcnlGaWx0ZXJIYXNoLmdldCgicHJpb3JpdHlNZXRLZXkiKTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEZpbHRlckFsZ29yIGZpbHRlckFsZ29yID0gZ2V0RmlsdGVyQWxnb3JGcm9tWG1sUnBjKChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBxdWVyeUZpbHRlckhhc2guZ2V0KCJmaWx0ZXJBbGdvciIpKTsKKyAgICAgICAgUXVlcnlGaWx0ZXIgcXVlcnlGaWx0ZXIgPSBuZXcgUXVlcnlGaWx0ZXIoc3RhcnREYXRlVGltZU1ldEtleSwgZW5kRGF0ZVRpbWVNZXRLZXksIHByaW9yaXR5TWV0S2V5LCBmaWx0ZXJBbGdvcik7CisgICAgICAgIHF1ZXJ5RmlsdGVyLnNldENvbnZlcnRlcihHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldFZlcnNpb25Db252ZXJ0ZXJGcm9tQ2xhc3NOYW1lKChTdHJpbmcpIHF1ZXJ5RmlsdGVySGFzaC5nZXQoInZlcnNpb25Db252ZXJ0ZXJDbGFzcyIpKSk7CisgICAgICAgIHJldHVybiBxdWVyeUZpbHRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjRmlsdGVyQWxnb3IoRmlsdGVyQWxnb3IgZmlsdGVyQWxnb3IpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBmaWx0ZXJBbGdvckhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBmaWx0ZXJBbGdvckhhc2gucHV0KCJjbGFzcyIsIGZpbHRlckFsZ29yLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgZmlsdGVyQWxnb3JIYXNoLnB1dCgiZXBzaWxvbiIsIExvbmcudG9TdHJpbmcoZmlsdGVyQWxnb3IuZ2V0RXBzaWxvbigpKSk7CisgICAgICAgIHJldHVybiBmaWx0ZXJBbGdvckhhc2g7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgRmlsdGVyQWxnb3IgZ2V0RmlsdGVyQWxnb3JGcm9tWG1sUnBjKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZmlsdGVyQWxnb3JIYXNoKSB7CisgICAgICAgIEZpbHRlckFsZ29yIGZpbHRlckFsZ29yID0gR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeS5nZXRGaWx0ZXJBbGdvckZyb21DbGFzc05hbWUoKFN0cmluZykgZmlsdGVyQWxnb3JIYXNoLmdldCgiY2xhc3MiKSk7CisgICAgICAgIGZpbHRlckFsZ29yLnNldEVwc2lsb24oTG9uZy5wYXJzZUxvbmcoKFN0cmluZykgZmlsdGVyQWxnb3JIYXNoLmdldCgiZXBzaWxvbiIpKSk7CisgICAgICAgIHJldHVybiBmaWx0ZXJBbGdvcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0WG1sUnBjUXVlcnlSZXN1bHRzKExpc3Q8UXVlcnlSZXN1bHQ+IHF1ZXJ5UmVzdWx0cykgeworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gcXVlcnlSZXN1bHRIYXNoVmVjdG9yID0gbmV3IFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PigpOworICAgICAgICBmb3IgKFF1ZXJ5UmVzdWx0IHF1ZXJ5UmVzdWx0IDogcXVlcnlSZXN1bHRzKQorICAgICAgICAgICAgcXVlcnlSZXN1bHRIYXNoVmVjdG9yLmFkZChnZXRYbWxScGNRdWVyeVJlc3VsdChxdWVyeVJlc3VsdCkpOworICAgICAgICByZXR1cm4gcXVlcnlSZXN1bHRIYXNoVmVjdG9yOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UXVlcnlSZXN1bHQ+IGdldFF1ZXJ5UmVzdWx0c0Zyb21YbWxScGMoVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IHF1ZXJ5UmVzdWx0SGFzaFZlY3RvcikgeworICAgICAgICBMaXN0PFF1ZXJ5UmVzdWx0PiBxdWVyeVJlc3VsdHMgPSBuZXcgVmVjdG9yPFF1ZXJ5UmVzdWx0PigpOworICAgICAgICBmb3IgKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcXVlcnlSZXN1bHRIYXNoIDogcXVlcnlSZXN1bHRIYXNoVmVjdG9yKQorICAgICAgICAgICAgcXVlcnlSZXN1bHRzLmFkZChnZXRRdWVyeVJlc3VsdEZyb21YbWxScGMocXVlcnlSZXN1bHRIYXNoKSk7CisgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdHM7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjUXVlcnlSZXN1bHQoUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBxdWVyeVJlc3VsdEhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQuZ2V0VG9TdHJpbmdGb3JtYXQoKSAhPSBudWxsKQorICAgICAgICAgICAgcXVlcnlSZXN1bHRIYXNoLnB1dCgidG9TdHJpbmdGb3JtYXQiLCBxdWVyeVJlc3VsdC5nZXRUb1N0cmluZ0Zvcm1hdCgpKTsKKyAgICAgICAgcXVlcnlSZXN1bHRIYXNoLnB1dCgicHJvZHVjdCIsIGdldFhtbFJwY1Byb2R1Y3QocXVlcnlSZXN1bHQuZ2V0UHJvZHVjdCgpKSk7CisgICAgICAgIHF1ZXJ5UmVzdWx0SGFzaC5wdXQoIm1ldGFkYXRhIiwgcXVlcnlSZXN1bHQuZ2V0TWV0YWRhdGEoKS5nZXRIYXNodGFibGUoKSk7CisgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdEhhc2g7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgUXVlcnlSZXN1bHQgZ2V0UXVlcnlSZXN1bHRGcm9tWG1sUnBjKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcXVlcnlSZXN1bHRIYXNoKSB7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IGdldFByb2R1Y3RGcm9tWG1sUnBjKChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBxdWVyeVJlc3VsdEhhc2guZ2V0KCJwcm9kdWN0IikpOworICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgcXVlcnlSZXN1bHRIYXNoLmdldCgibWV0YWRhdGEiKSk7CisgICAgICAgIFF1ZXJ5UmVzdWx0IHF1ZXJ5UmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KHByb2R1Y3QsIG1ldGFkYXRhKTsKKyAgICAgICAgcXVlcnlSZXN1bHQuc2V0VG9TdHJpbmdGb3JtYXQoKFN0cmluZykgcXVlcnlSZXN1bHRIYXNoLmdldCgidG9TdHJpbmdGb3JtYXQiKSk7CisgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldFhtbFJwY1Byb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RIYXNoLnB1dCgiaWQiLCBwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdEhhc2gucHV0KCJuYW1lIiwgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdEhhc2gucHV0KCJ0eXBlIiwgZ2V0WG1sUnBjUHJvZHVjdFR5cGUocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdEhhc2gucHV0KCJzdHJ1Y3R1cmUiLCBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RIYXNoLnB1dCgidHJhbnNmZXJTdGF0dXMiLCBwcm9kdWN0LmdldFRyYW5zZmVyU3RhdHVzKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkgIT0gbnVsbCkgeworICAgICAgICAgICBwcm9kdWN0SGFzaC5wdXQoInJlZmVyZW5jZXMiLCBnZXRYbWxScGNSZWZlcmVuY2VzKHByb2R1Y3QKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9kdWN0LmdldFJvb3RSZWYoKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RIYXNoLnB1dCgicm9vdFJlZmVyZW5jZSIsIGdldFhtbFJwY1JlZmVyZW5jZShwcm9kdWN0CisgICAgICAgICAgICAgICAgIC5nZXRSb290UmVmKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvZHVjdEhhc2g7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBQcm9kdWN0IGdldFByb2R1Y3RGcm9tWG1sUnBjKEhhc2h0YWJsZTw/LCA/PiBwcm9kdWN0SGFzaCkgeworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZCgoU3RyaW5nKSBwcm9kdWN0SGFzaC5nZXQoImlkIikpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3ROYW1lKChTdHJpbmcpIHByb2R1Y3RIYXNoLmdldCgibmFtZSIpKTsKKyAgICAgICAgaWYgKHByb2R1Y3RIYXNoLmdldCgidHlwZSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0VHlwZShnZXRQcm9kdWN0VHlwZUZyb21YbWxScGMoCisgICAgICAgICAgICAgICAgIChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBwcm9kdWN0SGFzaC5nZXQoInR5cGUiKSkpOworICAgICAgICB9CisgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZSgoU3RyaW5nKSBwcm9kdWN0SGFzaC5nZXQoInN0cnVjdHVyZSIpKTsKKyAgICAgICAgcHJvZHVjdC5zZXRUcmFuc2ZlclN0YXR1cygoU3RyaW5nKSBwcm9kdWN0SGFzaC5nZXQoInRyYW5zZmVyU3RhdHVzIikpOworICAgICAgICBpZiAocHJvZHVjdEhhc2guZ2V0KCJyZWZlcmVuY2VzIikgIT0gbnVsbCkgeworICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKGdldFJlZmVyZW5jZXNGcm9tWG1sUnBjKAorICAgICAgICAgICAgICAgICAoVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KSBwcm9kdWN0SGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgicmVmZXJlbmNlcyIpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2R1Y3RIYXNoLmdldCgicm9vdFJlZmVyZW5jZSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdC5zZXRSb290UmVmKGdldFJlZmVyZW5jZUZyb21YbWxScGMoCisgICAgICAgICAgICAgICAgIChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBwcm9kdWN0SGFzaC5nZXQoInJvb3RSZWZlcmVuY2UiKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9kdWN0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0TGlzdEZyb21YbWxScGMoVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IHByb2R1Y3RWZWN0b3IpIHsKKyAgICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kdWN0TGlzdCA9IG5ldyBWZWN0b3I8UHJvZHVjdD4oKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGkgPSBwcm9kdWN0VmVjdG9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0SGFzaCA9IGkubmV4dCgpOworICAgICAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gZ2V0UHJvZHVjdEZyb21YbWxScGMocHJvZHVjdEhhc2gpOworICAgICAgICAgICAgcHJvZHVjdExpc3QuYWRkKHByb2R1Y3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RMaXN0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGdldFhtbFJwY1Byb2R1Y3RMaXN0KExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMpIHsKKyAgICAgICAgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IHByb2R1Y3RWZWN0b3IgPSBuZXcgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KCk7CisKKyAgICAgICAgaWYgKHByb2R1Y3RzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWN0VmVjdG9yOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvcjxQcm9kdWN0PiBpID0gcHJvZHVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdEhhc2ggPSBnZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpOworICAgICAgICAgICAgcHJvZHVjdFZlY3Rvci5hZGQocHJvZHVjdEhhc2gpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RWZWN0b3I7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0WG1sUnBjUHJvZHVjdFR5cGVMaXN0KExpc3Q8UHJvZHVjdFR5cGU+IHByb2R1Y3RUeXBlcykgeworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gcHJvZHVjdFR5cGVWZWN0b3IgPSBuZXcgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KCk7CisKKyAgICAgICAgaWYgKHByb2R1Y3RUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdFR5cGVWZWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yPFByb2R1Y3RUeXBlPiBpID0gcHJvZHVjdFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IGkubmV4dCgpOworICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiB0eXBlSGFzaCA9IGdldFhtbFJwY1Byb2R1Y3RUeXBlKHR5cGUpOworICAgICAgICAgICAgcHJvZHVjdFR5cGVWZWN0b3IuYWRkKHR5cGVIYXNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvZHVjdFR5cGVWZWN0b3I7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFByb2R1Y3RUeXBlPiBnZXRQcm9kdWN0VHlwZUxpc3RGcm9tWG1sUnBjKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBwcm9kdWN0VHlwZVZlY3RvcikgeworICAgICAgICBMaXN0PFByb2R1Y3RUeXBlPiBwcm9kdWN0VHlwZUxpc3QgPSBuZXcgVmVjdG9yPFByb2R1Y3RUeXBlPigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGkgPSBwcm9kdWN0VHlwZVZlY3Rvci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcHJvZHVjdFR5cGVIYXNoID0gaS5uZXh0KCk7CisgICAgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gZ2V0UHJvZHVjdFR5cGVGcm9tWG1sUnBjKHByb2R1Y3RUeXBlSGFzaCk7CisgICAgICAgICAgICBwcm9kdWN0VHlwZUxpc3QuYWRkKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RUeXBlTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RUeXBlSGFzaCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIC8vIFRPRE8oYmZvc3Rlcik6IFByb2R1Y3RUeXBlIElEIGlzIGN1cnJlbnRseSByZXF1aXJlZCBieSBYbWxScGNGaWxlTWFuYWdlci4KKyAgICAgICAgcHJvZHVjdFR5cGVIYXNoLnB1dCgiaWQiLCB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSk7CisgICAgICAgIGlmICh0eXBlLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RUeXBlSGFzaC5wdXQoIm5hbWUiLCB0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RUeXBlSGFzaC5wdXQoImRlc2NyaXB0aW9uIiwgdHlwZS5nZXREZXNjcmlwdGlvbigpKTsgIAorICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdFR5cGVIYXNoLnB1dCgicmVwb3NpdG9yeVBhdGgiLHR5cGUuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmdldFZlcnNpb25lcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdFR5cGVIYXNoLnB1dCgidmVyc2lvbmVyQ2xhc3MiLCB0eXBlLmdldFZlcnNpb25lcigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5nZXRUeXBlTWV0YWRhdGEoKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RUeXBlSGFzaC5wdXQoInR5cGVNZXRhZGF0YSIsIHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuZ2V0SGFzaHRhYmxlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmdldEV4dHJhY3RvcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgIHByb2R1Y3RUeXBlSGFzaC5wdXQoInR5cGVFeHRyYWN0b3JzIiwgZ2V0WG1sUnBjVHlwZUV4dHJhY3RvcnModHlwZS5nZXRFeHRyYWN0b3JzKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5nZXRIYW5kbGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgcHJvZHVjdFR5cGVIYXNoLnB1dCgidHlwZUhhbmRsZXJzIiwgZ2V0WG1sUnBjVHlwZUhhbmRsZXJzKHR5cGUuZ2V0SGFuZGxlcnMoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9kdWN0VHlwZUhhc2g7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUZyb21YbWxScGMoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9kdWN0VHlwZUhhc2gpIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICB0eXBlLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIHByb2R1Y3RUeXBlSGFzaC5nZXQoImRlc2NyaXB0aW9uIikpOworICAgICAgICB0eXBlLnNldE5hbWUoKFN0cmluZykgcHJvZHVjdFR5cGVIYXNoLmdldCgibmFtZSIpKTsKKyAgICAgICAgdHlwZS5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKFN0cmluZykgcHJvZHVjdFR5cGVIYXNoLmdldCgicmVwb3NpdG9yeVBhdGgiKSk7CisgICAgICAgIHR5cGUuc2V0UHJvZHVjdFR5cGVJZCgoU3RyaW5nKSBwcm9kdWN0VHlwZUhhc2guZ2V0KCJpZCIpKTsKKyAgICAgICAgdHlwZS5zZXRWZXJzaW9uZXIoKFN0cmluZykgcHJvZHVjdFR5cGVIYXNoLmdldCgidmVyc2lvbmVyQ2xhc3MiKSk7CisgICAgICAgIGlmIChwcm9kdWN0VHlwZUhhc2guZ2V0KCJ0eXBlTWV0YWRhdGEiKSAhPSBudWxsKSB7CisgICAgICAgICAgIE1ldGFkYXRhIHR5cGVNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgICAgdHlwZU1ldC5hZGRNZXRhZGF0YSgoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PikgcHJvZHVjdFR5cGVIYXNoLmdldCgidHlwZU1ldGFkYXRhIikpOworICAgICAgICAgICB0eXBlLnNldFR5cGVNZXRhZGF0YSh0eXBlTWV0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvZHVjdFR5cGVIYXNoLmdldCgidHlwZUV4dHJhY3RvcnMiKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlLnNldEV4dHJhY3RvcnMoZ2V0VHlwZUV4dHJhY3RvcnNGcm9tWG1sUnBjKAorICAgICAgICAgICAgICAgICAgKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PikgcHJvZHVjdFR5cGVIYXNoCisgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJ0eXBlRXh0cmFjdG9ycyIpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2R1Y3RUeXBlSGFzaC5nZXQoInR5cGVIYW5kbGVycyIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHR5cGUuc2V0SGFuZGxlcnMoZ2V0VHlwZUhhbmRsZXJzRnJvbVhtbFJwYygKKyAgICAgICAgICAgICAgICAgIChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIHByb2R1Y3RUeXBlSGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgidHlwZUhhbmRsZXJzIikpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBnZXRYbWxScGNUeXBlRXh0cmFjdG9ycyhMaXN0PEV4dHJhY3RvclNwZWM+IGV4dHJhY3RvcnMpIHsKKyAgICAgICAgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGV4dHJhY3RvcnNWZWN0b3IgPSBuZXcgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KCk7CisKKyAgICAgICAgaWYgKGV4dHJhY3RvcnMgIT0gbnVsbCAmJiBleHRyYWN0b3JzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RXh0cmFjdG9yU3BlYz4gaSA9IGV4dHJhY3RvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgRXh0cmFjdG9yU3BlYyBzcGVjID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZXh0cmFjdG9yc1ZlY3Rvci5hZGQoZ2V0WG1sUnBjRXh0cmFjdG9yU3BlYyhzcGVjKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXh0cmFjdG9yc1ZlY3RvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjRXh0cmFjdG9yU3BlYyhFeHRyYWN0b3JTcGVjIHNwZWMpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBleHRyYWN0b3JIYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgZXh0cmFjdG9ySGFzaC5wdXQoImNsYXNzTmFtZSIsIHNwZWMuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICBleHRyYWN0b3JIYXNoLnB1dCgiY29uZmlnIiwKKyAgICAgICAgICAgICAgICBnZXRYbWxScGNQcm9wZXJ0aWVzKHNwZWMuZ2V0Q29uZmlndXJhdGlvbigpKSk7CisgICAgICAgIHJldHVybiBleHRyYWN0b3JIYXNoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBnZXRYbWxScGNUeXBlSGFuZGxlcnMoTGlzdDxUeXBlSGFuZGxlcj4gdHlwZUhhbmRsZXJzKSB7CisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBoYW5kbGVyc1ZlY3RvciA9IG5ldyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4oKTsKKworICAgICAgICBpZiAodHlwZUhhbmRsZXJzICE9IG51bGwgJiYgdHlwZUhhbmRsZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8VHlwZUhhbmRsZXI+IGkgPSB0eXBlSGFuZGxlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgVHlwZUhhbmRsZXIgdHlwZUhhbmRsZXIgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVyc1ZlY3Rvci5hZGQoZ2V0WG1sUnBjVHlwZUhhbmRsZXIodHlwZUhhbmRsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVyc1ZlY3RvcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldFhtbFJwY1R5cGVIYW5kbGVyKFR5cGVIYW5kbGVyIHR5cGVIYW5kbGVyKSB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gaGFuZGxlckhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBoYW5kbGVySGFzaC5wdXQoImNsYXNzTmFtZSIsIHR5cGVIYW5kbGVyICE9IG51bGwgPyAKKyAgICAgICAgICAgIHR5cGVIYW5kbGVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOiIiKTsKKyAgICAgICAgaGFuZGxlckhhc2gucHV0KCJlbGVtZW50TmFtZSIsIHR5cGVIYW5kbGVyICE9IG51bGwgPyAKKyAgICAgICAgICAgIHR5cGVIYW5kbGVyLmdldEVsZW1lbnROYW1lKCk6IiIpOworICAgICAgICByZXR1cm4gaGFuZGxlckhhc2g7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PEV4dHJhY3RvclNwZWM+IGdldFR5cGVFeHRyYWN0b3JzRnJvbVhtbFJwYyhWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZXh0cmFjdG9yc1ZlY3RvcikgeworICAgICAgICBMaXN0PEV4dHJhY3RvclNwZWM+IGV4dHJhY3RvcnMgPSBuZXcgVmVjdG9yPEV4dHJhY3RvclNwZWM+KCk7CisKKyAgICAgICAgaWYgKGV4dHJhY3RvcnNWZWN0b3IgIT0gbnVsbCAmJiBleHRyYWN0b3JzVmVjdG9yLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gaSA9IGV4dHJhY3RvcnNWZWN0b3IuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBleHRyYWN0b3JTcGVjSGFzaCA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGV4dHJhY3RvcnMuYWRkKGdldEV4dHJhY3RvclNwZWNGcm9tWG1sUnBjKGV4dHJhY3RvclNwZWNIYXNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXh0cmFjdG9yczsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIEV4dHJhY3RvclNwZWMgZ2V0RXh0cmFjdG9yU3BlY0Zyb21YbWxScGMoCisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGV4dHJhY3RvclNwZWNIYXNoKSB7CisgICAgICAgIEV4dHJhY3RvclNwZWMgc3BlYyA9IG5ldyBFeHRyYWN0b3JTcGVjKCk7CisgICAgICAgIHNwZWMuc2V0Q2xhc3NOYW1lKChTdHJpbmcpIGV4dHJhY3RvclNwZWNIYXNoLmdldCgiY2xhc3NOYW1lIikpOworICAgICAgICBzcGVjCisgICAgICAgICAgICAgICAgLnNldENvbmZpZ3VyYXRpb24oZ2V0UHJvcGVydGllc0Zyb21YbWxScGMoKEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4pIGV4dHJhY3RvclNwZWNIYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJjb25maWciKSkpOworICAgICAgICByZXR1cm4gc3BlYzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFR5cGVIYW5kbGVyPiBnZXRUeXBlSGFuZGxlcnNGcm9tWG1sUnBjKFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBoYW5kbGVyc1ZlY3RvcikgeworICAgICAgICBMaXN0PFR5cGVIYW5kbGVyPiBoYW5kbGVycyA9IG5ldyBWZWN0b3I8VHlwZUhhbmRsZXI+KCk7CisKKyAgICAgICAgaWYgKGhhbmRsZXJzVmVjdG9yICE9IG51bGwgJiYgaGFuZGxlcnNWZWN0b3Iuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBpID0gaGFuZGxlcnNWZWN0b3IuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiB0eXBlSGFuZGxlckhhc2ggPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoZ2V0VHlwZUhhbmRsZXJGcm9tWG1sUnBjKHR5cGVIYW5kbGVySGFzaCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZXJzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFR5cGVIYW5kbGVyIGdldFR5cGVIYW5kbGVyRnJvbVhtbFJwYygKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gdHlwZUhhbmRsZXJIYXNoKSB7CisgICAgICAgIFR5cGVIYW5kbGVyIHR5cGVIYW5kbGVyID0gR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgLmdldFR5cGVIYW5kbGVyRnJvbUNsYXNzTmFtZSgoU3RyaW5nKSB0eXBlSGFuZGxlckhhc2guZ2V0KCJjbGFzc05hbWUiKSk7CisgICAgICAgIGlmKHR5cGVIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgdHlwZUhhbmRsZXIuc2V0RWxlbWVudE5hbWUoKFN0cmluZykgdHlwZUhhbmRsZXJIYXNoLmdldCgiZWxlbWVudE5hbWUiKSk7CisgICAgICAgIHJldHVybiB0eXBlSGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc0Zyb21YbWxScGMoSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBwcm9wSGFzaCkgeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKworICAgICAgICBpZiAocHJvcEhhc2ggIT0gbnVsbCAmJiBwcm9wSGFzaC5rZXlTZXQoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHByb3BIYXNoLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWUgPSBwcm9wSGFzaC5nZXQocHJvcE5hbWUpOworICAgICAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KHByb3BOYW1lLCBwcm9wVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb3BzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBnZXRYbWxScGNQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBwcm9wSGFzaCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAgICAgaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMua2V5U2V0KCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxPYmplY3Q+IGkgPSBwcm9wcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkocHJvcE5hbWUpOworICAgICAgICAgICAgICAgIHByb3BIYXNoLnB1dChwcm9wTmFtZSwgcHJvcFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9wSGFzaDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBnZXRYbWxScGNSZWZlcmVuY2VzKExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzKSB7CisgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiByZWZWZWN0b3IgPSBuZXcgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KCk7CisKKyAgICAgICAgaWYgKHJlZmVyZW5jZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZlZlY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBpID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcmVmSGFzaCA9IGdldFhtbFJwY1JlZmVyZW5jZShpLm5leHQoKSk7CisgICAgICAgICAgICByZWZWZWN0b3IuYWRkKHJlZkhhc2gpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlZlZlY3RvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UmVmZXJlbmNlPiBnZXRSZWZlcmVuY2VzRnJvbVhtbFJwYyhWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gcmVmZXJlbmNlVmVjdG9yKSB7CisgICAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gbmV3IFZlY3RvcjxSZWZlcmVuY2U+KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gaSA9IHJlZmVyZW5jZVZlY3Rvci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByID0gZ2V0UmVmZXJlbmNlRnJvbVhtbFJwYyhpLm5leHQoKSk7CisgICAgICAgICAgICByZWZlcmVuY2VzLmFkZChyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmZXJlbmNlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiByZWZlcmVuY2VIYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgcmVmZXJlbmNlSGFzaC5wdXQoIm9yaWdSZWZlcmVuY2UiLCByZWZlcmVuY2UuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgICAgcmVmZXJlbmNlSGFzaC5wdXQoImRhdGFTdG9yZVJlZmVyZW5jZSIsIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgIC5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSAhPSBudWxsID8gcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpIDogIiIpOworICAgICAgICByZWZlcmVuY2VIYXNoLnB1dCgiZmlsZVNpemUiLAorICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcocmVmZXJlbmNlLmdldEZpbGVTaXplKCkpKTsKKyAgICAgICAgcmVmZXJlbmNlSGFzaC5wdXQoIm1pbWVUeXBlIiwgKHJlZmVyZW5jZS5nZXRNaW1lVHlwZSgpID09IG51bGwpID8gIiIKKyAgICAgICAgICAgICAgICA6IHJlZmVyZW5jZS5nZXRNaW1lVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VIYXNoOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVmZXJlbmNlIGdldFJlZmVyZW5jZUZyb21YbWxScGMoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiByZWZlcmVuY2VIYXNoKSB7CisgICAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgICAgIHJlZmVyZW5jZS5zZXREYXRhU3RvcmVSZWZlcmVuY2UoKFN0cmluZykgcmVmZXJlbmNlSGFzaAorICAgICAgICAgICAgICAgIC5nZXQoImRhdGFTdG9yZVJlZmVyZW5jZSIpKTsKKyAgICAgICAgcmVmZXJlbmNlLnNldE9yaWdSZWZlcmVuY2UoKFN0cmluZykgcmVmZXJlbmNlSGFzaC5nZXQoIm9yaWdSZWZlcmVuY2UiKSk7CisgICAgICAgIHJlZmVyZW5jZS5zZXRGaWxlU2l6ZShMb25nLnBhcnNlTG9uZyhyZWZlcmVuY2VIYXNoLmdldCgiZmlsZVNpemUiKS50b1N0cmluZygpKSk7CisgICAgICAgIHJlZmVyZW5jZS5zZXRNaW1lVHlwZSgoU3RyaW5nKSByZWZlcmVuY2VIYXNoLmdldCgibWltZVR5cGUiKSk7CisgICAgICAgIHJldHVybiByZWZlcmVuY2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZ2V0WG1sUnBjRWxlbWVudExpc3QoTGlzdDxFbGVtZW50PiBlbGVtZW50TGlzdCkgeworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gZWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4oZWxlbWVudExpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxFbGVtZW50PiBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZWxlbWVudEhhc2ggPSBnZXRYbWxScGNFbGVtZW50KGVsZW1lbnQpOworICAgICAgICAgICAgZWxlbWVudFZlY3Rvci5hZGQoZWxlbWVudEhhc2gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtZW50VmVjdG9yOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50TGlzdEZyb21YbWxScGMoVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGVsZW1lbnRWZWN0b3IpIHsKKyAgICAgICAgTGlzdDxFbGVtZW50PiBlbGVtZW50TGlzdCA9IG5ldyBWZWN0b3I8RWxlbWVudD4oZWxlbWVudFZlY3Rvci5zaXplKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGkgPSBlbGVtZW50VmVjdG9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBlbGVtZW50SGFzaCA9IGkubmV4dCgpOworICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudEZyb21YbWxScGMoZWxlbWVudEhhc2gpOworICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtZW50TGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0WG1sUnBjRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBlbGVtZW50SGFzaCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisKKyAgICAgICAgZWxlbWVudEhhc2gucHV0KCJpZCIsIGVsZW1lbnQuZ2V0RWxlbWVudElkKCkpOworICAgICAgICBlbGVtZW50SGFzaC5wdXQoIm5hbWUiLCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworICAgICAgICBlbGVtZW50SGFzaC5wdXQoImRjRWxlbWVudCIsIGVsZW1lbnQuZ2V0RENFbGVtZW50KCkgIT0gbnVsbCA/IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAuZ2V0RENFbGVtZW50KCkgOiAiIik7CisgICAgICAgIGVsZW1lbnRIYXNoLnB1dCgiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsID8gZWxlbWVudC5nZXREZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIiKTsKKworICAgICAgICByZXR1cm4gZWxlbWVudEhhc2g7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEVsZW1lbnRGcm9tWG1sUnBjKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZWxlbWVudEhhc2gpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmV3IEVsZW1lbnQoKTsKKyAgICAgICAgZWxlbWVudC5zZXRFbGVtZW50SWQoKFN0cmluZykgZWxlbWVudEhhc2guZ2V0KCJpZCIpKTsKKyAgICAgICAgZWxlbWVudC5zZXRFbGVtZW50TmFtZSgoU3RyaW5nKSBlbGVtZW50SGFzaC5nZXQoIm5hbWUiKSk7CisgICAgICAgIGVsZW1lbnQuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgZWxlbWVudEhhc2guZ2V0KCJkZXNjcmlwdGlvbiIpKTsKKyAgICAgICAgZWxlbWVudC5zZXREQ0VsZW1lbnQoKFN0cmluZykgZWxlbWVudEhhc2guZ2V0KCJkY0VsZW1lbnQiKSk7CisKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldFhtbFJwY1F1ZXJ5KFF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcXVlcnlIYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IGNyaXRlcmlhVmVjdG9yID0gZ2V0WG1sUnBjUXVlcnlDcml0ZXJpYUxpc3QocXVlcnkuZ2V0Q3JpdGVyaWEoKSk7CisgICAgICAgIHF1ZXJ5SGFzaC5wdXQoImNyaXRlcmlhIiwgY3JpdGVyaWFWZWN0b3IpOworICAgICAgICByZXR1cm4gcXVlcnlIYXNoOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUXVlcnkgZ2V0UXVlcnlGcm9tWG1sUnBjKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcXVlcnlIYXNoKSB7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBMaXN0PFF1ZXJ5Q3JpdGVyaWE+IGNyaXRlcmlhID0gZ2V0UXVlcnlDcml0ZXJpYUxpc3RGcm9tWG1sUnBjKChWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIHF1ZXJ5SGFzaAorICAgICAgICAgICAgICAgIC5nZXQoImNyaXRlcmlhIikpOworICAgICAgICBxdWVyeS5zZXRDcml0ZXJpYShjcml0ZXJpYSk7CisgICAgICAgIHJldHVybiBxdWVyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBnZXRYbWxScGNRdWVyeUNyaXRlcmlhTGlzdChMaXN0PFF1ZXJ5Q3JpdGVyaWE+IGNyaXRlcmlhTGlzdCkgeworICAgICAgICBWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gY3JpdGVyaWFWZWN0b3IgPSBuZXcgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KGNyaXRlcmlhTGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPFF1ZXJ5Q3JpdGVyaWE+IGkgPSBjcml0ZXJpYUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBRdWVyeUNyaXRlcmlhIGNyaXRlcmlhID0gaS5uZXh0KCk7CisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGNyaXRlcmlhSGFzaCA9IGdldFhtbFJwY1F1ZXJ5Q3JpdGVyaWEoY3JpdGVyaWEpOworICAgICAgICAgICAgY3JpdGVyaWFWZWN0b3IuYWRkKGNyaXRlcmlhSGFzaCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JpdGVyaWFWZWN0b3I7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFF1ZXJ5Q3JpdGVyaWE+IGdldFF1ZXJ5Q3JpdGVyaWFMaXN0RnJvbVhtbFJwYyhWZWN0b3I8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4gY3JpdGVyaWFWZWN0b3IpIHsKKworICAgICAgICBMaXN0PFF1ZXJ5Q3JpdGVyaWE+IGNyaXRlcmlhTGlzdCA9IG5ldyBWZWN0b3I8UXVlcnlDcml0ZXJpYT4oY3JpdGVyaWFWZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiBpID0gY3JpdGVyaWFWZWN0b3IuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGNyaXRlcmlhSGFzaCA9IGkubmV4dCgpOworICAgICAgICAgICAgUXVlcnlDcml0ZXJpYSBjcml0ZXJpYSA9IGdldFF1ZXJ5Q3JpdGVyaWFGcm9tWG1sUnBjKGNyaXRlcmlhSGFzaCk7CisgICAgICAgICAgICBjcml0ZXJpYUxpc3QuYWRkKGNyaXRlcmlhKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JpdGVyaWFMaXN0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRYbWxScGNRdWVyeUNyaXRlcmlhKFF1ZXJ5Q3JpdGVyaWEgY3JpdGVyaWEpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBjcml0ZXJpYUhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBjcml0ZXJpYUhhc2gucHV0KCJjbGFzcyIsY3JpdGVyaWEuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAKKyAgICAgICAgaWYoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSl7ICAKKyAgICAgICAgICAgIGNyaXRlcmlhSGFzaC5wdXQoImVsZW1lbnROYW1lIiwgY3JpdGVyaWEuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICAgICAgICBjcml0ZXJpYUhhc2gucHV0KCJlbGVtZW50VmFsdWUiLCAoKFRlcm1RdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmKGNyaXRlcmlhIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKXsKKyAgICAgICAgICAgIGNyaXRlcmlhSGFzaC5wdXQoImVsZW1lbnROYW1lIiwgY3JpdGVyaWEuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICAgICAgICBjcml0ZXJpYUhhc2gucHV0KCJlbGVtZW50U3RhcnRWYWx1ZSIsICgoUmFuZ2VRdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5nZXRTdGFydFZhbHVlKCkgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICgoUmFuZ2VRdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5nZXRTdGFydFZhbHVlKCk6IiIpOworICAgICAgICAgICAgY3JpdGVyaWFIYXNoLnB1dCgiZWxlbWVudEVuZFZhbHVlIiwgKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpY3JpdGVyaWEpLmdldEVuZFZhbHVlKCkgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICgoUmFuZ2VRdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5nZXRFbmRWYWx1ZSgpOiIiKTsKKyAgICAgICAgICAgIGNyaXRlcmlhSGFzaC5wdXQoImluY2x1c2l2ZSIsIEJvb2xlYW4udG9TdHJpbmcoKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKS5nZXRJbmNsdXNpdmUoKSkpOyAKKyAgICAgICAgfSBlbHNlIGlmKGNyaXRlcmlhIGluc3RhbmNlb2YgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpeworICAgICAgICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgYm9vbFF1ZXJ5ID0gKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBjcml0ZXJpYTsKKyAgICAgICAgICAgIGNyaXRlcmlhSGFzaC5wdXQoIm9wZXJhdG9yIiwgbmV3IEludGVnZXIoYm9vbFF1ZXJ5LmdldE9wZXJhdG9yKCkpKTsKKyAgICAgICAgICAgIFZlY3RvcjxIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+PiB0ZXJtc0hhc2ggPSBuZXcgVmVjdG9yPEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+KCk7CisgICAgICAgICAgICBMaXN0PFF1ZXJ5Q3JpdGVyaWE+IHRlcm1zID0gYm9vbFF1ZXJ5LmdldFRlcm1zKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8dGVybXMuc2l6ZSgpO2krKyl7CisgICAgICAgICAgICAgICAgUXVlcnlDcml0ZXJpYSB0ZXJtID0gdGVybXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gdGVybUhhc2ggPSBnZXRYbWxScGNRdWVyeUNyaXRlcmlhKHRlcm0pOworICAgICAgICAgICAgICAgIHRlcm1zSGFzaC5hZGQodGVybUhhc2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3JpdGVyaWFIYXNoLnB1dCgidGVybXMiLCB0ZXJtc0hhc2gpOworICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL3Nob3VsZCBub3QgaGFwcGVuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNyaXRlcmlhSGFzaDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBRdWVyeUNyaXRlcmlhIGdldFF1ZXJ5Q3JpdGVyaWFGcm9tWG1sUnBjKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gY3JpdGVyaWFIYXNoKSB7CisgICAgICAgIFF1ZXJ5Q3JpdGVyaWEgY3JpdGVyaWEgPSBudWxsOworICAgICAgICBpZigoKFN0cmluZyljcml0ZXJpYUhhc2guZ2V0KCJjbGFzcyIpKS5lcXVhbHMoVGVybVF1ZXJ5Q3JpdGVyaWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSl7CisgICAgICAgICAgICBjcml0ZXJpYSA9IG5ldyBUZXJtUXVlcnlDcml0ZXJpYSgpOworICAgICAgICAgICAgY3JpdGVyaWEuc2V0RWxlbWVudE5hbWUoKFN0cmluZykgY3JpdGVyaWFIYXNoLmdldCgiZWxlbWVudE5hbWUiKSk7CisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5zZXRWYWx1ZSgoU3RyaW5nKSBjcml0ZXJpYUhhc2guZ2V0KCJlbGVtZW50VmFsdWUiKSk7CisgICAgICAgIH0gZWxzZSBpZigoKFN0cmluZyljcml0ZXJpYUhhc2guZ2V0KCJjbGFzcyIpKS5lcXVhbHMoUmFuZ2VRdWVyeUNyaXRlcmlhLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpeworICAgICAgICAgICAgY3JpdGVyaWEgPSBuZXcgUmFuZ2VRdWVyeUNyaXRlcmlhKCk7CisgICAgICAgICAgICBjcml0ZXJpYS5zZXRFbGVtZW50TmFtZSgoU3RyaW5nKSBjcml0ZXJpYUhhc2guZ2V0KCJlbGVtZW50TmFtZSIpKTsKKyAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbCA9IGNyaXRlcmlhSGFzaC5nZXQoImVsZW1lbnRTdGFydFZhbHVlIikuZXF1YWxzKCIiKSA/IAorICAgICAgICAgICAgICAgICAgICBudWxsIDogKFN0cmluZyljcml0ZXJpYUhhc2guZ2V0KCJlbGVtZW50U3RhcnRWYWx1ZSIpOworICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9IGNyaXRlcmlhSGFzaC5nZXQoImVsZW1lbnRFbmRWYWx1ZSIpLmVxdWFscygiIikgPworICAgICAgICAgICAgICAgICAgICBudWxsIDogKFN0cmluZyljcml0ZXJpYUhhc2guZ2V0KCJlbGVtZW50RW5kVmFsdWUiKTsKKyAgICAgICAgICAgICgoUmFuZ2VRdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5zZXRTdGFydFZhbHVlKHN0YXJ0VmFsKTsKKyAgICAgICAgICAgICgoUmFuZ2VRdWVyeUNyaXRlcmlhKWNyaXRlcmlhKS5zZXRFbmRWYWx1ZShlbmRWYWwpOworICAgICAgICAgICAgKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpY3JpdGVyaWEpLnNldEluY2x1c2l2ZShCb29sZWFuLnBhcnNlQm9vbGVhbigoU3RyaW5nKSBjcml0ZXJpYUhhc2guZ2V0KCJpbmNsdXNpdmUiKSkpOworICAgICAgICB9IGVsc2UgaWYoKChTdHJpbmcpY3JpdGVyaWFIYXNoLmdldCgiY2xhc3MiKSkuZXF1YWxzKEJvb2xlYW5RdWVyeUNyaXRlcmlhLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpeworICAgICAgICAgICAgY3JpdGVyaWEgPSBuZXcgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEoKTsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgKChCb29sZWFuUXVlcnlDcml0ZXJpYSljcml0ZXJpYSkuc2V0T3BlcmF0b3IoICgoSW50ZWdlciljcml0ZXJpYUhhc2guZ2V0KCJvcGVyYXRvciIpKS5pbnRWYWx1ZSgpICk7CisgICAgICAgICAgICB9IGNhdGNoIChRdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZ2VuZXJhdGluZyBCb29sZWFuIFF1ZXJ5LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBMaXN0PEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4+IHRlcm1zID0gKExpc3Q8SGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pj4pIGNyaXRlcmlhSGFzaC5nZXQoInRlcm1zIik7CisgICAgICAgICAgICBmb3IoaW50IGk9MDtpPHRlcm1zLnNpemUoKTtpKyspeworICAgICAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gdGVybSA9IHRlcm1zLmdldChpKTsKKyAgICAgICAgICAgICAgICBRdWVyeUNyaXRlcmlhIHRlcm1Dcml0ZXJpYSA9IGdldFF1ZXJ5Q3JpdGVyaWFGcm9tWG1sUnBjKHRlcm0pOworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgKChCb29sZWFuUXVlcnlDcml0ZXJpYSljcml0ZXJpYSkuYWRkVGVybSh0ZXJtQ3JpdGVyaWEpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFF1ZXJ5Rm9ybXVsYXRpb25FeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZ2VuZXJhdGluZyBCb29sZWFuIFF1ZXJ5LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyaXRlcmlhOyAgICAgICAgCisgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvWG1sU3RydWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvWG1sU3RydWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTI4MzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9YbWxTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkV4dHJhY3RvclNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMudHlwZS5UeXBlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciByaXZlcm1hCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBHZW5lcmljIGNsYXNzIGZvciBjb25zdHJ1Y3RpbmcgRmlsZSBNYW5hZ2VyIG9iamVjdHMgb3V0IG9mIFhNTCB7QGxpbmsgTm9kZX1zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBYbWxTdHJ1Y3RGYWN0b3J5IHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoWG1sU3RydWN0RmFjdG9yeS5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIFhtbFN0cnVjdEZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJEb24ndCBjb25zdHJ1Y3QgWG1sU3RydWN0RmFjdG9yaWVzISIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGUoTm9kZSBwcm9kdWN0VHlwZU5vZGUpIHsKKyAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBwcm9kdWN0VHlwZUVsZW0gPSAob3JnLnczYy5kb20uRWxlbWVudCkgcHJvZHVjdFR5cGVOb2RlOworCisgICAgICAgIFN0cmluZyBpZCA9IHByb2R1Y3RUeXBlRWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvZHVjdFR5cGVFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOworCisgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgcmVwb3NpdG9yeUVsZW0gPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQoCisgICAgICAgICAgICAgICAgInJlcG9zaXRvcnkiLCBwcm9kdWN0VHlwZUVsZW0pOworCisgICAgICAgIFN0cmluZyByZXBvc2l0b3J5UGF0aCA9IHJlcG9zaXRvcnlFbGVtLmdldEF0dHJpYnV0ZSgicGF0aCIpOworCisgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgdmVyc2lvbmVyRWxlbSA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudCgKKyAgICAgICAgICAgICAgICAidmVyc2lvbmVyIiwgcHJvZHVjdFR5cGVFbGVtKTsKKworICAgICAgICBTdHJpbmcgdmVyc2lvbmVyQ2xhc3MgPSB2ZXJzaW9uZXJFbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsKKworICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlc2NFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtKTsKKworICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICBpZiAoZGVzY0VsZW0uZ2V0QXR0cmlidXRlKCJ0cmltIikgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICFkZXNjRWxlbS5nZXRBdHRyaWJ1dGUoInRyaW0iKS5lcXVhbHMoIiIpCisgICAgICAgICAgICAgICAgJiYgIUJvb2xlYW4udmFsdWVPZihkZXNjRWxlbS5nZXRBdHRyaWJ1dGUoInRyaW0iKSkpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gWE1MVXRpbHMuZ2V0RWxlbWVudFRleHQoImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gWE1MVXRpbHMuZ2V0RWxlbWVudFRleHQoImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9zaXRvcnlQYXRoID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMocmVwb3NpdG9yeVBhdGgpOworCisgICAgICAgIC8vIGdyYWIgbWV0YWRhdGEKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIEVsZW1lbnQgbWV0YWRhdGFSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KCJtZXRhZGF0YSIsCisgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtKTsKKyAgICAgICAgaWYgKG1ldGFkYXRhUm9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IG1ldEhhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgTm9kZUxpc3Qga2V5VmFsRWxlbXMgPSBtZXRhZGF0YVJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImtleXZhbCIpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleVZhbEVsZW1zLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGtleVZhbEVsZW0gPSAoRWxlbWVudCkga2V5VmFsRWxlbXMuaXRlbShpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtTmFtZSA9IFhNTFV0aWxzLnJlYWQoa2V5VmFsRWxlbSwgImtleSIpOworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBlbGVtVmFsdWVzID0gWE1MVXRpbHMucmVhZE1hbnkoa2V5VmFsRWxlbSwgInZhbCIpOworICAgICAgICAgICAgICAgIG1ldEhhc2gucHV0KGVsZW1OYW1lLCBlbGVtVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0LnJlcGxhY2VNZXRhZGF0YShtZXRIYXNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCUxPRy53YXJuaW5nKCJtZXRhZGF0YSBub2RlIG1pc3NpbmcgZm9yIHByb2R1Y3QgdHlwZSA6ICIraWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ3JhYiBleHRyYWN0b3JzCisgICAgICAgIExpc3Q8RXh0cmFjdG9yU3BlYz4gZXh0cmFjdG9ycyA9IG5ldyBWZWN0b3I8RXh0cmFjdG9yU3BlYz4oKTsKKyAgICAgICAgRWxlbWVudCBleHRyYWN0b3JSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KCJtZXRFeHRyYWN0b3JzIiwKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW0pOworCisgICAgICAgIGlmIChleHRyYWN0b3JSb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vZGVMaXN0IGV4dHJhY3Rvck5vZGVzID0gZXh0cmFjdG9yUm9vdAorICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImV4dHJhY3RvciIpOworICAgICAgICAgICAgaWYgKGV4dHJhY3Rvck5vZGVzICE9IG51bGwgJiYgZXh0cmFjdG9yTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYWN0b3JOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZXh0cmFjdG9yRWxlbSA9IChFbGVtZW50KSBleHRyYWN0b3JOb2Rlcy5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBFeHRyYWN0b3JTcGVjIHNwZWMgPSBuZXcgRXh0cmFjdG9yU3BlYygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZXh0cmFjdG9yRWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgIHNwZWMuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgY29uZmlndXJhdGlvbiA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbiIsIGV4dHJhY3RvckVsZW0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IHByb3BlcnR5Tm9kZXMgPSBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcGVydHkiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Tm9kZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0eU5vZGVzLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHlOb2Rlcy5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcGVydHlFbGVtID0gKEVsZW1lbnQpIHByb3BlcnR5Tm9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5RWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eUVsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFbGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoImVudlJlcGxhY2UiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMocHJvcGVydHlWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjLnNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvcnMuYWRkKHNwZWMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAJTE9HLndhcm5pbmcoIm1ldEV4dHJhY3RvcnMgbm9kZSBtaXNzaW5nIGZyb20gcHJvZHVjdCB0eXBlIDogIitpZCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIExpc3Q8VHlwZUhhbmRsZXI+IGhhbmRsZXJzID0gbnVsbDsKKyAgICAgICAgRWxlbWVudCBoYW5kbGVyUm9vdCA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudCgidHlwZUhhbmRsZXJzIiwKKyAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW0pOworICAgICAgICBpZiAoaGFuZGxlclJvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgTm9kZUxpc3QgaGFuZGxlck5vZGVzID0gaGFuZGxlclJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInR5cGVIYW5kbGVyIik7CisgICAgICAgICAgICBpZiAoaGFuZGxlck5vZGVzICE9IG51bGwgJiYgaGFuZGxlck5vZGVzLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IFZlY3RvcjxUeXBlSGFuZGxlcj4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgaGFuZGxlck5vZGUgPSBoYW5kbGVyTm9kZXMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJDbGFzcyA9ICgoRWxlbWVudCkgaGFuZGxlck5vZGUpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gKChFbGVtZW50KSBoYW5kbGVyTm9kZSkuZ2V0QXR0cmlidXRlKCJlbGVtZW50TmFtZSIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUhhbmRsZXIgdHlwZUhhbmRsZXIgPSAoVHlwZUhhbmRsZXIpIENsYXNzLmZvck5hbWUoaGFuZGxlckNsYXNzKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUhhbmRsZXIuc2V0RWxlbWVudE5hbWUoZWxlbWVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKHR5cGVIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkZhaWxlZCB0byBsb2FkIGhhbmRsZXIgZm9yIFByb2R1Y3RUeXBlIFtuYW1lID0gIiArIG5hbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gYW5kIGVsZW1lbnQgW25hbWUgPSAiICsgZWxlbWVudE5hbWUgKyAiXSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgIHByb2R1Y3RUeXBlLnNldE5hbWUobmFtZSk7CisgICAgICAgIHByb2R1Y3RUeXBlLnNldFByb2R1Y3RUeXBlSWQoaWQpOworICAgICAgICBwcm9kdWN0VHlwZS5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgocmVwb3NpdG9yeVBhdGgpOworICAgICAgICBwcm9kdWN0VHlwZS5zZXRWZXJzaW9uZXIodmVyc2lvbmVyQ2xhc3MpOworICAgICAgICBwcm9kdWN0VHlwZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisgICAgICAgIHByb2R1Y3RUeXBlLnNldFR5cGVNZXRhZGF0YShtZXQpOworICAgICAgICBwcm9kdWN0VHlwZS5zZXRFeHRyYWN0b3JzKGV4dHJhY3RvcnMpOworICAgICAgICBwcm9kdWN0VHlwZS5zZXRIYW5kbGVycyhoYW5kbGVycyk7CisKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVByb2R1Y3RUeXBlTWFwWG1MRG9jdW1lbnQoSGFzaE1hcDxTdHJpbmcsIExpc3Q8b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudD4+IHByb2R1Y3RUeXBlTWFwLAorICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc3ViVG9TdXBlck1hcCwgU3RyaW5nIHhtbEZpbGVQYXRoKSB7CisgICAgICAgIFhNTFV0aWxzLndyaXRlWG1sRmlsZShnZXRQcm9kdWN0VHlwZU1hcFhtbERvY3VtZW50KHByb2R1Y3RUeXBlTWFwLAorICAgICAgICAgICAgICAgIHN1YlRvU3VwZXJNYXApLCB4bWxGaWxlUGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRWxlbWVudFhtbERvY3VtZW50KExpc3Q8b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudD4gZWxlbWVudHMsIFN0cmluZyB4bWxGaWxlUGF0aCkgeworICAgICAgICBYTUxVdGlscy53cml0ZVhtbEZpbGUoZ2V0RWxlbWVudFhtbERvY3VtZW50KGVsZW1lbnRzKSwgeG1sRmlsZVBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVByb2R1Y3RUeXBlWG1sRG9jdW1lbnQoTGlzdDxQcm9kdWN0VHlwZT4gcHJvZHVjdFR5cGVzLAorICAgICAgICAgICAgU3RyaW5nIHhtbEZpbGVQYXRoKSB7CisgICAgICAgIFhNTFV0aWxzLndyaXRlWG1sRmlsZShnZXRQcm9kdWN0VHlwZVhtbERvY3VtZW50KHByb2R1Y3RUeXBlcyksCisgICAgICAgICAgICAgICAgeG1sRmlsZVBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0UHJvZHVjdFR5cGVNYXBYbWxEb2N1bWVudChIYXNoTWFwPFN0cmluZywgTGlzdDxvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50Pj4gcHJvZHVjdFR5cGVNYXAsCisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzdWJUb1N1cGVyTWFwKSB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKKworICAgICAgICAgICAgRWxlbWVudCByb290ID0gKEVsZW1lbnQpIGRvY3VtZW50CisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFbGVtZW50KCJjYXM6cHJvZHVjdHR5cGVtYXAiKTsKKyAgICAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczpjYXMiLCAiaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3QpOworCisgICAgICAgICAgICAvLyBBbHNvIHByaW50IHR5cGVzIHdpdGhvdXQgZWxlbWVudHMgYnV0IGp1c3Qgd2l0aCBwYXJlbnRzCisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhbGxUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihwcm9kdWN0VHlwZU1hcC5rZXlTZXQoKSk7CisgICAgICAgICAgICBmb3IoU3RyaW5nIHR5cGU6IHN1YlRvU3VwZXJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZighYWxsVHlwZXMuY29udGFpbnModHlwZSkpCisgICAgICAgICAgICAgICAgICAgIGFsbFR5cGVzLmFkZCh0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGxUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IHR5cGVFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHlwZSIpOworICAgICAgICAgICAgICAgIHR5cGVFbGVtLnNldEF0dHJpYnV0ZSgiaWQiLCB0eXBlSWQpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNQYXJlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoc3ViVG9TdXBlck1hcC5jb250YWluc0tleSh0eXBlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVFbGVtLnNldEF0dHJpYnV0ZSgicGFyZW50Iiwgc3ViVG9TdXBlck1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQodHlwZUlkKSk7CisgICAgICAgICAgICAgICAgICAgIGhhc1BhcmVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTGlzdDxvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50PiBlbGVtZW50SWRzID0gcHJvZHVjdFR5cGVNYXAuZ2V0KHR5cGVJZCk7CisgICAgICAgICAgICAgICAgaWYoIWhhc1BhcmVudCAmJiAoZWxlbWVudElkcyA9PSBudWxsIHx8IGVsZW1lbnRJZHMuc2l6ZSgpID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIHBhcmVudCwgYW5kIG5vIGVsZW1lbnRzLCBkb24ndCBhZGQgdGhpcyB0eXBlIHRvIHRoZSB4bWwKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGVsZW1lbnRJZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ+IGogPSBlbGVtZW50SWRzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRJZCA9IGoubmV4dCgpLmdldEVsZW1lbnRJZCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZWxlbWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEVsZW0uc2V0QXR0cmlidXRlKCJpZCIsIGVsZW1lbnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlRWxlbS5hcHBlbmRDaGlsZChlbGVtZW50RWxlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKHR5cGVFbGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OworCisgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZW5lcmF0aW5nIHByb2R1Y3QtdHlwZS1lbGVtZW50LW1hcCB4bWwgZmlsZSE6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXRFbGVtZW50WG1sRG9jdW1lbnQoTGlzdDxvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50PiBlbGVtZW50cykgeworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZG9jdW1lbnQgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7CisKKyAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IChFbGVtZW50KSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYXM6ZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczpjYXMiLCAiaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3QpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ+IGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50IGVsZW1lbnQgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZWxlbWVudCIpOworICAgICAgICAgICAgICAgIGVsZW1lbnRFbGVtLnNldEF0dHJpYnV0ZSgiaWQiLCBmcmllbmRseVhtbChlbGVtZW50LmdldEVsZW1lbnRJZCgpKSk7CisgICAgICAgICAgICAgICAgZWxlbWVudEVsZW0uc2V0QXR0cmlidXRlKCJuYW1lIiwgZnJpZW5kbHlYbWwoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKSk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IGRlc2NyaXB0aW9uRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRlc2NyaXB0aW9uIik7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGZyaWVuZGx5WG1sKGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZXNjcmlwdGlvbigpKSkpOworICAgICAgICAgICAgICAgIGVsZW1lbnRFbGVtLmFwcGVuZENoaWxkKGRlc2NyaXB0aW9uRWxlbSk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IGRjRWxlbWVudEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkY0VsZW1lbnQiKTsKKyAgICAgICAgICAgICAgICBkY0VsZW1lbnRFbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGZyaWVuZGx5WG1sKGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREQ0VsZW1lbnQoKSkpKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50RWxlbS5hcHBlbmRDaGlsZChkY0VsZW1lbnRFbGVtKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGVsZW1lbnRFbGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OworCisgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBnZW5lcmF0aW5nIGVsZW1lbnRzIHhtbCBmaWxlITogIgorICAgICAgICAgICAgICAgICAgICArIHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXRQcm9kdWN0VHlwZVhtbERvY3VtZW50KExpc3Q8UHJvZHVjdFR5cGU+IHByb2R1Y3RUeXBlcykgeworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZG9jdW1lbnQgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7CisKKyAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IChFbGVtZW50KSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYXM6cHJvZHVjdHR5cGVzIik7CisgICAgICAgICAgICByb290LnNldEF0dHJpYnV0ZSgieG1sbnM6Y2FzIiwgImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIik7CisgICAgICAgICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKKworICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgc2V0IG9mIG1ldGFkYXRhIGVsZW1lbnRzIGluIHRoZSBwcm9wZXJ0aWVzIG9iamVjdAorICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxQcm9kdWN0VHlwZT4gaSA9IHByb2R1Y3RUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IHR5cGVFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHlwZSIpOworICAgICAgICAgICAgICAgIHR5cGVFbGVtLnNldEF0dHJpYnV0ZSgiaWQiLCB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSk7CisgICAgICAgICAgICAgICAgdHlwZUVsZW0uc2V0QXR0cmlidXRlKCJuYW1lIiwgdHlwZS5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgRWxlbWVudCBkZXNjcmlwdGlvbkVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkZXNjcmlwdGlvbiIpOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVzY3JpcHRpb24oKSkpOworICAgICAgICAgICAgICAgIHR5cGVFbGVtLmFwcGVuZENoaWxkKGRlc2NyaXB0aW9uRWxlbSk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IHJlcG9zaXRvcnlQYXRoRWxlbSA9IGRvY3VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRWxlbWVudCgicmVwb3NpdG9yeSIpOworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlQYXRoRWxlbS5zZXRBdHRyaWJ1dGUoInBhdGgiLCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkpOworICAgICAgICAgICAgICAgIHR5cGVFbGVtLmFwcGVuZENoaWxkKHJlcG9zaXRvcnlQYXRoRWxlbSk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IHZlcnNpb25lckNsYXNzUGF0aEVsZW0gPSBkb2N1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVsZW1lbnQoInZlcnNpb25lciIpOworICAgICAgICAgICAgICAgIHZlcnNpb25lckNsYXNzUGF0aEVsZW0uc2V0QXR0cmlidXRlKCJjbGFzcyIsIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZXJzaW9uZXIoKSk7CisgICAgICAgICAgICAgICAgdHlwZUVsZW0uYXBwZW5kQ2hpbGQodmVyc2lvbmVyQ2xhc3NQYXRoRWxlbSk7CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgZXh0cmFjdG9yIGluZm8KKyAgICAgICAgICAgICAgICBFbGVtZW50IG1ldEV4dHJhY3RvcnNFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibWV0RXh0cmFjdG9ycyIpOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHNwZWNPYmplY3QgOiB0eXBlLmdldEV4dHJhY3RvcnMoKSkgeworICAgICAgICAgICAgICAgICAgICBFeHRyYWN0b3JTcGVjIHNwZWMgPSAoRXh0cmFjdG9yU3BlYykgc3BlY09iamVjdDsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBleHRyYWN0b3JFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZXh0cmFjdG9yIik7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvckVsZW0uc2V0QXR0cmlidXRlKCJjbGFzcyIsIHNwZWMuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWMuZ2V0Q29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZXh0cmFjdG9yQ29uZmlnRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBzcGVjLmdldENvbmZpZ3VyYXRpb24oKS5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BlcnR5RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByb3BlcnR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFbGVtLnNldEF0dHJpYnV0ZSgibmFtZSIsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFbGVtLnNldEF0dHJpYnV0ZSgidmFsdWUiLCBzcGVjLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3JDb25maWdFbGVtLmFwcGVuZENoaWxkKHByb3BlcnR5RWxlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvckVsZW0uYXBwZW5kQ2hpbGQoZXh0cmFjdG9yQ29uZmlnRWxlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG1ldEV4dHJhY3RvcnNFbGVtLmFwcGVuZENoaWxkKGV4dHJhY3RvckVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0eXBlRWxlbS5hcHBlbmRDaGlsZChtZXRFeHRyYWN0b3JzRWxlbSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gYWRkIHR5cGUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBFbGVtZW50IG1ldEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhZGF0YSIpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuZ2V0QWxsS2V5cygpKSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQga2V5VmFsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImtleXZhbCIpOworICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGtleUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB2YWxFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFsIik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBrZXlFbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleSkpOworICAgICAgICAgICAgICAgICAgICB2YWxFbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuZ2V0TWV0YWRhdGEoa2V5KSkpOworICAgICAgICAgICAgICAgICAgICBrZXlWYWxFbGVtLmFwcGVuZENoaWxkKGtleUVsZW0pOworICAgICAgICAgICAgICAgICAgICBrZXlWYWxFbGVtLmFwcGVuZENoaWxkKHZhbEVsZW0pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbWV0RWxlbS5hcHBlbmRDaGlsZChrZXlWYWxFbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHlwZUVsZW0uYXBwZW5kQ2hpbGQobWV0RWxlbSk7CisKKyAgICAgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKHR5cGVFbGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZ2VuZXJhdGluZyBwcm9kdWN0dHlwZXMgeG1sIGZpbGUhOiAiCisgICAgICAgICAgICAgICAgICAgICsgcGNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudCBnZXRFbGVtZW50KAorICAgICAgICAgICAgTm9kZSBlbGVtZW50Tm9kZSkgeworICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnRFbGVtID0gKG9yZy53M2MuZG9tLkVsZW1lbnQpIGVsZW1lbnROb2RlOworCisgICAgICAgIFN0cmluZyBpZCA9IGVsZW1lbnRFbGVtLmdldEF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50RWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKworICAgICAgICBTdHJpbmcgZGNFbGVtZW50ID0gWE1MVXRpbHMuZ2V0RWxlbWVudFRleHQoImRjRWxlbWVudCIsIGVsZW1lbnRFbGVtKTsKKworICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlc2NFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgZWxlbWVudEVsZW0pOworICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICBpZiAoZGVzY0VsZW0uZ2V0QXR0cmlidXRlKCJ0cmltIikgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICFkZXNjRWxlbS5nZXRBdHRyaWJ1dGUoInRyaW0iKS5lcXVhbHMoIiIpCisgICAgICAgICAgICAgICAgJiYgIUJvb2xlYW4udmFsdWVPZihkZXNjRWxlbS5nZXRBdHRyaWJ1dGUoInRyaW0iKSkpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gWE1MVXRpbHMuZ2V0RWxlbWVudFRleHQoImRlc2NyaXB0aW9uIiwgZWxlbWVudEVsZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBYTUxVdGlscy5nZXRFbGVtZW50VGV4dCgiZGVzY3JpcHRpb24iLCBlbGVtZW50RWxlbSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50IGVsZW1lbnQgPSBuZXcgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudCgpOworICAgICAgICBlbGVtZW50LnNldERDRWxlbWVudChkY0VsZW1lbnQpOworICAgICAgICBlbGVtZW50LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgZWxlbWVudC5zZXRFbGVtZW50SWQoaWQpOworICAgICAgICBlbGVtZW50LnNldEVsZW1lbnROYW1lKG5hbWUpOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBMaXN0PG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ+PiAKKyAgICAgICAgICAgIGdldFByb2R1Y3RUeXBlRWxlbWVudExpc3QoTm9kZSB0eXBlTWFwTm9kZSwgSGFzaE1hcDxTdHJpbmcsIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ+IGVsZW1lbnRzKSB7CisgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgdHlwZU1hcEVsZW1lbnQgPSAob3JnLnczYy5kb20uRWxlbWVudCkgdHlwZU1hcE5vZGU7CisKKyAgICAgICAgU3RyaW5nIHR5cGVJZCA9IHR5cGVNYXBFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgTGlzdDxvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50Pj4gcHJvZHVjdFR5cGVFbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ+PigpOworCisgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudExpc3RSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KAorICAgICAgICAgICAgICAgICJlbGVtZW50cyIsIHR5cGVNYXBFbGVtZW50KTsKKyAgICAgICAgTm9kZUxpc3QgZWxlbWVudE5vZGVMaXN0ID0gZWxlbWVudExpc3RSb290CisgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbGVtZW50Iik7CisKKyAgICAgICAgTGlzdDxvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50PiBlbGVtZW50TGlzdCA9IG5ldyBWZWN0b3I8b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudD4oZWxlbWVudE5vZGVMaXN0LmdldExlbmd0aCgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnROb2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnRFbGVtID0gKG9yZy53M2MuZG9tLkVsZW1lbnQpIGVsZW1lbnROb2RlTGlzdAorICAgICAgICAgICAgICAgICAgICAuaXRlbShpKTsKKyAgICAgICAgICAgIFN0cmluZyBlbGVtZW50SWQgPSBlbGVtZW50RWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7CisgICAgICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAuZ2V0KGVsZW1lbnRJZCk7CisgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBwcm9kdWN0VHlwZUVsZW1lbnRNYXAucHV0KHR5cGVJZCwgZWxlbWVudExpc3QpOworICAgICAgICByZXR1cm4gcHJvZHVjdFR5cGVFbGVtZW50TWFwOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnJpZW5kbHlYbWwoU3RyaW5nIHZhbHVlKXsKKyAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWU6IiI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9EYXRhU291cmNlVmFsaWRhdGlvbkxheWVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9EYXRhU291cmNlVmFsaWRhdGlvbkxheWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNTY2NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92YWxpZGF0aW9uL0RhdGFTb3VyY2VWYWxpZGF0aW9uTGF5ZXIuamF2YQpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZhbGlkYXRpb25MYXllckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5EYlN0cnVjdEZhY3Rvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgVmFsaWRhdGlvbkxheWVyIHRoYXQgcXVlcmllcyBhIHtAbGluayBEYXRhU291cmNlfQorICogYmFja2VkIGRhdGFiYXNlIGZvciB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlVmFsaWRhdGlvbkxheWVyIGltcGxlbWVudHMgVmFsaWRhdGlvbkxheWVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihEYXRhU291cmNlVmFsaWRhdGlvbkxheWVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKiBvdXIgZGF0YSBzb3VyY2UgKi8KKyAgICBwcml2YXRlIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7CisKKyAgICAvKiBzaG91bGQgd2UgcXVvdGUgcHJvZHVjdF90eXBlX2lkPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBxdW90ZUZpZWxkcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIERhdGFTb3VyY2VWYWxpZGF0aW9uTGF5ZXIoRGF0YVNvdXJjZSBkcywgYm9vbGVhbiBmaWVsZFF1b3RlKSB7CisgICAgICAgIGRhdGFTb3VyY2UgPSBkczsKKyAgICAgICAgcXVvdGVGaWVsZHMgPSBmaWVsZFF1b3RlOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2FkZEVsZW1lbnQob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGFkZE1ldGFFbGVtU3FsID0gIklOU0VSVCBJTlRPIGVsZW1lbnRzIChlbGVtZW50X25hbWUsIGRjX2VsZW1lbnQsIGVsZW1lbnRfZGVzY3JpcHRpb24pIFZBTFVFUyAoJyIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCAnIgorICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RENFbGVtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJywgJyIgKyBlbGVtZW50LmdldERlc2NyaXB0aW9uKCkgKyAiJykiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJhZGRNZXRhZGF0YUVsZW1lbnQ6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICArIGFkZE1ldGFFbGVtU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKGFkZE1ldGFFbGVtU3FsKTsKKworICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRJZCA9IG5ldyBTdHJpbmcoKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldE1ldGFJZFNxbCA9ICJTRUxFQ1QgTUFYKGVsZW1lbnRfaWQpIEFTIG1heF9pZCBGUk9NIGVsZW1lbnRzIjsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImFkZEVsZW1lbnQ6IEV4ZWN1dGluZzogIiArIGdldE1ldGFJZFNxbCk7CisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0TWV0YUlkU3FsKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRJZCA9IFN0cmluZy52YWx1ZU9mKHJzLmdldEludCgibWF4X2lkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbGVtZW50LnNldEVsZW1lbnRJZChlbGVtZW50SWQpOworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gYWRkaW5nIGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpICsgIi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgYWRkRWxlbWVudCB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNtb2RpZnlFbGVtZW50KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBlbGVtZW50U3FsID0gIlVQREFURSBlbGVtZW50cyBTRVQgZWxlbWVudF9uYW1lID0gJyIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkgKyAiJywgZGNfZWxlbWVudD0nIgorICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RENFbGVtZW50KCkgKyAiJywgIiArICJlbGVtZW50X2Rlc2NyaXB0aW9uPSciCisgICAgICAgICAgICAgICAgICAgICsgZWxlbWVudC5nZXREZXNjcmlwdGlvbigpICsgIicgV0hFUkUgIiArICJlbGVtZW50X2lkID0gIgorICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudElkKCk7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIm1vZGlmeUVsZW1lbnQ6IEV4ZWN1dGluZzogIiArIGVsZW1lbnRTcWwpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoZWxlbWVudFNxbCk7CisgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIG1vZGlmeWluZyBlbGVtZW50LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgbW9kaWZ5RWxlbWVudCB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI3JlbW92ZUVsZW1lbnQob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGRlbGV0ZUVsZW1lbnRTcWwgPSAiREVMRVRFIEZST00gZWxlbWVudHMgV0hFUkUgZWxlbWVudF9pZCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnRJZCgpOworCisgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgLmxvZyhMZXZlbC5GSU5FLCAicmVtb3ZlRWxlbWVudDogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWxldGVFbGVtZW50U3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKGRlbGV0ZUVsZW1lbnRTcWwpOworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiByZW1vdmluZyBlbGVtZW50LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgcmVtb3ZlRWxlbWVudCB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNhZGRFbGVtZW50VG9Qcm9kdWN0VHlwZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRWxlbWVudFRvUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgRWxlbWVudCBlbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGFkZE1ldGFFbGVtU3FsID0gIklOU0VSVCBJTlRPIHByb2R1Y3RfdHlwZV9lbGVtZW50X21hcCAocHJvZHVjdF90eXBlX2lkLCBlbGVtZW50X2lkKSBWQUxVRVMoIjsKKworICAgICAgICAgICAgaWYgKHF1b3RlRmllbGRzKSB7CisgICAgICAgICAgICAgICAgYWRkTWV0YUVsZW1TcWwgKz0gIiciICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiJywiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRNZXRhRWxlbVNxbCArPSB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSArICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZE1ldGFFbGVtU3FsICs9ICIgIiArIGVsZW1lbnQuZ2V0RWxlbWVudElkKCkgKyAiKSI7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImFkZEVsZW1lbnRUb1Byb2R1Y3RUeXBlOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBhZGRNZXRhRWxlbVNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShhZGRNZXRhRWxlbVNxbCk7CisgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGFkZGluZyBlbGVtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkgKyAiIHRvIHByb2R1Y3QgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiIC4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGFkZEVsZW1lbnRUb1Byb2R1Y3RUeXBlIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI3JlbW92ZUVsZW1lbnRGcm9tUHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRGcm9tUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgRWxlbWVudCBlbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGRlbGV0ZUVsZW1TcWwgPSAiREVMRVRFIEZST00gcHJvZHVjdF90eXBlX2VsZW1lbnRfbWFwIFdIRVJFIHByb2R1Y3RfdHlwZV9pZCA9ICI7CisKKyAgICAgICAgICAgIGlmIChxdW90ZUZpZWxkcykgeworICAgICAgICAgICAgICAgIGRlbGV0ZUVsZW1TcWwgKz0gIiciICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiJyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZUVsZW1TcWwgKz0gdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlbGV0ZUVsZW1TcWwgKz0gIiBBTkQgZWxlbWVudF9pZCA9ICIgKyBlbGVtZW50LmdldEVsZW1lbnRJZCgpOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJyZW1vdmVFbGVtZW50RnJvbVByb2R1Y3RUeXBlOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkZWxldGVFbGVtU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKGRlbGV0ZUVsZW1TcWwpOworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiByZW1vdmluZyBlbGVtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkgKyAiIGZyb20gcHJvZHVjdCB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICIuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayByZW1vdmVFbGVtZW50RnJvbVByb2R1Y3RUeXBlIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmVudFRvUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgU3RyaW5nIHBhcmVudCkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBhZGRQYXJlbnRJbmZvU3FsID0gIklOU0VSVCBJTlRPIHN1Yl90b19zdXBlcl9tYXAgKHByb2R1Y3RfdHlwZV9pZCwgcGFyZW50X2lkKSBWQUxVRVMoIjsKKyAgICAgICAgICAgIGlmIChxdW90ZUZpZWxkcykgeworICAgICAgICAgICAgICAgIGFkZFBhcmVudEluZm9TcWwgKz0gIiciICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiJywnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJlbnQgKyAiJykiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRQYXJlbnRJbmZvU3FsICs9IHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIiwiICsgcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIpIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiYWRkUGFyZW50VG9Qcm9kdWN0VHlwZTogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgYWRkUGFyZW50SW5mb1NxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShhZGRQYXJlbnRJbmZvU3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGFkZGluZyBwYXJlbnQgaW5mbyB0byBwcm9kdWN0IHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiIC4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGFkZFBhcmVudFRvUHJvZHVjdFR5cGUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJlbnRGcm9tUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgU3RyaW5nIHBhcmVudCkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBkZWxldGVQYXJTcWwgPSAiREVMRVRFIEZST00gc3ViX3RvX3N1cGVyX21hcCBXSEVSRSBwcm9kdWN0X3R5cGVfaWQgPSAiOworCisgICAgICAgICAgICBpZiAocXVvdGVGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVQYXJTcWwgKz0gIiciICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgQU5EIHBhcmVudF9pZCA9JyIgKyBwYXJlbnQgKyAiJyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZVBhclNxbCArPSB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKSArICIgQU5EIHBhcmVudF9pZCA9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJlbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgInJlbW92ZVBhcmVudEZyb21Qcm9kdWN0VHlwZTogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgZGVsZXRlUGFyU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKGRlbGV0ZVBhclNxbCk7CisgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHJlbW92aW5nIHBhcmVudCBmcm9tIHByb2R1Y3QgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICIuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayByZW1vdmVQYXJlbnRGcm9tUHJvZHVjdFR5cGUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNnZXRFbGVtZW50cyhvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50cyhQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzID0gbnVsbDsKKworICAgICAgICBlbGVtZW50cyA9IG5ldyBWZWN0b3I8RWxlbWVudD4oKTsKKworICAgICAgICBTdHJpbmcgY3VyclByb2R1Y3QgPSB0eXBlLmdldFByb2R1Y3RUeXBlSWQoKTsKKyAgICAgICAgd2hpbGUgKGN1cnJQcm9kdWN0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50U3FsID0gIlNFTEVDVCBlbGVtZW50cy4qIGZyb20gZWxlbWVudHMsIHByb2R1Y3RfdHlwZV9lbGVtZW50X21hcCBXSEVSRSBwcm9kdWN0X3R5cGVfZWxlbWVudF9tYXAucHJvZHVjdF90eXBlX2lkID0gIjsKKworICAgICAgICAgICAgICAgIGlmIChxdW90ZUZpZWxkcykgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50U3FsICs9ICInIiArIGN1cnJQcm9kdWN0ICsgIiciOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTcWwgKz0gY3VyclByb2R1Y3Q7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZWxlbWVudFNxbCArPSAiIEFORCBwcm9kdWN0X3R5cGVfZWxlbWVudF9tYXAuZWxlbWVudF9pZCA9IGVsZW1lbnRzLmVsZW1lbnRfaWQiOworCisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0RWxlbWVudHM6IEV4ZWN1dGluZzogIiArIGVsZW1lbnRTcWwpOworICAgICAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShlbGVtZW50U3FsKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gRGJTdHJ1Y3RGYWN0b3J5LmdldEVsZW1lbnQocnMpOworICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIHJlYWRpbmcgZWxlbWVudHMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBwcm9kdWN0IHBhcmVudAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBnZXRQYXJlbnRTcWwgPSAiU0VMRUNUIHBhcmVudF9pZCBmcm9tIHN1Yl90b19zdXBlcl9tYXAgd2hlcmUgcHJvZHVjdF90eXBlX2lkID0gIjsKKyAgICAgICAgICAgICAgICBpZiAocXVvdGVGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UGFyZW50U3FsICs9ICInIiArIGN1cnJQcm9kdWN0ICsgIiciOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFBhcmVudFNxbCArPSBjdXJyUHJvZHVjdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRFbGVtZW50czogRXhlY3V0aW5nOiAiICsgZ2V0UGFyZW50U3FsKTsKKyAgICAgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UGFyZW50U3FsKTsKKworICAgICAgICAgICAgICAgIGN1cnJQcm9kdWN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJQcm9kdWN0ID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFBhcmVudChycyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiByZWFkaW5nIHByb2R1Y3QgcGFyZW50LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2dldEVsZW1lbnRzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50cygpIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBkYXRhVHlwZVNxbCA9ICJTRUxFQ1QgKiBmcm9tIGVsZW1lbnRzIjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0RWxlbWVudHM6IEV4ZWN1dGluZzogIiArIGRhdGFUeXBlU3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShkYXRhVHlwZVNxbCk7CisKKyAgICAgICAgICAgIGVsZW1lbnRzID0gbmV3IFZlY3RvcjxFbGVtZW50PigpOworCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gRGJTdHJ1Y3RGYWN0b3J5LmdldEVsZW1lbnQocnMpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldEVsZW1lbnRzOiBhZGRpbmcgZWxlbWVudDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiByZWFkaW5nIGVsZW1lbnRzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNnZXRFbGVtZW50QnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBlbGVtZW50U3FsID0gIlNFTEVDVCAqIGZyb20gZWxlbWVudHMgV0hFUkUgZWxlbWVudF9pZCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50SWQ7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldEVsZW1lbnRCeUlkOiBFeGVjdXRpbmc6ICIgKyBlbGVtZW50U3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShlbGVtZW50U3FsKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0RWxlbWVudChycyk7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0RWxlbWVudEJ5SWQ6IGFkZGluZyBlbGVtZW50OiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gcmVhZGluZyBlbGVtZW50LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2dldEVsZW1lbnRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlOYW1lKFN0cmluZyBlbGVtZW50TmFtZSkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRTcWwgPSAiU0VMRUNUICogZnJvbSBlbGVtZW50cyBXSEVSRSBlbGVtZW50X25hbWUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgZWxlbWVudE5hbWU7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldEVsZW1lbnRCeU5hbWU6IEV4ZWN1dGluZzogIiArIGVsZW1lbnRTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGVsZW1lbnRTcWwpOworCisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IERiU3RydWN0RmFjdG9yeS5nZXRFbGVtZW50KHJzKTsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRFbGVtZW50QnlOYW1lOiBhZGRpbmcgZWxlbWVudDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIHJlYWRpbmcgZWxlbWVudC4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9EYXRhU291cmNlVmFsaWRhdGlvbkxheWVyRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vRGF0YVNvdXJjZVZhbGlkYXRpb25MYXllckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk1NDdmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vRGF0YVNvdXJjZVZhbGlkYXRpb25MYXllckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcge0BsaW5rIERhdGFTb3VyY2VWYWxpZGF0aW9uTGF5ZXJ9cy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVZhbGlkYXRpb25MYXllckZhY3RvcnkgaW1wbGVtZW50cyBWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5IHsKKyAgICAvKiBvdXIgZGF0YSBzb3VyY2UgKi8KKyAgICBwcml2YXRlIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7CisKKyAgICAvKiBzaG91bGQgd2UgcXVvdGUgZmllbGRzIG9yIG5vdD8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcXVvdGVGaWVsZHMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIERhdGFTb3VyY2VWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqZGJjVXJsID0gbnVsbCwgdXNlciA9IG51bGwsIHBhc3MgPSBudWxsLCBkcml2ZXIgPSBudWxsOworCisgICAgICAgIGpkYmNVcmwgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy51cmwiKTsKKyAgICAgICAgdXNlciA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLnVzZXIiKTsKKyAgICAgICAgcGFzcyA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLnBhc3MiKTsKKyAgICAgICAgZHJpdmVyID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMuZHJpdmVyIik7CisKKyAgICAgICAgZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsCisgICAgICAgICAgICAgICAgZHJpdmVyLCBqZGJjVXJsKTsKKyAgICAgICAgcXVvdGVGaWVsZHMgPSBCb29sZWFuCisgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UucXVvdGVGaWVsZHMiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllckZhY3RvcnkjY3JlYXRlVmFsaWRhdGlvbkxheWVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbkxheWVyIGNyZWF0ZVZhbGlkYXRpb25MYXllcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlVmFsaWRhdGlvbkxheWVyKGRhdGFTb3VyY2UsIHF1b3RlRmllbGRzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92YWxpZGF0aW9uL1NjaWVuY2VEYXRhVmFsaWRhdGlvbkxheWVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9TY2llbmNlRGF0YVZhbGlkYXRpb25MYXllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjAwM2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9TY2llbmNlRGF0YVZhbGlkYXRpb25MYXllci5qYXZhCkBAIC0wLDAgKzEsNDgwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuU2NpZW5jZURhdGFDYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLkRiU3RydWN0RmFjdG9yeTsKKworLyoqCisgKiAKKyAqIERldGVybWluZXMgdGhlIG1hcHBpbmcgb2Yge0BFbGVtZW50fXMgdG8ge0BsaW5rIFByb2R1Y3RUeXBlfXMgYnkKKyAqIHJlYWRpbmcgdGhlIHtAbGluayBTY2llbmNlRGF0YUNhdGFsb2d9IGNhdGFsb2cgc2NoZW1hIHRhYmxlcyBjb25jZXJuaW5nIHBhcmFtZXRlcnMgYW5kIGRhdGFzZXRzLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNjaWVuY2VEYXRhVmFsaWRhdGlvbkxheWVyIGltcGxlbWVudHMgVmFsaWRhdGlvbkxheWVyIHsKKworICBwcml2YXRlIERhdGFTb3VyY2UgZHM7CisKKyAgcHVibGljIFNjaWVuY2VEYXRhVmFsaWRhdGlvbkxheWVyKERhdGFTb3VyY2UgZHMpIHsKKyAgICB0aGlzLmRzID0gZHM7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNhZGRFbGVtZW50KGdvdgorICAgKiAubmFzYS5qcGwub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJJTlNFUlQgSU5UTyBwYXJhbWV0ZXIgKGRhdGFzZXRfaWQsIGxvbmdOYW1lLCBzaG9ydE5hbWUsIGRlc2NyaXB0aW9uKSAiCisgICAgICAgICsgIlZBTFVFUyAoLTEsICciCisgICAgICAgICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpCisgICAgICAgICsgIicsJyIKKyAgICAgICAgKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkgKyAiJywgJyIgKyBlbGVtZW50LmdldERlc2NyaXB0aW9uKCkgKyAiJykiOworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRzLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOworICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciMKKyAgICogYWRkRWxlbWVudFRvUHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUsCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50VG9Qcm9kdWN0VHlwZShQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSwgRWxlbWVudCBlbGVtZW50KQorICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJJTlNFUlQgSU5UTyBkcE1hcCAoZGF0YXNldF9pZCwgcGFyYW1ldGVyX2lkKSBWQUxVRVMgKCIKKyAgICAgICAgKyBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiLCAiICsgZWxlbWVudC5nZXRFbGVtZW50SWQoKSArICIpIjsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNnZXRFbGVtZW50QnlJZAorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpCisgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBwYXJhbWV0ZXJfaWQsIHNob3J0TmFtZSwgZGVzY3JpcHRpb24gZnJvbSBwYXJhbWV0ZXIgV0hFUkUgcGFyYW1ldGVyX2lkID0gIgorICAgICAgICArIGVsZW1lbnRJZDsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZHMuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBlbGVtZW50ID0gRGJTdHJ1Y3RGYWN0b3J5LnRvU2NpZW5jZURhdGFFbGVtZW50KHJzKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXIjZ2V0RWxlbWVudEJ5TmFtZQorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeU5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKQorICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgcGFyYW1ldGVyX2lkLCBzaG9ydE5hbWUsIGRlc2NyaXB0aW9uIGZyb20gcGFyYW1ldGVyIFdIRVJFIHNob3J0TmFtZSA9ICciCisgICAgICAgICsgZWxlbWVudE5hbWUgKyAiJyI7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRzLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgZWxlbWVudCA9IERiU3RydWN0RmFjdG9yeS50b1NjaWVuY2VEYXRhRWxlbWVudChycyk7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2dldEVsZW1lbnRzKCkKKyAgICovCisgIHB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldEVsZW1lbnRzKCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgcGFyYW1ldGVyX2lkLCBzaG9ydE5hbWUsIGRlc2NyaXB0aW9uIGZyb20gcGFyYW1ldGVyIE9SREVSIGJ5IHBhcmFtZXRlcl9pZCBERVNDIjsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IG5ldyBWZWN0b3I8RWxlbWVudD4oKTsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZHMuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBlbGVtZW50cy5hZGQoRGJTdHJ1Y3RGYWN0b3J5LnRvU2NpZW5jZURhdGFFbGVtZW50KHJzKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbWVudHM7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNnZXRFbGVtZW50cyhnb3YKKyAgICogLm5hc2EuanBsLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICovCisgIHB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldEVsZW1lbnRzKFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKSB7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgcGFyYW1ldGVyX2lkLCBzaG9ydE5hbWUsIGRlc2NyaXB0aW9uIGZyb20gcGFyYW1ldGVyIFdIRVJFIGRhdGFzZXRfaWQgPSAiCisgICAgICAgICsgcHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIiBPUkRFUiBieSBwYXJhbWV0ZXJfaWQgREVTQyI7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRzLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgZWxlbWVudHMuYWRkKERiU3RydWN0RmFjdG9yeS50b1NjaWVuY2VEYXRhRWxlbWVudChycykpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXIjbW9kaWZ5RWxlbWVudCgKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudCkKKyAgICovCisgIHB1YmxpYyB2b2lkIG1vZGlmeUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3FsID0gIlVQREFURSBwYXJhbWV0ZXIgU0VUIGxvbmdOYW1lPSciICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpCisgICAgICAgICsgIicsIHNob3J0TmFtZT0nIiArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSArICInLGRlc2NyaXB0aW9uPSciCisgICAgICAgICsgZWxlbWVudC5nZXREZXNjcmlwdGlvbigpICsgIicgV0hFUkUgcGFyYW1ldGVyX2lkID0gIgorICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudElkKCk7CisKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI3JlbW92ZUVsZW1lbnQoCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAqLworICBwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJERUxFVEUgRlJPTSBwYXJhbWV0ZXIgV0hFUkUgcGFyYW1ldGVyX2lkID0gIgorICAgICAgICArIGVsZW1lbnQuZ2V0RWxlbWVudElkKCk7CisKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWVvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXIjCisgICAqIHJlbW92ZUVsZW1lbnRGcm9tUHJvZHVjdFR5cGUKKyAgICogKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlLAorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50KQorICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudEZyb21Qcm9kdWN0VHlwZShQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSwKKyAgICAgIEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbCA9ICJERUxFVEUgRlJPTSBkcE1hcCBXSEVSRSBwYXJhbWV0ZXJfaWQgPSAiCisgICAgICAgICsgZWxlbWVudC5nZXRFbGVtZW50SWQoKSArICIgYW5kIGRhdGFzZXRfaWQgPSAiCisgICAgICAgICsgcHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpOworCisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZHMuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHN0YXRlbWVudC5leGVjdXRlKHNxbCk7CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorCisgICAgfQorCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vU2NpZW5jZURhdGFWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9TY2llbmNlRGF0YVZhbGlkYXRpb25MYXllckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGYzNDNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vU2NpZW5jZURhdGFWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvKioKKyAqIAorICogQ29uc3RydWN0cyBuZXcge0BsaW5rIFNjaWVuY2VEYXRhVmFsaWRhdGlvbkxheWVyfXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgU2NpZW5jZURhdGFWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5IGltcGxlbWVudHMKKyAgICBWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5IHsKKworICBwcml2YXRlIERhdGFTb3VyY2UgZGF0YVNvdXJjZTsKKworICBwdWJsaWMgU2NpZW5jZURhdGFWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5KCkgeworICAgIFN0cmluZyBqZGJjVXJsID0gbnVsbCwgdXNlciA9IG51bGwsIHBhc3MgPSBudWxsLCBkcml2ZXIgPSBudWxsOworCisgICAgamRiY1VybCA9IFBhdGhVdGlscworICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uc2NpZW5jZS5qZGJjLnVybCIpKTsKKyAgICB1c2VyID0gUGF0aFV0aWxzCisgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5zY2llbmNlLmpkYmMudXNlciIpKTsKKyAgICBwYXNzID0gUGF0aFV0aWxzCisgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5zY2llbmNlLmpkYmMucGFzcyIpKTsKKyAgICBkcml2ZXIgPSBQYXRoVXRpbHMKKyAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoU3lzdGVtCisgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLnNjaWVuY2UuamRiYy5kcml2ZXIiKSk7CisKKyAgICB0aGlzLmRhdGFTb3VyY2UgPSBEYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyLmJ1aWxkRGF0YVNvdXJjZSh1c2VyLCBwYXNzLAorICAgICAgICBkcml2ZXIsIGpkYmNVcmwpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllckZhY3RvcnkjCisgICAqIGNyZWF0ZVZhbGlkYXRpb25MYXllcigpCisgICAqLworICBwdWJsaWMgVmFsaWRhdGlvbkxheWVyIGNyZWF0ZVZhbGlkYXRpb25MYXllcigpIHsKKyAgICByZXR1cm4gbmV3IFNjaWVuY2VEYXRhVmFsaWRhdGlvbkxheWVyKHRoaXMuZGF0YVNvdXJjZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkxheWVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9WYWxpZGF0aW9uTGF5ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTAxYmMyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkxheWVyLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgVmFsaWRhdGlvbiBMYXllciBmb3IgdGhlIEZpbGUgTWFuYWdlciwgYWxsb3dpbmcge0BsaW5rIEVsZW1lbnR9cyB0byBiZQorICogbWFwcGVkIHRvIHtAbGluayBQcm9kdWN0VHlwZX1zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkxheWVyIHsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEFkZHMgdGhlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRvIHRoZSBWYWxpZGF0aW9uTGF5ZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50CisgICAgICogICAgICAgICAgICBUaGUgZWxlbWVudCB0byBhZGQuCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogTW9kaWZpZXMgYW4gZXhpc3Rpbmcge0BsaW5rIEVsZW1lbnR9IGluIHRoZSBWYWxpZGF0aW9uTGF5ZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50CisgICAgICogICAgICAgICAgICBUaGUgbmV3IHtAbGluayBFbGVtZW50fSBkYXRhIHRvIHVwZGF0ZS4KKyAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBSZW1vdmVzIGEgbWV0YWRhdGEge0BsaW5rIEVsZW1lbnR9IGZyb20gdGhlIFZhbGlkYXRpb25MYXllci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudAorICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgdG8gcmVtb3ZlLgorICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCA8Y29kZT5lbGVtZW50PC9jb2RlPiB0byB0aGUge0BsaW5rIFByb2R1Y3RUeXBlfQorICAgICAqIHNwZWNpZmllZCBieSBpdHMgPGNvZGU+cHJvZHVjdFR5cGVJZDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgUHJvZHVjdFR5cGV9IHRvIGFzc29jaWF0ZSB0aGUgbWV0YWRhdGEgRWxlbWVudAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gZWxlbWVudAorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBFbGVtZW50fSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgUHJvZHVjdFR5cGUuCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnRUb1Byb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHR5cGUsIEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBSZW1vdmVzIGEgbWV0YWRhdGEge0BsaW5rIEVsZW1lbnR9IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIDxjb2RlPnByb2R1Y3RUeXBlSWQ8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBQcm9kdWN0VHlwZX0gdG8gcmVtb3ZlIHRoZSBhc3NvY2lhdGlvbiBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCA8Y29kZT5lbGVtZW50PC9jb2RlPiB3aXRoLgorICAgICAqIEBwYXJhbSBlbGVtZW50CisgICAgICogICAgICAgICAgICBUaGUgZWxlbWVudCB3aG9zZSBhc3NvY2lhdGlvbiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBQcm9kdWN0VHlwZS4KKyAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudEZyb21Qcm9kdWN0VHlwZShQcm9kdWN0VHlwZSB0eXBlLCBFbGVtZW50IGVsZW1lbnQpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogUmV0dXJucyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgRWxlbWVudH1zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgICAgICogUHJvZHVjdFR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0IHR5cGUgdG8gcmV0cmlldmUgdGhlIG1ldGFkYXRhIHtAbGluayBFbGVtZW50fXMKKyAgICAgKiAgICAgICAgICAgIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBFbGVtZW50fXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIFByb2R1Y3RUeXBlLgorICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50cyhQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2YgYWxsIHRoZSBtZXRhZGF0YSB7QGxpbmsgRWxlbWVudH1zIGluIHRoZQorICAgICAqICAgICAgICAgVmFsaWRhdGlvbkxheWVyLgorICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50cygpIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGVsZW1lbnQgYnkgaXRzIFN0cmluZyBpZGVudGlmaWVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgaWRlbnRpZmllciBvZiB0aGUge0BsaW5rIEVsZW1lbnR9IHRvIGdldC4KKyAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBFbGVtZW50fSBieSBpdHMgU3RyaW5nIGlkZW50aWZpZXIuCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogR2V0cyBhbiBlbGVtZW50IGJ5IGl0cyBTdHJpbmcgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgbmFtZSBvZiB0aGUge0BsaW5rIEVsZW1lbnR9IHRvIGdldC4KKyAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBFbGVtZW50fSBieSBpdHMgU3RyaW5nIG5hbWUuCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeU5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkxheWVyRmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkxheWVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjg5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9WYWxpZGF0aW9uTGF5ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb247CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFZhbGlkYXRpb25MYXllcn1zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkxheWVyRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgVmFsaWRhdGlvbkxheWVyIGNyZWF0ZVZhbGlkYXRpb25MYXllcigpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkxheWVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uTGF5ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU0MjdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkxheWVyLmphdmEKQEAgLTAsMCArMSw1MDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuWG1sU3RydWN0RmFjdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIFhNTCBWYWxpZGF0aW9uTGF5ZXIgYmFzZWQgb24gdHdvIHhtbCBmaWxlcywgPGNvZGU+ZWxlbWVudHMueG1sPC9jb2RlPiwKKyAqIGFuZCA8Y29kZT5wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sPC9jb2RlPi4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbkxheWVyIGltcGxlbWVudHMgVmFsaWRhdGlvbkxheWVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoWE1MVmFsaWRhdGlvbkxheWVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIHByb2R1Y3QgdHlwZSBJRCB0byBlbGVtZW50IG1hcCAqLworICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIExpc3Q8RWxlbWVudD4+IHByb2R1Y3RUeXBlRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxFbGVtZW50Pj4oKTsKKworICAgIC8qIHN1Yi10eXBlIHRvIHN1cGVyLXR5cGUgbWFwICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzdWJUb1N1cGVyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAvKiBlbGVtZW50IG1hcCAqLworICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnQ+IGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnQ+KCk7CisKKyAgICAvKgorICAgICAqIFVSSXMgcG9pbnRpbmcgdG8gZGlyZWN0b3JpZXMgd2l0aCBwcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sIGFuZAorICAgICAqIGVsZW1lbnRzLnhtbCBmaWxlcworICAgICAqLworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHhtbEZpbGVEaXJVcmlzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBYTUxWYWxpZGF0aW9uTGF5ZXIoTGlzdDxTdHJpbmc+IHVyaXMpIHsKKyAgICAgICAgdGhpcy54bWxGaWxlRGlyVXJpcyA9IHVyaXM7CisgICAgICAgIGxvYWRFbGVtZW50cyh4bWxGaWxlRGlyVXJpcyk7CisgICAgICAgIGxvYWRQcm9kdWN0VHlwZU1hcCh4bWxGaWxlRGlyVXJpcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXIjYWRkRWxlbWVudChvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAgICAgZWxlbWVudE1hcC5wdXQoZWxlbWVudC5nZXRFbGVtZW50SWQoKSwgZWxlbWVudCk7CisgICAgICAgIHNhdmVFbGVtZW50c0FuZE1hcHBpbmdzKCk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNtb2RpZnlFbGVtZW50KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBmb3IoRWxlbWVudCBlbGVtOiBlbGVtZW50TWFwLnZhbHVlcygpKXsKKyAgICAgICAgICAgaWYoZWxlbS5nZXRFbGVtZW50SWQoKS5lcXVhbHMoZWxlbWVudC5nZXRFbGVtZW50SWQoKSkpeworICAgICAgICAgICAgIGVsZW0uc2V0RWxlbWVudE5hbWUoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgICAgICAgICBlbGVtLnNldERlc2NyaXB0aW9uKGVsZW0uZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICAgZWxlbS5zZXREQ0VsZW1lbnQoZWxlbWVudC5nZXREQ0VsZW1lbnQoKSk7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYXZlRWxlbWVudHNBbmRNYXBwaW5ncygpOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXIjcmVtb3ZlRWxlbWVudChvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAgICAgZWxlbWVudE1hcC5yZW1vdmUoZWxlbWVudC5nZXRFbGVtZW50SWQoKSk7CisgICAgICAgIHNhdmVFbGVtZW50c0FuZE1hcHBpbmdzKCk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllciNhZGRFbGVtZW50VG9Qcm9kdWN0VHlwZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRWxlbWVudFRvUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgRWxlbWVudCBlbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBwcm9kdWN0VHlwZUVsZW1lbnRNYXAuZ2V0KHR5cGUKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKworICAgICAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW1lbnRNYXAucHV0KHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLCBlbGVtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQpOworICAgICAgICBzYXZlRWxlbWVudHNBbmRNYXBwaW5ncygpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI3JlbW92ZUVsZW1lbnRGcm9tUHJvZHVjdFR5cGUob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGUsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FbGVtZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRGcm9tUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgRWxlbWVudCBlbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBwcm9kdWN0VHlwZUVsZW1lbnRNYXAuZ2V0KHR5cGUKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPEVsZW1lbnQ+IGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudE9iaiA9IGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGVsZW1lbnRPYmouZ2V0RWxlbWVudElkKCkuZXF1YWxzKGVsZW1lbnQuZ2V0RWxlbWVudElkKCkpKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMucmVtb3ZlKGVsZW1lbnRPYmopOworICAgICAgICAgICAgICAgIHNhdmVFbGVtZW50c0FuZE1hcHBpbmdzKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2dldEVsZW1lbnRzKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldEVsZW1lbnRzKFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudHModHlwZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2dldEVsZW1lbnRzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50cygpIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChlbGVtZW50TWFwLnZhbHVlcygpLnRvQXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnRbZWxlbWVudE1hcC5zaXplKCldKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXIjZ2V0RWxlbWVudEJ5SWQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBlbGVtZW50TWFwLmdldChlbGVtZW50SWQpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyI2dldEVsZW1lbnRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlOYW1lKFN0cmluZyBlbGVtZW50TmFtZSkKKyAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24geworICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGVsZW1lbnRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgZWxlbWVudElkID0gaS5uZXh0KCk7CisgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudElkKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVjbGFyZWQgZWxlbWVudHMgZm9yIGEge0BsaW5rIFByb2R1Y3RUeXBlfQorICAgICAqIEBwYXJhbSB0eXBlIFRoZSB7QGxpbmsgUHJvZHVjdFR5cGV9IHRvIGdldCB0aGUgZWxlbWVudHMgZm9yCisgICAgICogQHBhcmFtIGRpcmVjdCBJZiBmYWxzZSwgcmV0dXJuIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgcHJvZHVjdCB0eXBlcyBhcyB3ZWxsCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgYWxsIHtAbGluayBFbGVtZW50fSBvZiB0aGUgUHJvZHVjdCB0eXBlCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24KKyAgICAgKiAJCQkJSWYgYW55IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldEVsZW1lbnRzKFByb2R1Y3RUeXBlIHR5cGUsIGJvb2xlYW4gZGlyZWN0KQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8RWxlbWVudD4gZWxlbXMgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7CisgICAgICAgIFN0cmluZyBjdXJyVHlwZSA9IHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpOworICAgICAgICBpZiAocHJvZHVjdFR5cGVFbGVtZW50TWFwLmNvbnRhaW5zS2V5KGN1cnJUeXBlKSkgeworICAgICAgICAgICAgZWxlbXMuYWRkQWxsKHByb2R1Y3RUeXBlRWxlbWVudE1hcC5nZXQoY3VyclR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCFkaXJlY3QpIHsKKwkgICAgICAgIHdoaWxlIChzdWJUb1N1cGVyTWFwLmNvbnRhaW5zS2V5KGN1cnJUeXBlKSkgeworCSAgICAgICAgICAgIGN1cnJUeXBlID0gc3ViVG9TdXBlck1hcC5nZXQoY3VyclR5cGUpOworCSAgICAgICAgICAgIGlmIChwcm9kdWN0VHlwZUVsZW1lbnRNYXAuY29udGFpbnNLZXkoY3VyclR5cGUpKSB7CisJICAgICAgICAgICAgICAgIGVsZW1zLmFkZEFsbChwcm9kdWN0VHlwZUVsZW1lbnRNYXAuZ2V0KGN1cnJUeXBlKSk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVsZW1zOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIGJldHdlZW4gcHJvZHVjdCB0eXBlcworICAgICAqIAorICAgICAqIEByZXR1cm4gSGFzaE1hcCBvZiB7QGxpbmsgUHJvZHVjdFR5cGV9IGlkcyBtYXBwZWQgdG8gdGhlaXIgcGFyZW50IGlkCisgICAgICovCisgICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN1YlRvU3VwZXJNYXAoKSB7CisgICAgCXJldHVybiBzdWJUb1N1cGVyTWFwOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcGFyZW50SWQgZm9yIGFuIGV4aXN0aW5nIHtAbGluayBQcm9kdWN0VHlwZX0KKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUge0BsaW5rIFByb2R1Y3RUeXBlfSB0byBhZGQgYSBwYXJlbnQgZm9yCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IHtAbGluayBQcm9kdWN0VHlwZX0KKyAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbgorICAgICAqIAkJCQlJZiBhbnkgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyZW50Rm9yUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSwgU3RyaW5nIHBhcmVudElkKQorICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiB7CisgICAgICAgIHN1YlRvU3VwZXJNYXAucHV0KHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLCBwYXJlbnRJZCk7CisgICAgICAgIHNhdmVFbGVtZW50c0FuZE1hcHBpbmdzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcGFyZW50IGZvciBhIHtAbGluayBQcm9kdWN0VHlwZX0KKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUge0BsaW5rIFByb2R1Y3RUeXBlfSB0byByZW1vdmUgdGhlIHBhcmVudCBmcm9tCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24KKyAgICAgKiAJCQkJSWYgYW55IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmVudEZvclByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3ViVG9TdXBlck1hcC5yZW1vdmUodHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkpOworICAgICAgICBzYXZlRWxlbWVudHNBbmRNYXBwaW5ncygpOworICAgIH0KKyAgICAKKworICAgIHByaXZhdGUgdm9pZCBzYXZlRWxlbWVudHNBbmRNYXBwaW5ncygpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSB4bWxGaWxlRGlyVXJpcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXJVcmkgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIEZpbGUgZWxlbWVudERpciA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZWxlbWVudERpciA9IG5ldyBGaWxlKG5ldyBVUkkoZGlyVXJpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnREaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IGRpcmVjdG9yeTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpclVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBkaXJlY3Rvcnk6IHNraXBwaW5nIGVsZW1lbnQgYW5kIHByb2R1Y3QgdHlwZSBtYXAgc2F2aW5nIHRvIGl0LiIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudERpclN0ciA9IGVsZW1lbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50RGlyU3RyLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudERpclN0ciArPSAiLyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRYbWxGaWxlID0gZWxlbWVudERpclN0ciArICJlbGVtZW50cy54bWwiOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTWFwWG1sRmlsZSA9IGVsZW1lbnREaXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInByb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwiOworCisgICAgICAgICAgICAgICAgWG1sU3RydWN0RmFjdG9yeS53cml0ZUVsZW1lbnRYbWxEb2N1bWVudChBcnJheXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc0xpc3QoZWxlbWVudE1hcC52YWx1ZXMoKS50b0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudFtlbGVtZW50TWFwLnNpemUoKV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRYbWxGaWxlKTsKKworICAgICAgICAgICAgICAgIFhtbFN0cnVjdEZhY3Rvcnkud3JpdGVQcm9kdWN0VHlwZU1hcFhtTERvY3VtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtZW50TWFwLCBzdWJUb1N1cGVyTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVNYXBYbWxGaWxlKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUklTeW50YXhFeGNlcHRpb24gd2hlbiBzYXZpbmcgZWxlbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlyZWN0b3J5IFVSSTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBTa2lwcGluZyBFbGVtZW50IGFuZCBQcm9kdWN0IFR5cGUgbWFwIHNhdmluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3IgaXQ6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRFbGVtZW50cyhMaXN0PFN0cmluZz4gZGlyVXJpcykgeworICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGRpclVyaXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBGaWxlIGVsZW1lbnREaXIgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGRpclVyaSA9IGkubmV4dCgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVsZW1lbnREaXIgPSBuZXcgRmlsZShuZXcgVVJJKGRpclVyaSkpOworCisgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRWxlbWVudCBkaXJlY3Rvcnk6ICIgKyBkaXJVcmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIGRpcmVjdG9yeTogc2tpcHBpbmcgZWxlbWVudCBsb2FkaW5nIGZyb20gaXQuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50RGlyU3RyID0gZWxlbWVudERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnREaXJTdHIuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGlyU3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudFhtbEZpbGUgPSBlbGVtZW50RGlyU3RyICsgImVsZW1lbnRzLnhtbCI7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZWxlbWVudERvYyA9IGdldERvY3VtZW50Um9vdChlbGVtZW50WG1sRmlsZSk7CisKKyAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnRSb290RWxlbSA9IGVsZW1lbnREb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIE5vZGVMaXN0IGVsZW1lbnROb2RlTGlzdCA9IGVsZW1lbnRSb290RWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbGVtZW50Iik7CisKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5vZGVMaXN0ICE9IG51bGwgJiYgZWxlbWVudE5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnROb2RlTGlzdC5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGVsZW1lbnROb2RlID0gZWxlbWVudE5vZGVMaXN0Lml0ZW0oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBYbWxTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50KGVsZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRNYXAucHV0KGVsZW1lbnQuZ2V0RWxlbWVudElkKCksIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUklTeW50YXhFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXJlY3RvcnkgVVJJOiAiICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogU2tpcHBpbmcgZWxlbWVudCBsb2FkaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3IgaXQ6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZFByb2R1Y3RUeXBlTWFwKExpc3Q8U3RyaW5nPiBkaXJVcmlzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gZGlyVXJpcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZpbGUgZWxlbWVudERpciA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgZGlyVXJpID0gaS5uZXh0KCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZWxlbWVudERpciA9IG5ldyBGaWxlKG5ldyBVUkkoZGlyVXJpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnREaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IGRpcmVjdG9yeTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpclVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBkaXJlY3Rvcnk6IHNraXBwaW5nIHByb2R1Y3QgdHlwZSBlbGVtZW50IG1hcCBsb2FkaW5nIGZyb20gaXQuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50RGlyU3RyID0gZWxlbWVudERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnREaXJTdHIuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGlyU3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVNYXBYbWxGaWxlID0gZWxlbWVudERpclN0cgorICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCI7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgcHJvZHVjdFR5cGVNYXBEb2MgPSBnZXREb2N1bWVudFJvb3QocHJvZHVjdFR5cGVNYXBYbWxGaWxlKTsKKworICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgbWFwUm9vdEVsZW0gPSBwcm9kdWN0VHlwZU1hcERvYworICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpOworCisgICAgICAgICAgICAgICAgTm9kZUxpc3QgdHlwZU5vZGVMaXN0ID0gbWFwUm9vdEVsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHlwZSIpOworCisgICAgICAgICAgICAgICAgaWYgKHR5cGVOb2RlTGlzdCAhPSBudWxsICYmIHR5cGVOb2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCB0eXBlRWxlbWVudCA9IChvcmcudzNjLmRvbS5FbGVtZW50KSB0eXBlTm9kZUxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZW0oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gdHlwZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW5oZXJpdGFuY2UgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVQYXJlbnQgPSB0eXBlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhcmVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlRvU3VwZXJNYXAucHV0KHR5cGVJZCwgdHlwZVBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpdHMgZWxlbWVudCBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBlbGVtZW50SWROb2RlTGlzdCA9IHR5cGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZWxlbWVudCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgMCBzaXplZCBlbGVtZW50IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gcHJvZHVjdFR5cGVFbGVtZW50TGlzdCA9IG5ldyBWZWN0b3I8RWxlbWVudD4oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRJZE5vZGVMaXN0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudElkTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtZW50TGlzdCA9IG5ldyBWZWN0b3I8RWxlbWVudD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWROb2RlTGlzdC5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBlbGVtZW50SWROb2RlTGlzdC5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudElkRWxlbWVudCA9IChvcmcudzNjLmRvbS5FbGVtZW50KSBlbGVtZW50SWROb2RlTGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtKGspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudElkID0gZWxlbWVudElkRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoImlkIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnRJZCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtZW50TGlzdC5hZGQoZWxlbWVudE1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGVsZW1lbnRJZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW1lbnRNYXAucHV0KHR5cGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtZW50TGlzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVSSVN5bnRheEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgZWxlbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeSBVUkk6ICIgKyBkaXJVcmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBTa2lwcGluZyBwcm9kdWN0IHR5cGUgbWFwIGxvYWRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvciBpdDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0RG9jdW1lbnRSb290KFN0cmluZyB4bWxGaWxlKSB7CisgICAgICAgIC8vIG9wZW4gdXAgdGhlIFhNTCBmaWxlCisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisgICAgICAgIERvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBudWxsOworICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7CisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKKworICAgICAgICBJbnB1dFN0cmVhbSB4bWxJbnB1dFN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHhtbElucHV0U3RyZWFtID0gbmV3IEZpbGUoeG1sRmlsZSkudG9VUkwoKS5vcGVuU3RyZWFtKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIHdoZW4gZ2V0dGluZyBpbnB1dCBzdHJlYW0gZnJvbSBbIiArIHhtbEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiByZXR1cm5pbmcgbnVsbCBkb2N1bWVudCByb290Iik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHhtbElucHV0U3RyZWFtKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBkb2N1bWVudCA9IHBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cud2FybmluZygiVW5hYmxlIHRvIHBhcnNlIHhtbCBmaWxlIFsiICsgeG1sRmlsZSArICJdLiIKKyAgICAgICAgICAgICAgICAgICAgKyAiUmVhc29uIGlzIFsiICsgZSArICJdIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb2N1bWVudDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25MYXllckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25MYXllckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzA2ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkxheWVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbjsKKworLy9KRGsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLkRpcmVjdG9yeVNlbGVjdG9yOworCisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBYTUxWYWxpZGF0aW9uTGF5ZXIgb2JqZWN0cy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbkxheWVyRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRpb25MYXllckZhY3RvcnkgeworCisgICAgLyoKKyAgICAgKiBsaXN0IG9mIGRpciB1cmlzIHNwZWNpZnlpbmcgZmlsZSBwYXRocyB0byBlbGVtZW50cyBhbmQgcHJvZHVjdCB0eXBlIG1hcAorICAgICAqIGRpcmVjdG9yaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGlyTGlzdCA9IG51bGw7CisgICAgCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKFhNTFZhbGlkYXRpb25MYXllckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+LgorICAgICAqLworICAgIHB1YmxpYyBYTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5KCkgeworICAgICAgICBTdHJpbmcgZGlyVXJpcyA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycyIpOworICAgICAgICAKKyAgICAgICAgLy8gb25seSByZXR1cm5zIHRydWUgaWYgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycy5yZWN1cnNpdmU9dHJ1ZQorICAgICAgICBib29sZWFuIHJlY3Vyc2l2ZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKCAKKyAgICAgICAgCQlTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRpcnMucmVjdXJzaXZlIikgKTsKKworICAgICAgICBpZiAoZGlyVXJpcyAhPSBudWxsKSB7CisgICAgICAgICAgICBkaXJVcmlzID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoZGlyVXJpcyk7CisgICAgICAgICAgICBTdHJpbmdbXSBkaXJVcmlMaXN0ID0gZGlyVXJpcy5zcGxpdCgiLCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyByZWN1cnNpdmUgZGlyZWN0b3J5IGxpc3RpbmcKKyAgICAgICAgICAgIGlmIChyZWN1cnNpdmUpIHsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAkvLyBlbXB0eSBsaXN0CisgICAgICAgICAgICAJZGlyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgCQorICAgICAgICAgICAgCS8vIGxvb3Agb3ZlciBzcGVjaWZpZWQgcm9vdCBkaXJlY3RvcmllcywKKyAgICAgICAgICAgIAkvLyBhZGQgZGlyZWN0b3JpZXMgYW5kIHN1Yi1kaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gYm90aAorICAgICAgICAgICAgCS8vICJlbGVtZW50cy54bWwiIGFuZCAicHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCIKKyAgICAgICAgICAgIAlmb3IgKFN0cmluZyByb290RGlyIDogZGlyVXJpTGlzdCkgeworICAgICAgICAgICAgCQl0cnkgeworICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAJCQlEaXJlY3RvcnlTZWxlY3RvciBkaXJzZWwgPSBuZXcgRGlyZWN0b3J5U2VsZWN0b3IoCisgICAgICAgICAgICAJCQkJCUFycmF5cy5hc0xpc3QoIAorICAgICAgICAgICAgCQkJCQkJCW5ldyBTdHJpbmdbXSB7InByb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwiLCAiZWxlbWVudHMueG1sIn0gKSk7CisgICAgICAgICAgICAJCQlkaXJMaXN0LmFkZEFsbCggZGlyc2VsLnRyYXZlcnNlRGlyKG5ldyBGaWxlKG5ldyBVUkkocm9vdERpcikpKSApOworICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJVUklTeW50YXhFeGNlcHRpb24gd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yeTogIityb290RGlyKTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCX0gICAgICAgIAkKKworICAgICAgICAgICAgLy8gbm9uLXJlY3Vyc2l2ZSBkaXJlY3RvcnkgbGlzdGluZworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIAlkaXJMaXN0ID0gQXJyYXlzLmFzTGlzdChkaXJVcmlMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCJDb2xsZWN0aW5nIFhNTCB2YWxpZGF0aW9uIGZpbGVzIGZyb20gdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllczoiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBkaXIgOiBkaXJMaXN0KSB7CisgICAgICAgICAgICAJTE9HLmxvZyhMZXZlbC5GSU5FLCBwZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXJGYWN0b3J5I2NyZWF0ZVZhbGlkYXRpb25MYXllcigpCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25MYXllciBjcmVhdGVWYWxpZGF0aW9uTGF5ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgWE1MVmFsaWRhdGlvbkxheWVyKGRpckxpc3QpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvQWNxdWlzaXRpb25EYXRlVmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9BY3F1aXNpdGlvbkRhdGVWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZkZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvQWNxdWlzaXRpb25EYXRlVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8qKgorICogCisgKiBTdG9yZSBwcm9kdWN0cyB1bmRlciAvW0FjcXVpc2l0aW9uRGF0ZV0vW0ZpbGVuYW1lXS4KKyAqIAorICogQXNzdW1lcyB0aGUgZXhpc3RlbmNlIG9mOgorICogCisgKiA8cHJlPgorICogICAmbHQ7Y29kZSZndDtBY3F1aXNpdGlvbkRhdGUmbHQ7L2NvZGUmZ3Q7IC0gaWYgcHJlc2VudCwgdGFrZXMgYXMgaXMsIGFuZCBhc3N1bWVzIAorICogICBpdCBpcyBpbiB0aGUgeXlNTWRkIGZvcm1hdC4mbHQ7YnIvJmd0OworICogICAmbHQ7Y29kZSZndDtTdGFydERhdGVUaW1lJmx0Oy9jb2RlJmd0OyAtIGlmIHByZXNlbnQsIGFzc3VtZXMgaXQgaXMgaW4geXl5eS1NTS1kZFRISDptbTpzcy4wMDBaLCAKKyAqICAgb3IgSVNPODYwMSBmb3JtYXQsIHJlZm9ybWF0cyBpdCB0byB5eU1NZGQsIGFuZCB0aGVuIHVzZXMgaXQgZm9yIHRoZSB2YWx1ZQorICogICBvZiAmbHQ7Y29kZSZndDtBY3F1aXNpdGlvbkRhdGUmbHQ7L2NvZGUmZ3Q7Jmx0O2JyLyZndDsKKyAqIDwvcHJlPgorICogCisgKiBJZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBtZXQgZmllbGRzIGFyZSBwcmVzZW50LCB0aGUgVmVyc2lvbmVyIHdpbGwgZ2VuZXJhdGUgYQorICogbmV3IERhdGVUaW1lLCBhbmQgdXNlIHRoZSB2YWx1ZSBvZiBpdCAoZm9ybWF0dGVkIGFzIHl5TU1kZCkgZm9yIHRoZQorICogQWNxdWlzaXRpb25EYXRlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lciBleHRlbmRzIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIHsKKworICBwcml2YXRlIFN0cmluZyBmaWxlUGF0aFNwZWMgPSAiL1tBY3F1aXNpdGlvbkRhdGVdL1tGaWxlbmFtZV0iOworCisgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDUVVJU0lUSU9OX0RBVEUgPSAiQWNxdWlzaXRpb25EYXRlIjsKKworICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBBQ1FfREFURV9GT1JNQVQgPSAieXlNTWRkIjsKKworICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTVEFSVF9EQVRFX1RJTUUgPSAiU3RhcnREYXRlVGltZSI7CisKKyAgcHVibGljIEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lcigpIHsKKyAgICBzZXRGaWxlUGF0aFNwZWMoZmlsZVBhdGhTcGVjKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIjCisgICAqIGNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCwKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisKKyAgICAvLyBjb21wdXRlIEFjcXVpc2l0aW9uRGF0ZQorICAgIC8vIGdyYWIgQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUKKyAgICAvLyBwYXJzZSBpdCBhcyBhbiBJU084NjAxIGRhdGUKKyAgICAvLyB0aGVuIHJlZm9ybWF0IGFuZCBhZGQgdXNpbmcgQUNRX0RBVEVfRk9STUFUCisgICAgaWYgKG1ldGFkYXRhLmdldE1ldGFkYXRhKEFDUVVJU0lUSU9OX0RBVEUpID09IG51bGwpIHsKKyAgICAgIFNpbXBsZURhdGVGb3JtYXQgYWNxRGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KEFDUV9EQVRFX0ZPUk1BVCk7CisgICAgICBhY3FEYXRlRm9ybWF0dGVyLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisgICAgICBEYXRlIGNhc1Byb2RSZWNlaXZlZFRpbWUgPSBuZXcgRGF0ZSgpOworICAgICAgaWYgKG1ldGFkYXRhLmdldE1ldGFkYXRhKFNUQVJUX0RBVEVfVElNRSkgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShBQ1FVSVNJVElPTl9EQVRFLCBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgLmRvRHluYW1pY1JlcGxhY2VtZW50KCJbRk9STUFUKHl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MnWicsIgorICAgICAgICAgICAgICAgICAgKyBtZXRhZGF0YS5nZXRNZXRhZGF0YShTVEFSVF9EQVRFX1RJTUUpICsgIiwiCisgICAgICAgICAgICAgICAgICArIEFDUV9EQVRFX0ZPUk1BVCArICIpXSIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVmVyc2lvbmluZ0V4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIFN0YXJ0RGF0ZVRpbWUgOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBtZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoQUNRVUlTSVRJT05fREFURSwgYWNxRGF0ZUZvcm1hdHRlcgorICAgICAgICAgICAgLmZvcm1hdChjYXNQcm9kUmVjZWl2ZWRUaW1lKSk7CisgICAgICB9CisgICAgfQorCisgICAgc3VwZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwcm9kdWN0LCBtZXRhZGF0YSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvQmFzaWNWZXJzaW9uZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL0Jhc2ljVmVyc2lvbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxNjk1ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL0Jhc2ljVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBiYXNpYyB2ZXJzaW9uZXIgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nIHNwZWNpYWw6IGl0IGp1c3QgY3JlYXRlcyBkYXRhCisgKiBzdG9yZSByZWZzIGZyb20gcHJvZHVjdCByZWZzIHVzaW5nIHRoZSBwcm9kdWN0IG5hbWUgYW5kIHByb2R1Y3QgcmVwbyBwYXRoLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY1ZlcnNpb25lciBpbXBsZW1lbnRzIFZlcnNpb25lciB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEJhc2ljVmVyc2lvbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzaWNWZXJzaW9uZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnZlcnNpb25pbmcuVmVyc2lvbmVyI2NyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMob3JnLmFwYWNoZS5vb2R0LmNhcy5kYXRhLnN0cnVjdHMuUHJvZHVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgICAgICB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHByb2R1Y3ROYW1lID0gcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgcHJvZHVjdFJlcG9QYXRoID0gcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpOworCisgICAgICAgIGlmIChwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKSkgeworCisgICAgICAgICAgICBpZiAocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSAhPSBudWxsICYmIHByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5zaXplKCkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmVyc2lvbmluZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJIaWVyYXJjaGljYWwgcHJvZHVjdCBhbmQgcmVmZXJlbmNlcyBub3Qgc2V0ISIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IHJlZmVyZW5jZSwgaXQgdGVsbHMgdXMgd2hhdCBkaXJlY3RvcnkgdG8gbW92ZSBpdAorICAgICAgICAgICAgLy8gdG8KKyAgICAgICAgICAgIC8vIFRPRE86IGZpeCB0aGF0IGhhY2sgOi0pCisgICAgICAgICAgICBSZWZlcmVuY2UgciA9IChSZWZlcmVuY2UpIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgIFN0cmluZyBkYXRhU3RvcmVSZWYgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhdGFTdG9yZVJlZiA9IG5ldyBGaWxlKG5ldyBVUkkocHJvZHVjdFJlcG9QYXRoKSkudG9VUkwoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICAgICAgaWYoIWRhdGFTdG9yZVJlZi5lbmRzV2l0aCgiLyIpKXsKKyAgICAgICAgICAgICAgICAgIGRhdGFTdG9yZVJlZis9Ii8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkYXRhU3RvcmVSZWYrPSBVUkxFbmNvZGVyLmVuY29kZShwcm9kdWN0TmFtZSwgIlVURi04IikgKyAiLyI7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQmFzaWNWZXJzaW9uZXI6IGdlbmVyYXRlZCBEYXRhU3RvcmUgcmVmOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFTdG9yZVJlZiArICIgZnJvbSBvcmlnUmVmOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgICAgICAgICAgICByLnNldERhdGFTdG9yZVJlZmVyZW5jZShkYXRhU3RvcmVSZWYpOworICAgICAgICAgICAgICAgIFZlcnNpb25pbmdVdGlscy5jcmVhdGVCYXNpY0RhdGFTdG9yZVJlZnNIaWVyYXJjaGljYWwocHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFzaWNWZXJzaW9uZXI6IFVSSVN5bnRheEV4Y2VwdGlvbiB3aGlsZSBnZW5lcmF0aW5nIGluaXRpYWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkYXRhIHN0b3JlIHJlZiBmb3Igb3JpZ1JlZjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmVyc2lvbmluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2ljVmVyc2lvbmVyOiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hpbGUgZ2VuZXJhdGluZyBpbml0aWFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGF0YSBzdG9yZSByZWYgZm9yIG9yaWdSZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25pbmdFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFzaWNWZXJzaW9uZXI6IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gd2hpbGUgZ2VuZXJhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImluaXRpYWwgZGF0YSBzdG9yZSByZWYgZm9yIG9yaWdSZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25pbmdFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKS5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCkpIHsKKyAgICAgICAgICAgIC8vIGp1c3QgdXNlIHRoZSBWZXJzaW9uaW5nVXRpbHMKKyAgICAgICAgICAgIFZlcnNpb25pbmdVdGlscy5jcmVhdGVCYXNpY0RhdGFTdG9yZVJlZnNGbGF0KHByb2R1Y3ROYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0UmVwb1BhdGgsIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIFZlcnNpb25pbmdVdGlscy5jcmVhdGVCYXNpY0RhdGFTdG9yZVJlZnNTdHJlYW0ocHJvZHVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RSZXBvUGF0aCwgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLCIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBWZXJzaW9uaW5nRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBwcm9kdWN0IHN0cnVjdHVyZTogIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9Db25maWd1cmFibGVNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvQ29uZmlndXJhYmxlTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE2NTk2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvQ29uZmlndXJhYmxlTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vIEpESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vIE9PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WZXJzaW9uaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vIEdvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworCisvKioKKyAqIEEge0BsaW5rIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyfSB3aGljaCBpcyBjb25maWd1cmFibGUgdmlhIGphdmEgcHJvcGVydGllcy4gIFNldCB0aGUKKyAqIGZvbGxvd2luZyBqYXZhIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSBmaWxlX3NwZWMgcGVyIHByb2R1Y3QgdHlwZToKKyAqICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLmNvbmZpZ3VyYXRpb24uPHByb2R1Y3RfdHlwZV9uYW1lPgorICogT3Igc2V0IHRoZSBmb2xsb3dpbmcgamF2YSBwcm9wZXJ0eSB0byBjb25maWd1cmUgYWxsIHByb2R1Y3QgdHlwZXM6CisgKiAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5jb25maWd1cmF0aW9uLmFsbF9wcm9kdWN0X3R5cGVzCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUub3JnIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmFibGVNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lciBleHRlbmRzIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9QUk9QRVJUWSA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuY29uZmlndXJhdGlvbi4iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImFsbF9wcm9kdWN0X3R5cGVzIjsKKworICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllczsKKworICBwdWJsaWMgQ29uZmlndXJhYmxlTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIoKSB7CisgICAgdGhpcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgfQorCisgIHB1YmxpYyBDb25maWd1cmFibGVNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lcihQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgIHRocm93cyBWZXJzaW9uaW5nRXhjZXB0aW9uIHsKKyAgICBzZXRGaWxlUGF0aFNwZWMoZ2V0RmlsZVBhdGhTcGVjKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSkpOworICAgIHN1cGVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocHJvZHVjdCwgbWV0YWRhdGEpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZVBhdGhTcGVjKFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKSB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGZpbGVTcGVjID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShCQVNFX1BST1BFUlRZICsgcHJvZHVjdFR5cGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZmlsZVNwZWMpKSB7CisgICAgICBmaWxlU3BlYyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQkFTRV9QUk9QRVJUWSArIEFMTCk7CisgICAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGZpbGVTcGVjKSkgeworICAgICAgICB0aHJvdyBuZXcgVmVyc2lvbmluZ0V4Y2VwdGlvbigiTm90IGRlZmluZWQgZm9yIHByb2R1Y3QgdHlwZSAiICsgcHJvZHVjdFR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpbGVTcGVjOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9EYXRlVGltZVZlcnNpb25lci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvRGF0ZVRpbWVWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDdiZmFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvRGF0ZVRpbWVWZXJzaW9uZXIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WZXJzaW9uaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNpbXBsZSB2ZXJzaW9uaW5nIHNjaGVtZSB0aGF0IHZlcnNpb25zIHtAbGluayBQcm9kdWN0fXMgd2l0aCB0aGVpcgorICogcHJvZHVjdGlvbiBkYXRlIHRpbWUuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIERhdGVUaW1lVmVyc2lvbmVyIGltcGxlbWVudHMgVmVyc2lvbmVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRGF0ZVRpbWVWZXJzaW9uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIERhdGVUaW1lVmVyc2lvbmVyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMudmVyc2lvbmluZy5WZXJzaW9uZXIjY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhvcmcuYXBhY2hlLgorICAgICAqICAgICAgb29kdC5jYXMuZGF0YS5zdHJ1Y3RzLlByb2R1Y3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgICAgICAgdGhyb3dzIFZlcnNpb25pbmdFeGNlcHRpb24geworICAgICAgICAvLyBmaXJzdCwgd2UgbmVlZCB0byBrbm93IGlmIGl0cyBoZWlyYXJjaGljYWwsIG9yIGZsYXQKKyAgICAgICAgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGVUaW1lVmVyc2lvbmVyOiBQcm9kdWN0IFN0cnVjdHVyZSBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gdmVyc2lvbiEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5ZGRNTS5ISG1tc3MiKTsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3Rpb25EYXRlVGltZSA9IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIpOworICAgICAgICBpZiAocHJvZHVjdGlvbkRhdGVUaW1lID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgaXQgb3Vyc2VsdmVzIHRoZW4KKyAgICAgICAgICAgIHByb2R1Y3Rpb25EYXRlVGltZSA9IGRhdGVGb3JtYXR0ZXIuZm9ybWF0KG5ldyBEYXRlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRGF0ZSBwcm9kRGF0ZVRpbWUgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9kRGF0ZVRpbWUgPSBEYXRlQ29udmVydC5pc29QYXJzZShwcm9kdWN0aW9uRGF0ZVRpbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcGFyc2UgcHJvZHVjdGlvbiBkYXRlIHRpbWUgQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0aW9uRGF0ZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBnZW5lcmF0aW5nIGl0IG91cnNlbHZlcyIpOworICAgICAgICAgICAgICAgIHByb2REYXRlVGltZSA9IG5ldyBEYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0aW9uRGF0ZVRpbWUgPSBkYXRlRm9ybWF0dGVyLmZvcm1hdChwcm9kRGF0ZVRpbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpLmVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKSkgeworICAgICAgICAgICAgLy8gaWYgaXRzIGZsYXQsIGp1c3QgcmV0dXJuIHJlZmVyZW5jZXMgdGhhdCBpbmNsdWRlCisgICAgICAgICAgICAvLyBwcm9kdWN0VHlwZVJlcG8vcHJvZHVjdE5hbWUvZmlsZU5hbWUucHJvZHVjdGlvbkRhdGVUaW1lCisgICAgICAgICAgICAvLyB3ZSdsbCB1c2UgdGhlIGZvcm1hdDogeXl5eS5kZC5NTS5ISC5tbS5zcworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlZmVyZW5jZT4gaSA9IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpCisgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YVN0b3JlUmVmID0gbnVsbDsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTdG9yZVJlZiA9IG5ldyBGaWxlKG5ldyBVUkkocHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpKSkudG9VUkwoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0V4dGVybmFsRm9ybSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShuZXcgVVJJKHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKSkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiIgKyBwcm9kdWN0aW9uRGF0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGVUaW1lVmVyc2lvbmVyOiBHZW5lcmF0ZWQgZGF0YVN0b3JlUmVmOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFTdG9yZVJlZiArICIgZnJvbSBvcmlnaW5hbCByZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgci5nZXRPcmlnUmVmZXJlbmNlKCkpOworICAgICAgICAgICAgICAgICAgICByLnNldERhdGFTdG9yZVJlZmVyZW5jZShkYXRhU3RvcmVSZWYpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGVUaW1lVmVyc2lvbmVyOiBFcnJvciBnZW5lcmF0aW5nIFVSSSB0byBnZXQgbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9mIG9yaWdpbmFsIHJlZiB3aGlsZSBnZW5lcmF0aW5nIGRhdGEgc3RvcmUgcmVmIGZvciBvcmlnIHJlZjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IGFuZCBrZWVwIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGVUaW1lVmVyc2lvbmVyOiBFcnJvciBnZXR0aW5nIFVSTCBmb3IgcHJvZHVjdCByZXBvc2l0b3J5IHBhdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyeSBhbmQga2VlcCBnZW5lcmF0aW5nCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkuZXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX1NUUkVBTSkpIHsKKyAgICAgICAgICAgICAgICBWZXJzaW9uaW5nVXRpbHMuY3JlYXRlQmFzaWNEYXRhU3RvcmVSZWZzU3RyZWFtKHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSwgcHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLCBwcm9kdWN0aW9uRGF0ZVRpbWUpOworICAgICAgICB9IGVsc2UgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICBQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUwpKSB7CisgICAgICAgICAgICAvLyBpZiBpdHMgaGVpcmFyY2hpY2FsLCB0aGVuIHdlJ2xsIHZlcnNpb24gdGhlIGZpbGVzIHdpdGhpbiB0aGUKKyAgICAgICAgICAgIC8vIGRpcmVjdG9yeQorICAgICAgICAgICAgLy8gZmlyc3QsIHdlIG5lZWQgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIG9yaWdpbmFsIGRpcgorICAgICAgICAgICAgUmVmZXJlbmNlIG9yaWdEaXJSZWYgPSAoUmVmZXJlbmNlKSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgwKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YVN0b3JlUmVmID0gbmV3IEZpbGUobmV3IFVSSShwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKSkpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBVUkxFbmNvZGVyLmVuY29kZShwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCksICJVVEYtOCIpCisgICAgICAgICAgICAgICAgICAgICAgICArICIvIjsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAiRGF0ZVRpbWVWZXJzaW9uZXI6IGdlbmVyYXRlZCBEYXRhU3RvcmUgcmVmOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVN0b3JlUmVmICsgIiBmcm9tIG9yaWdEaXJSZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcmlnRGlyUmVmLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICAgICAgb3JpZ0RpclJlZi5zZXREYXRhU3RvcmVSZWZlcmVuY2UoZGF0YVN0b3JlUmVmKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGVUaW1lVmVyc2lvbmVyOiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hpbGUgZ2VuZXJhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImluaXRpYWwgZGF0YSBzdG9yZSByZWYgZm9yIG9yaWdSZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcmlnRGlyUmVmLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25pbmdFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRlVGltZVZlcnNpb25lcjogRXJyb3IgY3JlYXRpbmcgRmlsZSByZWZlcmVuY2UgZnJvbSBvcmlnaW5hbCBkaXIgVVJJOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3JpZ0RpclJlZi5nZXRPcmlnUmVmZXJlbmNlKCkgKyAiOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBWZXJzaW9uaW5nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZW5lcmF0ZSByZWZlcmVuY2VzIGZyb20gb3JpZ2luYWwgZGlyIHJlZmVyZW5jZSBmb3IgcHJvZHVjdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGF0ZVRpbWVWZXJzaW9uZXI6IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gd2hpbGUgZ2VuZXJhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImluaXRpYWwgZGF0YSBzdG9yZSByZWYgZm9yIG9yaWdSZWY6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcmlnRGlyUmVmLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25pbmdFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmFzaWMgZGF0YSBzdG9yZSByZWZzCisgICAgICAgICAgICBWZXJzaW9uaW5nVXRpbHMuY3JlYXRlQmFzaWNEYXRhU3RvcmVSZWZzSGllcmFyY2hpY2FsKHByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworCisgICAgICAgICAgICAvLyBhZGQgdGhlIHByb2R1Y3Rpb24gZGF0ZSB0aW1lCisgICAgICAgICAgICBhZGRQcm9kdWN0RGF0ZVRpbWVUb1JlZmVyZW5jZXMocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLAorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uRGF0ZVRpbWUpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUHJvZHVjdERhdGVUaW1lVG9SZWZlcmVuY2VzKExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzLAorICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3Rpb25EYXRlVGltZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlZmVyZW5jZT4gaSA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgciA9IGkubmV4dCgpOworICAgICAgICAgICAgaWYgKCFyLmdldE9yaWdSZWZlcmVuY2UoKS5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgci5zZXREYXRhU3RvcmVSZWZlcmVuY2Uoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICIuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0aW9uRGF0ZVRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9EaXJlY3RvcnlQcm9kdWN0VmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9EaXJlY3RvcnlQcm9kdWN0VmVyc2lvbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhYTQ5NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL0RpcmVjdG9yeVByb2R1Y3RWZXJzaW9uZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuVmVyc2lvbmluZ1V0aWxzOworCisvKioKKyAqIEEge0BsaW5rIFZlcnNpb25lcn0gZm9yIEhpZXJhcmNoaWNhbCBkaXJlY3RvcnkgcHJvZHVjdHMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGlyZWN0b3J5UHJvZHVjdFZlcnNpb25lciBleHRlbmRzIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIHsKKworICAvKioKKyAgICogPHA+CisgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIERpcmVjdG9yeVByb2R1Y3RWZXJzaW9uZXIoKSB7CisgICAgc2V0RmxhdFByb2R1Y3RzKGZhbHNlKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIjCisgICAqIGNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMob3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCwKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKyAgICovCisgIHB1YmxpYyB2b2lkIGNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgIHRocm93cyBWZXJzaW9uaW5nRXhjZXB0aW9uIHsKKyAgICAvLyBmaXJzdCBnZW5lcmF0ZSB0aGUgZmlyc3QgY29ycmVjdCByZWZlcmVuY2UKKyAgICBzdXBlci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2R1Y3QsIG1ldGFkYXRhKTsKKworICAgIFJlZmVyZW5jZSByb290ID0gKFJlZmVyZW5jZSkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKTsKKyAgICBpZiAoIXJvb3QuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkuZW5kc1dpdGgoIi8iKSkgeworICAgICAgcm9vdC5zZXREYXRhU3RvcmVSZWZlcmVuY2Uocm9vdC5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSArICIvIik7CisgICAgfQorCisgICAgLy8gbm93IGFkZCB0aGUgaGVpcmFyY2hpY2FsIHJlZnMKKyAgICBWZXJzaW9uaW5nVXRpbHMuY3JlYXRlQmFzaWNEYXRhU3RvcmVSZWZzSGllcmFyY2hpY2FsKHByb2R1Y3QKKyAgICAgICAgLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvSW5QbGFjZVZlcnNpb25lci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvSW5QbGFjZVZlcnNpb25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmE2YzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9JblBsYWNlVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WZXJzaW9uaW5nRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQSBJbnBsYWNlIHZlcnNpb25lciB0aGF0IGluZ2VzdHMgdGhlIGZpbGUgd2l0aG91dCBtb3ZpbmcgdGhlIGFjdHVhbCBmaWxlLiBJdAorICoganVzdCBjb3BpZXMgdGhlIGZpbGUncyBvcmdpbiByZWYgdG8gaXRzIGRhdGFzdG9yIHJlZi4KKyAqIAorICogQGF1dGhvciBkYXZvb2RpCisgKiAKKyAqLworcHVibGljIGNsYXNzIEluUGxhY2VWZXJzaW9uZXIgaW1wbGVtZW50cyBWZXJzaW9uZXIgeworCisgIC8qIG91ciBsb2cgc3RyZWFtICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEluUGxhY2VWZXJzaW9uZXIuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8qKgorICAgICAqIAorICAgICAqLworICBwdWJsaWMgSW5QbGFjZVZlcnNpb25lcigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLnZlcnNpb25pbmcuVmVyc2lvbmVyI2NyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMob3JnLgorICAgKiBhcGFjaGUub29kdC5jYXMuZGF0YS5zdHJ1Y3RzLlByb2R1Y3QpCisgICAqLworICBwdWJsaWMgdm9pZCBjcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisgICAgICBmb3IgKFJlZmVyZW5jZSByIDogcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKSB7CisgICAgICAgIHIuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiaW4tcGxhY2UgaW5nZXN0aW9uIGF0IGRhdGFzdG9yZSBwYXRoOiAiCisgICAgICAgICAgICArIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICsgIi53aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgcHJvZHVjdCdzIG9yaWdpbjogIgorICAgICAgICAgICAgKyByLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9NZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU3ZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgVmVyc2lvbmVyIGNsYXNzIHRoYXQgdXNlcyB7QGxpbmsgTWV0YWRhdGF9IGZpZWxkcyBhbmQgYSBnaXZlbgorICogPGNvZGU+ZmlsZVBhdGhTcGVjPC9jb2RlPiB0byB2ZXJzaW9uIHJlZmVyZW5jZXMuIFRoZSBmaWxlUGF0aFNwZWMgc2hvdWxkIGJlCisgKiBvZiB0aGUgZm9ybTo8YnI+CisgKiA8YnI+CisgKiAKKyAqIDxjb2RlPi9bRmllbGROYW1lMV0vb3RoZXIvdGV4dC8uLi4vW0ZpZWxkTmFtZTJdLi4uPC9jb2RlPgorICogCisgKiB3aGVyZSA8Y29kZT5GaWVsZE5hbWUxPC9jb2RlPiBhbmQgPGNvZGU+RmllbGROYW1lMjwvY29kZT4gYXJlIE1ldGFkYXRhCisgKiBmaWVsZHMgcHJvdmlkZWQgYnkgdGhlIGdpdmVuIE1ldGFkYXRhIG9iamVjdC4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lciBpbXBsZW1lbnRzIFZlcnNpb25lciB7CisKKyAgICAvKiBmaWxlIHBhdGggc3BlYyBkZW5vdGVkIGJ5IG1ldGFkYXRhIGZpZWxkcyBhbmQgc3RhdGljIHBhdGggKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlUGF0aFNwZWMgPSBudWxsOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKiB3aGV0aGVyIG9yIG5vdCB3ZSBvbmx5IGhhbmRsZSBmbGF0IHByb2R1Y3RzICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZsYXRQcm9kdWN0cyA9IHRydWU7CisKKyAgICBwdWJsaWMgTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIoKSB7CisgICAgICAgIGZpbGVQYXRoU3BlYyA9ICIvW0ZpbGVuYW1lXSI7CisgICAgfQorCisgICAgcHVibGljIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyKFN0cmluZyBmaWxlUGF0aFNwZWMpIHsKKyAgICAgICAgdGhpcy5maWxlUGF0aFNwZWMgPSBmaWxlUGF0aFNwZWM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5WZXJzaW9uZXIjY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhnb3YubmFzYS4KKyAgICAgKiAgICAgIGpwbC5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgICAgICAgdGhyb3dzIFZlcnNpb25pbmdFeGNlcHRpb24geworCisgICAgICAgIC8vIHNpbmNlIHdlIG5lZWQgdGhlIG1ldGFkYXRhLCBpZiB0aGUgbWV0YWRhdGEgaXMgbnVsbCwgdGhyb3cgYW4KKyAgICAgICAgLy8gZXhjZXB0aW9uCisgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVmVyc2lvbmluZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byB2ZXJzaW9uIHByb2R1Y3Qgd2l0aCBubyBtZXRhZGF0YSEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIGFsc28gb25seSBkZWFsIHdpdGggRmxhdCBwcm9kdWN0cywgdGhhdCBpcywgUHJvZHVjdHMgd2l0aCBhIHNpbmdsZQorICAgICAgICAvLyByZWZlcmVuY2UKKyAgICAgICAgaWYgKGZsYXRQcm9kdWN0cworICAgICAgICAgICAgICAgICYmICFwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25pbmdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgRkxBVCBwcm9kdWN0IHN0cnVjdHVyZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCB0aGUgcHJvZHVjdCB0eXBlIHJlcG8gcGF0aAorICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVSZXBvUGF0aCA9IFZlcnNpb25pbmdVdGlscworICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGhGcm9tVXJpKHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpKTsKKworICAgICAgICAvLyBwYXJzZSB0aGUgZmlsZSBwYXRoIHNwZWMKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoUmVmID0gcGFyc2VGaWxlUGF0aFNwZWMoZmlsZVBhdGhTcGVjLAorICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlUmVwb1BhdGgsIG1ldGFkYXRhKTsKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoVXJpID0gbmV3IEZpbGUoZmlsZVBhdGhSZWYpLnRvVVJJKCkudG9TdHJpbmcoKTsKKworICAgICAgICBSZWZlcmVuY2UgciA9IChSZWZlcmVuY2UpIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkdlbmVyYXRlZCBkYXRhIHN0b3JlIHJlZjogWyIgKyBmaWxlUGF0aFVyaQorICAgICAgICAgICAgICAgICsgIl0gZnJvbSBvcmlnUmVmOiBbIiArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIl0iKTsKKyAgICAgICAgci5zZXREYXRhU3RvcmVSZWZlcmVuY2UoZmlsZVBhdGhVcmkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlRmlsZVBhdGhTcGVjKFN0cmluZyBmaWxlUGF0aFNwZWMsCisgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVSZXBvUGF0aCwgTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGZpbmFsRmlsZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZpbmFsRmlsZVBhdGguYXBwZW5kKHByb2R1Y3RUeXBlUmVwb1BhdGgpOworCisgICAgICAgIGlmIChmaW5hbEZpbGVQYXRoLmNoYXJBdChmaW5hbEZpbGVQYXRoLmxlbmd0aCgpIC0gMSkgPT0gJy8nKSB7CisgICAgICAgICAgICBmaW5hbEZpbGVQYXRoLmRlbGV0ZUNoYXJBdChmaW5hbEZpbGVQYXRoLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZpbGVQYXRoU3BlYy5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGZpbGVQYXRoU3BlYyA9ICIvIiArIGZpbGVQYXRoU3BlYzsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsRmlsZVBhdGguYXBwZW5kKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGZpbGVQYXRoU3BlYywKKyAgICAgICAgICAgICAgICBtZXRhZGF0YSkpOworICAgICAgICByZXR1cm4gZmluYWxGaWxlUGF0aC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGVQYXRoU3BlYworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGhTcGVjKCkgeworICAgICAgICByZXR1cm4gZmlsZVBhdGhTcGVjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBmaWxlUGF0aFNwZWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlUGF0aFNwZWMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZVBhdGhTcGVjKFN0cmluZyBmaWxlUGF0aFNwZWMpIHsKKyAgICAgICAgdGhpcy5maWxlUGF0aFNwZWMgPSBmaWxlUGF0aFNwZWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZmxhdFByb2R1Y3RzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGbGF0UHJvZHVjdHMoKSB7CisgICAgICAgIHJldHVybiBmbGF0UHJvZHVjdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGZsYXRQcm9kdWN0cworICAgICAqICAgICAgICAgICAgdGhlIGZsYXRQcm9kdWN0cyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGbGF0UHJvZHVjdHMoYm9vbGVhbiBmbGF0UHJvZHVjdHMpIHsKKyAgICAgICAgdGhpcy5mbGF0UHJvZHVjdHMgPSBmbGF0UHJvZHVjdHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvUHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Byb2R1Y3RUeXBlTWV0VmVyc2lvbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkZmM2OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Byb2R1Y3RUeXBlTWV0VmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WZXJzaW9uaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogCisgKiBBIHNpbXBsZSB2ZXJzaW9uZXIgdGhhdCBsZXRzIGEgdXNlciBkZWZpbmUgdGhlIGZpbGVQYXRoU3BlYyBuZWVkZWQgYnkgdGhlCisgKiB7QGxpbmsgTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXJ9IGluIGEgUHJvZHVjdCdzIFByb2R1Y3RUeXBlIG1ldGFkYXRhLiBVc2UKKyAqIHRoZSBrZXkgbmFtZSBmaWxlUGF0aFNwZWMsIGFuZCB0aGVuIHByb3ZpZGUgaXQgZm9yIGVhc2lseSBjb25maWd1cmFibGUgdXNlIG9mCisgKiB0aGUge0BsaW5rIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0VHlwZU1ldFZlcnNpb25lciBleHRlbmRzIE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIHsKKworICBwdWJsaWMgUHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIoKSB7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLk1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIworICAgKiBjcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3QsCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgdGhyb3dzIFZlcnNpb25pbmdFeGNlcHRpb24geworICAgIHNldEZpbGVQYXRoU3BlYyhwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0VHlwZU1ldGFkYXRhKCkKKyAgICAgICAgLmdldE1ldGFkYXRhKCJmaWxlUGF0aFNwZWMiKSk7CisgICAgc3VwZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwcm9kdWN0LCBtZXRhZGF0YSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvU2luZ2xlRmlsZUJhc2ljVmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9TaW5nbGVGaWxlQmFzaWNWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzQwZDBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvU2luZ2xlRmlsZUJhc2ljVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgVmVyc2lvbmVyfSB0aGF0IGhhbmRsZXMgc2luZ2xlIGZpbGUge0BsaW5rIFByb2R1Y3R9cyBieSBzdG9yaW5nCisgKiB0aGVtIGluIDxjb2RlPnByb2R1Y3RUeXBlUmVwb1BhdGgvRmlsZW5hbWU8L2NvZGU+LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWxlQmFzaWNWZXJzaW9uZXIgaW1wbGVtZW50cyBWZXJzaW9uZXIgeworCisgICAgLyogZmlsZW5hbWUgZmllbGRzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUVfRklFTEQgPSAiRmlsZW5hbWUiOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihTaW5nbGVGaWxlQmFzaWNWZXJzaW9uZXIuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogCisgICAgICovCisgICAgcHVibGljIFNpbmdsZUZpbGVCYXNpY1ZlcnNpb25lcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5WZXJzaW9uZXIjY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhnb3YubmFzYS4KKyAgICAgKiAgICAgIGpwbC5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdCwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgICAgICAgdGhyb3dzIFZlcnNpb25pbmdFeGNlcHRpb24geworICAgICAgICAvLyB3ZSBvbmx5IGhhbmRsZSBzaW5nbGUgZmlsZXMsIHNvIHRocm93IGV4Y2VwdGlvbiBpZiBwcm9kdWN0IGlzCisgICAgICAgIC8vIGhlaXJhcmhpY2FsCisKKyAgICAgICAgaWYgKCFwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKS5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBWZXJzaW9uaW5nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU2luZ2xlRmlsZVZlcnNpb25lcjogdW5hYmxlIHRvIHZlcnNpb24iICsgIiBQcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aXRoIGhlaXJhcmNoaWNhbC9zdHJlYW0gc3RydWN0dXJlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBuZWVkIHRoZSBGaWxlbmFtZSBNZXRhZGF0YSBwYXJhbWV0ZXIgZm9yIHRoaXMgdG8gd29yaworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBtZXRhZGF0YS5nZXRNZXRhZGF0YShGSUxFTkFNRV9GSUVMRCk7CisKKyAgICAgICAgaWYgKGZpbGVuYW1lID09IG51bGwgfHwgKGZpbGVuYW1lICE9IG51bGwgJiYgZmlsZW5hbWUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBWZXJzaW9uaW5nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU2luZ2xlRmlsZVZlcnNpb25lcjogdW5hYmxlIHRvIHZlcnNpb24gd2l0aG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRmlsZW5hbWUgbWV0YWRhdGEgZmllbGQgc3BlY2lmaWVkISIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHdlIG5lZWQgdGhlIHByb2R1Y3QgdHlwZSByZXBvIHBhdGgKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlUmVwb1BhdGhVcmkgPSBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCk7CisgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZVJlcG9QYXRoID0gVmVyc2lvbmluZ1V0aWxzCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aEZyb21VcmkocHJvZHVjdFR5cGVSZXBvUGF0aFVyaSk7CisKKyAgICAgICAgaWYgKCFwcm9kdWN0VHlwZVJlcG9QYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHByb2R1Y3RUeXBlUmVwb1BhdGggKz0gIi8iOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWwgZmlsZSBsb2NhdGlvbiBpczoKKyAgICAgICAgLy8gL3Byb2R1Y3RUeXBlUmVwb1BhdGgvRmlsZW5hbWUKKworICAgICAgICBTdHJpbmcgZGF0YVN0b3JlUGF0aCA9IHByb2R1Y3RUeXBlUmVwb1BhdGggKyBmaWxlbmFtZTsKKyAgICAgICAgU3RyaW5nIGRhdGFTdG9yZVJlZiA9IG5ldyBGaWxlKGRhdGFTdG9yZVBhdGgpLnRvVVJJKCkudG9TdHJpbmcoKTsKKworICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IHJlZmVyZW5jZSBiYWNrCisgICAgICAgIC8vIHNldCBpdHMgZGF0YSBzdG9yZSByZWYKKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkdlbmVyYXRlZCBkYXRhIHN0b3JlIHJlZjogWyIgKyBkYXRhU3RvcmVSZWYKKyAgICAgICAgICAgICAgICArICJdIGZyb20gb3JpZ1JlZjogWyIgKyByZWYuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIl0iKTsKKyAgICAgICAgcmVmLnNldERhdGFTdG9yZVJlZmVyZW5jZShkYXRhU3RvcmVSZWYpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9WZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI3NGYzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZzsNCisNCisvL09PRFQgaW1wb3J0cw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7DQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7DQorDQorLyoqDQorICogQGF1dGhvciBtYXR0bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiANCisgKiA8cD4NCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgdmVyc2lvbmluZyBzY2hlbWUgZm9yIGdlbmVyYXRpbmcgdGhlIERhdGFTdG9yZQ0KKyAqIHJlZmVyZW5jZXMgZm9yIHRoZSBpdGVtcyBpbiBhIHtAbGluayBQcm9kdWN0fS4NCisgKiA8L3A+DQorICogDQorICovDQorcHVibGljIGludGVyZmFjZSBWZXJzaW9uZXIgew0KKw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYX1BPSU5UX0lEID0gVmVyc2lvbmVyLmNsYXNzLmdldE5hbWUoKTsNCisNCisgICAgcHVibGljIHZvaWQgY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhKQ0KKyAgICAgICAgICAgIHRocm93cyBWZXJzaW9uaW5nRXhjZXB0aW9uOw0KKw0KK30NCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9WZXJzaW9uaW5nVXRpbHMuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1ZlcnNpb25pbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjFiNzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9WZXJzaW9uaW5nVXRpbHMuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgVXRpbGl0eSBjb21wb25lbnQgdG8gaGVscCBvdXQgd2l0aCB2ZXJzaW9uaW5nLgorICogPC9wPgorICogCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZlcnNpb25pbmdVdGlscyB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFZlcnNpb25pbmdVdGlscy5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICAvLyBmaWx0ZXIgdG8gb25seSBmaW5kIGRpcmVjdG9yaWVzIHdoZW4gZG9pbmcgYSBsaXN0RmlsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIERJUl9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIGZpbGUuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBmaWx0ZXIgdG8gb25seSBmaW5kIGZpbGVzIHdoZW4gZG9pbmcgYSBsaXN0RmlsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIEZJTEVfRklMVEVSID0gbmV3IEZpbGVGaWx0ZXIoKSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWxlLmlzRmlsZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxSZWZlcmVuY2U+IGdldFJlZmVyZW5jZXNGcm9tRGlyKEZpbGUgZGlyUm9vdCkgeworICAgICAgICBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG51bGw7CisKKyAgICAgICAgaWYgKGRpclJvb3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwiKTsKKyAgICAgICAgaWYgKCFkaXJSb290LmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICBkaXJSb290ID0gZGlyUm9vdC5nZXRQYXJlbnRGaWxlKCk7CisKKyAgICAgICAgcmVmZXJlbmNlcyA9IG5ldyBWZWN0b3I8UmVmZXJlbmNlPigpOworCisgICAgICAgIFN0YWNrPEZpbGU+IHN0YWNrID0gbmV3IFN0YWNrPEZpbGU+KCk7CisgICAgICAgIHN0YWNrLnB1c2goZGlyUm9vdCk7CisgICAgICAgIHdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBGaWxlIGRpciA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgLy8gYWRkIHRoZSByZWZlcmVuY2UgZm9yIHRoZSBkaXIKKyAgICAgICAgICAgIC8vIGV4Y2VwdCBpZiBpdCdzIHRoZSByb290RGlyLCB0aGVuLCBza2lwIGl0CisgICAgICAgICAgICBpZiAoIWRpci5lcXVhbHMoZGlyUm9vdCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5zZXRPcmlnUmVmZXJlbmNlKGRpci50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICAgICAgICAgICAgICByLnNldEZpbGVTaXplKGRpci5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKHIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHdoZW4gZ2VuZXJhdGluZyByZWZlcmVuY2UgZm9yIGRpcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhGSUxFX0ZJTFRFUik7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGZpbGUgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSByID0gbmV3IFJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICByLnNldE9yaWdSZWZlcmVuY2UoZmlsZXNbaV0udG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKyAgICAgICAgICAgICAgICAgICAgci5zZXRGaWxlU2l6ZShmaWxlc1tpXS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKHIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHdoZW4gZ2VuZXJhdGluZyByZWZlcmVuY2UgZm9yIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZVtdIHN1YmRpcnMgPSBkaXIubGlzdEZpbGVzKERJUl9GSUxURVIpOworICAgICAgICAgICAgaWYgKHN1YmRpcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmRpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdWJkaXJzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVmZXJlbmNlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRVUklzRnJvbURpcihGaWxlIGRpclJvb3QpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHVyaXMgPSBudWxsOworCisgICAgICAgIGlmIChkaXJSb290ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIik7CisgICAgICAgIGlmICghZGlyUm9vdC5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgZGlyUm9vdCA9IGRpclJvb3QuZ2V0UGFyZW50RmlsZSgpOworCisgICAgICAgIHVyaXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworICAgICAgICBTdGFjazxGaWxlPiBzdGFjayA9IG5ldyBTdGFjazxGaWxlPigpOworICAgICAgICBzdGFjay5wdXNoKGRpclJvb3QpOworICAgICAgICB3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgRmlsZSBkaXIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIC8vIGFkZCB0aGUgcmVmZXJlbmNlIGZvciB0aGUgZGlyCisgICAgICAgICAgICAvLyBleGNlcHQgaWYgaXQncyB0aGUgcm9vdERpciwgdGhlbiwgc2tpcCBpdAorICAgICAgICAgICAgaWYgKCFkaXIuZXF1YWxzKGRpclJvb3QpKSB7CisgICAgICAgICAgICAgICAgdXJpcy5hZGQoZGlyLnRvVVJJKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoRklMRV9GSUxURVIpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBmaWxlIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICB1cmlzLmFkZChmaWxlc1tpXS50b1VSSSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlW10gc3ViZGlycyA9IGRpci5saXN0RmlsZXMoRElSX0ZJTFRFUik7CisgICAgICAgICAgICBpZiAoc3ViZGlycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViZGlycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN1YmRpcnNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1cmlzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVCYXNpY0RhdGFTdG9yZVJlZnNIaWVyYXJjaGljYWwoTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZXMpIHsKKyAgICAgICAgLy8gZmlsZTovLy93d3cvZm9sZGVyMQorICAgICAgICAvLyBmaWxlOi8vL3d3dy9mb2xkZXIxL2ZpbGUxCisgICAgICAgIC8vIGZpbGU6Ly8vd3d3L2ZvbGRlcjEvZmlsZTIKKyAgICAgICAgLy8gZmlsZTovLy93d3cvZm9sZGVyMS9mb2xkZXIyLworICAgICAgICAvLyBmaWxlOi8vL3d3dy9mb2xkZXIxL2ZvbGRlcjIvZmlsZTMKKworICAgICAgICAvLyB0b0RpcjogZmlsZTovLy93d3cvbXlmb2xkZXIvcHJvZHVjdDEKKyAgICAgICAgLy8gb3JpZ0RpcjogZmlsZTovLy93d3cvZm9sZGVyMQorCisgICAgICAgIFN0cmluZyB0b0RpclJlZiA9IHJlZmVyZW5jZXMuZ2V0KDApCisgICAgICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpOworICAgICAgICBTdHJpbmcgb3JpZ0RpclJlZiA9IHJlZmVyZW5jZXMuZ2V0KDApLmdldE9yaWdSZWZlcmVuY2UoKTsKKyAgICAgICAgU3RyaW5nIG9yaWdEaXJSZWZOYW1lID0gbmV3IEZpbGUob3JpZ0RpclJlZikuZ2V0TmFtZSgpOworCisgICAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBpID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByID0gaS5uZXh0KCk7CisKKyAgICAgICAgICAgIC8vIGRvbid0IGJvdGhlciB3aXRoIHRoZSBmaXJzdCBvbmUsIGJlY2F1c2UgaXQncyBhbHJlYWR5IHNldAorICAgICAgICAgICAgLy8gY29ycmVjdGx5CisgICAgICAgICAgICBpZiAoci5nZXRPcmlnUmVmZXJlbmNlKCkuZXF1YWxzKG9yaWdEaXJSZWYpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHRoZSBvcmlnRGlyIG5hbWUgaW4gdGhlIHN0cmluZworICAgICAgICAgICAgLy8gdGhlbiwgdGhlIHJlZiBiZWNvbWVzOgorICAgICAgICAgICAgLy8gdG9EaXIrci5nZXRPcmlnUmVmLnN1YnN0cmluZyhmaXJzdCBvY2N1cmVuY2Ugb2YKKyAgICAgICAgICAgIC8vIG9yaWdEaXIpLnN1YnN0cmluZyhmaXJzdCBvY2N1cmVuY2Ugb2YgJy8nKzEpCisKKyAgICAgICAgICAgIFN0cmluZyBkYXRhU3RvcmVSZWYgPSB0b0RpclJlZjsKKyAgICAgICAgICAgIGludCBmaXJzdE9jY3VyZW5jZU9mT3JpZ0RpciA9IHIuZ2V0T3JpZ1JlZmVyZW5jZSgpLmluZGV4T2YoCisgICAgICAgICAgICAgICAgICAgIG9yaWdEaXJSZWZOYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyB0bXBSZWYgPSByLmdldE9yaWdSZWZlcmVuY2UoKS5zdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGZpcnN0T2NjdXJlbmNlT2ZPcmlnRGlyKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsICJ0bXBSZWY6ICIgKyB0bXBSZWYpOworICAgICAgICAgICAgaW50IGZpcnN0T2NjdXJlbmNlU2xhc2ggPSB0bXBSZWYuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgZGF0YVN0b3JlUmVmICs9IHRtcFJlZi5zdWJzdHJpbmcoZmlyc3RPY2N1cmVuY2VTbGFzaCArIDEpOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJWZXJzaW9uaW5nVXRpbHM6IEdlbmVyYXRlZCBkYXRhIHN0b3JlIHJlZjogIgorICAgICAgICAgICAgICAgICAgICArIGRhdGFTdG9yZVJlZiArICIgZnJvbSBvcmlnUmVmOiAiICsgci5nZXRPcmlnUmVmZXJlbmNlKCkpOworICAgICAgICAgICAgci5zZXREYXRhU3RvcmVSZWZlcmVuY2UoZGF0YVN0b3JlUmVmKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUJhc2ljRGF0YVN0b3JlUmVmc0ZsYXQoU3RyaW5nIHByb2R1Y3ROYW1lLAorICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RSZXBvUGF0aCwgTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZXMpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGkgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUmVmZXJlbmNlIHIgPSBpLm5leHQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGRhdGFTdG9yZVJlZiA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFJlcG9QYXRoUmVmID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0UmVwb1BhdGhSZWYgPSBuZXcgRmlsZShuZXcgVVJJKHByb2R1Y3RSZXBvUGF0aCkpLnRvVVJMKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b0V4dGVybmFsRm9ybSgpOworCisgICAgICAgICAgICAgICAgaWYgKCFwcm9kdWN0UmVwb1BhdGhSZWYuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9kdWN0UmVwb1BhdGhSZWYgKz0gIi8iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGFTdG9yZVJlZiA9IHByb2R1Y3RSZXBvUGF0aFJlZgorICAgICAgICAgICAgICAgICAgICAgICAgKyBVUkxFbmNvZGVyLmVuY29kZShwcm9kdWN0TmFtZSwgIlVURi04IikgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUobmV3IFVSSShyLmdldE9yaWdSZWZlcmVuY2UoKSkpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbmluZ1V0aWxzOiBFcnJvciBnZW5lcmF0aW5nIGRhdGFTdG9yZVJlZiBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnNpb25pbmdVdGlsczogRXJyb3IgZ2VuZXJhdGluZyBkYXRhU3RvcmVSZWYgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLmdldE9yaWdSZWZlcmVuY2UoKSArICI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlZlcnNpb25pbmdVdGlsczogR2VuZXJhdGVkIGRhdGEgc3RvcmUgcmVmOiAiCisgICAgICAgICAgICAgICAgICAgICsgZGF0YVN0b3JlUmVmICsgIiBmcm9tIG9yaWdSZWY6ICIgKyByLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICAgICByLnNldERhdGFTdG9yZVJlZmVyZW5jZShkYXRhU3RvcmVSZWYpOworICAgICAgICB9CisKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUJhc2ljRGF0YVN0b3JlUmVmc1N0cmVhbShTdHJpbmcgcHJvZHVjdE5hbWUsCisgICAgICAgIFN0cmluZyBwcm9kdWN0UmVwb1BhdGgsIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzLFN0cmluZyBwb3N0Zml4KSB7CisgICAgICAgIGZvciAoSXRlcmF0b3I8UmVmZXJlbmNlPiBpID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByID0gaS5uZXh0KCk7CisgICAgICAgICAgICBjcmVhdGVEYXRhU3RvcmVSZWZTdHJlYW0ocHJvZHVjdE5hbWUscHJvZHVjdFJlcG9QYXRoLHIscG9zdGZpeCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGF0YVN0b3JlUmVmU3RyZWFtKFN0cmluZyBwbiwgU3RyaW5nIHByb2R1Y3RSZXBvUGF0aCwgUmVmZXJlbmNlIHJlZiwgU3RyaW5nIHBvc3RmaXgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGUocmVmLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gKHBvc3RmaXguZXF1YWxzKCIiKSk/bmV3IFN0cmluZ1tdIHt1cmkudG9TdHJpbmcoKX06bmV3IFN0cmluZ1tdIHt1cmkudG9TdHJpbmcoKSxwb3N0Zml4fTsKKyAgICAgICAgcmVmLnNldERhdGFTdG9yZVJlZmVyZW5jZShTdHJpbmdVdGlscy5qb2luKHBhcnRzLFJlZmVyZW5jZS5TVFJFQU1fUkVGRVJFTkNFX0RFTElNSVRFUikpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVmc0Zyb21VcmlzKFByb2R1Y3QgcCwgTGlzdDxTdHJpbmc+IHVyaXMpIHsKKyAgICAgICAgLy8gYWRkIHRoZSByZWZzIHRvIHRoZSBQcm9kdWN0CisgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gdXJpcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyByZWYgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByID0gbmV3IFJlZmVyZW5jZShyZWYsIG51bGwsIChwLmdldFByb2R1Y3RTdHJ1Y3R1cmUoKS5lcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfU1RSRUFNKT8tMTpxdWlldEdldEZpbGVTaXplRnJvbVVyaShyZWYpKSk7CisgICAgICAgICAgICBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKHIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoRnJvbVVyaShTdHJpbmcgdXJpU3RyKSB7CisgICAgICAgIFVSSSB1cmkgPSBudWxsOworICAgICAgICBTdHJpbmcgYWJzUGF0aCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVyaSA9IG5ldyBVUkkodXJpU3RyKTsKKyAgICAgICAgICAgIGFic1BhdGggPSBuZXcgRmlsZSh1cmkpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiVVJJU3ludGF4RXhjZXB0aW9uIGdldHRpbmcgVVJJIGZyb20gVVJJIHN0cjogWyIgKyB1cmlTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWJzUGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIHF1aWV0R2V0RmlsZVNpemVGcm9tVXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgRmlsZSBmaWxlUmVmID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZVJlZiA9IG5ldyBGaWxlKG5ldyBVUkkodXJpKSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJVUklTeW50YXhFeGNlcHRpb24gd2hlbiBnZXR0aW5nIGZpbGUgc2l6ZSBmcm9tIHVyaTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVyaSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIC0xTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmaWxlUmVmLmxlbmd0aCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Cb29sZWFuUXVlcnlDcml0ZXJpYS5jbGFzcy5waHAgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL0Jvb2xlYW5RdWVyeUNyaXRlcmlhLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIwMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Cb29sZWFuUXVlcnlDcml0ZXJpYS5jbGFzcy5waHAKQEAgLTAsMCArMSwxNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcmVxdWlyZV9vbmNlKCJYTUwvUlBDLnBocCIpOworCisvKioKKyAqIEBhdXRob3IgcmVzbmVjaworICoKKyAqIDxwPkEgUEhQIHBvcnQgb2YgdGhlIGNvcmUgZmlsZW1nciBkYXRhIHN0cnVjdHVyZS48L3A+CisgKi8KKyBjbGFzcyBDQVNfRmlsZW1ncl9Cb29sZWFuUXVlcnlDcml0ZXJpYSB7CisgCisgCS8vIFRoZXNlIHZhcmlhYmxlcyB3aWxsIGZ1bmN0aW9uIGFzIGNvbnN0YW50cyB0byBkZWZpbmUgYm9vbGVhbiBvcGVyYXRvcnMKKyAJcHVibGljIHN0YXRpYyAkQU5EX09QID0gMDsKKyAgICBwdWJsaWMgc3RhdGljICRPUl9PUCA9IDE7CisgICAgcHVibGljIHN0YXRpYyAkTk9UX09QID0gMjsKKyAgICAKKyAgICBwdWJsaWMgJG9wZXJhdG9yOworICAgIHB1YmxpYyAkdGVybXM7CisgICAgCisgICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIFVzZXMgdGhlIEFORCBvcGVyYXRvci4KKyAgICAgKi8KKwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpeworICAgIAkkdGhpcy0+b3BlcmF0b3IgPSBzZWxmOjokQU5EX09QOworICAgIAkkdGhpcy0+dGVybXMgPSBhcnJheSgpOworCX0KKwkKKwkvKioKKyAgICAgKiBUaGlzIHF1ZXJ5IGlzIGEgYm9vbGVhbiBjb21iaW5hdGlvbiBvZiB0ZXJtLAorICAgICAqIHJhbmdlLCBhbmQgb3RoZXIgYm9vbGVhbiBxdWVyaWVzLiBUaGUgc3VwcG9ydGVkIG9wZXJhdG9ycyBhcmUgQU5ELCBPUiBhbmQKKyAgICAgKiBOT1QuIE5vdGUgdGhhdCB0aGUgTk9UIG9wZXJhdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBvbmUgKDEpIHRlcm0uIFRoaXMKKyAgICAgKiBmdW5jdGlvbiB3aWxsIG5vdCBvcGVyYXRlIGlmIG1vcmUgdGhhbiBvbmUgdGVybSBpcyB1c2VkIHdpdGggdGhlIE5PVAorICAgICAqIG9wZXJhdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXJtcworICAgICAqICAgICAgICAgICAgVGhlIGNyaXRlcmlhIG9udG8gd2hpY2ggdG8gYXBwbHkgdGhlIGJvb2xlYW4gb3BlcmF0b3IKKyAgICAgKiBAcGFyYW0gb3AKKyAgICAgKiAgICAgICAgICAgIFRoZSBib29sZWFuIG9wZXJhdG9yIHRvIGJlIGFwcGxpZWQKKyAgICAgKi8KKwlmdW5jdGlvbiBfX2luaXQoJHRlcm1zLCAkb3ApeworCQlpZighKCRvcCA9PSBzZWxmOjokTk9UX09QICYmIGNvdW50KCR0ZXJtcykgPiAxKSl7CisJCQkkdGhpcy0+dGVybXMgPSAkdGVybXM7CisJCQkkdGhpcy0+b3BlcmF0b3IgPSAkb3A7CisJCX0KKwl9CisJCisJZnVuY3Rpb24gX19pbml0WG1sUnBjKCR4bWxScGNEYXRhKXsKKyAgICAJJHRoaXMtPm9wZXJhdG9yID0gKGlzc2V0KCR4bWxScGNEYXRhWydvcGVyYXRvciddKSkKKwkJCT8gaW50dmFsKCR4bWxScGNEYXRhWydvcGVyYXRvciddKSAKKwkJCTogc2VsZjo6JEFORF9PUDsKKwkJJHRoaXMtPnRlcm1zID0gKGlzc2V0KCR4bWxScGNEYXRhWyd0ZXJtcyddKSkKKwkJCT8gJHhtbFJwY0RhdGFbJ3Rlcm1zJ10gCisJCQk6IGFycmF5KCk7CisJfQorCQorCS8qKgorICAgICAqIE1ldGhvZCB0byBhZGQgYSB0ZXJtIHRvIHRoZSBib29sZWFuIHF1ZXJ5LiBOb3RlIHRoYXQgYSBOT1Qgb3BlcmF0b3IgY2FuCisgICAgICogb25seSBiZSBhcHBsaWVkIHRvIG9uZSB0ZXJtLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IG9wZXJhdGUgaWYgbW9yZSB0aGFuIAorICAgICAqIG9uZSB0ZXJtIGlzIHVzZWQgd2l0aCB0aGUgTk9UIG9wZXJhdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICBUZXJtIHRvIGJlIGFkZGVkIHRvIHRoZSBxdWVyeQorICAgICAqLworCWZ1bmN0aW9uIGFkZFRlcm0oJHQpeworCQlpZighKCR0aGlzLT5vcGVyYXRvciA9PSBzZWxmOjokTk9UX09QICYmIGNvdW50KCR0aGlzLT50ZXJtcykpKXsKKwkJCWFycmF5X3B1c2goJHRoaXMtPnRlcm1zLCAkdCk7CisJCX0KKwl9CisJCisJLyoqCisgICAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgbGlzdCBvZiB0ZXJtcyBpbiB0aGUgcXVlcnkuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0ZXJtcworICAgICAqLworICAgIGZ1bmN0aW9uIGdldFRlcm1zKCkgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRlcm1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11dGF0b3IgbWV0aG9kIGZvciB0aGUgYm9vbGVhbiBvcGVyYXRvci4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBvcGVyYXRlIGlmIG1vcmUgdGhhbiAKKyAgICAgKiBvbmUgdGVybSBpcyB1c2VkIHdpdGggdGhlIE5PVCBvcGVyYXRvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3AKKyAgICAgKiAgICAgICAgICAgIEJvb2xlYW4gb3BlcmF0b3IKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzZXRPcGVyYXRvcigkb3ApeworICAgIAlpZighKCRvcCA9PSBzZWxmOjokTk9UX09QICYmIGNvdW50KCR0aGlzLT50ZXJtcykgPiAxKSl7CisgICAgCQkkdGhpcy0+b3BlcmF0b3IgPSAkb3A7CisgICAgCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBib29sZWFuIG9wZXJhdG9yLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gb3BlcmF0b3IKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5vcGVyYXRvcjsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdG9Bc3NvY0FycmF5KCl7CisJCSRhc3NvY0FycmF5ID0gYXJyYXkoCisJCQknb3BlcmF0b3InID0+ICR0aGlzLT5vcGVyYXRvciwKKwkJCSd0ZXJtcycgPT4gYXJyYXkoKSk7CisJCWZvcmVhY2goJHRoaXMtPnRlcm1zIGFzICR0KXsKKwkJCWFycmF5X3B1c2goJGFzc29jQXJyYXlbJ3Rlcm1zJ10sICR0LT50b0Fzc29jQXJyYXkoKSk7CisJCX0KKwkJcmV0dXJuICRhc3NvY0FycmF5OworCX0KKwkKKwlmdW5jdGlvbiB0b1htbFJwY1N0cnVjdCgpeworCQkkdGVybUFycmF5ID0gYXJyYXkoKTsKKwkJZm9yZWFjaCgkdGhpcy0+dGVybXMgYXMgJHQpeworCQkJYXJyYXlfcHVzaCgkdGVybUFycmF5LCAkdC0+dG9YbWxScGNTdHJ1Y3QoKSk7CisJCX0KKwkJcmV0dXJuIG5ldyBYTUxfUlBDX1ZhbHVlKGFycmF5KAorCQkJJ2NsYXNzJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgnb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuQm9vbGVhblF1ZXJ5Q3JpdGVyaWEnLCAnc3RyaW5nJyksCisJCQkndGVybXMnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0ZXJtQXJyYXksICdhcnJheScpLAorCQkJJ29wZXJhdG9yJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+b3BlcmF0b3IsICdpbnQnKSksICdzdHJ1Y3QnKTsKKwl9CisgCisgfQorIAorID8+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL0VsZW1lbnQuY2xhc3MucGhwIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9FbGVtZW50LmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDIyNjhiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9FbGVtZW50LmNsYXNzLnBocApAQCAtMCwwICsxLDE1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCityZXF1aXJlX29uY2UoIlhNTC9SUEMucGhwIik7CisKKy8qKgorICogQGF1dGhvciByZXNuZWNrCisgKgorICogPHA+QSBQSFAgcG9ydCBvZiB0aGUgY29yZSBmaWxlbWdyIGRhdGEgc3RydWN0dXJlLjwvcD4KKyAqLworY2xhc3MgQ0FTX0ZpbGVtZ3JfRWxlbWVudCB7CisKKwkvKiB0aGUgZWxlbWVudCBpZCAqLworCXB1YmxpYyAkZWxlbWVudElkOworCisgICAgLyogdGhlIGVsZW1lbnQgbmFtZSAqLworICAgIHB1YmxpYyAkZWxlbWVudE5hbWU7CisKKyAgICAvKiB0aGUgY29ycmVzcG9uZGluZyBEQyBlbGVtZW50IGZvciB0aGlzIENBUyBlbGVtZW50ICovCisgICAgcHVibGljICRkY0VsZW1lbnQ7CisKKyAgICAvKiB0aGUgZWxlbWVudCdzIHN0cmluZyBkZXNjcmlwdGlvbi4gKi8KKyAgICBwdWJsaWMgJGRlc2NyaXB0aW9uOworICAgIAorICAgIC8qKgorCSAqIDxwPkRlZmF1bHQgQ29uc3RydWN0b3IuPC9wPgorCSAqLworCWZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CisJCSR0aGlzLT5lbGVtZW50SWQgPSBudWxsOworCQkkdGhpcy0+ZWxlbWVudE5hbWUgPSBudWxsOworCQkkdGhpcy0+ZGNFbGVtZW50ID0gbnVsbDsKKwkJJHRoaXMtPmRlc2NyaXB0aW9uID0gbnVsbDsKKwl9CisJCisJZnVuY3Rpb24gX19pbml0KCRlbGVtZW50SWQsICRlbGVtZW50TmFtZSwgJGRjRWxlbWVudCwgJGRlc2NyaXB0aW9uKXsKKwkJJHRoaXMtPmVsZW1lbnRJZCA9ICRlbGVtZW50SWQ7CisJCSR0aGlzLT5lbGVtZW50TmFtZSA9ICRlbGVtZW50TmFtZTsKKwkJJHRoaXMtPmRjRWxlbWVudCA9ICRkY0VsZW1lbnQ7CisJCSR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKKwl9CisJCisJZnVuY3Rpb24gX19pbml0WG1sUnBjKCR4bWxScGNEYXRhKXsKKwkJJHRoaXMtPmVsZW1lbnRJZCA9IChpc3NldCgkeG1sUnBjRGF0YVsnaWQnXSkpCisJCQk/ICR4bWxScGNEYXRhWydpZCddCisJCQk6IG51bGw7CisJCSR0aGlzLT5lbGVtZW50TmFtZSA9IChpc3NldCgkeG1sUnBjRGF0YVsnbmFtZSddKSkKKwkJCT8gJHhtbFJwY0RhdGFbJ25hbWUnXQorCQkJOiBudWxsOworCQkkdGhpcy0+ZGNFbGVtZW50ID0gKGlzc2V0KCR4bWxScGNEYXRhWydkY0VsZW1lbnQnXSkpCisJCQk/ICR4bWxScGNEYXRhWydkY0VsZW1lbnQnXQorCQkJOiBudWxsOworCQkkdGhpcy0+ZGVzY3JpcHRpb24gPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ2Rlc2NyaXB0aW9uJ10pKQorCQkJPyAkeG1sUnBjRGF0YVsnZGVzY3JpcHRpb24nXQorCQkJOiBudWxsOworCX0KKwkKKwkvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIEVsZW1lbnQuCisgICAgICovCisJZnVuY3Rpb24gZ2V0RWxlbWVudElEKCl7CisJCXJldHVybiAkdGhpcy0+ZWxlbWVudElkOworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gZWxlbWVudElkCisgICAgICogICAgICAgICAgICBUaGUgbmV3IElEIGZvciB0aGlzIEVsZW1lbnQuCisgICAgICovCisJZnVuY3Rpb24gc2V0RWxlbWVudElEKCRlbGVtZW50SWQpeworCQkkdGhpcy0+ZWxlbWVudElkID0gJGVsZW1lbnRJZDsKKwl9CisJCisJLyoqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIEVsZW1lbnQuCisgICAgICovCisJZnVuY3Rpb24gZ2V0RWxlbWVudE5hbWUoKXsKKwkJcmV0dXJuICR0aGlzLT5lbGVtZW50TmFtZTsKKwl9CisJCisJLyoqCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmV3IG5hbWUgZm9yIHRoaXMgRWxlbWVudC4KKyAgICAgKi8KKwlmdW5jdGlvbiBzZXRFbGVtZW50TmFtZSgkZWxlbWVudE5hbWUpeworCQkkdGhpcy0+ZWxlbWVudE5hbWUgPSAkZWxlbWVudE5hbWU7CisJfQorCisJLyoqCisgICAgICogQHJldHVybiBUaGUgZGNFbGVtZW50IG9mIHRoaXMgRWxlbWVudC4uLndoYXRldmVyIHRoYXQgbWVhbnMuCisgICAgICovCisJZnVuY3Rpb24gZ2V0RGNFbGVtZW50KCl7CisJCXJldHVybiAkdGhpcy0+ZGNFbGVtZW50OworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gZGNFbGVtZW50CisgICAgICogICAgICAgICAgICBUaGUgbmV3IGRjRWxlbWVudCBmb3IgdGhpcyBFbGVtZW50LgorICAgICAqLworCWZ1bmN0aW9uIHNldERjRWxlbWVudCgkZGNFbGVtZW50KXsKKwkJJHRoaXMtPmRjRWxlbWVudCA9ICRkY0VsZW1lbnQ7CisJfQorCQorCS8qKgorICAgICAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgRWxlbWVudC4KKyAgICAgKi8KKwlmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpeworCQlyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24KKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoaXMgRWxlbWVudC4KKyAgICAgKi8KKwlmdW5jdGlvbiBzZXREZXNjcmlwdGlvbigkZGVzY3JpcHRpb24peworCQkkdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247CisJfQorCQorCWZ1bmN0aW9uIHRvQXNzb2NBcnJheSgpeworICAgIAlyZXR1cm4gYXJyYXkoCisJCQknZWxlbWVudElkJyA9PiAkdGhpcy0+ZWxlbWVudElkLAorCQkJJ2VsZW1lbnROYW1lJyA9PiAkdGhpcy0+ZWxlbWVudE5hbWUsCisJCQknZGNFbGVtZW50JyA9PiAkdGhpcy0+ZGNFbGVtZW50LAorCQkJJ2Rlc2NyaXB0aW9uJyA9PiAkdGhpcy0+ZGVzY3JpcHRpb24pOworICAgIH0KKwkKKwlmdW5jdGlvbiB0b1htbFJwY1N0cnVjdCgpeworICAgIAlyZXR1cm4gbmV3IFhNTF9SUENfVmFsdWUoYXJyYXkoCisJCQknZWxlbWVudElkJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+ZWxlbWVudElkLCdzdHJpbmcnKSwKKwkJCSdlbGVtZW50TmFtZScgPT4gbmV3IFhNTF9SUENfVmFsdWUoJHRoaXMtPmVsZW1lbnROYW1lLCdzdHJpbmcnKSwKKwkJCSdkY0VsZW1lbnQnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0aGlzLT5kY0VsZW1lbnQsJ3N0cmluZycpLAorCQkJJ2Rlc2NyaXB0aW9uJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+ZGVzY3JpcHRpb24sICdzdHJpbmcnKSksICdzdHJ1Y3QnKTsKKyAgICB9CisKK30KKworPz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvTWV0YWRhdGEuY2xhc3MucGhwIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9NZXRhZGF0YS5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZjZhYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvTWV0YWRhdGEuY2xhc3MucGhwCkBAIC0wLDAgKzEsODQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcmVxdWlyZV9vbmNlICgiWE1ML1JQQy5waHAiKTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiAKKyAqIEEgUEhQIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBDQVMgbWV0YWRhdGEgZGF0YSBzdHJ1Y3R1cmUsIHdoaWNoCisgKiBpcyBhIHN0cnVjdHVyZSBvZiBrZXk9Pkxpc3Qgb2YgU3RyaW5nIHZhbHVlcy4KKyAqLworY2xhc3MgQ0FTX0ZpbGVtZ3JfTWV0YWRhdGEgeworCisJcHVibGljICRlbGVtTWFwOworCisJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHhtbFJwY0RhdGEgPSBhcnJheSAoKSkgeworCQkkdGhpcy0+ZWxlbU1hcCA9ICR4bWxScGNEYXRhOworCX0KKworCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CisKKwl9CisKKwlmdW5jdGlvbiB0b1htbFJwY1N0cnVjdCgpIHsKKwkJJHhtbFJwY1N0cnVjdCA9IGFycmF5ICgpOworCQlmb3JlYWNoICgkdGhpcy0+ZWxlbU1hcCBhcyAka2V5ID0+ICR2YWwpIHsKKwkJCSR2YWxMaXN0ID0gYXJyYXkgKCk7CisJCQlmb3JlYWNoICgkdmFsIGFzICR2KSB7CisJCQkJYXJyYXlfcHVzaCgkdmFsTGlzdCwgbmV3IFhNTF9SUENfVkFMVUUoJHYsICdzdHJpbmcnKSk7CisJCQl9CisJCQkkeG1sUnBjU3RydWN0WyRrZXldID0gbmV3IFhNTF9SUENfVkFMVUUoJHZhbExpc3QsICdhcnJheScpOworCQl9CisKKwkJcmV0dXJuIG5ldyBYTUxfUlBDX1ZBTFVFKCR4bWxScGNTdHJ1Y3QsICdzdHJ1Y3QnKTsKKwl9CisKKwlmdW5jdGlvbiB0b0Fzc29jQXJyYXkoKSB7CisJCXJldHVybiAkdGhpcy0+ZWxlbU1hcDsKKwl9CisKKwlmdW5jdGlvbiBhZGRNZXRhZGF0YSgka2V5LCAkdmFsdWUpIHsKKwkJYXJyYXlfcHVzaCgkdGhpcy0+ZWxlbU1hcFska2V5XSwgJHZhbHVlKTsKKwl9CisKKwlmdW5jdGlvbiByZXBsYWNlTWV0YWRhdGEoJGtleSwgJHZhbHVlKSB7CisJCSR0aGlzLT5lbGVtTWFwWyRrZXldID0gJHZhbHVlOworCX0KKworCWZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKCRrZXkpIHsKKwkJdW5zZXQgKCR0aGlzLT5lbGVtTWFwWyRrZXldKTsKKwl9CisKKwlmdW5jdGlvbiBnZXRBbGxNZXRhZGF0YSgka2V5KSB7CisJCXJldHVybiAkdGhpcy0+ZWxlbU1hcFska2V5XTsKKwl9CisKKwlmdW5jdGlvbiBnZXRNZXRhZGF0YSgka2V5KSB7CisJCXJldHVybiAkdGhpcy0+ZWxlbU1hcFska2V5XVswXTsKKwl9CisKKwlmdW5jdGlvbiBjb250YWluc0tleSgka2V5KSB7CisJCXJldHVybiBhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5lbGVtTWFwKTsKKwl9CisKKwlmdW5jdGlvbiBpc011bHRpVmFsdWVkKCRrZXkpIHsKKwkJcmV0dXJuIGFycmF5X2NvdW50X3ZhbHVlcygkdGhpcy0+ZWxlbU1hcFska2V5XSkgPiAxOworCX0KK30KKz8+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL1Byb2R1Y3QuY2xhc3MucGhwIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Qcm9kdWN0LmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYxZjcyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Qcm9kdWN0LmNsYXNzLnBocApAQCAtMCwwICsxLDEwMiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCityZXF1aXJlX29uY2UoIlhNTC9SUEMucGhwIik7CisKKy8qKgorICogQGF1dGhvciBhaGFydAorICogQGF1dGhvciBnYWJlCisgKiA8cD5UaGUgY29yZSBmaWxlIG1hbmFnZXIgZGF0YSBzdHJ1Y3R1cmUsIHBvcnRlZAorICogdG8gUEhQLgorICogPC9wPgorICovCitjbGFzcyBDQVNfRmlsZW1ncl9Qcm9kdWN0IHsKKwkKKwkgcHVibGljICRpZDsKKwkgcHVibGljICRuYW1lOworCSBwdWJsaWMgJHR5cGU7CisJIHB1YmxpYyAkc3RydWN0dXJlOworCSBwdWJsaWMgJHRyYW5zZmVyU3RhdHVzOworCSBwdWJsaWMgJHJlZmVyZW5jZXM7CisJCisKKwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgkeG1sUnBjRGF0YSA9IGFycmF5KCkpIHsKKwkJJHRoaXMtPmlkID0gKGlzc2V0KCR4bWxScGNEYXRhWydpZCddKSkKKwkJCT8gJHhtbFJwY0RhdGFbJ2lkJ10gCisJCQk6ICcnOworCQkkdGhpcy0+bmFtZSA9IChpc3NldCgkeG1sUnBjRGF0YVsnbmFtZSddKSkKKwkJCT8gJHhtbFJwY0RhdGFbJ25hbWUnXSAKKwkJCTogJyc7CisJCSR0aGlzLT50eXBlID0gKGlzc2V0KCR4bWxScGNEYXRhWyd0eXBlJ10pKQorCQkJPyBuZXcgQ0FTX0ZpbGVtZ3JfUHJvZHVjdFR5cGUoJHhtbFJwY0RhdGFbJ3R5cGUnXSkgCisJCQk6IG5ldyBDQVNfRmlsZW1ncl9Qcm9kdWN0VHlwZSgpOworCQkkdGhpcy0+c3RydWN0dXJlID0gKGlzc2V0KCR4bWxScGNEYXRhWydzdHJ1Y3R1cmUnXSkpCisJCQk/ICR4bWxScGNEYXRhWydzdHJ1Y3R1cmUnXSAKKwkJCTogJyc7CisJCSR0aGlzLT50cmFuc2ZlclN0YXR1cyA9IChpc3NldCgkeG1sUnBjRGF0YVsndHJhbnNmZXJTdGF0dXMnXSkpCisJCQk/ICR4bWxScGNEYXRhWyd0cmFuc2ZlclN0YXR1cyddIAorCQkJOiAnJzsKKwkJJHRoaXMtPnJlZmVyZW5jZXMgPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ3JlZmVyZW5jZXMnXSkpCisJCQk/ICR4bWxScGNEYXRhWydyZWZlcmVuY2VzJ10gCisJCQk6IGFycmF5KCk7CisJfQorCQorCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CisJCQorCX0KKwkKKwlmdW5jdGlvbiB0b0Fzc29jQXJyYXkoKXsKKwkJcmV0dXJuIGFycmF5KAorCQkJJ2lkJyA9PiAkdGhpcy0+aWQsCisJCQknbmFtZScgPT4gJHRoaXMtPm5hbWUsCisJCQkndHlwZScgPT4gJHRoaXMtPnR5cGUtPnRvQXNzb2NBcnJheSgpLAorCQkJJ3N0cnVjdHVyZScgPT4gJHRoaXMtPnN0cnVjdHVyZSwKKwkJCSd0cmFuc2ZlclN0YXR1cycgPT4gJHRoaXMtPnRyYW5zZmVyU3RhdHVzLAorCQkJJ3JlZmVyZW5jZXMnID0+ICR0aGlzLT5yZWZlcmVuY2VzKTsKKwl9CisJCisJZnVuY3Rpb24gdG9YbWxScGNTdHJ1Y3QoKXsKKwkJcmV0dXJuIG5ldyBYTUxfUlBDX1ZBTFVFKGFycmF5KAorCQkJJ2lkJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+aWQsJ3N0cmluZycpLAorCQkJJ25hbWUnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0aGlzLT5uYW1lLCdzdHJpbmcnKSwKKwkJCSd0eXBlJyA9PiAkdGhpcy0+dHlwZS0+dG9YbWxScGNTdHJ1Y3QoKSwKKwkJCSdzdHJ1Y3R1cmUnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0aGlzLT5zdHJ1Y3R1cmUsJ3N0cmluZycpLAorCQkJJ3RyYW5zZmVyU3RhdHVzJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+dHJhbnNmZXJTdGF0dXMsJ3N0cmluZycpLAorCQkJJ3JlZmVyZW5jZXMnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0aGlzLT5yZWZlcmVuY2VzLCdhcnJheScpKSwnc3RydWN0Jyk7CisJfQorCQorCS8qCisJICogR2V0dGVyL1NldHRlciBmdW5jdGlvbnMKKwkgKi8KKwlmdW5jdGlvbiBnZXRJZCgpe3JldHVybiAkdGhpcy0+aWQ7fQorCWZ1bmN0aW9uIGdldE5hbWUoKXtyZXR1cm4gJHRoaXMtPm5hbWU7fQorCWZ1bmN0aW9uIGdldFR5cGUoKXtyZXR1cm4gJHRoaXMtPnR5cGU7fQorCWZ1bmN0aW9uIGdldFN0cnVjdHVyZSgpe3JldHVybiAkdGhpcy0+c3RydWN0dXJlO30KKwlmdW5jdGlvbiBnZXRUcmFuc2ZlclN0YXR1cygpe3JldHVybiAkdGhpcy0+dHJhbnNmZXJTdGF0dXM7fQorCWZ1bmN0aW9uIGdldFJlZmVyZW5jZXMoKXtyZXR1cm4gJHRoaXMtPnJlZmVyZW5jZXM7fQorCQorCWZ1bmN0aW9uIHNldElkKCR2YWwpeyR0aGlzLT5pZCA9ICR2YWw7fQorCWZ1bmN0aW9uIHNldE5hbWUoJHZhbCl7JHRoaXMtPm5hbWUgPSAkdmFsO30KKwlmdW5jdGlvbiBzZXRUeXBlKCR2YWwpeyR0aGlzLT50eXBlID0gJHZhbDt9CisJZnVuY3Rpb24gc2V0U3RydWN0dXJlKCR2YWwpeyR0aGlzLT5zdHJ1Y3R1cmUgPSAkdmFsO30KKwlmdW5jdGlvbiBzZXRUcmFuc2ZlclN0YXR1cygpeyR0aGlzLT50cmFuc2ZlclN0YXR1cyA9ICR2YWw7fQorCWZ1bmN0aW9uIHNldFJlZmVyZW5jZXMoJHZhbCl7JHRoaXMtPnJlZmVyZW5jZXMgPSAkdmFsO30KKwkKK30KKworPz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvUHJvZHVjdFBhZ2UuY2xhc3MucGhwIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Qcm9kdWN0UGFnZS5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxZTQ3OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvUHJvZHVjdFBhZ2UuY2xhc3MucGhwCkBAIC0wLDAgKzEsMjI1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3JlcXVpcmVfb25jZSgiWE1ML1JQQy5waHAiKTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIEEgUGFnZSBvZiB7QGxpbmsgUHJvZHVjdH1zIHJldHVybmVkIGZyb20gdGhlIDxjb2RlPkZpbGUgTWFuYWdlcjwvY29kZT4uCisgKiAKKyAqLworY2xhc3MgQ0FTX0ZpbGVtZ3JfUHJvZHVjdFBhZ2UgeworCisJLyogdGhlIG51bWJlciBvZiB0aGlzIHBhZ2UgKi8KKwlwcml2YXRlICRwYWdlTnVtID0gLTE7CisKKwkvKiB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzZXQgKi8KKwlwcml2YXRlICR0b3RhbFBhZ2VzID0gLTE7CisJCisJLyogdGhlIG51bWJlciBvZiB0b3RhbCBoaXRzIGZvciB0aGUgcXVlcnkgKi8KKwlwcml2YXRlICRudW1PZkhpdHMgPSAtMTsKKwkKKwkvKiB0aGUgc2l6ZSBvZiB0aGUgbnVtYmVyIG9mIHByb2R1Y3RzIG9uIHRoaXMgcGFnZSAqLworCXByaXZhdGUgJHBhZ2VTaXplID0gLTE7CisKKwkvKiB0aGUgbGlzdCBvZiBwcm9kdWRjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZSAqLworCXByaXZhdGUgJHBhZ2VQcm9kdWN0cyA9IG51bGw7CisKKwkvKioKKwkgKiA8cD4KKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICogPC9wPi4KKwkgKi8KKwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKKwkJJHRoaXMtPnBhZ2VQcm9kdWN0cyA9IGFycmF5ICgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYWdlTnVtCisJICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRoaXMgcGFnZS4KKwkgKiBAcGFyYW0gdG90YWxQYWdlcworCSAqICAgICAgICAgICAgVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgc2V0LgorCSAqIEBwYXJhbSBwYWdlU2l6ZQorCSAqICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhpcyBwYWdlLgorCSAqIEBwYXJhbSBwYWdlUHJvZHVjdHMKKwkgKiAgICAgICAgICAgIFRoZSBwcm9kdWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLgorCSAqLworCWZ1bmN0aW9uIF9faW5pdCgkcGFnZU51bSwgJHRvdGFsUGFnZXMsICRudW1PZkhpdHMsICRwYWdlU2l6ZSwgJHBhZ2VQcm9kdWN0cykgeworCQkkdGhpcy0+cGFnZU51bSA9ICRwYWdlTnVtOworCQkkdGhpcy0+dG90YWxQYWdlcyA9ICR0b3RhbFBhZ2VzOworCQkkdGhpcy0+bnVtT2ZIaXRzID0gJG51bU9mSGl0czsKKwkJJHRoaXMtPnBhZ2VTaXplID0gJHBhZ2VTaXplOworCQkkdGhpcy0+cGFnZVByb2R1Y3RzID0gJHBhZ2VQcm9kdWN0czsKKwl9CisKKyAgICBmdW5jdGlvbiBfX2luaXRYbWxScGMoJHhtbFJwY0RhdGEpeworCQkkdGhpcy0+cGFnZU51bSA9IChpc3NldCgkeG1sUnBjRGF0YVsncGFnZU51bSddKSkKKwkJCT8gaW50dmFsKCR4bWxScGNEYXRhWydwYWdlTnVtJ10pCisJCQk6IC0xOworCQkkdGhpcy0+dG90YWxQYWdlcyA9IChpc3NldCgkeG1sUnBjRGF0YVsndG90YWxQYWdlcyddKSkKKwkJCT8gaW50dmFsKCR4bWxScGNEYXRhWyd0b3RhbFBhZ2VzJ10pIAorCQkJOiAtMTsKKwkJJHRoaXMtPm51bU9mSGl0cyA9IChpc3NldCgkeG1sUnBjRGF0YVsnbnVtT2ZIaXRzJ10pKQorCQkJPyBpbnR2YWwoJHhtbFJwY0RhdGFbJ251bU9mSGl0cyddKSAKKwkJCTogLTE7CisJCSR0aGlzLT5wYWdlU2l6ZSA9IChpc3NldCgkeG1sUnBjRGF0YVsncGFnZVNpemUnXSkpCisJCQk/IGludHZhbCgkeG1sUnBjRGF0YVsncGFnZVNpemUnXSkgCisJCQk6IC0xOworCQkkdGhpcy0+cGFnZVByb2R1Y3RzID0gYXJyYXkoKTsKKwkJaWYoaXNzZXQoJHhtbFJwY0RhdGFbJ3BhZ2VQcm9kdWN0cyddKSl7CisJCQlmb3JlYWNoKCR4bWxScGNEYXRhWydwYWdlUHJvZHVjdHMnXSBhcyAkcCl7CisJCQkJYXJyYXlfcHVzaCgkdGhpcy0+cGFnZVByb2R1Y3RzLCBuZXcgQ0FTX0ZpbGVtZ3JfUHJvZHVjdCgkcCkpOworCQkJfQorCQl9CisgICAgfQorICAgIAorICAgIAorCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFnZU51bS4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0UGFnZU51bSgpIHsKKwkJcmV0dXJuICR0aGlzLT5wYWdlTnVtOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYWdlTnVtCisJICogICAgICAgICAgICBUaGUgcGFnZU51bSB0byBzZXQuCisJICovCisJcHVibGljIGZ1bmN0aW9uIHNldFBhZ2VOdW0oJHBhZ2VOdW0pIHsKKwkJJHRoaXMtPnBhZ2VOdW0gPSAkcGFnZU51bTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhZ2VQcm9kdWN0cy4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0UGFnZVByb2R1Y3RzKCkgeworCQlyZXR1cm4gJHRoaXMtPnBhZ2VQcm9kdWN0czsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcGFnZVByb2R1Y3RzCisJICogICAgICAgICAgICBUaGUgcGFnZVByb2R1Y3RzIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gc2V0UGFnZVByb2R1Y3RzKCRwYWdlUHJvZHVjdHMpIHsKKwkJJHRoaXMtPnBhZ2VQcm9kdWN0cyA9ICRwYWdlUHJvZHVjdHM7CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYWdlU2l6ZS4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0UGFnZVNpemUoKSB7CisJCXJldHVybiAkdGhpcy0+cGFnZVNpemU7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhZ2VTaXplCisJICogICAgICAgICAgICBUaGUgcGFnZVNpemUgdG8gc2V0LgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBzZXRQYWdlU2l6ZSgkcGFnZVNpemUpIHsKKwkJJHRoaXMtPnBhZ2VTaXplID0gJHBhZ2VTaXplOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG90YWxQYWdlcy4KKwkgKiBJZiB0b3RhbFBhZ2VzIGlzIG5vdCBzZXQgY2hlY2sgdG8gc2VlIGlmIG51bU9mSGl0cyBpcyB1c2VkIGluc3RlYWQKKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0VG90YWxQYWdlcygpIHsKKwkJaWYgKCR0aGlzLT50b3RhbFBhZ2VzICE9IC0xICkgeworCQkJcmV0dXJuICR0aGlzLT50b3RhbFBhZ2VzOworCQl9IGVsc2VpZiAoICR0aGlzLT5udW1PZkhpdHMgPiAwICkgeworCQkJcmV0dXJuIChjZWlsKCR0aGlzLT5udW1PZkhpdHMvJHRoaXMtPnBhZ2VTaXplKSk7CisJCX0KKwkJcmV0dXJuICR0aGlzLT50b3RhbFBhZ2VzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b3RhbFBhZ2VzCisJICogICAgICAgICAgICBUaGUgdG90YWxQYWdlcyB0byBzZXQuCisJICovCisJcHVibGljIGZ1bmN0aW9uIHNldFRvdGFsUGFnZXMoJHRvdGFsUGFnZXMpIHsKKwkJJHRoaXMtPnRvdGFsUGFnZXMgPSAkdG90YWxQYWdlczsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG51bU9mSGl0cy4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gZ2V0TnVtT2ZIaXRzKCkgeworCQlyZXR1cm4gJHRoaXMtPm51bU9mSGl0czsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdG90YWxQYWdlcworCSAqICAgICAgICAgICAgVGhlIHRvdGFsUGFnZXMgdG8gc2V0LgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBzZXROdW1PZkhpdHMoJG51bU9mSGl0cykgeworCQkkdGhpcy0+bnVtT2ZIaXRzID0gJG51bU9mSGl0czsKKwl9CQorCisJLyoqCisJICogCisJICogQHJldHVybiBUcnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSBpbiB0aGUgc2V0LCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIGZ1bmN0aW9uIGlzTGFzdFBhZ2UoKSB7CisJCXJldHVybiAkdGhpcy0+cGFnZU51bSA9PSAkdGhpcy0+dG90YWxQYWdlczsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBpcyB0aGUgZmlzdCBwYWdlIG9mIHRoZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gaXNGaXJzdFBhZ2UoKSB7CisJCXJldHVybiAkdGhpcy0+cGFnZU51bSA9PSAxOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiB0b1htbFJwY1N0cnVjdCgpIHsKKwkgIHJldHVybiBuZXcgWE1MX1JQQ19WYWx1ZShhcnJheSgKKwkJCQkJICdwYWdlTnVtJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+cGFnZU51bSwnaW50JyksCisJCQkJCSAncGFnZVNpemUnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0aGlzLT5wYWdlU2l6ZSwnaW50JyksCisJCQkJCSAndG90YWxQYWdlcycgPT4gbmV3IFhNTF9SUENfVmFsdWUoJHRoaXMtPnRvdGFsUGFnZXMsJ2ludCcpLAorCQkJCQkgJ251bU9mSGl0cycgPT4gbmV3IFhNTF9SUENfVmFsdWUoJHRoaXMtPm51bU9mSGl0cywnaW50JyksCisJICAJCQkJICdwYWdlUHJvZHVjdHMnID0+ICR0aGlzLT50b1htbFJwY1Byb2R1Y3RMaXN0KCR0aGlzLT5wYWdlUHJvZHVjdHMpKSwgJ3N0cnVjdCcpOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gQSBibGFuaywgdW5wb3B1bGF0ZWQge0BsaW5rIFByb2R1Y3RQYWdlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJsYW5rUGFnZSgpIHsKKwkJJGJsYW5rID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RQYWdlKCk7CisJCSRibGFuay0+c2V0UGFnZU51bSgwKTsKKwkJJGJsYW5rLT5zZXRUb3RhbFBhZ2VzKDApOworCQkkYmxhbmstPnNldE51bU9mSGl0cygwKTsKKwkJJGJsYW5rLT5zZXRQYWdlU2l6ZSgwKTsKKwkJcmV0dXJuICRibGFuazsKKwl9CisJCisJCisJcHJpdmF0ZSBmdW5jdGlvbiB0b1htbFJwY1Byb2R1Y3RMaXN0KCRwcm9kTGlzdCl7CisJCSRwcm9kRW5jb2RlZEFyciA9IGFycmF5KCk7CisJCQorCQlmb3JlYWNoICgkcHJvZExpc3QgYXMgJHByb2R1Y3QpeworCQkJJHByb2RFbmNvZGVkQXJyW10gPSAkcHJvZHVjdC0+dG9YbWxScGNTdHJ1Y3QoKTsKKwkJfQorCQkKKwkJcmV0dXJuIG5ldyBYTUxfUlBDX1ZhbHVlKCRwcm9kRW5jb2RlZEFyciwgJ2FycmF5Jyk7CisJfQorCit9Cis/PgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Qcm9kdWN0VHlwZS5jbGFzcy5waHAgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL1Byb2R1Y3RUeXBlLmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjcxZTdhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9Qcm9kdWN0VHlwZS5jbGFzcy5waHAKQEAgLTAsMCArMSwxMDQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcmVxdWlyZV9vbmNlKCJYTUwvUlBDLnBocCIpOworcmVxdWlyZV9vbmNlKCJNZXRhZGF0YS5jbGFzcy5waHAiKTsKKworLyoqCisgKiBQb3J0cyB0aGUgY29yZSBmaWxlIG1hbmFnZXIgZGF0YSBzdHJ1Y3R1cmUsIAorICogUHJvZHVjdFR5cGUsIHRvIFBIUC4KKyAqIAorICogQGF1dGhvciBhaGFydAorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBnYWJlCisgKiAKKyAqLworY2xhc3MgQ0FTX0ZpbGVtZ3JfUHJvZHVjdFR5cGUgeworCQorCSBwdWJsaWMgJGlkOworCSBwdWJsaWMgJG5hbWU7CisJIHB1YmxpYyAkZGVzY3JpcHRpb247CisJIHB1YmxpYyAkcmVwb3NpdG9yeVBhdGg7CisJIHB1YmxpYyAkdmVyc2lvbmVyQ2xhc3M7CisJIHB1YmxpYyAkdHlwZU1ldGFkYXRhOworCQorCWZ1bmN0aW9uIF9fY29uc3RydWN0KCR4bWxScGNEYXRhID0gYXJyYXkoKSl7CisJCSR0aGlzLT5pZCA9IChpc3NldCgkeG1sUnBjRGF0YVsnaWQnXSkpCisJCQk/ICR4bWxScGNEYXRhWydpZCddIAorCQkJOiAnJzsKKwkJJHRoaXMtPm5hbWUgPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ25hbWUnXSkpCisJCQk/ICR4bWxScGNEYXRhWyduYW1lJ10gCisJCQk6ICcnOworCQkkdGhpcy0+ZGVzY3JpcHRpb24gPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ2Rlc2NyaXB0aW9uJ10pKQorCQkJPyAkeG1sUnBjRGF0YVsnZGVzY3JpcHRpb24nXSAKKwkJCTogJyc7CisJCSR0aGlzLT5yZXBvc2l0b3J5UGF0aCA9IChpc3NldCgkeG1sUnBjRGF0YVsncmVwb3NpdG9yeVBhdGgnXSkpCisJCQk/ICR4bWxScGNEYXRhWydyZXBvc2l0b3J5UGF0aCddIAorCQkJOiAnJzsKKwkJJHRoaXMtPnZlcnNpb25lckNsYXNzID0gKGlzc2V0KCR4bWxScGNEYXRhWyd2ZXJzaW9uZXJDbGFzcyddKSkKKwkJCT8gJHhtbFJwY0RhdGFbJ3ZlcnNpb25lckNsYXNzJ10gCisJCQk6ICcnOworCQkkdGhpcy0+dHlwZU1ldGFkYXRhID0gKGlzc2V0KCR4bWxScGNEYXRhWyd0eXBlTWV0YWRhdGEnXSkpIAorCQkgICAgPyBuZXcgQ0FTX0ZpbGVtZ3JfTWV0YWRhdGEoJHhtbFJwY0RhdGFbJ3R5cGVNZXRhZGF0YSddKQorCQkgICAgOiBuZXcgQ0FTX0ZpbGVtZ3JfTWV0YWRhdGEoKTsKKwl9CisJCisJZnVuY3Rpb24gX19kZXN0cnVjdCgpeworCQkKKwl9CisJCisJZnVuY3Rpb24gdG9Bc3NvY0FycmF5KCl7CisJCXJldHVybiBhcnJheSgKKwkJCSdpZCcgPT4gJHRoaXMtPmlkLAorCQkJJ25hbWUnID0+ICR0aGlzLT5uYW1lLAorCQkJJ2Rlc2NyaXB0aW9uJyA9PiAkdGhpcy0+ZGVzY3JpcHRpb24sCisJCQkncmVwb3NpdG9yeVBhdGgnID0+ICR0aGlzLT5yZXBvc2l0b3J5UGF0aCwKKwkJCSd2ZXJzaW9uZXJDbGFzcycgPT4gJHRoaXMtPnZlcnNpb25lckNsYXNzLAorCQkJJ3R5cGVNZXRhZGF0YScgPT4gJHRoaXMtPnR5cGVNZXRhZGF0YS0+dG9Bc3NvY0FycmF5KCkpOworCX0KKwkKKwlmdW5jdGlvbiB0b1htbFJwY1N0cnVjdCgpeworCQlyZXR1cm4gbmV3IFhNTF9SUENfVmFsdWUoYXJyYXkoCisJCQknaWQnID0+IG5ldyBYTUxfUlBDX1ZhbHVlKCR0aGlzLT5pZCwnc3RyaW5nJyksCisJCQknbmFtZScgPT4gbmV3IFhNTF9SUENfVmFsdWUoJHRoaXMtPm5hbWUsJ3N0cmluZycpLAorCQkJJ2Rlc2NyaXB0aW9uJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+ZGVzY3JpcHRpb24sJ3N0cmluZycpLAorCQkJJ3JlcG9zaXRvcnlQYXRoJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+cmVwb3NpdG9yeVBhdGgsJ3N0cmluZycpLAorCQkJJ3ZlcnNpb25lckNsYXNzJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+dmVyc2lvbmVyQ2xhc3MsJ3N0cmluZycpLAorICAgICAgICAgICAgJ3R5cGVNZXRhZGF0YScgPT4gJHRoaXMtPnR5cGVNZXRhZGF0YS0+dG9YbWxScGNTdHJ1Y3QoKSksICdzdHJ1Y3QnKTsKKwl9CisJCisJLyoKKwkgKiBHZXR0ZXIvU2V0dGVyIEZ1bmN0aW9ucworCSAqLworCWZ1bmN0aW9uIGdldElkKCl7cmV0dXJuICR0aGlzLT5pZDt9CisJZnVuY3Rpb24gZ2V0TmFtZSgpe3JldHVybiAkdGhpcy0+bmFtZTt9CisJZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKXtyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uO30KKwlmdW5jdGlvbiBnZXRSZXBvc2l0b3J5UGF0aCgpe3JldHVybiAkdGhpcy0+cmVwb3NpdG9yeVBhdGg7fQorCWZ1bmN0aW9uIGdldFZlcnNpb25lckNsYXNzKCl7cmV0dXJuICR0aGlzLT52ZXJzaW9uZXJDbGFzczt9CisJZnVuY3Rpb24gZ2V0VHlwZU1ldGFkYXRhKCl7cmV0dXJuICR0aGlzLT50eXBlTWV0YWRhdGE7fQorCQorCWZ1bmN0aW9uIHNldElkKCR2YWwpeyR0aGlzLT5pZCA9ICR2YWw7fQorCWZ1bmN0aW9uIHNldE5hbWUoJHZhbCl7JHRoaXMtPm5hbWUgPSAkdmFsO30KKwlmdW5jdGlvbiBzZXREZXNjcmlwdGlvbigkdmFsKXskdGhpcy0+ZGVzY3JpcHRpb24gPSAkdmFsO30KKwlmdW5jdGlvbiBzZXRSZXBvc2l0b3J5UGF0aCgkdmFsKXskdGhpcy0+cmVwb3NpdG9yeVBhdGggPSAkdmFsO30KKwlmdW5jdGlvbiBzZXRWZXJzaW9uZXJDbGFzcygkdmFsKXskdGhpcy0+dmVyc2lvbmVyQ2xhc3MgPSAkdmFsO30KKwlmdW5jdGlvbiBzZXRUeXBlTWV0YWRhdGEoJHZhbCl7JHRoaXMtPnR5cGVNZXRhZGF0YSA9ICR2YWw7fQorCQorfQorCis/PgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9RdWVyeS5jbGFzcy5waHAgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL1F1ZXJ5LmNsYXNzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2MwZGFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9RdWVyeS5jbGFzcy5waHAKQEAgLTAsMCArMSw5MyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCityZXF1aXJlX29uY2UoIlhNTC9SUEMucGhwIik7CisKKy8qKgorICogQGF1dGhvciByZXNuZWNrCisgKgorICogPHA+QSBQSFAgcG9ydCBvZiB0aGUgY29yZSBmaWxlbWdyIGRhdGEgc3RydWN0dXJlLjwvcD4KKyAqLworY2xhc3MgQ0FTX0ZpbGVtZ3JfUXVlcnkgeworCisJLyoqCisJICo8cD5UaGUgc2V0IG9mIFF1ZXJ5Q3JpdGVyaWEgZm9yIHRoaXMgUXVlcnkuPC9wPgorCSAqLworCXB1YmxpYyAkY3JpdGVyaWEgPSBudWxsOworCQorCS8qKgorCSAqIDxwPkRlZmF1bHQgQ29uc3RydWN0b3IuPC9wPgorCSAqLworCWZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CisJCSR0aGlzLT5jcml0ZXJpYSA9IGFycmF5KCk7CisJfQorCQorCWZ1bmN0aW9uIF9faW5pdCgkY3JpdGVyaWEpeworCQkkdGhpcy0+Y3JpdGVyaWEgPSAkY3JpdGVyaWE7CisJfQorCQorCWZ1bmN0aW9uIF9faW5pdFhtbFJwYygkeG1sUnBjRGF0YSl7CisJCSR0aGlzLT5jcml0ZXJpYSA9IChpc3NldCgkeG1sUnBjRGF0YVsnY3JpdGVyaWEnXSkpCisJCQk/ICR4bWxScGNEYXRhWydjcml0ZXJpYSddCisJCQk6IGFycmF5KCk7CisJfQorCQorCS8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3JpdGVyaWEuCisgICAgICovCisJZnVuY3Rpb24gZ2V0Q3JpdGVyaWEoKXsKKwkJcmV0dXJuICR0aGlzLT5jcml0ZXJpYTsKKwl9CisJCisJLyoqCisgICAgICogQHBhcmFtIGNyaXRlcmlhCisgICAgICogICAgICAgICAgICBUaGUgY3JpdGVyaWEgdG8gc2V0LgorICAgICAqLworCWZ1bmN0aW9uIHNldENyaXRlcmlhKCRjcml0ZXJpYSl7CisJCSR0aGlzLT5jcml0ZXJpYSA9ICRjcml0ZXJpYTsKKwl9CisJCisJLyoqCisgICAgICogQHBhcmFtIGNyaXRlcmlvbgorICAgICAqICAgICAgICAgICAgVGhlIGNyaXRlcmlvbiB0byBhZGQgdG8gdGhlIHF1ZXJ5LgorICAgICAqLworCWZ1bmN0aW9uIGFkZENyaXRlcmlvbigkY3JpdGVyaW9uKXsKKwkJYXJyYXlfcHVzaCgkdGhpcy0+Y3JpdGVyaWEsICRjcml0ZXJpb24pOworCX0KKwkKKwlmdW5jdGlvbiB0b0Fzc29jQXJyYXkoKXsKKwkJJGFzc29jQXJyYXkgPSBhcnJheSgKKwkJCSdjcml0ZXJpYScgPT4gYXJyYXkoKSk7CisJCWZvcmVhY2goJHRoaXMtPmNyaXRlcmlhIGFzICRjKXsKKwkJCWFycmF5X3B1c2goJGFzc29jQXJyYXlbJ2NyaXRlcmlhJ10sICRjLT50b0Fzc29jQXJyYXkoKSk7CisJCX0KKwkJcmV0dXJuICRhc3NvY0FycmF5OworCX0KKwkKKwlmdW5jdGlvbiB0b1htbFJwY1N0cnVjdCgpeworCQkkY3JpdEFycmF5ID0gYXJyYXkoKTsKKwkJZm9yZWFjaCgkdGhpcy0+Y3JpdGVyaWEgYXMgJGMpeworCQkJYXJyYXlfcHVzaCgkY3JpdEFycmF5LCAkYy0+dG9YbWxScGNTdHJ1Y3QoKSk7CisJCX0KKwkJcmV0dXJuIG5ldyBYTUxfUlBDX1ZhbHVlKGFycmF5KAorCQkJJ2NyaXRlcmlhJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkY3JpdEFycmF5LCdhcnJheScpKSwgJ3N0cnVjdCcpOworCX0KKworfQorCis/PgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9SYW5nZVF1ZXJ5Q3JpdGVyaWEuY2xhc3MucGhwIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9SYW5nZVF1ZXJ5Q3JpdGVyaWEuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Yjg4MzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL1JhbmdlUXVlcnlDcml0ZXJpYS5jbGFzcy5waHAKQEAgLTAsMCArMSwxNzggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcmVxdWlyZV9vbmNlKCJYTUwvUlBDLnBocCIpOworCisvKioKKyAqIEBhdXRob3IgcmVzbmVjaworICoKKyAqIDxwPkEgUEhQIHBvcnQgb2YgdGhlIGNvcmUgZmlsZW1nciBkYXRhIHN0cnVjdHVyZS48L3A+CisgKi8KKyBjbGFzcyBDQVNfRmlsZW1ncl9SYW5nZVF1ZXJ5Q3JpdGVyaWEgeworIAorIAlwdWJsaWMgJGVsZW1lbnROYW1lOworICAgIHB1YmxpYyAkc3RhcnRWYWx1ZTsKKyAgICBwdWJsaWMgJGVuZFZhbHVlOworICAgIHB1YmxpYyAkaW5jbHVzaXZlOworIAorIAkvKioKKwkgKiA8cD4KKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICogPC9wPi4KKwkgKi8KKwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpeworCQkkdGhpcy0+ZWxlbWVudE5hbWUgPSAnJzsKKwkJJHRoaXMtPnN0YXJ0VmFsdWUgPSAnJzsKKwkJJHRoaXMtPmVuZFZhbHVlID0gJyc7CisJCSR0aGlzLT5pbmNsdXNpdmUgPSB0cnVlOworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydCB2YWx1ZSBmb3IgdGhlIHJhbmdlIHNlYXJjaCBhcyBhIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICBUaGUgZW5kIHZhbHVlIGZvciB0aGUgcmFuZ2Ugc2VhcmNoIGFzIGEgU3RyaW5nLgorICAgICAqIEBwYXJhbSBpbmNsdXNpdmUKKyAgICAgKiAgICAgICAgICAgIEJvb2xlYW46IHRydWUgZm9yIGluY2x1c2l2ZSwgZmFsc2UgZm9yIGV4Y2x1c2l2ZS4KKyAgICAgKi8KKwlmdW5jdGlvbiBfX2luaXQoJGVsZW1lbnROYW1lLCAkc3RhcnQsICRlbmQsICRpbmNsdXNpdmUpeworCQkkdGhpcy0+ZWxlbWVudE5hbWUgPSAkZWxlbWVudE5hbWU7CisJCSR0aGlzLT5zdGFydFZhbHVlID0gJHN0YXJ0OworCQkkdGhpcy0+ZW5kVmFsdWUgPSAkZW5kOworCQkkdGhpcy0+aW5jbHVzaXZlID0gJGluY2x1c2l2ZTsKKwl9CisJCisJZnVuY3Rpb24gX19pbml0WG1sUnBjKCR4bWxScGNEYXRhKXsKKwkJJHRoaXMtPmVsZW1lbnROYW1lID0gKGlzc2V0KCR4bWxScGNEYXRhWydlbGVtZW50TmFtZSddKSkKKwkJCT8gJHhtbFJwY0RhdGFbJ2VsZW1lbnROYW1lJ10gCisJCQk6ICcnOworCQkkdGhpcy0+dmFsdWUgPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ3N0YXJ0J10pKQorCQkJPyAkeG1sUnBjRGF0YVsnc3RhcnQnXSAKKwkJCTogJyc7CisJCSR0aGlzLT52YWx1ZSA9IChpc3NldCgkeG1sUnBjRGF0YVsnZW5kJ10pKQorCQkJPyAkeG1sUnBjRGF0YVsnZW5kJ10gCisJCQk6ICcnOworCQkkdGhpcy0+dmFsdWUgPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ2luY2x1c2l2ZSddKSkKKwkJCT8gKGJvb2wpJHhtbFJwY0RhdGFbJ2luY2x1c2l2ZSddIAorCQkJOiB0cnVlOworCX0KKwkKKwkvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBzdGFydCB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldFN0YXJ0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAkdGhpcy0+c3RhcnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXRhdG9yIG1ldGhvZCBmb3IgdGhlIHN0YXJ0IHZhbHVlIGZvIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGFydCB2YWx1ZSBvZiB0aGUgcmFuZ2UgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgZnVuY3Rpb24gc2V0U3RhcnRWYWx1ZSgkdmFsdWUpIHsKKyAgICAgICAgJHRoaXMtPnN0YXJ0VmFsdWUgPSAkdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgZW5kIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBlbmQgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldEVuZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gJHRoaXMtPmVuZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11dGF0b3IgbWV0aG9kIGZvciB0aGUgZW5kIHZhbHVlIGZvIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbmQgdmFsdWUgb2YgdGhlIHJhbmdlIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIGZ1bmN0aW9uIHNldEVuZFZhbHVlKCR2YWx1ZSkgeworICAgICAgICAkdGhpcy0+ZW5kVmFsdWUgPSAkdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgaW5jbHVzaXZlIHNldHRpbmcgZm9yIHRoZSByYW5nZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBib29sZWFuIGluY2x1c2l2ZS9leGNsdXNpdmUgZmxhZy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBnZXRJbmNsdXNpdmUoKSB7CisgICAgICAgIHJldHVybiAkdGhpcy0+aW5jbHVzaXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11dGF0b3IgbWV0aG9kIGZvciB0aGUgaW5jbHVzaXZlIHNldHRpbmcgZm9yIHRoZSByYW5nZS4gTm90ZSB0aGF0IGZsYWcKKyAgICAgKiBzaG91bGQgYmUgc2V0IHRvIHRydWUgZm9yIGluY2x1c2l2ZSwgZmFsc2UgZm9yIGV4Y2x1c2l2ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5jbHVzaXZlCisgICAgICogICAgICAgICAgICBUaGUgYm9vbGVhbiBpbmNsdXNpdmUvZXhjbHVzaXZlIGZsYWcuCisgICAgICovCisgICAgZnVuY3Rpb24gc2V0SW5jbHVzaXZlKCRmbGFnKSB7CisgICAgICAgICR0aGlzLT5pbmNsdXNpdmUgPSAkZmxhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGluaGVyaXRlZCBmcm9tIFF1ZXJ5Q3JpdGVyaWEgZm9yCisgICAgICogYWNjZXNzaW5nIHRoZSBlbGVtZW50IG5hbWUgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24gYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgZnVuY3Rpb24gZ2V0RWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiAkdGhpcy0+ZWxlbWVudE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBpbmhlcml0ZWQgZnJvbSBRdWVyeUNyaXRlcmlhIGZvcgorICAgICAqIG11dGF0aW5nIHRoZSBlbGVtZW50IG5hbWUgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24gYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgZnVuY3Rpb24gc2V0RWxlbWVudE5hbWUoJGVsZW1lbnROYW1lKSB7CisgICAgICAgICR0aGlzLT5lbGVtZW50TmFtZSA9ICRlbGVtZW50TmFtZTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdG9Bc3NvY0FycmF5KCl7CisgICAgCXJldHVybiBhcnJheSgKKwkJCSdzdGFydFZhbHVlJyA9PiAkdGhpcy0+c3RhcnRWYWx1ZSwKKwkJCSdlbmRWYWx1ZScgPT4gJHRoaXMtPmVuZFZhbHVlLAorCQkJJ2VsZW1lbnROYW1lJyA9PiAkdGhpcy0+ZWxlbWVudE5hbWUsCisJCQknaW5jbHVzaXZlJyA9PiAkdGhpcy0+aW5jbHVzaXZlKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdG9YbWxScGNTdHJ1Y3QoKXsKKyAgICAJJGluY2x1c2l2ZVN0ciA9ICgkdGhpcy0+aW5jbHVzaXZlKQorCQkJPyAndHJ1ZScKKwkJCTogJ2ZhbHNlJzsKKyAgICAJcmV0dXJuIG5ldyBYTUxfUlBDX1ZhbHVlKGFycmF5KAorICAgIAkJJ2NsYXNzJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgnb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhJywgJ3N0cmluZycpLAorCQkJJ2VsZW1lbnRTdGFydFZhbHVlJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+c3RhcnRWYWx1ZSwnc3RyaW5nJyksCisJCQknZWxlbWVudEVuZFZhbHVlJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+ZW5kVmFsdWUsJ3N0cmluZycpLAorCQkJJ2VsZW1lbnROYW1lJyA9PiBuZXcgWE1MX1JQQ19WYWx1ZSgkdGhpcy0+ZWxlbWVudE5hbWUsJ3N0cmluZycpLAorCQkJJ2luY2x1c2l2ZScgPT4gbmV3IFhNTF9SUENfVmFsdWUoJGluY2x1c2l2ZVN0ciwgJ3N0cmluZycpKSwgJ3N0cnVjdCcpOworICAgIH0KKyAKKyB9CisgCisgPz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvVGVybVF1ZXJ5Q3JpdGVyaWEuY2xhc3MucGhwIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9UZXJtUXVlcnlDcml0ZXJpYS5jbGFzcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2N2VkYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvVGVybVF1ZXJ5Q3JpdGVyaWEuY2xhc3MucGhwCkBAIC0wLDAgKzEsMTE2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3JlcXVpcmVfb25jZSgiWE1ML1JQQy5waHAiKTsKKworLyoqCisgKiBAYXV0aG9yIHJlc25lY2sKKyAqCisgKiA8cD5BIFBIUCBwb3J0IG9mIHRoZSBjb3JlIGZpbGVtZ3IgZGF0YSBzdHJ1Y3R1cmUuPC9wPgorICovCitjbGFzcyBDQVNfRmlsZW1ncl9UZXJtUXVlcnlDcml0ZXJpYSB7CisKKwlwdWJsaWMgJGVsZW1lbnROYW1lOworCXB1YmxpYyAkdmFsdWU7CisJCisJLyoqCisJICogPHA+CisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqIDwvcD4uCisJICovCisJZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXsKKwkJJHRoaXMtPmVsZW1lbnROYW1lID0gJyc7CisJCSR0aGlzLT52YWx1ZSA9ICcnOworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbi4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB0ZXJtLgorICAgICAqLworCWZ1bmN0aW9uIF9faW5pdCgkZWxlbWVudE5hbWUsICR2YWx1ZSl7CisJCSR0aGlzLT5lbGVtZW50TmFtZSA9ICRlbGVtZW50TmFtZTsKKwkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOworCX0KKwkKKwlmdW5jdGlvbiBfX2luaXRYbWxScGMoJHhtbFJwY0RhdGEpeworCQkkdGhpcy0+ZWxlbWVudE5hbWUgPSAoaXNzZXQoJHhtbFJwY0RhdGFbJ2VsZW1lbnROYW1lJ10pKQorCQkJPyAkeG1sUnBjRGF0YVsnZWxlbWVudE5hbWUnXSAKKwkJCTogJyc7CisJCSR0aGlzLT52YWx1ZSA9IChpc3NldCgkeG1sUnBjRGF0YVsndmFsdWUnXSkpCisJCQk/ICR4bWxScGNEYXRhWyd2YWx1ZSddIAorCQkJOiAnJzsKKwl9CisJCisJLyoqCisgICAgICogQWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIG9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXRhdG9yIG1ldGhvZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzZXRWYWx1ZSgkdmFsdWUpIHsKKyAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgaW5oZXJpdGVkIGZyb20gUXVlcnlDcml0ZXJpYSBmb3IKKyAgICAgKiBhY2Nlc3NpbmcgdGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBnZXRFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5lbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGluaGVyaXRlZCBmcm9tIFF1ZXJ5Q3JpdGVyaWEgZm9yCisgICAgICogbXV0YXRpbmcgdGhlIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggb24uCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICBUaGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBvbiBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzZXRFbGVtZW50TmFtZSgkZWxlbWVudE5hbWUpIHsKKyAgICAgICAgJHRoaXMtPmVsZW1lbnROYW1lID0gJGVsZW1lbnROYW1lOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiB0b0Fzc29jQXJyYXkoKXsKKyAgICAJcmV0dXJuIGFycmF5KAorCQkJJ3ZhbHVlJyA9PiAkdGhpcy0+dmFsdWUsCisJCQknZWxlbWVudE5hbWUnID0+ICR0aGlzLT5lbGVtZW50TmFtZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRvWG1sUnBjU3RydWN0KCl7CisgICAgCXJldHVybiBuZXcgWE1MX1JQQ19WYWx1ZShhcnJheSgKKyAgICAJCSdjbGFzcycgPT4gbmV3IFhNTF9SUENfVmFsdWUoJ29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhJywgJ3N0cmluZycpLAorCQkJJ2VsZW1lbnRWYWx1ZScgPT4gbmV3IFhNTF9SUENfVmFsdWUoJHRoaXMtPnZhbHVlLCdzdHJpbmcnKSwKKwkJCSdlbGVtZW50TmFtZScgPT4gbmV3IFhNTF9SUENfVmFsdWUoJHRoaXMtPmVsZW1lbnROYW1lLCdzdHJpbmcnKSksICdzdHJ1Y3QnKTsKKyAgICB9CisKK30KKworPz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9waHAvWG1sUnBjRmlsZW1nckNsaWVudC5jbGFzcy5waHAgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL1htbFJwY0ZpbGVtZ3JDbGllbnQuY2xhc3MucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjZhNzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL1htbFJwY0ZpbGVtZ3JDbGllbnQuY2xhc3MucGhwCkBAIC0wLDAgKzEsNDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3JlcXVpcmVfb25jZSgiWE1ML1JQQy5waHAiKTsKKworLyoqCisgKiBYTUwtUlBDIFBIUCB2ZXJzaW9uIG9mIHRoZSBmaWxlIG1hbmFnZXIgY2xpZW50LgorICogCisgKiBOb3QgYWxsIG9mIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkvbWV0aG9kcyBhcmUgcG9ydGVkIHlldAorICogYnV0IHRoaXMgaXMgYSBnb29kIHN0YXJ0LgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiBAYXV0aG9yIHJlc25lY2sKKyAqIAorICovCitjbGFzcyBDQVNfRmlsZW1ncl9YbWxScGNGaWxlbWdyQ2xpZW50IHsKKwlwcml2YXRlICRjbGllbnQ7CQkvLyBUaGUgWE1ML1JQQyBjbGllbnQKKwlwdWJsaWMgJHNlcnZlclVSTDsJCS8vIFRoZSBiYXNlIFVSTCBvZiB0aGUgc2VydmVyIChkZWZhdWx0IGlzIGxvY2FsaG9zdDo5MDAwKQorCXB1YmxpYyAkc2VydmVyUGF0aDsJCS8vIFRoZSBwYXRoIHRvIHRoZSBYTUxSUEMgaGFuZGxlciAoL3BhdGgvdG8veG1scnBjKQorCQorCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRzZXJ2ZXJVUkwgPSAnbG9jYWxob3N0OjkwMDAnLCRzZXJ2ZXJQYXRoID0gJy8nKXsKKwkJJHRoaXMtPnNlcnZlclVSTCA9ICRzZXJ2ZXJVUkw7CisJCSR0aGlzLT5zZXJ2ZXJQYXRoID0gJHNlcnZlclBhdGg7CisJCXRyeSB7CisJCQkkdGhpcy0+Y2xpZW50ID0gbmV3IFhNTF9SUENfQ2xpZW50KCR0aGlzLT5zZXJ2ZXJQYXRoLCR0aGlzLT5zZXJ2ZXJVUkwpOworCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKKwkJCWVjaG8gIjxoND5FcnJvciBjcmVhdGluZyBYTUxSUEMgY2xpZW50OiAiIC4gJGUuZ2V0TWVzc2FnZSgpIC4gIjwvaDQ+IjsKKwkJCWV4aXQoKTsKKwkJfQorCX0KKwkKKwlmdW5jdGlvbiBfX2Rlc3RydWN0KCl7fQorCisJLyoqCisJICogQHBhcmFtIG1ldGhvZFN0cgorICAgICAqCQlUaGUgc3RyaW5nIGZvciB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQgb24gdGhlciBzZXJ2ZXIuCisJICoKKwkgKiBAcGFyYW0gcGFyYW1zCisgICAgICoJCUFuIGFycmF5IG9mIFhNTC1SUEMgZW5jb2RlZCBwYXJhbWV0ZXJzIHRvIHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWxzZU9uRmFpbAorICAgICAqCQlJZiBzZXQgdG8gdHJ1ZSwgc2VuZE1lc3NhZ2Ugd2lsbCByZXR1cm4gZmFsc2Ugb24gYSBmYWlsdXJlLCByYXRoZXIgdGhhbiBleGl0aW5nLgorCSAqCisJICogQHJldHVybiBUaGUgdW4tZGVjb2RlZCBkYXRhIGZyb20gdGhlIG1ldGhvZCBpbnZva2VkIG9uIHRoZSBzZXJ2ZXIuCisJICovCisJcHJpdmF0ZSBmdW5jdGlvbiBzZW5kTWVzc2FnZSgkbWV0aG9kU3RyLCAkcGFyYW1zKXsKKwkJJG1lc3NhZ2UgPSBuZXcgWE1MX1JQQ19NZXNzYWdlKCRtZXRob2RTdHIsICRwYXJhbXMpOworCQkkcmVzcG9uc2UgPSAkdGhpcy0+Y2xpZW50LT5zZW5kKCRtZXNzYWdlKTsKKwkJaWYgKCEkcmVzcG9uc2UpeworCQkJdGhyb3cgbmV3IFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24oIk5vIHJlc3BvbnNlIHdhcyByZWNlaXZlZCBmcm9tIFhtbC1ScGMgQ2xpZW50XG5FcnJvciBtc2c6ICIgLiAkdGhpcy0+Y2xpZW50LT5lcnJzdHIpOworCQl9CisJCWlmICghJHJlc3BvbnNlLT5mYXVsdENvZGUoKSkgeworCQkJJHZhbHVlID0gJHJlc3BvbnNlLT52YWx1ZSgpOworCQkJJGRhdGEgPSBYTUxfUlBDX2RlY29kZSgkdmFsdWUpOworCQkJaWYoaXNzZXQoJGRhdGEtPmZhdWx0U3RyaW5nKSl7CisJCQkJdGhyb3cgbmV3IFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24oIkZhdWx0IFN0cmluZyBpbiBYbWwtUnBjIHJlc3BvbnNlOiAiIC4gJGRhdGFbImZhdWx0U3RyaW5nIl0pOworCQkJfQorCQkJcmV0dXJuICRkYXRhOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24oIkZhdWx0IENvZGUgaW4gWG1sLVJwYyByZXNwb25zZTogIiAuICRyZXNwb25zZS0+ZmF1bHRDb2RlKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBUaHJvd3MgYW4gWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiB0aGF0IGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGUgb25lIGdpdmVuLgorCSAqIAorCSAqIEBwYXJhbSBlCisJICogCQlUaGUgZXhjZXB0aW9uIHRoYXQgbmVlZHMgbW9yZSBpbmZvIGluY2x1ZGVkLgorCSAqIAorCSAqIEBwYXJhbSBmdW5jTmFtZQorCSAqIAkJVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluIHdoaWNoIHRoaXMgdGhlIG9yaWdpbmFsIGVycm9lL2V4Y2VwdGlvbiBvY2N1cnJlZC4KKwkgKi8KKwlwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydEVycm9yKCRlLCAkZnVuY05hbWUpeworCQl0aHJvdyBuZXcgWG1sUnBjRmlsZW1nckV4Y2VwdGlvbigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGVyZm9ybWluZyBmdW5jdGlvbiAiIC4gJGZ1bmNOYW1lIC4gIlxuIiAuICRlLT5nZXRNZXNzYWdlKCkpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEZpbGVNYW5hZ2VyIGlzIHN0aWxsIHJ1bm5pbmcuCisJICovCisJcHVibGljIGZ1bmN0aW9uIGlzQWxpdmUoICRyZXR1cm5PYmplY3QgPSB0cnVlICkgeworICAgICAgIAkkcGFyYW1zID0gYXJyYXkoKTsKKyAgICAgICAJdHJ5eworCSAgICAgICAJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuaXNBbGl2ZSIsICRwYXJhbXMsICRyZXR1cm5PYmplY3QpOworICAgICAgIAl9Y2F0Y2goWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiAkZSl7CisgICAgICAgCQkkdGhpcy0+cmVwb3J0RXJyb3IoJGUsICJpc0FsaXZlIik7CisgICAgICAgCX0KKyAgICAgICAJcmV0dXJuICRkYXRhOworICAgIH0KKworCS8qKgorCSAqIEBwYXJhbSBwcm9kdWN0SUQKKyAgICAgKgkJVGhlIGlkIG9mIHRoZSBkZXNpcmVkIFByb2R1Y3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0dXJuT2JqZWN0CisgICAgICoJCVdoZXRoZXIgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IGFzIG9wcG9zZWQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBQcm9kdWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGlkLgorCSAqLworCWZ1bmN0aW9uIGdldFByb2R1Y3RCeUlkKCRwcm9kdWN0SUQsICRyZXR1cm5PYmplY3QgPSB0cnVlKXsKKwkJJHBhcmFtcyA9IGFycmF5KG5ldyBYTUxfUlBDX1ZhbHVlKCRwcm9kdWN0SUQsJ3N0cmluZycpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0UHJvZHVjdEJ5SWQiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0UHJvZHVjdEJ5SWQiKTsKKyAgICAgICAJfQorCQlpZigkcmV0dXJuT2JqZWN0KXsKKwkJCSRwcm9kdWN0ID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3QoJGRhdGEpOworCQkJcmV0dXJuICRwcm9kdWN0OworCQl9ZWxzZXsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gcHJvZHVjdAorICAgICAqCQlUaGUgcHJvZHVjdCBjb250YWluaW5nIHRoZSBkZXNpcmVkIHJlZmVyZW5jZXMuCisJICoKKwkgKiBAcmV0dXJuIEFuIGFzc29jaWF0aXZlIGFycmF5IHNwZWNpZnlpbmcgdGhlIHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBQcm9kdWN0LgorCSAqLworCWZ1bmN0aW9uIGdldFByb2R1Y3RSZWZlcmVuY2VzKCRwcm9kdWN0KXsKKwkJJHBhcmFtcyA9IGFycmF5KCRwcm9kdWN0LT50b1htbFJwY1N0cnVjdCgpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0UHJvZHVjdFJlZmVyZW5jZXMiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0UHJvZHVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAJfQorCQlyZXR1cm4gJGRhdGE7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBwcm9kdWN0CisgICAgICoJCVRoZSBwcm9kdWN0IHNwZWNpZmllZCBieSB0aGUgZGVzaXJlZCBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXR1cm5PYmplY3QKKyAgICAgKgkJV2hldGhlciBkYXRhIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3QgYXMgb3Bwb3NlZCB0byBhbiBhc3NvY2lhdGl2ZSBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1ldGFkYXRhIHNwZWNpZml5aW5nIHRoZSBnaXZlbiBQcm9kdWN0LgorCSAqLworCWZ1bmN0aW9uIGdldE1ldGFkYXRhKCRwcm9kdWN0LCAkcmV0dXJuT2JqZWN0ID0gdHJ1ZSl7CQorCQkkcGFyYW1zID0gYXJyYXkoJHByb2R1Y3QtPnRvWG1sUnBjU3RydWN0KCkpOworCQl0cnl7CisJCQkkZGF0YSA9ICR0aGlzLT5zZW5kTWVzc2FnZSgiZmlsZW1nci5nZXRNZXRhZGF0YSIsICRwYXJhbXMpOworCQl9Y2F0Y2goWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiAkZSl7CisgICAgICAgCQkkdGhpcy0+cmVwb3J0RXJyb3IoJGUsICJnZXRNZXRhZGF0YSIpOworICAgICAgIAl9CisJCWlmKCRyZXR1cm5PYmplY3QpeworCQkJJG1ldGFkYXRhID0gbmV3IENBU19GaWxlbWdyX01ldGFkYXRhKCRkYXRhKTsKKwkJCXJldHVybiAkbWV0YWRhdGE7CisJCX1lbHNleworCQkJcmV0dXJuICRkYXRhOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSB0eXBlSUQKKyAgICAgKgkJVGhlIElEIG9mIHRoZSBkZXNpcmVkIFByb2R1Y3RUeXBlIGRlZmluZWQgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIEZpbGUgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXR1cm5PYmplY3QKKyAgICAgKgkJV2hldGhlciBkYXRhIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3QgYXMgb3Bwb3NlZCB0byBhbiBhc3NvY2lhdGl2ZSBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIFByb2R1Y3RUeXBlIGNvcmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSUQuCisJICovCisJZnVuY3Rpb24gZ2V0UHJvZHVjdFR5cGVCeUlkKCR0eXBlSUQsICRyZXR1cm5PYmplY3QgPSB0cnVlKXsKKwkJJHBhcmFtcyA9IGFycmF5KG5ldyBYTUxfUlBDX1ZhbHVlKCR0eXBlSUQsJ3N0cmluZycpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0UHJvZHVjdFR5cGVCeUlkIiwgJHBhcmFtcyk7CisJCX1jYXRjaChYbWxScGNGaWxlbWdyRXhjZXB0aW9uICRlKXsKKyAgICAgICAJCSR0aGlzLT5yZXBvcnRFcnJvcigkZSwgImdldFByb2R1Y3RUeXBlQnlJZCIpOworICAgICAgIAl9CisJCWlmKCRyZXR1cm5PYmplY3QpeworCQkJJHB0ID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RUeXBlKCRkYXRhKTsKKwkJCXJldHVybiAkcHQ7CisJCX1lbHNleworCQkJcmV0dXJuICRkYXRhOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSB0eXBlTmFtZQorICAgICAqCQlUaGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBQcm9kdWN0VHlwZSBkZWZpbmVkIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBGaWxlIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0dXJuT2JqZWN0CisgICAgICoJCVdoZXRoZXIgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IGFzIG9wcG9zZWQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBQcm9kdWN0VHlwZSBjb3Jlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG5hbWUuCisJICovCisJZnVuY3Rpb24gZ2V0UHJvZHVjdFR5cGVCeU5hbWUoJHR5cGVOYW1lLCAkcmV0dXJuT2JqZWN0ID0gdHJ1ZSl7CisJCSRwYXJhbXMgPSBhcnJheShuZXcgWE1MX1JQQ19WYWx1ZSgkdHlwZU5hbWUsJ3N0cmluZycpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0UHJvZHVjdFR5cGVCeU5hbWUiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0UHJvZHVjdFR5cGVCeU5hbWUiKTsKKyAgICAgICAJfQorCQlpZigkcmV0dXJuT2JqZWN0KXsKKwkJCSRwdCA9IG5ldyBDQVNfRmlsZW1ncl9Qcm9kdWN0VHlwZSgkZGF0YSk7CisJCQlyZXR1cm4gJHB0OworCQl9ZWxzZXsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorICAgICAqCQlUaGUgZGVzaXJlZCBQcm9kdWN0VHlwZSBkZWZpbmVkIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBGaWxlIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0dXJuT2JqZWN0CisgICAgICoJCVdoZXRoZXIgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IGFzIG9wcG9zZWQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGFsbCBQcm9kdWN0cyBpbiB0aGUgcmVwb3NpdG9yeSBvZiB0aGUgZ2l2ZW4gUHJvZHVjdFR5cGUuCisJICovCisJZnVuY3Rpb24gZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKCR0eXBlLCAkcmV0dXJuT2JqZWN0ID0gdHJ1ZSl7CisJCSRwYXJhbXMgPSBhcnJheSgkdHlwZS0+dG9YbWxScGNTdHJ1Y3QoKSk7CisJCXRyeXsKKwkJCSRkYXRhID0gJHRoaXMtPnNlbmRNZXNzYWdlKCJmaWxlbWdyLmdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZSIsICRwYXJhbXMpOworCQl9Y2F0Y2goWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiAkZSl7CisgICAgICAgCQkkdGhpcy0+cmVwb3J0RXJyb3IoJGUsICJnZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUiKTsKKyAgICAgICAJfQorCQlpZigkcmV0dXJuT2JqZWN0KXsKKwkJCSRwcm9kdWN0cyA9IGFycmF5KCk7CisJCQlmb3JlYWNoKCRkYXRhIGFzICRkKXsKKwkJCQkkcCA9IG5ldyBDQVNfRmlsZW1ncl9Qcm9kdWN0KCRkKTsKKwkJCQlhcnJheV9wdXNoKCRwcm9kdWN0cywgJHApOworCQkJfQorCQkJcmV0dXJuICRwcm9kdWN0czsKKwkJfWVsc2V7CisJCQlyZXR1cm4gJGRhdGE7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcmV0dXJuT2JqZWN0CisgICAgICoJCVdoZXRoZXIgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IGFzIG9wcG9zZWQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGFsbCBQcm9kdWN0VHlwZXMgZGVmaW5lZCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgRmlsZSBNYW5hZ2VyLgorCSAqLworCWZ1bmN0aW9uIGdldFByb2R1Y3RUeXBlcygkcmV0dXJuT2JqZWN0ID0gdHJ1ZSl7CisJCSRwYXJhbXMgPSBhcnJheSgpOworCQl0cnl7CisJCQkkZGF0YSA9ICR0aGlzLT5zZW5kTWVzc2FnZSgiZmlsZW1nci5nZXRQcm9kdWN0VHlwZXMiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0UHJvZHVjdFR5cGVzIik7CisgICAgICAgCX0KKwkJaWYoJHJldHVybk9iamVjdCl7CisJCQkkdHlwZXMgPSBhcnJheSgpOworCQkJZm9yZWFjaCgkZGF0YSBhcyAkZCl7CisJCQkJJHB0ID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RUeXBlKCRkKTsKKwkJCQlhcnJheV9wdXNoKCR0eXBlcywgJHB0KTsKKwkJCX0KKwkJCXJldHVybiAkdHlwZXM7CisJCX1lbHNleworCQkJcmV0dXJuICRkYXRhOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSB0eXBlCisgICAgICoJCVRoZSBkZXNpcmVkIFByb2R1Y3RUeXBlIGRlZmluZWQgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIEZpbGUgTWFuYWdlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwcm9kdWN0cyBvZiB0aGUgZ2l2ZW4gUHJvZHVjdFR5cGUgaW4gdGhlIHJlcG9zaXRvcnkuCisJICovCisgICAgZnVuY3Rpb24gZ2V0TnVtUHJvZHVjdHMoJHR5cGUpeworCQkkcGFyYW1zID0gYXJyYXkoJHR5cGUtPnRvWG1sUnBjU3RydWN0KCkpOworCQl0cnl7CisJCQkkZGF0YSA9ICR0aGlzLT5zZW5kTWVzc2FnZSgiZmlsZW1nci5nZXROdW1Qcm9kdWN0cyIsICRwYXJhbXMpOworCQl9Y2F0Y2goWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiAkZSl7CisgICAgICAgCQkkdGhpcy0+cmVwb3J0RXJyb3IoJGUsICJnZXROdW1Qcm9kdWN0cyIpOworICAgICAgIAl9CisJCXJldHVybiAkZGF0YTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHF1ZXJ5CisgICAgICoJCUEgUXVlcnkgb2JqZWN0IGNvbnRhaW5pbmcgUXVlcnlDcnRlcmlhIG9iamVjdHMgZGVmaW5pbmcgdGhlIHNlYXJjaC4KKwkgKgorCSAqIEBwYXJhbSB0eXBlCisgICAgICoJCUEgUHJvZHVjdFR5cGUgb2JqZWN0IGRlZmluaW5nIHdoYXQgdHlwZXMgdG8gc2VhcmNoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhZ2VOdW0KKyAgICAgKgkJVGhlIGRlc2lyZWQgbnVtYmVyIG9mIHRoZSBwYWdlIGluIHRoZSBzZXQgb2YgcXVlcnkgcmVzdWx0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXR1cm5PYmplY3QKKyAgICAgKgkJV2hldGhlciBkYXRhIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3QgYXMgb3Bwb3NlZCB0byBhbiBhc3NvY2lhdGl2ZSBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gQSBQcm9kdWN0UGFnZSBvYmplY3QgY29udGFpbmluZyBxdWVyeSByZXN1bHRzCisJICovCisJZnVuY3Rpb24gcGFnZWRRdWVyeSgkcXVlcnksICR0eXBlLCAkcGFnZU51bSwgJHJldHVybk9iamVjdCA9IHRydWUpeworCQkkcGFyYW1zID0gYXJyYXkoCisJCQkkcXVlcnktPnRvWG1sUnBjU3RydWN0KCksCisJCQkkdHlwZS0+dG9YbWxScGNTdHJ1Y3QoKSwKKwkJCW5ldyBYTUxfUlBDX1ZhbHVlKCRwYWdlTnVtLCdpbnQnKSk7CisJCXRyeXsKKwkJCSRkYXRhID0gJHRoaXMtPnNlbmRNZXNzYWdlKCJmaWxlbWdyLnBhZ2VkUXVlcnkiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAicGFnZWRRdWVyeSIpOworICAgICAgIAl9CisJCWlmKCRyZXR1cm5PYmplY3QpeworCQkJJHByb2R1Y3RQYWdlID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RQYWdlKCk7CisJCQkkcHJvZHVjdFBhZ2UtPl9faW5pdFhtbFJwYygkZGF0YSk7CisJCQlyZXR1cm4gJHByb2R1Y3RQYWdlOworCQl9ZWxzZXsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gcXVlcnkKKyAgICAgKgkJQSBRdWVyeSBvYmplY3QgY29udGFpbmluZyBRdWVyeUNydGVyaWEgb2JqZWN0cyBkZWZpbmluZyB0aGUgc2VhcmNoLgorCSAqCisJICogQHBhcmFtIHR5cGUKKyAgICAgKgkJQSBQcm9kdWN0VHlwZSBvYmplY3QgZGVmaW5pbmcgd2hhdCB0eXBlcyB0byBzZWFyY2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0dXJuT2JqZWN0CisgICAgICoJCVdoZXRoZXIgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IGFzIG9wcG9zZWQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFByb2R1Y3Qgb2JqZWN0cyBhcyBxdWVyeSByZXN1bHRzLgorCSAqLworCWZ1bmN0aW9uIHF1ZXJ5KCRxdWVyeSwgJHR5cGUsICRyZXR1cm5PYmplY3QgPSB0cnVlKXsKKwkJJHBhcmFtcyA9IGFycmF5KAorCQkJJHF1ZXJ5LT50b1htbFJwY1N0cnVjdCgpLAorCQkJJHR5cGUtPnRvWG1sUnBjU3RydWN0KCkpOworCQl0cnl7CisJCQkkZGF0YSA9ICR0aGlzLT5zZW5kTWVzc2FnZSgiZmlsZW1nci5xdWVyeSIsICRwYXJhbXMpOworCQl9Y2F0Y2goWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiAkZSl7CisgICAgICAgCQkkdGhpcy0+cmVwb3J0RXJyb3IoJGUsICJxdWVyeSIpOworICAgICAgIAl9CisJCWlmKCRyZXR1cm5PYmplY3QpeworCQkJJHByb2R1Y3RzID0gYXJyYXkoKTsKKwkJCWZvcmVhY2goJGRhdGEgYXMgJGQpeworCQkJCSRwID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3QoJGQpOworCQkJCWFycmF5X3B1c2goJHByb2R1Y3RzLCAkcCk7CisJCQl9CisJCQlyZXR1cm4gJHByb2R1Y3RzOworCQl9ZWxzZXsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorICAgICAqCQlUaGUgZGVzaXJlZCBQcm9kdWN0VHlwZSBkZWZpbmVkIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBGaWxlIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0dXJuT2JqZWN0CisgICAgICoJCVdoZXRoZXIgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IGFzIG9wcG9zZWQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisJICoKKwkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIEVsZW1lbnQgb2JqZWN0cyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlIGdpdmVuIFByb2R1Y3RUeXBlLgorCSAqLworCWZ1bmN0aW9uIGdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZSgkdHlwZSwgJHJldHVybk9iamVjdCA9IHRydWUpeworCQkkcGFyYW1zID0gYXJyYXkoJHR5cGUtPnRvWG1sUnBjU3RydWN0KCkpOworCQl0cnl7CisJCQkkZGF0YSA9ICR0aGlzLT5zZW5kTWVzc2FnZSgiZmlsZW1nci5nZXRFbGVtZW50c0J5UHJvZHVjdFR5cGUiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0RWxlbWVudHNCeVByb2R1Y3RUeXBlIik7CisgICAgICAgCX0KKwkJaWYoJHJldHVybk9iamVjdCl7CisJCQkkZWxlbWVudHMgPSBhcnJheSgpOworCQkJZm9yZWFjaCgkZGF0YSBhcyAkZCl7CisJCQkJJGUgPSBuZXcgQ0FTX0ZpbGVtZ3JfRWxlbWVudCgpOworCQkJCSRlLT5fX2luaXRYbWxScGMoJGQpOworCQkJCWFycmF5X3B1c2goJGVsZW1lbnRzLCAkZSk7CisJCQl9CisJCQlyZXR1cm4gJGVsZW1lbnRzOworCQl9ZWxzZXsKKwkJCXJldHVybiAkZGF0YTsKKwkJfQorCX0KKwkKKwkvKiBQYWdpbmF0aW9uIEFQSSAqLworCQorCWZ1bmN0aW9uIGdldEZpcnN0UGFnZSgkdHlwZSwgJHJldHVybk9iamVjdCA9IHRydWUpeworCQkkcGFyYW1zID0gYXJyYXkoJHR5cGUtPnRvWG1sUnBjU3RydWN0KCkpOworCQl0cnl7CisJCQkkZGF0YSA9ICR0aGlzLT5zZW5kTWVzc2FnZSgiZmlsZW1nci5nZXRGaXJzdFBhZ2UiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0Rmlyc3RQYWdlIik7CisgICAgICAgCX0KKwkJaWYoJHJldHVybk9iamVjdCl7CisJCQkkcGFnZSA9IG5ldyBDQVNfRmlsZW1ncl9Qcm9kdWN0UGFnZSgpOworCQkJJHBhZ2UtPl9faW5pdFhtbFJwYygkZGF0YSk7CisJCQlyZXR1cm4gJHBhZ2U7CisJCX1lbHNleworCQkJcmV0dXJuICRkYXRhOworCQl9CisJfQorCQorCWZ1bmN0aW9uIGdldE5leHRQYWdlKCR0eXBlLCAkcGFnZSwgJHJldHVybk9iamVjdCA9IHRydWUpeworCQkkcGFyYW1zID0gYXJyYXkoJHR5cGUtPnRvWG1sUnBjU3RydWN0KCksICRwYWdlLT50b1htbFJwY1N0cnVjdCgpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0TmV4dFBhZ2UiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0TmV4dFBhZ2UiKTsKKyAgICAgICAJfQorCQlpZigkcmV0dXJuT2JqZWN0KXsKKwkJCSRwYWdlID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RQYWdlKCk7CisJCQkkcGFnZS0+X19pbml0WG1sUnBjKCRkYXRhKTsKKwkJCXJldHVybiAkcGFnZTsKKwkJfWVsc2V7CisJCQlyZXR1cm4gJGRhdGE7CisJCX0JCisJfQorCQorCWZ1bmN0aW9uIGdldFByZXZQYWdlKCR0eXBlLCAkcGFnZSwgJHJldHVybk9iamVjdCA9IHRydWUpeworCQkkcGFyYW1zID0gYXJyYXkoJHR5cGUtPnRvWG1sUnBjU3RydWN0KCksICRwYWdlLT50b1htbFJwY1N0cnVjdCgpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0UHJldlBhZ2UiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0UHJldlBhZ2UiKTsKKyAgICAgICAJfQorCQlpZigkcmV0dXJuT2JqZWN0KXsKKwkJCSRwYWdlID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RQYWdlKCk7CisJCQkkcGFnZS0+X19pbml0WG1sUnBjKCRkYXRhKTsKKwkJCXJldHVybiAkcGFnZTsKKwkJfWVsc2V7CisJCQlyZXR1cm4gJGRhdGE7CisJCX0JCQkKKwl9CisJCisJZnVuY3Rpb24gZ2V0TGFzdFBhZ2UoJHR5cGUsICRyZXR1cm5PYmplY3QgPSB0cnVlKXsKKwkJJHBhcmFtcyA9IGFycmF5KCR0eXBlLT50b1htbFJwY1N0cnVjdCgpKTsKKwkJdHJ5eworCQkJJGRhdGEgPSAkdGhpcy0+c2VuZE1lc3NhZ2UoImZpbGVtZ3IuZ2V0TGFzdFBhZ2UiLCAkcGFyYW1zKTsKKwkJfWNhdGNoKFhtbFJwY0ZpbGVtZ3JFeGNlcHRpb24gJGUpeworICAgICAgIAkJJHRoaXMtPnJlcG9ydEVycm9yKCRlLCAiZ2V0TGFzdFBhZ2UiKTsKKyAgICAgICAJfQorCQlpZigkcmV0dXJuT2JqZWN0KXsKKwkJCSRwYWdlID0gbmV3IENBU19GaWxlbWdyX1Byb2R1Y3RQYWdlKCk7CisJCQkkcGFnZS0+X19pbml0WG1sUnBjKCRkYXRhKTsKKwkJCXJldHVybiAkcGFnZTsKKwkJfWVsc2V7CisJCQlyZXR1cm4gJGRhdGE7CisJCX0JCQorCX0KKwkKK30KKworY2xhc3MgWG1sUnBjRmlsZW1nckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbnt9CisKKz8+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcGhwL3BhY2thZ2UueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9wYWNrYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWU4M2VjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3BocC9wYWNrYWdlLnhtbApAQCAtMCwwICsxLDEwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworICBAcGFja2FnZSBDQVNfRmlsZW1ncgorICBAYXV0aG9yIENocmlzIEEuIE1hdHRtYW5uCistLT4KKzxwYWNrYWdlIHZlcnNpb249IjIuMCIgeG1sbnM9Imh0dHA6Ly9wZWFyLnBocC5uZXQvZHRkL3BhY2thZ2UtMi4wIgorICB4bWxuczp0YXNrcz0iaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvdGFza3MtMS4wIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9wZWFyLnBocC5uZXQvZHRkL3Rhc2tzLTEuMC54c2QKKyAgICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvZHRkL3BhY2thZ2UtMi4wCisgICAgICAgICBodHRwOi8vcGVhci5waHAubmV0L2R0ZC9wYWNrYWdlLTIuMC54c2QiPgorICA8bmFtZT5BcGFjaGVfT09EVF9DQVNfRmlsZW1ncjwvbmFtZT4KKyAgPGNoYW5uZWw+cGVhci5hcGFjaGUub3JnL29vZHQ8L2NoYW5uZWw+CisgIDxzdW1tYXJ5PlBIUCBDQVMgRmlsZW1nciBDbGllbnQgYW5kIHN1cHBvcnRpbmcgQVBJIGNsYXNzZXM8L3N1bW1hcnk+CisgIDxkZXNjcmlwdGlvbj4KKyAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBQSFAtYmFzZWQgWE1MLVJQQyBjbGllbnQgZm9yIHRoZSBDQVMgZmlsZW1ncgorICAgIGNvbXBvbmVudC4gVGhvdWdoIGluY29tcGxldGUsIHRoZSBsb25nIHRlcm0gZ29hbHMgYXJlIHRvIHN1cHBvcnQgdGhlIHNhbWUKKyAgICBjb21tYW5kIGxpbmUgYW5kIEFQSSBhY2Nlc3MgdGhhdCB0aGUgSmF2YS1iYXNlZCBjbGllbnQgcHJvdmlkZXMuCisgIDwvZGVzY3JpcHRpb24+CisgIDxsZWFkPgorICAgIDxuYW1lPkNocmlzIE1hdHRtYW5uPC9uYW1lPgorICAgIDx1c2VyPm1hdHRtYW5uPC91c2VyPgorICAgIDxlbWFpbD5jaHJpcy5tYXR0bWFubkBqcGwubmFzYS5nb3Y8L2VtYWlsPgorICAgIDxhY3RpdmU+eWVzPC9hY3RpdmU+CisgIDwvbGVhZD4KKyAgPGRhdGU+MjAxMy0wNi0yOTwvZGF0ZT4KKyAgPHZlcnNpb24+CisgICAgPHJlbGVhc2U+MC42LjA8L3JlbGVhc2U+CisgICAgPGFwaT4wLjYuMDwvYXBpPgorICA8L3ZlcnNpb24+CisgIDxzdGFiaWxpdHk+CisgICAgPHJlbGVhc2U+c3RhYmxlPC9yZWxlYXNlPgorICAgIDxhcGk+c3RhYmxlPC9hcGk+CisgIDwvc3RhYmlsaXR5PgorICA8bGljZW5zZQorICAgIHVyaT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj4KKyAgICBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgPC9saWNlbnNlPgorICA8bm90ZXM+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgUEhQLWJhc2VkIFhNTC1SUEMgY2xpZW50IGZvciB0aGUgQ0FTIGZpbGVtZ3IKKyAgICBjb21wb25lbnQuIFRob3VnaCBpbmNvbXBsZXRlLCB0aGUgbG9uZyB0ZXJtIGdvYWxzIGFyZSB0byBzdXBwb3J0IHRoZSBzYW1lCisgICAgY29tbWFuZCBsaW5lIGFuZCBBUEkgYWNjZXNzIHRoYXQgdGhlIEphdmEtYmFzZWQgY2xpZW50IHByb3ZpZGVzLgorICA8L25vdGVzPgorICA8Y29udGVudHM+CisgICAgPGRpciBuYW1lPSIvIiBiYXNlaW5zdGFsbGRpcj0iQ0FTL0ZpbGVtZ3IiPgorICAgICAgPGZpbGUgbmFtZT0iQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuY2xhc3MucGhwIiByb2xlPSJwaHAiIC8+CisgICAgICA8ZmlsZSBuYW1lPSJFbGVtZW50LmNsYXNzLnBocCIgcm9sZT0icGhwIiAvPgorICAgICAgPGZpbGUgbmFtZT0iTWV0YWRhdGEuY2xhc3MucGhwIiByb2xlPSJwaHAiIC8+CisgICAgICA8ZmlsZSBuYW1lPSJQcm9kdWN0LmNsYXNzLnBocCIgcm9sZT0icGhwIiAvPgorICAgICAgPGZpbGUgbmFtZT0iUHJvZHVjdFBhZ2UuY2xhc3MucGhwIiByb2xlPSJwaHAiIC8+CisgICAgICA8ZmlsZSBuYW1lPSJQcm9kdWN0VHlwZS5jbGFzcy5waHAiIHJvbGU9InBocCIgLz4KKyAgICAgIDxmaWxlIG5hbWU9IlF1ZXJ5LmNsYXNzLnBocCIgcm9sZT0icGhwIiAvPgorICAgICAgPGZpbGUgbmFtZT0iUmFuZ2VRdWVyeUNyaXRlcmlhLmNsYXNzLnBocCIgcm9sZT0icGhwIiAvPgorICAgICAgPGZpbGUgbmFtZT0iVGVybVF1ZXJ5Q3JpdGVyaWEuY2xhc3MucGhwIiByb2xlPSJwaHAiIC8+CisgICAgICA8ZmlsZSBuYW1lPSJYbWxScGNGaWxlbWdyQ2xpZW50LmNsYXNzLnBocCIgcm9sZT0icGhwIiAvPgorICAgIDwvZGlyPjwhLS0gLyAtLT4KKyAgPC9jb250ZW50cz4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8cmVxdWlyZWQ+CisgICAgICA8cGhwPgorICAgICAgICA8bWluPjUuMS42PC9taW4+CisgICAgICA8L3BocD4KKyAgICAgIDxwZWFyaW5zdGFsbGVyPgorICAgICAgICA8bWluPjEuNi4xPC9taW4+CisgICAgICA8L3BlYXJpbnN0YWxsZXI+CisgICAgPC9yZXF1aXJlZD4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxwaHByZWxlYXNlIC8+CisgIDxjaGFuZ2Vsb2c+CisgICAgPHJlbGVhc2U+CisgICAgICA8dmVyc2lvbj4KKyAgICAgICAgPHJlbGVhc2U+MS4wLjA8L3JlbGVhc2U+CisgICAgICAgIDxhcGk+MS4wLjA8L2FwaT4KKyAgICAgIDwvdmVyc2lvbj4KKyAgICAgIDxzdGFiaWxpdHk+CisgICAgICAgIDxyZWxlYXNlPnN0YWJsZTwvcmVsZWFzZT4KKyAgICAgICAgPGFwaT5zdGFibGU8L2FwaT4KKyAgICAgIDwvc3RhYmlsaXR5PgorICAgICAgPGRhdGU+MjAwOC0xMC0yNDwvZGF0ZT4KKyAgICAgIDxsaWNlbnNlCisgICAgICAgIHVyaT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOQ0UtMi4wIj4KKyAgICAgICAgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgICA8L2xpY2Vuc2U+CisgICAgICA8bm90ZXM+CisgICAgICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyBhIFBIUC1iYXNlZCBYTUwtUlBDIGNsaWVudCBmb3IgdGhlIENBUyBmaWxlbWdyCisgICAgICAgIGNvbXBvbmVudC4gVGhvdWdoIGluY29tcGxldGUsIHRoZSBsb25nIHRlcm0gZ29hbHMgYXJlIHRvIHN1cHBvcnQgdGhlCisgICAgICAgIHNhbWUgY29tbWFuZCBsaW5lIGFuZCBBUEkgYWNjZXNzIHRoYXQgdGhlIEphdmEtYmFzZWQgY2xpZW50IHByb3ZpZGVzLgorICAgICAgPC9ub3Rlcz4KKyAgICA8L3JlbGVhc2U+CisgIDwvY2hhbmdlbG9nPgorPC9wYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3B5dGhvbi9mbS5jb25mIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3B5dGhvbi9mbS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTY0MzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcHl0aG9uL2ZtLmNvbmYKQEAgLTAsMCArMSw0MyBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKworW2luZGV4XQorIyBUaGUgcGF0aCBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBMdWNlbmUgc2VhcmNoIGVuZ2luZQorIyB3aWxsIGJ1aWxkIGl0cyBpbmRleGVzLiAgVGhlIHBhdGggcmVmZXJzIHRvIGEgZGlyZWN0b3J5OyBpdCB3aWxsIGJlIGNyZWF0ZWQKKyMgaWYgaXQgZG9lc24ndCBleGlzdC4gIElmIGl0IGRvZXMgZXhpc3QsIGl0IG11c3QgcmVmZXIgdG8gYW4KKyMgZXhpc3RpbmcgTHVjZW5lIGluZGV4IHdpdGggY29ycmVjdCBzdWItZmlsZXMgcHJlc2VudC4gIFNvLCBkb24ndCBtYWtlIHRoaXMKKyMgZGlyZWN0b3J5IG1hbnVhbGx5LCBvciB5b3UnbGwgYmUgY29uZnVzZWQgYnkgZXJyb3IgbWVzc2FnZXMhCitwYXRoID0gQElOREVYX1BBVEhACitwYWdlU2l6ZSA9IDIwCisKK1twb2xpY2llc10KKyMgVGhlICdyZXBvJyBhbmQgJ3ZhbGlkYXRpb24nIGFyZSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2YgVVJMcy4gIFR5cGljYWxseSwgdGhleQorIyBjb250YWluIGEgc2luZ2xlICJmaWxlOiIgc3R5bGUgVVJMIHRoYXQgbmFtZXMgYSBkaXJlY3Rvcnkgd2l0aCBwb2xpY3kgWE1MIGZpbGVzCisjIHdpdGhpbi4gIFRoZSAndXNlcicgaWRlbnRpZmllcyB0aGUgdXNlciBkYXRhYmFzZS4gIEl0J2xsIGJlIGNyZWF0ZWQgaWYgaXQKKyMgZG9lc24ndCBleGlzdC4KK3JlcG8gPSBAUkVQT19QT0xJQ1lfVVJMU0AKK3ZhbGlkYXRpb24gPSBAVkFMSURBVElPTl9QT0xJQ1lfVVJMU0AKK3VzZXIgPSBAVVNFUl9EQl9QQVRIQAorCitbZmFjdG9yaWVzXQorIyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGhlcmUgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZywKKyMgYW5kIHRydXN0IG1lLCB5b3UgZG9uJ3QuICBEb24ndCB0YWtlIGl0IHBlcnNvbmFsbHkuICBJdCdzIGp1c3QgYSBmYWN0LgorY2F0YWxvZyA9IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5CityZXBvc2l0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuWE1MUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5CitkYXRhdHJhbnNmZXIgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeQordmFsaWRhdGlvbiA9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvbkxheWVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3B5dGhvbi9mbS5weSBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9weXRob24vZm0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlZDA0NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9weXRob24vZm0ucHkKQEAgLTAsMCArMSw1NTQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBlbmNvZGluZzogdXRmLTgKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKycnJworQ0FTIEZpbGVtZ3IgUHl0aG9uIFNlcnZlcgorCitUaGlzIGlzIHRoZSBQeXRob24gc2VydmVyIEFQSSBmb3IgYW4gYXV0aGVudGljYXRlZCBDYXRhbG9nIGFuZCBBcmNoaXZlIFN5c3RlbS4gIEl0IHVzZXMgdGhlCitPT0RUIENhdGFsb2cgYW5kIEFyY2hpdmUgU3lzdGVtIGFzIGl0cyBjb3JlLCBhZGRpbmcgdXNlci9wYXNzd29yZC1iYXNlZCBhdXRoZW50aWNhdGlvbgorYW5kIHJvbGUtYmFzZWQgYXV0aG9yaXphdGlvbi4KKycnJworCitpbXBvcnQgc3lzLCBvcywgb3MucGF0aAoraW1wb3J0IGdldG9wdCwgc2hhLCBwaWNrbGUKKworZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlcgorZnJvbSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLmF1dGggaW1wb3J0IFNlY3VyZVdlYlNlcnZlciwgRGlzcGF0Y2hlciwgUmVzdWx0Citmcm9tIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIgaW1wb3J0IFRyYW5zZmVyU3RhdHVzVHJhY2tlcgorZnJvbSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cyBpbXBvcnQgUHJvZHVjdAorZnJvbSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbCBpbXBvcnQgR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeQorZnJvbSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbCBpbXBvcnQgWG1sUnBjU3RydWN0RmFjdG9yeSBhcyBTdHJ1Y3RzCitmcm9tIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEgaW1wb3J0IE1ldGFkYXRhCitmcm9tIGphdmEubGFuZyBpbXBvcnQgQm9vbGVhbiwgRG91YmxlLCBJbnRlZ2VyCitmcm9tIGphdmEudXRpbCBpbXBvcnQgSGFzaHRhYmxlLCBWZWN0b3IKKworIyBXZSBjaG9vc2UgdGhlc2UgZGVmYXVsdCBmYWN0b3J5IGNsYXNzZXMgYmVjYXVzZSBpdCBtaW5pbWl6ZXMgb3VyIGRlcGVuZGVuY2llcworIyBvbiBoZWF2eXdlaWdodCBleHRlcm5hbCBwYWNrYWdlcywgbGlrZSBzbWVsbHkgb2xkIFNRTCBkYXRhYmFzZXMuCitfZGVmYXVsdEZhY3RvcmllcyA9IHsKKwknY2F0YWxvZyc6ICdvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeScsCisJJ3JlcG9zaXRvcnknOiAnb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuWE1MUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5JywKKwknZGF0YXRyYW5zZmVyJzogJ29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5JywKKwkndmFsaWRhdGlvbic6ICdvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5JworfQorCisjIEFsbCBhdmFpbGFibGUgcGVybWlzc2lvbnMuICBCeSBkZWZhdWx0LCB0aGUgInJvb3QiIHVzZXIgd2lsbCBiZSBpbiB0aGUgIndoZWVsIgorIyBncm91cCBhbmQgd2lsbCBoYXZlIHRoZXNlIHBlcm1pc3Npb25zLgorX2FsbFBlcm1zID0gWworCSdmaWxlbWdyLmFkZE1ldGFkYXRhJywKKwknZmlsZW1nci5hZGRQcm9kdWN0UmVmZXJlbmNlcycsCisJJ2ZpbGVtZ3IuYWRkUHJvZHVjdFR5cGUnLAorCSdmaWxlbWdyLmNhdGFsb2dQcm9kdWN0JywKKwknZmlsZW1nci5nZXRDdXJyZW50RmlsZVRyYW5zZmVyJywKKwknZmlsZW1nci5nZXRDdXJyZW50RmlsZVRyYW5zZmVycycsCisJJ2ZpbGVtZ3IuZ2V0RWxlbWVudEJ5SWQnLAorCSdmaWxlbWdyLmdldEVsZW1lbnRCeU5hbWUnLAorCSdmaWxlbWdyLmdldEVsZW1lbnRzQnlQcm9kdWN0VHlwZScsCisJJ2ZpbGVtZ3IuZ2V0Rmlyc3RQYWdlJywKKwknZmlsZW1nci5nZXRMYXN0UGFnZScsCisJJ2ZpbGVtZ3IuZ2V0TWV0YWRhdGEnLAorCSdmaWxlbWdyLmdldE5leHRQYWdlJywKKwknZmlsZW1nci5nZXROdW1Qcm9kdWN0cycsCisJJ2ZpbGVtZ3IuZ2V0UHJldlBhZ2UnLAorCSdmaWxlbWdyLmdldFByb2R1Y3RCeUlkJywKKwknZmlsZW1nci5nZXRQcm9kdWN0QnlOYW1lJywKKwknZmlsZW1nci5nZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQnLAorCSdmaWxlbWdyLmdldFByb2R1Y3RSZWZlcmVuY2VzJywKKwknZmlsZW1nci5nZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUnLAorCSdmaWxlbWdyLmdldFByb2R1Y3RUeXBlQnlJZCcsCisJJ2ZpbGVtZ3IuZ2V0UHJvZHVjdFR5cGVCeU5hbWUnLAorCSdmaWxlbWdyLmdldFByb2R1Y3RUeXBlcycsCisJJ2ZpbGVtZ3IuZ2V0UmVmUGN0VHJhbnNmZXJyZWQnLAorCSdmaWxlbWdyLmdldFRvcE5Qcm9kdWN0cycsCisJJ2ZpbGVtZ3IuaGFuZGxlUmVxdWVzdCcsCisJJ2ZpbGVtZ3IuaGFzUHJvZHVjdCcsCisJJ2ZpbGVtZ3IuaW5nZXN0UHJvZHVjdCcsCisJJ2ZpbGVtZ3IuaXNUcmFuc2ZlckNvbXBsZXRlJywKKwknZmlsZW1nci5wYWdlZFF1ZXJ5JywKKwknZmlsZW1nci5xdWVyeScsCisJJ2ZpbGVtZ3IucmVtb3ZlRmlsZScsCisJJ2ZpbGVtZ3IucmVtb3ZlUHJvZHVjdFRyYW5zZmVyU3RhdHVzJywKKwknZmlsZW1nci5zZXRQcm9kdWN0VHJhbnNmZXJTdGF0dXMnLAorCSdmaWxlbWdyLnRyYW5zZmVyRmlsZScsCisJJ2ZpbGVtZ3IudHJhbnNmZXJyaW5nUHJvZHVjdCcsCisJJ3VzZXJtZ3IuYWRkR3JvdXAnLAorCSd1c2VybWdyLmFkZFBlcm1pc3Npb25Ub0dyb3VwJywKKwkndXNlcm1nci5hZGRVc2VyJywKKwkndXNlcm1nci5hZGRVc2VyVG9Hcm91cCcsCisJJ3VzZXJtZ3IucmVtb3ZlR3JvdXAnLAorCSd1c2VybWdyLnJlbW92ZVBlcm1pc3Npb25Gcm9tR3JvdXAnLAorCSd1c2VybWdyLnJlbW92ZVVzZXInLAorCSd1c2VybWdyLnJlbW92ZVVzZXJGcm9tR3JvdXAnCitdCisKK2RlZiBfdG9KYXZhQm9vbGVhbih0cnV0aGluZXNzKToKKwknJydDb252ZXJ0IGEgUHl0aG9uIGJvb2xlYW4gaW50byB0aGUgc3RyaW5nIGZvcm1hdCB0aGF0IEphdmEgdXNlczogdHJ1ZSBvciBmYWxzZS4KKwknJycKKwlpZiB0cnV0aGluZXNzOgorCQlyZXR1cm4gJ3RydWUnCisJZWxzZToKKwkJcmV0dXJuICdmYWxzZScKKwkKKworZGVmIF9lbmNvZGVQYXNzd29yZChwdyk6CisJJycnRW5jb2RlIGEgcGFzc3dvcmQgdXNpbmcgYW4gU0hBLTEgZGlnZXN0LgorCScnJworCXJldHVybiBzaGEubmV3KHB3KS5kaWdlc3QoKQorCQorCitjbGFzcyBVc2VyOgorCScnJ0EgdXNlciBvZiB0aGUgQ0FTLiAgVXNlcnMgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9ucyBkaXJlY3RseTsgaW5zdGVhZCB0aGV5IHJlY2VpdmUKKwl0aGVtIGltcGxpY2l0bHkgYnkgYmVpbmcgbWVtYmVycyBvZiBncm91cHMsIHdoaWNoIGRvIGhhdmUgcGVybWlzc2lvbnMuCisJJycnCisJZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJJRCwgbmFtZSwgZW1haWwsIHBhc3N3b3JkLCBncm91cHM9W10pOgorCQlzZWxmLnVzZXJJRCwgc2VsZi5uYW1lLCBzZWxmLmVtYWlsLCBzZWxmLnBhc3N3b3JkLCBzZWxmLmdyb3VwcyA9IHVzZXJJRCwgbmFtZSwgZW1haWwsIHBhc3N3b3JkLCBncm91cHMKKwkJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQlyZXR1cm4gY21wKHNlbGYudXNlcklELCBvdGhlci51c2VySUQpCisJCQorCWRlZiBfX2hhc2hfXyhzZWxmKToKKwkJcmV0dXJuIGhhc2goc2VsZi51c2VySUQpCisJCisJZGVmIF9fcmVwcl9fKHNlbGYpOgorCQlyZXR1cm4gJ1VzZXIodXNlcklEPSVzLG5hbWU9JXMsZW1haWw9JXMscGFzc3dvcmQ9JXMsZ3JvdXBzPSVyKScgJSAoCisJCQlzZWxmLnVzZXJJRCwgc2VsZi5uYW1lLCBzZWxmLmVtYWlsLCBzZWxmLnBhc3N3b3JkLCBzZWxmLmdyb3VwcworCQkpCisJCisKK2NsYXNzIEdyb3VwOgorCScnJ0EgQ0FTIGdyb3VwLiAgVGhlIGdyb3VwIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgcGVybWlzc2lvbnMsIHdoaWNoIGFyZSBzdHJpbmdzCisJdGhhdCBuYW1lIHRoZSBYTUwtUlBDIG1ldGhvZHMgdGhhdCB0aGUgZ3JvdXAgaXMgYWxsb3dlZCB0byBjYWxsLgorCScnJworCWRlZiBfX2luaXRfXyhzZWxmLCBncm91cElELCBuYW1lLCBlbWFpbCwgcGVybXM9W10pOgorCQlzZWxmLmdyb3VwSUQsIHNlbGYubmFtZSwgc2VsZi5lbWFpbCwgc2VsZi5wZXJtcyA9IGdyb3VwSUQsIG5hbWUsIGVtYWlsLCBwZXJtcworCQkKKwlkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisJCXJldHVybiBjbXAoc2VsZi5ncm91cElELCBvdGhlci5ncm91cElEKQorCQkKKwlkZWYgX19oYXNoX18oc2VsZik6CisJCXJldHVybiBoYXNoKHNlbGYuZ3JvdXBJRCkKKwkJCisJZGVmIF9fcmVwcl9fKHNlbGYpOgorCQlyZXR1cm4gJ0dyb3VwKGdyb3VwZElEPSVzLG5hbWU9JXMsZW1haWw9JXMscGVybXM9JXIpJyAlIChzZWxmLmdyb3VwZElELCBzZWxmLm5hbWUsIHNlbGYuZW1haWwsIHNlbGYucGVybXMpCisJCisKK2NsYXNzIFVzZXJEQjoKKwknJydUaGUgdXNlciBkYXRhYmFzZSByZWNvcmRzIGFsbCB0aGUgdXNlcnMgYW5kIGdyb3Vwcy4KKwknJycKKwlkZWYgX19pbml0X18oc2VsZiwgdXNlcnMsIGdyb3VwcywgZmlsZW5hbWUpOgorCQlzZWxmLnVzZXJzLCBzZWxmLmdyb3Vwcywgc2VsZi5maWxlbmFtZSA9IHVzZXJzLCBncm91cHMsIGZpbGVuYW1lCisJCQorCWRlZiBhdXRoZW50aWNhdGUoc2VsZiwgbmFtZSwgcGFzc3dvcmQpOgorCQknJydBdXRoZW50aWNhdGUgYSB1c2VyIGJ5IGNoZWNraW5nIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLgorCQlSZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlcidzIHBhc3N3b3JkIG1hdGNoZXMgdGhlIGdpdmVuIG9uZS4gIFRoZQorCQlwYXNzd29yZCBnaXZlbiBzaG91bGQgYmUgaW4gU0hBLTEgZGlnZXN0IGZvcm1hdC4KKwkJJycnCisJCXVzZXIgPSBzZWxmLnVzZXJzW25hbWVdCisJCXJldHVybiB1c2VyLnVzZXJJRCA9PSBuYW1lIGFuZCB1c2VyLnBhc3N3b3JkID09IHBhc3N3b3JkCisJCisJZGVmIGF1dGhvcml6ZShzZWxmLCBuYW1lLCBwZXJtKToKKwkJJycnQXV0aG9yaXplIGlmIHRoZSB1c2VyIGhhcyB0aGUgZ2l2ZW4gcGVybWlzc2lvbi4gIFJldHVybiB0cnVlIGlmCisJCXRoZSB1c2VyIGNhbiBkbyBpdCwgZmFsc2Ugb3RoZXJ3aXNlLgorCQknJycKKwkJdXNlciA9IHNlbGYudXNlcnNbbmFtZV0KKwkJZm9yIGdyb3VwIGluIHVzZXIuZ3JvdXBzOgorCQkJaWYgcGVybSBpbiBncm91cC5wZXJtczoKKwkJCQlyZXR1cm4gVHJ1ZQorCQlyZXR1cm4gRmFsc2UKKwkKKwlkZWYgc2F2ZShzZWxmKToKKwkJJycnU2F2ZSB0aGUgdXNlciBkYXRhYmFzZSB0byBkaXNrLgorCQknJycKKwkJZiA9IGZpbGUoc2VsZi5maWxlbmFtZSwgJ3diJykKKwkJcGlja2xlLmR1bXAoc2VsZiwgZikKKwkJZi5jbG9zZSgpCisJCisKK2NsYXNzIEZpbGVNZ3JEaXNwYXRjaGVyKERpc3BhdGNoZXIpOgorCScnJ1RoZSBmaWxlIG1hbmFnZXIgZGlzcGF0Y2hlciBoYW5kbGVzIGFsbCBYTUwtUlBDIGNhbGxzLgorCScnJworCWRlZiBfX2luaXRfXyhzZWxmLCBjYXRhbG9nLCByZXBvLCB4ZmVyLCB1c2VyREIpOgorCQlzZWxmLmNhdGFsb2csIHNlbGYucmVwbywgc2VsZi54ZmVyLCBzZWxmLnVzZXJEQiA9IGNhdGFsb2csIHJlcG8sIHhmZXIsIHVzZXJEQgorCQlzZWxmLnRyYWNrZXIgPSBUcmFuc2ZlclN0YXR1c1RyYWNrZXIoc2VsZi5jYXRhbG9nKQorCQorCWRlZiBoYW5kbGVSZXF1ZXN0KHNlbGYsIG1ldGhvZFNwZWNpZmllciwgcGFyYW1zLCB1c2VyLCBwYXNzd29yZCk6CisJCScnJ0hhbmRsZSBhbiBYTUwtUlBDIHJlcXVlc3QuICBGaXJzdCwgYXV0aGVudGljYXRlIHRoZSB1c2VyLiAgSWYgdGhlIHVzZXIncworCQlhdXRoZW50aWMgKGJ5IGRpbnQgb2YgcHJvdmlkaW5nIGEgY29ycmVjdCB1c2VyIElEIGFuZCBwYXNzd29yZCBwYWlyKSwgdGhlbgorCQlhdXRob3JpemUgaWYgdGhlIG1ldGhvZCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gY2FsbCBpcyBhdmFpbGFibGUuCisJCScnJworCQlwYXNzd29yZCA9IF9lbmNvZGVQYXNzd29yZChwYXNzd29yZCkKKwkJaWYgc2VsZi51c2VyREIuYXV0aGVudGljYXRlKHVzZXIsIHBhc3N3b3JkKToKKwkJCWlmIHNlbGYudXNlckRCLmF1dGhvcml6ZSh1c2VyLCBtZXRob2RTcGVjaWZpZXIpOgorCQkJCW9iaiwgbWV0aG9kID0gbWV0aG9kU3BlY2lmaWVyLnNwbGl0KCcuJykKKwkJCQlpZiBvYmogbm90IGluICgnZmlsZW1ncicsICd1c2VybWdyJyk6CisJCQkJCXJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gb2JqZWN0JykKKwkJCQlmdW5jID0gZ2V0YXR0cihzZWxmLCBtZXRob2QpCisJCQkJcmV0dXJuIGZ1bmMocGFyYW1zKQorCQkJcmFpc2UgVmFsdWVFcnJvcignTm90IGF1dGhvcml6ZWQgZm9yICIlcyInICUgbWV0aG9kU3BlY2lmaWVyKQorCQlyYWlzZSBWYWx1ZUVycm9yKCdJbGxlZ2FsIHVzZXIgbmFtZSAiJXMiIGFuZC9vciBwYXNzd29yZCcgJSB1c2VyKQorCQorCWRlZiBnZXRQcm9kdWN0VHlwZUJ5TmFtZShzZWxmLCBwYXJhbXMpOgorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFN0cnVjdHMuZ2V0WG1sUnBjUHJvZHVjdFR5cGUoc2VsZi5yZXBvLmdldFByb2R1Y3RUeXBlQnlOYW1lKHBhcmFtc1swXSkpKQorCQorCWRlZiBpbmdlc3RQcm9kdWN0KHNlbGYsIHBhcmFtcyk6CisJCXByb2R1Y3RIYXNoLCBtZXRhZGF0YSwgY2xpZW50WGZlciA9IHBhcmFtcworCQlwID0gU3RydWN0cy5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwcm9kdWN0SGFzaCkKKwkJcC5zZXRUcmFuc2ZlclN0YXR1cyhQcm9kdWN0LlNUQVRVU19UUkFOU0ZFUikKKwkJc2VsZi5jYXRhbG9nLmFkZFByb2R1Y3QocCkKKwkJCisJCW0gPSBNZXRhZGF0YSgpCisJCW0uYWRkTWV0YWRhdGEobWV0YWRhdGEpCisJCXNlbGYuY2F0YWxvZy5hZGRNZXRhZGF0YShtLCBwKQorCQkKKwkJaWYgbm90IGNsaWVudFhmZXI6CisJICAgICAgICAgICAgICAgIHZlcnNpb25lciA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkuZ2V0VmVyc2lvbmVyRnJvbUNsYXNzTmFtZShwLmdldFByb2R1Y3RUeXBlKCkuZ2V0VmVyc2lvbmVyKCkpCisJCQl2ZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwLCBtKQorCQkJc2VsZi5jYXRhbG9nLmFkZFByb2R1Y3RSZWZlcmVuY2VzKHApCisJCQlzZWxmLnhmZXIudHJhbnNmZXJQcm9kdWN0KHApCisJCQlwLnNldFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QuU1RBVFVTX1JFQ0VJVkVEKQorCQkJc2VsZi5jYXRhbG9nLnNldFByb2R1Y3RUcmFuZnNlclN0YXR1cyhwKQorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIHAuZ2V0UHJvZHVjdElkKCkpCisJCisJZGVmIGFkZFByb2R1Y3RSZWZlcmVuY2VzKHNlbGYsIHBhcmFtcyk6CisJCXNlbGYuY2F0YWxvZy5hZGRQcm9kdWN0UmVmZXJlbmNlcyhTdHJ1Y3RzLmdldFByb2R1Y3RGcm9tWG1sUnBjKHBhcmFtc1swXSkpCisJCXJldHVybiBSZXN1bHQoQm9vbGVhbiwgJ3RydWUnKQorCQorCWRlZiB0cmFuc2ZlcnJpbmdQcm9kdWN0KHNlbGYsIHBhcmFtcyk6CisJCXNlbGYudHJhY2tlci50cmFuc2ZlcnJpbmdQcm9kdWN0KFN0cnVjdHMuZ2V0UHJvZHVjdEZyb21YbWxScGMocGFyYW1zWzBdKSkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCisJZGVmIHJlbW92ZVByb2R1Y3RUcmFuc2ZlclN0YXR1cyhzZWxmLCBwYXJhbXMpOgorCQlzZWxmLnRyYWNrZXIucmVtb3ZlUHJvZHVjdFRyYW5zZmVyU3RhdHVzKFN0cnVjdHMuZ2V0UHJvZHVjdEZyb21YbWxScGMocGFyYW1zWzBdKSkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCisJZGVmIHNldFByb2R1Y3RUcmFuc2ZlclN0YXR1cyhzZWxmLCBwYXJhbXMpOgorCQlzZWxmLmNhdGFsb2cuc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKFN0cnVjdHMuZ2V0UHJvZHVjdEZyb21YbWxScGMocGFyYW1zWzBdKSkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCQorCWRlZiBnZXRDdXJyZW50RmlsZVRyYW5zZmVyKHNlbGYsIHBhcmFtcyk6CisJCXN0YXR1cyA9IHNlbGYudHJhY2tlci5nZXRDdXJyZW50RmlsZVRyYW5zZmVyKCkKKwkJaWYgc3RhdHVzIGlzIE5vbmU6CisJCQlyZXR1cm4gUmVzdWx0KE5vbmUsIEhhc2h0YWJsZSgpKQorCQllbHNlOgorCQkJcmV0dXJuIFJlc3VsdChOb25lLCBTdHJ1Y3RzLmdldFhtbFJwY0ZpbGVUcmFuc2ZlclN0YXR1cyhzdGF0dXMpKQorCQorCWRlZiBnZXRDdXJyZW50RmlsZVRyYW5zZmVycyhzZWxmLCBwYXJhbXMpOgorCQl4ZmVycyA9IHNlbGYudHJhY2tlci5nZXRDdXJyZW50RmlsZVRyYW5zZmVycygpCisJCWlmIHhmZXJzIGlzIG5vdCBOb25lIGFuZCBsZW4oeGZlcnMpID4gMDoKKwkJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNGaWxlVHJhbnNmZXJTdGF0dXNlcyh4ZmVycykpCisJCWVsc2U6CisJCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFZlY3RvcigpKQorCQorCWRlZiBnZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQoc2VsZiwgcGFyYW1zKToKKwkJcmV0dXJuIFJlc3VsdChEb3VibGUsIHN0cihzZWxmLnRyYWNrZXIuZ2V0UGN0VHJhbnNmZXJyZWQoKFN0cnVjdHMuZ2V0UHJvZHVjdEZyb21YbWxScGMocGFyYW1zWzBdKSkpKSkKKwkKKwlkZWYgZ2V0UmVmUGN0VHJhbnNmZXJyZWQoc2VsZiwgcGFyYW1zKToKKwkJcGN0ID0gc2VsZi50cmFja2VyLmdldFBjdFRyYW5zZmVycmVkKFN0cnVjdHMuZ2V0UmVmZXJlbmNlRnJvbVhtbFJwYyhwYXJhbXNbMF0pKQorCQlyZXR1cm4gUmVzdWx0KERvdWJsZSwgc3RyKHBjdCkpCisJCisJZGVmIGlzVHJhbnNmZXJDb21wbGV0ZShzZWxmLCBwYXJhbXMpOgorCQlyZXR1cm4gUmVzdWx0KEJvb2xlYW4sIF90b0phdmFCb29sZWFuKHNlbGYudHJhY2tlci5pc1RyYW5zZmVyQ29tcGxldGUoU3RydWN0cy5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwYXJhbXNbMF0pKSkpCisJCisJZGVmIHBhZ2VkUXVlcnkoc2VsZiwgcGFyYW1zKToKKwkJcHR5cGUgPSBTdHJ1Y3RzLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwYXJhbXNbMV0pCisJCXF1ZXJ5ID0gU3RydWN0cy5nZXRRdWVyeUZyb21YbWxScGMocGFyYW1zWzBdKQorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFN0cnVjdHMuZ2V0WG1sUnBjUHJvZHVjdFBhZ2Uoc2VsZi5jYXRhbG9nLnBhZ2VkUXVlcnkocXVlcnksIHB0eXBlLCBwYXJhbXNbMl0pKSkKKwkKKwlkZWYgZ2V0Rmlyc3RQYWdlKHNlbGYsIHBhcmFtcyk6CisJCXB0eXBlID0gU3RydWN0cy5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocGFyYW1zWzBdKQorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFN0cnVjdHMuZ2V0WG1sUnBjUHJvZHVjdFBhZ2Uoc2VsZi5jYXRhbG9nLmdldEZpcnN0UGFnZShwdHlwZSkpKQorCQorCWRlZiBnZXRMYXN0UGFnZShzZWxmLCBwYXJhbXMpOgorCQlwdHlwZSA9IFN0cnVjdHMuZ2V0UHJvZHVjdFR5cGVGcm9tWG1sUnBjKHBhcmFtc1swXSkKKwkJcmV0dXJuIFJlc3VsdChOb25lLCBTdHJ1Y3RzLmdldFhtbFJwY1Byb2R1Y3RQYWdlKHNlbGYuY2F0YWxvZy5nZXRMYXN0UHJvZHVjdFBhZ2UocHR5cGUpKSkKKwkKKwlkZWYgZ2V0TmV4dFBhZ2Uoc2VsZiwgcGFyYW1zKToKKwkJcHR5cGUgPSBTdHJ1Y3RzLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwYXJhbXNbMF0pCisJCXBhZ2UgPSBTdHJ1Y3RzLmdldFByb2R1Y3RQYWdlRnJvbVhtbFJwYyhwYXJhbXNbMV0pCisJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNQcm9kdWN0UGFnZShzZWxmLmNhdGFsb2cuZ2V0TmV4dFBhZ2UocHR5cGUsIHBhZ2UpKSkKKwkKKwlkZWYgZ2V0UHJldlBhZ2Uoc2VsZiwgcGFyYW1zKToKKwkJcHR5cGUgPSBTdHJ1Y3RzLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwYXJhbXNbMF0pCisJCXBhZ2UgPSBTdHJ1Y3RzLmdldFByb2R1Y3RQYWdlRnJvbVhtbFJwYyhwYXJhbXNbMV0pCisJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNQcm9kdWN0UGFnZShzZWxmLmNhdGFsb2cuZ2V0UHJldlBhZ2UocHR5cGUsIHBhZ2UpKSkKKwkJCisJZGVmIGFkZFByb2R1Y3RUeXBlKHNlbGYsIHBhcmFtcyk6CisJCXB0eXBlID0gU3RydWN0cy5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocGFyYW1zWzBdKQorCQlzZWxmLnJlcG8uYWRkUHJvZHVjdFR5cGUocHR5cGUpCisJCXJldHVybiBSZXN1bHQoTm9uZSwgcHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpKQorCQorCWRlZiBnZXROdW1Qcm9kdWN0cyhzZWxmLCBwYXJhbXMpOgorCQlwdHlwZSA9IFN0cnVjdHMuZ2V0UHJvZHVjdFR5cGVGcm9tWG1sUnBjKHBhcmFtc1swXSkKKwkJcmV0dXJuIFJlc3VsdChJbnRlZ2VyLCBzdHIoc2VsZi5jYXRhbG9nLmdldE51bVByb2R1Y3RzKHB0eXBlKSkpCisJCisJZGVmIGdldFRvcE5Qcm9kdWN0cyhzZWxmLCBwYXJhbXMpOgorCQlpZiBsZW4ocGFyYW1zKSA9PSAxOgorCQkJcmV0dXJuIFJlc3VsdChOb25lLCBTdHJ1Y3RzLmdldFhtbFJwY1Byb2R1Y3RMaXN0KHNlbGYuY2F0YWxvZy5nZXRUb3BOUHJvZHVjdHMocGFyYW1zWzBdKSkpCisJCXB0eXBlID0gU3RydWN0cy5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocGFyYW1zWzFdKQorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFN0cnVjdHMuZ2V0WG1sUnBjUHJvZHVjdExpc3Qoc2VsZi5jYXRhbG9nLmdldFRvcE5Qcm9kdWN0cyhwYXJhbXNbMF0sIHB0eXBlKSkpCisJCisJZGVmIGhhc1Byb2R1Y3Qoc2VsZiwgcGFyYW1zKToKKwkJcCA9IHNlbGYuY2F0YWxvZy5nZXRQcm9kdWN0QnlOYW1lKHBhcmFtc1swXSkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCBfdG9KYXZhQm9vbGVhbihwIGlzIG5vdCBOb25lIGFuZCBwLnRyYW5zZmVyU3RhdHVzID09IFByb2R1Y3QuU1RBVFVTX1JFQ0VJVkVEKSkKKwkKKwlkZWYgZ2V0TWV0YWRhdGEoc2VsZiwgcGFyYW1zKToKKwkJcmV0dXJuIFJlc3VsdChOb25lLCBzZWxmLmNhdGFsb2cuZ2V0TWV0YWRhdGEoU3RydWN0cy5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwYXJhbXNbMF0pKS5nZXRIYXNodGFibGUoKSkKKwkKKwlkZWYgZ2V0UHJvZHVjdFR5cGVzKHNlbGYsIHBhcmFtcyk6CisJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNQcm9kdWN0TGlzdChzZWxmLnJlcG8uZ2V0UHJvZHVjdFR5cGVzKCkpKQorCQorCWRlZiBnZXRQcm9kdWN0UmVmZXJlbmNlcyhzZWxmLCBwYXJhbXMpOgorCQlwID0gU3RydWN0cy5nZXRQcm9kdWN0RnJvbVhtbFJwYyhwYXJhbXNbMF0pCisJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNSZWZlcmVuY2VzKHNlbGYuY2F0YWxvZy5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwKSkpCisJCisJZGVmIGdldFByb2R1Y3RCeUlkKHNlbGYsIHBhcmFtcyk6CisJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNQcm9kdWN0KHNlbGYuY2F0YWxvZy5nZXRQcm9kdWN0QnlJZChwYXJhbXNbMF0pKSkKKwkKKwlkZWYgZ2V0UHJvZHVjdEJ5TmFtZShzZWxmLCBwYXJhbXMpOgorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFN0cnVjdHMuZ2V0WG1sUnBjUHJvZHVjdChzZWxmLmNhdGFsb2cuZ2V0UHJvZHVjdEJ5TmFtZShwYXJhbXNbMF0pKSkKKwkKKwlkZWYgZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKHNlbGYsIHBhcmFtcyk6CisJCXB0eXBlID0gU3RydWN0cy5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocGFyYW1zWzBdKQorCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFN0cnVjdHMuZ2V0WG1sUnBjUHJvZHVjdExpc3Qoc2VsZi5jYXRhbG9nLmdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZShwdHlwZSkpKQorCQorCWRlZiBnZXRFbGVtZW50c0J5UHJvZHVjdFR5cGUoc2VsZiwgcGFyYW1zKToKKwkJcHR5cGUgPSBTdHJ1Y3RzLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwYXJhbXNbMF0pCisJCXJldHVybiBTdHJ1Y3RzLmdldFhtbFJwY0VsZW1lbnRMaXN0KHNlbGYuY2F0YWxvZy5nZXRWYWxpZGF0aW9uTGF5ZXIoKS5nZXRFbGVtZW50cyhwdHlwZSkpCisJCisJZGVmIGdldEVsZW1lbnRCeUlkKHNlbGYsIHBhcmFtcyk6CisJCXJldHVybiBTdHJ1Y3RzLmdldFhtbFJwY0VsZW1lbnQoc2VsZi5jYXRhbG9nLmdldFZhbGlkYXRpb25MYXllcigpLmdldEVsZW1lbnRCeUlkKHBhcmFtc1swXSkpCisJCQorCWRlZiBnZXRFbGVtZW50QnlOYW1lKHNlbGYsIHBhcmFtcyk6CisJCXJldHVybiBTdHJ1Y3RzLmdldFhtbFJwY0VsZW1lbnQoc2VsZi5jYXRhbG9nLmdldFZhbGlkYXRpb25MYXllcigpLmdldEVsZW1lbnRCeU5hbWUocGFyYW1zWzBdKSkKKwkKKwlkZWYgcXVlcnkoc2VsZiwgcGFyYW1zKToKKwkJcSA9IFN0cnVjdHMuZ2V0UXVlcnlGcm9tWG1sUnBjKHBhcmFtc1swXSkKKwkJcHR5cGUgPSBTdHJ1Y3RzLmdldFByb2R1Y3RUeXBlRnJvbVhtbFJwYyhwYXJhbXNbMV0pCisJCWlkcyA9IHNlbGYuY2F0YWxvZy5xdWVyeShxLCBwdHlwZSkKKwkJaWYgaWRzIGlzIG5vdCBOb25lIGFuZCBsZW4oaWRzKSA+IDA6CisJCQlyZXR1cm4gUmVzdWx0KE5vbmUsIFtzZWxmLmNhdGFsb2cuZ2V0UHJvZHVjdEJ5SWQoaSkgZm9yIGkgaW4gaWRzXSkKKwkJcmV0dXJuIFJlc3VsdChOb25lLCBWZWN0b3IoKSkKKwkKKwlkZWYgZ2V0UHJvZHVjdFR5cGVCeUlkKHNlbGYsIHBhcmFtcyk6CisJCXB0eXBlID0gc2VsZi5yZXBvLmdldFByb2R1Y3RUeXBlQnlJZChwYXJhbXNbMF0pCisJCXJldHVybiBSZXN1bHQoTm9uZSwgU3RydWN0cy5nZXRYbWxScGNQcm9kdWN0VHlwZShwdHlwZSkpCisJCisJZGVmIGNhdGFsb2dQcm9kdWN0KHNlbGYsIHBhcmFtcyk6CisJCXAgPSBTdHJ1Y3RzLmdldFByb2R1Y3RGcm9tWG1sUnBjKHBhcmFtc1swXSkKKwkJcmV0dXJuIFJlc3VsdChOb25lLCBzZWxmLmNhdGFsb2cuYWRkUHJvZHVjdChwKSkKKwkKKwlkZWYgYWRkTWV0YWRhdGEoc2VsZiwgcGFyYW1zKToKKwkJcCA9IFN0cnVjdHMuZ2V0UHJvZHVjdEZyb21YbWxScGMocGFyYW1zWzBdKQorCQltID0gTWV0YWRhdGEoKQorCQltLmFkZE1ldGFkYXRhKHBhcmFtc1sxXSkKKwkJc2VsZi5jYXRhbG9nLmFkZE1ldGFkYXRhKG0sIHApCisJCXJldHVybiBSZXN1bHQoQm9vbGVhbiwgJ3RydWUnKQorCQkKKwlkZWYgdHJhbnNmZXJGaWxlKHNlbGYsIHBhcmFtcyk6CisJCW91dEZpbGUsIGRhdGEsIG9mZnNldCwgbnVtQnl0ZXMgPSBwYXJhbXMKKwkJaWYgb3MucGF0aC5leGlzdHMob3V0RmlsZSk6CisJCQlvdXQgPSBmaWxlKG91dEZpbGUsICdhYicpCisJCWVsc2U6CisJCQlkaXJQYXRoID0gb3MuZGlybmFtZShvdXRGaWxlKQorCQkJb3MubWFrZWRpcnMoZGlyUGF0aCkKKwkJCW91dCA9IGZpbGUob3V0RmlsZSwgJ3diJykKKwkJb3V0LnNlZWsob2Zmc2V0KQorCQlvdXQud3JpdGUoZGF0YSkKKwkJb3V0LmNsb3NlKCkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCisJZGVmIHJlbW92ZUZpbGUoc2VsZiwgcGFyYW1zKToKKwkJb3MucmVtb3ZlKHBhcmFtc1swXSkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCQorCWRlZiBhZGRVc2VyKHNlbGYsIHBhcmFtcyk6CisJCXVzZXJJRCA9IHBhcmFtc1swXQorCQl1c2VyID0gVXNlcih1c2VySUQsIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBfZW5jb2RlUGFzc3dvcmQocGFyYW1zWzNdKSwgW10pCisJCXNlbGYudXNlckRCLnVzZXJzW3VzZXJJRF0gPSB1c2VyCisJCXNlbGYudXNlckRCLnNhdmUoKQorCQlyZXR1cm4gUmVzdWx0KEJvb2xlYW4sICd0cnVlJykKKwkJCisJZGVmIHJlbW92ZVVzZXIoc2VsZiwgcGFyYW1zKToKKwkJZGVsIHNlbGYudXNlckRCLnVzZXJzW3BhcmFtc1swXV0KKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCisJZGVmIGFkZEdyb3VwKHNlbGYsIHBhcmFtcyk6CisJCWdyb3VwSUQgPSBwYXJhbXNbMF0KKwkJZ3JvdXAgPSBHcm91cChncm91cElELCBwYXJhbXNbMV0sIHBhcmFtc1syXSkKKwkJc2VsZi51c2VyREIuZ3JvdXBzW2dyb3VwSURdID0gZ3JvdXAKKwkJc2VsZi51c2VyREIuc2F2ZSgpCisJCXJldHVybiBSZXN1bHQoQm9vbGVhbiwgJ3RydWUnKQorCQorCWRlZiByZW1vdmVHcm91cChzZWxmLCBwYXJhbXMpOgorCQlncm91cElEID0gcGFyYW1zWzBdCisJCWRlbCBzZWxmLnVzZXJEQi5ncm91cHNbZ3JvdXBJRF0KKwkJZm9yIHVzZXIgaW4gc2VsZi51c2VyREIudXNlcnMuaXRlcnZhbHVlcygpOgorCQkJaW5kZXhlcyA9IFtdCisJCQlpbmRleCA9IDAKKwkJCWZvciBncm91cCBpbiB1c2VyLmdyb3VwczoKKwkJCQlpZiBncm91cC5ncm91cElEID09IGdyb3VwSUQ6CisJCQkJCWluZGV4ZXMuYXBwZW5kKGluZGV4KQorCQkJCWluZGV4ICs9IDEKKwkJCWluZGV4ZXMucmV2ZXJzZSgpCisJCQlmb3IgaW5kZXggaW4gaW5kZXhlczoKKwkJCQlkZWwgdXNlci5ncm91cHNbaW5kZXhdCisJCXNlbGYudXNlckRCLnNhdmUoKQorCQlyZXR1cm4gUmVzdWx0KEJvb2xlYW4sICd0cnVlJykKKwkJCisJZGVmIGFkZFVzZXJUb0dyb3VwKHNlbGYsIHBhcmFtcyk6CisJCXNlbGYudXNlckRCLnVzZXJzW3BhcmFtc1swXV0uZ3JvdXBzLmFwcGVuZChzZWxmLnVzZXJEQi5ncm91cHNbcGFyYW1zWzFdXSkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisKKwlkZWYgcmVtb3ZlVXNlckZyb21Hcm91cChzZWxmLCBwYXJhbXMpOgorCQlncm91cElEID0gcGFyYW1zWzFdCisJCXVzZXIgPSBzZWxmLnVzZXJEQi51c2Vyc1twYXJhbXNbMF1dCisJCWluZGV4ZXMgPSBbXQorCQlpbmRleCA9IDAKKwkJZm9yIGdyb3VwIGluIHVzZXIuZ3JvdXA6CisJCQlpZiBncm91cC5ncm91cElEID09IGdyb3VwSUQ6CisJCQkJaW5kZXhlcy5hcHBlbmQoaW5kZXgpCisJCQlpbmRleCArPSAxCisJCWluZGV4ZXMucmV2ZXJzZSgpCisJCWZvciBpbmRleCBpbiBpbmRleGVzOgorCQkJZGVsIHVzZXIuZ3JvdXBzW2luZGV4XQorCQlzZWxmLnVzZXJEQi5zYXZlKCkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCQorCWRlZiBhZGRQZXJtaXNzaW9uVG9Hcm91cChzZWxmLCBwYXJhbXMpOgorCQlzZWxmLnVzZXJEQi5ncm91cHNbcGFyYW1zWzBdXS5wZXJtcy5hcHBlbmQocGFyYW1zWzFdKQorCQlzZWxmLnVzZXJEQi5zYXZlKCkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCQorCWRlZiByZW1vdmVQZXJtaXNzaW9uRnJvbUdyb3VwKHNlbGYsIHBhcmFtcyk6CisJCXBlcm1OYW1lID0gcGFyYW1zWzFdCisJCWdyb3VwID0gc2VsZi51c2VyREIuZ3JvdXBzW3BhcmFtc1swXV0KKwkJaW5kZXhlcyA9IFtdCisJCWluZGV4ID0gMAorCQlmb3IgcGVybSBpbiBncm91cC5wZXJtczoKKwkJCWlmIHBlcm0gPT0gcGVybU5hbWU6CisJCQkJaW5kZXhlcy5hcHBlbmQoaW5kZXgpCisJCWluZGV4ZXMucmV2ZXJzZSgpCisJCWZvciBpbmRleCBpbiBpbmRleGVzOgorCQkJZGVsIGdyb3VwLnBlcm1zW2luZGV4XQorCQlzZWxmLnVzZXJEQi5zYXZlKCkKKwkJcmV0dXJuIFJlc3VsdChCb29sZWFuLCAndHJ1ZScpCisJCisKK2RlZiBfdXNhZ2UoKToKKwknJydTaG93IGEgdXNhZ2UgbWVzc2FnZSB0byB0aGUgc3RkZXJyIGFuZCBxdWl0LgorCScnJworCXByaW50ID4+c3lzLnN0ZGVyciwgJ1VzYWdlOiAlcyBbLWMgPGNvbmZpZ0ZpbGU+XScgJSBzeXMuYXJndlswXQorCXByaW50ID4+c3lzLnN0ZGVyciwgJyAgIG9yOiAlcyBbLS1jb25maWc9PGNvbmZpZ0ZpbGU+XScgJSBzeXMuYXJndlswXQorCXN5cy5leGl0KDIpCisJCisKK2RlZiBfcGFyc2VDb21tYW5kTGluZSgpOgorCScnJ1BhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gIElmIGFueS4gIFRoZSBvbmx5IG9wdGlvbiBpcyAtYyAob3IgLS1jb25maWcpCisJdGhhdCBuYW1lcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UuICBJZiBub25lIGdpdmVuLCByZWFzb25hYmxlIGRlZmF1bHRzIGFyZQorCXVzZWQuICBXZWxsLCBtb3N0bHkgcmVhc29uYWJsZS4KKwknJycKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2M6JywgJ2NvbmZpZz0nKQorCWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisJCV91c2FnZSgpCisJY29uZmlnRmlsZSA9IE5vbmUKKwlmb3Igb3B0aW9uLCBhcmcgaW4gb3B0czoKKwkJaWYgb3B0aW9uIGluICgnLWMnLCAnLS1jb25maWcnKToKKwkJCWNvbmZpZ0ZpbGUgPSBhcmcKKwkJCWlmIGNvbmZpZ0ZpbGUgaXMgTm9uZSBvciBsZW4oY29uZmlnRmlsZSkgPT0gMDoKKwkJCQlfdXNhZ2UoKQorCXJldHVybiBjb25maWdGaWxlCisJCisKK2RlZiBfZ2V0Q29uZmlnKGNvbmZpZ0ZpbGUpOgorCScnJ0dldCB0aGUgY29uZmlndXJhdGlvbi4gIFRoaXMgcG9wdWxhdGVzIGEgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWVzCisJYW5kIHRoZW4gb3ZlcndyaXRlcyB0aGVtIHdpdGggdGhlIGNvbmZpZ0ZpbGUsIHdoaWNoIG1heSBiZSBOb25lIChpbiB3aGljaCBjYXNlLAorCW5vIG92ZXJ3cml0aW5nIGhhcHBlbnMpLgorCScnJworCWNvbmZpZ1BhcnNlciA9IENvbmZpZ1BhcnNlcigpCisJY29uZmlnUGFyc2VyLmFkZF9zZWN0aW9uKCdmYWN0b3JpZXMnKQorCWZvciBrZXksIHZhbCBpbiBfZGVmYXVsdEZhY3Rvcmllcy5pdGVyaXRlbXMoKToKKwkJY29uZmlnUGFyc2VyLnNldCgnZmFjdG9yaWVzJywga2V5LCB2YWwpCisKKwljb25maWdQYXJzZXIuYWRkX3NlY3Rpb24oJ2luZGV4JykKKwljb25maWdQYXJzZXIuc2V0KCdpbmRleCcsICdwYXRoJywgJ2luZGV4JykKKwljb25maWdQYXJzZXIuc2V0KCdpbmRleCcsICdwYWdlU2l6ZScsICcyMCcpCisKKwljdXJyZW50ID0gJy8nLmpvaW4ob3MucGF0aC5zcGxpdChvcy5nZXRjd2QoKSkpCisJY29uZmlnUGFyc2VyLmFkZF9zZWN0aW9uKCdwb2xpY2llcycpCisJY29uZmlnUGFyc2VyLnNldCgncG9saWNpZXMnLCAncmVwbycsICdmaWxlOiVzL3BvbGljeScgJSBjdXJyZW50KQorCWNvbmZpZ1BhcnNlci5zZXQoJ3BvbGljaWVzJywgJ3ZhbGlkYXRpb24nLCAnZmlsZTolcy9wb2xpY3knICUgY3VycmVudCkKKwljb25maWdQYXJzZXIuc2V0KCdwb2xpY2llcycsICd1c2VyJywgJyVzL3VzZXIuZGInICUgY3VycmVudCkKKworCWlmIGNvbmZpZ0ZpbGUgaXMgbm90IE5vbmU6CisJCWNvbmZpZ1BhcnNlci5yZWFkZnAoZmlsZShjb25maWdGaWxlKSkKKwlyZXR1cm4gY29uZmlnUGFyc2VyCisJCisKK2RlZiBfc2V0SmF2YVByb3BlcnRpZXMoY29uZmlnKToKKwknJydTZXQgSmF2YS1iYXNlZCBwcm9wZXJ0aWVzLiAgVGhlIEphdmEtYmFzZWQgY2FzIGV4cGVjdHMgYSB3aG9sZSBidW5jaCBvZgorCXN5c3RlbSBwcm9wZXJ0aWVzIHRvIGJlIHNldCwgc29ydCBvZiBsaWtlIGdsb2JhbCB2YXJpYWJsZXMuICBXb290ISAgR2xvYmFsCisJdmFyaWFibGVzIQorCScnJworCWZyb20gamF2YS5sYW5nIGltcG9ydCBTeXN0ZW0KKwlTeXN0ZW0uc2V0UHJvcGVydHkoJ29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoJywgY29uZmlnLmdldCgnaW5kZXgnLCAncGF0aCcpKQorCVN5c3RlbS5zZXRQcm9wZXJ0eSgnb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLnBhZ2VTaXplJywgY29uZmlnLmdldCgnaW5kZXgnLCAncGFnZVNpemUnKSkKKwlTeXN0ZW0uc2V0UHJvcGVydHkoJ29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRpcnMnLCBjb25maWcuZ2V0KCdwb2xpY2llcycsICdyZXBvJykpCisJU3lzdGVtLnNldFByb3BlcnR5KCdvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzJywgY29uZmlnLmdldCgncG9saWNpZXMnLCAndmFsaWRhdGlvbicpKQorCVN5c3RlbS5zZXRQcm9wZXJ0eSgnb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5yZW1vdGUuY2h1bmtTaXplJywgJzEwMjQnKQorCVN5c3RlbS5zZXRQcm9wZXJ0eSgnZmlsZW1nci5yZXBvc2l0b3J5LmZhY3RvcnknLCBjb25maWcuZ2V0KCdmYWN0b3JpZXMnLCAncmVwb3NpdG9yeScpKQorCVN5c3RlbS5zZXRQcm9wZXJ0eSgnZmlsZW1nci5jYXRhbG9nLmZhY3RvcnknLCBjb25maWcuZ2V0KCdmYWN0b3JpZXMnLCAnY2F0YWxvZycpKQorCVN5c3RlbS5zZXRQcm9wZXJ0eSgnZmlsZW1nci5kYXRhdHJhbnNmZXIuZmFjdG9yeScsIGNvbmZpZy5nZXQoJ2ZhY3RvcmllcycsICdkYXRhdHJhbnNmZXInKSkKKwlTeXN0ZW0uc2V0UHJvcGVydHkoJ2ZpbGVtZ3IudmFsaWRhdGlvbkxheWVyLmZhY3RvcnknLCBjb25maWcuZ2V0KCdmYWN0b3JpZXMnLCAndmFsaWRhdGlvbicpKQorCQorZGVmIF9nZXRVc2VyREIocGF0aCk6CisJJycnR2V0IHRoZSB1c2VyIGRhdGFiYXNlLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuCisJJycnCisJdHJ5OgorCQlmID0gZmlsZShwYXRoLCAncmInKQorCQlkYiA9IHBpY2tsZS5sb2FkKGYpCisJCWYuY2xvc2UoKQorCQlkYi5maWxlbmFtZSA9IHBhdGgKKwkJZGIuc2F2ZSgpCisJZXhjZXB0OgorCQl3aGVlbCA9IEdyb3VwKCd3aGVlbCcsICdBZG1pbmlzdHJhdG9ycycsICd0ZWgucG93ZXJAcG93ZXIudXNlcnMnLCBfYWxsUGVybXMpCisJCXJvb3QgPSBVc2VyKCdyb290JywgJ1N1cGVyIFVzZXInLCAndGVoLnJvb3RAcG93ZXIudXNlcnMnLCBfZW5jb2RlUGFzc3dvcmQoJ3BvaXB1JyksIFt3aGVlbF0pCisJCWRiID0gVXNlckRCKHsncm9vdCc6IHJvb3R9LCB7J3doZWVsJzogd2hlZWx9LCBwYXRoKQorCQlkYi5zYXZlKCkKKwlyZXR1cm4gZGIKKwkKKworZGVmIG1haW4oKToKKwknJydTdGFydCB0aGUgQ0FTIEZpbGVtZ3IgQmFja2VuZC4KKwknJycKKwljb25maWdGaWxlID0gX3BhcnNlQ29tbWFuZExpbmUoKQorCWNvbmZpZ1BhcnNlciA9IF9nZXRDb25maWcoY29uZmlnRmlsZSkKKwlfc2V0SmF2YVByb3BlcnRpZXMoY29uZmlnUGFyc2VyKQorCisJY2F0YWxvZyA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkuZ2V0Q2F0YWxvZ1NlcnZpY2VGcm9tRmFjdG9yeShjb25maWdQYXJzZXIuZ2V0KCdmYWN0b3JpZXMnLCAnY2F0YWxvZycpKQorCXJlcG8gPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldFJlcG9zaXRvcnlNYW5hZ2VyU2VydmljZUZyb21GYWN0b3J5KGNvbmZpZ1BhcnNlci5nZXQoJ2ZhY3RvcmllcycsICdyZXBvc2l0b3J5JykpCisJeGZlciA9IEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdEZhY3RvcnkuZ2V0RGF0YVRyYW5zZmVyU2VydmljZUZyb21GYWN0b3J5KGNvbmZpZ1BhcnNlci5nZXQoJ2ZhY3RvcmllcycsICdkYXRhdHJhbnNmZXInKSkKKwl1c2VyREIgPSBfZ2V0VXNlckRCKGNvbmZpZ1BhcnNlci5nZXQoJ3BvbGljaWVzJywgJ3VzZXInKSkKKworCXdzID0gU2VjdXJlV2ViU2VydmVyKDE5OTkpCisJd3MuYWRkRGlzcGF0Y2hlcihGaWxlTWdyRGlzcGF0Y2hlcihjYXRhbG9nLCByZXBvLCB4ZmVyLCB1c2VyREIpKQorCXdzLnN0YXJ0KCkKKwkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwltYWluKCkKKwkKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9weXRob24vc2V0Y2xhc3NwYXRoLnNoIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3B5dGhvbi9zZXRjbGFzc3BhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZiZmM0OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9weXRob24vc2V0Y2xhc3NwYXRoLnNoCkBAIC0wLDAgKzEsMTcgQEAKKyMvKgorIyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgKgorIyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKgorIyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KK3NldGVudiBDTEFTU1BBVEggJHtIT01FfS8ubTIvcmVwb3NpdG9yeS9vcmcuYXBhY2hlLm9vZHQuY2FzLWZpbGVtZ3IvMS43LjAtZGV2L2Nhcy1maWxlbWdyLTEuNy4wLWRldi5qYXI6JHtIT01FfS8ubTIvcmVwb3NpdG9yeS94bWxycGMveG1scnBjLzIuMS1kZXYveG1scnBjLTIuMS1kZXYuamFyOiR7SE9NRX0vLm0yL3JlcG9zaXRvcnkvb3JnLmFwYWNoZS5vb2R0LmNhcy1tZXRhZGF0YS8xLjUuMC9jYXMtbWV0YWRhdGEtMS41LjAuamFyOiR7SE9NRX0vLm0yL3JlcG9zaXRvcnkvb3JnL2FwYWNoZS9sdWNlbmUvbHVjZW5lLWNvcmUvMi4wLjAvbHVjZW5lLWNvcmUtMi4wLjAuamFyOiR7SE9NRX0vLm0yL3JlcG9zaXRvcnkvanVnL2p1Zy1hc2wvMi4wLjAvanVnLWFzbC0yLjAuMC5qYXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvQ0FTIEZpbGUgTWFuYWdlciBVc2VyIEd1aWRlLmRvYyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvQ0FTIEZpbGUgTWFuYWdlciBVc2VyIEd1aWRlLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjRmZDJmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9DQVMgRmlsZSBNYW5hZ2VyIFVzZXIgR3VpZGUuZG9jCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmFzaF9hbGlhc2VzLnR4dCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmFzaF9hbGlhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NhNDgwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iYXNoX2FsaWFzZXMudHh0CkBAIC0wLDAgKzEsMzAgQEAKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMjIyMjIyMjIyMjIyMjI0JBU0ggU0hFTEwgQUxJQVNFUyMjIyMjIyMjIyMjIyMjIworIworIyBUaGUgZm9sbG93aW5nIGFsaWFzZXMgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIGZpbGVtZ3IncworIyBiaW4gZGlyZWN0b3J5IHNpbmNlIHJlbGF0aXZlIHBhdGhpbmcgaXMgYmVpbmcgdXNlZC4gIFRoaXMgYmxvY2sgYWxzbworIyBhc3N1bWVzIHRoYXQgdGhlIGZpbGVtZ3IgaXMgcnVubmluZyBvbiBwb3J0IDkwMDAgKHRoZSBkZWZhdWx0IHBvcnQgb2YgZmlsZW1ncikKKyMKKyMgRm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gc2VlOiAKKyMgICAgIGh0dHBzOi8vY3dpa2kuYXBhY2hlLm9yZy9jb25mbHVlbmNlL2Rpc3BsYXkvT09EVC9CQVNIK2FuZCtUQ1NIK3NoZWxsK3Rvb2xzK2ZvcitGaWxlK01hbmFnZXIKKyMKK2FsaWFzIGx1Y2VuZXF1ZXJ5PSJqYXZhIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9Li4vZXRjL2ZpbGVtZ3IucHJvcGVydGllcyAtRGphdmEuZXh0LmRpcnM9Li4vbGliIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29scy5RdWVyeVRvb2wgLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tbHVjZW5lIC1xdWVyeSAiCithbGlhcyBzcWxxdWVyeT0iamF2YSAtRG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5wcm9wZXJ0aWVzPS4uL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHMuUXVlcnlUb29sIC0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLXNxbCAtcXVlcnkgIgorYWxpYXMgZm1kZWw9ImphdmEgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucHJvcGVydGllcz0uLi9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzIC1EamF2YS5leHQuZGlycz0uLi9saWIgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzLkRlbGV0ZVByb2R1Y3QgLS1maWxlTWFuYWdlclVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1yZWFkIgorYWxpYXMgbWV0ZHVtcD0iamF2YSAtRGphdmEuZXh0LmRpcnM9Li4vbGliIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29scy5NZXRhZGF0YUR1bXBlciAtLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vdXQgLiAtLXByb2R1Y3RJZCAiCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Nhcy1maWxlbWdyLWNvcmUtc2NoZW1hLW9yYWNsZS5zcWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Nhcy1maWxlbWdyLWNvcmUtc2NoZW1hLW9yYWNsZS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyMmFiMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3ItY29yZS1zY2hlbWEtb3JhY2xlLnNxbApAQCAtMCwwICsxLDQyIEBACistLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorLS0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKy0tICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorLS0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorLS0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorLS0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorLS0NCistLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKy0tDQorLS0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCistLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCistLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorLS0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCistLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorDQorU0VUIEVDSE8gT047DQorQUxURVIgU0VTU0lPTiBTRVQgTkxTX0RBVEVfRk9STUFUPSdZWVlZLU1NLUREIGhoMjQ6bWk6c3MnOw0KKw0KK0NSRUFURSBUQUJMRSBQUk9EVUNUUyAoDQorICBQUk9EVUNUX0lEIG51bWJlcigxMSkgTk9UIE5VTEwgLA0KKyAgUFJPRFVDVF9TVFJVQ1RVUkUgVkFSQ0hBUigyMCkgIERFRkFVTFQgICcnTk9UIE5VTEwsIA0KKyAgUFJPRFVDVF9UWVBFX0lEIG51bWJlcigxMSkgIERFRkFVTFQgICcwJ05PVCBOVUxMLCANCisgIFBST0RVQ1RfTkFNRSBWQVJDSEFSKDI1NSkgIERFRkFVTFQgICcnTk9UIE5VTEwsIA0KKyAgUFJPRFVDVF9UUkFOU0ZFUl9TVEFUVVMgVkFSQ0hBUigyNTUpIERFRkFVTFQgJ1RSQU5TRkVSSU5HJyBOT1QgTlVMTCwNCisgIFBSSU1BUlkgS0VZICAoUFJPRFVDVF9JRCkNCispOw0KKw0KKy0tIEV4YW1wbGUgUFJPRFVDVFMgdGFibGUgdXNpbmcgUFJPRFVDVF9JRCBvZiB0eXBlIHN0cmluZw0KKy0tIENSRUFURSBUQUJMRSBQUk9EVUNUUyAoDQorLS0gICBQUk9EVUNUX0lEIFZBUkNIQVIoMTAwKSBOT1QgTlVMTCAsDQorLS0gICBQUk9EVUNUX1NUUlVDVFVSRSBWQVJDSEFSKDIwKSAgREVGQVVMVCAgJydOT1QgTlVMTCwgDQorLS0gICBQUk9EVUNUX1RZUEVfSUQgbnVtYmVyKDExKSAgREVGQVVMVCAgJzAnTk9UIE5VTEwsIA0KKy0tICAgUFJPRFVDVF9OQU1FIFZBUkNIQVIoMjU1KSAgREVGQVVMVCAgJydOT1QgTlVMTCwgDQorLS0gICBQUk9EVUNUX1RSQU5TRkVSX1NUQVRVUyBWQVJDSEFSKDI1NSkgREVGQVVMVCAnVFJBTlNGRVJJTkcnIE5PVCBOVUxMLA0KKy0tICAgUFJPRFVDVF9EQVRFVElNRSBEQVRFIE5PVCBOVUxMLA0KKy0tICBQUklNQVJZIEtFWSAgKFBST0RVQ1RfSUQpDQorLS0pOw0KKw0KK0NSRUFURSBJTkRFWCBQUk9EVUNUU19pZHggT04gUFJPRFVDVFMocHJvZHVjdF9pZCk7ICANCisNCitFWElUOw0KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3ItZHluLWNhdGFsb2ctc2NoZW1hLnNxbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3ItZHluLWNhdGFsb2ctc2NoZW1hLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWIwZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jYXMtZmlsZW1nci1keW4tY2F0YWxvZy1zY2hlbWEuc3FsCkBAIC0wLDAgKzEsMzUgQEAKKy0tICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy0tICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy0tICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCistLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy0tICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLS0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLS0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLS0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0NSRUFURSBUQUJMRSBZb3VyUHJvZHVjdFR5cGVOYW1lX21ldGFkYXRhCisoCisgIHBrZXkgaW50KDEwKSB1bnNpZ25lZCBwcmltYXJ5IEtFWSBBVVRPX0lOQ1JFTUVOVCwgCisgIHByb2R1Y3RfaWQgaW50IE5PVCBOVUxMLAorICBlbGVtZW50X2lkIHZhcmNoYXIoMTAwMCkgTk9UIE5VTEwsCisgIG1ldGFkYXRhX3ZhbHVlIHZhcmNoYXIoMjUwMCkgTk9UIE5VTEwKKykKKworQ1JFQVRFIFRBQkxFIFlvdXJQcm9kdWN0VHlwZU5hbWVfcmVmZXJlbmNlCisoCisgIHBrZXkgaW50KDEwKSB1bnNpZ25lZCBwcmltYXJ5IEtFWSBBVVRPX0lOQ1JFTUVOVCwKKyAgcHJvZHVjdF9pZCBpbnQgTk9UIE5VTEwsCisgIHByb2R1Y3Rfb3JpZ19yZWZlcmVuY2UgdmFyY2hhcigyMDAwKSBOT1QgTlVMTCwKKyAgcHJvZHVjdF9kYXRhc3RvcmVfcmVmZXJlbmNlIHZhcmNoYXIoMjAwMCksIAorICBwcm9kdWN0X3JlZmVyZW5jZV9maWxlc2l6ZSBpbnQgTk9UIE5VTEwsCisgIHByb2R1Y3RfcmVmZXJlbmNlX21pbWV0eXBlIHZhcmNoYXIoNTApCispCisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jYXMtZmlsZW1nci1yZXBvc2l0b3J5bWdyLXNjaGVtYS1vcmFjbGUuc3FsIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jYXMtZmlsZW1nci1yZXBvc2l0b3J5bWdyLXNjaGVtYS1vcmFjbGUuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMWZmZjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Nhcy1maWxlbWdyLXJlcG9zaXRvcnltZ3Itc2NoZW1hLW9yYWNsZS5zcWwKQEAgLTAsMCArMSwzMSBAQAorLS0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKy0tICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCistLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKy0tICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKy0tICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKy0tICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKy0tDQorLS0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCistLQ0KKy0tICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorLS0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorLS0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKy0tICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorLS0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KKw0KK1NFVCBFQ0hPIE9OOw0KK0FMVEVSIFNFU1NJT04gU0VUIE5MU19EQVRFX0ZPUk1BVD0nWVlZWS1NTS1ERCBoaDI0Om1pOnNzJzsNCisNCitDUkVBVEUgVEFCTEUgUFJPRFVDVF9UWVBFUyAoDQorICBQUk9EVUNUX1RZUEVfSUQgbnVtYmVyKDExKSBOT1QgTlVMTCAsDQorICBQUk9EVUNUX1RZUEVfTkFNRSBWQVJDSEFSKDI1NSkgIERFRkFVTFQgICcnTk9UIE5VTEwsIA0KKyAgUFJPRFVDVF9UWVBFX0RFU0NSSVBUSU9OIFZBUkNIQVIoMjU1KSAgREVGQVVMVCAgJydOT1QgTlVMTCwgDQorICBQUk9EVUNUX1RZUEVfVkVSU0lPTkVSX0NMQVNTIFZBUkNIQVIoMjU1KSBERUZBVUxUICcnLA0KKyAgUFJPRFVDVF9UWVBFX1JFUE9TSVRPUllfUEFUSCBWQVJDSEFSKDI1NSkgIERFRkFVTFQgICcnTk9UIE5VTEwsIA0KKyAgUFJJTUFSWSBLRVkgIChQUk9EVUNUX1RZUEVfSUQpDQorKTsNCisgDQorQ1JFQVRFIElOREVYIFBST0RVQ1RfVFlQRVNfSURYICBPTiAgUFJPRFVDVF9UWVBFUyhzZXFubyk7ICANCisNCitFWElUOw0KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3Itc2NoZW1hLW15c3FsLnNxbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3Itc2NoZW1hLW15c3FsLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGY5ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jYXMtZmlsZW1nci1zY2hlbWEtbXlzcWwuc3FsCkBAIC0wLDAgKzEsODQgQEAKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBDb25uZWN0aW9uOiBsb2NhbGhvc3QNCisjIEhvc3Q6IHNwYXduDQorIyBTYXZlZDogMjAwNi0wMS0wMiAxODoxMjowNg0KKyMgDQorCisjIEhvc3Q6IHNwYXduCisjIERhdGFiYXNlOiB0ZXN0X2NhcworIyBUYWJsZTogJ2VsZW1lbnRzJworIyAKK0NSRUFURSBUQUJMRSBgZWxlbWVudHNgICgKKyAgYGVsZW1lbnRfaWRgIGludCgxMSkgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCisgIGBlbGVtZW50X25hbWVgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLAorICBgZGF0YV90eXBlX2lkYCBpbnQoMTEpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLAorICBgZGNfZWxlbWVudGAgdmFyY2hhcigxMDApIGRlZmF1bHQgJycsCisgIGBlbGVtZW50X2Rlc2NyaXB0aW9uYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwgZGVmYXVsdCAnJywKKyAgUFJJTUFSWSBLRVkgIChgZWxlbWVudF9pZGApCispIEVOR0lORT1NeUlTQU0gREVGQVVMVCBDSEFSU0VUPWxhdGluMTsgCisKKyMgSG9zdDogc3Bhd24KKyMgRGF0YWJhc2U6IHRlc3RfY2FzCisjIFRhYmxlOiAncHJvZHVjdF90eXBlX2VsZW1lbnRfbWFwJworIyAKK0NSRUFURSBUQUJMRSBgcHJvZHVjdF90eXBlX2VsZW1lbnRfbWFwYCAoCisgIGBwcm9kdWN0X3R5cGVfZWxlbWVudF9tYXBfaWRgIGludCgxMSkgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCisgIGBwcm9kdWN0X3R5cGVfaWRgIGludCgxMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsCisgIGBlbGVtZW50X2lkYCBpbnQoMTEpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLAorICBQUklNQVJZIEtFWSAgKGBwcm9kdWN0X3R5cGVfZWxlbWVudF9tYXBfaWRgKQorKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjE7IAorCisjIEhvc3Q6IHNwYXduCisjIERhdGFiYXNlOiB0ZXN0X2NhcworIyBUYWJsZTogJ3Byb2R1Y3RfdHlwZXMnCisjIAorQ1JFQVRFIFRBQkxFIGBwcm9kdWN0X3R5cGVzYCAoCisgIGBwcm9kdWN0X3R5cGVfaWRgIGludCgxMSkgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCisgIGBwcm9kdWN0X3R5cGVfbmFtZWAgdmFyY2hhcigyNTUpIE5PVCBOVUxMIGRlZmF1bHQgJycsCisgIGBwcm9kdWN0X3R5cGVfZGVzY3JpcHRpb25gIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLAorICBgcHJvZHVjdF90eXBlX3ZlcnNpb25lcl9jbGFzc2AgdmFyY2hhcigyNTUpIGRlZmF1bHQgJycsCisgIGBwcm9kdWN0X3R5cGVfcmVwb3NpdG9yeV9wYXRoYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwgZGVmYXVsdCAnJywKKyAgUFJJTUFSWSBLRVkgIChgcHJvZHVjdF90eXBlX2lkYCkKKykgRU5HSU5FPU15SVNBTSBERUZBVUxUIENIQVJTRVQ9bGF0aW4xOyAKKworIyBIb3N0OiBzcGF3bgorIyBEYXRhYmFzZTogdGVzdF9jYXMKKyMgVGFibGU6ICdwcm9kdWN0cycKKyMgCitDUkVBVEUgVEFCTEUgYHByb2R1Y3RzYCAoCisgIGBwcm9kdWN0X2lkYCBpbnQoMTEpIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAorICBgcHJvZHVjdF9zdHJ1Y3R1cmVgIHZhcmNoYXIoMjApIE5PVCBOVUxMIGRlZmF1bHQgJycsCisgIGBwcm9kdWN0X3R5cGVfaWRgIGludCgxMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsCisgIGBwcm9kdWN0X25hbWVgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KKyAgYHByb2R1Y3RfdHJhbnNmZXJfc3RhdHVzYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwgZGVmYXVsdCAnVFJBTlNGRVJJTkcnLAorICBQUklNQVJZIEtFWSAgKGBwcm9kdWN0X2lkYCkKKykgRU5HSU5FPU15SVNBTSBERUZBVUxUIENIQVJTRVQ9bGF0aW4xOyAKKworIyBFeGFtcGxlIG9mICdwcm9kdWN0cycgdGFibGUgdXNpbmcgYSAncHJvZHVjdF9pZCcgY29sdW1uIG9mIHR5cGUgc3RyaW5nCisjIEhvc3Q6IHNwYXduCisjIERhdGFiYXNlOiB0ZXN0X2NhcworIyBUYWJsZTogJ3Byb2R1Y3RzJworIyAKKyNDUkVBVEUgVEFCTEUgYHByb2R1Y3RzYCAoCisjICBgcHJvZHVjdF9pZGAgdmFyY2hhcigxMDApIE5PVCBOVUxMLAorIyAgYHByb2R1Y3Rfc3RydWN0dXJlYCB2YXJjaGFyKDIwKSBOT1QgTlVMTCBkZWZhdWx0ICcnLAorIyAgYHByb2R1Y3RfdHlwZV9pZGAgaW50KDExKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywKKyMgIGBwcm9kdWN0X25hbWVgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLAorIyAgYHByb2R1Y3RfdHJhbnNmZXJfc3RhdHVzYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwgZGVmYXVsdCAnVFJBTlNGRVJJTkcnLAorIyAgYHByb2R1Y3RfZGF0ZXRpbWVgIGRhdGV0aW1lIE5PVCBOVUxMLAorIyAgUFJJTUFSWSBLRVkgIChgcHJvZHVjdF9pZGApCisjKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjE7IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3ItdmFsaWRhdGlvbmxheWVyLXNjaGVtYS1vcmFjbGUuc3FsIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jYXMtZmlsZW1nci12YWxpZGF0aW9ubGF5ZXItc2NoZW1hLW9yYWNsZS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1M2E0ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzLWZpbGVtZ3ItdmFsaWRhdGlvbmxheWVyLXNjaGVtYS1vcmFjbGUuc3FsCkBAIC0wLDAgKzEsNDUgQEAKKy0tICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCistLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorLS0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCistLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCistLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCistLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCistLQ0KKy0tICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorLS0NCistLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKy0tICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKy0tICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCistLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKy0tICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisNCisNCitTRVQgRUNITyBPTjsNCitBTFRFUiBTRVNTSU9OIFNFVCBOTFNfREFURV9GT1JNQVQ9J1lZWVktTU0tREQgaGgyNDptaTpzcyc7DQorDQorQ1JFQVRFIFRBQkxFIEVMRU1FTlRTICgNCisgIEVMRU1FTlRfSUQgbnVtYmVyKDExKSBOT1QgTlVMTCAsDQorICBFTEVNRU5UX05BTUUgVkFSQ0hBUigyNTUpICBERUZBVUxUICAnJ05PVCBOVUxMLCANCisgIERBVEFfVFlQRV9JRCBudW1iZXIoMTEpICBERUZBVUxUICAnMCdOT1QgTlVMTCwgDQorICBEQ19FTEVNRU5UIFZBUkNIQVIoMTAwKSBERUZBVUxUICcnLA0KKyAgRUxFTUVOVF9ERVNDUklQVElPTiBWQVJDSEFSKDI1NSkgIERFRkFVTFQgICcnTk9UIE5VTEwsIA0KKyAgUFJJTUFSWSBLRVkgIChFTEVNRU5UX0lEKQ0KKyk7DQorDQorQ1JFQVRFIFRBQkxFIFBST0RVQ1RfVFlQRV9FTEVNRU5UX01BUCAoDQorICBQUk9EVUNUX1RZUEVfRUxFTUVOVF9NQVBfSUQgbnVtYmVyKDExKSBOT1QgTlVMTCAsDQorICBQUk9EVUNUX1RZUEVfSUQgbnVtYmVyKDExKSAgREVGQVVMVCAgJzAnTk9UIE5VTEwsIA0KKyAgRUxFTUVOVF9JRCBudW1iZXIoMTEpICBERUZBVUxUICAnMCdOT1QgTlVMTCwgDQorICBQUklNQVJZIEtFWSAgKFBST0RVQ1RfVFlQRV9FTEVNRU5UX01BUF9JRCkNCispOw0KKw0KK0NSRUFURSBUQUJMRSBTVUJfVE9fU1VQRVJfTUFQICgNCisgIFBST0RVQ1RfVFlQRV9JRCBudW1iZXIoMTEpIERFRkFVTFQgJzAnTk9UIE5VTEwsDQorICBQQVJFTlRfSUQgbnVtYmVyKDExKSBERUZBVUxUICcwJ05PVCBOVUxMLA0KKyAgUFJJTUFSWSBLRVkgKFBST0RVQ1RfVFlQRV9JRCkNCispOwkNCisNCitDUkVBVEUgSU5ERVggRUxFTUVOVFNfSURYICBPTiAgRUxFTUVOVFMoc2Vxbm8pOyAgDQorQ1JFQVRFIElOREVYIFBSRENUX1RZUF9MTU5UX01QX0RYICBPTiAgUFJPRFVDVF9UWVBFX0VMRU1FTlRfTUFQKHNlcW5vKTsgIA0KK0NSRUFURSBJTkRFWCBTVUJfVE9fU1VQRVJfTVBfRFggT04gU1VCX1RPX1NVUEVSX01BUChzZXFubyk7DQorRVhJVDsNCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Nhc19maWxlbWdyX2NyZWF0ZV9vcmFjbGVfc2VxdWVuY2VzLnNxbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2FzX2ZpbGVtZ3JfY3JlYXRlX29yYWNsZV9zZXF1ZW5jZXMuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjk4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Nhc19maWxlbWdyX2NyZWF0ZV9vcmFjbGVfc2VxdWVuY2VzLnNxbApAQCAtMCwwICsxLDc2IEBACisvKgorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2NyZWF0ZSBzZXF1ZW5jZSBwcm9kdWN0c19zZXEKK3N0YXJ0IHdpdGggMQoraW5jcmVtZW50IGJ5IDEKK25vbWF4dmFsdWU7CisKK2NyZWF0ZSB0cmlnZ2VyIHByb2R1Y3RzX3RyaWdnZXIKK2JlZm9yZSBpbnNlcnQgb24gcHJvZHVjdHMKK2ZvciBlYWNoIHJvdworYmVnaW4KK3NlbGVjdCBwcm9kdWN0c19zZXEubmV4dHZhbCBpbnRvIDpuZXcucHJvZHVjdF9pZCBmcm9tIGR1YWw7CitlbmQ7CisKK2NyZWF0ZSBzZXF1ZW5jZSBwcm9kdWN0X3R5cGVzX3NlcQorc3RhcnQgd2l0aCAxCitpbmNyZW1lbnQgYnkgMQorbm9tYXh2YWx1ZTsKKworY3JlYXRlIHRyaWdnZXIgcHJvZHVjdF90eXBlc190cmlnZ2VyCitiZWZvcmUgaW5zZXJ0IG9uIHByb2R1Y3RfdHlwZXMKK2ZvciBlYWNoIHJvdworYmVnaW4KK3NlbGVjdCBwcm9kdWN0X3R5cGVzX3NlcS5uZXh0dmFsIGludG8gOm5ldy5wcm9kdWN0X3R5cGVfaWQgZnJvbSBkdWFsOworZW5kOworCitjcmVhdGUgc2VxdWVuY2UgZWxlbWVudHNfc2VxCitzdGFydCB3aXRoIDEKK2luY3JlbWVudCBieSAxCitub21heHZhbHVlOworCitjcmVhdGUgdHJpZ2dlciBlbGVtZW50c190cmlnZ2VyCitiZWZvcmUgaW5zZXJ0IG9uIGVsZW1lbnRzCitmb3IgZWFjaCByb3cKK2JlZ2luCitzZWxlY3QgZWxlbWVudHNfc2VxLm5leHR2YWwgaW50byA6bmV3LmVsZW1lbnRfaWQgZnJvbSBkdWFsOworZW5kOworCitjcmVhdGUgc2VxdWVuY2UgcHJvZHVjdF90eXBlX2VsZW1lbnRfbWFwX3NlcQorc3RhcnQgd2l0aCAxCitpbmNyZW1lbnQgYnkgMQorbm9tYXh2YWx1ZTsKKworY3JlYXRlIHRyaWdnZXIgcHR5cGVfZWxlbWVudF9tYXBfdHJpZ2dlcgorYmVmb3JlIGluc2VydCBvbiBwcm9kdWN0X3R5cGVfZWxlbWVudF9tYXAKK2ZvciBlYWNoIHJvdworYmVnaW4KK3NlbGVjdCBwcm9kdWN0X3R5cGVfZWxlbWVudF9tYXBfc2VxLm5leHR2YWwgaW50byA6bmV3LnByb2R1Y3RfdHlwZV9lbGVtZW50X21hcF9pZCBmcm9tIGR1YWw7CitlbmQ7CisKK2NyZWF0ZSBzZXF1ZW5jZSBkYXRhX3R5cGVzX3NlcQorc3RhcnQgd2l0aCAxCitpbmNyZW1lbnQgYnkgMQorbm9tYXh2YWx1ZTsKKworY3JlYXRlIHRyaWdnZXIgZGF0YV90eXBlc190cmlnZ2VyCitiZWZvcmUgaW5zZXJ0IG9uIGRhdGFfdHlwZXMKK2ZvciBlYWNoIHJvdworYmVnaW4KK3NlbGVjdCBkYXRhX3R5cGVzX3NlcS5uZXh0dmFsIGludG8gOm5ldy5kYXRhX3R5cGVfaWQgZnJvbSBkdWFsOworZW5kOwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2F0YWxvZy50eXBlbWFwLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MzEyNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY2F0YWxvZy50eXBlbWFwLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEV4YW1wbGUgUHJvZHVjdCBUeXBlIHRvIFRhYmxlIE1hcHBpbmdzCisjIChmb3IgcHJvZHVjdCB0eXBlcyB3aXRoIExPTkcgbmFtZXMsIGFsbG93cyB1cyB0byBnZXQKKyMgYXJvdW5kIE9yYWNsZSdzIHNhZCAzMSBjaGFyIHRhYmxlIG5hbWUgbGltaXQpCisKKyMgTm90ZSwgdGhlIGtleSBvbiB0aGUgbGVmdCBpcyB0aGUgYWN0dWFsIHJldHVybiBvZiB7QGxpbmsgUHJvZHVjdFR5cGUjZ2V0TmFtZSgpfQorIyBhbmQgdGhlIHZhbHVlIG9uIHRoZSByaWdodCBpcyB0aGUgbWFwcGVkIHRhYmxlIG5hbWUKKworR2VuZXJpY0ZpbGU9ZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiNzFlOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKQEAgLTAsMCArMSwxMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisJPGJlYW4gaWQ9ImFkZFByb2R1Y3RUeXBlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uQWRkUHJvZHVjdFR5cGVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJBZGRzIGEgUHJvZHVjdFR5cGUgdG8gbGlzdCBvZiBzdXBwb3J0ZWQgUHJvZHVjdFR5cGVzIiAvPgorCTwvYmVhbj4KKyAgPGJlYW4gaWQ9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5EZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWxldGUgUHJvZHVjdCBieSBuYW1lIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJkZWxldGVQcm9kdWN0QnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkRlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWxldGUgUHJvZHVjdCBieSBJRCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZHVtcE1ldGFkYXRhIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uRHVtcE1ldGFkYXRhQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEdW1wcyBQcm9kdWN0IE1ldGFkYXRhIG91dCB0byBYTUwiIC8+CisgIDwvYmVhbj4KKwk8YmVhbiBpZD0iZ2V0Q3VycmVudFRyYW5zZmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgUHJvZHVjdCBmaWxlIHRyYW5zZmVyIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRDdXJyZW50VHJhbnNmZXJzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IFByb2R1Y3QgZmlsZSB0cmFuc2ZlcnMiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBwZXJjZW50IGFtb3VudCB0cmFuc2ZlcnJlZCBvZiBnaXZlbiBmaWxlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRGaXJzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRGaXJzdFBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgZmlyc3QgcGFnZSBvZiBQcm9kdWN0cyBvZiBnaXZlbiBQcm9kdWN0VHlwZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0TGFzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRMYXN0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBsYXN0IHBhZ2Ugb2YgUHJvZHVjdHMgb2YgZ2l2ZW4gUHJvZHVjdFR5cGUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldE5leHRQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0TmV4dFBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgbmV4dCBwYWdlIG9mIFByb2R1Y3RzIG9mIGdpdmVuIFByb2R1Y3RUeXBlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXROdW1Qcm9kdWN0cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldE51bVByb2R1Y3RzQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIG51bWJlciBvZiBQcm9kdWN0cyBpbmdlc3RlZCBmb3IgYSBnaXZlbiBQcm9kdWN0VHlwZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0UHJldlBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcmV2UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBwcmV2IHBhZ2Ugb2YgUHJvZHVjdHMgb2YgZ2l2ZW4gUHJvZHVjdFR5cGUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXQgUHJvZHVjdCBpbmZvIGJ5IG5hbWUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgUHJvZHVjdCBpbmZvIGJ5IElEIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBwZXJjZW50IGFtb3VudCB0cmFuc2ZlcnJlZCBvZiBhIFByb2R1Y3RzIGRhdGEgZmlsZXMiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RUeXBlQnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgYSBQcm9kdWN0VHlwZSBieSBpdHMgbmFtZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iaGFzUHJvZHVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkhhc1Byb2R1Y3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrcyBpZiBQcm9kdWN0IHdpdGggZ2l2ZW4gbmFtZSBoYXMgYmVlbiBpbmdlc3RlZCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iaW5nZXN0UHJvZHVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkluZ2VzdFByb2R1Y3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkluZ2VzdHMgYSBQcm9kdWN0IiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJsdWNlbmVRdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkx1Y2VuZVF1ZXJ5Q2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJRdWVyaWVzIGJ5IHBhcnNpbmcgYW4gTHVjZW5lLWxpa2UgcXVlcnkgaW50byBhIEZpbGVNYW5hZ2VyIFF1ZXJ5IiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJyZXRyaWV2ZUZpbGVzQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLlJldHJpZXZlRmlsZXNDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJldHJpZXZlIGEgUHJvZHVjdCdzIGZpbGVzIGJ5IFByb2R1Y3QgSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InJldHJpZXZlRmlsZXNCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5SZXRyaWV2ZUZpbGVzQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSZXRyaWV2ZSBhIFByb2R1Y3QncyBmaWxlcyBieSBQcm9kdWN0IG5hbWUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InNxbFF1ZXJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uU3FsUXVlcnlDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlF1ZXJpZXMgYnkgcGFyc2luZyBhbiBTUUwtbGlrZSBxdWVyeSBpbnRvIGEgRmlsZU1hbmFnZXIgUXVlcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRldGFpbGVkRGVzY3JpcHRpb24iPgorICAgICAgPHZhbHVlPgorIFRoaXMgc3VwcG9ydHMgc2VuZGluZyBxdWVyaWVzIHRvIHRoZSBGaWxlTWFuYWdlciBpbiBmb3JtIG9mCisgIFNFTEVDVCBbRWxlbWVudHNdIEZST00gW1Byb2R1Y3RUeXBlc10gV0hFUkUgW3doZXJlLWNsYXVzZV0sIHdoZXJlOgorICAgLSBbRWxlbWVudHNdOiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIEVsZW1lbnQgbmFtZXM7IG1heSBhbHNvIGJlICogd2hpY2gKKyAgICByZXByZXNlbnRzIGFsbCBFbGVtZW50cworICAgLSBbUHJvZHVjdFR5cGVzXTogaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBQcm9kdWN0VHlwZSBuYW1lczsgbWF5IGFsc28KKyAgICBiZSAqIHdoaWNoIHJlcHJlc2VudHMgYWxsIFByb2R1Y3RUeXBlcworICAgLSBbd2hlcmUtY2xhdXNlXTogaXMgYW4gb3B0aW9uYWwgRWxlbWVudCBuYW1lIGZpbHRlciBzdXBwb3J0aW5nIHRoZSBmb2xsb3dpbmc6CisgICAgICAqIEFORCBhbmQgT1IgYm9vbGVhbiBvcGVyYXRvcnMKKyAgICAgICogKCkgZ3JvdXBpbmcgb2YgcXVlcmllcworICAgICAgKiBlbGVtZW50LW5hbWUgPT0gJ2VsZW1lbnQtdmFsdWUnCisgICAgICAqIGVsZW1lbnQtbmFtZSAmIzYwOyAnZWxlbWVudC12YWx1ZScKKyAgICAgICogZWxlbWVudC1uYW1lICYjNjI7ICdlbGVtZW50LXZhbHVlJworICAgICAgKiBlbGVtZW50LW5hbWUgJiM2MDs9ICdlbGVtZW50LXZhbHVlJworICAgICAgKiBlbGVtZW50LW5hbWUgJiM2Mjs9ICdlbGVtZW50LXZhbHVlJyIKKworIEFuIGFkZGl0aW9uYWwgcG9zdC1xdWVyeSBGaWx0ZXJBbGdvciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgd2hlcmUgeW91IHNwZWNpZnkKKyAgd2hpY2ggTWV0YWRhdGEgZmllbGRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIGVhY2ggUHJvZHVjdCdzIFN0YXJ0RGF0ZVRpbWUsCisgIEVuZERhdGVUaW1lLCBhbmQgUHJpb3JpdHkgdmFsdWVzCisgICAgICA8L3ZhbHVlPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImV4YW1wbGVzIj4KKyAgICAgIDx2YWx1ZT4KKyAoQXNzdW1lIHlvdSBoYXZlIGEgUHJvZHVjdFR5cGUsIEdlbmVyaWNGaWxlLCB3aGljaCBzdXBwb3J0cyB0aGUKKyAgICBFbGVtZW50czogRmlsZW5hbWUsIE5vbWluYWxEYXRlLCBHcm91cCwgYW5kIERhdGFWZXJzaW9uKQorICAkIC4vZmlsZW1nci1jbGllbnQgLXUgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC1vcCAtc3FsCisgICAgLXEgIlNFTEVDVCBGaWxlbmFtZSBGUk9NIEdlbmVyaWNGaWxlIFdIRVJFIChOb21pbmFsRGF0ZSA9PSAnMjAxMS0yMC0xMCcgT1IKKyAgICAgIE5vbWluYWxEYXRlID09ICcyMDExLTIwLTExJykgQU5EIEdyb3VwID09ICdUZXN0JyBBTkQgRGF0YVZlcnNpb24gPiAnMS4wJyIKKyAoUmV0dXJucyBhbGwgUHJvZHVjdHMgaW4gRmlsZU1hbmFnZXIgLS0gdXNlIHdpdGggY2FyZSkKKyAgJCAuL2ZpbGVtZ3ItY2xpZW50IC11IGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtb3AgLXNxbCAtcSAiU0VMRUNUICogRlJPTSAqIgorICAgICAgPC92YWx1ZT4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZmMxNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtb3B0aW9ucy54bWwKQEAgLTAsMCArMSwxMjAwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICAgICAgICAgIHJpdmVybWEgKFJpc2hpIFZlcm1hKQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworCTxiZWFuIGlkPSJ1cmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkZpbGUgTWFuYWdlciBVUkwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4KKwkJCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydHlOYW1lcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51cmw8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0ib3BlcmF0aW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im9wIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im9wZXJhdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkJdmFsdWU9IkRlY2xhcmUgdGhhdCB5b3Ugd2lzaCB0byBwcmVzZW50IGFuIG9wZXJhdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJhZGRQcm9kdWN0VHlwZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJkZWxldGVQcm9kdWN0QnlJZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJkZWxldGVQcm9kdWN0QnlOYW1lIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImluZ2VzdFByb2R1Y3QiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iaGFzUHJvZHVjdCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRQcm9kdWN0VHlwZUJ5TmFtZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXROdW1Qcm9kdWN0cyIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRGaXJzdFBhZ2UiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0TmV4dFBhZ2UiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0UHJldlBhZ2UiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0TGFzdFBhZ2UiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0Q3VycmVudFRyYW5zZmVyIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldEN1cnJlbnRUcmFuc2ZlcnMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0UHJvZHVjdEJ5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0UHJvZHVjdEJ5TmFtZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0RmlsZVBjdFRyYW5zZmVycmVkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InNxbFF1ZXJ5IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImR1bXBNZXRhZGF0YSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJsdWNlbmVRdWVyeSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEFkZFByb2R1Y3RUeXBlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImFkZFByb2R1Y3RUeXBlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJhZGRQVCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhZGRQcm9kdWN0VHlwZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgYWRkUHJvZHVjdFR5cGUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+YWRkUHJvZHVjdFR5cGU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworICA8YmVhbiBpZD0idHlwZUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idGlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idHlwZUlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3RUeXBlIElkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icHJvZHVjdC10eXBlLWlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6bWV0aG9kTmFtZT0ic2V0UHJvZHVjdFR5cGVJZCIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJ0eXBlTmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InRuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idHlwZU5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdFR5cGUgbmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InByb2R1Y3QtdHlwZS1uYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6bWV0aG9kTmFtZT0ic2V0UHJvZHVjdFR5cGVOYW1lIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InR5cGVEZXNjIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ0eXBlRGVzYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0VHlwZSBkZXNjcmlwdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRlc2NyaXB0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6bWV0aG9kTmFtZT0ic2V0UHJvZHVjdFR5cGVEZXNjcmlwdGlvbiIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJyZXBvc2l0b3J5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icmVwbyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlcG9zaXRvcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdFR5cGUgcmVwb3NpdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOm1ldGhvZE5hbWU9InNldEZpbGVSZXBvc2l0b3J5UGF0aCIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJ2ZXJzaW9uQ2xhc3MiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ2YyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InZlcnNpb25DbGFzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0VHlwZSB2ZXJzaW9uZXIgY2xhc3MiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjbGFzc3BhdGgiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDptZXRob2ROYW1lPSJzZXRWZXJzaW9uZXIiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEluZ2VzdFByb2R1Y3QgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImluZ2VzdFByb2R1Y3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJpbmdlc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJpbmdlc3RQcm9kdWN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGluZ2VzdFByb2R1Y3QgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5pbmdlc3RQcm9kdWN0PC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InByb2R1Y3RTdHJ1Y3R1cmUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByb2R1Y3RTdHJ1Y3R1cmUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iSGllcmFyY2hpY2FsIHwgRmxhdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InN0cnVjdHVyZS10eXBlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOm1ldGhvZE5hbWU9InNldFByb2R1Y3RTdHJ1Y3R1cmUiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ibWV0YWRhdGFGaWxlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibWYiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtZXRhZGF0YUZpbGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWV0YWRhdGEgWE1MIGZpbGUgcGF0aCBvciBVUkwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlLXBhdGgtb3ItdXJsIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImNsaWVudFRyYW5zZmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJjbGllbnRUcmFuc2ZlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJVc2VyIGNsaWVudCB0cmFuc2ZlcmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJkYXRhVHJhbnNmZXIiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJkYXRhVHJhbnNmZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZHQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkYXRhVHJhbnNmZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGF0YVRyYW5zZmVyZXIgZmFjdG9yeSBjbGFzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDptZXRob2ROYW1lPSJzZXREYXRhVHJhbnNmZXJlciIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJyZWZzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWZzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRhdGEgZmlsZSBwYXRoIG9yIFVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZS1wYXRoLW9yLXVybCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDptZXRob2ROYW1lPSJzZXRSZWZlcmVuY2VzIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBIYXNQcm9kdWN0IE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJoYXNQcm9kdWN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHJvZHVjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Imhhc1Byb2R1Y3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgaGFzUHJvZHVjdCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmhhc1Byb2R1Y3Q8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imhhc1Byb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldFByb2R1Y3RUeXBlQnlOYW1lIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXRQcm9kdWN0VHlwZUJ5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InB0YnluIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UHJvZHVjdFR5cGVCeU5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UHJvZHVjdFR5cGVCeU5hbWUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRQcm9kdWN0VHlwZUJ5TmFtZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdFR5cGVCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldE51bVByb2R1Y3RzIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXROdW1Qcm9kdWN0cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im51bSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldE51bVByb2R1Y3RzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldE51bVByb2R1Y3RzIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0TnVtUHJvZHVjdHM8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE51bVByb2R1Y3RzIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBHZXRGaXJzdFBhZ2UgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldEZpcnN0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBhZ2UxIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0Rmlyc3RQYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldEZpcnN0UGFnZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldEZpcnN0UGFnZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0Rmlyc3RQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBHZXROZXh0UGFnZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0TmV4dFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuZXh0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TmV4dFBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0TmV4dFBhZ2UgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXROZXh0UGFnZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TmV4dFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldFByZXZQYWdlIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXRQcmV2UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InByZXYiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcmV2UGFnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcmV2UGFnZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByZXZQYWdlPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcmV2UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0TGFzdFBhZ2UgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldExhc3RQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibGFzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldExhc3RQYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldExhc3RQYWdlIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0TGFzdFBhZ2U8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldExhc3RQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBHZXRDdXJyZW50VHJhbnNmZXIgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldEN1cnJlbnRUcmFuc2ZlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImN1clRyYW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRDdXJyZW50VHJhbnNmZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Q3VycmVudFRyYW5zZmVyIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0Q3VycmVudFRyYW5zZmVyPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRDdXJyZW50VHJhbnNmZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEN1cnJlbnRUcmFuc2ZlcnMgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldEN1cnJlbnRUcmFuc2ZlcnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjdXJUcmFucyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEN1cnJlbnRUcmFuc2ZlcnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Q3VycmVudFRyYW5zZmVycyBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldEN1cnJlbnRUcmFuc2ZlcnM8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEN1cnJlbnRUcmFuc2ZlcnMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RQY3RUcmFuc2ZlcnJlZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBjdFRyYW5zIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBHZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXRGaWxlUGN0VHJhbnNmZXJyZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJmaWxlUGN0VHJhbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRGaWxlUGN0VHJhbnNmZXJyZWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ib3JpZ1JlZiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im9yIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib3JpZ1JlZiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJPcmlnaW5hbCByZWZlcmVuY2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlLXBhdGgtb3ItdXJsIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBTcWxRdWVyeSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0ic3FsUXVlcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzcWwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzcWxRdWVyeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBzcWxRdWVyeSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPnNxbFF1ZXJ5PC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisKKworICA8IS0tIEdldFByb2R1Y3RCeUlkIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXRQcm9kdWN0QnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBieWlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UHJvZHVjdEJ5SWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UHJvZHVjdEJ5SWQgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRQcm9kdWN0QnlJZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdEJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldFByb2R1Y3RCeU5hbWUgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwYnluIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UHJvZHVjdEJ5TmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcm9kdWN0QnlOYW1lIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0UHJvZHVjdEJ5TmFtZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdEJ5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gRGVsZXRlUHJvZHVjdEJ5SWQgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImRlbGV0ZVByb2R1Y3RCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZGJ5aWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZWxldGVQcm9kdWN0QnlJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBkZWxldGVQcm9kdWN0QnlJZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmRlbGV0ZVByb2R1Y3RCeUlkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkZWxldGVQcm9kdWN0QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gRGVsZXRlUHJvZHVjdEJ5TmFtZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZGVsZXRlUHJvZHVjdEJ5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImRieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZWxldGVQcm9kdWN0QnlOYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGRlbGV0ZVByb2R1Y3RCeU5hbWUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5kZWxldGVQcm9kdWN0QnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkZWxldGVQcm9kdWN0QnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBEdW1wTWV0YWRhdGEgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImR1bXBNZXRhZGF0YSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImRtZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkdW1wTWV0YWRhdGEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZHVtcE1ldGFkYXRhIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+ZHVtcE1ldGFkYXRhPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkdW1wTWV0YWRhdGEiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ib3V0cHV0RGlyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib3V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib3V0cHV0RGlyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik91dHB1dCBkaXJlY3RvcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLmlvLkZpbGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlLWRpciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZHVtcE1ldGFkYXRhIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBMdWNlbmVRdWVyeSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0ibHVjZW5lUXVlcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJsdWNlbmUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJsdWNlbmVRdWVyeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBsdWNlbmVRdWVyeSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmx1Y2VuZVF1ZXJ5PC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJyZWR1Y2VkUHJvZHVjdFR5cGVzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVkdWNlZFByb2R1Y3RUeXBlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJMaW1pdCBxdWVyeSBQcm9kdWN0VHlwZXMgcXVlcmllZCBhZ2FpbnN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJsaXN0LW9mLXByb2R1Y3QtdHlwZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlZHVjZWRNZXRhZGF0YUtleXMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtZXRLZXlzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVkdWNlZE1ldGFkYXRhS2V5cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJMaW1pdCBFbGVtZW50cyByZXR1cm5lZCBieSBxdWVyeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibGlzdC1vZi1lbGVtZW50cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIHJldHJpZXZlRmlsZXMgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9InJldHJpZXZlRmlsZXNCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icmZieWlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmV0cmlldmVGaWxlc0J5SWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgcmV0cmlldmVGaWxlc0J5SWQgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5yZXRyaWV2ZUZpbGVzQnlJZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icmV0cmlldmVGaWxlc0J5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJmYnluIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmV0cmlldmVGaWxlc0J5TmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZXRyaWV2ZUZpbGVzQnlOYW1lIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+cmV0cmlldmVGaWxlc0J5TmFtZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJ0cmFuc2ZlcmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idHJhbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ0cmFuc2ZlcmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkZhY3RvcnkgZm9yIGNyZWF0aW5nIERhdGFUcmFuc2ZlciB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGZpbGUgdHJhbnNmZXIocykiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlckZhY3RvcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ0cmFuc2ZlciBmYWN0b3J5IGNsYXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeUlkIiBwOm1ldGhvZE5hbWU9InNldERhdGFUcmFuc2ZlckZhY3RvcnkiIC8+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBwOm1ldGhvZE5hbWU9InNldERhdGFUcmFuc2ZlckZhY3RvcnkiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iZGVzdGluYXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkZXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZGVzdGluYXRpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGlyZWN0b3J5IHRvIHRyYW5zZmVyIFByb2R1Y3QgZmlsZSB0byIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEuaW8uRmlsZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRpcmVjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKwk8IS0tIE9wdGlvbnMgdXNlZCBmb3IgbXVsdGlwbGUgQWN0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9InByb2R1Y3RJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBpZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByb2R1Y3RJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0IElEIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icHJvZHVjdC1pZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZGVsZXRlUHJvZHVjdEJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkdW1wTWV0YWRhdGEiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCQorICA8YmVhbiBpZD0icHJvZHVjdE5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByb2R1Y3ROYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3QgbmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InByb2R1Y3QtbmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imhhc1Byb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0QnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZGVsZXRlUHJvZHVjdEJ5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icHJvZHVjdFR5cGVOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHRuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdFR5cGVOYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3RUeXBlIG5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJwcm9kdWN0LXR5cGUtbmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RUeXBlQnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TnVtUHJvZHVjdHMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRGaXJzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByZXZQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TGFzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisgIAorICA8YmVhbiBpZD0iY3VycmVudFBhZ2VOdW0iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjdXJQYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iY3VycmVudFBhZ2VOdW0iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ3VycmVudCBQYWdlIE51bWJlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InBhZ2UtbnVtYmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByZXZQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InF1ZXJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkZpbGUgTWFuYWdlciBxdWVyeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InNvcnRCeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNiIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic29ydEJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1ldGFkYXRhIGZpZWxkIHRvIHNvcnQgcXVlcnkgcmVzdWx0cyBieSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im1ldGFkYXRhIGZpZWxkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Im91dHB1dEZvcm1hdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im9mIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib3V0cHV0Rm9ybWF0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik91dHB1dCBmb3JtYXQgc3RyaW5nIChpLmUuIEZpbGVuYW1lID0gJEZpbGVuYW1lKSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im91dHB1dC1mb3JtYXQtc3RyaW5nIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImRlbGltaXRlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImRsbXRyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZGVsaW1pdGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlN0cmluZyB0byB1c2UgdGhlIHNlcGFyYXRlIHF1ZXJ5IHJlc3VsdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJkZWxpbWl0ZXItc3RyaW5nIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImZpbHRlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImYiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJmaWx0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUXVlcnkgZmlsdGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJhbGdvciIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImNvbnZlcnRlciIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJzdGFydERhdGVUaW1lTWV0S2V5IiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZW5kRGF0ZVRpbWVNZXRLZXkiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJwcmlvcml0eU1ldEtleSIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImFsZ29yIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImFsZ29yIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iYWxnb3IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsdGVyQWxnb3IgY2xhc3MiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5maWx0ZXIuRmlsdGVyQWxnb3IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjbGFzc3BhdGgiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKyAgCisgIDxiZWFuIGlkPSJjb252ZXJ0ZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY29udiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNvbnZlcnRlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJWZXJzaW9uQ29udmVydGVyIGNsYXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuY29udi5WZXJzaW9uQ29udmVydGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iY2xhc3NwYXRoIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InN0YXJ0RGF0ZVRpbWVNZXRLZXkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic2R0TWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic3RhcnREYXRlVGltZU1ldEtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJTdGFydCBkYXRlIHRpbWUgbWV0YWRhdGEga2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWV0YWRhdGEta2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisgIAorICA8YmVhbiBpZD0iZW5kRGF0ZVRpbWVNZXRLZXkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZWR0TWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZW5kRGF0ZVRpbWVNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRW5kIGRhdGUgdGltZSBtZXRhZGF0YSBrZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJtZXRhZGF0YS1rZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKyAgCisgIDxiZWFuIGlkPSJwcmlvcml0eU1ldEtleSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwck1ldEtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InByaW9yaXR5TWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByaW9yaXR5IG1ldGFkYXRhIGtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im1ldGFkYXRhLWtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9lbGVtZW50cy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcmUvZWxlbWVudHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMGNjZGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcmUvZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0SWQiIG5hbWU9IkNBUy5Qcm9kdWN0SWQiPgorCQk8ZGNFbGVtZW50PklkZW50aWZpZXI8L2RjRWxlbWVudD4KKyAgICAgICAgPCEtLSAgCisgICAgICAgICBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhICd0cmltJyB0YWcgdG8gaWRlbnRpZnkgd2hldGhlcgorICAgICAgICAgb3Igbm90IHlvdSB3YW50IG5ld2xpbmVzIHRyaW1tZWQgZnJvbSB0aGUgZWxlbWVudCBkZXNjcmlwdGlvbi4gVG8KKyAgICAgICAgIHR1cm4gb2ZmIHRyaW1taW5nIChub3cgZG9uZSBieSBkZWZhdWx0KSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHdpdGggeW91cgorICAgICAgICAgZGVzY3JpcHRpb24gZGVmaW5pdGlvbjogdHJpbT0iZmFsc2UiICAgICAgIAorICAgICAgICAgLS0+CisJCTxkZXNjcmlwdGlvbj4KKwkJCUEgUHJvZHVjdCdzIHVuaXF1ZSBpZGVudGlmaWVyIHdpdGhpbiB0aGUgQ0FTIG5hbWVzcGFjZS4KKwkJPC9kZXNjcmlwdGlvbj4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIiBuYW1lPSJDQVMuUHJvZHVjdE5hbWUiPgorCQk8ZGNFbGVtZW50PlRpdGxlPC9kY0VsZW1lbnQ+CisJCTxkZXNjcmlwdGlvbj4KKwkJCUEgUHJvZHVjdCdzIG5hbWUgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFJlY2VpdmVkVGltZSIKKwkJbmFtZT0iQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiPgorCQk8ZGNFbGVtZW50IC8+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBJU08gODYwMSBmb3JtYXR0ZWQgdGltZSB0aGF0IHRoZSBQcm9kdWN0IHdhcyByZWNlaXZlZC4KKwkJPC9kZXNjcmlwdGlvbj4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIiBuYW1lPSJGaWxlbmFtZSI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlTG9jYXRpb24iIG5hbWU9IkZpbGVMb2NhdGlvbiI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBsb2NhdGlvbnMgb2YgdGhlIGZpbGVzIHRoYXQgcmVwcmVzZW50IHRoaXMgcHJvZHVjdC4KKwkJPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFR5cGUiIG5hbWU9IlByb2R1Y3RUeXBlIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVHlwZSBvZiBwcm9kdWN0LCBhcyBzcGVjaWZpZWQgYnksIGUuZy4sIGEgZGF0YSBiaWJsZS4KKwkJPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFN0cnVjdHVyZSIgbmFtZT0iUHJvZHVjdFN0cnVjdHVyZSI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVdoZXRoZXIgb3Igbm90IGEgcHJvZHVjdCBpcyBGbGF0IChlLmcuLCBhIHNldCBvZiBpbmRlcGVuZGVudAorCQkJZmlsZXMpLCBvciBoaWVyYXJjaGljYWwsIGUuZy4sIGEgZGlyIHN0cnVjdHVyZS4KKwkJPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6TWltZVR5cGUiIG5hbWU9Ik1pbWVUeXBlIj4KKwkJPGRlc2NyaXB0aW9uPlRoZSBJRVRGIG1pbWUgdHlwZSBvZiB0aGlzIHByb2R1Y3QuPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOnRlc3Q6RGF0YVZlcnNpb24iIG5hbWU9IkRhdGFWZXJzaW9uIj4KKwkJPGRlc2NyaXB0aW9uPlRoZSB2ZXJzaW9uIG9mIHRoZSBkYXRhIHByb2R1Y3Q8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorPC9jYXM6ZWxlbWVudHM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcmUvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjBiNjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcmUvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZW1hcCB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8IS0tICBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2UKKyAgICAgICBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcyAKKyAgLS0+CisgICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0U3RydWN0dXJlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVMb2NhdGlvbiIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpNaW1lVHlwZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46dGVzdDpEYXRhVmVyc2lvbiIvPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9wcm9kdWN0LXR5cGVzLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9wcm9kdWN0LXR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDUyNTliCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9jb3JlL3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZXMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisgIDx0eXBlIGlkPSJ1cm46b29kdDpHZW5lcmljRmlsZSIgbmFtZT0iR2VuZXJpY0ZpbGUiPgorICAgIDxyZXBvc2l0b3J5IHBhdGg9ImZpbGU6Ly9bSE9NRV0vZmlsZXMiLz4KKyAgICA8dmVyc2lvbmVyIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5CYXNpY1ZlcnNpb25lciIvPgorICAgIDwhLS0gIAorICAgICBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhICd0cmltJyB0YWcgdG8gaWRlbnRpZnkgd2hldGhlcgorICAgICBvciBub3QgeW91IHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBwcm9kdWN0IHR5cGUgZGVzY3JpcHRpb24uIFRvCisgICAgIHR1cm4gb2ZmIHRyaW1taW5nIChub3cgZG9uZSBieSBkZWZhdWx0KSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB3aXRoIHlvdXIKKyAgICAgZGVzY3JpcHRpb24gZGVmaW5pdGlvbjogdHJpbT0iZmFsc2UiICAgICAgIAorICAgICAtLT4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgcHJvZHVjdCB0eXBlIGZvciBhbnkga2luZCBvZiBmaWxlLjwvZGVzY3JpcHRpb24+CisgICAgPCEtLSBHbG9iYWwgYWdncmVnYXRlIHByb2R1Y3QgdHlwZSBtZXRhZGF0YTogeW91IGNhbiBkZWNsYXJlIHRoaXMgaW4gdGhlIAorICAgICAgICAgc2FtZSB3YXkgeW91J2Qgd2lyZSB0b2dldGhlciBhIENBUyBtZXQgZmlsZSwgZXZlbiB1c2luZyBtdWx0aXBsZSB2YWx1ZXMKKyAgICAgICAgIHBlciBrZXkuCisgICAgICAgICAKKyAgICAgICAgIFRoaXMgbWV0YWRhdGEgY2FuIGJlIGxvb2tlZCB1cCB2aWEgdGhlIFByb2R1Y3QgVHlwZSBBUEksIGFuZCBhbHNvIHVzZWQgCisgICAgICAgICBpbiBicm93c2VycyBhbmQgc28gZm9ydGggdG8gZGlzcGxheSBnbG9iYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGNvbGxlY3Rpb24gCisgICAgICAgICBvZiBQcm9kdWN0cyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCB0eXBlLgorICAgIC0tPgorICAgIDxtZXRhZGF0YT4KKyAgICAgIDxrZXl2YWw+CisgICAgICAgIDxrZXk+UHJvZHVjdFR5cGU8L2tleT4KKyAgICAgICAgPHZhbD5HZW5lcmljRmlsZTwvdmFsPgorICAgICAgPC9rZXl2YWw+CisgICAgICA8IS0tIGlmIHlvdSBhcmUgdXNpbmcgdGhlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLlByb2R1Y3RUeXBlTWV0VmVyc2lvbmVyIAorICAgICAgICAgICB5b3UgY2FuIHNldCBhIG1ldCBrZXkgbGlrZSBiZWxvdyB0byBkZWZpbmUgeW91ciBmaWxlUGF0aFNwZWMKKyAgICAgIDxrZXl2YWw+CisgICAgICAgIDxrZXk+ZmlsZVBhdGhTcGVjPC9rZXk+CisgICAgICAgIDx2YWw+L1tGaWxlbmFtZV08L3ZhbD4KKyAgICAgIDwva2V5dmFsPgorICAgICAgLS0+CisgICAgPC9tZXRhZGF0YT4KKyAgICA8bWV0RXh0cmFjdG9ycz4KKyAgICAgIDxleHRyYWN0b3IKKyAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLkNvcmVNZXRFeHRyYWN0b3IiPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tICB5b3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUgZW52UmVwbGFjZSB0YWcgdG8gdHVybiBvbi9vZmYgZW52aXJvbm1lbnQgdmFyIHJlcGxhY2VtZW50IC0tPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuc0F3YXJlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxlbWVudE5zIiB2YWx1ZT0iQ0FTIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50cyIKKyAgICAgICAgICAgIHZhbHVlPSJQcm9kdWN0UmVjZWl2ZWRUaW1lLFByb2R1Y3ROYW1lLFByb2R1Y3RJZCIgLz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9leHRyYWN0b3I+CisgICAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlcy5NaW1lVHlwZUV4dHJhY3RvciIgLz4KKyAgICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLkZpbmFsRmlsZUxvY2F0aW9uRXh0cmFjdG9yIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLSB0aGlzIHByb3BlcnR5IHNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBGSUxFX0xPQ0FUSU9OIGZpZWxkCisgICAgICAgICAgICAgICBjb21wdXRlZCBieSB0aGlzIGV4dHJhY3RvciB0byByZXBsYWNlIGFueSBvdGhlciBGSUxFX0xPQ0FUSU9OIG1ldCAKKyAgICAgICAgICAgICAgIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgLS0+CisgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBsYWNlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIAorICAgICAgPCEtLSAKKyAgICAgICAgVGhlIGJlbG93IGVuYWJsZXMgdGhlIEZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IuCisgICAgICAgIEl0IGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSBhIGZpbGVuYW1lIHBhdHRlcm4gd2l0aCBKYXZhIFJlZ2V4IHRoYXQgaWRlbnRpZmllcyBncm91cHMgCisgICAgICAgIHdpdGhpbiBhIHBhcnRpY3VsYXIgZmlsZSBuYW1lLiBUaG9zZSBncm91cHMgYXJlIHRoZW4gbWFwcGVkIHRvIE1ldGFkYXRhIGtleSBuYW1lcywgYW5kIAorICAgICAgICBleHRyYWN0ZWQgYXMgbWV0YWR0YSBmcm9tIGEgZmlsZSdzIG5hbWUuCisgICAgICAgIAorICAgICAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlcmUgYXJlIHR3byBncm91cHMsIEZpbGVuYW1lLCBhbmQgUHJvZHVjdElkLCBmb3IgZmlsZXMKKyAgICAgICAgb2YgdGhlIGZvcm06CisgICAgICAgIAorICAgICAgICBGaWxlbmFtZV9Qcm9kdWN0SWQudHh0CisgICAgICAgIAorICAgICAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmN0b3JzLmV4YW1wbGVzLkZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IiPgorICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZpbGVuYW1lUGF0dGVybiIgdmFsdWU9IihcXHcqKV8oXFxkKilcXC50eHQiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXRhZGF0YUtleXMiIHZhbHVlPSJGaWxlbmFtZSxQcm9kdWN0SWQiLz4KKyAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIAorICAgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIAorICAgICAgIC0tPgorCisgICAgIDwhLS0KKyAgICAgICBUaGUgYmVsb3cgZW5hYmxlcyB0aGUgVGlrYUF1dG9EZXRlY3RFeHRyYWN0b3IuIEl0IGRvZXMgbm90IHRha2UgYW55IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICAgICAgIGFuZCBzaW1wbGUgcnVucyBBcGFjaGUgVGlrYSBvbiB0aGUgcmVmZXJlbmNlIGZvciB0aGUgUHJvZHVjdCBhbmQgYXNzdW1lcyBpdCdzIGEgc2luZ2xlIGZpbGUgCisgICAgICAgcHJvZHVjdCAoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCkuCisKKyAgICAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlcy5UaWthQXV0b0RldGVjdEV4dHJhY3RvciIvPgorICAgICAgLS0+ICAgICAKKyAgICA8L21ldEV4dHJhY3RvcnM+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL2VsZW1lbnRzLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL2VsZW1lbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmZjMDEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9nZW8vZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy9jb21wb25lbnRzL2NhcyI+CisgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpMYXRpdHVkZSIgbmFtZT0iTGF0aXR1ZGUiPgorICAgIDwhLS0KKyAgICAgIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgJ3RyaW0nIHRhZyB0byBpZGVudGlmeSB3aGV0aGVyIG9yIG5vdCB5b3UKKyAgICAgIHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLiBUbyB0dXJuIG9mZiB0cmltbWluZworICAgICAgKG5vdyBkb25lIGJ5IGRlZmF1bHQpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgd2l0aCB5b3VyIGRlc2NyaXB0aW9uCisgICAgICBkZWZpbml0aW9uOiB0cmltPSJmYWxzZSIKKyAgICAtLT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBHZW9ncmFwaGljYWwgbGF0aXR1ZGUgZGF0YSBmb3IgYSBwcm9kdWN0LgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGRjRWxlbWVudCAvPgorICA8L2VsZW1lbnQ+CisgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpMb25naXR1ZGUiIG5hbWU9IkxvbmdpdHVkZSI+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgR2VvZ3JhcGhpY2FsIGxvbmdpdHVkZSBkYXRhIGZvciBhIHByb2R1Y3QuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8ZGNFbGVtZW50IC8+CisgIDwvZWxlbWVudD4KKzwvY2FzOmVsZW1lbnRzPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9nZW8vcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2YTZlYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6cHJvZHVjdHR5cGVtYXAgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5hcGFjaGUub3JnL2NvbXBvbmVudHMvY2FzIj4KKyAgPCEtLQorICAgIFlvdSBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2Ugb2YKKyAgICBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcy4KKyAgLS0+CisgIDx0eXBlIGlkPSJ1cm46b29kdDpMb2NhdGlvbkF3YXJlUHJvZHVjdCIgcGFyZW50PSJ1cm46b29kdDpHZW5lcmljRmlsZSI+CisgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkxhdGl0dWRlIi8+CisgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkxvbmdpdHVkZSIvPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZXMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9nZW8vcHJvZHVjdC10eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZDRmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvY29tcG9uZW50cy9jYXMiPgorICA8dHlwZSBpZD0idXJuOm9vZHQ6TG9jYXRpb25Bd2FyZVByb2R1Y3QiIG5hbWU9IkxvY2F0aW9uQXdhcmVQcm9kdWN0Ij4KKyAgICA8cmVwb3NpdG9yeSBwYXRoPSJmaWxlOi8vW0hPTUVdL2ZpbGVzIi8+CisgICAgPHZlcnNpb25lciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuQmFzaWNWZXJzaW9uZXIiLz4KKyAgICA8IS0tCisgICAgICBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhICd0cmltJyB0YWcgdG8gaWRlbnRpZnkgd2hldGhlciBvciBub3QgeW91CisgICAgICB3YW50IG5ld2xpbmVzIHRyaW1tZWQgZnJvbSB0aGUgcHJvZHVjdCB0eXBlIGRlc2NyaXB0aW9uLiAgVG8gdHVybiBvZmYKKyAgICAgIHRyaW1taW5nIChub3cgZG9uZSBieSBkZWZhdWx0KSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB3aXRoCisgICAgICB5b3VyIGRlc2NyaXB0aW9uIGRlZmluaXRpb246IHRyaW09ImZhbHNlIgorICAgIC0tPgorICAgIDxkZXNjcmlwdGlvbj5BIHByb2R1Y3QgdHlwZSB3aXRoIGxvY2F0aW9uIG1ldGFkYXRhLjwvZGVzY3JpcHRpb24+CisgICAgPCEtLQorICAgICAgR2xvYmFsIGFnZ3JlZ2F0ZSBwcm9kdWN0IHR5cGUgbWV0YWRhdGE6IHlvdSBjYW4gZGVjbGFyZSB0aGlzIGluIHRoZQorICAgICAgc2FtZSB3YXkgeW91J2Qgd2lyZSB0b2dldGhlciBhIENBUyBtZXQgZmlsZSwgZXZlbiB1c2luZyBtdWx0aXBsZSB2YWx1ZXMKKyAgICAgIHBlciBrZXkuCisgICAgICAKKyAgICAgIFRoaXMgbWV0YWRhdGEgY2FuIGJlIGxvb2tlZCB1cCB2aWEgdGhlIFByb2R1Y3QgVHlwZSBBUEksIGFuZCBhbHNvIHVzZWQKKyAgICAgIGluIGJyb3dzZXJzIGFuZCBzbyBmb3J0aCB0byBkaXNwbGF5IGdsb2JhbCBtZXRhZGF0YSBhYm91dCB0aGUgY29sbGVjdGlvbgorICAgICAgb2YgUHJvZHVjdHMgcGFydCBvZiB0aGlzIHByb2R1Y3QgdHlwZS4KKyAgICAtLT4KKyAgICA8bWV0YWRhdGE+CisgICAgICA8a2V5dmFsPgorICAgICAgICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgICAgICAgIDx2YWw+TG9jYXRpb25Bd2FyZVByb2R1Y3Q8L3ZhbD4KKyAgICAgIDwva2V5dmFsPgorICAgICAgPCEtLSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5Qcm9kdWN0VHlwZU1ldFZlcnNpb25lciAKKyAgICAgICAgICAgeW91IGNhbiBzZXQgYSBtZXQga2V5IGxpa2UgYmVsb3cgdG8gZGVmaW5lIHlvdXIgZmlsZVBhdGhTcGVjCisgICAgICA8a2V5dmFsPgorICAgICAgICA8a2V5PmZpbGVQYXRoU3BlYzwva2V5PgorICAgICAgICA8dmFsPi9bRmlsZW5hbWVdPC92YWw+CisgICAgICA8L2tleXZhbD4KKyAgICAgIC0tPiAgICAgIAorICAgIDwvbWV0YWRhdGE+CisgICAgPG1ldEV4dHJhY3RvcnM+CisgICAgICA8ZXh0cmFjdG9yCisgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5Db3JlTWV0RXh0cmFjdG9yIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLQorICAgICAgICAgICAgWW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIGVudlJlcGxhY2UgdGFnIHRvIHR1cm4gb24vb2ZmCisgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXIgcmVwbGFjZW1lbnQuCisgICAgICAgICAgLS0+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5zQXdhcmUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50TnMiIHZhbHVlPSJDQVMiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnRzIgorICAgICAgICAgICAgdmFsdWU9IlByb2R1Y3RSZWNlaXZlZFRpbWUsUHJvZHVjdE5hbWUsUHJvZHVjdElkIiAvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLk1pbWVUeXBlRXh0cmFjdG9yIiAvPgorICAgICAgPGV4dHJhY3RvcgorICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IiPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tCisgICAgICAgICAgICBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBGSUxFX0xPQ0FUSU9OIGZpZWxkCisgICAgICAgICAgICBjb21wdXRlZCBieSB0aGlzIGV4dHJhY3RvciB0byByZXBsYWNlIGFueSBvdGhlciBGSUxFX0xPQ0FUSU9OIG1ldAorICAgICAgICAgICAgYXR0cmlidXRlLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBsYWNlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICA8L21ldEV4dHJhY3RvcnM+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvZWxlbWVudHMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90cmFjZS9lbGVtZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlZmFjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsOTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OklucHV0RmlsZXMiIG5hbWU9IklucHV0RmlsZXMiPgorICAgICAgICA8IS0tICAKKyAgICAgICAgIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgJ3RyaW0nIHRhZyB0byBpZGVudGlmeSB3aGV0aGVyCisgICAgICAgICBvciBub3QgeW91IHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLiBUbworICAgICAgICAgdHVybiBvZmYgdHJpbW1pbmcgKG5vdyBkb25lIGJ5IGRlZmF1bHQpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgd2l0aCB5b3VyCisgICAgICAgICBkZXNjcmlwdGlvbiBkZWZpbml0aW9uOiB0cmltPSJmYWxzZSIgICAgICAgCisgICAgICAgICAtLT4gICAKKyAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHNldCBvZiBpbnB1dCBmaWxlcyB0aGF0IHdlbnQgaW50byBwcm9kdWNpbmcgdGhpcyBmaWxlLjwvZGVzY3JpcHRpb24+CisgICAgICAgPGRjRWxlbWVudC8+CisgICA8L2VsZW1lbnQ+CisgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6T3V0cHV0RmlsZXMiIG5hbWU9Ik91dHB1dEZpbGVzIj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBzZXQgb2Ygb3V0cHV0IGZpbGVzIHRoYXQgaW5jbHVkZWQgdGhpcyBmaWxlIGluIGl0cyBpbnB1dC48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8ZGNFbGVtZW50Lz4KKyAgIDwvZWxlbWVudD4KKyAgIAorICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkpvYklkIiBuYW1lPSJKb2JJZCI+CisgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1bmlxdWUgaWRlbnRpZmllciBnZW5lcmF0ZWQgYnkgdGhlIHdvcmtmbG93IG1hbmFnZXIgZm9yIHRoZSBqb2IKKyAgICAgICB0aGF0IHByb2R1Y2VkIHRoaXMgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgICAgIDxkY0VsZW1lbnQvPiAgIAorICAgPC9lbGVtZW50PgorICAgCisgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdGlvbkRhdGVUaW1lIiBuYW1lPSJQcm9kdWN0aW9uRGF0ZVRpbWUiPgorICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGF0ZS90aW1lIHN0YW1wIHRoYXQgdGhpcyBmaWxlIHdhcyBwcm9kdWNlZCBlaXRoZXIgYnkgaW5nZXN0aW9uIAorICAgICAgIG9yIHByb2Nlc3NpbmcuPC9kZXNjcmlwdGlvbj4KKyAgICAgICA8ZGNFbGVtZW50Lz4KKyAgIDwvZWxlbWVudD4KKyAgIAorICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkV4ZWN1dGFibGVQYXRobmFtZXMiIG5hbWU9IkV4ZWN1dGFibGVQYXRobmFtZXMiPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgcGF0aG5hbWVzIHRvIHRoZSBleGVjdHVhYmxlcyB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisKKyAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkV4ZWN1dGFibGVWZXJzaW9ucyIgbmFtZT0iRXhlY3V0YWJsZVZlcnNpb25zIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIHZlcnNpb25zIG9mIHRoZSBleGVjdHVhYmxlcyB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisKKyAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkFwcGxpY2F0aW9uU3VjY2Vzc0ZsYWciIG5hbWU9IkFwcGxpY2F0aW9uU3VjY2Vzc0ZsYWciPgorICAgIDxkZXNjcmlwdGlvbj5BbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhlIGdlbmVyYXRpbmcgYXBwbGljYXRpb24gY29tcGxldGVkCisgICAgICBzdWNjZXNzZnVsbHkuPC9kZXNjcmlwdGlvbj4KKyAgICA8ZGNFbGVtZW50Lz4KKyAgPC9lbGVtZW50PgorICAKKyAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlRhc2tTdWNjZXNzRmxhZyIgbmFtZT0iVGFza1N1Y2Nlc3NGbGFnIj4KKyAgICA8ZGVzY3JpcHRpb24+QW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBQQ1MgV29ya2Zsb3cgVGFzayB0aGF0IHJhbiB0aGUgUEdFIGNvbXBsZXRlZAorICAgICAgc3VjY2Vzc2Z1bGx5LjwvZGVzY3JpcHRpb24+CisgICAgPGRjRWxlbWVudC8+CisgIDwvZWxlbWVudD4KKworICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6Sm9iU3VjY2Vzc0ZsYWciIG5hbWU9IkpvYlN1Y2Nlc3NGbGFnIj4KKyAgICA8ZGVzY3JpcHRpb24+QW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBQQ1Mgam9iIHJhbiBieSB0aGUgUENTIHRvIGNyZWF0ZSB0aGUgcHJvZHVjdCBjb21wbGV0ZWQKKyAgICAgIHN1Y2Nlc3NmdWxseS48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisgIAorICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UEdFVmVyc2lvbiIgbmFtZT0iUEdFVmVyc2lvbiI+CisgICAgPGRlc2NyaXB0aW9uPkNhcHR1cmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0gdGhhdCBoYXMgYmVlbiBydW4gb24gdGhlIGRhdGEuPC9kZXNjcmlwdGlvbj4KKyAgICA8ZGNFbGVtZW50Lz4KKyAgPC9lbGVtZW50PgorCisgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9jZXNzaW5nTm9kZSIgbmFtZT0iUHJvY2Vzc2luZ05vZGUiPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgbm9kZSB0aGF0IHRoZSBqb2IgdGhhdCBwcm9kdWNlZCB0aGlzIHByb2R1Y3Qgd2FzIHJ1biBvbi48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisgICAgIAorIDxlbGVtZW50IGlkPSJ1cm46b29kdDpFeGVjdXRpb25UaW1lIiBuYW1lPSJFeGVjdXRpb25UaW1lIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGpvYiB0aGF0IHByb2R1Y2VkIHRoaXMgcHJvZHVjdCB0b29rIHRvIHJ1bi48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorIDwvZWxlbWVudD4KKworICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6Q21kTGluZVBhcmFtZXRlcnMiIG5hbWU9IkNtZExpbmVQYXJhbWV0ZXJzIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSB1c2VkIHRvIGludm9rZSB0aGlzIGpvYi48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+ICAKKyAgICAKKyAgIAorPC9jYXM6ZWxlbWVudHM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4YTU4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZW1hcCB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8IS0tICBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2UKKyAgICAgICBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcyAKKyAgLS0+CisgIDx0eXBlIGlkPSJ1cm46b29kdDpUcmFjZWFibGVGaWxlIiBwYXJlbnQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIj4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6SW5wdXRGaWxlcyIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpPdXRwdXRGaWxlcyIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpKb2JJZCIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0aW9uRGF0ZVRpbWUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RXhlY3V0YWJsZVBhdGhuYW1lcyIvPiAKKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RXhlY3V0YWJsZVZlcnNpb25zIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkFwcGxpY2F0aW9uU3VjY2Vzc0ZsYWciLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6VGFza1N1Y2Nlc3NGbGFnIiAvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpKb2JTdWNjZXNzRmxhZyIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQR0VWZXJzaW9uIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2Nlc3NpbmdOb2RlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkV4ZWN1dGlvblRpbWUiIC8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkNtZExpbmVQYXJhbWV0ZXJzIi8+ICAgICAgIAorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvcHJvZHVjdC10eXBlcy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzljOTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgPHR5cGUgaWQ9InVybjpvb2R0OlRyYWNlYWJsZUZpbGUiIG5hbWU9IlRyYWNlYWJsZUZpbGUiPgorICAgIDxyZXBvc2l0b3J5IHBhdGg9ImZpbGU6Ly9bSE9NRV0vZmlsZXMiLz4KKyAgICA8dmVyc2lvbmVyIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5CYXNpY1ZlcnNpb25lciIvPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAndHJpbScgdGFnIHRvIGlkZW50aWZ5IHdoZXRoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIG9yIG5vdCB5b3Ugd2FudCBuZXdsaW5lcyB0cmltbWVkIGZyb20gdGhlIHByb2R1Y3QgdHlwZSBkZXNjcmlwdGlvbi4gVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICB0dXJuIG9mZiB0cmltbWluZyAobm93IGRvbmUgYnkgZGVmYXVsdCksIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgd2l0aCB5b3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgZGVzY3JpcHRpb24gZGVmaW5pdGlvbjogdHJpbT0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIC0tPgorICAgIDxkZXNjcmlwdGlvbj5BIHRyYWNlYWJsZSBwcm9kdWN0IGZvciB1c2UgaW4gcHJvdmVuYW5jZSBhbmQgYWxnb3JpdGhtIGV4ZWN1dGlvbi48L2Rlc2NyaXB0aW9uPgorICAgIDwhLS0KKyAgICAgIEdsb2JhbCBhZ2dyZWdhdGUgcHJvZHVjdCB0eXBlIG1ldGFkYXRhOiB5b3UgY2FuIGRlY2xhcmUgdGhpcyBpbiB0aGUKKyAgICAgIHNhbWUgd2F5IHlvdSdkIHdpcmUgdG9nZXRoZXIgYSBDQVMgbWV0IGZpbGUsIGV2ZW4gdXNpbmcgbXVsdGlwbGUgdmFsdWVzCisgICAgICBwZXIga2V5LgorICAgICAgCisgICAgICBUaGlzIG1ldGFkYXRhIGNhbiBiZSBsb29rZWQgdXAgdmlhIHRoZSBQcm9kdWN0IFR5cGUgQVBJLCBhbmQgYWxzbyB1c2VkCisgICAgICBpbiBicm93c2VycyBhbmQgc28gZm9ydGggdG8gZGlzcGxheSBnbG9iYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGNvbGxlY3Rpb24KKyAgICAgIG9mIFByb2R1Y3RzIHBhcnQgb2YgdGhpcyBwcm9kdWN0IHR5cGUuCisgICAgLS0+CisgICAgPG1ldGFkYXRhPgorICAgICAgPGtleXZhbD4KKyAgICAgICAgPGtleT5Qcm9kdWN0VHlwZTwva2V5PgorICAgICAgICA8dmFsPkxvY2F0aW9uQXdhcmVQcm9kdWN0PC92YWw+CisgICAgICA8L2tleXZhbD4KKyAgICAgIDwhLS0gaWYgeW91IGFyZSB1c2luZyB0aGUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuUHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIgCisgICAgICAgICAgIHlvdSBjYW4gc2V0IGEgbWV0IGtleSBsaWtlIGJlbG93IHRvIGRlZmluZSB5b3VyIGZpbGVQYXRoU3BlYworICAgICAgPGtleXZhbD4KKyAgICAgICAgPGtleT5maWxlUGF0aFNwZWM8L2tleT4KKyAgICAgICAgPHZhbD4vW0ZpbGVuYW1lXTwvdmFsPgorICAgICAgPC9rZXl2YWw+CisgICAgICAtLT4gICAgICAKKyAgICA8L21ldGFkYXRhPgorICAgIDxtZXRFeHRyYWN0b3JzPgorICAgICAgPGV4dHJhY3RvcgorICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0gIHlvdSBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIHRoZSBlbnZSZXBsYWNlIHRhZyB0byB0dXJuIG9uL29mZiBlbnZpcm9ubWVudCB2YXIgcmVwbGFjZW1lbnQgLS0+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5zQXdhcmUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50TnMiIHZhbHVlPSJDQVMiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnRzIgorICAgICAgICAgICAgdmFsdWU9IlByb2R1Y3RSZWNlaXZlZFRpbWUsUHJvZHVjdE5hbWUsUHJvZHVjdElkIiAvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLk1pbWVUeXBlRXh0cmFjdG9yIiAvPgorICAgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IiPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tIHRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIEZJTEVfTE9DQVRJT04gZmllbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICBjb21wdXRlZCBieSB0aGlzIGV4dHJhY3RvciB0byByZXBsYWNlIGFueSBvdGhlciBGSUxFX0xPQ0FUSU9OIG1ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgYXR0cmlidXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgLS0+CisgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBsYWNlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICA8L21ldEV4dHJhY3RvcnM+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZmlsZW1nci5wcm9wZXJ0aWVzIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9maWxlbWdyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDI5ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZmlsZW1nci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYwIEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgRmlsZSBNYW5hZ2VyCisKKyMgcmVwb3NpdG9yeSBmYWN0b3J5CitmaWxlbWdyLnJlcG9zaXRvcnkuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5YTUxSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkKKworIyBjYXRhbG9nIGZhY3RvcnkKK2ZpbGVtZ3IuY2F0YWxvZy5mYWN0b3J5PW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5CisKKyMgZGF0YSB0cmFuc2ZlciBmYWN0b3J5CitmaWxlbWdyLmRhdGF0cmFuc2Zlci5mYWN0b3J5PW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5CisKKyMgdmFsaWRhdGlvbiBsYXllciBmYWN0b3J5CitmaWxlbWdyLnZhbGlkYXRpb25MYXllci5mYWN0b3J5PW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25MYXllckZhY3RvcnkKKworIyB4bWwgcnBjIGNsaWVudCBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLnhtbHJwYy5jb25uZWN0aW9uVGltZW91dC5taW51dGVzPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLnhtbHJwYy5yZXF1ZXN0VGltZW91dC5taW51dGVzPTYwCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvbi5yZXRyaWVzPTAKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLnhtbHJwYy5jb25uZWN0aW9uLnJldHJ5LmludGVydmFsLnNlY29uZHM9MworCisjIGRhdGEgc291cmNlIGNhdGFsb2cgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVybD1zb21lX2pkYmNfdXJsCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMucGFzcz1wYXNzCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMuZHJpdmVyPWRyaXZlci5jbGFzcy5uYW1lCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnF1b3RlRmllbGRzPWZhbHNlCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnBhZ2VTaXplPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmNhY2hlVXBkYXRlTWludXRlcz01CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLm9yZGVyZWRWYWx1ZXM9ZmFsc2UKKyMgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdG8gJ3RydWUnIHRvIGFsbG93IGR5bmFtaWMgbWV0YWRhdGEgZmllbGRzLAorIyBlZmZlY3RpdmVseSBieXBhc3NpbmcgdGhlIHZhbGlkYXRpb24gbGF5ZXIuCisjIGJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IGlzIGZhbHNlCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5sZW5pZW50RmllbGRzPXRydWUKKyMgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdG8gdHJ1ZSB0byBlbmFibGUgdGhlIGNvbHVtbiAicHJvZHVjdF9pZCIKKyMgaW4gdGFibGUgInByb2R1Y3RzIiB0byBiZSBvZiB0eXBlIHN0cmluZworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UucHJvZHVjdElkLnN0cmluZz1mYWxzZQorCisKKyMgbWFwcGVkIGRhdGEgc291cmNlIGNhdGFsb2cgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubWFwcGVkZGF0YXNvdXJjZS5tYXBGaWxlPS9wYXRoL3RvL29wcy5jYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcworCisjIHNjaWVuY2UgZGF0YSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNjaWVuY2UuamRiYy51cmw9c29tZV9qZGJjX3VybAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLnVzZXI9dXNlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLnBhc3M9cGFzcworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLmRyaXZlcj1kcml2ZXIuY2xhc3MubmFtZQorCisjIGx1Y2VuZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoPS90bXAvdGVzdAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLnBhZ2VTaXplPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuY29tbWl0TG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLndyaXRlTG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLm1lcmdlRmFjdG9yPTIwCisKKyMgc29sciBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci51cmw9aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NvbHIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdFNlcmlhbGl6ZXI9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5EZWZhdWx0UHJvZHVjdFNlcmlhbGl6ZXIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdElkR2VuZXJhdG9yPW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIuVVVJRFByb2R1Y3RJZEdlbmVyYXRvcgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdElkR2VuZXJhdG9yPW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIuTmFtZVByb2R1Y3RJZEdlbmVyYXRvcgorCisKKyMgZGF0YSBzb3VyY2UgcmVwb3NpdG9yeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy51cmw9c29tZV9qZGJjX3VybAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnVzZXI9dXNlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnBhc3M9cGFzcworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLmRyaXZlcj1kcml2ZXIuY2xhc3MubmFtZQorCisjIHNjaWVuY2UgZGF0YSByZXBvc2l0b3J5IG1hbmFnZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3Iuc2NpZW5jZS5qZGJjLnVybD1zb21lX2pkYmNfdXJsCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMudXNlcj11c2VyCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMucGFzcz1wYXNzCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMuZHJpdmVyPWRyaXZlci5jbGFzcy5uYW1lCisKKyMgWE1MIHJlcG9zaXRvcnkgbWFuYWdlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzPWZpbGU6Ly8vZGlyMSxmaWxlOi8vL2RpcjIKKyMgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBhbmQgc2V0IHRoZSB2YWx1ZSB0byB0cnVlIHRvIHJlY3Vyc2l2ZWx5IHBhcnNlIHBvbGljeSBkaXJlY3RvcmllcworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRpcnMucmVjdXJzaXZlPWZhbHNlCisKKyMgWE1MIHZhbGlkYXRpb24gbGF5ZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycz1maWxlOi8vL2RpcjEsZmlsZTovLy9kaXIyCisjIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgYW5kIHNldCB0aGUgdmFsdWUgdG8gdHJ1ZSB0byByZWN1cnNpdmVseSBwYXJzZSB2YWxpZGF0aW9uIGRpcmVjdG9yaWVzCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycy5yZWN1cnNpdmU9ZmFsc2UKKworIyBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSB0byAndHJ1ZScgdG8gYWxsb3cgZHluYW1pYyBtZXRhZGF0YSBmaWVsZHMsCisjIGVmZmVjdGl2ZWx5IGJ5cGFzc2luZyB0aGUgdmFsaWRhdGlvbiBsYXllci4KKyMgYnkgZGVmYXVsdCB0aGUgcHJvcGVydHkgaXMgZmFsc2UKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUubGVuaWVudEZpZWxkcz10cnVlCisKKyMgZGF0YSBzb3VyY2UgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMudXJsPXNvbWVfamRiY191cmwKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy51c2VyPXVzZXIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy5wYXNzPXBhc3MKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9ZHJpdmVyLmNsYXNzLm5hbWUKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UucXVvdGVGaWVsZHM9ZmFsc2UKKworIyBzY2llbmNlIGRhdGEgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5zY2llbmNlLmpkYmMudXJsPXNvbWVfamRiY191cmwKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLnNjaWVuY2UuamRiYy51c2VyPXVzZXIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLnNjaWVuY2UuamRiYy5wYXNzPXBhc3MKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLnNjaWVuY2UuamRiYy5kcml2ZXI9ZHJpdmVyLmNsYXNzLm5hbWUKKworIyByZW1vdGUgZGF0YSB0cmFuc2ZlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnJlbW90ZS5jaHVua1NpemU9MTAyNAorCisjIEFtYXpvbiBTMyBkYXRhIHRyYW5zZmVyIGNvbmZpZ3VyYXRpb24uCisjIFJlZ2lvbiBjYW4gYmUgYW55IG9mIHRoZSB2YWx1ZXMgZm91bmQgaGVyZToKKyMgICBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU0RLL2xhdGVzdC9qYXZhZG9jL2NvbS9hbWF6b25hd3MvcmVnaW9ucy9SZWdpb25zLmh0bWwKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuYnVja2V0Lm5hbWU9c29tZV9idWNrZXRfbmFtZQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5yZWdpb249RVVfV0VTVF8xCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnMzLmFjY2Vzcy5rZXk9czNfYWNjZXNzX2tleQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5zZWNyZXQua2V5PXMzX3NlY3JldF9rZXkKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuZW5jcnlwdD1mYWxzZQorCisjIGxvY2F0aW9uIG9mIE1pbWUtVHlwZSByZXBvc2l0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnk9L3BhdGgvdG8vbWltZS10eXBlcy54bWwKKworIyB0ZWxscyB0aGUgZmlsZSBtYW5hZ2VyIHN5c3RlbSBsYXllciB0byBpbmNsdWRlIHByb2R1Y3QgaW5zdGFuY2UgbWV0YWRhdGEKKyMgTk9URTogaGVyZSBhcmUgdGhlIGV4cGVjdGVkIGZpZWxkIG1hcHBpbmdzCisjCisjICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSAtPiBQcm9kdWN0SWQKKyMgICAgICBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgLT4gUHJvZHVjdE5hbWUKKyMgICAgICBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSAtPiBQcm9kdWN0U3RydWN0dXJlCisjICAgICAgcHJvZHVjdC5nZXRUcmFuc2ZlclN0YXR1cygpIC0+IFByb2R1Y3RUcmFuc2ZlclN0YXR1cworIyAgICAgIHByb2R1Y3QuZ2V0Um9vdFJlZigpIC0+IFByb2R1Y3RSb290UmVmZXJlbmNlCisKKyMgZm9yIHRoZSByZWZlcmVuY2VzIHJldHVybmVkIGJ5IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSB0aGUgZm9sbG93aW5nIAorIyBtZXRhZGF0YSBmaWVsZHMgd2lsbCBiZSBhZGRlZCAob3JkZXIgd2lsbCBiZSBtYWludGFpbmVkLCBzdWNoIHRoYXQgZGF0YSBzdG9yZSAKKyMgcmVmIGF0IGluZGV4IDAgd2lsbCBtYXAgdG8gb3JpZyByZWYgYXQgaW5kZXggMCwgZXRjLikKKyMKKyMgICAgICBQcm9kdWN0RGF0YVN0b3JlUmVmZXJlbmNlcyAobGlzdCBvZiBhbGwgZGF0YSBzdG9yZSByZWZlcmVuY2VzOiAKKyMgICAgICAgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyAgICAgIFByb2R1Y3RPcmlnUmVmZXJlbmNlcyAobGlzdCBvZiBhbGwgb3JpZyByZWZlcmVuY2VzOiAKKyMgICAgICAgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyAgICAgIFByb2R1Y3RNaW1lVHlwZSAobGlzdCBvZiBhbGwgcmVmZXJlbmNlcycgbWltZS10eXBlcykKKyMgICAgICBQcm9kdWN0RmlsZVNpemUgKGxpc3Qgb2YgYWxsIHJlZmVyZW5jZXMnIGZpbGUgc2l6ZXMpCisKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHBhbmRQcm9kdWN0PWZhbHNlCisKKyMgQ29uZmlndXJhYmxlTWV0YWRhdGFCYXNlZFZlcnNpb25pbmcgY29uZmlndXJhdGlvbgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLmNvbmZpZ3VyYXRpb24uYWxsX3Byb2R1Y3RfdHlwZXM9W1llYXJdL1tNb250aF0vW0ZpbGVuYW1lXQorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLmNvbmZpZ3VyYXRpb24uPHByb2R1Y3RfdHlwZT49W1llYXJdL1tNb250aF0vW0ZpbGVuYW1lXQorCisjIEVuYWJsZSB0byB1c2Ugb25seSBzZXJ2ZXItc2lkZSB2ZXJzaW9uaW5nLgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zZXJ2ZXJzaWRlLnZlcnNpb25pbmc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9pbmRleGVyLnByb3BlcnRpZXMgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2luZGV4ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMzE1N2UyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9pbmRleGVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2MiBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIENvbmZpZ3VyZXMgdGhlIFNvbHIgSW5kZXhlciB0b29sCisKKyMgYmFzaWMgY29uZmlnIHByb3BlcnRpZXMKKworIyBhIHNldCBvZiBwcm9kdWN0IHR5cGVzIHRvIGlnbm9yZSBkdW1waW5nCitjb25maWcuaWdub3JlLnR5cGVzPVNvbWVQcm9kdWN0VHlwZQorCisjIGFueSBtZXQgdmFsdWVzIHRvIGlnbm9yZSBpbmRleGluZworY29uZmlnLmlnbm9yZS52YWx1ZXM9VEJECisKKyMgdGhlIFVSTCBwYXRoIHRvIFNvbHIKK2NvbmZpZy5zb2xyLnVybD1odHRwOi8vbG9jYWxob3N0Ojg5ODMvc29scgorCisjIHRoZSBVUkwgcGF0aCB0byB0aGUgRmlsZSBNYW5hZ2VyCitjb25maWcuZmlsZW1nci51cmw9aHR0cDovL2xvY2FsaG9zdDo5MDAxCisKKyMgRGF0YSBhY2Nlc3MgZm9yIHRoZSBwcm9kdWN0cworY29uZmlnLmFjY2Vzcy5rZXk9UHJvZHVjdFVSTAorY29uZmlnLmFjY2Vzcy51cmw9aHR0cDovL2xvY2FsaG9zdDo4MDgwL2Nhcy1wcm9kdWN0L2RhdGE/cHJvZHVjdElEPVtQcm9kdWN0SWRdCisKKyMgQWRkIGEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGZvciBrZXlzIAorIyB0aGF0IHdpbGwgZ28gdGhyb3VnaCBtZXRhZGF0YSByZXBsYWNlbWVudC4gCisjIEZvciBleGFtcGxlIHRoZSBQcm9kdWN0VVJMIGFib3ZlIHdpbGwgZmlsbCBpbgorIyB0aGUgYWN0dWFsIHZhbHVlIGZvciB0aGUgW1Byb2R1Y3RJZF0KK2NvbmZpZy5yZXBsYWNlbWVudC5rZXlzPVByb2R1Y3RVUkwKKworIyBNdXN0IGhhdmUgbWFwIGZvciB1bmlxdWUgaWQgaW4gU29scgorbWFwLkNBUy5Qcm9kdWN0SWQ9aWQKKworIyBNdXN0IG1hcCB0aGlzIGZpZWxkIHRvIGVuYWJsZSBkZWxldGlvbiBvZiBTb2xyIHJlY29yZHMgYnkgbmFtZQorbWFwLkNBUy5Qcm9kdWN0TmFtZT1Qcm9kdWN0TmFtZQorCisjIE1hcCBmcm9tIEZpbGUgTWFuYWdlciB0ZXJtaW5vbG9neSBpbnRvIFNvbHIgCisjIGluZGV4IGRvYyBmaWVsZCB0ZXJtaW5vbG9neS4gT25seSBtYXBwZWQgZmllbGRzIAorIyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb2xyIGluZGV4LgorbWFwLk1pbWVUeXBlPW1pbWV0eXBlCittYXAuQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWU9cmVjZWl2ZWR0aW1lCittYXAuRmlsZVNpemU9ZmlsZXNpemUKK21hcC5GaWxlTmFtZT1maWxlbmFtZQorIyBtYXAuUHJvZHVjdFVSTD1wcm9kdWN0dXJsCisKKyMgRm9ybWF0dGluZyBvZiBkYXRlIGZpZWxkcyBjYW4gYmUgc3BlY2lmaWVkIGZvciBhCisjIGZpZWxkIGNvbWluZyBmcm9tIFNvbHIuIFNvbHIgcmVxdWlyZXMgYSBzcGVjaWZpYyAKKyMgZm9ybWF0IHdoZW4geW91IHdhbnQgdG8gbWFwIHRvIGEgZGF0ZSBzbyBvbmUgbXVzdAorIyBzcGVjaWZ5IHRoZSBzb3VyY2UgZm9ybWF0IGluIHRoZSBmaWxlbWFuYWdlci4gIAorZm9ybWF0LkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lPXl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MKKwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9pbmdlc3RjYWNoZS5wcm9wZXJ0aWVzIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9pbmdlc3RjYWNoZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGRmZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2luZ2VzdGNhY2hlLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MyBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEEgZmlsZSB0byBkZXNjcmliZSBwcm9wZXJ0aWVzIGZvciB0aGUgZ292Lm5hc2EuanBsLm9vZHQuZmlsZW1nci5pbmdlc3QuQ2FjaGUKKworCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLnJhbmdlUXVlcnlFbGVtZW50TmFtZT1DQVMuUHJvZHVjdFJlY2VpdmVkVGltZQorCisjIHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIHJlcGxhY2VkIHVzaW5nIGVudiB2YXIgcmVwbGFjZW1lbnQgKGFzIGlzIHNob3duIGJ5IGRlZmF1bHQpCisjIGV2ZW4gYmVmb3JlIGVudiB2YXIgcmVwbGFjZW1lbnQsIHlvdSBjYW4gYWxzbyB1c2UgZGF0ZSB2YXIgCisjIHJlcGxhY2VtZW50LCBlLmcuLAorIyAKKyMgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5yYW5nZS5zdGFydD1bREFURS0zMjAwLllFQVJdW0RBVEUtMzIwMC5NT05USF1bREFURS0zMjAwLkRBWV0wMDAwMDAKKyMgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5yYW5nZS5lbmQ9W0RBVEUuWUVBUl1bREFURS5NT05USF1bREFURS5EQVldMDAwMDAwCisjCisjIFdoaWNoIHdvdWxkIHNheTogdGhlIHJhbmdlIHN0YXJ0IGlzIHRoZSBjdXJyZW50IGRhdGUgLSAzMjAwIHJvbGwgZGF5cywgb3IgMTAgeWVhciBwcmlvcgorIyAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSBlbmQgaXMgdGhlIGN1cnJlbnQgZGF0ZQorCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLnJhbmdlLnN0YXJ0PVtDQUNIRV9SQU5HRV9TVEFSVF0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuY2FjaGUucmFuZ2UuZW5kPVtDQUNIRV9SQU5HRV9FTkRdCisKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuY2FjaGUudW5pcXVlRWxlbWVudE5hbWU9Q0FTLlByb2R1Y3ROYW1lCisKKyMgdGhpcyBwcm9wZXJ0eSBjYW4gYmUgcmVwbGFjZWQgdXNpbmcgZW52IHZhciByZXBsYWNlbWVudAorIyB0aGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIGEgbXVsdGktdmFsdWVkIGxpc3QsIGJ5IGNvbW1hIHNlcGFyYXRpbmcKKyMgdGhlIGxpc3Qgb2YgcHJvZHVjdCB0eXBlcworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5wcm9kdWN0VHlwZT1HZW5lcmljRmlsZQorCisjIHJtaSBjYWNoZSBzZXJ2ZXIgVVJOICh1c2VkIGJ5IHRoZSBybWkgY2FjaGUgY2xpZW50KQorIyBub3RlOiB0aGlzIHByb3BlcnR5IGNhbiBiZSByZXBsYWNlZCB1c2luZyBlbiB2YXIgcmVwbGFjZW1lbnQKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuY2FjaGUucm1pLnNlcnZlclVybj0vL2xvY2FsaG9zdDo5MDUwL1JtaURhdGFiYXNlU2VydmVyCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTMwMzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpAQCAtMCwwICsxLDc1IEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgZGVmYXVsdCBmaWxlIG91dHB1dCBpcyBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuID0gLi4vbG9ncy9jYXNfZmlsZW1nciVnLmxvZworamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGltaXQgPSA1MDAwMAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuY291bnQgPSA1CitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5hcHBlbmQgPSB0cnVlCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBzdWJzeXN0ZW1zCisKKyMgY2F0YWxvZyBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmxldmVsID0gSU5GTworCisjIHJlcG9zaXRvcnkgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5sZXZlbCA9IEZJTkUKKworIyBzeXN0ZW0gc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLmxldmVsID0gSU5GTworCisjIHZlcnNpb25pbmcgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5sZXZlbCA9IElORk8KKworIyBkYXRhIHRyYW5zZmVyIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5sZXZlbCA9IEZJTkUKKworIyB1dGlsCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5sZXZlbCA9IElORk8KKworIyB2YWxpZGF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5sZXZlbCA9IElORk8KKworIyBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGNvbW1vbnMtaHR0cGNsaWVudCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHhtbHJwYyAKK29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmhlYWRlci5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5sZXZlbCA9IElORk8KKworIyBzcHJpbmcgZnJhbWV3b3JrIGxvZ2dpbmcKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gU0VWRVJFCitvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnV0aWwuQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIubGV2ZWwgPSBTRVZFUkUKK3N1bi5uZXQubGV2ZWwgPSBTRVZFUkUKKwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9taW1lLXR5cGVzLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvbWltZS10eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwN2U4MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvbWltZS10eXBlcy54bWwKQEAgLTAsMCArMSw0MTE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgIERlc2NyaXB0aW9uOiBUaGlzIHhtbCBmaWxlIGRlZmluZXMgdGhlIHZhbGlkIG1pbWUgdHlwZXMgdXNlZCBieSBUaWthLgorICBUaGUgbWltZSB0eXBlIGRhdGEgd2l0aGluIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMKKyAgc291cmNlcyBsaWtlIEFwYWNoZSBOdXRjaCwgQXBhY2hlIEhUVFAgU2VydmVyLCB0aGUgZmlsZSgxKSBjb21tYW5kLCBldGMuCistLT4KKzxtaW1lLWluZm8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hY3RpdmVtZXNzYWdlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYW5kcmV3LWluc2V0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV6Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FwcGxlZmlsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FwcGxpeHdhcmUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZmVlZCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vcHVybC5vcmcvYXRvbS9ucyMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b20iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdG9tY2F0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b21pY21haWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdG9tc3ZjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F1dGgtcG9saWN5K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2JhdGNoLXNtdHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9iZWVwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NhbHMtMTg0MCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NjeG1sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jY3htbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jZWEtMjAxOCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jZWxsbWwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY25ycCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jb21tb25ncm91bmQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jb25mZXJlbmNlLWluZm8reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3BsK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NzdGEreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3N0YWRhdGEreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3Utc2VlbWUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3liZXJjYXNoIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGF2bW91bnQreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhdm1vdW50Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RjYS1yZnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kZWMtZHgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaWFsb2ctaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaWNvbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RucyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2R2Y3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjbWEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZWRpLWNvbnNlbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGkteDEyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZWRpZmFjdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VtbWEreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtbWEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXBwK3htbCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXB1Yit6aXAiPgorICAgIDxhY3JvbnltPkVQVUI8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkVsZWN0cm9uaWMgUHVibGljYXRpb248L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQS1wwMDNcMDA0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi9lcHViK3ppcCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lcHViIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXNob3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9leGFtcGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZmFzdGluZm9zZXQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9mYXN0c29hcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ZpdHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9mb250LXRkcGZyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9oMjI0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaHR0cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2h5cGVyc3R1ZGlvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ayIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUta2V5LXJlcXVlc3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWJlLXBrZy1yZXBseSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUtcHAtZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lnZXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbS1pc2NvbXBvc2luZyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4LmNtZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4Lm9iaiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4LnJlc3BvbnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgudm5kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW90cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lwcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lzdXAiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3QiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2pzb24iPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanNvbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtdm0iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGNhZmViYWJlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xhc3MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9rcG1sLXJlcXVlc3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24va3BtbC1yZXNwb25zZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9sb3N0K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sb3N0eG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleCIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9iaW5oZXgiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0ibXVzdFwgYmVcIGNvbnZlcnRlZFwgd2l0aFwgQmluSGV4IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTEiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHF4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3B0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjd3JpdGVpaSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hcmMiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXJjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uYiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWF0aG1sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYXRobWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1hc3NvY2lhdGVkLXByb2NlZHVyZS1kZXNjcmlwdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLWRlcmVnaXN0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1lbnZlbG9wZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLW1zayt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLW1zay1yZXNwb25zZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXByb3RlY3Rpb24tZGVzY3JpcHRpb24reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWNlcHRpb24tcmVwb3J0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtcmVnaXN0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWdpc3Rlci1yZXNwb25zZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXVzZXItc2VydmljZS1kZXNjcmlwdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm94Ij4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1ib3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWVkaWFfY29udHJvbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zY21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21pa2V5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbW9zcy1rZXlzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbW9zcy1zaWduYXR1cmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3Nza2V5LWRhdGEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3Nza2V5LXJlcXVlc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcDQiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXA0cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcGVnNC1nZW5lcmljIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXBlZzQtaW9kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXBlZzQtaW9kLXhtdCIvPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi9tc3dvcmQgLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXN3b3JkIj4KKyAgICA8IS0tIFVzZSBvcmcuYXBhY2hlLnRpa2EuZGV0ZWN0LkNvbnRhaW5lckF3YXJlRGV0ZWN0b3IgZm9yIG1vcmUgcmVsaWFibGUgZGV0ZWN0aW9uIG9mIE9MRTIgZG9jdW1lbnRzIC0tPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZCIvPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgV29yZCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik1pY3Jvc29mdFwgV29yZFwgNi4wXCBEb2N1bWVudCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRG9jdW1lbnRvXCBNaWNyb3NvZnRcIFdvcmRcIDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik1TV29yZERvYyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgzMWJlMDAwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQT15RYCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDM3NlwwNjdcMFwwNDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwzMzNcMjQ1LVwwXDBcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDM1NFwyNDVcMzAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNTEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwzMjBcMzE3XDAyMVwzNDBcMjQxXDI2MVwwMzJcMzQxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMjI0XDI0NlwwNTYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICA8bWF0Y2ggdmFsdWU9IldceDAwb1x4MDByXHgwMGRceDAwRFx4MDBvXHgwMGNceDAwdVx4MDBtXHgwMGVceDAwblx4MDB0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZG9jIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb3QiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL214ZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5teGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbmFzZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtY2hlY2tncm91cHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uZXdzLWdyb3VwaW5mbyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtdHJhbnNtaXNzaW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbnNzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2NzcC1yZXF1ZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2NzcC1yZXNwb25zZSIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iI1wgVGhpc1wgaXNcIGFcIHNoZWxsXCBhcmNoaXZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAzN1wwMzYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjAxNzQzNyIgdHlwZT0iaG9zdDE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxZmZmIiB0eXBlPSJob3N0MTYiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMzc3XDAzNyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDE0NTQwNSIgdHlwZT0iaG9zdDE2IiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmluIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kbXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxoYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubHJmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5semgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNvIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pc28iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRtZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGlzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGlzdHoiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBrZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYnBrIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kdW1wIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbGMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlcGxveSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL29kYSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3BmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2dnIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1vZ2ciLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnUyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2d4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb25lbm90ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vbmV0b2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXRvYzIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXRtcCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub25lcGtnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bhcml0eWZlYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGVyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGRmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1wZGYiLz4KKyAgICA8YWNyb255bT5QREY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlBvcnRhYmxlIERvY3VtZW50IEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiVQREYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZGYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBncCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3Ata2V5cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXNjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaWciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGljcy1ydWxlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcmYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGlkZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWRmLWRpZmYreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtjczEwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnAxMCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnA3bSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucDdjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wN3MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeC1jZXJ0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNlciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4LWNybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeC1wa2lwYXRoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBraXBhdGgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeGNtcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wa2kiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGxzK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcG9jLXNldHRpbmdzK3htbCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcG9zdHNjcmlwdCI+CisgICAgPF9jb21tZW50PlBvc3RTY3JpcHQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIlISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwwMDQlISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8IS0tIFdpbmRvd3MgZm9ybWF0IEVQUyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjNWQwZDNjNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWkiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lcHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwc2YiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwc2kiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMuYWx2ZXN0cmFuZC50aXRyYXgtc2hlZXQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMuY3d3Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN3dyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMubnByZW5kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcHJzLnBsdWNrZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9xc2lnIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZGYreG1sIj4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJSREYiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJSREYiIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPGFjcm9ueW0+UkRGL1hNTDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+WE1MIHN5bnRheCBmb3IgUkRGIGdyYXBoczwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yZGYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm93bCIvPgorICAgIDxnbG9iIHBhdHRlcm49Il5yZGYkIiBpc3JlZ2V4PSJ0cnVlIi8+CisgICAgPGdsb2IgcGF0dGVybj0iXm93bCQiIGlzcmVnZXg9InRydWUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZWdpbmZvK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yaWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXgiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm5jIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmlzY29zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmxtaSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JzZCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnNkIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQvcnNzIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icnNzIi8+CisgICAgPHJvb3QtWE1MIG5hbWVzcGFjZVVSST0iaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yc3MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ydGYiPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3J0ZiIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJ7XFxydGYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ0ZiIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3J0eCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NhbWxhc3NlcnRpb24reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2FtbG1ldGFkYXRhK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NibWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNibWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjcSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlc3BvbnNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3QiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVzcG9uc2UiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NkcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2V0LXBheW1lbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNldHBheSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvbi1pbml0aWF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNldHJlZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZ21sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2dtbC1vcGVuLWNhdGFsb2ciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaGYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNoZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaWV2ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZS1maWx0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2ltcGxlLW1lc3NhZ2Utc3VtbWFyeSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZXN5bWJvbGNvbnRhaW5lciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NsYXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc21pbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NtaWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNtaSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc21pbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnkiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcGlyaXRzLWV2ZW50K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NyZ3MiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3JhbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcmdzK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncnhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zc21sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zc21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1xdWVyeSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1yZXBseSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3R2ZS10cmlnZ2VyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdWxwZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdmVtbWkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92aXZpZGVuY2Uuc2NyaXB0ZmlsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLmJzZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctbGFyZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGxiIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1zbWFsbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wc2IiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXZhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wdmIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAuc21zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLmJjbWNzaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcDIuc21zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLnRjYXAiPgorICAgIDxnbG9iIHBhdHRlcm49IioudGNhcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3RlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wd24iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuYXNvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5pbXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaW1wIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hY3UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjdWNvcnAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXRjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hY3V0YyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWlyLWFwcGxpY2F0aW9uLWluc3RhbGxlci1wYWNrYWdlK3ppcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haXIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhmZGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFldGhlci5pbXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6dyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW1lcmljYW5keW5hbWljcy5hY2MiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWNjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbWlnYS5hbWkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYW1pIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hcGsiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1jZXJ0aWZpY2F0ZS1pc3N1ZS1pbml0aWF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNpaSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWZ1bmRzLXRyYW5zZmVyLWluaXRpYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZnRpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbnRpeC5nYW1lLWNvbXBvbmVudCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBrZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pd29yayI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtleSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGFnZXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm51bWJlcnMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUua2V5bm90ZSI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icHJlc2VudGF0aW9uIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL25hbWVzcGFjZXMva2V5bm90ZTIiIC8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5wYWdlcyI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZG9jdW1lbnQiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9zbCIgLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLm51bWJlcnMiPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImRvY3VtZW50IiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL25hbWVzcGFjZXMvbHMiIC8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcmFzdHJhLnN3aSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zd2kiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmF1ZGlvZ3JhcGgiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWVwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hdXRvcGFja2FnZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hdmlzdGFyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ibHVlaWNlLm11bHRpcGFzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcG0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmJsdWV0b290aC5lcC5vb2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYm1pIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJtaSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJlcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2FiLWpzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2Fub24tY3BkbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jYW5vbi1saXBzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNlbmRpby50aGlubGluYy5jbGllbnRjb25mIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNoZW1kcmF3K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZHhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2hpcG51dHMua2FyYW9rZS1tbWQiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW1kIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jaW5kZXJlbGxhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2lycGFjay5pc2RuLWV4dCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jbGF5bW9yZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNsb25rLmM0Z3JvdXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYzRnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jNGQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmM0ZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYzRwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jNHUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvbW1lcmNlLWJhdHRlbGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvbW1vbnNwYWNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkYmNtc2ciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvc21vY2FsbGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGt4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa2siLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIucGFsZXR0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGtwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnRlbXBsYXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIud29yZGJhbmsiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xrdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpdGljYWx0b29scy53YnMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndicyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3RjLXBvc21sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3RjdC53cyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wZGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wb3N0c2NyaXB0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcHBkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1yYXN0ZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1yYXciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3VybC5jYXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2FyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjdXJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jeWJhbmsiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJkeiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZGVub3ZvLmZjc2VsYXlvdXQtbGluayI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mZV9sYXVuY2giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRpci1iaS5wbGF0ZS1kbC1ub3N1ZmZpeCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kbmEiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZG5hIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tbHAiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWxwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kcGdyYXBoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRwZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRmYWMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5lc2djb250YWluZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmlwZGNkZnRub3RpZmFjY2VzcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2VzZ2FjY2VzcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY3JvYW1pbmciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmlwdHYuYWxmZWMtYmFzZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXB0di5hbGZlYy1lbmhhbmNlbWVudCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtYWdncmVnYXRlLXJvb3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1jb250YWluZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1nZW5lcmljK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtbXNnbGlzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWlhLXJlZ2lzdHJhdGlvbi1yZXF1ZXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtcmVnaXN0cmF0aW9uLXJlc3BvbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaW5pdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHhyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR5bmFnZW8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2VvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY2Rpcy11cGRhdGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmNoYXJ0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGVyZXF1ZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxldXBkYXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3JlcXVlc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3VwZGF0ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lbWNsaWVudC5hY2Nlc3NyZXF1ZXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5tbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVzZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24ubXNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24ucXVpY2thbmltZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xYW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2x0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5zc2YiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3NmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcmljc3Nvbi5xdWlja2NhbGwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXN6aWdubzMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVzMyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXQzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmFvYyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5jdWcreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmNvbW1hbmQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmRpc2NvdmVyeSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2cHJvZmlsZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2FkLWJjK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtY29kK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtbnB2cit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2dWVwcm9maWxlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm1jaWQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuc2NpK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnNpbXNlcnZzK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldWRvcmEuZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1hbGJ1bSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lejIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV6cGl4LXBhY2thZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXozIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mLXNlY3VyZS5tb2JpbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZkZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRzbi5tc2VlZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2VlZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRzbi5zZWVkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlZWQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhdGFsZXNzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZnNucyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5maW50cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mbG9ncmFwaGl0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdwaCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmx1eHRpbWUuY2xpcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mdGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZvbnQtZm9udGZvcmdlLXNmZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mcmFtZW1ha2VyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mcmFtZSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWFrZXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJvb2siLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZuYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5sdGYiPgorICAgIDxnbG9iIHBhdHRlcm49IioubHRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mc2Mud2VibGF1bmNoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZzYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5cyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vYXMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9hMiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czMiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2EzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3AiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmc1Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJoMiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmFydC1leCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guYXJ0NCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guaGJwbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRkZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3JrcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZHciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MuYmluZGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhiZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnV0LW1pc25ldCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdXp6eXNoZWV0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ6cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2Vub21hdGl4LnR1eGVkbyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50eGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2diIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nZW9nZWJyYS50b29sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdndCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2VvbWV0cnktZXhwbG9yZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2V4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncmUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdteCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nbXgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmttbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmtteiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rbXoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyYWZlcSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdxcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3JpZG1wIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdhYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWhlbHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2hmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaWRlbnRpdHktbWVzc2FnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5naW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1pbmplY3RvciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncnYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLW1lc3NhZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3RtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC10ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50cGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52Y2ciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnptbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGJjaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oYmNpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oY2wtYmlyZXBvcnRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhoZS5sZXNzb24tcGxheWVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxlcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtaHBnbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ocGdsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwaWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWhwcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ocHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWpseXQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouamx0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2wiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGNsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2x4bCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY2x4bCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHR0cGhvbmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHlkcm9zdGF0aXguc29mLWRhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2ZkLWhkc3R4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oem4tM2QtY3Jvc3N3b3JkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLngzZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLmFmcGxpbmVkYXRhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5lbGVjdHJvbmljLW1lZGlhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1weSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hZnAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3RhZnAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3QzODIwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0ucmlnaHRzLW1hbmFnZW1lbnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXJtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWNjcHJvZmlsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmljbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWdsb2FkZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWdsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXZwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXZ1Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbmZvcm1lZGNvbnRyb2wucm1zK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbmZvcm1peC12aXNpb25hcnkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cHciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhweCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5kaWdpYm94Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludGVydHJ1c3Qubm5jcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFibyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xYm8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludHUucWZ4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFmeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5jb25jZXB0aXRlbSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5rbm93bGVkZ2VpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLm5ld3NpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLnBhY2thZ2VpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGUiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmNwcm9maWxlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcmVwb3NpdG9yeS5wYWNrYWdlK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pcnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlzLXhwciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cHIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qYW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWRpcmVjdG9yeS1zZXJ2aWNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1wYXltZW50LXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uLXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1zZXRzdG9yZS13YWtldXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtdmVyaWZpY2F0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamNwLmphdmFtZS5taWRsZXQtcm1zIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamlzcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qaXNwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qb29zdC5qb2RhLWFyY2hpdmUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouam9kYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2Fob290eiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rdHoiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt0ciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmthcmJvbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rYXJib24iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rY2hhcnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2hydCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtmb3JtdWxhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtmbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtpdmlvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtvbnRvdXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua29uIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua3ByZXNlbnRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rcHIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtwdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtzcHJlYWQiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua3NwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua3dvcmQiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua3dkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rd3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtlbmFtZWFhcHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHRrZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtpYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2luYXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua25lIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rbnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtvYW4iPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWtvYW4iLz4KKyAgICA8X2NvbW1lbnQ+U1NFWU8gS29hbiBGaWxlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrcCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2tkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5za3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua29kYWstZGVzY3JpcHRvciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zc2UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxpYmVydHktcmVxdWVzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZGVza3RvcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sYmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sYmUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLTEtMi0zIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLjEyMyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2giPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXByIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHJlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1ub3RlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uc2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vcmciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zY20iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHBybyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IldvcmRQcm9cMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IldvcmRQcm9cclwzNzMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sd3AiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWFjcG9ydHMucG9ydHBrZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb3J0cGtnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmFjdGlvbnRva2VuK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmNvbmZ0b2tlbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5saWNlbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLm1kY2YiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWNkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1jZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWVkY2FsY2RhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWMxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZWRpYXN0YXRpb24uY2RrZXkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2RrZXkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1lcmlkaWFuLXNsaW5nc2hvdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZmVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm13ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWZtcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZm0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguZmxvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5pZ3giPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWd4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pZiI+CisgICAgPF9jb21tZW50PkZyYW1lTWFrZXIgTUlGIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1taWYiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1mcmFtZSIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01ha2VyRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TUlGRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXJEaWN0aW9uYXJ5IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlclNjcmVlbkZvbnQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01NTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7Qm9vayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5taWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWluaXNvZnQtaHAzMDAwLXNhdmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWl0c3ViaXNoaS5taXN0eS1ndWFyZC50cnVzdHdlYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGFmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLmRpcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaXMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy5tYmsiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWJrIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1xeSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1zbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2wiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy5wbGMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGxjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR4ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9waHVuLmFwcGxpY2F0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wbiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9waHVuLmNlcnRpZmljYXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5hZHNpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5maXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmdvdGFwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5rbXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLnR0YyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUud2VtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmlwcm0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh1bCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2lsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1hc2YiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtY2FiLWNvbXByZXNzZWQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2FiIi8+CisgIDwvbWltZS10eXBlPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIj4KKyAgICA8IS0tIFVzZSBvcmcuYXBhY2hlLnRpa2EuZGV0ZWN0LkNvbnRhaW5lckF3YXJlRGV0ZWN0b3IgZm9yIG1vcmUgcmVsaWFibGUgZGV0ZWN0aW9uIG9mIE9MRTIgZG9jdW1lbnRzIC0tPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tc2V4Y2VsIiAvPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgRXhjZWwgU3ByZWFkc2hlZXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJNaWNyb3NvZnRcIEV4Y2VsXCA1LjBcIFdvcmtzaGVldCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRm9nbGlvXCBkaVwgbGF2b3JvXCBNaWNyb3NvZnRcIEV4Y2UiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJpZmY1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjExNCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJCaWZmNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxMjEiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXHgwOVx4MDRceDA2XHgwMFx4MDBceDAwXHgxMFx4MDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICA8bWF0Y2ggdmFsdWU9IldceDAwb1x4MDByXHgwMGtceDAwYlx4MDBvXHgwMG9ceDAwayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhscyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bGEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGx0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxkIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFdvcmtib29rIEFkZC1pbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxhbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgRXhjZWwgMjAwNyBCaW5hcnkgU3ByZWFkc2hlZXQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzYiIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHRtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lb3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWh0bWxoZWxwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNobSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtaW1zIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmltcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtbHJtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxybSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rIj4KKyAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IE91dGxvb2sgTWVzc2FnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2ciIC8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnNlY2NhdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBraS5zdGwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wbGF5cmVhZHkuaW5pdGlhdG9yK3htbCIvPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCAtLT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCI+CisgICAgPCEtLSBVc2Ugb3JnLmFwYWNoZS50aWthLmRldGVjdC5Db250YWluZXJBd2FyZURldGVjdG9yIGZvciBtb3JlIHJlbGlhYmxlIGRldGVjdGlvbiBvZiBPTEUyIGRvY3VtZW50cyAtLT4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbXNwb3dlcnBvaW50Ii8+CisgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBQb3dlcnBvaW50IFByZXNlbnRhdGlvbjwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBceDAwb1x4MDB3XHgwMGVceDAwclx4MDBQXHgwMG9ceDAwaVx4MDBuXHgwMHRceDAwIERceDAwb1x4MDBjXHgwMHVceDAwbVx4MDBlXHgwMG5ceDAwdCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBweiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHB0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHBhIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5hZGRpbi5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgUHJlc2VudGF0aW9uIEFkZC1pbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHBhbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQucHJlc2VudGF0aW9uLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwdG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbGRtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5zbGlkZXNob3cubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBTbGlkZXNob3cgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwc20iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb3RtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcHJvamVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcHAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wdCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy10bmVmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbXMtdG5lZiIgLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgyMjNlOWY3OCIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5saWMtY2hsZy1yZXEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubGljLXJlc3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubWV0ZXItY2hsZy1yZXEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubWV0ZXItcmVzcCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIERvY3VtZW50IChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb2NtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQgVGVtcGxhdGUgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvdG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JrcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndrcyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2NtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53ZGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdwbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXNlcSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2VxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tc2lnbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdWx0aWFkLmNyZWF0b3IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXVsdGlhZC5jcmVhdG9yLmNpZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdXNpYy1uaWZmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11c2ljaWFuIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm11cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXV2ZWUuc3R5bGUiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXN0eSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmNkLmNvbnRyb2wiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmNkLnJlZmVyZW5jZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uZXJ2YW5hIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5ldGZweCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubHUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LWRpcmVjdG9yeSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubnMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXdlYiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubnciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNhdGFsb2dzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5pc2RzLXJhZGlvLXByZXNldHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuaXB0di5jb25maWcreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmxhbmRtYXJrK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmxhbmRtYXJrK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFya2NvbGxlY3Rpb24reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5hYyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmRhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49IioubmdkYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5zeW1iaWFuLmluc3RhbGwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioubi1nYWdlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uY2QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucGNkK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLnBjZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJwc3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldHMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnBzcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWRtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVkbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWR4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVkeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZXh0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4dCIvPgorICA8L21pbWUtdHlwZT4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gT3BlbiBEb2N1bWVudCBGb3JtYXQgZm9yIE9mZmljZSBBcHBsaWNhdGlvbnMgKE9wZW5Eb2N1bWVudCkgdjEuMCAgICAtLT4KKyAgPCEtLSBodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL3NwZWNzL2luZGV4LnBocCNvcGVuZG9jdW1lbnR2MS4wICAgICAgICAgIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ii8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBDaGFydCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogQ2hhcnQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5kYXRhYmFzZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogRm9ybXVsYSBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIiAvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEZvcm11bGEgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGZ0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogR3JhcGhpY3MgZG9jdW1lbnQgKERyYXdpbmcpPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHcmFwaGljcyBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdGciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBJbWFnZSBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogSW1hZ2UgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBQcmVzZW50YXRpb24gZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZHAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbi10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFByZXNlbnRhdGlvbiBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdHAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ii8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBTcHJlYWRzaGVldCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogU3ByZWFkc2hlZXQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFRleHQgZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2R0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogR2xvYmFsIFRleHQgZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90bSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGUgZm9yIEhUTUwgZG9jdW1lbnRzPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90aCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYm4iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2xwYy1zdWdhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54byIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtY29uZmlnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWh0dHAtcmVxdWVzdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEtc2N3cy1odHRwLXJlc3BvbnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5hc3NvY2lhdGVkLXByb2NlZHVyZS1wYXJhbWV0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5kcm0tdHJpZ2dlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LmltZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lmx0a20iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lm5vdGlmaWNhdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnByb3Zpc2lvbmluZ3RyaWdnZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnYm9vdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dkZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnZHUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNpbXBsZS1zeW1ib2wtY29udGFpbmVyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zbWFydGNhcmQtdHJpZ2dlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNwcm92K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3RrbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGNkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kZDIreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRkMiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaXNkK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZ3JvdXAtdXNhZ2UtbGlzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5kZXRhaWxlZC1wcm9ncmVzcy1yZXBvcnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZmluYWwtcmVwb3J0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmdyb3Vwcyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5pbnZvY2F0aW9uLWRlc2NyaXB0b3IreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2Mub3B0aW1pemVkLXByb2dyZXNzLXJlcG9ydCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnhjYXAtZGlyZWN0b3J5K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1lbWFpbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hZHMtZmlsZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hZHMtZm9sZGVyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb24iPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3h0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb248L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHB0eCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGhteCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNsZHgiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3ciPgorICAgIDxnbG9iIHBhdHRlcm49IioucHBzeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb3R4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93Ij4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBTbGlkZXNob3c8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHBzeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2s8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgVGVtcGxhdGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGx0eCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayBUZW1wbGF0ZSAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGx0bSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG9jeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQgVGVtcGxhdGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG90eCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9zYS5uZXRkZXBsb3kiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NnaS5idW5kbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NnaS5kcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3Rwcy5jdC1raXAreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBhbG0iPgorICAgIDxnbG9iIHBhdHRlcm49IioucGRiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcWEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9wcmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBhb3MueG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBnLmZvcm1hdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdHIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5laTYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBpYWNjZXNzLmFwcGxpY2F0aW9uLWxpY2VuY2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGljc2VsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVmaWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvYy5ncm91cC1hZHZlcnRpc2VtZW50K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb2NrZXRsZWFybiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjYiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGJkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2LXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3LXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNzUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNzUtcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcmVtaW5ldCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcmV2aWV3c3lzdGVtcy5ib3giPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm94Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcm90ZXVzLm1hZ2F6aW5lIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1neiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHVibGlzaGFyZS1kZWx0YS10cmVlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFwcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHZpLnB0aWQxIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB0aWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB3Zy1tdWx0aXBsZXhlZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wd2cteGh0bWwtcHJpbnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnF1YWxjb21tLmJyZXctYXBwLXJlcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5xdWFyay5xdWFya3hwcmVzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xeGQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnF4dCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucXdkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xd3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnF4bCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucXhiIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yYXBpZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXhsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm11c2ljeG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZW5sZWFybi5ybHByaW50Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJpbS5jb2QiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY29kIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii5STUYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubGluazY2Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ydWNrdXMuZG93bmxvYWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuczNzbXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zYm0ubWlkMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zY3JpYnVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC4zZGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmNzZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQuZG9jIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5lbWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLm1odCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQubmV0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5wcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnRpZmYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnhscyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5odG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLnBkZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VtYSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZW1hIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZW1kIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlbWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlbWYiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VtZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybWRhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWZtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtdGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5paWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLnBhY2thZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXBrIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaW10ZWNoLW1pbmRtYXBwZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioudHdkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50d2RzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zbWFmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc21hcnQudGVhY2hlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50ZWFjaGVyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2Z0d2FyZTYwMi5maWxsZXIuZm9ybSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc29mdHdhcmU2MDIuZmlsbGVyLmZvcm0teG1sLXppcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2xlbnQuc2RrbSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RrbSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RrZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR4cCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuc2ZzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNmcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3NzLWNvZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zc3MtZHRmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNzcy1udGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uZHJhdyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZGEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc21mIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52b3IiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RyZWV0LXN0cmVhbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXciPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3htIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQuc3VuLnhtbC53cml0ZXIiLz4KKyAgICA8X2NvbW1lbnQ+T3Blbk9mZmljZSB2MS4wOiBXcml0ZXIgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN4dyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci5nbG9iYWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdHciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdXMtY2FsZW5kYXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3VzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdXNwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdmQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zd2lmdHZpZXctaWNzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3ltYmlhbi5pbnN0YWxsIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDAwMDQxOSIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iOCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2lzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaXN4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0rd2J4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmRtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhkbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtLm5vdGlmaWNhdGlvbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRhby5pbnRlbnQtbW9kdWxlLWFyY2hpdmUiPgorICAgIDxnbG9iIHBhdHRlcm49IioudGFvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50bW9iaWxlLWxpdmV0diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50bW8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRyaWQudHB0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRwdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJ1ZWFwcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50cmEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRydWVkb2MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudWZkbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51ZmQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVmZGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51dHoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVtYWppbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51bWoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVuaXR5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVuaXR5d2ViIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51b21sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51b21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmFsZXJ0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQtd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ljZS13YnhtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wLXdieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdC13YnhtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kLXdieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuc2lnbmFsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZjeCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52Y3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZkLXN0dWR5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZlY3RvcndvcmtzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZpZHNvZnQudmlkY29uZmVyZW5jZSIvPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQudmlzaW8gLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZpc2lvIj4KKyAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFZpc2lvIERpYWdyYW08L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioudnNkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52c3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudnN3Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmlzaW9uYXJ5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZpcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudml2aWRlbmNlLnNjcmlwdGZpbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudnNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLnNpYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAuc2xjIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndieG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndhcC53bWxjIj4KKyAgICA8X2NvbW1lbnQ+Q29tcGlsZWQgV01MIERvY3VtZW50PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtbGMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGMiPgorICAgIDxfY29tbWVudD5Db21waWxlZCBXTUwgU2NyaXB0PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtbHNjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndlYnR1cmJvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnd0YiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2ZhLndzYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53bWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud21mLmJvb3RzdHJhcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53b3JkcGVyZmVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndxZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndycS1ocDMwMDAtbGFiZWxsZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3Quc3RmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnd2LmNzcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3Yuc3NwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54YXJhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhhciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueGZkbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZmRsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54ZmRsLndlYmZvcm0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1pK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5jcGtnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLmRwa2ciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUucGxhbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5wcGtnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLnhsaW0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LWRpYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1zY3JpcHQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHZzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHZwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9zZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdC5vc2ZwdmcreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9zZnB2ZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW8iPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2FmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuc21hZi1waHJhc2UiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55ZWxsb3dyaXZlci1jdXN0b20tbWVudSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbXAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnp1bCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi56aXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnppcnoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnp6YXp6LmRlY2sreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnpheiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92b2ljZXhtbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioudnhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93YXRjaGVyaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aG9pc3BwLXF1ZXJ5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2hvaXNwcC1yZXNwb25zZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dpbmhscCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5obHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2l0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0NS4xIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd3NkbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3NkbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3Nwb2xpY3kiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LTEyMyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDFhMDAiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDAyMDAiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFiaXdvcmQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWJ3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWNlLWNvbXByZXNzZWQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hZG9iZS1pbmRlc2lnbiI+CisgICAgPGFjcm9ueW0+SU5ERDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QWRvYmUgSW5EZXNpZ24gZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouaW5kZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWRvYmUtaW5kZXNpZ24taW50ZXJjaGFuZ2UiPgorICAgIDxhY3JvbnltPklOWDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QWRvYmUgSW5EZXNpZ24gSW50ZXJjaGFuZ2UgZm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0Oz9haWQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjEwMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pbngiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXJjaGl2ZSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ij0mbHQ7YXImZ3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSI9ISZsdDthcmNoJmd0OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcj0iKi5hciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1iaW4iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54MzIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnUzMiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioudm94Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1tYXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1zZWciPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYmNwaW8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmNwaW8iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJlcmtlbGV5LWRiIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDIyNTMiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQyMjUzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQyMjUzIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQwOTg4IiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MDk4OCIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MDk4OCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJpYnRleC10ZXh0LWZpbGUiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIlXCBCaWJUZVhcIGAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiUlJVwgXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI3MyIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIlXCBCaWJUZVhcIHN0YW5kYXJkXCBiaWJsaW9ncmFwaHlcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJSUlXCBcIEBCaWJUZVgtc3R5bGUtZmlsZXsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI3MyIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAYXJ0aWNsZXsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBib29reyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQGluYm9va3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBpbmNvbGxlY3Rpb257IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAaW5wcm9jZWVkaW5nc3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBtYW51YWx7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAbWlzY3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBwcmVhbWJsZXsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBwaGR0aGVzaXN7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAdGVjaHJlcG9ydHsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkB1bnB1Ymxpc2hlZHsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJpYiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmlidGV4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iaXR0b3JyZW50Ij4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iZDg6YW5ub3VuY2UiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRvcnJlbnQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJCWmgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJ6Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50YnoiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJ6MiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGJ6MiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm96Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNkbGluayI+CisgICAgPF9jb21tZW50PlZpcnR1YWwgQ0QtUk9NIENEIEltYWdlIEZpbGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioudmNkIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaGF0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNoYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaGVzcy1wZ24iPgorICAgIDxnbG9iIHBhdHRlcm49IioucGduIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb21wcmVzcyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwwMzdcMjM1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi56Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb3JlbHByZXNlbnRhdGlvbnMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2h3Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisgIAorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY3BpbyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwNyIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDciIHR5cGU9ImJpZzE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzA3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3BpbyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY3NoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzaCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGViIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi51ZGViIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kaXJlY3RvciI+CisgICAgPF9jb21tZW50PlNob2Nrd2F2ZSBNb3ZpZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRjciIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHhyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jc3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNjdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3h0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53M2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZnZCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3dhIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kb29tIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndhZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubmN4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHRib29rK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kdGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdGJyZXNvdXJjZSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmVzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdmkiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMzY3XDAwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMmY3IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR2aSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZWxjIj4KKyAgICA8X2NvbW1lbnQ+RW1hY3MgTGlzcCBieXRlY29kZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tIEVtYWNzIDE4IC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDEyKCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8IS0tIEVtYWNzIDE5IC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSI7RUxDXDAyM1wwMDBcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVsYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1iZGYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1kb3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtZnJhbWVtYWtlciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1naG9zdHNjcmlwdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nc2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWxpYmdyeCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1saW51eC1wc2YiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHNmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LW90ZiI+CisgICAgPGFjcm9ueW0+T1RGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5PcGVuVHlwZSBGb250PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90ZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1wY2YiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zbmYiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc25mIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zcGVlZG8iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtc3Vub3MtbmV3cyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXR0ZiI+CisgICAgPGFjcm9ueW0+VFRGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5UcnVlVHlwZSBGb250PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR0ZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudHRjIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMTAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtdHlwZTEiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGZhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZmIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWZtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC12Zm9udCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giPgorICAgIDxfY29tbWVudD5NYWNyb21lZGlhIEZ1dHVyZVNwbGFzaCBGaWxlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNwbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ251Y2FzaCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nbnVjYXNoIiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ251bWVyaWMiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LUdudW1lcmljLXNwcmVhZHNoZWV0Ii8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ij0mbHQ7Z21yOldvcmtib29rIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzkiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdudW1lcmljIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1ndGFyIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgIDwhLS0gR05VIHRhciBhcmNoaXZlIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJ1c3RhciAgXDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNTciIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd0YXIiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1nemlwIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAzN1wyMTMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi50Z3oiIC8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5neiIgLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLWd6IiAvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZW16IiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaGRmIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwZTAzMTMwMSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMjExSERGXHJcblwwMzIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhkZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaGU1Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1od3AiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPCEtLQorICAgICAgICBUSUtBLTMzMDogRGV0ZWN0aW9uIHBhdHRlcm4gYmFzZWQgb24gc2lnbmF0dXJlIHN0cmluZ3MgZnJvbQorICAgICAgICB0aGUgaHdwZmlsdGVyL3NvdXJjZS9od3BmaWxlLmNwcCBmaWxlIGluIE9wZW5PZmZpY2Uub3JnLgorICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IkhXUCBEb2N1bWVudCBGaWxlIFYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWlzbzk2NjAtaW1hZ2UiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJDRDAwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjM3NjMzIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlzbyIgLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWphdmEtam5scC1maWxlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpubHAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWtkZWxuayI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IltLREVcIERlc2t0b3BcIEVudHJ5XSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iI1wgS0RFXCBDb25maWdcIEZpbGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWxhdGV4Ij4KKyAgICA8X2NvbW1lbnQ+TGFUZVggU291cmNlIERvY3VtZW50PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJVwgLSotbGF0ZXgtKi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxhdGV4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1saGEiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSItbHpzLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoXDQwLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoZC0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDItIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGgzLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNC0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDUtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGg2LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNy0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWxoYXJjIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMC0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDEtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbHo0LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWx6NS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1vYmlwb2NrZXQtZWJvb2siPgorICAgIDxnbG9iIHBhdHRlcm49IioucHJjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tb2JpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXMtYXBwbGljYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXBwbGljYXRpb24iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy13bWQiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud21kIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXMtd216Ij4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ3ppcCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud216Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXMteGJhcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54YmFwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNhY2Nlc3MiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWRiIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNiaW5kZXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2JkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNjYXJkZmlsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2NsaXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5leGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRsbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY29tIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iYXQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zaSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm12YiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTEzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tMTQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc21ldGFmaWxlIj4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1lbWYiLz4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC13bWYiLz4KKyAgICA8YWNyb255bT5XTUY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PldpbmRvd3MgTWV0YWZpbGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioud21mIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc21vbmV5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1ueSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zcHVibGlzaGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB1YiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zc2NoZWR1bGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2NkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXN0ZXJtaW5hbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50cm0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc3dyaXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndyaSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW5ldGNkZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2RmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGtjczEyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnAxMiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGZ4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGtjczctY2VydGlmaWNhdGVzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnA3YiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGtjczctY2VydHJlcXJlc3AiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDdyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1xdWF0dHJvLXBybyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xcHciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndiMSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2IyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53YjMiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKyAgCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1yYXItY29tcHJlc3NlZCI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtcmFyIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlJhciEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcnBtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJwbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2MiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJTcHJlYWRzaGVldCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjM4Ii8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNoIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIjIVwgLyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iIyFcdC8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNoIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zaGFyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNoYXIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI+CisgICAgPGFjcm9ueW0+Rmxhc2g8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkFkb2JlIEZsYXNoPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRldTIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIEYgPSBVbmNvbXByZXNzZWQgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNXUyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBDID0gQ29tcHJlc3NlZCAgIC0tPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zd2YiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNpbHZlcmxpZ2h0LWFwcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54YXAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXQiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJTdHVmZkl0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaXQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXR4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpdHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdjRjcGlvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN2NGNwaW8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdjRjcmMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3Y0Y3JjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10YXIiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPCEtLSBQT1NJWCB0YXIgYXJjaGl2ZSAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0idXN0YXJcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI1NyIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudGFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10Y2wiPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtdGNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50Y2wiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQveC10ZXgiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxpbnB1dCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxzZWN0aW9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXHNldGxlbmd0aCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxkb2N1bWVudHN0eWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXGNoYXB0ZXIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlxcZG9jdW1lbnRjbGFzcyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxyZWxheCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxjb250ZW50c2xpbmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4LXRmbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50Zm0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleGluZm8iPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtdGV4aW5mbyIgLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxpbnB1dFwgdGV4aW5mbyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudGV4aW5mbyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGV4aSIvPgorICA8L21pbWUtdHlwZT4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gTWljcm9zb2Z0IE9mZmljZSBiaW5hcnkgZmlsZSBmb3JtYXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaW50ZXJvcC9kb2NzL09mZmljZUJpbmFyeUZvcm1hdHMubXNweCAgICAgIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIj4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBPZmZpY2UgT3BlbiBYTUwgZmlsZSBmb3JtYXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvc3RhbmRhcmRzL0VjbWEtMzc2Lmh0bSAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDAzXDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IltDb250ZW50X1R5cGVzXS54bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdXN0YXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioudXN0YXIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGVyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcnQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14ZmlnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZpZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXhwaW5zdGFsbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cGkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXpvbyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmRjNGE3ZGMiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnpvbyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3g0MDAtYnAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWF0dCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWNhcHMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1lbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWVycm9yK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtbnMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNvbi1jb25mZXJlbmNlLWluZm8tZGlmZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y29uLWNvbmZlcmVuY2UtaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94ZW5jK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZW5jIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGh0bWwreG1sIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2h0bWwgeG1sbnM9IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4MTkyIi8+CisgICAgPC9tYWdpYz4KKyAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsb2NhbE5hbWU9Imh0bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodG1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54aHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94aHRtbC12b2ljZSt4bWwiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQveG1sIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDs/eG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7P1hNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyEtLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhGRkZFM0MwMDNGMDA3ODAwNkQwMDZDMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4RkVGRjAwM0MwMDNGMDA3ODAwNkQwMDZDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBUT0RPOiBBZGQgbWF0Y2hlcyBmb3IgdGhlIG90aGVyIHBvc3NpYmxlIFhNTCBlbmNvZGluZyBzY2hlbWVzIC0tPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNkIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbC1kdGQiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHRkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbC1leHRlcm5hbC1wYXJzZWQtZW50aXR5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1wcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94b3AreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhvcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hzbHQreG1sIj4KKyAgICA8YWxpYXMgdHlwZT0idGV4dC94c2wiLz4KKyAgICA8YWNyb255bT5YU0xUPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5YU0wgVHJhbnNmb3JtYXRpb25zPC9fY29tbWVudD4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJzdHlsZXNoZWV0IgorICAgICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNsdCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hzcGYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzcGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veHYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodm1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54dm1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54dm0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi96aXAiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnppcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvLzMya2FkcGNtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vM2dwcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvLzNncHAyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYWMzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYWRwY20iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2FtciIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Ftci13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Ftci13YisiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hc2MiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Jhc2ljIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLnNuZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjQiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI2IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjciIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc25kIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYnYxNiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2J2MzIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9jbGVhcm1vZGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9jbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2RhdDEyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZGxzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAxMTA4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMDUwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMjExIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMjEyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHZpNCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2VhYzMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyYy1xY3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjMCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmMxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYjAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYjEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjd2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjd2IwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY3diMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzE5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjIxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtMTYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTI0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyNi0zMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtNDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjkxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2dzbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2dzbS1lZnIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9pbGJjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDE2Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDIwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDI0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9scGMiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21pZGkiPgorICAgIDxhY3JvbnltPk1JREk8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50Pk11c2ljYWwgSW5zdHJ1bWVudCBEaWdpdGFsIEludGVyZmFjZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5ID0iMjAiPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgdmFsdWU9Ik1UaGQiIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5taWQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1pZGkiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmthciIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm1pIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbW9iaWxlLXhtZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wNCI+CisgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtbXA0YSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXA0YSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcDRhLWxhdG0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGEtcm9idXN0Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICA8YWNyb255bT5NUDM8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50Pk1QRUctMSBBdWRpbyBMYXllciAzPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDwhLS0gaHR0cDovL21wZ2VkaXQub3JnL21wZ2VkaXQvbXBlZ19mb3JtYXQvTVAzRm9ybWF0Lmh0bWwgLS0+CisgICAgICA8IS0tIEJpdCBwYXR0ZXJuIGZvciBmaXJzdCB0d28gYnl0ZXM6IDExMTExMTExIDExMVZWTExDICAgIC0tPgorICAgICAgPCEtLSBWViA9IE1QRUcgQXVkaW8gVmVyc2lvbiBJRDsgMTAgPSBWMiwgMTEgPSBWMSAgICAgICAgICAtLT4KKyAgICAgIDwhLS0gTEwgPSBMYXllciBkZXNjcmlwdGlvbjsgMDEgPSBMMywgMTAgPSBMMiwgMTEgPSBMMSAgICAgLS0+CisgICAgICA8IS0tIEMgPSBQcm90ZWN0aW9uIGJpdDsgMCA9IENSQywgMSA9IG5vIENSQyAgICAgICAgICAgICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwzLCBDUkMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDMgICAgICAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMiwgQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwyICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDEsIENSQyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMSAgICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwzLCBDUkMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmYiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDMgICAgICAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZjIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMiwgQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwyICAgICAgLS0+CisgICAgICA8IS0tIFRJS0EtNDE3OiBUaGlzIGlzIHRoZSBVVEYtMTYgTEUgYnl0ZSBvcmRlciBtYXJrISAtLT4KKyAgICAgIDwhLS0gbWF0Y2ggdmFsdWU9IjB4ZmZmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLyAtLT4gPCEtLSBWMSwgTDEsIENSQyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMSAgICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJJRDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wZ2EiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wMiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXAyYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXAzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tMmEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0zYSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wZWc0LWdlbmVyaWMiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL29nZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZ2EiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9nZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3B4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wYXJpdHlmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY21hIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtYS13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3BjbXUtd2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY211Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wcnMuc2lkIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUFNJRCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3FjZWxwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcmVkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnRwLWVuYy1hZXNjbTEyOCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3J0cC1taWRpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnR4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212MCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Ntdi1xY3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zcC1taWRpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdDE0MGMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90MzgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90ZWxlcGhvbmUtZXZlbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90b25lIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdWxwZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdmR2aSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Ztci13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC4zZ3BwLml1ZnAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuNHNiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmF1ZGlva296Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNlbHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuY2lzY28ubnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNtbGVzLnJhZGlvLWV2ZW50cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jbnMuYW5wMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jbnMuaW5mMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVvbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZGxuYS5hZHRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LmhlYWFjLjEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkuaGVhYWMuMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5tbHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkubXBzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5wbDJ4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMnoiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZHRzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZHRzLmhkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0c2hkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5ldmVyYWQucGxqIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmhucy5hdWRpbyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5sdWNlbnQudm9pY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IioubHZwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5YSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubm9raWEubW9iaWxlLXhtZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5ub3J0ZWwudmJrIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwNDgwMCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDQ4MDAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwNzQ3MCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDc0NzAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwOTYwMCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDk2MDAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm9jdGVsLnNiYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5xY2VscCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5yaGV0b3JleC4zMmthZHBjbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5tcGVnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnZteC5jdnNkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm9yYmlzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm9yYmlzLWNvbmZpZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtYWFjIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtYWRiY20iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIuc25kIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1haWZmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXVkaW8vYWlmZiIvPgorICAgIDxhY3JvbnltPkFJRkY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkF1ZGlvIEludGVyY2hhbmdlIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRk9STS4uLi5BSUZGIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJGT1JNLi4uLkFJRkMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICA8IS0tIEFtaWdhIElGRiBzb3VuZCBzYW1wbGUsIHNvbWV3aGF0IGxpa2UgdGhlIG1vcmUgbW9kZXJuIEFJRkYgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZPUk0uLi4uOFNWWCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkYiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWlmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haWZmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haWZjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1kZWMtYmFzaWMiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwNjQ3MzJFIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIj4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI0IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI3IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtZGVjLWFkYmNtIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDY0NzMyRSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1mbGFjIj4KKyAgICA8YWNyb255bT5GTEFDPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5GcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iZkxhQyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmxhYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbW9kIj4KKyAgICA8YWNyb255bT5NT0Q8L2Fjcm9ueW0+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkV4dGVuZGVkXCBNb2R1bGU6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJCTU9EMlNUTSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik0uSy4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik0hSyEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZMVDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZMVDgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjRDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjZDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjhDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNEODEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik9LVEEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjE2Q04iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjMyQ04iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IklNUE0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXBlZ3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tM3UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tcy13YXgiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2F4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXMtd21hIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtYSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIj4KKyAgICA8X2NvbW1lbnQ+UmVhbCBBdWRpbzwvX2NvbW1lbnQ+CisgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtcmVhbGF1ZGlvIiAvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDJlNzI2MWZkIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucmEiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4iPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm1wIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC13YXYiPgorICAgIDxhY3JvbnltPldBVjwvYWNyb255bT4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUklGRi4uLi5XQVZFIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi53YXYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNkeCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jaWYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2lmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY21kZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbWRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY21sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNzbWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3NtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LXBkYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gteHl6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh5eiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2JtcCI+CisgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtbXMtYm1wIi8+CisgICAgPGFjcm9ueW0+Qk1QPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5XaW5kb3dzIGJpdG1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm1wIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaWIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9jZ20iPgorICAgIDxhY3JvbnltPkNHTTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+Q29tcHV0ZXIgR3JhcGhpY3MgTWV0YWZpbGU8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJCRUdNRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDIwIiBtYXNrPSIweGZmZTAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNnbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9maXRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvZzNmYXgiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZzMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9naWYiPgorICAgIDxhY3JvbnltPkdJRjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+R3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iR0lGODdhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJHSUY4OWEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdpZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2llZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanAyIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcGVnIj4KKyAgICA8YWNyb255bT5KUEVHPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Kb2ludCBQaG90b2dyYXBoaWMgRXhwZXJ0cyBHcm91cDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tIEZGRDggaXMgdGhlIFNPSSAoU3RhcnQgT2YgSW1hZ2UpIG1hcmtlci4gICAgICAgICAgICAgIC0tPgorICAgICAgPCEtLSBJdCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG1hcmtlciB0aGF0IHN0YXJ0cyB3aXRoIEZGLiAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmQ4ZmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBlZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBlIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qaWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpmaWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpmaSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2pwbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2pweCIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL25hcGxwcyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvcG5nIj4KKyAgICA8YWNyb255bT5QTkc8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3M8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJceDg5UE5HXHgwZFx4MGFceDFhXHgwYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucG5nIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvcHJzLmJ0aWYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYnRpZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wcnMucHRpIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9zdmcreG1sIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICAgIDxhY3JvbnltPlNWRzwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+U2NhbGFibGUgVmVjdG9yIEdyYXBoaWNzPC9fY29tbWVudD4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJzdmciIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN2ZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZneiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3QzOCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvdGlmZiI+CisgICAgPGFjcm9ueW0+VElGRjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+VGFnZ2VkIEltYWdlIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDwhLS0gTU0uKiA9IEJpZyBlbmRpYW4gKE09TW90b3JvbGEpIGFuZCAweDAwMmEgaW4gYmlnIGVuZGlhbiAgICAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTU1ceDAwXHgyYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDwhLS0gSUkqLiA9IExpdHRsZSBlbmRpYW4gKEk9SW50ZWwpIGFuZCAweDAwMmEgaW4gbGl0dGxlIGVuZGlhbiAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iSUlceDJhXHgwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudGlmZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGlmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvdGlmZi1meCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcCI+CisgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtcHNkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wc2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuY25zLmluZjIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZGp2dSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kanZ1Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kanYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZHdnIj4KKyAgICA8YWNyb255bT5EV0c8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkF1dG9DYWQgRHJhd2luZzwvX2NvbW1lbnQ+CisgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtZHdnIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2FjYWQiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1hY2FkIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2F1dG9jYWRfZHdnIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2R3ZyIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWR3ZyIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWF1dG9jYWQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR3ZyIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPCEtLSAiQUMiIGZvbGxvd2VkIGJ5IGZvdXIgbnVtYmVycyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQUMwMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGMEYwRjBGMCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmR4ZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5keGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mYnMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZweCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mcHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZzdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mc3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1ybGMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmxjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5nbG9iYWxncmFwaGljcy5wZ2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQubWljcm9zb2Z0Lmljb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQubWl4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm1zLW1vZGkiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWRpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5uZXQtZnB4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5weCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQucmFkaWFuY2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuc2VhbGVkLnBuZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5naWYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwuanBnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnN2ZiIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLndhcC53Ym1wIj4KKyAgICA8X2NvbW1lbnQ+V2lyZWxlc3MgQml0bWFwIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndibXAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQueGlmZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54aWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1jbXUtcmFzdGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWNteCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbXgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1mcmVlaGFuZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5maCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmhjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5maDQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoNSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmg3Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1pY29uIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDEwMlwxMDFcMDUwXDAwMFwwMDBcMDAwXDA1NlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCisgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwMFwwMDBcMDAxXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWNvIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1uaWZmIj4KKyAgICA8X2NvbW1lbnQ+TmF2eSBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IklJTjEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBjeCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1waWN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBpYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGN0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiPgorICAgIDxhY3JvbnltPlBOTTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgQW55IE1hcDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbm0iIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLz4KKyAgICA8YWNyb255bT5QQk08L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlBvcnRhYmxlIEJpdCBNYXA8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBibSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCIvPgorICAgIDxhY3JvbnltPlBHTTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgR3JheSBNYXA8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUDUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBnbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtYW55bWFwIi8+CisgICAgPGFjcm9ueW0+UFhNPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Qb3J0YWJsZSBQaXhlbCBNYXA8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlA3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcG0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1hZG9iZSI+CisgICAgPGFjcm9ueW0+RE5HPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5BZG9iZSBEaWdpdGFsIE5lZ2F0aXZlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRuZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWhhc3NlbGJsYWQiPgorICAgIDxfY29tbWVudD5IYXNzZWxibGFkIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi4zZnIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1mdWppIj4KKyAgICA8X2NvbW1lbnQ+RnVqaSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucmFmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctY2Fub24iPgorICAgIDxfY29tbWVudD5DYW5vbiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouY3J3Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcjIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1rb2RhayI+CisgICAgPF9jb21tZW50PktvZGFrIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rMjUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtkYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGNzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kcmYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1taW5vbHRhIj4KKyAgICA8X2NvbW1lbnQ+TWlub2x0YSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioubXJ3Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctbmlrb24iPgorICAgIDxfY29tbWVudD5OaWtvbiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioubmVmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ucnciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1vbHltcHVzIj4KKyAgICA8X2NvbW1lbnQ+T2x5bXB1cyByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioub3JmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcGVudGF4Ij4KKyAgICA8X2NvbW1lbnQ+UGVudGF4IHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wdHgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBlZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXNvbnkiPgorICAgIDxfY29tbWVudD5Tb255IHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hcnciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyZiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3IyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctc2lnbWEiPgorICAgIDxfY29tbWVudD5TaWdtYSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueDNmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctZXBzb24iPgorICAgIDxfY29tbWVudD5FcHNvbiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZXJmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctbWFtaXlhIj4KKyAgICA8X2NvbW1lbnQ+TWFtaXlhIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1sZWFmIj4KKyAgICA8X2NvbW1lbnQ+TGVhZiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioubW9zIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcGFuYXNvbmljIj4KKyAgICA8X2NvbW1lbnQ+UGFuYXNvbmljIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yYXciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ3MiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXBoYXNlb25lIj4KKyAgICA8X2NvbW1lbnQ+UGhhc2UgT25lIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlpcSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXJlZCI+CisgICAgPF9jb21tZW50PlJlZCByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucjNkIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctaW1hY29uIj4KKyAgICA8X2NvbW1lbnQ+SW1hY29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mZmYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1sb2dpdGVjaCI+CisgICAgPF9jb21tZW50PkxvZ2l0ZWNoIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5weG4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1jYXNpbyI+CisgICAgPF9jb21tZW50PkNhc2lvIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iYXkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1yYXd6b3IiPgorICAgIDxfY29tbWVudD5SYXd6b3IgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ3eiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmdiIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJnYiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gteGJpdG1hcCI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii8qIFhQTSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioueGJtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3gtYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gteGNmIj4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveGNmIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiB2YWx1ZT0iZ2ltcCB4Y2YgIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gteHBpeG1hcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cG0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14d2luZG93ZHVtcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54d2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2NwaW0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9leGFtcGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9leHRlcm5hbC1ib2R5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9nbG9iYWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbC1kZWxpdmVyeS1zdGF0dXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbC1kaXNwb3NpdGlvbi1ub3RpZmljYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbC1oZWFkZXJzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9odHRwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9pbWRuK3htbCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9uZXdzIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUGF0aDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgPG1hdGNoIHZhbHVlPSJYcmVmOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkFydGljbGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9wYXJ0aWFsIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3JmYzgyMiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlJlbGF5LVZlcnNpb246IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIjIVwgcm5ld3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik4jIVwgcm5ld3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZvcndhcmRcIHRvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQaXBlXCB0byIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUmV0dXJuLVBhdGg6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJGcm9tOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUmVjZWl2ZWQ6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgdmFsdWU9Ik1lc3NhZ2UtSUQ6IiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIHZhbHVlPSJEYXRlOiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWltZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvcy1odHRwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9zaXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3NpcGZyYWciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3RyYWNraW5nLXN0YXR1cyIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvdm5kLnNpLnNpbXAiLz4KKworICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL2V4YW1wbGUiLz4KKworICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL2lnZXMiPgorICAgIDxfY29tbWVudD5Jbml0aWFsIEdyYXBoaWNzIEV4Y2hhbmdlIFNwZWNpZmljYXRpb24gRm9ybWF0PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlncyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWdlcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL21lc2giPgorICAgIDxnbG9iIHBhdHRlcm49IioubXNoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZXNoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaWxvIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmR3ZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kd2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmZsYXRsYW5kLjNkbWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ2RsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdkbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ3MtZ2RsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmdzLmdkbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5ndHciPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3R3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5tb21sK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5tdHMiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXRzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5wYXJhc29saWQudHJhbnNtaXQuYmluYXJ5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLnBhcmFzb2xpZC50cmFuc21pdC50ZXh0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLnZ0dSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52dHUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92cm1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndybCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudnJtbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9hbHRlcm5hdGl2ZSIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9hcHBsZWRvdWJsZSIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9ieXRlcmFuZ2VzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2RpZ2VzdCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9lbmNyeXB0ZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvZXhhbXBsZSIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvaGVhZGVyLXNldCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9taXhlZCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9wYXJhbGxlbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9yZWxhdGVkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3JlcG9ydCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9zaWduZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvdm9pY2UtbWVzc2FnZSIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvY2FsZW5kYXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWNzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZmIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgPF9jb21tZW50PkNhc2NhZGluZyBTdHlsZSBTaGVldDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jc3MiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2NzdiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jc3YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9kaXJlY3RvcnkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2RucyIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvZWNtYXNjcmlwdCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvZW5yaWNoZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2V4YW1wbGUiLz4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvaHRtbCI+CisgICAgIDwhLS0gVElLQS0zMjc6IGlmIHlvdSBlbmNvdW50ZXIgdGFncyBpbiB0aGUgSFRNTAorICAgICAgICAgIHdpdGggbm8gZGVjbGFyZWQgbmFtZXNwYWNlLCBpdCdzIG5vdCBYSFRNTCwgaXQncyBqdXN0CisgICAgICAgICAgYmFkIEhUTUwsIHVuZm9ydHVuYXRlbHkuCisgICAgIC0tPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9Imh0bWwiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJIVE1MIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ibGluayIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkxJTksiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJib2R5Ii8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iQk9EWSIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InAiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJQIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ic2NyaXB0Ii8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iU0NSSVBUIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZnJhbWVzZXQiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJGUkFNRVNFVCIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IURPQ1RZUEUgSFRNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyFkb2N0eXBlIGh0bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtIRUFEIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aGVhZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O1RJVExFIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7dGl0bGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICA8IS0tIG5vdGUgb24gdGhlIG9mZnNldCB2YWx1ZSBoZXJlOiB0aGlzIGNhbiBvbmx5IGJlIGFzIGJpZyBhcworICAgICAgICAgICBNaW1lVHlwZXMjZ2V0TWluTGVuZ3RoKCkuIElmIHlvdSBzZXQgdGhlIG9mZnNldCB2YWx1ZSB0byBsYXJnZXIKKyAgICAgICAgICAgdGhhbiB0aGF0IHNpemUsIHRoZSBtYWdpYyB3aWxsIG9ubHkgYmUgY29tcGFyZWQgdG8gdXAgdG8KKyAgICAgICAgICAgTWltZVR5cGVzI2dldE1pbkxlbmd0aCgpIGJ5dGVzLgorICAgICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aHRtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6ODE5MiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7SFRNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0JPRFkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtib2R5IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7VElUTEUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDt0aXRsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2gxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7SDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshZG9jdHlwZSBIVE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IURPQ1RZUEUgaHRtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHRtbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHRtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wYXJpdHlmZWMiLz4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvcGxhaW4iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJUaGlzIGlzIFRlWCwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlRoaXMgaXMgTUVUQUZPTlQsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIvKiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLy8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ijs7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBVVEYtMTZCRSBCT00gLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmVmZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDwhLS0gVVRGLTE2TEUgQk9NIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8IS0tIFVURi04IEJPTSAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhlZmJiYmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKworICAgIDxnbG9iIHBhdHRlcm49IioudHh0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50ZXh0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jb25mIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kZWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxvZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaW4iLz4KKworICAgIDwhLS0gVElLQS04NTogaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9zdm4tZW9sLXN0eWxlLnR4dCAtLT4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJJTlNUQUxMIi8+CisgICAgPGdsb2IgcGF0dGVybj0iS0VZUyIvPgorICAgIDxnbG9iIHBhdHRlcm49Ik1ha2VmaWxlIi8+CisgICAgPGdsb2IgcGF0dGVybj0iUkVBRE1FIi8+CisgICAgPGdsb2IgcGF0dGVybj0iYWJzLWxpbmttYXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJhYnMtbWVudWxpbmtzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hYXJ0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYW0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNnaSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xhc3NwYXRoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbWQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvbmZpZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3dpa2kiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhdGEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRjbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZWdybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZW50Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZm4iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ2Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncm0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIuaHRhY2Nlc3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlodG1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qbXgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpzcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanVuaXQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmp4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYW5pZmVzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1mIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5NRiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWV0YSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubjMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBlbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHJvamVjdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHJvcGVydGllcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHkiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybmciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJueCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm9sZXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNxbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGxkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50eXBlcyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioudm0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzbCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3NkZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGFyZ3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhjYXQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhjb25mIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZWdybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGdybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxleCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxvZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueG1hcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHJvbGVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54c2FtcGxlcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54d2ViIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54d2VsY29tZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvcHJzLmZhbGxlbnN0ZWluLnJzdCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcHJzLmxpbmVzLnRhZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kc2MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9yZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JmYzgyMi1oZWFkZXJzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9yaWNodGV4dCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ydHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9ydGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3J0cC1lbmMtYWVzY20xMjgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3J0eCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvc2dtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZ21sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZ20iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC90MTQwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50c3YiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3Ryb2ZmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC10cm9mZiIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbiIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmLW1lIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYtbXMiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLlxcJnF1b3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSInXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IicuXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlxcJnF1b3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSInJyciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yb2ZmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYW4iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1lIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvdWxwZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC91cmktbGlzdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51cmkiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVyaXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVybHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuYWJjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jdXJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmN1cmwuZGN1cmwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGN1cmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybC5zY3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zY3VybCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsLm1jdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1jdXJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmRtY2xpZW50c2NyaXB0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZXNtZXJ0ZWMudGhlbWUtZGVzY3JpcHRvciIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmZseSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbHkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZm1pLmZsZXhzdG9yIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZseCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5ncmFwaHZpeiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ndiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pbjNkLjNkbWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouM2RtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pbjNkLnNwb3QiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BvdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pcHRjLm5ld3NtbCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmlwdGMubml0ZiIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmxhdGV4LXoiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5tb3Rvcm9sYS5yZWZsZXgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5tcy1tZWRpYXBhY2thZ2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5uZXQycGhvbmUuY29tbWNlbnRlci5jb21tYW5kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuc2kudXJpY2F0YWxvZ3VlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuc3VuLmoybWUuYXBwLWRlc2NyaXB0b3IiPgorICAgIDxnbG9iIHBhdHRlcm49IiouamFkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLnRyb2xsdGVjaC5saW5ndWlzdCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLndhcC5zaSIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLndhcC5zbCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLndhcC53bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud21sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLndtbHNjcmlwdCI+CisgICAgPF9jb21tZW50PldNTCBTY3JpcHQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioud21scyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hc20iPgorICAgIDxnbG9iIHBhdHRlcm49IioucyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXNtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN4eCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3BwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oaCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGljIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWRpZmYiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJkaWZmXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IioqKlwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJPbmx5XCBpblwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJDb21tb25cIHN1YmRpcmVjdG9yaWVzOlwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJJbmRleDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpZmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBhdGNoIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWZvcnRyYW4iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZm9yIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mNzciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmY5MCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcGFzY2FsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBhcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQveC1qYXZhLXNvdXJjZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qYXZhIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXNldGV4dCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ldHgiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdXVlbmNvZGUiPgorICAgIDxnbG9iIHBhdHRlcm49IioudXUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXZjYWxlbmRhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52Y3MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXZjYXJkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQveG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNncCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwLXR0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vM2dwcDIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouM2cyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2JtcGVnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vYnQ2NTYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9jZWxiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vZHYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9leGFtcGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2MSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oMjYxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaDI2MyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjYzLTE5OTgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjYzLTIwMDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjY0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgyNjQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vanBlZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGd2Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2pwZWcyMDAwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vanBtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBnbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tajIiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWoyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tanAyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wMXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcDJwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXAydCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wNCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcDQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wNHYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wZzQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXA0di1lcyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXBlZyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwwMDBcMDAwXDAwMVwyNjMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wZWciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBlIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tMXYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0ydiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcGVndXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14dSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wZWc0LWdlbmVyaWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcHYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9udiIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vb2dnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9ndiIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vb2dnIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcGFyaXR5ZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcG9pbnRlciIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcXVpY2t0aW1lIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0ibW9vdiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0ibWRhdCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucXQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3JhdyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3J0cC1lbmMtYWVzY20xMjgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9ydHgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9zbXB0ZTI5Mm0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby91bHBmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92YzEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuY2N0diIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5kbG5hLm1wZWctdHRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmZ2dCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mdnQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmhucy52aWRlbyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMWRwYXJpdHlmZWMtMTAxMCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMWRwYXJpdHlmZWMtMjAwNSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMmRwYXJpdHlmZWMtMTAxMCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMmRwYXJpdHlmZWMtMjAwNSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0udHRzYXZjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS50dHNtcGVnMiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlbyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlb3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubXBlZ3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5teHUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm00dSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5weXYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm5va2lhLmludGVybGVhdmVkLW11bHRpbWVkaWEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubm9raWEudmlkZW92b2lwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm9iamVjdHZpZGVvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZC5tcGVnMSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWQubXBlZzQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuc2VhbGVkLnN3ZiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5tb3YiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQudml2byI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52aXYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1mNHYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZjR2Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1mbGMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmxjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1mbGkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmxpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1mbHYiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJGTFYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtam5nIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXHg4YkpORyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouam5nIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tNHYiPgorICAgIDxnbG9iIHBhdHRlcm49IioubTR2Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tbmciPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJceDhhTU5HIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tbmciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLWFzZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hc2YiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXdtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd212Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtdiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXdteCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bXgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tcy13dngiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3Z4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tc3ZpZGVvIj4KKyAgICA8YWxpYXMgdHlwZT0idmlkZW8vYXZpIi8+CisgICAgPGFsaWFzIHR5cGU9InZpZGVvL21zdmlkZW8iLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUklGRi4uLi5BVkkgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdmkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LXNnaS1tb3ZpZSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik1PVkkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vdmllIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ieC1jb25mZXJlbmNlL3gtY29vbHRhbGsiPgorICAgIDxfY29tbWVudD5Db29sdGFsayBBdWRpbzwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKzwvbWltZS1pbmZvPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueHNsIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NGE5OWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54c2wKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gCisJRGVzY3JpcHRpb246IFRvIHVzZSB0aGlzIHN0eWxlc2hlZXQgaW4geW91ciBwcm9kdWN0LXR5cGUtZWxlbWVudCBtYXAsIGFkZCB0aGUgZm9sbG93aW5nCisJbGluZSBiZWxvdyB0aGUgPD94bWwuLi4gPz4gZGVjbGFyYXRpb24gaW4gdGhlIG1hcCBmaWxlOgorCQorCTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InByb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54c2wiPz4KKy0tPgorPCFET0NUWVBFIHhzbDpzdHlsZXNoZWV0ICBbCisJPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPgorCTwhRU5USVRZIGNvcHkgICAiJiMxNjk7Ij4KKwk8IUVOVElUWSByZWcgICAgIiYjMTc0OyI+CisJPCFFTlRJVFkgdHJhZGUgICImIzg0ODI7Ij4KKwk8IUVOVElUWSBtZGFzaCAgIiYjODIxMjsiPgorCTwhRU5USVRZIGxkcXVvICAiJiM4MjIwOyI+CisJPCFFTlRJVFkgcmRxdW8gICImIzgyMjE7Ij4gCisJPCFFTlRJVFkgcG91bmQgICImIzE2MzsiPgorCTwhRU5USVRZIHllbiAgICAiJiMxNjU7Ij4KKwk8IUVOVElUWSBldXJvICAgIiYjODM2NDsiPgorXT4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCisJeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisJeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisJPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBlbmNvZGluZz0iSVNPLTg4NTktMSIKKwkJZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorCQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgLz4KKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvY2FzOnByb2R1Y3R0eXBlbWFwIj4KKworCQk8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisJCQk8aGVhZD4KKwkJCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCisJCQkJCWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgorCQkJCTx0aXRsZT5DQVMgT2JqZWN0czwvdGl0bGU+CisJCQk8L2hlYWQ+CisKKwkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudExpc3QiCisJCQkJc2VsZWN0PSJkb2N1bWVudCgnZWxlbWVudHMueG1sJykiIC8+CisKKwkJCTxib2R5PgorCQkJCTx0YWJsZSBib3JkZXI9IjAiIHN0eWxlPSJmb250LWZhbWlseTpTYW5zLVNlcmlmOyI+CisJCQkJCTx0ciBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZCI+CisJCQkJCQk8dGQ+T2JqZWN0PC90ZD4KKwkJCQkJCTx0ZD5EYXRhIEVsZW1lbnRzPC90ZD4KKwkJCQkJPC90cj4KKwkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InR5cGUiPgorCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KKwkJCQkJCQk8dGQgaGVpZ2h0PSI0MCIKKwkJCQkJCQkJc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I2RmZDM4OTsiPgorCQkJCQkJCQk8eHNsOnZhbHVlLW9mCisJCQkJCQkJCQlzZWxlY3Q9InN1YnN0cmluZyhAaWQsIDEwKSIgLz4KKwkJCQkJCQk8L3RkPgorCQkJCQkJCTx0ZCByb3dzcGFuPSIzIj4KKwkJCQkJCQkJPHRhYmxlCisJCQkJCQkJCQlzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojODg5OTg5O3RleHQtZGVjb3JhdGlvbjppdGFsaWM7Ij4KKwkJCQkJCQkJCTx4c2w6Y2hvb3NlPgorCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJlbGVtZW50Ij4KKwkJCQkJCQkJCQkJPHhzbDpmb3ItZWFjaAorCQkJCQkJCQkJCQkJc2VsZWN0PSJlbGVtZW50Ij4KKwkJCQkJCQkJCQkJCTx4c2w6dmFyaWFibGUKKwkJCQkJCQkJCQkJCQluYW1lPSJlbGVtSWQiIHNlbGVjdD0iQGlkIiAvPgorCQkJCQkJCQkJCQkJPHRyPgorCQkJCQkJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZgorCQkJCQkJCQkJCQkJCQkJc2VsZWN0PSJzdWJzdHJpbmcoQGlkLCAxMCkiIC8+CisJCQkJCQkJCQkJCQkJPC90ZD4KKwkJCQkJCQkJCQkJCQk8dGQKKwkJCQkJCQkJCQkJCQkJc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyI+CisJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YKKwkJCQkJCQkJCQkJCQkJCXNlbGVjdD0iJGVsZW1lbnRMaXN0L2NhczplbGVtZW50cy9lbGVtZW50W0BpZD0kZWxlbUlkXSIgLz4KKwkJCQkJCQkJCQkJCQk8L3RkPgorCQkJCQkJCQkJCQkJPC90cj4KKwkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CisJCQkJCQkJCQkJPC94c2w6d2hlbj4KKwkJCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJCQkJPHRyPgorCQkJCQkJCQkJCQkJPHRkIGNvbHNwYW49IjIiPgorCQkJCQkJCQkJCQkJCU5vIGRlY2xhcmVkCisJCQkJCQkJCQkJCQkJZWxlbWVudHM6IEFsbAorCQkJCQkJCQkJCQkJCWVsZW1lbnRzIGluaGVyaXRlZAorCQkJCQkJCQkJCQkJPC90ZD4KKwkJCQkJCQkJCQkJPC90cj4KKwkJCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CisJCQkJCQkJCQk8L3hzbDpjaG9vc2U+CisJCQkJCQkJCTwvdGFibGU+CisJCQkJCQkJPC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCQk8dHIgdmFsaWduPSJ0b3AiIGhlaWdodD0iNDAiPgorCQkJCQkJCTx0ZCBhbGlnbj0ibGVmdCIKKwkJCQkJCQkJc3R5bGU9ImZvbnQtc3R5bGU6aXRhbGljOyI+CisJCQkJCQkJCVBhcmVudDoKKwkJCQkJCQkJPHhzbDp2YWx1ZS1vZgorCQkJCQkJCQkJc2VsZWN0PSJzdWJzdHJpbmcoQHBhcmVudCwgMTApIiAvPgorCQkJCQkJCTwvdGQ+CisJCQkJCQk8L3RyPgorCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KKwkJCQkJCQk8dGQ+CisJCQkJCQkJCSZuYnNwOworCQkJCQkJCTwvdGQ+CisJCQkJCQk8L3RyPgorCQkJCQk8L3hzbDpmb3ItZWFjaD4KKwkJCQk8L3RhYmxlPgorCisJCQk8L2JvZHk+CisJCTwvaHRtbD4KKworCTwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvc2NoZW1hLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvc2NoZW1hLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmE2OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9zY2hlbWEueG1sCkBAIC0wLDAgKzEsMTAyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gIAorIFRoaXMgaXMgdGhlIFNvbHIgc2NoZW1hIGZpbGUuIFRoaXMgZmlsZSBzaG91bGQgYmUgbmFtZWQgInNjaGVtYS54bWwiIGFuZAorIHNob3VsZCBiZSBpbiB0aGUgY29uZiBkaXJlY3RvcnkgdW5kZXIgdGhlIHNvbHIgaG9tZQorIChpLmUuIC4vc29sci9jb25mL3NjaGVtYS54bWwgYnkgZGVmYXVsdCkgCisgb3IgbG9jYXRlZCB3aGVyZSB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoZSBTb2xyIHdlYmFwcCBjYW4gZmluZCBpdC4KKworIFRoaXMgZXhhbXBsZSBzY2hlbWEgaXMgdGhlIHJlY29tbWVuZGVkIHN0YXJ0aW5nIHBvaW50IGZvciB1c2Vycy4KKyBJdCBzaG91bGQgYmUga2VwdCBjb3JyZWN0IGFuZCBjb25jaXNlLCB1c2FibGUgb3V0LW9mLXRoZS1ib3guCisKKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgb24gaG93IHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUsIHBsZWFzZSBzZWUKKyBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU2NoZW1hWG1sCisKKyBQRVJGT1JNQU5DRSBOT1RFOiB0aGlzIHNjaGVtYSBpbmNsdWRlcyBtYW55IG9wdGlvbmFsIGZlYXR1cmVzIGFuZCBzaG91bGQgbm90CisgYmUgdXNlZCBmb3IgYmVuY2htYXJraW5nLiAgVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbmUgY291bGQKKyAgLSBzZXQgc3RvcmVkPSJmYWxzZSIgZm9yIGFsbCBmaWVsZHMgcG9zc2libGUgKGVzcCBsYXJnZSBmaWVsZHMpIHdoZW4geW91CisgICAgb25seSBuZWVkIHRvIHNlYXJjaCBvbiB0aGUgZmllbGQgYnV0IGRvbid0IG5lZWQgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbAorICAgIHZhbHVlLgorICAtIHNldCBpbmRleGVkPSJmYWxzZSIgaWYgeW91IGRvbid0IG5lZWQgdG8gc2VhcmNoIG9uIHRoZSBmaWVsZCwgYnV0IG9ubHkKKyAgICByZXR1cm4gdGhlIGZpZWxkIGFzIGEgcmVzdWx0IG9mIHNlYXJjaGluZyBvbiBvdGhlciBpbmRleGVkIGZpZWxkcy4KKyAgLSByZW1vdmUgYWxsIHVubmVlZGVkIGNvcHlGaWVsZCBzdGF0ZW1lbnRzCisgIC0gZm9yIGJlc3QgaW5kZXggc2l6ZSBhbmQgc2VhcmNoaW5nIHBlcmZvcm1hbmNlLCBzZXQgImluZGV4IiB0byBmYWxzZQorICAgIGZvciBhbGwgZ2VuZXJhbCB0ZXh0IGZpZWxkcywgdXNlIGNvcHlGaWVsZCB0byBjb3B5IHRoZW0gdG8gdGhlCisgICAgY2F0Y2hhbGwgInRleHQiIGZpZWxkLCBhbmQgdXNlIHRoYXQgZm9yIHNlYXJjaGluZy4KKyAgLSBGb3IgbWF4aW11bSBpbmRleGluZyBwZXJmb3JtYW5jZSwgdXNlIHRoZSBTdHJlYW1pbmdVcGRhdGVTb2xyU2VydmVyCisgICAgamF2YSBjbGllbnQuCisgIC0gUmVtZW1iZXIgdG8gcnVuIHRoZSBKVk0gaW4gc2VydmVyIG1vZGUsIGFuZCB1c2UgYSBoaWdoZXIgbG9nZ2luZyBsZXZlbAorICAgIHRoYXQgYXZvaWRzIGxvZ2dpbmcgZXZlcnkgcmVxdWVzdAorLS0+CisKKzxzY2hlbWEgbmFtZT0iRGVmYXVsdCBTb2xyIEZpbGUgTWFuYWdlciBzY2hlbWEiIHZlcnNpb249IjEuNSI+CisgIDwhLS0gYXR0cmlidXRlICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGlzIHNjaGVtYSBhbmQgaXMgb25seSB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICAgICAgIHZlcnNpb249IngueSIgaXMgU29scidzIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgc2NoZW1hIHN5bnRheCBhbmQgCisgICAgICAgc2VtYW50aWNzLiAgSXQgc2hvdWxkIG5vdCBub3JtYWxseSBiZSBjaGFuZ2VkIGJ5IGFwcGxpY2F0aW9ucy4KKworICAgICAgIDEuMDogbXVsdGlWYWx1ZWQgYXR0cmlidXRlIGRpZCBub3QgZXhpc3QsIGFsbCBmaWVsZHMgYXJlIG11bHRpVmFsdWVkIAorICAgICAgICAgICAgYnkgbmF0dXJlCisgICAgICAgMS4xOiBtdWx0aVZhbHVlZCBhdHRyaWJ1dGUgaW50cm9kdWNlZCwgZmFsc2UgYnkgZGVmYXVsdCAKKyAgICAgICAxLjI6IG9taXRUZXJtRnJlcUFuZFBvc2l0aW9ucyBhdHRyaWJ1dGUgaW50cm9kdWNlZCwgdHJ1ZSBieSBkZWZhdWx0IAorICAgICAgICAgICAgZXhjZXB0IGZvciB0ZXh0IGZpZWxkcy4KKyAgICAgICAxLjM6IHJlbW92ZWQgb3B0aW9uYWwgZmllbGQgY29tcHJlc3MgZmVhdHVyZQorICAgICAgIDEuNDogYXV0b0dlbmVyYXRlUGhyYXNlUXVlcmllcyBhdHRyaWJ1dGUgaW50cm9kdWNlZCB0byBkcml2ZSBRdWVyeVBhcnNlcgorICAgICAgICAgICAgYmVoYXZpb3Igd2hlbiBhIHNpbmdsZSBzdHJpbmcgcHJvZHVjZXMgbXVsdGlwbGUgdG9rZW5zLiAgRGVmYXVsdHMgCisgICAgICAgICAgICB0byBvZmYgZm9yIHZlcnNpb24gPj0gMS40CisgICAgICAgMS41OiBvbWl0Tm9ybXMgZGVmYXVsdHMgdG8gdHJ1ZSBmb3IgcHJpbWl0aXZlIGZpZWxkIHR5cGVzIAorICAgICAgICAgICAgKGludCwgZmxvYXQsIGJvb2xlYW4sIHN0cmluZy4uLikKKyAgICAgLS0+CisKKyA8ZmllbGRzPgorICAgPCEtLSBWYWxpZCBhdHRyaWJ1dGVzIGZvciBmaWVsZHM6CisgICAgIG5hbWU6IG1hbmRhdG9yeSAtIHRoZSBuYW1lIGZvciB0aGUgZmllbGQKKyAgICAgdHlwZTogbWFuZGF0b3J5IC0gdGhlIG5hbWUgb2YgYSBmaWVsZCB0eXBlIGZyb20gdGhlIAorICAgICAgIDx0eXBlcz4gZmllbGRUeXBlIHNlY3Rpb24KKyAgICAgaW5kZXhlZDogdHJ1ZSBpZiB0aGlzIGZpZWxkIHNob3VsZCBiZSBpbmRleGVkIChzZWFyY2hhYmxlIG9yIHNvcnRhYmxlKQorICAgICBzdG9yZWQ6IHRydWUgaWYgdGhpcyBmaWVsZCBzaG91bGQgYmUgcmV0cmlldmFibGUKKyAgICAgZG9jVmFsdWVzOiB0cnVlIGlmIHRoaXMgZmllbGQgc2hvdWxkIGhhdmUgZG9jIHZhbHVlcy4gRG9jIHZhbHVlcyBhcmUKKyAgICAgICB1c2VmdWwgZm9yIGZhY2V0aW5nLCBncm91cGluZywgc29ydGluZyBhbmQgZnVuY3Rpb24gcXVlcmllcy4gQWx0aG91Z2ggbm90CisgICAgICAgcmVxdWlyZWQsIGRvYyB2YWx1ZXMgd2lsbCBtYWtlIHRoZSBpbmRleCBmYXN0ZXIgdG8gbG9hZCwgbW9yZQorICAgICAgIE5SVC1mcmllbmRseSBhbmQgbW9yZSBtZW1vcnktZWZmaWNpZW50LiBUaGV5IGhvd2V2ZXIgY29tZSB3aXRoIHNvbWUKKyAgICAgICBsaW1pdGF0aW9uczogdGhleSBhcmUgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IFN0ckZpZWxkLCBVVUlERmllbGQKKyAgICAgICBhbmQgYWxsIFRyaWUqRmllbGRzLCBhbmQgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLCB0aGV5IG1pZ2h0CisgICAgICAgcmVxdWlyZSB0aGUgZmllbGQgdG8gYmUgc2luZ2xlLXZhbHVlZCwgYmUgcmVxdWlyZWQgb3IgaGF2ZSBhIGRlZmF1bHQKKyAgICAgICB2YWx1ZSAoY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpZWxkIHR5cGUgeW91J3JlIGludGVyZXN0ZWQgaW4KKyAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbikKKyAgICAgbXVsdGlWYWx1ZWQ6IHRydWUgaWYgdGhpcyBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSB2YWx1ZXMgcGVyIGRvY3VtZW50CisgICAgIG9taXROb3JtczogKGV4cGVydCkgc2V0IHRvIHRydWUgdG8gb21pdCB0aGUgbm9ybXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgdGhpcyBmaWVsZCAodGhpcyBkaXNhYmxlcyBsZW5ndGggbm9ybWFsaXphdGlvbiBhbmQgaW5kZXgtdGltZQorICAgICAgIGJvb3N0aW5nIGZvciB0aGUgZmllbGQsIGFuZCBzYXZlcyBzb21lIG1lbW9yeSkuICBPbmx5IGZ1bGwtdGV4dAorICAgICAgIGZpZWxkcyBvciBmaWVsZHMgdGhhdCBuZWVkIGFuIGluZGV4LXRpbWUgYm9vc3QgbmVlZCBub3Jtcy4KKyAgICAgICBOb3JtcyBhcmUgb21pdHRlZCBmb3IgcHJpbWl0aXZlIChub24tYW5hbHl6ZWQpIHR5cGVzIGJ5IGRlZmF1bHQuCisgICAgIHRlcm1WZWN0b3JzOiBbZmFsc2VdIHNldCB0byB0cnVlIHRvIHN0b3JlIHRoZSB0ZXJtIHZlY3RvciBmb3IgYQorICAgICAgIGdpdmVuIGZpZWxkLgorICAgICAgIFdoZW4gdXNpbmcgTW9yZUxpa2VUaGlzLCBmaWVsZHMgdXNlZCBmb3Igc2ltaWxhcml0eSBzaG91bGQgYmUKKyAgICAgICBzdG9yZWQgZm9yIGJlc3QgcGVyZm9ybWFuY2UuCisgICAgIHRlcm1Qb3NpdGlvbnM6IFN0b3JlIHBvc2l0aW9uIGluZm9ybWF0aW9uIHdpdGggdGhlIHRlcm0gdmVjdG9yLiAgCisgICAgICAgVGhpcyB3aWxsIGluY3JlYXNlIHN0b3JhZ2UgY29zdHMuCisgICAgIHRlcm1PZmZzZXRzOiBTdG9yZSBvZmZzZXQgaW5mb3JtYXRpb24gd2l0aCB0aGUgdGVybSB2ZWN0b3IuIFRoaXMgCisgICAgICAgd2lsbCBpbmNyZWFzZSBzdG9yYWdlIGNvc3RzLgorICAgICByZXF1aXJlZDogVGhlIGZpZWxkIGlzIHJlcXVpcmVkLiAgSXQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUKKyAgICAgICB2YWx1ZSBkb2VzIG5vdCBleGlzdAorICAgICBkZWZhdWx0OiBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkCisgICAgICAgd2hlbiBhZGRpbmcgYSBkb2N1bWVudC4KKyAgIC0tPgorCisgICA8IS0tIGZpZWxkIG5hbWVzIHNob3VsZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBvciB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgb25seSBhbmQKKyAgICAgIG5vdCBzdGFydCB3aXRoIGEgZGlnaXQuICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3RyaWN0bHkgZW5mb3JjZWQsCisgICAgICBidXQgb3RoZXIgZmllbGQgbmFtZXMgd2lsbCBub3QgaGF2ZSBmaXJzdCBjbGFzcyBzdXBwb3J0IGZyb20gYWxsIGNvbXBvbmVudHMKKyAgICAgIGFuZCBiYWNrIGNvbXBhdGliaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuICBOYW1lcyB3aXRoIGJvdGggbGVhZGluZyBhbmQKKyAgICAgIHRyYWlsaW5nIHVuZGVyc2NvcmVzIChlLmcuIF92ZXJzaW9uXykgYXJlIHJlc2VydmVkLgorICAgLS0+CisgICAgICAgIAorICAgICAKKyAgIDwhLS0gU29sciB1bmlxdWUgZG9jdW1lbnQgaWRlbnRpZmllciAtLT4KKyAgIDxmaWVsZCBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0iZmFsc2UiIC8+IAorCisgICA8IS0tIGNvcmUgQ0FTIHByb2R1Y3QgYXR0cmlidXRlcyAtLT4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdElkIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdE5hbWUiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Qcm9kdWN0VHlwZU5hbWUiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Qcm9kdWN0VHlwZUlkIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIgdHlwZT0iZGF0ZSIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdFN0cnVjdHVyZSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Qcm9kdWN0VHJhbnNmZXJTdGF0dXMiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKworICAgPGZpZWxkIG5hbWU9IkNBUy5Sb290UmVmZXJlbmNlT3JpZ2luYWwiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Sb290UmVmZXJlbmNlRGF0YXN0b3JlIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgcmVxdWlyZWQ9ImZhbHNlIiBtdWx0aVZhbHVlZD0idHJ1ZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUm9vdFJlZmVyZW5jZUZpbGVTaXplIiB0eXBlPSJsb25nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisgICA8ZmllbGQgbmFtZT0iQ0FTLlJvb3RSZWZlcmVuY2VNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisKKyAgIDxmaWVsZCBuYW1lPSJDQVMuUmVmZXJlbmNlT3JpZ2luYWwiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5SZWZlcmVuY2VEYXRhc3RvcmUiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5SZWZlcmVuY2VGaWxlU2l6ZSIgdHlwZT0ibG9uZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5SZWZlcmVuY2VNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisKKyAgIDwhLS0gYWxsIHVuc3BlY2lmaWVkIGZpZWxkcyBlbmRpbmcgaW4gJ0RhdGUnIG9yICdUaW1lJyBhcmUgaW50ZXJwcmV0ZWQgYXMgc2luZ2xlLXZhbHVlIGRhdGVzICAtLT4KKyAgIDxmaWVsZCBuYW1lPSIqRGF0ZSIgdHlwZT0iZGF0ZSIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSIqVGltZSIgdHlwZT0iZGF0ZSIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKworICAgPCEtLSBhbGwgb3RoZXIgZmllbGRzIGFyZSBpbmRleGVkIGFuZCBzdG9yZWQgYXMtaXMgYW5kIGNhbiBoYXZlIG11bHRpcGxlIHZhbHVlcyAtLT4KKyAgIDxkeW5hbWljRmllbGQgbmFtZT0iKiIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIG9taXROb3Jtcz0idHJ1ZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisKKyAgIDwhLS0gY2F0Y2gtYWxsIHRleHQgZmllbGRzIGZvciBmdWxsIGZyZWUtdGV4dCBxdWVyeSAtLT4KKyAgIDxjb3B5RmllbGQgc291cmNlPSIqIiBkZXN0PSJ0ZXh0IiAvPgorICAgPGNvcHlGaWVsZCBzb3VyY2U9IioiIGRlc3Q9InRleHRfcmV2IiAvPgorCisgICA8IS0tIE1haW4gYm9keSBvZiBkb2N1bWVudCBleHRyYWN0ZWQgYnkgU29sckNlbGwuCisgICAgICAgIE5PVEU6IFRoaXMgZmllbGQgaXMgbm90IGluZGV4ZWQgYnkgZGVmYXVsdCwgc2luY2UgaXQgaXMgYWxzbyBjb3BpZWQgdG8gInRleHQiCisgICAgICAgIHVzaW5nIGNvcHlGaWVsZCBiZWxvdy4gVGhpcyBpcyB0byBzYXZlIHNwYWNlLiBVc2UgdGhpcyBmaWVsZCBmb3IgcmV0dXJuaW5nIGFuZAorICAgICAgICBoaWdobGlnaHRpbmcgZG9jdW1lbnQgY29udGVudC4gVXNlIHRoZSAidGV4dCIgZmllbGQgdG8gc2VhcmNoIHRoZSBjb250ZW50LiAtLT4KKyAgIDxmaWVsZCBuYW1lPSJjb250ZW50IiB0eXBlPSJ0ZXh0X2dlbmVyYWwiIGluZGV4ZWQ9ImZhbHNlIiBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisKKyAgIDwhLS0gY2F0Y2hhbGwgZmllbGQsIGNvbnRhaW5pbmcgYWxsIG90aGVyIHNlYXJjaGFibGUgdGV4dCBmaWVsZHMgKGltcGxlbWVudGVkCisgICAgICAgIHZpYSBjb3B5RmllbGQgZnVydGhlciBvbiBpbiB0aGlzIHNjaGVtYSAgLS0+CisgICA8ZmllbGQgbmFtZT0idGV4dCIgdHlwZT0idGV4dF9nZW5lcmFsIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9ImZhbHNlIiBtdWx0aVZhbHVlZD0idHJ1ZSIvPgorCisgICA8IS0tIGNhdGNoYWxsIHRleHQgZmllbGQgdGhhdCBpbmRleGVzIHRva2VucyBib3RoIG5vcm1hbGx5IGFuZCBpbiByZXZlcnNlIGZvciBlZmZpY2llbnQKKyAgICAgICAgbGVhZGluZyB3aWxkY2FyZCBxdWVyaWVzLiAtLT4KKyAgIDxmaWVsZCBuYW1lPSJ0ZXh0X3JldiIgdHlwZT0idGV4dF9nZW5lcmFsX3JldiIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKworICAgPCEtLSBJTVBPUlRBTlQ6IG5lZWRlZCBieSBTb2xyIDQuWCBhbmQgYWJvdmUgLS0+CisgICA8ZmllbGQgbmFtZT0iX3ZlcnNpb25fIiB0eXBlPSJsb25nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKworICAgPCEtLSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBpZ25vcmUgYW55IGZpZWxkcyB0aGF0IGRvbid0IGFscmVhZHkgbWF0Y2ggYW4gZXhpc3RpbmcgCisgICAgICAgIGZpZWxkIG5hbWUgb3IgZHluYW1pYyBmaWVsZCwgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHRoZW0gYXMgYW4gZXJyb3IuIAorICAgICAgICBhbHRlcm5hdGVseSwgY2hhbmdlIHRoZSB0eXBlPSJpZ25vcmVkIiB0byBzb21lIG90aGVyIHR5cGUgZS5nLiAidGV4dCIgaWYgeW91IHdhbnQgCisgICAgICAgIHVua25vd24gZmllbGRzIGluZGV4ZWQgYW5kL29yIHN0b3JlZCBieSBkZWZhdWx0IC0tPiAKKyAgIDwhLS1keW5hbWljRmllbGQgbmFtZT0iKiIgdHlwZT0iaWdub3JlZCIgbXVsdGlWYWx1ZWQ9InRydWUiIC8tLT4KKyAgIAorIDwvZmllbGRzPgorCisKKyA8IS0tIEZpZWxkIHRvIHVzZSB0byBkZXRlcm1pbmUgYW5kIGVuZm9yY2UgZG9jdW1lbnQgdW5pcXVlbmVzcy4gCisgICAgICBVbmxlc3MgdGhpcyBmaWVsZCBpcyBtYXJrZWQgd2l0aCByZXF1aXJlZD0iZmFsc2UiLCBpdCB3aWxsIGJlIGEgcmVxdWlyZWQgZmllbGQKKyAgIC0tPgorIDx1bmlxdWVLZXk+aWQ8L3VuaXF1ZUtleT4KKworIDwhLS0gREVQUkVDQVRFRDogVGhlIGRlZmF1bHRTZWFyY2hGaWVsZCBpcyBjb25zdWx0ZWQgYnkgdmFyaW91cyBxdWVyeSBwYXJzZXJzIHdoZW4KKyAgcGFyc2luZyBhIHF1ZXJ5IHN0cmluZyB0aGF0IGlzbid0IGV4cGxpY2l0IGFib3V0IHRoZSBmaWVsZC4gIE1hY2hpbmUgKG5vbi11c2VyKQorICBnZW5lcmF0ZWQgcXVlcmllcyBhcmUgYmVzdCBtYWRlIGV4cGxpY2l0LCBvciB0aGV5IGNhbiB1c2UgdGhlICJkZiIgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMuCisgIE5vdGU6IFVuLWNvbW1lbnRpbmcgZGVmYXVsdFNlYXJjaEZpZWxkIHdpbGwgYmUgaW5zdWZmaWNpZW50IGlmIHlvdXIgcmVxdWVzdCBoYW5kbGVyCisgIGluIHNvbHJjb25maWcueG1sIGRlZmluZXMgImRmIiwgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZS4gVGhhdCB3b3VsZCBuZWVkIHRvIGJlIHJlbW92ZWQuCisgPGRlZmF1bHRTZWFyY2hGaWVsZD50ZXh0PC9kZWZhdWx0U2VhcmNoRmllbGQ+IC0tPgorCisgPCEtLSBERVBSRUNBVEVEOiBUaGUgZGVmYXVsdE9wZXJhdG9yIChBTkR8T1IpIGlzIGNvbnN1bHRlZCBieSB2YXJpb3VzIHF1ZXJ5IHBhcnNlcnMKKyAgd2hlbiBwYXJzaW5nIGEgcXVlcnkgc3RyaW5nIHRvIGRldGVybWluZSBpZiBhIGNsYXVzZSBvZiB0aGUgcXVlcnkgc2hvdWxkIGJlIG1hcmtlZCBhcworICByZXF1aXJlZCBvciBvcHRpb25hbCwgYXNzdW1pbmcgdGhlIGNsYXVzZSBpc24ndCBhbHJlYWR5IG1hcmtlZCBieSBzb21lIG9wZXJhdG9yLgorICBUaGUgZGVmYXVsdCBpcyBPUiwgd2hpY2ggaXMgZ2VuZXJhbGx5IGFzc3VtZWQgc28gaXQgaXMgbm90IGEgZ29vZCBpZGVhIHRvIGNoYW5nZSBpdAorICBnbG9iYWxseSBoZXJlLiAgVGhlICJxLm9wIiByZXF1ZXN0IHBhcmFtZXRlciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcy4KKyA8c29sclF1ZXJ5UGFyc2VyIGRlZmF1bHRPcGVyYXRvcj0iT1IiLz4gLS0+CisgCisgIDx0eXBlcz4KKyAgICA8IS0tIGZpZWxkIHR5cGUgZGVmaW5pdGlvbnMuIFRoZSAibmFtZSIgYXR0cmlidXRlIGlzCisgICAgICAganVzdCBhIGxhYmVsIHRvIGJlIHVzZWQgYnkgZmllbGQgZGVmaW5pdGlvbnMuICBUaGUgImNsYXNzIgorICAgICAgIGF0dHJpYnV0ZSBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lIHRoZSByZWFsCisgICAgICAgYmVoYXZpb3Igb2YgdGhlIGZpZWxkVHlwZS4KKyAgICAgICAgIENsYXNzIG5hbWVzIHN0YXJ0aW5nIHdpdGggInNvbHIiIHJlZmVyIHRvIGphdmEgY2xhc3NlcyBpbiBhCisgICAgICAgc3RhbmRhcmQgcGFja2FnZSBzdWNoIGFzIG9yZy5hcGFjaGUuc29sci5hbmFseXNpcworICAgIC0tPgorCisgICAgPCEtLSBUaGUgU3RyRmllbGQgdHlwZSBpcyBub3QgYW5hbHl6ZWQsIGJ1dCBpbmRleGVkL3N0b3JlZCB2ZXJiYXRpbS4KKyAgICAgICBJdCBzdXBwb3J0cyBkb2MgdmFsdWVzIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIGZpZWxkIG5lZWRzIHRvIGJlCisgICAgICAgc2luZ2xlLXZhbHVlZCBhbmQgZWl0aGVyIHJlcXVpcmVkIG9yIGhhdmUgYSBkZWZhdWx0IHZhbHVlLgorICAgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJzdHJpbmciIGNsYXNzPSJzb2xyLlN0ckZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiIC8+CisKKyAgICA8IS0tIGJvb2xlYW4gdHlwZTogInRydWUiIG9yICJmYWxzZSIgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJib29sZWFuIiBjbGFzcz0ic29sci5Cb29sRmllbGQiIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIvPgorCisgICAgPCEtLSBzb3J0TWlzc2luZ0xhc3QgYW5kIHNvcnRNaXNzaW5nRmlyc3QgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgYXR0cmlidXRlcyBhcmUKKyAgICAgICAgIGN1cnJlbnRseSBzdXBwb3J0ZWQgb24gdHlwZXMgdGhhdCBhcmUgc29ydGVkIGludGVybmFsbHkgYXMgc3RyaW5ncworICAgICAgICAgYW5kIG9uIG51bWVyaWMgdHlwZXMuCisJICAgICBUaGlzIGluY2x1ZGVzICJzdHJpbmciLCJib29sZWFuIiwgYW5kLCBhcyBvZiAzLjUgKGFuZCA0LngpLAorCSAgICAgaW50LCBmbG9hdCwgbG9uZywgZGF0ZSwgZG91YmxlLCBpbmNsdWRpbmcgdGhlICJUcmllIiB2YXJpYW50cy4KKyAgICAgICAtIElmIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIsIHRoZW4gYSBzb3J0IG9uIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBkb2N1bWVudHMKKyAgICAgICAgIHdpdGhvdXQgdGhlIGZpZWxkIHRvIGNvbWUgYWZ0ZXIgZG9jdW1lbnRzIHdpdGggdGhlIGZpZWxkLAorICAgICAgICAgcmVnYXJkbGVzcyBvZiB0aGUgcmVxdWVzdGVkIHNvcnQgb3JkZXIgKGFzYyBvciBkZXNjKS4KKyAgICAgICAtIElmIHNvcnRNaXNzaW5nRmlyc3Q9InRydWUiLCB0aGVuIGEgc29ydCBvbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgZG9jdW1lbnRzCisgICAgICAgICB3aXRob3V0IHRoZSBmaWVsZCB0byBjb21lIGJlZm9yZSBkb2N1bWVudHMgd2l0aCB0aGUgZmllbGQsCisgICAgICAgICByZWdhcmRsZXNzIG9mIHRoZSByZXF1ZXN0ZWQgc29ydCBvcmRlci4KKyAgICAgICAtIElmIHNvcnRNaXNzaW5nTGFzdD0iZmFsc2UiIGFuZCBzb3J0TWlzc2luZ0ZpcnN0PSJmYWxzZSIgKHRoZSBkZWZhdWx0KSwKKyAgICAgICAgIHRoZW4gZGVmYXVsdCBsdWNlbmUgc29ydGluZyB3aWxsIGJlIHVzZWQgd2hpY2ggcGxhY2VzIGRvY3Mgd2l0aG91dCB0aGUKKyAgICAgICAgIGZpZWxkIGZpcnN0IGluIGFuIGFzY2VuZGluZyBzb3J0IGFuZCBsYXN0IGluIGEgZGVzY2VuZGluZyBzb3J0LgorICAgIC0tPiAgICAKKworICAgIDwhLS0KKyAgICAgIERlZmF1bHQgbnVtZXJpYyBmaWVsZCB0eXBlcy4gRm9yIGZhc3RlciByYW5nZSBxdWVyaWVzLCBjb25zaWRlciB0aGUgdGludC90ZmxvYXQvdGxvbmcvdGRvdWJsZSB0eXBlcy4KKworICAgICAgVGhlc2UgZmllbGRzIHN1cHBvcnQgZG9jIHZhbHVlcywgYnV0IHRoZXkgcmVxdWlyZSB0aGUgZmllbGQgdG8gYmUKKyAgICAgIHNpbmdsZS12YWx1ZWQgYW5kIGVpdGhlciBiZSByZXF1aXJlZCBvciBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImludCIgY2xhc3M9InNvbHIuVHJpZUludEZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iZmxvYXQiIGNsYXNzPSJzb2xyLlRyaWVGbG9hdEZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0ibG9uZyIgY2xhc3M9InNvbHIuVHJpZUxvbmdGaWVsZCIgcHJlY2lzaW9uU3RlcD0iMCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImRvdWJsZSIgY2xhc3M9InNvbHIuVHJpZURvdWJsZUZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorCisgICAgPCEtLQorICAgICBOdW1lcmljIGZpZWxkIHR5cGVzIHRoYXQgaW5kZXggZWFjaCB2YWx1ZSBhdCB2YXJpb3VzIGxldmVscyBvZiBwcmVjaXNpb24KKyAgICAgdG8gYWNjZWxlcmF0ZSByYW5nZSBxdWVyaWVzIHdoZW4gdGhlIG51bWJlciBvZiB2YWx1ZXMgYmV0d2VlbiB0aGUgcmFuZ2UKKyAgICAgZW5kcG9pbnRzIGlzIGxhcmdlLiBTZWUgdGhlIGphdmFkb2MgZm9yIE51bWVyaWNSYW5nZVF1ZXJ5IGZvciBpbnRlcm5hbAorICAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisgICAgIFNtYWxsZXIgcHJlY2lzaW9uU3RlcCB2YWx1ZXMgKHNwZWNpZmllZCBpbiBiaXRzKSB3aWxsIGxlYWQgdG8gbW9yZSB0b2tlbnMKKyAgICAgaW5kZXhlZCBwZXIgdmFsdWUsIHNsaWdodGx5IGxhcmdlciBpbmRleCBzaXplLCBhbmQgZmFzdGVyIHJhbmdlIHF1ZXJpZXMuCisgICAgIEEgcHJlY2lzaW9uU3RlcCBvZiAwIGRpc2FibGVzIGluZGV4aW5nIGF0IGRpZmZlcmVudCBwcmVjaXNpb24gbGV2ZWxzLgorICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGludCIgY2xhc3M9InNvbHIuVHJpZUludEZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGZsb2F0IiBjbGFzcz0ic29sci5UcmllRmxvYXRGaWVsZCIgcHJlY2lzaW9uU3RlcD0iOCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGRvdWJsZSIgY2xhc3M9InNvbHIuVHJpZURvdWJsZUZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorCisgICAgPCEtLSBUaGUgZm9ybWF0IGZvciB0aGlzIGRhdGUgZmllbGQgaXMgb2YgdGhlIGZvcm0gMTk5NS0xMi0zMVQyMzo1OTo1OVosIGFuZAorICAgICAgICAgaXMgYSBtb3JlIHJlc3RyaWN0ZWQgZm9ybSBvZiB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVUaW1lCisgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUgICAgCisgICAgICAgICBUaGUgdHJhaWxpbmcgIloiIGRlc2lnbmF0ZXMgVVRDIHRpbWUgYW5kIGlzIG1hbmRhdG9yeS4KKyAgICAgICAgIE9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kcyBhcmUgYWxsb3dlZDogMTk5NS0xMi0zMVQyMzo1OTo1OS45OTlaCisgICAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyBhcmUgbWFuZGF0b3J5LgorCisgICAgICAgICBFeHByZXNzaW9ucyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlbm90ZSBjYWxjdWxhdGlvbnMgdGhhdCBzaG91bGQgYmUKKyAgICAgICAgIHBlcmZvcm1lZCByZWxhdGl2ZSB0byAiTk9XIiB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLCBpZS4uLgorCisgICAgICAgICAgICAgICBOT1cvSE9VUgorICAgICAgICAgICAgICAgICAgLi4uIFJvdW5kIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBob3VyCisgICAgICAgICAgICAgICBOT1ctMURBWQorICAgICAgICAgICAgICAgICAgLi4uIEV4YWN0bHkgMSBkYXkgcHJpb3IgdG8gbm93CisgICAgICAgICAgICAgICBOT1cvREFZKzZNT05USFMrM0RBWVMKKyAgICAgICAgICAgICAgICAgIC4uLiA2IG1vbnRocyBhbmQgMyBkYXlzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgc3RhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBkYXkKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIENvbnN1bHQgdGhlIERhdGVGaWVsZCBqYXZhZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAgICAgTm90ZTogRm9yIGZhc3RlciByYW5nZSBxdWVyaWVzLCBjb25zaWRlciB0aGUgdGRhdGUgdHlwZQorICAgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJkYXRlIiBjbGFzcz0ic29sci5UcmllRGF0ZUZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorCisgICAgPCEtLSBBIFRyaWUgYmFzZWQgZGF0ZSBmaWVsZCBmb3IgZmFzdGVyIGRhdGUgcmFuZ2UgcXVlcmllcyBhbmQgZGF0ZSBmYWNldGluZy4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZGF0ZSIgY2xhc3M9InNvbHIuVHJpZURhdGVGaWVsZCIgcHJlY2lzaW9uU3RlcD0iNiIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKworCisgICAgPCEtLUJpbmFyeSBkYXRhIHR5cGUuIFRoZSBkYXRhIHNob3VsZCBiZSBzZW50L3JldHJpZXZlZCBpbiBhcyBCYXNlNjQgZW5jb2RlZCBTdHJpbmdzIC0tPgorICAgIDxmaWVsZHR5cGUgbmFtZT0iYmluYXJ5IiBjbGFzcz0ic29sci5CaW5hcnlGaWVsZCIvPgorCisgICAgPCEtLQorICAgICAgTm90ZToKKyAgICAgIFRoZXNlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBpbmRleGVzIChjcmVhdGVkIHdpdGggbHVjZW5lIG9yIG9sZGVyIFNvbHIgdmVyc2lvbnMpLgorICAgICAgVXNlIFRyaWUgYmFzZWQgZmllbGRzIGluc3RlYWQuIEFzIG9mIFNvbHIgMy41IGFuZCA0LngsIFRyaWUgYmFzZWQgZmllbGRzIHN1cHBvcnQgc29ydE1pc3NpbmdGaXJzdC9MYXN0CisgICAgICAKKyAgICAgIFBsYWluIG51bWVyaWMgZmllbGQgdHlwZXMgdGhhdCBzdG9yZSBhbmQgaW5kZXggdGhlIHRleHQKKyAgICAgIHZhbHVlIHZlcmJhdGltIChhbmQgaGVuY2UgZG9uJ3QgY29ycmVjdGx5IHN1cHBvcnQgcmFuZ2UgcXVlcmllcywgc2luY2UgdGhlCisgICAgICBsZXhpY29ncmFwaGljIG9yZGVyaW5nIGlzbid0IGVxdWFsIHRvIHRoZSBudW1lcmljIG9yZGVyaW5nKQorICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icGludCIgY2xhc3M9InNvbHIuSW50RmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBsb25nIiBjbGFzcz0ic29sci5Mb25nRmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBmbG9hdCIgY2xhc3M9InNvbHIuRmxvYXRGaWVsZCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icGRvdWJsZSIgY2xhc3M9InNvbHIuRG91YmxlRmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBkYXRlIiBjbGFzcz0ic29sci5EYXRlRmllbGQiIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIvPgorCisgICAgPCEtLSBUaGUgIlJhbmRvbVNvcnRGaWVsZCIgaXMgbm90IHVzZWQgdG8gc3RvcmUgb3Igc2VhcmNoIGFueQorICAgICAgICAgZGF0YS4gIFlvdSBjYW4gZGVjbGFyZSBmaWVsZHMgb2YgdGhpcyB0eXBlIGl0IGluIHlvdXIgc2NoZW1hCisgICAgICAgICB0byBnZW5lcmF0ZSBwc2V1ZG8tcmFuZG9tIG9yZGVyaW5ncyBvZiB5b3VyIGRvY3MgZm9yIHNvcnRpbmcgCisgICAgICAgICBvciBmdW5jdGlvbiBwdXJwb3Nlcy4gIFRoZSBvcmRlcmluZyBpcyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGZpZWxkCisgICAgICAgICBuYW1lIGFuZCB0aGUgdmVyc2lvbiBvZiB0aGUgaW5kZXguIEFzIGxvbmcgYXMgdGhlIGluZGV4IHZlcnNpb24KKyAgICAgICAgIHJlbWFpbnMgdW5jaGFuZ2VkLCBhbmQgdGhlIHNhbWUgZmllbGQgbmFtZSBpcyByZXVzZWQsCisgICAgICAgICB0aGUgb3JkZXJpbmcgb2YgdGhlIGRvY3Mgd2lsbCBiZSBjb25zaXN0ZW50LiAgCisgICAgICAgICBJZiB5b3Ugd2FudCBkaWZmZXJlbnQgcHN1ZWRvLXJhbmRvbSBvcmRlcmluZ3Mgb2YgZG9jdW1lbnRzLAorICAgICAgICAgZm9yIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIGluZGV4LCB1c2UgYSBkeW5hbWljRmllbGQgYW5kCisgICAgICAgICBjaGFuZ2UgdGhlIGZpZWxkIG5hbWUgaW4gdGhlIHJlcXVlc3QuCisgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icmFuZG9tIiBjbGFzcz0ic29sci5SYW5kb21Tb3J0RmllbGQiIGluZGV4ZWQ9InRydWUiIC8+CisKKyAgICA8IS0tIHNvbHIuVGV4dEZpZWxkIGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBjdXN0b20gdGV4dCBhbmFseXplcnMKKyAgICAgICAgIHNwZWNpZmllZCBhcyBhIHRva2VuaXplciBhbmQgYSBsaXN0IG9mIHRva2VuIGZpbHRlcnMuIERpZmZlcmVudAorICAgICAgICAgYW5hbHl6ZXJzIG1heSBiZSBzcGVjaWZpZWQgZm9yIGluZGV4aW5nIGFuZCBxdWVyeWluZy4KKworICAgICAgICAgVGhlIG9wdGlvbmFsIHBvc2l0aW9uSW5jcmVtZW50R2FwIHB1dHMgc3BhY2UgYmV0d2VlbiBtdWx0aXBsZSBmaWVsZHMgb2YKKyAgICAgICAgIHRoaXMgdHlwZSBvbiB0aGUgc2FtZSBkb2N1bWVudCwgd2l0aCB0aGUgcHVycG9zZSBvZiBwcmV2ZW50aW5nIGZhbHNlIHBocmFzZQorICAgICAgICAgbWF0Y2hpbmcgYWNyb3NzIGZpZWxkcy4KKworICAgICAgICAgRm9yIG1vcmUgaW5mbyBvbiBjdXN0b21pemluZyB5b3VyIGFuYWx5emVyIGNoYWluLCBwbGVhc2Ugc2VlCisgICAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvQW5hbHl6ZXJzVG9rZW5pemVyc1Rva2VuRmlsdGVycworICAgICAtLT4KKworICAgIDwhLS0gT25lIGNhbiBhbHNvIHNwZWNpZnkgYW4gZXhpc3RpbmcgQW5hbHl6ZXIgY2xhc3MgdGhhdCBoYXMgYQorICAgICAgICAgZGVmYXVsdCBjb25zdHJ1Y3RvciB2aWEgdGhlIGNsYXNzIGF0dHJpYnV0ZSBvbiB0aGUgYW5hbHl6ZXIgZWxlbWVudC4KKyAgICAgICAgIEV4YW1wbGU6CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dyZWVrIiBjbGFzcz0ic29sci5UZXh0RmllbGQiPgorICAgICAgPGFuYWx5emVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5lbC5HcmVla0FuYWx5emVyIi8+CisgICAgPC9maWVsZFR5cGU+CisgICAgLS0+CisKKyAgICA8IS0tIEEgdGV4dCBmaWVsZCB0aGF0IG9ubHkgc3BsaXRzIG9uIHdoaXRlc3BhY2UgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIHdvcmRzIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF93cyIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gQSBnZW5lcmFsIHRleHQgZmllbGQgdGhhdCBoYXMgcmVhc29uYWJsZSwgZ2VuZXJpYworICAgICAgICAgY3Jvc3MtbGFuZ3VhZ2UgZGVmYXVsdHM6IGl0IHRva2VuaXplcyB3aXRoIFN0YW5kYXJkVG9rZW5pemVyLAorCSByZW1vdmVzIHN0b3Agd29yZHMgZnJvbSBjYXNlLWluc2Vuc2l0aXZlICJzdG9wd29yZHMudHh0IgorCSAoZW1wdHkgYnkgZGVmYXVsdCksIGFuZCBkb3duIGNhc2VzLiAgQXQgcXVlcnkgdGltZSBvbmx5LCBpdAorCSBhbHNvIGFwcGxpZXMgc3lub255bXMuIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9nZW5lcmFsIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9InN0b3B3b3Jkcy50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIgLz4KKyAgICAgICAgPCEtLSBpbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgb25seSB1c2Ugc3lub255bXMgYXQgcXVlcnkgdGltZQorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0iaW5kZXhfc3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9ImZhbHNlIi8+CisgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0icXVlcnkiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ic3RvcHdvcmRzLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBBIHRleHQgZmllbGQgd2l0aCBkZWZhdWx0cyBhcHByb3ByaWF0ZSBmb3IgRW5nbGlzaDogaXQKKyAgICAgICAgIHRva2VuaXplcyB3aXRoIFN0YW5kYXJkVG9rZW5pemVyLCByZW1vdmVzIEVuZ2xpc2ggc3RvcCB3b3JkcworICAgICAgICAgKGxhbmcvc3RvcHdvcmRzX2VuLnR4dCksIGRvd24gY2FzZXMsIHByb3RlY3RzIHdvcmRzIGZyb20gcHJvdHdvcmRzLnR4dCwgYW5kCisgICAgICAgICBmaW5hbGx5IGFwcGxpZXMgUG9ydGVyJ3Mgc3RlbW1pbmcuICBUaGUgcXVlcnkgdGltZSBhbmFseXplcgorICAgICAgICAgYWxzbyBhcHBsaWVzIHN5bm9ueW1zIGZyb20gc3lub255bXMudHh0LiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZW4iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGluIHRoaXMgZXhhbXBsZSwgd2Ugd2lsbCBvbmx5IHVzZSBzeW5vbnltcyBhdCBxdWVyeSB0aW1lCisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJpbmRleF9zeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0iZmFsc2UiLz4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0gQ2FzZSBpbnNlbnNpdGl2ZSBzdG9wIHdvcmQgcmVtb3ZhbC4KKyAgICAgICAgICBhZGQgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPXRydWUgaW4gYm90aCB0aGUgaW5kZXggYW5kIHF1ZXJ5CisgICAgICAgICAgYW5hbHl6ZXJzIHRvIGxlYXZlIGEgJ2dhcCcgZm9yIG1vcmUgYWNjdXJhdGUgcGhyYXNlIHF1ZXJpZXMuCisgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U9InRydWUiCisgICAgICAgICAgICAgICAgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIKKyAgICAgICAgICAgICAgICBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisJPGZpbHRlciBjbGFzcz0ic29sci5FbmdsaXNoUG9zc2Vzc2l2ZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisJPCEtLSBPcHRpb25hbGx5IHlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBsZXNzIGFnZ3Jlc3NpdmUgc3RlbW1lciBpbnN0ZWFkIG9mIFBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5OgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKwktLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0ZXJTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJzeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U9InRydWUiCisgICAgICAgICAgICAgICAgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIKKyAgICAgICAgICAgICAgICBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisJPGZpbHRlciBjbGFzcz0ic29sci5FbmdsaXNoUG9zc2Vzc2l2ZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisJPCEtLSBPcHRpb25hbGx5IHlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBsZXNzIGFnZ3Jlc3NpdmUgc3RlbW1lciBpbnN0ZWFkIG9mIFBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5OgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKwktLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0ZXJTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gQSB0ZXh0IGZpZWxkIHdpdGggZGVmYXVsdHMgYXBwcm9wcmlhdGUgZm9yIEVuZ2xpc2gsIHBsdXMKKwkgYWdncmVzc2l2ZSB3b3JkLXNwbGl0dGluZyBhbmQgYXV0b3BocmFzZSBmZWF0dXJlcyBlbmFibGVkLgorCSBUaGlzIGZpZWxkIGlzIGp1c3QgbGlrZSB0ZXh0X2VuLCBleGNlcHQgaXQgYWRkcworCSBXb3JkRGVsaW1pdGVyRmlsdGVyIHRvIGVuYWJsZSBzcGxpdHRpbmcgYW5kIG1hdGNoaW5nIG9mCisJIHdvcmRzIG9uIGNhc2UtY2hhbmdlLCBhbHBoYSBudW1lcmljIGJvdW5kYXJpZXMsIGFuZAorCSBub24tYWxwaGFudW1lcmljIGNoYXJzLiAgVGhpcyBtZWFucyBjZXJ0YWluIGNvbXBvdW5kIHdvcmQKKwkgY2FzZXMgd2lsbCB3b3JrLCBmb3IgZXhhbXBsZSBxdWVyeSAid2kgZmkiIHdpbGwgbWF0Y2gKKwkgZG9jdW1lbnQgIldpRmkiIG9yICJ3aS1maSIuCisgICAgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9lbl9zcGxpdHRpbmciIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCIgYXV0b0dlbmVyYXRlUGhyYXNlUXVlcmllcz0idHJ1ZSI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gaW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIG9ubHkgdXNlIHN5bm9ueW1zIGF0IHF1ZXJ5IHRpbWUKKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TeW5vbnltRmlsdGVyRmFjdG9yeSIgc3lub255bXM9ImluZGV4X3N5bm9ueW1zLnR4dCIgaWdub3JlQ2FzZT0idHJ1ZSIgZXhwYW5kPSJmYWxzZSIvPgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBDYXNlIGluc2Vuc2l0aXZlIHN0b3Agd29yZCByZW1vdmFsLgorICAgICAgICAgIGFkZCBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9dHJ1ZSBpbiBib3RoIHRoZSBpbmRleCBhbmQgcXVlcnkKKyAgICAgICAgICBhbmFseXplcnMgdG8gbGVhdmUgYSAnZ2FwJyBmb3IgbW9yZSBhY2N1cmF0ZSBwaHJhc2UgcXVlcmllcy4KKyAgICAgICAgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiCisgICAgICAgICAgICAgICAgaWdub3JlQ2FzZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZW4udHh0IgorICAgICAgICAgICAgICAgIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLldvcmREZWxpbWl0ZXJGaWx0ZXJGYWN0b3J5IiBnZW5lcmF0ZVdvcmRQYXJ0cz0iMSIgZ2VuZXJhdGVOdW1iZXJQYXJ0cz0iMSIgY2F0ZW5hdGVXb3Jkcz0iMSIgY2F0ZW5hdGVOdW1iZXJzPSIxIiBjYXRlbmF0ZUFsbD0iMCIgc3BsaXRPbkNhc2VDaGFuZ2U9IjEiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuS2V5d29yZE1hcmtlckZpbHRlckZhY3RvcnkiIHByb3RlY3RlZD0icHJvdHdvcmRzLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgICAgPGFuYWx5emVyIHR5cGU9InF1ZXJ5Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBpZ25vcmVDYXNlPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19lbi50eHQiCisgICAgICAgICAgICAgICAgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuV29yZERlbGltaXRlckZpbHRlckZhY3RvcnkiIGdlbmVyYXRlV29yZFBhcnRzPSIxIiBnZW5lcmF0ZU51bWJlclBhcnRzPSIxIiBjYXRlbmF0ZVdvcmRzPSIwIiBjYXRlbmF0ZU51bWJlcnM9IjAiIGNhdGVuYXRlQWxsPSIwIiBzcGxpdE9uQ2FzZUNoYW5nZT0iMSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuUG9ydGVyU3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIExlc3MgZmxleGlibGUgbWF0Y2hpbmcsIGJ1dCBsZXNzIGZhbHNlIG1hdGNoZXMuICBQcm9iYWJseSBub3QgaWRlYWwgZm9yIHByb2R1Y3QgbmFtZXMsCisgICAgICAgICBidXQgbWF5IGJlIGdvb2QgZm9yIFNLVXMuICBDYW4gaW5zZXJ0IGRhc2hlcyBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHN0aWxsIG1hdGNoLiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZW5fc3BsaXR0aW5nX3RpZ2h0IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiIGF1dG9HZW5lcmF0ZVBocmFzZVF1ZXJpZXM9InRydWUiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJzeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0iZmFsc2UiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLldvcmREZWxpbWl0ZXJGaWx0ZXJGYWN0b3J5IiBnZW5lcmF0ZVdvcmRQYXJ0cz0iMCIgZ2VuZXJhdGVOdW1iZXJQYXJ0cz0iMCIgY2F0ZW5hdGVXb3Jkcz0iMSIgY2F0ZW5hdGVOdW1iZXJzPSIxIiBjYXRlbmF0ZUFsbD0iMCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRW5nbGlzaE1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIHRoaXMgZmlsdGVyIGNhbiByZW1vdmUgYW55IGR1cGxpY2F0ZSB0b2tlbnMgdGhhdCBhcHBlYXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gLSBzb21ldGltZXMKKyAgICAgICAgICAgICBwb3NzaWJsZSB3aXRoIFdvcmREZWxpbWl0ZXJGaWx0ZXIgaW4gY29uanVuY3RvbiB3aXRoIHN0ZW1taW5nLiAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5SZW1vdmVEdXBsaWNhdGVzVG9rZW5GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBKdXN0IGxpa2UgdGV4dF9nZW5lcmFsIGV4Y2VwdCBpdCByZXZlcnNlcyB0aGUgY2hhcmFjdGVycyBvZgorCSBlYWNoIHRva2VuLCB0byBlbmFibGUgbW9yZSBlZmZpY2llbnQgbGVhZGluZyB3aWxkY2FyZCBxdWVyaWVzLiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZ2VuZXJhbF9yZXYiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ic3RvcHdvcmRzLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5SZXZlcnNlZFdpbGRjYXJkRmlsdGVyRmFjdG9yeSIgd2l0aE9yaWdpbmFsPSJ0cnVlIgorICAgICAgICAgICBtYXhQb3NBc3Rlcmlzaz0iMyIgbWF4UG9zUXVlc3Rpb249IjIiIG1heEZyYWN0aW9uQXN0ZXJpc2s9IjAuMzMiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0icXVlcnkiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9InN0b3B3b3Jkcy50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBjaGFyRmlsdGVyICsgV2hpdGVzcGFjZVRva2VuaXplciAgLS0+CisgICAgPCEtLQorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9jaGFyX25vcm0iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCIgPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8Y2hhckZpbHRlciBjbGFzcz0ic29sci5NYXBwaW5nQ2hhckZpbHRlckZhY3RvcnkiIG1hcHBpbmc9Im1hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dCIvPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIC0tPgorCisgICAgPCEtLSBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIEtleXdvcmRUb2tlbml6ZXIgYWxvbmcKKyAgICAgICAgIFdpdGggdmFyaW91cyBUb2tlbkZpbHRlckZhY3RvcmllcyB0byBwcm9kdWNlIGEgc29ydGFibGUgZmllbGQKKyAgICAgICAgIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBzb21lIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSB0ZXh0CisgICAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImFscGhhT25seVNvcnQiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgc29ydE1pc3NpbmdMYXN0PSJ0cnVlIiBvbWl0Tm9ybXM9InRydWUiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8IS0tIEtleXdvcmRUb2tlbml6ZXIgZG9lcyBubyBhY3R1YWwgdG9rZW5pemluZywgc28gdGhlIGVudGlyZQorICAgICAgICAgICAgIGlucHV0IHN0cmluZyBpcyBwcmVzZXJ2ZWQgYXMgYSBzaW5nbGUgdG9rZW4KKyAgICAgICAgICAtLT4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIFRoZSBMb3dlckNhc2UgVG9rZW5GaWx0ZXIgZG9lcyB3aGF0IHlvdSBleHBlY3QsIHdoaWNoIGNhbiBiZQorICAgICAgICAgICAgIHdoZW4geW91IHdhbnQgeW91ciBzb3J0aW5nIHRvIGJlIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgICAgICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5IiAvPgorICAgICAgICA8IS0tIFRoZSBUcmltRmlsdGVyIHJlbW92ZXMgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5UcmltRmlsdGVyRmFjdG9yeSIgLz4KKyAgICAgICAgPCEtLSBUaGUgUGF0dGVyblJlcGxhY2VGaWx0ZXIgZ2l2ZXMgeW91IHRoZSBmbGV4aWJpbGl0eSB0byB1c2UKKyAgICAgICAgICAgICBKYXZhIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byByZXBsYWNlIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgbWF0Y2hpbmcgYSBwYXR0ZXJuIHdpdGggYW4gYXJiaXRyYXJ5IHJlcGxhY2VtZW50IHN0cmluZywgCisgICAgICAgICAgICAgd2hpY2ggbWF5IGluY2x1ZGUgYmFjayByZWZlcmVuY2VzIHRvIHBvcnRpb25zIG9mIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuLgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIFNlZSB0aGUgSmF2YSBSZWd1bGFyIEV4cHJlc3Npb24gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQorICAgICAgICAgICAgIGluZm9ybWF0aW9uIG9uIHBhdHRlcm4gYW5kIHJlcGxhY2VtZW50IHN0cmluZyBzeW50YXguCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNi4wL2RvY3MvYXBpL2phdmEvdXRpbC9yZWdleC9wYWNrYWdlLXN1bW1hcnkuaHRtbAorICAgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBhdHRlcm5SZXBsYWNlRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBwYXR0ZXJuPSIoW15hLXpdKSIgcmVwbGFjZW1lbnQ9IiIgcmVwbGFjZT0iYWxsIgorICAgICAgICAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8ZmllbGR0eXBlIG5hbWU9InBob25ldGljIiBzdG9yZWQ9ImZhbHNlIiBpbmRleGVkPSJ0cnVlIiBjbGFzcz0ic29sci5UZXh0RmllbGQiID4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Eb3VibGVNZXRhcGhvbmVGaWx0ZXJGYWN0b3J5IiBpbmplY3Q9ImZhbHNlIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGR0eXBlPgorCisgICAgPGZpZWxkdHlwZSBuYW1lPSJwYXlsb2FkcyIgc3RvcmVkPSJmYWxzZSIgaW5kZXhlZD0idHJ1ZSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiA+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuV2hpdGVzcGFjZVRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLQorICAgICAgICBUaGUgRGVsaW1pdGVkUGF5bG9hZFRva2VuRmlsdGVyIGNhbiBwdXQgcGF5bG9hZHMgb24gdG9rZW5zLi4uIGZvciBleGFtcGxlLAorICAgICAgICBhIHRva2VuIG9mICJmb298MS40IiAgd291bGQgYmUgaW5kZXhlZCBhcyAiZm9vIiB3aXRoIGEgcGF5bG9hZCBvZiAxLjRmCisgICAgICAgIEF0dHJpYnV0ZXMgb2YgdGhlIERlbGltaXRlZFBheWxvYWRUb2tlbkZpbHRlckZhY3RvcnkgOiAKKyAgICAgICAgICJkZWxpbWl0ZXIiIC0gYSBvbmUgY2hhcmFjdGVyIGRlbGltaXRlci4gRGVmYXVsdCBpcyB8IChwaXBlKQorCSAiZW5jb2RlciIgLSBob3cgdG8gZW5jb2RlIHRoZSBmb2xsb3dpbmcgdmFsdWUgaW50byBhIHBsYXlsb2FkCisJICAgIGZsb2F0IC0+IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnBheWxvYWRzLkZsb2F0RW5jb2RlciwKKwkgICAgaW50ZWdlciAtPiBvLmEubC5hLnAuSW50ZWdlckVuY29kZXIKKwkgICAgaWRlbnRpdHkgLT4gby5hLmwuYS5wLklkZW50aXR5RW5jb2RlcgorICAgICAgICAgICAgRnVsbHkgUXVhbGlmaWVkIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIFBheWxvYWRFbmNvZGVyLCBFbmNvZGVyIG11c3QgaGF2ZSBhIG5vIGFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkRlbGltaXRlZFBheWxvYWRUb2tlbkZpbHRlckZhY3RvcnkiIGVuY29kZXI9ImZsb2F0Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGR0eXBlPgorCisgICAgPCEtLSBsb3dlcmNhc2VzIHRoZSBlbnRpcmUgZmllbGQgdmFsdWUsIGtlZXBpbmcgaXQgYXMgYSBzaW5nbGUgdG9rZW4uICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9Imxvd2VyY2FzZSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiIC8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSAKKyAgICAgIEV4YW1wbGUgb2YgdXNpbmcgUGF0aEhpZXJhcmNoeVRva2VuaXplckZhY3RvcnkgYXQgaW5kZXggdGltZSwgc28KKyAgICAgIHF1ZXJpZXMgZm9yIHBhdGhzIG1hdGNoIGRvY3VtZW50cyBhdCB0aGF0IHBhdGgsIG9yIGluIGRlc2NlbmRlbnQgcGF0aHMKKyAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImRlc2NlbmRlbnRfcGF0aCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJpbmRleCI+CisJPHRva2VuaXplciBjbGFzcz0ic29sci5QYXRoSGllcmFyY2h5VG9rZW5pemVyRmFjdG9yeSIgZGVsaW1pdGVyPSIvIiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisJPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgPCEtLSAKKyAgICAgIEV4YW1wbGUgb2YgdXNpbmcgUGF0aEhpZXJhcmNoeVRva2VuaXplckZhY3RvcnkgYXQgcXVlcnkgdGltZSwgc28KKyAgICAgIHF1ZXJpZXMgZm9yIHBhdGhzIG1hdGNoIGRvY3VtZW50cyBhdCB0aGF0IHBhdGgsIG9yIGluIGFuY2VzdG9yIHBhdGhzCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJhbmNlc3Rvcl9wYXRoIiBjbGFzcz0ic29sci5UZXh0RmllbGQiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKwk8dG9rZW5pemVyIGNsYXNzPSJzb2xyLktleXdvcmRUb2tlbml6ZXJGYWN0b3J5IiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisJPHRva2VuaXplciBjbGFzcz0ic29sci5QYXRoSGllcmFyY2h5VG9rZW5pemVyRmFjdG9yeSIgZGVsaW1pdGVyPSIvIiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gc2luY2UgZmllbGRzIG9mIHRoaXMgdHlwZSBhcmUgYnkgZGVmYXVsdCBub3Qgc3RvcmVkIG9yIGluZGV4ZWQsCisgICAgICAgICBhbnkgZGF0YSBhZGRlZCB0byB0aGVtIHdpbGwgYmUgaWdub3JlZCBvdXRyaWdodC4gIC0tPiAKKyAgICA8ZmllbGR0eXBlIG5hbWU9Imlnbm9yZWQiIHN0b3JlZD0iZmFsc2UiIGluZGV4ZWQ9ImZhbHNlIiBtdWx0aVZhbHVlZD0idHJ1ZSIgY2xhc3M9InNvbHIuU3RyRmllbGQiIC8+CisKKyAgICA8IS0tIFRoaXMgcG9pbnQgdHlwZSBpbmRleGVzIHRoZSBjb29yZGluYXRlcyBhcyBzZXBhcmF0ZSBmaWVsZHMgKHN1YkZpZWxkcykKKyAgICAgIElmIHN1YkZpZWxkVHlwZSBpcyBkZWZpbmVkLCBpdCByZWZlcmVuY2VzIGEgdHlwZSwgYW5kIGEgZHluYW1pYyBmaWVsZAorICAgICAgZGVmaW5pdGlvbiBpcyBjcmVhdGVkIG1hdGNoaW5nICpfX188dHlwZW5hbWU+LiAgQWx0ZXJuYXRlbHksIGlmIAorICAgICAgc3ViRmllbGRTdWZmaXggaXMgZGVmaW5lZCwgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgc3ViRmllbGRzLgorICAgICAgRXhhbXBsZTogaWYgc3ViRmllbGRUeXBlPSJkb3VibGUiLCB0aGVuIHRoZSBjb29yZGluYXRlcyB3b3VsZCBiZQorICAgICAgICBpbmRleGVkIGluIGZpZWxkcyBteWxvY18wX19fZG91YmxlLG15bG9jXzFfX19kb3VibGUuCisgICAgICBFeGFtcGxlOiBpZiBzdWJGaWVsZFN1ZmZpeD0iX2QiIHRoZW4gdGhlIGNvb3JkaW5hdGVzIHdvdWxkIGJlIGluZGV4ZWQKKyAgICAgICAgaW4gZmllbGRzIG15bG9jXzBfZCxteWxvY18xX2QKKyAgICAgIFRoZSBzdWJGaWVsZHMgYXJlIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGUgZmllbGRUeXBlLCBhbmQgZW5kCisgICAgICB1c2VycyBub3JtYWxseSBzaG91bGQgbm90IG5lZWQgdG8ga25vdyBhYm91dCB0aGVtLgorICAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBvaW50IiBjbGFzcz0ic29sci5Qb2ludFR5cGUiIGRpbWVuc2lvbj0iMiIgc3ViRmllbGRTdWZmaXg9Il9kIi8+CisKKyAgICA8IS0tIEEgc3BlY2lhbGl6ZWQgZmllbGQgZm9yIGdlb3NwYXRpYWwgc2VhcmNoLiBJZiBpbmRleGVkLCB0aGlzIGZpZWxkVHlwZSBtdXN0IG5vdCBiZSBtdWx0aXZhbHVlZC4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb2NhdGlvbiIgY2xhc3M9InNvbHIuTGF0TG9uVHlwZSIgc3ViRmllbGRTdWZmaXg9Il9jb29yZGluYXRlIi8+CisKKyAgICA8IS0tIEFuIGFsdGVybmF0aXZlIGdlb3NwYXRpYWwgZmllbGQgdHlwZSBuZXcgdG8gU29sciA0LiAgSXQgc3VwcG9ydHMgbXVsdGlWYWx1ZWQgYW5kIHBvbHlnb24gc2hhcGVzLgorICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhbmQgb3RoZXIgU3BhdGlhbCBmaWVsZHMgbmV3IHRvIFNvbHIgNCwgc2VlOgorICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NvbHJBZGFwdGVyc0Zvckx1Y2VuZVNwYXRpYWw0CisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb2NhdGlvbl9ycHQiIGNsYXNzPSJzb2xyLlNwYXRpYWxSZWN1cnNpdmVQcmVmaXhUcmVlRmllbGRUeXBlIgorICAgICAgICBnZW89InRydWUiIGRpc3RFcnJQY3Q9IjAuMDI1IiBtYXhEaXN0RXJyPSIwLjAwMDAwOSIgdW5pdHM9ImRlZ3JlZXMiIC8+CisKKyAgIDwhLS0gTW9uZXkvY3VycmVuY3kgZmllbGQgdHlwZS4gU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Nb25leUZpZWxkVHlwZQorICAgICAgICBQYXJhbWV0ZXJzOgorICAgICAgICAgIGRlZmF1bHRDdXJyZW5jeTogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGN1cnJlbmN5IGlmIG5vbmUgc3BlY2lmaWVkLiBEZWZhdWx0cyB0byAiVVNEIgorICAgICAgICAgIHByZWNpc2lvblN0ZXA6ICAgU3BlY2lmaWVzIHRoZSBwcmVjaXNpb25TdGVwIGZvciB0aGUgVHJpZUxvbmcgZmllbGQgdXNlZCBmb3IgdGhlIGFtb3VudAorICAgICAgICAgIHByb3ZpZGVyQ2xhc3M6ICAgTGV0cyB5b3UgcGx1ZyBpbiBvdGhlciBleGNoYW5nZSBwcm92aWRlciBiYWNrZW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc29sci5GaWxlRXhjaGFuZ2VSYXRlUHJvdmlkZXIgaXMgdGhlIGRlZmF1bHQgYW5kIHRha2VzIG9uZSBwYXJhbWV0ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29uZmlnOiBuYW1lIG9mIGFuIHhtbCBmaWxlIGhvbGRpbmcgZXhjaGFuZ2UgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbHIuT3BlbkV4Y2hhbmdlUmF0ZXNPcmdQcm92aWRlciB1c2VzIHJhdGVzIGZyb20gb3BlbmV4Y2hhbmdlcmF0ZXMub3JnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc0ZpbGVMb2NhdGlvbjogVVJMIG9yIHBhdGggdG8gcmF0ZXMgSlNPTiBmaWxlIChkZWZhdWx0IGxhdGVzdC5qc29uIG9uIHRoZSB3ZWIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hJbnRlcnZhbDogTnVtYmVyIG9mIG1pbnV0ZXMgYmV0d2VlbiBlYWNoIHJhdGVzIGZldGNoIChkZWZhdWx0OiAxNDQwLCBtaW46IDYwKQorICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJjdXJyZW5jeSIgY2xhc3M9InNvbHIuQ3VycmVuY3lGaWVsZCIgcHJlY2lzaW9uU3RlcD0iOCIgZGVmYXVsdEN1cnJlbmN5PSJVU0QiIGN1cnJlbmN5Q29uZmlnPSJjdXJyZW5jeS54bWwiIC8+CisgICAgICAgICAgICAgCisKKworICAgPCEtLSBzb21lIGV4YW1wbGVzIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzIChnZW5lcmFsbHkgb3JkZXJlZCBieSBJU08gY29kZSkgLS0+CisKKyAgICA8IS0tIEFyYWJpYyAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfYXIiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGZvciBhbnkgbm9uLWFyYWJpYyAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19hci50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZXMg77uvIHRvIO+7sSwgZXRjIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkFyYWJpY05vcm1hbGl6YXRpb25GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuQXJhYmljU3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIEJ1bGdhcmlhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfYmciIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPiAKKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19iZy50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkJ1bGdhcmlhblN0ZW1GaWx0ZXJGYWN0b3J5Ii8+ICAgICAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIENhdGFsYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2NhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGwnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19jYS50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19jYS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkNhdGFsYW4iLz4gICAgICAgCisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gQ0pLIGJpZ3JhbSAoc2VlIHRleHRfamEgZm9yIGEgSmFwYW5lc2UgY29uZmlndXJhdGlvbiB1c2luZyBtb3JwaG9sb2dpY2FsIGFuYWx5c2lzKSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfY2prIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZSB3aWR0aCBiZWZvcmUgYmlncmFtLCBhcyBlLmcuIGhhbGYtd2lkdGggZGFrdXRlbiBjb21iaW5lICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DSktXaWR0aEZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBmb3IgYW55IG5vbi1DSksgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkNKS0JpZ3JhbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIEN6ZWNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9jeiIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfY3oudHh0IiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DemVjaFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+ICAgICAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIERhbmlzaCAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZGEiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2RhLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iRGFuaXNoIi8+ICAgICAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEdlcm1hbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZGUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2RlLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR2VybWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5HZXJtYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLkdlcm1hbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgICAgPCEtLSBtb3JlIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iR2VybWFuMiIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBHcmVlayAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZWwiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGdyZWVrIHNwZWNpZmljIGxvd2VyY2FzZSBmb3Igc2lnbWEgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR3JlZWtMb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9ImZhbHNlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZWwudHh0IiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5HcmVla1N0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gU3BhbmlzaCAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZXMiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VzLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3BhbmlzaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBtb3JlIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iU3BhbmlzaCIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBCYXNxdWUgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2V1IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19ldS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkJhc3F1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFBlcnNpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2ZhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8IS0tIGZvciBaV05KIC0tPgorICAgICAgICA8Y2hhckZpbHRlciBjbGFzcz0ic29sci5QZXJzaWFuQ2hhckZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuQXJhYmljTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5QZXJzaWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2ZhLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gRmlubmlzaCAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZmkiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2ZpLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iRmlubmlzaCIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5GaW5uaXNoTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBGcmVuY2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2ZyIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGwnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19mci50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19mci50eHQiIGZvcm1hdD0ic25vd2JhbGwiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkZyZW5jaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBsZXNzIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuRnJlbmNoTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgICA8IS0tIG1vcmUgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJGcmVuY2giLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSXJpc2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGQnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19nYS50eHQiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIG4tLCBldGMuIHBvc2l0aW9uIGluY3JlbWVudHMgaXMgaW50ZW50aW9uYWxseSBmYWxzZSEgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL2h5cGhlbmF0aW9uc19nYS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0iZmFsc2UiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5JcmlzaExvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2dhLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iSXJpc2giLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBHYWxpY2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZ2wiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2dsLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR2FsaWNpYW5TdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5HYWxpY2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBIaW5kaSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaGkiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBub3JtYWxpemVzIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSW5kaWNOb3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZXMgdmFyaWF0aW9uIGluIHNwZWxsaW5nIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkhpbmRpTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2hpLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSGluZGlTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEh1bmdhcmlhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaHUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2h1LnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iSHVuZ2FyaWFuIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLkh1bmdhcmlhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+ICAgCisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gQXJtZW5pYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2h5IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19oeS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkFybWVuaWFuIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSW5kb25lc2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaWQiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2lkLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDwhLS0gZm9yIGEgbGVzcyBhZ2dyZXNzaXZlIGFwcHJvYWNoIChvbmx5IGluZmxlY3Rpb25hbCBzdWZmaXhlcyksIHNldCBzdGVtRGVyaXZhdGlvbmFsIHRvIGZhbHNlIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkluZG9uZXNpYW5TdGVtRmlsdGVyRmFjdG9yeSIgc3RlbURlcml2YXRpb25hbD0idHJ1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEl0YWxpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2l0IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGwnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19pdC50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19pdC50eHQiIGZvcm1hdD0ic25vd2JhbGwiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkl0YWxpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbW9yZSBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9Ikl0YWxpYW4iLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSmFwYW5lc2UgdXNpbmcgbW9ycGhvbG9naWNhbCBhbmFseXNpcyAoc2VlIHRleHRfY2prIGZvciBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgYmlncmFtbWluZykKKworICAgICAgICAgTk9URTogSWYgeW91IHdhbnQgdG8gb3B0aW1pemUgc2VhcmNoIGZvciBwcmVjaXNpb24sIHVzZSBkZWZhdWx0IG9wZXJhdG9yIEFORCBpbiB5b3VyIHF1ZXJ5CisgICAgICAgICBwYXJzZXIgY29uZmlnIHdpdGggPHNvbHJRdWVyeVBhcnNlciBkZWZhdWx0T3BlcmF0b3I9IkFORCIvPiBmdXJ0aGVyIGRvd24gaW4gdGhpcyBmaWxlLiAgVXNlIAorICAgICAgICAgT1IgaWYgeW91IHdvdWxkIGxpa2UgdG8gb3B0aW1pemUgZm9yIHJlY2FsbCAoZGVmYXVsdCkuCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2phIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiIGF1dG9HZW5lcmF0ZVBocmFzZVF1ZXJpZXM9ImZhbHNlIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgIDwhLS0gS3Vyb21vamkgSmFwYW5lc2UgbW9ycGhvbG9naWNhbCBhbmFseXplci90b2tlbml6ZXIgKEphcGFuZXNlVG9rZW5pemVyKQorCisgICAgICAgICAgIEt1cm9tb2ppIGhhcyBhIHNlYXJjaCBtb2RlIChkZWZhdWx0KSB0aGF0IGRvZXMgc2VnbWVudGF0aW9uIHVzZWZ1bCBmb3Igc2VhcmNoLiAgQSBoZXVyaXN0aWMKKyAgICAgICAgICAgaXMgdXNlZCB0byBzZWdtZW50IGNvbXBvdW5kcyBpbnRvIGl0cyBwYXJ0cyBhbmQgdGhlIGNvbXBvdW5kIGl0c2VsZiBpcyBrZXB0IGFzIHN5bm9ueW0uCisKKyAgICAgICAgICAgVmFsaWQgdmFsdWVzIGZvciBhdHRyaWJ1dGUgbW9kZSBhcmU6CisgICAgICAgICAgICAgIG5vcm1hbDogcmVndWxhciBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgc2VhcmNoOiBzZWdtZW50YXRpb24gdXNlZnVsIGZvciBzZWFyY2ggd2l0aCBzeW5vbnltcyBjb21wb3VuZHMgKGRlZmF1bHQpCisgICAgICAgICAgICBleHRlbmRlZDogc2FtZSBhcyBzZWFyY2ggbW9kZSwgYnV0IHVuaWdyYW1zIHVua25vd24gd29yZHMgKGV4cGVyaW1lbnRhbCkKKworICAgICAgICAgICBGb3Igc29tZSBhcHBsaWNhdGlvbnMgaXQgbWlnaHQgYmUgZ29vZCB0byB1c2Ugc2VhcmNoIG1vZGUgZm9yIGluZGV4aW5nIGFuZCBub3JtYWwgbW9kZSBmb3IKKyAgICAgICAgICAgcXVlcmllcyB0byByZWR1Y2UgcmVjYWxsIGFuZCBwcmV2ZW50IHBhcnRzIG9mIGNvbXBvdW5kcyBmcm9tIGJlaW5nIG1hdGNoZWQgYW5kIGhpZ2hsaWdodGVkLgorICAgICAgICAgICBVc2UgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4gYW5kIDxhbmFseXplciB0eXBlPSJxdWVyeSI+IGZvciB0aGlzIGFuZCBtb2RlIG5vcm1hbCBpbiBxdWVyeS4KKworICAgICAgICAgICBLdXJvbW9qaSBhbHNvIGhhcyBhIGNvbnZlbmllbnQgdXNlciBkaWN0aW9uYXJ5IGZlYXR1cmUgdGhhdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgc3RhdGlzdGljYWwKKyAgICAgICAgICAgbW9kZWwgd2l0aCB5b3VyIG93biBlbnRyaWVzIGZvciBzZWdtZW50YXRpb24sIHBhcnQtb2Ytc3BlZWNoIHRhZ3MgYW5kIHJlYWRpbmdzIHdpdGhvdXQgYSBuZWVkCisgICAgICAgICAgIHRvIHNwZWNpZnkgd2VpZ2h0cy4gIE5vdGljZSB0aGF0IHVzZXIgZGljdGlvbmFyaWVzIGhhdmUgbm90IGJlZW4gc3ViamVjdCB0byBleHRlbnNpdmUgdGVzdGluZy4KKworICAgICAgICAgICBVc2VyIGRpY3Rpb25hcnkgYXR0cmlidXRlcyBhcmU6CisgICAgICAgICAgICAgICAgICAgICB1c2VyRGljdGlvbmFyeTogdXNlciBkaWN0aW9uYXJ5IGZpbGVuYW1lCisgICAgICAgICAgICAgdXNlckRpY3Rpb25hcnlFbmNvZGluZzogdXNlciBkaWN0aW9uYXJ5IGVuY29kaW5nIChkZWZhdWx0IGlzIFVURi04KQorCisgICAgICAgICAgIFNlZSBsYW5nL3VzZXJkaWN0X2phLnR4dCBmb3IgYSBzYW1wbGUgdXNlciBkaWN0aW9uYXJ5IGZpbGUuCisKKyAgICAgICAgICAgUHVuY3R1YXRpb24gY2hhcmFjdGVycyBhcmUgZGlzY2FyZGVkIGJ5IGRlZmF1bHQuICBVc2UgZGlzY2FyZFB1bmN0dWF0aW9uPSJmYWxzZSIgdG8ga2VlcCB0aGVtLgorCisgICAgICAgICAgIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvSmFwYW5lc2VMYW5ndWFnZVN1cHBvcnQgZm9yIG1vcmUgb24gSmFwYW5lc2UgbGFuZ3VhZ2Ugc3VwcG9ydC4KKyAgICAgICAgLS0+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VUb2tlbml6ZXJGYWN0b3J5IiBtb2RlPSJzZWFyY2giLz4KKyAgICAgICAgPCEtLTx0b2tlbml6ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VUb2tlbml6ZXJGYWN0b3J5IiBtb2RlPSJzZWFyY2giIHVzZXJEaWN0aW9uYXJ5PSJsYW5nL3VzZXJkaWN0X2phLnR4dCIvPi0tPgorICAgICAgICA8IS0tIFJlZHVjZXMgaW5mbGVjdGVkIHZlcmJzIGFuZCBhZGplY3RpdmVzIHRvIHRoZWlyIGJhc2UvZGljdGlvbmFyeSBmb3JtcyAo6L6e5pu45b2iKSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5KYXBhbmVzZUJhc2VGb3JtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIFJlbW92ZXMgdG9rZW5zIHdpdGggY2VydGFpbiBwYXJ0LW9mLXNwZWVjaCB0YWdzIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkphcGFuZXNlUGFydE9mU3BlZWNoU3RvcEZpbHRlckZhY3RvcnkiIHRhZ3M9Imxhbmcvc3RvcHRhZ3NfamEudHh0IiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPCEtLSBOb3JtYWxpemVzIGZ1bGwtd2lkdGggcm9tYWppIHRvIGhhbGYtd2lkdGggYW5kIGhhbGYtd2lkdGgga2FuYSB0byBmdWxsLXdpZHRoIChVbmljb2RlIE5GS0Mgc3Vic2V0KSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DSktXaWR0aEZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBSZW1vdmVzIGNvbW1vbiB0b2tlbnMgdHlwaWNhbGx5IG5vdCB1c2VmdWwgZm9yIHNlYXJjaCwgYnV0IGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gcmFua2luZyAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2phLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIiAvPgorICAgICAgICA8IS0tIE5vcm1hbGl6ZXMgY29tbW9uIGthdGFrYW5hIHNwZWxsaW5nIHZhcmlhdGlvbnMgYnkgcmVtb3ZpbmcgYW55IGxhc3QgbG9uZyBzb3VuZCBjaGFyYWN0ZXIgKFUrMzBGQykgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VLYXRha2FuYVN0ZW1GaWx0ZXJGYWN0b3J5IiBtaW5pbXVtTGVuZ3RoPSI0Ii8+CisgICAgICAgIDwhLS0gTG93ZXItY2FzZXMgcm9tYWppIGNoYXJhY3RlcnMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIExhdHZpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2x2IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19sdi50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxhdHZpYW5TdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIER1dGNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9ubCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfbmwudHh0IiBmb3JtYXQ9InNub3diYWxsIiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdGVtbWVyT3ZlcnJpZGVGaWx0ZXJGYWN0b3J5IiBkaWN0aW9uYXJ5PSJsYW5nL3N0ZW1kaWN0X25sLnR4dCIgaWdub3JlQ2FzZT0iZmFsc2UiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJEdXRjaCIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIE5vcndlZ2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfbm8iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX25vLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iTm9yd2VnaWFuIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICAgIDwhLS0gc2luZ3VsYXIvcGx1cmFsOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBQb3J0dWd1ZXNlIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9wdCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfcHQudHh0IiBmb3JtYXQ9InNub3diYWxsIiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0dWd1ZXNlTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0dWd1ZXNlTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgICA8IS0tIG1vcmUgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJQb3J0dWd1ZXNlIi8+IC0tPgorICAgICAgICA8IS0tIG1vc3QgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0dWd1ZXNlU3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gUm9tYW5pYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3JvIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19yby50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IlJvbWFuaWFuIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gUnVzc2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfcnUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX3J1LnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iUnVzc2lhbiIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5SdXNzaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBTd2VkaXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9zdiIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfc3YudHh0IiBmb3JtYXQ9InNub3diYWxsIiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJTd2VkaXNoIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN3ZWRpc2hMaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFRoYWkgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3RoIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuVGhhaVdvcmRGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc190aC50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFR1cmtpc2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3RyIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5UdXJraXNoTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJmYWxzZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX3RyLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iVHVya2lzaCIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworIDwvdHlwZXM+CisgIAorICA8IS0tIFNpbWlsYXJpdHkgaXMgdGhlIHNjb3Jpbmcgcm91dGluZSBmb3IgZWFjaCBkb2N1bWVudCB2cy4gYSBxdWVyeS4KKyAgICAgICBBIGN1c3RvbSBTaW1pbGFyaXR5IG9yIFNpbWlsYXJpdHlGYWN0b3J5IG1heSBiZSBzcGVjaWZpZWQgaGVyZSwgYnV0IAorICAgICAgIHRoZSBkZWZhdWx0IGlzIGZpbmUgZm9yIG1vc3QgYXBwbGljYXRpb25zLiAgCisgICAgICAgRm9yIG1vcmUgaW5mbzogaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NjaGVtYVhtbCNTaW1pbGFyaXR5CisgICAgLS0+CisgIDwhLS0KKyAgICAgPHNpbWlsYXJpdHkgY2xhc3M9ImNvbS5leGFtcGxlLnNvbHIuQ3VzdG9tU2ltaWxhcml0eUZhY3RvcnkiPgorICAgICAgIDxzdHIgbmFtZT0icGFyYW1rZXkiPnBhcmFtIHZhbHVlPC9zdHI+CisgICAgIDwvc2ltaWxhcml0eT4KKyAgICAtLT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3Nkc2NoZW1hLnNxbCBiLzAuMTAvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvc2RzY2hlbWEuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWQ5YzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3Nkc2NoZW1hLnNxbApAQCAtMCwwICsxLDg1IEBACistLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCistLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCistLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLS0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCistLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy0tLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0tCistLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0tCistLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLS0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLS0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgZGF0YVBvaW50YAorLS0KKworQ1JFQVRFIFRBQkxFIGBkYXRhUG9pbnRgICgKKyAgYGRhdGFQb2ludF9pZGAgaW50KDEwKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKKyAgYGdyYW51bGVfaWRgIGludCgxMCkgdW5zaWduZWQgTk9UIE5VTEwsCisgIGBkYXRhc2V0X2lkYCBpbnQoMTApIHVuc2lnbmVkIE5PVCBOVUxMLAorICBgcGFyYW1ldGVyX2lkYCBpbnQoMTApIHVuc2lnbmVkIE5PVCBOVUxMLAorICBgdGltZWAgZGF0ZXRpbWUgZGVmYXVsdCBOVUxMLAorICBgbGF0aXR1ZGVgIGRvdWJsZSBkZWZhdWx0IE5VTEwsCisgIGBsb25naXR1ZGVgIGRvdWJsZSBkZWZhdWx0IE5VTEwsCisgIGB2ZXJ0aWNhbGAgZG91YmxlIGRlZmF1bHQgTlVMTCwKKyAgYHZhbHVlYCBkb3VibGUgZGVmYXVsdCBOVUxMLAorICBQUklNQVJZIEtFWSAgKGBkYXRhUG9pbnRfaWRgKQorKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTExNDMyOTcgREVGQVVMVCBDSEFSU0VUPWxhdGluMTsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGRhdGFzZXRgCistLQorCitDUkVBVEUgVEFCTEUgYGRhdGFzZXRgICgKKyAgYGRhdGFzZXRfaWRgIGludCgxMCkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCisgIGBsb25nTmFtZWAgdmFyY2hhcigxMjApIGRlZmF1bHQgTlVMTCwKKyAgYHNob3J0TmFtZWAgdmFyY2hhcig2MCkgZGVmYXVsdCBOVUxMLAorICBgZGVzY3JpcHRpb25gIHRleHQsCisgIGBzb3VyY2VgIHZhcmNoYXIoMjU1KSBkZWZhdWx0IE5VTEwsCisgIGByZWZlcmVuY2VVUkxgIHZhcmNoYXIoMjU1KSBkZWZhdWx0IE5VTEwsCisgIFBSSU1BUlkgS0VZICAoYGRhdGFzZXRfaWRgKQorKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTEwIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjE7CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBkcE1hcGAKKy0tCisKK0NSRUFURSBUQUJMRSBgZHBNYXBgICgKKyAgYGRhdGFzZXRfaWRgIGludCgxMCkgdW5zaWduZWQgTk9UIE5VTEwsCisgIGBwYXJhbWV0ZXJfaWRgIGludCgxMCkgdW5zaWduZWQgTk9UIE5VTEwsCisgIFBSSU1BUlkgS0VZICAoYGRhdGFzZXRfaWRgLGBwYXJhbWV0ZXJfaWRgKQorKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjE7CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBncmFudWxlYAorLS0KK0NSRUFURSBUQUJMRSBgZ3JhbnVsZWAgKAorICBgZ3JhbnVsZV9pZGAgaW50KDEwKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKKyAgYGRhdGFzZXRfaWRgIGludCgxMCkgdW5zaWduZWQgZGVmYXVsdCBOVUxMLAorICBgZmlsZW5hbWVgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgIChgZ3JhbnVsZV9pZGApLAorICBLRVkgYGRhdGFzZXRfaWRgIChgZGF0YXNldF9pZGApCispIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MiBERUZBVUxUIENIQVJTRVQ9bGF0aW4xOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgcGFyYW1ldGVyYAorLS0KKworQ1JFQVRFIFRBQkxFIGBwYXJhbWV0ZXJgICgKKyAgYHBhcmFtZXRlcl9pZGAgaW50KDEwKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKKyAgYGxvbmdOYW1lYCB2YXJjaGFyKDEyMCkgZGVmYXVsdCBOVUxMLAorICBgc2hvcnROYW1lYCB2YXJjaGFyKDYwKSBkZWZhdWx0IE5VTEwsCisgIGBkZXNjcmlwdGlvbmAgdGV4dCwKKyAgYHJlZmVyZW5jZVVSTGAgdmFyY2hhcigyNTUpIGRlZmF1bHQgTlVMTCwKKyAgYGNlbGxNZXRob2RgIHRleHQsCisgIGBtaXNzaW5nRGF0YUZsYWdgIGZsb2F0IGRlZmF1bHQgTlVMTCwKKyAgYHVuaXRzYCB2YXJjaGFyKDYwKSBkZWZhdWx0IE5VTEwsCisgIGB2ZXJ0aWNhbFVuaXRzYCB2YXJjaGFyKDEyMCkgZGVmYXVsdCBOVUxMLAorICBgZGF0YWJhc2VgIHZhcmNoYXIoODApIE5PVCBOVUxMLAorICBgZGF0YXNldF9pZGAgaW50KDEwKSB1bnNpZ25lZCBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgIChgcGFyYW1ldGVyX2lkYCkKKykgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD00MSBERUZBVUxUIENIQVJTRVQ9bGF0aW4xOwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy90Y3NoX2FsaWFzZXMudHh0IGIvMC4xMC9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy90Y3NoX2FsaWFzZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTA5MDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3Rjc2hfYWxpYXNlcy50eHQKQEAgLTAsMCArMSwzMCBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyMjIyMjIyMjIyMjIyMjVENTSCBTSEVMTCBBTElBU0VTIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoZSBmb2xsb3dpbmcgYWxpYXNlcyBtdXN0IGJlIHVzZWQgd2l0aGluIGEgZmlsZW1ncidzCisjIGJpbiBkaXJlY3Rvcnkgc2luY2UgcmVsYXRpdmUgcGF0aGluZyBpcyBiZWluZyB1c2VkLiAgVGhpcyBibG9jayBhbHNvCisjIGFzc3VtZXMgdGhhdCB0aGUgZmlsZW1nciBpcyBydW5uaW5nIG9uIHBvcnQgOTAwMCAodGhlIGRlZmF1bHQgcG9ydCBvZiBmaWxlbWdyKQorIworIyBGb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBzZWU6IAorIyAgICAgaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9PT0RUL0JBU0grYW5kK1RDU0grc2hlbGwrdG9vbHMrZm9yK0ZpbGUrTWFuYWdlcgorIworYWxpYXMgbHVjZW5lcXVlcnkgJ2phdmEgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucHJvcGVydGllcz0uLi9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzIC1EamF2YS5leHQuZGlycz0uLi9saWIgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzLlF1ZXJ5VG9vbCAtLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1sdWNlbmUgLXF1ZXJ5ICcKK2FsaWFzIHNxbHF1ZXJ5ICdqYXZhIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9Li4vZXRjL2ZpbGVtZ3IucHJvcGVydGllcyAtRGphdmEuZXh0LmRpcnM9Li4vbGliIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29scy5RdWVyeVRvb2wgLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tc3FsIC1xdWVyeSAnCithbGlhcyBmbWRlbCAnamF2YSAtRG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5wcm9wZXJ0aWVzPS4uL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudG9vbHMuRGVsZXRlUHJvZHVjdCAtLWZpbGVNYW5hZ2VyVXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLXJlYWQnCithbGlhcyBtZXRkdW1wICdqYXZhIC1EamF2YS5leHQuZGlycz0uLi9saWIgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzLk1ldGFkYXRhRHVtcGVyIC0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW91dCAuIC0tcHJvZHVjdElkICcKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvY3NzL2d1aWRlcy5jc3MgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUvcmVzb3VyY2VzL2Nzcy9ndWlkZXMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGFmNzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUvcmVzb3VyY2VzL2Nzcy9ndWlkZXMuY3NzCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLmluZm8sIC5zdWNjZXNzLCAud2FybmluZywgLmVycm9yLCAudmFsaWRhdGlvbiB7Citib3JkZXI6IDFweCBzb2xpZDsKK21hcmdpbjogMTBweCAwcHg7CitwYWRkaW5nOjE1cHggMTBweCAxNXB4IDUwcHg7CitiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCBjZW50ZXI7Cit9CisuaW5mbyB7Citjb2xvcjogIzAwNTI5QjsKK2JhY2tncm91bmQtY29sb3I6ICNCREU1Rjg7CitiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9pbmZvLnBuZycpOworfQorLnN1Y2Nlc3MgeworY29sb3I6ICM0RjhBMTA7CitiYWNrZ3JvdW5kLWNvbG9yOiAjREZGMkJGOworYmFja2dyb3VuZC1pbWFnZTp1cmwoJy4uL2ltYWdlcy9zdWNjZXNzLnBuZycpOworfQorLndhcm5pbmcgeworY29sb3I6ICM5RjYwMDA7CitiYWNrZ3JvdW5kLWNvbG9yOiAjRkVFRkIzOworYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvd2FybmluZy5wbmcnKTsKK30KKy5lcnJvciB7Citjb2xvcjogI0Q4MDAwQzsKK2JhY2tncm91bmQtY29sb3I6ICNGRkJBQkE7CitiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9lcnJvci5wbmcnKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1maWxlbWdyLmpwZyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1maWxlbWdyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RkZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLWZpbGVtZ3IuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1maWxlbWdyLnBzZCBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1maWxlbWdyLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQ1MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLWZpbGVtZ3IucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Vycm9yLnBuZyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Vycm9yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWIxNjlkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZXJyb3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2ZtX2FyY2guanBnIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZm1fYXJjaC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzMThlYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2ZtX2FyY2guanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2ZtX2V4dGVuc2lvbl9wb2ludHMucG5nIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZm1fZXh0ZW5zaW9uX3BvaW50cy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3MmM5OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2ZtX2V4dGVuc2lvbl9wb2ludHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2ZtX29iamVjdF9tb2RlbC5wbmcgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9mbV9vYmplY3RfbW9kZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWY1MTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9mbV9vYmplY3RfbW9kZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2ZtX3VzZV9jYXNlMS5wbmcgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9mbV91c2VfY2FzZTEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTA0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9mbV91c2VfY2FzZTEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2luZm8ucG5nIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvaW5mby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1Zjc4MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2luZm8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N1Y2Nlc3MucG5nIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvc3VjY2Vzcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4ZjdkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N1Y2Nlc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dhcm5pbmcucG5nIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvd2FybmluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3MDVmNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dhcm5pbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2YxNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iY2FzLWZpbGVtZ3IiPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICA8L2xpbmtzPgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJib3R0b20iLz4KKyAgICA8bWVudSBuYW1lPSJTb2Z0d2FyZSBEb2N1bWVudGF0aW9uIj4KKyAgICAgIDxpdGVtIG5hbWU9IkRldmVsb3BlciBHdWlkZSIgaHJlZj0iZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IkJhc2ljIFVzZXIgR3VpZGUiIGhyZWY9InVzZXIvYmFzaWMuaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iQWR2YW5jZWQgVXNlciBHdWlkZSIgaHJlZj0idXNlci9hZHZhbmNlZC5odG1sIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9kZXZlbG9wZXIueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY3OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLnhtbApAQCAtMCwwICsxLDM3NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgICA8cHJvcGVydGllcz4KKyAgICAgIDx0aXRsZT5DQVMgRmlsZSBNYW5hZ2VyIERldmVsb3BlciBHdWlkZTwvdGl0bGU+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmUgV29vbGxhcmQ8L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAKKyAgICAgIDxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoaXMgaXMgdGhlIGRldmVsb3BlciBndWlkZSBmb3IgdGhlIEFwYWNoZSBPT0RUIENhdGFsb2cgYW5kIEFyY2hpdmUgU2VydmljZSAoQ0FTKSAKKyAgICAgICAgICBGaWxlIE1hbmFnZXIgY29tcG9uZW50LCBvciBGaWxlIE1hbmFnZXIgZm9yIHNob3J0LiBQcmltYXJpbHksIHRoaXMgZ3VpZGUgCisgICAgICAgICAgd2lsbCBleHBsYWluIHRoZSBGaWxlIE1hbmFnZXIgYXJjaGl0ZWN0dXJlIGFuZCBpbnRlcmZhY2VzLCBpbmNsdWRpbmcgaXRzIAorICAgICAgICAgIHRhaWxvcmFibGUgZXh0ZW5zaW9uIHBvaW50cy4gRm9yIGluZm9ybWF0aW9uIG9uIGluc3RhbGxhdGlvbiwgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICBhbmQgZXhhbXBsZXMsIHBsZWFzZSBzZWUgb3VyIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+VXNlciBHdWlkZXMuPC9hPgorICAgICAgICAgIAorICAgICAgICAgIDxwPlRoZSByZW1haW5kZXIgb2YgdGhpcyBndWlkZSBpcyBzZXBhcmF0ZWQgaW50byB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjwvcD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMSI+UHJvamVjdCBEZXNjcmlwdGlvbjwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24yIj5BcmNoaXRlY3R1cmU8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMyI+RXh0ZW5zaW9uIFBvaW50czwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb240Ij5DdXJyZW50IEV4dGVuc2lvbiBQb2ludCBJbXBsZW1lbnRhdGlvbnM8L2E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgICAgICAgCisgICAgICAgIDwvcD4gICAgIAorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMSIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iUHJvamVjdCBEZXNjcmlwdGlvbiI+CisgICAgICAgIDxwPlRoZSBGaWxlIE1hbmFnZXIgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZywgaW5nZXN0aW5nIGFuZCBtb3ZpbmcgCisgICAgICAgIGZpbGUgZGF0YSBhbmQgbWV0YWRhdGEgYmV0d2VlbiBhIGNsaWVudCBzeXN0ZW0gYW5kIGEgc2VydmVyIHN5c3RlbS4gVGhlIEZpbGUgCisgICAgICAgIE1hbmFnZXIgaXMgYW4gZXh0ZW5zaWJsZSBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhbiBYTUwtUlBDIGV4dGVybmFsIAorICAgICAgICBpbnRlcmZhY2UsIGFuZCBhIGZ1bGx5IHRhaWxvcmFibGUgSmF2YS1iYXNlZCBBUEkgZm9yIGZpbGUgbWFuYWdlbWVudC48L3A+IAorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iQXJjaGl0ZWN0dXJlIj4KKyAgICAgIAorICAgICAgICA8cD5JbiB0aGlzIHNlY3Rpb24sIHdlIHdpbGwgZGVzY3JpYmUgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgRmlsZSBNYW5hZ2VyLAorICAgICAgICBpbmNsdWRpbmcgaXRzIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMsIG9iamVjdCBtb2RlbCwgYW5kIGtleSBjYXBhYmlsaXRpZXMuPC9wPgorICAgICAgCisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbXBvbmVudHMiPgorICAgICAgICAKKyAgICAgICAgPHA+VGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIEZpbGUgTWFuYWdlciBhcmUgdGhlIENsaWVudCBhbmQgU2VydmVyLCB0aGUgCisgICAgICAgIFJlcG9zaXRvcnkgTWFuYWdlciwgdGhlIENhdGFsb2csIHRoZSBWYWxpZGF0aW9uIExheWVyLCB0aGUgVmVyc2lvbmVyLCBhbmQgCisgICAgICAgIHRoZSBUcmFuc2ZlcmVyLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYWxsIG9mIHRoZXNlIGNvbXBvbmVudHMgYXJlIHNob3duIGluCisgICAgICAgIHRoZSBkaWFncmFtIGJlbG93OjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvZm1fZXh0ZW5zaW9uX3BvaW50cy5wbmciIGFsdD0iRmlsZSBNYW5hZ2VyIEFyY2hpdGVjdHVyZSIvPjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPlRoZSBGaWxlIE1hbmFnZXIgU2VydmVyIGNvbnRhaW5zIGJvdGggYSBSZXBvc2l0b3J5IHRoYXQgbWFuYWdlcyBwcm9kdWN0cyAKKyAgICAgICAgKGFuZCB0aGUgcHJvZHVjdHMnIGxvY2F0aW9uIGluIHRoZSBhcmNoaXZlIGFzIHNwZWNpZmllZCBieSBWZXJzaW9uZXIpLCBhbmQgYQorICAgICAgICBDYXRhbG9nIHRoYXQgdmFsaWRhdGVzIG1ldGFkYXRhIHZpYSB0aGUgVmFsaWRhdGlvbiBMYXllci4gVHJhbnNmZXIgb2YgZGF0YSAKKyAgICAgICAgcHJvZHVjdHMgZnJvbSB0aGUgQ2xpZW50IHRvIHRoZSBTZXJ2ZXIgaXMgdGhlIGRvbWFpbiBvZiB0aGUgVHJhbnNmZXIgYW5kIGNhbiAKKyAgICAgICAgYmUgaW5pdGlhdGVkIGF0IGVpdGhlciB0aGUgQ2xpZW50IG9yIHRoZSBTZXJ2ZXIuPC9wPiAKKyAgICAgICAgCisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iT2JqZWN0IE1vZGVsIj4KKyAgICAgICAgPHA+VGhlIGNyaXRpY2FsIG9iamVjdHMgbWFuYWdlZCBieSB0aGUgRmlsZSBNYW5hZ2VyIGluY2x1ZGU6PC9wPgorICAgICAgICAKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT48c3Ryb25nPlByb2R1Y3RzPC9zdHJvbmc+IC0gQ29sbGVjdGlvbnMgb2Ygb25lIG9yIG1vcmUgZmlsZXMsIGFuZCB0aGVpciAKKyAgICAgICAgICBhc3NvY2lhdGVkIE1ldGFkYXRhLjwvbGk+CisgICAgICAgICAgCisgICAgICAgICAgPGxpPjxzdHJvbmc+TWV0YWRhdGE8L3N0cm9uZz4gLSBBIG1hcCBvZiBrZXktPm11bHRpcGxlIHZhbHVlcyBvZiBkZXNjcmlwdGl2ZSAKKyAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCBhIFByb2R1Y3QuIFNlZSAKKyAgICAgICAgICA8YSBocmVmPSIuLi8uLi9tZXRhZGF0YS8iPkNBUy1NZXRhZGF0YTwvYT4gZm9yIG1vcmUgCisgICAgICAgICAgaW5mb3JtYXRpb24gb24gTWV0YWRhdGEuPC9saT4KKyAgICAgICAgICAKKyAgICAgICAgICA8bGk+PHN0cm9uZz5SZWZlcmVuY2U8L3N0cm9uZz4gLSBBIHBvaW50ZXIgdG8gYSBQcm9kdWN0IGZpbGUncyAob3IgZmlsZXMnKSAKKyAgICAgICAgICBvcmlnaW5hbCBsb2NhdGlvbiwgYW5kIHRvIGl0cyBmaW5hbCByZXN0aW5nIGxvY2F0aW9uIHdpdGhpbiB0aGUgYXJjaGl2ZSAKKyAgICAgICAgICBjb25zdHJ1Y3RlZCBieSB0aGUgRmlsZSBNYW5hZ2VyLjwvbGk+CisgICAgICAgICAgCisgICAgICAgICAgPGxpPjxzdHJvbmc+UHJvZHVjdCBUeXBlPC9zdHJvbmc+IC0gRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQcm9kdWN0IAorICAgICAgICAgIHRoYXQgaW5jbHVkZXMgd2hhdCB0eXBlIG9mIGZpbGUgVVJJIGdlbmVyYXRpb24gc2NoZW1lIHRvIHVzZSwgdGhlIHJvb3QgCisgICAgICAgICAgcmVwb3NpdG9yeSBsb2NhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIFByb2R1Y3QsIGFuZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSAKKyAgICAgICAgICBQcm9kdWN0LjwvbGk+CisgICAgICAgICAgCisgICAgICAgICAgPGxpPjxzdHJvbmc+RWxlbWVudDwvc3Ryb25nPiAtIEEgc2luZ3VsYXIgTWV0YWRhdGEgZWxlbWVudCwgc3VjaCBhcyAiQXV0aG9yIiwgCisgICAgICAgICAgb3IgIkNyZWF0b3IiLiBFbGVtZW50cyBtYXkgaGF2ZSBhZGRpdGlvbmFsIG1ldGFkYXRhLCBpbiB0aGUgZm9ybSBvZiB0aGUgCisgICAgICAgICAgYXNzb2NpYXRlZCBkZWZpbml0aW9uIGFuZCBldmVuIGEgY29ycmVzcG9uZGluZyAKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZHVibGluY29yZS5vcmcvIj5EdWJsaW4gQ29yZTwvYT4gYXR0cmlidXRlLiBTZWUgCisgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vbWV0YWRhdGEvIj5DQVMtTWV0YWRhdGE8L2E+IGZvciBtb3JlIAorICAgICAgICAgIGluZm9ybWF0aW9uIG9uIE1ldGFkYXRhIEVsZW1lbnRzLjwvbGk+CisgICAgICAgICAgCisgICAgICAgICAgPGxpPjxzdHJvbmc+VmVyc2lvbmVyPC9zdHJvbmc+IC0gQSBVUkkgZ2VuZXJhdGlvbiBzY2hlbWUgZm9yIFByb2R1Y3QgVHlwZXMgCisgICAgICAgICAgdGhhdCBkZWZpbmVzIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGFyY2hpdmUgKGJ1aWx0IGJ5IHRoZSBGaWxlIE1hbmFnZXIpIAorICAgICAgICAgIHdoZXJlIGEgZmlsZSBiZWxvbmdpbmcgdG8gYSBQcm9kdWN0ICh0aGF0IGJlbG9uZ3MgdG8gdGhlIGFzc29jaWF0ZWQgUHJvZHVjdCAKKyAgICAgICAgICBUeXBlKSBzaG91bGQgYmUgcGxhY2VkLjwvbGk+CisgICAgICAgIDwvdWw+CisKKyAgICAgICAgPHA+RWFjaCBQcm9kdWN0IGNvbnRhaW5zIDEgb3IgbW9yZSBSZWZlcmVuY2VzLCBhbmQgb25lIE1ldGFkYXRhIG9iamVjdC4gRWFjaCAKKyAgICAgICAgUHJvZHVjdCBpcyBhIG1lbWJlciBvZiBhIHNpbmdsZSBQcm9kdWN0IFR5cGUuIFRoZSBNZXRhZGF0YSBjb2xsZWN0ZWQgZm9yIGVhY2ggCisgICAgICAgIFByb2R1Y3QgaXMgZGVmaW5lZCBieSBhIG1hcHBpbmcgb2YgUHJvZHVjdCBUeXBlLT4xLi4uKiBFbGVtZW50cy4gRWFjaCBQcm9kdWN0IAorICAgICAgICBUeXBlIGhhcyBhbiBhc3NvY2lhdGVkIFZlcnNpb25lci4gVGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgc2hvd24gaW4gdGhlIGJlbG93IAorICAgICAgICBmaWd1cmUuPC9wPgorICAgICAgICAKKyAgICAgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9mbV9vYmplY3RfbW9kZWwucG5nIiBhbHQ9IkZpbGUgTWFuYWdlciBPYmplY3QgTW9kZWwiLz4gCisgICAgICAgIDwvc3Vic2VjdGlvbj4gCisgICAgICAKKyAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iS2V5IENhcGFiaWxpdGllcyI+CisgICAgICAgIDxwPlRoZSBGaWxlIG1hbmFnZXIgaGFzIGJlZW4gZGVzaWduZWQgd2l0aCBhIG5ldyBvZiBrZXkgY2FwYWJpbGl0aWVzIGluIG1pbmQuCisgICAgICAgIFRoZXNlIGNhcGFiaWxpdGllcyBpbmNsdWRlOjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+RWFzeSBtYW5hZ2VtZW50IG9mIGRpZmZlcmVudCB0eXBlcyBvZiBQcm9kdWN0cy48L3N0cm9uZz4gVGhlIAorICAgICAgICBSZXBvc2l0b3J5IE1hbmFnZXIgZXh0ZW5zaW9uIHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBQcm9kdWN0IFR5cGVzLCAKKyAgICAgICAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24uIE1hbmFnZW1lbnQgb2YgUHJvZHVjdCBUeXBlcyBpbmNsdWRlcyBhZGRpbmcgCisgICAgICAgIG5ldyB0eXBlcywgZGVsZXRpbmcgYW5kIHVwZGF0aW5nIGV4aXN0aW5nIHR5cGVzLCBhbmQgcmV0cmlldmluZyBQcm9kdWN0IFR5cGUgCisgICAgICAgIE9iamVjdHMsIGJ5IHRoZWlyIElEIG9yIGJ5IHRoZWlyIG5hbWUuPC9wPgorICAgICAgICAgIAorICAgICAgICA8cD48c3Ryb25nPlN1cHBvcnQgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBiYWNrIGVuZCBjYXRhbG9ncy48L3N0cm9uZz4gVGhlIAorICAgICAgICBDYXRhbG9nIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgUHJvZHVjdCBpbnN0YW5jZSBtZXRhZGF0YSBhbmQgZmlsZSBsb2NhdGlvbiAKKyAgICAgICAgaW5mb3JtYXRpb24gdG8gYmUgc3RvcmVkIGluIGRpZmZlcmVudCB0eXBlcyBvZiBiYWNrIGVuZCBkYXRhIHN0b3JlcyBxdWl0ZSAKKyAgICAgICAgZWFzaWx5LiBFeGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIENhdGFsb2cgaW50ZXJmYWNlIGluY2x1ZGUgYSBKREJDIGJhc2VkIAorICAgICAgICBiYWNrIGVuZCBkYXRhYmFzZSwgYWxvbmcgd2l0aCBhIGZsYXQtZmlsZSBpbmRleCBwb3dlcmVkIGJ5IAorICAgICAgICA8YSBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmcvIj5MdWNlbmUuPC9hPjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5NYW5hZ2VtZW50IG9mIFByb2R1Y3QgaW5zdGFuY2UgaW5mb3JtYXRpb24uPC9zdHJvbmc+IE1hbmFnZW1lbnQgCisgICAgICAgIGluY2x1ZGVzIGFkZGluZywgZGVsZXRpbmcgYW5kIHVwZGF0aW5nIHByb2R1Y3QgaW5zdGFuY2UgaW5mb3JtYXRpb24sIGluY2x1ZGluZyAKKyAgICAgICAgZmlsZSBsb2NhdGlvbnMgKFJlZmVyZW5jZXMpLCBhbG9uZyB3aXRoIFByb2R1Y3QgTWV0YWRhdGEuIEl0IGFsc28gaW5jbHVkZXMgCisgICAgICAgIHJldHJpZXZpbmcgTWV0YWRhdGEgYW5kIFJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGV4aXN0aW5nIFByb2R1Y3RzIGFzIHdlbGwgCisgICAgICAgIGFzIG9idGFpbmluZyB0aGUgUHJvZHVjdHMgdGhlbXNlbHZlcy48L3A+CisgICAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+RWxlbWVudCBtYW5hZ2VtZW50IGZvciBNZXRhZGF0YS48L3N0cm9uZz4gVGhlIEZpbGUgTWFuYWdlcidzIAorICAgICAgICBWYWxpZGF0aW9uIExheWVyIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgZm9yIHRoZSBtYW5hZ2VtZW50IG9mIEVsZW1lbnQgcG9saWN5IAorICAgICAgICBpbmZvcm1hdGlvbiBpbiBkaWZmZXJlbnQgdHlwZXMgb2YgYmFjayBlbmQgc3RvcmVzLiBGb3IgaW5zdGFuY2UsIEVsZW1lbnQgcG9saWN5IAorICAgICAgICBjb3VsZCBiZSBzdG9yZWQgaW4gWE1MIGZpbGVzLCBhIERhdGFiYXNlLCBvciBhIE1ldGFkYXRhIFJlZ2lzdHJ5LjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5EYXRhIHRyYW5zZmVyIG1lY2hhbmlzbSBpbnRlcmZhY2UuPC9zdHJvbmc+IEJ5IGhhdmluZyAKKyAgICAgICAgYW4gZXh0ZW5zaW9uIHBvaW50IGZvciBEYXRhIFRyYW5zZmVyLCB0aGUgRmlsZSBNYW5hZ2VyIGNhbiBzdXBwb3J0IGRpZmZlcmVudCAKKyAgICAgICAgRGF0YSBUcmFuc2ZlciBwcm90b2NvbHMsIGJvdGggbG9jYWwgYW5kIHJlbW90ZS48L3A+CisgICAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+QWR2YW5jZWQgc3VwcG9ydCBmb3IgRmlsZSBSZXBvc2l0b3J5IGxheW91dHMuPC9zdHJvbmc+IAorICAgICAgICBUaGUgVmVyc2lvbmVyIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgZm9yIGRpZmZlcmVudCBGaWxlIFJlcG9zaXRvcnkgbGF5b3V0cyAKKyAgICAgICAgYmFzZWQgb24gUHJvZHVjdCBUeXBlcy48L3A+CisgICAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+U3VwcG9ydCBmb3IgbXVsdGlwbGUgUHJvZHVjdCBzdHJ1Y3R1cmVzLjwvc3Ryb25nPiBUaGUgRmlsZSBNYW5hZ2VyIAorICAgICAgICBDbGllbnQgYWxsb3dzIGZvciBQcm9kdWN0cyB0byBiZSBGbGF0LCBvciBIaWVyYXJjaGljYWwtYmFzZWQuIEZsYXQgcHJvZHVjdHMgCisgICAgICAgIGFyZSBjb2xsZWN0aW9ucyBvZiBzaW5ndWxhciBmaWxlcyB0aGF0IGFyZSBhZ2dyZWdhdGVkIHRvZ2V0aGVyIHRvIG1ha2UgYSAKKyAgICAgICAgUHJvZHVjdC4gSGllcmFyY2hpY2FsIFByb2R1Y3RzIGFyZSBQcm9kdWN0cyB0aGF0IGNvbnRhaW4gY29sbGVjdGlvbnMgb2YgCisgICAgICAgIGRpcmVjdG9yaWVzLCBhbmQgc3ViLWRpcmVjdG9yaWVzLCBhbmQgZmlsZXMuPC9wPgorICAgICAgICAgIAorICAgICAgICA8cD48c3Ryb25nPkRlc2lnbiBmb3Igc2NhbGFiaWxpdHkuPC9zdHJvbmc+IFRoZSBGaWxlIE1hbmFnZXIgdXNlcyB0aGUgcG9wdWxhciAKKyAgICAgICAgY2xpZW50LXNlcnZlciBwYXJhZGlnbSwgYWxsb3dpbmcgbmV3IEZpbGUgTWFuYWdlciBzZXJ2ZXJzIHRvIGJlIGluc3RhbnRpYXRlZCwgCisgICAgICAgIGFzIG5lZWRlZCwgd2l0aG91dCBhZmZlY3RpbmcgdGhlIEZpbGUgTWFuYWdlciBjbGllbnRzLCBhbmQgdmljZS12ZXJzYS48L3A+CisgICAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+U3RhbmRhcmQgY29tbXVuaWNhdGlvbiBwcm90b2NvbHMuPC9zdHJvbmc+IFRoZSBGaWxlIE1hbmFnZXIgdXNlcyAKKyAgICAgICAgWE1MLVJQQyBhcyBpdHMgbWFpbiBleHRlcm5hbCBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgRmlsZSBNYW5hZ2VyIGNsaWVudCBhbmQgCisgICAgICAgIHNlcnZlci4gWE1MLVJQQywgdGhlIGxpdHRsZSBicm90aGVyIG9mIFNPQVAsIGlzIGZhc3QsIGV4dGVuc2libGUsIGFuZCB1c2VzIAorICAgICAgICB0aGUgdW5kZXJseWluZyBIVFRQIHByb3RvY29sIGZvciBkYXRhIHRyYW5zZmVyLjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5SU1MtYmFzZWQgUHJvZHVjdCBzeW5kaWNhdGlvbi48L3N0cm9uZz4gVGhlIEZpbGUgTWFuYWdlciB3ZWIgCisgICAgICAgIGludGVyZmFjZSBhbGxvd3MgZm9yIHRoZSBSU1MtYmFzZWQgc3luZGljYXRpb24gb2YgUHJvZHVjdCBmZWVkcyBiYXNlZCBvbiAKKyAgICAgICAgUHJvZHVjdCBUeXBlLjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5EYXRhIHRyYW5zZmVyIHN0YXR1cyB0cmFja2luZy48L3N0cm9uZz4gVGhlIEZpbGUgTWFuYWdlciB0cmFja3MgCisgICAgICAgIGFsbCBjdXJyZW50IFByb2R1Y3QgYW5kIEZpbGUgdHJhbnNmZXJzIGFuZCBldmVuIHB1Ymxpc2hlcyBhbiBSU1MtZmVlZCBvZiAKKyAgICAgICAgZXhpc3RpbmcgdHJhbnNmZXJzLjwvcD4KKyAgICAgICAgIAorICAgICAgICA8cD5UaGlzIGNhcGFiaWxpdHkgc2V0IGlzIG5vdCBleGhhdXN0aXZlLCBhbmQgaXMgbWVhbnQgdG8gZ2l2ZSB0aGUgdXNlciBhIAorICAgICAgICA8aT5mZWVsPC9pPiBmb3Igd2hhdCBnZW5lcmFsIGZlYXR1cmVzIGFyZSBwcm92aWRlZCBieSB0aGUgRmlsZSBNYW5hZ2VyLiBNb3N0IAorICAgICAgICBsaWtlbHkgdGhlIHVzZXIgd2lsbCBmaW5kIHRoYXQgdGhlIEZpbGUgTWFuYWdlciBwcm92aWRlcyBtYW55IG90aGVyIAorICAgICAgICBjYXBhYmlsaXRpZXMgYmVzaWRlcyB0aG9zZSBkZXNjcmliZWQgaGVyZS48L3A+CisgICAgICAgICAgCisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjMiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkV4dGVuc2lvbiBQb2ludHMiPgorICAgICAgICAgIDxwPldlIGhhdmUgY29uc3RydWN0ZWQgdGhlIEZpbGUgTWFuYWdlciBtYWtpbmcgdXNlIG9mIHRoZSA8aT5mYWN0b3J5IAorICAgICAgICAgIG1ldGhvZCBwYXR0ZXJuPC9pPiB0byBwcm92aWRlIG11bHRpcGxlIGV4dGVuc2lvbiBwb2ludHMgZm9yIHRoZSBGaWxlIE1hbmFnZXIuIEFuIAorICAgICAgICAgIGV4dGVuc2lvbiBwb2ludCBpcyBhbiBpbnRlcmZhY2Ugd2l0aGluIHRoZSBGaWxlIE1hbmFnZXIgdGhhdCBjYW4gaGF2ZSBtYW55IAorICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gaXQgY29tZXMgdG8gc29mdHdhcmUgCisgICAgICAgICAgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBpdCBhbGxvd3MgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiAKKyAgICAgICAgICBhbiBleGlzdGluZyBpbnRlcmZhY2UgdG8gYmUgc2VsZWN0ZWQgYXQgZGVwbG95bWVudCB0aW1lLjwvcD4gCisgICAgICAgICAgCisgICAgICAgICAgPGRpdiBjbGFzcz0iaW5mbyI+VGhlIGZhY3RvcnkgbWV0aG9kIHBhdHRlcm4gaXMgYSBjcmVhdGlvbmFsIHBhdHRlcm4gY29tbW9uIHRvCisgICAgICAgICAgb2JqZWN0IG9yaWVudGVkIGRlc2lnbi4gRWFjaCBGaWxlIE1hbmFnZXIgZXh0ZW5zaW9uIHBvaW50IGludm9sdmVzIHRoZSAKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0d28gaW50ZXJmYWNlczogYW4gPGk+ZXh0ZW5zaW9uIGZhY3Rvcnk8L2k+IGFuZCBhbiAKKyAgICAgICAgICA8aT5leHRlbnNpb248L2k+IGltcGxlbWVudGF0aW9uLiBBdCBydW4tdGltZSwgdGhlIEZpbGUgTWFuYWdlciBsb2FkcyBhIAorICAgICAgICAgIHByb3BlcnRpZXMgZmlsZSBzcGVjaWZpZXMgYSBmYWN0b3J5IGNsYXNzIHRvIHVzZSBkdXJpbmcgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgaW5zdGFudGlhdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBGaWxlIE1hbmFnZXIgbWF5IGNvbW11bmljYXRlIHdpdGggYSAKKyAgICAgICAgICBkYXRhYmFzZS1iYXNlZCBDYXRhbG9nIGFuZCBhbiBYTUwtYmFzZWQgRWxlbWVudCBTdG9yZSAoY2FsbGVkIGEgVmFsaWRhdGlvbiAKKyAgICAgICAgICBMYXllciksIG9yIGl0IG1heSB1c2UgYSBMdWNlbmUtYmFzZWQgQ2F0YWxvZyBhbmQgYSBkYXRhYmFzZS1iYXNlZCBWYWxpZGF0aW9uIAorICAgICAgICAgIExheWVyLjwvZGl2PiAKKyAgICAgICAgICAKKyAgICAgICAgICA8cD5Vc2luZyBleHRlbnNpb24gcG9pbnRzLCBpdCBpcyBmYWlybHkgc2ltcGxlIHRvIHN1cHBvcnQgbWFueSBkaWZmZXJlbnQgdHlwZXMgCisgICAgICAgICAgb2Ygd2hhdCBhcmUgdHlwaWNhbGx5IHJlZmVycmVkIHRvIGFzICJwbHVnLWluIGFyY2hpdGVjdHVyZXMuIiBFYWNoIG9mIHRoZSBjb3JlIAorICAgICAgICAgIGV4dGVuc2lvbiBwb2ludHMgZm9yIHRoZSBGaWxlIE1hbmFnZXIgaXMgZGVzY3JpYmVkIGJlbG93OjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5DYXRhbG9nPC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBDYXRhbG9nIGV4dGVuc2lvbiBwb2ludCBpcyByZXNwb25zaWJsZSBmb3Igc3RvcmluZyBhbGwgdGhlIAorICAgICAgICAgICAgICBpbnN0YW5jZSBkYXRhIGZvciBQcm9kdWN0cywgTWV0YWRhdGEsIGFuZCBmb3IgZmlsZSBSZWZlcmVuY2VzLiAKKyAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB0aGUgQ2F0YWxvZyBwcm92aWRlcyBhIHF1ZXJ5IGNhcGFiaWxpdHkgZm9yIFByb2R1Y3RzLgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPkRhdGEgVHJhbnNmZXI8L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIERhdGEgVHJhbnNmZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBmb3IgdGhlIG1vdmVtZW50IG9mIGEgCisgICAgICAgICAgICAgIFByb2R1Y3QgdG8gYW5kIGZyb20gdGhlIGFyY2hpdmUgbWFuYWdlZCBieSB0aGUgRmlsZSBNYW5hZ2VyIGNvbXBvbmVudC4gCisgICAgICAgICAgICAgIERpZmZlcmVudCBwcm90b2NvbHMgZm9yIERhdGEgVHJhbnNmZXIgbWF5IGluY2x1ZGUgbG9jYWwgKGRpc2stYmFzZWQpIAorICAgICAgICAgICAgICBjb3B5LCBvciByZW1vdGUgWE1MLVJQQyBiYXNlZCB0cmFuc2ZlciBhY3Jvc3MgbmV0d29ya2VkIG1hY2hpbmVzLgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPlJlcG9zaXRvcnkgTWFuYWdlcjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgUmVwb3NpdG9yeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIG1lYW5zIGZvciAKKyAgICAgICAgICAgICAgbWFuYWdpbmcgYWxsIG9mIHRoZSBwb2xpY3kgaW5mb3JtYXRpb24gKGkuZS4sIHRoZSBQcm9kdWN0IFR5cGVzIGFuZCAKKyAgICAgICAgICAgICAgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbikgZm9yIFByb2R1Y3RzIG1hbmFnZWQgYnkgdGhlIEZpbGUgTWFuYWdlci4gCisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+VmFsaWRhdGlvbiBMYXllcjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgVmFsaWRhdGlvbiBMYXllciBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGZvciB0aGUgcXVlcnlpbmcgb2YgCisgICAgICAgICAgICAgIGVsZW1lbnQgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBQcm9kdWN0IFR5cGUuIFRoZSAKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uIHBvaW50IGFsc28gbWFwcyBQcm9kdWN0IFR5cGUgdG8gRWxlbWVudHMuCisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPlZlcnNpb25pbmc8L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIFZlcnNpb25pbmcgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBmb3IgdGhlIGRlZmluaXRpb24gb2YgCisgICAgICAgICAgICAgIGRpZmZlcmVudCBVUkkgZ2VuZXJhdGlvbiBzY2hlbWVzIHRoYXQgZGVmaW5lIHRoZSBmaW5hbCByZXN0aW5nIGxvY2F0aW9uIAorICAgICAgICAgICAgICBvZiBmaWxlcyBmb3IgYSBwYXJ0aWN1bGFyIFByb2R1Y3QuCisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPlN5c3RlbTwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgZXh0ZW5zaW9uIHBvaW50IHRoYXQgcHJvdmlkZXMgdGhlIGV4dGVybmFsIGludGVyZmFjZSB0byB0aGUgCisgICAgICAgICAgICAgIEZpbGUgTWFuYWdlciBzZXJ2aWNlcy4gVGhpcyBpbmNsdWRlcyB0aGUgRmlsZSBNYW5hZ2VyIHNlcnZlciBpbnRlcmZhY2UsIAorICAgICAgICAgICAgICBhcyB3ZWxsIGFzIHRoZSBhc3NvY2lhdGVkIEZpbGUgTWFuYWdlciBjbGllbnQgaW50ZXJmYWNlLCB0aGF0IAorICAgICAgICAgICAgICBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgc2VydmVyLgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4gICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICA8L3NlY3Rpb24+CisgICAgICAgCisgICAgICAgPGEgbmFtZT0ic2VjdGlvbjQiLz4gICAKKyAgICAgICA8c2VjdGlvbiBuYW1lPSJDdXJyZW50IEV4dGVuc2lvbiBQb2ludCBJbXBsZW1lbnRhdGlvbnMiPgorICAgICAgICAKKyAgICAgICAgIDxwPlRoZXJlIGFyZSBhdCBsZWFzdCB0d28gaW1wbGVtZW50YXRpb25zIG9mIGFsbCBvZiB0aGUgYWZvcmVtZW50aW9uZWQgCisgICAgICAgICBleHRlbnNpb24gcG9pbnRzIGZvciB0aGUgRmlsZSBNYW5hZ2VyLiBFYWNoIGV4dGVuc2lvbiBwb2ludCBpbXBsZW1lbnRhdGlvbiAKKyAgICAgICAgIGlzIGRldGFpbGVkIGluIHRoaXMgc2VjdGlvbi48L3A+CisKKyAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsb2ciPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT48c3Ryb25nPkRhdGEgU291cmNlIGJhc2VkIENhdGFsb2cuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIAorICAgICAgICAgICAgIHRoZSBDYXRhbG9nIGV4dGVuc2lvbiBwb2ludCBpbnRlcmZhY2UgdGhhdCB1c2VzIGEgSkRCQyBhY2Nlc3NpYmxlIGRhdGFiYXNlIAorICAgICAgICAgICAgIGJhY2tlbmQuPC9saT4KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICA8bGk+PHN0cm9uZz5MdWNlbmUgYmFzZWQgQ2F0YWxvZy48L3N0cm9uZz4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIAorICAgICAgICAgICAgIENhdGFsb2cgZXh0ZW5zaW9uIHBvaW50IGludGVyZmFjZSB0aGF0IHVzZXMgdGhlIAorICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9sdWNlbmUuYXBhY2hlLm9yZy8iPkx1Y2VuZTwvYT4gZnJlZSB0ZXh0IGluZGV4IHN5c3RlbSB0byAKKyAgICAgICAgICAgICBzdG9yZSBQcm9kdWN0IGluc3RhbmNlIGluZm9ybWF0aW9uLjwvbGk+CisgICAgICAgICAgIDwvdWw+CisgICAgICAgICA8L3N1YnNlY3Rpb24+IAorICAgICAgICAgCisgICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEYXRhIFRyYW5zZmVyIj4KKyAgICAgICAgICAgICA8dWw+ICAgCisgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5Mb2NhbCBEYXRhIFRyYW5zZmVyLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGF0YSAKKyAgICAgICAgICAgICAgIFRyYW5zZmVyIGludGVyZmFjZSB0aGF0IHVzZXMgQXBhY2hlJ3MgCisgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMtaW8vIj5jb21tb25zLWlvPC9hPiB0byBwZXJmb3JtIAorICAgICAgICAgICAgICAgbG9jYWwsIGRpc2sgYmFzZWQgZmlsZXN5c3RlbSBkYXRhIHRyYW5zZmVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGFsc28gCisgICAgICAgICAgICAgICBzdXBwb3J0cyBsb2NhbGx5IGFjY2Vzc2libGUgTmV0d29yayBGaWxlIFN5c3RlbSAoTkZTKSBkaXNrcy48L2xpPgorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5SZW1vdGUgRGF0YSBUcmFuc2Zlci48L3N0cm9uZz4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERhdGEgCisgICAgICAgICAgICAgICBUcmFuc2ZlciBpbnRlcmZhY2UgdGhhdCB1c2VzIHRoZSBYTUwtUlBDIEZpbGUgTWFuYWdlciBjbGllbnQgdG8gdHJhbnNmZXIgCisgICAgICAgICAgICAgICBmaWxlcyB0byBhIHJlbW90ZSBYTUwtUlBDIEZpbGUgTWFuYWdlciBzZXJ2ZXIuPC9saT4KKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+SW5QbGFjZSBEYXRhIFRyYW5zZmVyLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGF0YSAKKyAgICAgICAgICAgICAgIFRyYW5zZmVyIGludGVyZmFjZSB0aGF0IGF2b2lkcyB0cmFuc2ZlcmluZyBhbnkgcHJvZHVjdHMgLS0gdGhpcyBjYW4gYmUgdXNlZCAKKyAgICAgICAgICAgICAgIGluIHRoZSBzaXR1YXRpb24gd2hlcmUgbWV0YWRhdGEgYWJvdXQgYSBwYXJ0aWN1bGFyIHByb2R1Y3Qgc2hvdWxkIGJlIAorICAgICAgICAgICAgICAgcmVjb3JkZWQsIGJ1dCBubyBwaHlzaWNhbCB0cmFuc2ZlciBuZWVkcyB0byBvY2N1ci48L2xpPgorICAgICAgICAgICAgIDwvdWw+ICAgICAKKyAgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgICAgIAorICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUmVwb3NpdG9yeSBNYW5hZ2VyIj4KKyAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5EYXRhIFNvdXJjZSBiYXNlZCBSZXBvc2l0b3J5IE1hbmFnZXIuPC9zdHJvbmc+IEFuIAorICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJlcG9zaXRvcnkgTWFuYWdlciBleHRlbnNpb24gcG9pbnQgdGhhdCBzdG9yZXMgCisgICAgICAgICAgICAgICBQcm9kdWN0IFR5cGUgcG9saWN5IGluZm9ybWF0aW9uIGluIGEgSkRCQyBhY2Nlc3NpYmxlIGRhdGFiYXNlLjwvbGk+CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPlhNTCBiYXNlZCBSZXBvc2l0b3J5IE1hbmFnZXIuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIAorICAgICAgICAgICAgICAgdGhlIFJlcG9zaXRvcnkgTWFuYWdlciBleHRlbnNpb24gcG9pbnQgdGhhdCBzdG9yZXMgUHJvZHVjdCBUeXBlIHBvbGljeSAKKyAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGluIGFuIFhNTCBmaWxlIGNhbGxlZCA8Y29kZT5wcm9kdWN0LXR5cGVzLnhtbDwvY29kZT48L2xpPgorICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAgICAKKyAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlZhbGlkYXRpb24gTGF5ZXIiPgorICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPkRhdGEgU291cmNlIGJhc2VkIFZhbGlkYXRpb24gTGF5ZXIuPC9zdHJvbmc+IEFuIAorICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFZhbGlkYXRpb24gTGF5ZXIgZXh0ZW5zaW9uIHBvaW50IHRoYXQgc3RvcmVzIAorICAgICAgICAgICAgICAgRWxlbWVudCBwb2xpY3kgaW5mb3JtYXRpb24gaW4gYSBKREJDIGFjY2Vzc2libGUgZGF0YWJhc2UuPC9saT4KKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+WE1MIGJhc2VkIFZhbGlkYXRpb24gTGF5ZXIuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIAorICAgICAgICAgICAgICAgdGhlIFZhbGlkYXRpb24gTGF5ZXIgZXh0ZW5zaW9uIHBvaW50IHRoYXQgc3RvcmVzIEVsZW1lbnQgcG9saWN5IAorICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaW4gMiBYTUwgZmlsZXMgY2FsbGVkIDxjb2RlPmVsZW1lbnRzLnhtbDwvY29kZT4gYW5kIAorICAgICAgICAgICAgICAgPGNvZGU+cHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbDwvY29kZT48L2xpPgorICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAgICAKKyAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlN5c3RlbSAoRmlsZSBNYW5hZ2VyIGNsaWVudCBhbmQgRmlsZSBNYW5hZ2VyIHNlcnZlcikiPiAgICAgICAgCisgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+WE1MLVJQQyBiYXNlZCBGaWxlIE1hbmFnZXIgc2VydmVyLjwvc3Ryb25nPiBBbiAKKyAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBzZXJ2ZXIgaW50ZXJmYWNlIGZvciB0aGUgRmlsZSBNYW5hZ2VyIHRoYXQgCisgICAgICAgICAgICAgICB1c2VzIFhNTC1SUEMgYXMgdGhlIHRyYW5zcG9ydGF0aW9uIG1lZGl1bS48L2xpPgorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5YTUwtUlBDIGJhc2VkIEZpbGUgTWFuYWdlciBjbGllbnQuPC9zdHJvbmc+IEFuIAorICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBYTUwtUlBDIEZpbGUgTWFuYWdlciAKKyAgICAgICAgICAgICAgIHNlcnZlciB0aGF0IHVzZXMgWE1MLVJQQyBhcyB0aGUgdHJhbnNwb3J0YXRpb24gbWVkaXVtLjwvbGk+CisgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgIDwvc3Vic2VjdGlvbj4gCisgICAgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPHNlY3Rpb24gbmFtZT0iVXNlIENhc2VzIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgVGhlIEZpbGUgTWFuYWdlciB3YXMgYnVpbHQgdG8gc3VwcG9ydCBzZXZlcmFsIG9mIHRoZSBhYm92ZSBjYXBhYmlsaXRpZXMgb3V0bGluZWQgaW4gCisgICAgICAgICAgU2VjdGlvbiAzLiBJbiBwYXJ0aWN1bGFyIHRoZXJlIHdlcmUgc2V2ZXJhbCB1c2UgY2FzZXMgdGhhdCB3ZSB3YW50ZWQgdG8gc3VwcG9ydCwgc29tZSAKKyAgICAgICAgICBvZiB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93LiAgICAgICAgCisgICAgICAgIDwvcD4KKyAgICAgIAorICAgICAgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9mbV91c2VfY2FzZTEucG5nIiBhbHQ9IkZpbGUgTWFuYWdlciBJbmdlc3QgVXNlIENhc2UiLz4KKyAgICAgICAgIAorICAgICAgICAgPHA+VGhlIHJlZCBudW1iZXJzIGluIHRoZSBhYm92ZSBGaWd1cmUgY29ycmVzcG9uZCB0byBhIHNlcXVlbmNlIG9mIHN0ZXBzIHRoYXQgb2NjdXJzIGFuZCBhIAorICAgICAgICAgc2VyaWVzIG9mIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgRmlsZSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludHMgaW4gb3JkZXIgdG8gCisgICAgICAgICBwZXJmb3JtIHRoZSBmaWxlIGluZ2VzdGlvbiBhY3Rpdml0eS4gSW4gU3RlcCAxLCBhIEZpbGUgTWFuYWdlciBjbGllbnQgaXMgaW52b2tlZCBmb3IgdGhlIAorICAgICAgICAgaW5nZXN0IG9wZXJhdGlvbiwgd2hpY2ggc2VuZHMgTWV0YWRhdGEgYW5kIFJlZmVyZW5jZXMgZm9yIGEgcGFydGljdWxhciBQcm9kdWN0IHRvIGluZ2VzdCAKKyAgICAgICAgIHRvIHRoZSBGaWxlIE1hbmFnZXIgc2VydmVy4oCZcyBTeXN0ZW0gSW50ZXJmYWNlIGV4dGVuc2lvbiBwb2ludC4gVGhlIFN5c3RlbSBJbnRlcmZhY2UgdXNlcyAKKyAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBQcm9kdWN0IFR5cGUgcG9saWN5IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBSZXBvc2l0b3J5IE1hbmFnZXIgaW4gb3JkZXIgCisgICAgICAgICB0byB1bmRlcnN0YW5kIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9kdWN0IHNob3VsZCBiZSB0cmFuc2ZlcnJlZCwgd2hlcmUgaXTigJlzIHJvb3QgcmVwb3NpdG9yeSAKKyAgICAgICAgIHBhdGggc2hvdWxkIGJlLCBhbmQgc28gb24uIFRoZSBTeXN0ZW0gSW50ZXJmYWNlIHRoZW4gY2F0YWxvZ3MgdGhlIGZpbGUgUmVmZXJlbmNlcyBhbmQgTWV0YWRhdGEgCisgICAgICAgICB1c2luZyB0aGUgQ2F0YWxvZyBleHRlbnNpb24gcG9pbnQuIER1cmluZyB0aGlzIGNhdGFsb2cgcHJvY2VzcywgdGhlIENhdGFsb2cgZXh0ZW5zaW9uIHBvaW50IAorICAgICAgICAgdXNlcyB0aGUgVmFsaWRhdGlvbiBMYXllciB0byBkZXRlcm1pbmUgd2hpY2ggRWxlbWVudHMgc2hvdWxkIGJlIGV4dHJhY3RlZCBmb3IgdGhlIHBhcnRpY3VsYXIgCisgICAgICAgICBQcm9kdWN0LCBiYXNlZCB1cG9uIGl0cyBQcm9kdWN0IFR5cGUuIEFmdGVyIHRoYXQsIERhdGEgVHJhbnNmZXIgaXMgaW5pdGlhdGVkIGVpdGhlciBhdCB0aGUgCisgICAgICAgICBjbGllbnQgb3Igc2VydmVyIGVuZCwgYW5kIHRoZSBmaXJzdCBzdGVwIHRvIERhdGEgVHJhbnNmZXIgaXMgdXNpbmcgdGhlIFByb2R1Y3TigJlzIGFzc29jaWF0ZWQgCisgICAgICAgICBWZXJzaW9uZXIgdG8gZ2VuZXJhdGUgZmluYWwgZmlsZSBSZWZlcmVuY2VzLiBBZnRlciBmaW5hbCBmaWxlIFJlZmVyZW5jZXMgaGF2ZSBiZWVuIGRldGVybWluZWQsIAorICAgICAgICAgdGhlIGZpbGUgZGF0YSBpcyB0cmFuc2ZlcnJlZCBieSB0aGUgc2VydmVyIG9yIGJ5IHRoZSBjbGllbnQsIHVzaW5nIHRoZSBEYXRhIFRyYW5zZmVyIGV4dGVuc2lvbiAKKyAgICAgICAgIHBvaW50LjwvcD4KKyAgICAgIDwvc2VjdGlvbj4gICAgICAKKyAgICAgIAorICAgICAgPHNlY3Rpb24gbmFtZT0iQ29uY2x1c2lvbiI+CisgICAgICA8cD5UaGUgYWltIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiByZWxldmFudCB0byBkZXZlbG9wZXJzCisgICAgICBhYm91dCB0aGUgQ0FTIEZpbGUgTWFuYWdlci4gU3BlY2lmaWNhbGx5LCB0aGlzIGRvY3VtZW50IGhhcyBkZXNjcmliZWQgdGhlIEZpbGUgCisgICAgICBNYW5hZ2VyJ3MgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgaXRzIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMsIG9iamVjdCBtb2RlbCBhbmQKKyAgICAgIGtleSBjYXBhYmlsaXRpZXMuIEFkZGl0aW9uYWxseSwgdGhlIHRoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIAorICAgICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEZpbGUgTWFuYWdlcidzIGV4dGVuc2lvbiBwb2ludHMuPC9wPiAKKyAgICAgIAorICAgICAgPHA+SW4gdGhlIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+QmFzaWMgVXNlciBHdWlkZTwvYT4gYW5kIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBVc2VyIEd1aWRlPC9hPiwgd2Ugd2lsbCBjb3ZlciB0b3BpY3MKKyAgICAgIGxpa2UgaW5zdGFsbGF0aW9uLCBjb25maWd1cmF0aW9uLCBhbmQgZXhhbXBsZSB1c2VzIGFzIHdlbGwgYXMgYWR2YW5jZWQgdG9waWNzCisgICAgICBsaWtlIHNjYWxpbmcgYW5kIG90aGVyIHRpcHMgYW5kIHRyaWNrcy48L3A+IAorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisKKyAgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9tYXZlbi54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9tYXZlbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRhZDAyMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L21hdmVuLnhtbApAQCAtMCwwICsxLDE3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5Vc2luZyBNYXZlbjwvdGl0bGU+CisgICAgPGF1dGhvciBlbWFpbD0id29vbGxhcmRAanBsLm5hc2EuZ292Ij5EYXZpZCBXb29sbGFyZDwvYXV0aG9yPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iVXNpbmcgTWF2ZW4iPgorICAgICAgPHA+T09EVCB1c2VzIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+TWF2ZW48L2E+IGZvciAKKyAgICAgIG1hbmFnaW5nIG91ciBidWlsZCBlbnZpcm9ubWVudC4gTWF2ZW4gaXMgYW4gb3BlbiBzb3VyY2UgcHJvZHVjdCBmcm9tIHRoZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPiB0aGF0IGltcHJvdmVzIAorICAgICAgb24gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiBpbiB0aGUgYXJlYSBvZiBidWlsZCBtYW5hZ2VtZW50LCAKKyAgICAgIHdoaWNoIGl0IHR1cm4gd2FzIGFuIGltcHJvdmVtZW50IG9uIE1ha2UuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgCisgICAgICBNYXZlbiBmb3IgQXBhY2hlIE9PRFQgYnVpbGQgbWFuYWdlbWVudC48L3A+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9IlNldHVwIj4KKyAgICAgIDxwPk1hdmVuIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlIAorICAgICAgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCI+TWF2ZW4gRG93bmxvYWQ8L2E+IAorICAgICAgcGFnZS4gT09EVCBpcyB1c2luZyB2ZXJzaW9uIDIuMCBhbmQgYWJvdmUuIE1hdmVuIHdhcyBkZXZlbG9wZWQgaW4gSmF2YSBzbyBpdCAKKyAgICAgIHdpbGwgcnVuIG9uIHRoZSBwb3B1bGFyIHBsYXRmb3JtcyAoZS5nLiwgV2luZG93cywgTWFjIE9TWCwgZXRjLikuIEJleW9uZCAKKyAgICAgIG1ha2luZyBzdXJlIHRoZSA8aT5tdm48L2k+IGV4ZWN1dGFibGUgaXMgaW4geW91ciBwYXRoLCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSAKKyAgICAgIHNldHVwIHJlcXVpcmVkLjwvcD4KKworICAgICAgPHA+TWF2ZW4gaXMgYmFzZWQgb24gdGhlIGNvbmNlcHQgb2YgYSBQcm9qZWN0IE9iamVjdCBNb2RlbCAoUE9NKSB3aGljaCBpcyAKKyAgICAgIGNvbnRhaW5lZCBpbiB0aGUgPGk+cG9tLnhtbDwvaT4gZmlsZSBmb3VuZCBhdCB0aGUgcm9vdCBvZiBlYWNoIHByb2plY3QuIAorICAgICAgVGhlIFBPTSBhbGxvd3MgTWF2ZW4gdG8gbWFuYWdlIGEgcHJvamVjdCdzIGJ1aWxkLCByZXBvcnRpbmcgYW5kIGRvY3VtZW50YXRpb24uIAorICAgICAgRm9yIE9PRFQsIG11Y2ggb2YgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIG1hbmFnaW5nIHRoZSBwcm9qZWN0cyBpcyAKKyAgICAgIGNvbnRhaW5lZCBpbiBhIHBhcmVudCBQT00sIHdoaWNoIGlzIGxvY2F0ZWQgaW4gdGhlIDxpPm9vZHQtY29yZTwvaT4gcHJvamVjdC4gU28sIAorICAgICAgaW4gb3JkZXIgdG8gYnVpbGQgYW55IG9mIHRoZSBvdGhlciBwcm9qZWN0cyAoZS5nLiwgY2FzLWN1cmF0b3IsIGNhcy1maWxlbWdyLCAKKyAgICAgIGV0Yy4pIHRoZSBwYXJlbnQgUE9NIG11c3QgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBPT0RUIE1hdmVuIHJlcG9zaXRvcnkuIFRoZSAKKyAgICAgIGxvY2FsIDxpPnBvbS54bWw8L2k+IGZpbGVzIGZvciBlYWNoIG9mIHRoZSBwcm9qZWN0cyBoYXZlIGJlZW4gY29uZmlndXJlZCB0byAKKyAgICAgIHJldHJpZXZlIHRoZSBwYXJlbnQgUE9NIGF1dG9tYXRpY2FsbHkuPC9wPgorICAgICAgCisgICAgICA8cD5PbmNlIE1hdmVuIGhhcyBiZWVuIHNldHVwLCB0aGUgZmlyc3Qgc3RlcCB0byBidWlsZGluZyBhIHByb2plY3Qgd2l0aCBNYXZlbiAKKyAgICAgIGlzIHRvIGNoZWNrb3V0IGEgcHJvamVjdCdzIHNvdXJjZSBjb2RlIGludG8gdGhlIGRldmVsb3BlcidzIHdvcmsgYXJlYS4gU2VlIHRoZSAKKyAgICAgIDxhIGhyZWY9Ii4uL2RldmVsb3BtZW50L3N1YnZlcnNpb24uaHRtbCI+VXNpbmcgU3VidmVyc2lvbjwvYT4gZG9jdW1lbnQgZm9yIGhvdyB0byAKKyAgICAgIGNoZWNrIG91dCBwcm9qZWN0cyBmcm9tIHRoZSBDTSByZXBvc2l0b3J5LjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iUHJvamVjdCBTdHJ1Y3R1cmUiPgorICAgICAgPHA+SW4gb3JkZXIgZm9yIGRlZmF1bHQgTWF2ZW4gZnVuY3Rpb25zIHRvIG9wZXJhdGUgcHJvcGVybHksIHRoZXJlIGlzIGEgCisgICAgICBzdWdnZXN0ZWQgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6PC9wPgorICAgICAgCisgICAgICA8c291cmNlPgorLworICBzcmMvICAgICAgICAgICAgIFNvdXJjZSBDb2RlIChldmVyeXRoaW5nKQorICAgIG1haW4vICAgICAgICAgICAgUHJvZ3JhbSBTb3VyY2UKKyAgICAgIGFzc2VtYmx5LyAgICAgICAgUGFja2FnZSBEZXNjcmlwdG9yCisgICAgICBqYXZhLyAgICAgICAgICAgIEphdmEgU291cmNlCisgICAgICByZXNvdXJjZXMvICAgICAgIFNjcmlwdHMsIENvbmZpZyBGaWxlLCBldGMuCisgICAgICAgIC4uLgorICAgIHRlc3QvICAgICAgICAgICAgVGVzdCBTb3VyY2UKKyAgICAgIGphdmEvCisgICAgICByZXNvdXJjZXMvCisgICAgICAgIC4uLgorICAgIHNpdGUvICAgICAgICAgICAgU2l0ZSBEb2N1bWVudGF0aW9uCisgICAgICBhcHQvICAgICAgICAgICAgIERvY3MgaW4gQVBUIEZvcm1hdAorICAgICAgICBpbmRleC5hcHQKKyAgICAgICAgLi4uCisgICAgICB4ZG9jLyAgICAgICAgICAgIERvY3MgaW4gWERPQyBGb3JtYXQKKyAgICAgICAgaW5kZXgueG1sCisgICAgICAgIC4uLgorICAgICAgcmVzb3VyY2VzLworICAgICAgICBpbWFnZXMvCisgICAgICBzaXRlLnhtbCAgICAgICAgIE1lbnUgU3RydWN0dXJlCisKKyAgdGFyZ2V0LyAgICAgICAgICBCdWlsZCBSZXN1bHRzIChiaW5hcmllcywgZG9jcyBhbmQgcGFja2FnZXMpCisgICAgLi4uCisKKyAgTElDRU5TRS50eHQKKyAgUkVBRE1FLnR4dAorICBwb20ueG1sICAgICAgICAgIFByb2plY3QgT2JqZWN0IE1vZGVsIChQT00pCisgICAgICA8L3NvdXJjZT4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgQ29tbWFuZHMiPgorICAgIDxwPlRoZXJlIGFyZSBmZXcgc3RhbmRhcmQgY29tbWFuZHMgdGhhdCBkZXZlbG9wZXJzIHdpbGwgdXNlIG9uIGEgZGFpbHkgYmFzaXMgCisgICAgYW5kIHRoZXkgYXJlIHJlbGF0ZWQgdG8gYnVpbGRpbmcgYW5kIGNsZWFuaW5nIGEgcHJvamVjdC48L3A+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGQgYSBQcm9qZWN0Ij4KKyAgICAgIDxwPkJ1aWxkIHRoZSBwcm9qZWN0J3MgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgCisgICAgICBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gY29tcGlsZQorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCB3aWxsIGdlbmVyYXRlIHRoZSBhcnRpZmFjdHMgaW4gdGhlIDxpPnRhcmdldC88L2k+IAorICAgICAgZGlyZWN0b3J5LjwvcD4gICAgICAKKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iSW5zdGFsbCBhIFByb2plY3QiPgorICAgICAgPHA+SW5zdGFsbCB0aGUgcHJvamVjdCdzIGFydGlmYWN0cyBsb2NhbGx5IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gaW5zdGFsbAorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5QcmlvciB0byBpbnN0YWxsYXRpb24sIHRoZSBhYm92ZSBjb21tYW5kIHdpbGwgY29tcGlsZSB0aGUgc291cmNlIGNvZGUsIAorICAgICAgaWYgbmVjZXNzYXJ5LCBhbmQgZXhlY3V0ZSB0aGUgdW5pdCB0ZXN0cy4gVGhlIHJlc3VsdCBvZiB0aGUgYWJvdmUgY29tbWFuZCAKKyAgICAgIGlzIHRvIGluc3RhbGwgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHMgKGUuZy4gcG9tLCBqYXIsIGV0Yy4pIGluIHRoZSB1c2VyJ3MgCisgICAgICBsb2NhbCBNYXZlbiByZXBvc2l0b3J5ICgkSE9NRS8ubTIvcmVwb3NpdG9yeS8pLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSAKKyAgICAgIGFydGlmYWN0IGlzIGEgZGVwZW5kZW5jeSBmb3IgYW5vdGhlciBwcm9qZWN0IGJ1dCBoYXMgeWV0IHRvIGJlIGRlcGxveWVkIAorICAgICAgdG8gdGhlIE1hdmVuIHJlcG9zaXRvcnkuPC9wPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJQYWNrYWdlIGEgUHJvamVjdCI+CisgICAgICA8cD5DcmVhdGUgdGhlIHByb2plY3QncyBkaXN0cmlidXRpb24gcGFja2FnZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIHBhY2thZ2UKKyAgICAgIDwvc291cmNlPgorICAgICAgPHA+UHJpb3IgdG8gcGFja2FnZSBjcmVhdGlvbiwgdGhlIGFib3ZlIGNvbW1hbmQgd2lsbCBjb21waWxlIHRoZSBzb3VyY2UgCisgICAgICBjb2RlLCBpZiBuZWNlc3NhcnksIGFuZCBleGVjdXRlIHRoZSB1bml0IHRlc3RzLiBUaGUgYWJvdmUgY29tbWFuZCB3aWxsIAorICAgICAgY3JlYXRlIHRoZSBwYWNrYWdlKHMpIGluIHRoZSB0YXJnZXQvIGRpcmVjdG9yeS48L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkJ1aWxkIGEgUHJvamVjdCdzIFdlYiBTaXRlIj4KKyAgICAgIDxwPkJ1aWxkIHRoZSBwcm9qZWN0J3Mgd2ViIHNpdGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBzaXRlCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlRoZSBhYm92ZSBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIHdlYiBzaXRlIGluIHRoZSA8aT50YXJnZXQvc2l0ZS88L2k+CisgICAgICBkaXJlY3RvcnkuIFZpZXcgdGhlIHNpdGUgYnkgcG9pbnRpbmcgeW91ciB3ZWIgYnJvd3NlciBhdCB0aGUgCisgICAgICA8aT5pbmRleC5odG1sPC9pPiBmaWxlIHdpdGhpbiB0aGF0IGRpcmVjdG9yeS48L3A+CisgICAgPC9zdWJzZWN0aW9uPiAKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJDbGVhbiBhIFByb2plY3QiPgorICAgICAgPHA+Q2xlYW4gb3V0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBvZiBnZW5lcmF0ZWQgYXJ0aWZhY3RzIHdpdGggdGhlIAorICAgICAgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBjbGVhbgorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCB3aWxsIHJlbW92ZSB0aGUgPGk+dGFyZ2V0LzwvaT4gZGlyZWN0b3J5IGFuZCBpdHMgCisgICAgICBjb250ZW50cy48L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IlVzZWZ1bCBDb21tYW5kIEFyZ3VtZW50cyI+CisgICAgICA8cD5UaGVyZSBhIGNvdXBsZSBvZiB1c2VmdWwgYXJndW1lbnRzIHdoaWNoIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgCisgICAgICBjb21tYW5kcyBhYm92ZSB0byBsaW1pdCB0aGUgc2NvcGUgb2YgdGhlIGNvbW1hbmQuPC9wPgorICAgICAgPHA+SW4gb3JkZXIgdG8gc2tpcCB1bml0IHRlc3QgZXhlY3V0aW9uLCBhZGQgdGhlIGZvbGxvd2luZyBhcmd1bWVudDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIFtjb21tYW5kXSAtRG1hdmVuLnRlc3Quc2tpcD10cnVlCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlRoZSBhYm92ZSBjb21tYW5kIGlzIG1vc3QgdXNlZnVsIHdpdGggdGhlIDxpPmluc3RhbGw8L2k+LCAKKyAgICAgIDxpPnBhY2thZ2U8L2k+IGFuZCA8aT5zaXRlPC9pPiBjb21tYW5kcy48L3A+CisgICAgICA8cD5XaGVuIGEgcHJvamVjdCBoYXMgbW9kdWxlcyBkZWZpbmVkIGluIHRoZSBQT00sIHRoZSBjb21tYW5kIGNhbiBiZSAKKyAgICAgIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgbW9kdWxlcyBieSAKKyAgICAgIGFkZGluZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50OjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gW2NvbW1hbmRdIC0tbm9uLXJlY3Vyc2l2ZQorICAgICAgPC9zb3VyY2U+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBuYW1lPSJBY2tub3dsZWRnbWVudHMiPgorICAgICAgPHA+TXVjaCBvZiB0aGUgbWF0ZXJpYWwgaW4gdGhpcyBNYXZlbiBndWlkZSB3YXMgb3JpZ2luYWxseSBhdXRob3JlZCAKKyAgICAgIGJ5IFNlYW4gSGFyZG1hbiB1bmRlciB0aGUgc3BvbnNvcnNoaXAgb2YgTkFTQSBKZXQgUHJvcHVsc2lvbiAKKyAgICAgIExhYm9yYXRvcnkncyBQbGFuZXRhcnkgRGF0YSBTeXN0ZW0uIDwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iUmVmZXJlbmNlcyI+CisgICAgICA8cD5IZXJlIGlzIGEgbGlzdCBvZiBNYXZlbiByZXNvdXJjZXM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL2luZGV4Lmh0bWwiPk9ubGluZSAKKyAgICAgICAgRG9jdW1lbnRhdGlvbiBJbmRleDwvYT48L2xpPgorICAgICAgPC91bD4KKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUveGRvYy91c2VyL2FkdmFuY2VkLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS94ZG9jL3VzZXIvYWR2YW5jZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzg2OTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3NpdGUveGRvYy91c2VyL2FkdmFuY2VkLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgIDxwcm9wZXJ0aWVzPgorICAgICAgPHRpdGxlPkNBUyBGaWxlIE1hbmFnZXIgVXNlciBHdWlkZTwvdGl0bGU+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmUgV29vbGxhcmQ8L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj5UaGlzIGRvY3VtZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlb3JnYW5pemVkIGFzCisgICAgICBwYXJ0IG9mIG91ciBvbmdvaW5nIGRvY3VtZW50YXRpb24gZWZmb3J0LiBQbGVhc2UgY2hlY2sgYmFjayBmb3IgdXBkYXRlcy48L2Rpdj4gIAorICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgCisgICAgICA8cD5JbiB0aGUgQ0FTIEZpbGUgTWFuYWdlciBBZHZhbmNlZCBVc2VyIEd1aWRlLCB3ZSB3aWxsIGNvdmVyIGEgbnVtYmVyIG9mIAorICAgICAgYWR2YW5jZWQgdG9waWNzIHJlbGF0ZWQgdG8gdXNpbmcgdGhlIENBUyBGaWxlIE1hbmFnZXIsIGluY2x1ZGluZyBzaXR1YXRpb25zCisgICAgICB0aGF0IGhhdmUgYXJpc2VuIGluIHRoZSBhdXRob3JzJyBleHBlcmllbmNlcyByZWdhcmRpbmcgdGhlIHVzZSBvZiBtdWx0aXBsZQorICAgICAgY2F0YWxvZ3Mgd2l0aGluIGEgc2luZ2UgRmlsZSBNYW5hZ2VyLCBhZGRyZXNzIHNjYWxpbmcgaXNzdWVzLCBldGMuIEJhc2ljCisgICAgICBjb25jZXB0cywgc3VjaCBhcyBpbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24sIGNhbiBiZSBmb3VuZCBpbiB0aGUgCisgICAgICA8YSBocmVmPSIuLi91c2VyL2Jhc2ljLmh0bWwiPkJhc2ljIFVzZXIgR3VpZGU8L2E+LjwvcD4KKyAgICAgIAorICAgICAgPHA+VGhlIHJlbWFpbmRlciBvZiB0aGlzIGd1aWRlIGlzIHNlcGFyYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24xIj5NdWx0aXBsZSBDYXRhbG9nIENvbmZpZ3VyYXRpb248L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMiI+U2NhbGluZyBJc3N1ZXM8L2E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjEiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9Ik11bHRpcGxlIENhdGFsb2cgQ29uZmlndXJhdGlvbiI+CisgICAgICA8cD5Db21pbmcgU29vbi4uLjwvcD4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjIiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlNjYWxpbmcgSXNzdWVzIj4KKyAgICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICA8L2JvZHk+Cis8L2RvY3VtZW50PiAKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS94ZG9jL3VzZXIvYmFzaWMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3hkb2MvdXNlci9iYXNpYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4MmM3YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS94ZG9jL3VzZXIvYmFzaWMueG1sCkBAIC0wLDAgKzEsMzYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgIDxwcm9wZXJ0aWVzPgorICAgICAgPHRpdGxlPkNBUyBGaWxlIE1hbmFnZXIgVXNlciBHdWlkZTwvdGl0bGU+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmUgV29vbGxhcmQ8L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj5UaGlzIGRvY3VtZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlb3JnYW5pemVkIGFzCisgICAgICBwYXJ0IG9mIG91ciBvbmdvaW5nIGRvY3VtZW50YXRpb24gZWZmb3J0LiBQbGVhc2UgY2hlY2sgYmFjayBmb3IgdXBkYXRlcy48L2Rpdj4KKyAgICAgIAorICAgICAgPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKyAgICAgIAorICAgICAgPHA+VGhpcyBkb2N1bWVudCBzZXJ2ZXMgYXMgYSBiYXNpYyB1c2VyJ3MgZ3VpZGUgZm9yIHRoZSBDQVMgRmlsZSBNYW5hZ2VyIAorICAgICAgcHJvamVjdC4gVGhlIGdvYWwgb2YgdGhlIGRvY3VtZW50IGlzIHRvIGFsbG93IHVzZXJzIHRvIGNoZWNrIG91dCwgYnVpbGQsIGFuZCAKKyAgICAgIGluc3RhbGwgYSBiYXNlIHZlcnNpb24gb2YgdGhlIENBUyBGaWxlIE1hbmFnZXIuICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNhbgorICAgICAgYmUgZm91bmQgYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9PT0RUL09PRFQrRmlsZW1ncitVc2VyK0d1aWRlIj4KKyAgICAgIEZpbGVtZ3IgVXNlciBHdWlkZSBXaWtpIFBhZ2U8L2E+LiBGb3IgYWR2YW5jZWQgdG9waWNzLCBzdWNoIGFzIGNvbmZpZ3VyaW5nIHRoZSBGaWxlIAorICAgICAgTWFuYWdlciB0byBTY2FsZSBhbmQgb3RoZXIgdGlwcyBhbmQgdHJpY2tzLCBwbGVhc2Ugc2VlIG91ciAKKyAgICAgIDxhIGhyZWY9Ii4uL3VzZXIvYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgR3VpZGUuPC9hPjwvcD4KKyAgICAgIAorICAgICAgPHA+VGhlIHJlbWFpbmRlciBvZiB0aGlzIGd1aWRlIGlzIHNlcGFyYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24xIj5Eb3dubG9hZCBhbmQgQnVpbGQgT09EVDwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24yIj5Db25maWd1cmF0aW9uIGluIDIgTWludXRlcyBvciBMZXNzPC9hPjwvbGk+CisgICAgICAgIDwhLS0gCisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjMiPkxlYXJuIEJ5IEV4YW1wbGU8L2E+PC9saT4KKyAgICAgICAgIC0tPgorICAgICAgPC91bD4gIAorICAgICAgPC9zZWN0aW9uPiAKKyAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMSIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iRG93bmxvYWQgYW5kIEJ1aWxkIE9PRFQiPgorICAgICAgPGRpdiBjbGFzcz0iaW5mbyI+CisgICAgICAgIDxwPjxiPlByZS1SZXF1aXNpdGU6PC9iPiBNYXZlbiAyLnggaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZSBhbmQgSmF2YSAxLjYuCisgICAgICAgIElmIHlvdSBoYXZlIHRoZSBjb3JyZWN0IHZlcnNpb25zIG9mIEphdmEgYW5kIE1hdmVuIGluc3RhbGxlZCB0aGVuIHByb2NlZWQKKyAgICAgICAgd2l0aCB0aGUgYnVpbGQgcHJvY2VzcyBmb3IgT09EVCB3aGljaCB3aWxsIGFsc28gYnVpbGQgdGhlIEZpbGUgTWFuYWdlcgorICAgICAgICBjb21wb25lbnQuCisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgICAgCisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4gIAorICAgICAgICA8cD48Yj5NYWMgT1MgWCBVc2Vyczo8L2I+IEFwcGxlIGlzIG5vdyB1cGdyYWRpbmcgdGhlaXIgT1MgdG8gaW5jbHVkZSBNYXZlbiAzCisgICAgICAgIGJ5IGRlZmF1bHQsIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQXBhY2hlIE9PRFQncyBidWlsZCBwcm9jZXNzLiAgRm9yIG1vcmUgCisgICAgICAgIGluZm9ybWF0aW9uIG9uIE1hdmVuLCBzZWUgb3VyIDxhIGhyZWY9Ii4uL2RldmVsb3BtZW50L21hdmVuLmh0bWwiPk1hdmVuIEd1aWRlLjwvYT4KKyAgICAgICAgVG8gZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gb2YgTWF2ZW4gaXMgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZSB0eXBlIHRoZSBmb2xsb3dpbmcgCisgICAgICAgIGNvbW1hbmQgaW50byBhIHRlcm1pbmFsLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxzb3VyY2U+Cis+bXZuIC0tdmVyc2lvbgorQXBhY2hlIE1hdmVuIDIuMi4xIChyODAxNzc3OyAyMDA5LTA4LTA3IDA0OjE2OjAxKzA5MDApCitKYXZhIHZlcnNpb246IDEuNi4wXzI2CisJCTwvc291cmNlPgorCQkKKwkJPHA+SWYgeW91ciBzeXN0ZW0gcmV0dXJucyBBcGFjaGUgTWF2ZW4gMy5YIHRoZW4geW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIE1hdmVuIDIuMi4xIHVzaW5nIHRoZQorCQlmb2xsb3dpbmcgc3RlcHM6ICAoTk9URTogVGhpcyB3aWxsIHJlcGxhY2UgTWF2ZW4gMyB3aXRoIE1hdmVuIDIuMi4xIGFzIHlvdXIgc3lzdGVtcyBkZWZhdWx0IE1hdmVuIHZlcnNpb24pPC9wPgorCQkKKwkJPHA+MS4gRG93bmxvYWQgYXBhY2hlLW1hdmVuLTIuMi4xLWJpbiB0YXIgZmlsZSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L2E+PC9wPgorICAJCTxwPjIuIEluc3RhbGwgbWF2ZW4gdG8gL3Vzci9zaGFyZS88L3A+IAorICAJCTxzb3VyY2U+Cis+c3VkbyB0YXIgeHp2ZiBhcGFjaGUtbWF2ZW4tMi4yLjEtYmluLnRhci5neiAtQyAvdXNyL3NoYXJlCisgIAkJPC9zb3VyY2U+CisgIAkJPHA+My4gTm93IGhvb2sgaXQgaW4gYXMgdGhlIGRlZmF1bHQgbWF2ZW4uPC9wPgorCQk8c291cmNlPgorPnN1ZG8gcm0gL3Vzci9iaW4vbXZuCis+c3VkbyBybSAvdXNyL3NoYXJlL21hdmVuCis+c3VkbyBsbiAtcyAvdXNyL3NoYXJlL2FwYWNoZS1tYXZlbi0yLjIuMSAvdXNyL3NoYXJlL21hdmVuCis+c3VkbyBsbiAtcyAvdXNyL3NoYXJlL21hdmVuL2Jpbi9tdm4gL3Vzci9iaW4vbXZuCisJCTwvc291cmNlPgorCQk8cD40LiBEb3VibGUgY2hlY2sgdGhlIG1hdmVuIHZlcnNpb248L3A+CisJCTxzb3VyY2U+Cis+bXZuIC0tdmVyc2lvbgorQXBhY2hlIE1hdmVuIDIuMi4xIC4uLgorCQk8L3NvdXJjZT4KKwkJPHA+PGI+Tm93IHlvdSBjYW4gcHJvY2VlZCB3aXRoIHRoZSBjaGVjayBvdXQgYW5kIGJ1aWxkIG9mIEFwYWNoZSBPT0RUPC9iPjwvcD4KKyAgICAgIDwvZGl2PgorICAgICAgPGJyLz4KKyAgICAgIDxkaXYgaWQ9ImNoZWNrb3V0X2J1aWxkIj4KKyAgICAgIDxwPjxiPkNyZWF0ZSBhIERpcmVjdG9yeSB0byBDaGVja291dCBTb3VyY2UgQ29kZTo8L2I+PC9wPgorICAgICAgICA8c291cmNlPgorPm1rZGlyIC91c3IvbG9jYWwvc3JjCis+Y2QgL3Vzci9sb2NhbC9zcmMgICAgICAgIAorCQk8L3NvdXJjZT4KKwkJPHA+PGI+VXNpbmcgYSBUYWdnZWQgUmVsZWFzZTo8L2I+PC9wPgorCQk8c291cmNlPgorPnN2biBjbyBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy97cmVsZWFzZV9udW1iZXJ9LyBvb2R0CisgICAgICAgIDwvc291cmNlPgorCQk8cD48Yj5Vc2luZyB0aGUgTGF0ZXN0IERldmVsb3BtZW50IFRydW5rOjwvYj48L3A+CisJCTxzb3VyY2U+Cis+c3ZuIGNvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90cnVuay8gb29kdAorICAgICAgICA8L3NvdXJjZT4KKyAgICAgICAgPHA+T25jZSB0aGUgc3VidmVyc2lvbiBjb21tYW5kIGNvbXBsZXRlcyB5b3Ugc2hvdWxkIGhhdmUgYSBkaXJlY3RvcnkgYXQgPGNvZGU+L3Vzci9sb2NhbC9zcmMvb29kdDwvY29kZT4KKyAgICAgICAgd2hpY2ggd2lsbCBjb250YWluIGFsbCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIE9PRFQuICBJbiBvcmRlciB0byBidWlsZCB0aGUgcHJvamVjdCBmcm9tIHNvdXJjZSwgCisgICAgICAgIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6PC9wPgorICAgICAgICA8c291cmNlPgorPmNkIC91c3IvbG9jYWwvc3JjL29vZHQKKz5tdm4gY2xlYW4gaW5zdGFsbCAgICAgICAgCisgICAgICAgIDwvc291cmNlPgorICAgICAgICA8cD5PbmNlIHlvdSBnZXQgdGhlIE1hdmVuIEJ1aWxkIFN1Y2Nlc3NmdWwgbWVzc2FnZSB5b3UgY2FuIHByb2NlZWQgd2l0aCB0aGUgaW5zdGFsbGF0aW9uIAorICAgICAgICBvZiB0aGUgQ0FTLUZpbGVNYW5hZ2VyLjwvcD4KKyAgICAgICAgPHNvdXJjZT4KKz5ta2RpciAvdXNyL2xvY2FsL29vZHQKKz5jZCBmaWxlbWdyL3RhcmdldAorPnRhciB4enZmIGNhcy1maWxlbWdyLXt2ZXJzaW9uI30tZGlzdC50YXIuZ3ogLUMgL3Vzci9sb2NhbC9vb2R0Cis+Y2QgL3Vzci9sb2NhbC9vb2R0Cis+bG4gLXMgY2FzLWZpbGVtZ3Ite3ZlcnNpb24jfS8gY2FzLWZpbGVtZ3IKKyAgICAgICAgPC9zb3VyY2U+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8aDM+CisgICAgICAgIE91ciBsYXRlc3QgdXBkYXRlZCBGaWxlIE1hbmFnZXIgZG9jdW1lbnRhdGlvbiBoYXMgbW92ZWQgdG8gdGhlIE9PRFQgd2lraSAKKyAgICAgICAgYXQgPGEgaHJlZj0iaHR0cDovL2N3aWtpLmFwYWNoZS5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L09PRFQvT09EVCtGaWxlbWdyK1VzZXIrR3VpZGUiPk9PRFQgRmlsZW1ncgorICAgICAgICBVc2VyIEd1aWRlPC9hPgorICAgICAgICA8L2gzPgorICAgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgCis8IS0tIFByZXZpb3VzIEluc3RydWN0aW9ucyBtaWdodCBuZWVkIHRvIHBvYWNoIHNvbWUgb2YgdGhlIHRleHQgc28gY29tbWVudGluZyBvdXQgZm9yIG5vdyAgICAgCisKKwkJVGhpcyBibG9jayBubyBsb25nZXIgaG9sZHMgdHJ1ZS4gIFlvdSBjYW5ub3QganVzdCBidWlsZCB0aGUgb29kdC1jb3JlIHRoZW4gdGhlIGZpbGVtZ3IgY29tcG9uZW50LgorCQljZ29vZGFsZSB0cmllZCBvbiBhIGNsZWFuIG0yIHJlcG8gYW5kIGl0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMuICBJZiB0aGlzIGlzIHN0aWxsCisJCWRlc2lyZWQsIHRoZW4gaXQgd2lsbCBuZWVkIHRvIGJlIGNvcnJlY3RlZCBhbmQgY2xlYW5lZCB1cC4gIExlYXZpbmcgdGhlIHRleHQgaGVyZSBpZiB0aGF0IGlzCisJCXRoZSBmaW5hbCBjYXNlLgorCQkKKwkJICAKKyAgICAgICAgPHA+QXNzdW1pbmcgYSAqbml4LWxpa2UgZW52aXJvbm1lbnQsIHdpdGggYm90aCBNYXZlbiBhbmQgU3VidmVyc2lvbiAKKyAgICAgICAgY2xpZW50cyBpbnN0YWxsZWQgYW5kIG9uIHlvdXIgcGF0aCwgYW4gZXhhbXBsZSBvZiB0aGUgY2hlY2tvdXQgYW5kIAorICAgICAgICBidWlsZCBwcm9jZXNzIGlzIHByZXNlbnRlZCBiZWxvdzo8L3A+CisgICAgICAgIAorICAgICAgICAgPHNvdXJjZT4KKz4gbWtkaXIgL3Vzci9sb2NhbC9zcmMKKz4gY2QgL3Vzci9sb2NhbC9zcmMKKz4gc3ZuIGNoZWNrb3V0IGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdHJ1bmsvZmlsZW1ncgorICAgICAgPC9zb3VyY2U+CisgICAgICAgIAorICAgICAgPHA+QWZ0ZXIgdGhlIFN1YnZlcnNpb24gY29tbWFuZCBjb21wbGV0ZXMsIHlvdSB3aWxsIGhhdmUgdGhlIHNvdXJjZQorICAgICAgZm9yIHRoZSBDQVMtRmlsZW1nciBwcm9qZWN0IGluIHRoZSA8Y29kZT4vdXNyL2xvY2FsL3NyYy9maWxlbWdyPC9jb2RlPgorICAgICAgZGlyZWN0b3J5LjwvcD4KKyAgICAgIAorICAgICAgPHA+SW4gb3JkZXIgdG8gYnVpbGQgdGhlIHByb2plY3QgZnJvbSB0aGlzIHNvdXJjZSwgaXNzdWUgdGhlIGZvbGxvd2luZyAKKyAgICAgIGNvbW1hbmRzOjwvcD4KKyAgICAgIAorICAgICAgPHNvdXJjZT4KKz4gY2QgL3Vzci9sb2NhbC9zcmMvZmlsZW1ncgorPiBtdm4gcGFja2FnZSAgICAKKyAgICAgIDwvc291cmNlPiAgIAorICAgICAgCisgICAgICA8cD5Ob3RlIHRoYXQgdGhpcyBjb21tYW5kIHBlcmZvcm1zIGEgbnVtYmVyIG9mIHRhc2tzLCBpbmNsdWRpbmcgcGVyZm9ybWluZworICAgICAgdW5pdCB0ZXN0cyB3aGljaCBjYW4gdGFrZSBhIGxvbmcgdGltZSBkZXBlbmRpbmcgb24geW91ciBzeXN0ZW0uIEl0IGlzIG5vdCB1bmNvbW1vbgorICAgICAgZm9yIHRoaXMgYnVpbGQgdG8gbGFzdCB0ZW4gbWludXRlcyBvciBsb25nZXIuIEF0IHRoZSBlbmQgb2YgdGhlIHByb2Nlc3MsCisgICAgICB5b3Ugd2lsbCBzZWUgYSBNYXZlbiBzdWNjZXNzIGJhbm5lci48L3A+CisgICAgICAKKyAgICAgIDxwPk9uY2UgdGhlIE1hdmVuIGNvbW1hbmQgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgeW91IHNob3VsZCBoYXZlIGEgCisgICAgICA8Y29kZT50YXJnZXQ8L2NvZGU+IGRpcmVjdG9yeSB1bmRlciA8Y29kZT5jYXMtZmlsZW1nci12WC5ZLlovPC9jb2RlPi4gCisgICAgICBUaGUgcHJvamVjdCBoYXMgYmVlbiBidWlsdCBpbiB0aGlzIGRpcmVjdG9yeSBhcyBhIGRpc3RyaWJ1dGlvbiB0YXIgYmFsbC4KKyAgICAgIEluIG9yZGVyIHRvIG1vdmUgdGhlIGJ1aWx0IHByb2plY3Qgb3V0IG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB1bnBhY2sgdGhlCisgICAgICB0YXIgYmFsbCwgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kczo8L3A+CisgICAgICAKKyAgICAgIDxzb3VyY2U+Cis+IGNkIC91c3IvbG9jYWwKKz4gbXYgc3JjL2ZpbGVtZ3IvdGFyZ2V0L2Nhcy1maWxlbWdyLXZYLlkuWi1kaXN0LnRhci5neiAuLworPiB0YXIgLXh2emYgY2FzLWZpbGVtZ3ItdlguWS5aLWRpc3QudGFyLmd6Cis+IGV4cG9ydCBGSUxFTUdSX0hPTUU9L3Vzci9sb2NhbC9jYXMtZmlsZW1nci12WC5ZLloKKyAgICAgIDwvc291cmNlPiAgICAgICAKKworCisKKy0tPgorCSAgPGJyLz4KKwkgIDxici8+CisJICA8YnIvPgorICAgICAgPHA+VGhlIHJlc3VsdGFudCBkaXJlY3RvcnkgbGF5b3V0IGZyb20gdGhlIHVucGFja2VkIHRhcmJhbGwgaXMgYXMgZm9sbG93czo8L3A+CisgICAgICAgICAgIAorICAgICAgPHNvdXJjZT4KK2Jpbi8gZXRjLyBsb2dzLyBkb2MvIGxpYi8gcG9saWN5LworICAgICAgPC9zb3VyY2U+CisgICAgICAKKyAgICAgIDxwPkEgYmFzaWMgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBvZiB0aGUgZGVwbG95bWVudCBpcyAKKyAgICAgIHByZXNlbnRlZCBiZWxvdzo8L3A+CisgICAgICA8dWw+CisgICAgICAgICA8bGk+PHN0cm9uZz5iaW48L3N0cm9uZz4gLSBjb250YWlucyBzY3JpcHRzIGZvciBydW5uaW5nIHRoZSBGaWxlIE1hbmFnZXIsIAorICAgICAgICAgaW5jbHVkaW5nIHRoZSAiZmlsZW1nciIgc2VydmVyIHNjcmlwdCwgYW5kIHRoZSAiZmlsZW1nci1jbGllbnQiIGNsaWVudCBzY3JpcHQuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+ZXRjPC9zdHJvbmc+IC0gY29udGFpbnMgdGhlIGxvZ2dpbmcucHJvcGVydGllcyBmaWxlIGZvciB0aGUgCisgICAgICAgICBGaWxlIE1hbmFnZXIsIGFuZCB0aGUgZmlsZW1nci5wcm9wZXJ0aWVzIGZpbGUgdXNlZCB0byBjb25maWd1cmUgdGhlIHNlcnZlciAKKyAgICAgICAgIG9wdGlvbnMuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+bG9nczwvc3Ryb25nPiAtIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpbnRvIHdoaWNoIGxvZyBmaWxlcyBhcmUgCisgICAgICAgICB3cml0dGVuLjwvbGk+CisgICAgICAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+ZG9jPC9zdHJvbmc+IC0gY29udGFpbnMgSmF2YWRvYyBkb2N1bWVudGF0aW9uLCBhbmQgdXNlciBndWlkZXMgCisgICAgICAgICBmb3IgdXNpbmcgdGhlIEZpbGUgTWFuYWdlci48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5saWI8L3N0cm9uZz4gLSB0aGUgcmVxdWlyZWQgSmF2YSBqYXIgZmlsZXMgdG8gcnVuIHRoZSBGaWxlIAorICAgICAgICAgTWFuYWdlci48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5wb2xpY3k8L3N0cm9uZz4gLSB0aGUgZGVmYXVsdCBYTUwtYmFzZWQgZWxlbWVudCBhbmQgcHJvZHVjdCAKKyAgICAgICAgIHR5cGUgcG9saWN5IGluIGNhc2UgdGhlIHVzZXIgaXMgdXNpbmcgdGhlIFhNTCBSZXBvc2l0b3J5IE1hbmFnZXIgYW5kL29yIHRoZSAKKyAgICAgICAgIFhNTCBWYWxpZGF0aW9uIExheWVyLjwvbGk+CisgICAgICAgICAKKyAgICAgICA8L3VsPgorICAgICAgCisgICAgICA8cD5Ob3cgeW91IGhhdmUgYSBidWlsdCBGaWxlIE1hbmFnZXIgYXQgPGNvZGU+L3Vzci9sb2NhbC9vb2R0L2Nhcy1maWxlbWdyPC9jb2RlPi4KKyAgICAgIEluIHRoZSBuZXh0IHNlY3Rpb24sIHdlIHdpbGwgZGlzY3VzcyBob3cgeW91IGNhbiBjb25maWd1cmUgdGhlIEZpbGUgTWFuYWdlciBmb3IKKyAgICAgIGJhc2ljIG9wZXJhdGlvbnMuPC9wPgorICAgICAgCisKKyAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgIDxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyYXRpb24gaW4gMiBNaW51dGVzIG9yIExlc3MiPgorICAgICAgCisgICAgICA8cD5UaGUgcmVhc29uIGZvciBlbnRpdGxpbmcgdGhpcyBzZWN0aW9uICJpbiAyIE1pbnV0ZXMgb3IgTGVzcyIgaXMgdG8gc2hvdyB0aGF0CisgICAgICBpbiBpdCdzIGJhc2UgZGVwbG95bWVudCwgd2l0aCB2YXJ5IG1pbmltYWwgY29uZmlndXJhdGlvbiwgd2UgY2FuIGhhdmUgdGhlIEZpbGUKKyAgICAgIE1hbmFnZXIgaW4gYSB1c2FibGUgc3RhdGUsIGNhcGFibGUgb2YgYXJjaGl2aW5nIHByb2R1Y3RzIGFuZCBjYXB0dXJpbmcgYmFzaWMgCisgICAgICBtZXRhZGF0YS4gRm9yIHRoZSByZWNvcmQsIEkgaGF2ZW4ndCB0aW1lZCBpdCwgYnV0IGl0cyBwcmV0dHkgZmFzdC4uLjwvcD4KKyAgICAgIAorICAgICAgPHA+V2UgYXJlIGdvaW5nIHRvIHNldCB1cCB0aGUgRmlsZSBNYW5hZ2VyIHRvIHVzZSBhbiBYTUwtYmFzZWQgVmFsaWRhdGlvbiBsYXllciwKKyAgICAgIGFuZCBYTUwgcHJvZHVjdCBwb2xpY3ksIGFuZCBhIEx1Y2VuZSBtZXRhZGF0YSBDYXRhbG9nLiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBlZGl0CisgICAgICB0aGUgZmlsZW1nciBzY3JpcHQgaW4gPGNvZGU+JEZJTEVNR1JfSE9NRS9iaW48L2NvZGU+LiBNYWtlIHRoZSBmb2xsb3dpbmcgCisgICAgICBjaGFuZ2VzOjwvcD4KKyAgICAgCisgICAgICAgPHVsPgorICAgICAgICAgPGxpPlNldCB0aGUgPGNvZGU+U0VSVkVSX1BPUlQ8L2NvZGU+IHZhcmlhYmxlIHRvIHRoZSBkZXNpcmVkIHBvcnQgb24gd2hpY2ggCisgICAgICAgICB5b3UnZCBsaWtlIHRvIHJ1biB0aGUgRmlsZSBNYW5hZ2VyLiBPdXIgZGVmYXVsdCBwb3J0IGlzIDkwMDAuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPlNldCB0aGUgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gb2YgeW91ciAKKyAgICAgICAgIGluc3RhbGxlZCBKUkUgcnVudGltZS4gSWYgeW91IGRvIG5vdCBrbm93IHdoZXJlIHRoaXMgaXMsIHR5cGUgPGNvZGU+Jmd0OyB3aGljaCAKKyAgICAgICAgIGphdmE8L2NvZGU+IGFuZCB1c2UgdGhhdCBwYXRoLjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT5TZXQgdGhlIDxjb2RlPlJVTl9IT01FPC9jb2RlPiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gdG8gd2hpY2gKKyAgICAgICAgIHlvdSdkIGxpa2UgdGhlIEZpbGUgTWFuYWdlciBQSUQgZmlsZSB3cml0dGVuLiBUeXBpY2FsbHkgdGhpcyBzaG91bGQgZGVmYXVsdCB0byAKKyAgICAgICAgIDxjb2RlPi92YXIvcnVuPC9jb2RlPiwgYnV0IG5vdCBhbGwgc3lzdGVtIGFkbWluaXN0cmF0b3JzIGFsbG93IHVzZXJzIHRvIHdyaXRlIAorICAgICAgICAgdG8gPGNvZGU+L3Zhci9ydW48L2NvZGU+LjwvbGk+CisgICAgICAgPC91bD4KKyAgICAgICAKKyAgICAgICA8cD5UaGUgc2Vjb25kIHN0ZXAgaW4gY29uZmlndXJhdGlvbiBpcyB0byBlZGl0IAorICAgICAgIDxjb2RlPiRGSUxFTUdSX0hPTUUvYmluL2ZpbGVtZ3ItY2xpZW50PC9jb2RlPiBzY3JpcHQsIG1ha2luZyB0aGUgZm9sbG93aW5nIAorICAgICAgIGNoYW5nZTo8L3A+CisgICAgICAgCisgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5TZXQgdGhlIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIG9mIAorICAgICAgICAgIHlvdXIgaW5zdGFsbGVkIEpSRSBydW50aW1lLjwvbGk+CisgICAgICAgPC91bD4KKyAgICAgICAgICAgCisgICAgICAgPHA+SW4gdGhlIHRoaXJkIHN0ZXAgb2YgdGhpcyBjb25maWd1cmF0aW9uLCB5b3Ugd2lsbCBzZXQgdGhlIEZpbGUgTWFuYWdlcidzCisgICAgICAgdmFyaW91cyBleHRlbnNpb24gcG9pbnRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb25hbGl0eSBvZgorICAgICAgIHRoZXNlIGV4dGVuc2lvbiBwb2ludHMsIHNlZSBvdXIgCisgICAgICAgPGEgaHJlZj0iLi4vZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLmh0bWwiPkRldmVsb3BlciBHdWlkZS48L2E+IEJ5IGRlZmF1bHQsIAorICAgICAgIHRoZSBGaWxlIE1hbmFnZXIgaXMgYnVpbHQgdG8gdXNlIHRoZSBYTUwtYmFzZWQgcmVwb3NpdG9yeSBtYW5hZ2VyIGFuZCAKKyAgICAgICB2YWxpZGF0aW9uIGxheWVyIGV4dGVuc2lvbiBwb2ludHMsIHRoZSA8YSBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmcvIj4KKyAgICAgICBMdWNlbmU8L2E+LWJhc2VkIGNhdGFsb2cgZXh0ZW5zaW9uIHBvaW50LCBhbmQgdGhlIGxvY2FsIGRhdGEgdHJhbnNmZXIgCisgICAgICAgaW50ZXJmYWNlLjwvcD4gCisgICAgICAgCisgICAgICAgPHA+TWFrZSB0aGUgZm9sbG93aW5nIGNoYW5nZXMgdG8gCisgICAgICAgPGNvZGU+JEZJTEVNR1JfSE9NRS9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzPC9jb2RlPjo8L3A+CisgICAgICAgCisgICAgICAgCisgICAgICAgPHVsPiAgICAgCisgICAgICAgICA8bGk+U3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBGaWxlIE1hbmFnZXIgd2lsbCBjcmVhdGUgdGhlCisgICAgICAgICBMdWNlbmUgaW5kZXggYW5kIGFzc29jaWF0ZWQgZmlsZXMgYnkgc2V0dGluZyB0aGUgCisgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aDwvY29kZT4gcHJvcGVydHkKKyAgICAgICAgIHRvIDxjb2RlPiRGSUxFTUdSX0hPTUUvY2F0YWxvZzwvY29kZT4uIE1ha2Ugc3VyZSB0aGF0IHRoaXMgZGlyZWN0b3J5IGRvZXMKKyAgICAgICAgIE5PVCBleGlzdCB0aGUgZmlyc3QgdGltZSB5b3UgcnVuIHRoZSBGaWxlIE1hbmFnZXIuIElmIHRoZSBGaWxlIE1hbmFnZXIgZG9lcyBub3QgZmluZAorICAgICAgICAgYSBkaXJlY3RvcnkgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiwgaXQgd2lsbCBjcmVhdGUgYWxsIG9mIHRoZSBuZWNlc3NhcnkgCisgICAgICAgICBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBhbmNpbGxhcnkgZmlsZXMuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPlNwZWNpZnkgdGhlIHBhdGhzIHRvIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB0aGUgWE1MIHBvbGljeSBmaWxlcyBhcmUgc3RvcmVkIAorICAgICAgICAgZm9yIHRoZSB2YWxpZGF0aW9uIGxheWVyIGFuZCBmb3IgdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4gVGhlc2UgcGF0aHMgYXJlIHNldCBieSAKKyAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRpcnM8L2NvZGU+IGFuZCAKKyAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRpcnM8L2NvZGU+IHJlc3BlY3RpdmVseS4gVGhlIAorICAgICAgICAgZGVmYXVsdCBsb2NhdGlvbiAoYW5kIGRlZmF1bHQgcG9saWN5IGZpbGVzKSBhcmUgbG9jYXRlZCBhdCAKKyAgICAgICAgIDxjb2RlPiRGSUxFTUdSX0hPTUUvcG9saWN5PC9jb2RlPiBpbiB0aGUgdmFuaWxsYSBkZXBsb3ltZW50IG9mIHRoZSBGaWxlIE1hbmFnZXIuCisgICAgICAgICBOb3RlIHRoYXQgdGhlc2UgcHJvcGVydGllcyBuZWVkIHRvIGJlIGZ1bGx5IHNwZWNpZmllZCBVUkxzIChlLmcuLCB0aGV5IHNob3VsZCAKKyAgICAgICAgIHN0YXJ0IHdpdGggPGNvZGU+ZmlsZTovLzwvY29kZT4pLjwvbGk+CisgICAgICAgPC91bD4KKworICAgICAgIDxkaXYgY2xhc3M9ImluZm8iPk9wdGlvbmFsbHksIHlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGxvZ2dpbmcgcHJvcGVydGllcyBmb3IKKyAgICAgICB0aGUgQ0FTIEZpbGUgTWFuYWdlci4gVGhpcyBpcyBkb25lIGJ5IGVkaXRpbmcgCisgICAgICAgPGNvZGU+JEZJTEVNR1JfSE9NRS9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzPC9jb2RlPi4gV2UgaGF2ZSB0cmllZCB0byBzZWxlY3Qgc2Vuc2libGUKKyAgICAgICBkZWZhdWx0cyBmb3IgdGhlIGF2ZXJhZ2UgdXNlciwgYnV0IGlmIHlvdSB3b3VsZCBsaWtlIG1vcmUgb3IgbGVzcyBpbmZvcm1hdGlvbiAKKyAgICAgICBnZW5lcmF0ZWQgaW4gdGhlIEZpbGUgTWFuYWdlciBsb2dzLCB5b3UgY2FuIGVkaXQgdGhlIGxldmVscyBvZiBkaWZmZXJlbnQgY2F0YWdvcmllcworICAgICAgIG9mIGluZm9ybWF0aW9uIGluIHRoaXMgcHJvcG9ydGllcyBmaWxlLiBUaGUgZm9sbG93aW5nIGxvZ2dpbmcgbGV2ZWxzIGFyZSBhdmFpbGFibGU6CisgICAgICAgPGNvZGU+SU5GTzwvY29kZT4sIDxjb2RlPldBUk5JTkc8L2NvZGU+LCA8Y29kZT5GSU5FPC9jb2RlPiwgPGNvZGU+RklORVI8L2NvZGU+LAorICAgICAgIDxjb2RlPkZJTkVTVDwvY29kZT4sIGFuZCA8Y29kZT5BTEw8L2NvZGU+LjwvZGl2PgorICAgCisgICAgICA8cD5XaXRoIHRoaXMgbGFzdCBzdGVwLCB5b3UgaGF2ZSBjb25maWd1cmVkIHRoZSBGaWxlIE1hbmFnZXIuIEluIG9yZGVyIHRvIHRlc3QgeW91ciAKKyAgICAgIGNvbmZpZ3VyYXRpb24sIGNkIHRvIDxjb2RlPiRGSUxFTUdSX0hPTUUvYmluPC9jb2RlPiBhbmQgdHlwZTo8L3A+CisKKyAgICAgIDxzb3VyY2U+Cis+IC4vZmlsZW1nciBzdGFydAorICAgICAgPC9zb3VyY2U+CisKKworICAgICAgPHA+VGhpcyB3aWxsIHN0YXJ0dXAgdGhlIGZpbGUgbWFuYWdlciBYTUwtUlBDIHNlcnZlciBpbnRlcmZhY2UuIFlvdXIgRmlsZSBNYW5hZ2VyIAorICAgICAgaXMgbm93IHJlYWR5IHRvIHJ1biEgWW91IGNhbiB0ZXN0IG91dCB0aGUgZmlsZSBtYW5hZ2VyIGJ5IHJ1bm5pbmcgYSBzaW1wbGUgaW5nZXN0IAorICAgICAgY29tbWFuZCB1c2luZyB0aGUgZmlsZW1nci1jbGllbnQgY29tbWFuZCBiZWxvdy4gRmlyc3QgY3JlYXRlIGEgc2ltcGxlIHRleHQgZmlsZSAKKyAgICAgIGNhbGxlZCAiYmxhaC50eHQiIGFuZCBwbGFjZSBpdCBpbnNpZGUgPGNvZGU+JEZJTEVNR1JfSE9NRS9iaW48L2NvZGU+IFRoZW4sIGNyZWF0ZSAKKyAgICAgIGEgYmxhbmsgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIHByb2R1Y3QsIHVzaW5nIHRoZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90cnVuay9tZXRhZGF0YS9zcmMvbWFpbi9jb25mL2Nhcy5tZXRhZGF0YS54c2QiPnNjaGVtYTwvYT4KKyAgICAgIG9yICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdHJ1bmsvbWV0YWRhdGEvc3JjL21haW4vY29uZi9jYXMubWV0YWRhdGEuZHRkIj5EVEQ8L2E+CisgICAgICBwcm92aWRlZCBpbiB0aGUgPGEgaHJlZj0iLi4vLi4vbWV0YWRhdGEiPkNBUy1NZXRhZGF0YTwvYT4KKyAgICAgIHByb2plY3QuIEFuIGV4YW1wbGUgWE1MIGZpbGUgbWlnaHQgYmU6PC9wPgorICAgICAgCisgICAgICA8c291cmNlPgorICAgICAgICAmbHQ7Y2FzOm1ldGFkYXRhIHhtbG5zOmNhcz0mcXVvdDtodHRwOi8vb29kdC5hcGFjaGUub3JnLzEuMC9jYXMmcXVvdDsmZ3Q7CisgICAgICAgICZsdDsvY2FzOm1ldGFkYXRhJmd0OworICAgICAgPC9zb3VyY2U+CisgICAgICAKKyAgICAgIDxwPkNhbGwgdGhpcyBtZXRhZGF0YSBmaWxlIDxjb2RlPmJsYWgudHh0Lm1ldDwvY29kZT4sIGFuZCBwbGFjZSBpdCBhbHNvIGluIAorICAgICAgPGNvZGU+JEZJTEVNR1JfSE9NRS9iaW48L2NvZGU+LiBUaGVuLCBydW4gdGhlIGNvbW1hbmQgYmVsb3csIGFzc3VtaW5nIHRoYXQgeW91IAorICAgICAgc3RhcnRlZCB0aGUgRmlsZSBNYW5hZ2VyIG9uIHRoZSBkZWZhdWx0IHBvcnQgb2YgPGNvZGU+OTAwMDwvY29kZT46PC9wPgorCisgICAgICA8c291cmNlPgorPiAuL2ZpbGVtZ3ItY2xpZW50IC0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiBcCisgICAtLWluZ2VzdFByb2R1Y3QgLS1wcm9kdWN0TmFtZSBibGFoLnR4dCAtLXByb2R1Y3RTdHJ1Y3R1cmUgRmxhdCBcCisgICAtLXByb2R1Y3RUeXBlTmFtZSBHZW5lcmljRmlsZSBcIAorICAgLS1tZXRhZGF0YUZpbGUgZmlsZTovLy91c3IvbG9jYWwvb29kdC9jYXMtZmlsZW1nci9iaW4vYmxhaC50eHQubWV0IFwKKyAgIC0tcmVmcyBmaWxlOi8vL3Vzci9sb2NhbC9vb2R0L2Nhcy1maWxlbWdyL2Jpbi9ibGFoLnR4dAorICAgICAgPC9zb3VyY2U+CisKKyAgICAgIDxwPlRoaXMgY29tbWFuZCB0cmlnZ2VycyB0aGUgaW5nZXN0IHByb2Nlc3MuIFlvdSBzaG91bGQgc2VlIGEgcmVzcG9uc2UgbWVzc2FnZSB0aGF0IAorICAgICAgY29uY2x1ZGVzIHdpdGggYSBsaW5lIHNpbWlsYXIgdG86PC9wPgorCisgICAgICA8c291cmNlPgorICAgICAgaW5nZXN0UHJvZHVjdDogUmVzdWx0OiAzYTgxMmQ4Ni0xNDhkLTExZGItYTI1YS1mMzg4ZjUyNGEzNzEKKyAgICAgIDwvc291cmNlPgorCisgICAgICA8cD5JZiB5b3Ugc2VlIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMgbWVzc2FnZSwgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQKKyAgICAgIHRoZSBDQVMgRmlsZSBNYW5hZ2VyLCBob3BlZnVsbHkgaW4gMiBtaW51dGVzIG9yIGxlc3MgKGFuZCBldmVuIGlmIGl0IHRvb2sgYSBsaXR0bGUgCisgICAgICBtb3JlIHRpbWUsIHlvdSBoYXZlIHRvIGFkbWl0IGl0IHdhcyBieSBhbmQgbGFyZ2UgcGFpbmxlc3MpLjwvcD4KKyAgICAgIDwvc2VjdGlvbj4KKworPCEtLSAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjMiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkxlYXJuIEJ5IEV4YW1wbGUiPgorICAgICAgPHA+Q29taW5nIFNvb24uLi48L3A+CisgICAgICA8L3NlY3Rpb24+CistLT4gICAgICAKKyAgICAgIDxzZWN0aW9uIG5hbWU9IkNvbmNsdXNpb24iPgorICAgICAgPHA+SW4gdGhpcyBCYXNpYyBVc2VyIEd1aWRlLCB3ZSBoYXZlIGNvdmVyZWQgYSBudW1iZXIgb2YgdG9waWNzLCBpbmNsdWRpbmcgRmlsZSAKKyAgICAgIE1hbmFnZXIgaW5zdGFsbGF0aW9uLCBjb25maWd1cmF0aW9uLCBhbmQgYSBiYXNpYyBleGFtcGxlIG9mIHVzZS4gRm9yIG1vcmUgYWR2YW5jZWQgCisgICAgICB0b3BpY3MsIGluY2x1ZGluZyB0aGUgdXNlIG9mIG11bHRpcGxlIGNhdGFsb2dzIGFuZCBiZXN0IHByYWN0aWNlcyBmb3IgYWRkcmVzc2luZworICAgICAgc2NhbGluZyBpc3N1ZXMsIHNlZSBvdXIgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBHdWlkZS48L2E+PC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICA8L2JvZHk+Cis8L2RvY3VtZW50PiAKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS94ZG9jL3VzZXIvaW5kZXgueG1sIGIvMC4xMC9maWxlbWdyL3NyYy9zaXRlL3hkb2MvdXNlci9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMmE5MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvc2l0ZS94ZG9jL3VzZXIvaW5kZXgueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAgPHByb3BlcnRpZXM+CisgICAgICA8dGl0bGU+Q0FTIEZpbGUgTWFuYWdlciBVc2VyIEd1aWRlPC90aXRsZT4KKyAgICAgIDxhdXRob3IgZW1haWw9IkNocmlzLk1hdHRtYW5uQGpwbC5uYXNhLmdvdiI+Q2hyaXMgTWF0dG1hbm48L2F1dGhvcj4KKyAgICAgIDxhdXRob3IgZW1haWw9Indvb2xsYXJkQGpwbC5uYXNhLmdvdiI+RGF2ZSBXb29sbGFyZDwvYXV0aG9yPgorICAgPC9wcm9wZXJ0aWVzPgorCisgICA8Ym9keT4KKyAgCisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj5UaGlzIGRvY3VtZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlb3JnYW5pemVkIGFzCisgICAgICBwYXJ0IG9mIG91ciBvbmdvaW5nIGRvY3VtZW50YXRpb24gZWZmb3J0LiBQbGVhc2UgZm9sbG93IHRoZSBsaW5rcyBiZWxvdyB0byBmaW5kCisgICAgICBpbmZvcm1hdGlvbiB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gaG9zdGVkIG9uIHRoaXMgcGFnZS48L2Rpdj4KKyAKKworICAgICAgPHA+V2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHVwZ3JhZGluZyBPT0RUIGRvY3VtZW50YXRpb24uIEluIHRoZSBuZWFyCisgICAgICBmdXR1cmUsIHdlIGhvcGUgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgZGV2ZWxvcGVycyByZWdhcmRpbmcgZWFjaCAKKyAgICAgIGNvbXBvbmVudCwgaW5jbHVkaW5nIGl0cyBwdXJwb3NlLCBzdHJ1Y3R1cmUsIGludGVyZmFjZXMsIGFuZCAKKyAgICAgIGNvbmZpZ3VyYXRpb24gcG9pbnRzIGluIGEgPGEgaHJlZj0iLi4vZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLmh0bWwiPkRldmVsb3BlcgorICAgICAgR3VpZGUuPC9hPjwvcD4KKyAgICAgIAorICAgICAgPHA+SW5mb3JtYXRpb24gZm9yIHVzZXJzLCBpbmNsdWRpbmcgaW5zdGFsbGF0aW9uIGFuZCBiYXNpYyBjb25maWd1cmF0aW9uLAorICAgICAgYXMgd2VsbCBhcyBleGFtcGxlIHVzYWdlIGFyZSBwcm92aWRlZCBpbiBhIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9iYXNpYy5odG1sIj5CYXNpYyBVc2VyIEd1aWRlLjwvYT4gQWR2YW5jZWQgdG9waWNzLCBsaWtlCisgICAgICBsb29rIGFuZCBmZWVsLCBsZXNzb25zLWxlYXJuZWQsIGFuZCBiZXN0IHByYWN0aWNlcyBhcmUgcHJvdmlkZWQgaW4gYW4KKyAgICAgIDxhIGhyZWY9Ii4uL3VzZXIvYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgVXNlciBHdWlkZS48L2E+PC9wPgorICAgICAgCisgICAgICA8cD5GaW5hbGx5LCB3ZSBhcmUgcGxhbm5pbmcgdG8gcHJvdmlkZSBhIG51bWJlciBvZiBjYXNlIHN0dWRpZXMgaW4gdGhlIAorICAgICAgZnV0dXJlLCBpbiB3aGljaCBtdWx0aS1jb21wb25lbnQgZGVwbG95bWVudHMgYXJlIGNvbmZpZ3VyZWQgdG8gaGFuZGxlCisgICAgICBjb21tb24gZGF0YSBhbmQgY29tcHV0YXRpb24gbWFuYWdlbWVudCBzY2VuYXJpb3MuPC9wPiAKKworICAgPC9ib2R5PgorPC9kb2N1bWVudD4gCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9Nb2NrQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTW9ja0NhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgxMzFjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvTW9ja0NhdGFsb2cuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkxheWVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworLyoqCisgKiBBIE1vY2sge0BsaW5rIENhdGFsb2d9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgTW9ja0NhdGFsb2cgaW1wbGVtZW50cyBDYXRhbG9nIHsKKworICAgTWFwPFN0cmluZywgUHJvZHVjdD4gcHJvZHVjdHM7CisKKyAgIHB1YmxpYyBNb2NrQ2F0YWxvZygpIHsKKyAgICAgIHByb2R1Y3RzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSB0eXBlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgUHJvZHVjdFBhZ2UgZ2V0TGFzdFByb2R1Y3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXROZXh0UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3RQYWdlIGdldFByZXZQYWdlKFByb2R1Y3RUeXBlIHR5cGUsIFByb2R1Y3RQYWdlIGN1cnJlbnRQYWdlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShNZXRhZGF0YSBtLCBQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsgICAgICAKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCByZW1vdmVNZXRhZGF0YShNZXRhZGF0YSBtLCBQcm9kdWN0IHByb2R1Y3QpCisgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7ICAgICAgCisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsgICAKKyAgICAgIHByb2R1Y3RzLnB1dChwcm9kdWN0LmdldFByb2R1Y3RJZCgpLCBwcm9kdWN0KTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBtb2RpZnlQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgcHJvZHVjdHMucHV0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCksIHByb2R1Y3QpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICBwcm9kdWN0cy5yZW1vdmUocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgIFByb2R1Y3QgaW5nZXN0ZWRQcm9kdWN0ID0gcHJvZHVjdHMuZ2V0KHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgaW5nZXN0ZWRQcm9kdWN0LnNldFRyYW5zZmVyU3RhdHVzKHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICBQcm9kdWN0IGluZ2VzdGVkUHJvZHVjdCA9IHByb2R1Y3RzLmdldChwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gaW5nZXN0ZWRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCk7CisgICAgICBpZiAocmVmZXJlbmNlcyA9PSBudWxsKSB7CisgICAgICAgICByZWZlcmVuY2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICB9CisgICAgICByZWZlcmVuY2VzLmFkZEFsbChwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworICAgICAgaW5nZXN0ZWRQcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKHJlZmVyZW5jZXMpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBwcm9kdWN0cy5nZXQocHJvZHVjdElkKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlOYW1lKFN0cmluZyBwcm9kdWN0TmFtZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgZm9yIChQcm9kdWN0IHByb2R1Y3QgOiBwcm9kdWN0cy52YWx1ZXMoKSkgeworICAgICAgICAgaWYgKHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKS5lcXVhbHMocHJvZHVjdE5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KQorICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0UHJvZHVjdHMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KHByb2R1Y3RzLnZhbHVlcygpKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkKKyAgICAgICAgIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBNZXRhZGF0YSBnZXRSZWR1Y2VkTWV0YWRhdGEoUHJvZHVjdCBwcm9kdWN0LCBMaXN0PFN0cmluZz4gZWxlbWVudHMpCisgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlKQorICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3RQYWdlIHBhZ2VkUXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUsIGludCBwYWdlTnVtKQorICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIExpc3Q8UHJvZHVjdD4gZ2V0VG9wTlByb2R1Y3RzKGludCBuKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxQcm9kdWN0PiBnZXRUb3BOUHJvZHVjdHMoaW50IG4sIFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgVmFsaWRhdGlvbkxheWVyIGdldFZhbGlkYXRpb25MYXllcigpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgcmV0dXJuIDA7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9Nb2NrQ2F0YWxvZ0ZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL01vY2tDYXRhbG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTdmYTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9Nb2NrQ2F0YWxvZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2c7CisKKy8qKgorICogQSBNb2NrIHtAbGluayBDYXRhbG9nRmFjdG9yeX0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrQ2F0YWxvZ0ZhY3RvcnkgaW1wbGVtZW50cyBDYXRhbG9nRmFjdG9yeSB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIE1vY2tDYXRhbG9nIGNyZWF0ZUNhdGFsb2coKSB7CisgICAgICByZXR1cm4gbmV3IE1vY2tDYXRhbG9nKCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9UZXN0RGF0YVNvdXJjZUNhdGFsb2cuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jYXRhbG9nL1Rlc3REYXRhU291cmNlQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViM2VmMzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9UZXN0RGF0YVNvdXJjZUNhdGFsb2cuamF2YQpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLkRhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuU3FsU2NyaXB0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLlNxbFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgRGF0YVNvdXJjZUNhdGFsb2d9IGFuZAorICoge0BsaW5rIERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeX0uCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdERhdGFTb3VyY2VDYXRhbG9nIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIENhdGFsb2cgbXlDYXQ7CisKKyAgICBwcml2YXRlIFN0cmluZyB0bXBEaXJQYXRoID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBjYXRQYWdlU2l6ZSA9IDIwOworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGluaXRpYWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoCisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwUHJvcGVydGllcygpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBzZXQgdGhlIGxvZyBsZXZlbHMKKyAgICAgICAgVVJMIGxvZ2dpbmdQcm9wZXJ0aWVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgIi90ZXN0LmxvZ2dpbmcucHJvcGVydGllcyIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZSIsIG5ldyBGaWxlKAorICAgICAgICAgICAgbG9nZ2luZ1Byb3BlcnRpZXNVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgaWYocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgib3ZlcnJpZGVQcm9wZXJ0aWVzIikgPT0gbnVsbCl7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJMIGZpbGVtZ3JQcm9wZXJ0aWVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgICAgICAgICAiL2ZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBmaWxlbWdyUHJvcGVydGllc1VybC5nZXRGaWxlKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKworCisgICAgICAgIC8vIGdldCBhIHRlbXAgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgdGVtcERpciA9IG51bGw7CisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgdGVtcERpciA9IHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdG1wRGlyUGF0aCA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIGlmICghdG1wRGlyUGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB0bXBEaXJQYXRoICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIHRtcERpclBhdGggKz0gInRlc3RDYXQiOworCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgY2F0YWxvZyBvbmVzCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy51cmwiLAorICAgICAgICAgICAgICAgICJqZGJjOmhzcWxkYjpmaWxlOiIgKyB0bXBEaXJQYXRoICsgIi90ZXN0Q2F0O3NodXRkb3duPXRydWUiKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXNlciIsCisgICAgICAgICAgICAgICAgInNhIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy5wYXNzIiwKKyAgICAgICAgICAgICAgICAiIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy5kcml2ZXIiLAorICAgICAgICAgICAgICAgICJvcmcuaHNxbGRiLmpkYmNEcml2ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgib3ZlcnJpZGVQcm9wZXJ0aWVzIikpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbm93IG92ZXJyaWRlIHRoZSB2YWwgbGF5ZXIgb25lcworICAgICAgICBVUkwgc3RydWN0RmFjdG9yeVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIveG1scnBjLXN0cnVjdC1mYWN0b3J5Iik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRpcnMiLAorICAgICAgICAgICAgImZpbGU6Ly8iICsgbmV3IEZpbGUoc3RydWN0RmFjdG9yeVVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBvdmVycmlkZSBxdW90ZSBmaWVsZHMKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5xdW90ZUZpZWxkcyIsCisgICAgICAgICAgICAgICAgInRydWUiKTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VXBQcm9wZXJ0aWVzKCk7CisgICAgICAgIG15Q2F0ID0gZ2V0Q2F0YWxvZygpOworICAgICAgICAvLyBub3cgY3JlYXRlIHRoZSBiYXNpYyBzY2hlbWEgZm9yIHRoZSBEQgorICAgICAgICBjcmVhdGVTY2hlbWEoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbm93IHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB1c2VkCisgICAgICAgIGlmICh0bXBEaXJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUodG1wRGlyUGF0aCk7CisgICAgICAgICAgICBGaWxlW10gdG1wRmlsZXMgPSB0bXBEaXIubGlzdEZpbGVzKCk7CisKKyAgICAgICAgICAgIGlmICh0bXBGaWxlcyAhPSBudWxsICYmIHRtcEZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRtcEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcEZpbGVzW2ldLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcERpci5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoaW5pdGlhbFByb3BlcnRpZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9kdWN0KCkgeworICAgICAgICBQcm9kdWN0IHByb2R1Y3RUb1JlbW92ZSA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIC8vIG92ZXJyaWRlIG5hbWUKKyAgICAgICAgcHJvZHVjdFRvUmVtb3ZlLnNldFByb2R1Y3ROYW1lKCJyZW1vdmVtZSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXlDYXQuYWRkUHJvZHVjdChwcm9kdWN0VG9SZW1vdmUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0IHJldFByb2R1Y3QgPSBudWxsOworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgIHR5cGUuc2V0TmFtZSgiR2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgdHlwZS5zZXRQcm9kdWN0VHlwZUlkKCJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRQcm9kdWN0ID0gbXlDYXQuZ2V0UHJvZHVjdEJ5TmFtZSgicmVtb3ZlbWUiKTsKKyAgICAgICAgICAgIHJldFByb2R1Y3Quc2V0UHJvZHVjdFR5cGUodHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKHJldFByb2R1Y3QpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5yZW1vdmVQcm9kdWN0KHJldFByb2R1Y3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0IHJldFByb2RBZnRlclJlbW92ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRQcm9kQWZ0ZXJSZW1vdmUgPSBteUNhdC5nZXRQcm9kdWN0QnlOYW1lKCJyZW1vdmVtZSIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROdWxsKHJldFByb2RBZnRlclJlbW92ZSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvZHVjdCgpIHsKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHRlc3RQcm9kdWN0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0UHJvZHVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHRlc3RQcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgICAvLyBub3cgY2hhbmdlIHNvbWV0aGluZworICAgICAgICB0ZXN0UHJvZHVjdC5zZXRQcm9kdWN0TmFtZSgiZjAwMiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXlDYXQubW9kaWZ5UHJvZHVjdCh0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwodGVzdFByb2R1Y3QpOworCisgICAgICAgIFByb2R1Y3QgcmV0UHJvZHVjdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFByb2R1Y3QgPSBteUNhdC5nZXRQcm9kdWN0QnlOYW1lKCJmMDAyIik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldFByb2R1Y3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmMDAyIiwgcmV0UHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC0xMzMKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmlyc3RQcm9kdWN0T25seU9uRmlyc3RQYWdlKCkgeworICAgICAgICAvLyBhZGQgY2F0UGFnZVNpemUgb2YgdGhlIHRlc3QgUHJvZHVjdAorICAgICAgICAvLyB0aGVuIGFkZCBhIHByb2R1Y3QgY2FsbGVkICJTaG91bGRCZUZpcnN0Rm9yUGFnZS50eHQiCisgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBmaXJzdCBvbmUgb24gdGhlIDFzdCBwYWdlCisKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIE1ldGFkYXRhIG1ldCA9IGdldFRlc3RNZXRhZGF0YSgidGVzdCIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jYXRQYWdlU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG15Q2F0LmFkZFByb2R1Y3QodGVzdFByb2QpOworICAgICAgICAgICAgICAgIG15Q2F0LmFkZE1ldGFkYXRhKG1ldCwgdGVzdFByb2QpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRlc3RQcm9kLnNldFByb2R1Y3ROYW1lKCJTaG91bGRCZUZpcnN0Rm9yUGFnZS50eHQiKTsKKyAgICAgICAgbWV0LnJlcGxhY2VNZXRhZGF0YSgiQ0FTLlByb2R1dE5hbWUiLCAiU2hvdWxkQmVGaXJzdEZvclBhZ2UudHh0Iik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG15Q2F0LmFkZFByb2R1Y3QodGVzdFByb2QpOworICAgICAgICAgICAgbXlDYXQuYWRkTWV0YWRhdGEobWV0LCB0ZXN0UHJvZCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlDYXQuZ2V0UHJvZHVjdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIG15Q2F0LmdldFByb2R1Y3RzKCkuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQoInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgICAgIHR5cGUuc2V0TmFtZSgiR2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChteUNhdC5nZXRGaXJzdFBhZ2UodHlwZSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG15Q2F0LmdldEZpcnN0UGFnZSh0eXBlKS5nZXRQYWdlUHJvZHVjdHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjYXRQYWdlU2l6ZSwgbXlDYXQuZ2V0Rmlyc3RQYWdlKHR5cGUpLmdldFBhZ2VQcm9kdWN0cygpCisgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobXlDYXQuZ2V0Rmlyc3RQYWdlKHR5cGUpLmdldFBhZ2VQcm9kdWN0cygpLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkQmVGaXJzdEZvclBhZ2UudHh0IiwgKChQcm9kdWN0KW15Q2F0LmdldEZpcnN0UGFnZSh0eXBlKS5nZXRQYWdlUHJvZHVjdHMoKS5nZXQoMCkpLmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgICBQcm9kdWN0UGFnZSBwYWdlID0gbXlDYXQuZ2V0TmV4dFBhZ2UodHlwZSwgbXlDYXQuZ2V0Rmlyc3RQYWdlKHR5cGUpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlLmdldFBhZ2VQcm9kdWN0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhZ2UuZ2V0VG90YWxQYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYWdlLmdldFBhZ2VQcm9kdWN0cygpLmdldCgwKSk7CisgICAgICAgIFByb2R1Y3QgcmV0UHJvZCA9ICgoUHJvZHVjdCkgcGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCByZXRQcm9kLmdldFByb2R1Y3ROYW1lKCkpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFByb2R1Y3QoKSB7CisKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHRlc3RQcm9kdWN0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgcmV0UHJvZHVjdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFByb2R1Y3QgPSBteUNhdC5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0Iik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldFByb2R1Y3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgcmV0UHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9GTEFULCByZXRQcm9kdWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0U3RydWN0dXJlKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRQcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cm46b29kdDpHZW5lcmljRmlsZSIsIHJldFByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUQVRVU19UUkFOU0ZFUiwgcmV0UHJvZHVjdAorICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmZXJTdGF0dXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZE1ldGFkYXRhKCkgeworICAgICAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJQcm9kdWN0U3RydWN0dXJlIiwgUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCk7CisKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIHRlc3RQcm9kdWN0LnNldFByb2R1Y3RJZCgiMSIpOyAvLyBuZWVkIHRvIGxpbmsgbWV0YWRhdGEgdG8gcHJvZAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5hZGRNZXRhZGF0YShtZXQsIHRlc3RQcm9kdWN0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRhZGF0YSByZXRNZXQgPSBteUNhdC5nZXRNZXRhZGF0YSh0ZXN0UHJvZHVjdCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldE1ldCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJldE1ldC5jb250YWluc0tleShDb3JlTWV0S2V5cy5QUk9EVUNUX1NUUlVDVFVSRSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQsIHJldE1ldAorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuUFJPRFVDVF9TVFJVQ1RVUkUpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU1ldGFkYXRhKCkgeworICAgICAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJGaWxlbmFtZSIsICJ0ZW1wUHJvZHVjdCIpOworCisgICAgICAgIFByb2R1Y3QgdGVzdFByb2R1Y3QgPSBnZXRUZXN0UHJvZHVjdCgpOworICAgICAgICB0ZXN0UHJvZHVjdC5zZXRQcm9kdWN0SWQoIjEiKTsgLy8gbmVlZCB0byBsaW5rIG1ldGFkYXRhIHRvIHByb2QKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXlDYXQuYWRkTWV0YWRhdGEobWV0LCB0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXlDYXQucmVtb3ZlTWV0YWRhdGEobWV0LCB0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0YWRhdGEgcmV0TWV0ID0gbXlDYXQuZ2V0TWV0YWRhdGEodGVzdFByb2R1Y3QpOworICAgICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gcmV0TWV0LmdldE1ldGFkYXRhKCJGaWxlbmFtZSIpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaW5nZXN0IGZpcnN0IGZpbGUKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIHRlc3RQcm9kdWN0LnNldFByb2R1Y3RJZCgiMjMiKTsKKyAgICAgICAgTWV0YWRhdGEgcHJvZE1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgIi9pbmdlc3QiKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLCBuZXcgRmlsZSgKKyAgICAgICAgICAgIGluZ2VzdFVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUsICJ0ZXN0LWZpbGUtMS50eHQiKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgIlRlc3RGaWxlMSIpOworICAgICAgICBwcm9kTWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLlBST0RVQ1RfVFlQRSwgIkdlbmVyaWNGaWxlIik7CisgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoIk5vbWluYWxEYXRlIiwgIjIwMDgtMDEtMjAiKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YSgiRGF0YVZlcnNpb24iLCAiMy42Iik7CisgICAgICAgIG15Q2F0LmFkZE1ldGFkYXRhKHByb2RNZXQsIHRlc3RQcm9kdWN0KTsKKworICAgICAgICAvLyBpbmdlc3Qgc2Vjb25kIGZpbGUKKyAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdElkKCIyNCIpOworICAgICAgICBwcm9kTWV0LnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgInRlc3QtZmlsZS0yLnR4dCIpOworICAgICAgICBwcm9kTWV0LnJlcGxhY2VNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgIlRlc3RGaWxlMiIpOworICAgICAgICBteUNhdC5hZGRNZXRhZGF0YShwcm9kTWV0LCB0ZXN0UHJvZHVjdCk7CisKKyAgICAgICAgLy8gaW5nZXN0IHRocmlkIGZpbGUKKyAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdElkKCIyNSIpOworICAgICAgICBwcm9kTWV0LnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgInRlc3QtZmlsZS0yLnR4dCIpOworICAgICAgICBwcm9kTWV0LnJlcGxhY2VNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgIlRlc3RGaWxlMyIpOworICAgICAgICBwcm9kTWV0LnJlcGxhY2VNZXRhZGF0YSgiRGF0YVZlcnNpb24iLCAiNC42Iik7CisgICAgICAgIG15Q2F0LmFkZE1ldGFkYXRhKHByb2RNZXQsIHRlc3RQcm9kdWN0KTsKKworICAgICAgICAvLyBwZXJmb3JtIGZpcnN0IHF1ZXJ5CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgICAgIHF1ZXJ5CisgICAgICAgICAgICAgICAgLmFkZENyaXRlcmlvbihTcWxQYXJzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZVNxbFdoZXJlQ2xhdXNlKCJDQVMuUHJvZHVjdE5hbWUgIT0gJ1Rlc3RGaWxlMycgQU5EIChGaWxlbmFtZSA9PSAndGVzdC1maWxlLTEudHh0JyBPUiBGaWxlbmFtZSA9PSAndGVzdC1maWxlLTIudHh0JykgQU5EIENBUy5Qcm9kdWN0TmFtZSAhPSAnVGVzdEZpbGUyJyIpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHF1ZXJ5KTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb2R1Y3RJZHMgPSBteUNhdC5xdWVyeShxdWVyeSwgdGVzdFByb2R1Y3QKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcm9kdWN0SWRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMjNdIiwgcHJvZHVjdElkcy50b1N0cmluZygpKTsKKworICAgICAgICAvLyBwZXJmb3JtIHNlY29uZCBxdWVyeQorICAgICAgICBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICBxdWVyeQorICAgICAgICAgICAgICAgIC5hZGRDcml0ZXJpb24oU3FsUGFyc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAucGFyc2VTcWxXaGVyZUNsYXVzZSgiRmlsZW5hbWUgPT0gJ3Rlc3QtZmlsZS0xLnR4dCcgT1IgKEZpbGVuYW1lID09ICd0ZXN0LWZpbGUtMi50eHQnIEFORCBDQVMuUHJvZHVjdE5hbWUgIT0gJ1Rlc3RGaWxlMicpIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocXVlcnkpOworICAgICAgICBwcm9kdWN0SWRzID0gbXlDYXQucXVlcnkocXVlcnksIHRlc3RQcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJvZHVjdElkcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzI1LCAyM10iLCBwcm9kdWN0SWRzLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIHBlcmZvcm0gc2Vjb25kIHF1ZXJ5CisgICAgICAgIHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgICAgIHF1ZXJ5CisgICAgICAgICAgICAgICAgLmFkZENyaXRlcmlvbihTcWxQYXJzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZVNxbFdoZXJlQ2xhdXNlKCJOb21pbmFsRGF0ZSA9PSAnMjAwOC0wMS0yMCcgQU5EIERhdGFWZXJzaW9uID49ICczLjYnIEFORCBEYXRhVmVyc2lvbiA8PSAnNC4wJyIpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHF1ZXJ5KTsKKyAgICAgICAgcHJvZHVjdElkcyA9IG15Q2F0LnF1ZXJ5KHF1ZXJ5LCB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByb2R1Y3RJZHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsyNCwgMjNdIiwgcHJvZHVjdElkcy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNjaGVtYVBhdGgoKSB7CisgICAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgIi90ZXN0Y2F0LnNxbCIpOworCisgICAgICAgIHJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2F0YWxvZyhDYXRhbG9nIGNhdCl7CisgICAgICAgIHRoaXMubXlDYXQgPSBjYXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZUNhdGFsb2dGYWN0b3J5KCkuY3JlYXRlQ2F0YWxvZygpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2NoZW1hKCkgeworICAgICAgICBTdHJpbmcgdXJsID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXJsIik7CisgICAgICAgIFN0cmluZyB1c2VyID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXNlciIpOworICAgICAgICBTdHJpbmcgcGFzcyA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnBhc3MiKTsKKyAgICAgICAgU3RyaW5nIGRyaXZlciA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLmRyaXZlciIpOworCisgICAgICAgIERhdGFTb3VyY2UgZHMgPSBEYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyLmJ1aWxkRGF0YVNvdXJjZSh1c2VyLCBwYXNzLAorICAgICAgICAgICAgICAgIGRyaXZlciwgdXJsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNxbFNjcmlwdCBjb3JlU2NoZW1hU2NyaXB0ID0gbmV3IFNxbFNjcmlwdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZ2V0U2NoZW1hUGF0aCgpKS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHMpOworICAgICAgICAgICAgY29yZVNjaGVtYVNjcmlwdC5sb2FkU2NyaXB0KCk7CisgICAgICAgICAgICBjb3JlU2NoZW1hU2NyaXB0LmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZHVjdCBnZXRUZXN0UHJvZHVjdCgpIHsKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAidXJuOm9vZHQ6R2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgdGVzdFByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKCJHZW5lcmljRmlsZSIpOworICAgICAgICByZXR1cm4gdGVzdFByb2R1Y3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0YWRhdGEgZ2V0VGVzdE1ldGFkYXRhKFN0cmluZyBwcm9kTmFtZSkgeworICAgICAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJDQVMuUHJvZHVjdE5hbWUiLCBwcm9kTmFtZSk7CisgICAgICAgIHJldHVybiBtZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9UZXN0THVjZW5lQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvVGVzdEx1Y2VuZUNhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDc5MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvVGVzdEx1Y2VuZUNhdGFsb2cuamF2YQpAQCAtMCwwICsxLDU0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Cb29sZWFuUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBzdWl0ZSBmb3IgdGhlIHtAbGluayBMdWNlbmVDYXRhbG9nfSBhbmQge0BsaW5rIEx1Y2VuZUNhdGFsb2dGYWN0b3J5fS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0THVjZW5lQ2F0YWxvZyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgTHVjZW5lQ2F0YWxvZyBteUNhdDsKKworICAgIHByaXZhdGUgU3RyaW5nIHRtcERpclBhdGggPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGNhdFBhZ2VTaXplID0gMjA7CisKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygKKyAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgcHVibGljIHZvaWQgc2V0VXBQcm9wZXJ0aWVzKCkgeworCisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBmaWxlbWdyUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAiL2ZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgZmlsZW1nclByb3BlcnRpZXNVcmwuZ2V0RmlsZSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCBhIHRlbXAgZGlyZWN0b3J5CisKKyAgICAgICAgRmlsZSB0ZW1wRGlyID0gbnVsbDsKKyAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZm9vIiwgImJhciIpOworICAgICAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgICAgICB0ZW1wRGlyID0gdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0bXBEaXJQYXRoID0gdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgaWYgKCF0bXBEaXJQYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHRtcERpclBhdGggKz0gIi8iOworICAgICAgICB9CisKKyAgICAgICAgdG1wRGlyUGF0aCArPSAidGVzdENhdC8iOworCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgY2F0YWxvZyBvbmVzCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoIiwKKyAgICAgICAgICAgICAgICB0bXBEaXJQYXRoKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUucGFnZVNpemUiLCAiMjAiKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5jb21taXRMb2NrVGltZW91dC5zZWNvbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICI2MCIpOworCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLndyaXRlTG9ja1RpbWVvdXQuc2Vjb25kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiNjAiKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUubWVyZ2VGYWN0b3IiLAorICAgICAgICAgICAgICAgICIyMCIpOworCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgdmFsIGxheWVyIG9uZXMKKyAgICAgICAgVVJMIGV4YW1wbGVzQ29yZVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIvZXhhbXBsZXMvY29yZSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzIiwKKyAgICAgICAgICAgICJmaWxlOi8vIiArIG5ldyBGaWxlKGV4YW1wbGVzQ29yZVVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VXBQcm9wZXJ0aWVzKCk7CisgICAgICAgIG15Q2F0ID0gKEx1Y2VuZUNhdGFsb2cpIG5ldyBMdWNlbmVDYXRhbG9nRmFjdG9yeSgpLmNyZWF0ZUNhdGFsb2coKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbm93IHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB1c2VkCisKKyAgICAgICAgaWYgKHRtcERpclBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZSh0bXBEaXJQYXRoKTsKKyAgICAgICAgICAgIEZpbGVbXSB0bXBGaWxlcyA9IHRtcERpci5saXN0RmlsZXMoKTsKKworICAgICAgICAgICAgaWYgKHRtcEZpbGVzICE9IG51bGwgJiYgdG1wRmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG1wRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wRGlyLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXlDYXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG15Q2F0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgKiBAc2luY2UgT09EVC0zODIKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NhdGFsb2dEaXJlY3RvcnlRdWVyaWVzKCkgeworICAgICAgICAvLyBUZXN0IHF1ZXJ5aW5nIGFnYWluc3QgYSBjYXRhbG9nIGRpcmVjdG9yeSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZCBvciBpcyBlbXB0eS4gCisgICAgICAgIC8vIFRoZSBMdWNlbmVDYXRhbG9nRmFjdG9yeSBzaG91bGQgYmUgY3JlYXRpbmcgdGhlIGluZGV4IGRpcmVjdG9yeSBpZiBub3QgdGhlcmUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5nZXRUb3BOUHJvZHVjdHMoMTApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0YWRhdGEoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKyAgICAgICBteUNhdC5hZGRQcm9kdWN0KHByb2R1Y3QpOworICAgICAgIG15Q2F0LmFkZFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpOworICAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICBtLmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sIExpc3RzLm5ld0FycmF5TGlzdCgiL2xvYy8xIiwgIi9sb2MvMiIpKTsKKyAgICAgICBteUNhdC5hZGRNZXRhZGF0YShtLCBwcm9kdWN0KTsKKyAgICAgICBNZXRhZGF0YSBybmRUcmlwTWV0ID0gbXlDYXQuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisKKyAgICAgICBhc3NlcnROb3ROdWxsKHJuZFRyaXBNZXQpOworICAgICAgIGFzc2VydEVxdWFscygyLCBybmRUcmlwTWV0LmdldEFsbE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pLnNpemUoKSk7CisgICAgICAgYXNzZXJ0VHJ1ZShybmRUcmlwTWV0LmdldEFsbE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pLmNvbnRhaW5zKCIvbG9jLzEiKSk7CisgICAgICAgYXNzZXJ0VHJ1ZShybmRUcmlwTWV0LmdldEFsbE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pLmNvbnRhaW5zKCIvbG9jLzIiKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZWR1Y2VkTWV0YWRhdGEoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKyAgICAgICBteUNhdC5hZGRQcm9kdWN0KHByb2R1Y3QpOworICAgICAgIG15Q2F0LmFkZFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpOworICAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICBtLmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sIExpc3RzLm5ld0FycmF5TGlzdCgiL2xvYy8xIiwgIi9sb2MvMiIpKTsKKyAgICAgICBteUNhdC5hZGRNZXRhZGF0YShtLCBwcm9kdWN0KTsKKyAgICAgICBNZXRhZGF0YSBybmRUcmlwTWV0ID0gbXlDYXQuZ2V0UmVkdWNlZE1ldGFkYXRhKHByb2R1Y3QsCisgICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pKTsKKworICAgICAgIGFzc2VydE5vdE51bGwocm5kVHJpcE1ldCk7CisgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJuZFRyaXBNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuc2l6ZSgpKTsKKyAgICAgICBhc3NlcnRUcnVlKHJuZFRyaXBNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuY29udGFpbnMoIi9sb2MvMSIpKTsKKyAgICAgICBhc3NlcnRUcnVlKHJuZFRyaXBNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuY29udGFpbnMoIi9sb2MvMiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVkdWNlZE1ldGFkYXRhTnVsbCgpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKwkgICAgICBQcm9kdWN0IHAgPSBnZXRUZXN0UHJvZHVjdCgpOworCSAgICAgIG15Q2F0LmFkZFByb2R1Y3QocCk7CisJICAgICAgbXlDYXQuYWRkUHJvZHVjdFJlZmVyZW5jZXMocCk7CisJICAgICAgbXlDYXQuYWRkTWV0YWRhdGEobmV3IE1ldGFkYXRhKCksIHApOworCisJICAgICAgLy8gc2hvdWxkIG5vdCB0aHJvdyBOUEUgaGVyZQorCSAgICAgIE1ldGFkYXRhIHJuZFRyaXBNZXQgPSBteUNhdC5nZXRSZWR1Y2VkTWV0YWRhdGEocCwgTGlzdHMubmV3QXJyYXlMaXN0KENvcmVNZXRLZXlzLkZJTEVOQU1FKSk7CisKKwkgICAgICBhc3NlcnROb3ROdWxsKHJuZFRyaXBNZXQpOworCSAgICAgIC8vIHNob3VsZCByZXR1cm4gbnVsbCBpZiBtZXQga2V5IGhhcyBubyB2YWx1ZQorCSAgICAgIGFzc2VydE51bGwocm5kVHJpcE1ldC5nZXRBbGxNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9kdWN0KCkgeworICAgICAgICBQcm9kdWN0IHByb2R1Y3RUb1JlbW92ZSA9IGdldFRlc3RQcm9kdWN0KCk7CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgbmFtZQorICAgICAgICBwcm9kdWN0VG9SZW1vdmUuc2V0UHJvZHVjdE5hbWUoInJlbW92ZW1lIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHByb2R1Y3RUb1JlbW92ZSk7CisgICAgICAgICAgICBteUNhdC5hZGRNZXRhZGF0YShnZXRUZXN0TWV0YWRhdGEoInRlbXBQcm9kdWN0IiksIHByb2R1Y3RUb1JlbW92ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgcmV0UHJvZHVjdCA9IG51bGw7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgdHlwZS5zZXROYW1lKCJHZW5lcmljRmlsZSIpOworICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQoInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFByb2R1Y3QgPSBteUNhdC5nZXRQcm9kdWN0QnlOYW1lKCJyZW1vdmVtZSIpOworICAgICAgICAgICAgcmV0UHJvZHVjdC5zZXRQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwocmV0UHJvZHVjdCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG15Q2F0LnJlbW92ZVByb2R1Y3QocmV0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgcmV0UHJvZEFmdGVyUmVtb3ZlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFByb2RBZnRlclJlbW92ZSA9IG15Q2F0LmdldFByb2R1Y3RCeU5hbWUoInJlbW92ZW1lIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE51bGwocmV0UHJvZEFmdGVyUmVtb3ZlKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9kdWN0KCkgeworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG15Q2F0LmFkZFByb2R1Y3QodGVzdFByb2R1Y3QpOworICAgICAgICAgICAgbXlDYXQuYWRkTWV0YWRhdGEoZ2V0VGVzdE1ldGFkYXRhKCJ0ZW1wUHJvZHVjdCIpLCB0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwodGVzdFByb2R1Y3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgICAgLy8gbm93IGNoYW5nZSBzb21ldGhpbmcKKyAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdE5hbWUoImYwMDIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG15Q2F0Lm1vZGlmeVByb2R1Y3QodGVzdFByb2R1Y3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RQcm9kdWN0KTsKKworICAgICAgICBQcm9kdWN0IHJldFByb2R1Y3Q7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRQcm9kdWN0ID0gbXlDYXQuZ2V0UHJvZHVjdEJ5TmFtZSgiZjAwMiIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRQcm9kdWN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZjAwMiIsIHJldFByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIE9PRFQtMTMzCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZpcnN0UHJvZHVjdE9ubHlPbkZpcnN0UGFnZSgpIHsKKyAgICAgICAgLy8gYWRkIGNhdFBhZ2VTaXplIG9mIHRoZSB0ZXN0IFByb2R1Y3QKKyAgICAgICAgLy8gdGhlbiBhZGQgYSBwcm9kdWN0IGNhbGxlZCAiU2hvdWxkQmVGaXJzdEZvclBhZ2UudHh0IgorICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3Qgb25lIG9uIHRoZSAybmQgcGFnZQorCisgICAgICAgIFByb2R1Y3QgdGVzdFByb2QgPSBnZXRUZXN0UHJvZHVjdCgpOworICAgICAgICBNZXRhZGF0YSBtZXQgPSBnZXRUZXN0TWV0YWRhdGEoInRlc3QiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY2F0UGFnZVNpemU7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHRlc3RQcm9kKTsKKyAgICAgICAgICAgICAgICBteUNhdC5hZGRNZXRhZGF0YShtZXQsIHRlc3RQcm9kKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZXN0UHJvZC5zZXRQcm9kdWN0TmFtZSgiU2hvdWxkQmVGaXJzdEZvclBhZ2UudHh0Iik7CisgICAgICAgIG1ldC5yZXBsYWNlTWV0YWRhdGEoIkNBUy5Qcm9kdXROYW1lIiwgIlNob3VsZEJlRmlyc3RGb3JQYWdlLnR4dCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHRlc3RQcm9kKTsKKyAgICAgICAgICAgIG15Q2F0LmFkZE1ldGFkYXRhKG1ldCwgdGVzdFByb2QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChteUNhdC5nZXRQcm9kdWN0cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMSwgbXlDYXQuZ2V0UHJvZHVjdHMoKS5zaXplKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgIHR5cGUuc2V0UHJvZHVjdFR5cGVJZCgidXJuOm9vZHQ6R2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgdHlwZS5zZXROYW1lKCJHZW5lcmljRmlsZSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKG15Q2F0LmdldEZpcnN0UGFnZSh0eXBlKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobXlDYXQuZ2V0Rmlyc3RQYWdlKHR5cGUpLmdldFBhZ2VQcm9kdWN0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhdFBhZ2VTaXplLCBteUNhdC5nZXRGaXJzdFBhZ2UodHlwZSkuZ2V0UGFnZVByb2R1Y3RzKCkKKyAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKyAgICAgICAgUHJvZHVjdFBhZ2UgcGFnZSA9IG15Q2F0LmdldE5leHRQYWdlKHR5cGUsIG15Q2F0LmdldEZpcnN0UGFnZSh0eXBlKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFnZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFnZS5nZXRQYWdlUHJvZHVjdHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwYWdlLmdldFBhZ2VQcm9kdWN0cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwYWdlLmdldFRvdGFsUGFnZXMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5nZXQoMCkpOworICAgICAgICBQcm9kdWN0IHJldFByb2QgPSAoKFByb2R1Y3QpIHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGRCZUZpcnN0Rm9yUGFnZS50eHQiLCByZXRQcm9kLmdldFByb2R1Y3ROYW1lKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC0xNDEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wUmVzdWx0cygpeworICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICB0cnl7CisgICAgICAgIG15Q2F0LmFkZFByb2R1Y3QodGVzdFByb2R1Y3QpOworICAgICAgICBteUNhdC5hZGRNZXRhZGF0YShnZXRUZXN0TWV0YWRhdGEoInRlbXBQcm9kdWN0IiksIHRlc3RQcm9kdWN0KTsKKyAgICAgICAgbXlDYXQuZ2V0VG9wTlByb2R1Y3RzKDIwKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFByb2R1Y3QoKSB7CisKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHRlc3RQcm9kdWN0KTsKKyAgICAgICAgICAgIG15Q2F0LmFkZE1ldGFkYXRhKGdldFRlc3RNZXRhZGF0YSgidGVtcFByb2R1Y3QiKSwgdGVzdFByb2R1Y3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgUHJvZHVjdCByZXRQcm9kdWN0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0UHJvZHVjdCA9IG15Q2F0LmdldFByb2R1Y3RCeU5hbWUoInRlc3QiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0UHJvZHVjdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCByZXRQcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQsIHJldFByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldFByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInVybjpvb2R0OkdlbmVyaWNGaWxlIiwgcmV0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUlkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByb2R1Y3QuU1RBVFVTX1RSQU5TRkVSLCByZXRQcm9kdWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc2ZlclN0YXR1cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTWV0YWRhdGEoKSB7CisgICAgICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtZXQuYWRkTWV0YWRhdGEoIlByb2R1Y3RTdHJ1Y3R1cmUiLCBQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG15Q2F0LmFkZFByb2R1Y3QodGVzdFByb2R1Y3QpOworICAgICAgICAgICAgbXlDYXQuYWRkTWV0YWRhdGEobWV0LCB0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0YWRhdGEgcmV0TWV0ID0gbXlDYXQuZ2V0TWV0YWRhdGEodGVzdFByb2R1Y3QpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRNZXQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXRNZXQuY29udGFpbnNLZXkoQ29yZU1ldEtleXMuUFJPRFVDVF9TVFJVQ1RVUkUpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9GTEFULCByZXRNZXQKKyAgICAgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKENvcmVNZXRLZXlzLlBST0RVQ1RfU1RSVUNUVVJFKSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVNZXRhZGF0YSgpIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YSgiRmlsZW5hbWUiLCAidGVtcFByb2R1Y3QiKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJQcm9kdWN0U3RydWN0dXJlIiwgIkZsYXQiKTsKKworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG15Q2F0LmFkZFByb2R1Y3QodGVzdFByb2R1Y3QpOworICAgICAgICAgICAgbXlDYXQuYWRkTWV0YWRhdGEobWV0LCB0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXlDYXQucmVtb3ZlTWV0YWRhdGEobWV0LCB0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0YWRhdGEgcmV0TWV0ID0gbXlDYXQuZ2V0TWV0YWRhdGEodGVzdFByb2R1Y3QpOworICAgICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gcmV0TWV0LmdldE1ldGFkYXRhKCJGaWxlbmFtZSIpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlZFF1ZXJ5KCl7CisgICAgCS8vIEFkZCBhIGNvdXBsZSBvZiBQcm9kdWN0cyBhbmQgYXNzb2NpYXRlZCBNZXRhZGF0YQorICAgIAlQcm9kdWN0IHRlc3RQcm9kdWN0ID0gbnVsbDsKKyAgICAJZm9yKGludCBpID0gMDsgaSA8IGNhdFBhZ2VTaXplICsgMTsgaSsrKXsKKyAgICAJCXRlc3RQcm9kdWN0ID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiICsgaSwKKwkJCQkJInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgCQl0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLnNldE5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgCQlSZWZlcmVuY2UgcmVmID0gbmV3IFJlZmVyZW5jZSgiZmlsZTovLy9mb28udHh0IiwgImZpbGU6Ly8vYmFyLnR4dCIsIDEwMCk7CisgICAgICAgICAgICBWZWN0b3I8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gbmV3IFZlY3RvcjxSZWZlcmVuY2U+KCk7CisgICAgICAgICAgICByZWZlcmVuY2VzLmFkZChyZWYpOworICAgICAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMocmVmZXJlbmNlcyk7CisgICAgCQlNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAJCW1ldC5hZGRNZXRhZGF0YSgiRmlsZW5hbWUiLCAidGVtcFByb2R1Y3QiICsgaSk7CisgICAgCQltZXQuYWRkTWV0YWRhdGEoIlByb2R1Y3RTdHJ1Y3R1cmUiLCAiRmxhdCIpOworICAgIAkJdHJ5IHsKKyAgICAgICAgICAgICAgICBteUNhdC5hZGRQcm9kdWN0KHRlc3RQcm9kdWN0KTsKKyAgICAgICAgICAgICAgICBteUNhdC5hZGRNZXRhZGF0YShtZXQsIHRlc3RQcm9kdWN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAJfQorICAgIAkKKyAgICAJLy8gRm9ybXVsYXRlIGEgdGVzdCBxdWVyeQorICAgIAlRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgIAlCb29sZWFuUXVlcnlDcml0ZXJpYSBicWMgPSBuZXcgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEoKTsKKyAgICAJdHJ5eworICAgIAkJYnFjLnNldE9wZXJhdG9yKEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCk7CisgICAgCX1jYXRjaCAoRXhjZXB0aW9uIGUpeworICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIAl9CisgICAgCVRlcm1RdWVyeUNyaXRlcmlhIHRxYyA9IG5ldyBUZXJtUXVlcnlDcml0ZXJpYSgpOworICAgIAl0cWMuc2V0RWxlbWVudE5hbWUoIlByb2R1Y3RTdHJ1Y3R1cmUiKTsKKyAgICAJdHFjLnNldFZhbHVlKCJGbGF0Iik7CisgICAgCXRyeXsKKyAgICAJCWJxYy5hZGRUZXJtKHRxYyk7CisgICAgCX1jYXRjaCAoRXhjZXB0aW9uIGUpeworICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIAl9CisgICAgCXRxYyA9IG5ldyBUZXJtUXVlcnlDcml0ZXJpYSgpOworICAgIAl0cWMuc2V0RWxlbWVudE5hbWUoIkZpbGVuYW1lIik7CisgICAgCXRxYy5zZXRWYWx1ZSgidGVtcFByb2R1Y3QxIik7CisgICAgCXRyeXsKKyAgICAJCWJxYy5hZGRUZXJtKHRxYyk7CisgICAgCX1jYXRjaCAoRXhjZXB0aW9uIGUpeworICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIAl9CisgICAgCXF1ZXJ5LmFkZENyaXRlcmlvbihicWMpOworICAgIAkKKyAgICAJLy8gUGVyZm9ybSB0aGUgcXVlcnkgYW5kIHZhbGlkYXRlIHJlc3VsdHMKKyAgICAJUHJvZHVjdFBhZ2UgcGFnZSA9IG51bGw7CisgICAgCXRyeXsKKyAgICAJCXBhZ2UgPSBteUNhdC5wYWdlZFF1ZXJ5KHF1ZXJ5LCB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLCAxKTsKKyAgICAJfWNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgCX0KKyAgICAJYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkuc2l6ZSgpLCAxKTsKKyAgICAJYXNzZXJ0RXF1YWxzKHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkuZ2V0KDApLmdldFByb2R1Y3ROYW1lKCksICJ0ZXN0MSIpOworICAgIAlhc3NlcnRFcXVhbHMocGFnZS5nZXRQYWdlTnVtKCksIDEpOworICAgIAlhc3NlcnRFcXVhbHMocGFnZS5nZXRUb3RhbFBhZ2VzKCksIDEpOworICAgIH0KKwkKKyAgICBwcml2YXRlIHN0YXRpYyBQcm9kdWN0IGdldFRlc3RQcm9kdWN0KCkgeworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiLAorICAgICAgICAgICAgICAgICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgICB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLnNldE5hbWUoIkdlbmVyaWNGaWxlIik7CisKKyAgICAgICAgLy8gc2V0IHJlZmVyZW5jZXMKKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IG5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vZm9vLnR4dCIsICJmaWxlOi8vL2Jhci50eHQiLCAxMDApOworICAgICAgICBWZWN0b3IgcmVmZXJlbmNlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgcmVmZXJlbmNlcy5hZGQocmVmKTsKKyAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMocmVmZXJlbmNlcyk7CisKKyAgICAgICAgcmV0dXJuIHRlc3RQcm9kdWN0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGFkYXRhIGdldFRlc3RNZXRhZGF0YShTdHJpbmcgcHJvZE5hbWUpIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgcHJvZE5hbWUpOworICAgICAgICByZXR1cm4gbWV0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvVGVzdE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9UZXN0TWFwcGVkRGF0YVNvdXJjZUNhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmVmZGIyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvVGVzdE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nIGV4dGVuZHMgVGVzdERhdGFTb3VyY2VDYXRhbG9nIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgLy8gR2V0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGFuZCBzZXQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzLgorICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAiL3Rlc3RjYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcyIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLm1hcHBlZGRhdGFzb3VyY2UubWFwRmlsZSIsCisgICAgICAgICAgICBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisgICAgICAgIHNldENhdGFsb2coZ2V0Q2F0YWxvZygpKTsKKworICAgIH0KKworICAgIHByb3RlY3RlZCBDYXRhbG9nIGdldENhdGFsb2coKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hcHBlZERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSgpLmNyZWF0ZUNhdGFsb2coKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuVGVzdERhdGFTb3VyY2VDYXRhbG9nI2dldFNjaGVtYVBhdGgoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hUGF0aCgpIHsKKyAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIvdGVzdGNhdC5tYXBwZWQuc3FsIik7CisKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvVGVzdE9yZGVyZWREYXRhU291cmNlQ2F0YWxvZy5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NhdGFsb2cvVGVzdE9yZGVyZWREYXRhU291cmNlQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNmVkNWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2F0YWxvZy9UZXN0T3JkZXJlZERhdGFTb3VyY2VDYXRhbG9nLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogICAgICAgICAgPHA+CisgKiAgICAgICAgICBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqICAgICAgICAgIDwvcD4KKyAqICAgICAgICAgIC4KKyAqLworcHVibGljIGNsYXNzIFRlc3RPcmRlcmVkRGF0YVNvdXJjZUNhdGFsb2cgZXh0ZW5kcyBUZXN0RGF0YVNvdXJjZUNhdGFsb2cgeworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAvLyBTZXQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzLgorICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLm9yZGVyZWRWYWx1ZXMiLCAidHJ1ZSIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisgICAgc2V0Q2F0YWxvZyhnZXRDYXRhbG9nKCkpOworCisgIH0KKworICBwcm90ZWN0ZWQgQ2F0YWxvZyBnZXRDYXRhbG9nKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VDYXRhbG9nRmFjdG9yeSgpLmNyZWF0ZUNhdGFsb2coKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuVGVzdERhdGFTb3VyY2VDYXRhbG9nI2dldFNjaGVtYVBhdGgoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hUGF0aCgpIHsKKyAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgIi90ZXN0Y2F0Lm9yZGVyZWQuc3FsIik7CisKKyAgICAgIHJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcmluZygpIHsKKyAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKyAgICBNZXRhZGF0YSB0ZXN0TWV0ID0gZ2V0VGVzdE1ldGFkYXRhKCJ0ZXN0Iik7CisKKyAgICB0cnkgeworICAgICAgbXlDYXQuYWRkUHJvZHVjdCh0ZXN0UHJvZHVjdCk7CisgICAgICBteUNhdC5hZGRNZXRhZGF0YSh0ZXN0TWV0LCB0ZXN0UHJvZHVjdCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBQcm9kdWN0IHJldFByb2R1Y3Q7CisgICAgdHJ5IHsKKyAgICAgIE1ldGFkYXRhIHJldE1ldCA9IG15Q2F0LmdldE1ldGFkYXRhKHRlc3RQcm9kdWN0KTsKKyAgICAgIGFzc2VydE5vdE51bGwocmV0TWV0KTsKKyAgICAgIGFzc2VydE5vdE51bGwocmV0TWV0LmdldEFsbE1ldGFkYXRhKCJDQVMuUHJvZHVjdE5hbWUiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMywgcmV0TWV0LmdldEFsbE1ldGFkYXRhKCJDQVMuUHJvZHVjdE5hbWUiKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgcmV0TWV0LmdldEFsbE1ldGFkYXRhKCJDQVMuUHJvZHVjdE5hbWUiKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MiIsIHJldE1ldC5nZXRBbGxNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIikuZ2V0KDEpKTsKKyAgICAgIGFzc2VydEVxdWFscygidGVzdDMiLCByZXRNZXQuZ2V0QWxsTWV0YWRhdGEoIkNBUy5Qcm9kdWN0TmFtZSIpLmdldCgyKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUHJvZHVjdCBnZXRUZXN0UHJvZHVjdCgpIHsKKyAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiLAorICAgICAgICAidXJuOm9vZHQ6R2VuZXJpY0ZpbGUiKTsKKyAgICB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLnNldE5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgcmV0dXJuIHRlc3RQcm9kdWN0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWV0YWRhdGEgZ2V0VGVzdE1ldGFkYXRhKFN0cmluZyBwcm9kTmFtZSkgeworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgcHJvZE5hbWUpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgcHJvZE5hbWUgKyAiMiIpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiQ0FTLlByb2R1Y3ROYW1lIiwgcHJvZE5hbWUgKyAiMyIpOworICAgIHJldHVybiBtZXQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9UZXN0RmlsZU1hbmFnZXJDbGkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvVGVzdEZpbGVNYW5hZ2VyQ2xpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyMDg5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvVGVzdEZpbGVNYW5hZ2VyQ2xpLmphdmEKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuQ21kTGluZVV0aWxpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5PcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuSW5QbGFjZURhdGFUcmFuc2ZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LkNvbXBsZXhRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLk1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLk1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudC5NZXRob2RDYWxsRGV0YWlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBUZXN0cyBGaWxlIE1hbmFnZXIgQ2xpZW50cyBDb21tYW5kLWxpbmUgaW50ZXJmYWNlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RGaWxlTWFuYWdlckNsaSBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBDbWRMaW5lVXRpbGl0eSBjbWRMaW5lVXRpbGl0eTsKKyAgIHByaXZhdGUgTW9ja1htbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudDsKKyAgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKAorICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmRlYnVnIiwgInRydWUiKTsKKworICAgICAgVVJMIGFjdGlvbnNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9jbWQtbGluZS1hY3Rpb25zLnhtbCIpOworICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnNwcmluZy5jb25maWciLAorICAgICAgICAiZmlsZToiICsgbmV3IEZpbGUoYWN0aW9uc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgVVJMIG9wdGlvbnNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9jbWQtbGluZS1vcHRpb25zLnhtbCIpOworICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnNwcmluZy5jb25maWciLAorICAgICAgICAiZmlsZToiICsgbmV3IEZpbGUob3B0aW9uc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICAgIGNtZExpbmVVdGlsaXR5ID0gbmV3IENtZExpbmVVdGlsaXR5KCk7CisgICAgICBVc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlIGFjdGlvblN0b3JlID0gbmV3IFVzZU1vY2tDbGllbnRDbWRMaW5lQWN0aW9uU3RvcmUoKTsKKyAgICAgIGNsaWVudCA9IGFjdGlvblN0b3JlLmdldENsaWVudCgpOworICAgICAgY21kTGluZVV0aWxpdHkuc2V0QWN0aW9uU3RvcmUoYWN0aW9uU3RvcmUpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBPcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyLmNsZWFyUmVnaXN0ZXIoKTsKKyAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEFkZFByb2R1Y3RUeXBlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSA9ICJUZXN0UHJvZHVjdFR5cGUiOworICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlRGVzYyA9ICJQcm9kdWN0VHlwZURlc2MiOworICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlUmVwbyA9ICJQcm9kdWN0VHlwZVJlcG8iOworICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlVmVyc2lvbmVyID0gIlByb2R1Y3RUeXBlVmVyc2lvbmVyIjsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZUlkID0gIk15UHJvZHVjdFR5cGVJZCI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWFkZFByb2R1Y3RUeXBlIgorICAgICAgICAgICAgICAgICAgKyAiIC0tdHlwZU5hbWUgIiArIHByb2R1Y3RUeXBlTmFtZSArICIgLS10eXBlSWQgIitwcm9kdWN0VHlwZUlkKyIgLS10eXBlRGVzYyAiCisgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlRGVzYyArICIgLS1yZXBvc2l0b3J5ICIgKyBwcm9kdWN0VHlwZVJlcG8KKyAgICAgICAgICAgICAgICAgICsgIiAtLXZlcnNpb25DbGFzcyAiICsgcHJvZHVjdFR5cGVWZXJzaW9uZXIpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImFkZFByb2R1Y3RUeXBlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuc2l6ZSgpKTsKKyAgICAgIFByb2R1Y3RUeXBlIHB0ID0gKFByb2R1Y3RUeXBlKSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RUeXBlTmFtZSwgcHQuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0VHlwZURlc2MsIHB0LmdldERlc2NyaXB0aW9uKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RUeXBlUmVwbywgcHQuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RUeXBlVmVyc2lvbmVyLCBwdC5nZXRWZXJzaW9uZXIoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVQcm9kdWN0QnlJZCgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSAiVGVzdFByb2R1Y3RJZCI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWRlbGV0ZVByb2R1Y3RCeUlkIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdElkICIgKyBwcm9kdWN0SWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInJlbW92ZVByb2R1Y3QiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RJZCwKKyAgICAgICAgICAgICgoUHJvZHVjdCkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSkuZ2V0UHJvZHVjdElkKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUHJvZHVjdEJ5TmFtZSgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0TmFtZSA9ICJUZXN0UHJvZHVjdE5hbWUiOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1kZWxldGVQcm9kdWN0QnlOYW1lIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdE5hbWUgIiArIHByb2R1Y3ROYW1lKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJyZW1vdmVQcm9kdWN0IiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0TmFtZSwKKyAgICAgICAgICAgICgoUHJvZHVjdCkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSkuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDdXJyZW50VHJhbnNmZXIoKSB7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWdldEN1cnJlbnRUcmFuc2ZlciIpCisgICAgICAgICAgICAgICAgICAuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0Q3VycmVudEZpbGVUcmFuc2ZlciIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLnNpemUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDdXJyZW50VHJhbnNmZXJzKCkgeworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1nZXRDdXJyZW50VHJhbnNmZXJzIikKKyAgICAgICAgICAgICAgICAgIC5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDdXJyZW50RmlsZVRyYW5zZmVycyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLnNpemUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkKCkgeworICAgICBVUkwgcmVmVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Iik7CisgICAgIFN0cmluZyByZWZQYXRoID0gbmV3IEZpbGUocmVmVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWdldEZpbGVQY3RUcmFuc2ZlcnJlZCIKKyAgICAgICAgICAgICAgICAgICsgIiAtLW9yaWdSZWYgIiArIHJlZlBhdGgpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFJlZlBjdFRyYW5zZmVycmVkIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydFRydWUoKChSZWZlcmVuY2UpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpCisgICAgICAgICAgICAuZ2V0T3JpZ1JlZmVyZW5jZSgpLmVuZHNXaXRoKCJ0ZXN0LnR4dCIpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0UGFnZSgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSAiUHJvZHVjdFR5cGVOYW1lIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5CisgICAgICAgICAgICAucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tb3BlcmF0aW9uIC0tZ2V0Rmlyc3RQYWdlIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdFR5cGVOYW1lICIgKyBwcm9kdWN0VHlwZU5hbWUpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldEZpcnN0UGFnZSIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdFR5cGVOYW1lLCAoKFByb2R1Y3RUeXBlKSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkKKyAgICAgICAgICAgIC5nZXQoMCkpLmdldE5hbWUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYXN0UGFnZSgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSAiUHJvZHVjdFR5cGVOYW1lIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5CisgICAgICAgICAgICAucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tb3BlcmF0aW9uIC0tZ2V0TGFzdFBhZ2UiCisgICAgICAgICAgICAgICAgICArICIgLS1wcm9kdWN0VHlwZU5hbWUgIiArIHByb2R1Y3RUeXBlTmFtZSkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0TGFzdFBhZ2UiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RUeXBlTmFtZSwgKChQcm9kdWN0VHlwZSkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpCisgICAgICAgICAgICAuZ2V0KDApKS5nZXROYW1lKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dFBhZ2UoKSB7CisgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lID0gIlByb2R1Y3RUeXBlTmFtZSI7CisgICAgICBpbnQgY3VyUGFnZSA9IDE7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWdldE5leHRQYWdlIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdFR5cGVOYW1lICIgKyBwcm9kdWN0VHlwZU5hbWUgKyAiIC0tY3VyUGFnZSAiICsgY3VyUGFnZSkKKyAgICAgICAgICAgICAgICAgIC5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXROZXh0UGFnZSIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdFR5cGVOYW1lLCAoKFByb2R1Y3RUeXBlKSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkKKyAgICAgICAgICAgIC5nZXQoMCkpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoY3VyUGFnZSwKKyAgICAgICAgICAgICgoUHJvZHVjdFBhZ2UpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMSkpLmdldFBhZ2VOdW0oKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmV2UGFnZSgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSAiUHJvZHVjdFR5cGVOYW1lIjsKKyAgICAgIGludCBjdXJQYWdlID0gMTsKKyAgICAgIGNtZExpbmVVdGlsaXR5CisgICAgICAgICAgICAucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tb3BlcmF0aW9uIC0tZ2V0UHJldlBhZ2UiCisgICAgICAgICAgICAgICAgICArICIgLS1wcm9kdWN0VHlwZU5hbWUgIiArIHByb2R1Y3RUeXBlTmFtZSArICIgLS1jdXJQYWdlICIgKyBjdXJQYWdlKQorICAgICAgICAgICAgICAgICAgLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFByZXZQYWdlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0VHlwZU5hbWUsICgoUHJvZHVjdFR5cGUpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKQorICAgICAgICAgICAgLmdldCgwKSkuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhjdXJQYWdlLAorICAgICAgICAgICAgKChQcm9kdWN0UGFnZSkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgxKSkuZ2V0UGFnZU51bSgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldE51bVByb2R1Y3RzKCkgeworICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSA9ICJQcm9kdWN0VHlwZU5hbWUiOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1nZXROdW1Qcm9kdWN0cyIKKyAgICAgICAgICAgICAgICAgICsgIiAtLXByb2R1Y3RUeXBlTmFtZSAiICsgcHJvZHVjdFR5cGVOYW1lKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXROdW1Qcm9kdWN0cyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdFR5cGVOYW1lLCAoKFByb2R1Y3RUeXBlKSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkKKyAgICAgICAgICAgIC5nZXQoMCkpLmdldE5hbWUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9kdWN0QnlJZCgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSAiVGVzdFByb2R1Y3RJZCI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWdldFByb2R1Y3RCeUlkIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdElkICIgKyBwcm9kdWN0SWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFByb2R1Y3RCeUlkIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0SWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvZHVjdEJ5TmFtZSgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0TmFtZSA9ICJUZXN0UHJvZHVjdE5hbWUiOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1nZXRQcm9kdWN0QnlOYW1lIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdE5hbWUgIiArIHByb2R1Y3ROYW1lKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRQcm9kdWN0QnlOYW1lIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0TmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9kdWN0UGVyY25ldFRyYW5zZmVycmVkKCkgeworICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9ICJUZXN0UHJvZHVjdElkIjsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5CisgICAgICAgICAgICAucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tb3BlcmF0aW9uIC0tZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdElkICIgKyBwcm9kdWN0SWQgKyAiIC0tcHJvZHVjdFR5cGVOYW1lICIgKyBwcm9kdWN0VHlwZU5hbWUpCisgICAgICAgICAgICAgICAgICAuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkIiwKKyAgICAgICAgICAgIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdElkLAorICAgICAgICAgICAgKChQcm9kdWN0KSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKS5nZXRQcm9kdWN0SWQoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9kdWN0VHlwZUJ5TmFtZSgpIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5CisgICAgICAgICAgICAucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC0tb3BlcmF0aW9uIC0tZ2V0UHJvZHVjdFR5cGVCeU5hbWUiCisgICAgICAgICAgICAgICAgICArICIgLS1wcm9kdWN0VHlwZU5hbWUgIiArIHByb2R1Y3RUeXBlTmFtZSkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0UHJvZHVjdFR5cGVCeU5hbWUiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RUeXBlTmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RIYXNQcm9kdWN0KCkgeworICAgICAgU3RyaW5nIHByb2R1Y3ROYW1lID0gIlRlc3RQcm9kdWN0TmFtZSI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWhhc1Byb2R1Y3QiCisgICAgICAgICAgICAgICAgICArICIgLS1wcm9kdWN0TmFtZSAiICsgcHJvZHVjdE5hbWUpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImhhc1Byb2R1Y3QiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3ROYW1lLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEluZ2VzdFByb2R1Y3QoKSB7CisgICAgIFVSTCByZWZVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvdGVzdC50eHQiKTsKKyAgICAgVVJMIG1ldFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dC5tZXQiKTsKKworICAgICAgU3RyaW5nIHByb2R1Y3ROYW1lID0gIlRlc3RQcm9kdWN0TmFtZSI7CisgICAgICBTdHJpbmcgc3RydWN0dXJlID0gUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVDsKKyAgICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKyAgICAgIFN0cmluZyBtZXRhZGF0YUZpbGUgPSBuZXcgRmlsZShtZXRVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgIFN0cmluZyBkYXRhVHJhbnNmZXJlciA9IEluUGxhY2VEYXRhVHJhbnNmZXJGYWN0b3J5LmNsYXNzCisgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgICAgU3RyaW5nIHJlZiA9IG5ldyBGaWxlKHJlZlVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1pbmdlc3RQcm9kdWN0IgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdE5hbWUgIiArIHByb2R1Y3ROYW1lICsgIiAtLXByb2R1Y3RTdHJ1Y3R1cmUgIgorICAgICAgICAgICAgICAgICAgKyBzdHJ1Y3R1cmUgKyAiIC0tcHJvZHVjdFR5cGVOYW1lICIgKyBwcm9kdWN0VHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICsgIiAtLW1ldGFkYXRhRmlsZSAiICsgbWV0YWRhdGFGaWxlICsgIiAtLXJlZnMgIiArIHJlZgorICAgICAgICAgICAgICAgICAgKyAiIC0tY2xpZW50VHJhbnNmZXIgLS1kYXRhVHJhbnNmZXIgIiArIGRhdGFUcmFuc2ZlcmVyKQorICAgICAgICAgICAgICAgICAgLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImluZ2VzdFByb2R1Y3QiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3ROYW1lLAorICAgICAgICAgICAgKChQcm9kdWN0KSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKS5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhzdHJ1Y3R1cmUsCisgICAgICAgICAgICAoKFByb2R1Y3QpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpCisgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0VHlwZU5hbWUsCisgICAgICAgICAgICAoKFByb2R1Y3QpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpLmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0VHJ1ZSgoKFByb2R1Y3QpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpCisgICAgICAgICAgICAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkuZ2V0T3JpZ1JlZmVyZW5jZSgpLmVuZHNXaXRoKHJlZikpOworCisgICAgICBhc3NlcnRFcXVhbHMoInRlc3QudHh0IiwKKyAgICAgICAgICAgICgoTWV0YWRhdGEpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMSkpCisgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoIkZpbGVuYW1lIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJHZW5lcmljRmlsZSIsICgoTWV0YWRhdGEpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKQorICAgICAgICAgICAgLmdldCgxKSkuZ2V0TWV0YWRhdGEoIlByb2R1Y3RUeXBlIikpOworICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMikpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcE1ldGFkYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSAiVGVzdFByb2R1Y3RJZCI7CisgICAgICBGaWxlIGJvZ3VzRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJvZ3VzIiwgImJvZ3VzIik7CisgICAgICBGaWxlIHRtcEZpbGUgPSBuZXcgRmlsZShib2d1c0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCAiQ2xpRHVtcE1ldGFkYXRhIik7CisgICAgICB0bXBGaWxlLm1rZGlycygpOworICAgICAgYm9ndXNGaWxlLmRlbGV0ZSgpOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1kdW1wTWV0YWRhdGEiCisgICAgICAgICAgICAgICAgICArICIgLS1wcm9kdWN0SWQgIiArIHByb2R1Y3RJZCkuc3BsaXQoIiAiKSk7CisKKyAgICAgIE9wdGlvblByb3BlcnR5UmVnaXN0ZXIuY2xlYXJSZWdpc3RlcigpOworCisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0TWV0YWRhdGEiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3RJZCwKKyAgICAgICAgICAgICgoUHJvZHVjdCkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSkuZ2V0UHJvZHVjdElkKCkpOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1kdW1wTWV0YWRhdGEiCisgICAgICAgICAgICAgICAgICArICIgLS1wcm9kdWN0SWQgIiArIHByb2R1Y3RJZCArICIgLS1vdXRwdXREaXIgIiArIHRtcEZpbGUKKyAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSkuc3BsaXQoIiAiKSk7CisgICAgICBGaWxlVXRpbHMuZm9yY2VEZWxldGUodG1wRmlsZSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RMdWNlbmVRdWVyeSgpIHsKKyAgICAgIFN0cmluZyBxdWVyeSA9ICJQcm9kdWN0SWQ6VGVzdFByb2R1Y3RJZCI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWx1Y2VuZVF1ZXJ5IgorICAgICAgICAgICAgICAgICAgKyAiIC0tcXVlcnkgIiArIHF1ZXJ5KS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJjb21wbGV4UXVlcnkiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0SWQiLCAoKFRlcm1RdWVyeUNyaXRlcmlhKSAoKFF1ZXJ5KSBtZXRob2RDYWxsRGV0YWlscworICAgICAgICAgICAgLmdldEFyZ3MoKS5nZXQoMCkpLmdldENyaXRlcmlhKCkuZ2V0KDApKS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGVzdFByb2R1Y3RJZCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSAoKFF1ZXJ5KSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKQorICAgICAgICAgICAgICAgICAgLmdldENyaXRlcmlhKCkuZ2V0KDApKS5nZXRWYWx1ZSgpKTsKKworICAgICAgT3B0aW9uUHJvcGVydHlSZWdpc3Rlci5jbGVhclJlZ2lzdGVyKCk7CisKKyAgICAgIFN0cmluZyByZWR1Y2VkTWV0YWRhdGFLZXlzID0gIlByb2R1Y3RJZCBQcm9kdWN0VHlwZSI7CisgICAgICBTdHJpbmcgb3V0cHV0Rm9ybWF0ID0gIiRQcm9kdWN0SWQiOworICAgICAgU3RyaW5nIHJlZHVjZWRQcm9kdWN0VHlwZXMgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKyAgICAgIFN0cmluZyBzb3J0QnkgPSAiUHJvZHVjdElkIjsKKyAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAiLCI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLWx1Y2VuZVF1ZXJ5IgorICAgICAgICAgICAgICAgICAgKyAiIC0tcXVlcnkgIiArIHF1ZXJ5ICsgIiAtLXJlZHVjZWRNZXRhZGF0YUtleXMgIiArIHJlZHVjZWRNZXRhZGF0YUtleXMKKyAgICAgICAgICAgICAgICAgICsgIiAtLW91dHB1dEZvcm1hdCAiICsgb3V0cHV0Rm9ybWF0CisgICAgICAgICAgICAgICAgICArICIgLS1yZWR1Y2VkUHJvZHVjdFR5cGVzICIgKyByZWR1Y2VkUHJvZHVjdFR5cGVzCisgICAgICAgICAgICAgICAgICArICIgLS1zb3J0QnkgIiArIHNvcnRCeQorICAgICAgICAgICAgICAgICAgKyAiIC0tZGVsaW1pdGVyICIgKyBkZWxpbWl0ZXIpLnNwbGl0KCIgIikpOworICAgICAgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImNvbXBsZXhRdWVyeSIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBDb21wbGV4UXVlcnkgY29tcGxleFF1ZXJ5ID0gKENvbXBsZXhRdWVyeSkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKTsKKyAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjdElkIiwgKChUZXJtUXVlcnlDcml0ZXJpYSkgY29tcGxleFF1ZXJ5LmdldENyaXRlcmlhKCkuZ2V0KDApKS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGVzdFByb2R1Y3RJZCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBjb21wbGV4UXVlcnkuZ2V0Q3JpdGVyaWEoKS5nZXQoMCkpLmdldFZhbHVlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChyZWR1Y2VkTWV0YWRhdGFLZXlzLnNwbGl0KCIgIikpLCBjb21wbGV4UXVlcnkuZ2V0UmVkdWNlZE1ldGFkYXRhKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dEZvcm1hdCwgY29tcGxleFF1ZXJ5LmdldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChyZWR1Y2VkUHJvZHVjdFR5cGVzLnNwbGl0KCIgIikpLCBjb21wbGV4UXVlcnkuZ2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoc29ydEJ5LCBjb21wbGV4UXVlcnkuZ2V0U29ydEJ5TWV0S2V5KCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0UmV0cmlldmVGaWxlc0J5SWQoKSB7CisgICAgICBTdHJpbmcgcHJvZHVjdElkID0gIlRlc3RQcm9kdWN0SWQiOworICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uID0gIi90bXAvdG9EaXIiOworICAgICAgU3RyaW5nIHRyYW5zZmVyZXIgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5JblBsYWNlRGF0YVRyYW5zZmVyRmFjdG9yeSI7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtLW9wZXJhdGlvbiAtLXJldHJpZXZlRmlsZXNCeUlkIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdElkICIgKyBwcm9kdWN0SWQgKyAiIC0tZGVzdGluYXRpb24gIiArIGRlc3RpbmF0aW9uCisgICAgICAgICAgICAgICAgICArICIgLS10cmFuc2ZlcmVyICIgKyB0cmFuc2ZlcmVyKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRQcm9kdWN0UmVmZXJlbmNlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdElkLCAoKFByb2R1Y3QpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpLmdldFByb2R1Y3RJZCgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFJldHJpZXZlRmlsZXNCeU5hbWUoKSB7CisgICAgICBTdHJpbmcgcHJvZHVjdE5hbWUgPSAiVGVzdFByb2R1Y3ROYW1lIjsKKyAgICAgIFN0cmluZyBkZXN0aW5hdGlvbiA9ICIvdG1wL3RvRGlyIjsKKyAgICAgIFN0cmluZyB0cmFuc2ZlcmVyID0gIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuSW5QbGFjZURhdGFUcmFuc2ZlckZhY3RvcnkiOworICAgICAgY21kTGluZVV0aWxpdHkKKyAgICAgICAgICAgIC5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAgLS1vcGVyYXRpb24gLS1yZXRyaWV2ZUZpbGVzQnlOYW1lIgorICAgICAgICAgICAgICAgICAgKyAiIC0tcHJvZHVjdE5hbWUgIiArIHByb2R1Y3ROYW1lICsgIiAtLWRlc3RpbmF0aW9uICIgKyBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgICAgKyAiIC0tdHJhbnNmZXJlciAiICsgdHJhbnNmZXJlcikuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0UHJvZHVjdFJlZmVyZW5jZXMiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3ROYW1lLCAoKFByb2R1Y3QpIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpLmdldFByb2R1Y3ROYW1lKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9Vc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL1VzZU1vY2tDbGllbnRDbWRMaW5lQWN0aW9uU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDUyNmUxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9Vc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zdG9yZS5zcHJpbmcuU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uU3RvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uRmlsZU1hbmFnZXJDbGlBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5Nb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQSB7QGxpbmsgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlfSB3aGljaCBzZXRzIHtAbGluayBXb3JrZmxvd0NsaUFjdGlvbn1zCisgKiB0byB1c2UgYSB7QGxpbmsgTW9ja1htbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudH0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlIGV4dGVuZHMgU3ByaW5nQ21kTGluZUFjdGlvblN0b3JlIHsKKworICAgcHJpdmF0ZSBNb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50OworCisgICBwdWJsaWMgVXNlTW9ja0NsaWVudENtZExpbmVBY3Rpb25TdG9yZSgpIHsKKyAgICAgIHN1cGVyKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnNwcmluZy5jb25maWciKSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpZW50ID0gbmV3IE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgU2V0PENtZExpbmVBY3Rpb24+IGxvYWRTdXBwb3J0ZWRBY3Rpb25zKCkgdGhyb3dzIENtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbiB7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IHN1cGVyLmxvYWRTdXBwb3J0ZWRBY3Rpb25zKCk7CisgICAgICBmb3IgKENtZExpbmVBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ2xpQWN0aW9uKSB7CisgICAgICAgICAgICAoKEZpbGVNYW5hZ2VyQ2xpQWN0aW9uKSBhY3Rpb24pLnNldENsaWVudChjbGllbnQpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBNb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgICAgcmV0dXJuIGNsaWVudDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RBZGRQcm9kdWN0VHlwZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEFkZFByb2R1Y3RUeXBlQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2Njg1MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RBZGRQcm9kdWN0VHlwZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEFkZFByb2R1Y3RUeXBlQ2xpQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKiBAYXV0aG9yIHJpdmVybWEgKFJpc2hpIFZlcm1hKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFkZFByb2R1Y3RUeXBlQ2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX05BTUUgPSAiVGVzdFByb2R1Y3RUeXBlTmFtZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX0lEID0gIlRlc3RQcm9kdWN0VHlwZUlkIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfREVTQyA9ICJUZXN0UHJvZHVjdFR5cGVEZXNjIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfUkVQTyA9ICJUZXN0UHJvZHVjdFR5cGVSZXBvIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfVkVSU0lPTkVSID0gQmFzaWNWZXJzaW9uZXIuY2xhc3MKKyAgICAgICAgIC5nZXRDYW5vbmljYWxOYW1lKCk7CisKKyAgIHByaXZhdGUgc3RhdGljIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlUGFzc2VkVG9DbGllbnQ7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUVycm9ycygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tBZGRQcm9kdWN0VHlwZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0FkZFByb2R1Y3RUeXBlQ2xpQWN0aW9uKCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlRGVzY3JpcHRpb24oUFJPRFVDVF9UWVBFX0RFU0MpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbi5zZXRGaWxlUmVwb3NpdG9yeVBhdGgoUFJPRFVDVF9UWVBFX1JFUE8pOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbi5zZXRWZXJzaW9uZXIoUFJPRFVDVF9UWVBFX1ZFUlNJT05FUik7CisgICAgICB0cnkgeworICAgIAkgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgIAkgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVJZChQUk9EVUNUX1RZUEVfSUQpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7IC8vIFNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uLgorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUZsb3coKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBNb2NrQWRkUHJvZHVjdFR5cGVDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tBZGRQcm9kdWN0VHlwZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlSWQoUFJPRFVDVF9UWVBFX0lEKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlRGVzY3JpcHRpb24oUFJPRFVDVF9UWVBFX0RFU0MpOworICAgICAgY2xpQWN0aW9uLnNldEZpbGVSZXBvc2l0b3J5UGF0aChQUk9EVUNUX1RZUEVfUkVQTyk7CisgICAgICBjbGlBY3Rpb24uc2V0VmVyc2lvbmVyKFBST0RVQ1RfVFlQRV9WRVJTSU9ORVIpOworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJhZGRQcm9kdWN0VHlwZTogUmVzdWx0OiAiICsgUFJPRFVDVF9UWVBFX0lELCBwcmludGVyCisgICAgICAgICAgICAuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisKKyAgICAgIGFzc2VydEVxdWFscyhQUk9EVUNUX1RZUEVfSUQsIHByb2R1Y3RUeXBlUGFzc2VkVG9DbGllbnQuZ2V0UHJvZHVjdFR5cGVJZCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQUk9EVUNUX1RZUEVfTkFNRSwgcHJvZHVjdFR5cGVQYXNzZWRUb0NsaWVudC5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfVFlQRV9ERVNDLAorICAgICAgICAgICAgcHJvZHVjdFR5cGVQYXNzZWRUb0NsaWVudC5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQUk9EVUNUX1RZUEVfUkVQTywKKyAgICAgICAgICAgIHByb2R1Y3RUeXBlUGFzc2VkVG9DbGllbnQuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfVFlQRV9WRVJTSU9ORVIsCisgICAgICAgICAgICBwcm9kdWN0VHlwZVBhc3NlZFRvQ2xpZW50LmdldFZlcnNpb25lcigpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tBZGRQcm9kdWN0VHlwZUNsaUFjdGlvbiBleHRlbmRzIEFkZFByb2R1Y3RUeXBlQ2xpQWN0aW9uIHsKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYWRkUHJvZHVjdFR5cGUoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgICAgICAgICAgcHJvZHVjdFR5cGVQYXNzZWRUb0NsaWVudCA9IHR5cGU7CisgICAgICAgICAgICAgICByZXR1cm4gUFJPRFVDVF9UWVBFX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3REZWxldGVQcm9kdWN0QnlJZENsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdERlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMGMyZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3REZWxldGVQcm9kdWN0QnlJZENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBEZWxldGVQcm9kdWN0QnlJZENsaUFjdGlvbn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdERlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRCA9ICJUZXN0UHJvZHVjdElkIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiVGVzdFByb2R1Y3ROYW1lIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfMSA9ICJmaWxlOi9kcy9yZWYvMS9wYXRoIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfMiA9ICJmaWxlOi9kcy9yZWYvMi9wYXRoIjsKKworICAgcHJpdmF0ZSBQcm9kdWN0IGNsaWVudFNldFByb2R1Y3Q7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICBjbGllbnRTZXRQcm9kdWN0ID0gbnVsbDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0RlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdElkKFBST0RVQ1RfSUQpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7IC8vIFNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uLgorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxQcm9kdWN0RGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uID0gbmV3IEZhbHNlRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxSZWZzRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUZsb3coKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tEZWxldGVQcm9kdWN0QnlJZENsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RJZChQUk9EVUNUX0lEKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgcHJvZHVjdCAnIiArIFBST0RVQ1RfTkFNRSArICInIiwKKyAgICAgICAgICAgIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUFJPRFVDVF9JRCwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUFJPRFVDVF9OQU1FLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFJFRl8xLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApCisgICAgICAgICAgICAuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFJFRl8yLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDEpCisgICAgICAgICAgICAuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0RlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIGV4dGVuZHMKKyAgICAgICAgIERlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICAgICAgICAgICBQcm9kdWN0IHAgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0SWQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkgeworICAgICAgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhMaXN0cy5uZXdBcnJheUxpc3QobmV3IFJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICJmaWxlOi9maWxlL3BhdGgiLCBSRUZfMSwgMiksIG5ldyBSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAiZmlsZTovZmlsZS9wYXRoIiwgUkVGXzIsIDIpKSk7CisgICAgICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVQcm9kdWN0KFByb2R1Y3QgcCkgeworICAgICAgICAgICAgICAgY2xpZW50U2V0UHJvZHVjdCA9IHA7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbFByb2R1Y3REZWxldGVQcm9kdWN0QnlJZENsaUFjdGlvbiBleHRlbmRzCisgICAgICAgICBNb2NrRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGNsYXNzIE51bGxSZWZzRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24gZXh0ZW5kcworICAgICAgICAgTW9ja0RlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICAgICAgICAgICBQcm9kdWN0IHAgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0SWQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFByb2R1Y3RSZWZlcmVuY2VzKFByb2R1Y3QgcHJvZHVjdCkgeworICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgRmFsc2VEZWxldGVQcm9kdWN0QnlJZENsaUFjdGlvbiBleHRlbmRzCisgICAgICAgICBNb2NrRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RJZChwcm9kdWN0SWQpOworICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUUpOworICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKExpc3RzLm5ld0FycmF5TGlzdChuZXcgUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgImZpbGU6L2ZpbGUvcGF0aCIsIFJFRl8xLCAyKSwgbmV3IFJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICJmaWxlOi9maWxlL3BhdGgiLCBSRUZfMiwgMikpKTsKKyAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVByb2R1Y3QoUHJvZHVjdCBwKSB7CisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdERlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3REZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExNGQ3NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3REZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIERlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdERlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0lEID0gIlRlc3RQcm9kdWN0SWQiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfTkFNRSA9ICJUZXN0UHJvZHVjdE5hbWUiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl8xID0gImZpbGU6L2RzL3JlZi8xL3BhdGgiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl8yID0gImZpbGU6L2RzL3JlZi8yL3BhdGgiOworCisgICBwcml2YXRlIFByb2R1Y3QgY2xpZW50U2V0UHJvZHVjdDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgIGNsaWVudFNldFByb2R1Y3QgPSBudWxsOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFcnJvcnMoKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0RlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOyAvLyBTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbi4KKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBOdWxsUHJvZHVjdERlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUUpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0gICAgICAKKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBGYWxzZURlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUUpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBOdWxsUmVmc0RlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX0lEKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRmxvdygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tEZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlN1Y2Nlc3NmdWxseSBkZWxldGVkIHByb2R1Y3QgJyIgKyBQUk9EVUNUX05BTUUgKyAiJyIsCisgICAgICAgICAgICBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfSUQsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfTkFNRSwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhSRUZfMSwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKQorICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhSRUZfMiwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgxKQorICAgICAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKyAgIH0KKyAgIAorICAgcHVibGljIGNsYXNzIE1vY2tEZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIGV4dGVuZHMgRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RJZChQUk9EVUNUX0lEKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdE5hbWUocHJvZHVjdE5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKExpc3RzLm5ld0FycmF5TGlzdChuZXcgUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgImZpbGU6L2ZpbGUvcGF0aCIsIFJFRl8xLCAyKSwgbmV3IFJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICJmaWxlOi9maWxlL3BhdGgiLCBSRUZfMiwgMikpKTsKKyAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVByb2R1Y3QoUHJvZHVjdCBwKSB7CisgICAgICAgICAgICAgICBjbGllbnRTZXRQcm9kdWN0ID0gcDsKKyAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGaWxlKFN0cmluZyBmaWxlKSB7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUHJvZHVjdERlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGNsYXNzIE51bGxSZWZzRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiBleHRlbmRzCisgICAgICAgICBNb2NrRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8UmVmZXJlbmNlPiBnZXRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGNsYXNzIEZhbHNlRGVsZXRlUHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiBleHRlbmRzIE1vY2tEZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVQcm9kdWN0KFByb2R1Y3QgcCkgeworICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3REdW1wTWV0YWRhdGFDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3REdW1wTWV0YWRhdGFDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNlYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdER1bXBNZXRhZGF0YUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXMuRklMRU5BTUU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgRHVtcE1ldGFkYXRhQ2xpQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RHVtcE1ldGFkYXRhQ2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRCA9ICJUZXN0UHJvZHVjdElkIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUUgPSAiZGF0YS5kYXQiOworCisgICBwcml2YXRlIEZpbGUgdG1wRmlsZTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgRmlsZSBib2d1c0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJib2d1cyIsICJib2d1cyIpOworICAgICAgdG1wRmlsZSA9IG5ldyBGaWxlKGJvZ3VzRmlsZS5nZXRQYXJlbnRGaWxlKCksICJNZXRhZGF0YUR1bXAiKTsKKyAgICAgIHRtcEZpbGUubWtkaXJzKCk7CisgICAgICBib2d1c0ZpbGUuZGVsZXRlKCk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIEZpbGVVdGlscy5mb3JjZURlbGV0ZSh0bXBGaWxlKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdERhdGFGbG93KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgIE1vY2tEdW1wTWV0YWRhdGFDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tEdW1wTWV0YWRhdGFDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRCk7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJub1wiPz5cbiIKKyAgICAgICAgICArICI8Y2FzOm1ldGFkYXRhIHhtbG5zOmNhcz1cImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzXCI+XG4iCisgICAgICAgICAgKyAiPGtleXZhbCB0eXBlPVwidmVjdG9yXCI+XG4iCisgICAgICAgICAgKyAiPGtleT5GaWxlbmFtZTwva2V5PlxuIgorICAgICAgICAgICsgIjx2YWw+ZGF0YS5kYXQ8L3ZhbD5cbiIKKyAgICAgICAgICArICI8L2tleXZhbD5cbiIKKyAgICAgICAgICArICI8L2NhczptZXRhZGF0YT5cbiIsCisgICAgICAgICAgICBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgwKSk7CisKKyAgICAgIGNsaUFjdGlvbi5zZXRPdXRwdXREaXIodG1wRmlsZSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydFRydWUobmV3IEZpbGUodG1wRmlsZSwgRklMRV9OQU1FICsgIi5tZXQiKS5leGlzdHMoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwibm9cIj8+XG4iCisgICAgICAgICAgICArICI8Y2FzOm1ldGFkYXRhIHhtbG5zOmNhcz1cImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzXCI+XG4iCisgICAgICAgICAgICArICI8a2V5dmFsIHR5cGU9XCJ2ZWN0b3JcIj5cbiIKKyAgICAgICAgICAgICsgIjxrZXk+RmlsZW5hbWU8L2tleT5cbiIKKyAgICAgICAgICAgICsgIjx2YWw+ZGF0YS5kYXQ8L3ZhbD5cbiIKKyAgICAgICAgICAgICsgIjwva2V5dmFsPlxuIgorICAgICAgICAgICAgKyAiPC9jYXM6bWV0YWRhdGE+XG4iLAorICAgICAgICAgICAgRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcobmV3IEZpbGUodG1wRmlsZSwgRklMRV9OQU1FICsgIi5tZXQiKSkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0R1bXBNZXRhZGF0YUNsaUFjdGlvbiBleHRlbmRzIER1bXBNZXRhZGF0YUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCkgeworICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdElkKHByb2R1Y3RJZCk7CisgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE1ldGFkYXRhIGdldE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCkgeworICAgICAgICAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICAgICAgICAgbS5hZGRNZXRhZGF0YShGSUxFTkFNRSwgRklMRV9OQU1FKTsKKyAgICAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk3OWNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldEN1cnJlbnRUcmFuc2ZlckNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBHZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb259LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RHZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHX1JFRiA9ICJmaWxlOi9vcmlnL3BhdGgiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERTX1JFRiA9ICJmaWxlOi9kcy9wYXRoIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRklMRV9TSVpFID0gMjA7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJZVEVfVFJBTlMgPSAxMDsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiUHJvZHVjdE5hbWUiOworCisgICBwcml2YXRlIHN0YXRpYyBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzOworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFcnJvcnMoKSB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBOdWxsU3RhdHVzR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBOdWxsU3RhdHVzR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uKCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUZsb3coKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkZpbGUgVHJhbnNmZXI6IFtyZWY9e29yaWc9IiArIE9SSUdfUkVGICsgIixkcz0iICsgRFNfUkVGCisgICAgICAgICAgICArICJ9LHByb2R1Y3Q9IiArIFBST0RVQ1RfTkFNRSArICIsZmlsZVNpemU9IiArIEZJTEVfU0laRQorICAgICAgICAgICAgKyAiLGFtdFRyYW5zZmVycmVkPSIgKyBCWVRFX1RSQU5TICsgIixwY3Q9MC41XSIsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tHZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24gZXh0ZW5kcworICAgICAgICAgR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uIHsKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVHJhbnNmZXJTdGF0dXMgZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcigpIHsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBGaWxlVHJhbnNmZXJTdGF0dXMoKTsKKyAgICAgICAgICAgICAgIHN0YXR1cy5zZXRGaWxlUmVmKG5ldyBSZWZlcmVuY2UoT1JJR19SRUYsIERTX1JFRiwgRklMRV9TSVpFKSk7CisgICAgICAgICAgICAgICBzdGF0dXMuc2V0Qnl0ZXNUcmFuc2ZlcnJlZChCWVRFX1RSQU5TKTsKKyAgICAgICAgICAgICAgIFByb2R1Y3QgcGFyZW50UHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAgICAgICBwYXJlbnRQcm9kdWN0LnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICAgICAgICAgICBzdGF0dXMuc2V0UGFyZW50UHJvZHVjdChwYXJlbnRQcm9kdWN0KTsKKyAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbFN0YXR1c0dldEN1cnJlbnRUcmFuc2ZlckNsaUFjdGlvbiBleHRlbmRzCisgICAgICAgICBHZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24geworICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgcHVibGljIEZpbGVUcmFuc2ZlclN0YXR1cyBnZXRDdXJyZW50RmlsZVRyYW5zZmVyKCkgeworICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldEN1cnJlbnRUcmFuc2ZlcnNDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRDdXJyZW50VHJhbnNmZXJzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2NTQ5OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRDdXJyZW50VHJhbnNmZXJzQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRmlsZVRyYW5zZmVyU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBHZXRDdXJyZW50VHJhbnNmZXJzQ2xpQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdfUkVGID0gImZpbGU6L29yaWcvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFNfUkVGID0gImZpbGU6L2RzL3BhdGgiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBGSUxFX1NJWkUgPSAyMDsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQllURV9UUkFOUyA9IDEwOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfTkFNRSA9ICJQcm9kdWN0TmFtZSI7CisKKyAgIHByaXZhdGUgc3RhdGljIEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXM7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICBzdGF0dXMgPSBudWxsOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFcnJvcnMoKSB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBOdWxsU3RhdHVzR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTnVsbFN0YXR1c0dldEN1cnJlbnRUcmFuc2ZlcnNDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRmxvdygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tHZXRDdXJyZW50VHJhbnNmZXJzQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJGaWxlIFRyYW5zZmVyOiBbcmVmPXtvcmlnPSIgKyBPUklHX1JFRiArICIsZHM9IiArIERTX1JFRgorICAgICAgICAgICAgKyAifSxwcm9kdWN0PSIgKyBQUk9EVUNUX05BTUUgKyAiLGZpbGVTaXplPSIgKyBGSUxFX1NJWkUKKyAgICAgICAgICAgICsgIixhbXRUcmFuc2ZlcnJlZD0iICsgQllURV9UUkFOUyArICIscGN0PTAuNV0iLCBwcmludGVyCisgICAgICAgICAgICAuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBNb2NrR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiBleHRlbmRzIEdldEN1cnJlbnRUcmFuc2ZlcnNDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PEZpbGVUcmFuc2ZlclN0YXR1cz4gZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcnMoKSB7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgRmlsZVRyYW5zZmVyU3RhdHVzKCk7CisgICAgICAgICAgICAgICBzdGF0dXMuc2V0RmlsZVJlZihuZXcgUmVmZXJlbmNlKE9SSUdfUkVGLCBEU19SRUYsIEZJTEVfU0laRSkpOworICAgICAgICAgICAgICAgc3RhdHVzLnNldEJ5dGVzVHJhbnNmZXJyZWQoQllURV9UUkFOUyk7CisgICAgICAgICAgICAgICBQcm9kdWN0IHBhcmVudFByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgICAgcGFyZW50UHJvZHVjdC5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUUpOworICAgICAgICAgICAgICAgc3RhdHVzLnNldFBhcmVudFByb2R1Y3QocGFyZW50UHJvZHVjdCk7CisgICAgICAgICAgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbFN0YXR1c0dldEN1cnJlbnRUcmFuc2ZlcnNDbGlBY3Rpb24gZXh0ZW5kcworICAgICAgICAgR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8RmlsZVRyYW5zZmVyU3RhdHVzPiBnZXRDdXJyZW50RmlsZVRyYW5zZmVycygpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDk5NjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHX1JFRiA9ICJmaWxlOi9vcmlnL3BhdGgiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFBFUkNFTlRfVFJBTlMgPSAwLjY7CisKKyAgIHByaXZhdGUgc3RhdGljIFJlZmVyZW5jZSByZWZlcmVuY2VQYXNzZWRUb0NsaWVudDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgIHJlZmVyZW5jZVBhc3NlZFRvQ2xpZW50ID0gbnVsbDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tHZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uKCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgIGNsaUFjdGlvbi5zZXRPcmlnUmVmKE9SSUdfUkVGKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOyAvLyBTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbi4KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdERhdGFGbG93KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tHZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0T3JpZ1JlZihPUklHX1JFRik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlJlZmVyZW5jZTogW29yaWdSZWY9IiArIE9SSUdfUkVGICsgIix0cmFuc2ZlclBjdD0iCisgICAgICAgICAgICArIFBFUkNFTlRfVFJBTlMgKyAiXSIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisKKyAgICAgIGFzc2VydEVxdWFscyhPUklHX1JFRiwgcmVmZXJlbmNlUGFzc2VkVG9DbGllbnQuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tHZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uIGV4dGVuZHMgR2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGRvdWJsZSBnZXRSZWZQY3RUcmFuc2ZlcnJlZChSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICByZWZlcmVuY2VQYXNzZWRUb0NsaWVudCA9IHJlZmVyZW5jZTsKKyAgICAgICAgICAgICAgIHJldHVybiBQRVJDRU5UX1RSQU5TOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRGaXJzdFBhZ2VDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRGaXJzdFBhZ2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZiMjBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldEZpcnN0UGFnZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEdldEZpcnN0UGFnZUNsaUFjdGlvbn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdldEZpcnN0UGFnZUNsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfTlVNID0gMTsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1RBTF9QQUdFUyA9IDE7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFID0gMTA7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRCA9ICJUZXN0UHJvZHVjdElkIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiVGVzdFByb2R1Y3ROYW1lIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUUlVDVFVSRSA9ICJGbGF0IjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUQVRVUyA9ICJET05FIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfTkFNRSA9ICJUZXN0UHJvZHVjdFR5cGUiOworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFcnJvcnMoKSB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uKCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxQVEdldEZpcnN0UGFnZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxQUEdldEZpcnN0UGFnZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUZsb3coKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDYsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiUGFnZTogW251bT0iICsgUEFHRV9OVU0gKyAiLCB0b3RhbFBhZ2VzPSIgKyBUT1RBTF9QQUdFUworICAgICAgICAgICAgKyAiLCBwYWdlU2l6ZT0iICsgUEFHRV9TSVpFICsgIl0iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpCisgICAgICAgICAgICAuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3RzOiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgzKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3Q6IFtpZD0iICsgUFJPRFVDVF9JRCArICIsbmFtZT0iICsgUFJPRFVDVF9OQU1FCisgICAgICAgICAgICArICIsdHlwZT0iICsgUFJPRFVDVF9UWVBFX05BTUUgKyAiLHN0cnVjdHVyZT0iICsgUFJPRFVDVF9TVFJVQ1RVUkUKKyAgICAgICAgICAgICsgIiwgdHJhbnNmZXJTdGF0dXM9IiArIFBST0RVQ1RfU1RBVFVTICsgIl0iLCBwcmludGVyCisgICAgICAgICAgICAuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDQpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCg1KSk7CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBNb2NrR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgICAgICAgICBwdC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRGaXJzdFBhZ2UoUHJvZHVjdFR5cGUgcHQpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3RQYWdlIHBwID0gbmV3IFByb2R1Y3RQYWdlKCk7CisgICAgICAgICAgICAgICBwcC5zZXRQYWdlTnVtKFBBR0VfTlVNKTsKKyAgICAgICAgICAgICAgIHBwLnNldFRvdGFsUGFnZXMoVE9UQUxfUEFHRVMpOworICAgICAgICAgICAgICAgcHAuc2V0UGFnZVNpemUoUEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RJZChQUk9EVUNUX0lEKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFR5cGUocHQpOworICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0U3RydWN0dXJlKFBST0RVQ1RfU1RSVUNUVVJFKTsKKyAgICAgICAgICAgICAgIHAuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgICAgICAgcHAuc2V0UGFnZVByb2R1Y3RzKExpc3RzLm5ld0FycmF5TGlzdChwKSk7CisgICAgICAgICAgICAgICByZXR1cm4gcHA7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbFBUR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgTW9ja0dldEZpcnN0UGFnZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUFBHZXRGaXJzdFBhZ2VDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgICAgICAgICBwdC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRGaXJzdFBhZ2UoUHJvZHVjdFR5cGUgcHQpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRMYXN0UGFnZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldExhc3RQYWdlQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiNzUwZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRMYXN0UGFnZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEdldExhc3RQYWdlQ2xpQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2V0TGFzdFBhZ2VDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX05VTSA9IDE7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUEFHRVMgPSAxOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0laRSA9IDEwOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSUQgPSAiVGVzdFByb2R1Y3RJZCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FID0gIlRlc3RQcm9kdWN0TmFtZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TVFJVQ1RVUkUgPSAiRmxhdCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TVEFUVVMgPSAiRE9ORSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX05BTUUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgeworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldExhc3RQYWdlQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0TGFzdFBhZ2VDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24gPSBuZXcgTnVsbFBUR2V0TGFzdFBhZ2VDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBOdWxsUFBHZXRMYXN0UGFnZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUZsb3coKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrR2V0TGFzdFBhZ2VDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tHZXRMYXN0UGFnZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscyg2LCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlBhZ2U6IFtudW09IiArIFBBR0VfTlVNICsgIiwgdG90YWxQYWdlcz0iICsgVE9UQUxfUEFHRVMKKyAgICAgICAgICAgICsgIiwgcGFnZVNpemU9IiArIFBBR0VfU0laRSArICJdIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKQorICAgICAgICAgICAgLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0czoiLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgyKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMykpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0OiBbaWQ9IiArIFBST0RVQ1RfSUQgKyAiLG5hbWU9IiArIFBST0RVQ1RfTkFNRQorICAgICAgICAgICAgKyAiLHR5cGU9IiArIFBST0RVQ1RfVFlQRV9OQU1FICsgIixzdHJ1Y3R1cmU9IiArIFBST0RVQ1RfU1RSVUNUVVJFCisgICAgICAgICAgICArICIsIHRyYW5zZmVyU3RhdHVzPSIgKyBQUk9EVUNUX1NUQVRVUyArICJdIiwgcHJpbnRlcgorICAgICAgICAgICAgLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCg0KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoNSkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0dldExhc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgR2V0TGFzdFBhZ2VDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgICAgICAgIHB0LnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldExhc3RQYWdlKFByb2R1Y3RUeXBlIHB0KSB7CisgICAgICAgICAgICAgICBQcm9kdWN0UGFnZSBwcCA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgICAgICAgICAgcHAuc2V0UGFnZU51bShQQUdFX05VTSk7CisgICAgICAgICAgICAgICBwcC5zZXRUb3RhbFBhZ2VzKFRPVEFMX1BBR0VTKTsKKyAgICAgICAgICAgICAgIHBwLnNldFBhZ2VTaXplKFBBR0VfU0laRSk7CisgICAgICAgICAgICAgICBQcm9kdWN0IHAgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQUk9EVUNUX1NUUlVDVFVSRSk7CisgICAgICAgICAgICAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFBST0RVQ1RfU1RBVFVTKTsKKyAgICAgICAgICAgICAgIHBwLnNldFBhZ2VQcm9kdWN0cyhMaXN0cy5uZXdBcnJheUxpc3QocCkpOworICAgICAgICAgICAgICAgcmV0dXJuIHBwOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGNsYXNzIE51bGxQVEdldExhc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgTW9ja0dldExhc3RQYWdlQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGNsYXNzIE51bGxQUEdldExhc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgTW9ja0dldExhc3RQYWdlQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgICAgICAgICBwdC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRMYXN0UGFnZShQcm9kdWN0VHlwZSBwdCkgeworICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldE5leHRQYWdlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0TmV4dFBhZ2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYyNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldE5leHRQYWdlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBHZXROZXh0UGFnZUNsaUFjdGlvbn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdldE5leHRQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9OVU0gPSAxOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVEFMX1BBR0VTID0gMjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkUgPSAzOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSURfMSA9ICJUZXN0UHJvZHVjdElkMSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FXzEgPSAiVGVzdFByb2R1Y3ROYW1lMSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRF8yID0gIlRlc3RQcm9kdWN0SWQyIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUVfMiA9ICJUZXN0UHJvZHVjdE5hbWUyIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0lEXzMgPSAiVGVzdFByb2R1Y3RJZDMiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfTkFNRV8zID0gIlRlc3RQcm9kdWN0TmFtZTMiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSURfNCA9ICJUZXN0UHJvZHVjdElkNCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FXzQgPSAiVGVzdFByb2R1Y3ROYW1lNCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TVFJVQ1RVUkUgPSAiRmxhdCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TVEFUVVMgPSAiRE9ORSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX05BTUUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgeworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldE5leHRQYWdlQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0TmV4dFBhZ2VDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24gPSBuZXcgTnVsbFBUR2V0TmV4dFBhZ2VDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgY2xpQWN0aW9uLnNldEN1cnJlbnRQYWdlTnVtKDEpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBOdWxsUFBHZXROZXh0UGFnZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0Q3VycmVudFBhZ2VOdW0oMSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxOUEdldE5leHRQYWdlQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRDdXJyZW50UGFnZU51bSgxKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRmxvdygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tHZXROZXh0UGFnZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0dldE5leHRQYWdlQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRDdXJyZW50UGFnZU51bShQQUdFX05VTSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscyg2LCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlBhZ2U6IFtudW09IiArIChQQUdFX05VTSArIDEpICsgIiwgdG90YWxQYWdlcz0iCisgICAgICAgICAgICArIFRPVEFMX1BBR0VTICsgIiwgcGFnZVNpemU9IiArIFBBR0VfU0laRSArICJdIiwgcHJpbnRlcgorICAgICAgICAgICAgLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0czoiLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgyKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMykpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0OiBbaWQ9IiArIFBST0RVQ1RfSURfNCArICIsbmFtZT0iICsgUFJPRFVDVF9OQU1FXzQKKyAgICAgICAgICAgICsgIix0eXBlPSIgKyBQUk9EVUNUX1RZUEVfTkFNRSArICIsc3RydWN0dXJlPSIgKyBQUk9EVUNUX1NUUlVDVFVSRQorICAgICAgICAgICAgKyAiLCB0cmFuc2ZlclN0YXR1cz0iICsgUFJPRFVDVF9TVEFUVVMgKyAiXSIsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoNCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDUpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tHZXROZXh0UGFnZUNsaUFjdGlvbiBleHRlbmRzIEdldE5leHRQYWdlQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgTW9ja1htbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KCk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUFRHZXROZXh0UGFnZUNsaUFjdGlvbiBleHRlbmRzIE1vY2tHZXROZXh0UGFnZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUFBHZXROZXh0UGFnZUNsaUFjdGlvbiBleHRlbmRzIE1vY2tHZXROZXh0UGFnZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSBwdCkgeworICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbE5QR2V0TmV4dFBhZ2VDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrR2V0TmV4dFBhZ2VDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBNb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXROZXh0UGFnZShQcm9kdWN0VHlwZSBwdCwKKyAgICAgICAgICAgICAgICAgIFByb2R1Y3RQYWdlIGN1cnJlbnRQYWdlKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja1htbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGV4dGVuZHMKKyAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IHsKKyAgICAgIHB1YmxpYyBNb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICBzdXBlcihuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwgZmFsc2UpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgIHB0LnNldE5hbWUobmFtZSk7CisgICAgICAgICByZXR1cm4gcHQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSBwdCkgeworICAgICAgICAgUHJvZHVjdFBhZ2UgcHAgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgIHBwLnNldFBhZ2VOdW0oUEFHRV9OVU0pOworICAgICAgICAgcHAuc2V0VG90YWxQYWdlcyhUT1RBTF9QQUdFUyk7CisgICAgICAgICBwcC5zZXRQYWdlU2l6ZShQQUdFX1NJWkUpOworICAgICAgICAgUHJvZHVjdCBwMSA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICBwMS5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRF8xKTsKKyAgICAgICAgIHAxLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRV8xKTsKKyAgICAgICAgIHAxLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgIHAxLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUFJPRFVDVF9TVFJVQ1RVUkUpOworICAgICAgICAgcDEuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgUHJvZHVjdCBwMiA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICBwMi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRF8yKTsKKyAgICAgICAgIHAyLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRV8yKTsKKyAgICAgICAgIHAyLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgIHAyLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUFJPRFVDVF9TVFJVQ1RVUkUpOworICAgICAgICAgcDIuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgUHJvZHVjdCBwMyA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICBwMy5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRF8zKTsKKyAgICAgICAgIHAzLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRV8zKTsKKyAgICAgICAgIHAzLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgIHAzLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUFJPRFVDVF9TVFJVQ1RVUkUpOworICAgICAgICAgcDMuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgcHAuc2V0UGFnZVByb2R1Y3RzKExpc3RzLm5ld0FycmF5TGlzdChwMSwgcDIsIHAzKSk7CisgICAgICAgICByZXR1cm4gcHA7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldE5leHRQYWdlKFByb2R1Y3RUeXBlIHB0LCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgICAgICAgUHJvZHVjdFBhZ2UgcHAgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgIHBwLnNldFBhZ2VOdW0oY3VycmVudFBhZ2UuZ2V0UGFnZU51bSgpICsgMSk7CisgICAgICAgICBwcC5zZXRUb3RhbFBhZ2VzKGN1cnJlbnRQYWdlLmdldFRvdGFsUGFnZXMoKSk7CisgICAgICAgICBwcC5zZXRQYWdlU2l6ZShjdXJyZW50UGFnZS5nZXRQYWdlU2l6ZSgpKTsKKyAgICAgICAgIFByb2R1Y3QgcDQgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgcDQuc2V0UHJvZHVjdElkKFBST0RVQ1RfSURfNCk7CisgICAgICAgICBwNC5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUVfNCk7CisgICAgICAgICBwNC5zZXRQcm9kdWN0VHlwZShwdCk7CisgICAgICAgICBwNC5zZXRQcm9kdWN0U3RydWN0dXJlKFBST0RVQ1RfU1RSVUNUVVJFKTsKKyAgICAgICAgIHA0LnNldFRyYW5zZmVyU3RhdHVzKFBST0RVQ1RfU1RBVFVTKTsKKyAgICAgICAgIHBwLnNldFBhZ2VQcm9kdWN0cyhMaXN0cy5uZXdBcnJheUxpc3QocDQpKTsKKyAgICAgICAgIHJldHVybiBwcDsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXROdW1Qcm9kdWN0c0NsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldE51bVByb2R1Y3RzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZTdjNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXROdW1Qcm9kdWN0c0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgR2V0TnVtUHJvZHVjdHNDbGlBY3Rpb259LiAKKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RHZXROdW1Qcm9kdWN0c0NsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9QUk9EVUNUUyA9IDEwOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9OQU1FID0gIlRlc3RQcm9kdWN0VHlwZSI7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRmxvdygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tHZXROdW1Qcm9kdWN0c0NsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0dldE51bVByb2R1Y3RzQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVHlwZTogWyIgKyBQUk9EVUNUX1RZUEVfTkFNRSsgIl0sIE51bSBQcm9kdWN0czogWyIgKyBOVU1fUFJPRFVDVFMgKyAiXSIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUVycm9ycygpIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE51bGxQVEdldE51bVByb2R1Y3RzQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBOdWxsUFRHZXROdW1Qcm9kdWN0c0NsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0dldE51bVByb2R1Y3RzQ2xpQWN0aW9uIGV4dGVuZHMgR2V0TnVtUHJvZHVjdHNDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgICAgICAgIHB0LnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBOVU1fUFJPRFVDVFM7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbFBUR2V0TnVtUHJvZHVjdHNDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrR2V0TnVtUHJvZHVjdHNDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldFByZXZQYWdlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJldlBhZ2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ4ODcwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldFByZXZQYWdlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBHZXRQcmV2UGFnZUNsaUFjdGlvbn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2V0UHJldlBhZ2VDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX05VTSA9IDI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUEFHRVMgPSAyOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0laRSA9IDM7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRF8xID0gIlRlc3RQcm9kdWN0SWQxIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUVfMSA9ICJUZXN0UHJvZHVjdE5hbWUxIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0lEXzIgPSAiVGVzdFByb2R1Y3RJZDIiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfTkFNRV8yID0gIlRlc3RQcm9kdWN0TmFtZTIiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSURfMyA9ICJUZXN0UHJvZHVjdElkMyI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FXzMgPSAiVGVzdFByb2R1Y3ROYW1lMyI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9JRF80ID0gIlRlc3RQcm9kdWN0SWQ0IjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUVfNCA9ICJUZXN0UHJvZHVjdE5hbWU0IjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUUlVDVFVSRSA9ICJGbGF0IjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUQVRVUyA9ICJET05FIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfTkFNRSA9ICJUZXN0UHJvZHVjdFR5cGUiOworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFcnJvcnMoKSB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBHZXRQcmV2UGFnZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTnVsbFBUR2V0UHJldlBhZ2VDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgY2xpQWN0aW9uLnNldEN1cnJlbnRQYWdlTnVtKDEpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBOdWxsUFBHZXRQcmV2UGFnZUNsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0Q3VycmVudFBhZ2VOdW0oMSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxOUEdldFByZXZQYWdlQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRDdXJyZW50UGFnZU51bSgxKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRmxvdygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tHZXRQcmV2UGFnZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0dldFByZXZQYWdlQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRDdXJyZW50UGFnZU51bShQQUdFX05VTSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscyg2LCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlBhZ2U6IFtudW09IiArIChQQUdFX05VTSAtIDEpICsgIiwgdG90YWxQYWdlcz0iICsgVE9UQUxfUEFHRVMKKyAgICAgICAgICAgICsgIiwgcGFnZVNpemU9IiArIFBBR0VfU0laRSArICJdIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKQorICAgICAgICAgICAgLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0czoiLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgyKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMykpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0OiBbaWQ9IiArIFBST0RVQ1RfSURfNCArICIsbmFtZT0iICsgUFJPRFVDVF9OQU1FXzQKKyAgICAgICAgICAgICsgIix0eXBlPSIgKyBQUk9EVUNUX1RZUEVfTkFNRSArICIsc3RydWN0dXJlPSIgKyBQUk9EVUNUX1NUUlVDVFVSRQorICAgICAgICAgICAgKyAiLCB0cmFuc2ZlclN0YXR1cz0iICsgUFJPRFVDVF9TVEFUVVMgKyAiXSIsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoNCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDUpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tHZXRQcmV2UGFnZUNsaUFjdGlvbiBleHRlbmRzIEdldFByZXZQYWdlQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgTW9ja1htbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KCk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUFRHZXRQcmV2UGFnZUNsaUFjdGlvbiBleHRlbmRzIE1vY2tHZXRQcmV2UGFnZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUFBHZXRQcmV2UGFnZUNsaUFjdGlvbiBleHRlbmRzIE1vY2tHZXRQcmV2UGFnZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSBwdCkgeworICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbE5QR2V0UHJldlBhZ2VDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrR2V0UHJldlBhZ2VDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBNb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRQcmV2UGFnZShQcm9kdWN0VHlwZSBwdCwKKyAgICAgICAgICAgICAgICAgIFByb2R1Y3RQYWdlIGN1cnJlbnRQYWdlKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja1htbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGV4dGVuZHMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgeworICAgICAgcHVibGljIE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHN1cGVyKG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLCBmYWxzZSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgICAgIHB0LnNldE5hbWUobmFtZSk7CisgICAgICAgICByZXR1cm4gcHQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSBwdCkgeworICAgICAgICAgUHJvZHVjdFBhZ2UgcHAgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgIHBwLnNldFBhZ2VOdW0oUEFHRV9OVU0pOworICAgICAgICAgcHAuc2V0VG90YWxQYWdlcyhUT1RBTF9QQUdFUyk7CisgICAgICAgICBwcC5zZXRQYWdlU2l6ZShQQUdFX1NJWkUpOworICAgICAgICAgUHJvZHVjdCBwMSA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICBwMS5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRF8xKTsKKyAgICAgICAgIHAxLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRV8xKTsKKyAgICAgICAgIHAxLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgIHAxLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUFJPRFVDVF9TVFJVQ1RVUkUpOworICAgICAgICAgcDEuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgUHJvZHVjdCBwMiA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICBwMi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRF8yKTsKKyAgICAgICAgIHAyLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRV8yKTsKKyAgICAgICAgIHAyLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgIHAyLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUFJPRFVDVF9TVFJVQ1RVUkUpOworICAgICAgICAgcDIuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgUHJvZHVjdCBwMyA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICBwMy5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRF8zKTsKKyAgICAgICAgIHAzLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRV8zKTsKKyAgICAgICAgIHAzLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgIHAzLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUFJPRFVDVF9TVFJVQ1RVUkUpOworICAgICAgICAgcDMuc2V0VHJhbnNmZXJTdGF0dXMoUFJPRFVDVF9TVEFUVVMpOworICAgICAgICAgcHAuc2V0UGFnZVByb2R1Y3RzKExpc3RzLm5ld0FycmF5TGlzdChwMSwgcDIsIHAzKSk7CisgICAgICAgICByZXR1cm4gcHA7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldFByZXZQYWdlKFByb2R1Y3RUeXBlIHB0LCBQcm9kdWN0UGFnZSBjdXJyZW50UGFnZSkgeworICAgICAgICAgUHJvZHVjdFBhZ2UgcHAgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgIHBwLnNldFBhZ2VOdW0oY3VycmVudFBhZ2UuZ2V0UGFnZU51bSgpIC0gMSk7CisgICAgICAgICBwcC5zZXRUb3RhbFBhZ2VzKGN1cnJlbnRQYWdlLmdldFRvdGFsUGFnZXMoKSk7CisgICAgICAgICBwcC5zZXRQYWdlU2l6ZShjdXJyZW50UGFnZS5nZXRQYWdlU2l6ZSgpKTsKKyAgICAgICAgIFByb2R1Y3QgcDQgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgcDQuc2V0UHJvZHVjdElkKFBST0RVQ1RfSURfNCk7CisgICAgICAgICBwNC5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUVfNCk7CisgICAgICAgICBwNC5zZXRQcm9kdWN0VHlwZShwdCk7CisgICAgICAgICBwNC5zZXRQcm9kdWN0U3RydWN0dXJlKFBST0RVQ1RfU1RSVUNUVVJFKTsKKyAgICAgICAgIHA0LnNldFRyYW5zZmVyU3RhdHVzKFBST0RVQ1RfU1RBVFVTKTsKKyAgICAgICAgIHBwLnNldFBhZ2VQcm9kdWN0cyhMaXN0cy5uZXdBcnJheUxpc3QocDQpKTsKKyAgICAgICAgIHJldHVybiBwcDsKKyAgICAgIH0KKyAgIH07Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRQcm9kdWN0QnlJZENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzcxNzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgR2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb259LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RHZXRQcm9kdWN0QnlJZENsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSUQgPSAiVGVzdFByb2R1Y3RJZCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FID0gIlRlc3RQcm9kdWN0TmFtZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX05BTUUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUUlVDVFVSRSA9IFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQ7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TVEFUVVMgPSBQcm9kdWN0LlNUQVRVU19SRUNFSVZFRDsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1JFRiA9ICJmaWxlOi9yb290L3JlZi9wYXRoIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHX1JFRl8xID0gImZpbGU6L29yaWcvcmVmLzEvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFNfUkVGXzEgPSAiZmlsZTovZHMvcmVmLzEvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9TSVpFX1JFRl8xID0gMjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHX1JFRl8yID0gImZpbGU6L29yaWcvcmVmLzIvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFNfUkVGXzIgPSAiZmlsZTovZHMvcmVmLzIvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9TSVpFX1JFRl8yID0gMjsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldFByb2R1Y3RCeUlkQ2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrR2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdElkKFBST0RVQ1RfSUQpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7IC8vIFNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uLgorICAgICAgY2xpQWN0aW9uID0gbmV3IE51bGxQcm9kdWN0R2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0SWQoUFJPRFVDVF9JRCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUZsb3coKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrR2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tHZXRQcm9kdWN0QnlJZENsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RJZChQUk9EVUNUX0lEKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3Q6IiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIC0gSUQ6ICIgKyBQUk9EVUNUX0lELCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgyKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMykpOworICAgICAgYXNzZXJ0RXF1YWxzKCIgLSBOYW1lOiAiICsgUFJPRFVDVF9OQU1FLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpCisgICAgICAgICAgICAuZ2V0KDQpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCg1KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAtIFByb2R1Y3RUeXBlOiAiICsgUFJPRFVDVF9UWVBFX05BTUUsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoNikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDcpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIC0gU3RydWN0dXJlOiAiICsgUFJPRFVDVF9TVFJVQ1RVUkUsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoOCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDkpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIC0gU3RhdHVzOiAiICsgUFJPRFVDVF9TVEFUVVMsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkKKyAgICAgICAgICAgIC5nZXQoMTApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCIgLSBSb290UmVmOiAiICsgUk9PVF9SRUYsCisgICAgICAgICAgICBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxMikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEzKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAtIFJlZmVyZW5jZXM6ICIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDE0KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMTUpKTsKKyAgICAgIGFzc2VydEVxdWFscygiICAgIC0gIiArIERTX1JFRl8xICsgIiAoIiArIEZJTEVfU0laRV9SRUZfMSArICIpIiwgcHJpbnRlcgorICAgICAgICAgICAgLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxNikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDE3KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAgICAtICIgKyBEU19SRUZfMiArICIgKCIgKyBGSUxFX1NJWkVfUkVGXzIgKyAiKSIsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMTgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxOSkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0dldFByb2R1Y3RCeUlkQ2xpQWN0aW9uIGV4dGVuZHMgR2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24geworICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgcHVibGljIFByb2R1Y3QgZ2V0UHJvZHVjdEJ5SWQoU3RyaW5nIHByb2R1Y3RJZCkgeworICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdElkKHByb2R1Y3RJZCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSBwdCA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICAgICAgICAgcHQuc2V0TmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQUk9EVUNUX1NUUlVDVFVSRSk7CisgICAgICAgICAgICAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFBST0RVQ1RfU1RBVFVTKTsKKyAgICAgICAgICAgICAgIHAuc2V0Um9vdFJlZihuZXcgUmVmZXJlbmNlKCJmaWxlOi9kdW1teS9wYXRoIiwgUk9PVF9SRUYsIDIpKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KG5ldyBSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICBPUklHX1JFRl8xLCBEU19SRUZfMSwgRklMRV9TSVpFX1JFRl8xKSwgbmV3IFJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgIE9SSUdfUkVGXzIsIERTX1JFRl8yLCBGSUxFX1NJWkVfUkVGXzIpKSk7CisgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUHJvZHVjdEdldFByb2R1Y3RCeUlkQ2xpQWN0aW9uIGV4dGVuZHMgTW9ja0dldFByb2R1Y3RCeUlkQ2xpQWN0aW9uIHsKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeUlkKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdEJ5TmFtZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWI2ODcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdEJ5TmFtZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBHZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2V0UHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSUQgPSAiVGVzdFByb2R1Y3RJZCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FID0gIlRlc3RQcm9kdWN0TmFtZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX05BTUUgPSAiVGVzdFByb2R1Y3RUeXBlIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NUUlVDVFVSRSA9IFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQ7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TVEFUVVMgPSBQcm9kdWN0LlNUQVRVU19SRUNFSVZFRDsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1JFRiA9ICJmaWxlOi9yb290L3JlZi9wYXRoIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHX1JFRl8xID0gImZpbGU6L29yaWcvcmVmLzEvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFNfUkVGXzEgPSAiZmlsZTovZHMvcmVmLzEvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9TSVpFX1JFRl8xID0gMjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHX1JFRl8yID0gImZpbGU6L29yaWcvcmVmLzIvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFNfUkVGXzIgPSAiZmlsZTovZHMvcmVmLzIvcGF0aCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9TSVpFX1JFRl8yID0gMjsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgR2V0UHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0dldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOyAvLyBTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbi4KKyAgICAgIGNsaUFjdGlvbiA9IG5ldyBOdWxsUHJvZHVjdEdldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUUpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdERhdGFGbG93KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tHZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3Q6IiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIC0gSUQ6ICIgKyBQUk9EVUNUX0lELCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgyKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMykpOworICAgICAgYXNzZXJ0RXF1YWxzKCIgLSBOYW1lOiAiICsgUFJPRFVDVF9OQU1FLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpCisgICAgICAgICAgICAuZ2V0KDQpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCg1KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAtIFByb2R1Y3RUeXBlOiAiICsgUFJPRFVDVF9UWVBFX05BTUUsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoNikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDcpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIC0gU3RydWN0dXJlOiAiICsgUFJPRFVDVF9TVFJVQ1RVUkUsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoOCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDkpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIC0gU3RhdHVzOiAiICsgUFJPRFVDVF9TVEFUVVMsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkKKyAgICAgICAgICAgIC5nZXQoMTApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCIgLSBSb290UmVmOiAiICsgUk9PVF9SRUYsCisgICAgICAgICAgICBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxMikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEzKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAtIFJlZmVyZW5jZXM6ICIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDE0KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMTUpKTsKKyAgICAgIGFzc2VydEVxdWFscygiICAgIC0gIiArIERTX1JFRl8xICsgIiAoIiArIEZJTEVfU0laRV9SRUZfMSArICIpIiwgcHJpbnRlcgorICAgICAgICAgICAgLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxNikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDE3KSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAgICAtICIgKyBEU19SRUZfMiArICIgKCIgKyBGSUxFX1NJWkVfUkVGXzIgKyAiKSIsIHByaW50ZXIKKyAgICAgICAgICAgIC5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMTgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxOSkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0dldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24gZXh0ZW5kcyBHZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIHsKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3RCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RJZChQUk9EVUNUX0lEKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSBwdCA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICAgICAgICAgcHQuc2V0TmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQUk9EVUNUX1NUUlVDVFVSRSk7CisgICAgICAgICAgICAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFBST0RVQ1RfU1RBVFVTKTsKKyAgICAgICAgICAgICAgIHAuc2V0Um9vdFJlZihuZXcgUmVmZXJlbmNlKCJmaWxlOi9kdW1teS9wYXRoIiwgUk9PVF9SRUYsIDIpKTsKKyAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KG5ldyBSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICBPUklHX1JFRl8xLCBEU19SRUZfMSwgRklMRV9TSVpFX1JFRl8xKSwgbmV3IFJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgIE9SSUdfUkVGXzIsIERTX1JFRl8yLCBGSUxFX1NJWkVfUkVGXzIpKSk7CisgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUHJvZHVjdEdldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrR2V0UHJvZHVjdEJ5TmFtZUNsaUFjdGlvbiB7CisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM5M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0lEID0gIlRlc3RQcm9kdWN0SWQiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9OQU1FID0gIlRlc3RQcm9kdWN0VHlwZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgUEVSQ0VOVF9UUkFOU0ZFUlJFRCA9IDAuNTsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgeworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTnVsbFBUR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RJZChQUk9EVUNUX0lEKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgdHJ5IHsKKyAgICAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdGhyb3cgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdERhdGFGbG93KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0dldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tHZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdElkKFBST0RVQ1RfSUQpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3Q6IFtpZD0iICsgUFJPRFVDVF9JRCArICIsIHRyYW5zZmVyUGN0PSIKKyAgICAgICAgICAgICsgUEVSQ0VOVF9UUkFOU0ZFUlJFRCArICJdIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKQorICAgICAgICAgICAgLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0dldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gZXh0ZW5kcyBHZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgICAgICAgICBwdC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgZG91YmxlIGdldFByb2R1Y3RQY3RUcmFuc2ZlcnJlZChQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBQRVJDRU5UX1RSQU5TRkVSUkVEOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIGNsYXNzIE51bGxQVEdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24gZXh0ZW5kcyBNb2NrR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RHZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWU2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0R2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEdldFByb2R1Y3RUeXBlQnlOYW1lQ2xpQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfSUQgPSAidXJuOm9vZHQ6VGVzdFByb2R1Y3RUeXBlIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfTkFNRSA9ICJUZXN0UHJvZHVjdFR5cGUiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9ERVNDID0gIlByb2R1Y3RUeXBlRGVzYyI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFX1ZFUlNJT05FUiA9IEJhc2ljVmVyc2lvbmVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfUkVQTyA9ICIvcGF0aC90by9yZXBvIjsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgeworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgR2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE51bGxQVEdldFByb2R1Y3RUeXBlQnlOYW1lQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRmxvdygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tHZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0dldFByb2R1Y3RUeXBlQnlOYW1lQ2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0UHJvZHVjdFR5cGVCeU5hbWU6IFJlc3VsdDogW25hbWU9IgorICAgICAgICAgICAgICAgKyBQUk9EVUNUX1RZUEVfTkFNRSArICIsIGRlc2NyaXB0aW9uPSIgKyBQUk9EVUNUX1RZUEVfREVTQworICAgICAgICAgICAgICAgKyAiLCBpZD0iICsgUFJPRFVDVF9UWVBFX0lEICsgIiwgdmVyc2lvbmVyQ2xhc3M9IgorICAgICAgICAgICAgICAgKyBQUk9EVUNUX1RZUEVfVkVSU0lPTkVSICsgIiwgcmVwb3NpdG9yeVBhdGg9IgorICAgICAgICAgICAgICAgKyBQUk9EVUNUX1RZUEVfUkVQTyArICJdIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tHZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbiBleHRlbmRzIEdldFByb2R1Y3RUeXBlQnlOYW1lQ2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgICAgICAgICBwdC5zZXRQcm9kdWN0VHlwZUlkKFBST0RVQ1RfVFlQRV9JRCk7CisgICAgICAgICAgICAgICBwdC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgcHQuc2V0RGVzY3JpcHRpb24oUFJPRFVDVF9UWVBFX0RFU0MpOworICAgICAgICAgICAgICAgcHQuc2V0VmVyc2lvbmVyKFBST0RVQ1RfVFlQRV9WRVJTSU9ORVIpOworICAgICAgICAgICAgICAgcHQuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKFBST0RVQ1RfVFlQRV9SRVBPKTsKKyAgICAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBOdWxsUFRHZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbiBleHRlbmRzIE1vY2tHZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbiB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpLAorICAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByb2R1Y3RUeXBlIGdldFByb2R1Y3RUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0SGFzUHJvZHVjdENsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEhhc1Byb2R1Y3RDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTVkZGZmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEhhc1Byb2R1Y3RDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEhhc1Byb2R1Y3RDbGlBY3Rpb259LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RIYXNQcm9kdWN0Q2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEhBU19QUk9EVUNUID0gdHJ1ZTsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiUHJvZHVjdE5hbWUiOworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFcnJvcnMoKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrSGFzUHJvZHVjdENsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0hhc1Byb2R1Y3RDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOyAvLyBTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbi4KKyAgIH0KKyAgIAorICAgcHVibGljIHZvaWQgdGVzdERhdGFGbG93KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0hhc1Byb2R1Y3RDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tIYXNQcm9kdWN0Q2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiaGFzUHJvZHVjdDogUmVzdWx0OiAiICsgSEFTX1BST0RVQ1QsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBNb2NrSGFzUHJvZHVjdENsaUFjdGlvbiBleHRlbmRzIEhhc1Byb2R1Y3RDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb2R1Y3QoU3RyaW5nIHByb2R1Y3ROYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gSEFTX1BST0RVQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdEluZ2VzdFByb2R1Y3RDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1NWY1NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkluUGxhY2VEYXRhVHJhbnNmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuSW5QbGFjZURhdGFUcmFuc2ZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEluZ2VzdFByb2R1Y3RDbGlBY3Rpb259LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEluZ2VzdFByb2R1Y3RDbGlBY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9NRVRfS0VZID0gIkZpbGVuYW1lIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9NRVRfVkFMID0gImRhdGEuZGF0IjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT01JTkFMX0RBVEVfTUVUX0tFWSA9ICJOb21pbmFsRGF0ZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9NSU5BTF9EQVRFX01FVF9WQUwgPSAiMjAxMS0wMS0yMCI7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0lEID0gIlRlc3RQcm9kdWN0SWQiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfTkFNRSA9ICJUZXN0UHJvZHVjdE5hbWUiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9OQU1FID0gIlRlc3RQcm9kdWN0VHlwZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UUkFOU0ZFUkVSX0ZBQ1RPUlkgPSBJblBsYWNlRGF0YVRyYW5zZmVyRmFjdG9yeS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UUkFOU0ZFUkVSID0gSW5QbGFjZURhdGFUcmFuc2ZlcmVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFUX1JFRl9OQU1FID0gImZsYXRfcmVmLnR4dCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElFUl9SRUZfTkFNRSA9ICJoaWVyX3JlZiI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1JFRl8xID0gInN1Yl9yZWYxLnR4dCI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1JFRl8yID0gInN1Yl9yZWYyLnR4dCI7CisKKyAgIHByaXZhdGUgRGF0YVRyYW5zZmVyIGNsaWVudFNldERhdGFUcmFuc2ZlcmVyOworICAgcHJpdmF0ZSBQcm9kdWN0IGNsaWVudFNldFByb2R1Y3Q7CisgICBwcml2YXRlIE1ldGFkYXRhIGNsaWVudFNldE1ldGFkYXRhOworCisgICBwcml2YXRlIEZpbGUgdG1wRGlyOworICAgcHJpdmF0ZSBGaWxlIG1ldGFkYXRhRmlsZTsKKyAgIHByaXZhdGUgRmlsZSBoaWVyUmVmRmlsZTsKKyAgIHByaXZhdGUgRmlsZSBmbGF0UmVmRmlsZTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgIGNsaWVudFNldERhdGFUcmFuc2ZlcmVyID0gbnVsbDsKKyAgICAgIGNsaWVudFNldFByb2R1Y3QgPSBudWxsOworICAgICAgY2xpZW50U2V0TWV0YWRhdGEgPSBudWxsOworICAgICAgdG1wRGlyID0gY3JlYXRlVG1wRGlyKCk7CisgICAgICBtZXRhZGF0YUZpbGUgPSBjcmVhdGVNZXRhZGF0YUZpbGUoKTsKKyAgICAgIGhpZXJSZWZGaWxlID0gY3JlYXRlSGllcmFyY2hpY2FsUmVmZXJlbmNlKCk7CisgICAgICBmbGF0UmVmRmlsZSA9IGNyZWF0ZUZsYXRSZWZlcmVuY2UoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRtcERpcik7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUVycm9ycygpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIEluZ2VzdFByb2R1Y3RDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uKCk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgY2xpQWN0aW9uLnNldE1ldGFkYXRhRmlsZShtZXRhZGF0YUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgY2xpQWN0aW9uLnNldFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KGZsYXRSZWZGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsgLy8gU2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24uCisgICAgICBjbGlBY3Rpb24uc2V0RGF0YVRyYW5zZmVyZXIoREFUQV9UUkFOU0ZFUkVSX0ZBQ1RPUlkpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7IC8vIFNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uLgorCisgICAgICBjbGlBY3Rpb24gPSBuZXcgTnVsbFBUSW5nZXN0UHJvZHVjdENsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0VHlwZU5hbWUoUFJPRFVDVF9UWVBFX05BTUUpOworICAgICAgY2xpQWN0aW9uLnNldE1ldGFkYXRhRmlsZShtZXRhZGF0YUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgY2xpQWN0aW9uLnNldFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KGZsYXRSZWZGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgfQorICAgCisgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50VHJhbnNUcnVlQW5kRmxhdFByb2R1Y3QoKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0luZ2VzdFByb2R1Y3RDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0TWV0YWRhdGFGaWxlKG1ldGFkYXRhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICBjbGlBY3Rpb24uc2V0RGF0YVRyYW5zZmVyZXIoREFUQV9UUkFOU0ZFUkVSX0ZBQ1RPUlkpOworICAgICAgY2xpQWN0aW9uLnNldFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KGZsYXRSZWZGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImluZ2VzdFByb2R1Y3Q6IFJlc3VsdDogIiArIFBST0RVQ1RfSUQsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsgCisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfTkFNRSwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9GTEFULCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUFJPRFVDVF9UWVBFX05BTUUsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOiIgKyBmbGF0UmVmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKS5nZXRPcmlnUmVmZXJlbmNlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKERBVEFfVFJBTlNGRVJFUiwgY2xpZW50U2V0RGF0YVRyYW5zZmVyZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudFNldE1ldGFkYXRhLmdldEFsbEtleXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEZJTEVOQU1FX01FVF9WQUwsIGNsaWVudFNldE1ldGFkYXRhLmdldE1ldGFkYXRhKEZJTEVOQU1FX01FVF9LRVkpKTsKKyAgICAgIGFzc2VydEVxdWFscyhOT01JTkFMX0RBVEVfTUVUX1ZBTCwgY2xpZW50U2V0TWV0YWRhdGEuZ2V0TWV0YWRhdGEoTk9NSU5BTF9EQVRFX01FVF9LRVkpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENsaWVudFRyYW5zRmFsc2VBbmRGbGF0UHJvZHVjdCgpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrSW5nZXN0UHJvZHVjdENsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0luZ2VzdFByb2R1Y3RDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0TmFtZShQUk9EVUNUX05BTUUpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRNZXRhZGF0YUZpbGUobWV0YWRhdGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRSZWZlcmVuY2VzKExpc3RzLm5ld0FycmF5TGlzdChmbGF0UmVmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJpbmdlc3RQcm9kdWN0OiBSZXN1bHQ6ICIgKyBQUk9EVUNUX0lELCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgwKSk7IAorICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQUk9EVUNUX05BTUUsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfVFlQRV9OQU1FLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZmlsZToiICsgZmxhdFJlZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgIGFzc2VydE51bGwoY2xpZW50U2V0RGF0YVRyYW5zZmVyZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudFNldE1ldGFkYXRhLmdldEFsbEtleXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEZJTEVOQU1FX01FVF9WQUwsIGNsaWVudFNldE1ldGFkYXRhLmdldE1ldGFkYXRhKEZJTEVOQU1FX01FVF9LRVkpKTsKKyAgICAgIGFzc2VydEVxdWFscyhOT01JTkFMX0RBVEVfTUVUX1ZBTCwgY2xpZW50U2V0TWV0YWRhdGEuZ2V0TWV0YWRhdGEoTk9NSU5BTF9EQVRFX01FVF9LRVkpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENsaWVudFRyYW5zVHJ1ZUFuZEhpZXJQcm9kdWN0KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrSW5nZXN0UHJvZHVjdENsaUFjdGlvbigpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3ROYW1lKFBST0RVQ1RfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUwpOworICAgICAgY2xpQWN0aW9uLnNldFByb2R1Y3RUeXBlTmFtZShQUk9EVUNUX1RZUEVfTkFNRSk7CisgICAgICBjbGlBY3Rpb24uc2V0TWV0YWRhdGFGaWxlKG1ldGFkYXRhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICBjbGlBY3Rpb24uc2V0RGF0YVRyYW5zZmVyZXIoREFUQV9UUkFOU0ZFUkVSX0ZBQ1RPUlkpOworICAgICAgY2xpQWN0aW9uLnNldFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KGhpZXJSZWZGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImluZ2VzdFByb2R1Y3Q6IFJlc3VsdDogIiArIFBST0RVQ1RfSUQsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApKTsgCisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBST0RVQ1RfTkFNRSwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUwsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQUk9EVUNUX1RZUEVfTkFNRSwgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMywgY2xpZW50U2V0UHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSwgbmV3IENvbXBhcmF0b3I8UmVmZXJlbmNlPigpIHsKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFJlZmVyZW5jZSByZWYxLCBSZWZlcmVuY2UgcmVmMikgeworICAgICAgICAgICAgcmV0dXJuIHJlZjEuZ2V0T3JpZ1JlZmVyZW5jZSgpLmNvbXBhcmVUbyhyZWYyLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGFzc2VydEVxdWFscygiZmlsZToiICsgaGllclJlZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLyIsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZmlsZToiICsgbmV3IEZpbGUoaGllclJlZkZpbGUsIFNVQl9SRUZfMSkuZ2V0QWJzb2x1dGVQYXRoKCksIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMSkuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZmlsZToiICsgbmV3IEZpbGUoaGllclJlZkZpbGUsIFNVQl9SRUZfMikuZ2V0QWJzb2x1dGVQYXRoKCksIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMikuZ2V0T3JpZ1JlZmVyZW5jZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhEQVRBX1RSQU5TRkVSRVIsIGNsaWVudFNldERhdGFUcmFuc2ZlcmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBjbGllbnRTZXRNZXRhZGF0YS5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhGSUxFTkFNRV9NRVRfVkFMLCBjbGllbnRTZXRNZXRhZGF0YS5nZXRNZXRhZGF0YShGSUxFTkFNRV9NRVRfS0VZKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTk9NSU5BTF9EQVRFX01FVF9WQUwsIGNsaWVudFNldE1ldGFkYXRhLmdldE1ldGFkYXRhKE5PTUlOQUxfREFURV9NRVRfS0VZKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRUcmFuc0ZhbHNlQW5kSGllclByb2R1Y3QoKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja0luZ2VzdFByb2R1Y3RDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdE5hbWUoUFJPRFVDVF9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0hJRVJBUkNISUNBTCk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJvZHVjdFR5cGVOYW1lKFBST0RVQ1RfVFlQRV9OQU1FKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRNZXRhZGF0YUZpbGUobWV0YWRhdGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRSZWZlcmVuY2VzKExpc3RzLm5ld0FycmF5TGlzdChoaWVyUmVmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJpbmdlc3RQcm9kdWN0OiBSZXN1bHQ6ICIgKyBQUk9EVUNUX0lELCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgwKSk7IAorICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDEpKTsKKyAgICAgIGFzc2VydEVxdWFscyhQUk9EVUNUX05BTUUsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUFJPRFVDVF9UWVBFX05BTUUsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNsaWVudFNldFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5zaXplKCkpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCksIG5ldyBDb21wYXJhdG9yPFJlZmVyZW5jZT4oKSB7CisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShSZWZlcmVuY2UgcmVmMSwgUmVmZXJlbmNlIHJlZjIpIHsKKyAgICAgICAgICAgIHJldHVybiByZWYxLmdldE9yaWdSZWZlcmVuY2UoKS5jb21wYXJlVG8ocmVmMi5nZXRPcmlnUmVmZXJlbmNlKCkpOworICAgICAgICAgfQorICAgICAgfSk7CisgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6IiArIGhpZXJSZWZGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi8iLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6IiArIG5ldyBGaWxlKGhpZXJSZWZGaWxlLCBTVUJfUkVGXzEpLmdldEFic29sdXRlUGF0aCgpLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDEpLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6IiArIG5ldyBGaWxlKGhpZXJSZWZGaWxlLCBTVUJfUkVGXzIpLmdldEFic29sdXRlUGF0aCgpLCBjbGllbnRTZXRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDIpLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICBhc3NlcnROdWxsKGNsaWVudFNldERhdGFUcmFuc2ZlcmVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBjbGllbnRTZXRNZXRhZGF0YS5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhGSUxFTkFNRV9NRVRfVkFMLCBjbGllbnRTZXRNZXRhZGF0YS5nZXRNZXRhZGF0YShGSUxFTkFNRV9NRVRfS0VZKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTk9NSU5BTF9EQVRFX01FVF9WQUwsIGNsaWVudFNldE1ldGFkYXRhLmdldE1ldGFkYXRhKE5PTUlOQUxfREFURV9NRVRfS0VZKSk7CisgICB9CisKKyAgIHByaXZhdGUgRmlsZSBjcmVhdGVUbXBEaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgRmlsZSBib2d1c0RpciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJvZ3VzIiwgImJvZ3VzIik7CisgICAgICBGaWxlIHRtcERpciA9IGJvZ3VzRGlyLmdldFBhcmVudEZpbGUoKTsKKyAgICAgIGJvZ3VzRGlyLmRlbGV0ZSgpOworICAgICAgdG1wRGlyID0gbmV3IEZpbGUodG1wRGlyLCAiTWV0YWRhdGEiKTsKKyAgICAgIHRtcERpci5ta2RpcnMoKTsKKyAgICAgIHJldHVybiB0bXBEaXI7CisgICB9CisKKyAgIHByaXZhdGUgRmlsZSBjcmVhdGVNZXRhZGF0YUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgRmlsZSBtZXRhZGF0YUZpbGUgPSBuZXcgRmlsZSh0bXBEaXIsICJ0ZXN0Lm1ldCIpOworICAgICAgbWV0YWRhdGFGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgUHJpbnRTdHJlYW0gcHMgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgIHBzID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1ldGFkYXRhRmlsZSkpOworICAgICAgICAgcHMucHJpbnRsbigiPGNhczptZXRhZGF0YSB4bWxuczpjYXM9XCJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2Nhc1wiPiIpOworICAgICAgICAgcHMucHJpbnRsbigiICA8a2V5dmFsIHR5cGU9XCJzY2FsYXJcIj4iKTsKKyAgICAgICAgIHBzLnByaW50bG4oIiAgICA8a2V5PiIgKyBGSUxFTkFNRV9NRVRfS0VZICsgIjwva2V5PiIpOworICAgICAgICAgcHMucHJpbnRsbigiICAgIDx2YWw+IiArIEZJTEVOQU1FX01FVF9WQUwgKyAiPC92YWw+Iik7CisgICAgICAgICBwcy5wcmludGxuKCIgIDwva2V5dmFsPiIpOworICAgICAgICAgcHMucHJpbnRsbigiICA8a2V5dmFsIHR5cGU9XCJzY2FsYXJcIj4iKTsKKyAgICAgICAgIHBzLnByaW50bG4oIiAgICA8a2V5PiIgKyAgTk9NSU5BTF9EQVRFX01FVF9LRVkgKyI8L2tleT4iKTsKKyAgICAgICAgIHBzLnByaW50bG4oIiAgICA8dmFsPiIgKyAgTk9NSU5BTF9EQVRFX01FVF9WQUwgKyAiPC92YWw+Iik7CisgICAgICAgICBwcy5wcmludGxuKCIgIDwva2V5dmFsPiIpOworICAgICAgICAgcHMucHJpbnRsbigiPC9jYXM6bWV0YWRhdGE+Iik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBlOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgIHBzLmNsb3NlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gbWV0YWRhdGFGaWxlOworICAgfQorCisgICBwcml2YXRlIEZpbGUgY3JlYXRlSGllcmFyY2hpY2FsUmVmZXJlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGUgcmVmZXJlbmNlID0gbmV3IEZpbGUodG1wRGlyLCBISUVSX1JFRl9OQU1FKTsKKyAgICAgIHJlZmVyZW5jZS5ta2RpcnMoKTsKKyAgICAgIFByaW50U3RyZWFtIHBzID0gbnVsbDsKKyAgICAgIGZvciAoU3RyaW5nIHN1YlJlZiA6ICBMaXN0cy5uZXdBcnJheUxpc3QoU1VCX1JFRl8xLCBTVUJfUkVGXzIpKSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgcHMgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUocmVmZXJlbmNlLCBzdWJSZWYpKSk7CisgICAgICAgICAgICBwcy5wcmludGxuKCJUaGlzIGlzIGEgdGVzdCBzdWItcmVmZXJlbmNlIGZpbGUiKTsKKyAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHMuY2xvc2UoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZWZlcmVuY2U7CisgICB9CisKKworICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZUZsYXRSZWZlcmVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgRmlsZSByZWZlcmVuY2UgPSBuZXcgRmlsZSh0bXBEaXIsIEZMQVRfUkVGX05BTUUpOworICAgICAgUHJpbnRTdHJlYW0gcHMgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgIHBzID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlZmVyZW5jZSkpOworICAgICAgICAgcHMucHJpbnRsbigiVGhpcyBpcyBhIHRlc3Qgc3ViLXJlZmVyZW5jZSBmaWxlIik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBlOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgIHBzLmNsb3NlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVmZXJlbmNlOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0luZ2VzdFByb2R1Y3RDbGlBY3Rpb24gZXh0ZW5kcyBJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSBwdCA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgICAgICAgICAgcHQuc2V0TmFtZSh0eXBlTmFtZSk7CisgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGFUcmFuc2ZlcihEYXRhVHJhbnNmZXIgZGF0YVRyYW5zZmVyZXIpIHsKKyAgICAgICAgICAgICAgIGNsaWVudFNldERhdGFUcmFuc2ZlcmVyID0gZGF0YVRyYW5zZmVyZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgaW5nZXN0UHJvZHVjdChQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VDbGllbnRUcmFuc2ZlcikgeworICAgICAgICAgICAgICAgY2xpZW50U2V0UHJvZHVjdCA9IHByb2R1Y3Q7CisgICAgICAgICAgICAgICBjbGllbnRTZXRNZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICAgICAgICAgcmV0dXJuIFBST0RVQ1RfSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgY2xhc3MgTnVsbFBUSW5nZXN0UHJvZHVjdENsaUFjdGlvbiBleHRlbmRzIE1vY2tJbmdlc3RQcm9kdWN0Q2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJvZHVjdFR5cGUgZ2V0UHJvZHVjdFR5cGVCeU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0THVjZW5lUXVlcnlDbGlBY3Rpb24uamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RMdWNlbmVRdWVyeUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTI1MTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvY2xpL2FjdGlvbi9UZXN0THVjZW5lUXVlcnlDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkJvb2xlYW5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmFuZ2VRdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5Db21wbGV4UXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBMdWNlbmVRdWVyeUNsaUFjdGlvbn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEx1Y2VuZVF1ZXJ5Q2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GSUxFTkFNRSA9ICJkYXRhLmRhdCI7CisKKyAgIHByaXZhdGUgQ29tcGxleFF1ZXJ5IGNsaWVudFNldFF1ZXJ5OworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbigpIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tMdWNlbmVRdWVyeUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja0x1Y2VuZVF1ZXJ5Q2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UXVlcnkoIlByb2R1Y3RJZD1UZXN0UHJvZHVjdElkIik7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvdyBleGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICAgIGNsaUFjdGlvbi5zZXRRdWVyeSgiIik7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvdyBleGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENsaWVudFRyYW5zVHJ1ZUFuZEZsYXRQcm9kdWN0KCkKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyID0gbmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCk7CisgICAgICBNb2NrTHVjZW5lUXVlcnlDbGlBY3Rpb24gY2xpQWN0aW9uID0gbmV3IE1vY2tMdWNlbmVRdWVyeUNsaUFjdGlvbigpOworCisgICAgICBjbGlBY3Rpb24uc2V0UXVlcnkoIlByb2R1Y3RJZDpUZXN0UHJvZHVjdElkIik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBjbGllbnRTZXRRdWVyeS5nZXRDcml0ZXJpYSgpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3RJZCIsICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGNsaWVudFNldFF1ZXJ5CisgICAgICAgICAgICAuZ2V0Q3JpdGVyaWEoKS5nZXQoMCkpLmdldEVsZW1lbnROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0UHJvZHVjdElkIiwgKChUZXJtUXVlcnlDcml0ZXJpYSkgY2xpZW50U2V0UXVlcnkKKyAgICAgICAgICAgIC5nZXRDcml0ZXJpYSgpLmdldCgwKSkuZ2V0VmFsdWUoKSk7CisKKyAgICAgIGNsaUFjdGlvbi5zZXRRdWVyeSgiUHJvZHVjdElkOlRlc3RQcm9kdWN0SWQgUHJvZHVjdE5hbWU6VGVzdFByb2R1Y3ROYW1lIik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBjbGllbnRTZXRRdWVyeS5nZXRDcml0ZXJpYSgpLnNpemUoKSk7CisgICAgICBCb29sZWFuUXVlcnlDcml0ZXJpYSBicWMgPSAoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpIGNsaWVudFNldFF1ZXJ5CisgICAgICAgICAgICAuZ2V0Q3JpdGVyaWEoKS5nZXQoMCk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgYnFjLmdldFRlcm1zKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuUXVlcnlDcml0ZXJpYS5PUiwgYnFjLmdldE9wZXJhdG9yKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0SWQiLAorICAgICAgICAgICAgKChUZXJtUXVlcnlDcml0ZXJpYSkgYnFjLmdldFRlcm1zKCkuZ2V0KDApKS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGVzdFByb2R1Y3RJZCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMCkpLmdldFZhbHVlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0TmFtZSIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMSkpLmdldEVsZW1lbnROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0UHJvZHVjdE5hbWUiLCAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKQorICAgICAgICAgICAgLmdldCgxKSkuZ2V0VmFsdWUoKSk7CisKKyAgICAgIGNsaUFjdGlvbgorICAgICAgICAgICAgLnNldFF1ZXJ5KCJQcm9kdWN0SWQ6VGVzdFByb2R1Y3RJZCBOb21pbmFsRGF0ZTpbMjAwMjAxMDEgVE8gMjAwMzAxMDFdIik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBjbGllbnRTZXRRdWVyeS5nZXRDcml0ZXJpYSgpLnNpemUoKSk7CisgICAgICBicWMgPSAoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpIGNsaWVudFNldFF1ZXJ5LmdldENyaXRlcmlhKCkuZ2V0KDApOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJxYy5nZXRUZXJtcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuT1IsIGJxYy5nZXRPcGVyYXRvcigpKTsKKyAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjdElkIiwKKyAgICAgICAgICAgICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgwKSkuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RQcm9kdWN0SWQiLAorICAgICAgICAgICAgKChUZXJtUXVlcnlDcml0ZXJpYSkgYnFjLmdldFRlcm1zKCkuZ2V0KDApKS5nZXRWYWx1ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiTm9taW5hbERhdGUiLAorICAgICAgICAgICAgKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgxKSkuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIjIwMDIwMTAxIiwKKyAgICAgICAgICAgICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMSkpLmdldFN0YXJ0VmFsdWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIjIwMDMwMTAxIiwKKyAgICAgICAgICAgICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMSkpLmdldEVuZFZhbHVlKCkpOworICAgICAgYXNzZXJ0VHJ1ZSgoKFJhbmdlUXVlcnlDcml0ZXJpYSkgYnFjLmdldFRlcm1zKCkuZ2V0KDEpKS5nZXRJbmNsdXNpdmUoKSk7CisKKyAgICAgIGNsaUFjdGlvbgorICAgICAgICAgICAgLnNldFF1ZXJ5KCJQcm9kdWN0SWQ6VGVzdFByb2R1Y3RJZCBOb21pbmFsRGF0ZTp7MjAwMjAxMDEgVE8gMjAwMzAxMDF9Iik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNsaWVudFNldFF1ZXJ5LmdldENyaXRlcmlhKCkuc2l6ZSgpKTsKKyAgICAgIGJxYyA9IChCb29sZWFuUXVlcnlDcml0ZXJpYSkgY2xpZW50U2V0UXVlcnkuZ2V0Q3JpdGVyaWEoKS5nZXQoMCk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgYnFjLmdldFRlcm1zKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuUXVlcnlDcml0ZXJpYS5PUiwgYnFjLmdldE9wZXJhdG9yKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0SWQiLAorICAgICAgICAgICAgKChUZXJtUXVlcnlDcml0ZXJpYSkgYnFjLmdldFRlcm1zKCkuZ2V0KDApKS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGVzdFByb2R1Y3RJZCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMCkpLmdldFZhbHVlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJOb21pbmFsRGF0ZSIsCisgICAgICAgICAgICAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgYnFjLmdldFRlcm1zKCkuZ2V0KDEpKS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiMjAwMjAxMDEiLAorICAgICAgICAgICAgKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgxKSkuZ2V0U3RhcnRWYWx1ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiMjAwMzAxMDEiLAorICAgICAgICAgICAgKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgxKSkuZ2V0RW5kVmFsdWUoKSk7CisgICAgICBhc3NlcnRGYWxzZSgoKFJhbmdlUXVlcnlDcml0ZXJpYSkgYnFjLmdldFRlcm1zKCkuZ2V0KDEpKS5nZXRJbmNsdXNpdmUoKSk7CisKKyAgICAgIGNsaUFjdGlvbgorICAgICAgICAgICAgLnNldFF1ZXJ5KCJQcm9kdWN0SWQ6VGVzdFByb2R1Y3RJZCBBTkQgUHJvZHVjdE5hbWU6VGVzdFByb2R1Y3ROYW1lIik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBjbGllbnRTZXRRdWVyeS5nZXRDcml0ZXJpYSgpLnNpemUoKSk7CisgICAgICBicWMgPSAoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEpIGNsaWVudFNldFF1ZXJ5LmdldENyaXRlcmlhKCkuZ2V0KDApOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJxYy5nZXRUZXJtcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhblF1ZXJ5Q3JpdGVyaWEuQU5ELCBicWMuZ2V0T3BlcmF0b3IoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3RJZCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMCkpLmdldEVsZW1lbnROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0UHJvZHVjdElkIiwKKyAgICAgICAgICAgICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgwKSkuZ2V0VmFsdWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3ROYW1lIiwKKyAgICAgICAgICAgICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgxKSkuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RQcm9kdWN0TmFtZSIsICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpCisgICAgICAgICAgICAuZ2V0KDEpKS5nZXRWYWx1ZSgpKTsKKworICAgICAgY2xpQWN0aW9uCisgICAgICAgICAgICAuc2V0UXVlcnkoIlByb2R1Y3RJZDpUZXN0UHJvZHVjdElkIE9SIFByb2R1Y3ROYW1lOlRlc3RQcm9kdWN0TmFtZSIpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgY2xpZW50U2V0UXVlcnkuZ2V0Q3JpdGVyaWEoKS5zaXplKCkpOworICAgICAgYnFjID0gKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBjbGllbnRTZXRRdWVyeS5nZXRDcml0ZXJpYSgpLmdldCgwKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBicWMuZ2V0VGVybXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW5RdWVyeUNyaXRlcmlhLk9SLCBicWMuZ2V0T3BlcmF0b3IoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3RJZCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMCkpLmdldEVsZW1lbnROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0UHJvZHVjdElkIiwKKyAgICAgICAgICAgICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgwKSkuZ2V0VmFsdWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3ROYW1lIiwKKyAgICAgICAgICAgICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpLmdldCgxKSkuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RQcm9kdWN0TmFtZSIsICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGJxYy5nZXRUZXJtcygpCisgICAgICAgICAgICAuZ2V0KDEpKS5nZXRWYWx1ZSgpKTsKKworICAgICAgY2xpQWN0aW9uCisgICAgICAgICAgICAuc2V0UXVlcnkoIihQcm9kdWN0SWQ6VGVzdFByb2R1Y3RJZCBPUiBQcm9kdWN0TmFtZTpUZXN0UHJvZHVjdE5hbWUpIEFORCBOb21pbmFsRGF0ZToyMDExMDEyMCIpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgY2xpZW50U2V0UXVlcnkuZ2V0Q3JpdGVyaWEoKS5zaXplKCkpOworICAgICAgYnFjID0gKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBjbGllbnRTZXRRdWVyeS5nZXRDcml0ZXJpYSgpLmdldCgwKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBicWMuZ2V0VGVybXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW5RdWVyeUNyaXRlcmlhLkFORCwgYnFjLmdldE9wZXJhdG9yKCkpOworICAgICAgQm9vbGVhblF1ZXJ5Q3JpdGVyaWEgc3ViQnFjID0gKEJvb2xlYW5RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKQorICAgICAgICAgICAgLmdldCgwKTsKKyAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjdElkIiwKKyAgICAgICAgICAgICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIHN1YkJxYy5nZXRUZXJtcygpLmdldCgwKSkuZ2V0RWxlbWVudE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RQcm9kdWN0SWQiLAorICAgICAgICAgICAgKChUZXJtUXVlcnlDcml0ZXJpYSkgc3ViQnFjLmdldFRlcm1zKCkuZ2V0KDApKS5nZXRWYWx1ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiUHJvZHVjdE5hbWUiLAorICAgICAgICAgICAgKChUZXJtUXVlcnlDcml0ZXJpYSkgc3ViQnFjLmdldFRlcm1zKCkuZ2V0KDEpKS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGVzdFByb2R1Y3ROYW1lIiwgKChUZXJtUXVlcnlDcml0ZXJpYSkgc3ViQnFjLmdldFRlcm1zKCkKKyAgICAgICAgICAgIC5nZXQoMSkpLmdldFZhbHVlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJOb21pbmFsRGF0ZSIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMSkpLmdldEVsZW1lbnROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCIyMDExMDEyMCIsCisgICAgICAgICAgICAoKFRlcm1RdWVyeUNyaXRlcmlhKSBicWMuZ2V0VGVybXMoKS5nZXQoMSkpLmdldFZhbHVlKCkpOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTW9ja0x1Y2VuZVF1ZXJ5Q2xpQWN0aW9uIGV4dGVuZHMgTHVjZW5lUXVlcnlDbGlBY3Rpb24geworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwKKyAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFF1ZXJ5UmVzdWx0PiBjb21wbGV4UXVlcnkoQ29tcGxleFF1ZXJ5IGNvbXBsZXhRdWVyeSkgeworICAgICAgICAgICAgICAgY2xpZW50U2V0UXVlcnkgPSBjb21wbGV4UXVlcnk7CisgICAgICAgICAgICAgICBQcm9kdWN0IHAgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgICAgcC5zZXRQcm9kdWN0SWQoIlRlc3RQcm9kdWN0SWQiKTsKKyAgICAgICAgICAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgIG0uYWRkTWV0YWRhdGEoIkZpbGVuYW1lIiwgVEVTVF9GSUxFTkFNRSk7CisgICAgICAgICAgICAgICBRdWVyeVJlc3VsdCBxciA9IG5ldyBRdWVyeVJlc3VsdChwLCBtKTsKKyAgICAgICAgICAgICAgIHFyLnNldFRvU3RyaW5nRm9ybWF0KGNvbXBsZXhRdWVyeS5nZXRUb1N0cmluZ1Jlc3VsdEZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QocXIpOworICAgICAgICAgICAgfQorICAgICAgICAgfTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RTcWxRdWVyeUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2NsaS9hY3Rpb24vVGVzdFNxbFF1ZXJ5Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2Y2FlNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9jbGkvYWN0aW9uL1Rlc3RTcWxRdWVyeUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb24uQWN0aW9uTWVzc2FnZVByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuQ29tcGxleFF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LlF1ZXJ5UmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmNvbnYuVmVyc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5maWx0ZXIuRmlsdGVyQWxnb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuZmlsdGVyLlRpbWVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIFNxbFF1ZXJ5Q2xpQWN0aW9ufS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RTcWxRdWVyeUNsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZID0gIlNFTEVDVCAqIEZST00gKiI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09SVF9CWSA9ICJGaWxlbmFtZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPUk1BVCA9ICJGaWxlbmFtZSA9ICRGaWxlbmFtZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gIiwiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsdGVyQWxnb3IgRklMVEVSX0FMR09SID0gbmV3IE1vY2tGaWx0ZXJBbGdvcigpOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0RBVEVfVElNRV9NRVRfS0VZID0gIlN0YXJ0RGF0ZVRpbWUiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9EQVRFX1RJTUVfTUVUX0tFWSA9ICJFbmREYXRlVGltZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfREFURV9USU1FX01FVF9LRVkgPSAiUHJpb3JpdHlEYXRlVGltZSI7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uQ29udmVydGVyIFZFUlNJT05fQ09OViA9IG5ldyBNb2NrVmVyc2lvbkNvbnZlcnRlcigpOworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GSUxFTkFNRSA9ICJkYXRhLmRhdCI7CisKKyAgIHByaXZhdGUgQ29tcGxleFF1ZXJ5IGNsaWVudFNldENvbXBsZXhRdWVyeTsKKworICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRXJyb3JzKCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja1NxbFF1ZXJ5Q2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrU3FsUXVlcnlDbGlBY3Rpb24oKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHRocm93IENtZExpbmVBY3Rpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKENtZExpbmVBY3Rpb25FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICB9CisgICAgICBjbGlBY3Rpb24uc2V0UXVlcnkoUVVFUlkpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7IC8vIFNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uLgorICAgICAgY2xpQWN0aW9uLnNldEZpbHRlckFsZ29yKEZJTFRFUl9BTEdPUik7CisgICAgICB0cnkgeworICAgICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0aHJvdyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgfQorICAgICAgY2xpQWN0aW9uLnNldFN0YXJ0RGF0ZVRpbWVNZXRLZXkoU1RBUlRfREFURV9USU1FX01FVF9LRVkpOworICAgICAgY2xpQWN0aW9uLnNldEVuZERhdGVUaW1lTWV0S2V5KEVORF9EQVRFX1RJTUVfTUVUX0tFWSk7CisgICAgICBjbGlBY3Rpb24uc2V0UHJpb3JpdHlNZXRLZXkoUFJJT1JJVFlfREFURV9USU1FX01FVF9LRVkpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7IC8vIFNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uLgorICAgICAgY2xpQWN0aW9uLnNldFZlcnNpb25Db252ZXJ0ZXIoVkVSU0lPTl9DT05WKTsKKyAgICAgIGNsaUFjdGlvbi5leGVjdXRlKHByaW50ZXIpOyAvLyBTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbi4KKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENsaWVudFRyYW5zVHJ1ZUFuZEZsYXRQcm9kdWN0KCkgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgIEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIgPSBuZXcgQWN0aW9uTWVzc2FnZVByaW50ZXIoKTsKKyAgICAgIE1vY2tTcWxRdWVyeUNsaUFjdGlvbiBjbGlBY3Rpb24gPSBuZXcgTW9ja1NxbFF1ZXJ5Q2xpQWN0aW9uKCk7CisgICAgICBjbGlBY3Rpb24uc2V0UXVlcnkoUVVFUlkpOworICAgICAgY2xpQWN0aW9uLnNldFNvcnRCeShTT1JUX0JZKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRPdXRwdXRGb3JtYXQoT1VUUFVUX0ZPUk1BVCk7CisgICAgICBjbGlBY3Rpb24uc2V0RGVsaW1pdGVyKERFTElNSVRFUik7CisgICAgICBjbGlBY3Rpb24uc2V0RmlsdGVyQWxnb3IoRklMVEVSX0FMR09SKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRTdGFydERhdGVUaW1lTWV0S2V5KFNUQVJUX0RBVEVfVElNRV9NRVRfS0VZKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRFbmREYXRlVGltZU1ldEtleShFTkRfREFURV9USU1FX01FVF9LRVkpOworICAgICAgY2xpQWN0aW9uLnNldFByaW9yaXR5TWV0S2V5KFBSSU9SSVRZX0RBVEVfVElNRV9NRVRfS0VZKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRWZXJzaW9uQ29udmVydGVyKFZFUlNJT05fQ09OVik7CisgICAgICBjbGlBY3Rpb24uZXhlY3V0ZShwcmludGVyKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkZpbGVuYW1lID0gZGF0YS5kYXQiLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKFNPUlRfQlksIGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRTb3J0QnlNZXRLZXkoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoT1VUUFVUX0ZPUk1BVCwgY2xpZW50U2V0Q29tcGxleFF1ZXJ5LmdldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCkpOworICAgICAgYXNzZXJ0TnVsbChjbGllbnRTZXRDb21wbGV4UXVlcnkuZ2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKSk7CisgICAgICBhc3NlcnROdWxsKGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRSZWR1Y2VkTWV0YWRhdGEoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoRklMVEVSX0FMR09SLCBjbGllbnRTZXRDb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRGaWx0ZXJBbGdvcigpKTsKKyAgICAgIGFzc2VydEVxdWFscyhTVEFSVF9EQVRFX1RJTUVfTUVUX0tFWSwgY2xpZW50U2V0Q29tcGxleFF1ZXJ5LmdldFF1ZXJ5RmlsdGVyKCkuZ2V0U3RhcnREYXRlVGltZU1ldEtleSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhFTkRfREFURV9USU1FX01FVF9LRVksIGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpLmdldEVuZERhdGVUaW1lTWV0S2V5KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBSSU9SSVRZX0RBVEVfVElNRV9NRVRfS0VZLCBjbGllbnRTZXRDb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRQcmlvcml0eU1ldEtleSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhWRVJTSU9OX0NPTlYsIGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpLmdldENvbnZlcnRlcigpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENsaWVudFRyYW5zVHJ1ZUFuZEZsYXRQcm9kdWN0QW5kTm9PdXRwdXRGb3JtYXQoKSB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpOworICAgICAgTW9ja1NxbFF1ZXJ5Q2xpQWN0aW9uIGNsaUFjdGlvbiA9IG5ldyBNb2NrU3FsUXVlcnlDbGlBY3Rpb24oKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRRdWVyeShRVUVSWSk7CisgICAgICBjbGlBY3Rpb24uc2V0U29ydEJ5KFNPUlRfQlkpOworICAgICAgY2xpQWN0aW9uLnNldERlbGltaXRlcihERUxJTUlURVIpOworICAgICAgY2xpQWN0aW9uLnNldEZpbHRlckFsZ29yKEZJTFRFUl9BTEdPUik7CisgICAgICBjbGlBY3Rpb24uc2V0U3RhcnREYXRlVGltZU1ldEtleShTVEFSVF9EQVRFX1RJTUVfTUVUX0tFWSk7CisgICAgICBjbGlBY3Rpb24uc2V0RW5kRGF0ZVRpbWVNZXRLZXkoRU5EX0RBVEVfVElNRV9NRVRfS0VZKTsKKyAgICAgIGNsaUFjdGlvbi5zZXRQcmlvcml0eU1ldEtleShQUklPUklUWV9EQVRFX1RJTUVfTUVUX0tFWSk7CisgICAgICBjbGlBY3Rpb24uc2V0VmVyc2lvbkNvbnZlcnRlcihWRVJTSU9OX0NPTlYpOworICAgICAgY2xpQWN0aW9uLmV4ZWN1dGUocHJpbnRlcik7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJpbnRlci5nZXRQcmludGVkTWVzc2FnZXMoKS5zaXplKCkpOworICAgICAgU3RyaW5nIG1zZyA9IHByaW50ZXIuZ2V0UHJpbnRlZE1lc3NhZ2VzKCkuZ2V0KDApOworICAgICAgYXNzZXJ0VHJ1ZShtc2cuY29udGFpbnMoImRhdGEuZGF0IikpOworICAgICAgYXNzZXJ0VHJ1ZShtc2cuY29udGFpbnMoIkJvYixCaWxseSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiLCIsIG1zZy5yZXBsYWNlKCJkYXRhLmRhdCIsIiIpLnJlcGxhY2UoIkJvYixCaWxseSIsIiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiXG4iLCBwcmludGVyLmdldFByaW50ZWRNZXNzYWdlcygpLmdldCgxKSk7CisgICAgICBhc3NlcnRFcXVhbHMoU09SVF9CWSwgY2xpZW50U2V0Q29tcGxleFF1ZXJ5LmdldFNvcnRCeU1ldEtleSgpKTsKKyAgICAgIGFzc2VydE51bGwoY2xpZW50U2V0Q29tcGxleFF1ZXJ5LmdldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCkpOworICAgICAgYXNzZXJ0TnVsbChjbGllbnRTZXRDb21wbGV4UXVlcnkuZ2V0UmVkdWNlZFByb2R1Y3RUeXBlTmFtZXMoKSk7CisgICAgICBhc3NlcnROdWxsKGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRSZWR1Y2VkTWV0YWRhdGEoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoRklMVEVSX0FMR09SLCBjbGllbnRTZXRDb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRGaWx0ZXJBbGdvcigpKTsKKyAgICAgIGFzc2VydEVxdWFscyhTVEFSVF9EQVRFX1RJTUVfTUVUX0tFWSwgY2xpZW50U2V0Q29tcGxleFF1ZXJ5LmdldFF1ZXJ5RmlsdGVyKCkuZ2V0U3RhcnREYXRlVGltZU1ldEtleSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhFTkRfREFURV9USU1FX01FVF9LRVksIGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpLmdldEVuZERhdGVUaW1lTWV0S2V5KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFBSSU9SSVRZX0RBVEVfVElNRV9NRVRfS0VZLCBjbGllbnRTZXRDb21wbGV4UXVlcnkuZ2V0UXVlcnlGaWx0ZXIoKS5nZXRQcmlvcml0eU1ldEtleSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhWRVJTSU9OX0NPTlYsIGNsaWVudFNldENvbXBsZXhRdWVyeS5nZXRRdWVyeUZpbHRlcigpLmdldENvbnZlcnRlcigpKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1vY2tTcWxRdWVyeUNsaUFjdGlvbiBleHRlbmRzIFNxbFF1ZXJ5Q2xpQWN0aW9uIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiksCisgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxRdWVyeVJlc3VsdD4gY29tcGxleFF1ZXJ5KENvbXBsZXhRdWVyeSBjb21wbGV4UXVlcnkpIHsKKyAgICAgICAgICAgICAgIGNsaWVudFNldENvbXBsZXhRdWVyeSA9IGNvbXBsZXhRdWVyeTsKKyAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICAgICAgICAgICBwLnNldFByb2R1Y3RJZCgiVGVzdFByb2R1Y3RJZCIpOworICAgICAgICAgICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICAgICAgICAgbS5hZGRNZXRhZGF0YSgiRmlsZW5hbWUiLCBURVNUX0ZJTEVOQU1FKTsKKyAgICAgICAgICAgICAgIG0uYWRkTWV0YWRhdGEoIk93bmVycyIsIExpc3RzLm5ld0FycmF5TGlzdCgiQm9iIiwgIkJpbGx5IikpOworICAgICAgICAgICAgICAgUXVlcnlSZXN1bHQgcXIgPSBuZXcgUXVlcnlSZXN1bHQocCwgbSk7CisgICAgICAgICAgICAgICBxci5zZXRUb1N0cmluZ0Zvcm1hdChjb21wbGV4UXVlcnkuZ2V0VG9TdHJpbmdSZXN1bHRGb3JtYXQoKSk7CisgICAgICAgICAgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KHFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja0ZpbHRlckFsZ29yIGV4dGVuZHMgRmlsdGVyQWxnb3IgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTGlzdDxUaW1lRXZlbnQ+IGZpbHRlckV2ZW50cyhMaXN0PFRpbWVFdmVudD4gZXZlbnRzKSB7CisgICAgICAgICByZXR1cm4gZXZlbnRzOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgVmVyc2lvbkNvbnZlcnRlciB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBkb3VibGUgY29udmVydFRvUHJpb3JpdHkoU3RyaW5nIHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1Rlc3RJblBsYWNlRGF0YVRyYW5zZmVyZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdEluUGxhY2VEYXRhVHJhbnNmZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWI2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvZGF0YXRyYW5zZmVyL1Rlc3RJblBsYWNlRGF0YVRyYW5zZmVyZXIuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdEluUGxhY2VEYXRhVHJhbnNmZXJlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgSW5QbGFjZURhdGFUcmFuc2ZlcmVyIHRyYW5zZmVyOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE9yaWdMb2M7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0RXhwZWN0ZWRMb2M7CisKKyAgICBwdWJsaWMgVGVzdEluUGxhY2VEYXRhVHJhbnNmZXJlcigpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAoSW5QbGFjZURhdGFUcmFuc2ZlcmVyKSBuZXcgSW5QbGFjZURhdGFUcmFuc2ZlckZhY3RvcnkoKQorICAgICAgICAgICAgICAgIC5jcmVhdGVEYXRhVHJhbnNmZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgdGVtcEZpbGVTcmMgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJmb28iLCAiLnR4dCIpOworICAgICAgICAgICAgdGVtcEZpbGVTcmMuZGVsZXRlT25FeGl0KCk7CisgICAgICAgICAgICBwcm9kdWN0T3JpZ0xvYyA9IHRlbXBGaWxlU3JjLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgcHJvZHVjdEV4cGVjdGVkTG9jID0gdGVtcEZpbGVTcmMuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAoIXByb2R1Y3RFeHBlY3RlZExvYy5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdEV4cGVjdGVkTG9jICs9ICIvIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvZHVjdEV4cGVjdGVkTG9jICs9ICJmb28yLnR4dCI7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyKCkgeworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiLAorICAgICAgICAgICAgICAgICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgICB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZCgKKyAgICAgICAgICAgICAgICBuZXcgUmVmZXJlbmNlKCJmaWxlOiIgKyBwcm9kdWN0T3JpZ0xvYywgImZpbGU6IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0RXhwZWN0ZWRMb2MsIDBMKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zZmVyLnRyYW5zZmVyUHJvZHVjdCh0ZXN0UHJvZHVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFzc2VydCB0aGF0IGl0IGRpZG4ndCB0cmFuc2ZlciB0aGUgZmlsZSBhbnl3aGVyZQorICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShwcm9kdWN0RXhwZWN0ZWRMb2MpLmV4aXN0cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdExvY2FsRGF0YVRyYW5zZmVyZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdExvY2FsRGF0YVRyYW5zZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU2NDFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9UZXN0TG9jYWxEYXRhVHJhbnNmZXJlci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2ZlcjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgTG9jYWxEYXRhVHJhbnNmZXJlcn0uCisgKgorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RMb2NhbERhdGFUcmFuc2ZlcmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIExvY2FsRGF0YVRyYW5zZmVyZXIgdHJhbnNmZXI7CisKKyAgIHByaXZhdGUgRmlsZSBvcmlnRmlsZTsKKyAgIHByaXZhdGUgRmlsZSB0ZXN0RGlyOworICAgcHJpdmF0ZSBGaWxlIHJlcG9EaXI7CisgICBwcml2YXRlIEZpbGUgcmVwb0ZpbGU7CisgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKKyAgIHByaXZhdGUgRmlsZSBkZXN0RmlsZTsKKworICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHRyYW5zZmVyID0gKExvY2FsRGF0YVRyYW5zZmVyZXIpIG5ldyBMb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkoKQorICAgICAgICAgLmNyZWF0ZURhdGFUcmFuc2ZlcigpOworICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3Rlc3QudHh0Iik7CisgICAgICBvcmlnRmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOworICAgICAgRmlsZSB0ZXN0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAiLnR4dCIpOworICAgICAgdGVzdERpciA9IG5ldyBGaWxlKHRlc3RGaWxlLmdldFBhcmVudEZpbGUoKSwgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisgICAgICByZXBvRGlyID0gbmV3IEZpbGUodGVzdERpciwgInJlcG8iKTsKKyAgICAgIGlmICghcmVwb0Rpci5ta2RpcnMoKSkgeworICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSByZXBvIGRpcmVjdG9yeSEiKTsKKyAgICAgIH0KKyAgICAgIHJlcG9GaWxlID0gbmV3IEZpbGUocmVwb0RpciwgInRlc3QudHh0Iik7IAorICAgICAgZGVzdERpciA9IG5ldyBGaWxlKHRlc3REaXIsICJkZXN0Iik7CisgICAgICBpZiAoIWRlc3REaXIubWtkaXJzKCkpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5ISIpOworICAgICAgfQorICAgICAgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAidGVzdC50eHQiKTsgCisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBGaWxlVXRpbHMuZm9yY2VEZWxldGUodGVzdERpcik7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlckFuZFJldHJpZXZlKCkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGNyZWF0ZUR1bW15UHJvZHVjdCgpOworCisgICAgICAvLyBUZXN0IHRyYW5zZmVyLgorICAgICAgdHJhbnNmZXIudHJhbnNmZXJQcm9kdWN0KHRlc3RQcm9kdWN0KTsKKworICAgICAgLy8gQ2hlY2sgdGhhdCBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJlZC4KKyAgICAgIGFzc2VydFRydWUoIlJlcG8gZmlsZSBkb2VzIG5vdCBleGlzdCIsIHJlcG9GaWxlLmV4aXN0cygpKTsKKyAgICAgIGFzc2VydFRydWUoIlJlcG8gZmlsZSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIG9yaWcgZmlsZSIsCisgICAgICAgICAgICBGaWxlVXRpbHMuY29udGVudEVxdWFscyhvcmlnRmlsZSwgcmVwb0ZpbGUpKTsKKworICAgICAgLy8gVGVzdCByZXRyaWV2ZQorICAgICAgdHJhbnNmZXIucmV0cmlldmVQcm9kdWN0KHRlc3RQcm9kdWN0LCBkZXN0RGlyKTsKKworICAgICAgLy8gQ2hlY2sgdGhhdCBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJlZC4KKyAgICAgIGFzc2VydFRydWUoIkRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QiLCBkZXN0RmlsZS5leGlzdHMoKSk7CisgICAgICBhc3NlcnRUcnVlKCJEZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgY29udGVudHMgYXMgb3JpZyBmaWxlIiwKKyAgICAgICAgICAgIEZpbGVVdGlscy5jb250ZW50RXF1YWxzKG9yaWdGaWxlLCBkZXN0RmlsZSkpOworICAgfQorCisgICBwcml2YXRlIFByb2R1Y3QgY3JlYXRlRHVtbXlQcm9kdWN0KCkgeworICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwKKyAgICAgICAgICAgICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgdGVzdFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQoCisgICAgICAgICAgICBuZXcgUmVmZXJlbmNlKG9yaWdGaWxlLnRvVVJJKCkudG9TdHJpbmcoKSwgbmV3IEZpbGUocmVwb0RpciwKKyAgICAgICAgICAgICAgICAgICJ0ZXN0LnR4dCIpLnRvVVJJKCkudG9TdHJpbmcoKSwgb3JpZ0ZpbGUubGVuZ3RoKCkpKTsKKyAgICAgIHJldHVybiB0ZXN0UHJvZHVjdDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdFMzRGF0YVRyYW5zZmVyZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdFMzRGF0YVRyYW5zZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDAyY2M3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9UZXN0UzNEYXRhVHJhbnNmZXJlci5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2ZlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3I7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMuQW1hem9uUzM7CitpbXBvcnQgY29tLmFtYXpvbmF3cy5zZXJ2aWNlcy5zMy5tb2RlbC5EZWxldGVPYmplY3RSZXF1ZXN0OworaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuczMubW9kZWwuR2V0T2JqZWN0UmVxdWVzdDsKK2ltcG9ydCBjb20uYW1hem9uYXdzLnNlcnZpY2VzLnMzLm1vZGVsLlB1dE9iamVjdFJlcXVlc3Q7CitpbXBvcnQgY29tLmFtYXpvbmF3cy5zZXJ2aWNlcy5zMy5tb2RlbC5TM09iamVjdDsKK2ltcG9ydCBjb20uYW1hem9uYXdzLnNlcnZpY2VzLnMzLm1vZGVsLlMzT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgUzNEYXRhVHJhbnNmZXJlcn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUub3JnIChCcmlhbiBGb3N0ZXIpCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBUZXN0UzNEYXRhVHJhbnNmZXJlciB7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUzNfQlVDS0VUX05BTUUgPSAiVGVzdEJ1Y2tldCI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9SR0lOQUxfUkVGID0gImZpbGU6L3BhdGgvdG8vZmlsZSI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERBVEFfU1RPUkVfUkVGID0gInMzOi9wYXRoL2luL3MzL3N0b3JhZ2UvZmlsZSI7CisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFWFBFQ1RFRF9PUkdJTkFMX1JFRiA9ICIvcGF0aC90by9maWxlIjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhQRUNURURfREFUQV9TVE9SRV9SRUYgPSAicGF0aC9pbi9zMy9zdG9yYWdlL2ZpbGUiOworCisJQFJ1bGUKKwlwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIHRlbXBGb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKwlATW9jayBwcml2YXRlIEFtYXpvblMzIHMzQ2xpZW50OworCUBNb2NrIHByaXZhdGUgUHJvZHVjdCBwcm9kdWN0OworCUBNb2NrIHByaXZhdGUgUmVmZXJlbmNlIHJlZmVyZW5jZTsKKwlATW9jayBwcml2YXRlIFMzT2JqZWN0IHMzT2JqZWN0OworCUBNb2NrIHByaXZhdGUgUzNPYmplY3RJbnB1dFN0cmVhbSBzM0lucHV0U3RyZWFtOworCisJcHJpdmF0ZSBTM0RhdGFUcmFuc2ZlcmVyIGRhdGFUcmFuc2ZlcmVyOworCXByaXZhdGUgRmlsZSBzdGFnaW5nRGlyOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKworCQlzdGFnaW5nRGlyID0gdGVtcEZvbGRlci5nZXRSb290KCk7CisJCWRhdGFUcmFuc2ZlcmVyID0gbmV3IFMzRGF0YVRyYW5zZmVyZXIoczNDbGllbnQsIFMzX0JVQ0tFVF9OQU1FLCB0cnVlKTsKKworCQl3aGVuKHJlZmVyZW5jZS5nZXRPcmlnUmVmZXJlbmNlKCkpLnRoZW5SZXR1cm4oT1JHSU5BTF9SRUYpOworCQl3aGVuKHJlZmVyZW5jZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkudGhlblJldHVybihEQVRBX1NUT1JFX1JFRik7CQkKKwkJd2hlbihwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpLnRoZW5SZXR1cm4oTGlzdHMubmV3QXJyYXlMaXN0KHJlZmVyZW5jZSkpOworCQl3aGVuKHMzQ2xpZW50LmdldE9iamVjdChNb2NraXRvLjxHZXRPYmplY3RSZXF1ZXN0PmFueSgpKSkudGhlblJldHVybihzM09iamVjdCk7CisJCXdoZW4oczNPYmplY3QuZ2V0T2JqZWN0Q29udGVudCgpKS50aGVuUmV0dXJuKHMzSW5wdXRTdHJlYW0pOworCQl3aGVuKHMzSW5wdXRTdHJlYW0ucmVhZChNb2NraXRvLjxieXRlW10+YW55KCkpKS50aGVuUmV0dXJuKC0xKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlclByb2R1Y3QoKSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWRhdGFUcmFuc2ZlcmVyLnRyYW5zZmVyUHJvZHVjdChwcm9kdWN0KTsKKworCQlBcmd1bWVudENhcHRvcjxQdXRPYmplY3RSZXF1ZXN0PiBhcmd1bWVudCA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFB1dE9iamVjdFJlcXVlc3QuY2xhc3MpOworCQl2ZXJpZnkoczNDbGllbnQpLnB1dE9iamVjdChhcmd1bWVudC5jYXB0dXJlKCkpOworCisJCVB1dE9iamVjdFJlcXVlc3QgcmVxdWVzdCA9IGFyZ3VtZW50LmdldFZhbHVlKCk7CisJCWFzc2VydFRoYXQocmVxdWVzdC5nZXRCdWNrZXROYW1lKCksIGlzKFMzX0JVQ0tFVF9OQU1FKSk7CisJCWFzc2VydFRoYXQocmVxdWVzdC5nZXRLZXkoKSwgaXMoRVhQRUNURURfREFUQV9TVE9SRV9SRUYpKTsKKwkJYXNzZXJ0VGhhdChyZXF1ZXN0LmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwgaXMoRVhQRUNURURfT1JHSU5BTF9SRUYpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXRyaWV2ZVByb2R1Y3QoKSB0aHJvd3MgRGF0YVRyYW5zZmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWRhdGFUcmFuc2ZlcmVyLnJldHJpZXZlUHJvZHVjdChwcm9kdWN0LCBzdGFnaW5nRGlyKTsKKworCQlBcmd1bWVudENhcHRvcjxHZXRPYmplY3RSZXF1ZXN0PiBhcmd1bWVudCA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKEdldE9iamVjdFJlcXVlc3QuY2xhc3MpOworCQl2ZXJpZnkoczNDbGllbnQpLmdldE9iamVjdChhcmd1bWVudC5jYXB0dXJlKCkpOworCisJCUdldE9iamVjdFJlcXVlc3QgcmVxdWVzdCA9IGFyZ3VtZW50LmdldFZhbHVlKCk7CisJCWFzc2VydFRoYXQocmVxdWVzdC5nZXRCdWNrZXROYW1lKCksIGlzKFMzX0JVQ0tFVF9OQU1FKSk7CisJCWFzc2VydFRoYXQocmVxdWVzdC5nZXRLZXkoKSwgaXMoRVhQRUNURURfREFUQV9TVE9SRV9SRUYpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWxldGVQcm9kdWN0KCkgdGhyb3dzIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCSAgZGF0YVRyYW5zZmVyZXIuZGVsZXRlUHJvZHVjdChwcm9kdWN0KTsKKworICAgIEFyZ3VtZW50Q2FwdG9yPERlbGV0ZU9iamVjdFJlcXVlc3Q+IGFyZ3VtZW50ID0gQXJndW1lbnRDYXB0b3IKKyAgICAgICAgLmZvckNsYXNzKERlbGV0ZU9iamVjdFJlcXVlc3QuY2xhc3MpOworCSAgdmVyaWZ5KHMzQ2xpZW50KS5kZWxldGVPYmplY3QoYXJndW1lbnQuY2FwdHVyZSgpKTsKKworCSAgRGVsZXRlT2JqZWN0UmVxdWVzdCByZXF1ZXN0ID0gYXJndW1lbnQuZ2V0VmFsdWUoKTsKKwkgIGFzc2VydFRoYXQocmVxdWVzdC5nZXRCdWNrZXROYW1lKCksIGlzKFMzX0JVQ0tFVF9OQU1FKSk7CisJICBhc3NlcnRUaGF0KHJlcXVlc3QuZ2V0S2V5KCksIGlzKEVYUEVDVEVEX0RBVEFfU1RPUkVfUkVGKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2RhdGF0cmFuc2Zlci9UZXN0UzNEYXRhVHJhbnNmZXJlckZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdFMzRGF0YVRyYW5zZmVyZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlMGU1ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9kYXRhdHJhbnNmZXIvVGVzdFMzRGF0YVRyYW5zZmVyZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBTM0RhdGFUcmFuc2ZlcmVyRmFjdG9yeX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUub3JnIChCcmlhbiBGb3N0ZXIpCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBUZXN0UzNEYXRhVHJhbnNmZXJlckZhY3RvcnkgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUNLRVRfTkFNRV9QUk9QRVJUWSA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5idWNrZXQubmFtZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJT05fUFJPUEVSVFkgPQorICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMucmVnaW9uIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU19LRVlfUFJPUEVSVFkgPQorICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuYWNjZXNzLmtleSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNSRVRfS0VZX1BST1BFUlRZID0KKyAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnMzLnNlY3JldC5rZXkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DUllQVF9QUk9QRVJUWSA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5lbmNyeXB0IjsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGF0YVRyYW5zZmVyZXIoKSB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KEJVQ0tFVF9OQU1FX1BST1BFUlRZLCAidGVzdC1idWNrZXQiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoUkVHSU9OX1BST1BFUlRZLCAiVVNfV0VTVF8xIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KEFDQ0VTU19LRVlfUFJPUEVSVFksICIyMzEyMzEyMzEyMyIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShTRUNSRVRfS0VZX1BST1BFUlRZLCAiMDAxMDEwMTAxMDEiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoRU5DUllQVF9QUk9QRVJUWSwgInRydWUiKTsKKworICAgIFMzRGF0YVRyYW5zZmVyZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgUzNEYXRhVHJhbnNmZXJlckZhY3RvcnkoKTsKKyAgICBTM0RhdGFUcmFuc2ZlcmVyIHRyYW5zZmVyZXIgPSBmYWN0b3J5LmNyZWF0ZURhdGFUcmFuc2ZlcigpOworCisgICAgYXNzZXJ0VGhhdCh0cmFuc2ZlcmVyLCBpcyhub3QobnVsbFZhbHVlKCkpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvVGVzdENhY2hlZEluZ2VzdGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1Rlc3RDYWNoZWRJbmdlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODA5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1Rlc3RDYWNoZWRJbmdlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2FjaGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLy8gSm5pdCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgQ2FjaGVkSW5nZXN0ZXJ9LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RDYWNoZWRJbmdlc3RlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTV9QT1JUID0gNTAwMTA7CisKKyAgICBwcml2YXRlIFhtbFJwY0ZpbGVNYW5hZ2VyIGZtOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbHVjZW5lQ2F0TG9jOworCisgICAgcHJpdmF0ZSBDYWNoZWRJbmdlc3RlciBpbmdlc3RlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9RVUVSWV9FTEVNID0gIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTklRVUVfRUxFTSA9ICJDQVMuUHJvZHVjdE5hbWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfRklMRV9UWVBFID0gIkdlbmVyaWNGaWxlIjsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBEQVRFX1JBTkdFX1NUQVJUOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERBVEVfUkFOR0VfRU5EOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBjYWNoZWRQcm9kdWN0VHlwZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBEYXRlIHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIERhdGUgZW5kRGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGVuZERhdGUuc2V0SG91cnMoc3RhcnREYXRlLmdldEhvdXJzKCkgKyAxKTsKKyAgICAgICAgREFURV9SQU5HRV9TVEFSVCA9IERhdGVDb252ZXJ0Lmlzb0Zvcm1hdChzdGFydERhdGUpOworICAgICAgICBEQVRFX1JBTkdFX0VORCA9IERhdGVDb252ZXJ0Lmlzb0Zvcm1hdChlbmREYXRlKTsKKyAgICAgICAgY2FjaGVkUHJvZHVjdFR5cGVzLmFkZChHRU5FUklDX0ZJTEVfVFlQRSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy4iCisgICAgICAgICAgICArICJmaWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiOworCisgICAgcHVibGljIFRlc3RDYWNoZWRJbmdlc3RlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvZHVjdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluZ2VzdGVyLnJlc3luc2MoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FjaGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW5nZXN0ZXIuaGFzUHJvZHVjdChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIKKyAgICAgICAgICAgICAgICAgICAgKyBGTV9QT1JUKSwgInRlc3QudHh0IikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5nZXN0KCkgeworICAgICAgICBNZXRhZGF0YSBwcm9kTWV0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgICAgICAgVVJMIHJlZlVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dCIpOworICAgICAgICAgICAgVVJMIG1ldFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dC5tZXQiKTsKKworICAgICAgICAgICAgcHJvZE1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1ldFVybC5nZXRGaWxlKCkpKSk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhlIHJpZ2h0IGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgaW5nZXN0VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgIGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgcmVmVXJsLmdldEZpbGUoKSksIHByb2RNZXQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgbWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMgaW5nZXN0ZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSk7CisgICAgICAgICAgICBQcm9kdWN0IHAgPSBmbUNsaWVudC5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0LnR4dCIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCwgcC5nZXRUcmFuc2ZlclN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZm1DbGllbnQuaGFzUHJvZHVjdCgidGVzdC50eHQiKSk7CisgICAgICAgICAgICBmbUNsaWVudCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN0YXJ0WG1sUnBjRmlsZU1hbmFnZXIoKTsKKyAgICAgICAgaW5nZXN0VGVzdEZpbGUoKTsKKyAgICAgICAgQ2FjaGUgY2FjaGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWNoZSA9IG5ldyBMb2NhbENhY2hlKG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpLAorICAgICAgICAgICAgICAgICAgICBVTklRVUVfRUxFTSwgY2FjaGVkUHJvZHVjdFR5cGVzLCBSQU5HRV9RVUVSWV9FTEVNLAorICAgICAgICAgICAgICAgICAgICBEQVRFX1JBTkdFX1NUQVJULCBEQVRFX1JBTkdFX0VORCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5nZXN0ZXIgPSBuZXcgQ2FjaGVkSW5nZXN0ZXIodHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MsIGNhY2hlKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmbS5zaHV0ZG93bigpOworICAgICAgICBmbSA9IG51bGw7CisKKyAgICAgICAgLy8gYmxvdyBhd2F5IGx1Y2VuZSBjYXQKKyAgICAgICAgZGVsZXRlQWxsRmlsZXMobHVjZW5lQ2F0TG9jKTsKKworICAgICAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKCIvdG1wL3Rlc3QudHh0Iik7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIFN5c3RlbSBwcm9wZXJ0aWVzIHRvIGluaXRpYWwgdmFsdWVzLgorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluZ2VzdFRlc3RGaWxlKCkgeworICAgICAgICBNZXRhZGF0YSBwcm9kTWV0ID0gbnVsbDsKKyAgICAgICAgU3RkSW5nZXN0ZXIgaW5nZXN0ZXIgPSBuZXcgU3RkSW5nZXN0ZXIodHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBVUkwgcmVmVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Iik7CisgICAgICAgICAgICBVUkwgbWV0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Lm1ldCIpOworCisgICAgICAgICAgICBwcm9kTWV0ID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEZpbGUobWV0VXJsLmdldEZpbGUoKSkpKTsKKworICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgcmlnaHQgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICBpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgaW5nZXN0ZXIuaW5nZXN0KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICByZWZVcmwuZ2V0RmlsZSgpKSwgcHJvZE1ldCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICAgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgICAgIEZpbGVbXSBkZWxGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdG8gbG9hZCBsb2dnaW5nIHByb3BlcnRpZXMgYXMgd2VsbAorCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBmaWxlbWdyUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAiL2ZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZmlsZW1nclByb3BlcnRpZXNVcmwuZ2V0RmlsZSgpKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvdmVycmlkZSB0aGUgY2F0YWxvZyB0byB1c2U6IHdlJ2xsIHVzZSBsdWNlbmUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBpbmdlc3RVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QiKTsKKyAgICAgICAgICAgIGx1Y2VuZUNhdExvYyA9IG5ldyBGaWxlKGluZ2VzdFVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKQorICAgICAgICAgICAgICAgICsgIi9jYXQiOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJmaWxlbWdyLmNhdGFsb2cuZmFjdG9yeSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5Iik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoIiwKKyAgICAgICAgICAgICAgICBsdWNlbmVDYXRMb2MpOworCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgcmVwbyBtZ3IgcG9saWN5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgZm1wb2xpY3lVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvZm1wb2xpY3kiKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzIiwKKyAgICAgICAgICAgICAgICAgICAgImZpbGU6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICArIG5ldyBGaWxlKGZtcG9saWN5VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IG92ZXJyaWRlIHRoZSB2YWwgbGF5ZXIgb25lcworICAgICAgICBVUkwgZXhhbXBsZXNDb3JlVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvZXhhbXBsZXMvY29yZSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzIiwKKyAgICAgICAgICAgICAgICAiZmlsZTovLyIKKyAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShleGFtcGxlc0NvcmVVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgLy8gc2V0IHVwIG1pbWUgcmVwbyBwYXRoCisgICAgICAgIFVSTCBtaW1lVHlwZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9taW1lLXR5cGVzLnhtbCIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm0gPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXIoRk1fUE9SVCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvVGVzdExvY2FsQ2FjaGUuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvVGVzdExvY2FsQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjcwM2IxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL2luZ2VzdC9UZXN0TG9jYWxDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5YbWxScGNTdHJ1Y3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgTG9jYWxDYWNoZX0uCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdExvY2FsQ2FjaGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIExvY2FsQ2FjaGUgY2FjaGU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk1fUE9SVCA9IDUwMDEwOworCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlciBmbTsKKworICAgIHByaXZhdGUgU3RyaW5nIGx1Y2VuZUNhdExvYzsKKworICAgIHByaXZhdGUgU3RkSW5nZXN0ZXIgaW5nZXN0ZXIgPSBuZXcgU3RkSW5nZXN0ZXIodHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYW5zZmVyU2VydmljZUZhY0NsYXNzID0gIm9yZy5hcGFjaGUub29kdC5jYXMuIgorICAgICAgICAgICAgKyAiZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTV9VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9RVUVSWV9FTEVNID0gIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTklRVUVfRUxFTSA9ICJDQVMuUHJvZHVjdE5hbWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9FTEVNMiA9ICJDQVMuUHJvZHVjdElkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDX0ZJTEVfVFlQRSA9ICJHZW5lcmljRmlsZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREFURV9SQU5HRV9TVEFSVDsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBEQVRFX1JBTkdFX0VORDsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBjYWNoZWRQcm9kdWN0VHlwZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKAorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIERhdGUgc3RhcnREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgRGF0ZSBlbmREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgZW5kRGF0ZS5zZXRIb3VycyhzdGFydERhdGUuZ2V0SG91cnMoKSArIDEpOworICAgICAgICBEQVRFX1JBTkdFX1NUQVJUID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KHN0YXJ0RGF0ZSk7CisgICAgICAgIERBVEVfUkFOR0VfRU5EID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KGVuZERhdGUpOworICAgICAgICBjYWNoZWRQcm9kdWN0VHlwZXMuYWRkKEdFTkVSSUNfRklMRV9UWVBFKTsKKworICAgIH0KKworICAgIHB1YmxpYyBUZXN0TG9jYWxDYWNoZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3luYygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlLnN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjYWNoZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjYWNoZS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNhY2hlLmNvbnRhaW5zKCJ0ZXN0LnR4dCIpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQ2FjaGUoKXsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlLnN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjYWNoZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjYWNoZS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNhY2hlLmNvbnRhaW5zKCJ0ZXN0LnR4dCIpKTsKKyAgICAgICAgY2FjaGUuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjYWNoZSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjYWNoZS5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjYWNoZS5jb250YWlucygidGVzdC50eHQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNVc2luZ1Byb2R1Y3RJZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlLnN5bmMoVU5JUVVFX0VMRU0yLCBjYWNoZWRQcm9kdWN0VHlwZXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKGNhY2hlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLnNpemUoKSk7CisKKyAgICAgICAgUHJvZHVjdCBwcm9kID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFByb2R1Y3RGcm9tWG1sUnBjKGZtCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0LnR4dCIpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhY2hlLmNvbnRhaW5zKHByb2QuZ2V0UHJvZHVjdElkKCkpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpOworICAgICAgICBkb0luZ2VzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FjaGUgPSBuZXcgTG9jYWxDYWNoZShuZXcgVVJMKEZNX1VSTCksIFVOSVFVRV9FTEVNLAorICAgICAgICAgICAgICAgICAgICBjYWNoZWRQcm9kdWN0VHlwZXMsIFJBTkdFX1FVRVJZX0VMRU0sIERBVEVfUkFOR0VfU1RBUlQsCisgICAgICAgICAgICAgICAgICAgIERBVEVfUkFOR0VfRU5EKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZtLnNodXRkb3duKCk7CisgICAgICAgIGZtID0gbnVsbDsKKworICAgICAgICAvLyBibG93IGF3YXkgbHVjZW5lIGNhdAorICAgICAgICBkZWxldGVBbGxGaWxlcyhsdWNlbmVDYXRMb2MpOworCisgICAgICAgIC8vIGJsb3cgYXdheSB0ZXN0IGZpbGUKKyAgICAgICAgZGVsZXRlQWxsRmlsZXMoIi90bXAvdGVzdC50eHQiKTsKKworICAgICAgICAvLyBSZXNldCB0aGUgU3lzdGVtIHByb3BlcnRpZXMgdG8gaW5pdGlhbCB2YWx1ZXMuCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Jbmdlc3QoKSB7CisgICAgICAgIE1ldGFkYXRhIHByb2RNZXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBVUkwgcmVmVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Iik7CisgICAgICAgICAgICBVUkwgbWV0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Lm1ldCIpOworCisgICAgICAgICAgICBwcm9kTWV0ID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEZpbGUobWV0VXJsLmdldEZpbGUoKSkpKTsKKworICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgcmlnaHQgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICBpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgaW5nZXN0ZXIuaW5nZXN0KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICByZWZVcmwuZ2V0RmlsZSgpKSwgcHJvZE1ldCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgbWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMgaW5nZXN0ZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSk7CisgICAgICAgICAgICBQcm9kdWN0IHAgPSBmbUNsaWVudC5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0LnR4dCIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCwgcC5nZXRUcmFuc2ZlclN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZm1DbGllbnQuaGFzUHJvZHVjdCgidGVzdC50eHQiKSk7CisgICAgICAgICAgICBmbUNsaWVudCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICAgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgICAgIEZpbGVbXSBkZWxGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdG8gbG9hZCBsb2dnaW5nIHByb3BlcnRpZXMgYXMgd2VsbAorCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBVUkwgZmlsZW1nclByb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgcHJvcGVydGllcy5sb2FkKAorICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGVtZ3JQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGNhdGFsb2cgdG8gdXNlOiB3ZSdsbCB1c2UgbHVjZW5lCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBsdWNlbmVDYXRMb2MgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgICAgICAgICAgICArICIvY2F0IjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiZmlsZW1nci5jYXRhbG9nLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aCIsCisgICAgICAgICAgICAgICAgbHVjZW5lQ2F0TG9jKTsKKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHJlcG8gbWdyIHBvbGljeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZtcG9saWN5VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L2ZtcG9saWN5Iik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIsCisgICAgICAgICAgICAgICAgICAgICJmaWxlOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShmbXBvbGljeVVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgdmFsIGxheWVyIG9uZXMKKyAgICAgICAgVVJMIGV4YW1wbGVzQ29yZVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2V4YW1wbGVzL2NvcmUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycyIsCisgICAgICAgICAgICAgICAgImZpbGU6Ly8iCisgICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUoZXhhbXBsZXNDb3JlVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIHNldCB1cCBtaW1lIHJlcG8gcGF0aAorICAgICAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZXNVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZtID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyKEZNX1BPUlQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvVGVzdFJtaUNhY2hlLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1Rlc3RSbWlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNGY3MWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1Rlc3RSbWlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5YbWxScGNTdHJ1Y3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgUm1pQ2FjaGV9IGFuZCB0aGUge0BsaW5rIFJtaUNhY2hlU2VydmVyfQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RSbWlDYWNoZSBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUm1pQ2FjaGUgY2FjaGU7CisKKyAgICBwcml2YXRlIFJtaUNhY2hlU2VydmVyIGNhY2hlU2VydmVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZNX1BPUlQgPSA1MDAxMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSTUlfUE9SVCA9IDUwMDExOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJtaVNlcnZlclVSTiA9ICJybWk6Ly9sb2NhbGhvc3Q6IiArIFJNSV9QT1JUCisgICAgICAgICAgICArICIvUm1pRGF0YWJhc2VTZXJ2ZXIiOworCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlciBmbTsKKworICAgIHByaXZhdGUgU3RyaW5nIGx1Y2VuZUNhdExvYzsKKworICAgIHByaXZhdGUgU3RkSW5nZXN0ZXIgaW5nZXN0ZXIgPSBuZXcgU3RkSW5nZXN0ZXIodHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYW5zZmVyU2VydmljZUZhY0NsYXNzID0gIm9yZy5hcGFjaGUub29kdC5jYXMuIgorICAgICAgICAgICAgKyAiZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTV9VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9RVUVSWV9FTEVNID0gIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTklRVUVfRUxFTSA9ICJDQVMuUHJvZHVjdE5hbWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9FTEVNMiA9ICJDQVMuUHJvZHVjdElkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDX0ZJTEVfVFlQRSA9ICJHZW5lcmljRmlsZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREFURV9SQU5HRV9TVEFSVDsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBEQVRFX1JBTkdFX0VORDsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBjYWNoZWRQcm9kdWN0VHlwZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKAorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIERhdGUgc3RhcnREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgRGF0ZSBlbmREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgZW5kRGF0ZS5zZXRIb3VycyhzdGFydERhdGUuZ2V0SG91cnMoKSArIDEpOworICAgICAgICBEQVRFX1JBTkdFX1NUQVJUID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KHN0YXJ0RGF0ZSk7CisgICAgICAgIERBVEVfUkFOR0VfRU5EID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KGVuZERhdGUpOworICAgICAgICBjYWNoZWRQcm9kdWN0VHlwZXMuYWRkKEdFTkVSSUNfRklMRV9UWVBFKTsKKworICAgIH0KKworICAgIHB1YmxpYyBUZXN0Um1pQ2FjaGUoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN5bmMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWNoZS5zeW5jKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoY2FjaGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2FjaGUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWNoZS5jb250YWlucygidGVzdC50eHQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQ2FjaGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWNoZS5zeW5jKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoY2FjaGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2FjaGUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWNoZS5jb250YWlucygidGVzdC50eHQiKSk7CisgICAgICAgIGNhY2hlLmNsZWFyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2FjaGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY2FjaGUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FjaGUuY29udGFpbnMoInRlc3QudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jVXNpbmdQcm9kdWN0SWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWNoZS5zeW5jKFVOSVFVRV9FTEVNMiwgY2FjaGVkUHJvZHVjdFR5cGVzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjYWNoZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjYWNoZS5zaXplKCkpOworCisgICAgICAgIFByb2R1Y3QgcHJvZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhmbQorICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdEJ5TmFtZSgidGVzdC50eHQiKSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWNoZS5jb250YWlucyhwcm9kLmdldFByb2R1Y3RJZCgpKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0WG1sUnBjRmlsZU1hbmFnZXIoKTsKKyAgICAgICAgZG9Jbmdlc3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlU2VydmVyID0gbmV3IFJtaUNhY2hlU2VydmVyKG5ldyBVUkwoRk1fVVJMKSwgUkFOR0VfUVVFUllfRUxFTSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9SQU5HRV9TVEFSVCwgREFURV9SQU5HRV9FTkQsIFVOSVFVRV9FTEVNLAorICAgICAgICAgICAgICAgICAgICBjYWNoZWRQcm9kdWN0VHlwZXMpOworICAgICAgICAgICAgY2FjaGVTZXJ2ZXIubGF1bmNoU2VydmVyKG5ldyBVUkwoRk1fVVJMKSwgUk1JX1BPUlQpOworICAgICAgICAgICAgY2FjaGUgPSBuZXcgUm1pQ2FjaGUocm1pU2VydmVyVVJOKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJFcnJvciBwZXJmb3JtaW5nIHRlc3Qgc2V0dXA6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm0uc2h1dGRvd24oKTsKKyAgICAgICAgZm0gPSBudWxsOworCisgICAgICAgIC8vIGJsb3cgYXdheSBsdWNlbmUgY2F0CisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKGx1Y2VuZUNhdExvYyk7CisKKyAgICAgICAgLy8gYmxvdyBhd2F5IHRlc3QgZmlsZQorICAgICAgICBkZWxldGVBbGxGaWxlcygiL3RtcC90ZXN0LnR4dCIpOworCisgICAgICAgIC8vIGNsZWFuIHVwIFJNSQorICAgICAgICBjYWNoZVNlcnZlci5zdG9wU2VydmVyKFJNSV9QT1JUKTsKKyAgICAgICAgY2FjaGVTZXJ2ZXIgPSBudWxsOworCisgICAgICAgIGNhY2hlID0gbnVsbDsKKworICAgICAgICAvLyBSZXNldCB0aGUgU3lzdGVtIHByb3BlcnRpZXMgdG8gaW5pdGlhbCB2YWx1ZXMuCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Jbmdlc3QoKSB7CisgICAgICAgIE1ldGFkYXRhIHByb2RNZXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBVUkwgcmVmVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Iik7CisgICAgICAgICAgICBVUkwgbWV0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QudHh0Lm1ldCIpOworCisgICAgICAgICAgICBwcm9kTWV0ID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEZpbGUobWV0VXJsLmdldEZpbGUoKSkpKTsKKworICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgcmlnaHQgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICBpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgaW5nZXN0ZXIuaW5nZXN0KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICByZWZVcmwuZ2V0RmlsZSgpKSwgcHJvZE1ldCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgbWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMgaW5nZXN0ZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSk7CisgICAgICAgICAgICBQcm9kdWN0IHAgPSBmbUNsaWVudC5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0LnR4dCIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCwgcC5nZXRUcmFuc2ZlclN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZm1DbGllbnQuaGFzUHJvZHVjdCgidGVzdC50eHQiKSk7CisgICAgICAgICAgICBmbUNsaWVudCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICAgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgICAgIEZpbGVbXSBkZWxGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdG8gbG9hZCBsb2dnaW5nIHByb3BlcnRpZXMgYXMgd2VsbAorCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBVUkwgZmlsZW1nclByb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgcHJvcGVydGllcy5sb2FkKAorICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGVtZ3JQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGNhdGFsb2cgdG8gdXNlOiB3ZSdsbCB1c2UgbHVjZW5lCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBsdWNlbmVDYXRMb2MgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgICAgICAgICAgICArICIvY2F0IjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiZmlsZW1nci5jYXRhbG9nLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aCIsCisgICAgICAgICAgICAgICAgbHVjZW5lQ2F0TG9jKTsKKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHJlcG8gbWdyIHBvbGljeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZtcG9saWN5VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L2ZtcG9saWN5Iik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIsCisgICAgICAgICAgICAgICAgICAgICJmaWxlOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShmbXBvbGljeVVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgdmFsIGxheWVyIG9uZXMKKyAgICAgICAgVVJMIGV4YW1wbGVzQ29yZVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2V4YW1wbGVzL2NvcmUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycyIsCisgICAgICAgICAgICAgICAgImZpbGU6Ly8iCisgICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUoZXhhbXBsZXNDb3JlVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIHNldCB1cCBtaW1lIHJlcG8gcGF0aAorICAgICAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZXNVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZtID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyKEZNX1BPUlQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9pbmdlc3QvVGVzdFN0ZEluZ2VzdGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1Rlc3RTdGRJbmdlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjRjZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvaW5nZXN0L1Rlc3RTdGRJbmdlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3Q7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLlNlcmlhbGl6YWJsZU1ldGFkYXRhOworCisvLyBKbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RTdGRJbmdlc3RlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTV9QT1JUID0gNTAwMTA7CisKKyAgICBwcml2YXRlIFhtbFJwY0ZpbGVNYW5hZ2VyIGZtOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbHVjZW5lQ2F0TG9jOworCisgICAgcHJpdmF0ZSBTdGRJbmdlc3RlciBpbmdlc3RlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmFuc2ZlclNlcnZpY2VGYWNDbGFzcyA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLiIKKyAgICAgICAgICAgICsgImZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSI7CisKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICBwdWJsaWMgVGVzdFN0ZEluZ2VzdGVyKCkgeworICAgICAgICBpbmdlc3RlciA9IG5ldyBTdGRJbmdlc3Rlcih0cmFuc2ZlclNlcnZpY2VGYWNDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluZ2VzdCgpIHsKKyAgICAgICAgTWV0YWRhdGEgcHJvZE1ldCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBpbmdlc3RVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QiKTsKKyAgICAgICAgICAgIFVSTCByZWZVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvdGVzdC50eHQiKTsKKyAgICAgICAgICAgIFVSTCBtZXRVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvdGVzdC50eHQubWV0Iik7CisKKyAgICAgICAgICAgIHByb2RNZXQgPSBuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEobmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShtZXRVcmwuZ2V0RmlsZSgpKSkpOworCisgICAgICAgICAgICAvLyBub3cgYWRkIHRoZSByaWdodCBmaWxlIGxvY2F0aW9uCisgICAgICAgICAgICBwcm9kTWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sIG5ldyBGaWxlKAorICAgICAgICAgICAgICAgIGluZ2VzdFVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgICAgICBpbmdlc3Rlci5pbmdlc3QobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVCksIG5ldyBGaWxlKAorICAgICAgICAgICAgICAgIHJlZlVybC5nZXRGaWxlKCkpLCBwcm9kTWV0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBub3cgbWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMgaW5nZXN0ZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IitGTV9QT1JUKSk7CisgICAgICAgICAgICBQcm9kdWN0IHAgPSBmbUNsaWVudC5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0LnR4dCIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCwgcC5nZXRUcmFuc2ZlclN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZm1DbGllbnQuaGFzUHJvZHVjdCgidGVzdC50eHQiKSk7CisgICAgICAgICAgICBmbUNsaWVudCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0WG1sUnBjRmlsZU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm0uc2h1dGRvd24oKTsKKyAgICAgICAgZm0gPSBudWxsOworCisgICAgICAgIC8vIGJsb3cgYXdheSBsdWNlbmUgY2F0CisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKGx1Y2VuZUNhdExvYyk7CisKKyAgICAgICAgLy8gYmxvdyBhd2F5IHRlc3QgZmlsZQorICAgICAgICBkZWxldGVBbGxGaWxlcygiL3RtcC90ZXN0LnR4dCIpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBTeXN0ZW0gcHJvcGVydGllcyB0byBpbml0aWFsIHZhbHVlcy4KKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoaW5pdGlhbFByb3BlcnRpZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICAgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgICAgIEZpbGVbXSBkZWxGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdG8gbG9hZCBsb2dnaW5nIHByb3BlcnRpZXMgYXMgd2VsbAorCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBVUkwgZmlsZW1nclByb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgcHJvcGVydGllcy5sb2FkKAorICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGVtZ3JQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGNhdGFsb2cgdG8gdXNlOiB3ZSdsbCB1c2UgbHVjZW5lCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBsdWNlbmVDYXRMb2MgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgICAgICAgICAgICArICIvY2F0IjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiZmlsZW1nci5jYXRhbG9nLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aCIsCisgICAgICAgICAgICAgICAgbHVjZW5lQ2F0TG9jKTsKKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHJlcG8gbWdyIHBvbGljeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZtcG9saWN5VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L2ZtcG9saWN5Iik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIsCisgICAgICAgICAgICAgICAgICAgICJmaWxlOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShmbXBvbGljeVVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgdmFsIGxheWVyIG9uZXMKKyAgICAgICAgVVJMIGV4YW1wbGVzQ29yZVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2V4YW1wbGVzL2NvcmUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycyIsCisgICAgICAgICAgICAgICAgImZpbGU6Ly8iCisgICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUoZXhhbXBsZXNDb3JlVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIHNldCB1cCBtaW1lIHJlcG8gcGF0aAorICAgICAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZXNVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZtID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyKEZNX1BPUlQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RBYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RBYnN0cmFjdEZpbGVtZ3JNZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFlMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdEFic3RyYWN0RmlsZW1nck1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIEBzaW5jZSBPT0RULTI1NgorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yIGFic0V4dHJhY3RvcjsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG1wRGlyTmFtZSA9ICJmb29hYnNUZXN0IjsKKworICAgIHN0YXRpYyBTdHJpbmcgdG1wRGlyRnVsbFBhdGg7CisKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG1wRGlyRnVsbFBhdGggPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJmb28iLCAiYmFyMSIpLmdldFBhcmVudCgpOworICAgICAgICAgICAgdG1wRGlyRnVsbFBhdGggPSAhdG1wRGlyRnVsbFBhdGguZW5kc1dpdGgoIi8iKSA/IHRtcERpckZ1bGxQYXRoICs9ICIvIgorICAgICAgICAgICAgICAgICAgICA6IHRtcERpckZ1bGxQYXRoOworICAgICAgICAgICAgdG1wRGlyRnVsbFBhdGggKz0gdG1wRGlyTmFtZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgdGVtcCBkaXIKKyAgICAgICAgbmV3IEZpbGUodG1wRGlyRnVsbFBhdGgpLm1rZGlycygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRlbGV0ZSB0bXAgZGlyCisgICAgICAgIG5ldyBGaWxlKHRtcERpckZ1bGxQYXRoKS5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvZEZpbGVIaWVyYXJjaGljYWxQcm9kKCkgeworICAgICAgICBhYnNFeHRyYWN0b3IgPSBuZXcgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNZXRhZGF0YSBkb0V4dHJhY3QoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZG9Db25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICAgICAgUHJvZHVjdCBwcm9kID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoImZvb3Rlc3QiLAorICAgICAgICAgICAgICAgICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgICBTdHJpbmcgcmVmVXJpID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZlVyaSA9IG5ldyBGaWxlKHRtcERpckZ1bGxQYXRoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICBwcm9kLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKTsKKyAgICAgICAgICAgIHByb2QuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRtcERpckZ1bGxQYXRoKS5nZXRQYXJlbnRGaWxlKCkudG9VUkwoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvZC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChuZXcgUmVmZXJlbmNlKHJlZlVyaSwgcmVmVXJpLCAwTCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIHByb2RGaWxlID0gYWJzRXh0cmFjdG9yLmdldFByb2R1Y3RGaWxlKHByb2QpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9kRmlsZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHByb2RGaWxlLmlzRGlyZWN0b3J5KCkpOworICAgICAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0Q29yZU1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdENvcmVNZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJlYTdhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdENvcmVNZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBzdWl0ZSBmb3IgdGhlIHtAbGluayBDb3JlTWV0RXh0cmFjdG9yfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29yZU1ldEV4dHJhY3RvciBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgQ29yZU1ldEtleXMgeworCisgICAgcHJpdmF0ZSBDb3JlTWV0RXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBDb3JlTWV0RXh0cmFjdG9yKCk7CisgICAgCisgICAgcHVibGljIFRlc3RDb3JlTWV0RXh0cmFjdG9yKCl7CisgICAgICAgIFByb3BlcnRpZXMgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY29uZmlnLnNldFByb3BlcnR5KCJuc0F3YXJlIiwgU3RyaW5nLnZhbHVlT2YoZmFsc2UpKTsKKyAgICAgICAgY29uZmlnLnNldFByb3BlcnR5KCJlbGVtZW50TnMiLCAiQ0FTIik7CisgICAgICAgIGV4dHJhY3Rvci5jb25maWd1cmUoY29uZmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdCgpIHsKKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IG5ldyBSZWZlcmVuY2UoKTsKKyAgICAgICAgcmVmLnNldE9yaWdSZWZlcmVuY2UoImZpbGU6L2Zvby9iYXIvZmlsZS5leHQiKTsKKyAgICAgICAgcmVmLnNldERhdGFTdG9yZVJlZmVyZW5jZSgiZmlsZTovZm9vL2Jhci9maW5hbC9maWxlLmV4dCIpOworCisgICAgICAgIExpc3QgcmVmcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgcmVmcy5hZGQocmVmKTsKKworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZCgiMSIpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3ROYW1lKCJmb28iKTsKKyAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhyZWZzKTsKKyAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworICAgICAgICBwcm9kdWN0LnNldFJvb3RSZWYocmVmKTsKKworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICAgIHR5cGUuc2V0TmFtZSgiRm9vVHlwZSIpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHR5cGUpOworCisgICAgICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0ID0gZXh0cmFjdG9yLmRvRXh0cmFjdChwcm9kdWN0LCBtZXQpOworICAgICAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXQpOworICAgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShGSUxFTkFNRSkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShGSUxFX0xPQ0FUSU9OKSk7CisgICAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFBST0RVQ1RfVFlQRSkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQUk9EVUNUX1NUUlVDVFVSRSkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQUk9EVUNUX0lEKSk7CisgICAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFBST0RVQ1RfTkFNRSkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQUk9EVUNUX1JFQ0VWSUVEX1RJTUUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobWV0LmdldE1ldGFkYXRhKEZJTEVOQU1FKSwgImZpbGUuZXh0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoRklMRV9MT0NBVElPTiksICIvZm9vL2JhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMobWV0LmdldE1ldGFkYXRhKFBST0RVQ1RfVFlQRSksICJGb29UeXBlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoUFJPRFVDVF9TVFJVQ1RVUkUpLCBQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldC5nZXRNZXRhZGF0YShQUk9EVUNUX0lEKSwgIjEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldC5nZXRNZXRhZGF0YShQUk9EVUNUX05BTUUpLCAiZm9vIik7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3REaXJlY3RvcnlQcm9kdWN0KCl7CisgICAgICBQcm9kdWN0IHAgPSBQcm9kdWN0LmdldERlZmF1bHRGbGF0UHJvZHVjdCgidGVzdCIsICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgcC5zZXRQcm9kdWN0SWQoIjEiKTsKKyAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUwpOworICAgICAgcC5zZXRQcm9kdWN0TmFtZSgic29tZWRpciIpOworICAgICAgcC5nZXRQcm9kdWN0VHlwZSgpLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgiZmlsZTovLy9hcmNoaXZlL2RpcnMiKTsKKyAgICAgIHAuZ2V0UHJvZHVjdFR5cGUoKS5zZXROYW1lKCJHZW5lcmljRmlsZSIpOworICAgICAgcC5nZXRQcm9kdWN0VHlwZSgpLnNldFZlcnNpb25lcigKKyAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuRGlyZWN0b3J5UHJvZHVjdFZlcnNpb25lciIpOworICAgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpCisgICAgICAgICAgLmFkZChuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC9zb21lZGlyIiwgbnVsbCwgNEwpKTsKKyAgICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQoCisgICAgICAgICAgbmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvc29tZWRpci9maWxlMS50eHQiLCBudWxsLCA4TCkpOworICAgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZCgKKyAgICAgICAgICBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC9zb21lZGlyL2ZpbGUyLnR4dCIsIG51bGwsIDhMKSk7CisKKyAgICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgICBtZXQgPSBleHRyYWN0b3IuZG9FeHRyYWN0KHAsIG1ldCk7CisgICAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKworICAgICAgYXNzZXJ0Tm90TnVsbChtZXQpOworICAgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoRklMRU5BTUUpKTsKKyAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KEZJTEVfTE9DQVRJT04pKTsKKyAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFBST0RVQ1RfVFlQRSkpOworICAgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUFJPRFVDVF9TVFJVQ1RVUkUpKTsKKyAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFBST0RVQ1RfSUQpKTsKKyAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFBST0RVQ1RfTkFNRSkpOworICAgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUFJPRFVDVF9SRUNFVklFRF9USU1FKSk7CisKKyAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoRklMRU5BTUUpLCAic29tZWRpciIpOworICAgICAgYXNzZXJ0RXF1YWxzKG1ldC5nZXRNZXRhZGF0YShGSUxFX0xPQ0FUSU9OKSwgIi90bXAiKTsKKyAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoUFJPRFVDVF9UWVBFKSwgIkdlbmVyaWNGaWxlIik7CisgICAgICBhc3NlcnRFcXVhbHMobWV0LmdldE1ldGFkYXRhKFBST0RVQ1RfU1RSVUNUVVJFKSwgUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKTsKKyAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoUFJPRFVDVF9JRCksICIxIik7CisgICAgICBhc3NlcnRFcXVhbHMobWV0LmdldE1ldGFkYXRhKFBST0RVQ1RfTkFNRSksICJzb21lZGlyIik7CisgICAgICAKKyAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL1Rlc3REYXRlVGltZUV4cGFuZE1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGVzdERhdGVUaW1lRXhwYW5kTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1NjlhYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL1Rlc3REYXRlVGltZUV4cGFuZE1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXM7CisKKy8vIEpVbml0IHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKKy8vIEpESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vIE9PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8vIEpVbml0IGltcG9ydHMKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCisvLyBNb2NraXRvIGltcG9ydHMKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgRGF0ZVRpbWVFeHBhbmRNZXRFeHRyYWN0b3J9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXJAYXBhY2hlLm9yZyAoQnJpYW4gRm9zdGVyKQorICovCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgVGVzdERhdGVUaW1lRXhwYW5kTWV0RXh0cmFjdG9yIHsKKworICBAUnVsZSBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gZXhwZWN0ZWRFeGNlcHRpb24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgQE1vY2sgcHJpdmF0ZSBQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb247CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgcHJpdmF0ZSBEYXRlVGltZUV4cGFuZE1ldEV4dHJhY3RvciBleHRyYWN0b3I7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCisgICAgd2hlbihjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJGdWxsRGF0ZVRpbWVLZXkiKSkudGhlblJldHVybigiU3RhcnREYXRlVGltZSIpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgiRnVsbERhdGVUaW1lRm9ybWF0IikpLnRoZW5SZXR1cm4oInl5eXktTU0tZGQgSEg6bW06c3MiKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoIlllYXJLZXkiKSkudGhlblJldHVybigiU3RhcnRZZWFyIik7CisgICAgd2hlbihjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJNb250aEtleSIpKS50aGVuUmV0dXJuKCJTdGFydE1vbnRoIik7CisgICAgd2hlbihjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJEYXlLZXkiKSkudGhlblJldHVybigiU3RhcnREYXkiKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoIkhvdXJLZXkiKSkudGhlblJldHVybigiU3RhcnRIb3VyIik7CisgICAgd2hlbihjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJNaW51dGVLZXkiKSkudGhlblJldHVybigiU3RhcnRNaW51dGUiKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoIlNlY29uZEtleSIpKS50aGVuUmV0dXJuKCJTdGFydFNlY29uZCIpOworCisgICAgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgiU3RhcnREYXRlVGltZSIsICIyMDEzLTA1LTIzIDAzOjAyOjAxIik7CisKKyAgICBleHRyYWN0b3IgPSBuZXcgRGF0ZVRpbWVFeHBhbmRNZXRFeHRyYWN0b3IoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRBbGwoKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgd2hlbihjb25maWd1cmF0aW9uLmNvbnRhaW5zS2V5KCJGdWxsRGF0ZVRpbWVLZXkiKSkudGhlblJldHVybih0cnVlKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoIkZ1bGxEYXRlVGltZUZvcm1hdCIpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5jb250YWluc0tleSgiWWVhcktleSIpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5jb250YWluc0tleSgiTW9udGhLZXkiKSkudGhlblJldHVybih0cnVlKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoIkRheUtleSIpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5jb250YWluc0tleSgiSG91cktleSIpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5jb250YWluc0tleSgiTWludXRlS2V5IikpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgd2hlbihjb25maWd1cmF0aW9uLmNvbnRhaW5zS2V5KCJTZWNvbmRLZXkiKSkudGhlblJldHVybih0cnVlKTsKKworICAgIGV4dHJhY3Rvci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7CisgICAgTWV0YWRhdGEgZXh0cmFjdGVkTWV0YWRhdGEgPSBleHRyYWN0b3IuZG9FeHRyYWN0KG51bGwsIG1ldGFkYXRhKTsKKworICAgIGFzc2VydFRoYXQoZXh0cmFjdGVkTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIlN0YXJ0WWVhciIpLCBpcygiMjAxMyIpKTsKKyAgICBhc3NlcnRUaGF0KGV4dHJhY3RlZE1ldGFkYXRhLmdldE1ldGFkYXRhKCJTdGFydE1vbnRoIiksIGlzKCIwNSIpKTsKKyAgICBhc3NlcnRUaGF0KGV4dHJhY3RlZE1ldGFkYXRhLmdldE1ldGFkYXRhKCJTdGFydERheSIpLCBpcygiMjMiKSk7CisgICAgYXNzZXJ0VGhhdChleHRyYWN0ZWRNZXRhZGF0YS5nZXRNZXRhZGF0YSgiU3RhcnRIb3VyIiksIGlzKCIwMyIpKTsKKyAgICBhc3NlcnRUaGF0KGV4dHJhY3RlZE1ldGFkYXRhLmdldE1ldGFkYXRhKCJTdGFydE1pbnV0ZSIpLCBpcygiMDIiKSk7CisgICAgYXNzZXJ0VGhhdChleHRyYWN0ZWRNZXRhZGF0YS5nZXRNZXRhZGF0YSgiU3RhcnRTZWNvbmQiKSwgaXMoIjAxIikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEV4cGFuZFNvbWUoKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgd2hlbihjb25maWd1cmF0aW9uLmNvbnRhaW5zS2V5KCJGdWxsRGF0ZVRpbWVLZXkiKSkudGhlblJldHVybih0cnVlKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoIkZ1bGxEYXRlVGltZUZvcm1hdCIpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5jb250YWluc0tleSgiWWVhcktleSIpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4oY29uZmlndXJhdGlvbi5jb250YWluc0tleSgiTW9udGhLZXkiKSkudGhlblJldHVybih0cnVlKTsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoIkRheUtleSIpKS50aGVuUmV0dXJuKHRydWUpOworCisgICAgZXh0cmFjdG9yLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKKyAgICBNZXRhZGF0YSBleHRyYWN0ZWRNZXRhZGF0YSA9IGV4dHJhY3Rvci5kb0V4dHJhY3QobnVsbCwgbWV0YWRhdGEpOworCisgICAgYXNzZXJ0VGhhdChleHRyYWN0ZWRNZXRhZGF0YS5nZXRNZXRhZGF0YSgiU3RhcnRZZWFyIiksIGlzKCIyMDEzIikpOworICAgIGFzc2VydFRoYXQoZXh0cmFjdGVkTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIlN0YXJ0TW9udGgiKSwgaXMoIjA1IikpOworICAgIGFzc2VydFRoYXQoZXh0cmFjdGVkTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIlN0YXJ0RGF5IiksIGlzKCIyMyIpKTsKKyAgICBhc3NlcnRUaGF0KGV4dHJhY3RlZE1ldGFkYXRhLmNvbnRhaW5zS2V5KCJTdGFydEhvdXIiKSwgaXMoZmFsc2UpKTsKKyAgICBhc3NlcnRUaGF0KGV4dHJhY3RlZE1ldGFkYXRhLmNvbnRhaW5zS2V5KCJTdGFydE1pbnV0ZSIpLCBpcyhmYWxzZSkpOworICAgIGFzc2VydFRoYXQoZXh0cmFjdGVkTWV0YWRhdGEuY29udGFpbnNLZXkoIlN0YXJ0U2Vjb25kIiksIGlzKGZhbHNlKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZSgpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICB3aGVuKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoIkZ1bGxEYXRlVGltZUtleSIpKS50aGVuUmV0dXJuKGZhbHNlKTsKKworICAgIGV4dHJhY3Rvci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7CisgICAgZXhwZWN0ZWRFeGNlcHRpb24uZXhwZWN0KE1ldEV4dHJhY3Rpb25FeGNlcHRpb24uY2xhc3MpOworICAgIGV4dHJhY3Rvci5kb0V4dHJhY3QobnVsbCwgbWV0YWRhdGEpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9UZXN0RmlsZW5hbWVSZWdleE1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGVzdEZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdiODFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGVzdEZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLkZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbmNodW5nCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBzdWl0ZSBmb3IgdGhlIHtAbGluayBGaWxlbmFtZVJlZ2V4TWV0RXh0cmFjdG9yfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RmlsZW5hbWVSZWdleE1ldEV4dHJhY3RvciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3QoKSB7CisgICAgICBQcm9wZXJ0aWVzIGNvbmZpZyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICBjb25maWcuc2V0UHJvcGVydHkoImZpbGVuYW1lUGF0dGVybiIsICIoXFx3KilfKFxcZCopXFwudHh0Iik7CisgICAgICBjb25maWcuc2V0UHJvcGVydHkoIm1ldGFkYXRhS2V5cyIsICJOYW1lLElEIik7CisgICAgICBGaWxlbmFtZVJlZ2V4TWV0RXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBGaWxlbmFtZVJlZ2V4TWV0RXh0cmFjdG9yKCk7CisgICAgICBleHRyYWN0b3IuY29uZmlndXJlKGNvbmZpZyk7CisKKyAgICAgIFJlZmVyZW5jZSByZWYgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgICByZWYuc2V0T3JpZ1JlZmVyZW5jZSgiZmlsZTovZm9vL2Jhci9mb29iYXJfMDAxLnR4dCIpOworICAgICAgcmVmLnNldERhdGFTdG9yZVJlZmVyZW5jZSgiZmlsZTovZm9vL2Jhci9maW5hbC9mb29iYXJfMDAxLnR4dCIpOworCisgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyZWYpOworICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworCisgICAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBtZXQgPSBleHRyYWN0b3IuZG9FeHRyYWN0KHByb2R1Y3QsIG1ldCk7CisgICAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorCisgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleSgiTmFtZSIpKTsKKyAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KCJJRCIpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBtZXQuZ2V0TWV0YWRhdGEoIk5hbWUiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIjAwMSIsIG1ldC5nZXRNZXRhZGF0YSgiSUQiKSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9UZXN0RmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL1Rlc3RGaW5hbEZpbGVMb2NhdGlvbkV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Nzc5MTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9UZXN0RmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3J9LgorICogCisgKiBAc2luY2UgT09EVC03MgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3QoKSB7CisgICAgU3RyaW5nIGV4cGVjdGVkRmluYWxMb2NhdGlvbiA9ICIvYXJjaGl2ZS9zb21lZmlsZS50eHQiOworICAgIFByb2R1Y3QgcCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwgInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgcC5zZXRQcm9kdWN0TmFtZSgic29tZWZpbGUudHh0Iik7CisgICAgcC5nZXRQcm9kdWN0VHlwZSgpLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgiZmlsZTovLy9hcmNoaXZlIik7CisgICAgcC5nZXRQcm9kdWN0VHlwZSgpLnNldFZlcnNpb25lcigKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIik7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZCgKKyAgICAgICAgbmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvc29tZWZpbGUudHh0IiwgbnVsbCwgMEwpKTsKKyAgICBQcm9wZXJ0aWVzIGNvbmZpZyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgY29uZmlnLnNldFByb3BlcnR5KCJyZXBsYWNlIiwgImZhbHNlIik7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sICIvdG1wIik7CisgICAgRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEZpbmFsRmlsZUxvY2F0aW9uRXh0cmFjdG9yKCk7CisgICAgZXh0cmFjdG9yLmNvbmZpZ3VyZShjb25maWcpOworICAgIE1ldGFkYXRhIGV4dHJhY3RNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKworICAgIHRyeSB7CisgICAgICBleHRyYWN0TWV0ID0gZXh0cmFjdG9yLmRvRXh0cmFjdChwLCBtZXQpOworICAgIH0gY2F0Y2ggKE1ldEV4dHJhY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0TWV0KTsKKyAgICBhc3NlcnRUcnVlKGV4dHJhY3RNZXQuY29udGFpbnNLZXkoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikpOworICAgIGFzc2VydEVxdWFscygyLCBleHRyYWN0TWV0LmdldEFsbE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvdG1wIiwgZXh0cmFjdE1ldC5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJleHBlY3RlZCBmaW5hbCBsb2NhdGlvbjogWyIgKyBleHBlY3RlZEZpbmFsTG9jYXRpb24KKyAgICAgICAgKyAiXSBpcyBub3QgZXF1YWwgdG8gZ2VuZXJhdGVkIGxvY2F0aW9uOiBbIgorICAgICAgICArIGV4dHJhY3RNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuZ2V0KDEpICsgIl0iLAorICAgICAgICBleHBlY3RlZEZpbmFsTG9jYXRpb24sCisgICAgICAgIGV4dHJhY3RNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuZ2V0KDEpKTsKKworICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBkYXRhIHN0b3JlIHJlZiBpcyBibGFuaworICAgIGFzc2VydEVxdWFscygiIiwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisKKyAgICAvLyByZWNvbmZpZ3VyZSB0byByZXBsYWNlCisgICAgY29uZmlnLnNldFByb3BlcnR5KCJyZXBsYWNlIiwgInRydWUiKTsKKyAgICBleHRyYWN0b3IuY29uZmlndXJlKGNvbmZpZyk7CisKKyAgICB0cnkgeworICAgICAgZXh0cmFjdE1ldCA9IGV4dHJhY3Rvci5kb0V4dHJhY3QocCwgbWV0KTsKKyAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdE1ldCk7CisgICAgYXNzZXJ0VHJ1ZShleHRyYWN0TWV0LmNvbnRhaW5zS2V5KENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdE1ldC5nZXRBbGxNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbmFsTG9jYXRpb24sCisgICAgICAgIGV4dHJhY3RNZXQuZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikpOworCisgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgc3RvcmUgcmVmIGlzIGJsYW5rCisgICAgYXNzZXJ0RXF1YWxzKCIiLCBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKworICB9CisKKyAgLyoqCisgICAqIEBzaW5jZSBPT0RULTIwMAorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RIaWVyYXJjaGljYWwoKSB7CisgICAgU3RyaW5nIGV4cGVjdGVkRmluYWxMb2NhdGlvbiA9ICIvYXJjaGl2ZS9kaXJzIjsKKyAgICBQcm9kdWN0IHAgPSBQcm9kdWN0LmdldERlZmF1bHRGbGF0UHJvZHVjdCgidGVzdCIsICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9ISUVSQVJDSElDQUwpOworICAgIHAuc2V0UHJvZHVjdE5hbWUoInNvbWVkaXIiKTsKKyAgICBwLmdldFByb2R1Y3RUeXBlKCkuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi8vL2FyY2hpdmUvZGlycyIpOworICAgIHAuZ2V0UHJvZHVjdFR5cGUoKS5zZXRWZXJzaW9uZXIoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5EaXJlY3RvcnlQcm9kdWN0VmVyc2lvbmVyIik7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpCisgICAgICAgIC5hZGQobmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvc29tZWRpciIsIG51bGwsIDRMKSk7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZCgKKyAgICAgICAgbmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvc29tZWRpci9maWxlMS50eHQiLCBudWxsLCA4TCkpOworICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQoCisgICAgICAgIG5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vdG1wL3NvbWVkaXIvZmlsZTIudHh0IiwgbnVsbCwgOEwpKTsKKyAgICBQcm9wZXJ0aWVzIGNvbmZpZyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgY29uZmlnLnNldFByb3BlcnR5KCJyZXBsYWNlIiwgImZhbHNlIik7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sICIvdG1wIik7CisgICAgRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEZpbmFsRmlsZUxvY2F0aW9uRXh0cmFjdG9yKCk7CisgICAgZXh0cmFjdG9yLmNvbmZpZ3VyZShjb25maWcpOworICAgIE1ldGFkYXRhIGV4dHJhY3RNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKworICAgIHRyeSB7CisgICAgICBleHRyYWN0TWV0ID0gZXh0cmFjdG9yLmRvRXh0cmFjdChwLCBtZXQpOworICAgIH0gY2F0Y2ggKE1ldEV4dHJhY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0TWV0KTsKKyAgICBhc3NlcnRUcnVlKGV4dHJhY3RNZXQuY29udGFpbnNLZXkoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikpOworICAgIGFzc2VydEVxdWFscygyLCBleHRyYWN0TWV0LmdldEFsbE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvdG1wIiwgZXh0cmFjdE1ldC5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJleHBlY3RlZCBmaW5hbCBsb2NhdGlvbjogWyIgKyBleHBlY3RlZEZpbmFsTG9jYXRpb24KKyAgICAgICAgKyAiXSBpcyBub3QgZXF1YWwgdG8gZ2VuZXJhdGVkIGxvY2F0aW9uOiBbIgorICAgICAgICArIGV4dHJhY3RNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuZ2V0KDEpICsgIl0iLAorICAgICAgICBleHBlY3RlZEZpbmFsTG9jYXRpb24sCisgICAgICAgIGV4dHJhY3RNZXQuZ2V0QWxsTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikuZ2V0KDEpKTsKKworICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBkYXRhIHN0b3JlIHJlZiBpcyBibGFuaworICAgIGFzc2VydEVxdWFscygiIiwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisKKyAgICAvLyByZWNvbmZpZ3VyZSB0byByZXBsYWNlCisgICAgY29uZmlnLnNldFByb3BlcnR5KCJyZXBsYWNlIiwgInRydWUiKTsKKyAgICBleHRyYWN0b3IuY29uZmlndXJlKGNvbmZpZyk7CisKKyAgICB0cnkgeworICAgICAgZXh0cmFjdE1ldCA9IGV4dHJhY3Rvci5kb0V4dHJhY3QocCwgbWV0KTsKKyAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdE1ldCk7CisgICAgYXNzZXJ0VHJ1ZShleHRyYWN0TWV0LmNvbnRhaW5zS2V5KENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04pKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdE1ldC5nZXRBbGxNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbmFsTG9jYXRpb24sCisgICAgICAgIGV4dHJhY3RNZXQuZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTikpOworCisgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgc3RvcmUgcmVmIGlzIGJsYW5rCisgICAgYXNzZXJ0RXF1YWxzKCIiLCBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL1Rlc3RNaW1lVHlwZUV4dHJhY3Rvci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGVzdE1pbWVUeXBlRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0ZWY5MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9tZXRhZGF0YS9leHRyYWN0b3JzL2V4YW1wbGVzL1Rlc3RNaW1lVHlwZUV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlczsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIFRlc3QgaGFybmVzcyBmb3IgdGhlIHtAbGluayBNaW1lVHlwZUV4dHJhY3Rvcn0uCisgKiAKKyAqIEBzaW5jZSBPT0RULTU4CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RNaW1lVHlwZUV4dHJhY3RvciBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgQ29yZU1ldEtleXMgeworCisgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL21pbWUtdHlwZXMueG1sIik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgIH0KKworICAvKioKKyAgICogQHNpbmNlIE9PRFQtNTgKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0KCkgeworICAgIE1pbWVUeXBlRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBNaW1lVHlwZUV4dHJhY3RvcigpOworICAgIFByb2R1Y3QgcCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwgInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC90ZXN0LmhlNSIsCisgICAgICAgICJmaWxlOi8vL2FyY2hpdmUvdGVzdC5oZTUvdGVzdC5oZTUiLCAwTCk7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyKTsKKyAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICB0cnkgeworICAgICAgbWV0ID0gZXh0cmFjdG9yLmRvRXh0cmFjdChwLCBtZXQpOworICAgIH0gY2F0Y2ggKE1ldEV4dHJhY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0Tm90TnVsbChtZXQpOworICAgIGFzc2VydE5vdE51bGwobWV0LmdldEFsbE1ldGFkYXRhKE1JTUVfVFlQRSkpOworICAgIGFzc2VydEVxdWFscygzLCBtZXQuZ2V0QWxsTWV0YWRhdGEoTUlNRV9UWVBFKS5zaXplKCkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXQuZ2V0QWxsTWV0YWRhdGEoTUlNRV9UWVBFKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi94LWhkZiIsIG1ldC5nZXRBbGxNZXRhZGF0YShNSU1FX1RZUEUpLmdldCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG1ldC5nZXRBbGxNZXRhZGF0YShNSU1FX1RZUEUpLmdldCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ4LWhkZiIsIG1ldC5nZXRBbGxNZXRhZGF0YShNSU1FX1RZUEUpLmdldCgyKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGVzdFRpa2FBdXRvRGV0ZWN0RXh0cmFjdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvbWV0YWRhdGEvZXh0cmFjdG9ycy9leGFtcGxlcy9UZXN0VGlrYUF1dG9EZXRlY3RFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzFiNjdhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL21ldGFkYXRhL2V4dHJhY3RvcnMvZXhhbXBsZXMvVGVzdFRpa2FBdXRvRGV0ZWN0RXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKKy8vIEpVbml0IHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuKjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5NZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBUZXN0VGlrYUF1dG9EZXRlY3RFeHRyYWN0b3IgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICBUaWthQXV0b0RldGVjdEV4dHJhY3RvciB0aWthRXh0cmFjdG9yID0gbmV3IFRpa2FBdXRvRGV0ZWN0RXh0cmFjdG9yKCk7CisKKyAgICAgICAgTWV0YWRhdGEgZW1wdHlNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IFJlZmVyZW5jZSgpOworICAgICAgICBVUkwgZmlsZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3Rlc3QudHh0Iik7CisgICAgICAgIHJlZi5zZXRPcmlnUmVmZXJlbmNlKGZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIHJlZi5zZXREYXRhU3RvcmVSZWZlcmVuY2UoZmlsZS50b1N0cmluZygpKTsKKworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKHJlZik7CisgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKworICAgICAgICBNZXRhZGF0YSBvdXRwdXRNZXRhZGF0YSA9IHRpa2FFeHRyYWN0b3IuZG9FeHRyYWN0KHByb2R1Y3QsIGVtcHR5TWV0YWRhdGEpOworCisgICAgICAgIGFzc2VydE5vdE51bGwob3V0cHV0TWV0YWRhdGEpOworICAgICAgICBhc3NlcnRUcnVlKG91dHB1dE1ldGFkYXRhLmdldEFsbEtleXMoKS5zaXplKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRNZXRhZGF0YS5jb250YWluc0tleSgiWC1QYXJzZWQtQnkiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG91dHB1dE1ldGFkYXRhLmdldE1ldGFkYXRhKCJYLVBhcnNlZC1CeSIpID09ICJvcmcuYXBhY2hlLnRpa2EucGFyc2VyLkVtcHR5UGFyc2VyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvVGVzdFhNTFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvcmVwb3NpdG9yeS9UZXN0WE1MUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU4OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3JlcG9zaXRvcnkvVGVzdFhNTFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5leGVjLkVudlV0aWxpdGllczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBjYXNlIGNsYXNzIGZvciB0aGUgWE1MUmVwb3NpdG9yeU1hbmFnZXIuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RYTUxSZXBvc2l0b3J5TWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qIFVSSSBwb2ludGVycyB0byBvdXIgdGVzdCBwcm9kdWN0LXR5cGVzLnhtbCBkaXJlY3RvcmllcyAqLworICAgIHByaXZhdGUgTGlzdCBwcm9kdWN0VHlwZURpclVyaXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiBvdXIgcmVwb3NpdG9yeSBtYW5hZ2VyIHRvIHRlc3QgKi8KKyAgICBwcml2YXRlIFhNTFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9zaXRvcnlNYW5hZ2VyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZEdlbmVyaWNGaWxlQmxhbmtNZXREZXNjID0gIlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZSwgd2l0aCBibGFuayBtZXRhZGF0YS4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkR2VuZXJpY0ZpbGVEZXNjID0gIlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZSwgd2l0aCByZWFsIG1ldGFkYXRhLiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRHZW5lcmljRmlsZU5vTWV0RGVzYyA9ICJcbiAgICAgIFRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZSwgd2l0aG91dCBtZXRhZGF0YS5cbiAgICAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkVmVyc2lvbmVyQ2xhc3NOYW1lID0gIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlcFBhdGggPSAiZmlsZTovLyIKKyAgICAgICAgICAgICsgRW52VXRpbGl0aWVzLmdldEVudigiSE9NRSIpICsgIi9maWxlcyI7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdFhNTFJlcG9zaXRvcnlNYW5hZ2VyKCkgeworICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvcmVwb21nciIpOworICAgICAgICBwcm9kdWN0VHlwZURpclVyaXMuYWRkKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLnRvVVJJKCkudG9TdHJpbmcoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvc2l0b3J5TWFuYWdlciA9IG5ldyBYTUxSZXBvc2l0b3J5TWFuYWdlcihwcm9kdWN0VHlwZURpclVyaXMpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcG9QYXRoRW52VmFyUmVwbGFjZSgpIHsKKyAgICAgICAgTGlzdCBwcm9kdWN0VHlwZXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0VHlwZXMgPSByZXBvc2l0b3J5TWFuYWdlci5nZXRQcm9kdWN0VHlwZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gKChQcm9kdWN0VHlwZSkgcHJvZHVjdFR5cGVzLmdldCgwKSk7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFBhdGggPSAiZmlsZTovLyIgKyBTeXN0ZW0uZ2V0ZW52KCJIT01FIikgKyAiL2ZpbGVzIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmVwbyBwYXRoOiBbIiArIHR5cGUuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCkKKyAgICAgICAgICAgICAgICArICJdIGlzICIgKyAibm90IGVxdWFsIHRvIHRoZSBleHB0ZWN0ZWQgcGF0aDogWyIgKyBleHBlY3RlZFBhdGgKKyAgICAgICAgICAgICAgICArICJdIiwgZXhwZWN0ZWRQYXRoLCB0eXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvZHVjdFR5cGVzKCkgeworICAgICAgICBMaXN0IHByb2R1Y3RUeXBlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RUeXBlcyA9IHJlcG9zaXRvcnlNYW5hZ2VyLmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNob3VsZCBiZSBleGFjdGx5IDMgcHJvZHVjdCB0eXBlcworICAgICAgICBhc3NlcnROb3ROdWxsKHByb2R1Y3RUeXBlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBwcm9kdWN0VHlwZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvZHVjdFR5cGVCeU5hbWUoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2hvdWxkIGJlIG5vdCBudWxsIGFuZCBuYW1lIHNob3VsZCBiZSBnZW5lcmljIGZpbGUKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBuYW1lOiBbIiArIHR5cGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiXSBpcyBub3QgXCJHZW5lcmljRmlsZVwiIiwgdHlwZS5nZXROYW1lKCksICJHZW5lcmljRmlsZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9kdWN0VHlwZUJ5SWQoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeUlkKCJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNob3VsZCBiZSBub3QgbnVsbCBhbmQgc2hvdWxkIGJlIGdlbmVyaWMgZmlsZQorICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGlkOiBbIiArIHR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpCisgICAgICAgICAgICAgICAgKyAiXSBpcyBub3QgXCJ1cm46b29kdDpHZW5lcmljRmlsZVwiIiwgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCksCisgICAgICAgICAgICAgICAgInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC02OQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkUHJvZHVjdFR5cGVXaXRoTWV0YWRhdGFXaXRoQmxhbmtNZXQoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlQnlOYW1lKCJHZW5lcmljRmlsZVdpdGhCbGFua01ldCIpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZS5nZXRUeXBlTWV0YWRhdGEoKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC02OQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkUHJvZHVjdFR5cGVXaXRoTWV0YWRhdGFXaXRoTm9NZXQoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlQnlOYW1lKCJHZW5lcmljRmlsZU5vVHlwZU1ldGFkYXRhIik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlLmdldFR5cGVNZXRhZGF0YSgpKTsKKwlhc3NlcnRFcXVhbHMoMCwgdHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRLZXlzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC02OQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkUHJvZHVjdFR5cGVXaXRoTWV0YWRhdGEoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlLmdldFR5cGVNZXRhZGF0YSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuY29udGFpbnNLZXkoIkNyZWF0b3IiKSk7CisgICAgICAgIGFzc2VydFRydWUodHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5jb250YWluc0tleSgiQ29udHJpYnV0b3IiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0eXBlLmdldFR5cGVNZXRhZGF0YSgpLmdldEhhc2h0YWJsZSgpLmtleVNldCgpLnNpemUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRBbGxNZXRhZGF0YSgiQ3JlYXRvciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuZ2V0QWxsTWV0YWRhdGEoIkNyZWF0b3IiKS5zaXplKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuZ2V0QWxsTWV0YWRhdGEoIkNvbnRyaWJ1dG9yIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRBbGxNZXRhZGF0YSgiQ29udHJpYnV0b3IiKQorICAgICAgICAgICAgICAgIC5zaXplKCkpOworCisgICAgICAgIExpc3QgY29udHJpYlZhbHVlcyA9IHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkuZ2V0QWxsTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgIkNvbnRyaWJ1dG9yIik7CisgICAgICAgIGFzc2VydEVxdWFscygiRmlsZSBNYW5hZ2VyIENsaWVudCIsIChTdHJpbmcpIGNvbnRyaWJWYWx1ZXMuZ2V0KDApKTsKKworICAgICAgICBMaXN0IGNyZWF0b3JWYWx1ZXMgPSB0eXBlLmdldFR5cGVNZXRhZGF0YSgpLmdldEFsbE1ldGFkYXRhKCJDcmVhdG9yIik7CisgICAgICAgIGJvb2xlYW4gaGFzRmlyc3RDcmVhdG9yID0gZmFsc2UsIGhhc1NlY29uZENyZWF0b3IgPSBmYWxzZTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjcmVhdG9yVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKHZhbC5lcXVhbHMoIkNocmlzIE1hdHRtYW5uIikpIHsKKyAgICAgICAgICAgICAgICBoYXNGaXJzdENyZWF0b3IgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwuZXF1YWxzKCJQYXVsIFJhbWlyZXoiKSkgeworICAgICAgICAgICAgICAgIGhhc1NlY29uZENyZWF0b3IgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYXNGaXJzdENyZWF0b3IgJiYgaGFzU2Vjb25kQ3JlYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIE9PRFQtMjE5CisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCYWRGb3JtYXR0ZWREZXNjcmlwdGlvblRyaW1JbXBsaWNpdFRydWUoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlQnlOYW1lKCJHZW5lcmljRmlsZVdpdGhCbGFua01ldCIpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkR2VuZXJpY0ZpbGVCbGFua01ldERlc2MsIHR5cGUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIE9PRFQtMjE5CisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWREZXNjcmlwdGlvblRyaW1FeHBsaWNpdEZhbHNlKCkgeworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHlwZSA9IHJlcG9zaXRvcnlNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUJ5TmFtZSgiR2VuZXJpY0ZpbGVOb1R5cGVNZXRhZGF0YSIpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkR2VuZXJpY0ZpbGVOb01ldERlc2MsIHR5cGUuZ2V0RGVzY3JpcHRpb24oKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC0yMTkKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZERlc2NyaXB0aW9uVHJpbUV4cGxpY2l0VHJ1ZSgpIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHR5cGUgPSByZXBvc2l0b3J5TWFuYWdlci5nZXRQcm9kdWN0VHlwZUJ5TmFtZSgiR2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEdlbmVyaWNGaWxlRGVzYywgdHlwZS5nZXREZXNjcmlwdGlvbigpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTIxOQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkVmVyc2lvbmVyQ2xhc3MoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlLmdldFZlcnNpb25lcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmVyc2lvbmVyQ2xhc3NOYW1lLCB0eXBlLmdldFZlcnNpb25lcigpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTIxOQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkUmVwb1BhdGgoKSB7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVwUGF0aCwgdHlwZS5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvVGVzdFByb2R1Y3QuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1Rlc3RQcm9kdWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmNjVlOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL1Rlc3RQcm9kdWN0LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBjYXNlcyBmb3Igc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcgWE1MIHJlcHJlc2VudGF0aW9ucyBvZgorICoge0BsaW5rIFByb2R1Y3R9cy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UHJvZHVjdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL21pbWUtdHlwZXMueG1sIik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgfQorCisgIC8qKgorICAgKiBAc2luY2UgT09EVC00MQorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZmVyU3RhdHVzKCkgeworICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCJmb28iLCBuZXcgUHJvZHVjdFR5cGUoKSwgUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCwKKyAgICAgICAgUHJvZHVjdC5TVEFUVVNfVFJBTlNGRVIsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworICAgIGFzc2VydE5vdE51bGwocCk7CisgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0VHJhbnNmZXJTdGF0dXMoKSwgUHJvZHVjdC5TVEFUVVNfVFJBTlNGRVIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZVByb2R1Y3RXaXRoUHJvZHVjdFR5cGUoKSB7CisgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICBwLnNldFByb2R1Y3RJZCgidGVzdElkIik7CisgICAgcC5zZXRQcm9kdWN0TmFtZSgiVGVzdFByb2R1Y3QiKTsKKyAgICBwLnNldFByb2R1Y3RTdHJ1Y3R1cmUoIkZsYXQiKTsKKyAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QuU1RBVFVTX1JFQ0VJVkVEKTsKKyAgICBQcm9kdWN0VHlwZSB0eXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgdHlwZS5zZXROYW1lKCJCb2d1c1R5cGUiKTsKKyAgICBwLnNldFByb2R1Y3RUeXBlKHR5cGUpOworCisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgci5zZXREYXRhU3RvcmVSZWZlcmVuY2UoImZpbGU6Ly8vZGF0YS5zdG9yZSIpOworICAgIHIuc2V0T3JpZ1JlZmVyZW5jZSgiZmlsZTovLy9kYXRhLm9yaWciKTsKKyAgICByLnNldEZpbGVTaXplKDk5OTk5TCk7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyKTsKKyAgICByZWFkV3JpdGUocCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlUHJvZHVjdE5vUHJvZHVjdFR5cGUoKSB7CisgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICBwLnNldFByb2R1Y3RJZCgidGVzdElkIik7CisgICAgcC5zZXRQcm9kdWN0TmFtZSgiVGVzdFByb2R1Y3QiKTsKKyAgICBwLnNldFByb2R1Y3RTdHJ1Y3R1cmUoIkZsYXQiKTsKKyAgICBwLnNldFRyYW5zZmVyU3RhdHVzKFByb2R1Y3QuU1RBVFVTX1JFQ0VJVkVEKTsKKworICAgIFJlZmVyZW5jZSByID0gbmV3IFJlZmVyZW5jZSgpOworICAgIHIuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKCJmaWxlOi8vL2RhdGEuc3RvcmUiKTsKKyAgICByLnNldE9yaWdSZWZlcmVuY2UoImZpbGU6Ly8vZGF0YS5vcmlnIik7CisgICAgci5zZXRGaWxlU2l6ZSg5OTk5OUwpOworICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQocik7CisgICAgcmVhZFdyaXRlKHApOworCisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZFdyaXRlKFByb2R1Y3QgcHJvZHVjdCkgeworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICB0cnkgeworICAgICAgWE1MVXRpbHMud3JpdGVYbWxUb1N0cmVhbShwcm9kdWN0LnRvWE1MKCksIG9zKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIFByb2R1Y3QgcmVhZFByb2R1Y3QgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHJlYWRQcm9kdWN0ID0gbmV3IFByb2R1Y3QobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwocmVhZFByb2R1Y3QpOworICAgIGFzc2VydEVxdWFscygidGVzdElkIiwgcmVhZFByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgIGFzc2VydEVxdWFscygiVGVzdFByb2R1Y3QiLCByZWFkUHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCwgcmVhZFByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUHJvZHVjdC5TVEFUVVNfUkVDRUlWRUQsIHJlYWRQcm9kdWN0LmdldFRyYW5zZmVyU3RhdHVzKCkpOworICAgIGFzc2VydE5vdE51bGwocmVhZFByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChyZWFkUHJvZHVjdC5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSwgIkJvZ3VzVHlwZSIpOworICAgIGFzc2VydE5vdE51bGwocmVhZFByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKKyAgICBSZWZlcmVuY2UgcmVhZFJlZiA9IChSZWZlcmVuY2UpIHJlYWRQcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApOworICAgIGFzc2VydE5vdE51bGwocmVhZFJlZik7CisgICAgYXNzZXJ0RXF1YWxzKHJlYWRSZWYuZ2V0T3JpZ1JlZmVyZW5jZSgpLCAiZmlsZTovLy9kYXRhLm9yaWciKTsKKyAgICBhc3NlcnRFcXVhbHMocmVhZFJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwgImZpbGU6Ly8vZGF0YS5zdG9yZSIpOworICAgIGFzc2VydEVxdWFscyhyZWFkUmVmLmdldEZpbGVTaXplKCksIDk5OTk5TCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvVGVzdFJlZmVyZW5jZS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvVGVzdFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTcwOTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9UZXN0UmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIFRlc3QgaGFybmVzcyBmb3IgdGhlIFByb2R1Y3Qge0BsaW5rIFJlZmVyZW5jZX0gY2xhc3MuIEN1cnJlbnRseSAKKyAqIGV4ZXJjaXNlcyB0aGF0IE1JTUUgdHlwZSBkZXRlY3Rpb24gcHJvcGVybHkgb2NjdXJzLgorICogCisgKiBAc2luY2UgT09EVC01OAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UmVmZXJlbmNlIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLAorICAgICAgICBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoaW5pdGlhbFByb3BlcnRpZXMpOworICB9CisKKyAgLyoqCisgICAqIEBzaW5jZSBPT0RULTU4CisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0TWltZVR5cGUoKSB7CisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC90ZXN0LmhlNSIsCisgICAgICAgICJmaWxlOi8vL2FyY2hpdmUvdGVzdC5oZTUvdGVzdC5oZTUiLCAwTCk7CisgICAgYXNzZXJ0Tm90TnVsbChyKTsKKyAgICBhc3NlcnROb3ROdWxsKHIuZ2V0TWltZVR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi94LWhkZiIsIHIuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkpOworICB9CisgIAorICAvKioKKyAgICogQHNpbmNlIE9PRFQtMTM2CisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbE1pbWVUeXBlKCl7CisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC90ZXN0LmhlNSIsCisgICAgICAgICJmaWxlOi8vL2FyY2hpdmUvdGVzdC5oZTUvdGVzdC5oZTUiLCAwTCk7CisgICAgCisgICAgU3RyaW5nIG51bGxUeXBlID0gbnVsbDsKKyAgICB0cnl7CisgICAgICByLnNldE1pbWVUeXBlKCIiKTsKKyAgICAgIHIuc2V0TWltZVR5cGUobnVsbFR5cGUpOworICAgIH0KKyAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvVGVzdFF1ZXJ5UmVzdWx0LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9UZXN0UXVlcnlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M2MTMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N0cnVjdHMvcXVlcnkvVGVzdFF1ZXJ5UmVzdWx0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RRdWVyeVJlc3VsdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIFF1ZXJ5UmVzdWx0IHFyOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgcC5zZXRQcm9kdWN0SWQoIlRlc3RQcm9kdWN0SWQiKTsKKyAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbS5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgImRhdGFmaWxlLmRhdCIpOworICAgIG0uYWRkTWV0YWRhdGEoIk93bmVycyIsIEFycmF5cy5hc0xpc3QoIkJvYiIsICJCaWxseSIpKTsKKyAgICBxciA9IG5ldyBRdWVyeVJlc3VsdChwLCBtKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICBTdHJpbmcgc3RyID0gcXIudG9TdHJpbmcoKTsKKyAgICBhc3NlcnRUcnVlKHN0ci5jb250YWlucygiZGF0YWZpbGUuZGF0IikpOworICAgIGFzc2VydFRydWUoc3RyLmNvbnRhaW5zKCJCb2IsQmlsbHkiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIsIiwgc3RyLnJlcGxhY2UoImRhdGFmaWxlLmRhdCIsICIiKS5yZXBsYWNlKCJCb2IsQmlsbHkiLCIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdGb3JtYXQoKSB7CisgICAgcXIuc2V0VG9TdHJpbmdGb3JtYXQoIiRPd25lcnMsJEZpbGVuYW1lIik7CisgICAgYXNzZXJ0RXF1YWxzKCJCb2IsQmlsbHksZGF0YWZpbGUuZGF0IiwgcXIudG9TdHJpbmcoKSk7CisKKyAgICBxci5zZXRUb1N0cmluZ0Zvcm1hdCgiJEZpbGVuYW1lXHQkT3duZXJzIik7CisgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KHFyLnRvU3RyaW5nKCkuc3BsaXQoIlx0IikpOworICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJkYXRhZmlsZS5kYXQiLCBsaXN0LmdldCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJCb2IsQmlsbHkiLCBsaXN0LmdldCgxKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdFbXB0eSgpIHsKKyAgICBxci5zZXRNZXRhZGF0YShuZXcgTWV0YWRhdGEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBxci50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgYXNzZXJ0RXF1YWxzKHFyLCBxcik7CisgICAgYXNzZXJ0RmFsc2UocXIuZXF1YWxzKG51bGwpKTsKKyAgICBhc3NlcnRGYWxzZShxci5lcXVhbHMoMCkpOworCisgICAgUXVlcnlSZXN1bHQgbWV0bnVsbCA9IG5ldyBRdWVyeVJlc3VsdChxci5nZXRQcm9kdWN0KCksIG51bGwpOworICAgIGFzc2VydEZhbHNlKG1ldG51bGwuZXF1YWxzKHFyKSk7CisgICAgYXNzZXJ0RmFsc2UocXIuZXF1YWxzKG1ldG51bGwpKTsKKyAgICBhc3NlcnRFcXVhbHMobWV0bnVsbCwgbmV3IFF1ZXJ5UmVzdWx0KHFyLmdldFByb2R1Y3QoKSwgbnVsbCkpOworCisgICAgUXVlcnlSZXN1bHQgcHJvZG51bGwgPSBuZXcgUXVlcnlSZXN1bHQobnVsbCwgbmV3IE1ldGFkYXRhKHFyLmdldE1ldGFkYXRhKCkpKTsKKyAgICBhc3NlcnRGYWxzZShwcm9kbnVsbC5lcXVhbHMocXIpKTsKKyAgICBhc3NlcnRGYWxzZShxci5lcXVhbHMocHJvZG51bGwpKTsKKyAgICBhc3NlcnRFcXVhbHMocHJvZG51bGwsIG5ldyBRdWVyeVJlc3VsdChudWxsLCBuZXcgTWV0YWRhdGEocXIuZ2V0TWV0YWRhdGEoKSkpKTsKKworICAgIFF1ZXJ5UmVzdWx0IGVxdWFsID0gbmV3IFF1ZXJ5UmVzdWx0KHFyLmdldFByb2R1Y3QoKSwgbmV3IE1ldGFkYXRhKHFyLmdldE1ldGFkYXRhKCkpKTsKKyAgICBhc3NlcnRFcXVhbHMocXIsIGVxdWFsKTsKKyAgICBhc3NlcnRFcXVhbHMoZXF1YWwsIHFyKTsKKworICAgIFF1ZXJ5UmVzdWx0IGZtdCA9IG5ldyBRdWVyeVJlc3VsdChxci5nZXRQcm9kdWN0KCksIG5ldyBNZXRhZGF0YShxci5nZXRNZXRhZGF0YSgpKSk7CisgICAgZm10LnNldFRvU3RyaW5nRm9ybWF0KCJibGFoIik7CisgICAgYXNzZXJ0RmFsc2UocXIuZXF1YWxzKGZtdCkpOworICAgIGFzc2VydEZhbHNlKGZtdC5lcXVhbHMocXIpKTsKKworICAgIFF1ZXJ5UmVzdWx0IGZtdDIgPSBuZXcgUXVlcnlSZXN1bHQocXIuZ2V0UHJvZHVjdCgpLCBuZXcgTWV0YWRhdGEocXIuZ2V0TWV0YWRhdGEoKSkpOworICAgIGZtdDIuc2V0VG9TdHJpbmdGb3JtYXQoImJsYWgiKTsKKyAgICBhc3NlcnRFcXVhbHMoZm10LCBmbXQyKTsKKyAgICBhc3NlcnRFcXVhbHMoZm10MiwgZm10KTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9UZXN0UXVlcnlSZXN1bHRDb21wYXJhdG9yLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy9xdWVyeS9UZXN0UXVlcnlSZXN1bHRDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0Njc3NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3F1ZXJ5L1Rlc3RRdWVyeVJlc3VsdENvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RRdWVyeVJlc3VsdENvbXBhcmF0b3IgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBRdWVyeVJlc3VsdCBxcjE7CisgIHByaXZhdGUgUXVlcnlSZXN1bHQgcXIyOworICBwcml2YXRlIFF1ZXJ5UmVzdWx0IHFyZmlsZW5hbWU7CisgIHByaXZhdGUgUXVlcnlSZXN1bHQgcXJvd25lcnM7CisgIHByaXZhdGUgUXVlcnlSZXN1bHQgcXJudWxsOworICBwcml2YXRlIFF1ZXJ5UmVzdWx0IHFybnVsbDI7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICBwLnNldFByb2R1Y3RJZCgiVGVzdFByb2R1Y3RJRCIpOworICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtLmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVOQU1FLCAiZGF0YWZpbGUuZGF0Iik7CisgICAgbS5hZGRNZXRhZGF0YSgiT3duZXJzIiwgQXJyYXlzLmFzTGlzdCgiQ2hhZCIsICJDYW0iKSk7CisgICAgcXIxID0gbmV3IFF1ZXJ5UmVzdWx0KHAsIG0pOworCisgICAgTWV0YWRhdGEgbTIgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtMi5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgInRleHRmaWxlLmRhdCIpOworICAgIG0yLmFkZE1ldGFkYXRhKCJPd25lcnMiLCBBcnJheXMuYXNMaXN0KCJCb2IiLCAiQmlsbHkiKSk7CisgICAgcXIyID0gbmV3IFF1ZXJ5UmVzdWx0KHAsIG0yKTsKKworICAgIE1ldGFkYXRhIGZpbGVuYW1lID0gbmV3IE1ldGFkYXRhKCk7CisgICAgZmlsZW5hbWUuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUsICJmb28udHh0Iik7CisgICAgcXJmaWxlbmFtZSA9IG5ldyBRdWVyeVJlc3VsdChwLCBmaWxlbmFtZSk7CisKKyAgICBNZXRhZGF0YSBvd25lcnMgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBvd25lcnMuYWRkTWV0YWRhdGEoIk93bmVycyIsIEFycmF5cy5hc0xpc3QoIkRhdmUiLCAiRGFuIikpOworICAgIHFyb3duZXJzID0gbmV3IFF1ZXJ5UmVzdWx0KHAsIG93bmVycyk7CisKKyAgICBxcm51bGwgPSBuZXcgUXVlcnlSZXN1bHQocCwgbmV3IE1ldGFkYXRhKCkpOworICAgIHFybnVsbDIgPSBuZXcgUXVlcnlSZXN1bHQocCwgbmV3IE1ldGFkYXRhKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvbXBhcmUoKSB7CisgICAgTGlzdDxRdWVyeVJlc3VsdD4gbGlzdCA9IEFycmF5cy5hc0xpc3QocXIxLCBxcm93bmVycywgcXJudWxsMiwgcXIyLCBxcm51bGwsIHFyZmlsZW5hbWUpOworICAgIFF1ZXJ5UmVzdWx0Q29tcGFyYXRvciBjID0gbmV3IFF1ZXJ5UmVzdWx0Q29tcGFyYXRvcigpOworICAgIGMuc2V0U29ydEJ5TWV0S2V5KENvcmVNZXRLZXlzLkZJTEVOQU1FKTsKKworICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgYyk7CisgICAgYXNzZXJ0RXF1YWxzKHFyMSwgbGlzdC5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyhxcmZpbGVuYW1lLCBsaXN0LmdldCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKHFyMiwgbGlzdC5nZXQoMikpOworICAgIExpc3Q8UXVlcnlSZXN1bHQ+IHN1YiA9IGxpc3Quc3ViTGlzdCgzLCBsaXN0LnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHN1Yi5zaXplKCkpOworICAgIGFzc2VydFRydWUoc3ViLmNvbnRhaW5zKHFybnVsbCkpOworICAgIGFzc2VydFRydWUoc3ViLmNvbnRhaW5zKHFybnVsbDIpKTsKKyAgICBhc3NlcnRUcnVlKHN1Yi5jb250YWlucyhxcm93bmVycykpOworCisgICAgYy5zZXRTb3J0QnlNZXRLZXkoIk93bmVycyIpOworICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgYyk7CisgICAgYXNzZXJ0RXF1YWxzKHFyMiwgbGlzdC5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyhxcjEsIGxpc3QuZ2V0KDEpKTsKKyAgICBhc3NlcnRFcXVhbHMocXJvd25lcnMsIGxpc3QuZ2V0KDIpKTsKKyAgICBzdWIgPSBsaXN0LnN1Ykxpc3QoMywgbGlzdC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygzLCBzdWIuc2l6ZSgpKTsKKyAgICBhc3NlcnRUcnVlKHN1Yi5jb250YWlucyhxcmZpbGVuYW1lKSk7CisgICAgYXNzZXJ0VHJ1ZShzdWIuY29udGFpbnMocXJudWxsKSk7CisgICAgYXNzZXJ0VHJ1ZShzdWIuY29udGFpbnMocXJudWxsMikpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zdHJ1Y3RzL3R5cGUvVGVzdFR5cGVIYW5kbGVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy90eXBlL1Rlc3RUeXBlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDllM2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3RydWN0cy90eXBlL1Rlc3RUeXBlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy50eXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5TcWxTY3JpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMucGFnaW5hdGlvbi5QYWdpbmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5EYXRhU291cmNlQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5EYXRhU291cmNlQ2F0YWxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJhbmdlUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuVGVybVF1ZXJ5Q3JpdGVyaWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5WYWxpZGF0aW9uTGF5ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY0V4Y2VwdGlvbjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VHlwZUhhbmRsZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgU3RyaW5nIHRtcERpclBhdGg7CisgICAgCisgICAgRGF0YVNvdXJjZSBwdWJsaWNEYXRhU291cmNlOworICAgIAorICAgIFhtbFJwY0ZpbGVNYW5hZ2VyIGZtU2VydmVyOworICAgIAorICAgIGludCBGSUxFTUdSX1BPUlQgPSA5OTk5OworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGluaXRpYWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoCisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgcHVibGljIHZvaWQgc2V0VXBQcm9wZXJ0aWVzKCkgeworCisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBmaWxlbWdyUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAiL2ZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgZmlsZW1nclByb3BlcnRpZXNVcmwuZ2V0RmlsZSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCBhIHRlbXAgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgdGVtcERpciA9IG51bGw7CisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgdGVtcERpciA9IHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdG1wRGlyUGF0aCA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIGlmICghdG1wRGlyUGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB0bXBEaXJQYXRoICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIHRtcERpclBhdGggKz0gInRlc3RDYXQiOworCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgY2F0YWxvZyBvbmVzCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoIiwKKyAgICAgICAgICAgICAgICB0bXBEaXJQYXRoKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXJsIiwKKyAgICAgICAgICAgICAgICAiamRiYzpoc3FsZGI6ZmlsZToiICsgdG1wRGlyUGF0aCArICIvdGVzdENhdDtzaHV0ZG93bj10cnVlIik7CisKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVzZXIiLAorICAgICAgICAgICAgICAgICJzYSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMucGFzcyIsCisgICAgICAgICAgICAgICAgIiIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMuZHJpdmVyIiwKKyAgICAgICAgICAgICAgICAib3JnLmhzcWxkYi5qZGJjRHJpdmVyIik7CisKKyAgICAgICAgLy8gbm93IG92ZXJyaWRlIHRoZSB2YWwgbGF5ZXIgb25lcworICAgICAgICBVUkwgc3RydWN0RmFjdG9yeVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIveG1scnBjLXN0cnVjdC1mYWN0b3J5Iik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRpcnMiLAorICAgICAgICAgICAgImZpbGU6Ly8iICsgbmV3IEZpbGUoc3RydWN0RmFjdG9yeVVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRpcnMiLAorICAgICAgICAgICAgImZpbGU6Ly8iICsgbmV3IEZpbGUoc3RydWN0RmFjdG9yeVVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBvdmVycmlkZSBxdW90ZSBmaWVsZHMKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5xdW90ZUZpZWxkcyIsCisgICAgICAgICAgICAgICAgInRydWUiKTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgICB9CisgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5kR2V0TWV0YWRhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJEYXRhVmVyc2lvbiIsICI0LjAiKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJQcm9kdWN0TmFtZSIsICJ0ZXN0Iik7CisgICAgICAgIFByb2R1Y3QgdGVzdFByb2R1Y3QgPSBnZXRUZXN0UHJvZHVjdCgpOworCisgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZJTEVNR1JfUE9SVCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdFR5cGUoZm1DbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIikpOworICAgICAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdElkKGZtQ2xpZW50LmluZ2VzdFByb2R1Y3QodGVzdFByb2R1Y3QsIG1ldCwgZmFsc2UpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRhZGF0YSByZXRNZXQgPSBmbUNsaWVudC5nZXRNZXRhZGF0YSh0ZXN0UHJvZHVjdCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldE1ldCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJldE1ldC5jb250YWluc0tleSgiRGF0YVZlcnNpb24iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjQuMCIsIHJldE1ldAorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoIkRhdGFWZXJzaW9uIikpOworICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcHVibGljRGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICAgIFJlc3VsdFNldCBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoIlNFTEVDVCBtZXRhZGF0YV92YWx1ZSBGUk9NIEdlbmVyaWNGaWxlX21ldGFkYXRhIFdIRVJFIGVsZW1lbnRfaWQgPSAndXJuOnRlc3Q6RGF0YVZlcnNpb24nOyIpOworICAgICAgICBycy5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhycy5nZXRTdHJpbmcoIm1ldGFkYXRhX3ZhbHVlIiksICIwNC4wMCIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb25uZWN0aW9uRXhjZXB0aW9uLCBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YSgiRGF0YVZlcnNpb24iLCAiNC4wIik7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YSgiUHJvZHVjdE5hbWUiLCAidGVzdCIpOworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gZ2V0VGVzdFByb2R1Y3QoKTsKKworICAgICAgICBQcm9kdWN0VHlwZSBnZW5lcmljRmlsZSA9IG51bGw7CisgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZJTEVNR1JfUE9SVCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdFR5cGUoZ2VuZXJpY0ZpbGUgPSBmbUNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5TmFtZSgiR2VuZXJpY0ZpbGUiKSk7CisgICAgICAgICAgICB0ZXN0UHJvZHVjdC5zZXRQcm9kdWN0SWQoZm1DbGllbnQuaW5nZXN0UHJvZHVjdCh0ZXN0UHJvZHVjdCwgbWV0LCBmYWxzZSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgICAgICBUZXJtUXVlcnlDcml0ZXJpYSB0ZXJtUXVlcnkgPSBuZXcgVGVybVF1ZXJ5Q3JpdGVyaWEoKTsKKyAgICAgICAgdGVybVF1ZXJ5LnNldEVsZW1lbnROYW1lKCJEYXRhVmVyc2lvbiIpOworICAgICAgICB0ZXJtUXVlcnkuc2V0VmFsdWUoIjQuMCIpOworICAgICAgICBxdWVyeS5hZGRDcml0ZXJpb24odGVybVF1ZXJ5KTsKKyAgICAgICAgCisgICAgICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBmbUNsaWVudC5xdWVyeShxdWVyeSwgZ2VuZXJpY0ZpbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdHMuZ2V0KDApLmdldFByb2R1Y3RJZCgpLCB0ZXN0UHJvZHVjdC5nZXRQcm9kdWN0SWQoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nQW5kT3JpZ1ZhbHVlc0FuZEdldENhdGFsb2dRdWVyeSgpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uLCBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiwgWG1sUnBjRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBtZXQuYWRkTWV0YWRhdGEoIkRhdGFWZXJzaW9uIiwgIjQuMCIpOworICAgICAgICBtZXQuYWRkTWV0YWRhdGEoIlByb2R1Y3ROYW1lIiwgInRlc3QiKTsKKyAgICAgICAgUHJvZHVjdCB0ZXN0UHJvZHVjdCA9IGdldFRlc3RQcm9kdWN0KCk7CisKKyAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1DbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgRklMRU1HUl9QT1JUKSk7CisgICAgICAgIFByb2R1Y3RUeXBlIGdlbmVyaWNGaWxlID0gZm1DbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMDQuMDAiLCAobWV0ID0gZm1DbGllbnQuZ2V0Q2F0YWxvZ1ZhbHVlcyhtZXQsIGdlbmVyaWNGaWxlKSkuZ2V0TWV0YWRhdGEoIkRhdGFWZXJzaW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQuMCIsIGZtQ2xpZW50LmdldE9yaWdWYWx1ZXMobWV0LCBnZW5lcmljRmlsZSkuZ2V0TWV0YWRhdGEoIkRhdGFWZXJzaW9uIikpOworICAgICAgICAKKyAgICAgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKyAgICAgICAgVGVybVF1ZXJ5Q3JpdGVyaWEgdGVybVF1ZXJ5ID0gbmV3IFRlcm1RdWVyeUNyaXRlcmlhKCk7CisgICAgICAgIHRlcm1RdWVyeS5zZXRFbGVtZW50TmFtZSgiRGF0YVZlcnNpb24iKTsKKyAgICAgICAgdGVybVF1ZXJ5LnNldFZhbHVlKCI0LjAiKTsKKyAgICAgICAgcXVlcnkuYWRkQ3JpdGVyaW9uKHRlcm1RdWVyeSk7CisgICAgICAgIHF1ZXJ5ID0gZm1DbGllbnQuZ2V0Q2F0YWxvZ1F1ZXJ5KHF1ZXJ5LCBnZW5lcmljRmlsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDQuMDAiLCAoKFRlcm1RdWVyeUNyaXRlcmlhKSBxdWVyeS5nZXRDcml0ZXJpYSgpLmdldCgwKSkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgUHJvZHVjdCBnZXRUZXN0UHJvZHVjdCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBQcm9kdWN0IHRlc3RQcm9kdWN0ID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiLAorICAgICAgICAgICAgICAgICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgICBMaXN0PFJlZmVyZW5jZT4gcmVmcyA9IG5ldyBMaW5rZWRMaXN0PFJlZmVyZW5jZT4oKTsKKyAgICAgICAgVVJMIHJlZlVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dCIpOworICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IFJlZmVyZW5jZSgpOworICAgICAgICByZWYuc2V0T3JpZ1JlZmVyZW5jZShuZXcgRmlsZShyZWZVcmwuZ2V0RmlsZSgpKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICByZWYuc2V0RmlsZVNpemUoMTIzKTsKKyAgICAgICAgcmVmcy5hZGQocmVmKTsKKyAgICAgICAgdGVzdFByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXMocmVmcyk7CisgICAgICAgIHJldHVybiB0ZXN0UHJvZHVjdDsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFVwUHJvcGVydGllcygpOworICAgICAgICBjcmVhdGVTY2hlbWEoKTsKKyAgICAgICAgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmbVNlcnZlci5zaHV0ZG93bigpOworICAgICAgICAvLyBub3cgcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHVzZWQKKyAgICAgICAgaWYgKHRtcERpclBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZSh0bXBEaXJQYXRoKTsKKyAgICAgICAgICAgIEZpbGVbXSB0bXBGaWxlcyA9IHRtcERpci5saXN0RmlsZXMoKTsKKworICAgICAgICAgICAgaWYgKHRtcEZpbGVzICE9IG51bGwgJiYgdG1wRmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG1wRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wRGlyLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTY2hlbWEoKSB7CisgICAgICAgIFN0cmluZyB1cmwgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy51cmwiKTsKKyAgICAgICAgU3RyaW5nIHVzZXIgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy51c2VyIik7CisgICAgICAgIFN0cmluZyBwYXNzID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMucGFzcyIpOworICAgICAgICBTdHJpbmcgZHJpdmVyID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMuZHJpdmVyIik7CisKKyAgICAgICAgcHVibGljRGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsCisgICAgICAgICAgICAgICAgZHJpdmVyLCB1cmwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHNjcmlwdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3Rlc3RjYXQuc3FsIik7CisgICAgICAgICAgICBTcWxTY3JpcHQgY29yZVNjaGVtYVNjcmlwdCA9IG5ldyBTcWxTY3JpcHQobmV3IEZpbGUoCisgICAgICAgICAgICAgICAgc2NyaXB0VXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCksIHB1YmxpY0RhdGFTb3VyY2UpOworICAgICAgICAgICAgY29yZVNjaGVtYVNjcmlwdC5sb2FkU2NyaXB0KCk7CisgICAgICAgICAgICBjb3JlU2NoZW1hU2NyaXB0LmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBzdGFydFhtbFJwY0ZpbGVNYW5hZ2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm1TZXJ2ZXIgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXIoRklMRU1HUl9QT1JUKTsKKyAgICAgICAgICAgIGZtU2VydmVyLnNldENhdGFsb2cobmV3IEhzcWxEYkZyaWVuZGx5RGF0YVNvdXJjZUNhdGFsb2dGYXRvcnkoKS5jcmVhdGVDYXRhbG9nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgY2xhc3MgSHNxbERiRnJpZW5kbHlEYXRhU291cmNlQ2F0YWxvZ0ZhdG9yeSBleHRlbmRzCisgICAgICAgICAgICBEYXRhU291cmNlQ2F0YWxvZ0ZhY3RvcnkgeworCisgICAgICAgIHB1YmxpYyBIc3FsRGJGcmllbmRseURhdGFTb3VyY2VDYXRhbG9nRmF0b3J5KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUKKyAgICAgICAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZ0ZhY3RvcnkjY3JlYXRlQ2F0YWxvZygpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2F0YWxvZyBjcmVhdGVDYXRhbG9nKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIc3FsRGJGcmllbmRseURhdGFTb3VyY2VDYXRhbG9nKGRhdGFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25MYXllciwgZmllbGRJZFN0ciwgcGFnZVNpemUsIGNhY2hlVXBkYXRlTWludXRlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgY2xhc3MgSHNxbERiRnJpZW5kbHlEYXRhU291cmNlQ2F0YWxvZyBleHRlbmRzIERhdGFTb3VyY2VDYXRhbG9nIHsKKworICAgICAgICBwdWJsaWMgSHNxbERiRnJpZW5kbHlEYXRhU291cmNlQ2F0YWxvZyhEYXRhU291cmNlIGRzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRpb25MYXllciB2YWxMYXllciwgYm9vbGVhbiBmaWVsZElkLCBpbnQgcGFnZVNpemUsCisgICAgICAgICAgICAgICAgbG9uZyBjYWNoZVVwZGF0ZU1pbikgeworICAgICAgICAgICAgc3VwZXIoZHMsIHZhbExheWVyLCBmaWVsZElkLCBwYWdlU2l6ZSwgY2FjaGVVcGRhdGVNaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAgICAgLmdldExvZ2dlcihIc3FsRGJGcmllbmRseURhdGFTb3VyY2VDYXRhbG9nLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5EYXRhU291cmNlQ2F0YWxvZyNwYWdlZFF1ZXJ5KG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5LAorICAgICAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlLCBpbnQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUHJvZHVjdFBhZ2UgcGFnZWRRdWVyeShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSwgaW50IHBhZ2VOdW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICAgICAgaW50IHRvdGFsUGFnZXMgPSBQYWdpbmF0aW9uVXRpbHMuZ2V0VG90YWxQYWdlKGdldFJlc3VsdExpc3RTaXplKAorICAgICAgICAgICAgICAgICAgICBxdWVyeSwgdHlwZSksIHRoaXMucGFnZVNpemUpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogaWYgdGhlcmUgYXJlIDAgdG90YWwgcGFnZXMgaW4gdGhlIHJlc3VsdCBsaXN0IHNpemUgdGhlbiBkb24ndAorICAgICAgICAgICAgICogYm90aGVyIHJldHVybmluZyBhIHZhbGlkIHByb2R1Y3QgcGFnZSBpbnN0ZWFkLCByZXR1cm4gYmxhbmsKKyAgICAgICAgICAgICAqIFByb2R1Y3RQYWdlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0b3RhbFBhZ2VzID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvZHVjdFBhZ2UuYmxhbmtQYWdlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb2R1Y3RQYWdlIHJldFBhZ2UgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgICAgICAgIHJldFBhZ2Uuc2V0UGFnZU51bShwYWdlTnVtKTsKKyAgICAgICAgICAgIHJldFBhZ2Uuc2V0UGFnZVNpemUodGhpcy5wYWdlU2l6ZSk7CisgICAgICAgICAgICByZXRQYWdlLnNldFRvdGFsUGFnZXModG90YWxQYWdlcyk7CisKKyAgICAgICAgICAgIExpc3QgcHJvZHVjdElkcyA9IHBhZ2luYXRlUXVlcnkocXVlcnksIHR5cGUsIHBhZ2VOdW0pOworCisgICAgICAgICAgICBpZiAocHJvZHVjdElkcyAhPSBudWxsICYmIHByb2R1Y3RJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIExpc3QgcHJvZHVjdHMgPSBuZXcgVmVjdG9yKHByb2R1Y3RJZHMuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RJZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMuYWRkKHApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldFBhZ2Uuc2V0UGFnZVByb2R1Y3RzKHByb2R1Y3RzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJldFBhZ2U7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nI2dldEZpcnN0UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRGaXJzdFBhZ2UoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgICAgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKyAgICAgICAgICAgIFByb2R1Y3RQYWdlIGZpcnN0UGFnZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlyc3RQYWdlID0gcGFnZWRRdWVyeShxdWVyeSwgdHlwZSwgMSk7CisgICAgICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgZmlyc3QgcGFnZTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmaXJzdFBhZ2U7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkRhdGFTb3VyY2VDYXRhbG9nI2dldE5leHRQYWdlKG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlLAorICAgICAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2R1Y3RQYWdlIGdldE5leHRQYWdlKFByb2R1Y3RUeXBlIHR5cGUsIFByb2R1Y3RQYWdlIGN1cnJlbnRQYWdlKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudFBhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdFBhZ2UodHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZS5pc0xhc3RQYWdlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb2R1Y3RQYWdlIG5leHRQYWdlID0gbnVsbDsKKyAgICAgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV4dFBhZ2UgPSBwYWdlZFF1ZXJ5KHF1ZXJ5LCB0eXBlLCBjdXJyZW50UGFnZS5nZXRQYWdlTnVtKCkgKyAxKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIG5leHQgcGFnZTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0UGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGlzdCBwYWdpbmF0ZVF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBQcm9kdWN0VHlwZSB0eXBlLCBpbnQgcGFnZU51bSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgICAgICAgICBMaXN0IHByb2R1Y3RJZHMgPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBkb1NraXAgPSB0cnVlOworICAgICAgICAgICAgaW50IG51bVJlc3VsdHMgPSAtMTsKKworICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkb1NraXAgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtUmVzdWx0cyA9IGdldFJlc3VsdExpc3RTaXplKHF1ZXJ5LCB0eXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTZXQuQ09OQ1VSX1JFQURfT05MWSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZ2V0UHJvZHVjdFNxbCA9ICIiOworICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSB0eXBlLmdldE5hbWUoKSArICJfbWV0YWRhdGEiOworICAgICAgICAgICAgICAgIFN0cmluZyBzdWJTZWxlY3RRdWVyeUJhc2UgPSAiU0VMRUNUIHByb2R1Y3RfaWQgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRhYmxlTmFtZSArICIgIjsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2VsZWN0Q2xhdXNlID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgRElTVElOQ1QgcC5wcm9kdWN0X2lkICIpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBmcm9tQ2xhdXNlID0gbmV3IFN0cmluZ0J1ZmZlcigiRlJPTSAiICsgdGFibGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcCAiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVmZmVyKCJXSEVSRSAiKTsKKworICAgICAgICAgICAgICAgIGJvb2xlYW4gZ290Rmlyc3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgY2xhdXNlTnVtID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChxdWVyeS5nZXRDcml0ZXJpYSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHF1ZXJ5LmdldENyaXRlcmlhKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxdWVyeS5nZXRDcml0ZXJpYSgpLml0ZXJhdG9yKCk7IGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlDcml0ZXJpYSBjcml0ZXJpYSA9IChRdWVyeUNyaXRlcmlhKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZU51bSsrOworCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudElkU3RyID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSWRTdHJpbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkU3RyID0gIiciICsgdGhpcy5nZXRWYWxpZGF0aW9uTGF5ZXIoKS5nZXRFbGVtZW50QnlOYW1lKGNyaXRlcmlhLmdldEVsZW1lbnROYW1lKCkpLmdldEVsZW1lbnRJZCgpICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRTdHIgPSB0aGlzLmdldFZhbGlkYXRpb25MYXllcigpLmdldEVsZW1lbnRCeU5hbWUoY3JpdGVyaWEuZ2V0RWxlbWVudE5hbWUoKSkuZ2V0RWxlbWVudElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGF1c2UgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdvdEZpcnN0Q2xhdXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlID0gIihwLmVsZW1lbnRfaWQgPSAiICsgZWxlbWVudElkU3RyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQU5EICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyaXRlcmlhIGluc3RhbmNlb2YgVGVybVF1ZXJ5Q3JpdGVyaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIgbWV0YWRhdGFfdmFsdWUgTElLRSAnJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoVGVybVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkgKyAiJScpICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcml0ZXJpYSBpbnN0YW5jZW9mIFJhbmdlUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRWYWwgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXJ0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdXNpdmUgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluY2x1c2l2ZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnRWYWwgIT0gbnVsbCAmJiAhc3RhcnRWYWwuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZW5kVmFsICE9IG51bGwgJiYgIWVuZFZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIiBtZXRhZGF0YV92YWx1ZSAiOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdvdFN0YXJ0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1c2l2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICI+PSAnIiArIHN0YXJ0VmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICI+ICciICsgc3RhcnRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290U3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kVmFsICE9IG51bGwgJiYgIWVuZFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdFN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIiBBTkQgbWV0YWRhdGFfdmFsdWUgPD0gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiIEFORCBtZXRhZGF0YV92YWx1ZSA8ICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVzaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIjw9ICciICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICI8ICciICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIikgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLmFwcGVuZChjbGF1c2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdEZpcnN0Q2xhdXNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlNlbGVjdFRibE5hbWUgPSAicCIgKyBjbGF1c2VOdW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlNlbGVjdFF1ZXJ5ID0gc3ViU2VsZWN0UXVlcnlCYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJXSEVSRSAoZWxlbWVudF9pZCA9ICIgKyBlbGVtZW50SWRTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBTkQgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIG1ldGFkYXRhX3ZhbHVlIExJS0UgJyUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFRlcm1RdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpICsgIiUnKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcml0ZXJpYSBpbnN0YW5jZW9mIFJhbmdlUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRWYWwgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXJ0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kVmFsdWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCB8fCBlbmRWYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIiBtZXRhZGF0YV92YWx1ZSAiOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdvdFN0YXJ0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIj49ICciICsgc3RhcnRWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFZhbCAhPSBudWxsICYmICFlbmRWYWwuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3RTdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIEFORCBtZXRhZGF0YV92YWx1ZSA8PSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiPD0gJyIgKyBlbmRWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIikgIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21DbGF1c2UuYXBwZW5kKCJJTk5FUiBKT0lOICgiICsgc3ViU2VsZWN0UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIHN1YlNlbGVjdFRibE5hbWUgKyAiIE9OICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3ViU2VsZWN0VGJsTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnByb2R1Y3RfaWQgPSBwLnByb2R1Y3RfaWQgIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsID0gc2VsZWN0Q2xhdXNlLnRvU3RyaW5nKCkgKyBmcm9tQ2xhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGdvdEZpcnN0Q2xhdXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2R1Y3RTcWwgKz0gd2hlcmVDbGF1c2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJjYXRhbG9nIHF1ZXJ5OiBleGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJvZHVjdFNxbCk7CisKKyAgICAgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0UHJvZHVjdFNxbCk7CisgICAgICAgICAgICAgICAgcHJvZHVjdElkcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAgICAgICAgIGlmIChkb1NraXApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0TnVtID0gKHBhZ2VOdW0gLSAxKSAqIHBhZ2VTaXplOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydE51bSA+IG51bVJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TnVtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgY2FsbCBuZXh0IGZpcnN0LCBvciBlbHNlIG5vIHJlbGF0aXZlIGN1cnNvcgorICAgICAgICAgICAgICAgICAgICBpZiAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1HcmFiYmVkID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlTnVtID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1HcmFiYmVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWRzLmFkZChycy5nZXRTdHJpbmcoInByb2R1Y3RfaWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUdyYWJiZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlTnVtICE9IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzLnJlbGF0aXZlKHN0YXJ0TnVtLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSByZXN0CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpICYmIG51bUdyYWJiZWQgPCBwYWdlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSBycy5nZXRTdHJpbmcoInByb2R1Y3RfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWRzLmFkZChwcm9kdWN0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUdyYWJiZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IHJzLmdldFN0cmluZygicHJvZHVjdF9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkcy5hZGQocHJvZHVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0SWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZHMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBwZXJmb3JtaW5nIHF1ZXJ5LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgcXVlcnkgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdElkczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgZ2V0UmVzdWx0TGlzdFNpemUoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIENhdGFsb2dFeGNlcHRpb24geworICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICAgICAgaW50IHJlc3VsdENvdW50ID0gMDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBnZXRQcm9kdWN0U3FsID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpICsgIl9tZXRhZGF0YSI7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlNlbGVjdFF1ZXJ5QmFzZSA9ICJTRUxFQ1QgcHJvZHVjdF9pZCBGUk9NICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGFibGVOYW1lICsgIiAiOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzZWxlY3RDbGF1c2UgPSBuZXcgU3RyaW5nQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBDT1VOVChESVNUSU5DVCBwLnByb2R1Y3RfaWQpIEFTIG51bVJlc3VsdHMgIik7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGZyb21DbGF1c2UgPSBuZXcgU3RyaW5nQnVmZmVyKCJGUk9NICIgKyB0YWJsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwICIpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWZmZXIoIldIRVJFICIpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBnb3RGaXJzdENsYXVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludCBjbGF1c2VOdW0gPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5LmdldENyaXRlcmlhKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcXVlcnkuZ2V0Q3JpdGVyaWEoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHF1ZXJ5LmdldENyaXRlcmlhKCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeUNyaXRlcmlhIGNyaXRlcmlhID0gKFF1ZXJ5Q3JpdGVyaWEpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlTnVtKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50SWRTdHIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZFN0cmluZ0ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRTdHIgPSAiJyIgKyB0aGlzLmdldFZhbGlkYXRpb25MYXllcigpLmdldEVsZW1lbnRCeU5hbWUoY3JpdGVyaWEuZ2V0RWxlbWVudE5hbWUoKSkuZ2V0RWxlbWVudElkKCkgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZFN0ciA9IHRoaXMuZ2V0VmFsaWRhdGlvbkxheWVyKCkuZ2V0RWxlbWVudEJ5TmFtZShjcml0ZXJpYS5nZXRFbGVtZW50TmFtZSgpKS5nZXRFbGVtZW50SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXVzZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ290Rmlyc3RDbGF1c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgPSAiKHAuZWxlbWVudF9pZCA9ICIgKyBlbGVtZW50SWRTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBTkQgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIiBtZXRhZGF0YV92YWx1ZSBMSUtFICclIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChUZXJtUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSArICIlJykgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyaXRlcmlhIGluc3RhbmNlb2YgUmFuZ2VRdWVyeUNyaXRlcmlhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhcnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kVmFsID0gKChSYW5nZVF1ZXJ5Q3JpdGVyaWEpIGNyaXRlcmlhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1c2l2ZSA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5jbHVzaXZlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGFydFZhbCAhPSBudWxsICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChlbmRWYWwgIT0gbnVsbCAmJiAhZW5kVmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiIG1ldGFkYXRhX3ZhbHVlICI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZ290U3RhcnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0YXJ0VmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVzaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIj49ICciICsgc3RhcnRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIj4gJyIgKyBzdGFydFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RTdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiAhZW5kVmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ290U3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1c2l2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiIEFORCBtZXRhZGF0YV92YWx1ZSA8PSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVuZFZhbCArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlICs9ICIgQU5EIG1ldGFkYXRhX3ZhbHVlIDwgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiPD0gJyIgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UgKz0gIjwgJyIgKyBlbmRWYWwgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSAiKSAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLmFwcGVuZChjbGF1c2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdEZpcnN0Q2xhdXNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlNlbGVjdFRibE5hbWUgPSAicCIgKyBjbGF1c2VOdW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlNlbGVjdFF1ZXJ5ID0gc3ViU2VsZWN0UXVlcnlCYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJXSEVSRSAoZWxlbWVudF9pZCA9ICIgKyBlbGVtZW50SWRTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBTkQgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEgaW5zdGFuY2VvZiBUZXJtUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIG1ldGFkYXRhX3ZhbHVlIExJS0UgJyUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFRlcm1RdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpICsgIiUnKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcml0ZXJpYSBpbnN0YW5jZW9mIFJhbmdlUXVlcnlDcml0ZXJpYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRWYWwgPSAoKFJhbmdlUXVlcnlDcml0ZXJpYSkgY3JpdGVyaWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXJ0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFZhbCA9ICgoUmFuZ2VRdWVyeUNyaXRlcmlhKSBjcml0ZXJpYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kVmFsdWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCB8fCBlbmRWYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIiBtZXRhZGF0YV92YWx1ZSAiOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdvdFN0YXJ0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGFydFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIj49ICciICsgc3RhcnRWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFZhbCAhPSBudWxsICYmICFlbmRWYWwuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3RTdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiIEFORCBtZXRhZGF0YV92YWx1ZSA8PSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW5kVmFsICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3RRdWVyeSArPSAiPD0gJyIgKyBlbmRWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2VsZWN0UXVlcnkgKz0gIikgIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUNsYXVzZS5hcHBlbmQoIklOTkVSIEpPSU4gKCIgKyBzdWJTZWxlY3RRdWVyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgc3ViU2VsZWN0VGJsTmFtZSArICIgT04gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdWJTZWxlY3RUYmxOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIucHJvZHVjdF9pZCA9IHAucHJvZHVjdF9pZCAiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ2V0UHJvZHVjdFNxbCA9IHNlbGVjdENsYXVzZS50b1N0cmluZygpICsgZnJvbUNsYXVzZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChnb3RGaXJzdENsYXVzZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3FsICs9IHdoZXJlQ2xhdXNlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiY2F0YWxvZyBnZXQgbnVtIHJlc3VsdHM6IGV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQcm9kdWN0U3FsKTsKKworICAgICAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRQcm9kdWN0U3FsKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q291bnQgPSBycy5nZXRJbnQoIm51bVJlc3VsdHMiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHBlcmZvcm1pbmcgZ2V0IG51bSByZXN1bHRzLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXQgbnVtIHJlc3VsdHMgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhdGFsb2dFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vTW9ja1htbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL01vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODBlOTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL01vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5GaWxlVHJhbnNmZXJTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuRGF0YVRyYW5zZmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LkNvbXBsZXhRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5RdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBBIE1vY2sge0BsaW5rIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50fS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIE1vY2tYbWxScGNGaWxlTWFuYWdlckNsaWVudCBleHRlbmRzIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IHsKKworICAgcHJpdmF0ZSBNZXRob2RDYWxsRGV0YWlscyBsYXN0TWV0aG9kQ2FsbERldGFpbHM7CisKKyAgIHB1YmxpYyBNb2NrWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICBzdXBlcihuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjkwMDAiKSwgZmFsc2UpOworICAgfQorCisgICBwdWJsaWMgTWV0aG9kQ2FsbERldGFpbHMgZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCkgeworICAgICAgcmV0dXJuIGxhc3RNZXRob2RDYWxsRGV0YWlsczsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIGFkZFByb2R1Y3RUeXBlKFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlKSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImFkZFByb2R1Y3RUeXBlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwcm9kdWN0VHlwZSkpOworICAgICAgcmV0dXJuICJQcm9kdWN0VHlwZUlkIjsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldFByb2R1Y3RCeUlkIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwcm9kdWN0SWQpKTsKKyAgICAgIFByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICBwLnNldFByb2R1Y3RJZChwcm9kdWN0SWQpOworICAgICAgcC5zZXRQcm9kdWN0TmFtZSgiVGVzdFByb2R1Y3ROYW1lIik7CisgICAgICBwLnNldFByb2R1Y3RSZWZlcmVuY2VzKExpc3RzLm5ld0FycmF5TGlzdCgKKyAgICAgICAgICAgIG5ldyBSZWZlcmVuY2UoImZpbGU6L29yaWcvZmlsZSIsICJmaWxlOi9kcy9maWxlIiwgMykpKTsKKyAgICAgIHAuc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKyAgICAgIHAuc2V0VHJhbnNmZXJTdGF0dXMoUHJvZHVjdC5TVEFUVVNfUkVDRUlWRUQpOworICAgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgIHB0LnNldE5hbWUoIlRlc3RQcm9kdWN0VHlwZSIpOworICAgICAgcC5zZXRQcm9kdWN0VHlwZShwdCk7CisgICAgICByZXR1cm4gcDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgUHJvZHVjdCBnZXRQcm9kdWN0QnlOYW1lKFN0cmluZyBwcm9kdWN0TmFtZSkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXRQcm9kdWN0QnlOYW1lIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwcm9kdWN0TmFtZSkpOworICAgICAgUHJvZHVjdCBwID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgIHAuc2V0UHJvZHVjdElkKCJUZXN0UHJvZHVjdElkIik7CisgICAgICBwLnNldFByb2R1Y3ROYW1lKHByb2R1Y3ROYW1lKTsKKyAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAgICAgbmV3IFJlZmVyZW5jZSgiZmlsZTovb3JpZy9maWxlIiwgImZpbGU6L2RzL2ZpbGUiLCAzKSkpOworICAgICAgcC5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworICAgICAgcC5zZXRUcmFuc2ZlclN0YXR1cyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCk7CisgICAgICBQcm9kdWN0VHlwZSBwdCA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgcHQuc2V0TmFtZSgiVGVzdFByb2R1Y3RUeXBlIik7CisgICAgICBwLnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICAgIHJldHVybiBwOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldFByb2R1Y3RSZWZlcmVuY2VzIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwcm9kdWN0KSk7CisgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygicmVtb3ZlUHJvZHVjdCIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgcHJvZHVjdCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJyZW1vdmVGaWxlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBmaWxlKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYnl0ZVtdIHJldHJpZXZlRmlsZShTdHJpbmcgZmlsZVBhdGgsIGludCBvZmZzZXQsIGludCBudW1CeXRlcykKKyAgICAgIHRocm93cyBEYXRhVHJhbnNmZXJFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJyZW1vdmVGaWxlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBmaWxlUGF0aCwgb2Zmc2V0LCBudW1CeXRlcykpOworICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBGaWxlVHJhbnNmZXJTdGF0dXMgZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcigpIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0Q3VycmVudEZpbGVUcmFuc2ZlciIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gbmV3IEZpbGVUcmFuc2ZlclN0YXR1cygpOworICAgICAgc3RhdHVzLnNldEJ5dGVzVHJhbnNmZXJyZWQoMTApOworICAgICAgc3RhdHVzLnNldEZpbGVSZWYobmV3IFJlZmVyZW5jZSgiZmlsZTovb3JpZy9maWxlIiwgImZpbGU6L2RzL2ZpbGUiLCA0KSk7CisgICAgICBQcm9kdWN0IHAgPSBuZXcgUHJvZHVjdCgpOworICAgICAgcC5zZXRQcm9kdWN0SWQoIlRlc3RQcm9kdWN0SWQiKTsKKyAgICAgIHN0YXR1cy5zZXRQYXJlbnRQcm9kdWN0KHApOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxGaWxlVHJhbnNmZXJTdGF0dXM+IGdldEN1cnJlbnRGaWxlVHJhbnNmZXJzKCkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXRDdXJyZW50RmlsZVRyYW5zZmVycyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gbmV3IEZpbGVUcmFuc2ZlclN0YXR1cygpOworICAgICAgc3RhdHVzLnNldEJ5dGVzVHJhbnNmZXJyZWQoMTApOworICAgICAgc3RhdHVzLnNldEZpbGVSZWYobmV3IFJlZmVyZW5jZSgiZmlsZTovb3JpZy9maWxlIiwgImZpbGU6L2RzL2ZpbGUiLCA0KSk7CisgICAgICBQcm9kdWN0IHAgPSBuZXcgUHJvZHVjdCgpOworICAgICAgcC5zZXRQcm9kdWN0SWQoIlRlc3RQcm9kdWN0SWQiKTsKKyAgICAgIHN0YXR1cy5zZXRQYXJlbnRQcm9kdWN0KHApOworICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdChzdGF0dXMpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBkb3VibGUgZ2V0UmVmUGN0VHJhbnNmZXJyZWQoUmVmZXJlbmNlIHJlZikgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXRSZWZQY3RUcmFuc2ZlcnJlZCIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgcmVmKSk7CisgICAgICByZXR1cm4gMC42OworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBQcm9kdWN0VHlwZSBnZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldFByb2R1Y3RUeXBlQnlOYW1lIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgICBwdC5zZXROYW1lKHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICByZXR1cm4gcHQ7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3RQYWdlIGdldEZpcnN0UGFnZShQcm9kdWN0VHlwZSB0eXBlKSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldEZpcnN0UGFnZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgdHlwZSkpOworICAgICAgUHJvZHVjdFBhZ2UgcHAgPSBuZXcgUHJvZHVjdFBhZ2UoKTsKKyAgICAgIHBwLnNldE51bU9mSGl0cygwKTsKKyAgICAgIHBwLnNldFBhZ2VQcm9kdWN0cyhuZXcgQXJyYXlMaXN0PFByb2R1Y3Q+KCkpOworICAgICAgcHAuc2V0UGFnZVNpemUoMTApOworICAgICAgcHAuc2V0VG90YWxQYWdlcygwKTsKKyAgICAgIHBwLnNldFBhZ2VOdW0oMSk7CisgICAgICByZXR1cm4gcHA7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFByb2R1Y3RQYWdlIGdldExhc3RQYWdlKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0TGFzdFBhZ2UiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHR5cGUpKTsKKyAgICAgIFByb2R1Y3RQYWdlIHBwID0gbmV3IFByb2R1Y3RQYWdlKCk7CisgICAgICBwcC5zZXROdW1PZkhpdHMoMCk7CisgICAgICBwcC5zZXRQYWdlUHJvZHVjdHMobmV3IEFycmF5TGlzdDxQcm9kdWN0PigpKTsKKyAgICAgIHBwLnNldFBhZ2VTaXplKDEwKTsKKyAgICAgIHBwLnNldFRvdGFsUGFnZXMoMCk7CisgICAgICBwcC5zZXRQYWdlTnVtKDEpOworICAgICAgcmV0dXJuIHBwOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXROZXh0UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJQYWdlKSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldE5leHRQYWdlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB0eXBlLCBjdXJQYWdlKSk7CisgICAgICBQcm9kdWN0UGFnZSBwcCA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgcHAuc2V0TnVtT2ZIaXRzKDApOworICAgICAgcHAuc2V0UGFnZVByb2R1Y3RzKG5ldyBBcnJheUxpc3Q8UHJvZHVjdD4oKSk7CisgICAgICBwcC5zZXRQYWdlU2l6ZSgxMCk7CisgICAgICBwcC5zZXRUb3RhbFBhZ2VzKDApOworICAgICAgcHAuc2V0UGFnZU51bShjdXJQYWdlLmdldFBhZ2VOdW0oKSArIDEpOworICAgICAgcmV0dXJuIHBwOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBQcm9kdWN0UGFnZSBnZXRQcmV2UGFnZShQcm9kdWN0VHlwZSB0eXBlLCBQcm9kdWN0UGFnZSBjdXJQYWdlKSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldFByZXZQYWdlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB0eXBlLCBjdXJQYWdlKSk7CisgICAgICBQcm9kdWN0UGFnZSBwcCA9IG5ldyBQcm9kdWN0UGFnZSgpOworICAgICAgcHAuc2V0TnVtT2ZIaXRzKDApOworICAgICAgcHAuc2V0UGFnZVByb2R1Y3RzKG5ldyBBcnJheUxpc3Q8UHJvZHVjdD4oKSk7CisgICAgICBwcC5zZXRQYWdlU2l6ZSgxMCk7CisgICAgICBwcC5zZXRUb3RhbFBhZ2VzKDApOworICAgICAgcHAuc2V0UGFnZU51bShjdXJQYWdlLmdldFBhZ2VOdW0oKSAtIDEpOworICAgICAgcmV0dXJuIHBwOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBpbnQgZ2V0TnVtUHJvZHVjdHMoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXROdW1Qcm9kdWN0cyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgdHlwZSkpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGRvdWJsZSBnZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldFByb2R1Y3RQY3RUcmFuc2ZlcnJlZCIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgcHJvZHVjdCkpOworICAgICAgcmV0dXJuIDAuNjsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9kdWN0KFN0cmluZyBwcm9kdWN0TmFtZSkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJoYXNQcm9kdWN0IiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwcm9kdWN0TmFtZSkpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFN0cmluZyBpbmdlc3RQcm9kdWN0KFByb2R1Y3QgcCwgTWV0YWRhdGEgbSwgYm9vbGVhbiBjbGllbnRUcmFuc2ZlcikgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJpbmdlc3RQcm9kdWN0IiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBwLCBtLCBjbGllbnRUcmFuc2ZlcikpOworICAgICAgcmV0dXJuICJUZXN0UHJvZHVjdElkIjsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxQcm9kdWN0VHlwZT4gZ2V0UHJvZHVjdFR5cGVzKCkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXRQcm9kdWN0VHlwZXMiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KCkpOworICAgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICAgIHB0LnNldE5hbWUoIlRlc3RQcm9kdWN0VHlwZSIpOworICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdChwdCk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIExpc3Q8UXVlcnlSZXN1bHQ+IGNvbXBsZXhRdWVyeShDb21wbGV4UXVlcnkgcXVlcnkpIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiY29tcGxleFF1ZXJ5IiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBxdWVyeSkpOworICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YShQcm9kdWN0IHApIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0TWV0YWRhdGEiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHApKTsKKyAgICAgIHJldHVybiBuZXcgTWV0YWRhdGEoKTsKKyAgIH0KKworICAgcHVibGljIGNsYXNzIE1ldGhvZENhbGxEZXRhaWxzIHsKKyAgICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7CisgICAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiBhcmdzOworCisgICAgICBwdWJsaWMgTWV0aG9kQ2FsbERldGFpbHMoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3Q8T2JqZWN0PiBhcmdzKSB7CisgICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICAgICAgICAgdGhpcy5hcmdzID0gYXJnczsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0QXJncygpIHsKKyAgICAgICAgIHJldHVybiBhcmdzOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3N5c3RlbS9UZXN0WG1sUnBjRmlsZU1hbmFnZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vVGVzdFhtbFJwY0ZpbGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2YzMzZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vVGVzdFhtbFJwY0ZpbGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzMDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLlByb2R1Y3RNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciB0aGUgWG1sUnBjRmlsZU1hbmFnZXIuCisgKiAKKyAqIEBzaW5jZSBPT0RULTcyCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RYbWxScGNGaWxlTWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk1fUE9SVCA9IDUwMDAxOworCisgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXIgZm07CisKKyAgcHJpdmF0ZSBTdHJpbmcgbHVjZW5lQ2F0TG9jOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmFuc2ZlclNlcnZpY2VGYWNDbGFzcyA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLiIKKyAgICAgICsgImZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSI7CisKKyAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGluaXRpYWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoCisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAvKioKKyAgICogQHNpbmNlIE9PRFQtNzIKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRQcm9kdWN0TWV0KCkgeworICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtYyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGZtYyA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIE1ldGFkYXRhIG1ldCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIG1ldCA9IGZtYy5nZXRNZXRhZGF0YShmbWMuZ2V0UHJvZHVjdEJ5TmFtZSgidGVzdC50eHQiKSk7CisgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0Tm90TnVsbChtZXQpOworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfSUQpKTsKKyAgICBhc3NlcnROb3ROdWxsKG1ldC5nZXRNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX0lEKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9OQU1FKSk7CisgICAgYXNzZXJ0Tm90TnVsbChtZXQuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9OQU1FKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9TVFJVQ1RVUkUpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkZsYXQiLCBtZXQuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9TVFJVQ1RVUkUpKTsKKyAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX1RSQU5TRkVSX1NUQVRVUykpOworICAgIGFzc2VydEVxdWFscyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCwgbWV0CisgICAgICAgIC5nZXRNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX1RSQU5TRkVSX1NUQVRVUykpOworCisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9PUklHX1JFRlMpKTsKKyAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX0RBVEFTVE9SRV9SRUZTKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9GSUxFX1NJWkVTKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9NSU1FX1RZUEVTKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgbWV0LmdldEFsbE1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfT1JJR19SRUZTKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygxLCBtZXQuZ2V0QWxsTWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9EQVRBU1RPUkVfUkVGUykKKyAgICAgICAgLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX0ZJTEVfU0laRVMpCisgICAgICAgIC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygxLCBtZXQuZ2V0QWxsTWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9NSU1FX1RZUEVTKQorICAgICAgICAuc2l6ZSgpKTsKKworICAgIFVSTCByZWZVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvdGVzdC50eHQiKTsKKworICAgIFN0cmluZyBvcmlnUGF0aCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIG9yaWdQYXRoID0gbmV3IEZpbGUocmVmVXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMob3JpZ1BhdGgsIG1ldC5nZXRNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX09SSUdfUkVGUykpOworICAgIGFzc2VydEVxdWFscygiL3RtcC90ZXN0LnR4dC90ZXN0LnR4dCIsIG1ldAorICAgICAgICAuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9EQVRBU1RPUkVfUkVGUykpOworCisgICAgYXNzZXJ0Tm90TnVsbChtZXQuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9GSUxFX1NJWkVTKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgbWV0CisgICAgICAgIC5nZXRNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX01JTUVfVFlQRVMpKTsKKworICAgIHRyeSB7CisgICAgICBtZXQgPSBmbWMuZ2V0UmVkdWNlZE1ldGFkYXRhKGZtYy5nZXRQcm9kdWN0QnlOYW1lKCJ0ZXN0LnR4dCIpLAorICAgICAgICAgIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwobWV0KTsKKyAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX0lEKSk7CisgICAgYXNzZXJ0Tm90TnVsbChtZXQuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9JRCkpOworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfTkFNRSkpOworICAgIGFzc2VydE5vdE51bGwobWV0LmdldE1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfTkFNRSkpOworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfU1RSVUNUVVJFKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJGbGF0IiwgbWV0LmdldE1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfU1RSVUNUVVJFKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9UUkFOU0ZFUl9TVEFUVVMpKTsKKyAgICBhc3NlcnRFcXVhbHMoUHJvZHVjdC5TVEFUVVNfUkVDRUlWRUQsIG1ldAorICAgICAgICAuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9UUkFOU0ZFUl9TVEFUVVMpKTsKKworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfT1JJR19SRUZTKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9EQVRBU1RPUkVfUkVGUykpOworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfRklMRV9TSVpFUykpOworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfTUlNRV9UWVBFUykpOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX09SSUdfUkVGUykuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbWV0LmdldEFsbE1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfREFUQVNUT1JFX1JFRlMpCisgICAgICAgIC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygxLCBtZXQuZ2V0QWxsTWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9GSUxFX1NJWkVTKQorICAgICAgICAuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbWV0LmdldEFsbE1ldGFkYXRhKFByb2R1Y3RNZXRLZXlzLlBST0RVQ1RfTUlNRV9UWVBFUykKKyAgICAgICAgLnNpemUoKSk7CisKKyAgICBvcmlnUGF0aCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIG9yaWdQYXRoID0gbmV3IEZpbGUocmVmVXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMob3JpZ1BhdGgsIG1ldC5nZXRNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX09SSUdfUkVGUykpOworICAgIGFzc2VydEVxdWFscygiL3RtcC90ZXN0LnR4dC90ZXN0LnR4dCIsIG1ldAorICAgICAgICAuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9EQVRBU1RPUkVfUkVGUykpOworCisgICAgYXNzZXJ0Tm90TnVsbChtZXQuZ2V0TWV0YWRhdGEoUHJvZHVjdE1ldEtleXMuUFJPRFVDVF9GSUxFX1NJWkVTKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgbWV0CisgICAgICAgIC5nZXRNZXRhZGF0YShQcm9kdWN0TWV0S2V5cy5QUk9EVUNUX01JTUVfVFlQRVMpKTsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdGFydFhtbFJwY0ZpbGVNYW5hZ2VyKCk7CisgICAgaW5nZXN0VGVzdEZpbGUoKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm0uc2h1dGRvd24oKTsKKyAgICBmbSA9IG51bGw7CisKKyAgICAvLyBibG93IGF3YXkgbHVjZW5lIGNhdAorICAgIGRlbGV0ZUFsbEZpbGVzKGx1Y2VuZUNhdExvYyk7CisKKyAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgZGVsZXRlQWxsRmlsZXMoIi90bXAvdGVzdC50eHQiKTsKKworICAgIC8vIFJlc2V0IHRoZSBTeXN0ZW0gcHJvcGVydGllcyB0byBpbml0aWFsIHZhbHVlcy4KKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGVsZXRlQWxsRmlsZXMoU3RyaW5nIHN0YXJ0RGlyKSB7CisgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgRmlsZVtdIGRlbEZpbGVzID0gc3RhcnREaXJGaWxlLmxpc3RGaWxlcygpOworCisgICAgaWYgKGRlbEZpbGVzICE9IG51bGwgJiYgZGVsRmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBkZWxGaWxlc1tpXS5kZWxldGUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbmdlc3RUZXN0RmlsZSgpIHsKKyAgICBNZXRhZGF0YSBwcm9kTWV0ID0gbnVsbDsKKyAgICBTdGRJbmdlc3RlciBpbmdlc3RlciA9IG5ldyBTdGRJbmdlc3Rlcih0cmFuc2ZlclNlcnZpY2VGYWNDbGFzcyk7CisKKyAgICB0cnkgeworICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgVVJMIHJlZlVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dCIpOworICAgICAgVVJMIG1ldFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dC5tZXQiKTsKKworICAgICAgcHJvZE1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICBuZXcgRmlsZShtZXRVcmwuZ2V0RmlsZSgpKSkpOworCisgICAgICAvLyBub3cgYWRkIHRoZSByaWdodCBmaWxlIGxvY2F0aW9uCisgICAgICBwcm9kTWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVfTE9DQVRJT04sIG5ldyBGaWxlKAorICAgICAgICBpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgInRlc3QudHh0Iik7CisgICAgICBwcm9kTWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLlBST0RVQ1RfVFlQRSwgIkdlbmVyaWNGaWxlIik7CisgICAgICBpbmdlc3Rlci5pbmdlc3QobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVCksIG5ldyBGaWxlKAorICAgICAgICByZWZVcmwuZ2V0RmlsZSgpKSwgcHJvZE1ldCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdGFydFhtbFJwY0ZpbGVNYW5hZ2VyKCkgeworCisgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgLy8gYW5kIG1ha2Ugc3VyZSB0byBsb2FkIGxvZ2dpbmcgcHJvcGVydGllcyBhcyB3ZWxsCisKKyAgICAvLyBzZXQgdGhlIGxvZyBsZXZlbHMKKyAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiLCBuZXcgRmlsZSgKKyAgICAgIGxvZ2dpbmdQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgLy8gZmlyc3QgbG9hZCB0aGUgZXhhbXBsZSBjb25maWd1cmF0aW9uCisgICAgdHJ5IHsKKyAgICAgIFVSTCBmaWxlbWdyUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgIi9maWxlbWdyLnByb3BlcnRpZXMiKTsKKyAgICAgIHByb3BlcnRpZXMubG9hZCgKKyAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmaWxlbWdyUHJvcGVydGllc1VybC5nZXRGaWxlKCkpKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlIHRoZSBjYXRhbG9nIHRvIHVzZTogd2UnbGwgdXNlIGx1Y2VuZQorICAgIHRyeSB7CisgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICBsdWNlbmVDYXRMb2MgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkgKyAiL2NhdCI7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImZpbGVtZ3IuY2F0YWxvZy5mYWN0b3J5IiwKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5Iik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLmlkeFBhdGgiLAorICAgICAgICBsdWNlbmVDYXRMb2MpOworCisgICAgLy8gbm93IG92ZXJyaWRlIHRoZSByZXBvIG1nciBwb2xpY3kKKyAgICBVUkwgZm1wb2xpY3lVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvZm1wb2xpY3kiKTsKKyAgICB0cnkgeworICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIsCisgICAgICAgICJmaWxlOi8vIiArIG5ldyBGaWxlKGZtcG9saWN5VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLy8gbm93IG92ZXJyaWRlIHRoZSB2YWwgbGF5ZXIgb25lcworICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRpcnMiLAorICAgICAgImZpbGU6Ly8iICsgbmV3IEZpbGUoZm1wb2xpY3lVcmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAvLyBzZXQgdXAgbWltZSByZXBvIHBhdGgKKyAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLAorICAgICAgbmV3IEZpbGUobWltZVR5cGVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgLy8gb3ZlcnJpZGUgZXhwYW5kIHByb2R1Y3QgbWV0CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4cGFuZFByb2R1Y3QiLAorICAgICAgInRydWUiKTsKKworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisgICAgdHJ5IHsKKyAgICAgIGZtID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyKEZNX1BPUlQpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci9zeXN0ZW0vVGVzdFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL1Rlc3RYbWxScGNGaWxlTWFuYWdlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMGFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivc3lzdGVtL1Rlc3RYbWxScGNGaWxlTWFuYWdlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5Db21wbGV4UXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuU3FsUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnR9CisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZNX1BPUlQgPSA1MDAwMTsKKworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXIgZm07CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgbHVjZW5lQ2F0TG9jOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYW5zZmVyU2VydmljZUZhY0NsYXNzID0gIm9yZy5hcGFjaGUub29kdC5jYXMuIgorICAgICAgICAgICAgKyAiZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKAorICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICBwdWJsaWMgVGVzdFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KCkgeworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTE2MQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZWR1Y2VkTWV0YWRhdGEoKSB7CisgICAgICAgIExpc3QgYXJyYXlMaXN0RWxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIExpc3QgdmVjdG9yRWxlbUxpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIExpc3QgbGlua2VkTGlzdEVsZW1MaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgICAgICBhcnJheUxpc3RFbGVtcy5hZGQoQ29yZU1ldEtleXMuRklMRU5BTUUpOworICAgICAgICB2ZWN0b3JFbGVtTGlzdC5hZGQoQ29yZU1ldEtleXMuRklMRU5BTUUpOworICAgICAgICBsaW5rZWRMaXN0RWxlbUxpc3QuYWRkKENvcmVNZXRLZXlzLkZJTEVOQU1FKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1jID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1ldGFkYXRhIHJlZHVjZWRNZXQgPSBudWxsOworICAgICAgICAgICAgTGlzdCBwVHlwZXMgPSBmbWMuZ2V0UHJvZHVjdFR5cGVzKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBUeXBlcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBUeXBlcy5zaXplKCkgPiAwKTsKKyAgICAgICAgICAgIFByb2R1Y3RUeXBlIGdlbmVyaWNGaWxlVHlwZSA9IGZtYy5nZXRQcm9kdWN0VHlwZUJ5TmFtZSgiR2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ2VuZXJpY0ZpbGVUeXBlKTsKKyAgICAgICAgICAgIExpc3QgcHJvZHVjdHMgPSBmbWMuZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKGdlbmVyaWNGaWxlVHlwZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByb2R1Y3RzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocHJvZHVjdHMuc2l6ZSgpID4gMCk7CisgICAgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSAoUHJvZHVjdCkgcHJvZHVjdHMuZ2V0KDApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9kdWN0KTsKKworICAgICAgICAgICAgcmVkdWNlZE1ldCA9IGZtYy5nZXRSZWR1Y2VkTWV0YWRhdGEocHJvZHVjdCwgYXJyYXlMaXN0RWxlbXMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWR1Y2VkTWV0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVkdWNlZE1ldC5jb250YWluc0tleShDb3JlTWV0S2V5cy5GSUxFTkFNRSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZHVjZWRNZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkuc2l6ZSgpLCAxKTsKKworICAgICAgICAgICAgcmVkdWNlZE1ldCA9IGZtYy5nZXRSZWR1Y2VkTWV0YWRhdGEocHJvZHVjdCwgdmVjdG9yRWxlbUxpc3QpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWR1Y2VkTWV0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVkdWNlZE1ldC5jb250YWluc0tleShDb3JlTWV0S2V5cy5GSUxFTkFNRSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZHVjZWRNZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkuc2l6ZSgpLCAxKTsKKworICAgICAgICAgICAgcmVkdWNlZE1ldCA9IGZtYy5nZXRSZWR1Y2VkTWV0YWRhdGEocHJvZHVjdCwgbGlua2VkTGlzdEVsZW1MaXN0KTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVkdWNlZE1ldCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlZHVjZWRNZXQuY29udGFpbnNLZXkoQ29yZU1ldEtleXMuRklMRU5BTUUpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZWR1Y2VkTWV0LmdldEhhc2h0YWJsZSgpLmtleVNldCgpLnNpemUoKSwgMSk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9ZmluYWxseSB7CisgICAgICAgICAgICBmbS5zaHV0ZG93bigpOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEluZ2VzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgIFVSTCByZWZVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvdGVzdC50eHQiKTsKKworICAgICAgICBNZXRhZGF0YSBwcm9kTWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTiwgbmV3IEZpbGUoCisgICAgICAgICAgaW5nZXN0VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgInRlc3QudHh0Iik7CisgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuUFJPRFVDVF9OQU1FLCAiVGVzdEZpbGUiKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX1RZUEUsICJHZW5lcmljRmlsZSIpOworCisgICAgICAgIFN0ZEluZ2VzdGVyIGluZ2VzdGVyID0gbmV3IFN0ZEluZ2VzdGVyKHRyYW5zZmVyU2VydmljZUZhY0NsYXNzKTsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IGluZ2VzdGVyLmluZ2VzdCgKKyAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSwKKyAgICAgICAgICBuZXcgRmlsZShyZWZVcmwuZ2V0RmlsZSgpKSwgcHJvZE1ldCk7CisgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtYyA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKAorICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSk7CisgICAgICAgIE1ldGFkYXRhIG0gPSBmbWMuZ2V0TWV0YWRhdGEoZm1jLmdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobS5nZXRNZXRhZGF0YSgiRmlsZW5hbWUiKSwgInRlc3QudHh0Iik7CisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKCIvdG1wL3Rlc3QtdHlwZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTQwNAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhUGVyc2lzdGVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgICBVUkwgcmVmVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QtZmlsZS0zLnR4dCIpOworICAgICAgICBVUkwgbWV0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QtZmlsZS0zLnR4dC5tZXQiKTsKKworICAgICAgICBNZXRhZGF0YSBwcm9kTWV0ID0gbnVsbDsKKyAgICAgICAgU3RkSW5nZXN0ZXIgaW5nZXN0ZXIgPSBuZXcgU3RkSW5nZXN0ZXIodHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MpOworICAgICAgICBwcm9kTWV0ID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBtZXRVcmwuZ2V0RmlsZSgpKSk7CisgICAgICAgIC8vIG5vdyBhZGQgdGhlIHJpZ2h0IGZpbGUgbG9jYXRpb24KKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLCBuZXcgRmlsZSgKKyAgICAgICAgICAgIGluZ2VzdFVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIFN0cmluZyBwcm9kdWN0SWQgPSBpbmdlc3Rlci5pbmdlc3QoCisgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSwKKyAgICAgICAgICAgIG5ldyBGaWxlKHJlZlVybC5nZXRGaWxlKCkpLCBwcm9kTWV0KTsKKyAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1jID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoCisgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgTWV0YWRhdGEgbSA9IGZtYy5nZXRNZXRhZGF0YShmbWMuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLmdldEFsbE1ldGFkYXRhKCJUZXN0RWxlbWVudCIpLnNpemUoKSwgNCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLmdldE1ldGFkYXRhKCJUZXN0RWxlbWVudCIpLCAiZmUiKTsKKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFVSTCBpbmdlc3RVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QiKTsKKyAgICAgICAgVVJMIHJlZlVybDEgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvdGVzdC1maWxlLTEudHh0Iik7CisgICAgICAgIFVSTCByZWZVcmwyID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L3Rlc3QtZmlsZS0yLnR4dCIpOworCisgICAgICAgIFN0ZEluZ2VzdGVyIGluZ2VzdGVyID0gbmV3IFN0ZEluZ2VzdGVyKHRyYW5zZmVyU2VydmljZUZhY0NsYXNzKTsKKworICAgICAgICAvL2luZ2VzdCBmaXJzdCBmaWxlCisgICAgICAgIE1ldGFkYXRhIHByb2RNZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLCBuZXcgRmlsZSgKKyAgICAgICAgICAgIGluZ2VzdFVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUsICJ0ZXN0LWZpbGUtMS50eHQiKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX05BTUUsICJUZXN0RmlsZTEiKTsKKyAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX1RZUEUsICJHZW5lcmljRmlsZSIpOworICAgICAgICBpbmdlc3Rlci5pbmdlc3QobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVCksIG5ldyBGaWxlKAorICAgICAgICAgICAgcmVmVXJsMS5nZXRGaWxlKCkpLCBwcm9kTWV0KTsgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy9pbmdlc3Qgc2Vjb25kIGZpbGUKKyAgICAgICAgcHJvZE1ldC5yZXBsYWNlTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUsICJ0ZXN0LWZpbGUtMi50eHQiKTsKKyAgICAgICAgcHJvZE1ldC5yZXBsYWNlTWV0YWRhdGEoQ29yZU1ldEtleXMuUFJPRFVDVF9OQU1FLCAiVGVzdEZpbGUyIik7CisgICAgICAgIGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSwgbmV3IEZpbGUoCisgICAgICAgICAgICByZWZVcmwyLmdldEZpbGUoKSksIHByb2RNZXQpOyAgIAorICAgICAgICAKKyAgICAgICAgLy9wZXJmb3JtIGNvbXBsZXggcXVlcnkKKyAgICAgICAgQ29tcGxleFF1ZXJ5IGNvbXBsZXhRdWVyeSA9IG5ldyBDb21wbGV4UXVlcnkoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlZHVjZWRNZXRhZGF0YSA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICByZWR1Y2VkTWV0YWRhdGEuYWRkKENvcmVNZXRLZXlzLkZJTEVOQU1FKTsKKyAgICAgICAgY29tcGxleFF1ZXJ5LnNldFJlZHVjZWRNZXRhZGF0YShyZWR1Y2VkTWV0YWRhdGEpOworICAgICAgICBMaXN0PFN0cmluZz4gcHJvZHVjdFR5cGVOYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBwcm9kdWN0VHlwZU5hbWVzLmFkZCgiR2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgY29tcGxleFF1ZXJ5LnNldFJlZHVjZWRQcm9kdWN0VHlwZU5hbWVzKHByb2R1Y3RUeXBlTmFtZXMpOworICAgICAgICBjb21wbGV4UXVlcnkuc2V0U29ydEJ5TWV0S2V5KENvcmVNZXRLZXlzLkZJTEVOQU1FKTsKKyAgICAgICAgY29tcGxleFF1ZXJ5LnNldFRvU3RyaW5nUmVzdWx0Rm9ybWF0KCIkIiArIENvcmVNZXRLZXlzLkZJTEVOQU1FKTsKKyAgICAgICAgY29tcGxleFF1ZXJ5LmFkZENyaXRlcmlvbihTcWxQYXJzZXIucGFyc2VTcWxXaGVyZUNsYXVzZSgiRmlsZW5hbWUgIT0gJ3Rlc3QudHh0JyIpKTsKKyAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1jID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoCisgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpKTsKKyAgICAgICAgTGlzdDxRdWVyeVJlc3VsdD4gcXVlcnlSZXN1bHRzID0gZm1jLmNvbXBsZXhRdWVyeShjb21wbGV4UXVlcnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt0ZXN0LWZpbGUtMS50eHQsIHRlc3QtZmlsZS0yLnR4dF0iLCBxdWVyeVJlc3VsdHMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0WG1sUnBjRmlsZU1hbmFnZXIoKTsKKyAgICAgICAgaW5nZXN0VGVzdEZpbGUoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm0uc2h1dGRvd24oKTsKKyAgICAgICAgZm0gPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gYmxvdyBhd2F5IGx1Y2VuZSBjYXQKKyAgICAgICAgZGVsZXRlQWxsRmlsZXMobHVjZW5lQ2F0TG9jKTsKKworICAgICAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKCIvdG1wL3Rlc3QudHh0Iik7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIFN5c3RlbSBwcm9wZXJ0aWVzIHRvIGluaXRpYWwgdmFsdWVzLgorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBzdGFydERpcikgeworICAgICAgICBGaWxlIHN0YXJ0RGlyRmlsZSA9IG5ldyBGaWxlKHN0YXJ0RGlyKTsKKyAgICAgICAgRmlsZVtdIGRlbEZpbGVzID0gc3RhcnREaXJGaWxlLmxpc3RGaWxlcygpOworCisgICAgICAgIGlmIChkZWxGaWxlcyAhPSBudWxsICYmIGRlbEZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWxGaWxlc1tpXS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0RGlyRmlsZS5kZWxldGUoKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbmdlc3RUZXN0RmlsZSgpIHsKKyAgICAgICAgTWV0YWRhdGEgcHJvZE1ldCA9IG51bGw7CisgICAgICAgIFN0ZEluZ2VzdGVyIGluZ2VzdGVyID0gbmV3IFN0ZEluZ2VzdGVyKHRyYW5zZmVyU2VydmljZUZhY0NsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgICAgICAgVVJMIHJlZlVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dCIpOworICAgICAgICAgICAgVVJMIG1ldFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dC5tZXQiKTsKKworICAgICAgICAgICAgcHJvZE1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1ldFVybC5nZXRGaWxlKCkpKSk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhlIHJpZ2h0IGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgaW5nZXN0VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRU5BTUUsICJ0ZXN0LnR4dCIpOworICAgICAgICAgICAgcHJvZE1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX1RZUEUsICJHZW5lcmljRmlsZSIpOworICAgICAgICAgICAgaW5nZXN0ZXIuaW5nZXN0KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZNX1BPUlQpLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICByZWZVcmwuZ2V0RmlsZSgpKSwgcHJvZE1ldCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFhtbFJwY0ZpbGVNYW5hZ2VyKCkgeworCisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0byBsb2FkIHByb3BlcnRpZXMgZm9yIHRoZSBmaWxlIG1hbmFnZXIKKyAgICAgICAgLy8gYW5kIG1ha2Ugc3VyZSB0byBsb2FkIGxvZ2dpbmcgcHJvcGVydGllcyBhcyB3ZWxsCisKKyAgICAgICAgLy8gc2V0IHRoZSBsb2cgbGV2ZWxzCisgICAgICAgIFVSTCBsb2dnaW5nUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXMiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiLCBuZXcgRmlsZSgKKyAgICAgICAgICAgIGxvZ2dpbmdQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIGZpcnN0IGxvYWQgdGhlIGV4YW1wbGUgY29uZmlndXJhdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZpbGVtZ3JQcm9wZXJ0aWVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmaWxlbWdyUHJvcGVydGllc1VybC5nZXRGaWxlKCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBjYXRhbG9nIHRvIHVzZTogd2UnbGwgdXNlIGx1Y2VuZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgICAgICAgbHVjZW5lQ2F0TG9jID0gbmV3IEZpbGUoaW5nZXN0VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpCisgICAgICAgICAgICAgICAgKyAiL2NhdCI7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImZpbGVtZ3IuY2F0YWxvZy5mYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLmlkeFBhdGgiLAorICAgICAgICAgICAgICAgIGx1Y2VuZUNhdExvYyk7CisKKyAgICAgICAgLy8gbm93IG92ZXJyaWRlIHRoZSByZXBvIG1nciBwb2xpY3kKKyAgICAgICAgVVJMIGZtcG9saWN5VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0L2ZtcG9saWN5Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzIiwKKyAgICAgICAgICAgICAgICAiZmlsZTovLyIgKyBuZXcgRmlsZShmbXBvbGljeVVybC5nZXRGaWxlKCkpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgdmFsIGxheWVyIG9uZXMKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycyIsCisgICAgICAgICAgICAiZmlsZTovLyIgKyBuZXcgRmlsZShmbXBvbGljeVVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBzZXQgdXAgbWltZSByZXBvIHBhdGgKKyAgICAgICAgVVJMIG1pbWVUeXBlc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL21pbWUtdHlwZXMueG1sIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgICAgIG5ldyBGaWxlKG1pbWVUeXBlc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm0gPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXIoRk1fUE9SVCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Rlc3RFeHBJbXBDYXRhbG9nLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdG9vbHMvVGVzdEV4cEltcENhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IwN2UwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Rlc3RFeHBJbXBDYXRhbG9nLmphdmEKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuU3RkSW5nZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RXhwSW1wQ2F0YWxvZyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTV9QT1JUID0gNTAwMTA7CisKKyAgICBwcml2YXRlIFhtbFJwY0ZpbGVNYW5hZ2VyIGZtOworCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlciBmbTI7CisKKyAgICBwcml2YXRlIEV4cEltcENhdGFsb2cgZXhwSW1wOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYW5zZmVyU2VydmljZUZhY0NsYXNzID0gIm9yZy5hcGFjaGUub29kdC5jYXMuIgorICAgICAgICAgICAgKyAiZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKAorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgIHB1YmxpYyBUZXN0RXhwSW1wQ2F0YWxvZygpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEVuc3VyZVVuaXF1ZU9uKCl7CisgICAgICAgIGV4cEltcC5zZXRFbnN1cmVVbmlxdWUodHJ1ZSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwSW1wLmRvRXhwSW1wb3J0KCk7CisgICAgICAgICAgICBleHBJbXAuZG9FeHBJbXBvcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgMSBwcm9kdWNzIGV4aXN0IGluIHRoZSBjYXRhbG9nLCBhbmQgdGhhdAorICAgICAgICAvLyBpdHMgbmFtZSBpcyB0ZXN0LnR4dAorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyAoRk1fUE9SVCArIDEpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZm1DbGllbnQuZ2V0TnVtUHJvZHVjdHMoZm1DbGllbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlQnlOYW1lKCJHZW5lcmljRmlsZSIpKSk7CisKKyAgICAgICAgICAgIExpc3QgcHJvZHMgPSBmbUNsaWVudC5nZXRQcm9kdWN0c0J5UHJvZHVjdFR5cGUoZm1DbGllbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlQnlOYW1lKCJHZW5lcmljRmlsZSIpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvZHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb2RzLnNpemUoKSk7CisKKyAgICAgICAgICAgIGludCBjb3VudFByb2RzID0gMDsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUHJvZHVjdCBwID0gKFByb2R1Y3QpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChwLmdldFByb2R1Y3ROYW1lKCkuZXF1YWxzKCJ0ZXN0LnR4dCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50UHJvZHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjb3VudFByb2RzKTsKKyAgICAgICAgICAgIGZtQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuc3VyZVVuaXF1ZU9mZigpIHsKKyAgICAgICAgZXhwSW1wLnNldEVuc3VyZVVuaXF1ZShmYWxzZSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwSW1wLmRvRXhwSW1wb3J0KCk7CisgICAgICAgICAgICBleHBJbXAuZG9FeHBJbXBvcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgMiBwcm9kdWNzIGV4aXN0IGluIHRoZSBjYXRhbG9nLCBhbmQgdGhhdAorICAgICAgICAvLyBib3RoIG9mIHRoZWlyIG5hbWVzIGFyZSB0ZXN0LnR4dAorCisgICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgdGVzdC50eHQgZXhpc3RzIGluIGNhdCAyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgKEZNX1BPUlQgKyAxKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZtQ2xpZW50LmdldE51bVByb2R1Y3RzKGZtQ2xpZW50CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUJ5TmFtZSgiR2VuZXJpY0ZpbGUiKSkpOworCisgICAgICAgICAgICBMaXN0IHByb2RzID0gZm1DbGllbnQuZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKGZtQ2xpZW50CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZUJ5TmFtZSgiR2VuZXJpY0ZpbGUiKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByb2RzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBwcm9kcy5zaXplKCkpOworCisgICAgICAgICAgICBpbnQgY291bnRQcm9kcyA9IDA7CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFByb2R1Y3QgcCA9IChQcm9kdWN0KSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAocC5nZXRQcm9kdWN0TmFtZSgpLmVxdWFscygidGVzdC50eHQiKSkgeworICAgICAgICAgICAgICAgICAgICBjb3VudFByb2RzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRQcm9kcyk7CisgICAgICAgICAgICBmbUNsaWVudCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBJbXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHBJbXAuZG9FeHBJbXBvcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgdGVzdC50eHQgZXhpc3RzIGluIGNhdCAyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgKEZNX1BPUlQgKyAxKSkpOworICAgICAgICAgICAgUHJvZHVjdCBwcm9kID0gZm1DbGllbnQuZ2V0UHJvZHVjdEJ5TmFtZSgidGVzdC50eHQiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvZCk7CisgICAgICAgICAgICBNZXRhZGF0YSBtZXQgPSBmbUNsaWVudC5nZXRNZXRhZGF0YShwcm9kKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KENvcmVNZXRLZXlzLlBST0RVQ1RfU1RSVUNUVVJFKSk7CisgICAgICAgICAgICBwcm9kLnNldFByb2R1Y3RSZWZlcmVuY2VzKGZtQ2xpZW50LmdldFByb2R1Y3RSZWZlcmVuY2VzKHByb2QpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvZC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBwcm9kLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZtQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Qgc2V0IHVwIik7CisgICAgICAgIFVSTCBpbmdlc3RVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QiKTsKKyAgICAgICAgU3RyaW5nIGNhdDEgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkgKyAiY2F0IjsKKyAgICAgICAgU3RyaW5nIGNhdDIgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkgKyAiY2F0MiI7CisgICAgICAgIGZtID0gc3RhcnRYbWxScGNGaWxlTWFuYWdlcihGTV9QT1JULCBjYXQxKTsKKyAgICAgICAgZm0yID0gc3RhcnRYbWxScGNGaWxlTWFuYWdlcihGTV9QT1JUICsgMSwgY2F0Mik7CisgICAgICAgIGluZ2VzdFRlc3RGaWxlcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwSW1wID0gbmV3IEV4cEltcENhdGFsb2cobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIChGTV9QT1JUICsgMSkpLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmbS5zaHV0ZG93bigpOworICAgICAgICBmbSA9IG51bGw7CisgICAgICAgIGZtMi5zaHV0ZG93bigpOworICAgICAgICBmbTIgPSBudWxsOworCisgICAgICAgIC8vIGJsb3cgYXdheSBsdWNlbmUgY2F0CisgICAgICAgIFVSTCBpbmdlc3RVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QiKTsKKyAgICAgICAgU3RyaW5nIGNhdDEgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkgKyAiY2F0IjsKKyAgICAgICAgU3RyaW5nIGNhdDIgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkgKyAiY2F0MiI7CisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKGNhdDEpOworICAgICAgICBkZWxldGVBbGxGaWxlcyhjYXQyKTsKKworICAgICAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgICAgIGRlbGV0ZUFsbEZpbGVzKCIvdG1wL3Rlc3QudHh0Iik7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIFN5c3RlbSBwcm9wZXJ0aWVzIHRvIGluaXRpYWwgdmFsdWVzLgorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluZ2VzdFRlc3RGaWxlcygpIHsKKyAgICAgICAgTWV0YWRhdGEgcHJvZE1ldCA9IG51bGw7CisgICAgICAgIFN0ZEluZ2VzdGVyIGluZ2VzdGVyID0gbmV3IFN0ZEluZ2VzdGVyKHRyYW5zZmVyU2VydmljZUZhY0NsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgICAgICAgVVJMIHJlZlVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dCIpOworICAgICAgICAgICAgVVJMIG1ldFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dC5tZXQiKTsKKworICAgICAgICAgICAgcHJvZE1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1ldFVybC5nZXRGaWxlKCkpKSk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhlIHJpZ2h0IGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgaW5nZXN0VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgIGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgcmVmVXJsLmdldEZpbGUoKSksIHByb2RNZXQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcm9kTWV0LnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5QUk9EVUNUX05BTUUsICJUZXN0VHlwZUZpbGUiKTsKKyAgICAgICAgICAgIHByb2RNZXQucmVwbGFjZU1ldGFkYXRhKENvcmVNZXRLZXlzLlBST0RVQ1RfVFlQRSwgIlRlc3RUeXBlIik7CisgICAgICAgICAgICBpbmdlc3Rlci5pbmdlc3QobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgRk1fUE9SVCksIG5ldyBGaWxlKAorICAgICAgICAgICAgICAgIHJlZlVybC5nZXRGaWxlKCkpLCBwcm9kTWV0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBzdGFydERpcikgeworICAgICAgICBGaWxlIHN0YXJ0RGlyRmlsZSA9IG5ldyBGaWxlKHN0YXJ0RGlyKTsKKyAgICAgICAgRmlsZVtdIGRlbEZpbGVzID0gc3RhcnREaXJGaWxlLmxpc3RGaWxlcygpOworCisgICAgICAgIGlmIChkZWxGaWxlcyAhPSBudWxsICYmIGRlbEZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWxGaWxlc1tpXS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0RGlyRmlsZS5kZWxldGUoKTsKKworICAgIH0KKworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXIgc3RhcnRYbWxScGNGaWxlTWFuYWdlcihpbnQgcG9ydCwgU3RyaW5nIGNhdFBhdGgpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICBYbWxScGNGaWxlTWFuYWdlciBmaWxlTWdyID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0byBsb2FkIHByb3BlcnRpZXMgZm9yIHRoZSBmaWxlIG1hbmFnZXIKKyAgICAgICAgLy8gYW5kIG1ha2Ugc3VyZSB0byBsb2FkIGxvZ2dpbmcgcHJvcGVydGllcyBhcyB3ZWxsCisKKyAgICAgICAgLy8gc2V0IHRoZSBsb2cgbGV2ZWxzCisgICAgICAgIFVSTCBsb2dnaW5nUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXMiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiLCBuZXcgRmlsZSgKKyAgICAgICAgICAgIGxvZ2dpbmdQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIGZpcnN0IGxvYWQgdGhlIGV4YW1wbGUgY29uZmlndXJhdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZpbGVtZ3JQcm9wZXJ0aWVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmaWxlbWdyUHJvcGVydGllc1VybC5nZXRGaWxlKCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBjYXRhbG9nIHRvIHVzZTogd2UnbGwgdXNlIGx1Y2VuZQorICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJmaWxlbWdyLmNhdGFsb2cuZmFjdG9yeSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5Iik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoIiwKKyAgICAgICAgICAgICAgICBjYXRQYXRoKTsKKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHJlcG8gbWdyIHBvbGljeQorICAgICAgICBVUkwgZm1wb2xpY3lVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9pbmdlc3QvZm1wb2xpY3kiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIsCisgICAgICAgICAgICAgICJmaWxlOi8vIiArIG5ldyBGaWxlKGZtcG9saWN5VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IG92ZXJyaWRlIHRoZSB2YWwgbGF5ZXIgb25lcworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzIiwKKyAgICAgICAgICAgICJmaWxlOi8vIiArIG5ldyBGaWxlKGZtcG9saWN5VXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIHNldCB1cCBtaW1lIHJlcG8gcGF0aAorICAgICAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLAorICAgICAgICAgICAgbmV3IEZpbGUobWltZVR5cGVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlTWdyID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyKHBvcnQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsZU1ncjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9UZXN0TWV0YWRhdGFCYXNlZFByb2R1Y3RNb3Zlci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3Rvb2xzL1Rlc3RNZXRhZGF0YUJhc2VkUHJvZHVjdE1vdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNTBlMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci90b29scy9UZXN0TWV0YWRhdGFCYXNlZFByb2R1Y3RNb3Zlci5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29sczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LlN0ZEluZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXRhZGF0YUJhc2VkUHJvZHVjdE1vdmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZNX1BPUlQgPSA1MDAxMDsKKworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXIgZm07CisKKyAgICBwcml2YXRlIFN0cmluZyBsdWNlbmVDYXRMb2M7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHJhbnNmZXJTZXJ2aWNlRmFjQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy4iCisgICAgICAgICAgICArICJmaWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGVzdFBhdGhTcGVjID0gIi90bXAvW01pbWVUeXBlXS9bUHJvZHVjdFN0cnVjdHVyZV0vW0NBUy5Qcm9kdWN0TmFtZV0vW0ZpbGVuYW1lXSI7CisKKyAgICBwcml2YXRlIFN0cmluZyBleHBlY3RlZExvYyA9ICIvdG1wL3RleHQvcGxhaW4vRmxhdC90ZXN0LnR4dC90ZXN0LnR4dCI7CisKKyAgICBwcml2YXRlIE1ldGFkYXRhQmFzZWRQcm9kdWN0TW92ZXIgbW92ZXI7CisKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICBwdWJsaWMgVGVzdE1ldGFkYXRhQmFzZWRQcm9kdWN0TW92ZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1vdmVQcm9kdWN0cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vdmVyLm1vdmVQcm9kdWN0cygiR2VuZXJpY0ZpbGUiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYSBwcm9kdWN0IGF0IGV4cGVjdGVkTG9jCisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoZXhwZWN0ZWRMb2MpLmV4aXN0cygpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbmdlc3RUZXN0RmlsZSgpIHsKKyAgICAgICAgTWV0YWRhdGEgcHJvZE1ldCA9IG51bGw7CisgICAgICAgIFN0ZEluZ2VzdGVyIGluZ2VzdGVyID0gbmV3IFN0ZEluZ2VzdGVyKHRyYW5zZmVyU2VydmljZUZhY0NsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGluZ2VzdFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdCIpOworICAgICAgICAgICAgVVJMIHJlZlVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dCIpOworICAgICAgICAgICAgVVJMIG1ldFVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC90ZXN0LnR4dC5tZXQiKTsKKworICAgICAgICAgICAgcHJvZE1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1ldFVybC5nZXRGaWxlKCkpKSk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhlIHJpZ2h0IGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIHByb2RNZXQuYWRkTWV0YWRhdGEoQ29yZU1ldEtleXMuRklMRV9MT0NBVElPTiwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgaW5nZXN0VXJsLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgIGluZ2VzdGVyLmluZ2VzdChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKSwgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgcmVmVXJsLmdldEZpbGUoKSksIHByb2RNZXQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpOworICAgICAgICBpbmdlc3RUZXN0RmlsZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbW92ZXIgPSBuZXcgTWV0YWRhdGFCYXNlZFByb2R1Y3RNb3Zlcih0ZXN0UGF0aFNwZWMsCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OiIgKyBGTV9QT1JUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZtLnNodXRkb3duKCk7CisgICAgICAgIGZtID0gbnVsbDsKKworICAgICAgICAvLyBibG93IGF3YXkgbHVjZW5lIGNhdAorICAgICAgICBkZWxldGVBbGxGaWxlcyhsdWNlbmVDYXRMb2MpOworCisgICAgICAgIC8vIGJsb3cgYXdheSB0ZXN0IGZpbGUKKyAgICAgICAgZGVsZXRlQWxsRmlsZXMoIi90bXAvdGVzdC50eHQiKTsKKworICAgICAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgICAgIGRlbGV0ZUFsbEZpbGVzUmVjdXJzaXZlKCIvdG1wL3RleHQiKTsKKworICAgICAgICAvLyBSZXNldCB0aGUgU3lzdGVtIHByb3BlcnRpZXMgdG8gaW5pdGlhbCB2YWx1ZXMuCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlQWxsRmlsZXNSZWN1cnNpdmUoU3RyaW5nIHN0YXJ0RGlyUGF0aCkgeworICAgICAgICBGaWxlIHN0YXJ0RGlyRmlsZSA9IG5ldyBGaWxlKHN0YXJ0RGlyUGF0aCk7CisgICAgICAgIEZpbGVbXSBkaXJGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICBpZiAoZGlyRmlsZXMgIT0gbnVsbCAmJiBkaXJGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpckZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpckZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlQWxsRmlsZXNSZWN1cnNpdmUoZGlyRmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZGlyIGZpbGVzIGRlbGV0ZWQsIG5vdyBkZWxldGUgZGlyCisgICAgICAgICAgICAgICAgICAgIGRpckZpbGVzW2ldLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpckZpbGVzW2ldLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBkZWxldGUgdGhlIHJvb3QgZGlyCisgICAgICAgIHN0YXJ0RGlyRmlsZS5kZWxldGUoKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICAgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgICAgIEZpbGVbXSBkZWxGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdG8gbG9hZCBsb2dnaW5nIHByb3BlcnRpZXMgYXMgd2VsbAorCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICAgICBsb2dnaW5nUHJvcGVydGllc1VybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBmaXJzdCBsb2FkIHRoZSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBmaWxlbWdyUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAiL2ZpbGVtZ3IucHJvcGVydGllcyIpOworICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKAorICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGVtZ3JQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGNhdGFsb2cgdG8gdXNlOiB3ZSdsbCB1c2UgbHVjZW5lCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgaW5nZXN0VXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvaW5nZXN0Iik7CisgICAgICAgICAgICBsdWNlbmVDYXRMb2MgPSBuZXcgRmlsZShpbmdlc3RVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgICAgICAgICAgICArICIvY2F0IjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiZmlsZW1nci5jYXRhbG9nLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeSIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuaWR4UGF0aCIsCisgICAgICAgICAgICAgICAgbHVjZW5lQ2F0TG9jKTsKKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHJlcG8gbWdyIHBvbGljeQorICAgICAgICB0cnkgeworICAgICAgICAgIFVSTCBmbXBvbGljeVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2luZ2VzdC9mbXBvbGljeSIpOworICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzIiwKKyAgICAgICAgICAgICAgImZpbGU6Ly8iICsgbmV3IEZpbGUoZm1wb2xpY3lVcmwuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHZhbCBsYXllciBvbmVzCisgICAgICAgIFVSTCBleGFtcGxlc0NvcmVVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9leGFtcGxlcy9jb3JlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRpcnMiLAorICAgICAgICAgICAgImZpbGU6Ly8iICsgbmV3IEZpbGUoZXhhbXBsZXNDb3JlVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIHNldCB1cCBtaW1lIHJlcG8gcGF0aAorICAgICAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLAorICAgICAgICAgICAgbmV3IEZpbGUobWltZVR5cGVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbSA9IG5ldyBYbWxScGNGaWxlTWFuYWdlcihGTV9QT1JUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9UZXN0R2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0U3RydWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvVGVzdEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdFN0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNkM2QzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvVGVzdEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdFN0cnVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5GaWxlbWdyTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLlZhbGlkYXRpb25MYXllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5WZXJzaW9uZXI7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdEdlbmVyaWNGaWxlTWFuYWdlck9iamVjdFN0cnVjdEZhY3RvcnkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGF0YVRyYW5zZmVyU2VydmljZUZhY3RvcnkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHZhbGlkYXRpb25TZXJ2aWNlRmFjdG9yeSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjYXRhbG9nU2VydmljZUZhY3RvcnkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuRGF0YVNvdXJjZUNhdGFsb2dGYWN0b3J5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXBvc2l0b3J5U2VydmljZUZhY3RvcnkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuWE1MUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB2ZXJzaW9uZXJDbGFzcyA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5CYXNpY1ZlcnNpb25lciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXh0cmFjdG9yQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3RvciI7CisKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgLy8gc2V0IHRoZSBsb2cgbGV2ZWxzCisgICAgICAgIFVSTCBsb2dnaW5nUHJvcGVydGllc1VybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXMiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiLCBuZXcgRmlsZSgKKyAgICAgICAgICAgIGxvZ2dpbmdQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIGZpcnN0IGxvYWQgdGhlIGV4YW1wbGUgY29uZmlndXJhdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZpbGVtZ3JQcm9wZXJ0aWVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBmaWxlbWdyUHJvcGVydGllc1VybC5nZXRGaWxlKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoaW5pdGlhbFByb3BlcnRpZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHJhbnNmZXJTZXJ2aWNlRnJvbUZhY3RvcnkoKSB7CisgICAgICAgIERhdGFUcmFuc2ZlciB0cmFuc2ZlcmVyID0gR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXREYXRhVHJhbnNmZXJTZXJ2aWNlRnJvbUZhY3RvcnkoZGF0YVRyYW5zZmVyU2VydmljZUZhY3RvcnkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRyYW5zZmVyZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXBvc2l0b3J5TWFuYWdlclNlcnZpY2VGcm9tRmFjdG9yeSgpIHsKKyAgICAgICAgUmVwb3NpdG9yeU1hbmFnZXIgcmVwTWdyID0gR2VuZXJpY0ZpbGVNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRSZXBvc2l0b3J5TWFuYWdlclNlcnZpY2VGcm9tRmFjdG9yeShyZXBvc2l0b3J5U2VydmljZUZhY3RvcnkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlcE1ncik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZ1NlcnZpY2VGcm9tRmFjdG9yeSgpIHsKKyAgICAgICAgQ2F0YWxvZyBjYXQgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldENhdGFsb2dTZXJ2aWNlRnJvbUZhY3RvcnkoY2F0YWxvZ1NlcnZpY2VGYWN0b3J5KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjYXQpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbGlkYXRpb25MYXllckZyb21GYWN0b3J5KCkgeworICAgICAgICBWYWxpZGF0aW9uTGF5ZXIgdmFsTGF5ZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25MYXllckZyb21GYWN0b3J5KHZhbGlkYXRpb25TZXJ2aWNlRmFjdG9yeSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFsTGF5ZXIpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb25lckZyb21DbGFzc05hbWUoKSB7CisgICAgICAgIFZlcnNpb25lciB2ZXJzaW9uZXIgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lckZyb21DbGFzc05hbWUodmVyc2lvbmVyQ2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZlcnNpb25lcik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXh0cmFjdG9yRnJvbUNsYXNzTmFtZSgpIHsKKyAgICAgICAgRmlsZW1nck1ldEV4dHJhY3RvciBleHRyYWN0b3IgPSBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldEV4dHJhY3RvckZyb21DbGFzc05hbWUoZXh0cmFjdG9yQ2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvcik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1Rlc3RYbWxScGNTdHJ1Y3RGYWN0b3J5LmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9UZXN0WG1sUnBjU3RydWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzQ5ODkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdXRpbC9UZXN0WG1sUnBjU3RydWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5JblBsYWNlRGF0YVRyYW5zZmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5FeHRyYWN0b3JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnR5cGUuVHlwZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBYbWxScGNTdHJ1Y3RGYWN0b3J5fS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFhtbFJwY1N0cnVjdEZhY3RvcnkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBmaW5hbCBpbnQgRklMRU1HUl9QT1JUID0gOTk5OTsKKyAgICBYbWxScGNGaWxlTWFuYWdlciBmbVNlcnZlcjsKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygKKyAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIGZtU2VydmVyLnNodXRkb3duKCk7CisKKyAgICAgICAgLy8gUmV0dXJuIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUgZnJvbSBiZWZvcmUgdGhpcyB0ZXN0CisgICAgICAgIC8vIHdhcyBydW4uCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdFR5cGVNZXRob2RzKCkgdGhyb3dzIFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBGSUxFTUdSX1BPUlQpKTsKKyAgICAgICAgZm1DbGllbnQuc2V0RGF0YVRyYW5zZmVyKG5ldyBMb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkoKS5jcmVhdGVEYXRhVHJhbnNmZXIoKSk7CisgICAgICAgIAorICAgICAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IGZtQ2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKCJHZW5lcmljRmlsZSIpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y3RUeXBlSGFzaCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUHJvZHVjdFR5cGUocHJvZHVjdFR5cGUpOworICAgICAgICBQcm9kdWN0VHlwZSBjb252QmFja1Byb2RUeXBlID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0VHlwZUZyb21YbWxScGMocHJvZHVjdFR5cGVIYXNoKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydFRydWUocHJvZHVjdFR5cGUuZ2V0UHJvZHVjdFR5cGVJZCgpLmVxdWFscyhjb252QmFja1Byb2RUeXBlLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHByb2R1Y3RUeXBlLmdldE5hbWUoKS5lcXVhbHMoY29udkJhY2tQcm9kVHlwZS5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9kdWN0VHlwZS5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhjb252QmFja1Byb2RUeXBlLmdldERlc2NyaXB0aW9uKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9kdWN0VHlwZS5nZXRWZXJzaW9uZXIoKS5lcXVhbHMoY29udkJhY2tQcm9kVHlwZS5nZXRWZXJzaW9uZXIoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHByb2R1Y3RUeXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpLmVxdWFscyhjb252QmFja1Byb2RUeXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvZHVjdFR5cGUuZ2V0RXh0cmFjdG9ycygpLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBFeHRyYWN0b3JTcGVjIHNwZWMxID0gcHJvZHVjdFR5cGUuZ2V0RXh0cmFjdG9ycygpLmdldChpKTsKKyAgICAgICAgICAgIEV4dHJhY3RvclNwZWMgc3BlYzIgPSBjb252QmFja1Byb2RUeXBlLmdldEV4dHJhY3RvcnMoKS5nZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNwZWMxLmdldENsYXNzTmFtZSgpLmVxdWFscyhzcGVjMi5nZXRDbGFzc05hbWUoKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzcGVjMS5nZXRDb25maWd1cmF0aW9uKCkuZXF1YWxzKHNwZWMyLmdldENvbmZpZ3VyYXRpb24oKSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvZHVjdFR5cGUuZ2V0SGFuZGxlcnMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVHlwZUhhbmRsZXIgaGFuZGxlcjEgPSBwcm9kdWN0VHlwZS5nZXRIYW5kbGVycygpLmdldChpKTsKKyAgICAgICAgICAgIFR5cGVIYW5kbGVyIGhhbmRsZXIyID0gY29udkJhY2tQcm9kVHlwZS5nZXRIYW5kbGVycygpLmdldChpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaGFuZGxlcjEuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGhhbmRsZXIyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGhhbmRsZXIxLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGhhbmRsZXIyLmdldEVsZW1lbnROYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWN0TWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIEZJTEVNR1JfUE9SVCkpOworICAgICAgIGZtQ2xpZW50LnNldERhdGFUcmFuc2ZlcihuZXcgSW5QbGFjZURhdGFUcmFuc2ZlckZhY3RvcnkoKS5jcmVhdGVEYXRhVHJhbnNmZXIoKSk7CisKKyAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgICAgIFByb2R1Y3Qgcm91bmRUcmlwUHJvZHVjdCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdEZyb21YbWxScGMoCisgICAgICAgICAgICAgWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNQcm9kdWN0KHByb2R1Y3QpKTsKKyAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdCwgcm91bmRUcmlwUHJvZHVjdCk7CisKKyAgICAgICBwcm9kdWN0ID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZCgiVGVzdElkIik7CisgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0TmFtZSgiVGVzdE5hbWUiKTsKKyAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKExpc3RzLm5ld0FycmF5TGlzdChuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL29yaWdpbmFsL3BhdGgiLCBudWxsLCAyKSkpOworICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZSgiRmxhdCIpOworICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUoZm1DbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUoIkdlbmVyaWNGaWxlIikpOworICAgICAgIHByb2R1Y3Quc2V0Um9vdFJlZihuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL29yaWdpbmFsL3Jvb3QiLCAiZmlsZTovLy9kYXRhc3RvcmUvcm9vdCIsIDMpKTsKKyAgICAgICByb3VuZFRyaXBQcm9kdWN0ID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRQcm9kdWN0RnJvbVhtbFJwYyhYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1Byb2R1Y3QocHJvZHVjdCkpOworICAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0LCByb3VuZFRyaXBQcm9kdWN0KTsKKyAgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgbS5hZGRNZXRhZGF0YSgiVGVzdEtleSIsICJUZXN0VmFsdWUiKTsKKyAgICAgICAKKyAgICAgICByb3VuZFRyaXBQcm9kdWN0ID0gZm1DbGllbnQuZ2V0UHJvZHVjdEJ5SWQoCisgICAgICAgICAgICAgZm1DbGllbnQuaW5nZXN0UHJvZHVjdChwcm9kdWN0LCBtLCB0cnVlKSk7CisgICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3QsIHJvdW5kVHJpcFByb2R1Y3QpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHMoUHJvZHVjdCBwcm9kdWN0MSwgUHJvZHVjdCBwcm9kdWN0MikgeworICAgICAgIGlmIChwcm9kdWN0MSA9PSBudWxsKSB7CisgICAgICAgICAgYXNzZXJ0TnVsbChwcm9kdWN0Mik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKyAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdDEuZ2V0UHJvZHVjdElkKCksIHByb2R1Y3QyLmdldFByb2R1Y3RJZCgpKTsgICAgICAgCisgICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3QxLmdldFByb2R1Y3ROYW1lKCksIHByb2R1Y3QyLmdldFByb2R1Y3ROYW1lKCkpOworICAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0MS5nZXRQcm9kdWN0U3RydWN0dXJlKCksIHByb2R1Y3QyLmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSk7CisgICAgICAgYXNzZXJ0RXF1YWxzKHByb2R1Y3QxLmdldFRyYW5zZmVyU3RhdHVzKCksIHByb2R1Y3QyLmdldFRyYW5zZmVyU3RhdHVzKCkpOworICAgICAgIGlmIChwcm9kdWN0MS5nZXRQcm9kdWN0UmVmZXJlbmNlcygpID09IG51bGwpIHsKKyAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdDEuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSwgcHJvZHVjdDIuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2R1Y3QxLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdDEuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoaSksCisgICAgICAgICAgICAgICAgICAgcHJvZHVjdDIuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoaSkpOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgaWYgKHByb2R1Y3QxLmdldFByb2R1Y3RUeXBlKCkgPT0gbnVsbCkgeworICAgICAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0MS5nZXRQcm9kdWN0VHlwZSgpLCBwcm9kdWN0Mi5nZXRQcm9kdWN0VHlwZSgpKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0MS5nZXRQcm9kdWN0VHlwZSgpLmdldERlc2NyaXB0aW9uKCksIHByb2R1Y3QyLmdldFByb2R1Y3RUeXBlKCkuZ2V0RGVzY3JpcHRpb24oKSk7ICAgICAgICAgIAorICAgICAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0MS5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSwgcHJvZHVjdDIuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkpOyAgICAgICAgICAKKyAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdDEuZ2V0UHJvZHVjdFR5cGUoKS5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKSwgcHJvZHVjdDIuZ2V0UHJvZHVjdFR5cGUoKS5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKSk7ICAgICAgICAgIAorICAgICAgICAgIGFzc2VydEVxdWFscyhwcm9kdWN0MS5nZXRQcm9kdWN0VHlwZSgpLmdldFByb2R1Y3RUeXBlSWQoKSwgcHJvZHVjdDIuZ2V0UHJvZHVjdFR5cGUoKS5nZXRQcm9kdWN0VHlwZUlkKCkpOyAgICAgICAgICAKKyAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdDEuZ2V0UHJvZHVjdFR5cGUoKS5nZXRWZXJzaW9uZXIoKSwgcHJvZHVjdDIuZ2V0UHJvZHVjdFR5cGUoKS5nZXRWZXJzaW9uZXIoKSk7ICAgICAgICAgIAorICAgICAgIH0KKyAgICAgICBhc3NlcnRFcXVhbHMocHJvZHVjdDEuZ2V0Um9vdFJlZigpLCBwcm9kdWN0Mi5nZXRSb290UmVmKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHMoUmVmZXJlbmNlIHJlZjEsIFJlZmVyZW5jZSByZWYyKSB7CisgICAgICAgaWYgKHJlZjEgPT0gbnVsbCkgeworICAgICAgICAgIGFzc2VydE51bGwocmVmMik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKyAgICAgICBhc3NlcnROb3ROdWxsKHJlZjIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgICAgIGFzc2VydEVxdWFscyhyZWYxLmdldEZpbGVTaXplKCksIHJlZjIuZ2V0RmlsZVNpemUoKSk7CisgICAgICAgYXNzZXJ0RXF1YWxzKHJlZjEuZ2V0T3JpZ1JlZmVyZW5jZSgpLCByZWYyLmdldE9yaWdSZWZlcmVuY2UoKSk7CisgICAgICAgYXNzZXJ0RXF1YWxzKHJlZjEuZ2V0TWltZVR5cGUoKSwgcmVmMi5nZXRNaW1lVHlwZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRYbWxScGNGaWxlTWFuYWdlcigpIHsKKworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdG8gbG9hZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdG8gbG9hZCBsb2dnaW5nIHByb3BlcnRpZXMgYXMgd2VsbAorCisgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVscworICAgICAgICBVUkwgbG9nZ2luZ1Byb3BlcnRpZXNVcmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAiL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwKKyAgICAgICAgICAgIG5ldyBGaWxlKGxvZ2dpbmdQcm9wZXJ0aWVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIGZpcnN0IGxvYWQgdGhlIGV4YW1wbGUgY29uZmlndXJhdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZpbGVtZ3JQcm9wZXJ0aWVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKAorICAgICAgICAgICAgICAgICIvZmlsZW1nci5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBmaWxlbWdyUHJvcGVydGllc1VybC5nZXRGaWxlKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiZmlsZW1nci5jYXRhbG9nLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5Nb2NrQ2F0YWxvZ0ZhY3RvcnkiKTsKKworICAgICAgICAvLyBub3cgb3ZlcnJpZGUgdGhlIHJlcG8gbWdyIHBvbGljeQorICAgICAgICBVUkwgc3RydWN0RmFjdG9yeVVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICIveG1scnBjLXN0cnVjdC1mYWN0b3J5Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycyIsCisgICAgICAgICAgICAgICJmaWxlOi8vIiArIG5ldyBGaWxlKHN0cnVjdEZhY3RvcnlVcmwuZ2V0RmlsZSgpKQorICAgICAgICAgICAgICAgICAgLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgdmFsIGxheWVyIG9uZXMKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycyIsCisgICAgICAgICAgICAiZmlsZTovLyIgKyBuZXcgRmlsZShzdHJ1Y3RGYWN0b3J5VXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIHNldCB1cCBtaW1lIHJlcG8gcGF0aAorICAgICAgICBVUkwgbWltZVR5cGVzVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLAorICAgICAgICAgICAgbmV3IEZpbGUobWltZVR5cGVzVXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIFVzZSB0aGUgbG9jYWwgcHJvcGVydGllcyBvYmplY3QgdG8gc2V0IHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm1TZXJ2ZXIgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXIoRklMRU1HUl9QT1JUKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3V0aWwvVGVzdFhtbFN0cnVjdEZhY3RvcnkuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1Rlc3RYbWxTdHJ1Y3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZDYyMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci91dGlsL1Rlc3RYbWxTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5leGVjLkVudlV0aWxpdGllczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUZXN0IENhc2VzIGZvciB0aGUgWG1sIFN0cnVjdCBGYWN0b3J5LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RYbWxTdHJ1Y3RGYWN0b3J5IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG9yaWdSZXBvUGF0aCA9ICJbSE9NRV0vc29tZS9wYXRoIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT01FID0gRW52VXRpbGl0aWVzLmdldEVudigiSE9NRSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVwb1BhdGggPSBIT01FICsgIi9zb21lL3BhdGgiOworCisgICAgcHVibGljIHZvaWQgdGVzdEVudlZhclJlcGxhY2UoKSB7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOworCisgICAgICAgICAgICBFbGVtZW50IHByb2R1Y3RUeXBlRWxlbSA9IChFbGVtZW50KSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0eXBlIik7CisgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW0uc2V0QXR0cmlidXRlKCJpZCIsICJibGFoIik7CisgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW0uc2V0QXR0cmlidXRlKCJuYW1lIiwgImZvbyIpOworCisgICAgICAgICAgICBFbGVtZW50IHJlcG9QYXRoRWxlbSA9IChFbGVtZW50KSBkb2N1bWVudAorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRWxlbWVudCgicmVwb3NpdG9yeSIpOworICAgICAgICAgICAgcmVwb1BhdGhFbGVtLnNldEF0dHJpYnV0ZSgicGF0aCIsIG9yaWdSZXBvUGF0aCk7CisgICAgICAgICAgICBwcm9kdWN0VHlwZUVsZW0uYXBwZW5kQ2hpbGQocmVwb1BhdGhFbGVtKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgRWxlbWVudCB2ZXJzaW9uZXJDbGFzc0VsZW0gPSAoRWxlbWVudCkKKyAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZlcnNpb25lciIpOworICAgICAgICAgICAgdmVyc2lvbmVyQ2xhc3NFbGVtLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiZm9vLmJhciIpOworICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtLmFwcGVuZENoaWxkKHZlcnNpb25lckNsYXNzRWxlbSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEVsZW1lbnQgZGVzY0VsZW0gPSAoRWxlbWVudCkKKyAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRlc2NyaXB0aW9uIik7CisgICAgICAgICAgICBkZXNjRWxlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiZm9vIikpOworICAgICAgICAgICAgcHJvZHVjdFR5cGVFbGVtLmFwcGVuZENoaWxkKGRlc2NFbGVtKTsKKworICAgICAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IFhtbFN0cnVjdEZhY3RvcnkuZ2V0UHJvZHVjdFR5cGUocHJvZHVjdFR5cGVFbGVtKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIG9mIHRoZSByZXBvIHBhdGg6IFsiCisgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoKQorICAgICAgICAgICAgICAgICAgICArICJdIHdhcyBub3QgdGhlIGV4cGVjdGVkIHZhbHVlIG9mOiBbIiArIGV4cGVjdGVkUmVwb1BhdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiXSIsIHR5cGUuZ2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCksIGV4cGVjdGVkUmVwb1BhdGgpOworCisgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9UZXN0WE1MVmFsaWRhdGlvbkxheWVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmFsaWRhdGlvbi9UZXN0WE1MVmFsaWRhdGlvbkxheWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2ZGMzNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92YWxpZGF0aW9uL1Rlc3RYTUxWYWxpZGF0aW9uTGF5ZXIuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5cy4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIFhNTFZhbGlkYXRpb25MYXllci4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdFhNTFZhbGlkYXRpb25MYXllciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qIG91ciB0ZXN0IFVSSXMgY29udGFpbmluZyBlbGVtZW50cy54bWwgYW5kIHByb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwgKi8KKyAgICBwcml2YXRlIExpc3QgdGVzdERpclVyaXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiBvdXIgWE1MIFZhbGlkYXRpb24gbGF5ZXIgZm9yIHRlc3RpbmcgKi8KKyAgICBwcml2YXRlIFhNTFZhbGlkYXRpb25MYXllciB2YWxpZGF0aW9uTGF5ZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkUHJvZHVjdElkRGVmaW5pdGlvbiA9ICJBIFByb2R1Y3QncyB1bmlxdWUgaWRlbnRpZmllciB3aXRoaW4gdGhlIENBUyBuYW1lc3BhY2UuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZFByb2R1Y3ROYW1lRGVmaW5pdGlvbiA9ICJcbiAgICAgICAgICBBIFByb2R1Y3QncyBuYW1lIHdpdGhpbiB0aGUgQ0FTIG5hbWVzcGFjZS5cbiAgICAgICAgIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZFByb2R1Y3RSZWNlaXZlZFRpbWUgPSAiVGhlIElTTyA4NjAxIGZvcm1hdHRlZCB0aW1lIHRoYXQgdGhlIFByb2R1Y3Qgd2FzIHJlY2VpdmVkLiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRGaWxlbmFtZURlZmluaXRpb24gPSAiVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHJlcHJlc2VudCB0aGlzIHByb2R1Y3QuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNfTlMgPSAiQ0FTIjsKKworICAgIHB1YmxpYyBUZXN0WE1MVmFsaWRhdGlvbkxheWVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTE5NQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFbGVtZW50KCkgeworICAgICAgRWxlbWVudCBlbGVtID0gbmV3IEVsZW1lbnQoKTsKKyAgICAgIFN0cmluZyBlbGVtTmFtZSA9ICJUZXN0RmlsZW5hbWUiOworICAgICAgZWxlbS5zZXRFbGVtZW50TmFtZShlbGVtTmFtZSk7CisgICAgICBlbGVtLnNldEVsZW1lbnRJZCgidXJuOm9vZHQ6RmlsZW5hbWUiKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHZhbGlkYXRpb25MYXllci5tb2RpZnlFbGVtZW50KGVsZW0pOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgIAorICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgpOworICAgICAgdHlwZS5zZXRQcm9kdWN0VHlwZUlkKCJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgICAgTGlzdDxFbGVtZW50PiByZXRyaWV2ZWRFbGVtcyA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICByZXRyaWV2ZWRFbGVtcyA9IHZhbGlkYXRpb25MYXllci5nZXRFbGVtZW50cyh0eXBlKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgYXNzZXJ0Tm90TnVsbChyZXRyaWV2ZWRFbGVtcyk7CisgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICBmb3IgKEVsZW1lbnQgZSA6IHJldHJpZXZlZEVsZW1zKSB7CisgICAgICAgIGlmIChlLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGVsZW1OYW1lKSkgeworICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgdXBkYXRlZCBlbGVtZW50OiBbIitlbGVtTmFtZSsiXTogU2V0IGNvbnRhaW5zIDogWyIKKyAgICAgICAgICAgICAgKyByZXRyaWV2ZWRFbGVtcyArICJdIiwgZm91bmQpOworICB9ICAgIAorCisgICAgLyoqCisgICAgICogQHNpbmNlIE9PRFQtMjIwCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRQcm9wZXJEZXNjcmlwdGlvblRyaW1JbXBsaWNpdFRydWUoKSB7CisgICAgICAgIEVsZW1lbnQgZWxlbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbGVtID0gdmFsaWRhdGlvbkxheWVyLmdldEVsZW1lbnRCeU5hbWUoQ0FTX05TICsgIi4iICsgUFJPRFVDVF9JRCk7CisgICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoZWxlbSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZWxlbS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvZHVjdElkRGVmaW5pdGlvbiwgZWxlbS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC0yMjAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJhZEZvcm1hdHRlZERlc2NyaXB0aW9uVHJpbUltcGxpY2l0VHJ1ZSgpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW0gPSB2YWxpZGF0aW9uTGF5ZXIuZ2V0RWxlbWVudEJ5TmFtZShGSUxFTkFNRSk7CisgICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25MYXllckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoZWxlbSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZWxlbS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZW5hbWVEZWZpbml0aW9uLCBlbGVtLmdldERlc2NyaXB0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTIyMAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRGVzY3JpcHRpb25UcmltRXhwbGljaXRGYWxzZSgpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW0gPSB2YWxpZGF0aW9uTGF5ZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRCeU5hbWUoQ0FTX05TICsgIi4iICsgUFJPRFVDVF9OQU1FKTsKKyAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkxheWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0TmFtZURlZmluaXRpb24sIGVsZW0uZ2V0RGVzY3JpcHRpb24oKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC0yMjAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZERlc2NyaXB0aW9uVHJpbUV4cGxpY2l0VHJ1ZSgpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW0gPSB2YWxpZGF0aW9uTGF5ZXIuZ2V0RWxlbWVudEJ5TmFtZShDQVNfTlMgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgKyBQUk9EVUNUX1JFQ0VWSUVEX1RJTUUpOworICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKGVsZW0pOworICAgICAgICBhc3NlcnROb3ROdWxsKGVsZW0uZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFByb2R1Y3RSZWNlaXZlZFRpbWUsIGVsZW0uZ2V0RGVzY3JpcHRpb24oKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHMoKSB7CisgICAgICAgIExpc3QgZWxlbWVudExpc3QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbGVtZW50TGlzdCA9IHZhbGlkYXRpb25MYXllci5nZXRFbGVtZW50cygpOworICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzaG91bGQgYmUgNCBlbGVtZW50cworICAgICAgICBhc3NlcnROb3ROdWxsKGVsZW1lbnRMaXN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGVyZSBhcmVuJ3QgZXhhY3RseSA0IGVsZW1lbnRzIGluIHRoZSB0ZXN0IHNhbXBsZXMhIiwgNCwKKyAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5zaXplKCkpOworCisgICAgICAgIC8vIHRyeSBhbmQgZmluZCBvbmUgb2YgdGhlbQorICAgICAgICAvLyBmaW5kIHByb2R1dWN0IHJlY2VpdmVkIHRpbWUKKyAgICAgICAgYm9vbGVhbiBoYXNSZWNlaXZlZFRpbWUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiKSkgeworICAgICAgICAgICAgICAgIGhhc1JlY2VpdmVkVGltZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhhc1JlY2VpdmVkVGltZSkgeworICAgICAgICAgICAgZmFpbCgiRGlkbid0IGxvYWQgdGhlIENBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIGVsZW1lbnQhIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNGb3JQcm9kdWN0VHlwZSgpIHsKKyAgICAgICAgTGlzdCBlbGVtZW50TGlzdCA9IG51bGw7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKworICAgICAgICB0eXBlLnNldFByb2R1Y3RUeXBlSWQoInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgICAgIHR5cGUuc2V0TmFtZSgiR2VuZXJpYyBGaWxlIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVsZW1lbnRMaXN0ID0gdmFsaWRhdGlvbkxheWVyLmdldEVsZW1lbnRzKHR5cGUpOworICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzaG91bGQgYmUgZXhhY3RseSA0IGVsZW1lbnRzCisgICAgICAgIGFzc2VydE5vdE51bGwoZWxlbWVudExpc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIlRoZXJlIGFyZW4ndCBleGFjdGx5IDQgZWxlbWVudHMgZm9yIHRoZSBwcm9kdWN0IHR5cGUgW0dlbmVyaWMgRmlsZV0hIiwKKyAgICAgICAgICAgICAgICA0LCBlbGVtZW50TGlzdC5zaXplKCkpOworICAgIH0KKworCisKKworICAgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBGaWxlIHRlbXBEaXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJpZ25vcmUiLCAidHh0IikuZ2V0UGFyZW50RmlsZSgpOworICAgICAgLy8gY29weSB0aGUgdmFsIGxheWVyIHBvbGljeSBpbnRvIHRoZSB0ZW1wIGRpcgorICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3ZhbGxheWVyIik7CisgICAgICBmb3IgKEZpbGUgZiA6IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpCisgICAgICAgICAgLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pKSB7CisgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KGYsIHRlbXBEaXIpOworICAgICAgfQorCisgICAgICB0ZXN0RGlyVXJpcy5hZGQodGVtcERpci50b1VSSSgpLnRvU3RyaW5nKCkpOworICAgICAgdmFsaWRhdGlvbkxheWVyID0gbmV3IFhNTFZhbGlkYXRpb25MYXllcih0ZXN0RGlyVXJpcyk7CisKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBkZWxldGVBbGxGaWxlcyhuZXcgRmlsZShuZXcgVVJJKChTdHJpbmcpIHRlc3REaXJVcmlzLmdldCgwKSkpCisgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdGVzdERpclVyaXMuY2xlYXIoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICBGaWxlIHN0YXJ0RGlyRmlsZSA9IG5ldyBGaWxlKHN0YXJ0RGlyKTsKKyAgICBGaWxlW10gZGVsRmlsZXMgPSBzdGFydERpckZpbGUubGlzdEZpbGVzKCk7CisKKyAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGRlbEZpbGVzW2ldLmRlbGV0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHN0YXJ0RGlyRmlsZS5kZWxldGUoKTsKKworICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDliYmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0QWNxdWlzaXRpb25EYXRlVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogCisgKiBUZXN0IGhhcm5lc3MgZm9yIHRoZSB7QGxpbmsgQWNxdWlzaXRpb25EYXRlVmVyc2lvbmVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QWNxdWlzaXRpb25EYXRlVmVyc2lvbmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL21pbWUtdHlwZXMueG1sIik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbmVyV2l0aE5vU3RhcnREYXRlVGltZUFuZE5vQWNxRGF0ZSgpIHsKKyAgICBBY3F1aXNpdGlvbkRhdGVWZXJzaW9uZXIgdmVyc2lvbmVyID0gbmV3IEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lcigpOworICAgIFByb2R1Y3QgcCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwgInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgcC5nZXRQcm9kdWN0VHlwZSgpLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgiZmlsZTovLy9ob21lL2ZpbGVzIik7CisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC9kaXIxL2ZpbGUxLnR4dCIsIG51bGwsIDRMKTsKKyAgICBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKHIpOworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgImZpbGUxLnR4dCIpOworICAgIFNpbXBsZURhdGVGb3JtYXQgYWNxRGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAorICAgICAgICBBY3F1aXNpdGlvbkRhdGVWZXJzaW9uZXIuQUNRX0RBVEVfRk9STUFUKTsKKyAgICBhY3FEYXRlRm9ybWF0dGVyLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisgICAgU3RyaW5nIGV4cGVjdGVkRGF0ZVRpbWVTdHIgPSBhY3FEYXRlRm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKTsKKyAgICBTdHJpbmcgZXhwZWN0ZWRQYXRoID0gImZpbGU6L2hvbWUvZmlsZXMvIiArIGV4cGVjdGVkRGF0ZVRpbWVTdHIKKyAgICAgICAgKyAiL2ZpbGUxLnR4dCI7CisgICAgdHJ5IHsKKyAgICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHAsIG1ldCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnROb3ROdWxsKHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFBhdGgsIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkKKyAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uZXJXaXRoTm9TdGFydERhdGVUaW1lQW5kQWNxRGF0ZSgpIHsKKyAgICBBY3F1aXNpdGlvbkRhdGVWZXJzaW9uZXIgdmVyc2lvbmVyID0gbmV3IEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lcigpOworICAgIFByb2R1Y3QgcCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwgInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgcC5nZXRQcm9kdWN0VHlwZSgpLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgiZmlsZTovLy9ob21lL2ZpbGVzIik7CisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC9kaXIxL2ZpbGUxLnR4dCIsIG51bGwsIDRMKTsKKyAgICBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKHIpOworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldC5hZGRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwgImZpbGUxLnR4dCIpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiQWNxdWlzaXRpb25EYXRlIiwgIjA5MDkxMCIpOworICAgIFN0cmluZyBleHBlY3RlZFBhdGggPSAiZmlsZTovaG9tZS9maWxlcy8iCisgICAgICAgICsgbWV0LmdldE1ldGFkYXRhKCJBY3F1aXNpdGlvbkRhdGUiKSArICIvZmlsZTEudHh0IjsKKyAgICB0cnkgeworICAgICAgdmVyc2lvbmVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocCwgbWV0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwocC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGF0aCwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKQorICAgICAgICAuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25lcldpdGhTdGFydERhdGVUaW1lKCkgeworICAgIEFjcXVpc2l0aW9uRGF0ZVZlcnNpb25lciB2ZXJzaW9uZXIgPSBuZXcgQWNxdWlzaXRpb25EYXRlVmVyc2lvbmVyKCk7CisgICAgUHJvZHVjdCBwID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiLCAidXJuOm9vZHQ6R2VuZXJpY0ZpbGUiKTsKKyAgICBwLmdldFByb2R1Y3RUeXBlKCkuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi8vL2hvbWUvZmlsZXMiKTsKKyAgICBSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vdG1wL2RpcjEvZmlsZTEudHh0IiwgbnVsbCwgNEwpOworICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQocik7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVOQU1FLCAiZmlsZTEudHh0Iik7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJTdGFydERhdGVUaW1lIiwgIjIwMDYtMDktMTBUMDA6MDA6MDEuMDAwWiIpOworICAgIFN0cmluZyBleHBlY3RlZFBhdGggPSAiZmlsZTovaG9tZS9maWxlcy8wNjA5MTAvZmlsZTEudHh0IjsKKyAgICB0cnkgeworICAgICAgdmVyc2lvbmVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocCwgbWV0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwocC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGF0aCwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKQorICAgICAgICAuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3RCYXNpY1ZlcnNpb25lci5qYXZhIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdEJhc2ljVmVyc2lvbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmN2U5NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3RCYXNpY1ZlcnNpb25lci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlZlcnNpb25pbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBVbml0IHRlc3RzIGZvciB0aGUgQmFzaWNWZXJzaW9uZXIgY2xhc3MuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RCYXNpY1ZlcnNpb25lciBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qIHRoZSBCYXNpY1ZlcnNpb25lciB3ZSdyZSBnb2luZyB0byB0ZXN0IG91dCAqLworCXByaXZhdGUgQmFzaWNWZXJzaW9uZXIgYmFzaWNWZXJzaW9uZXIgPSBuZXcgQmFzaWNWZXJzaW9uZXIoKTsKKworICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9taW1lLXR5cGVzLnhtbCIpOworICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5taW1lLnR5cGUucmVwb3NpdG9yeSIsCisgICAgICAgIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoaW5pdGlhbFByb3BlcnRpZXMpOworICB9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkZsYXQoKSB7CisJCVByb2R1Y3QgcCA9IG5ldyBQcm9kdWN0KCk7CisJCXAuc2V0UHJvZHVjdE5hbWUoInRlc3RfcHJvZHVjdCIpOworCQlwLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCk7CisJCVByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKwkJdHlwZS5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoImZpbGU6Ly8vZm9vL2JhciIpOworCQlwLnNldFByb2R1Y3RUeXBlKHR5cGUpOworCisJCUxpc3QgcmVmcyA9IG5ldyBWZWN0b3IoKTsKKwkJdHJ5IHsKKyAgICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi90ZXN0LnR4dCIpOworICAgICAgU3RyaW5nIHJlZm5hbWUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkudG9TdHJpbmcoKTsKKwkJCXJlZnMuYWRkKHJlZm5hbWUpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJCisJCVZlcnNpb25pbmdVdGlscy5hZGRSZWZzRnJvbVVyaXMocCwgcmVmcyk7CisKKwkJdHJ5IHsKKwkJCWJhc2ljVmVyc2lvbmVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocCwgbnVsbCk7CisJCX0gY2F0Y2ggKFZlcnNpb25pbmdFeGNlcHRpb24gZSkgeworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQlTdHJpbmcgZ2VuZXJhdGVkUmVmID0gKChSZWZlcmVuY2UpIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkpCisJCQkJLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpOworCQlhc3NlcnROb3ROdWxsKGdlbmVyYXRlZFJlZik7CisKKwkJYXNzZXJ0RXF1YWxzKCJWZXJzaW9uZWQgcmVmcyBub3QgZXF1YWw6IHJlZj1bIiArIGdlbmVyYXRlZFJlZiArICJdIiwKKwkJCQkiZmlsZTovZm9vL2Jhci90ZXN0X3Byb2R1Y3QvdGVzdC50eHQiLCBnZW5lcmF0ZWRSZWYpOworCisJfQorCisgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSGllcmFyY2hpY2FsKCkgeworICAgIFN0cmluZyBleHBlY3RlZCA9ICJmaWxlOi9hcmNoaXZlL3Rlc3RkaXIvIjsKKyAgICBQcm9kdWN0IHAgPSBQcm9kdWN0CisgICAgICAgIC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3RkaXIiLCAidXJuOm9vZHQ6R2VuZXJpY0ZpbGUiKTsKKyAgICBwLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKTsKKyAgICBwLmdldFByb2R1Y3RUeXBlKCkuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi8vL2FyY2hpdmUiKTsKKworICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQoCisgICAgICAgIG5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vdG1wL3NvbWVkaXIvIiwgbnVsbCwgNEwpKTsKKyAgICBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKAorICAgICAgICBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC9zb21lZGlyL2ZpbGUudHh0IiwgbnVsbCwgNDA5NkwpKTsKKworICAgIEJhc2ljVmVyc2lvbmVyIHZlcnNpb25lciA9IG5ldyBCYXNpY1ZlcnNpb25lcigpOworICAgIHRyeSB7CisgICAgICB2ZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwLCBuZXcgTWV0YWRhdGEoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwocC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApCisgICAgICAgIC5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdENvbmZpZ3VyYWJsZU1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0Q29uZmlndXJhYmxlTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGJkMWViCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdENvbmZpZ3VyYWJsZU1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZzsKKworLy8gSlVuaXQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8vIEpESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vIE9PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvLyBKVW5pdCBpbXBvcnRzCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworLy8gR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBDb25maWd1cmFibGVNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyQGFwYWNoZS5vcmcgKEJyaWFuIEZvc3RlcikKKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFRlc3RDb25maWd1cmFibGVNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lciB7CisKKyAgQFJ1bGUgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgIHByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzOworICBwcml2YXRlIENvbmZpZ3VyYWJsZU1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIHZlcnNpb25lcjsKKyAgcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5jb25maWd1cmF0aW9uLnRlc3RfdHlwZSIsCisgICAgICAgICIvW1llYXJdL1tNb250aF0vW0RheV0vW0ZpbGVuYW1lXSIpOworICAgIHZlcnNpb25lciA9IG5ldyBDb25maWd1cmFibGVNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lcihwcm9wZXJ0aWVzKTsKKyAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKCJZZWFyIiwgIjIwMTMiKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgiTW9udGgiLCAiMDMiKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgiRGF5IiwgIjIzIik7CisgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEoIkZpbGVuYW1lIiwgInRlc3QuZGF0Iik7CisgICAgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgcHJvZHVjdC5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworICAgIFByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisgICAgcHQuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi9iYXNlL3BhdGgiKTsKKyAgICBwdC5zZXROYW1lKCJURVNUX1RZUEUiKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHB0KTsKKyAgICBSZWZlcmVuY2UgcmVmID0gbmV3IFJlZmVyZW5jZSgpOworICAgIHJlZi5zZXRPcmlnUmVmZXJlbmNlKCIvcGF0aC90by9maWxlIik7CisgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhMaXN0cy5uZXdBcnJheUxpc3QocmVmKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbmluZ0ZvclByb2R1Y3RUeXBlKCkgdGhyb3dzIFZlcnNpb25pbmdFeGNlcHRpb24geworICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2R1Y3QsIG1ldGFkYXRhKTsKKworICAgIGFzc2VydFRoYXQocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSwgaXMoMSkpOworICAgIGFzc2VydFRoYXQocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwKKyAgICAgICAgaXMoImZpbGU6L2Jhc2UvcGF0aC8yMDEzLzAzLzIzL3Rlc3QuZGF0IikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25pbmdGb3JQcm9kdWN0VHlwZU5vdERlZmluZWQoKSB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICBwdC5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoImZpbGU6L2Jhc2UvcGF0aCIpOworICAgIHB0LnNldE5hbWUoIlRFU1RfVFlQRTIiKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHB0KTsKKworICAgIGV4cGVjdGVkRXhjZXB0aW9uLmV4cGVjdChWZXJzaW9uaW5nRXhjZXB0aW9uLmNsYXNzKTsKKyAgICB2ZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwcm9kdWN0LCBtZXRhZGF0YSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbmluZ0ZvckFsbFByb2R1Y3RUeXBlc0RvZXNudE92ZXJyaWRlU3BlY2lmaWMoKSB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuY29uZmlndXJhdGlvbi5hbGxfcHJvZHVjdF90eXBlcyIsCisgICAgICAgICIvW1llYXJdL1tNb250aF0vW0ZpbGVuYW1lXSIpOworCisgICAgdmVyc2lvbmVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocHJvZHVjdCwgbWV0YWRhdGEpOworICAgIAorICAgIGFzc2VydFRoYXQocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSwgaXMoMSkpOworICAgIGFzc2VydFRoYXQocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwKKyAgICAgICAgaXMoImZpbGU6L2Jhc2UvcGF0aC8yMDEzLzAzLzIzL3Rlc3QuZGF0IikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25pbmdGb3JBbGxQcm9kdWN0VHlwZXMoKSB0aHJvd3MgVmVyc2lvbmluZ0V4Y2VwdGlvbiB7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuY29uZmlndXJhdGlvbi5hbGxfcHJvZHVjdF90eXBlcyIsCisgICAgICAgICIvW1llYXJdL1tNb250aF0vW0ZpbGVuYW1lXSIpOworCisgICAgUHJvZHVjdFR5cGUgcHQgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKyAgICBwdC5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgoImZpbGU6L2Jhc2UvcGF0aCIpOworICAgIHB0LnNldE5hbWUoIlRFU1RfVFlQRTIiKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHB0KTsKKworICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2R1Y3QsIG1ldGFkYXRhKTsKKworICAgIGFzc2VydFRoYXQocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLnNpemUoKSwgaXMoMSkpOworICAgIGFzc2VydFRoYXQocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSwKKyAgICAgICAgaXMoImZpbGU6L2Jhc2UvcGF0aC8yMDEzLzAzL3Rlc3QuZGF0IikpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0RGF0ZVRpbWVWZXJzaW9uZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3REYXRlVGltZVZlcnNpb25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTYxYTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0RGF0ZVRpbWVWZXJzaW9uZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZzsKKworLy8gSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRGF0ZUNvbnZlcnQ7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIERhdGVUaW1lVmVyc2lvbmVyIGNsYXNzLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RGF0ZVRpbWVWZXJzaW9uZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKiB0aGUgdmVyc2lvbmVyIHRoYXQgd2UncmUgZ29pbmcgdG8gdGVzdCBvdXQgKi8KKwlwcml2YXRlIERhdGVUaW1lVmVyc2lvbmVyIGRhdGVUaW1lVmVyc2lvbmVyID0gbmV3IERhdGVUaW1lVmVyc2lvbmVyKCk7CisKKyAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGluaXRpYWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvbWltZS10eXBlcy54bWwiKTsKKyAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLAorICAgICAgICBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKGluaXRpYWxQcm9wZXJ0aWVzKTsKKyAgfQorCisJcHVibGljIHZvaWQgdGVzdEZsYXQoKSB7CisJCU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisJCVByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKworCQl0eXBlLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgiZmlsZTovLy9mb28vYmFyIik7CisJCXByb2R1Y3Quc2V0UHJvZHVjdE5hbWUoInRlc3RfcHJvZHVjdCIpOworCQlwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCk7CisJCXByb2R1Y3Quc2V0UHJvZHVjdFR5cGUodHlwZSk7CisKKwkgICAgRGF0ZSBwcm9kRGF0ZVRpbWUgPSBuZXcgRGF0ZSgpOworCQlTdHJpbmcgcHJvZERhdGVUaW1lU3RyID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KHByb2REYXRlVGltZSk7CisJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsIHByb2REYXRlVGltZVN0cik7CisJCQorCisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5ZGRNTS5ISG1tc3MiKTsKKyAgICAgICAgU3RyaW5nIHByb2REYXRlVGltZU5vbklzbyA9IGRhdGVGb3JtYXR0ZXIuZm9ybWF0KHByb2REYXRlVGltZSk7CisKKwkJTGlzdCByZWZzID0gbmV3IFZlY3RvcigpOworCQl0cnkgeworICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3Rlc3QudHh0Iik7CisgICAgICBTdHJpbmcgcmVmbmFtZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKS50b1N0cmluZygpOworCQkJcmVmcy5hZGQocmVmbmFtZSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQkKKwkJVmVyc2lvbmluZ1V0aWxzLmFkZFJlZnNGcm9tVXJpcyhwcm9kdWN0LCByZWZzKTsKKworCQl0cnkgeworCQkJZGF0ZVRpbWVWZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwcm9kdWN0LCBtZXRhZGF0YSk7CisJCX0gY2F0Y2ggKFZlcnNpb25pbmdFeGNlcHRpb24gZSkgeworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQlTdHJpbmcgZ2VuZXJhdGVkUmVmID0gKChSZWZlcmVuY2UpIHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKQorCQkJCS5nZXQoMCkpLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpOworCQlhc3NlcnROb3ROdWxsKGdlbmVyYXRlZFJlZik7CisJCWFzc2VydEVxdWFscygKKwkJCQkiR2VuZXJhdGVkIHJlZiBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCByZWY6IGdlbmVyYXRlZFJlZj1bIgorCQkJCQkJKyBnZW5lcmF0ZWRSZWYgKyAiXSwgZXhwZWN0ZWQ9W2ZpbGU6L2Zvby9iYXIvdGVzdF9wcm9kdWN0IiArCisJCQkJCQkJCSIvdGVzdC50eHQuIitwcm9kRGF0ZVRpbWVOb25Jc28rIl0iLCAKKwkJCQkJCQkJImZpbGU6L2Zvby9iYXIvdGVzdF9wcm9kdWN0L3Rlc3QudHh0LiIKKwkJCQkJCSsgcHJvZERhdGVUaW1lTm9uSXNvLCBnZW5lcmF0ZWRSZWYpOworCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0RGlyZWN0b3J5QmFzZWRQcm9kdWN0VmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0RGlyZWN0b3J5QmFzZWRQcm9kdWN0VmVyc2lvbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZTUyMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3REaXJlY3RvcnlCYXNlZFByb2R1Y3RWZXJzaW9uZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogCisgKiBUZXN0IGhhcm5lc3MgZm9yIHRoZSB7QGxpbmsgRGlyZWN0b3J5UHJvZHVjdFZlcnNpb25lcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdERpcmVjdG9yeUJhc2VkUHJvZHVjdFZlcnNpb25lciBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIFByb3BlcnRpZXMgaW5pdGlhbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworICAgIFVSTCB1cmwgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9taW1lLXR5cGVzLnhtbCIpOworICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5taW1lLnR5cGUucmVwb3NpdG9yeSIsCisgICAgICAgIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoaW5pdGlhbFByb3BlcnRpZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25lcigpIHsKKyAgICBEaXJlY3RvcnlQcm9kdWN0VmVyc2lvbmVyIHZlcnNpb25lciA9IG5ldyBEaXJlY3RvcnlQcm9kdWN0VmVyc2lvbmVyKCk7CisgICAgUHJvZHVjdCBwID0gUHJvZHVjdC5nZXREZWZhdWx0RmxhdFByb2R1Y3QoInRlc3QiLCAidXJuOm9vZHQ6R2VuZXJpY0ZpbGUiKTsKKyAgICBwLnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKTsKKyAgICBwLmdldFByb2R1Y3RUeXBlKCkuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi8vL2hvbWUvZmlsZXMiKTsKKyAgICBSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vdG1wL2RpcjEiLCBudWxsLCA0TCk7CisgICAgUmVmZXJlbmNlIHIyID0gbmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvZGlyMS9maWxlMS50eHQiLCBudWxsLCAyMEwpOworICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQocik7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyMik7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKENvcmVNZXRLZXlzLkZJTEVOQU1FLCAiZGlyMSIpOworICAgIHRyeSB7CisgICAgICB2ZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwLCBtZXQpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0Tm90TnVsbChwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworICAgIGFzc2VydEVxdWFscygyLCBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZpbGU6L2hvbWUvZmlsZXMvZGlyMS8iLCBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuZ2V0KDApCisgICAgICAgIC5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9ob21lL2ZpbGVzL2RpcjEvZmlsZTEudHh0IiwgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpCisgICAgICAgIC5nZXQoMSkuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdEluUGxhY2VWZXJzaW9uZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3RJblBsYWNlVmVyc2lvbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmODhmZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3RJblBsYWNlVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgSW5QbGFjZVZlcnNpb25lcn0uCisgKiAKKyAqIEBhdXRob3IgZGF2b29kaQorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0SW5QbGFjZVZlcnNpb25lciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAvKioKKyAgICogQHNpbmNlIE9PRFQtMTA4CisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbmVyRmxhdCgpIHsKKyAgICBQcm9kdWN0IHAgPSBQcm9kdWN0LmdldERlZmF1bHRGbGF0UHJvZHVjdCgidGVzdCIsICJ1cm46b29kdDpHZW5lcmljRmlsZSIpOworICAgIFJlZmVyZW5jZSByID0gbmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvdGVzdC50eHQiLCBudWxsLCAwTCk7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyKTsKKyAgICBJblBsYWNlVmVyc2lvbmVyIHZlcnNpb25lciA9IG5ldyBJblBsYWNlVmVyc2lvbmVyKCk7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgdHJ5IHsKKyAgICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHAsIG1ldCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkuZXF1YWxzKHIuZ2V0T3JpZ1JlZmVyZW5jZSgpKSk7CisgIH0KKworICAvKioKKyAgICogQHNpbmNlIE9PRFQtMTA4CisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbmVySGllcmFyY2hpY2FsKCkgeworICAgIFByb2R1Y3QgcCA9IFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KCJ0ZXN0IiwgInVybjpvb2R0OkdlbmVyaWNGaWxlIik7CisgICAgcC5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0hJRVJBUkNISUNBTCk7CisgICAgUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcCIsIG51bGwsIDBMKTsKKyAgICBSZWZlcmVuY2UgcjIgPSBuZXcgUmVmZXJlbmNlKCJmaWxlOi8vL3RtcC9maWxlMS50eHQiLCBudWxsLCA0MDk2TCk7CisgICAgUmVmZXJlbmNlIHIzID0gbmV3IFJlZmVyZW5jZSgiZmlsZTovLy90bXAvZmlsZTIudHh0IiwgbnVsbCwgNDA5NkwpOworICAgIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQocik7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyMik7CisgICAgcC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyMyk7CisgICAgSW5QbGFjZVZlcnNpb25lciB2ZXJzaW9uZXIgPSBuZXcgSW5QbGFjZVZlcnNpb25lcigpOworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIHRyeSB7CisgICAgICB2ZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwLCBtZXQpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBmb3IgKFJlZmVyZW5jZSByZWYgOiBwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpIHsKKyAgICAgIGFzc2VydEVxdWFscyhyZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCksIHJlZi5nZXRPcmlnUmVmZXJlbmNlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0TWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU4MjM2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgVGVzdCBDYXNlIGZvciB0aGUgTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisJcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdFR5cGVQYXRoID0gImZpbGU6L2Zvby9iYXIiOworCisgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL21pbWUtdHlwZXMueG1sIik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgIH0KKworCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uZXJOb1N0YXRpYygpIHsKKwkJU3RyaW5nIGZpbGVQYXRoU3BlYyA9ICIvW1Byb2R1Y3RUeXBlXS9bUHJvZHVjdGlvbkRhdGVdL1tGaWxlbmFtZV0iOworCQlQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworCQlwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfRkxBVCk7CisJCVByb2R1Y3RUeXBlIHR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoKTsKKwkJdHlwZS5zZXRQcm9kdWN0UmVwb3NpdG9yeVBhdGgocHJvZHVjdFR5cGVQYXRoKTsKKwkJcHJvZHVjdC5zZXRQcm9kdWN0VHlwZSh0eXBlKTsKKworCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiUHJvZHVjdFR5cGUiLCAiRm9vRmlsZSIpOworCQltZXRhZGF0YS5hZGRNZXRhZGF0YSgiUHJvZHVjdGlvbkRhdGUiLCAiMDYwODA0Iik7CisJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKCJGaWxlbmFtZSIsICJmb28udHh0Iik7CisKKwkJUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCk7CisJCXByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQocik7CisKKwkJTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIgdmVyc2lvbmVyID0gbmV3IE1ldGFkYXRhQmFzZWRGaWxlVmVyc2lvbmVyKAorCQkJCWZpbGVQYXRoU3BlYyk7CisJCXRyeSB7CisJCQl2ZXJzaW9uZXIuY3JlYXRlRGF0YVN0b3JlUmVmZXJlbmNlcyhwcm9kdWN0LCBtZXRhZGF0YSk7CisJCX0gY2F0Y2ggKFZlcnNpb25pbmdFeGNlcHRpb24gZSkgeworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZmlsZTovZm9vL2Jhci9Gb29GaWxlLzA2MDgwNC9mb28udHh0IjsKKwkJYXNzZXJ0RXF1YWxzKCJUaGUgcmVmZXJlbmNlOiBbIiArIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKwkJCQkrICJdIGlzIG5vdCBlcXVhbCB0bzogWyIgKyBleHBlY3RlZCArICJdIiwgZXhwZWN0ZWQsIHIKKwkJCQkuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uZXJXaXRoU3RhdGljKCkgeworCQlTdHJpbmcgZmlsZVBhdGhTcGVjID0gIi9bUHJvZHVjdFR5cGVdL3NvbWUvb3RoZXIvcGF0aFtQcm9kdWN0aW9uRGF0ZV0vW0ZpbGVuYW1lXSI7CisJCVByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisJCXByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKwkJUHJvZHVjdFR5cGUgdHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgpOworCQl0eXBlLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aChwcm9kdWN0VHlwZVBhdGgpOworCQlwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHR5cGUpOworCisJCU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIsICJGb29GaWxlIik7CisJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKCJQcm9kdWN0aW9uRGF0ZSIsICIwNjA4MDQiKTsKKwkJbWV0YWRhdGEuYWRkTWV0YWRhdGEoIkZpbGVuYW1lIiwgImZvby50eHQiKTsKKworCQlSZWZlcmVuY2UgciA9IG5ldyBSZWZlcmVuY2UoKTsKKwkJcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmFkZChyKTsKKworCQlNZXRhZGF0YUJhc2VkRmlsZVZlcnNpb25lciB2ZXJzaW9uZXIgPSBuZXcgTWV0YWRhdGFCYXNlZEZpbGVWZXJzaW9uZXIoCisJCQkJZmlsZVBhdGhTcGVjKTsKKwkJdHJ5IHsKKwkJCXZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2R1Y3QsIG1ldGFkYXRhKTsKKwkJfSBjYXRjaCAoVmVyc2lvbmluZ0V4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCisJCVN0cmluZyBleHBlY3RlZCA9ICJmaWxlOi9mb28vYmFyL0Zvb0ZpbGUvc29tZS9vdGhlci9wYXRoMDYwODA0L2Zvby50eHQiOworCQlhc3NlcnRFcXVhbHMoIlRoZSByZWZlcmVuY2U6IFsiICsgci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorCQkJCSsgIl0gaXMgbm90IGVxdWFsIHRvOiBbIiArIGV4cGVjdGVkICsgIl0iLCBleHBlY3RlZCwgcgorCQkJCS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdFByb2R1Y3RUeXBlTWV0VmVyc2lvbmVyLmphdmEgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3IvdmVyc2lvbmluZy9UZXN0UHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAxYTkzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdFByb2R1Y3RUeXBlTWV0VmVyc2lvbmVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIFRlc3QgaGFybmVzcyBmb3IgUHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdFByb2R1Y3RUeXBlTWV0VmVyc2lvbmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9ICJmaWxlOi9kYXRhL2FyY2hpdmUvMTMwNjIyL3NvbWVmaWxlLnR4dCI7CisKKyAgcHVibGljIHZvaWQgdGVzdFZlcnNpb24oKSB7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJGaWxlbmFtZSIsICJzb21lZmlsZS50eHQiKTsKKyAgICBtZXQuYWRkTWV0YWRhdGEoIkFjcXVpc2l0aW9uRGF0ZSIsICIxMzA2MjIiKTsKKyAgICBQcm9kdWN0IHByb2QgPSBQcm9kdWN0LmdldERlZmF1bHRGbGF0UHJvZHVjdCgiZm9vIiwgInVybjpzb21ldHlwZTpmb28iKTsKKyAgICBwcm9kLmdldFByb2R1Y3RUeXBlKCkuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKCJmaWxlOi8vL2RhdGEvYXJjaGl2ZSIpOworICAgIHByb2QuZ2V0UHJvZHVjdFR5cGUoKS5nZXRUeXBlTWV0YWRhdGEoKQorICAgICAgICAuYWRkTWV0YWRhdGEoImZpbGVQYXRoU3BlYyIsICIvW0FjcXVpc2l0aW9uRGF0ZV0vW0ZpbGVuYW1lXSIpOworICAgIHByb2QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5hZGQoCisgICAgICAgIG5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vZGF0YS9zdGFnaW5nL3NvbWVmaWxlLnR4dCIsIG51bGwsIDRMKSk7CisgICAgUHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIgdmVyc2lvbmVyID0gbmV3IFByb2R1Y3RUeXBlTWV0VmVyc2lvbmVyKCk7CisgICAgdHJ5IHsKKyAgICAgIHZlcnNpb25lci5jcmVhdGVEYXRhU3RvcmVSZWZlcmVuY2VzKHByb2QsIG1ldCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwocHJvZCk7CisgICAgYXNzZXJ0Tm90TnVsbChwcm9kLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkpOworICAgIGFzc2VydEVxdWFscygxLCBwcm9kLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHByb2QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5nZXQoMCkKKyAgICAgICAgLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3RTaW5nbGVGaWxlQmFzaWNWZXJzaW9uZXIuamF2YSBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci92ZXJzaW9uaW5nL1Rlc3RTaW5nbGVGaWxlQmFzaWNWZXJzaW9uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI0N2QyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3ZlcnNpb25pbmcvVGVzdFNpbmdsZUZpbGVCYXNpY1ZlcnNpb25lci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuVmVyc2lvbmluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPlRlc3QgQ2FzZSBmb3IgdGhlIFNpbmdsZSBGaWxlIEJhc2ljIFZlcnNpb25lci48L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdFNpbmdsZUZpbGVCYXNpY1ZlcnNpb25lciBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByaXZhdGUgU3RyaW5nIG9yaWdGaWxlUmVmID0gImZpbGU6L2Zvby9iYXIvdGVzdGZpbGUudHh0IjsKKwkKKwlwcml2YXRlIFN0cmluZyBleHBlY3RlZERlc3RGaWxlUmVmID0gImZpbGU6L2Zvby9iYXIyL3Rlc3RmaWxlLnR4dCI7CisJCisJcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdFJlcG9QYXRoID0gImZpbGU6L2Zvby9iYXIyLyI7CisJCisgIHByaXZhdGUgUHJvcGVydGllcyBpbml0aWFsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL21pbWUtdHlwZXMueG1sIik7CisgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1pbWUudHlwZS5yZXBvc2l0b3J5IiwKKyAgICAgICAgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhpbml0aWFsUHJvcGVydGllcyk7CisgIH0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbmluZygpeworCQlQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworCQlQcm9kdWN0VHlwZSB0eXBlID0gbmV3IFByb2R1Y3RUeXBlKCk7CisJCXR5cGUuc2V0UHJvZHVjdFJlcG9zaXRvcnlQYXRoKHByb2R1Y3RSZXBvUGF0aCk7CisJCXByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKwkJcHJvZHVjdC5zZXRQcm9kdWN0VHlwZSh0eXBlKTsKKwkJCisJCU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisJCW1ldGFkYXRhLmFkZE1ldGFkYXRhKFNpbmdsZUZpbGVCYXNpY1ZlcnNpb25lci5GSUxFTkFNRV9GSUVMRCwgInRlc3RmaWxlLnR4dCIpOworCQkKKwkJUmVmZXJlbmNlIHIgPSBuZXcgUmVmZXJlbmNlKCk7CisJCXIuc2V0T3JpZ1JlZmVyZW5jZShvcmlnRmlsZVJlZik7CisJCQorCQlwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuYWRkKHIpOworCQkKKwkJU2luZ2xlRmlsZUJhc2ljVmVyc2lvbmVyIHZlcnNpb25lciA9IG5ldyBTaW5nbGVGaWxlQmFzaWNWZXJzaW9uZXIoKTsKKwkJdHJ5eworCQkJdmVyc2lvbmVyLmNyZWF0ZURhdGFTdG9yZVJlZmVyZW5jZXMocHJvZHVjdCwgbWV0YWRhdGEpOworCQl9CisJCWNhdGNoKFZlcnNpb25pbmdFeGNlcHRpb24gZSl7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQkKKwkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2VuZXJhdGVkIHJlZjogWyIrci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSsiXSBpcyBub3QgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHJlZjogWyIrZXhwZWN0ZWREZXN0RmlsZVJlZisiXSIsIGV4cGVjdGVkRGVzdEZpbGVSZWYsIHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworCQkKKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2NtZC1saW5lLWFjdGlvbnMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI3MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbApAQCAtMCwwICsxLDEyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBBdXRob3I6IGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKwk8YmVhbiBpZD0iYWRkUHJvZHVjdFR5cGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5BZGRQcm9kdWN0VHlwZUNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkFkZHMgYSBQcm9kdWN0VHlwZSB0byBsaXN0IG9mIHN1cHBvcnRlZCBQcm9kdWN0VHlwZXMiIC8+CisJPC9iZWFuPgorICA8YmVhbiBpZD0iZGVsZXRlUHJvZHVjdEJ5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkRlbGV0ZVByb2R1Y3RCeU5hbWVDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlbGV0ZSBQcm9kdWN0IGJ5IG5hbWUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImRlbGV0ZVByb2R1Y3RCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uRGVsZXRlUHJvZHVjdEJ5SWRDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlbGV0ZSBQcm9kdWN0IGJ5IElEIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJkdW1wTWV0YWRhdGEiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5EdW1wTWV0YWRhdGFDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkR1bXBzIFByb2R1Y3QgTWV0YWRhdGEgb3V0IHRvIFhNTCIgLz4KKyAgPC9iZWFuPgorCTxiZWFuIGlkPSJnZXRDdXJyZW50VHJhbnNmZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRDdXJyZW50VHJhbnNmZXJDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgdGhlIHN0YXR1cyBvZiB0aGUgY3VycmVudCBQcm9kdWN0IGZpbGUgdHJhbnNmZXIiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldEN1cnJlbnRUcmFuc2ZlcnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRDdXJyZW50VHJhbnNmZXJzQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgUHJvZHVjdCBmaWxlIHRyYW5zZmVycyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWRDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgdGhlIHBlcmNlbnQgYW1vdW50IHRyYW5zZmVycmVkIG9mIGdpdmVuIGZpbGUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldEZpcnN0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldEZpcnN0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBmaXJzdCBwYWdlIG9mIFByb2R1Y3RzIG9mIGdpdmVuIFByb2R1Y3RUeXBlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRMYXN0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldExhc3RQYWdlQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGxhc3QgcGFnZSBvZiBQcm9kdWN0cyBvZiBnaXZlbiBQcm9kdWN0VHlwZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0TmV4dFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXROZXh0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBuZXh0IHBhZ2Ugb2YgUHJvZHVjdHMgb2YgZ2l2ZW4gUHJvZHVjdFR5cGUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldE51bVByb2R1Y3RzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0TnVtUHJvZHVjdHNDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgbnVtYmVyIG9mIFByb2R1Y3RzIGluZ2VzdGVkIGZvciBhIGdpdmVuIFByb2R1Y3RUeXBlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRQcmV2UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldFByZXZQYWdlQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHByZXYgcGFnZSBvZiBQcm9kdWN0cyBvZiBnaXZlbiBQcm9kdWN0VHlwZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdEJ5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldFByb2R1Y3RCeU5hbWVDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldCBQcm9kdWN0IGluZm8gYnkgbmFtZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdEJ5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcm9kdWN0QnlJZENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBQcm9kdWN0IGluZm8gYnkgSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHBlcmNlbnQgYW1vdW50IHRyYW5zZmVycmVkIG9mIGEgUHJvZHVjdHMgZGF0YSBmaWxlcyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdFR5cGVCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcm9kdWN0VHlwZUJ5TmFtZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBhIFByb2R1Y3RUeXBlIGJ5IGl0cyBuYW1lIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJoYXNQcm9kdWN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uSGFzUHJvZHVjdENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2tzIGlmIFByb2R1Y3Qgd2l0aCBnaXZlbiBuYW1lIGhhcyBiZWVuIGluZ2VzdGVkIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJpbmdlc3RQcm9kdWN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uSW5nZXN0UHJvZHVjdENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iSW5nZXN0cyBhIFByb2R1Y3QiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9Imx1Y2VuZVF1ZXJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uTHVjZW5lUXVlcnlDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlF1ZXJpZXMgYnkgcGFyc2luZyBhbiBMdWNlbmUtbGlrZSBxdWVyeSBpbnRvIGEgRmlsZU1hbmFnZXIgUXVlcnkiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InJldHJpZXZlRmlsZXNCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uUmV0cmlldmVGaWxlc0NsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUmV0cmlldmUgYSBQcm9kdWN0J3MgZmlsZXMgYnkgUHJvZHVjdCBJRCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0icmV0cmlldmVGaWxlc0J5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLlJldHJpZXZlRmlsZXNDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJldHJpZXZlIGEgUHJvZHVjdCdzIGZpbGVzIGJ5IFByb2R1Y3QgbmFtZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0ic3FsUXVlcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5TcWxRdWVyeUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUXVlcmllcyBieSBwYXJzaW5nIGFuIFNRTC1saWtlIHF1ZXJ5IGludG8gYSBGaWxlTWFuYWdlciBRdWVyeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGV0YWlsZWREZXNjcmlwdGlvbiI+CisgICAgICA8dmFsdWU+CisgVGhpcyBzdXBwb3J0cyBzZW5kaW5nIHF1ZXJpZXMgdG8gdGhlIEZpbGVNYW5hZ2VyIGluIGZvcm0gb2YKKyAgU0VMRUNUIFtFbGVtZW50c10gRlJPTSBbUHJvZHVjdFR5cGVzXSBXSEVSRSBbd2hlcmUtY2xhdXNlXSwgd2hlcmU6CisgICAtIFtFbGVtZW50c106IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgRWxlbWVudCBuYW1lczsgbWF5IGFsc28gYmUgKiB3aGljaAorICAgIHJlcHJlc2VudHMgYWxsIEVsZW1lbnRzCisgICAtIFtQcm9kdWN0VHlwZXNdOiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFByb2R1Y3RUeXBlIG5hbWVzOyBtYXkgYWxzbworICAgIGJlICogd2hpY2ggcmVwcmVzZW50cyBhbGwgUHJvZHVjdFR5cGVzCisgICAtIFt3aGVyZS1jbGF1c2VdOiBpcyBhbiBvcHRpb25hbCBFbGVtZW50IG5hbWUgZmlsdGVyIHN1cHBvcnRpbmcgdGhlIGZvbGxvd2luZzoKKyAgICAgICogQU5EIGFuZCBPUiBib29sZWFuIG9wZXJhdG9ycworICAgICAgKiAoKSBncm91cGluZyBvZiBxdWVyaWVzCisgICAgICAqIGVsZW1lbnQtbmFtZSA9PSAnZWxlbWVudC12YWx1ZScKKyAgICAgICogZWxlbWVudC1uYW1lICYjNjA7ICdlbGVtZW50LXZhbHVlJworICAgICAgKiBlbGVtZW50LW5hbWUgJiM2MjsgJ2VsZW1lbnQtdmFsdWUnCisgICAgICAqIGVsZW1lbnQtbmFtZSAmIzYwOz0gJ2VsZW1lbnQtdmFsdWUnCisgICAgICAqIGVsZW1lbnQtbmFtZSAmIzYyOz0gJ2VsZW1lbnQtdmFsdWUnIgorCisgQW4gYWRkaXRpb25hbCBwb3N0LXF1ZXJ5IEZpbHRlckFsZ29yIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB3aGVyZSB5b3Ugc3BlY2lmeQorICB3aGljaCBNZXRhZGF0YSBmaWVsZHMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgZWFjaCBQcm9kdWN0J3MgU3RhcnREYXRlVGltZSwKKyAgRW5kRGF0ZVRpbWUsIGFuZCBQcmlvcml0eSB2YWx1ZXMKKyAgICAgIDwvdmFsdWU+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXhhbXBsZXMiPgorICAgICAgPHZhbHVlPgorIChBc3N1bWUgeW91IGhhdmUgYSBQcm9kdWN0VHlwZSwgR2VuZXJpY0ZpbGUsIHdoaWNoIHN1cHBvcnRzIHRoZQorICAgIEVsZW1lbnRzOiBGaWxlbmFtZSwgTm9taW5hbERhdGUsIEdyb3VwLCBhbmQgRGF0YVZlcnNpb24pCisgICQgLi9maWxlbWdyLWNsaWVudCAtdSBodHRwOi8vbG9jYWxob3N0OjkwMDAgLW9wIC1zcWwKKyAgICAtcSAiU0VMRUNUIEZpbGVuYW1lIEZST00gR2VuZXJpY0ZpbGUgV0hFUkUgKE5vbWluYWxEYXRlID09ICcyMDExLTIwLTEwJyBPUgorICAgICAgTm9taW5hbERhdGUgPT0gJzIwMTEtMjAtMTEnKSBBTkQgR3JvdXAgPT0gJ1Rlc3QnIEFORCBEYXRhVmVyc2lvbiA+ICcxLjAnIgorIChSZXR1cm5zIGFsbCBQcm9kdWN0cyBpbiBGaWxlTWFuYWdlciAtLSB1c2Ugd2l0aCBjYXJlKQorICAkIC4vZmlsZW1nci1jbGllbnQgLXUgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC1vcCAtc3FsIC1xICJTRUxFQ1QgKiBGUk9NICoiCisgICAgICA8L3ZhbHVlPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2NtZC1saW5lLW9wdGlvbnMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmRmYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApAQCAtMCwwICsxLDEyMDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgICAgICAgICAgcml2ZXJtYSAoUmlzaGkgVmVybWEpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisJPGJlYW4gaWQ9InVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ1IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsZSBNYW5hZ2VyIFVSTCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0idXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbgorCQkJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5TZXRKYXZhUHJvcGVydGllc0hhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eU5hbWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnVybDwvdmFsdWU+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJvcGVyYXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib3AiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib3BlcmF0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iCisJCQl2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByZXNlbnQgYW4gb3BlcmF0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImFkZFByb2R1Y3RUeXBlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImRlbGV0ZVByb2R1Y3RCeUlkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iaW5nZXN0UHJvZHVjdCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJoYXNQcm9kdWN0IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFByb2R1Y3RUeXBlQnlOYW1lIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldE51bVByb2R1Y3RzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldEZpcnN0UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXROZXh0UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRQcmV2UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRMYXN0UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRDdXJyZW50VHJhbnNmZXIiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0Q3VycmVudFRyYW5zZmVycyIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRQcm9kdWN0QnlJZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRQcm9kdWN0QnlOYW1lIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFByb2R1Y3RQY3RUcmFuc2ZlcnJlZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRGaWxlUGN0VHJhbnNmZXJyZWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0ic3FsUXVlcnkiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZHVtcE1ldGFkYXRhIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9Imx1Y2VuZVF1ZXJ5IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InJldHJpZXZlRmlsZXNCeUlkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gQWRkUHJvZHVjdFR5cGUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iYWRkUHJvZHVjdFR5cGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImFkZFBUIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImFkZFByb2R1Y3RUeXBlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBhZGRQcm9kdWN0VHlwZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5hZGRQcm9kdWN0VHlwZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisgIDxiZWFuIGlkPSJ0eXBlSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0aWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ0eXBlSWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdFR5cGUgSWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJwcm9kdWN0LXR5cGUtaWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDptZXRob2ROYW1lPSJzZXRQcm9kdWN0VHlwZUlkIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InR5cGVOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idG4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ0eXBlTmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0VHlwZSBuYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icHJvZHVjdC10eXBlLW5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDptZXRob2ROYW1lPSJzZXRQcm9kdWN0VHlwZU5hbWUiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0idHlwZURlc2MiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0ZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InR5cGVEZXNjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3RUeXBlIGRlc2NyaXB0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGVzY3JpcHRpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDptZXRob2ROYW1lPSJzZXRQcm9kdWN0VHlwZURlc2NyaXB0aW9uIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlcG9zaXRvcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJyZXBvIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVwb3NpdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0VHlwZSByZXBvc2l0b3J5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZS1wYXRoIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6bWV0aG9kTmFtZT0ic2V0RmlsZVJlcG9zaXRvcnlQYXRoIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InZlcnNpb25DbGFzcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InZjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idmVyc2lvbkNsYXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3RUeXBlIHZlcnNpb25lciBjbGFzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOm1ldGhvZE5hbWU9InNldFZlcnNpb25lciIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gSW5nZXN0UHJvZHVjdCBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iaW5nZXN0UHJvZHVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImluZ2VzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImluZ2VzdFByb2R1Y3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgaW5nZXN0UHJvZHVjdCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmluZ2VzdFByb2R1Y3Q8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icHJvZHVjdFN0cnVjdHVyZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdFN0cnVjdHVyZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJIaWVyYXJjaGljYWwgfCBGbGF0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ic3RydWN0dXJlLXR5cGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6bWV0aG9kTmFtZT0ic2V0UHJvZHVjdFN0cnVjdHVyZSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJtZXRhZGF0YUZpbGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtZiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1ldGFkYXRhRmlsZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNZXRhZGF0YSBYTUwgZmlsZSBwYXRoIG9yIFVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtcGF0aC1vci11cmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iY2xpZW50VHJhbnNmZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNsaWVudFRyYW5zZmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlVzZXIgY2xpZW50IHRyYW5zZmVyZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImRhdGFUcmFuc2ZlciIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImRhdGFUcmFuc2ZlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRhdGFUcmFuc2ZlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEYXRhVHJhbnNmZXJlciBmYWN0b3J5IGNsYXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iY2xhc3NwYXRoIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOm1ldGhvZE5hbWU9InNldERhdGFUcmFuc2ZlcmVyIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlZnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJycyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlZnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGF0YSBmaWxlIHBhdGggb3IgVVJMIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlLXBhdGgtb3ItdXJsIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOm1ldGhvZE5hbWU9InNldFJlZmVyZW5jZXMiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEhhc1Byb2R1Y3QgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9Imhhc1Byb2R1Y3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcm9kdWN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaGFzUHJvZHVjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBoYXNQcm9kdWN0IEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+aGFzUHJvZHVjdDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaGFzUHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJvZHVjdFR5cGVCeU5hbWUgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RUeXBlQnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHRieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0VHlwZUJ5TmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcm9kdWN0VHlwZUJ5TmFtZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByb2R1Y3RUeXBlQnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0VHlwZUJ5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0TnVtUHJvZHVjdHMgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldE51bVByb2R1Y3RzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibnVtIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TnVtUHJvZHVjdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0TnVtUHJvZHVjdHMgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXROdW1Qcm9kdWN0czwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TnVtUHJvZHVjdHMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEZpcnN0UGFnZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0Rmlyc3RQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGFnZTEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRGaXJzdFBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Rmlyc3RQYWdlIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0Rmlyc3RQYWdlPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRGaXJzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldE5leHRQYWdlIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXROZXh0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im5leHQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXROZXh0UGFnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXROZXh0UGFnZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldE5leHRQYWdlPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJldlBhZ2UgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByZXZQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHJldiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFByZXZQYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFByZXZQYWdlIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0UHJldlBhZ2U8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByZXZQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBHZXRMYXN0UGFnZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0TGFzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJsYXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TGFzdFBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0TGFzdFBhZ2UgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRMYXN0UGFnZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TGFzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEN1cnJlbnRUcmFuc2ZlciBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0Q3VycmVudFRyYW5zZmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY3VyVHJhbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEN1cnJlbnRUcmFuc2ZlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRDdXJyZW50VHJhbnNmZXIgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRDdXJyZW50VHJhbnNmZXI8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEN1cnJlbnRUcmFuc2ZlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0Q3VycmVudFRyYW5zZmVycyBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0Q3VycmVudFRyYW5zZmVycyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImN1clRyYW5zIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0Q3VycmVudFRyYW5zZmVycyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRDdXJyZW50VHJhbnNmZXJzIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0Q3VycmVudFRyYW5zZmVyczwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0Q3VycmVudFRyYW5zZmVycyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZCBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGN0VHJhbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldEZpbGVQY3RUcmFuc2ZlcnJlZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImZpbGVQY3RUcmFucyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEZpbGVQY3RUcmFuc2ZlcnJlZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJvcmlnUmVmIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib3IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvcmlnUmVmIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik9yaWdpbmFsIHJlZmVyZW5jZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtcGF0aC1vci11cmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIFNxbFF1ZXJ5IE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJzcWxRdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNxbCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InNxbFF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHNxbFF1ZXJ5IEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+c3FsUXVlcnk8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKworCisgIDwhLS0gR2V0UHJvZHVjdEJ5SWQgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGJ5aWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0QnlJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcm9kdWN0QnlJZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByb2R1Y3RCeUlkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJvZHVjdEJ5TmFtZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdEJ5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0QnlOYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFByb2R1Y3RCeU5hbWUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRQcm9kdWN0QnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0QnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBEZWxldGVQcm9kdWN0QnlJZCBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZGVsZXRlUHJvZHVjdEJ5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkYnlpZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRlbGV0ZVByb2R1Y3RCeUlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGRlbGV0ZVByb2R1Y3RCeUlkIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+ZGVsZXRlUHJvZHVjdEJ5SWQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImRlbGV0ZVByb2R1Y3RCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBEZWxldGVQcm9kdWN0QnlOYW1lIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJkZWxldGVQcm9kdWN0QnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZGJ5biIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZGVsZXRlUHJvZHVjdEJ5TmFtZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmRlbGV0ZVByb2R1Y3RCeU5hbWU8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIER1bXBNZXRhZGF0YSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZHVtcE1ldGFkYXRhIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZG1ldCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImR1bXBNZXRhZGF0YSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBkdW1wTWV0YWRhdGEgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5kdW1wTWV0YWRhdGE8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImR1bXBNZXRhZGF0YSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJvdXRwdXREaXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJvdXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvdXRwdXREaXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iT3V0cHV0IGRpcmVjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEuaW8uRmlsZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtZGlyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkdW1wTWV0YWRhdGEiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEx1Y2VuZVF1ZXJ5IE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJsdWNlbmVRdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Imx1Y2VuZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Imx1Y2VuZVF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGx1Y2VuZVF1ZXJ5IEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+bHVjZW5lUXVlcnk8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlZHVjZWRQcm9kdWN0VHlwZXMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWR1Y2VkUHJvZHVjdFR5cGVzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkxpbWl0IHF1ZXJ5IFByb2R1Y3RUeXBlcyBxdWVyaWVkIGFnYWluc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Imxpc3Qtb2YtcHJvZHVjdC10eXBlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icmVkdWNlZE1ldGFkYXRhS2V5cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im1ldEtleXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWR1Y2VkTWV0YWRhdGFLZXlzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkxpbWl0IEVsZW1lbnRzIHJldHVybmVkIGJ5IHF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJsaXN0LW9mLWVsZW1lbnRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gcmV0cmlldmVGaWxlcyBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0icmV0cmlldmVGaWxlc0J5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJyZmJ5aWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXRyaWV2ZUZpbGVzQnlJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZXRyaWV2ZUZpbGVzQnlJZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPnJldHJpZXZlRmlsZXNCeUlkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icmZieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHJldHJpZXZlRmlsZXNCeU5hbWUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5yZXRyaWV2ZUZpbGVzQnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InRyYW5zZmVyZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0cmFucyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InRyYW5zZmVyZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmFjdG9yeSBmb3IgY3JlYXRpbmcgRGF0YVRyYW5zZmVyIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgZmlsZSB0cmFuc2ZlcihzKSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyRmFjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InRyYW5zZmVyIGZhY3RvcnkgY2xhc3MiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5SWQiIHA6bWV0aG9kTmFtZT0ic2V0RGF0YVRyYW5zZmVyRmFjdG9yeSIgLz4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6bWV0aG9kTmFtZT0ic2V0RGF0YVRyYW5zZmVyRmFjdG9yeSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJkZXN0aW5hdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImRlc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZXN0aW5hdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEaXJlY3RvcnkgdG8gdHJhbnNmZXIgUHJvZHVjdCBmaWxlIHRvIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS5pby5GaWxlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGlyZWN0b3J5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworCTwhLS0gT3B0aW9ucyB1c2VkIGZvciBtdWx0aXBsZSBBY3Rpb25zIC0tPgorICA8YmVhbiBpZD0icHJvZHVjdElkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdElkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3QgSUQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJwcm9kdWN0LWlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdEJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkZWxldGVQcm9kdWN0QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImR1bXBNZXRhZGF0YSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisJCisgIDxiZWFuIGlkPSJwcm9kdWN0TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdE5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdCBuYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icHJvZHVjdC1uYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaGFzUHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkZWxldGVQcm9kdWN0QnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJwcm9kdWN0VHlwZU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwdG4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcm9kdWN0VHlwZU5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdFR5cGUgbmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InByb2R1Y3QtdHlwZS1uYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdFR5cGVCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXROdW1Qcm9kdWN0cyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEZpcnN0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRMYXN0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKyAgCisgIDxiZWFuIGlkPSJjdXJyZW50UGFnZU51bSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImN1clBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJjdXJyZW50UGFnZU51bSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDdXJyZW50IFBhZ2UgTnVtYmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iaW50IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icGFnZS1udW1iZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icXVlcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJxIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icXVlcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsZSBNYW5hZ2VyIHF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icXVlcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ic29ydEJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic2IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzb3J0QnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWV0YWRhdGEgZmllbGQgdG8gc29ydCBxdWVyeSByZXN1bHRzIGJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWV0YWRhdGEgZmllbGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ib3V0cHV0Rm9ybWF0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib2YiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvdXRwdXRGb3JtYXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iT3V0cHV0IGZvcm1hdCBzdHJpbmcgKGkuZS4gRmlsZW5hbWUgPSAkRmlsZW5hbWUpIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ib3V0cHV0LWZvcm1hdC1zdHJpbmciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iZGVsaW1pdGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZGxtdHIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZWxpbWl0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iU3RyaW5nIHRvIHVzZSB0aGUgc2VwYXJhdGUgcXVlcnkgcmVzdWx0cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRlbGltaXRlci1zdHJpbmciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iZmlsdGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImZpbHRlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJRdWVyeSBmaWx0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImFsZ29yIiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iY29udmVydGVyIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InN0YXJ0RGF0ZVRpbWVNZXRLZXkiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJlbmREYXRlVGltZU1ldEtleSIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InByaW9yaXR5TWV0S2V5IiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iYWxnb3IiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYWxnb3IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhbGdvciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJGaWx0ZXJBbGdvciBjbGFzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorICAKKyAgPGJlYW4gaWQ9ImNvbnZlcnRlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjb252IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iY29udmVydGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlZlcnNpb25Db252ZXJ0ZXIgY2xhc3MiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5jb252LlZlcnNpb25Db252ZXJ0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjbGFzc3BhdGgiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ic3RhcnREYXRlVGltZU1ldEtleSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzZHRNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzdGFydERhdGVUaW1lTWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlN0YXJ0IGRhdGUgdGltZSBtZXRhZGF0YSBrZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJtZXRhZGF0YS1rZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKyAgCisgIDxiZWFuIGlkPSJlbmREYXRlVGltZU1ldEtleSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJlZHRNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJlbmREYXRlVGltZU1ldEtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJFbmQgZGF0ZSB0aW1lIG1ldGFkYXRhIGtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im1ldGFkYXRhLWtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorICAKKyAgPGJlYW4gaWQ9InByaW9yaXR5TWV0S2V5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InByTWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpb3JpdHlNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpb3JpdHkgbWV0YWRhdGEga2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWV0YWRhdGEta2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jb3JlL2VsZW1lbnRzLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9lbGVtZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwY2NkYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9lbGVtZW50cy54bWwKQEAgLTAsMCArMSw3NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6ZWxlbWVudHMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIgbmFtZT0iQ0FTLlByb2R1Y3RJZCI+CisJCTxkY0VsZW1lbnQ+SWRlbnRpZmllcjwvZGNFbGVtZW50PgorICAgICAgICA8IS0tICAKKyAgICAgICAgIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgJ3RyaW0nIHRhZyB0byBpZGVudGlmeSB3aGV0aGVyCisgICAgICAgICBvciBub3QgeW91IHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLiBUbworICAgICAgICAgdHVybiBvZmYgdHJpbW1pbmcgKG5vdyBkb25lIGJ5IGRlZmF1bHQpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgd2l0aCB5b3VyCisgICAgICAgICBkZXNjcmlwdGlvbiBkZWZpbml0aW9uOiB0cmltPSJmYWxzZSIgICAgICAgCisgICAgICAgICAtLT4KKwkJPGRlc2NyaXB0aW9uPgorCQkJQSBQcm9kdWN0J3MgdW5pcXVlIGlkZW50aWZpZXIgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdE5hbWUiIG5hbWU9IkNBUy5Qcm9kdWN0TmFtZSI+CisJCTxkY0VsZW1lbnQ+VGl0bGU8L2RjRWxlbWVudD4KKwkJPGRlc2NyaXB0aW9uPgorCQkJQSBQcm9kdWN0J3MgbmFtZSB3aXRoaW4gdGhlIENBUyBuYW1lc3BhY2UuCisJCTwvZGVzY3JpcHRpb24+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIgorCQluYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSI+CisJCTxkY0VsZW1lbnQgLz4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIElTTyA4NjAxIGZvcm1hdHRlZCB0aW1lIHRoYXQgdGhlIFByb2R1Y3Qgd2FzIHJlY2VpdmVkLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RmlsZW5hbWUiIG5hbWU9IkZpbGVuYW1lIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHJlcHJlc2VudCB0aGlzIHByb2R1Y3QuCisJCTwvZGVzY3JpcHRpb24+CisJCTxkY0VsZW1lbnQgLz4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVMb2NhdGlvbiIgbmFtZT0iRmlsZUxvY2F0aW9uIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIGxvY2F0aW9ucyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIgbmFtZT0iUHJvZHVjdFR5cGUiPgorCQk8ZGVzY3JpcHRpb24+CisJCQlUeXBlIG9mIHByb2R1Y3QsIGFzIHNwZWNpZmllZCBieSwgZS5nLiwgYSBkYXRhIGJpYmxlLgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0U3RydWN0dXJlIiBuYW1lPSJQcm9kdWN0U3RydWN0dXJlIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJV2hldGhlciBvciBub3QgYSBwcm9kdWN0IGlzIEZsYXQgKGUuZy4sIGEgc2V0IG9mIGluZGVwZW5kZW50CisJCQlmaWxlcyksIG9yIGhpZXJhcmNoaWNhbCwgZS5nLiwgYSBkaXIgc3RydWN0dXJlLgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpNaW1lVHlwZSIgbmFtZT0iTWltZVR5cGUiPgorCQk8ZGVzY3JpcHRpb24+VGhlIElFVEYgbWltZSB0eXBlIG9mIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46dGVzdDpEYXRhVmVyc2lvbiIgbmFtZT0iRGF0YVZlcnNpb24iPgorCQk8ZGVzY3JpcHRpb24+VGhlIHZlcnNpb24gb2YgdGhlIGRhdGEgcHJvZHVjdDwvZGVzY3JpcHRpb24+CisJCTxkY0VsZW1lbnQgLz4KKwk8L2VsZW1lbnQ+Cis8L2NhczplbGVtZW50cz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jb3JlL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmMGI2MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY29yZS9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlbWFwIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorIDwhLS0gIGNhbiBzZXQgdGhlICJwYXJlbnQiIGF0dHJpYnV0ZSBvbiB0eXBlcyBiZWxvdyB0byBhbGxvdyBpbmhlcml0YW5jZQorICAgICAgIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHR5cGVzIAorICAtLT4KKyAgIDx0eXBlIGlkPSJ1cm46b29kdDpHZW5lcmljRmlsZSI+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RSZWNlaXZlZFRpbWUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdE5hbWUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdElkIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RUeXBlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RTdHJ1Y3R1cmUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RmlsZW5hbWUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RmlsZUxvY2F0aW9uIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0Ok1pbWVUeXBlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjp0ZXN0OkRhdGFWZXJzaW9uIi8+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlbWFwPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jb3JlL3Byb2R1Y3QtdHlwZXMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jb3JlL3Byb2R1Y3QtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2ZkNTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NvcmUvcHJvZHVjdC10eXBlcy54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6cHJvZHVjdHR5cGVzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiIG5hbWU9IkdlbmVyaWNGaWxlIj4KKyAgICA8cmVwb3NpdG9yeSBwYXRoPSJmaWxlOi8vW0hPTUVdL2ZpbGVzIi8+CisgICAgPHZlcnNpb25lciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuQmFzaWNWZXJzaW9uZXIiLz4KKyAgICA8IS0tICAKKyAgICAgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAndHJpbScgdGFnIHRvIGlkZW50aWZ5IHdoZXRoZXIKKyAgICAgb3Igbm90IHlvdSB3YW50IG5ld2xpbmVzIHRyaW1tZWQgZnJvbSB0aGUgcHJvZHVjdCB0eXBlIGRlc2NyaXB0aW9uLiBUbworICAgICB0dXJuIG9mZiB0cmltbWluZyAobm93IGRvbmUgYnkgZGVmYXVsdCksIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgd2l0aCB5b3VyCisgICAgIGRlc2NyaXB0aW9uIGRlZmluaXRpb246IHRyaW09ImZhbHNlIiAgICAgICAKKyAgICAgLS0+CisgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgIDwhLS0gR2xvYmFsIGFnZ3JlZ2F0ZSBwcm9kdWN0IHR5cGUgbWV0YWRhdGE6IHlvdSBjYW4gZGVjbGFyZSB0aGlzIGluIHRoZSAKKyAgICAgICAgIHNhbWUgd2F5IHlvdSdkIHdpcmUgdG9nZXRoZXIgYSBDQVMgbWV0IGZpbGUsIGV2ZW4gdXNpbmcgbXVsdGlwbGUgdmFsdWVzCisgICAgICAgICBwZXIga2V5LgorICAgICAgICAgCisgICAgICAgICBUaGlzIG1ldGFkYXRhIGNhbiBiZSBsb29rZWQgdXAgdmlhIHRoZSBQcm9kdWN0IFR5cGUgQVBJLCBhbmQgYWxzbyB1c2VkIAorICAgICAgICAgaW4gYnJvd3NlcnMgYW5kIHNvIGZvcnRoIHRvIGRpc3BsYXkgZ2xvYmFsIG1ldGFkYXRhIGFib3V0IHRoZSBjb2xsZWN0aW9uIAorICAgICAgICAgb2YgUHJvZHVjdHMgcGFydCBvZiB0aGlzIHByb2R1Y3QgdHlwZS4KKyAgICAtLT4KKyAgICA8bWV0YWRhdGE+CisgICAgICA8a2V5dmFsPgorICAgICAgICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgICAgICAgIDx2YWw+R2VuZXJpY0ZpbGU8L3ZhbD4KKyAgICAgIDwva2V5dmFsPgorICAgICAgPCEtLSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5Qcm9kdWN0VHlwZU1ldFZlcnNpb25lciAKKyAgICAgICAgICAgeW91IGNhbiBzZXQgYSBtZXQga2V5IGxpa2UgYmVsb3cgdG8gZGVmaW5lIHlvdXIgZmlsZVBhdGhTcGVjCisgICAgICA8a2V5dmFsPgorICAgICAgICA8a2V5PmZpbGVQYXRoU3BlYzwva2V5PgorICAgICAgICA8dmFsPi9bRmlsZW5hbWVdPC92YWw+CisgICAgICA8L2tleXZhbD4KKyAgICAgIC0tPgorICAgIDwvbWV0YWRhdGE+CisgICAgPG1ldEV4dHJhY3RvcnM+CisgICAgICA8ZXh0cmFjdG9yCisgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5Db3JlTWV0RXh0cmFjdG9yIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLSAgeW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIGVudlJlcGxhY2UgdGFnIHRvIHR1cm4gb24vb2ZmIGVudmlyb25tZW50IHZhciByZXBsYWNlbWVudCAtLT4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibnNBd2FyZSIgdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnROcyIgdmFsdWU9IkNBUyIgLz4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxlbWVudHMiCisgICAgICAgICAgICB2YWx1ZT0iUHJvZHVjdFJlY2VpdmVkVGltZSxQcm9kdWN0TmFtZSxQcm9kdWN0SWQiIC8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvZXh0cmFjdG9yPgorICAgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuTWltZVR5cGVFeHRyYWN0b3IiIC8+CisgICAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlcy5GaW5hbEZpbGVMb2NhdGlvbkV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0gdGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgRklMRV9MT0NBVElPTiBmaWVsZAorICAgICAgICAgICAgICAgY29tcHV0ZWQgYnkgdGhpcyBleHRyYWN0b3IgdG8gcmVwbGFjZSBhbnkgb3RoZXIgRklMRV9MT0NBVElPTiBtZXQgCisgICAgICAgICAgICAgICBhdHRyaWJ1dGUuCisgICAgICAgICAgIC0tPgorICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVwbGFjZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9leHRyYWN0b3I+CisgICAgICAKKyAgICAgIDwhLS0gCisgICAgICAgIFRoZSBiZWxvdyBlbmFibGVzIHRoZSBGaWxlbmFtZVJlZ2V4TWV0RXh0cmFjdG9yLgorICAgICAgICBJdCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgYSBmaWxlbmFtZSBwYXR0ZXJuIHdpdGggSmF2YSBSZWdleCB0aGF0IGlkZW50aWZpZXMgZ3JvdXBzIAorICAgICAgICB3aXRoaW4gYSBwYXJ0aWN1bGFyIGZpbGUgbmFtZS4gVGhvc2UgZ3JvdXBzIGFyZSB0aGVuIG1hcHBlZCB0byBNZXRhZGF0YSBrZXkgbmFtZXMsIGFuZCAKKyAgICAgICAgZXh0cmFjdGVkIGFzIG1ldGFkdGEgZnJvbSBhIGZpbGUncyBuYW1lLgorICAgICAgICAKKyAgICAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZXJlIGFyZSB0d28gZ3JvdXBzLCBGaWxlbmFtZSwgYW5kIFByb2R1Y3RJZCwgZm9yIGZpbGVzCisgICAgICAgIG9mIHRoZSBmb3JtOgorICAgICAgICAKKyAgICAgICAgRmlsZW5hbWVfUHJvZHVjdElkLnR4dAorICAgICAgICAKKyAgICAgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJjdG9ycy5leGFtcGxlcy5GaWxlbmFtZVJlZ2V4TWV0RXh0cmFjdG9yIj4KKyAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlbmFtZVBhdHRlcm4iIHZhbHVlPSIoXFx3KilfKFxcZCopXFwudHh0Ii8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWV0YWRhdGFLZXlzIiB2YWx1ZT0iRmlsZW5hbWUsUHJvZHVjdElkIi8+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAKKyAgICAgICAgPC9leHRyYWN0b3I+CisgICAgICAKKyAgICAgICAtLT4KKyAgICA8L21ldEV4dHJhY3RvcnM+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL2VsZW1lbnRzLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL2VsZW1lbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmZjMDEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9nZW8vZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy9jb21wb25lbnRzL2NhcyI+CisgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpMYXRpdHVkZSIgbmFtZT0iTGF0aXR1ZGUiPgorICAgIDwhLS0KKyAgICAgIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgJ3RyaW0nIHRhZyB0byBpZGVudGlmeSB3aGV0aGVyIG9yIG5vdCB5b3UKKyAgICAgIHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLiBUbyB0dXJuIG9mZiB0cmltbWluZworICAgICAgKG5vdyBkb25lIGJ5IGRlZmF1bHQpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgd2l0aCB5b3VyIGRlc2NyaXB0aW9uCisgICAgICBkZWZpbml0aW9uOiB0cmltPSJmYWxzZSIKKyAgICAtLT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBHZW9ncmFwaGljYWwgbGF0aXR1ZGUgZGF0YSBmb3IgYSBwcm9kdWN0LgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGRjRWxlbWVudCAvPgorICA8L2VsZW1lbnQ+CisgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpMb25naXR1ZGUiIG5hbWU9IkxvbmdpdHVkZSI+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgR2VvZ3JhcGhpY2FsIGxvbmdpdHVkZSBkYXRhIGZvciBhIHByb2R1Y3QuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8ZGNFbGVtZW50IC8+CisgIDwvZWxlbWVudD4KKzwvY2FzOmVsZW1lbnRzPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9nZW8vcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2YTZlYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6cHJvZHVjdHR5cGVtYXAgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5hcGFjaGUub3JnL2NvbXBvbmVudHMvY2FzIj4KKyAgPCEtLQorICAgIFlvdSBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2Ugb2YKKyAgICBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcy4KKyAgLS0+CisgIDx0eXBlIGlkPSJ1cm46b29kdDpMb2NhdGlvbkF3YXJlUHJvZHVjdCIgcGFyZW50PSJ1cm46b29kdDpHZW5lcmljRmlsZSI+CisgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkxhdGl0dWRlIi8+CisgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkxvbmdpdHVkZSIvPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZXMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9nZW8vcHJvZHVjdC10eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZDRmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvZ2VvL3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvY29tcG9uZW50cy9jYXMiPgorICA8dHlwZSBpZD0idXJuOm9vZHQ6TG9jYXRpb25Bd2FyZVByb2R1Y3QiIG5hbWU9IkxvY2F0aW9uQXdhcmVQcm9kdWN0Ij4KKyAgICA8cmVwb3NpdG9yeSBwYXRoPSJmaWxlOi8vW0hPTUVdL2ZpbGVzIi8+CisgICAgPHZlcnNpb25lciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuQmFzaWNWZXJzaW9uZXIiLz4KKyAgICA8IS0tCisgICAgICBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhICd0cmltJyB0YWcgdG8gaWRlbnRpZnkgd2hldGhlciBvciBub3QgeW91CisgICAgICB3YW50IG5ld2xpbmVzIHRyaW1tZWQgZnJvbSB0aGUgcHJvZHVjdCB0eXBlIGRlc2NyaXB0aW9uLiAgVG8gdHVybiBvZmYKKyAgICAgIHRyaW1taW5nIChub3cgZG9uZSBieSBkZWZhdWx0KSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB3aXRoCisgICAgICB5b3VyIGRlc2NyaXB0aW9uIGRlZmluaXRpb246IHRyaW09ImZhbHNlIgorICAgIC0tPgorICAgIDxkZXNjcmlwdGlvbj5BIHByb2R1Y3QgdHlwZSB3aXRoIGxvY2F0aW9uIG1ldGFkYXRhLjwvZGVzY3JpcHRpb24+CisgICAgPCEtLQorICAgICAgR2xvYmFsIGFnZ3JlZ2F0ZSBwcm9kdWN0IHR5cGUgbWV0YWRhdGE6IHlvdSBjYW4gZGVjbGFyZSB0aGlzIGluIHRoZQorICAgICAgc2FtZSB3YXkgeW91J2Qgd2lyZSB0b2dldGhlciBhIENBUyBtZXQgZmlsZSwgZXZlbiB1c2luZyBtdWx0aXBsZSB2YWx1ZXMKKyAgICAgIHBlciBrZXkuCisgICAgICAKKyAgICAgIFRoaXMgbWV0YWRhdGEgY2FuIGJlIGxvb2tlZCB1cCB2aWEgdGhlIFByb2R1Y3QgVHlwZSBBUEksIGFuZCBhbHNvIHVzZWQKKyAgICAgIGluIGJyb3dzZXJzIGFuZCBzbyBmb3J0aCB0byBkaXNwbGF5IGdsb2JhbCBtZXRhZGF0YSBhYm91dCB0aGUgY29sbGVjdGlvbgorICAgICAgb2YgUHJvZHVjdHMgcGFydCBvZiB0aGlzIHByb2R1Y3QgdHlwZS4KKyAgICAtLT4KKyAgICA8bWV0YWRhdGE+CisgICAgICA8a2V5dmFsPgorICAgICAgICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgICAgICAgIDx2YWw+TG9jYXRpb25Bd2FyZVByb2R1Y3Q8L3ZhbD4KKyAgICAgIDwva2V5dmFsPgorICAgICAgPCEtLSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5Qcm9kdWN0VHlwZU1ldFZlcnNpb25lciAKKyAgICAgICAgICAgeW91IGNhbiBzZXQgYSBtZXQga2V5IGxpa2UgYmVsb3cgdG8gZGVmaW5lIHlvdXIgZmlsZVBhdGhTcGVjCisgICAgICA8a2V5dmFsPgorICAgICAgICA8a2V5PmZpbGVQYXRoU3BlYzwva2V5PgorICAgICAgICA8dmFsPi9bRmlsZW5hbWVdPC92YWw+CisgICAgICA8L2tleXZhbD4KKyAgICAgIC0tPiAgICAgIAorICAgIDwvbWV0YWRhdGE+CisgICAgPG1ldEV4dHJhY3RvcnM+CisgICAgICA8ZXh0cmFjdG9yCisgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5Db3JlTWV0RXh0cmFjdG9yIj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLQorICAgICAgICAgICAgWW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIGVudlJlcGxhY2UgdGFnIHRvIHR1cm4gb24vb2ZmCisgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXIgcmVwbGFjZW1lbnQuCisgICAgICAgICAgLS0+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5zQXdhcmUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50TnMiIHZhbHVlPSJDQVMiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnRzIgorICAgICAgICAgICAgdmFsdWU9IlByb2R1Y3RSZWNlaXZlZFRpbWUsUHJvZHVjdE5hbWUsUHJvZHVjdElkIiAvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLk1pbWVUeXBlRXh0cmFjdG9yIiAvPgorICAgICAgPGV4dHJhY3RvcgorICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IiPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tCisgICAgICAgICAgICBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBGSUxFX0xPQ0FUSU9OIGZpZWxkCisgICAgICAgICAgICBjb21wdXRlZCBieSB0aGlzIGV4dHJhY3RvciB0byByZXBsYWNlIGFueSBvdGhlciBGSUxFX0xPQ0FUSU9OIG1ldAorICAgICAgICAgICAgYXR0cmlidXRlLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBsYWNlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICA8L21ldEV4dHJhY3RvcnM+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvZWxlbWVudHMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy90cmFjZS9lbGVtZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlZmFjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsOTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OklucHV0RmlsZXMiIG5hbWU9IklucHV0RmlsZXMiPgorICAgICAgICA8IS0tICAKKyAgICAgICAgIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgJ3RyaW0nIHRhZyB0byBpZGVudGlmeSB3aGV0aGVyCisgICAgICAgICBvciBub3QgeW91IHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLiBUbworICAgICAgICAgdHVybiBvZmYgdHJpbW1pbmcgKG5vdyBkb25lIGJ5IGRlZmF1bHQpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgd2l0aCB5b3VyCisgICAgICAgICBkZXNjcmlwdGlvbiBkZWZpbml0aW9uOiB0cmltPSJmYWxzZSIgICAgICAgCisgICAgICAgICAtLT4gICAKKyAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHNldCBvZiBpbnB1dCBmaWxlcyB0aGF0IHdlbnQgaW50byBwcm9kdWNpbmcgdGhpcyBmaWxlLjwvZGVzY3JpcHRpb24+CisgICAgICAgPGRjRWxlbWVudC8+CisgICA8L2VsZW1lbnQ+CisgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6T3V0cHV0RmlsZXMiIG5hbWU9Ik91dHB1dEZpbGVzIj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBzZXQgb2Ygb3V0cHV0IGZpbGVzIHRoYXQgaW5jbHVkZWQgdGhpcyBmaWxlIGluIGl0cyBpbnB1dC48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8ZGNFbGVtZW50Lz4KKyAgIDwvZWxlbWVudD4KKyAgIAorICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkpvYklkIiBuYW1lPSJKb2JJZCI+CisgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1bmlxdWUgaWRlbnRpZmllciBnZW5lcmF0ZWQgYnkgdGhlIHdvcmtmbG93IG1hbmFnZXIgZm9yIHRoZSBqb2IKKyAgICAgICB0aGF0IHByb2R1Y2VkIHRoaXMgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgICAgIDxkY0VsZW1lbnQvPiAgIAorICAgPC9lbGVtZW50PgorICAgCisgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdGlvbkRhdGVUaW1lIiBuYW1lPSJQcm9kdWN0aW9uRGF0ZVRpbWUiPgorICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGF0ZS90aW1lIHN0YW1wIHRoYXQgdGhpcyBmaWxlIHdhcyBwcm9kdWNlZCBlaXRoZXIgYnkgaW5nZXN0aW9uIAorICAgICAgIG9yIHByb2Nlc3NpbmcuPC9kZXNjcmlwdGlvbj4KKyAgICAgICA8ZGNFbGVtZW50Lz4KKyAgIDwvZWxlbWVudD4KKyAgIAorICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkV4ZWN1dGFibGVQYXRobmFtZXMiIG5hbWU9IkV4ZWN1dGFibGVQYXRobmFtZXMiPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgcGF0aG5hbWVzIHRvIHRoZSBleGVjdHVhYmxlcyB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisKKyAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkV4ZWN1dGFibGVWZXJzaW9ucyIgbmFtZT0iRXhlY3V0YWJsZVZlcnNpb25zIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIHZlcnNpb25zIG9mIHRoZSBleGVjdHVhYmxlcyB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisKKyAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkFwcGxpY2F0aW9uU3VjY2Vzc0ZsYWciIG5hbWU9IkFwcGxpY2F0aW9uU3VjY2Vzc0ZsYWciPgorICAgIDxkZXNjcmlwdGlvbj5BbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhlIGdlbmVyYXRpbmcgYXBwbGljYXRpb24gY29tcGxldGVkCisgICAgICBzdWNjZXNzZnVsbHkuPC9kZXNjcmlwdGlvbj4KKyAgICA8ZGNFbGVtZW50Lz4KKyAgPC9lbGVtZW50PgorICAKKyAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlRhc2tTdWNjZXNzRmxhZyIgbmFtZT0iVGFza1N1Y2Nlc3NGbGFnIj4KKyAgICA8ZGVzY3JpcHRpb24+QW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBQQ1MgV29ya2Zsb3cgVGFzayB0aGF0IHJhbiB0aGUgUEdFIGNvbXBsZXRlZAorICAgICAgc3VjY2Vzc2Z1bGx5LjwvZGVzY3JpcHRpb24+CisgICAgPGRjRWxlbWVudC8+CisgIDwvZWxlbWVudD4KKworICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6Sm9iU3VjY2Vzc0ZsYWciIG5hbWU9IkpvYlN1Y2Nlc3NGbGFnIj4KKyAgICA8ZGVzY3JpcHRpb24+QW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBQQ1Mgam9iIHJhbiBieSB0aGUgUENTIHRvIGNyZWF0ZSB0aGUgcHJvZHVjdCBjb21wbGV0ZWQKKyAgICAgIHN1Y2Nlc3NmdWxseS48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisgIAorICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UEdFVmVyc2lvbiIgbmFtZT0iUEdFVmVyc2lvbiI+CisgICAgPGRlc2NyaXB0aW9uPkNhcHR1cmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0gdGhhdCBoYXMgYmVlbiBydW4gb24gdGhlIGRhdGEuPC9kZXNjcmlwdGlvbj4KKyAgICA8ZGNFbGVtZW50Lz4KKyAgPC9lbGVtZW50PgorCisgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9jZXNzaW5nTm9kZSIgbmFtZT0iUHJvY2Vzc2luZ05vZGUiPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgbm9kZSB0aGF0IHRoZSBqb2IgdGhhdCBwcm9kdWNlZCB0aGlzIHByb2R1Y3Qgd2FzIHJ1biBvbi48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+CisgICAgIAorIDxlbGVtZW50IGlkPSJ1cm46b29kdDpFeGVjdXRpb25UaW1lIiBuYW1lPSJFeGVjdXRpb25UaW1lIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGpvYiB0aGF0IHByb2R1Y2VkIHRoaXMgcHJvZHVjdCB0b29rIHRvIHJ1bi48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorIDwvZWxlbWVudD4KKworICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6Q21kTGluZVBhcmFtZXRlcnMiIG5hbWU9IkNtZExpbmVQYXJhbWV0ZXJzIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSB1c2VkIHRvIGludm9rZSB0aGlzIGpvYi48L2Rlc2NyaXB0aW9uPgorICAgIDxkY0VsZW1lbnQvPgorICA8L2VsZW1lbnQ+ICAKKyAgICAKKyAgIAorPC9jYXM6ZWxlbWVudHM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4YTU4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZW1hcCB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8IS0tICBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2UKKyAgICAgICBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcyAKKyAgLS0+CisgIDx0eXBlIGlkPSJ1cm46b29kdDpUcmFjZWFibGVGaWxlIiBwYXJlbnQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIj4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6SW5wdXRGaWxlcyIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpPdXRwdXRGaWxlcyIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpKb2JJZCIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0aW9uRGF0ZVRpbWUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RXhlY3V0YWJsZVBhdGhuYW1lcyIvPiAKKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RXhlY3V0YWJsZVZlcnNpb25zIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkFwcGxpY2F0aW9uU3VjY2Vzc0ZsYWciLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6VGFza1N1Y2Nlc3NGbGFnIiAvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpKb2JTdWNjZXNzRmxhZyIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQR0VWZXJzaW9uIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2Nlc3NpbmdOb2RlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkV4ZWN1dGlvblRpbWUiIC8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkNtZExpbmVQYXJhbWV0ZXJzIi8+ICAgICAgIAorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvdHJhY2UvcHJvZHVjdC10eXBlcy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzljOTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3RyYWNlL3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgPHR5cGUgaWQ9InVybjpvb2R0OlRyYWNlYWJsZUZpbGUiIG5hbWU9IlRyYWNlYWJsZUZpbGUiPgorICAgIDxyZXBvc2l0b3J5IHBhdGg9ImZpbGU6Ly9bSE9NRV0vZmlsZXMiLz4KKyAgICA8dmVyc2lvbmVyIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5CYXNpY1ZlcnNpb25lciIvPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAndHJpbScgdGFnIHRvIGlkZW50aWZ5IHdoZXRoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIG9yIG5vdCB5b3Ugd2FudCBuZXdsaW5lcyB0cmltbWVkIGZyb20gdGhlIHByb2R1Y3QgdHlwZSBkZXNjcmlwdGlvbi4gVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICB0dXJuIG9mZiB0cmltbWluZyAobm93IGRvbmUgYnkgZGVmYXVsdCksIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgd2l0aCB5b3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgZGVzY3JpcHRpb24gZGVmaW5pdGlvbjogdHJpbT0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIC0tPgorICAgIDxkZXNjcmlwdGlvbj5BIHRyYWNlYWJsZSBwcm9kdWN0IGZvciB1c2UgaW4gcHJvdmVuYW5jZSBhbmQgYWxnb3JpdGhtIGV4ZWN1dGlvbi48L2Rlc2NyaXB0aW9uPgorICAgIDwhLS0KKyAgICAgIEdsb2JhbCBhZ2dyZWdhdGUgcHJvZHVjdCB0eXBlIG1ldGFkYXRhOiB5b3UgY2FuIGRlY2xhcmUgdGhpcyBpbiB0aGUKKyAgICAgIHNhbWUgd2F5IHlvdSdkIHdpcmUgdG9nZXRoZXIgYSBDQVMgbWV0IGZpbGUsIGV2ZW4gdXNpbmcgbXVsdGlwbGUgdmFsdWVzCisgICAgICBwZXIga2V5LgorICAgICAgCisgICAgICBUaGlzIG1ldGFkYXRhIGNhbiBiZSBsb29rZWQgdXAgdmlhIHRoZSBQcm9kdWN0IFR5cGUgQVBJLCBhbmQgYWxzbyB1c2VkCisgICAgICBpbiBicm93c2VycyBhbmQgc28gZm9ydGggdG8gZGlzcGxheSBnbG9iYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGNvbGxlY3Rpb24KKyAgICAgIG9mIFByb2R1Y3RzIHBhcnQgb2YgdGhpcyBwcm9kdWN0IHR5cGUuCisgICAgLS0+CisgICAgPG1ldGFkYXRhPgorICAgICAgPGtleXZhbD4KKyAgICAgICAgPGtleT5Qcm9kdWN0VHlwZTwva2V5PgorICAgICAgICA8dmFsPkxvY2F0aW9uQXdhcmVQcm9kdWN0PC92YWw+CisgICAgICA8L2tleXZhbD4KKyAgICAgIDwhLS0gaWYgeW91IGFyZSB1c2luZyB0aGUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuUHJvZHVjdFR5cGVNZXRWZXJzaW9uZXIgCisgICAgICAgICAgIHlvdSBjYW4gc2V0IGEgbWV0IGtleSBsaWtlIGJlbG93IHRvIGRlZmluZSB5b3VyIGZpbGVQYXRoU3BlYworICAgICAgPGtleXZhbD4KKyAgICAgICAgPGtleT5maWxlUGF0aFNwZWM8L2tleT4KKyAgICAgICAgPHZhbD4vW0ZpbGVuYW1lXTwvdmFsPgorICAgICAgPC9rZXl2YWw+CisgICAgICAtLT4gICAgICAKKyAgICA8L21ldGFkYXRhPgorICAgIDxtZXRFeHRyYWN0b3JzPgorICAgICAgPGV4dHJhY3RvcgorICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0gIHlvdSBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIHRoZSBlbnZSZXBsYWNlIHRhZyB0byB0dXJuIG9uL29mZiBlbnZpcm9ubWVudCB2YXIgcmVwbGFjZW1lbnQgLS0+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5zQXdhcmUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50TnMiIHZhbHVlPSJDQVMiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnRzIgorICAgICAgICAgICAgdmFsdWU9IlByb2R1Y3RSZWNlaXZlZFRpbWUsUHJvZHVjdE5hbWUsUHJvZHVjdElkIiAvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLk1pbWVUeXBlRXh0cmFjdG9yIiAvPgorICAgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuRmluYWxGaWxlTG9jYXRpb25FeHRyYWN0b3IiPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tIHRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIEZJTEVfTE9DQVRJT04gZmllbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICBjb21wdXRlZCBieSB0aGlzIGV4dHJhY3RvciB0byByZXBsYWNlIGFueSBvdGhlciBGSUxFX0xPQ0FUSU9OIG1ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgYXR0cmlidXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgLS0+CisgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBsYWNlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICA8L21ldEV4dHJhY3RvcnM+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZmlsZW1nci5wcm9wZXJ0aWVzIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9maWxlbWdyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5ODk2YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvZmlsZW1nci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzEwIEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGVzdCBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBGaWxlIE1hbmFnZXIKKworIyByZXBvc2l0b3J5IGZhY3RvcnkKK2ZpbGVtZ3IucmVwb3NpdG9yeS5mYWN0b3J5PW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlhNTFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeQorCisjIGNhdGFsb2cgZmFjdG9yeQorZmlsZW1nci5jYXRhbG9nLmZhY3Rvcnk9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuTHVjZW5lQ2F0YWxvZ0ZhY3RvcnkKKworIyBkYXRhIHRyYW5zZmVyIGZhY3RvcnkKK2ZpbGVtZ3IuZGF0YXRyYW5zZmVyLmZhY3Rvcnk9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkKKworIyB2YWxpZGF0aW9uIGxheWVyIGZhY3RvcnkKK2ZpbGVtZ3IudmFsaWRhdGlvbkxheWVyLmZhY3Rvcnk9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvbkxheWVyRmFjdG9yeQorCisjIHhtbCBycGMgY2xpZW50IGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLmNvbm5lY3Rpb25UaW1lb3V0Lm1pbnV0ZXM9MjAKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLnJlcXVlc3RUaW1lb3V0Lm1pbnV0ZXM9NjAKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLnhtbHJwYy5jb25uZWN0aW9uLnJldHJpZXM9MAorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLmNvbm5lY3Rpb24ucmV0cnkuaW50ZXJ2YWwuc2Vjb25kcz0zCisKKyMgZGF0YSBzb3VyY2UgY2F0YWxvZyBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXJsPWpkYmM6aHNxbGRiOmhzcWw6Ly9sb2NhbGhvc3QvdGVzdAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVzZXI9c2EKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy5wYXNzPQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLmRyaXZlcj1vcmcuaHNxbGRiLmpkYmMuSkRCQ0RyaXZlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5xdW90ZUZpZWxkcz1mYWxzZQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5wYWdlU2l6ZT0yMAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5jYWNoZVVwZGF0ZU1pbnV0ZXM9NQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5vcmRlcmVkVmFsdWVzPWZhbHNlCisjIHNldCB0aGUgZm9sbG93aW5nIHByb3BlcnR5IHRvICd0cnVlJyB0byBhbGxvdyBkeW5hbWljIG1ldGFkYXRhIGZpZWxkcywKKyMgZWZmZWN0aXZlbHkgYnlwYXNzaW5nIHRoZSB2YWxpZGF0aW9uIGxheWVyLgorIyBieSBkZWZhdWx0IHRoZSBwcm9wZXJ0eSBpcyBmYWxzZQorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UubGVuaWVudEZpZWxkcz10cnVlCisjIHNldCB0aGUgZm9sbG93aW5nIHByb3BlcnR5IHRvIHRydWUgdG8gZW5hYmxlIHRoZSBjb2x1bW4gInByb2R1Y3RfaWQiCisjIGluIHRhYmxlICJwcm9kdWN0cyIgdG8gYmUgb2YgdHlwZSBzdHJpbmcKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnByb2R1Y3RJZC5zdHJpbmc9ZmFsc2UKKworCisjIG1hcHBlZCBkYXRhIHNvdXJjZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLm1hcHBlZGRhdGFzb3VyY2UubWFwRmlsZT0vcGF0aC90by9vcHMuY2F0YWxvZy50eXBlbWFwLnByb3BlcnRpZXMKKworIyBzY2llbmNlIGRhdGEgY2F0YWxvZyBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zY2llbmNlLmpkYmMudXJsPWpkYmM6aHNxbGRiOmhzcWw6Ly9sb2NhbGhvc3QvdGVzdAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLnVzZXI9c2EKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNjaWVuY2UuamRiYy5wYXNzPQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLmRyaXZlcj1vcmcuaHNxbGRiLmpkYmMuSkRCQ0RyaXZlcgorCisjIGx1Y2VuZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoPWZpbGU6L3Rlc3RkYXRhLworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLnBhZ2VTaXplPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuY29tbWl0TG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLndyaXRlTG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLm1lcmdlRmFjdG9yPTIwCisKKyMgc29sciBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci51cmw9aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NvbHIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdFNlcmlhbGl6ZXI9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5EZWZhdWx0UHJvZHVjdFNlcmlhbGl6ZXIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdElkR2VuZXJhdG9yPW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIuVVVJRFByb2R1Y3RJZEdlbmVyYXRvcgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIucHJvZHVjdElkR2VuZXJhdG9yPW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNvbHIuTmFtZVByb2R1Y3RJZEdlbmVyYXRvcgorCisKKyMgZGF0YSBzb3VyY2UgcmVwb3NpdG9yeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy51cmw9amRiYzpoc3FsZGI6aHNxbDovL2xvY2FsaG9zdC90ZXN0CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMudXNlcj1zYQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnBhc3M9CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMuZHJpdmVyPW9yZy5oc3FsZGIuamRiYy5KREJDRHJpdmVyCisKKyMgc2NpZW5jZSBkYXRhIHJlcG9zaXRvcnkgbWFuYWdlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMudXJsPWpkYmM6aHNxbGRiOmhzcWw6Ly9sb2NhbGhvc3QvdGVzdAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3Iuc2NpZW5jZS5qZGJjLnVzZXI9c2EKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLnNjaWVuY2UuamRiYy5wYXNzPQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3Iuc2NpZW5jZS5qZGJjLmRyaXZlcj1vcmcuaHNxbGRiLmpkYmMuSkRCQ0RyaXZlcgorCisjIFhNTCByZXBvc2l0b3J5IG1hbmFnZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGlycz1maWxlOi8vL2RpcjEsZmlsZTovLy9kaXIyCisKKyMgWE1MIHZhbGlkYXRpb24gbGF5ZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGlycz1maWxlOi8vL2RpcjEsZmlsZTovLy9kaXIyCisKKyMgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdG8gJ3RydWUnIHRvIGFsbG93IGR5bmFtaWMgbWV0YWRhdGEgZmllbGRzLAorIyBlZmZlY3RpdmVseSBieXBhc3NpbmcgdGhlIHZhbGlkYXRpb24gbGF5ZXIuCisjIGJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IGlzIGZhbHNlCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLmxlbmllbnRGaWVsZHM9dHJ1ZQorCisjIGRhdGEgc291cmNlIHZhbGlkYXRpb24gbGF5ZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLnVybD1qZGJjOmhzcWxkYjpoc3FsOi8vbG9jYWxob3N0L3Rlc3QKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy51c2VyPXNhCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMucGFzcz0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9b3JnLmhzcWxkYi5qZGJjLkpEQkNEcml2ZXIKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UucXVvdGVGaWVsZHM9ZmFsc2UKKworIyBzY2llbmNlIGRhdGEgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5zY2llbmNlLmpkYmMudXJsPWpkYmM6aHNxbGRiOmhzcWw6Ly9sb2NhbGhvc3QvdGVzdAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uc2NpZW5jZS5qZGJjLnVzZXI9c2EKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLnNjaWVuY2UuamRiYy5wYXNzPQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uc2NpZW5jZS5qZGJjLmRyaXZlcj1vcmcuaHNxbGRiLmpkYmMuSkRCQ0RyaXZlcgorCisjIHJlbW90ZSBkYXRhIHRyYW5zZmVyIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIucmVtb3RlLmNodW5rU2l6ZT0xMDI0CisKKyMgQW1hem9uIFMzIGRhdGEgdHJhbnNmZXIgY29uZmlndXJhdGlvbi4KKyMgUmVnaW9uIGNhbiBiZSBhbnkgb2YgdGhlIHZhbHVlcyBmb3VuZCBoZXJlOgorIyAgIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTREsvbGF0ZXN0L2phdmFkb2MvY29tL2FtYXpvbmF3cy9yZWdpb25zL1JlZ2lvbnMuaHRtbAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5idWNrZXQubmFtZT1zb21lX2J1Y2tldF9uYW1lCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnMzLnJlZ2lvbj1FVV9XRVNUXzEKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuYWNjZXNzLmtleT1zM19hY2Nlc3Nfa2V5CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnMzLnNlY3JldC5rZXk9czNfc2VjcmV0X2tleQorCisjIGxvY2F0aW9uIG9mIE1pbWUtVHlwZSByZXBvc2l0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnk9ZmlsZTovc3JjL21pbWUtdHlwZXMueG1sCisKKyMgdGVsbHMgdGhlIGZpbGUgbWFuYWdlciBzeXN0ZW0gbGF5ZXIgdG8gaW5jbHVkZSBwcm9kdWN0IGluc3RhbmNlIG1ldGFkYXRhCisjIE5PVEU6IGhlcmUgYXJlIHRoZSBleHBlY3RlZCBmaWVsZCBtYXBwaW5ncworIworIyAgICAgIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgLT4gUHJvZHVjdElkCisjICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpIC0+IFByb2R1Y3ROYW1lCisjICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkgLT4gUHJvZHVjdFN0cnVjdHVyZQorIyAgICAgIHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSAtPiBQcm9kdWN0VHJhbnNmZXJTdGF0dXMKKyMgICAgICBwcm9kdWN0LmdldFJvb3RSZWYoKSAtPiBQcm9kdWN0Um9vdFJlZmVyZW5jZQorCisjIGZvciB0aGUgcmVmZXJlbmNlcyByZXR1cm5lZCBieSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkgdGhlIGZvbGxvd2luZyAKKyMgbWV0YWRhdGEgZmllbGRzIHdpbGwgYmUgYWRkZWQgKG9yZGVyIHdpbGwgYmUgbWFpbnRhaW5lZCwgc3VjaCB0aGF0IGRhdGEgc3RvcmUgCisjIHJlZiBhdCBpbmRleCAwIHdpbGwgbWFwIHRvIG9yaWcgcmVmIGF0IGluZGV4IDAsIGV0Yy4pCisjCisjICAgICAgUHJvZHVjdERhdGFTdG9yZVJlZmVyZW5jZXMgKGxpc3Qgb2YgYWxsIGRhdGEgc3RvcmUgcmVmZXJlbmNlczogCisjICAgICAgIG5vdGUgYWxyZWFkeSB0cmFuc2xhdGVkIGludG8gcGF0aCwgbm90IFVSSSkKKyMgICAgICBQcm9kdWN0T3JpZ1JlZmVyZW5jZXMgKGxpc3Qgb2YgYWxsIG9yaWcgcmVmZXJlbmNlczogCisjICAgICAgIG5vdGUgYWxyZWFkeSB0cmFuc2xhdGVkIGludG8gcGF0aCwgbm90IFVSSSkKKyMgICAgICBQcm9kdWN0TWltZVR5cGUgKGxpc3Qgb2YgYWxsIHJlZmVyZW5jZXMnIG1pbWUtdHlwZXMpCisjICAgICAgUHJvZHVjdEZpbGVTaXplIChsaXN0IG9mIGFsbCByZWZlcmVuY2VzJyBmaWxlIHNpemVzKQorCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXhwYW5kUHJvZHVjdD1mYWxzZQorCisjIENvbmZpZ3VyYWJsZU1ldGFkYXRhQmFzZWRWZXJzaW9uaW5nIGNvbmZpZ3VyYXRpb24KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5jb25maWd1cmF0aW9uLmFsbF9wcm9kdWN0X3R5cGVzPVtZZWFyXS9bTW9udGhdL1tGaWxlbmFtZV0KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5jb25maWd1cmF0aW9uLjxwcm9kdWN0X3R5cGU+PVtZZWFyXS9bTW9udGhdL1tGaWxlbmFtZV0KKworIyBFbmFibGUgdG8gdXNlIG9ubHkgc2VydmVyLXNpZGUgdmVyc2lvbmluZy4KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc2VydmVyc2lkZS52ZXJzaW9uaW5nPXRydWUKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUZXN0IENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIEZpbGUgTWFuYWdlcgorCisjIHJlcG9zaXRvcnkgZmFjdG9yeQorZmlsZW1nci5yZXBvc2l0b3J5LmZhY3Rvcnk9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkuWE1MUmVwb3NpdG9yeU1hbmFnZXJGYWN0b3J5CisKKyMgY2F0YWxvZyBmYWN0b3J5CitmaWxlbWdyLmNhdGFsb2cuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeQorCisjIGRhdGEgdHJhbnNmZXIgZmFjdG9yeQorZmlsZW1nci5kYXRhdHJhbnNmZXIuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeQorCisjIHZhbGlkYXRpb24gbGF5ZXIgZmFjdG9yeQorZmlsZW1nci52YWxpZGF0aW9uTGF5ZXIuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5CisKKyMgeG1sIHJwYyBjbGllbnQgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcz0yMAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMucmVxdWVzdFRpbWVvdXQubWludXRlcz02MAorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLmNvbm5lY3Rpb24ucmV0cmllcz0wCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvbi5yZXRyeS5pbnRlcnZhbC5zZWNvbmRzPTMKKworIyBkYXRhIHNvdXJjZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy51cmw9amRiYzpoc3FsZGI6aHNxbDovL2xvY2FsaG9zdC90ZXN0CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMudXNlcj1zYQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnBhc3M9CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMuZHJpdmVyPW9yZy5oc3FsZGIuamRiYy5KREJDRHJpdmVyCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnF1b3RlRmllbGRzPWZhbHNlCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLnBhZ2VTaXplPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmNhY2hlVXBkYXRlTWludXRlcz01CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLm9yZGVyZWRWYWx1ZXM9ZmFsc2UKKyMgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdG8gJ3RydWUnIHRvIGFsbG93IGR5bmFtaWMgbWV0YWRhdGEgZmllbGRzLAorIyBlZmZlY3RpdmVseSBieXBhc3NpbmcgdGhlIHZhbGlkYXRpb24gbGF5ZXIuCisjIGJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IGlzIGZhbHNlCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5sZW5pZW50RmllbGRzPXRydWUKKyMgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdG8gdHJ1ZSB0byBlbmFibGUgdGhlIGNvbHVtbiAicHJvZHVjdF9pZCIKKyMgaW4gdGFibGUgInByb2R1Y3RzIiB0byBiZSBvZiB0eXBlIHN0cmluZworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UucHJvZHVjdElkLnN0cmluZz1mYWxzZQorCisKKyMgbWFwcGVkIGRhdGEgc291cmNlIGNhdGFsb2cgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubWFwcGVkZGF0YXNvdXJjZS5tYXBGaWxlPS9wYXRoL3RvL29wcy5jYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcworCisjIHNjaWVuY2UgZGF0YSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLnNjaWVuY2UuamRiYy51cmw9amRiYzpoc3FsZGI6aHNxbDovL2xvY2FsaG9zdC90ZXN0CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zY2llbmNlLmpkYmMudXNlcj1zYQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc2NpZW5jZS5qZGJjLnBhc3M9CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zY2llbmNlLmpkYmMuZHJpdmVyPW9yZy5oc3FsZGIuamRiYy5KREJDRHJpdmVyCisKKyMgbHVjZW5lIGNhdGFsb2cgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLmlkeFBhdGg9ZmlsZTovdGVzdGRhdGEvCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUucGFnZVNpemU9MjAKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5jb21taXRMb2NrVGltZW91dC5zZWNvbmRzPTYwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUud3JpdGVMb2NrVGltZW91dC5zZWNvbmRzPTYwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUubWVyZ2VGYWN0b3I9MjAKKworIyBzb2xyIGNhdGFsb2cgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci51cmw9aHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zb2xyLnVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvc29scgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5wcm9kdWN0U2VyaWFsaXplcj1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zb2xyLkRlZmF1bHRQcm9kdWN0U2VyaWFsaXplcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5wcm9kdWN0SWRHZW5lcmF0b3I9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5VVUlEUHJvZHVjdElkR2VuZXJhdG9yCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5wcm9kdWN0SWRHZW5lcmF0b3I9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci5OYW1lUHJvZHVjdElkR2VuZXJhdG9yCisKKworIyBkYXRhIHNvdXJjZSByZXBvc2l0b3J5IG1hbmFnZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnVybD1qZGJjOmhzcWxkYjpoc3FsOi8vbG9jYWxob3N0L3Rlc3QKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy51c2VyPXNhCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMucGFzcz0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9b3JnLmhzcWxkYi5qZGJjLkpEQkNEcml2ZXIKKworIyBzY2llbmNlIGRhdGEgcmVwb3NpdG9yeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLnNjaWVuY2UuamRiYy51cmw9amRiYzpoc3FsZGI6aHNxbDovL2xvY2FsaG9zdC90ZXN0CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMudXNlcj1zYQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3Iuc2NpZW5jZS5qZGJjLnBhc3M9CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5zY2llbmNlLmpkYmMuZHJpdmVyPW9yZy5oc3FsZGIuamRiYy5KREJDRHJpdmVyCisKKyMgWE1MIHJlcG9zaXRvcnkgbWFuYWdlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzPWZpbGU6Ly8vZGlyMSxmaWxlOi8vL2RpcjIKKworIyBYTUwgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzPWZpbGU6Ly8vZGlyMSxmaWxlOi8vL2RpcjIKKworIyBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSB0byAndHJ1ZScgdG8gYWxsb3cgZHluYW1pYyBtZXRhZGF0YSBmaWVsZHMsCisjIGVmZmVjdGl2ZWx5IGJ5cGFzc2luZyB0aGUgdmFsaWRhdGlvbiBsYXllci4KKyMgYnkgZGVmYXVsdCB0aGUgcHJvcGVydHkgaXMgZmFsc2UKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUubGVuaWVudEZpZWxkcz10cnVlCisKKyMgZGF0YSBzb3VyY2UgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMudXJsPWpkYmM6aHNxbGRiOmhzcWw6Ly9sb2NhbGhvc3QvdGVzdAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLnVzZXI9c2EKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy5wYXNzPQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLmRyaXZlcj1vcmcuaHNxbGRiLmpkYmMuSkRCQ0RyaXZlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5xdW90ZUZpZWxkcz1mYWxzZQorCisjIHNjaWVuY2UgZGF0YSB2YWxpZGF0aW9uIGxheWVyIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLnNjaWVuY2UuamRiYy51cmw9amRiYzpoc3FsZGI6aHNxbDovL2xvY2FsaG9zdC90ZXN0CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5zY2llbmNlLmpkYmMudXNlcj1zYQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uc2NpZW5jZS5qZGJjLnBhc3M9CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5zY2llbmNlLmpkYmMuZHJpdmVyPW9yZy5oc3FsZGIuamRiYy5KREJDRHJpdmVyCisKKyMgcmVtb3RlIGRhdGEgdHJhbnNmZXIgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5yZW1vdGUuY2h1bmtTaXplPTEwMjQKKworIyBBbWF6b24gUzMgZGF0YSB0cmFuc2ZlciBjb25maWd1cmF0aW9uLgorIyBSZWdpb24gY2FuIGJlIGFueSBvZiB0aGUgdmFsdWVzIGZvdW5kIGhlcmU6CisjICAgaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNESy9sYXRlc3QvamF2YWRvYy9jb20vYW1hem9uYXdzL3JlZ2lvbnMvUmVnaW9ucy5odG1sCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnMzLmJ1Y2tldC5uYW1lPXNvbWVfYnVja2V0X25hbWUKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMucmVnaW9uPUVVX1dFU1RfMQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5zMy5hY2Nlc3Mua2V5PXMzX2FjY2Vzc19rZXkKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuczMuc2VjcmV0LmtleT1zM19zZWNyZXRfa2V5CisKKyMgbG9jYXRpb24gb2YgTWltZS1UeXBlIHJlcG9zaXRvcnkKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5taW1lLnR5cGUucmVwb3NpdG9yeT1maWxlOi9zcmMvbWltZS10eXBlcy54bWwKKworIyB0ZWxscyB0aGUgZmlsZSBtYW5hZ2VyIHN5c3RlbSBsYXllciB0byBpbmNsdWRlIHByb2R1Y3QgaW5zdGFuY2UgbWV0YWRhdGEKKyMgTk9URTogaGVyZSBhcmUgdGhlIGV4cGVjdGVkIGZpZWxkIG1hcHBpbmdzCisjCisjICAgICAgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSAtPiBQcm9kdWN0SWQKKyMgICAgICBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgLT4gUHJvZHVjdE5hbWUKKyMgICAgICBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSAtPiBQcm9kdWN0U3RydWN0dXJlCisjICAgICAgcHJvZHVjdC5nZXRUcmFuc2ZlclN0YXR1cygpIC0+IFByb2R1Y3RUcmFuc2ZlclN0YXR1cworIyAgICAgIHByb2R1Y3QuZ2V0Um9vdFJlZigpIC0+IFByb2R1Y3RSb290UmVmZXJlbmNlCisKKyMgZm9yIHRoZSByZWZlcmVuY2VzIHJldHVybmVkIGJ5IHByb2R1Y3QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSB0aGUgZm9sbG93aW5nIAorIyBtZXRhZGF0YSBmaWVsZHMgd2lsbCBiZSBhZGRlZCAob3JkZXIgd2lsbCBiZSBtYWludGFpbmVkLCBzdWNoIHRoYXQgZGF0YSBzdG9yZSAKKyMgcmVmIGF0IGluZGV4IDAgd2lsbCBtYXAgdG8gb3JpZyByZWYgYXQgaW5kZXggMCwgZXRjLikKKyMKKyMgICAgICBQcm9kdWN0RGF0YVN0b3JlUmVmZXJlbmNlcyAobGlzdCBvZiBhbGwgZGF0YSBzdG9yZSByZWZlcmVuY2VzOiAKKyMgICAgICAgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyAgICAgIFByb2R1Y3RPcmlnUmVmZXJlbmNlcyAobGlzdCBvZiBhbGwgb3JpZyByZWZlcmVuY2VzOiAKKyMgICAgICAgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyAgICAgIFByb2R1Y3RNaW1lVHlwZSAobGlzdCBvZiBhbGwgcmVmZXJlbmNlcycgbWltZS10eXBlcykKKyMgICAgICBQcm9kdWN0RmlsZVNpemUgKGxpc3Qgb2YgYWxsIHJlZmVyZW5jZXMnIGZpbGUgc2l6ZXMpCisKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHBhbmRQcm9kdWN0PWZhbHNlCisKKyMgQ29uZmlndXJhYmxlTWV0YWRhdGFCYXNlZFZlcnNpb25pbmcgY29uZmlndXJhdGlvbgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLmNvbmZpZ3VyYXRpb24uYWxsX3Byb2R1Y3RfdHlwZXM9W1llYXJdL1tNb250aF0vW0ZpbGVuYW1lXQorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLmNvbmZpZ3VyYXRpb24uPHByb2R1Y3RfdHlwZT49W1llYXJdL1tNb250aF0vW0ZpbGVuYW1lXQorCisjIEVuYWJsZSB0byB1c2Ugb25seSBzZXJ2ZXItc2lkZSB2ZXJzaW9uaW5nLgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zZXJ2ZXJzaWRlLnZlcnNpb25pbmc9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L2ZtcG9saWN5L2VsZW1lbnRzLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L2ZtcG9saWN5L2VsZW1lbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDJiNjcxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9pbmdlc3QvZm1wb2xpY3kvZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0SWQiIG5hbWU9IkNBUy5Qcm9kdWN0SWQiPgorCQk8ZGNFbGVtZW50PklkZW50aWZpZXI8L2RjRWxlbWVudD4KKwkJPGRlc2NyaXB0aW9uPgorCQkJQSBQcm9kdWN0J3MgdW5pcXVlIGlkZW50aWZpZXIgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdE5hbWUiIG5hbWU9IkNBUy5Qcm9kdWN0TmFtZSI+CisJCTxkY0VsZW1lbnQ+VGl0bGU8L2RjRWxlbWVudD4KKwkJPGRlc2NyaXB0aW9uPgorCQkJQSBQcm9kdWN0J3MgbmFtZSB3aXRoaW4gdGhlIENBUyBuYW1lc3BhY2UuCisJCTwvZGVzY3JpcHRpb24+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIgorCQluYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSI+CisJCTxkY0VsZW1lbnQgLz4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIElTTyA4NjAxIGZvcm1hdHRlZCB0aW1lIHRoYXQgdGhlIFByb2R1Y3Qgd2FzIHJlY2VpdmVkLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RmlsZW5hbWUiIG5hbWU9IkZpbGVuYW1lIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHJlcHJlc2VudCB0aGlzIHByb2R1Y3QuCisJCTwvZGVzY3JpcHRpb24+CisJCTxkY0VsZW1lbnQgLz4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVMb2NhdGlvbiIgbmFtZT0iRmlsZUxvY2F0aW9uIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIGxvY2F0aW9ucyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIgbmFtZT0iUHJvZHVjdFR5cGUiPgorCQk8ZGVzY3JpcHRpb24+CisJCQlUeXBlIG9mIHByb2R1Y3QsIGFzIHNwZWNpZmllZCBieSwgZS5nLiwgYSBkYXRhIGJpYmxlLgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0U3RydWN0dXJlIiBuYW1lPSJQcm9kdWN0U3RydWN0dXJlIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJV2hldGhlciBvciBub3QgYSBwcm9kdWN0IGlzIEZsYXQgKGUuZy4sIGEgc2V0IG9mIGluZGVwZW5kZW50CisJCQlmaWxlcyksIG9yIGhpZXJhcmNoaWNhbCwgZS5nLiwgYSBkaXIgc3RydWN0dXJlLgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpNaW1lVHlwZSIgbmFtZT0iTWltZVR5cGUiPgorCQk8ZGVzY3JpcHRpb24+VGhlIElFVEYgbWltZSB0eXBlIG9mIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpUZXN0RWxlbWVudCIgbmFtZT0iVGVzdEVsZW1lbnQiPgorCQk8ZGVzY3JpcHRpb24+YSB0ZXN0IGVsZW1lbnQ8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorPC9jYXM6ZWxlbWVudHM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC9mbXBvbGljeS9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9pbmdlc3QvZm1wb2xpY3kvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI0ZTExCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9pbmdlc3QvZm1wb2xpY3kvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZW1hcCB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8IS0tICBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2UKKyAgICAgICBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcyAKKyAgLS0+CisgICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0U3RydWN0dXJlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVMb2NhdGlvbiIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpNaW1lVHlwZSIvPgorICAgPC90eXBlPgorIAorICAgPHR5cGUgaWQ9InVybjpvb2R0OlRlc3RUeXBlIj4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6VGVzdEVsZW1lbnQiLz4KKyAgICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L2ZtcG9saWN5L3Byb2R1Y3QtdHlwZXMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9pbmdlc3QvZm1wb2xpY3kvcHJvZHVjdC10eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4ODViNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L2ZtcG9saWN5L3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiIG5hbWU9IkdlbmVyaWNGaWxlIj4KKyAgICA8cmVwb3NpdG9yeSBwYXRoPSJmaWxlOi8vL3RtcCIvPgorICAgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgIDxtZXRFeHRyYWN0b3JzPgorICAgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICA8IS0tICB5b3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUgZW52UmVwbGFjZSB0YWcgdG8gdHVybiBvbi9vZmYgZW52aXJvbm1lbnQgdmFyIHJlcGxhY2VtZW50IC0tPgorICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5zQXdhcmUiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxlbWVudE5zIiB2YWx1ZT0iQ0FTIi8+CisgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxlbWVudHMiIHZhbHVlPSJQcm9kdWN0UmVjZWl2ZWRUaW1lLFByb2R1Y3ROYW1lLFByb2R1Y3RJZCIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLk1pbWVUeXBlRXh0cmFjdG9yIi8+CisgICAgPC9tZXRFeHRyYWN0b3JzPgorICAgIDwvdHlwZT4KKyAgICA8dHlwZSBpZD0idXJuOm9vZHQ6VGVzdFR5cGUiIG5hbWU9IlRlc3RUeXBlIj4KKyAgICAgICAgPHJlcG9zaXRvcnkgcGF0aD0iZmlsZTovLy90bXAvdGVzdC10eXBlIi8+CisgICAgICAgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm9kdWN0IHR5cGUgZm9yIGFueSBraW5kIG9mIGZpbGUuPC9kZXNjcmlwdGlvbj4KKyAgICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZXM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMS50eHQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyNWU4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L3Rlc3QtZmlsZS0xLnR4dApAQCAtMCwwICsxIEBACit0aGlzIGlzIHRlc3QtZmlsZS0xCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMi50eHQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxZmNmNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L3Rlc3QtZmlsZS0yLnR4dApAQCAtMCwwICsxIEBACit0aGlzIGlzIHRlc3QtZmlsZS0yCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMy50eHQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhMmU5NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L3Rlc3QtZmlsZS0zLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGlzIGp1c3QgYSBmaWxlIHRvIHRlc3QgbWV0YWRhdGEKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L3Rlc3QtZmlsZS0zLnR4dC5tZXQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMy50eHQubWV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmY5ODkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LWZpbGUtMy50eHQubWV0CkBAIC0wLDAgKzEsMTcgQEAKKzxjYXM6bWV0YWRhdGEgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+Cis8a2V5dmFsIHR5cGU9InNjYWxhciI+CisgIDxrZXk+RmlsZW5hbWU8L2tleT4KKyAgPHZhbD50ZXN0LWZpbGUtMy50eHQ8L3ZhbD4KKzwva2V5dmFsPgorPGtleXZhbCB0eXBlPSJzY2FsYXIiPgorICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgIDx2YWw+VGVzdFR5cGU8L3ZhbD4KKzwva2V5dmFsPgorPGtleXZhbCB0eXBlPSJzY2FsYXIiPgorICA8a2V5PlRlc3RFbGVtZW50PC9rZXk+CisgIDx2YWw+ZmU8L3ZhbD4KKyAgPHZhbD5maTwvdmFsPgorICA8dmFsPmZvPC92YWw+CisgIDx2YWw+ZnVtPC92YWw+Cis8L2tleXZhbD4KKzwvY2FzOm1ldGFkYXRhPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9pbmdlc3QvdGVzdC50eHQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNkYjEyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9pbmdlc3QvdGVzdC50eHQKQEAgLTAsMCArMSBAQAordGhpcyBpcyBhIHRlc3QgdGV4dCBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LnR4dC5tZXQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2luZ2VzdC90ZXN0LnR4dC5tZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkYjJmZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvaW5nZXN0L3Rlc3QudHh0Lm1ldApAQCAtMCwwICsxLDEwIEBACis8Y2FzOm1ldGFkYXRhIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorPGtleXZhbCB0eXBlPSJzY2FsYXIiPgorICA8a2V5PkZpbGVuYW1lPC9rZXk+CisgIDx2YWw+dGVzdC50eHQ8L3ZhbD4KKzwva2V5dmFsPgorPGtleXZhbCB0eXBlPSJzY2FsYXIiPgorICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgIDx2YWw+R2VuZXJpY0ZpbGU8L3ZhbD4KKzwva2V5dmFsPgorPC9jYXM6bWV0YWRhdGE+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL21pbWUtdHlwZXMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9taW1lLXR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA3ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9taW1lLXR5cGVzLnhtbApAQCAtMCwwICsxLDQxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgRGVzY3JpcHRpb246IFRoaXMgeG1sIGZpbGUgZGVmaW5lcyB0aGUgdmFsaWQgbWltZSB0eXBlcyB1c2VkIGJ5IFRpa2EuCisgIFRoZSBtaW1lIHR5cGUgZGF0YSB3aXRoaW4gdGhpcyBmaWxlIGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cworICBzb3VyY2VzIGxpa2UgQXBhY2hlIE51dGNoLCBBcGFjaGUgSFRUUCBTZXJ2ZXIsIHRoZSBmaWxlKDEpIGNvbW1hbmQsIGV0Yy4KKy0tPgorPG1pbWUtaW5mbz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FjdGl2ZW1lc3NhZ2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXBwbGVmaWxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXBwbGl4d2FyZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b20reG1sIj4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJmZWVkIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXRvbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b21jYXQreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b21jYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXRvbWljbWFpbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b21zdmMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b21zdmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXV0aC1wb2xpY3kreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYmF0Y2gtc210cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2JlZXAreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY2Fscy0xODQwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY2N4bWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNjeG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NlYS0yMDE4K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NlbGxtbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jbnJwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NvbmZlcmVuY2UtaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jcGwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3N0YSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jc3RhZGF0YSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jdS1zZWVtZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jdSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jeWJlcmNhc2giLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kYXZtb3VudCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGF2bW91bnQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGNhLXJmdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RlYy1keCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpYWxvZy1pbmZvK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpY29tIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZG5zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZHZjcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZWNtYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGktY29uc2VudCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VkaS14MTIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGlmYWN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZW1tYSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZW1tYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lcHAreG1sIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lcHViK3ppcCI+CisgICAgPGFjcm9ueW0+RVBVQjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+RWxlY3Ryb25pYyBQdWJsaWNhdGlvbjwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL2VwdWIremlwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwdWIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lc2hvcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2Zhc3Rzb2FwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZml0cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ZvbnQtdGRwZnIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGZyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2gyMjQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9odHRwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaHlwZXJzdHVkaW8iPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RrIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2liZS1rZXktcmVxdWVzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUtcGtnLXJlcGx5K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2liZS1wcC1kYXRhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWdlcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ltLWlzY29tcG9zaW5nK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXguY21kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgub2JqIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgucmVzcG9uc2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleC52bmQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pb3RwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaXBwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaXN1cCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YS1hcmNoaXZlIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouamFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YS1zZXJpYWxpemVkLW9iamVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZXIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vanNvbiI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qc29uIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YS12bSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4Y2FmZWJhYmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGFzcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2twbWwtcmVxdWVzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9rcG1sLXJlc3BvbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2xvc3QreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxvc3R4bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tYWMtYmluaGV4Ii8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2JpbmhleCIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJtdXN0XCBiZVwgY29udmVydGVkXCB3aXRoXCBCaW5IZXgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMSIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ocXgiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYWN3cml0ZWlpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFyYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWF0aGVtYXRpY2EiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5iIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYXRobWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hdGhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLWFzc29jaWF0ZWQtcHJvY2VkdXJlLWRlc2NyaXB0aW9uK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtZGVyZWdpc3Rlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLWVudmVsb3BlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtbXNrK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtbXNrLXJlc3BvbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtcHJvdGVjdGlvbi1kZXNjcmlwdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXJlY2VwdGlvbi1yZXBvcnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWdpc3Rlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXJlZ2lzdGVyLXJlc3BvbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtdXNlci1zZXJ2aWNlLWRlc2NyaXB0aW9uK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ib3giPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWJveCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tZWRpYV9jb250cm9sK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21lZGlhc2VydmVyY29udHJvbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXNjbWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWlrZXkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3NzLWtleXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3NzLXNpZ25hdHVyZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21vc3NrZXktZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21vc3NrZXktcmVxdWVzdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21wNCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcDRzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21wZWc0LWdlbmVyaWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcGVnNC1pb2QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcGVnNC1pb2QteG10Ii8+CisKKyAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL21zd29yZCAtLT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tc3dvcmQiPgorICAgIDwhLS0gVXNlIG9yZy5hcGFjaGUudGlrYS5kZXRlY3QuQ29udGFpbmVyQXdhcmVEZXRlY3RvciBmb3IgbW9yZSByZWxpYWJsZSBkZXRlY3Rpb24gb2YgT0xFMiBkb2N1bWVudHMgLS0+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkIi8+CisgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBXb3JkIERvY3VtZW50PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTWljcm9zb2Z0XCBXb3JkXCA2LjBcIERvY3VtZW50IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA4MCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJEb2N1bWVudG9cIE1pY3Jvc29mdFwgV29yZFwgNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTVNXb3JkRG9jIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjExMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDMxYmUwMDAwIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlBPXlFgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMzc2XDA2N1wwXDA0MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDMzM1wyNDUtXDBcMFwwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMzU0XDI0NVwzMDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI1MTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDMyMFwzMTdcMDIxXDM0MFwyNDFcMjYxXDAzMlwzNDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwyMjRcMjQ2XDA1NiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgIDxtYXRjaCB2YWx1ZT0iV1x4MDBvXHgwMHJceDAwZFx4MDBEXHgwMG9ceDAwY1x4MDB1XHgwMG1ceDAwZVx4MDBuXHgwMHQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMTUyOjQwOTYiIC8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvdCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXhmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uYXNkYXRhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbmV3cy1jaGVja2dyb3VwcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtZ3JvdXBpbmZvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbmV3cy10cmFuc21pc3Npb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uc3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vY3NwLXJlcXVlc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vY3NwLXJlc3BvbnNlIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIjXCBUaGlzXCBpc1wgYVwgc2hlbGxcIGFyY2hpdmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDM3XDAzNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDE3NDM3IiB0eXBlPSJob3N0MTYiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDFmZmYiIHR5cGU9Imhvc3QxNiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwzNzdcMDM3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIwMTQ1NDA1IiB0eXBlPSJob3N0MTYiIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iaW4iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRtcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubGhhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5scmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmx6aCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc28iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlzbyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZG1nIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaXN0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaXN0eiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGtnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5icGsiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR1bXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVsYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGVwbG95Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2RhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vZWJwcy1wYWNrYWdlK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vcGYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LW9nZyIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJPZ2dTIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZ3giLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vbmVub3RlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXRvYyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub25ldG9jMiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub25ldG1wIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vbmVwa2ciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGFyaXR5ZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGF0Y2gtb3BzLWVycm9yK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZXIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZGYiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXBkZiIvPgorICAgIDxhY3JvbnltPlBERjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJVBERi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBkZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWQiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGdwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1rZXlzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hc2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnByZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWRmK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BpZGYtZGlmZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2NzMTAiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDEwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BrY3M3LW1pbWUiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDdtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wN2MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtjczctc2lnbmF0dXJlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnA3cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4LWNlcnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2VyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BraXgtY3JsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNybCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4LXBraXBhdGgiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGtpcGF0aCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4Y21wIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBraSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wbHMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBscyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wb2Mtc2V0dGluZ3MreG1sIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Ij4KKyAgICA8X2NvbW1lbnQ+UG9zdFNjcmlwdDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiUhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwNCUhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDwhLS0gV2luZG93cyBmb3JtYXQgRVBTIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGM1ZDBkM2M2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXBzZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXBzaSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bycy5hbHZlc3RyYW5kLnRpdHJheC1zaGVldCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bycy5jd3ciPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3d3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bycy5ucHJlbmQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMucGx1Y2tlciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3FzaWciLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JkZit4bWwiPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlJERiIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlJERiIgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICA8YWNyb255bT5SREYvWE1MPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5YTUwgc3ludGF4IGZvciBSREYgZ3JhcGhzPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJkZiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3dsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iXnJkZiQiIGlzcmVnZXg9InRydWUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJeb3dsJCIgaXNyZWdleD0idHJ1ZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JlZ2luZm8reG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJpZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVtb3RlLXByaW50aW5nIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzLWRpZmYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJsZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yaXNjb3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ybG1pK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Jscy1zZXJ2aWNlcyt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnNkK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yc2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIj4KKyAgICA8YWxpYXMgdHlwZT0idGV4dC9yc3MiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJyc3MiLz4KKyAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vcHVybC5vcmcvcnNzLzEuMC8iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJzcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3J0ZiI+CisgICAgPGFsaWFzIHR5cGU9InRleHQvcnRmIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IntcXHJ0ZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucnRmIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnR4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2FtbGFzc2VydGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zYW1sbWV0YWRhdGEreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2JtbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2JtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlcXVlc3QiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2NxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2UiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2NzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVxdWVzdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcHEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2RwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NldC1wYXltZW50LWluaXRpYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2V0cGF5Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2V0cmVnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NnbWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZ21sLW9wZW4tY2F0YWxvZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NoZit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2hmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpZXZlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2ltcGxlLWZpbHRlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaW1wbGUtbWVzc2FnZS1zdW1tYXJ5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2ltcGxlc3ltYm9sY29udGFpbmVyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2xhdGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zbWlsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc21pbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc21pIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbWlsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ycSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcGFycWwtcmVzdWx0cyt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3J4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NwaXJpdHMtZXZlbnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3JncyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncmFtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NyZ3MreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdyeG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NzbWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNzbWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdGltZXN0YW1wLXF1ZXJ5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdGltZXN0YW1wLXJlcGx5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdHZlLXRyaWdnZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi91bHBmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92ZW1taSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZpdmlkZW5jZS5zY3JpcHRmaWxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAuYnNmK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1sYXJnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXNtYWxsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzYiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctdmFyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB2YiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5zbXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcDIuYmNtY3NpbmZvK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwMi5zbXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50Y2FwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zbS5wb3N0LWl0LW5vdGVzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB3biIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5hc28iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXNvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmltcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pbXAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjdWNvYm9sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjdSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWN1Y29ycCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdGMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjdXRjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5haXItYXBwbGljYXRpb24taW5zdGFsbGVyLXBhY2thZ2UremlwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWRvYmUueGRwK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLnhmZGYiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGZkZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWV0aGVyLmltcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5hemYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXpmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXpzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2siPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXp3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbWVyaWNhbmR5bmFtaWNzLmFjYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hY2MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFtaWdhLmFtaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hbWkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFuZHJvaWQucGFja2FnZS1hcmNoaXZlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFwayIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWNlcnRpZmljYXRlLWlzc3VlLWluaXRpYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2lpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItZnVuZHMtdHJhbnNmZXItaW5pdGlhdGlvbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mdGkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFudGl4LmdhbWUtY29tcG9uZW50Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0eCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcGtnIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLml3b3JrIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioua2V5Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wYWdlcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubnVtYmVycyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5rZXlub3RlIj4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJwcmVzZW50YXRpb24iIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9rZXlub3RlMiIgLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLnBhZ2VzIj4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJkb2N1bWVudCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9uYW1lc3BhY2VzL3NsIiAvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUubnVtYmVycyI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZG9jdW1lbnQiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9scyIgLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFyYXN0cmEuc3dpIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN3aSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXVkaW9ncmFwaCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hZXAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmF1dG9wYWNrYWdlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmF2aXN0YXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmJsdWVpY2UubXVsdGlwYXNzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYmx1ZXRvb3RoLmVwLm9vYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ibWkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm1pIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5idXNpbmVzc29iamVjdHMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmVwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jYWItanNjcmlwdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jYW5vbi1jcGRsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNhbm9uLWxpcHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2VuZGlvLnRoaW5saW5jLmNsaWVudGNvbmYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2hlbWRyYXcreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jaGlwbnV0cy5rYXJhb2tlLW1tZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tbWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2R5Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jaXJwYWNrLmlzZG4tZXh0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNsYXltb3JlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2xvbmsuYzRncm91cCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jNGciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmM0ZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYzRmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jNHAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmM0dSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29tbWVyY2UtYmF0dGVsbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29tbW9uc3BhY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3NwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jb250YWN0LmNtc2ciPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2RiY21zZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29zbW9jYWxsZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY21jIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIua2V5Ym9hcmQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xrayIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci5wYWxldHRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3AiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xrdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci53b3JkYmFuayI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGt3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcml0aWNhbHRvb2xzLndicyt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2JzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdGMtcG9zbWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdGN0LndzK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBkZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBvc3RzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wcGQiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHBkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXJhc3RlciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXJhdyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXJsLmNhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYXIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cmwucGN1cmwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGN1cmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN5YmFuayIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kYXRhLXZpc2lvbi5yZHoiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmR6Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kZW5vdm8uZmNzZWxheW91dC1saW5rIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZlX2xhdW5jaCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZGlyLWJpLnBsYXRlLWRsLW5vc3VmZml4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRuYSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kbmEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1scCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tbHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1vYmlsZS4xIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1vYmlsZS4yIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRwZ3JhcGgiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHBnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kcmVhbWZhY3RvcnkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGZhYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmVzZ2NvbnRhaW5lciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2RmdG5vdGlmYWNjZXNzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjZXNnYWNjZXNzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjcm9hbWluZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXB0di5hbGZlYy1iYXNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5pcHR2LmFsZmVjLWVuaGFuY2VtZW50Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1hZ2dyZWdhdGUtcm9vdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWNvbnRhaW5lcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWdlbmVyaWMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pYS1tc2dsaXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtcmVnaXN0cmF0aW9uLXJlcXVlc3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pYS1yZWdpc3RyYXRpb24tcmVzcG9uc2UreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pbml0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5keHIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHluYWdlbyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nZW8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjZGlzLXVwZGF0ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uY2hhcnQiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWFnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uZmlsZXJlcXVlc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGV1cGRhdGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzcmVxdWVzdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzdXBkYXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVtY2xpZW50LmFjY2Vzc3JlcXVlc3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVubGl2ZW4iPgorICAgIDxnbG9iIHBhdHRlcm49Iioubm1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5lc2YiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2YiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5xdWlja2FuaW1lIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFhbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24uc2FsdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbHQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zc2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVyaWNzc29uLnF1aWNrY2FsbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lc3ppZ25vMyt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXMzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ldDMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuYW9jK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmN1Zyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2Y29tbWFuZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2ZGlzY292ZXJ5K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZwcm9maWxlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtYmMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1jb2QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1ucHZyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZ1ZXByb2ZpbGUreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kubWNpZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5zY2kreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuc2ltc2VydnMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV1ZG9yYS5kYXRhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV6cGl4LWFsYnVtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV6MiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXpwaXgtcGFja2FnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lejMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmYtc2VjdXJlLm1vYmlsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZGYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZHNuLm1zZWVkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZWVkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZHNuLnNlZWQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VlZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGF0YWxlc3MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZmc25zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZpbnRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZsb2dyYXBoaXQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3BoIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mbHV4dGltZS5jbGlwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0YyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZm9udC1mb250Zm9yZ2Utc2ZkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZyYW1lbWFrZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZm0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZyYW1lIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYWtlciIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm9vayIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5mbmMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZm5jIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mcm9nYW5zLmx0ZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sdGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZzYy53ZWJsYXVuY2giPgorICAgIDxnbG9iIHBhdHRlcm49IiouZnNjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9hcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czIiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2EyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vYTMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNncCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mZzUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNwcnMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmgyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guYXJ0LWV4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5hcnQ0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5oYnBsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kZGQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGRkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZG9jdXdvcmtzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhkdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGJkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdXQtbWlzbmV0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1enp5c2hlZXQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZnpzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nZW5vbWF0aXgudHV4ZWRvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR4ZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEuZmlsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nZ2IiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLnRvb2wiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2d0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nZW9tZXRyeS1leHBsb3JlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nZXgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdyZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ214Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdteCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmttbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua216Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtteiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3JhZmVxIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdxZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3FzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncmlkbXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWFjY291bnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2FjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaGVscCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5naGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1pZGVudGl0eS1tZXNzYWdlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdpbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWluamVjdG9yIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdydiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtbWVzc2FnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ndG0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLXRlbXBsYXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRwbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXZjYXJkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGFuZGhlbGQtZW50ZXJ0YWlubWVudCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouem1tIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oYmNpIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhiY2kiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhjbC1iaXJlcG9ydHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGhlLmxlc3Nvbi1wbGF5ZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioubGVzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwZ2wiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWhwaWQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHBpZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtaHBzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtamx5dCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qbHQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLXBjbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY2wiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLXBjbHhsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjbHhsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5odHRwaG9uZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oeWRyb3N0YXRpeC5zb2YtZGF0YSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZmQtaGRzdHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmh6bi0zZC1jcm9zc3dvcmQiPgorICAgIDxnbG9iIHBhdHRlcm49IioueDNkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0uYWZwbGluZWRhdGEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLmVsZWN0cm9uaWMtbWVkaWEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLm1pbmlwYXkiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXB5Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0ubW9kY2FwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFmcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubGlzdGFmcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubGlzdDM4MjAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5yaWdodHMtbWFuYWdlbWVudCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pcm0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5zZWN1cmUtY29udGFpbmVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pY2Nwcm9maWxlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmljYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWNtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pZ2xvYWRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZ2wiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2cCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pdnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2dSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pdnUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmluZm9ybWVkY29udHJvbC5ybXMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmluZm9ybWl4LXZpc2lvbmFyeSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbnRlcmNvbi5mb3JtbmV0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwdyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHB4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbnRlcnRydXN0LmRpZ2lib3giLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5ubmNwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludHUucWJvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFibyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50dS5xZngiPgorICAgIDxnbG9iIHBhdHRlcm49IioucWZ4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmNvbmNlcHRpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmtub3dsZWRnZWl0ZW0reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlwdGMuZzIubmV3c2l0ZW0reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlwdGMuZzIucGFja2FnZWl0ZW0reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlwdW5wbHVnZ2VkLnJjcHJvZmlsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yY3Byb2ZpbGUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlyZXBvc2l0b3J5LnBhY2thZ2UreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlycCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXMteHByIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtZGlyZWN0b3J5LXNlcnZpY2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtanBuc3RvcmUtd2FrZXVwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXBheW1lbnQtd2FrZXVwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXJlZ2lzdHJhdGlvbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb24td2FrZXVwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXNldHN0b3JlLXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC12ZXJpZmljYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtdmVyaWZpY2F0aW9uLXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qY3AuamF2YW1lLm1pZGxldC1ybXMiPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm1zIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qaXNwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmppc3AiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmpvb3N0LmpvZGEtYXJjaGl2ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qb2RhIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rYWhvb3R6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt0eiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioua3RyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua2FyYm9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmthcmJvbiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtjaGFydCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jaHJ0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua2Zvcm11bGEiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua2ZvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua2l2aW8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmx3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua29udG91ciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rb24iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rcHJlc2VudGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtwciIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioua3B0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua3NwcmVhZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rc3AiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rd29yZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rd2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt3dCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2VuYW1lYWFwcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odGtlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5raWRzcGlyYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49Iioua2lhIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5raW5hciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rbmUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtucCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua29hbiI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gta29hbiIvPgorICAgIDxfY29tbWVudD5TU0VZTyBLb2FuIEZpbGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2twIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5za2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrdCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2ttIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rb2Rhay1kZXNjcmlwdG9yIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNzZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubGliZXJ0eS1yZXF1ZXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5kZXNrdG9wIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxiZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZXhjaGFuZ2UreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxiZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtMS0yLTMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouMTIzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1hcHByb2FjaCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hcHIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLWZyZWVsYW5jZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcmUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLW5vdGVzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5zZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtb3JnYW5pemVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9yZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtc2NyZWVuY2FtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy13b3JkcHJvIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iV29yZFByb1wwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iV29yZFByb1xyXDM3MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmx3cCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYWNwb3J0cy5wb3J0cGtnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvcnRwa2ciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1hcmxpbi5kcm0uYWN0aW9udG9rZW4reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1hcmxpbi5kcm0uY29uZnRva2VuK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmxpY2Vuc2UreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1hcmxpbi5kcm0ubWRjZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tY2QiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWNkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZWRjYWxjZGF0YSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYzEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1lZGlhc3RhdGlvbi5jZGtleSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZGtleSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWVyaWRpYW4tc2xpbmdzaG90Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1mZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXdmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZm1wIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1mbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5mbG8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmxvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taWNyb2dyYWZ4LmlneCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZ3giLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWlmIj4KKyAgICA8X2NvbW1lbnQ+RnJhbWVNYWtlciBNSUYgZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LW1pZiIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWZyYW1lIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXJGaWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNSUZGaWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlckRpY3Rpb25hcnkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01ha2VyU2NyZWVuRm9udCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TU1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtCb29rIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlciIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1pZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taW5pc29mdC1ocDMwMDAtc2F2ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taXRzdWJpc2hpLm1pc3R5LWd1YXJkLnRydXN0d2ViIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy5kYWYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGFmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGlzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1iayI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYmsiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy5tcXkiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXF5Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXNsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLnBsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy50eGYiPgorICAgIDxnbG9iIHBhdHRlcm49IioudHhmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uYXBwbGljYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBuIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmFkc2kiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmZpcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUuZ290YXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmttciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUudHRjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS53ZW0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuaXBybSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3ppbGxhLnh1bCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueHVsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1hcnRnYWxyeSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jaWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWFzZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1jYWItY29tcHJlc3NlZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYWIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCAtLT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiPgorICAgIDwhLS0gVXNlIG9yZy5hcGFjaGUudGlrYS5kZXRlY3QuQ29udGFpbmVyQXdhcmVEZXRlY3RvciBmb3IgbW9yZSByZWxpYWJsZSBkZXRlY3Rpb24gb2YgT0xFMiBkb2N1bWVudHMgLS0+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL21zZXhjZWwiIC8+CisgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBFeGNlbCBTcHJlYWRzaGVldDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik1pY3Jvc29mdFwgRXhjZWxcIDUuMFwgV29ya3NoZWV0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA4MCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJGb2dsaW9cIGRpXCBsYXZvcm9cIE1pY3Jvc29mdFwgRXhjZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQmlmZjUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMTE0Ii8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJpZmY1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjEyMSIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJceDA5XHgwNFx4MDZceDAwXHgwMFx4MDBceDEwXHgwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgIDxtYXRjaCB2YWx1ZT0iV1x4MDBvXHgwMHJceDAwa1x4MDBiXHgwMG9ceDAwb1x4MDBrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bG0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsdyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bGQiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgQWRkLWluIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bGFtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFdvcmtib29rIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHNtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQuYmluYXJ5Lm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBFeGNlbCAyMDA3IEJpbmFyeSBTcHJlYWRzaGVldDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHNiIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsdG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVvdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtaHRtbGhlbHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2htIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1pbXMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaW1zIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1scm0iPgorICAgIDxnbG9iIHBhdHRlcm49IioubHJtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2siPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgT3V0bG9vayBNZXNzYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZyIgLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNhdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBsYXlyZWFkeS5pbml0aWF0b3IreG1sIi8+CisKKyAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IC0tPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50Ij4KKyAgICA8IS0tIFVzZSBvcmcuYXBhY2hlLnRpa2EuZGV0ZWN0LkNvbnRhaW5lckF3YXJlRGV0ZWN0b3IgZm9yIG1vcmUgcmVsaWFibGUgZGV0ZWN0aW9uIG9mIE9MRTIgZG9jdW1lbnRzIC0tPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tc3Bvd2VycG9pbnQiLz4KKyAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFBvd2VycG9pbnQgUHJlc2VudGF0aW9uPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUFx4MDBvXHgwMHdceDAwZVx4MDByXHgwMFBceDAwb1x4MDBpXHgwMG5ceDAwdFx4MDAgRFx4MDBvXHgwMGNceDAwdVx4MDBtXHgwMGVceDAwblx4MDB0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucHB6Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucG90Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcGEiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LmFkZGluLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gQWRkLWluIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcGFtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHB0bSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNsZG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlc2hvdy5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgUHJlc2VudGF0aW9uIFNsaWRlc2hvdyAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHBzbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvdG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXB0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXRuZWYiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tcy10bmVmIiAvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDIyM2U5Zjc4IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLmxpYy1jaGxnLXJlcSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5saWMtcmVzcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5tZXRlci1jaGxnLXJlcSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5tZXRlci1yZXNwIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZC5kb2N1bWVudC5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvY20iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudCBUZW1wbGF0ZSAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG90bSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndwcyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2tzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53Y20iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndkYiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd3BsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndwbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMteHBzZG9jdW1lbnQiPgorICAgIDxnbG9iIHBhdHRlcm49IioueHBzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tc2VxIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZXEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zaWduIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11bHRpYWQuY3JlYXRvciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdWx0aWFkLmNyZWF0b3IuY2lmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11c2ljLW5pZmYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXVzaWNpYW4iPgorICAgIDxnbG9iIHBhdHRlcm49IioubXVzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdXZlZS5zdHlsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc3R5Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uY2QuY29udHJvbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uY2QucmVmZXJlbmNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5lcnZhbmEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmV0ZnB4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5ldXJvbGFuZ3VhZ2Uubmx1Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5sdSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtZGlyZWN0b3J5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5uZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtc2VhbGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5ucyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5udyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuY2F0YWxvZ3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuY29ubWwrd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuY29ubWwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmlzZHMtcmFkaW8tcHJlc2V0cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5pcHR2LmNvbmZpZyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmsrd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmsreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmxhbmRtYXJrY29sbGVjdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmFjK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2UuZGF0YSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uZ2RhdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLnN5bWJpYW4uaW5zdGFsbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uLWdhZ2UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm5jZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5wY2Qrd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucGNkK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXQiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnBzdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0cyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ycHNzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZG0iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZWRtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHgiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZWR4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5leHQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXh0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBPcGVuIERvY3VtZW50IEZvcm1hdCBmb3IgT2ZmaWNlIEFwcGxpY2F0aW9ucyAoT3BlbkRvY3VtZW50KSB2MS4wICAgIC0tPgorICA8IS0tIGh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvc3BlY3MvaW5kZXgucGhwI29wZW5kb2N1bWVudHYxLjAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IENoYXJ0IGRvY3VtZW50PC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ii8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBDaGFydCBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdGMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kYiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBGb3JtdWxhIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEiIC8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYS10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogRm9ybXVsYSBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kZnQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHcmFwaGljcyBkb2N1bWVudCAoRHJhd2luZyk8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEdyYXBoaWNzIGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90ZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEltYWdlIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlLXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlLXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBJbWFnZSBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdGkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFByZXNlbnRhdGlvbiBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbi10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogUHJlc2VudGF0aW9uIGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90cCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFNwcmVhZHNoZWV0IGRvY3VtZW50PC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ii8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZHMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBTcHJlYWRzaGVldCBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdHMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogVGV4dCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0Ii8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHbG9iYWwgVGV4dCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFRleHQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90dCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFRleHQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZSBmb3IgSFRNTCBkb2N1bWVudHM8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RoIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9ibiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEtc2N3cy1jb25maWciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtaHR0cC1yZXF1ZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWh0dHAtcmVzcG9uc2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LmFzc29jaWF0ZWQtcHJvY2VkdXJlLXBhcmFtZXRlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LmRybS10cmlnZ2VyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuaW1kK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QubHRrbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Qubm90aWZpY2F0aW9uK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QucHJvdmlzaW9uaW5ndHJpZ2dlciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dib290Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zZ2RkK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dkdSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2ltcGxlLXN5bWJvbC1jb250YWluZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNtYXJ0Y2FyZC10cmlnZ2VyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3Byb3YreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zdGttIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kY2QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRjZGMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGQyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpc2QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5ncm91cC11c2FnZS1saXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmRldGFpbGVkLXByb2dyZXNzLXJlcG9ydCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5maW5hbC1yZXBvcnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZ3JvdXBzK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmludm9jYXRpb24tZGVzY3JpcHRvcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5vcHRpbWl6ZWQtcHJvZ3Jlc3MtcmVwb3J0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEueGNhcC1kaXJlY3RvcnkreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYWRzLWVtYWlsK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1maWxlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1mb2xkZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYWxvYy1zdXBsLWluaXQiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVub2ZmaWNlb3JnLmV4dGVuc2lvbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5veHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbjwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcHR4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50aG14Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2xkeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcHN4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudGVtcGxhdGUiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgUHJlc2VudGF0aW9uIFRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvdHgiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3ciPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgUHJlc2VudGF0aW9uIFNsaWRlc2hvdzwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcHN4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vazwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHN4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHR4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFdvcmtib29rIFRlbXBsYXRlIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHRtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb2N4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZSI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudCBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb3R4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NhLm5ldGRlcGxveSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vc2dpLmJ1bmRsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vc2dpLmRwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vdHBzLmN0LWtpcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGFsbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZGIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBxYSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3ByYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGFvcy54bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGcuZm9ybWF0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGcub3Nhc2xpIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVpNiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGlhY2Nlc3MuYXBwbGljYXRpb24tbGljZW5jZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5waWNzZWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZWZpZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG9jLmdyb3VwLWFkdmVydGlzZW1lbnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBsZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wYmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjYtcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjctcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3NSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3NS1zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnByZW1pbmV0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnByZXZpZXdzeXN0ZW1zLmJveCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ib3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnByb3RldXMubWFnYXppbmUiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWd6Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWUiPgorICAgIDxnbG9iIHBhdHRlcm49IioucXBzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wdmkucHRpZDEiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHRpZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHdnLW11bHRpcGxleGVkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB3Zy14aHRtbC1wcmludCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucXVhbGNvbW0uYnJldy1hcHAtcmVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnF1YXJrLnF1YXJreHByZXNzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnF4ZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucXh0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xd2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnF3dCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucXhsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xeGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJhcGlkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5teGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXVzaWN4bWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJlbmxlYXJuLnJscHJpbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucmltLmNvZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jb2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLlJNRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJvdXRlNjYubGluazY2K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5saW5rNjYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJ1Y2t1cy5kb3dubG9hZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zM3NtcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zYm0uY2lkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNibS5taWQyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNjcmlidXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLjNkZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQuY3NmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5kb2MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmVtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQubWh0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5uZXQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnBwdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQudGlmZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQueGxzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmh0bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwucGRmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlZW1haWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZW1hIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlbWEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlbWQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VtZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VtZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZW1mIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZm0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm10ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pdHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmludGVyY2hhbmdlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlpZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pcGsiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNpbXRlY2gtbWluZG1hcHBlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50d2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR3ZHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNtYWYiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW1mIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zbWFydC50ZWFjaGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRlYWNoZXIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNvZnR3YXJlNjAyLmZpbGxlci5mb3JtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2Z0d2FyZTYwMi5maWxsZXIuZm9ybS14bWwtemlwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNvbGVudC5zZGttK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZGttIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZGtkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5keHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHhwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5zZnMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2ZzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zc3MtY29kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNzcy1kdGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3NzLW50ZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uY2FsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3MiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2R3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZvciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlci1nbG9iYWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2dsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdHJlZXQtc3RyZWFtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zeGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zeGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zeGkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcy50ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdGkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zeG0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5zdW4ueG1sLndyaXRlciIvPgorICAgIDxfY29tbWVudD5PcGVuT2ZmaWNlIHYxLjA6IFdyaXRlciBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3h3Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zeGciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLnRlbXBsYXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0dyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1cy1jYWxlbmRhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN1c3AiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN2ZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN3aWZ0dmlldy1pY3MiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW1iaWFuLmluc3RhbGwiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDEwMDAwNDE5IiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSI4IiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpc3giLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3luY21sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54c20iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt3YnhtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iZG0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGRtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0ubm90aWZpY2F0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kcy5ub3RpZmljYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudGFvLmludGVudC1tb2R1bGUtYXJjaGl2ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50YW8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRtb2JpbGUtbGl2ZXR2Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRtbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJpZC50cHQiPgorICAgIDxnbG9iIHBhdHRlcm49IioudHB0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50cmlzY2FwZS5teHMiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXhzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50cnVlYXBwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRyYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJ1ZWRvYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51ZmRsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVmZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudWZkbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudWlxLnRoZW1lIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnV0eiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudW1hamluIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVtaiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudW5pdHkiPgorICAgIDxnbG9iIHBhdHRlcm49IioudW5pdHl3ZWIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVvbWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVvbWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlLXdieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2FjaGVvcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jaGFubmVsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbC13YnhtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0LXdieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdGNtZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQtd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5zaWduYWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmN4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmQtc3R1ZHkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmVjdG9yd29ya3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmlkc29mdC52aWRjb25mZXJlbmNlIi8+CisKKyAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL3ZuZC52aXNpbyAtLT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmlzaW8iPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgVmlzaW8gRGlhZ3JhbTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi52c2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudnNzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52c3ciLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52aXNpb25hcnkiPgorICAgIDxnbG9iIHBhdHRlcm49IioudmlzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52aXZpZGVuY2Uuc2NyaXB0ZmlsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52c2YiPgorICAgIDxnbG9iIHBhdHRlcm49IioudnNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndhcC5zbGMiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2J4bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiPgorICAgIDxfY29tbWVudD5Db21waWxlZCBXTUwgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioud21sYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAud21sc2NyaXB0YyI+CisgICAgPF9jb21tZW50PkNvbXBpbGVkIFdNTCBTY3JpcHQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioud21sc2MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2VidHVyYm8iPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3RiIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndtYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53bWYuYm9vdHN0cmFwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndvcmRwZXJmZWN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndwZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3FkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndxZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3JxLWhwMzAwMC1sYWJlbGxlZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53dC5zdGYiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53di5jc3Ard2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53di5zc3AreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhhcmEiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGFyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54ZmRsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhmZGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhmZGwud2ViZm9ybSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bWkreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLmNwa2ciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUuZHBrZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5wbGFuIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLnBwa2ciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUueGxpbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtZGljIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh2ZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXNjcmlwdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odnMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi12b2ljZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXQiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3NmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Lm9zZnB2Zyt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3NmcHZnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuc21hZi1hdWRpbyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zYWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5zbWFmLXBocmFzZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuenVsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnppciIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouemlyeiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuenphenouZGVjayt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouemF6Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZvaWNleG1sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52eG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dhdGNoZXJpbmZvK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dob2lzcHAtcXVlcnkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aG9pc3BwLXJlc3BvbnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2luaGxwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhscCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aXRhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd29yZHBlcmZlY3Q1LjEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93c2RsK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53c2RsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dzcG9saWN5K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53c3BvbGljeSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtMTIzIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwMWEwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwMDIwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWJpd29yZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hYnciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hY2UtY29tcHJlc3NlZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFkb2JlLWluZGVzaWduIj4KKyAgICA8YWNyb255bT5JTkREPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5BZG9iZSBJbkRlc2lnbiBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pbmRkIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hZG9iZS1pbmRlc2lnbi1pbnRlcmNoYW5nZSI+CisgICAgPGFjcm9ueW0+SU5YPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5BZG9iZSBJbkRlc2lnbiBJbnRlcmNoYW5nZSBmb3JtYXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7P2FpZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6MTAwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlueCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hcmNoaXZlIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iPSZsdDthciZndDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ij0hJmx0O2FyY2gmZ3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVyPSIqLmFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hdXRob3J3YXJlLWJpbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hYWIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLngzMiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudTMyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52b3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hdXRob3J3YXJlLW1hcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hYW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hdXRob3J3YXJlLXNlZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hYXMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iY3BpbyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iY3BpbyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYmVya2VsZXktZGIiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNjE1NjEiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MjI1MyIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDIyNTMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDIyNTMiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDA5ODgiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQwOTg4IiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQwOTg4IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYmlidGV4LXRleHQtZmlsZSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiVcIEJpYlRlWFwgYCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJSUlXCBcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjczIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiVcIEJpYlRlWFwgc3RhbmRhcmRcIGJpYmxpb2dyYXBoeVwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIlJSVcIFwgQEJpYlRlWC1zdHlsZS1maWxleyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjczIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBhcnRpY2xleyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQGJvb2t7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAaW5ib29reyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQGluY29sbGVjdGlvbnsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBpbnByb2NlZWRpbmdzeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQG1hbnVhbHsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBtaXNjeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQHByZWFtYmxleyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQHBoZHRoZXNpc3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkB0ZWNocmVwb3J0eyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQHVucHVibGlzaGVkeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmliIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iaWJ0ZXgiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJpdHRvcnJlbnQiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJkODphbm5vdW5jZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudG9ycmVudCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYnppcCI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJaaCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYnoiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRieiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYnppcDIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYnoyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50YnoyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ib3oiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtYnppcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY2RsaW5rIj4KKyAgICA8X2NvbW1lbnQ+VmlydHVhbCBDRC1ST00gQ0QgSW1hZ2UgRmlsZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi52Y2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNoYXQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2hhdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNoZXNzLXBnbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZ24iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNvbXByZXNzIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAzN1wyMzUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnoiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNvcmVscHJlc2VudGF0aW9ucyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaHciLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKyAgCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jcGlvIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzA3IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwNyIgdHlwZT0iYmlnMTYiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcGlvIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jc2giPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3NoIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kZWIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVkZWIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIj4KKyAgICA8X2NvbW1lbnQ+U2hvY2t3YXZlIE1vdmllPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpciIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGNyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5keHIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2N0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jeHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnczZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmdkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zd2EiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWRvb20iPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2FkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHRibmN4K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uY3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdGJvb2sreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0YiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR0YnJlc291cmNlK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yZXMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR2aSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwzNjdcMDAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAyZjciIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHZpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1lbGMiPgorICAgIDxfY29tbWVudD5FbWFjcyBMaXNwIGJ5dGVjb2RlPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDwhLS0gRW1hY3MgMTggLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwwMTIoIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDwhLS0gRW1hY3MgMTkgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjtFTENcMDIzXDAwMFwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZWxjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWJkZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5iZGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWRvcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1mcmFtZW1ha2VyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWdob3N0c2NyaXB0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdzZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtbGliZ3J4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWxpbnV4LXBzZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wc2YiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtb3RmIj4KKyAgICA8YWNyb255bT5PVEY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50Pk9wZW5UeXBlIEZvbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXBjZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXNuZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbmYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXNwZWVkbyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zdW5vcy1uZXdzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtdHRmIj4KKyAgICA8YWNyb255bT5UVEY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlRydWVUeXBlIEZvbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioudHRmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50dGMiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAxMDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC10eXBlMSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZmEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmYiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGZtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hZm0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXZmb250Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZ1dHVyZXNwbGFzaCI+CisgICAgPF9jb21tZW50Pk1hY3JvbWVkaWEgRnV0dXJlU3BsYXNoIEZpbGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BsIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1nbnVjYXNoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdudWNhc2giIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1nbnVtZXJpYyI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtR251bWVyaWMtc3ByZWFkc2hlZXQiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iPSZsdDtnbXI6V29ya2Jvb2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzOSIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ251bWVyaWMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWd0YXIiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPCEtLSBHTlUgdGFyIGFyY2hpdmUgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9InVzdGFyICBcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI1NyIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3RhciIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10YXIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWd6aXAiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDM3XDIxMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRneiIgLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd6IiAvPgorICAgIDxnbG9iIHBhdHRlcm49IiotZ3oiIC8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbXoiIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1oZGYiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDBlMDMxMzAxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwyMTFIREZcclxuXDAzMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaGRmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oZTUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWh3cCI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tCisgICAgICAgIFRJS0EtMzMwOiBEZXRlY3Rpb24gcGF0dGVybiBiYXNlZCBvbiBzaWduYXR1cmUgc3RyaW5ncyBmcm9tCisgICAgICAgIHRoZSBod3BmaWx0ZXIvc291cmNlL2h3cGZpbGUuY3BwIGZpbGUgaW4gT3Blbk9mZmljZS5vcmcuCisgICAgICAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iSFdQIERvY3VtZW50IEZpbGUgViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNEMDAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzc2MzMiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXNvIiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouam5scCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gta2RlbG5rIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iW0tERVwgRGVza3RvcFwgRW50cnldIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIjXCBLREVcIENvbmZpZ1wgRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbGF0ZXgiPgorICAgIDxfY29tbWVudD5MYVRlWCBTb3VyY2UgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIlXCAtKi1sYXRleC0qLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubGF0ZXgiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWxoYSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1senMtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGhcNDAtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGhkLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDMtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGg0LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGg3LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbGhhcmMiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGgwLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1sejQtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbHo1LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbW9iaXBvY2tldC1lYm9vayI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcmMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vYmkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hcHBsaWNhdGlvbiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zLXdtZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy13bXoiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1nemlwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bXoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy14YmFwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhiYXAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2FjY2VzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2JpbmRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vYmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2NhcmRmaWxlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNyZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zY2xpcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4ZSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGxsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jb20iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJhdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXNpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNtZWRpYXZpZXciPgorICAgIDxnbG9iIHBhdHRlcm49IioubXZiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tMTMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0xNCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zbWV0YWZpbGUiPgorICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LWVtZiIvPgorICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LXdtZiIvPgorICAgIDxhY3JvbnltPldNRjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+V2luZG93cyBNZXRhZmlsZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zbW9uZXkiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW55Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNwdWJsaXNoZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHViIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNzY2hlZHVsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zY2QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRybSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zd3JpdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3JpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbmV0Y2RmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5jIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wa2NzMTIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDEyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZngiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0aWZpY2F0ZXMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDdiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0cmVxcmVzcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wN3IiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXF1YXR0cm8tcHJvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFwdyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2IxIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53YjIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndiMyIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorICAKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1yYXIiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUmFyISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucmFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1ycG0iPgorICAgIDxnbG9iIHBhdHRlcm49IioucnBtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlNwcmVhZHNoZWV0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzgiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2giPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIjIS8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiMhXCAvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIjIVx0LyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2giLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNoYXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2hhciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIj4KKyAgICA8YWNyb255bT5GbGFzaDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QWRvYmUgRmxhc2g8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJGV1MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gRiA9IFVuY29tcHJlc3NlZCAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQ1dTIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIEMgPSBDb21wcmVzc2VkICAgLS0+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN3ZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2lsdmVybGlnaHQtYXBwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhhcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlN0dWZmSXQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpdCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc3R1ZmZpdHgiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2l0eCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN2NGNwaW8iPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3Y0Y3BpbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN2NGNyYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdjRjcmMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRhciI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8IS0tIFBPU0lYIHRhciBhcmNoaXZlIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJ1c3RhclwwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjU3IiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi50YXIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRjbCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQveC10Y2wiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRjbCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4Ij4KKyAgICA8YWxpYXMgdHlwZT0idGV4dC94LXRleCIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXGlucHV0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXHNlY3Rpb24iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ilxcc2V0bGVuZ3RoIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXGRvY3VtZW50c3R5bGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlxcY2hhcHRlciIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxkb2N1bWVudGNsYXNzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXHJlbGF4IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXGNvbnRlbnRzbGluZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudGV4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10ZXgtdGZtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRmbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4aW5mbyI+CisgICAgPGFsaWFzIHR5cGU9InRleHQveC10ZXhpbmZvIiAvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXGlucHV0XCB0ZXhpbmZvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi50ZXhpbmZvIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50ZXhpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBNaWNyb3NvZnQgT2ZmaWNlIGJpbmFyeSBmaWxlIGZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pbnRlcm9wL2RvY3MvT2ZmaWNlQmluYXJ5Rm9ybWF0cy5tc3B4ICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiPgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ii8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIE9mZmljZSBPcGVuIFhNTCBmaWxlIGZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9zdGFuZGFyZHMvRWNtYS0zNzYuaHRtIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQS1wwMDNcMDA0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iW0NvbnRlbnRfVHlwZXNdLnhtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC11c3RhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51c3RhciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kZXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNydCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXhmaWciPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmlnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gteHBpbnN0YWxsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwaSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtem9vIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZGM0YTdkYyIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouem9vIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veDQwMC1icCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtYXR0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtY2Fwcyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWVsK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtZXJyb3IreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1ucyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y29uLWNvbmZlcmVuY2UtaW5mby1kaWZmK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjb24tY29uZmVyZW5jZS1pbmZvK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hlbmMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhlbmMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aHRtbCB4bWxucz0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgxOTIiLz4KKyAgICA8L21hZ2ljPgorICAgIDxyb290LVhNTCBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGxvY2FsTmFtZT0iaHRtbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGh0bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hodG1sLXZvaWNlK3htbCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1sIj4KKyAgICA8YWxpYXMgdHlwZT0idGV4dC94bWwiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0Oz94bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDs/WE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IS0tIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweEZGRkUzQzAwM0YwMDc4MDA2RDAwNkMwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhGRUZGMDAzQzAwM0YwMDc4MDA2RDAwNkMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8IS0tIFRPRE86IEFkZCBtYXRjaGVzIGZvciB0aGUgb3RoZXIgcG9zc2libGUgWE1MIGVuY29kaW5nIHNjaGVtZXMgLS0+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhtbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54c2QiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1sLWR0ZCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kdGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94bXBwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hvcCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueG9wIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veHNsdCt4bWwiPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3hzbCIvPgorICAgIDxhY3JvbnltPlhTTFQ8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlhTTCBUcmFuc2Zvcm1hdGlvbnM8L19jb21tZW50PgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InN0eWxlc2hlZXQiCisgICAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54c2x0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veHNwZit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNwZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94dit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXhtbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGh2bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh2bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh2bSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDAzXDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouemlwIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vMzJrYWRwY20iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby8zZ3BwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vM2dwcDIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hYzMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hZHBjbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hZHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYW1yIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYW1yLXdiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYW1yLXdiKyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2FzYyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYmFzaWMiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIuc25kIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIyIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI1IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjYiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF1Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbmQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9idjE2Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYnYzMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2NsZWFybW9kZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2NuIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZGF0MTIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kbHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kc3ItZXMyMDExMDgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kc3ItZXMyMDIwNTAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kc3ItZXMyMDIyMTEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kc3ItZXMyMDIyMTIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kdmk0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZWFjMyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjLXFjcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmMwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyYzEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmNiMCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmNiMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmN3YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmN3YjAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjd2IxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXhhbXBsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MTkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzIyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMjEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzIzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyNi0xNiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtMjQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTMyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyNi00MCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOTEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5ZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjllIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZ3NtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZ3NtLWVmciIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2lsYmMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9sMTYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9sMjAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9sMjQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9sOCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2xwYyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbWlkaSI+CisgICAgPGFjcm9ueW0+TUlESTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+TXVzaWNhbCBJbnN0cnVtZW50IERpZ2l0YWwgSW50ZXJmYWNlPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHkgPSIyMCI+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiB2YWx1ZT0iTVRoZCIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1pZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWlkaSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioua2FyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybWkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tb2JpbGUteG1mIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbXA0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXVkaW8veC1tcDRhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcDRhIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wYSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wYS1yb2J1c3QiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wZWciPgorICAgIDxhY3JvbnltPk1QMzwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+TVBFRy0xIEF1ZGlvIExheWVyIDM8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPCEtLSBodHRwOi8vbXBnZWRpdC5vcmcvbXBnZWRpdC9tcGVnX2Zvcm1hdC9NUDNGb3JtYXQuaHRtbCAtLT4KKyAgICAgIDwhLS0gQml0IHBhdHRlcm4gZm9yIGZpcnN0IHR3byBieXRlczogMTExMTExMTEgMTExVlZMTEMgICAgLS0+CisgICAgICA8IS0tIFZWID0gTVBFRyBBdWRpbyBWZXJzaW9uIElEOyAxMCA9IFYyLCAxMSA9IFYxICAgICAgICAgIC0tPgorICAgICAgPCEtLSBMTCA9IExheWVyIGRlc2NyaXB0aW9uOyAwMSA9IEwzLCAxMCA9IEwyLCAxMSA9IEwxICAgICAtLT4KKyAgICAgIDwhLS0gQyA9IFByb3RlY3Rpb24gYml0OyAwID0gQ1JDLCAxID0gbm8gQ1JDICAgICAgICAgICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDMsIENSQyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmYzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMyAgICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwyLCBDUkMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDIgICAgICAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMSwgQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwxICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDMsIENSQyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZiIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMyAgICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwyLCBDUkMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDIgICAgICAtLT4KKyAgICAgIDwhLS0gVElLQS00MTc6IFRoaXMgaXMgdGhlIFVURi0xNiBMRSBieXRlIG9yZGVyIG1hcmshIC0tPgorICAgICAgPCEtLSBtYXRjaCB2YWx1ZT0iMHhmZmZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvIC0tPiA8IS0tIFYxLCBMMSwgQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwxICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IklEMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBnYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXAyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcDJhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcDMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0yYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTNhIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbXBlZzQtZ2VuZXJpYyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vb2dnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9nYSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2dnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcHgiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL29nZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Bhcml0eWZlYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3BjbWEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY21hLXdiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtdS13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3BjbXUiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Bycy5zaWQiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQU0lEIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcWNlbHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9yZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ydHAtZW5jLWFlc2NtMTI4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnRwLW1pZGkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ydHgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zbXYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zbXYwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212LXFjcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3NwLW1pZGkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90MTQwYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3QzOCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3RlbGVwaG9uZS1ldmVudCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3RvbmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby91bHBmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92ZHZpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm1yLXdiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLjNncHAuaXVmcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC40c2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuYXVkaW9rb3oiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuY2VscCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jaXNjby5uc2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuY21sZXMucmFkaW8tZXZlbnRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNucy5hbnAxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNucy5pbmYxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRpZ2l0YWwtd2luZHMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZW9sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kbG5hLmFkdHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkuaGVhYWMuMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5oZWFhYy4yIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5Lm1scCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5tcHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkucGwyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMngiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkucGwyeiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kdHMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHRzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kdHMuaGQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHRzaGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmV2ZXJhZC5wbGoiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuaG5zLmF1ZGlvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmx1Y2VudC52b2ljZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sdnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weWEiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHlhIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5ub2tpYS5tb2JpbGUteG1mIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm5vcnRlbC52YmsiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubnVlcmEuZWNlbHA0ODAwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjZWxwNDgwMCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubnVlcmEuZWNlbHA3NDcwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjZWxwNzQ3MCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubnVlcmEuZWNlbHA5NjAwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjZWxwOTYwMCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQub2N0ZWwuc2JjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnFjZWxwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnJoZXRvcmV4LjMya2FkcGNtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLm1wZWciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQudm14LmN2c2QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92b3JiaXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92b3JiaXMtY29uZmlnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1hYWMiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1hZGJjbSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii5zbmQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIyMyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWFpZmYiPgorICAgIDxhbGlhcyB0eXBlPSJhdWRpby9haWZmIi8+CisgICAgPGFjcm9ueW0+QUlGRjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QXVkaW8gSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJGT1JNLi4uLkFJRkYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZPUk0uLi4uQUlGQyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkYiLz4KKyAgICAgIDwhLS0gQW1pZ2EgSUZGIHNvdW5kIHNhbXBsZSwgc29tZXdoYXQgbGlrZSB0aGUgbW9yZSBtb2Rlcm4gQUlGRiAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRk9STS4uLi44U1ZYIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpZmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpZmMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWRlYy1iYXNpYyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDA2NDczMkUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjQiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI2IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjciIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1kZWMtYWRiY20iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwNjQ3MzJFIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIj4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIyMyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWZsYWMiPgorICAgIDxhY3JvbnltPkZMQUM8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkZyZWUgTG9zc2xlc3MgQXVkaW8gQ29kZWM8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJmTGFDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbGFjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tb2QiPgorICAgIDxhY3JvbnltPk1PRDwvYWNyb255bT4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRXh0ZW5kZWRcIE1vZHVsZToiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJNT0QyU1RNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjEiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTS5LLiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTSFLISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRkxUNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRkxUOCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iNENITiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iNkNITiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iOENITiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQ0Q4MSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iT0tUQSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMTZDTiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMzJDTiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iSU1QTSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubW9kIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tcGVndXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0zdSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LW1zLXdheCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53YXgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tcy13bWEiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud21hIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1wbi1yZWFsYXVkaW8iPgorICAgIDxfY29tbWVudD5SZWFsIEF1ZGlvPC9fY29tbWVudD4KKyAgICA8YWxpYXMgdHlwZT0iYXVkaW8veC1yZWFsYXVkaW8iIC8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MmU3MjYxZmQiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucmFtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yYSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybXAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LXdhdiI+CisgICAgPGFjcm9ueW0+V0FWPC9hY3JvbnltPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJSSUZGLi4uLldBVkUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndhdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY2R4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNpZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jaWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jbWRmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtZGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jbWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY3NtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jc21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtcGRiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC14eXoiPgorICAgIDxnbG9iIHBhdHRlcm49IioueHl6Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvYm1wIj4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1tcy1ibXAiLz4KKyAgICA8YWNyb255bT5CTVA8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PldpbmRvd3MgYml0bWFwPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQk0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ibXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpYiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2NnbSI+CisgICAgPGFjcm9ueW0+Q0dNPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Db21wdXRlciBHcmFwaGljcyBNZXRhZmlsZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJFR01GIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMjAiIG1hc2s9IjB4ZmZlMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2dtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvZXhhbXBsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2ZpdHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9nM2ZheCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nMyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2dpZiI+CisgICAgPGFjcm9ueW0+R0lGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5HcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJHSUY4N2EiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkdJRjg5YSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2lmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvaWVmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmllZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcDIiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2pwZWciPgorICAgIDxhY3JvbnltPkpQRUc8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkpvaW50IFBob3RvZ3JhcGhpYyBFeHBlcnRzIEdyb3VwPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDwhLS0gRkZEOCBpcyB0aGUgU09JIChTdGFydCBPZiBJbWFnZSkgbWFya2VyLiAgICAgICAgICAgICAgLS0+CisgICAgICA8IS0tIEl0IGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbWFya2VyIHRoYXQgc3RhcnRzIHdpdGggRkYuIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZDhmZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGVnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmppZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouamZpZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouamZpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanBtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanB4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvbmFwbHBzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wbmciPgorICAgIDxhY3JvbnltPlBORzwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgTmV0d29yayBHcmFwaGljczwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ilx4ODlQTkdceDBkXHgwYVx4MWFceDBhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbmciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wcnMuYnRpZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5idGlmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3Bycy5wdGkiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3N2Zyt4bWwiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPGFjcm9ueW0+U1ZHPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5TY2FsYWJsZSBWZWN0b3IgR3JhcGhpY3M8L19jb21tZW50PgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InN2ZyIgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdmd6Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvdDM4Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS90aWZmIj4KKyAgICA8YWNyb255bT5USUZGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5UYWdnZWQgSW1hZ2UgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPCEtLSBNTS4qID0gQmlnIGVuZGlhbiAoTT1Nb3Rvcm9sYSkgYW5kIDB4MDAyYSBpbiBiaWcgZW5kaWFuICAgIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJNTVx4MDBceDJhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBJSSouID0gTGl0dGxlIGVuZGlhbiAoST1JbnRlbCkgYW5kIDB4MDAyYSBpbiBsaXR0bGUgZW5kaWFuIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJJSVx4MmFceDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi50aWZmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50aWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS90aWZmLWZ4Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuYWRvYmUucGhvdG9zaG9wIj4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1wc2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5jbnMuaW5mMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5kanZ1Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRqdnUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRqdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5kd2ciPgorICAgIDxhY3JvbnltPkRXRzwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QXV0b0NhZCBEcmF3aW5nPC9fY29tbWVudD4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1kd2ciLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYWNhZCIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWFjYWQiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYXV0b2NhZF9kd2ciLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vZHdnIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHdnIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0b2NhZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHdnIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tICJBQyIgZm9sbG93ZWQgYnkgZm91ciBudW1iZXJzIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJBQzAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkYwRjBGMEYwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZHhmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR4ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZmFzdGJpZHNoZWV0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZicyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnB4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZweCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZzdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1tbXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW1yIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLXJsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmdsb2JhbGdyYXBoaWNzLnBnYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5taXgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQubXMtbW9kaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZGkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm5ldC1mcHgiPgorICAgIDxnbG9iIHBhdHRlcm49IioubnB4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5yYWRpYW5jZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWQucG5nIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmdpZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5qcGciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuc3ZmIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQud2FwLndibXAiPgorICAgIDxfY29tbWVudD5XaXJlbGVzcyBCaXRtYXAgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioud2JtcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC54aWZmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhpZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWNtdS1yYXN0ZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmFzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtY214Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNteCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWZyZWVoYW5kIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5maGMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoNCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmg1Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5maDciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWljb24iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMTAyXDEwMVwwNTBcMDAwXDAwMFwwMDBcMDU2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIKKyAgICAgICAgICAgICB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDAwXDAwMFwwMDFcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY28iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LW5pZmYiPgorICAgIDxfY29tbWVudD5OYXZ5IEludGVyY2hhbmdlIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iSUlOMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcGN4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBpY3QiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGljIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY3QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCI+CisgICAgPGFjcm9ueW0+UE5NPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Qb3J0YWJsZSBBbnkgTWFwPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBubSIgLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCIvPgorICAgIDxhY3JvbnltPlBCTTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgQml0IE1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucGJtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtYW55bWFwIi8+CisgICAgPGFjcm9ueW0+UEdNPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Qb3J0YWJsZSBHcmF5IE1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucGdtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLz4KKyAgICA8YWNyb255bT5QWE08L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlBvcnRhYmxlIFBpeGVsIE1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlAzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUDciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWFkb2JlIj4KKyAgICA8YWNyb255bT5ETkc8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkFkb2JlIERpZ2l0YWwgTmVnYXRpdmU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG5nIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctaGFzc2VsYmxhZCI+CisgICAgPF9jb21tZW50Pkhhc3NlbGJsYWQgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNmciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWZ1amkiPgorICAgIDxfY29tbWVudD5GdWppIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yYWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1jYW5vbiI+CisgICAgPF9jb21tZW50PkNhbm9uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcnciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNyMiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWtvZGFrIj4KKyAgICA8X2NvbW1lbnQ+S29kYWsgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmsyNSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioua2RjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kY3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRyZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW1pbm9sdGEiPgorICAgIDxfY29tbWVudD5NaW5vbHRhIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcnciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1uaWtvbiI+CisgICAgPF9jb21tZW50Pk5pa29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uZWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5ydyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW9seW1wdXMiPgorICAgIDxfY29tbWVudD5PbHltcHVzIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vcmYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1wZW50YXgiPgorICAgIDxfY29tbWVudD5QZW50YXggcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB0eCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGVmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctc29ueSI+CisgICAgPF9jb21tZW50PlNvbnkgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFydyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3JmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcjIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1zaWdtYSI+CisgICAgPF9jb21tZW50PlNpZ21hIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54M2YiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1lcHNvbiI+CisgICAgPF9jb21tZW50PkVwc29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lcmYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1tYW1peWEiPgorICAgIDxfY29tbWVudD5NYW1peWEgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1lZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWxlYWYiPgorICAgIDxfY29tbWVudD5MZWFmIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tb3MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1wYW5hc29uaWMiPgorICAgIDxfY29tbWVudD5QYW5hc29uaWMgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhdyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucncyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcGhhc2VvbmUiPgorICAgIDxfY29tbWVudD5QaGFzZSBPbmUgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNhcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWlxIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcmVkIj4KKyAgICA8X2NvbW1lbnQ+UmVkIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yM2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1pbWFjb24iPgorICAgIDxfY29tbWVudD5JbWFjb24gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZmZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWxvZ2l0ZWNoIj4KKyAgICA8X2NvbW1lbnQ+TG9naXRlY2ggcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB4biIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWNhc2lvIj4KKyAgICA8X2NvbW1lbnQ+Q2FzaW8gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJheSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXJhd3pvciI+CisgICAgPF9jb21tZW50PlJhd3pvciByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioucnd6Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yZ2IiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmdiIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14Yml0bWFwIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLyogWFBNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi54Ym0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQveC1jIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14Y2YiPgorICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94Y2YiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIHZhbHVlPSJnaW1wIHhjZiAiIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14cGl4bWFwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXh3aW5kb3dkdW1wIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvY3BpbSIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2V4dGVybmFsLWJvZHkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWRlbGl2ZXJ5LXN0YXR1cyIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWRpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvbiIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWhlYWRlcnMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2h0dHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2ltZG4reG1sIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL25ld3MiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQYXRoOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlhyZWY6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQXJ0aWNsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3BhcnRpYWwiLz4KKworICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvcmZjODIyIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUmVsYXktVmVyc2lvbjoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiMhXCBybmV3cyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTiMhXCBybmV3cyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRm9yd2FyZFwgdG8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlBpcGVcIHRvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJSZXR1cm4tUGF0aDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZyb206IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJSZWNlaXZlZDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiB2YWx1ZT0iTWVzc2FnZS1JRDoiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgdmFsdWU9IkRhdGU6IiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZW1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5taW1lIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9zLWh0dHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3NpcCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvc2lwZnJhZyIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvdHJhY2tpbmctc3RhdHVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS92bmQuc2kuc2ltcCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvZXhhbXBsZSIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvaWdlcyI+CisgICAgPF9jb21tZW50PkluaXRpYWwgR3JhcGhpY3MgRXhjaGFuZ2UgU3BlY2lmaWNhdGlvbiBGb3JtYXQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouaWdzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZ2VzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvbWVzaCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2giLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1lc2giLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpbG8iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZHdmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR3ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZmxhdGxhbmQuM2RtbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5nZGwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2RsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5ncy1nZGwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ3MuZ2RsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmd0dyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ndHciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLm1vbWwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLm10cyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tdHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLnBhcmFzb2xpZC50cmFuc21pdC5iaW5hcnkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQucGFyYXNvbGlkLnRyYW5zbWl0LnRleHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQudnR1Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZ0dSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZybWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3JsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52cm1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2FsdGVybmF0aXZlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2FwcGxlZG91YmxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2J5dGVyYW5nZXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvZGlnZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2VuY3J5cHRlZCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9leGFtcGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9oZWFkZXItc2V0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L21peGVkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3BhcmFsbGVsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3JlbGF0ZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvcmVwb3J0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3NpZ25lZCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC92b2ljZS1tZXNzYWdlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9jYWxlbmRhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlmYiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvY3NzIj4KKyAgICA8X2NvbW1lbnQ+Q2FzY2FkaW5nIFN0eWxlIFNoZWV0PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzcyIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvY3N2Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzdiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2RpcmVjdG9yeSIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvZG5zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9lY21hc2NyaXB0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9lbnJpY2hlZCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvZXhhbXBsZSIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9odG1sIj4KKyAgICAgPCEtLSBUSUtBLTMyNzogaWYgeW91IGVuY291bnRlciB0YWdzIGluIHRoZSBIVE1MCisgICAgICAgICAgd2l0aCBubyBkZWNsYXJlZCBuYW1lc3BhY2UsIGl0J3Mgbm90IFhIVE1MLCBpdCdzIGp1c3QKKyAgICAgICAgICBiYWQgSFRNTCwgdW5mb3J0dW5hdGVseS4KKyAgICAgLS0+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iaHRtbCIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkhUTUwiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJsaW5rIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iTElOSyIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImJvZHkiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJCT0RZIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icCIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlAiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJzY3JpcHQiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJTQ1JJUFQiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJmcmFtZXNldCIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkZSQU1FU0VUIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshRE9DVFlQRSBIVE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IWRvY3R5cGUgaHRtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0hFQUQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtoZWFkIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7VElUTEUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDt0aXRsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDwhLS0gbm90ZSBvbiB0aGUgb2Zmc2V0IHZhbHVlIGhlcmU6IHRoaXMgY2FuIG9ubHkgYmUgYXMgYmlnIGFzCisgICAgICAgICAgIE1pbWVUeXBlcyNnZXRNaW5MZW5ndGgoKS4gSWYgeW91IHNldCB0aGUgb2Zmc2V0IHZhbHVlIHRvIGxhcmdlcgorICAgICAgICAgICB0aGFuIHRoYXQgc2l6ZSwgdGhlIG1hZ2ljIHdpbGwgb25seSBiZSBjb21wYXJlZCB0byB1cCB0bworICAgICAgICAgICBNaW1lVHlwZXMjZ2V0TWluTGVuZ3RoKCkgYnl0ZXMuCisgICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtodG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4MTkyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtIVE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7Qk9EWSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2JvZHkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtUSVRMRSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O3RpdGxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtIMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyFkb2N0eXBlIEhUTUwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshRE9DVFlQRSBodG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odG1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odG0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3Bhcml0eWZlYyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wbGFpbiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlRoaXMgaXMgVGVYLCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iVGhpcyBpcyBNRVRBRk9OVCwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii8qIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIvLyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iOzsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8IS0tIFVURi0xNkJFIEJPTSAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZWZmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBVVEYtMTZMRSBCT00gLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDwhLS0gVVRGLTggQk9NIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGVmYmJiZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorCisgICAgPGdsb2IgcGF0dGVybj0iKi50eHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvbmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubGlzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubG9nIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pbiIvPgorCisgICAgPCEtLSBUSUtBLTg1OiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3N2bi1lb2wtc3R5bGUudHh0IC0tPgorICAgIDxnbG9iIHBhdHRlcm49IklOU1RBTEwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJLRVlTIi8+CisgICAgPGdsb2IgcGF0dGVybj0iTWFrZWZpbGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJSRUFETUUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJhYnMtbGlua21hcCIvPgorICAgIDxnbG9iIHBhdHRlcm49ImFicy1tZW51bGlua3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhcnQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2dpIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGFzc3BhdGgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY29uZmlnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jd2lraSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGF0YSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lZ3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbnQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZnYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Ii5odGFjY2VzcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWh0bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpteCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanNwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qdW5pdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouangiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hbmlmZXN0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tNCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLk1GIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZXRhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uMyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGVuIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucG0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucG9tIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcm9qZWN0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcm9wZXJ0aWVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5weSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucmIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJuZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm54Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yb2xlcyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3FsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50bGQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR5cGVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52bSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudnNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53c2RkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54YXJncyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGNhdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGNvbmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhlZ3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54Z3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bGV4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bG9nIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bWFwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cm9sZXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzYW1wbGVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54c3AiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZWIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZWxjb21lIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wcnMuZmFsbGVuc3RlaW4ucnN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wcnMubGluZXMudGFnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRzYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JlZCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcmZjODIyLWhlYWRlcnMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JpY2h0ZXh0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ0eCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3J0ZiIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcnRwLWVuYy1hZXNjbTEyOCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcnR4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9zZ21sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3QxNDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRzdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvdHJvZmYiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYtbWUiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC10cm9mZi1tcyIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIuXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IidcXCZxdW90OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJy5cXCZxdW90OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IicnJyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudHIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJvZmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC91bHBmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3VyaS1saXN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVyaSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudXJpcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudXJscyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5hYmMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN1cmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybC5kY3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kY3VybCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsLnNjdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjdXJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmN1cmwubWN1cmwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWN1cmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZG1jbGllbnRzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5lc21lcnRlYy50aGVtZS1kZXNjcmlwdG9yIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZmx5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZseSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5mbWkuZmxleHN0b3IiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmx4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmdyYXBodml6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd2Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmluM2QuM2RtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi4zZG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmluM2Quc3BvdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcG90Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmlwdGMubmV3c21sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuaXB0Yy5uaXRmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQubGF0ZXgteiIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm1vdG9yb2xhLnJlZmxleCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm1zLW1lZGlhcGFja2FnZSIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm5ldDJwaG9uZS5jb21tY2VudGVyLmNvbW1hbmQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5zaS51cmljYXRhbG9ndWUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qYWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQudHJvbGx0ZWNoLmxpbmd1aXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLnNpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLnNsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLndtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0Ij4KKyAgICA8X2NvbW1lbnQ+V01MIFNjcmlwdDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWxzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFzbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hc20iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3h4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcHAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaWMiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZGlmZiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9ImRpZmZcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iKioqXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik9ubHlcIGluXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNvbW1vblwgc3ViZGlyZWN0b3JpZXM6XCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkluZGV4OiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGlmZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGF0Y2giLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZm9ydHJhbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mb3IiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmY3NyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZjkwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQveC1wYXNjYWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGFzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWphdmEtc291cmNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphdmEiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtc2V0ZXh0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV0eCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQveC11dWVuY29kZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51dSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmNhbGVuZGFyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmNhcmQiPgorICAgIDxnbG9iIHBhdHRlcm49IioudmNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQveG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvLzNncHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouM2dwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvLzNncHAtdHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi4zZzIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vYm1wZWciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9idDY1NiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2NlbGIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9kdiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjYxIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgyNjEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2MyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oMjYzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMtMTk5OCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMtMjAwMCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaDI2NCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9qcGVnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZ3YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vanBlZzIwMDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9qcG0iPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGdtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21qMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tajIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1qcDIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXAxcyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wMnAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcDJ0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXA0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wNCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXA0diIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBnNCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcDR2LWVzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcGVnIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwMFwwMDBcMDAxXDI2MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBlZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0xdiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTJ2Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1wZWd1cmwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXh1Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXBlZzQtZ2VuZXJpYyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wdiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL252Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9vZ2ciPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2d2Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9wYXJpdHlmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9wb2ludGVyIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9xdWlja3RpbWUiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJtb292IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJtZGF0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubW92Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcmF3Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcnRwLWVuYy1hZXNjbTEyOCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3J0eCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3NtcHRlMjkybSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3VscGZlYyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZjMSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5jY3R2Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmRsbmEubXBlZy10dHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuZnZ0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ2dCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaG5zLnZpZGVvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0xMDEwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0yMDA1Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0xMDEwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0yMDA1Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS50dHNhdmMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaXB0dmZvcnVtLnR0c21wZWcyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvcCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcGVndXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14dSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTR1Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHl2Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5diIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubm9raWEuaW50ZXJsZWF2ZWQtbXVsdGltZWRpYSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5ub2tpYS52aWRlb3ZvaXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQub2JqZWN0dmlkZW8iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuc2VhbGVkLm1wZWcxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZC5tcGVnNCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWQuc3dmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLm1vdiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC52aXZvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZpdiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWY0diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mNHYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbGMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbGkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsdiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZMViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmx2Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1qbmciPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJceDhiSk5HIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qbmciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW00diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tNHYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1uZyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ilx4OGFNTkciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1uZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtYXNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXN4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd20iPgorICAgIDxnbG9iIHBhdHRlcm49Iioud20iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tcy13bXYiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud212Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd214Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndteCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXd2eCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53dngiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zdmlkZW8iPgorICAgIDxhbGlhcyB0eXBlPSJ2aWRlby9hdmkiLz4KKyAgICA8YWxpYXMgdHlwZT0idmlkZW8vbXN2aWRlbyIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJSSUZGLi4uLkFWSSAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF2aSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtc2dpLW1vdmllIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTU9WSSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubW92aWUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ4LWNvbmZlcmVuY2UveC1jb29sdGFsayI+CisgICAgPF9jb21tZW50PkNvb2x0YWxrIEF1ZGlvPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmljZSIvPgorICA8L21pbWUtdHlwZT4KKworPC9taW1lLWluZm8+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3JlcG9tZ3IvZWxlbWVudHMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9yZXBvbWdyL2VsZW1lbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTZkY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9yZXBvbWdyL2VsZW1lbnRzLnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczplbGVtZW50cyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdElkIiBuYW1lPSJDQVMuUHJvZHVjdElkIj4KKwkJPGRjRWxlbWVudD5JZGVudGlmaWVyPC9kY0VsZW1lbnQ+CisJCTxkZXNjcmlwdGlvbj4KKwkJCUEgUHJvZHVjdCdzIHVuaXF1ZSBpZGVudGlmaWVyIHdpdGhpbiB0aGUgQ0FTIG5hbWVzcGFjZS4KKwkJPC9kZXNjcmlwdGlvbj4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIiBuYW1lPSJDQVMuUHJvZHVjdE5hbWUiPgorCQk8ZGNFbGVtZW50PlRpdGxlPC9kY0VsZW1lbnQ+CisJCTxkZXNjcmlwdGlvbj4KKwkJCUEgUHJvZHVjdCdzIG5hbWUgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFJlY2VpdmVkVGltZSIKKwkJbmFtZT0iQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiPgorCQk8ZGNFbGVtZW50IC8+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBJU08gODYwMSBmb3JtYXR0ZWQgdGltZSB0aGF0IHRoZSBQcm9kdWN0IHdhcyByZWNlaXZlZC4KKwkJPC9kZXNjcmlwdGlvbj4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIiBuYW1lPSJGaWxlbmFtZSI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlTG9jYXRpb24iIG5hbWU9IkZpbGVMb2NhdGlvbiI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBsb2NhdGlvbnMgb2YgdGhlIGZpbGVzIHRoYXQgcmVwcmVzZW50IHRoaXMgcHJvZHVjdC4KKwkJPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFR5cGUiIG5hbWU9IlByb2R1Y3RUeXBlIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVHlwZSBvZiBwcm9kdWN0LCBhcyBzcGVjaWZpZWQgYnksIGUuZy4sIGEgZGF0YSBiaWJsZS4KKwkJPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFN0cnVjdHVyZSIgbmFtZT0iUHJvZHVjdFN0cnVjdHVyZSI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVdoZXRoZXIgb3Igbm90IGEgcHJvZHVjdCBpcyBGbGF0IChlLmcuLCBhIHNldCBvZiBpbmRlcGVuZGVudAorCQkJZmlsZXMpLCBvciBoaWVyYXJjaGljYWwsIGUuZy4sIGEgZGlyIHN0cnVjdHVyZS4KKwkJPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6TWltZVR5cGUiIG5hbWU9Ik1pbWVUeXBlIj4KKwkJPGRlc2NyaXB0aW9uPlRoZSBJRVRGIG1pbWUgdHlwZSBvZiB0aGlzIHByb2R1Y3QuPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKzwvY2FzOmVsZW1lbnRzPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9yZXBvbWdyL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3JlcG9tZ3IvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc0ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy9yZXBvbWdyL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6cHJvZHVjdHR5cGVtYXAgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisgPCEtLSAgY2FuIHNldCB0aGUgInBhcmVudCIgYXR0cmlidXRlIG9uIHR5cGVzIGJlbG93IHRvIGFsbG93IGluaGVyaXRhbmNlCisgICAgICAgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgdHlwZXMgCisgIC0tPgorICAgPHR5cGUgaWQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIj4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFJlY2VpdmVkVGltZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0TmFtZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0SWQiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFR5cGUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFN0cnVjdHVyZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlbmFtZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlTG9jYXRpb24iLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6TWltZVR5cGUiLz4KKyAgPC90eXBlPgorICAKKyAgPHR5cGUgaWQ9InVybjpvb2R0OkdlbmVyaWNGaWxlV2l0aEJsYW5rTWV0IgorICAgICAgICBwYXJlbnQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIi8+CisgIAorICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGVOb1R5cGVNZXRhZGF0YSIKKyAgICAgICAgcGFyZW50PSJ1cm46b29kdDpHZW5lcmljRmlsZSIvPgorPC9jYXM6cHJvZHVjdHR5cGVtYXA+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3JlcG9tZ3IvcHJvZHVjdC10eXBlcy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3JlcG9tZ3IvcHJvZHVjdC10eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhZWU2MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvcmVwb21nci9wcm9kdWN0LXR5cGVzLnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZXMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisgIDx0eXBlIGlkPSJ1cm46b29kdDpHZW5lcmljRmlsZSIgbmFtZT0iR2VuZXJpY0ZpbGUiPgorICAgIDxyZXBvc2l0b3J5IHBhdGg9ImZpbGU6Ly9bSE9NRV0vZmlsZXMiLz4KKyAgICA8dmVyc2lvbmVyIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5CYXNpY1ZlcnNpb25lciIvPgorICAgIDxkZXNjcmlwdGlvbiB0cmltPSJ0cnVlIj4KKyAgICAgVGhlIGRlZmF1bHQgcHJvZHVjdCB0eXBlIGZvciBhbnkga2luZCBvZiBmaWxlLCB3aXRoIHJlYWwgbWV0YWRhdGEuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8bWV0YWRhdGE+CisgICAgICA8a2V5dmFsPgorCSAgICAgIDxrZXk+Q3JlYXRvcjwva2V5PgorCSAgICAgIDx2YWw+Q2hyaXMgTWF0dG1hbm48L3ZhbD4KKwkgICAgICA8dmFsPlBhdWwgUmFtaXJlejwvdmFsPgorCSAgPC9rZXl2YWw+CisJICA8a2V5dmFsPgorCSAgICAgIDxrZXk+Q29udHJpYnV0b3I8L2tleT4KKwkgICAgICA8dmFsPkZpbGUgTWFuYWdlciBDbGllbnQ8L3ZhbD4KKwkgIDwva2V5dmFsPgorICAgIDwvbWV0YWRhdGE+CisgIDwvdHlwZT4KKyAgPHR5cGUgaWQ9InVybjpvb2R0OkdlbmVyaWNGaWxlV2l0aEJsYW5rTWV0IiBuYW1lPSJHZW5lcmljRmlsZVdpdGhCbGFua01ldCI+CisgICAgPHJlcG9zaXRvcnkgcGF0aD0iZmlsZTovL1tIT01FXS9maWxlcyIvPgorICAgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgVGhlIGRlZmF1bHQgcHJvZHVjdCB0eXBlIGZvciBhbnkga2luZCBvZiBmaWxlLCB3aXRoIGJsYW5rIG1ldGFkYXRhLgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPG1ldGFkYXRhLz4KKyAgPC90eXBlPgorICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGVOb1R5cGVNZXRhZGF0YSIgbmFtZT0iR2VuZXJpY0ZpbGVOb1R5cGVNZXRhZGF0YSI+CisgICAgPHJlcG9zaXRvcnkgcGF0aD0iZmlsZTovL1tIT01FXS9maWxlcyIvPgorICAgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgICAgPGRlc2NyaXB0aW9uIHRyaW09ImZhbHNlIj4KKyAgICAgIFRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZSwgd2l0aG91dCBtZXRhZGF0YS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZXM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmxvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA4ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmxvZ2dpbmcucHJvcGVydGllcwpAQCAtMCwwICsxLDU5IEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgdHdvIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSByb290IGxvZ2dlcgorLmxldmVsID0gT0ZGCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IE9GRgorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgY2F0YWxvZyBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmxldmVsID0gSU5GTworCisjIHJlcG9zaXRvcnkgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5sZXZlbCA9IEZJTkUKKworIyBzeXN0ZW0gc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLmxldmVsID0gSU5GTworCisjIHZlcnNpb25pbmcgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmVyc2lvbmluZy5sZXZlbCA9IElORk8KKworIyBkYXRhIHRyYW5zZmVyIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5sZXZlbCA9IEZJTkUKKworIyB1dGlsCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5sZXZlbCA9IElORk8KKworIyB2YWxpZGF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5sZXZlbCA9IElORk8KKworIyB0b29scworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnRvb2xzLmxldmVsID0gU0VWRVJFCisKKyMgY29udHJvbCB0aGUgdW5kZXJseWluZyBjb21tb25zLWh0dHBjbGllbnQgdHJhbnNwb3J0IGxheWVyIGZvciB4bWxycGMgCitvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5oZWFkZXIubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUubGV2ZWwgPSBJTkZPCisKZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC50eHQgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2ZkNzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QudHh0CkBAIC0wLDAgKzEsMTcgQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKwordGhpcyBpcyBhIHRlc3QgdGV4dCBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RjYXQubWFwcGVkLnNxbCBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGNhdC5tYXBwZWQuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzAzODAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RjYXQubWFwcGVkLnNxbApAQCAtMCwwICsxLDI3IEBACitEUk9QIFRBQkxFIGZvb19tZXRhZGF0YSBJRiBFWElTVFM7CitEUk9QIFRBQkxFIGZvb19yZWZlcmVuY2UgSUYgRVhJU1RTOworRFJPUCBUQUJMRSBwcm9kdWN0cyBJRiBFWElTVFM7CisKK0NSRUFURSBUQUJMRSBmb29fbWV0YWRhdGEKKygKKyAgcHJvZHVjdF9pZCBpbnQgTk9UIE5VTEwsCisgIGVsZW1lbnRfaWQgdmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKKyAgbWV0YWRhdGFfdmFsdWUgdmFyY2hhcigyNTAwKSBOT1QgTlVMTAorKTsKKworQ1JFQVRFIFRBQkxFIGZvb19yZWZlcmVuY2UKKygKKyAgcHJvZHVjdF9pZCBpbnQgTk9UIE5VTEwsCisgIHByb2R1Y3Rfb3JpZ19yZWZlcmVuY2UgdmFyY2hhcigyMDAwKSBOT1QgTlVMTCwKKyAgcHJvZHVjdF9kYXRhc3RvcmVfcmVmZXJlbmNlIHZhcmNoYXIoMjAwMCksIAorICBwcm9kdWN0X3JlZmVyZW5jZV9maWxlc2l6ZSBpbnQgTk9UIE5VTEwsCisgIHByb2R1Y3RfcmVmZXJlbmNlX21pbWV0eXBlIHZhcmNoYXIoNTApCispOworCitDUkVBVEUgVEFCTEUgcHJvZHVjdHMgKAorICBwcm9kdWN0X2lkIElOVEVHRVIgR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkgKFNUQVJUIFdJVEggMSwgSU5DUkVNRU5UIEJZIDEpIFBSSU1BUlkgS0VZLAorICBwcm9kdWN0X3N0cnVjdHVyZSB2YXJjaGFyKDIwKSBOT1QgTlVMTCwgCisgIHByb2R1Y3RfdHlwZV9pZCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsIAorICBwcm9kdWN0X25hbWUgdmFyY2hhcigyNTUpIE5PVCBOVUxMLCAKKyAgcHJvZHVjdF90cmFuc2Zlcl9zdGF0dXMgdmFyY2hhcigyNTUpIE5PVCBOVUxMCispOwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0Y2F0Lm9yZGVyZWQuc3FsIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0Y2F0Lm9yZGVyZWQuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTE0MjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RjYXQub3JkZXJlZC5zcWwKQEAgLTAsMCArMSwyOSBAQAorRFJPUCBUQUJMRSBHZW5lcmljRmlsZV9tZXRhZGF0YSBJRiBFWElTVFM7CitEUk9QIFRBQkxFIEdlbmVyaWNGaWxlX3JlZmVyZW5jZSBJRiBFWElTVFM7CitEUk9QIFRBQkxFIHByb2R1Y3RzIElGIEVYSVNUUzsKKworQ1JFQVRFIFRBQkxFIEdlbmVyaWNGaWxlX21ldGFkYXRhCisoCisgIHBrZXkgaW50IEdFTkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZIE5PVCBOVUxMLAorICBwcm9kdWN0X2lkIGludCBOT1QgTlVMTCwKKyAgZWxlbWVudF9pZCB2YXJjaGFyKDEwMDApIE5PVCBOVUxMLAorICBtZXRhZGF0YV92YWx1ZSB2YXJjaGFyKDI1MDApIE5PVCBOVUxMCispOworCitDUkVBVEUgVEFCTEUgR2VuZXJpY0ZpbGVfcmVmZXJlbmNlCisoCisgIHBrZXkgaW50IEdFTkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZIE5PVCBOVUxMLAorICBwcm9kdWN0X2lkIGludCBOT1QgTlVMTCwKKyAgcHJvZHVjdF9vcmlnX3JlZmVyZW5jZSB2YXJjaGFyKDIwMDApIE5PVCBOVUxMLAorICBwcm9kdWN0X2RhdGFzdG9yZV9yZWZlcmVuY2UgdmFyY2hhcigyMDAwKSwgCisgIHByb2R1Y3RfcmVmZXJlbmNlX2ZpbGVzaXplIGludCBOT1QgTlVMTCwKKyAgcHJvZHVjdF9yZWZlcmVuY2VfbWltZXR5cGUgdmFyY2hhcig1MCkKKyk7CisKK0NSRUFURSBUQUJMRSBwcm9kdWN0cyAoCisgIHByb2R1Y3RfaWQgSU5URUdFUiBHRU5FUkFURUQgQlkgREVGQVVMVCBBUyBJREVOVElUWSAoU1RBUlQgV0lUSCAxLCBJTkNSRU1FTlQgQlkgMSkgUFJJTUFSWSBLRVksCisgIHByb2R1Y3Rfc3RydWN0dXJlIHZhcmNoYXIoMjApIE5PVCBOVUxMLCAKKyAgcHJvZHVjdF90eXBlX2lkIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwgCisgIHByb2R1Y3RfbmFtZSB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsIAorICBwcm9kdWN0X3RyYW5zZmVyX3N0YXR1cyB2YXJjaGFyKDI1NSkgTk9UIE5VTEwKKyk7CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RjYXQuc3FsIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0Y2F0LnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdkNGRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0Y2F0LnNxbApAQCAtMCwwICsxLDI3IEBACitEUk9QIFRBQkxFIEdlbmVyaWNGaWxlX21ldGFkYXRhIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgR2VuZXJpY0ZpbGVfcmVmZXJlbmNlIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgcHJvZHVjdHMgSUYgRVhJU1RTOworCitDUkVBVEUgVEFCTEUgR2VuZXJpY0ZpbGVfbWV0YWRhdGEKKygKKyAgcHJvZHVjdF9pZCBpbnQgTk9UIE5VTEwsCisgIGVsZW1lbnRfaWQgdmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKKyAgbWV0YWRhdGFfdmFsdWUgdmFyY2hhcigyNTAwKSBOT1QgTlVMTAorKTsKKworQ1JFQVRFIFRBQkxFIEdlbmVyaWNGaWxlX3JlZmVyZW5jZQorKAorICBwcm9kdWN0X2lkIGludCBOT1QgTlVMTCwKKyAgcHJvZHVjdF9vcmlnX3JlZmVyZW5jZSB2YXJjaGFyKDIwMDApIE5PVCBOVUxMLAorICBwcm9kdWN0X2RhdGFzdG9yZV9yZWZlcmVuY2UgdmFyY2hhcigyMDAwKSwgCisgIHByb2R1Y3RfcmVmZXJlbmNlX2ZpbGVzaXplIGludCBOT1QgTlVMTCwKKyAgcHJvZHVjdF9yZWZlcmVuY2VfbWltZXR5cGUgdmFyY2hhcig1MCkKKyk7CisKK0NSRUFURSBUQUJMRSBwcm9kdWN0cyAoCisgIHByb2R1Y3RfaWQgSU5URUdFUiBHRU5FUkFURUQgQlkgREVGQVVMVCBBUyBJREVOVElUWSAoU1RBUlQgV0lUSCAxLCBJTkNSRU1FTlQgQlkgMSkgUFJJTUFSWSBLRVksCisgIHByb2R1Y3Rfc3RydWN0dXJlIHZhcmNoYXIoMjApIE5PVCBOVUxMLCAKKyAgcHJvZHVjdF90eXBlX2lkIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwgCisgIHByb2R1Y3RfbmFtZSB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsIAorICBwcm9kdWN0X3RyYW5zZmVyX3N0YXR1cyB2YXJjaGFyKDI1NSkgTk9UIE5VTEwKKyk7CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RjYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGNhdGFsb2cudHlwZW1hcC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzI0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RjYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyBUZXN0IFByb2R1Y3QgVHlwZSB0byBUYWJsZSBNYXBwaW5ncworIyAoZm9yIHByb2R1Y3QgdHlwZXMgd2l0aCBMT05HIG5hbWVzLCBhbGxvd3MgdXMgdG8gZ2V0CisjIGFyb3VuZCBPcmFjbGUncyBzYWQgMzEgY2hhciB0YWJsZSBuYW1lIGxpbWl0KQorCisjIE5vdGUsIHRoZSBrZXkgb24gdGhlIGxlZnQgaXMgdGhlIGFjdHVhbCByZXR1cm4gb2Yge0BsaW5rIFByb2R1Y3RUeXBlI2dldE5hbWUoKX0KKyMgYW5kIHRoZSB2YWx1ZSBvbiB0aGUgcmlnaHQgaXMgdGhlIG1hcHBlZCB0YWJsZSBuYW1lCisKK0dlbmVyaWNGaWxlPWZvbwpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy92YWxsYXllci9lbGVtZW50cy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGxheWVyL2VsZW1lbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU5MzVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy92YWxsYXllci9lbGVtZW50cy54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6ZWxlbWVudHMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIgbmFtZT0iQ0FTLlByb2R1Y3RJZCI+CisJCTxkY0VsZW1lbnQ+SWRlbnRpZmllcjwvZGNFbGVtZW50PgorCQk8ZGVzY3JpcHRpb24+QSBQcm9kdWN0J3MgdW5pcXVlIGlkZW50aWZpZXIgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLjwvZGVzY3JpcHRpb24+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0TmFtZSIgbmFtZT0iQ0FTLlByb2R1Y3ROYW1lIj4KKwkJPGRjRWxlbWVudD5UaXRsZTwvZGNFbGVtZW50PgorCQk8ZGVzY3JpcHRpb24gdHJpbT0iZmFsc2UiPgorICAgICAgICAgIEEgUHJvZHVjdCdzIG5hbWUgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFJlY2VpdmVkVGltZSIKKwkJbmFtZT0iQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiPgorCQk8ZGNFbGVtZW50IC8+CisJCTxkZXNjcmlwdGlvbiB0cmltPSJ0cnVlIj4KKwkJCVRoZSBJU08gODYwMSBmb3JtYXR0ZWQgdGltZSB0aGF0IHRoZSBQcm9kdWN0IHdhcyByZWNlaXZlZC4KKwkJPC9kZXNjcmlwdGlvbj4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIiBuYW1lPSJGaWxlbmFtZSI+CisJCTxkZXNjcmlwdGlvbj4KKwkJCVRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorPC9jYXM6ZWxlbWVudHM+CmRpZmYgLS1naXQgYS8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGxheWVyL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGxheWVyL3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3MzAyNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsbGF5ZXIvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpwcm9kdWN0dHlwZW1hcCB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8IS0tICBjYW4gc2V0IHRoZSAicGFyZW50IiBhdHRyaWJ1dGUgb24gdHlwZXMgYmVsb3cgdG8gYWxsb3cgaW5oZXJpdGFuY2UKKyAgICAgICBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcyAKKyAgLS0+CisgICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlbmFtZSIvPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsbGF5ZXIvcHJvZHVjdC10eXBlcy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGxheWVyL3Byb2R1Y3QtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzYwYzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGxheWVyL3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgPHR5cGUgaWQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIiBuYW1lPSJHZW5lcmljRmlsZSI+CisgICAgPHJlcG9zaXRvcnkgcGF0aD0iZmlsZTovL1tIT01FXS9maWxlcyIvPgorICAgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgIDxtZXRFeHRyYWN0b3JzPgorICAgICAgPGV4dHJhY3RvcgorICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0gIHlvdSBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIHRoZSBlbnZSZXBsYWNlIHRhZyB0byB0dXJuIG9uL29mZiBlbnZpcm9ubWVudCB2YXIgcmVwbGFjZW1lbnQgLS0+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5zQXdhcmUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50TnMiIHZhbHVlPSJDQVMiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnRzIgorICAgICAgICAgICAgdmFsdWU9IlByb2R1Y3RSZWNlaXZlZFRpbWUsUHJvZHVjdE5hbWUsUHJvZHVjdElkIiAvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L2V4dHJhY3Rvcj4KKyAgICAgIDxleHRyYWN0b3IKKyAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLmV4YW1wbGVzLk1pbWVUeXBlRXh0cmFjdG9yIiAvPgorICAgIDwvbWV0RXh0cmFjdG9ycz4KKyAgPC90eXBlPgorPC9jYXM6cHJvZHVjdHR5cGVzPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy94bWxycGMtc3RydWN0LWZhY3RvcnkvZWxlbWVudHMueG1sIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy94bWxycGMtc3RydWN0LWZhY3RvcnkvZWxlbWVudHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzYwYTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3htbHJwYy1zdHJ1Y3QtZmFjdG9yeS9lbGVtZW50cy54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6ZWxlbWVudHMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIgbmFtZT0iQ0FTLlByb2R1Y3RJZCI+CisJCTxkY0VsZW1lbnQ+SWRlbnRpZmllcjwvZGNFbGVtZW50PgorICAgICAgICA8IS0tICAKKyAgICAgICAgIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgJ3RyaW0nIHRhZyB0byBpZGVudGlmeSB3aGV0aGVyCisgICAgICAgICBvciBub3QgeW91IHdhbnQgbmV3bGluZXMgdHJpbW1lZCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLiBUbworICAgICAgICAgdHVybiBvZmYgdHJpbW1pbmcgKG5vdyBkb25lIGJ5IGRlZmF1bHQpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgd2l0aCB5b3VyCisgICAgICAgICBkZXNjcmlwdGlvbiBkZWZpbml0aW9uOiB0cmltPSJmYWxzZSIgICAgICAgCisgICAgICAgICAtLT4KKwkJPGRlc2NyaXB0aW9uPgorCQkJQSBQcm9kdWN0J3MgdW5pcXVlIGlkZW50aWZpZXIgd2l0aGluIHRoZSBDQVMgbmFtZXNwYWNlLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdE5hbWUiIG5hbWU9IkNBUy5Qcm9kdWN0TmFtZSI+CisJCTxkY0VsZW1lbnQ+VGl0bGU8L2RjRWxlbWVudD4KKwkJPGRlc2NyaXB0aW9uPgorCQkJQSBQcm9kdWN0J3MgbmFtZSB3aXRoaW4gdGhlIENBUyBuYW1lc3BhY2UuCisJCTwvZGVzY3JpcHRpb24+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIgorCQluYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSI+CisJCTxkY0VsZW1lbnQgLz4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIElTTyA4NjAxIGZvcm1hdHRlZCB0aW1lIHRoYXQgdGhlIFByb2R1Y3Qgd2FzIHJlY2VpdmVkLgorCQk8L2Rlc2NyaXB0aW9uPgorCTwvZWxlbWVudD4KKwk8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RmlsZW5hbWUiIG5hbWU9IkZpbGVuYW1lIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHJlcHJlc2VudCB0aGlzIHByb2R1Y3QuCisJCTwvZGVzY3JpcHRpb24+CisJCTxkY0VsZW1lbnQgLz4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVMb2NhdGlvbiIgbmFtZT0iRmlsZUxvY2F0aW9uIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJVGhlIGxvY2F0aW9ucyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIgbmFtZT0iUHJvZHVjdFR5cGUiPgorCQk8ZGVzY3JpcHRpb24+CisJCQlUeXBlIG9mIHByb2R1Y3QsIGFzIHNwZWNpZmllZCBieSwgZS5nLiwgYSBkYXRhIGJpYmxlLgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0U3RydWN0dXJlIiBuYW1lPSJQcm9kdWN0U3RydWN0dXJlIj4KKwkJPGRlc2NyaXB0aW9uPgorCQkJV2hldGhlciBvciBub3QgYSBwcm9kdWN0IGlzIEZsYXQgKGUuZy4sIGEgc2V0IG9mIGluZGVwZW5kZW50CisJCQlmaWxlcyksIG9yIGhpZXJhcmNoaWNhbCwgZS5nLiwgYSBkaXIgc3RydWN0dXJlLgorCQk8L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46b29kdDpNaW1lVHlwZSIgbmFtZT0iTWltZVR5cGUiPgorCQk8ZGVzY3JpcHRpb24+VGhlIElFVEYgbWltZSB0eXBlIG9mIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorCQk8ZGNFbGVtZW50IC8+CisJPC9lbGVtZW50PgorCTxlbGVtZW50IGlkPSJ1cm46dGVzdDpEYXRhVmVyc2lvbiIgbmFtZT0iRGF0YVZlcnNpb24iPgorCQk8ZGVzY3JpcHRpb24+VGhlIHZlcnNpb24gb2YgdGhlIGRhdGEgZmlsZTwvZGVzY3JpcHRpb24+CisJCTxkY0VsZW1lbnQgLz4KKwk8L2VsZW1lbnQ+CisJPGVsZW1lbnQgaWQ9InVybjp0ZXN0Ok5vbWluYWxEYXRlIiBuYW1lPSJOb21pbmFsRGF0ZSI+CisJCTxkZXNjcmlwdGlvbj5UaGUgdmVyc2lvbiBvZiB0aGUgZGF0YSBmaWxlPC9kZXNjcmlwdGlvbj4KKwkJPGRjRWxlbWVudCAvPgorCTwvZWxlbWVudD4KKzwvY2FzOmVsZW1lbnRzPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy94bWxycGMtc3RydWN0LWZhY3RvcnkvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMveG1scnBjLXN0cnVjdC1mYWN0b3J5L3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0MGY3ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZmlsZW1nci9zcmMvdGVzdC9yZXNvdXJjZXMveG1scnBjLXN0cnVjdC1mYWN0b3J5L3Byb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6cHJvZHVjdHR5cGVtYXAgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisgPCEtLSAgY2FuIHNldCB0aGUgInBhcmVudCIgYXR0cmlidXRlIG9uIHR5cGVzIGJlbG93IHRvIGFsbG93IGluaGVyaXRhbmNlCisgICAgICAgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgdHlwZXMgCisgIC0tPgorICAgPHR5cGUgaWQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIj4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFJlY2VpdmVkVGltZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0TmFtZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0SWQiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFR5cGUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFN0cnVjdHVyZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlbmFtZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpGaWxlTG9jYXRpb24iLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOm9vZHQ6TWltZVR5cGUiLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOnRlc3Q6RGF0YVZlcnNpb24iLz4KKyAgICAgICA8ZWxlbWVudCBpZD0idXJuOnRlc3Q6Tm9taW5hbERhdGUiLz4gICAgCisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlbWFwPgpkaWZmIC0tZ2l0IGEvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy94bWxycGMtc3RydWN0LWZhY3RvcnkvcHJvZHVjdC10eXBlcy54bWwgYi8wLjEwL2ZpbGVtZ3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3htbHJwYy1zdHJ1Y3QtZmFjdG9yeS9wcm9kdWN0LXR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU4YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9maWxlbWdyL3NyYy90ZXN0L3Jlc291cmNlcy94bWxycGMtc3RydWN0LWZhY3RvcnkvcHJvZHVjdC10eXBlcy54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6cHJvZHVjdHR5cGVzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiIG5hbWU9IkdlbmVyaWNGaWxlIj4KKyAgICA8cmVwb3NpdG9yeSBwYXRoPSJmaWxlOi8vW0hPTUVdL2ZpbGVzIi8+CisgICAgPHZlcnNpb25lciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcuQmFzaWNWZXJzaW9uZXIiLz4KKyAgICA8IS0tICAKKyAgICAgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAndHJpbScgdGFnIHRvIGlkZW50aWZ5IHdoZXRoZXIKKyAgICAgb3Igbm90IHlvdSB3YW50IG5ld2xpbmVzIHRyaW1tZWQgZnJvbSB0aGUgcHJvZHVjdCB0eXBlIGRlc2NyaXB0aW9uLiBUbworICAgICB0dXJuIG9mZiB0cmltbWluZyAobm93IGRvbmUgYnkgZGVmYXVsdCksIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgd2l0aCB5b3VyCisgICAgIGRlc2NyaXB0aW9uIGRlZmluaXRpb246IHRyaW09ImZhbHNlIiAgICAgICAKKyAgICAgLS0+CisgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgIAorICAgIDwhLS0gCisgICAgICBUaGUgbWV0RXh0cmFjdG9ycyBlbGVtZW50IGlzIG9wdGlvbmFsIGJ1dCBpbmNsdWRlZCBpbiBPT0RUIFVuaXQgdGVzdGluZyBmb3IgY2FwYWJpbGl0eS4KKyAgICAgIGV4dHJhY3RvciBwcm9wZXJ0eSBlbGVtZW50cyBhcmUgZXh0cmFjdG9yIHNwZWNpZmljIGFuZCBsb2NhdGVkIGluIAorICAgICAgQWJzdHJhY3RGaWxlbWdyTWV0RXh0cmFjdG9yI2RvQ29uZmlndXJlIG1ldGhvZC4KKyAgICAtLT4KKyAgICA8bWV0RXh0cmFjdG9ycz4KKyAgICAgIDxleHRyYWN0b3IKKyAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5leHRyYWN0b3JzLkNvcmVNZXRFeHRyYWN0b3IiPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tICB5b3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUgZW52UmVwbGFjZSB0YWcgdG8gdHVybiBvbi9vZmYgZW52aXJvbm1lbnQgdmFyIHJlcGxhY2VtZW50IC0tPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuc0F3YXJlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxlbWVudE5zIiB2YWx1ZT0iQ0FTIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGVtZW50cyIKKyAgICAgICAgICAgIHZhbHVlPSJQcm9kdWN0UmVjZWl2ZWRUaW1lLFByb2R1Y3ROYW1lLFByb2R1Y3RJZCIgLz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9leHRyYWN0b3I+CisgICAgPC9tZXRFeHRyYWN0b3JzPgorICAgIAorICAgIDwhLS0gCisgICAgICBUaGUgbWV0YWRhdGEgZWxlbWVudCBpcyBvcHRpb25hbCBidXQgaW5jbHVkZWQgaW4gT09EVCBVbml0IHRlc3RpbmcgZm9yIHRlc3RpbmcgY2FwYWJpbGl0eS4KKyAgICAgIFRPRE8KKyAgICAtLT4KKyAgICA8bWV0YWRhdGE+CisgICAgPC9tZXRhZGF0YT4KKyAgICA8dHlwZUhhbmRsZXJzPgorICAgICAgPHR5cGVIYW5kbGVyIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy50eXBlLmV4YW1wbGVzLk1ham9yTWlub3JWZXJzaW9uVHlwZUhhbmRsZXIiIGVsZW1lbnROYW1lPSJEYXRhVmVyc2lvbiIvPgorICAgIDwvdHlwZUhhbmRsZXJzPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZXM+CmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvcG9tLnhtbCBiLzAuMTAvZ3JpZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZWQ3YjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvcG9tLnhtbApAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGFydGlmYWN0SWQ+d2ViLWdyaWQ8L2FydGlmYWN0SWQ+CisgIDxuYW1lPk9PRFQgV2ViIEdyaWQ8L25hbWU+CisgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgIDxkZXNjcmlwdGlvbj5UaGUgT09EVCBncmlkIHNlcnZpY2VzIChwcm9kdWN0IGFuZCBwcm9maWxlIHNlcnZpY2VzKSB1c2UgQ09SQkEgb3IKKyAgICBSTUkgYXMgdGhlaXIgdW5kZXJseWluZyBuZXR3b3JrIHRyYW5zcG9ydC4gIEhvd2V2ZXIsIGxpbWl0YXRpb25zCisgICAgb2YgQ09SQkEgYW5kIFJNSSBtYWtlIHRoZW0gaW5hcHByb3ByaWF0ZSBmb3IgbGFyZ2Utc2NhbGUKKyAgICBkZXBsb3ltZW50cy4gIEZvciBvbmUsIGJvdGggYXJlIHByb2NlZHVyYWwgbWVjaGFuaXNtcywgcHJvdmlkaW5nIGEKKyAgICByZW1vdGUgaW50ZXJmYWNlIHRoYXQgcmVzZW1ibGVzIGEgbWV0aG9kIGNhbGwuICBUaGlzIG1ha2VzCisgICAgc3RyZWFtaW5nIG9mIGRhdGEgZnJvbSBhIHNlcnZpY2UgaW1wb3NzaWJsZSwgYmVjYXVzZSB0aGVyZSBhcmUKKyAgICBsaW1pdGF0aW9ucyB0byB0aGUgc2l6ZXMgb2YgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgY2FuIGJlIHBhc3NlZAorICAgIG92ZXIgYSByZW1vdGUgbWV0aG9kIGNhbGwuICBJbnN0ZWFkLCByZXBlYXRlZCBjYWxscyBtdXN0IGJlIG1hZGUKKyAgICB0byByZXRyaWV2ZSBlYWNoIGJsb2NrIG9mIGEgcHJvZHVjdCwgbWFraW5nIHRyYW5zZmVyIHNwZWVkcworICAgIGhvcnJpYmx5IHNsb3cgY29tcGFyZWQgdG8gSFRUUCBvciBGVFAuICAoQmxvY2stYmFzZWQgcmV0cmlldmFsIG9mCisgICAgcHJvZmlsZXMgd2FzIG5ldmVyIGltcGxlbWVudGVkLCByZXN1bHRpbmcgaW4gb3V0IG9mIG1lbW9yeQorICAgIGNvbmRpdGlvbnMgZm9yIGxhcmdlIHByb2ZpbGUgcmVzdWx0cywgd2hpY2ggaXMgYW5vdGhlciBwcm9ibGVtLikKKyAgICBTZWNvbmQsIGJvdGggQ09SQkEgYW5kIFJNSSByZWx5IG9uIGEgY2VudHJhbCBuYW1lIHJlZ2lzdHJ5LiAgVGhlCisgICAgcmVnaXN0cnkgbWFrZXMgYW4gb2JqZWN0IGluZGVwZW5kZW50IG9mIGl0cyBuZXR3b3JrIGxvY2F0aW9uLAorICAgIGVuYWJsaW5nIGEgY2xpZW50IHRvIGNhbGwgaXQgYnkgbmFtZSAobG9va2luZyB1cCBpdHMgbGFzdCBrbm93bgorICAgIGxvY2F0aW9uIGluIHRoZSByZWdpc3RyeSkuICBIb3dldmVyLCB0aGlzIHJlcXVpcmVzIHRoYXQgc2VydmVyCisgICAgb2JqZWN0cyBiZSBhYmxlIHRvIG1ha2Ugb3V0Ym91bmQgbmV0d29yayBjYWxscyB0byB0aGUgcmVnaXN0cnkKKyAgICAodGhyb3VnaCBhbnkgb3V0Ym91bmQgZmlyZXdhbGwpLCBhbmQgdGhhdCB0aGUgcmVnaXN0cnkgYWNjZXB0CisgICAgdGhvc2UgcmVnaXN0cmF0aW9ucyAodGhyb3VnaCBhbnkgaW5ib3VuZCBmaXJld2FsbCkuICBUaGlzIHJlcXVpcmVkCisgICAgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIGF0IGluc3RpdHV0aW9ucyBob3N0aW5nIHNlcnZlciBvYmplY3RzIGFuZAorICAgIGF0IHRoZSBpbnN0aXR1dGlvbiBob3N0aW5nIHRoZSByZWdpc3RyeS4gIE9mdGVuLCB0aGVzZSBmaXJld2FsbAorICAgIGV4Y2VwdGlvbnMgd291bGQgY2hhbmdlIHdpdGhvdXQgbm90aWNlIGFzIHN5c3RlbSBhZG1pbnN0cmF0b3JzCisgICAgY2hhbmdlZCBhdCBlYWNoIGxvY2F0aW9uIChhcHBhcmVudGx5IGZpcmV3YWxsIGV4Y2VwdGlvbnMgYXJlCisgICAgcG9vcmx5IGRvY3VtZW50ZWQgZXZlcnl3aGVyZSkuICBGdXJ0aGVyLCBpbiB0aGUgdHdvIG1ham9yCisgICAgZGVwbG95bWVudHMgb2YgT09EVCAoUERTIGFuZCBFRFJOKSwgc2VydmVyIG9iamVjdHMgaGF2ZSBhbG1vc3QKKyAgICBuZXZlciBtb3ZlZCwgbnVsbGlmeWluZyBhbnkgYmVuZWZpdCBvZiB0aGUgcmVnaXN0cnkuICBUaGlzCisgICAgcHJvamVjdCwgT09EVCBXZWIgR3JpZCBTZXJ2aWNlcywgYXZvaWRzIHRoZSBwcm9sZW1zIG9mIENPUkJBIGFuZAorICAgIFJNSSBieSB1c2luZyBIVFRQIGFzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIGZvciBwcm9kdWN0cyBhbmQKKyAgICBwcm9maWxlcy4gIEZ1cnRoZXIsIGl0IHByb3ZpZGVzIGEgcGFzc3dvcmQtcHJvdGVjdGVkIG1lY2hhbmlzbSB0bworICAgIGFkZCBuZXcgc2V0cyBvZiBwcm9kdWN0IGFuZCBwcm9maWxlIHF1ZXJ5IGhhbmRsZXJzLCBlbmFibGluZworICAgIHNlYW1sZXNzIGFjdGl2YXRpb24gb2YgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMuPC9kZXNjcmlwdGlvbj4KKyAgPHNjbT4KKyAgIAk8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjEwLXJjMi9ncmlkPC9jb25uZWN0aW9uPgorICAgCTxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL2dyaWQ8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAJPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjEwLXJjMi9ncmlkPC91cmw+CisgIDwvc2NtPgorICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8d2ViUmVzb3VyY2VzIC8+CisgICAgICAgICAgPHdhclNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHA8L3dhclNvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9vZHQtcHJvZmlsZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b29kdC1wcm9kdWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LXhtbHF1ZXJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uaHAuaHBsLmplbmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZW5hPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi42LjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjkuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPnhhbGFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD54YWxhbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi43LjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL0F1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24uamF2YSBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL0F1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzE1MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZ3JpZDsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHRvIGluZGljYXRlIHRoYXQgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQgdG8gY29udGludWUuCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvblJlcXVpcmVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbjwvY29kZT4gaW5zdGFuY2UuCisgICAqLworICBwdWJsaWMgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQ29uZmlnQmVhbi5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQ29uZmlnQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhN2FmZDYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Db25maWdCZWFuLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZ3JpZDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIEJlYW4gY29udGFpbmluZyBsb2dpbiBzdGF0dXMgZm9yIGFuZCBjb25maWd1cmF0aW9uIGluZm8uCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWdCZWFuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgLyoqCisgICAqIFJldHVybiB0cnVlIGlzIGFkbWluaXN0cmF0b3IgaXMgYXV0aGVudGljYXRlZC4KKyAgICogCisgICAqIEByZXR1cm4gVHJ1ZSBpZiBhdXRoZW50aWMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQXV0aGVudGljKCkgeworICAgIHJldHVybiBhdXRoZW50aWM7CisgIH0KKworICAvKioKKyAgICogU2V0IHdoZXRoZXIgdGhlIGFkbWluaXN0cmF0b3IncyBiZWVuIGF1dGhlbnRpY2F0ZWQuCisgICAqIAorICAgKiBAcGFyYW0gYXV0aGVudGljCisgICAqICAgICAgICAgIFRydWUgaWYgYXV0aGVudGljLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB2b2lkIHNldEF1dGhlbnRpYyhib29sZWFuIGF1dGhlbnRpYykgeworICAgIHRoaXMuYXV0aGVudGljID0gYXV0aGVudGljOworICB9CisKKyAgLyoqCisgICAqIEdldCBhbnkgbWVzc2FnZSB0byBkaXNwbGF5LiBUaGlzIHNob3VsZCBuZXZlciBiZSBudWxsLgorICAgKiAKKyAgICogQHJldHVybiBBIG1lc3NhZ2UgdG8gZGlzcGxheQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWVzc2FnZSB0byBkaXNwbGF5LgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgTWVzc2FnZSB0byBkaXNwbGF5LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXNzYWdlIGNhbm5vdCBiZSBudWxsIik7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygd2ViLWdyaWQuCisgICAqIAorICAgKiBAcmV0dXJuIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gdmFsdWUuCisgICAqIEB0aHJvd3MgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgdGhlIGFkbWluaXN0cmF0b3IncyBub3QgYXV0aGVudGljYXRlZC4KKyAgICovCisgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKQorICAgICAgdGhyb3dzIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24geworICAgIGNoZWNrQXV0aGVudGljaXR5KCk7CisgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgIH0KKworICAvKioKKyAgICogVGVsbCBpZiBIVFRQUyBpcyByZXF1aXJlZCB0byBhY2Nlc3MgdGhlIHdlYi1ncmlkIGNvbmZpZ3VyYXRpb24uCisgICAqIAorICAgKiBAcmV0dXJuIFRydWUgaWYgSFRUUFMgaXMgcmVxdWlyZWQgdG8gYWNjZXNzIHRoZSB3ZWItZ3JpZCBjb25maWd1cmF0aW9uLgorICAgKiBAdGhyb3dzIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIHRoZSBhZG1pbmlzdHJhdG9yJ3Mgbm90IGF1dGhlbnRpY2F0ZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0h0dHBzUmVxdWlyZWQoKSB0aHJvd3MgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbiB7CisgICAgY2hlY2tBdXRoZW50aWNpdHkoKTsKKyAgICByZXR1cm4gY29uZmlndXJhdGlvbi5pc0hUVFBTcmVxdWlyZWQoKTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxsIGlmIGFkbWluIGFjY2VzcyBjYW4gY29tZSBvbmx5IGZyb20gdGhlIGxvY2FsaG9zdC4KKyAgICogCisgICAqIEByZXR1cm4gVHJ1ZSBpZiBhZG1pbiBhY2Nlc3MgY2FuIGNvbWUgb25seSBmcm9tIHRoZSBsb2NhbGhvc3QuCisgICAqIEB0aHJvd3MgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgdGhlIGFkbWluaXN0cmF0b3IncyBub3QgYXV0aGVudGljYXRlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzTG9jYWxob3N0UmVxdWlyZWQoKSB0aHJvd3MgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbiB7CisgICAgY2hlY2tBdXRoZW50aWNpdHkoKTsKKyAgICByZXR1cm4gY29uZmlndXJhdGlvbi5pc0xvY2FsaG9zdFJlcXVpcmVkKCk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBsaXN0IG9mIHtAbGluayBQcm9kdWN0U2VydmVyfXMgdGhhdCBoYXZlIGJlZW4gaW5zdGFsbGVkIGluIHRoaXMKKyAgICogY29udGFpbmVyLgorICAgKiAKKyAgICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBQcm9kdWN0U2VydmVyfXMuCisgICAqIEB0aHJvd3MgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgdGhlIGFkbWluaXN0cmF0b3IncyBub3QgYXV0aGVudGljYXRlZC4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFByb2R1Y3RTZXJ2ZXJzKCkgdGhyb3dzIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24geworICAgIGNoZWNrQXV0aGVudGljaXR5KCk7CisgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0UHJvZHVjdFNlcnZlcnMoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGxpc3Qgb2Yge0BsaW5rIFByb2ZpbGVTZXJ2ZXJ9cyB0aGF0IGhhdmUgYmVlbiBpbnN0YWxsZWQgaW4gdGhpcworICAgKiBjb250YWluZXIuCisgICAqIAorICAgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIFByb2ZpbGVTZXJ2ZXJ9cy4KKyAgICogQHRocm93cyBBdXRoZW50aWNhdGlvblJlcXVpcmVkRXhjZXB0aW9uCisgICAqICAgICAgICAgICBpZiB0aGUgYWRtaW5pc3RyYXRvcidzIG5vdCBhdXRoZW50aWNhdGVkLgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0UHJvZmlsZVNlcnZlcnMoKSB0aHJvd3MgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbiB7CisgICAgY2hlY2tBdXRoZW50aWNpdHkoKTsKKyAgICByZXR1cm4gY29uZmlndXJhdGlvbi5nZXRQcm9maWxlU2VydmVycygpOworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgY29uZmlndXJhdGlvbiB0aGlzIGJlYW4gd2lsbCB1c2UuCisgICAqIAorICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgorICAgKiAgICAgICAgICBhIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IHZhbHVlLgorICAgKi8KKyAgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoaXMgY29udGFpbmVyLgorICAgKiAKKyAgICogQHJldHVybiBhIDxjb2RlPlByb3BlcnRpZXM8L2NvZGU+IHZhbHVlLgorICAgKiBAdGhyb3dzIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIHRoZSBhZG1pbmlzdHJhdG9yJ3Mgbm90IGF1dGhlbnRpY2F0ZWQuCisgICAqLworICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgdGhyb3dzIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24geworICAgIGNoZWNrQXV0aGVudGljaXR5KCk7CisgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGlzIGF1dGhlbnRpYy4gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGlmIHRoZQorICAgKiBhZG1pbmlzdHJhdG9yIGlzIGF1dGhlbnRpYywgYnV0IHRocm93cyBhbiBleGNlcHRpb24gaWYgbm90LgorICAgKiAKKyAgICogQHRocm93cyBBdXRoZW50aWNhdGlvblJlcXVpcmVkRXhjZXB0aW9uCisgICAqICAgICAgICAgICBpZiB0aGUgYWRtaW5pc3RyYXRvcidzIG5vdCBhdXRoZW50aWNhdGVkLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQXV0aGVudGljaXR5KCkgdGhyb3dzIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24geworICAgIGlmIChpc0F1dGhlbnRpYygpICYmIGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKKyAgICAgIHJldHVybjsKKyAgICBtZXNzYWdlID0gIiI7CisgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24oKTsKKyAgfQorCisgIC8qKiBUcnVlIGlmIGFkbWluaXN0cmF0b3IgaXMgYXV0aGVudGljLiAqLworICBwcml2YXRlIGJvb2xlYW4gYXV0aGVudGljOworCisgIC8qKiBBbnkgbWVzc2FnZSB0byBkaXNwbGF5LiAqLworICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gIiI7CisKKyAgLyoqIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGNvbnRhaW5lci4gKi8KKyAgcHJpdmF0ZSB0cmFuc2llbnQgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQ29uZmlnU2VydmxldC5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQ29uZmlnU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5YTc0NGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Db25maWdTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzMDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZ3JpZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBDb250cm9sbGVyIHNlcnZsZXQgZm9yIG1ha2luZyBjaGFuZ2VzIHRvIGNvbmZpZ3VyYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWdTZXJ2bGV0IGV4dGVuZHMgR3JpZFNlcnZsZXQgeworICAvKioKKyAgICogSGFuZGxlIHVwZGF0ZXMgdG8gYSBjb25maWd1cmF0aW9uIGJ5IHNhdmluZyB0aGVtIGFuZCBkaXJlY3RpbmcgYmFjayB0byB0aGUKKyAgICogY29uZmlnIHBhZ2UuCisgICAqIAorICAgKiBAcGFyYW0gcmVxCisgICAqICAgICAgICAgIGEgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiB2YWx1ZS4KKyAgICogQHBhcmFtIHJlcworICAgKiAgICAgICAgICBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IHZhbHVlLgorICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24oKTsgLy8gR2V0IHRoZSBzaW5nbGV0b24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbgorICAgIGlmICghYXBwcm92ZUFjY2Vzcyhjb25maWcsIHJlcSwgcmVzKSkKKyAgICAgIHJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgY2FuIGFjY2VzcyB0aGlzIHBhZ2UKKworICAgIENvbmZpZ0JlYW4gY2IgPSBnZXRDb25maWdCZWFuKHJlcSk7IC8vIEdldCB0aGUgYmVhbgorICAgIGNiLnNldE1lc3NhZ2UoIiIpOyAvLyBDbGVhciBvdXQgYW55IG1lc3NhZ2UKKyAgICBpZiAoIWNiLmlzQXV0aGVudGljKCkpCisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihuZXcgQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbigpKTsKKyAgICBib29sZWFuIG5lZWRTYXZlID0gZmFsc2U7IC8vIEFzc3VtZSBubyBjaGFuZ2VzIGZvciBub3cKKworICAgIFN0cmluZyBuZXdQYXNzID0gcmVxLmdldFBhcmFtZXRlcigicGFzc3dvcmQiKTsgLy8gU2VlIGlmIHNoZSB3YW50cyB0byBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3N3b3JkCisgICAgaWYgKG5ld1Bhc3MgIT0gbnVsbCAmJiBuZXdQYXNzLmxlbmd0aCgpID4gMCkgeyAvLyBHb3QgYSBwYXNzd29yZCwgYW5kIGl0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBlbXB0eT8KKyAgICAgIGNvbmZpZy5zZXRQYXNzd29yZChuZXdQYXNzLmdldEJ5dGVzKCkpOyAvLyBZZXMsIHNldCBpdHMgYnl0ZXMKKyAgICAgIG5lZWRTYXZlID0gdHJ1ZTsgLy8gV2UgbmVlZCB0byBzYXZlCisgICAgfQorCisgICAgYm9vbGVhbiBodHRwcyA9IGNvbmZpZy5pc0hUVFBTcmVxdWlyZWQoKTsgLy8gQXJlIHdlIGN1cnJlbnRseSB1c2luZyBodHRwcz8KKyAgICBTdHJpbmcgaHR0cHNQYXJhbSA9IHJlcS5nZXRQYXJhbWV0ZXIoImh0dHBzIik7IC8vIEdldCBoZXIgaHR0cHMgcGFyYW0KKyAgICBib29sZWFuIG5ld0h0dHBzID0gaHR0cHNQYXJhbSAhPSBudWxsICYmICJvbiIuZXF1YWxzKGh0dHBzUGFyYW0pOyAvLyBTZWUgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90CisgICAgaWYgKGh0dHBzICE9IG5ld0h0dHBzKSB7IC8vIERpZmZlcmVudD8KKyAgICAgIGNvbmZpZy5zZXRIVFRQU3JlcXVpcmVkKG5ld0h0dHBzKTsgLy8gWWVzLCBzZXQgdGhlIG5ldyBzdGF0ZQorICAgICAgbmVlZFNhdmUgPSB0cnVlOyAvLyBXZSBuZWVkIHRvIHNhdmUKKyAgICB9CisKKyAgICBib29sZWFuIGxvY2FsID0gY29uZmlnLmlzTG9jYWxob3N0UmVxdWlyZWQoKTsgLy8gQXJlIHdlIHJlcXVpcmluZyBsb2NhbGhvc3Q/CisgICAgU3RyaW5nIGxvY2FsaG9zdFBhcmFtID0gcmVxLmdldFBhcmFtZXRlcigibG9jYWxob3N0Iik7IC8vIEdldCBoZXIgbG9jYWxob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtCisgICAgYm9vbGVhbiBuZXdMb2NhbCA9IGxvY2FsaG9zdFBhcmFtICE9IG51bGwgJiYgIm9uIi5lcXVhbHMobG9jYWxob3N0UGFyYW0pOyAvLyBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxob3N0CisgICAgaWYgKGxvY2FsICE9IG5ld0xvY2FsKSB7IC8vIERpZmZlcmVudD8KKyAgICAgIGNvbmZpZy5zZXRMb2NhbGhvc3RSZXF1aXJlZChuZXdMb2NhbCk7IC8vIFllcywgc2V0IHRoZSBuZXcgc3RhdGUKKyAgICAgIG5lZWRTYXZlID0gdHJ1ZTsgLy8gV2UgbmVlZCB0byBzYXZlCisgICAgfQorCisgICAgU3RyaW5nIG5ld0tleSA9IHJlcS5nZXRQYXJhbWV0ZXIoIm5ld2tleSIpOyAvLyBTZWUgaWYgc2hlJ3MgZ290IGEgbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eQorICAgIGlmIChuZXdLZXkgIT0gbnVsbCAmJiBuZXdLZXkubGVuZ3RoKCkgPiAwKSB7IC8vIEFuZCBtYWtlIHN1cmUgaXQncyBub25lbXB0eQorICAgICAgU3RyaW5nIG5ld1ZhbCA9IHJlcS5nZXRQYXJhbWV0ZXIoIm5ld3ZhbCIpOyAvLyBHb3Qgb25lLCBnZXQgaXRzIHZhbHVlCisgICAgICBpZiAobmV3VmFsID09IG51bGwpCisgICAgICAgIG5ld1ZhbCA9ICIiOyAvLyBNYWtlIHN1cmUgaXQncyBhdCBsZWFzdCBhbiBlbXB0eSBzdHJpbmcKKyAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuc2V0UHJvcGVydHkobmV3S2V5LCBuZXdWYWwpOyAvLyBTZXQgdGhlIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5CisgICAgICBuZWVkU2F2ZSA9IHRydWU7IC8vIFdlIG5lZWQgdG8gc2F2ZQorICAgIH0KKworICAgIG5lZWRTYXZlIHw9IHVwZGF0ZVByb3BlcnRpZXMoY29uZmlnLmdldFByb3BlcnRpZXMoKSwgLy8gTWFrZSBhbnkgdXBkYXRlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvcGVydHkKKyAgICAgICAgcmVxLmdldFBhcmFtZXRlck1hcCgpKTsgLy8gdmFsdWVzLCBhbmQgc2VlIG5vdGUgaWYgd2UgbmVlZCB0byBzYXZlCisgICAgdHJ5IHsKKyAgICAgIG5lZWRTYXZlIHw9IHVwZGF0ZVNlcnZlcnMoY29uZmlnLCByZXEuZ2V0UGFyYW1ldGVyTWFwKCksICdkJyk7IC8vIFNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJzCisgICAgICBuZWVkU2F2ZSB8PSB1cGRhdGVTZXJ2ZXJzKGNvbmZpZywgcmVxLmdldFBhcmFtZXRlck1hcCgpLCAnbScpOyAvLyBBbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcnMKKyAgICAgIG5lZWRTYXZlIHw9IHVwZGF0ZUNvZGVCYXNlcyhjb25maWcsIHJlcS5nZXRQYXJhbWV0ZXJNYXAoKSk7IC8vIEFuZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgYmFzZXMKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsgLy8gTWFrZSBzdXJlIGNvZGUgYmFzZSBVUkxzIGFyZSBPSworICAgICAgY2Iuc2V0TWVzc2FnZSgiQ29kZSBiYXNlcyBtdXN0IGJlIHZhbGlkIFVSTHMgKCIgLy8gTm90IE9LPworICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIik7IG5vIGNoYW5nZXMgbWFkZSIpOyAvLyBMZXQgdXNlciBrbm93IHZpYSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UKKyAgICAgIHJlcS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiY29uZmlnLmpzcCIpLmZvcndhcmQocmVxLCByZXMpOyAvLyBBbmQgbWFrZSBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGUgZml4ZXMgaXQKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobmVlZFNhdmUpIHsgLy8gRG8gd2UgbmVlZCB0byBzYXZlPworICAgICAgY29uZmlnLnNhdmUoKTsgLy8gVGhlbiBkbyBpdCBhbHJlYWR5IQorICAgICAgY2Iuc2V0TWVzc2FnZSgiQ2hhbmdlcyBzYXZlZC4iKTsgLy8gQW5kIGxldCB0aGUgdXNlciBrbm93CisgICAgfSBlbHNlIHsKKyAgICAgIGNiLnNldE1lc3NhZ2UoIk5vIGNoYW5nZXMgbWFkZS4iKTsgLy8gT2gsIG5vIGNoYW5nZXMgd2VyZSBtYWRlLCBsZXQgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrbm93CisgICAgfQorICAgIHJlcS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiY29uZmlnLmpzcCIpLmZvcndhcmQocmVxLCByZXMpOyAvLyBCYWNrIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcgcGFnZQorICB9CisKKyAgLyoqCisgICAqIFVwZGF0ZSBjaGFuZ2VzIHRvIHRoZSBjb2RlIGJhc2VzLgorICAgKiAKKyAgICogQHBhcmFtIGNvbmZpZworICAgKiAgICAgICAgICBhIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IHZhbHVlLgorICAgKiBAcGFyYW0gcGFyYW1zCisgICAqICAgICAgICAgIGEgPGNvZGU+TWFwPC9jb2RlPiB2YWx1ZS4KKyAgICogQHJldHVybiBUcnVlIGlmIGNoYW5nZXMgbmVlZCB0byBiZSBzYXZlZC4KKyAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVDb2RlQmFzZXMoQ29uZmlndXJhdGlvbiBjb25maWcsIE1hcCBwYXJhbXMpCisgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICBib29sZWFuIG5lZWRTYXZlID0gZmFsc2U7IC8vIEFzc3VtZSBubyBjaGFuZ2UKKyAgICBMaXN0IGNvZGVCYXNlcyA9IGNvbmZpZy5nZXRDb2RlQmFzZXMoKTsgLy8gR2V0IHRoZSBjdXJyZW50IGNvZGUgYmFzZXMKKworICAgIExpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIEhvbGQgaW5kZXhlcyBvZiBjb2RlIGJhc2VzIHRvIHJlbW92ZQorICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmFtcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyAvLyBGb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIKKyAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOyAvLyBHZXQgaXRzIGVudHJ5CisgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7IC8vIEFuZCBpdHMgbmFtZQorICAgICAgU3RyaW5nIHZhbHVlID0gKChTdHJpbmdbXSkgZW50cnkuZ2V0VmFsdWUoKSlbMF07IC8vIEFuZCBpdHMgemVyb3RoIHZhbHVlCisgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoImRlbGNiLSIpICYmICJvbiIuZXF1YWxzKHZhbHVlKSkgeyAvLyBJZiBpdCdzIGNoZWNrZWQKKyAgICAgICAgSW50ZWdlciBpbmRleCA9IG5ldyBJbnRlZ2VyKGtleS5zdWJzdHJpbmcoNikpOyAvLyBQYXJzZSBvdXQgdGhlIGluZGV4CisgICAgICAgIHRvUmVtb3ZlLmFkZChpbmRleCk7IC8vIEFkZCBpdCB0byB0aGUgbGlzdAorICAgICAgfQorICAgIH0KKyAgICBpZiAoIXRvUmVtb3ZlLmlzRW1wdHkoKSkgeyAvLyBBbmQgaWYgd2UgaGF2ZSBhbnkgaW5kZXhlcworICAgICAgQ29sbGVjdGlvbnMuc29ydCh0b1JlbW92ZSk7IC8vIFNvcnQgJ2VtIGFuZCBwdXQgJ2VtIGluIHJldmVyc2UgLi4uCisgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHRvUmVtb3ZlKTsgLy8gLi4uIG9yZGVyIHNvIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoZW0KKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRvUmVtb3ZlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyAvLyBGb3IgZWFjaCBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlbW92ZQorICAgICAgICBpbnQgaW5kZXggPSAoKEludGVnZXIpIGkubmV4dCgpKS5pbnRWYWx1ZSgpOyAvLyBHZXQgdGhlIGluZGV4IHZhbHVlCisgICAgICAgIGNvZGVCYXNlcy5yZW1vdmUoaW5kZXgpOyAvLyBBbmQgYnVoLWJ5ZS4KKyAgICAgIH0KKyAgICAgIG5lZWRTYXZlID0gdHJ1ZTsgLy8gRGVmaW5pdGVseSBuZWVkIHRvIHNhdmUgY2hhbmdlcyBub3cKKyAgICB9CisKKyAgICBTdHJpbmdbXSBuZXdDQnMgPSAoU3RyaW5nW10pIHBhcmFtcy5nZXQoIm5ld2NiIik7IC8vIFdhcyB0aGVyZSBhIG5ldyBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIHNwZWNpZmllZD8KKyAgICBpZiAobmV3Q0JzICE9IG51bGwgJiYgbmV3Q0JzLmxlbmd0aCA9PSAxKSB7IC8vIEFuZCB3YXMgdGhlcmUgZXhhY3RseSBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlPworICAgICAgU3RyaW5nIG5ld0NCID0gbmV3Q0JzWzBdOyAvLyBHZXQgdGhhdCBleGFjdGx5IG9uZSB2YWx1ZQorICAgICAgaWYgKG5ld0NCICE9IG51bGwgJiYgbmV3Q0IubGVuZ3RoKCkgPiAwKSB7IC8vIElzIGl0IG5vbm51bGwgYW5kIG5vbmVtcHR5PworICAgICAgICBVUkwgbmV3VVJMID0gbmV3IFVSTChuZXdDQik7IC8vIFRyZWF0IGlzIGFzIGFuIFVSTAorICAgICAgICBjb2RlQmFzZXMuYWRkKG5ld1VSTCk7IC8vIEFkZCBpdCB0byB0aGUgbGlzdAorICAgICAgICBuZWVkU2F2ZSA9IHRydWU7IC8vIEFkIHdlIGdvdHRhIHNhdmUKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5lZWRTYXZlOworICB9CisKKyAgLyoqCisgICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBwcm9kdWN0L3Byb2ZpbGUgc2VydmVycyBiYXNlZCBvbiByZXF1ZXN0IHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gY29uZmlnCisgICAqICAgICAgICAgIFN5c3RlbSBjb25maWd1cmF0aW9uCisgICAqIEBwYXJhbSBwYXJhbXMKKyAgICogICAgICAgICAgUmVxdWVzdCBwYXJhbWV0ZXJzLgorICAgKiBAcGFyYW0gdHlwZQorICAgKiAgICAgICAgICA8Y29kZT5kPC9jb2RlPiAoZGF0YSkgaWYgcHJvZHVjdCBzZXJ2ZXJzLCA8Y29kZT5tPC9jb2RlPgorICAgKiAgICAgICAgICAobWV0YWRhdGEpIGlmIHByb2ZpbGUgc2VydmVycworICAgKiBAcmV0dXJuIFRydWUgaWYgYW55IGNoYW5nZXMgd2VyZSBtYWRlLCBmYWxzZSBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZQorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVNlcnZlcnMoQ29uZmlndXJhdGlvbiBjb25maWcsIE1hcCBwYXJhbXMsIGNoYXIgdHlwZSkgeworICAgIExpc3Qgc2VydmVycyA9IHR5cGUgPT0gJ2QnID8gY29uZmlnLmdldFByb2R1Y3RTZXJ2ZXJzKCkgOiBjb25maWcKKyAgICAgICAgLmdldFByb2ZpbGVTZXJ2ZXJzKCk7CisgICAgYm9vbGVhbiBuZWVkU2F2ZSA9IGZhbHNlOyAvLyBBc3N1bWUgbm8gY2hhbmdlcyBmb3Igbm93CisKKyAgICBMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOyAvLyBTdGFydCB3aXRoIGVtcHR5IGxpc3Qgb2YgaW5kZXhlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZQorICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmFtcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyAvLyBHbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyCisgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsgLy8gR2V0IGl0cyBrZXkvdmFsdWUKKyAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7IC8vIFRoZSBrZXkgaXMgYSBTdHJpbmcKKyAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgodHlwZSArICJybS0iKSkgeyAvLyBJcyBpdCBhbiAiZHJtLSIgb3IgIm1ybS0iPworICAgICAgICBJbnRlZ2VyIGluZGV4ID0gbmV3IEludGVnZXIobmFtZS5zdWJzdHJpbmcoNCkpOyAvLyBZZXMsIGdldCBpdCBzaW5kZXgKKyAgICAgICAgdG9SZW1vdmUuYWRkKGluZGV4KTsgLy8gQWRkIGl0IHRvIHRoZSBsaXN0CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0b1JlbW92ZS5pc0VtcHR5KCkpIHsgLy8gR290IGFueSB0byByZW1vdmU/CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRvUmVtb3ZlKTsgLy8gV2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZW0gaW4gcmV2ZXJzZSBvcmQtCisgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHRvUmVtb3ZlKTsgLy8gLWVyLCBzbyB0aGF0IHJlbW92YWxzIGRvbid0IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXhlcworICAgICAgZm9yIChJdGVyYXRvciBpID0gdG9SZW1vdmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IC8vIEZvciBlYWNoIGluZGV4CisgICAgICAgIGludCBpbmRleCA9ICgoSW50ZWdlcikgaS5uZXh0KCkpLmludFZhbHVlKCk7IC8vIEdldCBpdHMgaW50IHZhbHVlCisgICAgICAgIHNlcnZlcnMucmVtb3ZlKGluZGV4KTsgLy8gYW5kIGJ1aC1ieWUKKyAgICAgIH0KKyAgICAgIG5lZWRTYXZlID0gdHJ1ZTsgLy8gR290dGEgc2F2ZSBhZnRlciBhbGwgdGhhdCwgd2hldy4KKyAgICB9CisKKyAgICBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KHR5cGUgKyAiLW5ld2NuIikpIHsgLy8gQWRkaW5nIGEgbmV3IHNlcnZlcj8KKyAgICAgIFN0cmluZ1tdIG5ld0NsYXNzZXMgPSAoU3RyaW5nW10pIHBhcmFtcy5nZXQodHlwZSArICItbmV3Y24iKTsgLy8gQW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZQorICAgICAgaWYgKG5ld0NsYXNzZXMgIT0gbnVsbCAmJiBuZXdDbGFzc2VzLmxlbmd0aCA9PSAxKSB7IC8vIEFyZSBwcmVzZW50IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3Mgb25seSBvbmUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoCisgICAgICAgIFN0cmluZyBuZXdDbGFzcyA9IG5ld0NsYXNzZXNbMF07IC8vIEdldCB0aGUgbmV3IGNsYXNzCisgICAgICAgIGlmIChuZXdDbGFzcyAhPSBudWxsICYmIG5ld0NsYXNzLmxlbmd0aCgpID4gMCkgeyAvLyBBbmQgbm9uZW1wdHkKKyAgICAgICAgICBTZXJ2ZXIgc2VydmVyOworICAgICAgICAgIGlmICh0eXBlID09ICdkJykgLy8gSWYgaXQncyBkYXRhCisgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgUHJvZHVjdFNlcnZlcihjb25maWcsIG5ld0NsYXNzKTsgLy8gSXQncyBhIHByb2R1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgaXQncyBtZXRhZGF0YQorICAgICAgICAgICAgc2VydmVyID0gbmV3IFByb2ZpbGVTZXJ2ZXIoY29uZmlnLCBuZXdDbGFzcyk7IC8vIFdoaWNoIGlzIGEgcHJvZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcgorICAgICAgICAgIHNlcnZlcnMuYWRkKHNlcnZlcik7IC8vIEFkZCBpdCB0byB0aGUgc2V0IG9mIHNlcnZlcnMKKyAgICAgICAgICBuZWVkU2F2ZSA9IHRydWU7IC8vIEFuZCBhZnRlciBhbGwgdGhpcywgd2UgbmVlZCB0byBzYXZlIQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRTYXZlOworICB9CisKKyAgLyoqCisgICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIHJlcXVlc3QgcGFyYW1ldGVycy4KKyAgICogCisgICAqIEBwYXJhbSBwcm9wcworICAgKiAgICAgICAgICA8Y29kZT5Qcm9wZXJ0aWVzPC9jb2RlPiB0byB1cGRhdGUKKyAgICogQHBhcmFtIHBhcmFtcworICAgKiAgICAgICAgICBSZXF1ZXN0IHBhcmFtZXRlcnMKKyAgICogQHJldHVybiBUcnVlIGlmIGNoYW5nZXMgbmVlZCB0byBiZSBzYXZlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzLCBNYXAgcGFyYW1zKSB7CisgICAgYm9vbGVhbiBuZWVkU2F2ZSA9IGZhbHNlOyAvLyBBc3N1bWUgbm8gc2F2ZSBmb3Igbm93CisgICAgZm9yIChJdGVyYXRvciBpID0gcGFyYW1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IC8vIEdvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcgorICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7IC8vIEdldCB0aGUga2V5L3ZhbHVlCisgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOyAvLyBLZXkgaXMgYWx3YXlzIGEgc3RyaW5nCisgICAgICBTdHJpbmcgbmV3VmFsdWUgPSAoKFN0cmluZ1tdKSBlbnRyeS5nZXRWYWx1ZSgpKVswXTsgLy8gVmFsdWUgaXMgU3RyaW5nW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB6ZXJvdGgKKyAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInZhbC0iKSkgeyAvLyBJZiB0aGUgcGFyYW0gaXMgInZhbC0iCisgICAgICAgIFN0cmluZyBrZXkgPSBuYW1lLnN1YnN0cmluZyg0KTsgLy8gVGhlbiBmaW5kIHRoZSBrZXkKKyAgICAgICAgaWYgKHByb3BzLmNvbnRhaW5zS2V5KGtleSkpIHsgLy8gSWYgdGhhdCBrZXkgZXhpc3RzCisgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsgLy8gRmluZCBpdHMgdmFsdWUKKyAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUuZXF1YWxzKG5ld1ZhbHVlKSkgey8vIEFyZSB0aGV5IGRpZmZlcmVudD8KKyAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KGtleSwgbmV3VmFsdWUpOyAvLyBZZXMsIHNldCB0aGUgbmV3IHZhbHVlCisgICAgICAgICAgICBuZWVkU2F2ZSA9IHRydWU7IC8vIEFuZCB3ZSBuZWVkIHRvIHNhdmUKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJkZWwtIikpIHsgLy8gSWYgdGhlIHBhcmFtIGlzICJkZWwtIgorICAgICAgICBTdHJpbmcga2V5ID0gbmFtZS5zdWJzdHJpbmcoNCk7IC8vIFRoZW4gZmluZCB0aGUga2V5CisgICAgICAgIGlmIChwcm9wcy5jb250YWluc0tleShrZXkpKSB7IC8vIElmIHRoYXQga2V5IGV4aXN0cworICAgICAgICAgIHByb3BzLnJlbW92ZShrZXkpOyAvLyBUaGVuIHJlbW92ZSBpdHMgbWFwcGluZworICAgICAgICAgIG5lZWRTYXZlID0gdHJ1ZTsgLy8gQW5kIHdlIG5lZWQgdG8gc2F2ZQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZWVkU2F2ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQ29uZmlndXJhdGlvbi5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlYTUzNzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Db25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw0NDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZ3JpZDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5UZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuQmFzZTY0OworCisvKioKKyAqIHdlYi1ncmlkIGNvbmZpZ3VyYXRpb24uIFRoaXMgaG9sZHMgYWxsIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24gb2YgcHJvZmlsZSBzZXJ2ZXJzLAorICogcHJvZHVjdCBzZXJ2ZXJzLCBwcm9wZXJ0aWVzLCBhbmQgb3RoZXIgc2V0dGluZ3MgZm9yIHRoZSB3ZWItZ3JpZCBjb250YWluZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIEZpbGUgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBjb25maWd1cmF0aW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW4ndCBiZSBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIENvbmZpZ3VyYXRpb24oRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgcGFyc2UoZmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgY29uZmlndXJhdGlvbiB0byBYTUwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgT3duaW5nIGRvY3VtZW50LgorICAgICAqIEByZXR1cm4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZSB0b1hNTChEb2N1bWVudCBvd25lcikgeworICAgICAgICBFbGVtZW50IGVsZW0gPSBvd25lci5jcmVhdGVFbGVtZW50KCJjb25maWd1cmF0aW9uIik7ICAgICAgICAgICAgICAgICAgICAvLyA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgTlMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCJodHRwcyIsIGh0dHBzUmVxdWlyZWQ/ICJ0cnVlIiA6ICJmYWxzZSIpOyAgICAgICAgICAgIC8vIEFkZCBodHRwcyBhdHRyaWJ1dGUKKyAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoImxvY2FsaG9zdCIsIGxvY2FsaG9zdFJlcXVpcmVkPyAidHJ1ZSIgOiAiZmFsc2UiKTsgICAgLy8gQWRkIGxvY2FsaG9zdCBhdHRyaWJ1dGUKKworICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCAmJiBwYXNzd29yZC5sZW5ndGggPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcGFzc3dvcmQKKyAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCJwYXNzd29yZCIsIGVuY29kZShwYXNzd29yZCkpOyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHBhc3Nvd3JkIGF0dHJpYnV0ZQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RTZXJ2ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyAgICAgICAgICAgIC8vIEZvciBlYWNoIHByb2R1Y3Qgc2VydmVyCisgICAgICAgICAgICBQcm9kdWN0U2VydmVyIHBzID0gKFByb2R1Y3RTZXJ2ZXIpIGkubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJvZHVjdCBzZXJ2ZXIKKyAgICAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQocHMudG9YTUwob3duZXIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIGFkZCBpdCB1bmRlciA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2ZpbGVTZXJ2ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyAgICAgICAgICAgIC8vIEZvciBlYWNoIHByb2ZpbGUgc2VydmVyCisgICAgICAgICAgICBQcm9maWxlU2VydmVyIHBzID0gKFByb2ZpbGVTZXJ2ZXIpIGkubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJvZmlsZSBzZXJ2ZXIKKyAgICAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQocHMudG9YTUwob3duZXIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIGFkZCBpdCB1bmRlciB0aGUgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNvZGVCYXNlcy5pc0VtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb3QgYW55IGNvZGUgYmFzZXM/CisgICAgICAgICAgICBFbGVtZW50IGNicyA9IG93bmVyLmNyZWF0ZUVsZW1lbnQoImNvZGVCYXNlcyIpOyAgICAgICAgICAgICAgICAgICAgIC8vIEJvbyB5YWguICBNYWtlIGEgcGFyZW50IGZvciAnZW0KKyAgICAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoY2JzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHBhcmVudAorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29kZUJhc2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyAgICAgICAgICAgICAvLyBUaGVuLCBmb3IgZWFjaCBjb2RlIGJhc2UKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgaS5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBVUkwgdG8gaXQKKyAgICAgICAgICAgICAgICBFbGVtZW50IGNiID0gb3duZXIuY3JlYXRlRWxlbWVudCgiY29kZUJhc2UiKTsgICAgICAgICAgICAgICAgICAgLy8gQW5kIG1ha2UgYSA8Y29kZUJhc2U+IGZvciBpdAorICAgICAgICAgICAgICAgIGNiLnNldEF0dHJpYnV0ZSgidXJsIiwgdXJsLnRvU3RyaW5nKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgYW4gInVybCIgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgY2JzLmFwcGVuZENoaWxkKGNiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBpdAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnkgcHJvcGVydGllcz4KKyAgICAgICAgICAgIEVsZW1lbnQgcHJvcHMgPSBvd25lci5jcmVhdGVFbGVtZW50KCJwcm9wZXJ0aWVzIik7ICAgICAgICAgICAgICAgICAgLy8gQWRkIDxwcm9wZXJ0aWVzPiB1bmRlciA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIHByb3BzLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwgInByZXNlcnZlIik7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIG1ha2Ugc3VyZSBzcGFjZSBpcyBwcm9wZXJseSBwcmVzZXJ2ZWQKKyAgICAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQocHJvcHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBzcGFjZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgLy8gRm9yIGVhY2ggcHJvcGVydHkKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcm9wZXJ0eSBrZXkvdmFsdWUgcGFpcgorICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgaXMgYWx3YXlzIGEgU3RyaW5nCisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvIGlzIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcCA9IG93bmVyLmNyZWF0ZUVsZW1lbnQoInByb3BlcnR5Iik7ICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSA8cHJvcGVydHk+IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBwcm9wcy5hcHBlbmRDaGlsZChwcm9wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGl0IHVuZGVyIHRoZSA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICBwcm9wLnNldEF0dHJpYnV0ZSgia2V5Iiwga2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBrZXkgYXMgYW4gYXR0cmlidXRlCisgICAgICAgICAgICAgICAgVGV4dCB0ZXh0ID0gb3duZXIuY3JlYXRlVGV4dE5vZGUodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGV4dCB0byBob2xkIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgIHByb3AuYXBwZW5kQ2hpbGQodGV4dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgaXQgdW5kZXIgdGhlIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWxlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+UHJvcGVydGllczwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgbG9jYWxob3N0IGFjY2VzcyByZXF1aXJlZCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBsb2NhbGhvc3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsaG9zdFJlcXVpcmVkKCkgeworICAgICAgICByZXR1cm4gbG9jYWxob3N0UmVxdWlyZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgaHR0cHMgYWNjZXNzIHJlcXVpcmVkIGZvciB0aGUgY29uZmlndXJhdGlvbj8KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIGFjY2Vzc2VkIHZpYSBodHRwcywgZmFsc2UgaWYgaHR0cCBpcyBPSy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hUVFBTcmVxdWlyZWQoKSB7CisgICAgICAgIHJldHVybiBodHRwc1JlcXVpcmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiBodHRwcyBpcyByZXF1aXJlZCB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVHJ1ZSBpZiB0aGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIGFjY2Vzc2VkIHZpYSBodHRwcywgZmFsc2UgaWYgaHR0cCBpcyBPSy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIVFRQU3JlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgICAgaHR0cHNSZXF1aXJlZCA9IHJlcXVpcmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiBsb2NhbGhvc3QgaXMgcmVxdWlyZWQgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVpcmVkIFRydWUgaWYgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBsb2NhbGhvc3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGhvc3RSZXF1aXJlZChib29sZWFuIHJlcXVpcmVkKSB7CisgICAgICAgIGxvY2FsaG9zdFJlcXVpcmVkID0gcmVxdWlyZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2RlIGJhc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBVUkx9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRDb2RlQmFzZXMoKSB7CisgICAgICAgIHJldHVybiBjb2RlQmFzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9kdWN0IHNlcnZlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIFByb2R1Y3RTZXJ2ZXJ9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRQcm9kdWN0U2VydmVycygpIHsKKyAgICAgICAgcmV0dXJuIHByb2R1Y3RTZXJ2ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvZmlsZSBzZXJ2ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBQcm9maWxlU2VydmVyfXMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0UHJvZmlsZVNlcnZlcnMoKSB7CisgICAgICAgIHJldHVybiBwcm9maWxlU2VydmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFkbWluaXN0cmF0b3IgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFkbWluaXN0cmF0b3IgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuIHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRvciBwYXNzd29yZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBBZG1pbmlzdHJhdG9yIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKGJ5dGVbXSBwYXNzd29yZCkgeworICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vbi1udWxsIHBhc3N3b3JkcyBub3QgYWxsb3dlZCIpOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgdy9ubyB3cml0ZXIKKyAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIHRyeSAuLi4KKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7ICAvLyBDcmVhdGUgYSB3cml0ZXIKKyAgICAgICAgICAgIERvY3VtZW50IGRvYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyBmb3IgdGhlIGRvYy4uLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChET0NVTUVOVF9CVUlMREVSKSB7ICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBkb2N1bWVudCBidWlsZGVyLi4uCisgICAgICAgICAgICAgICAgZG9jID0gRE9DVU1FTlRfQlVJTERFUi5uZXdEb2N1bWVudCgpOyAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGRvY3VtZW50CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2RlIHJvb3QgPSB0b1hNTChkb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGlzIGNvbmZpZyB0byBYTUwKKyAgICAgICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGRvYworICAgICAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc291cmNlIEx1a2UKKyAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7ICAgICAvLyBBbmQgc2VyaWFsaXplIGl0IHRvIHRoZSB3cml0ZXIKKyAgICAgICAgICAgIFRSQU5TRk9STUVSLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgICAvLyBTZXJpYWxpemUKKyAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgVHJhbnNmb3JtZXJFeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuZCBpZiB3ZSBnb3QgYSB3cml0ZXIsIHRyeSAuLi4KKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjbG9zZSBpdAorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fSAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yaW5nIGFueSBlcnJvcgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBzZXJpYWxpemVkIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIHRvIHBhcnNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2UgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnQgZG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBkb2MgLi4uCisgICAgICAgIHN5bmNocm9uaXplZCAoRE9DVU1FTlRfQlVJTERFUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdXNpbmcgdGhlIERPQ1VNRU5UX0JVSUxERVIKKyAgICAgICAgICAgIGRvYyA9IERPQ1VNRU5UX0JVSUxERVIucGFyc2UoZmlsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgZmlsZQorICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHJvb3QgZWxlbWVudCBpcyA8Y29uZmlndXJhdGlvbj4KKworICAgICAgICBTdHJpbmcgaHR0cHNBdHRyID0gcm9vdC5nZXRBdHRyaWJ1dGUoImh0dHBzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBodHRwcyBhdHRyaWJ1dGUKKyAgICAgICAgaHR0cHNSZXF1aXJlZCA9IGh0dHBzQXR0ciAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoaHR0cHNBdHRyKTsgICAgICAgICAgICAgIC8vIFNlZSBpZiBpdCdzICJ0cnVlIgorCisgICAgICAgIFN0cmluZyBsb2NhbGhvc3RBdHRyID0gcm9vdC5nZXRBdHRyaWJ1dGUoImxvY2FsaG9zdCIpOyAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxvY2FsaG9zdCBhdHRyaWJ1dGUKKyAgICAgICAgbG9jYWxob3N0UmVxdWlyZWQgPSBsb2NhbGhvc3RBdHRyICE9IG51bGwgJiYgInRydWUiLmVxdWFscyhsb2NhbGhvc3RBdHRyKTsgIC8vIFNlZSBpZiBpdCdzICJ0cnVlIgorCisgICAgICAgIFN0cmluZyBwYXNzd29yZEF0dHIgPSByb290LmdldEF0dHJpYnV0ZSgicGFzc3dvcmQiKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhc3N3b3JkIGF0dHJpYnV0ZQorICAgICAgICBpZiAocGFzc3dvcmRBdHRyICE9IG51bGwgJiYgcGFzc3dvcmRBdHRyLmxlbmd0aCgpID4gMCkgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0aGVyZSwgYW5kIG5vbi1lbXB0eQorICAgICAgICAgICAgcGFzc3dvcmQgPSBkZWNvZGUocGFzc3dvcmRBdHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiBkZWNvZGUgaXQKKworICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjaGlsZCBub2RlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggY2hpbGQgbm9kZQorICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjaGlsZAorICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gZWxlbWVudD8KKyAgICAgICAgICAgICAgICBpZiAoInNlcnZlciIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgPHNlcnZlcj4/CisgICAgICAgICAgICAgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXIuY3JlYXRlKHRoaXMsIChFbGVtZW50KSBjaGlsZCk7ICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvcnJlY3Qgc2VydmVyCisKKyAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCB0aGVzZSBpbiBzZXBhcmF0ZSBzZXRzPworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyIGluc3RhbmNlb2YgUHJvZHVjdFNlcnZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgYSBwcm9kdWN0IHNlcnZlcj8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RTZXJ2ZXJzLmFkZChzZXJ2ZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBwcm9kdWN0IHNlcnZlcnMKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VydmVyIGluc3RhbmNlb2YgUHJvZmlsZVNlcnZlcikgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGEgcHJvZmlsZSBzZXJ2ZXI/CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlU2VydmVycy5hZGQoc2VydmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gcHJvZmlsZSBzZXJ2ZXJzCisgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzZXJ2ZXIgdHlwZSAiICsgc2VydmVyICsgIiBpbiAiICsgZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvcGVydGllcyIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7ICAgICAgICAgICAgICAvLyBJcyBpdCBhIDxwcm9wZXJ0aWVzPj8KKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgcHJvcHMgPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBpdHMgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wcy5nZXRMZW5ndGgoKTsgKytqKSB7ICAgICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIGNoaWxkCisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBwcm9wcy5pdGVtKGopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNobGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgICAgICAgICAgICAgICAgIC8vIEFuZCBlbGVtZW50PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICJwcm9wZXJ0eSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsgICAgICAgICAgICAgLy8gQW5kIGl0J3MgPHByb3BlcnR5Pj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BOb2RlID0gKEVsZW1lbnQpIG5vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIEdyZWF0LCB1c2UgaXQgYXMgYW4gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwcm9wTm9kZS5nZXRBdHRyaWJ1dGUoImtleSIpOyAgICAgICAgICAgICAgLy8gR2V0IGl0cyBrZXkgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5sZW5ndGgoKSA9PSAwKSAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyB0aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJSZXF1aXJlZCAna2V5JyBhdHRyaWJ1dGUgbWlzc2luZyBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxwcm9wZXJ0eT4gZWxlbWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoa2V5LCB0ZXh0KHByb3BOb2RlKSk7ICAgICAgICAgICAgLy8gQW5kIHNldCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiY29kZUJhc2VzIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsgICAgICAgICAgICAgICAvLyBBbmQgeWFkZGEKKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgY2JzID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHlhZGRhCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2JzLmdldExlbmd0aCgpOyArK2opIHsgICAgICAgICAgICAgICAgICAgICAvLyB5YWRkYS4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IGNicy5pdGVtKGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICJjb2RlQmFzZSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGNiTm9kZSA9IChFbGVtZW50KSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1ID0gY2JOb2RlLmdldEF0dHJpYnV0ZSgidXJsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT0gbnVsbCB8fCB1Lmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIlJlcXVpcmVkICd1cmwnIGF0dHJpYnV0ZSBtaXNzaW5nIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGNvZGVCYXNlPiBlbGVtZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJhc2VzLmFkZChuZXcgVVJMKHUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigidXJsIGF0dHJpYnV0ZSAiICsgdSArICIgaXNuJ3QgYSB2YWxpZCBVUkwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgYSBwYXNzd29yZC4gIFRoaXMganVzdCBoaWRlcyBpdCBzbyBpdCdzIG5vdCBwbGFpbiB0ZXh0LCBidXQgaXQncyBqdXN0IGFzCisgICAgICogZWFzeSB0byBkZWNvZGUgaXQgaWYgeW91IGhhdmUgYSBiYXNlLTY0IGRlY29kZXIgaGFuZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgYSA8Y29kZT5ieXRlW108L2NvZGU+IHZhbHVlLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgZW5jb2RlKGJ5dGVbXSBwYXNzd29yZCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKHBhc3N3b3JkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIGEgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5ieXRlW108L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZShwYXNzd29yZC5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRleHQgdW5kZXIgYW4gWE1MIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSBhIDxjb2RlPk5vZGU8L2NvZGU+IHZhbHVlLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXh0KE5vZGUgbm9kZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgdGV4dDAobm9kZSwgYik7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0ZXh0IGZyb20gYW4gWE1MIG5vZGUgaW50byBhIFN0cmluZ0J1ZmZlci4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSBhIDxjb2RlPk5vZGU8L2NvZGU+IHZhbHVlLgorICAgICAqIEBwYXJhbSBiIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRleHQwKE5vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIGIpIHsKKyAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKQorICAgICAgICAgICAgdGV4dDAoY2hpbGRyZW4uaXRlbShpKSwgYik7CisgICAgICAgIHNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7CisgICAgICAgIGlmICh0eXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIHx8IHR5cGUgPT0gTm9kZS5URVhUX05PREUpCisgICAgICAgICAgICBiLmFwcGVuZChub2RlLmdldE5vZGVWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgQ29uZmlndXJhdGlvbiByaHMgPSAoQ29uZmlndXJhdGlvbikgb2JqOworICAgICAgICAgICAgcmV0dXJuIGNvZGVCYXNlcy5lcXVhbHMocmhzLmNvZGVCYXNlcykgJiYgcHJvZHVjdFNlcnZlcnMuZXF1YWxzKHJocy5wcm9kdWN0U2VydmVycykKKyAgICAgICAgICAgICAgICAmJiBwcm9maWxlU2VydmVycy5lcXVhbHMocmhzLnByb2ZpbGVTZXJ2ZXJzKSAmJiBBcnJheXMuZXF1YWxzKHBhc3N3b3JkLCByaHMucGFzc3dvcmQpCisgICAgICAgICAgICAgICAgJiYgaHR0cHNSZXF1aXJlZCA9PSByaHMuaHR0cHNSZXF1aXJlZCAmJiBsb2NhbGhvc3RSZXF1aXJlZCA9PSByaHMubG9jYWxob3N0UmVxdWlyZWQKKyAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0aWVzLmVxdWFscyhyaHMucHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBjb2RlQmFzZXMuaGFzaENvZGUoKSBeIHByb2R1Y3RTZXJ2ZXJzLmhhc2hDb2RlKCkgXiBwcm9maWxlU2VydmVycy5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKiBMaXN0IG9mIHtAbGluayBVUkx9cyB0byBjb2RlIGJhc2VzLiAqLworICAgIHByaXZhdGUgTGlzdCBjb2RlQmFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKiogTGlzdCBvZiB7QGxpbmsgUHJvZHVjdFNlcnZlcn1zLiAqLworICAgIHByaXZhdGUgTGlzdCBwcm9kdWN0U2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKiBMaXN0IG9mIHtAbGluayBQcm9maWxlU2VydmVyfXMuICovCisgICAgcHJpdmF0ZSBMaXN0IHByb2ZpbGVTZXJ2ZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqIEFkbWluIHBhc3N3b3JkLiAqLworICAgIHByaXZhdGUgYnl0ZVtdIHBhc3N3b3JkID0gREVGQVVMVF9QQVNTV09SRDsKKworICAgIC8qKiBUcnVlIGlmIGh0dHBzIGlzIHJlcXVyaWVkLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBodHRwc1JlcXVpcmVkOworCisgICAgLyoqIFRydWUgaWYgbG9jYWxob3N0IGFjY2VzcyBpcyByZXF1aXJlZC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbG9jYWxob3N0UmVxdWlyZWQ7CisKKyAgICAvKiogUHJvcGVydGllcyB0byBzZXQuICovCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgLyoqIFdoZXJlIHRvIHNhdmUgdGhlIGZpbGUuICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRmlsZSBmaWxlOworCisgICAgLyoqIERlZmF1bHQgcGFzc3dvcmQuICovCisgICAgc3RhdGljIGZpbmFsIGJ5dGVbXSBERUZBVUxUX1BBU1NXT1JEID0geyAoYnl0ZSknaCcsIChieXRlKSdhJywgKGJ5dGUpJ24nLCAoYnl0ZSknYScsIChieXRlKSdsJywgKGJ5dGUpJ2UnLCAoYnl0ZSknaScgfTsKKworICAgIC8qKiBYTUwgbmFtZXNwYWNlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlMgPSAiaHR0cDovL29vZHQuanBsLm5hc2EuZ292L3dlYi1ncmlkL25zLyI7CisKKyAgICAvKiogU29sZSBkb2N1bWVudCBidWlsZGVyIHdlJ2xsIG5lZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG9jdW1lbnRCdWlsZGVyIERPQ1VNRU5UX0JVSUxERVI7CisKKyAgICAvKiogU29sZSB0cmFuc2ZvbWVyIHdlJ2xsIG5lZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgVFJBTlNGT1JNRVI7CisKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKGZhbHNlKTsKKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyh0cnVlKTsKKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0SWdub3JpbmdDb21tZW50cyh0cnVlKTsKKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0Q29hbGVzY2luZyh0cnVlKTsKKyAgICAgICAgICAgIERPQ1VNRU5UX0JVSUxERVIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBUUkFOU0ZPUk1FUiA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICAgICAgVFJBTlNGT1JNRVIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKKyAgICAgICAgICAgIFRSQU5TRk9STUVSLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuVkVSU0lPTiwgIjEuMCIpOworICAgICAgICAgICAgVFJBTlNGT1JNRVIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7CisgICAgICAgICAgICBUUkFOU0ZPUk1FUi5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAibm8iKTsKKyAgICAgICAgICAgIFRSQU5TRk9STUVSLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7CisgICAgICAgICAgICBUUkFOU0ZPUk1FUi5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGRvY3VtZW50IGJ1aWxkZXIiKTsKKyAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHRyYW5zZm9ybWVyIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9HcmlkU2VydmxldC5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvR3JpZFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjVjZjVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvR3JpZFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5ncmlkOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogR3JpZCBzZXJ2bGV0IGlzIGFuIGFic3RyYWN0IHNlcnZsZXQgdGhhdCBwcm92aWRlcyBiYXNpYyBiZWhhdmlvciAoY29uZmlndXJhdGlvbiBhY2Nlc3MpCisgKiBmb3IgZ3JpZCBzZXJ2bGV0cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdyaWRTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCS8qKgorCSAqIEJ5IGRlZmF1bHQsIGdyaWQgc2VydmxldHMgYXJlIFBPU1Qgb25seSwgc28gR0VUcyBnZXQgeW91IHRoZSB3ZWxjb21lIHBhZ2UuCisJICoKKwkgKiBAcGFyYW0gcmVxIGEgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gcmVzIGEgPGNvZGU+SHR0cFNlcnZsZXRSZXNwb25zZTwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKwkJcmVxLmdldFJlcXVlc3REaXNwYXRjaGVyKCJpbmRleC5odG1sIikuZm9yd2FyZChyZXEsIHJlcyk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBjb25maWd1cmF0aW9uLgorCSAqCisJICogQHJldHVybiBhIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IHZhbHVlLgorCSAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHJldHVybiBjb25maWd1cmF0aW9uOworCQlTdHJpbmcgcGF0aCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigib3JnLmFwYWNoZS5vb2R0LmdyaWQuR3JpZFNlcnZsZXQuY29uZmlnIik7CisJCWlmIChwYXRoID09IG51bGwpIHBhdGggPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvV0VCLUlORi9jb25maWcueG1sIik7CisJCWlmIChwYXRoID09IG51bGwpCisJCQl0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiVGhlIGNvbmZpZy54bWwgZmlsZSBjYW4ndCBiZSBhY2Nlc3NlZC4gQXJlIHdlIHJ1bm5pbmcgZnJvbSBhIHdhciBmaWxlIT8/ISIpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKwkJQ29uZmlndXJhdGlvbiBjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWMgPSBuZXcgQ29uZmlndXJhdGlvbihmaWxlKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiQ2Fubm90IHBhcnNlIGNvbmZpZy54bWwgZmlsZSIsIGV4KTsKKwkJfQorCQlzeW5jaHJvbml6ZWQgKEdyaWRTZXJ2bGV0LmNsYXNzKSB7CisJCQl3aGlsZSAoY29uZmlndXJhdGlvbiA9PSBudWxsKQorCQkJCWNvbmZpZ3VyYXRpb24gPSBjOworCQl9CisJCXJldHVybiBjb25maWd1cmF0aW9uOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgY29uZmlnIGJlYW4uCisJICoKKwkgKiBAcGFyYW0gcmVxIGEgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcmV0dXJuIGEgPGNvZGU+Q29uZmlnQmVhbjwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29uZmlnQmVhbiBnZXRDb25maWdCZWFuKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXEuZ2V0U2Vzc2lvbigvKmNyZWF0ZSovdHJ1ZSk7CisJCUNvbmZpZ0JlYW4gY2IgPSAoQ29uZmlnQmVhbikgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNiIik7CisJCWlmIChjYiA9PSBudWxsKSB7CisJCQljYiA9IG5ldyBDb25maWdCZWFuKCk7CisJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiY2IiLCBjYik7CisJCX0KKwkJQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7CisJCWNiLnNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKKwkJcmV0dXJuIGNiOworCX0KKworCS8qKgorCSAqIENoZWNrIGlmIGFkbWluaXN0cmF0aXZlIGFjY2VzcyBpcyBhbGxvd2VkLiAgVGhpcyBleGFtaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWUKKwkgKiAoaHR0cCwgZnRwLCBodHRwcywgZXRjLikgYW5kIHNlZXMgaWYgaHR0cHMgaXMgcmVxdWlyZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24uCisJICogSXQgYWxzbyBjaGVja3MgdGhlIHJlbW90ZSBob3N0IGFuZCBzZWVzIGlmIGxvY2FsaG9zdCBhY2Nlc3MgaXMgcmVxdWlyZWQuCisJICoKKwkgKiBAcGFyYW0gY29uZmlnIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHJlcSBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHJlcyBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IHZhbHVlLgorCSAqIEByZXR1cm4gVHJ1ZSBpZiBhY2Nlc3MgaXMgYXBwcm92ZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhcHByb3ZlQWNjZXNzKENvbmZpZ3VyYXRpb24gY29uZmlnLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGNvbmZpZy5pc0hUVFBTcmVxdWlyZWQoKSAmJiAhImh0dHBzIi5lcXVhbHMocmVxLmdldFNjaGVtZSgpKSkgeworCQkJcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTiwgImh0dHBzIHJlcXVpcmVkIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoY29uZmlnLmlzTG9jYWxob3N0UmVxdWlyZWQoKSAmJiAhVXRpbGl0eS5pc0xvY2FsaG9zdChyZXEuZ2V0UmVtb3RlSG9zdCgpKSkgeworCQkJcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTiwgImxvY2FsaG9zdCBhY2Nlc3Mgb25seSIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqIFNpbmdsZXRvbiBjb25maWd1cmF0aW9uLiAqLworCXByaXZhdGUgc3RhdGljIHZvbGF0aWxlIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL0xvZ2luU2VydmxldC5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvTG9naW5TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZhOTg4MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL0xvZ2luU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZ3JpZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBDb250cm9sbGVyIHNlcnZsZXQgdGhhdCBhdXRoZW50aWNhdGVzIHRoZSBhZG1pbmlzdHJhdG9yIHBhc3N3b3JkLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dpblNlcnZsZXQgZXh0ZW5kcyBHcmlkU2VydmxldCB7CisJLyoqCisJICogSGFuZGxlIGF1dGhlbnRpY2F0aW9uIGZyb20gYW4gYWRtaW5pc3RyYXRvci4KKwkgKgorCSAqIEBwYXJhbSByZXEgYSA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSByZXMgYSA8Y29kZT5IdHRwU2VydmxldFJlc3BvbnNlPC9jb2RlPiB2YWx1ZS4KKwkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7CQkJICAgICAgIC8vIEdldCBjb25maWd1cmF0aW9uCisJCWlmICghYXBwcm92ZUFjY2Vzcyhjb25maWcsIHJlcSwgcmVzKSkgcmV0dXJuOwkJCSAgICAgICAvLyBEbyBodHRwcywgbG9jYWxob3N0IGNoZWNraW5nIGZpcnN0CisKKwkJQ29uZmlnQmVhbiBjYiA9IGdldENvbmZpZ0JlYW4ocmVxKTsJCQkJICAgICAgIC8vIEdldCBiZWFuCisJCWlmIChjYi5pc0F1dGhlbnRpYygpKSB7CQkJCQkJICAgICAgIC8vIEFscmVhZHkgYXV0aGVudGljPworCQkJcmVxLmdldFJlcXVlc3REaXNwYXRjaGVyKCJjb25maWcuanNwIikuZm9yd2FyZChyZXEsIHJlcyk7ICAgICAgLy8gQmFjayB0byB0aGUgY29uZmlnIHBhZ2Ugd2l0aCB5b3UhCisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgcGFzc3dvcmQgPSByZXEuZ2V0UGFyYW1ldGVyKCJwYXNzd29yZCIpOwkJCSAgICAgICAvLyBHZXQgc3VibWl0dGVkIHBhc3N3b3JkCisJCWlmIChwYXNzd29yZCA9PSBudWxsKSBwYXNzd29yZCA9ICIiOwkJCQkgICAgICAgLy8gSWYgbm9uZSwgdXNlIGFuIGVtcHR5IHN0cmluZworCQlieXRlW10gYnl0ZXMgPSBwYXNzd29yZC5nZXRCeXRlcygpOwkJCQkgICAgICAgLy8gR2V0IHRoZSBieXRlcworCQlpZiAoIUFycmF5cy5lcXVhbHMoY29uZmlnLmdldFBhc3N3b3JkKCksIGJ5dGVzKSkgewkJICAgICAgIC8vIENvbXBhcmUgdG8gc3RvcmVkIHBhc3N3b3JkIGJ5dGVzIAorCQkJY2Iuc2V0TWVzc2FnZSgiUGFzc3dvcmQgaW5jb3JyZWN0Iik7CQkJICAgICAgIC8vIE5vdCBlcXVhbCEgIFNldCBtZXNzYWdlLgorCQkJdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24obmV3IEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24oKSk7CisJCX0gZWxzZSB7CisJCQljYi5zZXRNZXNzYWdlKCIiKTsJCQkJCSAgICAgICAvLyBFcXVhbCwgY2xlYXIgbWVzc2FnZQorCQkJY2Iuc2V0QXV0aGVudGljKHRydWUpOwkJCQkJICAgICAgIC8vIFlvdSBhcmUgbm93IGF1dGhlbnRpY2F0ZWQKKwkJCXJlcS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiY29uZmlnLmpzcCIpLmZvcndhcmQocmVxLCByZXMpOyAgICAgIC8vIFRvIHRoZSBjb25maWcgcGFnZSB3aXRoIHlvdSEKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Byb2R1Y3RRdWVyeVNlcnZsZXQuamF2YSBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Byb2R1Y3RRdWVyeVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTQxMWJmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvUHJvZHVjdFF1ZXJ5U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmdyaWQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5IdHRwUmVkaXJlY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuTGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUXVlcnlIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlJldHJpZXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuTGFyZ2VSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CisKKworLyoqCisgKiBQcm9kdWN0IHF1ZXJ5IHNlcnZsZXQgaGFuZGxlcyBwcm9kdWN0IHF1ZXJpZXMuICBJdCBhbHdheXMgcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcKKyAqIHByb2R1Y3QsIGlmIGFueS4gIElmIG5vIGhhbmRsZXIgY2FuIHByb3ZpZGUgYSBwcm9kdWN0LCBpdCByZXR1cm5zIDQwNCBOb3QgRm91bmQuICBJZgorICogdGhlcmUgYXJlIG5vIHF1ZXJ5IGhhbmRsZXJzLCBpdCByZXR1cm5zIDQwNCBOb3QgRm91bmQuCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFF1ZXJ5U2VydmxldCBleHRlbmRzIFF1ZXJ5U2VydmxldCB7CisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZXJ2ZXJzKENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCXJldHVybiBjb25maWcuZ2V0UHJvZHVjdFNlcnZlcnMoKTsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZVF1ZXJ5KFhNTFF1ZXJ5IHF1ZXJ5LCBMaXN0IGhhbmRsZXJzLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKwkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKwkJaWYgKGhhbmRsZXJzLmlzRW1wdHkoKSkgeworCQkJcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwgIm5vIHF1ZXJ5IGhhbmRsZXJzIGF2YWlsYWJsZSB0byBoYW5kbGUgcXVlcnkiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CQkJCQkJCQkgICAgICAgLy8gT0ssIGxldCdzIHRyeQorCQkJZm9yIChJdGVyYXRvciBpID0gaGFuZGxlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CSAgICAgICAvLyBUcnkgZWFjaCBxdWVyeSBoYW5kbGVyCisJCQkJUXVlcnlIYW5kbGVyIGhhbmRsZXIgPSAoUXVlcnlIYW5kbGVyKSBpLm5leHQoKTsJICAgICAgIC8vIEdldCB0aGUgcXVlcnkgaGFuZGxlcgorCQkJCXF1ZXJ5ID0gaGFuZGxlci5xdWVyeShxdWVyeSk7CQkJICAgICAgIC8vIEdpdmUgaXQgdGhlIHF1ZXJ5CisJCQkJaWYgKCFxdWVyeS5nZXRSZXN1bHRzKCkuaXNFbXB0eSgpKSB7CQkgICAgICAgLy8gRGlkIGl0IGdpdmUgYW55IHJlc3VsdD8KKwkJCQkJUmVzdWx0IHJlc3VsdCA9IChSZXN1bHQpIHF1ZXJ5LmdldFJlc3VsdHMoKS5nZXQoMCk7IC8vIFllcywgZ2V0IHRoZSByZXN1bHQKKwkJCQkJZGVsaXZlclJlc3VsdChoYW5kbGVyLCByZXN1bHQsIHJlcyk7CSAgICAgICAvLyBBbmQgZGVsaXZlciBpdAorCQkJCQlyZXR1cm47CQkJCQkgICAgICAgLy8gRG9uZSEKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKFByb2R1Y3RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBIdHRwUmVkaXJlY3RFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIEh0dHBSZWRpcmVjdEV4Y2VwdGlvbiBocmUgPSAoSHR0cFJlZGlyZWN0RXhjZXB0aW9uKSBleDsKKyAgICAgICAgICAgIHJlcy5zZW5kUmVkaXJlY3QoaHJlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm47CisJCX0KKworCQlyZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCAibm8gbWF0Y2hpbmcgcHJvZHVjdHMgZnJvbSBhbnkgcXVlcnkgaGFuZGxlciIpOworCX0KKworCS8qKgorCSAqIERlbGl2ZXIgYSByZXN1bHQuICBUaGlzIHN0cmVhbXMgdGhlIHByb2R1Y3QgZGF0YS4KKwkgKgorCSAqIEBwYXJhbSBoYW5kbGVyIFdoaWNoIGhhbmRsZXIgcHJvZHVjZWQgdGhlIHJlc3VsdC4KKwkgKiBAcGFyYW0gcmVzdWx0IFRoZSByZXN1bHQuCisJICogQHBhcmFtIHJlcyBUaGUgSFRUUCByZXNwb25zZSB0byB3aGljaCB0byBzZW5kIHRoZSByZXN1bHQgZGF0YS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZGVsaXZlclJlc3VsdChRdWVyeUhhbmRsZXIgaGFuZGxlciwgUmVzdWx0IHJlc3VsdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoYXJhY3Rlcml6ZShoYW5kbGVyLCByZXN1bHQsIHJlcyk7CQkJCQkgICAgICAgLy8gRmlyc3QsIGRlc2NyaWJlIGl0IHVzaW5nIEhUVFAgaGVhZGVycworCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTGFyZ2VSZXN1bHQpIHsJCQkJICAgICAgIC8vIElzIGl0IGEgbGFyZ2UgcmVzdWx0PworCQkJTGFyZ2VSZXN1bHQgbHIgPSAoTGFyZ2VSZXN1bHQpIHJlc3VsdDsJCQkgICAgICAgLy8gWWVzLCB0aGlzIGlzIGdvbm5hIHRha2Ugc29tZSBzcGVjaWFsIHdvcmsKKwkJCUxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlciBscHFoID0gKExhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcikgaGFuZGxlcjsgLy8gRmlyc3QgdHJlYXQgJ2VtIGFzIGxhcmdlCisJCQlQcm9kdWN0UmV0cmlldmVyIHJldHJpZXZlciA9IG5ldyBQcm9kdWN0UmV0cmlldmVyKGxwcWgpOyAgICAgICAvLyBMYXJnZSBvbmVzIG5lZWQgYSByZXRyaWV2ZXIKKwkJCWxyLnNldFJldHJpZXZlcihyZXRyaWV2ZXIpOwkJCQkgICAgICAgLy8gU2V0IHRoZSByZXRyaWV2ZXIKKwkJfQorCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbnVsbDsJCQkJCSAgICAgICAvLyBTdGFydCB3aXRoIG5vIGlucHV0IHN0cmVhbQorCQl0cnkgewkJCQkJCQkJICAgICAgIC8vIFRoZW4gdHJ5IC4uLgorCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyZXN1bHQuZ2V0SW5wdXRTdHJlYW0oKSk7CSAgICAgICAvLyBUbyBvcGVuIHRoZSBpbnB1dCBzdHJlYW0KKwkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOwkJCQkgICAgICAgLy8gQW5kIGEgYnl0ZSBidWZmZXIgZm9yIGRhdGEKKwkJCWludCBudW07CQkJCQkJICAgICAgIC8vIEFuZCBhIHBsYWNlIHRvIGNvdW50IGRhdGEKKwkJCXdoaWxlICgobnVtID0gaW4ucmVhZChidWYpKSAhPSAtMSkJCQkgICAgICAgLy8gV2hpbGUgd2UgcmVhZAorCQkJCXJlcy5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShidWYsIDAsIG51bSk7CSAgICAgICAvLyBXZSB3cml0ZQorCQkJcmVzLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CQkJCSAgICAgICAvLyBGbHVzaCB0byBjb21taXQgcmVzcG9uc2UKKwkJfSBmaW5hbGx5IHsJCQkJCQkJICAgICAgIC8vIEFuZCBmaW5hbGx5CisJCQlpZiAoaW4gIT0gbnVsbCkgdHJ5IHsJCQkJCSAgICAgICAvLyBJZiB3ZSBvcGVuZWQgaXQKKwkJCQlpbi5jbG9zZSgpOwkJCQkJICAgICAgIC8vIENsb3NlIGl0CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CQkJCSAgICAgICAvLyBJZ25vcmluZyBhbnkgZXJyb3IgZHVyaW5nIGNsb3NpbmcKKwkJfQkJCQkJCQkJICAgICAgIC8vIEJlY2F1c2UgY29tZSBvbiwgaXQncyBqdXN0IGNsb3NpbmchCisJfQkJCQkJCQkJCSAgICAgICAvLyBGb3IgZnNjaydzIHNha2UhCisKKwkvKioKKwkgKiBDaGFyYWN0ZXJpemUgYSByZXN1bHQgYnkgdXNpbmcgSFRUUCBoZWFkZXJzLgorCSAqCisJICogQHBhcmFtIHJlc3VsdCBSZXN1bHQgdG8gY2hhcmFjdGVyaXplLgorCSAqIEBwYXJhbSByZXMgSFRUUCByZXNwb25zZSB0byBzZXQgaGVhZGVycyBpbi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY2hhcmFjdGVyaXplKFF1ZXJ5SGFuZGxlciBoYW5kbGVyLCBSZXN1bHQgcmVzdWx0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworCQlTdHJpbmcgY29udGVudFR5cGUgPSByZXN1bHQuZ2V0TWltZVR5cGUoKTsJCQkgICAgICAgLy8gR3JhYiB0aGUgY29udGVudCB0eXBlCisJCXJlcy5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CQkJCSAgICAgICAvLyBTZXQgaXQKKwkJbG9uZyBzaXplID0gcmVzdWx0LmdldFNpemUoKTsJCQkJCSAgICAgICAvLyBHcmFiIHRoZSBzaXplCisJCWlmIChzaXplID49IDApCisJCQlyZXMuYWRkSGVhZGVyKCJDb250ZW50LUxlbmd0aCIsIFN0cmluZy52YWx1ZU9mKHNpemUpKTsJICAgICAgIC8vIERvbid0IHVzZSBzZXRDb250ZW50TGVuZ3RoKGludCkKKwkJaWYgKCFkaXNwbGF5YWJsZShjb250ZW50VHlwZSkpCQkJCQkgICAgICAgLy8gRmluYWxseSwgaWYgYSBicm93c2VyIGNhbid0IHNob3cgaXQKKwkJCXRoaXMuc3VnZ2VzdEZpbGVuYW1lKGhhbmRsZXIsIHJlc3VsdCwgcmVzKTsJCSAgICAgICAvLyBUaGVuIHN1Z2dlc3QgYSBzYXZlLWFzIGZpbGVuYW1lCisJfQorCisJLyoqCisJICogVGVsbCBpZiBhIHJlc3VsdCBpcyBkaXNwbGF5YWJsZS4gIFRoaXMgY29tcGFyZXMgaXRzIE1JTUUgdHlwZSB0byBhIGxpc3Qgb2YgTUlNRQorCSAqIHR5cGVzIGNvbW1vbmx5IGRpc3BsYXlibGUgYnkgYnJvd3NlcnMuCisJICoKKwkgKiBAcGFyYW0gY29udGVudFR5cGUgTUlNRSB0eXBlLgorCSAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGlzcGxheWFibGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgRElTUExBWUFCTEVfVFlQRVMubGVuZ3RoOyArK2kpCQkgICAgICAgLy8gRm9yIGVhY2ggZGlzcGxheWFibGUgdHlwZQorCQkJaWYgKERJU1BMQVlBQkxFX1RZUEVTW2ldLmVxdWFscyhjb250ZW50VHlwZSkpIHJldHVybiB0cnVlOyAgICAgLy8gRG9lcyBpdCBtYXRjaD8KKwkJcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICAgLy8gTm9uZSBvZiAnZW0gZG8sIGl0J3Mgbm90IGRpc3BsYXlhYmxlCisJfQorCisJLyoqCisJICogV2UgY2FuIHN1Z2dlc3QgYSBmaWxlbmFtZSAoaWYgdGhlIGNsaWVudCBoYXBwZW5zIHRvIGJlIGEgYnJvd3NlcikgdXNpbmcgYQorCSAqIGNvbnRlbnQtZGlzcG9zaXRpb24gaGVhZGVyLgorCSAqCisJICogQHBhcmFtIHJlcyBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IHZhbHVlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHN1Z2dlc3RGaWxlbmFtZShRdWVyeUhhbmRsZXIgaGFuZGxlciwgUmVzdWx0IHJlc3VsdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKwkJCisJCVN0cmluZyByZXNvdXJjZSA9IHJlc3VsdC5nZXRSZXNvdXJjZUlEKCk7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlLmxlbmd0aCgpID09IDApIHJlc291cmNlID0gInByb2R1Y3QuZGF0IjsKKwkJCisJCS8vIHN1Z2dlc3Qgc29tZSBuYW1lcyBiYXNlZCBvbiByZXNvdXJjZSBtaW1lIHR5cGUKKwkJU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVzLmdldENvbnRlbnRUeXBlKCk7CisJCQorCQkvLyAiemlwIiBtaW1lIHR5cGVzCisJCWlmIChjb250ZW50VHlwZSE9bnVsbCkgeworCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24veC1jb21wcmVzc2VkIikgfHwgCisJCQkJY29udGVudFR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIikgfHwgCisJCQkJY29udGVudFR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi96aXAiKSB8fCAKKwkJCQljb250ZW50VHlwZS5lcXVhbHMoIm11bHRpcGFydC94LXppcCIpICkgeworCQkJCQorCQkJCS8vIHJlc291cmNlID0gcmVzb3VyY2UucmVwbGFjZUFsbCgiXFwuLisiLCIuemlwIik7IC8vIHJlcGxhY2UgZXh0ZW5zaW9uIHdpdGggLnppcCAKKwkJCQlyZXNvdXJjZSA9ICJwcm9kdWN0c18iICsgcmVzb3VyY2UgKyAiLnppcCI7IAkJCQkKKwkJCX0KKwkJfQorCQkKKwkJLy8gc2V0ICJDb250ZW50LWRpc3Bvc2l0aW9uIiBoZWFkZXIKKwkJcmVzLmFkZEhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIgKyByZXNvdXJjZSArICJcIiIpOworCQkKKwl9CisKKwkvKioKKwkgKiBNSU1FIHR5cGVzIGNvbW1vbmx5IGRpc3BsYXlhYmxlIGJ5IGJyb3dzZXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERJU1BMQVlBQkxFX1RZUEVTID0geworCQkidGV4dC9wbGFpbiIsICJ0ZXh0L3JpY2h0ZXh0IiwgInRleHQvZW5yaWNoZWQiLCAidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIsICJ0ZXh0L2h0bWwiLCAidGV4dC94bWwiLCAidGV4dC9ydGYiLAorCQkibWVzc2FnZS9yZmM4MjIiLCAibWVzc2FnZS9wYXJ0aWFsIiwgIm1lc3NhZ2UvZXh0ZXJuYWwtYm9keSIsICJtZXNzYWdlL25ld3MiLCAibWVzc2FnZS9odHRwIiwKKwkJIm1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIiwgIm1lc3NhZ2UvZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uIiwgIm1lc3NhZ2Uvcy1odHRwIiwgImFwcGxpY2F0aW9uL3J0ZiIsCisJCSJhcHBsaWNhdGlvbi9wZGYiLCAiaW1hZ2UvanBlZyIsICJpbWFnZS9naWYiLCAiaW1hZ2UvdGlmZiIsICJpbWFnZS9wbmciLCAiYXVkaW8vYmFzaWMiLCAiYXVkaW8vMzJrYWRwY20iLAorCQkiYXVkaW8vbXBlZyIsICJ2aWRlby9tcGVnIiwgInZpZGVvL3F1aWNrdGltZSIKKwl9OworCisJLyoqCisJICogUmV0cmlldmVyIHRoYXQgcmV0cmlldmVzIHByb2R1Y3QgZGF0YSBvdmVyIGEgbWV0aG9kIGNhbGwgYm91bmRhcnkgdG8gYSBsYXJnZQorCSAqIHByb2R1Y3QgcXVlcnkgaGFuZGxlci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9kdWN0UmV0cmlldmVyIGltcGxlbWVudHMgUmV0cmlldmVyIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvZHVjdFJldHJpZXZlcjwvY29kZT4gaW5zdGFuY2UuCisJCSAqCisJCSAqIEBwYXJhbSBoYW5kbGVyIGEgPGNvZGU+TGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyPC9jb2RlPiB2YWx1ZS4KKwkJICovCisJCXB1YmxpYyBQcm9kdWN0UmV0cmlldmVyKExhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlciBoYW5kbGVyKSB7CisJCQl0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworCQl9CisKKwkJLyoqIHtAaW5oZXJpdERvY30gKi8KKwkJcHVibGljIGJ5dGVbXSByZXRyaWV2ZUNodW5rKFN0cmluZyBpZCwgbG9uZyBvZmZzZXQsIGludCBsZW4pIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uIHsKKwkJCXJldHVybiBoYW5kbGVyLnJldHJpZXZlQ2h1bmsoaWQsIG9mZnNldCwgbGVuKTsKKwkJfQorCisJCS8qKiB7QGluaGVyaXREb2N9ICovCisJCXB1YmxpYyB2b2lkIGNsb3NlKFN0cmluZyBpZCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworCQkJaGFuZGxlci5jbG9zZShpZCk7CisJCX0KKworCQkvKiogSGFuZGxlciB0byB1c2UuICovCisJCXByaXZhdGUgTGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyIGhhbmRsZXI7CisJfQorfQorCmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Qcm9kdWN0U2VydmVyLmphdmEgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Qcm9kdWN0U2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWQxNmZmNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Byb2R1Y3RTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmdyaWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5RdWVyeUhhbmRsZXI7CisKKy8qKgorICogQSBwcm9kdWN0IHNlcnZlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0U2VydmVyIGV4dGVuZHMgU2VydmVyIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2R1Y3RTZXJ2ZXI8L2NvZGU+IGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gU3lzdGVtIGNvbmZpZ3VyYXRpb24uCisJICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzcyBuYW1lIG9mIHF1ZXJ5IGhhbmRsZXIuCisJICovCisJcHVibGljIFByb2R1Y3RTZXJ2ZXIoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisJCXN1cGVyIChjb25maWd1cmF0aW9uLCBjbGFzc05hbWUpOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gInByb2R1Y3QiOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpIF4gMHhhYWFhYWFhYTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgJiYgb2JqIGluc3RhbmNlb2YgUHJvZHVjdFNlcnZlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlByb2R1Y3RTZXJ2ZXJbIiArIHN1cGVyLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgcXVlcnkgaGFuZGxlciBmcm9tIHRoaXMgc2VydmVyLgorCSAqCisJICogQHJldHVybiBhIDxjb2RlPlF1ZXJ5SGFuZGxlcjwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjYW4ndCBiZSBmb3VuZC4KKwkgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWYgdGhlIGhhbmRsZXIgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZiB0aGUgaGFuZGxlciBoYXMgbm8gcHVibGljIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBRdWVyeUhhbmRsZXIgY3JlYXRlUXVlcnlIYW5kbGVyKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gKFF1ZXJ5SGFuZGxlcikgY3JlYXRlSGFuZGxlcigpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Byb2ZpbGVRdWVyeVNlcnZsZXQuamF2YSBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Byb2ZpbGVRdWVyeVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YmI5NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvUHJvZmlsZVF1ZXJ5U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmdyaWQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5Qcm9maWxlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuUXVlcnlFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworCisvKioKKyAqIFByb2ZpbGUgcXVlcnkgc2VydmxldCBoYW5kbGVzIHByb2ZpbGUgcXVlcmllcy4gIEl0IHJldHVybnMgZXZlcnkgbWF0Y2hpbmcgcHJvZmlsZSBmcm9tCisgKiBldmVyeSBxdWVyeSBoYW5kbGVyIHRoYXQgcHJvdmlkZXMgbWF0Y2hpbmcgcHJvZmlsZXMuICBJZiBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLAorICogdGhlbiBpdCByZXR1cm5zIGFuIGVtcHR5ICZsdDtwcm9maWxlcyZndDsgZG9jdW1lbnQuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVRdWVyeVNlcnZsZXQgZXh0ZW5kcyBRdWVyeVNlcnZsZXQgeworCS8qKiB7QGluaGVyaXREb2N9ICovCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VydmVycyhDb25maWd1cmF0aW9uIGNvbmZpZykgeworCQlyZXR1cm4gY29uZmlnLmdldFByb2ZpbGVTZXJ2ZXJzKCk7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVRdWVyeShYTUxRdWVyeSBxdWVyeSwgTGlzdCBoYW5kbGVycywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisJCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisJCS8vIEZpbmQgaWYgdGhlIHF1ZXJ5IHNob3VsZCBiZSB0YXJnZXRlZCB0byBzcGVjaWZpYyBoYW5kbGVycy4KKwkJU2V0IGlkcyA9IG5ldyBIYXNoU2V0KCk7CisJCWlmIChxdWVyeS5nZXRGcm9tRWxlbWVudFNldCgpICE9IG51bGwpIHsKKwkJCWZvciAoSXRlcmF0b3IgaSA9IHF1ZXJ5LmdldEZyb21FbGVtZW50U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQkJUXVlcnlFbGVtZW50IHFlID0gKFF1ZXJ5RWxlbWVudCkgaS5uZXh0KCk7CisJCQkJaWYgKCJoYW5kbGVyIi5lcXVhbHMocWUuZ2V0Um9sZSgpKSAmJiBxZS5nZXRWYWx1ZSgpICE9IG51bGwpCisJCQkJCWlkcy5hZGQocWUuZ2V0VmFsdWUoKSk7CisJCQl9CisJCX0KKwkJCisJCXJlcy5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsJCQkJCSAgICAgICAvLyBYTUwsIGNvbWluJyBhdCB5YQorCQlyZXMuZ2V0V3JpdGVyKCkucHJpbnRsbigiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4iKTsgICAgIC8vIFVURi04IG5vIGxlc3MuICBCb28teWEuCisJCXJlcy5nZXRXcml0ZXIoKS5wcmludGxuKCI8IURPQ1RZUEUgcHJvZmlsZXMgUFVCTElDICciCQkgICAgICAgLy8gR2V0IGEgZG9jdHlwZSBpbiB0aGVyZSBmb3IgdGhlIGhpZ2hseSAuLi4KKwkJCSsgUHJvZmlsZS5QUk9GSUxFU19EVERfRlBJICsgIicgJyIJCQkgICAgICAgLy8gLi4uIGFuYWwgLi4uCisJCQkrIFByb2ZpbGUuUFJPRklMRVNfRFREX1VSTCArICInPiIpOwkJICAgICAgICAgICAgICAgLy8gLi4uIHJldGVudGl2ZS4KKwkJcmVzLmdldFdyaXRlcigpLnByaW50bG4oIjxwcm9maWxlcz4iKTsJCQkJICAgICAgIC8vIFN0YXJ0IHRhZyBmb3IgdGhlIHdob2xlIC9zYmluL2ZzY2sgbWVzcworCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG51bGw7CQkJCQkgICAgICAgLy8gU3RhcnQgb3V0IHcvbm8gdHJhbnNmb3JtZXIgYW5kIG5vIGRvYworCQlEb2N1bWVudCBkb2MgPSBudWxsOwkJCQkJCSAgICAgICAvLyBEb24ndCBtYWtlICdlbSBpZiB3ZSBkb24ndCBuZWVkICdlbQorCQlib29sZWFuIHNlbnRBdExlYXN0T25lID0gZmFsc2U7CQkJCQkgICAgICAgLy8gVHJhY2sgaWYgd2Ugc2VuZCBhbnkgcHJvZmlsZXMgYXQgYWxsCisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwkJCQkJICAgICAgIC8vIEFuZCBzYXZlIGFueSBleGNlcHRpb24KKwkJZm9yIChJdGVyYXRvciBpID0gaGFuZGxlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB0cnkgewkgICAgICAgLy8gVG8gaXRlcmF0ZSBvdmVyIGVhY2ggaGFuZGxlcgorCQkJUHJvZmlsZUhhbmRsZXIgaGFuZGxlciA9IChQcm9maWxlSGFuZGxlcikgaS5uZXh0KCk7ICAgICAgICAgICAgLy8gR2V0IHRoZSBoYW5kbGVyCisJCQlTdHJpbmcgaWQgPSBoYW5kbGVyLmdldElEKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIElELCBhbmQgaWYgdGFyZ2V0aW5nIHRvIElEcworCQkJaWYgKCFpZHMuaXNFbXB0eSgpICYmICFpZHMuY29udGFpbnMoaWQpKSBjb250aW51ZTsgICAgICAgICAgICAgLy8gLi4uIGFuZCBpdCdzIG5vdCBvbmUgd2Ugd2FudCwgc2tpcCBpdC4KKwkJCUxpc3QgcmVzdWx0cyA9IGhhbmRsZXIuZmluZFByb2ZpbGVzKHF1ZXJ5KTsgICAgICAgICAgICAgICAgICAgIC8vIEhhdmUgaXQgZmluZCBwcm9maWxlcworCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCkgcmVzdWx0cyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7ICAgICAgICAgLy8gQXNzdW1lIG5vdGhpbmcKKwkJCWZvciAoSXRlcmF0b3IgaiA9IHJlc3VsdHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7ICAgICAgICAgIC8vIEZvciBlYWNoIG1hdGNoaW5nIHByb2ZpbGUKKwkJCQlQcm9maWxlIHByb2ZpbGUgPSAoUHJvZmlsZSkgai5uZXh0KCk7CSAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJvZmlsZQorCQkJCWlmICh0cmFuc2Zvcm1lciA9PSBudWxsKSB7CQkgICAgICAgICAgICAgICAvLyBObyB0cmFuc2Zvcm1lci9kb2MgeWV0PworCQkJCQl0cmFuc2Zvcm1lciA9IGNyZWF0ZVRyYW5zZm9ybWVyKCk7ICAgICAgICAgICAgIC8vIFRoZW4gbWFrZSB0aGUgdHJhbnNmb3JtZXIKKwkJCQkJZG9jID0gUHJvZmlsZS5jcmVhdGVQcm9maWxlRG9jdW1lbnQoKTsgICAgICAgICAvLyBBbmQgdGhlIGRvYworCQkJCX0JCQkJCSAgICAgICAgICAgICAgIC8vIEFuZCB1c2UgdGhlIGRvYyAuLi4KKwkJCQlOb2RlIHByb2ZpbGVOb2RlID0gcHJvZmlsZS50b1hNTChkb2MpOwkgICAgICAgICAgICAgICAvLyBUbyByZW5kZXIgdGhlIHByb2ZpbGUgaW50byBYTUwKKwkJCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShwcm9maWxlTm9kZSk7ICAgICAgICAgLy8gQW5kIHRoZSBYTUwgYmVjb21lcyBpcyBzb3VyY2UKKwkJCQlTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChyZXMuZ2V0V3JpdGVyKCkpOyAvLyBBbmQgdGhlIHJlc3BvbnNlIGlzIGEgcmVzdWx0CisJCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsJICAgICAgICAgICAgICAgLy8gQW5kIHNlcmlhbGl6ZSBpbnRvIGdsb3Jpb3VzIHRleHQKKwkJCQlzZW50QXRMZWFzdE9uZSA9IHRydWU7CQkJCSAgICAgICAvLyBPSywgd2UgZ290IGF0IGxlYXN0IG9uZSBvdXQgdGhlIGRvbworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsJCQkJCSAgICAgICAvLyBVaCBvaAorCQkJZXhjZXB0aW9uID0gZXg7CQkJCQkJICAgICAgIC8vIE9LLCBqdXN0IGhvbGQgb250byBpdCBmb3Igbm93CisJCX0KKwkJaWYgKCFzZW50QXRMZWFzdE9uZSAmJiBleGNlcHRpb24gIT0gbnVsbCkgewkJCSAgICAgICAvLyBHb3Qgbm9uZSBvdXQgdGhlIGRvb3IgYW5kIGhhZCBhbiBlcnJvcj8KKwkJCXJlcy5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsICAgIC8vIFRoZW4gd2UgY2FuIHJlcG9ydCBpdC4KKwkJCQlleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEhvd2V2ZXIsIGlmIHdlIGdldCBoZXJlLCB3ZSBnb3QgYXQgbGVhc3Qgb25lIHByb2ZpbGUgb3V0IHRoZSBkb29yLiBJbgorCQkvLyB0aGF0IGNhc2UsIGhpZGUgYW55IGVycm9yIHRoYXQgbWlnaHQndmUgb2NjdXJyZWQgZnJvbSBzdWJzZXF1ZW50CisJCS8vIGhhbmRsZXJzLiAgKE9yLCBpZiB3ZSBnZXQgaGVyZSwgdGhlcmUgd2VyZSBubyBlcnJvcnMuICBZYXkuKQorCQlyZXMuZ2V0V3JpdGVyKCkucHJpbnRsbigiPC9wcm9maWxlcz4iKTsJCQkJICAgICAgIC8vIEVuZCB0YWcgZm9yIHRoZSB3aG9sZSBmc2NrJ24gbWVzcworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIHRyYW5zZm9ybWVyLCBwcm9wZXJseSBjb25maWd1cmVkIGZvciBYTUwgdGV4dCBzZXJpYWxpemF0aW9uLgorCSAqCisJICogQHJldHVybiBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB2YWx1ZS4KKwkgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBUcmFuc2Zvcm1lciBjcmVhdGVUcmFuc2Zvcm1lcigpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOworCQlzeW5jaHJvbml6ZWQgKFRSQU5TRk9STUVSX0ZBQ1RPUlkpIHsKKwkJCXRyYW5zZm9ybWVyID0gVFJBTlNGT1JNRVJfRkFDVE9SWS5uZXdUcmFuc2Zvcm1lcigpOworCQl9CisJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7CisJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuVkVSU0lPTiwgIjEuMCIpOworCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKKwkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOworCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlNUQU5EQUxPTkUsICJubyIpOworCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FRElBX1RZUEUsICJ0ZXh0L3htbCIpOworCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOworCisJCXJldHVybiB0cmFuc2Zvcm1lcjsKKwl9CisKKwkvKiogU29sZSB0cmFuc2Zvcm1lciBmYWN0b3J5IHRoaXMgY2xhc3Mgd2lsbCBldmVyIG5lZWQuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXJGYWN0b3J5IFRSQU5TRk9STUVSX0ZBQ1RPUlkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvUHJvZmlsZVNlcnZlci5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvUHJvZmlsZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyNzNmYTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Qcm9maWxlU2VydmVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5ncmlkOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXI7CisKKy8qKgorICogQSBwcm9maWxlIHNlcnZlci4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZmlsZVNlcnZlciBleHRlbmRzIFNlcnZlciB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2ZpbGVTZXJ2ZXI8L2NvZGU+IGluc3RhbmNlLgorICAgKiAKKyAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KKyAgICogICAgICAgICAgU3lzdGVtIGNvbmZpZ3VyYXRpb24uCisgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICogICAgICAgICAgQ2xhc3MgbmFtZSBvZiBwcm9maWxlIGhhbmRsZXIuCisgICAqLworICBwdWJsaWMgUHJvZmlsZVNlcnZlcihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICBzdXBlcihjb25maWd1cmF0aW9uLCBjbGFzc05hbWUpOworICB9CisKKyAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlKCkgeworICAgIHJldHVybiAicHJvZmlsZSI7CisgIH0KKworICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpIF4gMHg1NTU1NTU1NTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopICYmIG9iaiBpbnN0YW5jZW9mIFByb2ZpbGVTZXJ2ZXI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiUHJvZmlsZVNlcnZlclsiICsgc3VwZXIudG9TdHJpbmcoKSArICJdIjsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBxdWVyeSBoYW5kbGVyIGZyb20gdGhpcyBzZXJ2ZXIuCisgICAqIAorICAgKiBAcmV0dXJuIGEgPGNvZGU+UHJvZmlsZUhhbmRsZXI8L2NvZGU+IHZhbHVlLgorICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIHRoZSBjbGFzcyBjYW4ndCBiZSBmb3VuZC4KKyAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAqICAgICAgICAgICBpZiB0aGUgaGFuZGxlciBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuCisgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgdGhlIGhhbmRsZXIgaGFzIG5vIHB1YmxpYyBjb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBQcm9maWxlSGFuZGxlciBjcmVhdGVQcm9maWxlSGFuZGxlcigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChQcm9maWxlSGFuZGxlcikgY3JlYXRlSGFuZGxlcigpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9RdWVyeVNlcnZsZXQuamF2YSBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1F1ZXJ5U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzYTdhZDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9RdWVyeVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5ncmlkOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CisKKy8qKgorICogUXVlcnkgc2VydmxldCBwcm92aWRlcyBjb21tb24gcXVlcnkgZnVuY3Rpb25hbGl0eSBmb3IgcHJvZmlsZSBxdWVyaWVzIGFuZCBwcm9kdWN0CisgKiBxdWVyaWVzLiAgSXQgdHJlYXRzIEdFVHMgYXMgUE9TVHMsIHJldHJpZXZlcyB0aGUgY29tcGxldGUgWE1MUXVlcnkgKGlmIHRoZQorICogPGNvZGU+eG1scTwvY29kZT4gcmVxdWVzdCBwYXJhbWV0ZXIgYXBwZWFycykgb3IgY29uc3RydWN0cyBhIG5ldyBYTUxRdWVyeSAodXNpbmcgdGhlCisgKiA8Y29kZT5xPC9jb2RlPiByZXF1ZXN0IHBhcmFtZXRlciwgd2hpY2ggY29udGFpbnMganVzdCBhIHF1ZXJ5IGV4cHJlc3Npb24pLCB1cGRhdGVzCisgKiBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIGhhbmRsZXJzLCBpbnN0YW50aWF0ZXMgYW55IG5ldyBoYW5kbGVycywgYW5kIHRoZW4gcnVucyB0aGUKKyAqIHF1ZXJ5LgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFF1ZXJ5U2VydmxldCBleHRlbmRzIEdyaWRTZXJ2bGV0IHsKKwkvKioKKwkgKiBHZXQgYSBsaXN0IG9mIHtAbGluayBTZXJ2ZXJ9cyB0aGF0IHdpbGwgcHJvdmlkZSBoYW5kbGVycyB0byBoYW5kbGUgdGhlIHF1ZXJ5LgorCSAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IHRoaXMgYnkgcmV0dXJuaW5nIGEgbGlzdCBvZiBlaXRoZXIge0BsaW5rIFByb2R1Y3RTZXJ2ZXJ9cworCSAqIG9yIHtAbGluayBQcm9maWxlU2VydmVyfXMuCisJICoKKwkgKiBAcGFyYW0gY29uZmlnIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gdmFsdWUuCisJICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IHZhbHVlIG9mIHtAbGluayBTZXJ2ZXJ9cyBvZiBzb21lIGtpbmQuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgZ2V0U2VydmVycyhDb25maWd1cmF0aW9uIGNvbmZpZyk7CisKKwkvKioKKwkgKiBIYW5kbGUgdGhlIHF1ZXJ5LiAgU3ViY2xhc3NlcyBpbXBsZW1lbnQgdGhpcyBieSBwYXJzaW5nIHRoZSBxdWVyeSBhbmQgcmV0dXJuaW5nCisJICogc29tZSByZXN1bHRzLgorCSAqCisJICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGUuCisJICogQHBhcmFtIGhhbmRsZXJzIEEgbGlzdCBvZiBlaXRoZXIgcHJvZHVjdCA8Y29kZT5RdWVyeUhhbmRsZXI8L2NvZGU+cyBvciBwcm9maWxlIDxjb2RlPlByb2ZpbGVIYW5kbGVyPC9jb2RlPnMuCisJICogQHBhcmFtIHJlcSBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHJlcyBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IHZhbHVlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVRdWVyeShYTUxRdWVyeSBxdWVyeSwgTGlzdCBoYW5kbGVycywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisJCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFRyZWF0IEdFVHMgYXMgUE9TVHMuCisJICoKKwkgKiBAcGFyYW0gcmVxIGEgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gcmVzIGEgPGNvZGU+SHR0cFNlcnZsZXRSZXNwb25zZTwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKwkJZG9Qb3N0KHJlcSwgcmVzKTsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGUgdGhlIHF1ZXJ5LgorCSAqCisJICogQHBhcmFtIHJlcSBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHJlcyBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IHZhbHVlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCQl0cnkgeworCQkJWE1MUXVlcnkgcXVlcnkgPSBnZXRRdWVyeShyZXEsIHJlcyk7CQkJICAgICAgIC8vIEdldCB0aGUgcXVlcnkKKwkJCWlmIChxdWVyeSA9PSBudWxsKSByZXR1cm47CQkJCSAgICAgICAvLyBObyBxdWVyeT8gTXkgZmF2b3JpdGUgY2FzZSwgcmlnaHQgaGVyZSEKKworCQkJQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7CQkgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisJCQl1cGRhdGVQcm9wZXJ0aWVzKGNvbmZpZyk7CQkJCSAgICAgICAvLyBVc2luZyBpdCwgdXBkYXRlIHRoZSBzeXN0ZW0gcHJvcGVydGllcworCQkJdXBkYXRlSGFuZGxlcnMoZ2V0U2VydmVycyhjb25maWcpKTsJCQkgICAgICAgLy8gQW5kIGFueSBzZXJ2ZXJzLgorCisJCQlMaXN0IGhhbmRsZXJPYmplY3RzID0gbmV3IEFycmF5TGlzdChoYW5kbGVycy5zaXplKCkpOwkgICAgICAgLy8gU3RhcnQgd2l0aCBubyBoYW5kbGVycy4KKwkJCWZvciAoSXRlcmF0b3IgaSA9IGhhbmRsZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewkgICAgICAgLy8gRm9yIGVhY2ggc2VydmVyCisJCQkJSW5zdGFudGllZEhhbmRsZXIgaWggPSAoSW5zdGFudGllZEhhbmRsZXIpIGkubmV4dCgpOyAgIC8vIEdldCBpdHMgaGFuZGxlcgorCQkJCWhhbmRsZXJPYmplY3RzLmFkZChpaC5nZXRIYW5kbGVyKCkpOwkJICAgICAgIC8vIEFkZCBpdHMgaGFuZGxlcgorCQkJfQorCQkJaGFuZGxlUXVlcnkocXVlcnksIGhhbmRsZXJPYmplY3RzLCByZXEsIHJlcyk7CQkgICAgICAgLy8gSGFuZGxlcnM6IGhhbmRsZSBxdWVyeSwgcGxlYXNlCisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IGV4OworCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGV4KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEdldCB0aGUgcXVlcnkgZnJvbSBhbiBIVFRQIHJlcXVlc3QuICBUaGUgcmVxdWVzdCBtdXN0IGhhdmUgZWl0aGVyIGEKKwkgKiA8Y29kZT54bWxxPC9jb2RlPiBwYXJhbWV0ZXIgKHdoaWNoIGlzIGdpdmVuIHByaW9yaXR5KSBvciBhIDxjb2RlPnE8L2NvZGU+CisJICogcGFyYW1ldGVyLiAgV2UgZXhwZWN0IDxjb2RlPnhtbHE8L2NvZGU+IHRvIGNvbnRhaW4gdGhlIFhNTCB0ZXh0IGZvcm1hdCBvZiBhbgorCSAqIFhNTFF1ZXJ5IG9iamVjdC4gIDxjb2RlPnE8L2NvZGU+IGNhbiBjb250YWluIGp1c3QgdGhlIHF1ZXJ5IGV4cHJlc3Npb24sIGZyb20KKwkgKiB3aGljaCB3ZSdsbCBjb25zdHJ1Y3QgYSBmcmVzaCA8Y29kZT5YTUxRdWVyeTwvY29kZT4gd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLgorCSAqIElmIHRoZSB1c2VyIHNwZWNpZmllcyB0aGUgPGNvZGU+cTwvY29kZT4gcGFyYW1hdGVyLCB3ZSdsbCB0cmVhdCBpdCBhcyBhIHBhcnNlZAorCSAqIHF1ZXJ5LCBsZXR0aW5nIHRoZSBYTUxRdWVyeSBjbGFzcyBwYXJzZSBpdCBhbmQgYnVpbGQgaXRzIHZhcmlvdXMgZXhwcmVzc2lvbgorCSAqIHN0YWNrcyBhY2NvcmRpbmcgdG8gdGhlIERJUyBzeW50YXguICBUaGUgdXNlciBjYW4gc3BlY2lmeSB0aGUgPGNvZGU+dW5wPC9jb2RlPgorCSAqIHBhcmFtZXRlciB0byBjb250cm9sIHRoaXMgYmVoYXZpb3IsIHRob3VnaC4gIFNldCB0byB0aGUgc3RyaW5nCisJICogPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIHdlJ2xsIHRyZWF0IHRoZSBxdWVyeSBhcyA8ZW0+dW5wYXJzZWQ8L2VtPiwgYW5kIHRoZQorCSAqIFhNTFF1ZXJ5IGNsYXNzIHNob3VsZCBsZWF2ZSBpdCBhbG9uZS4gIE90aGVyd2lzZSwgYW4gb3RoZXIgdmFsdWUgKG9yCisJICogdW5zcGVjaWZpZWQpIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBtZWFuaW5nIHRoZSBxdWVyeSB3aWxsCisJICogYmUgcGFyc2VkLgorCSAqCisJICogQHBhcmFtIHJlcSBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHJlcyBhIDxjb2RlPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IHZhbHVlLgorCSAqIEByZXR1cm4gYSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHJvdGVjdGVkIFhNTFF1ZXJ5IGdldFF1ZXJ5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgeG1scSA9IHJlcS5nZXRQYXJhbWV0ZXIoInhtbHEiKTsJCQkJICAgICAgIC8vIEdyYWIgYW55IHhtbHEKKwkJU3RyaW5nIHEgPSByZXEuZ2V0UGFyYW1ldGVyKCJxIik7CQkJCSAgICAgICAvLyBHcmFiIGFueSBxCisJCVN0cmluZyB1bnAgPSByZXEuZ2V0UGFyYW1ldGVyKCJ1bnAiKTsJCQkJICAgICAgIC8vIEFuZCBncmFiIGFueSB1bnAgKHByb25vdW5jZWQgInVucCIpCisJCWlmICh4bWxxID09IG51bGwpIHhtbHEgPSAiIjsJCQkJCSAgICAgICAvLyBObyB4bWxxPyAgVXNlIGVwc2lsb24KKwkJaWYgKHEgPT0gbnVsbCkgcSA9ICIiOwkJCQkJCSAgICAgICAvLyBObyBxPyAgVXNlIGxhbWJkYQorCQlpZiAodW5wID09IG51bGwpIHVucCA9ICIiOwkJCQkJICAgICAgIC8vIFVzZSBzb21lIG90aGVyIGdyZWVrIGxldHRlciBmb3IgZW1wdHkgc3RyCisJCVN0cmluZ1tdIG1pbWVzID0gcmVxLmdldFBhcmFtZXRlclZhbHVlcygibWltZSIpOwkJICAgICAgIC8vIEdyYWIgYW55IG1pbWVzCisJCWlmIChtaW1lcyA9PSBudWxsKSBtaW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTsJCQkgICAgICAgLy8gTm9uZT8gIFVzZSBlbXB0eSBhcnJheQorCisJCWlmICh4bWxxLmxlbmd0aCgpID4gMCkgdHJ5IHsJCQkJCSAgICAgICAvLyBXYXMgdGhlcmUgYW4geG1scT8KKwkJCXJldHVybiBuZXcgWE1MUXVlcnkoeG1scSk7CQkJCSAgICAgICAvLyBVc2UgaXQgaW4gaXRzIGVudGlyZXR5LCBpZ25vcmluZyB0aGUgcmVzdAorCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsJCQkJCSAgICAgICAvLyBDYW4ndCBwYXJzZSBpdD8KKwkJCXJlcy5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwJICAgICAgIC8vIFRoZW4gdGhhdCdzIGEgYmFkIC4uLgorCQkJCSJjYW5ub3QgcGFyc2UgeG1scTogIiArIGV4LmdldE1lc3NhZ2UoKSk7CSAgICAgICAvLyAuLi4gcmVxdWVzdCwgd2hpY2ggSSBoYXRlCisJCQlyZXR1cm4gbnVsbDsJCQkJCQkgICAgICAgLy8gc28gZmxhZyBpdCB3aXRoIGEgbnVsbAorCQl9IGVsc2UgaWYgKHEubGVuZ3RoKCkgPiAwKSB7CQkJCQkgICAgICAgLy8gV2FzIHRoZXJlIGEgcT8KKwkJCWJvb2xlYW4gdW5wYXJzZWQgPSAidHJ1ZSIuZXF1YWxzKHVucCk7CQkJICAgICAgIC8vIElmIHNvLCB3YXMgdGhlcmUgYWxzbyBhbiB1bnA/CisJCQlyZXR1cm4gbmV3IFhNTFF1ZXJ5KHEsICJ3Z3EiLCAiV2ViIEdyaWQgUXVlcnkiLAkJICAgICAgIC8vIFVzZSBpdCB0byBtYWtlIGFuIFhNTFF1ZXJ5CisJCQkJIlF1ZXJ5IGZyb20gV2ViLUdyaWQiLCAvKmRkSUQqL251bGwsICAgICAgICAgICAgICAgICAgIC8vIEFuZCBhbGwgb2YgdGhlc2UgZXh0cmEKKwkJCQkvKnJlc3VsdE1vZGVJZCovbnVsbCwgLypwcm9wVHlwZSovbnVsbCwgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVycyByZWFsbHkgYW5ub3kKKwkJCQkvKnByb3BMZXZlbHMqL251bGwsIC8qbWF4UmVzdWx0cyovSW50ZWdlci5NQVhfVkFMVUUsICAgLy8gdGhlIHBvb3Agb3V0IG9mIG1lCisJCQkJQXJyYXlzLmFzTGlzdChtaW1lcyksICF1bnBhcnNlZCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MganVzdCBhIHF1ZXJ5IGZvciAvc2Jpbi9mc2NrIHNha2UhCisJCX0KKworCQlyZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsICJ4bWxxIG9yIHEgcGFyYW1ldGVycyByZXF1aXJlZCIpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHF1ZXJ5IGhhbmRsZXJzIGluc3RhbnRpYXRlZC4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXJzIGEgPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIFNlcnZlcn1zLgorCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIGNsYXNzIGNhbid0IGJlIGZvdW5kLgorCSAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiBhIGNsYXNzIGNhbid0IGJlIGluc3RhbnRpYXRlZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgYSBjb25zdHJ1Y3RvciBpc24ndCBwdWJsaWMuCisJICovCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVIYW5kbGVycyhMaXN0IHNlcnZlcnMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorCQlJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKwkJZWFjaFNlcnZlcjoKKwkJZm9yIChJdGVyYXRvciBpID0gc2VydmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsJCSAgICAgICAvLyBGb3IgZWFjaCBzZXJ2ZXIKKwkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpLm5leHQoKTsJCQkgICAgICAgLy8gR3JhYiB0aGUgc2VydmVyCisJCQlmb3IgKEl0ZXJhdG9yIGogPSBoYW5kbGVycy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsJICAgICAgIC8vIEZvciBlYWNoIGhhbmRsZXIKKwkJCQlJbnN0YW50aWVkSGFuZGxlciBoYW5kbGVyID0gKEluc3RhbnRpZWRIYW5kbGVyKSBqLm5leHQoKTsgLy8gR3JhYiB0aGUgaGFuZGxlcgorCQkJCWlmIChoYW5kbGVyLmdldFNlcnZlcigpLmVxdWFscyhzZXJ2ZXIpKQkJICAgICAgIC8vIEhhdmUgd2UgYWxyZWFkeSBpbnN0YW50aWF0ZWQ/CisJCQkJCWNvbnRpbnVlIGVhY2hTZXJ2ZXI7CQkJICAgICAgIC8vIFllcywgdHJ5IHRoZSBuZXh0IHNlcnZlcgorCQkJfQorCQkJSW5zdGFudGllZEhhbmRsZXIgaGFuZGxlcgkJCQkgICAgICAgLy8gTm8uICBDcmVhdGUgLi4uCisJCQkJPSBuZXcgSW5zdGFudGllZEhhbmRsZXIoc2VydmVyLCBzZXJ2ZXIuY3JlYXRlSGFuZGxlcigpKTsgLy8gLi4uIGEgZnJlc2ggaGFuZGxlcgorCQkJaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwkJCQkJICAgICAgIC8vIFNhdmUgaXQKKwkJfQorCisJCWZvciAoSXRlcmF0b3IgaSA9IGhhbmRsZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewkJICAgICAgIC8vIE5vdywgZm9yIGVhY2ggaGFuZGxlcgorCQkJSW5zdGFudGllZEhhbmRsZXIgaGFuZGxlciA9IChJbnN0YW50aWVkSGFuZGxlcikgaS5uZXh0KCk7ICAgICAgLy8gR3JhYiB0aGUgaGFuZGxlcgorCQkJaWYgKCFzZXJ2ZXJzLmNvbnRhaW5zKGhhbmRsZXIuZ2V0U2VydmVyKCkpKQkJICAgICAgIC8vIERvZXMgaXRzIHNlcnZlciBzdGlsbCBleGlzdD8KKwkJCQlpLnJlbW92ZSgpOwkJCQkJICAgICAgIC8vIElmIG5vdCwgcmVtb3ZlIHRoZSBoYW5kbGVyCisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgc3lzdGVtIHByb3BlcnRpZXMgdXNlZCBieSBxdWVyeSBoYW5kbGVycywgaWYgYW55IGhhdmUgY2hhbmdlZC4KKwkgKgorCSAqIEBwYXJhbSBjb25maWcgYSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiB2YWx1ZS4KKwkgKi8KKwlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewkJCQkJICAgICAgIC8vIEFueSBvbGQgcHJvcGVydGllcz8KKwkJCWlmIChwcm9wZXJ0aWVzLmVxdWFscyhjb25maWcuZ2V0UHJvcGVydGllcygpKSkgcmV0dXJuOwkgICAgICAgLy8gWWVzLCBhbnkgY2hhbmdlcz8gIE5vPyAgVGhlbiBkb25lLgorCQkJZm9yIChJdGVyYXRvciBpID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCS8vIFllcywgdGhlbiBncmFiIGVhY2ggb2xkIHNldHRpbmcKKwkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShpLm5leHQoKSk7CSAgICAgICAvLyBhbmQgcmVtb3ZlIGl0LgorCQl9CisJCXByb3BlcnRpZXMgPSAoUHJvcGVydGllcykgY29uZmlnLmdldFByb3BlcnRpZXMoKS5jbG9uZSgpOwkgICAgICAgLy8gTm93IGNvcHkgdGhlIG5ldyBzZXR0aW5ncworCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dEFsbChwcm9wZXJ0aWVzKTsJCQkgICAgICAgLy8gQW5kIHNldCB0aGVtIQorCX0KKworCS8qKgorCSAqIEluc3RhbnRpYXRlZCBxdWVyeSBoYW5kbGVycy4KKwkgKgorCSAqIFRoZXNlIGFyZSBlaXRoZXIgPGNvZGU+UHJvZmlsZUhhbmRsZXI8L2NvZGU+cyBvciBwcm9kdWN0IDxjb2RlPlF1ZXJ5SGFuZGxlcjwvY29kZT5zLgorCSAqLworCXByb3RlY3RlZCBMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisJLyoqIEN1cnJlbnQgc2V0dGluZ3Mgb2Ygc3lzdGVtIHByb3BlcnRpZXMuICovCisJcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKKwkvKioKKwkgKiBBbiBpbnN0YW50aWF0ZWQgaGFuZGxlci4gIFRoaXMgaXMgYSA8Y29kZT5Qcm9maWxlSGFuZGxlcjwvY29kZT4gb3IgYSBwcm9kdWN0CisJICogPGNvZGU+UXVlcnlIYW5kbGVyPC9jb2RlPiBhbG9uZyB3aXRoIHRoZSB7QGxpbmsgU2VydmVyfSB0aGF0IGRlZmluZWQgaXQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5zdGFudGllZEhhbmRsZXIgeworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbnN0YW50aWVkSGFuZGxlcjwvY29kZT4gaW5zdGFuY2UuCisJCSAqCisJCSAqIEBwYXJhbSBzZXJ2ZXIgYSA8Y29kZT5TZXJ2ZXI8L2NvZGU+LgorCQkgKiBAcGFyYW0gaGFuZGxlciBhIDxjb2RlPlByb2ZpbGVIYW5kbGVyPC9jb2RlPiBvciBhIHByb2R1Y3QgPGNvZGU+UXVlcnlIYW5kbGVyPC9jb2RlPi4KKwkJICovCisJCUluc3RhbnRpZWRIYW5kbGVyKFNlcnZlciBzZXJ2ZXIsIE9iamVjdCBoYW5kbGVyKSB7CisJCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJCXRoaXMuaGFuZGxlciA9IGhhbmRsZXI7CisJCX0KKworCQkvKioKKwkJICogR2V0IHRoZSBzZXJ2ZXIgdGhhdCBkZWZpbmVkIHRoaXMgaGFuZGxlci4KKwkJICoKKwkJICogQHJldHVybiBhIDxjb2RlPlNlcnZlcjwvY29kZT4gdmFsdWUuCisJCSAqLworCQlwdWJsaWMgU2VydmVyIGdldFNlcnZlcigpIHsKKwkJCXJldHVybiBzZXJ2ZXI7CisJCX0KKworCQkvKioKKwkJICogR2V0IHRoZSBoYW5kbGVyLgorCQkgKgorCQkgKiBAcmV0dXJuIGEgPGNvZGU+UHJvZmlsZUhhbmRsZXI8L2NvZGU+IG9yIGEgcHJvZHVjdCA8Y29kZT5RdWVyeUhhbmRsZXI8L2NvZGU+LgorCQkgKi8KKwkJcHVibGljIE9iamVjdCBnZXRIYW5kbGVyKCkgeworCQkJcmV0dXJuIGhhbmRsZXI7CisJCX0KKworCQkvKiogU2VydmVyIHRoYXQgZGVmaW5lcyB0aGUgaGFuZGxlci4gKi8KKwkJcHJpdmF0ZSBTZXJ2ZXIgc2VydmVyOworCisJCS8qKiBBIDxjb2RlPlByb2ZpbGVIYW5kbGVyPC9jb2RlPiBvciBhIHByb2R1Y3QgPGNvZGU+UXVlcnlIYW5kbGVyPC9jb2RlPiAqLworCQlwcml2YXRlIE9iamVjdCBoYW5kbGVyOworCX0KKworCS8qKiBTbyB3ZSBkb24ndCBjcmVhdGUgYSBidW5jaCBvZiBlbXB0eSBzdHJpbmcgYXJyYXlzLCBoZXJlJ3MgdGhlIG9ubHkgb25lIHdlJ2xsIGV2ZXIgbmVlZC4gKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvUmVzdGZ1bFByb2R1Y3RRdWVyeVNlcnZsZXQuamF2YSBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Jlc3RmdWxQcm9kdWN0UXVlcnlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYjYyNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1Jlc3RmdWxQcm9kdWN0UXVlcnlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZ3JpZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCisvKioKKyAqIFRoZSB7QGxpbmsgUmVzdGZ1bFByb2R1Y3RRdWVyeVNlcnZsZXR9IGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzdGFuZGFyZCB7QGxpbmsgUHJvZHVjdFF1ZXJ5U2VydmxldH0gCisgKiB0aGF0IGFsbG93cyBjbGllbnRzIHRvIHVzZSBhIG1vcmUgaW50dWl0aXZlIHN5bnRheCBmb3IgZW5jb2RpbmcgcXVlcnkgY29uc3RyYWludHMsIHRoYW4gdGhlIHRyYWRpdGlvbmFsCisgKiBESVMtc3R5bGUgc3ludGF4LiAKKyAqIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIGVuY29kaW5nIGEgcmVxdWVzdCBhczogCisgKiAiP3E9aWRlbnRpZmllcitFUSt1cm46bmFzYTpwZHM6cGh4X2xpZGFyOnJlZHVjZWQ6TFMwNzVSTFNfMDA5MDI4MzU4OTRfMTg4NU0xK0FORCtwYWNrYWdlK0VRK1RHWiIKKyAqIGEgY2xpZW50IGNvdWxkIGVuY29kZSBpdCBhczoKKyAqICI/aWRlbnRpZmllcj11cm46bmFzYTpwZHM6cGh4X2xpZGFyOnJlZHVjZWQ6TFMwNzVSTFNfMDA5MDI4MzU4OTRfMTg4NU0xJnBhY2thZ2U9VEdaIi4KKyAqIE5vdGUgdGhhdCB0aGlzIHNlcnZsZXQgaXMgbWVhbnQgdG8gYmUgYmFjay13YXJkIGNvbXBhdGlibGUsIGkuZS4gaXQgd2lsbCBmaXJzdCBwcm9jZXNzIGEgcmVxdWVzdCBieQorICogcGFyc2luZyB0aGUgInhtbHE9IiBhbmQgInE9IiBwYXJhbWV0ZXJzLiBJZiB0aG9zZSBhcmUgbm90IGZvdW5kLCBpdCB3aWxsIGJ1aWxkIGEgcmVxdWVzdCBieSBjb21iaW5pbmcgCisgKiBhbGwgdGhlIGF2YWlsYWJsZSBIVFRQIHBhcmFtZXRlcnMgaW4gbG9naWNhbCBBTkQuCisgKiBOb3RlIGFsc28gdGhhdCB0aGlzIHNlcnZsZXQgaXMgTk9UIGVuYWJsZWQgYnkgZGVmYXVsdCAKKyAqIChpLmUuIGl0IG11c3QgYmUgZXhwbGljaXRseSBjb25maWd1cmVkIGJ5IGNoYW5naW5nIHRoZSB3ZWItZ3JpZCBkZXBsb3ltZW50IGRlc2NyaXB0b3Igd2ViLnhtbCkuCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIFJlc3RmdWxQcm9kdWN0UXVlcnlTZXJ2bGV0IGV4dGVuZHMgUHJvZHVjdFF1ZXJ5U2VydmxldCB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkvKioKKwkgKiBPdmVycmlkZGVuIGltcGxlbWVudGF0aW9uIHRoYXQgZGVmYXVsdHMgdG8gdGhlIHN0YW5kYXJkIGJlaGF2aW9yIGlmIHRoZSBwYXJhbWV0ZXJzICJxIiBvciAieG1scSIgYXJlIGZvdW5kLAorCSAqIG90aGVyd2lzZSBpdCB1c2VzIHRoZSBhdmFpbGFibGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJ1aWxkIGEgY29uc3RyYWludCBxdWVyeSB3aXRoIGxvZ2ljYWwgQU5ELgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBYTUxRdWVyeSBnZXRRdWVyeShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCisJCS8vIGlmIERJUy1zdHlsZSBwYXJhbWV0ZXJzIGFyZSBmb3VuZCwgZGVmYXVsdCB0byBzdGFuZGFyZCBwcm9jZXNzaW5nCisJCWlmIChyZXEuZ2V0UGFyYW1ldGVyKCJ4bWxxIikgIT1udWxsIHx8IHJlcS5nZXRQYXJhbWV0ZXIoInEiKSE9bnVsbCkgeworCQkJWE1MUXVlcnkgeG1sUXVlcnkgPSBzdXBlci5nZXRRdWVyeShyZXEsIHJlcyk7CisJCQlyZXR1cm4geG1sUXVlcnk7CisJCQkKKwkJLy8gY29tYmluZSBhbGwgSFRUUCAobmFtZSwgdmFsdWUpIHBhaXJzIGludG8gWE1MIHF1ZXJ5IHN0cmluZyB3aXRoIGxvZ2ljYWwgQU5ECisJCX0gZWxzZSB7CisJCQkKKwkJCVN0cmluZ0J1ZmZlciBxID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisJCQlFbnVtZXJhdGlvbjxTdHJpbmc+IHBhcmFtZXRlck5hbWVzID0gcmVxLmdldFBhcmFtZXRlck5hbWVzKCk7CisJCQl3aGlsZSAocGFyYW1ldGVyTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQlTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1ldGVyTmFtZXMubmV4dEVsZW1lbnQoKTsKKwkJCQlTdHJpbmdbXSBwYXJhbVZhbHVlcyA9IHJlcS5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1OYW1lKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChxLmxlbmd0aCgpPjApIHEuYXBwZW5kKCIgQU5EICIpOworCQkJCQlxLmFwcGVuZChwYXJhbU5hbWUrIiBFUSAiK3BhcmFtVmFsdWVzW2ldKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIGJ1aWxkIFhNTFF1ZXJ5IG9iamVjdCBmcm9tIEhUVFAgcGFyYW1ldGVycworCQkJLy8gbm8gbmVlZCB0byBVUkwtZW5jb2RlIHNpbmNlIHRoaXMgcmVxdWVzdCBkb2Vzbid0IGdvIG92ZXIgdGhlIG5ldHdvcmsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhlY3V0aW5nIHF1ZXJ5PSIrcS50b1N0cmluZygpKTsKKwkJCXJldHVybiBuZXcgWE1MUXVlcnkocS50b1N0cmluZygpLCAid2dxIiwgIldlYiBHcmlkIFF1ZXJ5IiwJCisJCQkJCSJRdWVyeSBmcm9tIFdlYi1HcmlkIiwgLypkZElEKi9udWxsLCAgICAgICAgICAgICAgICAgICAKKwkJCQkJLypyZXN1bHRNb2RlSWQqL251bGwsIC8qcHJvcFR5cGUqL251bGwsICAgICAgICAgICAgICAgIAorCQkJCQkvKnByb3BMZXZlbHMqL251bGwsIC8qbWF4UmVzdWx0cyovSW50ZWdlci5NQVhfVkFMVUUsICAgCisJCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCB0cnVlKTsJCQkKKwkJfQorCQkKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1NlcnZlci5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWQ0ZWIzYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9ncmlkL1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmdyaWQ7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBzZXJ2ZXIgZGVmaW5lcyB0aGUgY29kZSBiYXNlIGFuZCBjbGFzcyBuYW1lIG9mIGEgcXVlcnkgaGFuZGxlci4KKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VydmVyPC9jb2RlPiBpbnN0YW5jZS4KKyAgICogCisgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCisgICAqICAgICAgICAgIFN5c3RlbSBjb25maWd1cmF0aW9uLgorICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAqICAgICAgICAgIENsYXNzIG5hbWUgb2YgdGhlIHF1ZXJ5IGhhbmRsZXIuCisgICAqLworICBwdWJsaWMgU2VydmVyKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgIH0KKworICAvKioKKyAgICogUmVuZGVyIHRoaXMgc2VydmVyIGludG8gWE1MLgorICAgKiAKKyAgICogQHBhcmFtIG93bmVyCisgICAqICAgICAgICAgIE93bmluZyBkb2N1bWVudC4KKyAgICogQHJldHVybiBUaGlzIHNlcnZlciwgYXMgWE1MLgorICAgKi8KKyAgcHVibGljIE5vZGUgdG9YTUwoRG9jdW1lbnQgb3duZXIpIHsKKyAgICBFbGVtZW50IGVsZW0gPSBvd25lci5jcmVhdGVFbGVtZW50KCJzZXJ2ZXIiKTsKKyAgICBlbGVtLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgY2xhc3NOYW1lKTsKKyAgICBlbGVtLnNldEF0dHJpYnV0ZSgidHlwZSIsIGdldFR5cGUoKSk7CisgICAgcmV0dXJuIGVsZW07CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBxdWVyeSBoYW5kbGVyLgorICAgKiAKKyAgICogQHJldHVybiBDbGFzcyBuYW1lIG9mIHRoZSBxdWVyeSBoYW5kbGVyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgdGhlIGhhbmRsZXIuCisgICAqIAorICAgKiBAcmV0dXJuIGFuIGluc3RhbnRpYXRlZCBoYW5kbHJlLgorICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIHRoZSBoYW5kbGVyIGNsYXNzIGNhbid0IGJlIGZvdW5kLgorICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIHRoZSBoYW5kbGVyIG9iamVjdCBjYW4ndCBiZSBjcmVhdGVkLgorICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIHRoZSBoYW5kbGVyIGNsYXNzIGRvZXNuJ3QgcHJvdmlkZSBhIHB1YmxpYyBuby1hcmdzCisgICAqICAgICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBPYmplY3QgY3JlYXRlSGFuZGxlcigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgTGlzdCB1cmxMaXN0ID0gY29uZmlndXJhdGlvbi5nZXRDb2RlQmFzZXMoKTsKKyAgICBDbGFzcyBjbGF6ejsKKyAgICBpZiAodXJsTGlzdC5pc0VtcHR5KCkpCisgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICBlbHNlIHsKKyAgICAgIFVSTFtdIHVybHMgPSAoVVJMW10pIHVybExpc3QudG9BcnJheShFTVBUWV9VUkxfQVJSQVkpOworICAgICAgVVJMQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIGdldENsYXNzKCkKKyAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBoYW5kbGVyLgorICAgKiAKKyAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgKiAgICAgICAgICBDbGFzcyBuYW1lIG9mIHRoZSBoYW5kbGVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGhhbmRsZXIuCisgICAqIAorICAgKiBAcmV0dXJuIEVpdGhlciA8Y29kZT5wcm9kdWN0PC9jb2RlPiBvciA8Y29kZT5wcm9maWxlPC9jb2RlPi4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZSgpOworCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uaGFzaENvZGUoKSBeIGNsYXNzTmFtZS5oYXNoQ29kZSgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IHRoaXMpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqIGluc3RhbmNlb2YgU2VydmVyKSB7CisgICAgICBTZXJ2ZXIgcmhzID0gKFNlcnZlcikgb2JqOworICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZXF1YWxzKGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgJiYgY2xhc3NOYW1lLmVxdWFscyhyaHMuY2xhc3NOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIlNlcnZlcltjbGFzc05hbWU9IiArIGNsYXNzTmFtZSArICJdIjsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBzZXJ2ZXIgZnJvbSBhbiBYTUwgZWxlbWVudC4KKyAgICogCisgICAqIEBwYXJhbSBlbGVtCisgICAqICAgICAgICAgIFhNTCBlbGVtZW50LCBwcmVzdW1lZCB0byBiZSBhICZsdDtzZXJ2ZXImZ3Q7IGVsZW1lbnQuCisgICAqIEByZXR1cm4gYSA8Y29kZT5TZXJ2ZXI8L2NvZGU+IHN1YmNsYXNzLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgdGhlIGVsZW1lbnQgY2FuJ3QgYmUgcHJvcGVybHkgcGFyc2VkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgRWxlbWVudCBlbGVtKQorICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpOworICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJ0eXBlIGF0dHJpYnV0ZSBtaXNzaW5nIGZyb20gPCIKKyAgICAgICAgICArIGVsZW0uZ2V0Tm9kZU5hbWUoKSArICI+Iik7CisKKyAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpOworICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkKKyAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oImNsYXNzTmFtZSBhdHRyaWJ1dGUgbWlzc2luZyBmcm9tIDwiCisgICAgICAgICAgKyBlbGVtLmdldE5vZGVOYW1lKCkgKyAiPiIpOworCisgICAgLy8gUmVwbGFjZSB3aXRoIGEgZmFjdG9yeSBzb21lIGRheS4uLgorICAgIGlmICgicHJvZHVjdCIuZXF1YWxzKHR5cGUpKQorICAgICAgcmV0dXJuIG5ldyBQcm9kdWN0U2VydmVyKGNvbmZpZ3VyYXRpb24sIGNsYXNzTmFtZSk7CisgICAgZWxzZSBpZiAoInByb2ZpbGUiLmVxdWFscyh0eXBlKSkKKyAgICAgIHJldHVybiBuZXcgUHJvZmlsZVNlcnZlcihjb25maWd1cmF0aW9uLCBjbGFzc05hbWUpOworICAgIGVsc2UKKyAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oInVua25vd24gc2VydmVyIHR5cGUgYCIgKyB0eXBlICsgIiciKTsKKyAgfQorCisgIC8qKiBDb25maWd1cmF0aW9uLiAqLworICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgIC8qKiBDbGFzcyBuYW1lIG9mIHRoZSBoYW5kbGVyIGNsYXNzLiAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkxbXSBFTVBUWV9VUkxfQVJSQVkgPSBuZXcgVVJMWzBdOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvVXRpbGl0eS5qYXZhIGIvMC4xMC9ncmlkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2dyaWQvVXRpbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzY2MyMTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvZ3JpZC9VdGlsaXR5LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5ncmlkOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3Igd2ViIGdyaWQuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFV0aWxpdHkgeworICAvKioKKyAgICogUHJvdmlkZSBYSFRNTC1zYWZlIGVzY2FwaW5nIGZvciBhIHN0cmluZy4gQmFzaWNhbGx5LCB0aGlzIGlzIHRoZSBzYW1lIGFzCisgICAqIFhNTC1lc2NhcGluZywgYnV0IHNpbmNlIHNvbWUgdXNlciBhZ2VudHMgZG9uJ3QgcmVjb2duaXplCisgICAqIDxjb2RlPiZhbXA7YXBvczs8L2NvZGU+LCB3ZSB1c2UgPGNvZGU+JmFtcDsjMzk7PC9jb2RlPiBpbnN0ZWFkLgorICAgKiAKKyAgICogQHBhcmFtIHN0cgorICAgKiAgICAgICAgICBTdHJpbmcgdG8gZXNjYXBlLgorICAgKiBAcmV0dXJuIDx2YXI+c3RyPC92YXI+IGVzY2FwZWQuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2MoU3RyaW5nIHN0cikgeworICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIubGVuZ3RoKCkpOyAvLyBBc3N1bWUgYXQgbGVhc3QgdGhlIHNhbWUKKyAgICAvLyBsZW5ndGgKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgKytpKSB7IC8vIEZvciBlYWNoIGNoYXJhY3RlcgorICAgICAgY2hhciBjID0gc3RyLmNoYXJBdChpKTsgLy8gR3JhYiB0aGUgY2hhcmFjdGVyCisgICAgICBzd2l0Y2ggKGMpIHsgLy8gTm93IGNvbnNpZGVyIHdoYXQgaXQgaXMgLi4uCisgICAgICBjYXNlICc8JzogLy8gQSBsZXNzIHRoYW4/CisgICAgICAgIHMuYXBwZW5kKCImbHQ7Iik7IC8vIFdlbGwsIHRoYXQncyAmbHQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6IC8vIEEgZ3JlYXRlciB0aGFuPworICAgICAgICBzLmFwcGVuZCgiJmd0OyIpOyAvLyBUaGF0J3MgJmd0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnOiAvLyBBbiBhbXBlcnNhbmQ/CisgICAgICAgIHMuYXBwZW5kKCImYW1wOyIpOyAvLyBXZSBhbGwga25vdyB3aGF0IHRoYXQgaXMKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJyc6IC8vIEEgdGljaz8KKyAgICAgICAgcy5hcHBlbmQoIiYjMzk7Iik7IC8vIE5vdCAmYXBvczsgISBUUklDS1khCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCInOiAvLyBBIHF1b3RlPworICAgICAgICBzLmFwcGVuZCgiJnF1b3Q7Iik7IC8vIFlhZGRhLCB5YWRkYSwgeWFkZGEKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvLyBBbnl0aGluZyBlbHNlIG1heSBwYXNzCisgICAgICAgIHMuYXBwZW5kKGMpOyAvLyAuLi4gdGhyb3VnaCB1bmNoYW5nZWQKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzLnRvU3RyaW5nKCk7IC8vIERvbmVuYWNpb3VzLgorICB9CisKKyAgLyoqCisgICAqIFRlbGwgaWYgYSBob3N0IG5hbWUgcmVmZXJzIHRvIHRoZSBsb2NhbGhvc3QuIFRoaXMgY2hlY2tzIHRoZSBzdGFuZGFyZCBJUHY2CisgICAqIGFkZHJlc3MsIElQdjQgYWRkcmVzcywgYW5kIGhvc3QgbmFtZSBmb3IgbG9jYWxob3N0LgorICAgKiAKKyAgICogQHBhcmFtIGhvc3QKKyAgICogICAgICAgICAgSG9zdCBuYW1lIHRvIGNoZWNrLgorICAgKiBAcmV0dXJuIFRydWUgaWYgPHZhcj5ob3N0PC92YXI+IG5hbWVzIHRoZSBsb2NhbGhvc3QuCisgICAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbGhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICByZXR1cm4gIjA6MDowOjA6MDowOjA6MSIuZXF1YWxzKGhvc3QpIHx8ICIxMjcuMC4wLjEiLmVxdWFscyhob3N0KQorICAgICAgICB8fCAibG9jYWxob3N0Ii5lcXVhbHMoaG9zdCk7CisgIH0KKworICAvKioKKyAgICogRG8gbm90IGNhbGwuCisgICAqLworICBwcml2YXRlIFV0aWxpdHkoKSB7CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBpcyBhIFx1MDBhYnV0aWxpdHlcdTAwYmIgY2xhc3MiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbCBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgyNjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8Q29udGV4dAorICAgY29va2llcz0ndHJ1ZScKKyAgIG92ZXJyaWRlPSd0cnVlJworICAgcHJpdmlsZWdlZD0nZmFsc2UnCisgICByZWxvYWRhYmxlPSdmYWxzZScKKyAgIHVucGFja1dBUj0ndHJ1ZScvPgpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwgYi8wLjEwL2dyaWQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MmIyMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgQ29uZmlndXJlIFBVQkxJQyAnLS8vTW9ydCBCYXkgQ29uc3VsdGluZy8vRFREIENvbmZpZ3VyZSAxLjIvL0VOJyAnaHR0cDovL2pldHR5Lm1vcnRiYXkub3JnL2NvbmZpZ3VyZV8xXzIuZHRkJz4KKzxDb25maWd1cmUgY2xhc3M9J29yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuV2ViQXBwbGljYXRpb25Db250ZXh0Jz4KKyAgPFNldCBuYW1lPSdleHRyYWN0V0FSJz50cnVlPC9TZXQ+Cis8L0NvbmZpZ3VyZT4KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThkZmNlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsODYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorPHdlYi1hcHA+CisgIDxpY29uPgorICAgIDxzbWFsbC1pY29uPmltYWdlcy93ZWJhcHAtc21hbGwucG5nPC9zbWFsbC1pY29uPgorICAgIDxsYXJnZS1pY29uPmltYWdlcy93ZWJhcHAtbGFyZ2UucG5nPC9sYXJnZS1pY29uPgorICA8L2ljb24+CisgIDxkaXNwbGF5LW5hbWU+V2ViIEdyaWQ8L2Rpc3BsYXktbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIFdlYiBHcmlkIGlzIGFuIE9PRFQgd2ViIGFwcGxpY2F0aW9uIHRoYXQgcHJvdmlkZXMgSFRUUCBiYXNlZAorICAgIGFjY2VzcyB0byBPT0RUIHByb2ZpbGUgYW5kIHByb2R1Y3QgcXVlcnkgaGFuZGxlcnMuICBJdCBhbHNvCisgICAgaW5jbHVkZXMgd2ViIGFjY2Vzc2libGUgY29uZmlndXJhdGlvbiBhbmQgdXBkYXRlcyB3aXRoIGEgc2ltcGxlCisgICAgYWRtaW5pc3RyYXRpdmUgc2VjdXJpdHkgcG9saWN5LgorICA8L2Rlc2NyaXB0aW9uPgorICA8ZGlzdHJpYnV0YWJsZS8+CisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+cHJvZHVjdDwvc2VydmxldC1uYW1lPgorICAgIDxkaXNwbGF5LW5hbWU+UHJvZHVjdDwvZGlzcGxheS1uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUub29kdC5ncmlkLlByb2R1Y3RRdWVyeVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5wcm9maWxlPC9zZXJ2bGV0LW5hbWU+CisgICAgPGRpc3BsYXktbmFtZT5Qcm9maWxlPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5vb2R0LmdyaWQuUHJvZmlsZVF1ZXJ5U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPmNvbmZpZzwvc2VydmxldC1uYW1lPgorICAgIDxkaXNwbGF5LW5hbWU+Q29uZmlndXJlPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5vb2R0LmdyaWQuQ29uZmlnU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPmxvZ2luPC9zZXJ2bGV0LW5hbWU+CisgICAgPGRpc3BsYXktbmFtZT5Mb2dpbjwvZGlzcGxheS1uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUub29kdC5ncmlkLkxvZ2luU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+cHJvZHVjdDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vcHJvZDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+cHJvZmlsZTwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vcHJvZjwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+Y29uZmlnPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9jb25mPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5sb2dpbjwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vbG9naW48L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlc3Npb24tY29uZmlnPgorICAgIDxzZXNzaW9uLXRpbWVvdXQ+MDwvc2Vzc2lvbi10aW1lb3V0PgorICA8L3Nlc3Npb24tY29uZmlnPgorICA8d2VsY29tZS1maWxlLWxpc3Q+CisgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+CisgIDwvd2VsY29tZS1maWxlLWxpc3Q+CisgIDxlcnJvci1wYWdlPgorICAgIDxleGNlcHRpb24tdHlwZT5vcmcuYXBhY2hlLm9vZHQuZ3JpZC5BdXRoZW50aWNhdGlvblJlcXVpcmVkRXhjZXB0aW9uPC9leGNlcHRpb24tdHlwZT4KKyAgICA8bG9jYXRpb24+L2Vycm9yLmpzcDwvbG9jYXRpb24+CisgIDwvZXJyb3ItcGFnZT4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvY29uZmlnLmpzcCBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvY29uZmlnLmpzcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzVjNjk5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9jb25maWcuanNwCkBAIC0wLDAgKzEsMjA1IEBACis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgc2Vzc2lvbj0idHJ1ZSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW5mbz0iQ29uZmlnIiBlcnJvclBhZ2U9ImVycm9yLmpzcCIgCisgIGltcG9ydD0iamF2YS51dGlsLk1hcCxqYXZhLnV0aWwuSXRlcmF0b3Isb3JnLmFwYWNoZS5vb2R0LmdyaWQuU2VydmVyLG9yZy5hcGFjaGUub29kdC5ncmlkLlV0aWxpdHksamF2YS5uZXQuVVJMIiAlPgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxqc3A6dXNlQmVhbiBpZD0iY2IiIHNjb3BlPSJzZXNzaW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmdyaWQuQ29uZmlnQmVhbiIvPgorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAnLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4nICdodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkJz4KKzxodG1sIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyB4bWw6bGFuZz0nZW4nIGxhbmc9J2VuJz4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPldlYiBHcmlkIENvbmZpZ3VyYXRpb248L3RpdGxlPgorICAgIDxsaW5rIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIGhyZWY9J3N0eWxlLmNzcycvPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5XZWIgR3JpZCBDb25maWd1cmF0aW9uPC9oMT4KKworICAgIDwlIGlmIChjYi5nZXRNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKSB7ICU+CisgICAgICA8ZGl2IGNsYXNzPSdlcnJvcic+PGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSdjYicgcHJvcGVydHk9J21lc3NhZ2UnLz48L2Rpdj4KKyAgICA8JSB9ICU+CisKKyAgICA8Zm9ybSBhY3Rpb249J2NvbmYnIG1ldGhvZD0ncG9zdCc+CisKKyAgICAgIDxmaWVsZHNldD4KKyAgICAgICAgPGxlZ2VuZD5BZG1pbmlzdHJhdGl2ZSBTZXR0aW5nczwvbGVnZW5kPgorCTxkaXYgY2xhc3M9J2ZpZWxkJz4KKyAgICAgICAgICA8bGFiZWwgZm9yPSdwYXNzd29yZEZpZWxkJz5OZXcgQWRtaW5pc3RyYXRvciBQYXNzd29yZDwvbGFiZWw+CisgICAgICAgICAgPGRpdiBjbGFzcz0nZmllbGRIZWxwJz4KKyAgICAgICAgICAgIExlYXZlIGJsYW5rIHRvIGxlYXZlIHBhc3N3b3JkIHVuY2hhbmdlZC4KKyAgICAgICAgICA8L2Rpdj4KKwkgIDxpbnB1dCBpZD0ncGFzc3dvcmRGaWVsZCcgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3N3b3JkJy8+CisgICAgICAgIDwvZGl2PgorCisJPGRpdiBjbGFzcz0nZmllbGQnPgorCSAgPGxhYmVsIGZvcj0nbGhmJz5SZXF1aXJlIEFkbWluaXN0cmF0aXZlIEFjY2VzcyBmcm9tIExvY2FsIEhvc3QgT25seTwvbGFiZWw+CisJICA8ZGl2IGNsYXNzPSdmaWVsZEhlbHAnPgorCSAgICBDbGljayBZZXMgdG8gZW5hYmxlIGFkbWluaXN0cmF0aXZlIGFjY2VzcyBmcm9tIGJyb3dzZXJzCisJICAgIHJ1bm5pbmcgb24gdGhlIGxvY2FsIHdlYi1zZXJ2ZXIgaG9zdCBvbmx5LiAgQ2xpY2sgTm8gdG8KKwkgICAgYWxsb3cgYW55IGhvc3QgdG8gYWNjZXNzIHRoZXNlIGFkbWluaXN0cmF0aXZlIHBhZ2VzLgorCSAgPC9kaXY+CisJICA8aW5wdXQgaWQ9J2xoZicgdHlwZT0ncmFkaW8nIG5hbWU9J2xvY2FsaG9zdCcgdmFsdWU9J29uJyA8JT0gY2IuaXNMb2NhbGhvc3RSZXF1aXJlZCgpPyAiY2hlY2tlZD0nY2hlY2tlZCciIDogIiIgJT4gLz5ZZXMKKwkgIDxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nbG9jYWxob3N0JyB2YWx1ZT0nb2ZmJyA8JT0gIWNiLmlzTG9jYWxob3N0UmVxdWlyZWQoKT8gImNoZWNrZWQ9J2NoZWNrZWQnIiA6ICIiICU+IC8+Tm8KKwk8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSdmaWVsZCc+CisgICAgICAgICAgPGxhYmVsIGZvcj0naHR0cHNGaWVsZCc+UmVxdWlyZSBIVFRQUyBmb3IgQWRtaW5pc3RyYXRpdmUgQWNjZXNzPC9sYWJlbD4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSdmaWVsZEhlbHAnPgorCSAgICBDbGljayBZZXMgdG8gcmVxdWlyZSBIVFRQUyBmb3IgYWNjZXNzIHRvIHRoZXNlIGFkbWluaXN0cmF0aXZlIHBhZ2VzLiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJlcXVpcmUKKwkgICAgeW91ciB3ZWIgc2VydmVyIHRvIGFsc28gc3VwcG9ydCBIVFRQUy4gSWYgeW91J3JlIG5vdCBzdXJlLCA8c3Ryb25nPmNsaWNrIE5vPC9zdHJvbmc+LgorICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDxpbnB1dCBpZD0naHR0cHNGaWVsZCcgdHlwZT0ncmFkaW8nIG5hbWU9J2h0dHBzJyB2YWx1ZT0nb24nIDwlPSBjYi5pc0h0dHBzUmVxdWlyZWQoKT8gImNoZWNrZWQ9J2NoZWNrZWQnIiA6ICIiICU+IC8+WWVzCisgICAgICAgICAgPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdodHRwcycgdmFsdWU9J29mZicgPCU9ICFjYi5pc0h0dHBzUmVxdWlyZWQoKT8gImNoZWNrZWQ9J2NoZWNrZWQnIiA6ICIiICU+IC8+Tm8KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2ZpZWxkc2V0PgorCisgICAgICA8ZmllbGRzZXQ+CisJPGxlZ2VuZD5TeXN0ZW0gUHJvcGVydGllczwvbGVnZW5kPgorCTxkaXYgY2xhc3M9J2ZpZWxkJz4KKwkgIDxkaXYgY2xhc3M9J2ZpZWxkSGVscCc+VG8gYWRkIGEgbmV3IHN5c3RlbSBwcm9wZXJ0eSwgZW50ZXIKKwkgICAgaXRzIGtleSBhbmQgdmFsdWUgYXQgdGhlIGJvdHRvbS4gIFlvdSBjYW4gY2hhbmdlIHRoZSB2YWx1ZXMKKwkgICAgb2YgZXhpc3RpbmcgcHJvcGVydGllcy4gVG8gZGVsZXRlIGFuIGV4aXN0aW5nIHByb3BlcnR5LAorCSAgICBjaGVjayB0aGUgYm94IHRvIGl0cyByaWdodC48L2Rpdj4KKwkgIDx0YWJsZT4KKwkgICAgPHRoZWFkPjx0cj48dGg+IzwvdGg+PHRoPktleTwvdGg+PHRoPlZhbHVlPC90aD48dGg+RGVsZXRlPzwvdGg+PC90cj48L3RoZWFkPgorCSAgICA8dGJvZHk+CisJICAgIDwlIGludCByb3cgPSAxOyBmb3IgKEl0ZXJhdG9yIGkgPSBjYi5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKytyb3cpIHsKKwkgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisJICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKwkgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7CisJICAgICU+CisJICAgICAgPHRyIGNsYXNzPSc8JT0gcm93ICUgMiA9PSAwPyAiZXZlblJvdyIgOiAib2RkUm93IiU+Jz4KKwkJPHRkPjwlPSByb3cgJT4uPC90ZD4KKwkJPHRkPjxzcGFuIGNsYXNzPSdrZXknPjwlPSBVdGlsaXR5LmVzYyhrZXkpICU+PC9zcGFuPjwvdGQ+CisJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndmFsLTwlPSBVdGlsaXR5LmVzYyhrZXkpICU+JyB2YWx1ZT0nPCU9IFV0aWxpdHkuZXNjKHZhbCkgJT4nLz48L3RkPgorCQk8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdkZWwtPCU9IFV0aWxpdHkuZXNjKGtleSkgJT4nLz48L3RkPgorCSAgICAgIDwvdHI+CisJICAgIDwlIH0gJT4KKwkgICAgICA8dHIgY2xhc3M9J25ld1Jvdyc+CisJCTx0ZD4oTmV3KTwvdGQ+CisJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J25ld2tleScgbmFtZT0nbmV3a2V5Jy8+PC90ZD4KKwkJPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbmV3dmFsJyBuYW1lPSduZXd2YWwnLz48L3RkPgorCQk8dGQ+JiN4MDBhMDs8L3RkPgorCSAgICAgIDwvdHI+CisJICAgIDwvdGJvZHk+CisJICA8L3RhYmxlPgorCTwvZGl2PgorICAgICAgPC9maWVsZHNldD4KKworICAgICAgPGZpZWxkc2V0PgorCTxsZWdlbmQ+Q29kZSBCYXNlczwvbGVnZW5kPgorCTxkaXYgY2xhc3M9J2ZpZWxkSGVscCc+U3BlY2lmeSBhIFVSTCBmb3IgZWFjaCBjb2RlIGJhc2UuICBVUkxzCisJICB0byBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBqYXIgZmlsZXMuICBVUkxzIHRoYXQgZW5kIGluIGEKKwkgIDxjb2RlPi88L2NvZGU+IHJlZmVyIHRvIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgY2xhc3MgZmlsZXMuCisJICBDaGVjayB0aGUgYm94IHRvIGRlbGV0ZSBhIGNvZGUgYmFzZS4KKwk8L2Rpdj4KKworCTx0YWJsZT4KKwkgIDx0aGVhZD48dHI+PHRoPiM8L3RoPjx0aD5Db2RlIEJhc2U8L3RoPjx0aD5EZWxldGU/PC90aD48L3RoZWFkPgorCSAgPHRib2R5PgorCSAgPCUgcm93ID0gMDsgZm9yIChJdGVyYXRvciBpID0gY2IuZ2V0Q29uZmlndXJhdGlvbigpLmdldENvZGVCYXNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyArK3JvdykgeworCSAgICBVUkwgY29kZUJhc2VVUkwgPSAoVVJMKSBpLm5leHQoKTsKKwkgICU+CisJICAgIDx0ciBjbGFzcz0nPCU9IHJvdysxICUgMiA9PSAwPyAiZXZlblJvdyIgOiAib2RkUm93IiU+Jz4KKwkgICAgICA8dGQ+PCU9IHJvdysxICU+LjwvdGQ+CisJICAgICAgPHRkPjwlPSBVdGlsaXR5LmVzYyhjb2RlQmFzZVVSTC50b1N0cmluZygpKSAlPjwvdGQ+CisJICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nZGVsY2ItPCU9IHJvdyAlPicvPjwvdGQ+CisJICAgIDwvdHI+CisJICA8JSB9ICU+CisJICAgIDx0ciBjbGFzcz0nbmV3Um93Jz4KKwkgICAgICA8dGQ+KE5ldyk8L3RkPgorCSAgICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nbmV3Y2InLz48L3RkPgorCSAgICAgIDx0ZD4mI3gwMGEwOzwvdGQ+CisJICAgIDwvdHI+CisJICA8L3Rib2R5PgorCTwvdGFibGU+CisgICAgICA8L2ZpZWxkc2V0PgorCisgICAgICA8dGFibGU+CisgICAgICAgIDxjYXB0aW9uPlF1ZXJ5IEhhbmRsZXJzPC9jYXB0aW9uPgorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgPHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+CisgICAgICAgICAgICA8dGQ+CisJICAgICAgPGZpZWxkc2V0PgorCQk8bGVnZW5kPlByb2R1Y3QgUXVlcnkgSGFuZGxlcnM8L2xlZ2VuZD4KKwkJPGRpdiBjbGFzcz0nZmllbGQnPgorCQkgIDxkaXYgY2xhc3M9J2ZpZWxkSGVscCc+U3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBmb3IgZWFjaAorCQkgICAgcHJvZHVjdCBxdWVyeSBoYW5kbGVyOyB0aGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCisJCSAgICA8Y29kZT5vcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5RdWVyeUhhbmRsZXI8L2NvZGU+IGludGVyZmFjZS48L2Rpdj4KKwkJICA8dGFibGU+CisJCSAgICA8dGhlYWQ+PHRyPjx0aD4jPC90aD48dGg+Q2xhc3MgTmFtZTwvdGg+PHRoPkRlbGV0ZT88L3RoPjwvdHI+PC90aGVhZD4KKwkJICAgIDx0Ym9keT4KKwkJICAgIDwlIHJvdyA9IDA7IGZvciAoSXRlcmF0b3IgaSA9IGNiLmdldFByb2R1Y3RTZXJ2ZXJzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICsrcm93KSB7CisJCSAgICAgIFNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpLm5leHQoKTsKKwkJICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHNlcnZlci5nZXRDbGFzc05hbWUoKTsKKwkJICAgICU+CisJCSAgICAgIDx0ciBjbGFzcz0nPCU9IHJvdyAlIDIgPT0gMD8gIm9kZFJvdyIgOiAiZXZlblJvdyIgJT4nPgorCQkJPHRkPjwlPSByb3crMSAlPi48L3RkPgorCQkJPHRkPjxjb2RlPjwlPSBVdGlsaXR5LmVzYyhjbGFzc05hbWUpICU+PC9jb2RlPjwvdGQ+CisJCQk8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdkcm0tPCU9IHJvdyAlPicvPjwvdGQ+CisJCSAgICAgIDwvdHI+CisJCSAgICA8JSB9ICU+CisJCSAgICAgIDx0ciBjbGFzcz0nbmV3Um93Jz4KKwkJCTx0ZD4oTmV3KTwvdGQ+CisJCQk8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2QtbmV3Y24nLz48L3RkPgorCQkJPHRkPiYjeDAwYTA7PC90ZD4KKwkJICAgICAgPC90cj4KKwkJICAgIDwvdGJvZHk+CisJCSAgPC90YWJsZT4KKwkJPC9kaXY+CisJICAgICAgPC9maWVsZHNldD4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQ+CisJICAgICAgPGZpZWxkc2V0PgorCQk8bGVnZW5kPlByb2ZpbGUgUXVlcnkgSGFuZGxlcnM8L2xlZ2VuZD4KKwkJPGRpdiBjbGFzcz0nZmllbGQnPgorCQkgIDxkaXYgY2xhc3M9J2ZpZWxkSGVscCc+U3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBmb3IgZWFjaAorCQkgICAgcHJvZmlsZSBxdWVyeSBoYW5kbGVyOyB0aGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCisJCSAgICA8Y29kZT5vcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5Qcm9maWxlSGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLjwvZGl2PgorCQkgIDx0YWJsZT4KKwkJICAgIDx0aGVhZD48dHI+PHRoPiM8L3RoPjx0aD5DbGFzcyBOYW1lPC90aD48dGg+RGVsZXRlPzwvdGg+PC90cj48L3RoZWFkPgorCQkgICAgPHRib2R5PgorCQkgICAgPCUgcm93ID0gMDsgZm9yIChJdGVyYXRvciBpID0gY2IuZ2V0UHJvZmlsZVNlcnZlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKytyb3cpIHsKKwkJICAgICAgU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGkubmV4dCgpOworCQkgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gc2VydmVyLmdldENsYXNzTmFtZSgpOworCQkgICAgJT4KKwkJICAgICAgPHRyIGNsYXNzPSc8JT0gcm93ICUgMiA9PSAwPyAib2RkUm93IiA6ICJldmVuUm93IiAlPic+CisJCQk8dGQ+PCU9IHJvdysxICU+LjwvdGQ+CisJCQk8dGQ+PGNvZGU+PCU9IFV0aWxpdHkuZXNjKGNsYXNzTmFtZSkgJT48L2NvZGU+PC90ZD4KKwkJCTx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J21ybS08JT0gcm93ICU+Jy8+PC90ZD4KKwkJICAgICAgPC90cj4KKwkJICAgIDwlIH0gJT4KKwkJICAgICAgPHRyIGNsYXNzPSduZXdSb3cnPgorCQkJPHRkPihOZXcpPC90ZD4KKwkJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nbS1uZXdjbicvPjwvdGQ+CisJCQk8dGQ+JiN4MDBhMDs8L3RkPgorCQkgICAgICA8L3RyPgorCQkgICAgPC90Ym9keT4KKwkJICA8L3RhYmxlPgorCQk8L2Rpdj4KKwkgICAgICA8L2ZpZWxkc2V0PgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgICAgPC90YWJsZT4KKworICAgICAgPGRpdiBjbGFzcz0nZm9ybUNvbnRyb2xzJz4KKyAgICAgICAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nc3VibWl0JyB2YWx1ZT0nU2F2ZSBDaGFuZ2VzJy8+CisgICAgICA8L2Rpdj4KKworICAgIDwvZm9ybT4KKworICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvc3JjL21haW4vd2ViYXBwL2Vycm9yLmpzcCBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvZXJyb3IuanNwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzMDVhMzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vd2ViYXBwL2Vycm9yLmpzcApAQCAtMCwwICsxLDYwIEBACis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgc2Vzc2lvbj0idHJ1ZSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW5mbz0iQ29uZmlnIiBpc0Vycm9yUGFnZT0idHJ1ZSIgCisgIGltcG9ydD0ib3JnLmFwYWNoZS5vb2R0LmdyaWQuQXV0aGVudGljYXRpb25SZXF1aXJlZEV4Y2VwdGlvbixqYXZhLmlvLlN0cmluZ1dyaXRlcixqYXZhLmlvLlByaW50V3JpdGVyIgorJT4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8anNwOnVzZUJlYW4gaWQ9ImNiIiBzY29wZT0ic2Vzc2lvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5ncmlkLkNvbmZpZ0JlYW4iLz4KKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgJy0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCc+Cis8aHRtbCB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcgeG1sOmxhbmc9J2VuJyBsYW5nPSdlbic+CisgIDxoZWFkPgorICAgIDx0aXRsZT5XZWIgR3JpZDwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgaHJlZj0nc3R5bGUuY3NzJy8+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPCUhIFN0cmluZ1dyaXRlciBzID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgIFByaW50V3JpdGVyIHcgPSBuZXcgUHJpbnRXcml0ZXIocyk7ICU+CisgICAgPCUgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSh3KTsgdy5jbG9zZSgpOyAlPgorCisgICAgPGgxPldlYiBHcmlkPC9oMT4KKyAgICA8JSBpZiAoY2IuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkgeyAlPgorICAgICAgPGRpdiBjbGFzcz0nZXJyb3InPjxqc3A6Z2V0UHJvcGVydHkgbmFtZT0nY2InIHByb3BlcnR5PSdtZXNzYWdlJy8+PC9kaXY+CisgICAgPCUgfSAlPgorCisgICAgPCUgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRFeGNlcHRpb24pIHsgJT4KKyAgICAgIDxmb3JtIGFjdGlvbj0nbG9naW4nIG1ldGhvZD0ncG9zdCc+CisgICAgICAgIDxmaWVsZHNldD4KKwkgIDxsZWdlbmQ+TG9nIEluPC9sZWdlbmQ+CisJICA8ZGl2IGNsYXNzPSdmaWVsZCc+CisJICAgIDxsYWJlbCBmb3I9J3B3Jz5BZG1pbmlzdHJhdG9yIHBhc3N3b3JkOjwvbGFiZWw+CisJICAgIDxkaXYgY2xhc3M9J2ZpZWxkSGVscCc+CisJICAgICAgUGFzc3dvcmRzIGFyZSBjYXNlIHNlbnNpdHZlOyBjaGVjayB5b3VyIENBUFMgTE9DSyBrZXksIGlmIG5lY2Vzc2FyeS4KKwkgICAgPC9kaXY+CisJICAgIDxpbnB1dCBpZD0ncHcnIHR5cGU9J3Bhc3N3b3JkJyBuYW1lPSdwYXNzd29yZCcvPgorCSAgPC9kaXY+CisJICA8ZGl2IGNsYXNzPSdmb3JtQ29udHJvbHMnPgorCSAgICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdzdWJtaXQnIHZhbHVlPSdMb2cgSW4nLz4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9maWVsZHNldD4KKyAgICAgIDwvZm9ybT4KKyAgIDwlIH0gZWxzZSB7ICU+CisgICAgIDxoMT5FcnJvcjwvaDE+CisgICAgIDxkaXY+RXhjZXB0aW9uIDxjb2RlPjwlPSBleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgJT48L2NvZGU+OiA8JT0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSAlPjwvZGl2PgorICAgICA8cHJlPjwlPSBzLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkgJT48L3ByZT4KKyAgIDwlIH0gJT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9pbWFnZXMvd2ViYXBwLWxhcmdlLnBuZyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL3dlYmFwcC1sYXJnZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdhNWJiMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL3dlYmFwcC1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9pbWFnZXMvd2ViYXBwLXNtYWxsLnBuZyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL3dlYmFwcC1zbWFsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDBkZDk2MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL3dlYmFwcC1zbWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvMC4xMC9ncmlkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkMmYxNjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgJy0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCc+Cis8aHRtbCB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcgeG1sOmxhbmc9J2VuJyBsYW5nPSdlbic+CisgIDxoZWFkPgorICAgIDx0aXRsZT5XZWIgR3JpZDwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGUuY3NzIiAvPgorICA8L2hlYWQ+CisgIDxoMT5XZWIgR3JpZDwvaDE+CisgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0nY29uZmlnLmpzcCc+Q29uZmlndXJlPC9hPiB0aGUgc3lzdGVtPC9saT4KKyAgICA8bGk+PGEgaHJlZj0naHR0cDovL29vZHQuanBsLm5hc2EuZ292L3dlYi1ncmlkLyc+TGVhcm4gbW9yZTwvYT4gYWJvdXQgT09EVCB3ZWItYmFzZWQgZ3JpZCB0ZWNobm9sb2dpZXM8L2xpPgorICA8L3VsPgorICA8cD5PT0RUIGlzIGEgcHJvZHVjdCBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2E+LiBDaGVjayBvdXQgCisgIG91ciA8YSBocmVmPSJodHRwOi8vb29kdC5hcGFjaGUub3JnLyI+d2ViIHBhZ2U8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICA8L3A+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvc3JjL21haW4vd2ViYXBwL3N0eWxlLmNzcyBiLzAuMTAvZ3JpZC9zcmMvbWFpbi93ZWJhcHAvc3R5bGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5NzZmMDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL2dyaWQvc3JjL21haW4vd2ViYXBwL3N0eWxlLmNzcwpAQCAtMCwwICsxLDE2MSBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorKi8KK2JvZHkgeworICAgICAgICBmb250LWZhbWlseTogIkx1Y2lkYSBHcmFuZGUiLCBIZWx2ZXRpY2EsIHNhbnM7CisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisJY29sb3I6IGJsYWNrOworCW1hcmdpbjogMmVtOworCXBhZGRpbmc6IDA7CisJdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworaDEgeworICAgICAgICBmb250LXNpemU6IDE2MCU7Cit9CisKK2gyIHsKKyAgICAgICAgZm9udC1zaXplOiAxNTAlOworfQorCitoMyB7CisgICAgICAgIGZvbnQtc2l6ZTogMTQwJTsKKwlib3JkZXItYm90dG9tOiBub25lOworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitmaWVsZHNldCB7CisgICAgICAgIGJvcmRlcjogMSBzb2xpZCAjMzM2Njk5OworCW1hcmdpbjogMWVtIDBlbSAxZW0gMGVtOworCXBhZGRpbmc6IDBlbSAxZW0gMWVtIDFlbTsKKwlsaW5lLWhlaWdodDogMS41ZW07CisJd2lkdGg6IGF1dG87Cit9CisKK2xlZ2VuZCB7CisgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOworCXBhZGRpbmc6IDAuNWVtOworCWZvbnQtc2l6ZTogOTAlOworfQorCitmb3JtIHsKKyAgICAgICAgYm9yZGVyOiBub25lOworCW1hcmdpbjogMDsKK30KKwordGV4dGFyZWEgeworICAgICAgICBmb250OiAxMTAlICJBbWVyaWNhbiBUeXBld3JpdGVyIiwgQ291cmllciwgbW9ub3NwYWNlOyAKKyAgICAgICAgYm9yZGVyOiAxIHNvbGlkICMzNjk7CisJY29sb3I6IGJsYWNrOworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworCXdpZHRoOiAxMDAlOworfQorCitpbnB1dCB7CisgICAgICAgIGZvbnQtZmFtaWx5OiA8ZHRtbC12YXIgZm9udEZhbWlseT47CisJdmlzaWJpbGl0eTogdmlzaWJsZTsKKwlib3JkZXI6IDEgc29saWQgIzM2OTsKKwljb2xvcjogYmxhY2s7CisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworc2VsZWN0IHsKKyAgICAgICAgYm9yZGVyOiAxIHNvbGlkICMzNjk7CisJY29sb3I6IGJsYWNrOworCXZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5maWVsZCB7CisgICAgICAgIHRvcDogMDsKKwlsZWZ0OiAwOworCW1hcmdpbjogMCAxZW0gMWVtIDA7IAorfQorCisuZmllbGQgLmZpZWxkIHsKKyAgICAgICAgbWFyZ2luOiAxZW0gMCAwIDA7Cit9CisKKy5maWVsZCBsYWJlbCB7CisgICAgICAgIGZvbnQtc2l6ZTogMTAwJTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5maWVsZFJlcXVpcmVkIHsKKyAgICAgICAgYmFja2dyb3VuZDogdXJsKHJlcXVpcmVkLmdpZikgY2VudGVyIGxlZnQgbm8tcmVwZWF0OworICAgICAgICBwYWRkaW5nOiAwIDAgMCA4cHg7CisgICAgICAgIGNvbG9yOiBibGFjazsKK30gCisKKy5maWVsZEhlbHAgeworICAgICAgICBmb250LXNpemU6IDkwJTsKKyAgICAgICAgY29sb3I6ICM2NjY7CisgICAgICAgIG1hcmdpbjogMCAwIDAuMmVtIDA7Cit9CisKKy5mb3JtSGVscDpob3ZlciB7CisgICAgICAgIGNvbG9yOiBibGFjazsKKwljdXJzb3I6IGRlZmF1bHQ7Cit9CisKKy5mb3JtQ29udHJvbHMgeworICAgICAgICBtYXJnaW46IDFlbSAwIDAgMDsgCit9CisKKy5lcnJvciB7CisgICAgICAgIC8qIENsYXNzIGZvciBlcnJvciBpbmRpY2F0aW9uIGluIGZvcm1zICovCisJY29sb3I6ICNmZjY2MzM7CisJYm9yZGVyOiAxIHNvbGlkICNmZjY2MzM7CisJcGFkZGluZzogMWVtOworCW1hcmdpbjogMCAwIDFlbSAwOworCXdpZHRoOiA2OCUgIWltcG9ydGFudDsKK30KKworLmV2ZW5Sb3cgeworICAgICAgICBiYWNrZ3JvdW5kOiAjZWVlOworfQorCisubmV3Um93IHsKKwlib3JkZXItdG9wOiBzb2xpZDsKKwlib3JkZXItd2lkdGg6IDE7CisJYmFja2dyb3VuZDogI2ZmZTsKK30KKwordGggeworICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZDsKKwlib3JkZXItd2lkdGg6IDFweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKwordHIgeworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0ZCB7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3Rib2R5IHsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKwordGFibGUgeworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCitjYXB0aW9uIHsKKwlmb250LXNpemU6IDE1MCUKK30KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dlYi1ncmlkLmpwZyBiLzAuMTAvZ3JpZC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dlYi1ncmlkLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTViYjQzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvd2ViLWdyaWQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dlYi1ncmlkLnBzZCBiLzAuMTAvZ3JpZC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dlYi1ncmlkLnBzZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWQ4OThlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvd2ViLWdyaWQucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvc2l0ZS9yZXNvdXJjZXMvc2xpZGVzLnBkZiBiLzAuMTAvZ3JpZC9zcmMvc2l0ZS9yZXNvdXJjZXMvc2xpZGVzLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MmY2NGNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9zaXRlL3Jlc291cmNlcy9zbGlkZXMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvZ3JpZC9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg1ZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9ncmlkL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iV2ViIEdyaWQiPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICAgIDxpdGVtIG5hbWU9IkdyaWQiIGhyZWY9Ii4uL2dyaWQvIi8+CisgICAgPC9saW5rcz4KKworICA8bWVudSByZWY9InJlcG9ydHMiIGluaGVyaXQ9ImJvdHRvbSIvPgorICAKKyAgPC9ib2R5PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL2dyaWQvc3JjL3NpdGUveGRvYy9pbmRleC54bWwgYi8wLjEwL2dyaWQvc3JjL3NpdGUveGRvYy9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzhlNGVhNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvc2l0ZS94ZG9jL2luZGV4LnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3INCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3INCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzDQorZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90DQordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mDQordGhlIExpY2Vuc2UgYXQNCisNCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUDQorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQ0KK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyDQordGhlIExpY2Vuc2UuDQorLS0+DQorPGRvY3VtZW50Pg0KKyAgPHByb3BlcnRpZXM+DQorICAgIDx0aXRsZT5XZWIgR3JpZDwvdGl0bGU+DQorICAgIDxhdXRob3IgZW1haWw9J1NlYW4uS2VsbHlAanBsLm5hc2EuZ292Jz5TZWFuIEtlbGx5PC9hdXRob3I+DQorICA8L3Byb3BlcnRpZXM+DQorICA8IS0tIFNpcml1cyBJc25lc3MgLSBJcnJhdGlvbmFsIFN1YnN0YW5jZSAtLT4NCisgIDxib2R5Pg0KKyAgICA8c2VjdGlvbiBuYW1lPSdXZWIgR3JpZCc+DQorICAgICAgPHA+VGhlIE9PRFQgPGEgaHJlZj0nL2dyaWQvJz5ncmlkIHNlcnZpY2VzPC9hPg0KKwkoPGEgaHJlZj0nL2dyaWQtcHJvZHVjdC8nPnByb2R1Y3Q8L2E+DQorCWFuZCA8YSBocmVmPScvZ3JpZC1wcm9maWxlLyc+cHJvZmlsZTwvYT4gc2VydmljZXMpIHVzZSBDT1JCQQ0KKwlvciBSTUkgYXMgdGhlaXIgdW5kZXJseWluZyBuZXR3b3JrIHRyYW5zcG9ydC4gIEhvd2V2ZXIsDQorCWxpbWl0YXRpb25zIG9mIENPUkJBIGFuZCBSTUkgbWFrZSB0aGVtIGluYXBwcm9wcmlhdGUgZm9yDQorCWxhcmdlLXNjYWxlIGRlcGxveW1lbnRzLiAgRm9yIG9uZSwgYm90aCBhcmUgcHJvY2VkdXJhbA0KKwltZWNoYW5pc21zLCBwcm92aWRpbmcgYSByZW1vdGUgaW50ZXJmYWNlIHRoYXQgcmVzZW1ibGVzIGENCisJbWV0aG9kIGNhbGwuICBUaGlzIG1ha2VzIHN0cmVhbWluZyBvZiBkYXRhIGZyb20gYSBzZXJ2aWNlDQorCWltcG9zc2libGUsIGJlY2F1c2UgdGhlcmUgYXJlIGxpbWl0YXRpb25zIHRvIHRoZSBzaXplcyBvZiBkYXRhDQorCXN0cnVjdHVyZXMgdGhhdCBjYW4gYmUgcGFzc2VkIG92ZXIgYSByZW1vdGUgbWV0aG9kIGNhbGwuDQorCUluc3RlYWQsIHJlcGVhdGVkIGNhbGxzIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBlYWNoIGJsb2NrIG9mDQorCWEgcHJvZHVjdCwgbWFraW5nIHRyYW5zZmVyIHNwZWVkcyBob3JyaWJseSBzbG93IGNvbXBhcmVkIHRvDQorCUhUVFAgb3IgRlRQLiAgKEJsb2NrLWJhc2VkIHJldHJpZXZhbCBvZiBwcm9maWxlcyB3YXMgbmV2ZXINCisJaW1wbGVtZW50ZWQsIHJlc3VsdGluZyBpbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbnMgZm9yIGxhcmdlDQorCXByb2ZpbGUgcmVzdWx0cywgd2hpY2ggaXMgYW5vdGhlciBwcm9ibGVtLikNCisgICAgICA8L3A+DQorICAgICAgPHA+U2Vjb25kLCBib3RoIENPUkJBIGFuZCBSTUkgcmVseSBvbiBhIGNlbnRyYWwgbmFtZSByZWdpc3RyeS4NCisJVGhlIHJlZ2lzdHJ5IG1ha2VzIGFuIG9iamVjdCBpbmRlcGVuZGVudCBvZiBpdHMgbmV0d29yaw0KKwlsb2NhdGlvbiwgZW5hYmxpbmcgYSBjbGllbnQgdG8gY2FsbCBpdCBieSBuYW1lIChsb29raW5nIHVwIGl0cw0KKwlsYXN0IGtub3duIGxvY2F0aW9uIGluIHRoZSByZWdpc3RyeSkuICBIb3dldmVyLCB0aGlzIHJlcXVpcmVzDQorCXRoYXQgc2VydmVyIG9iamVjdHMgYmUgYWJsZSB0byBtYWtlIG91dGJvdW5kIG5ldHdvcmsgY2FsbHMgdG8NCisJdGhlIHJlZ2lzdHJ5ICh0aHJvdWdoIGFueSBvdXRib3VuZCBmaXJld2FsbCksIGFuZCB0aGF0IHRoZQ0KKwlyZWdpc3RyeSBhY2NlcHQgdGhvc2UgcmVnaXN0cmF0aW9ucyAodGhyb3VnaCBhbnkgaW5ib3VuZA0KKwlmaXJld2FsbCkuICBUaGlzIHJlcXVpcmVkIGFkbWluaXN0cmF0aXZlIGFjdGlvbiBhdA0KKwlpbnN0aXR1dGlvbnMgaG9zdGluZyBzZXJ2ZXIgb2JqZWN0cyBhbmQgYXQgdGhlIGluc3RpdHV0aW9uDQorCWhvc3RpbmcgdGhlIHJlZ2lzdHJ5LiAgT2Z0ZW4sIHRoZXNlIGZpcmV3YWxsIGV4Y2VwdGlvbnMgd291bGQNCisJY2hhbmdlIHdpdGhvdXQgbm90aWNlIGFzIHN5c3RlbSBhZG1pbnN0cmF0b3JzIGNoYW5nZWQgYXQgZWFjaA0KKwlsb2NhdGlvbiAoYXBwYXJlbnRseSBmaXJld2FsbCBleGNlcHRpb25zIGFyZSBwb29ybHkgZG9jdW1lbnRlZA0KKwlldmVyeXdoZXJlKS4NCisgICAgICA8L3A+DQorICAgICAgPHA+RnVydGhlciwgaW4gdGhlIHR3byBtYWpvciBkZXBsb3ltZW50cyBvZiBPT0RUIChQRFMgYW5kIEVEUk4pLA0KKwlzZXJ2ZXIgb2JqZWN0cyBoYXZlIGFsbW9zdCBuZXZlciBtb3ZlZCwgbnVsbGlmeWluZyBhbnkgYmVuZWZpdA0KKwlvZiB0aGUgcmVnaXN0cnkuICBUaGlzIHByb2plY3QsIE9PRFQgV2ViIEdyaWQsIGF2b2lkcyB0aGUNCisJcHJvbGVtcyBvZiBDT1JCQSBhbmQgUk1JIGJ5IHVzaW5nIEhUVFAgYXMgdGhlIHRyYW5zcG9ydA0KKwltZWNoYW5pc20gZm9yIHByb2R1Y3RzIGFuZCBwcm9maWxlcy4gIEZ1cnRoZXIsIGl0IHByb3ZpZGVzIGENCisJcGFzc3dvcmQtcHJvdGVjdGVkIG1lY2hhbmlzbSB0byBhZGQgbmV3IHNldHMgb2YgcHJvZHVjdCBhbmQNCisJcHJvZmlsZSBxdWVyeSBoYW5kbGVycywgZW5hYmxpbmcgc2VhbWxlc3MgYWN0aXZhdGlvbiBvZg0KKwlhZGRpdGlvbmFsIGNhcGFiaWxpdGllcy4NCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisgICAgPHNlY3Rpb24gbmFtZT0nRG9jdW1lbnRhdGlvbic+DQorICAgICAgPHA+RnVydGhlciBkb2N1bWVudGF0aW9uIG9uIFdlYiBHcmlkIGlzIGZvcnRoY29taW5nLiAgSW4gdGhlDQorCW1lYW4gdGltZSwgY2hlY2sgb3V0IHRoZXNlIDxhIGhyZWY9Jy4vc2xpZGVzLnBkZic+cHJlc2VudGF0aW9uDQorCXNsaWRlczwvYT4uICAoRG9uJ3Qgd29ycnksIHRoZXkncmUgbm90IGluIFBvd2VyUG9pbnQgZm9ybWF0LikNCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisgIDwvYm9keT4NCis8L2RvY3VtZW50Pg0KZGlmZiAtLWdpdCBhLzAuMTAvZ3JpZC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Db25maWd1cmF0aW9uVGVzdC5qYXZhIGIvMC4xMC9ncmlkL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9ncmlkL0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU0MjgxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvZ3JpZC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvZ3JpZC9Db25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmdyaWQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3QgdGhlIHtAbGluayBDb25maWd1cmF0aW9ufSBjbGFzcy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbmZpZ3VyYXRpb25UZXN0PC9jb2RlPiBpbnN0YW5jZS4KKyAgICogCisgICAqIEBwYXJhbSBjYXNlTmFtZQorICAgKiAgICAgICAgICBUZXN0IGNhc2UgbmFtZS4KKyAgICovCisgIHB1YmxpYyBDb25maWd1cmF0aW9uVGVzdChTdHJpbmcgY2FzZU5hbWUpIHsKKyAgICBzdXBlcihjYXNlTmFtZSk7CisgIH0KKworICAvKioKKyAgICogU2V0IHVwIGJ5IGNyZWF0aW5nIGEgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlLgorICAgKiAKKyAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuc2V0VXAoKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkiLAorICAgICAgICAib3JnLmFwYWNoZS54ZXJjZXMuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSIsCisgICAgICAgICJvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIsCisgICAgICAgICJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIik7CisgICAgY29uZmlnRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImNvbmZpZyIsICIueG1sIik7CisgICAgY29uZmlnRmlsZS5kZWxldGVPbkV4aXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBUZWFyIGRvd24gYnkgZGVsZXRpbmcgdGhlIHRlbXBvcmFyeSBjb25maWcgZmlsZS4KKyAgICogCisgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAqICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIGNvbmZpZ0ZpbGUuZGVsZXRlKCk7CisgICAgc3VwZXIudGVhckRvd24oKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IHRvIHNlZSBpZiB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHtAbGluayBDb25maWd1cmF0aW9ufSBhcmUKKyAgICogcmVhc29uYWJsZS4KKyAgICogCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKGNvbmZpZ0ZpbGUpOworICAgIGFzc2VydFRydWUoIkV4cGVjdCBsb2NhbGhvc3Qgbm90IHJlcXVpcmVkIGJ5IGRlZmF1bHQiLCAhY29uZmlnCisgICAgICAgIC5pc0xvY2FsaG9zdFJlcXVpcmVkKCkpOworICAgIGFzc2VydFRydWUoIkV4cGVjdCBodHRwcyBub3QgcmVxdWlyZWQgYnkgZGVmYXVsdCIsICFjb25maWcKKyAgICAgICAgLmlzSFRUUFNyZXF1aXJlZCgpKTsKKyAgICBhc3NlcnRUcnVlKCJFeHBlY3Qgbm8gcHJvZHVjdCBzZXJ2ZXJzIGJ5IGRlZmF1bHQiLCBjb25maWcKKyAgICAgICAgLmdldFByb2R1Y3RTZXJ2ZXJzKCkuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRUcnVlKCJFeHBlY3Qgbm8gcHJvZmlsZSBzZXJ2ZXJzIGJ5IGRlZmF1bHQiLCBjb25maWcKKyAgICAgICAgLmdldFByb2ZpbGVTZXJ2ZXJzKCkuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRUcnVlKCJEZWZhdWx0IHBhc3N3b3JkIG5vdCBzZXQiLCBBcnJheXMuZXF1YWxzKAorICAgICAgICBDb25maWd1cmF0aW9uLkRFRkFVTFRfUEFTU1dPUkQsIGNvbmZpZy5nZXRQYXNzd29yZCgpKSk7CisgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0IG5vIHByb3BlcnRpZXMiLCBjb25maWcuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7CisgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0IG5vIGNvZGUgYmFzZXMiLCBjb25maWcuZ2V0Q29kZUJhc2VzKCkuaXNFbXB0eSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IHRvIHNlZSBpZiB0aGUgbXV0YXRvcnMgd29yay4KKyAgICogCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICogICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RNdXRhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKGNvbmZpZ0ZpbGUpOworCisgICAgYXNzZXJ0VHJ1ZSghY29uZmlnLmlzSFRUUFNyZXF1aXJlZCgpKTsKKyAgICBjb25maWcuc2V0SFRUUFNyZXF1aXJlZCh0cnVlKTsKKyAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgc2V0IGh0dHBzIGFzIHJlcXVpcmVkIiwgY29uZmlnLmlzSFRUUFNyZXF1aXJlZCgpKTsKKworICAgIGFzc2VydFRydWUoIWNvbmZpZy5pc0xvY2FsaG9zdFJlcXVpcmVkKCkpOworICAgIGNvbmZpZy5zZXRMb2NhbGhvc3RSZXF1aXJlZCh0cnVlKTsKKyAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgc2V0IGxvY2FsaG9zdCBhcyByZXF1aXJlZCIsIGNvbmZpZy5pc0xvY2FsaG9zdFJlcXVpcmVkKCkpOworCisgICAgYnl0ZVtdIHBhc3N3b3JkID0geyAoYnl0ZSkgJ3gnLCAoYnl0ZSkgJ3knLCAoYnl0ZSkgJ3onIH07CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKENvbmZpZ3VyYXRpb24uREVGQVVMVF9QQVNTV09SRCwgY29uZmlnCisgICAgICAgIC5nZXRQYXNzd29yZCgpKSk7CisgICAgY29uZmlnLnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICBhc3NlcnRUcnVlKCJDYW5ub3QgY2hhbmdlIHBhc3N3b3JkIiwgQXJyYXlzLmVxdWFscyhwYXNzd29yZCwgY29uZmlnCisgICAgICAgIC5nZXRQYXNzd29yZCgpKSk7CisKKyAgICB0cnkgeworICAgICAgY29uZmlnLnNldFBhc3N3b3JkKG51bGwpOworICAgICAgZmFpbCgiTnVsbCBwYXNzd29yZCBhbGxvd2VkIik7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGdvb2QpIHsKKyAgICB9CisKKyAgICAvLyBQcm9maWxlL3Byb2R1Y3Qgc2VydmVycyBpbiB0aGUgY29uZmlnIGhhdmUgbm8gbXV0YXRvcnMgdG8gdGVzdCAodGhleQorICAgIC8vIHJldHVybiByZWZlcmVuY2VzIHRvIGVhY2ggU2V0KS4gU2FtZSB3aXRoIFByb3BlcnRpZXMgYW5kIGNvZGUgYmFzZXMuCisgIH0KKworICAvKioKKyAgICogVGVzdCB0byBzZWUgaWYgWE1MIHNlcmlhbGl6YXRpb24gd29ya3MuCisgICAqIAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAqICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAqICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICBDb25maWd1cmF0aW9uIGEgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWdGaWxlKTsKKworICAgIGJ5dGVbXSBwYXNzd29yZCA9IHsgKGJ5dGUpICd4JywgKGJ5dGUpICd5JywgKGJ5dGUpICd6JyB9OworICAgIFVSTCBwcm9kU2VydmVyVVJMID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9wcm9kLmphciIpOworICAgIFVSTCBwcm9mU2VydmVyVVJMID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9wcm9mLmphciIpOworICAgIFByb2R1Y3RTZXJ2ZXIgcHJvZCA9IG5ldyBQcm9kdWN0U2VydmVyKGEsICJwcm9kIik7CisgICAgUHJvZmlsZVNlcnZlciBwcm9mID0gbmV3IFByb2ZpbGVTZXJ2ZXIoYSwgInByb2YiKTsKKworICAgIGEuc2V0TG9jYWxob3N0UmVxdWlyZWQodHJ1ZSk7CisgICAgYS5zZXRIVFRQU3JlcXVpcmVkKHRydWUpOworICAgIGEuc2V0UGFzc3dvcmQocGFzc3dvcmQpOworICAgIGEuZ2V0UHJvZHVjdFNlcnZlcnMoKS5hZGQocHJvZCk7CisgICAgYS5nZXRQcm9maWxlU2VydmVycygpLmFkZChwcm9mKTsKKyAgICBhLmdldFByb3BlcnRpZXMoKS5zZXRQcm9wZXJ0eSgiYSIsICJiIik7CisgICAgYS5nZXRDb2RlQmFzZXMoKS5hZGQocHJvZFNlcnZlclVSTCk7CisgICAgYS5nZXRDb2RlQmFzZXMoKS5hZGQocHJvZlNlcnZlclVSTCk7CisgICAgYS5zYXZlKCk7CisKKyAgICBDb25maWd1cmF0aW9uIGIgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWdGaWxlKTsKKyAgICBhc3NlcnRUcnVlKCJsb2NhbGhvc3Qgc3RhdGUgbm90IHNhdmVkIiwgYi5pc0xvY2FsaG9zdFJlcXVpcmVkKCkpOworICAgIGFzc2VydFRydWUoImh0dHBzIHN0YXRlIG5vdCBzYXZlZCIsIGIuaXNIVFRQU3JlcXVpcmVkKCkpOworICAgIGFzc2VydFRydWUoIlBhc3N3b3JkIG5vdCBzYXZlZCIsIEFycmF5cy5lcXVhbHMocGFzc3dvcmQsIGIuZ2V0UGFzc3dvcmQoKSkpOworICAgIGFzc2VydEVxdWFscygiUHJvZHVjdCBzZXJ2ZXIgbm90IHNhdmVkIiwgMSwgYi5nZXRQcm9kdWN0U2VydmVycygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJQcm9kdWN0IHNlcnZlciBub3Qgc2F2ZWQgcHJvcGVybHkiLCBwcm9kLCBiCisgICAgICAgIC5nZXRQcm9kdWN0U2VydmVycygpLml0ZXJhdG9yKCkubmV4dCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlByb2ZpbGUgc2VydmVyIG5vdCBzYXZlZCIsIDEsIGIuZ2V0UHJvZmlsZVNlcnZlcnMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygiUHJvZmlsZSBzZXJ2ZXIgbm90IHNhdmVkIHByb3Blcmx5IiwgcHJvZiwgYgorICAgICAgICAuZ2V0UHJvZmlsZVNlcnZlcnMoKS5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0aWVzIG5vdCBzYXZlZCBwcm9wZXJseSIsICJiIiwgYi5nZXRQcm9wZXJ0aWVzKCkKKyAgICAgICAgLmdldFByb3BlcnR5KCJhIikpOworICAgIGFzc2VydEVxdWFscygiQ29kZSBiYXNlcyBub3Qgc2F2ZWQgcHJvcGVybHkiLCAyLCBiLmdldENvZGVCYXNlcygpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZShiLmdldENvZGVCYXNlcygpLmNvbnRhaW5zKHByb2RTZXJ2ZXJVUkwpKTsKKyAgICBhc3NlcnRUcnVlKGIuZ2V0Q29kZUJhc2VzKCkuY29udGFpbnMocHJvZlNlcnZlclVSTCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJDb25maWd1cmF0aW9uLmVxdWFscyBkb2Vzbid0IHdvcmsiLCBhLCBiKTsKKyAgfQorCisgIC8qKiBUZXN0IGNvbmZpZyBmaWxlLiAqLworICBwcml2YXRlIEZpbGUgY29uZmlnRmlsZTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvcG9tLnhtbCBiLzAuMTAvbWV0YWRhdGEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzcwZjgwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9wb20ueG1sCkBAIC0wLDAgKzEsMTg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxhcnRpZmFjdElkPmNhcy1tZXRhZGF0YTwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+Q2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2aWNlIEdlbmVyaWMgTXVsdGktdmFsdWVkIE1ldGFkYXRhIENvbnRhaW5lcjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkEgTXVsdGktdmFsdWVkLCBnZW5lcmljIE1ldGFkYXRhIGNvbnRhaW5lciBjbGFzcy4gVGhlIGNsYXNzIHVzZXMgYW4gaW50ZXJuYWwKKwlNYXAgb2Ygc3RyaW5nIGtleXMgcG9pbnRpbmcgdG8gdmVjdG9ycyBvZiBzdHJpbmdzLiBUaGUgZGF0YQorCXN0cnVjdHVyZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKwlbc3RkOnN0cmluZyBrZXld4oeSc3RkOnZlY3RvciBvZiBzdGQ6c3RyaW5ncworCisJVGhlIG11bHRpLXZhbHVlZCBuYXR1cmUgb2YgdGhlIGNsYXNzIGlzIGhhbmRsZWQgdHJhbnNwYXJlbnRseSBieSB0aGlzIE1ldGFkYXRhCisJY29udGFpbmVyLiBTaW5jZSBhbGwgdmFsdWVzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyBzdHJpbmcgdmVjdG9ycywgdGhlIGRpZmZlcmVuY2UKKwliZXR3ZWVuIGEgc2NhbGFyIHZhbHVlIGFuZCBhIG5vbi1zY2FsYXIgaXMgaGFuZGxlZCBieSBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBsaXN0IG9mCisJdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIga2V5IGlzIGdyZWF0ZXIgdGhhbiAxLjwvZGVzY3JpcHRpb24+CisgIDxzY20+CisgICAJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvbWV0YWRhdGE8L2Nvbm5lY3Rpb24+CisgICAJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvbWV0YWRhdGE8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAJPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjEwLXJjMi9tZXRhZGF0YTwvdXJsPgorICA8L3NjbT4KKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvdXRpbDwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+dGlrYS1taW1ldHlwZXMueG1sPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi44LjE8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgorCisgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmphdmEuaW8udG1wZGlyPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX08L3ZhbHVlPgorICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgPG5hbWU+amF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU8L25hbWU+CisgICAgICAgICAgICAgPHZhbHVlPiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllczwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgPGZvcmtNb2RlPm5ldmVyPC9mb3JrTW9kZT4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0YWRhdGFUZXN0Q2FzZS5qYXZhPC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3Rlc3RkYXRhLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovcmVzb3VyY2VzL2V4YW1wbGVzLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBjcy1pbnB1dDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlrYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnRpa2EtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjUuNDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWhpYmVybmF0ZTM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjAuODwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmphdmF4LnRyYW5zYWN0aW9uPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmp0YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MTAuMC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisJPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS45LjU8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisJPC9kZXBlbmRlbmN5PgorCTxkZXBlbmRlbmN5PgorCSAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorCSAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtYWxsPC9hcnRpZmFjdElkPgorCSAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NvbmYvY2FzLm1ldGFkYXRhLmR0ZCBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY29uZi9jYXMubWV0YWRhdGEuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTgwYTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NvbmYvY2FzLm1ldGFkYXRhLmR0ZApAQCAtMCwwICsxLDM2IEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgQSBNdWx0aS12YWx1ZWQsIGdlbmVyaWMgTWV0YWRhdGEgY29udGFpbmVyIHNjaGVtYS4gVGhlIGNsYXNzIHVzZXMgYSBtYXAgb2YKKyBzdHJpbmcga2V5cyBwb2ludGluZyB0byB2ZWN0b3JzIG9mIHN0cmluZ3MuIFRoZSBkYXRhIHN0cnVjdHVyZSBsb29rcyBsaWtlCisgdGhlIGZvbGxvd2luZzoKKworIFtzdGQ6c3RyaW5nIGtleV09PjxzdGQ6dmVjdG9yIG9mIHN0ZDpzdHJpbmdzPgorCisgVGhlIG11bHRpLXZhbHVlZCBuYXR1cmUgb2YgdGhlIGNsYXNzIGlzIGhhbmRsZWQgdHJhbnNwYXJlbnRseSBieSB0aGlzIE1ldGFkYXRhCisgY29udGFpbmVyLiBTaW5jZSBhbGwgdmFsdWVzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyBzdHJpbmcgdmVjdG9ycywgdGhlIGRpZmZlcmVuY2UKKyBiZXR3ZWVuIGEgc2NhbGFyIHZhbHVlIGFuZCBhIG5vbi1zY2FsYXIgaXMgaGFuZGxlZCBieSBkZXRlcm1pbmcgd2hldGhlciB0aGUgbGlzdCBvZgorIHZhbHVlcyBmb3IgYSBwYXJ0aWN1bGFyIGtleSBpcyBncmVhdGVyIHRoYW4gMS4gCistLT4KKworPCFFTEVNRU5UIG1ldGFkYXRhIChrZXl2YWwpKj4KKworPCFFTEVNRU5UIGtleXZhbCAoa2V5LCB2YWwrKT4KKworPCFFTEVNRU5UIGtleSAoI1BDREFUQSk+CisKKzwhRUxFTUVOVCB2YWwgKCNQQ0RBVEEpPgpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jb25mL2Nhcy5tZXRhZGF0YS54c2QgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NvbmYvY2FzLm1ldGFkYXRhLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBhODU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jb25mL2Nhcy5tZXRhZGF0YS54c2QKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyBBIE11bHRpLXZhbHVlZCwgZ2VuZXJpYyBNZXRhZGF0YSBjb250YWluZXIgc2NoZW1hLiBUaGUgY2xhc3MgdXNlcyBhIG1hcCBvZiANCisgc3RyaW5nIGtleXMgcG9pbnRpbmcgdG8gdmVjdG9ycyBvZiBzdHJpbmdzLiBUaGUgZGF0YSBzdHJ1Y3R1cmUgbG9va3MgbGlrZSANCisgdGhlIGZvbGxvd2luZzogDQorDQorIFtzdGQ6c3RyaW5nIGtleV09PjxzdGQ6dmVjdG9yIG9mIHN0ZDpzdHJpbmdzPg0KKw0KKyBUaGUgbXVsdGktdmFsdWVkIG5hdHVyZSBvZiB0aGUgY2xhc3MgaXMgaGFuZGxlZCB0cmFuc3BhcmVudGx5IGJ5IHRoaXMgTWV0YWRhdGENCisgY29udGFpbmVyLiBTaW5jZSBhbGwgdmFsdWVzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyBzdHJpbmcgdmVjdG9ycywgdGhlIGRpZmZlcmVuY2UNCisgYmV0d2VlbiBhIHNjYWxhciB2YWx1ZSBhbmQgYSBub24tc2NhbGFyIGlzIGhhbmRsZWQgYnkgZGV0ZXJtaW5nIHdoZXRoZXIgdGhlIGxpc3Qgb2YNCisgdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIga2V5IGlzIGdyZWF0ZXIgdGhhbiAxLiANCistLT4NCis8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KKwk8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIHR5cGU9InhzOnN0cmluZyIvPg0KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0ia2V5dmFsVHlwZSI+DQorCQk8eHM6c2VxdWVuY2U+DQorCQkJPHhzOmVsZW1lbnQgcmVmPSJrZXkiLz4NCisJCQk8eHM6ZWxlbWVudCByZWY9InZhbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisJCTwveHM6c2VxdWVuY2U+DQorCTwveHM6Y29tcGxleFR5cGU+DQorCTx4czplbGVtZW50IG5hbWU9Im1ldGFkYXRhIj4NCisJCTx4czpjb21wbGV4VHlwZT4NCisJCQk8eHM6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQorCQkJCTx4czplbGVtZW50IG5hbWU9ImtleXZhbCIgdHlwZT0ia2V5dmFsVHlwZSIvPg0KKwkJCTwveHM6c2VxdWVuY2U+DQorCQk8L3hzOmNvbXBsZXhUeXBlPg0KKwk8L3hzOmVsZW1lbnQ+DQorCTx4czplbGVtZW50IG5hbWU9InZhbCIgdHlwZT0ieHM6c3RyaW5nIi8+DQorPC94czpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jcHAvTWFrZWZpbGUgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NwcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDFiNDYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jcHAvTWFrZWZpbGUKQEAgLTAsMCArMSwzNCBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIG1ha2UgdGhlIE1ldGFkYXRhIGxpYnJhcnkKKyMKK0NGTEFHUz0gLWcgLVdhbGwKK0NDPWdjYworTElCUkFSSUVTID0gLWx4ZXJjZXMtYyAtbHN0ZGMrKworSU5DTFVERVMgPSAtSS91c3IvaW5jbHVkZS94ZXJjZXNjLworCithbGw6ICAgIG1ldGFkYXRhLm8KKworIyBjbGVhbiBvdXQgdGhlIGRyb3NzCitjbGVhbjoKKwkJcm0gKi5vIHRlc3QKKyAgICAgICAgCittZXRhZGF0YS5vOiBNZXRhZGF0YS5oIFhTdHIuaAorCQkkKENDKSAtYyBNZXRhZGF0YS5jcHAgJChJTkNMVURFUykKKwordGVzdDogbWV0YWRhdGEubworCQkkKENDKSAtZyBtZXRhZGF0YS5vIHRlc3RNZXRhZGF0YS5jcHAgJChMSUJSQVJJRVMpIC1vIHRlc3QKKwkJCmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NwcC9NZXRhZGF0YS5jcHAgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NwcC9NZXRhZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzYjgxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY3BwL01ldGFkYXRhLmNwcApAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIE1FVEFEQVRBX0NQUF8KKyNkZWZpbmUgTUVUQURBVEFfQ1BQXworCisjaW5jbHVkZSAiTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJYU3RyLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8eGVyY2VzYy9kb20vRE9NLmhwcD4KKyNpbmNsdWRlPHhlcmNlc2MvZG9tL0RPTURvY3VtZW50LmhwcD4KKyNpbmNsdWRlPHhlcmNlc2MvZG9tL0RPTUVsZW1lbnQuaHBwPgorI2luY2x1ZGU8eGVyY2VzYy9kb20vRE9NTm9kZUxpc3QuaHBwPgorI2luY2x1ZGUgPHhlcmNlc2MvdXRpbC9QbGF0Zm9ybVV0aWxzLmhwcD4KKyNpbmNsdWRlIDx4ZXJjZXNjL3V0aWwvWE1MU3RyaW5nLmhwcD4KKyNpbmNsdWRlIDx4ZXJjZXNjL2ZyYW1ld29yay9TdGRPdXRGb3JtYXRUYXJnZXQuaHBwPgorI2luY2x1ZGUgPHhlcmNlc2MvdXRpbC9PdXRPZk1lbW9yeUV4Y2VwdGlvbi5ocHA+CisjaWZkZWYgWEVSQ0VTX0NQUF9OQU1FU1BBQ0VfVVNFCitYRVJDRVNfQ1BQX05BTUVTUEFDRV9VU0UKKyNlbmRpZgorCisjZGVmaW5lIFgoc3RyKSBYU3RyKHN0cikudW5pY29kZUZvcm0oKQorCisvL1NURCBpbXBvcnRzCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgY2FzCit7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0YWRhdGEgY29udGFpbmVyIG1ldGhvZHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkKK3ZlY3RvcjxzdHJpbmc+IE1ldGFkYXRhOjpFTVBUWV9WRUMoMCk7CitzdHJpbmcgTWV0YWRhdGE6OkVNUFRZX1NUUjsKKworTWV0YWRhdGE6Ok1ldGFkYXRhKCkKK3sKKwkKK30KKworTWV0YWRhdGE6Ok1ldGFkYXRhKERPTURvY3VtZW50ICpkb2MpCit7CisgICBET01FbGVtZW50ICptZXRhZGF0YVJvb3RFbGVtID0gZG9jLT5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgIAorICAgaWYobWV0YWRhdGFSb290RWxlbSA9PSBOVUxMKXsKKyAgIAlyZXR1cm47CisgICB9CisgICAKKyAgIFhNTENoICprZXlWYWxTdHIgPSBYTUxTdHJpbmc6OnRyYW5zY29kZSgia2V5dmFsIik7CisgICBET01Ob2RlTGlzdCAqa2V5VmFsRWxlbXMgPSBtZXRhZGF0YVJvb3RFbGVtLT5nZXRFbGVtZW50c0J5VGFnTmFtZShrZXlWYWxTdHIpOworICAgCisgICBjb25zdCBYTUxTaXplX3Qgbm9kZUNvdW50ID0ga2V5VmFsRWxlbXMtPmdldExlbmd0aCgpOworICAgCisgICAvL2NvdXQgPDwgIk1ldGFkYXRhOjpjb25zdHJ1Y3RvcjogIEZvdW5kICIgPDwgbm9kZUNvdW50IDw8ICIga2V5dmFsIGVsZW1lbnRzIiA8PCBlbmRsOworICAgCisgICBmb3IoWE1MU2l6ZV90IGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspeworICAgICBET01Ob2RlKiBjdXJyZW50Tm9kZSA9IGtleVZhbEVsZW1zLT5pdGVtKGkpIDsKKyAgICAgICAgCisgICAgIGlmKGN1cnJlbnROb2RlID09IE5VTEwpeworICAgICAgIAkgIGNvbnRpbnVlOworICAgICB9CisgICAgIAkKKyAgICAgaWYoIHhlcmNlc2M6OkRPTU5vZGU6OkVMRU1FTlRfTk9ERSAhPSBjdXJyZW50Tm9kZS0+Z2V0Tm9kZVR5cGUoKSApeworICAgICAgIC8vIG5vdCBhbiBlbGVtZW50IG5vZGUgLT4gbm90IG9mIGludGVyZXN0IGhlcmUKKyAgICAgICAgY29udGludWUgOworICAgICB9CisKKyAgICAgRE9NRWxlbWVudCogbWV0YWRhdGFFbGVtID0gZHluYW1pY19jYXN0PCB4ZXJjZXNjOjpET01FbGVtZW50KiA+KGN1cnJlbnROb2RlKTsKKworICAgICAKKyAgICAgc3RyaW5nIGtleTsKKyAgICAgcmVhZChtZXRhZGF0YUVsZW0sICJrZXkiLCBrZXkpOworICAgICB2ZWN0b3I8c3RyaW5nPiB2YWx1ZXM7CisgICAgIHJlYWRNYW55KG1ldGFkYXRhRWxlbSwgInZhbCIsIHZhbHVlcyk7CisgICAgIAorICAgICAvKmNvdXQgPDwgIlByb2Nlc3NpbmcgRE9NRWxlbWVudCAoa2V5LCB2YWx1ZXMpOiAoIiA8PCBrZXkgPDwgIiwgIjsKKyAgICAgCisgICAgIGZvcihpbnQgaj0wOyBqIDwgdmFsdWVzLnNpemUoKTsgaisrKXsKKyAgICAgCWNvdXQgPDwgdmFsdWVzW2pdIDw8ICIsICI7CisgICAgIH0KKyAgICAgCisgICAgIGNvdXQgPDwgIikiIDw8IGVuZGw7Ki8KKyAgICAgCisgICAgIGVsZW1lbnRNYXBba2V5XSA9IHZhbHVlczsKKyAgICAgICAgCQorICAgfQkKK30KKworTWV0YWRhdGE6On5NZXRhZGF0YSgpCit7Cit9CisKKwordm9pZCBNZXRhZGF0YTo6cmVhZChET01FbGVtZW50ICplbGVtLCBjb25zdCBzdHJpbmcmIGtleSwgc3RyaW5nJiB2YWx1ZSl7CisJWE1MQ2ggKnRhZ05hbWUgPSBYTUxTdHJpbmc6OnRyYW5zY29kZShrZXkuY19zdHIoKSk7CisJRE9NTm9kZUxpc3QgKnZhbHVlTm9kZXMgPSBlbGVtLT5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKKwkKKwlET01Ob2RlKiB2YWxFbGVtID0gdmFsdWVOb2Rlcy0+aXRlbSgwKTsKKwl2YWx1ZSA9IGdldFNpbXBsZU5vZGVUZXh0KHZhbEVsZW0pOworfQorIAorCit2b2lkIE1ldGFkYXRhOjpyZWFkTWFueShET01FbGVtZW50ICplbGVtLCBjb25zdCBzdHJpbmcmIGtleSwgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyl7CisJWE1MQ2ggKnRhZ05hbWUgPSBYTUxTdHJpbmc6OnRyYW5zY29kZShrZXkuY19zdHIoKSk7CisJRE9NTm9kZUxpc3QgKnZhbHVlTm9kZXMgPSBlbGVtLT5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKKwkKKyAgICBmb3IoaW50IGk9MDsgaSA8IHZhbHVlTm9kZXMtPmdldExlbmd0aCgpOyBpKyspeworICAgIAkgIERPTU5vZGUgKnZhbEVsZW0gPSB2YWx1ZU5vZGVzLT5pdGVtKGkpOworICAgIAkgIHN0cmluZyB2YWx1ZSA9IGdldFNpbXBsZU5vZGVUZXh0KHZhbEVsZW0pOworICAgIAkgIHZhbHVlcy5wdXNoX2JhY2sodmFsdWUpOworICAgIH0KK30KKworYm9vbCBNZXRhZGF0YTo6Y29udGFpbnNLZXkoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0eworCXJldHVybiBlbGVtZW50TWFwLmZpbmQoa2V5KSAhPSBlbGVtZW50TWFwLmVuZCgpOworfQorCitib29sIE1ldGFkYXRhOjppc011bHRpVmFsdWVkKGNvbnN0IHN0cmluZyYga2V5KXsKKyAgICBpZihlbGVtZW50TWFwLmZpbmQoa2V5KSAhPSBlbGVtZW50TWFwLmVuZCgpKXsKKyAgICAJdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9IGVsZW1lbnRNYXBba2V5XTsKKyAgICAJcmV0dXJuIHZhbHVlcy5zaXplKCkgPiAxOworICAgIH0KKyAgICBlbHNlIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNZXRhZGF0YTo6YWRkTWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXksIGNvbnN0IHN0cmluZyYgdmFsdWUpeworCWlmKGVsZW1lbnRNYXAuZmluZChrZXkpICE9IGVsZW1lbnRNYXAuZW5kKCkpewkKKwkJdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9IGVsZW1lbnRNYXBba2V5XTsKKwkJdmFsdWVzLnB1c2hfYmFjayh2YWx1ZSk7CisJfQorCWVsc2V7CisJCXZlY3RvcjxzdHJpbmc+IHZhbHVlczsKKwkJdmFsdWVzLnB1c2hfYmFjayh2YWx1ZSk7CisJCWVsZW1lbnRNYXBba2V5XSA9IHZhbHVlczsKKwl9Cit9CisKK3ZvaWQgTWV0YWRhdGE6OmFkZE1ldGFkYXRhKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdmFsdWVzKXsKKwlpZihlbGVtZW50TWFwLmZpbmQoa2V5KSAhPSBlbGVtZW50TWFwLmVuZCgpKXsKKwkJdmVjdG9yPHN0cmluZz4mIGV4aXN0aW5nVmFsdWVzID0gZWxlbWVudE1hcFtrZXldOworCQkKKyAgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKXsKKyAgICAgICAgIAlleGlzdGluZ1ZhbHVlcy5wdXNoX2JhY2sodmFsdWVzW2ldKTsKKyAgICAgICAgIH0KKwl9CisJZWxzZXsKKwkJZWxlbWVudE1hcFtrZXldID0gdmFsdWVzOworCX0KK30KKwordm9pZCBNZXRhZGF0YTo6cmVtb3ZlTWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXkpeworCWlmKGVsZW1lbnRNYXAuZmluZChrZXkpICE9IGVsZW1lbnRNYXAuZW5kKCkpeworCQllbGVtZW50TWFwLmVyYXNlKGtleSk7CisJfQorfQorCit2b2lkIE1ldGFkYXRhOjpyZXBsYWNlTWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXksIGNvbnN0IHN0cmluZyYgdmFsdWUpeworCXJlbW92ZU1ldGFkYXRhKGtleSk7CisJdmVjdG9yPHN0cmluZz4gdmFsdWVzOworCXZhbHVlcy5wdXNoX2JhY2sodmFsdWUpOworCWVsZW1lbnRNYXBba2V5XSA9IHZhbHVlczsKK30KKwkJCit2b2lkIE1ldGFkYXRhOjpyZXBsYWNlTWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXksIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMpeworCXJlbW92ZU1ldGFkYXRhKGtleSk7CisJZWxlbWVudE1hcFtrZXldID0gdmFsdWVzOworfQorCQorY29uc3Qgc3RyaW5nJiBNZXRhZGF0YTo6Z2V0TWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXkpeworCWlmKGVsZW1lbnRNYXAuZmluZChrZXkpICE9IGVsZW1lbnRNYXAuZW5kKCkpeworCQlyZXR1cm4gKGVsZW1lbnRNYXBba2V5XSlbMF07CisJfQorCWVsc2UgcmV0dXJuIEVNUFRZX1NUUjsKK30KKworY29uc3QgdmVjdG9yPHN0cmluZz4mIE1ldGFkYXRhOjpnZXRBbGxNZXRhZGF0YShjb25zdCBzdHJpbmcmIGtleSl7CisgICAgaWYoZWxlbWVudE1hcC5maW5kKGtleSkgIT0gZWxlbWVudE1hcC5lbmQoKSl7CisgICAgCSAgICByZXR1cm4gZWxlbWVudE1hcFtrZXldOworICAgIH0KKyAgICBlbHNlIHJldHVybiBFTVBUWV9WRUM7CisgICAgCQkKK30KKworc3RyaW5nIE1ldGFkYXRhOjpnZXRTaW1wbGVOb2RlVGV4dChET01Ob2RlKiBub2RlKXsKKyAgICBzdHJpbmcgbm9kZVR4dCA9ICIiOworICAgIERPTU5vZGVMaXN0ICpjaGlsZHJlbiA9IG5vZGUtPmdldENoaWxkTm9kZXMoKTsKKyAgICBmb3IoaW50IGk9MDsgaSA8IGNoaWxkcmVuLT5nZXRMZW5ndGgoKTsgaSsrKXsKKyAgICAgIERPTU5vZGUgKm4gPSBjaGlsZHJlbi0+aXRlbShpKTsKKyAgICAgIGlmKG4tPmdldE5vZGVUeXBlKCkgPT0gRE9NTm9kZTo6VEVYVF9OT0RFKXsKKyAgICAgICAgIGNvbnN0IFhNTENoICp4bWxUZXh0ID0gbi0+Z2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICBub2RlVHh0Kz1YTUxTdHJpbmc6OnRyYW5zY29kZSh4bWxUZXh0KTsKKyAgICAgIH0gICAgCisgICAgfQorCisgICByZXR1cm4gbm9kZVR4dDsKK30KKworRE9NRG9jdW1lbnQqIE1ldGFkYXRhOjp0b1hNTCh2b2lkKXsKKyAgICAvLyBJbml0aWFsaXplIHRoZSBYTUw0QzIgc3lzdGVtLgorICAgIHRyeQorICAgIHsKKyAgICAgICAgWE1MUGxhdGZvcm1VdGlsczo6SW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIGNhdGNoKGNvbnN0IFhNTEV4Y2VwdGlvbiYgdG9DYXRjaCkKKyAgICB7CisgICAgICAgIGNoYXIgKnBNc2cgPSBYTUxTdHJpbmc6OnRyYW5zY29kZSh0b0NhdGNoLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIFhFUkNFU19TVERfUVVBTElGSUVSIGNlcnIgPDwgIkVycm9yIGR1cmluZyBYZXJjZXMtYyBJbml0aWFsaXphdGlvbi5cbiIKKyAgICAgICAgICAgICA8PCAiICBFeGNlcHRpb24gbWVzc2FnZToiCisgICAgICAgICAgICAgPDwgcE1zZzsKKyAgICAgICAgWE1MU3RyaW5nOjpyZWxlYXNlKCZwTXNnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisKKyAgIHsKKyAgICAgICBET01JbXBsZW1lbnRhdGlvbiogaW1wbCA9ICBET01JbXBsZW1lbnRhdGlvblJlZ2lzdHJ5OjpnZXRET01JbXBsZW1lbnRhdGlvbihYKCJDb3JlIikpOworCisgICAgICAgaWYgKGltcGwgIT0gTlVMTCkKKyAgICAgICB7CisgICAgICAgICAgIHRyeQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBET01Eb2N1bWVudCogZG9jID0gaW1wbC0+Y3JlYXRlRG9jdW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogY2hhbmdlIG5hbWVzcGFjZSBVUkk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICBYKCJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIpLCAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCBlbGVtZW50IG5hbWVzcGFjZSBVUkkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYKCJjYXM6bWV0YWRhdGEiKSwgICAgICAgICAvLyByb290IGVsZW1lbnQgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcERvY3R5cGUqLyk7ICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50IHR5cGUgb2JqZWN0IChEVEQpLgorCisgICAgICAgICAgICAgICBET01FbGVtZW50KiByb290RWxlbSA9IGRvYy0+Z2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgZm9yKG1hcDxzdHJpbmcsIHZlY3RvcjxzdHJpbmc+ID46Oml0ZXJhdG9yIGkgPSBlbGVtZW50TWFwLmJlZ2luKCk7IGkgIT0gZWxlbWVudE1hcC5lbmQoKTsgaSsrKXsKKyAgICAgICAgICAgICAgCURPTUVsZW1lbnQqIG1ldGFFbGVtID0gZG9jLT5jcmVhdGVFbGVtZW50KFgoImtleXZhbCIpKTsKKyAgICAgICAgICAgICAgCXJvb3RFbGVtLT5hcHBlbmRDaGlsZChtZXRhRWxlbSk7CisgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgICAgCURPTUVsZW1lbnQqIGtleUVsZW0gPSBkb2MtPmNyZWF0ZUVsZW1lbnQoWCgia2V5IikpOworICAgICAgICAgICAgICAJbWV0YUVsZW0tPmFwcGVuZENoaWxkKGtleUVsZW0pOworICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgIAlET01UZXh0KiBrZXlUZXh0RWxlbSA9IGRvYy0+Y3JlYXRlVGV4dE5vZGUoWChpLT5maXJzdCkpOworICAgICAgICAgICAgICAJa2V5RWxlbS0+YXBwZW5kQ2hpbGQoa2V5VGV4dEVsZW0pOworICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgIAlpZihpLT5zZWNvbmQuc2l6ZSgpID4gMSl7CisgICAgICAgICAgICAgIAkJbWV0YUVsZW0tPnNldEF0dHJpYnV0ZShYKCJ0eXBlIiksIFgoInZlY3RvciIpKTsKKyAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgCWVsc2V7CisgICAgICAgICAgICAgIAkJbWV0YUVsZW0tPnNldEF0dHJpYnV0ZShYKCJ0eXBlIiksIFgoInNjYWxhciIpKTsKKyAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAJZm9yKGludCBqPTA7IGogPCBpLT5zZWNvbmQuc2l6ZSgpOyBqKyspeworICAgICAgICAgICAgICAJCURPTUVsZW1lbnQqIHZhbHVlRWxlbSA9IGRvYy0+Y3JlYXRlRWxlbWVudChYKCJ2YWwiKSk7CisgICAgICAgICAgICAgIAkgICAgRE9NVGV4dCogdmFsVGV4dEVsZW0gPSBkb2MtPmNyZWF0ZVRleHROb2RlKFgoaS0+c2Vjb25kW2pdKSk7CisgICAgICAgICAgICAgIAkgICAgdmFsdWVFbGVtLT5hcHBlbmRDaGlsZCh2YWxUZXh0RWxlbSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGFFbGVtLT5hcHBlbmRDaGlsZCh2YWx1ZUVsZW0pOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKKyAgICAgICAgICAgfQorICAgICAgICAgICBjYXRjaCAoY29uc3QgT3V0T2ZNZW1vcnlFeGNlcHRpb24mKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBYRVJDRVNfU1REX1FVQUxJRklFUiBjZXJyIDw8ICJPdXRPZk1lbW9yeUV4Y2VwdGlvbiIgPDwgWEVSQ0VTX1NURF9RVUFMSUZJRVIgZW5kbDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBjYXRjaCAoY29uc3QgRE9NRXhjZXB0aW9uJiBlKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBYRVJDRVNfU1REX1FVQUxJRklFUiBjZXJyIDw8ICJET01FeGNlcHRpb24gY29kZSBpczogICIgPDwgZS5jb2RlIDw8IFhFUkNFU19TVERfUVVBTElGSUVSIGVuZGw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgWEVSQ0VTX1NURF9RVUFMSUZJRVIgY2VyciA8PCAiQW4gZXJyb3Igb2NjdXJyZWQgY3JlYXRpbmcgdGhlIGRvY3VtZW50IiA8PCBYRVJDRVNfU1REX1FVQUxJRklFUiBlbmRsOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgIFhFUkNFU19TVERfUVVBTElGSUVSIGNlcnIgPDwgIlJlcXVlc3RlZCBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIiA8PCBYRVJDRVNfU1REX1FVQUxJRklFUiBlbmRsOworICAgICAgIH0KKyAgIH0KKworICAgWE1MUGxhdGZvcm1VdGlsczo6VGVybWluYXRlKCk7CisgICByZXR1cm4gTlVMTDsKK30KKworfQorCisjZW5kaWYgLypNRVRBREFUQV9DUFBfKi8KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY3BwL01ldGFkYXRhLmggYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NwcC9NZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzVmZTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NwcC9NZXRhZGF0YS5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgTUVUQURBVEFfSF8KKyNkZWZpbmUgTUVUQURBVEFfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHhlcmNlc2MvZG9tL0RPTS5ocHA+CisjaWZkZWYgWEVSQ0VTX0NQUF9OQU1FU1BBQ0VfVVNFCitYRVJDRVNfQ1BQX05BTUVTUEFDRV9VU0UKKyNlbmRpZgorCisvL1NURCBpbXBvcnRzCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgY2FzCit7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBIE11bHRpLXZhbHVlZCwgZ2VuZXJpYyBNZXRhZGF0YSBjb250YWluZXIgY2xhc3MuIFRoZSBjbGFzcyB1c2VzIGFuIGludGVybmFsCitTVEwgbWFwIG9mIFNUTCBzdHJpbmcga2V5cyBwb2ludGluZyB0byBTVEwgdmVjdG9ycyBvZiBTVEwgc3RyaW5ncy4gVGhlIGRhdGEgCitzdHJ1Y3R1cmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOiAKKworW3N0ZDpzdHJpbmcga2V5XT0+PHN0ZDp2ZWN0b3Igb2Ygc3RkOnN0cmluZ3M+CisKK1RoZSBtdWx0aS12YWx1ZWQgbmF0dXJlIG9mIHRoZSBjbGFzcyBpcyBoYW5kbGVkIHRyYW5zcGFyZW50bHkgYnkgdGhpcyBNZXRhZGF0YQorY29udGFpbmVyLiBTaW5jZSBhbGwgdmFsdWVzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyBzdHJpbmcgdmVjdG9ycywgdGhlIGRpZmZlcmVuY2UKK2JldHdlZW4gYSBzY2FsYXIgdmFsdWUgYW5kIGEgbm9uLXNjYWxhciBpcyBoYW5kbGVkIGJ5IGRldGVybWluZyB3aGV0aGVyIHRoZSBsaXN0IG9mCit2YWx1ZXMgZm9yIGEgcGFydGljdWxhciBrZXkgaXMgZ3JlYXRlciB0aGFuIDEuIAorCitUaGUgY2xhc3MgcmVsaWVzIG9uIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtYy8iPkFwYWNoZSdzIHhlcmNlcy1jIAoraW1wbGVtZW50YXRpb248L2E+IGZvciBvdXRwdXR0aW5nIGFuZCByZWFkaW5nIGluIGEgTWV0YWRhdGEgY29udGFpbmVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBNZXRhZGF0YQoreworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgTWV0YWRhdGEgY29udGFpbmVyIG9iamVjdAorICAgICAqLworCU1ldGFkYXRhKCk7CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IE1ldGFkYXRhIGNvbnRhaW5lciBvYmplY3QgZnJvbSBhbiBleGlzdGluZyBET00gc3RyZWFtLgorCSAqIFRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgd2hlbiB5b3UgaGF2ZSBhbiBleHRlcm5hbCBNZXRhZGF0YSBYTUwgZmlsZSB0aGF0IG5lZWRzCisJICogdG8gYmUgcmVhZCBpbnRvIGEgbWFuaXB1bGF0ZWFibGUgb2JqZWN0IGluIG1lbW9yeS4KKwkgKiAKKwkgKiBAcGFyYW0gZG9jIFRoZSBET00gZG9jdW1lbnQgdG8gcGFyc2UgYW5kIHR1cm4gaW50byBhIE1ldGFkYXRhIGNvbnRhaW5lciBvYmplY3QuCisJICovCisJTWV0YWRhdGEoRE9NRG9jdW1lbnQgKmRvYyk7CisJCisJLyoqCisJICogRGVmYXVsdCBEZXN0cnVjdG9yLCBkZWxldGVzIHRoZSBpbnRlcm5hbCBtYXAuCisJICovCisJdmlydHVhbCB+TWV0YWRhdGEoKTsKKwkKKwkvKioKKwkgKiBBZGRzIGEgc2luZ2xlIHN0cmluZyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5rZXk8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBhZGQgdGhlIHN0cmluZyB2YWx1ZSBmb3IuCisJICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdmFsdWUgdG8gYWRkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgorCSAqLworCXZvaWQgYWRkTWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXksIGNvbnN0IHN0cmluZyYgdmFsdWUpOworCQorCS8qKgorCSAqIEFkZHMgYSB2ZWN0b3Igb2Ygc3RyaW5nIHZhbHVlcyAoaW4gb3JkZXIpIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4uCisJICogCisJICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGFkZCB0aGUgc3RyaW5nIHZhbHVlIGZvci4KKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB2ZWN0b3Igb2Ygc3RyaW5nIHZhbHVlcyB0byBhcHBlbmQgdG8gdGhlIGtleSdzIHZhbHVlIGxpc3QuCisJICovCisJdm9pZCBhZGRNZXRhZGF0YShjb25zdCBzdHJpbmcmIGtleSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyk7CisJCisJLyoqCisJICogR2V0cyB0aGUgZmlyc3QgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBnaXZlbiA8Y29kZT5rZXk8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBvYnRhaW4gdGhlIGZpcnN0IHN0cmluZyBtZXRhZGF0YSB2YWx1ZSBmb3IuCisJICogQHJldHVybiBUaGUgZmlyc3QgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgorCSAqLworCWNvbnN0IHN0cmluZyYgZ2V0TWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXkpOworCQorCS8qKgorCSAqIEdldHMgQWxsIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZm9yIHRoZSBnaXZlbiA8Y29kZT5rZXk8L2NvZGU+LCBpbiBvcmRlci4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gb2J0YWluIGFsbCBtZXRhZGF0YSB2YWx1ZXMgZm9yLgorCSAqIEByZXR1cm4gYW4gU1RMIHZlY3RvciBvZiBTVEwgc3RyaW5ncywgY29ycmVzcG9uZGluZyB0byBhbGwgdGhlIHZhbHVlcyBmb3IgYSBwYXJ0aWN1bGFyCisJICogbWV0YWRhdGEga2V5LgorCSAqLworCWNvbnN0IHZlY3RvcjxzdHJpbmc+JiBnZXRBbGxNZXRhZGF0YShjb25zdCBzdHJpbmcmIGtleSk7CisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+a2V5PC9jb2RlPiBleGlzdHMgaW4gdGhlIE1ldGFkYXRhIGNvbnRhaW5lciwgCisJICogZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIAorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBjaGVjayBmb3IgZXhpc3RhbmNlIG9mLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCWJvb2wgY29udGFpbnNLZXkoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0OworCQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaGFzID4gMSB2YWx1ZXMgaW4gdGhlIE1ldGFkYXRhCisJICogY29udGFpbmVyLCBmYWxzZSBvdGhlcndpc2UuCisJICogCisJICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGNoZWNrIGZvciA+IDEgdmFsdWVzIGZvci4KKwkgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlID4gMSB2YWx1ZXMsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlib29sIGlzTXVsdGlWYWx1ZWQoY29uc3Qgc3RyaW5nJiBrZXkpOworCQorCS8qKgorCSAqIFJlbW92ZXMgdGhlIHZhbHVlcywgYWxvbmcgd2l0aCB0aGUgZXhpc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQKKwkgKiA8Y29kZT5rZXk8L2NvZGU+IHdpdGhpbiB0aGUgTWV0YWRhdGEgY29udGFpbmVyLgorCSAqIAorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZW1vdmUgdGhlIHZhbHVlcyBhbmQgdGhlIGV4aXN0YW5jZSBvZi4KKwkgKi8KKwl2b2lkIHJlbW92ZU1ldGFkYXRhKGNvbnN0IHN0cmluZyYga2V5KTsKKwkKKwkvKioKKwkgKiBSZXBsYWNlcyB0aGUgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4sIHdpdGggdGhlCisJICogc2NhbGFyIHN0cmluZyA8Y29kZT52YWx1ZTwvY29kZT4gcGFyYW1ldGVyLgorCSAqIAorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZXBsYWNlIHRoZSB2YWx1ZXMgZm9yLgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgc2NhbGFyIHN0cmluZyB2YWx1ZSB0byBhdHRhY2ggdG8gdGhlIHNwZWNpZmllZCBrZXkuCisJICovCisJdm9pZCByZXBsYWNlTWV0YWRhdGEoY29uc3Qgc3RyaW5nJiBrZXksIGNvbnN0IHN0cmluZyYgdmFsdWUpOworCQorCS8qKgorCSAqIFJlcGxhY2VzIHRoZSB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+a2V5PC9jb2RlPiwgd2l0aCB0aGUKKwkgKiB2ZWN0b3Igb2Ygc3RyaW5nIDxjb2RlPnZhbHVlczwvY29kZT4gcGFyYW1ldGVyLgorCSAqIAorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZXBsYWNlIHRoZSB2YWx1ZXMgZm9yLgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmVjdG9yIG9mIHN0cmluZyB2YWx1ZXMgdG8gYXR0YWNoIHRvIHRoZSBzcGVjaWZpZWQga2V5LgorCSAqLworCXZvaWQgcmVwbGFjZU1ldGFkYXRhKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdmFsdWVzKTsKKwkKKwkvKioKKwkgKiBTZXJpYWxpemVzIHRoZSBNZXRhZGF0YSBjb250YWluZXIgaW50byBhIFhlcmNlcyBET00gZG9jdW1lbnQuIFJldHVybnMKKwkgKiBhIHBvaW50ZXIgdG8gdGhlIERPTURvY3VtZW50LCB3aGljaCBjYW4gYmUgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBpbnRvCisJICogYSBmaWxlLCBvciBTVERPVVQvZXRjLgorCSAqIAorCSAqIEByZXR1cm4gYSBYZXJjZXMgRE9NIGRvY3VtZW50IChYTUwpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNZXRhZGF0YSBjb250YWluZXIuCisJICovCisJRE9NRG9jdW1lbnQqIHRvWE1MKHZvaWQpOyAKKwkKKwkvLyB0aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgZm9yIG1ldGhvZHMgdGhhdCBtdXN0IHJldHVybiBhIHZlY3RvcjogdGhpcworCS8vIHZlY3RvciBpcyBzaXplIDAsIHdpdGggbm8gZWxlbWVudHMKKyAgICBzdGF0aWMgdmVjdG9yPHN0cmluZz4gRU1QVFlfVkVDOworICAgIAorICAgIC8vIHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSBmb3IgbWV0aG9kcyB0aGF0IG11c3QgcmV0dXJuIGFuIHN0bCBzdHJpbmcKKyAgICBzdGF0aWMgc3RyaW5nIEVNUFRZX1NUUjsKKwkKKworcHJpdmF0ZToKKyAgICBtYXA8c3RyaW5nLCB2ZWN0b3I8c3RyaW5nPiA+IGVsZW1lbnRNYXA7CisgICAgCisgICAgdm9pZCByZWFkKERPTUVsZW1lbnQgKmVsZW0sIGNvbnN0IHN0cmluZyYga2V5LCBzdHJpbmcmIHZhbHVlKTsKKyAgICB2b2lkIHJlYWRNYW55KERPTUVsZW1lbnQgKmVsZW0sIGNvbnN0IHN0cmluZyYga2V5LCB2ZWN0b3I8c3RyaW5nPiYgdmFsdWVzKTsKKyAgICBzdHJpbmcgZ2V0U2ltcGxlTm9kZVRleHQoRE9NTm9kZSAqbm9kZSk7CisgICAgCit9OworCit9CisKKyNlbmRpZiAvKk1FVEFEQVRBX0hfKi8KKwpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jcHAvWFN0ci5oIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jcHAvWFN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQyZTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2NwcC9YU3RyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoNCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisqLw0KKw0KKyNpZm5kZWYgX1hTVFJfSF8NCisjZGVmaW5lIF9YU1RSX0hfDQorDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gIFRoaXMgaXMgYSBzaW1wbGUgY2xhc3MgdGhhdCBsZXRzIHVzIGRvIGVhc3kgKHRob3VnaCBub3QgdGVycmlibHkgZWZmaWNpZW50KQ0KKy8vICB0cmFuY29kaW5nIG9mIGNoYXIqIGRhdGEgdG8gWE1MQ2ggZGF0YS4NCisvLyAgDQorLy8gIFRoaXMgY2xhc3Mgd2FzIHRha2VuIGZyb20gQXBhY2hlJ3MgeGVyY2VzLWMgc2FtcGxlcy4NCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitjbGFzcyBYU3RyDQorew0KK3B1YmxpYyA6DQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgIC8vICBDb25zdHJ1Y3RvcnMgYW5kIERlc3RydWN0b3INCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgWFN0cihjb25zdCBjaGFyKiBjb25zdCB0b1RyYW5zY29kZSkNCisgICAgew0KKyAgICAgICAgLy8gQ2FsbCB0aGUgcHJpdmF0ZSB0cmFuc2NvZGluZyBtZXRob2QNCisgICAgICAgIGZVbmljb2RlRm9ybSA9IFhNTFN0cmluZzo6dHJhbnNjb2RlKHRvVHJhbnNjb2RlKTsNCisgICAgfQ0KKyAgICANCisgICAgWFN0cihjb25zdCBzdHJpbmcmIHRvVHJhbnNjb2RlKXsNCisgICAgICAgIGZVbmljb2RlRm9ybSA9IFhNTFN0cmluZzo6dHJhbnNjb2RlKHRvVHJhbnNjb2RlLmNfc3RyKCkpOwkNCisgICAgfQ0KKw0KKyAgICB+WFN0cigpDQorICAgIHsNCisgICAgICAgIFhNTFN0cmluZzo6cmVsZWFzZSgmZlVuaWNvZGVGb3JtKTsNCisgICAgfQ0KKw0KKw0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAvLyAgR2V0dGVyIG1ldGhvZHMNCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgY29uc3QgWE1MQ2gqIHVuaWNvZGVGb3JtKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGZVbmljb2RlRm9ybTsNCisgICAgfQ0KKw0KK3ByaXZhdGUgOg0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAvLyAgUHJpdmF0ZSBkYXRhIG1lbWJlcnMNCisgICAgLy8NCisgICAgLy8gIGZVbmljb2RlRm9ybQ0KKyAgICAvLyAgICAgIFRoaXMgaXMgdGhlIFVuaWNvZGUgWE1MQ2ggZm9ybWF0IG9mIHRoZSBzdHJpbmcuDQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgIFhNTENoKiAgIGZVbmljb2RlRm9ybTsNCit9Ow0KKw0KKyNlbmRpZiAvL19YU1RSX0hfDQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jcHAvZGF0YS9zYW1wbGUubWV0LnhtbCBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY3BwL2RhdGEvc2FtcGxlLm1ldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4OTg0YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY3BwL2RhdGEvc2FtcGxlLm1ldC54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIiA/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBGSVhNRTogY2hhbmdlIG5hbWVzcGFjZSBVUkk/IC0tPgorPGNhczptZXRhZGF0YSB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKworICA8a2V5dmFsIHR5cGU9InNjYWxhciI+CisgICAgPGtleT5rZXkxPC9rZXk+CisgICAgPHZhbD52YWwxPC92YWw+CisgIDwva2V5dmFsPgorCisgIDxrZXl2YWwgdHlwZT0idmVjdG9yIj4KKyAgICA8a2V5PmtleTI8L2tleT4KKyAgICA8dmFsPnZhbDE8L3ZhbD4KKyAgICA8dmFsPnZhbDI8L3ZhbD4KKyAgICA8dmFsPnZhbDM8L3ZhbD4KKyAgPC9rZXl2YWw+CisKKyAgPGtleXZhbCB0eXBlPSJzY2FsYXIiPgorICAgIDxrZXk+a2V5Mzwva2V5PgorICAgIDx2YWw+dmFsMzwvdmFsPgorICA8L2tleXZhbD4KKworICA8a2V5dmFsIHR5cGU9InZlY3RvciI+CisgICAgPGtleT5rZXk1PC9rZXk+CisgICAgPHZhbD5rZXk1X3JlcGxhY2VkX3ZhbDE8L3ZhbD4KKyAgICA8dmFsPmtleTVfcmVwbGFjZWRfdmFsMjwvdmFsPgorICA8L2tleXZhbD4KKworICA8a2V5dmFsIHR5cGU9InNjYWxhciI+CisgICAgPGtleT5rZXk2PC9rZXk+CisgICAgPHZhbD5rZXk2X3JlcGxhY2VkX3ZhbDE8L3ZhbD4KKyAgPC9rZXl2YWw+CisKKzwvY2FzOm1ldGFkYXRhPgpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9jcHAvdGVzdE1ldGFkYXRhLmNwcCBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY3BwL3Rlc3RNZXRhZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ZWE0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vY3BwL3Rlc3RNZXRhZGF0YS5jcHAKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgIk1ldGFkYXRhLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4gCisjaW5jbHVkZSA8eGVyY2VzYy9kb20vRE9NLmhwcD4KKyNpbmNsdWRlIDx4ZXJjZXNjL2RvbS9ET01JbXBsZW1lbnRhdGlvbi5ocHA+CisjaW5jbHVkZSA8eGVyY2VzYy9kb20vRE9NSW1wbGVtZW50YXRpb25MUy5ocHA+CisjaW5jbHVkZSA8eGVyY2VzYy9mcmFtZXdvcmsvU3RkT3V0Rm9ybWF0VGFyZ2V0LmhwcD4KKyNpbmNsdWRlPHhlcmNlc2MvcGFyc2Vycy9YZXJjZXNET01QYXJzZXIuaHBwPgorCisjaWZkZWYgWEVSQ0VTX0NQUF9OQU1FU1BBQ0VfVVNFCitYRVJDRVNfQ1BQX05BTUVTUEFDRV9VU0UKKyNlbmRpZgorCisvL1NURCBpbXBvcnRzCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvL0NBUyBpbXBvcnRzCit1c2luZyBuYW1lc3BhY2UgY2FzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUHNldWRvLXVuaXQgdGVzdHMgZm9yIHRoZSBNZXRhZGF0YSBjb250YWluZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG1haW4odm9pZCl7CisJCisJTWV0YWRhdGEgbWV0YWRhdGE7CisJCisJbWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTEiLCAidmFsMSIpOworCQorCXZlY3RvcjxzdHJpbmc+IHZhbHVlczsKKwkKKwl2YWx1ZXMucHVzaF9iYWNrKCJ2YWwxIik7CisJdmFsdWVzLnB1c2hfYmFjaygidmFsMiIpOworCXZhbHVlcy5wdXNoX2JhY2soInZhbDMiKTsKKwkKKwltZXRhZGF0YS5hZGRNZXRhZGF0YSgia2V5MiIsIHZhbHVlcyk7CisJCisJY291dCA8PCAiQ2hlY2tpbmcgdGhlIHZhbHVlIG9mIGtleTE6IFZhbHVlOiAiIDw8IG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkxIikgPDwgZW5kbDsKKwljb3V0IDw8ICJDaGVja2luZyB0aGUgdmFsdWUgb2Yga2V5MjogVmFsdWU6ICIgPDwgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTIiKSA8PCBlbmRsOworCisJdmVjdG9yPHN0cmluZz4ga2V5MlZhbHMgPSBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgia2V5MiIpOworCWNvdXQgPDwgIkNoZWNraW5nIGFsbCB2YWx1ZXMgZm9yIGtleTI6IFZhbHVlczogIiA8PCBlbmRsOworCQkKKwlmb3IoaW50IGk9MDsgaSA8IGtleTJWYWxzLnNpemUoKTsgaSsrKXsKKwkJIGNvdXQgPDwgIlZhbHVlOiAiIDw8IGtleTJWYWxzW2ldIDw8IGVuZGw7CisJfQorCQkKKyAgICBpZihtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgia2V5MyIpID09IGNhczo6TWV0YWRhdGE6OkVNUFRZX1ZFQyl7CisgICAgCSAgIGNvdXQgPDwgIk5vIG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5MyEiIDw8IGVuZGw7CisgICAgfQorICAgIAorICAgIGlmKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkzIikgPT0gY2FzOjpNZXRhZGF0YTo6RU1QVFlfU1RSKXsKKyAgICAJY291dCA8PCAiTm8gc2luZ3VsYXIgdmFsdWUgZm9yIGtleTMhIiA8PCBlbmRsOworICAgIH0KKwkKKwltZXRhZGF0YS5hZGRNZXRhZGF0YSgia2V5MyIsICJ2YWwzIik7CisJCisJaWYobWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTMiKSAhPSBjYXM6Ok1ldGFkYXRhOjpFTVBUWV9TVFIpeworCQljb3V0IDw8ICJOZXcgdmFsdWUgZm9yIGtleTM6ICIgPDwgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTMiKSA8PCBlbmRsOworCX0KKwkKKwlpZighbWV0YWRhdGEuY29udGFpbnNLZXkoImJsYWgiKSl7CisJCWNvdXQgPDwgIk1ldGFkYXRhIGRvZXNuJ3QgY29udGFpbiBrZXkgYmxhaDogY29ycmVjdCEiIDw8IGVuZGw7CisJfQorCQorCWlmKG1ldGFkYXRhLmNvbnRhaW5zS2V5KCJrZXkzIikpeworCQljb3V0IDw8ICJNZXRhZGF0YSBjb250YWlucyBrZXkga2V5MzogY29ycmVjdCEiIDw8IGVuZGw7CisJfQorCQorCWlmKG1ldGFkYXRhLmlzTXVsdGlWYWx1ZWQoImtleTIiKSl7CisJCWNvdXQgPDwgIktleTIgaXMgY29ycmVjdGx5IG11bHRpLXZhbHVlZDogY29ycmVjdCEiIDw8IGVuZGw7CisJfQorCQorCWlmKCFtZXRhZGF0YS5pc011bHRpVmFsdWVkKCJrZXkzIikpeworCQljb3V0IDw8ICJLZXkzIGlzIGNvcnJlY3RseSBOT1QgbXVsdGktdmFsdWVkOiBjb3JyZWN0ISIgPDwgZW5kbDsKKwl9CisJCisJbWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTQiLCAidmFsOTkiKTsKKwkKKwlpZihtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5NCIpICE9IGNhczo6TWV0YWRhdGE6OkVNUFRZX1NUUil7CisJCWNvdXQgPDwgIk1ldGFkYXRhIGV4aXN0cyBmb3Iga2V5NCwgbm93IGRlbGV0aW5nIGtleTQgYW5kIHJldGVzdGluZyIgPDwgZW5kbDsKKwkJCisJCW1ldGFkYXRhLnJlbW92ZU1ldGFkYXRhKCJrZXk0Iik7CisJCQorCQlpZihtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5NCIpID09IGNhczo6TWV0YWRhdGE6OkVNUFRZX1NUUil7CisJCQljb3V0IDw8ICJNZXRhZGF0YSBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmb3Iga2V5NCEgIiA8PCBlbmRsOworCQl9CisJfQorCQorCXZlY3RvcjxzdHJpbmc+IGtleTV2YWxzOworCWtleTV2YWxzLnB1c2hfYmFjaygia2V5NXZhbDEiKTsKKwlrZXk1dmFscy5wdXNoX2JhY2soImtleTV2YWwyIik7CisJCisJbWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTUiLCBrZXk1dmFscyk7CisJCisJdmVjdG9yPHN0cmluZz4ga2V5NXJlcGx2YWxzOworCWtleTVyZXBsdmFscy5wdXNoX2JhY2soImtleTVfcmVwbGFjZWRfdmFsMSIpOworCWtleTVyZXBsdmFscy5wdXNoX2JhY2soImtleTVfcmVwbGFjZWRfdmFsMiIpOworCQorCW1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YSgia2V5NSIsIGtleTVyZXBsdmFscyk7CisKKwlmb3IoaW50IGk9MDsgaSA8IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKCJrZXk1Iikuc2l6ZSgpOyBpKyspeworCQkgY291dCA8PCAiVmFsdWU6ICIgPDwgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoImtleTUiKVtpXSA8PCBlbmRsOworCX0JCisJCisJbWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTYiLCAia2V5NnZhbDEiKTsKKwkKKwlpZihtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5NiIpID09ICJrZXk2dmFsMSIpeworCQljb3V0IDw8ICJrZXk2OiB2YWx1ZSA9IGtleTZ2YWwxLCBhcyBhcHByb3ByaWF0ZSIgPDwgZW5kbDsKKwl9CisJCisJbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKCJrZXk2IiwgImtleTZfcmVwbGFjZWRfdmFsMSIpOworCQorCWlmKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXk2IikgPT0gImtleTZfcmVwbGFjZWRfdmFsMSIpeworCQljb3V0IDw8ICJrZXk2OiB2YWx1ZSA9IGtleTZfcmVwbGFjZWRfdmFsMSwgYXMgYXBwcm9wcmlhdGUiIDw8IGVuZGw7CisJfQorCQorCQorCWNvdXQgPDwgIlhNTCBpczogIiA8PCBlbmRsOworICAgIERPTURvY3VtZW50KiBkb2MgPSBtZXRhZGF0YS50b1hNTCgpOworCVhNTENoIHRlbXBTdHJbMTAwXTsKKyAKKworCVhNTFN0cmluZzo6dHJhbnNjb2RlKCJMUyIsIHRlbXBTdHIsIDk5KTsKKwlET01JbXBsZW1lbnRhdGlvbiAqaW1wbCAgICAgICAgICA9IERPTUltcGxlbWVudGF0aW9uUmVnaXN0cnk6OmdldERPTUltcGxlbWVudGF0aW9uKHRlbXBTdHIpOworICAgIERPTUxTU2VyaWFsaXplciogdGhlU2VyaWFsaXplciA9ICgoRE9NSW1wbGVtZW50YXRpb25MUyopaW1wbCktPmNyZWF0ZUxTU2VyaWFsaXplcigpOworCisKKwlpZiAodGhlU2VyaWFsaXplci0+Z2V0RG9tQ29uZmlnKCktPmNhblNldFBhcmFtZXRlcihYTUxVbmk6OmZnRE9NV1JURm9ybWF0UHJldHR5UHJpbnQsIHRydWUpKQorCSAgdGhlU2VyaWFsaXplci0+Z2V0RG9tQ29uZmlnKCktPnNldFBhcmFtZXRlcihYTUxVbmk6OmZnRE9NV1JURm9ybWF0UHJldHR5UHJpbnQsIHRydWUpOworCisJWE1MRm9ybWF0VGFyZ2V0ICpteUZvcm1UYXJnZXQ7CisgICAgICAgIG15Rm9ybVRhcmdldCA9IG5ldyBTdGRPdXRGb3JtYXRUYXJnZXQoKTsKKyAgICBET01MU091dHB1dCogdGhlT3V0cHV0ID0gKChET01JbXBsZW1lbnRhdGlvbkxTKilpbXBsKS0+Y3JlYXRlTFNPdXRwdXQoKTsKKyAgICB0aGVPdXRwdXQtPnNldEJ5dGVTdHJlYW0obXlGb3JtVGFyZ2V0KTsKKworCXRoZVNlcmlhbGl6ZXItPndyaXRlKChET01Ob2RlKilkb2MsIHRoZU91dHB1dCk7CisJCisJY291dCA8PCAiTm93IGF0dGVtcHRpbmcgdG8gcGFyc2UgY2FzIHhtbCBkb2N1bWVudDogZGF0YS9zYW1wbGUubWV0LnhtbCIgPDwgZW5kbDsKKwkKKwlYZXJjZXNET01QYXJzZXIgcGFyc2VyXzsKKwkKKwlwYXJzZXJfLnNldFZhbGlkYXRpb25TY2hlbWUoIHhlcmNlc2M6OlhlcmNlc0RPTVBhcnNlcjo6VmFsX05ldmVyICkgOworCXBhcnNlcl8uc2V0RG9OYW1lc3BhY2VzKCBmYWxzZSApIDsKKwlwYXJzZXJfLnNldERvU2NoZW1hKCBmYWxzZSApIDsKKwlwYXJzZXJfLnNldExvYWRFeHRlcm5hbERURCggZmFsc2UgKSA7CisJCisJIHBhcnNlcl8ucGFyc2UoIi4vZGF0YS9zYW1wbGUubWV0LnhtbCIpIDsKKworICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byBmcmVlIHRoaXMgcG9pbnRlciAtLSBpdCdzCisgICAgLy8gb3duZWQgYnkgdGhlIHBhcmVudCBwYXJzZXIgb2JqZWN0CisgICAgRE9NRG9jdW1lbnQqIHhtbERvYyA9IHBhcnNlcl8uZ2V0RG9jdW1lbnQoKSA7CisgICAgCisgICAgY291dCA8PCAiTWV0YWRhdGEgWE1MIGZpbGUgcGFyc2VkOiBjb25zdHJ1Y3RpbmcgQ0FTIE1ldGFkYXRhIG9iamVjdCBmcm9tIGl0ICIgPDwgZW5kbDsKKyAgICAKKyAgICBNZXRhZGF0YSBuZXdNZXRhZGF0YSh4bWxEb2MpOworICAgIAorICAgIGNvdXQgPDwgIk91dHB1dHRpbmcgWE1MIGZyb20gQ0FTIE1ldGFkYXRhICIgPDwgZW5kbDsKKyAgICAgICAgCisgICAgRE9NRG9jdW1lbnQgKm5ld0RvYyA9IG5ld01ldGFkYXRhLnRvWE1MKCk7CisgICAgdGhlU2VyaWFsaXplci0+d3JpdGUoKERPTU5vZGUqKWRvYywgdGhlT3V0cHV0KTsKKyAgICAKKwlyZXR1cm4gMTsKKwkJCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9BYnN0cmFjdE1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvQWJzdHJhY3RNZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE5YjUyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvQWJzdHJhY3RNZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5NZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgY29yZSB7QGxpbmsgTWV0RXh0cmFjdG9yfSBpbXBsZW1lbnRhdGlvbiwgaW1wbGVtZW50aW5nIGFsbCBtZXRob2RzIGJ1dCB7e0BsaW5rICNleHRyYWN0TWV0YWRhdGEoRmlsZSl9CisgKiA8L3A+LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRFeHRyYWN0b3IgeworCisgICAgcHJvdGVjdGVkIE1ldEV4dHJhY3RvckNvbmZpZyBjb25maWc7CisKKyAgICBwcm90ZWN0ZWQgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyIHJlYWRlcjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihBYnN0cmFjdE1ldEV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHVibGljIEFic3RyYWN0TWV0RXh0cmFjdG9yKE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciByZWFkZXIpIHsKKyAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdHMge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgRmlsZX0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBGaWxlfSBmcm9tIHdoaWNoIHtAbGluayBNZXRhZGF0YX0gd2lsbCBiZSBleHRyYWN0ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTWV0YWRhdGF9IGV4dHJhY3RlZAorICAgICAqIEB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWV0YWRhdGEgZXh0ck1ldGFkYXRhKEZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvciNleHRyYWN0TWV0YWRhdGEoamF2YS5pby5GaWxlKQorICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoRmlsZSBmKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmID09IG51bGwgfHwgIWYuZXhpc3RzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbigiRmlsZSAnIiArIGYgKyAiJyBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICByZXR1cm4gdGhpcy5leHRyTWV0YWRhdGEodGhpcy5zYWZlR2V0Q2Fub25pY2FsRmlsZShmKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvciNleHRyYWN0TWV0YWRhdGEoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKFN0cmluZyBmaWxlUGF0aCkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhY3RNZXRhZGF0YShuZXcgRmlsZShmaWxlUGF0aCkpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3IjZXh0cmFjdE1ldGFkYXRhKGphdmEubmV0LlVSTCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKFVSTCBmaWxlVXJsKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0TWV0YWRhdGEodGhpcy5zYWZlR2V0RmlsZUZyb21VcmkoZmlsZVVybCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIFVSTCAnIiArIGZpbGVVcmwgKyAiJyA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3IjZXh0cmFjdE1ldGFkYXRhKGphdmEuaW8uRmlsZSwKKyAgICAgKiAgICAgIGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKEZpbGUgZiwgRmlsZSBjb25maWdGaWxlKQorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLnNldENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RNZXRhZGF0YShmKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yI2V4dHJhY3RNZXRhZGF0YShqYXZhLmlvLkZpbGUsCisgICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoRmlsZSBmLCBTdHJpbmcgY29uZmlnRmlsZVBhdGgpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleHRyYWN0TWV0YWRhdGEoZiwgbmV3IEZpbGUoY29uZmlnRmlsZVBhdGgpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yI2V4dHJhY3RNZXRhZGF0YShqYXZhLmlvLkZpbGUsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKEZpbGUgZiwgTWV0RXh0cmFjdG9yQ29uZmlnIGNvbmZpZykKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RNZXRhZGF0YShmKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yI2V4dHJhY3RNZXRhZGF0YShqYXZhLm5ldC5VUkwsCisgICAgICogICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKFVSTCBmaWxlVXJsLCBNZXRFeHRyYWN0b3JDb25maWcgY29uZmlnKQorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdE1ldGFkYXRhKGZpbGVVcmwpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3Ijc2V0Q29uZmlnRmlsZShqYXZhLmlvLkZpbGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZShGaWxlIGYpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuc2V0Q29uZmlnRmlsZSh0aGlzLnJlYWRlci5wYXJzZUNvbmZpZ0ZpbGUodGhpcworICAgICAgICAgICAgICAgICAgICAuc2FmZUdldENhbm9uaWNhbEZpbGUoZikpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgY29uZmlnIGZpbGUgOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvciNzZXRDb25maWdGaWxlKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yQ29uZmlnKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGUoTWV0RXh0cmFjdG9yQ29uZmlnIGNvbmZpZykgeworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yI3NldENvbmZpZ0ZpbGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworICAgICAgICBzZXRDb25maWdGaWxlKG5ldyBGaWxlKGZpbGVQYXRoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIHNhZmVHZXRGaWxlRnJvbVVyaShVUkwgdXJsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUobmV3IFVSSSh1cmwudG9FeHRlcm5hbEZvcm0oKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGNvbnN0cnVjdGluZyBmaWxlIGZyb20gdXJpOiBbIgorICAgICAgICAgICAgICAgICAgICArIHVybCArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgc2FmZUdldENhbm9uaWNhbEZpbGUoRmlsZSBmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZi5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0IGNhbm9uaWNhbCBmaWxlIGZvciBmaWxlIDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBmICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL01ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZDdjNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL01ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBpbnRlcmZhY2UgZm9yIHtAbGluayBNZXRhZGF0YX0gZXh0cmFjdGlvbi4gVGhpcyBpbnRlcmZhY2UgZXhwZWN0cyB0aGUKKyAqIGRlZmluaXRpb24gb2YgdGhlIGZvbGxvd2luZyB0d28gcGFyYW1ldGVyczoKKyAqIAorICogPHVsPgorICogPGxpPjxiPmZpbGU8L2I+IC0gdGhlIGZpbGUgdG8gZXh0cmFjdCB7QGxpbmsgTWV0YWRhdGF9IGZyb20uPC9saT4KKyAqIDxsaT48Yj5jb25maWcgZmlsZTwvYj4gLSBhIHBvaW50ZXIgdG8gdGhlIGNvbmZpZyBmaWxlIGZvciB0aGlzIE1ldEV4dHJhY3RvcjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWV0RXh0cmFjdG9yIHsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHtAbGluayBNZXRhZGF0YX0gZnJvbSBhIGdpdmVuIHtAbGluayBGaWxlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgRmlsZSBvYmplY3QgdG8gZXh0cmFjdCBNZXRhZGF0YSBmcm9tLgorICAgICAqIEByZXR1cm4gRXh0cmFjdGVkIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIEZpbGV9LgorICAgICAqIEB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJhY3RNZXRhZGF0YShGaWxlIGYpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRXh0cmFjdHMge0BsaW5rIE1ldGFkYXRhfSBmcm9tIGEgZ2l2ZW4gPGNvZGU+L3BhdGgvdG8vc29tZS9maWxlPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICAgKiAgICAgICAgICAgIFBhdGggdG8gYSBnaXZlbiBmaWxlIHRvIGV4dHJhY3QgTWV0YWRhdGEgZnJvbS4KKyAgICAgKiBAcmV0dXJuIEV4dHJhY3RlZCB7QGxpbmsgTWV0YWRhdGF9IGZyb20gdGhlIGdpdmVuIDxjb2RlPmZpbGVQYXRoPC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoU3RyaW5nIGZpbGVQYXRoKQorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0cyB7QGxpbmsgTWV0YWRhdGF9IGZyb20gYSBnaXZlbiB7QGxpbmsgVVJMfSBwb2ludGVyIHRvIGEKKyAgICAgKiB7QGxpbmsgRmlsZX0uCisgICAgICogCisgICAgICogQHBhcmFtIGZpbGVVcmwKKyAgICAgKiAgICAgICAgICAgIFRoZSBVUkwgcG9pbnRlciB0byBhIEZpbGUuCisgICAgICogQHJldHVybiBFeHRyYWN0ZWQge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSBnaXZlbiBGaWxlIHtAbGluayBVUkx9LgorICAgICAqIEB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJhY3RNZXRhZGF0YShVUkwgZmlsZVVybCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb25maWcgZmlsZSBmb3IgdGhpcyBNZXRFeHRyYWN0b3IgdG8gdGhlIHNwZWNpZmllZCB7QGxpbmsgRmlsZX0KKyAgICAgKiA8Y29kZT5mPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgVGhlIGNvbmZpZyBmaWxlIGZvciB0aGlzIE1ldEV4dHJhY3Rvci4KKyAgICAgKiBAdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdGaWxlKEZpbGUgZikgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb25maWcgZmlsZSBmb3IgdGhpcyBNZXRFeHRyYWN0b3IgdG8gdGhlIHNwZWNpZmllZCB7QGxpbmsgRmlsZX0KKyAgICAgKiBpZGVudGlmaWVkIGJ5IDxjb2RlPmZpbGVQYXRoPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICAgKiAgICAgICAgICAgIFRoZSBjb25maWcgZmlsZSBwYXRoIGZvciB0aGlzIE1ldEV4dHJhY3Rvci4KKyAgICAgKiBAdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNZXRFeHRyYWN0b3JDb25maWcgZm9yIHRoZSBNZXRFeHRyYWN0b3IKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnCisgICAgICogICAgICAgICAgICBUaGUgTWV0RXh0cmFjdG9yQ29uZmlnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZShNZXRFeHRyYWN0b3JDb25maWcgY29uZmlnKTsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIEZpbGV9IHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25maWcgZmlsZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgVGhlIEZpbGUgdG8gZXh0cmFjdCBNZXRhZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBjb25maWdGaWxlCisgICAgICogICAgICAgICAgICBUaGUgY29uZmlnIGZpbGUgZm9yIHRoaXMgTWV0RXh0cmFjdG9yLgorICAgICAqIEByZXR1cm4gRXh0cmFjdGVkIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIEZpbGV9IHVzaW5nIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGNvbmZpZyBmaWxlLgorICAgICAqIEB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJhY3RNZXRhZGF0YShGaWxlIGYsIEZpbGUgY29uZmlnRmlsZSkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRXh0cmFjdHMge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgRmlsZX0gdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbmZpZyBmaWxlIHBhdGguCisgICAgICogCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIFRoZSBGaWxlIHRvIGV4dHJhY3QgTWV0YWRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gY29uZmlnRmlsZVBhdGgKKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZSBmb3IgdGhpcyBNZXRFeHRyYWN0b3IuCisgICAgICogQHJldHVybiBFeHRyYWN0ZWQge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgRmlsZX0gdXNpbmcgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgY29uZmlnIGZpbGUgcGF0aC4KKyAgICAgKiBAdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoRmlsZSBmLCBTdHJpbmcgY29uZmlnRmlsZVBhdGgpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHtAbGluayBNZXRhZGF0YX0gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIEZpbGV9IHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB7QGxpbmsgTWV0RXh0cmFjdG9yQ29uZmlnfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBGaWxlfSBmcm9tIHdoaWNoIHtAbGluayBNZXRhZGF0YX0gd2lsbCBiZSBleHRyYWN0ZWQKKyAgICAgKiAgICAgICAgICAgIGZyb20KKyAgICAgKiBAcGFyYW0gY29uZmlnCisgICAgICogICAgICAgICAgICBUaGUgY29uZmlnIGZpbGUgZm9yIHRoZSBleHRyYWN0b3IKKyAgICAgKiBAcmV0dXJuIHtAbGluayBNZXRhZGF0YX0gZXh0cmFjdGVkIGZyb20gdGhlIHtAbGluayBGaWxlfQorICAgICAqIEB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKEZpbGUgZiwgTWV0RXh0cmFjdG9yQ29uZmlnIGNvbmZpZykKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRXh0cmFjdHMge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgVVJMfSB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICoge0BsaW5rIE1ldEV4dHJhY3RvckNvbmZpZ30uCisgICAgICogCisgICAgICogQHBhcmFtIGZpbGVVcmwKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgVVJMfSBmcm9tIHdoaWNoIHtAbGluayBNZXRhZGF0YX0gd2lsbCBiZSBleHRyYWN0ZWQKKyAgICAgKiAgICAgICAgICAgIGZyb20KKyAgICAgKiBAcGFyYW0gY29uZmlnCisgICAgICogICAgICAgICAgICBUaGUgY29uZmlnIGZpbGUgZm9yIHRoZSBleHRyYWN0b3IKKyAgICAgKiBAcmV0dXJuIHtAbGluayBNZXRhZGF0YX0gZXh0cmFjdGVkIGZyb20gdGhlIHtAbGluayBVUkx9CisgICAgICogQHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoVVJMIGZpbGVVcmwsIE1ldEV4dHJhY3RvckNvbmZpZyBjb25maWcpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL01ldEV4dHJhY3RvckNvbmZpZy5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0RXh0cmFjdG9yQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1ZjExMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL01ldEV4dHJhY3RvckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEge0BsaW5rIE1ldEV4dHJhY3Rvcn0gY29uZmlnCisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldEV4dHJhY3RvckNvbmZpZyB7Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9NZXRFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL01ldEV4dHJhY3RvckNvbmZpZ1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTgyYjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9NZXRFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgcmVhZGVyIGludGVyZmFjZSB3aGljaCBjb252ZXJ0cyBjb25maWcge0BsaW5rIEZpbGV9cyBpbnRvCisgKiB7QGxpbmsgTWV0RXh0cmFjdG9yQ29uZmlnfSBvYmplY3RzCisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBjb25maWcge0BsaW5rIEZpbGV9IGludG8gYSB7QGxpbmsgTWV0RXh0cmFjdG9yQ29uZmlnfSBvYmoKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnRmlsZQorICAgICAqICAgICAgICAgICAgVGhlIGNvbmZpZyB7QGxpbmsgRmlsZX0gdG8gYmUgcGFyc2VkCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIE1ldEV4dHJhY3RvckNvbmZpZ30gb2JqIGNyZWF0ZWQgYnkgcGFyc2luZyB0aGUgaW5wdXQKKyAgICAgKiAgICAgICAgIGNvbmZpZyB7QGxpbmsgRmlsZX0KKyAgICAgKiBAdGhyb3dzIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0RXh0cmFjdG9yQ29uZmlnIHBhcnNlQ29uZmlnRmlsZShGaWxlIGNvbmZpZ0ZpbGUpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9NZXRhZGF0YS5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQ1NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDU3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIE1ldGFkYXRhIGlzIGEge0BsaW5rIE1hcH0gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBrZXlzIG1hcHBlZCB0byBPYmplY3QKKyAqIHZhbHVlcy4gU28sIGVhY2gga2V5IGNhbiBtYXAgdG8gcG90ZW50aWFsbHkgbWFueSB2YWx1ZXMsIGJ1dCBhbHNvIGNhbiBtYXAgdG8KKyAqIG51bGwsIG9yIHRvIGEgc2luZ2xlIHZhbHVlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTWV0YWRhdGEgeworCisgIHByaXZhdGUgR3JvdXAgcm9vdDsKKworICBwdWJsaWMgTWV0YWRhdGEoKSB7CisgICAgdGhpcy5yb290ID0gdGhpcy5jcmVhdGVOZXdSb290KCk7CisgIH0KKworICBwdWJsaWMgTWV0YWRhdGEoTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICB0aGlzKCk7CisgICAgdGhpcy5hZGRNZXRhZGF0YShtZXRhZGF0YSk7CisgIH0KKworICAvKioKKyAgICogQWRkcyAoQXBwZW5kcyBpZiBrZXkgZXhpc3RzKSBmcm9tIGdpdmVuIG1ldGFkYXRhIGludG8gdGhpcyBtZXRhZGF0YQorICAgKiAKKyAgICogQHBhcmFtIG1ldGFkYXRhCisgICAqICAgICAgICAgIE1ldGFkYXRhIHRvIGFkZCBtZXRhZGF0YSBmcm9tCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgIHRoaXMuYWRkTWV0YWRhdGEoa2V5LCBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YShrZXkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKFN0cmluZyBncm91cCwgTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhpcy5hZGRNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgICAgdGhpcy5hZGRNZXRhZGF0YShncm91cCArICIvIiArIGtleSwgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFkZHMgKFJlcGxhY2VzIGlmIGtleSBleGlzdHMpIGZyb20gZ2l2ZW4gTWV0YWRhdGEgaW50byB0aGlzIE1ldGFkYXRhCisgICAqIAorICAgKiBAcGFyYW0gbWV0YWRhdGEKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgIHRoaXMucmVwbGFjZU1ldGFkYXRhKGtleSwgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZXBsYWNlTWV0YWRhdGEoU3RyaW5nIGdyb3VwLCBNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aGlzLnJlcGxhY2VNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgICAgdGhpcy5yZXBsYWNlTWV0YWRhdGEoZ3JvdXAgKyAiLyIgKyBrZXksIG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBZGRzIGtleSAoQXBwZW5kcyBpZiBrZXkgZXhpc3RzKQorICAgKiAKKyAgICogQHBhcmFtIGtleQorICAgKiAgICAgICAgICBLZXkgdG8gYmUgYWRkZWQKKyAgICogQHBhcmFtIHZhbHVlCisgICAqICAgICAgICAgIFZhbHVlIG9mIGtleSB0byBiZSBhZGRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkTWV0YWRhdGEoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy5nZXRHcm91cChrZXkpLmFkZFZhbHVlKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIGtleSAoUmVwbGFjZXMgaWYga2V5IGV4aXN0cykKKyAgICogCisgICAqIEBwYXJhbSBrZXkKKyAgICogICAgICAgICAgS2V5IHRvIGJlIGFkZGVkCisgICAqIEBwYXJhbSB2YWx1ZQorICAgKiAgICAgICAgICBWYWx1ZSBvZiBrZXkgdG8gYmUgYWRkZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICB0aGlzLmdldEdyb3VwKGtleSkuc2V0VmFsdWUodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMga2V5IChBcHBlbmRzIGlmIGtleSBleGlzdHMpCisgICAqIAorICAgKiBAcGFyYW0ga2V5CisgICAqICAgICAgICAgIEtleSB0byBiZSBhZGRlZAorICAgKiBAcGFyYW0gdmFsdWVzCisgICAqICAgICAgICAgIFZhbHVlcyBvZiBrZXkgdG8gYmUgYWRkZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKFN0cmluZyBrZXksIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICB0aGlzLmdldEdyb3VwKGtleSkuYWRkVmFsdWVzKHZhbHVlcyk7CisgIH0KKworICAvKioKKyAgICogQWRkcyBrZXkgKFJlcGxhY2VzIGlmIGtleSBleGlzdHMpCisgICAqIAorICAgKiBAcGFyYW0ga2V5CisgICAqICAgICAgICAgIEtleSB0byBiZSBhZGRlZAorICAgKiBAcGFyYW0gdmFsdWVzCisgICAqICAgICAgICAgIFZhbHVlcyBvZiBrZXkgdG8gYmUgYWRkZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShTdHJpbmcga2V5LCBMaXN0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgdGhpcy5nZXRHcm91cChrZXkpLnNldFZhbHVlcyh2YWx1ZXMpOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMga2V5CisgICAqIAorICAgKiBAcGFyYW0ga2V5CisgICAqICAgICAgICAgIEtleSB0byByZW1vdmUKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlbW92ZU1ldGFkYXRhKFN0cmluZyBrZXkpIHsKKyAgICBHcm91cCByZW1vdmVHcm91cCA9IHRoaXMuZ2V0R3JvdXAoa2V5LCBmYWxzZSk7CisgICAgaWYgKHJlbW92ZUdyb3VwICE9IG51bGwgJiYgcmVtb3ZlR3JvdXAuaGFzVmFsdWVzKCkpIHsKKyAgICAgIGlmIChyZW1vdmVHcm91cC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCisgICAgICAgIHJlbW92ZUdyb3VwLmNsZWFyVmFsdWVzKCk7CisgICAgICBlbHNlCisgICAgICAgIHJlbW92ZUdyb3VwLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKHJlbW92ZUdyb3VwLmdldE5hbWUoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMga2V5CisgICAqIAorICAgKiBAcGFyYW0ga2V5CisgICAqICAgICAgICAgIEtleSB0byByZW1vdmUKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlbW92ZU1ldGFkYXRhR3JvdXAoU3RyaW5nIGdyb3VwKSB7CisgICAgR3JvdXAgcmVtb3ZlR3JvdXAgPSB0aGlzLmdldEdyb3VwKGdyb3VwLCBmYWxzZSk7CisgICAgaWYgKHJlbW92ZUdyb3VwICE9IG51bGwgJiYgcmVtb3ZlR3JvdXAuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQorICAgICAgcmVtb3ZlR3JvdXAuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQocmVtb3ZlR3JvdXAuZ2V0TmFtZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBDaGVja3MgaWYga2V5cyBleGlzdHMKKyAgICogCisgICAqIEBwYXJhbSBrZXkKKyAgICogICAgICAgICAgS2V5IHRvIGNoZWNrIGZvcgorICAgKiBAcmV0dXJuIFRydWUgaWYga2V5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7CisgICAgR3JvdXAgZ3JvdXAgPSB0aGlzLmdldEdyb3VwKGtleSwgZmFsc2UpOworICAgIHJldHVybiBncm91cCAhPSBudWxsICYmIGdyb3VwLmhhc1ZhbHVlcygpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrcyBpZiBrZXkgaGFzIG1vcmUgdGhhbiBvbmUgdmFsdWUKKyAgICogCisgICAqIEBwYXJhbSBrZXkKKyAgICogICAgICAgICAgS2V5IHRvIGNoZWNrIGZvcgorICAgKiBAcmV0dXJuIFRydWUgaXMga2V5IGV4aXN0cyBhbmQgaGFzIG1vcmUgdGhhbiBvbmUgdmFsdWUsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVZhbHVlZChTdHJpbmcga2V5KSB7CisgICAgR3JvdXAgZ3JvdXAgPSB0aGlzLmdldEdyb3VwKGtleSwgZmFsc2UpOworICAgIHJldHVybiBncm91cCAhPSBudWxsICYmIGdyb3VwLmdldFZhbHVlcygpLnNpemUoKSA+IDE7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIE1ldGFkYXRhIGZyb20gdGhlIGdpdmVuIGdyb3VwCisgICAqIAorICAgKiBAcGFyYW0gZ3JvdXAKKyAgICogICAgICAgICAgVGhlIEdyb3VwIHRvIGdyYWIKKyAgICogQHJldHVybiBNZXRhZGF0YSBjb250YWluaW5nIGdyb3VwIGFuZCBhbGwga2V5cyBiZWxvdyBpdAorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhIGdldFN1Yk1ldGFkYXRhKFN0cmluZyBncm91cCkgeworICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBHcm91cCBuZXdSb290ID0gdGhpcy5nZXRHcm91cChncm91cCwgZmFsc2UpOworICAgIGlmIChuZXdSb290ICE9IG51bGwpCisgICAgICBtLnJvb3QuYWRkQ2hpbGRyZW4obmV3Um9vdC5jbG9uZSgpLmdldENoaWxkcmVuKCkpOworICAgIHJldHVybiBtOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGZpcnN0IHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5CisgICAqIAorICAgKiBAcGFyYW0ga2V5CisgICAqICAgICAgICAgIFRoZSBrZXkgZm9yIHdoaWNoIHRoZSBmaXJzdCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkCisgICAqIEByZXR1cm4gRmlyc3QgdmFsdWUgZm9yIGdpdmVuIGtleSwgb3IgbnVsbCBpZiBrZXkgZG9lcyBub3QgZXhpc3QKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YWRhdGEoU3RyaW5nIGtleSkgeworICAgIEdyb3VwIGdyb3VwID0gdGhpcy5nZXRHcm91cChrZXksIGZhbHNlKTsKKyAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKKyAgICAgIHJldHVybiBncm91cC5nZXRWYWx1ZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYWxsIHZhbHVlcyBmb3IgZ2l2ZSBrZXkKKyAgICogCisgICAqIEBwYXJhbSBrZXkKKyAgICogICAgICAgICAgVGhlIGtleSBmb3Igd2hpY2ggYWxsIHZhbHVlcyB3aWxsIGJlIHJldHVybgorICAgKiBAcmV0dXJuIEFsbCB2YWx1ZXMgZm9yIGdpdmVuIGtleSwgb3IgbnVsbCBpZiBrZXkgZG9lcyBub3QgZXhpc3QKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsTWV0YWRhdGEoU3RyaW5nIGtleSkgeworICAgIEdyb3VwIGdyb3VwID0gdGhpcy5nZXRHcm91cChrZXksIGZhbHNlKTsKKyAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yPFN0cmluZz4oZ3JvdXAuZ2V0VmFsdWVzKCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEdldHMgQWxsIGtleSBpbiBhbmQgYmVsb3cgZ2l2ZW4gZ3JvdXAKKyAgICogCisgICAqIEBwYXJhbSBncm91cAorICAgKiAgICAgICAgICBUaGUgZ3JvdXAgaW4gcXVlc3Rpb24KKyAgICogQHJldHVybiBBbGwga2V5cyBmb3IgdGhlIGdpdmVuIGdyb3VwIGFuZCBiZWxvdworICAgKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRLZXlzKFN0cmluZyBncm91cCkgeworICAgIEdyb3VwIGZvdW5kR3JvdXAgPSB0aGlzLmdldEdyb3VwKGdyb3VwKTsKKyAgICBpZiAoZm91bmRHcm91cCAhPSBudWxsKQorICAgICAgcmV0dXJuIHRoaXMuZ2V0S2V5cyhmb3VuZEdyb3VwKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhbGwga2V5cyBpbiB0aGlzIE1ldGFkYXRhCisgICAqIAorICAgKiBAcmV0dXJuIEFsbCBrZXlzIGluIHRoaXMgTWV0YWRhdGEKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0S2V5cygpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRLZXlzKHRoaXMucm9vdCk7CisgIH0KKworICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldEtleXMoR3JvdXAgZ3JvdXApIHsKKyAgICBWZWN0b3I8U3RyaW5nPiBrZXlzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgZm9yIChHcm91cCBjaGlsZCA6IGdyb3VwLmdldENoaWxkcmVuKCkpCisgICAgICBpZiAoY2hpbGQuaGFzVmFsdWVzKCkpCisgICAgICAgIGtleXMuYWRkKGNoaWxkLmdldEZ1bGxQYXRoKCkpOworICAgIHJldHVybiBrZXlzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgQWxsIGtleSBpbiBhbmQgYmVsb3cgZ2l2ZW4gZ3JvdXAKKyAgICogCisgICAqIEBwYXJhbSBncm91cAorICAgKiAgICAgICAgICBUaGUgZ3JvdXAgaW4gcXVlc3Rpb24KKyAgICogQHJldHVybiBBbGwga2V5cyBmb3IgdGhlIGdpdmVuIGdyb3VwIGFuZCBiZWxvdworICAgKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbGxLZXlzKFN0cmluZyBncm91cCkgeworICAgIEdyb3VwIGZvdW5kR3JvdXAgPSB0aGlzLmdldEdyb3VwKGdyb3VwKTsKKyAgICBpZiAoZm91bmRHcm91cCAhPSBudWxsKQorICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsS2V5cyhmb3VuZEdyb3VwKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhbGwga2V5cyBpbiB0aGlzIE1ldGFkYXRhCisgICAqIAorICAgKiBAcmV0dXJuIEFsbCBrZXlzIGluIHRoaXMgTWV0YWRhdGEKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsS2V5cygpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRBbGxLZXlzKHRoaXMucm9vdCk7CisgIH0KKworICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldEFsbEtleXMoR3JvdXAgZ3JvdXApIHsKKyAgICBWZWN0b3I8U3RyaW5nPiBrZXlzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgZm9yIChHcm91cCBjaGlsZCA6IGdyb3VwLmdldENoaWxkcmVuKCkpIHsKKyAgICAgIGlmIChjaGlsZC5oYXNWYWx1ZXMoKSkKKyAgICAgICAga2V5cy5hZGQoY2hpbGQuZ2V0RnVsbFBhdGgoKSk7CisgICAgICBrZXlzLmFkZEFsbCh0aGlzLmdldEFsbEtleXMoY2hpbGQpKTsKKyAgICB9CisgICAgcmV0dXJuIGtleXM7CisgIH0KKyAgCisgIC8qKgorICAgKiBHZXQgYWxsIGtleXMgd2hvc2UgbGVhZiBrZXkgbmFtZSBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gYXJnCisgICAqIEBwYXJhbSBrZXkgbGVhZiBrZXkgbmFtZQorICAgKiBAcmV0dXJuIGxpc3Qgb2Yga2V5cyB3aXRoIHRoZSBnaXZlbiBsZWFmIGtleSBuYW1lCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFsbEtleXNXaXRoTmFtZShTdHJpbmcga2V5KSB7CisJICBMaXN0PFN0cmluZz4ga2V5cyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCSAgU3RhY2s8R3JvdXA+IHN0YWNrID0gbmV3IFN0YWNrPEdyb3VwPigpOworCSAgc3RhY2suYWRkKHRoaXMucm9vdCk7CisJICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKwkJICBHcm91cCBjdXJHcm91cCA9IHN0YWNrLnBvcCgpOworCQkgIGlmIChjdXJHcm91cC5nZXROYW1lKCkuZXF1YWxzKGtleSkgJiYgY3VyR3JvdXAuaGFzVmFsdWVzKCkpCisJCQkgIGtleXMuYWRkKGN1ckdyb3VwLmdldEZ1bGxQYXRoKCkpOworCQkgIHN0YWNrLmFkZEFsbChjdXJHcm91cC5nZXRDaGlsZHJlbigpKTsKKwkgIH0KKwkgIHJldHVybiBrZXlzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgVmFsdWVzIGluIHJvb3QgZ3JvdXAKKyAgICogCisgICAqIEByZXR1cm4gQWxsIFZhbHVlcyBpbiByb290IGdyb3VwCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZhbHVlcygpIHsKKyAgICBWZWN0b3I8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICBmb3IgKFN0cmluZyBrZXkgOiB0aGlzLmdldEtleXMoKSkKKyAgICAgIHZhbHVlcy5hZGRBbGwodGhpcy5nZXRBbGxNZXRhZGF0YShrZXkpKTsKKyAgICByZXR1cm4gdmFsdWVzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdmFsdWVzIGluIGdpdmVuIGdyb3VwCisgICAqIAorICAgKiBAcGFyYW0gZ3JvdXAKKyAgICogICAgICAgICAgR3JvdXAgaW4gcXVlc3Rpb24KKyAgICogQHJldHVybiBWYWx1ZXMgaW4gZ2l2ZW4gZ3JvdXAKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsdWVzKFN0cmluZyBncm91cCkgeworICAgIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IHRoaXMuZ2V0S2V5cyhncm91cCkpCisgICAgICB2YWx1ZXMuYWRkQWxsKHRoaXMuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIGFsbCB2YWx1ZXMgaW4gdGhpcyBNZXRhZGF0YQorICAgKiAKKyAgICogQHJldHVybiBBbGwgdmFsdWVzIGluIHRoaXMgTWV0YWRhdGEKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsVmFsdWVzKCkgeworICAgIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IHRoaXMuZ2V0QWxsS2V5cygpKQorICAgICAgdmFsdWVzLmFkZEFsbCh0aGlzLmdldEFsbE1ldGFkYXRhKGtleSkpOworICAgIHJldHVybiB2YWx1ZXM7CisgIH0KKworICAvKioKKyAgICogR2V0cyBBbGwgdmFsdWVzIGluIGFuZCBiZWxvdyBnaXZlbiBncm91cAorICAgKiAKKyAgICogQHBhcmFtIGdyb3VwCisgICAqICAgICAgICAgIEdyb3VwIGluIHF1ZXN0aW9uCisgICAqIEByZXR1cm4gQWxsIHZhbHVlcyBpbiBhbmQgYmVsb3cgZ2l2ZW4gZ3JvdXAKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsVmFsdWVzKFN0cmluZyBncm91cCkgeworICAgIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IHRoaXMuZ2V0QWxsS2V5cyhncm91cCkpCisgICAgICB2YWx1ZXMuYWRkQWxsKHRoaXMuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gbWV0YWRhdGEpIHsKKyAgICBhZGRNZXRhZGF0YShtZXRhZGF0YSwgZmFsc2UpOworICB9CisKKyAgLyoqCisgICAqIFRha2VzIGEgaGFzaHRhYmxlIG9mIFN0cmluZyBrZXlzIGFuZCBPYmplY3QgdmFsdWVzLiAgVmFsdWVzIG9mIHR5cGUgTGlzdAorICAgKiBtdXN0IGJlIGEgTGlzdCBvZiBTdHJpbmdzOyBhbGwgb3RoZXIgdmFsdWVzIHdpbGwgaGF2ZSBpdHMgdG9TdHJpbmcoKSBtZXRob2QKKyAgICogaW52b2tlZC4KKyAgICogQHBhcmFtIG1ldGFkYXRhIEhhc2h0YWJsZSBiYXNlZCBtZXRhZGF0YSB0byBhZGQKKyAgICogQHBhcmFtIHJlcGxhY2UgSWYgdHJ1ZSwgZXhpc3Rpbmcga2V5cyB3aWxsIGJlIHJlcGxhY2VkLCBvdGhlciB2YWx1ZXMgd2lsbCBiZQorICAgKiBjb21iaW5lZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gbWV0YWRhdGEsIGJvb2xlYW4gcmVwbGFjZSkgeworICAgIC8vIGZvciBiYWNrIGNvbXBhdDogdGhlIG9sZCBtZXRob2QgYWxsb3dlZCB1cyB0byBnaXZlIGl0IGEKKyAgICAvLyBIYXNodGFibGU8U3RyaW5nLFN0cmluZz4gYW5kIGl0IHN0aWxsIHdvcmtlZAorCWZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmtleVNldCgpKSB7CisJICBMaXN0PFN0cmluZz4gdmFscyA9IChtZXRhZGF0YS5nZXQoa2V5KSBpbnN0YW5jZW9mIExpc3QpID8gKExpc3Q8U3RyaW5nPikgbWV0YWRhdGEKKyAgICAgICAgLmdldChrZXkpCisgICAgICAgIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtZXRhZGF0YS5nZXQoa2V5KS50b1N0cmluZygpKTsKKyAgICAgIGlmIChyZXBsYWNlKSB7CisgICAgICAgIHRoaXMucmVwbGFjZU1ldGFkYXRhKGtleSwgdmFscyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmFkZE1ldGFkYXRhKGtleSwgdmFscyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgcmVwbGFjZU1ldGFkYXRhKEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gbWV0YWRhdGEpIHsKKyAgICB0aGlzLnJvb3QgPSB0aGlzLmNyZWF0ZU5ld1Jvb3QoKTsKKyAgICB0aGlzLmFkZE1ldGFkYXRhKG1ldGFkYXRhKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zR3JvdXAoU3RyaW5nIGdyb3VwKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0R3JvdXAoZ3JvdXAsIGZhbHNlKSAhPSBudWxsOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cHMoKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0R3JvdXBzKHRoaXMucm9vdCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEdyb3VwcyhTdHJpbmcgZ3JvdXApIHsKKyAgICByZXR1cm4gdGhpcy5nZXRHcm91cHModGhpcy5nZXRHcm91cChncm91cCkpOworICB9CisKKyAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRHcm91cHMoR3JvdXAgZ3JvdXApIHsKKyAgICBWZWN0b3I8U3RyaW5nPiBncm91cE5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgZm9yIChHcm91cCBjaGlsZCA6IGdyb3VwLmdldENoaWxkcmVuKCkpCisgICAgICBncm91cE5hbWVzLmFkZChjaGlsZC5nZXROYW1lKCkpOworICAgIHJldHVybiBncm91cE5hbWVzOworICB9CisKKyAgcHJvdGVjdGVkIEdyb3VwIGdldEdyb3VwKFN0cmluZyBrZXkpIHsKKyAgICByZXR1cm4gZ2V0R3JvdXAoa2V5LCB0cnVlKTsKKyAgfQorCisgIHByb3RlY3RlZCBHcm91cCBnZXRHcm91cChTdHJpbmcga2V5LCBib29sZWFuIGNyZWF0ZSkgeworICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgIHJldHVybiB0aGlzLnJvb3Q7CisgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5LCAiLyIpOworICAgIEdyb3VwIGN1ckdyb3VwID0gdGhpcy5yb290OworICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgR3JvdXAgY2hpbGRHcm91cCA9IGN1ckdyb3VwLmdldENoaWxkKGdyb3VwTmFtZSk7CisgICAgICBpZiAoY2hpbGRHcm91cCA9PSBudWxsKSB7CisgICAgICAgIGlmICghY3JlYXRlKQorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBjaGlsZEdyb3VwID0gbmV3IEdyb3VwKGdyb3VwTmFtZSk7CisgICAgICAgIGN1ckdyb3VwLmFkZENoaWxkKGNoaWxkR3JvdXApOworICAgICAgfQorICAgICAgY3VyR3JvdXAgPSBjaGlsZEdyb3VwOworICAgIH0KKyAgICByZXR1cm4gY3VyR3JvdXA7CisgIH0KKworICBwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTmV3Um9vdCgpIHsKKyAgICByZXR1cm4gbmV3IEdyb3VwKEdyb3VwLlJPT1RfR1JPVVBfTkFNRSk7CisgIH0KKworICBwcm90ZWN0ZWQgY2xhc3MgR3JvdXAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfR1JPVVBfTkFNRSA9ICJyb290IjsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gdmFsdWVzOworICAgIHByaXZhdGUgR3JvdXAgcGFyZW50OworICAgIHByaXZhdGUgTWFwPFN0cmluZywgR3JvdXA+IGNoaWxkcmVuOworCisgICAgcHVibGljIEdyb3VwKFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgIHRoaXMuY2hpbGRyZW4gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEdyb3VwPigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsUGF0aCgpIHsKKyAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsICYmICF0aGlzLnBhcmVudC5nZXROYW1lKCkuZXF1YWxzKFJPT1RfR1JPVVBfTkFNRSkpCisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5nZXRGdWxsUGF0aCgpICsgIi8iICsgdGhpcy5uYW1lOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBHcm91cCBnZXRQYXJlbnQoKSB7CisgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICB0aGlzLnZhbHVlcy5jbGVhcigpOworICAgICAgdGhpcy52YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgdGhpcy52YWx1ZXMuY2xlYXIoKTsKKyAgICAgIHRoaXMudmFsdWVzLmFkZEFsbCh2YWx1ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyVmFsdWVzKCkgeworICAgICAgdGhpcy52YWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHRoaXMudmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZSkgeworICAgICAgdGhpcy52YWx1ZXMuYWRkQWxsKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZXMoKSB7CisgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgaWYgKHRoaXMuaGFzVmFsdWVzKCkpCisgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5nZXQoMCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsdWVzKCkgeworICAgICAgcmV0dXJuIHRoaXMudmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKEdyb3VwIGNoaWxkKSB7CisgICAgICB0aGlzLmNoaWxkcmVuLnB1dChjaGlsZC5nZXROYW1lKCksIGNoaWxkKTsKKyAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGRyZW4oTGlzdDxHcm91cD4gY2hpbGRyZW4pIHsKKyAgICAgIGZvciAoR3JvdXAgY2hpbGQgOiBjaGlsZHJlbikKKyAgICAgICAgdGhpcy5hZGRDaGlsZChjaGlsZCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8R3JvdXA+IGdldENoaWxkcmVuKCkgeworICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8R3JvdXA+KHRoaXMuY2hpbGRyZW4udmFsdWVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLmNoaWxkcmVuLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3JvdXAgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR3JvdXAgY2xvbmUoKSB7CisgICAgICBHcm91cCBjbG9uZSA9IG5ldyBHcm91cCh0aGlzLm5hbWUpOworICAgICAgY2xvbmUuc2V0VmFsdWVzKHRoaXMudmFsdWVzKTsKKyAgICAgIGZvciAoR3JvdXAgY2hpbGQgOiB0aGlzLmNoaWxkcmVuLnZhbHVlcygpKQorICAgICAgICBjbG9uZS5hZGRDaGlsZChjaGlsZC5jbG9uZSgpKTsKKyAgICAgIHJldHVybiBjbG9uZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0RnVsbFBhdGgoKTsKKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldEhhc2h0YWJsZSgpIHsKKyAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHRhYmxlID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBmb3IgKFN0cmluZyBrZXkgOiB0aGlzLmdldEFsbEtleXMoKSkKKyAgICAgIHRhYmxlLnB1dChrZXksIHRoaXMuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgcmV0dXJuIHRhYmxlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqIGluc3RhbmNlb2YgTWV0YWRhdGEpIHsKKyAgICAgIE1ldGFkYXRhIGNvbXBNZXQgPSAoTWV0YWRhdGEpIG9iajsKKyAgICAgIGlmICh0aGlzLmdldEtleXMoKS5lcXVhbHMoY29tcE1ldC5nZXRLZXlzKCkpKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHRoaXMuZ2V0S2V5cygpKQorICAgICAgICAgIGlmICghdGhpcy5nZXRBbGxNZXRhZGF0YShrZXkpLmVxdWFscyhjb21wTWV0LmdldEFsbE1ldGFkYXRhKGtleSkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL1NlcmlhbGl6YWJsZU1ldGFkYXRhLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9TZXJpYWxpemFibGVNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmFlNjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9TZXJpYWxpemFibGVNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsMjY0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiB7QGxpbmsgTWV0YWRhdGF9IHRoYXQncyB7QGxpbmsgU2VyaWFsaXphYmxlfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJpYWxpemFibGVNZXRhZGF0YSBleHRlbmRzIE1ldGFkYXRhIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NjMwODc1ODE2NTI2MzI0OTlMOworCisgICAgcHJpdmF0ZSBTdHJpbmcgeG1sRW5jb2Rpbmc7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlQ0RBVEE7CisgICAgCisgICAgcHVibGljIFNlcmlhbGl6YWJsZU1ldGFkYXRhKCkgeworICAgIAlzdXBlcigpOworICAgIAl0aGlzLnhtbEVuY29kaW5nID0gIlVURi04IjsKKyAgICAJdGhpcy51c2VDREFUQSA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIGFueSBlbmNvZGluZyB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgamF2YS5uZXQuVVJMRW5jb2RlciBJZgorICAgICAqIHVzZUNEQVRBIGlzIHNldCB0cnVlIHRoZW4gZWxlbWVudCB0ZXh0IHdpbGwgYmUgd3JhcHBlZCBpbiBhIENEQVRBIHRhZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geG1sRW5jb2RpbmcKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFhNTCB2ZXJzaW9uIG9mIGEKKyAgICAgKiAgICAgICAgICAgIFNlcmlhbGl6YWJsZU1ldGFkYXRhCisgICAgICogQHBhcmFtIHVzZUNEQVRBCisgICAgICogICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCB0byB1c2UgQ0RBVEEgdGFncyBhcm91bmQgYW4gZWxlbWVudCdzIHRleHQuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgeG1sRW5jb2RpbmcgZXF1YWxzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlTWV0YWRhdGEoU3RyaW5nIHhtbEVuY29kaW5nLCBib29sZWFuIHVzZUNEQVRBKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworICAgICAgICBpZiAoeG1sRW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJ4bWxFbmNvZGluZyBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB0aGlzLnhtbEVuY29kaW5nID0geG1sRW5jb2Rpbmc7CisgICAgICAgIHRoaXMudXNlQ0RBVEEgPSB1c2VDREFUQTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlTWV0YWRhdGEoTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAJdGhpcyhtZXRhZGF0YSwgIlVURi04IiwgZmFsc2UpOworCX0KKyAgICAKKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlTWV0YWRhdGEoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCXRoaXMoaW5wdXRTdHJlYW0sICJVVEYtOCIsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNlcmlhbGl6YWJsZU1ldGFkYXRhKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgeG1sRW5jb2RpbmcsCisgICAgICAgICAgICBib29sZWFuIHVzZUNEQVRBKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLnhtbEVuY29kaW5nID0geG1sRW5jb2Rpbmc7CisgICAgICAgIHRoaXMudXNlQ0RBVEEgPSB1c2VDREFUQTsKKyAgICAJdGhpcy5sb2FkTWV0YWRhdGFGcm9tWG1sU3RyZWFtKGlucHV0U3RyZWFtKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBTZXJpYWxpemFibGVNZXRhZGF0YSBvYmplY3QgZnJvbSBhIE1ldGFkYXRhIG9iamVjdAorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgICAqIEBwYXJhbSB4bWxFbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxpemFibGVNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSwgU3RyaW5nIHhtbEVuY29kaW5nLAorICAgICAgICAgICAgYm9vbGVhbiB1c2VDREFUQSkgeworICAgICAgICB0aGlzLnJlcGxhY2VNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgICAgIHRoaXMueG1sRW5jb2RpbmcgPSB4bWxFbmNvZGluZzsKKyAgICAgICAgdGhpcy51c2VDREFUQSA9IHVzZUNEQVRBOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZU9iamVjdCh0aGlzLnhtbEVuY29kaW5nKTsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbih1c2VDREFUQSk7CisgICAgICAgIHRoaXMud3JpdGVNZXRhZGF0YVRvWG1sU3RyZWFtKG91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMueG1sRW5jb2RpbmcgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIHRoaXMudXNlQ0RBVEEgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICB0aGlzLmxvYWRNZXRhZGF0YUZyb21YbWxTdHJlYW0oaW4pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnhtbEVuY29kaW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVXNpbmdDREFUQSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlQ0RBVEE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIG91dCB0aGlzIFNlcmlhbGl6YWJsZU1ldGFkYXRhIG9iamVjdCBpbiBYTUwgZm9ybWF0IHRvIHRoZQorICAgICAqIE91dHB1dFN0cmVhbSBwcm92aWRlZAorICAgICAqIAorICAgICAqIEBwYXJhbSBvcworICAgICAqICAgICAgICAgICAgVGhlIE91dHB1dFN0cmVhbSB0aGlzIG1ldGhvZCB3cml0ZXMgdG8KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgZm9yIGFueSBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1ldGFkYXRhVG9YbWxTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgRE9NIGRvY3VtZW50IGZvciB3cml0aW5nCisgICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZSh0aGlzLnRvWE1MKCkpOworICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3MpOworCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgRE9NIGRvY3VtZW50IHRvIHRoZSBmaWxlCisgICAgICAgICAgICBUcmFuc2Zvcm1lciB4Zm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICB4Zm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIHRoaXMueG1sRW5jb2RpbmcpOworICAgICAgICAgICAgeGZvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworICAgICAgICAgICAgeGZvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIG1ldGFkYXRhIHhtbCBmaWxlITogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEb2N1bWVudCB0b1hNTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCisgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiwgIm1ldGFkYXRhIik7CisgICAgICAgICAgICByb290LnNldFByZWZpeCgiY2FzIik7CisgICAgICAgICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKKworICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgc2V0IG9mIG1ldGFkYXRhIGVsZW1lbnRzIGluIHRoZSBwcm9wZXJ0aWVzIG9iamVjdAorICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogdGhpcy5nZXRBbGxLZXlzKCkpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IG1ldGFkYXRhRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImtleXZhbCIpOworICAgICAgICAgICAgICAgIEVsZW1lbnQga2V5RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImtleSIpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZUNEQVRBKQorICAgICAgICAgICAgICAgICAgICBrZXlFbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUNEQVRBU2VjdGlvbihrZXkpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGtleUVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoVVJMRW5jb2Rlci5lbmNvZGUoa2V5LCB0aGlzLnhtbEVuY29kaW5nKSkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1ldGFkYXRhRWxlbS5hcHBlbmRDaGlsZChrZXlFbGVtKTsKKworICAgICAgICAgICAgICAgIG1ldGFkYXRhRWxlbS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidmVjdG9yIik7CisKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHRoaXMuZ2V0QWxsTWV0YWRhdGEoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHZhbEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkF0dGVtcHQgdG8gd3JpdGUgbnVsbCB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvciBwcm9wZXJ0eTogWyIgKyBrZXkgKyAiXTogdmFsOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlICsgIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VDREFUQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbEVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNEQVRBU2VjdGlvbih2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxFbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFVSTEVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZSh2YWx1ZSwgdGhpcy54bWxFbmNvZGluZykpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFFbGVtLmFwcGVuZENoaWxkKHZhbEVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKG1ldGFkYXRhRWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBYTUwgRE9NIERvY3VtZW50IGZvciBTZXJpYWxpemFibGVNZXRhZGF0YSA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbG9hZHMgdGhpcyBTZXJpYWxpemFibGVNZXRhZGF0YSBmcm9tIGFuIElucHV0U3RyZWFtIGluIHRoZSBmb3JtYXQKKyAgICAgKiBjcmVhdGVkIGJ5IHdyaXRlTWV0YWRhdGFUb1htbFN0cmVhbShPdXRwdXRTdHJlYW0pLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbgorICAgICAqICAgICAgICAgICAgVGhlIElucHV0U3RyZWFtIHdoaWNoIHRoaXMgb2JqZWN0IGlzIGxvYWRlZCBmcm9tCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGZvciBhbnkgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZE1ldGFkYXRhRnJvbVhtbFN0cmVhbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpOworCisgICAgICAgICAgICBOb2RlTGlzdCBrZXlWYWxFbGVtcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImtleXZhbCIpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleVZhbEVsZW1zLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGtleVZhbEVsZW0gPSAoRWxlbWVudCkga2V5VmFsRWxlbXMuaXRlbShpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtTmFtZSA9IFhNTFV0aWxzLnJlYWQoa2V5VmFsRWxlbSwgImtleSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhtbEVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZWxlbVZhbHVlcyA9IFhNTFV0aWxzLnJlYWRNYW55KGtleVZhbEVsZW0sICJ2YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54bWxFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgdGhpcy5hZGRNZXRhZGF0YShlbGVtTmFtZSwgZWxlbVZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9hZCBTZXJpYWxpemFibGVNZXRhZGF0YSBmcm9tIE9iamVjdElucHV0U3RyZWFtIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgU2VyaWFsaXphYmxlTWV0YWRhdGEgaW50byBhIHBsYWluIG1ldGFkYXRhIG9iamVjdAorICAgICAqIAorICAgICAqIEByZXR1cm4gTWV0YWRhdGEgb2JqZWN0IHdpdGggdGhlIHNhbWUgbWV0YWRhdGEgdGhhdCB0aGlzCisgICAgICogICAgICAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBjb250YWlucworICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEodGhpcy5nZXRIYXNodGFibGUoKSk7CisgICAgICAgIHJldHVybiBtZXRhZGF0YTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXhjZXB0aW9ucy9NZXRFeHRyYWN0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMDM3MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBFeGNlcHRpb24gdGhyb3duIGJ5IHRoZSBNZXQgRXh0cmFjdGlvbiBmcmFtZXdvcmsuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCS8qIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzY3MDg4MTM5NDY5OTk3OTFMOworCisJLyoqCisJICogCisJICovCisJcHVibGljIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICogQHBhcmFtIGFyZzEKKwkgKi8KKwlwdWJsaWMgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKKwkJc3VwZXIoYXJnMCwgYXJnMSk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXhjZXB0aW9ucy9NZXRFeHRyYWN0b3JDb25maWdSZWFkZXJFeGNlcHRpb24uamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMmIwYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9uczsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3cgd2hlbiBlcnJvciBvY2N1cnMgd2hpbGUgcGFyc2luZyBhIGNvbmZpZyB7QGxpbmsgRmlsZX0gaW50byBhCisgKiB7QGxpbmsgTWV0RXh0cmFjdG9yQ29uZmlnfQorICoKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUub3JnIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjM0NDY5NTk4MDE0NDMxMjIyNUw7CisKKwlwdWJsaWMgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwkJc3VwZXIobXNnKTsKKwl9CisKKwlwdWJsaWMgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0KSB7CisJICBzdXBlcihtc2csIHQpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXhjZXB0aW9ucy9OYW1pbmdDb252ZW50aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2YjQ3NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnM7CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93IGJ5IHtAbGluayBOYW1pbmdDb252ZW50aW9ufSBvbiBlcnJvci4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIE5hbWluZ0NvbnZlbnRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgcHVibGljIE5hbWluZ0NvbnZlbnRpb25FeGNlcHRpb24oKSB7CisgICAgICBzdXBlcigpOworICAgfQorCisgICBwdWJsaWMgTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICBzdXBlcihtc2cpOworICAgfQorCisgICBwdWJsaWMgTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobXNnLCB0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXhjZXB0aW9ucy9QcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YjM0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4Y2VwdGlvbnMvUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5QcmVDb25kaXRpb25Db21wYXJhdG9yOyAvL2ZvciBqYXZhZG9jCisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBleGNlcHRpb24gdGhyb3cgYnkgYSB7QGxpbmsgUHJlQ29uZGl0aW9uQ29tcGFyYXRvcn0KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyOTQ0ODE0OTc0MDA0NTYxOEw7CisKKyAgICBwdWJsaWMgUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0Fic3RyYWN0U0FYQ29uZmlnUmVhZGVyLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0Fic3RyYWN0U0FYQ29uZmlnUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzNzBjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvQWJzdHJhY3RTQVhDb25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogUGFyc2VzIGFuIHhtbCBjb25maWcgZmlsZSBmb3IgTWV0RXh0cmFjdG9ycyB1c2luZyBTQVguCisgKgorICogQGF1dGhvciByaWNrZG4gKFJpY2t5IE5ndXllbikKKyAqLworcHVibGljIGNsYXNzIEFic3RyYWN0U0FYQ29uZmlnUmVhZGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXIsIE1ldEV4dHJhY3RvckNvbmZpZyB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RTQVhDb25maWdSZWFkZXIgcGFyc2VDb25maWdGaWxlKEZpbGUgY29uZmlnRmlsZSkgdGhyb3dzIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTQVhQYXJzZXIgcCA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgICAgIHAucGFyc2UoY29uZmlnRmlsZSwgdGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvQ21kTGluZU1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9DbWRMaW5lTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlZjY4YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvQ21kTGluZU1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5BYnN0cmFjdE1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLlNlcmlhbGl6YWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYy5FbnZVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBNZXRhZGF0YSBleHRyYWN0aW9uIGludGVyZmFjZSBmb3Igc3RhbmRhbG9uZSBtZXQgZXh0cmFjdG9ycyB0aGF0IGhhdmUgdGhlCisgKiBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGludGVyZmFjZTo8YnI+CisgKiAKKyAqIDxjb2RlPi9wYXRoL3RvL21ldF9leHRyYWN0b3IgJmx0O2ZpbGUmZ3Q7ICZsdDtjb25maWcgZmlsZSZndDs8L2NvZGU+CisgKiA8L3A+LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ21kTGluZU1ldEV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0TWV0RXh0cmFjdG9yIHsKKworICBwdWJsaWMgQ21kTGluZU1ldEV4dHJhY3RvcihNZXRFeHRyYWN0b3JDb25maWdSZWFkZXIgcmVhZGVyKSB7CisgICAgICBzdXBlcihyZWFkZXIpOworICB9CisKKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByb2Nlc3NNYWluKFN0cmluZ1tdIGFyZ3MsCisgICAgICAgICAgQ21kTGluZU1ldEV4dHJhY3RvciBleHRyYWN0b3IpIHRocm93cyBFeGNlcHRpb24geworICAgICAgU3RyaW5nIHVzYWdlID0gIlVzYWdlOiAiICsgZXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICsgIiA8ZmlsZT4gPGNvbmZpZ2ZpbGU+IjsKKyAgICAgIFN0cmluZyBleHRyYWN0RmlsZVBhdGggPSBudWxsLCBjb25maWdGaWxlUGF0aCA9IG51bGw7CisKKyAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgfQorCisgICAgICBleHRyYWN0RmlsZVBhdGggPSBhcmdzWzBdLnJlcGxhY2VBbGwoIlxcXFwiLCAiIik7CisgICAgICBjb25maWdGaWxlUGF0aCA9IGFyZ3NbMV07CisKKyAgICAgIE1ldGFkYXRhIG1ldCA9IGV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEobmV3IEZpbGUoZXh0cmFjdEZpbGVQYXRoKSwKKyAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGgpOworICAgICAgWE1MVXRpbHMud3JpdGVYbWxUb1N0cmVhbShuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEobWV0KS50b1hNTCgpLAorICAgICAgICAgICAgICBnZXRNZXRGaWxlT3V0cHV0U3RyZWFtKGV4dHJhY3RGaWxlUGF0aCkpOworICB9CisKKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByb2Nlc3NNYWluKFN0cmluZ1tdIGFyZ3MsCisgICAgICAgICAgQ21kTGluZU1ldEV4dHJhY3RvciBleHRyYWN0b3IsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgdXNhZ2UgPSAiVXNhZ2U6ICIgKyBleHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgKyAiIDxmaWxlPiA8Y29uZmlnZmlsZT4iOworICAgICAgU3RyaW5nIGV4dHJhY3RGaWxlUGF0aCA9IG51bGwsIGNvbmZpZ0ZpbGVQYXRoID0gbnVsbDsKKworICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgeworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICB9CisKKyAgICAgIGV4dHJhY3RGaWxlUGF0aCA9IGFyZ3NbMF0ucmVwbGFjZUFsbCgiXFxcXCIsICIiKTsKKyAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gYXJnc1sxXTsKKworICAgICAgTWV0YWRhdGEgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShuZXcgRmlsZShleHRyYWN0RmlsZVBhdGgpLAorICAgICAgICAgICAgICBjb25maWdGaWxlUGF0aCk7CisgICAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShtZXQpLnRvWE1MKCksIG9zKTsKKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgRmlsZU91dHB1dFN0cmVhbSBnZXRNZXRGaWxlT3V0cHV0U3RyZWFtKFN0cmluZyBmaWxlUGF0aCkgeworICAgICAgUHJvcGVydGllcyBlbnZWYXJzID0gRW52VXRpbGl0aWVzLmdldEVudigpOworICAgICAgU3RyaW5nIGN3ZCA9IGVudlZhcnMuZ2V0UHJvcGVydHkoIlBXRCIpOworICAgICAgaWYgKGN3ZCA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiBmYWlsaW5nISIpOworICAgICAgfQorCisgICAgICBpZiAoIWN3ZC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgY3dkICs9ICIvIjsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIG1ldEZpbGVQYXRoID0gY3dkCisgICAgICAgICAgICAgICsgbmV3IEZpbGUoZmlsZVBhdGgpLmdldE5hbWUoKS5yZXBsYWNlQWxsKCJcXFxcIiwgIiIpICsgIi5tZXQiOworCisgICAgICAvLyB0cnkgYW5kIHJlbW92ZSB0aGUgbWV0IGZpbGUsIGlmIGl0IGFscmVhZHkgZXhpc3RzCisgICAgICAvLyBmb3Igc29tZSByZWFzb24gYmVsb3csIHRoZSB3cml0ZVhtbEZpbGUgbWV0aG9kIGluCisgICAgICAvLyBYTUxVdGlscyBkb2Vzbid0IG92ZXJ3cml0ZSwgYW5kIHRocm93cyBhbiBFeGNlcHRpb24KKyAgICAgIEZpbGUgbWV0RmlsZSA9IG5ldyBGaWxlKG1ldEZpbGVQYXRoKTsKKyAgICAgIGlmICghbWV0RmlsZS5kZWxldGUoKSkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkF0dGVtcHQgdG8gb3ZlcndyaXRlIG1ldCBmaWxlOiBbIgorICAgICAgICAgICAgICAgICAgKyBtZXRGaWxlUGF0aCArICJdIHVuc3VjY2Vzc2Z1bCEiKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWV0RmlsZSk7CisgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgbWV0IGZpbGU6IFsiICsgbWV0RmlsZQorICAgICAgICAgICAgICAgICAgKyAiXTogUmVhc29uICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0NvcHlBbmRSZXdyaXRlQ29uZmlnLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0NvcHlBbmRSZXdyaXRlQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0MTA4MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvQ29weUFuZFJld3JpdGVDb25maWcuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yQ29uZmlnOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGhlIHtAbGluayBNZXRFeHRyYWN0b3JDb25maWd9IGZvciB0aGUge0BsaW5rIENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yfQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENvcHlBbmRSZXdyaXRlQ29uZmlnIGV4dGVuZHMgUHJvcGVydGllcyBpbXBsZW1lbnRzCisgICAgICAgIE1ldEV4dHJhY3RvckNvbmZpZyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MDk5MDY2NzE3NzE3OTQ4NjEyTDsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9Db3B5QW5kUmV3cml0ZUNvbmZpZ1JlYWRlci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9Db3B5QW5kUmV3cml0ZUNvbmZpZ1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmI1OWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0NvcHlBbmRSZXdyaXRlQ29uZmlnUmVhZGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWdSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIENvbmZpZyBmaWxlIHJlYWRlciBjbGFzcyBmb3Ige0BsaW5rIENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yfQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENvcHlBbmRSZXdyaXRlQ29uZmlnUmVhZGVyIGltcGxlbWVudHMgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyIHsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWdSZWFkZXIjcGFyc2VDb25maWdGaWxlKGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0RXh0cmFjdG9yQ29uZmlnIHBhcnNlQ29uZmlnRmlsZShGaWxlIGNvbmZpZ0ZpbGUpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvcHlBbmRSZXdyaXRlQ29uZmlnIGNvbmZpZyA9IG5ldyBDb3B5QW5kUmV3cml0ZUNvbmZpZygpOworICAgICAgICAgICAgY29uZmlnLmxvYWQoY29uZmlnRmlsZS50b1VSTCgpLm9wZW5TdHJlYW0oKSk7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlICciCisgICAgICAgICAgICAgICAgICAgICsgY29uZmlnRmlsZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9Db3B5QW5kUmV3cml0ZUV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9Db3B5QW5kUmV3cml0ZUV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZDcyMTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0NvcHlBbmRSZXdyaXRlRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ21kTGluZU1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEge0BsaW5rIE1ldEV4dHJhY3Rvcn0gdGhhdCB0YWtlcyBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IGlzIGEgamF2YQorICogcHJvcGVydGllcyBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZGVmaW5lZDoKKyAqIAorICogPHVsPgorICogPGxpPm51bVJld3JpdGVGaWVsZHMgLSBUaGUgbnVtYmVyIG9mIGZpZWxkcyB0byByZXdyaXRlIHdpdGhpbiB0aGUgb3JpZ2luYWwKKyAqIG1ldGFkYXRhIGZpbGUuPC9saT4KKyAqIDxsaT5yZXdyaXRlRmllbGROIC0gVGhlIG5hbWUocykgb2YgdGhlIGZpZWxkcyB0byByZXdyaXRlIGluIHRoZSBvcmlnaW5hbAorICoge0BsaW5rIE1ldGFkYXRhfSBmaWxlLjwvbGk+CisgKiA8bGk+b3JpZy5tZXQuZmlsZS5wYXRoIC0gaGUgb3JpZ2luYWwgcGF0aCB0byB0aGUge0BsaW5rIE1ldGFkYXRhfSBYTUwgZmlsZQorICogdG8gZHJhdyB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBmcm9tLjwvbGk+CisgKiA8bGk+ZmllbGROLnBhdHRlcm4gLSBUaGUgc3RyaW5nIHNwZWNpZmljYXRpb24gdGhhdCBkZXRhaWxzIHdoaWNoIGZpZWxkcyB0bworICogcmVwbGFjZSBhbmQgdG8gdXNlIGluIGJ1aWxkaW5nIHRoZSBuZXcgZmllbGQgdmFsdWUuPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBDb3B5QW5kUmV3cml0ZUV4dHJhY3RvciBleHRlbmRzIENtZExpbmVNZXRFeHRyYWN0b3IgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFTkFNRSA9ICJGaWxlbmFtZSI7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfTE9DQVRJT04gPSAiRmlsZUxvY2F0aW9uIjsKKworICBwcml2YXRlIHN0YXRpYyBDb3B5QW5kUmV3cml0ZUNvbmZpZ1JlYWRlciByZWFkZXIgPSBuZXcgQ29weUFuZFJld3JpdGVDb25maWdSZWFkZXIoKTsKKworICAvKioKKyAgICogRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICogCisgICAqLworICBwdWJsaWMgQ29weUFuZFJld3JpdGVFeHRyYWN0b3IoKSB7CisgICAgICBzdXBlcihyZWFkZXIpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBnb3YubmFzYS5qcGwub29kdC5jYXMubWV0YWRhdGEuQWJzdHJhY3RNZXRFeHRyYWN0b3IjZXh0cmFjdE1ldGFkYXRhKGphdmEuaW8uRmlsZSkKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YSBleHRyTWV0YWRhdGEoRmlsZSBmaWxlKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAodGhpcy5jb25maWcgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIk5vIGNvbmZpZyBmaWxlIGRlZmluZWQ6IHVuYWJsZSB0byBjb3B5IGFuZCByZXdyaXRlIG1ldGFkYXRhISIpOworICAgICAgfQorCisgICAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworICAgICAgCisgICAgICB0cnkgeworICAgICAgICAgIG1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShuZXcgRmlsZShQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoQ29weUFuZFJld3JpdGVDb25maWcpIHRoaXMuY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yaWcubWV0LmZpbGUucGF0aCIpKSkudG9VUkwoKQorICAgICAgICAgICAgICAgICAgLm9wZW5TdHJlYW0oKSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiZXJyb3IgcGFyc2luZyBvcmlnaW5hbCBtZXQgZmlsZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKENvcHlBbmRSZXdyaXRlQ29uZmlnKSB0aGlzLmNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yaWcubWV0LmZpbGUucGF0aCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgICAgIGFkZERlZmF1bHRGaWVsZHMoZmlsZSwgbWV0KTsKKworICAgICAgLy8gbm93IG92ZXJyaWRlCisgICAgICBpbnQgbnVtT3ZlcnJpZGVGaWVsZHMgPSBJbnRlZ2VyCisgICAgICAgICAgICAgIC5wYXJzZUludCgoKENvcHlBbmRSZXdyaXRlQ29uZmlnKSB0aGlzLmNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm51bVJld3JpdGVGaWVsZHMiKSk7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIkV4dHJhY3RpbmcgbWV0YWRhdGE6IG51bSByZXdyaXRlIGZpZWxkczogWyIKKyAgICAgICAgICAgICAgKyBudW1PdmVycmlkZUZpZWxkcyArICJdIik7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT3ZlcnJpZGVGaWVsZHM7IGkrKykgeworICAgICAgICAgIFN0cmluZyByZXdyaXRlRmllbGROYW1lID0gKChDb3B5QW5kUmV3cml0ZUNvbmZpZykgdGhpcy5jb25maWcpCisgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoInJld3JpdGVGaWVsZCIgKyAoaSArIDEpKTsKKyAgICAgICAgICBTdHJpbmcgcmV3cml0ZUZpZWxkU3RyID0gKChDb3B5QW5kUmV3cml0ZUNvbmZpZykgdGhpcy5jb25maWcpCisgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkocmV3cml0ZUZpZWxkTmFtZSArICIucGF0dGVybiIpOworICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlJld3JpdGUgc3RyaW5nOiBbIiArIHJld3JpdGVGaWVsZFN0ciArICJdIik7CisgICAgICAgICAgcmV3cml0ZUZpZWxkU3RyID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMocmV3cml0ZUZpZWxkU3RyLAorICAgICAgICAgICAgICAgICAgbWV0KTsKKyAgICAgICAgICBtZXQucmVwbGFjZU1ldGFkYXRhKHJld3JpdGVGaWVsZE5hbWUsIHJld3JpdGVGaWVsZFN0cik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtZXQ7CisKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgcHJvY2Vzc01haW4oYXJncywgbmV3IENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRGaWVsZHMoRmlsZSBmaWxlLCBNZXRhZGF0YSBtZXQpIHsKKyAgICAgIG1ldC5yZXBsYWNlTWV0YWRhdGEoRklMRU5BTUUsIGZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgIG1ldC5yZXBsYWNlTWV0YWRhdGEoRklMRV9MT0NBVElPTiwgZmlsZS5nZXRQYXJlbnRGaWxlKCkKKyAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKKyAgfQorCit9CisKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRGF0YVNvdXJjZU1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9EYXRhU291cmNlTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIxYjljNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRGF0YVNvdXJjZU1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvLyBKREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworCisKKy8vIEpBVkFYIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworCisvLyBPT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLkFic3RyYWN0TWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0YWJhc2UuRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlcjsKKworCisvLyBHb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CisKKy8qKgorICogTWV0RXh0cmFjdG9yIHdoaWNoIHVzZXMgaW5wdXQgZmlsZSdzIG5hbWUgYXMga2V5IGZvciBsb29rdXAgaW50byBhIHNxbCBkYXRhYmFzZSB0byBnZXQgbWV0YWRhdGEuCisgKgorICogQGF1dGhvciBiZm9zdGVyQGFwYWNoZS5vcmcgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VNZXRFeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdE1ldEV4dHJhY3RvciB7CisKKyAgcHVibGljIERhdGFTb3VyY2VNZXRFeHRyYWN0b3IoKSB7CisgICAgc3VwZXIobmV3IERhdGFTb3VyY2VNZXRFeHRyYWN0b3JDb25maWdSZWFkZXIoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIE1ldGFkYXRhIGV4dHJNZXRhZGF0YShGaWxlIGZpbGUpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcga2V5ID0gZ2V0S2V5KGZpbGUpOworICAgIERhdGFTb3VyY2VNZXRFeHRyYWN0b3JDb25maWcgZHNDb25maWcgPSAoRGF0YVNvdXJjZU1ldEV4dHJhY3RvckNvbmZpZykgY29uZmlnOworICAgIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKGRzQ29uZmlnLmdldFVzZXJOYW1lKCksCisgICAgICAgIGRzQ29uZmlnLmdldFBhc3N3b3JkKCksIGRzQ29uZmlnLmdldERyaXZlcigpLCBkc0NvbmZpZy5nZXREYXRhYmFzZVVybCgpKTsKKworICAgIHJldHVybiBnZXRNZXRhZGF0YShkYXRhU291cmNlLCBkc0NvbmZpZy5nZXRRdWVyeSgpLCBrZXkpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KEZpbGUgZmlsZSkgeworICAgIHJldHVybiBTcGxpdHRlci5vbigiLiIpLnNwbGl0KGZpbGUuZ2V0TmFtZSgpKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgfQorCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBwcm90ZWN0ZWQgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoRGF0YVNvdXJjZSBkYXRhU291cmNlLCBTdHJpbmcgcXVlcnksIFN0cmluZyBrZXkpCisgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNxbFF1ZXJ5ID0gU3RyaW5nLmZvcm1hdChxdWVyeSwga2V5KTsKKworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KHNxbFF1ZXJ5KTsKKworICAgICAgcmV0dXJuIGdldE1ldGFkYXRhKHJzKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGdldCBtZXRhZGFhdGEgZm9yIGtleSAnJXMnIiwga2V5KSwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHRyeSB7IGNvbm4uY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLyogaWdub3JlICovIH0KKyAgICAgIHRyeSB7IHN0YXRlbWVudC5jbG9zZSgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvKiBpZ25vcmUgKi8gfQorICAgICAgdHJ5IHsgcnMuY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLyogaWdub3JlICovIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIE1ldGFkYXRhIGdldE1ldGFkYXRhKFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBpZiAocnMubmV4dCgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJzLmdldE1ldGFEYXRhKCkuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7CisgICAgICAgIFN0cmluZyBtZXRLZXkgPSBycy5nZXRNZXRhRGF0YSgpLmdldENvbHVtbk5hbWUoaSsxKTsKKyAgICAgICAgU3RyaW5nIG1ldFZhbCA9IHJzLmdldFN0cmluZyhpKzEpOworICAgICAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShtZXRLZXksIG1ldFZhbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIkZhaWxlZCB0byBmaW5kIG1ldGFkYXRhIGZvciByZXN1bHQgc2V0Iik7CisgICAgfQorICAgIHJldHVybiBtZXRhZGF0YTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9EYXRhU291cmNlTWV0RXh0cmFjdG9yQ29uZmlnLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0RhdGFTb3VyY2VNZXRFeHRyYWN0b3JDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYThiYTY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9EYXRhU291cmNlTWV0RXh0cmFjdG9yQ29uZmlnLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy8gSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy8gT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWc7CisKKy8qKgorICogTWV0RXh0cmFjdG9yQ29uZmlnIHdoaWNoIGxvYWRzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIEphdmEgUHJvcGVydHkgZmlsZS4gIEV4cGVjdHMgZ2l2ZW4ga2V5cworICogdG8gYmUgc2V0IGFuZCBwcm92aWRlcyBlYXN5IHJlYWQgbWV0aG9kcyBmb3IgdGhvc2Uga2V5cy4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXJAYXBhY2hlLm9yZyAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZU1ldEV4dHJhY3RvckNvbmZpZyBleHRlbmRzIFByb3BlcnRpZXMgaW1wbGVtZW50cyBNZXRFeHRyYWN0b3JDb25maWcgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00Mzc5NDg4ODIzNTM3NjQ0NTRMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9LRVkgPQorICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5kYXRhc291cmNlLnF1ZXJ5IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX1VSTF9LRVkgPQorICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5kYXRhc291cmNlLmRiLnVybCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfS0VZID0KKyAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuZGF0YXNvdXJjZS5kcml2ZXIiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9OQU1FX0tFWSA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLmRhdGFzb3VyY2UudXNlcm5hbWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfS0VZID0KKyAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuZGF0YXNvdXJjZS5wYXNzd29yZCI7CisKKyAgcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHkoUVVFUllfS0VZKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VVcmwoKSB7CisgICAgcmV0dXJuIGdldFByb3BlcnR5KERBVEFCQVNFX1VSTF9LRVkpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREcml2ZXIoKSB7CisgICAgcmV0dXJuIGdldFByb3BlcnR5KERSSVZFUl9LRVkpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHkoVVNFUl9OQU1FX0tFWSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgIHJldHVybiBnZXRQcm9wZXJ0eShQQVNTV09SRF9LRVkpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0RhdGFTb3VyY2VNZXRFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRGF0YVNvdXJjZU1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzZiYjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0RhdGFTb3VyY2VNZXRFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvLyBKREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy8gT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWdSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyfSB3aGljaCByZWFkcyBjb25maWd1cmF0aW9uIGZyb20gYSBKYXZhIFByb3BlcnRpZXMgZmlsZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXJAYXBhY2hlLm9yZyAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZU1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciBpbXBsZW1lbnRzIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhU291cmNlTWV0RXh0cmFjdG9yQ29uZmlnIHBhcnNlQ29uZmlnRmlsZShGaWxlIGNvbmZpZ0ZpbGUpCisgICAgICB0aHJvd3MgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgRGF0YVNvdXJjZU1ldEV4dHJhY3RvckNvbmZpZyBjb25maWcgPSBuZXcgRGF0YVNvdXJjZU1ldEV4dHJhY3RvckNvbmZpZygpOworICAgICAgY29uZmlnLmxvYWQoY29uZmlnRmlsZS50b1VSSSgpLnRvVVJMKCkub3BlblN0cmVhbSgpKTsKKyAgICAgIHJldHVybiBjb25maWc7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXJFeGNlcHRpb24oCisgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHBhcnNlICclcyciLCBjb25maWdGaWxlKSwgZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0V4dGVybkNvbmZpZ1JlYWRlci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5Db25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzcwNzYzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5Db25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWdSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogUmVhZGVyIHRoYXQgcmVhZHMge0BsaW5rIEV4dGVybmFsTWV0RXh0cmFjdG9yQ29uZmlnfXMgZnJvbSBhbiBYTUwgZmlsZS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlcm5Db25maWdSZWFkZXIgaW1wbGVtZW50cyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXIsCisgICAgICAgIEV4dGVybk1ldEV4dHJhY3Rvck1ldEtleXMsIEV4dGVybkNvbmZpZ1JlYWRlck1ldEtleXMgeworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciNwYXJzZUNvbmZpZ0ZpbGUoamF2YS5pby5GaWxlKQorICAgICAqLworICAgIHB1YmxpYyBNZXRFeHRyYWN0b3JDb25maWcgcGFyc2VDb25maWdGaWxlKEZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOworCisgICAgICAgICAgICBFeHRlcm5hbE1ldEV4dHJhY3RvckNvbmZpZyBjb25maWcgPSBuZXcgRXh0ZXJuYWxNZXRFeHRyYWN0b3JDb25maWcoKTsKKyAgICAgICAgICAgIEVsZW1lbnQgZG9jRWxlbSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgICAgIEVsZW1lbnQgZXhlY0VsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQoRVhFQ19UQUcsIGRvY0VsZW0pOworICAgICAgICAgICAgY29uZmlnLnNldFdvcmtpbmdEaXJQYXRoKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGV4ZWNFbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoV09SS0lOR19ESVJfQVRUUikpKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRGaWxlRXh0ID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoZXhlY0VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShNRVRfRklMRV9FWFRfQVRUUikpOworICAgICAgICAgICAgaWYgKCFtZXRGaWxlRXh0LmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgY29uZmlnLnNldE1ldEZpbGVFeHQobWV0RmlsZUV4dCk7CisgICAgICAgICAgICBFbGVtZW50IGJpblBhdGhFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICBFWFRSQUNUT1JfQklOX1BBVEhfVEFHLCBleGVjRWxlbWVudCk7CisgICAgICAgICAgICBTdHJpbmcgYmluUGF0aCA9IFhNTFV0aWxzLmdldFNpbXBsZUVsZW1lbnRUZXh0KGJpblBhdGhFbGVtKTsKKyAgICAgICAgICAgIGlmIChCb29sZWFuLnZhbHVlT2YoYmluUGF0aEVsZW0uZ2V0QXR0cmlidXRlKEVOVl9SRVBMQUNFX0FUVFIpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBiaW5QYXRoID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoYmluUGF0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBkbyBwYXRoIHJlcGxhY2VtZW50IG9uIGJpblBhdGggYmVjYXVzZSBpdCdzIGFsd2F5cworICAgICAgICAgICAgLy8gZ29pbmcKKyAgICAgICAgICAgIC8vIHRvIGJlCisgICAgICAgICAgICAvLyBhIHBhdGgKKyAgICAgICAgICAgIGJpblBhdGggPSBiaW5QYXRoLnJlcGxhY2VBbGwoIl5cXHMrIiwgIiIpLnJlcGxhY2VBbGwoIlxccyskIiwgIiIpLnJlcGxhY2VBbGwoIlxccyIsICJcXFxcICIpOworCisgICAgICAgICAgICBjb25maWcuc2V0RXh0cmFjdG9yQmluUGF0aChiaW5QYXRoKTsKKworICAgICAgICAgICAgRWxlbWVudCBhcmdzRWxlbSA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudChBUkdTX1RBRywgZXhlY0VsZW1lbnQpOworICAgICAgICAgICAgaWYgKGFyZ3NFbGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBhcmdOb2RlcyA9IGFyZ3NFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKEFSR19UQUcpOworCisgICAgICAgICAgICAgICAgaWYgKGFyZ05vZGVzICE9IG51bGwgJiYgYXJnTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmdWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBhcmdFbGVtID0gKEVsZW1lbnQpIGFyZ05vZGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnU3RyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLnZhbHVlT2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0VsZW0uZ2V0QXR0cmlidXRlKElTX0RBVEFfRklMRV9BVFRSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpKS5ib29sZWFuVmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdTdHIgPSBEQVRBX0ZJTEVfUExBQ0VfSE9MREVSOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQm9vbGVhbi52YWx1ZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdFbGVtLmdldEF0dHJpYnV0ZShJU19NRVRfRklMRV9BVFRSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpKS5ib29sZWFuVmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdTdHIgPSBNRVRfRklMRV9QTEFDRV9IT0xERVI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnU3RyID0gWE1MVXRpbHMuZ2V0U2ltcGxlRWxlbWVudFRleHQoYXJnRWxlbSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcHBlbmRFeHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXBwZW5kRXh0ID0gYXJnRWxlbS5nZXRBdHRyaWJ1dGUoQVBQRU5EX0VYVF9BVFRSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnU3RyICs9ICIuIiArIGFwcGVuZEV4dDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4udmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnRWxlbS5nZXRBdHRyaWJ1dGUoRU5WX1JFUExBQ0VfQVRUUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1N0ciA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGFyZ1N0cik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLnZhbHVlT2YoYXJnRWxlbS5nZXRBdHRyaWJ1dGUoSVNfUEFUSF9BVFRSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnU3RyID0gYXJnU3RyLnJlcGxhY2VBbGwoIlxccyIsICJcXFxcICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdWZWN0b3IuYWRkKGFyZ1N0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0QXJnTGlzdCgoU3RyaW5nW10pIGFyZ1ZlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXJFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZXIgJyIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRXh0ZXJuQ29uZmlnUmVhZGVyTWV0S2V5cy5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5Db25maWdSZWFkZXJNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzODk3NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRXh0ZXJuQ29uZmlnUmVhZGVyTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBNZXQga2V5cyBmb3IgdGhlIHtAbGluayBFeHRlcm5Db25maWdSZWFkZXJ9CisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVybkNvbmZpZ1JlYWRlck1ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ19UQUcgPSAiZXhlYyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLSU5HX0RJUl9BVFRSID0gIndvcmtpbmdEaXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUX0ZJTEVfRVhUX0FUVFIgPSAibWV0RmlsZUV4dCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQUNUT1JfQklOX1BBVEhfVEFHID0gImV4dHJhY3RvckJpblBhdGgiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX1JFUExBQ0VfQVRUUiA9ICJlbnZSZXBsYWNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1NfVEFHID0gImFyZ3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX1RBRyA9ICJhcmciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfREFUQV9GSUxFX0FUVFIgPSAiaXNEYXRhRmlsZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19NRVRfRklMRV9BVFRSID0gImlzTWV0RmlsZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBFTkRfRVhUX0FUVFIgPSAiYXBwZW5kRXh0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1BBVEhfQVRUUiA9ICJpc1BhdGgiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0V4dGVybk1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5NZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVmM2QyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5NZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuU2VyaWFsaXphYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkNtZExpbmVNZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYy5FeGVjVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogUnVucyBhbiBleHRlcm5hbCB7QGxpbmsgTWV0RXh0cmFjdG9yfSB0aGF0IGlzIGEgY29tbWFuZCBsaW5lIHByb2dyYW0gdG8KKyAqIGV4dHJhY3Qge0BsaW5rIE1ldGFkYXRhfSBmcm9tIHtAbGluayBQcm9kdWN0fSBmaWxlcy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5NZXRFeHRyYWN0b3IgZXh0ZW5kcyBDbWRMaW5lTWV0RXh0cmFjdG9yIGltcGxlbWVudHMKKyAgICAgICAgRXh0ZXJuTWV0RXh0cmFjdG9yTWV0S2V5cyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBFeHRlcm5Db25maWdSZWFkZXIgcmVhZGVyID0gbmV3IEV4dGVybkNvbmZpZ1JlYWRlcigpOworCisgICAgcHVibGljIEV4dGVybk1ldEV4dHJhY3RvcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIocmVhZGVyKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuQWJzdHJhY3RNZXRFeHRyYWN0b3IjZXh0cmFjdE1ldGFkYXRhKGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0ck1ldGFkYXRhKEZpbGUgZmlsZSkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb24geworCisgICAgICAgIC8vIGRldGVybWluZSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICBTdHJpbmcgd29ya2luZ0RpclBhdGggPSAoKEV4dGVybmFsTWV0RXh0cmFjdG9yQ29uZmlnKSB0aGlzLmNvbmZpZykKKyAgICAgICAgICAgICAgICAuZ2V0V29ya2luZ0RpclBhdGgoKTsKKyAgICAgICAgaWYgKHdvcmtpbmdEaXJQYXRoID09IG51bGwgfHwgd29ya2luZ0RpclBhdGguZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHdvcmtpbmdEaXJQYXRoID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIEZpbGUgd29ya2luZ0RpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXJQYXRoKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgbWV0IGZpbGUgcGF0aAorICAgICAgICBTdHJpbmcgbWV0RmlsZU5hbWUgPSBmaWxlLmdldE5hbWUoKSArICIuIgorICAgICAgICAgICAgICAgICsgKChFeHRlcm5hbE1ldEV4dHJhY3RvckNvbmZpZykgdGhpcy5jb25maWcpLmdldE1ldEZpbGVFeHQoKTsKKyAgICAgICAgU3RyaW5nIG1ldEZpbGVQYXRoID0gd29ya2luZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIG1ldEZpbGVOYW1lOworICAgICAgICBGaWxlIG1ldEZpbGUgPSBuZXcgRmlsZShtZXRGaWxlUGF0aCk7CisKKyAgICAgICAgLy8gZ2V0IGV4ZSBhcmdzCisgICAgICAgIExpc3QgY29tbWFuZExpbmVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBjb21tYW5kTGluZUxpc3QuYWRkKCgoRXh0ZXJuYWxNZXRFeHRyYWN0b3JDb25maWcpIHRoaXMuY29uZmlnKQorICAgICAgICAgICAgICAgIC5nZXRFeHRyYWN0b3JCaW5QYXRoKCkpOworICAgICAgICBpZiAoKChFeHRlcm5hbE1ldEV4dHJhY3RvckNvbmZpZykgdGhpcy5jb25maWcpLmdldEFyZ0xpc3QoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKChFeHRlcm5hbE1ldEV4dHJhY3RvckNvbmZpZykgdGhpcy5jb25maWcpLmdldEFyZ0xpc3QoKS5sZW5ndGggPiAwKQorICAgICAgICAgICAgY29tbWFuZExpbmVMaXN0LmFkZEFsbChBcnJheXMKKyAgICAgICAgICAgICAgICAgICAgLmFzTGlzdCgoKEV4dGVybmFsTWV0RXh0cmFjdG9yQ29uZmlnKSB0aGlzLmNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXJnTGlzdCgpKSk7CisgICAgICAgIFN0cmluZ1tdIGNvbW1hbmRMaW5lQXJncyA9IG5ldyBTdHJpbmdbY29tbWFuZExpbmVMaXN0LnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZExpbmVMaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgY29tbWFuZExpbmVBcmdzW2ldID0gU3RyaW5nVXRpbHMucmVwbGFjZShTdHJpbmdVdGlscy5yZXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBjb21tYW5kTGluZUxpc3QuZ2V0KGkpLCBNRVRfRklMRV9QTEFDRV9IT0xERVIsCisgICAgICAgICAgICAgICAgICAgIG1ldEZpbGVQYXRoKSwgREFUQV9GSUxFX1BMQUNFX0hPTERFUiwgZmlsZQorICAgICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIGdlbmVyYXRlIG1ldGFkYXRhIGZpbGUKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiR2VuZXJhdGluZyBtZXQgZmlsZSBmb3IgcHJvZHVjdCBmaWxlOiBbIgorICAgICAgICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7CisgICAgICAgIGludCBzdGF0dXMgPSAtMTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkV4ZWN1dGluZyBjb21tYW5kIGxpbmU6IFsiCisgICAgICAgICAgICAgICAgICAgICsgRXhlY1V0aWxzLnByaW50Q29tbWFuZExpbmUoY29tbWFuZExpbmVBcmdzKQorICAgICAgICAgICAgICAgICAgICArICJdIHdpdGggd29ya2luZ0RpcjogWyIgKyB3b3JraW5nRGlyCisgICAgICAgICAgICAgICAgICAgICsgIl0gdG8gZXh0cmFjdCBtZXRhZGF0YSIpOworICAgICAgICAgICAgc3RhdHVzID0gRXhlY1V0aWxzLmNhbGxQcm9ncmFtKGNvbW1hbmRMaW5lQXJncywgd29ya2luZ0Rpcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIHJ1bm5pbmcgbWV0IGV4dHJhY3Rpb246IGNvbW1hbmRMaW5lOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRXhlY1V0aWxzLnByaW50Q29tbWFuZExpbmUoY29tbWFuZExpbmVBcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFeGl0IHN0YXR1cyBmb3IgbWV0IGV4dHJhY3Rpb24gbm90IDAiKTsKKyAgICAgICAgfSBlbHNlIGlmICghbWV0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXQgZXh0cmFjdG9yIGZhaWxlZCB0byBjcmVhdGUgbWV0YWRhdGEgZmlsZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiTWV0IGV4dHJhY3Rpb24gc3VjY2Vzc2Z1bCBmb3IgcHJvZHVjdCBmaWxlOiBbIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBzbSA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YSgiVVRGLTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIHNtLmxvYWRNZXRhZGF0YUZyb21YbWxTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShtZXRGaWxlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwcm9jZXNzTWFpbihhcmdzLCBuZXcgRXh0ZXJuTWV0RXh0cmFjdG9yKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5NZXRFeHRyYWN0b3JNZXRLZXlzLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0V4dGVybk1ldEV4dHJhY3Rvck1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTcwMmRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9FeHRlcm5NZXRFeHRyYWN0b3JNZXRLZXlzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogTWV0IGtleXMgZm9yIHRoZSB7QGxpbmsgRXh0ZXJuTWV0RXh0cmFjdG9yfQorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBFeHRlcm5NZXRFeHRyYWN0b3JNZXRLZXlzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfRklMRV9QTEFDRV9IT0xERVIgPSAiPERBVEFfRklMRV9QTEFDRV9IT0xERVI+IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVF9GSUxFX1BMQUNFX0hPTERFUiA9ICI8TUVUX0ZJTEVfUExBQ0VfSE9MREVSPiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FVF9GSUxFX0VYVEVOU0lPTiA9ICJtZXQiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0V4dGVybmFsTWV0RXh0cmFjdG9yQ29uZmlnLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0V4dGVybmFsTWV0RXh0cmFjdG9yQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMzQxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRXh0ZXJuYWxNZXRFeHRyYWN0b3JDb25maWcuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWc7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUge0BsaW5rIEV4dGVybk1ldEV4dHJhY3Rvcn0uCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxNZXRFeHRyYWN0b3JDb25maWcgaW1wbGVtZW50cyBNZXRFeHRyYWN0b3JDb25maWcsCisgICAgICAgIEV4dGVybk1ldEV4dHJhY3Rvck1ldEtleXMgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpclBhdGg7CisKKyAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0b3JCaW5QYXRoOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0RmlsZUV4dDsKKworICAgIHByaXZhdGUgU3RyaW5nW10gYXJnTGlzdDsKKworICAgIHB1YmxpYyBFeHRlcm5hbE1ldEV4dHJhY3RvckNvbmZpZygpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXh0ZXJuYWxNZXRFeHRyYWN0b3JDb25maWcoU3RyaW5nIHdvcmtpbmdEaXJQYXRoLAorICAgICAgICAgICAgU3RyaW5nIGV4dHJhY3RvckJpblBhdGgsIFN0cmluZ1tdIGFyZ0xpc3QpIHsKKyAgICAgICAgdGhpcy53b3JraW5nRGlyUGF0aCA9IHdvcmtpbmdEaXJQYXRoOworICAgICAgICB0aGlzLmV4dHJhY3RvckJpblBhdGggPSBleHRyYWN0b3JCaW5QYXRoOworICAgICAgICB0aGlzLmFyZ0xpc3QgPSBhcmdMaXN0OworICAgICAgICB0aGlzLm1ldEZpbGVFeHQgPSBERUZBVUxUX01FVF9GSUxFX0VYVEVOU0lPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBhcmdMaXN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFyZ0xpc3QoKSB7CisgICAgICAgIHJldHVybiBhcmdMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdMaXN0CisgICAgICogICAgICAgICAgICB0aGUgYXJnTGlzdCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmdMaXN0KFN0cmluZ1tdIGFyZ0xpc3QpIHsKKyAgICAgICAgdGhpcy5hcmdMaXN0ID0gYXJnTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0b3JCaW5QYXRoCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeHRyYWN0b3JCaW5QYXRoKCkgeworICAgICAgICByZXR1cm4gZXh0cmFjdG9yQmluUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZXh0cmFjdG9yQmluUGF0aAorICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhY3RvckJpblBhdGggdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0cmFjdG9yQmluUGF0aChTdHJpbmcgZXh0cmFjdG9yQmluUGF0aCkgeworICAgICAgICB0aGlzLmV4dHJhY3RvckJpblBhdGggPSBleHRyYWN0b3JCaW5QYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHdvcmtpbmdEaXJQYXRoCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JraW5nRGlyUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtpbmdEaXJQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3b3JraW5nRGlyUGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHdvcmtpbmdEaXJQYXRoIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJQYXRoKFN0cmluZyB3b3JraW5nRGlyUGF0aCkgeworICAgICAgICB0aGlzLndvcmtpbmdEaXJQYXRoID0gd29ya2luZ0RpclBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbWV0RmlsZUV4dAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0RmlsZUV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1ldEZpbGVFeHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG1ldEZpbGVFeHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRGaWxlRXh0IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldEZpbGVFeHQoU3RyaW5nIG1ldEZpbGVFeHQpIHsKKyAgICAgICAgdGhpcy5tZXRGaWxlRXh0ID0gbWV0RmlsZUV4dDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW5hbWVUb2tlbkNvbmZpZy5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9GaWxlbmFtZVRva2VuQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1MDIzZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW5hbWVUb2tlbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3JDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW5hbWVUb2tlbkV4dHJhY3Rvck1ldEtleXMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRUNvbmZpZ0ZpbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dC5QR0VDb25maWdGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQuUEdFQ29uZmlndXJhdGlvbkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dC5QR0VHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRVNjYWxhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRVZlY3RvcjsKKworLyoqCisgKiAKKyAqIFdyYXBzIGEge0BsaW5rIFBHRUNvbmZpZ3VyYXRpb25GaWxlfSBhcyBhIHtAbGluayBNZXRFeHRyYWN0b3JDb25maWd9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbGVuYW1lVG9rZW5Db25maWcgaW1wbGVtZW50cyBNZXRFeHRyYWN0b3JDb25maWcgeworCisgIHByaXZhdGUgUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZjsKKworICBwdWJsaWMgRmlsZW5hbWVUb2tlbkNvbmZpZygpIHsKKyAgICB0aGlzLmNvbmYgPSBudWxsOworICB9CisKKyAgcHVibGljIEZpbGVuYW1lVG9rZW5Db25maWcoUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZikgeworICAgIHRoaXMuY29uZiA9IGNvbmY7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDb25maWcoU3RyaW5nIGNvbmZGaWxlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24geworICAgIHRoaXMuY29uZiA9IG5ldyBQR0VDb25maWdGaWxlUmVhZGVyKCkucmVhZChuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKAorICAgICAgICBjb25mRmlsZVBhdGgpKSk7CisgIH0KKworICBwdWJsaWMgU2ltcGxlRGF0ZUZvcm1hdCBnZXREYXRlRm9ybWF0dGVyKCkgeworICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCh0aGlzLmNvbmYuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoCisgICAgICAgIFBST0RVQ1RJT05fREFURV9USU1FX0dST1VQKS5nZXRTY2FsYXIoREFURVRJTUVfU0NBTEFSKS5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc1Rva2VuTmFtZUxpc3QoKSB7CisgICAgcmV0dXJuIHRoaXMuY29uZi5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldChUT0tFTl9MSVNUX0dST1VQKSAhPSBudWxsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUb2tlbkRlbGltZXRlclNjYWxhcigpIHsKKyAgICByZXR1cm4gdGhpcy5jb25mLmdldFBnZVNwZWNpZmljR3JvdXBzKCkuZ2V0KFRPS0VOX0xJU1RfR1JPVVApLmdldFNjYWxhcigKKyAgICAgICAgVE9LRU5fREVMSU1FVEVSX1NDQUxBUikuZ2V0VmFsdWUoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VG9rZW5NZXRLZXlOYW1lcygpIHsKKyAgICByZXR1cm4gKExpc3Q8U3RyaW5nPikgKExpc3Q8Pz4pIHRoaXMuY29uZi5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldCgKKyAgICAgICAgVE9LRU5fTElTVF9HUk9VUCkuZ2V0VmVjdG9yKFRPS0VOX01FVF9LRVlTX1ZFQ1RPUikuZ2V0RWxlbWVudHMoKTsKKyAgfQorCisgIHB1YmxpYyBNZXRhZGF0YSBnZXRTdWJzdHJpbmdPZmZzZXRNZXQoRmlsZSBmaWxlKSB7CisgICAgUEdFR3JvdXAgc3Vic3RyT2Zmc2V0R3JvdXAgPSB0aGlzLmNvbmYuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoCisgICAgICAgIFNVQlNUUklOR19PRkZTRVRfR1JPVVApOworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIGlmIChzdWJzdHJPZmZzZXRHcm91cCA9PSBudWxsKQorICAgICAgcmV0dXJuIG1ldDsKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKworICAgIGZvciAoUEdFVmVjdG9yIHZlYyA6IHN1YnN0ck9mZnNldEdyb3VwLmdldFZlY3RvcnMoKS52YWx1ZXMoKSkgeworICAgICAgU3RyaW5nIG1ldEtleU5hbWUgPSB2ZWMuZ2V0TmFtZSgpOworICAgICAgaW50IG9mZnNldCA9IEludGVnZXIudmFsdWVPZigoU3RyaW5nKSB2ZWMuZ2V0RWxlbWVudHMoKS5nZXQoMCkpIC0gMTsKKyAgICAgIGludCBsZW5ndGggPSBJbnRlZ2VyLnZhbHVlT2YoKFN0cmluZykgdmVjLmdldEVsZW1lbnRzKCkuZ2V0KDEpKTsKKyAgICAgIFN0cmluZyBtZXRWYWwgPSBmaWxlbmFtZS5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLnRyaW0oKTsKKyAgICAgIG1ldC5hZGRNZXRhZGF0YShtZXRLZXlOYW1lLCBtZXRWYWwpOworICAgIH0KKworICAgIHJldHVybiBtZXQ7CisgIH0KKworICBwdWJsaWMgTWV0YWRhdGEgZ2V0Q29tbW9uTWV0KCkgeworICAgIFBHRUdyb3VwIGNvbW1vbk1ldEdyb3VwID0gdGhpcy5jb25mLmdldFBnZVNwZWNpZmljR3JvdXBzKCkuZ2V0KAorICAgICAgICBDT01NT05fTUVUQURBVEFfR1JPVVApOworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIGZvciAoU3RyaW5nIHNjYWxhck5hbWUgOiBjb21tb25NZXRHcm91cC5nZXRTY2FsYXJzKCkua2V5U2V0KCkpIHsKKyAgICAgIFBHRVNjYWxhciBzY2FsYXIgPSBjb21tb25NZXRHcm91cC5nZXRTY2FsYXIoc2NhbGFyTmFtZSk7CisgICAgICBtZXQuYWRkTWV0YWRhdGEoc2NhbGFyLmdldE5hbWUoKSwgUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoc2NhbGFyCisgICAgICAgICAgLmdldFZhbHVlKCkpKTsKKyAgICB9CisKKyAgICBmb3IgKFN0cmluZyB2ZWNOYW1lIDogY29tbW9uTWV0R3JvdXAuZ2V0VmVjdG9ycygpLmtleVNldCgpKSB7CisgICAgICBQR0VWZWN0b3IgdmVjID0gY29tbW9uTWV0R3JvdXAuZ2V0VmVjdG9yKHZlY05hbWUpOworICAgICAgZm9yIChTdHJpbmcgdmFsIDogKExpc3Q8U3RyaW5nPikgKExpc3Q8Pz4pIHZlYy5nZXRFbGVtZW50cygpKSB7CisgICAgICAgIG1ldC5hZGRNZXRhZGF0YSh2ZWNOYW1lLCBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyh2YWwpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWV0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNvbmYKKyAgICovCisgIHB1YmxpYyBQR0VDb25maWd1cmF0aW9uRmlsZSBnZXRDb25mKCkgeworICAgIHJldHVybiBjb25mOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjb25mCisgICAqICAgICAgICAgIHRoZSBjb25mIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29uZihQR0VDb25maWd1cmF0aW9uRmlsZSBjb25mKSB7CisgICAgdGhpcy5jb25mID0gY29uZjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0ZpbGVuYW1lVG9rZW5Db25maWdSZWFkZXIuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW5hbWVUb2tlbkNvbmZpZ1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjQ2ODEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0ZpbGVuYW1lVG9rZW5Db25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQuUEdFQ29uZmlnRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRUNvbmZpZ3VyYXRpb25GaWxlOworCisvKioKKyAqIAorICogUmVhZHMgaW4gYSB7QGxpbmsgRmlsZW5hbWVUb2tlbkNvbmZpZ30gdXNpbmcgdGhlIHtAbGluayBQR0VDb25maWdGaWxlUmVhZGVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlbmFtZVRva2VuQ29uZmlnUmVhZGVyIGltcGxlbWVudHMgTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyIHsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyI3BhcnNlQ29uZmlnRmlsZQorICAgKiAoamF2YS5pby5GaWxlKQorICAgKi8KKyAgcHVibGljIE1ldEV4dHJhY3RvckNvbmZpZyBwYXJzZUNvbmZpZ0ZpbGUoRmlsZSBmaWxlKQorICAgICAgdGhyb3dzIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbiB7CisgICAgRmlsZW5hbWVUb2tlbkNvbmZpZyBjb25mID0gbmV3IEZpbGVuYW1lVG9rZW5Db25maWcoKTsKKyAgICBQR0VDb25maWdGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBQR0VDb25maWdGaWxlUmVhZGVyKCk7CisgICAgUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZkZpbGU7CisKKyAgICB0cnkgeworICAgICAgY29uZkZpbGUgPSByZWFkZXIucmVhZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgY29uZi5zZXRDb25mKGNvbmZGaWxlKTsKKyAgICByZXR1cm4gY29uZjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0ZpbGVuYW1lVG9rZW5FeHRyYWN0b3JNZXRLZXlzLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL0ZpbGVuYW1lVG9rZW5FeHRyYWN0b3JNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiMjRjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW5hbWVUb2tlbkV4dHJhY3Rvck1ldEtleXMuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLyoqCisgKiAKKyAqIE1ldCBrZXlzIGZvciB0aGUge0BsaW5rIEZpbGVuYW1lVG9rZW5NZXRFeHRyYWN0b3J9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBGaWxlbmFtZVRva2VuRXh0cmFjdG9yTWV0S2V5cyB7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FX0ZPUk1BVF9TVFJJTkdfU0NBTEFSID0gIlRpbWVGb3JtYXRTdHJpbmciOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCU1RSSU5HX09GRlNFVF9HUk9VUCA9ICJTdWJzdHJpbmdPZmZzZXRHcm91cCI7CisgICAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0xJU1RfR1JPVVAgPSAiVG9rZW5OYW1lTGlzdEdyb3VwIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0RFTElNRVRFUl9TQ0FMQVIgPSAiRGVsaW1ldGVyIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9NRVRfS0VZU19WRUNUT1IgPSAiVG9rZW5NZXRLZXlzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUSU9OX0RBVEVfVElNRV9HUk9VUCA9ICJQcm9kdWN0aW9uRGF0ZVRpbWVHcm91cCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURVRJTUVfU0NBTEFSID0gIkRhdGVUaW1lRm9ybWF0IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fTUVUQURBVEFfR1JPVVAgPSAiQ29tbW9uTWV0YWRhdGEiOyAgCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9GaWxlbmFtZVRva2VuTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyYzcyNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkNtZExpbmVNZXRFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CisKKy8qKgorICogCisgKiBFeHRyYWN0cyBvdXQge0BsaW5rIE1ldGFkYXRhfSB1c2luZyB0aGUge0BsaW5rIEZpbGUjZ2V0TmFtZSgpfSBhbmQgYQorICoge0BsaW5rIEZpbGVuYW1lVG9rZW5Db25maWd9IHRvIHNwZWNpZnkgd2hhdCBwaWVjZXMgb2YgdGhlIGZpbGVuYW1lIG1hcCB0bworICogcGFydGljdWxhciBNZXRhZGF0YSBrZXkgbmFtZXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvciBleHRlbmRzIENtZExpbmVNZXRFeHRyYWN0b3IgaW1wbGVtZW50cworICAgIEZpbGVuYW1lVG9rZW5FeHRyYWN0b3JNZXRLZXlzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEZpbGVuYW1lVG9rZW5NZXRFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBGaWxlbmFtZVRva2VuTWV0RXh0cmFjdG9yKCkgeworICAgIHN1cGVyKG5ldyBGaWxlbmFtZVRva2VuQ29uZmlnUmVhZGVyKCkpOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLkFic3RyYWN0TWV0RXh0cmFjdG9yI2V4dHJNZXRhZGF0YShqYXZhLmlvCisgICAqIC5GaWxlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBNZXRhZGF0YSBleHRyTWV0YWRhdGEoRmlsZSBmaWxlKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgaWYgKCgoRmlsZW5hbWVUb2tlbkNvbmZpZykgdGhpcy5jb25maWcpLmhhc1Rva2VuTmFtZUxpc3QoKSkgeworICAgICAgTGlzdDxTdHJpbmc+IG1ldEtleVRva2VucyA9ICgoRmlsZW5hbWVUb2tlbkNvbmZpZykgdGhpcy5jb25maWcpCisgICAgICAgICAgLmdldFRva2VuTWV0S2V5TmFtZXMoKTsKKyAgICAgIFN0cmluZ1tdIGZpbGVuYW1lVG9rcyA9IGZpbGVuYW1lLnNwbGl0KCJcXC4iKVswXQorICAgICAgICAgIC5zcGxpdCgoKEZpbGVuYW1lVG9rZW5Db25maWcpIHRoaXMuY29uZmlnKS5nZXRUb2tlbkRlbGltZXRlclNjYWxhcigpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZW5hbWVUb2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIFN0cmluZyBrZXlOYW1lID0gbWV0S2V5VG9rZW5zLmdldChpKTsKKyAgICAgICAgU3RyaW5nIGtleVZhbCA9IGZpbGVuYW1lVG9rc1tpXTsKKyAgICAgICAgaWYgKGtleU5hbWUuZXF1YWxzKCJQcm9kdWN0aW9uRGF0ZVRpbWUiKSkgeworICAgICAgICAgIENhbGVuZGFyIGNhbCA9IEdyZWdvcmlhbkNhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbC5zZXRUaW1lKCgoRmlsZW5hbWVUb2tlbkNvbmZpZykgdGhpcy5jb25maWcpLmdldERhdGVGb3JtYXR0ZXIoKQorICAgICAgICAgICAgICAgIC5wYXJzZShrZXlWYWwpKTsKKyAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGtleVZhbCA9IERhdGVVdGlscy50b1N0cmluZyhjYWwpOworICAgICAgICB9CisKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKGtleU5hbWUsIGtleVZhbCk7CisgICAgICB9CisgICAgfQorCisgICAgTWV0YWRhdGEgY29tbW9uTWV0ID0gKChGaWxlbmFtZVRva2VuQ29uZmlnKSB0aGlzLmNvbmZpZykuZ2V0Q29tbW9uTWV0KCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKGNvbW1vbk1ldC5nZXRIYXNodGFibGUoKSk7CisgICAgbWV0LmFkZE1ldGFkYXRhKCgoRmlsZW5hbWVUb2tlbkNvbmZpZykgdGhpcy5jb25maWcpCisgICAgICAgIC5nZXRTdWJzdHJpbmdPZmZzZXRNZXQoZmlsZSkpOworCisgICAgbWV0LmFkZE1ldGFkYXRhKCJGaWxlbmFtZSIsIGZpbGUuZ2V0TmFtZSgpKTsKKyAgICBtZXQuYWRkTWV0YWRhdGEoIkZpbGVMb2NhdGlvbiIsIGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICByZXR1cm4gbWV0OworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJvY2Vzc01haW4oYXJncywgbmV3IEZpbGVuYW1lVG9rZW5NZXRFeHRyYWN0b3IoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9NZXRSZWFkZXJDb25maWcuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvTWV0UmVhZGVyQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYTY2ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvTWV0UmVhZGVyQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZzsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRSZWFkZXJDb25maWcgZXh0ZW5kcyBQcm9wZXJ0aWVzIGltcGxlbWVudHMgTWV0RXh0cmFjdG9yQ29uZmlnIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgxNDE1MDcwNzUzMzg2OTg2ODBMOworCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL01ldFJlYWRlckNvbmZpZ1JlYWRlci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9NZXRSZWFkZXJDb25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDAyM2FjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9NZXRSZWFkZXJDb25maWdSZWFkZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQ29uZmlnIGZpbGUgcmVhZGVyIGNsYXNzIGZvciB7QGxpbmsgTWV0UmVhZGVyRXh0cmFjdG9yfQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE1ldFJlYWRlckNvbmZpZ1JlYWRlciBpbXBsZW1lbnRzIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciB7CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyI3BhcnNlQ29uZmlnRmlsZShqYXZhLmlvLkZpbGUpCisJICovCisJcHVibGljIE1ldEV4dHJhY3RvckNvbmZpZyBwYXJzZUNvbmZpZ0ZpbGUoRmlsZSBjb25maWdGaWxlKQorCQkJdGhyb3dzIE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlNZXRSZWFkZXJDb25maWcgY29uZmlnID0gbmV3IE1ldFJlYWRlckNvbmZpZygpOworCQkJY29uZmlnLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKSk7CisJCQlyZXR1cm4gY29uZmlnOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlckV4Y2VwdGlvbigKKwkJCQkJIkZhaWxlZCB0byByZWFkIGNvbmZpZyBmaWxlICIgKyBjb25maWdGaWxlICsgIiA6ICIKKwkJCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9NZXRSZWFkZXJFeHRyYWN0b3IuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvTWV0UmVhZGVyRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2Y2UyZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvTWV0UmVhZGVyRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ21kTGluZU1ldEV4dHJhY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIE1ldCBFeHRyYWN0b3IgdGhhdCBhc3N1bWVzIHRoYXQgdGhlIC5tZXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZC4KKyAqIFRoaXMgZXh0cmFjdG9yIGFzc3VtZXMgdGhlIHByZXNlbmNlIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW4KKyAqIHtAbGluayAjZXh0cmFjdE1ldGFkYXRhKEZpbGUsIEZpbGUpfSwgRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiLm1ldCIKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRSZWFkZXJFeHRyYWN0b3IgZXh0ZW5kcyBDbWRMaW5lTWV0RXh0cmFjdG9yIHsKKworICAgIC8qIHRoZSBleHRlbnNpb24gKGUuZy4sIC5tZXQpIGZvciB0aGUgbWV0IGZpbGUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZXRGaWxlRXh0OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVRfRklMRV9FWFQgPSAibWV0IjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgTWV0UmVhZGVyQ29uZmlnUmVhZGVyIHJlYWRlciA9IG5ldyBNZXRSZWFkZXJDb25maWdSZWFkZXIoKTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0UmVhZGVyRXh0cmFjdG9yKCkgeworICAgICAgICB0aGlzKERFRkFVTFRfTUVUX0ZJTEVfRVhUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1ldFJlYWRlckV4dHJhY3RvciB0aGF0IGxvb2tzIGZvciBtZXQgZmlsZXMgd2l0aCB0aGUKKyAgICAgKiBnaXZlbiA8Y29kZT5tZXRGaWxlRXh0PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWV0RmlsZUV4dAorICAgICAqICAgICAgICAgICAgVGhlIG1ldCBmaWxlIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0UmVhZGVyRXh0cmFjdG9yKFN0cmluZyBtZXRGaWxlRXh0KSB7CisgICAgICAgIHN1cGVyKHJlYWRlcik7CisgICAgICAgIHRoaXMubWV0RmlsZUV4dCA9IG1ldEZpbGVFeHQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLkFic3RyYWN0TWV0RXh0cmFjdG9yI2V4dHJhY3RNZXRhZGF0YShqYXZhLmlvLkZpbGUpCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJNZXRhZGF0YShGaWxlIGZpbGUpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZG9uJ3QgcmVhbGx5IG5lZWQgY29uZiBmaWxlLCB3ZSdyZSBhc3N1bWluZyB0aGF0IHRoZXJlIGlzIGFuIGV4aXN0aW5nCisgICAgICAgIC8vIC5tZXQgZmlsZQorICAgICAgICAvLyBmb3IgdGhlIGdpdmVuIHByb2R1Y3QgZmlsZQorICAgIAlTdHJpbmcgZXh0ZW5zaW9uID0gdGhpcy5tZXRGaWxlRXh0OworICAgIAlpZiAodGhpcy5jb25maWcgIT0gbnVsbCkKKyAgICAJCWV4dGVuc2lvbiA9ICgoTWV0UmVhZGVyQ29uZmlnKSB0aGlzLmNvbmZpZykKKwkJCQkuZ2V0UHJvcGVydHkoCisJCQkJCQkib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLk1ldFJlYWRlci5tZXRGaWxlRXh0IiwKKwkJCQkJCXRoaXMubWV0RmlsZUV4dCk7CisgICAgICAgIFN0cmluZyBtZXRGaWxlRnVsbFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi4iICsgZXh0ZW5zaW9uOworICAgIAlMT0cubG9nKExldmVsLklORk8sICJSZWFkaW5nIG1ldGFkYXRhIGZyb20gIiArIG1ldEZpbGVGdWxsUGF0aCk7CisgICAgICAgIC8vIG5vdyByZWFkIHRoZSBtZXQgZmlsZSBhbmQgcmV0dXJuIGl0CisgICAgICAgIGlmICghbmV3IEZpbGUobWV0RmlsZUZ1bGxQYXRoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oIk1ldCBmaWxlOiBbIiArIG1ldEZpbGVGdWxsUGF0aAorICAgICAgICAgICAgICAgICAgICArICJdIGRvZXMgbm90IGV4aXN0OiBmYWlsaW5nISIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcmlhbGl6YWJsZU1ldGFkYXRhIG1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YSgiVVRGLTgiLCBmYWxzZSk7CisgICAgICAgICAgICBtZXQubG9hZE1ldGFkYXRhRnJvbVhtbFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG1ldEZpbGVGdWxsUGF0aCkpOworICAgICAgICAgICAgcmV0dXJuIG1ldDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc01haW4oYXJncywgbmV3IE1ldFJlYWRlckV4dHJhY3RvcigpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvUGFyZW50S2V5RGF0YVNvdXJjZU1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9QYXJlbnRLZXlEYXRhU291cmNlTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MTZiMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvUGFyZW50S2V5RGF0YVNvdXJjZU1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5NZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIFN1cHBvcnRzIGRhdGEgc291cmNlIGtleSBsb29rIHZpYSBwYXJlbnQga2V5IGlmIGZpbGVzIGtleSBpcyBubyBnb29kLgorICogCisgKiBFeHBlY3RlZCBmaWxlIG5hbWU6CisgKiA8cGFyZW50X2tleT4tPHByaW1hcnlfa2V5Pi48cG9zdF9maXg+CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUuY29tIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJlbnRLZXlEYXRhU291cmNlTWV0RXh0cmFjdG9yIGV4dGVuZHMgRGF0YVNvdXJjZU1ldEV4dHJhY3RvciB7CisKKyAgcHJpdmF0ZSBTdHJpbmcga2V5OworICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBNZXRhZGF0YSBleHRyTWV0YWRhdGEoRmlsZSBmaWxlKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGtleSA9IGdldFByaW1hcnlLZXkoZmlsZSk7CisgICAgICByZXR1cm4gc3VwZXIuZXh0ck1ldGFkYXRhKGZpbGUpOworICAgIH0gY2F0Y2ggKE1ldEV4dHJhY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAga2V5ID0gZ2V0UGFyZW50S2V5KGZpbGUpOworICAgICAgaWYgKGtleSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBzdXBlci5leHRyTWV0YWRhdGEoZmlsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShGaWxlIGZpbGUpIHsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJpbWFyeUtleShGaWxlIGZpbGUpIHsKKyAgICBTdHJpbmcga2V5ID0gZ2V0S2V5QXRJbmRleChmaWxlLCBJbmRleC5QUklNQVJZKTsKKyAgICByZXR1cm4ga2V5ID09IG51bGwgPyBzdXBlci5nZXRLZXkoZmlsZSkgOiBrZXk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRQYXJlbnRLZXkoRmlsZSBmaWxlKSB7CisgICAgcmV0dXJuIGdldEtleUF0SW5kZXgoZmlsZSwgSW5kZXguUEFSRU5UKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldEtleUF0SW5kZXgoRmlsZSBmaWxlLCBJbmRleCBpbmRleCkgeworICAgIFN0cmluZyBrZXkgPSBzdXBlci5nZXRLZXkoZmlsZSk7CisgICAgTGlzdDxTdHJpbmc+IHNwbGl0S2V5ID0gTGlzdHMubmV3QXJyYXlMaXN0KFNwbGl0dGVyLm9uKCJfIikuc3BsaXQoa2V5KSk7CisgICAgaWYgKHNwbGl0S2V5LnNpemUoKSA9PSAyKSB7CisgICAgICByZXR1cm4gc3BsaXRLZXkuZ2V0KGluZGV4LmdldE51bWVyaWMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZW51bSBJbmRleCB7CisgICAgUFJJTUFSWSgxKSwKKyAgICBQQVJFTlQoMCk7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgaW5kZXg7CisKKyAgICBJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bWVyaWMoKSB7CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Byb2RUeXBlUGF0dGVybk1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9Qcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzViMWNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9Qcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBc3NpZ25zIGEgUHJvZHVjdFR5cGUgYmFzZWQgb24gYSBmaWxlbmFtZSBwYXR0ZXJuLCB3aGlsZSBzaW11bHRhbmVvdXNseSBhc3NpZ25pbmcgdmFsdWVzIHRvIG1ldGFkYXRhIGVsZW1lbnRzCisgKiBlbWJlZGRlZCBpbiB0aGUgZmlsZW5hbWUgcGF0dGVybi4KKyAqIDxwLz4KKyAqIFN1cHBvc2UgSSBoYXZlIGZpbGVzIGluIHRoZSBzdGFnaW5nIGFyZWEgcmVhZHkgdG8gYmUgaW5nZXN0ZWQuIFRoZXNlIGZpbGVzIHVzdWFsbHkgaGF2ZSBpbmZvcm1hdGlvbiBlbmNvZGVkIGludG8gdGhlCisgKiBmaWxlbmFtZSBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCB0aGUgY29udGVudHMgb2Ygb25lIGZpbGUgZnJvbSBvdGhlciBmaWxlcy4gRm9yIGV4YW1wbGUgYm9vay0xMjM0NTY3ODkwLnR4dCBtaWdodCBiZQorICogdGhlIGNvbnRlbnRzIG9mIGEgYm9vayB3aXRoIElTQk4gMTIzNDU2Nzg5MC4gT3IgcGFnZS0xMjM0NTY3ODkwLTEyLnR4dCBtaWdodCBiZSB0aGUgdGV4dCBvbiBwYWdlIDEyIG9mIGJvb2sgd2l0aCBJU0JOCisgKiAxMjM0NTY3ODkwLgorICogPHAvPgorICogSXQgd291bGQgYmUgdXNlZnVsIHRvIGdlbmVyYXRlIG1ldGFkYXRhIGZyb20gdGhlIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gdGhlIGZpbGVuYW1lICh0aGluazogZmlsZW5hbWUgPT4gbWV0YWRhdGEpLgorICogVGhlIHtAbGluayBQcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3J9IGFsbG93cyB0aGlzIGluIGEgZmxleGlibGUgbWFubmVyIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIExldCdzIHRha2UgYSBsb29rCisgKiBhdCB0aGUgY29uZmlnIGZpbGUgZm9yIHRoaXMgbWV0IGV4dHJhY3Rvci4KKyAqIDxwLz4KKyAqIDxwcmU+CisgKiBwcm9kdWN0LXR5cGUtcGF0dGVybnMueG1sCisgKgorICoge0Bjb2RlCisgKiA8Y29uZmlnPgorICogICA8IS0tIDxlbGVtZW50PiBNVVNUIGJlIGRlZmluZWQgYmVmb3JlIDxwcm9kdWN0LXR5cGU+IHNvIHRoZWlyIHBhdHRlcm5zIGNhbiBiZSByZXNvbHZlZCAtLT4KKyAqICAgPCEtLSBuYW1lIE1VU1QgYmUgYW4gZWxlbWVudCBkZWZpbmVkIGluIGVsZW1lbnRzLnhtbCAoYWxzbyBvbmx5IHVwcGVyIGFuZCBsb3dlciBjYXNlIGFscGhhIGNoYXJzKSAtLT4KKyAqICAgPCEtLSByZWdleHAgTVVTVCBiZSB2YWxpZCBpbnB1dCB0byBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKCkgLS0+CisgKiAgIDxlbGVtZW50IG5hbWU9IklTQk4iIHJlZ2V4cD0iWzAtOV17MTB9Ii8+CisgKiAgIDxlbGVtZW50IG5hbWU9IlBhZ2UiIHJlZ2V4cD0iWzAtOV0qIi8+CisgKgorICogICA8IS0tIG5hbWUgTVVTVCBiZSBhIFByb2R1Y3RUeXBlIG5hbWUgZGVmaW5lZCBpbiBwcm9kdWN0LXR5cGVzLnhtbCAtLT4KKyAqICAgPCEtLSBtZXRhZGF0YSBlbGVtZW50cyBpbnNpZGUgYnJhY2tldHMgTVVTVCBiZSBtYXBwZWQgdG8gdGhlIFByb2R1Y3RUeXBlLAorICogICAgICAgIGFzIGRlZmluZWQgaW4gcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCAtLT4KKyAqICAgPHByb2R1Y3QtdHlwZSBuYW1lPSJCb29rIiB0ZW1wbGF0ZT0iYm9vay1bSVNCTl0udHh0Ii8+CisgKiAgIDxwcm9kdWN0LXR5cGUgbmFtZT0iQm9va1BhZ2UiIHRlbXBsYXRlPSJwYWdlLVtJU0JOXS1bUGFnZV0udHh0Ii8+CisgKiA8L2NvbmZpZz4KKyAqIH0KKyAqIDwvcHJlPgorICogPHAvPgorICogPHAvPgorICogVGhpcyBmaWxlIGRlZmluZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSAiSVNCTiIgbWV0YWRhdGEgZWxlbWVudCwgaW4gdGhpcyBjYXNlLCBhIDEwLWRpZ2l0IG51bWJlci4gQWxzbywgdGhlCisgKiAiUGFnZSIgbWV0YWRhdGEgZWxlbWVudCBpcyBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YgMCBvciBtb3JlIGRpZ2l0cy4KKyAqIDxwLz4KKyAqIE5leHQsIHRoZSBmaWxlIGRlZmluZXMgYSBmaWxlbmFtZSBwYXR0ZXJuIGZvciB0aGUgIkJvb2siIHByb2R1Y3QgdHlwZS4gVGhlIHBhdHRlcm4gaXMgY29tcGlsZWQgaW50byBhIHJlZ3VsYXIKKyAqIGV4cHJlc3Npb24sIHN1YnN0aXR1dGluZyB0aGUgcHJldmlvdXNseSBkZWZpbmVkIHJlZ2V4ZXMgYXMgY2FwdHVyZSBncm91cHMuIEZvciBleGFtcGxlLCAiYm9vay1bSVNCTl0udHh0IiBjb21waWxlcyB0bworICogImJvb2stKFswLTldezEwfSkudHh0IiwgYW5kIHRoZSBJU0JOIG1ldCBlbGVtZW50IGlzIGFzc2lnbmVkIHRvIGNhcHR1cmUgZ3JvdXAgMS4gV2hlbiB0aGUgZmlsZW5hbWUgbWF0Y2hlcyB0aGlzCisgKiBwYXR0ZXJuLCAyIG1ldGFkYXRhIGFzc2lnbm1lbnRzIG9jY3VyOiAoMSkgdGhlIElTQk4gbWV0IGVsZW1lbnQgaXMgc2V0IHRvIHRoZSBtYXRjaGVkIHJlZ2V4IGdyb3VwLCBhbmQgKDIpIHRoZQorICogUHJvZHVjdFR5cGUgbWV0IGVsZW1lbnQgaXMgc2V0IHRvICJCb29rIi4KKyAqIDxwLz4KKyAqIFNpbWlsYXJseSwgdGhlIHNlY29uZCBwYXR0ZXJuIHNldHMgSVNCTiwgUGFnZSwgYW5kIFByb2R1Y3RUeXBlIGZvciBmaWxlcyBtYXRjaGluZyAicGFnZS0oWzAtOV17MTB9KS0oWzAtOV0qKS50eHQiLgorICogPHAvPgorICogVGhpcyBhY2hpZXZlcyBzZXZlcmFsIHRoaW5nczogPG9sPiA8bGk+YXNzaWduaW5nIG1ldCBlbGVtZW50cyBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb25zPC9saT4gPGxpPmFzc2lnbmluZyBwcm9kdWN0CisgKiB0eXBlIGJhc2VkIG9uIGVhc3ktdG8tdW5kZXJzdGFuZCBwYXR0ZXJuIHdpdGggbWV0IGVsZW1lbnRzIGNsZWFybHkgaW5kaWNhdGVkPC9saT4gPGxpPnJldXNlIG9mIG1ldCBlbGVtZW50IHJlZ3VsYXIKKyAqIGV4cHJlc3Npb25zPC9saT4gPC9vbD4KKyAqIDxwLz4KKyAqIERpZmZlcmVuY2VzIGZyb20ge0BsaW5rIEZpbGVuYW1lVG9rZW5NZXRFeHRyYWN0b3J9OgorICogPG9sPgorICogICAgIDxsaT5BbGxvd3MgZHluYW1pYyBsZW5ndGggbWV0YWRhdGEgKGRvZXMgbm90IHJlbHkgb24gb2Zmc2V0IGFuZCBsZW5ndGggb2YgbWV0YWRhdGEpPC9saT4KKyAqICAgICA8bGk+QXNzaWducyBQcm9kdWN0VHlwZTwvbGk+CisgKiA8L29sPgorICogPHAvPgorICogRGlmZmVyZW5jZXMgZnJvbSB7QGxpbmsgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXJ9OgorICogPG9sPgorICogICAgIDxsaT5Eb2VzIG5vdCByZXF1aXJlIGRlZmluaXRpb24gb2YgY3VzdG9tIE1JTUUgdHlwZSBhbmQgTUlNRS10eXBlIHJlZ2V4LiBSZWFsbHksIGFsbCB5b3Ugd2FudCBpcyB0byBhc3NpZ24gYQorICogICAgIFByb2R1Y3RUeXBlLCByYXRoZXIgdGhhbiBpbmRpcmVjdGx5IGFzc2lnbmluZyBhIGN1c3RvbSBNSU1FIHR5cGUgdGhhdCBtYXBzIHRvIGEgUHJvZHVjdCBUeXBlLjwvbGk+CisgKiA8L29sPgorICogPHAvPgorICogRGlmZmVyZW5jZXMgZnJvbSB7QGxpbmsgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuRmlsZW5hbWVSZWdleE1ldEV4dHJhY3Rvcn06CisgKiA8b2w+CisgKiAgICAgPGxpPkFzc2lnbnMgUHJvZHVjdFR5cGUuIEZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IgcnVucyBhZnRlciBQcm9kdWN0VHlwZSBpcyBhbHJlYWR5IGRldGVybWluZWQuPC9saT4KKyAqICAgICA8bGk+UnVucyBvbiB0aGUgY2xpZW50LXNpZGUgKGNyYXdsZXIpLiBGaWxlbmFtZVJlZ2V4TWV0RXh0cmFjdG9yIHJ1bnMgb24gdGhlIHNlcnZlci1zaWRlIChmaWxlbWdyKS48L2xpPgorICogICAgIDxsaT5EaWZmZXJlbnQgcGF0dGVybnMgZm9yIGRpZmZlcmVudCBQcm9kdWN0VHlwZXMuIEZpbGVuYW1lUmVnZXhNZXRFeHRyYWN0b3IgY29uZmlnIGFwcGxpZXMgdGhlIHNhbWUgcGF0dGVybiB0bworICogICAgIGFsbCBmaWxlcy48L2xpPgorICogPC9vbD4KKyAqIDxwLz4KKyAqIFByZXJlcXVpc2l0ZXM6CisgKiA8b2w+CisgKiAgICAgPGxpPntAY29kZSA8ZWxlbWVudD59IHRhZyBvY2N1cnMgYmVmb3JlIHtAY29kZSA8cHJvZHVjdC10eXBlPn0gdGFnPC9saT4KKyAqICAgICA8bGk+e0Bjb2RlIDxlbGVtZW50PiBAbmFtZX0gYXR0cmlidXRlIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZSBkZWZpbmVkIGluIEZpbGVNYW5hZ2VyIHBvbGljeSBlbGVtZW50cy54bWw8L2xpPgorICogICAgIDxsaT57QGNvZGUgPGVsZW1lbnQ+IEByZWdleHB9IGF0dHJpYnV0ZSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgdmFsaWQgaW5wdXQgdG8KKyAqICAgICB7QGxpbmsgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4jY29tcGlsZShTdHJpbmcpfTwvbGk+CisgKiAgICAgPGxpPntAY29kZSA8cHJvZHVjdC10eXBlPiBAbmFtZX0gYXR0cmlidXRlIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZSBhIFByb2R1Y3RUeXBlIG5hbWUgKG5vdCBJRCkgZGVmaW5lZCBpbgorICogICAgIHByb2R1Y3QtdHlwZXMueG1sPC9saT4KKyAqICAgICA8bGk+bWV0IGVsZW1lbnRzIHVzZWQgaW4ge0Bjb2RlIDxwcm9kdWN0LXR5cGU+IEB0ZW1wbGF0ZX0gYXR0cmlidXRlIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZQorICogICAgIG1hcHBlZCB0byB0aGUgUHJvZHVjdFR5cGUsIGFzIGRlZmluZWQgaW4gcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbDwvbGk+CisgKiA8L29sPgorICogPHAvPgorICogPHN0cm9uZz5Xb3JkcyBvZiBDYXV0aW9uPC9zdHJvbmc+CisgKiA8dWw+CisgKiAgICAgPGxpPjxzdHJvbmc+RG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgbWV0IGVsZW1lbnRzLjwvc3Ryb25nPjwvbGk+CisgKiAgICAgPGxpPjxzdHJvbmc+RWFjaCBwYXR0ZXJuIHNob3VsZCBtYXAgdG8gb25lIHByb2R1Y3QgdHlwZS48L3N0cm9uZz4gV2F0Y2ggb3V0IGZvciBzaW1pbGFyIHBhdHRlcm5zLiBEb24ndCBkbyB0aGlzOgorICogPHByZT4KKyAqIHtAY29kZQorICogPGVsZW1lbnQgbmFtZT0iUGFnZSIgcmVnZXhwPSJbMC05XSoiLz4KKyAqIDxlbGVtZW50IG5hbWU9IkNoYXB0ZXIiIHJlZ2V4cD0iWzAtOV0qIi8+CisgKgorICogPHByb2R1Y3QtdHlwZSBuYW1lPSJQYWdlIiB0ZW1wbGF0ZT0iZGF0YS1bUGFnZV0udHh0Ii8+CisgKiA8cHJvZHVjdC10eXBlIG5hbWU9IkNoYXB0ZXIiIHRlbXBsYXRlPSJkYXRhLVtDaGFwdGVyXS50eHQiLz4KKyAqIH08L3ByZT4KKyAqIEluc3RlYWQsIGVuY29kZSB0aGUgcHJvZHVjdCB0eXBlIGluZm9ybWF0aW9uIGludG8gdGhlIGZpbGVuYW1lLCBmb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiB7QGNvZGUKKyAqIDxlbGVtZW50IG5hbWU9IlBhZ2UiIHJlZ2V4cD0iWzAtOV0qIi8+CisgKiA8ZWxlbWVudCBuYW1lPSJDaGFwdGVyIiByZWdleHA9IlswLTldKiIvPgorICoKKyAqIDxwcm9kdWN0LXR5cGUgbmFtZT0iUGFnZSIgdGVtcGxhdGU9InBhZ2UtW1BhZ2VdLnR4dCIvPgorICogPHByb2R1Y3QtdHlwZSBuYW1lPSJDaGFwdGVyIiB0ZW1wbGF0ZT0iY2hhcHRlci1bQ2hhcHRlcl0udHh0Ii8+CisgKiB9PC9wcmU+CisgKiA8L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIHJpY2tkbiAoUmlja3kgTmd1eWVuKQorICovCitwdWJsaWMgY2xhc3MgUHJvZFR5cGVQYXR0ZXJuTWV0RXh0cmFjdG9yIGV4dGVuZHMgQ21kTGluZU1ldEV4dHJhY3RvciB7CisKKyAgICBzdGF0aWMgY2xhc3MgQ29uZmlnUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RTQVhDb25maWdSZWFkZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUcgPSAiZWxlbWVudCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05BTUVfQVRUUiA9ICJuYW1lIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUkVHRVhQX0FUVFIgPSAicmVnZXhwIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9UQUcgPSAicHJvZHVjdC10eXBlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9OQU1FX0FUVFIgPSAibmFtZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEVfVEVNUExBVEVfQVRUUiA9ICJ0ZW1wbGF0ZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTUVUX1RPS0VOID0gUGF0dGVybi5jb21waWxlKCJcXFsoW0EtWmEtel0qKVxcXSIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIGZ1bGwgZmlsZSBuYW1lIHJlZyBleHAgPT4gcHJvZCB0eXBlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxQYXR0ZXJuLCBTdHJpbmc+IHByb2RUeXBlUGF0dGVybnMgPSBuZXcgSGFzaE1hcDxQYXR0ZXJuLCBTdHJpbmc+KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogcHJvZCB0eXBlID0+IGxpc3Qgb2YgbWV0IGVsZW1lbnRzIGluIHRoZSBmaWxlIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBwcm9kVHlwZUVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogbWV0IGVsZW1lbnRzID0+IGVsZW1lbnQgcmVnIGV4cCBwYXR0ZXJucworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYXR0ZXJuPiBlbGVtZW50UGF0dGVybnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhdHRlcm4+KCk7CisKKworICAgICAgICBNYXA8UGF0dGVybiwgU3RyaW5nPiBnZXRQcm9kVHlwZVBhdHRlcm5zKCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2RUeXBlUGF0dGVybnM7CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldFByb2RUeXBlRWxlbWVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZFR5cGVFbGVtZW50czsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkUHJvZHVjdFR5cGUoU3RyaW5nIGlkLCBTdHJpbmcgdGVtcGxhdGUpIHsKKyAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZUFsbCgiXFwuIiwgIlxcXFwuIik7CisgICAgICAgICAgICBNYXRjaGVyIG0gPSBNRVRfVE9LRU4ubWF0Y2hlcih0ZW1wbGF0ZSk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZWxlbUxpc3QgPSBwcm9kVHlwZUVsZW1lbnRzLmdldChpZCk7CisgICAgICAgICAgICBpZiAoZWxlbUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgcHJvZFR5cGVFbGVtZW50cy5wdXQoaWQsIGVsZW1MaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBuZXdUZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgICAgICAgICAgd2hpbGUgKG0uZmluZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW0gPSBtLmdyb3VwKDEpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWdleCA9IGVsZW1lbnRQYXR0ZXJucy5nZXQoZWxlbSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBuZXdUZW1wbGF0ZSA9IG5ld1RlbXBsYXRlLnJlcGxhY2VBbGwoIlxcWyIgKyBlbGVtICsgIlxcXSIsICIoIiArIHJlZ2V4ICsgIikiKTsKKyAgICAgICAgICAgICAgICBlbGVtTGlzdC5hZGQoZWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kVHlwZVBhdHRlcm5zLnB1dChQYXR0ZXJuLmNvbXBpbGUobmV3VGVtcGxhdGUpLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyByZWdleHApIHsKKyAgICAgICAgICAgIGVsZW1lbnRQYXR0ZXJucy5wdXQobmFtZSwgUGF0dGVybi5jb21waWxlKHJlZ2V4cCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKEVMRU1FTlRfVEFHKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZShFTEVNRU5UX05BTUVfQVRUUik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlZ2V4cCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoRUxFTUVOVF9SRUdFWFBfQVRUUik7CisgICAgICAgICAgICAgICAgYWRkRWxlbWVudChuYW1lLCByZWdleHApOworICAgICAgICAgICAgfSBlbHNlIGlmIChxTmFtZS5lcXVhbHMoUFJPRFVDVF9UWVBFX1RBRykpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFBST0RVQ1RfVFlQRV9OQU1FX0FUVFIpOworICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoUFJPRFVDVF9UWVBFX1RFTVBMQVRFX0FUVFIpOworICAgICAgICAgICAgICAgIGFkZFByb2R1Y3RUeXBlKGlkLCB0ZW1wbGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0U0FYQ29uZmlnUmVhZGVyIHBhcnNlQ29uZmlnRmlsZShGaWxlIGNvbmZpZ0ZpbGUpIHRocm93cyBNZXRFeHRyYWN0b3JDb25maWdSZWFkZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gcmVzZXQgaW50ZXJuYWwgc3RhdGUgd2hlbmV2ZXIgcGFyc2luZyBhIG5ldyBjb25maWcgZmlsZQorICAgICAgICAgICAgcHJvZFR5cGVQYXR0ZXJucy5jbGVhcigpOworICAgICAgICAgICAgcHJvZFR5cGVFbGVtZW50cy5jbGVhcigpOworICAgICAgICAgICAgZWxlbWVudFBhdHRlcm5zLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucGFyc2VDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVFlQRV9NRVRfS0VZID0gIlByb2R1Y3RUeXBlIjsKKworICAgIHB1YmxpYyBQcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3IoKSB7CisgICAgICAgIHN1cGVyKG5ldyBDb25maWdSZWFkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE1ldGFkYXRhIGV4dHJNZXRhZGF0YShGaWxlIGZpbGUpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIENvbmZpZ1JlYWRlciBtQ29uZmlnID0gKENvbmZpZ1JlYWRlcikgY29uZmlnOworCisgICAgICAgIGZvciAoUGF0dGVybiBwIDogbUNvbmZpZy5nZXRQcm9kVHlwZVBhdHRlcm5zKCkua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihmaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZFR5cGUgPSBtQ29uZmlnLmdldFByb2RUeXBlUGF0dGVybnMoKS5nZXQocCk7CisgICAgICAgICAgICAgICAgbWV0LmFkZE1ldGFkYXRhKFBST0RVQ1RfVFlQRV9NRVRfS0VZLCBwcm9kVHlwZSk7CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGVsZW1MaXN0ID0gbUNvbmZpZy5nZXRQcm9kVHlwZUVsZW1lbnRzKCkuZ2V0KHByb2RUeXBlKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG0uZ3JvdXBDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0LmFkZE1ldGFkYXRhKGVsZW1MaXN0LmdldChpKSwgbS5ncm91cChpICsgMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2Nlc3NNYWluKGFyZ3MsIG5ldyBQcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3IoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rpa2FDbWRMaW5lTWV0RXh0cmFjdG9yLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rpa2FDbWRMaW5lTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyNThmMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvVGlrYUNtZExpbmVNZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ0VzY2FwZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLk1ldEV4dHJhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLlRpa2E7CisKKy8qKgorICogQGF1dGhvciBydmVybWEKKyAqIEBhdXRob3IgYXJuaQorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgTWV0IEV4dHJhY3RvciB0aGF0IGludm9rZXMgQXBhY2hlIFRpa2EgdG8gYXV0b21hdGljYWxseSBkZXRlY3QKKyAqIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIGdpdmVuIHByb2R1Y3QuCisgKiA8L3A+CisgKiAuCisgKiA8cD4KKyAqIFRvIHVzZSB0aGlzIGV4dHJhY3RvciwgYSBtZXQgZXh0cmFjdG9yIGNvbmZpZyBmaWxlIG11c3QgYmUgcmVmZXJlbmNlZC4gCisgKiBUaGlzIGNhbiB0YWtlIHRoZSBmb3JtIG9mIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgdGhhdCBpbmNsdWRlcywgCisgKiBhdCBhIG1pbmltdW0sIHRoZSAnUHJvZHVjdFR5cGU9Li4uJyBtZXRhZGF0YSBrZXkgc3BlY2lmaWVkLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgVGlrYUNtZExpbmVNZXRFeHRyYWN0b3IgZXh0ZW5kcyBDbWRMaW5lTWV0RXh0cmFjdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoVGlrYUNtZExpbmVNZXRFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgTWV0UmVhZGVyQ29uZmlnUmVhZGVyIHJlYWRlciA9IAorICAgICAgICAgICAgbmV3IE1ldFJlYWRlckNvbmZpZ1JlYWRlcigpOworCisgICAgcHVibGljIFRpa2FDbWRMaW5lTWV0RXh0cmFjdG9yKCkgeworICAgICAgICBzdXBlcihyZWFkZXIpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUKKyAgICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLkFic3RyYWN0TWV0RXh0cmFjdG9yI2V4dHJhY3RNZXRhZGF0YShqYXZhCisgICAgICogLmlvLkZpbGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJNZXRhZGF0YShGaWxlIGZpbGUpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3JnLmFwYWNoZS50aWthLm1ldGFkYXRhLk1ldGFkYXRhIHRpa2FNZXQgPSAKKyAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGlrYS5tZXRhZGF0YS5NZXRhZGF0YSgpOworICAgICAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisKKyAgICAgICAgICAgIC8vIGV4dHJhY3QgbWV0IGZyb20gcHJvZCB1c2luZyB0aWthCisgICAgICAgICAgICBMT0cuZmluZSgiSW52b2tpbmcgdGlrYSBleHRyYWN0b3Igb24gZmlsZSBbIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIpOworICAgICAgICAgICAgVGlrYSB0aWthID0gbmV3IFRpa2EoKTsKKyAgICAgICAgICAgIHRpa2EucGFyc2UoaXMsIHRpa2FNZXQpOyAvLyBleHRyYWN0IG1ldGFkYXRhCisgICAgICAgICAgICB0aWthTWV0LmFkZCgiY29udGVudCIsIHRpa2EucGFyc2VUb1N0cmluZyhmaWxlKSk7IC8vIGV4dHJhY3QgY29udGVudAorCisgICAgICAgICAgICBMT0cuZmluZSgiTnVtYmVyIG9mIGNhcHR1cmVkIHRpa2EgbWV0YWRhdGEga2V5czogWyIKKyAgICAgICAgICAgICAgICAgICAgKyB0aWthTWV0Lm5hbWVzKCkubGVuZ3RoICsgIl0iKTsKKworICAgICAgICAgICAgLy8gY29weSB0aWthIG1ldCBpbnRvIG9vZHQgbWV0CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiB0aWthTWV0Lm5hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICBtZXQuYWRkTWV0YWRhdGEoa2V5LCBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVYbWwodGlrYU1ldC5nZXQoa2V5KSkpOworICAgICAgICAgICAgICAgIExPRy5maW5lKCJBZGRlZCB0aWthIG1ldCBrZXkgWyIgKyBrZXkgKyAiXSB3aXRoIHZhbHVlIFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1ldC5nZXRNZXRhZGF0YShrZXkpICsgIl0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0UmVhZGVyQ29uZmlnIG15Q29uZmlnID0gKE1ldFJlYWRlckNvbmZpZykgdGhpcy5jb25maWc7CisKKyAgICAgICAgICAgIC8vIGFkZCBjb25maWcgZmlsZSBtZXQKKyAgICAgICAgICAgIEVudW1lcmF0aW9uPE9iamVjdD4gY29uZmlnTWV0S2V5cyA9IG15Q29uZmlnLmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChjb25maWdNZXRLZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ01ldEtleSA9IChTdHJpbmcpIGNvbmZpZ01ldEtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29uZmlnTWV0S2V5VmFsID0gKFN0cmluZykgbXlDb25maWcuZ2V0KGNvbmZpZ01ldEtleSk7CisKKyAgICAgICAgICAgICAgICBtZXQuYWRkTWV0YWRhdGEoY29uZmlnTWV0S2V5LCBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVYbWwoY29uZmlnTWV0S2V5VmFsKSk7CisgICAgICAgICAgICAgICAgTE9HLmZpbmUoIkFkZGVkIGNvbmZpZyBmaWxlIG1ldCBrZXkgWyIgKyBjb25maWdNZXRLZXkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICJdIHdpdGggdmFsdWUgWyIgKyBtZXQuZ2V0TWV0YWRhdGEoY29uZmlnTWV0S2V5KSArICJdIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGFkZCBzdGFuZGFyZCBPT0RUIG1ldAorICAgICAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJGaWxlbmFtZSIsIFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZVhtbChmaWxlLmdldE5hbWUoKSkpOworICAgICAgICAgICAgbWV0LmFkZE1ldGFkYXRhKCJGaWxlTG9jYXRpb24iLCBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVYbWwoZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKworICAgICAgICAgICAgcmV0dXJuIG1ldDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5zZXZlcmUoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldEV4dHJhY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2Nlc3NNYWluKGFyZ3MsIG5ldyBUaWthQ21kTGluZU1ldEV4dHJhY3RvcigpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2ZpbGVuYW1pbmcvTmFtaW5nQ29udmVudGlvbi5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZmlsZW5hbWluZy9OYW1pbmdDb252ZW50aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2YTczZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2ZpbGVuYW1pbmcvTmFtaW5nQ29udmVudGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmZpbGVuYW1pbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHJlbmFtaW5nIGZpbGVzLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIE5hbWluZ0NvbnZlbnRpb24geworCisgICBwdWJsaWMgRmlsZSByZW5hbWUoRmlsZSBmaWxlLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBOYW1pbmdDb252ZW50aW9uRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZmlsZW5hbWluZy9QYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9maWxlbmFtaW5nL1BhdGhVdGlsc05hbWluZ0NvbnZlbnRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U1MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZmlsZW5hbWluZy9QYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZmlsZW5hbWluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5OYW1pbmdDb252ZW50aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8qKgorICogQSB7QGxpbmsgTmFtaW5nQ29udmVudGlvbn0gd2hpY2ggdXRpbGl6ZXMge0BsaW5rIFBhdGhVdGlsc30uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqLworcHVibGljIGNsYXNzIFBhdGhVdGlsc05hbWluZ0NvbnZlbnRpb24gaW1wbGVtZW50cyBOYW1pbmdDb252ZW50aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgbmFtaW5nQ29udjsKKworICAgcHJpdmF0ZSBNZXRhZGF0YSB0bXBSZXBsYWNlTWV0OworICAgCisgICBwdWJsaWMgUGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbigpeworCSAgIHRoaXMudG1wUmVwbGFjZU1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgfQorICAgCisgICBwdWJsaWMgRmlsZSByZW5hbWUoRmlsZSBmaWxlLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBOYW1pbmdDb252ZW50aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGZpbGUsICJNdXN0IHNwZWNpZnkgZmlsZSIpOworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChtZXRhZGF0YSwgIk11c3Qgc3BlY2lmeSBtZXRhZGF0YSIpOworCisgICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSwKKyAgICAgICAgICAgICAgIFBhdGhVdGlscy5kb0R5bmFtaWNSZXBsYWNlbWVudChuYW1pbmdDb252LCBtZXRhZGF0YSkpOworICAgICAgICAgaWYgKCFmaWxlLnJlbmFtZVRvKG5ld0ZpbGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlbmFtaW5nIGZpbGUgWyIgKyBmaWxlICsgIl0gdG8gWyIgKyBuZXdGaWxlCisgICAgICAgICAgICAgICAgICArICJdIHJldHVybmVkIGZhbHNlIik7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gbmV3RmlsZTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlbmFtaW5nIGZpbGUgWyIgKyBmaWxlCisgICAgICAgICAgICAgICArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0TmFtaW5nQ29udihTdHJpbmcgbmFtaW5nQ29udikgeworICAgICAgdGhpcy5uYW1pbmdDb252ID0gbmFtaW5nQ29udjsKKyAgIH0KKyAgIAorCXB1YmxpYyB2b2lkIGFkZFRtcFJlcGxhY2VNZXQoU3RyaW5nIGtleSwgTGlzdDxTdHJpbmc+IHZhbHVlcykgeworCQl0aGlzLnRtcFJlcGxhY2VNZXQucmVwbGFjZU1ldGFkYXRhKGtleSwgdmFsdWVzKTsKKwl9CisJCisJcHVibGljIE1ldGFkYXRhIGdldFRtcFJlcGxhY2VNZXQoKSB7CisJCXJldHVybiB0aGlzLnRtcFJlcGxhY2VNZXQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9FbmRzV2l0aENvbXBhcmF0b3IuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvRW5kc1dpdGhDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNDU5YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvRW5kc1dpdGhDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjsKKworLyoqCisgKiAKKyAqIEEge0BsaW5rIFByZUNvbmRpdGlvbkNvbXBhcmF0b3J9IHRoYXQgY2hlY2tzIGEgZmlsZSdzIGV4dGVuc2lvbiBhbmQgdGhlbgorICogc2tpcHMgZXh0cmFjdGluZyBtZXRhZGF0YSBmcm9tIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhpcyBleHRlbnNpb24uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRW5kc1dpdGhDb21wYXJhdG9yIGV4dGVuZHMgUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjxTdHJpbmc+IHsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5QcmVDb25kaXRpb25Db21wYXJhdG9yI3BlcmZvcm1DaGVjaworICAgKiAoamF2YS5pby5GaWxlLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBpbnQgcGVyZm9ybUNoZWNrKEZpbGUgZmlsZSwgU3RyaW5nIGV4dCkKKyAgICAgIHRocm93cyBQcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKGZpbGUuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCIuIikgKyAxKQorICAgICAgICAuY29tcGFyZVRvKGV4dCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9FeGlzdGFuY2VDaGVja0NvbXBhcmF0b3IuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvRXhpc3RhbmNlQ2hlY2tDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1ZWNiMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvRXhpc3RhbmNlQ2hlY2tDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLlByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUge0BsaW5rIENvbXBhcmF0b3J9IHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHtAbGluayBGaWxlfSBleGlzdGFuY2Ugd2l0aAorICoge0BsaW5rIFByZUNvbmRFdmFsVXRpbHN9CisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRXhpc3RhbmNlQ2hlY2tDb21wYXJhdG9yIGV4dGVuZHMgUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjxCb29sZWFuPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IHBlcmZvcm1DaGVjayhGaWxlIHByb2R1Y3QsIEJvb2xlYW4gY29tcGFyZUl0ZW0pCisgICAgICAgICAgICB0aHJvd3MgUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihwcm9kdWN0LmV4aXN0cygpKS5jb21wYXJlVG8oY29tcGFyZUl0ZW0pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9FeHRlcm5QcmVjb25kaXRpb25Db21wYXJhdG9yLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL0V4dGVyblByZWNvbmRpdGlvbkNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY4OWRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9FeHRlcm5QcmVjb25kaXRpb25Db21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnM7DQorDQorLy9KREsgaW1wb3J0cw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQorDQorLy9PT0RUIHN0YXRpYyBpbXBvcnRzDQoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzLmRvRHluYW1pY1JlcGxhY2VtZW50Ow0KKw0KKy8vT09EVCBpbXBvcnRzDQoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5QcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5leGVjLkV4ZWNVdGlsczsNCisNCisNCisvKioNCisgKiANCisgKiBAYXV0aG9yIHZtYWxsZGVyDQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIA0KKyAqIDxwPg0KKyAqIFRoZSBwcmUtY29uZGl0aW9uIGNvbXBhcmF0b3IgdG8gdXNlIHdoZW4geW91IGhhdmUgYW4gZXh0ZXJuYWwgc2NyaXB0IG9yIA0KKyAqIGFwcGxpY2F0aW9uIHVzaW5nIHtAbGluayBFeGVjVXRpbHN9IHRoYXQgd2lsbCBwZXJmb3JtIHNvbWUgcHJvY2Vzc2luZyBhbmQgDQorICogcmV0dXJuIHRoZSByZXN1bHQgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjb21wYXJlSXRlbS4gDQorICogPC9wPi4NCisgKi8NCitwdWJsaWMgY2xhc3MgRXh0ZXJuUHJlY29uZGl0aW9uQ29tcGFyYXRvciBleHRlbmRzIFByZUNvbmRpdGlvbkNvbXBhcmF0b3I8TG9uZz4gew0KKw0KKyAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGVDb21tYW5kOyANCisgICANCisgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXINCisgICAgICAuZ2V0TG9nZ2VyKCBFeHRlcm5QcmVjb25kaXRpb25Db21wYXJhdG9yLmNsYXNzLmdldE5hbWUoKSk7IA0KKyAgIA0KKyAgICANCisgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRlQ29tbWFuZCggU3RyaW5nIGNtZCApICB7DQorICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZCA9IGNtZDsNCisgICB9DQorCQ0KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0ZUNvbW1hbmQoKSB7DQorICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUNvbW1hbmQ7DQorICAgfQ0KKwkNCisgICAgQE92ZXJyaWRlDQorICAgIHByb3RlY3RlZCBpbnQgcGVyZm9ybUNoZWNrKEZpbGUgcHJvZHVjdCwgTG9uZyBjb21wYXJlSXRlbSkNCisgICAgICAgIHRocm93cyBQcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uIHsNCisJCQkNCisgICAgICAgIFN0cmluZyBlbnZSZXBsYWNlZEV4ZWN1dGVDb21tYW5kID0gIiI7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGVudlJlcGxhY2VkRXhlY3V0ZUNvbW1hbmQgPSBkb0R5bmFtaWNSZXBsYWNlbWVudCggZXhlY3V0ZUNvbW1hbmQgKSArDQorICAgICAgICAgICAgICAgICIgIiArIHByb2R1Y3QuZ2V0TmFtZSgpOw0KKw0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUgKSB7DQorICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLA0KKyAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHJ1bm5pbmcgZXh0ZXJuIGNvbXBhcmF0b3IgY2FsbGluZyBkb0R5bmFtaWNSZXBsYWNlbWVudCB3aXRoIDogY29tbWFuZCBbIg0KKyAgICAgICAgICAgICAgICArIGV4ZWN1dGVDb21tYW5kDQorICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOyANCisgICAgICAgIH0NCisJCQ0KKyAgICAgICAgLy8gRGV0ZXJtaW5lIHdvcmtpbmcgZGlyZWN0b3J5DQorICAgICAgICBTdHJpbmcgd29ya2luZ0RpclBhdGggPSBwcm9kdWN0LmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCisgICAgICAgIEZpbGUgd29ya2luZ0RpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXJQYXRoKTsNCisgICAgICAgIGludCBzdGF0dXMgPSAtMTsNCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgc3RhdHVzID0gRXhlY1V0aWxzLmNhbGxQcm9ncmFtKGVudlJlcGxhY2VkRXhlY3V0ZUNvbW1hbmQsIHdvcmtpbmdEaXIpOw0KKyAgICAgICAgIA0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywNCisgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIHJ1bm5pbmcgZXh0ZXJuIGNvbXBhcmF0b3I6IGNvbW1hbmRMaW5lOiBbIg0KKyAgICAgICAgICAgICAgICAgICAgKyBlbnZSZXBsYWNlZEV4ZWN1dGVDb21tYW5kDQorICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgICAgIHJldHVybiAxOyANCisgICAgICAgIH0NCisJCQ0KKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKHN0YXR1cykuY29tcGFyZVRvKGNvbXBhcmVJdGVtKTsNCisgICAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL0ZpbGVTaXplQ29tcGFyYXRvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9GaWxlU2l6ZUNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjNiOGRjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9GaWxlU2l6ZUNvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBjb21wYXRvciB0byB1c2Ugd2hlbiBjaGVja2luZyBmaWxlIHNpemUgaW4ge0BsaW5rIFByZUNvbkV2YWxVdGlsc30KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU2l6ZUNvbXBhcmF0b3IgZXh0ZW5kcyBQcmVDb25kaXRpb25Db21wYXJhdG9yPExvbmc+IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgcGVyZm9ybUNoZWNrKEZpbGUgcHJvZHVjdCwgTG9uZyBjb21wYXJlSXRlbSkKKyAgICAgICAgICAgIHRocm93cyBQcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKHByb2R1Y3QubGVuZ3RoKCkpLmNvbXBhcmVUbyhjb21wYXJlSXRlbSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL0xhc3RNb2RpZmllZENoZWNrQ29tcGFyYXRvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9MYXN0TW9kaWZpZWRDaGVja0NvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjZjNzFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9MYXN0TW9kaWZpZWRDaGVja0NvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLlByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLkV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjsKKworLyoqCisgKiBQcmVjb25kaXRpb24gY2xhc3MgdGhhdCBjaGVja3Mgb24gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBwcm9kdWN0LCAKKyAqIHJlcXVpcmluZyB0aGUgcHJvZHVjdCB0byBiZSBubyBvbGRlciB0aGFuIGEgZ2l2ZW4gdGltZSAoaW4gc2Vjb25kcykuCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIExhc3RNb2RpZmllZENoZWNrQ29tcGFyYXRvciBleHRlbmRzIFByZUNvbmRpdGlvbkNvbXBhcmF0b3I8Qm9vbGVhbj4geworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvci5jbGFzcy5nZXROYW1lKCkpOworCQorCXByaXZhdGUgbG9uZyBtYXhBZ2VJblNlY29uZHMgPSBMb25nLk1BWF9WQUxVRTsKKworCXB1YmxpYyB2b2lkIHNldE1heEFnZUluU2Vjb25kcyhsb25nIG1heEFnZUluU2Vjb25kcykgeworCQl0aGlzLm1heEFnZUluU2Vjb25kcyA9IG1heEFnZUluU2Vjb25kczsKKwl9CisJCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IHBlcmZvcm1DaGVjayhGaWxlIHByb2R1Y3QsIEJvb2xlYW4gY29tcGFyZUl0ZW0pIHRocm93cyBQcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uIHsKKwkJCisJCS8vIGNoZWNrIHByb2R1Y3QgbGFzdCBtb2RpZmljYXRpb24gdGltZQorCQlsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlsb25nIGxhc3RNb2RUaW1lID0gcHJvZHVjdC5sYXN0TW9kaWZpZWQoKTsKKwkJbG9uZyBkZWx0YUluU2VjcyA9IChub3ctbGFzdE1vZFRpbWUpLzEwMDA7CisJCQorCQkvLyByZWplY3QgdGhpcyBwcm9kdWN0CisJCWlmIChkZWx0YUluU2Vjcz5tYXhBZ2VJblNlY29uZHMpIHsKKwkJCUxPRy5sb2coTGV2ZWwuRklORVNULCAiUHJvZHVjdDogIitwcm9kdWN0LmdldEFic29sdXRlUGF0aCgpKyIgZmFpbHMgJ0xhc3QgTW9kaWZpZWQnIGNoZWNrOiAiK25ldyBEYXRlKGxhc3RNb2RUaW1lKSk7CisJCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpLmNvbXBhcmVUbyhjb21wYXJlSXRlbSk7CisJCQkKKwkJLy8gYWNjZXB0IHRoaXMgcHJvZHVjdAorCQl9IGVsc2UgeworCQkJTE9HLmxvZyhMZXZlbC5GSU5FU1QsICJQcm9kdWN0OiAiK3Byb2R1Y3QuZ2V0QWJzb2x1dGVQYXRoKCkrIiBwYXNzZXMgJ0xhc3QgTW9kaWZpZWQnIGNoZWNrOiAiK25ldyBEYXRlKGxhc3RNb2RUaW1lKSk7CisJCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSkuY29tcGFyZVRvKGNvbXBhcmVJdGVtKTsKKwkJCQorCQl9CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9NaW1lVHlwZUNvbXBhcmF0b3IuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvTWltZVR5cGVDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3YWYwNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvTWltZVR5cGVDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLlByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLk1pbWVUeXBlVXRpbHM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHtAbGluayBQcmVDb25kaXRpb25Db21wYXJhdG9yfSB0aGF0IHVzZXMgQXBhY2hlIFRpa2EgZm9yIE1pbWUgZGV0ZWN0aW9uCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgTWltZVR5cGVDb21wYXJhdG9yIGV4dGVuZHMgUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjxTdHJpbmc+IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VNYWdpYzsKKworICAgIHByaXZhdGUgTWltZVR5cGVVdGlscyBtaW1lVHlwZVV0aWxzID0gbmV3IE1pbWVUeXBlVXRpbHMoKTsKKworICAgIHB1YmxpYyBNaW1lVHlwZUNvbXBhcmF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMudXNlTWFnaWMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IHBlcmZvcm1DaGVjayhGaWxlIHByb2R1Y3QsIFN0cmluZyBtaW1lVHlwZSkKKyAgICAgICAgICAgIHRocm93cyBQcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyB0aWthTWltZVR5cGUgPSB0aGlzLm1pbWVUeXBlVXRpbHMuZ2V0TWltZVR5cGUocHJvZHVjdCk7CisgICAgICAgICAgICBpZiAodGlrYU1pbWVUeXBlID09IG51bGwgJiYgdXNlTWFnaWMpCisgICAgICAgICAgICAgICAgdGlrYU1pbWVUeXBlID0gdGhpcy5taW1lVHlwZVV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWltZVR5cGVCeU1hZ2ljKE1pbWVUeXBlVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRNYWdpY0hlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHByb2R1Y3QpKSk7CisgICAgICAgICAgICByZXR1cm4gdGlrYU1pbWVUeXBlLmNvbXBhcmVUbyhtaW1lVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IFByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IG1pbWUtdHlwZSBmb3IgIiArIHByb2R1Y3QgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWltZVR5cGVSZXBvKFN0cmluZyBtaW1lVHlwZVJlcG8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1pbWVUeXBlVXRpbHMgPSBuZXcgTWltZVR5cGVVdGlscyhtaW1lVHlwZVJlcG8pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbWltZVR5cGVVdGlscyA9IG5ldyBNaW1lVHlwZVV0aWxzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VNYWdpYyhib29sZWFuIHVzZU1hZ2ljKSB7CisgICAgICAgIHRoaXMudXNlTWFnaWMgPSB1c2VNYWdpYzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvUHJlQ29uZEV2YWxVdGlscy5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9QcmVDb25kRXZhbFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MWI5OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvUHJlQ29uZEV2YWxVdGlscy5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRFeHRyYWN0b3I7IC8vIGZvciBqYXZhZG9jCisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBFdmFsdWF0aW9uIHV0aWxpdHkgZm9yIG1ldGFkYXRhIGV4dHJhY3RvciBwcmVjb25kaXRpb25zCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUHJlQ29uZEV2YWxVdGlscyBpbXBsZW1lbnRzIFByZUNvbmRpdGlvbk9wZXJhdG9yTWV0S2V5cyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQcmVDb25kRXZhbFV0aWxzLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQ7CisKKyAgICBwdWJsaWMgUHJlQ29uZEV2YWxVdGlscyhBcHBsaWNhdGlvbkNvbnRleHQgYXBwbGljYXRpb25Db250ZXh0KSB7CisgICAgICAgIHRoaXMuYXBwbGljYXRpb25Db250ZXh0ID0gYXBwbGljYXRpb25Db250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB3aGV0aGVyIGFsbCBwcmVjb25kaXRpb25zIHBhc3Mgb3Igbm90CisgICAgICogCisgICAgICogQHBhcmFtIHByZWNvbmRpdGlvbnMKKyAgICAgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgaWRlbnRpZmllcnMgb2YgdGhlIHtAbGluayBQcmVDb25kaXRpb25Db21wYXJhdG9yfXMKKyAgICAgKiAgICAgICAgICAgIGluIHF1ZXN0aW9uCisgICAgICogQHBhcmFtIHByb2R1Y3QKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRmlsZX0gdG8gdGVzdCB0aGUgcHJlY29uZGl0aW9ucyBhZ2FpbnN0IHRvCisgICAgICogICAgICAgICAgICBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHtAbGluayBNZXRFeHRyYWN0b3J9IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgcnVuIG9yIG5vdC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgYWxsIHByZWNvbmRpdGlvbnMgcGFzcyBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbChMaXN0PFN0cmluZz4gcHJlQ29uZENvbXBhcmF0b3JJZHMsIEZpbGUgcHJvZHVjdCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVDb25kQ29tcGFyYXRvcklkIDogcHJlQ29uZENvbXBhcmF0b3JJZHMpIHsKKyAgICAgICAgICAgIGlmICghKChQcmVDb25kaXRpb25Db21wYXJhdG9yPD8+KSB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKAorICAgICAgICAgICAgICAgICAgICBwcmVDb25kQ29tcGFyYXRvcklkLCBQcmVDb25kaXRpb25Db21wYXJhdG9yLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgLnBhc3Nlcyhwcm9kdWN0KSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkZhaWxlZCBwcmVjb25kaXRpb24gY29tcGFyYXRvciBpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByZUNvbmRDb21wYXJhdG9ySWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUGFzc2VkIHByZWNvbmRpdGlvbiBjb21wYXJhdG9yIGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJlQ29uZENvbXBhcmF0b3JJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvUHJlQ29uZGl0aW9uQ29tcGFyYXRvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9QcmVDb25kaXRpb25Db21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1N2UzMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvUHJlQ29uZGl0aW9uQ29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcuU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5NZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5QcmVjb25kaXRpb25Db21wYXJhdG9yRXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuUHJlQ29uZGl0aW9uT3BlcmF0b3JNZXRLZXlzLio7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5SZXF1aXJlZDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBldmFsdWF0aW5nIHtAbGluayBQcmVDb25kaXRpb259IGNoZWNrcyBmb3IKKyAqIHJ1bm5pbmcgYSB7QGxpbmsgTWV0RXh0cmFjdG9yfQorICogPC9wPi4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByZUNvbmRpdGlvbkNvbXBhcmF0b3I8Q29tcGFyZVR5cGU+IGltcGxlbWVudHMgU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVFeHRlbnNpb247CisKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgICAgcHJpdmF0ZSBDb21wYXJlVHlwZSBjb21wYXJlSXRlbTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcGFzc2VzKEZpbGUgcHJvZHVjdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm9kdWN0ID0gbmV3IEZpbGUocHJvZHVjdC5nZXRBYnNvbHV0ZVBhdGgoKSArICIuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmZpbGVFeHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuIGV2YWwodGhpcy50eXBlLCB0aGlzLnBlcmZvcm1DaGVjayhwcm9kdWN0LCB0aGlzLmNvbXBhcmVJdGVtKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBlcmZvcm1DaGVjayhGaWxlIHByb2R1Y3QsIENvbXBhcmVUeXBlIGNvbXBhcmVJdGVtKQorICAgICAgICAgICAgdGhyb3dzIFByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlRXh0ZW5zaW9uKFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7CisgICAgICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBAUmVxdWlyZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgQFJlcXVpcmVkCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFyZUl0ZW0oQ29tcGFyZVR5cGUgY29tcGFyZUl0ZW0pIHsKKyAgICAgICAgdGhpcy5jb21wYXJlSXRlbSA9IGNvbXBhcmVJdGVtOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXZhbChTdHJpbmcgb3BLZXksIGludCBwcmVjb25kaXRpb25SZXN1bHQpCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIG9wS2V5ID0gb3BLZXkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKHByZWNvbmRpdGlvblJlc3VsdCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEVRVUFMX1RPLmVxdWFscyhvcEtleSk7CisgICAgICAgIGVsc2UgaWYgKHByZWNvbmRpdGlvblJlc3VsdCA+IDApCisgICAgICAgICAgICByZXR1cm4gTk9UX0VRVUFMX1RPLmVxdWFscyhvcEtleSkgfHwgR1JFQVRFUl9USEFOLmVxdWFscyhvcEtleSk7CisgICAgICAgIGVsc2UgaWYgKHByZWNvbmRpdGlvblJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gTk9UX0VRVUFMX1RPLmVxdWFscyhvcEtleSkgfHwgTEVTU19USEFOLmVxdWFscyhvcEtleSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uKCJldmFsVHlwZSBpcyBub3QgYSB2YWxpZCB0eXBlIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL1ByZUNvbmRpdGlvbk9wZXJhdG9yTWV0S2V5cy5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9QcmVDb25kaXRpb25PcGVyYXRvck1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjkzOGYwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9QcmVDb25kaXRpb25PcGVyYXRvck1ldEtleXMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIE1ldCBrZXlzIGZvciBldmFsdWF0aW5nIHtAbGluayBNZXRFeHRyYWN0b3J9IHtAbGluayBQcmVDb25kaXRpb259cworICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBQcmVDb25kaXRpb25PcGVyYXRvck1ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVFVQUxfVE8gPSAiRVFVQUxfVE8iOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9UX0VRVUFMX1RPID0gIk5PVF9FUVVBTF9UTyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBHUkVBVEVSX1RIQU4gPSAiR1JFQVRFUl9USEFOIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExFU1NfVEhBTiA9ICJMRVNTX1RIQU4iOworCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL1Byb2R1Y3ROYW1lQ2hlY2tDb21wYXJhdG9yLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL1Byb2R1Y3ROYW1lQ2hlY2tDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkYjRjMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvUHJvZHVjdE5hbWVDaGVja0NvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLlByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLkV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuUHJlQ29uZGl0aW9uQ29tcGFyYXRvcjsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBQcmVjb25kaXRpb24gY2xhc3MgdGhhdCBjaGVja3MgdGhlIHByb2R1Y3QgbmFtZSAoaS5lLiB0aGUgZGlyZWN0b3J5IG5hbWUpCisgKiB2ZXJzdXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZWZpbmVkIGJ5IHRoZSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlICJQTkNfUkVHRVgiLgorICogCisgKiBAYXV0aG9yIEx1Y2EgQ2lucXVpbmkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0TmFtZUNoZWNrQ29tcGFyYXRvciBleHRlbmRzIFByZUNvbmRpdGlvbkNvbXBhcmF0b3I8Qm9vbGVhbj4geworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvci5jbGFzcy5nZXROYW1lKCkpOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQTkNfUkVHRVggPSAiUE5DX1JFR0VYIjsKKwkKKwlwcml2YXRlIGZpbmFsIFBhdHRlcm4gcGF0dGVybjsKKwkKKwlwdWJsaWMgUHJvZHVjdE5hbWVDaGVja0NvbXBhcmF0b3IoKSB7CisJCQorCQlTdHJpbmcgcmVnZXggPSBTeXN0ZW0uZ2V0ZW52KFBOQ19SRUdFWCk7CisJCWlmICghU3RyaW5nVXRpbHMuaGFzVGV4dChyZWdleCkpIHsKKwkJCXJlZ2V4ID0gIi4qIjsgLy8gZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBldmVyeXRoaW5nCisJCX0KKwkJcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShyZWdleCk7CisJfQorCQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGludCBwZXJmb3JtQ2hlY2soRmlsZSBwcm9kdWN0LCBCb29sZWFuIGNvbXBhcmVJdGVtKSB0aHJvd3MgUHJlY29uZGl0aW9uQ29tcGFyYXRvckV4Y2VwdGlvbiB7CisJCQorCQlMT0cubG9nKExldmVsLkZJTkVTVCwgIkNvbXBhcmluZyBwcm9kdWN0OiAiK3Byb2R1Y3QuZ2V0TmFtZSgpKyIgdmVyc3VzIHJlZ2V4OiAiK3BhdHRlcm4udG9TdHJpbmcoKSk7CisJCQorCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIocHJvZHVjdC5nZXROYW1lKCkpOworCQlpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKwkJCUxPRy5sb2coTGV2ZWwuRklORVNULCAiUHJvZHVjdDogIitwcm9kdWN0LmdldE5hbWUoKSsiIHBhc3NlcyAncmVnZXgnIGNoZWNrOiAiK3BhdHRlcm4udG9TdHJpbmcoKSk7CisJCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSkuY29tcGFyZVRvKGNvbXBhcmVJdGVtKTsKKwkJfSBlbHNlIHsKKworCQkJTE9HLmxvZyhMZXZlbC5GSU5FU1QsICJQcm9kdWN0OiAiK3Byb2R1Y3QuZ2V0TmFtZSgpKyIgZmFpbGVkICdyZWdleCcgY2hlY2s6ICIrcGF0dGVybi50b1N0cmluZygpKTsKKwkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSkuY29tcGFyZVRvKGNvbXBhcmVJdGVtKTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL1N1YlByb2R1Y3RFeGlzdGVuY2VDaGVja0NvbXBhcmF0b3IuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvU3ViUHJvZHVjdEV4aXN0ZW5jZUNoZWNrQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmZkMWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9wcmVjb25kaXRpb25zL1N1YlByb2R1Y3RFeGlzdGVuY2VDaGVja0NvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leGNlcHRpb25zLlByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgUHJlQ29uZGl0aW9uQ29tcGFyYXRvcn0gdGhhdCBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gYXJiaXRyYXJ5IGZpbGUgKGEgInN1Yi1wcm9kdWN0IikgCisgKiB3aXRoaW4gdGhlIHByb2R1Y3QgZGlyZWN0b3J5LgorICogSWYgdGhlIHByb2R1Y3QgaXMgbm90IGEgZGlyZWN0b3J5LCBvciB0aGUgZmlsZVBhdGggZmllbGQgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBjbGFzcyBiZWhhdmVzCisgKiBleGFjdGx5IGxpa2UgdGhlIHN1cGVyY2xhc3Mge0BsaW5rIEV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvcn0uCisgKiAKKyAqIEBhdXRob3IgbHVjYSAoTHVjYSBDaW5xdWluaSkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJQcm9kdWN0RXhpc3RlbmNlQ2hlY2tDb21wYXJhdG9yIGV4dGVuZHMKKwkJRXhpc3RhbmNlQ2hlY2tDb21wYXJhdG9yIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihFeGlzdGFuY2VDaGVja0NvbXBhcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlUGF0aDsKKworCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7CisJCXJldHVybiBmaWxlUGF0aDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBzdWItcHJvZHVjdCBmaWxlIHBhdGggKG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHByb2R1Y3QgYWJzb2x1dGUgcGF0aCkuCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsZVBhdGgoU3RyaW5nIGZpbGVQYXRoKSB7CisJCXRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aDsKKwl9CisJCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBwZXJmb3JtQ2hlY2soRmlsZSBwcm9kdWN0LCBCb29sZWFuIGNvbXBhcmVJdGVtKQorICAgICAgICAgICAgdGhyb3dzIFByZWNvbmRpdGlvbkNvbXBhcmF0b3JFeGNlcHRpb24geworICAgIAkKKyAgICAJaWYgKHByb2R1Y3QuaXNEaXJlY3RvcnkoKSAmJiBmaWxlUGF0aCE9bnVsbCkgeworICAgIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUocHJvZHVjdC5nZXRBYnNvbHV0ZVBhdGgoKSsiLyIrZmlsZVBhdGgpOworICAgIAkJTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ2hlY2tpbmcgZXhpc3RlbmNlIG9mIGZpbGU9IitmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAJCXJldHVybiBuZXcgQm9vbGVhbihmaWxlLmV4aXN0cygpKS5jb21wYXJlVG8oY29tcGFyZUl0ZW0pOworICAgIAl9IGVsc2UgeworICAgIAkJcmV0dXJuIG5ldyBCb29sZWFuKHByb2R1Y3QuZXhpc3RzKCkpLmNvbXBhcmVUbyhjb21wYXJlSXRlbSk7CisgICAgCX0KKyAgICB9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL0dlbmVyaWNNZXRhZGF0YU9iamVjdEZhY3RvcnkuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3V0aWwvR2VuZXJpY01ldGFkYXRhT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDNhNzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL0dlbmVyaWNNZXRhZGF0YU9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBnZW5lcmljIG9iamVjdCBmYWN0b3J5IGZvciBNZXRhZGF0YSBmcmFtZXdvcmsgb2JqZWN0cy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljTWV0YWRhdGFPYmplY3RGYWN0b3J5IHsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEdlbmVyaWNNZXRhZGF0YU9iamVjdEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgc3RhdGljIE1ldEV4dHJhY3RvciBnZXRNZXRFeHRyYWN0b3JGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICBDbGFzcyBtZXRFeHRyYWN0b3JDbGFzcyA9IG51bGw7CisgICAgTWV0RXh0cmFjdG9yIGV4dHJhY3RvciA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgbWV0RXh0cmFjdG9yQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICBleHRyYWN0b3IgPSAoTWV0RXh0cmFjdG9yKSBtZXRFeHRyYWN0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgcmV0dXJuIGV4dHJhY3RvcjsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1ldCBleHRyYWN0b3IgY2xhc3MgIgorICAgICAgICAgICAgICArIGNsYXNzTmFtZSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1ldCBleHRyYWN0b3IgY2xhc3MgIgorICAgICAgICAgICAgICArIGNsYXNzTmFtZSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1ldCBleHRyYWN0b3IgY2xhc3MgIgorICAgICAgICAgICAgICArIGNsYXNzTmFtZSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL01pbWVUeXBlVXRpbHMuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3V0aWwvTWltZVR5cGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YTY5NDYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL01pbWVUeXBlVXRpbHMuamF2YQpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EuVGlrYTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EuZGV0ZWN0LkRlZmF1bHREZXRlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NZWRpYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlc0ZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiAKKyAqIDxwPgorICogVGhpcyBpcyBhIGZhY2FkZSBjbGFzcyB0byBpbnN1bGF0ZSBDQVMgTWV0YWRhdGEgZnJvbSBpdHMgdW5kZXJseWluZyBNaW1lIFR5cGUKKyAqIHN1YnN0cmF0ZSBsaWJyYXJ5LCA8YSBocmVmPSJodHRwOi8vdGlrYS5hcGFjaGUub3JnLyI+QXBhY2hlIFRpa2E8L2E+LgorICogQW55IG1pbWUgaGFuZGxpbmcgY29kZSBzaG91bGQgYmUgcGxhY2VkIGluIHRoaXMgdXRpbGl0eSBjbGFzcywgYW5kIGhpZGRlbgorICogZnJvbSB0aGUgQ0FTIE1ldGFkYXRhIGNsYXNzZXMgdGhhdCByZWx5IG9uIGl0LgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWltZVR5cGVVdGlscyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIjsiOworCisgICAgLyogb3VyIFRpa2EgbWltZSB0eXBlIHJlZ2lzdHJ5ICovCisgICAgcHJpdmF0ZSBNaW1lVHlwZXMgbWltZVR5cGVzOworCisgICAgcHJpdmF0ZSBUaWthIHRpa2E7CisKKyAgICAvKiB3aGV0aGVyIG9yIG5vdCBtYWdpYyBzaG91bGQgYmUgZW1wbG95ZWQgb3Igbm90ICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1pbWVNYWdpYzsKKworICAgIC8qIHN0YXRpYyByZXNvdXJjZSBwYXRoIGZvciB0aGUgbWltZVR5cGVzRmlsZSAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfRklMRV9SRVNfUEFUSCA9ICJ0aWthLW1pbWV0eXBlcy54bWwiOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihNaW1lVHlwZVV0aWxzLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBNaW1lVHlwZVV0aWxzKCkgeworICAgICAgICB0aGlzKE1pbWVUeXBlVXRpbHMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShNSU1FX0ZJTEVfUkVTX1BBVEgpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWltZVR5cGVVdGlscyhTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0aGlzKGZpbGVQYXRoLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWltZVR5cGVVdGlscyhTdHJpbmcgZmlsZVBhdGgsIGJvb2xlYW4gbWFnaWMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSwgbWFnaWMpOworICAgIH0KKworICAgIHB1YmxpYyBNaW1lVHlwZVV0aWxzKElucHV0U3RyZWFtIG1pbWVJcywgYm9vbGVhbiBtYWdpYykgeworICAgIAl0cnkgeworICAgIAkJdGhpcy5taW1lVHlwZXMgPSBNaW1lVHlwZXNGYWN0b3J5LmNyZWF0ZShtaW1lSXMpOworICAgIAkJdGhpcy5taW1lTWFnaWMgPSBtYWdpYzsKKyAgICAJCXRoaXMudGlrYSA9IG5ldyBUaWthKG5ldyBEZWZhdWx0RGV0ZWN0b3IodGhpcy5taW1lVHlwZXMpKTsKKyAgICAJfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgIAkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gbG9hZCBNaW1lVHlwZSBSZWdpc3RyeSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhbnMgYSB7QGxpbmsgTWltZVR5cGV9IG5hbWUgYnkgcmVtb3Zpbmcgb3V0IHRoZSBhY3R1YWwKKyAgICAgKiB7QGxpbmsgTWltZVR5cGV9LCBmcm9tIGEgc3RyaW5nIG9mIHRoZSBmb3JtOgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogICAgICAgICAgICZsdDtwcmltYXJ5IHR5cGUmZ3Q7LyZsdDtzdWIgdHlwZSZndDsgOyAmbHQ7IG9wdGlvbmFsIHBhcmFtcworICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcmlnVHlwZQorICAgICAqICAgICAgICAgICAgVGhlIG9yaWdpbmFsIG1pbWUgdHlwZSBzdHJpbmcgdG8gYmUgY2xlYW5lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBwcmltYXJ5IHR5cGUsIGFuZCBzdWJ0eXBlLCBjb25jYXRlbmF0ZWQsIGUuZy4sIHRoZSBhY3R1YWwKKyAgICAgKiAgICAgICAgIG1pbWUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhbk1pbWVUeXBlKFN0cmluZyBvcmlnVHlwZSkgeworICAgICAgICBpZiAob3JpZ1R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHRha2UgdGhlIG9yaWdUeXBlIGFuZCBzcGxpdCBpdCBvbiAnOycKKyAgICAgICAgU3RyaW5nW10gdG9rZW5pemVkTWltZVR5cGUgPSBvcmlnVHlwZS5zcGxpdChTRVBBUkFUT1IpOworICAgICAgICBpZiAodG9rZW5pemVkTWltZVR5cGUubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgLy8gdGhlcmUgd2FzIGEgJzsnIGluIHRoZXJlLCB0YWtlIHRoZSBmaXJzdCB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHRva2VuaXplZE1pbWVUeXBlWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhlcmUgd2Fzbid0IGEgJzsnLCBzbyBqdXN0IHJldHVybiB0aGUgb3JpZyB0eXBlCisgICAgICAgICAgICByZXR1cm4gb3JpZ1R5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjYXV0b1Jlc29sdmVDb250ZW50VHlwZShTdHJpbmcsIFN0cmluZywgYnl0ZVtdKX0sIGJ1dAorICAgICAqIHRoaXMgbWV0aG9kIHBhc3NlcyA8Y29kZT5udWxsPC9jb2RlPiBhcyB0aGUgaW5pdGlhbCB0eXBlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmwKKyAgICAgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgVVJMIHRvIHVzZSB0byBjaGVjayBnbG9iIHBhdHRlcm5zLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICBUaGUgYnl0ZSBkYXRhIHRvIHBvdGVudGlhbGx5IHVzZSBpbiBtYWdpYyBkZXRlY3Rpb24uCisgICAgICogQHJldHVybiBUaGUgU3RyaW5nIHtAbGluayBNaW1lVHlwZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhdXRvUmVzb2x2ZUNvbnRlbnRUeXBlKFN0cmluZyB1cmwsIGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIHJldHVybiBhdXRvUmVzb2x2ZUNvbnRlbnRUeXBlKG51bGwsIHVybCwgZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYWNhZGUgaW50ZXJmYWNlIHRvIHRyeWluZyBhbGwgdGhlIHBvc3NpYmxlIG1pbWUgdHlwZSByZXNvbHV0aW9uCisgICAgICogc3RyYXRlZ2llcyBhdmFpbGFibGUgd2l0aGluIFRpa2EuIEZpcnN0LCB0aGUgbWltZSB0eXBlIHByb3ZpZGVkIGluCisgICAgICogPGNvZGU+dHlwZU5hbWU8L2NvZGU+IGlzIGNsZWFuZWQsIHdpdGgge0BsaW5rICNjbGVhbk1pbWVUeXBlKFN0cmluZyl9LgorICAgICAqIFRoZW4gdGhlIGNsZWFuZWQgbWltZSB0eXBlIGlzIGxvb2tlZCB1cCBpbiB0aGUgdW5kZXJseWluZyBUaWthCisgICAgICoge0BsaW5rIE1pbWVUeXBlc30gcmVnaXN0cnksIGJ5IGl0cyBjbGVhbmVkIG5hbWUuIElmIHRoZSB7QGxpbmsgTWltZVR5cGV9CisgICAgICogaXMgZm91bmQsIHRoZW4gdGhhdCBtaW1lIHR5cGUgaXMgdXNlZCwgb3RoZXJ3aXNlIHtAbGluayBVUkx9IHJlc29sdXRpb24KKyAgICAgKiBpcyB1c2VkIHRvIHRyeSBhbmQgZGV0ZXJtaW5lIHRoZSBtaW1lIHR5cGUuIElmIHRoYXQgbWVhbnMgaXMKKyAgICAgKiB1bnN1Y2Nlc3NmdWwsIGFuZCBpZiA8Y29kZT5taW1lLnR5cGUubWFnaWM8L2NvZGU+IGlzIGVuYWJsZWQgaW4KKyAgICAgKiB7QGxpbmsgTnV0Y2hDb25maWd1cmF0aW9ufSwgdGhlbiBtaW1lIHR5cGUgbWFnaWMgcmVzb2x1dGlvbiBpcyB1c2VkIHRvCisgICAgICogdHJ5IGFuZCBvYnRhaW4gYSBiZXR0ZXItdGhhbi10aGUtZGVmYXVsdCBhcHByb3hpbWF0aW9uIG9mIHRoZQorICAgICAqIHtAbGluayBNaW1lVHlwZX0uCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGVOYW1lCisgICAgICogICAgICAgICAgICBUaGUgb3JpZ2luYWwgbWltZSB0eXBlLCByZXR1cm5lZCBmcm9tIGEge0BsaW5rIFByb3RvY29sT3V0cHV0fS4KKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogICAgICAgICAgICBUaGUgZ2l2ZW4ge0BsaW5rIFVSTH0sIHRoYXQgTnV0Y2ggd2FzIHRyeWluZyB0byBjcmF3bC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgVGhlIGJ5dGUgZGF0YSwgcmV0dXJuZWQgZnJvbSB0aGUgY3Jhd2wsIGlmIGFueS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjb3JyZWN0bHksIGF1dG9tYXRpY2FsbHkgZ3Vlc3NlZCB7QGxpbmsgTWltZVR5cGV9IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhdXRvUmVzb2x2ZUNvbnRlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHVybCwKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIE1pbWVUeXBlIHR5cGUgPSBudWxsOworICAgICAgICBTdHJpbmcgY2xlYW5lZE1pbWVUeXBlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xlYW5lZE1pbWVUeXBlID0gTWltZVR5cGVVdGlscy5jbGVhbk1pbWVUeXBlKHR5cGVOYW1lKSAhPSBudWxsID8gdGhpcy5taW1lVHlwZXMKKyAgICAgICAgICAgICAgICAgICAgLmZvck5hbWUoTWltZVR5cGVVdGlscy5jbGVhbk1pbWVUeXBlKHR5cGVOYW1lKSkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDogbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoTWltZVR5cGVFeGNlcHRpb24gbXRlKSB7CisgICAgICAgICAgICAvLyBTZWVtcyB0byBiZSBhIG1hbGZvcm1lZCBtaW1lIHR5cGUgbmFtZS4uLgorICAgICAgICB9CisKKyAgICAgICAgLy8gZmlyc3QgdHJ5IHRvIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBjbGVhbmVkIHR5cGUgbmFtZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdHlwZSA9IGNsZWFuZWRNaW1lVHlwZSAhPSBudWxsID8gdGhpcy5taW1lVHlwZXMKKyAgICAgICAgICAgICAgICAgICAgLmZvck5hbWUoY2xlYW5lZE1pbWVUeXBlKSA6IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKE1pbWVUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHR5cGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgcmV0dXJuZWQgbnVsbCwgb3IgaWYgaXQncyB0aGUgZGVmYXVsdCB0eXBlIHRoZW4gdHJ5IHVybCByZXNvbHV0aW9uCisgICAgICAgIGlmICh0eXBlID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAodHlwZS5nZXROYW1lKCkuZXF1YWxzKE1pbWVUeXBlcy5PQ1RFVF9TVFJFQU0pKSkgeworICAgICAgICAgICAgLy8gSWYgbm8gbWltZS10eXBlIGhlYWRlciwgb3IgY2Fubm90IGZpbmQgYSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIC8vIG1pbWUtdHlwZSwgdGhlbiBndWVzcyBhIG1pbWUtdHlwZSBmcm9tIHRoZSB1cmwgcGF0dGVybgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0eXBlID0gbWltZVR5cGVzLmZvck5hbWUodGlrYS5kZXRlY3QodXJsKSkgIT0gbnVsbCA/IG1pbWVUeXBlcy5mb3JOYW1lKHRpa2EuZGV0ZWN0KHVybCkpIDogdHlwZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gTWltZVR5cGVFeGNlcHRpb24gb3IgSU9FeGNlcHRpb24gZnJvbSB0aWthLmRldGVjdC4gSWdub3JlLgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbWFnaWMgaXMgZW5hYmxlZCB1c2UgbWltZSBtYWdpYyB0byBndWVzcyBpZiB0aGUgbWltZSB0eXBlIHJldHVybmVkCisgICAgICAgIC8vIGZyb20gdGhlIG1hZ2ljIGd1ZXNzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgdGhhdCdzIGFscmVhZHkgc2V0IHNvCisgICAgICAgIC8vIGZhcgorICAgICAgICAvLyBpZiBpdCBpcywgYW5kIGl0J3Mgbm90IHRoZSBkZWZhdWx0IG1pbWUgdHlwZSwgdGhlbiBnbyB3aXRoIHRoZSBtaW1lCisgICAgICAgIC8vIHR5cGUKKyAgICAgICAgLy8gcmV0dXJuZWQgYnkgdGhlIG1hZ2ljCisgICAgICAgIGlmICh0aGlzLm1pbWVNYWdpYykgeworICAgICAgICAgICAgTWltZVR5cGUgbWFnaWNUeXBlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYWdpY1R5cGUgPSAgbWltZVR5cGVzLmZvck5hbWUodGlrYS5kZXRlY3QoZGF0YSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBtYWdpY1R5cGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hZ2ljVHlwZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICFtYWdpY1R5cGUuZ2V0TmFtZSgpLmVxdWFscyhNaW1lVHlwZXMuT0NURVRfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgIXR5cGUuZ2V0TmFtZSgpLmVxdWFscyhtYWdpY1R5cGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIC8vIElmIG1hZ2ljIGVuYWJsZWQgYW5kIHRoZSBjdXJyZW50IG1pbWUgdHlwZSBkaWZmZXJzIGZyb20gdGhhdAorICAgICAgICAgICAgICAgIC8vIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIG9uZSByZXR1cm5lZCBmcm9tIHRoZSBtYWdpYywgdGFrZSB0aGUgbWFnaWMgbWltZVR5cGUKKyAgICAgICAgICAgICAgICB0eXBlID0gbWFnaWNUeXBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0eXBlIGlzIFNUSUxMIG51bGwgYWZ0ZXIgYWxsIHRoZSByZXNvbHV0aW9uIHN0cmF0ZWdpZXMsIGdvIGZvcgorICAgICAgICAgICAgLy8gdGhlCisgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gdGhpcy5taW1lVHlwZXMuZm9yTmFtZShNaW1lVHlwZXMuT0NURVRfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY2FkZSBpbnRlcmZhY2UgdG8gVGlrYSdzIHVuZGVybHlpbmcKKyAgICAgKiB7QGxpbmsgdGlrYS5kZXRlY3QoU3RyaW5nKX0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHVybAorICAgICAqICAgICAgICAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvY3VtZW50IHtAbGluayBVUkx9IHRvIHNlbnNlCisgICAgICogICAgICAgICAgICB0aGUge0BsaW5rIE1pbWVUeXBlfSBmb3IuCisgICAgICogQHJldHVybiBBbiBhcHByb3ByaWF0ZSB7QGxpbmsgTWltZVR5cGV9LCBpZGVudGlmaWVkIGZyb20gdGhlIGdpdmVuCisgICAgICogICAgICAgICBEb2N1bWVudCB1cmwgaW4gc3RyaW5nIGZvcm0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShVUkwgdXJsKSB7CisgICAgICAgIHRyeSB7CisgICAgCSAgICByZXR1cm4gdGlrYS5kZXRlY3QodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYWNhZGUgaW50ZXJmYWNlIHRvIFRpa2EncyB1bmRlcmx5aW5nIHtAbGluayBvcmcuYXBhY2hlLnRpa2EudGlrYS5kZXRlY3QoU3RyaW5nKX0KKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgYSB2YWxpZCB7QGxpbmsgTWltZVR5cGV9IGluIHRoZSBUaWthIG1pbWUKKyAgICAgKiAgICAgICAgICAgIHJlZ2lzdHJ5LgorICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1pbWVUeXBlfSwgaWYgaXQgZXhpc3RzLAorICAgICAqICAgICAgICAgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRpa2EuZGV0ZWN0KG5hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjYWRlIGludGVyZmFjZSB0byBUaWthJ3MgdW5kZXJseWluZyB7QGxpbmsgb3JnLmFwYWNoZS50aWthLlRpa2EjZGV0ZWN0KEZpbGUpfQorICAgICAqIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIEZpbGV9IHRvIHNlbnNlIHRoZSB7QGxpbmsgTWltZVR5cGV9IGZvci4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTWltZVR5cGV9IG9mIHRoZSBnaXZlbiB7QGxpbmsgRmlsZX0sIG9yIG51bGwgaWYgaXQKKyAgICAgKiAgICAgICAgIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoRmlsZSBmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdGlrYS5kZXRlY3QoZik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGFjdCBhcyBhIGZhY2FkZSB0bworICAgICAqIHtAbGluayBNaW1lVHlwZXMjZ2V0TWltZVR5cGUoYnl0ZVtdKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgVGhlIGJ5dGUgZGF0YSB0byBnZXQgdGhlIHtAbGluayBNaW1lVHlwZX0gZm9yLgorICAgICAqIEByZXR1cm4gVGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzb2x2ZWQge0BsaW5rIE1pbWVUeXBlfSwgb3IKKyAgICAgKiAgICAgICAgIG51bGwgaWYgYSBzdWl0YWJsZSB7QGxpbmsgTWltZVR5cGV9IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlQnlNYWdpYyhieXRlW10gZGF0YSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRpa2EuZGV0ZWN0KGRhdGEpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbkZvck1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgIAl0cnkgeworICAgIAkJcmV0dXJuIHRoaXMubWltZVR5cGVzLmZvck5hbWUobWltZVR5cGUpLmdldERlc2NyaXB0aW9uKCk7CisgICAgCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkZhaWxlZCB0byBnZXQgZGVzY3JpcHRpb24gZm9yIG1pbWV0eXBlICIgCisgICAgCQkJCSsgbWltZVR5cGUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAJCXJldHVybiBudWxsOworICAgIAl9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdXBlclR5cGVGb3JNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAJdHJ5IHsKKyAgICAJCU1lZGlhVHlwZSBtZWRpYVR5cGUgPSB0aGlzLm1pbWVUeXBlcy5nZXRNZWRpYVR5cGVSZWdpc3RyeSgpLmdldFN1cGVydHlwZSh0aGlzLm1pbWVUeXBlcy5mb3JOYW1lKG1pbWVUeXBlKS5nZXRUeXBlKCkpOworICAgIAkJaWYgKG1lZGlhVHlwZSAhPSBudWxsKQorICAgIAkJCXJldHVybiBtZWRpYVR5cGUuZ2V0VHlwZSgpICsgIi8iICsgbWVkaWFUeXBlLmdldFN1YnR5cGUoKTsKKyAgICAJCWVsc2UKKyAgICAJCQlyZXR1cm4gbnVsbDsKKyAgICAJfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgIAkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGdldCBzdXBlci10eXBlIGZvciBtaW1ldHlwZSAiIAorICAgIAkJCQkrIG1pbWVUeXBlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgCQlyZXR1cm4gbnVsbDsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW1lTWFnaWMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01pbWVNYWdpYygpIHsKKyAgICAgICAgcmV0dXJuIG1pbWVNYWdpYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWltZU1hZ2ljIHRoZSBtaW1lTWFnaWMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWltZU1hZ2ljKGJvb2xlYW4gbWltZU1hZ2ljKSB7CisgICAgICAgIHRoaXMubWltZU1hZ2ljID0gbWltZU1hZ2ljOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkTWFnaWNIZWFkZXIoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIAlyZXR1cm4gcmVhZE1hZ2ljSGVhZGVyKHN0cmVhbSwgMTAyNCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRNYWdpY0hlYWRlcihJbnB1dFN0cmVhbSBzdHJlYW0sIGludCBoZWFkZXJCeXRlU2l6ZSkgCisgICAgCQl0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklucHV0U3RyZWFtIGlzIG1pc3NpbmciKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2hlYWRlckJ5dGVTaXplXTsKKyAgICAgICAgaW50IHRvdGFsUmVhZCA9IDA7CisKKyAgICAgICAgaW50IGxhc3RSZWFkID0gc3RyZWFtLnJlYWQoYnl0ZXMpOworICAgICAgICB3aGlsZSAobGFzdFJlYWQgIT0gLTEpIHsKKyAgICAgICAgICAgIHRvdGFsUmVhZCArPSBsYXN0UmVhZDsKKyAgICAgICAgICAgIGlmICh0b3RhbFJlYWQgPT0gYnl0ZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdFJlYWQgPSBzdHJlYW0ucmVhZChieXRlcywgdG90YWxSZWFkLCBieXRlcy5sZW5ndGggLSB0b3RhbFJlYWQpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIHNob3J0ZXIgPSBuZXcgYnl0ZVt0b3RhbFJlYWRdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBzaG9ydGVyLCAwLCB0b3RhbFJlYWQpOworICAgICAgICByZXR1cm4gc2hvcnRlcjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3V0aWwvUGF0aFV0aWxzLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1BhdGhVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjU4NmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1BhdGhVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvLyRJZCQKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYy5FbnZVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIFV0aWxpdHkgY2xhc3MgZm9yIHJlcGxhY2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIG1hbml1cGxhdGluZyBmaWxlCisgKiBwYXRoIHN0cmluZ3MuCisgKiA8L3A+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGF0aFV0aWxzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFTElNSVRFUiA9ICIsIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VFbnZWYXJpYWJsZXMoU3RyaW5nIG9yaWdQYXRoKSB7CisgICAgICAgIHJldHVybiByZXBsYWNlRW52VmFyaWFibGVzKG9yaWdQYXRoLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRW52VmFyaWFibGVzKFN0cmluZyBvcmlnUGF0aCwgTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2VFbnZWYXJpYWJsZXMob3JpZ1BhdGgsIG1ldGFkYXRhLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUVudlZhcmlhYmxlcyhTdHJpbmcgb3JpZ1BhdGgsCisgICAgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiBleHBhbmQpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGZpbmFsUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWdQYXRoLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChvcmlnUGF0aC5jaGFyQXQoaSkgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgVmFyRGF0YSBkYXRhID0gcmVhZEVudlZhck5hbWUob3JpZ1BhdGgsIGkpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtZXRhZGF0YS5nZXRNZXRhZGF0YShkYXRhLmdldEZpZWxkTmFtZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3QgdmFsTGlzdCA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGRhdGEuZ2V0RmllbGROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB2YXIgPSAoU3RyaW5nKSB2YWxMaXN0LmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgdmFsTGlzdC5zaXplKCk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgKz0gREVMSU1JVEVSICsgKFN0cmluZykgdmFsTGlzdC5nZXQoaik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyID0gRW52VXRpbGl0aWVzLmdldEVudihkYXRhLmdldEZpZWxkTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxQYXRoLmFwcGVuZCh2YXIpOworICAgICAgICAgICAgICAgIGkgPSBkYXRhLmdldEVuZElkeCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbFBhdGguYXBwZW5kKG9yaWdQYXRoLmNoYXJBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmluYWxQYXRoLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZG9EeW5hbWljUmVwbGFjZW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkb0R5bmFtaWNSZXBsYWNlbWVudChzdHJpbmcsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvRHluYW1pY1JlcGxhY2VtZW50KFN0cmluZyBzdHJpbmcsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhkb0R5bmFtaWNEYXRlUmVwbGFjZW1lbnQoCisgICAgICAgIAkJICAgZG9EeW5hbWljRGF0ZVJvbGxSZXBsYWNlbWVudCgKKyAgICAgICAgCQkJICAgZG9EeW5hbWljRGF0ZUZvcm1hdFJlcGxhY2VtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9EeW5hbWljVXRjVG9UYWlEYXRlUmVwbGFjZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9EeW5hbWljRGF0ZVRvU2Vjc1JlcGxhY2VtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0R5bmFtaWNEYXRlVG9NaWxsaXNSZXBsYWNlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgbWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKSwKKyAgICAgICAgICAgICAgIG1ldGFkYXRhLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkb0R5bmFtaWNEYXRlUmVwbGFjZW1lbnQoU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0dGVybiBkYXRlUGF0dGVybiA9IFBhdHRlcm4KKyAgICAgICAgICAgICAgICAuY29tcGlsZSgiXFxbXFxzKkRBVEVcXHMqKD86WystXXsxfVteXFwuXXsxLH0/KXswLDF9XFwuXFxzKig/Oig/OkRBWSl8KD86TU9OVEgpfCg/OllFQVIpfCg/OlVUQyl8KD86VEFJKSl7MX1cXHMqXFxdIik7CisgICAgICAgIE1hdGNoZXIgZGF0ZU1hdGNoZXIgPSBkYXRlUGF0dGVybi5tYXRjaGVyKHN0cmluZyk7CisgICAgICAgIHdoaWxlIChkYXRlTWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRlU3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhkYXRlTWF0Y2hlci5zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICBkYXRlTWF0Y2hlci5lbmQoKSk7CisgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworCisgICAgICAgICAgICAvLyByb2xsIHRoZSBkYXRlIGlmIHJvbGwgZGF5cyB3YXMgc3BlY2ZpZWQKKyAgICAgICAgICAgIGludCBwbHVzTWludXNJbmRleDsKKyAgICAgICAgICAgIGlmICgocGx1c01pbnVzSW5kZXggPSBkYXRlU3RyaW5nLmluZGV4T2YoJy0nKSkgIT0gLTEKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBsdXNNaW51c0luZGV4ID0gZGF0ZVN0cmluZy5pbmRleE9mKCcrJykpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaW50IGRvdEluZGV4OworICAgICAgICAgICAgICAgIGlmICgoZG90SW5kZXggPSBkYXRlU3RyaW5nLmluZGV4T2YoJy4nLCBwbHVzTWludXNJbmRleCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGludCByb2xsRGF5cyA9IEludGVnZXIucGFyc2VJbnQoUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU3RyaW5nLnN1YnN0cmluZyhwbHVzTWludXNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90SW5kZXgpLCBtZXRhZGF0YSkucmVwbGFjZUFsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbXFwrXFxzXSIsICIiKSk7CisgICAgICAgICAgICAgICAgICAgIGdjLmFkZChHcmVnb3JpYW5DYWxlbmRhci5EQVlfT0ZfWUVBUiwgcm9sbERheXMpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWxmb3JtZWQgZHluYW1pYyBkYXRlIHJlcGxhY2VtZW50IHNwZWNpZmllZCAobm8gZG90IHNlcGFyYXRvcikgLSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRlU3RyaW5nICsgIiciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHR5cGUgYW5kIG1ha2UgdGhlIGFwcHJvcHJpYXRlIHJlcGxhY2VtZW50CisgICAgICAgICAgICBTdHJpbmdbXSBzcGxpdERhdGUgPSBkYXRlU3RyaW5nLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgIGlmIChzcGxpdERhdGUubGVuZ3RoIDwgMikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBkYXRlIHR5cGUgc3BlY2lmaWVkIC0gJyIgKyBkYXRlU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICArICInIik7CisgICAgICAgICAgICBTdHJpbmcgZGF0ZVR5cGUgPSBzcGxpdERhdGVbMV0ucmVwbGFjZUFsbCgiW1xcW1xcXVxcc10iLCAiIik7CisgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnQgPSAiIjsKKyAgICAgICAgICAgIGlmIChkYXRlVHlwZS5lcXVhbHMoIkRBWSIpKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBTdHJpbmdVdGlscy5sZWZ0UGFkKGdjCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEdyZWdvcmlhbkNhbGVuZGFyLkRBWV9PRl9NT05USCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiIsIDIsICIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGVUeXBlLmVxdWFscygiTU9OVEgiKSkgeworICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gU3RyaW5nVXRpbHMubGVmdFBhZCgoZ2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuTU9OVEgpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiIsIDIsICIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGVUeXBlLmVxdWFscygiWUVBUiIpKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBnYy5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuWUVBUikgKyAiIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0ZVR5cGUuZXF1YWxzKCJVVEMiKSkgeworICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gRGF0ZVV0aWxzLnRvU3RyaW5nKERhdGVVdGlscy50b1V0YyhnYykpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlVHlwZS5lcXVhbHMoIlRBSSIpKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBEYXRlVXRpbHMudG9TdHJpbmcoRGF0ZVV0aWxzLnRvVGFpKGdjKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgZGF0ZSB0eXBlIHNwZWNpZmllZCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRlU3RyaW5nICsgIiciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nID0gU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmcsIGRhdGVTdHJpbmcsIHJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIGRhdGVNYXRjaGVyID0gZGF0ZVBhdHRlcm4ubWF0Y2hlcihzdHJpbmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXNhZ2UgZm9ybWF0OiBbREFURV9BREQoPGRhdGU+LDxkYXRlLWZvcm1hdD4sPGFkZC1hbW91bnQ+LDxociB8IG1pbiB8IHNlYyB8IGRheSB8IG1vIHwgeXI+KV0KKyAgICAgKiBleGFtcGxlOiBbREFURV9BREQoMjAwOS0xMi0zMSwgeXl5eS1NTS1kZCwgMSwgZGF5KV0gLiAuIC4gb3V0cHV0IHdpbGwgYmU6IDIwMTAtMDEtMDEKKyAgICAgKiAtIGR5bmFtaWMgcmVwbGFjZW1lbnQgaXMgYWxsb3dlZCBmb3IgdGhlIDxkYXRlPiBhcyB3ZWxsLCBmb3IgZXhhbXBsZTogCisgICAgICogIFtEQVRFX0FERChbREFURS5VVENdLCB5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onLCAxLCBkYXkpXSB3aWxsIGFkZCBvbmUgZGF5IHRvIHRoZSAKKyAgICAgKiAgY3VycmVudCBVVEMgdGltZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvRHluYW1pY0RhdGVSb2xsUmVwbGFjZW1lbnQoU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0dGVybiBkYXRlRm9ybWF0UGF0dGVybiA9IFBhdHRlcm4KKyAgICAgICAgICAgICAgICAuY29tcGlsZSgiXFxbXFxzKkRBVEVfQUREXFxzKlxcKC57MSx9PywuezEsfT8sLnsxLH0/LC57MSx9P1xcKVxccypcXF0iKTsKKyAgICAgICAgTWF0Y2hlciBkYXRlRm9ybWF0TWF0Y2hlciA9IGRhdGVGb3JtYXRQYXR0ZXJuLm1hdGNoZXIoc3RyaW5nKTsKKyAgICAgICAgd2hpbGUgKGRhdGVGb3JtYXRNYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGRhdGVGb3JtYXRTdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKGRhdGVGb3JtYXRNYXRjaGVyCisgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpLCBkYXRlRm9ybWF0TWF0Y2hlci5lbmQoKSk7CisKKyAgICAgICAgICAgIC8vIGdldCBhcmd1bWVudHMKKyAgICAgICAgICAgIE1hdGNoZXIgYXJnTWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiXFwoLipcXCkiKS5tYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0U3RyaW5nKTsKKyAgICAgICAgICAgIGFyZ01hdGNoZXIuZmluZCgpOworICAgICAgICAgICAgU3RyaW5nIGFyZ3NTdHJpbmcgPSBkYXRlRm9ybWF0U3RyaW5nLnN1YnN0cmluZyhhcmdNYXRjaGVyLnN0YXJ0KCkgKyAxLAorICAgICAgICAgICAgICAgICAgICBhcmdNYXRjaGVyLmVuZCgpIC0gMSk7IAorICAgICAgICAgICAgYXJnc1N0cmluZyA9IGRvRHluYW1pY1JlcGxhY2VtZW50KGFyZ3NTdHJpbmcsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBhcmdzU3RyaW5nLnNwbGl0KCIsIik7CisgICAgICAgICAgICBTdHJpbmcgZGF0ZVN0cmluZyA9IGFyZ3NbMF0udHJpbSgpOworICAgICAgICAgICAgZGF0ZVN0cmluZyA9IGRvRHluYW1pY1JlcGxhY2VtZW50KGRhdGVTdHJpbmcsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIFN0cmluZyBkYXRlRm9ybWF0ID0gYXJnc1sxXS50cmltKCk7CisgICAgICAgICAgICBpbnQgYWRkQW1vdW50ID0gSW50ZWdlci5wYXJzZUludChhcmdzWzJdLnRyaW0oKSk7CisgICAgICAgICAgICBTdHJpbmcgYWRkVW5pdHMgPSBhcmdzWzNdLnRyaW0oKS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICAvLyByZWZvcm1hdCBkYXRlCisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0KS5wYXJzZShkYXRlU3RyaW5nKTsKKyAgICAgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gKENhbGVuZGFyKSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmNsb25lKCk7CisgICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lKGRhdGUpOworICAgICAgICAgICAgaWYgKGFkZFVuaXRzLmVxdWFscygiaHIiKSB8fCBhZGRVbml0cy5lcXVhbHMoImhvdXIiKSkKKyAgICAgICAgICAgIAljYWxlbmRhci5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGFkZEFtb3VudCk7CisgICAgICAgICAgICBlbHNlIGlmIChhZGRVbml0cy5lcXVhbHMoIm1pbiIpIHx8IGFkZFVuaXRzLmVxdWFscygibWludXRlIikpCisgICAgICAgICAgICAJY2FsZW5kYXIuYWRkKENhbGVuZGFyLk1JTlVURSwgYWRkQW1vdW50KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGFkZFVuaXRzLmVxdWFscygic2VjIikgfHwgYWRkVW5pdHMuZXF1YWxzKCJzZWNvbmQiKSkKKyAgICAgICAgICAgIAljYWxlbmRhci5hZGQoQ2FsZW5kYXIuU0VDT05ELCBhZGRBbW91bnQpOworICAgICAgICAgICAgZWxzZSBpZiAoYWRkVW5pdHMuZXF1YWxzKCJkYXkiKSkKKyAgICAgICAgICAgIAljYWxlbmRhci5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIGFkZEFtb3VudCk7CisgICAgICAgICAgICBlbHNlIGlmIChhZGRVbml0cy5lcXVhbHMoIm1vIikgfHwgYWRkVW5pdHMuZXF1YWxzKCJtb250aCIpKQorICAgICAgICAgICAgCWNhbGVuZGFyLmFkZChDYWxlbmRhci5NT05USCwgYWRkQW1vdW50KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGFkZFVuaXRzLmVxdWFscygieXIiKSB8fCBhZGRVbml0cy5lcXVhbHMoInllYXIiKSkKKyAgICAgICAgICAgIAljYWxlbmRhci5hZGQoQ2FsZW5kYXIuWUVBUiwgYWRkQW1vdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIG5ld0RhdGVTdHJpbmcgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0KS5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc3dhcCBpbiBkYXRlIHN0cmluZworICAgICAgICAgICAgc3RyaW5nID0gU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmcsIGRhdGVGb3JtYXRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIG5ld0RhdGVTdHJpbmcpOworICAgICAgICAgICAgZGF0ZUZvcm1hdE1hdGNoZXIgPSBkYXRlRm9ybWF0UGF0dGVybi5tYXRjaGVyKHN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkb0R5bmFtaWNEYXRlRm9ybWF0UmVwbGFjZW1lbnQoU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0dGVybiBkYXRlRm9ybWF0UGF0dGVybiA9IFBhdHRlcm4KKyAgICAgICAgICAgICAgICAuY29tcGlsZSgiXFxbXFxzKkZPUk1BVFxccypcXCguezEsfT8sLnsxLH0/LC57MSx9P1xcKVxccypcXF0iKTsKKyAgICAgICAgTWF0Y2hlciBkYXRlRm9ybWF0TWF0Y2hlciA9IGRhdGVGb3JtYXRQYXR0ZXJuLm1hdGNoZXIoc3RyaW5nKTsKKyAgICAgICAgd2hpbGUgKGRhdGVGb3JtYXRNYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGRhdGVGb3JtYXRTdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKGRhdGVGb3JtYXRNYXRjaGVyCisgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpLCBkYXRlRm9ybWF0TWF0Y2hlci5lbmQoKSk7CisKKyAgICAgICAgICAgIC8vIGdldCBhcmd1bWVudHMKKyAgICAgICAgICAgIE1hdGNoZXIgYXJnTWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiXFwoLipcXCkiKS5tYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0U3RyaW5nKTsKKyAgICAgICAgICAgIGFyZ01hdGNoZXIuZmluZCgpOworICAgICAgICAgICAgU3RyaW5nIGFyZ3NTdHJpbmcgPSBkYXRlRm9ybWF0U3RyaW5nLnN1YnN0cmluZyhhcmdNYXRjaGVyLnN0YXJ0KCkgKyAxLAorICAgICAgICAgICAgICAgICAgICBhcmdNYXRjaGVyLmVuZCgpIC0gMSk7IAorICAgICAgICAgICAgYXJnc1N0cmluZyA9IGRvRHluYW1pY1JlcGxhY2VtZW50KGFyZ3NTdHJpbmcsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBhcmdzU3RyaW5nLnNwbGl0KCIsIik7CisgICAgICAgICAgICBTdHJpbmcgY3VyRm9ybWF0ID0gYXJnc1swXS50cmltKCk7CisgICAgICAgICAgICBTdHJpbmcgZGF0ZVN0cmluZyA9IGFyZ3NbMV0udHJpbSgpOworICAgICAgICAgICAgU3RyaW5nIG5ld0Zvcm1hdCA9IGFyZ3NbMl0udHJpbSgpOworCisgICAgICAgICAgICAvLyByZWZvcm1hdCBkYXRlCisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChjdXJGb3JtYXQpLnBhcnNlKGRhdGVTdHJpbmcpOworICAgICAgICAgICAgU3RyaW5nIG5ld0RhdGVTdHJpbmcgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChuZXdGb3JtYXQpLmZvcm1hdChkYXRlKTsKKworICAgICAgICAgICAgLy8gc3dhcCBpbiBkYXRlIHN0cmluZworICAgICAgICAgICAgc3RyaW5nID0gU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmcsIGRhdGVGb3JtYXRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIG5ld0RhdGVTdHJpbmcpOworICAgICAgICAgICAgZGF0ZUZvcm1hdE1hdGNoZXIgPSBkYXRlRm9ybWF0UGF0dGVybi5tYXRjaGVyKHN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyBTdHJpbmcgbWV0aG9kIG9mIGZvcm1hdCBbVVRDX1RPX1RBSSg8dXRjLXN0cmluZyBmb3JtYXQ6ICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onIj4pXQorICAgICAqIHdpdGggVEFJIHRpbWUgd2l0aCBmb3JtYXQ6ICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTLTAwMDA8bGVhcFNlY3M+IgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvRHluYW1pY1V0Y1RvVGFpRGF0ZVJlcGxhY2VtZW50KFN0cmluZyBzdHJpbmcsCisgICAgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdHRlcm4gdXRjVG9UYWlQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXFtcXHMqVVRDX1RPX1RBSVxccypcXCguezEsfT9cXClcXHMqXFxdIik7CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHV0Y1RvVGFpUGF0dGVybi5tYXRjaGVyKHN0cmluZyk7CisgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHV0Y1RvVGFpU3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhtYXRjaGVyLnN0YXJ0KCksIG1hdGNoZXIuZW5kKCkpOworICAgICAgICAgICAgTWF0Y2hlciBhcmdNYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCJcXCguKlxcKSIpLm1hdGNoZXIodXRjVG9UYWlTdHJpbmcpOworICAgICAgICAgICAgYXJnTWF0Y2hlci5maW5kKCk7CisgICAgICAgICAgICBTdHJpbmcgdXRjRGF0ZVN0cmluZyA9IAorICAgICAgICAgICAgICAgIHV0Y1RvVGFpU3RyaW5nLnN1YnN0cmluZyhhcmdNYXRjaGVyLnN0YXJ0KCkgKyAxLCBhcmdNYXRjaGVyLmVuZCgpIC0gMSkudHJpbSgpOworICAgICAgICAgICAgdXRjRGF0ZVN0cmluZyA9IGRvRHluYW1pY1JlcGxhY2VtZW50KHV0Y0RhdGVTdHJpbmcsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIHN0cmluZyA9IFN0cmluZ1V0aWxzLnJlcGxhY2Uoc3RyaW5nLCB1dGNUb1RhaVN0cmluZywgCisgICAgICAgICAgICAgICAgICAgIERhdGVVdGlscy50b1N0cmluZyhEYXRlVXRpbHMudG9UYWkoRGF0ZVV0aWxzLnRvQ2FsZW5kYXIodXRjRGF0ZVN0cmluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLkZvcm1hdFR5cGUuVVRDX0ZPUk1BVCkpKSk7CisgICAgICAgICAgICBtYXRjaGVyID0gdXRjVG9UYWlQYXR0ZXJuLm1hdGNoZXIoc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyBTdHJpbmcgbWV0aG9kIG9mIGZvcm1hdCBbREFURV9UT19TRUNTKDxkYXRlLXN0cmluZz4sPERhdGVVdGlscy5Gb3JtYXRUeXBlPiw8ZXBvY2gtZGF0ZSBmb3JtYXQ6ICJ5eXl5LU1NLWRkIj4pXQorICAgICAqIHdpdGggc2Vjb25kcyBiZXR3ZWVuIDxlcG9jaC1kYXRlPiBhbmQgPGRhdGUtc3RyaW5nPiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkb0R5bmFtaWNEYXRlVG9TZWNzUmVwbGFjZW1lbnQoU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0dGVybiB1dGNUb1RhaVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcW1xccypEQVRFX1RPX1NFQ1NcXHMqXFwoLnsxLH0/XFwsLnsxLH0/LC57MSx9P1xcKVxccypcXF0iKTsKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gdXRjVG9UYWlQYXR0ZXJuLm1hdGNoZXIoc3RyaW5nKTsKKyAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0ZVRvU2Vjc1N0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcobWF0Y2hlci5zdGFydCgpLCBtYXRjaGVyLmVuZCgpKTsKKyAgICAgICAgICAgIE1hdGNoZXIgYXJnTWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiXFwoLipcXCkiKS5tYXRjaGVyKGRhdGVUb1NlY3NTdHJpbmcpOworICAgICAgICAgICAgYXJnTWF0Y2hlci5maW5kKCk7CisgICAgICAgICAgICBTdHJpbmcgYXJnc1N0cmluZyA9IGRhdGVUb1NlY3NTdHJpbmcuc3Vic3RyaW5nKGFyZ01hdGNoZXIuc3RhcnQoKSArIDEsCisgICAgICAgICAgICAgICAgICAgIGFyZ01hdGNoZXIuZW5kKCkgLSAxKTsKKyAgICAgICAgICAgIGFyZ3NTdHJpbmcgPSBkb0R5bmFtaWNSZXBsYWNlbWVudChhcmdzU3RyaW5nLCBtZXRhZGF0YSk7CisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gYXJnc1N0cmluZy5zcGxpdCgiLCIpOworICAgICAgICAgICAgU3RyaW5nIGRhdGVTdHJpbmcgPSBhcmdzWzBdLnRyaW0oKTsKKyAgICAgICAgICAgIFN0cmluZyBkYXRlVHlwZSA9IGFyZ3NbMV0udHJpbSgpOworICAgICAgICAgICAgU3RyaW5nIGVwb2NoU3RyaW5nID0gYXJnc1syXS50cmltKCk7CisgICAgICAgICAgICBDYWxlbmRhciBkYXRlID0gRGF0ZVV0aWxzLnRvQ2FsZW5kYXIoZGF0ZVN0cmluZywgRGF0ZVV0aWxzLkZvcm1hdFR5cGUudmFsdWVPZihkYXRlVHlwZSkpOworICAgICAgICAgICAgQ2FsZW5kYXIgZXBvY2ggPSBEYXRlVXRpbHMudG9Mb2NhbEN1c3RvbUZvcm1hdENhbGVuZGFyKGVwb2NoU3RyaW5nLCAieXl5eS1NTS1kZCIpOworICAgICAgICAgICAgU3RyaW5nIHNlY29uZHMgPSBEYXRlVXRpbHMudG9TdHJpbmcoRGF0ZVV0aWxzLmdldFRpbWVJblNlY3MoZGF0ZSwgZXBvY2gpKTsKKyAgICAgICAgICAgIHN0cmluZyA9IFN0cmluZ1V0aWxzLnJlcGxhY2Uoc3RyaW5nLCBkYXRlVG9TZWNzU3RyaW5nLCBzZWNvbmRzKTsKKyAgICAgICAgICAgIG1hdGNoZXIgPSB1dGNUb1RhaVBhdHRlcm4ubWF0Y2hlcihzdHJpbmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcGxhY2VzIFN0cmluZyBtZXRob2Qgb2YgZm9ybWF0IFtEQVRFX1RPX01JTExJUyg8ZGF0ZS1zdHJpbmc+LDxEYXRlVXRpbHMuRm9ybWF0VHlwZT4sPGVwb2NoLWRhdGUgZm9ybWF0OiAieXl5eS1NTS1kZCI+KV0KKyAgICAgKiB3aXRoIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIDxlcG9jaC1kYXRlPiBhbmQgPGRhdGUtc3RyaW5nPiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkb0R5bmFtaWNEYXRlVG9NaWxsaXNSZXBsYWNlbWVudChTdHJpbmcgc3RyaW5nLAorICAgICAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYXR0ZXJuIHV0Y1RvVGFpUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxbXFxzKkRBVEVfVE9fTUlMTElTXFxzKlxcKC57MSx9P1xcLC57MSx9PywuezEsfT9cXClcXHMqXFxdIik7CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHV0Y1RvVGFpUGF0dGVybi5tYXRjaGVyKHN0cmluZyk7CisgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGRhdGVUb01pbGxpc1N0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcobWF0Y2hlci5zdGFydCgpLCBtYXRjaGVyLmVuZCgpKTsKKyAgICAgICAgICAgIE1hdGNoZXIgYXJnTWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiXFwoLipcXCkiKS5tYXRjaGVyKGRhdGVUb01pbGxpc1N0cmluZyk7CisgICAgICAgICAgICBhcmdNYXRjaGVyLmZpbmQoKTsKKyAgICAgICAgICAgIFN0cmluZyBhcmdzU3RyaW5nID0gZGF0ZVRvTWlsbGlzU3RyaW5nLnN1YnN0cmluZyhhcmdNYXRjaGVyLnN0YXJ0KCkgKyAxLAorICAgICAgICAgICAgICAgICAgICBhcmdNYXRjaGVyLmVuZCgpIC0gMSk7CisgICAgICAgICAgICBhcmdzU3RyaW5nID0gZG9EeW5hbWljUmVwbGFjZW1lbnQoYXJnc1N0cmluZywgbWV0YWRhdGEpOworICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IGFyZ3NTdHJpbmcuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgIFN0cmluZyBkYXRlU3RyaW5nID0gYXJnc1swXS50cmltKCk7CisgICAgICAgICAgICBTdHJpbmcgZGF0ZVR5cGUgPSBhcmdzWzFdLnRyaW0oKTsKKyAgICAgICAgICAgIFN0cmluZyBlcG9jaFN0cmluZyA9IGFyZ3NbMl0udHJpbSgpOworICAgICAgICAgICAgQ2FsZW5kYXIgZGF0ZSA9IERhdGVVdGlscy50b0NhbGVuZGFyKGRhdGVTdHJpbmcsIERhdGVVdGlscy5Gb3JtYXRUeXBlLnZhbHVlT2YoZGF0ZVR5cGUpKTsKKyAgICAgICAgICAgIENhbGVuZGFyIGVwb2NoID0gRGF0ZVV0aWxzLnRvTG9jYWxDdXN0b21Gb3JtYXRDYWxlbmRhcihlcG9jaFN0cmluZywgInl5eXktTU0tZGQiKTsKKyAgICAgICAgICAgIFN0cmluZyBtaWxsaXNlY29uZHMgPSBEYXRlVXRpbHMuZ2V0VGltZUluTWlsbGlzKGRhdGUsIGVwb2NoKSArICIiOworICAgICAgICAgICAgc3RyaW5nID0gU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmcsIGRhdGVUb01pbGxpc1N0cmluZywgbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgICAgIG1hdGNoZXIgPSB1dGNUb1RhaVBhdHRlcm4ubWF0Y2hlcihzdHJpbmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVmFyRGF0YSByZWFkRW52VmFyTmFtZShTdHJpbmcgb3JpZ1BhdGhTdHIsIGludCBzdGFydElkeCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgdmFyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IGlkeCA9IHN0YXJ0SWR4ICsgMTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICB2YXJOYW1lLmFwcGVuZChvcmlnUGF0aFN0ci5jaGFyQXQoaWR4KSk7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfSB3aGlsZSAob3JpZ1BhdGhTdHIuY2hhckF0KGlkeCkgIT0gJ10nKTsKKworICAgICAgICBWYXJEYXRhIGRhdGEgPSBuZXcgUGF0aFV0aWxzKCkubmV3IFZhckRhdGEoKTsKKyAgICAgICAgZGF0YS5zZXRGaWVsZE5hbWUodmFyTmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgZGF0YS5zZXRFbmRJZHgoaWR4KTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisKKyAgICB9CisKKyAgICBjbGFzcyBWYXJEYXRhIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBmaWVsZE5hbWUgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgaW50IGVuZElkeCA9IC0xOworCisgICAgICAgIHB1YmxpYyBWYXJEYXRhKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGVuZElkeAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRFbmRJZHgoKSB7CisgICAgICAgICAgICByZXR1cm4gZW5kSWR4OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBlbmRJZHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZW5kSWR4IHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5kSWR4KGludCBlbmRJZHgpIHsKKyAgICAgICAgICAgIHRoaXMuZW5kSWR4ID0gZW5kSWR4OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGZpZWxkTmFtZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGROYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZmllbGROYW1lIHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuZmllbGROYW1lID0gZmllbGROYW1lOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3V0aWwvUHJvcGVydGllc1V0aWxzLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1Byb3BlcnRpZXNVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjYyNTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1Byb3BlcnRpZXNVdGlscy5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGluZyBwcm9wZXJ0eSB2YWx1ZXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0aWVzVXRpbHMgeworCisgICAgLyoqCisgICAgICogTG9hZHMgYSBzZXQgb2YgU3lzdGVtIHByb3BlcnRpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGFzIGNvbW1hLWRlbGltaXRlZAorICAgICAqIHN0cmluZ3MgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgU3RyaW5nIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSB0byByZWFkIGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzCisgICAgICogICAgICAgICAgICBBIHNldCBvZiBkZWZhdWx0IHZhbHVlcyB0byB1c2UgZm9yIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0aWVzKFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nW10gZGVmYXVsdFZhbHVlcykgeworICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBnZXRQcm9wZXJ0aWVzKHByb3BlcnR5KTsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2RlZmF1bHRWYWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGVmYXVsdFZhbHVlcywgMCwgdmFsdWVzLCAwLCBkZWZhdWx0VmFsdWVzLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbmQgcGFyc2VzIGEgZ2l2ZW4gcHJvcGVydHkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSB0byBiZSBsb2FkZWQgYW5kIHBhcnNlZAorICAgICAqIEByZXR1cm4gQSBzdHJpbmcgYXJyYXkgb2YgcHJvcGVydGllcyB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb3BlcnRpZXMoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIFZlY3RvciBwcm9wTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHksCisgICAgICAgICAgICAgICAgIiIpLCAiLCIpOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBwcm9wTGlzdC5hZGQoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoc3QubmV4dFRva2VuKCkudHJpbSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcHJvcExpc3QudG9BcnJheShuZXcgU3RyaW5nW3Byb3BMaXN0LnNpemUoKV0pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbmQgcGFyc2VzIGEgZ2l2ZW4gcHJvcGVydHkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSB0byByZWFkIGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzCisgICAgICogICAgICAgICAgICBBIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGZvciB0aGUgcHJvcGVydHkuCisgICAgICogQHJldHVybiBBIHN0cmluZyBwcm9wZXJ0aWVzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKHByb3BlcnR5LCBuZXcgU3RyaW5nW10geyBkZWZhdWx0VmFsdWUgfSlbMF07CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvYWRzIGFuZCBwYXJzZXMgYSBnaXZlbiBwcm9wZXJ0eQorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eQorICAgICAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IHRvIGJlIGxvYWRlZCBhbmQgcGFyc2VkCisgICAgICogQHJldHVybiBBIHN0cmluZyBwcm9wZXJ0aWVzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKHByb3BlcnR5KVswXTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcHlhbmRyZXdyaXRlLmV4YW1wbGUuY29uZiBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvcHlhbmRyZXdyaXRlLmV4YW1wbGUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNhODk4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29weWFuZHJld3JpdGUuZXhhbXBsZS5jb25mCkBAIC0wLDAgKzEsNiBAQAorbnVtUmV3cml0ZUZpZWxkcz0yCityZXdyaXRlRmllbGQxPVByb2R1Y3RUeXBlCityZXdyaXRlRmllbGQyPUZpbGVMb2NhdGlvbgorb3JpZy5tZXQuZmlsZS5wYXRoPS4vc3JjL3Jlc291cmNlcy9leGFtcGxlcy9zYW1wbGVtZXQueG1sCitQcm9kdWN0VHlwZS5wYXR0ZXJuPU5ld1Byb2R1Y3RUeXBlW1Byb2R1Y3RUeXBlXQorRmlsZUxvY2F0aW9uLnBhdHRlcm49L25ldy9sb2MvW0ZpbGVMb2NhdGlvbl0KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2RhdGFzb3VyY2VfbWV0ZXh0cmFjdG9yX2V4YW1wbGUucHJvcGVydGllcyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2RhdGFzb3VyY2VfbWV0ZXh0cmFjdG9yX2V4YW1wbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWY1MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZGF0YXNvdXJjZV9tZXRleHRyYWN0b3JfZXhhbXBsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLmRhdGFzb3VyY2UucXVlcnk9c2VsZWN0IFByb2R1Y3ROYW1lLEZpbGVTaXplIGZyb20gUHJvZHVjdHMgd2hlcmUgUHJvZHVjdElkID0gJyVzJworb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLmRhdGFzb3VyY2UuZGIudXJsPWh0dHA6Ly9kYi51cmwKK29yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5kYXRhc291cmNlLmRyaXZlcj1zb21lLmRyaXZlci5jbGFzcworb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLmRhdGFzb3VyY2UudXNlcm5hbWU9dXNlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLmRhdGFzb3VyY2UucGFzc3dvcmQ9cGFzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2V4dGVybi1jb25maWcueG1sIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZXh0ZXJuLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2NGYyMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2V4dGVybi1jb25maWcueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBGSVhNRTogY2hhbmdlIG5hbWVzcGFjZSBVUkk/IC0tPgorPGNhczpleHRlcm5leHRyYWN0b3IgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisKKwk8IS0tICAKKwkgICAgd29ya2luZ0Rpcjogc3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgZXh0ZXJuYWwgY29tbWFuZCBsaW5lIG1ldCBleHRyYWN0b3Igd2lsbAorCSAgICBiZSBydW4gaW4uIAorCSAgICAKKwkgICAgaWYgd29ya2luZ0RpciBpcyBub3Qgc3BlY2lmaWVkLCBhbmQgaWYgdGhlIGV4dGVybmFsIGNvbW1hbmQgbGluZSBtZXQgZXh0cmFjdG9yIGhvbm9ycworCSAgICB0aGUgd29ya2luZ0RpciBjb250cmFjdCAoZ2VuZXJhdGluZyAubWV0IGZpbGUgaW4gZGlyZWN0b3J5IHRoYXQgaXQgaXMgY2FsbGVkIGZyb20pLCB0aGVuIAorCSAgICB0aGUgLm1ldCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIC9wYXRoL3RvL2ZpbGUncyBwYXJlbnQgZGlyZWN0b3J5LiBPdGhlcndpc2UsIGlmIHRoZQorCSAgICBleHRlcm5hbCBjb21tYW5kIGxldCBtZXQgZXh0cmFjdG9yIGRvZXNuJ3QgaG9ub3Igd29ya2luZyBkaXIsIHRoZW4gYWxsIGJldHMKKwkgICAgYXJlIG9mZi4KKwkgICAgCisJICAgIG1ldEZpbGVFeHQ6IHNwZWNpZmllcyB0aGUgZmlsZSBleHRlbnNpb24gZm9yIHRoZSBleHRlcm4gbWV0IGV4dHJhY3RvciB0byBsb29rIGZvciB3aGVuIAorCSAgICByZWFkaW5nIHRoZSBnZW5lcmF0ZWQgbWV0IGZpbGUgaW50byBKYXZhIGFzIGFuIGluLW1lbW9yeSBDQVMgbWV0YWRhdGEgb2JqZWN0LiBUaGUgbWV0IAorCSAgICBmaWxlIGV4dGVuc2lvbiBpcyBhcHBlbmRlZCB0byB0aGUgZnVsbCBmaWxlIHBhdGggb2YgdGhlIG9yaWdpbmFsIGRhdGEgZmlsZS4gSWYgbm90IHNwZWNpZmllZCwgCisJICAgIHRoZW4gdGhlIG1ldCBmaWxlIGV4dGVuc2lvbiBkZWZhdWx0cyB0byAmcXVvdDsubWV0JnF1b3Q7LgorCS0tPgorCTxleGVjIHdvcmtpbmdEaXI9IiIgbWV0RmlsZUV4dD0iIj4KKwkJPCEtLSAgdGhpcyBwYXRoIGNhbiBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSAtLT4KKwkJPCEtLSAgeW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgZW52UmVwbGFjZSB0YWcgKD10cnVlKSAKKwkJICAgICAgdG8gdHVybiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXBsYWNlbWVudAorCQktLT4KKwkJPGV4dHJhY3RvckJpblBhdGggZW52UmVwbGFjZT0idHJ1ZSI+W1BXRF0vc3JjL3Rlc3QvZ292L25hc2EvanBsL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvdGVzdEV4dHJhY3RvcjwvZXh0cmFjdG9yQmluUGF0aD4KKworCQk8IS0tICBtYWtlIHN1cmUgdG8gdXNlIGNoYXJhY3RlciBlbnRpdGllcyBpZiB0aGVyZSBhcmUgYW55IHdlaXJkCisJCQlwYXJhbWV0ZXJzIGhlcmUgdGhhdCB3b3VsZCBzY3JldyB1cCB0aGUgWE1MLgorCQkJCisJCQlhcmdzIGNvbWUgYWZ0ZXIgcHJvdmlkaW5nIHRoZSBmaWxlIHRvIHRoaXMgbWV0IGV4dHJhY3Rvci4gU28sIGluIG90aGVyCisJCQl3b3Jkcywgd2UgYXNzdW1lIHRoYXQgZXh0cmFjdG9yQmluUGF0aCAmZ3Q7ZmlsZSZsdDsgJmx0O2FyZ3MuLi4mZ3Q7CisJCQkKKwkJCXdoZXJlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYWx3YXlzIHRoZSBmaWxlIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbSwKKwkJCWFuZCB0aGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIHRvIHByb3ZpZGUgdG8gdGhlIHVuZGVybHlpbmcKKwkJCW1ldCBleHRyYWN0b3IuCisJCS0tPgorCQk8YXJncz4KKwkJCTxhcmcgaXNEYXRhRmlsZT0idHJ1ZSIvPgorCQkJPGFyZyBpc01ldEZpbGU9InRydWUiLz4KKwkJCTxhcmc+LUR0cnVlPWFsd2F5czwvYXJnPgorCQkJPGFyZz5mb288L2FyZz4KKwkJCTxhcmc+YmFyPC9hcmc+CisJCQk8IS0tICB5b3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGF0IHlvdSB3b3VsZCBsaWtlIGVudmlyb25tZW50IAorCQkJICAgICAgdmFyaWFibGUgcmVwbGFjZW1lbnQgb24gYSBwYXJ0aWN1bGFyIGFyZ3VtZW50CisJCQkgICAgICAKKwkJCSAgICAgIFlvdSBjYW4gYWxzbyBvcHRpb25hbGx5IHNwZWNpZnkgdGhhdCB0aGUgYXJndW1lbnQgaXMgYSBwYXRoCisJCQkgICAgICBhbmQgdGhhdCB5b3Ugd291bGQgbGlrZSBpdCB0byBiZSB0cmVhdGVkIGFzIHN1Y2ggdXNpbmcgdGhlCisJCQkgICAgICBpc1BhdGg9InRydWUiLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgcGF0aCBpcyB0cmVhdGVkIGFzIGlmCisJCQkgICAgICBpc1BhdGggd2FzIHNwZWNpZmllZCBhcyAiZmFsc2UiLCBhbmQgU3RyaW5nLnJlcGxhY2VBbGwoIlxccyIsICJcXFxcICIpCisJCQkgICAgICBpcyBub3QgY2FsbGVkLiBJZiBjYWxsZWQsIGFsbCB3aGl0ZSBzcGFjZXMgYXJlIHJlcGxhY2VkIGZyb20gdGhlIHBhdGgKKwkJCSAgICAgICh1c2luZyB0aGUgYWJvdmUgcmVnZXgpLCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUgbGl0ZXJhbCBzdHJpbmcKKwkJCSAgICAgICJcICIuCisJCQkgICAgICAKKwkJCSAgICAgIFRoZSBhcHBlbmRFeHQgcGFyYW1ldGVyIGlzIHVzZWQgdG8gYXVnbWVudCBhbiBleGlzdGluZyBhcmd1bWVudCAKKwkJCSAgICAgIHdpdGggc29tZSBzcGVjaWZpZWQgZXh0ZW5zaW9uLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIG9uIHBhdGhzIAorCQkJICAgICAgdG8gYWRkIGFub3RoZXIgZXh0ZW5zaW9uIHRvIGFuIGFyZ3VtZW50IHRoYXQncyBhIHBhdGguIEZvciBpbnN0YW5jZSwgCisJCQkgICAgICB5b3UgY291bGQgYXBwZW5kIHRoZSAuY2FzIG1ldGFkYXRhIGZpbGUgZXh0ZW5zaW9uIHRvIGFuIGV4aXN0aW5nIAorCQkJICAgICAgcGF0aCwgZS5nLiwgdGhlIGRhdGEgZmlsZSBwYXRoLgorCQkJLS0+CisJCQk8YXJnIGVudlJlcGxhY2U9InRydWUiIGlzUGF0aD0idHJ1ZSI+W0hPTUVdL3Rlc3QgYm9vPC9hcmc+CisJCQk8YXJnIGFwcGVuZEV4dD0iY2FzIj4vZnVsbC9wYXRoL3RvL3NvbWVmaWxlLnR4dDwvYXJnPgorCQk8L2FyZ3M+CisJPC9leGVjPgorCis8L2NhczpleHRlcm5leHRyYWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZmlsZW5hbWUuZXh0cmFjdG9yLmNvbmZpZy54bWwgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9maWxlbmFtZS5leHRyYWN0b3IuY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTEzZTlkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvZmlsZW5hbWUuZXh0cmFjdG9yLmNvbmZpZy54bWwKQEAgLTAsMCArMSw4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8aW5wdXQ+CisKKyAgIDxncm91cCBuYW1lPSJUb2tlbk5hbWVMaXN0R3JvdXAiPgorICAgICA8c2NhbGFyIG5hbWU9IkRlbGltZXRlciI+Xzwvc2NhbGFyPgorICAgICA8dmVjdG9yIG5hbWU9IlRva2VuTWV0S2V5cyI+CisgICAgCisgICAgIDwhLS0gCisgICAgIFtzb3VyY2VuYW1lXV9bdGFibGVuYW1lXV9bcHJvZHVjdGlvbmRhdGV0aW1lXS5bZXh0XQorICAgICAKKyAgICAgZXggZmlsZSBuYW1lOiBkYXRhc291cmNlX3RhYmxlbmFtZV8yMDEwMTEyOTEyMjcwMC50eHQKKyAgICAgLS0+CisgICAgICAgPGVsZW1lbnQ+U291cmNlTmFtZTwvZWxlbWVudD4KKyAgICAgICA8ZWxlbWVudD5UYWJsZU5hbWU8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+UHJvZHVjdGlvbkRhdGVUaW1lPC9lbGVtZW50PgorICAgICA8L3ZlY3Rvcj4KKyAgCisgICA8L2dyb3VwPgorCisKKyAgICA8Z3JvdXAgbmFtZT0iU3Vic3RyaW5nT2Zmc2V0R3JvdXAiPgorICAgICA8IS0tICB0aGUgaW5kaWNlcyBmb3IgdGhlIHN1YnN0cmluZyBtZXQga2V5IHNlbGVjdGlvbiAtLT4KKyAgICAgPCEtLSAgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBzdHJpbmcgLS0+CisgICAgIDwhLS0gIE5PVEU6IHRoaXMgYXNzdW1lcyAxLWluZGV4ZWQgc3RyaW5ncyAoYW5kIGlzIGludGVybmFsbHkgY29udmVydGVkIHRvCisgICAgICAgICAgIDAtaW5kZXhlZC4KKyAgICAgIC0tPgorICAgICA8IS0tICB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIGxlbmd0aCAtLT4KKyAgICAgCisgICAgIDwhLS0gIE1pc3Npb25OYW1lX0RhdGVfU3RhcnRPcmJpdE51bWJlcl9TdG9wT3JiaXROdW1iZXIudHh0IC0tPgorICAgICAKKyAgICAgIDx2ZWN0b3IgbmFtZT0iTWlzc2lvbk5hbWUiPgorICAgICAgICA8ZWxlbWVudD4xPC9lbGVtZW50PgorICAgICAgICA8ZWxlbWVudD4xMTwvZWxlbWVudD4gICAgICAKKyAgICAgIDwvdmVjdG9yPgorICAgICAgCisgICAgICA8dmVjdG9yIG5hbWU9IkRhdGUiPgorICAgICAgICA8ZWxlbWVudD4xMzwvZWxlbWVudD4KKyAgICAgICAgPGVsZW1lbnQ+NDwvZWxlbWVudD4KKyAgICAgIDwvdmVjdG9yPgorICAgICAgCisgICAgICA8dmVjdG9yIG5hbWU9IlN0YXJ0T3JiaXROdW1iZXIiPgorICAgICAgICA8ZWxlbWVudD4xODwvZWxlbWVudD4KKyAgICAgICAgPGVsZW1lbnQ+MTY8L2VsZW1lbnQ+CisgICAgICA8L3ZlY3Rvcj4KKyAgICAgIAorICAgICAgPHZlY3RvciBuYW1lPSJTdG9wT3JiaXROdW1iZXIiPgorICAgICAgICA8ZWxlbWVudD4zNTwvZWxlbWVudD4KKyAgICAgICAgPGVsZW1lbnQ+MTU8L2VsZW1lbnQ+CisgICAgICA8L3ZlY3Rvcj4KKyAgICAgIAorICAgPC9ncm91cD4KKyAgIAorICAgPGdyb3VwIG5hbWU9IlByb2R1Y3Rpb25EYXRlVGltZUdyb3VwIj4KKyAgICAgPHNjYWxhciBuYW1lPSJEYXRlVGltZUZvcm1hdCI+eXl5eU1NZGRISG1tc3M8L3NjYWxhcj4KKyAgIDwvZ3JvdXA+ICAgCisgICAgCisgICAgPGdyb3VwIG5hbWU9IkNvbW1vbk1ldGFkYXRhIj4KKyAgICAgICA8IS0tICBjYW4gbm93IHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXBsYWNlbWVudCBpbiBhbnkgb2YgdGhlIHZhbHVlcyBmb3IgCisgICAgICAgICAgICAgc2NhbGFycyBvciB2ZWN0b3JzLCBqdXN0IHVzZSBDQVMgYnJhY2tldCBzdHlsZSBbRU5WIFZBUiBOQU1FXQorICAgICAgICAgCisgICAgICAgICAgICAgQWxzbyBjYW4gdXNlIHZlY3RvciB0byBpbmRpY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgZm9yIGEgcGFydGljdWxhciBtZXQgZmllbGQuCisgICAgICAgIC0tPgorICAgICAgICA8c2NhbGFyIG5hbWU9IkRhdGFWZXJzaW9uIj4xLjA8L3NjYWxhcj4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJDb2xsZWN0aW9uTmFtZSI+UHJvZHVjdHMgZXh0cmFjdGVkIGJ5IHRoZSBPT0RUIEZpbGVuYW1lIE1ldCBFeHRyYWN0b3I8L3NjYWxhcj4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJEYXRhUHJvdmlkZXIiPk9PRFQ8L3NjYWxhcj4KKyAgICA8L2dyb3VwPgorPC9pbnB1dD4KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21ldF9leHRyX3ByZWNvbmRpdGlvbnMueG1sIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbWV0X2V4dHJfcHJlY29uZGl0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3YWQxZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21ldF9leHRyX3ByZWNvbmRpdGlvbnMueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorCis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgICAgCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorICAgIAorCisgICAgPCEtLSBQcmVjb25kaXRpb24gQ29tcGFyYXRvcnMgLS0+CisgICAgPGJlYW4gaWQ9IlByZWNvbmRpdGlvbkNvbXBhcmF0b3IiIGxhenktaW5pdD0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuUHJlQ29uZGl0aW9uQ29tcGFyYXRvciIvPgorICAgIAorICAgIDxiZWFuIGlkPSJPbmx5RXh0cmFjdEZpbGVUeXBlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuRW5kc1dpdGhDb21wYXJhdG9yIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2tzIHRoZSBmaWxlIGV4dGVuc2lvbiBhbmQgb25seSBleHRyYWN0cyBtZXQgZnJvbSB0aG9zZSBmaWxlcy4iLz4gICAgICAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPmZpbGVfZXh0PC92YWx1ZT4gICAgCisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZXF1YWxfdG8iLz4KKyAgICA8L2JlYW4+ICAgIAorICAgIAorICAgIAorICAgIDxiZWFuIGlkPSJDaGVja1RoYXREYXRhRmlsZVNpemVJc0dyZWF0ZXJUaGFuWmVybyIgbGF6eS1pbml0PSJ0cnVlIiBwYXJlbnQ9IlByZWNvbmRpdGlvbkNvbXBhcmF0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuRmlsZVNpemVDb21wYXJhdG9yIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8iLz4gICAgICAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Mb25nIj4wPC92YWx1ZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJncmVhdGVyX3RoYW4iLz4KKyAgICA8L2JlYW4+CisgICAgCisgICAgPGJlYW4gaWQ9IkNoZWNrVGhhdERhdGFGaWxlRXhpc3RzIiBsYXp5LWluaXQ9InRydWUiIHBhcmVudD0iUHJlY29uZGl0aW9uQ29tcGFyYXRvciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5FeGlzdGFuY2VDaGVja0NvbXBhcmF0b3IiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDaGVjayBpZiB0aGUgY3VycmVudCBkYXRhIGZpbGUgZXhpc3RzIi8+ICAgICAgICAKKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbXBhcmVJdGVtIj4KKyAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiI+dHJ1ZTwvdmFsdWU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZXF1YWxfdG8iLz4gICAgCisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9IkNoZWNrRGF0YUZpbGVNaW1lVHlwZSIgbGF6eS1pbml0PSJ0cnVlIiBwYXJlbnQ9IlByZWNvbmRpdGlvbkNvbXBhcmF0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuTWltZVR5cGVDb21wYXJhdG9yIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2sgdGhhdCBkYXRhIGZpbGUgbWltZSB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtaW1lIHR5cGUiLz4gICAgICAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPmFwcGxpY2F0aW9uL3htbDwvdmFsdWU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZXF1YWxfdG8iLz4gICAKKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1pbWVUeXBlUmVwbyIgdmFsdWU9Ii4vc3JjL3Jlc291cmNlcy90aWthLW1pbWV0eXBlcy54bWwiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZU1hZ2ljIiB2YWx1ZT0idHJ1ZSIvPiAKKyAgICA8L2JlYW4+CisKKzwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvc2FtcGxlbWV0LnhtbCBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3NhbXBsZW1ldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjZTVkZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3NhbXBsZW1ldC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczptZXRhZGF0YSB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8a2V5dmFsPgorICAgPGtleT5GaWxlbmFtZTwva2V5PgorICAgPHZhbD5ibGFoLnR4dDwvdmFsPgorIDwva2V5dmFsPgorIDxrZXl2YWw+CisgICA8a2V5PkZpbGVMb2NhdGlvbjwva2V5PgorICAgPHZhbD4vdG1wPC92YWw+CisgPC9rZXl2YWw+CisgPGtleXZhbD4KKyAgIDxrZXk+UHJvZHVjdFR5cGU8L2tleT4KKyAgIDx2YWw+R2VuZXJpY0ZpbGU8L3ZhbD4KKyA8L2tleXZhbD4KKzwvY2FzOm1ldGFkYXRhPgpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC9tZXRhZGF0YS9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmEwMTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MiBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFNwZWNpZnkgdGhlIGhhbmRsZXJzIHRvIGNyZWF0ZSBpbiB0aGUgcm9vdCBsb2dnZXIKKyMgKGFsbCBsb2dnZXJzIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBsb2dnZXIpCisjIFRoZSBmb2xsb3dpbmcgY3JlYXRlcyB0d28gaGFuZGxlcnMKK2hhbmRsZXJzID0gamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCisKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBzdWJzeXN0ZW1zCitvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmxldmVsID0gU0VWRVJFCitvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMubGV2ZWwgPSBTRVZFUkUKK29yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5sZXZlbCA9IFNFVkVSRQorb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLmxldmVsID0gU0VWRVJFCisKKyMgcXVpZXQgdGhlIHVuaXQgdGVzdHMKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwubGV2ZWwgPSBTRVZFUkUKK3N1bi5uZXQud3d3LnByb3RvY29sLmh0dHAubGV2ZWwgPSBTRVZFUkUKK3N1bi5uZXQud3d3LmxldmVsID0gU0VWRVJFCmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy9tYWluL3Jlc291cmNlcy90aWthLW1pbWV0eXBlcy54bWwgYi8wLjEwL21ldGFkYXRhL3NyYy9tYWluL3Jlc291cmNlcy90aWthLW1pbWV0eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwZjdhMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL21haW4vcmVzb3VyY2VzL3Rpa2EtbWltZXR5cGVzLnhtbApAQCAtMCwwICsxLDU5MjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgRGVzY3JpcHRpb246IFRoaXMgeG1sIGZpbGUgZGVmaW5lcyB0aGUgdmFsaWQgbWltZSB0eXBlcyB1c2VkIGJ5IFRpa2EuCisgIFRoZSBtaW1lIHR5cGUgZGF0YSB3aXRoaW4gdGhpcyBmaWxlIGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cworICBzb3VyY2VzIGxpa2UgQXBhY2hlIE51dGNoLCBBcGFjaGUgSFRUUCBTZXJ2ZXIsIHRoZSBmaWxlKDEpIGNvbW1hbmQsIGV0Yy4KKworICBOb3RlczoKKyAgICogVGlrYSBzdXBwb3J0cyBhIHdpZGVyIHJhbmdlIG9mIG1hdGNoIHR5cGVzIHRoYW4gRnJlZWRlc2t0b3AgZG9lcworICAgKiBHbG9iIHBhdHRlcm5zIG11c3QgYmUgdW5pcXVlLCBpZiB0aGVyZSdzIGEgY2xhc2ggYXNzaWduIHRvIHRoZSBtb3N0CisgICAgIHBvcHVsYXIgZm9ybWF0CisgICAqIFRoZSBtYWluIG1pbWUgdHlwZSBzaG91bGQgYmUgdGhlIGNhbm9uaWNhbCBvbmUsIHVzZSBhbGlhc2VzIGZvciBhbnkKKyAgICAgb3RoZXIgd2lkZWx5IHVzZWQgZm9ybXMKKyAgICogV2hlcmUgdGhlcmUncyBhIGhpZXJhcmNoeSBpbiB0aGUgdHlwZXMsIGxpc3QgaXQgdmlhIGEgcGFyZW50CisgICAqIEhpZ2hseSBzcGVjaWZpYyBtYWdpYyBtYXRjaGVzIGdldCBhIGhpZ2ggcHJpb3JpdHkKKyAgICogR2VuZXJhbCBtYWdpYyBtYXRjaGVzIHdoaWNoIGNvdWxkIHRyaWdnZXIgYSBmYWxzZS1wb3NpdGl2ZSBuZWVkCisgICAgIGEgbG93IG9uZQorICAgKiBUaGUgcHJpb3JpdHkgZm9yIGNvbnRhaW5lcnMgbm9ybWFsbHkgbmVlZCB0byBiZSBoaWdoZXIgdGhhbiBmb3IKKyAgICAgdGhlIHRoaW5ncyB0aGV5IGNvbnRhaW4sIHNvIHRoZXkgZG9uJ3QgYWNjaWRlbnRseSBnZXQgZGV0ZWN0ZWQKKyAgICAgYXMgd2hhdCdzIGluIHRoZW0KKyAgICogRm9yIGxvZ2ljIHRvbyBjb21wbGV4IHRvIGJlIGV4cHJlc3NlZCBpbiBhIG1hZ2ljIG1hdGNoLCBkbyB0aGUgYmVzdAorICAgICB5b3UgY2FuIGhlcmUsIHRoZW4gcHJvdmlkZSBhIEN1c3RvbSBEZXRlY3RvciBmb3IgdGhlIHJlc3QKKy0tPgorPG1pbWUtaW5mbz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYWN0aXZlbWVzc2FnZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYW5kcmV3LWluc2V0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5leiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXBwbGVmaWxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hcHBsaXh3YXJlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hdyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCI+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImZlZWQiIG5hbWVzcGFjZVVSST0iaHR0cDovL3B1cmwub3JnL2F0b20vbnMjIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImZlZWQiIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXRvbSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXRvbWNhdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXRvbWljbWFpbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXRvbXN2Yyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b21zdmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F1dGgtcG9saWN5K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYmF0Y2gtc210cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYmVlcCt4bWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYml6YWdpLW1vZGVsZXIiPgorICAgICAgICA8X2NvbW1lbnQ+Qml6QWdpIFByb2Nlc3MgTW9kZWxlcjwvX2NvbW1lbnQ+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vemlwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYnBtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NhbHMtMTg0MCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY2N4bWwreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jY3htbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY2VhLTIwMTgreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jZWxsbWwreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jbnJwK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY29tbW9uZ3JvdW5kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jb25mZXJlbmNlLWluZm8reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jcGwreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jc3RhK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3N0YWRhdGEreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jdS1zZWVtZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2N5YmVyY2FzaCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGF2bW91bnQreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kYXZtb3VudCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGNhLXJmdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGVjLWR4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaWFsb2ctaW5mbyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpY29tIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICAgICAgPF9jb21tZW50PkRhcndpbiBJbmZvcm1hdGlvbiBUeXBpbmcgQXJjaGl0ZWN0dXJlPC9fY29tbWVudD4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGl0YSt4bWw7Zm9ybWF0PW1hcCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vZGl0YSt4bWwiLz4KKyAgICAgICAgPF9jb21tZW50PkRJVEEgTWFwPC9fY29tbWVudD4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ibWFwIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9Im1hcCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9uYW1lc3BhY2UiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaXRhbWFwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbDtmb3JtYXQ9dG9waWMiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sIi8+CisgICAgICAgIDxfY29tbWVudD5ESVRBIFRvcGljPC9fY29tbWVudD4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0idG9waWMiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0idG9waWMiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbmFtZXNwYWNlIi8+CisgICAgICAgIDwhLS0gVG9waWMgaXMgdGhlIGRlZmF1bHQsIFRhc2sgYW5kIENvbmNlcHQgYXJlIHNwZWNpYWxpc2F0aW9ucyAtLT4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaXRhIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbDtmb3JtYXQ9dGFzayI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vZGl0YSt4bWw7Zm9ybWF0PXRhc2siLz4KKyAgICAgICAgPF9jb21tZW50PkRJVEEgVGFzayBUb3BpYzwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InRhc2siLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0idGFzayIgbmFtZXNwYWNlVVJJPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9uYW1lc3BhY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sO2Zvcm1hdD1jb25jZXB0Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbDtmb3JtYXQ9dG9waWMiLz4KKyAgICAgICAgPF9jb21tZW50PkRJVEEgQ29uY2VwdCBUb3BpYzwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImNvbmNlcHQiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iY29uY2VwdCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9uYW1lc3BhY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sO2Zvcm1hdD12YWwiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sIi8+CisgICAgICAgIDxfY29tbWVudD5ESVRBIENvbmRpdGlvbmFsIFByb2Nlc3NpbmcgUHJvZmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InZhbCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJ2YWwiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbmFtZXNwYWNlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGl0YXZhbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kbnMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2R2Y3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjbWEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VkaS1jb25zZW50Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGkteDEyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGlmYWN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lbW1hK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZW1tYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXBwK3htbCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lcHViK3ppcCI+CisgICAgICAgIDxhY3JvbnltPkVQVUI8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5FbGVjdHJvbmljIFB1YmxpY2F0aW9uPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vZXB1Yit6aXAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lcHViIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VzaG9wIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9leGFtcGxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZmFzdHNvYXAiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZml0cyI+CisgICAgICAgIDxhY3JvbnltPkZJVFM8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5GbGV4aWJsZSBJbWFnZSBUcmFuc3BvcnQgU3lzdGVtPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vd3d3LmRpZ2l0YWxwcmVzZXJ2YXRpb24uZ292L2Zvcm1hdHMvZmRkL2ZkZDAwMDMxNy5zaHRtbDwvdGlrYTpsaW5rPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU0lNUExFICA9ICAgICAgICAgICAgICAgICAgICBUIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZpdHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maXQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZm9udC10ZHBmciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGZyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9oMjI0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9odHRwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9oeXBlcnN0dWRpbyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3RrIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUta2V5LXJlcXVlc3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUtcGtnLXJlcGx5K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWJlLXBwLWRhdGEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lnZXMiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWxsdXN0cmF0b3IiPgorICAgICAgICA8YWNyb255bT5BSTwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkFkb2JlIElsbHVzdHJhdG9yIEFydHdvcms8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWRvYmVfSWxsdXN0cmF0b3JfQXJ0d29yazwvdGlrYTpsaW5rPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpIi8+XQorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW0taXNjb21wb3NpbmcreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXguY21kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleC5vYmoiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4LnJlc3BvbnNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleC52bmQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lvdHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lwcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaXN1cCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUiPgorICAgICAgICA8X2NvbW1lbnQ+SmF2YSBBcmNoaXZlPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5qYXI8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPmNvbS5zdW4uamF2YS1hcmNoaXZlPC90aWthOnV0aT4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qYXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFuZHJvaWQucGFja2FnZS1hcmNoaXZlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hcGsiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1qYXZhLWVudGVycHJpc2UtYXJjaGl2ZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vamF2YS1hcmNoaXZlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWFyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtamF2YS13ZWItYXJjaGl2ZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vamF2YS1hcmNoaXZlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2FyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS11bml4LWR1bXAiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YS1zZXJpYWxpemVkLW9iamVjdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2VyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Ii8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgICAgIDxfY29tbWVudD5KYXZhU2NyaXB0IFNvdXJjZSBDb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9qc29uIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanNvbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhLXZtIj4KKyAgICAgICAgPF9jb21tZW50PkphdmEgQ2xhc3MgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWphdmEtdm0iLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjYWZlYmFiZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xhc3MiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1qYXZhLWpuaWxpYiI+CisgICAgICAgIDxfY29tbWVudD5KYXZhIE5hdGl2ZSBMaWJyYXJ5IGZvciBPU1g8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjYWZlYmFiZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZWVkZmFjZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQwOTYiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmVlZGZhY2YiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0MDk2Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGNlZmFlZGZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNDA5NiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjZmZhZWRmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQwOTYiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouam5pbGliIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2twbWwtcmVxdWVzdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2twbWwtcmVzcG9uc2UreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9sb3N0K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubG9zdHhtbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYmluaGV4Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJtdXN0XCBiZVwgY29udmVydGVkXCB3aXRoXCBCaW5IZXgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMSIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhxeCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3B0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hY3dyaXRlaWkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hcmMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1yYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWF0aGVtYXRpY2EiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubmIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWF0aG1sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWF0aG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLWFzc29jaWF0ZWQtcHJvY2VkdXJlLWRlc2NyaXB0aW9uK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1kZXJlZ2lzdGVyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1lbnZlbG9wZSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtbXNrK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1tc2stcmVzcG9uc2UreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXByb3RlY3Rpb24tZGVzY3JpcHRpb24reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXJlY2VwdGlvbi1yZXBvcnQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXJlZ2lzdGVyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWdpc3Rlci1yZXNwb25zZSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtdXNlci1zZXJ2aWNlLWRlc2NyaXB0aW9uK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJveCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1ib3giLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21lZGlhX2NvbnRyb2wreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc2NtbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWlrZXkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21vc3Mta2V5cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbW9zcy1zaWduYXR1cmUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21vc3NrZXktZGF0YSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbW9zc2tleS1yZXF1ZXN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcDQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wNHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21wZWc0LWdlbmVyaWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21wZWc0LWlvZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXBlZzQtaW9kLXhtdCIvPgorCisgICAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL21zd29yZCAtLT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21zd29yZCI+CisgICAgICAgIDwhLS0gVXNlIERlZmF1bHREZXRlY3RvciAvIG9yZy5hcGFjaGUudGlrYS5wYXJzZXIubWljcm9zb2Z0LlBPSUZTQ29udGFpbmVyRGV0ZWN0b3IgZm9yIG1vcmUgcmVsaWFibGUgZGV0ZWN0aW9uIG9mIE9MRTIgZG9jdW1lbnRzIC0tPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmQiLz4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBXb3JkIERvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5kb2M8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPmNvbS5taWNyb3NvZnQud29yZC5kb2M8L3Rpa2E6dXRpPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTWljcm9zb2Z0XCBXb3JkXCA2LjBcIERvY3VtZW50IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJEb2N1bWVudG9cIE1pY3Jvc29mdFwgV29yZFwgNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTVNXb3JkRG9jIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjExMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDMxYmUwMDAwIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBPXlFgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMzc2XDA2N1wwXDA0MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDMzM1wyNDUtXDBcMFwwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMjI0XDI0NlwwNTYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJXXHgwMG9ceDAwclx4MDBkXHgwMERceDAwb1x4MDBjXHgwMHVceDAwbVx4MDBlXHgwMG5ceDAwdCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG9jIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG90Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21zd29yZDIiPgorICAgICAgICA8IS0tIFByZS1PTEUyLCBub3QgYSBzdWJ0eXBlIG9mIGFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSAtLT4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBXb3JkIDIgRG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg5YmE1IiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZGJhNSIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXN3b3JkNSI+CisgICAgICAgIDwhLS0gUHJlLU9MRTIsIG5vdCBhIHN1YnR5cGUgb2YgYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIC0tPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFdvcmQgNSBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZlMzciIHR5cGU9InN0cmluZyIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXhmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5teGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25hc2RhdGEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtY2hlY2tncm91cHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtZ3JvdXBpbmZvIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uZXdzLXRyYW5zbWlzc2lvbiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbnNzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vY3NwLXJlcXVlc3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL29jc3AtcmVzcG9uc2UiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiNcIFRoaXNcIGlzXCBhXCBzaGVsbFwgYXJjaGl2ZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwwMzdcMDM2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIwMTc0MzciIHR5cGU9Imhvc3QxNiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MWZmZiIgdHlwZT0iaG9zdDE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDM3N1wwMzciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjAxNDU0MDUiIHR5cGU9Imhvc3QxNiIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYmluIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG1zIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGhhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubHJmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubHpoIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc28iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaXN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGlzdHoiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wa2ciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5icGsiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kdW1wIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWxjIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGVwbG95Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL29kYSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2RhIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vZWJwcy1wYWNrYWdlK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3BmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL29nZyI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LW9nZyIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnUyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZ3giLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2thdGUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vbmVub3RlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vbmV0b2MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vbmV0b2MyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub25ldG1wIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub25lcGtnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wYXJpdHlmZWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhlciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZGYiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1wZGYiLz4KKyAgICAgICAgPGFjcm9ueW0+UERGPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+UG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BERjwvdGlrYTpsaW5rPgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly93d3cuYWRvYmUuY29tL2Rldm5ldC9wZGYvcGRmX3JlZmVyZW5jZV9hcmNoaXZlLmh0bWw8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPmNvbS5hZG9iZS5wZGY8L3Rpa2E6dXRpPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJVBERi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGRmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vcGdwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGdwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1rZXlzIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcmYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BpZGYreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWRmLWRpZmYreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2NzMTAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnAxMCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wN20iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wN2MiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtjczctc2lnbmF0dXJlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wN3MiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MzA4MkZGRkYwNjA5MmE4NjQ4ODZmNzBkMDEwN0ZGYTAiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkYwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkYwMEZGIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgzMDgwMDYwOTJhODY0ODg2ZjcwZDAxMDdGRmEwIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMEZGIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeC1jZXJ0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BraXgtY3JsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcmwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BraXgtcGtpcGF0aCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGtpcGF0aCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeGNtcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGtpIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wbHMreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BvYy1zZXR0aW5ncyt4bWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcG9zdHNjcmlwdCI+CisgICAgICAgIDxfY29tbWVudD5Qb3N0U2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiUhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwNCUhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gV2luZG93cyBmb3JtYXQgRVBTIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGM1ZDBkM2M2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXBzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXBzZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwc2kiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcHJzLmFsdmVzdHJhbmQudGl0cmF4LXNoZWV0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMuY3d3Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jd3ciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bycy5ucHJlbmQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bycy5wbHVja2VyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9xc2lnIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JkZit4bWwiPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJSREYiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iUkRGIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICAgICAgPGFjcm9ueW0+UkRGL1hNTDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlhNTCBzeW50YXggZm9yIFJERiBncmFwaHM8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJkZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm93bCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSJecmRmJCIgaXNyZWdleD0idHJ1ZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSJeb3dsJCIgaXNyZWdleD0idHJ1ZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhtcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZWdpbmZvK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmlmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJuYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVtb3RlLXByaW50aW5nIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmxkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yaXNjb3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JsbWkreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ycyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnNkK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnNkIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Jzcyt4bWwiPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC9yc3MiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icnNzIi8+CisgICAgICAgIDxyb290LVhNTCBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9wdXJsLm9yZy9yc3MvMS4wLyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJzcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ydGYiPgorICAgICAgICA8X2NvbW1lbnQ+UmljaCBUZXh0IEZvcm1hdCBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQvcnRmIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJ7XFxydGYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnRmIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ydHgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NhbWxhc3NlcnRpb24reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zYW1sbWV0YWRhdGEreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zYm1sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2JtbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zY3EiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2N2cC12cC1yZXF1ZXN0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcHEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVzcG9uc2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNwcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2RwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NldC1wYXltZW50Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZXRwYXkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24taW5pdGlhdGlvbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2V0cmVnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZ21sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZ21sLW9wZW4tY2F0YWxvZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2hmK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2hmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaWV2ZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2ltcGxlLWZpbHRlcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZS1tZXNzYWdlLXN1bW1hcnkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZXN5bWJvbGNvbnRhaW5lciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2xhdGUiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc21pbCt4bWwiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vc21pbCIvPgorICAgICAgICA8X2NvbW1lbnQ+U01JTCBNdWx0aW1lZGlhPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbWkiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbWlsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc21sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NsZHdvcmtzIj4KKyAgICAgICAgPF9jb21tZW50PlNvbGlkV29ya3MgQ0FEIHByb2dyYW08L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNsZHBydCIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbGRhc20iIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2xkZHJ3IiAvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIgLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3BhcnFsLXF1ZXJ5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ycSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcngiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NwaXJpdHMtZXZlbnQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcmdzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ncmFtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcmdzK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3J4bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NzbWwreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zc21sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi90aW1lc3RhbXAtcXVlcnkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1yZXBseSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdHZlLXRyaWdnZXIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3VscGZlYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdmVtbWkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZpdmlkZW5jZS5zY3JpcHRmaWxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5ic2YreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctbGFyZ2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBsYiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXNtYWxsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wc2IiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy12YXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB2YiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAuc21zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcDIuYmNtY3NpbmZvK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLnNtcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLnRjYXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRjYXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zbS5wb3N0LWl0LW5vdGVzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wd24iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmFzbyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNvIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5pbXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmltcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjdWNvYm9sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hY3UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb3JwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hdGMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hY3V0YyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFpci1hcHBsaWNhdGlvbi1pbnN0YWxsZXItcGFja2FnZSt6aXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5wcm9qZWN0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5hZnRlcmVmZmVjdHMudGVtcGxhdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFldCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhkcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLnhmZGYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhmZGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZXRoZXIuaW1wIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hemYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6cyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFtYXpvbi5lYm9vayI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXp3Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW1lcmljYW5keW5hbWljcy5hY2MiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFtaWdhLmFtaSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYW1pIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWNlcnRpZmljYXRlLWlzc3VlLWluaXRpYXRpb24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNpaSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1mdW5kcy10cmFuc2Zlci1pbml0aWF0aW9uIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbnRpeC5nYW1lLWNvbXBvbmVudCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXR4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBrZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaXdvcmsiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLmtleW5vdGUiPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJwcmVzZW50YXRpb24iIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9rZXlub3RlMiIgLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaXdvcmsiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioua2V5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUucGFnZXMiPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJkb2N1bWVudCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9uYW1lc3BhY2VzL3NsIiAvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pd29yayIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wYWdlcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLm51bWJlcnMiPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJkb2N1bWVudCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9uYW1lc3BhY2VzL2xzIiAvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pd29yayIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5udW1iZXJzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtaXdvcmtzLXByb3RlY3RlZCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLml3b3JrIiAvPgorICAgICAgICA8X2NvbW1lbnQ+UGFzc3dvcmQgUHJvdGVjdGVkIGlXb3JrcyBGaWxlPC9fY29tbWVudD4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFyYXN0cmEuc3dpIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zd2kiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hdWRpb2dyYXBoIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXV0b3BhY2thZ2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hdmlzdGFyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmJsdWVpY2UubXVsdGlwYXNzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ibHVldG9vdGguZXAub29iIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYm1pIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ibWkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5idXNpbmVzc29iamVjdHMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJlcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNhYi1qc2NyaXB0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2Fub24tY3BkbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNhbm9uLWxpcHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jZW5kaW8udGhpbmxpbmMuY2xpZW50Y29uZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNoZW1kcmF3K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2R4bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jaGlwbnV0cy5rYXJhb2tlLW1tZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW1kIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2R5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2lycGFjay5pc2RuLWV4dCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNsYXltb3JlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbGEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jbG9uay5jNGdyb3VwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jNGciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jNGQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jNGYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jNHAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jNHUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jb21tZXJjZS1iYXR0ZWxsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvbW1vbnNwYWNlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jc3AiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jb250YWN0LmNtc2ciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkYmNtc2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jb3Ntb2NhbGxlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY21jIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xreCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIua2V5Ym9hcmQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa2siLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnBhbGV0dGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3AiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnRlbXBsYXRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbGt0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci53b3JkYmFuayI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xrdyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaXRpY2FsdG9vbHMud2JzK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2JzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3RjLXBvc21sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdGN0LndzK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcGRmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wb3N0c2NyaXB0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wcGQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcmFzdGVyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1yYXciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXJsLmNhciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2FyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3VybC5wY3VybCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGN1cmwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jeWJhbmsiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kYXRhLXZpc2lvbi5yZHoiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJkeiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRlbm92by5mY3NlbGF5b3V0LWxpbmsiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZlX2xhdW5jaCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRpci1iaS5wbGF0ZS1kbC1ub3N1ZmZpeCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRuYSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG5hIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZG9sYnkubWxwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1vYmlsZS4yIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHBncmFwaCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHBnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kZmFjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmVzZ2NvbnRhaW5lciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjZGZ0bm90aWZhY2Nlc3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2VzZ2FjY2VzcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjcm9hbWluZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5pcHR2LmFsZmVjLWJhc2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXB0di5hbGZlYy1lbmhhbmNlbWVudCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1hZ2dyZWdhdGUtcm9vdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtY29udGFpbmVyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1nZW5lcmljK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pYS1tc2dsaXN0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pYS1yZWdpc3RyYXRpb24tcmVxdWVzdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtcmVnaXN0cmF0aW9uLXJlc3BvbnNlK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pbml0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR4ciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR5bmFnZW8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdlbyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjZGlzLXVwZGF0ZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5jaGFydCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWFnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGVyZXF1ZXN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGV1cGRhdGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3JlcXVlc3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzdXBkYXRlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZW1jbGllbnQuYWNjZXNzcmVxdWVzdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ubWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5lc2YiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVzZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLm1zZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24ucXVpY2thbmltZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucWFtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24uc2FsdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2x0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24uc3NmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zc2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcmljc3Nvbi5xdWlja2NhbGwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lc3ppZ25vMyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVzMyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV0MyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuYW9jK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuY3VnK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmNvbW1hbmQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2ZGlzY292ZXJ5K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnByb2ZpbGUreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2FkLWJjK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1jb2QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2FkLW5wdnIreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2dWVwcm9maWxlK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kubWNpZCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnNjaSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnNpbXNlcnZzK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV1ZG9yYS5kYXRhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXpwaXgtYWxidW0iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV6MiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV6cGl4LXBhY2thZ2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV6MyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmYtc2VjdXJlLm1vYmlsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZkZiI+CisgICAgICAgIDxhY3JvbnltPkZERjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkZvcm1zIERhdGEgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zvcm1zX0RhdGFfRm9ybWF0PC90aWthOmxpbms+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL3d3dy5hZG9iZS5jb20vZGV2bmV0L2Fjcm9iYXQvZmRmdG9vbGtpdC5odG1sPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20uYWRvYmUuZmRmPC90aWthOnV0aT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiVGREYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mZGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZHNuLm1zZWVkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc2VlZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZkc24uc2VlZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2VlZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhdGFsZXNzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmZzbnMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5maW50cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZsb2dyYXBoaXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdwaCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZsdXh0aW1lLmNsaXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0YyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZvbnQtZm9udGZvcmdlLXNmZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZyYW1lbWFrZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnJhbWUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYWtlciIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJvb2siLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mcm9nYW5zLmZuYyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZm5jIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5sdGYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmx0ZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZzYy53ZWJsYXVuY2giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZzYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9hcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vYTIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2EzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c2dwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mZzUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iaDIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guYXJ0LWV4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmFydDQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guaGJwbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kZGQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRkZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhkdyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MuYmluZGVyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54YmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdXQtbWlzbmV0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnV6enlzaGVldCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnpzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2Vub21hdGl4LnR1eGVkbyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHhkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEuZmlsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ2diIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEudG9vbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ2d0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2VvbWV0cnktZXhwbG9yZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdleCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdyZSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdteCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ214Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua21sK3htbCI+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImttbCIvPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2ttbC8yLjIiIGxvY2FsTmFtZT0ia21sIi8+CisgICAgICAgIDxyb290LVhNTCBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjAiIGxvY2FsTmFtZT0ia21sIi8+CisgICAgICAgIDxyb290LVhNTCBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjEiIGxvY2FsTmFtZT0ia21sIi8+CisgICAgICAgIDxyb290LVhNTCBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjIiIGxvY2FsTmFtZT0ia21sIi8+CisgICAgICAgIDxhY3JvbnltPktNTDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PktleWhvbGUgTWFya3VwIExhbmd1YWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rbWwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbXoiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtteiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyYWZlcSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3FmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3FzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3JpZG1wIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWFjY291bnQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdhYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1oZWxwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5naGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaWRlbnRpdHktbWVzc2FnZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ2ltIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWluamVjdG9yIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ncnYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC1tZXNzYWdlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ndG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC10ZW1wbGF0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHBsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXZjYXJkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52Y2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oYW5kaGVsZC1lbnRlcnRhaW5tZW50K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouem1tIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGJjaSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaGJjaSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhjbC1iaXJlcG9ydHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oaGUubGVzc29uLXBsYXllciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGVzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtaHBnbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHBnbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWhwaWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwaWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1ocHMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWpseXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpsdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLXBjbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGNsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtcGNseGwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjbHhsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHR0cGhvbmUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oeWRyb3N0YXRpeC5zb2YtZGF0YSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2ZkLWhkc3R4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHpuLTNkLWNyb3Nzd29yZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueDNkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLmFmcGxpbmVkYXRhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLmVsZWN0cm9uaWMtbWVkaWEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0ubWluaXBheSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXB5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWZwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGlzdGFmcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3QzODIwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLnJpZ2h0cy1tYW5hZ2VtZW50Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pcm0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2MiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pY2Nwcm9maWxlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pY2MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pY20iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pZ2xvYWRlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWdsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pdnAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLml2dSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmluZm9ybWVkY29udHJvbC5ybXMreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW5mb3JtaXgtdmlzaW9uYXJ5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHB3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHB4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5kaWdpYm94Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5ubmNwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50dS5xYm8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFibyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludHUucWZ4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xZngiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmNvbmNlcHRpdGVtK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlwdGMuZzIua25vd2xlZGdlaXRlbSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLm5ld3NpdGVtK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlwdGMuZzIucGFja2FnZWl0ZW0reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB1bnBsdWdnZWQucmNwcm9maWxlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yY3Byb2ZpbGUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcmVwb3NpdG9yeS5wYWNrYWdlK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaXJwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXMteHByIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54cHIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYW0iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWRpcmVjdG9yeS1zZXJ2aWNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtanBuc3RvcmUtd2FrZXVwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcGF5bWVudC13YWtldXAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb24td2FrZXVwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtc2V0c3RvcmUtd2FrZXVwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtdmVyaWZpY2F0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtdmVyaWZpY2F0aW9uLXdha2V1cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmpjcC5qYXZhbWUubWlkbGV0LXJtcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioucm1zIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamlzcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouamlzcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmpvb3N0LmpvZGEtYXJjaGl2ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouam9kYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmthaG9vdHoiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt0eiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt0ciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rYXJib24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmthcmJvbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtjaGFydCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWtjaGFydCIvPgorICAgICAgICA8X2NvbW1lbnQ+S0NoYXJ0IEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNocnQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rZm9ybXVsYSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioua2ZvIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua2l2aW8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsdyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtvbnRvdXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtvbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtwcmVzZW50ZXIiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1rcHJlc2VudGVyIi8+CisgICAgICAgIDxfY29tbWVudD5LUHJlc2VudGVyIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtwciIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtwdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtzcHJlYWQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1rc3ByZWFkIi8+CisgICAgICAgIDxfY29tbWVudD5LU3ByZWFkIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtzcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmt3b3JkIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gta3dvcmQiLz4KKyAgICAgICAgPF9jb21tZW50PktXb3JkIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt3ZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt3dCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2VuYW1lYWFwcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHRrZSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtpZHNwaXJhdGlvbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioua2lhIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2luYXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtuZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtucCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtvYW4iPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1rb2FuIi8+CisgICAgICAgIDxfY29tbWVudD5TU0VZTyBLb2FuIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtvZGFrLWRlc2NyaXB0b3IiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNzZSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxpYmVydHktcmVxdWVzdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5kZXNrdG9wIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sYmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5leGNoYW5nZSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxiZSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLTEtMi0zIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi4xMjMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1hcHByb2FjaCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXByIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtZnJlZWxhbmNlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcmUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1ub3RlcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubnNmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtb3JnYW5pemVyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vcmciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbSI+CisgICAgICAgIDwhLS0gPGdsb2IgcGF0dGVybj0iKi5zY20iLz4gLSBjb25mbGljdHMgd2l0aCB0ZXh0L3gtc2NoZW1lIC0tPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHBybyI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJXb3JkUHJvXDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJXb3JkUHJvXHJcMzczIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sd3AiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1hY3BvcnRzLnBvcnRwa2ciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvcnRwa2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmFjdGlvbnRva2VuK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1hcmxpbi5kcm0uY29uZnRva2VuK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1hcmxpbi5kcm0ubGljZW5zZSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLm1kY2YiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tY2QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1jZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1lZGNhbGNkYXRhIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYzEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZWRpYXN0YXRpb24uY2RrZXkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNka2V5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWVyaWRpYW4tc2xpbmdzaG90Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWZlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXdmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWZtcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWZtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5mbG8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsbyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguaWd4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pZ3giLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pZiI+CisgICAgICAgIDxfY29tbWVudD5GcmFtZU1ha2VyIEludGVyY2hhbmdlIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LW1pZiIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1mcmFtZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlckZpbGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01JRkZpbGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01ha2VyRGljdGlvbmFyeSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXJTY3JlZW5Gb250IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNTUwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O0Jvb2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01ha2VyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHgzY1x4NGRceDQ5XHg0Nlx4NDZceDY5XHg2Y1x4NjVceDIwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5taWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pbmRqZXQubWluZG1hbmFnZXIiPgorICAgICAgICA8X2NvbW1lbnQ+TWluZE1hbmFnZXI8L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tYXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbXB0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW1hdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tbXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbWFzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taW5pc29mdC1ocDMwMDAtc2F2ZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pdHN1YmlzaGkubWlzdHktZ3VhcmQudHJ1c3R3ZWIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGFmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kYWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGlzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubWJrIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYmsiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcXkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXNsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc2wiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMucGxjIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50eGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uYXBwbGljYXRpb24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wbiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vcGh1bi5jZXJ0aWZpY2F0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmFkc2kiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUuZmlzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmdvdGFwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmttciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS50dGMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUud2VtIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuaXBybSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vemlsbGEueHVsK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHVsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNpbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWFzZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWNhYi1jb21wcmVzc2VkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jYWIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiPgorICAgICAgICA8IS0tIFVzZSBEZWZhdWx0RGV0ZWN0b3IgLyBvcmcuYXBhY2hlLnRpa2EucGFyc2VyLm1pY3Jvc29mdC5QT0lGU0NvbnRhaW5lckRldGVjdG9yIGZvciBtb3JlIHJlbGlhYmxlIGRldGVjdGlvbiBvZiBPTEUyIGRvY3VtZW50cyAtLT4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL21zZXhjZWwiIC8+CisgICAgICAgIDxfY29tbWVudD5NaWNyb3NvZnQgRXhjZWwgU3ByZWFkc2hlZXQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTWljcm9zb2Z0XCBFeGNlbFwgNS4wXCBXb3Jrc2hlZXQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZvZ2xpb1wgZGlcIGxhdm9yb1wgTWljcm9zb2Z0XCBFeGNlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJCaWZmNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxMTQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQmlmZjUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMTIxIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4MDlceDA0XHgwNlx4MDBceDAwXHgwMFx4MTBceDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iV1x4MDBvXHgwMHJceDAwa1x4MDBiXHgwMG9ceDAwb1x4MDBrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bG0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bGEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bGMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bGwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bGQiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgQWRkLWluIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxhbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsc20iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IEV4Y2VsIDIwMDcgQmluYXJ5IFNwcmVhZHNoZWV0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHNiIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lb3QiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1odG1saGVscCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2htIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJJVFNGIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWltcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaW1zIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtbHJtIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5scm0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2siPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IE91dGxvb2sgTWVzc2FnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNnIiAvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtb3V0bG9vay1wc3QiPgorICAgICAgICA8X2NvbW1lbnQ+T3V0bG9vayBQZXJzb25hbCBGb2xkZXJzIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiFCRE4uLi4uU00iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3N0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jYXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc3RsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdGwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wbGF5cmVhZHkuaW5pdGlhdG9yK3htbCIvPgorCisgICAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IC0tPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiPgorICAgICAgICA8IS0tIFVzZSBEZWZhdWx0RGV0ZWN0b3IgLyBvcmcuYXBhY2hlLnRpa2EucGFyc2VyLm1pY3Jvc29mdC5QT0lGU0NvbnRhaW5lckRldGVjdG9yIGZvciBtb3JlIHJlbGlhYmxlIGRldGVjdGlvbiBvZiBPTEUyIGRvY3VtZW50cyAtLT4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL21zcG93ZXJwb2ludCIvPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFBvd2VycG9pbnQgUHJlc2VudGF0aW9uPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQXHgwMG9ceDAwd1x4MDBlXHgwMHJceDAwUFx4MDBvXHgwMGlceDAwblx4MDB0XHgwMCBEXHgwMG9ceDAwY1x4MDB1XHgwMG1ceDAwZVx4MDBuXHgwMHQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMTUyOjQwOTYiIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBweiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwYSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5hZGRpbi5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBBZGQtaW4gKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcGFtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnByZXNlbnRhdGlvbi5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwdG0iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbGRtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlc2hvdy5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBTbGlkZXNob3cgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcHNtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG90bSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcHJvamVjdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXB0Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcHJvamVjdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXB4Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNUFgsTWljcm9zb2Z0IFByb2plY3QgZm9yIFdpbmRvd3MsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXRuZWYiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbXMtdG5lZiIgLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MjIzZTlmNzgiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5saWMtY2hsZy1yZXEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5saWMtcmVzcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLm1ldGVyLWNobGctcmVxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubWV0ZXItcmVzcCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZC5kb2N1bWVudC5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIERvY3VtZW50IChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG9jbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIERvY3VtZW50IFRlbXBsYXRlIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG90bSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29ya3MiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1ceDAwYVx4MDB0XHgwME9ceDAwU1x4MDBUIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53cHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53a3MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53Y20iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53ZGIiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdwbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3BsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMteHBzZG9jdW1lbnQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vb3hwcyIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbiBYTUwgUGFwZXIgU3BlY2lmaWNhdGlvbjwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHBzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3hwcyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zZXEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZXEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tc2lnbiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11bHRpYWQuY3JlYXRvciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11bHRpYWQuY3JlYXRvci5jaWYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdXNpYy1uaWZmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXVzaWNpYW4iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm11cyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11dmVlLnN0eWxlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc3R5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmNkLmNvbnRyb2wiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uY2QucmVmZXJlbmNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmVydmFuYSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5ldGZweCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5ldXJvbGFuZ3VhZ2Uubmx1Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ubHUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1kaXJlY3RvcnkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5uZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioubm5zIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ubnciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jYXRhbG9ncyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3dieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuY29ubWwreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuaXNkcy1yYWRpby1wcmVzZXRzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuaXB0di5jb25maWcreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmsrd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFyayt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFya2NvbGxlY3Rpb24reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmFjK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5kYXRhIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5uZ2RhdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5zeW1iaWFuLmluc3RhbGwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm4tZ2FnZSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm5jZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLnBjZCt3YnhtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLnBjZCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJwc3QiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXRzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ycHNzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWRtIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lZG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVkeCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmV4dCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXh0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBPcGVuIERvY3VtZW50IEZvcm1hdCBmb3IgT2ZmaWNlIEFwcGxpY2F0aW9ucyAoT3BlbkRvY3VtZW50KSB2MS4wICAgIC0tPgorICAgIDwhLS0gaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9zcGVjcy9pbmRleC5waHAjb3BlbmRvY3VtZW50djEuMCAgICAgICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ii8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogQ2hhcnQgZG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGUiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBDaGFydCBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGUiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3RjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZGF0YWJhc2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kYiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBGb3JtdWxhIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2RmIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vemlwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYS10ZW1wbGF0ZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYS10ZW1wbGF0ZSIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEZvcm11bGEgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2RmdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEdyYXBoaWNzIGRvY3VtZW50IChEcmF3aW5nKTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEdyYXBoaWNzIGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdGciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBJbWFnZSBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kaSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlLXRlbXBsYXRlIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEltYWdlIGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFByZXNlbnRhdGlvbiBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbi10ZW1wbGF0ZSIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFByZXNlbnRhdGlvbiBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90cCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFNwcmVhZHNoZWV0IGRvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2RzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGUiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIi8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogU3ByZWFkc2hlZXQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90cyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHbG9iYWwgVGV4dCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90bSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90dCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFRleHQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZSBmb3IgSFRNTCBkb2N1bWVudHM8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdGgiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9ibiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9scGMtc3VnYXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhvIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtY29uZmlnIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtaHR0cC1yZXF1ZXN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtaHR0cC1yZXNwb25zZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5hc3NvY2lhdGVkLXByb2NlZHVyZS1wYXJhbWV0ZXIreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LmRybS10cmlnZ2VyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5pbWQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lmx0a20iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Qubm90aWZpY2F0aW9uK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5wcm92aXNpb25pbmd0cmlnZ2VyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnYm9vdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zZ2RkK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zZ2R1Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNpbXBsZS1zeW1ib2wtY29udGFpbmVyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNtYXJ0Y2FyZC10cmlnZ2VyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zcHJvdit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3RrbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kY2QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGNkYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kZDIreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kZDIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpc2QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmdyb3VwLXVzYWdlLWxpc3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5kZXRhaWxlZC1wcm9ncmVzcy1yZXBvcnQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5maW5hbC1yZXBvcnQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5ncm91cHMreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5pbnZvY2F0aW9uLWRlc2NyaXB0b3IreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5vcHRpbWl6ZWQtcHJvZ3Jlc3MtcmVwb3J0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS54Y2FwLWRpcmVjdG9yeSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1lbWFpbCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1maWxlK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYWRzLWZvbGRlcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0Ii8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVub2ZmaWNlb3JnLmV4dGVuc2lvbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3h0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24iPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbjwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHB0eCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRobXgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbGR4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZSI+CisgICAgICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgUHJlc2VudGF0aW9uIFRlbXBsYXRlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wb3R4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3ciPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBTbGlkZXNob3c8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwc3giLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFdvcmtib29rPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHN4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGx0eCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayBUZW1wbGF0ZSAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsdG0iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIERvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kb2N4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudCBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG90eCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NhLm5ldGRlcGxveSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9zZ2kuYnVuZGxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NnaS5kcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vdHBzLmN0LWtpcCt4bWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBhbG0iPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49IioucGRiIi8+IC0gY29uZmxpY3RzIHdpdGggY2hlbWljYWwveC1wZGIgLS0+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHFhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3ByYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGFvcy54bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wZy5mb3JtYXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWk2Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGlhY2Nlc3MuYXBwbGljYXRpb24tbGljZW5jZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBpY3NlbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWZpZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvYy5ncm91cC1hZHZlcnRpc2VtZW50K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wYmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2LXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNy1zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNzUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3NS1zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHJlbWluZXQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcmV2aWV3c3lzdGVtcy5ib3giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJveCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnByb3RldXMubWFnYXppbmUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1neiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB1Ymxpc2hhcmUtZGVsdGEtdHJlZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXBzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHZpLnB0aWQxIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wdGlkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHdnLW11bHRpcGxleGVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHdnLXhodG1sLXByaW50K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnF1YWxjb21tLmJyZXctYXBwLXJlcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnF1YXJrLnF1YXJreHByZXNzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xeGQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xeHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xd2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xd3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xeGwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xeGIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yYXBpZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXhsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXVzaWN4bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZW5sZWFybi5ybHByaW50Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucmltLmNvZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY29kIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ybi1yZWFsbWVkaWEiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLlJNRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioucm0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJvdXRlNjYubGluazY2K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGluazY2Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucnVja3VzLmRvd25sb2FkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuczNzbXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zYm0uY2lkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2JtLm1pZDIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zY3JpYnVzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLjNkZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5jc2YiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQuZG9jIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmVtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5taHQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQubmV0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnBwdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC50aWZmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnhscyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmh0bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5wZGYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZWUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZW1hIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZW1hIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VtZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2VtZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlbWYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlbWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWZtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybXRlbXBsYXRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pdHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWlmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaXBrIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2ltdGVjaC1taW5kbWFwcGVyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50d2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50d2RzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc21hZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW1mIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc21hcnQudGVhY2hlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGVhY2hlciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNvZnR3YXJlNjAyLmZpbGxlci5mb3JtK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNvZnR3YXJlNjAyLmZpbGxlci5mb3JtLXhtbC16aXAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2xlbnQuc2RrbSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNka20iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZGtkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5keHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5zZnMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNmcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNzcy1jb2QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zc3MtZHRmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3NzLW50ZiIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1zdGFyb2ZmaWNlIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU3RhckNhbGMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDQ4OjIyMDciIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etc3Rhcm9mZmljZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlN0YXJEcmF3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA0ODoyMjA3IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZGEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLXN0YXJvZmZpY2UiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJTdGFySW1wcmVzcyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwNDg6MjIwNyIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2RkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNtZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1zdGFyb2ZmaWNlIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU3RhcldyaXRlciIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwNDg6MjIwNyIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2R3Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0YXJvZmZpY2UtdGVtcGxhdGUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1zdGFyb2ZmaWNlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioudm9yIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlci1nbG9iYWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RyZWV0LXN0cmVhbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3hjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN4ZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3RkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zeGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MudGVtcGxhdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0aSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3htIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5zdW4ueG1sLndyaXRlciIvPgorICAgICAgICA8X2NvbW1lbnQ+T3Blbk9mZmljZSB2MS4wOiBXcml0ZXIgRG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN4dyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zeGciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3R3Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VzLWNhbGVuZGFyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdXMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdXNwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3ZkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zd2lmdHZpZXctaWNzIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW1iaWFuLmluc3RhbGwiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDAwMDQxOSIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iOCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaXMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaXN4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54c20iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0rd2J4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJkbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhkbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbS5ub3RpZmljYXRpb24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudGFvLmludGVudC1tb2R1bGUtYXJjaGl2ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGFvIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50Y3BkdW1wLnBjYXAiPgorICAgICAgICA8X2NvbW1lbnQ+VENQRHVtcCBwY2FwIHBhY2tldCBjYXB0dXJlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4YTFiMmMzZDQiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDRjM2IyYTEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGNhcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNhcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRtcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudG1vYmlsZS1saXZldHYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRtbyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRyaWQudHB0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50cHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50cmlzY2FwZS5teHMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14cyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRydWVhcHAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRyYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRydWVkb2MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51ZmRsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51ZmQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51ZmRsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudWlxLnRoZW1lIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51dHoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51bWFqaW4iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVtaiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVuaXR5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51bml0eXdlYiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVvbWwreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51b21sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQtd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2Utd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3AiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Qtd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQtd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnNpZ25hbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZjeCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudmN4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmQtc3R1ZHkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52ZWN0b3J3b3JrcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZpZHNvZnQudmlkY29uZmVyZW5jZSIvPgorCisgICAgPCEtLSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL3ZuZC52aXNpbyAtLT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52aXNpbyI+CisgICAgICAgIDxfY29tbWVudD5NaWNyb3NvZnQgVmlzaW8gRGlhZ3JhbTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnNkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnNzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnN3Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52aXNpb25hcnkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZpcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZpdmlkZW5jZS5zY3JpcHRmaWxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudnNmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52c2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLnNsYyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53YnhtbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiPgorICAgICAgICA8X2NvbW1lbnQ+Q29tcGlsZWQgV01MIERvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWxjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAud21sc2NyaXB0YyI+CisgICAgICAgIDxfY29tbWVudD5Db21waWxlZCBXTUwgU2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWxzYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2VidHVyYm8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnd0YiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndmYS53c2MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53bWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53bWYuYm9vdHN0cmFwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3QiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vd29yZHBlcmZlY3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53cGQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53cWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndxZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndycS1ocDMwMDAtbGFiZWxsZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53dC5zdGYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnd2LmNzcCt3YnhtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnd2LmNzcCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53di5zc3AreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueGFyYSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGFyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueGZkbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGZkbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhmZGwud2ViZm9ybSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtaSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5jcGtnIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUuZHBrZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLnBsYW4iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5wcGtnIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUueGxpbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1kaWMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh2ZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1zY3JpcHQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh2cyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi12b2ljZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHZwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3NmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdC5vc2ZwdmcreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vc2ZwdmciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuc21hZi1hdWRpbyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55ZWxsb3dyaXZlci1jdXN0b20tbWVudSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY21wIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuenVsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi56aXIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi56aXJ6Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuenphenouZGVjayt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnpheiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm9pY2V4bWwreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52eG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93YXRjaGVyaW5mbyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dob2lzcHAtcXVlcnkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dob2lzcHAtcmVzcG9uc2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dpbmhscCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaGxwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aXRhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93b3JkcGVyZmVjdDUuMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd3NkbCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndzZGwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dzcG9saWN5K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3Nwb2xpY3kiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC0xMjMiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwMWEwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwMDIwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hYml3b3JkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hYnciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWNlLWNvbXByZXNzZWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWF4Y3J5cHQiPgorICAgICAgICA8X2NvbW1lbnQ+QXhDcnlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXh4IiAvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDwhLS0gQXhDcnlwdCBibG9jayBoZWFkZXIsIHNraXAgbGVuZ3RoIGZpZWxkLCB0aGVuIEhlYWRlciBvZiB0eXBlIFByZWFtYmxlIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGMwYjkwNzJlNGY5M2YxNDZhMDE1NzkyY2ExZDllODIxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIyIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxNyIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWRvYmUtaW5kZXNpZ24iPgorICAgICAgICA8YWNyb255bT5JTkREPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+QWRvYmUgSW5EZXNpZ24gZG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmluZGQiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDYwNmVkZjVkODFkNDZlNWJkMzFlZmU3ZmU3NGI3MWQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFkb2JlLWluZGVzaWduLWludGVyY2hhbmdlIj4KKyAgICAgICAgPGFjcm9ueW0+SU5YPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+QWRvYmUgSW5EZXNpZ24gSW50ZXJjaGFuZ2UgZm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDs/YWlkIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDoxMDAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pbngiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hcHBsZS1kaXNraW1hZ2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRtZyIvPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49IiouaW1nIi8+IHRvbyBnZW5lcmljIC0tPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49Iiouc21pIi8+IGNvbmZsaWN0cyB3aXRoIFNNSUwgLS0+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXBwbGV3b3JrcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3drIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXJjaGl2ZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXVuaXgtYXJjaGl2ZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iPSZsdDthciZndDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiEmbHQ7YXJjaCZndDtcbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hciIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmEiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hcmoiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1hcmotY29tcHJlc3NlZCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg2MGVhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hcmoiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hdXRob3J3YXJlLWJpbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWFiIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueDMyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudTMyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioudm94Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtbWFwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hYW0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1zZWciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJjcGlvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iY3BpbyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJlcmtlbGV5LWRiIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNjE1NjEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNjE1NjEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNjE1NjEiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQyMjUzIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MjI1MyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MjI1MyIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MDk4OCIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDA5ODgiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDA5ODgiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJpYnRleC10ZXh0LWZpbGUiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJVwgQmliVGVYXCBgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIlJSVcIFwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNzMiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJVwgQmliVGVYXCBzdGFuZGFyZFwgYmlibGlvZ3JhcGh5XCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiUlJVwgXCBAQmliVGVYLXN0eWxlLWZpbGV7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNzMiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQGFydGljbGV7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAYm9va3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkBpbmJvb2t7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAaW5jb2xsZWN0aW9ueyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQGlucHJvY2VlZGluZ3N7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAbWFudWFseyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQG1pc2N7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAcHJlYW1ibGV7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAcGhkdGhlc2lzeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQHRlY2hyZXBvcnR7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAdW5wdWJsaXNoZWR7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJpYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJpYnRleCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJpdHRvcnJlbnQiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZDg6YW5ub3VuY2UiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudG9ycmVudCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJwbGlzdCI+CisgICAgICAgIDwhLS0gVGhlIHByaW9yaXR5IGlzIDYwLCBhcyAud2ViYXJjaGl2ZSBmaWxlcyBvZnRlbiBjb250YWluCisgICAgICAgICAoWClIVE1MIGNvbnRlbnQuIFRoZSBicGxpc3QgbWFnaWMgbXVzdCB0cnVtcCB0aGUgWEhUTUwKKyAgICAgICAgIG1hZ2ljcyBmdXJ0aGVyIHdpdGhpbiB0aGUgZmlsZS4gVGhpcyBtdXN0IGFsc28gYmUKKyAgICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBpbnRlcm5hbCBvcmRlcmluZyBvZiBwYXR0ZXJucyB3aXRoaW4KKyAgICAgICAgIE1pbWVUeXBlcyAtLT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImJwbGlzdCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iemlwIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkJaaCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ieiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRieiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAyIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAiLz4KKyAgICAgICAgPF9jb21tZW50PkJ6aXAgMiBVTklYIENvbXByZXNzZWQgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceDQyXHg1YVx4NjhceDM5XHgzMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iejIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50YnoyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYm96Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY2RsaW5rIj4KKyAgICAgICAgPF9jb21tZW50PlZpcnR1YWwgQ0QtUk9NIENEIEltYWdlIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjZCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNoYXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNoYXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaGVzcy1wZ24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBnbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNocm9tZS1wYWNrYWdlIj4KKyAgICAgICAgPGFjcm9ueW0+Q1JYPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+Q2hyb21lIEV4dGVuc2lvbiBQYWNrYWdlPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvY3J4PC90aWthOmxpbms+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJDcjI0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNyeCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNvbXByZXNzIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwwMzdcMjM1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnoiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb3JlbHByZXNlbnRhdGlvbnMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNodyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNwaW8iPgorICAgICAgICA8X2NvbW1lbnQ+VU5JWCBDUElPIEFyY2hpdmU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzA3IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwNyIgdHlwZT0iYmlnMTYiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNwaW8iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jc2giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzaCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRjc2giLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1hcmNoaXZlIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIhJmx0O2FyY2gmZ3Q7XG5kZWJpYW4tYmluYXJ5IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVkZWIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kZXgiPgorICAgICAgICA8YWNyb255bT5ERVg8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5EYWx2aWsgRXhlY3V0YWJsZSBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy90ZWNoL2RhbHZpay9kZXgtZm9ybWF0Lmh0bWw8L3Rpa2E6bGluaz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImRleFxuIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjciLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGV4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiPgorICAgICAgICA8X2NvbW1lbnQ+U2hvY2t3YXZlIE1vdmllPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaXIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kY3IiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5keHIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jc3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jY3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jeHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53M2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mZ2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zd2EiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kb29tIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53YWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHRibmN4K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubmN4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR0Ym9vayt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0YiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdGJyZXNvdXJjZSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJlcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR2aSI+CisgICAgICAgIDxfY29tbWVudD5UZVggRGV2aWNlIEluZGVwZW5kZW50IERvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwzNjdcMDAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAyZjciIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHgxYlx4MjBceDU0XHg2NVx4NThceDIwXHg2Zlx4NzVceDc0XHg3MFx4NzVceDc0XHgyMCIKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kdmkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1lbGMiPgorICAgICAgICA8X2NvbW1lbnQ+RW1hY3MgTGlzcCBieXRlY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPCEtLSBFbWFjcyAxOCAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDAxMigiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPCEtLSBFbWFjcyAxOSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iO0VMQ1wwMjNcMDAwXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVsYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWVsZiI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMTc3RUxGIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS94LWVtbHgiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjcwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5SZWxheS1WZXJzaW9uOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcbiMhXCBybmV3cyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcbk4jIVwgcm5ld3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5Gb3J3YXJkXCB0byIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcblBpcGVcIHRvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo5Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxuUmV0dXJuLVBhdGg6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo5Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxuRnJvbToiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5SZWNlaXZlZDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5NZXNzYWdlLUlEOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcbkRhdGU6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo5Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZW1seCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWtpbGx1c3RyYXRvciI+CisgICAgICAgIDxfY29tbWVudD5LSWxsdXN0cmF0b3IgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioua2lsIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtb2JqZWN0Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWVsZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDE3N0VMRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMTAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTYiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1leGVjdXRhYmxlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWVsZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDE3N0VMRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMjAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTYiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zaGFyZWRsaWIiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtZWxmIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMTc3RUxGIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAzMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxNiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTYiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNvcmVkdW1wIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWVsZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDE3N0VMRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwNDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTYiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWRvc2V4ZWMiPgorICAgICAgICA8X2NvbW1lbnQ+RE9TL1dpbmRvd3MgZXhlY3V0YWJsZSAoRVhFKTwvX2NvbW1lbnQ+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXhlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZW1mIj4KKyAgICAgICAgPGFjcm9ueW0+RU1GPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RXh0ZW5kZWQgTWV0YWZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMTAwMDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1maWxlbWFrZXIiPgorICAgICAgICA8YWNyb255bT5GUDc8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5GaWxlTWFrZXIgUHJvIDc8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhDMDQ4NDI0MTREMzciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxNCIgPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg0ODQyNDE0RDMyMzEzMDMxNEY0MzU0MzkzOUMxMDI0ODA3NTA3MjZGMjAzNzJFMzBDMEMwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNTI1IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mcDciIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1iZGYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJkZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWRvcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWZyYW1lbWFrZXIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1naG9zdHNjcmlwdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3NmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtbGliZ3J4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtbGludXgtcHNmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wc2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LW90ZiI+CisgICAgICAgIDxhY3JvbnltPk9URjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5UeXBlIEZvbnQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90ZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtcGNmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wY2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zbmYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNuZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXNwZWVkbyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXN1bm9zLW5ld3MiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXR0ZiI+CisgICAgICAgIDxhY3JvbnltPlRURjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlRydWVUeXBlIEZvbnQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR0ZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR0YyIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAxMDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXR5cGUxIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZmEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZmIiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIE1hdGNoIGZvciBQRkIsIHRoZSBiaW5hcnkgZm9ybWF0IC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceDgwXHgwMVx4RkZceEZGXHgwMFx4MDAlIVBTLUFkb2JlRm9udCIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRjAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIE1hdGNoIGZvciBQRkEsIHRoZSB0ZXh0IGZvcm1hdCIgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiUhUFMtQWRvYmVGb250LTEuMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1hZG9iZS1tZXRyaWMiPgorICAgICAgICA8X2NvbW1lbnQ+QWRvYmUgRm9udCBNZXRyaWM8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFmbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjZm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hbWZtIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJTdGFydEZvbnRNZXRyaWNzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtcHJpbnRlci1tZXRyaWMiPgorICAgICAgICA8X2NvbW1lbnQ+UHJpbnRlciBGb250IE1ldHJpYzwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGZtIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDFGRkZGMDAwMDQzNmY3MDc5NzIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRjAwMDBGRkZGRkZGRkZGRkZGRiIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXZmb250Ii8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm94bWFpbCI+CisgICAgICAgIDxfY29tbWVudD5Gb3htYWlsIEVtYWlsIEZpbGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MTAxMDEwMTAxMDEwMTAxMTExMTExMTExMTE1MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giPgorICAgICAgICA8X2NvbW1lbnQ+TWFjcm9tZWRpYSBGdXR1cmVTcGxhc2ggRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3BsIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ251Y2FzaCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ251Y2FzaCIgLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1nbnVtZXJpYyI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LUdudW1lcmljLXNwcmVhZHNoZWV0Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI9Jmx0O2dtcjpXb3JrYm9vayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjM5IiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdudW1lcmljIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ3RhciI+CisgICAgICAgIDxfY29tbWVudD5HTlUgdGFyIENvbXByZXNzZWQgRmlsZSBBcmNoaXZlIChHTlUgVGFwZSBBcmNoaXZlKTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPCEtLSBHTlUgdGFyIGFyY2hpdmUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9InVzdGFyICBcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI1NyIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ndGFyIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10YXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZ3ppcCI+CisgICAgICAgIDxfY29tbWVudD5HemlwIENvbXByZXNzZWQgQXJjaGl2ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWd6aXAiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ3VuemlwIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9nemlwLWNvbXByZXNzZWQiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2d6aXBwZWQiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2d6aXAtY29tcHJlc3NlZCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1nemlwLWNvbXByZXNzZWQiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9Imd6aXAvZG9jdW1lbnQiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI0NSI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwwMzdcMjEzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHgxZlx4OGIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRneiIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5neiIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi1neiIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lbXoiIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaGRmIj4KKyAgICAgICAgPF9jb21tZW50PkhpZXJhcmNoaWNhbCBEYXRhIEZvcm1hdCBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8IS0tIEhERjQgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MGUwMzEzMDEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gSERGNSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDIxMUhERlxyXG5cMDMyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhkZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhlNSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmg1Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaHdwIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8IS0tCisgICAgICAgIFRJS0EtMzMwOiBEZXRlY3Rpb24gcGF0dGVybiBiYXNlZCBvbiBzaWduYXR1cmUgc3RyaW5ncyBmcm9tCisgICAgICAgIHRoZSBod3BmaWx0ZXIvc291cmNlL2h3cGZpbGUuY3BwIGZpbGUgaW4gT3Blbk9mZmljZS5vcmcuCisgICAgICAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iSFdQIERvY3VtZW50IEZpbGUgViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1pYm9va3MremlwIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9lcHViK3ppcCIgLz4KKyAgICAgICAgPGFjcm9ueW0+aUJvb2tzPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+QXBwbGUgaUJvb2tzIEF1dGhvciBwdWJsaWNhdGlvbiBmb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDAzXDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi94LWlib29rcyt6aXAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pYm9va3MiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1pc285NjYwLWltYWdlIj4KKyAgICAgICAgPGFjcm9ueW0+SVNPPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+SVNPIDk2NjAgQ0QtUk9NIGZpbGVzeXN0ZW0gZGF0YTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJDRDAwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMyNzY5Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkNEMDAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzQ4MTciLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQ0QwMDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzNjg2NSIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlzbyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWl0dW5lcy1pcGEiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgICAgICA8X2NvbW1lbnQ+QXBwbGUgaU9TIElQQSBBcHBTdG9yZSBmaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pcGEiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1qYXZhLWpubHAtZmlsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouam5scCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWphdmEtcGFjazIwMCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGFjayIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWtkZWxuayI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJbS0RFXCBEZXNrdG9wXCBFbnRyeV0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiNcIEtERVwgQ29uZmlnXCBGaWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWxhdGV4Ij4KKyAgICAgICAgPF9jb21tZW50PkxhVGVYIFNvdXJjZSBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIlXCAtKi1sYXRleC0qLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sYXRleCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbGhhIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1senMtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGhcNDAtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGhkLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDMtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGg0LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGg3LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1saGFyYyI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGgwLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1sejQtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbHo1LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcmMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tb2JpIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zLWFwcGxpY2F0aW9uIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hcHBsaWNhdGlvbiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy13bWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy13bXoiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ3ppcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndteiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy14YmFwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54YmFwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zYWNjZXNzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZGIiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMTAwMDA1Mzc0NjE2ZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNiaW5kZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9iZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2NhcmRmaWxlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNjbGlwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kbGwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jb20iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iYXQiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1aIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zLWluc3RhbGxlciI+CisgICAgICAgIDxfY29tbWVudD5NaWNyb3NvZnQgV2luZG93cyBJbnN0YWxsZXI8L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC13aW5kb3dzLWluc3RhbGxlciIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1tc2kiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc2kiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc3AiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc3QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkO2Zvcm1hdD1wZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTUiPgorICAgICAgICAgICAgPCEtLSBUZWNobmljYWxseSB0aGUgaGVhZGVyIG9mZnNldCBpcyBzdG9yZWQgYXQgMHgzYywgYW5kIGlzbid0IGEgLS0+CisgICAgICAgICAgICA8IS0tIGNvbnN0YW50LCBidXQgaXQncyBhbG1vc3QgYWx3YXlzIHNldCB0byBzdGFydCBhdCAweDgwIG9yIDB4ZjAgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMjgiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI0MCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDwhLS0gdGhlIFBFIGhlYWRlciBzaG91bGQgYmUgUEV4MDB4MDAgdGhlbiBhIHR3byBieXRlIG1hY2hpbmUgdHlwZSAtLT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUzMiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkO2Zvcm1hdD1wZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEyOCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAxNGMiIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjEzMiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI0MCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAxNGMiIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjI0NCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGU2NCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkO2Zvcm1hdD1wZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEyOCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDg2NjQiIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjEzMiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI0MCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDg2NjQiIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjI0NCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUtaXRhbml1bSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkO2Zvcm1hdD1wZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjEyOCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAyMDAiIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjEzMiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEVcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI0MCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAyMDAiIHR5cGU9ImxpdHRsZTE2IiBvZmZzZXQ9IjI0NCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUtYXJtTEUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9InBlXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMWMwIiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIxMzIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9InBlXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNDAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMWMwIiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIyNDQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlLWFybTciPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9InBlXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMWM0IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIxMzIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9InBlXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNDAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMWM0IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIyNDQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNtZWRpYXZpZXciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm12YiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0xMyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0xNCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc21ldGFmaWxlIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtd21mIi8+CisgICAgICAgIDxhY3JvbnltPldNRjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PldpbmRvd3MgTWV0YWZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkN2NkYzY5YTAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDEwMDA5MDAwMDAzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc21vbmV5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbnkiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMTAwMDA0RDUzNDk1MzQxNEQyMDQ0NjE3NDYxNjI2MTczNjUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc3B1Ymxpc2hlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHViIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zc2NoZWR1bGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50cm0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXN3cml0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3JpIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW5ldGNkZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubmMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGtjczEyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wMTIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZngiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGtjczctY2VydGlmaWNhdGVzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wN2IiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGtjczctY2VydHJlcXJlc3AiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnA3ciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXBydCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHJ0Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIwTTNDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iOCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1xdWF0dHJvLXBybyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXB3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2IxIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2IyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2IzIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQiPgorICAgICAgICA8X2NvbW1lbnQ+UkFSIGFyY2hpdmU8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1yYXIiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlJhciEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4NTJceDYxXHg3Mlx4MjFceDFhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXJveGlvLXRvYXN0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50b2FzdCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXJwbSI+CisgICAgICAgIDxfY29tbWVudD5SZWRIYXQgUGFja2FnZSBNYW5hZ2VyPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ycG0iLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4ZWRceGFiXHhlZVx4ZGIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzIj4KKyAgICAgICAgPF9jb21tZW50PlNBUyBQcm9ncmFtPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1wcm9ncmFtLWRhdGEiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIFN0b3JlZCBQcm9ncmFtIChEQVRBIFN0ZXApPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zczciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YnBnbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtYXVkaXQiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIEF1ZGl0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdDciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YmF1ZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtZGF0YSI+CisgICAgICAgIDxfY29tbWVudD5TQVMgRGF0YSBTZXQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiZGF0Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJTQVMgRklMRSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9Ijg0IiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtdmlldyI+CisgICAgICAgIDxfY29tbWVudD5TQVMgRGF0YSBTZXQgVmlldzwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3Y3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2J2ZXciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLWRhdGEtaW5kZXgiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIERhdGEgU2V0IEluZGV4PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaTciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3Ym5keCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtY2F0YWxvZyI+CisgICAgICAgIDxfY29tbWVudD5TQVMgQ2F0YWxvZzwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2M3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2JjYXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLWFjY2VzcyI+CisgICAgICAgIDxfY29tbWVudD5TQVMgQWNjZXNzIERlc2NyaXB0b3I8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiYWNzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1mZGIiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIEZEQiBDb25zb2xpZGF0aW9uIERhdGFiYXNlIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNmNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiZmRiIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1tZGRiIj4KKyAgICAgICAgPF9jb21tZW50PlNBUyBNRERCIE11bHRpLURpbWVuc2lvbmFsIERhdGFiYXNlIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNtNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdibWRiIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1kbWRiIj4KKyAgICAgICAgPF9jb21tZW50PlNBUyBETURCIERhdGEgTWluaW5nIERhdGFiYXNlIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnM3bSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiZG1kIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1pdGVtc3RvciI+CisgICAgICAgIDxfY29tbWVudD5TQVMgSXRlbSBTdG9yZSAoSXRlbVN0b3IpIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiaXRtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy11dGlsaXR5Ij4KKyAgICAgICAgPF9jb21tZW50PlNBUyBVdGlsaXR5PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdTciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YnV0bCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtcHV0aWxpdHkiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIFBlcm1hbmVudCBVdGlsaXR5PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcDciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YnB1dCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtdHJhbnNwb3J0Ij4KKyAgICAgICAgPF9jb21tZW50PlNBUyBUcmFuc3BvcnQgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3R4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1iYWNrdXAiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIEJhY2t1cDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2JiYWsiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYyI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJTcHJlYWRzaGVldCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjM4Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2giPgorICAgICAgICA8X2NvbW1lbnQ+VU5JWC9MSU5VWCBTaGVsbCBTY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIVwgLyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyFcdC8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImV2YWwgJnF1b3Q7ZXhlYyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJhc2giLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hhciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2hhciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI+CisgICAgICAgIDxhY3JvbnltPkZsYXNoPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+QWRvYmUgRmxhc2g8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRldTIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIEYgPSBVbmNvbXByZXNzZWQgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkNXUyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBDID0gQ29tcHJlc3NlZCAgIC0tPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN3ZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNpbHZlcmxpZ2h0LWFwcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGFwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJTdHVmZkl0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXR4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaXR4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN2NGNwaW8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN2NGNwaW8iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc3Y0Y3JjIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdjRjcmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10YXIiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDwhLS0gUE9TSVggdGFyIGFyY2hpdmUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9InVzdGFyXDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNTciIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGFyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4Ij4KKyAgICAgICAgPF9jb21tZW50PlRlWCBTb3VyY2U8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC94LXRleCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxpbnB1dCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxzZWN0aW9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcXHNldGxlbmd0aCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxkb2N1bWVudHN0eWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcXGNoYXB0ZXIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxcZG9jdW1lbnRjbGFzcyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxyZWxheCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxjb250ZW50c2xpbmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGV4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4LXRmbSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGZtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4aW5mbyI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtdGV4aW5mbyIgLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxcaW5wdXRcIHRleGluZm8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGV4aW5mbyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIE1pY3Jvc29mdCBPZmZpY2UgYmluYXJ5IGZpbGUgZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaW50ZXJvcC9kb2NzL09mZmljZUJpbmFyeUZvcm1hdHMubXNweCAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlLWVtYmVkZGVkIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZS1lbWJlZGRlZDtmb3JtYXQ9b2xlMTBfbmF0aXZlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UtZW1iZWRkZWQiLz4KKyAgICAgICAgPF9jb21tZW50Pk9MRTEwIE5hdGl2ZSBFbWJlZGRlZCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UtZW1iZWRkZWQ7Zm9ybWF0PWNvbXBfb2JqIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UtZW1iZWRkZWQiLz4KKyAgICAgICAgPF9jb21tZW50PkNvbXBPYmogT0xFMiBFbWJlZGRlZCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc3dvcmtzLXNwcmVhZHNoZWV0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHIiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiLz4KKyAgICAgICAgPCEtLSB0aGlzIGhhcyB0byBiZSBoaWdodGVyIHRoYW4gdGhlIEV4Y2VsIG1hdGNoIC0tPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IldceDAwa1x4MDBzXHgwMFNceDAwU1x4MDBXXHgwMG9ceDAwclx4MDBrXHgwMEJceDAwb1x4MDBvXHgwMGsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMTUyOjQwOTYiIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gT2ZmaWNlIE9wZW4gWE1MIGZpbGUgZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvc3RhbmRhcmRzL0VjbWEtMzc2Lmh0bSAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDAzXDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iW0NvbnRlbnRfVHlwZXNdLnhtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPCEtLSBOb3RlIC0gcGFzc3dvcmQgcHJvdGVjdGVkIE9PWE1MIGZpbGVzIGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gLS0+CisgICAgPCEtLSAgYW4gT0xFMiAoYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlKSBjb250YWluZXIgLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwtcHJvdGVjdGVkIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICAgICAgPF9jb21tZW50PlBhc3N3b3JkIFByb3RlY3RlZCBPT1hNTCBGaWxlPC9fY29tbWVudD4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDwhLS0gT2xkZXIgU3Rhck9mZmljZSBmb3JtYXRzIGV4dGVuZCB1cCB0aGUgTWljcm9zb2Z0IE9MRTIgZm9ybWF0IC0tPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLXN0YXJvZmZpY2UiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXVjMi1jb21wcmVzc2VkIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlVDMlx4MWEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVjMiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC11c3RhciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudXN0YXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC12bWRrIj4KKyAgICAgICAgPGFjcm9ueW0+Vk1ESzwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlZpcnR1YWwgRGlzayBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVk1ESzwvdGlrYTpsaW5rPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZtZGsiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3JjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXdlYmFyY2hpdmUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtYnBsaXN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2ViYXJjaGl2ZSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlciIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNydCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14ZmlnIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maWciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gteHBpbnN0YWxsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54cGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14bWluZCI+CisgICAgICAgIDxfY29tbWVudD5YTWluZCBQcm88L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhtaW5kIi8+CisgICAgICAgIDwhLS0gLnhtYXAgaXMgYWxzbyB1c2VkLCBidXQgdGhhdCBleHRlbnNpb24gaXMgbW9yZSBjb21tb24gZWxzZXdoZXJlIC0tPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49IioueG1hcCIvPiAtLT4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14eiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHoiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwzNzU3elhaXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC16b28iPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZGM0YTdkYyIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi56b28iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veDQwMC1icCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1hdHQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWNhcHMreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWVsK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1lcnJvcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtbnMreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y29uLWNvbmZlcmVuY2UtaW5mby1kaWZmK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNvbi1jb25mZXJlbmNlLWluZm8reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94ZW5jK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGVuYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2h0bWwgeG1sbnM9IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4MTkyIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxyb290LVhNTCBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGxvY2FsTmFtZT0iaHRtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodG1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGh0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hodG1sLXZvaWNlK3htbCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPgorICAgICAgICA8YWNyb255bT5YTUw8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5FeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YbWw8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPnB1YmxpYy54bWw8L3Rpa2E6dXRpPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC94bWwiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gteG1sIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7P3htbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0Oz9YTUwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshLS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIFVURi04IEJPTSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhFRkJCQkYzQzNGNzg2RDZDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBVVEYtMTYgTEUvQkUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4RkZGRTNDMDAzRjAwNzgwMDZEMDA2QzAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweEZFRkYwMDNDMDAzRjAwNzgwMDZEMDA2QyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gVE9ETzogQWRkIG1hdGNoZXMgZm9yIHRoZSBvdGhlciBwb3NzaWJsZSBYTUwgZW5jb2Rpbmcgc2NoZW1lcyAtLT4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54c2wiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54c2QiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94bWwtZHRkIj4KKyAgICAgICAgPF9jb21tZW50PlhNTCBEb2N1bWVudCBUeXBlIERlZmluaXRpb248L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveC1kdGQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kdGQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHkiPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94bXBwK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG9wK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueG9wIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hzbGZvK3htbCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3hzbCIvPgorICAgICAgICA8YWNyb255bT5YU0xGTzwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlhTTCBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJyb290IgorICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54c2xmbyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZvIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hzbHQreG1sIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveHNsIi8+CisgICAgICAgIDxhY3JvbnltPlhTTFQ8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5YU0wgVHJhbnNmb3JtYXRpb25zPC9fY29tbWVudD4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ic3R5bGVzaGVldCIKKyAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNsdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94c3BmK3htbCI+CisgICAgICAgIDxhY3JvbnltPlhTUEY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5YTUwgU2hhcmVhYmxlIFBsYXlsaXN0IEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InBsYXlsaXN0IgorICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8veHNwZi5vcmcvbnMvMC8iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54c3BmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3h2K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXhtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodm1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHZtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh2bSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi96aXAiPgorICAgICAgICA8X2NvbW1lbnQ+Q29tcHJlc3NlZCBBcmNoaXZlIEZpbGU8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWklQXyhmaWxlX2Zvcm1hdCk8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPmNvbS5wa3dhcmUuemlwLWFyY2hpdmU8L3Rpa2E6dXRpPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC16aXAtY29tcHJlc3NlZCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDAzXDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDA1XDAwNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUEtceDA3XHgwOCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi56aXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC03ei1jb21wcmVzc2VkIj4KKyAgICAgICAgPGFjcm9ueW0+N3ppcDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PjctemlwIGFyY2hpdmU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDwhLS0gTWFnaWM6ICc3JywgJ3onLCAweEJDLCAweEFGLCAweDI3LCAweDFDIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI3eiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6MSIgPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhCQ0FGMjcxQyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6NSIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouN3oiIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvLzMya2FkcGNtIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby8zZ3BwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby8zZ3BwMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYWMzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hZHBjbSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWRwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2FtciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYW1yIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPCEtLSBTcGVjaWZpYyBtYXRjaCBmb3IgdGhlIG9yaWdpbmFsIEFNUiBmb3JtYXQgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhQU1SXG4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIEdlbmVyYWwgbWF0Y2ggZm9yIEFNUiBzdWJ0eXBlcyB3ZSBkb24ndCBoYXZlIGVudHJpZXMgZm9yIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIUFNUiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vYW1yIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIUFNUi1XQlxuIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYW1yLXdiKyI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vYW1yIi8+CisgICAgICAgIDwhLS0gVElLQS0xMTU2IHNhbXBsZSBuZWVkZWQgLSBtaWdodCBiZSAiIyFBTVItV0IrXG4iID8gLS0+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2FzYyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9iYXNpYyI+CisgICAgICAgIDxfY29tbWVudD51TGF3L0FVIEF1ZGlvIEZpbGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLnNuZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iNCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI2IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iNyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgICAgICA8bWF0Y2ggb2Zmc2V0PSIwIiB0eXBlPSJzdHJpbmciIHZhbHVlPSJceDJlXHg3M1x4NmVceDY0XHgwMFx4MDBceDAwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYnYxNiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYnYzMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vY2xlYXJtb2RlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9jbiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZGF0MTIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2RscyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAxMTA4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kc3ItZXMyMDIwNTAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Rzci1lczIwMjIxMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMjEyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kdmk0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9lYWMzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjLXFjcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyYzAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmMxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY2IwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYjEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmN3YiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY3diMCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY3diMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXhhbXBsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcxOSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMjEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtMTYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtMjQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtMzIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtNDAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjkxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5ZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOWUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2dzbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZ3NtLWVmciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vaWxiYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDE2Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9sMjAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2wyNCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2xwYyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9taWRpIj4KKyAgICAgICAgPGFjcm9ueW0+TUlESTwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50Pk11c2ljYWwgSW5zdHJ1bWVudCBEaWdpdGFsIEludGVyZmFjZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eSA9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIHZhbHVlPSJNVGhkIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5taWQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5taWRpIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioua2FyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioucm1pIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21vYmlsZS14bWYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wNCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhdWRpby94LW00YSIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXVkaW8veC1tcDRhIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwTTRBICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cE00QiAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXBGNEEgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwRjRCICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcDRhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTRhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTRiIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcDRhLWxhdG0iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wYSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbXBhLXJvYnVzdCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtbXBlZyIvPgorICAgICAgICA8YWNyb255bT5NUDM8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5NUEVHLTEgQXVkaW8gTGF5ZXIgMzwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgICAgICAgPCEtLSBodHRwOi8vbXBnZWRpdC5vcmcvbXBnZWRpdC9tcGVnX2Zvcm1hdC9NUDNGb3JtYXQuaHRtbCAtLT4KKyAgICAgICAgICAgIDwhLS0gQml0IHBhdHRlcm4gZm9yIGZpcnN0IHR3byBieXRlczogMTExMTExMTEgMTExVlZMTEMgICAgLS0+CisgICAgICAgICAgICA8IS0tIFZWID0gTVBFRyBBdWRpbyBWZXJzaW9uIElEOyAxMCA9IFYyLCAxMSA9IFYxICAgICAgICAgIC0tPgorICAgICAgICAgICAgPCEtLSBMTCA9IExheWVyIGRlc2NyaXB0aW9uOyAwMSA9IEwzLCAxMCA9IEwyLCAxMSA9IEwxICAgICAtLT4KKyAgICAgICAgICAgIDwhLS0gQyA9IFByb3RlY3Rpb24gYml0OyAwID0gQ1JDLCAxID0gbm8gQ1JDICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDMsIENSQyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmYzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMyAgICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwyLCBDUkMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDIgICAgICAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMSwgQ1JDIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwxICAgICAgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDMsIENSQyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZiIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMyAgICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwyLCBDUkMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDIgICAgICAtLT4KKyAgICAgICAgICAgIDwhLS0gVElLQS00MTc6IFRoaXMgaXMgdGhlIFVURi0xNiBMRSBieXRlIG9yZGVyIG1hcmshIC0tPgorICAgICAgICAgICAgPCEtLSBtYXRjaCB2YWx1ZT0iMHhmZmZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvIC0tPiA8IS0tIFYxLCBMMSwgQ1JDIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwxICAgICAgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IklEMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcGdhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXAyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXAyYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wMyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0yYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0zYSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGVnNC1nZW5lcmljIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL29nZyI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgVm9yYmlzIEF1ZGlvPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZ2EiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm9yYmlzIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBWb3JiaXMgQ29kZWMgQ29tcHJlc3NlZCBXQVYgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LW9nZyIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDwhLS0gRm9yIGEgc2luZ2xlIHN0cmVhbSBmaWxlIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJPZ2dTXDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXDAwMXZvcmJpcyIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZ2ciLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhdWRpby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1vZ2dmbGFjIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBQYWNrYWdlZCBGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtb2dnLWZsYWMiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEZvciBhIHNpbmdsZSBzdHJlYW0gZmlsZSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLkZMQUMiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtb2dncGNtIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBQYWNrYWdlZCBVbm9tcHJlc3NlZCBXQVYgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhdWRpby94LW9nZy1wY20iLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEZvciBhIHNpbmdsZSBzdHJlYW0gZmlsZSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlBDTSAgICAgIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhdWRpby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgT3B1cyBDb2RlYyBDb21wcmVzc2VkIFdBViBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEZvciBhIHNpbmdsZSBzdHJlYW0gZmlsZSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLk9wdXNIZWFkIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vcHVzIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3NwZWV4Ij4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBTcGVleCBDb2RlYyBDb21wcmVzc2VkIFdBViBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtc3BlZXgiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEZvciBhIHNpbmdsZSBzdHJlYW0gZmlsZSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlNwZWV4ICAgIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcHgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhdWRpby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGFyaXR5ZmVjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY21hIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY21hLXdiIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY211LXdiIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY211Ii8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Bycy5zaWQiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUFNJRCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcWNlbHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3JlZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnRwLWVuYy1hZXNjbTEyOCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnRwLW1pZGkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3J0eCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zbXYwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zbXYtcWNwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zcC1taWRpIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90MTQwYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdDM4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90ZWxlcGhvbmUtZXZlbnQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3RvbmUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3VscGZlYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdmR2aSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm1yLXdiIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuM2dwcC5pdWZwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuNHNiIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuYXVkaW9rb3oiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5hZG9iZS5zb3VuZGJvb3RoIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc25kIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuY2VscCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNpc2NvLm5zZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNtbGVzLnJhZGlvLWV2ZW50cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNucy5hbnAxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuY25zLmluZjEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lb2wiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kbG5hLmFkdHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5oZWFhYy4xIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkuaGVhYWMuMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5Lm1scCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5Lm1wcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMngiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5wbDJ6Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZHRzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kdHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kdHMuaGQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0c2hkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZXZlcmFkLnBsaiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmhucy5hdWRpbyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmx1Y2VudC52b2ljZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubHZwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5YSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHlhIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubm9raWEubW9iaWxlLXhtZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm5vcnRlbC52YmsiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5udWVyYS5lY2VscDQ4MDAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjZWxwNDgwMCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwNzQ3MCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWNlbHA3NDcwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubnVlcmEuZWNlbHA5NjAwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDk2MDAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5vY3RlbC5zYmMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5xY2VscCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnJoZXRvcmV4LjMya2FkcGNtIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwubXBlZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnZteC5jdnNkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92b3JiaXMtY29uZmlnIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWFhYyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWFjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtYWRiY20iPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLnNuZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWFpZmYiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXVkaW8vYWlmZiIvPgorICAgICAgICA8YWNyb255bT5BSUZGPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+QXVkaW8gSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRk9STS4uLi5BSUZGIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGT1JNLi4uLkFJRkMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICAgICAgICA8IS0tIEFtaWdhIElGRiBzb3VuZCBzYW1wbGUsIHNvbWV3aGF0IGxpa2UgdGhlIG1vcmUgbW9kZXJuIEFJRkYgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZPUk0uLi4uOFNWWCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkYiLz4KKyAgICAgICAgICAgIDxtYXRjaCBvZmZzZXQ9IjAiIHR5cGU9InN0cmluZyIgdmFsdWU9Ilx4NDZceDRmXHg1Mlx4NGRceDAwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWlmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWlmZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpZmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1kZWMtYmFzaWMiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDY0NzMyRSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI0IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iNSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjYiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI3IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1kZWMtYWRiY20iPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDY0NzMyRSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIyMyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtZmxhYyI+CisgICAgICAgIDxhY3JvbnltPkZMQUM8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5GcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZMYUMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmxhYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LW1vZCI+CisgICAgICAgIDxhY3JvbnltPk1PRDwvYWNyb255bT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkV4dGVuZGVkXCBNb2R1bGU6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJCTU9EMlNUTSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik0uSy4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik0hSyEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZMVDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZMVDgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjRDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjZDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjhDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkNEODEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9LVEEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjE2Q04iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjMyQ04iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IklNUE0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW9kIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXBlZ3VybCI+CisgICAgICAgIDxfY29tbWVudD5NUDMgUGxheWxpc3QgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIG9mZnNldD0iMCIgdHlwZT0ic3RyaW5nIiB2YWx1ZT0iXHgyM1x4NDVceDU4XHg1NFx4NGRceDMzXHg1NVx4MGRceDBhIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTN1Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXMtd2F4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53YXgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXMtd21hIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby94LW1zLWFzZiIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWEiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IldpbmRvd3MgTWVkaWEgQXVkaW8iIHR5cGU9InVuaWNvZGVMRSIgb2Zmc2V0PSIwOjgxOTIiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIj4KKyAgICAgICAgPF9jb21tZW50PlJlYWwgQXVkaW88L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXVkaW8veC1yZWFsYXVkaW8iIC8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDJlNzI2MWZkIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmFtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmEiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luIj4KKyAgICAgICAgPF9jb21tZW50PlJlYWxNZWRpYSBQbGF5ZXIgUGx1Zy1pbjwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioucm1wIi8+CisgICAgICAgIDwhLS0gPGdsb2IgcGF0dGVybj0iKi5ycG0iLz4gLSBjb25mbGljdHMgd2l0aCBhcHBsaWNhdGlvbi94LXJwbSAtLT4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC13YXYiPgorICAgICAgICA8YWNyb255bT5XQVY8L2Fjcm9ueW0+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJSSUZGLi4uLldBVkUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2F2Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY2R4Ij4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlZqQ0QwMTAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jaWYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNpZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jbWRmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbWRmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNtbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY21sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNzbWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzbWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1wZGIiPgorICAgICAgICA8X2NvbW1lbnQ+QnJvb2toYXZlbiBQcm90ZWluIERhdGFiYW5rIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBkYiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LXh5eiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHl6Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtbXMtYm1wIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImltYWdlL2JtcCIvPgorICAgICAgICA8YWNyb255bT5CTVA8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5XaW5kb3dzIGJpdG1hcDwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CTVBfZmlsZV9mb3JtYXQ8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPmNvbS5taWNyb3NvZnQuYm1wPC90aWthOnV0aT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkJNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAxMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNiI+CisgICAgICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjgiLz4KKyAgICAgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAxMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOCIvPgorICAgICAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDQwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI4Ii8+CisgICAgICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwODAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjgiLz4KKyAgICAgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDEwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOCIvPgorICAgICAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MTgwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI4Ii8+CisgICAgICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgyMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjgiLz4KKyAgICAgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ibXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaWIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvY2dtIj4KKyAgICAgICAgPGFjcm9ueW0+Q0dNPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+Q29tcHV0ZXIgR3JhcGhpY3MgTWV0YWZpbGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQkVHTUYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAyMCIgbWFzaz0iMHhmZmUwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDEwMjIwMDAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo2NCIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDIyMDAwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6NjQiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MTAyMjAwMDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjY0Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDEwMjIwMDA0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo2NCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZ20iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvZXhhbXBsZSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9maXRzIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9maXRzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2czZmF4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nMyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9naWYiPgorICAgICAgICA8YWNyb255bT5HSUY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5HcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR2lmPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20uY29tcHVzZXJ2ZS5naWY8L3Rpa2E6dXRpPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iR0lGODdhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJHSUY4OWEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ2lmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2llZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWVmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2pwMiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1qcDItY29udGFpbmVyIiAvPgorICAgICAgICA8YWNyb255bT5KUDI8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5KUEVHIDIwMDAgUGFydCAxIChKUDIpPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDAwMEM2QTUwMjAyMDBEMEE4NzBBIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDZhNzAzMjIwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjAiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanAyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2pwZWciPgorICAgICAgICA8YWNyb255bT5KUEVHPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+Sm9pbnQgUGhvdG9ncmFwaGljIEV4cGVydHMgR3JvdXA8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSnBlZzwvdGlrYTpsaW5rPgorICAgICAgICA8dGlrYTp1dGk+cHVibGljLmpwZWc8L3Rpa2E6dXRpPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDwhLS0gRkZEOCBpcyB0aGUgU09JIChTdGFydCBPZiBJbWFnZSkgbWFya2VyLiAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8IS0tIEl0IGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbWFya2VyIHRoYXQgc3RhcnRzIHdpdGggRkYuIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZDhmZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qcGciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qcGVnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanBlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouamlmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouamZpZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpmaSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcG0iPgorICAgICAgICA8YWxpYXMgdHlwZT0idmlkZW8vanBtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1qcDItY29udGFpbmVyIiAvPgorICAgICAgICA8YWNyb255bT5KUDI8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5KUEVHIDIwMDAgUGFydCA2IChKUE0pPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDAwMEM2QTUwMjAyMDBEMEE4NzBBIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDZhNzA2ZDIwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjAiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanBtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanBnbSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcHgiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtanAyLWNvbnRhaW5lciIgLz4KKyAgICAgICAgPGFjcm9ueW0+SlAyPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+SlBFRyAyMDAwIFBhcnQgMiAoSlBYKTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDAwMDBDNkE1MDIwMjAwRDBBODcwQSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg2YTcwNzgyMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9uYXBscHMiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvbml0ZiI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS9udGYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik5JVEYwMS4xMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTklURjAyLjAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTklURjAyLjEwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5udGYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5uaXRmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3BuZyI+CisgICAgICAgIDxhY3JvbnltPlBORzwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3M8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHg4OVBOR1x4MGRceDBhXHgxYVx4MGEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG5nIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3Bycy5idGlmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5idGlmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wcnMucHRpIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3N2Zyt4bWwiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICAgICAgICA8YWNyb255bT5TVkc8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5TY2FsYWJsZSBWZWN0b3IgR3JhcGhpY3M8L19jb21tZW50PgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJzdmciIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdmciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdmd6Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3QzOCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS90aWZmIj4KKyAgICAgICAgPGFjcm9ueW0+VElGRjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlRhZ2dlZCBJbWFnZSBGaWxlIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPCEtLSBNTS4qID0gQmlnIGVuZGlhbiAoTT1Nb3Rvcm9sYSkgYW5kIDB4MDAyYSBpbiBiaWcgZW5kaWFuICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNTVx4MDBceDJhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBJSSouID0gTGl0dGxlIGVuZGlhbiAoST1JbnRlbCkgYW5kIDB4MDAyYSBpbiBsaXR0bGUgZW5kaWFuIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJJSVx4MmFceDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRpZmYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50aWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvdGlmZi1meCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuYWRvYmUucGhvdG9zaG9wIj4KKyAgICAgICAgPGFjcm9ueW0+UFNEPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+UGhvdG9zaG9wIEltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtcHNkIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9waG90b3Nob3AiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8IS0tIFZlcnNpb24gb2YgMHgwMDAxIGlzIFBTRCAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iOEJQU1x4MDBceDAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBWZXJzaW9uIG9mIDB4MDAwMiBpcyBQU0IgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjhCUFNceDAwXHgwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wc2QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmFkb2JlLnByZW1pZXJlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcGoiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iUHJlbWllcmVEYXRhIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5jbnMuaW5mMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmRqdnUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRqdnUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kanYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmR3ZyI+CisgICAgICAgIDxhY3JvbnltPkRXRzwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkF1dG9DYWQgRHJhd2luZzwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZHdnPC90aWthOmxpbms+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LWR3ZyIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYWNhZCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1hY2FkIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9hdXRvY2FkX2R3ZyIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vZHdnIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWR3ZyIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1hdXRvY2FkIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS92bmQuZHdnIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJkcmF3aW5nL2R3ZyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR3ZyIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTUMwLjAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFDMS4yIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBQzEuNDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFDMS41MCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQUMyLjEwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBQzIuMjEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFDMi4yMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gIkFDIiBmb2xsb3dlZCBieSBmb3VyIG51bWJlcnMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFDMDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRjBGMEYwRjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmR4ZiI+CisgICAgICAgIDxhY3JvbnltPkRYRjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkF1dG9DQUQgRFhGPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0F1dG9DQURfRFhGPC90aWthOmxpbms+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHhmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZmFzdGJpZHNoZWV0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mYnMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5mcHgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZweCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZzdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnN0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1tbXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtcmxjIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ybGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5nbG9iYWxncmFwaGljcy5wZ2IiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uIj4KKyAgICAgICAgPGFjcm9ueW0+SUNPPC9hY3JvbnltPgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmljbzwvdGlrYTpsaW5rPgorICAgICAgICA8dGlrYTp1dGk+Y29tLm1pY3Jvc29mdC5pY288L3Rpa2E6dXRpPgorICAgICAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1pY29uIiAvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDEwMlwxMDFcMDUwXDAwMFwwMDBcMDAwXDA1NlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCisgICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwMFwwMDBcMDAxXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pY28iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm1peCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm1zLW1vZGkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1kaSIvPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IERvY3VtZW50IEltYWdpbmc8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg0NTUwMkEwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm5ldC1mcHgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5weCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnJhZGlhbmNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuc2VhbGVkLnBuZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmdpZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmpwZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnN2ZiIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQud2FwLndibXAiPgorICAgICAgICA8X2NvbW1lbnQ+V2lyZWxlc3MgQml0bWFwIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53Ym1wIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC54aWZmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54aWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtY211LXJhc3RlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmFzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWNteCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY214Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtZnJlZWhhbmQiPgorICAgICAgICA8X2NvbW1lbnQ+RnJlZUhhbmQgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQUdEMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQUdEMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQUdENCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRnJlZUhhbmQxMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6MjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRnJlZUhhbmQxMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6MjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRnJlZUhhbmQxMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6MjQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoNCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoNDAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maDUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maDUwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmg3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmg4Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmg5Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmgxMCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoMTEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maDEyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnQ3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnQ4Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnQ5Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnQxMCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0MTEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdDEyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtanAyLWNvZGVzdHJlYW0iPgorICAgICAgICA8X2NvbW1lbnQ+SlBFRyAyMDAwIENvZGVzdHJlYW08L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjI1Ij4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZjRmZmY1MSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qMmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1qcDItY29udGFpbmVyIj4KKyAgICAgICAgPF9jb21tZW50PkpQRUcgMjAwMCBDb250YWluZXIgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDAwMEM2QTUwMjAyMDBEMEE4NzBBIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LW5pZmYiPgorICAgICAgICA8X2NvbW1lbnQ+TmF2eSBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJJSU4xIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBjeCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGN4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBpY3QiPgorICAgICAgICA8X2NvbW1lbnQ+QXBwbGUgTWFjaW50b3NoIFF1aWNrRHJhdy9QSUNUIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMTEwMkZGMEMwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjUyMiIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBpYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBpY3QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiPgorICAgICAgICA8YWNyb255bT5QTk08L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5Qb3J0YWJsZSBBbnkgTWFwPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbm0iIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtYml0bWFwIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCIvPgorICAgICAgICA8YWNyb255bT5QQk08L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5Qb3J0YWJsZSBCaXQgTWFwPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wYm0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCIvPgorICAgICAgICA8YWNyb255bT5QR008L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5Qb3J0YWJsZSBHcmF5bWFwIEdyYXBoaWM8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUDIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlA1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIG9mZnNldD0iMCIgdHlwZT0ic3RyaW5nIiB2YWx1ZT0iXHg1MFx4MzVceDBhIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGdtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCIvPgorICAgICAgICA8YWNyb255bT5QWE08L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5VTklYIFBvcnRhYmxlIEJpdG1hcCBHcmFwaGljPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlAzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUDciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggb2Zmc2V0PSIwIiB0eXBlPSJzdHJpbmciIHZhbHVlPSJceDUwXHgzNFx4MGEiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctYWRvYmUiPgorICAgICAgICA8YWNyb255bT5ETkc8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5BZG9iZSBEaWdpdGFsIE5lZ2F0aXZlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kbmciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctaGFzc2VsYmxhZCI+CisgICAgICAgIDxfY29tbWVudD5IYXNzZWxibGFkIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouM2ZyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWZ1amkiPgorICAgICAgICA8X2NvbW1lbnQ+RnVqaSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1jYW5vbiI+CisgICAgICAgIDxfY29tbWVudD5DYW5vbiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNydyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNyMiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1rb2RhayI+CisgICAgICAgIDxfY29tbWVudD5Lb2RhayByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmsyNSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtkYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRjcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRyZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1taW5vbHRhIj4KKyAgICAgICAgPF9jb21tZW50Pk1pbm9sdGEgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcnciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctbmlrb24iPgorICAgICAgICA8X2NvbW1lbnQ+Tmlrb24gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5uZWYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ucnciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctb2x5bXB1cyI+CisgICAgICAgIDxfY29tbWVudD5PbHltcHVzIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3JmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXBlbnRheCI+CisgICAgICAgIDxfY29tbWVudD5QZW50YXggcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wdHgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctc29ueSI+CisgICAgICAgIDxfY29tbWVudD5Tb255IHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXJ3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3JmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3IyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXNpZ21hIj4KKyAgICAgICAgPF9jb21tZW50PlNpZ21hIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueDNmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWVwc29uIj4KKyAgICAgICAgPF9jb21tZW50PkVwc29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXJmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW1hbWl5YSI+CisgICAgICAgIDxfY29tbWVudD5NYW1peWEgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctbGVhZiI+CisgICAgICAgIDxfY29tbWVudD5MZWFmIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW9zIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXBhbmFzb25pYyI+CisgICAgICAgIDxfY29tbWVudD5QYW5hc29uaWMgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yYXciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ydzIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcGhhc2VvbmUiPgorICAgICAgICA8X2NvbW1lbnQ+UGhhc2UgT25lIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWlxIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXJlZCI+CisgICAgICAgIDxfY29tbWVudD5SZWQgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yM2QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctaW1hY29uIj4KKyAgICAgICAgPF9jb21tZW50PkltYWNvbiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZmZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1sb2dpdGVjaCI+CisgICAgICAgIDxfY29tbWVudD5Mb2dpdGVjaCByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB4biIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1jYXNpbyI+CisgICAgICAgIDxfY29tbWVudD5DYXNpbyByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJheSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1yYXd6b3IiPgorICAgICAgICA8X2NvbW1lbnQ+UmF3em9yIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioucnd6Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmdiIj4KKyAgICAgICAgPF9jb21tZW50PlNpbGljb24gR3JhcGhpY3MgUkdCIEJpdG1hcDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIG9mZnNldD0iMCIgdHlwZT0ic3RyaW5nIiB2YWx1ZT0iXHgwMVx4ZGFceDAxXHgwMVx4MDBceDAzIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmdiIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gteGJpdG1hcCI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIvKiBYUE0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGJtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC94LWMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14Y2YiPgorICAgICAgICA8X2NvbW1lbnQ+R0lNUCBJbWFnZSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImltYWdlL3hjZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIHZhbHVlPSJnaW1wIHhjZiAiIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhjZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXhwaXhtYXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwbSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXh3aW5kb3dkdW1wIj4KKyAgICAgICAgPF9jb21tZW50PlggV2luZG93cyBEdW1wPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54d2QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9jcGltIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZXhhbXBsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9leHRlcm5hbC1ib2R5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9nbG9iYWwtZGVsaXZlcnktc3RhdHVzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbC1kaXNwb3NpdGlvbi1ub3RpZmljYXRpb24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWhlYWRlcnMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvaHR0cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9pbWRuK3htbCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL25ld3MiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUGF0aDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJYcmVmOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFydGljbGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3BhcnRpYWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9yZmM4MjIiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUmVsYXktVmVyc2lvbjoiIHR5cGU9InN0cmluZ2lnbm9yZWNhc2UiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIVwgcm5ld3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik4jIVwgcm5ld3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZvcndhcmRcIHRvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQaXBlXCB0byIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUmV0dXJuLVBhdGg6IiB0eXBlPSJzdHJpbmdpZ25vcmVjYXNlIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRnJvbToiIHR5cGU9InN0cmluZ2lnbm9yZWNhc2UiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJSZWNlaXZlZDoiIHR5cGU9InN0cmluZ2lnbm9yZWNhc2UiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNZXNzYWdlLUlEOiIgdHlwZT0ic3RyaW5naWdub3JlY2FzZSIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkRhdGU6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNSU1FLVZlcnNpb246IiB0eXBlPSJzdHJpbmdpZ25vcmVjYXNlIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iWC1Ob3Rlcy1JdGVtOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTWVzc2FnZS1JRDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgxOTIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZW1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWltZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1odCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1odG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvcy1odHRwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3NpcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9zaXBmcmFnIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3RyYWNraW5nLXN0YXR1cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS92bmQuc2kuc2ltcCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC9leGFtcGxlIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL2lnZXMiPgorICAgICAgICA8X2NvbW1lbnQ+SW5pdGlhbCBHcmFwaGljcyBFeGNoYW5nZSBTcGVjaWZpY2F0aW9uIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWdzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWdlcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC9tZXNoIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc2giLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZXNoIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2lsbyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZHdmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kd2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5kd2Z4K3hwcyI+CisgICAgICAgIDxfY29tbWVudD5BdXRvQ0FEIERlc2lnbiBXZWIgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kd2Z4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5mbGF0bGFuZC4zZG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ2RsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nZGwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5ncy1nZGwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5ncy5nZGwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5ndHciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd0dyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLm1vbWwreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQubXRzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tdHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5wYXJhc29saWQudHJhbnNtaXQuYmluYXJ5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQucGFyYXNvbGlkLnRyYW5zbWl0LnRleHQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC52dHUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZ0dSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92cm1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53cmwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52cm1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9hbHRlcm5hdGl2ZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2FwcGxlZG91YmxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvYnl0ZXJhbmdlcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2RpZ2VzdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2VuY3J5cHRlZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2V4YW1wbGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9oZWFkZXItc2V0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvbWl4ZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9wYXJhbGxlbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3JlbGF0ZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9yZXBvcnQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9zaWduZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC92b2ljZS1tZXNzYWdlIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hY3Rpb25zY3JpcHQiPgorICAgICAgICA8X2NvbW1lbnQ+QWN0aW9uU2NyaXB0IHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hcyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFkYSI+CisgICAgICAgIDxfY29tbWVudD5BZGEgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkcyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFwcGxlc2NyaXB0Ij4KKyAgICAgICAgPF9jb21tZW50PkFwcGxlU2NyaXB0IHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hcHBsZXNjcmlwdCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9hc3AiPgorICAgICAgICA8X2NvbW1lbnQ+QWN0aXZlIFNlcnZlciBQYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc3AiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvYXNwZG90bmV0Ij4KKyAgICAgICAgPF9jb21tZW50PkFTUCAuTkVUPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc3B4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYXNwZWN0aiI+CisgICAgICAgIDxfY29tbWVudD5Bc3BlY3RKIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5haiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFzc2VtYmx5Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveC1hc20iLz4KKyAgICAgICAgPF9jb21tZW50PkFzc2VtYmxlciBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLlMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc20iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvY2FsZW5kYXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmljcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlmYiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIDxfY29tbWVudD5DYXNjYWRpbmcgU3R5bGUgU2hlZXQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzcyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9jc3YiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzdiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9kaXJlY3RvcnkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvZG5zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2VjbWFzY3JpcHQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvZW5yaWNoZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvZXhhbXBsZSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2h0bWwiPgorICAgICAgICA8X2NvbW1lbnQ+SHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhY3JvbnltPkhUTUw8L2Fjcm9ueW0+CisgICAgICAgIDx0aWthOnV0aT5wdWJsaWMuaHRtbDwvdGlrYTp1dGk+CisgICAgICAgIDwhLS0gVElLQS0zMjc6IGlmIHlvdSBlbmNvdW50ZXIgdGFncyBpbiB0aGUgSFRNTAorICAgICAgICAgIHdpdGggbm8gZGVjbGFyZWQgbmFtZXNwYWNlLCBpdCdzIG5vdCBYSFRNTCwgaXQncyBqdXN0CisgICAgICAgICAgYmFkIEhUTUwsIHVuZm9ydHVuYXRlbHkuCisgICAgIC0tPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJodG1sIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkhUTUwiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ibGluayIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJMSU5LIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImJvZHkiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iQk9EWSIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJwIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlAiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ic2NyaXB0Ii8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlNDUklQVCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJmcmFtZXNldCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJGUkFNRVNFVCIvPgorICAgICAgICA8IS0tIFRoZSBtYWdpYyBwcmlvcml0eSBuZWVkcyB0byBiZSBsb3dlciB0aGFuIHRoYXQgb2YgLS0+CisgICAgICAgIDwhLS0gIGZpbGVzIHdoaWNoIGNvbnRhaW4gSFRNTCB3aXRoaW4gdGhlbSwgZWcgbWltZSBlbWFpbHMgLS0+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IURPQ1RZUEUgSFRNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyFkb2N0eXBlIGh0bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtIRUFEIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aGVhZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O1RJVExFIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7dGl0bGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICAgICAgICA8IS0tIG5vdGUgb24gdGhlIG9mZnNldCB2YWx1ZSBoZXJlOiB0aGlzIGNhbiBvbmx5IGJlIGFzIGJpZyBhcworICAgICAgICAgICBNaW1lVHlwZXMjZ2V0TWluTGVuZ3RoKCkuIElmIHlvdSBzZXQgdGhlIG9mZnNldCB2YWx1ZSB0byBsYXJnZXIKKyAgICAgICAgICAgdGhhbiB0aGF0IHNpemUsIHRoZSBtYWdpYyB3aWxsIG9ubHkgYmUgY29tcGFyZWQgdG8gdXAgdG8KKyAgICAgICAgICAgTWltZVR5cGVzI2dldE1pbkxlbmd0aCgpIGJ5dGVzLgorICAgICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aHRtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6ODE5MiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7SFRNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0JPRFkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtib2R5IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7RElWIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7ZGl2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7VElUTEUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDt0aXRsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2gxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7SDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshZG9jdHlwZSBIVE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IURPQ1RZUEUgaHRtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5odG1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHRtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvcGFyaXR5ZmVjIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvcGxhaW4iPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iVGhpcyBpcyBUZVgsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJUaGlzIGlzIE1FVEFGT05ULCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLyoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii8vIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI7OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gVVRGLTE2QkUgQk9NIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZlZmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIFVURi0xNkxFIEJPTSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBVVEYtOCBCT00gLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZWZiYmJmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorCisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHh0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGV4dCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvbmYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZmciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kZWYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5saXN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaW4iLz4KKworICAgICAgICA8IS0tIFRJS0EtODU6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvc3ZuLWVvbC1zdHlsZS50eHQgLS0+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IklOU1RBTEwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iS0VZUyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSJNYWtlZmlsZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSJSRUFETUUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iYWJzLWxpbmttYXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iYWJzLW1lbnVsaW5rcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhcnQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xhc3NwYXRoIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY21kIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY29uZmlnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3dpa2kiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kYXRhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGNsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWdybSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVudCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZm4iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdybSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iLmh0YWNjZXNzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWh0bWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qbXgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qdW5pdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmp4Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWFuaWZlc3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tNCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1mIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouTUYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZXRhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubjMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZW4iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wb2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wb20iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcm9qZWN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHJvcGVydGllcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJuZyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJueCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJvbGVzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGxkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHlwZXMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52bSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndzZGQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54YXJncyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhjYXQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54Y29uZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhlZ3JtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGdybSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsZXgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bG9nIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueG1hcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhyb2xlcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzYW1wbGVzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHdlYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZWxjb21lIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvcHJzLmZhbGxlbnN0ZWluLnJzdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wcnMubGluZXMudGFnIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kc2MiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvcmVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JmYzgyMi1oZWFkZXJzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JpY2h0ZXh0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ydHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9ydHAtZW5jLWFlc2NtMTI4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3J0eCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9zZ21sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZ21sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2dtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3QxNDAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRzdiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3Ryb2ZmIj4KKyAgICAgICAgPF9jb21tZW50PlJvZmYvbnJvZmYvdHJvZmYvZ3JvZmYgVW5mb3JtYXR0ZWQgTWFudWFsIFBhZ2UgKFVOSVgpPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmLW1lIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmLW1zIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIuXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IidcXCZxdW90OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJy5cXCZxdW90OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IicnJyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yb2ZmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWFuIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3VscGZlYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC91cmktbGlzdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudXJpIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudXJpcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVybHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmFiYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3VybCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybC5kY3VybCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGN1cmwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmN1cmwuc2N1cmwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjdXJsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsLm1jdXJsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tY3VybCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZG1jbGllbnRzY3JpcHQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmVzbWVydGVjLnRoZW1lLWRlc2NyaXB0b3IiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmZseSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmx5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5mbWkuZmxleHN0b3IiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZseCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZ3JhcGh2aXoiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd2Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pbjNkLjNkbWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNkbWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmluM2Quc3BvdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3BvdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuaXB0Yy5hbnBhIj4KKyAgICAgICAgPGFjcm9ueW0+QU5QQTwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkFtZXJpY2FuIE5ld3NwYXBlciBQdWJsaXNoZXJzIEFzc29jaWF0aW9uIFdpcmUgRmVlZHM8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFucGEiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4MTZceDE2XHgwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmlwdGMubmV3c21sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pcHRjLm5pdGYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmxhdGV4LXoiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm1vdG9yb2xhLnJlZmxleCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQubXMtbWVkaWFwYWNrYWdlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5uZXQycGhvbmUuY29tbWNlbnRlci5jb21tYW5kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5zaS51cmljYXRhbG9ndWUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLnN1bi5qMm1lLmFwcC1kZXNjcmlwdG9yIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qYWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLnRyb2xsdGVjaC5saW5ndWlzdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLnNpIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC53YXAuc2wiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLndhcC53bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0Ij4KKyAgICAgICAgPF9jb21tZW50PldNTCBTY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtbHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWF3ayI+CisgICAgICAgIDxfY29tbWVudD5BV0sgc2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL2Jpbi9nYXdrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjISAvYmluL2dhd2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL3Vzci9iaW4vZ2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL3Vzci9iaW4vZ2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvdXNyL2xvY2FsL2Jpbi9nYXdrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjISAvdXNyL2xvY2FsL2Jpbi9nYXdrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS9iaW4vYXdrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjISAvYmluL2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvdXNyL2Jpbi9hd2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhIC91c3IvYmluL2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hd2siLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1iYXNpYyI+CisgICAgICAgIDxfY29tbWVudD5CYXNpYyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYmFzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouQmFzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouQkFTIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYysraGRyIj4KKyAgICAgICAgPF9jb21tZW50PkMrKyBzb3VyY2UgY29kZSBoZWFkZXI8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh4eCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhoIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouSCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgrKyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouSFBQIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYysrc3JjIj4KKyAgICAgICAgPF9jb21tZW50PkMrKyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3BwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3h4Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5DIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYysrIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouQ1BQIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtY2dpIj4KKyAgICAgICAgPF9jb21tZW50PkNHSSBzY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNnaSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNoZHIiPgorICAgICAgICA8X2NvbW1lbnQ+QyBzb3VyY2UgY29kZSBoZWFkZXI8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jbG9qdXJlIj4KKyAgICAgICAgPF9jb21tZW50PkNsb2p1cmUgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsaiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNvZmZlZXNjcmlwdCI+CisgICAgICAgIDxfY29tbWVudD5Db2ZmZWVTY3JpcHQgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvZmZlZSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNzcmMiPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC94LWMiLz4KKyAgICAgICAgPF9jb21tZW50PkMgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jc2hhcnAiPgorICAgICAgICA8X2NvbW1lbnQ+QyMgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtY29ib2wiPgorICAgICAgICA8X2NvbW1lbnQ+Q09CT0wgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNibCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkNibCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkNCTCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkNvYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkNPQiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNvbGRmdXNpb24iPgorICAgICAgICA8X2NvbW1lbnQ+Q29sZEZ1c2lvbiBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2ZtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2ZtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNmYyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNvbW1vbi1saXNwIj4KKyAgICAgICAgPF9jb21tZW50PkNvbW1vbiBMaXNwIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGlzcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxzcCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWRpZmYiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZGlmZlwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIqKipcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT25seVwgaW5cICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQ29tbW9uXCBzdWJkaXJlY3RvcmllczpcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iSW5kZXg6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpZmYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wYXRjaCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWVpZmZlbCI+CisgICAgICAgIDxfY29tbWVudD5FaWZmZWwgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmUiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1lbWFjcy1saXNwIj4KKyAgICAgICAgPF9jb21tZW50PkVtYWNzIExpc3Agc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVsIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZXJsYW5nIj4KKyAgICAgICAgPF9jb21tZW50PkVybGFuZyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXJsIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZXhwZWN0Ij4KKyAgICAgICAgPF9jb21tZW50PkV4cGVjdCBTY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4cCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWZvcnRoIj4KKyAgICAgICAgPF9jb21tZW50PkZvcnRoIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi40dGgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1mb3J0cmFuIj4KKyAgICAgICAgPF9jb21tZW50PkZvcnRyYW4gc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5GIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZm9yIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZjc3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZjkwIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZ28iPgorICAgICAgICA8X2NvbW1lbnQ+R28gc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdvIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZ3Jvb3Z5Ij4KKyAgICAgICAgPF9jb21tZW50Pkdyb292eSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3Jvb3Z5Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtaGFza2VsbCI+CisgICAgICAgIDxfY29tbWVudD5IYXNrZWxsIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ocyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxocyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWlkbCI+CisgICAgICAgIDxfY29tbWVudD5JbnRlZmFjZSBEZWZpbml0aW9uIExhbmd1YWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pZGwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1pbmkiPgorICAgICAgICA8X2NvbW1lbnQ+Q29uZmlndXJhdGlvbiBmaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pbmkiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1qYXZhLXNvdXJjZSI+CisgICAgICAgIDxfY29tbWVudD5KYXZhIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveC1qYXZhIiAvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphdmEiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1qc3AiPgorICAgICAgICA8X2NvbW1lbnQ+SmF2YSBTZXJ2ZXIgUGFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWh0dHBkLWpzcCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDslQCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyUtLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qc3AiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWxlc3MiPgorICAgICAgICA8X2NvbW1lbnQ+TEVTUyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGVzcyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWxleCI+CisgICAgICAgIDxfY29tbWVudD5MZXgvRmxleCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWxvZyI+CisgICAgICAgIDxfY29tbWVudD5hcHBsaWNhdGlvbiBsb2c8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxvZyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWx1YSI+CisgICAgICAgIDxfY29tbWVudD5MdWEgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmx1YSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LW1sIj4KKyAgICAgICAgPF9jb21tZW50Pk1MIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LW1hdGxhYiI+CisgICAgICAgIDxfY29tbWVudD5NYXRsYWIgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnVuY3Rpb24gWyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPCEtLSA8Z2xvYiBwYXR0ZXJuPSIqLm0iLz4gLSBjb25mbGljdHMgd2l0aCB0ZXh0L3gtb2JqY3NyYyAtLT4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbWF0bGFiLWRhdGEiPgorICAgICAgICA8Y29tbWVudD5NQVRMQUIgZGF0YSBmaWxlPC9jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbWF0bGFiLW1hdCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTUFUTEFCIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtbW9kdWxhIj4KKyAgICAgICAgPF9jb21tZW50Pk1vZHVsYSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pMyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1nIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWciLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1vYmpjc3JjIj4KKyAgICAgICAgPF9jb21tZW50Pk9iamVjdGl2ZS1DIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtb2NhbWwiPgorICAgICAgICA8X2NvbW1lbnQ+T2NhbWwgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9jYW1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWxpIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcGFzY2FsIj4KKyAgICAgICAgPF9jb21tZW50PlBhc2NhbCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGFzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouUEFTIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHByIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcGVybCI+CisgICAgICAgIDxfY29tbWVudD5QZXJsIHNjcmlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJldmFsIFwmcXVvdDtleGVjIC91c3IvbG9jYWwvYmluL3BlcmwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL2Jpbi9wZXJsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS9iaW4vZW52IHBlcmwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL3Vzci9iaW4vcGVybCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvdXNyL2xvY2FsL2Jpbi9wZXJsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBlcmwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1waHAiPgorICAgICAgICA8X2NvbW1lbnQ+UEhQIHNjcmlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7P3BocCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5waHAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5waHAzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGhwNCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXByb2xvZyI+CisgICAgICAgIDxfY29tbWVudD5Qcm9sb2cgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBybyIvPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49IioucGwiLz4gLSBjb25mbGljdHMgd2l0aCB0ZXh0L3gtcGVybCAtLT4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1weXRob24iPgorICAgICAgICA8X2NvbW1lbnQ+UHl0aG9uIHNjcmlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS9iaW4vcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjISAvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZXZhbCAmcXVvdDtleGVjIC9iaW4vcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS91c3IvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL3Vzci9iaW4vcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJldmFsICZxdW90O2V4ZWMgL3Vzci9iaW4vcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS91c3IvbG9jYWwvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL3Vzci9sb2NhbC9iaW4vcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJldmFsICZxdW90O2V4ZWMgL3Vzci9sb2NhbC9iaW4vcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIvYmluL2VudiBweXRob24iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHkiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1yc3QiPgorICAgICAgICA8X2NvbW1lbnQ+cmVTdHJ1Y3R1cmVkVGV4dCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmVzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJlc3R4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcmV4eCI+CisgICAgICAgIDxfY29tbWVudD5SZXh4IHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yZXh4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcnVieSI+CisgICAgICAgIDxfY29tbWVudD5SdWJ5IHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yYiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXNjYWxhIj4KKyAgICAgICAgPF9jb21tZW50PlNjYWxhIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zY2FsYSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXNjaGVtZSI+CisgICAgICAgIDxfY29tbWVudD5TY2hlbWUgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXNlZCI+CisgICAgICAgIDxfY29tbWVudD5TZWQgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2VkIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtc3FsIj4KKyAgICAgICAgPF9jb21tZW50PlNRTCBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcWwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1zZXRleHQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV0eCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXN0c3JjIj4KKyAgICAgICAgPF9jb21tZW50PlNtYWxsdGFsayBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3QiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC10Y2wiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC10Y2wiLz4KKyAgICAgICAgPF9jb21tZW50PlRjbCBzY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLml0ayIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRjbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRrIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdXVlbmNvZGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnV1Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC12YmFzaWMiPgorICAgICAgICA8X2NvbW1lbnQ+VmlzdWFsIGJhc2ljIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5DbHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5DTFMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mcm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5Gcm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5GUk0iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3gtYmFzaWMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXZiZG90bmV0Ij4KKyAgICAgICAgPF9jb21tZW50PlZCLk5FVCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudmIiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3gtdmJhc2ljIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC12YnNjcmlwdCI+CisgICAgICAgIDxfY29tbWVudD5WQlNjcmlwdCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudmJzIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC94LXZiYXNpYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmNhbGVuZGFyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52Y3MiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC12Y2FyZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudmNmIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQkVHSU46VkNBUkQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC12ZXJpbG9nIj4KKyAgICAgICAgPF9jb21tZW50PlZlcmlsb2cgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnYiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC12aGRsIj4KKyAgICAgICAgPF9jb21tZW50PlZIREwgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZoZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZoZGwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC13ZWItbWFya2Rvd24iPgorICAgICAgICA8X2NvbW1lbnQ+TWFya2Rvd24gc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1kIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWR0ZXh0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWtkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWFya2Rvd24iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC15YWNjIj4KKyAgICAgICAgPF9jb21tZW50PllhY2MvQmlzb24gc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnkiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC15YW1sIj4KKyAgICAgICAgPF9jb21tZW50PllBTUwgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnlhbWwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNnZTYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ2U3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2dnNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNncDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ3AyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2dwMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNncDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ3A1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2dwNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNnczciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouM2dwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwLXR0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwMiI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2cyYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNnMmIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZzJjIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNnMiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vYm1wZWciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2J0NjU2Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9jZWxiIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9kdiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vZXhhbXBsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2MSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaDI2MSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2MyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaDI2MyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2My0xOTk4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjYzLTIwMDAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgyNjQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2pwZWciPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZ3YiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2pwZWcyMDAwIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21qMiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1qcDItY29udGFpbmVyIiAvPgorICAgICAgICA8YWNyb255bT5NSjI8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5KUEVHIDIwMDAgUGFydCAzIChNb3Rpb24gSlBFRywgTUoyKTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDAwMDBDNkE1MDIwMjAwRDBBODcwQSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg2ZDZhNzAzMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1qMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1qcDIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXAxcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXAycCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXAydCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcDQiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cG1wNDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXBtcDQyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wNCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wNHYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcGc0Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8vcXVpY2t0aW1lIiAvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXA0di1lcyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcGVnIj4KKyAgICAgICAgPF9jb21tZW50Pk1QRUcgTW92aWUgQ2xpcDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMDAwXDAwMFwwMDFcMjYzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMDAwXDAwMFwwMDFcMjcyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wZWciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcGciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcGUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tMXYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tMnYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXBlZzQtZ2VuZXJpYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXB2Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9udiIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9vZ2ciPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFZvcmJpcyBWaWRlbzwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2d2Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2RhYWxhIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBEYWFsYSBWaWRlbzwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ2aWRlby94LWRhYWxhIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBBc3N1bWVzIFZpZGVvIHN0cmVhbSBjb21lcyBiZWZvcmUgQXVkaW8sIG1heSBub3QgYWx3YXlzIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJPZ2dTXDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHg4MGRhYWxhIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGIgorICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InZpZGVvL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby90aGVvcmEiPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFRoZW9yYSBWaWRlbzwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ2aWRlby94LXRoZW9yYSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDwhLS0gQXNzdW1lcyBWaWRlbyBzdHJlYW0gY29tZXMgYmVmb3JlIEF1ZGlvLCBtYXkgbm90IGFsd2F5cyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlx4ODB0aGVvcmEiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1kaXJhYyI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgUGFja2FnZWQgRGlyYWMgVmlkZW88L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLkJCQ0QiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kcmMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1vZ20iPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFBhY2thZ2VkIE9HTSBWaWRlbzwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBBc3N1bWVzIFZpZGVvIHN0cmVhbSBjb21lcyBiZWZvcmUgQXVkaW8sIG1heSBub3QgYWx3YXlzIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJPZ2dTXDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4udmlkZW8iIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGIgorICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9nbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InZpZGVvL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW9nZ3V2cyI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgUGFja2FnZWQgUmF3IFVWUyBWaWRlbzwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ2aWRlby94LW9nZy11dnMiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5VVlMgIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtb2dneXV2Ij4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBQYWNrYWdlZCBSYXcgWVVWIFZpZGVvPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9InZpZGVvL3gtb2dnLXl1diIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlwwMDFZVVYiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1vZ2dyZ2IiPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFBhY2thZ2VkIFJhdyBSR0IgVmlkZW88L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0idmlkZW8veC1vZ2ctcmdiIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJPZ2dTXDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXDAwMVJHQiIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGIgorICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InZpZGVvL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9wYXJpdHlmZWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3BvaW50ZXIiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcXVpY2t0aW1lIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Im1vb3YiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Im1kYXQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8IS0tIEdlbmVyYWwgbWF0Y2gsIHNwZWNpZmljIGZ0eXBYWFggb25lcyBwcmVzZW50IGZvciBzdWJ0eXBlcyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vdiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9yYXciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3J0cC1lbmMtYWVzY20xMjgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3J0eCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vc21wdGUyOTJtIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby91bHBmZWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZjMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmNjdHYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5kbG5hLm1wZWctdHRzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuZnZ0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdnQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5obnMudmlkZW8iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMWRwYXJpdHlmZWMtMTAxMCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0yMDA1Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaXB0dmZvcnVtLjJkcGFyaXR5ZmVjLTEwMTAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMmRwYXJpdHlmZWMtMjAwNSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS50dHNhdmMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0udHRzbXBlZzIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlbyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1wZWd1cmwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14dSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm00dSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weXYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5diIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm5va2lhLmludGVybGVhdmVkLW11bHRpbWVkaWEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5ub2tpYS52aWRlb3ZvaXAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5vYmplY3R2aWRlbyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZC5tcGVnMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZC5tcGVnNCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZC5zd2YiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5tb3YiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC52aXZvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52aXYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtZjR2Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mNHYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1mbGMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsaSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmxpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtZmx2Ij4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZMViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbHYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1qbmciPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHg4YkpORyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qbmciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tNHYiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cE00ViAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXBNNFZIIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwTTRWUCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tNHYiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9tcDQiIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbW5nIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4OGFNTkciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW5nIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtYXNmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc2YiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc3giLz4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDMwMjZiMjc1IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tcy13bSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud20iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd212Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby94LW1zLWFzZiIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bXYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IldpbmRvd3MgTWVkaWEgVmlkZW8iIHR5cGU9InVuaWNvZGVMRSIgb2Zmc2V0PSIwOjgxOTIiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlZDLTEgQWR2YW5jZWQgUHJvZmlsZSIgdHlwZT0idW5pY29kZUxFIiBvZmZzZXQ9IjA6ODE5MiIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd214Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bXgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd3Z4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53dngiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tc3ZpZGVvIj4KKyAgICAgICAgPF9jb21tZW50PkF1ZGlvIFZpZGVvIEludGVybGVhdmUgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ2aWRlby9hdmkiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9InZpZGVvL21zdmlkZW8iLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlJJRkYuLi4uQVZJICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkYiLz4KKyAgICAgICAgICAgIDxtYXRjaCBvZmZzZXQ9IjgiIHR5cGU9InN0cmluZyIgdmFsdWU9Ilx4NDFceDU2XHg0OVx4MjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hdmkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1zZ2ktbW92aWUiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTU9WSSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tb3ZpZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1hdHJvc2thIj4KKyAgICAgICAgPF9jb21tZW50Pk1hdHJvc2thIE1lZGlhIENvbnRhaW5lcjwvX2NvbW1lbnQ+CisgICAgICAgIDwhLS0gQ29tbW9uIG1hZ2ljIGFjcm9zcyBhbGwgTWF0cm9za2EgdmFyaWVudHMgLS0+CisgICAgICAgIDwhLS0gRm9yIGZ1bGwgZGV0ZWN0aW9uLCB3ZSBuZWVkIGEgY3VzdG9tIERldGVjdG9yLCBzZWUgVElLQS0xMTgwIC0tPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxQTQ1REZBMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbWF0cm9za2EiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbWF0cm9za2EiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ta3YiIC8+CisgICAgICAgIDwhLS0gTm90ZTogVGhlIG1hZ2ljIHZhbHVlIGJlbG93IGlzbid0IHByZXNlbnQgaW4gYWxsIE1LViBmaWxlcyAtLT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MUE0NURGQTM5MzQyODI4ODZENjE3NDcyNkY3MzZCNjEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tYXRyb3NrYSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tYXRyb3NrYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1rYSIgLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vd2VibSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1tYXRyb3NrYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndlYm0iIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9IngtY29uZmVyZW5jZS94LWNvb2x0YWxrIj4KKyAgICAgICAgPF9jb21tZW50PkNvb2x0YWxrIEF1ZGlvPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1maWN0aW9uYm9vayt4bWwiPgorICAgICAgICA8X2NvbW1lbnQ+RmljdGlvbkJvb2sgZG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LmdyaWJ1c2VyLnJ1L3htbC9maWN0aW9uYm9vay8yLjAiIGxvY2FsTmFtZT0iRmljdGlvbkJvb2siLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mYjIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFzY2lpZG9jIj4KKyAgICAgICAgPF9jb21tZW50PkFzY2lpZG9jIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc2NpaWRvYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkb2MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkLnR4dCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkb2MudHh0Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZCI+CisgICAgICAgIDxfY29tbWVudD5EIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtaGFtbCI+CisgICAgICAgIDxfY29tbWVudD5IQU1MIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oYW1sIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtaGF4ZSI+CisgICAgICAgIDxfY29tbWVudD5IYXhlIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oeCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXJzcmMiPgorICAgICAgICA8X2NvbW1lbnQ+UiBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouciIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veHF1ZXJ5Ij4KKyAgICAgICAgPF9jb21tZW50PlhRdWVyeSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54cXVlcnkiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKzwvbWltZS1pbmZvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtbWV0YWRhdGEuanBnIGIvMC4xMC9tZXRhZGF0YS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1tZXRhZGF0YS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyYzQ0YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtbWV0YWRhdGEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtbWV0YWRhdGEucHNkIGIvMC4xMC9tZXRhZGF0YS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1tZXRhZGF0YS5wc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5YjE2NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtbWV0YWRhdGEucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9tZXRhZGF0YS5qcGcgYi8wLjEwL21ldGFkYXRhL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvbWV0YWRhdGEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTBjZjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvbWV0YWRhdGEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUvc2l0ZS54bWwgYi8wLjEwL21ldGFkYXRhL3NyYy9zaXRlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDAxZjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iY2FzLW1ldGFkYXRhIj4KKyAgPGJvZHk+CisgICAgPGxpbmtzPgorICAgICAgPGl0ZW0gbmFtZT0iT09EVCIgaHJlZj0iLi4vb29kdC1zaXRlLyIvPgorICAgIDwvbGlua3M+CisKKyAgICA8bWVudSByZWY9InJlcG9ydHMiIGluaGVyaXQ9ImJvdHRvbSIvPgorICAgIDxtZW51IG5hbWU9IlNvZnR3YXJlIERvY3VtZW50YXRpb24iPgorICAgICAgPGl0ZW0gbmFtZT0iQmFzaWMgVXNlcidzIEd1aWRlIiBocmVmPSJ1c2VyL2Jhc2ljLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IkFkdmFuY2VkIFVzZXIncyBHdWlkZSIgaHJlZj0idXNlci9hZHZhbmNlZC5odG1sIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvc2l0ZS94ZG9jL3VzZXIvYWR2YW5jZWQueG1sIGIvMC4xMC9tZXRhZGF0YS9zcmMvc2l0ZS94ZG9jL3VzZXIvYWR2YW5jZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWViMmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy9zaXRlL3hkb2MvdXNlci9hZHZhbmNlZC54bWwKQEAgLTAsMCArMSwxNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+Q0FTLU1ldGFkYXRhIEFkdmFuY2VkIFVzZXIgR3VpZGU8L3RpdGxlPgorICAgIDxhdXRob3IgZW1haWw9Indvb2xsYXJkQGpwbC5uYXNhLmdvdiI+RGF2aWQgV29vbGxhcmQ8L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisgICAgCisgICAgPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBndWlkZSBpcyB0byBpbnN0cnVjdCB0aGUgdXNlciBpbiBzb21lIGFkdmFuY2VkIGNvbmNlcHRzIAorICAgIHdpdGhpbiB0aGUgQ0FTLU1ldGFkYXRhIHByb2plY3QsIGluY2x1ZGluZyB0aGUgcmFtaWZpY2F0aW9ucyBvZiBtZXRhZGF0YQorICAgIGV4dHJhY3Rpb24gd2l0aCByZWdhcmQgdG8gcmVwb3NpdG9yeSBzZWFyY2gsIHR5cGUsIGNoZWNraW5nLCBldGMsIGFuZCB0aGUgdXNlIAorICAgIG9mIG1pbWUtdHlwZSBkZXRlY3Rpb24uIEZvciBiYXNpYyB0b3BpY3MsIGluY2x1ZGluZyB0aGUgYmFzaWNzIG9mIG1ldGFkYXRhLCBob3cgCisgICAgdG8gd3JpdGUgbWV0YWRhdGEgZXh0cmFjdG9ycywgYW5kIGV4cGxhbmF0aW9ucyBvZiBleGlzdGluZyBtZXRhZGF0YSBleHRyYWN0b3JzLCAKKyAgICBzZWUgb3VyIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+QmFzaWMgR3VpZGUuPC9hPiBJbiB0aGUgcmVzdCBvZiB0aGlzIGd1aWRlLCAKKyAgICB3ZSB3aWxsIGNvdmVyIHRoZSBmb2xsb3dpbmcgdG9waWNzOjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSIjc2VhcmNoIj5QbGFubmluZyBNZXRhZGF0YSBmb3IgU2VhcmNoPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI3Byb3ZlbmFuY2UiPlBsYW5uaW5nIE1ldGFkYXRhIGZvciBQcm92ZW5hbmNlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI21pbWUiPk1JTUUtdHlwZSBEZXRlY3Rpb248L2E+PC9saT4KKyAgICA8L3VsPgorICAgIAorICAgIDwvc2VjdGlvbj4KKyAgCisgICAgPGEgbmFtZT0ic2VhcmNoIi8+CisgICAgPHNlY3Rpb24gbmFtZT0iUGxhbm5pbmcgTWV0YWRhdGEgZm9yIFNlYXJjaCI+CisgICAgCisgICAgPHA+QXMgZGlzY3Vzc2VkIGluIHRoZSA8YSBocmVmPSIuLi91c2VyL2Jhc2ljLmh0bWwiPkJhc2ljIEd1aWRlLDwvYT4gb25lIG9mIHRoZQorICAgIHByaW1hcnkgdXNlcyBvZiBtZXRhZGF0YSBpcyBzZWFyY2guIFdoZW4geW91IGNvbnNpZGVyIHNlYXJjaCwgcmVtZW1iZXIgdGhhdAorICAgIG5laXRoZXIgdGhlIENBUy1NZXRhZGF0YSBjb250YWluZXIgbm9yIHRoZSBDQVMtRmlsZW1nciBhcmUgY29nbml6YW50IG92ZXIKKyAgICBob3cgcGVvcGxlIHdpbGwgc2VhcmNoIHlvdXIgZGF0YSAtIHlvdSBhcmUuPC9wPgorICAgIAorICAgIDxwPldlIHJlY29tbWVuZCBkZXZlbG9waW5nIGEgZGF0YSBkaWN0aW9uYXJ5IGFzIGEgImJlc3QgcHJhY3RpY2UuIiBUaGUgCisgICAgPGEgaHJlZj0iaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD01NDE3MjEiPklCTSBEaWN0aW9uYXJ5IG9mIAorICAgIENvbXB1dGluZzwvYT4gZGVzY3JpYmVzIGEgZGF0YSBkaWN0aW9uYXJ5IGFzIGEgImNlbnRyYWxpemVkIHJlcG9zaXRvcnkgb2YgCisgICAgaW5mb3JtYXRpb24gYWJvdXQgZGF0YSBzdWNoIGFzIG1lYW5pbmcsIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgZGF0YSwgb3JpZ2luLCAKKyAgICB1c2FnZSwgYW5kIGZvcm1hdC4iIFRoaXMgaXMgYSBoaWdobHktcmVsYXRlZCBjb25jZXB0IHRvIG9udG9sb2d5LjwvcD4KKyAgICAKKyAgICA8cD5UaGUgYXR0cmlidXRlcyBvZiBhbmQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHByb2R1Y3RzIGluIHlvdXIgc3lzdGVtIHdpbGwKKyAgICBub3Qgb25seSBoZWxwIHlvdSB0byBkZXZlbG9wIGFwcHJvcHJpYXRlIHByb2R1Y3QgdHlwZXMgYnV0IGFsc28gdGhlIG1ldGFkYXRhCisgICAgeW91IHdpbGwgbmVlZCB0byBleHRyYWN0IGZyb20gcHJvZHVjdHMgdG8gZXN0YWJsaXNoIGJvdGggdGhlc2UgYXR0cmlidXRlcyBhbmQKKyAgICByZWxhdGlvbnNoaXBzLjwvcD4gCisgICAgCisgICAgPHA+SW4gdGhlIG5leHQgc3Vic2VjdGlvbnMsIHdlIHdpbGwgZGlzY3VzcyBzcGVjaWZpYyBhc3BlY3RzIG9mIG1ldGFkYXRhIAorICAgIGV4dHJhY3Rpb24gdGhhdCBpbXBhY3QgZG93bnN0cmVhbSBzZWFyY2guPC9wPgorICAgIAorICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik1pc3NpbmcgRWxlbWVudHMiPgorICAgIAorICAgIDxwPkJlY2F1c2UgbWV0YWRhdGEgZXh0cmFjdGlvbiBpcyBhIHNlcGFyYXRlIGFjdGl2aXR5IGZyb20gZXh0cmFjdGlvbiAoYXMgCisgICAgZGlzY3Vzc2VkIGluIHRoZSA8YSBocmVmPSIuLi91c2VyL2Jhc2ljLmh0bWwiPkJhc2ljIEd1aWRlPC9hPiksIGl0IGlzIHBvc3NpYmxlCisgICAgdGhhdCB0aGVyZSBpcyBhIG1pc3MtbWF0Y2ggYmV0d2VlbiB0aGUgbWV0YWRhdGEgZWxlbWVudHMgZXh0cmFjdGVkIGJ5IGFuIAorICAgIGV4dHJhY3RvciBhbmQgdGhlIG1ldGFkYXRhIGVsZW1lbnRzIHRoYXQgdGhlIENBUy1GaWxlbWdyIGFzc29jaWF0ZWQgd2l0aCAKKyAgICBhIHByb2R1Y3QgdHlwZS4gQ0FTLUZpbGVtZ3IsIHRoZXJlZm9yZSwgb25seSBpbmdlc3RzIHRoZSA8aT5pbnRlcnNlY3Rpb248L2k+CisgICAgb2YgdGhlIG1ldGFkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBwcm9kdWN0IGFuZCB0aGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoCisgICAgdGhlIHByb2R1Y3QgaW4gQ0FTLUZpbGVtZ3IgY29uZmlndXJhdGlvbi4gVGhpcyBtZWFucyB0aGF0IG1pc3NpbmcgZWxlbWVudHMKKyAgICBhcmUgcG9zc2libGUuPC9wPgorICAgIAorICAgIDwvc3Vic2VjdGlvbj4KKyAgICAKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJTdHJpbmctYmFzZWQgQ29tcGFyaXNvbiI+CisgICAgPHA+TWV0YWRhdGEgdmFsdWVzIGFyZSBzdG9yZWQgYXMgc3RyaW5ncyBpbiBDQVMtTWV0YWRhdGEuIFdoaWxlIHRoZXJlIGFyZSBhIAorICAgIG51bWJlciBvZiBnb29kIHJlYXNvbnMgZm9yIHRoaXMsIGl0IGlzIGEgZGVzaWduIHBvaW50IHRoYXQgaGFzIGEgbnVtYmVyIG9mIAorICAgIGltcG9ydGFudCByYW1pZmljYXRpb25zIGZvciBzZWFyY2guIFNwZWNpZmljYWxseSwgYWxsIG1ldGFkYXRhIGVsZW1lbnRzIHNob3VsZAorICAgIGJlIGNvbXBhcmFibGUuIE9mIGNvdXJzZSBzdHJpbmdzIGFyZSBjb21wYXJhYmxlLCBidXQgd2l0aG91dCBzb21lIGZvcmV0aG91Z2h0LCBhCisgICAgc3RyaW5nLWJhc2VkIGNvbXBhcmlzb24gY2FuIGFjdCBkaWZmZXJlbnRseSB0aGFuIHdvdWxkIGEgdHlwZS1iYXNlZCBjb21wYXJpc29uLjwvcD4KKyAgICAKKyAgICA8cD5UaGlzIGlzIHdoZXJlIHN0YW5kYXJkcyBjb21lIGludG8gcGxheS4gRm9yIHZhcmlvdXMgdHlwZXMsIHRoZXJlIGFyZSBzdGFuZGFyZAorICAgIHN0cmluZy1iYXNlZCByZXByZXNlbnRhdGlvbnMgdGhhdCBlbnN1cmUgY29tcGFyaXNvbnMgdGhhdCBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gaG93CisgICAgYSB0eXBlLWJhc2VkIGNvbXBhcmlzb24gd291bGQgd29yay4gVGhlcmUgaXMgY3VycmVudGx5IG5vIHBsYW4gdG8gZW5mb3JjZSB0aGVzZSAKKyAgICBzdGFuZGFyZHMgKGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHR5cGUsIHRoZSBhcHBsaWNhdGlvbiBkb21haW4sIGV0Yy4sIAorICAgIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGNvbXBldGluZyBzdGFuZGFyZHMgLSBlLmcuLCBUQUkgdnMuIFVUQyBmb3JtYXR0ZWQgVGltZSAKKyAgICBzdHJpbmdzKS48L3A+CisgICAgCisgICAgPHA+U29tZSBleGFtcGxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBzdGFuZGFyZHMgYnkgdHlwZTo8L3A+CisgICAgCisgICAgPHA+PHN0cm9uZz5EYXRlLVRpbWU8L3N0cm9uZz48L3A+CisgICAgCisgICAgPHA+V2l0aCB0aW1lLCBjb25zaXN0ZW5jeSBpcyBrZXkuIFRoZXJlIGFyZSBtdWx0aXBsZSBmb3JtYXRzLCBzdWNoIGFzIAorICAgIDxhIGhyZWY9Imh0dHA6Ly90eWNoby51c25vLm5hdnkubWlsL21qZC5odG1sIj5KdWxpYW4gRGF5IE51bWJlcnM8L2E+LCBvciBVVEMuIAorICAgIEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIGRpZmZlcmVudCB0aW1lIHN0YW5kYXJkcyBzdWNoIGFzIAorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPlVUQzwvYT4sIGxvY2FsIHRpbWUsIGFuZCAKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmJpcG0ub3JnL2VuL3NjaWVudGlmaWMvdGFpLyI+VEFJPC9hPi4gT25lIGFsc28gbmVlZHMgdG8gYmUgCisgICAgYXdhcmUgb2YgbGVhcCBzZWNvbmQgb2JzZXJ2YW5jZSBhbmQgbG9jYWwgdGltZSBjb252ZW50aW9ucyBzdWNoIGFzIGRheWxpZ2h0IHNhdmluZ3MgCisgICAgdGltZSwgZGVwZW5kaW5nIG9uIHJlcHJlc2VudGF0aW9uIGFuZCBzdGFuZGFyZCBzZWxlY3Rpb24uPC9wPgorICAgIAorICAgIDxwPkFkZGl0aW9uYWxseSwgaXQgaXMgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgaW50ZXItcHJvZHVjdCBjb25zaXN0ZW5jeSBjYW4gYmUgCisgICAganVzdCBhcyBpbXBvcnRhbnQgYXMgaW50cmEtcHJvZHVjdCBjb25zaXN0ZW5jeSBiZWNhdXNlIHRoZXJlIGFyZSBtYW55IGRvd25zdHJlYW0gCisgICAgdXNlIGNhc2VzIG9mIHRoZSBzZWFyY2ggZmVhdHVyZXMgb2YgQ0FTLUZpbGVtZ3IgYW5kIG90aGVyIENBUyBjb21wb25lbnRzIHRoYXQgCisgICAgaW52b2x2ZSBjcm9zcy1wcm9kdWN0IGNvbXBhcmlzb25zLjwvcD4KKyAgICAKKyAgICA8cD48c3Ryb25nPkludGVnZXJzPC9zdHJvbmc+PC9wPgorICAgIAorICAgIDxwPkludGVnZXJzIGNhbiBiZSBlYXNpbHkgcmVwcmVzZW50ZWQgYXMgY29tcGFyYWJsZSBzdHJpbmdzLCBidXQgeW91IG11c3QgcmVtZW1iZXIKKyAgICB0byBwYWQgY29ycmVjdGx5LiBUaGUgc3RyaW5nICIxIiBpcyBncmVhdGVyIHRoYW4gIjAxMjM0IiwgYnV0ICIwMDAxIiBpcyBsZXNzIHRoYW4gCisgICAgIjAxMjM0LiI8L3A+CisgICAgCisgICAgPHA+TGlrZSBEYXRlLVRpbWUsIGFwcHJvcHJpYXRlIG51bWVyaWNhbCByZXByZXNlbnRhdGlvbiBpcyB0aGUgcmVzcG9uc2liaWxpdHkKKyAgICBvZiB0aGUgbWV0YWRhdGEgZXh0cmFjdG9yLCB0aG91Z2ggd2UgaGF2ZSBidWlsdCBzb21lIGFkZGl0aW9uYWxseSBzdXBwb3J0IGZvciAKKyAgICByZXByZXNlbnRhdGlvbmFsIHRyYW5zZm9ybWF0aW9ucyBkdXJpbmcgdGhlIGluZ2VzdCBwcm9jZXNzIG9mIHRoZSBDQVMtRmlsZW1nci48L3A+CisgICAgICAgIAorICAgIDxwPk1vcmUgb24gUGFkZGluZy4uPC9wPiAgICAKKyAgICAgICAgCisgICAgPHA+PHN0cm9uZz5GbG9hdGluZyBQb2ludCBOdW1iZXJzPC9zdHJvbmc+PC9wPiAgICAKKyAgICAKKyAgICA8cD5UaGUgbW9zdCBwcmV2YWxlbnQgb2YgRmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb25zIGlzIAorICAgIDxhIGhyZWY9Imh0dHA6Ly9pZWVleHBsb3JlLmllZWUub3JnL3NlcnZsZXQvb3BhYz9wdW51bWJlcj00NjEwOTMzIj5JRUVFIDc1NC0yMDA4LjwvYT4KKyAgICBUaGlzIGlzIGEgY29udmVuaWVudCByZXByZXNlbnRhdGlvbiBiZWNhdXNlLCBhbW9uZ3N0IG90aGVyIHJlYXNvbnMsIGl0IGlzIHRoZSAKKyAgICByZXByZXNlbnRhdGlvbiB0aGF0IEphdmEgdXNlcyBzbyBpZiB5b3UgdXNlIEphdmEgdG8gZGV2ZWxvcCBhbiBleHRyYWN0b3IsIHlvdSBjYW4gCisgICAgdXNlIHRoZSA8Y29kZT5mbG9hdFRvSW50Qml0cyhmbG9hdCB2YWx1ZSk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgPGNvZGU+RmxvYXQ8L2NvZGU+IAorICAgIGNsYXNzLiBSZW1lbWJlciB0aGF0LCBsaWtlIEludGVnZXJzLCB5b3Ugd2lsbCBuZWVkIHBhZGRpbmcuPC9wPiAgCisgICAgCisgICAgPHA+PHN0cm9uZz5CbG9icywgVVJMcywgYW5kIENoYXJhY3RlciBTZXRzPC9zdHJvbmc+PC9wPiAgICAKKyAgICAKKyAgICA8cD5SZW1lbWJlciB0aGF0IHRleHQgZW5jb2RpbmcgaXMgaW1wb3J0YW50LiBEZXBlbmRpbmcgb24gdGhlIGNhdGFsb2cgZXh0ZW5zaW9uIAorICAgIHBvaW50IHVzZWQgYnkgdGhlIENBUy1GaWxlbWdyLCBtZXRhZGF0YSB2YWx1ZXMgbWlnaHQgbm90IGJlIGZvcm1hdHRpbmcgY29ycmVjdGx5CisgICAgZm9yIHN0b3JhZ2UuIEZvciBleGFtcGxlLCBpZiBhIG1ldGFkYXRhIG9iamVjdCBjb250YWluaW5nIGEgYmxvYiBvZiB0ZXh0IGlzIGluZ2VzdGVkCisgICAgaW50byBhIENBUy1GaWxlbWdyIGluc3RhbmNlIHRoYXQgaXMgY29uZmlndXJlZCB0byBydW4gd2l0aCBhIERhdGFTdG9yZSBleHRlbnNpb24gCisgICAgYmFja2VkIGJ5IGFuIE9yYWNsZSBEQk1TLCB0aGVuIFVURjggZW5jb2RpbmcgaXMgaW1wb3J0YW50LjwvcD4KKyAgICAgICAgCisgICAgICAgIAorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPGEgbmFtZT0icHJvdmVuYW5jZSIvPgorICAgIDxzZWN0aW9uIG5hbWU9IlBsYW5uaW5nIE1ldGFkYXRhIGZvciBQcm92ZW5hbmNlIj4KKyAgICA8cD5Db21pbmcgU29vbi4uLjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPGEgbmFtZT0ibWltZSIvPgorICAgIDxzZWN0aW9uIG5hbWU9Ik1JTUUtdHlwZSBEZXRlY3Rpb24iPgorICAgIAorICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgIAorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBuYW1lPSJDb25jbHVzaW9uIj4KKyAgICAgIDxwPlRoaXMgaXMgaW50ZW5kZWQgdG8gYSBsaXZpbmcgZG9jdW1lbnQgZGlzY3Vzc2luZyBhZHZhbmNlZCB0b3BpY3Mgd2l0aGluIHRoZSAKKyAgICAgIENBUy1NZXRhZGF0YSBwcm9qZWN0LCB0aG91Z2ggaXQgaXMgbm90IGNvbXByZWhlbnNpdmUuIEluIG91ciAKKyAgICAgIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+QmFzaWMgR3VpZGUsPC9hPiB3ZSBjb3ZlciBtb3JlIHRvcGljcyByZWdhcmRpbmcgCisgICAgICBiYXNpYyB0b3BpY3Mgd2l0aGluIENBUy1NZXRhZGF0YS48L3A+CisgICAgPC9zZWN0aW9uPgorICAgIAorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUveGRvYy91c2VyL2Jhc2ljLnhtbCBiLzAuMTAvbWV0YWRhdGEvc3JjL3NpdGUveGRvYy91c2VyL2Jhc2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzUwNzZhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvc2l0ZS94ZG9jL3VzZXIvYmFzaWMueG1sCkBAIC0wLDAgKzEsNDg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPkNBUy1NZXRhZGF0YSBCYXNpYyBVc2VyIEd1aWRlPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmlkIFdvb2xsYXJkPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgIAorICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZ3VpZGUgaXMgdG8gaW5zdHJ1Y3QgdGhlIHVzZXIgaW4gdGhlIGJhc2ljIGNvbmNlcHRzIAorICAgIGJlaGluZCB0aGUgQ0FTLU1ldGFkYXRhIHByb2plY3QsIGluY2x1ZGluZyB0aGUgYmFzaWNzIG9mIG1ldGFkYXRhLCBob3cgdG8gd3JpdGUgCisgICAgbWV0YWRhdGEgZXh0cmFjdG9ycywgYW5kIGV4cGxhbmF0aW9ucyBvZiBleGlzdGluZyBtZXRhZGF0YSBleHRyYWN0b3JzLiBJbiAKKyAgICBhZGRpdGlvbiB0byB0aGlzIGd1aWRlLCBzb21lIG9mIHRoZXNlIGNvbmNlcHRzIGFyZSBhbHNvIGNvdmVyZWQgaW4gb3VyCisgICAgQ0FTLUZpbGUgTWFuYWdlciA8YSBocmVmPSIuLi8uLi9maWxlbWdyL3VzZXIvIj5Vc2VyIEd1aWRlPC9hPgorICAgIGFuZCBpbiBvdXIgQ0FTLUN1cmF0b3IgPGEgaHJlZj0iLi4vLi4vY3VyYXRvci91c2VyL2Jhc2ljLmh0bWwiPgorICAgIEJhc2ljIFVzZXIgR3VpZGU8L2E+LiBGb3IgYWR2YW5jZWQgdG9waWNzLCBpbmNsdWRpbmcgZXh0cmFjdGluZyB0ZWNobmlxdWVzIHRvIGFsbG93CisgICAgZm9yIHR5cGUtYmFzZWQgbWF0Y2hpbmcsIHNlZSBvdXIgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBHdWlkZS48L2E+CisgICAgSW4gdGhlIHJlc3Qgb2YgdGhpcyBndWlkZSwgd2Ugd2lsbCBjb3ZlciB0aGUgZm9sbG93aW5nIHRvcGljczo8L3A+CisKKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI2Jhc2ljcyI+TWV0YWRhdGEgQmFzaWNzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI2V4dHJhY3RvcnMiPk1ldGFkYXRhIEV4dHJhY3RvcnM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjZXhpc3RpbmciPkV4aXN0aW5nIEltcGxlbWVudGF0aW9uczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNmaWxlbWdyIj5SZWxhdGlvbnNoaXAgdG8gQ0FTLUZpbGVtZ3I8L2E+PC9saT4KKyAgICA8L3VsPgorICAgIDwvc2VjdGlvbj4KKyAgCisgICAgPGEgbmFtZT0iYmFzaWNzIi8+CisgICAgPHNlY3Rpb24gbmFtZT0iTWV0YWRhdGEgQmFzaWNzIj4KKyAgICAKKyAgICA8cD5NZXRhZGF0YSBpcyA8aT5kYXRhIGFib3V0IGRhdGE8L2k+LiBTaW1wbHkgcHV0LCBtZXRhZGF0YSBpcyBpbmZvcm1hdGlvbiBhYm91dCBkYXRhCisgICAgdGhhdCBhaWRzIHRoZSB1c2VyIGluIGZpbmRpbmcgd2hhdCB0aGV5IGFyZSBsb29raW5nIGZvciBhbmQgY2xhcmlmeWluZyB3aGF0IHRoZXkgYXJlIAorICAgIGxvb2tpbmcgYXQuIFRoZXJlIGFyZSBtYW55IGV4YW1wbGVzIG9mIG1ldGFkYXRhIHN0YW5kYXJkcywgaW5jbHVkaW5nIAorICAgIDxhIGhyZWY9Imh0dHA6Ly9kdWJsaW5jb3JlLm9yZy8iPkR1YmxpbiBDb3JlPC9hPiBhbmQgSVNPIAorICAgIDxhIGhyZWY9Imh0dHA6Ly9tZXRhZGF0YS1zdGRzLm9yZy8iPlN0YW5kYXJkcy48L2E+PC9wPgorICAgIAorICAgIDxwPkV4YW1wbGVzIG9mIG1ldGFkYXRhIGluY2x1ZGUgZmlsZW5hbWUsIFVSTCwgZGF0YSBwcm9kdWNlciwgc3RhcnQgYW5kIHN0b3AgZGF0ZXRpbWUgCisgICAgZm9yIHRlbXBvcmFsIGZpbGVzLCBib3VuZGluZyBwb2x5Z29ucyBmb3IgZ2VvLXJlZmVyZW5jZWQgZGF0YSwgZXRjLiBJbiB0aGUgQ0FTLU1ldGFkYXRhCisgICAgcHJvamVjdCwgYW5kIGluIGFsbCBvZiBPT0RULCBNZXRhZGF0YSBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGEgY29udGFpbmVyIGZvciAKKyAgICBwcm9kdWN0LXJlbGF0ZWQgbWV0YWRhdGEuIEludGVyZmFjZXMgZm9yIHRoZSA8Y29kZT5NZXRhZGF0YTwvY29kZT4gT2JqZWN0IGFyZSBzaG93biAKKyAgICBiZWxvdzo8L3A+CisgICAgCis8c291cmNlPjwhW0NEQVRBWyAgICAKK3B1YmxpYyBjbGFzcyBNZXRhZGF0YSB7CisKKyAgICBwdWJsaWMgTWV0YWRhdGEoKSB7Li4ufQorCisgICAgcHVibGljIE1ldGFkYXRhKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgRXhjZXB0aW9uIHsuLi59CisKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShIYXNodGFibGUgbWV0YWRhdGEpIHsuLi59CisKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShIYXNodGFibGUgbWV0YWRhdGEsIGJvb2xlYW4gcmVwbGFjZSkgey4uLn0KKworICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShIYXNodGFibGUgbWV0YWRhdGEpIHsuLi59CisKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsuLi59CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkTWV0YWRhdGEoU3RyaW5nIGtleSwgTGlzdCB2YWx1ZXMpIHsuLi59CisKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTWV0YWRhdGEoU3RyaW5nIGtleSwgTGlzdCB2YWx1ZXMpIHsuLi59CisKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTWV0YWRhdGEoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Li4ufQorCisgICAgcHVibGljIE9iamVjdCByZW1vdmVNZXRhZGF0YShTdHJpbmcga2V5KSB7Li4ufQorCisgICAgcHVibGljIExpc3QgZ2V0QWxsTWV0YWRhdGEoU3RyaW5nIGtleSkgey4uLn0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YWRhdGEoU3RyaW5nIGtleSkgey4uLn0KKworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0SGFzaHRhYmxlKCkgey4uLn0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsuLi59CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKFN0cmluZyBrZXkpIHsuLi59CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsuLi4ufQorCisgICAgcHVibGljIERvY3VtZW50IHRvWE1MKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Li4ufQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsuLi59Cit9ICAgIAorXV0+PC9zb3VyY2U+ICAgIAorICAgIAorICAgIDxwPlRoZSBDQVMtTWV0YWRhdGEgPGNvZGU+TWV0YWRhdGE8L2NvZGU+IG9iamVjdCBpcyBhIGtleS1tdWx0aXZhbHVlIGNvbnRhaW5lci4KKyAgICBVc2VycyBjYW4gYWRkIG1ldGFkYXRhIGVsZW1lbnRzIHRvIHRoZSA8Y29kZT5NZXRhZGF0YTwvY29kZT4gT2JqZWN0IHZpYSAKKyAgICBJbnB1dFN0cmVhbSwgSGFzaFRhYmxlIE9iamVjdCwga2V5IHdpdGggYW4gYXJyYXkgb2YgdmFsdWVzLCBhbmQgYSBzaW1wbGUKKyAgICBrZXkgYW5kIHNpZ25hbCB2YWx1ZSBpbnRlcmZhY2UuIEFsbCBrZXlzIGFuZCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIFN0cmluZ3MuIAorICAgIFNlZSBvdXIgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBHdWlkZTwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICBhYm91dCB0aGUgcmFtaWZpY2F0aW9uIG9mIHRoaXMgZGVzaWduIGRlY2lzaW9uIGR1cmluZyB0eXBlLWJhc2VkIG1ldGFkYXRhIHNlYXJjaAorICAgIGFuZCBjb21wYXJpc29uLjwvcD4gIAorICAgIAorICAgIDxwPkluIGFkZGl0aW9uIHRvIHRoZSBhY2Nlc3NvciBhbmQgbW9kaWZpZXIgbWV0aG9kcyB0aGF0IHdvcmsgd2l0aCBzaW1wbGUgU3RyaW5ncywKKyAgICB0aGUgPGNvZGU+TWV0YWRhdGE8L2NvZGU+IE9iamVjdCBjYW4gd29yayB3aXRoIFhNTCBEb2N1bWVudHMuIEFuIGV4YW1wbGUgb2YgCisgICAgbWV0YWRhdGEgaW4gdGhlIFhNTCBmb3JtYXQgaXMgZ2l2ZW4gYmVsb3c6PC9wPgorICAgIDwhLS0gRklYTUU6IGNoYW5nZSBuYW1lc3BhY2UgVVJJPyAtLT4KKyAgICA8c291cmNlPjwhW0NEQVRBWzxjYXM6bWV0YWRhdGEgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisgIDxrZXl2YWw+CisgICAgPGtleT5Qcm9kdWN0VHlwZTwva2V5PgorICAgIDx2YWw+TVAzPC92YWw+CisgIDwva2V5dmFsPgorICA8a2V5dmFsPgorICAgIDxrZXk+RmlsZW5hbWU8L2tleT4KKyAgICA8dmFsPmJsdWVfc3VlZGVfc2hvZXMubXAzPC92YWw+CisgIDwva2V5dmFsPgorICA8a2V5dmFsPgorICAgIDxrZXk+QXJ0aXN0PC9rZXk+CisgICAgPHZhbD5UaGUgQmVhdGxlczwvdmFsPgorICA8L2tleXZhbD4KKyAgPGtleXZhbD4KKyAgICA8a2V5PkFsYnVtPC9rZXk+CisgICAgPHZhbD5SZXZvbHZlcjwvdmFsPgorICA8L2tleXZhbD4KKyAgPGtleXZhbD4KKyAgICA8a2V5PlNvbmdOYW1lPC9rZXk+CisgICAgPHZhbD5CbHVlIFN1ZWRlIFNob2VzPC92YWw+CisgIDwva2V5dmFsPgorPC9jYXM6bWV0YWRhdGE+XV0+PC9zb3VyY2U+CisgICAgCisJPHA+VGhlIGFib3ZlIG1ldGFkYXRhIGV4YW1wbGUgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gYW4gTVAzIGZpbGUuIFRoZXJlIGFyZSBhCisgICAgbnVtYmVyIG9mIG1ldGFkYXRhIGVsZW1lbnRzLCBpbmNsdWRpbmcgdGhlIEFydGlzdCwgQWxidW0sIGFuZCBTb25nTmFtZSwgYXMgd2VsbCAKKyAgICBhcyB0aGUgcHJvZHVjdCB0eXBlIChpbiB0aGlzIGNhc2UsICdNUDMnKSwgYW5kIHRoZSBuYW1lIG9mIHRoZSBtcDMgZmlsZS4gSW4gCisgICAgYWRkaXRpb24sIG1ldGFkYXRhIGVsZW1lbnRzIGNhbiBiZSBtdWx0aXZhbHVlZC4gSW4gdGhpcyBjYXNlLCB0aGUgCisgICAgPGNvZGU+Jmx0O2tleXZhbCZndDs8L2NvZGU+IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgPGNvZGU+Jmx0O3ZhbCZndDs8L2NvZGU+CisgICAgY2hpbGQgZWxlbWVudHMuPC9wPiAKKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgCisgICAgPGEgbmFtZT0iZXh0cmFjdG9ycyIvPgorICAgIDxzZWN0aW9uICBuYW1lPSJNZXRhZGF0YSBFeHRyYWN0b3JzIj4KKyAgICA8cD5UaGUgcm9sZSBvZiBhIG1ldGFkYXRhIGV4dHJhY3RvciBpcyBleHRyYWN0IG1ldGFkYXRhIGZyb20gb25lIG9yIG1vcmUgcHJvZHVjdCAKKyAgICA8aT50eXBlczwvaT4uIEluIG9yZGVyIHRvIGV4dHJhY3QgbWV0YWRhdGEsIHRoZSBleHRyYWN0b3IgbXVzdCB1bmRlcnN0YW5kIHRoZSBwcm9kdWN0IAorICAgIHR5cGUgZm9ybWF0LCBwYXJzZSB0aGUgcHJvZHVjdCwgYW5kIHJldHVybiBtZXRhZGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgcHJvZHVjdC4gQ0FTLUN1cmF0b3IsIGZvciBleGFtcGxlLCB1c2VzIG1ldGFkYXRhIGV4dHJhY3RvcnMgdG8gZ2VuZXJhdGUgbWV0YWRhdGEgZm9yIAorICAgIHByb2R1Y3RzIGluIGl0cyBzdGFnaW5nIGFyZWEsIGJvdGggYXMgYSBwcmV2aWV3IHRvIHRoZSBjdXJhdG9yLCBhbmQgYWxzbyBkdXJpbmcgdGhlIAorICAgIGNvdXJzZSBvZiBkYXRhIGluZ2VzdGlvbi48L3A+IAorICAgIAorICAgIAorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkphdmEgQVBJIj4KKyAgICAKKyAgICA8cD5UaGUgQ0FTLU1ldGFkYXRhIHByb2plY3QgY29udGFpbnMgYW4gaW50ZXJmYWNlIGNsYXNzLCAKKyAgICA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvcjwvY29kZT4uIFRoaXMgQVBJIGNvbnNpc3RzIG9mCisgICAgdHdvIHByaW1hcnkgbWV0aG9kcyAod2l0aCBtdWx0aXBsZSBtZXRob2Qgc2lnbmF0dXJlcyBlYWNoKS4gVGhpcyBBUEkgY2FuIGJlIHNlZW4gCisgICAgYmVsb3c6PC9wPgorICAgIAorPHNvdXJjZT48IVtDREFUQVtwdWJsaWMgaW50ZXJmYWNlIE1ldEV4dHJhY3RvciB7CisKKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKEZpbGUgZikgCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoU3RyaW5nIGZpbGVQYXRoKQorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKFVSTCBmaWxlVXJsKSAKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJhY3RNZXRhZGF0YShGaWxlIGYsIEZpbGUgCisgICAgICAgICAgICBjb25maWdGaWxlKSB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBNZXRhZGF0YSBleHRyYWN0TWV0YWRhdGEoRmlsZSBmLCBTdHJpbmcgCisgICAgICAgICAgICBjb25maWdGaWxlUGF0aCkgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICBwdWJsaWMgTWV0YWRhdGEgZXh0cmFjdE1ldGFkYXRhKEZpbGUgZiwgCisgICAgICAgICAgICBNZXRFeHRyYWN0b3JDb25maWcgY29uZmlnKSAKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworCisgICAgcHVibGljIE1ldGFkYXRhIGV4dHJhY3RNZXRhZGF0YShVUkwgZmlsZVVybCwgCisgICAgICAgICAgICBNZXRFeHRyYWN0b3JDb25maWcgY29uZmlnKSAKKyAgICAgICAgICAgIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworICAgICAgICAgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZShGaWxlIGYpIAorICAgICAgICAgICAgdGhyb3dzIE1ldEV4dHJhY3Rpb25FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdGaWxlKFN0cmluZyBmaWxlUGF0aCkgCisgICAgICAgICAgICB0aHJvd3MgTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGUoTWV0RXh0cmFjdG9yQ29uZmlnIGNvbmZpZyk7Cit9XV0+PC9zb3VyY2U+CisgICAgCisgICAgPHA+SW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgbmV3IGV4dHJhY3RvciwgYSBkZXZlbG9wZXIgbWF5IGltcGxlbWVudCB0aGUKKyAgICA8Y29kZT5NZXRFeHRyYWN0b3I8L2NvZGU+IGludGVyZmFjZSwgb3IgZGV2ZWxvcCBhIG1ldGFkYXRhIGV4dHJhY3RvciAKKyAgICB0aGF0IGFkaGVyZXMgdG8gdGhpcyBpbnRlcmZhY2UgaW4gdGhlIGRldmVsb3BtZW50IGxhbmd1YWdlIG9mIGNob2ljZS48L3A+CisgICAgCisgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8YSBuYW1lPSJleGlzdGluZyIvPgorICAgIDxzZWN0aW9uIG5hbWU9IkV4aXN0aW5nIEltcGxlbWVudGF0aW9ucyI+CisgICAgICAKKyAgICA8cD5UaGUgQ0FTLU1ldGFkYXRhIHByb2plY3QgY29udGFpbnMgYSBudW1iZXIgb2YgZXhpc3RpbmcgbWV0YWRhdGEgCisgICAgZXh0cmFjdG9yIGltcGxlbWVudGF0aW9ucyB0aGF0IHRoZSBkZXZlbG9wIGNhbiBkaXJlY3RseSBsZXZlcmFnZS48L3A+ICAKKyAgICAKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJFeHRlcm5hbCBNZXRhZGF0YSBFeHRyYWN0b3IiPgorICAgIAorICAgIDxwPlRoZXJlIGFyZSBtYW55IHNpdHVhdGlvbnMgaW4gd2hpY2ggZGV2ZWxvcGVycyBhcmUgaW50ZXJlc3RlZCBpbiB1c2luZworICAgIGEgbWV0YWRhdGEgZXh0cmFjdG9yIHRoYXQgaXMgbm90IHdyaXR0ZW4gaW4gSmF2YS4gUGVyaGFwcyB0aGVyZSBpcyBhbiAKKyAgICBleGlzdGluZyBleHRyYWN0b3Igd3JpdHRlbiBpbiBhIGRpZmZlcmVudCBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGUgc291cmNlIAorICAgIG9mIHdoaWNoIHlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MsIG9yIHBlcmhhcHMgdGhlcmUgYXJlIGZ1bmN0aW9uYWwgb3IgCisgICAgbm9uLWZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHRoYXQgbWFrZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBtb3JlIAorICAgIGFwcHJvcHJpYXRlLjwvcD4KKyAgICAgIAorICAgIDxwPldlIGhhdmUgZGV2ZWxvcGVkIHRoZSA8Y29kZT5FeHRlcm5NZXRFeHRyYWN0b3I8L2NvZGU+IGFzIHBhcnQgb2YgdGhlCisgICAgQ0FTIE1ldGFkYXRhIHByb2plY3QgdG8gYWRkcmVzcyB0aGlzIGlzc3VlLiBUaGUgPGNvZGU+RXh0ZXJuTWV0RXh0cmFjdG9yPC9jb2RlPiAKKyAgICB1c2VzIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIHNwZWNpZnkgdGhlIGV4dHJhY3RvciB3b3JraW5nIGRpcmVjdG9yeSwgdGhlIHBhdGggCisgICAgdG8gdGhlIGV4ZWN1dGFibGUsIGFuZCBhbnkgY29tbWFuZGxpbmUgYXJndW1lbnRzLiBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlzIHNwZWNpZmllZCBiZWxvdzo8L3A+ICAKKyAgICAgICAKKzxzb3VyY2U+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjYXM6ZXh0ZXJuZXh0cmFjdG9yIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorICA8ZXhlYyB3b3JraW5nRGlyPSIiPgorICAgIDxleHRyYWN0b3JCaW5QYXRoIGVudlJlcGxhY2U9InRydWUiPltQV0RdL2V4dHJhY3RvcjwvZXh0cmFjdG9yQmluUGF0aD4KKyAgICAgIDxhcmdzPgorICAgICAgICAgPGFyZyBpc0RhdGFGaWxlPSJ0cnVlIi8+CisgICAgICAgICA8YXJnIGlzUGF0aD0idHJ1ZSI+L3Vzci9sb2NhbC9ldGMvdGVzdEV4dHJhY3Rvci5jb25maWc8L2FyZz4KKyAgICAgIDwvYXJncz4KKyAgIDwvZXhlYz4KKzwvY2FzOmV4dGVybmV4dHJhY3Rvcj5dXT48L3NvdXJjZT4KKyAgICAKKyAgICA8cD5UaGVyZSBhcmUgYSBudW1iZXIgb2YgaW1wb3J0YW50IGVsZW1lbnRzIHRvIHRoZSBleHRlcm5hbCBtZXRhZGF0YSBleHRyYWN0b3IgCisgICAgY29uZmlndXJhdGlvbiBmaWxlLCBpbmNsdWRpbmcgd29ya2luZyBkaXJlY3RvcnkgKHRoZSA8Y29kZT53b3JraW5nRGlyPC9jb2RlPgorICAgIGF0dHJpYnV0ZSBvbiB0aGUgPGNvZGU+ZXhlYzwvY29kZT4gdGFnKSwgdGhlIHBhdGggdGhlIHRoZSBleGVjdXRhYmxlIGV4dHJhY3RvcgorICAgICh0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmV4dHJhY3RvckJpblBhdGg8L2NvZGU+IHRhZyksIGFuZCBhbnkgYXJndW1lbnRzIHJlcXVpcmVkCisgICAgYnkgdGhlIGV4dHJhY3RvciAodmFsdWVzIG9mIHRoZSA8Y29kZT5hcmdzPC9jb2RlPiB0YWdzKS48L3A+CisgICAgCisgICAgPHA+VGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBtZXRhZGF0YSBmaWxlIGlzIHRvIGJlIAorICAgIGdlbmVyYXRlZCksIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZXh0cmFjdG9yIGlzIHJ1bi4gVGhpcyAKKyAgICBpcyBzaWduYWxlZCBieSBhIG51bGwgdmFsdWUuPC9wPgorICAgIAorICAgIDxwPkNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXJlIGRlbGl2ZXJlZCB0byB0aGUgZXh0ZXJuYWwgZXh0cmFjdG9yIGluIHRoZSBvcmRlciAKKyAgICB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gSW4gb3JkZXIgd29yZHMsPC9wPgorCis8c291cmNlPjwhW0NEQVRBWworICA8YXJncz4KKyAgICA8YXJnPmFyZzE8L2FyZz4KKyAgICA8YXJnPmFyZzI8L2FyZz4KKyAgICA8YXJnPmFyZzM8L2FyZz4KKyAgPC9hcmdzPgorXV0+PC9zb3VyY2U+ICAgIAorICAgIAorICAgICA8cD53b3VsZCBiZSBwYXNzZWQgdG8gdGhlIGV4dHJhY3RvciBhcyA8Y29kZT5hcmcxIGFyZzIgYXJnMzwvY29kZT4uPC9wPgorICAgICAKKyAgICAgPHA+QWRkaXRpb25hbGx5LCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygc3BlY2lhbGl6YXRpb25zIG9mIHRoZSAKKyAgICAgPGNvZGU+YXJnPC9jb2RlPiB0YWcgdGhhdCBjYW4gYmUgc2V0IHdpdGggdGFnIGF0dHJpYnV0ZXMuIFNwZWNpZmljYWxseTo8L3A+CisgICAgIAorICAgICA8dWw+CisgICAgICAgPGxpPjxjb2RlPmlzRGF0YUZpbGU9InRydWUiPC9jb2RlPiAtIFRoaXMgYXR0cmlidXRlIHBhc3NlcyB0aGUgZnVsbCBwYXRoIHRvIAorICAgICAgIHRoZSBwcm9kdWN0IGZyb20gd2hpY2ggbWV0YWRhdGEgaXMgdG8gYmUgZXh0cmFjdGVkIGFzIHRoZSBhcmd1bWVudC48L2xpPgorICAgICAgIDxsaT48Y29kZT5pc1BhdGg9InRydWUiPC9jb2RlPiAtIFRoaXMgYXR0cmlidXRlIHBhc3NlcyB0aGUgYXJndW1lbnQgZW5jb2RlZAorICAgICAgIGFzIGEgcHJvcGVybHkgZm9ybWVkIHBhdGggKG5vIGNoYXItc2V0IHJlcGxhY2VtZW50LCBldGMpLjwvbGk+CisgICAgICAgPGxpPjxjb2RlPmVudlJlcGxhY2U9InRydWUiPC9jb2RlPiAtIFRoaXMgYXR0cmlidXRlIHJlcGxhY2VzIGFueSBwYXJ0IG9mCisgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCB0aGF0IGlzIGluc2lkZSBicmFja2V0cyAoPGNvZGU+WzwvY29kZT4gYW5kIAorICAgICAgIDxjb2RlPl08L2NvZGU+KSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYXRjaGluZyB0aGUgdGV4dCBpbnNpZGUgdGhlIAorICAgICAgIGJyYWNrZXRzLCBpZiBzdWNoIGFuIGVudmlyb21lbnQgdmFyaWFibGUgZXhpc3RzLjwvbGk+CisgICAgIDwvdWw+CisgICAgIAorICAgICA8cD5Gb3IgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgdHlwZSBvZiBtZXRhZGF0YSBleHRyYWN0b3IsIHdlIG91ciAKKyAgICAgQ0FTLUN1cmF0b3IgPGEgaHJlZj0iLi4vLi4vY3VyYXRvci91c2VyL2Jhc2ljLmh0bWwiPgorICAgICBCYXNpYyBVc2VyIEd1aWRlPC9hPi48L3A+CisgICAgIAorICAgICA8L3N1YnNlY3Rpb24+CisgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlRoZSBGaWxlbmFtZSBUb2tlbiBNZXRhZGF0YSBFeHRyYWN0b3IiPgorICAgICAKKyAgICAgPHA+SW4gbWFueSBjYXNlcywgcHJvZHVjdHMgdGhhdCBhcmUgdG8gYmUgaW5nZXN0ZWQgYXJlIG5hbWVkIHdpdGggbWV0YWRhdGEKKyAgICAgdGhhdCBzaG91bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIHByb2R1Y3QgbmFtZSBhbmQgY2F0YWxvZ2VkIHVwb24gaW5nZXN0LiBGb3IKKyAgICAgdGhpcyB0eXBlIG9mIHNpdHVhdGlvbiwgd2UgaGF2ZSBkZXZlbG9wZWQgdGhlIAorICAgICA8Y29kZT5GaWxlbmFtZVRva2VuTWV0RXh0cmFjdG9yPC9jb2RlPi4gVGhpcyBleHRyYWN0b3IgdXNlcyBhIGNvbmZpZ3VyYXRpb24KKyAgICAgZmlsZSB0aGF0IHNwZWNpZmllcywgZm9yIGVhY2ggbWV0YWRhdGEgZWxlbWVudCwgdGhlIGluZGV4IG9mIHRoZSBzdGFydCAKKyAgICAgcG9zaXRpb24gaW4gdGhlIG5hbWUgZm9yIHRoaXMgbWV0YWRhdGEgYW5kIGl0cyBjaGFyYWN0ZXIgbGVuZ3RoLjwvcD4KKyAgICAgCisgICAgIDxwPkJlbG93IGlzIGFuIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlIHVzZWQgYnkgdGhlIAorICAgICA8Y29kZT5GaWxlbmFtZVRva2VuTWV0RXh0cmFjdG9yPC9jb2RlPi4gSXQgYXNzdW1lcyBhIHByb2R1Y3QgbmFtZSBmb3JtYXR0ZWQgCisgICAgIGFzIGZvbGxvd3M6PC9wPgorICAgICAKKyAgICAgPHA+PGNvZGU+TWlzc2lvbk5hbWVfRGF0ZV9TdGFydE9yYml0TnVtYmVyX1N0b3BPcmJpdE51bWJlci50eHQ8L2NvZGU+PC9wPgorICAgICAKKyA8c291cmNlPjwhW0NEQVRBWworICA8aW5wdXQ+CisgICAgPGdyb3VwIG5hbWU9IlN1YnN0cmluZ09mZnNldEdyb3VwIj4KKyAgICAgIDx2ZWN0b3IgbmFtZT0iTWlzc2lvbk5hbWUiPgorICAgICAgICA8ZWxlbWVudD4xPC9lbGVtZW50PgorICAgICAgICA8ZWxlbWVudD4xMTwvZWxlbWVudD4gICAgICAKKyAgICAgIDwvdmVjdG9yPgorICAgICAgPHZlY3RvciBuYW1lPSJEYXRlIj4KKyAgICAgICAgPGVsZW1lbnQ+MTM8L2VsZW1lbnQ+CisgICAgICAgIDxlbGVtZW50PjQ8L2VsZW1lbnQ+CisgICAgICA8L3ZlY3Rvcj4KKyAgICAgIDx2ZWN0b3IgbmFtZT0iU3RhcnRPcmJpdE51bWJlciI+CisgICAgICAgIDxlbGVtZW50PjE4PC9lbGVtZW50PgorICAgICAgICA8ZWxlbWVudD4xNjwvZWxlbWVudD4KKyAgICAgIDwvdmVjdG9yPgorICAgICAgPHZlY3RvciBuYW1lPSJTdG9wT3JiaXROdW1iZXIiPgorICAgICAgICA8ZWxlbWVudD4zNTwvZWxlbWVudD4KKyAgICAgICAgPGVsZW1lbnQ+MTU8L2VsZW1lbnQ+CisgICAgICA8L3ZlY3Rvcj4KKyAgIDwvZ3JvdXA+CisgICAgCisgICAgPGdyb3VwIG5hbWU9IkNvbW1vbk1ldGFkYXRhIj4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJEYXRhVmVyc2lvbiI+MS4wPC9zY2FsYXI+CisgICAgICAgIDxzY2FsYXIgbmFtZT0iQ29sbGVjdGlvbk5hbWUiPlRlc3Q8L3NjYWxhcj4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJEYXRhUHJvdmlkZXIiPk9PRFQ8L3NjYWxhcj4KKyAgICA8L2dyb3VwPgorPC9pbnB1dD4KK11dPjwvc291cmNlPiAKKyAgICAgCisgICAgIDxwPkluIHRoaXMgY29uZmlndXJhdGlvbiwgdGhlIDxjb2RlPkZpbGVuYW1lVG9rZW5NZXRFeHRyYWN0b3I8L2NvZGU+IHdpbGwgCisgICAgIHByb2R1Y2UgZm91ciBtZXRhZGF0YSBlbGVtZW50cyBmcm9tIHRoZSBwcm9kdWN0IG5hbWU6IDxpPk1pc3Npb25OYW1lPC9pPiwKKyAgICAgPGk+RGF0ZTwvaT4sIDxpPlN0YXJ0T3JiaXROdW1iZXI8L2k+LCBhbmQgPGk+U3RvcE9yYml0TnVtYmVyPC9pPi4gVGhlIGZpcnN0IAorICAgICBlbGVtZW50IG9mIGVhY2ggb2YgdGhlc2UgZ3JvdXBzIGlzIHRoZSBzdGFydCBpbmRleCAodGhpcyBhc3N1bWVzIDEtaW5kZXhlZAorICAgICBzdHJpbmdzKS4gVGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBzdWJzdHJpbmcgbGVuZ3RoLjwvcD4KKyAgICAgCisgICAgIDxwPkFkZGl0aW9uYWxseSwgdGhpcyBjb25maWd1cmF0aW9uIHNwZWNpZmllcyB0aGF0IG1ldGFkYXRhIGZvciBhbGwgcHJvZHVjdHMKKyAgICAgYWRkaXRpb25hbGx5IGNvbnRhaW4gdGhyZWUgY29tbWVudCBtZXRhZGF0YSBlbGVtZW50cyB0aGF0IGFyZSBzdGF0aWM6IAorICAgICA8aT5EYXRhVmVyc2lvbjwvaT4sIDxpPkNvbGxlY3Rpb25OYW1lPC9pPiwgYW5kIDxpPkRhdGFQcm92aWRlcjwvaT4uPC9wPgorICAgICAKKyAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlByb2R1Y3QgVHlwZSBQYXR0ZXJuIE1ldGFkYXRhIEV4dHJhY3RvciI+CisgICAgIDxwPlRoZSA8Y29kZT5Qcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3I8L2NvZGU+IGNhbiBhbHNvIGJlIHVzZWQgdG8gZXh0cmFjdAorICAgICBtZXRhZGF0YSBmcm9tIHRoZSBmaWxlbmFtZS4gIFVubGlrZSB0aGUgPGNvZGU+RmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvcjwvY29kZT4sCisgICAgIG1ldGFkYXRhIGVsZW1lbnRzIGRvIG5vdCBoYXZlIHRvIGJlIGZpeGVkLW9mZnNldCBhbmQgZml4ZWQtbGVuZ3RoLiAgSW5zdGVhZCwKKyAgICAgbWV0YWRhdGEgZWxlbWVudHMgYXJlIHJlcHJlc2VudGVkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUaGVzZSBlbGVtZW50cyBhcmUKKyAgICAgdXNlZCBpbiBmaWxlbmFtZSB0ZW1wbGF0ZXMgdGhhdCwgd2hlbiBtYXRjaGVkLCBkeW5hbWljYWxseSBkZXRlcm1pbmUgdGhlCisgICAgIFByb2R1Y3RUeXBlIG9mIHRoZSBmaWxlLjwvcD4KKworICAgICA8cD5CZWxvdyBpcyBhbiBleGFtcGxlIG9mIGEgPGNvZGU+cHJvZHVjdC10eXBlLXBhdHRlcm5zLnhtbDwvY29kZT4gY29uZmlndXJhdGlvbgorICAgICBmaWxlIHVzZWQgYnkgdGhlIDxjb2RlPlByb2RUeXBlUGF0dGVybk1ldEV4dHJhY3Rvcjo8L2NvZGU+PC9wPgorCis8c291cmNlPjwhW0NEQVRBWworPGNvbmZpZz4KKyAgPCEtLSA8ZWxlbWVudD4gTVVTVCBiZSBkZWZpbmVkIGJlZm9yZSA8cHJvZHVjdC10eXBlPiBzbyB0aGVpciBwYXR0ZXJucyBjYW4gYmUgcmVzb2x2ZWQgLS0+CisgIDwhLS0gbmFtZSBNVVNUIGJlIGFuIGVsZW1lbnQgZGVmaW5lZCBpbiBlbGVtZW50cy54bWwgKGFsc28gb25seSB1cHBlciBhbmQgbG93ZXIgY2FzZSBhbHBoYSBjaGFycykgLS0+CisgIDwhLS0gcmVnZXhwIE1VU1QgYmUgdmFsaWQgaW5wdXQgdG8gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZSgpIC0tPgorICA8ZWxlbWVudCBuYW1lPSJJU0JOIiByZWdleHA9IlswLTldezEwfSIvPgorICA8ZWxlbWVudCBuYW1lPSJQYWdlIiByZWdleHA9IlswLTldKiIvPgorCisgIDwhLS0gbmFtZSBNVVNUIGJlIGEgUHJvZHVjdFR5cGUgbmFtZSBkZWZpbmVkIGluIHByb2R1Y3QtdHlwZXMueG1sIC0tPgorICA8IS0tIG1ldGFkYXRhIGVsZW1lbnRzIGluc2lkZSBicmFja2V0cyBNVVNUIGJlIG1hcHBlZCB0byB0aGUgUHJvZHVjdFR5cGUsCisgICAgICAgYXMgZGVmaW5lZCBpbiBwcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sIC0tPgorICA8cHJvZHVjdC10eXBlIG5hbWU9IkJvb2siIHRlbXBsYXRlPSJib29rLVtJU0JOXS50eHQiLz4KKyAgPHByb2R1Y3QtdHlwZSBuYW1lPSJCb29rUGFnZSIgdGVtcGxhdGU9InBhZ2UtW0lTQk5dLVtQYWdlXS50eHQiLz4KKzwvY29uZmlnPgorXV0+PC9zb3VyY2U+CisKKyAgICAgPHA+VGhpcyBmaWxlIGRlZmluZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSAiSVNCTiIgbWV0YWRhdGEgZWxlbWVudCwgaW4gdGhpcyBjYXNlLCBhIDEwLWRpZ2l0IG51bWJlci4gQWxzbywgdGhlCisgICAgICJQYWdlIiBtZXRhZGF0YSBlbGVtZW50IGlzIGRlZmluZWQgYXMgYSBzZXF1ZW5jZSBvZiAwIG9yIG1vcmUgZGlnaXRzLgorICAgICA8cC8+CisgICAgIE5leHQsIHRoZSBmaWxlIGRlZmluZXMgYSBmaWxlbmFtZSBwYXR0ZXJuIGZvciB0aGUgIkJvb2siIHByb2R1Y3QgdHlwZS4gVGhlIHBhdHRlcm4gaXMgY29tcGlsZWQgaW50byBhIHJlZ3VsYXIKKyAgICAgZXhwcmVzc2lvbiwgc3Vic3RpdHV0aW5nIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgcmVnZXhlcyBhcyBjYXB0dXJlIGdyb3Vwcy4gRm9yIGV4YW1wbGUsICJib29rLVtJU0JOXS50eHQiIGNvbXBpbGVzIHRvCisgICAgICJib29rLShbMC05XXsxMH0pLnR4dCIsIGFuZCB0aGUgSVNCTiBtZXQgZWxlbWVudCBpcyBhc3NpZ25lZCB0byBjYXB0dXJlIGdyb3VwIDEuIFdoZW4gdGhlIGZpbGVuYW1lIG1hdGNoZXMgdGhpcworICAgICBwYXR0ZXJuLCAyIG1ldGFkYXRhIGFzc2lnbm1lbnRzIG9jY3VyOiAoMSkgdGhlIElTQk4gbWV0IGVsZW1lbnQgaXMgc2V0IHRvIHRoZSBtYXRjaGVkIHJlZ2V4IGdyb3VwLCBhbmQgKDIpIHRoZQorICAgICBQcm9kdWN0VHlwZSBtZXQgZWxlbWVudCBpcyBzZXQgdG8gIkJvb2siLgorICAgICA8cC8+CisgICAgIFNpbWlsYXJseSwgdGhlIHNlY29uZCBwYXR0ZXJuIHNldHMgSVNCTiwgUGFnZSwgYW5kIFByb2R1Y3RUeXBlIGZvciBmaWxlcyBtYXRjaGluZyAicGFnZS0oWzAtOV17MTB9KS0oWzAtOV0qKS50eHQiLgorICAgICA8cC8+CisgICAgIFRoaXMgYWNoaWV2ZXMgc2V2ZXJhbCB0aGluZ3M6CisgICAgIDxvbD4KKyAgICAgICAgIDxsaT5hc3NpZ25pbmcgbWV0IGVsZW1lbnRzIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnM8L2xpPgorICAgICAgICAgPGxpPmFzc2lnbmluZyBwcm9kdWN0IHR5cGUgYmFzZWQgb24gZWFzeS10by11bmRlcnN0YW5kIHBhdHRlcm4gd2l0aCBtZXQgZWxlbWVudHMgY2xlYXJseSBpbmRpY2F0ZWQ8L2xpPgorICAgICAgICAgPGxpPnJldXNlIG9mIG1ldCBlbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbnM8L2xpPgorICAgICA8L29sPgorICAgICA8cD5TZWUgdGhlIDxhIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Byb2RUeXBlUGF0dGVybk1ldEV4dHJhY3Rvci5odG1sIj5KYXZhRG9jPC9hPgorICAgICBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgPGNvZGU+UHJvZFR5cGVQYXR0ZXJuTWV0RXh0cmFjdG9yPC9jb2RlPjwvcD4KKyAgICAgPC9wPgorICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTWV0YWRhdGEgUmVhZGVyIEV4dHJhY3RvciI+CisgICAgIAorICAgICA8cD5UaGUgPGNvZGU+TWV0UmVhZGVyRXh0cmFjdG9yPC9jb2RlPiwgcGFydCBvZiB0aGUgT09EVCBDQVMtTWV0YWRhdGEgcHJvamVjdCwKKyAgICAgYXNzdW1lcyB0aGF0IGEgbWV0YWRhdGEgZmlsZSB3aXRoIHRoZW4gbmFtZWluZyBjb252ZW50aW9uICImbHQ7UHJvZHVjdCBOYW1lJmd0Oy5tZXQiCisgICAgIGlzIHByZXNlbnQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBwcm9kdWN0LiBUaGlzIGV4dHJhY3RvciBmdXJ0aGVyIAorICAgICBhc3N1bWVzIHRoYXQgdGhlIG1ldGFkYXRhIGlzIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGluIHRoaXMgZG9jdW1lbnQuPC9wPgorICAgICAKKyAgICAgPC9zdWJzZWN0aW9uPgorICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDb3B5IEFuZCBSZXdyaXRlIEV4dHJhY3RvciI+CisgICAgIAorICAgICA8cD5UaGUgPGNvZGU+Q29weUFuZFJld3JpdGVFeHRyYWN0b3I8L2NvZGU+IGlzIGEgbWV0YWRhdGEgZXh0cmFjdG9yLCB0aGF0LAorICAgICBsaWtlIHRoZSA8Y29kZT5NZXRSZWFkZXJFeHRyYWN0b3I8L2NvZGU+LCBhc3N1bWVzIHRoYXQgYSBtZXRhZGF0YSBmaWxlIGV4aXN0cworICAgICBmb3IgdGhlIHByb2R1Y3QgZnJvbSB3aGljaCBtZXRhZGF0YSBpcyB0byBiZSBleHRyYWN0ZWQuIFRoaXMgZXh0cmFjdG9yIHJlYWRzIAorICAgICBpbiB0aGUgb3JpZ2luYWwgbWV0YWRhdGEgZmlsZSBhbmQgcmVwbGFjZXMgcGFydGljdWxhciBtZXRhZGF0YSB2YWx1ZXMgaW4gdGhhdCAKKyAgICAgbWV0YWRhdGEgZmlsZS48L3A+CisgICAgIAorICAgICA8cD5UaGUgPGNvZGU+Q29weUFuZFJld3JpdGVFeHRyYWN0b3I8L2NvZGU+IHRha2VzIGluIGEgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgCisgICAgIGlzIGEgamF2YSBwcm9wZXJ0aWVzIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBkZWZpbmVkOjwvcD4KKworICAgICA8dWw+CisgICAgICAgPGxpPm51bVJld3JpdGVGaWVsZHMgLSBUaGUgbnVtYmVyIG9mIGZpZWxkcyB0byByZXdyaXRlIHdpdGhpbiB0aGUgb3JpZ2luYWwKKyAgICAgICBtZXRhZGF0YSBmaWxlLjwvbGk+CisgICAgICAgPGxpPnJld3JpdGVGaWVsZE4gLSBUaGUgbmFtZShzKSBvZiB0aGUgZmllbGRzIHRvIHJld3JpdGUgaW4gdGhlIG9yaWdpbmFsIAorICAgICAgIG1ldGFkYXRhIGZpbGUuPC9saT4KKyAgICAgICA8bGk+b3JpZy5tZXQuZmlsZS5wYXRoIC0gVGhlIG9yaWdpbmFsIHBhdGggdG8gdGhlIG1ldGFkYXRhIGZpbGUgZnJvbSB3aGljaCAKKyAgICAgICB0byBkcmF3IHRoZSBvcmlnaW5hbCBtZXRhZGF0YSBmaWVsZHMuPC9saT4KKwkgICA8bGk+ZmllbGROLnBhdHRlcm4gLSBUaGUgc3RyaW5nIHNwZWNpZmljYXRpb24gdGhhdCBkZXRhaWxzIHdoaWNoIGZpZWxkcyB0bworCSAgIHJlcGxhY2UgYW5kIHRvIHVzZSBpbiBidWlsZGluZyB0aGUgbmV3IGZpZWxkIHZhbHVlLjwvbGk+CisJIDwvdWw+CisgICAgIAorICAgICA8cD4gQW4gZXhhbXBsZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGdpdmVuIGJlbG93OjwvcD4KKyAgICAgCis8c291cmNlPjwhW0NEQVRBWyAgICAgCitudW1SZXdyaXRlRmllbGRzPTIKK3Jld3JpdGVGaWVsZDE9UHJvZHVjdFR5cGUKK3Jld3JpdGVGaWVsZDI9RmlsZUxvY2F0aW9uCitvcmlnLm1ldC5maWxlLnBhdGg9Li9zcmMvcmVzb3VyY2VzL2V4YW1wbGVzL3NhbXBsZW1ldC54bWwKK1Byb2R1Y3RUeXBlLnBhdHRlcm49TmV3UHJvZHVjdFR5cGVbUHJvZHVjdFR5cGVdCitGaWxlTG9jYXRpb24ucGF0dGVybj0vbmV3L2xvYy9bRmlsZUxvY2F0aW9uXSAgICAKK11dPjwvc291cmNlPgorCisgICAgIDxwPkluIHRocyBleGFtcGxlIGNvbmZpZ3VyYXRpb24sIHR3byBtZXRhZGF0YSBlbGVtZW50cyB3aWxsIGJlIHJld3JpdHRlbiwgCisgICAgIDxpPlByb2R1Y3RUeXBlPC9pPiBhbmQgPGk+RmlsZUxvY2F0aW9uPC9pPi4gVGhlIG9yaWdpbmFsIG1ldGFkYXRhIGZpbGUgaXMgCisgICAgIGxvY2F0ZWQgb24gYXQgPGNvZGU+Li9zcmMvcmVzb3VyY2VzL2V4YW1wbGVzL3NhbXBsZW1ldC54bWw8L2NvZGU+LiBUaGUgCisgICAgIFByb2R1Y3QgVHlwZSB3aWxsIGJlIHJld3JpdHRlbiBhcyBOZXdQcm9kdWN0VHlwZSZsdDtvcmlnaW5hbCBQcm9kdWN0VHlwZSAKKyAgICAgdmFsdWUmZ3Q7LiBUaGUgRmlsZSBsb2NhdGlvbiB3aWxsIG5vdyBiZSBzZXQgdG8gCisgICAgIDxjb2RlPi9uZXcvbG9jYXRpb24uL3NyYy9yZXNvdXJjZXMvZXhhbXBsZXMvc2FtcGxlbWV0LnhtbDwvY29kZT4uPC9wPgorICAgICAKKyAgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8YSBuYW1lPSJmaWxlbWdyIi8+CisgICAgPHNlY3Rpb24gbmFtZT0iUmVsYXRpb25zaGlwIHRvIENBUy1GaWxlbWdyIj4KKyAgICAKKyAgICA8cD5UaGUgbW9zdCBjb21tb24gdXNlLWNhc2Ugb2YgQ0FTLU1ldGFkYXRhIGlzIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZiBhIG1ldGFkYXRhCisgICAgZXh0cmFjdG9yIGZvciB1c2UgaW4gdGhlIENBUy1GaWxlbWdyJ3MgaW5nZXN0aW9uIHByb2Nlc3MuPC9wPgorICAgIAorICAgIDxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbWV0YWRhdGEuanBnIi8+PC9wPgorICAgIAorICAgIDxwPkluIHRoZSBhYm92ZSBkaWFncmFtLCBhIG1ldGFkYXRhIG9iamVjdCBpcyBwcm9kdWN0ZWQgYnkgYW4gZXh0cmFjdG9yLiBUaGUgCisgICAgcHJvZHVjdCBhbmQgaXRzIGFzc29jaWF0ZWQgbWV0YWRhdGEgYXJlIGJvdGggaW5nZXN0ZWQgaW50byB0aGUgQ0FTLUZpbGVtZ3IuCisgICAgVGhlIG1ldGFkYXRhIHdpbGwgZ28gaW50byB0aGUgRmlsZW1ncidzIG1ldGFkYXRhIGNhdGFsb2cgYW5kIHRoZSBwcm9kdWN0IHdpbGwKKyAgICBnbyB0byB0aGUgYXJjaGl2ZS48L3A+CisgICAgCisgICAgPHA+QmVjYXVzZSBtZXRhZGF0YSBleHRyYWN0b3JzIGFuZCB0aGUgQ0FTLUZpbGVtZ3IgYXJlIG5vdCB0aWdodGx5LWNvdXBsZWQsCisgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGltcGxpY2l0IGRlc2lnbiBhc3N1bXB0aW9ucyB0aGF0IGVmZmVjdCBob3cgeW91IGRlc2lnbgorICAgIG1ldGFkYXRhIGV4dHJhY3RvcnMgaW4gdGhpcyB1c2UtY2FzZS4gRm9yIGV4YW1wbGUsIENBUy1GaWxlbWdyIGRpZmZlcmVudGlhdGVzIAorICAgIGJldHdlZW4gcHJvZHVjdHMgYmFzZWQgb24gcHJvZHVjdCA8aT50eXBlPC9pPi4gRmlsZSB0eXBlIGFuZCBwcm9kdWN0IHR5cGUgYXJlIAorICAgIG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwsIHNvIHlvdSBzaG91bGQgd3JpdGUgZXh0cmFjdG9ycyB0byB0byBwcm9kdWNlIAorICAgIG1ldGFkYXRhIHNwZWNpZmljIHRvIHByb2R1Y3QgdHlwZXMgKFNlZSB0aGUgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj4KKyAgICBBZHZhbmNlZCBHdWlkZTwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIG1pbWUtdHlwZSBkZXRlY3Rpb24pLjwvcD4KKyAgICAKKyAgICA8cD5BbG9uZyB0aGUgc2FtZSBsaW5lcywgcmVtZW1iZXIgdGhhdCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZW5mb3JjZSB0aGUgCisgICAgbWV0YWRhdGEgZXh0cmFjdGVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZHVjdCB0eXBlIGJlIGluZ2VzdGVkIGludG8gdGhlIAorICAgIEZpbGVtZ3IncyBjYXRhbG9nLiBUaGUgY29tbWFuZC1saW5lIGluZ2VzdCBjbGllbnQgZm9yIHRoZSBDQVMtRmlsZW1nciBpcyBnaXZlbiAKKyAgICBiZWxvdyAobm90ZSB0aGF0IHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGFuZCB0aGUgQVBJIGFyZSBlcXVpdmVsZW50KTo8L3A+CisKKzxzb3VyY2U+PCFbQ0RBVEFbICAgICAgICAKK2ZpbGVtZ3ItY2xpZW50IC0tdXJsIDx1cmwgdG8geG1sIHJwYyBzZXJ2aWNlPiAtLW9wZXJhdGlvbiBcCistLWluZ2VzdFByb2R1Y3QgLS1wcm9kdWN0TmFtZSA8bmFtZT4gLS1wcm9kdWN0U3RydWN0dXJlIDxIaWVyYXJjaGljYWx8RmxhdD4gCistLXByb2R1Y3RUeXBlTmFtZSA8bmFtZSBvZiBwcm9kdWN0IHR5cGU+IC0tbWV0YWRhdGFGaWxlIDxmaWxlPiBcCitbLS1jbGllblRyYW5zZmVyIC0tZGF0YVRyYW5zZmVyIDxqYXZhIGNsYXNzIG5hbWUgb2YgZGF0YSB0cmFuc2ZlciBmYWN0b3J5Pl0gXAorLS1yZWZzIDxyZWYxPi4uLjxyZWZuPgorXV0+PC9zb3VyY2U+ICAgIAorICAgIAorICAgIDxwPkluIHRoZSBhYm92ZSBpbnRlcmZhY2UsIHRoZSBpbXBvcnRhbnQgZmVhdHVyZSB0byBub3RlIGlzIHRoYXQgdGhlIHVzZXIKKyAgICBzdXBwbGllcyBub3Qgb25seSB0aGUgcHJvZHVjdCwgYnV0IGFsc28gdGhlIG1ldGFkYXRhIGZpbGUgKG9yIE1ldGFkYXRhIAorICAgIE9iamVjdCBpbiB0aGUgY2FzZSBvZiB0aGUgQVBJKSwgdGhlIFByb2R1Y3QgTmFtZSwgU3RydWN0dXJlIGFuZCBUeXBlCisgICAgPGk+b24gaW5nZXN0PC9pPi4gU2luY2UgZWFjaCBvZiB0aGVzZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gaXMgaW5kZXBlbmRhbnQsIAorICAgIGl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFpbnRhaW4gY29uc2lzdGFuY3kgb2YgdGhlIHByb2R1Y3QgdHlwZSAKKyAgICBtZXRhZGF0YSBiZXR3ZWVuIHRoZSBleHRyYWN0aW9uIHByb2Nlc3MgYW5kIHRoZSBpbmdlc3QgcHJvY2Vzcy48L3A+CisgICAgCisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9IkNvbmNsdXNpb24iPgorICAgICAgPHA+VGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIGJhc2ljIGd1aWRlIHRvIHVzZXJzIG9mIHRoZSBDQVMtTWV0YWRhdGEgcHJvamVjdC4gV2UKKyAgICAgIGhhdmUgcHVycG9zZWx5IG9taXR0ZWQgdGhlIGRpc2N1c3Npb24gb2YgbWV0YWRhdGEgc3RhcmRhcmRzLCB0aG91Z2ggd2Ugc3Ryb25nbHkKKyAgICAgIGVuY291cmFnZSB5b3UgdG8gaW52ZXN0aWdhdGUgdGhlIHJvbGUgb2Ygc3RhbmRhcmRzIGFuZCBvbnRvbG9neSBpbiB5b3VyIAorICAgICAgcGFydGljdWxhciBhcHBsaWNhdGlvbi4gSW4gb3VyIDxhIGhyZWY9Ii4uL3VzZXIvYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgR3VpZGU8L2E+LAorICAgICAgd2UgY292ZXIgbW9yZSB0b3BpY3MgcmVnYXJkaW5nIHRoZSBudWVuY2VzIG9mIG1ldGFkYXRhIGV4dHJhY3Rpb24sIGluY2x1ZGluZyAKKyAgICAgIHRoZSBpbXBhY3Qgb2YgU3RyaW5nLWJhc2VkIHJlcHJlc2VudGF0aW9uIG9uIG1ldGFkYXRhIGVsZW1lbnQgY29tcGFyaXNvbnMuPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9NZXRhZGF0YVRlc3RDYXNlLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0YWRhdGFUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmEyNTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvTWV0YWRhdGFUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhOworCisvLyBKREsgSW5wdXQvb3V0cHV0CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vIEp1bml0IFRlc3RpbmcgZnJhbWV3b3JrCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEJhc2UgdGVzdCBjYXNlIGZvciBtZXRhZGF0YSB0ZXN0cy4gIFByb3ZpZGVzIGFjY2VzcyB0byB0ZXN0IGRhdGEgZmlsZXMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBtZXRhZGF0YSB0ZXN0IGNhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBDYXNlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXVnbWVudCBzZXQgdXAgb2YgYSB0ZXN0IGNhc2UgYnkgY3JlYXRpbmcgYSBwbGF5IGRpcmVjdG9yeSB3aGVyZSB3ZSBjYW4gdGVtcG9yYXJpbHkKKyAgICAgKiBrZWVwIG91ciB0ZXN0IGRhdGEgZmlsZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3JzIG9jY3VyIGluIGRpcmVjdG9yeSBzZXR1cCwgb3IgaWYgc3VwZXJjbGFzcyBzZXRVcCB0aHJvd3MgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBmcmFtZXdvcmsgdGVzdCBoYXJuZXNzCisgICAgICAgIHRtcERpciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm1ldGFkYXRhIiwgIi50ZXN0cyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBhIHRlbXBvcmFyeSBmaWxlCisgICAgICAgIGlmICghdG1wRGlyLmRlbGV0ZSgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGU/ISBXZSBkb24ndCB3YW50IG5vIHN0aW5raW4nIGZpbGUKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAiICsgdG1wRGlyKTsgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICghdG1wRGlyLm1rZGlycygpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdG9yeSBpcyB3aGF0IHdlIHdhbnQKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICIgKyB0bXBEaXIpOworICAgICAgICAvL3RtcERpci5kZWxldGVPbkV4aXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdWdtZW50IHRlYXIgZG93biBvZiBhIHRlc3QgY2FzZSBieSBjbGVhbmluZyB1cCBvdXIgcGxheSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbnkgZXJyb3JzIG9jY3VyIGluIGRpcmVjdG9yeSBkZWxldGlvbiwgb3IgaWYgc3VwZXJjbGFzcyB0ZWFyRG93biB0aHJvd3MgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IHRtcERpci5saXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNvbnRlbnRzIG9mIG91ciBwbGF5IGFyZWEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCB0aHJvdWdoIGVhY2ggb25lCisgICAgICAgICAgICBGaWxlIGVudHJ5ID0gbmV3IEZpbGUodG1wRGlyLCBlbnRyaWVzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBmaWxlIG91dCBvZiBpdAorICAgICAgICAgICAgaWYgKCFlbnRyeS5kZWxldGUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdWtlIGl0IGlmIHBvc3NpYmxlIC4uLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAiICsgZW50cnkpOyAgICAgICAgICAgICAvLyBPciBpZiBub3QgLi4uCisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0bXBEaXIuZGVsZXRlKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVrZSB0aGUgcGxheSBhcmVhCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBkZWxldGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSAiICsgdG1wRGlyKTsgICAgICAgICAgIC8vIE9yIGlmIG5vdCAuLi4KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVhciBkb3duIHRoZSB0ZXN0IGhhcm5lc3MKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IGEgbmFtZWQgdGVzdCBkYXRhIGZpbGUuICBUaGlzIHdpbGwgeWllbGQgYSB0ZXN0IGRhdGEgZmlsZSB1c2luZyB0aGUgc3RhbmRhcmQgSmF2YSByZXNvdXJjZSBtZWNoYW5pc20KKyAgICAgKiAoaWUsIGZldGNoaW5nIG91dCBvZiBhIGphciwgZnJvbSB0aGUgY2xhc3MgcGF0aCwgZXRjLikgYW5kIHN0aWNrIGl0IGluIGEgdGVtcG9yYXJ5IGZpbGUsIHNpbmNlIHRoZQorICAgICAqIG1ldGFkYXRhIEFQSSB3b3JrcyB3aXRoIGZpbGVzIGl0IGNhbiBib3RoIG5hbWUgYW5kIHVzZSwgbm90IGp1c3Qgc3RyZWFtcyBvZiBmaWxlIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0IGRhdGEgZmlsZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGphdmEuaW8uRmlsZX0gY29udGFpbmluZyB0aGUgbmFtZWQgdGVzdCBkYXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFRlc3REYXRhRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBNZXRhZGF0YVRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7ICAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kPyBUcnkgcmVzb3VyY2Ugc3RyZWFtCisgICAgICAgIGlmIChpbiA9PSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIG5vdCBmb3VuZD8gIEJ1bW1lci4KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdGVzdCBkYXRhIGZpbGUgYCIgKyBuYW1lICsgImA7IG5vdCBmb3VuZCBpbiByZXNvdXJjZSBwYXRoIik7CisgICAgICAgIEZpbGUgZm4gPSBuZXcgRmlsZSh0bXBEaXIsIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgdGhlIHRlc3RzIHdhbnQ6IEZpbGVzLgorICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZm4pKTsgICAgICAvLyBDb3B5IGRhdGEgdG8gaXQKKyAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGZvciBlZmZpY2llbmN5CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWMgZGlzayBwYWdlIHNpemUKKyAgICAgICAgZm9yICg7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV2ZXIKKyAgICAgICAgICAgIGludCBjID0gaW4ucmVhZChidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBpbnRvIG91ciBidWZmZXIKKyAgICAgICAgICAgIGlmIChjID09IC0xKSBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU9GPyBEb25lLgorICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgRU9GPyBDb3B5IG91dC4KKyAgICAgICAgfQorICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIGZuOworICAgIH0KKworICAgIC8qKiBQbGF5IGFyZWEgKi8KKyAgICBwcml2YXRlIEZpbGUgdG1wRGlyOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL1Rlc3RNZXRhZGF0YS5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL1Rlc3RNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MThhNDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvVGVzdE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGE7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworLyoqCisgKiBUZXN0IENhc2UgU3VpdGUgZm9yIHRoZSBNZXRhZGF0YSBjbGFzcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXRhZGF0YSBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIE1ldGFkYXRhIG1ldGFkYXRhID0gbnVsbDsKKworICAvKioKKyAgICogPHA+CisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIFRlc3RNZXRhZGF0YSgpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEFkZE1hbnkoKSB7CisgICAgTGlzdCBjb3VudGluZyA9IG5ldyBWZWN0b3IoKTsKKyAgICBjb3VudGluZy5hZGQoIjEiKTsKKyAgICBjb3VudGluZy5hZGQoIjIiKTsKKyAgICBjb3VudGluZy5hZGQoIjMiKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgiTWFueVRlc3QiLCBjb3VudGluZyk7CisKKyAgICBhc3NlcnROb3ROdWxsKG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKCJNYW55VGVzdCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoIk1hbnlUZXN0Iikuc2l6ZSgpKTsKKworICAgIC8vIHRlc3Qgb3JkZXJpbmcKKyAgICBhc3NlcnRFcXVhbHMoIjEiLCAoU3RyaW5nKSBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgiTWFueVRlc3QiKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscygiMiIsIChTdHJpbmcpIG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKCJNYW55VGVzdCIpLmdldCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIzIiwgKFN0cmluZykgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoIk1hbnlUZXN0IikuZ2V0KDIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBZGRIYXNodGFibGUoKSB7CisgICAgSGFzaHRhYmxlIHRlc3RIYXNoID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHRlc3RIYXNoLnB1dCgia2V5MSIsICJ2YWwxIik7CisgICAgdGVzdEhhc2gucHV0KCJrZXkyIiwgInZhbDIiKTsKKworICAgIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTMiLCAidmFsMyIpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKHRlc3RIYXNoKTsKKworICAgIGFzc2VydE5vdE51bGwobWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgYXNzZXJ0Tm90TnVsbChtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5MiIpKTsKKworICAgIGFzc2VydEVxdWFscygidmFsMSIsIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkxIikpOworICAgIGFzc2VydEVxdWFscygidmFsMiIsIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkyIikpOworCisgICAgYXNzZXJ0Tm90TnVsbChtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5MyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoInZhbDMiLCBtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5MyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgeworICAgIEhhc2h0YWJsZSB0ZXN0SGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICB0ZXN0SGFzaC5wdXQoImtleTEiLCAidmFsMSIpOworICAgIHRlc3RIYXNoLnB1dCgia2V5MiIsICJ2YWwyIik7CisKKyAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKCJibGFoIiwgImJsYWgyIik7CisKKyAgICBhc3NlcnROb3ROdWxsKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJibGFoIikpOworICAgIGFzc2VydE51bGwobWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgYXNzZXJ0TnVsbChtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5MiIpKTsKKworICAgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YSh0ZXN0SGFzaCk7CisKKyAgICBhc3NlcnROdWxsKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJibGFoIikpOworICAgIGFzc2VydE5vdE51bGwobWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgYXNzZXJ0Tm90TnVsbChtZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5MiIpKTsKKworICAgIGFzc2VydEVxdWFscygidmFsMSIsIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkxIikpOworICAgIGFzc2VydEVxdWFscygidmFsMiIsIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkyIikpOworCisgICAgbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKCJrZXkxIiwgInZhbDIiKTsKKyAgICBtZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoImtleTIiLCAidmFsMSIpOworCisgICAgYXNzZXJ0RXF1YWxzKCJ2YWwyIiwgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ2YWwxIiwgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleTIiKSk7CisKKyAgICBMaXN0IHR3b1ZhbHVlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICB0d29WYWx1ZXMuYWRkKCJmaXJzdFZhbCIpOworICAgIHR3b1ZhbHVlcy5hZGQoInNlY29uZFZhbCIpOworCisgICAgbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKCJrZXkxIiwgdHdvVmFsdWVzKTsKKyAgICBhc3NlcnROb3ROdWxsKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkxIikpOworICAgIGFzc2VydEVxdWFscygyLCBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgia2V5MSIpLnNpemUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoImZpcnN0VmFsIiwgKFN0cmluZykgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoImtleTEiKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscygic2Vjb25kVmFsIiwgKFN0cmluZykgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoImtleTEiKS5nZXQoMSkpOworCisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxLZXlzV2l0aE5hbWUoKSB7CisgICAgTWV0YWRhdGEgbTEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtMS5hZGRNZXRhZGF0YSgiR3JvdXAxL2tleTEiLCAidmFsMSIpOworICAgIG0xLmFkZE1ldGFkYXRhKCJHcm91cDEva2V5MiIsICJ2YWwyIik7CisgICAgbTEuYWRkTWV0YWRhdGEoIkdyb3VwMi9rZXkyIiwgInZhbDMiKTsKKyAgICBtMS5hZGRNZXRhZGF0YSgiR3JvdXAyL2tleTIva2V5MyIsICJ2YWwzIik7CisgICAgbTEuYWRkTWV0YWRhdGEoIkdyb3VwMS9zdWIxL2tleTIiLCAidmFsMyIpOworICAgIG0xLmFkZE1ldGFkYXRhKCJHcm91cDEvc3ViMi9rZXkyL2tleTMiLCAidmFsMyIpOworICAgIExpc3Q8U3RyaW5nPiBrZXlzID0gbTEuZ2V0QWxsS2V5c1dpdGhOYW1lKCJrZXkyIik7CisgICAgYXNzZXJ0RXF1YWxzKGtleXMuc2l6ZSgpLCAzKTsKKyAgICBhc3NlcnRFcXVhbHMoa2V5cy5nZXQoMCksICJHcm91cDIva2V5MiIpOworICAgIGFzc2VydEVxdWFscyhrZXlzLmdldCgxKSwgIkdyb3VwMS9zdWIxL2tleTIiKTsKKyAgICBhc3NlcnRFcXVhbHMoa2V5cy5nZXQoMiksICJHcm91cDEva2V5MiIpOworICAgIGtleXMgPSBtMS5nZXRBbGxLZXlzV2l0aE5hbWUoImtleTEiKTsKKyAgICBhc3NlcnRFcXVhbHMoa2V5cy5zaXplKCksIDEpOworICAgIGFzc2VydEVxdWFscyhrZXlzLmdldCgwKSwgIkdyb3VwMS9rZXkxIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworICAgIE1ldGFkYXRhIG0xID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbTEuYWRkTWV0YWRhdGEoImtleTEiLCAidmFsMSIpOworICAgIG0xLmFkZE1ldGFkYXRhKCJrZXkyIiwgInZhbDIiKTsKKyAgICBtMS5hZGRNZXRhZGF0YSgia2V5MiIsICJ2YWwzIik7CisKKyAgICBNZXRhZGF0YSBtMiA9IG5ldyBNZXRhZGF0YSgpOworICAgIG0yLmFkZE1ldGFkYXRhKCJrZXkxIiwgInZhbDEiKTsKKyAgICBtMi5hZGRNZXRhZGF0YSgia2V5MiIsICJ2YWwyIik7CisgICAgbTIuYWRkTWV0YWRhdGEoImtleTIiLCAidmFsMyIpOworCisgICAgYXNzZXJ0RXF1YWxzKG0xLCBtMik7CisgICAgYXNzZXJ0RXF1YWxzKG0yLCBtMSk7CisKKyAgICBtMi5yZW1vdmVNZXRhZGF0YSgia2V5MSIpOworCisgICAgYXNzZXJ0RmFsc2UobTEuZXF1YWxzKG0yKSk7CisgICAgYXNzZXJ0RmFsc2UobTIuZXF1YWxzKG0xKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL1Rlc3RTZXJpYWxpemFibGVNZXRhZGF0YS5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL1Rlc3RTZXJpYWxpemFibGVNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmI4MzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvVGVzdFNlcmlhbGl6YWJsZU1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKgorICoKKyAqIFRlc3QgY2xhc3MgZm9yIFNlcmlhbGl6YWJsZU1ldGFkYXRhLgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RTZXJpYWxpemFibGVNZXRhZGF0YSBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGVuY29kaW5ncyA9IG5ldyBTdHJpbmdbXSB7ICJVVEYtOCIsICJpc28tODg1OS0xIiwKKyAgICAgICJ3aW5kb3dzLTEyNTIiLCAiVVRGLTE2IiwgIlVTLUFTQ0lJIiB9OworCisgIHB1YmxpYyBUZXN0U2VyaWFsaXphYmxlTWV0YWRhdGEoKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBlbmNvZGluZ3NbaV07CisgICAgICBib29sZWFuIHVzZUNEQVRBID0gZmFsc2U7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKywgdXNlQ0RBVEEgPSB0cnVlKSB7CisgICAgICAgIFNlcmlhbGl6YWJsZU1ldGFkYXRhIHNtID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKGVuY29kaW5nLCB1c2VDREFUQSk7CisgICAgICAgIHNtLmFkZE1ldGFkYXRhKCJrZXkxIiwgInZhbDEiKTsKKyAgICAgICAgc20uYWRkTWV0YWRhdGEoImtleTIiLCAidmFsMiIpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7CisgICAgICAgIG9vcy53cml0ZU9iamVjdChzbSk7CisgICAgICAgIG9vcy5mbHVzaCgpOworCisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICBvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBzbTIgPSAoU2VyaWFsaXphYmxlTWV0YWRhdGEpIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICBvaXMuY2xvc2UoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHNtMik7CisgICAgICAgIGFzc2VydE5vdE51bGwoc20yLmdldEhhc2h0YWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNtMi5nZXRIYXNodGFibGUoKS5zaXplKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNtMi5nZXRNZXRhZGF0YSgia2V5MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWwxIiwgc20yLmdldE1ldGFkYXRhKCJrZXkxIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNtMi5nZXRNZXRhZGF0YSgia2V5MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWwyIiwgc20yLmdldE1ldGFkYXRhKCJrZXkyIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNtMi5nZXRFbmNvZGluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVuY29kaW5nLCBzbTIuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1c2VDREFUQSwgc20yLmlzVXNpbmdDREFUQSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0WG1sU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgIFN0cmluZyBlbmNvZGluZyA9IGVuY29kaW5nc1tpXTsKKyAgICAgIGJvb2xlYW4gdXNlQ0RBVEEgPSBmYWxzZTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrLCB1c2VDREFUQSA9IHRydWUpIHsKKyAgICAgICAgU2VyaWFsaXphYmxlTWV0YWRhdGEgbWV0YWRhdGExID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKGVuY29kaW5nLAorICAgICAgICAgICAgdXNlQ0RBVEEpOworICAgICAgICBtZXRhZGF0YTEuYWRkTWV0YWRhdGEoIk5hbWUxIiwgIlZhbHVlMSIpOworICAgICAgICBtZXRhZGF0YTEuYWRkTWV0YWRhdGEoIk5hbWUyIiwgIlZhbHVlLzIiKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBtZXRhZGF0YTEud3JpdGVNZXRhZGF0YVRvWG1sU3RyZWFtKG91dCk7CisKKyAgICAgICAgU2VyaWFsaXphYmxlTWV0YWRhdGEgbWV0YWRhdGEyID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKGVuY29kaW5nLAorICAgICAgICAgICAgdXNlQ0RBVEEpOworICAgICAgICBtZXRhZGF0YTIubG9hZE1ldGFkYXRhRnJvbVhtbFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0CisgICAgICAgICAgICAudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGFkYXRhMik7CisgICAgICAgIGFzc2VydE5vdE51bGwobWV0YWRhdGEyLmdldEhhc2h0YWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldGFkYXRhMi5nZXRIYXNodGFibGUoKS5zaXplKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGFkYXRhMi5nZXRNZXRhZGF0YSgiTmFtZTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVmFsdWUxIiwgbWV0YWRhdGEyLmdldE1ldGFkYXRhKCJOYW1lMSIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRhZGF0YTIuZ2V0TWV0YWRhdGEoIk5hbWUyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlZhbHVlLzIiLCBtZXRhZGF0YTIuZ2V0TWV0YWRhdGEoIk5hbWUyIikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUNvbnZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY29kaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgU3RyaW5nIGVuY29kaW5nID0gZW5jb2RpbmdzW2ldOworICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgbS5hZGRNZXRhZGF0YSgia2V5MSIsICJ2YWwxIik7CisgICAgICBtLmFkZE1ldGFkYXRhKCJrZXkyIiwgInZhbDIiKTsKKworICAgICAgU2VyaWFsaXphYmxlTWV0YWRhdGEgc20gPSBuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEobSwgZW5jb2RpbmcsIGZhbHNlKTsKKyAgICAgIE1ldGFkYXRhIG1Db252ID0gc20uZ2V0TWV0YWRhdGEoKTsKKworICAgICAgYXNzZXJ0Tm90TnVsbChtQ29udik7CisgICAgICBhc3NlcnROb3ROdWxsKG1Db252LmdldEhhc2h0YWJsZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBtQ29udi5nZXRIYXNodGFibGUoKS5zaXplKCkpOworICAgICAgYXNzZXJ0Tm90TnVsbChtQ29udi5nZXRNZXRhZGF0YSgia2V5MSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsMSIsIG1Db252LmdldE1ldGFkYXRhKCJrZXkxIikpOworICAgICAgYXNzZXJ0Tm90TnVsbChtQ29udi5nZXRNZXRhZGF0YSgia2V5MiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsMiIsIG1Db252LmdldE1ldGFkYXRhKCJrZXkyIikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVJlYWQoKSB7CisgICAgU2VyaWFsaXphYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgiTmFtZTEiLCAiVmFsdWUxIik7CisgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEoIk5hbWUyIiwgIlZhbHVlMiIpOworCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgIHRyeSB7CisgICAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKG1ldGFkYXRhLnRvWE1MKCksIG91dCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBtZXRhZGF0YTIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBtZXRhZGF0YTIgPSBuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dAorICAgICAgICAgIC50b0J5dGVBcnJheSgpKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnROb3ROdWxsKG1ldGFkYXRhMik7CisgICAgYXNzZXJ0Tm90TnVsbChtZXRhZGF0YTIuZ2V0SGFzaHRhYmxlKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldGFkYXRhMi5nZXRIYXNodGFibGUoKS5zaXplKCkpOworICAgIGFzc2VydE5vdE51bGwobWV0YWRhdGEyLmdldE1ldGFkYXRhKCJOYW1lMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlZhbHVlMSIsIG1ldGFkYXRhMi5nZXRNZXRhZGF0YSgiTmFtZTEiKSk7CisgICAgYXNzZXJ0Tm90TnVsbChtZXRhZGF0YTIuZ2V0TWV0YWRhdGEoIk5hbWUyIikpOworICAgIGFzc2VydEVxdWFscygiVmFsdWUyIiwgbWV0YWRhdGEyLmdldE1ldGFkYXRhKCJOYW1lMiIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YSgpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKCJOYW1lMSIsICJWYWx1ZTEiKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YSgiTmFtZTIiLCAiVmFsdWUyIik7CisKKyAgICAvLyB3cml0ZSB4bWwgRE9NIHRvIHN0cmluZworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJheSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBtZXRhZGF0YS53cml0ZU1ldGFkYXRhVG9YbWxTdHJlYW0oYXJyYXkpOworCisgICAgLy8gcmVhZCBzdHJpbmcgaW50byBuZXcgeG1sIERPTQorICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICBmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgIERvY3VtZW50IGRvYyA9IGYubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFycmF5LnRvQnl0ZUFycmF5KCkpKTsKKworICAgIGZpbmFsIFN0cmluZyBOUyA9ICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI7CisgICAgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJjYXMiOworCisgICAgLy8gY29tcGFyZSBuYW1lc3BhY2VzIGluIERPTSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB3cml0ZS9yZWFkIG9wZXJhdGlvbgorICAgIEVsZW1lbnQgYmVmb3JlID0gbWV0YWRhdGEudG9YTUwoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICBTdHJpbmcgbnNCZWZvcmUgPSBiZWZvcmUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgU3RyaW5nIHByZUJlZm9yZSA9IGJlZm9yZS5nZXRQcmVmaXgoKTsKKyAgICBhc3NlcnRFcXVhbHMoTlMsIG5zQmVmb3JlKTsKKyAgICBhc3NlcnRFcXVhbHMoUFJFRklYLCBwcmVCZWZvcmUpOworCisgICAgRWxlbWVudCBhZnRlciA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICBTdHJpbmcgbnNBZnRlciA9IGFmdGVyLmdldE5hbWVzcGFjZVVSSSgpOworICAgIFN0cmluZyBwcmVBZnRlciA9IGFmdGVyLmdldFByZWZpeCgpOworICAgIGFzc2VydEVxdWFscyhOUywgbnNBZnRlcik7CisgICAgYXNzZXJ0RXF1YWxzKFBSRUZJWCwgcHJlQWZ0ZXIpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RBYnN0cmFjdFNBWENvbmZpZ1JlYWRlci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdEFic3RyYWN0U0FYQ29uZmlnUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5OGFkMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RBYnN0cmFjdFNBWENvbmZpZ1JlYWRlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgVGVzdEFic3RyYWN0U0FYQ29uZmlnUmVhZGVyIHsKKworICAgIHByaXZhdGUgQWJzdHJhY3RTQVhDb25maWdSZWFkZXIgY29uZmlnUmVhZGVyOworICAgIHByaXZhdGUgRmlsZSBjb25maWdGaWxlOworCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gdXJpcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGxvY2FsTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBxTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3Byb2R1Y3QtdHlwZS1wYXR0ZXJucy54bWwiKTsKKyAgICAgICAgY29uZmlnRmlsZSA9IG5ldyBGaWxlKHVybC50b1VSSSgpKTsKKyAgICAgICAgY29uZmlnUmVhZGVyID0gbmV3IEFic3RyYWN0U0FYQ29uZmlnUmVhZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB1cmlzLmFkZCh1cmkpOworICAgICAgICAgICAgICAgIGxvY2FsTmFtZXMuYWRkKGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgcU5hbWVzLmFkZChxTmFtZSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cnMuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJkb3duKCkgeworICAgICAgICB1cmlzLmNsZWFyKCk7CisgICAgICAgIGxvY2FsTmFtZXMuY2xlYXIoKTsKKyAgICAgICAgcU5hbWVzLmNsZWFyKCk7CisgICAgICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnUmVhZGVyLnBhcnNlQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgdXJpcy5zaXplKCkpOworICAgICAgICBmb3IgKFN0cmluZyB1cmkgOiB1cmlzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBsb2NhbE5hbWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGxvY2FsIDogbG9jYWxOYW1lcykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgbG9jYWwpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBxTmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWciLCBxTmFtZXMuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbGVtZW50IiwgcU5hbWVzLmdldCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZWxlbWVudCIsIHFOYW1lcy5nZXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByb2R1Y3QtdHlwZSIsIHFOYW1lcy5nZXQoMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByb2R1Y3QtdHlwZSIsIHFOYW1lcy5nZXQoNCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIChpbnQpYXR0cmlidXRlcy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgKGludClhdHRyaWJ1dGVzLmdldCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCAoaW50KWF0dHJpYnV0ZXMuZ2V0KDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIChpbnQpYXR0cmlidXRlcy5nZXQoMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgKGludClhdHRyaWJ1dGVzLmdldCg0KSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0Q29weUFuZFJld3JpdGVFeHRyYWN0b3IuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RDb3B5QW5kUmV3cml0ZUV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNjlmMzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0Q29weUFuZFJld3JpdGVFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGFUZXN0Q2FzZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogVGVzdHMgdGhlIENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yLgorICovCitwdWJsaWMgY2xhc3MgVGVzdENvcHlBbmRSZXdyaXRlRXh0cmFjdG9yIGV4dGVuZHMgTWV0YWRhdGFUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBDb3B5QW5kUmV3cml0ZUV4dHJhY3RvciBleHRyYWN0b3I7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FID0gIkZpbGVuYW1lIjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9MT0NBVElPTiA9ICJGaWxlTG9jYXRpb24iOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEUgPSAiUHJvZHVjdFR5cGUiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZFByb2R1Y3RUeXBlID0gIk5ld1Byb2R1Y3RUeXBlR2VuZXJpY0ZpbGUiOworICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkRmlsZW5hbWUgPSAidGVzdGZpbGUudHh0IjsKKworICBwcml2YXRlIFN0cmluZyBleHBlY3RlZEZpbGVMb2NhdGlvbjsKKyAgCisgIHByaXZhdGUgRmlsZSBjb25mRmlsZTsKKyAgCisgIHByaXZhdGUgRmlsZSBzYW1wbGVNZXRGaWxlOworICAKKyAgcHJpdmF0ZSBGaWxlIGV4dHJhY3RGaWxlOworICAKKyAgcHVibGljIFRlc3RDb3B5QW5kUmV3cml0ZUV4dHJhY3RvcihTdHJpbmcgbmFtZSkgeworICAgIHN1cGVyKG5hbWUpOworICB9CisgIAorICAKKworICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE1ldGFkYXRhKCkgeworICAgIE1ldGFkYXRhIG1ldCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YSh0aGlzLmV4dHJhY3RGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwobWV0KTsKKyAgICBhc3NlcnROb3ROdWxsKG1ldC5nZXRIYXNodGFibGUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChtZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkpOworICAgIGFzc2VydEVxdWFscygzLCBtZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShGSUxFTkFNRSkpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbGVuYW1lLCBtZXQuZ2V0TWV0YWRhdGEoRklMRU5BTUUpKTsKKyAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShQUk9EVUNUX1RZUEUpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0VHlwZSwgbWV0LmdldE1ldGFkYXRhKFBST0RVQ1RfVFlQRSkpOworICAgIGFzc2VydFRydWUobWV0LmNvbnRhaW5zS2V5KEZJTEVfTE9DQVRJT04pKTsKKyAgICBhc3NlcnRFcXVhbHMoIlRoZSBleHBlY3RlZCBmaWxlIGxvY2F0aW9uOiBbIiArIGV4cGVjdGVkRmlsZUxvY2F0aW9uCisgICAgICAgICsgIl0gZG9lcyBub3QgbWF0Y2ggIiArICJ0aGUgb2J0YWluZWQgZmlsZSBsb2NhdGlvbjogWyIKKyAgICAgICAgKyBtZXQuZ2V0TWV0YWRhdGEoRklMRV9MT0NBVElPTikgKyAiXSIsIGV4cGVjdGVkRmlsZUxvY2F0aW9uLCBtZXQKKyAgICAgICAgLmdldE1ldGFkYXRhKEZJTEVfTE9DQVRJT04pKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlT3JpZ01ldEZpbGVQYXRoKCkgeworICAgIE1ldGFkYXRhIG1ldCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YSh0aGlzLmV4dHJhY3RGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwobWV0KTsKKyAgfQorCisKKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisgICAgU3RyaW5nIGNvbmZGaWxlbmFtZSA9ICIvY29weWFuZHJld3JpdGUudGVzdC5jb25mIjsKKyAgICBTdHJpbmcgc2FtcGxlTWV0RmlsZW5hbWUgPSAiL3NhbXBsZW1ldC54bWwiOworICAgIFN0cmluZyBleHRyYWN0RmlsZW5hbWUgPSAiL3Rlc3RmaWxlLnR4dCI7CisgICAgU3RyaW5nIG9yaWdNZXRGaWxlUGF0aCA9ICJvcmlnLm1ldC5maWxlLnBhdGgiOworICAgIAorICAgIC8vIGdldCBhbGwgdGhlIG5lZWRlZCBmaWxlcyBzdGFnZWQKKyAgICB0aGlzLnNhbXBsZU1ldEZpbGUgPSBzdXBlci5nZXRUZXN0RGF0YUZpbGUoc2FtcGxlTWV0RmlsZW5hbWUpOworICAgIHRoaXMuZXh0cmFjdEZpbGUgPSBzdXBlci5nZXRUZXN0RGF0YUZpbGUoZXh0cmFjdEZpbGVuYW1lKTsKKyAgICAKKyAgICAKKyAgICAvLyB0aGlzIGlzIGEgamF2YSBwcm9wZXJ0aWVzIGZpbGUKKyAgICB0aGlzLmNvbmZGaWxlID0gc3VwZXIuZ2V0VGVzdERhdGFGaWxlKGNvbmZGaWxlbmFtZSk7CisgICAgCisgICAgLy8gd2UgbmVlZCB0byBjb21wdXRlIGFuZCBvdmVycmlkZSBvcmlnLm1ldC5maWxlLnBhdGgKKyAgICBQcm9wZXJ0aWVzIGNvbmZQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgY29uZlByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShjb25mRmlsZSkpOworICAgIGNvbmZQcm9wcy5zZXRQcm9wZXJ0eShvcmlnTWV0RmlsZVBhdGgsIHNhbXBsZU1ldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIGNvbmZQcm9wcy5zdG9yZShuZXcgRmlsZU91dHB1dFN0cmVhbShjb25mRmlsZSksIG51bGwpOworICAgIAorCisgICAgdHJ5IHsKKyAgICAgIHRoaXMuZXhwZWN0ZWRGaWxlTG9jYXRpb24gPSAiL25ldy9sb2MvIgorICAgICAgICAgICsgdGhpcy5leHRyYWN0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICB9CisgICAgCisgICAgCisgICAgQ29weUFuZFJld3JpdGVDb25maWcgY29uZmlnID0gbmV3IENvcHlBbmRSZXdyaXRlQ29uZmlnKCk7CisgICAgdHJ5IHsKKyAgICAgIGNvbmZpZy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0odGhpcy5jb25mRmlsZSkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICB0aGlzLmV4dHJhY3RvciA9IG5ldyBDb3B5QW5kUmV3cml0ZUV4dHJhY3RvcigpOworICAgIHRoaXMuZXh0cmFjdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKyAgICAKKyAgfQorCisKKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YVRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgaWYodGhpcy5jb25mRmlsZSAhPSBudWxsKSB0aGlzLmNvbmZGaWxlID0gbnVsbDsKKyAgICBpZih0aGlzLnNhbXBsZU1ldEZpbGUgIT0gbnVsbCkgdGhpcy5zYW1wbGVNZXRGaWxlID0gbnVsbDsKKyAgICBpZih0aGlzLmV4dHJhY3RGaWxlICE9IG51bGwpIHRoaXMuZXh0cmFjdEZpbGUgPSBudWxsOworICAgIHRoaXMuZXhwZWN0ZWRGaWxlTG9jYXRpb24gPSBudWxsOworICB9CisgIAorICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3REYXRhU291cmNlTWV0RXh0cmFjdG9yLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0RGF0YVNvdXJjZU1ldEV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDkwZjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0RGF0YVNvdXJjZU1ldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvLyBKVW5pdCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCisvLyBKREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CisKKy8vIEpBVkFYIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLy8gT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTWV0RXh0cmFjdGlvbkV4Y2VwdGlvbjsKKworLy8gSlVuaXQgaW1wb3J0cworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworLy8gTW9ja2l0byBpbXBvcnRzCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgRGF0YVNvdXJjZU1ldEV4dHJhY3Rvcn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUub3JnIChCcmlhbiBGb3N0ZXIpCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBUZXN0RGF0YVNvdXJjZU1ldEV4dHJhY3RvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0NPTF9OQU1FXzEgPSAiTkFNRSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9DT0xfVkFMVUVfMSA9ICJTb21lTmFtZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9DT0xfTkFNRV8yID0gIlNJWkUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfQ09MX1ZBTFVFXzIgPSAiMjAiOworCisgIEBNb2NrIHByaXZhdGUgRGF0YVNvdXJjZSBkYXRhU291cmNlOworICBATW9jayBwcml2YXRlIENvbm5lY3Rpb24gY29ubjsKKyAgQE1vY2sgcHJpdmF0ZSBTdGF0ZW1lbnQgc3RhdGVtZW50OworICBATW9jayBwcml2YXRlIFJlc3VsdFNldCByczsKKyAgQE1vY2sgcHJpdmF0ZSBSZXN1bHRTZXRNZXRhRGF0YSByc01ldDsKKworICBwcml2YXRlIERhdGFTb3VyY2VNZXRFeHRyYWN0b3IgZXh0cmFjdG9yOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCisgICAgd2hlbihkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKSkudGhlblJldHVybihjb25uKTsKKyAgICB3aGVuKGNvbm4uY3JlYXRlU3RhdGVtZW50KCkpLnRoZW5SZXR1cm4oc3RhdGVtZW50KTsKKyAgICB3aGVuKHN0YXRlbWVudC5leGVjdXRlUXVlcnkoTW9ja2l0by48U3RyaW5nPmFueSgpKSkudGhlblJldHVybihycyk7CisgICAgd2hlbihycy5nZXRNZXRhRGF0YSgpKS50aGVuUmV0dXJuKHJzTWV0KTsKKyAgICB3aGVuKHJzLm5leHQoKSkudGhlblJldHVybih0cnVlKTsKKyAgICB3aGVuKHJzLmdldFN0cmluZygxKSkudGhlblJldHVybihEQl9DT0xfVkFMVUVfMSk7CisgICAgd2hlbihycy5nZXRTdHJpbmcoMikpLnRoZW5SZXR1cm4oREJfQ09MX1ZBTFVFXzIpOworICAgIHdoZW4ocnNNZXQuZ2V0Q29sdW1uQ291bnQoKSkudGhlblJldHVybigyKTsKKyAgICB3aGVuKHJzTWV0LmdldENvbHVtbk5hbWUoMSkpLnRoZW5SZXR1cm4oREJfQ09MX05BTUVfMSk7CisgICAgd2hlbihyc01ldC5nZXRDb2x1bW5OYW1lKDIpKS50aGVuUmV0dXJuKERCX0NPTF9OQU1FXzIpOworCisgICAgZXh0cmFjdG9yID0gbmV3IERhdGFTb3VyY2VNZXRFeHRyYWN0b3IoKTsKKyAgfQorIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2V0S2V5KCkgeworICAgIGFzc2VydFRoYXQoZXh0cmFjdG9yLmdldEtleShuZXcgRmlsZSgiVGVzdC5jc3YiKSksIGlzKCJUZXN0IikpOworICAgIGFzc2VydFRoYXQoZXh0cmFjdG9yLmdldEtleShuZXcgRmlsZSgiMTIzX3NkZndlZ2RfZzMzNGcuZGF0IikpLCBpcygiMTIzX3NkZndlZ2RfZzMzNGciKSk7CisgICAgYXNzZXJ0VGhhdChleHRyYWN0b3IuZ2V0S2V5KG5ldyBGaWxlKCIxMjNxd2VKREtKRi0zIikpLCBpcygiMTIzcXdlSkRLSkYtMyIpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXRhZGF0YSgpIHRocm93cyBNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIHsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IGV4dHJhY3Rvci5nZXRNZXRhZGF0YSgKKyAgICAgICAgZGF0YVNvdXJjZSwgInNlbGVjdCAqIGZyb20gU29tZVRhYmxlIHdoZXJlIGtleSA9ICclcyciLCAiU29tZUtleSIpOworCisgICAgYXNzZXJ0VGhhdChtZXRhZGF0YS5nZXRBbGxLZXlzKCkuc2l6ZSgpLCBpcygyKSk7CisgICAgYXNzZXJ0VGhhdChtZXRhZGF0YS5nZXRNZXRhZGF0YShEQl9DT0xfTkFNRV8xKSwgaXMoREJfQ09MX1ZBTFVFXzEpKTsKKyAgICBhc3NlcnRUaGF0KG1ldGFkYXRhLmdldE1ldGFkYXRhKERCX0NPTF9OQU1FXzIpLCBpcyhEQl9DT0xfVkFMVUVfMikpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0RXh0ZXJuTWV0RXh0cmFjdG9yLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0RXh0ZXJuTWV0RXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNGYwNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RFeHRlcm5NZXRFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YVRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXhjZXB0aW9ucy5NZXRFeHRyYWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYy5FeGVjSGVscGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKKy8qKgorICogCisgKiBUZXN0IFN1aXRlIGZvciB0aGUge0BsaW5rIEV4dGVybk1ldEV4dHJhY3Rvcn0gCisgKiAgICAgICAgICAuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RXh0ZXJuTWV0RXh0cmFjdG9yIGV4dGVuZHMgTWV0YWRhdGFUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBFeHRlcm5NZXRFeHRyYWN0b3IgZXh0cmFjdG9yOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRSA9ICJGaWxlbmFtZSI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTE9DQVRJT04gPSAiRmlsZUxvY2F0aW9uIjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9UWVBFID0gIlByb2R1Y3RUeXBlIjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRGaWxlbmFtZSA9ICIvdGVzdGZpbGUudHh0IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRQcm9kdWN0VHlwZSA9ICJHZW5lcmljRmlsZSI7CisgIAorICBwcml2YXRlIEZpbGUgZXh0cmFjdEZpbGU7CisgIAorICBwcml2YXRlIEZpbGUgY29uZkZpbGU7CisgIAorICBwcml2YXRlIEZpbGUgbWV0RmlsZTsKKyAgCisgIHByaXZhdGUgU3RyaW5nIGV4cGVjdGVkRmlsZUxvY2F0aW9uOworICAKKyAgcHVibGljIFRlc3RFeHRlcm5NZXRFeHRyYWN0b3IoU3RyaW5nIG5hbWUpeworICAgIHN1cGVyKG5hbWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RvcigpIHsKKworICAgIE1ldGFkYXRhIG1ldCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YSh0aGlzLmV4dHJhY3RGaWxlLCB0aGlzLmNvbmZGaWxlKTsKKyAgICB9IGNhdGNoIChNZXRFeHRyYWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwobWV0KTsKKyAgICBhc3NlcnRUcnVlKHRoaXMubWV0RmlsZS5leGlzdHMoKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoRklMRU5BTUUpKTsKKyAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShGSUxFX0xPQ0FUSU9OKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUFJPRFVDVF9UWVBFKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGaWxlbmFtZS5zdWJzdHJpbmcoMSksIG1ldC5nZXRNZXRhZGF0YShGSUxFTkFNRSkpOworICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQ6IFsiK3RoaXMuZXhwZWN0ZWRGaWxlTG9jYXRpb24rIl07IEFjdHVhbDogWyIrbWV0LmdldE1ldGFkYXRhKEZJTEVfTE9DQVRJT04pKyJdIiwgdGhpcy5leHBlY3RlZEZpbGVMb2NhdGlvbiwgbWV0LmdldE1ldGFkYXRhKEZJTEVfTE9DQVRJT04pKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0VHlwZSwgbWV0LmdldE1ldGFkYXRhKFBST0RVQ1RfVFlQRSkpOworCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGFUZXN0Q2FzZSN0ZWFyRG93bigpCisgICAqLworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgaWYgKHRoaXMubWV0RmlsZSAhPSBudWxsICYmIHRoaXMubWV0RmlsZS5leGlzdHMoKSkgeworICAgICAgdGhpcy5tZXRGaWxlLmRlbGV0ZSgpOworICAgICAgdGhpcy5tZXRGaWxlID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgaWYodGhpcy5jb25mRmlsZSAhPSBudWxsKSB0aGlzLmNvbmZGaWxlID0gbnVsbDsKKyAgICBpZih0aGlzLmV4dHJhY3RGaWxlICE9IG51bGwpIHRoaXMuZXh0cmFjdEZpbGUgPSBudWxsOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhVGVzdENhc2Ujc2V0VXAoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuc2V0VXAoKTsKKyAgICBTdHJpbmcgY29uZmlnRmlsZW5hbWUgPSAiL2V4dGVybi1jb25maWcueG1sIjsKKyAgICBTdHJpbmcgZXh0cmFjdEZpbGVuYW1lID0gIi90ZXN0ZmlsZS50eHQiOworICAgIFN0cmluZyBleHRyYWN0b3JGaWxlbmFtZSA9ICIvdGVzdEV4dHJhY3RvciI7CisgICAgU3RyaW5nIHNhbXBsZU1ldEZpbGVuYW1lID0gIi9zYW1wbGVtZXQueG1sIjsKKyAgICAKKyAgICB0aGlzLmNvbmZGaWxlID0gc3VwZXIuZ2V0VGVzdERhdGFGaWxlKGNvbmZpZ0ZpbGVuYW1lKTsKKyAgICB0aGlzLmV4dHJhY3RGaWxlID0gc3VwZXIuZ2V0VGVzdERhdGFGaWxlKGV4dHJhY3RGaWxlbmFtZSk7CisgICAgdGhpcy5tZXRGaWxlID0gbmV3IEZpbGUodGhpcy5leHRyYWN0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCkrIi5tZXQiKTsKKyAgICB0aGlzLmV4cGVjdGVkRmlsZUxvY2F0aW9uID0gdGhpcy5leHRyYWN0RmlsZS5nZXRQYXJlbnQoKTsKKyAgICAKKyAgICBGaWxlIGV4dHJhY3RvckZpbGUgPSBzdXBlci5nZXRUZXN0RGF0YUZpbGUoZXh0cmFjdG9yRmlsZW5hbWUpOworICAgIAorICAgIC8vIG1ha2UgaXQgZXhlY3V0YWJsZQorICAgIC8vIHllcyB0aGlzIGlzIGdoZXR0bworICAgIFN0cmluZyBjaG1vZENtZCA9ICJjaG1vZCAreCAiK2V4dHJhY3RvckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgRXhlY0hlbHBlci5leGVjVXNpbmdTaGVsbChjaG1vZENtZCk7CisgICAgCisgICAgLy8gcmVwbGFjZSB0aGUgRmlsZUxvY2F0aW9uIG1ldCBmaWVsZCBpbiB0aGUgc2FtcGxlIG1ldCBmaWxlCisgICAgLy8gd2l0aCB0aGUgYWN0dWFsIGZpbGUgbG9jYXRpb24gb2YgdGhlIGV4dHJhY3RGaWxlCisgICAgRmlsZSBzYW1wbGVNZXRGaWxlID0gc3VwZXIuZ2V0VGVzdERhdGFGaWxlKHNhbXBsZU1ldEZpbGVuYW1lKTsKKyAgICBTdHJpbmcgc2FtcGxlTWV0RmlsZUNvbnRlbnRzID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcoc2FtcGxlTWV0RmlsZSk7CisgICAgU3RyaW5nIGV4dHJhY3RGaWxlTG9jS2V5ID0gIltFWFRSQUNUX0ZJTEVfTE9DXSI7CisgICAgc2FtcGxlTWV0RmlsZUNvbnRlbnRzID0gc2FtcGxlTWV0RmlsZUNvbnRlbnRzLnJlcGxhY2UoZXh0cmFjdEZpbGVMb2NLZXksIFVSTEVuY29kZXIuZW5jb2RlKGV4dHJhY3RGaWxlLmdldFBhcmVudCgpLCAiVVRGLTgiKSk7CisgICAgRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlKHNhbXBsZU1ldEZpbGUsIHNhbXBsZU1ldEZpbGVDb250ZW50cywgIlVURi04Iik7CisgICAgCisgICAgLy8gcmVwbGFjZSB0aGUgcGF0aCB0byB0aGUgc2FtcGxlIG1ldCBmaWxlIGluc2lkZSBvZiB0ZXN0RXh0cmFjdG9yCisgICAgU3RyaW5nIGV4dHJhY3RvckZpbGVDb250ZW50cyA9IEZpbGVVdGlscy5yZWFkRmlsZVRvU3RyaW5nKGV4dHJhY3RvckZpbGUpOworICAgIFN0cmluZyBzYW1wbGVNZXRGaWxlUGF0aEtleSA9ICI8VEVTVF9TQU1QTEVfTUVUX1BBVEg+IjsKKyAgICBleHRyYWN0b3JGaWxlQ29udGVudHMgPSBleHRyYWN0b3JGaWxlQ29udGVudHMucmVwbGFjZShzYW1wbGVNZXRGaWxlUGF0aEtleSwgc2FtcGxlTWV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlKGV4dHJhY3RvckZpbGUsIGV4dHJhY3RvckZpbGVDb250ZW50cyk7CisgICAgCisgICAgLy8gcmVwbGFjZSBwYXRoIGluIGNvbmZGaWxlIG5hbWVkIFRFU1RfUEFUSAorICAgIFN0cmluZyB0ZXN0UGF0aEtleSA9ICJURVNUX1BBVEgiOworICAgIFN0cmluZyBjb25mRmlsZUNvbnRlbnRzID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcodGhpcy5jb25mRmlsZSk7CisgICAgTWV0YWRhdGEgcmVwbGFjZU1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIHJlcGxhY2VNZXQuYWRkTWV0YWRhdGEodGVzdFBhdGhLZXksIGV4dHJhY3RvckZpbGUuZ2V0UGFyZW50KCkpOworICAgIGNvbmZGaWxlQ29udGVudHMgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjb25mRmlsZUNvbnRlbnRzLCByZXBsYWNlTWV0KTsKKyAgICBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUodGhpcy5jb25mRmlsZSwgY29uZkZpbGVDb250ZW50cyk7CisgICAgCisKKyAgICB0cnkgeworICAgICAgZXh0cmFjdG9yID0gbmV3IEV4dGVybk1ldEV4dHJhY3RvcigpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RFeHRlcm5NZXRFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RFeHRlcm5NZXRFeHRyYWN0b3JDb25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI3MjQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdEV4dGVybk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworLy8gTWV0YWRhdGEgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9KdW5pdCBpbXBvcnRzCisKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUZXN0IHN1aXRlIGZvciB0aGUge0BsaW5rIEV4dGVybkNvbmZpZ1JlYWRlcn0KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RXh0ZXJuTWV0RXh0cmFjdG9yQ29uZmlnUmVhZGVyIGV4dGVuZHMgTWV0YWRhdGFUZXN0Q2FzZSB7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgVGVzdEV4dGVybk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIENhc2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdEV4dGVybk1ldEV4dHJhY3RvckNvbmZpZ1JlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbmZpZ0ZpbGVQYXRoID0gIi9leHRlcm4tY29uZmlnLnhtbCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRCaW5QYXRoRW5kaW5nID0gIi90ZXN0RXh0cmFjdG9yIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBhcmcxID0gRXh0ZXJuTWV0RXh0cmFjdG9yTWV0S2V5cy5EQVRBX0ZJTEVfUExBQ0VfSE9MREVSOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGFyZzIgPSBFeHRlcm5NZXRFeHRyYWN0b3JNZXRLZXlzLk1FVF9GSUxFX1BMQUNFX0hPTERFUjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgYXJnMyA9ICItRHRydWU9YWx3YXlzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBhcmc0ID0gImZvbyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgYXJnNSA9ICJiYXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGFyZzVlbmRpbmcgPSAiL3Rlc3RcXCBib28iOworICAgIAorICAgIHByaXZhdGUgRmlsZSBjb25mRmlsZTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlnKCkgeworICAgICAgICBFeHRlcm5hbE1ldEV4dHJhY3RvckNvbmZpZyBjb25maWcgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnID0gKEV4dGVybmFsTWV0RXh0cmFjdG9yQ29uZmlnKSBuZXcgRXh0ZXJuQ29uZmlnUmVhZGVyKCkucGFyc2VDb25maWdGaWxlKHRoaXMuY29uZkZpbGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlnLmdldFdvcmtpbmdEaXJQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNvbmZpZy5nZXRXb3JraW5nRGlyUGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0RXh0cmFjdG9yQmluUGF0aCgpLmVuZHNXaXRoKGV4cGVjdGVkQmluUGF0aEVuZGluZykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRFeHRyYWN0b3JCaW5QYXRoKCkuaW5kZXhPZigiWyIpID09IC0xKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0RXh0cmFjdG9yQmluUGF0aCgpLmluZGV4T2YoIl0iKSA9PSAtMSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlnLmdldEFyZ0xpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBjb25maWcuZ2V0QXJnTGlzdCgpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhcmcxLCBjb25maWcuZ2V0QXJnTGlzdCgpWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFyZzIsIGNvbmZpZy5nZXRBcmdMaXN0KClbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYXJnMywgY29uZmlnLmdldEFyZ0xpc3QoKVsyXSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhcmc0LCBjb25maWcuZ2V0QXJnTGlzdCgpWzNdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFyZzUsIGNvbmZpZy5nZXRBcmdMaXN0KClbNF0pOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRBcmdMaXN0KClbNV0uZW5kc1dpdGgoYXJnNWVuZGluZykpOworCisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YVRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgIHRoaXMuY29uZkZpbGUgPSBnZXRUZXN0RGF0YUZpbGUoY29uZmlnRmlsZVBhdGgpOworICAgICAgCisgICAgICAvLyByZXBsYWNlIHBhdGggaW4gY29uZkZpbGUgbmFtZWQgVEVTVF9QQVRICisgICAgICBTdHJpbmcgdGVzdFBhdGhLZXkgPSAiVEVTVF9QQVRIIjsKKyAgICAgIFN0cmluZyBjb25mRmlsZUNvbnRlbnRzID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcodGhpcy5jb25mRmlsZSk7CisgICAgICBNZXRhZGF0YSByZXBsYWNlTWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICByZXBsYWNlTWV0LmFkZE1ldGFkYXRhKHRlc3RQYXRoS2V5LCB0aGlzLmNvbmZGaWxlLmdldFBhcmVudCgpKTsKKyAgICAgIGNvbmZGaWxlQ29udGVudHMgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjb25mRmlsZUNvbnRlbnRzLCByZXBsYWNlTWV0KTsKKyAgICAgIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZSh0aGlzLmNvbmZGaWxlLCBjb25mRmlsZUNvbnRlbnRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0TWV0UmVhZGVyLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0TWV0UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NDRhMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9leHRyYWN0b3JzL1Rlc3RNZXRSZWFkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldEV4dHJhY3RvcjsgLy9mb3IgamF2YWRvYworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YVRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIE1ldFJlYWRlckV4dHJhY3Rvcn0ge0BsaW5rIE1ldEV4dHJhY3Rvcn0KKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXRSZWFkZXIgZXh0ZW5kcyBNZXRhZGF0YVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgTWV0UmVhZGVyRXh0cmFjdG9yIGV4dHJhY3RvcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZFByb2R1Y3RUeXBlID0gIkdlbmVyaWNGaWxlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZEZpbGVuYW1lID0gInRlc3RmaWxlLnR4dCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSAiRmlsZW5hbWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTE9DQVRJT04gPSAiRmlsZUxvY2F0aW9uIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEUgPSAiUHJvZHVjdFR5cGUiOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGV4cGVjdGVkRmlsZUxvY2F0aW9uOworICAgIAorICAgIHByaXZhdGUgRmlsZSBleHRyYWN0RmlsZTsKKyAgICAKKyAgICBwdWJsaWMgVGVzdE1ldFJlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RNZXRhZGF0YSgpIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YSh0aGlzLmV4dHJhY3RGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwobWV0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXQuZ2V0SGFzaHRhYmxlKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1ldC5nZXRIYXNodGFibGUoKS5rZXlTZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBtZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoRklMRU5BTUUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldC5nZXRNZXRhZGF0YShGSUxFTkFNRSksIGV4cGVjdGVkRmlsZW5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKG1ldC5jb250YWluc0tleShGSUxFX0xPQ0FUSU9OKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoRklMRV9MT0NBVElPTiksIGV4cGVjdGVkRmlsZUxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXQuY29udGFpbnNLZXkoUFJPRFVDVF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXQuZ2V0TWV0YWRhdGEoUFJPRFVDVF9UWVBFKSwgZXhwZWN0ZWRQcm9kdWN0VHlwZSk7CisKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgU3RyaW5nIGV4dHJhY3RGaWxlbmFtZSA9ICIvdGVzdGZpbGUyLnR4dCI7CisgICAgICBTdHJpbmcgc2FtcGxlTWV0RmlsZW5hbWUgPSAiL3Rlc3RmaWxlMi50eHQubWV0IjsKKyAgICAgIHRoaXMuZXh0cmFjdEZpbGUgPSBzdXBlci5nZXRUZXN0RGF0YUZpbGUoZXh0cmFjdEZpbGVuYW1lKTsKKyAgICAgIHRoaXMuZXhwZWN0ZWRGaWxlTG9jYXRpb24gPSB0aGlzLmV4dHJhY3RGaWxlLmdldFBhcmVudCgpOworICAgICAgCisgICAgICAvLyByZXBsYWNlIHRoZSBGaWxlTG9jYXRpb24gbWV0IGZpZWxkIGluIHRoZSBzYW1wbGUgbWV0IGZpbGUKKyAgICAgIC8vIHdpdGggdGhlIGFjdHVhbCBmaWxlIGxvY2F0aW9uIG9mIHRoZSBleHRyYWN0RmlsZQorICAgICAgRmlsZSBzYW1wbGVNZXRGaWxlID0gc3VwZXIuZ2V0VGVzdERhdGFGaWxlKHNhbXBsZU1ldEZpbGVuYW1lKTsKKyAgICAgIFN0cmluZyBzYW1wbGVNZXRGaWxlQ29udGVudHMgPSBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyhzYW1wbGVNZXRGaWxlKTsKKyAgICAgIFN0cmluZyBleHRyYWN0RmlsZUxvY0tleSA9ICJbRVhUUkFDVF9GSUxFX0xPQ10iOworICAgICAgc2FtcGxlTWV0RmlsZUNvbnRlbnRzID0gc2FtcGxlTWV0RmlsZUNvbnRlbnRzLnJlcGxhY2UoZXh0cmFjdEZpbGVMb2NLZXksIFVSTEVuY29kZXIuZW5jb2RlKGV4dHJhY3RGaWxlLmdldFBhcmVudCgpLCAiVVRGLTgiKSk7CisgICAgICBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUoc2FtcGxlTWV0RmlsZSwgc2FtcGxlTWV0RmlsZUNvbnRlbnRzLCAiVVRGLTgiKTsKKworICAgICAgdGhpcy5leHRyYWN0b3IgPSBuZXcgTWV0UmVhZGVyRXh0cmFjdG9yKCk7CisKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhVGVzdENhc2UjdGVhckRvd24oKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdFByb2RUeXBlUGF0dGVybk1ldEV4dHJhY3Rvci5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL2V4dHJhY3RvcnMvVGVzdFByb2RUeXBlUGF0dGVybk1ldEV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDA0OWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZXh0cmFjdG9ycy9UZXN0UHJvZFR5cGVQYXR0ZXJuTWV0RXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9yczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0UHJvZFR5cGVQYXR0ZXJuTWV0RXh0cmFjdG9yIHsKKworICAgIHByaXZhdGUgUHJvZFR5cGVQYXR0ZXJuTWV0RXh0cmFjdG9yIGV4dHJhY3RvcjsKKyAgICBwcml2YXRlIEZpbGUgY29uZmlnRmlsZTsKKyAgICBwcml2YXRlIEZpbGUgY29uZmlnRmlsZTI7CisKKyAgICBwcml2YXRlIEZpbGUgdG1wRGlyOworICAgIHByaXZhdGUgRmlsZSBib29rMTsKKyAgICBwcml2YXRlIEZpbGUgYm9vazI7CisgICAgcHJpdmF0ZSBGaWxlIHBhZ2UxOworICAgIHByaXZhdGUgRmlsZSBwYWdlMjsKKyAgICBwcml2YXRlIEZpbGUgcGFnZTFhOworICAgIHByaXZhdGUgRmlsZSBwYWdlMmE7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9wcm9kdWN0LXR5cGUtcGF0dGVybnMueG1sIik7CisgICAgICAgIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZSh1cmwudG9VUkkoKSk7CisgICAgICAgIGV4dHJhY3RvciA9IG5ldyBQcm9kVHlwZVBhdHRlcm5NZXRFeHRyYWN0b3IoKTsKKyAgICAgICAgZXh0cmFjdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisKKyAgICAgICAgdG1wRGlyID0gRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgICAgICBib29rMSA9IG5ldyBGaWxlKHRtcERpciwgImJvb2stMTIzNDU2Nzg5MC50eHQiKTsKKyAgICAgICAgYm9vazIgPSBuZXcgRmlsZSh0bXBEaXIsICJib29rLTA5ODc2NTQzMjEudHh0Iik7CisgICAgICAgIHBhZ2UxID0gbmV3IEZpbGUodG1wRGlyLCAicGFnZS0xMjM0NTY3ODkwLTExMS50eHQiKTsKKyAgICAgICAgcGFnZTIgPSBuZXcgRmlsZSh0bXBEaXIsICJwYWdlLTA5ODc2NTQzMjEtMjIyLnR4dCIpOworICAgICAgICBGaWxlcy50b3VjaChib29rMSk7CisgICAgICAgIEZpbGVzLnRvdWNoKGJvb2syKTsKKyAgICAgICAgRmlsZXMudG91Y2gocGFnZTEpOworICAgICAgICBGaWxlcy50b3VjaChwYWdlMik7CisKKyAgICAgICAgdXJsID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3Byb2R1Y3QtdHlwZS1wYXR0ZXJucy0yLnhtbCIpOworICAgICAgICBjb25maWdGaWxlMiA9IG5ldyBGaWxlKHVybC50b1VSSSgpKTsKKyAgICAgICAgcGFnZTFhID0gbmV3IEZpbGUodG1wRGlyLCAicGFnZS0xMTEtMTIzNDU2Nzg5MC50eHQiKTsKKyAgICAgICAgcGFnZTJhID0gbmV3IEZpbGUodG1wRGlyLCAicGFnZS0yMjItMDk4NzY1NDMyMS50eHQiKTsKKyAgICAgICAgRmlsZXMudG91Y2gocGFnZTFhKTsKKyAgICAgICAgRmlsZXMudG91Y2gocGFnZTJhKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVF1aWV0bHkodG1wRGlyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShib29rMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtZXQuZ2V0QWxsS2V5cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQm9vayIsIG1ldC5nZXRNZXRhZGF0YSgiUHJvZHVjdFR5cGUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzNDU2Nzg5MCIsIG1ldC5nZXRNZXRhZGF0YSgiSVNCTiIpKTsKKworICAgICAgICBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKGJvb2syKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldC5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCb29rIiwgbWV0LmdldE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwOTg3NjU0MzIxIiwgbWV0LmdldE1ldGFkYXRhKCJJU0JOIikpOworCisgICAgICAgIG1ldCA9IGV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEocGFnZTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbWV0LmdldEFsbEtleXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJvb2tQYWdlIiwgbWV0LmdldE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3ODkwIiwgbWV0LmdldE1ldGFkYXRhKCJJU0JOIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjExMSIsIG1ldC5nZXRNZXRhZGF0YSgiUGFnZSIpKTsKKworICAgICAgICBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKHBhZ2UyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1ldC5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCb29rUGFnZSIsIG1ldC5nZXRNZXRhZGF0YSgiUHJvZHVjdFR5cGUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDk4NzY1NDMyMSIsIG1ldC5nZXRNZXRhZGF0YSgiSVNCTiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjIiLCBtZXQuZ2V0TWV0YWRhdGEoIlBhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Q29uZmlnRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBkdXBsaWNhdGUgbWV0IGVudHJpZXMgZG8gbm90IGV4aXN0IHdoZW4gcmUtcGFyc2luZyBhIG5ldyBjb25maWcgZmlsZQorICAgICAgICBNZXRhZGF0YSBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKGJvb2sxLCBjb25maWdGaWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldC5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YSgiUHJvZHVjdFR5cGUiKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0LmdldEFsbE1ldGFkYXRhKCJJU0JOIikuc2l6ZSgpKTsKKworICAgICAgICBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKGJvb2syLCBjb25maWdGaWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldC5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YSgiUHJvZHVjdFR5cGUiKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0LmdldEFsbE1ldGFkYXRhKCJJU0JOIikuc2l6ZSgpKTsKKworICAgICAgICBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKHBhZ2UxLCBjb25maWdGaWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1ldC5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YSgiUHJvZHVjdFR5cGUiKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0LmdldEFsbE1ldGFkYXRhKCJJU0JOIikuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YSgiUGFnZSIpLnNpemUoKSk7CisKKyAgICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShwYWdlMiwgY29uZmlnRmlsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBtZXQuZ2V0QWxsS2V5cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXQuZ2V0QWxsTWV0YWRhdGEoIlByb2R1Y3RUeXBlIikuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldC5nZXRBbGxNZXRhZGF0YSgiSVNCTiIpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXQuZ2V0QWxsTWV0YWRhdGEoIlBhZ2UiKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnREZWNsYXJhdGlvbk9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50IGRlY2xhcmF0aW9ucyBzaG91bGRuJ3QgbWF0dGVyCisgICAgICAgIGV4dHJhY3Rvci5zZXRDb25maWdGaWxlKGNvbmZpZ0ZpbGUyKTsKKworICAgICAgICBNZXRhZGF0YSBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKGJvb2sxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldC5nZXRBbGxLZXlzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCb29rIiwgbWV0LmdldE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3ODkwIiwgbWV0LmdldE1ldGFkYXRhKCJJU0JOIikpOworCisgICAgICAgIG1ldCA9IGV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEoYm9vazIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWV0LmdldEFsbEtleXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJvb2siLCBtZXQuZ2V0TWV0YWRhdGEoIlByb2R1Y3RUeXBlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjA5ODc2NTQzMjEiLCBtZXQuZ2V0TWV0YWRhdGEoIklTQk4iKSk7CisKKyAgICAgICAgbWV0ID0gZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShwYWdlMWEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbWV0LmdldEFsbEtleXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJvb2tQYWdlIiwgbWV0LmdldE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3ODkwIiwgbWV0LmdldE1ldGFkYXRhKCJJU0JOIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjExMSIsIG1ldC5nZXRNZXRhZGF0YSgiUGFnZSIpKTsKKworICAgICAgICBtZXQgPSBleHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKHBhZ2UyYSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBtZXQuZ2V0QWxsS2V5cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQm9va1BhZ2UiLCBtZXQuZ2V0TWV0YWRhdGEoIlByb2R1Y3RUeXBlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjA5ODc2NTQzMjEiLCBtZXQuZ2V0TWV0YWRhdGEoIklTQk4iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyIiwgbWV0LmdldE1ldGFkYXRhKCJQYWdlIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS9maWxlbmFtaW5nL1Rlc3RQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZmlsZW5hbWluZy9UZXN0UGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDdiMzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvZmlsZW5hbWluZy9UZXN0UGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmZpbGVuYW1pbmc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4Y2VwdGlvbnMuTmFtaW5nQ29udmVudGlvbkV4Y2VwdGlvbjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9ufS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBOYW1pbmdDb252ZW50aW9uRXhjZXB0aW9uIHsKKyAgICAgIEZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJvZ3VzIiwgImJvZ3VzIik7CisgICAgICBGaWxlIHRtcERpciA9IG5ldyBGaWxlKHRtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLAorICAgICAgICAgICAgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisgICAgICBpZiAoIXRtcERpci5ta2RpcnMoKSkgeworICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHRlbXAgZGlyZWN0b3J5Iik7CisgICAgICB9CisgICAgICB0bXBGaWxlLmRlbGV0ZSgpOworICAgICAgRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKHRtcERpciwgIlRlc3RQcm9kdWN0LnR4dCIpOworICAgICAgTWV0YWRhdGEgbSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgbS5yZXBsYWNlTWV0YWRhdGEoIk5ld05hbWUiLCAiTmV3UHJvZHVjdC50eHQiKTsKKworICAgICAgLy8gVGVzdCBmYWlsdXJlLgorICAgICAgUGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbiBuYyA9IG5ldyBQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uKCk7CisgICAgICBuYy5zZXROYW1pbmdDb252KCJbTmV3TmFtZV0iKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBuYy5yZW5hbWUodGVzdEZpbGUsIG0pOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElPRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChOYW1pbmdDb252ZW50aW9uRXhjZXB0aW9uIGUpIHsgLyogZXhwZWN0IHRocm93ICovIH0KKworICAgICAgLy8gVGVzdCBzdWNjZXNzLgorICAgICAgRmlsZVV0aWxzLnRvdWNoKHRlc3RGaWxlKTsKKyAgICAgIEZpbGUgbmV3RmlsZSA9IG5jLnJlbmFtZSh0ZXN0RmlsZSwgbSk7CisgICAgICBhc3NlcnRUcnVlKG5ld0ZpbGUuZXhpc3RzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJOZXdQcm9kdWN0LnR4dCIsIG5ld0ZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEZhbHNlKHRlc3RGaWxlLmV4aXN0cygpKTsKKworICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRtcERpcik7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvcHJlY29uZGl0aW9ucy9UZXN0UHJlQ29uZEV2YWxVdGlscy5qYXZhIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvVGVzdFByZUNvbmRFdmFsVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ4NTlmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3ByZWNvbmRpdGlvbnMvVGVzdFByZUNvbmRFdmFsVXRpbHMuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9uczsKKworLy8gTWV0YWRhdGEgSW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGFUZXN0Q2FzZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dDsKKworLy9KdW5pdCBpbXBvcnRzCisKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3Qgc3VpdGUgZm9yIHRoZSB7QGxpbmsgUHJlQ29uZEV2YWxVdGlsc30gY2xhc3MKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UHJlQ29uZEV2YWxVdGlscyBleHRlbmRzIE1ldGFkYXRhVGVzdENhc2UgeworCisgICAgTGlua2VkTGlzdDxTdHJpbmc+IHByZWNvbmRpdGlvbnM7CisgICAgCisgICAgcHJpdmF0ZSBQcmVDb25kRXZhbFV0aWxzIGV2YWxVdGlsczsKKworICAgIHB1YmxpYyBUZXN0UHJlQ29uZEV2YWxVdGlscyhTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgdGhpcy5wcmVjb25kaXRpb25zID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICB0aGlzLnByZWNvbmRpdGlvbnMuYWRkKCJDaGVja1RoYXREYXRhRmlsZVNpemVJc0dyZWF0ZXJUaGFuWmVybyIpOworICAgICAgICB0aGlzLnByZWNvbmRpdGlvbnMuYWRkKCJDaGVja1RoYXREYXRhRmlsZUV4aXN0cyIpOworICAgICAgICB0aGlzLnByZWNvbmRpdGlvbnMuYWRkKCJDaGVja0RhdGFGaWxlTWltZVR5cGUiKTsKKyAgICAgICAgRmlsZSBwcmVDb25kRmlsZSA9IGdldFRlc3REYXRhRmlsZSgiL21ldF9leHRyX3ByZWNvbmRpdGlvbnMueG1sIik7CisgICAgICAgIHRoaXMuZXZhbFV0aWxzID0gbmV3IFByZUNvbmRFdmFsVXRpbHMobmV3IEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQoImZpbGU6IiArIHByZUNvbmRGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV2YWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gVGVzdCBmaWxlIGlzIGFsc28gdGhlIGNvbmZpZyBmaWxlIHdlIHVzZWQsIG5lYXQhCisgICAgICAgIEZpbGUgcHJvZEZpbGUgPSBnZXRUZXN0RGF0YUZpbGUoIi9tZXRfZXh0cl9wcmVjb25kaXRpb25zLnhtbCIpOworICAgICAgICBhc3NlcnRUcnVlKHRoaXMuZXZhbFV0aWxzLmV2YWwodGhpcy5wcmVjb25kaXRpb25zLCBwcm9kRmlsZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1Rlc3RNaW1lVHlwZVV0aWxzLmphdmEgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvdXRpbC9UZXN0TWltZVR5cGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTk5MWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvbWV0YWRhdGEvdXRpbC9UZXN0TWltZVR5cGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0TWltZVR5cGVVdGlscyBleHRlbmRzIFRlc3RDYXNlIHsKKworCXB1YmxpYyB2b2lkIHRlc3RNaW1lVHlwZXMoKSB7CisJCU1pbWVUeXBlVXRpbHMgbXRVdGlscyA9IG5ldyBNaW1lVHlwZVV0aWxzKCk7CisJCWFzc2VydEVxdWFscygiYXBwbGljYXRpb24veG1sIiwgbXRVdGlscy5nZXRNaW1lVHlwZSgiZmlsZS54bWwiKSk7CisJCWFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIG10VXRpbHMuZ2V0TWltZVR5cGUoImZpbGUudHh0IikpOworCQlhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uL3BkZiIsIG10VXRpbHMuZ2V0TWltZVR5cGUoImZpbGUucGRmIikpOworCQlhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uL3hodG1sK3htbCIsIG10VXRpbHMuZ2V0TWltZVR5cGUoImZpbGUueGh0bWwiKSk7CisJCWFzc2VydEVxdWFscygiYXBwbGljYXRpb24veG1sIiwgbXRVdGlscy5nZXRTdXBlclR5cGVGb3JNaW1lVHlwZShtdFV0aWxzLmdldE1pbWVUeXBlKCJmaWxlLnhodG1sIikpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0L2V4YW1wbGUiLCBtdFV0aWxzLmdldE1pbWVUeXBlKCJmaWxlLnRlc3RleGFtcGxlIikpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1Rlc3RQYXRoVXRpbHMuamF2YSBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9tZXRhZGF0YS91dGlsL1Rlc3RQYXRoVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U3MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvY2FzL21ldGFkYXRhL3V0aWwvVGVzdFBhdGhVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUZXN0IENhc2UgU3VpdGUgZm9yIHRoZSBQYXRoVXRpbHMgY2xhc3MuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RQYXRoVXRpbHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VFbnZWYXJpYWJsZXMoKSB7CisgICAgICAgIHRoaXMuc2luZ2xlVmFsdWVUZXN0KCk7CisgICAgICAgIHRoaXMubXVsdGlWYWx1ZVRlc3QoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdERvRHluYW1pY1JlcGxhY2VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lem9uZSBpcyA6IiArIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZVpvbmUoKS5nZXRJRCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDgtMDEtMjBUMTY6MzA6MjguMDAwLTAwMDAzMyIsIFBhdGhVdGlscworICAgICAgICAgICAgLmRvRHluYW1pY1JlcGxhY2VtZW50KCJbVVRDX1RPX1RBSSgyMDA4LTAxLTIwVDE2OjI5OjU1LjAwMFopXSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI0NzUwMDAyMDEuMDAwIiwKKyAgICAgICAgICAgIFBhdGhVdGlscy5kb0R5bmFtaWNSZXBsYWNlbWVudCgKKyAgICAgICAgICAgICAgICAiW0RBVEVfVE9fU0VDUyhbVVRDX1RPX1RBSSgyMDA4LTAxLTIwVDE2OjI5OjU1LjAwMFopXSwgVEFJX0ZPUk1BVCwgMTk5My0wMS0wMSldIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMTAtMDEtMDEiLCBQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQoIltEQVRFX0FERCgyMDA5LTEyLTMxLCB5eXl5LU1NLWRkLCAxLCBkYXkpXSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2luZ2xlVmFsdWVUZXN0KCkgeworICAgICAgICBTdHJpbmcga2V5ID0gIktFWSI7CisgICAgICAgIFN0cmluZyBwYXRoU3RyaW5nID0gIlsiICsga2V5ICsgIl0iOworICAgICAgICBNZXRhZGF0YSBtID0gZ2VuZXJhdGVUZXN0TWV0YWRhdGEoa2V5LCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvcnJlY3RPdXRwdXQobSwga2V5LCB0cnVlKSwgUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29ycmVjdE91dHB1dChtLCBrZXksIGZhbHNlKSwgUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHBhdGhTdHJpbmcsIG0pLCBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhwYXRoU3RyaW5nLCBtLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSksIFBhdGhVdGlscworICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKHBhdGhTdHJpbmcsIG0sIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHBhdGhTdHJpbmcsIG0sIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhwYXRoU3RyaW5nLCBtLCB0cnVlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG11bHRpVmFsdWVUZXN0KCkgeworICAgICAgICBTdHJpbmcga2V5ID0gIktFWSI7CisgICAgICAgIFN0cmluZyBwYXRoU3RyaW5nID0gIlsiICsga2V5ICsgIl0iOworICAgICAgICBNZXRhZGF0YSBtID0gZ2VuZXJhdGVUZXN0TWV0YWRhdGEoa2V5LCA1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvcnJlY3RPdXRwdXQobSwga2V5LCB0cnVlKSwgUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29ycmVjdE91dHB1dChtLCBrZXksIGZhbHNlKSwgUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHBhdGhTdHJpbmcsIG0pLCBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhwYXRoU3RyaW5nLCBtLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhwYXRoU3RyaW5nLCBtKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSwgdHJ1ZSkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMocGF0aFN0cmluZywgbSwgZmFsc2UpLmVxdWFscygKKyAgICAgICAgICAgICAgICBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhwYXRoU3RyaW5nLCBtLCB0cnVlKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGFkYXRhIGdlbmVyYXRlVGVzdE1ldGFkYXRhKFN0cmluZyBrZXksCisgICAgICAgICAgICBpbnQgbnVtT2ZWYWx1ZUZpZWxkcykgeworICAgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICBWZWN0b3IgdmFsTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZlZhbHVlRmllbGRzOyBpKyspCisgICAgICAgICAgICB2YWxMaXN0LmFkZCgidmFsIiArIGkpOworICAgICAgICBtLmFkZE1ldGFkYXRhKGtleSwgdmFsTGlzdCk7CisgICAgICAgIHJldHVybiBtOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb3JyZWN0T3V0cHV0KE1ldGFkYXRhIG0sIFN0cmluZyBrZXksCisgICAgICAgICAgICBib29sZWFuIGV4cGFuZCkgeworICAgICAgICBMaXN0IHZhbExpc3QgPSBtLmdldEFsbE1ldGFkYXRhKGtleSk7CisgICAgICAgIFN0cmluZyB2YXIgPSAoU3RyaW5nKSB2YWxMaXN0LmdldCgwKTsKKyAgICAgICAgaWYgKGV4cGFuZCkKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgdmFsTGlzdC5zaXplKCk7IGorKykKKyAgICAgICAgICAgICAgICB2YXIgKz0gUGF0aFV0aWxzLkRFTElNSVRFUiArIChTdHJpbmcpIHZhbExpc3QuZ2V0KGopOworICAgICAgICByZXR1cm4gdmFyOworICAgIH0KKyAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvY29weWFuZHJld3JpdGUudGVzdC5jb25mIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvY29weWFuZHJld3JpdGUudGVzdC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjgzNDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy9jb3B5YW5kcmV3cml0ZS50ZXN0LmNvbmYKQEAgLTAsMCArMSw1IEBACitudW1SZXdyaXRlRmllbGRzPTIKK3Jld3JpdGVGaWVsZDE9UHJvZHVjdFR5cGUKK3Jld3JpdGVGaWVsZDI9RmlsZUxvY2F0aW9uCitQcm9kdWN0VHlwZS5wYXR0ZXJuPU5ld1Byb2R1Y3RUeXBlW1Byb2R1Y3RUeXBlXQorRmlsZUxvY2F0aW9uLnBhdHRlcm49L25ldy9sb2MvW0ZpbGVMb2NhdGlvbl0KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2V4dGVybi1jb25maWcueG1sIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvZXh0ZXJuLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNTE4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2V4dGVybi1jb25maWcueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBGSVhNRTogY2hhbmdlIG5hbWVzcGFjZSBVUkk/IC0tPgorPGNhczpleHRlcm5leHRyYWN0b3IgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisKKwk8IS0tICAKKwkgICAgd29ya2luZ0Rpcjogc3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgZXh0ZXJuYWwgY29tbWFuZCBsaW5lIG1ldCBleHRyYWN0b3Igd2lsbAorCSAgICBiZSBydW4gaW4uIAorCSAgICAKKwkgICAgaWYgd29ya2luZ0RpciBpcyBub3Qgc3BlY2lmaWVkLCBhbmQgaWYgdGhlIGV4dGVybmFsIGNvbW1hbmQgbGluZSBtZXQgZXh0cmFjdG9yIGhvbm9ycworCSAgICB0aGUgd29ya2luZ0RpciBjb250cmFjdCAoZ2VuZXJhdGluZyAubWV0IGZpbGUgaW4gZGlyZWN0b3J5IHRoYXQgaXQgaXMgY2FsbGVkIGZyb20pLCB0aGVuIAorCSAgICB0aGUgLm1ldCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIC9wYXRoL3RvL2ZpbGUncyBwYXJlbnQgZGlyZWN0b3J5LiBPdGhlcndpc2UsIGlmIHRoZQorCSAgICBleHRlcm5hbCBjb21tYW5kIGxldCBtZXQgZXh0cmFjdG9yIGRvZXNuJ3QgaG9ub3Igd29ya2luZyBkaXIsIHRoZW4gYWxsIGJldHMKKwkgICAgYXJlIG9mZi4KKwktLT4KKwk8ZXhlYyB3b3JraW5nRGlyPSIiPgorCQk8IS0tICB0aGlzIHBhdGggY2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIC0tPgorCQk8IS0tICB5b3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBlbnZSZXBsYWNlIHRhZyAoPXRydWUpIAorCQkgICAgICB0byB0dXJuIG9uIGVudmlyb25tZW50IHZhcmlhYmxlIHJlcGxhY2VtZW50CisJCS0tPgorCQk8ZXh0cmFjdG9yQmluUGF0aD5bVEVTVF9QQVRIXS90ZXN0RXh0cmFjdG9yPC9leHRyYWN0b3JCaW5QYXRoPgorCisJCTwhLS0gIG1ha2Ugc3VyZSB0byB1c2UgY2hhcmFjdGVyIGVudGl0aWVzIGlmIHRoZXJlIGFyZSBhbnkgd2VpcmQKKwkJCXBhcmFtZXRlcnMgaGVyZSB0aGF0IHdvdWxkIHNjcmV3IHVwIHRoZSBYTUwuCisJCQkKKwkJCWFyZ3MgY29tZSBhZnRlciBwcm92aWRpbmcgdGhlIGZpbGUgdG8gdGhpcyBtZXQgZXh0cmFjdG9yLiBTbywgaW4gb3RoZXIKKwkJCXdvcmRzLCB3ZSBhc3N1bWUgdGhhdCBleHRyYWN0b3JCaW5QYXRoICZndDtmaWxlJmx0OyAmbHQ7YXJncy4uLiZndDsKKwkJCQorCQkJd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhbHdheXMgdGhlIGZpbGUgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tLAorCQkJYW5kIHRoZSByZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwgdG8gcHJvdmlkZSB0byB0aGUgdW5kZXJseWluZworCQkJbWV0IGV4dHJhY3Rvci4KKwkJLS0+CisJCTxhcmdzPgorCQkJPGFyZyBpc0RhdGFGaWxlPSJ0cnVlIi8+CisJCQk8YXJnIGlzTWV0RmlsZT0idHJ1ZSIvPgorCQkJPGFyZz4tRHRydWU9YWx3YXlzPC9hcmc+CisJCQk8YXJnPmZvbzwvYXJnPgorCQkJPGFyZz5iYXI8L2FyZz4KKwkJCTwhLS0gIHlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IHRoYXQgeW91IHdvdWxkIGxpa2UgZW52aXJvbm1lbnQgCisJCQkgICAgICB2YXJpYWJsZSByZXBsYWNlbWVudCBvbiBhIHBhcnRpY3VsYXIgYXJndW1lbnQKKwkJCSAgICAgIAorCQkJICAgICAgWW91IGNhbiBhbHNvIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhIHBhdGgKKwkJCSAgICAgIGFuZCB0aGF0IHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlIHRyZWF0ZWQgYXMgc3VjaCB1c2luZyB0aGUKKwkJCSAgICAgIGlzUGF0aD0idHJ1ZSIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBwYXRoIGlzIHRyZWF0ZWQgYXMgaWYKKwkJCSAgICAgIGlzUGF0aCB3YXMgc3BlY2lmaWVkIGFzICJmYWxzZSIsIGFuZCBTdHJpbmcucmVwbGFjZUFsbCgiXFxzIiwgIlxcXFwgIikKKwkJCSAgICAgIGlzIG5vdCBjYWxsZWQuIElmIGNhbGxlZCwgYWxsIHdoaXRlIHNwYWNlcyBhcmUgcmVwbGFjZWQgZnJvbSB0aGUgcGF0aAorCQkJICAgICAgKHVzaW5nIHRoZSBhYm92ZSByZWdleCksIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBsaXRlcmFsIHN0cmluZworCQkJICAgICAgIlwgIi4KKwkJCS0tPgorCQkJPGFyZyBlbnZSZXBsYWNlPSJ0cnVlIiBpc1BhdGg9InRydWUiPltIT01FXS90ZXN0IGJvbzwvYXJnPgorCQk8L2FyZ3M+CisJPC9leGVjPgorCis8L2NhczpleHRlcm5leHRyYWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvbWV0X2V4dHJfcHJlY29uZGl0aW9ucy54bWwgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy9tZXRfZXh0cl9wcmVjb25kaXRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg0N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvbWV0X2V4dHJfcHJlY29uZGl0aW9ucy54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAgICAKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisgICAgCisKKyAgICA8IS0tIFByZWNvbmRpdGlvbiBDb21wYXJhdG9ycyAtLT4KKyAgICA8YmVhbiBpZD0iUHJlY29uZGl0aW9uQ29tcGFyYXRvciIgbGF6eS1pbml0PSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5QcmVDb25kaXRpb25Db21wYXJhdG9yIi8+CisgICAgCisgICAgCisgICAgPGJlYW4gaWQ9IkNoZWNrVGhhdERhdGFGaWxlU2l6ZUlzR3JlYXRlclRoYW5aZXJvIiBsYXp5LWluaXQ9InRydWUiIHBhcmVudD0iUHJlY29uZGl0aW9uQ29tcGFyYXRvciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5GaWxlU2l6ZUNvbXBhcmF0b3IiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDaGVjayBpZiB0aGUgY3VycmVudCBkYXRhIGZpbGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gemVybyIvPiAgICAgICAgCisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkxvbmciPjA8L3ZhbHVlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImdyZWF0ZXJfdGhhbiIvPgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0iQ2hlY2tUaGF0RGF0YUZpbGVFeGlzdHMiIGxhenktaW5pdD0idHJ1ZSIgcGFyZW50PSJQcmVjb25kaXRpb25Db21wYXJhdG9yIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLkV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrIGlmIHRoZSBjdXJyZW50IGRhdGEgZmlsZSBleGlzdHMiLz4gICAgICAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIj50cnVlPC92YWx1ZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJlcXVhbF90byIvPiAgICAKKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0iQ2hlY2tEYXRhRmlsZU1pbWVUeXBlIiBsYXp5LWluaXQ9InRydWUiIHBhcmVudD0iUHJlY29uZGl0aW9uQ29tcGFyYXRvciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEucHJlY29uZGl0aW9ucy5NaW1lVHlwZUNvbXBhcmF0b3IiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDaGVjayB0aGF0IGRhdGEgZmlsZSBtaW1lIHR5cGUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG1pbWUgdHlwZSIvPiAgICAgICAgCisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+YXBwbGljYXRpb24veG1sPC92YWx1ZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJlcXVhbF90byIvPiAgIAorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWltZVR5cGVSZXBvIiB2YWx1ZT0iLi9zcmMvdGVzdGRhdGEvdGlrYS1taW1ldHlwZXMueG1sIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VNYWdpYyIgdmFsdWU9InRydWUiLz4gCisgICAgPC9iZWFuPgorCis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2R1Y3QtdHlwZS1wYXR0ZXJucy0yLnhtbCBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2R1Y3QtdHlwZS1wYXR0ZXJucy0yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZiOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvZHVjdC10eXBlLXBhdHRlcm5zLTIueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZz4KKyAgICA8IS0tIDxlbGVtZW50PiBNVVNUIGJlIGRlZmluZWQgYmVmb3JlIDxwcm9kdWN0LXR5cGU+IHNvIHRoZWlyIHBhdHRlcm5zIGNhbiBiZSByZXNvbHZlZCAtLT4KKyAgICA8IS0tIG5hbWUgTVVTVCBiZSBhbiBlbGVtZW50IGRlZmluZWQgaW4gZWxlbWVudHMueG1sIChhbHNvIG9ubHkgdXBwZXIgYW5kIGxvd2VyIGNhc2UgYWxwaGEgY2hhcnMpIC0tPgorICAgIDwhLS0gcmVnZXhwIE1VU1QgYmUgdmFsaWQgaW5wdXQgdG8gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZSgpIC0tPgorICAgIDxlbGVtZW50IG5hbWU9IklTQk4iIHJlZ2V4cD0iWzAtOV17MTB9Ii8+CisgICAgPGVsZW1lbnQgbmFtZT0iUGFnZSIgcmVnZXhwPSJbMC05XSoiLz4KKworICAgIDwhLS0gbmFtZSBNVVNUIGJlIGEgUHJvZHVjdFR5cGUgbmFtZSBkZWZpbmVkIGluIHByb2R1Y3QtdHlwZXMueG1sIC0tPgorICAgIDwhLS0gbWV0YWRhdGEgZWxlbWVudHMgaW5zaWRlIGJyYWNrZXRzIE1VU1QgYmUgbWFwcGVkIHRvIHRoZSBQcm9kdWN0VHlwZSwgYXMgZGVmaW5lZCBpbiBwcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sIC0tPgorICAgIDxwcm9kdWN0LXR5cGUgbmFtZT0iQm9vayIgdGVtcGxhdGU9ImJvb2stW0lTQk5dLnR4dCIvPgorICAgIDxwcm9kdWN0LXR5cGUgbmFtZT0iQm9va1BhZ2UiIHRlbXBsYXRlPSJwYWdlLVtQYWdlXS1bSVNCTl0udHh0Ii8+Cis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2R1Y3QtdHlwZS1wYXR0ZXJucy54bWwgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9kdWN0LXR5cGUtcGF0dGVybnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmQyNjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9kdWN0LXR5cGUtcGF0dGVybnMueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZz4KKyAgICA8IS0tIDxlbGVtZW50PiBNVVNUIGJlIGRlZmluZWQgYmVmb3JlIDxwcm9kdWN0LXR5cGU+IHNvIHRoZWlyIHBhdHRlcm5zIGNhbiBiZSByZXNvbHZlZCAtLT4KKyAgICA8IS0tIG5hbWUgTVVTVCBiZSBhbiBlbGVtZW50IGRlZmluZWQgaW4gZWxlbWVudHMueG1sIChhbHNvIG9ubHkgdXBwZXIgYW5kIGxvd2VyIGNhc2UgYWxwaGEgY2hhcnMpIC0tPgorICAgIDwhLS0gcmVnZXhwIE1VU1QgYmUgdmFsaWQgaW5wdXQgdG8gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZSgpIC0tPgorICAgIDxlbGVtZW50IG5hbWU9IklTQk4iIHJlZ2V4cD0iWzAtOV17MTB9Ii8+CisgICAgPGVsZW1lbnQgbmFtZT0iUGFnZSIgcmVnZXhwPSJbMC05XSoiLz4KKworICAgIDwhLS0gbmFtZSBNVVNUIGJlIGEgUHJvZHVjdFR5cGUgbmFtZSBkZWZpbmVkIGluIHByb2R1Y3QtdHlwZXMueG1sIC0tPgorICAgIDwhLS0gbWV0YWRhdGEgZWxlbWVudHMgaW5zaWRlIGJyYWNrZXRzIE1VU1QgYmUgbWFwcGVkIHRvIHRoZSBQcm9kdWN0VHlwZSwgYXMgZGVmaW5lZCBpbiBwcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sIC0tPgorICAgIDxwcm9kdWN0LXR5cGUgbmFtZT0iQm9vayIgdGVtcGxhdGU9ImJvb2stW0lTQk5dLnR4dCIvPgorICAgIDxwcm9kdWN0LXR5cGUgbmFtZT0iQm9va1BhZ2UiIHRlbXBsYXRlPSJwYWdlLVtJU0JOXS1bUGFnZV0udHh0Ii8+Cis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZW1ldC54bWwgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVtZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVtZXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6bWV0YWRhdGEgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisgPGtleXZhbD4KKyAgIDxrZXk+RmlsZW5hbWU8L2tleT4KKyAgIDx2YWw+dGVzdGZpbGUudHh0PC92YWw+CisgPC9rZXl2YWw+CisgPGtleXZhbD4KKyAgIDxrZXk+RmlsZUxvY2F0aW9uPC9rZXk+CisgICA8dmFsPltFWFRSQUNUX0ZJTEVfTE9DXTwvdmFsPgorIDwva2V5dmFsPgorIDxrZXl2YWw+CisgICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgICA8dmFsPkdlbmVyaWNGaWxlPC92YWw+CisgPC9rZXl2YWw+Cis8L2NhczptZXRhZGF0YT4KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RFeHRyYWN0b3IgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0RXh0cmFjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjNWFiMzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0RXh0cmFjdG9yCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCitleHBvcnQgUFJPRF9GSUxFPSQxCitleHBvcnQgTUVUX0ZJTEU9JDIKKworc2V0IFBST0RfRklMRQorc2V0IE1FVF9GSUxFCisKKyNlY2hvICJQV0QgSVMgJFBXRCBhbmQgQ1dEIGlzICRDV0QiCisjZWNobyAicHJvZHVjdCBmaWxlOiAkUFJPRF9GSUxFLCBtZXQgZmlsZTogJE1FVF9GSUxFIgorCitleHBvcnQgUFJPRF9ESVI9YGRpcm5hbWUgJFBST0RfRklMRWAKK3NldCBQUk9EX0RJUgorZXhwb3J0IE1FVF9ESVI9YGRpcm5hbWUgJE1FVF9GSUxFYAorc2V0IFBST0RfRElSCisKKworaWYgWyAkUFJPRF9ESVIgPSAkTUVUX0RJUiBdOyB0aGVuCisJIyBqdXN0IGNvcHkgdGhlIHNhbXBsZSBtZXRhZGF0YQorCWNwIDxURVNUX1NBTVBMRV9NRVRfUEFUSD4gJE1FVF9GSUxFCitmaQpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGZpbGUudHh0IGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTdiOGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0ZmlsZS50eHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyBhIHRlc3QgZmlsZS4KZGlmZiAtLWdpdCBhLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RmaWxlMi50eHQgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0ZmlsZTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTdiOGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0ZmlsZTIudHh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgYSB0ZXN0IGZpbGUuCmRpZmYgLS1naXQgYS8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0ZmlsZTIudHh0Lm1ldCBiLzAuMTAvbWV0YWRhdGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RmaWxlMi50eHQubWV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTAwOWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0ZmlsZTIudHh0Lm1ldApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBGSVhNRTogY2hhbmdlIG5hbWVzcGFjZSBVUkk/IC0tPgorPGNhczptZXRhZGF0YSB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyA8a2V5dmFsPgorICAgPGtleT5GaWxlbmFtZTwva2V5PgorICAgPHZhbD50ZXN0ZmlsZS50eHQ8L3ZhbD4KKyA8L2tleXZhbD4KKyA8a2V5dmFsPgorICAgPGtleT5GaWxlTG9jYXRpb248L2tleT4KKyAgIDx2YWw+W0VYVFJBQ1RfRklMRV9MT0NdPC92YWw+CisgPC9rZXl2YWw+CisgPGtleXZhbD4KKyAgIDxrZXk+UHJvZHVjdFR5cGU8L2tleT4KKyAgIDx2YWw+R2VuZXJpY0ZpbGU8L3ZhbD4KKyA8L2tleXZhbD4KKzwvY2FzOm1ldGFkYXRhPgpkaWZmIC0tZ2l0IGEvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvdGlrYS1taW1ldHlwZXMueG1sIGIvMC4xMC9tZXRhZGF0YS9zcmMvdGVzdC9yZXNvdXJjZXMvdGlrYS1taW1ldHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzViNWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL21ldGFkYXRhL3NyYy90ZXN0L3Jlc291cmNlcy90aWthLW1pbWV0eXBlcy54bWwKQEAgLTAsMCArMSw1OTI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgIERlc2NyaXB0aW9uOiBUaGlzIHhtbCBmaWxlIGRlZmluZXMgdGhlIHZhbGlkIG1pbWUgdHlwZXMgdXNlZCBieSBUaWthLgorICBUaGUgbWltZSB0eXBlIGRhdGEgd2l0aGluIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMKKyAgc291cmNlcyBsaWtlIEFwYWNoZSBOdXRjaCwgQXBhY2hlIEhUVFAgU2VydmVyLCB0aGUgZmlsZSgxKSBjb21tYW5kLCBldGMuCisKKyAgTm90ZXM6CisgICAqIFRpa2Egc3VwcG9ydHMgYSB3aWRlciByYW5nZSBvZiBtYXRjaCB0eXBlcyB0aGFuIEZyZWVkZXNrdG9wIGRvZXMKKyAgICogR2xvYiBwYXR0ZXJucyBtdXN0IGJlIHVuaXF1ZSwgaWYgdGhlcmUncyBhIGNsYXNoIGFzc2lnbiB0byB0aGUgbW9zdAorICAgICBwb3B1bGFyIGZvcm1hdAorICAgKiBUaGUgbWFpbiBtaW1lIHR5cGUgc2hvdWxkIGJlIHRoZSBjYW5vbmljYWwgb25lLCB1c2UgYWxpYXNlcyBmb3IgYW55CisgICAgIG90aGVyIHdpZGVseSB1c2VkIGZvcm1zCisgICAqIFdoZXJlIHRoZXJlJ3MgYSBoaWVyYXJjaHkgaW4gdGhlIHR5cGVzLCBsaXN0IGl0IHZpYSBhIHBhcmVudAorICAgKiBIaWdobHkgc3BlY2lmaWMgbWFnaWMgbWF0Y2hlcyBnZXQgYSBoaWdoIHByaW9yaXR5CisgICAqIEdlbmVyYWwgbWFnaWMgbWF0Y2hlcyB3aGljaCBjb3VsZCB0cmlnZ2VyIGEgZmFsc2UtcG9zaXRpdmUgbmVlZAorICAgICBhIGxvdyBvbmUKKyAgICogVGhlIHByaW9yaXR5IGZvciBjb250YWluZXJzIG5vcm1hbGx5IG5lZWQgdG8gYmUgaGlnaGVyIHRoYW4gZm9yCisgICAgIHRoZSB0aGluZ3MgdGhleSBjb250YWluLCBzbyB0aGV5IGRvbid0IGFjY2lkZW50bHkgZ2V0IGRldGVjdGVkCisgICAgIGFzIHdoYXQncyBpbiB0aGVtCisgICAqIEZvciBsb2dpYyB0b28gY29tcGxleCB0byBiZSBleHByZXNzZWQgaW4gYSBtYWdpYyBtYXRjaCwgZG8gdGhlIGJlc3QKKyAgICAgeW91IGNhbiBoZXJlLCB0aGVuIHByb3ZpZGUgYSBDdXN0b20gRGV0ZWN0b3IgZm9yIHRoZSByZXN0CistLT4KKzxtaW1lLWluZm8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRlc3QvZXhhbXBsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGVzdGV4YW1wbGUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FjdGl2ZW1lc3NhZ2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FuZHJldy1pbnNldCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FwcGxlZmlsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXBwbGl4d2FyZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJmZWVkIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIyIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJmZWVkIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b20iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYXRvbWNhdCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b21jYXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b21pY21haWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b21zdmMreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hdG9tc3ZjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdXRoLXBvbGljeSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2JhdGNoLXNtdHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2JlZXAreG1sIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2JpemFnaS1tb2RlbGVyIj4KKyAgICAgICAgPF9jb21tZW50PkJpekFnaSBQcm9jZXNzIE1vZGVsZXI8L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJwbSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jYWxzLTE4NDAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NjeG1sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2N4bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NlYS0yMDE4K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY2VsbG1sK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY25ycCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY29uZmVyZW5jZS1pbmZvK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3BsK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3N0YSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NzdGFkYXRhK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3Utc2VlbWUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN1Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jeWJlcmNhc2giLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2Rhdm1vdW50K3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGF2bW91bnQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RjYS1yZnQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RlYy1keCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGlhbG9nLWluZm8reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaWNvbSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgICAgIDxfY29tbWVudD5EYXJ3aW4gSW5mb3JtYXRpb24gVHlwaW5nIEFyY2hpdGVjdHVyZTwvX2NvbW1lbnQ+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sO2Zvcm1hdD1tYXAiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sIi8+CisgICAgICAgIDxfY29tbWVudD5ESVRBIE1hcDwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9Im1hcCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJtYXAiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbmFtZXNwYWNlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGl0YW1hcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGl0YSt4bWw7Zm9ybWF0PXRvcGljIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbCIvPgorICAgICAgICA8X2NvbW1lbnQ+RElUQSBUb3BpYzwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InRvcGljIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InRvcGljIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25hbWVzcGFjZSIvPgorICAgICAgICA8IS0tIFRvcGljIGlzIHRoZSBkZWZhdWx0LCBUYXNrIGFuZCBDb25jZXB0IGFyZSBzcGVjaWFsaXNhdGlvbnMgLS0+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGl0YSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGl0YSt4bWw7Zm9ybWF0PXRhc2siPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL2RpdGEreG1sO2Zvcm1hdD10YXNrIi8+CisgICAgICAgIDxfY29tbWVudD5ESVRBIFRhc2sgVG9waWM8L19jb21tZW50PgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJ0YXNrIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InRhc2siIG5hbWVzcGFjZVVSST0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbmFtZXNwYWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbDtmb3JtYXQ9Y29uY2VwdCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vZGl0YSt4bWw7Zm9ybWF0PXRvcGljIi8+CisgICAgICAgIDxfY29tbWVudD5ESVRBIENvbmNlcHQgVG9waWM8L19jb21tZW50PgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJjb25jZXB0Ii8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImNvbmNlcHQiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbmFtZXNwYWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbDtmb3JtYXQ9dmFsIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9kaXRhK3htbCIvPgorICAgICAgICA8X2NvbW1lbnQ+RElUQSBDb25kaXRpb25hbCBQcm9jZXNzaW5nIFByb2ZpbGU8L19jb21tZW50PgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJ2YWwiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0idmFsIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25hbWVzcGFjZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpdGF2YWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZG5zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kdmNzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lY21hIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGktY29uc2VudCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZWRpLXgxMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZWRpZmFjdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZW1tYSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtbWEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VwcCt4bWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXB1Yit6aXAiPgorICAgICAgICA8YWNyb255bT5FUFVCPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RWxlY3Ryb25pYyBQdWJsaWNhdGlvbjwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQS1wwMDNcMDA0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL2VwdWIremlwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZXB1YiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lc2hvcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXhhbXBsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZmFzdGluZm9zZXQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2Zhc3Rzb2FwIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ZpdHMiPgorICAgICAgICA8YWNyb255bT5GSVRTPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RmxleGlibGUgSW1hZ2UgVHJhbnNwb3J0IFN5c3RlbTwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL3d3dy5kaWdpdGFscHJlc2VydmF0aW9uLmdvdi9mb3JtYXRzL2ZkZC9mZGQwMDAzMTcuc2h0bWw8L3Rpa2E6bGluaz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlNJTVBMRSAgPSAgICAgICAgICAgICAgICAgICAgVCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maXRzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZml0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnRzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ZvbnQtdGRwZnIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaDIyNCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaHR0cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaHlwZXJzdHVkaW8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ayIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWJlLWtleS1yZXF1ZXN0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWJlLXBrZy1yZXBseSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2liZS1wcC1kYXRhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pZ2VzIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lsbHVzdHJhdG9yIj4KKyAgICAgICAgPGFjcm9ueW0+QUk8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5BZG9iZSBJbGx1c3RyYXRvciBBcnR3b3JrPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Fkb2JlX0lsbHVzdHJhdG9yX0FydHdvcms8L3Rpa2E6bGluaz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5haSIvPl0KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ltLWlzY29tcG9zaW5nK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4LmNtZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgub2JqIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleC5yZXNwb25zZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgudm5kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pb3RwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pcHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lzdXAiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YS1hcmNoaXZlIj4KKyAgICAgICAgPF9jb21tZW50PkphdmEgQXJjaGl2ZTwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uamFyPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20uc3VuLmphdmEtYXJjaGl2ZTwvdGlrYTp1dGk+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vemlwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouamFyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vamF2YS1hcmNoaXZlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXBrIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtamF2YS1lbnRlcnByaXNlLWFyY2hpdmUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVhciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLWphdmEtd2ViLWFyY2hpdmUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndhciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtdW5peC1kdW1wIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgICAgICA8X2NvbW1lbnQ+SmF2YVNjcmlwdCBTb3VyY2UgQ29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vanNvbiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpzb24iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YS12bSI+CisgICAgICAgIDxfY29tbWVudD5KYXZhIENsYXNzIEZpbGU8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1qYXZhLXZtIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWphdmEiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4Y2FmZWJhYmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsYXNzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YS1qbmlsaWIiPgorICAgICAgICA8X2NvbW1lbnQ+SmF2YSBOYXRpdmUgTGlicmFyeSBmb3IgT1NYPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4Y2FmZWJhYmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmVlZGZhY2UiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0MDk2Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZlZWRmYWNmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNDA5NiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjZWZhZWRmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQwOTYiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4Y2ZmYWVkZmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0MDk2Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpuaWxpYiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9rcG1sLXJlcXVlc3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9rcG1sLXJlc3BvbnNlK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbG9zdCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxvc3R4bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL21hYy1iaW5oZXgiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2JpbmhleCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0ibXVzdFwgYmVcIGNvbnZlcnRlZFwgd2l0aFwgQmluSGV4IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTEiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ocXgiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNwdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYWN3cml0ZWlpIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYXJjIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5iIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hdGhtbCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hdGhtbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1hc3NvY2lhdGVkLXByb2NlZHVyZS1kZXNjcmlwdGlvbit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtZGVyZWdpc3Rlcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtZW52ZWxvcGUreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLW1zayt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtbXNrLXJlc3BvbnNlK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1wcm90ZWN0aW9uLWRlc2NyaXB0aW9uK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWNlcHRpb24tcmVwb3J0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWdpc3Rlcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtcmVnaXN0ZXItcmVzcG9uc2UreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXVzZXItc2VydmljZS1kZXNjcmlwdGlvbit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ib3giPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYm94Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tZWRpYV9jb250cm9sK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWVkaWFzZXJ2ZXJjb250cm9sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNjbWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21pa2V5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3NzLWtleXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21vc3Mtc2lnbmF0dXJlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3Nza2V5LWRhdGEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21vc3NrZXktcmVxdWVzdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXA0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcDRzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcGVnNC1nZW5lcmljIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcGVnNC1pb2QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21wZWc0LWlvZC14bXQiLz4KKworICAgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi9tc3dvcmQgLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tc3dvcmQiPgorICAgICAgICA8IS0tIFVzZSBEZWZhdWx0RGV0ZWN0b3IgLyBvcmcuYXBhY2hlLnRpa2EucGFyc2VyLm1pY3Jvc29mdC5QT0lGU0NvbnRhaW5lckRldGVjdG9yIGZvciBtb3JlIHJlbGlhYmxlIGRldGVjdGlvbiBvZiBPTEUyIGRvY3VtZW50cyAtLT4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkIi8+CisgICAgICAgIDxfY29tbWVudD5NaWNyb3NvZnQgV29yZCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZG9jPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20ubWljcm9zb2Z0LndvcmQuZG9jPC90aWthOnV0aT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1pY3Jvc29mdFwgV29yZFwgNi4wXCBEb2N1bWVudCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRG9jdW1lbnRvXCBNaWNyb3NvZnRcIFdvcmRcIDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDgwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1TV29yZERvYyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgzMWJlMDAwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQT15RYCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDM3NlwwNjdcMFwwNDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwzMzNcMjQ1LVwwXDBcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDIyNFwyNDZcMDU2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iV1x4MDBvXHgwMHJceDAwZFx4MDBEXHgwMG9ceDAwY1x4MDB1XHgwMG1ceDAwZVx4MDBuXHgwMHQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMTUyOjQwOTYiIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvdCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tc3dvcmQyIj4KKyAgICAgICAgPCEtLSBQcmUtT0xFMiwgbm90IGEgc3VidHlwZSBvZiBhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UgLS0+CisgICAgICAgIDxfY29tbWVudD5NaWNyb3NvZnQgV29yZCAyIERvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4OWJhNSIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGRiYTUiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21zd29yZDUiPgorICAgICAgICA8IS0tIFByZS1PTEUyLCBub3QgYSBzdWJ0eXBlIG9mIGFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSAtLT4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBXb3JkIDUgRG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZTM3IiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL214ZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXhmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uYXNkYXRhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uZXdzLWNoZWNrZ3JvdXBzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uZXdzLWdyb3VwaW5mbyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbmV3cy10cmFuc21pc3Npb24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25zcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2NzcC1yZXF1ZXN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vY3NwLXJlc3BvbnNlIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjXCBUaGlzXCBpc1wgYVwgc2hlbGxcIGFyY2hpdmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMDM3XDAzNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMDE3NDM3IiB0eXBlPSJob3N0MTYiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDFmZmYiIHR5cGU9Imhvc3QxNiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwzNzdcMDM3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIwMTQ1NDA1IiB0eXBlPSJob3N0MTYiIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJpbiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRtcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxoYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxyZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmx6aCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNvIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGlzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRpc3R6Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGtnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYnBrIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHVtcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVsYyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlcGxveSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vZGEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9wZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1vZ2ciLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2d4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9rYXRlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb25lbm90ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub25ldG9jIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub25ldG9jMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXRtcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXBrZyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGFyaXR5ZmVjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wYXRjaC1vcHMtZXJyb3IreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54ZXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGRmIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtcGRmIi8+CisgICAgICAgIDxhY3JvbnltPlBERjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlBvcnRhYmxlIERvY3VtZW50IEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QREY8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vd3d3LmFkb2JlLmNvbS9kZXZuZXQvcGRmL3BkZl9yZWZlcmVuY2VfYXJjaGl2ZS5odG1sPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20uYWRvYmUucGRmPC90aWthOnV0aT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiVQREYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBkZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3BncCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBncCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3Ata2V5cyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hc2MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaWciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGljcy1ydWxlcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHJmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWRmK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGlkZi1kaWZmK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtjczEwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wMTAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtjczctbWltZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucDdtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucDdjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucDdzIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItLS0tLUJFR0lOIFBLQ1M3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDMwODJGRkZGMDYwOTJhODY0ODg2ZjcwZDAxMDdGRmEwIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGMDBGRiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MzA4MDA2MDkyYTg2NDg4NmY3MGQwMTA3RkZhMCIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDBGRiIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BraXgtY2VydCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2VyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4LWNybCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3JsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4LXBraXBhdGgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBraXBhdGgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BraXhjbXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBraSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGxzK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGxzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wb2Mtc2V0dGluZ3MreG1sIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiPgorICAgICAgICA8X2NvbW1lbnQ+UG9zdFNjcmlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIlISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwwMDQlISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFdpbmRvd3MgZm9ybWF0IEVQUyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjNWQwZDNjNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwc2YiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lcHNpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bycy5hbHZlc3RyYW5kLnRpdHJheC1zaGVldCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcHJzLmN3dyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3d3Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMubnByZW5kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMucGx1Y2tlciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcXNpZyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZGYreG1sIj4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iUkRGIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlJERiIgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgICAgIDxhY3JvbnltPlJERi9YTUw8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5YTUwgc3ludGF4IGZvciBSREYgZ3JhcGhzPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yZGYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vd2wiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iXnJkZiQiIGlzcmVnZXg9InRydWUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iXm93bCQiIGlzcmVnZXg9InRydWUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVnaW5mbyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJpZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXgiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ybmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ybCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMtZGlmZit4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJsZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmlzY29zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ybG1pK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmxzLXNlcnZpY2VzK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JzZCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJzZCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQvcnNzIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InJzcyIvPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vcHVybC5vcmcvcnNzLzEuMC8iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yc3MiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnRmIj4KKyAgICAgICAgPF9jb21tZW50PlJpY2ggVGV4dCBGb3JtYXQgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3J0ZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0ie1xccnRmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ0ZiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnR4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zYW1sYXNzZXJ0aW9uK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2FtbG1ldGFkYXRhK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2JtbCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNibWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtY3YtcmVxdWVzdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2NxIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlc3BvbnNlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zY3MiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVxdWVzdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3BxIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlc3BvbnNlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NkcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2RwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2V0LXBheW1lbnQtaW5pdGlhdGlvbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2V0cGF5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNldHJlZyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2dtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2dtbC1vcGVuLWNhdGFsb2ciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NoZit4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNoZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2lldmUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZS1maWx0ZXIreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaW1wbGUtbWVzc2FnZS1zdW1tYXJ5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaW1wbGVzeW1ib2xjb250YWluZXIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NsYXRlIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NtaWwreG1sIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3NtaWwiLz4KKyAgICAgICAgPF9jb21tZW50PlNNSUwgTXVsdGltZWRpYTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc21pIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc21pbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNtbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zbGR3b3JrcyI+CisgICAgICAgIDxfY29tbWVudD5Tb2xpZFdvcmtzIENBRCBwcm9ncmFtPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbGRwcnQiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2xkYXNtIiAvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNsZGRydyIgLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3J4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcGlyaXRzLWV2ZW50K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3JncyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3JhbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3Jncyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdyeG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zc21sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3NtbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdGltZXN0YW1wLXF1ZXJ5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi90aW1lc3RhbXAtcmVwbHkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3R2ZS10cmlnZ2VyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi91bHBmZWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZlbW1pIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92aXZpZGVuY2Uuc2NyaXB0ZmlsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAuYnNmK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LWxhcmdlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbGIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1zbWFsbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHNiIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctdmFyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wdmIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnNtcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLmJjbWNzaW5mbyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwMi5zbXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwMi50Y2FwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50Y2FwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3RlcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHduIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5hc28iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzbyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuaW1wIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pbXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWN1Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWN1Y29ycCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXRjIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWN1dGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5haXItYXBwbGljYXRpb24taW5zdGFsbGVyLXBhY2thZ2UremlwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5haXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5hZnRlcmVmZmVjdHMucHJvamVjdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWVwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLnRlbXBsYXRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZHAreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54ZHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54ZmRmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWV0aGVyLmltcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFpcnppcC5maWxlc2VjdXJlLmF6ZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXpmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5henMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2siPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6dyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFtZXJpY2FuZHluYW1pY3MuYWNjIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hY2MiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbWlnYS5hbWkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFtaSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1jZXJ0aWZpY2F0ZS1pc3N1ZS1pbml0aWF0aW9uIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jaWkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItZnVuZHMtdHJhbnNmZXItaW5pdGlhdGlvbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnRpIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW50aXguZ2FtZS1jb21wb25lbnQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0eCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wa2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLml3b3JrIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5rZXlub3RlIj4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icHJlc2VudGF0aW9uIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL25hbWVzcGFjZXMva2V5bm90ZTIiIC8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLml3b3JrIiAvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtleSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLnBhZ2VzIj4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZG9jdW1lbnQiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9zbCIgLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaXdvcmsiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGFnZXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5udW1iZXJzIj4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZG9jdW1lbnQiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9scyIgLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaXdvcmsiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubnVtYmVycyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLWl3b3Jrcy1wcm90ZWN0ZWQiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pd29yayIgLz4KKyAgICAgICAgPF9jb21tZW50PlBhc3N3b3JkIFByb3RlY3RlZCBpV29ya3MgRmlsZTwvX2NvbW1lbnQ+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcmFzdHJhLnN3aSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3dpIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXVkaW9ncmFwaCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmF1dG9wYWNrYWdlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXZpc3Rhcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ibHVlaWNlLm11bHRpcGFzcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYmx1ZXRvb3RoLmVwLm9vYiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmJtaSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYm1pIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yZXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jYWItanNjcmlwdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNhbm9uLWNwZGwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jYW5vbi1saXBzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2VuZGlvLnRoaW5saW5jLmNsaWVudGNvbmYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jaGVtZHJhdyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2hpcG51dHMua2FyYW9rZS1tbWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNpcnBhY2suaXNkbi1leHQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jbGF5bW9yZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xhIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2xvbmsuYzRncm91cCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYzRnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYzRkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYzRmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYzRwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYzR1Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29tbWVyY2UtYmF0dGVsbGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3NwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZGJjbXNnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29zbW9jYWxsZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3giLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbGtrIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci5wYWxldHRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbGtwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci50ZW1wbGF0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xrdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIud29yZGJhbmsiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3ciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcml0aWNhbHRvb2xzLndicyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndicyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN0Yy1wb3NtbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3RjdC53cyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBkZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcG9zdHNjcmlwdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcHBkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcGQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXJhc3RlciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcmF3Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3VybC5jYXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNhciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cmwucGN1cmwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjdXJsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3liYW5rIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yZHoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kZW5vdm8uZmNzZWxheW91dC1saW5rIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mZV9sYXVuY2giLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kaXItYmkucGxhdGUtZGwtbm9zdWZmaXgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kbmEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRuYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1scCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWxwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZG9sYnkubW9iaWxlLjEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRwZ3JhcGgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRwZyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRyZWFtZmFjdG9yeSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGZhYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5lc2djb250YWluZXIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2RmdG5vdGlmYWNjZXNzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmlwZGNlc2dhY2Nlc3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY3JvYW1pbmciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXB0di5hbGZlYy1iYXNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmlwdHYuYWxmZWMtZW5oYW5jZW1lbnQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtYWdncmVnYXRlLXJvb3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWNvbnRhaW5lcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtZ2VuZXJpYyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtbXNnbGlzdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtcmVnaXN0cmF0aW9uLXJlcXVlc3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWlhLXJlZ2lzdHJhdGlvbi1yZXNwb25zZSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaW5pdCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5keHIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5keW5hZ2VvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nZW8iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY2Rpcy11cGRhdGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uY2hhcnQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hZyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxlcmVxdWVzdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxldXBkYXRlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXNyZXF1ZXN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3VwZGF0ZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVtY2xpZW50LmFjY2Vzc3JlcXVlc3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZW5saXZlbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioubm1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lc2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2YiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLnF1aWNrYW5pbWUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFhbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNsdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3NmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXJpY3Nzb24ucXVpY2tjYWxsIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXN6aWdubzMreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lczMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ldDMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmFvYyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmN1Zyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZjb21tYW5kK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmRpc2NvdmVyeSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZwcm9maWxlK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1iYyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtY29kK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1ucHZyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnVlcHJvZmlsZSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm1jaWQreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5zY2kreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5zaW1zZXJ2cyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldWRvcmEuZGF0YSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV6cGl4LWFsYnVtIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lejIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1wYWNrYWdlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lejMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mLXNlY3VyZS5tb2JpbGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZGYiPgorICAgICAgICA8YWNyb255bT5GREY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5Gb3JtcyBEYXRhIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Gb3Jtc19EYXRhX0Zvcm1hdDwvdGlrYTpsaW5rPgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly93d3cuYWRvYmUuY29tL2Rldm5ldC9hY3JvYmF0L2ZkZnRvb2xraXQuaHRtbDwvdGlrYTpsaW5rPgorICAgICAgICA8dGlrYTp1dGk+Y29tLmFkb2JlLmZkZjwvdGlrYTp1dGk+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIlRkRGLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmRmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRzbi5tc2VlZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNlZWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZHNuLnNlZWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlZWQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kYXRhbGVzcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZmc25zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmludHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mbG9ncmFwaGl0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ncGgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mbHV4dGltZS5jbGlwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mb250LWZvbnRmb3JnZS1zZmQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mcmFtZW1ha2VyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZyYW1lIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWFrZXIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ib29rIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5mbmMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZuYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZyb2dhbnMubHRmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sdGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mc2Mud2VibGF1bmNoIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mc2MiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vYXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2EyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9hMyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNncCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmc1Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c3BycyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYmgyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmFydC1leCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5hcnQ0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmhicGwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kZGQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZG9jdXdvcmtzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54ZHciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZG9jdXdvcmtzLmJpbmRlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGJkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnV0LW1pc25ldCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1enp5c2hlZXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ6cyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlbm9tYXRpeC50dXhlZG8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR4ZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdnYiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLnRvb2wiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdndCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlb21ldHJ5LWV4cGxvcmVyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nZXgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ncmUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nbXgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdteCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmttbCt4bWwiPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJrbWwiLz4KKyAgICAgICAgPHJvb3QtWE1MIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9rbWwvMi4yIiBsb2NhbE5hbWU9ImttbCIvPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi4wIiBsb2NhbE5hbWU9ImttbCIvPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi4xIiBsb2NhbE5hbWU9ImttbCIvPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi4yIiBsb2NhbE5hbWU9ImttbCIvPgorICAgICAgICA8YWNyb255bT5LTUw8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5LZXlob2xlIE1hcmt1cCBMYW5ndWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioua21sIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua216Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rbXoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncmFmZXEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdxZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdxcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyaWRtcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nYWMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaGVscCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ2hmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWlkZW50aXR5LW1lc3NhZ2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdpbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1pbmplY3RvciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3J2Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtbWVzc2FnZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3RtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtdGVtcGxhdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRwbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudmNnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGFuZGhlbGQtZW50ZXJ0YWlubWVudCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnptbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhiY2kiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhiY2kiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oY2wtYmlyZXBvcnRzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGhlLmxlc3Nvbi1wbGF5ZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxlcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWhwZ2wiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwZ2wiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ocGlkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtaHBzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ocHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1qbHl0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qbHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2wiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLXBjbHhsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wY2x4bCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmh0dHBob25lIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHlkcm9zdGF0aXguc29mLWRhdGEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNmZC1oZHN0eCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmh6bi0zZC1jcm9zc3dvcmQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLngzZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5hZnBsaW5lZGF0YSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5lbGVjdHJvbmljLW1lZGlhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLm1pbmlwYXkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1weSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5tb2RjYXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFmcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3RhZnAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5saXN0MzgyMCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5yaWdodHMtbWFuYWdlbWVudCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaXJtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLnNlY3VyZS1jb250YWluZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWNjcHJvZmlsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWNjIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWNtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWdsb2FkZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlnbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2cCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaXZwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZ1Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pdnUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbmZvcm1lZGNvbnRyb2wucm1zK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmluZm9ybWl4LXZpc2lvbmFyeSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludGVyY29uLmZvcm1uZXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwdyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhweCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludGVydHJ1c3QuZGlnaWJveCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludGVydHJ1c3Qubm5jcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludHUucWJvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5xYm8iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFmeCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucWZ4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5jb25jZXB0aXRlbSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmtub3dsZWRnZWl0ZW0reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5uZXdzaXRlbSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLnBhY2thZ2VpdGVtK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlwdW5wbHVnZ2VkLnJjcHJvZmlsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmNwcm9maWxlIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXJlcG9zaXRvcnkucGFja2FnZSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlycCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlzLXhwciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHByIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFtIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qYW0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1kaXJlY3Rvcnktc2VydmljZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXBheW1lbnQtd2FrZXVwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uLXdha2V1cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXNldHN0b3JlLXdha2V1cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qY3AuamF2YW1lLm1pZGxldC1ybXMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmppc3AiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmppc3AiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qb29zdC5qb2RhLWFyY2hpdmUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpvZGEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rYWhvb3R6Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rdHoiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rdHIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua2FyYm9uIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rYXJib24iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rY2hhcnQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1rY2hhcnQiLz4KKyAgICAgICAgPF9jb21tZW50PktDaGFydCBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jaHJ0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua2Zvcm11bGEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtmbyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtpdmlvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbHciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rb250b3VyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rb24iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rcHJlc2VudGVyIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gta3ByZXNlbnRlciIvPgorICAgICAgICA8X2NvbW1lbnQ+S1ByZXNlbnRlciBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rcHIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rcHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rc3ByZWFkIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gta3NwcmVhZCIvPgorICAgICAgICA8X2NvbW1lbnQ+S1NwcmVhZCBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rc3AiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rd29yZCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWt3b3JkIi8+CisgICAgICAgIDxfY29tbWVudD5LV29yZCBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rd2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rd3QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtlbmFtZWFhcHAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh0a2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5raWRzcGlyYXRpb24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtpYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtpbmFyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rbmUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rbnAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rb2FuIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gta29hbiIvPgorICAgICAgICA8X2NvbW1lbnQ+U1NFWU8gS29hbiBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5za3AiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5za2QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5za3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5za20iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rb2Rhay1kZXNjcmlwdG9yIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zc2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5saWJlcnR5LXJlcXVlc3QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZGVza3RvcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGJkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZXhjaGFuZ2UreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sYmUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy0xLTItMyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouMTIzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFwciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLWZyZWVsYW5jZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHJlIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtbm90ZXMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5zZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3JnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1zY3JlZW5jYW0iPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49Iiouc2NtIi8+IC0gY29uZmxpY3RzIHdpdGggdGV4dC94LXNjaGVtZSAtLT4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLXdvcmRwcm8iPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iV29yZFByb1wwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iV29yZFByb1xyXDM3MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubHdwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYWNwb3J0cy5wb3J0cGtnIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wb3J0cGtnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5hY3Rpb250b2tlbit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmNvbmZ0b2tlbit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmxpY2Vuc2UreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5tZGNmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWNkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tY2QiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZWRjYWxjZGF0YSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWMxIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWVkaWFzdGF0aW9uLmNka2V5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZGtleSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1lcmlkaWFuLXNsaW5nc2hvdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1mZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm13ZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1mbXAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1mbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguZmxvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbG8iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taWNyb2dyYWZ4LmlneCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWd4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taWYiPgorICAgICAgICA8X2NvbW1lbnQ+RnJhbWVNYWtlciBJbnRlcmNoYW5nZSBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1taWYiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtZnJhbWUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXJGaWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNSUZGaWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlckRpY3Rpb25hcnkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01ha2VyU2NyZWVuRm9udCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TU1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtCb29rIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlciIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4M2NceDRkXHg0OVx4NDZceDQ2XHg2OVx4NmNceDY1XHgyMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWlmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taW5kamV0Lm1pbmRtYW5hZ2VyIj4KKyAgICAgICAgPF9jb21tZW50Pk1pbmRNYW5hZ2VyPC9fY29tbWVudD4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbWFwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW1wdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tYXQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbW1wIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW1hcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWluaXNvZnQtaHAzMDAwLXNhdmUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5taXRzdWJpc2hpLm1pc3R5LWd1YXJkLnRydXN0d2ViIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLmRhZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGFmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLmRpcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGlzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1iayI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWJrIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1xeSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXF5Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1zbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLnBsYyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGxjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLnR4ZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHhmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9waHVuLmFwcGxpY2F0aW9uIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcG4iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5hZHNpIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmZpcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5nb3RhcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5rbXIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUudHRjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLndlbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmlwcm0iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3ppbGxhLnh1bCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh1bCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWFydGdhbHJ5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jaWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1hc2YiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1jYWItY29tcHJlc3NlZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2FiIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8IS0tIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIC0tPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIj4KKyAgICAgICAgPCEtLSBVc2UgRGVmYXVsdERldGVjdG9yIC8gb3JnLmFwYWNoZS50aWthLnBhcnNlci5taWNyb3NvZnQuUE9JRlNDb250YWluZXJEZXRlY3RvciBmb3IgbW9yZSByZWxpYWJsZSBkZXRlY3Rpb24gb2YgT0xFMiBkb2N1bWVudHMgLS0+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tc2V4Y2VsIiAvPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IEV4Y2VsIFNwcmVhZHNoZWV0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1pY3Jvc29mdFwgRXhjZWxcIDUuMFwgV29ya3NoZWV0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGb2dsaW9cIGRpXCBsYXZvcm9cIE1pY3Jvc29mdFwgRXhjZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQmlmZjUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMTE0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkJpZmY1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjEyMSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceDA5XHgwNFx4MDZceDAwXHgwMFx4MDBceDEwXHgwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IldceDAwb1x4MDByXHgwMGtceDAwYlx4MDBvXHgwMG9ceDAwayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxjIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGx0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGx3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxkIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFdvcmtib29rIEFkZC1pbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsYW0iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMiI+CisgICAgICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHNtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBFeGNlbCAyMDA3IEJpbmFyeSBTcHJlYWRzaGVldDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxzYiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZW90Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtaHRtbGhlbHAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNobSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iSVRTRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1pbXMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmltcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWxybSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubHJtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rIj4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBPdXRsb29rIE1lc3NhZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZyIgLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2stcHN0Ij4KKyAgICAgICAgPF9jb21tZW50Pk91dGxvb2sgUGVyc29uYWwgRm9sZGVycyBGaWxlIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIhQkROLi4uLlNNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRiIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9zdCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnNlY2NhdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2F0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3RsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcGxheXJlYWR5LmluaXRpYXRvcit4bWwiLz4KKworICAgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCAtLT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50Ij4KKyAgICAgICAgPCEtLSBVc2UgRGVmYXVsdERldGVjdG9yIC8gb3JnLmFwYWNoZS50aWthLnBhcnNlci5taWNyb3NvZnQuUE9JRlNDb250YWluZXJEZXRlY3RvciBmb3IgbW9yZSByZWxpYWJsZSBkZXRlY3Rpb24gb2YgT0xFMiBkb2N1bWVudHMgLS0+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tc3Bvd2VycG9pbnQiLz4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBQb3dlcnBvaW50IFByZXNlbnRhdGlvbjwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUFx4MDBvXHgwMHdceDAwZVx4MDByXHgwMFBceDAwb1x4MDBpXHgwMG5ceDAwdFx4MDAgRFx4MDBvXHgwMGNceDAwdVx4MDBtXHgwMGVceDAwblx4MDB0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcHoiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wb3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcGEiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuYWRkaW4ubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gQWRkLWluIChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHBhbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcHRtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2xkbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5zbGlkZXNob3cubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gU2xpZGVzaG93IChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHBzbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvdG0iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXByb2plY3QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wdCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXByb2plY3QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1weCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTVBYLE1pY3Jvc29mdCBQcm9qZWN0IGZvciBXaW5kb3dzLCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy10bmVmIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL21zLXRuZWYiIC8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDIyM2U5Zjc4IiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubGljLWNobGctcmVxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubGljLXJlc3AiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5tZXRlci1jaGxnLXJlcSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLm1ldGVyLXJlc3AiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudCAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvY20iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmQudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudCBUZW1wbGF0ZSAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvdG0iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNXHgwMGFceDAwdFx4MDBPXHgwMFNceDAwVCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3BzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2tzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2NtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2RiIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13cGwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndwbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL294cHMiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW4gWE1MIFBhcGVyIFNwZWNpZmljYXRpb248L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm94cHMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tc2VxIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tc2VxIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXNpZ24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdWx0aWFkLmNyZWF0b3IiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdWx0aWFkLmNyZWF0b3IuY2lmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXVzaWMtbmlmZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11c2ljaWFuIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tdXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdXZlZS5zdHlsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXN0eSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5jZC5jb250cm9sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmNkLnJlZmVyZW5jZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5lcnZhbmEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uZXRmcHgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioubmx1Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtZGlyZWN0b3J5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ubmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1zZWFsZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5ucyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXdlYiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioubm53Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuY2F0YWxvZ3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jb25tbCt3YnhtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmlzZHMtcmFkaW8tcHJlc2V0cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmlwdHYuY29uZmlnK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmxhbmRtYXJrK3dieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmsreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmtjb2xsZWN0aW9uK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5hYyt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2UuZGF0YSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubmdkYXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2Uuc3ltYmlhbi5pbnN0YWxsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5uLWdhZ2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uY2QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5wY2Qrd2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5wY2QreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ycHN0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0cyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnBzcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkbSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWRtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWR4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lZHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5leHQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4dCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gT3BlbiBEb2N1bWVudCBGb3JtYXQgZm9yIE9mZmljZSBBcHBsaWNhdGlvbnMgKE9wZW5Eb2N1bWVudCkgdjEuMCAgICAtLT4KKyAgICA8IS0tIGh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvc3BlY3MvaW5kZXgucGhwI29wZW5kb2N1bWVudHYxLjAgICAgICAgICAgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IENoYXJ0IGRvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2RjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGUiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlIi8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogQ2hhcnQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90YyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZGIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIi8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogRm9ybXVsYSBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEiIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kZiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3ppcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBGb3JtdWxhIGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kZnQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHcmFwaGljcyBkb2N1bWVudCAoRHJhd2luZyk8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZGciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHcmFwaGljcyBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3RnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIi8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogSW1hZ2UgZG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGUiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBJbWFnZSBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGUiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3RpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBQcmVzZW50YXRpb24gZG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2RwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBQcmVzZW50YXRpb24gZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbi10ZW1wbGF0ZSIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBTcHJlYWRzaGVldCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9kcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIvPgorICAgICAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFNwcmVhZHNoZWV0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0Ii8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogVGV4dCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2R0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyIi8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogR2xvYmFsIFRleHQgZG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWM+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIi8+CisgICAgICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogVGV4dCBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC10ZW1wbGF0ZSIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGUgZm9yIEhUTUwgZG9jdW1lbnRzPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3RoIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYm4iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54byIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWNvbmZpZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWh0dHAtcmVxdWVzdCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWh0dHAtcmVzcG9uc2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuYXNzb2NpYXRlZC1wcm9jZWR1cmUtcGFyYW1ldGVyK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5kcm0tdHJpZ2dlcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuaW1kK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5sdGttIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lm5vdGlmaWNhdGlvbit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QucHJvdmlzaW9uaW5ndHJpZ2dlciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zZ2Jvb3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dkZCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dkdSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zaW1wbGUtc3ltYm9sLWNvbnRhaW5lciIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zbWFydGNhcmQtdHJpZ2dlcit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3Byb3YreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnN0a20iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGNkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRjZGMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQyK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGQyIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaXNkK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5ncm91cC11c2FnZS1saXN0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZGV0YWlsZWQtcHJvZ3Jlc3MtcmVwb3J0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZmluYWwtcmVwb3J0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZ3JvdXBzK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuaW52b2NhdGlvbi1kZXNjcmlwdG9yK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2Mub3B0aW1pemVkLXByb2dyZXNzLXJlcG9ydCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEueGNhcC1kaXJlY3RvcnkreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hZHMtZW1haWwreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hZHMtZmlsZSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1mb2xkZXIreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hbG9jLXN1cGwtaW5pdCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb24iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm94dCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uIj4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb248L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwdHgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50aG14Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2xkeCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudGVtcGxhdGUiPgorICAgICAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG90eCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93Ij4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gU2xpZGVzaG93PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcHN4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Ij4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vazwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxzeCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSI+CisgICAgICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgVGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsdHgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgVGVtcGxhdGUgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bHRtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50Ij4KKyAgICAgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG9jeCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZSI+CisgICAgICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQgVGVtcGxhdGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvdHgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9zYS5uZXRkZXBsb3kiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vc2dpLmJ1bmRsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9zZ2kuZHAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3Rwcy5jdC1raXAreG1sIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wYWxtIj4KKyAgICAgICAgPCEtLSA8Z2xvYiBwYXR0ZXJuPSIqLnBkYiIvPiAtIGNvbmZsaWN0cyB3aXRoIGNoZW1pY2FsL3gtcGRiIC0tPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBxYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9wcmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBhb3MueG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGcuZm9ybWF0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdHIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wZy5vc2FzbGkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVpNiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBpYWNjZXNzLmFwcGxpY2F0aW9uLWxpY2VuY2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5waWNzZWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVmaWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb2MuZ3JvdXAtYWR2ZXJ0aXNlbWVudCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb2NrZXRsZWFybiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGxmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGJkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNi1zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjctcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNzUtcyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnByZW1pbmV0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHJldmlld3N5c3RlbXMuYm94Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ib3giLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcm90ZXVzLm1hZ2F6aW5lIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZ3oiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFwcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB2aS5wdGlkMSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHRpZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB3Zy1tdWx0aXBsZXhlZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB3Zy14aHRtbC1wcmludCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5xdWFsY29tbS5icmV3LWFwcC1yZXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5xdWFyay5xdWFya3hwcmVzcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXhkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXh0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXdkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXd0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXhsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXhiIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucmFwaWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14bCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm11c2ljeG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucmVubGVhcm4ucmxwcmludCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJpbS5jb2QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvZCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii5STUYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpbms2NiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJ1Y2t1cy5kb3dubG9hZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnMzc21zIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNibS5taWQyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2NyaWJ1cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC4zZGYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQuY3NmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmRvYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5lbWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQubWh0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLm5ldCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5wcHQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQudGlmZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC54bHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5odG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwucGRmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VlbWFpbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2VlIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VtYSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2VtYSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlbWQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlbWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZW1mIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZW1mIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybWRhdGEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlmbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm10ZW1wbGF0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaXRwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuaW50ZXJjaGFuZ2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlpZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLnBhY2thZ2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlwayIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNpbXRlY2gtbWluZG1hcHBlciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHdkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHdkcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNtYWYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNtYXJ0LnRlYWNoZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRlYWNoZXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2Z0d2FyZTYwMi5maWxsZXIuZm9ybSt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2Z0d2FyZTYwMi5maWxsZXIuZm9ybS14bWwtemlwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc29sZW50LnNka20reG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZGttIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2RrZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLmR4cCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHhwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuc2ZzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZnMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zc3MtY29kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3NzLWR0ZiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNzcy1udGYiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5jYWxjIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etc3Rhcm9mZmljZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlN0YXJDYWxjIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjA0ODoyMjA3IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uZHJhdyI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLXN0YXJvZmZpY2UiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJTdGFyRHJhdyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwNDg6MjIwNyIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2RhIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3MiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1zdGFyb2ZmaWNlIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQwY2YxMWUwYTFiMTFhZTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU3RhckltcHJlc3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDQ4OjIyMDciIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5tYXRoIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etc3Rhcm9mZmljZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlN0YXJXcml0ZXIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDQ4OjIyMDciIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkdyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdGFyb2ZmaWNlLXRlbXBsYXRlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etc3Rhcm9mZmljZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZvciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZ2wiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0cmVldC1zdHJlYW0iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN4YyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3RjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zeGQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3hpIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdGkiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN4bSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQuc3VuLnhtbC53cml0ZXIiLz4KKyAgICAgICAgPF9jb21tZW50Pk9wZW5PZmZpY2UgdjEuMDogV3JpdGVyIERvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zeHciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3hnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIudGVtcGxhdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0dyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1cy1jYWxlbmRhciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3VzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3VzcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN2ZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3dpZnR2aWV3LWljcyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3ltYmlhbi5pbnN0YWxsIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MTAwMDA0MTkiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjgiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2lzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2lzeCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3luY21sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iZG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54ZG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0ubm90aWZpY2F0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRzLm5vdGlmaWNhdGlvbiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRhby5pbnRlbnQtbW9kdWxlLWFyY2hpdmUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRhbyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudGNwZHVtcC5wY2FwIj4KKyAgICAgICAgPF9jb21tZW50PlRDUER1bXAgcGNhcCBwYWNrZXQgY2FwdHVyZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGExYjJjM2Q0IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGQ0YzNiMmExIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjYXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jYXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kbXAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRtb2JpbGUtbGl2ZXR2Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50bW8iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50cmlkLnRwdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHB0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5teHMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50cnVlYXBwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50cmEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50cnVlZG9jIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudWZkbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudWZkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudWZkbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudXR6Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudW1hamluIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51bWoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51bml0eSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudW5pdHl3ZWIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51b21sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudW9tbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmFsZXJ0LXdieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlLXdieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wLXdieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jaGFubmVsIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jaGFubmVsLXdieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0LXdieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kLXdieG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5zaWduYWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52Y3giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjeCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZkLXN0dWR5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmVjdG9yd29ya3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52aWRzb2Z0LnZpZGNvbmZlcmVuY2UiLz4KKworICAgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQudmlzaW8gLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmlzaW8iPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFZpc2lvIERpYWdyYW08L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzdyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmlzaW9uYXJ5Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52aXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC52aXZpZGVuY2Uuc2NyaXB0ZmlsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZzZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnNmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLnNpYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndhcC5zbGMiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndhcC53YnhtbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2J4bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndhcC53bWxjIj4KKyAgICAgICAgPF9jb21tZW50PkNvbXBpbGVkIFdNTCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud21sYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGMiPgorICAgICAgICA8X2NvbW1lbnQ+Q29tcGlsZWQgV01MIFNjcmlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud21sc2MiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndlYnR1cmJvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53dGIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud21jIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud21mLmJvb3RzdHJhcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndvcmRwZXJmZWN0Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3BkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3FkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53cWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53cnEtaHAzMDAwLWxhYmVsbGVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3Quc3RmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53di5jc3Ard2J4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53di5jc3AreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3Yuc3NwK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhhcmEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhhciIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhmZGwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhmZGwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54ZmRsLndlYmZvcm0iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bWkreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUuY3BrZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLmRwa2ciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5wbGFuIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUucHBrZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLnhsaW0iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtZGljIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5odmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtc2NyaXB0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5odnMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh2cCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9zZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXQub3NmcHZnK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3NmcHZnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5zbWFmLXBocmFzZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3BmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWVsbG93cml2ZXItY3VzdG9tLW1lbnUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnp1bCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouemlyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouemlyeiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnp6YXp6LmRlY2sreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi56YXoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZvaWNleG1sK3htbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnhtbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2F0Y2hlcmluZm8reG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aG9pc3BwLXF1ZXJ5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aG9pc3BwLXJlc3BvbnNlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aW5obHAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhscCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2l0YSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd29yZHBlcmZlY3Q1LjEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dzZGwreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53c2RsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndzcG9saWN5Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtMTIzIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDFhMDAiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDAyMDAiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWJpd29yZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWJ3Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFjZS1jb21wcmVzc2VkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1heGNyeXB0Ij4KKyAgICAgICAgPF9jb21tZW50PkF4Q3J5cHQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF4eCIgLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEF4Q3J5cHQgYmxvY2sgaGVhZGVyLCBza2lwIGxlbmd0aCBmaWVsZCwgdGhlbiBIZWFkZXIgb2YgdHlwZSBQcmVhbWJsZSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjMGI5MDcyZTRmOTNmMTQ2YTAxNTc5MmNhMWQ5ZTgyMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTciIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFkb2JlLWluZGVzaWduIj4KKyAgICAgICAgPGFjcm9ueW0+SU5ERDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkFkb2JlIEluRGVzaWduIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pbmRkIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDA2MDZlZGY1ZDgxZDQ2ZTViZDMxZWZlN2ZlNzRiNzFkIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hZG9iZS1pbmRlc2lnbi1pbnRlcmNoYW5nZSI+CisgICAgICAgIDxhY3JvbnltPklOWDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkFkb2JlIEluRGVzaWduIEludGVyY2hhbmdlIGZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7P2FpZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6MTAwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaW54Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kbWciLz4KKyAgICAgICAgPCEtLSA8Z2xvYiBwYXR0ZXJuPSIqLmltZyIvPiB0b28gZ2VuZXJpYyAtLT4KKyAgICAgICAgPCEtLSA8Z2xvYiBwYXR0ZXJuPSIqLnNtaSIvPiBjb25mbGljdHMgd2l0aCBTTUlMIC0tPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFwcGxld29ya3MiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN3ayIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFyY2hpdmUiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC11bml4LWFyY2hpdmUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ij0mbHQ7YXImZ3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIhJmx0O2FyY2gmZ3Q7XG4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXJqIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXJqLWNvbXByZXNzZWQiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4NjBlYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXJqIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1iaW4iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhYiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLngzMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnUzMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZveCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hdXRob3J3YXJlLW1hcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWFtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtc2VnIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hYXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iY3BpbyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYmNwaW8iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iZXJrZWxleS1kYiI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNjE1NjEiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MjI1MyIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDIyNTMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDIyNTMiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDA5ODgiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQwOTg4IiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQwOTg4IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iaWJ0ZXgtdGV4dC1maWxlIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiVcIEJpYlRlWFwgYCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJSUlXCBcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjczIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiVcIEJpYlRlWFwgc3RhbmRhcmRcIGJpYmxpb2dyYXBoeVwgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIlJSVcIFwgQEJpYlRlWC1zdHlsZS1maWxleyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjczIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkBhcnRpY2xleyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQGJvb2t7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJAaW5ib29reyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQGluY29sbGVjdGlvbnsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkBpbnByb2NlZWRpbmdzeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQG1hbnVhbHsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkBtaXNjeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQHByZWFtYmxleyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQHBoZHRoZXNpc3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkB0ZWNocmVwb3J0eyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQHVucHVibGlzaGVkeyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iaWIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iaWJ0ZXgiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iaXR0b3JyZW50Ij4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImQ4OmFubm91bmNlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRvcnJlbnQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1icGxpc3QiPgorICAgICAgICA8IS0tIFRoZSBwcmlvcml0eSBpcyA2MCwgYXMgLndlYmFyY2hpdmUgZmlsZXMgb2Z0ZW4gY29udGFpbgorICAgICAgICAgKFgpSFRNTCBjb250ZW50LiBUaGUgYnBsaXN0IG1hZ2ljIG11c3QgdHJ1bXAgdGhlIFhIVE1MCisgICAgICAgICBtYWdpY3MgZnVydGhlciB3aXRoaW4gdGhlIGZpbGUuIFRoaXMgbXVzdCBhbHNvIGJlCisgICAgICAgICBpbmRlcGVuZGVudCBvZiB0aGUgaW50ZXJuYWwgb3JkZXJpbmcgb2YgcGF0dGVybnMgd2l0aGluCisgICAgICAgICBNaW1lVHlwZXMgLS0+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJicGxpc3QiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYnppcCI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJCWmgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYnoiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50YnoiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iemlwMiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1iemlwIi8+CisgICAgICAgIDxfY29tbWVudD5CemlwIDIgVU5JWCBDb21wcmVzc2VkIEZpbGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHg0Mlx4NWFceDY4XHgzOVx4MzEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYnoyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGJ6MiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJveiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNkbGluayI+CisgICAgICAgIDxfY29tbWVudD5WaXJ0dWFsIENELVJPTSBDRCBJbWFnZSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52Y2QiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaGF0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jaGF0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY2hlc3MtcGduIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZ24iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaHJvbWUtcGFja2FnZSI+CisgICAgICAgIDxhY3JvbnltPkNSWDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkNocm9tZSBFeHRlbnNpb24gUGFja2FnZTwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2NyeDwvdGlrYTpsaW5rPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQ3IyNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcngiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb21wcmVzcyI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMDM3XDIzNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi56Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY29yZWxwcmVzZW50YXRpb25zIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaHciLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jcGlvIj4KKyAgICAgICAgPF9jb21tZW50PlVOSVggQ1BJTyBBcmNoaXZlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwNyIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDciIHR5cGU9ImJpZzE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzA3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcGlvIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY3NoIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jc2giLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50Y3NoIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXJjaGl2ZSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iISZsdDthcmNoJmd0O1xuZGViaWFuLWJpbmFyeSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kZWIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51ZGViIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZGV4Ij4KKyAgICAgICAgPGFjcm9ueW0+REVYPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RGFsdmlrIEV4ZWN1dGFibGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvdGVjaC9kYWx2aWsvZGV4LWZvcm1hdC5odG1sPC90aWthOmxpbms+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJkZXhcbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI3Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRleCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIj4KKyAgICAgICAgPF9jb21tZW50PlNob2Nrd2F2ZSBNb3ZpZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGlyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGNyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHhyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3N0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2N0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3h0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudzNkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmdkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3dhIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZG9vbSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2FkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5jeCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdGJvb2sreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kdGIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHRicmVzb3VyY2UreG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yZXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdmkiPgorICAgICAgICA8X2NvbW1lbnQ+VGVYIERldmljZSBJbmRlcGVuZGVudCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMzY3XDAwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMmY3IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4MWJceDIwXHg1NFx4NjVceDU4XHgyMFx4NmZceDc1XHg3NFx4NzBceDc1XHg3NFx4MjAiCisgICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE0Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHZpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZWxjIj4KKyAgICAgICAgPF9jb21tZW50PkVtYWNzIExpc3AgYnl0ZWNvZGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDwhLS0gRW1hY3MgMTggLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwwMTIoIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gRW1hY3MgMTkgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjtFTENcMDIzXDAwMFwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lbGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1lbGYiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDE3N0VMRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UveC1lbWx4Ij4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI3MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxuUmVsYXktVmVyc2lvbjoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG4jIVwgcm5ld3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5OIyFcIHJuZXdzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo5Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxuRm9yd2FyZFwgdG8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5QaXBlXCB0byIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcblJldHVybi1QYXRoOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcbkZyb206IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo5Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxuUmVjZWl2ZWQ6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo5Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxuTWVzc2FnZS1JRDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjkiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXG5EYXRlOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6OSIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtbHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1raWxsdXN0cmF0b3IiPgorICAgICAgICA8X2NvbW1lbnQ+S0lsbHVzdHJhdG9yIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtpbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW9iamVjdCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1lbGYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwxNzdFTEYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDEwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxNiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZXhlY3V0YWJsZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1lbGYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwxNzdFTEYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDIwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxNiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hhcmVkbGliIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWVsZiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDE3N0VMRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMzAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTYiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb3JlZHVtcCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1lbGYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwxNzdFTEYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDQwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxNiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kb3NleGVjIj4KKyAgICAgICAgPF9jb21tZW50PkRPUy9XaW5kb3dzIGV4ZWN1dGFibGUgKEVYRSk8L19jb21tZW50PgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4ZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWVtZiI+CisgICAgICAgIDxhY3JvbnltPkVNRjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkV4dGVuZGVkIE1ldGFmaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lbWYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDEwMDAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZmlsZW1ha2VyIj4KKyAgICAgICAgPGFjcm9ueW0+RlA3PC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RmlsZU1ha2VyIFBybyA3PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4QzA0ODQyNDE0RDM3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTQiID4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4NDg0MjQxNEQzMjMxMzAzMTRGNDM1NDM5MzlDMTAyNDgwNzUwNzI2RjIwMzcyRTMwQzBDMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjUyNSIgLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnA3IiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtYmRmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iZGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1kb3MiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1mcmFtZW1ha2VyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtZ2hvc3RzY3JpcHQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdzZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWxpYmdyeCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWxpbnV4LXBzZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHNmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1vdGYiPgorICAgICAgICA8YWNyb255bT5PVEY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5PcGVuVHlwZSBGb250PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vdGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXBjZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGNmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtc25mIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbmYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zcGVlZG8iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zdW5vcy1uZXdzIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC10dGYiPgorICAgICAgICA8YWNyb255bT5UVEY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5UcnVlVHlwZSBGb250PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50dGYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50dGMiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMTAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC10eXBlMSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGZhIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGZiIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBNYXRjaCBmb3IgUEZCLCB0aGUgYmluYXJ5IGZvcm1hdCAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXHg4MFx4MDFceEZGXHhGRlx4MDBceDAwJSFQUy1BZG9iZUZvbnQiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkYwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBNYXRjaCBmb3IgUEZBLCB0aGUgdGV4dCBmb3JtYXQiIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIlIVBTLUFkb2JlRm9udC0xLjAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtYWRvYmUtbWV0cmljIj4KKyAgICAgICAgPF9jb21tZW50PkFkb2JlIEZvbnQgTWV0cmljPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hY2ZtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYW1mbSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU3RhcnRGb250TWV0cmljcyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXByaW50ZXItbWV0cmljIj4KKyAgICAgICAgPF9jb21tZW50PlByaW50ZXIgRm9udCBNZXRyaWM8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmbSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAxRkZGRjAwMDA0MzZmNzA3OTcyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkYwMDAwRkZGRkZGRkZGRkZGRkYiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC12Zm9udCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZveG1haWwiPgorICAgICAgICA8X2NvbW1lbnQ+Rm94bWFpbCBFbWFpbCBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDEwMTAxMDEwMTAxMDEwMTExMTExMTExMTExNTMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoIj4KKyAgICAgICAgPF9jb21tZW50Pk1hY3JvbWVkaWEgRnV0dXJlU3BsYXNoIEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNwbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWdudWNhc2giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdudWNhc2giIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ251bWVyaWMiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1HbnVtZXJpYy1zcHJlYWRzaGVldCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iPSZsdDtnbXI6V29ya2Jvb2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzOSIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nbnVtZXJpYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWd0YXIiPgorICAgICAgICA8X2NvbW1lbnQ+R05VIHRhciBDb21wcmVzc2VkIEZpbGUgQXJjaGl2ZSAoR05VIFRhcGUgQXJjaGl2ZSk8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDwhLS0gR05VIHRhciBhcmNoaXZlIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJ1c3RhciAgXDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNTciIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3RhciIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGFyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2d6aXAiPgorICAgICAgICA8X2NvbW1lbnQ+R3ppcCBDb21wcmVzc2VkIEFyY2hpdmU8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1nemlwIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWd1bnppcCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vZ3ppcC1jb21wcmVzc2VkIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9nemlwcGVkIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9nemlwLWNvbXByZXNzZWQiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ3ppcC1jb21wcmVzc2VkIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJnemlwL2RvY3VtZW50Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNDUiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMDM3XDIxMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4MWZceDhiIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50Z3oiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ3oiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiotZ3oiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZW16IiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWhkZiI+CisgICAgICAgIDxfY29tbWVudD5IaWVyYXJjaGljYWwgRGF0YSBGb3JtYXQgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPCEtLSBIREY0IC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDBlMDMxMzAxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIEhERjUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwyMTFIREZcclxuXDAzMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oZGYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oZTUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oNSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWh3cCI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPCEtLQorICAgICAgICBUSUtBLTMzMDogRGV0ZWN0aW9uIHBhdHRlcm4gYmFzZWQgb24gc2lnbmF0dXJlIHN0cmluZ3MgZnJvbQorICAgICAgICB0aGUgaHdwZmlsdGVyL3NvdXJjZS9od3BmaWxlLmNwcCBmaWxlIGluIE9wZW5PZmZpY2Uub3JnLgorICAgICAgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkhXUCBEb2N1bWVudCBGaWxlIFYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaWJvb2tzK3ppcCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vZXB1Yit6aXAiIC8+CisgICAgICAgIDxhY3JvbnltPmlCb29rczwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkFwcGxlIGlCb29rcyBBdXRob3IgcHVibGljYXRpb24gZm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24veC1pYm9va3MremlwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWJvb2tzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSI+CisgICAgICAgIDxhY3JvbnltPklTTzwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PklTTyA5NjYwIENELVJPTSBmaWxlc3lzdGVtIGRhdGE8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQ0QwMDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMjc2OSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJDRDAwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjM0ODE3Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkNEMDAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzY4NjUiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pc28iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1pdHVuZXMtaXBhIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICAgICAgPF9jb21tZW50PkFwcGxlIGlPUyBJUEEgQXBwU3RvcmUgZmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaXBhIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpubHAiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1qYXZhLXBhY2syMDAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBhY2siLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1rZGVsbmsiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iW0tERVwgRGVza3RvcFwgRW50cnldIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjXCBLREVcIENvbmZpZ1wgRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1sYXRleCI+CisgICAgICAgIDxfY29tbWVudD5MYVRlWCBTb3VyY2UgRG9jdW1lbnQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJVwgLSotbGF0ZXgtKi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGF0ZXgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRleCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWxoYSI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbHpzLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoXDQwLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoZC0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDItIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGgzLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNC0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDUtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbGg2LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNy0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbGhhcmMiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMC0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDEtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSItbHo0LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLWx6NS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbW9iaXBvY2tldC1lYm9vayI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHJjIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW9iaSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvbiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXBwbGljYXRpb24iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXMtd21kIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXMtd216Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWd6aXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bXoiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXMteGJhcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGJhcCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2FjY2VzcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWRiIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDEwMDAwNTM3NDYxNmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zYmluZGVyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vYmQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNjYXJkZmlsZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY3JkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zY2xpcCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGxsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY29tIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYmF0Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNWiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy1pbnN0YWxsZXIiPgorICAgICAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFdpbmRvd3MgSW5zdGFsbGVyPC9fY29tbWVudD4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtd2luZG93cy1pbnN0YWxsZXIiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNpIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNpIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXN0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjU1Ij4KKyAgICAgICAgICAgIDwhLS0gVGVjaG5pY2FsbHkgdGhlIGhlYWRlciBvZmZzZXQgaXMgc3RvcmVkIGF0IDB4M2MsIGFuZCBpc24ndCBhIC0tPgorICAgICAgICAgICAgPCEtLSBjb25zdGFudCwgYnV0IGl0J3MgYWxtb3N0IGFsd2F5cyBzZXQgdG8gc3RhcnQgYXQgMHg4MCBvciAweGYwIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQRVwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTI4Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNDAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8IS0tIHRoZSBQRSBoZWFkZXIgc2hvdWxkIGJlIFBFeDAweDAwIHRoZW4gYSB0d28gYnl0ZSBtYWNoaW5lIHR5cGUgLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlMzIiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMTRjIiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIxMzIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNDAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMTRjIiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIyNDQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlNjQiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg4NjY0IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIxMzIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNDAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg4NjY0IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIyNDQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlLWl0YW5pdW0iPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZDtmb3JtYXQ9cGUiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMjgiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMjAwIiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIxMzIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBFXDAwMFwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyNDAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMjAwIiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIyNDQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlLWFybUxFIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJwZVwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTI4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDFjMCIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMTMyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJwZVwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjQwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDFjMCIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMjQ0Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkO2Zvcm1hdD1wZS1hcm03Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7Zm9ybWF0PXBlIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJwZVwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTI4Ij4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDFjNCIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMTMyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJwZVwwMDBcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjQwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDFjNCIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMjQ0Ii8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tdmIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tMTMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tMTQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNtZXRhZmlsZSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LXdtZiIvPgorICAgICAgICA8YWNyb255bT5XTUY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5XaW5kb3dzIE1ldGFmaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDdjZGM2OWEwMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAxMDAwOTAwMDAwMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNtb25leSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW55Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDEwMDAwNEQ1MzQ5NTM0MTREMjA0NDYxNzQ2MTYyNjE3MzY1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNwdWJsaXNoZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB1YiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc3NjaGVkdWxlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zY2QiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXN0ZXJtaW5hbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudHJtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zd3JpdGUiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndyaSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1uZXRjZGYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5jIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2RmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXBrY3MxMiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucDEyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGZ4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucDdiIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3BjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wN3IiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wcnQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBydCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iME0zQyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjgiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtcXVhdHRyby1wcm8iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFwdyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndiMSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndiMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndiMyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkIj4KKyAgICAgICAgPF9jb21tZW50PlJBUiBhcmNoaXZlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtcmFyIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJSYXIhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceDUyXHg2MVx4NzJceDIxXHgxYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yYXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1yb3hpby10b2FzdCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudG9hc3QiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWlzbzk2NjAtaW1hZ2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1ycG0iPgorICAgICAgICA8X2NvbW1lbnQ+UmVkSGF0IFBhY2thZ2UgTWFuYWdlcjwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnBtIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceGVkXHhhYlx4ZWVceGRiIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcyI+CisgICAgICAgIDxfY29tbWVudD5TQVMgUHJvZ3JhbTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtcHJvZ3JhbS1kYXRhIj4KKyAgICAgICAgPF9jb21tZW50PlNBUyBTdG9yZWQgUHJvZ3JhbSAoREFUQSBTdGVwKTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3M3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2JwZ20iLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLWF1ZGl0Ij4KKyAgICAgICAgPF9jb21tZW50PlNBUyBBdWRpdDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3Q3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2JhdWQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLWRhdGEiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIERhdGEgU2V0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZDciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YmRhdCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU0FTIEZJTEUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI4NCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLXZpZXciPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIERhdGEgU2V0IFZpZXc8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN2NyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdidmV3Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1kYXRhLWluZGV4Ij4KKyAgICAgICAgPF9jb21tZW50PlNBUyBEYXRhIFNldCBJbmRleDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2k3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2JuZHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLWNhdGFsb2ciPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIENhdGFsb2c8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiY2F0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNhcy1hY2Nlc3MiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIEFjY2VzcyBEZXNjcmlwdG9yPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYTciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YmFjcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtZmRiIj4KKyAgICAgICAgPF9jb21tZW50PlNBUyBGREIgQ29uc29saWRhdGlvbiBEYXRhYmFzZSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zZjciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YmZkYiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtbWRkYiI+CisgICAgICAgIDxfY29tbWVudD5TQVMgTUREQiBNdWx0aS1EaW1lbnNpb25hbCBEYXRhYmFzZSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zbTciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3Ym1kYiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtZG1kYiI+CisgICAgICAgIDxfY29tbWVudD5TQVMgRE1EQiBEYXRhIE1pbmluZyBEYXRhYmFzZSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zN20iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3YmRtZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtaXRlbXN0b3IiPgorICAgICAgICA8X2NvbW1lbnQ+U0FTIEl0ZW0gU3RvcmUgKEl0ZW1TdG9yKSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zcjciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zYXM3Yml0bSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtdXRpbGl0eSI+CisgICAgICAgIDxfY29tbWVudD5TQVMgVXRpbGl0eTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3U3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2J1dGwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLXB1dGlsaXR5Ij4KKyAgICAgICAgPF9jb21tZW50PlNBUyBQZXJtYW5lbnQgVXRpbGl0eTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3A3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2FzN2JwdXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2FzLXRyYW5zcG9ydCI+CisgICAgICAgIDxfY29tbWVudD5TQVMgVHJhbnNwb3J0IEZpbGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0eCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYXMtYmFja3VwIj4KKyAgICAgICAgPF9jb21tZW50PlNBUyBCYWNrdXA8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNhczdiYmFrIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2MiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU3ByZWFkc2hlZXQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzOCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNoIj4KKyAgICAgICAgPF9jb21tZW50PlVOSVgvTElOVVggU2hlbGwgU2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhLyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyFcIC8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhXHQvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJldmFsICZxdW90O2V4ZWMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2giLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iYXNoIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNoYXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNoYXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giPgorICAgICAgICA8YWNyb255bT5GbGFzaDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkFkb2JlIEZsYXNoPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZXUyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBGID0gVW5jb21wcmVzc2VkIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJDV1MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gQyA9IENvbXByZXNzZWQgICAtLT4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zd2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodC1hcHAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhhcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXQiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iU3R1ZmZJdCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zaXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdHVmZml0eCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2l0eCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdjRjcGlvIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zdjRjcGlvIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN2NGNyYyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3Y0Y3JjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGFyIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICAgICAgICA8IS0tIFBPU0lYIHRhciBhcmNoaXZlIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJ1c3RhclwwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjU3IiAvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRhciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleCI+CisgICAgICAgIDxfY29tbWVudD5UZVggU291cmNlPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveC10ZXgiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxcaW5wdXQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilxcc2VjdGlvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxzZXRsZW5ndGgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxcZG9jdW1lbnRzdHlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXFxjaGFwdGVyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcXGRvY3VtZW50Y2xhc3MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxccmVsYXgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxcY29udGVudHNsaW5lIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleC10Zm0iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRmbSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleGluZm8iPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC94LXRleGluZm8iIC8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcXGlucHV0XCB0ZXhpbmZvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleGluZm8iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50ZXhpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBNaWNyb3NvZnQgT2ZmaWNlIGJpbmFyeSBmaWxlIGZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2ludGVyb3AvZG9jcy9PZmZpY2VCaW5hcnlGb3JtYXRzLm1zcHggICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhkMGNmMTFlMGExYjExYWUxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZS1lbWJlZGRlZCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UtZW1iZWRkZWQ7Zm9ybWF0PW9sZTEwX25hdGl2ZSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlLWVtYmVkZGVkIi8+CisgICAgICAgIDxfY29tbWVudD5PTEUxMCBOYXRpdmUgRW1iZWRkZWQgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlLWVtYmVkZGVkO2Zvcm1hdD1jb21wX29iaiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlLWVtYmVkZGVkIi8+CisgICAgICAgIDxfY29tbWVudD5Db21wT2JqIE9MRTIgRW1iZWRkZWQgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXN3b3Jrcy1zcHJlYWRzaGVldCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxyIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIi8+CisgICAgICAgIDwhLS0gdGhpcyBoYXMgdG8gYmUgaGlnaHRlciB0aGFuIHRoZSBFeGNlbCBtYXRjaCAtLT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJXXHgwMGtceDAwc1x4MDBTXHgwMFNceDAwV1x4MDBvXHgwMHJceDAwa1x4MDBCXHgwMG9ceDAwb1x4MDBrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIE9mZmljZSBPcGVuIFhNTCBmaWxlIGZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL3N0YW5kYXJkcy9FY21hLTM3Ni5odG0gLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IltDb250ZW50X1R5cGVzXS54bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDwhLS0gTm90ZSAtIHBhc3N3b3JkIHByb3RlY3RlZCBPT1hNTCBmaWxlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIGluIC0tPgorICAgIDwhLS0gIGFuIE9MRTIgKGFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSkgY29udGFpbmVyIC0tPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sLXByb3RlY3RlZCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgICAgICAgIDxfY29tbWVudD5QYXNzd29yZCBQcm90ZWN0ZWQgT09YTUwgRmlsZTwvX2NvbW1lbnQ+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8IS0tIE9sZGVyIFN0YXJPZmZpY2UgZm9ybWF0cyBleHRlbmQgdXAgdGhlIE1pY3Jvc29mdCBPTEUyIGZvcm1hdCAtLT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1zdGFyb2ZmaWNlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC11YzItY29tcHJlc3NlZCI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJVQzJceDFhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51YzIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdXN0YXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVzdGFyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm1kayI+CisgICAgICAgIDxhY3JvbnltPlZNREs8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5WaXJ0dWFsIERpc2sgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZNREs8L3Rpa2E6bGluaz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52bWRrIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyYyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC13ZWJhcmNoaXZlIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWJwbGlzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndlYmFyY2hpdmUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kZXIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcnQiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gteGZpZyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmlnIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXhwaW5zdGFsbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHBpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gteG1pbmQiPgorICAgICAgICA8X2NvbW1lbnQ+WE1pbmQgUHJvPC9fY29tbWVudD4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bWluZCIvPgorICAgICAgICA8IS0tIC54bWFwIGlzIGFsc28gdXNlZCwgYnV0IHRoYXQgZXh0ZW5zaW9uIGlzIG1vcmUgY29tbW9uIGVsc2V3aGVyZSAtLT4KKyAgICAgICAgPCEtLSA8Z2xvYiBwYXR0ZXJuPSIqLnhtYXAiLz4gLS0+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gteHoiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh6Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJcMzc1N3pYWlwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtem9vIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmRjNGE3ZGMiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouem9vIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3g0MDAtYnAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtYXR0K3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1jYXBzK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1lbCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtZXJyb3IreG1sIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLW5zK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNvbi1jb25mZXJlbmNlLWluZm8tZGlmZit4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjb24tY29uZmVyZW5jZS1pbmZvK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGVuYyt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhlbmMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGh0bWwreG1sIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtodG1sIHhtbG5zPSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6ODE5MiIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsb2NhbE5hbWU9Imh0bWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54aHRtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94aHRtbC12b2ljZSt4bWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1sIj4KKyAgICAgICAgPGFjcm9ueW0+WE1MPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2U8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWG1sPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5wdWJsaWMueG1sPC90aWthOnV0aT4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveG1sIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXhtbCIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0Oz94bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDs/WE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IS0tIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBVVEYtOCBCT00gLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4RUZCQkJGM0MzRjc4NkQ2QyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gVVRGLTE2IExFL0JFIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweEZGRkUzQzAwM0YwMDc4MDA2RDAwNkMwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhGRUZGMDAzQzAwM0YwMDc4MDA2RDAwNkMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIFRPRE86IEFkZCBtYXRjaGVzIGZvciB0aGUgb3RoZXIgcG9zc2libGUgWE1MIGVuY29kaW5nIHNjaGVtZXMgLS0+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueG1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNkIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIgLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1sLWR0ZCI+CisgICAgICAgIDxfY29tbWVudD5YTUwgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uPC9fY29tbWVudD4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtZHRkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHRkIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbC1leHRlcm5hbC1wYXJzZWQtZW50aXR5Ij4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1wcCt4bWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hvcCt4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhvcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94c2xmbyt4bWwiPgorICAgICAgICA8YWxpYXMgdHlwZT0idGV4dC94c2wiLz4KKyAgICAgICAgPGFjcm9ueW0+WFNMRk88L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5YU0wgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icm9vdCIKKyAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNsZm8iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94c2x0K3htbCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3hzbCIvPgorICAgICAgICA8YWNyb255bT5YU0xUPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+WFNMIFRyYW5zZm9ybWF0aW9uczwvX2NvbW1lbnQ+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InN0eWxlc2hlZXQiCisgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzbHQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veHNwZit4bWwiPgorICAgICAgICA8YWNyb255bT5YU1BGPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+WE1MIFNoYXJlYWJsZSBQbGF5bGlzdCBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJwbGF5bGlzdCIKKyAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3hzcGYub3JnL25zLzAvIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHNwZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94dit4bWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14bWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54aHZtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh2bWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54dm0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vemlwIj4KKyAgICAgICAgPF9jb21tZW50PkNvbXByZXNzZWQgQXJjaGl2ZSBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1pJUF8oZmlsZV9mb3JtYXQpPC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20ucGt3YXJlLnppcC1hcmNoaXZlPC90aWthOnV0aT4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwNVwwMDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBLXHgwN1x4MDgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouemlwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtN3otY29tcHJlc3NlZCI+CisgICAgICAgIDxhY3JvbnltPjd6aXA8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD43LXppcCBhcmNoaXZlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8IS0tIE1hZ2ljOiAnNycsICd6JywgMHhCQywgMHhBRiwgMHgyNywgMHgxQyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iN3oiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjEiID4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4QkNBRjI3MUMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjUiIC8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLjd6IiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby8zMmthZHBjbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vM2dwcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vM2dwcDIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2FjMyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYWRwY20iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFkcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hbXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFtciIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDwhLS0gU3BlY2lmaWMgbWF0Y2ggZm9yIHRoZSBvcmlnaW5hbCBBTVIgZm9ybWF0IC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIUFNUlxuIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBHZW5lcmFsIG1hdGNoIGZvciBBTVIgc3VidHlwZXMgd2UgZG9uJ3QgaGF2ZSBlbnRyaWVzIGZvciAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyFBTVIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hbXItd2IiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImF1ZGlvL2FtciIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyFBTVItV0JcbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Ftci13YisiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImF1ZGlvL2FtciIvPgorICAgICAgICA8IS0tIFRJS0EtMTE1NiBzYW1wbGUgbmVlZGVkIC0gbWlnaHQgYmUgIiMhQU1SLVdCK1xuIiA/IC0tPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hc2MiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYmFzaWMiPgorICAgICAgICA8X2NvbW1lbnQ+dUxhdy9BVSBBdWRpbyBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii5zbmQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIyIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjQiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI1IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iNiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjciIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICAgICAgPG1hdGNoIG9mZnNldD0iMCIgdHlwZT0ic3RyaW5nIiB2YWx1ZT0iXHgyZVx4NzNceDZlXHg2NFx4MDBceDAwXHgwMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF1Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc25kIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2J2MTYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2J2MzIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2NsZWFybW9kZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vY24iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2RhdDEyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kbHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Rzci1lczIwMTEwOCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMDUwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9kc3ItZXMyMDIyMTEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Rzci1lczIwMjIxMiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHZpNCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZWFjMyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyYy1xY3AiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmMwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY2IiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmNiMCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY2IxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjd2IiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmN3YjAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmN3YjEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V4YW1wbGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MTkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjIxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzIzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTE2Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTI0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTMyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTQwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5MSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjllIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nc20iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2dzbS1lZnIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2lsYmMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2wxNiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDIwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9sMjQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2w4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9scGMiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbWlkaSI+CisgICAgICAgIDxhY3JvbnltPk1JREk8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5NdXNpY2FsIEluc3RydW1lbnQgRGlnaXRhbCBJbnRlcmZhY2U8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHkgPSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiB2YWx1ZT0iTVRoZCIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWlkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWlkaSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmthciIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtaSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tb2JpbGUteG1mIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcDQiPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXVkaW8veC1tNGEiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtbXA0YSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cE00QSAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXBNNEIgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwRjRBICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cEY0QiAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXA0YSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm00YSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm00YiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wYS1yb2J1c3QiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbXBlZyI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhdWRpby94LW1wZWciLz4KKyAgICAgICAgPGFjcm9ueW0+TVAzPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+TVBFRy0xIEF1ZGlvIExheWVyIDM8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDwhLS0gaHR0cDovL21wZ2VkaXQub3JnL21wZ2VkaXQvbXBlZ19mb3JtYXQvTVAzRm9ybWF0Lmh0bWwgLS0+CisgICAgICAgICAgICA8IS0tIEJpdCBwYXR0ZXJuIGZvciBmaXJzdCB0d28gYnl0ZXM6IDExMTExMTExIDExMVZWTExDICAgIC0tPgorICAgICAgICAgICAgPCEtLSBWViA9IE1QRUcgQXVkaW8gVmVyc2lvbiBJRDsgMTAgPSBWMiwgMTEgPSBWMSAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDwhLS0gTEwgPSBMYXllciBkZXNjcmlwdGlvbjsgMDEgPSBMMywgMTAgPSBMMiwgMTEgPSBMMSAgICAgLS0+CisgICAgICAgICAgICA8IS0tIEMgPSBQcm90ZWN0aW9uIGJpdDsgMCA9IENSQywgMSA9IG5vIENSQyAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwzLCBDUkMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDMgICAgICAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMiwgQ1JDIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwyICAgICAgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDEsIENSQyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMSAgICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwzLCBDUkMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmYiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDMgICAgICAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZjIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMiwgQ1JDIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwyICAgICAgLS0+CisgICAgICAgICAgICA8IS0tIFRJS0EtNDE3OiBUaGlzIGlzIHRoZSBVVEYtMTYgTEUgYnl0ZSBvcmRlciBtYXJrISAtLT4KKyAgICAgICAgICAgIDwhLS0gbWF0Y2ggdmFsdWU9IjB4ZmZmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLyAtLT4gPCEtLSBWMSwgTDEsIENSQyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMSAgICAgIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJJRDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBnYSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wMmEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcDMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tMmEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tM2EiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbXBlZzQtZ2VuZXJpYyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9vZ2ciPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFZvcmJpcyBBdWRpbzwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2dhIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgVm9yYmlzIENvZGVjIENvbXByZXNzZWQgV0FWIEZpbGU8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1vZ2ciLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEZvciBhIHNpbmdsZSBzdHJlYW0gZmlsZSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlwwMDF2b3JiaXMiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub2dnIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtb2dnZmxhYyI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgUGFja2FnZWQgRnJlZSBMb3NzbGVzcyBBdWRpbyBDb2RlYzwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhdWRpby94LW9nZy1mbGFjIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBGb3IgYSBzaW5nbGUgc3RyZWFtIGZpbGUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5GTEFDIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGIgorICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImF1ZGlvL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LW9nZ3BjbSI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgUGFja2FnZWQgVW5vbXByZXNzZWQgV0FWIEZpbGU8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXVkaW8veC1vZ2ctcGNtIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBGb3IgYSBzaW5nbGUgc3RyZWFtIGZpbGUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5QQ00gICAgICIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIE9wdXMgQ29kZWMgQ29tcHJlc3NlZCBXQVYgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBGb3IgYSBzaW5nbGUgc3RyZWFtIGZpbGUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5PcHVzSGVhZCIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioub3B1cyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImF1ZGlvL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zcGVleCI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgU3BlZXggQ29kZWMgQ29tcHJlc3NlZCBXQVYgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXNwZWV4Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPCEtLSBGb3IgYSBzaW5nbGUgc3RyZWFtIGZpbGUgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5TcGVleCAgICIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3B4Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXVkaW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Bhcml0eWZlYyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtYSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtYS13YiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtdS13YiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtdSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wcnMuc2lkIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBTSUQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3FjZWxwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9yZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3J0cC1lbmMtYWVzY20xMjgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3J0cC1taWRpIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ydHgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3NtdiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212MCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212LXFjcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc3AtbWlkaSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdDE0MGMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3QzOCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdGVsZXBob25lLWV2ZW50Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90b25lIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby91bHBmZWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZkdmkiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Ztci13YiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLjNncHAuaXVmcCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLjRzYiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmF1ZGlva296Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuYWRvYmUuc291bmRib290aCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNuZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNlbHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jaXNjby5uc2UiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jbWxlcy5yYWRpby1ldmVudHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jbnMuYW5wMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNucy5pbmYxIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZGlnaXRhbC13aW5kcyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZW9sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZGxuYS5hZHRzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkuaGVhYWMuMSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LmhlYWFjLjIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5tbHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5tcHMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5wbDIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5wbDJ4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkucGwyeiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmR0cyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHRzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZHRzLmhkIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kdHNoZCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmV2ZXJhZC5wbGoiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5obnMuYXVkaW8iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5sdWNlbnQudm9pY2UiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmx2cCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weWEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5YSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm5va2lhLm1vYmlsZS14bWYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5ub3J0ZWwudmJrIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubnVlcmEuZWNlbHA0ODAwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDQ4MDAiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5udWVyYS5lY2VscDc0NzAiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjZWxwNzQ3MCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwOTYwMCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZWNlbHA5NjAwIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQub2N0ZWwuc2JjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQucWNlbHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5yaGV0b3JleC4zMmthZHBjbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLm1wZWciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC52bXguY3ZzZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm9yYmlzLWNvbmZpZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1hYWMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWFkYmNtIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii5zbmQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjIzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1haWZmIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL2FpZmYiLz4KKyAgICAgICAgPGFjcm9ueW0+QUlGRjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkF1ZGlvIEludGVyY2hhbmdlIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZPUk0uLi4uQUlGRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkYiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iRk9STS4uLi5BSUZDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgICAgICAgICAgPCEtLSBBbWlnYSBJRkYgc291bmQgc2FtcGxlLCBzb21ld2hhdCBsaWtlIHRoZSBtb3JlIG1vZGVybiBBSUZGIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGT1JNLi4uLjhTVlgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICAgICAgICA8bWF0Y2ggb2Zmc2V0PSIwIiB0eXBlPSJzdHJpbmciIHZhbHVlPSJceDQ2XHg0Zlx4NTJceDRkXHgwMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFpZmYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5haWZjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtZGVjLWJhc2ljIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDA2NDczMkUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iNCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI2IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iNyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtZGVjLWFkYmNtIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDA2NDczMkUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LWZsYWMiPgorICAgICAgICA8YWNyb255bT5GTEFDPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+RnJlZSBMb3NzbGVzcyBBdWRpbyBDb2RlYzwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmTGFDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsYWMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tb2QiPgorICAgICAgICA8YWNyb255bT5NT0Q8L2Fjcm9ueW0+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJFeHRlbmRlZFwgTW9kdWxlOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQk1PRDJTVE0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMSIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNLksuIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJNIUshIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGTFQ0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGTFQ4IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI0Q0hOIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI2Q0hOIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI4Q0hOIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJDRDgxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJPS1RBIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIxNkNOIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIzMkNOIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTA4MCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJJTVBNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vZCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LW1wZWd1cmwiPgorICAgICAgICA8X2NvbW1lbnQ+TVAzIFBsYXlsaXN0IEZpbGU8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCBvZmZzZXQ9IjAiIHR5cGU9InN0cmluZyIgdmFsdWU9Ilx4MjNceDQ1XHg1OFx4NTRceDRkXHgzM1x4NTVceDBkXHgwYSIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0zdSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LW1zLXdheCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2F4Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LW1zLXdtYSI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8veC1tcy1hc2YiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud21hIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJXaW5kb3dzIE1lZGlhIEF1ZGlvIiB0eXBlPSJ1bmljb2RlTEUiIG9mZnNldD0iMDo4MTkyIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LXBuLXJlYWxhdWRpbyI+CisgICAgICAgIDxfY29tbWVudD5SZWFsIEF1ZGlvPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtcmVhbGF1ZGlvIiAvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgyZTcyNjFmZCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbiI+CisgICAgICAgIDxfY29tbWVudD5SZWFsTWVkaWEgUGxheWVyIFBsdWctaW48L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtcCIvPgorICAgICAgICA8IS0tIDxnbG9iIHBhdHRlcm49IioucnBtIi8+IC0gY29uZmxpY3RzIHdpdGggYXBwbGljYXRpb24veC1ycG0gLS0+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtd2F2Ij4KKyAgICAgICAgPGFjcm9ueW0+V0FWPC9hY3JvbnltPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUklGRi4uLi5XQVZFIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndhdiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNkeCI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJWakNEMDEwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY2lmIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jaWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY21kZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY21kZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jbWwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtbCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jc21sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jc21sIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtcGRiIj4KKyAgICAgICAgPF9jb21tZW50PkJyb29raGF2ZW4gUHJvdGVpbiBEYXRhYmFuayBGaWxlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZGIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC14eXoiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh5eiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LW1zLWJtcCI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS9ibXAiLz4KKyAgICAgICAgPGFjcm9ueW0+Qk1QPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+V2luZG93cyBiaXRtYXA8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQk1QX2ZpbGVfZm9ybWF0PC90aWthOmxpbms+CisgICAgICAgIDx0aWthOnV0aT5jb20ubWljcm9zb2Z0LmJtcDwvdGlrYTp1dGk+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJCTSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMTAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjYiPgorICAgICAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI4Ii8+CisgICAgICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMTAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjgiLz4KKyAgICAgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDA0MDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOCIvPgorICAgICAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDgwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI4Ii8+CisgICAgICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjgiLz4KKyAgICAgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDE4MDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOCIvPgorICAgICAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MjAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI4Ii8+CisgICAgICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYm1wIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGliIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2NnbSI+CisgICAgICAgIDxhY3JvbnltPkNHTTwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkNvbXB1dGVyIEdyYXBoaWNzIE1ldGFmaWxlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkJFR01GIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMjAiIG1hc2s9IjB4ZmZlMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDIyMDAwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6NjQiLz4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MTAyMjAwMDIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyOjY0Ii8+CisgICAgICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDEwMjIwMDAzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjo2NCIvPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDIyMDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI6NjQiLz4KKyAgICAgICAgICAgIDwvbWF0Y2g+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2dtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2V4YW1wbGUiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvZml0cyI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vZml0cyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9nM2ZheCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZzMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvZ2lmIj4KKyAgICAgICAgPGFjcm9ueW0+R0lGPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+R3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0PC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dpZjwvdGlrYTpsaW5rPgorICAgICAgICA8dGlrYTp1dGk+Y29tLmNvbXB1c2VydmUuZ2lmPC90aWthOnV0aT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkdJRjg3YSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iR0lGODlhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdpZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9pZWYiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmllZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcDIiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtanAyLWNvbnRhaW5lciIgLz4KKyAgICAgICAgPGFjcm9ueW0+SlAyPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+SlBFRyAyMDAwIFBhcnQgMSAoSlAyKTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDAwMDBDNkE1MDIwMjAwRDBBODcwQSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg2YTcwMzIyMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwMiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcGVnIj4KKyAgICAgICAgPGFjcm9ueW0+SlBFRzwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkpvaW50IFBob3RvZ3JhcGhpYyBFeHBlcnRzIEdyb3VwPC9fY29tbWVudD4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pwZWc8L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPnB1YmxpYy5qcGVnPC90aWthOnV0aT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8IS0tIEZGRDggaXMgdGhlIFNPSSAoU3RhcnQgT2YgSW1hZ2UpIG1hcmtlci4gICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPCEtLSBJdCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG1hcmtlciB0aGF0IHN0YXJ0cyB3aXRoIEZGLiAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmQ4ZmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanBnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanBlZyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmppZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpmaWYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qZmkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanBtIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9InZpZGVvL2pwbSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtanAyLWNvbnRhaW5lciIgLz4KKyAgICAgICAgPGFjcm9ueW0+SlAyPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+SlBFRyAyMDAwIFBhcnQgNiAoSlBNKTwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDAwMDBDNkE1MDIwMjAwRDBBODcwQSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHg2YTcwNmQyMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZ20iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanB4Ij4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LWpwMi1jb250YWluZXIiIC8+CisgICAgICAgIDxhY3JvbnltPkpQMjwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PkpQRUcgMjAwMCBQYXJ0IDIgKEpQWCk8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwMDAwQzZBNTAyMDIwMEQwQTg3MEEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4NmE3MDc4MjAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qcGYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvbmFwbHBzIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL25pdGYiPgorICAgICAgICA8YWxpYXMgdHlwZT0iaW1hZ2UvbnRmIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJOSVRGMDEuMTAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik5JVEYwMi4wMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik5JVEYwMi4xMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubnRmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioubml0ZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wbmciPgorICAgICAgICA8YWNyb255bT5QTkc8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4ODlQTkdceDBkXHgwYVx4MWFceDBhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBuZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wcnMuYnRpZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYnRpZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvcHJzLnB0aSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9zdmcreG1sIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICAgICAgPGFjcm9ueW0+U1ZHPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+U2NhbGFibGUgVmVjdG9yIEdyYXBoaWNzPC9fY29tbWVudD4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0ic3ZnIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZneiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS90MzgiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvdGlmZiI+CisgICAgICAgIDxhY3JvbnltPlRJRkY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5UYWdnZWQgSW1hZ2UgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDwhLS0gTU0uKiA9IEJpZyBlbmRpYW4gKE09TW90b3JvbGEpIGFuZCAweDAwMmEgaW4gYmlnIGVuZGlhbiAgICAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTU1ceDAwXHgyYSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gSUkqLiA9IExpdHRsZSBlbmRpYW4gKEk9SW50ZWwpIGFuZCAweDAwMmEgaW4gbGl0dGxlIGVuZGlhbiAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iSUlceDJhXHgwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50aWZmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudGlmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3RpZmYtZngiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcCI+CisgICAgICAgIDxhY3JvbnltPlBTRDwvYWNyb255bT4KKyAgICAgICAgPF9jb21tZW50PlBob3Rvc2hvcCBJbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LXBzZCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vcGhvdG9zaG9wIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPCEtLSBWZXJzaW9uIG9mIDB4MDAwMSBpcyBQU0QgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjhCUFNceDAwXHgwMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gVmVyc2lvbiBvZiAweDAwMDIgaXMgUFNCIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSI4QlBTXHgwMFx4MDIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHNkIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5hZG9iZS5wcmVtaWVyZSI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHBqIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlByZW1pZXJlRGF0YSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuY25zLmluZjIiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5kanZ1Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kanZ1Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGp2Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5kd2ciPgorICAgICAgICA8YWNyb255bT5EV0c8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5BdXRvQ2FkIERyYXdpbmc8L19jb21tZW50PgorICAgICAgICA8dGlrYTpsaW5rPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmR3ZzwvdGlrYTpsaW5rPgorICAgICAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1kd2ciLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2FjYWQiLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWNhZCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYXV0b2NhZF9kd2ciLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL2R3ZyIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1kd2ciLz4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0b2NhZCIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iaW1hZ2Uvdm5kLmR3ZyIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iZHJhd2luZy9kd2ciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kd2ciLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1DMC4wIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBQzEuMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQUMxLjQwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBQzEuNTAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFDMi4xMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iQUMyLjIxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBQzIuMjIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tICJBQyIgZm9sbG93ZWQgYnkgZm91ciBudW1iZXJzIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBQzAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkYwRjBGMEYwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5keGYiPgorICAgICAgICA8YWNyb255bT5EWEY8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5BdXRvQ0FEIERYRjwvX2NvbW1lbnQ+CisgICAgICAgIDx0aWthOmxpbms+aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BdXRvQ0FEX0RYRjwvdGlrYTpsaW5rPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR4ZiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmJzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnB4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mcHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5mc3QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZzdCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tbXIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLXJsYyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmxjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZ2xvYmFsZ3JhcGhpY3MucGdiIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiI+CisgICAgICAgIDxhY3JvbnltPklDTzwvYWNyb255bT4KKyAgICAgICAgPHRpa2E6bGluaz5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5pY288L3Rpa2E6bGluaz4KKyAgICAgICAgPHRpa2E6dXRpPmNvbS5taWNyb3NvZnQuaWNvPC90aWthOnV0aT4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtaWNvbiIgLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwxMDJcMTAxXDA1MFwwMDBcMDAwXDAwMFwwNTZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIgorICAgICAgICAgICAgICAgICAgIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlwwMDBcMDAwXDAwMVwwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWNvIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5taXgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5tcy1tb2RpIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZGkiLz4KKyAgICAgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBEb2N1bWVudCBJbWFnaW5nPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4NDU1MDJBMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5uZXQtZnB4Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ucHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5yYWRpYW5jZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnNlYWxlZC5wbmciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5naWYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5qcGciLz4KKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zdmYiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLndhcC53Ym1wIj4KKyAgICAgICAgPF9jb21tZW50PldpcmVsZXNzIEJpdG1hcCBGaWxlIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud2JtcCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQueGlmZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGlmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWNtdS1yYXN0ZXIiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhcyIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1jbXgiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNteCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWZyZWVoYW5kIj4KKyAgICAgICAgPF9jb21tZW50PkZyZWVIYW5kIGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFHRDIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFHRDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkFHRDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZyZWVIYW5kMTAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZyZWVIYW5kMTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZyZWVIYW5kMTIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjI0Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maGMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maDQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maDQwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmg1Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmg1MCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoNyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoOCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoOSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoMTAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5maDExIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmgxMiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0NyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0OCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0OSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0MTAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdDExIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnQxMiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWpwMi1jb2Rlc3RyZWFtIj4KKyAgICAgICAgPF9jb21tZW50PkpQRUcgMjAwMCBDb2Rlc3RyZWFtPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyNSI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmY0ZmZmNTEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouajJjIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtanAyLWNvbnRhaW5lciI+CisgICAgICAgIDxfY29tbWVudD5KUEVHIDIwMDAgQ29udGFpbmVyIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDAwMDBDNkE1MDIwMjAwRDBBODcwQSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1uaWZmIj4KKyAgICAgICAgPF9jb21tZW50Pk5hdnkgSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iSUlOMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wY3giPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjeCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1waWN0Ij4KKyAgICAgICAgPF9jb21tZW50PkFwcGxlIE1hY2ludG9zaCBRdWlja0RyYXcvUElDVCBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDExMDJGRjBDMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI1MjIiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5waWMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wY3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5waWN0Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtYW55bWFwIj4KKyAgICAgICAgPGFjcm9ueW0+UE5NPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+UG9ydGFibGUgQW55IE1hcDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG5tIiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLz4KKyAgICAgICAgPGFjcm9ueW0+UEJNPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+UG9ydGFibGUgQml0IE1hcDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGJtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLz4KKyAgICAgICAgPGFjcm9ueW0+UEdNPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+UG9ydGFibGUgR3JheW1hcCBHcmFwaGljPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCBvZmZzZXQ9IjAiIHR5cGU9InN0cmluZyIgdmFsdWU9Ilx4NTBceDM1XHgwYSIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBnbSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLz4KKyAgICAgICAgPGFjcm9ueW0+UFhNPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+VU5JWCBQb3J0YWJsZSBCaXRtYXAgR3JhcGhpYzwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJQMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlA3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIG9mZnNldD0iMCIgdHlwZT0ic3RyaW5nIiB2YWx1ZT0iXHg1MFx4MzRceDBhIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHBtIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWFkb2JlIj4KKyAgICAgICAgPGFjcm9ueW0+RE5HPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+QWRvYmUgRGlnaXRhbCBOZWdhdGl2ZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZG5nIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWhhc3NlbGJsYWQiPgorICAgICAgICA8X2NvbW1lbnQ+SGFzc2VsYmxhZCByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNmciIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1mdWppIj4KKyAgICAgICAgPF9jb21tZW50PkZ1amkgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yYWYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctY2Fub24iPgorICAgICAgICA8X2NvbW1lbnQ+Q2Fub24gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcnciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcjIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXcta29kYWsiPgorICAgICAgICA8X2NvbW1lbnQ+S29kYWsgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rMjUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5rZGMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kY3MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kcmYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctbWlub2x0YSI+CisgICAgICAgIDxfY29tbWVudD5NaW5vbHRhIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXJ3Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW5pa29uIj4KKyAgICAgICAgPF9jb21tZW50Pk5pa29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubmVmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubnJ3Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW9seW1wdXMiPgorICAgICAgICA8X2NvbW1lbnQ+T2x5bXB1cyByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9yZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1wZW50YXgiPgorICAgICAgICA8X2NvbW1lbnQ+UGVudGF4IHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHR4Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGVmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXNvbnkiPgorICAgICAgICA8X2NvbW1lbnQ+U29ueSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFydyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyMiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1zaWdtYSI+CisgICAgICAgIDxfY29tbWVudD5TaWdtYSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLngzZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1lcHNvbiI+CisgICAgICAgIDxfY29tbWVudD5FcHNvbiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVyZiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1tYW1peWEiPgorICAgICAgICA8X2NvbW1lbnQ+TWFtaXlhIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWVmIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWxlYWYiPgorICAgICAgICA8X2NvbW1lbnQ+TGVhZiByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vcyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1wYW5hc29uaWMiPgorICAgICAgICA8X2NvbW1lbnQ+UGFuYXNvbmljIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmF3Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucncyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXBoYXNlb25lIj4KKyAgICAgICAgPF9jb21tZW50PlBoYXNlIE9uZSByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlpcSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1yZWQiPgorICAgICAgICA8X2NvbW1lbnQ+UmVkIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucjNkIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWltYWNvbiI+CisgICAgICAgIDxfY29tbWVudD5JbWFjb24gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mZmYiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctbG9naXRlY2giPgorICAgICAgICA8X2NvbW1lbnQ+TG9naXRlY2ggcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5weG4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctY2FzaW8iPgorICAgICAgICA8X2NvbW1lbnQ+Q2FzaW8gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5iYXkiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcmF3em9yIj4KKyAgICAgICAgPF9jb21tZW50PlJhd3pvciByYXcgaW1hZ2U8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ3eiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJnYiI+CisgICAgICAgIDxfY29tbWVudD5TaWxpY29uIEdyYXBoaWNzIFJHQiBCaXRtYXA8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCBvZmZzZXQ9IjAiIHR5cGU9InN0cmluZyIgdmFsdWU9Ilx4MDFceGRhXHgwMVx4MDFceDAwXHgwMyIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJnYiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXhiaXRtYXAiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLyogWFBNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhibSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQveC1jIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gteGNmIj4KKyAgICAgICAgPF9jb21tZW50PkdJTVAgSW1hZ2UgRmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94Y2YiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiB2YWx1ZT0iZ2ltcCB4Y2YgIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54Y2YiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14cGl4bWFwIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54cG0iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14d2luZG93ZHVtcCI+CisgICAgICAgIDxfY29tbWVudD5YIFdpbmRvd3MgRHVtcDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHdkIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvY3BpbSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2V4YW1wbGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZXh0ZXJuYWwtYm9keSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9nbG9iYWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWRlbGl2ZXJ5LXN0YXR1cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9nbG9iYWwtZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbC1oZWFkZXJzIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2h0dHAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvaW1kbit4bWwiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9uZXdzIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBhdGg6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iWHJlZjoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJBcnRpY2xlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9wYXJ0aWFsIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvcmZjODIyIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlJlbGF5LVZlcnNpb246IiB0eXBlPSJzdHJpbmdpZ25vcmVjYXNlIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyFcIHJuZXdzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJOIyFcIHJuZXdzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGb3J3YXJkXCB0byIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUGlwZVwgdG8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlJldHVybi1QYXRoOiIgdHlwZT0ic3RyaW5naWdub3JlY2FzZSIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkZyb206IiB0eXBlPSJzdHJpbmdpZ25vcmVjYXNlIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iUmVjZWl2ZWQ6IiB0eXBlPSJzdHJpbmdpZ25vcmVjYXNlIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTWVzc2FnZS1JRDoiIHR5cGU9InN0cmluZ2lnbm9yZWNhc2UiIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJEYXRlOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iTUlNRS1WZXJzaW9uOiIgdHlwZT0ic3RyaW5naWdub3JlY2FzZSIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlgtTm90ZXMtSXRlbToiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1lc3NhZ2UtSUQ6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4MTkyIi8+CisgICAgICAgICAgICA8L21hdGNoPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1pbWUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5taHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5taHRtbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3MtaHR0cCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9zaXAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvc2lwZnJhZyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS90cmFja2luZy1zdGF0dXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvdm5kLnNpLnNpbXAiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvZXhhbXBsZSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC9pZ2VzIj4KKyAgICAgICAgPF9jb21tZW50PkluaXRpYWwgR3JhcGhpY3MgRXhjaGFuZ2UgU3BlY2lmaWNhdGlvbiBGb3JtYXQ8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlncyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlnZXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvbWVzaCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXNoIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWVzaCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpbG8iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmR3ZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHdmIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZHdmeCt4cHMiPgorICAgICAgICA8X2NvbW1lbnQ+QXV0b0NBRCBEZXNpZ24gV2ViIEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHdmeCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZmxhdGxhbmQuM2RtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmdkbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZ2RsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ3MtZ2RsIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ3MuZ2RsIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ3R3Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ndHciLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5tb21sK3htbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLm10cyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXRzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQucGFyYXNvbGlkLnRyYW5zbWl0LmJpbmFyeSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLnBhcmFzb2xpZC50cmFuc21pdC50ZXh0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQudnR1Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52dHUiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdnJtbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3JsIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudnJtbCIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9hcHBsZWRvdWJsZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2J5dGVyYW5nZXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9kaWdlc3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9lbmNyeXB0ZWQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9leGFtcGxlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvaGVhZGVyLXNldCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L21peGVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvcGFyYWxsZWwiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9yZWxhdGVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvcmVwb3J0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvc2lnbmVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvdm9pY2UtbWVzc2FnZSIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYWN0aW9uc2NyaXB0Ij4KKyAgICAgICAgPF9jb21tZW50PkFjdGlvblNjcmlwdCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hZGEiPgorICAgICAgICA8X2NvbW1lbnQ+QWRhIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZGEiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZGIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZHMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hcHBsZXNjcmlwdCI+CisgICAgICAgIDxfY29tbWVudD5BcHBsZVNjcmlwdCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXBwbGVzY3JpcHQiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvYXNwIj4KKyAgICAgICAgPF9jb21tZW50PkFjdGl2ZSBTZXJ2ZXIgUGFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNwIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2FzcGRvdG5ldCI+CisgICAgICAgIDxfY29tbWVudD5BU1AgLk5FVDwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNweCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFzcGVjdGoiPgorICAgICAgICA8X2NvbW1lbnQ+QXNwZWN0SiBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWoiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hc3NlbWJseSI+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtYXNtIi8+CisgICAgICAgIDxfY29tbWVudD5Bc3NlbWJsZXIgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5TIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNtIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2NhbGVuZGFyIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pY3MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pZmIiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICA8X2NvbW1lbnQ+Q2FzY2FkaW5nIFN0eWxlIFNoZWV0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jc3MiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvY3N2Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jc3YiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvZGlyZWN0b3J5Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2RucyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9lY21hc2NyaXB0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2VucmljaGVkIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2V4YW1wbGUiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9odG1sIj4KKyAgICAgICAgPF9jb21tZW50Pkh5cGVyVGV4dCBNYXJrdXAgTGFuZ3VhZ2U8L19jb21tZW50PgorICAgICAgICA8YWNyb255bT5IVE1MPC9hY3JvbnltPgorICAgICAgICA8dGlrYTp1dGk+cHVibGljLmh0bWw8L3Rpa2E6dXRpPgorICAgICAgICA8IS0tIFRJS0EtMzI3OiBpZiB5b3UgZW5jb3VudGVyIHRhZ3MgaW4gdGhlIEhUTUwKKyAgICAgICAgICB3aXRoIG5vIGRlY2xhcmVkIG5hbWVzcGFjZSwgaXQncyBub3QgWEhUTUwsIGl0J3MganVzdAorICAgICAgICAgIGJhZCBIVE1MLCB1bmZvcnR1bmF0ZWx5LgorICAgICAtLT4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iaHRtbCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJIVE1MIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImxpbmsiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iTElOSyIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJib2R5Ii8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkJPRFkiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJQIi8+CisgICAgICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InNjcmlwdCIvPgorICAgICAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJTQ1JJUFQiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZnJhbWVzZXQiLz4KKyAgICAgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iRlJBTUVTRVQiLz4KKyAgICAgICAgPCEtLSBUaGUgbWFnaWMgcHJpb3JpdHkgbmVlZHMgdG8gYmUgbG93ZXIgdGhhbiB0aGF0IG9mIC0tPgorICAgICAgICA8IS0tICBmaWxlcyB3aGljaCBjb250YWluIEhUTUwgd2l0aGluIHRoZW0sIGVnIG1pbWUgZW1haWxzIC0tPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyFET0NUWVBFIEhUTUwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshZG9jdHlwZSBodG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7SEVBRCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2hlYWQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtUSVRMRSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O3RpdGxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgICAgICAgPCEtLSBub3RlIG9uIHRoZSBvZmZzZXQgdmFsdWUgaGVyZTogdGhpcyBjYW4gb25seSBiZSBhcyBiaWcgYXMKKyAgICAgICAgICAgTWltZVR5cGVzI2dldE1pbkxlbmd0aCgpLiBJZiB5b3Ugc2V0IHRoZSBvZmZzZXQgdmFsdWUgdG8gbGFyZ2VyCisgICAgICAgICAgIHRoYW4gdGhhdCBzaXplLCB0aGUgbWFnaWMgd2lsbCBvbmx5IGJlIGNvbXBhcmVkIHRvIHVwIHRvCisgICAgICAgICAgIE1pbWVUeXBlcyNnZXRNaW5MZW5ndGgoKSBieXRlcy4KKyAgICAgICAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2h0bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjgxOTIiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0hUTUwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtCT0RZIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7Ym9keSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0RJViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2RpdiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O1RJVExFIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7dGl0bGUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtoMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0gxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IWRvY3R5cGUgSFRNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyFET0NUWVBFIGh0bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHRtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmh0bSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3Bhcml0eWZlYyIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3BsYWluIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlRoaXMgaXMgVGVYLCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iVGhpcyBpcyBNRVRBRk9OVCwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ii8qIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIvLyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iOzsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8IS0tIFVURi0xNkJFIEJPTSAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZWZmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPCEtLSBVVEYtMTZMRSBCT00gLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwhLS0gVVRGLTggQk9NIC0tPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweGVmYmJiZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKworICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR4dCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jb25mIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2ZnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGVmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubGlzdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmluIi8+CisKKyAgICAgICAgPCEtLSBUSUtBLTg1OiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3N2bi1lb2wtc3R5bGUudHh0IC0tPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSJJTlNUQUxMIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IktFWVMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iTWFrZWZpbGUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iUkVBRE1FIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49ImFicy1saW5rbWFwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49ImFicy1tZW51bGlua3MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hYXJ0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsYXNzcGF0aCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvbmZpZyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN3aWtpIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZGF0YSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRjbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVncm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lbnQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZuIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ncm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Ii5odGFjY2VzcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlodG1sIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouam14Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanVuaXQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qeCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hbmlmZXN0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLk1GIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWV0YSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm4zIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGVuIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG9kIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucG9tIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucHJvamVjdCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnByb3BlcnRpZXMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ybmciLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ybngiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yb2xlcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRsZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR5cGVzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioudm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52c2wiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53c2RkIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGFyZ3MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54Y2F0Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGNvbmYiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54ZWdybSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhncm0iLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54bGV4Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueGxvZyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhtYXAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54cm9sZXMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54c2FtcGxlcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZWIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi54d2VsY29tZSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3Bycy5mYWxsZW5zdGVpbi5yc3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvcHJzLmxpbmVzLnRhZyI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHNjIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JlZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9yZmM4MjItaGVhZGVycyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9yaWNodGV4dCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucnR4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvcnRwLWVuYy1hZXNjbTEyOCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9ydHgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvc2dtbCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2dtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC90MTQwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50c3YiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC90cm9mZiI+CisgICAgICAgIDxfY29tbWVudD5Sb2ZmL25yb2ZmL3Ryb2ZmL2dyb2ZmIFVuZm9ybWF0dGVkIE1hbnVhbCBQYWdlIChVTklYKTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbiIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC10cm9mZi1tZSIvPgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC10cm9mZi1tcyIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iLlxcJnF1b3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSInXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IicuXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IlxcJnF1b3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSInJyciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRyIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioucm9mZiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hbiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1lIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC91bHBmZWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdXJpLWxpc3QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVyaSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVyaXMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51cmxzIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5hYmMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmN1cmwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN1cmwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmN1cmwuZGN1cmwiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRjdXJsIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsLnNjdXJsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zY3VybCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybC5tY3VybCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWN1cmwiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmRtY2xpZW50c2NyaXB0Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5lc21lcnRlYy50aGVtZS1kZXNjcmlwdG9yIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5mbHkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZseSIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZm1pLmZsZXhzdG9yIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbHgiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmdyYXBodml6Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ndiIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuaW4zZC4zZG1sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi4zZG1sIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pbjNkLnNwb3QiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNwb3QiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmlwdGMuYW5wYSI+CisgICAgICAgIDxhY3JvbnltPkFOUEE8L2Fjcm9ueW0+CisgICAgICAgIDxfY29tbWVudD5BbWVyaWNhbiBOZXdzcGFwZXIgUHVibGlzaGVycyBBc3NvY2lhdGlvbiBXaXJlIEZlZWRzPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hbnBhIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceDE2XHgxNlx4MDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5pcHRjLm5ld3NtbCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuaXB0Yy5uaXRmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5sYXRleC16Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5tb3Rvcm9sYS5yZWZsZXgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm1zLW1lZGlhcGFja2FnZSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQubmV0MnBob25lLmNvbW1jZW50ZXIuY29tbWFuZCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuc2kudXJpY2F0YWxvZ3VlIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouamFkIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC50cm9sbHRlY2gubGluZ3Vpc3QiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLndhcC5zaSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLnNsIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC53YXAud21sIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWwiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLndtbHNjcmlwdCI+CisgICAgICAgIDxfY29tbWVudD5XTUwgU2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53bWxzIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hd2siPgorICAgICAgICA8X2NvbW1lbnQ+QVdLIHNjcmlwdDwvX2NvbW1lbnQ+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS9iaW4vZ2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL2Jpbi9nYXdrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS91c3IvYmluL2dhd2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhIC91c3IvYmluL2dhd2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL3Vzci9sb2NhbC9iaW4vZ2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL3Vzci9sb2NhbC9iaW4vZ2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvYmluL2F3ayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL2Jpbi9hd2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL3Vzci9iaW4vYXdrIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjISAvdXNyL2Jpbi9hd2siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXdrIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYmFzaWMiPgorICAgICAgICA8X2NvbW1lbnQ+QmFzaWMgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJhcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkJhcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkJBUyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWMrK2hkciI+CisgICAgICAgIDxfY29tbWVudD5DKysgc291cmNlIGNvZGUgaGVhZGVyPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ocHAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oeHgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oaCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkgiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oKysiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ocCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkhQUCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWMrK3NyYyI+CisgICAgICAgIDxfY29tbWVudD5DKysgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNwcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN4eCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNjIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouQyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmMrKyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLkNQUCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNnaSI+CisgICAgICAgIDxfY29tbWVudD5DR0kgc2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZ2kiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jaGRyIj4KKyAgICAgICAgPF9jb21tZW50PkMgc291cmNlIGNvZGUgaGVhZGVyPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtY2xvanVyZSI+CisgICAgICAgIDxfY29tbWVudD5DbG9qdXJlIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jbGoiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jb2ZmZWVzY3JpcHQiPgorICAgICAgICA8X2NvbW1lbnQ+Q29mZmVlU2NyaXB0IHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jb2ZmZWUiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jc3JjIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9InRleHQveC1jIi8+CisgICAgICAgIDxfY29tbWVudD5DIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtY3NoYXJwIj4KKyAgICAgICAgPF9jb21tZW50PkMjIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jcyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWNvYm9sIj4KKyAgICAgICAgPF9jb21tZW50PkNPQk9MIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jYmwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5DYmwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5DQkwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jb2IiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5Db2IiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5DT0IiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jb2xkZnVzaW9uIj4KKyAgICAgICAgPF9jb21tZW50PkNvbGRGdXNpb24gc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNmbSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNmbWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5jZmMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1jb21tb24tbGlzcCI+CisgICAgICAgIDxfY29tbWVudD5Db21tb24gTGlzcCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2wiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3AiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sc3AiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1kaWZmIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImRpZmZcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iKioqXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9ubHlcIGluXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkNvbW1vblwgc3ViZGlyZWN0b3JpZXM6XCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkluZGV4OiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5kaWZmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGF0Y2giLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1laWZmZWwiPgorICAgICAgICA8X2NvbW1lbnQ+RWlmZmVsIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZW1hY3MtbGlzcCI+CisgICAgICAgIDxfY29tbWVudD5FbWFjcyBMaXNwIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5lbCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWVybGFuZyI+CisgICAgICAgIDxfY29tbWVudD5Fcmxhbmcgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVybCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWV4cGVjdCI+CisgICAgICAgIDxfY29tbWVudD5FeHBlY3QgU2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5leHAiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1mb3J0aCI+CisgICAgICAgIDxfY29tbWVudD5Gb3J0aCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouNHRoIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZm9ydHJhbiI+CisgICAgICAgIDxfY29tbWVudD5Gb3J0cmFuIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouRiIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZvciIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmY3NyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmY5MCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWdvIj4KKyAgICAgICAgPF9jb21tZW50PkdvIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5nbyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWdyb292eSI+CisgICAgICAgIDxfY29tbWVudD5Hcm9vdnkgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdyb292eSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWhhc2tlbGwiPgorICAgICAgICA8X2NvbW1lbnQ+SGFza2VsbCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5saHMiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1pZGwiPgorICAgICAgICA8X2NvbW1lbnQ+SW50ZWZhY2UgRGVmaW5pdGlvbiBMYW5ndWFnZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWRsIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtaW5pIj4KKyAgICAgICAgPF9jb21tZW50PkNvbmZpZ3VyYXRpb24gZmlsZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaW5pIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtamF2YS1zb3VyY2UiPgorICAgICAgICA8X2NvbW1lbnQ+SmF2YSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtamF2YSIgLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qYXZhIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtanNwIj4KKyAgICAgICAgPF9jb21tZW50PkphdmEgU2VydmVyIFBhZ2U8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1odHRwZC1qc3AiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7JUAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDslLS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouanNwIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1sZXNzIj4KKyAgICAgICAgPF9jb21tZW50PkxFU1Mgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxlc3MiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1sZXgiPgorICAgICAgICA8X2NvbW1lbnQ+TGV4L0ZsZXggc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1sb2ciPgorICAgICAgICA8X2NvbW1lbnQ+YXBwbGljYXRpb24gbG9nPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sb2ciLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1sdWEiPgorICAgICAgICA8X2NvbW1lbnQ+THVhIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5sdWEiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1tbCI+CisgICAgICAgIDxfY29tbWVudD5NTCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWwiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1tYXRsYWIiPgorICAgICAgICA8X2NvbW1lbnQ+TWF0bGFiIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ1bmN0aW9uIFsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDwhLS0gPGdsb2IgcGF0dGVybj0iKi5tIi8+IC0gY29uZmxpY3RzIHdpdGggdGV4dC94LW9iamNzcmMgLS0+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1hdGxhYi1kYXRhIj4KKyAgICAgICAgPGNvbW1lbnQ+TUFUTEFCIGRhdGEgZmlsZTwvY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL21hdGxhYi1tYXQiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1BVExBQiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tYXQiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LW1vZHVsYSI+CisgICAgICAgIDxfY29tbWVudD5Nb2R1bGEgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0zIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaTMiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlnIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtb2JqY3NyYyI+CisgICAgICAgIDxfY29tbWVudD5PYmplY3RpdmUtQyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LW9jYW1sIj4KKyAgICAgICAgPF9jb21tZW50Pk9jYW1sIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vY2FtbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1saSIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXBhc2NhbCI+CisgICAgICAgIDxfY29tbWVudD5QYXNjYWwgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnAiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBhcyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLlBBUyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRwciIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXBlcmwiPgorICAgICAgICA8X2NvbW1lbnQ+UGVybCBzY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZXZhbCBcJnF1b3Q7ZXhlYyAvdXNyL2xvY2FsL2Jpbi9wZXJsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS9iaW4vcGVybCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvYmluL2VudiBwZXJsIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIjIS91c3IvYmluL3BlcmwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhL3Vzci9sb2NhbC9iaW4vcGVybCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wbCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWwiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wZXJsIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcGhwIj4KKyAgICAgICAgPF9jb21tZW50PlBIUCBzY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0Oz9waHAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGhwIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucGhwMyIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBocDQiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1wcm9sb2ciPgorICAgICAgICA8X2NvbW1lbnQ+UHJvbG9nIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5wcm8iLz4KKyAgICAgICAgPCEtLSA8Z2xvYiBwYXR0ZXJuPSIqLnBsIi8+IC0gY29uZmxpY3RzIHdpdGggdGV4dC94LXBlcmwgLS0+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcHl0aG9uIj4KKyAgICAgICAgPF9jb21tZW50PlB5dGhvbiBzY3JpcHQ8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEgL2Jpbi9weXRob24iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImV2YWwgJnF1b3Q7ZXhlYyAvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvdXNyL2Jpbi9weXRob24iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhIC91c3IvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZXZhbCAmcXVvdDtleGVjIC91c3IvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iIyEvdXNyL2xvY2FsL2Jpbi9weXRob24iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IiMhIC91c3IvbG9jYWwvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZXZhbCAmcXVvdDtleGVjIC91c3IvbG9jYWwvYmluL3B5dGhvbiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iL2Jpbi9lbnYgcHl0aG9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMSIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtcnN0Ij4KKyAgICAgICAgPF9jb21tZW50PnJlU3RydWN0dXJlZFRleHQgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJlc3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yc3QiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5yZXN0eCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXJleHgiPgorICAgICAgICA8X2NvbW1lbnQ+UmV4eCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmV4eCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXJ1YnkiPgorICAgICAgICA8X2NvbW1lbnQ+UnVieSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucmIiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1zY2FsYSI+CisgICAgICAgIDxfY29tbWVudD5TY2FsYSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc2NhbGEiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1zY2hlbWUiPgorICAgICAgICA8X2NvbW1lbnQ+U2NoZW1lIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5zY20iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1zZWQiPgorICAgICAgICA8X2NvbW1lbnQ+U2VkIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlZCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXNxbCI+CisgICAgICAgIDxfY29tbWVudD5TUUwgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouc3FsIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtc2V0ZXh0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ldHgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1zdHNyYyI+CisgICAgICAgIDxfY29tbWVudD5TbWFsbHRhbGsgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdGNsIj4KKyAgICAgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGNsIi8+CisgICAgICAgIDxfY29tbWVudD5UY2wgc2NyaXB0PC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5pdGsiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50Y2wiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi50ayIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXV1ZW5jb2RlIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi51dSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmJhc2ljIj4KKyAgICAgICAgPF9jb21tZW50PlZpc3VhbCBiYXNpYyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouY2xzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouQ2xzIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouQ0xTIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnJtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouRnJtIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouRlJNIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC94LWJhc2ljIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC12YmRvdG5ldCI+CisgICAgICAgIDxfY29tbWVudD5WQi5ORVQgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZiIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC94LXZiYXNpYyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmJzY3JpcHQiPgorICAgICAgICA8X2NvbW1lbnQ+VkJTY3JpcHQgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZicyIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQveC12YmFzaWMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LXZjYWxlbmRhciI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioudmNzIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmNhcmQiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjZiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IkJFR0lOOlZDQVJEIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmVyaWxvZyI+CisgICAgICAgIDxfY29tbWVudD5WZXJpbG9nIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmhkbCI+CisgICAgICAgIDxfY29tbWVudD5WSERMIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52aGQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi52aGRsIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtd2ViLW1hcmtkb3duIj4KKyAgICAgICAgPF9jb21tZW50Pk1hcmtkb3duIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1kdGV4dCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1rZCIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hcmtkb3duIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gteWFjYyI+CisgICAgICAgIDxfY29tbWVudD5ZYWNjL0Jpc29uIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi55Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gteWFtbCI+CisgICAgICAgIDxfY29tbWVudD5ZQU1MIHNvdXJjZSBjb2RlPC9fY29tbWVudD4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi55YW1sIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ2U2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2dlNyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNnZzYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ3AxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2dwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNncDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ3A0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2dwNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNncDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZ3M3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNncCIvPgorICAgIDwvbWltZS10eXBlPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vM2dwcC10dCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vM2dwcDIiPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cDNnMmEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAzZzJiIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwM2cyYyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi4zZzIiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2JtcGVnIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9idDY1NiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vY2VsYiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vZHYiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2V4YW1wbGUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjEiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgyNjEiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgyNjMiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMtMTk5OCIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2My0yMDAwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjY0Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5oMjY0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9qcGVnIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5qcGd2Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9qcGVnMjAwMCIvPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tajIiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtanAyLWNvbnRhaW5lciIgLz4KKyAgICAgICAgPGFjcm9ueW0+TUoyPC9hY3JvbnltPgorICAgICAgICA8X2NvbW1lbnQ+SlBFRyAyMDAwIFBhcnQgMyAoTW90aW9uIEpQRUcsIE1KMik8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDAwMDAwQzZBNTAyMDIwMEQwQTg3MEEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIj4KKyAgICAgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4NmQ2YTcwMzIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMCIvPgorICAgICAgICAgICAgPC9tYXRjaD4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tajIiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tanAyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wMXMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wMnAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wMnQiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXA0Ij4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXBtcDQxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwbXA0MiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcDQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcDR2Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBnNCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InZpZGVvL3F1aWNrdGltZSIgLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wNHYtZXMiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXBlZyI+CisgICAgICAgIDxfY29tbWVudD5NUEVHIE1vdmllIENsaXA8L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwMFwwMDBcMDAxXDI2MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwMFwwMDBcMDAxXDI3MiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tcGVnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBnIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubXBlIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTF2Ii8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTJ2Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wZWc0LWdlbmVyaWMiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wdiIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbnYiLz4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vb2dnIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBWb3JiaXMgVmlkZW88L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9ndiIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9kYWFsYSI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgRGFhbGEgVmlkZW88L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0idmlkZW8veC1kYWFsYSIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDwhLS0gQXNzdW1lcyBWaWRlbyBzdHJlYW0gY29tZXMgYmVmb3JlIEF1ZGlvLCBtYXkgbm90IGFsd2F5cyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlx4ODBkYWFsYSIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdGhlb3JhIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBUaGVvcmEgVmlkZW88L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0idmlkZW8veC10aGVvcmEiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8IS0tIEFzc3VtZXMgVmlkZW8gc3RyZWFtIGNvbWVzIGJlZm9yZSBBdWRpbywgbWF5IG5vdCBhbHdheXMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5ceDgwdGhlb3JhIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtZGlyYWMiPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFBhY2thZ2VkIERpcmFjIFZpZGVvPC9fY29tbWVudD4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5CQkNEIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZHJjIi8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtb2dtIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBQYWNrYWdlZCBPR00gVmlkZW88L19jb21tZW50PgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDwhLS0gQXNzdW1lcyBWaWRlbyBzdHJlYW0gY29tZXMgYmVmb3JlIEF1ZGlvLCBtYXkgbm90IGFsd2F5cyAtLT4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnZpZGVvIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5vZ20iLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1vZ2d1dnMiPgorICAgICAgICA8X2NvbW1lbnQ+T2dnIFBhY2thZ2VkIFJhdyBVVlMgVmlkZW88L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0idmlkZW8veC1vZ2ctdXZzIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJPZ2dTXDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uVVZTICIgdHlwZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGIgorICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InZpZGVvL29nZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW9nZ3l1diI+CisgICAgICAgIDxfY29tbWVudD5PZ2cgUGFja2FnZWQgUmF3IFlVViBWaWRlbzwvX2NvbW1lbnQ+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ2aWRlby94LW9nZy15dXYiLz4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik9nZ1NcMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cMDAxWVVWIiB0eXBlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8vb2dnIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtb2dncmdiIj4KKyAgICAgICAgPF9jb21tZW50Pk9nZyBQYWNrYWdlZCBSYXcgUkdCIFZpZGVvPC9fY29tbWVudD4KKyAgICAgICAgPGFsaWFzIHR5cGU9InZpZGVvL3gtb2dnLXJnYiIvPgorICAgICAgICA8bWFnaWMgcHJpb3JpdHk9IjYwIj4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnU1wwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlwwMDFSR0IiIHR5cGU9InN0cmluZyIKKyAgICAgICAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ2aWRlby9vZ2ciLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcGFyaXR5ZmVjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9wb2ludGVyIi8+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3F1aWNrdGltZSI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJtb292IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJtZGF0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPCEtLSBHZW5lcmFsIG1hdGNoLCBzcGVjaWZpYyBmdHlwWFhYIG9uZXMgcHJlc2VudCBmb3Igc3VidHlwZXMgLS0+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioucXQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tb3YiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcmF3Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9ydHAtZW5jLWFlc2NtMTI4Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9ydHgiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3NtcHRlMjkybSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdWxwZmVjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92YzEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5jY3R2Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuZGxuYS5tcGVnLXR0cyIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmZ2dCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZnZ0Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaG5zLnZpZGVvIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaXB0dmZvcnVtLjFkcGFyaXR5ZmVjLTEwMTAiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0uMWRwYXJpdHlmZWMtMjAwNSIvPgorICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0xMDEwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaXB0dmZvcnVtLjJkcGFyaXR5ZmVjLTIwMDUiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5pcHR2Zm9ydW0udHRzYXZjIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaXB0dmZvcnVtLnR0c21wZWcyIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubW90b3JvbGEudmlkZW8iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlb3AiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcGVndXJsIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5teHUiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5tNHUiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHl2Ij4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5weXYiLz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5ub2tpYS5pbnRlcmxlYXZlZC1tdWx0aW1lZGlhIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubm9raWEudmlkZW92b2lwIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQub2JqZWN0dmlkZW8iLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWQubXBlZzEiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWQubXBlZzQiLz4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWQuc3dmIi8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwubW92Ii8+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQudml2byI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioudml2Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWY0diI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZjR2Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtZmxjIj4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5mbGMiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1mbGkiPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsaSIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsdiI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJGTFYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmx2Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtam5nIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ilx4OGJKTkciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iiouam5nIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbTR2Ij4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI2MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9ImZ0eXBNNFYgIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwTTRWSCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjQiLz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iZnR5cE00VlAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI0Ii8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubTR2Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8vbXA0IiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1uZyI+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJceDhhTU5HIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgICA8L21hZ2ljPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1uZyIvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLWFzZiI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNmIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXN4Ii8+CisgICAgICAgIDxtYWdpYz4KKyAgICAgICAgICAgIDxtYXRjaCB2YWx1ZT0iMHgzMDI2YjI3NSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd20iPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtIi8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXdtdiI+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idmlkZW8veC1tcy1hc2YiIC8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud212Ii8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNjAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJXaW5kb3dzIE1lZGlhIFZpZGVvIiB0eXBlPSJ1bmljb2RlTEUiIG9mZnNldD0iMDo4MTkyIiAvPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJWQy0xIEFkdmFuY2VkIFByb2ZpbGUiIHR5cGU9InVuaWNvZGVMRSIgb2Zmc2V0PSIwOjgxOTIiIC8+CisgICAgICAgIDwvbWFnaWM+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXdteCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud214Ii8+CisgICAgPC9taW1lLXR5cGU+CisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXd2eCI+CisgICAgICAgIDxnbG9iIHBhdHRlcm49Iioud3Z4Ii8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXN2aWRlbyI+CisgICAgICAgIDxfY29tbWVudD5BdWRpbyBWaWRlbyBJbnRlcmxlYXZlIEZpbGU8L19jb21tZW50PgorICAgICAgICA8YWxpYXMgdHlwZT0idmlkZW8vYXZpIi8+CisgICAgICAgIDxhbGlhcyB0eXBlPSJ2aWRlby9tc3ZpZGVvIi8+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSJSSUZGLi4uLkFWSSAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICAgICAgICA8bWF0Y2ggb2Zmc2V0PSI4IiB0eXBlPSJzdHJpbmciIHZhbHVlPSJceDQxXHg1Nlx4NDlceDIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXZpIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtc2dpLW1vdmllIj4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9Ik1PVkkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICAgIDwvbWFnaWM+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubW92aWUiLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tYXRyb3NrYSI+CisgICAgICAgIDxfY29tbWVudD5NYXRyb3NrYSBNZWRpYSBDb250YWluZXI8L19jb21tZW50PgorICAgICAgICA8IS0tIENvbW1vbiBtYWdpYyBhY3Jvc3MgYWxsIE1hdHJvc2thIHZhcmllbnRzIC0tPgorICAgICAgICA8IS0tIEZvciBmdWxsIGRldGVjdGlvbiwgd2UgbmVlZCBhIGN1c3RvbSBEZXRlY3Rvciwgc2VlIFRJS0EtMTE4MCAtLT4KKyAgICAgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICAgICAgICA8bWF0Y2ggdmFsdWU9IjB4MUE0NURGQTMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgICA8L21hZ2ljPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1hdHJvc2thIj4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LW1hdHJvc2thIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioubWt2IiAvPgorICAgICAgICA8IS0tIE5vdGU6IFRoZSBtYWdpYyB2YWx1ZSBiZWxvdyBpc24ndCBwcmVzZW50IGluIGFsbCBNS1YgZmlsZXMgLS0+CisgICAgICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgICAgICAgPG1hdGNoIHZhbHVlPSIweDFBNDVERkEzOTM0MjgyODg2RDYxNzQ3MjZGNzM2QjYxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgICAgPC9tYWdpYz4KKyAgICA8L21pbWUtdHlwZT4KKyAgICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbWF0cm9za2EiPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbWF0cm9za2EiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5ta2EiIC8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3dlYm0iPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtbWF0cm9za2EiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi53ZWJtIiAvPgorICAgIDwvbWltZS10eXBlPgorCisgICAgPG1pbWUtdHlwZSB0eXBlPSJ4LWNvbmZlcmVuY2UveC1jb29sdGFsayI+CisgICAgICAgIDxfY29tbWVudD5Db29sdGFsayBBdWRpbzwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaWNlIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZmljdGlvbmJvb2sreG1sIj4KKyAgICAgICAgPF9jb21tZW50PkZpY3Rpb25Cb29rIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICAgICAgPHJvb3QtWE1MIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy5ncmlidXNlci5ydS94bWwvZmljdGlvbmJvb2svMi4wIiBsb2NhbE5hbWU9IkZpY3Rpb25Cb29rIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZmIyIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1hc2NpaWRvYyI+CisgICAgICAgIDxfY29tbWVudD5Bc2NpaWRvYyBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYXNjaWlkb2MiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZG9jIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouYWQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZC50eHQiLz4KKyAgICAgICAgPGdsb2IgcGF0dGVybj0iKi5hZG9jLnR4dCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWQiPgorICAgICAgICA8X2NvbW1lbnQ+RCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouZCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWhhbWwiPgorICAgICAgICA8X2NvbW1lbnQ+SEFNTCBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaGFtbCIvPgorICAgICAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8L21pbWUtdHlwZT4KKworICAgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWhheGUiPgorICAgICAgICA8X2NvbW1lbnQ+SGF4ZSBzb3VyY2UgY29kZTwvX2NvbW1lbnQ+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IiouaHgiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9InRleHQveC1yc3JjIj4KKyAgICAgICAgPF9jb21tZW50PlIgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnIiLz4KKyAgICAgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPC9taW1lLXR5cGU+CisKKyAgICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hxdWVyeSI+CisgICAgICAgIDxfY29tbWVudD5YUXVlcnkgc291cmNlIGNvZGU8L19jb21tZW50PgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhxIi8+CisgICAgICAgIDxnbG9iIHBhdHRlcm49IioueHF1ZXJ5Ii8+CisgICAgICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDwvbWltZS10eXBlPgorCis8L21pbWUtaW5mbz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0NzZjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvb3BzdWkvcG9tLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi8uLi9jb3JlPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5vcHN1aS1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+bWF2ZW4tYXJjaGV0eXBlPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+T09EVCA6OiBBcmNoZXR5cGVzIDo6IE9wc1VJPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8ZXh0ZW5zaW9ucz4KKyAgICAgIDxleHRlbnNpb24+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uYXJjaGV0eXBlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hcmNoZXR5cGUtcGFja2FnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtNTwvdmVyc2lvbj4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvZXh0ZW5zaW9ucz4KKworICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgPHBsdWdpbnM+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGV0eXBlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtNTwvdmVyc2lvbj4KKyAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9vcHN1aS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI3NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9vcHN1aS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hcmNoZXR5cGUtZGVzY3JpcHRvci0xLjAuMC54c2QiIG5hbWU9Im9wc3VpIgorICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KKyAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyoueG1sPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+Cis8L2FyY2hldHlwZS1kZXNjcmlwdG9yPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9vcHN1aS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9vcHN1aS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzE0ODgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPjxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKw0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+DQorICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KKyAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4NCisgIDxuYW1lPk9wcyBVSTwvbmFtZT4NCisNCisgIDxidWlsZD4NCisgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnNyYy90ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5Pg0KKyAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorDQorICAgIDxyZXNvdXJjZXM+DQorICAgICAgPHJlc291cmNlPg0KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCisgICAgICA8L3Jlc291cmNlPg0KKyAgICAgIDxyZXNvdXJjZT4NCisgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KKyAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICA8aW5jbHVkZT4qKjwvaW5jbHVkZT4NCisgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8ZXhjbHVkZXM+DQorICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4NCisgICAgICAgIDwvZXhjbHVkZXM+DQorICAgICAgPC9yZXNvdXJjZT4NCisgICAgPC9yZXNvdXJjZXM+DQorDQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+Mi4xLjE8L3ZlcnNpb24+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPG92ZXJsYXlzPg0KKyAgICAgICAgICAgIDxvdmVybGF5Pg0KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPg0KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGNzLW9wc3VpPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDwvb3ZlcmxheT4NCisgICAgICAgICAgPC9vdmVybGF5cz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgPC9idWlsZD4NCisNCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5wY3Mtb3BzdWk8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4NCisgICAgICA8dHlwZT53YXI8L3R5cGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvb3BzdWkvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjBjMzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDc4IEBACisjc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKKyNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKKyNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL29wc3VpIj4KKwkJCisJPFBhcmFtZXRlciBuYW1lPSJmaWxlbWdyLnVybCIKKwkgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iLz4JCQorCQkKKwk8UGFyYW1ldGVyIG5hbWU9IndvcmtmbG93LnVybCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19VUkxdIi8+CisKKwk8UGFyYW1ldGVyIG5hbWU9InJlc21nci51cmwiCisJICAgIHZhbHVlPSJbUkVTTUdSX1VSTF0iLz4KKworCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS53b3JrZmxvdy5saWZlY3ljbGVGaWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctbGlmZWN5Y2xlLnhtbCIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkud2luc3Quc3RhdHVzZXMiCisJICAgIHZhbHVlPSJRVUVVRUQsIFJTVUJNSVQsIEJVSUxESU5HIENPTkZJRyBGSUxFLCBQR0UgRVhFQywgQ1JBV0xJTkcsIFNUQUdJTkcgSU5QVVQsIEZJTklTSEVELCBTVEFSVEVELCBQQVVTRUQiLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLndpbnN0Lm1ldEZpZWxkcy5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctaW5zdGFuY2UtbWV0LnhtbCIvPiAgIAorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLmNyYXdsZXIuY29uZi5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltQQ1NfSE9NRV0vYXV4L3Bjcy9wY3MtY3Jhd2xlcnMueG1sIi8+CisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGgud29ya2Zsb3cuc3RhdHVzZXMuZmlsZVBhdGgiCisJICAgIHZhbHVlPSJbUENTX0hPTUVdL2F1eC9wY3MvcGNzLXdvcmtmbG93LXN0YXR1c2VzLnhtbCIvPgkgICAgCisJIAorCTxQYXJhbWV0ZXIgbmFtZT0iZ2FuZ2xpYS51cmwiIHZhbHVlPSJbR0FOR0xJQV9VUkxdIi8+CisJPFBhcmFtZXRlciBuYW1lPSJjb250YWN0LmVtYWlsIiB2YWx1ZT0idXNlckBvb2R0LmFwYWNoZS5vcmciLz4KKwkKKwk8UGFyYW1ldGVyIG5hbWU9Im9wc3VpLnNraW4iIHZhbHVlPSIiLz4KKwk8UGFyYW1ldGVyIG5hbWU9Im9wc3VpLmhvbWVwYWdlIiB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5Ib21lUGFnZSIvPiAgIAorCisgICAgPCEtLSAgbmVlZGVkIGJ5IEN1cmF0aW9uIFNlcnZpY2VzIC0tPiAgICAgICAgICAKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRFeHRyYWN0b3JDb25mLnVwbG9hZFBhdGgiCisgICAgICAgIHZhbHVlPSJbT09EVF9IT01FXS9leHRyYWN0b3JzIiAvPgorCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuZGF0YURlZmluaXRpb24udXBsb2FkUGF0aCIKKyAgICAgICAgdmFsdWU9IltGSUxFTUdSX0hPTUVdL3BvbGljeSIgLz4KKyAgICAgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3Iuc3RhZ2luZ0FyZWFQYXRoIgorICAgICAgICB2YWx1ZT0iW09PRFRfSE9NRV0vZGF0YS9zdGFnaW5nIi8+CisgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0QXJlYVBhdGgiCisgICAgICAgIHZhbHVlPSJbT09EVF9IT01FXS9kYXRhL21ldCIvPgorICAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmZtUHJvcHMiCisgICAgICAgIHZhbHVlPSJbRklMRU1HUl9IT01FXS9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzIi8+CisgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0RXh0ZW5zaW9uIgorICAgICAgICB2YWx1ZT0iLm1ldCIvPgorCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZtLnVybCIKKyAgICAgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iLz4KKyAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmNhdGFsb2dGYWN0b3J5Q2xhc3MiIAorICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5IiAvPgorCis8L0NvbnRleHQ+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9iYXNpYy9hcmNoZXR5cGUucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvb3BzdWkvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2plY3RzL2Jhc2ljL2FyY2hldHlwZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTQwNmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL29wc3VpL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9iYXNpYy9hcmNoZXR5cGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjVHVlIE5vdiAwOCAyMToyMzozNSBQU1QgMjAxMQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit2ZXJzaW9uPTAuMS1TTkFQU0hPVAorZ3JvdXBJZD1hcmNoZXR5cGUuaXQKK2FydGlmYWN0SWQ9YmFzaWMKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvb3BzdWkvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2plY3RzL2Jhc2ljL2dvYWwudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9vcHN1aS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvamVjdHMvYmFzaWMvZ29hbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxYzdlNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvb3BzdWkvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2plY3RzL2Jhc2ljL2dvYWwudHh0CkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZlODNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9wb20ueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZTwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5hcmNoZXR5cGVzPC9hcnRpZmFjdElkPgorICA8bmFtZT5PT0RUIDo6IEFyY2hldHlwZXM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5XYXlzIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgd2l0aCBzb21lIG9mIE9PRFQncyBjb21wb25lbnRzPC9kZXNjcmlwdGlvbj4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPm9wc3VpPC9tb2R1bGU+CisgICAgPG1vZHVsZT5yYWRpeDwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ2NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9wb20ueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi8uLi9jb3JlPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5yYWRpeC1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+bWF2ZW4tYXJjaGV0eXBlPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+T09EVCA6OiBBcmNoZXR5cGVzIDo6IFJBRGlYPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8ZXh0ZW5zaW9ucz4KKyAgICAgIDxleHRlbnNpb24+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uYXJjaGV0eXBlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hcmNoZXR5cGUtcGFja2FnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtNTwvdmVyc2lvbj4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvZXh0ZW5zaW9ucz4KKworICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgPHBsdWdpbnM+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGV0eXBlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtNTwvdmVyc2lvbj4KKyAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJiYmEzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApAQCAtMCwwICsxLDE0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhcmNoZXR5cGUtZGVzY3JpcHRvciB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXJjaGV0eXBlLWRlc2NyaXB0b3ItMS4wLjAueHNkIiBuYW1lPSJyYWRpeC1kbXMiCisgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KKyAgPHJlcXVpcmVkUHJvcGVydGllcz4KKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9Im9vZHQiPgorICAgICAgPGRlZmF1bHRWYWx1ZT4wLjctU05BUFNIT1Q8L2RlZmF1bHRWYWx1ZT4KKyAgICA8L3JlcXVpcmVkUHJvcGVydHk+CisgIDwvcmVxdWlyZWRQcm9wZXJ0aWVzPgorICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJmYWxzZSI+CisgICAgICA8ZGlyZWN0b3J5PjwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5SRUFETUUudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+CisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGUgaWQ9ImV4dGVuc2lvbnMiIGRpcj0iZXh0ZW5zaW9ucyIgbmFtZT0iZXh0ZW5zaW9ucyI+CisgICAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgPGluY2x1ZGVzLz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgPC9maWxlU2V0cz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIGlkPSJyZXNtZ3IiIGRpcj0icmVzbWdyIiBuYW1lPSJyZXNtZ3IiPgorICAgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICA8ZGlyZWN0b3J5PjwvZGlyZWN0b3J5PgorICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgIDwvZmlsZVNldHM+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBpZD0icGNzIiBkaXI9InBjcyIgbmFtZT0icGNzIj4KKyAgICAgIDxmaWxlU2V0cz4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgPGRpcmVjdG9yeT48L2RpcmVjdG9yeT4KKyAgICAgICAgICA8aW5jbHVkZXMvPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICA8L2ZpbGVTZXRzPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgaWQ9ImZpbGVtZ3IiIGRpcj0iZmlsZW1nciIgbmFtZT0iZmlsZW1nciI+CisgICAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgPGluY2x1ZGVzLz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgPC9maWxlU2V0cz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIGlkPSJ3b3JrZmxvdyIgZGlyPSJ3b3JrZmxvdyIgbmFtZT0id29ya2Zsb3ciPgorICAgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICA8ZGlyZWN0b3J5PjwvZGlyZWN0b3J5PgorICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgIDwvZmlsZVNldHM+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBpZD0icGdlIiBkaXI9InBnZSIgbmFtZT0icGdlIj4KKyAgICAgIDxmaWxlU2V0cz4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgPGRpcmVjdG9yeT48L2RpcmVjdG9yeT4KKyAgICAgICAgICA8aW5jbHVkZXMvPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICA8L2ZpbGVTZXRzPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgaWQ9ImNyYXdsZXIiIGRpcj0iY3Jhd2xlciIgbmFtZT0iY3Jhd2xlciI+CisgICAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgPGluY2x1ZGVzLz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgPC9maWxlU2V0cz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIGlkPSJzb2xyIiBkaXI9InNvbHIiIG5hbWU9InNvbHIiPgorICAgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICA8ZGlyZWN0b3J5PjwvZGlyZWN0b3J5PgorICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgIDwvZmlsZVNldHM+CisgICAgPC9tb2R1bGU+ICAgIAorICAgIDxtb2R1bGUgaWQ9ImRpc3RyaWJ1dGlvbiIgZGlyPSJkaXN0cmlidXRpb24iIG5hbWU9ImRpc3RyaWJ1dGlvbiI+CisgICAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgPGluY2x1ZGVzLz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgPC9maWxlU2V0cz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIGlkPSJ3ZWJhcHBzIiBkaXI9IndlYmFwcHMiIG5hbWU9IndlYmFwcHMiPgorICAgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGUgaWQ9Im9wc3VpIiBkaXI9Im9wc3VpIiBuYW1lPSJvcHN1aSI+CisgICAgICAgICAgPGZpbGVTZXRzPgorICAgICAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgICAgPC9maWxlU2V0cz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgaWQ9InBjcy1zZXJ2aWNlcyIgZGlyPSJwY3Mtc2VydmljZXMiIG5hbWU9InBjcy1zZXJ2aWNlcyI+CisgICAgICAgICAgPGZpbGVTZXRzPgorICAgICAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgICAgPC9maWxlU2V0cz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgaWQ9ImZtcHJvZCIgZGlyPSJmbXByb2QiIG5hbWU9ImZtcHJvZCI+CisgICAgICAgICAgPGZpbGVTZXRzPgorICAgICAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgICAgPC9maWxlU2V0cz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgaWQ9InNvbHItd2ViYXBwIiBkaXI9InNvbHItd2ViYXBwIiBuYW1lPSJzb2xyLXdlYmFwcCI+CisgICAgICAgICAgPGZpbGVTZXRzPgorICAgICAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgIDxpbmNsdWRlcy8+CisgICAgICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgICAgPC9maWxlU2V0cz4KKyAgICAgICAgPC9tb2R1bGU+ICAgICAgICAKKyAgICAgIDwvbW9kdWxlcz4KKyAgICA8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNhMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNTMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgIE9PRFQgUkFEaVggUkVBRE1FCisjCisjICAgICBEZXNjcmlwdGlvbjoKKyMgICAgICAgCVRoaXMgcHJvamVjdCBpcyBtZWFudCBhcyB0ZW1wbGF0ZSB0byBzdXBwb3J0IGZhc3RlcgorIyAgICAgICBkYXRhIHN5c3RlbSBkZXBsb3ltZW50LiBDb25maWd1cmFibGUgT09EVCBkZXBsb3ltZW50cworIyAgICAgICBhcmUgcG9zc2libGUgdXNpbmcgTWF2ZW4gcHJvZmlsZXMgKHNlZSBiZWxvdykuCisjICAgICAgIAorIyAgICAgICBPT0RUIHZlcnNpb24gMC43LVNOQVBTSE9UIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUkVRVUlSRU1FTlRTOgorKiBKYXZhIERldmVsb3BtZW50IEtpdCAoSkRLKSAxLjYrCisqIEpBVkFfSE9NRSBzZXQgCisgIHNlZTogaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9jZC9FMTkxODItMDEvODIwLTc4NTEvaW5zdF9jbGlfamRrX2phdmFob21lX3QvaW5kZXguaHRtbAorKiAoU25hcHNob3QgcmVsZWFzZXMgb25seSkgT09EVCBzb3VyY2UgdHJlZSBpbnN0YWxsZWQuIAorICBzZWU6IGh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvY29tcG9uZW50cy9tYXZlbi9maWxlbWdyL3VzZXIvYmFzaWMuaHRtbAorCitJTlNUQUxMQVRJT046CisgICMgYnVpbGQgb29kdAorICAkIG12biBjbGVhbiBwYWNrYWdlIDxPUFRJT05BTCBQUk9GSUxFUz4gIyBzZWUgb3B0aW9uYWwgYnVpbGQgcHJvZmlsZXMgYmVsb3cKKworICAjIGRlcGxveSBvb2R0CisgICQgdGFyIHp4ZiBkaXN0cmlidXRpb24vdGFyZ2V0LyR7UFJPSkVDVF9BUlRJRkFDVF9JRH0tZGlzdHJpYnV0aW9uLSotYmluLnRhci5neiAtQyAvbXkvZGVwbG95bWVudC9kaXJlY3Rvcnkvb29kdAorICAKKyAgLS0tCisgIE5PVEU6IEZvciBvdGhlciBidWlsZCBjb25maWd1cmF0aW9ucywgYWRkIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICAoZGVmYXVsdCkgICAgICAgICAgIDogYmluLCBjcmF3bGVyLCBkYXRhLCBleHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW1nciAoTHVjZW5lKSwgbG9ncywgcGNzLCByZXNtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICB0b21jYXQsIHdvcmtmbG93LCBwZ2UKKworICAtUGZtLXNvbHItY2F0YWxvZyAgIDogZGVmYXVsdCBjb21wb25lbnRzLCBmaWxlbWdyIChTb2xyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvbHIsIHRvbWNhdC93ZWJhcHBzL3NvbHIKKworUlVOOgorICAkIGNkIC9teS9kZXBsb3ltZW50L2RpcmVjdG9yeS9vb2R0CisgICQgY2QgYmluCisgICQgLi9vb2R0IHN0YXJ0CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDMzZDYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvcG9tLnhtbApAQCAtMCwwICsxLDgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8bmFtZT5DcmF3bGVyIChBcGFjaGUgT09EVCk8L25hbWU+CisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LSR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LWV4dGVuc2lvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHR5cGU+amFyPC90eXBlPgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtY3Jhd2xlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7b29kdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MTEyZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw3NSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorICA8aWQ+YmluPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT5jcmF3bGVyPC9iYXNlRGlyZWN0b3J5PgorICA8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5PgorICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Q0hBTkdFUy50eHQ8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvYmluPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNyYXdsZXIvYmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9sb2dzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNyYXdsZXIvbG9nczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5SRU1PVkUubG9nPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V0YzwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5jcmF3bGVyL2V0Yzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5jcmF3bGVyL3BvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zaXRlL2FwaWRvY3M8L2RpcmVjdG9yeT4KKyAgICAgIDxmaWx0ZXJlZD5mYWxzZTwvZmlsdGVyZWQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+CisgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Y3Jhd2xlci9saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vY3Jhd2xjdGwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9jcmF3bGN0bApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYzk5NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vY3Jhd2xjdGwKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitqYXZhIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9Li4vZXRjL2xvZ2dpbmcucHJvcGVydGllcyAtRGphdmEuZXh0LmRpcnM9Li4vbGliIG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuZGFlbW9uLkNyYXdsRGFlbW9uQ29udHJvbGxlciAkQApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vY3Jhd2xlcl9sYXVuY2hlciBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL2NyYXdsZXJfbGF1bmNoZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDE5ODYxNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL2NyYXdsZXJfbGF1bmNoZXIKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorZGFyd2luPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK0RhcndpbiopIGRhcndpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IE9PRFRfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRPT0RUX0hPTUUiIF0gJiYgT09EVF9IT01FPWBjZCAiJFBSR0RJUi8uLi8uLiIgOyBwd2RgCisKKyMgR2V0IE9PRFQgZW52aXJvbm1lbnQgc2V0IHVwCitpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vZW52LnNoIF07IHRoZW4KKyAgLiAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaAorZmkKKworIyBPbmx5IHNldCBDUkFXTEVSX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitpZiBbIC16ICIkQ1JBV0xFUl9IT01FIiBdOyB0aGVuCisgIENSQVdMRVJfSE9NRT0iJE9PRFRfSE9NRSIvY3Jhd2xlcgorICBleHBvcnQgQ1JBV0xFUl9IT01FCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJEpSRV9IT01FIiBdICYmIEpSRV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpSRV9IT01FImAKKyAgWyAtbiAiJE9PRFRfSE9NRSIgXSAmJiBPT0RUX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkT09EVF9IT01FImAKKyAgWyAtbiAiJENSQVdMRVJfSE9NRSIgXSAmJiBDUkFXTEVSX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkQ1JBV0xFUl9IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCisjIEluIGNhc2UgdGhpcyBzY3JpcHQgd2FzIHJ1biBmcm9tIHNvbWV3aGVyZSBlbHNlIGNkIHRvIHRoaXMgZGlyZWN0b3J5CitjZCAiJENSQVdMRVJfSE9NRSIvYmluCisKKyIkX1JVTkpBVkEiICRKQVZBX09QVFMgJE9PRFRfT1BUUyBcCisgICAtRGphdmEuZXh0LmRpcnM9IiRDUkFXTEVSX0hPTUUiL2xpYiBcCisgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSIkQ1JBV0xFUl9IT01FIi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5iZWFuLnJlcG89ZmlsZToiJENSQVdMRVJfSE9NRSIvcG9saWN5L2NyYXdsZXItY29uZmlnLnhtbCBcCisgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnPWZpbGU6IiRDUkFXTEVSX0hPTUUiL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBcCisgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnPWZpbGU6IiRDUkFXTEVSX0hPTUUiL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBcCisgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5DcmF3bGVyTGF1bmNoZXIgIiRAIgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2E4NTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2MyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgZGVmYXVsdCBmaWxlIG91dHB1dCBpcyBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuID0gLi4vbG9ncy9jYXNfY3Jhd2xlciVnLmxvZworamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGltaXQgPSA1MDAwMAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuY291bnQgPSA1CitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5hcHBlbmQgPSB0cnVlCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBzdWJzeXN0ZW1zCisKK29yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wubGV2ZWwgPSBBTEwKKworb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24ubGV2ZWwgPSBBTEwKKworb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC50eXBlZGV0ZWN0aW9uLmxldmVsID0gQUxMCisKK29yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5sZXZlbCA9IEFMTAorCitvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNvbmZpZy5sZXZlbCA9IEFMTAorCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjIAorb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmxldmVsID0gSU5GTworCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5Qcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlci5sZXZlbCA9IFNFVkVSRQorb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC51dGlsLkNhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gU0VWRVJFCitzdW4ubmV0LmxldmVsID0gU0VWRVJFCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9ncy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTU0OTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDE4IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitZb3UgY2FuIHJlbW92ZSB0aGlzIGZpbGUuIEl0IHdhcyBvbmx5IGluY2x1ZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2cgZGlyZWN0b3J5IGZvciB0aGlzCitkaXN0cmlidXRpb24gd2FzIGNyZWF0ZWQgb24gYXNzZW1ibHkuCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9hY3Rpb24tYmVhbnMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvYWN0aW9uLWJlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQyYzJkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvYWN0aW9uLWJlYW5zLnhtbApAQCAtMCwwICsxLDIyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLnBvc3Rwcm9jZXNzb3IuU2V0SWRCZWFuUG9zdFByb2Nlc3NvciIgLz4KKyAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC51dGlsLkNhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyIj4KKworICAgICAgICA8IS0tIEFsbG93IGZvciBzeXN0ZW0tbGV2ZWwgcHJvcGVydGllcyB0byBvdmVycmlkZSBhbGwgcHJvcGVydGllcyBiZWxvdyAtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN5c3RlbVByb3BlcnRpZXNNb2RlIiB2YWx1ZT0iMiIgLz4KKworICAgICAgICA8IS0tIERlZmF1bHQgUHJvcGVydGllcyAtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgPHByb3BzPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0iY3Jhd2xlci5mYWlsdXJlLmRpciI+W0ZBSUxVUkVfRElSXTwvcHJvcD4KKyAgICAgICAgICAgICAgICA8cHJvcCBrZXk9ImNyYXdsZXIuYmFja3VwLmRpciI+W0JBQ0tVUF9ESVJdPC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0iY3Jhd2xlci53b3JrZmxvd21nci51cmwiPltXT1JLRkxPV19VUkxdPC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0iY3Jhd2xlci5maWxlbWdyLnVybCI+W0ZJTEVNR1JfVVJMXTwvcHJvcD4KKyAgICAgICAgICAgICAgICA8cHJvcCBrZXk9ImNyYXdsZXIuY2xpZW50LnRyYW5zZmVyZXIiPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5PC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0iY3Jhd2xlci5tZXQuZmlsZS5leHQiPm1ldDwvcHJvcD4KKyAgICAgICAgICAgICAgICA8cHJvcCBrZXk9ImNyYXdsZXIucHVzaHB1bGwubWV0LmZpbGUuZXh0Ij5bUFVTSFBVTExfTUVUX0ZJTEVfRVhUXTwvcHJvcD4KKyAgICAgICAgICAgICAgICA8cHJvcCBrZXk9ImNyYXdsZXIuYW5jLmZpbGUuZXh0Ij5hbmM8L3Byb3A+CisgICAgICAgICAgICAgICAgPHByb3Aga2V5PSJjcmF3bGVyLmFuYy5maWxlLnN1ZmZpeCI+PC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0ibm90aWZpY2F0aW9uLm1haWwuaG9zdCI+PC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0ibm90aWZpY2F0aW9uLnNlbmRlciI+PC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0ibm90aWZpY2F0aW9uLnN1Y2Nlc3Muc3ViamVjdCI+PC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0ibm90aWZpY2F0aW9uLnN1Y2Nlc3MubWVzc2FnZSI+PC9wcm9wPgorICAgICAgICAgICAgICAgIDxwcm9wIGtleT0ibm90aWZpY2F0aW9uLnN1Y2Nlc3MucmVjaXBpZW50cyI+PC9wcm9wPgorICAgICAgICAgICAgPC9wcm9wcz4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKworICAgICAgICA8IS0tIEZpbGUgUHJvcGVydGllcyAtIG92ZXJyaWRlcyBkZWZhdWx0IHByb3BlcnRpZXMgLS0+CisgICAgICAgIDwhLS0gcHJvcGVydHkgbmFtZT0ibG9jYXRpb24iIHZhbHVlPSIvb3JnL2FwYWNoZS9vb2R0L2Nhcy9jcmF3bC9jcmF3bGVyLnByb3BlcnRpZXMiIAorICAgICAgICAgICAgLyAtLT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIERFTEVURSBBY3Rpb25zIC0tPgorICAgIDxiZWFuIGlkPSJEZWxldGVEYXRhRmlsZSIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRGVsZXRlRmlsZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlbGV0ZXMgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9IkRlbGV0ZU1ldGFkYXRhRmlsZSIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRGVsZXRlRmlsZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlbGV0ZXMgdGhlIG1ldGFkYXRhIGZpbGUgZm9yIHRoZSBjdXJyZW50IGRhdGEgZmlsZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSIke2NyYXdsZXIubWV0LmZpbGUuZXh0fSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cG9zdEluZ2VzdFN1Y2Nlc3M8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJEZWxldGVQdXNocHVsbE1ldEZpbGUiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkRlbGV0ZUZpbGUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWxldGVzIHRoZSBwdXNoLXB1bGwgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7Y3Jhd2xlci5wdXNocHVsbC5tZXQuZmlsZS5leHR9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBNT1ZFIHRvIEZBSUxVUkVfRElSIEFjdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9Ik1vdmVEYXRhRmlsZVRvRmFpbHVyZURpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gZmFpbHVyZSBkaXJlY3RvcnkiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b0RpciIgdmFsdWU9IiR7Y3Jhd2xlci5mYWlsdXJlLmRpcn0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjcmVhdGVUb0RpciIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RGYWlsdXJlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0iTW92ZU1ldGFkYXRhRmlsZVRvRmFpbHVyZURpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIHRvIGZhaWx1cmUgZGlyZWN0b3J5IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7Y3Jhd2xlci5tZXQuZmlsZS5leHR9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9EaXIiIHZhbHVlPSIke2NyYXdsZXIuZmFpbHVyZS5kaXJ9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3JlYXRlVG9EaXIiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0RmFpbHVyZTwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9Ik1vdmVQdXNocHVsbE1ldEZpbGVUb0ZhaWx1cmVEaXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLk1vdmVGaWxlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTW92ZXMgdGhlIHB1c2gtcHVsbCBtZXRhZGF0YSBmaWxlIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gZmFpbHVyZSBkaXJlY3RvcnkiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjcmVhdGVUb0RpciIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLnB1c2hwdWxsLm1ldC5maWxlLmV4dH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b0RpciIgdmFsdWU9IiR7Y3Jhd2xlci5mYWlsdXJlLmRpcn0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RGYWlsdXJlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIE1PVkUgdG8gQkFDS1VQX0RJUiBBY3Rpb25zIC0tPgorICAgIDxiZWFuIGlkPSJNb3ZlUHVzaHB1bGxNZXRGaWxlVG9CYWNrdXBEaXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLk1vdmVGaWxlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTW92ZXMgdGhlIHB1c2gtcHVsbCBtZXRhZGF0YSBmaWxlIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gc3VjY2VzcyBkaXJlY3RvcnkiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLnB1c2hwdWxsLm1ldC5maWxlLmV4dH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b0RpciIgdmFsdWU9IiR7Y3Jhd2xlci5iYWNrdXAuZGlyfSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNyZWF0ZVRvRGlyIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cG9zdEluZ2VzdFN1Y2Nlc3M8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJNb3ZlTWV0YWRhdGFGaWxlVG9CYWNrdXBEaXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLk1vdmVGaWxlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTW92ZXMgdGhlIG1ldGFkYXRhIGZpbGUgZm9yIHRoZSBjdXJyZW50IGRhdGEgZmlsZSB0byBzdWNjZXNzIGRpcmVjdG9yeSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSIke2NyYXdsZXIubWV0LmZpbGUuZXh0fSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvRGlyIiB2YWx1ZT0iJHtjcmF3bGVyLmJhY2t1cC5kaXJ9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3JlYXRlVG9EaXIiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBXb3JrZmxvdyBNYW5hZ2VyIEFjdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9IlRyaWdnZXJQb3N0SW5nZXN0V29ya2Zsb3ciIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLldvcmtmbG93TWdyU3RhdHVzVXBkYXRlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgd29ya2Zsb3cgZXZlbnQgd2l0aCB0aGUgbmFtZSBbUHJvZHVjdFR5cGVdSW5nZXN0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaW5nZXN0U3VmZml4IiB2YWx1ZT0iSW5nZXN0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0id29ya2Zsb3dNZ3JVcmwiIHZhbHVlPSIke2NyYXdsZXIud29ya2Zsb3dtZ3IudXJsfSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cG9zdEluZ2VzdFN1Y2Nlc3M8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gRmlsZSBNYW5hZ2VyIEFjdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9IlVuaXF1ZSIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRmlsZW1nclVuaXF1ZW5lc3NDaGVja2VyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2tzIHRoZSBmaWxlbWdyIGFnYWluc3QgdGhlIFBST0RVQ1RfTkFNRSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIHRvIG1ha2Ugc3VyZSBpdCBoYXMgbm90IHlldCBiZWVuIGluZ2VzdGVkIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZmlsZW1nclVybCIgdmFsdWU9IiR7Y3Jhd2xlci5maWxlbWdyLnVybH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnByZUluZ2VzdDwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9IkluZ2VzdEFuY2lsbGFyeUZpbGUiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkluZ2VzdEFuY2lsbGFyeSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRoaXMgd2lsbCBpbmdlc3QgYW4gYXNzb2NpYXRlZCBmaWxlIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgZmlsZSBiZWluZyBpbmdlc3RlZCBieSB0aGUgY3Jhd2xlci4iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlTWFuYWdlclVybCIgdmFsdWU9IiR7Y3Jhd2xlci5maWxlbWdyLnVybH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLmFuYy5maWxlLmV4dH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlU3VmZml4IiB2YWx1ZT0iJHtjcmF3bGVyLmFuYy5maWxlLnN1ZmZpeH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJrZWVwRXhpc3RpbmdFeHRlbnNpb24iPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIj5mYWxzZTwvdmFsdWU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhVHJhbnNmZXJTZXJ2aWNlIiB2YWx1ZT0iJHtjcmF3bGVyLmNsaWVudC50cmFuc2ZlcmVyfSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlbGF0ZWRLZXkiIHZhbHVlPSJDQVMuUHJvZHVjdElkIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29weUtleXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPk1ldEtleTE8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvZHVjdFR5cGUiIHZhbHVlPSJHZW5lcmljRmlsZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZhaWxNaXNzaW5nRmlsZSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iPnRydWU8L3ZhbHVlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wcmVJbmdlc3Q8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gRXhpc3RlbmNlIENoZWNrIEFjdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9IkNoZWNrTWV0RmlsZUV4aXN0cyIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRXh0ZXJuQWN0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2tzIGlmIG1ldGFkYXRhIGZpbGUgd2FzIGNyZWF0ZWQgLS0gbWFrZSBzdXJlIGNoZWNrLWV4aXN0cy5zaCBpcyBvbiB5b3VyIFBBVEgiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleGVjdXRlQ29tbWFuZCIgdmFsdWU9Ii4vY2hlY2stZXhpc3RzLnNoIFtGaWxlbmFtZV0ubWV0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wcmVJbmdlc3Q8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gRW1haWwgQWN0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0iU2VuZE5vdGlmaWNhdGlvbiIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uRW1haWxOb3RpZmljYXRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUaGlzIHdpbGwgc2VuZCBhbiBlbWFpbCB0aGF0IGluZGljYXRlcyB0aGUgc3VibWlzc2lvbiB0byB0aGUgY2F0YWxvZyB3YXMgc3VjY2Vzc2Z1bC4iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWlsSG9zdCIgdmFsdWU9IiR7bm90aWZpY2F0aW9uLm1haWwuaG9zdH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZW5kZXIiIHZhbHVlPSIke25vdGlmaWNhdGlvbi5zZW5kZXJ9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3ViamVjdCIgdmFsdWU9IiR7bm90aWZpY2F0aW9uLnN1Y2Nlc3Muc3ViamVjdH0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iJHtub3RpZmljYXRpb24uc3VjY2Vzcy5tZXNzYWdlfSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlY2lwaWVudHMiIHZhbHVlPSIke25vdGlmaWNhdGlvbi5zdWNjZXNzLnJlY2lwaWVudHN9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlSW52YWxpZEFkZHJlc3NlcyI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iPnRydWU8L3ZhbHVlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiZDllNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgPGJlYW4gaWQ9ImxhdW5jaFN0ZENyYXdsZXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLmFjdGlvbi5DcmF3bGVyTGF1bmNoZXJDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIFN0ZFByb2R1Y3RDcmF3bGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjcmF3bGVySWQiIHZhbHVlPSJTdGRQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJsYXVuY2hNZXRDcmF3bGVyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5hY3Rpb24uQ3Jhd2xlckxhdW5jaGVyQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY3Jhd2xlcklkIiB2YWx1ZT0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIC8+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ibGF1bmNoQXV0b0NyYXdsZXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLmFjdGlvbi5DcmF3bGVyTGF1bmNoZXJDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY3Jhd2xlcklkIiB2YWx1ZT0iQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiAvPgorICA8L2JlYW4+Cis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiNjgxMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sCkBAIC0wLDAgKzEsOTEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworICA8YmVhbiBpZD0ib3BlcmF0aW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib3AiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvcGVyYXRpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByZXNlbnQgYW4gb3BlcmF0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gbGF1bmNoU3RkQ3Jhd2xlciBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0ibGF1bmNoU3RkQ3Jhd2xlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InN0ZFBDIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibGF1bmNoU3RkQ3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBTdGRQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+bGF1bmNoU3RkQ3Jhd2xlcjwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gbGF1bmNoTWV0Q3Jhd2xlciBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0ibGF1bmNoTWV0Q3Jhd2xlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im1ldFBDIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibGF1bmNoTWV0Q3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBNZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+bGF1bmNoTWV0Q3Jhd2xlcjwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gbGF1bmNoQXV0b0NyYXdsZXIgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImxhdW5jaEF1dG9DcmF3bGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYXV0b1BDIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibGF1bmNoQXV0b0NyYXdsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5sYXVuY2hBdXRvQ3Jhd2xlcjwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJwcmludFN1cHBvcnRlZENyYXdsZXJBY3Rpb25zIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBzY2EiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnRTdXBwb3J0ZWRDcmF3bGVyQWN0aW9ucyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpbnRzIGEgbGlzdCBhbmQgZGVzY3JpcHRpb24gb2YgYWxsIHN1cHBvcnRlZCBDcmF3bGVyQWN0aW9ucyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwZXJmb3JtQW5kUXVpdCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQWN0aW9uSW5mb0hhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBsaWNhdGlvbkNvbnRleHQiPgorICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uc3RydWN0b3ItYXJnIHZhbHVlPSIuLi9wb2xpY3kvYWN0aW9uLWJlYW5zLnhtbCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9InByaW50U3VwcG9ydGVkUHJlY29uZGl0aW9ucyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwc3AiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpbnRTdXBwb3J0ZWRQcmVjb25kaXRpb25zIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludHMgYSBsaXN0IGFuZCBkZXNjcmlwdGlvbiBvZiBhbGwgc3VwcG9ydGVkIFByZWNvbmRpdGlvbnMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icGVyZm9ybUFuZFF1aXQiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuUHJlY29uZGl0aW9uSW5mb0hhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBsaWNhdGlvbkNvbnRleHQiPgorICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uc3RydWN0b3ItYXJnIHZhbHVlPSIuLi9wb2xpY3kvcHJlY29uZGl0aW9uLWJlYW5zLnhtbCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9ImZpbGVtZ3JVcmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZm0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZmlsZW1nclVybCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsZSBNYW5hZ2VyIFVSTCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0idXJsIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuZmlsZW1nclVybDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuZmlsZW1nclVybDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmZpbGVtZ3JVcmw8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvciI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd2VkQXJncyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+aHR0cDovLy4qOlxkKjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJmYWlsdXJlRGlyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImZkIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImZhaWx1cmVEaXIiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRpcmVjdG9yeSB3aGVyZSBmaWxlcyB3aWxsIGJlIG1vdmVkIG9uIGZhaWx1cmUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRpcmVjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1vdmVNZXRhZGF0YUZpbGVUb0ZhaWx1cmVEaXIudG9EaXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1vdmVQdXNocHVsbE1ldEZpbGVUb0ZhaWx1cmVEaXIudG9EaXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1vdmVEYXRhRmlsZVRvRmFpbHVyZURpci50b0RpcjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5GaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJzdWNjZXNzRGlyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNkIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InN1Y2Nlc3NEaXIiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRpcmVjdG9yeSB3aGVyZSBmaWxlcyB3aWxsIGJlIG1vdmVkIG9uIHN1Y2Nlc3MiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRpcmVjdG9yeSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+TW92ZVB1c2hwdWxsTWV0RmlsZVRvQmFja3VwRGlyLnRvRGlyPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5Nb3ZlTWV0YWRhdGFGaWxlVG9CYWNrdXBEaXIudG9EaXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvciIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0id29ya2Zsb3dNZ3JVcmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0id20iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0id29ya2Zsb3dNZ3JVcmwiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IldvcmtmbG93IE1hbmFnZXIgVVJMIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPlVwZGF0ZVdvcmtmbG93U3RhdHVzVG9Jbmdlc3Qud29ya2Zsb3dNZ3JVcmw8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuQXJnUmVnRXhwQ21kTGluZU9wdGlvblZhbGlkYXRvciI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd2VkQXJncyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+aHR0cDovLy4qOlxkKjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJjbGllbnRUcmFuc2ZlcmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImN0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNsaWVudFRyYW5zZmVyZXIiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkZpbGUgTWFuYWdlciBkYXRhIHRyYW5zZmVyZXIgZmFjdG9yeSBjbGFzcyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iY2xhc3MiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLmNsaWVudFRyYW5zZmVyZXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmNsaWVudFRyYW5zZmVyZXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5jbGllbnRUcmFuc2ZlcmVyPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkNsYXNzRXhpc3RzQ21kTGluZU9wdGlvblZhbGlkYXRvciIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0icmVxdWlyZWRNZXRhZGF0YSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJycW0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVxdWlyZWRNZXRhZGF0YSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWV0YWRhdGEgcmVxdWlyZWQgZm9yIGluZ2VzdCB0byB0YWtlIHBsYWNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJtZXRhZGF0YV9lbGVtZW50cyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIucmVxdWlyZWRNZXRhZGF0YTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIucmVxdWlyZWRNZXRhZGF0YTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+QXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLnJlcXVpcmVkTWV0YWRhdGE8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0iYWN0aW9uSWRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImFpcyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhY3Rpb25JZHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNyYXdsZXJBY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iQ3Jhd2xlckFjdGlvbiBpZHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLmFjdGlvbklkczwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIuYWN0aW9uSWRzPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuYWN0aW9uSWRzPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9InByZUNvbmRJZHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGlkcyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcmVDb25kSWRzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmVDb25kaXRpb25Db21wYXJhdG9yIGlkcyB0aGF0IG11c3QgcGFzcyBiZWZvcmUgYW55IG1ldGFkYXRhIGV4dHJhY3Rpb24gd2lsbCBydW4iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9IlByZUNvbmRpdGlvbkNvbXBhcmF0b3IgaWRzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5wcmVDb25kSWRzPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJuYW1pbmdDb252ZW50aW9uSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuY2lkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibmFtaW5nQ29udmVudGlvbklkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IklEIG9mIHRoZSBOYW1pbmdDb252ZW50aW9uIHRvIHVzZSB0byByZW5hbWUgcHJvZHVjdHMgYmVmb3JlIGluZ2VzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Ik5hbWluZ0NvbnZlbnRpb24gSUQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLm5hbWluZ0NvbnZlbnRpb25JZDwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJub1JlY3VyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im5yIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im5vUmVjdXIiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlR1cm5zIG9mZiByZWN1cnNpdmUgY3Jhd2xpbmcgLSB3aWxsIG9ubHkgcHJvY2VzcyBmaWxlcyBpbiBwcm9kdWN0UGF0aCBkaXJlY3RvcnkiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iYm9vbGVhbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLm5vUmVjdXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLm5vUmVjdXI8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5ub1JlY3VyPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9ImNyYXdsRm9yRGlycyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjZmQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iY3Jhd2xGb3JEaXJzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJXaWxsIGNyYXdsIGZvciBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGZpbGVzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImJvb2xlYW4iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIuY3Jhd2xGb3JEaXJzPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5jcmF3bEZvckRpcnM8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5jcmF3bEZvckRpcnM8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0ic2tpcEluZ2VzdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzaSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJza2lwSW5nZXN0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJXaWxsIHNraXAgaW5nZXN0IHRvIGZpbGUgbWFuYWdlciBhbmQgYW55IHBvc3QgaW5nZXN0IGFjdGlvbnMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iYm9vbGVhbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5za2lwSW5nZXN0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5za2lwSW5nZXN0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuc2tpcEluZ2VzdDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJkYWVtb25Qb3J0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImRwIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRhZW1vblBvcnQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iaW50IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDYXVzZSBjcmF3bGVyIHRvIGJlY29tZSBhIGRhZW1vbiB3aXRoIGEgWE1MLVJQQyB3ZWJzZXJ2ZXIgc3RhcnRlZCBvbiB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InBvcnROdW0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hTdGRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaEF1dG9DcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPlN0ZFByb2R1Y3RDcmF3bGVyLmRhZW1vblBvcnQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLmRhZW1vblBvcnQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5kYWVtb25Qb3J0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0b3JzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24udmFsaWRhdG9yLkFyZ1JlZ0V4cENtZExpbmVPcHRpb25WYWxpZGF0b3IiPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dlZEFyZ3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPlxkKjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJkYWVtb25XYWl0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImR3IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRhZW1vbldhaXQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iaW50IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDYXVzZSBjcmF3bGVyIHRvIGJlY29tZSBhIGRhZW1vbiBhbmQgc2xlZXAgZm9yIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gY3Jhd2xzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJzZWNvbmRzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoU3RkQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaE1ldENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5kYWVtb25XYWl0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5kYWVtb25XYWl0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuZGFlbW9uV2FpdDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5BcmdSZWdFeHBDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBcmdzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5cZCo8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0icHJvZHVjdFBhdGgiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHAiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdFBhdGgiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJvb3QgZGlyZWN0b3J5IHRvIGNyYXdsIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJkaXJlY3RvcnkiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5TdGRQcm9kdWN0Q3Jhd2xlci5wcm9kdWN0UGF0aDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+TWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIucHJvZHVjdFBhdGg8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5wcm9kdWN0UGF0aDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5GaWxlRXhpc3RDbWRMaW5lT3B0aW9uVmFsaWRhdG9yIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJtZXRGaWxlRXh0ZW5zaW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im1meCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtZXRGaWxlRXh0ZW5zaW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUaGUgZmlsZSBleHRlbnNpb24gb2YgZXhpc3RpbmcgYW5kIHRvIGJlIGNyZWF0ZWQgUENTIG1ldGFkYXRhIGZpbGVzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlIGV4dGVuc2lvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+U3RkUHJvZHVjdENyYXdsZXIubWV0RmlsZUV4dGVuc2lvbjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RGVsZXRlTWV0YWRhdGFGaWxlLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1vdmVNZXRhZGF0YUZpbGVUb0JhY2t1cERpci5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5Nb3ZlTWV0YWRhdGFGaWxlVG9GYWlsdXJlRGlyLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0ibWV0RXh0cmFjdG9yIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im14IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1ldEV4dHJhY3RvciIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWV0YWRhdGEgZXh0cmFjdG9yIGNsYXNzIHRvIHVzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iY2xhc3MiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1ldEV4dHJhY3RvclByb2R1Y3RDcmF3bGVyLm1ldEV4dHJhY3RvcjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmFsaWRhdG9ycyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnZhbGlkYXRvci5DbGFzc0V4aXN0c0NtZExpbmVPcHRpb25WYWxpZGF0b3IiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9Im1ldEV4dHJhY3RvckNvbmZpZyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJteGMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWV0RXh0cmFjdG9yQ29uZmlnIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDb25maWcgZmlsZSBmb3IgbWV0YWRhdGEgZXh0cmFjdG9yIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoTWV0Q3Jhd2xlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5NZXRFeHRyYWN0b3JQcm9kdWN0Q3Jhd2xlci5tZXRFeHRyYWN0b3JDb25maWc8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvciIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0ibWltZUV4dHJhY3RvclJlcG8iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibXhyIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1pbWVFeHRyYWN0b3JSZXBvIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNaW1lLXR5cGUgdG8gbWV0YWRhdGEgZXh0cmFjdG9yIG1hcHBpbmcgeG1sIGZpbGUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hBdXRvQ3Jhd2xlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIubWltZUV4dHJhY3RvclJlcG88L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbGlkYXRvcnMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi52YWxpZGF0b3IuRmlsZUV4aXN0Q21kTGluZU9wdGlvblZhbGlkYXRvciIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0icHVzaHB1bGxNZXRGaWxlRXh0ZW5zaW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBwbWZ4IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InB1c2hwdWxsTWV0RmlsZUV4dGVuc2lvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsZSBleHRlbnNpb24gb2YgcHVzaC1wdWxsIG1ldGFkYXRhIGZpbGVzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlIGV4dGVuc2lvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImxhdW5jaFN0ZENyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJsYXVuY2hNZXRDcmF3bGVyIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibGF1bmNoQXV0b0NyYXdsZXIiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RGVsZXRlUHVzaHB1bGxNZXRGaWxlLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPk1vdmVQdXNocHVsbE1ldEZpbGVUb0JhY2t1cERpci5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5Nb3ZlUHVzaHB1bGxNZXRGaWxlVG9GYWlsdXJlRGlyLmZpbGVFeHRlbnNpb248L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkNoZWNrVGhhdFB1c2hQdWxsTWV0RmlsZUV4aXN0cy5maWxlRXh0ZW5zaW9uPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJub3RpZmljYXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibm90aWZpY2F0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlY2xhcmUgdGhhdCB5b3VyIHdhbnQgZW1haWwgbm90aWZpY2F0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJtYWlsSG9zdCIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InNlbmRlciIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InN1YmplY3QiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJtZXNzYWdlIiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0icmVjaXBpZW50cyIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9Imlnbm9yZUludmFsaWRBZGRyZXNzZXMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ibWFpbEhvc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im1oIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWFpbEhvc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRW1haWwgSG9zdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Imhvc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPlNlbmROb3RpZmljYXRpb24uZW1haWxIb3N0PC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJzZW5kZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNkciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InNlbmRlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJFbWFpbCBzZW5kZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJlbWFpbCBhZGRyZXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5TZW5kTm90aWZpY2F0aW9uLnNlbmRlcjwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ic3ViamVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic3ViIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic3ViamVjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJFbWFpbCBzdWJqZWN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZW1haWwgc3ViamVjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jbGkub3B0aW9uLmhhbmRsZXIuQ3Jhd2xlckJlYW5zUHJvcEhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvcGVydGllcyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8dmFsdWU+U2VuZE5vdGlmaWNhdGlvbi5zdWJqZWN0PC92YWx1ZT4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJtZXNzYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtc2ciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtZXNzYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkVtYWlsIG1lc3NhZ2UgYm9keSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImVtYWlsIG1lc3NhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPlNlbmROb3RpZmljYXRpb24ubWVzc2FnZTwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icmVjaXBpZW50cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icmNwdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWNpcGllbnRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcmVjaXBpZW50IGVtYWlscyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEudXRpbC5MaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZW1haWwgYWRkcmVzc2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmNsaS5vcHRpb24uaGFuZGxlci5DcmF3bGVyQmVhbnNQcm9wSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDx2YWx1ZT5TZW5kTm90aWZpY2F0aW9uLnJlY2lwaWVudHM8L3ZhbHVlPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Imlnbm9yZUludmFsaWRBZGRyZXNzZXMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImlpYXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJpZ25vcmVJbnZhbGlkQWRkcmVzc2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IklmIGludmFsaWQgYWRkcmVzc2VzIHNob3VsZCBqdXN0IGJlIGlnbm9yZWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJib29sZWFuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY2xpLm9wdGlvbi5oYW5kbGVyLkNyYXdsZXJCZWFuc1Byb3BIYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPHZhbHVlPlNlbmROb3RpZmljYXRpb24uaWdub3JlSW52YWxpZEFkZHJlc3NlczwvdmFsdWU+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKzwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY3Jhd2xlci1iZWFucy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jcmF3bGVyLWJlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzAwNzdmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY3Jhd2xlci1iZWFucy54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgICAgCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPiAgIAorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLnNwcmluZy5wb3N0cHJvY2Vzc29yLlNldElkQmVhblBvc3RQcm9jZXNzb3IiLz4gICAgCisgICAgCisgICAgPCEtLSBQcm9kdWN0IENyYXdsZXJzIC0tPgorICAgIAorICAgIDxiZWFuIGlkPSJTdGRQcm9kdWN0Q3Jhd2xlciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5TdGRQcm9kdWN0Q3Jhd2xlciI+CisgICAgICAgIDxkZXNjcmlwdGlvbj5Jbmdlc3RzIGRhdGEgZmlsZXMgYmFzZWQgb24gZXhpc3RpbmcgbWV0YWRhdGEgZmlsZXM8L2Rlc2NyaXB0aW9uPgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0iTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuTWV0RXh0cmFjdG9yUHJvZHVjdENyYXdsZXIiPgorICAgICAgICA8ZGVzY3JpcHRpb24+SW5nZXN0cyBkYXRhIGZpbGVzIGFmdGVyIGdlbmVyYXRpbmcgYSBtZXRhZGF0IGZpbGUgZm9yIGl0IHdpdGggYSBnaXZlbiBtZXRhZGF0YSBleHRyYWN0b3I8L2Rlc2NyaXB0aW9uPgorICAgIDwvYmVhbj4KKyAgICAKKyAgICA8YmVhbiBpZD0iQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLkF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciI+CisgICAgICAgIDxkZXNjcmlwdGlvbj5Jbmdlc3RzIGRhdGEgZmlsZXMgYmFzZWQgb24gZXhpc3RpbmcgbWV0YWRhdGEgZmlsZXMgY2hvb3NpbmcgbWV0YWRhdGEgZXh0cmFjdG9ycyBiYXNlZCBvbiBtaW1ldHlwZXMgZ2l2ZW4gaW4gc3BlY2lmaWVkIG1pbWV0eXBlIHhtbCBmaWxlPC9kZXNjcmlwdGlvbj4KKyAgICA8L2JlYW4+CisgICAgCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY3Jhd2xlci1jb25maWcueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY3Jhd2xlci1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MWI3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NyYXdsZXIvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jcmF3bGVyLWNvbmZpZy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5DYXNQcm9wZXJ0eU92ZXJyaWRlQ29uZmlndXJlciIgLz4KKworICAgIDxpbXBvcnQgcmVzb3VyY2U9ImNyYXdsZXItYmVhbnMueG1sIi8+CisgICAgPGltcG9ydCByZXNvdXJjZT0iYWN0aW9uLWJlYW5zLnhtbCIvPgorICAgIDxpbXBvcnQgcmVzb3VyY2U9InByZWNvbmRpdGlvbi1iZWFucy54bWwiLz4KKyAgICA8aW1wb3J0IHJlc291cmNlPSJuYW1pbmctYmVhbnMueG1sIiAvPgorCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvbmFtaW5nLWJlYW5zLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L25hbWluZy1iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkZGE0OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L25hbWluZy1iZWFucy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisgIDxiZWFuIGlkPSJFeGFtcGxlTmFtaW5nQ29udiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZmlsZW5hbWluZy5QYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ibmFtaW5nQ29udiIgdmFsdWU9IltQcm9kdWN0VHlwZV0uW05vbWluYWxEYXRlXS50eHQiIC8+CisgIDwvYmVhbj4KKzwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jcmF3bGVyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvcHJlY29uZGl0aW9uLWJlYW5zLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3ByZWNvbmRpdGlvbi1iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3ZjAxYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY3Jhd2xlci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3ByZWNvbmRpdGlvbi1iZWFucy54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLnBvc3Rwcm9jZXNzb3IuU2V0SWRCZWFuUG9zdFByb2Nlc3NvciIgLz4KKyAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5DYXNQcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlciI+CisKKyAgICA8IS0tIEFsbG93IGZvciBzeXN0ZW0tbGV2ZWwgcHJvcGVydGllcyB0byBvdmVycmlkZSBhbGwgcHJvcGVydGllcyBiZWxvdyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3lzdGVtUHJvcGVydGllc01vZGUiIHZhbHVlPSIyIiAvPgorCisgICAgPCEtLSBEZWZhdWx0IFByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnRpZXMiPgorICAgICAgPHByb3BzPgorICAgICAgICA8cHJvcCBrZXk9ImNyYXdsZXIucHVzaHB1bGwubWV0LmZpbGUuZXh0Ij5bUFVTSFBVTExfTUVUX0ZJTEVfRVhUXTwvcHJvcD4KKyAgICAgIDwvcHJvcHM+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgICAgPCEtLSBQcmVjb25kaXRpb24gQ29tcGFyYXRvcnMgLS0+CisgICAgPGJlYW4gaWQ9IkNoZWNrVGhhdFB1c2hQdWxsTWV0RmlsZUV4aXN0cyIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLkV4aXN0YW5jZUNoZWNrQ29tcGFyYXRvciI+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSIke2NyYXdsZXIucHVzaHB1bGwubWV0LmZpbGUuZXh0fSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2tzIGlmIHRoZSBwdXNoLXB1bGwgbWV0YWRhdGEgZmlsZSBleGlzdHMgZm9yIHRoZSBjdXJyZW50IGRhdGEgZmlsZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbXBhcmVJdGVtIj4KKyAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiI+dHJ1ZTwvdmFsdWU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZXF1YWxfdG8iIC8+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9IkNoZWNrVGhhdERhdGFGaWxlU2l6ZUlzR3JlYXRlclRoYW5aZXJvIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuRmlsZVNpemVDb21wYXJhdG9yIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkxvbmciPjA8L3ZhbHVlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImdyZWF0ZXJfdGhhbiIgLz4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0iQXByaW9yaVVuaXF1ZXNzQ2hlY2tXaXRoRmlsZW1nciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5jb21wYXJhdG9yLkZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tDb21wYXJhdG9yIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hlY2tzIHdoZXJlIHRoZSBjdXJyZW50IGRhdGEgZmlsZSBleGlzdGluZyBpbiB0aGUgZmlsZW1nciBiYXNlZCBvbiBpdHMgRklMRU5BTUUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iPmZhbHNlPC92YWx1ZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJlcXVhbF90byIgLz4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0iQ2hlY2tUaGF0RGF0YUZpbGVJc0NvbXBsZXRlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnByZWNvbmRpdGlvbnMuRXh0ZXJuUHJlY29uZGl0aW9uQ29tcGFyYXRvciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkV4ZWN1dGUgZXh0ZXJuYWwgc2NyaXB0IHRvIGNoZWNrIGZvciBmaWxlIGNvbXBsZXRlbmVzcy4iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXJlSXRlbSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0iamF2YS5sYW5nLkxvbmciPjA8L3ZhbHVlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImVxdWFsX3RvIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXhlY3V0ZUNvbW1hbmQiIHZhbHVlPSJjaGVjay1kYXRhLWZpbGUtY29tcGxldGUucGwiIC8+CisgICAgPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZGU5ODQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsMzQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAKKyAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgIDxwYXJlbnQ+CisgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICA8L3BhcmVudD4KKyAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LSR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICA8bmFtZT5EaXN0cmlidXRpb24gKFJBRGlYIERpc3RybyBvZiBPT0RUKTwvbmFtZT4KKyAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICA8cHJvcGVydGllcz4KKyAgICAgIDx0b21jYXQudmVyc2lvbj41LjUuMjM8L3RvbWNhdC52ZXJzaW9uPgorICAgPC9wcm9wZXJ0aWVzPgorICAgPHByb2ZpbGVzPgorICAgICAgPHByb2ZpbGU+CisgICAgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+CisgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+dGFyLmd6PC90eXBlPgorICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+YmluPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tY3Jhd2xlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT50YXIuZ3o8L3R5cGU+CisgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5iaW48L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS13b3JrZmxvdzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT50YXIuZ3o8L3R5cGU+CisgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5iaW48L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1wZ2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+dGFyLmd6PC90eXBlPgorICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+YmluPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tcGNzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPnRhci5nejwvdHlwZT4KKyAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmJpbjwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LXJlc21ncjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT50YXIuZ3o8L3R5cGU+CisgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5iaW48L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1leHRlbnNpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPnRhci5nejwvdHlwZT4KKyAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmJpbjwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LW9wc3VpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LXBjcy1zZXJ2aWNlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1mbXByb2Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2stdG9tY2F0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+dG9tY2F0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLXRvbWNhdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dG9tY2F0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT5mYWxzZTwvb3ZlcldyaXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3BhcmVudC5hcnRpZmFjdElkfS1vcHN1aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGU+ZmFsc2U8L292ZXJXcml0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBhY2hlLXRvbWNhdC0ke3RvbWNhdC52ZXJzaW9ufS93ZWJhcHBzL29wc3VpPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwYXJlbnQuYXJ0aWZhY3RJZH0tcGNzLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT5mYWxzZTwvb3ZlcldyaXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGFjaGUtdG9tY2F0LSR7dG9tY2F0LnZlcnNpb259L3dlYmFwcHMvcGNzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwYXJlbnQuYXJ0aWZhY3RJZH0tZm1wcm9kPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT5mYWxzZTwvb3ZlcldyaXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGFjaGUtdG9tY2F0LSR7dG9tY2F0LnZlcnNpb259L3dlYmFwcHMvZm1wcm9kPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICA8L2J1aWxkPgorICAgICAgPC9wcm9maWxlPgorICAgICAgPHByb2ZpbGU+CisgICAgICAgICA8aWQ+Zm0tc29sci1jYXRhbG9nPC9pZD4KKyAgICAgICAgIDxhY3RpdmF0aW9uLz4KKyAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPnRhci5nejwvdHlwZT4KKyAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmJpbjwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LWNyYXdsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+dGFyLmd6PC90eXBlPgorICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+YmluPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0td29ya2Zsb3c8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+dGFyLmd6PC90eXBlPgorICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+YmluPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tcGdlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPnRhci5nejwvdHlwZT4KKyAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmJpbjwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LXBjczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT50YXIuZ3o8L3R5cGU+CisgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5iaW48L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1yZXNtZ3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+dGFyLmd6PC90eXBlPgorICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+YmluPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tZXh0ZW5zaW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT50YXIuZ3o8L3R5cGU+CisgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5iaW48L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1zb2xyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPnRhci5nejwvdHlwZT4KKyAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmJpbjwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LW9wc3VpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LXBjcy1zZXJ2aWNlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1mbXByb2Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tc29sci13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2stdG9tY2F0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+dG9tY2F0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLXRvbWNhdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dG9tY2F0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT5mYWxzZTwvb3ZlcldyaXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3BhcmVudC5hcnRpZmFjdElkfS1vcHN1aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGU+ZmFsc2U8L292ZXJXcml0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBhY2hlLXRvbWNhdC0ke3RvbWNhdC52ZXJzaW9ufS93ZWJhcHBzL29wc3VpPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwYXJlbnQuYXJ0aWZhY3RJZH0tcGNzLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT5mYWxzZTwvb3ZlcldyaXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGFjaGUtdG9tY2F0LSR7dG9tY2F0LnZlcnNpb259L3dlYmFwcHMvcGNzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwYXJlbnQuYXJ0aWZhY3RJZH0tZm1wcm9kPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT5mYWxzZTwvb3ZlcldyaXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGFjaGUtdG9tY2F0LSR7dG9tY2F0LnZlcnNpb259L3dlYmFwcHMvZm1wcm9kPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwYXJlbnQuYXJ0aWZhY3RJZH0tc29sci13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlPmZhbHNlPC9vdmVyV3JpdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwYWNoZS10b21jYXQtJHt0b21jYXQudmVyc2lvbn0vd2ViYXBwcy9zb2xyPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICA8L2J1aWxkPgorICAgICAgPC9wcm9maWxlPgorICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg3ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsMTE0IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4KKyAgPGlkPmJpbjwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc3NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9ldGM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZGF0YS9tZXQ8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgPC9maWxlU2V0PiAgICAKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxvZ3M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+KiovKjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZGF0YTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi8qPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kYXRhL2FyY2hpdmU8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+KiovKjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZGF0YS9zdGFnaW5nPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRhdGEvd29yazwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi8qPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kYXRhL21ldDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi8qPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kYXRhL2ZhaWx1cmU8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+KiovKjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGFjaGUtdG9tY2F0LSR7dG9tY2F0LnZlcnNpb259PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRvbWNhdDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi93ZWJhcHBzL2RvY3MvKio8L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPioqL3dlYmFwcHMvZXhhbXBsZXMvKio8L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPioqL3dlYmFwcHMvaG9zdC1tYW5hZ2VyLyoqPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4qKi93ZWJhcHBzL21hbmFnZXIvKio8L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPioqL3dlYmFwcHMvc2VydmxldHMtZXhhbXBsZXMvKio8L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPioqL3dlYmFwcHMvanNwLWV4YW1wbGVzLyoqPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4qKi93ZWJhcHBzL3dlYmRhdi8qKjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorICA8ZGVwZW5kZW5jeVNldHM+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+ZmFsc2U8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPiR7Z3JvdXBJZH06JHtwYXJlbnQuYXJ0aWZhY3RJZH0tb3BzdWk8L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPiR7Z3JvdXBJZH06JHtwYXJlbnQuYXJ0aWZhY3RJZH0tcGNzLXNlcnZpY2VzPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4ke2dyb3VwSWR9OiR7cGFyZW50LmFydGlmYWN0SWR9LWZtcHJvZDwvZXhjbHVkZT4KKyAgICAgICAgPGV4Y2x1ZGU+JHtncm91cElkfToke3BhcmVudC5hcnRpZmFjdElkfS1zb2xyLXdlYmFwcDwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9kZXBlbmRlbmN5U2V0PgorICA8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZW52LnNoIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9lbnYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjUxZjBjYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZW52LnNoCkBAIC0wLDAgKzEsMjA1IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KK2N5Z3dpbj1mYWxzZQorb3M0MDA9ZmFsc2UKK2Rhcndpbj1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KK0NZR1dJTiopIGN5Z3dpbj10cnVlOzsKK09TNDAwKikgb3M0MDA9dHJ1ZTs7CitEYXJ3aW4qKSBkYXJ3aW49dHJ1ZTs7Citlc2FjCisKKyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKKworIyBPbmx5IHNldCBPT0RUX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitbIC16ICIkT09EVF9IT01FIiBdICYmIE9PRFRfSE9NRT1gY2QgIiRQUkdESVIvLi4iIDsgcHdkYAorCitleHBvcnQgT09EVF9IT01FCisKKyMgRW5zdXJlIHRoYXQgYW55IHVzZXIgZGVmaW5lZCBDTEFTU1BBVEggdmFyaWFibGVzIGFyZSBub3QgdXNlZCBvbiBzdGFydHVwLAorIyBidXQgYWxsb3cgdGhlbSB0byBiZSBzcGVjaWZpZWQgaW4gc2V0ZW52LnNoLCBpbiByYXJlIGNhc2Ugd2hlbiBpdCBpcyBuZWVkZWQuCitDTEFTU1BBVEg9CisKK2lmIFsgLXIgIiRPT0RUX0JBU0UiL2Jpbi9zZXRlbnYuc2ggXTsgdGhlbgorICAuICIkT09EVF9CQVNFIi9iaW4vc2V0ZW52LnNoCitlbGlmIFsgLXIgIiRPT0RUX0hPTUUiL2Jpbi9zZXRlbnYuc2ggXTsgdGhlbgorICAuICIkT09EVF9IT01FIi9iaW4vc2V0ZW52LnNoCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJEpSRV9IT01FIiBdICYmIEpSRV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpSRV9IT01FImAKKyAgWyAtbiAiJE9PRFRfSE9NRSIgXSAmJiBPT0RUX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkT09EVF9IT01FImAKKyAgWyAtbiAiJE9PRFRfQkFTRSIgXSAmJiBPT0RUX0JBU0U9YGN5Z3BhdGggLS11bml4ICIkT09EVF9CQVNFImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCisjIEdldCBzdGFuZGFyZCBKYXZhIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgJG9zNDAwOyB0aGVuCisgICMgLXIgd2lsbCBPbmx5IHdvcmsgb24gdGhlIG9zNDAwIGlmIHRoZSBmaWxlcyBhcmU6CisgICMgMS4gb3duZWQgYnkgdGhlIHVzZXIKKyAgIyAyLiBvd25lZCBieSB0aGUgUFJJTUFSWSBncm91cCBvZiB0aGUgdXNlcgorICAjIHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgdXNlciBiZWxvbmdzIGluIHNlY29uZGFyeSBncm91cHMKKyAgQkFTRURJUj0iJE9PRFRfSE9NRSIKKyAgLiAiJE9PRFRfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaAorZWxzZQorICBpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vc2V0Y2xhc3NwYXRoLnNoIF07IHRoZW4KKyAgICBCQVNFRElSPSIkT09EVF9IT01FIgorICAgIC4gIiRPT0RUX0hPTUUiL2Jpbi9zZXRjbGFzc3BhdGguc2gKKyAgZWxzZQorICAgIGVjaG8gIkNhbm5vdCBmaW5kICRPT0RUX0hPTUUvYmluL3NldGNsYXNzcGF0aC5zaCIKKyAgICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgICAgZXhpdCAxCisgIGZpCitmaQorCitpZiBbIC16ICIkT09EVF9CQVNFIiBdOyB0aGVuCisgIE9PRFRfQkFTRT0iJE9PRFRfSE9NRSIKKyAgZXhwb3J0IE9PRFRfQkFTRQorZmkKKworaWYgWyAteiAiJE9PRFRfT1VUIiBdIDsgdGhlbgorICBPT0RUX09VVD0iJE9PRFRfQkFTRSIvbG9ncy9vb2R0Lm91dAorICBleHBvcnQgT09EVF9PVVQKK2ZpCisKK2lmIFsgLXogIiRGSUxFTUdSX0hPTUUiIF07IHRoZW4KKyAgRklMRU1HUl9IT01FPSIkT09EVF9IT01FIi9maWxlbWdyCisgIGV4cG9ydCBGSUxFTUdSX0hPTUUKK2ZpCisKK2lmIFsgLXogIiRXT1JLRkxPV19IT01FIiBdOyB0aGVuCisgIFdPUktGTE9XX0hPTUU9IiRPT0RUX0hPTUUiL3dvcmtmbG93CisgIGV4cG9ydCBXT1JLRkxPV19IT01FCitmaQorCitpZiBbIC16ICIkUkVTTUdSX0hPTUUiIF07IHRoZW4KKyAgUkVTTUdSX0hPTUU9IiRPT0RUX0hPTUUiL3Jlc21ncgorICBleHBvcnQgUkVTTUdSX0hPTUUKK2ZpCisKK2lmIFsgLXogIiRQQ1NfSE9NRSIgXTsgdGhlbgorICBQQ1NfSE9NRT0iJE9PRFRfSE9NRSIvcGNzCisgIGV4cG9ydCBQQ1NfSE9NRQorZmkKKworaWYgWyAteiAiJENSQVdMRVJfSE9NRSIgXTsgdGhlbgorICBDUkFXTEVSX0hPTUU9IiRPT0RUX0hPTUUiL2NyYXdsZXIKKyAgZXhwb3J0IENSQVdMRVJfSE9NRQorZmkKKworaWYgWyAteiAiJFBHRV9ST09UIiBdOyB0aGVuCisgIFBHRV9ST09UPSIkT09EVF9IT01FIi9wZ2UKKyAgZXhwb3J0IFBHRV9ST09UCitmaQorCitpZiBbIC16ICIkU09MUl9IT01FIiBdOyB0aGVuCisgIFNPTFJfSE9NRT0iJE9PRFRfSE9NRSIvc29scgorICBleHBvcnQgU09MUl9IT01FCitmaQorCitpZiBbIC16ICIkT09EVF9UTVBESVIiIF07IHRoZW4KKyAgIyBEZWZpbmUgdGhlIGphdmEuaW8udG1wZGlyIHRvIHVzZSBmb3IgT09EVAorICBPT0RUX1RNUERJUj0iJE9PRFRfQkFTRSIvdGVtcAorICBleHBvcnQgT09EVF9UTVBESVIKK2ZpCisKK2lmIFsgLXogIiRGSUxFTUdSX1BPUlQiIF07IHRoZW4KKyAgRklMRU1HUl9QT1JUPTkwMDAKKyAgZXhwb3J0IEZJTEVNR1JfUE9SVAorZmkKKworaWYgWyAteiAiJENSQVdMRVJfUE9SVCIgXTsgdGhlbgorICBDUkFXTEVSX1BPUlQ9OTAyMAorICBleHBvcnQgQ1JBV0xFUl9QT1JUCitmaSAKKworaWYgWyAteiAiJFdPUktGTE9XX1BPUlQiIF07IHRoZW4KKyAgV09SS0ZMT1dfUE9SVD05MDAxCisgIGV4cG9ydCBXT1JLRkxPV19QT1JUCitmaQorCitpZiBbIC16ICIkUkVTTUdSX1BPUlQiIF07IHRoZW4KKyAgUkVTTUdSX1BPUlQ9OTAwMgorICBleHBvcnQgUkVTTUdSX1BPUlQKK2ZpCisKK2lmIFsgLXogIiRUT01DQVRfUE9SVCIgXTsgdGhlbgorICBUT01DQVRfUE9SVD04MDgwCisgIGV4cG9ydCBUT01DQVRfUE9SVAorZmkKKworaWYgWyAteiAiJE9PRFRfU0VSVklDRVNfSE9TVCIgXTsgdGhlbgorICBPT0RUX1NFUlZJQ0VTX0hPU1Q9bG9jYWxob3N0CisgIGV4cG9ydCBPT0RUX1NFUlZJQ0VTX0hPU1QKK2ZpCisKK2lmIFsgLXogIiRGSUxFTUdSX1VSTCIgXTsgdGhlbgorICBGSUxFTUdSX1VSTD1odHRwOi8vIiRPT0RUX1NFUlZJQ0VTX0hPU1QiOiIkRklMRU1HUl9QT1JUIgorICBleHBvcnQgRklMRU1HUl9VUkwKK2ZpCisKK2lmIFsgLXogIiRXT1JLRkxPV19VUkwiIF07IHRoZW4KKyAgV09SS0ZMT1dfVVJMPWh0dHA6Ly8iJE9PRFRfU0VSVklDRVNfSE9TVCI6IiRXT1JLRkxPV19QT1JUIgorICBleHBvcnQgV09SS0ZMT1dfVVJMCitmaQorCitpZiBbIC16ICIkUkVTTUdSX1VSTCIgXTsgdGhlbgorICBSRVNNR1JfVVJMPWh0dHA6Ly8iJE9PRFRfU0VSVklDRVNfSE9TVCI6IiRSRVNNR1JfUE9SVCIKKyAgZXhwb3J0IFJFU01HUl9VUkwKK2ZpCisKK2lmIFsgLXogIiRDUkFXTEVSX1VSTCIgXTsgdGhlbgorICBDUkFXTEVSX1VSTD1odHRwOi8vIiRPT0RUX1NFUlZJQ0VTX0hPU1QiOiIkQ1JBV0xFUl9QT1JUIgorICBleHBvcnQgQ1JBV0xFUl9VUkwKK2ZpCisKKworIyBXaGVuIG5vIFRUWSBpcyBhdmFpbGFibGUsIGRvbid0IG91dHB1dCB0byBjb25zb2xlCitoYXZlX3R0eT0wCitpZiBbICJgdHR5YCIgIT0gIm5vdCBhIHR0eSIgXTsgdGhlbgorICAgIGhhdmVfdHR5PTEKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKK2lmICRjeWd3aW47IHRoZW4KKyAgSkFWQV9IT01FPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkSkFWQV9IT01FImAKKyAgSlJFX0hPTUU9YGN5Z3BhdGggLS1hYnNvbHV0ZSAtLXdpbmRvd3MgIiRKUkVfSE9NRSJgCisgIE9PRFRfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJE9PRFRfSE9NRSJgCisgIE9PRFRfQkFTRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJE9PRFRfQkFTRSJgCisgIE9PRFRfVE1QRElSPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkT09EVF9UTVBESVIiYAorICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENMQVNTUEFUSCJgCisgIEpBVkFfRU5ET1JTRURfRElSUz1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkSkFWQV9FTkRPUlNFRF9ESVJTImAKK2ZpCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL2luZ2VzdCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vaW5nZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNmVjYjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL2luZ2VzdApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHBvcnQgRElSPWBkaXJuYW1lICQwYAorY2QgJERJUgorZXhwb3J0IERJUl9QQVRIPWBwd2RgCisKK2lmIFsgIiQjIiAtbmUgMSBdOyB0aGVuCisgICBlY2hvICJVc2FnZTogJDAgPGRpcj4iCisgICBleGl0IDEKK2Vsc2UKKyAgICBleHBvcnQgUFJPRFVDVF9QQVRIPSQxCisgICAgJERJUl9QQVRILy4uL2NyYXdsZXIvYmluL2NyYXdsZXJfbGF1bmNoZXIgXAorICAgIC0tZmlsZW1nclVybCAkRklMRU1HUl9VUkwgXAorICAgIC0tb3BlcmF0aW9uIC0tbGF1bmNoTWV0Q3Jhd2xlciBcCisgICAgLS1jbGllbnRUcmFuc2ZlcmVyIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuSW5QbGFjZURhdGFUcmFuc2ZlckZhY3RvcnkgXAorICAgIC0tcHJvZHVjdFBhdGggJDEgXAorICAgIC0tbWV0RXh0cmFjdG9yIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5UaWthQ21kTGluZU1ldEV4dHJhY3RvciBcCisgICAgLS1tZXRFeHRyYWN0b3JDb25maWcgJE9PRFRfSE9NRS9kYXRhL21ldC90aWthLmNvbmYKK2ZpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9vb2R0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9vb2R0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2NDhiYzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL29vZHQKQEAgLTAsMCArMSwxNjggQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCitjeWd3aW49ZmFsc2UKK29zNDAwPWZhbHNlCitkYXJ3aW49ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCitDWUdXSU4qKSBjeWd3aW49dHJ1ZTs7CitPUzQwMCopIG9zNDAwPXRydWU7OworRGFyd2luKikgZGFyd2luPXRydWU7OworZXNhYworCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCisjIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCisKKyMgT25seSBzZXQgT09EVF9IT01FIGlmIG5vdCBhbHJlYWR5IHNldAorWyAteiAiJE9PRFRfSE9NRSIgXSAmJiBPT0RUX0hPTUU9YGNkICIkUFJHRElSLy4uIiA7IHB3ZGAKKworIyBHZXQgT09EVCBlbnZpcm9ubWVudCBzZXQgdXAKK2lmIFsgLXIgIiRPT0RUX0hPTUUiL2Jpbi9lbnYuc2ggXTsgdGhlbgorICAuICIkT09EVF9IT01FIi9iaW4vZW52LnNoCitmaQorCisjIE9ubHkgb3V0cHV0IHRoaXMgaWYgd2UgaGF2ZSBhIFRUWQoraWYgWyAkaGF2ZV90dHkgLWVxIDEgXTsgdGhlbgorICBlY2hvICJVc2luZyBPT0RUX0JBU0U6ICAgJE9PRFRfQkFTRSIKKyAgZWNobyAiVXNpbmcgT09EVF9IT01FOiAgICRPT0RUX0hPTUUiCisgIGVjaG8gIlVzaW5nIE9PRFRfVE1QRElSOiAkT09EVF9UTVBESVIiCisgIGlmIFsgIiQxIiA9ICJkZWJ1ZyIgXSA7IHRoZW4KKyAgICBlY2hvICJVc2luZyBKQVZBX0hPTUU6ICAgICAgICRKQVZBX0hPTUUiCisgIGVsc2UKKyAgICBlY2hvICJVc2luZyBKUkVfSE9NRTogICAgICAgICRKUkVfSE9NRSIKKyAgZmkKKyAgZWNobyAiVXNpbmcgQ0xBU1NQQVRIOiAgICAgICAkQ0xBU1NQQVRIIgorZmkKKworV09SS0ZMT1dfRVhFQz13bWdyCitSRVNNR1JfRVhFQz1yZXNtZ3IKK0ZJTEVNR1JfRVhFQz1maWxlbWdyCitUT01DQVRfRVhFQz1jYXRhbGluYS5zaAorCisjIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBbICEgLXggIiRGSUxFTUdSX0hPTUUiL2Jpbi8iJEZJTEVNR1JfRVhFQyIgXTsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCAkRklMRU1HUl9IT01FL2Jpbi8kRklMRU1HUl9FWEVDIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworIyBDaGVjayB0aGF0IHRhcmdldCBleGVjdXRhYmxlIGV4aXN0cworaWYgWyAhIC14ICIkV09SS0ZMT1dfSE9NRSIvYmluLyIkV09SS0ZMT1dfRVhFQyIgXTsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCAkV09SS0ZMT1dfSE9NRS9iaW4vJFdPUktGTE9XX0VYRUMiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCisjIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBbICEgLXggIiRSRVNNR1JfSE9NRSIvYmluLyIkUkVTTUdSX0VYRUMiIF07IHRoZW4KKyAgZWNobyAiQ2Fubm90IGZpbmQgJFJFU01HUl9IT01FL2Jpbi8kUkVTTUdSX0VYRUMiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCisjIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBbICEgLXggIiRPT0RUX0JBU0UiL3RvbWNhdC9iaW4vIiRUT01DQVRfRVhFQyIgXTsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCAkT09EVF9CQVNFL3RvbWNhdC9iaW4vJFRPTUNBVF9FWEVDIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworaWYgWyAiJDEiID0gInN0YXJ0IiBdOyB0aGVuCisgIGV4ZWMgIiRGSUxFTUdSX0hPTUUiL2Jpbi8iJEZJTEVNR1JfRVhFQyIgc3RhcnQgIiRAIiA+PiAiJE9PRFRfT1VUIiAyPiYxICAmCisgIGV4ZWMgIiRXT1JLRkxPV19IT01FIi9iaW4vIiRXT1JLRkxPV19FWEVDIiBzdGFydCAiJEAiID4+ICIkT09EVF9PVVQiIDI+JjEgICYKKyAgZXhlYyAiJFJFU01HUl9IT01FIi9iaW4vIiRSRVNNR1JfRVhFQyIgc3RhcnQgIiRAIiA+PiAiJE9PRFRfT1VUIiAyPiYxICAmICAKKyAgZXhlYyAiJE9PRFRfQkFTRSIvdG9tY2F0L2Jpbi8iJFRPTUNBVF9FWEVDIiBzdGFydCAiJEAiID4+ICIkT09EVF9PVVQiIDI+JjEgJgorICBzbGVlcCAwLjJzCisjIFByaW50IGNvbmZpcm1hdGlvbiBtZXNzYWdlcyB0byB0aGUgZW5kIHVzZXIKKyMgRmlsZU1hbmFnZXIKKyMgY2hlY2sgaWYgdGhlIFBJRCBmaWxlIGV4aXN0czoKKyAgaWYgWyAhIC1lICIuLi9maWxlbWdyL3J1bi9jYXMuZmlsZW1nci5waWQiIF0gCisgIHRoZW4KKyAgICAjIG5vIHBpZCBmaWxlIHdhcyBjcmVhdGVkIGJ5IHRoZSBwcm9jZXNzLCBpdCBtdXN0IGhhdmUgZmFpbGVkLgorICAgIGVjaG8gLWUgJ1N0YXJ0aW5nIE9PRFQgRmlsZSBNYW5hZ2VyIFsnICQnXGVbMzFtJyAnRmFpbGVkJyAkJ1xlWzAwbScgJ10nCisKKyAgZWxzZQorICAgICMgcGlkIGZpbGUgZXhpc3RzLCBjaGVjayBpZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIHJ1bm5pbmcuCisgICAgaWYga2lsbCAtMCBgY2F0IC4uL2ZpbGVtZ3IvcnVuL2Nhcy5maWxlbWdyLnBpZGAgPiAvZGV2L251bGwgMj4mMTsKKyAgICB0aGVuCisgICAgICAgIGVjaG8gLWUgJ1N0YXJ0aW5nIE9PRFQgRmlsZSBNYW5hZ2VyIFsnICQnXGVbMzJtJyAnU3VjY2Vzc2Z1bCcgJCdcZVswMG0nICddJworICAgIGVsc2UKKyAgICAgICAgZWNobyAtZSAnU3RhcnRpbmcgT09EVCBGaWxlIE1hbmFnZXIgWycgJCdcZVszMW0nICdGYWlsZWQnICQnXGVbMDBtJyAnXScKKyAgICBmaQorICBmaQorCisjIFJlc291cmNlTWFuYWdlcgorIyBjaGVjayBpZiB0aGUgUElEIGZpbGUgZXhpc3RzOgorICBpZiBbICEgLWUgIi4uL3Jlc21nci9ydW4vY2FzLnJlc21nci5waWQiIF0KKyAgdGhlbgorICAgICMgbm8gcGlkIGZpbGUgd2FzIGNyZWF0ZWQgYnkgdGhlIHByb2Nlc3MsIGl0IG11c3QgaGF2ZSBmYWlsZWQuCisgICAgZWNobyAtZSAnU3RhcnRpbmcgT09EVCBSZXNvdXJjZSBNYW5hZ2VyIFsnICQnXGVbMzFtJyAnRmFpbGVkJyAkJ1xlWzAwbScgJ10nCisKKyAgZWxzZQorICAgICMgcGlkIGZpbGUgZXhpc3RzLCBjaGVjayBpZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIHJ1bm5pbmcuCisgICAgaWYga2lsbCAtMCBgY2F0IC4uL3Jlc21nci9ydW4vY2FzLnJlc21nci5waWRgID4gL2Rldi9udWxsIDI+JjE7CisgICAgdGhlbgorICAgICAgICBlY2hvIC1lICdTdGFydGluZyBPT0RUIFJlc291cmNlIE1hbmFnZXIgWycgJCdcZVszMm0nICdTdWNjZXNzZnVsJyAkJ1xlWzAwbScgJ10nCisgICAgZWxzZQorICAgICAgICBlY2hvIC1lICdTdGFydGluZyBPT0RUIFJlc291cmNlIE1hbmFnZXIgWycgJCdcZVszMW0nICdGYWlsZWQnICQnXGVbMDBtJyAnXScKKyAgICBmaQorICBmaQorCisKKyMgV29ya2Zsb3dNYW5hZ2VyCisjIGNoZWNrIGlmIHRoZSBQSUQgZmlsZSBleGlzdHM6CisgIGlmIFsgISAtZSAiLi4vd29ya2Zsb3cvcnVuL2Nhcy53b3JrZmxvdy5waWQiIF0KKyAgdGhlbgorICAgICMgbm8gcGlkIGZpbGUgd2FzIGNyZWF0ZWQgYnkgdGhlIHByb2Nlc3MsIGl0IG11c3QgaGF2ZSBmYWlsZWQuCisgICAgZWNobyAtZSAnU3RhcnRpbmcgT09EVCBXb3JrZmxvdyBNYW5hZ2VyIFsnICQnXGVbMzFtJyAnRmFpbGVkJyAkJ1xlWzAwbScgJ10nCisKKyAgZWxzZQorICAgICMgcGlkIGZpbGUgZXhpc3RzLCBjaGVjayBpZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIHJ1bm5pbmcuCisgICAgaWYga2lsbCAtMCBgY2F0IC4uL3dvcmtmbG93L3J1bi9jYXMud29ya2Zsb3cucGlkYCA+IC9kZXYvbnVsbCAyPiYxOworICAgIHRoZW4KKyAgICAgICAgZWNobyAtZSAnU3RhcnRpbmcgT09EVCBXb3JrZmxvdyBNYW5hZ2VyIFsnICQnXGVbMzJtJyAnU3VjY2Vzc2Z1bCcgJCdcZVswMG0nICddJworICAgIGVsc2UKKyAgICAgICAgZWNobyAtZSAnU3RhcnRpbmcgT09EVCBXb3JrZmxvdyBNYW5hZ2VyIFsnICQnXGVbMzFtJyAnRmFpbGVkJyAkJ1xlWzAwbScgJ10nCisgICAgZmkKKyAgZmkKK2VsaWYgWyAiJDEiID0gInN0b3AiIF07IHRoZW4KKyAgZXhlYyAiJEZJTEVNR1JfSE9NRSIvYmluLyIkRklMRU1HUl9FWEVDIiBzdG9wICIkQCIgPj4gIiRPT0RUX09VVCIgMj4mMSAgJgorICBleGVjICIkV09SS0ZMT1dfSE9NRSIvYmluLyIkV09SS0ZMT1dfRVhFQyIgc3RvcCAiJEAiID4+ICIkT09EVF9PVVQiIDI+JjEgJgorICBleGVjICIkUkVTTUdSX0hPTUUiL2Jpbi8iJFJFU01HUl9FWEVDIiBzdG9wICIkQCIgPj4gIiRPT0RUX09VVCIgMj4mMSAmCisgIGV4ZWMgIiRPT0RUX0JBU0UiL3RvbWNhdC9iaW4vIiRUT01DQVRfRVhFQyIgc3RvcCAiJEAiID4+ICIkT09EVF9PVVQiIDI+JjEgJgorZWxzZQorICBlY2hvICJVc2FnZTogb29kdC5zaCAoIGNvbW1hbmRzIC4uLiApIgorICBlY2hvICJjb21tYW5kczoiCisgIGVjaG8gIiAgc3RhcnQgICAgICAgICAgICAgU3RhcnQgT09EVCBpbiBhIHNlcGFyYXRlIHdpbmRvdyIKKyAgZWNobyAiICBzdG9wICAgICAgICAgICAgICBTdG9wIE9PRFQsIHdhaXRpbmcgdXAgdG8gNSBzZWNvbmRzIGZvciB0aGUgcHJvY2VzcyB0byBlbmQiCisjICBlY2hvICIgIHZlcnNpb24gICAgICAgICAgIFdoYXQgdmVyc2lvbiBvZiBPT0RUIGFyZSB5b3UgcnVubmluZz8iCisgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vc2V0Y2xhc3NwYXRoLnNoIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9zZXRjbGFzc3BhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlNWYwZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vc2V0Y2xhc3NwYXRoLnNoCkBAIC0wLDAgKzEsMTE2IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBTZXQgQ0xBU1NQQVRIIGFuZCBKYXZhIG9wdGlvbnMKKyMKKyMgICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CitpZiBbIC16ICIkSkFWQV9IT01FIiAtYSAteiAiJEpSRV9IT01FIiBdOyB0aGVuCisgIGlmICRkYXJ3aW47IHRoZW4KKyAgICBpZiBbIC1kICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnRKREsvSG9tZSIgXTsgdGhlbgorICAgICAgZXhwb3J0IEpBVkFfSE9NRT0iL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50SkRLL0hvbWUiCisgICAgZmkKKyAgZWxzZQorICAgIEpBVkFfUEFUSD1gd2hpY2ggamF2YSAyPi9kZXYvbnVsbGAKKyAgICBpZiBbICJ4JEpBVkFfUEFUSCIgIT0gIngiIF07IHRoZW4KKyAgICAgIEpBVkFfUEFUSD1gZGlybmFtZSAkSkFWQV9QQVRIIDI+L2Rldi9udWxsYAorICAgICAgSlJFX0hPTUU9YGRpcm5hbWUgJEpBVkFfUEFUSCAyPi9kZXYvbnVsbGAKKyAgICBmaQorICAgIGlmIFsgIngkSlJFX0hPTUUiID0gIngiIF07IHRoZW4KKyAgICAgICMgWFhYOiBTaG91bGQgd2UgdHJ5IG90aGVyIGxvY2F0aW9ucz8KKyAgICAgIGlmIFsgLXggL3Vzci9iaW4vamF2YSBdOyB0aGVuCisgICAgICAgIEpSRV9IT01FPS91c3IKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKyAgaWYgWyAteiAiJEpBVkFfSE9NRSIgLWEgLXogIiRKUkVfSE9NRSIgXTsgdGhlbgorICAgIGVjaG8gIk5laXRoZXIgdGhlIEpBVkFfSE9NRSBub3IgdGhlIEpSRV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGRlZmluZWQiCisgICAgZWNobyAiQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgIGV4aXQgMQorICBmaQorZmkKK2lmIFsgLXogIiRKQVZBX0hPTUUiIC1hICIkMSIgPSAiZGVidWciIF07IHRoZW4KKyAgZWNobyAiSkFWQV9IT01FIHNob3VsZCBwb2ludCB0byBhIEpESyBpbiBvcmRlciB0byBydW4gaW4gZGVidWcgbW9kZS4iCisgIGV4aXQgMQorZmkKK2lmIFsgLXogIiRKUkVfSE9NRSIgXTsgdGhlbgorICBKUkVfSE9NRT0iJEpBVkFfSE9NRSIKK2ZpCisKKyMgSWYgd2UncmUgcnVubmluZyB1bmRlciBqZGIsIHdlIG5lZWQgYSBmdWxsIGpkay4KK2lmIFsgIiQxIiA9ICJkZWJ1ZyIgXSA7IHRoZW4KKyAgaWYgWyAiJG9zNDAwIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgaWYgWyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YSAtbyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YWMgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkiCisgICAgICBlY2hvICJUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgICAgZWNobyAiTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsgbm90IGEgSlJFIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgIGlmIFsgISAteCAiJEpBVkFfSE9NRSIvYmluL2phdmEgLW8gISAteCAiJEpBVkFfSE9NRSIvYmluL2pkYiAtbyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YWMgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkiCisgICAgICBlY2hvICJUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgICAgZWNobyAiTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsgbm90IGEgSlJFIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZmkKK2ZpCitpZiBbIC16ICIkQkFTRURJUiIgXTsgdGhlbgorICBlY2hvICJUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCIKKyAgZWNobyAiVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQoraWYgWyAhIC14ICIkQkFTRURJUiIvYmluL3NldGNsYXNzcGF0aC5zaCBdOyB0aGVuCisgIGlmICRvczQwMDsgdGhlbgorICAgICMgLXggd2lsbCBPbmx5IHdvcmsgb24gdGhlIG9zNDAwIGlmIHRoZSBmaWxlcyBhcmU6CisgICAgIyAxLiBvd25lZCBieSB0aGUgdXNlcgorICAgICMgMi4gb3duZWQgYnkgdGhlIFBSSU1BUlkgZ3JvdXAgb2YgdGhlIHVzZXIKKyAgICAjIHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgdXNlciBiZWxvbmdzIGluIHNlY29uZGFyeSBncm91cHMKKyAgICBldmFsCisgIGVsc2UKKyAgICBlY2hvICJUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkiCisgICAgZWNobyAiVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCisKKyMgRG9uJ3Qgb3ZlcnJpZGUgdGhlIGVuZG9yc2VkIGRpciBpZiB0aGUgdXNlciBoYXMgc2V0IGl0IHByZXZpb3VzbHkKK2lmIFsgLXogIiRKQVZBX0VORE9SU0VEX0RJUlMiIF07IHRoZW4KKyAgIyBTZXQgdGhlIGRlZmF1bHQgLURqYXZhLmVuZG9yc2VkLmRpcnMgYXJndW1lbnQKKyAgSkFWQV9FTkRPUlNFRF9ESVJTPSIkQkFTRURJUiIvZW5kb3JzZWQKK2ZpCisKKyMgT1NYIGhhY2sgdG8gQ0xBU1NQQVRICitKSUtFU1BBVEg9CitpZiBbIGB1bmFtZSAtc2AgPSAiRGFyd2luIiBdOyB0aGVuCisgIE9TWEhBQ0s9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudEpESy9DbGFzc2VzIgorICBpZiBbIC1kICIkT1NYSEFDSyIgXTsgdGhlbgorICAgIGZvciBpIGluICIkT1NYSEFDSyIvKi5qYXI7IGRvCisgICAgICBKSUtFU1BBVEg9IiRKSUtFU1BBVEgiOiIkaSIKKyAgICBkb25lCisgIGZpCitmaQorCisjIFNldCBzdGFuZGFyZCBjb21tYW5kcyBmb3IgaW52b2tpbmcgSmF2YS4KK19SVU5KQVZBPSIkSlJFX0hPTUUiL2Jpbi9qYXZhCitpZiBbICIkb3M0MDAiICE9ICJ0cnVlIiBdOyB0aGVuCisgIF9SVU5KREI9IiRKQVZBX0hPTUUiL2Jpbi9qZGIKK2ZpCisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vc2V0ZW52LnNoIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9zZXRlbnYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ZDFmOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vc2V0ZW52LnNoCkBAIC0wLDAgKzEsMjcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMjIyMjIyMjICBzZXRlbnYuc2ggIyMjIyMjIyMKKyMKKyMgU2V0IHByb2plY3Qgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbiBzZXRlbnYuc2gKKyMKKyMgRXhhbXBsZToKKyMgCQktIENoYW5nZSBmaWxlbWdyIFVSTCB0byBodHRwOi8vbG9jYXRsaG9zdDoxMjM0CisjCQkJRklMRU1HUl9VUkw9aHR0cDovL2xvY2F0bGhvc3Q6MTIzNAorIworIwkJLSBTZXQgY3VzdG9tIGpvYiBkaXJlY3RvcnkKKyMJCQlQUk9KRUNUX0pPQl9ESVI9L3Vzci9sb2NhbC9wcm9qZWN0L2RhdGEvam9icworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL3Rpa2EuY29uZiBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvdGlrYS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2NlNDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL3Rpa2EuY29uZgpAQCAtMCwwICsxLDE2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1Byb2R1Y3RUeXBlPUdlbmVyaWNGaWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leHRlbnNpb25zL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4dGVuc2lvbnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzUyNmM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leHRlbnNpb25zL3BvbS54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgDQorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorDQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4NCisgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICA8L3BhcmVudD4NCisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LSR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+DQorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KKyAgPG5hbWU+RXh0ZW5zaW9uczwvbmFtZT4NCisgIDxkZXNjcmlwdGlvbj5MaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCBhcmUgcmV1c2VkIGFjcm9zcyBzdWJjb21wb25lbnRzLjwvZGVzY3JpcHRpb24+DQorDQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxkZXNjcmlwdG9ycz4NCisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+DQorICAgICAgICAgIDwvZGVzY3JpcHRvcnM+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICA8aWQ+ZGlzdC1hc3NlbWJseTwvaWQ+DQorICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KKyAgICAgICAgICAgIDxnb2Fscz4NCisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4NCisgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgIDwvZXhlY3V0aW9ucz4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgPC9idWlsZD4NCisNCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5jYXMtbWV0YWRhdGE8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+JHtvb2R0LnZlcnNpb259PC92ZXJzaW9uPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4ke29vZHQudmVyc2lvbn08L3ZlcnNpb24+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPnBjcy1jb3JlPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPiR7b29kdC52ZXJzaW9ufTwvdmVyc2lvbj4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorDQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXh0ZW5zaW9ucy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4dGVuc2lvbnMvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMmNkZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4dGVuc2lvbnMvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmJpbjwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+ZXh0ZW5zaW9uczwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT43NzU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvZXh0cmFjdG9yL2JpbjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5leHRlbnNpb25zL2V4dHJhY3Rvci9iaW48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgICA8ZmlsZU1vZGU+Nzc1PC9maWxlTW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2xvZ3M8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXh0ZW5zaW9ucy9sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFTU9WRS5sb2c8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgICAgPGZpbGVNb2RlPjc3NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9leHRyYWN0b3IvZXRjPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmV4dGVuc2lvbnMvZXh0cmFjdG9yL2V0Yzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzLz4KKyAgICAgIDxmaWxlTW9kZT42NjQ8L2ZpbGVNb2RlPgorICAgICAgPGRpcmVjdG9yeU1vZGU+Nzc1PC9kaXJlY3RvcnlNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5PgorICAgICAgPGZpbHRlcmVkPmZhbHNlPC9maWx0ZXJlZD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5leHRlbnNpb25zL2xpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgPHVucGFja09wdGlvbnMvPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgPC9kZXBlbmRlbmN5U2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4dGVuc2lvbnMvc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXh0ZW5zaW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9ncy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTU0OTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4dGVuc2lvbnMvc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDE4IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitZb3UgY2FuIHJlbW92ZSB0aGlzIGZpbGUuIEl0IHdhcyBvbmx5IGluY2x1ZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2cgZGlyZWN0b3J5IGZvciB0aGlzCitkaXN0cmlidXRpb24gd2FzIGNyZWF0ZWQgb24gYXNzZW1ibHkuCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3IvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjE2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3IvcG9tLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIAorICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgIAorICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgPHBhcmVudD4KKyAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgIDwvcGFyZW50PgorICAgPG5hbWU+RmlsZSBNYW5hZ2VyIChBcGFjaGUgT09EVCk8L25hbWU+CisgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS0ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgIDxwcm9maWxlcz4KKyAgICAgIDxwcm9maWxlPgorICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PnRydWU8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGlzdC1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgIDwvYnVpbGQ+CisgICAgICA8L3Byb2ZpbGU+CisgICAgICA8cHJvZmlsZT4KKyAgICAgICAgIDxpZD5mbS1zb2xyLWNhdGFsb2c8L2lkPgorICAgICAgICAgPGFjdGl2YXRpb24vPgorICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLWJldGEtMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkuZm0tc29sci1jYXRhbG9nLnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGlzdC1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgIDwvYnVpbGQ+CisgICAgICA8L3Byb2ZpbGU+CisgICA8L3Byb2ZpbGVzPgorICAgPGRlcGVuZGVuY2llcz4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LWV4dGVuc2lvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgPHR5cGU+amFyPC90eXBlPgorICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FzLWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgPGFydGlmYWN0SWQ+Y2FzLWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisgICAgICAgICA8dmVyc2lvbj4ke29vZHQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKyAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LmZtLXNvbHItY2F0YWxvZy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkuZm0tc29sci1jYXRhbG9nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzBjODRjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LmZtLXNvbHItY2F0YWxvZy54bWwKQEAgLTAsMCArMSwxMDAgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmJpbjwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+ZmlsZW1ncjwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT43NzU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvYmluPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvYmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc3NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZmlsZW1nci9sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvcnVuPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvZXRjPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPmZpbGVtZ3IucHJvcGVydGllczwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgICA8ZmlsZU1vZGU+NjY0PC9maWxlTW9kZT4KKyAgICAgIDxkaXJlY3RvcnlNb2RlPjc3NTwvZGlyZWN0b3J5TW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5maWxlbWdyL3BvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qKi54bWw8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgICAgPGZpbGVNb2RlPjY2NDwvZmlsZU1vZGU+CisgICAgICA8ZGlyZWN0b3J5TW9kZT43NzU8L2RpcmVjdG9yeU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc2l0ZS9hcGlkb2NzPC9kaXJlY3Rvcnk+CisgICAgICA8ZmlsdGVyZWQ+ZmFsc2U8L2ZpbHRlcmVkPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorICAgIDxmaWxlcz4KKyAgICAgIDxmaWxlPgorICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9maWxlbWdyLmZtLXNvbHItY2F0YWxvZy5wcm9wZXJ0aWVzPC9zb3VyY2U+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZmlsZW1nci9ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPmZpbGVtZ3IucHJvcGVydGllczwvZGVzdE5hbWU+CisgICAgICA8L2ZpbGU+CisgICAgPC9maWxlcz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5maWxlbWdyL2xpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgPHVucGFja09wdGlvbnMvPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgPC9kZXBlbmRlbmN5U2V0cz4KKzwvYXNzZW1ibHk+CisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTg4MzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsOTEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmJpbjwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+ZmlsZW1ncjwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT43NzU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvYmluPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvYmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc3NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZmlsZW1nci9sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvcnVuPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvZXRjPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPmZpbGVtZ3IucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+KioueG1sPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT42NjQ8L2ZpbGVNb2RlPgorICAgICAgPGRpcmVjdG9yeU1vZGU+Nzc1PC9kaXJlY3RvcnlNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmZpbGVtZ3IvcG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyoqLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8ZmlsZU1vZGU+NjY0PC9maWxlTW9kZT4KKyAgICAgIDxkaXJlY3RvcnlNb2RlPjc3NTwvZGlyZWN0b3J5TW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zaXRlL2FwaWRvY3M8L2RpcmVjdG9yeT4KKyAgICAgIDxmaWx0ZXJlZD5mYWxzZTwvZmlsdGVyZWQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+CisgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZmlsZW1nci9saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgorCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9maWxlbWdyIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZmlsZW1ncgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdiNzdjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZmlsZW1ncgpAQCAtMCwwICsxLDE2OCBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorZGFyd2luPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK0RhcndpbiopIGRhcndpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IE9PRFRfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRPT0RUX0hPTUUiIF0gJiYgT09EVF9IT01FPWBjZCAiJFBSR0RJUi8uLi8uLiIgOyBwd2RgCisKKyMgR2V0IE9PRFQgZW52aXJvbm1lbnQgc2V0IHVwCitpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vZW52LnNoIF07IHRoZW4KKyAgLiAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaAorZmkKKworIyBPbmx5IHNldCBGSUxFTUdSX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitpZiBbIC16ICIkRklMRU1HUl9IT01FIiBdOyB0aGVuCisgIEZJTEVNR1JfSE9NRT0iJE9PRFRfSE9NRSIvZmlsZW1ncgorICBleHBvcnQgRklMRU1HUl9IT01FCitmaQorCitpZiBbIC16ICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgRklMRU1HUl9QSUQ9IiRGSUxFTUdSX0hPTUUiL3J1bi9jYXMuZmlsZW1nci5waWQKK2ZpIAorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJEpSRV9IT01FIiBdICYmIEpSRV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpSRV9IT01FImAKKyAgWyAtbiAiJE9PRFRfSE9NRSIgXSAmJiBPT0RUX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkT09EVF9IT01FImAKKyAgWyAtbiAiJEZJTEVNR1JfSE9NRSIgXSAmJiBGSUxFTUdSX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkRklMRU1HUl9IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCitpZiBbICIkMSIgPSAic3RhcnQiIF07IHRoZW4KKyAgaWYgWyAhIC16ICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgICBpZiBbIC1mICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgICAgIGVjaG8gIlBJRCBmaWxlICgkRklMRU1HUl9QSUQpIGZvdW5kLiBJcyBGaWxlIE1hbmFnZXIgc3RpbGwgcnVubmluZz8gU3RhcnQgYWJvcnRlZC4iCisgICAgICBleGl0IDEKKyAgICBmaQorICBmaQorCisgICMgTW92ZSB0byBiaW4gZGlyZWN0b3J5IGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBzb21lIG90aGVyIGRpcmVjdG9yeS4gCisgICMgVGhpcyBpcyB0byBrZWVwIHJlbGF0aXZlIHBhdGhzIGNvcnJlY3QuCisgIGNkICIkRklMRU1HUl9IT01FIi9iaW4KKyAgCisgICIkX1JVTkpBVkEiICRKQVZBX09QVFMgJE9PRFRfT1BUUyBcCisgICAgLURqYXZhLmV4dC5kaXJzPSIkRklMRU1HUl9IT01FIi9saWIgXAorICAgIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9IiRGSUxFTUdSX0hPTUUiL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgXAorICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9IiRGSUxFTUdSX0hPTUUiL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMgXAorICAgIC1EamF2YS5pby50bXBkaXI9IiRPT0RUX1RNUERJUiIgXAorICAgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXIgXAorICAgIC0tcG9ydE51bSAkRklMRU1HUl9QT1JUIDI+JjEgJgorCisgIGlmIFsgISAteiAiJEZJTEVNR1JfUElEIiBdOyB0aGVuCisgICAgZWNobyAkISA+ICRGSUxFTUdSX1BJRAorICBmaQorCisgIGlmIFsgJGhhdmVfdHR5IC1lcSAxIF07IHRoZW4KKyAgICBlY2hvICJGaWxlIE1hbmFnZXIgc3RhcnRlZCBQSUQgZmlsZSAoJEZJTEVNR1JfUElEKS4iCisgIGZpCisKK2VsaWYgWyAiJDEiID0gInN0b3AiIF07IHRoZW4KKworICBzaGlmdAorCisgIFNMRUVQPTUKKyAgaWYgWyAhIC16ICIkMSIgXTsgdGhlbgorICAgIGVjaG8gJDEgfCBncmVwICJbXjAtOV0iID4gL2Rldi9udWxsIDI+JjEKKyAgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgIFNMRUVQPSQxCisgICAgICBzaGlmdAorICAgIGZpCisgIGZpCisKKyAgRk9SQ0U9MAorICBpZiBbICIkMSIgPSAiLWZvcmNlIiBdOyB0aGVuCisgICAgc2hpZnQKKyAgICBGT1JDRT0xCisgIGZpCisKKyAgaWYgWyAhIC16ICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgICBpZiBbIC1mICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgICAgIGtpbGwgYGNhdCAkRklMRU1HUl9QSURgID4vZGV2L251bGwgMj4mMQorICAgICAgaWYgWyAkPyAtZXEgMSBdOyB0aGVuCisgICAgICAgIGVjaG8gIklEIGZpbGUgKCRGSUxFTUdSX1BJRCkgZm91bmQgd2l0aCBQSUQgYGNhdCAkRklMRU1HUl9QSURgIGJ1dCBubyBtYXRjaGluZyBwcm9jZXNzIHdhcyBmb3VuZC4gUmVtb3ZlZCAkRklMRU1HUl9QSUQsIG5vdyBGaWxlTWFuYWdlciBjYW4gYmUgc3RhcnRlZC4iCisgICAgICAgIGBybSAkRklMRU1HUl9QSURgCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJcJEZJTEVNR1JfUElEIHdhcyBzZXQgKCRGSUxFTUdSX1BJRCkgYnV0IHRoZSBzcGVjaWZpZWQgZmlsZSBkb2VzIG5vdCBleGlzdC4gSXMgRmlsZSBNYW5hZ2VyIHJ1bm5pbmc/IFN0b3AgYWJvcnRlZC4iCisgICAgICBleGl0IDEKKyAgICBmaQorICBmaQorCisgIGlmIFsgISAteiAiJEZJTEVNR1JfUElEIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiJEZJTEVNR1JfUElEIiBdOyB0aGVuCisgICAgICB3aGlsZSBbICRTTEVFUCAtZ2UgMCBdOyBkbworICAgICAgICBraWxsIC0wIGBjYXQgJEZJTEVNR1JfUElEYCA+L2Rldi9udWxsIDI+JjEKKyAgICAgICAgaWYgWyAkPyAtZXEgMSBdOyB0aGVuCisgICAgICAgICAgcm0gJEZJTEVNR1JfUElECisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAkU0xFRVAgLWd0IDAgXTsgdGhlbgorICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAkU0xFRVAgLWVxIDAgXTsgdGhlbgorICAgICAgICAgIGlmIFsgJEZPUkNFIC1lcSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkZpbGUgTWFuYWdlciBkaWQgbm90IHN0b3AgaW4gdGltZS4gUElEIGZpbGUgd2FzIG5vdCByZW1vdmVkLiIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICBTTEVFUD1gZXhwciAkU0xFRVAgLSAxIGAKKyAgICAgIGRvbmUKKyAgICBmaQorICBmaQorCisgIGlmIFsgJEZPUkNFIC1lcSAxIF07IHRoZW4KKyAgICBpZiBbIC16ICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgICAgIGVjaG8gIktpbGwgZmFpbGVkOiBcJEZJTEVNR1JfUElEIG5vdCBzZXQiCisgICAgZWxzZQorICAgICAgaWYgWyAtZiAiJEZJTEVNR1JfUElEIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIktpbGxpbmc6IGBjYXQgJEZJTEVNR1JfUElEYCIKKyAgICAgICAga2lsbCAtOSBgY2F0ICRGSUxFTUdSX1BJRGAKKyAgICAgICAgcm0gJEZJTEVNR1JfUElECisgICAgICBmaQorICAgIGZpCisgIGZpCisKK2Vsc2UKKyAgZWNobyAiVXNhZ2U6IGZpbGVtZ3Ige3N0YXJ0fHN0b3B8c3RhdHVzfSIKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZmlsZW1nci1jbGllbnQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9maWxlbWdyLWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBlYmQyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZmlsZW1nci1jbGllbnQKQEAgLTAsMCArMSw3NyBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorZGFyd2luPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK0RhcndpbiopIGRhcndpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IE9PRFRfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRPT0RUX0hPTUUiIF0gJiYgT09EVF9IT01FPWBjZCAiJFBSR0RJUi8uLi8uLiIgOyBwd2RgCisKKyMgR2V0IE9PRFQgZW52aXJvbm1lbnQgc2V0IHVwCitpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vZW52LnNoIF07IHRoZW4KKyAgLiAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaAorZmkKKworIyBPbmx5IHNldCBGSUxFTUdSX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitpZiBbIC16ICIkRklMRU1HUl9IT01FIiBdOyB0aGVuCisgIEZJTEVNR1JfSE9NRT0iJE9PRFRfSE9NRSIvZmlsZW1ncgorICBleHBvcnQgRklMRU1HUl9IT01FCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJEpSRV9IT01FIiBdICYmIEpSRV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpSRV9IT01FImAKKyAgWyAtbiAiJE9PRFRfSE9NRSIgXSAmJiBPT0RUX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkT09EVF9IT01FImAKKyAgWyAtbiAiJEZJTEVNR1JfSE9NRSIgXSAmJiBGSUxFTUdSX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkRklMRU1HUl9IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCisjIE1vdmUgdG8gYmluIGRpcmVjdG9yeSBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIGZyb20gc29tZSBvdGhlciBkaXJlY3RvcnkuCisjIFRoaXMgaXMgdG8ga2VlcCByZWxhdGl2ZSBwYXRocyBjb3JyZWN0LgorY2QgIiRGSUxFTUdSX0hPTUUiL2JpbgorCisiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRPT0RUX09QVFMgXAorICAtRGphdmEuZXh0LmRpcnM9IiRGSUxFTUdSX0hPTUUiL2xpYiBcCisgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9IiRGSUxFTUdSX0hPTUUiL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMgXAorICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSIkRklMRU1HUl9IT01FIi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZz1maWxlOiIkRklMRU1HUl9IT01FIi9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwgXAorICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnPWZpbGU6IiRGSUxFTUdSX0hPTUUiL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBcCisgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgIiRAIgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcXVlcnktdG9vbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3F1ZXJ5LXRvb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwMjc5MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3F1ZXJ5LXRvb2wKQEAgLTAsMCArMSw3NyBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorZGFyd2luPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK0RhcndpbiopIGRhcndpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IE9PRFRfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRPT0RUX0hPTUUiIF0gJiYgT09EVF9IT01FPWBjZCAiJFBSR0RJUi8uLi8uLiIgOyBwd2RgCisKKyMgR2V0IE9PRFQgZW52aXJvbm1lbnQgc2V0IHVwCitpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vZW52LnNoIF07IHRoZW4KKyAgLiAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaAorZmkKKworIyBPbmx5IHNldCBGSUxFTUdSX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitpZiBbIC16ICIkRklMRU1HUl9IT01FIiBdOyB0aGVuCisgIEZJTEVNR1JfSE9NRT0iJE9PRFRfSE9NRSIvZmlsZW1ncgorICBleHBvcnQgRklMRU1HUl9IT01FCitmaQorCitpZiBbIC16ICIkRklMRU1HUl9QSUQiIF07IHRoZW4KKyAgRklMRU1HUl9QSUQ9IiRGSUxFTUdSX0hPTUUiL3J1bi9jYXMuZmlsZW1nci5waWQKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICBbIC1uICIkSlJFX0hPTUUiIF0gJiYgSlJFX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSlJFX0hPTUUiYAorICBbIC1uICIkT09EVF9IT01FIiBdICYmIE9PRFRfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRPT0RUX0hPTUUiYAorICBbIC1uICIkT09EVF9CQVNFIiBdICYmIE9PRFRfQkFTRT1gY3lncGF0aCAtLXVuaXggIiRPT0RUX0JBU0UiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgTW92ZSB0byBiaW4gZGlyZWN0b3J5IGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBzb21lIG90aGVyIGRpcmVjdG9yeS4KKyMgVGhpcyBpcyB0byBrZWVwIHJlbGF0aXZlIHBhdGhzIGNvcnJlY3QuCitjZCAiJEZJTEVNR1JfSE9NRSIvYmluCisKKyIkX1JVTkpBVkEiICRKQVZBX09QVFMgJE9PRFRfT1BUUyBcCisgIC1EamF2YS5lbmRvcnNlZC5kaXJzPS4uL2xpYiBcCisgIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci50b29scy5RdWVyeVRvb2wgIiRAIgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvZmlsZW1nci5mbS1zb2xyLWNhdGFsb2cucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2ZpbGVtZ3IuZm0tc29sci1jYXRhbG9nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZWEzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2ZpbGVtZ3IuZm0tc29sci1jYXRhbG9nLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMTMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBGaWxlIE1hbmFnZXIKKworIyByZXBvc2l0b3J5IGZhY3RvcnkKK2ZpbGVtZ3IucmVwb3NpdG9yeS5mYWN0b3J5PW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LlhNTFJlcG9zaXRvcnlNYW5hZ2VyRmFjdG9yeQorCisjIFNvbHIgY2F0YWxvZyBmYWN0b3J5CitmaWxlbWdyLmNhdGFsb2cuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5zb2xyLlNvbHJDYXRhbG9nRmFjdG9yeQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuc29sci51cmw9aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NvbHIvb29kdC1mbQorCisjIGRhdGEgdHJhbnNmZXIgZmFjdG9yeQorZmlsZW1nci5kYXRhdHJhbnNmZXIuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeQorCisjIHZhbGlkYXRpb24gbGF5ZXIgZmFjdG9yeQorZmlsZW1nci52YWxpZGF0aW9uTGF5ZXIuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5CisKKyMgeG1sIHJwYyBjbGllbnQgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcz0yMAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMucmVxdWVzdFRpbWVvdXQubWludXRlcz02MAorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLmNvbm5lY3Rpb24ucmV0cmllcz0wCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvbi5yZXRyeS5pbnRlcnZhbC5zZWNvbmRzPTMKKworIyBtYXBwZWQgZGF0YSBzb3VyY2UgY2F0YWxvZyBjb25maWd1cmF0aW9uCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubWFwcGVkZGF0YXNvdXJjZS5tYXBGaWxlPS9wYXRoL3RvL29wcy5jYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcworCisjIGx1Y2VuZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoPVtPT0RUX0hPTUVdL2RhdGEvY2F0YWxvZworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLnBhZ2VTaXplPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuY29tbWl0TG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLndyaXRlTG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLm1lcmdlRmFjdG9yPTIwCisKKyMgWE1MIHJlcG9zaXRvcnkgbWFuYWdlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzPWZpbGU6W0ZJTEVNR1JfSE9NRV0vcG9saWN5L29vZHQKKworIyBYTUwgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzPWZpbGU6W0ZJTEVNR1JfSE9NRV0vcG9saWN5L29vZHQKKworIyByZW1vdGUgZGF0YSB0cmFuc2ZlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnJlbW90ZS5jaHVua1NpemU9MTAyNAorCisjIGxvY2F0aW9uIG9mIE1pbWUtVHlwZSByZXBvc2l0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnk9W0ZJTEVNR1JfSE9NRV0vZXRjL21pbWUtdHlwZXMueG1sCisKKworIyMjIyMjIyMjIyMjIGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGVzZSAzIGJsb2NrcyBvZiBjb25maWcgcHJvcGVydGllcyBjYW4gYmUgdXNlZCB0byBzZXR1cCBhIGNhdGFsb2csCisjIHJlcG9zaXRvcnkgbWFuYWdlciwgYW5kIHZhbGlkYXRpb24gbGF5ZXIgYmFzZWQgb24gYSBSREJNUyBzdWNoIGFzCisjIE9yYWNsZSwgTXlTUUwsIFBvc3RncmVTUUwsIG9yIGFueSBvdGhlcnMgdGhhdCBzdXBwb3J0IGEgamRiYyBjb25uZWN0aW9uLgorIyBKdXN0IHVuLWNvbW1lbnQgdGhlIGZvbGxvd2luZyBibG9ja3Mgb2YgcHJvcGVydGllcyBhbmQgY29uZmlndXJlIGFzCisjIG5lZWRlZC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkYXRhc291cmNlIGNhdGFsb2cgY29uZmlnCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVybD1zb21lX2pkYmNfdXJsCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVzZXI9dXNlcgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy5wYXNzPXBhc3MKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMuZHJpdmVyPWRyaXZlci5jbGFzcy5uYW1lCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5xdW90ZUZpZWxkcz1mYWxzZQorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UucGFnZVNpemU9MjAKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmNhY2hlVXBkYXRlTWludXRlcz01CisKKyMgZGF0YSBzb3VyY2UgcmVwb3NpdG9yeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMudXJsPXNvbWVfamRiY191cmwKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnBhc3M9cGFzcworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9ZHJpdmVyLmNsYXNzLm5hbWUKKworIyBkYXRhIHNvdXJjZSB2YWxpZGF0aW9uIGxheWVyIGNvbmZpZ3VyYXRpb24KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMudXJsPXNvbWVfamRiY191cmwKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLnBhc3M9cGFzcworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9ZHJpdmVyLmNsYXNzLm5hbWUKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLnF1b3RlRmllbGRzPWZhbHNlCisKKworIyB0ZWxscyB0aGUgZmlsZSBtYW5hZ2VyIHN5c3RlbSBsYXllciB0byBpbmNsdWRlIHByb2R1Y3QgaW5zdGFuY2UgbWV0YWRhdGEKKyMgTk9URTogaGVyZSBhcmUgdGhlIGV4cGVjdGVkIGZpZWxkIG1hcHBpbmdzCisjCisjIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgLT4gUHJvZHVjdElkCisjIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSAtPiBQcm9kdWN0TmFtZQorIyBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSAtPiBQcm9kdWN0U3RydWN0dXJlCisjIHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSAtPiBQcm9kdWN0VHJhbnNmZXJTdGF0dXMKKyMgcHJvZHVjdC5nZXRSb290UmVmKCkgLT4gUHJvZHVjdFJvb3RSZWZlcmVuY2UKKworIyBmb3IgdGhlIHJlZmVyZW5jZXMgcmV0dXJuZWQgYnkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpIHRoZSBmb2xsb3dpbmcKKyMgbWV0YWRhdGEgZmllbGRzIHdpbGwgYmUgYWRkZWQgKG9yZGVyIHdpbGwgYmUgbWFpbnRhaW5lZCwgc3VjaCB0aGF0IGRhdGEgc3RvcmUKKyMgcmVmIGF0IGluZGV4IDAgd2lsbCBtYXAgdG8gb3JpZyByZWYgYXQgaW5kZXggMCwgZXRjLikKKyMKKyMgUHJvZHVjdERhdGFTdG9yZVJlZmVyZW5jZXMgKGxpc3Qgb2YgYWxsIGRhdGEgc3RvcmUgcmVmZXJlbmNlczoKKyMgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyBQcm9kdWN0T3JpZ1JlZmVyZW5jZXMgKGxpc3Qgb2YgYWxsIG9yaWcgcmVmZXJlbmNlczoKKyMgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyBQcm9kdWN0TWltZVR5cGUgKGxpc3Qgb2YgYWxsIHJlZmVyZW5jZXMnIG1pbWUtdHlwZXMpCisjIFByb2R1Y3RGaWxlU2l6ZSAobGlzdCBvZiBhbGwgcmVmZXJlbmNlcycgZmlsZSBzaXplcykKKworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4cGFuZFByb2R1Y3Q9ZmFsc2UKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2ZpbGVtZ3IucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2ZpbGVtZ3IucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JmZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTEyIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgRmlsZSBNYW5hZ2VyCisKKyMgcmVwb3NpdG9yeSBmYWN0b3J5CitmaWxlbWdyLnJlcG9zaXRvcnkuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeS5YTUxSZXBvc2l0b3J5TWFuYWdlckZhY3RvcnkKKworIyBMdWNlbmUgY2F0YWxvZyBmYWN0b3J5CitmaWxlbWdyLmNhdGFsb2cuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5MdWNlbmVDYXRhbG9nRmFjdG9yeQorCisjIGRhdGEgdHJhbnNmZXIgZmFjdG9yeQorZmlsZW1nci5kYXRhdHJhbnNmZXIuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeQorCisjIHZhbGlkYXRpb24gbGF5ZXIgZmFjdG9yeQorZmlsZW1nci52YWxpZGF0aW9uTGF5ZXIuZmFjdG9yeT1vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTGF5ZXJGYWN0b3J5CisKKyMgeG1sIHJwYyBjbGllbnQgY29uZmlndXJhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcz0yMAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMucmVxdWVzdFRpbWVvdXQubWludXRlcz02MAorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ueG1scnBjLmNvbm5lY3Rpb24ucmV0cmllcz0wCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS54bWxycGMuY29ubmVjdGlvbi5yZXRyeS5pbnRlcnZhbC5zZWNvbmRzPTMKKworIyBtYXBwZWQgZGF0YSBzb3VyY2UgY2F0YWxvZyBjb25maWd1cmF0aW9uCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubWFwcGVkZGF0YXNvdXJjZS5tYXBGaWxlPS9wYXRoL3RvL29wcy5jYXRhbG9nLnR5cGVtYXAucHJvcGVydGllcworCisjIGx1Y2VuZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmx1Y2VuZS5pZHhQYXRoPVtPT0RUX0hPTUVdL2RhdGEvY2F0YWxvZworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLnBhZ2VTaXplPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sdWNlbmUuY29tbWl0TG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLndyaXRlTG9ja1RpbWVvdXQuc2Vjb25kcz02MAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubHVjZW5lLm1lcmdlRmFjdG9yPTIwCisKKyMgWE1MIHJlcG9zaXRvcnkgbWFuYWdlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kaXJzPWZpbGU6W0ZJTEVNR1JfSE9NRV0vcG9saWN5L29vZHQKKworIyBYTUwgdmFsaWRhdGlvbiBsYXllciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kaXJzPWZpbGU6W0ZJTEVNR1JfSE9NRV0vcG9saWN5L29vZHQKKworIyByZW1vdGUgZGF0YSB0cmFuc2ZlciBjb25maWd1cmF0aW9uCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLnJlbW90ZS5jaHVua1NpemU9MTAyNAorCisjIGxvY2F0aW9uIG9mIE1pbWUtVHlwZSByZXBvc2l0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnk9W0ZJTEVNR1JfSE9NRV0vZXRjL21pbWUtdHlwZXMueG1sCisKKworIyMjIyMjIyMjIyMjIGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGVzZSAzIGJsb2NrcyBvZiBjb25maWcgcHJvcGVydGllcyBjYW4gYmUgdXNlZCB0byBzZXR1cCBhIGNhdGFsb2csCisjIHJlcG9zaXRvcnkgbWFuYWdlciwgYW5kIHZhbGlkYXRpb24gbGF5ZXIgYmFzZWQgb24gYSBSREJNUyBzdWNoIGFzCisjIE9yYWNsZSwgTXlTUUwsIFBvc3RncmVTUUwsIG9yIGFueSBvdGhlcnMgdGhhdCBzdXBwb3J0IGEgamRiYyBjb25uZWN0aW9uLgorIyBKdXN0IHVuLWNvbW1lbnQgdGhlIGZvbGxvd2luZyBibG9ja3Mgb2YgcHJvcGVydGllcyBhbmQgY29uZmlndXJlIGFzCisjIG5lZWRlZC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkYXRhc291cmNlIGNhdGFsb2cgY29uZmlnCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVybD1zb21lX2pkYmNfdXJsCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5qZGJjLnVzZXI9dXNlcgorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UuamRiYy5wYXNzPXBhc3MKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmpkYmMuZHJpdmVyPWRyaXZlci5jbGFzcy5uYW1lCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cuZGF0YXNvdXJjZS5xdW90ZUZpZWxkcz1mYWxzZQorI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLmRhdGFzb3VyY2UucGFnZVNpemU9MjAKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5kYXRhc291cmNlLmNhY2hlVXBkYXRlTWludXRlcz01CisKKyMgZGF0YSBzb3VyY2UgcmVwb3NpdG9yeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMudXJsPXNvbWVfamRiY191cmwKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucmVwb3NpdG9yeW1nci5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnltZ3IuZGF0YXNvdXJjZS5qZGJjLnBhc3M9cGFzcworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5bWdyLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9ZHJpdmVyLmNsYXNzLm5hbWUKKworIyBkYXRhIHNvdXJjZSB2YWxpZGF0aW9uIGxheWVyIGNvbmZpZ3VyYXRpb24KKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMudXJsPXNvbWVfamRiY191cmwKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCisjb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24uZGF0YXNvdXJjZS5qZGJjLnBhc3M9cGFzcworI29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmRhdGFzb3VyY2UuamRiYy5kcml2ZXI9ZHJpdmVyLmNsYXNzLm5hbWUKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudmFsaWRhdGlvbi5kYXRhc291cmNlLnF1b3RlRmllbGRzPWZhbHNlCisKKworIyB0ZWxscyB0aGUgZmlsZSBtYW5hZ2VyIHN5c3RlbSBsYXllciB0byBpbmNsdWRlIHByb2R1Y3QgaW5zdGFuY2UgbWV0YWRhdGEKKyMgTk9URTogaGVyZSBhcmUgdGhlIGV4cGVjdGVkIGZpZWxkIG1hcHBpbmdzCisjCisjIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgLT4gUHJvZHVjdElkCisjIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSAtPiBQcm9kdWN0TmFtZQorIyBwcm9kdWN0LmdldFByb2R1Y3RTdHJ1Y3R1cmUoKSAtPiBQcm9kdWN0U3RydWN0dXJlCisjIHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSAtPiBQcm9kdWN0VHJhbnNmZXJTdGF0dXMKKyMgcHJvZHVjdC5nZXRSb290UmVmKCkgLT4gUHJvZHVjdFJvb3RSZWZlcmVuY2UKKworIyBmb3IgdGhlIHJlZmVyZW5jZXMgcmV0dXJuZWQgYnkgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpIHRoZSBmb2xsb3dpbmcKKyMgbWV0YWRhdGEgZmllbGRzIHdpbGwgYmUgYWRkZWQgKG9yZGVyIHdpbGwgYmUgbWFpbnRhaW5lZCwgc3VjaCB0aGF0IGRhdGEgc3RvcmUKKyMgcmVmIGF0IGluZGV4IDAgd2lsbCBtYXAgdG8gb3JpZyByZWYgYXQgaW5kZXggMCwgZXRjLikKKyMKKyMgUHJvZHVjdERhdGFTdG9yZVJlZmVyZW5jZXMgKGxpc3Qgb2YgYWxsIGRhdGEgc3RvcmUgcmVmZXJlbmNlczoKKyMgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyBQcm9kdWN0T3JpZ1JlZmVyZW5jZXMgKGxpc3Qgb2YgYWxsIG9yaWcgcmVmZXJlbmNlczoKKyMgbm90ZSBhbHJlYWR5IHRyYW5zbGF0ZWQgaW50byBwYXRoLCBub3QgVVJJKQorIyBQcm9kdWN0TWltZVR5cGUgKGxpc3Qgb2YgYWxsIHJlZmVyZW5jZXMnIG1pbWUtdHlwZXMpCisjIFByb2R1Y3RGaWxlU2l6ZSAobGlzdCBvZiBhbGwgcmVmZXJlbmNlcycgZmlsZSBzaXplcykKKworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4cGFuZFByb2R1Y3Q9ZmFsc2UKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFkY2MxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgdHdvIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcgorCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgcm9vdCBsb2dnZXIKKy5sZXZlbCA9IEFMTAorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwgPSBBTEwKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxldmVsID0gQUxMCisgICAgICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKworIyBkZWZhdWx0IGZpbGUgb3V0cHV0IGlzIGluIHVzZXIncyBob21lIGRpcmVjdG9yeS4KK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm4gPSAuLi9sb2dzL2Nhc19maWxlbWdyJWcubG9nCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5saW1pdCA9IDUwMDAwCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5jb3VudCA9IDUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmFwcGVuZCA9IHRydWUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHN1YnN5c3RlbXMKKworIyBjYXRhbG9nIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNhdGFsb2cubGV2ZWwgPSBJTkZPCisKKyMgcmVwb3NpdG9yeSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5yZXBvc2l0b3J5LmxldmVsID0gRklORQorCisjIHN5c3RlbSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ubGV2ZWwgPSBJTkZPCisKKyMgdmVyc2lvbmluZyBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLmxldmVsID0gSU5GTworCisjIGRhdGEgdHJhbnNmZXIgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLmxldmVsID0gRklORQorCisjIHV0aWwKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51dGlsLmxldmVsID0gSU5GTworCisjIHZhbGlkYXRpb24KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52YWxpZGF0aW9uLmxldmVsID0gSU5GTworCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjCitvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5oZWFkZXIubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUubGV2ZWwgPSBJTkZPCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9taW1lLXR5cGVzLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL21pbWUtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjc4YmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9taW1lLXR5cGVzLnhtbApAQCAtMCwwICsxLDQxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgIERlc2NyaXB0aW9uOiBUaGlzIHhtbCBmaWxlIGRlZmluZXMgdGhlIHZhbGlkIG1pbWUgdHlwZXMgdXNlZCBieSBUaWthLgorICBUaGUgbWltZSB0eXBlIGRhdGEgd2l0aGluIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMKKyAgc291cmNlcyBsaWtlIEFwYWNoZSBOdXRjaCwgQXBhY2hlIEhUVFAgU2VydmVyLCB0aGUgZmlsZSgxKSBjb21tYW5kLCBldGMuCistLT4KKzxtaW1lLWluZm8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hY3RpdmVtZXNzYWdlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vYW5kcmV3LWluc2V0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV6Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FwcGxlZmlsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2FwcGxpeHdhcmUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZmVlZCIgbmFtZXNwYWNlVVJJPSJodHRwOi8vcHVybC5vcmcvYXRvbS9ucyMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF0b20iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdG9tY2F0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F0b21pY21haWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdG9tc3ZjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2F1dGgtcG9saWN5K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2JhdGNoLXNtdHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9iZWVwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NhbHMtMTg0MCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NjeG1sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jY3htbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jZWEtMjAxOCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jZWxsbWwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY25ycCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jb21tb25ncm91bmQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9jb25mZXJlbmNlLWluZm8reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3BsK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2NzdGEreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3N0YWRhdGEreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3Utc2VlbWUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vY3liZXJjYXNoIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZGF2bW91bnQreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhdm1vdW50Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RjYS1yZnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kZWMtZHgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaWFsb2ctaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9kaWNvbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2RucyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2R2Y3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVjbWEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZWRpLWNvbnNlbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9lZGkteDEyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZWRpZmFjdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2VtbWEreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtbWEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXBwK3htbCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXB1Yit6aXAiPgorICAgIDxhY3JvbnltPkVQVUI8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkVsZWN0cm9uaWMgUHVibGljYXRpb248L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQS1wwMDNcMDA0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi9lcHViK3ppcCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lcHViIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZXNob3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9leGFtcGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vZmFzdGluZm9zZXQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9mYXN0c29hcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2ZpdHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9mb250LXRkcGZyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9oMjI0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaHR0cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2h5cGVyc3R1ZGlvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ayIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUta2V5LXJlcXVlc3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaWJlLXBrZy1yZXBseSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pYmUtcHAtZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lnZXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbS1pc2NvbXBvc2luZyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9pbmRleCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4LmNtZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4Lm9iaiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2luZGV4LnJlc3BvbnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW5kZXgudm5kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vaW90cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lwcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2lzdXAiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3QiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2pzb24iPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanNvbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL2phdmEtdm0iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGNhZmViYWJlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xhc3MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9rcG1sLXJlcXVlc3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24va3BtbC1yZXNwb25zZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9sb3N0K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sb3N0eG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleCIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9iaW5oZXgiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0ibXVzdFwgYmVcIGNvbnZlcnRlZFwgd2l0aFwgQmluSGV4IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTEiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHF4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3B0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWFjd3JpdGVpaSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hcmMiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXJjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uYiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWF0aG1sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tYXRobWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1hc3NvY2lhdGVkLXByb2NlZHVyZS1kZXNjcmlwdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLWRlcmVnaXN0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1lbnZlbG9wZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLW1zayt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLW1zay1yZXNwb25zZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXByb3RlY3Rpb24tZGVzY3JpcHRpb24reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWNlcHRpb24tcmVwb3J0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21ibXMtcmVnaXN0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWJtcy1yZWdpc3Rlci1yZXNwb25zZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm1zLXVzZXItc2VydmljZS1kZXNjcmlwdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tYm94Ij4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1ib3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbWVkaWFfY29udHJvbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zY21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL21pa2V5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbW9zcy1rZXlzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbW9zcy1zaWduYXR1cmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3Nza2V5LWRhdGEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tb3Nza2V5LXJlcXVlc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcDQiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXA0cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9tcGVnNC1nZW5lcmljIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXBlZzQtaW9kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXBlZzQtaW9kLXhtdCIvPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi9tc3dvcmQgLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbXN3b3JkIj4KKyAgICA8IS0tIFVzZSBvcmcuYXBhY2hlLnRpa2EuZGV0ZWN0LkNvbnRhaW5lckF3YXJlRGV0ZWN0b3IgZm9yIG1vcmUgcmVsaWFibGUgZGV0ZWN0aW9uIG9mIE9MRTIgZG9jdW1lbnRzIC0tPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZCIvPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgV29yZCBEb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik1pY3Jvc29mdFwgV29yZFwgNi4wXCBEb2N1bWVudCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRG9jdW1lbnRvXCBNaWNyb3NvZnRcIFdvcmRcIDYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik1TV29yZERvYyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgzMWJlMDAwMCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQT15RYCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDM3NlwwNjdcMFwwNDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwzMzNcMjQ1LVwwXDBcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDM1NFwyNDVcMzAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNTEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwzMjBcMzE3XDAyMVwzNDBcMjQxXDI2MVwwMzJcMzQxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMjI0XDI0NlwwNTYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICA8bWF0Y2ggdmFsdWU9IldceDAwb1x4MDByXHgwMGRceDAwRFx4MDBvXHgwMGNceDAwdVx4MDBtXHgwMGVceDAwblx4MDB0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTE1Mjo0MDk2IiAvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZG9jIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb3QiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL214ZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5teGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbmFzZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtY2hlY2tncm91cHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9uZXdzLWdyb3VwaW5mbyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL25ld3MtdHJhbnNtaXNzaW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vbnNzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2NzcC1yZXF1ZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2NzcC1yZXNwb25zZSIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iI1wgVGhpc1wgaXNcIGFcIHNoZWxsXCBhcmNoaXZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMTAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAzN1wwMzYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjAxNzQzNyIgdHlwZT0iaG9zdDE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxZmZmIiB0eXBlPSJob3N0MTYiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMzc3XDAzNyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDE0NTQwNSIgdHlwZT0iaG9zdDE2IiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmluIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kbXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxoYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubHJmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5semgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNvIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pc28iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRtZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGlzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGlzdHoiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBrZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYnBrIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kdW1wIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbGMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlcGxveSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL29kYSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3BmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb2dnIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1vZ2ciLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iT2dnUyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2d4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vb25lbm90ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vbmV0b2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXRvYzIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9uZXRtcCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioub25lcGtnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Bhcml0eWZlYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGVyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGRmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1wZGYiLz4KKyAgICA8YWNyb255bT5QREY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlBvcnRhYmxlIERvY3VtZW50IEZvcm1hdDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiVQREYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZGYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBncCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wZ3Ata2V5cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXNjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaWciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGljcy1ydWxlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcmYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGlkZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9waWRmLWRpZmYreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtjczEwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnAxMCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnA3bSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucDdjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wN3MiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeC1jZXJ0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNlciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wa2l4LWNybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeC1wa2lwYXRoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBraXBhdGgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGtpeGNtcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wa2kiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcGxzK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcG9jLXNldHRpbmdzK3htbCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcG9zdHNjcmlwdCI+CisgICAgPF9jb21tZW50PlBvc3RTY3JpcHQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIlISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwwMDQlISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8IS0tIFdpbmRvd3MgZm9ybWF0IEVQUyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhjNWQwZDNjNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWkiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lcHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwc2YiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVwc2kiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMuYWx2ZXN0cmFuZC50aXRyYXgtc2hlZXQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMuY3d3Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN3dyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9wcnMubnByZW5kIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcHJzLnBsdWNrZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9xc2lnIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZGYreG1sIj4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJSREYiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJSREYiIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPGFjcm9ueW0+UkRGL1hNTDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+WE1MIHN5bnRheCBmb3IgUkRGIGdyYXBoczwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yZGYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm93bCIvPgorICAgIDxnbG9iIHBhdHRlcm49Il5yZGYkIiBpc3JlZ2V4PSJ0cnVlIi8+CisgICAgPGdsb2IgcGF0dGVybj0iXm93bCQiIGlzcmVnZXg9InRydWUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZWdpbmZvK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yaWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXgiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm5jIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmlzY29zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcmxtaSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3JzZCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnNkIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQvcnNzIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icnNzIi8+CisgICAgPHJvb3QtWE1MIG5hbWVzcGFjZVVSST0iaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yc3MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9ydGYiPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3J0ZiIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJ7XFxydGYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ0ZiIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3J0eCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NhbWxhc3NlcnRpb24reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2FtbG1ldGFkYXRhK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NibWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNibWwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjcSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlc3BvbnNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3QiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVzcG9uc2UiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NkcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2V0LXBheW1lbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNldHBheSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvbi1pbml0aWF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNldHJlZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zZ21sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2dtbC1vcGVuLWNhdGFsb2ciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaGYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNoZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zaWV2ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZS1maWx0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc2ltcGxlLW1lc3NhZ2Utc3VtbWFyeSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NpbXBsZXN5bWJvbGNvbnRhaW5lciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NsYXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc21pbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NtaWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNtaSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc21pbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnkiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNyeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcGlyaXRzLWV2ZW50K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3NyZ3MiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3JhbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zcmdzK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncnhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi9zc21sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zc21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1xdWVyeSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1yZXBseSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3R2ZS10cmlnZ2VyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdWxwZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdmVtbWkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92aXZpZGVuY2Uuc2NyaXB0ZmlsZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLmJzZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctbGFyZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGxiIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1zbWFsbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wc2IiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXZhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wdmIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAuc21zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLmJjbWNzaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM2dwcDIuc21zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLjNncHAyLnRjYXAiPgorICAgIDxnbG9iIHBhdHRlcm49IioudGNhcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3RlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wd24iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuYXNvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5pbXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaW1wIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hY3UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFjdWNvcnAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXRjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hY3V0YyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWlyLWFwcGxpY2F0aW9uLWluc3RhbGxlci1wYWNrYWdlK3ppcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haXIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueGRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhmZGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFldGhlci5pbXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF6dyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW1lcmljYW5keW5hbWljcy5hY2MiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWNjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbWlnYS5hbWkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYW1pIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hcGsiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1jZXJ0aWZpY2F0ZS1pc3N1ZS1pbml0aWF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNpaSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWZ1bmRzLXRyYW5zZmVyLWluaXRpYXRpb24iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZnRpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hbnRpeC5nYW1lLWNvbXBvbmVudCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBrZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pd29yayI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtleSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGFnZXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm51bWJlcnMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYXBwbGUua2V5bm90ZSI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icHJlc2VudGF0aW9uIiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL25hbWVzcGFjZXMva2V5bm90ZTIiIC8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5wYWdlcyI+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iZG9jdW1lbnQiIG5hbWVzcGFjZVVSST0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbmFtZXNwYWNlcy9zbCIgLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmFwcGxlLm51bWJlcnMiPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImRvY3VtZW50IiBuYW1lc3BhY2VVUkk9Imh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL25hbWVzcGFjZXMvbHMiIC8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hcmFzdHJhLnN3aSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zd2kiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmF1ZGlvZ3JhcGgiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWVwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hdXRvcGFja2FnZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5hdmlzdGFyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ibHVlaWNlLm11bHRpcGFzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcG0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmJsdWV0b290aC5lcC5vb2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYm1pIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJtaSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJlcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2FiLWpzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2Fub24tY3BkbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jYW5vbi1saXBzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNlbmRpby50aGlubGluYy5jbGllbnRjb25mIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNoZW1kcmF3K3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZHhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2hpcG51dHMua2FyYW9rZS1tbWQiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW1kIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jaW5kZXJlbGxhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkeSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY2lycGFjay5pc2RuLWV4dCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jbGF5bW9yZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNsb25rLmM0Z3JvdXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYzRnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jNGQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmM0ZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYzRwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jNHUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvbW1lcmNlLWJhdHRlbGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvbW1vbnNwYWNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNkYmNtc2ciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNvc21vY2FsbGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGt4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa2siLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIucGFsZXR0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGtwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnRlbXBsYXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNsa3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIud29yZGJhbmsiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2xrdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3JpdGljYWx0b29scy53YnMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndicyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3RjLXBvc21sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3RjdC53cyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wZGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wb3N0c2NyaXB0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmN1cHMtcHBkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1yYXN0ZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3Vwcy1yYXciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuY3VybC5jYXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2FyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjdXJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5jeWJhbmsiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJkeiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZGVub3ZvLmZjc2VsYXlvdXQtbGluayI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mZV9sYXVuY2giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmRpci1iaS5wbGF0ZS1kbC1ub3N1ZmZpeCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kbmEiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZG5hIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tbHAiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWxwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kcGdyYXBoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRwZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRmYWMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5lc2djb250YWluZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmlwZGNkZnRub3RpZmFjY2VzcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2VzZ2FjY2VzcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY3JvYW1pbmciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLmlwdHYuYWxmZWMtYmFzZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXB0di5hbGZlYy1lbmhhbmNlbWVudCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtYWdncmVnYXRlLXJvb3QreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1jb250YWluZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1nZW5lcmljK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtbXNnbGlzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWlhLXJlZ2lzdHJhdGlvbi1yZXF1ZXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtcmVnaXN0cmF0aW9uLXJlc3BvbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaW5pdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZHhyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmR5bmFnZW8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2VvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lY2Rpcy11cGRhdGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmNoYXJ0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGVyZXF1ZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxldXBkYXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3JlcXVlc3QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3VwZGF0ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lbWNsaWVudC5hY2Nlc3NyZXF1ZXN0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5tbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVzZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24ubXNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXBzb24ucXVpY2thbmltZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xYW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2x0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5zc2YiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3NmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lcmljc3Nvbi5xdWlja2NhbGwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXN6aWdubzMreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVzMyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXQzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmFvYyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5jdWcreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmNvbW1hbmQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmRpc2NvdmVyeSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2cHJvZmlsZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2FkLWJjK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtY29kK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtbnB2cit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2dWVwcm9maWxlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm1jaWQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV0c2kuc2NpK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnNpbXNlcnZzK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ldWRvcmEuZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1hbGJ1bSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lejIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmV6cGl4LXBhY2thZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZXozIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mLXNlY3VyZS5tb2JpbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZkZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRzbi5tc2VlZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2VlZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmRzbi5zZWVkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlZWQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhdGFsZXNzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mZnNucyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5maW50cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mbG9ncmFwaGl0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdwaCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZmx1eHRpbWUuY2xpcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mdGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZvbnQtZm9udGZvcmdlLXNmZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mcmFtZW1ha2VyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mcmFtZSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWFrZXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJvb2siLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZuYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5sdGYiPgorICAgIDxnbG9iIHBhdHRlcm49IioubHRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mc2Mud2VibGF1bmNoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZzYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5cyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vYXMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9hMiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czMiPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2EzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3AiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmc1Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJoMiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmFydC1leCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guYXJ0NCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guaGJwbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRkZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3JrcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZHciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MuYmluZGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhiZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZnV0LW1pc25ldCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5mdXp6eXNoZWV0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ6cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2Vub21hdGl4LnR1eGVkbyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50eGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2diIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5nZW9nZWJyYS50b29sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdndCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ2VvbWV0cnktZXhwbG9yZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2V4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncmUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdteCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nbXgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmttbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmtteiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rbXoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyYWZlcSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdxcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3JpZG1wIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdhYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWhlbHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2hmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaWRlbnRpdHktbWVzc2FnZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5naW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS1pbmplY3RvciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ncnYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLW1lc3NhZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3RtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC10ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50cGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52Y2ciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnptbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaGJjaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oYmNpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oY2wtYmlyZXBvcnRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhoZS5sZXNzb24tcGxheWVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxlcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHAtaHBnbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ocGdsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhwaWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWhwcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ocHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmhwLWpseXQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouamx0Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2wiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGNsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2x4bCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY2x4bCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHR0cGhvbmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaHlkcm9zdGF0aXguc29mLWRhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2ZkLWhkc3R4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5oem4tM2QtY3Jvc3N3b3JkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLngzZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLmFmcGxpbmVkYXRhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5lbGVjdHJvbmljLW1lZGlhIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1weSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hZnAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3RhZnAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxpc3QzODIwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0ucmlnaHRzLW1hbmFnZW1lbnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXJtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWNjcHJvZmlsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY2MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmljbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaWdsb2FkZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWdsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXZwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXZ1Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbmZvcm1lZGNvbnRyb2wucm1zK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbmZvcm1peC12aXNpb25hcnkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cHciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhweCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5kaWdpYm94Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludGVydHJ1c3Qubm5jcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFibyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xYm8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmludHUucWZ4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFmeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5jb25jZXB0aXRlbSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5rbm93bGVkZ2VpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLm5ld3NpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLnBhY2thZ2VpdGVtK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGUiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmNwcm9maWxlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5pcmVwb3NpdG9yeS5wYWNrYWdlK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pcnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmlzLXhwciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cHIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qYW0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWRpcmVjdG9yeS1zZXJ2aWNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1wYXltZW50LXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uLXdha2V1cCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1zZXRzdG9yZS13YWtldXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtdmVyaWZpY2F0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamNwLmphdmFtZS5taWRsZXQtcm1zIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJtcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuamlzcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qaXNwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5qb29zdC5qb2RhLWFyY2hpdmUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouam9kYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2Fob290eiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rdHoiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmt0ciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmthcmJvbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rYXJib24iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtkZS5rY2hhcnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2hydCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtmb3JtdWxhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtmbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtpdmlvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtvbnRvdXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua29uIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua3ByZXNlbnRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rcHIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtwdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2RlLmtzcHJlYWQiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua3NwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5rZGUua3dvcmQiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua3dkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rd3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtlbmFtZWFhcHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHRrZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmtpYSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua2luYXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iioua25lIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5rbnAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmtvYW4iPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWtvYW4iLz4KKyAgICA8X2NvbW1lbnQ+U1NFWU8gS29hbiBGaWxlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrcCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2tkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5za3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNrbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQua29kYWstZGVzY3JpcHRvciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zc2UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxpYmVydHktcmVxdWVzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZGVza3RvcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sYmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sYmUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLTEtMi0zIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLjEyMyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2giPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXByIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHJlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1ub3RlcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uc2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vcmciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zY20iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHBybyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IldvcmRQcm9cMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IldvcmRQcm9cclwzNzMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5sd3AiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWFjcG9ydHMucG9ydHBrZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb3J0cGtnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmFjdGlvbnRva2VuK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmNvbmZ0b2tlbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5saWNlbnNlK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLm1kY2YiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWNkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1jZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWVkY2FsY2RhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWMxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZWRpYXN0YXRpb24uY2RrZXkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2RrZXkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1lcmlkaWFuLXNsaW5nc2hvdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tZmVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm13ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWZtcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZm0iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguZmxvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZsbyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5pZ3giPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWd4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1pZiI+CisgICAgPF9jb21tZW50PkZyYW1lTWFrZXIgTUlGIGRvY3VtZW50PC9fY29tbWVudD4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1taWYiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1mcmFtZSIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01ha2VyRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TUlGRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXJEaWN0aW9uYXJ5IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXCZsdDtNYWtlclNjcmVlbkZvbnQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcJmx0O01NTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7Qm9vayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwmbHQ7TWFrZXIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5taWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWluaXNvZnQtaHAzMDAwLXNhdmUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubWl0c3ViaXNoaS5taXN0eS1ndWFyZC50cnVzdHdlYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGFmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRhZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLmRpcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaXMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy5tYmsiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWJrIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1xeSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1zbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2wiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vYml1cy5wbGMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGxjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR4ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9waHVuLmFwcGxpY2F0aW9uIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wbiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW9waHVuLmNlcnRpZmljYXRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5hZHNpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5maXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmdvdGFwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5rbXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLnR0YyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUud2VtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmlwcm0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh1bCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnkiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2lsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1hc2YiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtY2FiLWNvbXByZXNzZWQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2FiIi8+CisgIDwvbWltZS10eXBlPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIj4KKyAgICA8IS0tIFVzZSBvcmcuYXBhY2hlLnRpa2EuZGV0ZWN0LkNvbnRhaW5lckF3YXJlRGV0ZWN0b3IgZm9yIG1vcmUgcmVsaWFibGUgZGV0ZWN0aW9uIG9mIE9MRTIgZG9jdW1lbnRzIC0tPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi9tc2V4Y2VsIiAvPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgRXhjZWwgU3ByZWFkc2hlZXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJNaWNyb3NvZnRcIEV4Y2VsXCA1LjBcIFdvcmtzaGVldCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIwODAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRm9nbGlvXCBkaVwgbGF2b3JvXCBNaWNyb3NvZnRcIEV4Y2UiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJpZmY1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMjExNCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJCaWZmNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxMjEiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXHgwOVx4MDRceDA2XHgwMFx4MDBceDAwXHgxMFx4MDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICA8bWF0Y2ggdmFsdWU9IldceDAwb1x4MDByXHgwMGtceDAwYlx4MDBvXHgwMG9ceDAwayIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhscyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bGEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGx0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhsbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGxkIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFdvcmtib29rIEFkZC1pbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxhbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5NaWNyb3NvZnQgRXhjZWwgMjAwNyBCaW5hcnkgU3ByZWFkc2hlZXQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzYiIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bHRtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lb3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWh0bWxoZWxwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNobSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtaW1zIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmltcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtbHJtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxybSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rIj4KKyAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IE91dGxvb2sgTWVzc2FnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2ciIC8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnNlY2NhdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBraS5zdGwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wbGF5cmVhZHkuaW5pdGlhdG9yK3htbCIvPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCAtLT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCI+CisgICAgPCEtLSBVc2Ugb3JnLmFwYWNoZS50aWthLmRldGVjdC5Db250YWluZXJBd2FyZURldGVjdG9yIGZvciBtb3JlIHJlbGlhYmxlIGRldGVjdGlvbiBvZiBPTEUyIGRvY3VtZW50cyAtLT4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbXNwb3dlcnBvaW50Ii8+CisgICAgPF9jb21tZW50Pk1pY3Jvc29mdCBQb3dlcnBvaW50IFByZXNlbnRhdGlvbjwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCI+CisgICAgICAgICA8bWF0Y2ggdmFsdWU9IlBceDAwb1x4MDB3XHgwMGVceDAwclx4MDBQXHgwMG9ceDAwaVx4MDBuXHgwMHRceDAwIERceDAwb1x4MDBjXHgwMHVceDAwbVx4MDBlXHgwMG5ceDAwdCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjExNTI6NDA5NiIgLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBweiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHB0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucHBhIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5hZGRpbi5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgUHJlc2VudGF0aW9uIEFkZC1pbiAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHBhbSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQucHJlc2VudGF0aW9uLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb24gKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwdG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zbGRtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5zbGlkZXNob3cubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBTbGlkZXNob3cgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwc20iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1tc29mZmljZSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb3RtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcHJvamVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcHAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wdCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy10bmVmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vbXMtdG5lZiIgLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgyMjNlOWY3OCIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5saWMtY2hsZy1yZXEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubGljLXJlc3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubWV0ZXItY2hsZy1yZXEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubWV0ZXItcmVzcCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9lbmFibGVkLjEyIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIERvY3VtZW50IChtYWNyby1lbmFibGVkKTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kb2NtIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQgVGVtcGxhdGUgKG1hY3JvLWVuYWJsZWQpPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRvdG0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JrcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cHMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndrcyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2NtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53ZGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXdwbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXNlcSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2VxIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tc2lnbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdWx0aWFkLmNyZWF0b3IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXVsdGlhZC5jcmVhdG9yLmNpZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tdXNpYy1uaWZmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm11c2ljaWFuIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm11cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubXV2ZWUuc3R5bGUiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXN0eSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmNkLmNvbnRyb2wiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubmNkLnJlZmVyZW5jZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uZXJ2YW5hIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5ldGZweCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubHUiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LWRpcmVjdG9yeSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubnMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXdlYiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ubnciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNhdGFsb2dzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5pc2RzLXJhZGlvLXByZXNldHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEuaXB0di5jb25maWcreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmxhbmRtYXJrK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLmxhbmRtYXJrK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFya2NvbGxlY3Rpb24reG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5hYyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmRhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49IioubmdkYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5zeW1iaWFuLmluc3RhbGwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioubi1nYWdlIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uY2QiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucGNkK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLnBjZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJwc3QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldHMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucnBzcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWRtIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVkbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWR4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVkeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZXh0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4dCIvPgorICA8L21pbWUtdHlwZT4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gT3BlbiBEb2N1bWVudCBGb3JtYXQgZm9yIE9mZmljZSBBcHBsaWNhdGlvbnMgKE9wZW5Eb2N1bWVudCkgdjEuMCAtLT4KKyAgPCEtLSBodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL3NwZWNzL2luZGV4LnBocCNvcGVuZG9jdW1lbnR2MS4wIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0Ii8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBDaGFydCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogQ2hhcnQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5kYXRhYmFzZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogRm9ybXVsYSBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIiAvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IEZvcm11bGEgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGZ0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogR3JhcGhpY3MgZG9jdW1lbnQgKERyYXdpbmcpPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZGciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBHcmFwaGljcyBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdGciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBJbWFnZSBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogSW1hZ2UgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBQcmVzZW50YXRpb24gZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZHAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbi10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFByZXNlbnRhdGlvbiBkb2N1bWVudCB1c2VkIGFzIHRlbXBsYXRlPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdHAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ii8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBTcHJlYWRzaGVldCBkb2N1bWVudDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2RzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogU3ByZWFkc2hlZXQgZG9jdW1lbnQgdXNlZCBhcyB0ZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiB2YWx1ZT0iUEsiPgorICAgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjMwIgorICAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3RzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0Ij4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLz4KKyAgICA8X2NvbW1lbnQ+T3BlbkRvY3VtZW50IHYxLjA6IFRleHQgZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2R0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIvPgorICAgIDxfY29tbWVudD5PcGVuRG9jdW1lbnQgdjEuMDogR2xvYmFsIFRleHQgZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90bSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC10ZW1wbGF0ZSI+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGU8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICAgICAgdmFsdWU9Im1pbWV0eXBlYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vdHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViIi8+CisgICAgPF9jb21tZW50Pk9wZW5Eb2N1bWVudCB2MS4wOiBUZXh0IGRvY3VtZW50IHVzZWQgYXMgdGVtcGxhdGUgZm9yIEhUTUwgZG9jdW1lbnRzPC9fY29tbWVudD4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIHZhbHVlPSJQSyI+CisgICAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzAiCisgICAgICAgICAgICAgIHZhbHVlPSJtaW1ldHlwZWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90aCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYm4iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub2xwYy1zdWdhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54byIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtY29uZmlnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWh0dHAtcmVxdWVzdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEtc2N3cy1odHRwLXJlc3BvbnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5hc3NvY2lhdGVkLXByb2NlZHVyZS1wYXJhbWV0ZXIreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5kcm0tdHJpZ2dlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LmltZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lmx0a20iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lm5vdGlmaWNhdGlvbit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnByb3Zpc2lvbmluZ3RyaWdnZXIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnYm9vdCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dkZCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnZHUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNpbXBsZS1zeW1ib2wtY29udGFpbmVyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zbWFydGNhcmQtdHJpZ2dlcit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNwcm92K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3RrbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGNkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kZDIreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRkMiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaXNkK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEuZ3JvdXAtdXNhZ2UtbGlzdCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5kZXRhaWxlZC1wcm9ncmVzcy1yZXBvcnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZmluYWwtcmVwb3J0K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmdyb3Vwcyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5pbnZvY2F0aW9uLWRlc2NyaXB0b3IreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5wb2Mub3B0aW1pemVkLXByb2dyZXNzLXJlcG9ydCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hLnhjYXAtZGlyZWN0b3J5K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1lbWFpbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hZHMtZmlsZSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub21hZHMtZm9sZGVyK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb24iPgorICAgIDxnbG9iIHBhdHRlcm49Iioub3h0Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBQcmVzZW50YXRpb248L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHB0eCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGhteCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNsZHgiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3ciPgorICAgIDxnbG9iIHBhdHRlcm49IioucHBzeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIj4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBUZW1wbGF0ZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wb3R4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2Etb294bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93Ij4KKyAgICA8X2NvbW1lbnQ+T2ZmaWNlIE9wZW4gWE1MIFByZXNlbnRhdGlvbiBTbGlkZXNob3c8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioucHBzeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2s8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGxzeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgV29ya2Jvb2sgVGVtcGxhdGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGx0eCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiI+CisgICAgPF9jb21tZW50Pk9mZmljZSBPcGVuIFhNTCBXb3JrYm9vayBUZW1wbGF0ZSAobWFjcm8tZW5hYmxlZCk8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioueGx0bSIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG9jeCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiPgorICAgIDxfY29tbWVudD5PZmZpY2UgT3BlbiBYTUwgRG9jdW1lbnQgVGVtcGxhdGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG90eCIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW9veG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLm9zYS5uZXRkZXBsb3kiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NnaS5idW5kbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3NnaS5kcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kcCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQub3Rwcy5jdC1raXAreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBhbG0iPgorICAgIDxnbG9iIHBhdHRlcm49IioucGRiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcWEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9wcmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBhb3MueG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBnLmZvcm1hdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdHIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5laTYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBpYWNjZXNzLmFwcGxpY2F0aW9uLWxpY2VuY2UiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucGljc2VsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVmaWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvYy5ncm91cC1hZHZlcnRpc2VtZW50K3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb2NrZXRsZWFybiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjYiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGJkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2LXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3LXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNzUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNzUtcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcmVtaW5ldCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcmV2aWV3c3lzdGVtcy5ib3giPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm94Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wcm90ZXVzLm1hZ2F6aW5lIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1neiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHVibGlzaGFyZS1kZWx0YS10cmVlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFwcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQucHZpLnB0aWQxIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB0aWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnB3Zy1tdWx0aXBsZXhlZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5wd2cteGh0bWwtcHJpbnQreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnF1YWxjb21tLmJyZXctYXBwLXJlcyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5xdWFyay5xdWFya3hwcmVzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xeGQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnF4dCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucXdkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xd3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnF4bCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucXhiIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yYXBpZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXhsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm11c2ljeG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yZW5sZWFybi5ybHByaW50Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJpbS5jb2QiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY29kIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii5STUYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIiAvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubGluazY2Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5ydWNrdXMuZG93bmxvYWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuczNzbXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zYm0ubWlkMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zY3JpYnVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC4zZGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmNzZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQuZG9jIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5lbWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLm1odCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQubmV0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZC5wcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnRpZmYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnhscyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5odG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLnBkZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlZSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2VtYSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZW1hIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zZW1kIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNlbWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNlbWYiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2VtZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybWRhdGEiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWZtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtdGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5paWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLnBhY2thZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXBrIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zaW10ZWNoLW1pbmRtYXBwZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioudHdkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50d2RzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zbWFmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1tZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc21hcnQudGVhY2hlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50ZWFjaGVyIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2Z0d2FyZTYwMi5maWxsZXIuZm9ybSt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc29mdHdhcmU2MDIuZmlsbGVyLmZvcm0teG1sLXppcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zb2xlbnQuc2RrbSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RrbSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RrZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR4cCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuc2ZzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNmcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3NzLWNvZCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zc3MtZHRmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnNzcy1udGYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2RjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uZHJhdyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zZGEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc21mIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNkdyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52b3IiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RyZWV0LXN0cmVhbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RjIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXciPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MudGVtcGxhdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3RpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3htIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC12bmQuc3VuLnhtbC53cml0ZXIiLz4KKyAgICA8X2NvbW1lbnQ+T3Blbk9mZmljZSB2MS4wOiBXcml0ZXIgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYz4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgdmFsdWU9IlBLIj4KKyAgICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIKKyAgICAgICAgICB2YWx1ZT0ibWltZXR5cGVhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiLz4KKyAgICAgIDwvbWF0Y2g+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN4dyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci5nbG9iYWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3hnIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdHciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdXMtY2FsZW5kYXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3VzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdXNwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdmQiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zd2lmdHZpZXctaWNzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3ltYmlhbi5pbnN0YWxsIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxMDAwMDQxOSIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iOCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2lzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaXN4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0rd2J4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmRtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhkbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtLm5vdGlmaWNhdGlvbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRhby5pbnRlbnQtbW9kdWxlLWFyY2hpdmUiPgorICAgIDxnbG9iIHBhdHRlcm49IioudGFvIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC50bW9iaWxlLWxpdmV0diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50bW8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRyaWQudHB0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRwdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudHJ1ZWFwcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50cmEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnRydWVkb2MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudWZkbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51ZmQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVmZGwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51dHoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVtYWppbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51bWoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVuaXR5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVuaXR5d2ViIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51b21sK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51b21sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmFsZXJ0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQtd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ljZS13YnhtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wLXdieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdC13YnhtbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kLXdieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuc2lnbmFsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZjeCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi52Y3giLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZkLXN0dWR5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZlY3RvcndvcmtzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZpZHNvZnQudmlkY29uZmVyZW5jZSIvPgorCisgIDwhLS0gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi92bmQudmlzaW8gLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnZpc2lvIj4KKyAgICA8X2NvbW1lbnQ+TWljcm9zb2Z0IFZpc2lvIERpYWdyYW08L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioudnNkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52c3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudnN3Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudmlzaW9uYXJ5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZpcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudml2aWRlbmNlLnNjcmlwdGZpbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQudnNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZzZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLnNpYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53YXAuc2xjIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndieG1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndhcC53bWxjIj4KKyAgICA8X2NvbW1lbnQ+Q29tcGlsZWQgV01MIERvY3VtZW50PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtbGMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGMiPgorICAgIDxfY29tbWVudD5Db21waWxlZCBXTUwgU2NyaXB0PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtbHNjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndlYnR1cmJvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnd0YiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud2ZhLndzYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53bWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud21mLmJvb3RzdHJhcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC53b3JkcGVyZmVjdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cGQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndxZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53cWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLndycS1ocDMwMDAtbGFiZWxsZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3Quc3RmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN0ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3dieG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnd2LmNzcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQud3Yuc3NwK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54YXJhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhhciIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueGZkbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZmRsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54ZmRsLndlYmZvcm0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1pK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5jcGtnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLmRwa2ciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueG1waWUucGxhbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5wcGtnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnhtcGllLnhsaW0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LWRpYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1zY3JpcHQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHZzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaHZwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9zZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdC5vc2ZwdmcreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9zZnB2ZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW8iPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2FmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuc21hZi1waHJhc2UiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3BmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3ZuZC55ZWxsb3dyaXZlci1jdXN0b20tbWVudSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbXAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnp1bCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi56aXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnppcnoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vdm5kLnp6YXp6LmRlY2sreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnpheiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi92b2ljZXhtbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioudnhtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93YXRjaGVyaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93aG9pc3BwLXF1ZXJ5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2hvaXNwcC1yZXNwb25zZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dpbmhscCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5obHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd2l0YSIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0NS4xIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24vd3NkbCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3NkbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3Nwb2xpY3kiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LTEyMyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDFhMDAiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMDAyMDAiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWFiaXdvcmQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWJ3Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWNlLWNvbXByZXNzZWQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWNlIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1hZG9iZS1pbmRlc2lnbiI+CisgICAgPGFjcm9ueW0+SU5ERDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QWRvYmUgSW5EZXNpZ24gZG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouaW5kZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYWRvYmUtaW5kZXNpZ24taW50ZXJjaGFuZ2UiPgorICAgIDxhY3JvbnltPklOWDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QWRvYmUgSW5EZXNpZ24gSW50ZXJjaGFuZ2UgZm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0Oz9haWQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjEwMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pbngiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXJjaGl2ZSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ij0mbHQ7YXImZ3Q7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSI9ISZsdDthcmNoJmd0OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcj0iKi5hciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1iaW4iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54MzIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnUzMiIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioudm94Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1tYXAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1zZWciPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWFzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtYmNwaW8iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmNwaW8iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJlcmtlbGV5LWRiIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDYxNTYxIiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA2MTU2MSIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNTMxNjIiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwNDIyNTMiIHR5cGU9Imhvc3QzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQyMjUzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQyMjUzIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDQwOTg4IiB0eXBlPSJob3N0MzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MDk4OCIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA0MDk4OCIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iaG9zdDMyIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDA1MzE2MiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwMDUzMTYyIiB0eXBlPSJsaXR0bGUzMiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJpYnRleC10ZXh0LWZpbGUiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIlXCBCaWJUZVhcIGAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiUlJVwgXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI3MyIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIlXCBCaWJUZVhcIHN0YW5kYXJkXCBiaWJsaW9ncmFwaHlcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJSUlXCBcIEBCaWJUZVgtc3R5bGUtZmlsZXsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSI3MyIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAYXJ0aWNsZXsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBib29reyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQGluYm9va3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBpbmNvbGxlY3Rpb257IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAaW5wcm9jZWVkaW5nc3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBtYW51YWx7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAbWlzY3siIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBwcmVhbWJsZXsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkBwaGR0aGVzaXN7IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJAdGVjaHJlcG9ydHsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkB1bnB1Ymxpc2hlZHsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJpYiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmlidGV4Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1iaXR0b3JyZW50Ij4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iZDg6YW5ub3VuY2UiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRvcnJlbnQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJCWmgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJ6Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50YnoiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJ6MiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGJ6MiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm96Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LWJ6aXAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWNkbGluayI+CisgICAgPF9jb21tZW50PlZpcnR1YWwgQ0QtUk9NIENEIEltYWdlIEZpbGU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IioudmNkIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaGF0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNoYXQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jaGVzcy1wZ24iPgorICAgIDxnbG9iIHBhdHRlcm49IioucGduIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb21wcmVzcyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwwMzdcMjM1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi56Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1jb3JlbHByZXNlbnRhdGlvbnMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2h3Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi94LXRpa2EtbXNvZmZpY2UiLz4KKyAgPC9taW1lLXR5cGU+CisgIAorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY3BpbyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwNyIgdHlwZT0ibGl0dGxlMTYiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDciIHR5cGU9ImJpZzE2IiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMDcwNzA3IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIwNzA3MDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjA3MDcwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3BpbyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtY3NoIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzaCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGViIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi51ZGViIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kaXJlY3RvciI+CisgICAgPF9jb21tZW50PlNob2Nrd2F2ZSBNb3ZpZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaXIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRjciIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHhyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jc3QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNjdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3h0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53M2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZnZCIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3dhIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kb29tIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndhZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubmN4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHRib29rK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kdGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdGJyZXNvdXJjZSt4bWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmVzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1kdmkiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMzY3XDAwMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMmY3IiB0eXBlPSJsaXR0bGUxNiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR2aSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZWxjIj4KKyAgICA8X2NvbW1lbnQ+RW1hY3MgTGlzcCBieXRlY29kZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tIEVtYWNzIDE4IC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDEyKCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8IS0tIEVtYWNzIDE5IC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSI7RUxDXDAyM1wwMDBcMDAwXDAwMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVsYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1iZGYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouYmRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1kb3MiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtZnJhbWVtYWtlciIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1naG9zdHNjcmlwdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nc2YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LWxpYmdyeCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1saW51eC1wc2YiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHNmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LW90ZiI+CisgICAgPGFjcm9ueW0+T1RGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5PcGVuVHlwZSBGb250PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm90ZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1wY2YiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zbmYiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc25mIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC1zcGVlZG8iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtc3Vub3MtbmV3cyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mb250LXR0ZiI+CisgICAgPGFjcm9ueW0+VFRGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5UcnVlVHlwZSBGb250PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR0ZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudHRjIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4MDAwMTAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWZvbnQtdHlwZTEiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGZhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZmIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBmbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWZtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZm9udC12Zm9udCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giPgorICAgIDxfY29tbWVudD5NYWNyb21lZGlhIEZ1dHVyZVNwbGFzaCBGaWxlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNwbCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ251Y2FzaCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5nbnVjYXNoIiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtZ251bWVyaWMiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LUdudW1lcmljLXNwcmVhZHNoZWV0Ii8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ij0mbHQ7Z21yOldvcmtib29rIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzkiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdudW1lcmljIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1ndGFyIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjQwIj4KKyAgICAgIDwhLS0gR05VIHRhciBhcmNoaXZlIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJ1c3RhciBcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI1NyIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ3RhciIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10YXIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWd6aXAiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDM3XDIxMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRneiIgLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd6IiAvPgorICAgIDxnbG9iIHBhdHRlcm49IiotZ3oiIC8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbXoiIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1oZGYiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDBlMDMxMzAxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlwyMTFIREZcclxuXDAzMiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaGRmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oZTUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWh3cCI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tCisgICAgICAgIFRJS0EtMzMwOiBEZXRlY3Rpb24gcGF0dGVybiBiYXNlZCBvbiBzaWduYXR1cmUgc3RyaW5ncyBmcm9tCisgICAgICAgIHRoZSBod3BmaWx0ZXIvc291cmNlL2h3cGZpbGUuY3BwIGZpbGUgaW4gT3Blbk9mZmljZS5vcmcuCisgICAgICAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iSFdQIERvY3VtZW50IEZpbGUgViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNEMDAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzc2MzMiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouaXNvIiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouam5scCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gta2RlbG5rIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iW0tERVwgRGVza3RvcFwgRW50cnldIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIjXCBLREVcIENvbmZpZ1wgRmlsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbGF0ZXgiPgorICAgIDxfY29tbWVudD5MYVRlWCBTb3VyY2UgRG9jdW1lbnQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIlXCAtKi1sYXRleC0qLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubGF0ZXgiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LWxoYSI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1senMtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGhcNDAtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGhkLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMi0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDMtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGg0LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoNS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1saDYtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGg3LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbGhhcmMiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSItbGgwLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLWxoMS0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii1sejQtIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSItbHo1LSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbW9iaXBvY2tldC1lYm9vayI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcmMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vYmkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hcHBsaWNhdGlvbiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zLXdtZCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy13bXoiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC1nemlwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bXoiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tcy14YmFwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhiYXAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2FjY2VzcyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZGIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2JpbmRlciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vYmQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2NhcmRmaWxlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNyZCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zY2xpcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbHAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc2Rvd25sb2FkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV4ZSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGxsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jb20iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJhdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXNpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNtZWRpYXZpZXciPgorICAgIDxnbG9iIHBhdHRlcm49IioubXZiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tMTMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0xNCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zbWV0YWZpbGUiPgorICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LWVtZiIvPgorICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94LXdtZiIvPgorICAgIDxhY3JvbnltPldNRjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+V2luZG93cyBNZXRhZmlsZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVtZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zbW9uZXkiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW55Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNwdWJsaXNoZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucHViIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXNzY2hlZHVsZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zY2QiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRybSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LW1zd3JpdGUiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3JpIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtbmV0Y2RmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5jIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wa2NzMTIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDEyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wZngiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0aWZpY2F0ZXMiPgorICAgIDxnbG9iIHBhdHRlcm49IioucDdiIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0cmVxcmVzcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wN3IiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXF1YXR0cm8tcHJvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnFwdyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2IxIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53YjIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndiMyIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIi8+CisgIDwvbWltZS10eXBlPgorICAKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkIj4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC1yYXIiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUmFyISIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucmFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1ycG0iPgorICAgIDxnbG9iIHBhdHRlcm49IioucnBtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zYyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlNwcmVhZHNoZWV0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMzgiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2giPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIjIS8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiMhXCAvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIjIVx0LyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2giLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNoYXIiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc2hhciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIj4KKyAgICA8YWNyb255bT5GbGFzaDwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QWRvYmUgRmxhc2g8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJGV1MiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gRiA9IFVuY29tcHJlc3NlZCAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQ1dTIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIEMgPSBDb21wcmVzc2VkIC0tPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zd2YiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXNpbHZlcmxpZ2h0LWFwcCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54YXAiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXQiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJTdHVmZkl0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zaXQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXR4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpdHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdjRjcGlvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnN2NGNwaW8iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC1zdjRjcmMiPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3Y0Y3JjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10YXIiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNDAiPgorICAgICAgPCEtLSBQT1NJWCB0YXIgYXJjaGl2ZSAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0idXN0YXJcMCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjI1NyIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudGFyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10Y2wiPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtdGNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50Y2wiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQveC10ZXgiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxpbnB1dCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxzZWN0aW9uIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXHNldGxlbmd0aCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxkb2N1bWVudHN0eWxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcXGNoYXB0ZXIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlxcZG9jdW1lbnRjbGFzcyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxyZWxheCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxjb250ZW50c2xpbmUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGV4LXRmbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi50Zm0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXRleGluZm8iPgorICAgIDxhbGlhcyB0eXBlPSJ0ZXh0L3gtdGV4aW5mbyIgLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFxpbnB1dFwgdGV4aW5mbyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudGV4aW5mbyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudGV4aSIvPgorICA8L21pbWUtdHlwZT4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gTWljcm9zb2Z0IE9mZmljZSBiaW5hcnkgZmlsZSBmb3JtYXRzIC0tPgorICA8IS0tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pbnRlcm9wL2RvY3MvT2ZmaWNlQmluYXJ5Rm9ybWF0cy5tc3B4IC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC10aWthLW1zb2ZmaWNlIj4KKyAgICA8bWFnaWM+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZDBjZjExZTBhMWIxMWFlMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6OCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBPZmZpY2UgT3BlbiBYTUwgZmlsZSBmb3JtYXRzIC0tPgorICA8IS0tIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvc3RhbmRhcmRzL0VjbWEtMzc2Lmh0bSAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdGlrYS1vb3htbCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi96aXAiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUEtcMDAzXDAwNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IltDb250ZW50X1R5cGVzXS54bWwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIzMCIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3gtdXN0YXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioudXN0YXIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcmMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGVyIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcnQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veC14ZmlnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZpZyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXhwaW5zdGFsbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cGkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94LXpvbyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmRjNGE3ZGMiIHR5cGU9ImxpdHRsZTMyIiBvZmZzZXQ9IjIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnpvbyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3g0MDAtYnAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWF0dCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWNhcHMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNhcC1lbCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y2FwLWVycm9yK3htbCIvPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hjYXAtbnMreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGNvbi1jb25mZXJlbmNlLWluZm8tZGlmZit4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94Y29uLWNvbmZlcmVuY2UtaW5mbyt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94ZW5jK3htbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi54ZW5jIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veGh0bWwreG1sIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2h0bWwgeG1sbnM9IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4MTkyIi8+CisgICAgPC9tYWdpYz4KKyAgICA8cm9vdC1YTUwgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsb2NhbE5hbWU9Imh0bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodG1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54aHQiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94aHRtbC12b2ljZSt4bWwiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+CisgICAgPGFsaWFzIHR5cGU9InRleHQveG1sIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDs/eG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7P1hNTCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyEtLSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhGRkZFM0MwMDNGMDA3ODAwNkQwMDZDMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4RkVGRjAwM0MwMDNGMDA3ODAwNkQwMDZDIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBUT0RPOiBBZGQgbWF0Y2hlcyBmb3IgdGhlIG90aGVyIHBvc3NpYmxlIFhNTCBlbmNvZGluZyBzY2hlbWVzIC0tPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNkIi8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJ0ZXh0L3BsYWluIiAvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbC1kdGQiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHRkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3htbC1leHRlcm5hbC1wYXJzZWQtZW50aXR5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veG1wcCt4bWwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi94b3AreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhvcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hzbHQreG1sIj4KKyAgICA8YWxpYXMgdHlwZT0idGV4dC94c2wiLz4KKyAgICA8YWNyb255bT5YU0xUPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5YU0wgVHJhbnNmb3JtYXRpb25zPC9fY29tbWVudD4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJzdHlsZXNoZWV0IgorICAgICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueHNsdCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImFwcGxpY2F0aW9uL3hzcGYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzcGYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXBwbGljYXRpb24veHYreG1sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhodm1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54dm1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54dm0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhcHBsaWNhdGlvbi96aXAiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI0MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlBLXDAwM1wwMDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnppcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvLzMya2FkcGNtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vM2dwcCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvLzNncHAyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYWMzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYWRwY20iPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWRwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2FtciIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Ftci13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Ftci13YisiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9hc2MiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2Jhc2ljIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLnNuZCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjEiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIzIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjQiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI2IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjciIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hdSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc25kIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vYnYxNiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2J2MzIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9jbGVhcm1vZGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9jbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2RhdDEyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZGxzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAxMTA4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMDUwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMjExIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHNyLWVzMjAyMjEyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZHZpNCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2VhYzMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyYy1xY3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjMCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V2cmMxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYjAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjYjEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjd2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9ldnJjd2IwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZXZyY3diMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzE5Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjIxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyMyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtMTYiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI2LTI0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyNi0zMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjYtNDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2c3MjkxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vZzcyOWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9nNzI5ZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2dzbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL2dzbS1lZnIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9pbGJjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDE2Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDIwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDI0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbDgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9scGMiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21pZGkiPgorICAgIDxhY3JvbnltPk1JREk8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50Pk11c2ljYWwgSW5zdHJ1bWVudCBEaWdpdGFsIEludGVyZmFjZTwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5ID0iMjAiPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgdmFsdWU9Ik1UaGQiIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5taWQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1pZGkiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmthciIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm1pIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vbW9iaWxlLXhtZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wNCI+CisgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtbXA0YSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXA0YSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcDRhLWxhdG0iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGEtcm9idXN0Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICA8YWNyb255bT5NUDM8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50Pk1QRUctMSBBdWRpbyBMYXllciAzPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDwhLS0gaHR0cDovL21wZ2VkaXQub3JnL21wZ2VkaXQvbXBlZ19mb3JtYXQvTVAzRm9ybWF0Lmh0bWwgLS0+CisgICAgICA8IS0tIEJpdCBwYXR0ZXJuIGZvciBmaXJzdCB0d28gYnl0ZXM6IDExMTExMTExIDExMVZWTExDIC0tPgorICAgICAgPCEtLSBWViA9IE1QRUcgQXVkaW8gVmVyc2lvbiBJRDsgMTAgPSBWMiwgMTEgPSBWMSAtLT4KKyAgICAgIDwhLS0gTEwgPSBMYXllciBkZXNjcmlwdGlvbjsgMDEgPSBMMywgMTAgPSBMMiwgMTEgPSBMMSAtLT4KKyAgICAgIDwhLS0gQyA9IFByb3RlY3Rpb24gYml0OyAwID0gQ1JDLCAxID0gbm8gQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjIiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwzLCBDUkMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmMyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMiwgTDIsIENSQyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY1IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMiAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmY2IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYyLCBMMSwgQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZjciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjIsIEwxIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwzLCBDUkMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmYiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDMgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmYyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4gPCEtLSBWMSwgTDIsIENSQyAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZmZkIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPiA8IS0tIFYxLCBMMiAtLT4KKyAgICAgIDwhLS0gVElLQS00MTc6IFRoaXMgaXMgdGhlIFVURi0xNiBMRSBieXRlIG9yZGVyIG1hcmshIC0tPgorICAgICAgPCEtLSBtYXRjaCB2YWx1ZT0iMHhmZmZlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvIC0tPiA8IS0tIFYxLCBMMSwgQ1JDIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZmYiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+IDwhLS0gVjEsIEwxIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJJRDMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wZ2EiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wMiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXAyYSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXAzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tMmEiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0zYSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL21wZWc0LWdlbmVyaWMiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL29nZyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vZ2EiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm9nZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3B4Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wYXJpdHlmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY21hIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcGNtYS13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3BjbXUtd2IiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wY211Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9wcnMuc2lkIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUFNJRCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3FjZWxwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcmVkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnRwLWVuYy1hZXNjbTEyOCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3J0cC1taWRpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vcnR4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vc212MCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Ntdi1xY3AiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby9zcC1taWRpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdDE0MGMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90MzgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90ZWxlcGhvbmUtZXZlbnQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby90b25lIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdWxwZmVjIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdmR2aSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3Ztci13YiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC4zZ3BwLml1ZnAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuNHNiIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmF1ZGlva296Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNlbHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuY2lzY28ubnNlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmNtbGVzLnJhZGlvLWV2ZW50cyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jbnMuYW5wMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5jbnMuaW5mMSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmVvbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZGxuYS5hZHRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LmhlYWFjLjEiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkuaGVhYWMuMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5tbHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZG9sYnkubXBzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5kb2xieS5wbDJ4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmRvbGJ5LnBsMnoiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZHRzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0cyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQuZHRzLmhkIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR0c2hkIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5ldmVyYWQucGxqIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLmhucy5hdWRpbyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5sdWNlbnQudm9pY2UiPgorICAgIDxnbG9iIHBhdHRlcm49IioubHZwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5YSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby92bmQubm9raWEubW9iaWxlLXhtZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5ub3J0ZWwudmJrIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwNDgwMCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDQ4MDAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwNzQ3MCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDc0NzAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm51ZXJhLmVjZWxwOTYwMCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lY2VscDk2MDAiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLm9jdGVsLnNiYyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5xY2VscCIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5yaGV0b3JleC4zMmthZHBjbSIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5tcGVnIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm5kLnZteC5jdnNkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm9yYmlzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8vdm9yYmlzLWNvbmZpZyIvPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtYWFjIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtYWRiY20iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIuc25kIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1haWZmIj4KKyAgICA8YWxpYXMgdHlwZT0iYXVkaW8vYWlmZiIvPgorICAgIDxhY3JvbnltPkFJRkY8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkF1ZGlvIEludGVyY2hhbmdlIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRk9STS4uLi5BSUZGIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJGT1JNLi4uLkFJRkMiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgICA8IS0tIEFtaWdhIElGRiBzb3VuZCBzYW1wbGUsIHNvbWV3aGF0IGxpa2UgdGhlIG1vcmUgbW9kZXJuIEFJRkYgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZPUk0uLi4uOFNWWCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiCisgICAgICAgICAgICAgbWFzaz0iMHhGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkYiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYWlmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haWZmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5haWZjIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1kZWMtYmFzaWMiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iMjAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDAwNjQ3MzJFIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIj4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSIxIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjIiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMyIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI0IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgICA8bWF0Y2ggdmFsdWU9IjUiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iNiIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMTIiLz4KKyAgICAgICAgPG1hdGNoIHZhbHVlPSI3IiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIxMiIvPgorICAgICAgPC9tYXRjaD4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtZGVjLWFkYmNtIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDY0NzMyRSIgdHlwZT0iYmlnMzIiIG9mZnNldD0iMCI+CisgICAgICAgIDxtYXRjaCB2YWx1ZT0iMjMiIHR5cGU9ImJpZzMyIiBvZmZzZXQ9IjEyIi8+CisgICAgICA8L21hdGNoPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1mbGFjIj4KKyAgICA8YWNyb255bT5GTEFDPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5GcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjPC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iZkxhQyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmxhYyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbW9kIj4KKyAgICA8YWNyb255bT5NT0Q8L2Fjcm9ueW0+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkV4dGVuZGVkXCBNb2R1bGU6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJCTU9EMlNUTSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjIxIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik0uSy4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik0hSyEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZMVDQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZMVDgiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjRDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjZDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjhDSE4iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNEODEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik9LVEEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjE2Q04iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IjMyQ04iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIxMDgwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IklNUE0iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1vZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXBlZ3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tM3UiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC1tcy13YXgiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud2F4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtbXMtd21hIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndtYSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIj4KKyAgICA8X2NvbW1lbnQ+UmVhbCBBdWRpbzwvX2NvbW1lbnQ+CisgICAgPGFsaWFzIHR5cGU9ImF1ZGlvL3gtcmVhbGF1ZGlvIiAvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIweDJlNzI2MWZkIiB0eXBlPSJiaWczMiIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucmEiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4iPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm1wIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iYXVkaW8veC13YXYiPgorICAgIDxhY3JvbnltPldBVjwvYWNyb255bT4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjIwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUklGRi4uLi5XQVZFIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIKKyAgICAgICAgICAgICBtYXNrPSIweEZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRiIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi53YXYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNkeCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jZHgiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iY2hlbWljYWwveC1jaWYiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2lmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY21kZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbWRmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gtY21sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LWNzbWwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3NtbCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJjaGVtaWNhbC94LXBkYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImNoZW1pY2FsL3gteHl6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh5eiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2JtcCI+CisgICAgPGFsaWFzIHR5cGU9ImltYWdlL3gtbXMtYm1wIi8+CisgICAgPGFjcm9ueW0+Qk1QPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5XaW5kb3dzIGJpdG1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkJNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouYm1wIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaWIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9jZ20iPgorICAgIDxhY3JvbnltPkNHTTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+Q29tcHV0ZXIgR3JhcGhpY3MgTWV0YWZpbGU8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJCRUdNRiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgwMDIwIiBtYXNrPSIweGZmZTAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNnbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9maXRzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvZzNmYXgiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZzMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9naWYiPgorICAgIDxhY3JvbnltPkdJRjwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+R3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iR0lGODdhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJHSUY4OWEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdpZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL2llZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZWYiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanAyIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9qcGVnIj4KKyAgICA8YWNyb255bT5KUEVHPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Kb2ludCBQaG90b2dyYXBoaWMgRXhwZXJ0cyBHcm91cDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tIEZGRDggaXMgdGhlIFNPSSAoU3RhcnQgT2YgSW1hZ2UpIG1hcmtlci4gLS0+CisgICAgICA8IS0tIEl0IGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbWFya2VyIHRoYXQgc3RhcnRzIHdpdGggRkYuIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGZmZDhmZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGVnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmppZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouamZpZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouamZpIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanBtIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvanB4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvbmFwbHBzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wbmciPgorICAgIDxhY3JvbnltPlBORzwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgTmV0d29yayBHcmFwaGljczwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ilx4ODlQTkdceDBkXHgwYVx4MWFceDBhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbmciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS9wcnMuYnRpZiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5idGlmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3Bycy5wdGkiLz4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3N2Zyt4bWwiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgPGFjcm9ueW0+U1ZHPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5TY2FsYWJsZSBWZWN0b3IgR3JhcGhpY3M8L19jb21tZW50PgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9InN2ZyIgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3ZnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zdmd6Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UvdDM4Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS90aWZmIj4KKyAgICA8YWNyb255bT5USUZGPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5UYWdnZWQgSW1hZ2UgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPCEtLSBNTS4qID0gQmlnIGVuZGlhbiAoTT1Nb3Rvcm9sYSkgYW5kIDB4MDAyYSBpbiBiaWcgZW5kaWFuIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJNTVx4MDBceDJhIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBJSSouID0gTGl0dGxlIGVuZGlhbiAoST1JbnRlbCkgYW5kIDB4MDAyYSBpbiBsaXR0bGUgZW5kaWFuIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJJSVx4MmFceDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi50aWZmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50aWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS90aWZmLWZ4Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuYWRvYmUucGhvdG9zaG9wIj4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1wc2QiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBzZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5jbnMuaW5mMiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5kanZ1Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRqdnUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRqdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5kd2ciPgorICAgIDxhY3JvbnltPkRXRzwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+QXV0b0NhZCBEcmF3aW5nPC9fY29tbWVudD4KKyAgICA8YWxpYXMgdHlwZT0iaW1hZ2UveC1kd2ciLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYWNhZCIvPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LWFjYWQiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vYXV0b2NhZF9kd2ciLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24vZHdnIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtZHdnIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtYXV0b2NhZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZHdnIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8IS0tICJBQyIgZm9sbG93ZWQgYnkgZm91ciBudW1iZXJzIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSJBQzAwMDAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkYwRjBGMEYwIi8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZHhmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR4ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZmFzdGJpZHNoZWV0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZicyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnB4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZweCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZzdCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1tbXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioubW1yIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLXJsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ybGMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLmdsb2JhbGdyYXBoaWNzLnBnYiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5taXgiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQubXMtbW9kaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZGkiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLm5ldC1mcHgiPgorICAgIDxnbG9iIHBhdHRlcm49IioubnB4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5yYWRpYW5jZSIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWQucG5nIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2Uvdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmdpZiIvPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5qcGciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQuc3ZmIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS92bmQud2FwLndibXAiPgorICAgIDxfY29tbWVudD5XaXJlbGVzcyBCaXRtYXAgRmlsZSBGb3JtYXQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioud2JtcCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3ZuZC54aWZmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhpZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWNtdS1yYXN0ZXIiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmFzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtY214Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNteCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWZyZWVoYW5kIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5maGMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZoNCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmg1Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5maDciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LWljb24iPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMTAyXDEwMVwwNTBcMDAwXDAwMFwwMDBcMDU2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIKKyAgICAgICAgICAgICB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJcMDAwXDAwMFwwMDFcMDAwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY28iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LW5pZmYiPgorICAgIDxfY29tbWVudD5OYXZ5IEludGVyY2hhbmdlIEZpbGUgRm9ybWF0PC9fY29tbWVudD4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iSUlOMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcGN4Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBjeCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBpY3QiPgorICAgIDxnbG9iIHBhdHRlcm49IioucGljIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wY3QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCI+CisgICAgPGFjcm9ueW0+UE5NPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Qb3J0YWJsZSBBbnkgTWFwPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBubSIgLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJpbWFnZS94LXBvcnRhYmxlLWFueW1hcCIvPgorICAgIDxhY3JvbnltPlBCTTwvYWNyb255bT4KKyAgICA8X2NvbW1lbnQ+UG9ydGFibGUgQml0IE1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlAxIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQNCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucGJtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwIj4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9ImltYWdlL3gtcG9ydGFibGUtYW55bWFwIi8+CisgICAgPGFjcm9ueW0+UEdNPC9hY3JvbnltPgorICAgIDxfY29tbWVudD5Qb3J0YWJsZSBHcmF5IE1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlAyIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQNSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioucGdtIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAiPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0iaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLz4KKyAgICA8YWNyb255bT5QWE08L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PlBvcnRhYmxlIFBpeGVsIE1hcDwvX2NvbW1lbnQ+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlAzIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJQNiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUDciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBwbSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWFkb2JlIj4KKyAgICA8YWNyb255bT5ETkc8L2Fjcm9ueW0+CisgICAgPF9jb21tZW50PkFkb2JlIERpZ2l0YWwgTmVnYXRpdmU8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouZG5nIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctaGFzc2VsYmxhZCI+CisgICAgPF9jb21tZW50Pkhhc3NlbGJsYWQgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLjNmciIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWZ1amkiPgorICAgIDxfY29tbWVudD5GdWppIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yYWYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1jYW5vbiI+CisgICAgPF9jb21tZW50PkNhbm9uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcnciLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNyMiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWtvZGFrIj4KKyAgICA8X2NvbW1lbnQ+S29kYWsgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmsyNSIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioua2RjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kY3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRyZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW1pbm9sdGEiPgorICAgIDxfY29tbWVudD5NaW5vbHRhIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcnciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1uaWtvbiI+CisgICAgPF9jb21tZW50Pk5pa29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uZWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm5ydyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LW9seW1wdXMiPgorICAgIDxfY29tbWVudD5PbHltcHVzIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5vcmYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1wZW50YXgiPgorICAgIDxfY29tbWVudD5QZW50YXggcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB0eCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGVmIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctc29ueSI+CisgICAgPF9jb21tZW50PlNvbnkgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFydyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3JmIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcjIiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1zaWdtYSI+CisgICAgPF9jb21tZW50PlNpZ21hIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi54M2YiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1lcHNvbiI+CisgICAgPF9jb21tZW50PkVwc29uIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lcmYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1tYW1peWEiPgorICAgIDxfY29tbWVudD5NYW1peWEgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1lZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWxlYWYiPgorICAgIDxfY29tbWVudD5MZWFmIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tb3MiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1wYW5hc29uaWMiPgorICAgIDxfY29tbWVudD5QYW5hc29uaWMgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJhdyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucncyIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcGhhc2VvbmUiPgorICAgIDxfY29tbWVudD5QaGFzZSBPbmUgcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNhcCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWlxIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yYXctcmVkIj4KKyAgICA8X2NvbW1lbnQ+UmVkIHJhdyBpbWFnZTwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yM2QiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXJhdy1pbWFjb24iPgorICAgIDxfY29tbWVudD5JbWFjb24gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZmZiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWxvZ2l0ZWNoIj4KKyAgICA8X2NvbW1lbnQ+TG9naXRlY2ggcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB4biIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LWNhc2lvIj4KKyAgICA8X2NvbW1lbnQ+Q2FzaW8gcmF3IGltYWdlPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmJheSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9ImltYWdlL3gtcmF3LXJhd3pvciI+CisgICAgPF9jb21tZW50PlJhd3pvciByYXcgaW1hZ2U8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49Iioucnd6Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1yZ2IiPgorICAgIDxnbG9iIHBhdHRlcm49IioucmdiIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14Yml0bWFwIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iLyogWFBNIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi54Ym0iLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQveC1jIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14Y2YiPgorICAgIDxhbGlhcyB0eXBlPSJpbWFnZS94Y2YiLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB0eXBlPSJzdHJpbmciIHZhbHVlPSJnaW1wIHhjZiAiIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC14cGl4bWFwIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhwbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJpbWFnZS94LXh3aW5kb3dkdW1wIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvY3BpbSIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb24iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2V4dGVybmFsLWJvZHkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2dsb2JhbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWRlbGl2ZXJ5LXN0YXR1cyIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWRpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvbiIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvZ2xvYmFsLWhlYWRlcnMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2h0dHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL2ltZG4reG1sIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL25ld3MiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJQYXRoOiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlhyZWY6IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIgLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iQXJ0aWNsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiIC8+CisgICAgPC9tYWdpYz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3BhcnRpYWwiLz4KKworICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvcmZjODIyIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iUmVsYXktVmVyc2lvbjoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiMhXCBybmV3cyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTiMhXCBybmV3cyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iRm9yd2FyZFwgdG8iIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IlBpcGVcIHRvIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJSZXR1cm4tUGF0aDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZyb206IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJSZWNlaXZlZDoiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdHlwZT0ic3RyaW5nIiB2YWx1ZT0iTWVzc2FnZS1JRDoiIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHR5cGU9InN0cmluZyIgdmFsdWU9IkRhdGU6IiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZW1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5taW1lIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS9zLWh0dHAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtZXNzYWdlL3NpcCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2Uvc2lwZnJhZyIvPgorICA8bWltZS10eXBlIHR5cGU9Im1lc3NhZ2UvdHJhY2tpbmctc3RhdHVzIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibWVzc2FnZS92bmQuc2kuc2ltcCIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvZXhhbXBsZSIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvaWdlcyI+CisgICAgPF9jb21tZW50PkluaXRpYWwgR3JhcGhpY3MgRXhjaGFuZ2UgU3BlY2lmaWNhdGlvbiBGb3JtYXQ8L19jb21tZW50PgorICAgIDxnbG9iIHBhdHRlcm49IiouaWdzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pZ2VzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvbWVzaCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tc2giLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1lc2giLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNpbG8iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZHdmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmR3ZiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZmxhdGxhbmQuM2RtbCIvPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5nZGwiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZ2RsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZuZC5ncy1nZGwiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQuZ3MuZ2RsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLmd0dyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5ndHciLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLm1vbWwreG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLm10cyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tdHMiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0ibW9kZWwvdm5kLnBhcmFzb2xpZC50cmFuc21pdC5iaW5hcnkiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQucGFyYXNvbGlkLnRyYW5zbWl0LnRleHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtb2RlbC92bmQudnR1Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZ0dSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9Im1vZGVsL3ZybWwiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud3JsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52cm1sIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2FsdGVybmF0aXZlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2FwcGxlZG91YmxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2J5dGVyYW5nZXMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvZGlnZXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2VuY3J5cHRlZCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9leGFtcGxlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC9oZWFkZXItc2V0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L21peGVkIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3BhcmFsbGVsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3JlbGF0ZWQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJtdWx0aXBhcnQvcmVwb3J0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0ibXVsdGlwYXJ0L3NpZ25lZCIvPgorICA8bWltZS10eXBlIHR5cGU9Im11bHRpcGFydC92b2ljZS1tZXNzYWdlIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9jYWxlbmRhciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pY3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmlmYiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvY3NzIj4KKyAgICA8X2NvbW1lbnQ+Q2FzY2FkaW5nIFN0eWxlIFNoZWV0PC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzcyIvPgorICAgIDxzdWItY2xhc3Mtb2YgdHlwZT0idGV4dC9wbGFpbiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvY3N2Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNzdiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2RpcmVjdG9yeSIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvZG5zIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9lY21hc2NyaXB0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9lbnJpY2hlZCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvZXhhbXBsZSIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9odG1sIj4KKyAgICAgPCEtLSBUSUtBLTMyNzogaWYgeW91IGVuY291bnRlciB0YWdzIGluIHRoZSBIVE1MCisgICAgICAgICAgd2l0aCBubyBkZWNsYXJlZCBuYW1lc3BhY2UsIGl0J3Mgbm90IFhIVE1MLCBpdCdzIGp1c3QKKyAgICAgICAgICBiYWQgSFRNTCwgdW5mb3J0dW5hdGVseS4KKyAgICAgLS0+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iaHRtbCIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkhUTUwiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJsaW5rIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0iTElOSyIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9ImJvZHkiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJCT0RZIi8+CisgICAgPHJvb3QtWE1MIGxvY2FsTmFtZT0icCIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IlAiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJzY3JpcHQiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJTQ1JJUFQiLz4KKyAgICA8cm9vdC1YTUwgbG9jYWxOYW1lPSJmcmFtZXNldCIvPgorICAgIDxyb290LVhNTCBsb2NhbE5hbWU9IkZSQU1FU0VUIi8+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshRE9DVFlQRSBIVE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7IWRvY3R5cGUgaHRtbCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O0hFQUQiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtoZWFkIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7VElUTEUiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwOjY0Ii8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDt0aXRsZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjA6NjQiLz4KKyAgICAgIDwhLS0gbm90ZSBvbiB0aGUgb2Zmc2V0IHZhbHVlIGhlcmU6IHRoaXMgY2FuIG9ubHkgYmUgYXMgYmlnIGFzCisgICAgICAgICAgIE1pbWVUeXBlcyNnZXRNaW5MZW5ndGgoKS4gSWYgeW91IHNldCB0aGUgb2Zmc2V0IHZhbHVlIHRvIGxhcmdlcgorICAgICAgICAgICB0aGFuIHRoYXQgc2l6ZSwgdGhlIG1hZ2ljIHdpbGwgb25seSBiZSBjb21wYXJlZCB0byB1cCB0bworICAgICAgICAgICBNaW1lVHlwZXMjZ2V0TWluTGVuZ3RoKCkgYnl0ZXMuCisgICAgICAgLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtodG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo4MTkyIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtIVE1MIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMDo2NCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7Qk9EWSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O2JvZHkiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtUSVRMRSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0O3RpdGxlIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSImbHQ7aDEiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDtIMSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJmx0OyFkb2N0eXBlIEhUTUwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IiZsdDshRE9DVFlQRSBodG1sIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odG1sIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5odG0iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3Bhcml0eWZlYyIvPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wbGFpbiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSIyMCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IlRoaXMgaXMgVGVYLCIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iVGhpcyBpcyBNRVRBRk9OVCwiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ii8qIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSIvLyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iOzsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8IS0tIFVURi0xNkJFIEJPTSAtLT4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHhmZWZmIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgICAgPCEtLSBVVEYtMTZMRSBCT00gLS0+CisgICAgICA8bWF0Y2ggdmFsdWU9IjB4ZmZmZSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDwhLS0gVVRGLTggQk9NIC0tPgorICAgICAgPG1hdGNoIHZhbHVlPSIweGVmYmJiZiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorCisgICAgPGdsb2IgcGF0dGVybj0iKi50eHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRleHQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNvbmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRlZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubGlzdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubG9nIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5pbiIvPgorCisgICAgPCEtLSBUSUtBLTg1OiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3N2bi1lb2wtc3R5bGUudHh0IC0tPgorICAgIDxnbG9iIHBhdHRlcm49IklOU1RBTEwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJLRVlTIi8+CisgICAgPGdsb2IgcGF0dGVybj0iTWFrZWZpbGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJSRUFETUUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSJhYnMtbGlua21hcCIvPgorICAgIDxnbG9iIHBhdHRlcm49ImFicy1tZW51bGlua3MiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFhcnQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFjIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hbSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY2dpIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jbGFzc3BhdGgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmNtZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY29uZmlnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jd2lraSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGF0YSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lZ3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5lbnQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZnYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmdybSIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Ii5odGFjY2VzcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouaWh0bWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpteCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouanNwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qdW5pdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouangiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hbmlmZXN0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tNCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLk1GIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tZXRhIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5uMyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGVuIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wbCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucG0iLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnBvZCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucG9tIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcm9qZWN0Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5wcm9wZXJ0aWVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5weSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucmIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJuZyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iioucm54Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5yb2xlcyIvPgorICAgIDxnbG9iIHBhdHRlcm49Iiouc3FsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi50bGQiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnR5cGVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi52bSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudnNsIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi53c2RkIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54YXJncyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGNhdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioueGNvbmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhlZ3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54Z3JtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bGV4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bG9nIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54bWFwIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54cm9sZXMiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnhzYW1wbGVzIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi54c3AiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZWIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnh3ZWxjb21lIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wcnMuZmFsbGVuc3RlaW4ucnN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9wcnMubGluZXMudGFnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmRzYyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JlZCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcmZjODIyLWhlYWRlcnMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3JpY2h0ZXh0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJ0eCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3J0ZiIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcnRwLWVuYy1hZXNjbTEyOCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvcnR4Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC9zZ21sIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbWwiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNnbSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3QxNDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnRzdiIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQvdHJvZmYiPgorICAgIDxhbGlhcyB0eXBlPSJhcHBsaWNhdGlvbi94LXRyb2ZmIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIi8+CisgICAgPGFsaWFzIHR5cGU9ImFwcGxpY2F0aW9uL3gtdHJvZmYtbWUiLz4KKyAgICA8YWxpYXMgdHlwZT0iYXBwbGljYXRpb24veC10cm9mZi1tcyIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSIuXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IidcXCZxdW90OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iJy5cXCZxdW90OyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXFwmcXVvdDsiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IicnJyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioudCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudHIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnJvZmYiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1hbiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubWUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1zIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC91bHBmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3VyaS1saXN0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnVyaSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudXJpcyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioudXJscyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5hYmMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmN1cmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuY3VybC5kY3VybCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kY3VybCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5jdXJsLnNjdXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnNjdXJsIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmN1cmwubWN1cmwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubWN1cmwiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZG1jbGllbnRzY3JpcHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5lc21lcnRlYy50aGVtZS1kZXNjcmlwdG9yIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuZmx5Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZseSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5mbWkuZmxleHN0b3IiPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmx4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmdyYXBodml6Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmd2Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmluM2QuM2RtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi4zZG1sIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmluM2Quc3BvdCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zcG90Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLmlwdGMubmV3c21sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQuaXB0Yy5uaXRmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQubGF0ZXgteiIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm1vdG9yb2xhLnJlZmxleCIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm1zLW1lZGlhcGFja2FnZSIvPgorICA8bWltZS10eXBlIHR5cGU9InRleHQvdm5kLm5ldDJwaG9uZS5jb21tY2VudGVyLmNvbW1hbmQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5zaS51cmljYXRhbG9ndWUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvciI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qYWQiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQudHJvbGx0ZWNoLmxpbmd1aXN0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLnNpIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLnNsIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC92bmQud2FwLndtbCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWwiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0Ij4KKyAgICA8X2NvbW1lbnQ+V01MIFNjcmlwdDwvX2NvbW1lbnQ+CisgICAgPGdsb2IgcGF0dGVybj0iKi53bWxzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWFzbSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5zIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5hc20iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jYyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouY3h4Ii8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5jcHAiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmhoIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5kaWMiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZGlmZiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9ImRpZmZcICIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iKioqXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9Ik9ubHlcIGluXCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkNvbW1vblwgc3ViZGlyZWN0b3JpZXM6XCAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgICA8bWF0Y2ggdmFsdWU9IkluZGV4OiIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZGlmZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGF0Y2giLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtZm9ydHJhbiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mb3IiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmY3NyIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouZjkwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQveC1wYXNjYWwiPgorICAgIDxnbG9iIHBhdHRlcm49IioucCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioucGFzIi8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94LWphdmEtc291cmNlIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmphdmEiLz4KKyAgICA8c3ViLWNsYXNzLW9mIHR5cGU9InRleHQvcGxhaW4iLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtc2V0ZXh0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmV0eCIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InRleHQveC11dWVuY29kZSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi51dSIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmNhbGVuZGFyIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZjcyIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ0ZXh0L3gtdmNhcmQiPgorICAgIDxnbG9iIHBhdHRlcm49IioudmNmIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InRleHQveG1sIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idGV4dC94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvLzNncHAiPgorICAgIDxnbG9iIHBhdHRlcm49IiouM2dwIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvLzNncHAtdHQiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby8zZ3BwMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi4zZzIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vYm1wZWciLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9idDY1NiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2NlbGIiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9kdiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2V4YW1wbGUiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9oMjYxIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmgyNjEiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vaDI2MyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5oMjYzIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMtMTk5OCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjMtMjAwMCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL2gyNjQiPgorICAgIDxnbG9iIHBhdHRlcm49IiouaDI2NCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9qcGVnIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmpwZ3YiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vanBlZzIwMDAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9qcG0iPgorICAgIDxnbG9iIHBhdHRlcm49IiouanBtIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qcGdtIi8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21qMiI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tajIiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1qcDIiLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXAxcyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wMnAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcDJ0Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXA0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1wNCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXA0diIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBnNCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcDR2LWVzIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9tcGVnIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iXDAwMFwwMDBcMDAxXDI2MyIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBlZyIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubXBnIi8+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tcGUiLz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm0xdiIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTJ2Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1wZWd1cmwiPgorICAgIDxnbG9iIHBhdHRlcm49IioubXh1Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vbXBlZzQtZ2VuZXJpYyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL21wdiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL252Ii8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9vZ2ciPgorICAgIDxnbG9iIHBhdHRlcm49Iioub2d2Ii8+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhcHBsaWNhdGlvbi9vZ2ciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9wYXJpdHlmZWMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9wb2ludGVyIi8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby9xdWlja3RpbWUiPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJtb292IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJtZGF0IiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgICAgPG1hdGNoIHZhbHVlPSJmdHlwIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iNCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5xdCIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubW92Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcmF3Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vcnRwLWVuYy1hZXNjbTEyOCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3J0eCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3NtcHRlMjkybSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3VscGZlYyIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZjMSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5jY3R2Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmRsbmEubXBlZy10dHMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuZnZ0Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmZ2dCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaG5zLnZpZGVvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0xMDEwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0yMDA1Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0xMDEwIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0yMDA1Ii8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLmlwdHZmb3J1bS50dHNhdmMiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuaXB0dmZvcnVtLnR0c21wZWcyIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvcCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcGVndXJsIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm14dSIvPgorICAgIDxnbG9iIHBhdHRlcm49IioubTR1Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHl2Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnB5diIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQubm9raWEuaW50ZXJsZWF2ZWQtbXVsdGltZWRpYSIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5ub2tpYS52aWRlb3ZvaXAiLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQub2JqZWN0dmlkZW8iLz4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby92bmQuc2VhbGVkLm1wZWcxIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZC5tcGVnNCIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC5zZWFsZWQuc3dmIi8+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLm1vdiIvPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3ZuZC52aXZvIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLnZpdiIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWY0diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mNHYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsYyI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbGMiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsaSI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5mbGkiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LWZsdiI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9IkZMViIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IiouZmx2Ii8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1qbmciPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJceDhiSk5HIiB0eXBlPSJzdHJpbmciIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgICAgPGdsb2IgcGF0dGVybj0iKi5qbmciLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW00diI+CisgICAgPGdsb2IgcGF0dGVybj0iKi5tNHYiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1uZyI+CisgICAgPG1hZ2ljIHByaW9yaXR5PSI1MCI+CisgICAgICA8bWF0Y2ggdmFsdWU9Ilx4OGFNTkciIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLm1uZyIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtYXNmIj4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmFzZiIvPgorICAgIDxnbG9iIHBhdHRlcm49IiouYXN4Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd20iPgorICAgIDxnbG9iIHBhdHRlcm49Iioud20iLz4KKyAgPC9taW1lLXR5cGU+CisgIDxtaW1lLXR5cGUgdHlwZT0idmlkZW8veC1tcy13bXYiPgorICAgIDxnbG9iIHBhdHRlcm49Iioud212Ii8+CisgIDwvbWltZS10eXBlPgorICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtbXMtd214Ij4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLndteCIvPgorICA8L21pbWUtdHlwZT4KKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zLXd2eCI+CisgICAgPGdsb2IgcGF0dGVybj0iKi53dngiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ2aWRlby94LW1zdmlkZW8iPgorICAgIDxhbGlhcyB0eXBlPSJ2aWRlby9hdmkiLz4KKyAgICA8YWxpYXMgdHlwZT0idmlkZW8vbXN2aWRlbyIvPgorICAgIDxtYWdpYyBwcmlvcml0eT0iNTAiPgorICAgICAgPG1hdGNoIHZhbHVlPSJSSUZGLi4uLkFWSSAiIHR5cGU9InN0cmluZyIgb2Zmc2V0PSIwIgorICAgICAgICAgICAgIG1hc2s9IjB4RkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGIi8+CisgICAgPC9tYWdpYz4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmF2aSIvPgorICA8L21pbWUtdHlwZT4KKworICA8bWltZS10eXBlIHR5cGU9InZpZGVvL3gtc2dpLW1vdmllIj4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iTU9WSSIgdHlwZT0ic3RyaW5nIiBvZmZzZXQ9IjAiLz4KKyAgICA8L21hZ2ljPgorICAgIDxnbG9iIHBhdHRlcm49IioubW92aWUiLz4KKyAgPC9taW1lLXR5cGU+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ4LWNvbmZlcmVuY2UveC1jb29sdGFsayI+CisgICAgPF9jb21tZW50PkNvb2x0YWxrIEF1ZGlvPC9fY29tbWVudD4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmljZSIvPgorICA8L21pbWUtdHlwZT4KKworPC9taW1lLWluZm8+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9ncy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2VlMzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDIwIEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitZb3UgY2FuIHJlbW92ZSB0aGlzIGZpbGUuIEl0IHdhcyBvbmx5IGluY2x1ZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2cgZGlyZWN0b3J5IGZvciB0aGlzCitkaXN0cmlidXRpb24gd2FzIGNyZWF0ZWQgb24gYXNzZW1ibHkuCisKKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY2YzlkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwKQEAgLTAsMCArMSwxMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisgICAgPGJlYW4gaWQ9ImFkZFByb2R1Y3RUeXBlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uQWRkUHJvZHVjdFR5cGVDbGlBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJBZGRzIGEgUHJvZHVjdFR5cGUgdG8gbGlzdCBvZiBzdXBwb3J0ZWQgUHJvZHVjdFR5cGVzIiAvPgorICAgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5EZWxldGVQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWxldGUgUHJvZHVjdCBieSBuYW1lIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJkZWxldGVQcm9kdWN0QnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkRlbGV0ZVByb2R1Y3RCeUlkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEZWxldGUgUHJvZHVjdCBieSBJRCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZHVtcE1ldGFkYXRhIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uRHVtcE1ldGFkYXRhQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEdW1wcyBQcm9kdWN0IE1ldGFkYXRhIG91dCB0byBYTUwiIC8+CisgIDwvYmVhbj4KKyAgICA8YmVhbiBpZD0iZ2V0Q3VycmVudFRyYW5zZmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0Q3VycmVudFRyYW5zZmVyQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgUHJvZHVjdCBmaWxlIHRyYW5zZmVyIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRDdXJyZW50VHJhbnNmZXJzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0Q3VycmVudFRyYW5zZmVyc0NsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IFByb2R1Y3QgZmlsZSB0cmFuc2ZlcnMiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBwZXJjZW50IGFtb3VudCB0cmFuc2ZlcnJlZCBvZiBnaXZlbiBmaWxlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRGaXJzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRGaXJzdFBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgZmlyc3QgcGFnZSBvZiBQcm9kdWN0cyBvZiBnaXZlbiBQcm9kdWN0VHlwZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0TGFzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRMYXN0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBsYXN0IHBhZ2Ugb2YgUHJvZHVjdHMgb2YgZ2l2ZW4gUHJvZHVjdFR5cGUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldE5leHRQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0TmV4dFBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgbmV4dCBwYWdlIG9mIFByb2R1Y3RzIG9mIGdpdmVuIFByb2R1Y3RUeXBlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXROdW1Qcm9kdWN0cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkdldE51bVByb2R1Y3RzQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIG51bWJlciBvZiBQcm9kdWN0cyBpbmdlc3RlZCBmb3IgYSBnaXZlbiBQcm9kdWN0VHlwZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0UHJldlBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcmV2UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBwcmV2IHBhZ2Ugb2YgUHJvZHVjdHMgb2YgZ2l2ZW4gUHJvZHVjdFR5cGUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5HZXRQcm9kdWN0QnlOYW1lQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXQgUHJvZHVjdCBpbmZvIGJ5IG5hbWUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0UHJvZHVjdEJ5SWRDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgUHJvZHVjdCBpbmZvIGJ5IElEIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBwZXJjZW50IGFtb3VudCB0cmFuc2ZlcnJlZCBvZiBhIFByb2R1Y3RzIGRhdGEgZmlsZXMiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RUeXBlQnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uR2V0UHJvZHVjdFR5cGVCeU5hbWVDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgYSBQcm9kdWN0VHlwZSBieSBpdHMgbmFtZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iaGFzUHJvZHVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkhhc1Byb2R1Y3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrcyBpZiBQcm9kdWN0IHdpdGggZ2l2ZW4gbmFtZSBoYXMgYmVlbiBpbmdlc3RlZCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iaW5nZXN0UHJvZHVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkluZ2VzdFByb2R1Y3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkluZ2VzdHMgYSBQcm9kdWN0IiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJsdWNlbmVRdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLkx1Y2VuZVF1ZXJ5Q2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJRdWVyaWVzIGJ5IHBhcnNpbmcgYW4gTHVjZW5lLWxpa2UgcXVlcnkgaW50byBhIEZpbGVNYW5hZ2VyIFF1ZXJ5IiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJyZXRyaWV2ZUZpbGVzQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jbGkuYWN0aW9uLlJldHJpZXZlRmlsZXNDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJldHJpZXZlIGEgUHJvZHVjdCdzIGZpbGVzIGJ5IFByb2R1Y3QgSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InJldHJpZXZlRmlsZXNCeU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2xpLmFjdGlvbi5SZXRyaWV2ZUZpbGVzQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSZXRyaWV2ZSBhIFByb2R1Y3QncyBmaWxlcyBieSBQcm9kdWN0IG5hbWUiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InNxbFF1ZXJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmNsaS5hY3Rpb24uU3FsUXVlcnlDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlF1ZXJpZXMgYnkgcGFyc2luZyBhbiBTUUwtbGlrZSBxdWVyeSBpbnRvIGEgRmlsZU1hbmFnZXIgUXVlcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRldGFpbGVkRGVzY3JpcHRpb24iPgorICAgICAgPHZhbHVlPgorIFRoaXMgc3VwcG9ydHMgc2VuZGluZyBxdWVyaWVzIHRvIHRoZSBGaWxlTWFuYWdlciBpbiBmb3JtIG9mCisgIFNFTEVDVCBbRWxlbWVudHNdIEZST00gW1Byb2R1Y3RUeXBlc10gV0hFUkUgW3doZXJlLWNsYXVzZV0sIHdoZXJlOgorICAgLSBbRWxlbWVudHNdOiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIEVsZW1lbnQgbmFtZXM7IG1heSBhbHNvIGJlICogd2hpY2gKKyAgICByZXByZXNlbnRzIGFsbCBFbGVtZW50cworICAgLSBbUHJvZHVjdFR5cGVzXTogaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBQcm9kdWN0VHlwZSBuYW1lczsgbWF5IGFsc28KKyAgICBiZSAqIHdoaWNoIHJlcHJlc2VudHMgYWxsIFByb2R1Y3RUeXBlcworICAgLSBbd2hlcmUtY2xhdXNlXTogaXMgYW4gb3B0aW9uYWwgRWxlbWVudCBuYW1lIGZpbHRlciBzdXBwb3J0aW5nIHRoZSBmb2xsb3dpbmc6CisgICAgICAqIEFORCBhbmQgT1IgYm9vbGVhbiBvcGVyYXRvcnMKKyAgICAgICogKCkgZ3JvdXBpbmcgb2YgcXVlcmllcworICAgICAgKiBlbGVtZW50LW5hbWUgPT0gJ2VsZW1lbnQtdmFsdWUnCisgICAgICAqIGVsZW1lbnQtbmFtZSAmIzYwOyAnZWxlbWVudC12YWx1ZScKKyAgICAgICogZWxlbWVudC1uYW1lICYjNjI7ICdlbGVtZW50LXZhbHVlJworICAgICAgKiBlbGVtZW50LW5hbWUgJiM2MDs9ICdlbGVtZW50LXZhbHVlJworICAgICAgKiBlbGVtZW50LW5hbWUgJiM2Mjs9ICdlbGVtZW50LXZhbHVlJyIKKworIEFuIGFkZGl0aW9uYWwgcG9zdC1xdWVyeSBGaWx0ZXJBbGdvciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgd2hlcmUgeW91IHNwZWNpZnkKKyAgd2hpY2ggTWV0YWRhdGEgZmllbGRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIGVhY2ggUHJvZHVjdCdzIFN0YXJ0RGF0ZVRpbWUsCisgIEVuZERhdGVUaW1lLCBhbmQgUHJpb3JpdHkgdmFsdWVzCisgICAgICA8L3ZhbHVlPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImV4YW1wbGVzIj4KKyAgICAgIDx2YWx1ZT4KKyAoQXNzdW1lIHlvdSBoYXZlIGEgUHJvZHVjdFR5cGUsIEdlbmVyaWNGaWxlLCB3aGljaCBzdXBwb3J0cyB0aGUKKyAgICBFbGVtZW50czogRmlsZW5hbWUsIE5vbWluYWxEYXRlLCBHcm91cCwgYW5kIERhdGFWZXJzaW9uKQorICAkIC4vZmlsZW1nci1jbGllbnQgLXUgaHR0cDovL2xvY2FsaG9zdDo5MDAwIC1vcCAtc3FsCisgICAgLXEgIlNFTEVDVCBGaWxlbmFtZSBGUk9NIEdlbmVyaWNGaWxlIFdIRVJFIChOb21pbmFsRGF0ZSA9PSAnMjAxMS0yMC0xMCcgT1IKKyAgICAgIE5vbWluYWxEYXRlID09ICcyMDExLTIwLTExJykgQU5EIEdyb3VwID09ICdUZXN0JyBBTkQgRGF0YVZlcnNpb24gPiAnMS4wJyIKKyAoUmV0dXJucyBhbGwgUHJvZHVjdHMgaW4gRmlsZU1hbmFnZXIgLS0gdXNlIHdpdGggY2FyZSkKKyAgJCAuL2ZpbGVtZ3ItY2xpZW50IC11IGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCAtb3AgLXNxbCAtcSAiU0VMRUNUICogRlJPTSAqIgorICAgICAgPC92YWx1ZT4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3ZGVmMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sCkBAIC0wLDAgKzEsMTE3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBBdXRob3I6IGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKyAgICA8YmVhbiBpZD0idXJsIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idXJsIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJGaWxlIE1hbmFnZXIgVVJMIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuCisgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXJsPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0PgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2JlYW4+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gaWQ9Im9wZXJhdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJvcCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvcGVyYXRpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICAgIHZhbHVlPSJEZWNsYXJlIHRoYXQgeW91IHdpc2ggdG8gcHJlc2VudCBhbiBvcGVyYXRpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWJPcHRpb25zIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgIHA6b3B0aW9uLXJlZj0iYWRkUHJvZHVjdFR5cGUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZGVsZXRlUHJvZHVjdEJ5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZGVsZXRlUHJvZHVjdEJ5TmFtZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJpbmdlc3RQcm9kdWN0IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9Imhhc1Byb2R1Y3QiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0UHJvZHVjdFR5cGVCeU5hbWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0TnVtUHJvZHVjdHMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0Rmlyc3RQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldE5leHRQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFByZXZQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldExhc3RQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldEN1cnJlbnRUcmFuc2ZlciIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRDdXJyZW50VHJhbnNmZXJzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFByb2R1Y3RCeUlkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFByb2R1Y3RCeU5hbWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldEZpbGVQY3RUcmFuc2ZlcnJlZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJzcWxRdWVyeSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJkdW1wTWV0YWRhdGEiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0ibHVjZW5lUXVlcnkiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0icmV0cmlldmVGaWxlc0J5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0icmV0cmlldmVGaWxlc0J5TmFtZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBBZGRQcm9kdWN0VHlwZSBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJhZGRQcm9kdWN0VHlwZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYWRkUFQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iYWRkUHJvZHVjdFR5cGUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGFkZFByb2R1Y3RUeXBlIEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPmFkZFByb2R1Y3RUeXBlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InR5cGVOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idG4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ0eXBlTmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0VHlwZSBuYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icHJvZHVjdC10eXBlLW5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDptZXRob2ROYW1lPSJzZXRQcm9kdWN0VHlwZU5hbWUiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0idHlwZURlc2MiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0ZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InR5cGVEZXNjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3RUeXBlIGRlc2NyaXB0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGVzY3JpcHRpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDptZXRob2ROYW1lPSJzZXRQcm9kdWN0VHlwZURlc2NyaXB0aW9uIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlcG9zaXRvcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJyZXBvIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVwb3NpdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcm9kdWN0VHlwZSByZXBvc2l0b3J5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZmlsZS1wYXRoIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJhZGRQcm9kdWN0VHlwZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6bWV0aG9kTmFtZT0ic2V0RmlsZVJlcG9zaXRvcnlQYXRoIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InZlcnNpb25DbGFzcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InZjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idmVyc2lvbkNsYXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3RUeXBlIHZlcnNpb25lciBjbGFzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iYWRkUHJvZHVjdFR5cGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImFkZFByb2R1Y3RUeXBlIiBwOm1ldGhvZE5hbWU9InNldFZlcnNpb25lciIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gSW5nZXN0UHJvZHVjdCBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iaW5nZXN0UHJvZHVjdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImluZ2VzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImluZ2VzdFByb2R1Y3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgaW5nZXN0UHJvZHVjdCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmluZ2VzdFByb2R1Y3Q8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icHJvZHVjdFN0cnVjdHVyZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdFN0cnVjdHVyZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJIaWVyYXJjaGljYWwgfCBGbGF0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ic3RydWN0dXJlLXR5cGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6bWV0aG9kTmFtZT0ic2V0UHJvZHVjdFN0cnVjdHVyZSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJtZXRhZGF0YUZpbGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJtZiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im1ldGFkYXRhRmlsZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNZXRhZGF0YSBYTUwgZmlsZSBwYXRoIG9yIFVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtcGF0aC1vci11cmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImluZ2VzdFByb2R1Y3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iY2xpZW50VHJhbnNmZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNsaWVudFRyYW5zZmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlVzZXIgY2xpZW50IHRyYW5zZmVyZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaW5nZXN0UHJvZHVjdCIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImRhdGFUcmFuc2ZlciIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImRhdGFUcmFuc2ZlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRhdGFUcmFuc2ZlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEYXRhVHJhbnNmZXJlciBmYWN0b3J5IGNsYXNzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iY2xhc3NwYXRoIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOm1ldGhvZE5hbWU9InNldERhdGFUcmFuc2ZlcmVyIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlZnMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJycyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlZnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGF0YSBmaWxlIHBhdGggb3IgVVJMIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJmaWxlLXBhdGgtb3ItdXJsIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOm1ldGhvZE5hbWU9InNldFJlZmVyZW5jZXMiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEhhc1Byb2R1Y3QgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9Imhhc1Byb2R1Y3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcm9kdWN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaGFzUHJvZHVjdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBoYXNQcm9kdWN0IEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+aGFzUHJvZHVjdDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaGFzUHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJvZHVjdFR5cGVCeU5hbWUgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RUeXBlQnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHRieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0VHlwZUJ5TmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcm9kdWN0VHlwZUJ5TmFtZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByb2R1Y3RUeXBlQnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0VHlwZUJ5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0TnVtUHJvZHVjdHMgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldE51bVByb2R1Y3RzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibnVtIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TnVtUHJvZHVjdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0TnVtUHJvZHVjdHMgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXROdW1Qcm9kdWN0czwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TnVtUHJvZHVjdHMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEZpcnN0UGFnZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0Rmlyc3RQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGFnZTEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRGaXJzdFBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Rmlyc3RQYWdlIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0Rmlyc3RQYWdlPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRGaXJzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldE5leHRQYWdlIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJnZXROZXh0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im5leHQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXROZXh0UGFnZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXROZXh0UGFnZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldE5leHRQYWdlPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJldlBhZ2UgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByZXZQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHJldiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFByZXZQYWdlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFByZXZQYWdlIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0UHJldlBhZ2U8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByZXZQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBHZXRMYXN0UGFnZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0TGFzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJsYXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TGFzdFBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0TGFzdFBhZ2UgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRMYXN0UGFnZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TGFzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEN1cnJlbnRUcmFuc2ZlciBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0Q3VycmVudFRyYW5zZmVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY3VyVHJhbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEN1cnJlbnRUcmFuc2ZlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRDdXJyZW50VHJhbnNmZXIgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRDdXJyZW50VHJhbnNmZXI8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEN1cnJlbnRUcmFuc2ZlciIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0Q3VycmVudFRyYW5zZmVycyBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0Q3VycmVudFRyYW5zZmVycyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImN1clRyYW5zIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0Q3VycmVudFRyYW5zZmVycyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRDdXJyZW50VHJhbnNmZXJzIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0Q3VycmVudFRyYW5zZmVyczwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0Q3VycmVudFRyYW5zZmVycyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZCBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGN0VHJhbnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UHJvZHVjdFBlcmNlbnRUcmFuc2ZlcnJlZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldEZpbGVQY3RUcmFuc2ZlcnJlZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImZpbGVQY3RUcmFucyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEZpbGVQY3RUcmFuc2ZlcnJlZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRGaWxlUGVyY2VudFRyYW5zZmVycmVkIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZDwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0RmlsZVBlcmNlbnRUcmFuc2ZlcnJlZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJvcmlnUmVmIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib3IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvcmlnUmVmIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik9yaWdpbmFsIHJlZmVyZW5jZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtcGF0aC1vci11cmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEZpbGVQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIFNxbFF1ZXJ5IE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJzcWxRdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNxbCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InNxbFF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHNxbFF1ZXJ5IEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+c3FsUXVlcnk8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKworCisgIDwhLS0gR2V0UHJvZHVjdEJ5SWQgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldFByb2R1Y3RCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGJ5aWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0QnlJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcm9kdWN0QnlJZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmdldFByb2R1Y3RCeUlkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gR2V0UHJvZHVjdEJ5TmFtZSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0UHJvZHVjdEJ5TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcm9kdWN0QnlOYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFByb2R1Y3RCeU5hbWUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRQcm9kdWN0QnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0QnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBEZWxldGVQcm9kdWN0QnlJZCBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZGVsZXRlUHJvZHVjdEJ5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkYnlpZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRlbGV0ZVByb2R1Y3RCeUlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGRlbGV0ZVByb2R1Y3RCeUlkIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+ZGVsZXRlUHJvZHVjdEJ5SWQ8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImRlbGV0ZVByb2R1Y3RCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPCEtLSBEZWxldGVQcm9kdWN0QnlOYW1lIE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJkZWxldGVQcm9kdWN0QnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZGJ5biIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZGVsZXRlUHJvZHVjdEJ5TmFtZSBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPmRlbGV0ZVByb2R1Y3RCeU5hbWU8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImRlbGV0ZVByb2R1Y3RCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIER1bXBNZXRhZGF0YSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZHVtcE1ldGFkYXRhIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZG1ldCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImR1bXBNZXRhZGF0YSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBkdW1wTWV0YWRhdGEgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5kdW1wTWV0YWRhdGE8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImR1bXBNZXRhZGF0YSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJvdXRwdXREaXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJvdXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvdXRwdXREaXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iT3V0cHV0IGRpcmVjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEuaW8uRmlsZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImZpbGUtZGlyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkdW1wTWV0YWRhdGEiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8IS0tIEx1Y2VuZVF1ZXJ5IE9wdGlvbnMgLS0+CisgIDxiZWFuIGlkPSJsdWNlbmVRdWVyeSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Imx1Y2VuZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Imx1Y2VuZVF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGx1Y2VuZVF1ZXJ5IEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+bHVjZW5lUXVlcnk8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InJlZHVjZWRQcm9kdWN0VHlwZXMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWR1Y2VkUHJvZHVjdFR5cGVzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkxpbWl0IHF1ZXJ5IFByb2R1Y3RUeXBlcyBxdWVyaWVkIGFnYWluc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Imxpc3Qtb2YtcHJvZHVjdC10eXBlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icmVkdWNlZE1ldGFkYXRhS2V5cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im1ldEtleXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZWR1Y2VkTWV0YWRhdGFLZXlzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkxpbWl0IEVsZW1lbnRzIHJldHVybmVkIGJ5IHF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJsaXN0LW9mLWVsZW1lbnRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDwhLS0gcmV0cmlldmVGaWxlcyBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0icmV0cmlldmVGaWxlc0J5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJyZmJ5aWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXRyaWV2ZUZpbGVzQnlJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZXRyaWV2ZUZpbGVzQnlJZCBBY3Rpb24iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPHZhbHVlPnJldHJpZXZlRmlsZXNCeUlkPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icmZieW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHJldHJpZXZlRmlsZXNCeU5hbWUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5yZXRyaWV2ZUZpbGVzQnlOYW1lPC92YWx1ZT4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKyAgPGJlYW4gaWQ9InRyYW5zZmVyZXIiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0cmFucyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InRyYW5zZmVyZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmFjdG9yeSBmb3IgY3JlYXRpbmcgRGF0YVRyYW5zZmVyIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgZmlsZSB0cmFuc2ZlcihzKSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyRmFjdG9yeSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InRyYW5zZmVyIGZhY3RvcnkgY2xhc3MiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5SWQiIHA6bWV0aG9kTmFtZT0ic2V0RGF0YVRyYW5zZmVyRmFjdG9yeSIgLz4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6bWV0aG9kTmFtZT0ic2V0RGF0YVRyYW5zZmVyRmFjdG9yeSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJkZXN0aW5hdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImRlc3QiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZXN0aW5hdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEaXJlY3RvcnkgdG8gdHJhbnNmZXIgUHJvZHVjdCBmaWxlIHRvIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS5pby5GaWxlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZGlyZWN0b3J5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJyZXRyaWV2ZUZpbGVzQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICAgIDwhLS0gT3B0aW9ucyB1c2VkIGZvciBtdWx0aXBsZSBBY3Rpb25zIC0tPgorICA8YmVhbiBpZD0icHJvZHVjdElkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdElkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlByb2R1Y3QgSUQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJwcm9kdWN0LWlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcm9kdWN0UGVyY2VudFRyYW5zZmVycmVkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdEJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkZWxldGVQcm9kdWN0QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImR1bXBNZXRhZGF0YSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InJldHJpZXZlRmlsZXNCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisgICAgCisgIDxiZWFuIGlkPSJwcm9kdWN0TmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBuIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJvZHVjdE5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdCBuYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icHJvZHVjdC1uYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iaGFzUHJvZHVjdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJkZWxldGVQcm9kdWN0QnlOYW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmV0cmlldmVGaWxlc0J5TmFtZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisgIDxiZWFuIGlkPSJwcm9kdWN0VHlwZU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwdG4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwcm9kdWN0VHlwZU5hbWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJvZHVjdFR5cGUgbmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InByb2R1Y3QtdHlwZS1uYW1lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJpbmdlc3RQcm9kdWN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJvZHVjdFR5cGVCeU5hbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXROdW1Qcm9kdWN0cyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEZpcnN0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRMYXN0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFByb2R1Y3RQZXJjZW50VHJhbnNmZXJyZWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKyAgCisgIDxiZWFuIGlkPSJjdXJyZW50UGFnZU51bSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImN1clBhZ2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJjdXJyZW50UGFnZU51bSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDdXJyZW50IFBhZ2UgTnVtYmVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iaW50IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icGFnZS1udW1iZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0icXVlcnkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJxIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icXVlcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRmlsZSBNYW5hZ2VyIHF1ZXJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icXVlcnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ic29ydEJ5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic2IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzb3J0QnkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTWV0YWRhdGEgZmllbGQgdG8gc29ydCBxdWVyeSByZXN1bHRzIGJ5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWV0YWRhdGEgZmllbGQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ib3V0cHV0Rm9ybWF0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib2YiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvdXRwdXRGb3JtYXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iT3V0cHV0IGZvcm1hdCBzdHJpbmcgKGkuZS4gRmlsZW5hbWUgPSAkRmlsZW5hbWUpIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ib3V0cHV0LWZvcm1hdC1zdHJpbmciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iZGVsaW1pdGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZGxtdHIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZWxpbWl0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iU3RyaW5nIHRvIHVzZSB0aGUgc2VwYXJhdGUgcXVlcnkgcmVzdWx0cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImRlbGltaXRlci1zdHJpbmciIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iZmlsdGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImZpbHRlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJRdWVyeSBmaWx0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9ImFsZ29yIiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iY29udmVydGVyIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InN0YXJ0RGF0ZVRpbWVNZXRLZXkiIHA6cmVxdWlyZWQ9InRydWUiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgcDpvcHRpb24tcmVmPSJlbmREYXRlVGltZU1ldEtleSIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICBwOm9wdGlvbi1yZWY9InByaW9yaXR5TWV0S2V5IiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0iYWxnb3IiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYWxnb3IiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhbGdvciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJGaWx0ZXJBbGdvciBjbGFzcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLnF1ZXJ5LmZpbHRlci5GaWx0ZXJBbGdvciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImNsYXNzcGF0aCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorICAKKyAgPGJlYW4gaWQ9ImNvbnZlcnRlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjb252IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iY29udmVydGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlZlcnNpb25Db252ZXJ0ZXIgY2xhc3MiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5xdWVyeS5jb252LlZlcnNpb25Db252ZXJ0ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjbGFzc3BhdGgiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICA8YmVhbiBpZD0ic3RhcnREYXRlVGltZU1ldEtleSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzZHRNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzdGFydERhdGVUaW1lTWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlN0YXJ0IGRhdGUgdGltZSBtZXRhZGF0YSBrZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJtZXRhZGF0YS1rZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InNxbFF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ibHVjZW5lUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKyAgCisgIDxiZWFuIGlkPSJlbmREYXRlVGltZU1ldEtleSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iCisgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJlZHRNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJlbmREYXRlVGltZU1ldEtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJFbmQgZGF0ZSB0aW1lIG1ldGFkYXRhIGtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im1ldGFkYXRhLWtleSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3FsUXVlcnkiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJsdWNlbmVRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorICAKKyAgPGJlYW4gaWQ9InByaW9yaXR5TWV0S2V5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKyAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InByTWV0S2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icHJpb3JpdHlNZXRLZXkiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUHJpb3JpdHkgbWV0YWRhdGEga2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibWV0YWRhdGEta2V5IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJzcWxRdWVyeSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9Imx1Y2VuZVF1ZXJ5IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L29vZHQvZWxlbWVudHMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvb29kdC9lbGVtZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2YzQ0YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L29vZHQvZWxlbWVudHMueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmVsZW1lbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIgbmFtZT0iQ0FTLlByb2R1Y3RJZCI+Cis8ZGNFbGVtZW50PklkZW50aWZpZXI8L2RjRWxlbWVudD4KKyAgICAgICAgPCEtLQorWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAndHJpbScgdGFnIHRvIGlkZW50aWZ5IHdoZXRoZXIKK29yIG5vdCB5b3Ugd2FudCBuZXdsaW5lcyB0cmltbWVkIGZyb20gdGhlIGVsZW1lbnQgZGVzY3JpcHRpb24uIFRvCit0dXJuIG9mZiB0cmltbWluZyAobm93IGRvbmUgYnkgZGVmYXVsdCksIGluY2x1ZGUgdGhlIGZvbGxvd2luZyB3aXRoIHlvdXIKK2Rlc2NyaXB0aW9uIGRlZmluaXRpb246IHRyaW09ImZhbHNlIgorLS0+Cis8ZGVzY3JpcHRpb24+CitBIFByb2R1Y3QncyB1bmlxdWUgaWRlbnRpZmllciB3aXRoaW4gdGhlIENBUyBuYW1lc3BhY2UuCis8L2Rlc2NyaXB0aW9uPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIiBuYW1lPSJDQVMuUHJvZHVjdE5hbWUiPgorPGRjRWxlbWVudD5UaXRsZTwvZGNFbGVtZW50PgorPGRlc2NyaXB0aW9uPgorQSBQcm9kdWN0J3MgbmFtZSB3aXRoaW4gdGhlIENBUyBuYW1lc3BhY2UuCis8L2Rlc2NyaXB0aW9uPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RSZWNlaXZlZFRpbWUiCituYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSI+Cis8ZGNFbGVtZW50IC8+Cis8ZGVzY3JpcHRpb24+CitUaGUgSVNPIDg2MDEgZm9ybWF0dGVkIHRpbWUgdGhhdCB0aGUgUHJvZHVjdCB3YXMgcmVjZWl2ZWQuCis8L2Rlc2NyaXB0aW9uPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIiBuYW1lPSJGaWxlbmFtZSI+Cis8ZGVzY3JpcHRpb24+CitUaGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgcmVwcmVzZW50IHRoaXMgcHJvZHVjdC4KKzwvZGVzY3JpcHRpb24+Cis8ZGNFbGVtZW50IC8+Cis8L2VsZW1lbnQ+Cis8ZWxlbWVudCBpZD0idXJuOm9vZHQ6RmlsZUxvY2F0aW9uIiBuYW1lPSJGaWxlTG9jYXRpb24iPgorPGRlc2NyaXB0aW9uPgorVGhlIGxvY2F0aW9ucyBvZiB0aGUgZmlsZXMgdGhhdCByZXByZXNlbnQgdGhpcyBwcm9kdWN0LgorPC9kZXNjcmlwdGlvbj4KKzxkY0VsZW1lbnQgLz4KKzwvZWxlbWVudD4KKzxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIgbmFtZT0iUHJvZHVjdFR5cGUiPgorPGRlc2NyaXB0aW9uPgorVHlwZSBvZiBwcm9kdWN0LCBhcyBzcGVjaWZpZWQgYnksIGUuZy4sIGEgZGF0YSBiaWJsZS4KKzwvZGVzY3JpcHRpb24+Cis8ZGNFbGVtZW50IC8+Cis8L2VsZW1lbnQ+Cis8ZWxlbWVudCBpZD0idXJuOm9vZHQ6UHJvZHVjdFN0cnVjdHVyZSIgbmFtZT0iUHJvZHVjdFN0cnVjdHVyZSI+Cis8ZGVzY3JpcHRpb24+CitXaGV0aGVyIG9yIG5vdCBhIHByb2R1Y3QgaXMgRmxhdCAoZS5nLiwgYSBzZXQgb2YgaW5kZXBlbmRlbnQKK2ZpbGVzKSwgb3IgaGllcmFyY2hpY2FsLCBlLmcuLCBhIGRpciBzdHJ1Y3R1cmUuCis8L2Rlc2NyaXB0aW9uPgorPGRjRWxlbWVudCAvPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjpvb2R0Ok1pbWVUeXBlIiBuYW1lPSJNaW1lVHlwZSI+Cis8ZGVzY3JpcHRpb24+VGhlIElFVEYgbWltZSB0eXBlIG9mIHRoaXMgcHJvZHVjdC48L2Rlc2NyaXB0aW9uPgorPGRjRWxlbWVudCAvPgorPC9lbGVtZW50PgorPGVsZW1lbnQgaWQ9InVybjp0ZXN0OkRhdGFWZXJzaW9uIiBuYW1lPSJEYXRhVmVyc2lvbiI+Cis8ZGVzY3JpcHRpb24+VGhlIHZlcnNpb24gb2YgdGhlIGRhdGEgcHJvZHVjdDwvZGVzY3JpcHRpb24+Cis8ZGNFbGVtZW50IC8+Cis8L2VsZW1lbnQ+Cis8L2NhczplbGVtZW50cz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L29vZHQvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L29vZHQvcHJvZHVjdC10eXBlLWVsZW1lbnQtbWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThjMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9maWxlbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvb29kdC9wcm9kdWN0LXR5cGUtZWxlbWVudC1tYXAueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlbWFwIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorIDwhLS0gY2FuIHNldCB0aGUgInBhcmVudCIgYXR0cmlidXRlIG9uIHR5cGVzIGJlbG93IHRvIGFsbG93IGluaGVyaXRhbmNlCitvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSB0eXBlcworLS0+CisgICA8dHlwZSBpZD0idXJuOm9vZHQ6R2VuZXJpY0ZpbGUiPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0UmVjZWl2ZWRUaW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3ROYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OlByb2R1Y3RJZCIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0VHlwZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpQcm9kdWN0U3RydWN0dXJlIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVuYW1lIi8+CisgICAgICAgPGVsZW1lbnQgaWQ9InVybjpvb2R0OkZpbGVMb2NhdGlvbiIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46b29kdDpNaW1lVHlwZSIvPgorICAgICAgIDxlbGVtZW50IGlkPSJ1cm46dGVzdDpEYXRhVmVyc2lvbiIvPgorICA8L3R5cGU+Cis8L2Nhczpwcm9kdWN0dHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZmlsZW1nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L29vZHQvcHJvZHVjdC10eXBlcy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9vb2R0L3Byb2R1Y3QtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDA4NDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ZpbGVtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9vb2R0L3Byb2R1Y3QtdHlwZXMueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnByb2R1Y3R0eXBlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgPHR5cGUgaWQ9InVybjpvb2R0OkdlbmVyaWNGaWxlIiBuYW1lPSJHZW5lcmljRmlsZSI+CisgICAgPHJlcG9zaXRvcnkgcGF0aD0iZmlsZTovL1tPT0RUX0hPTUVdL2RhdGEvYXJjaGl2ZSIvPgorICAgIDx2ZXJzaW9uZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci52ZXJzaW9uaW5nLkJhc2ljVmVyc2lvbmVyIi8+CisgICAgPCEtLQorWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAndHJpbScgdGFnIHRvIGlkZW50aWZ5IHdoZXRoZXIKK29yIG5vdCB5b3Ugd2FudCBuZXdsaW5lcyB0cmltbWVkIGZyb20gdGhlIHByb2R1Y3QgdHlwZSBkZXNjcmlwdGlvbi4gVG8KK3R1cm4gb2ZmIHRyaW1taW5nIChub3cgZG9uZSBieSBkZWZhdWx0KSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB3aXRoIHlvdXIKK2Rlc2NyaXB0aW9uIGRlZmluaXRpb246IHRyaW09ImZhbHNlIgorLS0+CisgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb2R1Y3QgdHlwZSBmb3IgYW55IGtpbmQgb2YgZmlsZS48L2Rlc2NyaXB0aW9uPgorICAgIDxtZXRFeHRyYWN0b3JzPgorICAgICAgPGV4dHJhY3RvcgorICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuQ29yZU1ldEV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0geW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIGVudlJlcGxhY2UgdGFnIHRvIHR1cm4gb24vb2ZmIGVudmlyb25tZW50IHZhciByZXBsYWNlbWVudCAtLT4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibnNBd2FyZSIgdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZW1lbnROcyIgdmFsdWU9IkNBUyIgLz4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxlbWVudHMiCisgICAgICAgICAgICB2YWx1ZT0iUHJvZHVjdFJlY2VpdmVkVGltZSxQcm9kdWN0TmFtZSxQcm9kdWN0SWQiIC8+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvZXh0cmFjdG9yPgorICAgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLmV4dHJhY3RvcnMuZXhhbXBsZXMuTWltZVR5cGVFeHRyYWN0b3IiIC8+CisgICAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuZXh0cmFjdG9ycy5leGFtcGxlcy5GaW5hbEZpbGVMb2NhdGlvbkV4dHJhY3RvciI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0gdGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgRklMRV9MT0NBVElPTiBmaWVsZAorY29tcHV0ZWQgYnkgdGhpcyBleHRyYWN0b3IgdG8gcmVwbGFjZSBhbnkgb3RoZXIgRklMRV9MT0NBVElPTiBtZXQKK2F0dHJpYnV0ZS4KKy0tPgorICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVwbGFjZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9leHRyYWN0b3I+CisgICAgPC9tZXRFeHRyYWN0b3JzPgorICAgIDxtZXRhZGF0YS8+CisgIDwvdHlwZT4KKzwvY2FzOnByb2R1Y3R0eXBlcz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTljYjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9wb20ueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxuYW1lPlBDUyBDb25maWcgKEFwYWNoZSBPT0RUKTwvbmFtZT4KKyAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tJHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yLWJldGEtMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5kaXN0LWFzc2VtYmx5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tZXh0ZW5zaW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8dHlwZT5qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FzLWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBjcy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtvb2R0LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMmQwYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApAQCAtMCwwICsxLDkxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YXNzZW1ibHk+CisgIDxpZD5iaW48L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICA8L2Zvcm1hdHM+CisgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgIDxiYXNlRGlyZWN0b3J5PnBjczwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT43NzU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvYmluPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBjcy9iaW48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgICA8ZmlsZU1vZGU+Nzc1PC9maWxlTW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5wY3MvbG9nczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi8qPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5wY3MvcnVuPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBjcy9ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KioucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+KioueG1sPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT42NjQ8L2ZpbGVNb2RlPgorICAgICAgPGRpcmVjdG9yeU1vZGU+Nzc1PC9kaXJlY3RvcnlNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBjcy9wb2xpY3k8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KiovKioueG1sPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT42NjQ8L2ZpbGVNb2RlPgorICAgICAgPGRpcmVjdG9yeU1vZGU+Nzc1PC9kaXJlY3RvcnlNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5PgorICAgICAgPGZpbHRlcmVkPmZhbHNlPC9maWx0ZXJlZD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5wY3MvbGliPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+CisgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPnRydWU8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+CisgICAgICA8dW5wYWNrT3B0aW9ucy8+CisgICAgPC9kZXBlbmRlbmN5U2V0PgorICA8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9wY3NfbGwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3Bjc19sbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOGJiZDFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9wY3NfbGwKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3Rjc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAKKyMKKyMgVG9vbDogIExvbmcgbGlzdGVyCisjIFB1cnBvc2U6ICBQcm92aWRlIG1ldGFkYXRhIGluZm9ybWF0aW9uIGZvciBhbGwgZmlsZXMgaW4gYSBkaXJlY3RvcnkuICAKKyMgSW50ZXJmYWNlOiAgQ29tbWFuZC1saW5lLiAgSWYgbm8gYXJndW1lbnRzIHByb3ZpZGVkLCBhc3N1bWUgdGhlIGN1cnJlbnQgCisjIGRpcmVjdG9yeS4gIEFyZ3VtZW50cyBjYW4gYmUgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlbmFtZSBzcGVjaWZpY2F0aW9uIAorIyB3aXRoIHdpbGRjYXJkcy4KKyMgT3V0cHV0OiAgVGV4dCB0byBzdGFuZGFyZCBvdXQuICBPbmUgbGluZSBwZXIgZmlsZS4gIEZpZWxkcyBvZiBsaW5lIAorIyAodGFiLXNlcGFyYXRlZCk6CisjICAgIEZpbGVuYW1lCisjICAgIFRlc3QgVGFnKHMpCisjICAgIFRlc3QgQ291bnRlcihzKQorIyAgICBTdWJ0ZXN0IHRhZyhzKQorIyAgICBEYXRhU3RhcnRUaW1lCisjICAgIERhdGFFbmRUaW1lCisjICAKKyMgTm90ZSB0aGlzIGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZW4gYnkgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIHBjcy1sbC1jb25mLnhtbCAKKyMgZmlsZS4KKyMKKyMgU2FtcGxlIHVzYWdlOiAuL3Bjc19sbAorCisKK3NldCBPUklHX0RJUiA9IGBwd2RgCitzZXQgRElSID0gYGRpcm5hbWUgJDBgCitjZCAkRElSCitzZXQgRElSX1BBVEggPSBgcHdkYAorY2QgJE9SSUdfRElSCisKK2phdmEgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0kRElSX1BBVEgvLi4vZXRjL2xvZ2dpbmcucHJvcGVydGllcyBcCisgICAgLURqYXZhLmV4dC5kaXJzPSRESVJfUEFUSC8uLi9saWI6JERJUl9QQVRILy4uLy4uL2ZpbGVtZ3IvbGliOiRESVJfUEFUSC8uLi8uLi93b3JrZmxvdy9saWIgXAorCW9yZy5hcGFjaGUub29kdC5wY3MudG9vbHMuUENTTG9uZ0xpc3RlciBcCisJJEZJTEVNR1JfVVJMICRESVJfUEFUSC8uLi9wb2xpY3kvcGNzLWxsLWNvbmYueG1sICRhcmd2WzItJCNhcmd2XQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9wY3Nfc3RhdCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcGNzX3N0YXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFlM2ExZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcGNzX3N0YXQKQEAgLTAsMCArMSw3OCBAQAorIyEvYmluL3Rjc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAKKyMKKyMgQSB0b29sIHRvIHByb3ZpZGUgYSByZXBvcnQgb2YgdGhlIGhlYWx0aCBvZiB0aGUgUENTLgorIyBFeGFtcGxlIHJlcG9ydDoKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUENTIEhlYWx0aCBNb25pdG9yIFJlcG9ydAorIyBHZW5lcmF0ZWQgb246IDIwMDctMDctMTJUMTA6NTY6MjMuMDAwWgorIyAKKyMgU2VydmljZSBTdGF0dXM6CisjIAorIyBGaWxlIE1hbmFnZXI6ICAgICAgICAgICAgW2h0dHA6Ly92b3N0b2s6OTAwMF06IFVQCisjIFdvcmtmbG93IE1hbmFnZXI6ICBbaHR0cDovL3Zvc3Rvazo5MDAxXTogRE9XTgorIyBSZXNvdXJjZSBNYW5hZ2VyOiBbaHR0cDovL3Zvc3Rvazo5MDAyXTogVVAKKyMgPiBiYXRjaCBzdHViOiAgIFtodHRwOi8vY29tcHV0ZS0wLTk6MjAwMV06IFVQCisjID4gYmF0Y2ggc3R1YjogW2h0dHA6Ly9jb21wdXRlLTAtMTA6MjAwMV06IFVQCisjCisjIENyYXdsZXJzOgorIyBDUFRPdmVydmlldzogW2h0dHA6Ly9mbGF0aXJvbjo5MDMwXTogICAgICAgICBVUAorIyBDUFRIZWxpb3N0YXQ6ICBbaHR0cDovL2ZsYXRpcm9uOjkwMzFdOiAgICAgICAgIERPV04KKyMgIAorIyBQQ1MgSGVhbHRoOgorIyAKKyMgRmlsZXM6CisjIC0tLS0tLS0tCisjIGxhc3QgcHJvZHVjdCBpbmdlc3RlZDogb2NvX0wxYVJhZDAxd2RrXzkwMjMzXzA3MDYwNDAxMDAwNS5oZGYgYXQgMjAwNy0wNi0wNFQxMDowMDowMC4wMDBaCisjCisjIEpvYnM6CisjIC0tLS0tLS0tCisjIDEwIHRhc2tzIFFVRVVFRAorIyA5ICB0YXNrcyBDUkFXTElORworIyAxICB0YXNrcyBQR0UgRVhFQworIyAKKyMgSW5nZXN0OgorIyAtLS0tLS0tLQorIyBDUFRPdmVydmlldzoKKyMgCisjIG51bWJlciBvZiBjcmF3bHM6IDEwCisjIGF2ZXJhZ2UgY3Jhd2wgdGltZSAobXMpOiA1MAorIyAKKyMgQ1BUSGVsaW9zdGF0OgorIyAKKyMgbnVtYmVyIG9mIGNyYXdsczogNTYKKyMgYXZlcmFnZSBjcmF3bCB0aW1lIChtcyk6IDEwCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIAorIyBTYW1wbGUgdXNhZ2U6IC4vcGNzX3N0YXQKKworc2V0IE9SSUdfRElSID0gYHB3ZGAKK3NldCBESVIgPSBgZGlybmFtZSAkMGAKK2NkICRESVIKK3NldCBESVJfUEFUSCA9IGBwd2RgCitjZCAkT1JJR19ESVIKKworamF2YSAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSRESVJfUEFUSC8uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAtRGphdmEuZXh0LmRpcnM9JERJUl9QQVRILy4uL2xpYjokRElSX1BBVEgvLi4vLi4vZmlsZW1nci9saWI6JERJUl9QQVRILy4uL3dvcmtmbG93L2xpYjokRElSX1BBVEgvLi4vLi4vcmVzbWdyL2xpYiBcCisgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IucHJvcGVydGllcz0kRElSX1BBVEgvLi4vLi4vZmlsZW1nci9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzIFwKKwlvcmcuYXBhY2hlLm9vZHQucGNzLnRvb2xzLlBDU0hlYWx0aE1vbml0b3IgXAorCSRGSUxFTUdSX1VSTCBcCisJJFdPUktGTE9XX1VSTCBcCisJJFJFU01HUl9VUkwgXAorCSRESVJfUEFUSC8uLi9wb2xpY3kvcGNzLWNyYXdsZXJzLnhtbCBcCisJJERJUl9QQVRILy4uL3BvbGljeS9wY3Mtd29ya2Zsb3ctc3RhdHVzZXMueG1sCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3Bjc190cmFjZSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcGNzX3RyYWNlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyNWRiNzNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9wY3NfdHJhY2UKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3Rjc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAKKyMKKyMgUENTIFRyYWNlIHV0aWxpdHkgdG8gZGlzY292ZXIgcHJvZHVjdCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgbGluZWFnZQorIyB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSwgbWV0YWRhdGEsIHBpcGVsaW5lIGluZm9ybWF0aW9uIGFuZCB0aGUgbGlrZQorIworIyBTYW1wbGUgdXNhZ2U6IC4vcGNzX3RyYWNlIG9jb19MMDMzU3VuMDFTdW5fOTE2MDFfMDcwOTIyMDU0ODM5LnBrdAorCisKK3NldCBESVIgPSBgZGlybmFtZSAkMGAKK2NkICRESVIKK3NldCBESVJfUEFUSCA9IGBwd2RgCisKK2lmICggJCNhcmd2ICE9IDEgKSB0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxwcm9kdWN0PiIKKwlleGl0IDEKK2Vsc2UKKwlqYXZhIC1EamF2YS5leHQuZGlycz0kRElSX1BBVEgvLi4vbGliOiRESVJfUEFUSC8uLi8uLi9maWxlbWdyL2xpYjokRElSX1BBVEgvLi4vLi4vd29ya2Zsb3cvbGliIFwKKyAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSRESVJfUEFUSC8uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5wcm9wZXJ0aWVzPSRESVJfUEFUSC8uLi8uLi9maWxlbWdyL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMgXAorCW9yZy5hcGFjaGUub29kdC5wY3MudG9vbHMuUENTVHJhY2UgXAorCS0tZm0gJEZJTEVNR1JfVVJMIFwKKwktLXdtICRXT1JLRkxPV19VUkwgXAorCS0tcHJvZHVjdCAkMSBcCisJLS1lbmFibGVOb25DYXQKK2VuZGlmCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGRkZTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcwpAQCAtMCwwICsxLDQ4IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgb25lIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSByb290IGxvZ2dlcgorLmxldmVsID0gQUxMCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVscworb3JnLmFwYWNoZS5vb2R0LnBjcy5sZXZlbCA9IFNFVkVSRQorb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLmxldmVsID0gU0VWRVJFCitvcmcuYXBhY2hlLm9vZHQucGNzLnRvb2xzLmxldmVsID0gU0VWRVJFCisKKyMgc2V0IGxvZ2dpbmcgbGV2ZWxzIGZvciBGTSBpbnRlcmZhY2UKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0ubGV2ZWwgPSBTRVZFUkUKK29yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwubGV2ZWwgPSBPRkYKKworIyBzZXQgbG9nZ2luZyBsZXZlbHMgZm9yIFdNIGludGVyZmFjZQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW0ubGV2ZWwgPSBPRkYKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8ubGV2ZWwgPSBPRkYKKworIyBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGNvbW1vbnMtaHR0cGNsaWVudCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHhtbHJwYyAKK29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmxldmVsID0gT0ZGCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gT0ZGCitodHRwY2xpZW50LndpcmUubGV2ZWwgPSBPRkYKK3N1bi5uZXQud3d3LnByb3RvY29sLmh0dHAubGV2ZWwgPSBPRkYKKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9wY3MtY3Jhd2xlcnMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9wY3MtY3Jhd2xlcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmZlZTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3Bjcy1jcmF3bGVycy54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0F1dGhvcjogQ2hyaXMgTWF0dG1hbm4KKworVGhpcyBmaWxlIGRlZmluZXMgd2hhdCBpbmdlc3QgY3Jhd2xlcnMgYXJlIGJlaW5nIHVzZWQgYnkgdGhlIFBDUy4KK1RoaXMgZmlsZSBpcyB1c2VkIGluIHRoZSBQQ1NIZWFsdGhNb25pdG9yIHRvb2wuCistLT4KKzxpbnB1dD4KKworICAgIDwhLS0gCisgICAgICBIZXJlIGFyZSBnbG9iYWwgcHJvcGVydGllcyBmb3IgdGhlIAorICAgICAgY3Jhd2xlci4gVGhlc2UgcHJvcGVydGllcyBhcmUgZW52aXJvbm1lbnQgCisgICAgICB2YXJpYWJsZSByZXBsYWNlZC4KKyAgICAgIAorICAgICAgVGhlIG9ubHkgY3VycmVudCBwcm9wZXJ0eSBpczoKKyAgICAgIAorICAgICAgSG9zdG5hbWU6IHRoZSBkZWZhdWx0IGhvc3RuYW1lIHRoYXQgdGhlIGNyYXdsZXIgCisgICAgICBkYWVtb25zIGFyZSBvcGVyYXRpbmcgb24uCisgICAgIC0tPgorCTxncm91cCBuYW1lPSJDcmF3bFByb3BlcnRpZXMiPgorCQk8c2NhbGFyIG5hbWU9Ikhvc3RuYW1lIj5sb2NhbGhvc3Q8L3NjYWxhcj4KKwk8L2dyb3VwPgorCisgICAgPCEtLSBIZXJlIGlzIGEgc2V0IG9mIHNjYWxhcnMgd2hlcmUgCisgICAgICAgICB0aGUgc2NhbGFyOgorICAgICAgICAgCisgICAgICAgICBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgY3Jhd2xlciB0byBtb25pdG9yIHN0YXR1cyBmb3IuCisgICAgICAgICB2YWx1ZTogdGhlIHBvcnQgbnVtYmVyIHRoYXQgdGhlIGNyYXdsZXIgZGFlbW9uIHRvIAorICAgICAgICAgbW9uaXRvciBpcyBydW5uaW5nIG9uLgorICAgICAtLT4KKwk8Z3JvdXAgbmFtZT0iQ3Jhd2xlckluZm8iPgorCSAgICA8c2NhbGFyIG5hbWU9IkNyYXdsZXIxIj45MDIwPC9zY2FsYXI+CisJPC9ncm91cD4KKworPC9pbnB1dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3Bjcy1sbC1jb25mLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvcGNzLWxsLWNvbmYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2Q3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Bjcy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3Bjcy1sbC1jb25mLnhtbApAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworQXV0aG9yOiBDaHJpcyBNYXR0bWFubgorCitUaGlzIGZpbGUgY29uZmlndXJlcyB0aGUgUENTIGxvbmcgbGlzdGVyLCBkZWZpbmluZyB3aGF0IHByb2R1Y3QgdHlwZXMKK3RvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdGluZywgd2hhdCBmaWVsZCBuYW1lcyB0byBpbmNsdWRlIGFzIGxpc3RpbmcgCitjb2x1bW5zLCBhbmQgd2hpY2ggb2YgdGhvc2UgZmllbGQgbmFtZXMgYXJlIGNvbGxlY3Rpb24gdGFncyB0aGF0IGdyb3VwIAorcHJvZHVjdHMgdG9nZXRoZXIuCistLT4KKzxpbnB1dD4KKworICA8IS0tIAorICAgIERlZmluZXMgbWV0YWRhdGEgZmllbGRzIHBlciBwcm9kdWN0IHRvIHNob3cgYXMgCisgICAgY29sdW1ucyBpbiB0aGUgbG9uZyBsaXN0aW5nLiBUaGUgc2NhbGFyIG5hbWUgCisgICAgYXR0cmlidXRlIGlzIHRoZSBwcm9kdWN0IG1ldCBmaWVsZCBuYW1lLCBhbmQgCisgICAgdGhlIHZhbHVlIGZvciB0aGUgc2NhbGFyIGlzIHRoZSBuYW1lIHRoYXQgdGhlIAorICAgIGxvbmcgbGlzdGVyIGRpc3BsYXlzIHdoaWxlIGxpc3RpbmcuIFRoZSB2ZWN0b3Igb2YgCisgICAgb3JkZXJlZCBtZXQga2V5cyBpcyB0aGUgZGlzcGxheSBvcmRlciBpbiB0aGUgbGlzdGluZy4KKyAgIC0tPgorICA8Z3JvdXAgbmFtZT0iTWV0RmllbGRDb2x1bW5zIj4KKyAgICA8dmVjdG9yIG5hbWU9Ik9yZGVyZWRNZXRLZXlzIj4KKyAgICAgIDxlbGVtZW50PkZpbGVuYW1lPC9lbGVtZW50PgorICAgICAgPGVsZW1lbnQ+VGVzdFRhZzwvZWxlbWVudD4KKyAgICAgIDxlbGVtZW50PlN1YlRlc3RUYWc8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudD5UZXN0Q291bnRlcjwvZWxlbWVudD4KKyAgICAgIDxlbGVtZW50PlN0YXJ0RGF0ZVRpbWU8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudD5FbmREYXRlVGltZTwvZWxlbWVudD4KKyAgICA8L3ZlY3Rvcj4KKyAgCisgICAgPHNjYWxhciBuYW1lPSJGaWxlbmFtZSI+RmlsZW5hbWU8L3NjYWxhcj4KKyAgICA8c2NhbGFyIG5hbWU9IlRlc3RUYWciPlRlc3QgVGFnKHMpPC9zY2FsYXI+CisgICAgPHNjYWxhciBuYW1lPSJTdWJUZXN0VGFnIj5TdWJ0ZXN0IHRhZyhzKTwvc2NhbGFyPgorICAgIDxzY2FsYXIgbmFtZT0iVGVzdENvdW50ZXIiPlRlc3QgQ291bnRlcihzKTwvc2NhbGFyPgorICAgIDxzY2FsYXIgbmFtZT0iU3RhcnREYXRlVGltZSI+RGF0YVN0YXJ0VGltZTwvc2NhbGFyPgorICAgIDxzY2FsYXIgbmFtZT0iRW5kRGF0ZVRpbWUiPkRhdGFFbmRUaW1lPC9zY2FsYXI+CisgIDwvZ3JvdXA+CisgIAorICA8IS0tIAorICAgIExldHMgdGhlIGxvbmcgbGlzdGVyIGtub3cgd2hpY2ggZmllbGRzIGFyZSAKKyAgICBjb2xsZWN0aW9uIGZpZWxkczogdGhhdCBpcywgZmllbGRzIHRoYXQgZ3JvdXAgCisgICAgcHJvZHVjdHMgdG9nZXRoZXIuIFRoZXNlIGZpZWxkcyB3aWxsIGJlIHVzZWQsIGFsb25nIAorICAgIHdpdGggdGhlIElucHV0RmlsZXMgbWV0IGZpZWxkLCB0byBmaW5kIGRlc2NlbmRhbnQgCisgICAgZmlsZXMgd2l0aCBtYXRjaGluZyBjb2xsZWN0aW9uIGZpZWxkIHZhbHVlcy4KKyAgIC0tPgorICA8Z3JvdXAgbmFtZT0iQ29sbGVjdGlvbkZpZWxkcyI+CisgICAgPHZlY3RvciBuYW1lPSJGaWVsZE5hbWVzIj4KKyAgICAgIDxlbGVtZW50PlRlc3RUYWc8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudD5TdWJUZXN0VGFnPC9lbGVtZW50PgorICAgICAgPGVsZW1lbnQ+VGVzdENvdW50ZXI8L2VsZW1lbnQ+CisgICAgPC92ZWN0b3I+CisgIDwvZ3JvdXA+CisgIAorICA8IS0tIAorICAgIElmIHlvdSBkb24ndCBleHBlY3QgYWxsIHRoZSBwcm9kdWN0IHR5cGVzIHRvIGJlIAorICAgIGxpc3RhYmxlLCB5b3UgY2FuIHNldCBhbiBleGNsdWRlIGxpc3QuIFRoaXMgaXMgCisgICAgdXNlZnVsIHdoZW4gZS5nLiwgc29tZSBwcm9kdWN0IHR5cGVzIGFyZSBzbyBtYXNzaXZlIAorICAgIHlvdSB3b3VsZCBuZXZlciBkbyBhIGxvbmcgbGlzdGluZyBvbiB0aGVtIGJlY2F1c2UgCisgICAgdGhlIGRlc2NlbmRhbnQgcXVlcnkgd291bGQgdGFrZSBhIGxvbmcgdGltZS4gIAorICAgLS0+CisgIDxncm91cCBuYW1lPSJFeGNsdWRlZFByb2R1Y3RUeXBlTGlzdCI+CisgICA8dmVjdG9yIG5hbWU9IlByb2R1Y3RUeXBlcyI+CisgICAgPGVsZW1lbnQ+RlRTU3BlY3RydW08L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+RlRTUnVubG9nPC9lbGVtZW50PgorICAgIDxlbGVtZW50PkZUU1N1bnJ1bjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5QcmltYXJ5TG9nPC9lbGVtZW50PgorICAgIDxlbGVtZW50Pk1vbml0b3JMb2c8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+T0NPVHJlbmRYTUw8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+U2F2ZXNldERpcjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5GVFNJZ3JhbURpcjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5TYXZlc2V0SW5mb0RpcjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5DUFRIZWxpb3N0YXQ8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BUTW90b3I8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BUUGhvdG9kaW9kZTwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5DUFRXYXZlbWV0ZXI8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BURVRMPC9lbGVtZW50PgorICAgIDxlbGVtZW50PkNQVFN0ZXA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BUQ29sbGltYXRvcjwvZWxlbWVudD4KKyAgIDwvdmVjdG9yPgorICA8L2dyb3VwPgorCis8L2lucHV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvcGNzLXdvcmtmbG93LXN0YXR1c2VzLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGNzL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvcGNzLXdvcmtmbG93LXN0YXR1c2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQwMmUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wY3Mvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9wY3Mtd29ya2Zsb3ctc3RhdHVzZXMueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIAorQXV0aG9yOiBDaHJpcyBNYXR0bWFubgorCitUaGlzIGZpbGUgZGVmaW5lcyB0aGUgd29ya2Zsb3cgc3RhdHVzZXMgdGhhdCB3ZSBjYXJlIGFib3V0CitpbiB0aGUgUENTIEhlYWx0aCBNb25pdG9yIHRvb2wuCistLT4KKzxpbnB1dD4KKworICAgIDwhLS0gIHRoaXMgaW5mb3JtYXRpb24gZGVmaW5lcyB0aGUgCisgICAgdmFsaWQgd29ya2Zsb3cgc3RhdGVzIHRoYXQgd2Ugd2FudCB0byAKKyAgICBjaGVjayBqb2Igc3RhdHVzIGZvci4KKyAgICAgLS0+CisJPGdyb3VwIG5hbWU9IldvcmtmbG93U3RhdGVzR3JvdXAiPgorCQk8dmVjdG9yIG5hbWU9IlN0YXRlcyI+CisJCSA8ZWxlbWVudD5RVUVVRUQ8L2VsZW1lbnQ+CisJCSA8ZWxlbWVudD5SU1VCTUlUPC9lbGVtZW50PgorCQkgPGVsZW1lbnQ+QlVJTERJTkcgQ09ORklHIEZJTEU8L2VsZW1lbnQ+CisJCSA8ZWxlbWVudD5QR0UgRVhFQzwvZWxlbWVudD4KKwkJIDxlbGVtZW50PkNSQVdMSU5HPC9lbGVtZW50PgorCQkgPGVsZW1lbnQ+U1RBR0lORyBJTlBVVDwvZWxlbWVudD4KKwkJIDxlbGVtZW50PkZJTklTSEVEPC9lbGVtZW50PgorCQkgPGVsZW1lbnQ+U1RBUlRFRDwvZWxlbWVudD4KKwkJIDxlbGVtZW50PlBBVVNFRDwvZWxlbWVudD4KKwkJPC92ZWN0b3I+CisJPC9ncm91cD4KKzwvaW5wdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wZ2UvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGdlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0MTBjZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGdlL3BvbS54bWwKQEAgLTAsMCArMSw5OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPG5hbWU+UEdFIChBcGFjaGUgT09EVCk8L25hbWU+CisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LXBnZTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yLWJldGEtMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorIAorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LWV4dGVuc2lvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHR5cGU+amFyPC90eXBlPgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtd29ya2Zsb3c8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke29vZHQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLXBnZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7b29kdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNhcy1jcmF3bGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wZ2Uvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wZ2Uvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWZhMWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BnZS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw2MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorICA8aWQ+YmluPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT5wZ2U8L2Jhc2VEaXJlY3Rvcnk+CisgIDxpbmNsdWRlU2l0ZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZVNpdGVEaXJlY3Rvcnk+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT4uPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5DSEFOR0VTLnR4dDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cGdlL2Jpbjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzLz4KKyAgICAgIDxmaWxlTW9kZT43NTU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBnZS9wb2xpY3k8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc2l0ZS9hcGlkb2NzPC9kaXJlY3Rvcnk+CisgICAgICA8ZmlsdGVyZWQ+ZmFsc2U8L2ZpbHRlcmVkPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorICA8ZGVwZW5kZW5jeVNldHM+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBnZS9saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9leGFtcGxlLXNjcmlwdC5zaCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZXhhbXBsZS1zY3JpcHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQ2Mzk3MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vZXhhbXBsZS1zY3JpcHQuc2gKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL2Jhc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZWNobyAiSGVsbG8gV29ybGQiCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2V4YW1wbGUtcGdlLWNvbmZpZy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2V4YW1wbGUtcGdlLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNGVhMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvZXhhbXBsZS1wZ2UtY29uZmlnLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cGdlQ29uZmlnPgorCisgIDwhLS0gSG93IHRvIHJ1biB0aGUgUEdFIC0tPgorICA8ZXhlIGRpcj0iW0pvYkRpcl0iIHNoZWxsPSIvYmluL2Jhc2giPgorICAgIDxjbWQ+W1BHRV9ST09UXS9iaW4vZXhhbXBsZS1zY3JpcHQuc2ggPiAvdG1wL0hlbGxvV29ybGRQR0UtW1Byb2R1Y3Rpb25EYXRlVGltZV0ub3V0cHV0LnR4dDwvY21kPgorICA8L2V4ZT4KKworICA8IS0tIEZpbGVzIHRvIGluZ2VzdCAtLT4KKyAgPG91dHB1dD4KKyAgPC9vdXRwdXQ+CisKKyAgPCEtLSBDdXN0b20gbWV0YWRhdGEgdG8gYWRkIHRvIG91dHB1dCBmaWxlcyAtLT4KKyAgPGN1c3RvbU1ldGFkYXRhPgorICAgIDwhLS0gaGVscGZ1bCBrZXlzIC0tPgorICAgIDxtZXRhZGF0YSBrZXk9Ikxlc3NUaGFuIiB2YWw9IiYjeDNDOyIvPgorICAgIDxtZXRhZGF0YSBrZXk9Ikxlc3NUaGFuT3JFcXVhbFRvIiB2YWw9IltMZXNzVGhhbl09Ii8+CisgICAgPG1ldGFkYXRhIGtleT0iR3JlYXRlclRoYW4iIHZhbD0iJiN4M0U7Ii8+CisgICAgPG1ldGFkYXRhIGtleT0iR3JlYXRlclRoYW5PckVxdWFsVG8iIHZhbD0iW0dyZWF0ZXJUaGFuXT0iLz4KKyAgICA8bWV0YWRhdGEga2V5PSJFeGNsYW1hdGlvbiIgdmFsPSImIzMzOyIvPgorICAgIDxtZXRhZGF0YSBrZXk9IkFtcGVyc2FuZCIgdmFsPSImIzM4OyIvPgorICAgIDxtZXRhZGF0YSBrZXk9Ik5vdEVxdWFsVG8iIHZhbD0iW0FtcGVyc2FuZF09Ii8+CisgICAgPG1ldGFkYXRhIGtleT0iTG9naWNhbEFuZCIgdmFsPSJbQW1wZXJzYW5kXVtBbXBlcnNhbmRdIi8+CisgICAgPG1ldGFkYXRhIGtleT0iQ3NoUGlwZVRvU3RkT3V0QW5kRXJyb3IiIHZhbD0iW0dyZWF0ZXJUaGFuXVtBbXBlcnNhbmRdW0V4Y2xhbWF0aW9uXSIvPgorCisgICAgPG1ldGFkYXRhIGtleT0iUHJvZHVjdGlvbkRhdGVUaW1lIiB2YWw9IltEQVRFLlVUQ10iLz4KKyAgPC9jdXN0b21NZXRhZGF0YT4KKworPC9wZ2VDb25maWc+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1M2IwMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApAQCAtMCwwICsxLDEyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorDQorICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4NCisgIDxuYW1lPkRhdGEgTWFuYWdlbWVudCBTeXN0ZW08L25hbWU+DQorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KKyAgPGRlc2NyaXB0aW9uPkRhdGEgTWFuYWdlbWVudCBTeXN0ZW0gUG93ZXJlZCBieSBBcGFjaGUgT09EVCBkZWxpdmVyZWQgdmlhIFJBRGlYPC9kZXNjcmlwdGlvbj4NCisgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+DQorDQorICA8cHJvcGVydGllcz4NCisgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+DQorICAgIDxwcm9qZWN0LnJlcG9ydGluZy5vdXRwdXRFbmNvZGluZz5VVEYtODwvcHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RW5jb2Rpbmc+DQorICAgIDxvb2R0LnZlcnNpb24+JHtvb2R0fTwvb29kdC52ZXJzaW9uPg0KKyAgICA8b29kdC5wZ2UudmVyc2lvbj4ke29vZHR9PC9vb2R0LnBnZS52ZXJzaW9uPg0KKyAgIDwhLS0gTWF2ZW4gcGx1Z2luIGRlcGVuZGVuY2llcyAtLT4NCisgICAgPG1hdmVuLWNvbXBpbGVyLXBsdWdpbi52ZXJzaW9uPjMuMjwvbWF2ZW4tY29tcGlsZXItcGx1Z2luLnZlcnNpb24+DQorICAgIDxtYXZlbi1zdXJlZmlyZS1wbHVnaW4udmVyc2lvbj4yLjE3PC9tYXZlbi1zdXJlZmlyZS1wbHVnaW4udmVyc2lvbj4NCisgICAgPG1hdmVuLWphci1wbHVnaW4udmVyc2lvbj4yLjU8L21hdmVuLWphci1wbHVnaW4udmVyc2lvbj4NCisgICAgPG1hdmVuLWphdmFkb2MtcGx1Z2luLnZlcnNpb24+Mi4xMC4xPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi52ZXJzaW9uPg0KKyAgICA8bWF2ZW4tZWNsaXBzZS1wbHVnaW4udmVyc2lvbj4yLjk8L21hdmVuLWVjbGlwc2UtcGx1Z2luLnZlcnNpb24+DQorICA8L3Byb3BlcnRpZXM+DQorDQorICA8cmVwb3NpdG9yaWVzPg0KKyAgICA8cmVwb3NpdG9yeT4NCisgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCisgICAgICA8bmFtZT5KYXZhIFN1biBNYXZlbjIgUmVwb3NpdG9yeTwvbmFtZT4NCisgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8yPC91cmw+DQorICAgICAgPGxheW91dD5kZWZhdWx0PC9sYXlvdXQ+DQorICAgIDwvcmVwb3NpdG9yeT4NCisgICAgPHJlcG9zaXRvcnk+DQorICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPg0KKyAgICAgIDxuYW1lPkFwYWNoZSBTbmFwc2hvdHM8L25hbWU+DQorICAgICAgPHVybD5odHRwOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NuYXBzaG90cy88L3VybD4NCisgICAgICA8cmVsZWFzZXM+DQorICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCisgICAgICA8L3JlbGVhc2VzPg0KKyAgICA8L3JlcG9zaXRvcnk+DQorICA8L3JlcG9zaXRvcmllcz4NCisNCisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KKyAgPCEtLSB1c2UgdGhlIGZvbGxvd2luZyBpZiB5b3UncmUgbm90IHVzaW5nIGEgc25hcHNob3QgdmVyc2lvbi4gLS0+DQorICAgIDxyZXBvc2l0b3J5Pg0KKyAgICAgIDxpZD5yZXBvPC9pZD4NCisgICAgICA8bmFtZT5SZXBvc2l0b3J5IE5hbWU8L25hbWU+DQorICAgICAgPHVybD5zY3A6Ly9ob3N0L3BhdGgvdG8vcmVwbzwvdXJsPg0KKyAgICA8L3JlcG9zaXRvcnk+DQorICAgIDwhLS0gdXNlIHRoZSBmb2xsb3dpbmcgaWYgeW91IEFSRSB1c2luZyBhIHNuYXBzaG90IHZlcnNpb24uIC0tPg0KKyAgICA8c25hcHNob3RSZXBvc2l0b3J5Pg0KKyAgICAgIDxpZD5yZXBvPC9pZD4NCisgICAgICA8bmFtZT5SZXBvc2l0b3J5IE5hbWU8L25hbWU+DQorICAgICAgPHVybD5zY3A6Ly9ob3N0L3BhdGgvdG8vcmVwbzwvdXJsPg0KKyAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4NCisgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCisNCisgIDxidWlsZD4NCisgICAgPHNvdXJjZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2phdmE8L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvdGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4tY29tcGlsZXItcGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS42PC90YXJnZXQ+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8dmVyc2lvbj4ke21hdmVuLWphci1wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPGFyY2hpdmU+DQorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4Pg0KKyAgICAgICAgICA8L2FyY2hpdmU+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVjbGlwc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+JHttYXZlbi1lY2xpcHNlLXBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+JHttYXZlbi1zdXJlZmlyZS1wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0Ki5qYXZhPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4tamF2YWRvYy1wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPG91dHB1dEVuY29kaW5nPlVURi04PC9vdXRwdXRFbmNvZGluZz4NCisgICAgICAgICAgPGNoYXJzZXQ+VVRGLTg8L2NoYXJzZXQ+DQorICAgICAgICAgIDxkb2NlbmNvZGluZz5VVEYtODwvZG9jZW5jb2Rpbmc+DQorICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4NCisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQorICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgPGdvYWw+amF2YWRvYzwvZ29hbD4NCisgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgIDwvZXhlY3V0aW9ucz4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgPC9idWlsZD4NCisNCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3IvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0NGZlYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3BvbS54bWwKQEAgLTAsMCArMSw5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPG5hbWU+UmVzb3VyY2UgTWFuYWdlciAoQXBhY2hlIE9PRFQpPC9uYW1lPgorICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS0ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmRpc3QtYXNzZW1ibHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS1leHRlbnNpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPmphcjwvdHlwZT4KKyAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLXJlc291cmNlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtvb2R0LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1wZ2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke29vZHQucGdlLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FzLWNyYXdsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4gCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWY4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw5MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorICA8aWQ+YmluPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT5yZXNtZ3I8L2Jhc2VEaXJlY3Rvcnk+CisgIDxpbmNsdWRlU2l0ZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZVNpdGVEaXJlY3Rvcnk+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT4uPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5DSEFOR0VTLnR4dDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8ZmlsZU1vZGU+Nzc1PC9maWxlTW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2JpbjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXNtZ3IvYmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc3NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVzbWdyL2xvZ3M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+KiovKjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVzbWdyL3J1bjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi8qPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V0YzwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXNtZ3IvZXRjPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPioqLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8ZmlsZU1vZGU+NjY0PC9maWxlTW9kZT4KKyAgICAgIDxkaXJlY3RvcnlNb2RlPjc3NTwvZGlyZWN0b3J5TW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXNtZ3IvcG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyoqLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8ZmlsZU1vZGU+NjY0PC9maWxlTW9kZT4KKyAgICAgIDxkaXJlY3RvcnlNb2RlPjc3NTwvZGlyZWN0b3J5TW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zaXRlL2FwaWRvY3M8L2RpcmVjdG9yeT4KKyAgICAgIDxmaWx0ZXJlZD5mYWxzZTwvZmlsdGVyZWQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+CisgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVzbWdyL2xpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgPHVucGFja09wdGlvbnMvPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgPC9kZXBlbmRlbmN5U2V0cz4KKzwvYXNzZW1ibHk+CisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vYmF0Y2hfc3R1YiBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vYmF0Y2hfc3R1YgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmRjYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9iYXRjaF9zdHViCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi90Y3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisjICRJZCQgCisjCisKK3NldCBESVIgPSBgZGlybmFtZSAkMGAKK2NkICRESVIKK3NldCBESVJfUEFUSCA9IGBwd2RgCisKK2lmICggJCNhcmd2ICE9IDEgKSB0aGVuCisgICAgICAgIGVjaG8gIlVzYWdlOiAkMCA8cG9ydD4iCisgICAgICAgIGV4aXQgMQorZWxzZQorICAgICAgICBqYXZhIC1EamF2YS5leHQuZGlycz0uLi9saWIgXAorICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5leHRlcm4uWG1sUnBjQmF0Y2hTdHViIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS50YXNrLm1ldGtleXMubGVnYWN5TW9kZT0idHJ1ZSIgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnRhc2suc3RhdHVzLmxlZ2FjeU1vZGU9InRydWUiIFwKKyAgICAgICAgLS1wb3J0TnVtICQxJgorZW5kaWYKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcmVtb3RlIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9yZW1vdGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDk0NjM1NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcmVtb3RlCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFNjcmlwdCB0byBydW4gYSBjb21tYW5kIG9uIGFsbCBub2RlcyBzcGVjaWZpZWQgaW4gYSBub2Rlcy54bWwgY29uZmlnIGZpbGUKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyMKKyMgJElkJAorCitFX05PX0FSR1M9NjUKKworaWYgWyAkIyAtZXEgMCBdCit0aGVuCisgIGVjaG8gIlVzYWdlOiByZW1vdGUgL3BhdGgvdG8vbm9kZXMueG1sIGNvbW1hbmQuLi4iCisgIGV4aXQgJEVfTk9fQVJHUworZmkgCisKK05PREVTPSQoYXdrICcvPG5vZGUvIHtwcmludCBzdWJzdHIoJDMsIDEyLGxlbmd0aCgkMyktMTIpfScgJDEpCitzaGlmdCAKK2ZvciBOT0RFIGluICROT0RFUworZG8KKyAgc3NoICROT0RFICQiJHtALy8gL1xcIH0iIDI+JjEgfCBzZWQgInMvXi8kTk9ERTogLyIgJgorZG9uZQorCitleGl0IDAgCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3Jlc21nciBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vcmVzbWdyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiZDlkYjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3Jlc21ncgpAQCAtMCwwICsxLDE3MyBAQAorIyEvYmluL3NoCisjCisjIGluaXQgc2NyaXB0IGZvciBYbWxScGNSZXNvdXJjZU1hbmFnZXIKKyMKKyMgY2hrY29uZmlnOiAzNDUgODggMjIKKyMgZGVzY3JpcHRpb246IENBUyBSZXNvdXJjZSBNYW5hZ2VyCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisjICRJZCQKKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorZGFyd2luPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK0RhcndpbiopIGRhcndpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IE9PRFRfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRPT0RUX0hPTUUiIF0gJiYgT09EVF9IT01FPWBjZCAiJFBSR0RJUi8uLi8uLiIgOyBwd2RgCisKKyMgR2V0IE9PRFQgZW52aXJvbm1lbnQgc2V0IHVwCitpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vZW52LnNoIF07IHRoZW4KKyAgLiAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaAorZmkKKworIyBPbmx5IHNldCBSRVNNR1JfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK2lmIFsgLXogIiRSRVNNR1JfSE9NRSIgXTsgdGhlbgorICBSRVNNR1JfSE9NRT0iJE9PRFRfSE9NRSIvcmVzbWdyCisgIGV4cG9ydCBSRVNNR1JfSE9NRQorZmkKKworaWYgWyAteiAiJFJFU01HUl9QSUQiIF07IHRoZW4KKyAgUkVTTUdSX1BJRD0iJFJFU01HUl9IT01FIi9ydW4vY2FzLnJlc21nci5waWQKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICBbIC1uICIkSlJFX0hPTUUiIF0gJiYgSlJFX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSlJFX0hPTUUiYAorICBbIC1uICIkT09EVF9IT01FIiBdICYmIE9PRFRfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRPT0RUX0hPTUUiYAorICBbIC1uICIkUkVTTUdSX0hPTUUiIF0gJiYgUkVTTUdSX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkUkVTTUdSX0hPTUUiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKK2ZpCisKK2lmIFsgIiQxIiA9ICJzdGFydCIgXTsgdGhlbgorICBpZiBbICEgLXogIiRSRVNNR1JfUElEIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiJFJFU01HUl9QSUQiIF07IHRoZW4KKyAgICAgIGVjaG8gIlBJRCBmaWxlICgkUkVTTUdSX1BJRCkgZm91bmQuIElzIFJlc291cmNlIE1hbmFnZXIgc3RpbGwgcnVubmluZz8gU3RhcnQgYWJvcnRlZC4iCisgICAgICBleGl0IDEKKyAgICBmaQorICBmaQorCisgICMgSW4gY2FzZSB0aGlzIHNjcmlwdCB3YXMgcnVuIGZyb20gc29tZXdoZXJlIGVsc2UgY2QgdG8gdGhpcyBkaXJlY3RvcnkKKyAgY2QgIiRSRVNNR1JfSE9NRSIvYmluCisKKyAgIiRfUlVOSkFWQSIgJEpBVkFfT1BUUyAkT09EVF9PUFRTIFwKKyAgICAtRGphdmEuZXh0LmRpcnM9IiRSRVNNR1JfSE9NRSIvbGliIFwKKyAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSIkUkVTTUdSX0hPTUUiL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgXAorICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5wcm9wZXJ0aWVzPSIkUkVTTUdSX0hPTUUiL2V0Yy9yZXNvdXJjZS5wcm9wZXJ0aWVzIFwKKyAgICAtRGphdmEuaW8udG1wZGlyPSIkT09EVF9UTVBESVIiIFwKKyAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5YbWxScGNSZXNvdXJjZU1hbmFnZXIgXAorICAgIC0tcG9ydE51bSAiJFJFU01HUl9QT1JUIiAyPiYxICYKKworICBpZiBbICEgLXogIiRSRVNNR1JfUElEIiBdOyB0aGVuCisgICAgZWNobyAkISA+ICRSRVNNR1JfUElECisgIGZpCisKKyAgaWYgWyAkaGF2ZV90dHkgLWVxIDEgXTsgdGhlbgorICAgIGVjaG8gIlJlc291cmNlIE1hbmFnZXIgc3RhcnRlZCBQSUQgZmlsZSAoJFJFU01HUl9QSUQpLiIKKyAgZmkKKworZWxpZiBbICIkMSIgPSAic3RvcCIgXTsgdGhlbgorCisgIHNoaWZ0CisKKyAgU0xFRVA9NQorICBpZiBbICEgLXogIiQxIiBdOyB0aGVuCisgICAgZWNobyAkMSB8IGdyZXAgIlteMC05XSIgPiAvZGV2L251bGwgMj4mMQorICAgIGlmIFsgJD8gLWVxIDEgXTsgdGhlbgorICAgICAgU0xFRVA9JDEKKyAgICAgIHNoaWZ0CisgICAgZmkKKyAgZmkKKworICBGT1JDRT0wCisgIGlmIFsgIiQxIiA9ICItZm9yY2UiIF07IHRoZW4KKyAgICBzaGlmdAorICAgIEZPUkNFPTEKKyAgZmkKKworICBpZiBbICEgLXogIiRSRVNNR1JfUElEIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiJFJFU01HUl9QSUQiIF07IHRoZW4KKyAgICAgIGtpbGwgYGNhdCAkUkVTTUdSX1BJRGAgPi9kZXYvbnVsbCAyPiYxCisgICAgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgICAgZWNobyAiUElEIGZpbGUgKCRSRVNNR1JfUElEKSBmb3VuZCBidXQgbm8gbWF0Y2hpbmcgcHJvY2VzcyB3YXMgZm91bmQuIFN0b3AgYWJvcnRlZC4iCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJcJFJFU01HUl9QSUQgd2FzIHNldCAoJFJFU01HUl9QSUQpIGJ1dCB0aGUgc3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3QuIElzIFJlc291cmNlIE1hbmFnZXIgcnVubmluZz8gU3RvcCBhYm9ydGVkLiIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgaWYgWyAhIC16ICIkUkVTTUdSX1BJRCIgXTsgdGhlbgorICAgIGlmIFsgLWYgIiRSRVNNR1JfUElEIiBdOyB0aGVuCisgICAgICB3aGlsZSBbICRTTEVFUCAtZ2UgMCBdOyBkbworICAgICAgICBraWxsIC0wIGBjYXQgJFJFU01HUl9QSURgID4vZGV2L251bGwgMj4mMQorICAgICAgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgICAgICBybSAkUkVTTUdSX1BJRAorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgJFNMRUVQIC1ndCAwIF07IHRoZW4KKyAgICAgICAgICBzbGVlcCAxCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgJFNMRUVQIC1lcSAwIF07IHRoZW4KKyAgICAgICAgICBpZiBbICRGT1JDRSAtZXEgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXNvdXJjZSBNYW5hZ2VyIGRpZCBub3Qgc3RvcCBpbiB0aW1lLiBQSUQgZmlsZSB3YXMgbm90IHJlbW92ZWQuIgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIFNMRUVQPWBleHByICRTTEVFUCAtIDEgYAorICAgICAgZG9uZQorICAgIGZpCisgIGZpCisKKyAgaWYgWyAkRk9SQ0UgLWVxIDEgXTsgdGhlbgorICAgIGlmIFsgLXogIiRSRVNNR1JfUElEIiBdOyB0aGVuCisgICAgICBlY2hvICJLaWxsIGZhaWxlZDogXCRSRVNNR1JfUElEIG5vdCBzZXQiCisgICAgZWxzZQorICAgICAgaWYgWyAtZiAiJFJFU01HUl9QSUQiIF07IHRoZW4KKyAgICAgICAgZWNobyAiS2lsbGluZzogYGNhdCAkUkVTTUdSX1BJRGAiCisgICAgICAgIGtpbGwgLTkgYGNhdCAkUkVTTUdSX1BJRGAKKyAgICAgICAgcm0gJFJFU01HUl9QSUQKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworZWxzZQorICBlY2hvICJVc2FnZTogcmVzbWdyIHtzdGFydHxzdG9wfSIKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9yZXNtZ3ItY2xpZW50IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9yZXNtZ3ItY2xpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3ZGJkM2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3Jlc21nci1jbGllbnQKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisjICRJZCQKKworCitpZiBbIC16ICRKQVZBX0hPTUUgXSA7IHRoZW4KKwlKQVZBX0hPTUU9L3BhdGgvdG8vamF2YS9ob21lCitlbHNlCisJSkFWQV9IT01FPSR7SkFWQV9IT01FfQorZmkKKworZXhwb3J0IEpBVkFfSE9NRQorCiskSkFWQV9IT01FL2Jpbi9qYXZhIFwKKyAgICAgICAgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5wcm9wZXJ0aWVzPS4uL2V0Yy9yZXNvdXJjZS5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZz0uLi9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnPS4uL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLlhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCAkKgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg1YzhiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorIworCisjIFNwZWNpZnkgdGhlIGhhbmRsZXJzIHRvIGNyZWF0ZSBpbiB0aGUgcm9vdCBsb2dnZXIKKyMgKGFsbCBsb2dnZXJzIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBsb2dnZXIpCisjIFRoZSBmb2xsb3dpbmcgY3JlYXRlcyB0d28gaGFuZGxlcnMKK2hhbmRsZXJzID0gamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIsIGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSByb290IGxvZ2dlcgorLmxldmVsID0gQUxMCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEFMTAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWwgPSBBTEwKKyAgICAgICAgCisjIFNldCB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorCisjIGRlZmF1bHQgZmlsZSBvdXRwdXQgaXMgaW4gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIucGF0dGVybiA9IC4uL2xvZ3MvY2FzX3Jlc291cmNlJWcubG9nCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5saW1pdCA9IDUwMDAwCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5jb3VudCA9IDUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmFwcGVuZCA9IHRydWUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHN1YnN5c3RlbXMKKworIyBiYXRjaG1nciBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IubGV2ZWwgPSBJTkZPCisKKyMgbW9uaXRvciBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sZXZlbCA9IElORk8KKworIyBqb2JxdWV1ZSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUubGV2ZWwgPSBJTkZPCisKKyMgc2NoZWR1bGVyIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIubGV2ZWwgPSBJTkZPCisKKyMgc3lzdGVtIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0ubGV2ZWwgPSBGSU5FCisKKyMgY29udHJvbCB0aGUgdW5kZXJseWluZyBjb21tb25zLWh0dHBjbGllbnQgdHJhbnNwb3J0IGxheWVyIGZvciB4bWxycGMgCitvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5oZWFkZXIubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUubGV2ZWwgPSBJTkZPCisKKyMgc3ByaW5nIGZyYW1ld29yayBsb2dnaW5nCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5Qcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlci5sZXZlbCA9IFNFVkVSRQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9yZXNvdXJjZS5wcm9wZXJ0aWVzIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL2V0Yy9yZXNvdXJjZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjBjN2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL3Jlc291cmNlLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2MSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorIworIworIyBQcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgUmVzb3VyY2UgTWFuYWdlcgorCisjIHJlc291cmNlIGJhdGNobWdyIGZhY3RvcnkKK3Jlc291cmNlLmJhdGNobWdyLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLlhtbFJwY0JhdGNoTWdyRmFjdG9yeQorCisjIHJlc291cmNlIG1vbml0b3IgZmFjdG9yeQorcmVzb3VyY2UubW9uaXRvci5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLkFzc2lnbm1lbnRNb25pdG9yRmFjdG9yeQorCisjIHJlc291cmNlIHNjaGVkdWxlciBmYWN0b3J5CityZXNvdXJjZS5zY2hlZHVsZXIuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLkxSVVNjaGVkdWxlckZhY3RvcnkKKworIyByZXNvdXJjZSBqb2JxdWV1ZSBmYWN0b3J5CityZXNvdXJjZS5qb2JxdWV1ZS5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JTdGFja0pvYlF1ZXVlRmFjdG9yeQorCisjIHJlc291cmNlIGpvYiByZXBvc2l0b3J5IGZhY3RvcnkKK3Jlc291cmNlLmpvYnJlcG8uZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5NZW1vcnlKb2JSZXBvc2l0b3J5RmFjdG9yeQorCisjIG5vZGUgcmVwb3NpdG9yeSBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLnJlcG8uZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXJlcG8uWG1sTm9kZVJlcG9zaXRvcnlGYWN0b3J5CisKKyMgcXVldWUgcmVwb3NpdG9yeSBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcy5yZXBvLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwby5YbWxRdWV1ZVJlcG9zaXRvcnlGYWN0b3J5CisKKyMgSm9iU3RhY2sgSm9iUXVldWUgY29uZmlnIHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuam9ic3RhY2subWF4c3RhY2tzaXplPTEwMDAKKworIyBYTUwgTFJVU2NoZWR1bGVyIGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci53YWl0LnNlY29uZHM9MjAKKworIyBYTUwtUlBDIGNvbmZpZ3VyYXRpb24gcHJvcHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLnhtbHJwYy5yZXF1ZXN0VGltZW91dC5taW51dGVzPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcz02MAorCisjIFhTdHJlYW0gSm9iUmVwbyBjb25maWd1cmF0aW9uIHByb3BzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8ueHN0cmVhbS53b3JraW5nLmRpcj1bSE9NRV0vam9iLXJlcG8KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby54c3RyZWFtLm1heC5oaXN0b3J5PTQwMDAKKworIyBYTUwgTm9kZSBSZXBvc2l0b3J5IGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLmRpcnM9ZmlsZTovL1tSRVNNR1JfSE9NRV0vcG9saWN5CisKKyMgWE1MIFF1ZXVlIFJlcG9zaXRvcnkgY29uZmlnIHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXRvcXVldWVzLmRpcnM9ZmlsZTovL1tSRVNNR1JfSE9NRV0vcG9saWN5CisKKworCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkxOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbApAQCAtMCwwICsxLDkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworCTxiZWFuIGlkPSJhZGROb2RlIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkFkZE5vZGVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJBZGRzIGEgUmVzb3VyY2VOb2RlIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iYWRkTm9kZVRvUXVldWUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uQWRkTm9kZVRvUXVldWVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJBZGRzIGEgUmVzb3VyY2VOb2RlIHRvIGEgUXVldWUiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJhZGRRdWV1ZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5BZGRRdWV1ZUNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkFkZHMgYSBxdWV1ZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldEV4ZWNOb2RlIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkdldEV4ZWNOb2RlQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0IGV4ZWN1dGlvbiBub2RlIGZvciBhIGpvYiIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldEpvYkluZm8iCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0Sm9iSW5mb0NsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBqb2IiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJnZXROb2RlQnlJZCIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXROb2RlQnlJZENsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBub2RlIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iZ2V0Tm9kZUxvYWQiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0Tm9kZUxvYWRDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBjdXJyZW50IGpvYiBsb2FkIG9mIGEgbm9kZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldE5vZGVzIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkdldE5vZGVzQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBhIGxpc3Qgb2YgbWFuYWdlZCBub2RlcyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldE5vZGVzSW5RdWV1ZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXROb2Rlc0luUXVldWVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iCisJCQl2YWx1ZT0iR2V0cyBsaXN0IG9mIG5vZGVzIHdoaWNoIGJlbG9uZyB0byBnaXZlbiBxdWV1ZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldFF1ZXVlcyIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXRRdWV1ZXNDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGxpc3Qgb2YgcXVldWVzIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iZ2V0UXVldWVzV2l0aE5vZGUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0UXVldWVzV2l0aE5vZGVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGxpc3Qgb2YgcXVldWVzIHdoaWNoIGNvbnRhaW4gZ2l2ZW4gbm9kZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImtpbGwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uS2lsbENsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IktpbGxzIGEgam9iIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0icmVtb3ZlTm9kZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5SZW1vdmVOb2RlQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUmVtb3ZlcyBnaXZlbiBub2RlIGZyb20gbWFuYWdlZCBub2RlcyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9InJlbW92ZU5vZGVGcm9tUXVldWUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uUmVtb3ZlTm9kZUZyb21RdWV1ZUNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJlbW92ZXMgZ2l2ZW4gbm9kZSBmcm9tIGdpdmVuIHF1ZXVlIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0icmVtb3ZlUXVldWUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uUmVtb3ZlUXVldWVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSZW1vdmVzIGEgcXVldWUiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJzZXROb2RlQ2FwYWNpdHkiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uU2V0Tm9kZUNhcGFjaXR5Q2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hhbmdlcyBhIG5vZGVzIGNhcGFjaXR5IiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0ic3VibWl0Sm9iIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLlN1Ym1pdEpvYkNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlN1Ym1pdHMgYSBqb2IgZm9yIGV4ZWN1dGlvbiIgLz4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMWZkZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKQEAgLTAsMCArMSw2MDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisJPGJlYW4gaWQ9InVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ1IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUmVzb3VyY2UgTWFuYWdlciBVUkwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4KKwkJCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydHlOYW1lcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXJsPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im9wZXJhdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJvcCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvcGVyYXRpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJCXZhbHVlPSJEZWNsYXJlIHRoYXQgeW91IHdpc2ggdG8gcHJlc2VudCBhbiBvcGVyYXRpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdWJPcHRpb25zIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Tm9kZUJ5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Tm9kZXMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0UXVldWVzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImFkZE5vZGUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0icmVtb3ZlTm9kZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJzZXROb2RlQ2FwYWNpdHkiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0RXhlY05vZGUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iYWRkUXVldWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0icmVtb3ZlUXVldWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iYWRkTm9kZVRvUXVldWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Tm9kZXNJblF1ZXVlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImdldFF1ZXVlc1dpdGhOb2RlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9InJlbW92ZU5vZGVGcm9tUXVldWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Tm9kZUxvYWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0ic3VibWl0Sm9iIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImdldEpvYkluZm8iIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0ia2lsbCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXROb2RlQnlJZCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXROb2RlQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibmJ5aWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0Tm9kZUJ5SWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldE5vZGVCeUlkIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldE5vZGVCeUlkPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldE5vZGVCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldE5vZGVzIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldE5vZGVzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJub2RlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXROb2RlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Tm9kZXMgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0Tm9kZXM8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Tm9kZXMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0UXVldWVzIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldFF1ZXVlcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icXVldWVzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFF1ZXVlcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UXVldWVzIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldFF1ZXVlczwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRRdWV1ZXMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gQWRkTm9kZSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJhZGROb2RlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJhbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhZGROb2RlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBhZGROb2RlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmFkZE5vZGU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkTm9kZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImlwQWRkciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJhZGRyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImlwQWRkciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTm9kZSBJUCBBZGRyZXNzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEubmV0LlVSTCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iaXAtYWRkciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImFkZE5vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJhZGROb2RlIiBwOm1ldGhvZE5hbWU9InNldE5vZGVVcmwiIC8+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gUmVtb3ZlTm9kZSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJyZW1vdmVOb2RlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJybiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZW1vdmVOb2RlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZW1vdmVOb2RlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnJlbW92ZU5vZGU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0icmVtb3ZlTm9kZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBTZXROb2RlQ2FwYWNpdHkgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0ic2V0Tm9kZUNhcGFjaXR5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzbmNhcCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzZXROb2RlQ2FwYWNpdHkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHNldE5vZGVDYXBhY2l0eSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5zZXROb2RlQ2FwYWNpdHk8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ic2V0Tm9kZUNhcGFjaXR5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKyAgPCEtLSBTZXROb2RlQ2FwYWNpdHkgT3B0aW9ucyAtLT4KKyAgPGJlYW4gaWQ9ImdldEV4ZWNOb2RlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZXhlTm9kZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEV4ZWNOb2RlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldEV4ZWNOb2RlIEFjdGlvbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8dmFsdWU+Z2V0RXhlY05vZGU8L3ZhbHVlPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEV4ZWNOb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKwk8IS0tIEFkZFF1ZXVlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImFkZFF1ZXVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJhcSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhZGRRdWV1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgYWRkUXVldWUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+YWRkUXVldWU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gUmVtb3ZlUXVldWUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0icmVtb3ZlUXVldWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJxIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlbW92ZVF1ZXVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZW1vdmVRdWV1ZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5yZW1vdmVRdWV1ZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZW1vdmVRdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBBZGROb2RlVG9RdWV1ZSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJhZGROb2RlVG9RdWV1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iYW50cSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJhZGROb2RlVG9RdWV1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgYWRkTm9kZVRvUXVldWUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+YWRkTm9kZVRvUXVldWU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkTm9kZVRvUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0Tm9kZXNJblF1ZXVlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldE5vZGVzSW5RdWV1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibmlucSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXROb2Rlc0luUXVldWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldE5vZGVzSW5RdWV1ZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXROb2Rlc0luUXVldWU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Tm9kZXNJblF1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldFF1ZXVlc1dpdGhOb2RlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldFF1ZXVlc1dpdGhOb2RlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJxd24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UXVldWVzV2l0aE5vZGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFF1ZXVlc1dpdGhOb2RlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldFF1ZXVlc1dpdGhOb2RlPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFF1ZXVlc1dpdGhOb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIFJlbW92ZU5vZGVGcm9tUXVldWUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0icmVtb3ZlTm9kZUZyb21RdWV1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icm5mcSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZW1vdmVOb2RlRnJvbVF1ZXVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZW1vdmVOb2RlRnJvbVF1ZXVlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnJlbW92ZU5vZGVGcm9tUXVldWU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0icmVtb3ZlTm9kZUZyb21RdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXROb2RlTG9hZCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXROb2RlTG9hZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibG9hZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXROb2RlTG9hZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Tm9kZUxvYWQgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0Tm9kZUxvYWQ8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Tm9kZUxvYWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gU3VibWl0Sm9iIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9InN1Ym1pdEpvYiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic3VibWl0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InN1Ym1pdEpvYiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgc3VibWl0Sm9iIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnN1Ym1pdEpvYjwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJzdWJtaXRKb2IiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJkZWYiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkZWYiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkpvYiBEZWZpbml0aW9uIEZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InhtbC1maWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ic3VibWl0Sm9iIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorCQkJCQkJCXA6YWN0aW9uTmFtZT0ic3VibWl0Sm9iIiBwOm1ldGhvZE5hbWU9InNldEpvYkRlZmluaXRpb25GaWxlIiAvPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKyAgPGJlYW4gaWQ9Im5vZGVVcmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJudSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im5vZGVVcmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTm9kZSBVUkwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLm5ldC5VUkwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9InN1Ym1pdEpvYiIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3VibWl0Sm9iIiBwOm1ldGhvZE5hbWU9InNldFVybCIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKyAgPC9iZWFuPgorCisJPCEtLSBHZXRKb2JJbmZvIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldEpvYkluZm8iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImluZm8iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0Sm9iSW5mbyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Sm9iSW5mbyBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXRKb2JJbmZvPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldEpvYkluZm8iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gS2lsbCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJraWxsIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJrIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImtpbGwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGtpbGwgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+a2lsbDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJraWxsIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIE9wdGlvbnMgdXNlZCBmb3IgbXVsdGlwbGUgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0ibm9kZUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im5pZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJub2RlSWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik5vZGUgSUQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9Im5vZGUtaWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROb2RlQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImFkZE5vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZW1vdmVOb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ic2V0Tm9kZUNhcGFjaXR5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkTm9kZVRvUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRRdWV1ZXNXaXRoTm9kZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InJlbW92ZU5vZGVGcm9tUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROb2RlTG9hZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iY2FwYWNpdHkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY2FwIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImNhcGFjaXR5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJOb2RlIENhcGFjaXR5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iY2FwYWNpdHkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGROb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ic2V0Tm9kZUNhcGFjaXR5IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJxdWV1ZU5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icW4iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icXVldWVOYW1lIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJRdWV1ZSBuYW1lIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJxdWV1ZS1uYW1lIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZW1vdmVRdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImFkZE5vZGVUb1F1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Tm9kZXNJblF1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0icmVtb3ZlTm9kZUZyb21RdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKyAgPGJlYW4gaWQ9ImpvYklkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iamlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iam9iSWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iSm9iIElEIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iam9iLWlkIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgIDxsaXN0PgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRKb2JJbmZvIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0RXhlY05vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJraWxsIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9qb2JzL2V4Sm9iLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvam9icy9leEpvYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMGRlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvam9icy9leEpvYi54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmpvYiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBpZD0iYWJjZCIKKwluYW1lPSJUZXN0Sm9iIj4KKwk8aW5zdGFuY2VDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzLkhlbGxvV29ybGRKb2IiIC8+CisJPGlucHV0Q2xhc3MKKwkJbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLk5hbWVWYWx1ZUpvYklucHV0Ij4KKwkJPHByb3BlcnRpZXM+CisJCQk8cHJvcGVydHkgbmFtZT0idXNlci5uYW1lIiB2YWx1ZT0iSG9tZXIhIiAvPgorCQk8L3Byb3BlcnRpZXM+CisJPC9pbnB1dENsYXNzPgorCTxxdWV1ZT5xdWljazwvcXVldWU+CisJPGxvYWQ+MTwvbG9hZD4KKzwvY2FzOmpvYj4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvam9icy9leExvbmdKb2IueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9qb2JzL2V4TG9uZ0pvYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiZWIyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvam9icy9leExvbmdKb2IueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpqb2IgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIgaWQ9ImFiY2QiCisJbmFtZT0iVGVzdEpvYiI+CisJPGluc3RhbmNlQ2xhc3MKKwkJbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5leGFtcGxlcy5Mb25nSm9iIiAvPgorCTxpbnB1dENsYXNzCisJCW5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5OYW1lVmFsdWVKb2JJbnB1dCI+CisJCTxwcm9wZXJ0aWVzPgorCQkJPHByb3BlcnR5IG5hbWU9IndhaXQiIHZhbHVlPSI2MCIgLz4KKwkJPC9wcm9wZXJ0aWVzPgorCTwvaW5wdXRDbGFzcz4KKwk8cXVldWU+cXVpY2s8L3F1ZXVlPgorCTxsb2FkPjE8L2xvYWQ+Cis8L2Nhczpqb2I+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L25vZGUtdG8tcXVldWUtbWFwcGluZy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3Jlc21nci9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L25vZGUtdG8tcXVldWUtbWFwcGluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiMGViYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvbm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxjYXM6bm9kZS10by1xdWV1ZS1tYXBwaW5nIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxub2RlIGlkPSJsb2NhbGhvc3QiPgorCQk8cXVldWVzPgorCQkJPHF1ZXVlIG5hbWU9ImhpZ2giLz4KKwkJCTxxdWV1ZSBuYW1lPSJxdWljayIvPgorCQkJPHF1ZXVlIG5hbWU9ImxvbmciLz4KKwkJPC9xdWV1ZXM+CisJPC9ub2RlPgkKKzwvY2FzOm5vZGUtdG8tcXVldWUtbWFwcGluZz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvbm9kZXMueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9yZXNtZ3Ivc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9ub2Rlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkNDE1ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcmVzbWdyL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvbm9kZXMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGNhczpyZXNvdXJjZW5vZGVzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxub2RlIG5vZGVJZD0ibG9jYWxob3N0IiBpcD0iaHR0cDovL2xvY2FsaG9zdDoyMDAxIiBjYXBhY2l0eT0iOCIvPgorCTwhLS0gRW52UmVwbGFjZSBFeGFtcGxlIAorCTxub2RlIG5vZGVJZD0ic29tZWhvc3QiIGlwPSJodHRwOi8vc29tZWhvc3Q6W0JBVENIX1NUVUJfUE9SVF0iIGNhcGFjaXR5PSI4IiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisJLS0+Cis8L2NhczpyZXNvdXJjZW5vZGVzPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc5OGRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3BvbS54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPG5hbWU+U29sciBDYXRhbG9nIChBcGFjaGUgU29scik8L25hbWU+CisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LSR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+ZGlzdC1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNzgxZGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmJpbjwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgPGJhc2VEaXJlY3Rvcnk+c29scjwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT43NzU8L2ZpbGVNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c29scjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qLio8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgICAgPGZpbGVNb2RlPjY2MDwvZmlsZU1vZGU+CisgICAgICA8ZGlyZWN0b3J5TW9kZT43NzU8L2RpcmVjdG9yeU1vZGU+CisgICAgPC9maWxlU2V0PiAgICAKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvYmluPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNvbHIvYmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLio8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgICAgPGZpbGVNb2RlPjc3NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNvbHIvb29kdC1mbTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qKi4qPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxmaWxlTW9kZT42NjA8L2ZpbGVNb2RlPgorICAgICAgPGRpcmVjdG9yeU1vZGU+Nzc1PC9kaXJlY3RvcnlNb2RlPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvUkVBRE1FLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ3YzQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNjMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitFeGFtcGxlIFNvbHIgSG9tZSBEaXJlY3RvcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZGlyZWN0b3J5IGlzIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUgb2Ygd2hhdCBhICJTb2xyIEhvbWUiIGRpcmVjdG9yeQorc2hvdWxkIGxvb2sgbGlrZS4KKworSXQncyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IHRoYXQgeW91IGNvcHkgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGlzCitkaXJlY3Rvcnkgd2hlbiBzZXR0aW5nIHVwIGEgbmV3IGluc3RhbmNlIG9mIFNvbHIsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZC4KKworCitCYXNpYyBEaXJlY3RvcnkgU3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBTb2xyIEhvbWUgZGlyZWN0b3J5IHR5cGljYWxseSBjb250YWlucyB0aGUgZm9sbG93aW5nLi4uCisKKyogc29sci54bWwgKgorCitUaGlzIGlzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gZmlsZSBTb2xyIGxvb2tzIGZvciB3aGVuIHN0YXJ0aW5nLgorVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgbGlzdCBvZiAiU29sckNvcmVzIiBpdCBzaG91bGQgbG9hZCwgYW5kIGhpZ2ggCitsZXZlbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIFNvbHJDb3Jlcy4KKworUGxlYXNlIHNlZSB0aGUgY29tbWVudHMgaW4gLi9zb2xyLnhtbCBmb3IgbW9yZSBkZXRhaWxzLgorCitJZiBubyBzb2xyLnhtbCBmaWxlIGlzIGZvdW5kLCB0aGVuIFNvbHIgYXNzdW1lcyB0aGF0IHRoZXJlIHNob3VsZCBiZQorYSBzaW5nbGUgU29sckNvcmUgbmFtZWQgImNvbGxlY3Rpb24xIiBhbmQgdGhhdCB0aGUgIkluc3RhbmNlIERpcmVjdG9yeSIgCitmb3IgY29sbGVjdGlvbjEgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBTb2xyIEhvbWUgRGlyZWN0b3J5LgorCisqIEluZGl2aWR1YWwgU29sckNvcmUgSW5zdGFuY2UgRGlyZWN0b3JpZXMgKgorCitBbHRob3VnaCBzb2xyLnhtbCBjYW4gYmUgY29uZmlndXJlZCB0byBsb29rIGZvciBTb2xyQ29yZSBJbnN0YW5jZSBEaXJlY3RvcmllcyAKK2luIGFueSBwYXRoLCBzaW1wbGUgc3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBTb2xyIEhvbWUgRGlyIHVzaW5nIHJlbGF0aXZlIHBhdGhzIAorYXJlIGNvbW1vbiBmb3IgbWFueSBpbnN0YWxsYXRpb25zLiAgSW4gdGhpcyBkaXJlY3RvcnkgeW91IGNhbiBzZWUgdGhlIAorIi4vY29sbGVjdGlvbjEiIEluc3RhbmNlIERpcmVjdG9yeS4KKworKiBBIFNoYXJlZCAnbGliJyBEaXJlY3RvcnkgKgorCitBbHRob3VnaCBzb2xyLnhtbCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGFuIG9wdGlvbmFsICJzaGFyZWRMaWIiIGF0dHJpYnV0ZSAKK3RoYXQgY2FuIHBvaW50IHRvIGFueSBwYXRoLCBpdCBpcyBjb21tb24gdG8gdXNlIGEgIi4vbGliIiBzdWItZGlyZWN0b3J5IG9mIHRoZSAKK1NvbHIgSG9tZSBEaXJlY3RvcnkuCisKKyogWm9vS2VlcGVyIEZpbGVzICoKKworV2hlbiB1c2luZyBTb2xyQ2xvdWQgdXNpbmcgdGhlIGVtYmVkZGVkIFpvb0tlZXBlciBvcHRpb24gZm9yIFNvbHIsIGl0IGlzIAorY29tbW9uIHRvIGhhdmUgYSAiem9vLmNmZyIgZmlsZSBhbmQgInpvb19kYXRhIiBkaXJlY3RvcmllcyBpbiB0aGUgU29sciBIb21lIAorRGlyZWN0b3J5LiAgUGxlYXNlIHNlZSB0aGUgU29sckNsb3VkIHdpa2kgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLi4uCisKK2h0dHBzOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU29sckNsb3VkCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vUkVBRE1FLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2Q1NWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vUkVBRE1FLnR4dApAQCAtMCwwICsxLDUwIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworRXhhbXBsZSBTb2xyQ29yZSBJbnN0YW5jZSBEaXJlY3RvcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZGlyZWN0b3J5IGlzIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUgb2Ygd2hhdCBhbiAiSW5zdGFuY2UgRGlyZWN0b3J5Igorc2hvdWxkIGxvb2sgbGlrZSBmb3IgYSBTb2xyQ29yZQorCitJdCdzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdGhhdCB5b3UgY29weSBhbGwgb2YgdGhlIGZpbGVzIGluIHRoaXMKK2RpcmVjdG9yeSB3aGVuIHNldHRpbmcgdXAgYSBuZXcgU29sckNvcmVzLCBidXQgaXQgaXMgcmVjb21tZW5kZWQuCisKKworQmFzaWMgRGlyZWN0b3J5IFN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgU29sciBIb21lIGRpcmVjdG9yeSB0eXBpY2FsbHkgY29udGFpbnMgdGhlIGZvbGxvd2luZyBzdWItZGlyZWN0b3JpZXMuLi4KKworICAgY29uZi8KKyAgICAgICAgVGhpcyBkaXJlY3RvcnkgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IGNvbnRhaW4geW91ciBzb2xyY29uZmlnLnhtbAorICAgICAgICBhbmQgc2NoZW1hLnhtbC4gIEFueSBvdGhlciBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZpbGVzIHdvdWxkIGFsc28gCisgICAgICAgIGJlIGtlcHQgaGVyZS4KKworICAgZGF0YS8KKyAgICAgICAgVGhpcyBkaXJlY3RvcnkgaXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gd2hlcmUgU29sciB3aWxsIGtlZXAgeW91cgorICAgICAgICBpbmRleCwgYW5kIGlzIHVzZWQgYnkgdGhlIHJlcGxpY2F0aW9uIHNjcmlwdHMgZm9yIGRlYWxpbmcgd2l0aAorICAgICAgICBzbmFwc2hvdHMuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbG9jYXRpb24gaW4gdGhlIAorICAgICAgICBjb25mL3NvbHJjb25maWcueG1sLiAgU29sciB3aWxsIGNyZWF0ZSB0aGlzIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCAKKyAgICAgICAgYWxyZWFkeSBleGlzdC4KKworICAgbGliLworICAgICAgICBUaGlzIGRpcmVjdG9yeSBpcyBvcHRpb25hbC4gIElmIGl0IGV4aXN0cywgU29sciB3aWxsIGxvYWQgYW55IEphcnMKKyAgICAgICAgZm91bmQgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIHVzZSB0aGVtIHRvIHJlc29sdmUgYW55ICJwbHVnaW5zIgorICAgICAgICBzcGVjaWZpZWQgaW4geW91ciBzb2xyY29uZmlnLnhtbCBvciBzY2hlbWEueG1sIChpZTogQW5hbHl6ZXJzLAorICAgICAgICBSZXF1ZXN0IEhhbmRsZXJzLCBldGMuLi4pLiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSB0aGUgPGxpYj4KKyAgICAgICAgc3ludGF4IGluIGNvbmYvc29scmNvbmZpZy54bWwgdG8gZGlyZWN0IFNvbHIgdG8geW91ciBwbHVnaW5zLiAgU2VlIAorICAgICAgICB0aGUgZXhhbXBsZSBjb25mL3NvbHJjb25maWcueG1sIGZpbGUgZm9yIGRldGFpbHMuCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9hZG1pbi1leHRyYS5odG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvYWRtaW4tZXh0cmEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWNhYjIwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvYWRtaW4tZXh0cmEuaHRtbApAQCAtMCwwICsxLDI0IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhlIGNvbnRlbnQgb2YgdGhpcyBwYWdlIHdpbGwgYmUgc3RhdGljYWxseSBpbmNsdWRlZCBpbnRvIHRoZSB0b3AtCityaWdodCBib3ggb2YgdGhlIGNvcmVzIG92ZXJ2aWV3IHBhZ2UuIFVuY29tbWVudCB0aGlzIGFzIGFuIGV4YW1wbGUgdG8gCitzZWUgdGhlcmUgdGhlIGNvbnRlbnQgd2lsbCBzaG93IHVwLgorCis8aW1nIHNyYz0iaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nIj4gVGhpcyBsaW5lIHdpbGwgYXBwZWFyIGF0IHRoZSB0b3AtCityaWdodCBib3ggb24gY29sbGVjdGlvbjEncyBPdmVydmlldworLS0+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9hZG1pbi1leHRyYS5tZW51LWJvdHRvbS5odG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvYWRtaW4tZXh0cmEubWVudS1ib3R0b20uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU5YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvYWRtaW4tZXh0cmEubWVudS1ib3R0b20uaHRtbApAQCAtMCwwICsxLDI1IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gYWRtaW4tZXh0cmEubWVudS1ib3R0b20uaHRtbCAtLT4KKzwhLS0KKzxsaT4KKyAgPGEgaHJlZj0iIyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IHVybChpbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcpOyI+CisgICAgTEFTVCBJVEVNCisgIDwvYT4KKzwvbGk+CistLT4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2FkbWluLWV4dHJhLm1lbnUtdG9wLmh0bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9hZG1pbi1leHRyYS5tZW51LXRvcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9hZG1pbi1leHRyYS5tZW51LXRvcC5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBhZG1pbi1leHRyYS5tZW51LXRvcC5odG1sIC0tPgorPCEtLQorPGxpPgorICA8YSBocmVmPSIjIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogdXJsKGltZy9pY28vY29uc3RydWN0aW9uLnBuZyk7Ij4KKyAgICBGSVJTVCBJVEVNCisgIDwvYT4KKzwvbGk+CistLT4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2NsdXN0ZXJpbmcvY2Fycm90Mi9rbWVhbnMtYXR0cmlidXRlcy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9jbHVzdGVyaW5nL2NhcnJvdDIva21lYW5zLWF0dHJpYnV0ZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzdjMjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9jbHVzdGVyaW5nL2NhcnJvdDIva21lYW5zLWF0dHJpYnV0ZXMueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSAKKyAgRGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgYmlzZWN0aW5nIGstbWVhbnMgY2x1c3RlcmluZyBhbGdvcml0aG0uCisgIAorICBUaGlzIGZpbGUgY2FuIGJlIGxvYWRlZCAoYW5kIHNhdmVkKSBieSBDYXJyb3QyIFdvcmtiZW5jaC4KKyAgaHR0cDovL3Byb2plY3QuY2Fycm90Mi5vcmcvZG93bmxvYWQuaHRtbAorLS0+Cis8YXR0cmlidXRlLXNldHMgZGVmYXVsdD0iYXR0cmlidXRlcyI+CisgICAgPGF0dHJpYnV0ZS1zZXQgaWQ9ImF0dHJpYnV0ZXMiPgorICAgICAgPHZhbHVlLXNldD4KKyAgICAgICAgPGxhYmVsPmF0dHJpYnV0ZXM8L2xhYmVsPgorICAgICAgICAgIDxhdHRyaWJ1dGUga2V5PSJNdWx0aWxpbmd1YWxDbHVzdGVyaW5nLmRlZmF1bHRMYW5ndWFnZSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0ib3JnLmNhcnJvdDIuY29yZS5MYW5ndWFnZUNvZGUiIHZhbHVlPSJFTkdMSVNIIi8+CisgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICAgPGF0dHJpYnV0ZSBrZXk9Ik11bHRpbGluZ3VhbENsdXN0ZXJpbmcubGFuZ3VhZ2VBZ2dyZWdhdGlvblN0cmF0ZWd5Ij4KKyAgICAgICAgICAgIDx2YWx1ZSB0eXBlPSJvcmcuY2Fycm90Mi50ZXh0LmNsdXN0ZXJpbmcuTXVsdGlsaW5ndWFsQ2x1c3RlcmluZyRMYW5ndWFnZUFnZ3JlZ2F0aW9uU3RyYXRlZ3kiIHZhbHVlPSJGTEFUVEVOX01BSk9SX0xBTkdVQUdFIi8+CisgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L3ZhbHVlLXNldD4KKyAgPC9hdHRyaWJ1dGUtc2V0PgorPC9hdHRyaWJ1dGUtc2V0cz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2NsdXN0ZXJpbmcvY2Fycm90Mi9saW5nby1hdHRyaWJ1dGVzLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2NsdXN0ZXJpbmcvY2Fycm90Mi9saW5nby1hdHRyaWJ1dGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDgyMDFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvY2x1c3RlcmluZy9jYXJyb3QyL2xpbmdvLWF0dHJpYnV0ZXMueG1sCkBAIC0wLDAgKzEsMzggQEAKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSAKKyAgRGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgTGluZ28gY2x1c3RlcmluZyBhbGdvcml0aG0uCisKKyAgVGhpcyBmaWxlIGNhbiBiZSBsb2FkZWQgKGFuZCBzYXZlZCkgYnkgQ2Fycm90MiBXb3JrYmVuY2guCisgIGh0dHA6Ly9wcm9qZWN0LmNhcnJvdDIub3JnL2Rvd25sb2FkLmh0bWwKKy0tPgorPGF0dHJpYnV0ZS1zZXRzIGRlZmF1bHQ9ImF0dHJpYnV0ZXMiPgorICAgIDxhdHRyaWJ1dGUtc2V0IGlkPSJhdHRyaWJ1dGVzIj4KKyAgICAgIDx2YWx1ZS1zZXQ+CisgICAgICAgIDxsYWJlbD5hdHRyaWJ1dGVzPC9sYWJlbD4KKyAgICAgICAgICA8IS0tIAorICAgICAgICAgIFRoZSBsYW5ndWFnZSB0byBhc3N1bWUgZm9yIGNsdXN0ZXJlZCBkb2N1bWVudHMuCisgICAgICAgICAgRm9yIGEgbGlzdCBvZiBhbGxvd2VkIHZhbHVlcywgc2VlOiAKKyAgICAgICAgICBodHRwOi8vZG93bmxvYWQuY2Fycm90Mi5vcmcvc3RhYmxlL21hbnVhbC8jc2VjdGlvbi5hdHRyaWJ1dGUubGluZ28uTXVsdGlsaW5ndWFsQ2x1c3RlcmluZy5kZWZhdWx0TGFuZ3VhZ2UKKyAgICAgICAgICAtLT4KKyAgICAgICAgICA8YXR0cmlidXRlIGtleT0iTXVsdGlsaW5ndWFsQ2x1c3RlcmluZy5kZWZhdWx0TGFuZ3VhZ2UiPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9Im9yZy5jYXJyb3QyLmNvcmUuTGFuZ3VhZ2VDb2RlIiB2YWx1ZT0iRU5HTElTSCIvPgorICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgIDxhdHRyaWJ1dGUga2V5PSJMaW5nb0NsdXN0ZXJpbmdBbGdvcml0aG0uZGVzaXJlZENsdXN0ZXJDb3VudEJhc2UiPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMjAiLz4KKyAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvdmFsdWUtc2V0PgorICA8L2F0dHJpYnV0ZS1zZXQ+Cis8L2F0dHJpYnV0ZS1zZXRzPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvY2x1c3RlcmluZy9jYXJyb3QyL3N0Yy1hdHRyaWJ1dGVzLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2NsdXN0ZXJpbmcvY2Fycm90Mi9zdGMtYXR0cmlidXRlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYWE4MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2NsdXN0ZXJpbmcvY2Fycm90Mi9zdGMtYXR0cmlidXRlcy54bWwKQEAgLTAsMCArMSwzMyBAQAorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIAorICBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBTVEMgY2x1c3RlcmluZyBhbGdvcml0aG0uCisKKyAgVGhpcyBmaWxlIGNhbiBiZSBsb2FkZWQgKGFuZCBzYXZlZCkgYnkgQ2Fycm90MiBXb3JrYmVuY2guCisgIGh0dHA6Ly9wcm9qZWN0LmNhcnJvdDIub3JnL2Rvd25sb2FkLmh0bWwKKy0tPgorPGF0dHJpYnV0ZS1zZXRzIGRlZmF1bHQ9ImF0dHJpYnV0ZXMiPgorICAgIDxhdHRyaWJ1dGUtc2V0IGlkPSJhdHRyaWJ1dGVzIj4KKyAgICAgIDx2YWx1ZS1zZXQ+CisgICAgICAgIDxsYWJlbD5hdHRyaWJ1dGVzPC9sYWJlbD4KKyAgICAgICAgICA8YXR0cmlidXRlIGtleT0iTXVsdGlsaW5ndWFsQ2x1c3RlcmluZy5kZWZhdWx0TGFuZ3VhZ2UiPgorICAgICAgICAgICAgPHZhbHVlIHR5cGU9Im9yZy5jYXJyb3QyLmNvcmUuTGFuZ3VhZ2VDb2RlIiB2YWx1ZT0iRU5HTElTSCIvPgorICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgIDxhdHRyaWJ1dGUga2V5PSJNdWx0aWxpbmd1YWxDbHVzdGVyaW5nLmxhbmd1YWdlQWdncmVnYXRpb25TdHJhdGVneSI+CisgICAgICAgICAgICA8dmFsdWUgdHlwZT0ib3JnLmNhcnJvdDIudGV4dC5jbHVzdGVyaW5nLk11bHRpbGluZ3VhbENsdXN0ZXJpbmckTGFuZ3VhZ2VBZ2dyZWdhdGlvblN0cmF0ZWd5IiB2YWx1ZT0iRkxBVFRFTl9NQUpPUl9MQU5HVUFHRSIvPgorICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC92YWx1ZS1zZXQ+CisgIDwvYXR0cmlidXRlLXNldD4KKzwvYXR0cmlidXRlLXNldHM+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9jdXJyZW5jeS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9jdXJyZW5jeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5YzU4YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2N1cnJlbmN5LnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gRXhhbXBsZSBleGNoYW5nZSByYXRlcyBmaWxlIGZvciBDdXJyZW5jeUZpZWxkIHR5cGUgbmFtZWQgImN1cnJlbmN5IiBpbiBleGFtcGxlIHNjaGVtYSAtLT4KKworPGN1cnJlbmN5Q29uZmlnIHZlcnNpb249IjEuMCI+CisgIDxyYXRlcz4KKyAgICA8IS0tIFVwZGF0ZWQgZnJvbSBodHRwOi8vd3d3LmV4Y2hhbmdlcmF0ZS5jb20vIGF0IDIwMTEtMDktMjcgLS0+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iQVJTIiByYXRlPSI0LjMzMzg3MSIgY29tbWVudD0iQVJHRU5USU5BIFBlc28iIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iQVVEIiByYXRlPSIxLjAyNTc2OCIgY29tbWVudD0iQVVTVFJBTElBIERvbGxhciIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJFVVIiIHJhdGU9IjAuNzQzNjc2IiBjb21tZW50PSJFdXJvcGVhbiBFdXJvIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkJSTCIgcmF0ZT0iMS44ODEwOTMiIGNvbW1lbnQ9IkJSQVpJTCBSZWFsIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkNBRCIgcmF0ZT0iMS4wMzA4MTUiIGNvbW1lbnQ9IkNBTkFEQSBEb2xsYXIiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iQ0xQIiByYXRlPSI1MTkuMDk5NiIgY29tbWVudD0iQ0hJTEUgUGVzbyIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJDTlkiIHJhdGU9IjYuMzg3MzEwIiBjb21tZW50PSJDSElOQSBZdWFuIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkNaSyIgcmF0ZT0iMTguNDcxMzQiIGNvbW1lbnQ9IkNaRUNIIFJFUC4gS29ydW5hIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkRLSyIgcmF0ZT0iNS41MTU0MzYiIGNvbW1lbnQ9IkRFTk1BUksgS3JvbmUiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iSEtEIiByYXRlPSI3LjgwMTkyMiIgY29tbWVudD0iSE9ORyBLT05HIERvbGxhciIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJIVUYiIHJhdGU9IjIxNS42MTY5IiBjb21tZW50PSJIVU5HQVJZIEZvcmludCIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJJU0siIHJhdGU9IjExOC4xMjgwIiBjb21tZW50PSJJQ0VMQU5EIEtyb25hIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IklOUiIgcmF0ZT0iNDkuNDkwODgiIGNvbW1lbnQ9IklORElBIFJ1cGVlIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlhEUiIgcmF0ZT0iMC42NDEzNTgiIGNvbW1lbnQ9IklOVE5MIE1PTi4gRlVORCBTRFIiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iSUxTIiByYXRlPSIzLjcwOTczOSIgY29tbWVudD0iSVNSQUVMIFNoZXFlbCIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJKUFkiIHJhdGU9Ijc2LjMyNDE5IiBjb21tZW50PSJKQVBBTiBZZW4iIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iS1JXIiByYXRlPSIxMTY5LjE3MyIgY29tbWVudD0iS09SRUEgKFNPVVRIKSBXb24iIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iS1dEIiByYXRlPSIwLjI3NTE0MiIgY29tbWVudD0iS1VXQUlUIERpbmFyIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89Ik1YTiIgcmF0ZT0iMTMuODU4OTUiIGNvbW1lbnQ9Ik1FWElDTyBQZXNvIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89Ik5aRCIgcmF0ZT0iMS4yODUxNTkiIGNvbW1lbnQ9Ik5FVyBaRUFMQU5EIERvbGxhciIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJOT0siIHJhdGU9IjUuODU5MDM1IiBjb21tZW50PSJOT1JXQVkgS3JvbmUiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iUEtSIiByYXRlPSI4Ny41NzAwNyIgY29tbWVudD0iUEFLSVNUQU4gUnVwZWUiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iUEVOIiByYXRlPSIyLjczMDY4MyIgY29tbWVudD0iUEVSVSBTb2wiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iUEhQIiByYXRlPSI0My42MjAzOSIgY29tbWVudD0iUEhJTElQUElORVMgUGVzbyIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJQTE4iIHJhdGU9IjMuMzEwMTM5IiBjb21tZW50PSJQT0xBTkQgWmxvdHkiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iUk9OIiByYXRlPSIzLjEwMDkzMiIgY29tbWVudD0iUk9NQU5JQSBMZXUiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iUlVCIiByYXRlPSIzMi4xNDY2MyIgY29tbWVudD0iUlVTU0lBIFJ1YmxlIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlNBUiIgcmF0ZT0iMy43NTA0NjUiIGNvbW1lbnQ9IlNBVURJIEFSQUJJQSBSaXlhbCIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJTR0QiIHJhdGU9IjEuMjk5MzUyIiBjb21tZW50PSJTSU5HQVBPUkUgRG9sbGFyIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlpBUiIgcmF0ZT0iOC4zMjk3NjEiIGNvbW1lbnQ9IlNPVVRIIEFGUklDQSBSYW5kIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlNFSyIgcmF0ZT0iNi44ODM0NDIiIGNvbW1lbnQ9IlNXRURFTiBLcm9uYSIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJDSEYiIHJhdGU9IjAuOTA2MDM1IiBjb21tZW50PSJTV0lUWkVSTEFORCBGcmFuYyIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJUV0QiIHJhdGU9IjMwLjQwMjgzIiBjb21tZW50PSJUQUlXQU4gRG9sbGFyIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlRIQiIgcmF0ZT0iMzAuODk0ODciIGNvbW1lbnQ9IlRIQUlMQU5EIEJhaHQiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iQUVEIiByYXRlPSIzLjY3Mjk1NSIgY29tbWVudD0iVS5BLkUuIERpcmhhbSIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJVQUgiIHJhdGU9IjcuOTg4NTgyIiBjb21tZW50PSJVS1JBSU5FIEhyeXZuaWEiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iR0JQIiByYXRlPSIwLjY0NzkxMCIgY29tbWVudD0iVU5JVEVEIEtJTkdET00gUG91bmQiIC8+CisgICAgCisgICAgPCEtLSBDcm9zcy1yYXRlcyBmb3Igc29tZSBjb21tb24gY3VycmVuY2llcyAtLT4KKyAgICA8cmF0ZSBmcm9tPSJFVVIiIHRvPSJHQlAiIHJhdGU9IjAuODY5OTE0IiAvPiAgCisgICAgPHJhdGUgZnJvbT0iRVVSIiB0bz0iTk9LIiByYXRlPSI3LjgwMDA5NSIgLz4gIAorICAgIDxyYXRlIGZyb209IkdCUCIgdG89Ik5PSyIgcmF0ZT0iOC45NjY1MDgiIC8+ICAKKyAgPC9yYXRlcz4KKzwvY3VycmVuY3lDb25maWc+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9lbGV2YXRlLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2VsZXZhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDVjZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9lbGV2YXRlLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBJZiB0aGlzIGZpbGUgaXMgZm91bmQgaW4gdGhlIGNvbmZpZyBkaXJlY3RvcnksIGl0IHdpbGwgb25seSBiZQorICAgICBsb2FkZWQgb25jZSBhdCBzdGFydHVwLiAgSWYgaXQgaXMgZm91bmQgaW4gU29scidzIGRhdGEKKyAgICAgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJlLWxvYWRlZCBldmVyeSBjb21taXQuCisKKyAgIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvUXVlcnlFbGV2YXRpb25Db21wb25lbnQgZm9yIG1vcmUgaW5mbworCistLT4KKzxlbGV2YXRlPgorIDxxdWVyeSB0ZXh0PSJmb28gYmFyIj4KKyAgPGRvYyBpZD0iMSIgLz4KKyAgPGRvYyBpZD0iMiIgLz4KKyAgPGRvYyBpZD0iMyIgLz4KKyA8L3F1ZXJ5PgorIAorIDxxdWVyeSB0ZXh0PSJpcG9kIj4KKyAgIDxkb2MgaWQ9Ik1BMTQ3TEwvQSIgLz4gIDwhLS0gcHV0IHRoZSBhY3R1YWwgaXBvZCBhdCB0aGUgdG9wIC0tPgorICAgPGRvYyBpZD0iSVctMDIiIGV4Y2x1ZGU9InRydWUiIC8+IDwhLS0gZXhjbHVkZSB0aGlzIGNhYmxlIC0tPgorIDwvcXVlcnk+CisgCis8L2VsZXZhdGU+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2NvbnRyYWN0aW9uc19jYS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2NvbnRyYWN0aW9uc19jYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3YTg1ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvY29udHJhY3Rpb25zX2NhLnR4dApAQCAtMCwwICsxLDggQEAKKyMgU2V0IG9mIENhdGFsYW4gY29udHJhY3Rpb25zIGZvciBFbGlzaW9uRmlsdGVyCisjIFRPRE86IGxvYWQgdGhpcyBhcyBhIHJlc291cmNlIGZyb20gdGhlIGFuYWx5emVyIGFuZCBzeW5jIGl0IGluIGJ1aWxkLnhtbAorZAorbAorbQorbgorcwordApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZnIudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZnIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYmJhNTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2NvbnRyYWN0aW9uc19mci50eHQKQEAgLTAsMCArMSwxNSBAQAorIyBTZXQgb2YgRnJlbmNoIGNvbnRyYWN0aW9ucyBmb3IgRWxpc2lvbkZpbHRlcgorIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwKK2wKK20KK3QKK3F1CituCitzCitqCitkCitjCitqdXNxdQorcXVvaXF1Citsb3JzcXUKK3B1aXNxdQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZ2EudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZ2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmU3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2NvbnRyYWN0aW9uc19nYS50eHQKQEAgLTAsMCArMSw1IEBACisjIFNldCBvZiBJcmlzaCBjb250cmFjdGlvbnMgZm9yIEVsaXNpb25GaWx0ZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitkCittCitiCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2NvbnRyYWN0aW9uc19pdC50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2NvbnRyYWN0aW9uc19pdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjMDQwOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvY29udHJhY3Rpb25zX2l0LnR4dApAQCAtMCwwICsxLDIzIEBACisjIFNldCBvZiBJdGFsaWFuIGNvbnRyYWN0aW9ucyBmb3IgRWxpc2lvbkZpbHRlcgorIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwKK2MKK2wgCithbGwgCitkYWxsIAorZGVsbCAKK25lbGwgCitzdWxsIAorY29sbCAKK3BlbGwgCitnbCAKK2FnbCAKK2RhZ2wgCitkZWdsIAorbmVnbCAKK3N1Z2wgCit1biAKK20gCit0IAorcyAKK3YgCitkCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2h5cGhlbmF0aW9uc19nYS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL2h5cGhlbmF0aW9uc19nYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyNjQyYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvaHlwaGVuYXRpb25zX2dhLnR4dApAQCAtMCwwICsxLDUgQEAKKyMgU2V0IG9mIElyaXNoIGh5cGhlbmF0aW9ucyBmb3IgU3RvcEZpbHRlcgorIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwKK2gKK24KK3QKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RlbWRpY3RfbmwudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdGVtZGljdF9ubC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxMDcyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RlbWRpY3RfbmwudHh0CkBAIC0wLDAgKzEsNiBAQAorIyBTZXQgb2Ygb3ZlcnJpZGVzIGZvciB0aGUgZHV0Y2ggc3RlbW1lcgorIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwKK2ZpZXRzCWZpZXRzCiticm9tZmlldHMJYnJvbWZpZXRzCitlaQllaWVyCitraW5kCWtpbmRlcgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wdGFnc19qYS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B0YWdzX2phLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI3NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wdGFnc19qYS50eHQKQEAgLTAsMCArMSw0MjAgQEAKKyMKKyMgVGhpcyBmaWxlIGRlZmluZXMgYSBKYXBhbmVzZSBzdG9wdGFnIHNldCBmb3IgSmFwYW5lc2VQYXJ0T2ZTcGVlY2hTdG9wRmlsdGVyLgorIworIyBBbnkgdG9rZW4gd2l0aCBhIHBhcnQtb2Ytc3BlZWNoIHRhZyB0aGF0IGV4YWN0bHkgbWF0Y2hlcyB0aG9zZSBkZWZpbmVkIGluIHRoaXMKKyMgZmlsZSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0b2tlbiBzdHJlYW0uCisjCisjIFNldCB5b3VyIG93biBzdG9wdGFncyBieSB1bmNvbW1lbnRpbmcgdGhlIGxpbmVzIGJlbG93LiAgTm90ZSB0aGF0IGNvbW1lbnRzIGFyZQorIyBub3QgYWxsb3dlZCBvbiB0aGUgc2FtZSBsaW5lIGFzIGEgc3RvcHRhZy4gIFNlZSBMVUNFTkUtMzc0NSBmb3IgZnJlcXVlbmN5IGxpc3RzLAorIyBldGMuIHRoYXQgY2FuIGJlIHVzZWZ1bCBmb3IgYnVpbGRpbmcgeW91IG93biBzdG9wdGFnIHNldC4KKyMKKyMgVGhlIGVudGlyZSBwb3NzaWJsZSB0YWdzZXQgaXMgcHJvdmlkZWQgYmVsb3cgZm9yIGNvbnZlbmllbmNlLgorIworIyMjIyMKKyMgIG5vdW46IHVuY2xhc3NpZmllZCBub3VucworI+WQjeipngorIworIyAgbm91bi1jb21tb246IENvbW1vbiBub3VucyBvciBub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZAorI+WQjeipni3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvcGVyOiBQcm9wZXIgbm91bnMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQgCisj5ZCN6KmeLeWbuuacieWQjeipngorIworIyAgbm91bi1wcm9wZXItbWlzYzogbWlzY2VsbGFuZW91cyBwcm9wZXIgbm91bnMKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS4gOiIrAorIworIyAgbm91bi1wcm9wZXItcGVyc29uOiBQZXJzb25hbCBuYW1lcyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZAorI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNCisjCisjICBub3VuLXByb3Blci1wZXJzb24tbWlzYzogbmFtZXMgdGhhdCBjYW5ub3QgYmUgZGl2aWRlZCBpbnRvIHN1cm5hbWUgYW5kIAorIyAgZ2l2ZW4gbmFtZTsgZm9yZWlnbiBuYW1lczsgbmFtZXMgd2hlcmUgdGhlIHN1cm5hbWUgb3IgZ2l2ZW4gbmFtZSBpcyB1bmtub3duLgorIyAgZS5nLiDjgYrluILjga7mlrkKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS6uuWQjS3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvcGVyLXBlcnNvbi1zdXJuYW1lOiBNYWlubHkgSmFwYW5lc2Ugc3VybmFtZXMuCisjICBlLmcuIOWxseeUsAorI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNLeWnkworIworIyAgbm91bi1wcm9wZXItcGVyc29uLWdpdmVuX25hbWU6IE1haW5seSBKYXBhbmVzZSBnaXZlbiBuYW1lcy4KKyMgIGUuZy4g5aSq6YOOCisj5ZCN6KmeLeWbuuacieWQjeipni3kurrlkI0t5ZCNCisjCisjICBub3VuLXByb3Blci1vcmdhbml6YXRpb246IE5hbWVzIHJlcHJlc2VudGluZyBvcmdhbml6YXRpb25zLgorIyAgZS5nLiDpgJrnlKPnnIEsIE5ISworI+WQjeipni3lm7rmnInlkI3oqZ4t57WE57mUCisjCisjICBub3VuLXByb3Blci1wbGFjZTogUGxhY2UgbmFtZXMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeWcsOWfnworIworIyAgbm91bi1wcm9wZXItcGxhY2UtbWlzYzogUGxhY2UgbmFtZXMgZXhjbHVkaW5nIGNvdW50cmllcy4KKyMgIGUuZy4g44Ki44K444KiLCDjg5Djg6vjgrvjg63jg4osIOS6rOmDvQorI+WQjeipni3lm7rmnInlkI3oqZ4t5Zyw5Z+fLeS4gOiIrAorIworIyAgbm91bi1wcm9wZXItcGxhY2UtY291bnRyeTogQ291bnRyeSBuYW1lcy4gCisjICBlLmcuIOaXpeacrCwg44Kq44O844K544OI44Op44Oq44KiCisj5ZCN6KmeLeWbuuacieWQjeipni3lnLDln58t5Zu9CisjCisjICBub3VuLXByb25vdW46IFByb25vdW5zIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkCisj5ZCN6KmeLeS7o+WQjeipngorIworIyAgbm91bi1wcm9ub3VuLW1pc2M6IG1pc2NlbGxhbmVvdXMgcHJvbm91bnM6IAorIyAgZS5nLiDjgZ3jgowsIOOBk+OBkywg44GC44GE44GkLCDjgYLjgarjgZ8sIOOBguOBoeOBk+OBoSwg44GE44GP44GkLCDjganjgZPjgYssIOOBquOBqywg44G/44Gq44GV44KTLCDjgb/jgpPjgaosIOOCj+OBn+OBj+OBlywg44KP44KM44KP44KMCisj5ZCN6KmeLeS7o+WQjeipni3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvbm91bi1jb250cmFjdGlvbjogU3Bva2VuIGxhbmd1YWdlIGNvbnRyYWN0aW9uIG1hZGUgYnkgY29tYmluaW5nIGEgCisjICBwcm9ub3VuIGFuZCB0aGUgcGFydGljbGUgJ3dhJy4KKyMgIGUuZy4g44GC44KK44KDLCDjgZPjgorjgoMsIOOBk+OCiuOCg+OBgiwg44Gd44KK44KDLCDjgZ3jgorjgoPjgYIgCisj5ZCN6KmeLeS7o+WQjeipni3nuK7ntIQKKyMKKyMgIG5vdW4tYWR2ZXJiaWFsOiBUZW1wb3JhbCBub3VucyBzdWNoIGFzIG5hbWVzIG9mIGRheXMgb3IgbW9udGhzIHRoYXQgYmVoYXZlIAorIyAgbGlrZSBhZHZlcmJzLiBOb3VucyB0aGF0IHJlcHJlc2VudCBhbW91bnQgb3IgcmF0aW9zIGFuZCBjYW4gYmUgdXNlZCBhZHZlcmJpYWxseSwKKyMgIGUuZy4g6YeR5pucLCDkuIDmnIgsIOWNiOW+jCwg5bCR6YePCisj5ZCN6KmeLeWJr+ipnuWPr+iDvQorIworIyAgbm91bi12ZXJiYWw6IE5vdW5zIHRoYXQgdGFrZSBhcmd1bWVudHMgd2l0aCBjYXNlIGFuZCBjYW4gYXBwZWFyIGZvbGxvd2VkIGJ5IAorIyAgJ3N1cnUnIGFuZCByZWxhdGVkIHZlcmJzICjjgZnjgossIOOBp+OBjeOCiywg44Gq44GV44KLLCDjgY/jgaDjgZXjgospCisjICBlLmcuIOOCpOODs+ODl+ODg+ODiCwg5oSb552ALCDmgqrljJYsIOaCquaIpuiLpumXmCwg5LiA5a6J5b+DLCDkuIvlj5bjgooKKyPlkI3oqZ4t44K15aSJ5o6l57aaCisjCisjICBub3VuLWFkamVjdGl2ZS1iYXNlOiBUaGUgYmFzZSBmb3JtIG9mIGFkamVjdGl2ZXMsIHdvcmRzIHRoYXQgYXBwZWFyIGJlZm9yZSDjgaogKCJuYSIpCisjICBlLmcuIOWBpeW6tywg5a6J5piTLCDpp4Tnm64sIOOBoOOCgQorI+WQjeipni3lvaLlrrnli5XoqZ7oqp7lubkKKyMKKyMgIG5vdW4tbnVtZXJpYzogQXJhYmljIG51bWJlcnMsIENoaW5lc2UgbnVtZXJhbHMsIGFuZCBjb3VudGVycyBsaWtlIOS9lSAo5ZueKSwg5pWwLgorIyAgZS5nLiAwLCAxLCAyLCDkvZUsIOaVsCwg5bm+Cisj5ZCN6KmeLeaVsAorIworIyAgbm91bi1hZmZpeDogbm91biBhZmZpeGVzIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkCisj5ZCN6KmeLemdnuiHqueriworIworIyAgbm91bi1hZmZpeC1taXNjOiBPZiBhZG5vbWluYWxpemVycywgdGhlIGNhc2UtbWFya2VyIOOBriAoIm5vIiksIGFuZCB3b3JkcyB0aGF0IAorIyAgYXR0YWNoIHRvIHRoZSBiYXNlIGZvcm0gb2YgaW5mbGVjdGlvbmFsIHdvcmRzLCB3b3JkcyB0aGF0IGNhbm5vdCBiZSBjbGFzc2lmaWVkIAorIyAgaW50byBhbnkgb2YgdGhlIG90aGVyIGNhdGVnb3JpZXMgYmVsb3cuIFRoaXMgY2F0ZWdvcnkgaW5jbHVkZXMgaW5kZWZpbml0ZSBub3Vucy4KKyMgIGUuZy4g44GC44GL44Gk44GNLCDmmoEsIOOBi+OBhCwg55Sy5paQLCDmsJcsIOOBjeOCieOBhCwg5auM44GELCDjgY/jgZssIOeZliwg44GT44GoLCDkuossIOOBlOOBqCwg5q+OLCDjgZfjgaDjgYQsIOasoeesrCwgCisjICAgICAgIOmghiwg44Gb44GELCDmiYDngrosIOOBpOOBhOOBpywg5bqP44GnLCDjgaTjgoLjgoosIOepjeOCguOCiiwg54K5LCDjganjgZPjgo0sIOOBriwg44Gv44GaLCDnrYgsIOOBr+OBmuOBvywg5by+44G/LCAKKyMgICAgICAg5ouN5a2QLCDjgbXjgYYsIOOBteOCiiwg5oyv44KKLCDjgbvjgYYsIOaWuSwg5peoLCDjgoLjga4sIOeJqSwg6ICFLCDjgobjgYgsIOaVhSwg44KG44GI44KTLCDmiYDku6UsIOOCj+OBkSwg6KizLAorIyAgICAgICDjgo/jgoosIOWJsuOCiiwg5YmyLCDjgpMt5Y+j6KqeLywg44KC44KTLeWPo+iqni8KKyPlkI3oqZ4t6Z2e6Ieq56uLLeS4gOiIrAorIworIyAgbm91bi1hZmZpeC1hZHZlcmJpYWw6IG5vdW4gYWZmaXhlcyB0aGF0IHRoYXQgY2FuIGJlaGF2ZSBhcyBhZHZlcmJzLgorIyAgZS5nLiDjgYLjgYTjgaAsIOmWkywg44GC44GS44GPLCDmjJnjgZLlj6UsIOOBguOBqCwg5b6MLCDkvZnjgoosIOS7peWkliwg5Lul6ZmNLCDku6XlvowsIOS7peS4iiwg5Lul5YmNLCDkuIDmlrksIOOBhuOBiCwgCisjICAgICAgIOS4iiwg44GG44GhLCDlhoUsIOOBiuOCiiwg5oqY44KKLCDjgYvjgY7jgoosIOmZkOOCiiwg44GN44KKLCDjgaPjgY3jgoosIOe1kOaenCwg44GT44KNLCDpoIMsIOOBleOBhCwg6ZqbLCDmnIDkuK0sIOOBleOBquOBiywgCisjICAgICAgIOacgOS4rSwg44GY44Gf44GELCDoh6rkvZMsIOOBn+OBsywg5bqmLCDjgZ/jgoEsIOeCuiwg44Gk44GpLCDpg73luqYsIOOBqOOBiuOCiiwg6YCa44KKLCDjgajjgY0sIOaZgiwg44Go44GT44KNLCDmiYAsIAorIyAgICAgICDjgajjgZ/jgpMsIOmAlOerrywg44Gq44GLLCDkuK0sIOOBruOBoSwg5b6MLCDjgbDjgYLjgYQsIOWgtOWQiCwg5pelLCDjgbbjgpMsIOWIhiwg44G744GLLCDku5YsIOOBvuOBiCwg5YmNLCDjgb7jgb4sIAorIyAgICAgICDlhJgsIOS+rSwg44G/44GO44KKLCDnn6LlhYgKKyPlkI3oqZ4t6Z2e6Ieq56uLLeWJr+ipnuWPr+iDvQorIworIyAgbm91bi1hZmZpeC1hdXg6IG5vdW4gYWZmaXhlcyB0cmVhdGVkIGFzIOWKqeWLleipniAoImF1eGlsaWFyeSB2ZXJiIikgaW4gc2Nob29sIGdyYW1tYXJzIAorIyAgd2l0aCB0aGUgc3RlbSDjgojjgYYo44GgKSAoInlvdShkYSkiKS4KKyMgIGUuZy4gIOOCiOOBhiwg44KE44GGLCDmp5ggKOOCiOOBhikKKyPlkI3oqZ4t6Z2e6Ieq56uLLeWKqeWLleipnuiqnuW5uQorIyAgCisjICBub3VuLWFmZml4LWFkamVjdGl2ZS1iYXNlOiBub3VuIGFmZml4ZXMgdGhhdCBjYW4gY29ubmVjdCB0byB0aGUgaW5kZWNsaW5hYmxlCisjICBjb25uZWN0aW9uIGZvcm0g44GqIChhdXggImRhIikuCisjICBlLmcuIOOBv+OBn+OBhCwg44G144GGCisj5ZCN6KmeLemdnuiHqueriy3lvaLlrrnli5XoqZ7oqp7lubkKKyMKKyMgIG5vdW4tc3BlY2lhbDogc3BlY2lhbCBub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4KKyPlkI3oqZ4t54m55q6KCisjCisjICBub3VuLXNwZWNpYWwtYXV4OiBUaGUg44Gd44GG44GgICgic291ZGEiKSBzdGVtIGZvcm0gdGhhdCBpcyB1c2VkIGZvciByZXBvcnRpbmcgbmV3cywgaXMgCisjICB0cmVhdGVkIGFzIOWKqeWLleipniAoImF1eGlsaWFyeSB2ZXJiIikgaW4gc2Nob29sIGdyYW1tYXJzLCBhbmQgYXR0YWNoIHRvIHRoZSBiYXNlIAorIyAgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMuCisjICBlLmcuIOOBneOBhgorI+WQjeipni3nibnmroot5Yqp5YuV6Kme6Kqe5bm5CisjCisjICBub3VuLXN1ZmZpeDogbm91biBzdWZmaXhlcyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4KKyPlkI3oqZ4t5o6l5bC+CisjCisjICBub3VuLXN1ZmZpeC1taXNjOiBPZiB0aGUgbm91bnMgb3Igc3RlbSBmb3JtcyBvZiBvdGhlciBwYXJ0cyBvZiBzcGVlY2ggdGhhdCBjb25uZWN0IAorIyAgdG8g44Ks44OrIG9yIOOCv+OCpCBhbmQgY2FuIGNvbWJpbmUgaW50byBjb21wb3VuZCBub3Vucywgd29yZHMgdGhhdCBjYW5ub3QgYmUgY2xhc3NpZmllZCBpbnRvCisjICBhbnkgb2YgdGhlIG90aGVyIGNhdGVnb3JpZXMgYmVsb3cuIEluIGdlbmVyYWwsIHRoaXMgY2F0ZWdvcnkgaXMgbW9yZSBpbmNsdXNpdmUgdGhhbiAKKyMgIOaOpeWwvuiqniAoInN1ZmZpeCIpIGFuZCBpcyB1c3VhbGx5IHRoZSBsYXN0IGVsZW1lbnQgaW4gYSBjb21wb3VuZCBub3VuLgorIyAgZS5nLiDjgYrjgY0sIOOBi+OBnywg5pa5LCDnlLLmlpAgKOOBjOOBhCksIOOBjOOBi+OCiiwg44GO44G/LCDmsJflkbMsIOOBkOOCi+OBvywgKO+9nuOBl+OBnykg44GVLCDmrKHnrKwsIOa4iCAo44GaKSDjgb8sCisjICAgICAgIOOCiOOBhiwgKOOBp+OBjSnjgaPjgZMsIOaEnywg6KazLCDmgKcsIOWtpiwg6aGeLCDpnaIsIOeUqAorI+WQjeipni3mjqXlsL4t5LiA6IisCisjCisjICBub3VuLXN1ZmZpeC1wZXJzb246IFN1ZmZpeGVzIHRoYXQgZm9ybSBub3VucyBhbmQgYXR0YWNoIHRvIHBlcnNvbiBuYW1lcyBtb3JlIG9mdGVuCisjICB0aGFuIG90aGVyIG5vdW5zLgorIyAgZS5nLiDlkJssIOanmCwg6JGXCisj5ZCN6KmeLeaOpeWwvi3kurrlkI0KKyMKKyMgIG5vdW4tc3VmZml4LXBsYWNlOiBTdWZmaXhlcyB0aGF0IGZvcm0gbm91bnMgYW5kIGF0dGFjaCB0byBwbGFjZSBuYW1lcyBtb3JlIG9mdGVuIAorIyAgdGhhbiBvdGhlciBub3Vucy4KKyMgIGUuZy4g55S6LCDluIIsIOecjAorI+WQjeipni3mjqXlsL4t5Zyw5Z+fCisjCisjICBub3VuLXN1ZmZpeC12ZXJiYWw6IE9mIHRoZSBzdWZmaXhlcyB0aGF0IGF0dGFjaCB0byBub3VucyBhbmQgZm9ybSBub3VucywgdGhvc2UgdGhhdCAKKyMgIGNhbiBhcHBlYXIgYmVmb3JlIOOCueODqyAoInN1cnUiKS4KKyMgIGUuZy4g5YyWLCDoppYsIOWIhuOBkSwg5YWl44KKLCDokL3jgaEsIOiyt+OBhAorI+WQjeipni3mjqXlsL4t44K15aSJ5o6l57aaCisjCisjICBub3VuLXN1ZmZpeC1hdXg6IFRoZSBzdGVtIGZvcm0gb2Yg44Gd44GG44GgICjmp5jmhYspIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSBjb25kaXRpb25zLCAKKyMgIGlzIHRyZWF0ZWQgYXMg5Yqp5YuV6KmeICgiYXV4aWxpYXJ5IHZlcmIiKSBpbiBzY2hvb2wgZ3JhbW1hcnMsIGFuZCBhdHRhY2ggdG8gdGhlIAorIyAgY29uanVuY3RpdmUgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMuCisjICBlLmcuIOOBneOBhgorI+WQjeipni3mjqXlsL4t5Yqp5YuV6Kme6Kqe5bm5CisjCisjICBub3VuLXN1ZmZpeC1hZGplY3RpdmUtYmFzZTogU3VmZml4ZXMgdGhhdCBhdHRhY2ggdG8gb3RoZXIgbm91bnMgb3IgdGhlIGNvbmp1bmN0aXZlIAorIyAgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMgYW5kIGFwcGVhciBiZWZvcmUgdGhlIGNvcHVsYSDjgaAgKCJkYSIpLgorIyAgZS5nLiDnmoQsIOOBkiwg44GM44GhCisj5ZCN6KmeLeaOpeWwvi3lvaLlrrnli5XoqZ7oqp7lubkKKyMKKyMgIG5vdW4tc3VmZml4LWFkdmVyYmlhbDogU3VmZml4ZXMgdGhhdCBhdHRhY2ggdG8gb3RoZXIgbm91bnMgYW5kIGNhbiBiZWhhdmUgYXMgYWR2ZXJicy4KKyMgIGUuZy4g5b6MICjjgZQpLCDku6XlvowsIOS7pemZjSwg5Lul5YmNLCDliY3lvowsIOS4rSwg5pyrLCDkuIosIOaZgiAo44GYKQorI+WQjeipni3mjqXlsL4t5Ymv6Kme5Y+v6IO9CisjCisjICBub3VuLXN1ZmZpeC1jbGFzc2lmaWVyOiBTdWZmaXhlcyB0aGF0IGF0dGFjaCB0byBudW1iZXJzIGFuZCBmb3JtIG5vdW5zLiBUaGlzIGNhdGVnb3J5IAorIyAgaXMgbW9yZSBpbmNsdXNpdmUgdGhhbiDliqnmlbDoqZ4gKCJjbGFzc2lmaWVyIikgYW5kIGluY2x1ZGVzIGNvbW1vbiBub3VucyB0aGF0IGF0dGFjaCAKKyMgIHRvIG51bWJlcnMuCisjICBlLmcuIOWAiywg44GkLCDmnKwsIOWGiiwg44OR44O844K744Oz44OILCBjbSwga2csIOOCq+aciCwg44GL5Zu9LCDljLrnlLssIOaZgumWkywg5pmC5Y2KCisj5ZCN6KmeLeaOpeWwvi3liqnmlbDoqZ4KKyMKKyMgIG5vdW4tc3VmZml4LXNwZWNpYWw6IFNwZWNpYWwgc3VmZml4ZXMgdGhhdCBtYWlubHkgYXR0YWNoIHRvIGluZmxlY3Rpbmcgd29yZHMuCisjICBlLmcuICjmpb3jgZcpIOOBlSwgKOiAg+OBiCkg5pa5Cisj5ZCN6KmeLeaOpeWwvi3nibnmrooKKyMKKyMgIG5vdW4tc3VmZml4LWNvbmp1bmN0aXZlOiBOb3VucyB0aGF0IGJlaGF2ZSBsaWtlIGNvbmp1bmN0aW9ucyBhbmQgam9pbiB0d28gd29yZHMgCisjICB0b2dldGhlci4KKyMgIGUuZy4gKOaXpeacrCkg5a++ICjjgqLjg6Hjg6rjgqspLCDlr74gKOOCouODoeODquOCqyksICgzKSDlr74gKDUpLCAo5aWz5YSqKSDlhbwgKOS4u+WppikKKyPlkI3oqZ4t5o6l57aa6Kme55qECisjCisjICBub3VuLXZlcmJhbF9hdXg6IE5vdW5zIHRoYXQgYXR0YWNoIHRvIHRoZSBjb25qdW5jdGl2ZSBwYXJ0aWNsZSDjgaYgKCJ0ZSIpIGFuZCBhcmUgCisjICBzZW1hbnRpY2FsbHkgdmVyYi1saWtlLgorIyAgZS5nLiDjgZTjgonjgpMsIOOBlOimpywg5b6h6KanLCDpoILmiLQKKyPlkI3oqZ4t5YuV6Kme6Z2e6Ieq56uL55qECisjCisjICBub3VuLXF1b3RhdGlvbjogdGV4dCB0aGF0IGNhbm5vdCBiZSBzZWdtZW50ZWQgaW50byB3b3JkcywgcHJvdmVyYnMsIENoaW5lc2UgcG9ldHJ5LCAKKyMgIGRpYWxlY3RzLCBFbmdsaXNoLCBldGMuIEN1cnJlbnRseSwgdGhlIG9ubHkgZW50cnkgZm9yIOWQjeipniDlvJXnlKjmloflrZfliJcgKCJub3VuIHF1b3RhdGlvbiIpIAorIyAgaXMg44GE44KP44GPICgiaXdha3UiKS4KKyPlkI3oqZ4t5byV55So5paH5a2X5YiXCisjCisjICBub3VuLW5haV9hZGplY3RpdmU6IFdvcmRzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgYXV4aWxpYXJ5IHZlcmIg44Gq44GEICgibmFpIikgYW5kCisjICBiZWhhdmUgbGlrZSBhbiBhZGplY3RpdmUuCisjICBlLmcuIOeUs+OBl+iosywg5LuV5pa5LCDjgajjgpPjgafjgoIsIOmBleOBhAorI+WQjeipni3jg4rjgqTlvaLlrrnoqZ7oqp7lubkKKyMKKyMjIyMjCisjICBwcmVmaXg6IHVuY2xhc3NpZmllZCBwcmVmaXhlcworI+aOpemgreipngorIworIyAgcHJlZml4LW5vbWluYWw6IFByZWZpeGVzIHRoYXQgYXR0YWNoIHRvIG5vdW5zIChpbmNsdWRpbmcgYWRqZWN0aXZlIHN0ZW0gZm9ybXMpIAorIyAgZXhjbHVkaW5nIG51bWVyaWNhbCBleHByZXNzaW9ucy4KKyMgIGUuZy4g44GKICjmsLQpLCDmn5AgKOawjyksIOWQjCAo56S+KSwg5pWFICjvvZ7msI8pLCDpq5ggKOWTgeizqiksIOOBiiAo6KaL5LqLKSwg44GUICjnq4vmtL4pCisj5o6l6aCt6KmeLeWQjeipnuaOpee2mgorIworIyAgcHJlZml4LXZlcmJhbDogUHJlZml4ZXMgdGhhdCBhdHRhY2ggdG8gdGhlIGltcGVyYXRpdmUgZm9ybSBvZiBhIHZlcmIgb3IgYSB2ZXJiCisjICBpbiBjb25qdW5jdGl2ZSBmb3JtIGZvbGxvd2VkIGJ5IOOBquOCiy/jgarjgZXjgosv44GP44Gg44GV44KLLgorIyAgZS5nLiDjgYogKOiqreOBv+OBquOBleOBhCksIOOBiiAo5bqn44KKKQorI+aOpemgreipni3li5XoqZ7mjqXntpoKKyMKKyMgIHByZWZpeC1hZGplY3RpdmFsOiBQcmVmaXhlcyB0aGF0IGF0dGFjaCB0byBhZGplY3RpdmVzLgorIyAgZS5nLiDjgYogKOWvkuOBhOOBp+OBmeOBreOBiCksIOODkOOCqyAo44Gn44GL44GEKQorI+aOpemgreipni3lvaLlrrnoqZ7mjqXntpoKKyMKKyMgIHByZWZpeC1udW1lcmljYWw6IFByZWZpeGVzIHRoYXQgYXR0YWNoIHRvIG51bWVyaWNhbCBleHByZXNzaW9ucy4KKyMgIGUuZy4g57SELCDjgYrjgojjgZ0sIOavjuaZggorI+aOpemgreipni3mlbDmjqXntpoKKyMKKyMjIyMjCisjICB2ZXJiOiB1bmNsYXNzaWZpZWQgdmVyYnMKKyPli5XoqZ4KKyMKKyMgIHZlcmItbWFpbjoKKyPli5XoqZ4t6Ieq56uLCisjCisjICB2ZXJiLWF1eGlsaWFyeToKKyPli5XoqZ4t6Z2e6Ieq56uLCisjCisjICB2ZXJiLXN1ZmZpeDoKKyPli5XoqZ4t5o6l5bC+CisjCisjIyMjIworIyAgYWRqZWN0aXZlOiB1bmNsYXNzaWZpZWQgYWRqZWN0aXZlcworI+W9ouWuueipngorIworIyAgYWRqZWN0aXZlLW1haW46Cisj5b2i5a656KmeLeiHqueriworIworIyAgYWRqZWN0aXZlLWF1eGlsaWFyeToKKyPlvaLlrrnoqZ4t6Z2e6Ieq56uLCisjCisjICBhZGplY3RpdmUtc3VmZml4OgorI+W9ouWuueipni3mjqXlsL4KKyMKKyMjIyMjCisjICBhZHZlcmI6IHVuY2xhc3NpZmllZCBhZHZlcmJzCisj5Ymv6KmeCisjCisjICBhZHZlcmItbWlzYzogV29yZHMgdGhhdCBjYW4gYmUgc2VnbWVudGVkIGludG8gb25lIHVuaXQgYW5kIHdoZXJlIGFkbm9taW5hbCAKKyMgIG1vZGlmaWNhdGlvbiBpcyBub3QgcG9zc2libGUuCisjICBlLmcuIOOBguOBhOOBi+OCj+OCieOBmiwg5aSa5YiGCisj5Ymv6KmeLeS4gOiIrAorIworIyAgYWR2ZXJiLXBhcnRpY2xlX2Nvbmp1bmN0aW9uOiBBZHZlcmJzIHRoYXQgY2FuIGJlIGZvbGxvd2VkIGJ5IOOBriwg44GvLCDjgassIAorIyAg44GqLCDjgZnjgossIOOBoCwgZXRjLgorIyAgZS5nLiDjgZPjgpPjgarjgassIOOBneOCk+OBquOBqywg44GC44KT44Gq44GrLCDjgarjgavjgYssIOOBquOCk+OBp+OCggorI+WJr+ipni3liqnoqZ7poZ7mjqXntpoKKyMKKyMjIyMjCisjICBhZG5vbWluYWw6IFdvcmRzIHRoYXQgb25seSBoYXZlIG5vdW4tbW9kaWZ5aW5nIGZvcm1zLgorIyAgZS5nLiDjgZPjga4sIOOBneOBriwg44GC44GuLCDjganjga4sIOOBhOOCj+OChuOCiywg44Gq44KT44KJ44GL44GuLCDkvZXjgonjgYvjga4sIOOBhOOCjeOCk+OBqiwg44GT44GG44GE44GGLCDjgZ3jgYbjgYTjgYYsIOOBguOBguOBhOOBhiwgCisjICAgICAgIOOBqeOBhuOBhOOBhiwg44GT44KT44GqLCDjgZ3jgpPjgaosIOOBguOCk+OBqiwg44Gp44KT44GqLCDlpKfjgY3jgaosIOWwj+OBleOBqiwg44GK44GL44GX44GqLCDjgbvjgpPjga4sIOOBn+OBhOOBl+OBnywgCisjICAgICAgIOOAjCgsIOOCgikg44GV44KLICjjgZPjgajjgarjgYzjgokp44CNLCDlvq7jgIXjgZ/jgossIOWgguOAheOBn+OCiywg5Y2Y44Gq44KLLCDjgYTjgYvjgarjgossIOaIkeOBjOOAjeOAjOWQjOOBmCwg5Lqh44GNCisj6YCj5L2T6KmeCisjCisjIyMjIworIyAgY29uanVuY3Rpb246IENvbmp1bmN0aW9ucyB0aGF0IGNhbiBvY2N1ciBpbmRlcGVuZGVudGx5LgorIyAgZS5nLiDjgYwsIOOBkeOCjOOBqeOCgiwg44Gd44GX44GmLCDjgZjjgoPjgYIsIOOBneOCjOOBqeOBk+OCjeOBiwor5o6l57aa6KmeCisjCisjIyMjIworIyAgcGFydGljbGU6IHVuY2xhc3NpZmllZCBwYXJ0aWNsZXMuCivliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWNhc2U6IGNhc2UgcGFydGljbGVzIHdoZXJlIHRoZSBzdWJjbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQuCivliqnoqZ4t5qC85Yqp6KmeCisjCisjICBwYXJ0aWNsZS1jYXNlLW1pc2M6IENhc2UgcGFydGljbGVzLgorIyAgZS5nLiDjgYvjgoksIOOBjCwg44GnLCDjgagsIOOBqywg44G4LCDjgojjgoosIOOCkiwg44GuLCDjgavjgaYKK+WKqeipni3moLzliqnoqZ4t5LiA6IisCisjCisjICBwYXJ0aWNsZS1jYXNlLXF1b3RlOiB0aGUgInRvIiB0aGF0IGFwcGVhcnMgYWZ0ZXIgbm91bnMsIGEgcGVyc29u4oCZcyBzcGVlY2gsIAorIyAgcXVvdGF0aW9uIG1hcmtzLCBleHByZXNzaW9ucyBvZiBkZWNpc2lvbnMgZnJvbSBhIG1lZXRpbmcsIHJlYXNvbnMsIGp1ZGdlbWVudHMsCisjICBjb25qZWN0dXJlcywgZXRjLgorIyAgZS5nLiAoIOOBoCkg44GoICjov7DjgbnjgZ8uKSwgKCDjgafjgYLjgospIOOBqCAo44GX44Gm5Z+36KGM54y25LqILi4uKQor5Yqp6KmeLeagvOWKqeipni3lvJXnlKgKKyMKKyMgIHBhcnRpY2xlLWNhc2UtY29tcG91bmQ6IENvbXBvdW5kcyBvZiBwYXJ0aWNsZXMgYW5kIHZlcmJzIHRoYXQgbWFpbmx5IGJlaGF2ZSAKKyMgIGxpa2UgY2FzZSBwYXJ0aWNsZXMuCisjICBlLmcuIOOBqOOBhOOBhiwg44Go44GE44Gj44GfLCDjgajjgYvjgYTjgYYsIOOBqOOBl+OBpiwg44Go44Go44KC44GrLCDjgajlhbHjgassIOOBp+OCguOBo+OBpiwg44Gr44GC44Gf44Gj44GmLCDjgavlvZPjgZ/jgaPjgaYsIOOBq+W9k+OBo+OBpiwKKyMgICAgICAg44Gr44GC44Gf44KKLCDjgavlvZPjgZ/jgoosIOOBq+W9k+OCiiwg44Gr5b2T44Gf44KLLCDjgavjgYLjgZ/jgossIOOBq+OBiuOBhOOBpiwg44Gr5pa844GE44GmLOOBq+aWvOOBpiwg44Gr44GK44GR44KLLCDjgavmlrzjgZHjgossIAorIyAgICAgICDjgavjgYvjgZEsIOOBq+OBi+OBkeOBpiwg44Gr44GL44KT44GXLCDjgavplqLjgZcsIOOBq+OBi+OCk+OBl+OBpiwg44Gr6Zai44GX44GmLCDjgavjgYvjgpPjgZnjgossIOOBq+mWouOBmeOCiywg44Gr6Zqb44GXLCAKKyMgICAgICAg44Gr6Zqb44GX44GmLCDjgavjgZfjgZ/jgYzjgYQsIOOBq+W+k+OBhCwg44Gr5b6T44GGLCDjgavjgZfjgZ/jgYzjgaPjgaYsIOOBq+W+k+OBo+OBpiwg44Gr44Gf44GE44GXLCDjgavlr77jgZcsIOOBq+OBn+OBhOOBl+OBpiwgCisjICAgICAgIOOBq+WvvuOBl+OBpiwg44Gr44Gf44GE44GZ44KLLCDjgavlr77jgZnjgossIOOBq+OBpOOBhOOBpiwg44Gr44Gk44GNLCDjgavjgaTjgZEsIOOBq+OBpOOBkeOBpiwg44Gr44Gk44KMLCDjgavjgaTjgozjgaYsIOOBq+OBqOOBo+OBpiwKKyMgICAgICAg44Gr44Go44KKLCDjgavjgb7jgaTjgo/jgossIOOBq+OCiOOBo+OBpiwg44Gr5L6d44Gj44GmLCDjgavlm6DjgaPjgaYsIOOBq+OCiOOCiiwg44Gr5L6d44KKLCDjgavlm6DjgoosIOOBq+OCiOOCiywg44Gr5L6d44KLLCDjgavlm6DjgossIAorIyAgICAgICDjgavjgo/jgZ/jgaPjgaYsIOOBq+OCj+OBn+OCiywg44KS44KC44Gj44GmLCDjgpLku6XjgaPjgaYsIOOCkumAmuOBmCwg44KS6YCa44GY44GmLCDjgpLpgJrjgZfjgaYsIOOCkuOCgeOBkOOBo+OBpiwg44KS44KB44GQ44KKLCDjgpLjgoHjgZDjgossCisjICAgICAgIOOBo+OBpi3lj6Poqp4vLCDjgaHjgoXjgYYt6Zai6KW/5byB44CM44Go44GE44GG44CNLywgKOS9lSkg44Gm44GE44GGICjkuropLeWPo+iqni8sIOOBo+OBpuOBhOOBhi3lj6Poqp4vLCDjgajjgYTjgbUsIOOBqOOBi+OBhOOBtQor5Yqp6KmeLeagvOWKqeipni3pgKPoqp4KKyMKKyMgIHBhcnRpY2xlLWNvbmp1bmN0aXZlOgorIyAgZS5nLiDjgYvjgoksIOOBi+OCieOBq+OBrywg44GMLCDjgZHjgozjgaksIOOBkeOCjOOBqeOCgiwg44GR44GpLCDjgZcsIOOBpOOBpCwg44GmLCDjgacsIOOBqCwg44Go44GT44KN44GMLCDjganjgZPjgo3jgYssIOOBqOOCgiwg44Gp44KCLCAKKyMgICAgICAg44Gq44GM44KJLCDjgarjgoosIOOBruOBpywg44Gu44GrLCDjgbAsIOOCguOBruOBriwg44KEICgg44GX44GfKSwg44KE44GE44Gq44KELCAo44GT44KN44KTKSDjgZjjgoMo44GE44GR44Gq44GEKS3lj6Poqp4vLCAKKyMgICAgICAgKOihjOOBoykg44Gh44KDKOOBhOOBkeOBquOBhCkt5Y+j6KqeLywgKOiogOOBoykg44Gf44Gj44GmICjjgZfjgYvjgZ/jgYzjgarjgYQpLeWPo+iqni8sICjjgZ3jgozjgYzjgarjgY8p44Gj44Gf44Gj44GmICjlubPmsJcpLeWPo+iqni8KK+WKqeipni3mjqXntprliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWRlcGVuZGVuY3k6CisjICBlLmcuIOOBk+OBnSwg44GV44GILCDjgZfjgYssIOOBmeOCiSwg44GvLCDjgoIsIOOBngor5Yqp6KmeLeS/guWKqeipngorIworIyAgcGFydGljbGUtYWR2ZXJiaWFsOgorIyAgZS5nLiDjgYzjgabjgoksIOOBi+OCgiwg44GP44KJ44GELCDkvY0sIOOBkOOCieOBhCwg44GX44KCLCAo5a2m5qChKSDjgZjjgoMo44GT44KM44GM5rWB6KGM44Gj44Gm44GE44KLKS3lj6Poqp4vLCAKKyMgICAgICAgKOOBneOCjCnjgZjjgoPjgYIgKOOCiOOBj+OBquOBhCkt5Y+j6KqeLywg44Ga44GkLCAo56eBKSDjgarjgZ4sIOOBquOBqSwgKOengSkg44Gq44KKICjjgaspLCAo5YWI55SfKSDjgarjgpPjgYsgKOWkp+WrjOOBhCkt5Y+j6KqeLywKKyMgICAgICAgKOengSkg44Gq44KT44GeLCAo5YWI55SfKSDjgarjgpPjgaYgKOWkp+WrjOOBhCkt5Y+j6KqeLywg44Gu44G/LCDjgaDjgZEsICjnp4EpIOOBoOOBo+OBpi3lj6Poqp4vLCDjgaDjgassIAorIyAgICAgICAo5b28KeOBo+OBn+OCiS3lj6Poqp4vLCAo44GK6Iy2KSDjgafjgoIgKOOBhOOBi+OBjCksIOetiSAo44Go44GGKSwgKOS7iuW+jCkg44Go44KCLCDjgbDjgYvjgoosIOOBsOOBo+OBiy3lj6Poqp4vLCDjgbDjgaPjgYvjgoot5Y+j6KqeLywKKyMgICAgICAg44G744GpLCDnqIssIOOBvuOBpywg6L+ELCAo6KqwKSDjgoIgKOOBjCkoW+WKqeipni3moLzliqnoqZ5dIOOBiuOCiOOBsyBb5Yqp6KmeLeS/guWKqeipnl0g44Gu5YmN44Gr5L2N572u44GZ44KL44CM44KC44CNKQor5Yqp6KmeLeWJr+WKqeipngorIworIyAgcGFydGljbGUtaW50ZXJqZWN0aXZlOiBwYXJ0aWNsZXMgd2l0aCBpbnRlcmplY3RpdmUgZ3JhbW1hdGljYWwgcm9sZXMuCisjICBlLmcuICjmnb7ls7YpIOOChAor5Yqp6KmeLemWk+aKleWKqeipngorIworIyAgcGFydGljbGUtY29vcmRpbmF0ZToKKyMgIGUuZy4g44GoLCDjgZ/jgoosIOOBoOOBriwg44Gg44KKLCDjgajjgYssIOOBquOCiiwg44KELCDjgoTjgokKK+WKqeipni3kuKbnq4vliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWZpbmFsOgorIyAgZS5nLiDjgYvjgYQsIOOBi+OBl+OCiSwg44GVLCDjgZwsICjjgaAp44Gj44GRLeWPo+iqni8sICjjgajjgb7jgaPjgabjgospIOOBpy3mlrnoqIAvLCDjgaosIOODiiwg44Gq44GCLeWPo+iqni8sIOOBniwg44GtLCDjg40sIAorIyAgICAgICDjga3jgYct5Y+j6KqeLywg44Gt44GILeWPo+iqni8sIOOBreOCky3mlrnoqIAvLCDjga4sIOOBruOBhi3lj6Poqp4vLCDjgoQsIOOCiCwg44OoLCDjgojjgYkt5Y+j6KqeLywg44KPLCDjgo/jgYQt5Y+j6KqeLwor5Yqp6KmeLee1guWKqeipngorIworIyAgcGFydGljbGUtYWR2ZXJiaWFsL2Nvbmp1bmN0aXZlL2ZpbmFsOiBUaGUgcGFydGljbGUgImthIiB3aGVuIHVua25vd24gd2hldGhlciBpdCBpcyAKKyMgIGFkdmVyYmlhbCwgY29uanVuY3RpdmUsIG9yIHNlbnRlbmNlIGZpbmFsLiBGb3IgZXhhbXBsZToKKyMgICAgICAgKGEpIOOAjEEg44GLIEIg44GL44CNLiBFeDrjgIwo5Zu95YaF44Gn6YGL55So44GZ44KLKSDjgYssKOa1t+WkluOBp+mBi+eUqOOBmeOCiykg44GLICguKeOAjQorIyAgICAgICAoYikgSW5zaWRlIGFuIGFkdmVyYiBwaHJhc2UuIEV4OuOAjCjlubjjgYTjgajjgYTjgYYpIOOBiyAoLCDmrbvogIXjga/jgYTjgarjgYvjgaPjgZ8uKeOAjQorIyAgICAgICAgICAg44CMKOeliOOCiuOBjOWxiuOBhOOBn+OBm+OBhCkg44GLICgsIOippumok+OBq+WQiOagvOOBl+OBny4p44CNCisjICAgICAgIChjKSDjgIzjgYvjga7jgojjgYbjgavjgI0uIEV4OuOAjCjkvZXjgoLjgarjgYvjgaPjgZ8pIOOBiyAo44Gu44KI44GG44Gr5oyv44KL6Iie44Gj44GfLinjgI0KKyMgIGUuZy4g44GLCivliqnoqZ4t5Ymv5Yqp6Kme77yP5Lim56uL5Yqp6Kme77yP57WC5Yqp6KmeCisjCisjICBwYXJ0aWNsZS1hZG5vbWluYWxpemVyOiBUaGUgIm5vIiB0aGF0IGF0dGFjaGVzIHRvIG5vdW5zIGFuZCBtb2RpZmllcyAKKyMgIG5vbi1pbmZsZWN0aW9uYWwgd29yZHMuCivliqnoqZ4t6YCj5L2T5YyWCisjCisjICBwYXJ0aWNsZS1hZG5vbWluYWxpemVyOiBUaGUgIm5pIiBhbmQgInRvIiB0aGF0IGFwcGVhciBmb2xsb3dpbmcgbm91bnMgYW5kIGFkdmVyYnMgCisjICB0aGF0IGFyZSBnaW9uZ28sIGdpc2VpZ28sIG9yIGdpdGFpZ28uCisjICBlLmcuIOOBqywg44GoCivliqnoqZ4t5Ymv6Kme5YyWCisjCisjICBwYXJ0aWNsZS1zcGVjaWFsOiBBIHBhcnRpY2xlIHRoYXQgZG9lcyBub3QgZml0IGludG8gb25lIG9mIHRoZSBhYm92ZSBjbGFzc2lmaWNhdGlvbnMuIAorIyAgVGhpcyBpbmNsdWRlcyBwYXJ0aWNsZXMgdGhhdCBhcmUgdXNlZCBpbiBUYW5rYSwgSGFpa3UsIGFuZCBvdGhlciBwb2V0cnkuCisjICBlLmcuIOOBi+OBqiwg44GR44KALCAoIOOBl+OBn+OBoOOCjeOBhikg44GrLCAo44GC44KT44GfKSDjgavjgoMo44KP44GL44KJ44KTKSwgKOS/uikg44KTICjlrrYpCivliqnoqZ4t54m55q6KCisjCisjIyMjIworIyAgYXV4aWxpYXJ5LXZlcmI6Civliqnli5XoqZ4KKyMKKyMjIyMjCisjICBpbnRlcmplY3Rpb246IEdyZWV0aW5ncyBhbmQgb3RoZXIgZXhjbGFtYXRpb25zLgorIyAgZS5nLiDjgYrjga/jgojjgYYsIOOBiuOBr+OCiOOBhuOBlOOBluOBhOOBvuOBmSwg44GT44KT44Gr44Gh44GvLCDjgZPjgpPjgbDjgpPjga8sIOOBguOCiuOBjOOBqOOBhiwg44Gp44GG44KC44GC44KK44GM44Go44GGLCDjgYLjgorjgYzjgajjgYbjgZTjgZbjgYTjgb7jgZksIAorIyAgICAgICDjgYTjgZ/jgaDjgY3jgb7jgZksIOOBlOOBoeOBneOBhuOBleOBviwg44GV44KI44Gq44KJLCDjgZXjgojjgYbjgarjgoksIOOBr+OBhCwg44GE44GE44GILCDjgZTjgoHjgpMsIOOBlOOCgeOCk+OBquOBleOBhAorI+aEn+WLleipngorIworIyMjIyMKKyMgIHN5bWJvbDogdW5jbGFzc2lmaWVkIFN5bWJvbHMuCivoqJjlj7cKKyMKKyMgIHN5bWJvbC1taXNjOiBBIGdlbmVyYWwgc3ltYm9sIG5vdCBpbiBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgYmVsb3cuCisjICBlLmcuIFvil4vil45AJOOAkuKGkitdCivoqJjlj7ct5LiA6IisCisjCisjICBzeW1ib2wtY29tbWE6IENvbW1hcworIyAgZS5nLiBbLOOAgV0KK+iomOWPty3oqq3ngrkKKyMKKyMgIHN5bWJvbC1wZXJpb2Q6IFBlcmlvZHMgYW5kIGZ1bGwgc3RvcHMuCisjICBlLmcuIFsu77yO44CCXQor6KiY5Y+3LeWPpeeCuQorIworIyAgc3ltYm9sLXNwYWNlOiBGdWxsLXdpZHRoIHdoaXRlc3BhY2UuCivoqJjlj7ct56m655m9CisjCisjICBzeW1ib2wtb3Blbl9icmFja2V0OgorIyAgZS5nLiBbKHvigJjigJzjgI7jgJBdCivoqJjlj7ct5ous5byn6ZaLCisjCisjICBzeW1ib2wtY2xvc2VfYnJhY2tldDoKKyMgIGUuZy4gWyl94oCZ4oCd44CP44CN44CRXQor6KiY5Y+3LeaLrOW8p+mWiQorIworIyAgc3ltYm9sLWFscGhhYmV0aWM6Cisj6KiY5Y+3LeOCouODq+ODleOCoeODmeODg+ODiAorIworIyMjIyMKKyMgIG90aGVyOiB1bmNsYXNzaWZpZWQgb3RoZXIKKyPjgZ3jga7ku5YKKyMKKyMgIG90aGVyLWludGVyamVjdGlvbjogV29yZHMgdGhhdCBhcmUgaGFyZCB0byBjbGFzc2lmeSBhcyBub3VuLXN1ZmZpeGVzIG9yIAorIyAgc2VudGVuY2UtZmluYWwgcGFydGljbGVzLgorIyAgZS5nLiAo44GgKeOCoQor44Gd44Gu5LuWLemWk+aKlQorIworIyMjIyMKKyMgIGZpbGxlcjogQWl6dWNoaSB0aGF0IG9jY3VycyBkdXJpbmcgYSBjb252ZXJzYXRpb24gb3Igc291bmRzIGluc2VydGVkIGFzIGZpbGxlci4KKyMgIGUuZy4g44GC44GuLCDjgYbjgpPjgagsIOOBiOOBqAor44OV44Kj44Op44O8CisjCisjIyMjIworIyAgbm9uLXZlcmJhbDogbm9uLXZlcmJhbCBzb3VuZC4KK+mdnuiogOiqnumfsworIworIyMjIyMKKyMgIGZyYWdtZW50OgorI+iqnuaWreeJhworIworIyMjIyMKKyMgIHVua25vd246IHVua25vd24gcGFydCBvZiBzcGVlY2guCisj5pyq55+l6KqeCisjCisjIyMjIyBFbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfYXIudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfYXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjgyOWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19hci50eHQKQEAgLTAsMCArMSwxMjUgQEAKKyMgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGJ5IEphY3F1ZXMgU2F2b3kgYW5kIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgbGljZW5zZS4KKyMgU2VlIGh0dHA6Ly9tZW1iZXJzLnVuaW5lLmNoL2phY3F1ZXMuc2F2b3kvY2xlZi9pbmRleC5odG1sLgorIyBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyMgQ2xlYW5lZCBvbiBPY3RvYmVyIDExLCAyMDA5IChub3Qgbm9ybWFsaXplZCwgc28gdXNlIGJlZm9yZSBub3JtYWxpemF0aW9uKQorIyBUaGlzIG1lYW5zIHRoYXQgd2hlbiBtb2RpZnlpbmcgdGhpcyBsaXN0LCB5b3UgbWlnaHQgbmVlZCB0byBhZGQgc29tZSAKKyMgcmVkdW5kYW50IGVudHJpZXMsIGZvciBleGFtcGxlIGNvbnRhaW5pbmcgZm9ybXMgd2l0aCBib3RoINijIGFuZCDYpwor2YXZhgor2YjZhdmGCivZhdmG2YfYpwor2YXZhtmHCivZgdmKCivZiNmB2YoKK9mB2YrZh9inCivZgdmK2YcKK9mICivZgQor2KvZhQor2KfZiAor2KPZiAor2KgKK9io2YfYpwor2KjZhwor2KcKK9ijCivYp9mJCivYp9mKCivYo9mKCivYo9mJCivZhNinCivZiNmE2KcKK9in2YTYpwor2KPZhNinCivYpdmE2KcKK9mE2YPZhgor2YXYpwor2YjZhdinCivZg9mF2KcKK9mB2YXYpwor2LnZhgor2YXYuQor2KfYsNinCivYpdiw2KcKK9in2YYKK9ij2YYKK9il2YYKK9in2YbZh9inCivYo9mG2YfYpwor2KXZhtmH2KcKK9in2YbZhwor2KPZhtmHCivYpdmG2YcKK9io2KfZhgor2KjYo9mGCivZgdin2YYKK9mB2KPZhgor2YjYp9mGCivZiNij2YYKK9mI2KXZhgor2KfZhNiq2YkKK9in2YTYqtmKCivYp9mE2LDZiQor2KfZhNiw2YoKK9in2YTYsNmK2YYKK9in2YTZiQor2KfZhNmKCivYpdmE2YkKK9il2YTZigor2LnZhNmJCivYudmE2YrZh9inCivYudmE2YrZhwor2KfZhdinCivYo9mF2KcKK9il2YXYpwor2KfZiti22KcKK9ij2YrYttinCivZg9mECivZiNmD2YQKK9mE2YUKK9mI2YTZhQor2YTZhgor2YjZhNmGCivZh9mJCivZh9mKCivZh9mICivZiNmH2YkKK9mI2YfZigor2YjZh9mICivZgdmH2YkKK9mB2YfZigor2YHZh9mICivYp9mG2KoKK9ij2YbYqgor2YTZgwor2YTZh9inCivZhNmHCivZh9iw2YcKK9mH2LDYpwor2KrZhNmDCivYsNmE2YMKK9mH2YbYp9mDCivZg9in2YbYqgor2YPYp9mGCivZitmD2YjZhgor2KrZg9mI2YYKK9mI2YPYp9mG2KoKK9mI2YPYp9mGCivYutmK2LEKK9io2LnYtgor2YLYrwor2YbYrdmICivYqNmK2YYKK9io2YrZhtmF2KcKK9mF2YbYsAor2LbZhdmGCivYrdmK2KsKK9in2YTYp9mGCivYp9mE2KLZhgor2K7ZhNin2YQKK9io2LnYrwor2YLYqNmECivYrdiq2YkKK9i52YbYrwor2LnZhtiv2YXYpwor2YTYr9mJCivYrNmF2YrYuQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfYmcudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfYmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTRiYTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19iZy50eHQKQEAgLTAsMCArMSwxOTMgQEAKKyMgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGJ5IEphY3F1ZXMgU2F2b3kgYW5kIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgbGljZW5zZS4KKyMgU2VlIGh0dHA6Ly9tZW1iZXJzLnVuaW5lLmNoL2phY3F1ZXMuc2F2b3kvY2xlZi9pbmRleC5odG1sLgorIyBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKK9CwCivQsNC3CivQsNC60L4KK9Cw0LvQsAor0LHQtQor0LHQtdC3CivQsdC10YjQtQor0LHQuAor0LHQuNC7CivQsdC40LvQsAor0LHQuNC70LgKK9Cx0LjQu9C+CivQsdC70LjQt9C+CivQsdGK0LTQsNGCCivQsdGK0LTQtQor0LHRj9GF0LAKK9CyCivQstCw0YEKK9Cy0LDRiAor0LLQsNGI0LAKK9Cy0LXRgNC+0Y/RgtC90L4KK9Cy0LXRh9C1CivQstC30LXQvNCwCivQstC4CivQstC40LUKK9Cy0LjQvdCw0LPQuAor0LLRgdC1CivQstGB0LXQutC4CivQstGB0LjRh9C60LgKK9Cy0YHQuNGH0LrQvgor0LLRgdGP0LrQsAor0LLRitCyCivQstGK0L/RgNC10LrQuAor0LLRitGA0YXRgwor0LMKK9Cz0LgKK9Cz0LvQsNCy0L3Qvgor0LPQvgor0LQKK9C00LAKK9C00LDQu9C4CivQtNC+CivQtNC+0LrQsNGC0L4KK9C00L7QutC+0LPQsAor0LTQvtGA0LgKK9C00L7RgdC10LPQsAor0LTQvtGB0YLQsAor0LUKK9C10LTQstCwCivQtdC00LjQvQor0LXRgtC+CivQt9CwCivQt9Cw0LQKK9C30LDQtdC00L3Qvgor0LfQsNGA0LDQtNC4CivQt9Cw0YHQtdCz0LAKK9C30LDRgtC+0LLQsAor0LfQsNGJ0L4KK9C30LDRidC+0YLQvgor0LgKK9C40LcKK9C40LvQuAor0LjQvAor0LjQvNCwCivQuNC80LDRggor0LjRgdC60LAKK9C5CivQutCw0LfQsAor0LrQsNC6CivQutCw0LrQstCwCivQutCw0LrQstC+CivQutCw0LrRgtC+CivQutCw0LrRitCyCivQutCw0YLQvgor0LrQvtCz0LAKK9C60L7Qs9Cw0YLQvgor0LrQvtC10YLQvgor0LrQvtC40YLQvgor0LrQvtC5CivQutC+0LnRgtC+CivQutC+0LvQutC+CivQutC+0Y/RgtC+CivQutGK0LTQtQor0LrRitC00LXRgtC+CivQutGK0LwKK9C70LgKK9C8CivQvNC1CivQvNC10LbQtNGDCivQvNC10L0KK9C80LgKK9C80L3QvtC30LjQvdCwCivQvNC+0LPQsAor0LzQvtCz0LDRggor0LzQvtC20LUKK9C80L7Qu9GPCivQvNC+0LzQtdC90YLQsAor0LzRgwor0L0KK9C90LAKK9C90LDQtAor0L3QsNC30LDQtAor0L3QsNC5CivQvdCw0L/RgNCw0LLQuAor0L3QsNC/0YDQtdC0CivQvdCw0L/RgNC40LzQtdGACivQvdCw0YEKK9C90LUKK9C90LXQs9C+CivQvdC10Y8KK9C90LgKK9C90LjQtQor0L3QuNC60L7QuQor0L3QuNGC0L4KK9C90L4KK9C90Y/QutC+0LgKK9C90Y/QutC+0LkKK9C90Y/QvNCwCivQvtCx0LDRh9C1CivQvtC60L7Qu9C+CivQvtGB0LLQtdC9CivQvtGB0L7QsdC10L3Qvgor0L7Rggor0L7RgtCz0L7RgNC1CivQvtGC0L3QvtCy0L4KK9C+0YnQtQor0L/QsNC6CivQv9C+CivQv9C+0LLQtdGH0LUKK9C/0L7QstC10YfQtdGC0L4KK9C/0L7QtAor0L/QvtC90LUKK9C/0L7RgNCw0LTQuAor0L/QvtGB0LvQtQor0L/QvtGH0YLQuAor0L/RgNCw0LLQuAor0L/RgNC10LQKK9C/0YDQtdC00LgKK9C/0YDQtdC3CivQv9GA0LgKK9C/0YrQugor0L/RitGA0LLQvgor0YEKK9GB0LAKK9GB0LDQvNC+CivRgdC1CivRgdC10LPQsAor0YHQuAor0YHQutC+0YDQvgor0YHQu9C10LQKK9GB0LzQtQor0YHQv9C+0YDQtdC0CivRgdGA0LXQtAor0YHRgNC10YnRgwor0YHRgtC1CivRgdGK0LwKK9GB0YrRgQor0YHRitGJ0L4KK9GCCivRgtCw0LfQuAor0YLQsNC60LAKK9GC0LDQutC40LLQsAor0YLQsNC60YrQsgor0YLQsNC8CivRgtCy0L7QuQor0YLQtQor0YLQtdC30LgKK9GC0LgKK9GC0L0KK9GC0L4KK9GC0L7QstCwCivRgtC+0LPQsNCy0LAKK9GC0L7Qt9C4CivRgtC+0LkKK9GC0L7Qu9C60L7QstCwCivRgtC+0YfQvdC+CivRgtGA0Y/QsdCy0LAKK9GC0YPQugor0YLRitC5CivRgtGPCivRgtGP0YUKK9GDCivRhdCw0YDQtdGB0LLQsAor0YcKK9GH0LUKK9GH0LXRgdGC0L4KK9GH0YDQtdC3CivRidC1CivRidC+0LwKK9GPCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19jYS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19jYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhNjVkZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2NhLnR4dApAQCAtMCwwICsxLDIyMCBAQAorIyBDYXRhbGFuIHN0b3B3b3JkcyBmcm9tIGh0dHA6Ly9naXRodWIuY29tL3ZjbC9jdWUubGFuZ3VhZ2UgKEFwYWNoZSAyIExpY2Vuc2VkKQorYQorYWJhbnMKK2Fjw60KK2FoCithaXjDrQorYWl4w7IKK2FsCithbHMKK2FsZXNob3JlcworYWxndW4KK2FsZ3VuYQorYWxndW5lcworYWxndW5zCithbGhvcmEKK2FsbMOgCithbGzDrQorYWxsw7IKK2FsdHJhCithbHRyZQorYWx0cmVzCithbWIKK2FtYmTDs3MKK2FtYmR1ZXMKK2FwYQorYXF1ZWxsCithcXVlbGxhCithcXVlbGxlcworYXF1ZWxscworYXF1ZXN0CithcXVlc3RhCithcXVlc3RlcworYXF1ZXN0cworYXF1w60KK2JhaXgKK2NhZGEKK2NhZGFzY8O6CitjYWRhc2N1bmEKK2NhZGFzY3VuZXMKK2NhZGFzY3VucworY29tCitjb250cmEKK2QndW4KK2QndW5hCitkJ3VuZXMKK2QndW5zCitkYWx0CitkZQorZGVsCitkZWxzCitkZXMKK2Rlc3Byw6lzCitkaW5zCitkaW50cmUKK2RvbmF0Citkb25jcworZHVyYW50CitlCitlaAorZWwKK2VscworZW0KK2VuCitlbmNhcmEKK2VucworZW50cmUKK8OpcmVtCitlcmVuCivDqXJldQorZXMKK8OpcworZXN0YQorZXN0w6AKK2VzdMOgdmVtCitlc3RhdmVuCitlc3TDoHZldQorZXN0ZXUKK2V0CitldGMKK2V0cworZmlucworZm9yYQorZ2FpcmViw6kKK2hhCitoYW4KK2hhcworaGF2aWEKK2hlCitoZW0KK2hldQoraGkgCitobworaQoraWd1YWwKK2lndWFscworamEKK2wnaGkKK2xhCitsZXMKK2xpCitsaSduCitsbGF2b3JzCittJ2hlCittYQorbWFsCittYWxncmF0CittYXRlaXgKK21hdGVpeGEKK21hdGVpeGVzCittYXRlaXhvcworbWUKK21lbnRyZQorbcOpcworbWV1CittZXVzCittZXZhCittZXZlcworbW9sdAorbW9sdGEKK21vbHRlcworbW9sdHMKK21vbgorbW9ucworbidoZQorbidoaQorbmUKK25pCitubworbm9nZW5zbWVueXMKK25vbcOpcworbm9zYWx0cmVzCitub3N0cmEKK25vc3RyZQorbm9zdHJlcworbworb2gKK29pCitvbgorcGFzCitwZWwKK3BlbHMKK3BlcgorcGVyw7IKK3BlcnF1w6gKK3BvYyAKK3BvY2EKK3BvY3MKK3BvcXVlcworcG90c2VyCitwcm9waQorcXVhbAorcXVhbHMKK3F1YW4KK3F1YW50IAorcXVlCitxdcOoCitxdWVsY29tCitxdWkKK3F1aW4KK3F1aW5hCitxdWluZXMKK3F1aW5zCitzJ2hhCitzJ2hhbgorc2EKK3NlbWJsYW50CitzZW1ibGFudHMKK3Nlcworc2V1IAorc2V1cworc2V2YQorc2V2YQorc2V2ZXMKK3NpCitzb2JyZQorc29icmV0b3QKK3PDs2MKK3NvbGFtZW50Citzb2xzCitzb24gCitzw7NuCitzb25zIAorc290YQorc291Cit0J2hhCit0J2hhbgordCdoZQordGEKK3RhbAordGFtYsOpCit0YW1wb2MKK3RhbgordGFudAordGFudGEKK3RhbnRlcwordGV1Cit0ZXVzCit0ZXZhCit0ZXZlcwordG9uCit0b25zCit0b3QKK3RvdGEKK3RvdGVzCit0b3RzCit1bgordW5hCit1bmVzCit1bnMKK3VzCit2YQordmFpZwordmFtCit2YW4KK3ZhcwordmV1Cit2b3NhbHRyZXMKK3Zvc3RyYQordm9zdHJlCit2b3N0cmVzCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19ja2IudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfY2tiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FiZjExCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfY2tiLnR4dApAQCAtMCwwICsxLDEzNiBAQAorIyBzZXQgb2Yga3VyZGlzaCBzdG9wd29yZHMKKyMgbm90ZSB0aGVzZSBoYXZlIGJlZW4gbm9ybWFsaXplZCB3aXRoIG91ciBzY2hlbWUgKGUgcmVwcmVzZW50ZWQgd2l0aCBVKzA2RDUsIGV0YykKKyMgY29uc3RydWN0ZWQgZnJvbToKKyMgKiBGaWcgNSBvZiAiQnVpbGRpbmcgQSBUZXN0IENvbGxlY3Rpb24gRm9yIFNvcmFuaSBLdXJkaXNoIiAoRXNtYWlsaSBldCBhbCkKKyMgKiAiU29yYW5pIEt1cmRpc2g6IEEgUmVmZXJlbmNlIEdyYW1tYXIgd2l0aCBzZWxlY3RlZCByZWFkaW5ncyIgKFRoYWNrc3RvbikKKyMgKiBDb3JwdXMtYmFzZWQgYW5hbHlzaXMgb2YgNzdNIHdvcmQgU29yYW5pIGNvbGxlY3Rpb246IHdpa2lwZWRpYSwgbmV3cywgYmxvZ3MsIGV0YworCisjIGFuZAor2YgKKyMgd2hpY2gKK9qp25UKKyMgb2YKK9uMCisjIG1hZGUvZGlkCivaqdix2K8KKyMgdGhhdC93aGljaAor2KbbldmI25XbjAorIyBvbi9oZWFkCivYs9uV2LEKKyMgdHdvCivYr9mI2YgKKyMgYWxzbwor2Yfbldix2YjbldmH2KcKKyMgZnJvbS90aGF0CivZhNuV2YgKKyMgbWFrZXMvZG9lcwor2K/bldqp2KfYqgorIyBzb21lCivahtuV2YbYrworIyBldmVyeQor2YfbldixCisKKyMgZGVtb25zdHJhdGl2ZXMKKyMgdGhhdAor2KbbldmICisjIHRoaXMKK9im25XZhQorCisjIHBlcnNvbmFsIHByb25vdW5zCisjIEkKK9mF2YYKKyMgd2UKK9im247ZhduVCisjIHlvdQor2KrbhgorIyB5b3UKK9im247ZiNuVCisjIGhlL3NoZS9pdAor2KbbldmICisjIHRoZXkKK9im25XZiNin2YYKKworIyBwcmVwb3NpdGlvbnMKKyMgdG8vd2l0aC9ieQor2KjblQor2b7bjgorIyB3aXRob3V0CivYqNuV2KjbjgorIyBhbG9uZyB3aXRoL3doaWxlL2R1cmluZwor2Kjbldiv25XZhQorIyBpbiB0aGUgb3BpbmlvbiBvZgor2KjbldmE2KfbjAorIyBhY2NvcmRpbmcgdG8KK9io25XZvtuO24wKKyMgYmVmb3JlCivYqNuV2LHZhNuVCisjIGluIHRoZSBkaXJlY3Rpb24gb2YKK9io25XYsduV2YjbjAorIyBpbiBmcm9udCBvZi90b3dhcmQKK9io25XYsduV2YjblQorIyBiZWZvcmUvaW4gdGhlIGZhY2Ugb2YKK9io25XYsdiv25XZhQorIyB3aXRob3V0CivYqNuOCisjIGV4Y2VwdCBmb3IKK9io247YrNqv25UKKyMgZm9yCivYqNuGCisjIG9uL2luCivYr9uVCivYqtuOCisjIHdpdGgKK9iv25Xar9uV2rUKKyMgYWZ0ZXIKK9iv2YjYp9uMCisjIGV4Y2VwdCBmb3IvYXNpZGUgZnJvbQor2Kzar9uVCisjIGluL2Zyb20KK9mE25UKK9mE244KKyMgaW4gZnJvbnQgb2YvYmVmb3JlL2JlY2F1c2Ugb2YKK9mE25XYqNuV2LEKKyMgYmV0d2Vlbi9hbW9uZwor2YTbldio25XbjNmG24wKKyMgY29uY2VybmluZy9hYm91dAor2YTbldio2KfYqNuV2KoKKyMgY29uY2VybmluZwor2YTbldio2KfYsduV24wKKyMgaW5zdGVhZCBvZgor2YTbldio2KfYqtuMCisjIGJlc2lkZQor2YTbldio2YYKKyMgaW5zdGVhZCBvZgor2YTbldio2LHbjtiq24wKKyMgYmVoaW5kCivZhNuV2K/bldmFCisjIHdpdGgvdG9nZXRoZXIgd2l0aAor2YTbldqv25XatQorIyBieQor2YTbldmE2KfbjNuV2YYKKyMgd2l0aGluCivZhNuV2YbYp9mICisjIGJldHdlZW4vYW1vbmcKK9mE25XZhtuO2YgKKyMgZm9yIHRoZSBzYWtlIG9mCivZhNuV2b7bjtmG2KfZiNuMCisjIHdpdGggcmVzcGVjdCB0bwor2YTbldix25XZiNuMCisjIGJ5IG1lYW5zIG9mL2Zvcgor2YTbldix244KKyMgZm9yIHRoZSBzYWtlIG9mCivZhNuV2LHbjtqv2KcKKyMgb24vb24gdG9wIG9mL2FjY29yZGluZyB0bwor2YTbldiz25XYsQorIyB1bmRlcgor2YTbldqY247YsQorIyBiZXR3ZWVuL2Ftb25nCivZhtin2YgKKyMgYmV0d2Vlbi9hbW9uZwor2YbbjtmI2KfZhgorIyBhZnRlcgor2b7Yp9i0CisjIGJlZm9yZQor2b7bjti0CisjIGxpa2UKK9mI25XaqQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfY3oudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfY3oudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzYwOTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19jei50eHQKQEAgLTAsMCArMSwxNzIgQEAKK2EKK3MKK2sKK28KK2kKK3UKK3YKK3oKK2RuZXMKK2N6Cit0w61tdG8KK2J1ZGXFoQorYnVkZW0KK2J5bGkKK2pzZcWhCittxa9qCitzdsO9bQordGEKK3RvbXRvCit0b2hsZQordHV0bwordHl0bworamVqCit6ZGEKK3Byb8SNCittw6F0ZQordGF0bwora2FtCit0b2hvdG8KK2tkbwora3RlxZnDrQorbWkKK27DoW0KK3RvbQordG9tdXRvCittw610CituaWMKK3Byb3RvCitrdGVyb3UKK2J5bGEKK3RvaG8KK3Byb3Rvxb5lCithc2kKK2hvCituYcWhaQorbmFwacWhdGUKK3JlCitjb8W+Cit0w61tCit0YWvFvmUKK3N2w71jaAoramVqw60KK3N2w71taQoranN0ZQorYWoKK3R1Cit0ZWR5Cit0ZXRvCitieWxvCitrZGUKK2tlCitwcmF2w6kKK2ppCituYWQKK25lanNvdQorxI1pCitwb2QKK3TDqW1hCittZXppCitwxZllcwordHkKK3BhawordsOhbQorYW5pCitrZHnFvgordsWhYWsKK25lZworanNlbQordGVudG8KK8SNbMOhbmt1CivEjWzDoW5reQorYWJ5Citqc21lCitwxZllZAorcHRhCitqZWppY2gKK2J5bAoramXFoXTEmworYcW+CitiZXoKK3Rha8OpCitwb3V6ZQorcHJ2bsOtCit2YcWhZQora3RlcsOhCituw6FzCitub3bDvQordGlweQorcG9rdWQKK23Fr8W+ZQorc3RyYW5hCitqZWhvCitzdsOpCitqaW7DqQorenByw6F2eQorbm92w6kKK25lbsOtCit2w6FzCitqZW4KK3BvZGxlCit6ZGUKK3XFvgorYsO9dAordsOtY2UKK2J1ZGUKK2ppxb4KK25lxb4KK2t0ZXLDvQorYnkKK2t0ZXLDqQorY28KK25lYm8KK3RlbgordGFrCittw6EKK3DFmWkKK29kCitwbworanNvdQoramFrCitkYWzFocOtCithbGUKK3NpCitzZQordmUKK3RvCitqYWtvCit6YQorenDEm3QKK3plCitkbworcHJvCitqZQorbmEKK2F0ZAorYXRwCitqYWttaWxlCitwxZlpxI1lbcW+Citqw6EKK29uCitvbmEKK29ubworb25pCitvbnkKK215Cit2eQorasOtCitqaQorbcSbCittbmUKK2plbXUKK3RvbXUKK3TEm20KK3TEm211CituxJttdQorbsSbbXXFvgoramVob8W+Citqw63FvgoramVsaWtvxb4KK2plxb4KK2pha2/FvgorbmHEjWXFvgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZGEudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTYxNDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19kYS50eHQKQEAgLTAsMCArMSwxMTAgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZGFuaXNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBEYW5pc2ggc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworIHwgVGhpcyBpcyBhIHJhbmtlZCBsaXN0IChjb21tb25lc3QgdG8gcmFyZXN0KSBvZiBzdG9wd29yZHMgZGVyaXZlZCBmcm9tCisgfCBhIGxhcmdlIHRleHQgc2FtcGxlLgorCisKK29nICAgICAgICAgICB8IGFuZAoraSAgICAgICAgICAgIHwgaW4KK2plZyAgICAgICAgICB8IEkKK2RldCAgICAgICAgICB8IHRoYXQgKGRlbS4gcHJvbm91bikvaXQgKHBlcnMuIHByb25vdW4pCithdCAgICAgICAgICAgfCB0aGF0IChpbiBmcm9udCBvZiBhIHNlbnRlbmNlKS90byAod2l0aCBpbmZpbml0aXZlKQorZW4gICAgICAgICAgIHwgYS9hbgorZGVuICAgICAgICAgIHwgaXQgKHBlcnMuIHByb25vdW4pL3RoYXQgKGRlbS4gcHJvbm91bikKK3RpbCAgICAgICAgICB8IHRvL2F0L2Zvci91bnRpbC9hZ2FpbnN0L2J5L29mL2ludG8sIG1vcmUKK2VyICAgICAgICAgICB8IHByZXNlbnQgdGVuc2Ugb2YgInRvIGJlIgorc29tICAgICAgICAgIHwgd2hvLCBhcworcMOlICAgICAgICAgICB8IG9uL3Vwb24vaW4vb24vYXQvdG8vYWZ0ZXIvb2Yvd2l0aC9mb3IsIG9uCitkZSAgICAgICAgICAgfCB0aGV5CittZWQgICAgICAgICAgfCB3aXRoL2J5L2luLCBhbG9uZworaGFuICAgICAgICAgIHwgaGUKK2FmICAgICAgICAgICB8IG9mL2J5L2Zyb20vb2ZmL2Zvci9pbi93aXRoL29uLCBvZmYKK2ZvciAgICAgICAgICB8IGF0L2Zvci90by9mcm9tL2J5L29mL2FnbywgaW4gZnJvbnQvYmVmb3JlLCBiZWNhdXNlCitpa2tlICAgICAgICAgfCBub3QKK2RlciAgICAgICAgICB8IHdoby93aGljaCwgdGhlcmUvdGhvc2UKK3ZhciAgICAgICAgICB8IHBhc3QgdGVuc2Ugb2YgInRvIGJlIgorbWlnICAgICAgICAgIHwgbWUvbXlzZWxmCitzaWcgICAgICAgICAgfCBvbmVzZWxmL2hpbXNlbGYvaGVyc2VsZi9pdHNlbGYvdGhlbXNlbHZlcworbWVuICAgICAgICAgIHwgYnV0CitldCAgICAgICAgICAgfCBhL2FuL29uZSwgb25lIChudW1iZXIpLCBzb21lb25lL3NvbWVib2R5L29uZQoraGFyICAgICAgICAgIHwgcHJlc2VudCB0ZW5zZSBvZiAidG8gaGF2ZSIKK29tICAgICAgICAgICB8IHJvdW5kL2Fib3V0L2Zvci9pbi9hLCBhYm91dC9hcm91bmQvZG93biwgaWYKK3ZpICAgICAgICAgICB8IHdlCittaW4gICAgICAgICAgfCBteQoraGF2ZGUgICAgICAgIHwgcGFzdCB0ZW5zZSBvZiAidG8gaGF2ZSIKK2hhbSAgICAgICAgICB8IGhpbQoraHVuICAgICAgICAgIHwgc2hlCitudSAgICAgICAgICAgfCBub3cKK292ZXIgICAgICAgICB8IG92ZXIvYWJvdmUvYWNyb3NzL2J5L2JleW9uZC9wYXN0L29uL2Fib3V0LCBvdmVyL3Bhc3QKK2RhICAgICAgICAgICB8IHRoZW4sIHdoZW4vYXMvc2luY2UKK2ZyYSAgICAgICAgICB8IGZyb20vb2ZmL3NpbmNlLCBvZmYsIHNpbmNlCitkdSAgICAgICAgICAgfCB5b3UKK3VkICAgICAgICAgICB8IG91dAorc2luICAgICAgICAgIHwgaGlzL2hlci9pdHMvb25lJ3MKK2RlbSAgICAgICAgICB8IHRoZW0KK29zICAgICAgICAgICB8IHVzL291cnNlbHZlcworb3AgICAgICAgICAgIHwgdXAKK21hbiAgICAgICAgICB8IHlvdS9vbmUKK2hhbnMgICAgICAgICB8IGhpcworaHZvciAgICAgICAgIHwgd2hlcmUKK2VsbGVyICAgICAgICB8IG9yCitodmFkICAgICAgICAgfCB3aGF0Citza2FsICAgICAgICAgfCBtdXN0L3NoYWxsIGV0Yy4KK3NlbHYgICAgICAgICB8IG15c2VsZi95b3VzZWxmL2hlcnNlbGYvb3Vyc2VsdmVzIGV0Yy4sIGV2ZW4KK2hlciAgICAgICAgICB8IGhlcmUKK2FsbGUgICAgICAgICB8IGFsbC9ldmVyeW9uZS9ldmVyeWJvZHkgZXRjLgordmlsICAgICAgICAgIHwgd2lsbCAodmVyYikKK2JsZXYgICAgICAgICB8IHBhc3QgdGVuc2Ugb2YgInRvIHN0YXkvdG8gcmVtYWluL3RvIGdldC90byBiZWNvbWUiCitrdW5uZSAgICAgICAgfCBjb3VsZAoraW5kICAgICAgICAgIHwgaW4KK27DpXIgICAgICAgICAgfCB3aGVuCit2w6ZyZSAgICAgICAgIHwgcHJlc2VudCB0ZW5zZSBvZiAidG8gYmUiCitkb2cgICAgICAgICAgfCBob3dldmVyL3lldC9hZnRlciBhbGwKK25vZ2V0ICAgICAgICB8IHNvbWV0aGluZwordmlsbGUgICAgICAgIHwgd291bGQKK2pvICAgICAgICAgICB8IHlvdSBrbm93L3lvdSBzZWUgKGFkdiksIHllcworZGVyZXMgICAgICAgIHwgdGhlaXIvdGhlaXJzCitlZnRlciAgICAgICAgfCBhZnRlci9iZWhpbmQvYWNjb3JkaW5nIHRvL2Zvci9ieS9mcm9tLCBsYXRlci9hZnRlcndhcmRzCituZWQgICAgICAgICAgfCBkb3duCitza3VsbGUgICAgICAgfCBzaG91bGQKK2Rlbm5lICAgICAgICB8IHRoaXMKK2VuZCAgICAgICAgICB8IHRoYW4KK2RldHRlICAgICAgICB8IHRoaXMKK21pdCAgICAgICAgICB8IG15L21pbmUKK29nc8OlICAgICAgICAgfCBhbHNvCit1bmRlciAgICAgICAgfCB1bmRlci9iZW5lYXRoL2JlbG93L2R1cmluZywgYmVsb3cvdW5kZXJuZWF0aAoraGF2ZSAgICAgICAgIHwgaGF2ZQorZGlnICAgICAgICAgIHwgeW91CithbmRlbiAgICAgICAgfCBvdGhlcgoraGVuZGUgICAgICAgIHwgaGVyCittaW5lICAgICAgICAgfCBteQorYWx0ICAgICAgICAgIHwgZXZlcnl0aGluZworbWVnZXQgICAgICAgIHwgbXVjaC92ZXJ5LCBwbGVudHkgb2YKK3NpdCAgICAgICAgICB8IGhpcywgaGVyLCBpdHMsIG9uZSdzCitzaW5lICAgICAgICAgfCBoaXMsIGhlciwgaXRzLCBvbmUncwordm9yICAgICAgICAgIHwgb3VyCittb2QgICAgICAgICAgfCBhZ2FpbnN0CitkaXNzZSAgICAgICAgfCB0aGVzZQoraHZpcyAgICAgICAgIHwgaWYKK2RpbiAgICAgICAgICB8IHlvdXIveW91cnMKK25vZ2xlICAgICAgICB8IHNvbWUKK2hvcyAgICAgICAgICB8IGJ5L2F0CitibGl2ZSAgICAgICAgfCBiZS9iZWNvbWUKK21hbmdlICAgICAgICB8IG1hbnkKK2FkICAgICAgICAgICB8IGJ5L3Rocm91Z2gKK2JsaXZlciAgICAgICB8IHByZXNlbnQgdGVuc2Ugb2YgInRvIGJlL3RvIGJlY29tZSIKK2hlbmRlcyAgICAgICB8IGhlci9oZXJzCit2w6ZyZXQgICAgICAgIHwgYmUKK3RoaSAgICAgICAgICB8IGZvciAoY29uaikKK2plciAgICAgICAgICB8IHlvdQorc8OlZGFuICAgICAgICB8IHN1Y2gsIGxpa2UgdGhpcy9saWtlIHRoYXQKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2RlLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjUyNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZGUudHh0CkBAIC0wLDAgKzEsMjk0IEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2dlcm1hbi9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IEEgR2VybWFuIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyB8IFRoZSBudW1iZXIgb2YgZm9ybXMgaW4gdGhpcyBsaXN0IGlzIHJlZHVjZWQgc2lnbmlmaWNhbnRseSBieSBwYXNzaW5nIGl0CisgfCB0aHJvdWdoIHRoZSBHZXJtYW4gc3RlbW1lci4KKworCithYmVyICAgICAgICAgICB8ICBidXQKKworYWxsZSAgICAgICAgICAgfCAgYWxsCithbGxlbQorYWxsZW4KK2FsbGVyCithbGxlcworCithbHMgICAgICAgICAgICB8ICB0aGFuLCBhcworYWxzbyAgICAgICAgICAgfCAgc28KK2FtICAgICAgICAgICAgIHwgIGFuICsgZGVtCithbiAgICAgICAgICAgICB8ICBhdAorCithbmRlciAgICAgICAgICB8ICBvdGhlcgorYW5kZXJlCithbmRlcmVtCithbmRlcmVuCithbmRlcmVyCithbmRlcmVzCithbmRlcm0KK2FuZGVybgorYW5kZXJyCithbmRlcnMKKworYXVjaCAgICAgICAgICAgfCAgYWxzbworYXVmICAgICAgICAgICAgfCAgb24KK2F1cyAgICAgICAgICAgIHwgIG91dCBvZgorYmVpICAgICAgICAgICAgfCAgYnkKK2JpbiAgICAgICAgICAgIHwgIGFtCitiaXMgICAgICAgICAgICB8ICB1bnRpbAorYmlzdCAgICAgICAgICAgfCAgYXJ0CitkYSAgICAgICAgICAgICB8ICB0aGVyZQorZGFtaXQgICAgICAgICAgfCAgd2l0aCBpdAorZGFubiAgICAgICAgICAgfCAgdGhlbgorCitkZXIgICAgICAgICAgICB8ICB0aGUKK2RlbgorZGVzCitkZW0KK2RpZQorZGFzCisKK2Rhw58gICAgICAgICAgICB8ICB0aGF0CisKK2RlcnNlbGJlICAgICAgIHwgIHRoZSBzYW1lCitkZXJzZWxiZW4KK2RlbnNlbGJlbgorZGVzc2VsYmVuCitkZW1zZWxiZW4KK2RpZXNlbGJlCitkaWVzZWxiZW4KK2Rhc3NlbGJlCisKK2RhenUgICAgICAgICAgIHwgIHRvIHRoYXQKKworZGVpbiAgICAgICAgICAgfCAgdGh5CitkZWluZQorZGVpbmVtCitkZWluZW4KK2RlaW5lcgorZGVpbmVzCisKK2Rlbm4gICAgICAgICAgIHwgIGJlY2F1c2UKKworZGVyZXIgICAgICAgICAgfCAgb2YgdGhvc2UKK2Rlc3NlbiAgICAgICAgIHwgIG9mIGhpbQorCitkaWNoICAgICAgICAgICB8ICB0aGVlCitkaXIgICAgICAgICAgICB8ICB0byB0aGVlCitkdSAgICAgICAgICAgICB8ICB0aG91CisKK2RpZXMgICAgICAgICAgIHwgIHRoaXMKK2RpZXNlCitkaWVzZW0KK2RpZXNlbgorZGllc2VyCitkaWVzZXMKKworCitkb2NoICAgICAgICAgICB8ICAoc2V2ZXJhbCBtZWFuaW5ncykKK2RvcnQgICAgICAgICAgIHwgIChvdmVyKSB0aGVyZQorCisKK2R1cmNoICAgICAgICAgIHwgIHRocm91Z2gKKworZWluICAgICAgICAgICAgfCAgYQorZWluZQorZWluZW0KK2VpbmVuCitlaW5lcgorZWluZXMKKworZWluaWcgICAgICAgICAgfCAgc29tZQorZWluaWdlCitlaW5pZ2VtCitlaW5pZ2VuCitlaW5pZ2VyCitlaW5pZ2VzCisKK2Vpbm1hbCAgICAgICAgIHwgIG9uY2UKKworZXIgICAgICAgICAgICAgfCAgaGUKK2lobiAgICAgICAgICAgIHwgIGhpbQoraWhtICAgICAgICAgICAgfCAgdG8gaGltCisKK2VzICAgICAgICAgICAgIHwgIGl0CitldHdhcyAgICAgICAgICB8ICBzb21ldGhpbmcKKworZXVlciAgICAgICAgICAgfCAgeW91cgorZXVyZQorZXVyZW0KK2V1cmVuCitldXJlcgorZXVyZXMKKworZsO8ciAgICAgICAgICAgIHwgIGZvcgorZ2VnZW4gICAgICAgICAgfCAgdG93YXJkcworZ2V3ZXNlbiAgICAgICAgfCAgcC5wLiBvZiBzZWluCitoYWIgICAgICAgICAgICB8ICBoYXZlCitoYWJlICAgICAgICAgICB8ICBoYXZlCitoYWJlbiAgICAgICAgICB8ICBoYXZlCitoYXQgICAgICAgICAgICB8ICBoYXMKK2hhdHRlICAgICAgICAgIHwgIGhhZAoraGF0dGVuICAgICAgICAgfCAgaGFkCitoaWVyICAgICAgICAgICB8ICBoZXJlCitoaW4gICAgICAgICAgICB8ICB0aGVyZQoraGludGVyICAgICAgICAgfCAgYmVoaW5kCisKK2ljaCAgICAgICAgICAgIHwgIEkKK21pY2ggICAgICAgICAgIHwgIG1lCittaXIgICAgICAgICAgICB8ICB0byBtZQorCisKK2lociAgICAgICAgICAgIHwgIHlvdSwgdG8gaGVyCitpaHJlCitpaHJlbQoraWhyZW4KK2locmVyCitpaHJlcworZXVjaCAgICAgICAgICAgfCAgdG8geW91CisKK2ltICAgICAgICAgICAgIHwgIGluICsgZGVtCitpbiAgICAgICAgICAgICB8ICBpbgoraW5kZW0gICAgICAgICAgfCAgd2hpbGUKK2lucyAgICAgICAgICAgIHwgIGluICsgZGFzCitpc3QgICAgICAgICAgICB8ICBpcworCitqZWRlICAgICAgICAgICB8ICBlYWNoLCBldmVyeQoramVkZW0KK2plZGVuCitqZWRlcgoramVkZXMKKworamVuZSAgICAgICAgICAgfCAgdGhhdAoramVuZW0KK2plbmVuCitqZW5lcgoramVuZXMKKworamV0enQgICAgICAgICAgfCAgbm93CitrYW5uICAgICAgICAgICB8ICBjYW4KKwora2VpbiAgICAgICAgICAgfCAgbm8KK2tlaW5lCitrZWluZW0KK2tlaW5lbgora2VpbmVyCitrZWluZXMKKwora8O2bm5lbiAgICAgICAgIHwgIGNhbgora8O2bm50ZSAgICAgICAgIHwgIGNvdWxkCittYWNoZW4gICAgICAgICB8ICBkbworbWFuICAgICAgICAgICAgfCAgb25lCisKK21hbmNoZSAgICAgICAgIHwgIHNvbWUsIG1hbnkgYQorbWFuY2hlbQorbWFuY2hlbgorbWFuY2hlcgorbWFuY2hlcworCittZWluICAgICAgICAgICB8ICBteQorbWVpbmUKK21laW5lbQorbWVpbmVuCittZWluZXIKK21laW5lcworCittaXQgICAgICAgICAgICB8ICB3aXRoCittdXNzICAgICAgICAgICB8ICBtdXN0CittdXNzdGUgICAgICAgICB8ICBoYWQgdG8KK25hY2ggICAgICAgICAgIHwgIHRvKHdhcmRzKQorbmljaHQgICAgICAgICAgfCAgbm90CituaWNodHMgICAgICAgICB8ICBub3RoaW5nCitub2NoICAgICAgICAgICB8ICBzdGlsbCwgeWV0CitudW4gICAgICAgICAgICB8ICBub3cKK251ciAgICAgICAgICAgIHwgIG9ubHkKK29iICAgICAgICAgICAgIHwgIHdoZXRoZXIKK29kZXIgICAgICAgICAgIHwgIG9yCitvaG5lICAgICAgICAgICB8ICB3aXRob3V0CitzZWhyICAgICAgICAgICB8ICB2ZXJ5CisKK3NlaW4gICAgICAgICAgIHwgIGhpcworc2VpbmUKK3NlaW5lbQorc2VpbmVuCitzZWluZXIKK3NlaW5lcworCitzZWxic3QgICAgICAgICB8ICBzZWxmCitzaWNoICAgICAgICAgICB8ICBoZXJzZWxmCisKK3NpZSAgICAgICAgICAgIHwgIHRoZXksIHNoZQoraWhuZW4gICAgICAgICAgfCAgdG8gdGhlbQorCitzaW5kICAgICAgICAgICB8ICBhcmUKK3NvICAgICAgICAgICAgIHwgIHNvCisKK3NvbGNoZSAgICAgICAgIHwgIHN1Y2gKK3NvbGNoZW0KK3NvbGNoZW4KK3NvbGNoZXIKK3NvbGNoZXMKKworc29sbCAgICAgICAgICAgfCAgc2hhbGwKK3NvbGx0ZSAgICAgICAgIHwgIHNob3VsZAorc29uZGVybiAgICAgICAgfCAgYnV0Citzb25zdCAgICAgICAgICB8ICBlbHNlCivDvGJlciAgICAgICAgICAgfCAgb3ZlcgordW0gICAgICAgICAgICAgfCAgYWJvdXQsIGFyb3VuZAordW5kICAgICAgICAgICAgfCAgYW5kCisKK3VucyAgICAgICAgICAgIHwgIHVzCit1bnNlCit1bnNlbQordW5zZW4KK3Vuc2VyCit1bnNlcworCit1bnRlciAgICAgICAgICB8ICB1bmRlcgordmllbCAgICAgICAgICAgfCAgbXVjaAordm9tICAgICAgICAgICAgfCAgdm9uICsgZGVtCit2b24gICAgICAgICAgICB8ICBmcm9tCit2b3IgICAgICAgICAgICB8ICBiZWZvcmUKK3fDpGhyZW5kICAgICAgICB8ICB3aGlsZQord2FyICAgICAgICAgICAgfCAgd2FzCit3YXJlbiAgICAgICAgICB8ICB3ZXJlCit3YXJzdCAgICAgICAgICB8ICB3YXN0Cit3YXMgICAgICAgICAgICB8ICB3aGF0Cit3ZWcgICAgICAgICAgICB8ICBhd2F5LCBvZmYKK3dlaWwgICAgICAgICAgIHwgIGJlY2F1c2UKK3dlaXRlciAgICAgICAgIHwgIGZ1cnRoZXIKKword2VsY2hlICAgICAgICAgfCAgd2hpY2gKK3dlbGNoZW0KK3dlbGNoZW4KK3dlbGNoZXIKK3dlbGNoZXMKKword2VubiAgICAgICAgICAgfCAgd2hlbgord2VyZGUgICAgICAgICAgfCAgd2lsbAord2VyZGVuICAgICAgICAgfCAgd2lsbAord2llICAgICAgICAgICAgfCAgaG93Cit3aWVkZXIgICAgICAgICB8ICBhZ2Fpbgord2lsbCAgICAgICAgICAgfCAgd2FudAord2lyICAgICAgICAgICAgfCAgd2UKK3dpcmQgICAgICAgICAgIHwgIHdpbGwKK3dpcnN0ICAgICAgICAgIHwgIHdpbGxzdAord28gICAgICAgICAgICAgfCAgd2hlcmUKK3dvbGxlbiAgICAgICAgIHwgIHdhbnQKK3dvbGx0ZSAgICAgICAgIHwgIHdhbnRlZAord8O8cmRlICAgICAgICAgIHwgIHdvdWxkCit3w7xyZGVuICAgICAgICAgfCAgd291bGQKK3p1ICAgICAgICAgICAgIHwgIHRvCit6dW0gICAgICAgICAgICB8ICB6dSArIGRlbQorenVyICAgICAgICAgICAgfCAgenUgKyBkZXIKK3p3YXIgICAgICAgICAgIHwgIGluZGVlZAorendpc2NoZW4gICAgICAgfCAgYmV0d2VlbgorCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyNjgxZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2VsLnR4dApAQCAtMCwwICsxLDc4IEBACisjIEx1Y2VuZSBHcmVlayBTdG9wd29yZHMgbGlzdAorIyBOb3RlOiBieSBkZWZhdWx0IHRoaXMgZmlsZSBpcyB1c2VkIGFmdGVyIEdyZWVrTG93ZXJDYXNlRmlsdGVyLAorIyBzbyB3aGVuIG1vZGlmeWluZyB0aGlzIGZpbGUgdXNlICfPgycgaW5zdGVhZCBvZiAnz4InIAorzr8KK863CivPhM6/CivOv865CivPhM6xCivPhM6/z4UKK8+EzrfPgworz4TPic69CivPhM6/zr0KK8+EzrfOvQorzrrOsc65IAorzrrOuQorzroKK861zrnOvM6xzrkKK861zrnPg86xzrkKK861zrnOvc6xzrkKK861zrnOvM6xz4PPhM61CivOtc65z4PPhM61CivPg8+Ezr8KK8+Dz4TOv869CivPg8+EzrcKK8+Dz4TOt869CivOvM6xCivOsc67zrvOsQorzrHPgM6/CivOs865zrEKK8+Az4HOv8+DCivOvM61CivPg861CivPic+DCivPgM6xz4HOsQorzrHOvc+EzrkKK866zrHPhM6xCivOvM61z4TOsQorzrjOsQorzr3OsQorzrTOtQorzrTOtc69CivOvM63CivOvM63zr0KK861z4DOuQorzrXOvc+JCivOtc6xzr0KK86xzr0KK8+Ezr/PhM61CivPgM6/z4UKK8+Az4nPgworz4DOv865zr/Pgworz4DOv865zrEKK8+Azr/Ouc6/CivPgM6/zrnOv865CivPgM6/zrnOtc+DCivPgM6/zrnPic69CivPgM6/zrnOv8+Fz4MKK86xz4XPhM6/z4MKK86xz4XPhM63CivOsc+Fz4TOvworzrHPhc+Ezr/OuQorzrHPhc+Ez4nOvQorzrHPhc+Ezr/Phc+DCivOsc+Fz4TOtc+DCivOsc+Fz4TOsQorzrXOus61zrnOvc6/z4MKK861zrrOtc65zr3OtworzrXOus61zrnOvc6/CivOtc66zrXOuc69zr/OuQorzrXOus61zrnOvc61z4MKK861zrrOtc65zr3OsQorzrXOus61zrnOvc+Jzr0KK861zrrOtc65zr3Ov8+Fz4MKK86/z4DPic+DCivOv868z4nPgworzrnPg8+Jz4MKK86/z4POvworzr/PhM65CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxNjRjMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2VuLnR4dApAQCAtMCwwICsxLDU0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgYSBjb3VwbGUgb2YgdGVzdCBzdG9wd29yZHMgdG8gdGVzdCB0aGF0IHRoZSB3b3JkcyBhcmUgcmVhbGx5IGJlaW5nCisjIGNvbmZpZ3VyZWQgZnJvbSB0aGlzIGZpbGU6CitzdG9wd29yZGEKK3N0b3B3b3JkYgorCisjIFN0YW5kYXJkIGVuZ2xpc2ggc3RvcCB3b3JkcyB0YWtlbiBmcm9tIEx1Y2VuZSdzIFN0b3BBbmFseXplcgorYQorYW4KK2FuZAorYXJlCithcworYXQKK2JlCitidXQKK2J5Citmb3IKK2lmCitpbgoraW50bworaXMKK2l0Citubworbm90CitvZgorb24KK29yCitzdWNoCit0aGF0Cit0aGUKK3RoZWlyCit0aGVuCit0aGVyZQordGhlc2UKK3RoZXkKK3RoaXMKK3RvCit3YXMKK3dpbGwKK3dpdGgKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2VzLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdkNzhjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZXMudHh0CkBAIC0wLDAgKzEsMzU2IEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL3NwYW5pc2gvc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorIHwKKyB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIgorCisgfCBBIFNwYW5pc2ggc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworCisgfCBUaGUgZm9sbG93aW5nIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcworIHwgZGVyaXZpbmcgZnJvbSBhIGxhcmdlIHNhbXBsZSBvZiB0ZXh0LgorCisgfCBFeHRyYSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYXQgdGhlIGVuZC4KKworZGUgICAgICAgICAgICAgfCAgZnJvbSwgb2YKK2xhICAgICAgICAgICAgIHwgIHRoZSwgaGVyCitxdWUgICAgICAgICAgICB8ICB3aG8sIHRoYXQKK2VsICAgICAgICAgICAgIHwgIHRoZQorZW4gICAgICAgICAgICAgfCAgaW4KK3kgICAgICAgICAgICAgIHwgIGFuZAorYSAgICAgICAgICAgICAgfCAgdG8KK2xvcyAgICAgICAgICAgIHwgIHRoZSwgdGhlbQorZGVsICAgICAgICAgICAgfCAgZGUgKyBlbAorc2UgICAgICAgICAgICAgfCAgaGltc2VsZiwgZnJvbSBoaW0gZXRjCitsYXMgICAgICAgICAgICB8ICB0aGUsIHRoZW0KK3BvciAgICAgICAgICAgIHwgIGZvciwgYnksIGV0YwordW4gICAgICAgICAgICAgfCAgYQorcGFyYSAgICAgICAgICAgfCAgZm9yCitjb24gICAgICAgICAgICB8ICB3aXRoCitubyAgICAgICAgICAgICB8ICBubwordW5hICAgICAgICAgICAgfCAgYQorc3UgICAgICAgICAgICAgfCAgaGlzLCBoZXIKK2FsICAgICAgICAgICAgIHwgIGEgKyBlbAorICB8IGVzICAgICAgICAgZnJvbSBTRVIKK2xvICAgICAgICAgICAgIHwgIGhpbQorY29tbyAgICAgICAgICAgfCAgaG93Cittw6FzICAgICAgICAgICAgfCAgbW9yZQorcGVybyAgICAgICAgICAgfCAgcGVybworc3VzICAgICAgICAgICAgfCAgc3UgcGx1cmFsCitsZSAgICAgICAgICAgICB8ICB0byBoaW0sIGhlcgoreWEgICAgICAgICAgICAgfCAgYWxyZWFkeQorbyAgICAgICAgICAgICAgfCAgb3IKKyAgfCBmdWUgICAgICAgIGZyb20gU0VSCitlc3RlICAgICAgICAgICB8ICB0aGlzCisgIHwgaGEgICAgICAgICBmcm9tIEhBQkVSCitzw60gICAgICAgICAgICAgfCAgaGltc2VsZiBldGMKK3BvcnF1ZSAgICAgICAgIHwgIGJlY2F1c2UKK2VzdGEgICAgICAgICAgIHwgIHRoaXMKKyAgfCBzb24gICAgICAgIGZyb20gU0VSCitlbnRyZSAgICAgICAgICB8ICBiZXR3ZWVuCisgIHwgZXN0w6EgICAgIGZyb20gRVNUQVIKK2N1YW5kbyAgICAgICAgIHwgIHdoZW4KK211eSAgICAgICAgICAgIHwgIHZlcnkKK3NpbiAgICAgICAgICAgIHwgIHdpdGhvdXQKK3NvYnJlICAgICAgICAgIHwgIG9uCisgIHwgc2VyICAgICAgICBmcm9tIFNFUgorICB8IHRpZW5lICAgICAgZnJvbSBURU5FUgordGFtYmnDqW4gICAgICAgIHwgIGFsc28KK21lICAgICAgICAgICAgIHwgIG1lCitoYXN0YSAgICAgICAgICB8ICB1bnRpbAoraGF5ICAgICAgICAgICAgfCAgdGhlcmUgaXMvYXJlCitkb25kZSAgICAgICAgICB8ICB3aGVyZQorICB8IGhhbiAgICAgICAgZnJvbSBIQUJFUgorcXVpZW4gICAgICAgICAgfCAgd2hvbSwgdGhhdAorICB8IGVzdMOhbiAgICAgIGZyb20gRVNUQVIKKyAgfCBlc3RhZG8gICAgIGZyb20gRVNUQVIKK2Rlc2RlICAgICAgICAgIHwgIGZyb20KK3RvZG8gICAgICAgICAgIHwgIGFsbAorbm9zICAgICAgICAgICAgfCAgdXMKK2R1cmFudGUgICAgICAgIHwgIGR1cmluZworICB8IGVzdGFkb3MgICAgZnJvbSBFU1RBUgordG9kb3MgICAgICAgICAgfCAgYWxsCit1bm8gICAgICAgICAgICB8ICBhCitsZXMgICAgICAgICAgICB8ICB0byB0aGVtCituaSAgICAgICAgICAgICB8ICBub3IKK2NvbnRyYSAgICAgICAgIHwgIGFnYWluc3QKK290cm9zICAgICAgICAgIHwgIG90aGVyCisgIHwgZnVlcm9uICAgICBmcm9tIFNFUgorZXNlICAgICAgICAgICAgfCAgdGhhdAorZXNvICAgICAgICAgICAgfCAgdGhhdAorICB8IGhhYsOtYSAgICAgIGZyb20gSEFCRVIKK2FudGUgICAgICAgICAgIHwgIGJlZm9yZQorZWxsb3MgICAgICAgICAgfCAgdGhleQorZSAgICAgICAgICAgICAgfCAgYW5kICh2YXJpYW50IG9mIHkpCitlc3RvICAgICAgICAgICB8ICB0aGlzCittw60gICAgICAgICAgICAgfCAgbWUKK2FudGVzICAgICAgICAgIHwgIGJlZm9yZQorYWxndW5vcyAgICAgICAgfCAgc29tZQorcXXDqSAgICAgICAgICAgIHwgIHdoYXQ/Cit1bm9zICAgICAgICAgICB8ICBhCit5byAgICAgICAgICAgICB8ICBJCitvdHJvICAgICAgICAgICB8ICBvdGhlcgorb3RyYXMgICAgICAgICAgfCAgb3RoZXIKK290cmEgICAgICAgICAgIHwgIG90aGVyCivDqWwgICAgICAgICAgICAgfCAgaGUKK3RhbnRvICAgICAgICAgIHwgIHNvIG11Y2gsIG1hbnkKK2VzYSAgICAgICAgICAgIHwgIHRoYXQKK2VzdG9zICAgICAgICAgIHwgIHRoZXNlCittdWNobyAgICAgICAgICB8ICBtdWNoLCBtYW55CitxdWllbmVzICAgICAgICB8ICB3aG8KK25hZGEgICAgICAgICAgIHwgIG5vdGhpbmcKK211Y2hvcyAgICAgICAgIHwgIG1hbnkKK2N1YWwgICAgICAgICAgIHwgIHdobworICB8IHNlYSAgICAgICAgZnJvbSBTRVIKK3BvY28gICAgICAgICAgIHwgIGZldworZWxsYSAgICAgICAgICAgfCAgc2hlCitlc3RhciAgICAgICAgICB8ICB0byBiZQorICB8IGhhYmVyICAgICAgZnJvbSBIQUJFUgorZXN0YXMgICAgICAgICAgfCAgdGhlc2UKKyAgfCBlc3RhYmEgICAgIGZyb20gRVNUQVIKKyAgfCBlc3RhbW9zICAgIGZyb20gRVNUQVIKK2FsZ3VuYXMgICAgICAgIHwgIHNvbWUKK2FsZ28gICAgICAgICAgIHwgIHNvbWV0aGluZworbm9zb3Ryb3MgICAgICAgfCAgd2UKKworICAgICAgfCBvdGhlciBmb3JtcworCittaSAgICAgICAgICAgICB8ICBtZQorbWlzICAgICAgICAgICAgfCAgbWkgcGx1cmFsCit0w7ogICAgICAgICAgICAgfCAgdGhvdQordGUgICAgICAgICAgICAgfCAgdGhlZQordGkgICAgICAgICAgICAgfCAgdGhlZQordHUgICAgICAgICAgICAgfCAgdGh5Cit0dXMgICAgICAgICAgICB8ICB0dSBwbHVyYWwKK2VsbGFzICAgICAgICAgIHwgIHRoZXkKK25vc290cmFzICAgICAgIHwgIHdlCit2b3NvdHJvcyAgICAgICB8ICB5b3UKK3Zvc290cmFzICAgICAgIHwgIHlvdQorb3MgICAgICAgICAgICAgfCAgeW91Cittw61vICAgICAgICAgICAgfCAgbWluZQorbcOtYSAgICAgICAgICAgIHwKK23DrW9zICAgICAgICAgICB8Cittw61hcyAgICAgICAgICAgfAordHV5byAgICAgICAgICAgfCAgdGhpbmUKK3R1eWEgICAgICAgICAgIHwKK3R1eW9zICAgICAgICAgIHwKK3R1eWFzICAgICAgICAgIHwKK3N1eW8gICAgICAgICAgIHwgIGhpcywgaGVycywgdGhlaXJzCitzdXlhICAgICAgICAgICB8CitzdXlvcyAgICAgICAgICB8CitzdXlhcyAgICAgICAgICB8CitudWVzdHJvICAgICAgICB8ICBvdXJzCitudWVzdHJhICAgICAgICB8CitudWVzdHJvcyAgICAgICB8CitudWVzdHJhcyAgICAgICB8Cit2dWVzdHJvICAgICAgICB8ICB5b3VycwordnVlc3RyYSAgICAgICAgfAordnVlc3Ryb3MgICAgICAgfAordnVlc3RyYXMgICAgICAgfAorZXNvcyAgICAgICAgICAgfCAgdGhvc2UKK2VzYXMgICAgICAgICAgIHwgIHRob3NlCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgZXN0YXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK2VzdG95Citlc3TDoXMKK2VzdMOhCitlc3RhbW9zCitlc3TDoWlzCitlc3TDoW4KK2VzdMOpCitlc3TDqXMKK2VzdGVtb3MKK2VzdMOpaXMKK2VzdMOpbgorZXN0YXLDqQorZXN0YXLDoXMKK2VzdGFyw6EKK2VzdGFyZW1vcworZXN0YXLDqWlzCitlc3RhcsOhbgorZXN0YXLDrWEKK2VzdGFyw61hcworZXN0YXLDrWFtb3MKK2VzdGFyw61haXMKK2VzdGFyw61hbgorZXN0YWJhCitlc3RhYmFzCitlc3TDoWJhbW9zCitlc3RhYmFpcworZXN0YWJhbgorZXN0dXZlCitlc3R1dmlzdGUKK2VzdHV2bworZXN0dXZpbW9zCitlc3R1dmlzdGVpcworZXN0dXZpZXJvbgorZXN0dXZpZXJhCitlc3R1dmllcmFzCitlc3R1dmnDqXJhbW9zCitlc3R1dmllcmFpcworZXN0dXZpZXJhbgorZXN0dXZpZXNlCitlc3R1dmllc2VzCitlc3R1dmnDqXNlbW9zCitlc3R1dmllc2VpcworZXN0dXZpZXNlbgorZXN0YW5kbworZXN0YWRvCitlc3RhZGEKK2VzdGFkb3MKK2VzdGFkYXMKK2VzdGFkCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgaGFiZXIsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgoraGUKK2hhcworaGEKK2hlbW9zCitoYWLDqWlzCitoYW4KK2hheWEKK2hheWFzCitoYXlhbW9zCitoYXnDoWlzCitoYXlhbgoraGFicsOpCitoYWJyw6FzCitoYWJyw6EKK2hhYnJlbW9zCitoYWJyw6lpcworaGFicsOhbgoraGFicsOtYQoraGFicsOtYXMKK2hhYnLDrWFtb3MKK2hhYnLDrWFpcworaGFicsOtYW4KK2hhYsOtYQoraGFiw61hcworaGFiw61hbW9zCitoYWLDrWFpcworaGFiw61hbgoraHViZQoraHViaXN0ZQoraHVibworaHViaW1vcworaHViaXN0ZWlzCitodWJpZXJvbgoraHViaWVyYQoraHViaWVyYXMKK2h1YmnDqXJhbW9zCitodWJpZXJhaXMKK2h1YmllcmFuCitodWJpZXNlCitodWJpZXNlcworaHViacOpc2Vtb3MKK2h1Ymllc2VpcworaHViaWVzZW4KK2hhYmllbmRvCitoYWJpZG8KK2hhYmlkYQoraGFiaWRvcworaGFiaWRhcworCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIHNlciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorc295CitlcmVzCitlcworc29tb3MKK3NvaXMKK3Nvbgorc2VhCitzZWFzCitzZWFtb3MKK3Nlw6Fpcworc2Vhbgorc2Vyw6kKK3NlcsOhcworc2Vyw6EKK3NlcmVtb3MKK3NlcsOpaXMKK3NlcsOhbgorc2Vyw61hCitzZXLDrWFzCitzZXLDrWFtb3MKK3NlcsOtYWlzCitzZXLDrWFuCitlcmEKK2VyYXMKK8OpcmFtb3MKK2VyYWlzCitlcmFuCitmdWkKK2Z1aXN0ZQorZnVlCitmdWltb3MKK2Z1aXN0ZWlzCitmdWVyb24KK2Z1ZXJhCitmdWVyYXMKK2Z1w6lyYW1vcworZnVlcmFpcworZnVlcmFuCitmdWVzZQorZnVlc2VzCitmdcOpc2Vtb3MKK2Z1ZXNlaXMKK2Z1ZXNlbgorc2llbmRvCitzaWRvCisgIHwgIHNlZCBhbHNvIG1lYW5zICd0aGlyc3QnCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgdGVuZXIsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgordGVuZ28KK3RpZW5lcwordGllbmUKK3RlbmVtb3MKK3RlbsOpaXMKK3RpZW5lbgordGVuZ2EKK3RlbmdhcwordGVuZ2Ftb3MKK3RlbmfDoWlzCit0ZW5nYW4KK3RlbmRyw6kKK3RlbmRyw6FzCit0ZW5kcsOhCit0ZW5kcmVtb3MKK3RlbmRyw6lpcwordGVuZHLDoW4KK3RlbmRyw61hCit0ZW5kcsOtYXMKK3RlbmRyw61hbW9zCit0ZW5kcsOtYWlzCit0ZW5kcsOtYW4KK3RlbsOtYQordGVuw61hcwordGVuw61hbW9zCit0ZW7DrWFpcwordGVuw61hbgordHV2ZQordHV2aXN0ZQordHV2bwordHV2aW1vcwordHV2aXN0ZWlzCit0dXZpZXJvbgordHV2aWVyYQordHV2aWVyYXMKK3R1dmnDqXJhbW9zCit0dXZpZXJhaXMKK3R1dmllcmFuCit0dXZpZXNlCit0dXZpZXNlcwordHV2acOpc2Vtb3MKK3R1dmllc2VpcwordHV2aWVzZW4KK3RlbmllbmRvCit0ZW5pZG8KK3RlbmlkYQordGVuaWRvcwordGVuaWRhcwordGVuZWQKKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19ldS50eHQKQEAgLTAsMCArMSw5OSBAQAorIyBleGFtcGxlIHNldCBvZiBiYXNxdWUgc3RvcHdvcmRzCithbAorYW5pdHoKK2FyYWJlcmEKK2Fza28KK2JhaW5hCitiYXQKK2JhdGVhbgorYmF0ZWsKK2JhdGkKK2JhdHp1ZWkKK2JhdHp1ZWsKK2JhdHp1ZXRhbgorYmF0enVrCitiZXJhCitiZXJhaWVrCitiZXJhdQorYmVyYXVlaworYmVyZQorYmVyb3JpCitiZXJvcmllaworYmVzdGUKK2JlemFsYQorZGEKK2RhZ28KK2RpcmEKK2RpdHUKK2R1CitkdXRlCitlZG8KK2VnaW4KK2VyZQorZXRhCitldXJhaworZXoKK2dhaW5lcmEKK2d1CitndXR4aQorZ3V6dGkKK2hhaWVpCitoYWllaworaGFpZXRhbgoraGFpbmJlc3RlCitoYWxhCitoYW4KK2hhbmRpaworaGFuZ28KK2hhcmEKK2hhcmkKK2hhcmsKK2hhcnRhbgoraGF1CitoYXVlaQoraGF1ZWsKK2hhdWV0YW4KK2hlbWVuCitoZW1lbmRpaworaGVtZW5nbworaGkKK2hvbmEKK2hvbmVrCitob25lbGEKK2hvbmV0YW4KK2hvbmkKK2hvcgoraG9yaQoraG9yaWVpCitob3JpZWsKK2hvcmlldGFuCitob3JrbworaG9ycmEKK2hvcnJlaworaG9ycmVsYQoraG9ycmV0YW4KK2hvcnJpCitob3J0aWsKK2h1cmEKK2l6YW4KK25pCitub2l6Citub2xhCitub24KK25vbmRpaworbm9uZ28KK25vcgorbm9yYQoremUKK3plaW4KK3plbgoremVuYmFpdAoremVuYmF0Cit6ZXIKK3plcmdhdGlrCit6aXJlbgoreml0dWVuCit6dQorenVlaworenVlbgorenV0ZW4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2ZhLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2ZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM2NDFjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZmEudHh0CkBAIC0wLDAgKzEsMzEzIEBACisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4KKyMgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGlzIHVzZWQgYWZ0ZXIgbm9ybWFsaXphdGlvbiwgc28gd2hlbiBhZGRpbmcgZW50cmllcworIyB0byB0aGlzIGZpbGUsIHVzZSB0aGUgYXJhYmljICfZiicgaW5zdGVhZCBvZiAn24wnCivYp9mG2KfZhgor2YbYr9in2LTYqtmHCivYs9ix2KfYs9ixCivYrtmK2KfZhwor2KfZiti02KfZhgor2YjZigor2KrYp9mD2YbZiNmGCivYqNmK2LTYqtix2YoKK9iv2YjZhQor2b7Yswor2YbYp9i02YoKK9mI2q/ZiAor2YrYpwor2K/Yp9i02KrZhtivCivYs9m+2LMKK9mH2Ybar9in2YUKK9mH2LHar9iyCivZvtmG2KwKK9mG2LTYp9mGCivYp9mF2LPYp9mECivYr9mK2q/YsQor2q/YsdmI2YfZigor2LTYr9mG2K8KK9qG2LfZiNixCivYr9mHCivZiAor2K/ZiAor2YbYrtiz2KrZitmGCivZiNmE2YoKK9qG2LHYpwor2obZhwor2YjYs9i3CivZhwor2YPYr9in2YUKK9mC2KfYqNmECivZitmDCivYsdmB2KoKK9mH2YHYqgor2YfZhdqG2YbZitmGCivYr9ixCivZh9iy2KfYsQor2KjZhNmHCivYqNmE2YoKK9i02KfZitivCivYp9mF2KcKK9i02YbYp9iz2YoKK9qv2LHZgdiq2YcKK9iv2YfYrwor2K/Yp9i02KrZhwor2K/Yp9mG2LPYqgor2K/Yp9i02KrZhgor2K7ZiNin2YfZitmFCivZhdmK2YTZitin2LHYrwor2YjZgtiq2YrZg9mHCivYp9mF2K8KK9iu2YjYp9mH2K8KK9is2LIKK9in2YjYsdiv2YcKK9i02K/Zhwor2KjZhNmD2YcKK9iu2K/Zhdin2KoKK9i02K/Zhgor2KjYsdiu2YoKK9mG2KjZiNivCivYqNiz2YrYp9ix2YoKK9is2YTZiNqv2YrYsdmKCivYrdmCCivZg9ix2K/ZhtivCivZhtmI2LnZigor2KjYudix2YoKK9mG2YPYsdiv2YcKK9mG2LjZitixCivZhtio2KfZitivCivYqNmI2K/Zhwor2KjZiNiv2YYKK9iv2KfYrwor2KfZiNix2K8KK9mH2LPYqgor2KzYp9mK2YoKK9i02YjYrwor2K/Zhtio2KfZhAor2K/Yp9iv2YcKK9io2KfZitivCivYs9in2KjZggor2YfZitqGCivZh9mF2KfZhgor2KfZhtis2KcKK9mD2YXYqtixCivZg9is2KfYs9iqCivar9ix2K/Yrwor2YPYs9mKCivYqtixCivZhdix2K/ZhQor2KrYp9mGCivYr9in2K/Zhgor2KjZiNiv2YbYrwor2LPYsdmKCivYrNiv2KcKK9mG2K/Yp9ix2YbYrwor2YXar9ixCivZitmD2K/Zitqv2LEKK9iv2KfYsdivCivYr9mH2YbYrwor2KjZhtin2KjYsdin2YrZhgor2YfZhtqv2KfZhdmKCivYs9mF2KoKK9is2KcKK9in2YbahtmHCivYrtmI2K8KK9iv2KfYr9mG2K8KK9iy2YrYp9ivCivYr9in2LHZhtivCivYp9ir2LEKK9io2K/ZiNmGCivYqNmH2KrYsdmK2YYKK9io2YrYtNiq2LEKK9in2YTYqNiq2YcKK9io2YcKK9io2LHYp9iz2KfYswor2KjZitix2YjZhgor2YPYsdivCivYqNi52LbZigor2q/YsdmB2KoKK9iq2YjZigor2KfZigor2YXZitmE2YrZiNmGCivYp9mICivYrNix2YrYp9mGCivYqtmI2YQKK9io2LEKK9mF2KfZhtmG2K8KK9io2LHYp9io2LEKK9io2KfYtNmK2YUKK9mF2K/YqtmKCivar9mI2YrZhtivCivYp9mD2YbZiNmGCivYqtinCivYqtmG2YfYpwor2KzYr9mK2K8KK9qG2YbYrwor2KjZigor2YbYtNiv2YcKK9mD2LHYr9mGCivZg9ix2K/ZhQor2q/ZiNmK2K8KK9mD2LHYr9mHCivZg9mG2YrZhQor2YbZhdmKCivZhtiy2K8KK9ix2YjZigor2YLYtdivCivZgdmC2LcKK9io2KfZhNin2YoKK9iv2Yrar9ix2KfZhgor2KfZitmGCivYr9mK2LHZiNiyCivYqtmI2LPYtwor2LPZiNmFCivYp9mK2YUKK9iv2KfZhtmG2K8KK9iz2YjZigor2KfYs9iq2YHYp9iv2YcKK9i02YXYpwor2YPZhtin2LEKK9iv2KfYsdmK2YUKK9iz2KfYrtiq2YcKK9i32YjYsQor2KfZhdiv2YcKK9ix2YHYqtmHCivZhtiu2LPYqgor2KjZitiz2KoKK9mG2LLYr9mK2YMKK9i32YoKK9mD2YbZitivCivYp9iyCivYp9mG2YfYpwor2KrZhdin2YXZigor2K/Yp9i02KoKK9mK2YPZigor2LfYsdmK2YIKK9in2LQKK9qG2YrYs9iqCivYsdmI2KgKK9mG2YXYp9mK2K8KK9qv2YHYqgor2obZhtiv2YrZhgor2obZitiy2YoKK9iq2YjYp9mG2K8KK9in2YUKK9in2YrYpwor2KjYpwor2KfZhgor2KfZitivCivYqtix2YrZhgor2KfZitmG2YPZhwor2K/Zitqv2LHZigor2LHYp9mHCivZh9in2YrZigor2KjYsdmI2LIKK9mH2YXahtmG2KfZhgor2b7Yp9i52YrZhgor2YPYswor2K3Yr9mI2K8KK9mF2K7YqtmE2YEKK9mF2YLYp9io2YQKK9qG2YrYsgor2q/Zitix2K8KK9mG2K/Yp9ix2K8KK9i22K8KK9mH2YXahtmI2YYKK9iz2KfYstmKCivYtNin2YYKK9mF2YjYsdivCivYqNin2LHZhwor2YXYsdiz2YoKK9iu2YjZiti0CivYqNix2K7ZiNix2K/Yp9ixCivahtmI2YYKK9iu2KfYsdisCivYtNi0CivZh9mG2YjYsgor2KrYrdiqCivYttmF2YYKK9mH2LPYqtmK2YUKK9qv2YHYqtmHCivZgdmD2LEKK9io2LPZitin2LEKK9m+2YrYtAor2KjYsdin2YoKK9ix2YjYstmH2KfZigor2KfZhtmD2YcKK9mG2K7ZiNin2YfYrwor2KjYp9mE2KcKK9mD2YQKK9mI2YLYqtmKCivZg9mKCivahtmG2YrZhgor2YPZhwor2q/Zitix2YoKK9mG2YrYs9iqCivYp9iz2KoKK9mD2KzYpwor2YPZhtivCivZhtmK2LIKK9mK2KfYqNivCivYqNmG2K/Zigor2K3YqtmKCivYqtmI2KfZhtmG2K8KK9i52YLYqAor2K7ZiNin2LPYqgor2YPZhtmG2K8KK9io2YrZhgor2KrZhdin2YUKK9mH2YXZhwor2YXYpwor2KjYp9i02YbYrwor2YXYq9mECivYtNivCivYp9ix2YoKK9io2KfYtNivCivYp9ix2YcKK9i32KjZggor2KjYudivCivYp9qv2LEKK9i12YjYsdiqCivYutmK2LEKK9is2KfZigor2KjZiti0CivYsdmK2LLZigor2KfZhtivCivYstmK2LHYpwor2obar9mI2YbZhwor2KjYp9ixCivZhNi32YHYpwor2YXZigor2K/Ysdio2KfYsdmHCivZhdmGCivYr9mK2K/Zhwor2YfZhdmK2YYKK9qv2LDYp9ix2YoKK9io2LHYr9in2LHZigor2LnZhNiqCivar9iw2KfYtNiq2YcKK9mH2YUKK9mB2YjZggor2YbZhwor2YfYpwor2LTZiNmG2K8KK9in2KjYp9ivCivZh9mF2YjYp9ix2YcKK9mH2LEKK9in2YjZhAor2K7ZiNin2YfZhtivCivahtmH2KfYsQor2YbYp9mFCivYp9mF2LHZiNiyCivZhdin2YYKK9mH2KfZigor2YLYqNmECivZg9mG2YUKK9iz2LnZigor2KrYp9iy2YcKK9ix2KcKK9mH2LPYqtmG2K8KK9iy2YrYsQor2KzZhNmI2YoKK9i52YbZiNin2YYKK9io2YjYrwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZmkudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZmkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzJjOWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19maS50eHQKQEAgLTAsMCArMSw5NyBAQAorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9maW5uaXNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKyAKK3wgZm9ybXMgb2YgQkUKKworb2xsYQorb2xlbgorb2xldAorb24KK29sZW1tZQorb2xldHRlCitvdmF0CitvbGUgICAgICAgIHwgbmVnYXRpdmUgZm9ybQorCitvbGkKK29saXNpCitvbGlzaXQKK29saXNpbgorb2xpc2ltbWUKK29saXNpdHRlCitvbGlzaXZhdAorb2xpdAorb2xpbgorb2xpbW1lCitvbGl0dGUKK29saXZhdAorb2xsdXQKK29sbGVldAorCitlbiAgICAgICAgIHwgbmVnYXRpb24KK2V0CitlaQorZW1tZQorZXR0ZQorZWl2w6R0CisKK3xOb20gICBHZW4gICAgQWNjICAgIFBhcnQgICBJbmVzcyAgIEVsYXQgICAgSWxsYXQgIEFkZXNzICAgQWJsYXQgICBBbGxhdCAgIEVzcyAgICBUcmFucworbWluw6QgICBtaW51biAgbWludXQgIG1pbnVhICBtaW51c3NhIG1pbnVzdGEgbWludXVuIG1pbnVsbGEgbWludWx0YSBtaW51bGxlICAgICAgICAgICAgICAgfCBJCitzaW7DpCAgIHNpbnVuICBzaW51dCAgc2ludWEgIHNpbnVzc2Egc2ludXN0YSBzaW51dW4gc2ludWxsYSBzaW51bHRhIHNpbnVsbGUgICAgICAgICAgICAgICB8IHlvdQoraMOkbiAgICBow6RuZW4gIGjDpG5ldCAgaMOkbnTDpCAgaMOkbmVzc8OkIGjDpG5lc3TDpCBow6RuZWVuIGjDpG5lbGzDpCBow6RuZWx0w6QgaMOkbmVsbGUgICAgICAgICAgICAgICB8IGhlIHNoZQorbWUgICAgIG1laWTDpG4gbWVpZMOkdCBtZWl0w6QgIG1laXNzw6QgIG1laXN0w6QgIG1laWhpbiBtZWlsbMOkICBtZWlsdMOkICBtZWlsbGUgICAgICAgICAgICAgICAgfCB3ZQordGUgICAgIHRlaWTDpG4gdGVpZMOkdCB0ZWl0w6QgIHRlaXNzw6QgIHRlaXN0w6QgIHRlaWhpbiB0ZWlsbMOkICB0ZWlsdMOkICB0ZWlsbGUgICAgICAgICAgICAgICAgfCB5b3UKK2hlICAgICBoZWlkw6RuIGhlaWTDpHQgaGVpdMOkICBoZWlzc8OkICBoZWlzdMOkICBoZWloaW4gaGVpbGzDpCAgaGVpbHTDpCAgaGVpbGxlICAgICAgICAgICAgICAgIHwgdGhleQorCit0w6Rtw6QgICB0w6Rtw6RuICAgICAgICAgdMOkdMOkICAgdMOkc3PDpCAgIHTDpHN0w6QgICB0w6Row6RuICB0YWxsw6QgICB0w6RsdMOkICAgdMOkbGxlICAgdMOkbsOkICAgdMOka3NpICB8IHRoaXMKK3R1byAgICB0dW9uICAgICAgICAgIHR1b3TDpCAgdHVvc3NhICB0dW9zdGEgIHR1b2hvbiB0dW9sbGEgIHR1b2x0YSAgdHVvbGxlICB0dW9uYSAgdHVva3NpIHwgdGhhdAorc2UgICAgIHNlbiAgICAgICAgICAgc2l0w6QgICBzaWluw6QgICBzaWl0w6QgICBzaWloZW4gc2lsbMOkICAgc2lsdMOkICAgc2lsbGUgICBzaW7DpCAgIHNpa3NpICB8IGl0Cituw6Rtw6QgICBuw6RpZGVuICAgICAgICBuw6RpdMOkICBuw6Rpc3PDpCAgbsOkaXN0w6QgIG7DpGloaW4gbsOkaWxsw6QgIG7DpGlsdMOkICBuw6RpbGxlICBuw6RpbsOkICBuw6Rpa3NpIHwgdGhlc2UKK251byAgICBub2lkZW4gICAgICAgIG5vaXRhICBub2lzc2EgIG5vaXN0YSAgbm9paGluIG5vaWxsYSAgbm9pbHRhICBub2lsbGUgIG5vaW5hICBub2lrc2kgfCB0aG9zZQorbmUgICAgIG5paWRlbiAgICAgICAgbmlpdMOkICBuaWlzc8OkICBuaWlzdMOkICBuaWloaW4gbmlpbGzDpCAgbmlpbHTDpCAgbmlpbGxlICBuaWluw6QgIG5paWtzaSB8IHRoZXkKKwora3VrYSAgIGtlbmVuIGtlbmV0ICAga2V0w6QgICBrZW5lc3PDpCBrZW5lc3TDpCBrZW5lZW4ga2VuZWxsw6Qga2VuZWx0w6Qga2VuZWxsZSBrZW5lbsOkIGtlbmVrc2l8IHdobwora2V0a8OkICBrZWlkZW4ga2V0a8OkICBrZWl0w6QgIGtlaXNzw6QgIGtlaXN0w6QgIGtlaWhpbiBrZWlsbMOkICBrZWlsdMOkICBrZWlsbGUgIGtlaW7DpCAga2Vpa3NpIHwgKHBsKQorbWlrw6QgICBtaW5rw6QgbWlua8OkICAgbWl0w6QgICBtaXNzw6QgICBtaXN0w6QgICBtaWhpbiAgbWlsbMOkICAgbWlsdMOkICAgbWlsbGUgICBtaW7DpCAgIG1pa3NpICB8IHdoaWNoIHdoYXQKK21pdGvDpCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHBsKQorCitqb2thICAgam9ua2EgICAgICAgICBqb3RhICAgam9zc2EgICBqb3N0YSAgIGpvaG9uICBqb2xsYSAgIGpvbHRhICAgam9sbGUgICBqb25hICAgam9rc2kgIHwgd2hvIHdoaWNoCitqb3RrYSAgam9pZGVuICAgICAgICBqb2l0YSAgam9pc3NhICBqb2lzdGEgIGpvaWhpbiBqb2lsbGEgIGpvaWx0YSAgam9pbGxlICBqb2luYSAgam9pa3NpIHwgKHBsKQorCit8IGNvbmp1bmN0aW9ucworCitldHTDpCAgIHwgdGhhdAoramEgICAgIHwgYW5kCitqb3MgICAgfCBpZgora29za2EgIHwgYmVjYXVzZQora3VpbiAgIHwgdGhhbgorbXV0dGEgIHwgYnV0CituaWluICAgfCBzbworc2Vrw6QgICB8IGFuZAorc2lsbMOkICB8IGZvcgordGFpICAgIHwgb3IKK3ZhYW4gICB8IGJ1dAordmFpICAgIHwgb3IKK3ZhaWtrYSB8IGFsdGhvdWdoCisKKworfCBwcmVwb3NpdGlvbnMKKwora2Fuc3NhICB8IHdpdGgKK211a2FhbiAgfCBhY2NvcmRpbmcgdG8KK25vaW4gICAgfCBhYm91dAorcG9pa2tpICB8IGFjcm9zcworeWxpICAgICB8IG92ZXIsIGFjcm9zcworCit8IG90aGVyCisKK2t1biAgICB8IHdoZW4KK25paW4gICB8IHNvCitueXQgICAgfCBub3cKK2l0c2UgICB8IHNlbGYKKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZnIudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZnIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OWFiYWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19mci50eHQKQEAgLTAsMCArMSwxODYgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZnJlbmNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBGcmVuY2ggc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworYXUgICAgICAgICAgICAgfCAgYSArIGxlCithdXggICAgICAgICAgICB8ICBhICsgbGVzCithdmVjICAgICAgICAgICB8ICB3aXRoCitjZSAgICAgICAgICAgICB8ICB0aGlzCitjZXMgICAgICAgICAgICB8ICB0aGVzZQorZGFucyAgICAgICAgICAgfCAgd2l0aAorZGUgICAgICAgICAgICAgfCAgb2YKK2RlcyAgICAgICAgICAgIHwgIGRlICsgbGVzCitkdSAgICAgICAgICAgICB8ICBkZSArIGxlCitlbGxlICAgICAgICAgICB8ICBzaGUKK2VuICAgICAgICAgICAgIHwgIGBvZiB0aGVtJyBldGMKK2V0ICAgICAgICAgICAgIHwgIGFuZAorZXV4ICAgICAgICAgICAgfCAgdGhlbQoraWwgICAgICAgICAgICAgfCAgaGUKK2plICAgICAgICAgICAgIHwgIEkKK2xhICAgICAgICAgICAgIHwgIHRoZQorbGUgICAgICAgICAgICAgfCAgdGhlCitsZXVyICAgICAgICAgICB8ICB0aGVpcgorbHVpICAgICAgICAgICAgfCAgaGltCittYSAgICAgICAgICAgICB8ICBteSAoZmVtKQorbWFpcyAgICAgICAgICAgfCAgYnV0CittZSAgICAgICAgICAgICB8ICBtZQorbcOqbWUgICAgICAgICAgIHwgIHNhbWU7IGFzIGluIG1vaS1tw6ptZSAobXlzZWxmKSBldGMKK21lcyAgICAgICAgICAgIHwgIG1lIChwbCkKK21vaSAgICAgICAgICAgIHwgIG1lCittb24gICAgICAgICAgICB8ICBteSAobWFzYykKK25lICAgICAgICAgICAgIHwgIG5vdAorbm9zICAgICAgICAgICAgfCAgb3VyIChwbCkKK25vdHJlICAgICAgICAgIHwgIG91cgorbm91cyAgICAgICAgICAgfCAgd2UKK29uICAgICAgICAgICAgIHwgIG9uZQorb3UgICAgICAgICAgICAgfCAgd2hlcmUKK3BhciAgICAgICAgICAgIHwgIGJ5CitwYXMgICAgICAgICAgICB8ICBub3QKK3BvdXIgICAgICAgICAgIHwgIGZvcgorcXUgICAgICAgICAgICAgfCAgcXVlIGJlZm9yZSB2b3dlbAorcXVlICAgICAgICAgICAgfCAgdGhhdAorcXVpICAgICAgICAgICAgfCAgd2hvCitzYSAgICAgICAgICAgICB8ICBoaXMsIGhlciAoZmVtKQorc2UgICAgICAgICAgICAgfCAgb25lc2VsZgorc2VzICAgICAgICAgICAgfCAgaGlzIChwbCkKK3NvbiAgICAgICAgICAgIHwgIGhpcywgaGVyIChtYXNjKQorc3VyICAgICAgICAgICAgfCAgb24KK3RhICAgICAgICAgICAgIHwgIHRoeSAoZmVtKQordGUgICAgICAgICAgICAgfCAgdGhlZQordGVzICAgICAgICAgICAgfCAgdGh5IChwbCkKK3RvaSAgICAgICAgICAgIHwgIHRoZWUKK3RvbiAgICAgICAgICAgIHwgIHRoeSAobWFzYykKK3R1ICAgICAgICAgICAgIHwgIHRob3UKK3VuICAgICAgICAgICAgIHwgIGEKK3VuZSAgICAgICAgICAgIHwgIGEKK3ZvcyAgICAgICAgICAgIHwgIHlvdXIgKHBsKQordm90cmUgICAgICAgICAgfCAgeW91cgordm91cyAgICAgICAgICAgfCAgeW91CisKKyAgICAgICAgICAgICAgIHwgIHNpbmdsZSBsZXR0ZXIgZm9ybXMKKworYyAgICAgICAgICAgICAgfCAgYycKK2QgICAgICAgICAgICAgIHwgIGQnCitqICAgICAgICAgICAgICB8ICBqJworbCAgICAgICAgICAgICAgfCAgbCcKK8OgICAgICAgICAgICAgICB8ICB0bywgYXQKK20gICAgICAgICAgICAgIHwgIG0nCituICAgICAgICAgICAgICB8ICBuJworcyAgICAgICAgICAgICAgfCAgcycKK3QgICAgICAgICAgICAgIHwgIHQnCit5ICAgICAgICAgICAgICB8ICB0aGVyZQorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIMOqdHJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK8OpdMOpCivDqXTDqWUKK8OpdMOpZXMKK8OpdMOpcworw6l0YW50CitzdWlzCitlcworZXN0Citzb21tZXMKK8OqdGVzCitzb250CitzZXJhaQorc2VyYXMKK3NlcmEKK3Nlcm9ucworc2VyZXoKK3Nlcm9udAorc2VyYWlzCitzZXJhaXQKK3NlcmlvbnMKK3Nlcmllegorc2VyYWllbnQKK8OpdGFpcworw6l0YWl0CivDqXRpb25zCivDqXRpZXoKK8OpdGFpZW50CitmdXMKK2Z1dAorZsO7bWVzCitmw7t0ZXMKK2Z1cmVudAorc29pcworc29pdAorc295b25zCitzb3llegorc29pZW50CitmdXNzZQorZnVzc2VzCitmw7t0CitmdXNzaW9ucworZnVzc2llegorZnVzc2VudAorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIGF2b2lyIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK2F5YW50CitldQorZXVlCitldWVzCitldXMKK2FpCithcworYXZvbnMKK2F2ZXoKK29udAorYXVyYWkKK2F1cmFzCithdXJhCithdXJvbnMKK2F1cmV6CithdXJvbnQKK2F1cmFpcworYXVyYWl0CithdXJpb25zCithdXJpZXoKK2F1cmFpZW50CithdmFpcworYXZhaXQKK2F2aW9ucworYXZpZXoKK2F2YWllbnQKK2V1dAorZcO7bWVzCitlw7t0ZXMKK2V1cmVudAorYWllCithaWVzCithaXQKK2F5b25zCitheWV6CithaWVudAorZXVzc2UKK2V1c3NlcworZcO7dAorZXVzc2lvbnMKK2V1c3NpZXoKK2V1c3NlbnQKKworICAgICAgICAgICAgICAgfCBMYXRlciBhZGRpdGlvbnMgKGZyb20gSmVhbi1DaHJpc3RvcGhlIERlc2NoYW1wcykKK2NlY2kgICAgICAgICAgIHwgIHRoaXMKK2NlbGEgICAgICAgICAgIHwgIHRoYXQKK2NlbMOgICAgICAgICAgICB8ICB0aGF0CitjZXQgICAgICAgICAgICB8ICB0aGlzCitjZXR0ZSAgICAgICAgICB8ICB0aGlzCitpY2kgICAgICAgICAgICB8ICBoZXJlCitpbHMgICAgICAgICAgICB8ICB0aGV5CitsZXMgICAgICAgICAgICB8ICB0aGUgKHBsKQorbGV1cnMgICAgICAgICAgfCAgdGhlaXIgKHBsKQorcXVlbCAgICAgICAgICAgfCAgd2hpY2gKK3F1ZWxzICAgICAgICAgIHwgIHdoaWNoCitxdWVsbGUgICAgICAgICB8ICB3aGljaAorcXVlbGxlcyAgICAgICAgfCAgd2hpY2gKK3NhbnMgICAgICAgICAgIHwgIHdpdGhvdXQKK3NvaSAgICAgICAgICAgIHwgIG9uZXNlbGYKKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZ2EudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZ2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjg4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19nYS50eHQKQEAgLTAsMCArMSwxMTAgQEAKKworYQorYWNoCithZworYWd1cworYW4KK2FvbgorYXIKK2FybmEKK2FzCitiJworYmEKK2JlaXJ0CitiaMO6cgorY2FvZ2EKK2NlYXRoYWlyCitjZWF0aHJhcgorY2hvbWgKK2NodMOzCitjaHVpZworY2h1bgorY29pcworY8OpYWQKK2PDumlnCitjw7ppZ2VhcgorZCcKK2RhaWNoZWFkCitkYXIKK2RlCitkZWljaAorZGVpY2huacO6cgorZGVuCitkaMOhCitkbworZG9uCitkdMOtCitkw6EKK2TDoXIKK2TDsworZmFvaQorZmFvaW4KK2Zhb2luYQorZmFvaW7DoXIKK2ZhcmEKK2ZpY2hlCitnYWNoCitnYW4KK2dvCitndXIKK2hhb24KK2hvY2h0CitpCitpYWQKK2lkaXIKK2luCitpbmEKK2lucworaW7DoXIKK2lzCitsZQorbGVpcworbGVuYQorbGVuw6FyCittJworbWFyCittbworbcOpCituYQorbmFjaAorbmFvaQorbmFvbsO6cgorbsOhCituw60KK27DrW9yCituw7MKK27Ds2NoYQorb2NodAorb2NodGFyCitvcworcm9pbWgKK3NhCitzZWFjaHQKK3NlYWNodGFyCitzZWFjaHTDsworc2Vhc2NhCitzZWlzZWFyCitzaWFkCitzaWJoCitzaW5uCitzbmEKK3PDqQorc8OtCit0YXIKK3RoYXIKK3Row7oKK3RyacO6cgordHLDrQordHLDrW5hCit0csOtbsOhcgordHLDrW9jaGEKK3TDugordW0KK8Ohcgorw6kKK8OpaXMKK8OtCivDsworw7NuCivDs25hCivDs27DoXIKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2dsLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2dsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODc2MGIxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfZ2wudHh0CkBAIC0wLDAgKzEsMTYxIEBACisjIGdhbGljYW4gc3RvcHdvcmRzCithCithw61uZGEKK2Fsw60KK2FxdWVsCithcXVlbGEKK2FxdWVsYXMKK2FxdWVsZXMKK2FxdWlsbworYXF1w60KK2FvCithb3MKK2FzCithc8OtCivDoQorYmVuCitjYW5kbworY2hlCitjbworY29hCitjb21pZ28KK2NvbgorY29ubm9zY28KK2NvbnRpZ28KK2NvbnZvc2NvCitjb2FzCitjb3MKK2N1bgorY3VucworY3VuaGEKK2N1bmhhcworZGEKK2RhbGd1bmhhCitkYWxndW5oYXMKK2RhbGfDum4KK2RhbGfDum5zCitkYXMKK2RlCitkZWwKK2RlbGEKK2RlbGFzCitkZWxlcworZGVzZGUKK2Rlc3RlCitkbworZG9zCitkdW4KK2R1bnMKK2R1bmhhCitkdW5oYXMKK2UKK2VsCitlbGEKK2VsYXMKK2VsZXMKK2VuCitlcmEKK2VyYW4KK2VzYQorZXNhcworZXNlCitlc2VzCitlc3RhCitlc3RhcgorZXN0YWJhCitlc3TDoQorZXN0w6FuCitlc3RlCitlc3RlcworZXN0aXZlbgorZXN0b3UKK2V1CivDqQorZmFjZXIKK2ZvaQorZm9yb24KK2Z1bgoraGFiw61hCitoYWkKK2lzbworaXN0bworbGEKK2xhcworbGxlCitsbGVzCitsbworbG9zCittYWlzCittZQorbWV1CittZXVzCittaW4KK21pw7FhCittacOxYXMKK21vaQorbmEKK25hcworbmVzdGUKK25pbgorbm8KK25vbgorbm9zCitub3NhCitub3Nhcworbm9zbworbm9zb3MKK27Ds3MKK251bgorbnVuaGEKK251bnMKK251bmhhcworbworb3MKK291CivDsworw7NzCitwYXJhCitwZXJvCitwb2RlCitwb2lzCitwb2xhCitwb2xhcworcG9sbworcG9sb3MKK3BvcgorcXVlCitzZQorc2Vuw7NuCitzZXIKK3NldQorc2V1cworc2V4YQorc2lkbworc29icmUKK3PDumEKK3PDumFzCit0YW3DqW4KK3RhbgordGUKK3RlbgordGXDsWVuCit0ZcOxbwordGVyCit0ZXUKK3RldXMKK3RpCit0aWRvCit0acOxYQordGl2ZW4KK3TDumEKK3TDumFzCit1bgordW5oYQordW5oYXMKK3Vucwordm9zCit2b3NhCit2b3Nhcwordm9zbwordm9zb3MKK3bDs3MKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2hpLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2hpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI4NmJiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfaGkudHh0CkBAIC0wLDAgKzEsMjM1IEBACisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGFsc28gY29udGFpbnMgZm9ybXMgbm9ybWFsaXplZCBieSBIaW5kaU5vcm1hbGl6ZXIgCisjIGZvciBzcGVsbGluZyB2YXJpYXRpb24gKHNlZSBzZWN0aW9uIGJlbG93KSwgc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2VkIHdoZXRoZXIgb3IgCisjIG5vdCB5b3UgZW5hYmxlIHRoYXQgZmVhdHVyZS4gV2hlbiBhZGRpbmcgYWRkaXRpb25hbCBlbnRyaWVzIHRvIHRoaXMgbGlzdCwKKyMgcGxlYXNlIGFkZCB0aGUgbm9ybWFsaXplZCBmb3JtIGFzIHdlbGwuIAor4KSF4KSC4KSm4KSwCivgpIXgpKQKK+CkheCkquCkqOCkvgor4KSF4KSq4KSo4KWACivgpIXgpKrgpKjgpYcKK+CkheCkreClgAor4KSG4KSm4KS/CivgpIbgpKoKK+Ckh+CkpOCljeCkr+CkvuCkpuCkvwor4KSH4KSoIAor4KSH4KSo4KSV4KS+CivgpIfgpKjgpY3gpLngpYDgpIIKK+Ckh+CkqOCljeCkueClh+Ckggor4KSH4KSo4KWN4KS54KWL4KSCCivgpIfgpLgKK+Ckh+CkuOCkleCkvgor4KSH4KS44KSV4KWACivgpIfgpLjgpJXgpYcKK+Ckh+CkuOCkruClh+Ckggor4KSH4KS44KWACivgpIfgpLjgpYcKK+CkieCkqAor4KSJ4KSo4KSV4KS+CivgpIngpKjgpJXgpYAKK+CkieCkqOCkleClhwor4KSJ4KSo4KSV4KWLCivgpIngpKjgpY3gpLngpYDgpIIKK+CkieCkqOCljeCkueClh+Ckggor4KSJ4KSo4KWN4KS54KWL4KSCCivgpIngpLgKK+CkieCkuOCkleClhwor4KSJ4KS44KWACivgpIngpLjgpYcKK+Ckj+CklQor4KSP4KS14KSCCivgpI/gpLgKK+CkkOCkuOClhwor4KSU4KSwCivgpJXgpIgKK+CkleCksAor4KSV4KSw4KSk4KS+CivgpJXgpLDgpKTgpYcKK+CkleCksOCkqOCkvgor4KSV4KSw4KSo4KWHCivgpJXgpLDgpYfgpIIKK+CkleCkueCkpOClhwor4KSV4KS54KS+CivgpJXgpL4KK+CkleCkvuClnuClgAor4KSV4KS/CivgpJXgpL/gpKTgpKjgpL4KK+CkleCkv+CkqOCljeCkueClh+Ckggor4KSV4KS/4KSo4KWN4KS54KWL4KSCCivgpJXgpL/gpK/gpL4KK+CkleCkv+CksAor4KSV4KS/4KS4CivgpJXgpL/gpLjgpYAKK+CkleCkv+CkuOClhwor4KSV4KWACivgpJXgpYHgpJsKK+CkleClgeCksgor4KSV4KWHCivgpJXgpYsKK+CkleCli+CkiAor4KSV4KWM4KSoCivgpJXgpYzgpKjgpLjgpL4KK+Ckl+Ckr+Ckvgor4KSY4KSwCivgpJzgpKwKK+CknOCkueCkvuCkgQor4KSc4KS+CivgpJzgpL/gpKTgpKjgpL4KK+CknOCkv+CkqAor4KSc4KS/4KSo4KWN4KS54KWH4KSCCivgpJzgpL/gpKjgpY3gpLngpYvgpIIKK+CknOCkv+CkuAor4KSc4KS/4KS44KWHCivgpJzgpYDgpKfgpLAKK+CknOCliOCkuOCkvgor4KSc4KWI4KS44KWHCivgpJzgpYsKK+CkpOCklQor4KSk4KSsCivgpKTgpLDgpLkKK+CkpOCkv+CkqAor4KSk4KS/4KSo4KWN4KS54KWH4KSCCivgpKTgpL/gpKjgpY3gpLngpYvgpIIKK+CkpOCkv+CkuAor4KSk4KS/4KS44KWHCivgpKTgpYsKK+CkpeCkvgor4KSl4KWACivgpKXgpYcKK+CkpuCkrOCkvuCksOCkvgor4KSm4KS/4KSv4KS+CivgpKbgpYHgpLjgpLDgpL4KK+CkpuClguCkuOCksOClhwor4KSm4KWLCivgpKbgpY3gpLXgpL7gpLDgpL4KK+CkqAor4KSo4KS54KWA4KSCCivgpKjgpL4KK+CkqOCkv+CkueCkvuCkr+CkpAor4KSo4KWA4KSa4KWHCivgpKjgpYcKK+CkquCksAor4KSq4KSwICAKK+CkquCkueCksuClhwor4KSq4KWC4KSw4KS+CivgpKrgpYcKK+Ckq+Ckv+CksAor4KSs4KSo4KWACivgpKzgpLngpYAKK+CkrOCkueClgeCkpAor4KSs4KS+4KSmCivgpKzgpL7gpLLgpL4KK+CkrOCkv+CksuCkleClgeCksgor4KSt4KWACivgpK3gpYDgpKTgpLAKK+CkruCkl+CksAor4KSu4KS+4KSo4KWLCivgpK7gpYcKK+CkruClh+Ckggor4KSv4KSm4KS/CivgpK/gpLkKK+Ckr+CkueCkvuCkgQor4KSv4KS54KWACivgpK/gpL4KK+Ckr+Ckv+CkuSAKK+Ckr+Clhwor4KSw4KSW4KWH4KSCCivgpLDgpLngpL4KK+CksOCkueClhwor4KSx4KWN4KS14KS+4KS44KS+CivgpLLgpL/gpI8KK+CksuCkv+Ckr+Clhwor4KSy4KWH4KSV4KS/4KSoCivgpLUKK+CkteCksOCljeCklwor4KS14KS5CivgpLXgpLkgCivgpLXgpLngpL7gpIEKK+CkteCkueClgOCkggor4KS14KS+4KSy4KWHCivgpLXgpYHgpLkgCivgpLXgpYcKK+CkteClmuCliOCksOCkuQor4KS44KSC4KSXCivgpLjgpJXgpKTgpL4KK+CkuOCkleCkpOClhwor4KS44KSs4KS44KWHCivgpLjgpK3gpYAKK+CkuOCkvuCkpQor4KS44KS+4KSs4KWB4KSkCivgpLjgpL7gpK0KK+CkuOCkvuCksOCkvgor4KS44KWHCivgpLjgpYsKK+CkueClgAor4KS54KWB4KSGCivgpLngpYHgpIgKK+CkueClgeCkjwor4KS54KWICivgpLngpYjgpIIKK+CkueCliwor4KS54KWL4KSk4KS+CivgpLngpYvgpKTgpYAKK+CkueCli+CkpOClhwor4KS54KWL4KSo4KS+CivgpLngpYvgpKjgpYcKKyMgYWRkaXRpb25hbCBub3JtYWxpemVkIGZvcm1zIG9mIHRoZSBhYm92ZQor4KSF4KSq4KSo4KS/CivgpJzgpYfgpLjgpYcKK+CkueCli+CkpOCkvwor4KS44KSt4KS/CivgpKTgpL/gpILgpLngpYvgpIIKK+Ckh+CkguCkueCli+Ckggor4KSm4KS14KS+4KSw4KS+CivgpIfgpLjgpL8KK+CkleCkv+CkguCkueClh+Ckggor4KSl4KS/CivgpIngpILgpLngpYvgpIIKK+Ckk+CksAor4KSc4KS/4KSC4KS54KWH4KSCCivgpLXgpLngpL/gpIIKK+CkheCkreCkvwor4KSs4KSo4KS/CivgpLngpL8KK+CkieCkguCkueCkv+Ckggor4KSJ4KSC4KS54KWH4KSCCivgpLngpYfgpIIKK+CkteCkl+Clh+CksOCkuQor4KSP4KS44KWHCivgpLDgpLXgpL7gpLjgpL4KK+CkleCli+CkqAor4KSo4KS/4KSa4KWHCivgpJXgpL7gpKvgpL8KK+CkieCkuOCkvwor4KSq4KWB4KSw4KS+CivgpK3gpL/gpKTgpLAKK+CkueClhwor4KSs4KS54KS/CivgpLXgpLngpL7gpIIKK+CkleCli+Ckhwor4KSv4KS54KS+4KSCCivgpJzgpL/gpILgpLngpYvgpIIKK+CkpOCkv+CkguCkueClh+Ckggor4KSV4KS/4KS44KS/CivgpJXgpIcKK+Ckr+CkueCkvwor4KSH4KSC4KS54KS/4KSCCivgpJzgpL/gpKfgpLAKK+Ckh+CkguCkueClh+Ckggor4KSF4KSm4KS/CivgpIfgpKTgpK/gpL7gpKbgpL8KK+CkueClgeCkhwor4KSV4KWL4KSo4KS44KS+CivgpIfgpLjgpJXgpL8KK+CkpuClgeCkuOCksOClhwor4KSc4KS54KS+4KSCCivgpIXgpKoKK+CkleCkv+CkguCkueCli+Ckggor4KSJ4KSo4KSV4KS/CivgpK3gpL8KK+CkteCksOCklwor4KS54KWB4KSFCivgpJzgpYfgpLjgpL4KK+CkqOCkueCkv+CkggpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfaHUudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfaHUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTI2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19odS50eHQKQEAgLTAsMCArMSwyMTEgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvaHVuZ2FyaWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKyAKK3wgSHVuZ2FyaWFuIHN0b3Agd29yZCBsaXN0Cit8IHByZXBhcmVkIGJ5IEFubmEgVG9yZGFpCisKK2EKK2Fob2d5CithaG9sCitha2kKK2FraWsKK2Fra29yCithbGF0dAorw6FsdGFsCivDoWx0YWzDoWJhbgorYW1lbHkKK2FtZWx5ZWsKK2FtZWx5ZWtiZW4KK2FtZWx5ZWtldAorYW1lbHlldAorYW1lbHluZWsKK2FtaQorYW1pdAorYW1vbHlhbgorYW3DrWcKK2FtaWtvcgorw6F0CithYmJhbgorYWhob3oKK2FubmFrCithcnJhCithcnLDs2wKK2F6Cithem9rCithem9uCithenQKK2F6emFsCithesOpcnQKK2F6dMOhbgorYXp1dMOhbgorYXpvbmJhbgorYsOhcgorYmUKK2JlbMO8bAorYmVubmUKK2Npa2sKK2Npa2tlaworY2lra2VrZXQKK2NzYWsKK2RlCitlCitlZGRpZworZWfDqXN6CitlZ3kKK2VneWVzCitlZ3lldGxlbgorZWd5w6liCitlZ3lpaworZWd5cmUKK2Vra29yCitlbAorZWzDqWcKK2VsbGVuCitlbMWRCitlbMWRc3rDtnIKK2VsxZF0dAorZWxzxZEKK8Opbgorw6lwcGVuCitlYmJlbgorZWhoZXoKK2VtaWx5ZW4KK2VubmVrCitlcnJlCitlegorZXp0CitlemVrCitlemVuCitlenplbAorZXrDqXJ0CivDqXMKK2ZlbAorZmVsw6kKK2hhbmVtCitoaXN6ZW4KK2hvZ3kKK2hvZ3lhbgoraWdlbgorw61neQoraWxsZXR2ZQoraWxsLgoraWxsCitpbHllbgoraWx5ZW5rb3IKK2lzb24KK2lzbcOpdAoraXR0Citqw7MKK2rDs2wKK2pvYmJhbgora2VsbAora2VsbGV0dAora2VyZXN6dMO8bAora2VyZXNzw7xuawora2kKK2vDrXbDvGwKK2vDtnrDtnR0Citrw7Z6w7xsCitsZWdhbMOhYmIKK2xlaGV0CitsZWhldGV0dAorbGVneWVuCitsZW5uZQorbGVubmkKK2xlc3oKK2xldHQKK21hZ2EKK21hZ8OhdAorbWFqZAorbWFqZAorbcOhcgorbcOhcworbcOhc2lrCittZWcKK23DqWcKK21lbGxldHQKK21lcnQKK21lbHkKK21lbHllaworbWkKK21pdAorbcOtZworbWnDqXJ0CittaWx5ZW4KK21pa29yCittaW5kZW4KK21pbmRlbnQKK21pbmRlbmtpCittaW5kaWcKK21pbnQKK21pbnRoYQorbWl2ZWwKK21vc3QKK25hZ3kKK25hZ3lvYmIKK25hZ3lvbgorbmUKK27DqWhhCituZWtlbQorbmVraQorbmVtCituw6low6FueQorbsOpbGvDvGwKK25pbmNzCitvbHlhbgorb3R0CivDtnNzemUKK8WRCivFkWsKK8WRa2V0CitwZWRpZworcGVyc3plCityw6EKK3MKK3NhasOhdAorc2VtCitzZW1taQorc29rCitzb2thdAorc29ra2FsCitzesOhbcOhcmEKK3N6ZW1iZW4KK3N6ZXJpbnQKK3N6aW50ZQordGFsw6FuCit0ZWjDoXQKK3RlbGplcwordG92w6FiYgordG92w6FiYsOhCit0w7ZiYgorw7pneQordWd5YW5pcworw7pqCivDumphYmIKK8O6anJhCit1dMOhbgordXTDoW5hCit1dG9sc8OzCit2YWd5Cit2YWd5aXMKK3ZhbGFraQordmFsYW1pCit2YWxhbWludAordmFsw7MKK3ZhZ3lvawordmFuCit2YW5uYWsKK3ZvbHQKK3ZvbHRhbQordm9sdGFrCit2b2x0dW5rCit2aXNzemEKK3ZlbGUKK3Zpc3pvbnQKK3ZvbG5hCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19oeS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19oeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMWM1MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2h5LnR4dApAQCAtMCwwICsxLDQ2IEBACisjIGV4YW1wbGUgc2V0IG9mIEFybWVuaWFuIHN0b3B3b3Jkcy4KK9Wh1bXVpAor1aHVtdWsCivVodW11bYKK9Wh1bXVvQor1aTVuNaCCivVpNW41oLWhAor1aXVtAor1aXVtgor1aXVttaECivVpdW9CivVpdaECivVpwor1afVqwor1afVq9W2CivVp9Wr1bbWhAor1afVq9aACivVp9Wr1oQKK9Wn1oAKK9Wo1b3Vvwor1akKK9WrCivVq9W2CivVq9W91a8KK9Wr1oAKK9Wv1aHVtAor1bDVodW01aHWgAor1bDVpdW/CivVsNWl1b/VuAor1bTVpdW21oQKK9W01aXVuwor1bTVqwor1bYKK9W21aEKK9W21aHWhwor1bbWgNWhCivVttaA1aHVttaECivVuNaACivVuNaA1agKK9W41oDVuNW21oQKK9W41oDVutWl1b0KK9W41oIKK9W41oLVtAor1brVq9W/1asKK9W+1oDVoQor1ocKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2lkLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2lkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE3ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfaWQudHh0CkBAIC0wLDAgKzEsMzU5IEBACisjIGZyb20gYXBwZW5kaXggRCBvZjogQSBTdHVkeSBvZiBTdGVtbWluZyBFZmZlY3RzIG9uIEluZm9ybWF0aW9uCisjIFJldHJpZXZhbCBpbiBCYWhhc2EgSW5kb25lc2lhCithZGEKK2FkYW55YQorYWRhbGFoCithZGFwdW4KK2FnYWsKK2FnYWtueWEKK2FnYXIKK2FrYW4KK2FrYW5rYWgKK2FraGlybnlhCitha3UKK2FrdWxhaAorYW1hdAorYW1hdGxhaAorYW5kYQorYW5kYWxhaAorYW50YXIKK2RpYW50YXJhbnlhCithbnRhcmEKK2FudGFyYW55YQorZGlhbnRhcmEKK2FwYQorYXBhYW4KK21lbmdhcGEKK2FwYWJpbGEKK2FwYWthaAorYXBhbGFnaQorYXBhdGFoCithdGF1CithdGF1a2FoCithdGF1cHVuCitiYWdhaQorYmFnYWlrYW4KK3NlYmFnYWkKK3NlYmFnYWlueWEKK2JhZ2FpbWFuYQorYmFnYWltYW5hcHVuCitzZWJhZ2FpbWFuYQorYmFnYWltYW5ha2FoCitiYWdpCitiYWhrYW4KK2JhaHdhCitiYWh3YXNhbnlhCitzZWJhbGlrbnlhCitiYW55YWsKK3NlYmFueWFrCitiZWJlcmFwYQorc2ViZXJhcGEKK2JlZ2luaQorYmVnaW5pYW4KK2JlZ2luaWthaAorYmVnaW5pbGFoCitzZWJlZ2luaQorYmVnaXR1CitiZWdpdHVrYWgKK2JlZ2l0dWxhaAorYmVnaXR1cHVuCitzZWJlZ2l0dQorYmVsdW0KK2JlbHVtbGFoCitzZWJlbHVtCitzZWJlbHVtbnlhCitzZWJlbmFybnlhCitiZXJhcGEKK2JlcmFwYWthaAorYmVyYXBhbGFoCitiZXJhcGFwdW4KK2JldHVsa2FoCitzZWJldHVsbnlhCitiaWFzYQorYmlhc2FueWEKK2JpbGEKK2JpbGFrYWgKK2Jpc2EKK2Jpc2FrYWgKK3NlYmlzYW55YQorYm9sZWgKK2JvbGVoa2FoCitib2xlaGxhaAorYnVhdAorYnVrYW4KK2J1a2Fua2FoCitidWthbmxhaAorYnVrYW5ueWEKK2N1bWEKK3BlcmN1bWEKK2RhaHVsdQorZGFsYW0KK2RhbgorZGFwYXQKK2RhcmkKK2RhcmlwYWRhCitkZWthdAorZGVtaQorZGVtaWtpYW4KK2RlbWlraWFubGFoCitzZWRlbWlraWFuCitkZW5nYW4KK2RlcGFuCitkaQorZGlhCitkaWFsYWgKK2RpbmkKK2RpcmkKK2RpcmlueWEKK3RlcmRpcmkKK2RvbmcKK2R1bHUKK2VuZ2dhaworZW5nZ2FrbnlhCitlbnRhaAorZW50YWhsYWgKK3RlcmhhZGFwCit0ZXJoYWRhcG55YQoraGFsCitoYW1waXIKK2hhbnlhCitoYW55YWxhaAoraGFydXMKK2hhcnVzbGFoCitoYXJ1c255YQorc2VoYXJ1c255YQoraGVuZGFrCitoZW5kYWtsYWgKK2hlbmRha255YQoraGluZ2dhCitzZWhpbmdnYQoraWEKK2lhbGFoCitpYmFyYXQKK2luZ2luCitpbmdpbmthaAoraW5naW5rYW4KK2luaQoraW5pa2FoCitpbmlsYWgKK2l0dQoraXR1a2FoCitpdHVsYWgKK2phbmdhbgoramFuZ2Fua2FuCitqYW5nYW5sYWgKK2ppa2EKK2ppa2FsYXUKK2p1Z2EKK2p1c3RydQora2FsYQora2FsYXUKK2thbGF1bGFoCitrYWxhdXB1bgora2FsaWFuCitrYW1pCitrYW1pbGFoCitrYW11CitrYW11bGFoCitrYW4KK2thcGFuCitrYXBhbmthaAora2FwYW5wdW4KK2Rpa2FyZW5ha2FuCitrYXJlbmEKK2thcmVuYW55YQora2UKK2tlY2lsCitrZW11ZGlhbgora2VuYXBhCitrZXBhZGEKK2tlcGFkYW55YQora2V0aWthCitzZWtldGlrYQora2h1c3VzbnlhCitraW5pCitraW5pbGFoCitraXJhbnlhCitzZWtpcmFueWEKK2tpdGEKK2tpdGFsYWgKK2tvaworbGFnaQorbGFnaWFuCitzZWxhZ2kKK2xhaAorbGFpbgorbGFpbm55YQorbWVsYWlua2FuCitzZWxha3UKK2xhbHUKK21lbGFsdWkKK3RlcmxhbHUKK2xhbWEKK2xhbWFueWEKK3NlbGFtYQorc2VsYW1hCitzZWxhbWFueWEKK2xlYmloCit0ZXJsZWJpaAorYmVybWFjYW0KK21hY2FtCitzZW1hY2FtCittYWthCittYWthbnlhCittYWtpbgorbWFsYWgKK21hbGFoYW4KK21hbXB1CittYW1wdWthaAorbWFuYQorbWFuYWthbGEKK21hbmFsYWdpCittYXNpaAorbWFzaWhrYWgKK3NlbWFzaWgKK21hc2luZworbWF1CittYXVwdW4KK3NlbWF1bnlhCittZW1hbmcKK21lcmVrYQorbWVyZWthbGFoCittZXNraQorbWVza2lwdW4KK3NlbXVsYQorbXVuZ2tpbgorbXVuZ2tpbmthaAorbmFoCituYW11bgorbmFudGkKK25hbnRpbnlhCitueWFyaXMKK29sZWgKK29sZWhueWEKK3Nlb3JhbmcKK3Nlc2VvcmFuZworcGFkYQorcGFkYW55YQorcGFkYWhhbAorcGFsaW5nCitzZXBhbmphbmcKK3BhbnRhcworc2VwYW50YXNueWEKK3NlcGFudGFzbnlhbGFoCitwYXJhCitwYXN0aQorcGFzdGlsYWgKK3BlcgorcGVybmFoCitwdWxhCitwdW4KK21lcnVwYWthbgorcnVwYW55YQorc2VydXBhCitzYWF0CitzYWF0bnlhCitzZXNhYXQKK3NhamEKK3NhamFsYWgKK3NhbGluZworYmVyc2FtYQorc2FtYQorc2VzYW1hCitzYW1iaWwKK3NhbXBhaQorc2FuYQorc2FuZ2F0CitzYW5nYXRsYWgKK3NheWEKK3NheWFsYWgKK3NlCitzZWJhYgorc2ViYWJueWEKK3NlYnVhaAordGVyc2VidXQKK3RlcnNlYnV0bGFoCitzZWRhbmcKK3NlZGFuZ2thbgorc2VkaWtpdAorc2VkaWtpdG55YQorc2VnYWxhCitzZWdhbGFueWEKK3NlZ2VyYQorc2VzZWdlcmEKK3NlamFrCitzZWplbmFrCitzZWthbGkKK3Nla2FsaWFuCitzZWthbGlwdW4KK3Nlc2VrYWxpCitzZWthbGlndXMKK3Nla2FyYW5nCitzZWthcmFuZworc2VraXRhcgorc2VraXRhcm55YQorc2VsYQorc2VsYWluCitzZWxhbHUKK3NlbHVydWgKK3NlbHVydWhueWEKK3NlbWFraW4KK3NlbWVudGFyYQorc2VtcGF0CitzZW11YQorc2VtdWFueWEKK3NlbmRpcmkKK3NlbmRpcmlueWEKK3Nlb2xhaAorc2VwZXJ0aQorc2VwZXJ0aW55YQorc2VyaW5nCitzZXJpbmdueWEKK3NlcnRhCitzaWFwYQorc2lhcGFrYWgKK3NpYXBhcHVuCitkaXNpbmkKK2Rpc2luaWxhaAorc2luaQorc2luaWxhaAorc2VzdWF0dQorc2VzdWF0dW55YQorc3VhdHUKK3Nlc3VkYWgKK3Nlc3VkYWhueWEKK3N1ZGFoCitzdWRhaGthaAorc3VkYWhsYWgKK3N1cGF5YQordGFkaQordGFkaW55YQordGFrCit0YW5wYQorc2V0ZWxhaAordGVsYWgKK3RlbnRhbmcKK3RlbnR1Cit0ZW50dWxhaAordGVudHVueWEKK3RlcnRlbnR1CitzZXRlcnVzbnlhCit0YXBpCit0ZXRhcGkKK3NldGlhcAordGlhcAorc2V0aWRha255YQordGlkYWsKK3RpZGFra2FoCit0aWRha2xhaAordG9oCit3YWR1aAord2FoCit3YWhhaQorc2V3YWt0dQord2FsYXUKK3dhbGF1cHVuCit3b25nCit5YWl0dQoreWFrbmkKK3lhbmcKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjE5Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfaXQudHh0CkBAIC0wLDAgKzEsMzAzIEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2l0YWxpYW4vc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorIHwKKyB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIgorCisgfCBBbiBJdGFsaWFuIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKK2FkICAgICAgICAgICAgIHwgIGEgKHRvKSBiZWZvcmUgdm93ZWwKK2FsICAgICAgICAgICAgIHwgIGEgKyBpbAorYWxsbyAgICAgICAgICAgfCAgYSArIGxvCithaSAgICAgICAgICAgICB8ICBhICsgaQorYWdsaSAgICAgICAgICAgfCAgYSArIGdsaQorYWxsICAgICAgICAgICAgfCAgYSArIGwnCithZ2wgICAgICAgICAgICB8ICBhICsgZ2wnCithbGxhICAgICAgICAgICB8ICBhICsgbGEKK2FsbGUgICAgICAgICAgIHwgIGEgKyBsZQorY29uICAgICAgICAgICAgfCAgd2l0aAorY29sICAgICAgICAgICAgfCAgY29uICsgaWwKK2NvaSAgICAgICAgICAgIHwgIGNvbiArIGkgKGZvcm1zIGNvbGxvLCBjb2dsaSBldGMgYXJlIG5vdyB2ZXJ5IHJhcmUpCitkYSAgICAgICAgICAgICB8ICBmcm9tCitkYWwgICAgICAgICAgICB8ICBkYSArIGlsCitkYWxsbyAgICAgICAgICB8ICBkYSArIGxvCitkYWkgICAgICAgICAgICB8ICBkYSArIGkKK2RhZ2xpICAgICAgICAgIHwgIGRhICsgZ2xpCitkYWxsICAgICAgICAgICB8ICBkYSArIGwnCitkYWdsICAgICAgICAgICB8ICBkYSArIGdsbCcKK2RhbGxhICAgICAgICAgIHwgIGRhICsgbGEKK2RhbGxlICAgICAgICAgIHwgIGRhICsgbGUKK2RpICAgICAgICAgICAgIHwgIG9mCitkZWwgICAgICAgICAgICB8ICBkaSArIGlsCitkZWxsbyAgICAgICAgICB8ICBkaSArIGxvCitkZWkgICAgICAgICAgICB8ICBkaSArIGkKK2RlZ2xpICAgICAgICAgIHwgIGRpICsgZ2xpCitkZWxsICAgICAgICAgICB8ICBkaSArIGwnCitkZWdsICAgICAgICAgICB8ICBkaSArIGdsJworZGVsbGEgICAgICAgICAgfCAgZGkgKyBsYQorZGVsbGUgICAgICAgICAgfCAgZGkgKyBsZQoraW4gICAgICAgICAgICAgfCAgaW4KK25lbCAgICAgICAgICAgIHwgIGluICsgZWwKK25lbGxvICAgICAgICAgIHwgIGluICsgbG8KK25laSAgICAgICAgICAgIHwgIGluICsgaQorbmVnbGkgICAgICAgICAgfCAgaW4gKyBnbGkKK25lbGwgICAgICAgICAgIHwgIGluICsgbCcKK25lZ2wgICAgICAgICAgIHwgIGluICsgZ2wnCituZWxsYSAgICAgICAgICB8ICBpbiArIGxhCituZWxsZSAgICAgICAgICB8ICBpbiArIGxlCitzdSAgICAgICAgICAgICB8ICBvbgorc3VsICAgICAgICAgICAgfCAgc3UgKyBpbAorc3VsbG8gICAgICAgICAgfCAgc3UgKyBsbworc3VpICAgICAgICAgICAgfCAgc3UgKyBpCitzdWdsaSAgICAgICAgICB8ICBzdSArIGdsaQorc3VsbCAgICAgICAgICAgfCAgc3UgKyBsJworc3VnbCAgICAgICAgICAgfCAgc3UgKyBnbCcKK3N1bGxhICAgICAgICAgIHwgIHN1ICsgbGEKK3N1bGxlICAgICAgICAgIHwgIHN1ICsgbGUKK3BlciAgICAgICAgICAgIHwgIHRocm91Z2gsIGJ5Cit0cmEgICAgICAgICAgICB8ICBhbW9uZworY29udHJvICAgICAgICAgfCAgYWdhaW5zdAoraW8gICAgICAgICAgICAgfCAgSQordHUgICAgICAgICAgICAgfCAgdGhvdQorbHVpICAgICAgICAgICAgfCAgaGUKK2xlaSAgICAgICAgICAgIHwgIHNoZQorbm9pICAgICAgICAgICAgfCAgd2UKK3ZvaSAgICAgICAgICAgIHwgIHlvdQorbG9ybyAgICAgICAgICAgfCAgdGhleQorbWlvICAgICAgICAgICAgfCAgbXkKK21pYSAgICAgICAgICAgIHwKK21pZWkgICAgICAgICAgIHwKK21pZSAgICAgICAgICAgIHwKK3R1byAgICAgICAgICAgIHwKK3R1YSAgICAgICAgICAgIHwKK3R1b2kgICAgICAgICAgIHwgIHRoeQordHVlICAgICAgICAgICAgfAorc3VvICAgICAgICAgICAgfAorc3VhICAgICAgICAgICAgfAorc3VvaSAgICAgICAgICAgfCAgaGlzLCBoZXIKK3N1ZSAgICAgICAgICAgIHwKK25vc3RybyAgICAgICAgIHwgIG91cgorbm9zdHJhICAgICAgICAgfAorbm9zdHJpICAgICAgICAgfAorbm9zdHJlICAgICAgICAgfAordm9zdHJvICAgICAgICAgfCAgeW91cgordm9zdHJhICAgICAgICAgfAordm9zdHJpICAgICAgICAgfAordm9zdHJlICAgICAgICAgfAorbWkgICAgICAgICAgICAgfCAgbWUKK3RpICAgICAgICAgICAgIHwgIHRoZWUKK2NpICAgICAgICAgICAgIHwgIHVzLCB0aGVyZQordmkgICAgICAgICAgICAgfCAgeW91LCB0aGVyZQorbG8gICAgICAgICAgICAgfCAgaGltLCB0aGUKK2xhICAgICAgICAgICAgIHwgIGhlciwgdGhlCitsaSAgICAgICAgICAgICB8ICB0aGVtCitsZSAgICAgICAgICAgICB8ICB0aGVtLCB0aGUKK2dsaSAgICAgICAgICAgIHwgIHRvIGhpbSwgdGhlCituZSAgICAgICAgICAgICB8ICBmcm9tIHRoZXJlIGV0YworaWwgICAgICAgICAgICAgfCAgdGhlCit1biAgICAgICAgICAgICB8ICBhCit1bm8gICAgICAgICAgICB8ICBhCit1bmEgICAgICAgICAgICB8ICBhCittYSAgICAgICAgICAgICB8ICBidXQKK2VkICAgICAgICAgICAgIHwgIGFuZAorc2UgICAgICAgICAgICAgfCAgaWYKK3BlcmNow6kgICAgICAgICB8ICB3aHksIGJlY2F1c2UKK2FuY2hlICAgICAgICAgIHwgIGFsc28KK2NvbWUgICAgICAgICAgIHwgIGhvdworZG92ICAgICAgICAgICAgfCAgd2hlcmUgKGFzIGRvdicpCitkb3ZlICAgICAgICAgICB8ICB3aGVyZQorY2hlICAgICAgICAgICAgfCAgd2hvLCB0aGF0CitjaGkgICAgICAgICAgICB8ICB3aG8KK2N1aSAgICAgICAgICAgIHwgIHdob20KK25vbiAgICAgICAgICAgIHwgIG5vdAorcGnDuSAgICAgICAgICAgIHwgIG1vcmUKK3F1YWxlICAgICAgICAgIHwgIHdobywgdGhhdAorcXVhbnRvICAgICAgICAgfCAgaG93IG11Y2gKK3F1YW50aSAgICAgICAgIHwKK3F1YW50YSAgICAgICAgIHwKK3F1YW50ZSAgICAgICAgIHwKK3F1ZWxsbyAgICAgICAgIHwgIHRoYXQKK3F1ZWxsaSAgICAgICAgIHwKK3F1ZWxsYSAgICAgICAgIHwKK3F1ZWxsZSAgICAgICAgIHwKK3F1ZXN0byAgICAgICAgIHwgIHRoaXMKK3F1ZXN0aSAgICAgICAgIHwKK3F1ZXN0YSAgICAgICAgIHwKK3F1ZXN0ZSAgICAgICAgIHwKK3NpICAgICAgICAgICAgIHwgIHllcwordHV0dG8gICAgICAgICAgfCAgYWxsCit0dXR0aSAgICAgICAgICB8ICBhbGwKKworICAgICAgICAgICAgICAgfCAgc2luZ2xlIGxldHRlciBmb3JtczoKKworYSAgICAgICAgICAgICAgfCAgYXQKK2MgICAgICAgICAgICAgIHwgIGFzIGMnIGZvciBjZSBvciBjaQorZSAgICAgICAgICAgICAgfCAgYW5kCitpICAgICAgICAgICAgICB8ICB0aGUKK2wgICAgICAgICAgICAgIHwgIGFzIGwnCitvICAgICAgICAgICAgICB8ICBvcgorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIGF2ZXJlLCB0byBoYXZlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKKworaG8KK2hhaQoraGEKK2FiYmlhbW8KK2F2ZXRlCitoYW5ubworYWJiaWEKK2FiYmlhdGUKK2FiYmlhbm8KK2F2csOyCithdnJhaQorYXZyw6AKK2F2cmVtbworYXZyZXRlCithdnJhbm5vCithdnJlaQorYXZyZXN0aQorYXZyZWJiZQorYXZyZW1tbworYXZyZXN0ZQorYXZyZWJiZXJvCithdmV2bworYXZldmkKK2F2ZXZhCithdmV2YW1vCithdmV2YXRlCithdmV2YW5vCitlYmJpCithdmVzdGkKK2ViYmUKK2F2ZW1tbworYXZlc3RlCitlYmJlcm8KK2F2ZXNzaQorYXZlc3NlCithdmVzc2ltbworYXZlc3Nlcm8KK2F2ZW5kbworYXZ1dG8KK2F2dXRhCithdnV0aQorYXZ1dGUKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBlc3NlcmUsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3Nvbm8KK3NlaQorw6gKK3NpYW1vCitzaWV0ZQorc2lhCitzaWF0ZQorc2lhbm8KK3NhcsOyCitzYXJhaQorc2Fyw6AKK3NhcmVtbworc2FyZXRlCitzYXJhbm5vCitzYXJlaQorc2FyZXN0aQorc2FyZWJiZQorc2FyZW1tbworc2FyZXN0ZQorc2FyZWJiZXJvCitlcm8KK2VyaQorZXJhCitlcmF2YW1vCitlcmF2YXRlCitlcmFubworZnVpCitmb3N0aQorZnUKK2Z1bW1vCitmb3N0ZQorZnVyb25vCitmb3NzaQorZm9zc2UKK2Zvc3NpbW8KK2Zvc3Nlcm8KK2Vzc2VuZG8KKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBmYXJlLCB0byBkbyAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSwgZmEsIGZhdC0pOgorZmFjY2lvCitmYWkKK2ZhY2NpYW1vCitmYW5ubworZmFjY2lhCitmYWNjaWF0ZQorZmFjY2lhbm8KK2ZhcsOyCitmYXJhaQorZmFyw6AKK2ZhcmVtbworZmFyZXRlCitmYXJhbm5vCitmYXJlaQorZmFyZXN0aQorZmFyZWJiZQorZmFyZW1tbworZmFyZXN0ZQorZmFyZWJiZXJvCitmYWNldm8KK2ZhY2V2aQorZmFjZXZhCitmYWNldmFtbworZmFjZXZhdGUKK2ZhY2V2YW5vCitmZWNpCitmYWNlc3RpCitmZWNlCitmYWNlbW1vCitmYWNlc3RlCitmZWNlcm8KK2ZhY2Vzc2kKK2ZhY2Vzc2UKK2ZhY2Vzc2ltbworZmFjZXNzZXJvCitmYWNlbmRvCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2Ygc3RhcmUsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3N0bworc3RhaQorc3RhCitzdGlhbW8KK3N0YW5ubworc3RpYQorc3RpYXRlCitzdGlhbm8KK3N0YXLDsgorc3RhcmFpCitzdGFyw6AKK3N0YXJlbW8KK3N0YXJldGUKK3N0YXJhbm5vCitzdGFyZWkKK3N0YXJlc3RpCitzdGFyZWJiZQorc3RhcmVtbW8KK3N0YXJlc3RlCitzdGFyZWJiZXJvCitzdGF2bworc3RhdmkKK3N0YXZhCitzdGF2YW1vCitzdGF2YXRlCitzdGF2YW5vCitzdGV0dGkKK3N0ZXN0aQorc3RldHRlCitzdGVtbW8KK3N0ZXN0ZQorc3RldHRlcm8KK3N0ZXNzaQorc3Rlc3NlCitzdGVzc2ltbworc3Rlc3Nlcm8KK3N0YW5kbwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfamEudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfamEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19qYS50eHQKQEAgLTAsMCArMSwxMjcgQEAKKyMKKyMgVGhpcyBmaWxlIGRlZmluZXMgYSBzdG9wd29yZCBzZXQgZm9yIEphcGFuZXNlLgorIworIyBUaGlzIHNldCBpcyBtYWRlIHVwIG9mIGhhbmQtcGlja2VkIGZyZXF1ZW50IHRlcm1zIGZyb20gc2VnbWVudGVkIEphcGFuZXNlIFdpa2lwZWRpYS4KKyMgUHVuY3R1YXRpb24gY2hhcmFjdGVycyBhbmQgZnJlcXVlbnQga2FuamkgaGF2ZSBtb3N0bHkgYmVlbiBsZWZ0IG91dC4gIFNlZSBMVUNFTkUtMzc0NQorIyBmb3IgZnJlcXVlbmN5IGxpc3RzLCBldGMuIHRoYXQgY2FuIGJlIHVzZWZ1bCBmb3IgbWFraW5nIHlvdXIgb3duIHNldCAoaWYgZGVzaXJlZCkKKyMKKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiB0aGVzZSBzdG9wd29yZHMgYW5kIHRoZSB0ZXJtcyBzdG9wcGVkIHdoZW4gdXNlZAorIyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBKYXBhbmVzZVBhcnRPZlNwZWVjaFN0b3BGaWx0ZXIuICBXaGVuIGVkaXRpbmcgdGhpcyBmaWxlLCBub3RlCisjIHRoYXQgY29tbWVudHMgYXJlIG5vdCBhbGxvd2VkIG9uIHRoZSBzYW1lIGxpbmUgYXMgc3RvcHdvcmRzLgorIworIyBBbHNvIG5vdGUgdGhhdCBzdG9wcGluZyBpcyBkb25lIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuICBDaGFuZ2UgeW91ciBTdG9wRmlsdGVyCisjIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgY2FzZS1zZW5zaXRpdmUgc3RvcHBpbmcuICBMYXN0bHksIG5vdGUgdGhhdCBzdG9wcGluZyBpcyBkb25lCisjIHVzaW5nIHRoZSBzYW1lIGNoYXJhY3RlciB3aWR0aCBhcyB0aGUgZW50cmllcyBpbiB0aGlzIGZpbGUuICBTaW5jZSB0aGlzIFN0b3BGaWx0ZXIgaXMKKyMgbm9ybWFsbHkgZG9uZSBhZnRlciBhIENKS1dpZHRoRmlsdGVyIGluIHlvdXIgY2hhaW4sIHlvdSB3b3VsZCB1c3VhbGx5IHdhbnQgeW91ciByb21hamkKKyMgZW50cmllcyB0byBiZSBpbiBoYWxmLXdpZHRoIGFuZCB5b3VyIGthbmEgZW50cmllcyB0byBiZSBpbiBmdWxsLXdpZHRoLgorIwor44GuCivjgasKK+OBrwor44KSCivjgZ8KK+OBjAor44GnCivjgaYKK+OBqAor44GXCivjgowKK+OBlQor44GC44KLCivjgYTjgosKK+OCggor44GZ44KLCivjgYvjgokKK+OBqgor44GT44GoCivjgajjgZfjgaYKK+OBhAor44KECivjgozjgosKK+OBquOBqQor44Gq44GjCivjgarjgYQKK+OBk+OBrgor44Gf44KBCivjgZ3jga4KK+OBguOBowor44KI44GGCivjgb7jgZ8KK+OCguOBrgor44Go44GE44GGCivjgYLjgooKK+OBvuOBpwor44KJ44KMCivjgarjgosKK+OBuAor44GLCivjgaAKK+OBk+OCjAor44Gr44KI44Gj44GmCivjgavjgojjgooKK+OBiuOCigor44KI44KKCivjgavjgojjgosKK+OBmgor44Gq44KKCivjgonjgozjgosKK+OBq+OBiuOBhOOBpgor44GwCivjgarjgYvjgaMKK+OBquOBjwor44GX44GL44GXCivjgavjgaTjgYTjgaYKK+OBmwor44Gg44GjCivjgZ3jga7lvowKK+OBp+OBjeOCiwor44Gd44KMCivjgYYKK+OBruOBpwor44Gq44GKCivjga7jgb8KK+OBp+OBjQor44GNCivjgaQKK+OBq+OBiuOBkeOCiwor44GK44KI44GzCivjgYTjgYYKK+OBleOCieOBqwor44Gn44KCCivjgokKK+OBn+OCigor44Gd44Gu5LuWCivjgavplqLjgZnjgosKK+OBn+OBoQor44G+44GZCivjgpMKK+OBquOCiQor44Gr5a++44GX44GmCivnibnjgasKK+OBm+OCiwor5Y+K44GzCivjgZPjgozjgokKK+OBqOOBjQor44Gn44GvCivjgavjgaYKK+OBu+OBiwor44Gq44GM44KJCivjgYbjgaEKK+OBneOBl+OBpgor44Go44Go44KC44GrCivjgZ/jgaDjgZcKK+OBi+OBpOOBpgor44Gd44KM44Ge44KMCivjgb7jgZ/jga8KK+OBigor44G744GpCivjgoLjga7jga4KK+OBq+WvvuOBmeOCiwor44G744Go44KT44GpCivjgajlhbHjgasKK+OBqOOBhOOBo+OBnwor44Gn44GZCivjgajjgoIKK+OBqOOBk+OCjQor44GT44GTCisjIyMjIyBFbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWEyM2MKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19sdi50eHQKQEAgLTAsMCArMSwxNzIgQEAKKyMgU2V0IG9mIExhdHZpYW4gc3RvcHdvcmRzIGZyb20gQSBTdGVtbWluZyBBbGdvcml0aG0gZm9yIExhdHZpYW4sIEthcmxpcyBLcmVzbGlucworIyB0aGUgb3JpZ2luYWwgbGlzdCBvZiBvdmVyIDgwMCBmb3JtcyB3YXMgcmVmaW5lZDogCisjICAgcHJvbm91bnMsIGFkdmVyYnMsIGludGVyamVjdGlvbnMgd2VyZSByZW1vdmVkCisjIAorIyBwcmVwb3NpdGlvbnMKK2FpegorYXAKK2FyCithcGFrxaEKK8SBcnB1cworYXVnxaFwdXMKK2JlegorY2F1cgorZMSTxLwKK2dhcgoraWVrxaEKK2l6Citrb3DFoQorbGFiYWQKK2xlanB1cworbMSrZHoKK25vCitvdHJwdXMKK3BhCitwYXIKK3DEgXIKK3DEk2MKK3BpZQorcGlybXMKK3ByZXQKK3ByaWVrxaEKK3N0YXJwCivFoWFpcHVzCit1egordmnFhnB1cwordmlycwordmlyc3B1cworemVtCithcGFrxaFwdXMKKyMgQ29uanVuY3Rpb25zCit1bgorYmV0CitqbworamEKK2thCitsYWkKK3RvbcSTcgordGlra28KK3R1cnByZXTEqworYXLEqwora2F1dAorZ2FuCit0xIFkxJPEvAordMSBCituZQordGlrdmllbgordmllbgora8SBCitpcgordGUKK3ZhaQora2FtxJNyCisjIFBhcnRpY2xlcworYXIKK2RpZXppbgorZHJvxaFpCitkaWVtxb7Ek2wKK25lYsWrdAoraWsKK2l0Cit0YcSNdQorbnUKK3BhdAordGlrbGFiCitpZWvFoXB1cworbmVkegordGlrCituZXZpcwordHVycHJldGltCitqZWIKK2lla2FtCitpZWvEgW0KK2lla8SBbXMKK2tvbMSrZHoKK2zEq2R6a28KK3Rpa2zEq2R6CitqZWLFoXUKK3TEgWxhYgordMSBcMSTYworbmVrxIEKK2l0aW4KK2rEgQoramF1CitqZWwKK27EkworbmV6aW4KK3RhZAordGlrYWkKK3ZpcwordGFrCitpZWthbXMKK3ZpZW4KKyMgbW9kYWwgdmVyYnMKK2LFq3QgIAorYmlqdSAKK2JpamkKK2JpamEKK2JpasSBbQorYmlqxIF0Citlc211Citlc2kKK2VzYW0KK2VzYXQgCitixavFoXUgICAgIAorYsWrc2kKK2LFq3MKK2LFq3NpbQorYsWrc2lldAordGlrdAordGlrdQordGlraQordGlrYQordGlrxIFtCit0aWvEgXQKK3RpZWt1Cit0aWVjCit0aWVrCit0aWVrYW0KK3RpZWthdAordGlrxaF1Cit0aWtzCit0aWtzaW0KK3Rpa3NpZXQKK3RhcHQKK3RhcGkKK3RhcMSBdAordG9wYXQKK3RhcMWhdQordGFwc2kKK3RhcHMKK3RhcHNpbQordGFwc2lldAora8S8xat0CitrxLx1dnUKK2vEvHV2aQora8S8dXZhCitrxLx1dsSBbQora8S8dXbEgXQKK2vEvMWrc3R1CitrxLzFq3N0aQora8S8xatzdAora8S8xatzdGFtCitrxLzFq3N0YXQKK2vEvMWrxaF1CitrxLzFq3NpCitrxLzFq3MKK2vEvMWrc2ltCitrxLzFq3NpZXQKKyMgdmVyYnMKK3ZhcsSTdAordmFyxJNqdQordmFyxJNqxIFtCit2YXLEk8WhdQordmFyxJNzaW0KK3ZhcgordmFyxJNqaQordmFyxJNqxIF0Cit2YXLEk3NpCit2YXLEk3NpZXQKK3ZhcmF0Cit2YXLEk2phCit2YXLEk3MKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX25sLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX25sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2EyYWVhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfbmwudHh0CkBAIC0wLDAgKzEsMTE5IEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2R1dGNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBEdXRjaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCBUaGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20KKyB8IGEgbGFyZ2Ugc2FtcGxlIG9mIER1dGNoIHRleHQuCisKKyB8IER1dGNoIHN0b3Agd29yZHMgZnJlcXVlbnRseSBleGhpYml0IGhvbW9ueW0gY2xhc2hlcy4gVGhlc2UgYXJlIGluZGljYXRlZAorIHwgY2xlYXJseSBiZWxvdy4KKworZGUgICAgICAgICAgICAgfCAgdGhlCitlbiAgICAgICAgICAgICB8ICBhbmQKK3ZhbiAgICAgICAgICAgIHwgIG9mLCBmcm9tCitpayAgICAgICAgICAgICB8ICBJLCB0aGUgZWdvCit0ZSAgICAgICAgICAgICB8ICAoMSkgY2hleiwgYXQgZXRjLCAoMikgdG8sICgzKSB0b28KK2RhdCAgICAgICAgICAgIHwgIHRoYXQsIHdoaWNoCitkaWUgICAgICAgICAgICB8ICB0aGF0LCB0aG9zZSwgd2hvLCB3aGljaAoraW4gICAgICAgICAgICAgfCAgaW4sIGluc2lkZQorZWVuICAgICAgICAgICAgfCAgYSwgYW4sIG9uZQoraGlqICAgICAgICAgICAgfCAgaGUKK2hldCAgICAgICAgICAgIHwgIHRoZSwgaXQKK25pZXQgICAgICAgICAgIHwgIG5vdCwgbm90aGluZywgbmF1Z2h0Cit6aWpuICAgICAgICAgICB8ICAoMSkgdG8gYmUsIGJlaW5nLCAoMikgaGlzLCBvbmUncywgaXRzCitpcyAgICAgICAgICAgICB8ICBpcword2FzICAgICAgICAgICAgfCAgKDEpIHdhcywgcGFzdCB0ZW5zZSBvZiBhbGwgcGVyc29ucyBzaW5nLiBvZiAnemlqbicgKHRvIGJlKSAoMikgd2F4LCAoMykgdGhlIHdhc2hpbmcsICg0KSByaXNlIG9mIHJpdmVyCitvcCAgICAgICAgICAgICB8ICBvbiwgdXBvbiwgYXQsIGluLCB1cCwgdXNlZCB1cAorYWFuICAgICAgICAgICAgfCAgb24sIHVwb24sIHRvIChhcyBkYXRpdmUpCittZXQgICAgICAgICAgICB8ICB3aXRoLCBieQorYWxzICAgICAgICAgICAgfCAgbGlrZSwgc3VjaCBhcywgd2hlbgordm9vciAgICAgICAgICAgfCAgKDEpIGJlZm9yZSwgaW4gZnJvbnQgb2YsICgyKSBmdXJyb3cKK2hhZCAgICAgICAgICAgIHwgIGhhZCwgcGFzdCB0ZW5zZSBhbGwgcGVyc29ucyBzaW5nLiBvZiAnaGViYmVuJyAoaGF2ZSkKK2VyICAgICAgICAgICAgIHwgIHRoZXJlCittYWFyICAgICAgICAgICB8ICBidXQsIG9ubHkKK29tICAgICAgICAgICAgIHwgIHJvdW5kLCBhYm91dCwgZm9yIGV0YworaGVtICAgICAgICAgICAgfCAgaGltCitkYW4gICAgICAgICAgICB8ICB0aGVuCit6b3UgICAgICAgICAgICB8ICBzaG91bGQvd291bGQsIHBhc3QgdGVuc2UgYWxsIHBlcnNvbnMgc2luZy4gb2YgJ3p1bGxlbicKK29mICAgICAgICAgICAgIHwgIG9yLCB3aGV0aGVyLCBpZgord2F0ICAgICAgICAgICAgfCAgd2hhdCwgc29tZXRoaW5nLCBhbnl0aGluZworbWlqbiAgICAgICAgICAgfCAgcG9zc2Vzc2l2ZSBhbmQgbm91biAnbWluZScKK21lbiAgICAgICAgICAgIHwgIHBlb3BsZSwgJ29uZScKK2RpdCAgICAgICAgICAgIHwgIHRoaXMKK3pvICAgICAgICAgICAgIHwgIHNvLCB0aHVzLCBpbiB0aGlzIHdheQorZG9vciAgICAgICAgICAgfCAgdGhyb3VnaCBieQorb3ZlciAgICAgICAgICAgfCAgb3ZlciwgYWNyb3NzCit6ZSAgICAgICAgICAgICB8ICBzaGUsIGhlciwgdGhleSwgdGhlbQoremljaCAgICAgICAgICAgfCAgb25lc2VsZgorYmlqICAgICAgICAgICAgfCAgKDEpIGEgYmVlLCAoMikgYnksIG5lYXIsIGF0Citvb2sgICAgICAgICAgICB8ICBhbHNvLCB0b28KK3RvdCAgICAgICAgICAgIHwgIHRpbGwsIHVudGlsCitqZSAgICAgICAgICAgICB8ICB5b3UKK21paiAgICAgICAgICAgIHwgIG1lCit1aXQgICAgICAgICAgICB8ICBvdXQgb2YsIGZyb20KK2RlciAgICAgICAgICAgIHwgIE9sZCBEdXRjaCBmb3JtIG9mICd2YW4gZGVyJyBzdGlsbCBmb3VuZCBpbiBzdXJuYW1lcworZGFhciAgICAgICAgICAgfCAgKDEpIHRoZXJlLCAoMikgYmVjYXVzZQoraGFhciAgICAgICAgICAgfCAgKDEpIGhlciwgdGhlaXIsIHRoZW0sICgyKSBoYWlyCituYWFyICAgICAgICAgICB8ICAoMSkgdW5wbGVhc2FudCwgdW53ZWxsIGV0YywgKDIpIHRvd2FyZHMsICgzKSBhcworaGViICAgICAgICAgICAgfCAgcHJlc2VudCBmaXJzdCBwZXJzb24gc2luZy4gb2YgJ3RvIGhhdmUnCitob2UgICAgICAgICAgICB8ICBob3csIHdoeQoraGVlZnQgICAgICAgICAgfCAgcHJlc2VudCB0aGlyZCBwZXJzb24gc2luZy4gb2YgJ3RvIGhhdmUnCitoZWJiZW4gICAgICAgICB8ICAndG8gaGF2ZScgYW5kIHZhcmlvdXMgcGFydHMgdGhlcmVvZgorZGV6ZSAgICAgICAgICAgfCAgdGhpcwordSAgICAgICAgICAgICAgfCAgeW91Cit3YW50ICAgICAgICAgICB8ICAoMSkgZm9yLCAoMikgbWl0dGVuLCAoMykgcmlnZ2luZworbm9nICAgICAgICAgICAgfCAgeWV0LCBzdGlsbAoremFsICAgICAgICAgICAgfCAgJ3NoYWxsJywgZmlyc3QgYW5kIHRoaXJkIHBlcnNvbiBzaW5nLiBvZiB2ZXJiICd6dWxsZW4nICh3aWxsKQorbWUgICAgICAgICAgICAgfCAgbWUKK3ppaiAgICAgICAgICAgIHwgIHNoZSwgdGhleQorbnUgICAgICAgICAgICAgfCAgbm93CitnZSAgICAgICAgICAgICB8ICAndGhvdScsIHN0aWxsIHVzZWQgaW4gQmVsZ2l1bSBhbmQgc291dGggTmV0aGVybGFuZHMKK2dlZW4gICAgICAgICAgIHwgIG5vbmUKK29tZGF0ICAgICAgICAgIHwgIGJlY2F1c2UKK2lldHMgICAgICAgICAgIHwgIHNvbWV0aGluZywgc29tZXdoYXQKK3dvcmRlbiAgICAgICAgIHwgIHRvIGJlY29tZSwgZ3JvdywgZ2V0Cit0b2NoICAgICAgICAgICB8ICB5ZXQsIHN0aWxsCithbCAgICAgICAgICAgICB8ICBhbGwsIGV2ZXJ5LCBlYWNoCit3YXJlbiAgICAgICAgICB8ICAoMSkgJ3dlcmUnICgyKSB0byB3YW5kZXIsICgzKSB3YXJlcywgKDMpCit2ZWVsICAgICAgICAgICB8ICBtdWNoLCBtYW55CittZWVyICAgICAgICAgICB8ICAoMSkgbW9yZSwgKDIpIGxha2UKK2RvZW4gICAgICAgICAgIHwgIHRvIGRvLCB0byBtYWtlCit0b2VuICAgICAgICAgICB8ICB0aGVuLCB3aGVuCittb2V0ICAgICAgICAgICB8ICBub3VuICdzcG90L21vdGUnIGFuZCBwcmVzZW50IGZvcm0gb2YgJ3RvIG11c3QnCitiZW4gICAgICAgICAgICB8ICAoMSkgYW0sICgyKSAnYXJlJyBpbiBpbnRlcnJvZ2F0aXZlIHNlY29uZCBwZXJzb24gc2luZ3VsYXIgb2YgJ3RvIGJlJworem9uZGVyICAgICAgICAgfCAgd2l0aG91dAora2FuICAgICAgICAgICAgfCAgbm91biAnY2FuJyBhbmQgcHJlc2VudCBmb3JtIG9mICd0byBiZSBhYmxlJworaHVuICAgICAgICAgICAgfCAgdGhlaXIsIHRoZW0KK2R1cyAgICAgICAgICAgIHwgIHNvLCBjb25zZXF1ZW50bHkKK2FsbGVzICAgICAgICAgIHwgIGFsbCwgZXZlcnl0aGluZywgYW55dGhpbmcKK29uZGVyICAgICAgICAgIHwgIHVuZGVyLCBiZW5lYXRoCitqYSAgICAgICAgICAgICB8ICB5ZXMsIG9mIGNvdXJzZQorZWVucyAgICAgICAgICAgfCAgb25jZSwgb25lIGRheQoraGllciAgICAgICAgICAgfCAgaGVyZQord2llICAgICAgICAgICAgfCAgd2hvCit3ZXJkICAgICAgICAgICB8ICBpbXBlcmZlY3QgdGhpcmQgcGVyc29uIHNpbmcuIG9mICdiZWNvbWUnCithbHRpamQgICAgICAgICB8ICBhbHdheXMKK2RvY2ggICAgICAgICAgIHwgIHlldCwgYnV0IGV0Yword29yZHQgICAgICAgICAgfCAgcHJlc2VudCB0aGlyZCBwZXJzb24gc2luZy4gb2YgJ2JlY29tZScKK3dlemVuICAgICAgICAgIHwgICgxKSB0byBiZSwgKDIpICdiZWVuJyBhcyBpbiAnYmVlbiBmaXNoaW5nJywgKDMpIG9ycGhhbnMKK2t1bm5lbiAgICAgICAgIHwgIHRvIGJlIGFibGUKK29ucyAgICAgICAgICAgIHwgIHVzL291cgoremVsZiAgICAgICAgICAgfCAgc2VsZgordGVnZW4gICAgICAgICAgfCAgYWdhaW5zdCwgdG93YXJkcywgYXQKK25hICAgICAgICAgICAgIHwgIGFmdGVyLCBuZWFyCityZWVkcyAgICAgICAgICB8ICBhbHJlYWR5Cit3aWwgICAgICAgICAgICB8ICAoMSkgcHJlc2VudCB0ZW5zZSBvZiAnd2FudCcsICgyKSAnd2lsbCcsIG5vdW4sICgzKSBmZW5kZXIKK2tvbiAgICAgICAgICAgIHwgIGNvdWxkOyBwYXN0IHRlbnNlIG9mICd0byBiZSBhYmxlJworbmlldHMgICAgICAgICAgfCAgbm90aGluZwordXcgICAgICAgICAgICAgfCAgeW91cgoraWVtYW5kICAgICAgICAgfCAgc29tZWJvZHkKK2dld2Vlc3QgICAgICAgIHwgIGJlZW47IHBhc3QgcGFydGljaXBsZSBvZiAnYmUnCithbmRlcmUgICAgICAgICB8ICBvdGhlcgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTJjMjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19uby50eHQKQEAgLTAsMCArMSwxOTQgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvbm9yd2VnaWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBOb3J3ZWdpYW4gc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworIHwgVGhpcyBzdG9wIHdvcmQgbGlzdCBpcyBmb3IgdGhlIGRvbWluYW50IGJva23DpWwgZGlhbGVjdC4gV29yZHMgdW5pcXVlCisgfCB0byBueW5vcnNrIGFyZSBtYXJrZWQgKi4KKworIHwgUmV2aXNlZCBieSBKYW4gQnJ1dXNnYWFyZCA8SmFuLkJydXVzZ2FhcmRAc3NiLm5vPiwgSmFuIDIwMDUKKworb2cgICAgICAgICAgICAgfCBhbmQKK2kgICAgICAgICAgICAgIHwgaW4KK2plZyAgICAgICAgICAgIHwgSQorZGV0ICAgICAgICAgICAgfCBpdC90aGlzL3RoYXQKK2F0ICAgICAgICAgICAgIHwgdG8gKHcuIGluZi4pCitlbiAgICAgICAgICAgICB8IGEvYW4KK2V0ICAgICAgICAgICAgIHwgYS9hbgorZGVuICAgICAgICAgICAgfCBpdC90aGlzL3RoYXQKK3RpbCAgICAgICAgICAgIHwgdG8KK2VyICAgICAgICAgICAgIHwgaXMvYW0vYXJlCitzb20gICAgICAgICAgICB8IHdoby90aGF0Citww6UgICAgICAgICAgICAgfCBvbgorZGUgICAgICAgICAgICAgfCB0aGV5IC8geW91KGZvcm1hbCkKK21lZCAgICAgICAgICAgIHwgd2l0aAoraGFuICAgICAgICAgICAgfCBoZQorYXYgICAgICAgICAgICAgfCBvZgoraWtrZSAgICAgICAgICAgfCBub3QKK2lra2plICAgICAgICAgIHwgbm90ICoKK2RlciAgICAgICAgICAgIHwgdGhlcmUKK3PDpSAgICAgICAgICAgICB8IHNvCit2YXIgICAgICAgICAgICB8IHdhcy93ZXJlCittZWcgICAgICAgICAgICB8IG1lCitzZWcgICAgICAgICAgICB8IHlvdQorbWVuICAgICAgICAgICAgfCBidXQKK2V0dCAgICAgICAgICAgIHwgb25lCitoYXIgICAgICAgICAgICB8IGhhdmUKK29tICAgICAgICAgICAgIHwgYWJvdXQKK3ZpICAgICAgICAgICAgIHwgd2UKK21pbiAgICAgICAgICAgIHwgbXkKK21pdHQgICAgICAgICAgIHwgbXkKK2hhICAgICAgICAgICAgIHwgaGF2ZQoraGFkZGUgICAgICAgICAgfCBoYWQKK2h1biAgICAgICAgICAgIHwgc2hlCituw6UgICAgICAgICAgICAgfCBub3cKK292ZXIgICAgICAgICAgIHwgb3ZlcgorZGEgICAgICAgICAgICAgfCB3aGVuL2FzCit2ZWQgICAgICAgICAgICB8IGJ5L2tub3cKK2ZyYSAgICAgICAgICAgIHwgZnJvbQorZHUgICAgICAgICAgICAgfCB5b3UKK3V0ICAgICAgICAgICAgIHwgb3V0CitzaW4gICAgICAgICAgICB8IHlvdXIKK2RlbSAgICAgICAgICAgIHwgdGhlbQorb3NzICAgICAgICAgICAgfCB1cworb3BwICAgICAgICAgICAgfCB1cAorbWFuICAgICAgICAgICAgfCB5b3Uvb25lCitrYW4gICAgICAgICAgICB8IGNhbgoraGFucyAgICAgICAgICAgfCBoaXMKK2h2b3IgICAgICAgICAgIHwgd2hlcmUKK2VsbGVyICAgICAgICAgIHwgb3IKK2h2YSAgICAgICAgICAgIHwgd2hhdAorc2thbCAgICAgICAgICAgfCBzaGFsbC9tdXN0CitzZWx2ICAgICAgICAgICB8IHNlbGYgKHJlZmxlY3RpdmUpCitzasO4bCAgICAgICAgICAgfCBzZWxmIChyZWZsZWN0aXZlKQoraGVyICAgICAgICAgICAgfCBoZXJlCithbGxlICAgICAgICAgICB8IGFsbAordmlsICAgICAgICAgICAgfCB3aWxsCitibGkgICAgICAgICAgICB8IGJlY29tZQorYmxlICAgICAgICAgICAgfCBiZWNhbWUKK2JsZWkgICAgICAgICAgIHwgYmVjYW1lICoKK2JsaXR0ICAgICAgICAgIHwgaGF2ZSBiZWNvbWUKK2t1bm5lICAgICAgICAgIHwgY291bGQKK2lubiAgICAgICAgICAgIHwgaW4KK27DpXIgICAgICAgICAgICB8IHdoZW4KK3bDpnJlICAgICAgICAgICB8IGJlCitrb20gICAgICAgICAgICB8IGNvbWUKK25vZW4gICAgICAgICAgIHwgc29tZQorbm9lICAgICAgICAgICAgfCBzb21lCit2aWxsZSAgICAgICAgICB8IHdvdWxkCitkZXJlICAgICAgICAgICB8IHlvdQorc29tICAgICAgICAgICAgfCB3aG8vd2hpY2gvdGhhdAorZGVyZXMgICAgICAgICAgfCB0aGVpci90aGVpcnMKK2t1biAgICAgICAgICAgIHwgb25seS9qdXN0CitqYSAgICAgICAgICAgICB8IHllcworZXR0ZXIgICAgICAgICAgfCBhZnRlcgorbmVkICAgICAgICAgICAgfCBkb3duCitza3VsbGUgICAgICAgICB8IHNob3VsZAorZGVubmUgICAgICAgICAgfCB0aGlzCitmb3IgICAgICAgICAgICB8IGZvci9iZWNhdXNlCitkZWcgICAgICAgICAgICB8IHlvdQorc2kgICAgICAgICAgICAgfCBoZXJzL2hpcworc2luZSAgICAgICAgICAgfCBoZXJzL2hpcworc2l0dCAgICAgICAgICAgfCBoZXJzL2hpcworbW90ICAgICAgICAgICAgfCBhZ2FpbnN0CivDpSAgICAgICAgICAgICAgfCB0bworbWVnZXQgICAgICAgICAgfCBtdWNoCitodm9yZm9yICAgICAgICB8IHdoeQorZGV0dGUgICAgICAgICAgfCB0aGlzCitkaXNzZSAgICAgICAgICB8IHRoZXNlL3Rob3NlCit1dGVuICAgICAgICAgICB8IHdpdGhvdXQKK2h2b3JkYW4gICAgICAgIHwgaG93CitpbmdlbiAgICAgICAgICB8IG5vbmUKK2RpbiAgICAgICAgICAgIHwgeW91cgorZGl0dCAgICAgICAgICAgfCB5b3VyCitibGlyICAgICAgICAgICB8IGJlY29tZQorc2FtbWUgICAgICAgICAgfCBzYW1lCitodmlsa2VuICAgICAgICB8IHdoaWNoCitodmlsa2UgICAgICAgICB8IHdoaWNoIChwbHVyYWwpCitzw6VubiAgICAgICAgICAgfCBzdWNoIGEKK2lubmkgICAgICAgICAgIHwgaW5zaWRlL3dpdGhpbgorbWVsbG9tICAgICAgICAgfCBiZXR3ZWVuCit2w6VyICAgICAgICAgICAgfCBvdXIKK2h2ZXIgICAgICAgICAgIHwgZWFjaAoraHZlbSAgICAgICAgICAgfCB3aG8KK3ZvcnMgICAgICAgICAgIHwgdXMvb3VycworaHZpcyAgICAgICAgICAgfCB3aG9zZQorYsOlZGUgICAgICAgICAgIHwgYm90aAorYmFyZSAgICAgICAgICAgfCBvbmx5L2p1c3QKK2VubiAgICAgICAgICAgIHwgdGhhbgorZm9yZGkgICAgICAgICAgfCBhcy9iZWNhdXNlCitmw7hyICAgICAgICAgICAgfCBiZWZvcmUKK21hbmdlICAgICAgICAgIHwgbWFueQorb2dzw6UgICAgICAgICAgIHwgYWxzbworc2xpayAgICAgICAgICAgfCBqdXN0Cit2w6ZydCAgICAgICAgICAgfCBiZWVuCit2w6ZyZSAgICAgICAgICAgfCB0byBiZQorYsOlZSAgICAgICAgICAgIHwgYm90aCAqCitiZWdnZSAgICAgICAgICB8IGJvdGgKK3NpZGVuICAgICAgICAgIHwgc2luY2UKK2R5a2sgICAgICAgICAgIHwgeW91ciAqCitkeWtrYXIgICAgICAgICB8IHlvdXJzICoKK2RlaSAgICAgICAgICAgIHwgdGhleSAqCitkZWlyYSAgICAgICAgICB8IHRoZW0gKgorZGVpcmVzICAgICAgICAgfCB0aGVpcnMgKgorZGVpbSAgICAgICAgICAgfCB0aGVtICoKK2RpICAgICAgICAgICAgIHwgeW91ciAoZmVtLikgKgorZMOlICAgICAgICAgICAgIHwgYXMvd2hlbiAqCitlZyAgICAgICAgICAgICB8IEkgKgorZWluICAgICAgICAgICAgfCBhL2FuICoKK2VpdCAgICAgICAgICAgIHwgYS9hbiAqCitlaXR0ICAgICAgICAgICB8IGEvYW4gKgorZWxsZXMgICAgICAgICAgfCBvciAqCitob25vbSAgICAgICAgICB8IGhlICoKK2hqw6UgICAgICAgICAgICB8IGF0ICoKK2hvICAgICAgICAgICAgIHwgc2hlICoKK2hvZSAgICAgICAgICAgIHwgc2hlICoKK2hlbm5lICAgICAgICAgIHwgaGVyCitoZW5uYXIgICAgICAgICB8IGhlci9oZXJzCitoZW5uZXMgICAgICAgICB8IGhlcnMKK2hvc3MgICAgICAgICAgIHwgaG93ICoKK2hvc3NlbiAgICAgICAgIHwgaG93ICoKK2lra2plICAgICAgICAgIHwgbm90ICoKK2luZ2kgICAgICAgICAgIHwgbm9vbmUgKgoraW5ramUgICAgICAgICAgfCBub29uZSAqCitrb3JsZWlzICAgICAgICB8IGhvdyAqCitrb3JzbyAgICAgICAgICB8IGhvdyAqCitrdmEgICAgICAgICAgICB8IHdoYXQvd2hpY2ggKgora3ZhciAgICAgICAgICAgfCB3aGVyZSAqCitrdmFyaGVsc3QgICAgICB8IHdoZXJlICoKK2t2ZW4gICAgICAgICAgIHwgd2hvL3dob20gKgora3ZpICAgICAgICAgICAgfCB3aHkgKgora3ZpZm9yICAgICAgICAgfCB3aHkgKgorbWUgICAgICAgICAgICAgfCB3ZSAqCittZWRhbiAgICAgICAgICB8IHdoaWxlICoKK21pICAgICAgICAgICAgIHwgbXkgKgorbWluZSAgICAgICAgICAgfCBteSAqCitteWtqZSAgICAgICAgICB8IG11Y2ggKgorbm8gICAgICAgICAgICAgfCBub3cgKgorbm9rb24gICAgICAgICAgfCBzb21lIChtYXNjLi9uZXV0LikgKgorbm9rYSAgICAgICAgICAgfCBzb21lIChmZW0uKSAqCitub2tvciAgICAgICAgICB8IHNvbWUgKgorbm9rbyAgICAgICAgICAgfCBzb21lICoKK25va3JlICAgICAgICAgIHwgc29tZSAqCitzaSAgICAgICAgICAgICB8IGhpcy9oZXJzICoKK3NpYSAgICAgICAgICAgIHwgc2luY2UgKgorc2lkYW4gICAgICAgICAgfCBzaW5jZSAqCitzbyAgICAgICAgICAgICB8IHNvICoKK3NvbXQgICAgICAgICAgIHwgc29tZSAqCitzb21tZSAgICAgICAgICB8IHNvbWUgKgordW0gICAgICAgICAgICAgfCBhYm91dCoKK3VwcCAgICAgICAgICAgIHwgdXAgKgordmVyZSAgICAgICAgICAgfCBiZSAqCit2b3JlICAgICAgICAgICB8IHdhcyAqCit2ZXJ0ZSAgICAgICAgICB8IGJlY29tZSAqCit2b3J0ICAgICAgICAgICB8IGJlY29tZSAqCit2YXJ0ZSAgICAgICAgICB8IGJlY2FtZSAqCit2YXJ0ICAgICAgICAgICB8IGJlY2FtZSAqCisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2ZlYjAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfcHQudHh0CkBAIC0wLDAgKzEsMjUzIEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL3BvcnR1Z3Vlc2Uvc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorIHwKKyB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIgorCisgfCBBIFBvcnR1Z3Vlc2Ugc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworCisgfCBUaGUgZm9sbG93aW5nIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcworIHwgZGVyaXZpbmcgZnJvbSBhIGxhcmdlIHNhbXBsZSBvZiB0ZXh0LgorCisgfCBFeHRyYSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYXQgdGhlIGVuZC4KKworZGUgICAgICAgICAgICAgfCAgb2YsIGZyb20KK2EgICAgICAgICAgICAgIHwgIHRoZTsgdG8sIGF0OyBoZXIKK28gICAgICAgICAgICAgIHwgIHRoZTsgaGltCitxdWUgICAgICAgICAgICB8ICB3aG8sIHRoYXQKK2UgICAgICAgICAgICAgIHwgIGFuZAorZG8gICAgICAgICAgICAgfCAgZGUgKyBvCitkYSAgICAgICAgICAgICB8ICBkZSArIGEKK2VtICAgICAgICAgICAgIHwgIGluCit1bSAgICAgICAgICAgICB8ICBhCitwYXJhICAgICAgICAgICB8ICBmb3IKKyAgfCDDqSAgICAgICAgICBmcm9tIFNFUgorY29tICAgICAgICAgICAgfCAgd2l0aAorbsOjbyAgICAgICAgICAgIHwgIG5vdCwgbm8KK3VtYSAgICAgICAgICAgIHwgIGEKK29zICAgICAgICAgICAgIHwgIHRoZTsgdGhlbQorbm8gICAgICAgICAgICAgfCAgZW0gKyBvCitzZSAgICAgICAgICAgICB8ICBoaW1zZWxmIGV0YworbmEgICAgICAgICAgICAgfCAgZW0gKyBhCitwb3IgICAgICAgICAgICB8ICBmb3IKK21haXMgICAgICAgICAgIHwgIG1vcmUKK2FzICAgICAgICAgICAgIHwgIHRoZTsgdGhlbQorZG9zICAgICAgICAgICAgfCAgZGUgKyBvcworY29tbyAgICAgICAgICAgfCAgYXMsIGxpa2UKK21hcyAgICAgICAgICAgIHwgIGJ1dAorICB8IGZvaSAgICAgICAgZnJvbSBTRVIKK2FvICAgICAgICAgICAgIHwgIGEgKyBvCitlbGUgICAgICAgICAgICB8ICBoZQorZGFzICAgICAgICAgICAgfCAgZGUgKyBhcworICB8IHRlbSAgICAgICAgZnJvbSBURVIKK8OgICAgICAgICAgICAgICB8ICBhICsgYQorc2V1ICAgICAgICAgICAgfCAgaGlzCitzdWEgICAgICAgICAgICB8ICBoZXIKK291ICAgICAgICAgICAgIHwgIG9yCisgIHwgc2VyICAgICAgICBmcm9tIFNFUgorcXVhbmRvICAgICAgICAgfCAgd2hlbgorbXVpdG8gICAgICAgICAgfCAgbXVjaAorICB8IGjDoSAgICAgICAgIGZyb20gSEFWCitub3MgICAgICAgICAgICB8ICBlbSArIG9zOyB1cworasOhICAgICAgICAgICAgIHwgIGFscmVhZHksIG5vdworICB8IGVzdMOhICAgICAgIGZyb20gRVNUCitldSAgICAgICAgICAgICB8ICBJCit0YW1iw6ltICAgICAgICAgfCAgYWxzbworc8OzICAgICAgICAgICAgIHwgIG9ubHksIGp1c3QKK3BlbG8gICAgICAgICAgIHwgIHBlciArIG8KK3BlbGEgICAgICAgICAgIHwgIHBlciArIGEKK2F0w6kgICAgICAgICAgICB8ICB1cCB0bworaXNzbyAgICAgICAgICAgfCAgdGhhdAorZWxhICAgICAgICAgICAgfCAgaGUKK2VudHJlICAgICAgICAgIHwgIGJldHdlZW4KKyAgfCBlcmEgICAgICAgIGZyb20gU0VSCitkZXBvaXMgICAgICAgICB8ICBhZnRlcgorc2VtICAgICAgICAgICAgfCAgd2l0aG91dAorbWVzbW8gICAgICAgICAgfCAgc2FtZQorYW9zICAgICAgICAgICAgfCAgYSArIG9zCisgIHwgdGVyICAgICAgICBmcm9tIFRFUgorc2V1cyAgICAgICAgICAgfCAgaGlzCitxdWVtICAgICAgICAgICB8ICB3aG9tCituYXMgICAgICAgICAgICB8ICBlbSArIGFzCittZSAgICAgICAgICAgICB8ICBtZQorZXNzZSAgICAgICAgICAgfCAgdGhhdAorZWxlcyAgICAgICAgICAgfCAgdGhleQorICB8IGVzdMOjbyAgICAgIGZyb20gRVNUCit2b2PDqiAgICAgICAgICAgfCAgeW91CisgIHwgdGluaGEgICAgICBmcm9tIFRFUgorICB8IGZvcmFtICAgICAgZnJvbSBTRVIKK2Vzc2EgICAgICAgICAgIHwgIHRoYXQKK251bSAgICAgICAgICAgIHwgIGVtICsgdW0KK25lbSAgICAgICAgICAgIHwgIG5vcgorc3VhcyAgICAgICAgICAgfCAgaGVyCittZXUgICAgICAgICAgICB8ICBteQorw6BzICAgICAgICAgICAgIHwgIGEgKyBhcworbWluaGEgICAgICAgICAgfCAgbXkKKyAgfCB0w6ptICAgICAgICBmcm9tIFRFUgorbnVtYSAgICAgICAgICAgfCAgZW0gKyB1bWEKK3BlbG9zICAgICAgICAgIHwgIHBlciArIG9zCitlbGFzICAgICAgICAgICB8ICB0aGV5CisgIHwgaGF2aWEgICAgICBmcm9tIEhBVgorICB8IHNlamEgICAgICAgZnJvbSBTRVIKK3F1YWwgICAgICAgICAgIHwgIHdoaWNoCisgIHwgc2Vyw6EgICAgICAgZnJvbSBTRVIKK27Ds3MgICAgICAgICAgICB8ICB3ZQorICB8IHRlbmhvICAgICAgZnJvbSBURVIKK2xoZSAgICAgICAgICAgIHwgIHRvIGhpbSwgaGVyCitkZWxlcyAgICAgICAgICB8ICBvZiB0aGVtCitlc3NhcyAgICAgICAgICB8ICB0aG9zZQorZXNzZXMgICAgICAgICAgfCAgdGhvc2UKK3BlbGFzICAgICAgICAgIHwgIHBlciArIGFzCitlc3RlICAgICAgICAgICB8ICB0aGlzCisgIHwgZm9zc2UgICAgICBmcm9tIFNFUgorZGVsZSAgICAgICAgICAgfCAgb2YgaGltCisKKyB8IG90aGVyIHdvcmRzLiBUaGVyZSBhcmUgbWFueSBjb250cmFjdGlvbnMgc3VjaCBhcyBuYXF1ZWxlID0gZW0rYXF1ZWxlLAorIHwgbW8gPSBtZStvLCBidXQgdGhleSBhcmUgcmFyZS4KKyB8IEluZGVmaW5pdGUgYXJ0aWNsZSBwbHVyYWwgZm9ybXMgYXJlIGFsc28gcmFyZS4KKwordHUgICAgICAgICAgICAgfCAgdGhvdQordGUgICAgICAgICAgICAgfCAgdGhlZQordm9jw6pzICAgICAgICAgIHwgIHlvdSAocGx1cmFsKQordm9zICAgICAgICAgICAgfCAgeW91CitsaGVzICAgICAgICAgICB8ICB0byB0aGVtCittZXVzICAgICAgICAgICB8ICBteQorbWluaGFzCit0ZXUgICAgICAgICAgICB8ICB0aHkKK3R1YQordGV1cwordHVhcworbm9zc28gICAgICAgICAgfCBvdXIKK25vc3NhCitub3Nzb3MKK25vc3NhcworCitkZWxhICAgICAgICAgICB8ICBvZiBoZXIKK2RlbGFzICAgICAgICAgIHwgIG9mIHRoZW0KKworZXN0YSAgICAgICAgICAgfCAgdGhpcworZXN0ZXMgICAgICAgICAgfCAgdGhlc2UKK2VzdGFzICAgICAgICAgIHwgIHRoZXNlCithcXVlbGUgICAgICAgICB8ICB0aGF0CithcXVlbGEgICAgICAgICB8ICB0aGF0CithcXVlbGVzICAgICAgICB8ICB0aG9zZQorYXF1ZWxhcyAgICAgICAgfCAgdGhvc2UKK2lzdG8gICAgICAgICAgIHwgIHRoaXMKK2FxdWlsbyAgICAgICAgIHwgIHRoYXQKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBlc3RhciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorZXN0b3UKK2VzdMOhCitlc3RhbW9zCitlc3TDo28KK2VzdGl2ZQorZXN0ZXZlCitlc3RpdmVtb3MKK2VzdGl2ZXJhbQorZXN0YXZhCitlc3TDoXZhbW9zCitlc3RhdmFtCitlc3RpdmVyYQorZXN0aXbDqXJhbW9zCitlc3RlamEKK2VzdGVqYW1vcworZXN0ZWphbQorZXN0aXZlc3NlCitlc3RpdsOpc3NlbW9zCitlc3RpdmVzc2VtCitlc3RpdmVyCitlc3RpdmVybW9zCitlc3RpdmVyZW0KKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBoYXZlciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CitoZWkKK2jDoQoraGF2ZW1vcworaMOjbworaG91dmUKK2hvdXZlbW9zCitob3V2ZXJhbQoraG91dmVyYQoraG91dsOpcmFtb3MKK2hhamEKK2hhamFtb3MKK2hhamFtCitob3V2ZXNzZQoraG91dsOpc3NlbW9zCitob3V2ZXNzZW0KK2hvdXZlcgoraG91dmVybW9zCitob3V2ZXJlbQoraG91dmVyZWkKK2hvdXZlcsOhCitob3V2ZXJlbW9zCitob3V2ZXLDo28KK2hvdXZlcmlhCitob3V2ZXLDrWFtb3MKK2hvdXZlcmlhbQorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIHNlciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorc291Citzb21vcworc8OjbworZXJhCivDqXJhbW9zCitlcmFtCitmdWkKK2ZvaQorZm9tb3MKK2ZvcmFtCitmb3JhCitmw7RyYW1vcworc2VqYQorc2VqYW1vcworc2VqYW0KK2Zvc3NlCitmw7Rzc2Vtb3MKK2Zvc3NlbQorZm9yCitmb3Jtb3MKK2ZvcmVtCitzZXJlaQorc2Vyw6EKK3NlcmVtb3MKK3NlcsOjbworc2VyaWEKK3NlcsOtYW1vcworc2VyaWFtCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgdGVyLCB0byBoYXZlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3RlbmhvCit0ZW0KK3RlbW9zCit0w6ltCit0aW5oYQordMOtbmhhbW9zCit0aW5oYW0KK3RpdmUKK3RldmUKK3RpdmVtb3MKK3RpdmVyYW0KK3RpdmVyYQordGl2w6lyYW1vcwordGVuaGEKK3RlbmhhbW9zCit0ZW5oYW0KK3RpdmVzc2UKK3RpdsOpc3NlbW9zCit0aXZlc3NlbQordGl2ZXIKK3RpdmVybW9zCit0aXZlcmVtCit0ZXJlaQordGVyw6EKK3RlcmVtb3MKK3RlcsOjbwordGVyaWEKK3RlcsOtYW1vcwordGVyaWFtCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19yby50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19yby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZWU5MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3JvLnR4dApAQCAtMCwwICsxLDIzMyBAQAorIyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgSmFjcXVlcyBTYXZveSBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorYWNlYQorYWNlYXN0YQorYWNlYXN0xIMKK2FjZWVhCithY2VpCithY2VpYQorYWNlbAorYWNlbGEKK2FjZWxlCithY2VsZWEKK2FjZXN0CithY2VzdGEKK2FjZXN0ZQorYWNlc3RlYQorYWNlxZ90aQorYWNlxZ90aWEKK2Fjb2xvCithY3VtCithaQorYWlhCithaWLEgworYWljaQorYWwKK8SDbGEKK2FsZQorYWxlYQorxINsZWEKK2FsdGNldmEKK2FsdGNpbmV2YQorYW0KK2FyCithcmUKK2HFnworYcWfYWRhcgorYXNlbWVuZWEKK2FzdGEKK8SDc3RhCithc3TEg3ppCithc3RlYQorxINzdGVhCivEg8WfdGlhCithc3VwcmEKK2HFo2kKK2F1CithdmVhCithdmVtCithdmXFo2kKK2F6aQorYmluZQorYnVjdXIKK2J1bsSDCitjYQorY8SDCitjxINjaQorY8OibmQKK2NhcmUKK2PEg3JlaQorY8SDcm9yCitjxINydWkKK2PDonQKK2PDonRlCitjw6LFo2kKK2PEg3RyZQorY8OidHZhCitjZQorY2VsCitjZXZhCitjaGlhcgorY8OubmQKK2NpbmUKK2NpbmV2YQorY8OudAorY8OudGUKK2PDrsWjaQorY8OudHZhCitjb250cmEKK2N1CitjdW0KK2N1bXZhCitjdXLDom5kCitjdXLDrm5kCitkYQorZMSDCitkYWPEgworZGFyCitkYXRvcml0xIMKK2RlCitkZWNpCitkZWphCitkZW9hcmVjZQorZGVwYXJ0ZQorZGXFn2kKK2RpbgorZGluYWludGVhCitkaW50cgorZGludHJlCitkcmVwdAorZHVwxIMKK2VhCitlaQorZWwKK2VsZQorZXJhbQorZXN0ZQorZcWfdGkKK2V1CitmYWNlCitmxINyxIMKK2ZpCitmaWUKK2ZpZWNhcmUKK2ZpaQorZmltCitmacWjaQoraWFyCitpZXJpCivDrmkKK8OubAorw65taQorw65tcG90cml2YQorw65uIAorw65uYWludGUKK8OubmFpbnRlYQorw65uY8OidAorw65uY8OudAorw65uY290cm8KK8OubnRyZQorw65udHJ1Y8OidAorw65udHJ1Y8OudAorw67Fo2kKK2xhCitsw6JuZ8SDCitsZQorbGkKK2zDrm5nxIMKK2xvcgorbHVpCittxIMKK23DomluZQorbWVhCittZWkKK21lbGUKK21lcmV1CittZXUKK21pCittaW5lCittdWx0CittdWx0xIMKK211bMWjaQorbmUKK25pY8SDaWVyaQorbmljaQorbmltZW5pCituacWfdGUKK25vYXN0csSDCitub2FzdHJlCitub2kKK25vxZ90cmkKK25vc3RydQorbnUKK29yaQorb3JpY8OibmQKK29yaWNhcmUKK29yaWPDonQKK29yaWNlCitvcmljw65uZAorb3JpY2luZQorb3JpY8OudAorb3JpY3VtCitvcml1bmRlCitww6JuxIMKK3BlCitwZW50cnUKK3Blc3RlCitww65uxIMKK3BvYXRlCitwb3QKK3ByZWEKK3ByaW1hCitwcmltdWwKK3ByaW4KK3ByaW50cgorc2EKK3PEgworc8SDaQorc2FsZQorc2F1CitzxIN1CitzZQorxZ9pCitzw65udAorc8OubnRlbQorc8OubnRlxaNpCitzcHJlCitzdWIKK3N1bnQKK3N1bnRlbQorc3VudGXFo2kKK3RhCit0xINpCit0YWxlCit0xIN1Cit0ZQorxaNpCivFo2llCit0aW5lCit0b2F0xIMKK3RvYXRlCit0b3QKK3RvxaNpCit0b3R1xZ9pCit0dQordW4KK3VuYQordW5kZQordW5kZXZhCit1bmVpCit1bmVsZQordW5lb3JpCit1bm9yCit2xIMKK3ZpCit2b2FzdHLEgwordm9hc3RyZQordm9pCit2b8WfdHJpCit2b3N0cnUKK3ZvdcSDCit2cmVvCit2cmV1bgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfcnUudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfcnUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjcxNDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19ydS50eHQKQEAgLTAsMCArMSwyNDMgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvcnVzc2lhbi9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IGEgcnVzc2lhbiBzdG9wIHdvcmQgbGlzdC4gY29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIGVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCB0aGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20KKyB8IGEgbGFyZ2UgdGV4dCBzYW1wbGUuCisKKyB8IGxldHRlciBg0ZEnIGlzIHRyYW5zbGF0ZWQgdG8gYNC1Jy4KKwor0LggICAgICAgICAgICAgIHwgYW5kCivQsiAgICAgICAgICAgICAgfCBpbi9pbnRvCivQstC+ICAgICAgICAgICAgIHwgYWx0ZXJuYXRpdmUgZm9ybQor0L3QtSAgICAgICAgICAgICB8IG5vdAor0YfRgtC+ICAgICAgICAgICAgfCB3aGF0L3RoYXQKK9C+0L0gICAgICAgICAgICAgfCBoZQor0L3QsCAgICAgICAgICAgICB8IG9uL29udG8KK9GPICAgICAgICAgICAgICB8IGkKK9GBICAgICAgICAgICAgICB8IGZyb20KK9GB0L4gICAgICAgICAgICAgfCBhbHRlcm5hdGl2ZSBmb3JtCivQutCw0LogICAgICAgICAgICB8IGhvdwor0LAgICAgICAgICAgICAgIHwgbWlsZGVyIGZvcm0gb2YgYG5vJyAoYnV0KQor0YLQviAgICAgICAgICAgICB8IGNvbmp1bmN0aW9uIGFuZCBmb3JtIG9mIGB0aGF0Jwor0LLRgdC1ICAgICAgICAgICAgfCBhbGwKK9C+0L3QsCAgICAgICAgICAgIHwgc2hlCivRgtCw0LogICAgICAgICAgICB8IHNvLCB0aHVzCivQtdCz0L4gICAgICAgICAgICB8IGhpbQor0L3QviAgICAgICAgICAgICB8IGJ1dAor0LTQsCAgICAgICAgICAgICB8IHllcy9hbmQKK9GC0YsgICAgICAgICAgICAgfCB0aG91CivQuiAgICAgICAgICAgICAgfCB0b3dhcmRzLCBieQor0YMgICAgICAgICAgICAgIHwgYXJvdW5kLCBjaGV6CivQttC1ICAgICAgICAgICAgIHwgaW50ZW5zaWZpZXIgcGFydGljbGUKK9Cy0YsgICAgICAgICAgICAgfCB5b3UKK9C30LAgICAgICAgICAgICAgfCBiZXlvbmQsIGJlaGluZAor0LHRiyAgICAgICAgICAgICB8IGNvbmRpdGlvbmFsL3N1YmouIHBhcnRpY2xlCivQv9C+ICAgICAgICAgICAgIHwgdXAgdG8sIGFsb25nCivRgtC+0LvRjNC60L4gICAgICAgICB8IG9ubHkKK9C10LUgICAgICAgICAgICAgfCBoZXIKK9C80L3QtSAgICAgICAgICAgIHwgdG8gbWUKK9Cx0YvQu9C+ICAgICAgICAgICB8IGl0IHdhcwor0LLQvtGCICAgICAgICAgICAgfCBoZXJlIGlzL2FyZSwgcGFydGljbGUKK9C+0YIgICAgICAgICAgICAgfCBhd2F5IGZyb20KK9C80LXQvdGPICAgICAgICAgICB8IG1lCivQtdGJ0LUgICAgICAgICAgICB8IHN0aWxsLCB5ZXQsIG1vcmUKK9C90LXRgiAgICAgICAgICAgIHwgbm8sIHRoZXJlIGlzbnQvYXJlbnQKK9C+ICAgICAgICAgICAgICB8IGFib3V0CivQuNC3ICAgICAgICAgICAgIHwgb3V0IG9mCivQtdC80YMgICAgICAgICAgICB8IHRvIGhpbQor0YLQtdC/0LXRgNGMICAgICAgICAgfCBub3cKK9C60L7Qs9C00LAgICAgICAgICAgfCB3aGVuCivQtNCw0LbQtSAgICAgICAgICAgfCBldmVuCivQvdGDICAgICAgICAgICAgIHwgc28sIHdlbGwKK9Cy0LTRgNGD0LMgICAgICAgICAgfCBzdWRkZW5seQor0LvQuCAgICAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUKK9C10YHQu9C4ICAgICAgICAgICB8IGlmCivRg9C20LUgICAgICAgICAgICB8IGFscmVhZHksIGJ1dCBob21vbnltIG9mIGBuYXJyb3dlcicKK9C40LvQuCAgICAgICAgICAgIHwgb3IKK9C90LggICAgICAgICAgICAgfCBuZWl0aGVyCivQsdGL0YLRjCAgICAgICAgICAgfCB0byBiZQor0LHRi9C7ICAgICAgICAgICAgfCBoZSB3YXMKK9C90LXQs9C+ICAgICAgICAgICB8IHByZXBvc2l0aW9uYWwgZm9ybSBvZiDQtdCz0L4KK9C00L4gICAgICAgICAgICAgfCB1cCB0bwor0LLQsNGBICAgICAgICAgICAgfCB5b3UgYWNjdXNhdGl2ZQor0L3QuNCx0YPQtNGMICAgICAgICAgfCBpbmRlZi4gc3VmZml4IHByZWNlZGVkIGJ5IGh5cGhlbgor0L7Qv9GP0YLRjCAgICAgICAgICB8IGFnYWluCivRg9C2ICAgICAgICAgICAgIHwgYWxyZWFkeSwgYnV0IGhvbW9ueW0gb2YgYGFkZGVyJwor0LLQsNC8ICAgICAgICAgICAgfCB0byB5b3UKK9GB0LrQsNC30LDQuyAgICAgICAgIHwgaGUgc2FpZAor0LLQtdC00YwgICAgICAgICAgIHwgcGFydGljbGUgYGFmdGVyIGFsbCcKK9GC0LDQvCAgICAgICAgICAgIHwgdGhlcmUKK9C/0L7RgtC+0LwgICAgICAgICAgfCB0aGVuCivRgdC10LHRjyAgICAgICAgICAgfCBvbmVzZWxmCivQvdC40YfQtdCz0L4gICAgICAgICB8IG5vdGhpbmcKK9C10LkgICAgICAgICAgICAgfCB0byBoZXIKK9C80L7QttC10YIgICAgICAgICAgfCB1c3VhbGx5IHdpdGggYNCx0YvRgtGMJyBhcyBgbWF5YmUnCivQvtC90LggICAgICAgICAgICB8IHRoZXkKK9GC0YPRgiAgICAgICAgICAgIHwgaGVyZQor0LPQtNC1ICAgICAgICAgICAgfCB3aGVyZQor0LXRgdGC0YwgICAgICAgICAgIHwgdGhlcmUgaXMvYXJlCivQvdCw0LTQviAgICAgICAgICAgfCBnb3QgdG8sIG11c3QKK9C90LXQuSAgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mICDQtdC5CivQtNC70Y8gICAgICAgICAgICB8IGZvcgor0LzRiyAgICAgICAgICAgICB8IHdlCivRgtC10LHRjyAgICAgICAgICAgfCB0aGVlCivQuNGFICAgICAgICAgICAgIHwgdGhlbSwgdGhlaXIKK9GH0LXQvCAgICAgICAgICAgIHwgdGhhbgor0LHRi9C70LAgICAgICAgICAgIHwgc2hlIHdhcwor0YHQsNC8ICAgICAgICAgICAgfCBzZWxmCivRh9GC0L7QsSAgICAgICAgICAgfCBpbiBvcmRlciB0bwor0LHQtdC3ICAgICAgICAgICAgfCB3aXRob3V0CivQsdGD0LTRgtC+ICAgICAgICAgIHwgYXMgaWYKK9GH0LXQu9C+0LLQtdC6ICAgICAgICB8IG1hbiwgcGVyc29uLCBvbmUKK9GH0LXQs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHdoYXQnCivRgNCw0LcgICAgICAgICAgICB8IG9uY2UKK9GC0L7QttC1ICAgICAgICAgICB8IGFsc28KK9GB0LXQsdC1ICAgICAgICAgICB8IHRvIG9uZXNlbGYKK9C/0L7QtCAgICAgICAgICAgIHwgYmVuZWF0aAor0LbQuNC30L3RjCAgICAgICAgICB8IGxpZmUKK9Cx0YPQtNC10YIgICAgICAgICAgfCB3aWxsIGJlCivQtiAgICAgICAgICAgICAgfCBzaG9ydCBmb3JtIG9mIGludGVuc2lmZXIgcGFydGljbGUgYNC20LUnCivRgtC+0LPQtNCwICAgICAgICAgIHwgdGhlbgor0LrRgtC+ICAgICAgICAgICAgfCB3aG8KK9GN0YLQvtGCICAgICAgICAgICB8IHRoaXMKK9Cz0L7QstC+0YDQuNC7ICAgICAgICB8IHdhcyBzYXlpbmcKK9GC0L7Qs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoYXQnCivQv9C+0YLQvtC80YMgICAgICAgICB8IGZvciB0aGF0IHJlYXNvbgor0Y3RgtC+0LPQviAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoaXMnCivQutCw0LrQvtC5ICAgICAgICAgIHwgd2hpY2gKK9GB0L7QstGB0LXQvCAgICAgICAgIHwgYWx0b2dldGhlcgor0L3QuNC8ICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC10LPQvicsIGDQvtC90LgnCivQt9C00LXRgdGMICAgICAgICAgIHwgaGVyZQor0Y3RgtC+0LwgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mIGDRjdGC0L7RgicKK9C+0LTQuNC9ICAgICAgICAgICB8IG9uZQor0L/QvtGH0YLQuCAgICAgICAgICB8IGFsbW9zdAor0LzQvtC5ICAgICAgICAgICAgfCBteQor0YLQtdC8ICAgICAgICAgICAgfCBpbnN0cnVtZW50YWwvZGF0aXZlIHBsdXJhbCBvZiBg0YLQvtGCJywgYNGC0L4nCivRh9GC0L7QsdGLICAgICAgICAgIHwgZnVsbCBmb3JtIG9mIGBpbiBvcmRlciB0aGF0Jwor0L3QtdC1ICAgICAgICAgICAgfCBoZXIgKGFjYy4pCivQutCw0LbQtdGC0YHRjyAgICAgICAgfCBpdCBzZWVtcwor0YHQtdC50YfQsNGBICAgICAgICAgfCBub3cKK9Cx0YvQu9C4ICAgICAgICAgICB8IHRoZXkgd2VyZQor0LrRg9C00LAgICAgICAgICAgIHwgd2hlcmUgdG8KK9C30LDRh9C10LwgICAgICAgICAgfCB3aHkKK9GB0LrQsNC30LDRgtGMICAgICAgICB8IHRvIHNheQor0LLRgdC10YUgICAgICAgICAgIHwgYWxsIChhY2MuLCBnZW4uIHByZXBvc24uIHBsdXJhbCkKK9C90LjQutC+0LPQtNCwICAgICAgICB8IG5ldmVyCivRgdC10LPQvtC00L3RjyAgICAgICAgfCB0b2RheQor0LzQvtC20L3QviAgICAgICAgICB8IHBvc3NpYmxlLCBvbmUgY2FuCivQv9GA0LggICAgICAgICAgICB8IGJ5CivQvdCw0LrQvtC90LXRhiAgICAgICAgfCBmaW5hbGx5CivQtNCy0LAgICAgICAgICAgICB8IHR3bwor0L7QsSAgICAgICAgICAgICB8IGFsdGVybmF0aXZlIGZvcm0gb2YgYNC+JywgYWJvdXQKK9C00YDRg9Cz0L7QuSAgICAgICAgIHwgYW5vdGhlcgor0YXQvtGC0YwgICAgICAgICAgIHwgZXZlbgor0L/QvtGB0LvQtSAgICAgICAgICB8IGFmdGVyCivQvdCw0LQgICAgICAgICAgICB8IGFib3ZlCivQsdC+0LvRjNGI0LUgICAgICAgICB8IG1vcmUKK9GC0L7RgiAgICAgICAgICAgIHwgdGhhdCBvbmUgKG1hc2MuKQor0YfQtdGA0LXQtyAgICAgICAgICB8IGFjcm9zcywgaW4KK9GN0YLQuCAgICAgICAgICAgIHwgdGhlc2UKK9C90LDRgSAgICAgICAgICAgIHwgdXMKK9C/0YDQviAgICAgICAgICAgIHwgYWJvdXQKK9Cy0YHQtdCz0L4gICAgICAgICAgfCBpbiBhbGwsIG9ubHksIG9mIGFsbAor0L3QuNGFICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC+0L3QuCcgKHRoZXkpCivQutCw0LrQsNGPICAgICAgICAgIHwgd2hpY2gsIGZlbWluaW5lCivQvNC90L7Qs9C+ICAgICAgICAgIHwgbG90cwor0YDQsNC30LLQtSAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUKK9GB0LrQsNC30LDQu9CwICAgICAgICB8IHNoZSBzYWlkCivRgtGA0LggICAgICAgICAgICB8IHRocmVlCivRjdGC0YMgICAgICAgICAgICB8IHRoaXMsIGFjYy4gZmVtLiBzaW5nLgor0LzQvtGPICAgICAgICAgICAgfCBteSwgZmVtaW5pbmUKK9Cy0L/RgNC+0YfQtdC8ICAgICAgICB8IG1vcmVvdmVyLCBiZXNpZGVzCivRhdC+0YDQvtGI0L4gICAgICAgICB8IGdvb2QKK9GB0LLQvtGOICAgICAgICAgICB8IG9uZXMgb3duLCBhY2MuIGZlbS4gc2luZy4KK9GN0YLQvtC5ICAgICAgICAgICB8IG9ibGlxdWUgZm9ybSBvZiBg0Y3RgtCwJywgZmVtLiBgdGhpcycKK9C/0LXRgNC10LQgICAgICAgICAgfCBpbiBmcm9udCBvZgor0LjQvdC+0LPQtNCwICAgICAgICAgfCBzb21ldGltZXMKK9C70YPRh9GI0LUgICAgICAgICAgfCBiZXR0ZXIKK9GH0YPRgtGMICAgICAgICAgICB8IGEgbGl0dGxlCivRgtC+0LwgICAgICAgICAgICB8IHByZXBvc24uIGZvcm0gb2YgYHRoYXQgb25lJwor0L3QtdC70YzQt9GPICAgICAgICAgfCBvbmUgbXVzdCBub3QKK9GC0LDQutC+0LkgICAgICAgICAgfCBzdWNoIGEgb25lCivQuNC8ICAgICAgICAgICAgIHwgdG8gdGhlbQor0LHQvtC70LXQtSAgICAgICAgICB8IG1vcmUKK9Cy0YHQtdCz0LTQsCAgICAgICAgIHwgYWx3YXlzCivQutC+0L3QtdGH0L3QviAgICAgICAgfCBvZiBjb3Vyc2UKK9Cy0YHRjiAgICAgICAgICAgIHwgYWNjLiBmZW0uIHNpbmcgb2YgYGFsbCcKK9C80LXQttC00YMgICAgICAgICAgfCBiZXR3ZWVuCisKKworICB8IGI6IHNvbWUgcGFyYWRpZ21zCisgIHwKKyAgfCBwZXJzb25hbCBwcm9ub3VucworICB8CisgIHwg0Y8gINC80LXQvdGPICDQvNC90LUgINC80L3QvtC5ICBb0LzQvdC+0Y5dCisgIHwg0YLRiyAg0YLQtdCx0Y8gINGC0LXQsdC1ICDRgtC+0LHQvtC5ICBb0YLQvtCx0L7Rjl0KKyAgfCDQvtC9ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQorICB8INC+0L3QsCAg0LXQtSAg0Y3QuCAg0LXRjiAgW9C90LXQtSwg0L3RjdC4LCDQvdC10Y5dCisgIHwg0L7QvdC+ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQorICB8CisgIHwg0LzRiyAg0L3QsNGBICDQvdCw0LwgINC90LDQvNC4CisgIHwg0LLRiyAg0LLQsNGBICDQstCw0LwgINCy0LDQvNC4CisgIHwg0L7QvdC4ICDQuNGFICDQuNC8ICDQuNC80LggIFvQvdC40YUsINC90LjQvCwg0L3QuNC80LhdCisgIHwKKyAgfCAgINGB0LXQsdGPICDRgdC10LHQtSAg0YHQvtCx0L7QuSAgIFvRgdC+0LHQvtGOXQorICB8CisgIHwgZGVtb25zdHJhdGl2ZSBwcm9ub3Vuczog0Y3RgtC+0YIgKHRoaXMpLCDRgtC+0YIgKHRoYXQpCisgIHwKKyAgfCDRjdGC0L7RgiAg0Y3RgtCwICDRjdGC0L4gINGN0YLQuAorICB8INGN0YLQvtCz0L4gINGN0YLRiyAg0Y3RgtC+ICDRjdGC0LgKKyAgfCDRjdGC0L7Qs9C+ICDRjdGC0L7QuSAg0Y3RgtC+0LPQviAg0Y3RgtC40YUKKyAgfCDRjdGC0L7QvNGDICDRjdGC0L7QuSAg0Y3RgtC+0LzRgyAg0Y3RgtC40LwKKyAgfCDRjdGC0LjQvCAg0Y3RgtC+0LkgINGN0YLQuNC8ICBb0Y3RgtC+0Y5dICDRjdGC0LjQvNC4CisgIHwg0Y3RgtC+0LwgINGN0YLQvtC5ICDRjdGC0L7QvCAg0Y3RgtC40YUKKyAgfAorICB8INGC0L7RgiAg0YLQsCAg0YLQviAg0YLQtQorICB8INGC0L7Qs9C+ICDRgtGDICDRgtC+ICDRgtC1CisgIHwg0YLQvtCz0L4gINGC0L7QuSAg0YLQvtCz0L4gINGC0LXRhQorICB8INGC0L7QvNGDICDRgtC+0LkgINGC0L7QvNGDICDRgtC10LwKKyAgfCDRgtC10LwgINGC0L7QuSAg0YLQtdC8ICBb0YLQvtGOXSAg0YLQtdC80LgKKyAgfCDRgtC+0LwgINGC0L7QuSAg0YLQvtC8ICDRgtC10YUKKyAgfAorICB8IGRldGVybWluYXRpdmUgcHJvbm91bnMKKyAgfAorICB8IChhKSDQstC10YHRjCAoYWxsKQorICB8CisgIHwg0LLQtdGB0YwgINCy0YHRjyAg0LLRgdC1ICDQstGB0LUKKyAgfCDQstGB0LXQs9C+ICDQstGB0Y4gINCy0YHQtSAg0LLRgdC1CisgIHwg0LLRgdC10LPQviAg0LLRgdC10LkgINCy0YHQtdCz0L4gINCy0YHQtdGFCisgIHwg0LLRgdC10LzRgyAg0LLRgdC10LkgINCy0YHQtdC80YMgINCy0YHQtdC8CisgIHwg0LLRgdC10LwgINCy0YHQtdC5ICDQstGB0LXQvCAgW9Cy0YHQtdGOXSAg0LLRgdC10LzQuAorICB8INCy0YHQtdC8ICDQstGB0LXQuSAg0LLRgdC10LwgINCy0YHQtdGFCisgIHwKKyAgfCAoYikg0YHQsNC8IChoaW1zZWxmIGV0YykKKyAgfAorICB8INGB0LDQvCAg0YHQsNC80LAgINGB0LDQvNC+ICDRgdCw0LzQuAorICB8INGB0LDQvNC+0LPQviDRgdCw0LzRgyAg0YHQsNC80L4gINGB0LDQvNC40YUKKyAgfCDRgdCw0LzQvtCz0L4g0YHQsNC80L7QuSDRgdCw0LzQvtCz0L4gINGB0LDQvNC40YUKKyAgfCDRgdCw0LzQvtC80YMg0YHQsNC80L7QuSDRgdCw0LzQvtC80YMgINGB0LDQvNC40LwKKyAgfCDRgdCw0LzQuNC8ICDRgdCw0LzQvtC5ICDRgdCw0LzQuNC8ICBb0YHQsNC80L7Rjl0gINGB0LDQvNC40LzQuAorICB8INGB0LDQvNC+0Lwg0YHQsNC80L7QuSDRgdCw0LzQvtC8ICDRgdCw0LzQuNGFCisgIHwKKyAgfCBzdGVtcyBvZiB2ZXJicyBgdG8gYmUnLCBgdG8gaGF2ZScsIGB0byBkbycgYW5kIG1vZGFsCisgIHwKKyAgfCDQsdGL0YLRjCAg0LHRiyAg0LHRg9C0ICDQsdGL0LIgINC10YHRgtGMICDRgdGD0YLRjAorICB8INC40LzQtQorICB8INC00LXQuworICB8INC80L7QsyAgINC80L7QtiAg0LzQvtGH0YwKKyAgfCDRg9C80LUKKyAgfCDRhdC+0YcgINGF0L7RggorICB8INC00L7Qu9C2CisgIHwg0LzQvtC20L0KKyAgfCDQvdGD0LbQvQorICB8INC90LXQu9GM0LfRjworCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19zdi50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc19zdi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2Zjg3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3N2LnR4dApAQCAtMCwwICsxLDEzMyBAQAorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9zd2VkaXNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBTd2VkaXNoIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyB8IFRoaXMgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzIGRlcml2ZWQgZnJvbQorIHwgYSBsYXJnZSB0ZXh0IHNhbXBsZS4KKworIHwgU3dlZGlzaCBzdG9wIHdvcmRzIG9jY2FzaW9uYWxseSBleGhpYml0IGhvbW9ueW0gY2xhc2hlcy4gRm9yIGV4YW1wbGUKKyB8ICBzw6UgPSBzbywgYnV0IGFsc28gc2VlZC4gVGhlc2UgYXJlIGluZGljYXRlZCBjbGVhcmx5IGJlbG93LgorCitvY2ggICAgICAgICAgICB8IGFuZAorZGV0ICAgICAgICAgICAgfCBpdCwgdGhpcy90aGF0CithdHQgICAgICAgICAgICB8IHRvICh3aXRoIGluZmluaXRpdmUpCitpICAgICAgICAgICAgICB8IGluLCBhdAorZW4gICAgICAgICAgICAgfCBhCitqYWcgICAgICAgICAgICB8IEkKK2hvbiAgICAgICAgICAgIHwgc2hlCitzb20gICAgICAgICAgICB8IHdobywgdGhhdAoraGFuICAgICAgICAgICAgfCBoZQorcMOlICAgICAgICAgICAgIHwgb24KK2RlbiAgICAgICAgICAgIHwgaXQsIHRoaXMvdGhhdAorbWVkICAgICAgICAgICAgfCB3aXRoCit2YXIgICAgICAgICAgICB8IHdoZXJlLCBlYWNoCitzaWcgICAgICAgICAgICB8IGhpbShzZWxmKSBldGMKK2bDtnIgICAgICAgICAgICB8IGZvcgorc8OlICAgICAgICAgICAgIHwgc28gKGFsc286IHNlZWQpCit0aWxsICAgICAgICAgICB8IHRvCivDpHIgICAgICAgICAgICAgfCBpcworbWVuICAgICAgICAgICAgfCBidXQKK2V0dCAgICAgICAgICAgIHwgYQorb20gICAgICAgICAgICAgfCBpZjsgYXJvdW5kLCBhYm91dAoraGFkZSAgICAgICAgICAgfCBoYWQKK2RlICAgICAgICAgICAgIHwgdGhleSwgdGhlc2UvdGhvc2UKK2F2ICAgICAgICAgICAgIHwgb2YKK2lja2UgICAgICAgICAgIHwgbm90LCBubworbWlnICAgICAgICAgICAgfCBtZQorZHUgICAgICAgICAgICAgfCB5b3UKK2hlbm5lICAgICAgICAgIHwgaGVyCitkw6UgICAgICAgICAgICAgfCB0aGVuLCB3aGVuCitzaW4gICAgICAgICAgICB8IGhpcworbnUgICAgICAgICAgICAgfCBub3cKK2hhciAgICAgICAgICAgIHwgaGF2ZQoraW50ZSAgICAgICAgICAgfCBpbnRlIG7DpWdvbiA9IG5vIG9uZQoraGFucyAgICAgICAgICAgfCBoaXMKK2hvbm9tICAgICAgICAgIHwgaGltCitza3VsbGUgICAgICAgICB8ICdzYWtlJworaGVubmVzICAgICAgICAgfCBoZXIKK2TDpHIgICAgICAgICAgICB8IHRoZXJlCittaW4gICAgICAgICAgICB8IG15CittYW4gICAgICAgICAgICB8IG9uZSAocHJvbm91bikKK2VqICAgICAgICAgICAgIHwgbm9yCit2aWQgICAgICAgICAgICB8IGF0LCBieSwgb24gKGFsc286IHZhc3QpCitrdW5kZSAgICAgICAgICB8IGNvdWxkCituw6Vnb3QgICAgICAgICAgfCBzb21lIGV0YworZnLDpW4gICAgICAgICAgIHwgZnJvbSwgb2ZmCit1dCAgICAgICAgICAgICB8IG91dAorbsOkciAgICAgICAgICAgIHwgd2hlbgorZWZ0ZXIgICAgICAgICAgfCBhZnRlciwgYmVoaW5kCit1cHAgICAgICAgICAgICB8IHVwCit2aSAgICAgICAgICAgICB8IHdlCitkZW0gICAgICAgICAgICB8IHRoZW0KK3ZhcmEgICAgICAgICAgIHwgYmUKK3ZhZCAgICAgICAgICAgIHwgd2hhdAorw7Z2ZXIgICAgICAgICAgIHwgb3Zlcgorw6RuICAgICAgICAgICAgIHwgdGhhbgorZGlnICAgICAgICAgICAgfCB5b3UKK2thbiAgICAgICAgICAgIHwgY2FuCitzaW5hICAgICAgICAgICB8IGhpcworaMOkciAgICAgICAgICAgIHwgaGVyZQoraGEgICAgICAgICAgICAgfCBoYXZlCittb3QgICAgICAgICAgICB8IHRvd2FyZHMKK2FsbGEgICAgICAgICAgIHwgYWxsCit1bmRlciAgICAgICAgICB8IHVuZGVyIChhbHNvOiB3b25kZXIpCituw6Vnb24gICAgICAgICAgfCBzb21lIGV0YworZWxsZXIgICAgICAgICAgfCBvciAoZWxzZSkKK2FsbHQgICAgICAgICAgIHwgYWxsCitteWNrZXQgICAgICAgICB8IG11Y2gKK3NlZGFuICAgICAgICAgIHwgc2luY2UKK2p1ICAgICAgICAgICAgIHwgd2h5CitkZW5uYSAgICAgICAgICB8IHRoaXMvdGhhdAorc2rDpGx2ICAgICAgICAgIHwgbXlzZWxmLCB5b3Vyc2VsZiBldGMKK2RldHRhICAgICAgICAgIHwgdGhpcy90aGF0CivDpXQgICAgICAgICAgICAgfCB0bwordXRhbiAgICAgICAgICAgfCB3aXRob3V0Cit2YXJpdCAgICAgICAgICB8IHdhcworaHVyICAgICAgICAgICAgfCBob3cKK2luZ2VuICAgICAgICAgIHwgbm8KK21pdHQgICAgICAgICAgIHwgbXkKK25pICAgICAgICAgICAgIHwgeW91CitibGkgICAgICAgICAgICB8IHRvIGJlLCBiZWNvbWUKK2JsZXYgICAgICAgICAgIHwgZnJvbSBibGkKK29zcyAgICAgICAgICAgIHwgdXMKK2RpbiAgICAgICAgICAgIHwgdGh5CitkZXNzYSAgICAgICAgICB8IHRoZXNlL3Rob3NlCituw6VncmEgICAgICAgICAgfCBzb21lIGV0YworZGVyYXMgICAgICAgICAgfCB0aGVpcgorYmxpciAgICAgICAgICAgfCBmcm9tIGJsaQorbWluYSAgICAgICAgICAgfCBteQorc2FtbWEgICAgICAgICAgfCAodGhlKSBzYW1lCit2aWxrZW4gICAgICAgICB8IHdobywgdGhhdAorZXIgICAgICAgICAgICAgfCB5b3UsIHlvdXIKK3PDpWRhbiAgICAgICAgICB8IHN1Y2ggYQordsOlciAgICAgICAgICAgIHwgb3VyCitibGl2aXQgICAgICAgICB8IGZyb20gYmxpCitkZXNzICAgICAgICAgICB8IGl0cworaW5vbSAgICAgICAgICAgfCB3aXRoaW4KK21lbGxhbiAgICAgICAgIHwgYmV0d2Vlbgorc8OlZGFudCAgICAgICAgIHwgc3VjaCBhCit2YXJmw7ZyICAgICAgICAgfCB3aHkKK3ZhcmplICAgICAgICAgIHwgZWFjaAordmlsa2EgICAgICAgICAgfCB3aG8sIHRoYXQKK2RpdHQgICAgICAgICAgIHwgdGh5Cit2ZW0gICAgICAgICAgICB8IHdobwordmlsa2V0ICAgICAgICAgfCB3aG8sIHRoYXQKK3NpdHRhICAgICAgICAgIHwgaGlzCitzw6VkYW5hICAgICAgICAgfCBzdWNoIGEKK3ZhcnQgICAgICAgICAgIHwgZWFjaAorZGluYSAgICAgICAgICAgfCB0aHkKK3ZhcnMgICAgICAgICAgIHwgd2hvc2UKK3bDpXJ0ICAgICAgICAgICB8IG91cgordsOlcmEgICAgICAgICAgIHwgb3VyCitlcnQgICAgICAgICAgICB8IHlvdXIKK2VyYSAgICAgICAgICAgIHwgeW91cgordmlsa2FzICAgICAgICAgfCB3aG9zZQorCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc190aC50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3N0b3B3b3Jkc190aC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmMGZhYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3RoLnR4dApAQCAtMCwwICsxLDExOSBAQAorIyBUaGFpIHN0b3B3b3JkcyBmcm9tOgorIyAiT3BpbmlvbiBEZXRlY3Rpb24gaW4gVGhhaSBQb2xpdGljYWwgTmV3cyBDb2x1bW5zCisjIEJhc2VkIG9uIFN1YmplY3Rpdml0eSBBbmFseXNpcyIKKyMgS2hhbXBvbCBTdWtodW0sIFN1cG90IE5pdHN1d2F0LCBhbmQgQ2hvb2NoYXJ0IEhhcnVlY2hhaXlhc2FrCivguYTguKfguYkKK+C5hOC4oeC5iAor4LmE4LibCivguYTguJTguYkKK+C5g+C4q+C5iQor4LmD4LiZCivguYLguJTguKIKK+C5geC4q+C5iOC4hwor4LmB4Lil4LmJ4LinCivguYHguKXguLAKK+C5geC4o+C4gQor4LmB4Lia4LiaCivguYHguJXguYgKK+C5gOC4reC4hwor4LmA4Lir4LmH4LiZCivguYDguKXguKIKK+C5gOC4o+C4tOC5iOC4oQor4LmA4Lij4LiyCivguYDguKHguLfguYjguK0KK+C5gOC4nuC4t+C5iOC4rQor4LmA4Lie4Lij4Liy4LiwCivguYDguJvguYfguJnguIHguLLguKMKK+C5gOC4m+C5h+C4mQor4LmA4Lib4Li04LiU4LmA4Lic4LiiCivguYDguJvguLTguJQKK+C5gOC4meC4t+C5iOC4reC4h+C4iOC4suC4gQor4LmA4LiU4Li14Lii4Lin4LiB4Lix4LiZCivguYDguJTguLXguKLguKcKK+C5gOC4iuC5iOC4mQor4LmA4LiJ4Lie4Liy4LiwCivguYDguITguKIKK+C5gOC4guC5ieC4sgor4LmA4LiC4LiyCivguK3guLXguIEKK+C4reC4suC4iAor4Lit4Liw4LmE4LijCivguK3guK3guIEKK+C4reC4ouC5iOC4suC4hwor4Lit4Lii4Li54LmICivguK3guKLguLLguIEKK+C4q+C4suC4gQor4Lir4Lil4Liy4LiiCivguKvguKXguLHguIfguIjguLLguIEKK+C4q+C4peC4seC4hwor4Lir4Lij4Li34LitCivguKvguJnguLbguYjguIcKK+C4quC5iOC4p+C4mQor4Liq4LmI4LiHCivguKrguLjguJQKK+C4quC5jeC4suC4q+C4o+C4seC4mgor4Lin4LmI4LiyCivguKfguLHguJkKK+C4peC4hwor4Lij4LmI4Lin4LihCivguKPguLLguKIKK+C4o+C4seC4mgor4Lij4Liw4Lir4Lin4LmI4Liy4LiHCivguKPguKfguKEKK+C4ouC4seC4hwor4Lih4Li1CivguKHguLLguIEKK+C4oeC4sgor4Lie4Lij4LmJ4Lit4LihCivguJ7guJoKK+C4nOC5iOC4suC4mQor4Lic4LilCivguJrguLLguIcKK+C4meC5iOC4sgor4LiZ4Li14LmJCivguJnguY3guLIKK+C4meC4seC5ieC4mQor4LiZ4Lix4LiBCivguJnguK3guIHguIjguLLguIEKK+C4l+C4uOC4gQor4LiX4Li14LmI4Liq4Li44LiUCivguJfguLXguYgKK+C4l+C5jeC4suC5g+C4q+C5iQor4LiX4LmN4LiyCivguJfguLLguIcKK+C4l+C4seC5ieC4h+C4meC4teC5iQor4LiX4Lix4LmJ4LiHCivguJbguYnguLIKK+C4luC4ueC4gQor4LiW4Li24LiHCivguJXguYnguK3guIcKK+C4leC5iOC4suC4h+C5hgor4LiV4LmI4Liy4LiHCivguJXguYjguK0KK+C4leC4suC4oQor4LiV4Lix4LmJ4LiH4LmB4LiV4LmICivguJXguLHguYnguIcKK+C4lOC5ieC4suC4mQor4LiU4LmJ4Lin4LiiCivguJTguLHguIcKK+C4i+C4tuC5iOC4hwor4LiK4LmI4Lin4LiHCivguIjguLbguIcKK+C4iOC4suC4gQor4LiI4Lix4LiUCivguIjguLAKK+C4hOC4t+C4rQor4LiE4Lin4Liy4LihCivguITguKPguLHguYnguIcKK+C4hOC4hwor4LiC4Li24LmJ4LiZCivguILguK3guIcKK+C4guC4rQor4LiC4LiT4LiwCivguIHguYjguK3guJkKK+C4geC5hwor4LiB4Liy4LijCivguIHguLHguJoKK+C4geC4seC4mQor4LiB4Lin4LmI4LiyCivguIHguKXguYjguLLguKcKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ5NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy9zdG9wd29yZHNfdHIudHh0CkBAIC0wLDAgKzEsMjEyIEBACisjIFR1cmtpc2ggc3RvcHdvcmRzIGZyb20gTFVDRU5FLTU1OQorIyBtZXJnZWQgd2l0aCB0aGUgbGlzdCBmcm9tICJJbmZvcm1hdGlvbiBSZXRyaWV2YWwgb24gVHVya2lzaCBUZXh0cyIKKyMgICAoaHR0cDovL3d3dy51c2Vycy5tdW9oaW8uZWR1L2NhbmYvcGFwZXJzL0pBU0lTVDIwMDhvZmZQcmludC5wZGYpCithY2FiYQorYWx0bcSxxZ8KK2FsdMSxCithbWEKK2FuY2FrCithcmFkYQorYXNsxLFuZGEKK2F5csSxY2EKK2JhbmEKK2JhesSxCitiZWxraQorYmVuCitiZW5kZW4KK2JlbmkKK2JlbmltCitiZXJpCitiZcWfCitiaWxlCitiaW4KK2JpcgorYmlyw6dvaworYmlyaQorYmlya2HDpworYmlya2V6CitiaXLFn2V5CitiaXLFn2V5aQorYml6CitiaXplCitiaXpkZW4KK2JpemkKK2JpemltCitiw7Z5bGUKK2LDtnlsZWNlCitidQorYnVuYQorYnVuZGEKK2J1bmRhbgorYnVubGFyCitidW5sYXLEsQorYnVubGFyxLFuCitidW51CitidW51bgorYnVyYWRhCivDp29rCivDp8O8bmvDvAorZGEKK2RhaGEKK2RhaGkKK2RlCitkZWZhCitkZcSfaWwKK2RpxJ9lcgorZGl5ZQorZG9rc2FuCitkb2t1egorZG9sYXnEsQorZG9sYXnEsXPEsXlsYQorZMO2cnQKK2VkZWNlaworZWRlbgorZWRlcmVrCitlZGlsZWNlaworZWRpbGl5b3IKK2VkaWxtZXNpCitlZGl5b3IKK2XEn2VyCitlbGxpCitlbgorZXRtZXNpCitldHRpCitldHRpxJ9pCitldHRpxJ9pbmkKK2dpYmkKK2fDtnJlCitoYWxlbgoraGFuZ2kKK2hhdHRhCitoZW0KK2hlbsO8egoraGVwCitoZXBzaQoraGVyCitoZXJoYW5naQoraGVya2VzaW4KK2hpw6cKK2hpw6diaXIKK2nDp2luCitpa2kKK2lsZQoraWxnaWxpCitpc2UKK2nFn3RlCitpdGliYXJlbgoraXRpYmFyaXlsZQora2FkYXIKK2thcsWfxLFuCitrYXRyaWx5b24KK2tlbmRpCitrZW5kaWxlcmluZQora2VuZGluaQora2VuZGlzaQora2VuZGlzaW5lCitrZW5kaXNpbmkKK2tlegora2kKK2tpbQora2ltZGVuCitraW1lCitraW1pCitraW1zZQora8SxcmsKK21pbHlhcgorbWlseW9uCittdQorbcO8CittxLEKK25hc8SxbAorbmUKK25lZGVuCituZWRlbmxlCituZXJkZQorbmVyZWRlCituZXJleWUKK25peWUKK25pw6dpbgorbworb2xhbgorb2xhcmFrCitvbGR1CitvbGR1xJ91CitvbGR1xJ91bnUKK29sZHVrbGFyxLFuxLEKK29sbWFkxLEKK29sbWFkxLHEn8SxCitvbG1haworb2xtYXPEsQorb2xtYXlhbgorb2xtYXoKK29sc2EKK29sc3VuCitvbHVwCitvbHVyCitvbHVyc2EKK29sdXlvcgorb24KK29uYQorb25kYW4KK29ubGFyCitvbmxhcmRhbgorb25sYXLEsQorb25sYXLEsW4KK29udQorb251bgorb3R1egorb3lzYQorw7Z5bGUKK3BlaworcmHEn21lbgorc2FkZWNlCitzYW5raQorc2VraXoKK3Nla3Nlbgorc2VuCitzZW5kZW4KK3NlbmkKK3NlbmluCitzaXoKK3NpemRlbgorc2l6aQorc2l6aW4KK8WfZXkKK8WfZXlkZW4KK8WfZXlpCivFn2V5bGVyCivFn8O2eWxlCivFn3UKK8WfdW5hCivFn3VuZGEKK8WfdW5kYW4KK8WfdW5sYXLEsQorxZ91bnUKK3RhcmFmxLFuZGFuCit0cmlseW9uCit0w7xtCivDvMOnCivDvHplcmUKK3ZhcgordmFyZMSxCit2ZQordmV5YQoreWEKK3lhbmkKK3lhcGFjYWsKK3lhcMSxbGFuCit5YXDEsWxtYXPEsQoreWFwxLF5b3IKK3lhcG1haworeWFwdMSxCit5YXB0xLHEn8SxCit5YXB0xLHEn8SxbsSxCit5YXB0xLFrbGFyxLEKK3llZGkKK3llcmluZQoreWV0bWnFnworeWluZQoreWlybWkKK3lva3NhCit5w7x6Cit6YXRlbgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy91c2VyZGljdF9qYS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9sYW5nL3VzZXJkaWN0X2phLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAzNjhlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbGFuZy91c2VyZGljdF9qYS50eHQKQEAgLTAsMCArMSwyOSBAQAorIworIyBUaGlzIGlzIGEgc2FtcGxlIHVzZXIgZGljdGlvbmFyeSBmb3IgS3Vyb21vamkgKEphcGFuZXNlVG9rZW5pemVyKQorIworIyBBZGQgZW50cmllcyB0byB0aGlzIGZpbGUgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIHN0YXRpc3RpY2FsIG1vZGVsIGluIHRlcm1zCisjIG9mIHNlZ21lbnRhdGlvbiwgcmVhZGluZ3MgYW5kIHBhcnQtb2Ytc3BlZWNoIHRhZ3MuICBOb3RpY2UgdGhhdCBlbnRyaWVzIGRvCisjIG5vdCBoYXZlIHdlaWdodHMgc2luY2UgdGhleSBhcmUgYWx3YXlzIHVzZWQgd2hlbiBmb3VuZC4gIFRoaXMgaXMgYnktZGVzaWduCisjIGluIG9yZGVyIHRvIG1heGltaXplIGVhc2Utb2YtdXNlLgorIworIyBFbnRyaWVzIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgQ1NWIGZvcm1hdDoKKyMgIDx0ZXh0Piw8dG9rZW4gMT4gLi4uIDx0b2tlbiBuPiw8cmVhZGluZyAxPiAuLi4gPHJlYWRpbmcgbj4sPHBhcnQtb2Ytc3BlZWNoIHRhZz4KKyMKKyMgTm90aWNlIHRoYXQgYSBzaW5nbGUgaGFsZi13aWR0aCBzcGFjZSBzZXBhcmF0ZXMgdG9rZW5zIGFuZCByZWFkaW5ncywgYW5kCisjIHRoYXQgdGhlIG51bWJlciB0b2tlbnMgYW5kIHJlYWRpbmdzIG11c3QgbWF0Y2ggZXhhY3RseS4KKyMKKyMgQWxzbyBub3RpY2UgdGhhdCBtdWx0aXBsZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgPHRleHQ+IGlzIHVuZGVmaW5lZC4KKyMKKyMgV2hpdGVzcGFjZSBvbmx5IGxpbmVzIGFyZSBpZ25vcmVkLiAgQ29tbWVudHMgYXJlIG5vdCBhbGxvd2VkIG9uIGVudHJ5IGxpbmVzLgorIworCisjIEN1c3RvbSBzZWdtZW50YXRpb24gZm9yIGthbmppIGNvbXBvdW5kcwor5pel5pys57WM5riI5paw6IGeLOaXpeacrCDntYzmuIgg5paw6IGeLOODi+ODm+ODsyDjgrHjgqTjgrbjgqQg44K344Oz44OW44OzLOOCq+OCueOCv+ODoOWQjeipngor6Zai6KW/5Zu96Zqb56m65rivLOmWouilvyDlm73pmpsg56m65rivLOOCq+ODs+OCteOCpCDjgrPjgq/jgrXjgqQg44Kv44Km44Kz44KmLOOCq+OCueOCv+ODoOWQjeipngorCisjIEN1c3RvbSBzZWdtZW50YXRpb24gZm9yIGNvbXBvdW5kIGthdGFrYW5hCivjg4jjg7zjg4jjg5Djg4PjgrAs44OI44O844OIIOODkOODg+OCsCzjg4jjg7zjg4gg44OQ44OD44KwLOOBi+OBmuOCq+ODiuWQjeipngor44K344On44Or44OA44O844OQ44OD44KwLOOCt+ODp+ODq+ODgOODvCDjg5Djg4PjgrAs44K344On44Or44OA44O8IOODkOODg+OCsCzjgYvjgZrjgqvjg4rlkI3oqZ4KKworIyBDdXN0b20gcmVhZGluZyBmb3IgZm9ybWVyIHN1bW8gd3Jlc3RsZXIKK+acnemdkum+jSzmnJ3pnZLpvo0s44Ki44K144K344On44Km44Oq44Ol44KmLOOCq+OCueOCv+ODoOS6uuWQjQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbWFwcGluZy1Gb2xkVG9BU0NJSS50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9tYXBwaW5nLUZvbGRUb0FTQ0lJLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTg0YjZlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbWFwcGluZy1Gb2xkVG9BU0NJSS50eHQKQEAgLTAsMCArMSwzODEzIEBACisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjIFRoaXMgbWFwIGNvbnZlcnRzIGFscGhhYmV0aWMsIG51bWVyaWMsIGFuZCBzeW1ib2xpYyBVbmljb2RlIGNoYXJhY3RlcnMKKyMgd2hpY2ggYXJlIG5vdCBpbiB0aGUgZmlyc3QgMTI3IEFTQ0lJIGNoYXJhY3RlcnMgKHRoZSAiQmFzaWMgTGF0aW4iIFVuaWNvZGUKKyMgYmxvY2spIGludG8gdGhlaXIgQVNDSUkgZXF1aXZhbGVudHMsIGlmIG9uZSBleGlzdHMuCisjCisjIENoYXJhY3RlcnMgZnJvbSB0aGUgZm9sbG93aW5nIFVuaWNvZGUgYmxvY2tzIGFyZSBjb252ZXJ0ZWQ7IGhvd2V2ZXIsIG9ubHkKKyMgdGhvc2UgY2hhcmFjdGVycyB3aXRoIHJlYXNvbmFibGUgQVNDSUkgYWx0ZXJuYXRpdmVzIGFyZSBjb252ZXJ0ZWQ6CisjCisjIC0gQzEgQ29udHJvbHMgYW5kIExhdGluLTEgU3VwcGxlbWVudDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UwMDgwLnBkZgorIyAtIExhdGluIEV4dGVuZGVkLUE6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMDEwMC5wZGYKKyMgLSBMYXRpbiBFeHRlbmRlZC1COiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTAxODAucGRmCisjIC0gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UxRTAwLnBkZgorIyAtIExhdGluIEV4dGVuZGVkLUM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMkM2MC5wZGYKKyMgLSBMYXRpbiBFeHRlbmRlZC1EOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUE3MjAucGRmCisjIC0gSVBBIEV4dGVuc2lvbnM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMDI1MC5wZGYKKyMgLSBQaG9uZXRpYyBFeHRlbnNpb25zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTFEMDAucGRmCisjIC0gUGhvbmV0aWMgRXh0ZW5zaW9ucyBTdXBwbGVtZW50OiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTFEODAucGRmCisjIC0gR2VuZXJhbCBQdW5jdHVhdGlvbjogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyMDAwLnBkZgorIyAtIFN1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0czogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyMDcwLnBkZgorIyAtIEVuY2xvc2VkIEFscGhhbnVtZXJpY3M6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMjQ2MC5wZGYKKyMgLSBEaW5nYmF0czogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyNzAwLnBkZgorIyAtIFN1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbjogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyRTAwLnBkZgorIyAtIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUZCMDAucGRmCisjIC0gSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VRkYwMC5wZGYKKyMgIAorIyBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fY2hhcmFjdGVyc19pbl9Vbmljb2RlCisjCisjIFRoZSBzZXQgb2YgY2hhcmFjdGVyIGNvbnZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGlzIG1hcCBpcyBhIHN1cGVyc2V0IG9mCisjIHRob3NlIHN1cHBvcnRlZCBieSB0aGUgbWFwIHJlcHJlc2VudGVkIGJ5IG1hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dC4KKyMKKyMgU2VlIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIGZvciB0aGUgUGVybCBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29udGVudHMKKyMgb2YgdGhpcyBmaWxlICh3aXRob3V0IHRoaXMgaGVhZGVyKSBmcm9tIEFTQ0lJRm9sZGluZ0ZpbHRlci5qYXZhLgorCisKKyMgU3ludGF4OgorIyAgICJzb3VyY2UiID0+ICJ0YXJnZXQiCisjICAgICAic291cmNlIi5sZW5ndGgoKSA+IDAgKHNvdXJjZSBjYW5ub3QgYmUgZW1wdHkuKQorIyAgICAgInRhcmdldCIubGVuZ3RoKCkgPj0gMCAodGFyZ2V0IGNhbiBiZSBlbXB0eS4pCisKKworIyDDgCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRV0KKyJcdTAwQzAiID0+ICJBIgorCisjIMOBICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFXQorIlx1MDBDMSIgPT4gIkEiCisKKyMgw4IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAwQzIiID0+ICJBIgorCisjIMODICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFXQorIlx1MDBDMyIgPT4gIkEiCisKKyMgw4QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTXQorIlx1MDBDNCIgPT4gIkEiCisKKyMgw4UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRV0KKyJcdTAwQzUiID0+ICJBIgorCisjIMSAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTl0KKyJcdTAxMDAiID0+ICJBIgorCisjIMSCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFXQorIlx1MDEwMiIgPT4gIkEiCisKKyMgxIQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLXQorIlx1MDEwNCIgPT4gIkEiCisKKyMgxo8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2Nod2EgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTQ0hXQV0KKyJcdTAxOEYiID0+ICJBIgorCisjIMeNICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENBUk9OXQorIlx1MDFDRCIgPT4gIkEiCisKKyMgx54gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dCisiXHUwMURFIiA9PiAiQSIKKworIyDHoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0KKyJcdTAxRTAiID0+ICJBIgorCisjIMe6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgQU5EIEFDVVRFXQorIlx1MDFGQSIgPT4gIkEiCisKKyMgyIAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwMCIgPT4gIkEiCisKKyMgyIIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjAyIiA9PiAiQSIKKworIyDIpiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkVdCisiXHUwMjI2IiA9PiAiQSIKKworIyDIuiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBTVFJPS0VdCisiXHUwMjNBIiA9PiAiQSIKKworIyDhtIAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBBXQorIlx1MUQwMCIgPT4gIkEiCisKKyMg4biAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQkVMT1ddCisiXHUxRTAwIiA9PiAiQSIKKworIyDhuqAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XXQorIlx1MUVBMCIgPT4gIkEiCisKKyMg4bqiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUEyIiA9PiAiQSIKKworIyDhuqQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdCisiXHUxRUE0IiA9PiAiQSIKKworIyDhuqYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdCisiXHUxRUE2IiA9PiAiQSIKKworIyDhuqggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQTgiID0+ICJBIgorCisjIOG6qiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0KKyJcdTFFQUEiID0+ICJBIgorCisjIOG6rCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddCisiXHUxRUFDIiA9PiAiQSIKKworIyDhuq4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFXQorIlx1MUVBRSIgPT4gIkEiCisKKyMg4bqwICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBHUkFWRV0KKyJcdTFFQjAiID0+ICJBIgorCisjIOG6siAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQjIiID0+ICJBIgorCisjIOG6tCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREVdCisiXHUxRUI0IiA9PiAiQSIKKworIyDhurYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIERPVCBCRUxPV10KKyJcdTFFQjYiID0+ICJBIgorCisjIOKStiAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQV0KKyJcdTI0QjYiID0+ICJBIgorCisjIO+8oSAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBXQorIlx1RkYyMSIgPT4gIkEiCisKKyMgw6AgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFXQorIlx1MDBFMCIgPT4gImEiCisKKyMgw6EgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFXQorIlx1MDBFMSIgPT4gImEiCisKKyMgw6IgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVhdCisiXHUwMEUyIiA9PiAiYSIKKworIyDDoyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREVdCisiXHUwMEUzIiA9PiAiYSIKKworIyDDpCAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTXQorIlx1MDBFNCIgPT4gImEiCisKKyMgw6UgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkVdCisiXHUwMEU1IiA9PiAiYSIKKworIyDEgSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OXQorIlx1MDEwMSIgPT4gImEiCisKKyMgxIMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFXQorIlx1MDEwMyIgPT4gImEiCisKKyMgxIUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FS10KKyJcdTAxMDUiID0+ICJhIgorCisjIMeOICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDQVJPTl0KKyJcdTAxQ0UiID0+ICJhIgorCisjIMefICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgQU5EIE1BQ1JPTl0KKyJcdTAxREYiID0+ICJhIgorCisjIMehICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0KKyJcdTAxRTEiID0+ICJhIgorCisjIMe7ICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFIEFORCBBQ1VURV0KKyJcdTAxRkIiID0+ICJhIgorCisjIMiBICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1VCTEUgR1JBVkVdCisiXHUwMjAxIiA9PiAiYSIKKworIyDIgyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjAzIiA9PiAiYSIKKworIyDIpyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRE9UIEFCT1ZFXQorIlx1MDIyNyIgPT4gImEiCisKKyMgyZAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEFdCisiXHUwMjUwIiA9PiAiYSIKKworIyDJmSAgW0xBVElOIFNNQUxMIExFVFRFUiBTQ0hXQV0KKyJcdTAyNTkiID0+ICJhIgorCisjIMmaICBbTEFUSU4gU01BTEwgTEVUVEVSIFNDSFdBIFdJVEggSE9PS10KKyJcdTAyNUEiID0+ICJhIgorCisjIOG2jyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUkVUUk9GTEVYIEhPT0tdCisiXHUxRDhGIiA9PiAiYSIKKworIyDhtpUgIFtMQVRJTiBTTUFMTCBMRVRURVIgU0NIV0EgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTUiID0+ICJhIgorCisjIOG6oSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBCRUxPV10KKyJcdTFFMDEiID0+ICJhIgorCisjIOG6oyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklHSFQgSEFMRiBSSU5HXQorIlx1MUU5QSIgPT4gImEiCisKKyMg4bqhICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1QgQkVMT1ddCisiXHUxRUExIiA9PiAiYSIKKworIyDhuqMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUEzIiA9PiAiYSIKKworIyDhuqUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFXQorIlx1MUVBNSIgPT4gImEiCisKKyMg4bqnICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRV0KKyJcdTFFQTciID0+ICJhIgorCisjIOG6qSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQTkiID0+ICJhIgorCisjIOG6qyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREVdCisiXHUxRUFCIiA9PiAiYSIKKworIyDhuq0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPV10KKyJcdTFFQUQiID0+ICJhIgorCisjIOG6ryAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFXQorIlx1MUVBRiIgPT4gImEiCisKKyMg4bqxICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkVdCisiXHUxRUIxIiA9PiAiYSIKKworIyDhurMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBIT09LIEFCT1ZFXQorIlx1MUVCMyIgPT4gImEiCisKKyMg4bq1ICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREVdCisiXHUxRUI1IiA9PiAiYSIKKworIyDhurcgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBET1QgQkVMT1ddCisiXHUxRUI3IiA9PiAiYSIKKworIyDigpAgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEFdCisiXHUyMDkwIiA9PiAiYSIKKworIyDigpQgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFNDSFdBXQorIlx1MjA5NCIgPT4gImEiCisKKyMg4pOQICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgQV0KKyJcdTI0RDAiID0+ICJhIgorCisjIOKxpSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggU1RST0tFXQorIlx1MkM2NSIgPT4gImEiCisKKyMg4rGvICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIEFdCisiXHUyQzZGIiA9PiAiYSIKKworIyDvvYEgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEFdCisiXHVGRjQxIiA9PiAiYSIKKworIyDqnLIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBQV0KKyJcdUE3MzIiID0+ICJBQSIKKworIyDDhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFFXQorIlx1MDBDNiIgPT4gIkFFIgorCisjIMeiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgV0lUSCBNQUNST05dCisiXHUwMUUyIiA9PiAiQUUiCisKKyMgx7wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSBXSVRIIEFDVVRFXQorIlx1MDFGQyIgPT4gIkFFIgorCisjIOG0gSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEFFXQorIlx1MUQwMSIgPT4gIkFFIgorCisjIOqctCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFPXQorIlx1QTczNCIgPT4gIkFPIgorCisjIOqctiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFVXQorIlx1QTczNiIgPT4gIkFVIgorCisjIOqcuCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFWXQorIlx1QTczOCIgPT4gIkFWIgorCisjIOqcuiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFWIFdJVEggSE9SSVpPTlRBTCBCQVJdCisiXHVBNzNBIiA9PiAiQVYiCisKKyMg6py8ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQVldCisiXHVBNzNDIiA9PiAiQVkiCisKKyMg4pKcICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgQV0KKyJcdTI0OUMiID0+ICIoYSkiCisKKyMg6pyzICBbTEFUSU4gU01BTEwgTEVUVEVSIEFBXQorIlx1QTczMyIgPT4gImFhIgorCisjIMOmICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFXQorIlx1MDBFNiIgPT4gImFlIgorCisjIMejICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFIFdJVEggTUFDUk9OXQorIlx1MDFFMyIgPT4gImFlIgorCisjIMe9ICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFIFdJVEggQUNVVEVdCisiXHUwMUZEIiA9PiAiYWUiCisKKyMg4bSCICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBBRV0KKyJcdTFEMDIiID0+ICJhZSIKKworIyDqnLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQU9dCisiXHVBNzM1IiA9PiAiYW8iCisKKyMg6py3ICBbTEFUSU4gU01BTEwgTEVUVEVSIEFVXQorIlx1QTczNyIgPT4gImF1IgorCisjIOqcuSAgW0xBVElOIFNNQUxMIExFVFRFUiBBVl0KKyJcdUE3MzkiID0+ICJhdiIKKworIyDqnLsgIFtMQVRJTiBTTUFMTCBMRVRURVIgQVYgV0lUSCBIT1JJWk9OVEFMIEJBUl0KKyJcdUE3M0IiID0+ICJhdiIKKworIyDqnL0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQVldCisiXHVBNzNEIiA9PiAiYXkiCisKKyMgxoEgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggSE9PS10KKyJcdTAxODEiID0+ICJCIgorCisjIMaCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIFRPUEJBUl0KKyJcdTAxODIiID0+ICJCIgorCisjIMmDICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIFNUUk9LRV0KKyJcdTAyNDMiID0+ICJCIgorCisjIMqZICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgQl0KKyJcdTAyOTkiID0+ICJCIgorCisjIOG0gyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEJBUlJFRCBCXQorIlx1MUQwMyIgPT4gIkIiCisKKyMg4biCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMDIiID0+ICJCIgorCisjIOG4hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEIgV0lUSCBET1QgQkVMT1ddCisiXHUxRTA0IiA9PiAiQiIKKworIyDhuIYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggTElORSBCRUxPV10KKyJcdTFFMDYiID0+ICJCIgorCisjIOKStyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQl0KKyJcdTI0QjciID0+ICJCIgorCisjIO+8oiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBCXQorIlx1RkYyMiIgPT4gIkIiCisKKyMgxoAgIFtMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIFNUUk9LRV0KKyJcdTAxODAiID0+ICJiIgorCisjIMaDICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBUT1BCQVJdCisiXHUwMTgzIiA9PiAiYiIKKworIyDJkyAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggSE9PS10KKyJcdTAyNTMiID0+ICJiIgorCisjIOG1rCAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ2QyIgPT4gImIiCisKKyMg4baAICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDgwIiA9PiAiYiIKKworIyDhuIMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMDMiID0+ICJiIgorCisjIOG4hSAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggRE9UIEJFTE9XXQorIlx1MUUwNSIgPT4gImIiCisKKyMg4biHICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBMSU5FIEJFTE9XXQorIlx1MUUwNyIgPT4gImIiCisKKyMg4pORICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgQl0KKyJcdTI0RDEiID0+ICJiIgorCisjIO+9giAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgQl0KKyJcdUZGNDIiID0+ICJiIgorCisjIOKSnSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEJdCisiXHUyNDlEIiA9PiAiKGIpIgorCisjIMOHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEFdCisiXHUwMEM3IiA9PiAiQyIKKworIyDEhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURV0KKyJcdTAxMDYiID0+ICJDIgorCisjIMSIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTA4IiA9PiAiQyIKKworIyDEiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkVdCisiXHUwMTBBIiA9PiAiQyIKKworIyDEjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTl0KKyJcdTAxMEMiID0+ICJDIgorCisjIMaHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEhPT0tdCisiXHUwMTg3IiA9PiAiQyIKKworIyDIuyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBTVFJPS0VdCisiXHUwMjNCIiA9PiAiQyIKKworIyDKlyAgW0xBVElOIExFVFRFUiBTVFJFVENIRUQgQ10KKyJcdTAyOTciID0+ICJDIgorCisjIOG0hCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIENdCisiXHUxRDA0IiA9PiAiQyIKKworIyDhuIggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSBBTkQgQUNVVEVdCisiXHUxRTA4IiA9PiAiQyIKKworIyDikrggIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIENdCisiXHUyNEI4IiA9PiAiQyIKKworIyDvvKMgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgQ10KKyJcdUZGMjMiID0+ICJDIgorCisjIMOnICBbTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBXQorIlx1MDBFNyIgPT4gImMiCisKKyMgxIcgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFXQorIlx1MDEwNyIgPT4gImMiCisKKyMgxIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTA5IiA9PiAiYyIKKworIyDEiyAgW0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggRE9UIEFCT1ZFXQorIlx1MDEwQiIgPT4gImMiCisKKyMgxI0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OXQorIlx1MDEwRCIgPT4gImMiCisKKyMgxoggIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEhPT0tdCisiXHUwMTg4IiA9PiAiYyIKKworIyDIvCAgW0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggU1RST0tFXQorIlx1MDIzQyIgPT4gImMiCisKKyMgyZUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENVUkxdCisiXHUwMjU1IiA9PiAiYyIKKworIyDhuIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgQU5EIEFDVVRFXQorIlx1MUUwOSIgPT4gImMiCisKKyMg4oaEICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIENdCisiXHUyMTg0IiA9PiAiYyIKKworIyDik5IgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBDXQorIlx1MjREMiIgPT4gImMiCisKKyMg6py+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUkVWRVJTRUQgQyBXSVRIIERPVF0KKyJcdUE3M0UiID0+ICJjIgorCisjIOqcvyAgW0xBVElOIFNNQUxMIExFVFRFUiBSRVZFUlNFRCBDIFdJVEggRE9UXQorIlx1QTczRiIgPT4gImMiCisKKyMg772DICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBDXQorIlx1RkY0MyIgPT4gImMiCisKKyMg4pKeICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgQ10KKyJcdTI0OUUiID0+ICIoYykiCisKKyMgw5AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEhdCisiXHUwMEQwIiA9PiAiRCIKKworIyDEjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTl0KKyJcdTAxMEUiID0+ICJEIgorCisjIMSQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRV0KKyJcdTAxMTAiID0+ICJEIgorCisjIMaJICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUZSSUNBTiBEXQorIlx1MDE4OSIgPT4gIkQiCisKKyMgxoogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggSE9PS10KKyJcdTAxOEEiID0+ICJEIgorCisjIMaLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFRPUEJBUl0KKyJcdTAxOEIiID0+ICJEIgorCisjIOG0hSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIERdCisiXHUxRDA1IiA9PiAiRCIKKworIyDhtIYgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBFVEhdCisiXHUxRDA2IiA9PiAiRCIKKworIyDhuIogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFXQorIlx1MUUwQSIgPT4gIkQiCisKKyMg4biMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIERPVCBCRUxPV10KKyJcdTFFMEMiID0+ICJEIgorCisjIOG4jiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBMSU5FIEJFTE9XXQorIlx1MUUwRSIgPT4gIkQiCisKKyMg4biQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENFRElMTEFdCisiXHUxRTEwIiA9PiAiRCIKKworIyDhuJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFMTIiID0+ICJEIgorCisjIOKSuSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRF0KKyJcdTI0QjkiID0+ICJEIgorCisjIOqduSAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgRF0KKyJcdUE3NzkiID0+ICJEIgorCisjIO+8pCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEXQorIlx1RkYyNCIgPT4gIkQiCisKKyMgw7AgIFtMQVRJTiBTTUFMTCBMRVRURVIgRVRIXQorIlx1MDBGMCIgPT4gImQiCisKKyMgxI8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OXQorIlx1MDEwRiIgPT4gImQiCisKKyMgxJEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRV0KKyJcdTAxMTEiID0+ICJkIgorCisjIMaMICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBUT1BCQVJdCisiXHUwMThDIiA9PiAiZCIKKworIyDIoSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ1VSTF0KKyJcdTAyMjEiID0+ICJkIgorCisjIMmWICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBUQUlMXQorIlx1MDI1NiIgPT4gImQiCisKKyMgyZcgIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIEhPT0tdCisiXHUwMjU3IiA9PiAiZCIKKworIyDhta0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTFENkQiID0+ICJkIgorCisjIOG2gSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggUEFMQVRBTCBIT09LXQorIlx1MUQ4MSIgPT4gImQiCisKKyMg4baRICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBIT09LIEFORCBUQUlMXQorIlx1MUQ5MSIgPT4gImQiCisKKyMg4biLICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkVdCisiXHUxRTBCIiA9PiAiZCIKKworIyDhuI0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBCRUxPV10KKyJcdTFFMEQiID0+ICJkIgorCisjIOG4jyAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggTElORSBCRUxPV10KKyJcdTFFMEYiID0+ICJkIgorCisjIOG4kSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0VESUxMQV0KKyJcdTFFMTEiID0+ICJkIgorCisjIOG4kyAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFMTMiID0+ICJkIgorCisjIOKTkyAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIERdCisiXHUyNEQzIiA9PiAiZCIKKworIyDqnbogIFtMQVRJTiBTTUFMTCBMRVRURVIgSU5TVUxBUiBEXQorIlx1QTc3QSIgPT4gImQiCisKKyMg772EICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBEXQorIlx1RkY0NCIgPT4gImQiCisKKyMgx4QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEWiBXSVRIIENBUk9OXQorIlx1MDFDNCIgPT4gIkRaIgorCisjIMexICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRFpdCisiXHUwMUYxIiA9PiAiRFoiCisKKyMgx4UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTl0KKyJcdTAxQzUiID0+ICJEeiIKKworIyDHsiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTTUFMTCBMRVRURVIgWl0KKyJcdTAxRjIiID0+ICJEeiIKKworIyDikp8gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBEXQorIlx1MjQ5RiIgPT4gIihkKSIKKworIyDIuCAgW0xBVElOIFNNQUxMIExFVFRFUiBEQiBESUdSQVBIXQorIlx1MDIzOCIgPT4gImRiIgorCisjIMeGICBbTEFUSU4gU01BTEwgTEVUVEVSIERaIFdJVEggQ0FST05dCisiXHUwMUM2IiA9PiAiZHoiCisKKyMgx7MgIFtMQVRJTiBTTUFMTCBMRVRURVIgRFpdCisiXHUwMUYzIiA9PiAiZHoiCisKKyMgyqMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRFogRElHUkFQSF0KKyJcdTAyQTMiID0+ICJkeiIKKworIyDKpSAgW0xBVElOIFNNQUxMIExFVFRFUiBEWiBESUdSQVBIIFdJVEggQ1VSTF0KKyJcdTAyQTUiID0+ICJkeiIKKworIyDDiCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRV0KKyJcdTAwQzgiID0+ICJFIgorCisjIMOJICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFXQorIlx1MDBDOSIgPT4gIkUiCisKKyMgw4ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAwQ0EiID0+ICJFIgorCisjIMOLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJU10KKyJcdTAwQ0IiID0+ICJFIgorCisjIMSSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTl0KKyJcdTAxMTIiID0+ICJFIgorCisjIMSUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEJSRVZFXQorIlx1MDExNCIgPT4gIkUiCisKKyMgxJYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFXQorIlx1MDExNiIgPT4gIkUiCisKKyMgxJggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLXQorIlx1MDExOCIgPT4gIkUiCisKKyMgxJogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST05dCisiXHUwMTFBIiA9PiAiRSIKKworIyDGjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFJFVkVSU0VEIEVdCisiXHUwMThFIiA9PiAiRSIKKworIyDGkCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE9QRU4gRV0KKyJcdTAxOTAiID0+ICJFIgorCisjIMiEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVUJMRSBHUkFWRV0KKyJcdTAyMDQiID0+ICJFIgorCisjIMiGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIwNiIgPT4gIkUiCisKKyMgyKggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0VESUxMQV0KKyJcdTAyMjgiID0+ICJFIgorCisjIMmGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIFNUUk9LRV0KKyJcdTAyNDYiID0+ICJFIgorCisjIOG0hyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEVdCisiXHUxRDA3IiA9PiAiRSIKKworIyDhuJQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBHUkFWRV0KKyJcdTFFMTQiID0+ICJFIgorCisjIOG4liAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04gQU5EIEFDVVRFXQorIlx1MUUxNiIgPT4gIkUiCisKKyMg4biYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQkVMT1ddCisiXHUxRTE4IiA9PiAiRSIKKworIyDhuJogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTFBIiA9PiAiRSIKKworIyDhuJwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0VESUxMQSBBTkQgQlJFVkVdCisiXHUxRTFDIiA9PiAiRSIKKworIyDhurggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEJFTE9XXQorIlx1MUVCOCIgPT4gIkUiCisKKyMg4bq6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUJBIiA9PiAiRSIKKworIyDhurwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggVElMREVdCisiXHUxRUJDIiA9PiAiRSIKKworIyDhur4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdCisiXHUxRUJFIiA9PiAiRSIKKworIyDhu4AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdCisiXHUxRUMwIiA9PiAiRSIKKworIyDhu4IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQzIiID0+ICJFIgorCisjIOG7hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0KKyJcdTFFQzQiID0+ICJFIgorCisjIOG7hiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddCisiXHUxRUM2IiA9PiAiRSIKKworIyDikrogIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIEVdCisiXHUyNEJBIiA9PiAiRSIKKworIyDisbsgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBUVVJORUQgRV0KKyJcdTJDN0IiID0+ICJFIgorCisjIO+8pSAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFXQorIlx1RkYyNSIgPT4gIkUiCisKKyMgw6ggIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFXQorIlx1MDBFOCIgPT4gImUiCisKKyMgw6kgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFXQorIlx1MDBFOSIgPT4gImUiCisKKyMgw6ogIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVhdCisiXHUwMEVBIiA9PiAiZSIKKworIyDDqyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTXQorIlx1MDBFQiIgPT4gImUiCisKKyMgxJMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTl0KKyJcdTAxMTMiID0+ICJlIgorCisjIMSVICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBCUkVWRV0KKyJcdTAxMTUiID0+ICJlIgorCisjIMSXICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkVdCisiXHUwMTE3IiA9PiAiZSIKKworIyDEmSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLXQorIlx1MDExOSIgPT4gImUiCisKKyMgxJsgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OXQorIlx1MDExQiIgPT4gImUiCisKKyMgx50gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEVdCisiXHUwMUREIiA9PiAiZSIKKworIyDIhSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwNSIgPT4gImUiCisKKyMgyIcgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIwNyIgPT4gImUiCisKKyMgyKkgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENFRElMTEFdCisiXHUwMjI5IiA9PiAiZSIKKworIyDJhyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggU1RST0tFXQorIlx1MDI0NyIgPT4gImUiCisKKyMgyZggIFtMQVRJTiBTTUFMTCBMRVRURVIgUkVWRVJTRUQgRV0KKyJcdTAyNTgiID0+ICJlIgorCisjIMmbICBbTEFUSU4gU01BTEwgTEVUVEVSIE9QRU4gRV0KKyJcdTAyNUIiID0+ICJlIgorCisjIMmcICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIE9QRU4gRV0KKyJcdTAyNUMiID0+ICJlIgorCisjIMmdICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIE9QRU4gRSBXSVRIIEhPT0tdCisiXHUwMjVEIiA9PiAiZSIKKworIyDJniAgW0xBVElOIFNNQUxMIExFVFRFUiBDTE9TRUQgUkVWRVJTRUQgT1BFTiBFXQorIlx1MDI1RSIgPT4gImUiCisKKyMgypogIFtMQVRJTiBTTUFMTCBMRVRURVIgQ0xPU0VEIE9QRU4gRV0KKyJcdTAyOUEiID0+ICJlIgorCisjIOG0iCAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgT1BFTiBFXQorIlx1MUQwOCIgPT4gImUiCisKKyMg4baSICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTIiID0+ICJlIgorCisjIOG2kyAgW0xBVElOIFNNQUxMIExFVFRFUiBPUEVOIEUgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTMiID0+ICJlIgorCisjIOG2lCAgW0xBVElOIFNNQUxMIExFVFRFUiBSRVZFUlNFRCBPUEVOIEUgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTQiID0+ICJlIgorCisjIOG4lSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBHUkFWRV0KKyJcdTFFMTUiID0+ICJlIgorCisjIOG4lyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBBQ1VURV0KKyJcdTFFMTciID0+ICJlIgorCisjIOG4mSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFMTkiID0+ICJlIgorCisjIOG4myAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTFCIiA9PiAiZSIKKworIyDhuJ0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENFRElMTEEgQU5EIEJSRVZFXQorIlx1MUUxRCIgPT4gImUiCisKKyMg4bq5ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQkVMT1ddCisiXHUxRUI5IiA9PiAiZSIKKworIyDhursgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUJCIiA9PiAiZSIKKworIyDhur0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIFRJTERFXQorIlx1MUVCRCIgPT4gImUiCisKKyMg4bq/ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURV0KKyJcdTFFQkYiID0+ICJlIgorCisjIOG7gSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdCisiXHUxRUMxIiA9PiAiZSIKKworIyDhu4MgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkVdCisiXHUxRUMzIiA9PiAiZSIKKworIyDhu4UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFXQorIlx1MUVDNSIgPT4gImUiCisKKyMg4buHICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddCisiXHUxRUM3IiA9PiAiZSIKKworIyDigpEgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEVdCisiXHUyMDkxIiA9PiAiZSIKKworIyDik5QgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBFXQorIlx1MjRENCIgPT4gImUiCisKKyMg4rG4ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBOT1RDSF0KKyJcdTJDNzgiID0+ICJlIgorCisjIO+9hSAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgRV0KKyJcdUZGNDUiID0+ICJlIgorCisjIOKSoCAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEVdCisiXHUyNEEwIiA9PiAiKGUpIgorCisjIMaRICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiBXSVRIIEhPT0tdCisiXHUwMTkxIiA9PiAiRiIKKworIyDhuJ4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFXQorIlx1MUUxRSIgPT4gIkYiCisKKyMg4pK7ICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBGXQorIlx1MjRCQiIgPT4gIkYiCisKKyMg6pywICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgRl0KKyJcdUE3MzAiID0+ICJGIgorCisjIOqduyAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgRl0KKyJcdUE3N0IiID0+ICJGIgorCisjIOqfuyAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIFJFVkVSU0VEIEZdCisiXHVBN0ZCIiA9PiAiRiIKKworIyDvvKYgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRl0KKyJcdUZGMjYiID0+ICJGIgorCisjIMaSICBbTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LXQorIlx1MDE5MiIgPT4gImYiCisKKyMg4bWuICBbTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBNSURETEUgVElMREVdCisiXHUxRDZFIiA9PiAiZiIKKworIyDhtoIgIFtMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODIiID0+ICJmIgorCisjIOG4nyAgW0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFXQorIlx1MUUxRiIgPT4gImYiCisKKyMg4bqbICBbTEFUSU4gU01BTEwgTEVUVEVSIExPTkcgUyBXSVRIIERPVCBBQk9WRV0KKyJcdTFFOUIiID0+ICJmIgorCisjIOKTlSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEZdCisiXHUyNEQ1IiA9PiAiZiIKKworIyDqnbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgSU5TVUxBUiBGXQorIlx1QTc3QyIgPT4gImYiCisKKyMg772GICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBGXQorIlx1RkY0NiIgPT4gImYiCisKKyMg4pKhICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgRl0KKyJcdTI0QTEiID0+ICIoZikiCisKKyMg76yAICBbTEFUSU4gU01BTEwgTElHQVRVUkUgRkZdCisiXHVGQjAwIiA9PiAiZmYiCisKKyMg76yDICBbTEFUSU4gU01BTEwgTElHQVRVUkUgRkZJXQorIlx1RkIwMyIgPT4gImZmaSIKKworIyDvrIQgIFtMQVRJTiBTTUFMTCBMSUdBVFVSRSBGRkxdCisiXHVGQjA0IiA9PiAiZmZsIgorCisjIO+sgSAgW0xBVElOIFNNQUxMIExJR0FUVVJFIEZJXQorIlx1RkIwMSIgPT4gImZpIgorCisjIO+sgiAgW0xBVElOIFNNQUxMIExJR0FUVVJFIEZMXQorIlx1RkIwMiIgPT4gImZsIgorCisjIMScICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTFDIiA9PiAiRyIKKworIyDEniAgW0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRV0KKyJcdTAxMUUiID0+ICJHIgorCisjIMSgICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRV0KKyJcdTAxMjAiID0+ICJHIgorCisjIMSiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEFdCisiXHUwMTIyIiA9PiAiRyIKKworIyDGkyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBIT09LXQorIlx1MDE5MyIgPT4gIkciCisKKyMgx6QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggU1RST0tFXQorIlx1MDFFNCIgPT4gIkciCisKKyMgx6UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIFNUUk9LRV0KKyJcdTAxRTUiID0+ICJHIgorCisjIMemICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENBUk9OXQorIlx1MDFFNiIgPT4gIkciCisKKyMgx6cgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENBUk9OXQorIlx1MDFFNyIgPT4gIkciCisKKyMgx7QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQUNVVEVdCisiXHUwMUY0IiA9PiAiRyIKKworIyDJoiAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEddCisiXHUwMjYyIiA9PiAiRyIKKworIyDKmyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEcgV0lUSCBIT09LXQorIlx1MDI5QiIgPT4gIkciCisKKyMg4bigICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIE1BQ1JPTl0KKyJcdTFFMjAiID0+ICJHIgorCisjIOKSvCAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgR10KKyJcdTI0QkMiID0+ICJHIgorCisjIOqdvSAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgR10KKyJcdUE3N0QiID0+ICJHIgorCisjIOqdviAgW0xBVElOIENBUElUQUwgTEVUVEVSIFRVUk5FRCBJTlNVTEFSIEddCisiXHVBNzdFIiA9PiAiRyIKKworIyDvvKcgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgR10KKyJcdUZGMjciID0+ICJHIgorCisjIMSdICBbTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDExRCIgPT4gImciCisKKyMgxJ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFXQorIlx1MDExRiIgPT4gImciCisKKyMgxKEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRV0KKyJcdTAxMjEiID0+ICJnIgorCisjIMSjICBbTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBXQorIlx1MDEyMyIgPT4gImciCisKKyMgx7UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEFDVVRFXQorIlx1MDFGNSIgPT4gImciCisKKyMgyaAgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEhPT0tdCisiXHUwMjYwIiA9PiAiZyIKKworIyDJoSAgW0xBVElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgR10KKyJcdTAyNjEiID0+ICJnIgorCisjIOG1tyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgR10KKyJcdTFENzciID0+ICJnIgorCisjIOG1uSAgW0xBVElOIFNNQUxMIExFVFRFUiBJTlNVTEFSIEddCisiXHUxRDc5IiA9PiAiZyIKKworIyDhtoMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODMiID0+ICJnIgorCisjIOG4oSAgW0xBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggTUFDUk9OXQorIlx1MUUyMSIgPT4gImciCisKKyMg4pOWICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgR10KKyJcdTI0RDYiID0+ICJnIgorCisjIOqdvyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgSU5TVUxBUiBHXQorIlx1QTc3RiIgPT4gImciCisKKyMg772HICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBHXQorIlx1RkY0NyIgPT4gImciCisKKyMg4pKiICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgR10KKyJcdTI0QTIiID0+ICIoZykiCisKKyMgxKQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxMjQiID0+ICJIIgorCisjIMSmICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIFNUUk9LRV0KKyJcdTAxMjYiID0+ICJIIgorCisjIMieICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENBUk9OXQorIlx1MDIxRSIgPT4gIkgiCisKKyMgypwgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBIXQorIlx1MDI5QyIgPT4gIkgiCisKKyMg4biiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMjIiID0+ICJIIgorCisjIOG4pCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBET1QgQkVMT1ddCisiXHUxRTI0IiA9PiAiSCIKKworIyDhuKYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggRElBRVJFU0lTXQorIlx1MUUyNiIgPT4gIkgiCisKKyMg4bioICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENFRElMTEFdCisiXHUxRTI4IiA9PiAiSCIKKworIyDhuKogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQlJFVkUgQkVMT1ddCisiXHUxRTJBIiA9PiAiSCIKKworIyDikr0gIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIEhdCisiXHUyNEJEIiA9PiAiSCIKKworIyDisacgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggREVTQ0VOREVSXQorIlx1MkM2NyIgPT4gIkgiCisKKyMg4rG1ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSEFMRiBIXQorIlx1MkM3NSIgPT4gIkgiCisKKyMg77yoICBbRlVMTFdJRFRIIExBVElOIENBUElUQUwgTEVUVEVSIEhdCisiXHVGRjI4IiA9PiAiSCIKKworIyDEpSAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxMjUiID0+ICJoIgorCisjIMSnICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBTVFJPS0VdCisiXHUwMTI3IiA9PiAiaCIKKworIyDInyAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0FST05dCisiXHUwMjFGIiA9PiAiaCIKKworIyDJpSAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgSF0KKyJcdTAyNjUiID0+ICJoIgorCisjIMmmICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBIT09LXQorIlx1MDI2NiIgPT4gImgiCisKKyMgyq4gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEggV0lUSCBGSVNISE9PS10KKyJcdTAyQUUiID0+ICJoIgorCisjIMqvICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBIIFdJVEggRklTSEhPT0sgQU5EIFRBSUxdCisiXHUwMkFGIiA9PiAiaCIKKworIyDhuKMgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMjMiID0+ICJoIgorCisjIOG4pSAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggRE9UIEJFTE9XXQorIlx1MUUyNSIgPT4gImgiCisKKyMg4binICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBESUFFUkVTSVNdCisiXHUxRTI3IiA9PiAiaCIKKworIyDhuKkgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIENFRElMTEFdCisiXHUxRTI5IiA9PiAiaCIKKworIyDhuKsgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIEJSRVZFIEJFTE9XXQorIlx1MUUyQiIgPT4gImgiCisKKyMg4bqWICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBMSU5FIEJFTE9XXQorIlx1MUU5NiIgPT4gImgiCisKKyMg4pOXICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgSF0KKyJcdTI0RDciID0+ICJoIgorCisjIOKxqCAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggREVTQ0VOREVSXQorIlx1MkM2OCIgPT4gImgiCisKKyMg4rG2ICBbTEFUSU4gU01BTEwgTEVUVEVSIEhBTEYgSF0KKyJcdTJDNzYiID0+ICJoIgorCisjIO+9iCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgSF0KKyJcdUZGNDgiID0+ICJoIgorCisjIMe2ICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h3YWlyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSFdBSVJdCisiXHUwMUY2IiA9PiAiSFYiCisKKyMg4pKjICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgSF0KKyJcdTI0QTMiID0+ICIoaCkiCisKKyMgxpUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSFZdCisiXHUwMTk1IiA9PiAiaHYiCisKKyMgw4wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkVdCisiXHUwMENDIiA9PiAiSSIKKworIyDDjSAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURV0KKyJcdTAwQ0QiID0+ICJJIgorCisjIMOOICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVhdCisiXHUwMENFIiA9PiAiSSIKKworIyDDjyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVNdCisiXHUwMENGIiA9PiAiSSIKKworIyDEqCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERV0KKyJcdTAxMjgiID0+ICJJIgorCisjIMSqICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTl0KKyJcdTAxMkEiID0+ICJJIgorCisjIMSsICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEJSRVZFXQorIlx1MDEyQyIgPT4gIkkiCisKKyMgxK4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLXQorIlx1MDEyRSIgPT4gIkkiCisKKyMgxLAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFXQorIlx1MDEzMCIgPT4gIkkiCisKKyMgxpYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJT1RBXQorIlx1MDE5NiIgPT4gIkkiCisKKyMgxpcgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggU1RST0tFXQorIlx1MDE5NyIgPT4gIkkiCisKKyMgx48gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0FST05dCisiXHUwMUNGIiA9PiAiSSIKKworIyDIiCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1VCTEUgR1JBVkVdCisiXHUwMjA4IiA9PiAiSSIKKworIyDIiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMEEiID0+ICJJIgorCisjIMmqICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgSV0KKyJcdTAyNkEiID0+ICJJIgorCisjIOG1uyAgW0xBVElOIFNNQUxMIENBUElUQUwgTEVUVEVSIEkgV0lUSCBTVFJPS0VdCisiXHUxRDdCIiA9PiAiSSIKKworIyDhuKwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTJDIiA9PiAiSSIKKworIyDhuK4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTIEFORCBBQ1VURV0KKyJcdTFFMkUiID0+ICJJIgorCisjIOG7iCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVDOCIgPT4gIkkiCisKKyMg4buKICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBCRUxPV10KKyJcdTFFQ0EiID0+ICJJIgorCisjIOKSviAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSV0KKyJcdTI0QkUiID0+ICJJIgorCisjIOqfviAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIEkgTE9OR0FdCisiXHVBN0ZFIiA9PiAiSSIKKworIyDvvKkgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSV0KKyJcdUZGMjkiID0+ICJJIgorCisjIMOsICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRV0KKyJcdTAwRUMiID0+ICJpIgorCisjIMOtICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURV0KKyJcdTAwRUQiID0+ICJpIgorCisjIMOuICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDBFRSIgPT4gImkiCisKKyMgw68gIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJU10KKyJcdTAwRUYiID0+ICJpIgorCisjIMSpICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBUSUxERV0KKyJcdTAxMjkiID0+ICJpIgorCisjIMSrICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST05dCisiXHUwMTJCIiA9PiAiaSIKKworIyDErSAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQlJFVkVdCisiXHUwMTJEIiA9PiAiaSIKKworIyDEryAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLXQorIlx1MDEyRiIgPT4gImkiCisKKyMgxLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJXQorIlx1MDEzMSIgPT4gImkiCisKKyMgx5AgIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENBUk9OXQorIlx1MDFEMCIgPT4gImkiCisKKyMgyIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERPVUJMRSBHUkFWRV0KKyJcdTAyMDkiID0+ICJpIgorCisjIMiLICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMEIiID0+ICJpIgorCisjIMmoICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBTVFJPS0VdCisiXHUwMjY4IiA9PiAiaSIKKworIyDhtIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEldCisiXHUxRDA5IiA9PiAiaSIKKworIyDhtaIgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEldCisiXHUxRDYyIiA9PiAiaSIKKworIyDhtbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFNUUk9LRV0KKyJcdTFEN0MiID0+ICJpIgorCisjIOG2liAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggUkVUUk9GTEVYIEhPT0tdCisiXHUxRDk2IiA9PiAiaSIKKworIyDhuK0gIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIFRJTERFIEJFTE9XXQorIlx1MUUyRCIgPT4gImkiCisKKyMg4bivICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgQU5EIEFDVVRFXQorIlx1MUUyRiIgPT4gImkiCisKKyMg4buJICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVDOSIgPT4gImkiCisKKyMg4buLICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1ddCisiXHUxRUNCIiA9PiAiaSIKKworIyDigbEgIFtTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgSV0KKyJcdTIwNzEiID0+ICJpIgorCisjIOKTmCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEldCisiXHUyNEQ4IiA9PiAiaSIKKworIyDvvYkgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEldCisiXHVGRjQ5IiA9PiAiaSIKKworIyDEsiAgW0xBVElOIENBUElUQUwgTElHQVRVUkUgSUpdCisiXHUwMTMyIiA9PiAiSUoiCisKKyMg4pKkICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgSV0KKyJcdTI0QTQiID0+ICIoaSkiCisKKyMgxLMgIFtMQVRJTiBTTUFMTCBMSUdBVFVSRSBJSl0KKyJcdTAxMzMiID0+ICJpaiIKKworIyDEtCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYXQorIlx1MDEzNCIgPT4gIkoiCisKKyMgyYggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBKIFdJVEggU1RST0tFXQorIlx1MDI0OCIgPT4gIkoiCisKKyMg4bSKICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgSl0KKyJcdTFEMEEiID0+ICJKIgorCisjIOKSvyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSl0KKyJcdTI0QkYiID0+ICJKIgorCisjIO+8qiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBKXQorIlx1RkYyQSIgPT4gIkoiCisKKyMgxLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTM1IiA9PiAiaiIKKworIyDHsCAgW0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggQ0FST05dCisiXHUwMUYwIiA9PiAiaiIKKworIyDItyAgW0xBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEpdCisiXHUwMjM3IiA9PiAiaiIKKworIyDJiSAgW0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggU1RST0tFXQorIlx1MDI0OSIgPT4gImoiCisKKyMgyZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBKIFdJVEggU1RST0tFXQorIlx1MDI1RiIgPT4gImoiCisKKyMgyoQgIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBKIFdJVEggU1RST0tFIEFORCBIT09LXQorIlx1MDI4NCIgPT4gImoiCisKKyMgyp0gIFtMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENST1NTRUQtVEFJTF0KKyJcdTAyOUQiID0+ICJqIgorCisjIOKTmSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEpdCisiXHUyNEQ5IiA9PiAiaiIKKworIyDisbwgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEpdCisiXHUyQzdDIiA9PiAiaiIKKworIyDvvYogIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEpdCisiXHVGRjRBIiA9PiAiaiIKKworIyDikqUgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBKXQorIlx1MjRBNSIgPT4gIihqKSIKKworIyDEtiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBXQorIlx1MDEzNiIgPT4gIksiCisKKyMgxpggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggSE9PS10KKyJcdTAxOTgiID0+ICJLIgorCisjIMeoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENBUk9OXQorIlx1MDFFOCIgPT4gIksiCisKKyMg4bSLICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgS10KKyJcdTFEMEIiID0+ICJLIgorCisjIOG4sCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBBQ1VURV0KKyJcdTFFMzAiID0+ICJLIgorCisjIOG4siAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBET1QgQkVMT1ddCisiXHUxRTMyIiA9PiAiSyIKKworIyDhuLQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggTElORSBCRUxPV10KKyJcdTFFMzQiID0+ICJLIgorCisjIOKTgCAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgS10KKyJcdTI0QzAiID0+ICJLIgorCisjIOKxqSAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBERVNDRU5ERVJdCisiXHUyQzY5IiA9PiAiSyIKKworIyDqnYAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggU1RST0tFXQorIlx1QTc0MCIgPT4gIksiCisKKyMg6p2CICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NDIiID0+ICJLIgorCisjIOqdhCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBTVFJPS0UgQU5EIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NDQiID0+ICJLIgorCisjIO+8qyAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBLXQorIlx1RkYyQiIgPT4gIksiCisKKyMgxLcgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEFdCisiXHUwMTM3IiA9PiAiayIKKworIyDGmSAgW0xBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggSE9PS10KKyJcdTAxOTkiID0+ICJrIgorCisjIMepICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDQVJPTl0KKyJcdTAxRTkiID0+ICJrIgorCisjIMqeICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBLXQorIlx1MDI5RSIgPT4gImsiCisKKyMg4baEICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg0IiA9PiAiayIKKworIyDhuLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIEFDVVRFXQorIlx1MUUzMSIgPT4gImsiCisKKyMg4bizICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBET1QgQkVMT1ddCisiXHUxRTMzIiA9PiAiayIKKworIyDhuLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTM1IiA9PiAiayIKKworIyDik5ogIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBLXQorIlx1MjREQSIgPT4gImsiCisKKyMg4rGqICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBERVNDRU5ERVJdCisiXHUyQzZBIiA9PiAiayIKKworIyDqnYEgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIFNUUk9LRV0KKyJcdUE3NDEiID0+ICJrIgorCisjIOqdgyAgW0xBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1QTc0MyIgPT4gImsiCisKKyMg6p2FICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBTVFJPS0UgQU5EIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NDUiID0+ICJrIgorCisjIO+9iyAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgS10KKyJcdUZGNEIiID0+ICJrIgorCisjIOKSpiAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEtdCisiXHUyNEE2IiA9PiAiKGspIgorCisjIMS5ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFXQorIlx1MDEzOSIgPT4gIkwiCisKKyMgxLsgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQV0KKyJcdTAxM0IiID0+ICJMIgorCisjIMS9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OXQorIlx1MDEzRCIgPT4gIkwiCisKKyMgxL8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggTUlERExFIERPVF0KKyJcdTAxM0YiID0+ICJMIgorCisjIMWBICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRV0KKyJcdTAxNDEiID0+ICJMIgorCisjIMi9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEJBUl0KKyJcdTAyM0QiID0+ICJMIgorCisjIMqfICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgTF0KKyJcdTAyOUYiID0+ICJMIgorCisjIOG0jCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEwgV0lUSCBTVFJPS0VdCisiXHUxRDBDIiA9PiAiTCIKKworIyDhuLYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XXQorIlx1MUUzNiIgPT4gIkwiCisKKyMg4bi4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIERPVCBCRUxPVyBBTkQgTUFDUk9OXQorIlx1MUUzOCIgPT4gIkwiCisKKyMg4bi6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTNBIiA9PiAiTCIKKworIyDhuLwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFM0MiID0+ICJMIgorCisjIOKTgSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTF0KKyJcdTI0QzEiID0+ICJMIgorCisjIOKxoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBET1VCTEUgQkFSXQorIlx1MkM2MCIgPT4gIkwiCisKKyMg4rGiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTJDNjIiID0+ICJMIgorCisjIOqdhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEJST0tFTiBMXQorIlx1QTc0NiIgPT4gIkwiCisKKyMg6p2IICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEhJR0ggU1RST0tFXQorIlx1QTc0OCIgPT4gIkwiCisKKyMg6p6AICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIExdCisiXHVBNzgwIiA9PiAiTCIKKworIyDvvKwgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTF0KKyJcdUZGMkMiID0+ICJMIgorCisjIMS6ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURV0KKyJcdTAxM0EiID0+ICJsIgorCisjIMS8ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBXQorIlx1MDEzQyIgPT4gImwiCisKKyMgxL4gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OXQorIlx1MDEzRSIgPT4gImwiCisKKyMgxYAgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIE1JRERMRSBET1RdCisiXHUwMTQwIiA9PiAibCIKKworIyDFgiAgW0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFXQorIlx1MDE0MiIgPT4gImwiCisKKyMgxpogIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEJBUl0KKyJcdTAxOUEiID0+ICJsIgorCisjIMi0ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDVVJMXQorIlx1MDIzNCIgPT4gImwiCisKKyMgyasgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTAyNkIiID0+ICJsIgorCisjIMmsICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBCRUxUXQorIlx1MDI2QyIgPT4gImwiCisKKyMgya0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MDI2RCIgPT4gImwiCisKKyMg4baFICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg1IiA9PiAibCIKKworIyDhuLcgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIERPVCBCRUxPV10KKyJcdTFFMzciID0+ICJsIgorCisjIOG4uSAgW0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XIEFORCBNQUNST05dCisiXHUxRTM5IiA9PiAibCIKKworIyDhuLsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTNCIiA9PiAibCIKKworIyDhuL0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENJUkNVTUZMRVggQkVMT1ddCisiXHUxRTNEIiA9PiAibCIKKworIyDik5sgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBMXQorIlx1MjREQiIgPT4gImwiCisKKyMg4rGhICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBET1VCTEUgQkFSXQorIlx1MkM2MSIgPT4gImwiCisKKyMg6p2HICBbTEFUSU4gU01BTEwgTEVUVEVSIEJST0tFTiBMXQorIlx1QTc0NyIgPT4gImwiCisKKyMg6p2JICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBISUdIIFNUUk9LRV0KKyJcdUE3NDkiID0+ICJsIgorCisjIOqegSAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgTF0KKyJcdUE3ODEiID0+ICJsIgorCisjIO+9jCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgTF0KKyJcdUZGNEMiID0+ICJsIgorCisjIMeHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTEpdCisiXHUwMUM3IiA9PiAiTEoiCisKKyMg4bu6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTUlERExFLVdFTFNIIExMXQorIlx1MUVGQSIgPT4gIkxMIgorCisjIMeIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNNQUxMIExFVFRFUiBKXQorIlx1MDFDOCIgPT4gIkxqIgorCisjIOKSpyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIExdCisiXHUyNEE3IiA9PiAiKGwpIgorCisjIMeJICBbTEFUSU4gU01BTEwgTEVUVEVSIExKXQorIlx1MDFDOSIgPT4gImxqIgorCisjIOG7uyAgW0xBVElOIFNNQUxMIExFVFRFUiBNSURETEUtV0VMU0ggTExdCisiXHUxRUZCIiA9PiAibGwiCisKKyMgyqogIFtMQVRJTiBTTUFMTCBMRVRURVIgTFMgRElHUkFQSF0KKyJcdTAyQUEiID0+ICJscyIKKworIyDKqyAgW0xBVElOIFNNQUxMIExFVFRFUiBMWiBESUdSQVBIXQorIlx1MDJBQiIgPT4gImx6IgorCisjIMacICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIE1dCisiXHUwMTlDIiA9PiAiTSIKKworIyDhtI0gIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBNXQorIlx1MUQwRCIgPT4gIk0iCisKKyMg4bi+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIEFDVVRFXQorIlx1MUUzRSIgPT4gIk0iCisKKyMg4bmAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNDAiID0+ICJNIgorCisjIOG5giAgW0xBVElOIENBUElUQUwgTEVUVEVSIE0gV0lUSCBET1QgQkVMT1ddCisiXHUxRTQyIiA9PiAiTSIKKworIyDik4IgIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIE1dCisiXHUyNEMyIiA9PiAiTSIKKworIyDisa4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBNIFdJVEggSE9PS10KKyJcdTJDNkUiID0+ICJNIgorCisjIOqfvSAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIElOVkVSVEVEIE1dCisiXHVBN0ZEIiA9PiAiTSIKKworIyDqn78gIFtMQVRJTiBFUElHUkFQSElDIExFVFRFUiBBUkNIQUlDIE1dCisiXHVBN0ZGIiA9PiAiTSIKKworIyDvvK0gIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTV0KKyJcdUZGMkQiID0+ICJNIgorCisjIMmvICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBNXQorIlx1MDI2RiIgPT4gIm0iCisKKyMgybAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIE0gV0lUSCBMT05HIExFR10KKyJcdTAyNzAiID0+ICJtIgorCisjIMmxICBbTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBIT09LXQorIlx1MDI3MSIgPT4gIm0iCisKKyMg4bWvICBbTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBNSURETEUgVElMREVdCisiXHUxRDZGIiA9PiAibSIKKworIyDhtoYgIFtMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODYiID0+ICJtIgorCisjIOG4vyAgW0xBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggQUNVVEVdCisiXHUxRTNGIiA9PiAibSIKKworIyDhuYEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNDEiID0+ICJtIgorCisjIOG5gyAgW0xBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggRE9UIEJFTE9XXQorIlx1MUU0MyIgPT4gIm0iCisKKyMg4pOcICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgTV0KKyJcdTI0REMiID0+ICJtIgorCisjIO+9jSAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgTV0KKyJcdUZGNEQiID0+ICJtIgorCisjIOKSqCAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE1dCisiXHUyNEE4IiA9PiAiKG0pIgorCisjIMORICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFXQorIlx1MDBEMSIgPT4gIk4iCisKKyMgxYMgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEVdCisiXHUwMTQzIiA9PiAiTiIKKworIyDFhSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBXQorIlx1MDE0NSIgPT4gIk4iCisKKyMgxYcgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST05dCisiXHUwMTQ3IiA9PiAiTiIKKworIyDFiiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmdfKGxldHRlcikgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkddCisiXHUwMTRBIiA9PiAiTiIKKworIyDGnSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBMRUZUIEhPT0tdCisiXHUwMTlEIiA9PiAiTiIKKworIyDHuCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBHUkFWRV0KKyJcdTAxRjgiID0+ICJOIgorCisjIMigICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIExPTkcgUklHSFQgTEVHXQorIlx1MDIyMCIgPT4gIk4iCisKKyMgybQgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBOXQorIlx1MDI3NCIgPT4gIk4iCisKKyMg4bSOICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgUkVWRVJTRUQgTl0KKyJcdTFEMEUiID0+ICJOIgorCisjIOG5hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBET1QgQUJPVkVdCisiXHUxRTQ0IiA9PiAiTiIKKworIyDhuYYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggRE9UIEJFTE9XXQorIlx1MUU0NiIgPT4gIk4iCisKKyMg4bmIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTQ4IiA9PiAiTiIKKworIyDhuYogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNEEiID0+ICJOIgorCisjIOKTgyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTl0KKyJcdTI0QzMiID0+ICJOIgorCisjIO+8riAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBOXQorIlx1RkYyRSIgPT4gIk4iCisKKyMgw7EgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFXQorIlx1MDBGMSIgPT4gIm4iCisKKyMgxYQgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFXQorIlx1MDE0NCIgPT4gIm4iCisKKyMgxYYgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEFdCisiXHUwMTQ2IiA9PiAibiIKKworIyDFiCAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST05dCisiXHUwMTQ4IiA9PiAibiIKKworIyDFiSAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFBSRUNFREVEIEJZIEFQT1NUUk9QSEVdCisiXHUwMTQ5IiA9PiAibiIKKworIyDFiyAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmdfKGxldHRlcikgIFtMQVRJTiBTTUFMTCBMRVRURVIgRU5HXQorIlx1MDE0QiIgPT4gIm4iCisKKyMgxp4gIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIExPTkcgUklHSFQgTEVHXQorIlx1MDE5RSIgPT4gIm4iCisKKyMgx7kgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEdSQVZFXQorIlx1MDFGOSIgPT4gIm4iCisKKyMgyLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENVUkxdCisiXHUwMjM1IiA9PiAibiIKKworIyDJsiAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggTEVGVCBIT09LXQorIlx1MDI3MiIgPT4gIm4iCisKKyMgybMgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MDI3MyIgPT4gIm4iCisKKyMg4bWwICBbTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBNSURETEUgVElMREVdCisiXHUxRDcwIiA9PiAibiIKKworIyDhtocgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODciID0+ICJuIgorCisjIOG5hSAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU0NSIgPT4gIm4iCisKKyMg4bmHICBbTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBET1QgQkVMT1ddCisiXHUxRTQ3IiA9PiAibiIKKworIyDhuYkgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTQ5IiA9PiAibiIKKworIyDhuYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENJUkNVTUZMRVggQkVMT1ddCisiXHUxRTRCIiA9PiAibiIKKworIyDigb8gIFtTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTl0KKyJcdTIwN0YiID0+ICJuIgorCisjIOKTnSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIE5dCisiXHUyNEREIiA9PiAibiIKKworIyDvvY4gIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIE5dCisiXHVGRjRFIiA9PiAibiIKKworIyDHiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE5KXQorIlx1MDFDQSIgPT4gIk5KIgorCisjIMeLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFNNQUxMIExFVFRFUiBKXQorIlx1MDFDQiIgPT4gIk5qIgorCisjIOKSqSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE5dCisiXHUyNEE5IiA9PiAiKG4pIgorCisjIMeMICBbTEFUSU4gU01BTEwgTEVUVEVSIE5KXQorIlx1MDFDQyIgPT4gIm5qIgorCisjIMOSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFXQorIlx1MDBEMiIgPT4gIk8iCisKKyMgw5MgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEVdCisiXHUwMEQzIiA9PiAiTyIKKworIyDDlCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYXQorIlx1MDBENCIgPT4gIk8iCisKKyMgw5UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREVdCisiXHUwMEQ1IiA9PiAiTyIKKworIyDDliAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVNdCisiXHUwMEQ2IiA9PiAiTyIKKworIyDDmCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0VdCisiXHUwMEQ4IiA9PiAiTyIKKworIyDFjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST05dCisiXHUwMTRDIiA9PiAiTyIKKworIyDFjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBCUkVWRV0KKyJcdTAxNEUiID0+ICJPIgorCisjIMWQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURV0KKyJcdTAxNTAiID0+ICJPIgorCisjIMaGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgT1BFTiBPXQorIlx1MDE4NiIgPT4gIk8iCisKKyMgxp8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUlERExFIFRJTERFXQorIlx1MDE5RiIgPT4gIk8iCisKKyMgxqAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STl0KKyJcdTAxQTAiID0+ICJPIgorCisjIMeRICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENBUk9OXQorIlx1MDFEMSIgPT4gIk8iCisKKyMgx6ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggT0dPTkVLXQorIlx1MDFFQSIgPT4gIk8iCisKKyMgx6wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggT0dPTkVLIEFORCBNQUNST05dCisiXHUwMUVDIiA9PiAiTyIKKworIyDHviAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgQU5EIEFDVVRFXQorIlx1MDFGRSIgPT4gIk8iCisKKyMgyIwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwQyIgPT4gIk8iCisKKyMgyI4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjBFIiA9PiAiTyIKKworIyDIqiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgQU5EIE1BQ1JPTl0KKyJcdTAyMkEiID0+ICJPIgorCisjIMisICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBNQUNST05dCisiXHUwMjJDIiA9PiAiTyIKKworIyDIriAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQUJPVkVdCisiXHUwMjJFIiA9PiAiTyIKKworIyDIsCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0KKyJcdTAyMzAiID0+ICJPIgorCisjIOG0jyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIE9dCisiXHUxRDBGIiA9PiAiTyIKKworIyDhtJAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBPUEVOIE9dCisiXHUxRDEwIiA9PiAiTyIKKworIyDhuYwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgQU5EIEFDVVRFXQorIlx1MUU0QyIgPT4gIk8iCisKKyMg4bmOICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBESUFFUkVTSVNdCisiXHUxRTRFIiA9PiAiTyIKKworIyDhuZAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OIEFORCBHUkFWRV0KKyJcdTFFNTAiID0+ICJPIgorCisjIOG5kiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04gQU5EIEFDVVRFXQorIlx1MUU1MiIgPT4gIk8iCisKKyMg4buMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPV10KKyJcdTFFQ0MiID0+ICJPIgorCisjIOG7jiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVDRSIgPT4gIk8iCisKKyMg4buQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFXQorIlx1MUVEMCIgPT4gIk8iCisKKyMg4buSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFXQorIlx1MUVEMiIgPT4gIk8iCisKKyMg4buUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkVdCisiXHUxRUQ0IiA9PiAiTyIKKworIyDhu5YgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREVdCisiXHUxRUQ2IiA9PiAiTyIKKworIyDhu5ggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XXQorIlx1MUVEOCIgPT4gIk8iCisKKyMg4buaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEFDVVRFXQorIlx1MUVEQSIgPT4gIk8iCisKKyMg4bucICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEdSQVZFXQorIlx1MUVEQyIgPT4gIk8iCisKKyMg4bueICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkVdCisiXHUxRURFIiA9PiAiTyIKKworIyDhu6AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgVElMREVdCisiXHUxRUUwIiA9PiAiTyIKKworIyDhu6IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XXQorIlx1MUVFMiIgPT4gIk8iCisKKyMg4pOEICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPXQorIlx1MjRDNCIgPT4gIk8iCisKKyMg6p2KICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIExPTkcgU1RST0tFIE9WRVJMQVldCisiXHVBNzRBIiA9PiAiTyIKKworIyDqnYwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTE9PUF0KKyJcdUE3NEMiID0+ICJPIgorCisjIO+8ryAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPXQorIlx1RkYyRiIgPT4gIk8iCisKKyMgw7IgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFXQorIlx1MDBGMiIgPT4gIm8iCisKKyMgw7MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFXQorIlx1MDBGMyIgPT4gIm8iCisKKyMgw7QgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMEY0IiA9PiAibyIKKworIyDDtSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREVdCisiXHUwMEY1IiA9PiAibyIKKworIyDDtiAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTXQorIlx1MDBGNiIgPT4gIm8iCisKKyMgw7ggIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRV0KKyJcdTAwRjgiID0+ICJvIgorCisjIMWNICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST05dCisiXHUwMTREIiA9PiAibyIKKworIyDFjyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQlJFVkVdCisiXHUwMTRGIiA9PiAibyIKKworIyDFkSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFXQorIlx1MDE1MSIgPT4gIm8iCisKKyMgxqEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk5dCisiXHUwMUExIiA9PiAibyIKKworIyDHkiAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0FST05dCisiXHUwMUQyIiA9PiAibyIKKworIyDHqyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggT0dPTkVLXQorIlx1MDFFQiIgPT4gIm8iCisKKyMgx60gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE9HT05FSyBBTkQgTUFDUk9OXQorIlx1MDFFRCIgPT4gIm8iCisKKyMgx78gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSBBTkQgQUNVVEVdCisiXHUwMUZGIiA9PiAibyIKKworIyDIjSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwRCIgPT4gIm8iCisKKyMgyI8gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIwRiIgPT4gIm8iCisKKyMgyKsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyBBTkQgTUFDUk9OXQorIlx1MDIyQiIgPT4gIm8iCisKKyMgyK0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBNQUNST05dCisiXHUwMjJEIiA9PiAibyIKKworIyDIryAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9UIEFCT1ZFXQorIlx1MDIyRiIgPT4gIm8iCisKKyMgyLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBBQk9WRSBBTkQgTUFDUk9OXQorIlx1MDIzMSIgPT4gIm8iCisKKyMgyZQgIFtMQVRJTiBTTUFMTCBMRVRURVIgT1BFTiBPXQorIlx1MDI1NCIgPT4gIm8iCisKKyMgybUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQkFSUkVEIE9dCisiXHUwMjc1IiA9PiAibyIKKworIyDhtJYgIFtMQVRJTiBTTUFMTCBMRVRURVIgVE9QIEhBTEYgT10KKyJcdTFEMTYiID0+ICJvIgorCisjIOG0lyAgW0xBVElOIFNNQUxMIExFVFRFUiBCT1RUT00gSEFMRiBPXQorIlx1MUQxNyIgPT4gIm8iCisKKyMg4baXICBbTEFUSU4gU01BTEwgTEVUVEVSIE9QRU4gTyBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MUQ5NyIgPT4gIm8iCisKKyMg4bmNICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSBBTkQgQUNVVEVdCisiXHUxRTREIiA9PiAibyIKKworIyDhuY8gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBESUFFUkVTSVNdCisiXHUxRTRGIiA9PiAibyIKKworIyDhuZEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTiBBTkQgR1JBVkVdCisiXHUxRTUxIiA9PiAibyIKKworIyDhuZMgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTiBBTkQgQUNVVEVdCisiXHUxRTUzIiA9PiAibyIKKworIyDhu40gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPV10KKyJcdTFFQ0QiID0+ICJvIgorCisjIOG7jyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9PSyBBQk9WRV0KKyJcdTFFQ0YiID0+ICJvIgorCisjIOG7kSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdCisiXHUxRUQxIiA9PiAibyIKKworIyDhu5MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFXQorIlx1MUVEMyIgPT4gIm8iCisKKyMg4buVICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFXQorIlx1MUVENSIgPT4gIm8iCisKKyMg4buXICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0KKyJcdTFFRDciID0+ICJvIgorCisjIOG7mSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XXQorIlx1MUVEOSIgPT4gIm8iCisKKyMg4bubICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBBQ1VURV0KKyJcdTFFREIiID0+ICJvIgorCisjIOG7nSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgR1JBVkVdCisiXHUxRUREIiA9PiAibyIKKworIyDhu58gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkVdCisiXHUxRURGIiA9PiAibyIKKworIyDhu6EgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIFRJTERFXQorIlx1MUVFMSIgPT4gIm8iCisKKyMg4bujICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1ddCisiXHUxRUUzIiA9PiAibyIKKworIyDigpIgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIE9dCisiXHUyMDkyIiA9PiAibyIKKworIyDik54gIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBPXQorIlx1MjRERSIgPT4gIm8iCisKKyMg4rG6ICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBMT1cgUklORyBJTlNJREVdCisiXHUyQzdBIiA9PiAibyIKKworIyDqnYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIExPTkcgU1RST0tFIE9WRVJMQVldCisiXHVBNzRCIiA9PiAibyIKKworIyDqnY0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIExPT1BdCisiXHVBNzREIiA9PiAibyIKKworIyDvvY8gIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIE9dCisiXHVGRjRGIiA9PiAibyIKKworIyDFkiAgW0xBVElOIENBUElUQUwgTElHQVRVUkUgT0VdCisiXHUwMTUyIiA9PiAiT0UiCisKKyMgybYgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBPRV0KKyJcdTAyNzYiID0+ICJPRSIKKworIyDqnY4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPT10KKyJcdUE3NEUiID0+ICJPTyIKKworIyDIoiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PVSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE9VXQorIlx1MDIyMiIgPT4gIk9VIgorCisjIOG0lSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIE9VXQorIlx1MUQxNSIgPT4gIk9VIgorCisjIOKSqiAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE9dCisiXHUyNEFBIiA9PiAiKG8pIgorCisjIMWTICBbTEFUSU4gU01BTEwgTElHQVRVUkUgT0VdCisiXHUwMTUzIiA9PiAib2UiCisKKyMg4bSUICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBPRV0KKyJcdTFEMTQiID0+ICJvZSIKKworIyDqnY8gIFtMQVRJTiBTTUFMTCBMRVRURVIgT09dCisiXHVBNzRGIiA9PiAib28iCisKKyMgyKMgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT1UgIFtMQVRJTiBTTUFMTCBMRVRURVIgT1VdCisiXHUwMjIzIiA9PiAib3UiCisKKyMgxqQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggSE9PS10KKyJcdTAxQTQiID0+ICJQIgorCisjIOG0mCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFBdCisiXHUxRDE4IiA9PiAiUCIKKworIyDhuZQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggQUNVVEVdCisiXHUxRTU0IiA9PiAiUCIKKworIyDhuZYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU1NiIgPT4gIlAiCisKKyMg4pOFICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQXQorIlx1MjRDNSIgPT4gIlAiCisKKyMg4rGjICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCBXSVRIIFNUUk9LRV0KKyJcdTJDNjMiID0+ICJQIgorCisjIOqdkCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFAgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdCisiXHVBNzUwIiA9PiAiUCIKKworIyDqnZIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRkxPVVJJU0hdCisiXHVBNzUyIiA9PiAiUCIKKworIyDqnZQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggU1FVSVJSRUwgVEFJTF0KKyJcdUE3NTQiID0+ICJQIgorCisjIO+8sCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQXQorIlx1RkYzMCIgPT4gIlAiCisKKyMgxqUgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEhPT0tdCisiXHUwMUE1IiA9PiAicCIKKworIyDhtbEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTFENzEiID0+ICJwIgorCisjIOG1vSAgW0xBVElOIFNNQUxMIExFVFRFUiBQIFdJVEggU1RST0tFXQorIlx1MUQ3RCIgPT4gInAiCisKKyMg4baIICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg4IiA9PiAicCIKKworIyDhuZUgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEFDVVRFXQorIlx1MUU1NSIgPT4gInAiCisKKyMg4bmXICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkVdCisiXHUxRTU3IiA9PiAicCIKKworIyDik58gIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBQXQorIlx1MjRERiIgPT4gInAiCisKKyMg6p2RICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdCisiXHVBNzUxIiA9PiAicCIKKworIyDqnZMgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEZMT1VSSVNIXQorIlx1QTc1MyIgPT4gInAiCisKKyMg6p2VICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBTUVVJUlJFTCBUQUlMXQorIlx1QTc1NSIgPT4gInAiCisKKyMg6p+8ICBbTEFUSU4gRVBJR1JBUEhJQyBMRVRURVIgUkVWRVJTRUQgUF0KKyJcdUE3RkMiID0+ICJwIgorCisjIO+9kCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgUF0KKyJcdUZGNTAiID0+ICJwIgorCisjIOKSqyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFBdCisiXHUyNEFCIiA9PiAiKHApIgorCisjIMmKICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgU01BTEwgUSBXSVRIIEhPT0sgVEFJTF0KKyJcdTAyNEEiID0+ICJRIgorCisjIOKThiAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUV0KKyJcdTI0QzYiID0+ICJRIgorCisjIOqdliAgW0xBVElOIENBUElUQUwgTEVUVEVSIFEgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdCisiXHVBNzU2IiA9PiAiUSIKKworIyDqnZggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBRIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1QTc1OCIgPT4gIlEiCisKKyMg77yxICBbRlVMTFdJRFRIIExBVElOIENBUElUQUwgTEVUVEVSIFFdCisiXHVGRjMxIiA9PiAiUSIKKworIyDEuCAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LcmFfKGxldHRlcikgIFtMQVRJTiBTTUFMTCBMRVRURVIgS1JBXQorIlx1MDEzOCIgPT4gInEiCisKKyMgyYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgUSBXSVRIIEhPT0sgVEFJTF0KKyJcdTAyNEIiID0+ICJxIgorCisjIMqgICBbTEFUSU4gU01BTEwgTEVUVEVSIFEgV0lUSCBIT09LXQorIlx1MDJBMCIgPT4gInEiCisKKyMg4pOgICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgUV0KKyJcdTI0RTAiID0+ICJxIgorCisjIOqdlyAgW0xBVElOIFNNQUxMIExFVFRFUiBRIFdJVEggU1RST0tFIFRIUk9VR0ggREVTQ0VOREVSXQorIlx1QTc1NyIgPT4gInEiCisKKyMg6p2ZICBbTEFUSU4gU01BTEwgTEVUVEVSIFEgV0lUSCBESUFHT05BTCBTVFJPS0VdCisiXHVBNzU5IiA9PiAicSIKKworIyDvvZEgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFFdCisiXHVGRjUxIiA9PiAicSIKKworIyDikqwgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBRXQorIlx1MjRBQyIgPT4gIihxKSIKKworIyDIuSAgW0xBVElOIFNNQUxMIExFVFRFUiBRUCBESUdSQVBIXQorIlx1MDIzOSIgPT4gInFwIgorCisjIMWUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFXQorIlx1MDE1NCIgPT4gIlIiCisKKyMgxZYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQV0KKyJcdTAxNTYiID0+ICJSIgorCisjIMWYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OXQorIlx1MDE1OCIgPT4gIlIiCisKKyMgyJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIxMCIgPT4gIlIiCisKKyMgyJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjEyIiA9PiAiUiIKKworIyDJjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBTVFJPS0VdCisiXHUwMjRDIiA9PiAiUiIKKworIyDKgCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFJdCisiXHUwMjgwIiA9PiAiUiIKKworIyDKgSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIElOVkVSVEVEIFJdCisiXHUwMjgxIiA9PiAiUiIKKworIyDhtJkgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBSRVZFUlNFRCBSXQorIlx1MUQxOSIgPT4gIlIiCisKKyMg4bSaICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgVFVSTkVEIFJdCisiXHUxRDFBIiA9PiAiUiIKKworIyDhuZggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU1OCIgPT4gIlIiCisKKyMg4bmaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIERPVCBCRUxPV10KKyJcdTFFNUEiID0+ICJSIgorCisjIOG5nCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBET1QgQkVMT1cgQU5EIE1BQ1JPTl0KKyJcdTFFNUMiID0+ICJSIgorCisjIOG5niAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBMSU5FIEJFTE9XXQorIlx1MUU1RSIgPT4gIlIiCisKKyMg4pOHICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBSXQorIlx1MjRDNyIgPT4gIlIiCisKKyMg4rGkICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIFRBSUxdCisiXHUyQzY0IiA9PiAiUiIKKworIyDqnZogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFJPVFVOREFdCisiXHVBNzVBIiA9PiAiUiIKKworIyDqnoIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJTlNVTEFSIFJdCisiXHVBNzgyIiA9PiAiUiIKKworIyDvvLIgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgUl0KKyJcdUZGMzIiID0+ICJSIgorCisjIMWVICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURV0KKyJcdTAxNTUiID0+ICJyIgorCisjIMWXICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBXQorIlx1MDE1NyIgPT4gInIiCisKKyMgxZkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OXQorIlx1MDE1OSIgPT4gInIiCisKKyMgyJEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIERPVUJMRSBHUkFWRV0KKyJcdTAyMTEiID0+ICJyIgorCisjIMiTICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMTMiID0+ICJyIgorCisjIMmNICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBTVFJPS0VdCisiXHUwMjREIiA9PiAiciIKKworIyDJvCAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTE9ORyBMRUddCisiXHUwMjdDIiA9PiAiciIKKworIyDJvSAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggVEFJTF0KKyJcdTAyN0QiID0+ICJyIgorCisjIMm+ICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBGSVNISE9PS10KKyJcdTAyN0UiID0+ICJyIgorCisjIMm/ICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIFIgV0lUSCBGSVNISE9PS10KKyJcdTAyN0YiID0+ICJyIgorCisjIOG1oyAgW0xBVElOIFNVQlNDUklQVCBTTUFMTCBMRVRURVIgUl0KKyJcdTFENjMiID0+ICJyIgorCisjIOG1siAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ3MiIgPT4gInIiCisKKyMg4bWzICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBGSVNISE9PSyBBTkQgTUlERExFIFRJTERFXQorIlx1MUQ3MyIgPT4gInIiCisKKyMg4baJICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg5IiA9PiAiciIKKworIyDhuZkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNTkiID0+ICJyIgorCisjIOG5myAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggRE9UIEJFTE9XXQorIlx1MUU1QiIgPT4gInIiCisKKyMg4bmdICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBET1QgQkVMT1cgQU5EIE1BQ1JPTl0KKyJcdTFFNUQiID0+ICJyIgorCisjIOG5nyAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTElORSBCRUxPV10KKyJcdTFFNUYiID0+ICJyIgorCisjIOKToSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFJdCisiXHUyNEUxIiA9PiAiciIKKworIyDqnZsgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBST1RVTkRBXQorIlx1QTc1QiIgPT4gInIiCisKKyMg6p6DICBbTEFUSU4gU01BTEwgTEVUVEVSIElOU1VMQVIgUl0KKyJcdUE3ODMiID0+ICJyIgorCisjIO+9kiAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgUl0KKyJcdUZGNTIiID0+ICJyIgorCisjIOKSrSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFJdCisiXHUyNEFEIiA9PiAiKHIpIgorCisjIMWaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFXQorIlx1MDE1QSIgPT4gIlMiCisKKyMgxZwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxNUMiID0+ICJTIgorCisjIMWeICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEFdCisiXHUwMTVFIiA9PiAiUyIKKworIyDFoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTl0KKyJcdTAxNjAiID0+ICJTIgorCisjIMiYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxOCIgPT4gIlMiCisKKyMg4bmgICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNjAiID0+ICJTIgorCisjIOG5oiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBET1QgQkVMT1ddCisiXHUxRTYyIiA9PiAiUyIKKworIyDhuaQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUgQU5EIERPVCBBQk9WRV0KKyJcdTFFNjQiID0+ICJTIgorCisjIOG5piAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTiBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2NiIgPT4gIlMiCisKKyMg4bmoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBCRUxPVyBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2OCIgPT4gIlMiCisKKyMg4pOIICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBTXQorIlx1MjRDOCIgPT4gIlMiCisKKyMg6pyxICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgU10KKyJcdUE3MzEiID0+ICJTIgorCisjIOqehSAgW0xBVElOIFNNQUxMIExFVFRFUiBJTlNVTEFSIFNdCisiXHVBNzg1IiA9PiAiUyIKKworIyDvvLMgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgU10KKyJcdUZGMzMiID0+ICJTIgorCisjIMWbICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURV0KKyJcdTAxNUIiID0+ICJzIgorCisjIMWdICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDE1RCIgPT4gInMiCisKKyMgxZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEFdCisiXHUwMTVGIiA9PiAicyIKKworIyDFoSAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST05dCisiXHUwMTYxIiA9PiAicyIKKworIyDFvyAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb25nX1MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTXQorIlx1MDE3RiIgPT4gInMiCisKKyMgyJkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxOSIgPT4gInMiCisKKyMgyL8gIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIFNXQVNIIFRBSUxdCisiXHUwMjNGIiA9PiAicyIKKworIyDKgiAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggSE9PS10KKyJcdTAyODIiID0+ICJzIgorCisjIOG1tCAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ3NCIgPT4gInMiCisKKyMg4baKICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDhBIiA9PiAicyIKKworIyDhuaEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNjEiID0+ICJzIgorCisjIOG5oyAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEJFTE9XXQorIlx1MUU2MyIgPT4gInMiCisKKyMg4bmlICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURSBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2NSIgPT4gInMiCisKKyMg4bmnICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTiBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2NyIgPT4gInMiCisKKyMg4bmpICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBET1QgQkVMT1cgQU5EIERPVCBBQk9WRV0KKyJcdTFFNjkiID0+ICJzIgorCisjIOG6nCAgW0xBVElOIFNNQUxMIExFVFRFUiBMT05HIFMgV0lUSCBESUFHT05BTCBTVFJPS0VdCisiXHUxRTlDIiA9PiAicyIKKworIyDhup0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTIFdJVEggSElHSCBTVFJPS0VdCisiXHUxRTlEIiA9PiAicyIKKworIyDik6IgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBTXQorIlx1MjRFMiIgPT4gInMiCisKKyMg6p6EICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSU5TVUxBUiBTXQorIlx1QTc4NCIgPT4gInMiCisKKyMg772TICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBTXQorIlx1RkY1MyIgPT4gInMiCisKKyMg4bqeICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgU0hBUlAgU10KKyJcdTFFOUUiID0+ICJTUyIKKworIyDikq4gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBTXQorIlx1MjRBRSIgPT4gIihzKSIKKworIyDDnyAgW0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTXQorIlx1MDBERiIgPT4gInNzIgorCisjIO+shiAgW0xBVElOIFNNQUxMIExJR0FUVVJFIFNUXQorIlx1RkIwNiIgPT4gInN0IgorCisjIMWiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENFRElMTEFdCisiXHUwMTYyIiA9PiAiVCIKKworIyDFpCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTl0KKyJcdTAxNjQiID0+ICJUIgorCisjIMWmICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIFNUUk9LRV0KKyJcdTAxNjYiID0+ICJUIgorCisjIMasICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIEhPT0tdCisiXHUwMUFDIiA9PiAiVCIKKworIyDGriAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTAxQUUiID0+ICJUIgorCisjIMiaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxQSIgPT4gIlQiCisKKyMgyL4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1MDIzRSIgPT4gIlQiCisKKyMg4bSbICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgVF0KKyJcdTFEMUIiID0+ICJUIgorCisjIOG5qiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkVdCisiXHUxRTZBIiA9PiAiVCIKKworIyDhuawgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRE9UIEJFTE9XXQorIlx1MUU2QyIgPT4gIlQiCisKKyMg4bmuICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTZFIiA9PiAiVCIKKworIyDhubAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNzAiID0+ICJUIgorCisjIOKTiSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVF0KKyJcdTI0QzkiID0+ICJUIgorCisjIOqehiAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgVF0KKyJcdUE3ODYiID0+ICJUIgorCisjIO+8tCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBUXQorIlx1RkYzNCIgPT4gIlQiCisKKyMgxaMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEFdCisiXHUwMTYzIiA9PiAidCIKKworIyDFpSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST05dCisiXHUwMTY1IiA9PiAidCIKKworIyDFpyAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggU1RST0tFXQorIlx1MDE2NyIgPT4gInQiCisKKyMgxqsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTAxQUIiID0+ICJ0IgorCisjIMatICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBIT09LXQorIlx1MDFBRCIgPT4gInQiCisKKyMgyJsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxQiIgPT4gInQiCisKKyMgyLYgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENVUkxdCisiXHUwMjM2IiA9PiAidCIKKworIyDKhyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgVF0KKyJcdTAyODciID0+ICJ0IgorCisjIMqIICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTAyODgiID0+ICJ0IgorCisjIOG1tSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ3NSIgPT4gInQiCisKKyMg4bmrICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkVdCisiXHUxRTZCIiA9PiAidCIKKworIyDhua0gIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIERPVCBCRUxPV10KKyJcdTFFNkQiID0+ICJ0IgorCisjIOG5ryAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggTElORSBCRUxPV10KKyJcdTFFNkYiID0+ICJ0IgorCisjIOG5sSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNzEiID0+ICJ0IgorCisjIOG6lyAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRElBRVJFU0lTXQorIlx1MUU5NyIgPT4gInQiCisKKyMg4pOjICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgVF0KKyJcdTI0RTMiID0+ICJ0IgorCisjIOKxpiAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1MkM2NiIgPT4gInQiCisKKyMg772UICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBUXQorIlx1RkY1NCIgPT4gInQiCisKKyMgw54gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STl0KKyJcdTAwREUiID0+ICJUSCIKKworIyDqnaYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiBXSVRIIFNUUk9LRSBUSFJPVUdIIERFU0NFTkRFUl0KKyJcdUE3NjYiID0+ICJUSCIKKworIyDqnKggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUWl0KKyJcdUE3MjgiID0+ICJUWiIKKworIyDikq8gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBUXQorIlx1MjRBRiIgPT4gIih0KSIKKworIyDKqCAgW0xBVElOIFNNQUxMIExFVFRFUiBUQyBESUdSQVBIIFdJVEggQ1VSTF0KKyJcdTAyQTgiID0+ICJ0YyIKKworIyDDviAgW0xBVElOIFNNQUxMIExFVFRFUiBUSE9STl0KKyJcdTAwRkUiID0+ICJ0aCIKKworIyDhtbogIFtMQVRJTiBTTUFMTCBMRVRURVIgVEggV0lUSCBTVFJJS0VUSFJPVUdIXQorIlx1MUQ3QSIgPT4gInRoIgorCisjIOqdpyAgW0xBVElOIFNNQUxMIExFVFRFUiBUSE9STiBXSVRIIFNUUk9LRSBUSFJPVUdIIERFU0NFTkRFUl0KKyJcdUE3NjciID0+ICJ0aCIKKworIyDKpiAgW0xBVElOIFNNQUxMIExFVFRFUiBUUyBESUdSQVBIXQorIlx1MDJBNiIgPT4gInRzIgorCisjIOqcqSAgW0xBVElOIFNNQUxMIExFVFRFUiBUWl0KKyJcdUE3MjkiID0+ICJ0eiIKKworIyDDmSAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRV0KKyJcdTAwRDkiID0+ICJVIgorCisjIMOaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFXQorIlx1MDBEQSIgPT4gIlUiCisKKyMgw5sgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAwREIiID0+ICJVIgorCisjIMOcICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJU10KKyJcdTAwREMiID0+ICJVIgorCisjIMWoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFRJTERFXQorIlx1MDE2OCIgPT4gIlUiCisKKyMgxaogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OXQorIlx1MDE2QSIgPT4gIlUiCisKKyMgxawgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQlJFVkVdCisiXHUwMTZDIiA9PiAiVSIKKworIyDFriAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFXQorIlx1MDE2RSIgPT4gIlUiCisKKyMgxbAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFXQorIlx1MDE3MCIgPT4gIlUiCisKKyMgxbIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLXQorIlx1MDE3MiIgPT4gIlUiCisKKyMgxq8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STl0KKyJcdTAxQUYiID0+ICJVIgorCisjIMeTICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENBUk9OXQorIlx1MDFEMyIgPT4gIlUiCisKKyMgx5UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dCisiXHUwMUQ1IiA9PiAiVSIKKworIyDHlyAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQU5EIEFDVVRFXQorIlx1MDFENyIgPT4gIlUiCisKKyMgx5kgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBDQVJPTl0KKyJcdTAxRDkiID0+ICJVIgorCisjIMebICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyBBTkQgR1JBVkVdCisiXHUwMURCIiA9PiAiVSIKKworIyDIlCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgR1JBVkVdCisiXHUwMjE0IiA9PiAiVSIKKworIyDIliAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMTYiID0+ICJVIgorCisjIMmEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBCQVJdCisiXHUwMjQ0IiA9PiAiVSIKKworIyDhtJwgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBVXQorIlx1MUQxQyIgPT4gIlUiCisKKyMg4bW+ICBbTEFUSU4gU01BTEwgQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFNUUk9LRV0KKyJcdTFEN0UiID0+ICJVIgorCisjIOG5siAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQkVMT1ddCisiXHUxRTcyIiA9PiAiVSIKKworIyDhubQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTc0IiA9PiAiVSIKKworIyDhubYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNzYiID0+ICJVIgorCisjIOG5uCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBUSUxERSBBTkQgQUNVVEVdCisiXHUxRTc4IiA9PiAiVSIKKworIyDhubogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OIEFORCBESUFFUkVTSVNdCisiXHUxRTdBIiA9PiAiVSIKKworIyDhu6QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9UIEJFTE9XXQorIlx1MUVFNCIgPT4gIlUiCisKKyMg4bumICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUU2IiA9PiAiVSIKKworIyDhu6ggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgQUNVVEVdCisiXHUxRUU4IiA9PiAiVSIKKworIyDhu6ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgR1JBVkVdCisiXHUxRUVBIiA9PiAiVSIKKworIyDhu6wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFRUMiID0+ICJVIgorCisjIOG7riAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBUSUxERV0KKyJcdTFFRUUiID0+ICJVIgorCisjIOG7sCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1ddCisiXHUxRUYwIiA9PiAiVSIKKworIyDik4ogIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIFVdCisiXHUyNENBIiA9PiAiVSIKKworIyDvvLUgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVV0KKyJcdUZGMzUiID0+ICJVIgorCisjIMO5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRV0KKyJcdTAwRjkiID0+ICJ1IgorCisjIMO6ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURV0KKyJcdTAwRkEiID0+ICJ1IgorCisjIMO7ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDBGQiIgPT4gInUiCisKKyMgw7wgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJU10KKyJcdTAwRkMiID0+ICJ1IgorCisjIMWpICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERV0KKyJcdTAxNjkiID0+ICJ1IgorCisjIMWrICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST05dCisiXHUwMTZCIiA9PiAidSIKKworIyDFrSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQlJFVkVdCisiXHUwMTZEIiA9PiAidSIKKworIyDFryAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRV0KKyJcdTAxNkYiID0+ICJ1IgorCisjIMWxICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEVdCisiXHUwMTcxIiA9PiAidSIKKworIyDFsyAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLXQorIlx1MDE3MyIgPT4gInUiCisKKyMgxrAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk5dCisiXHUwMUIwIiA9PiAidSIKKworIyDHlCAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0FST05dCisiXHUwMUQ0IiA9PiAidSIKKworIyDHliAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dCisiXHUwMUQ2IiA9PiAidSIKKworIyDHmCAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBBQ1VURV0KKyJcdTAxRDgiID0+ICJ1IgorCisjIMeaICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQU5EIENBUk9OXQorIlx1MDFEQSIgPT4gInUiCisKKyMgx5wgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyBBTkQgR1JBVkVdCisiXHUwMURDIiA9PiAidSIKKworIyDIlSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIxNSIgPT4gInUiCisKKyMgyJcgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIxNyIgPT4gInUiCisKKyMgyokgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBCQVJdCisiXHUwMjg5IiA9PiAidSIKKworIyDhtaQgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFVdCisiXHUxRDY0IiA9PiAidSIKKworIyDhtpkgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MUQ5OSIgPT4gInUiCisKKyMg4bmzICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQkVMT1ddCisiXHUxRTczIiA9PiAidSIKKworIyDhubUgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFRJTERFIEJFTE9XXQorIlx1MUU3NSIgPT4gInUiCisKKyMg4bm3ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYIEJFTE9XXQorIlx1MUU3NyIgPT4gInUiCisKKyMg4bm5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERSBBTkQgQUNVVEVdCisiXHUxRTc5IiA9PiAidSIKKworIyDhubsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTiBBTkQgRElBRVJFU0lTXQorIlx1MUU3QiIgPT4gInUiCisKKyMg4bulICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1QgQkVMT1ddCisiXHUxRUU1IiA9PiAidSIKKworIyDhu6cgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUU3IiA9PiAidSIKKworIyDhu6kgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEFDVVRFXQorIlx1MUVFOSIgPT4gInUiCisKKyMg4burICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBHUkFWRV0KKyJcdTFFRUIiID0+ICJ1IgorCisjIOG7rSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFRUQiID0+ICJ1IgorCisjIOG7ryAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgVElMREVdCisiXHUxRUVGIiA9PiAidSIKKworIyDhu7EgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIERPVCBCRUxPV10KKyJcdTFFRjEiID0+ICJ1IgorCisjIOKTpCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFVdCisiXHUyNEU0IiA9PiAidSIKKworIyDvvZUgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFVdCisiXHVGRjU1IiA9PiAidSIKKworIyDikrAgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBVXQorIlx1MjRCMCIgPT4gIih1KSIKKworIyDhtasgIFtMQVRJTiBTTUFMTCBMRVRURVIgVUVdCisiXHUxRDZCIiA9PiAidWUiCisKKyMgxrIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBWIFdJVEggSE9PS10KKyJcdTAxQjIiID0+ICJWIgorCisjIMmFICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIFZdCisiXHUwMjQ1IiA9PiAiViIKKworIyDhtKAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBWXQorIlx1MUQyMCIgPT4gIlYiCisKKyMg4bm8ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIFRJTERFXQorIlx1MUU3QyIgPT4gIlYiCisKKyMg4bm+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIERPVCBCRUxPV10KKyJcdTFFN0UiID0+ICJWIgorCisjIOG7vCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE1JRERMRS1XRUxTSCBWXQorIlx1MUVGQyIgPT4gIlYiCisKKyMg4pOLICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBWXQorIlx1MjRDQiIgPT4gIlYiCisKKyMg6p2eICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NUUiID0+ICJWIgorCisjIOqdqCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZFTkRdCisiXHVBNzY4IiA9PiAiViIKKworIyDvvLYgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVl0KKyJcdUZGMzYiID0+ICJWIgorCisjIMqLICBbTEFUSU4gU01BTEwgTEVUVEVSIFYgV0lUSCBIT09LXQorIlx1MDI4QiIgPT4gInYiCisKKyMgyowgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIFZdCisiXHUwMjhDIiA9PiAidiIKKworIyDhtaUgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFZdCisiXHUxRDY1IiA9PiAidiIKKworIyDhtowgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEOEMiID0+ICJ2IgorCisjIOG5vSAgW0xBVElOIFNNQUxMIExFVFRFUiBWIFdJVEggVElMREVdCisiXHUxRTdEIiA9PiAidiIKKworIyDhub8gIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIERPVCBCRUxPV10KKyJcdTFFN0YiID0+ICJ2IgorCisjIOKTpSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFZdCisiXHUyNEU1IiA9PiAidiIKKworIyDisbEgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIFJJR0hUIEhPT0tdCisiXHUyQzcxIiA9PiAidiIKKworIyDisbQgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIENVUkxdCisiXHUyQzc0IiA9PiAidiIKKworIyDqnZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NUYiID0+ICJ2IgorCisjIO+9liAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgVl0KKyJcdUZGNTYiID0+ICJ2IgorCisjIOqdoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZZXQorIlx1QTc2MCIgPT4gIlZZIgorCisjIOKSsSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFZdCisiXHUyNEIxIiA9PiAiKHYpIgorCisjIOqdoSAgW0xBVElOIFNNQUxMIExFVFRFUiBWWV0KKyJcdUE3NjEiID0+ICJ2eSIKKworIyDFtCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDE3NCIgPT4gIlciCisKKyMgx7cgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV3lubiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFdZTk5dCisiXHUwMUY3IiA9PiAiVyIKKworIyDhtKEgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBXXQorIlx1MUQyMSIgPT4gIlciCisKKyMg4bqAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEdSQVZFXQorIlx1MUU4MCIgPT4gIlciCisKKyMg4bqCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEFDVVRFXQorIlx1MUU4MiIgPT4gIlciCisKKyMg4bqEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJU10KKyJcdTFFODQiID0+ICJXIgorCisjIOG6hiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBET1QgQUJPVkVdCisiXHUxRTg2IiA9PiAiVyIKKworIyDhuoggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggRE9UIEJFTE9XXQorIlx1MUU4OCIgPT4gIlciCisKKyMg4pOMICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBXXQorIlx1MjRDQyIgPT4gIlciCisKKyMg4rGyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEhPT0tdCisiXHUyQzcyIiA9PiAiVyIKKworIyDvvLcgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgV10KKyJcdUZGMzciID0+ICJXIgorCisjIMW1ICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDE3NSIgPT4gInciCisKKyMgxr8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV3lubiAgW0xBVElOIExFVFRFUiBXWU5OXQorIlx1MDFCRiIgPT4gInciCisKKyMgyo0gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIFddCisiXHUwMjhEIiA9PiAidyIKKworIyDhuoEgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEdSQVZFXQorIlx1MUU4MSIgPT4gInciCisKKyMg4bqDICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBBQ1VURV0KKyJcdTFFODMiID0+ICJ3IgorCisjIOG6hSAgW0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTXQorIlx1MUU4NSIgPT4gInciCisKKyMg4bqHICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBET1QgQUJPVkVdCisiXHUxRTg3IiA9PiAidyIKKworIyDhuokgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIERPVCBCRUxPV10KKyJcdTFFODkiID0+ICJ3IgorCisjIOG6mCAgW0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggUklORyBBQk9WRV0KKyJcdTFFOTgiID0+ICJ3IgorCisjIOKTpiAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFddCisiXHUyNEU2IiA9PiAidyIKKworIyDisbMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEhPT0tdCisiXHUyQzczIiA9PiAidyIKKworIyDvvZcgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFddCisiXHVGRjU3IiA9PiAidyIKKworIyDikrIgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBXXQorIlx1MjRCMiIgPT4gIih3KSIKKworIyDhuoogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBYIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU4QSIgPT4gIlgiCisKKyMg4bqMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCBXSVRIIERJQUVSRVNJU10KKyJcdTFFOEMiID0+ICJYIgorCisjIOKTjSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWF0KKyJcdTI0Q0QiID0+ICJYIgorCisjIO+8uCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBYXQorIlx1RkYzOCIgPT4gIlgiCisKKyMg4baNICBbTEFUSU4gU01BTEwgTEVUVEVSIFggV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDhEIiA9PiAieCIKKworIyDhuosgIFtMQVRJTiBTTUFMTCBMRVRURVIgWCBXSVRIIERPVCBBQk9WRV0KKyJcdTFFOEIiID0+ICJ4IgorCisjIOG6jSAgW0xBVElOIFNNQUxMIExFVFRFUiBYIFdJVEggRElBRVJFU0lTXQorIlx1MUU4RCIgPT4gIngiCisKKyMg4oKTICBbTEFUSU4gU1VCU0NSSVBUIFNNQUxMIExFVFRFUiBYXQorIlx1MjA5MyIgPT4gIngiCisKKyMg4pOnICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgWF0KKyJcdTI0RTciID0+ICJ4IgorCisjIO+9mCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgWF0KKyJcdUZGNTgiID0+ICJ4IgorCisjIOKSsyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFhdCisiXHUyNEIzIiA9PiAiKHgpIgorCisjIMOdICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFXQorIlx1MDBERCIgPT4gIlkiCisKKyMgxbYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxNzYiID0+ICJZIgorCisjIMW4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJU10KKyJcdTAxNzgiID0+ICJZIgorCisjIMazICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEhPT0tdCisiXHUwMUIzIiA9PiAiWSIKKworIyDIsiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBNQUNST05dCisiXHUwMjMyIiA9PiAiWSIKKworIyDJjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBTVFJPS0VdCisiXHUwMjRFIiA9PiAiWSIKKworIyDKjyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFldCisiXHUwMjhGIiA9PiAiWSIKKworIyDhuo4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU4RSIgPT4gIlkiCisKKyMg4buyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEdSQVZFXQorIlx1MUVGMiIgPT4gIlkiCisKKyMg4bu0ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPV10KKyJcdTFFRjQiID0+ICJZIgorCisjIOG7tiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVGNiIgPT4gIlkiCisKKyMg4bu4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIFRJTERFXQorIlx1MUVGOCIgPT4gIlkiCisKKyMg4bu+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIExPT1BdCisiXHUxRUZFIiA9PiAiWSIKKworIyDik44gIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIFldCisiXHUyNENFIiA9PiAiWSIKKworIyDvvLkgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWV0KKyJcdUZGMzkiID0+ICJZIgorCisjIMO9ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURV0KKyJcdTAwRkQiID0+ICJ5IgorCisjIMO/ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVNdCisiXHUwMEZGIiA9PiAieSIKKworIyDFtyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxNzciID0+ICJ5IgorCisjIMa0ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LXQorIlx1MDFCNCIgPT4gInkiCisKKyMgyLMgIFtMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIE1BQ1JPTl0KKyJcdTAyMzMiID0+ICJ5IgorCisjIMmPICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBTVFJPS0VdCisiXHUwMjRGIiA9PiAieSIKKworIyDKjiAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgWV0KKyJcdTAyOEUiID0+ICJ5IgorCisjIOG6jyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU4RiIgPT4gInkiCisKKyMg4bqZICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBSSU5HIEFCT1ZFXQorIlx1MUU5OSIgPT4gInkiCisKKyMg4buzICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRV0KKyJcdTFFRjMiID0+ICJ5IgorCisjIOG7tSAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRE9UIEJFTE9XXQorIlx1MUVGNSIgPT4gInkiCisKKyMg4bu3ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVGNyIgPT4gInkiCisKKyMg4bu5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBUSUxERV0KKyJcdTFFRjkiID0+ICJ5IgorCisjIOG7vyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggTE9PUF0KKyJcdTFFRkYiID0+ICJ5IgorCisjIOKTqCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFldCisiXHUyNEU4IiA9PiAieSIKKworIyDvvZkgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFldCisiXHVGRjU5IiA9PiAieSIKKworIyDikrQgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBZXQorIlx1MjRCNCIgPT4gIih5KSIKKworIyDFuSAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURV0KKyJcdTAxNzkiID0+ICJaIgorCisjIMW7ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRV0KKyJcdTAxN0IiID0+ICJaIgorCisjIMW9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OXQorIlx1MDE3RCIgPT4gIloiCisKKyMgxrUgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggU1RST0tFXQorIlx1MDFCNSIgPT4gIloiCisKKyMgyJwgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWW9naCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFlPR0hdCisiXHUwMjFDIiA9PiAiWiIKKworIyDIpCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBIT09LXQorIlx1MDIyNCIgPT4gIloiCisKKyMg4bSiICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgWl0KKyJcdTFEMjIiID0+ICJaIgorCisjIOG6kCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDSVJDVU1GTEVYXQorIlx1MUU5MCIgPT4gIloiCisKKyMg4bqSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBCRUxPV10KKyJcdTFFOTIiID0+ICJaIgorCisjIOG6lCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBMSU5FIEJFTE9XXQorIlx1MUU5NCIgPT4gIloiCisKKyMg4pOPICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaXQorIlx1MjRDRiIgPT4gIloiCisKKyMg4rGrICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERFU0NFTkRFUl0KKyJcdTJDNkIiID0+ICJaIgorCisjIOqdoiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZJU0lHT1RISUMgWl0KKyJcdUE3NjIiID0+ICJaIgorCisjIO+8uiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaXQorIlx1RkYzQSIgPT4gIloiCisKKyMgxbogIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFXQorIlx1MDE3QSIgPT4gInoiCisKKyMgxbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRV0KKyJcdTAxN0MiID0+ICJ6IgorCisjIMW+ICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTl0KKyJcdTAxN0UiID0+ICJ6IgorCisjIMa2ICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTVFJPS0VdCisiXHUwMUI2IiA9PiAieiIKKworIyDInSAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Zb2doICBbTEFUSU4gU01BTEwgTEVUVEVSIFlPR0hdCisiXHUwMjFEIiA9PiAieiIKKworIyDIpSAgW0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggSE9PS10KKyJcdTAyMjUiID0+ICJ6IgorCisjIMmAICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTV0FTSCBUQUlMXQorIlx1MDI0MCIgPT4gInoiCisKKyMgypAgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MDI5MCIgPT4gInoiCisKKyMgypEgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENVUkxdCisiXHUwMjkxIiA9PiAieiIKKworIyDhtbYgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTFENzYiID0+ICJ6IgorCisjIOG2jiAgW0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggUEFMQVRBTCBIT09LXQorIlx1MUQ4RSIgPT4gInoiCisKKyMg4bqRICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDSVJDVU1GTEVYXQorIlx1MUU5MSIgPT4gInoiCisKKyMg4bqTICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQkVMT1ddCisiXHUxRTkzIiA9PiAieiIKKworIyDhupUgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTk1IiA9PiAieiIKKworIyDik6kgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBaXQorIlx1MjRFOSIgPT4gInoiCisKKyMg4rGsICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBERVNDRU5ERVJdCisiXHUyQzZDIiA9PiAieiIKKworIyDqnaMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVklTSUdPVEhJQyBaXQorIlx1QTc2MyIgPT4gInoiCisKKyMg772aICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBaXQorIlx1RkY1QSIgPT4gInoiCisKKyMg4pK1ICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgWl0KKyJcdTI0QjUiID0+ICIoeikiCisKKyMg4oGwICBbU1VQRVJTQ1JJUFQgWkVST10KKyJcdTIwNzAiID0+ICIwIgorCisjIOKCgCAgW1NVQlNDUklQVCBaRVJPXQorIlx1MjA4MCIgPT4gIjAiCisKKyMg4pOqICBbQ0lSQ0xFRCBESUdJVCBaRVJPXQorIlx1MjRFQSIgPT4gIjAiCisKKyMg4pO/ICBbTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBaRVJPXQorIlx1MjRGRiIgPT4gIjAiCisKKyMg77yQICBbRlVMTFdJRFRIIERJR0lUIFpFUk9dCisiXHVGRjEwIiA9PiAiMCIKKworIyDCuSAgW1NVUEVSU0NSSVBUIE9ORV0KKyJcdTAwQjkiID0+ICIxIgorCisjIOKCgSAgW1NVQlNDUklQVCBPTkVdCisiXHUyMDgxIiA9PiAiMSIKKworIyDikaAgIFtDSVJDTEVEIERJR0lUIE9ORV0KKyJcdTI0NjAiID0+ICIxIgorCisjIOKTtSAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIE9ORV0KKyJcdTI0RjUiID0+ICIxIgorCisjIOKdtiAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBPTkVdCisiXHUyNzc2IiA9PiAiMSIKKworIyDinoAgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBPTkVdCisiXHUyNzgwIiA9PiAiMSIKKworIyDinoogIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBPTkVdCisiXHUyNzhBIiA9PiAiMSIKKworIyDvvJEgIFtGVUxMV0lEVEggRElHSVQgT05FXQorIlx1RkYxMSIgPT4gIjEiCisKKyMg4pKIICBbRElHSVQgT05FIEZVTEwgU1RPUF0KKyJcdTI0ODgiID0+ICIxLiIKKworIyDikbQgIFtQQVJFTlRIRVNJWkVEIERJR0lUIE9ORV0KKyJcdTI0NzQiID0+ICIoMSkiCisKKyMgwrIgIFtTVVBFUlNDUklQVCBUV09dCisiXHUwMEIyIiA9PiAiMiIKKworIyDigoIgIFtTVUJTQ1JJUFQgVFdPXQorIlx1MjA4MiIgPT4gIjIiCisKKyMg4pGhICBbQ0lSQ0xFRCBESUdJVCBUV09dCisiXHUyNDYxIiA9PiAiMiIKKworIyDik7YgIFtET1VCTEUgQ0lSQ0xFRCBESUdJVCBUV09dCisiXHUyNEY2IiA9PiAiMiIKKworIyDinbcgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgVFdPXQorIlx1Mjc3NyIgPT4gIjIiCisKKyMg4p6BICBbRElOR0JBVCBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgVFdPXQorIlx1Mjc4MSIgPT4gIjIiCisKKyMg4p6LICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgVFdPXQorIlx1Mjc4QiIgPT4gIjIiCisKKyMg77ySICBbRlVMTFdJRFRIIERJR0lUIFRXT10KKyJcdUZGMTIiID0+ICIyIgorCisjIOKSiSAgW0RJR0lUIFRXTyBGVUxMIFNUT1BdCisiXHUyNDg5IiA9PiAiMi4iCisKKyMg4pG1ICBbUEFSRU5USEVTSVpFRCBESUdJVCBUV09dCisiXHUyNDc1IiA9PiAiKDIpIgorCisjIMKzICBbU1VQRVJTQ1JJUFQgVEhSRUVdCisiXHUwMEIzIiA9PiAiMyIKKworIyDigoMgIFtTVUJTQ1JJUFQgVEhSRUVdCisiXHUyMDgzIiA9PiAiMyIKKworIyDikaIgIFtDSVJDTEVEIERJR0lUIFRIUkVFXQorIlx1MjQ2MiIgPT4gIjMiCisKKyMg4pO3ICBbRE9VQkxFIENJUkNMRUQgRElHSVQgVEhSRUVdCisiXHUyNEY3IiA9PiAiMyIKKworIyDinbggIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgVEhSRUVdCisiXHUyNzc4IiA9PiAiMyIKKworIyDinoIgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBUSFJFRV0KKyJcdTI3ODIiID0+ICIzIgorCisjIOKejCAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIFRIUkVFXQorIlx1Mjc4QyIgPT4gIjMiCisKKyMg77yTICBbRlVMTFdJRFRIIERJR0lUIFRIUkVFXQorIlx1RkYxMyIgPT4gIjMiCisKKyMg4pKKICBbRElHSVQgVEhSRUUgRlVMTCBTVE9QXQorIlx1MjQ4QSIgPT4gIjMuIgorCisjIOKRtiAgW1BBUkVOVEhFU0laRUQgRElHSVQgVEhSRUVdCisiXHUyNDc2IiA9PiAiKDMpIgorCisjIOKBtCAgW1NVUEVSU0NSSVBUIEZPVVJdCisiXHUyMDc0IiA9PiAiNCIKKworIyDigoQgIFtTVUJTQ1JJUFQgRk9VUl0KKyJcdTIwODQiID0+ICI0IgorCisjIOKRoyAgW0NJUkNMRUQgRElHSVQgRk9VUl0KKyJcdTI0NjMiID0+ICI0IgorCisjIOKTuCAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEZPVVJdCisiXHUyNEY4IiA9PiAiNCIKKworIyDinbkgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgRk9VUl0KKyJcdTI3NzkiID0+ICI0IgorCisjIOKegyAgW0RJTkdCQVQgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIEZPVVJdCisiXHUyNzgzIiA9PiAiNCIKKworIyDino0gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBGT1VSXQorIlx1Mjc4RCIgPT4gIjQiCisKKyMg77yUICBbRlVMTFdJRFRIIERJR0lUIEZPVVJdCisiXHVGRjE0IiA9PiAiNCIKKworIyDikosgIFtESUdJVCBGT1VSIEZVTEwgU1RPUF0KKyJcdTI0OEIiID0+ICI0LiIKKworIyDikbcgIFtQQVJFTlRIRVNJWkVEIERJR0lUIEZPVVJdCisiXHUyNDc3IiA9PiAiKDQpIgorCisjIOKBtSAgW1NVUEVSU0NSSVBUIEZJVkVdCisiXHUyMDc1IiA9PiAiNSIKKworIyDigoUgIFtTVUJTQ1JJUFQgRklWRV0KKyJcdTIwODUiID0+ICI1IgorCisjIOKRpCAgW0NJUkNMRUQgRElHSVQgRklWRV0KKyJcdTI0NjQiID0+ICI1IgorCisjIOKTuSAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEZJVkVdCisiXHUyNEY5IiA9PiAiNSIKKworIyDinbogIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgRklWRV0KKyJcdTI3N0EiID0+ICI1IgorCisjIOKehCAgW0RJTkdCQVQgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIEZJVkVdCisiXHUyNzg0IiA9PiAiNSIKKworIyDino4gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBGSVZFXQorIlx1Mjc4RSIgPT4gIjUiCisKKyMg77yVICBbRlVMTFdJRFRIIERJR0lUIEZJVkVdCisiXHVGRjE1IiA9PiAiNSIKKworIyDikowgIFtESUdJVCBGSVZFIEZVTEwgU1RPUF0KKyJcdTI0OEMiID0+ICI1LiIKKworIyDikbggIFtQQVJFTlRIRVNJWkVEIERJR0lUIEZJVkVdCisiXHUyNDc4IiA9PiAiKDUpIgorCisjIOKBtiAgW1NVUEVSU0NSSVBUIFNJWF0KKyJcdTIwNzYiID0+ICI2IgorCisjIOKChiAgW1NVQlNDUklQVCBTSVhdCisiXHUyMDg2IiA9PiAiNiIKKworIyDikaUgIFtDSVJDTEVEIERJR0lUIFNJWF0KKyJcdTI0NjUiID0+ICI2IgorCisjIOKTuiAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIFNJWF0KKyJcdTI0RkEiID0+ICI2IgorCisjIOKduyAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBTSVhdCisiXHUyNzdCIiA9PiAiNiIKKworIyDinoUgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTSVhdCisiXHUyNzg1IiA9PiAiNiIKKworIyDino8gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTSVhdCisiXHUyNzhGIiA9PiAiNiIKKworIyDvvJYgIFtGVUxMV0lEVEggRElHSVQgU0lYXQorIlx1RkYxNiIgPT4gIjYiCisKKyMg4pKNICBbRElHSVQgU0lYIEZVTEwgU1RPUF0KKyJcdTI0OEQiID0+ICI2LiIKKworIyDikbkgIFtQQVJFTlRIRVNJWkVEIERJR0lUIFNJWF0KKyJcdTI0NzkiID0+ICIoNikiCisKKyMg4oG3ICBbU1VQRVJTQ1JJUFQgU0VWRU5dCisiXHUyMDc3IiA9PiAiNyIKKworIyDigocgIFtTVUJTQ1JJUFQgU0VWRU5dCisiXHUyMDg3IiA9PiAiNyIKKworIyDikaYgIFtDSVJDTEVEIERJR0lUIFNFVkVOXQorIlx1MjQ2NiIgPT4gIjciCisKKyMg4pO7ICBbRE9VQkxFIENJUkNMRUQgRElHSVQgU0VWRU5dCisiXHUyNEZCIiA9PiAiNyIKKworIyDinbwgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgU0VWRU5dCisiXHUyNzdDIiA9PiAiNyIKKworIyDinoYgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTRVZFTl0KKyJcdTI3ODYiID0+ICI3IgorCisjIOKekCAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIFNFVkVOXQorIlx1Mjc5MCIgPT4gIjciCisKKyMg77yXICBbRlVMTFdJRFRIIERJR0lUIFNFVkVOXQorIlx1RkYxNyIgPT4gIjciCisKKyMg4pKOICBbRElHSVQgU0VWRU4gRlVMTCBTVE9QXQorIlx1MjQ4RSIgPT4gIjcuIgorCisjIOKRuiAgW1BBUkVOVEhFU0laRUQgRElHSVQgU0VWRU5dCisiXHUyNDdBIiA9PiAiKDcpIgorCisjIOKBuCAgW1NVUEVSU0NSSVBUIEVJR0hUXQorIlx1MjA3OCIgPT4gIjgiCisKKyMg4oKIICBbU1VCU0NSSVBUIEVJR0hUXQorIlx1MjA4OCIgPT4gIjgiCisKKyMg4pGnICBbQ0lSQ0xFRCBESUdJVCBFSUdIVF0KKyJcdTI0NjciID0+ICI4IgorCisjIOKTvCAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEVJR0hUXQorIlx1MjRGQyIgPT4gIjgiCisKKyMg4p29ICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIERJR0lUIEVJR0hUXQorIlx1Mjc3RCIgPT4gIjgiCisKKyMg4p6HICBbRElOR0JBVCBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgRUlHSFRdCisiXHUyNzg3IiA9PiAiOCIKKworIyDinpEgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBFSUdIVF0KKyJcdTI3OTEiID0+ICI4IgorCisjIO+8mCAgW0ZVTExXSURUSCBESUdJVCBFSUdIVF0KKyJcdUZGMTgiID0+ICI4IgorCisjIOKSjyAgW0RJR0lUIEVJR0hUIEZVTEwgU1RPUF0KKyJcdTI0OEYiID0+ICI4LiIKKworIyDikbsgIFtQQVJFTlRIRVNJWkVEIERJR0lUIEVJR0hUXQorIlx1MjQ3QiIgPT4gIig4KSIKKworIyDigbkgIFtTVVBFUlNDUklQVCBOSU5FXQorIlx1MjA3OSIgPT4gIjkiCisKKyMg4oKJICBbU1VCU0NSSVBUIE5JTkVdCisiXHUyMDg5IiA9PiAiOSIKKworIyDikaggIFtDSVJDTEVEIERJR0lUIE5JTkVdCisiXHUyNDY4IiA9PiAiOSIKKworIyDik70gIFtET1VCTEUgQ0lSQ0xFRCBESUdJVCBOSU5FXQorIlx1MjRGRCIgPT4gIjkiCisKKyMg4p2+ICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIERJR0lUIE5JTkVdCisiXHUyNzdFIiA9PiAiOSIKKworIyDinoggIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBOSU5FXQorIlx1Mjc4OCIgPT4gIjkiCisKKyMg4p6SICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgTklORV0KKyJcdTI3OTIiID0+ICI5IgorCisjIO+8mSAgW0ZVTExXSURUSCBESUdJVCBOSU5FXQorIlx1RkYxOSIgPT4gIjkiCisKKyMg4pKQICBbRElHSVQgTklORSBGVUxMIFNUT1BdCisiXHUyNDkwIiA9PiAiOS4iCisKKyMg4pG8ICBbUEFSRU5USEVTSVpFRCBESUdJVCBOSU5FXQorIlx1MjQ3QyIgPT4gIig5KSIKKworIyDikakgIFtDSVJDTEVEIE5VTUJFUiBURU5dCisiXHUyNDY5IiA9PiAiMTAiCisKKyMg4pO+ICBbRE9VQkxFIENJUkNMRUQgTlVNQkVSIFRFTl0KKyJcdTI0RkUiID0+ICIxMCIKKworIyDinb8gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgTlVNQkVSIFRFTl0KKyJcdTI3N0YiID0+ICIxMCIKKworIyDinokgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBOVU1CRVIgVEVOXQorIlx1Mjc4OSIgPT4gIjEwIgorCisjIOKekyAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIE5VTUJFUiBURU5dCisiXHUyNzkzIiA9PiAiMTAiCisKKyMg4pKRICBbTlVNQkVSIFRFTiBGVUxMIFNUT1BdCisiXHUyNDkxIiA9PiAiMTAuIgorCisjIOKRvSAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRFTl0KKyJcdTI0N0QiID0+ICIoMTApIgorCisjIOKRqiAgW0NJUkNMRUQgTlVNQkVSIEVMRVZFTl0KKyJcdTI0NkEiID0+ICIxMSIKKworIyDik6sgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBFTEVWRU5dCisiXHUyNEVCIiA9PiAiMTEiCisKKyMg4pKSICBbTlVNQkVSIEVMRVZFTiBGVUxMIFNUT1BdCisiXHUyNDkyIiA9PiAiMTEuIgorCisjIOKRviAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIEVMRVZFTl0KKyJcdTI0N0UiID0+ICIoMTEpIgorCisjIOKRqyAgW0NJUkNMRUQgTlVNQkVSIFRXRUxWRV0KKyJcdTI0NkIiID0+ICIxMiIKKworIyDik6wgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBUV0VMVkVdCisiXHUyNEVDIiA9PiAiMTIiCisKKyMg4pKTICBbTlVNQkVSIFRXRUxWRSBGVUxMIFNUT1BdCisiXHUyNDkzIiA9PiAiMTIuIgorCisjIOKRvyAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRXRUxWRV0KKyJcdTI0N0YiID0+ICIoMTIpIgorCisjIOKRrCAgW0NJUkNMRUQgTlVNQkVSIFRISVJURUVOXQorIlx1MjQ2QyIgPT4gIjEzIgorCisjIOKTrSAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIFRISVJURUVOXQorIlx1MjRFRCIgPT4gIjEzIgorCisjIOKSlCAgW05VTUJFUiBUSElSVEVFTiBGVUxMIFNUT1BdCisiXHUyNDk0IiA9PiAiMTMuIgorCisjIOKSgCAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRISVJURUVOXQorIlx1MjQ4MCIgPT4gIigxMykiCisKKyMg4pGtICBbQ0lSQ0xFRCBOVU1CRVIgRk9VUlRFRU5dCisiXHUyNDZEIiA9PiAiMTQiCisKKyMg4pOuICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgRk9VUlRFRU5dCisiXHUyNEVFIiA9PiAiMTQiCisKKyMg4pKVICBbTlVNQkVSIEZPVVJURUVOIEZVTEwgU1RPUF0KKyJcdTI0OTUiID0+ICIxNC4iCisKKyMg4pKBICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgRk9VUlRFRU5dCisiXHUyNDgxIiA9PiAiKDE0KSIKKworIyDika4gIFtDSVJDTEVEIE5VTUJFUiBGSUZURUVOXQorIlx1MjQ2RSIgPT4gIjE1IgorCisjIOKTryAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIEZJRlRFRU5dCisiXHUyNEVGIiA9PiAiMTUiCisKKyMg4pKWICBbTlVNQkVSIEZJRlRFRU4gRlVMTCBTVE9QXQorIlx1MjQ5NiIgPT4gIjE1LiIKKworIyDikoIgIFtQQVJFTlRIRVNJWkVEIE5VTUJFUiBGSUZURUVOXQorIlx1MjQ4MiIgPT4gIigxNSkiCisKKyMg4pGvICBbQ0lSQ0xFRCBOVU1CRVIgU0lYVEVFTl0KKyJcdTI0NkYiID0+ICIxNiIKKworIyDik7AgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBTSVhURUVOXQorIlx1MjRGMCIgPT4gIjE2IgorCisjIOKSlyAgW05VTUJFUiBTSVhURUVOIEZVTEwgU1RPUF0KKyJcdTI0OTciID0+ICIxNi4iCisKKyMg4pKDICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgU0lYVEVFTl0KKyJcdTI0ODMiID0+ICIoMTYpIgorCisjIOKRsCAgW0NJUkNMRUQgTlVNQkVSIFNFVkVOVEVFTl0KKyJcdTI0NzAiID0+ICIxNyIKKworIyDik7EgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBTRVZFTlRFRU5dCisiXHUyNEYxIiA9PiAiMTciCisKKyMg4pKYICBbTlVNQkVSIFNFVkVOVEVFTiBGVUxMIFNUT1BdCisiXHUyNDk4IiA9PiAiMTcuIgorCisjIOKShCAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFNFVkVOVEVFTl0KKyJcdTI0ODQiID0+ICIoMTcpIgorCisjIOKRsSAgW0NJUkNMRUQgTlVNQkVSIEVJR0hURUVOXQorIlx1MjQ3MSIgPT4gIjE4IgorCisjIOKTsiAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIEVJR0hURUVOXQorIlx1MjRGMiIgPT4gIjE4IgorCisjIOKSmSAgW05VTUJFUiBFSUdIVEVFTiBGVUxMIFNUT1BdCisiXHUyNDk5IiA9PiAiMTguIgorCisjIOKShSAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIEVJR0hURUVOXQorIlx1MjQ4NSIgPT4gIigxOCkiCisKKyMg4pGyICBbQ0lSQ0xFRCBOVU1CRVIgTklORVRFRU5dCisiXHUyNDcyIiA9PiAiMTkiCisKKyMg4pOzICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgTklORVRFRU5dCisiXHUyNEYzIiA9PiAiMTkiCisKKyMg4pKaICBbTlVNQkVSIE5JTkVURUVOIEZVTEwgU1RPUF0KKyJcdTI0OUEiID0+ICIxOS4iCisKKyMg4pKGICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgTklORVRFRU5dCisiXHUyNDg2IiA9PiAiKDE5KSIKKworIyDikbMgIFtDSVJDTEVEIE5VTUJFUiBUV0VOVFldCisiXHUyNDczIiA9PiAiMjAiCisKKyMg4pO0ICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgVFdFTlRZXQorIlx1MjRGNCIgPT4gIjIwIgorCisjIOKSmyAgW05VTUJFUiBUV0VOVFkgRlVMTCBTVE9QXQorIlx1MjQ5QiIgPT4gIjIwLiIKKworIyDikocgIFtQQVJFTlRIRVNJWkVEIE5VTUJFUiBUV0VOVFldCisiXHUyNDg3IiA9PiAiKDIwKSIKKworIyDCqyAgW0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLXQorIlx1MDBBQiIgPT4gIlwiIgorCisjIMK7ICBbUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLXQorIlx1MDBCQiIgPT4gIlwiIgorCisjIOKAnCAgW0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLXQorIlx1MjAxQyIgPT4gIlwiIgorCisjIOKAnSAgW1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSS10KKyJcdTIwMUQiID0+ICJcIiIKKworIyDigJ4gIFtET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUktdCisiXHUyMDFFIiA9PiAiXCIiCisKKyMg4oCzICBbRE9VQkxFIFBSSU1FXQorIlx1MjAzMyIgPT4gIlwiIgorCisjIOKAtiAgW1JFVkVSU0VEIERPVUJMRSBQUklNRV0KKyJcdTIwMzYiID0+ICJcIiIKKworIyDinZ0gIFtIRUFWWSBET1VCTEUgVFVSTkVEIENPTU1BIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc1RCIgPT4gIlwiIgorCisjIOKdniAgW0hFQVZZIERPVUJMRSBDT01NQSBRVU9UQVRJT04gTUFSSyBPUk5BTUVOVF0KKyJcdTI3NUUiID0+ICJcIiIKKworIyDina4gIFtIRUFWWSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc2RSIgPT4gIlwiIgorCisjIOKdryAgW0hFQVZZIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc2RiIgPT4gIlwiIgorCisjIO+8giAgW0ZVTExXSURUSCBRVU9UQVRJT04gTUFSS10KKyJcdUZGMDIiID0+ICJcIiIKKworIyDigJggIFtMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSS10KKyJcdTIwMTgiID0+ICJcJyIKKworIyDigJkgIFtSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUktdCisiXHUyMDE5IiA9PiAiXCciCisKKyMg4oCaICBbU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLXQorIlx1MjAxQSIgPT4gIlwnIgorCisjIOKAmyAgW1NJTkdMRSBISUdILVJFVkVSU0VELTkgUVVPVEFUSU9OIE1BUktdCisiXHUyMDFCIiA9PiAiXCciCisKKyMg4oCyICBbUFJJTUVdCisiXHUyMDMyIiA9PiAiXCciCisKKyMg4oC1ICBbUkVWRVJTRUQgUFJJTUVdCisiXHUyMDM1IiA9PiAiXCciCisKKyMg4oC5ICBbU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktdCisiXHUyMDM5IiA9PiAiXCciCisKKyMg4oC6ICBbU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXQorIlx1MjAzQSIgPT4gIlwnIgorCisjIOKdmyAgW0hFQVZZIFNJTkdMRSBUVVJORUQgQ09NTUEgUVVPVEFUSU9OIE1BUksgT1JOQU1FTlRdCisiXHUyNzVCIiA9PiAiXCciCisKKyMg4p2cICBbSEVBVlkgU0lOR0xFIENPTU1BIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc1QyIgPT4gIlwnIgorCisjIO+8hyAgW0ZVTExXSURUSCBBUE9TVFJPUEhFXQorIlx1RkYwNyIgPT4gIlwnIgorCisjIOKAkCAgW0hZUEhFTl0KKyJcdTIwMTAiID0+ICItIgorCisjIOKAkSAgW05PTi1CUkVBS0lORyBIWVBIRU5dCisiXHUyMDExIiA9PiAiLSIKKworIyDigJIgIFtGSUdVUkUgREFTSF0KKyJcdTIwMTIiID0+ICItIgorCisjIOKAkyAgW0VOIERBU0hdCisiXHUyMDEzIiA9PiAiLSIKKworIyDigJQgIFtFTSBEQVNIXQorIlx1MjAxNCIgPT4gIi0iCisKKyMg4oG7ICBbU1VQRVJTQ1JJUFQgTUlOVVNdCisiXHUyMDdCIiA9PiAiLSIKKworIyDigosgIFtTVUJTQ1JJUFQgTUlOVVNdCisiXHUyMDhCIiA9PiAiLSIKKworIyDvvI0gIFtGVUxMV0lEVEggSFlQSEVOLU1JTlVTXQorIlx1RkYwRCIgPT4gIi0iCisKKyMg4oGFICBbTEVGVCBTUVVBUkUgQlJBQ0tFVCBXSVRIIFFVSUxMXQorIlx1MjA0NSIgPT4gIlsiCisKKyMg4p2yICBbTElHSFQgTEVGVCBUT1JUT0lTRSBTSEVMTCBCUkFDS0VUIE9STkFNRU5UXQorIlx1Mjc3MiIgPT4gIlsiCisKKyMg77y7ICBbRlVMTFdJRFRIIExFRlQgU1FVQVJFIEJSQUNLRVRdCisiXHVGRjNCIiA9PiAiWyIKKworIyDigYYgIFtSSUdIVCBTUVVBUkUgQlJBQ0tFVCBXSVRIIFFVSUxMXQorIlx1MjA0NiIgPT4gIl0iCisKKyMg4p2zICBbTElHSFQgUklHSFQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NzMiID0+ICJdIgorCisjIO+8vSAgW0ZVTExXSURUSCBSSUdIVCBTUVVBUkUgQlJBQ0tFVF0KKyJcdUZGM0QiID0+ICJdIgorCisjIOKBvSAgW1NVUEVSU0NSSVBUIExFRlQgUEFSRU5USEVTSVNdCisiXHUyMDdEIiA9PiAiKCIKKworIyDigo0gIFtTVUJTQ1JJUFQgTEVGVCBQQVJFTlRIRVNJU10KKyJcdTIwOEQiID0+ICIoIgorCisjIOKdqCAgW01FRElVTSBMRUZUIFBBUkVOVEhFU0lTIE9STkFNRU5UXQorIlx1Mjc2OCIgPT4gIigiCisKKyMg4p2qICBbTUVESVVNIEZMQVRURU5FRCBMRUZUIFBBUkVOVEhFU0lTIE9STkFNRU5UXQorIlx1Mjc2QSIgPT4gIigiCisKKyMg77yIICBbRlVMTFdJRFRIIExFRlQgUEFSRU5USEVTSVNdCisiXHVGRjA4IiA9PiAiKCIKKworIyDiuKggIFtMRUZUIERPVUJMRSBQQVJFTlRIRVNJU10KKyJcdTJFMjgiID0+ICIoKCIKKworIyDigb4gIFtTVVBFUlNDUklQVCBSSUdIVCBQQVJFTlRIRVNJU10KKyJcdTIwN0UiID0+ICIpIgorCisjIOKCjiAgW1NVQlNDUklQVCBSSUdIVCBQQVJFTlRIRVNJU10KKyJcdTIwOEUiID0+ICIpIgorCisjIOKdqSAgW01FRElVTSBSSUdIVCBQQVJFTlRIRVNJUyBPUk5BTUVOVF0KKyJcdTI3NjkiID0+ICIpIgorCisjIOKdqyAgW01FRElVTSBGTEFUVEVORUQgUklHSFQgUEFSRU5USEVTSVMgT1JOQU1FTlRdCisiXHUyNzZCIiA9PiAiKSIKKworIyDvvIkgIFtGVUxMV0lEVEggUklHSFQgUEFSRU5USEVTSVNdCisiXHVGRjA5IiA9PiAiKSIKKworIyDiuKkgIFtSSUdIVCBET1VCTEUgUEFSRU5USEVTSVNdCisiXHUyRTI5IiA9PiAiKSkiCisKKyMg4p2sICBbTUVESVVNIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NkMiID0+ICI8IgorCisjIOKdsCAgW0hFQVZZIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NzAiID0+ICI8IgorCisjIO+8nCAgW0ZVTExXSURUSCBMRVNTLVRIQU4gU0lHTl0KKyJcdUZGMUMiID0+ICI8IgorCisjIOKdrSAgW01FRElVTSBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUIE9STkFNRU5UXQorIlx1Mjc2RCIgPT4gIj4iCisKKyMg4p2xICBbSEVBVlkgUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NzEiID0+ICI+IgorCisjIO+8niAgW0ZVTExXSURUSCBHUkVBVEVSLVRIQU4gU0lHTl0KKyJcdUZGMUUiID0+ICI+IgorCisjIOKdtCAgW01FRElVTSBMRUZUIENVUkxZIEJSQUNLRVQgT1JOQU1FTlRdCisiXHUyNzc0IiA9PiAieyIKKworIyDvvZsgIFtGVUxMV0lEVEggTEVGVCBDVVJMWSBCUkFDS0VUXQorIlx1RkY1QiIgPT4gInsiCisKKyMg4p21ICBbTUVESVVNIFJJR0hUIENVUkxZIEJSQUNLRVQgT1JOQU1FTlRdCisiXHUyNzc1IiA9PiAifSIKKworIyDvvZ0gIFtGVUxMV0lEVEggUklHSFQgQ1VSTFkgQlJBQ0tFVF0KKyJcdUZGNUQiID0+ICJ9IgorCisjIOKBuiAgW1NVUEVSU0NSSVBUIFBMVVMgU0lHTl0KKyJcdTIwN0EiID0+ICIrIgorCisjIOKCiiAgW1NVQlNDUklQVCBQTFVTIFNJR05dCisiXHUyMDhBIiA9PiAiKyIKKworIyDvvIsgIFtGVUxMV0lEVEggUExVUyBTSUdOXQorIlx1RkYwQiIgPT4gIisiCisKKyMg4oG8ICBbU1VQRVJTQ1JJUFQgRVFVQUxTIFNJR05dCisiXHUyMDdDIiA9PiAiPSIKKworIyDigowgIFtTVUJTQ1JJUFQgRVFVQUxTIFNJR05dCisiXHUyMDhDIiA9PiAiPSIKKworIyDvvJ0gIFtGVUxMV0lEVEggRVFVQUxTIFNJR05dCisiXHVGRjFEIiA9PiAiPSIKKworIyDvvIEgIFtGVUxMV0lEVEggRVhDTEFNQVRJT04gTUFSS10KKyJcdUZGMDEiID0+ICIhIgorCisjIOKAvCAgW0RPVUJMRSBFWENMQU1BVElPTiBNQVJLXQorIlx1MjAzQyIgPT4gIiEhIgorCisjIOKBiSAgW0VYQ0xBTUFUSU9OIFFVRVNUSU9OIE1BUktdCisiXHUyMDQ5IiA9PiAiIT8iCisKKyMg77yDICBbRlVMTFdJRFRIIE5VTUJFUiBTSUdOXQorIlx1RkYwMyIgPT4gIiMiCisKKyMg77yEICBbRlVMTFdJRFRIIERPTExBUiBTSUdOXQorIlx1RkYwNCIgPT4gIiQiCisKKyMg4oGSICBbQ09NTUVSQ0lBTCBNSU5VUyBTSUdOXQorIlx1MjA1MiIgPT4gIiUiCisKKyMg77yFICBbRlVMTFdJRFRIIFBFUkNFTlQgU0lHTl0KKyJcdUZGMDUiID0+ICIlIgorCisjIO+8hiAgW0ZVTExXSURUSCBBTVBFUlNBTkRdCisiXHVGRjA2IiA9PiAiJiIKKworIyDigY4gIFtMT1cgQVNURVJJU0tdCisiXHUyMDRFIiA9PiAiKiIKKworIyDvvIogIFtGVUxMV0lEVEggQVNURVJJU0tdCisiXHVGRjBBIiA9PiAiKiIKKworIyDvvIwgIFtGVUxMV0lEVEggQ09NTUFdCisiXHVGRjBDIiA9PiAiLCIKKworIyDvvI4gIFtGVUxMV0lEVEggRlVMTCBTVE9QXQorIlx1RkYwRSIgPT4gIi4iCisKKyMg4oGEICBbRlJBQ1RJT04gU0xBU0hdCisiXHUyMDQ0IiA9PiAiLyIKKworIyDvvI8gIFtGVUxMV0lEVEggU09MSURVU10KKyJcdUZGMEYiID0+ICIvIgorCisjIO+8miAgW0ZVTExXSURUSCBDT0xPTl0KKyJcdUZGMUEiID0+ICI6IgorCisjIOKBjyAgW1JFVkVSU0VEIFNFTUlDT0xPTl0KKyJcdTIwNEYiID0+ICI7IgorCisjIO+8myAgW0ZVTExXSURUSCBTRU1JQ09MT05dCisiXHVGRjFCIiA9PiAiOyIKKworIyDvvJ8gIFtGVUxMV0lEVEggUVVFU1RJT04gTUFSS10KKyJcdUZGMUYiID0+ICI/IgorCisjIOKBhyAgW0RPVUJMRSBRVUVTVElPTiBNQVJLXQorIlx1MjA0NyIgPT4gIj8/IgorCisjIOKBiCAgW1FVRVNUSU9OIEVYQ0xBTUFUSU9OIE1BUktdCisiXHUyMDQ4IiA9PiAiPyEiCisKKyMg77ygICBbRlVMTFdJRFRIIENPTU1FUkNJQUwgQVRdCisiXHVGRjIwIiA9PiAiQCIKKworIyDvvLwgIFtGVUxMV0lEVEggUkVWRVJTRSBTT0xJRFVTXQorIlx1RkYzQyIgPT4gIlxcIgorCisjIOKAuCAgW0NBUkVUXQorIlx1MjAzOCIgPT4gIl4iCisKKyMg77y+ICBbRlVMTFdJRFRIIENJUkNVTUZMRVggQUNDRU5UXQorIlx1RkYzRSIgPT4gIl4iCisKKyMg77y/ICBbRlVMTFdJRFRIIExPVyBMSU5FXQorIlx1RkYzRiIgPT4gIl8iCisKKyMg4oGTICBbU1dVTkcgREFTSF0KKyJcdTIwNTMiID0+ICJ+IgorCisjIO+9niAgW0ZVTExXSURUSCBUSUxERV0KKyJcdUZGNUUiID0+ICJ+IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlbG93IGlzIHRoZSBQZXJsIHNjcmlwdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBhYm92ZSBtYXBwaW5ncyAjCisjIGZyb20gQVNDSUlGb2xkaW5nRmlsdGVyLmphdmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICMhL3Vzci9iaW4vcGVybAorIworIyB1c2Ugd2FybmluZ3M7CisjIHVzZSBzdHJpY3Q7CisjIAorIyBteSBAc291cmNlX2NoYXJzID0gKCk7CisjIG15IEBzb3VyY2VfY2hhcl9kZXNjcmlwdGlvbnMgPSAoKTsKKyMgbXkgJHRhcmdldCA9ICcnOworIyAKKyMgd2hpbGUgKDw+KSB7CisjICAgaWYgKC9jYXNlXHMrJyhcXHVbQS1GMC05XSspJzpccypcL1wvXHMqKC4qKS9pKSB7CisjICAgICBwdXNoIEBzb3VyY2VfY2hhcnMsICQxOworIwkgIHB1c2ggQHNvdXJjZV9jaGFyX2Rlc2NyaXB0aW9ucywgJDI7CisjCSAgbmV4dDsKKyMgICB9CisjICAgaWYgKC9vdXRwdXRcW1teXF1dK1xdXHMqPVxzKicoXFwnfFxcXFx8LiknLykgeworIyAgICAgJHRhcmdldCAuPSAkMTsKKyMgICAgIG5leHQ7CisjICAgfQorIyAgIGlmICgvYnJlYWs7LykgeworIyAgICAgJHRhcmdldCA9ICJcXFwiIiBpZiAoJHRhcmdldCBlcSAnIicpOworIyAgICAgZm9yIG15ICRzb3VyY2VfY2hhcl9udW0gKDAuLiQjc291cmNlX2NoYXJzKSB7CisjCSAgICBwcmludCAiIyAkc291cmNlX2NoYXJfZGVzY3JpcHRpb25zWyRzb3VyY2VfY2hhcl9udW1dXG4iOworIwkgICAgcHJpbnQgIlwiJHNvdXJjZV9jaGFyc1skc291cmNlX2NoYXJfbnVtXVwiID0+IFwiJHRhcmdldFwiXG5cbiI7CisjCSAgfQorIwkgIEBzb3VyY2VfY2hhcnMgPSAoKTsKKyMJICBAc291cmNlX2NoYXJfZGVzY3JpcHRpb25zID0gKCk7CisjCSAgJHRhcmdldCA9ICcnOworIyAgIH0KKyMgfQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbWFwcGluZy1JU09MYXRpbjFBY2NlbnQudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvbWFwcGluZy1JU09MYXRpbjFBY2NlbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTc3NDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9tYXBwaW5nLUlTT0xhdGluMUFjY2VudC50eHQKQEAgLTAsMCArMSwyNDYgQEAKKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFN5bnRheDoKKyMgICAic291cmNlIiA9PiAidGFyZ2V0IgorIyAgICAgInNvdXJjZSIubGVuZ3RoKCkgPiAwIChzb3VyY2UgY2Fubm90IGJlIGVtcHR5LikKKyMgICAgICJ0YXJnZXQiLmxlbmd0aCgpID49IDAgKHRhcmdldCBjYW4gYmUgZW1wdHkuKQorCisjIGV4YW1wbGU6CisjICAgIsOAIiA9PiAiQSIKKyMgICAiXHUwMEMwIiA9PiAiQSIKKyMgICAiXHUwMEMwIiA9PiAiXHUwMDQxIgorIyAgICLDnyIgPT4gInNzIgorIyAgICJcdCIgPT4gIiAiCisjICAgIlxuIiA9PiAiIgorCisjIMOAID0+IEEKKyJcdTAwQzAiID0+ICJBIgorCisjIMOBID0+IEEKKyJcdTAwQzEiID0+ICJBIgorCisjIMOCID0+IEEKKyJcdTAwQzIiID0+ICJBIgorCisjIMODID0+IEEKKyJcdTAwQzMiID0+ICJBIgorCisjIMOEID0+IEEKKyJcdTAwQzQiID0+ICJBIgorCisjIMOFID0+IEEKKyJcdTAwQzUiID0+ICJBIgorCisjIMOGID0+IEFFCisiXHUwMEM2IiA9PiAiQUUiCisKKyMgw4cgPT4gQworIlx1MDBDNyIgPT4gIkMiCisKKyMgw4ggPT4gRQorIlx1MDBDOCIgPT4gIkUiCisKKyMgw4kgPT4gRQorIlx1MDBDOSIgPT4gIkUiCisKKyMgw4ogPT4gRQorIlx1MDBDQSIgPT4gIkUiCisKKyMgw4sgPT4gRQorIlx1MDBDQiIgPT4gIkUiCisKKyMgw4wgPT4gSQorIlx1MDBDQyIgPT4gIkkiCisKKyMgw40gPT4gSQorIlx1MDBDRCIgPT4gIkkiCisKKyMgw44gPT4gSQorIlx1MDBDRSIgPT4gIkkiCisKKyMgw48gPT4gSQorIlx1MDBDRiIgPT4gIkkiCisKKyMgxLIgPT4gSUoKKyJcdTAxMzIiID0+ICJJSiIKKworIyDDkCA9PiBECisiXHUwMEQwIiA9PiAiRCIKKworIyDDkSA9PiBOCisiXHUwMEQxIiA9PiAiTiIKKworIyDDkiA9PiBPCisiXHUwMEQyIiA9PiAiTyIKKworIyDDkyA9PiBPCisiXHUwMEQzIiA9PiAiTyIKKworIyDDlCA9PiBPCisiXHUwMEQ0IiA9PiAiTyIKKworIyDDlSA9PiBPCisiXHUwMEQ1IiA9PiAiTyIKKworIyDDliA9PiBPCisiXHUwMEQ2IiA9PiAiTyIKKworIyDDmCA9PiBPCisiXHUwMEQ4IiA9PiAiTyIKKworIyDFkiA9PiBPRQorIlx1MDE1MiIgPT4gIk9FIgorCisjIMOeCisiXHUwMERFIiA9PiAiVEgiCisKKyMgw5kgPT4gVQorIlx1MDBEOSIgPT4gIlUiCisKKyMgw5ogPT4gVQorIlx1MDBEQSIgPT4gIlUiCisKKyMgw5sgPT4gVQorIlx1MDBEQiIgPT4gIlUiCisKKyMgw5wgPT4gVQorIlx1MDBEQyIgPT4gIlUiCisKKyMgw50gPT4gWQorIlx1MDBERCIgPT4gIlkiCisKKyMgxbggPT4gWQorIlx1MDE3OCIgPT4gIlkiCisKKyMgw6AgPT4gYQorIlx1MDBFMCIgPT4gImEiCisKKyMgw6EgPT4gYQorIlx1MDBFMSIgPT4gImEiCisKKyMgw6IgPT4gYQorIlx1MDBFMiIgPT4gImEiCisKKyMgw6MgPT4gYQorIlx1MDBFMyIgPT4gImEiCisKKyMgw6QgPT4gYQorIlx1MDBFNCIgPT4gImEiCisKKyMgw6UgPT4gYQorIlx1MDBFNSIgPT4gImEiCisKKyMgw6YgPT4gYWUKKyJcdTAwRTYiID0+ICJhZSIKKworIyDDpyA9PiBjCisiXHUwMEU3IiA9PiAiYyIKKworIyDDqCA9PiBlCisiXHUwMEU4IiA9PiAiZSIKKworIyDDqSA9PiBlCisiXHUwMEU5IiA9PiAiZSIKKworIyDDqiA9PiBlCisiXHUwMEVBIiA9PiAiZSIKKworIyDDqyA9PiBlCisiXHUwMEVCIiA9PiAiZSIKKworIyDDrCA9PiBpCisiXHUwMEVDIiA9PiAiaSIKKworIyDDrSA9PiBpCisiXHUwMEVEIiA9PiAiaSIKKworIyDDriA9PiBpCisiXHUwMEVFIiA9PiAiaSIKKworIyDDryA9PiBpCisiXHUwMEVGIiA9PiAiaSIKKworIyDEsyA9PiBpagorIlx1MDEzMyIgPT4gImlqIgorCisjIMOwID0+IGQKKyJcdTAwRjAiID0+ICJkIgorCisjIMOxID0+IG4KKyJcdTAwRjEiID0+ICJuIgorCisjIMOyID0+IG8KKyJcdTAwRjIiID0+ICJvIgorCisjIMOzID0+IG8KKyJcdTAwRjMiID0+ICJvIgorCisjIMO0ID0+IG8KKyJcdTAwRjQiID0+ICJvIgorCisjIMO1ID0+IG8KKyJcdTAwRjUiID0+ICJvIgorCisjIMO2ID0+IG8KKyJcdTAwRjYiID0+ICJvIgorCisjIMO4ID0+IG8KKyJcdTAwRjgiID0+ICJvIgorCisjIMWTID0+IG9lCisiXHUwMTUzIiA9PiAib2UiCisKKyMgw58gPT4gc3MKKyJcdTAwREYiID0+ICJzcyIKKworIyDDviA9PiB0aAorIlx1MDBGRSIgPT4gInRoIgorCisjIMO5ID0+IHUKKyJcdTAwRjkiID0+ICJ1IgorCisjIMO6ID0+IHUKKyJcdTAwRkEiID0+ICJ1IgorCisjIMO7ID0+IHUKKyJcdTAwRkIiID0+ICJ1IgorCisjIMO8ID0+IHUKKyJcdTAwRkMiID0+ICJ1IgorCisjIMO9ID0+IHkKKyJcdTAwRkQiID0+ICJ5IgorCisjIMO/ID0+IHkKKyJcdTAwRkYiID0+ICJ5IgorCisjIO+sgCA9PiBmZgorIlx1RkIwMCIgPT4gImZmIgorCisjIO+sgSA9PiBmaQorIlx1RkIwMSIgPT4gImZpIgorCisjIO+sgiA9PiBmbAorIlx1RkIwMiIgPT4gImZsIgorCisjIO+sgyA9PiBmZmkKKyJcdUZCMDMiID0+ICJmZmkiCisKKyMg76yEID0+IGZmbAorIlx1RkIwNCIgPT4gImZmbCIKKworIyDvrIUgPT4gZnQKKyJcdUZCMDUiID0+ICJmdCIKKworIyDvrIYgPT4gc3QKKyJcdUZCMDYiID0+ICJzdCIKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3Byb3R3b3Jkcy50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9wcm90d29yZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmMwYWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9wcm90d29yZHMudHh0CkBAIC0wLDAgKzEsMjEgQEAKKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVXNlIGEgcHJvdGVjdGVkIHdvcmQgZmlsZSB0byBwcm90ZWN0IGFnYWluc3QgdGhlIHN0ZW1tZXIgcmVkdWNpbmcgdHdvCisjIHVucmVsYXRlZCB3b3JkcyB0byB0aGUgc2FtZSBiYXNlIHdvcmQuCisKKyMgU29tZSBub24td29yZHMgdGhhdCBub3JtYWxseSB3b24ndCBiZSBlbmNvdW50ZXJlZCwKKyMganVzdCB0byB0ZXN0IHRoYXQgdGhleSB3b24ndCBiZSBzdGVtbWVkLgorZG9udHN0ZW1zCit6d2hhY2t5CisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3NjaGVtYS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zY2hlbWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTY5NzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zY2hlbWEueG1sCkBAIC0wLDAgKzEsMTAyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gIAorIFRoaXMgaXMgdGhlIFNvbHIgc2NoZW1hIGZpbGUuIFRoaXMgZmlsZSBzaG91bGQgYmUgbmFtZWQgInNjaGVtYS54bWwiIGFuZAorIHNob3VsZCBiZSBpbiB0aGUgY29uZiBkaXJlY3RvcnkgdW5kZXIgdGhlIHNvbHIgaG9tZQorIChpLmUuIC4vc29sci9jb25mL3NjaGVtYS54bWwgYnkgZGVmYXVsdCkgCisgb3IgbG9jYXRlZCB3aGVyZSB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoZSBTb2xyIHdlYmFwcCBjYW4gZmluZCBpdC4KKworIFRoaXMgZXhhbXBsZSBzY2hlbWEgaXMgdGhlIHJlY29tbWVuZGVkIHN0YXJ0aW5nIHBvaW50IGZvciB1c2Vycy4KKyBJdCBzaG91bGQgYmUga2VwdCBjb3JyZWN0IGFuZCBjb25jaXNlLCB1c2FibGUgb3V0LW9mLXRoZS1ib3guCisKKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgb24gaG93IHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUsIHBsZWFzZSBzZWUKKyBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU2NoZW1hWG1sCisKKyBQRVJGT1JNQU5DRSBOT1RFOiB0aGlzIHNjaGVtYSBpbmNsdWRlcyBtYW55IG9wdGlvbmFsIGZlYXR1cmVzIGFuZCBzaG91bGQgbm90CisgYmUgdXNlZCBmb3IgYmVuY2htYXJraW5nLiAgVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbmUgY291bGQKKyAgLSBzZXQgc3RvcmVkPSJmYWxzZSIgZm9yIGFsbCBmaWVsZHMgcG9zc2libGUgKGVzcCBsYXJnZSBmaWVsZHMpIHdoZW4geW91CisgICAgb25seSBuZWVkIHRvIHNlYXJjaCBvbiB0aGUgZmllbGQgYnV0IGRvbid0IG5lZWQgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbAorICAgIHZhbHVlLgorICAtIHNldCBpbmRleGVkPSJmYWxzZSIgaWYgeW91IGRvbid0IG5lZWQgdG8gc2VhcmNoIG9uIHRoZSBmaWVsZCwgYnV0IG9ubHkKKyAgICByZXR1cm4gdGhlIGZpZWxkIGFzIGEgcmVzdWx0IG9mIHNlYXJjaGluZyBvbiBvdGhlciBpbmRleGVkIGZpZWxkcy4KKyAgLSByZW1vdmUgYWxsIHVubmVlZGVkIGNvcHlGaWVsZCBzdGF0ZW1lbnRzCisgIC0gZm9yIGJlc3QgaW5kZXggc2l6ZSBhbmQgc2VhcmNoaW5nIHBlcmZvcm1hbmNlLCBzZXQgImluZGV4IiB0byBmYWxzZQorICAgIGZvciBhbGwgZ2VuZXJhbCB0ZXh0IGZpZWxkcywgdXNlIGNvcHlGaWVsZCB0byBjb3B5IHRoZW0gdG8gdGhlCisgICAgY2F0Y2hhbGwgInRleHQiIGZpZWxkLCBhbmQgdXNlIHRoYXQgZm9yIHNlYXJjaGluZy4KKyAgLSBGb3IgbWF4aW11bSBpbmRleGluZyBwZXJmb3JtYW5jZSwgdXNlIHRoZSBTdHJlYW1pbmdVcGRhdGVTb2xyU2VydmVyCisgICAgamF2YSBjbGllbnQuCisgIC0gUmVtZW1iZXIgdG8gcnVuIHRoZSBKVk0gaW4gc2VydmVyIG1vZGUsIGFuZCB1c2UgYSBoaWdoZXIgbG9nZ2luZyBsZXZlbAorICAgIHRoYXQgYXZvaWRzIGxvZ2dpbmcgZXZlcnkgcmVxdWVzdAorLS0+CisKKzxzY2hlbWEgbmFtZT0iRGVmYXVsdCBTb2xyIEZpbGUgTWFuYWdlciBzY2hlbWEiIHZlcnNpb249IjEuNSI+CisgIDwhLS0gYXR0cmlidXRlICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGlzIHNjaGVtYSBhbmQgaXMgb25seSB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICAgICAgIHZlcnNpb249IngueSIgaXMgU29scidzIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgc2NoZW1hIHN5bnRheCBhbmQgCisgICAgICAgc2VtYW50aWNzLiAgSXQgc2hvdWxkIG5vdCBub3JtYWxseSBiZSBjaGFuZ2VkIGJ5IGFwcGxpY2F0aW9ucy4KKworICAgICAgIDEuMDogbXVsdGlWYWx1ZWQgYXR0cmlidXRlIGRpZCBub3QgZXhpc3QsIGFsbCBmaWVsZHMgYXJlIG11bHRpVmFsdWVkIAorICAgICAgICAgICAgYnkgbmF0dXJlCisgICAgICAgMS4xOiBtdWx0aVZhbHVlZCBhdHRyaWJ1dGUgaW50cm9kdWNlZCwgZmFsc2UgYnkgZGVmYXVsdCAKKyAgICAgICAxLjI6IG9taXRUZXJtRnJlcUFuZFBvc2l0aW9ucyBhdHRyaWJ1dGUgaW50cm9kdWNlZCwgdHJ1ZSBieSBkZWZhdWx0IAorICAgICAgICAgICAgZXhjZXB0IGZvciB0ZXh0IGZpZWxkcy4KKyAgICAgICAxLjM6IHJlbW92ZWQgb3B0aW9uYWwgZmllbGQgY29tcHJlc3MgZmVhdHVyZQorICAgICAgIDEuNDogYXV0b0dlbmVyYXRlUGhyYXNlUXVlcmllcyBhdHRyaWJ1dGUgaW50cm9kdWNlZCB0byBkcml2ZSBRdWVyeVBhcnNlcgorICAgICAgICAgICAgYmVoYXZpb3Igd2hlbiBhIHNpbmdsZSBzdHJpbmcgcHJvZHVjZXMgbXVsdGlwbGUgdG9rZW5zLiAgRGVmYXVsdHMgCisgICAgICAgICAgICB0byBvZmYgZm9yIHZlcnNpb24gPj0gMS40CisgICAgICAgMS41OiBvbWl0Tm9ybXMgZGVmYXVsdHMgdG8gdHJ1ZSBmb3IgcHJpbWl0aXZlIGZpZWxkIHR5cGVzIAorICAgICAgICAgICAgKGludCwgZmxvYXQsIGJvb2xlYW4sIHN0cmluZy4uLikKKyAgICAgLS0+CisKKyA8ZmllbGRzPgorICAgPCEtLSBWYWxpZCBhdHRyaWJ1dGVzIGZvciBmaWVsZHM6CisgICAgIG5hbWU6IG1hbmRhdG9yeSAtIHRoZSBuYW1lIGZvciB0aGUgZmllbGQKKyAgICAgdHlwZTogbWFuZGF0b3J5IC0gdGhlIG5hbWUgb2YgYSBmaWVsZCB0eXBlIGZyb20gdGhlIAorICAgICAgIDx0eXBlcz4gZmllbGRUeXBlIHNlY3Rpb24KKyAgICAgaW5kZXhlZDogdHJ1ZSBpZiB0aGlzIGZpZWxkIHNob3VsZCBiZSBpbmRleGVkIChzZWFyY2hhYmxlIG9yIHNvcnRhYmxlKQorICAgICBzdG9yZWQ6IHRydWUgaWYgdGhpcyBmaWVsZCBzaG91bGQgYmUgcmV0cmlldmFibGUKKyAgICAgZG9jVmFsdWVzOiB0cnVlIGlmIHRoaXMgZmllbGQgc2hvdWxkIGhhdmUgZG9jIHZhbHVlcy4gRG9jIHZhbHVlcyBhcmUKKyAgICAgICB1c2VmdWwgZm9yIGZhY2V0aW5nLCBncm91cGluZywgc29ydGluZyBhbmQgZnVuY3Rpb24gcXVlcmllcy4gQWx0aG91Z2ggbm90CisgICAgICAgcmVxdWlyZWQsIGRvYyB2YWx1ZXMgd2lsbCBtYWtlIHRoZSBpbmRleCBmYXN0ZXIgdG8gbG9hZCwgbW9yZQorICAgICAgIE5SVC1mcmllbmRseSBhbmQgbW9yZSBtZW1vcnktZWZmaWNpZW50LiBUaGV5IGhvd2V2ZXIgY29tZSB3aXRoIHNvbWUKKyAgICAgICBsaW1pdGF0aW9uczogdGhleSBhcmUgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IFN0ckZpZWxkLCBVVUlERmllbGQKKyAgICAgICBhbmQgYWxsIFRyaWUqRmllbGRzLCBhbmQgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLCB0aGV5IG1pZ2h0CisgICAgICAgcmVxdWlyZSB0aGUgZmllbGQgdG8gYmUgc2luZ2xlLXZhbHVlZCwgYmUgcmVxdWlyZWQgb3IgaGF2ZSBhIGRlZmF1bHQKKyAgICAgICB2YWx1ZSAoY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpZWxkIHR5cGUgeW91J3JlIGludGVyZXN0ZWQgaW4KKyAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbikKKyAgICAgbXVsdGlWYWx1ZWQ6IHRydWUgaWYgdGhpcyBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSB2YWx1ZXMgcGVyIGRvY3VtZW50CisgICAgIG9taXROb3JtczogKGV4cGVydCkgc2V0IHRvIHRydWUgdG8gb21pdCB0aGUgbm9ybXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgdGhpcyBmaWVsZCAodGhpcyBkaXNhYmxlcyBsZW5ndGggbm9ybWFsaXphdGlvbiBhbmQgaW5kZXgtdGltZQorICAgICAgIGJvb3N0aW5nIGZvciB0aGUgZmllbGQsIGFuZCBzYXZlcyBzb21lIG1lbW9yeSkuICBPbmx5IGZ1bGwtdGV4dAorICAgICAgIGZpZWxkcyBvciBmaWVsZHMgdGhhdCBuZWVkIGFuIGluZGV4LXRpbWUgYm9vc3QgbmVlZCBub3Jtcy4KKyAgICAgICBOb3JtcyBhcmUgb21pdHRlZCBmb3IgcHJpbWl0aXZlIChub24tYW5hbHl6ZWQpIHR5cGVzIGJ5IGRlZmF1bHQuCisgICAgIHRlcm1WZWN0b3JzOiBbZmFsc2VdIHNldCB0byB0cnVlIHRvIHN0b3JlIHRoZSB0ZXJtIHZlY3RvciBmb3IgYQorICAgICAgIGdpdmVuIGZpZWxkLgorICAgICAgIFdoZW4gdXNpbmcgTW9yZUxpa2VUaGlzLCBmaWVsZHMgdXNlZCBmb3Igc2ltaWxhcml0eSBzaG91bGQgYmUKKyAgICAgICBzdG9yZWQgZm9yIGJlc3QgcGVyZm9ybWFuY2UuCisgICAgIHRlcm1Qb3NpdGlvbnM6IFN0b3JlIHBvc2l0aW9uIGluZm9ybWF0aW9uIHdpdGggdGhlIHRlcm0gdmVjdG9yLiAgCisgICAgICAgVGhpcyB3aWxsIGluY3JlYXNlIHN0b3JhZ2UgY29zdHMuCisgICAgIHRlcm1PZmZzZXRzOiBTdG9yZSBvZmZzZXQgaW5mb3JtYXRpb24gd2l0aCB0aGUgdGVybSB2ZWN0b3IuIFRoaXMgCisgICAgICAgd2lsbCBpbmNyZWFzZSBzdG9yYWdlIGNvc3RzLgorICAgICByZXF1aXJlZDogVGhlIGZpZWxkIGlzIHJlcXVpcmVkLiAgSXQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUKKyAgICAgICB2YWx1ZSBkb2VzIG5vdCBleGlzdAorICAgICBkZWZhdWx0OiBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkCisgICAgICAgd2hlbiBhZGRpbmcgYSBkb2N1bWVudC4KKyAgIC0tPgorCisgICA8IS0tIGZpZWxkIG5hbWVzIHNob3VsZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBvciB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgb25seSBhbmQKKyAgICAgIG5vdCBzdGFydCB3aXRoIGEgZGlnaXQuICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3RyaWN0bHkgZW5mb3JjZWQsCisgICAgICBidXQgb3RoZXIgZmllbGQgbmFtZXMgd2lsbCBub3QgaGF2ZSBmaXJzdCBjbGFzcyBzdXBwb3J0IGZyb20gYWxsIGNvbXBvbmVudHMKKyAgICAgIGFuZCBiYWNrIGNvbXBhdGliaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuICBOYW1lcyB3aXRoIGJvdGggbGVhZGluZyBhbmQKKyAgICAgIHRyYWlsaW5nIHVuZGVyc2NvcmVzIChlLmcuIF92ZXJzaW9uXykgYXJlIHJlc2VydmVkLgorICAgLS0+CisgICAgICAgIAorICAgICAKKyAgIDwhLS0gU29sciB1bmlxdWUgZG9jdW1lbnQgaWRlbnRpZmllciAtLT4KKyAgIDxmaWVsZCBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0iZmFsc2UiIC8+IAorCisgICA8IS0tIGNvcmUgQ0FTIHByb2R1Y3QgYXR0cmlidXRlcyAtLT4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdElkIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdE5hbWUiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Qcm9kdWN0VHlwZU5hbWUiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Qcm9kdWN0VHlwZUlkIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIgdHlwZT0iZGF0ZSIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUHJvZHVjdFN0cnVjdHVyZSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Qcm9kdWN0VHJhbnNmZXJTdGF0dXMiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKworICAgPGZpZWxkIG5hbWU9IkNBUy5Sb290UmVmZXJlbmNlT3JpZ2luYWwiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5Sb290UmVmZXJlbmNlRGF0YXN0b3JlIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgcmVxdWlyZWQ9ImZhbHNlIiBtdWx0aVZhbHVlZD0idHJ1ZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSJDQVMuUm9vdFJlZmVyZW5jZUZpbGVTaXplIiB0eXBlPSJsb25nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisgICA8ZmllbGQgbmFtZT0iQ0FTLlJvb3RSZWZlcmVuY2VNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisKKyAgIDxmaWVsZCBuYW1lPSJDQVMuUmVmZXJlbmNlT3JpZ2luYWwiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5SZWZlcmVuY2VEYXRhc3RvcmUiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5SZWZlcmVuY2VGaWxlU2l6ZSIgdHlwZT0ibG9uZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiAvPgorICAgPGZpZWxkIG5hbWU9IkNBUy5SZWZlcmVuY2VNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisKKyAgIDwhLS0gYWxsIHVuc3BlY2lmaWVkIGZpZWxkcyBlbmRpbmcgaW4gJ0RhdGUnIG9yICdUaW1lJyBhcmUgaW50ZXJwcmV0ZWQgYXMgc2luZ2xlLXZhbHVlIGRhdGVzICAtLT4KKyAgIDxmaWVsZCBuYW1lPSIqRGF0ZSIgdHlwZT0iZGF0ZSIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKyAgIDxmaWVsZCBuYW1lPSIqVGltZSIgdHlwZT0iZGF0ZSIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKworICAgPCEtLSBhbGwgb3RoZXIgZmllbGRzIGFyZSBpbmRleGVkIGFuZCBzdG9yZWQgYXMtaXMgYW5kIGNhbiBoYXZlIG11bHRpcGxlIHZhbHVlcyAtLT4KKyAgIDxkeW5hbWljRmllbGQgbmFtZT0iKiIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIG9taXROb3Jtcz0idHJ1ZSIgbXVsdGlWYWx1ZWQ9InRydWUiIC8+CisKKyAgIDwhLS0gY2F0Y2gtYWxsIHRleHQgZmllbGRzIGZvciBmdWxsIGZyZWUtdGV4dCBxdWVyeSAtLT4KKyAgIDxjb3B5RmllbGQgc291cmNlPSIqIiBkZXN0PSJ0ZXh0IiAvPgorICAgPGNvcHlGaWVsZCBzb3VyY2U9IioiIGRlc3Q9InRleHRfcmV2IiAvPgorCisgICA8IS0tIE1haW4gYm9keSBvZiBkb2N1bWVudCBleHRyYWN0ZWQgYnkgU29sckNlbGwuCisgICAgICAgIE5PVEU6IFRoaXMgZmllbGQgaXMgbm90IGluZGV4ZWQgYnkgZGVmYXVsdCwgc2luY2UgaXQgaXMgYWxzbyBjb3BpZWQgdG8gInRleHQiCisgICAgICAgIHVzaW5nIGNvcHlGaWVsZCBiZWxvdy4gVGhpcyBpcyB0byBzYXZlIHNwYWNlLiBVc2UgdGhpcyBmaWVsZCBmb3IgcmV0dXJuaW5nIGFuZAorICAgICAgICBoaWdobGlnaHRpbmcgZG9jdW1lbnQgY29udGVudC4gVXNlIHRoZSAidGV4dCIgZmllbGQgdG8gc2VhcmNoIHRoZSBjb250ZW50LiAtLT4KKyAgIDxmaWVsZCBuYW1lPSJjb250ZW50IiB0eXBlPSJ0ZXh0X2dlbmVyYWwiIGluZGV4ZWQ9ImZhbHNlIiBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisKKyAgIDwhLS0gY2F0Y2hhbGwgZmllbGQsIGNvbnRhaW5pbmcgYWxsIG90aGVyIHNlYXJjaGFibGUgdGV4dCBmaWVsZHMgKGltcGxlbWVudGVkCisgICAgICAgIHZpYSBjb3B5RmllbGQgZnVydGhlciBvbiBpbiB0aGlzIHNjaGVtYSAgLS0+CisgICA8ZmllbGQgbmFtZT0idGV4dCIgdHlwZT0idGV4dF9nZW5lcmFsIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9ImZhbHNlIiBtdWx0aVZhbHVlZD0idHJ1ZSIvPgorCisgICA8IS0tIGNhdGNoYWxsIHRleHQgZmllbGQgdGhhdCBpbmRleGVzIHRva2VucyBib3RoIG5vcm1hbGx5IGFuZCBpbiByZXZlcnNlIGZvciBlZmZpY2llbnQKKyAgICAgICAgbGVhZGluZyB3aWxkY2FyZCBxdWVyaWVzLiAtLT4KKyAgIDxmaWVsZCBuYW1lPSJ0ZXh0X3JldiIgdHlwZT0idGV4dF9nZW5lcmFsX3JldiIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJmYWxzZSIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKworICAgPCEtLSBJTVBPUlRBTlQ6IG5lZWRlZCBieSBTb2xyIDQuWCBhbmQgYWJvdmUgLS0+CisgICA8ZmllbGQgbmFtZT0iX3ZlcnNpb25fIiB0eXBlPSJsb25nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKworICAgPCEtLSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBpZ25vcmUgYW55IGZpZWxkcyB0aGF0IGRvbid0IGFscmVhZHkgbWF0Y2ggYW4gZXhpc3RpbmcgCisgICAgICAgIGZpZWxkIG5hbWUgb3IgZHluYW1pYyBmaWVsZCwgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHRoZW0gYXMgYW4gZXJyb3IuIAorICAgICAgICBhbHRlcm5hdGVseSwgY2hhbmdlIHRoZSB0eXBlPSJpZ25vcmVkIiB0byBzb21lIG90aGVyIHR5cGUgZS5nLiAidGV4dCIgaWYgeW91IHdhbnQgCisgICAgICAgIHVua25vd24gZmllbGRzIGluZGV4ZWQgYW5kL29yIHN0b3JlZCBieSBkZWZhdWx0IC0tPiAKKyAgIDwhLS1keW5hbWljRmllbGQgbmFtZT0iKiIgdHlwZT0iaWdub3JlZCIgbXVsdGlWYWx1ZWQ9InRydWUiIC8tLT4KKyAgIAorIDwvZmllbGRzPgorCisKKyA8IS0tIEZpZWxkIHRvIHVzZSB0byBkZXRlcm1pbmUgYW5kIGVuZm9yY2UgZG9jdW1lbnQgdW5pcXVlbmVzcy4gCisgICAgICBVbmxlc3MgdGhpcyBmaWVsZCBpcyBtYXJrZWQgd2l0aCByZXF1aXJlZD0iZmFsc2UiLCBpdCB3aWxsIGJlIGEgcmVxdWlyZWQgZmllbGQKKyAgIC0tPgorIDx1bmlxdWVLZXk+aWQ8L3VuaXF1ZUtleT4KKworIDwhLS0gREVQUkVDQVRFRDogVGhlIGRlZmF1bHRTZWFyY2hGaWVsZCBpcyBjb25zdWx0ZWQgYnkgdmFyaW91cyBxdWVyeSBwYXJzZXJzIHdoZW4KKyAgcGFyc2luZyBhIHF1ZXJ5IHN0cmluZyB0aGF0IGlzbid0IGV4cGxpY2l0IGFib3V0IHRoZSBmaWVsZC4gIE1hY2hpbmUgKG5vbi11c2VyKQorICBnZW5lcmF0ZWQgcXVlcmllcyBhcmUgYmVzdCBtYWRlIGV4cGxpY2l0LCBvciB0aGV5IGNhbiB1c2UgdGhlICJkZiIgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMuCisgIE5vdGU6IFVuLWNvbW1lbnRpbmcgZGVmYXVsdFNlYXJjaEZpZWxkIHdpbGwgYmUgaW5zdWZmaWNpZW50IGlmIHlvdXIgcmVxdWVzdCBoYW5kbGVyCisgIGluIHNvbHJjb25maWcueG1sIGRlZmluZXMgImRmIiwgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZS4gVGhhdCB3b3VsZCBuZWVkIHRvIGJlIHJlbW92ZWQuCisgPGRlZmF1bHRTZWFyY2hGaWVsZD50ZXh0PC9kZWZhdWx0U2VhcmNoRmllbGQ+IC0tPgorCisgPCEtLSBERVBSRUNBVEVEOiBUaGUgZGVmYXVsdE9wZXJhdG9yIChBTkR8T1IpIGlzIGNvbnN1bHRlZCBieSB2YXJpb3VzIHF1ZXJ5IHBhcnNlcnMKKyAgd2hlbiBwYXJzaW5nIGEgcXVlcnkgc3RyaW5nIHRvIGRldGVybWluZSBpZiBhIGNsYXVzZSBvZiB0aGUgcXVlcnkgc2hvdWxkIGJlIG1hcmtlZCBhcworICByZXF1aXJlZCBvciBvcHRpb25hbCwgYXNzdW1pbmcgdGhlIGNsYXVzZSBpc24ndCBhbHJlYWR5IG1hcmtlZCBieSBzb21lIG9wZXJhdG9yLgorICBUaGUgZGVmYXVsdCBpcyBPUiwgd2hpY2ggaXMgZ2VuZXJhbGx5IGFzc3VtZWQgc28gaXQgaXMgbm90IGEgZ29vZCBpZGVhIHRvIGNoYW5nZSBpdAorICBnbG9iYWxseSBoZXJlLiAgVGhlICJxLm9wIiByZXF1ZXN0IHBhcmFtZXRlciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcy4KKyA8c29sclF1ZXJ5UGFyc2VyIGRlZmF1bHRPcGVyYXRvcj0iT1IiLz4gLS0+CisgCisgIDx0eXBlcz4KKyAgICA8IS0tIGZpZWxkIHR5cGUgZGVmaW5pdGlvbnMuIFRoZSAibmFtZSIgYXR0cmlidXRlIGlzCisgICAgICAganVzdCBhIGxhYmVsIHRvIGJlIHVzZWQgYnkgZmllbGQgZGVmaW5pdGlvbnMuICBUaGUgImNsYXNzIgorICAgICAgIGF0dHJpYnV0ZSBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lIHRoZSByZWFsCisgICAgICAgYmVoYXZpb3Igb2YgdGhlIGZpZWxkVHlwZS4KKyAgICAgICAgIENsYXNzIG5hbWVzIHN0YXJ0aW5nIHdpdGggInNvbHIiIHJlZmVyIHRvIGphdmEgY2xhc3NlcyBpbiBhCisgICAgICAgc3RhbmRhcmQgcGFja2FnZSBzdWNoIGFzIG9yZy5hcGFjaGUuc29sci5hbmFseXNpcworICAgIC0tPgorCisgICAgPCEtLSBUaGUgU3RyRmllbGQgdHlwZSBpcyBub3QgYW5hbHl6ZWQsIGJ1dCBpbmRleGVkL3N0b3JlZCB2ZXJiYXRpbS4KKyAgICAgICBJdCBzdXBwb3J0cyBkb2MgdmFsdWVzIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIGZpZWxkIG5lZWRzIHRvIGJlCisgICAgICAgc2luZ2xlLXZhbHVlZCBhbmQgZWl0aGVyIHJlcXVpcmVkIG9yIGhhdmUgYSBkZWZhdWx0IHZhbHVlLgorICAgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJzdHJpbmciIGNsYXNzPSJzb2xyLlN0ckZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiIC8+CisKKyAgICA8IS0tIGJvb2xlYW4gdHlwZTogInRydWUiIG9yICJmYWxzZSIgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJib29sZWFuIiBjbGFzcz0ic29sci5Cb29sRmllbGQiIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIvPgorCisgICAgPCEtLSBzb3J0TWlzc2luZ0xhc3QgYW5kIHNvcnRNaXNzaW5nRmlyc3QgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgYXR0cmlidXRlcyBhcmUKKyAgICAgICAgIGN1cnJlbnRseSBzdXBwb3J0ZWQgb24gdHlwZXMgdGhhdCBhcmUgc29ydGVkIGludGVybmFsbHkgYXMgc3RyaW5ncworICAgICAgICAgYW5kIG9uIG51bWVyaWMgdHlwZXMuCisJICAgICBUaGlzIGluY2x1ZGVzICJzdHJpbmciLCJib29sZWFuIiwgYW5kLCBhcyBvZiAzLjUgKGFuZCA0LngpLAorCSAgICAgaW50LCBmbG9hdCwgbG9uZywgZGF0ZSwgZG91YmxlLCBpbmNsdWRpbmcgdGhlICJUcmllIiB2YXJpYW50cy4KKyAgICAgICAtIElmIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIsIHRoZW4gYSBzb3J0IG9uIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBkb2N1bWVudHMKKyAgICAgICAgIHdpdGhvdXQgdGhlIGZpZWxkIHRvIGNvbWUgYWZ0ZXIgZG9jdW1lbnRzIHdpdGggdGhlIGZpZWxkLAorICAgICAgICAgcmVnYXJkbGVzcyBvZiB0aGUgcmVxdWVzdGVkIHNvcnQgb3JkZXIgKGFzYyBvciBkZXNjKS4KKyAgICAgICAtIElmIHNvcnRNaXNzaW5nRmlyc3Q9InRydWUiLCB0aGVuIGEgc29ydCBvbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgZG9jdW1lbnRzCisgICAgICAgICB3aXRob3V0IHRoZSBmaWVsZCB0byBjb21lIGJlZm9yZSBkb2N1bWVudHMgd2l0aCB0aGUgZmllbGQsCisgICAgICAgICByZWdhcmRsZXNzIG9mIHRoZSByZXF1ZXN0ZWQgc29ydCBvcmRlci4KKyAgICAgICAtIElmIHNvcnRNaXNzaW5nTGFzdD0iZmFsc2UiIGFuZCBzb3J0TWlzc2luZ0ZpcnN0PSJmYWxzZSIgKHRoZSBkZWZhdWx0KSwKKyAgICAgICAgIHRoZW4gZGVmYXVsdCBsdWNlbmUgc29ydGluZyB3aWxsIGJlIHVzZWQgd2hpY2ggcGxhY2VzIGRvY3Mgd2l0aG91dCB0aGUKKyAgICAgICAgIGZpZWxkIGZpcnN0IGluIGFuIGFzY2VuZGluZyBzb3J0IGFuZCBsYXN0IGluIGEgZGVzY2VuZGluZyBzb3J0LgorICAgIC0tPiAgICAKKworICAgIDwhLS0KKyAgICAgIERlZmF1bHQgbnVtZXJpYyBmaWVsZCB0eXBlcy4gRm9yIGZhc3RlciByYW5nZSBxdWVyaWVzLCBjb25zaWRlciB0aGUgdGludC90ZmxvYXQvdGxvbmcvdGRvdWJsZSB0eXBlcy4KKworICAgICAgVGhlc2UgZmllbGRzIHN1cHBvcnQgZG9jIHZhbHVlcywgYnV0IHRoZXkgcmVxdWlyZSB0aGUgZmllbGQgdG8gYmUKKyAgICAgIHNpbmdsZS12YWx1ZWQgYW5kIGVpdGhlciBiZSByZXF1aXJlZCBvciBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImludCIgY2xhc3M9InNvbHIuVHJpZUludEZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iZmxvYXQiIGNsYXNzPSJzb2xyLlRyaWVGbG9hdEZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0ibG9uZyIgY2xhc3M9InNvbHIuVHJpZUxvbmdGaWVsZCIgcHJlY2lzaW9uU3RlcD0iMCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImRvdWJsZSIgY2xhc3M9InNvbHIuVHJpZURvdWJsZUZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorCisgICAgPCEtLQorICAgICBOdW1lcmljIGZpZWxkIHR5cGVzIHRoYXQgaW5kZXggZWFjaCB2YWx1ZSBhdCB2YXJpb3VzIGxldmVscyBvZiBwcmVjaXNpb24KKyAgICAgdG8gYWNjZWxlcmF0ZSByYW5nZSBxdWVyaWVzIHdoZW4gdGhlIG51bWJlciBvZiB2YWx1ZXMgYmV0d2VlbiB0aGUgcmFuZ2UKKyAgICAgZW5kcG9pbnRzIGlzIGxhcmdlLiBTZWUgdGhlIGphdmFkb2MgZm9yIE51bWVyaWNSYW5nZVF1ZXJ5IGZvciBpbnRlcm5hbAorICAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisgICAgIFNtYWxsZXIgcHJlY2lzaW9uU3RlcCB2YWx1ZXMgKHNwZWNpZmllZCBpbiBiaXRzKSB3aWxsIGxlYWQgdG8gbW9yZSB0b2tlbnMKKyAgICAgaW5kZXhlZCBwZXIgdmFsdWUsIHNsaWdodGx5IGxhcmdlciBpbmRleCBzaXplLCBhbmQgZmFzdGVyIHJhbmdlIHF1ZXJpZXMuCisgICAgIEEgcHJlY2lzaW9uU3RlcCBvZiAwIGRpc2FibGVzIGluZGV4aW5nIGF0IGRpZmZlcmVudCBwcmVjaXNpb24gbGV2ZWxzLgorICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGludCIgY2xhc3M9InNvbHIuVHJpZUludEZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGZsb2F0IiBjbGFzcz0ic29sci5UcmllRmxvYXRGaWVsZCIgcHJlY2lzaW9uU3RlcD0iOCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGRvdWJsZSIgY2xhc3M9InNvbHIuVHJpZURvdWJsZUZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorCisgICAgPCEtLSBUaGUgZm9ybWF0IGZvciB0aGlzIGRhdGUgZmllbGQgaXMgb2YgdGhlIGZvcm0gMTk5NS0xMi0zMVQyMzo1OTo1OVosIGFuZAorICAgICAgICAgaXMgYSBtb3JlIHJlc3RyaWN0ZWQgZm9ybSBvZiB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVUaW1lCisgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUgICAgCisgICAgICAgICBUaGUgdHJhaWxpbmcgIloiIGRlc2lnbmF0ZXMgVVRDIHRpbWUgYW5kIGlzIG1hbmRhdG9yeS4KKyAgICAgICAgIE9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kcyBhcmUgYWxsb3dlZDogMTk5NS0xMi0zMVQyMzo1OTo1OS45OTlaCisgICAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyBhcmUgbWFuZGF0b3J5LgorCisgICAgICAgICBFeHByZXNzaW9ucyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlbm90ZSBjYWxjdWxhdGlvbnMgdGhhdCBzaG91bGQgYmUKKyAgICAgICAgIHBlcmZvcm1lZCByZWxhdGl2ZSB0byAiTk9XIiB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLCBpZS4uLgorCisgICAgICAgICAgICAgICBOT1cvSE9VUgorICAgICAgICAgICAgICAgICAgLi4uIFJvdW5kIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBob3VyCisgICAgICAgICAgICAgICBOT1ctMURBWQorICAgICAgICAgICAgICAgICAgLi4uIEV4YWN0bHkgMSBkYXkgcHJpb3IgdG8gbm93CisgICAgICAgICAgICAgICBOT1cvREFZKzZNT05USFMrM0RBWVMKKyAgICAgICAgICAgICAgICAgIC4uLiA2IG1vbnRocyBhbmQgMyBkYXlzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgc3RhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBkYXkKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIENvbnN1bHQgdGhlIERhdGVGaWVsZCBqYXZhZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAgICAgTm90ZTogRm9yIGZhc3RlciByYW5nZSBxdWVyaWVzLCBjb25zaWRlciB0aGUgdGRhdGUgdHlwZQorICAgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJkYXRlIiBjbGFzcz0ic29sci5UcmllRGF0ZUZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorCisgICAgPCEtLSBBIFRyaWUgYmFzZWQgZGF0ZSBmaWVsZCBmb3IgZmFzdGVyIGRhdGUgcmFuZ2UgcXVlcmllcyBhbmQgZGF0ZSBmYWNldGluZy4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZGF0ZSIgY2xhc3M9InNvbHIuVHJpZURhdGVGaWVsZCIgcHJlY2lzaW9uU3RlcD0iNiIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKworCisgICAgPCEtLUJpbmFyeSBkYXRhIHR5cGUuIFRoZSBkYXRhIHNob3VsZCBiZSBzZW50L3JldHJpZXZlZCBpbiBhcyBCYXNlNjQgZW5jb2RlZCBTdHJpbmdzIC0tPgorICAgIDxmaWVsZHR5cGUgbmFtZT0iYmluYXJ5IiBjbGFzcz0ic29sci5CaW5hcnlGaWVsZCIvPgorCisgICAgPCEtLQorICAgICAgTm90ZToKKyAgICAgIFRoZXNlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBpbmRleGVzIChjcmVhdGVkIHdpdGggbHVjZW5lIG9yIG9sZGVyIFNvbHIgdmVyc2lvbnMpLgorICAgICAgVXNlIFRyaWUgYmFzZWQgZmllbGRzIGluc3RlYWQuIEFzIG9mIFNvbHIgMy41IGFuZCA0LngsIFRyaWUgYmFzZWQgZmllbGRzIHN1cHBvcnQgc29ydE1pc3NpbmdGaXJzdC9MYXN0CisgICAgICAKKyAgICAgIFBsYWluIG51bWVyaWMgZmllbGQgdHlwZXMgdGhhdCBzdG9yZSBhbmQgaW5kZXggdGhlIHRleHQKKyAgICAgIHZhbHVlIHZlcmJhdGltIChhbmQgaGVuY2UgZG9uJ3QgY29ycmVjdGx5IHN1cHBvcnQgcmFuZ2UgcXVlcmllcywgc2luY2UgdGhlCisgICAgICBsZXhpY29ncmFwaGljIG9yZGVyaW5nIGlzbid0IGVxdWFsIHRvIHRoZSBudW1lcmljIG9yZGVyaW5nKQorICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icGludCIgY2xhc3M9InNvbHIuSW50RmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBsb25nIiBjbGFzcz0ic29sci5Mb25nRmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBmbG9hdCIgY2xhc3M9InNvbHIuRmxvYXRGaWVsZCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icGRvdWJsZSIgY2xhc3M9InNvbHIuRG91YmxlRmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBkYXRlIiBjbGFzcz0ic29sci5EYXRlRmllbGQiIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIvPgorCisgICAgPCEtLSBUaGUgIlJhbmRvbVNvcnRGaWVsZCIgaXMgbm90IHVzZWQgdG8gc3RvcmUgb3Igc2VhcmNoIGFueQorICAgICAgICAgZGF0YS4gIFlvdSBjYW4gZGVjbGFyZSBmaWVsZHMgb2YgdGhpcyB0eXBlIGl0IGluIHlvdXIgc2NoZW1hCisgICAgICAgICB0byBnZW5lcmF0ZSBwc2V1ZG8tcmFuZG9tIG9yZGVyaW5ncyBvZiB5b3VyIGRvY3MgZm9yIHNvcnRpbmcgCisgICAgICAgICBvciBmdW5jdGlvbiBwdXJwb3Nlcy4gIFRoZSBvcmRlcmluZyBpcyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGZpZWxkCisgICAgICAgICBuYW1lIGFuZCB0aGUgdmVyc2lvbiBvZiB0aGUgaW5kZXguIEFzIGxvbmcgYXMgdGhlIGluZGV4IHZlcnNpb24KKyAgICAgICAgIHJlbWFpbnMgdW5jaGFuZ2VkLCBhbmQgdGhlIHNhbWUgZmllbGQgbmFtZSBpcyByZXVzZWQsCisgICAgICAgICB0aGUgb3JkZXJpbmcgb2YgdGhlIGRvY3Mgd2lsbCBiZSBjb25zaXN0ZW50LiAgCisgICAgICAgICBJZiB5b3Ugd2FudCBkaWZmZXJlbnQgcHN1ZWRvLXJhbmRvbSBvcmRlcmluZ3Mgb2YgZG9jdW1lbnRzLAorICAgICAgICAgZm9yIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIGluZGV4LCB1c2UgYSBkeW5hbWljRmllbGQgYW5kCisgICAgICAgICBjaGFuZ2UgdGhlIGZpZWxkIG5hbWUgaW4gdGhlIHJlcXVlc3QuCisgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icmFuZG9tIiBjbGFzcz0ic29sci5SYW5kb21Tb3J0RmllbGQiIGluZGV4ZWQ9InRydWUiIC8+CisKKyAgICA8IS0tIHNvbHIuVGV4dEZpZWxkIGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBjdXN0b20gdGV4dCBhbmFseXplcnMKKyAgICAgICAgIHNwZWNpZmllZCBhcyBhIHRva2VuaXplciBhbmQgYSBsaXN0IG9mIHRva2VuIGZpbHRlcnMuIERpZmZlcmVudAorICAgICAgICAgYW5hbHl6ZXJzIG1heSBiZSBzcGVjaWZpZWQgZm9yIGluZGV4aW5nIGFuZCBxdWVyeWluZy4KKworICAgICAgICAgVGhlIG9wdGlvbmFsIHBvc2l0aW9uSW5jcmVtZW50R2FwIHB1dHMgc3BhY2UgYmV0d2VlbiBtdWx0aXBsZSBmaWVsZHMgb2YKKyAgICAgICAgIHRoaXMgdHlwZSBvbiB0aGUgc2FtZSBkb2N1bWVudCwgd2l0aCB0aGUgcHVycG9zZSBvZiBwcmV2ZW50aW5nIGZhbHNlIHBocmFzZQorICAgICAgICAgbWF0Y2hpbmcgYWNyb3NzIGZpZWxkcy4KKworICAgICAgICAgRm9yIG1vcmUgaW5mbyBvbiBjdXN0b21pemluZyB5b3VyIGFuYWx5emVyIGNoYWluLCBwbGVhc2Ugc2VlCisgICAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvQW5hbHl6ZXJzVG9rZW5pemVyc1Rva2VuRmlsdGVycworICAgICAtLT4KKworICAgIDwhLS0gT25lIGNhbiBhbHNvIHNwZWNpZnkgYW4gZXhpc3RpbmcgQW5hbHl6ZXIgY2xhc3MgdGhhdCBoYXMgYQorICAgICAgICAgZGVmYXVsdCBjb25zdHJ1Y3RvciB2aWEgdGhlIGNsYXNzIGF0dHJpYnV0ZSBvbiB0aGUgYW5hbHl6ZXIgZWxlbWVudC4KKyAgICAgICAgIEV4YW1wbGU6CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dyZWVrIiBjbGFzcz0ic29sci5UZXh0RmllbGQiPgorICAgICAgPGFuYWx5emVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5lbC5HcmVla0FuYWx5emVyIi8+CisgICAgPC9maWVsZFR5cGU+CisgICAgLS0+CisKKyAgICA8IS0tIEEgdGV4dCBmaWVsZCB0aGF0IG9ubHkgc3BsaXRzIG9uIHdoaXRlc3BhY2UgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIHdvcmRzIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF93cyIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gQSBnZW5lcmFsIHRleHQgZmllbGQgdGhhdCBoYXMgcmVhc29uYWJsZSwgZ2VuZXJpYworICAgICAgICAgY3Jvc3MtbGFuZ3VhZ2UgZGVmYXVsdHM6IGl0IHRva2VuaXplcyB3aXRoIFN0YW5kYXJkVG9rZW5pemVyLAorCSByZW1vdmVzIHN0b3Agd29yZHMgZnJvbSBjYXNlLWluc2Vuc2l0aXZlICJzdG9wd29yZHMudHh0IgorCSAoZW1wdHkgYnkgZGVmYXVsdCksIGFuZCBkb3duIGNhc2VzLiAgQXQgcXVlcnkgdGltZSBvbmx5LCBpdAorCSBhbHNvIGFwcGxpZXMgc3lub255bXMuIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9nZW5lcmFsIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9InN0b3B3b3Jkcy50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIgLz4KKyAgICAgICAgPCEtLSBpbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgb25seSB1c2Ugc3lub255bXMgYXQgcXVlcnkgdGltZQorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0iaW5kZXhfc3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9ImZhbHNlIi8+CisgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0icXVlcnkiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ic3RvcHdvcmRzLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBBIHRleHQgZmllbGQgd2l0aCBkZWZhdWx0cyBhcHByb3ByaWF0ZSBmb3IgRW5nbGlzaDogaXQKKyAgICAgICAgIHRva2VuaXplcyB3aXRoIFN0YW5kYXJkVG9rZW5pemVyLCByZW1vdmVzIEVuZ2xpc2ggc3RvcCB3b3JkcworICAgICAgICAgKGxhbmcvc3RvcHdvcmRzX2VuLnR4dCksIGRvd24gY2FzZXMsIHByb3RlY3RzIHdvcmRzIGZyb20gcHJvdHdvcmRzLnR4dCwgYW5kCisgICAgICAgICBmaW5hbGx5IGFwcGxpZXMgUG9ydGVyJ3Mgc3RlbW1pbmcuICBUaGUgcXVlcnkgdGltZSBhbmFseXplcgorICAgICAgICAgYWxzbyBhcHBsaWVzIHN5bm9ueW1zIGZyb20gc3lub255bXMudHh0LiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZW4iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGluIHRoaXMgZXhhbXBsZSwgd2Ugd2lsbCBvbmx5IHVzZSBzeW5vbnltcyBhdCBxdWVyeSB0aW1lCisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJpbmRleF9zeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0iZmFsc2UiLz4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0gQ2FzZSBpbnNlbnNpdGl2ZSBzdG9wIHdvcmQgcmVtb3ZhbC4KKyAgICAgICAgICBhZGQgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPXRydWUgaW4gYm90aCB0aGUgaW5kZXggYW5kIHF1ZXJ5CisgICAgICAgICAgYW5hbHl6ZXJzIHRvIGxlYXZlIGEgJ2dhcCcgZm9yIG1vcmUgYWNjdXJhdGUgcGhyYXNlIHF1ZXJpZXMuCisgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U9InRydWUiCisgICAgICAgICAgICAgICAgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIKKyAgICAgICAgICAgICAgICBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisJPGZpbHRlciBjbGFzcz0ic29sci5FbmdsaXNoUG9zc2Vzc2l2ZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisJPCEtLSBPcHRpb25hbGx5IHlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBsZXNzIGFnZ3Jlc3NpdmUgc3RlbW1lciBpbnN0ZWFkIG9mIFBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5OgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKwktLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0ZXJTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJzeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U9InRydWUiCisgICAgICAgICAgICAgICAgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIKKyAgICAgICAgICAgICAgICBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisJPGZpbHRlciBjbGFzcz0ic29sci5FbmdsaXNoUG9zc2Vzc2l2ZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisJPCEtLSBPcHRpb25hbGx5IHlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBsZXNzIGFnZ3Jlc3NpdmUgc3RlbW1lciBpbnN0ZWFkIG9mIFBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5OgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKwktLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0ZXJTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gQSB0ZXh0IGZpZWxkIHdpdGggZGVmYXVsdHMgYXBwcm9wcmlhdGUgZm9yIEVuZ2xpc2gsIHBsdXMKKwkgYWdncmVzc2l2ZSB3b3JkLXNwbGl0dGluZyBhbmQgYXV0b3BocmFzZSBmZWF0dXJlcyBlbmFibGVkLgorCSBUaGlzIGZpZWxkIGlzIGp1c3QgbGlrZSB0ZXh0X2VuLCBleGNlcHQgaXQgYWRkcworCSBXb3JkRGVsaW1pdGVyRmlsdGVyIHRvIGVuYWJsZSBzcGxpdHRpbmcgYW5kIG1hdGNoaW5nIG9mCisJIHdvcmRzIG9uIGNhc2UtY2hhbmdlLCBhbHBoYSBudW1lcmljIGJvdW5kYXJpZXMsIGFuZAorCSBub24tYWxwaGFudW1lcmljIGNoYXJzLiAgVGhpcyBtZWFucyBjZXJ0YWluIGNvbXBvdW5kIHdvcmQKKwkgY2FzZXMgd2lsbCB3b3JrLCBmb3IgZXhhbXBsZSBxdWVyeSAid2kgZmkiIHdpbGwgbWF0Y2gKKwkgZG9jdW1lbnQgIldpRmkiIG9yICJ3aS1maSIuCisgICAgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9lbl9zcGxpdHRpbmciIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCIgYXV0b0dlbmVyYXRlUGhyYXNlUXVlcmllcz0idHJ1ZSI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gaW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIG9ubHkgdXNlIHN5bm9ueW1zIGF0IHF1ZXJ5IHRpbWUKKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TeW5vbnltRmlsdGVyRmFjdG9yeSIgc3lub255bXM9ImluZGV4X3N5bm9ueW1zLnR4dCIgaWdub3JlQ2FzZT0idHJ1ZSIgZXhwYW5kPSJmYWxzZSIvPgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBDYXNlIGluc2Vuc2l0aXZlIHN0b3Agd29yZCByZW1vdmFsLgorICAgICAgICAgIGFkZCBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9dHJ1ZSBpbiBib3RoIHRoZSBpbmRleCBhbmQgcXVlcnkKKyAgICAgICAgICBhbmFseXplcnMgdG8gbGVhdmUgYSAnZ2FwJyBmb3IgbW9yZSBhY2N1cmF0ZSBwaHJhc2UgcXVlcmllcy4KKyAgICAgICAgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiCisgICAgICAgICAgICAgICAgaWdub3JlQ2FzZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZW4udHh0IgorICAgICAgICAgICAgICAgIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLldvcmREZWxpbWl0ZXJGaWx0ZXJGYWN0b3J5IiBnZW5lcmF0ZVdvcmRQYXJ0cz0iMSIgZ2VuZXJhdGVOdW1iZXJQYXJ0cz0iMSIgY2F0ZW5hdGVXb3Jkcz0iMSIgY2F0ZW5hdGVOdW1iZXJzPSIxIiBjYXRlbmF0ZUFsbD0iMCIgc3BsaXRPbkNhc2VDaGFuZ2U9IjEiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuS2V5d29yZE1hcmtlckZpbHRlckZhY3RvcnkiIHByb3RlY3RlZD0icHJvdHdvcmRzLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgICAgPGFuYWx5emVyIHR5cGU9InF1ZXJ5Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBpZ25vcmVDYXNlPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19lbi50eHQiCisgICAgICAgICAgICAgICAgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuV29yZERlbGltaXRlckZpbHRlckZhY3RvcnkiIGdlbmVyYXRlV29yZFBhcnRzPSIxIiBnZW5lcmF0ZU51bWJlclBhcnRzPSIxIiBjYXRlbmF0ZVdvcmRzPSIwIiBjYXRlbmF0ZU51bWJlcnM9IjAiIGNhdGVuYXRlQWxsPSIwIiBzcGxpdE9uQ2FzZUNoYW5nZT0iMSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuUG9ydGVyU3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIExlc3MgZmxleGlibGUgbWF0Y2hpbmcsIGJ1dCBsZXNzIGZhbHNlIG1hdGNoZXMuICBQcm9iYWJseSBub3QgaWRlYWwgZm9yIHByb2R1Y3QgbmFtZXMsCisgICAgICAgICBidXQgbWF5IGJlIGdvb2QgZm9yIFNLVXMuICBDYW4gaW5zZXJ0IGRhc2hlcyBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHN0aWxsIG1hdGNoLiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZW5fc3BsaXR0aW5nX3RpZ2h0IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiIGF1dG9HZW5lcmF0ZVBocmFzZVF1ZXJpZXM9InRydWUiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJzeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0iZmFsc2UiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLldvcmREZWxpbWl0ZXJGaWx0ZXJGYWN0b3J5IiBnZW5lcmF0ZVdvcmRQYXJ0cz0iMCIgZ2VuZXJhdGVOdW1iZXJQYXJ0cz0iMCIgY2F0ZW5hdGVXb3Jkcz0iMSIgY2F0ZW5hdGVOdW1iZXJzPSIxIiBjYXRlbmF0ZUFsbD0iMCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5LZXl3b3JkTWFya2VyRmlsdGVyRmFjdG9yeSIgcHJvdGVjdGVkPSJwcm90d29yZHMudHh0Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRW5nbGlzaE1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIHRoaXMgZmlsdGVyIGNhbiByZW1vdmUgYW55IGR1cGxpY2F0ZSB0b2tlbnMgdGhhdCBhcHBlYXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gLSBzb21ldGltZXMKKyAgICAgICAgICAgICBwb3NzaWJsZSB3aXRoIFdvcmREZWxpbWl0ZXJGaWx0ZXIgaW4gY29uanVuY3RvbiB3aXRoIHN0ZW1taW5nLiAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5SZW1vdmVEdXBsaWNhdGVzVG9rZW5GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBKdXN0IGxpa2UgdGV4dF9nZW5lcmFsIGV4Y2VwdCBpdCByZXZlcnNlcyB0aGUgY2hhcmFjdGVycyBvZgorCSBlYWNoIHRva2VuLCB0byBlbmFibGUgbW9yZSBlZmZpY2llbnQgbGVhZGluZyB3aWxkY2FyZCBxdWVyaWVzLiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZ2VuZXJhbF9yZXYiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ic3RvcHdvcmRzLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5SZXZlcnNlZFdpbGRjYXJkRmlsdGVyRmFjdG9yeSIgd2l0aE9yaWdpbmFsPSJ0cnVlIgorICAgICAgICAgICBtYXhQb3NBc3Rlcmlzaz0iMyIgbWF4UG9zUXVlc3Rpb249IjIiIG1heEZyYWN0aW9uQXN0ZXJpc2s9IjAuMzMiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0icXVlcnkiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9InN0b3B3b3Jkcy50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBjaGFyRmlsdGVyICsgV2hpdGVzcGFjZVRva2VuaXplciAgLS0+CisgICAgPCEtLQorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9jaGFyX25vcm0iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCIgPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8Y2hhckZpbHRlciBjbGFzcz0ic29sci5NYXBwaW5nQ2hhckZpbHRlckZhY3RvcnkiIG1hcHBpbmc9Im1hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dCIvPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIC0tPgorCisgICAgPCEtLSBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIEtleXdvcmRUb2tlbml6ZXIgYWxvbmcKKyAgICAgICAgIFdpdGggdmFyaW91cyBUb2tlbkZpbHRlckZhY3RvcmllcyB0byBwcm9kdWNlIGEgc29ydGFibGUgZmllbGQKKyAgICAgICAgIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBzb21lIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSB0ZXh0CisgICAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImFscGhhT25seVNvcnQiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgc29ydE1pc3NpbmdMYXN0PSJ0cnVlIiBvbWl0Tm9ybXM9InRydWUiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8IS0tIEtleXdvcmRUb2tlbml6ZXIgZG9lcyBubyBhY3R1YWwgdG9rZW5pemluZywgc28gdGhlIGVudGlyZQorICAgICAgICAgICAgIGlucHV0IHN0cmluZyBpcyBwcmVzZXJ2ZWQgYXMgYSBzaW5nbGUgdG9rZW4KKyAgICAgICAgICAtLT4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIFRoZSBMb3dlckNhc2UgVG9rZW5GaWx0ZXIgZG9lcyB3aGF0IHlvdSBleHBlY3QsIHdoaWNoIGNhbiBiZQorICAgICAgICAgICAgIHdoZW4geW91IHdhbnQgeW91ciBzb3J0aW5nIHRvIGJlIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgICAgICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5IiAvPgorICAgICAgICA8IS0tIFRoZSBUcmltRmlsdGVyIHJlbW92ZXMgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5UcmltRmlsdGVyRmFjdG9yeSIgLz4KKyAgICAgICAgPCEtLSBUaGUgUGF0dGVyblJlcGxhY2VGaWx0ZXIgZ2l2ZXMgeW91IHRoZSBmbGV4aWJpbGl0eSB0byB1c2UKKyAgICAgICAgICAgICBKYXZhIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byByZXBsYWNlIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgbWF0Y2hpbmcgYSBwYXR0ZXJuIHdpdGggYW4gYXJiaXRyYXJ5IHJlcGxhY2VtZW50IHN0cmluZywgCisgICAgICAgICAgICAgd2hpY2ggbWF5IGluY2x1ZGUgYmFjayByZWZlcmVuY2VzIHRvIHBvcnRpb25zIG9mIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuLgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIFNlZSB0aGUgSmF2YSBSZWd1bGFyIEV4cHJlc3Npb24gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQorICAgICAgICAgICAgIGluZm9ybWF0aW9uIG9uIHBhdHRlcm4gYW5kIHJlcGxhY2VtZW50IHN0cmluZyBzeW50YXguCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNi4wL2RvY3MvYXBpL2phdmEvdXRpbC9yZWdleC9wYWNrYWdlLXN1bW1hcnkuaHRtbAorICAgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBhdHRlcm5SZXBsYWNlRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBwYXR0ZXJuPSIoW15hLXpdKSIgcmVwbGFjZW1lbnQ9IiIgcmVwbGFjZT0iYWxsIgorICAgICAgICAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8ZmllbGR0eXBlIG5hbWU9InBob25ldGljIiBzdG9yZWQ9ImZhbHNlIiBpbmRleGVkPSJ0cnVlIiBjbGFzcz0ic29sci5UZXh0RmllbGQiID4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Eb3VibGVNZXRhcGhvbmVGaWx0ZXJGYWN0b3J5IiBpbmplY3Q9ImZhbHNlIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGR0eXBlPgorCisgICAgPGZpZWxkdHlwZSBuYW1lPSJwYXlsb2FkcyIgc3RvcmVkPSJmYWxzZSIgaW5kZXhlZD0idHJ1ZSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiA+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuV2hpdGVzcGFjZVRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLQorICAgICAgICBUaGUgRGVsaW1pdGVkUGF5bG9hZFRva2VuRmlsdGVyIGNhbiBwdXQgcGF5bG9hZHMgb24gdG9rZW5zLi4uIGZvciBleGFtcGxlLAorICAgICAgICBhIHRva2VuIG9mICJmb298MS40IiAgd291bGQgYmUgaW5kZXhlZCBhcyAiZm9vIiB3aXRoIGEgcGF5bG9hZCBvZiAxLjRmCisgICAgICAgIEF0dHJpYnV0ZXMgb2YgdGhlIERlbGltaXRlZFBheWxvYWRUb2tlbkZpbHRlckZhY3RvcnkgOiAKKyAgICAgICAgICJkZWxpbWl0ZXIiIC0gYSBvbmUgY2hhcmFjdGVyIGRlbGltaXRlci4gRGVmYXVsdCBpcyB8IChwaXBlKQorCSAiZW5jb2RlciIgLSBob3cgdG8gZW5jb2RlIHRoZSBmb2xsb3dpbmcgdmFsdWUgaW50byBhIHBsYXlsb2FkCisJICAgIGZsb2F0IC0+IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnBheWxvYWRzLkZsb2F0RW5jb2RlciwKKwkgICAgaW50ZWdlciAtPiBvLmEubC5hLnAuSW50ZWdlckVuY29kZXIKKwkgICAgaWRlbnRpdHkgLT4gby5hLmwuYS5wLklkZW50aXR5RW5jb2RlcgorICAgICAgICAgICAgRnVsbHkgUXVhbGlmaWVkIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIFBheWxvYWRFbmNvZGVyLCBFbmNvZGVyIG11c3QgaGF2ZSBhIG5vIGFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkRlbGltaXRlZFBheWxvYWRUb2tlbkZpbHRlckZhY3RvcnkiIGVuY29kZXI9ImZsb2F0Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGR0eXBlPgorCisgICAgPCEtLSBsb3dlcmNhc2VzIHRoZSBlbnRpcmUgZmllbGQgdmFsdWUsIGtlZXBpbmcgaXQgYXMgYSBzaW5nbGUgdG9rZW4uICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9Imxvd2VyY2FzZSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiIC8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSAKKyAgICAgIEV4YW1wbGUgb2YgdXNpbmcgUGF0aEhpZXJhcmNoeVRva2VuaXplckZhY3RvcnkgYXQgaW5kZXggdGltZSwgc28KKyAgICAgIHF1ZXJpZXMgZm9yIHBhdGhzIG1hdGNoIGRvY3VtZW50cyBhdCB0aGF0IHBhdGgsIG9yIGluIGRlc2NlbmRlbnQgcGF0aHMKKyAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImRlc2NlbmRlbnRfcGF0aCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJpbmRleCI+CisJPHRva2VuaXplciBjbGFzcz0ic29sci5QYXRoSGllcmFyY2h5VG9rZW5pemVyRmFjdG9yeSIgZGVsaW1pdGVyPSIvIiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisJPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgPCEtLSAKKyAgICAgIEV4YW1wbGUgb2YgdXNpbmcgUGF0aEhpZXJhcmNoeVRva2VuaXplckZhY3RvcnkgYXQgcXVlcnkgdGltZSwgc28KKyAgICAgIHF1ZXJpZXMgZm9yIHBhdGhzIG1hdGNoIGRvY3VtZW50cyBhdCB0aGF0IHBhdGgsIG9yIGluIGFuY2VzdG9yIHBhdGhzCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJhbmNlc3Rvcl9wYXRoIiBjbGFzcz0ic29sci5UZXh0RmllbGQiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKwk8dG9rZW5pemVyIGNsYXNzPSJzb2xyLktleXdvcmRUb2tlbml6ZXJGYWN0b3J5IiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisJPHRva2VuaXplciBjbGFzcz0ic29sci5QYXRoSGllcmFyY2h5VG9rZW5pemVyRmFjdG9yeSIgZGVsaW1pdGVyPSIvIiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gc2luY2UgZmllbGRzIG9mIHRoaXMgdHlwZSBhcmUgYnkgZGVmYXVsdCBub3Qgc3RvcmVkIG9yIGluZGV4ZWQsCisgICAgICAgICBhbnkgZGF0YSBhZGRlZCB0byB0aGVtIHdpbGwgYmUgaWdub3JlZCBvdXRyaWdodC4gIC0tPiAKKyAgICA8ZmllbGR0eXBlIG5hbWU9Imlnbm9yZWQiIHN0b3JlZD0iZmFsc2UiIGluZGV4ZWQ9ImZhbHNlIiBtdWx0aVZhbHVlZD0idHJ1ZSIgY2xhc3M9InNvbHIuU3RyRmllbGQiIC8+CisKKyAgICA8IS0tIFRoaXMgcG9pbnQgdHlwZSBpbmRleGVzIHRoZSBjb29yZGluYXRlcyBhcyBzZXBhcmF0ZSBmaWVsZHMgKHN1YkZpZWxkcykKKyAgICAgIElmIHN1YkZpZWxkVHlwZSBpcyBkZWZpbmVkLCBpdCByZWZlcmVuY2VzIGEgdHlwZSwgYW5kIGEgZHluYW1pYyBmaWVsZAorICAgICAgZGVmaW5pdGlvbiBpcyBjcmVhdGVkIG1hdGNoaW5nICpfX188dHlwZW5hbWU+LiAgQWx0ZXJuYXRlbHksIGlmIAorICAgICAgc3ViRmllbGRTdWZmaXggaXMgZGVmaW5lZCwgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgc3ViRmllbGRzLgorICAgICAgRXhhbXBsZTogaWYgc3ViRmllbGRUeXBlPSJkb3VibGUiLCB0aGVuIHRoZSBjb29yZGluYXRlcyB3b3VsZCBiZQorICAgICAgICBpbmRleGVkIGluIGZpZWxkcyBteWxvY18wX19fZG91YmxlLG15bG9jXzFfX19kb3VibGUuCisgICAgICBFeGFtcGxlOiBpZiBzdWJGaWVsZFN1ZmZpeD0iX2QiIHRoZW4gdGhlIGNvb3JkaW5hdGVzIHdvdWxkIGJlIGluZGV4ZWQKKyAgICAgICAgaW4gZmllbGRzIG15bG9jXzBfZCxteWxvY18xX2QKKyAgICAgIFRoZSBzdWJGaWVsZHMgYXJlIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGUgZmllbGRUeXBlLCBhbmQgZW5kCisgICAgICB1c2VycyBub3JtYWxseSBzaG91bGQgbm90IG5lZWQgdG8ga25vdyBhYm91dCB0aGVtLgorICAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBvaW50IiBjbGFzcz0ic29sci5Qb2ludFR5cGUiIGRpbWVuc2lvbj0iMiIgc3ViRmllbGRTdWZmaXg9Il9kIi8+CisKKyAgICA8IS0tIEEgc3BlY2lhbGl6ZWQgZmllbGQgZm9yIGdlb3NwYXRpYWwgc2VhcmNoLiBJZiBpbmRleGVkLCB0aGlzIGZpZWxkVHlwZSBtdXN0IG5vdCBiZSBtdWx0aXZhbHVlZC4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb2NhdGlvbiIgY2xhc3M9InNvbHIuTGF0TG9uVHlwZSIgc3ViRmllbGRTdWZmaXg9Il9jb29yZGluYXRlIi8+CisKKyAgICA8IS0tIEFuIGFsdGVybmF0aXZlIGdlb3NwYXRpYWwgZmllbGQgdHlwZSBuZXcgdG8gU29sciA0LiAgSXQgc3VwcG9ydHMgbXVsdGlWYWx1ZWQgYW5kIHBvbHlnb24gc2hhcGVzLgorICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhbmQgb3RoZXIgU3BhdGlhbCBmaWVsZHMgbmV3IHRvIFNvbHIgNCwgc2VlOgorICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NvbHJBZGFwdGVyc0Zvckx1Y2VuZVNwYXRpYWw0CisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb2NhdGlvbl9ycHQiIGNsYXNzPSJzb2xyLlNwYXRpYWxSZWN1cnNpdmVQcmVmaXhUcmVlRmllbGRUeXBlIgorICAgICAgICBnZW89InRydWUiIGRpc3RFcnJQY3Q9IjAuMDI1IiBtYXhEaXN0RXJyPSIwLjAwMDAwOSIgdW5pdHM9ImRlZ3JlZXMiIC8+CisKKyAgIDwhLS0gTW9uZXkvY3VycmVuY3kgZmllbGQgdHlwZS4gU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Nb25leUZpZWxkVHlwZQorICAgICAgICBQYXJhbWV0ZXJzOgorICAgICAgICAgIGRlZmF1bHRDdXJyZW5jeTogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGN1cnJlbmN5IGlmIG5vbmUgc3BlY2lmaWVkLiBEZWZhdWx0cyB0byAiVVNEIgorICAgICAgICAgIHByZWNpc2lvblN0ZXA6ICAgU3BlY2lmaWVzIHRoZSBwcmVjaXNpb25TdGVwIGZvciB0aGUgVHJpZUxvbmcgZmllbGQgdXNlZCBmb3IgdGhlIGFtb3VudAorICAgICAgICAgIHByb3ZpZGVyQ2xhc3M6ICAgTGV0cyB5b3UgcGx1ZyBpbiBvdGhlciBleGNoYW5nZSBwcm92aWRlciBiYWNrZW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc29sci5GaWxlRXhjaGFuZ2VSYXRlUHJvdmlkZXIgaXMgdGhlIGRlZmF1bHQgYW5kIHRha2VzIG9uZSBwYXJhbWV0ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29uZmlnOiBuYW1lIG9mIGFuIHhtbCBmaWxlIGhvbGRpbmcgZXhjaGFuZ2UgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbHIuT3BlbkV4Y2hhbmdlUmF0ZXNPcmdQcm92aWRlciB1c2VzIHJhdGVzIGZyb20gb3BlbmV4Y2hhbmdlcmF0ZXMub3JnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc0ZpbGVMb2NhdGlvbjogVVJMIG9yIHBhdGggdG8gcmF0ZXMgSlNPTiBmaWxlIChkZWZhdWx0IGxhdGVzdC5qc29uIG9uIHRoZSB3ZWIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hJbnRlcnZhbDogTnVtYmVyIG9mIG1pbnV0ZXMgYmV0d2VlbiBlYWNoIHJhdGVzIGZldGNoIChkZWZhdWx0OiAxNDQwLCBtaW46IDYwKQorICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJjdXJyZW5jeSIgY2xhc3M9InNvbHIuQ3VycmVuY3lGaWVsZCIgcHJlY2lzaW9uU3RlcD0iOCIgZGVmYXVsdEN1cnJlbmN5PSJVU0QiIGN1cnJlbmN5Q29uZmlnPSJjdXJyZW5jeS54bWwiIC8+CisgICAgICAgICAgICAgCisKKworICAgPCEtLSBzb21lIGV4YW1wbGVzIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzIChnZW5lcmFsbHkgb3JkZXJlZCBieSBJU08gY29kZSkgLS0+CisKKyAgICA8IS0tIEFyYWJpYyAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfYXIiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGZvciBhbnkgbm9uLWFyYWJpYyAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19hci50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZXMg77uvIHRvIO+7sSwgZXRjIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkFyYWJpY05vcm1hbGl6YXRpb25GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuQXJhYmljU3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIEJ1bGdhcmlhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfYmciIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPiAKKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19iZy50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkJ1bGdhcmlhblN0ZW1GaWx0ZXJGYWN0b3J5Ii8+ICAgICAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIENhdGFsYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2NhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGwnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19jYS50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19jYS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkNhdGFsYW4iLz4gICAgICAgCisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gQ0pLIGJpZ3JhbSAoc2VlIHRleHRfamEgZm9yIGEgSmFwYW5lc2UgY29uZmlndXJhdGlvbiB1c2luZyBtb3JwaG9sb2dpY2FsIGFuYWx5c2lzKSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfY2prIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZSB3aWR0aCBiZWZvcmUgYmlncmFtLCBhcyBlLmcuIGhhbGYtd2lkdGggZGFrdXRlbiBjb21iaW5lICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DSktXaWR0aEZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBmb3IgYW55IG5vbi1DSksgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkNKS0JpZ3JhbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIEN6ZWNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9jeiIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfY3oudHh0IiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DemVjaFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+ICAgICAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIERhbmlzaCAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZGEiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2RhLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iRGFuaXNoIi8+ICAgICAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEdlcm1hbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZGUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2RlLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR2VybWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5HZXJtYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLkdlcm1hbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgICAgPCEtLSBtb3JlIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iR2VybWFuMiIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBHcmVlayAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZWwiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGdyZWVrIHNwZWNpZmljIGxvd2VyY2FzZSBmb3Igc2lnbWEgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR3JlZWtMb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9ImZhbHNlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZWwudHh0IiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5HcmVla1N0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gU3BhbmlzaCAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZXMiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VzLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3BhbmlzaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBtb3JlIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iU3BhbmlzaCIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBCYXNxdWUgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2V1IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19ldS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkJhc3F1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFBlcnNpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2ZhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8IS0tIGZvciBaV05KIC0tPgorICAgICAgICA8Y2hhckZpbHRlciBjbGFzcz0ic29sci5QZXJzaWFuQ2hhckZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuQXJhYmljTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5QZXJzaWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2ZhLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gRmlubmlzaCAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZmkiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2ZpLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iRmlubmlzaCIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5GaW5uaXNoTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBGcmVuY2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2ZyIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGwnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19mci50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19mci50eHQiIGZvcm1hdD0ic25vd2JhbGwiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkZyZW5jaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBsZXNzIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuRnJlbmNoTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgICA8IS0tIG1vcmUgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJGcmVuY2giLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSXJpc2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGQnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19nYS50eHQiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIG4tLCBldGMuIHBvc2l0aW9uIGluY3JlbWVudHMgaXMgaW50ZW50aW9uYWxseSBmYWxzZSEgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL2h5cGhlbmF0aW9uc19nYS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0iZmFsc2UiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5JcmlzaExvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2dhLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iSXJpc2giLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBHYWxpY2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZ2wiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2dsLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR2FsaWNpYW5TdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5HYWxpY2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBIaW5kaSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaGkiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBub3JtYWxpemVzIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSW5kaWNOb3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZXMgdmFyaWF0aW9uIGluIHNwZWxsaW5nIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkhpbmRpTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2hpLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSGluZGlTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEh1bmdhcmlhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaHUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2h1LnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iSHVuZ2FyaWFuIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLkh1bmdhcmlhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+ICAgCisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gQXJtZW5pYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2h5IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19oeS50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkFybWVuaWFuIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSW5kb25lc2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaWQiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2lkLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDwhLS0gZm9yIGEgbGVzcyBhZ2dyZXNzaXZlIGFwcHJvYWNoIChvbmx5IGluZmxlY3Rpb25hbCBzdWZmaXhlcyksIHNldCBzdGVtRGVyaXZhdGlvbmFsIHRvIGZhbHNlIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkluZG9uZXNpYW5TdGVtRmlsdGVyRmFjdG9yeSIgc3RlbURlcml2YXRpb25hbD0idHJ1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEl0YWxpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2l0IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGwnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19pdC50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19pdC50eHQiIGZvcm1hdD0ic25vd2JhbGwiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkl0YWxpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbW9yZSBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9Ikl0YWxpYW4iLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSmFwYW5lc2UgdXNpbmcgbW9ycGhvbG9naWNhbCBhbmFseXNpcyAoc2VlIHRleHRfY2prIGZvciBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgYmlncmFtbWluZykKKworICAgICAgICAgTk9URTogSWYgeW91IHdhbnQgdG8gb3B0aW1pemUgc2VhcmNoIGZvciBwcmVjaXNpb24sIHVzZSBkZWZhdWx0IG9wZXJhdG9yIEFORCBpbiB5b3VyIHF1ZXJ5CisgICAgICAgICBwYXJzZXIgY29uZmlnIHdpdGggPHNvbHJRdWVyeVBhcnNlciBkZWZhdWx0T3BlcmF0b3I9IkFORCIvPiBmdXJ0aGVyIGRvd24gaW4gdGhpcyBmaWxlLiAgVXNlIAorICAgICAgICAgT1IgaWYgeW91IHdvdWxkIGxpa2UgdG8gb3B0aW1pemUgZm9yIHJlY2FsbCAoZGVmYXVsdCkuCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2phIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiIGF1dG9HZW5lcmF0ZVBocmFzZVF1ZXJpZXM9ImZhbHNlIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgIDwhLS0gS3Vyb21vamkgSmFwYW5lc2UgbW9ycGhvbG9naWNhbCBhbmFseXplci90b2tlbml6ZXIgKEphcGFuZXNlVG9rZW5pemVyKQorCisgICAgICAgICAgIEt1cm9tb2ppIGhhcyBhIHNlYXJjaCBtb2RlIChkZWZhdWx0KSB0aGF0IGRvZXMgc2VnbWVudGF0aW9uIHVzZWZ1bCBmb3Igc2VhcmNoLiAgQSBoZXVyaXN0aWMKKyAgICAgICAgICAgaXMgdXNlZCB0byBzZWdtZW50IGNvbXBvdW5kcyBpbnRvIGl0cyBwYXJ0cyBhbmQgdGhlIGNvbXBvdW5kIGl0c2VsZiBpcyBrZXB0IGFzIHN5bm9ueW0uCisKKyAgICAgICAgICAgVmFsaWQgdmFsdWVzIGZvciBhdHRyaWJ1dGUgbW9kZSBhcmU6CisgICAgICAgICAgICAgIG5vcm1hbDogcmVndWxhciBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgc2VhcmNoOiBzZWdtZW50YXRpb24gdXNlZnVsIGZvciBzZWFyY2ggd2l0aCBzeW5vbnltcyBjb21wb3VuZHMgKGRlZmF1bHQpCisgICAgICAgICAgICBleHRlbmRlZDogc2FtZSBhcyBzZWFyY2ggbW9kZSwgYnV0IHVuaWdyYW1zIHVua25vd24gd29yZHMgKGV4cGVyaW1lbnRhbCkKKworICAgICAgICAgICBGb3Igc29tZSBhcHBsaWNhdGlvbnMgaXQgbWlnaHQgYmUgZ29vZCB0byB1c2Ugc2VhcmNoIG1vZGUgZm9yIGluZGV4aW5nIGFuZCBub3JtYWwgbW9kZSBmb3IKKyAgICAgICAgICAgcXVlcmllcyB0byByZWR1Y2UgcmVjYWxsIGFuZCBwcmV2ZW50IHBhcnRzIG9mIGNvbXBvdW5kcyBmcm9tIGJlaW5nIG1hdGNoZWQgYW5kIGhpZ2hsaWdodGVkLgorICAgICAgICAgICBVc2UgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4gYW5kIDxhbmFseXplciB0eXBlPSJxdWVyeSI+IGZvciB0aGlzIGFuZCBtb2RlIG5vcm1hbCBpbiBxdWVyeS4KKworICAgICAgICAgICBLdXJvbW9qaSBhbHNvIGhhcyBhIGNvbnZlbmllbnQgdXNlciBkaWN0aW9uYXJ5IGZlYXR1cmUgdGhhdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgc3RhdGlzdGljYWwKKyAgICAgICAgICAgbW9kZWwgd2l0aCB5b3VyIG93biBlbnRyaWVzIGZvciBzZWdtZW50YXRpb24sIHBhcnQtb2Ytc3BlZWNoIHRhZ3MgYW5kIHJlYWRpbmdzIHdpdGhvdXQgYSBuZWVkCisgICAgICAgICAgIHRvIHNwZWNpZnkgd2VpZ2h0cy4gIE5vdGljZSB0aGF0IHVzZXIgZGljdGlvbmFyaWVzIGhhdmUgbm90IGJlZW4gc3ViamVjdCB0byBleHRlbnNpdmUgdGVzdGluZy4KKworICAgICAgICAgICBVc2VyIGRpY3Rpb25hcnkgYXR0cmlidXRlcyBhcmU6CisgICAgICAgICAgICAgICAgICAgICB1c2VyRGljdGlvbmFyeTogdXNlciBkaWN0aW9uYXJ5IGZpbGVuYW1lCisgICAgICAgICAgICAgdXNlckRpY3Rpb25hcnlFbmNvZGluZzogdXNlciBkaWN0aW9uYXJ5IGVuY29kaW5nIChkZWZhdWx0IGlzIFVURi04KQorCisgICAgICAgICAgIFNlZSBsYW5nL3VzZXJkaWN0X2phLnR4dCBmb3IgYSBzYW1wbGUgdXNlciBkaWN0aW9uYXJ5IGZpbGUuCisKKyAgICAgICAgICAgUHVuY3R1YXRpb24gY2hhcmFjdGVycyBhcmUgZGlzY2FyZGVkIGJ5IGRlZmF1bHQuICBVc2UgZGlzY2FyZFB1bmN0dWF0aW9uPSJmYWxzZSIgdG8ga2VlcCB0aGVtLgorCisgICAgICAgICAgIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvSmFwYW5lc2VMYW5ndWFnZVN1cHBvcnQgZm9yIG1vcmUgb24gSmFwYW5lc2UgbGFuZ3VhZ2Ugc3VwcG9ydC4KKyAgICAgICAgLS0+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VUb2tlbml6ZXJGYWN0b3J5IiBtb2RlPSJzZWFyY2giLz4KKyAgICAgICAgPCEtLTx0b2tlbml6ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VUb2tlbml6ZXJGYWN0b3J5IiBtb2RlPSJzZWFyY2giIHVzZXJEaWN0aW9uYXJ5PSJsYW5nL3VzZXJkaWN0X2phLnR4dCIvPi0tPgorICAgICAgICA8IS0tIFJlZHVjZXMgaW5mbGVjdGVkIHZlcmJzIGFuZCBhZGplY3RpdmVzIHRvIHRoZWlyIGJhc2UvZGljdGlvbmFyeSBmb3JtcyAo6L6e5pu45b2iKSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5KYXBhbmVzZUJhc2VGb3JtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIFJlbW92ZXMgdG9rZW5zIHdpdGggY2VydGFpbiBwYXJ0LW9mLXNwZWVjaCB0YWdzIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkphcGFuZXNlUGFydE9mU3BlZWNoU3RvcEZpbHRlckZhY3RvcnkiIHRhZ3M9Imxhbmcvc3RvcHRhZ3NfamEudHh0IiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPCEtLSBOb3JtYWxpemVzIGZ1bGwtd2lkdGggcm9tYWppIHRvIGhhbGYtd2lkdGggYW5kIGhhbGYtd2lkdGgga2FuYSB0byBmdWxsLXdpZHRoIChVbmljb2RlIE5GS0Mgc3Vic2V0KSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DSktXaWR0aEZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBSZW1vdmVzIGNvbW1vbiB0b2tlbnMgdHlwaWNhbGx5IG5vdCB1c2VmdWwgZm9yIHNlYXJjaCwgYnV0IGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gcmFua2luZyAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2phLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIiAvPgorICAgICAgICA8IS0tIE5vcm1hbGl6ZXMgY29tbW9uIGthdGFrYW5hIHNwZWxsaW5nIHZhcmlhdGlvbnMgYnkgcmVtb3ZpbmcgYW55IGxhc3QgbG9uZyBzb3VuZCBjaGFyYWN0ZXIgKFUrMzBGQykgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VLYXRha2FuYVN0ZW1GaWx0ZXJGYWN0b3J5IiBtaW5pbXVtTGVuZ3RoPSI0Ii8+CisgICAgICAgIDwhLS0gTG93ZXItY2FzZXMgcm9tYWppIGNoYXJhY3RlcnMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIExhdHZpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2x2IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19sdi50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxhdHZpYW5TdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIER1dGNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9ubCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfbmwudHh0IiBmb3JtYXQ9InNub3diYWxsIiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdGVtbWVyT3ZlcnJpZGVGaWx0ZXJGYWN0b3J5IiBkaWN0aW9uYXJ5PSJsYW5nL3N0ZW1kaWN0X25sLnR4dCIgaWdub3JlQ2FzZT0iZmFsc2UiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJEdXRjaCIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIE5vcndlZ2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfbm8iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX25vLnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iTm9yd2VnaWFuIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICAgIDwhLS0gc2luZ3VsYXIvcGx1cmFsOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBQb3J0dWd1ZXNlIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9wdCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfcHQudHh0IiBmb3JtYXQ9InNub3diYWxsIiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0dWd1ZXNlTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0dWd1ZXNlTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgICA8IS0tIG1vcmUgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJQb3J0dWd1ZXNlIi8+IC0tPgorICAgICAgICA8IS0tIG1vc3QgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0dWd1ZXNlU3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gUm9tYW5pYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3JvIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19yby50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IlJvbWFuaWFuIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gUnVzc2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfcnUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX3J1LnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iUnVzc2lhbiIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5SdXNzaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBTd2VkaXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9zdiIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfc3YudHh0IiBmb3JtYXQ9InNub3diYWxsIiBlbmFibGVQb3NpdGlvbkluY3JlbWVudHM9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJTd2VkaXNoIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN3ZWRpc2hMaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFRoYWkgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3RoIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuVGhhaVdvcmRGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc190aC50eHQiIGVuYWJsZVBvc2l0aW9uSW5jcmVtZW50cz0idHJ1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFR1cmtpc2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3RyIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5UdXJraXNoTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJmYWxzZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX3RyLnR4dCIgZW5hYmxlUG9zaXRpb25JbmNyZW1lbnRzPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iVHVya2lzaCIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworIDwvdHlwZXM+CisgIAorICA8IS0tIFNpbWlsYXJpdHkgaXMgdGhlIHNjb3Jpbmcgcm91dGluZSBmb3IgZWFjaCBkb2N1bWVudCB2cy4gYSBxdWVyeS4KKyAgICAgICBBIGN1c3RvbSBTaW1pbGFyaXR5IG9yIFNpbWlsYXJpdHlGYWN0b3J5IG1heSBiZSBzcGVjaWZpZWQgaGVyZSwgYnV0IAorICAgICAgIHRoZSBkZWZhdWx0IGlzIGZpbmUgZm9yIG1vc3QgYXBwbGljYXRpb25zLiAgCisgICAgICAgRm9yIG1vcmUgaW5mbzogaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NjaGVtYVhtbCNTaW1pbGFyaXR5CisgICAgLS0+CisgIDwhLS0KKyAgICAgPHNpbWlsYXJpdHkgY2xhc3M9ImNvbS5leGFtcGxlLnNvbHIuQ3VzdG9tU2ltaWxhcml0eUZhY3RvcnkiPgorICAgICAgIDxzdHIgbmFtZT0icGFyYW1rZXkiPnBhcmFtIHZhbHVlPC9zdHI+CisgICAgIDwvc2ltaWxhcml0eT4KKyAgICAtLT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zY3JpcHRzLmNvbmYgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zY3JpcHRzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4YjI2MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3NjcmlwdHMuY29uZgpAQCAtMCwwICsxLDI0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZXI9Citzb2xyX2hvc3RuYW1lPWxvY2FsaG9zdAorc29scl9wb3J0PTg5ODMKK3JzeW5jZF9wb3J0PTE4OTgzCitkYXRhX2Rpcj0KK3dlYmFwcF9uYW1lPXNvbHIKK21hc3Rlcl9ob3N0PQorbWFzdGVyX2RhdGFfZGlyPQorbWFzdGVyX3N0YXR1c19kaXI9CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zb2xyY29uZmlnLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3NvbHJjb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjAzOWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zb2xyY29uZmlnLnhtbApAQCAtMCwwICsxLDE4NzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIAorICAgICBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IGNvbmZpZ3VyYXRpb25zIG9wdGlvbnMgdGhhdCBtYXkgYXBwZWFyIGluCisgICAgIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Tb2xyQ29uZmlnWG1sLiAKKy0tPgorPGNvbmZpZz4KKyAgPCEtLSBJbiBhbGwgY29uZmlndXJhdGlvbiBiZWxvdywgYSBwcmVmaXggb2YgInNvbHIuIiBmb3IgY2xhc3MgbmFtZXMKKyAgICAgICBpcyBhbiBhbGlhcyB0aGF0IGNhdXNlcyBzb2xyIHRvIHNlYXJjaCBhcHByb3ByaWF0ZSBwYWNrYWdlcywKKyAgICAgICBpbmNsdWRpbmcgb3JnLmFwYWNoZS5zb2xyLihzZWFyY2h8dXBkYXRlfHJlcXVlc3R8Y29yZXxhbmFseXNpcykKKworICAgICAgIFlvdSBtYXkgYWxzbyBzcGVjaWZ5IGEgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3NuYW1lIGlmIHlvdQorICAgICAgIGhhdmUgeW91ciBvd24gY3VzdG9tIHBsdWdpbnMuCisgICAgLS0+CisKKyAgPCEtLSBDb250cm9scyB3aGF0IHZlcnNpb24gb2YgTHVjZW5lIHZhcmlvdXMgY29tcG9uZW50cyBvZiBTb2xyCisgICAgICAgYWRoZXJlIHRvLiAgR2VuZXJhbGx5LCB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIHRvCisgICAgICAgZ2V0IGFsbCBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkCisgICAgICAgdGhhdCB5b3UgZnVsbHkgcmUtaW5kZXggYWZ0ZXIgY2hhbmdpbmcgdGhpcyBzZXR0aW5nIGFzIGl0IGNhbgorICAgICAgIGFmZmVjdCBib3RoIGhvdyB0ZXh0IGlzIGluZGV4ZWQgYW5kIHF1ZXJpZWQuCisgIC0tPgorICA8bHVjZW5lTWF0Y2hWZXJzaW9uPjQuNzwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorCisgIDwhLS0gPGxpYi8+IGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgdG8gaW5zdHJ1Y3QgU29sciB0byBsb2FkIGFuIEphcnMKKyAgICAgICBpZGVudGlmaWVkIGFuZCB1c2UgdGhlbSB0byByZXNvbHZlIGFueSAicGx1Z2lucyIgc3BlY2lmaWVkIGluCisgICAgICAgeW91ciBzb2xyY29uZmlnLnhtbCBvciBzY2hlbWEueG1sIChpZTogQW5hbHl6ZXJzLCBSZXF1ZXN0CisgICAgICAgSGFuZGxlcnMsIGV0Yy4uLikuCisKKyAgICAgICBBbGwgZGlyZWN0b3JpZXMgYW5kIHBhdGhzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICBpbnN0YW5jZURpci4KKworICAgICAgIFBsZWFzZSBub3RlIHRoYXQgPGxpYi8+IGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIKKyAgICAgICB0aGF0IHRoZXkgYXBwZWFyIGluIHlvdXIgc29scmNvbmZpZy54bWwgZmlsZSwgYW5kIGFyZSAic3RhY2tlZCIgCisgICAgICAgb24gdG9wIG9mIGVhY2ggb3RoZXIgd2hlbiBidWlsZGluZyBhIENsYXNzTG9hZGVyIC0gc28gaWYgeW91IGhhdmUgCisgICAgICAgcGx1Z2luIGphcnMgd2l0aCBkZXBlbmRlbmNpZXMgb24gb3RoZXIgamFycywgdGhlICJsb3dlciBsZXZlbCIgCisgICAgICAgZGVwZW5kZW5jeSBqYXJzIHNob3VsZCBiZSBsb2FkZWQgZmlyc3QuCisKKyAgICAgICBJZiBhICIuL2xpYiIgZGlyZWN0b3J5IGV4aXN0cyBpbiB5b3VyIGluc3RhbmNlRGlyLCBhbGwgZmlsZXMKKyAgICAgICBmb3VuZCBpbiBpdCBhcmUgaW5jbHVkZWQgYXMgaWYgeW91IGhhZCB1c2VkIHRoZSBmb2xsb3dpbmcKKyAgICAgICBzeW50YXguLi4KKyAgICAgICAKKyAgICAgICAgICAgICAgPGxpYiBkaXI9Ii4vbGliIiAvPgorICAgIC0tPgorCisgIDwhLS0gQSAnZGlyJyBvcHRpb24gYnkgaXRzZWxmIGFkZHMgYW55IGZpbGVzIGZvdW5kIGluIHRoZSBkaXJlY3RvcnkgCisgICAgICAgdG8gdGhlIGNsYXNzcGF0aCwgdGhpcyBpcyB1c2VmdWwgZm9yIGluY2x1ZGluZyBhbGwgamFycyBpbiBhCisgICAgICAgZGlyZWN0b3J5LgorCisgICAgICAgV2hlbiBhICdyZWdleCcgaXMgc3BlY2lmaWVkIGluIGFkZGl0aW9uIHRvIGEgJ2RpcicsIG9ubHkgdGhlCisgICAgICAgZmlsZXMgaW4gdGhhdCBkaXJlY3Rvcnkgd2hpY2ggY29tcGxldGVseSBtYXRjaCB0aGUgcmVnZXgKKyAgICAgICAoYW5jaG9yZWQgb24gYm90aCBlbmRzKSB3aWxsIGJlIGluY2x1ZGVkLgorCisgICAgICAgSWYgYSAnZGlyJyBvcHRpb24gKHdpdGggb3Igd2l0aG91dCBhIHJlZ2V4KSBpcyB1c2VkIGFuZCBub3RoaW5nCisgICAgICAgaXMgZm91bmQgdGhhdCBtYXRjaGVzLCBhIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQuCisKKyAgICAgICBUaGUgZXhhbXBsZXMgYmVsb3cgY2FuIGJlIHVzZWQgdG8gbG9hZCBzb21lIHNvbHItY29udHJpYnMgYWxvbmcgCisgICAgICAgd2l0aCB0aGVpciBleHRlcm5hbCBkZXBlbmRlbmNpZXMuCisgICAgLS0+CisgIDxsaWIgZGlyPSIuLi8uLi8uLi9jb250cmliL2V4dHJhY3Rpb24vbGliIiByZWdleD0iLipcLmphciIgLz4KKyAgPGxpYiBkaXI9Ii4uLy4uLy4uL2Rpc3QvIiByZWdleD0ic29sci1jZWxsLVxkLipcLmphciIgLz4KKworICA8bGliIGRpcj0iLi4vLi4vLi4vY29udHJpYi9jbHVzdGVyaW5nL2xpYi8iIHJlZ2V4PSIuKlwuamFyIiAvPgorICA8bGliIGRpcj0iLi4vLi4vLi4vZGlzdC8iIHJlZ2V4PSJzb2xyLWNsdXN0ZXJpbmctXGQuKlwuamFyIiAvPgorCisgIDxsaWIgZGlyPSIuLi8uLi8uLi9jb250cmliL2xhbmdpZC9saWIvIiByZWdleD0iLipcLmphciIgLz4KKyAgPGxpYiBkaXI9Ii4uLy4uLy4uL2Rpc3QvIiByZWdleD0ic29sci1sYW5naWQtXGQuKlwuamFyIiAvPgorCisgIDxsaWIgZGlyPSIuLi8uLi8uLi9jb250cmliL3ZlbG9jaXR5L2xpYiIgcmVnZXg9Ii4qXC5qYXIiIC8+CisgIDxsaWIgZGlyPSIuLi8uLi8uLi9kaXN0LyIgcmVnZXg9InNvbHItdmVsb2NpdHktXGQuKlwuamFyIiAvPgorCisgIDwhLS0gYW4gZXhhY3QgJ3BhdGgnIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSAnZGlyJyB0byBzcGVjaWZ5IGEgCisgICAgICAgc3BlY2lmaWMgamFyIGZpbGUuICBUaGlzIHdpbGwgY2F1c2UgYSBzZXJpb3VzIGVycm9yIHRvIGJlIGxvZ2dlZCAKKyAgICAgICBpZiBpdCBjYW4ndCBiZSBsb2FkZWQuCisgICAgLS0+CisgIDwhLS0KKyAgICAgPGxpYiBwYXRoPSIuLi9hLWphci10aGF0LWRvZXMtbm90LWV4aXN0LmphciIgLz4gCisgIC0tPgorICAKKyAgPCEtLSBEYXRhIERpcmVjdG9yeQorCisgICAgICAgVXNlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBkaXJlY3RvcnkgdG8gaG9sZCBhbGwgaW5kZXggZGF0YQorICAgICAgIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgLi9kYXRhIHVuZGVyIHRoZSBTb2xyIGhvbWUuICBJZgorICAgICAgIHJlcGxpY2F0aW9uIGlzIGluIHVzZSwgdGhpcyBzaG91bGQgbWF0Y2ggdGhlIHJlcGxpY2F0aW9uCisgICAgICAgY29uZmlndXJhdGlvbi4KKyAgICAtLT4KKyAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CisKKworICA8IS0tIFRoZSBEaXJlY3RvcnlGYWN0b3J5IHRvIHVzZSBmb3IgaW5kZXhlcy4KKyAgICAgICAKKyAgICAgICBzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeSBpcyBmaWxlc3lzdGVtCisgICAgICAgYmFzZWQgYW5kIHRyaWVzIHRvIHBpY2sgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50CisgICAgICAgSlZNIGFuZCBwbGF0Zm9ybS4gIHNvbHIuTlJUQ2FjaGluZ0RpcmVjdG9yeUZhY3RvcnksIHRoZSBkZWZhdWx0LAorICAgICAgIHdyYXBzIHNvbHIuU3RhbmRhcmREaXJlY3RvcnlGYWN0b3J5IGFuZCBjYWNoZXMgc21hbGwgZmlsZXMgaW4gbWVtb3J5CisgICAgICAgZm9yIGJldHRlciBOUlQgcGVyZm9ybWFuY2UuCisKKyAgICAgICBPbmUgY2FuIGZvcmNlIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiB2aWEgc29sci5NTWFwRGlyZWN0b3J5RmFjdG9yeSwKKyAgICAgICBzb2xyLk5JT0ZTRGlyZWN0b3J5RmFjdG9yeSwgb3Igc29sci5TaW1wbGVGU0RpcmVjdG9yeUZhY3RvcnkuCisKKyAgICAgICBzb2xyLlJBTURpcmVjdG9yeUZhY3RvcnkgaXMgbWVtb3J5IGJhc2VkLCBub3QKKyAgICAgICBwZXJzaXN0ZW50LCBhbmQgZG9lc24ndCB3b3JrIHdpdGggcmVwbGljYXRpb24uCisgICAgLS0+CisgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIAorICAgICAgICAgICAgICAgICAgICBjbGFzcz0iJHtzb2xyLmRpcmVjdG9yeUZhY3Rvcnk6c29sci5OUlRDYWNoaW5nRGlyZWN0b3J5RmFjdG9yeX0iPgorICAgIAorICAgICAgICAgCisgICAgPCEtLSBUaGVzZSB3aWxsIGJlIHVzZWQgaWYgeW91IGFyZSB1c2luZyB0aGUgc29sci5IZGZzRGlyZWN0b3J5RmFjdG9yeSwKKyAgICAgICAgIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgaWdub3JlZC4gSWYgeW91IGRvbid0IHBsYW4gb24gdXNpbmcgaGRmcywKKyAgICAgICAgIHlvdSBjYW4gc2FmZWx5IHJlbW92ZSB0aGlzIHNlY3Rpb24uIC0tPiAgICAgIAorICAgIDwhLS0gVGhlIHJvb3QgZGlyZWN0b3J5IHRoYXQgY29sbGVjdGlvbiBkYXRhIHNob3VsZCBiZSB3cml0dGVuIHRvLiAtLT4gICAgIAorICAgIDxzdHIgbmFtZT0ic29sci5oZGZzLmhvbWUiPiR7c29sci5oZGZzLmhvbWU6fTwvc3RyPgorICAgIDwhLS0gVGhlIGhhZG9vcCBjb25maWd1cmF0aW9uIGZpbGVzIHRvIHVzZSBmb3IgdGhlIGhkZnMgY2xpZW50LiAtLT4gICAgCisgICAgPHN0ciBuYW1lPSJzb2xyLmhkZnMuY29uZmRpciI+JHtzb2xyLmhkZnMuY29uZmRpcjp9PC9zdHI+CisgICAgPCEtLSBFbmFibGUvRGlzYWJsZSB0aGUgaGRmcyBjYWNoZS4gLS0+ICAgIAorICAgIDxzdHIgbmFtZT0ic29sci5oZGZzLmJsb2NrY2FjaGUuZW5hYmxlZCI+JHtzb2xyLmhkZnMuYmxvY2tjYWNoZS5lbmFibGVkOnRydWV9PC9zdHI+CisgICAgCisgIDwvZGlyZWN0b3J5RmFjdG9yeT4gCisKKyAgPCEtLSBUaGUgQ29kZWNGYWN0b3J5IGZvciBkZWZpbmluZyB0aGUgZm9ybWF0IG9mIHRoZSBpbnZlcnRlZCBpbmRleC4KKyAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBTY2hlbWFDb2RlY0ZhY3RvcnksIHdoaWNoIGlzIHRoZSBvZmZpY2lhbCBMdWNlbmUKKyAgICAgICBpbmRleCBmb3JtYXQsIGJ1dCBob29rcyBpbnRvIHRoZSBzY2hlbWEgdG8gcHJvdmlkZSBwZXItZmllbGQgY3VzdG9taXphdGlvbiBvZgorICAgICAgIHRoZSBwb3N0aW5ncyBsaXN0cyBhbmQgcGVyLWRvY3VtZW50IHZhbHVlcyBpbiB0aGUgZmllbGRUeXBlIGVsZW1lbnQKKyAgICAgICAocG9zdGluZ3NGb3JtYXQvZG9jVmFsdWVzRm9ybWF0KS4gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucworICAgICAgIGFyZSBleHBlcmltZW50YWwsIHNvIGlmIHlvdSBjaG9vc2UgdG8gY3VzdG9taXplIHRoZSBpbmRleCBmb3JtYXQsIGl0cyBhIGdvb2QKKyAgICAgICBpZGVhIHRvIGNvbnZlcnQgYmFjayB0byB0aGUgb2ZmaWNpYWwgZm9ybWF0IGUuZy4gdmlhIEluZGV4V3JpdGVyLmFkZEluZGV4ZXMoSW5kZXhSZWFkZXIpCisgICAgICAgYmVmb3JlIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVpbmRleGluZy4KKyAgLS0+CisgIDxjb2RlY0ZhY3RvcnkgY2xhc3M9InNvbHIuU2NoZW1hQ29kZWNGYWN0b3J5Ii8+CisKKyAgPCEtLSBUbyBlbmFibGUgZHluYW1pYyBzY2hlbWEgUkVTVCBBUElzLCB1c2UgdGhlIGZvbGxvd2luZyBmb3IgPHNjaGVtYUZhY3Rvcnk+OgorICAKKyAgICAgICA8c2NoZW1hRmFjdG9yeSBjbGFzcz0iTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeSI+CisgICAgICAgICA8Ym9vbCBuYW1lPSJtdXRhYmxlIj50cnVlPC9ib29sPgorICAgICAgICAgPHN0ciBuYW1lPSJtYW5hZ2VkU2NoZW1hUmVzb3VyY2VOYW1lIj5tYW5hZ2VkLXNjaGVtYTwvc3RyPgorICAgICAgIDwvc2NoZW1hRmFjdG9yeT4KKyAgICAgICAKKyAgICAgICBXaGVuIE1hbmFnZWRJbmRleFNjaGVtYUZhY3RvcnkgaXMgc3BlY2lmaWVkLCBTb2xyIHdpbGwgbG9hZCB0aGUgc2NoZW1hIGZyb20KKyAgICAgICBoZSByZXNvdXJjZSBuYW1lZCBpbiAnbWFuYWdlZFNjaGVtYVJlc291cmNlTmFtZScsIHJhdGhlciB0aGFuIGZyb20gc2NoZW1hLnhtbC4KKyAgICAgICBOb3RlIHRoYXQgdGhlIG1hbmFnZWQgc2NoZW1hIHJlc291cmNlIENBTk5PVCBiZSBuYW1lZCBzY2hlbWEueG1sLiAgSWYgdGhlIG1hbmFnZWQKKyAgICAgICBzY2hlbWEgZG9lcyBub3QgZXhpc3QsIFNvbHIgd2lsbCBjcmVhdGUgaXQgYWZ0ZXIgcmVhZGluZyBzY2hlbWEueG1sLCB0aGVuIHJlbmFtZQorICAgICAgICdzY2hlbWEueG1sJyB0byAnc2NoZW1hLnhtbC5iYWsnLiAKKyAgICAgICAKKyAgICAgICBEbyBOT1QgaGFuZCBlZGl0IHRoZSBtYW5hZ2VkIHNjaGVtYSAtIGV4dGVybmFsIG1vZGlmaWNhdGlvbnMgd2lsbCBiZSBpZ25vcmVkIGFuZAorICAgICAgIG92ZXJ3cml0dGVuIGFzIGEgcmVzdWx0IG9mIHNjaGVtYSBtb2RpZmljYXRpb24gUkVTVCBBUEkgY2FsbHMuCisKKyAgICAgICBXaGVuIE1hbmFnZWRJbmRleFNjaGVtYUZhY3RvcnkgaXMgc3BlY2lmaWVkIHdpdGggbXV0YWJsZSA9IHRydWUsIHNjaGVtYQorICAgICAgIG1vZGlmaWNhdGlvbiBSRVNUIEFQSSBjYWxscyB3aWxsIGJlIGFsbG93ZWQ7IG90aGVyd2lzZSwgZXJyb3IgcmVzcG9uc2VzIHdpbGwgYmUKKyAgICAgICBzZW50IGJhY2sgZm9yIHRoZXNlIHJlcXVlc3RzLiAKKyAgLS0+CisgIDxzY2hlbWFGYWN0b3J5IGNsYXNzPSJDbGFzc2ljSW5kZXhTY2hlbWFGYWN0b3J5Ii8+CisKKyAgPCEtLSB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAgICAgICBJbmRleCBDb25maWcgLSBUaGVzZSBzZXR0aW5ncyBjb250cm9sIGxvdy1sZXZlbCBiZWhhdmlvciBvZiBpbmRleGluZworICAgICAgIE1vc3QgZXhhbXBsZSBzZXR0aW5ncyBoZXJlIHNob3cgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCBhcmUgY29tbWVudGVkCisgICAgICAgb3V0LCB0byBtb3JlIGVhc2lseSBzZWUgd2hlcmUgY3VzdG9taXphdGlvbnMgaGF2ZSBiZWVuIG1hZGUuCisgICAgICAgCisgICAgICAgTm90ZTogVGhpcyByZXBsYWNlcyA8aW5kZXhEZWZhdWx0cz4gYW5kIDxtYWluSW5kZXg+IGZyb20gb2xkZXIgdmVyc2lvbnMKKyAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gLS0+CisgIDxpbmRleENvbmZpZz4KKyAgICA8IS0tIG1heEZpZWxkTGVuZ3RoIHdhcyByZW1vdmVkIGluIDQuMC4gVG8gZ2V0IHNpbWlsYXIgYmVoYXZpb3IsIGluY2x1ZGUgYSAKKyAgICAgICAgIExpbWl0VG9rZW5Db3VudEZpbHRlckZhY3RvcnkgaW4geW91ciBmaWVsZFR5cGUgZGVmaW5pdGlvbi4gRS5nLiAKKyAgICAgPGZpbHRlciBjbGFzcz0ic29sci5MaW1pdFRva2VuQ291bnRGaWx0ZXJGYWN0b3J5IiBtYXhUb2tlbkNvdW50PSIxMDAwMCIvPgorICAgIC0tPgorICAgIDwhLS0gTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGEgd3JpdGUgbG9jayAobXMpIGZvciBhbiBJbmRleFdyaXRlci4gRGVmYXVsdDogMTAwMCAtLT4KKyAgICA8IS0tIDx3cml0ZUxvY2tUaW1lb3V0PjEwMDA8L3dyaXRlTG9ja1RpbWVvdXQ+ICAtLT4KKworICAgIDwhLS0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB0aHJlYWRzIHRoYXQgbWF5IGJlCisgICAgICAgICBpbmRleGluZyBkb2N1bWVudHMgYXQgb25jZSBpbiBJbmRleFdyaXRlcjsgaWYgbW9yZSB0aGFuIHRoaXMKKyAgICAgICAgIG1hbnkgdGhyZWFkcyBhcnJpdmUgdGhleSB3aWxsIHdhaXQgZm9yIG90aGVycyB0byBmaW5pc2guCisgICAgICAgICBEZWZhdWx0IGluIFNvbHIvTHVjZW5lIGlzIDguIC0tPgorICAgIDwhLS0gPG1heEluZGV4aW5nVGhyZWFkcz44PC9tYXhJbmRleGluZ1RocmVhZHM+ICAtLT4KKworICAgIDwhLS0gRXhwZXJ0OiBFbmFibGluZyBjb21wb3VuZCBmaWxlIHdpbGwgdXNlIGxlc3MgZmlsZXMgZm9yIHRoZSBpbmRleCwgCisgICAgICAgICB1c2luZyBmZXdlciBmaWxlIGRlc2NyaXB0b3JzIG9uIHRoZSBleHBlbnNlIG9mIHBlcmZvcm1hbmNlIGRlY3JlYXNlLiAKKyAgICAgICAgIERlZmF1bHQgaW4gTHVjZW5lIGlzICJ0cnVlIi4gRGVmYXVsdCBpbiBTb2xyIGlzICJmYWxzZSIgKHNpbmNlIDMuNikgLS0+CisgICAgPCEtLSA8dXNlQ29tcG91bmRGaWxlPmZhbHNlPC91c2VDb21wb3VuZEZpbGU+IC0tPgorCisgICAgPCEtLSByYW1CdWZmZXJTaXplTUIgc2V0cyB0aGUgYW1vdW50IG9mIFJBTSB0aGF0IG1heSBiZSB1c2VkIGJ5IEx1Y2VuZQorICAgICAgICAgaW5kZXhpbmcgZm9yIGJ1ZmZlcmluZyBhZGRlZCBkb2N1bWVudHMgYW5kIGRlbGV0aW9ucyBiZWZvcmUgdGhleSBhcmUKKyAgICAgICAgIGZsdXNoZWQgdG8gdGhlIERpcmVjdG9yeS4KKyAgICAgICAgIG1heEJ1ZmZlcmVkRG9jcyBzZXRzIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBkb2N1bWVudHMgYnVmZmVyZWQKKyAgICAgICAgIGJlZm9yZSBmbHVzaGluZy4KKyAgICAgICAgIElmIGJvdGggcmFtQnVmZmVyU2l6ZU1CIGFuZCBtYXhCdWZmZXJlZERvY3MgaXMgc2V0LCB0aGVuCisgICAgICAgICBMdWNlbmUgd2lsbCBmbHVzaCBiYXNlZCBvbiB3aGljaGV2ZXIgbGltaXQgaXMgaGl0IGZpcnN0LgorICAgICAgICAgVGhlIGRlZmF1bHQgaXMgMTAwIE1CLiAgLS0+CisgICAgPCEtLSA8cmFtQnVmZmVyU2l6ZU1CPjEwMDwvcmFtQnVmZmVyU2l6ZU1CPiAtLT4KKyAgICA8IS0tIDxtYXhCdWZmZXJlZERvY3M+MTAwMDwvbWF4QnVmZmVyZWREb2NzPiAtLT4KKworICAgIDwhLS0gRXhwZXJ0OiBNZXJnZSBQb2xpY3kgCisgICAgICAgICBUaGUgTWVyZ2UgUG9saWN5IGluIEx1Y2VuZSBjb250cm9scyBob3cgbWVyZ2luZyBvZiBzZWdtZW50cyBpcyBkb25lLgorICAgICAgICAgVGhlIGRlZmF1bHQgc2luY2UgU29sci9MdWNlbmUgMy4zIGlzIFRpZXJlZE1lcmdlUG9saWN5LgorICAgICAgICAgVGhlIGRlZmF1bHQgc2luY2UgTHVjZW5lIDIuMyB3YXMgdGhlIExvZ0J5dGVTaXplTWVyZ2VQb2xpY3ksCisgICAgICAgICBFdmVuIG9sZGVyIHZlcnNpb25zIG9mIEx1Y2VuZSB1c2VkIExvZ0RvY01lcmdlUG9saWN5LgorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgICA8bWVyZ2VQb2xpY3kgY2xhc3M9Im9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRpZXJlZE1lcmdlUG9saWN5Ij4KKyAgICAgICAgICA8aW50IG5hbWU9Im1heE1lcmdlQXRPbmNlIj4xMDwvaW50PgorICAgICAgICAgIDxpbnQgbmFtZT0ic2VnbWVudHNQZXJUaWVyIj4xMDwvaW50PgorICAgICAgICA8L21lcmdlUG9saWN5PgorICAgICAgLS0+CisgICAgICAgCisgICAgPCEtLSBNZXJnZSBGYWN0b3IKKyAgICAgICAgIFRoZSBtZXJnZSBmYWN0b3IgY29udHJvbHMgaG93IG1hbnkgc2VnbWVudHMgd2lsbCBnZXQgbWVyZ2VkIGF0IGEgdGltZS4KKyAgICAgICAgIEZvciBUaWVyZWRNZXJnZVBvbGljeSwgbWVyZ2VGYWN0b3IgaXMgYSBjb252ZW5pZW5jZSBwYXJhbWV0ZXIgd2hpY2gKKyAgICAgICAgIHdpbGwgc2V0IGJvdGggTWF4TWVyZ2VBdE9uY2UgYW5kIFNlZ21lbnRzUGVyVGllciBhdCBvbmNlLgorICAgICAgICAgRm9yIExvZ0J5dGVTaXplTWVyZ2VQb2xpY3ksIG1lcmdlRmFjdG9yIGRlY2lkZXMgaG93IG1hbnkgbmV3IHNlZ21lbnRzCisgICAgICAgICB3aWxsIGJlIGFsbG93ZWQgYmVmb3JlIHRoZXkgYXJlIG1lcmdlZCBpbnRvIG9uZS4KKyAgICAgICAgIERlZmF1bHQgaXMgMTAgZm9yIGJvdGggbWVyZ2UgcG9saWNpZXMuCisgICAgICAtLT4KKyAgICA8IS0tIAorICAgIDxtZXJnZUZhY3Rvcj4xMDwvbWVyZ2VGYWN0b3I+CisgICAgICAtLT4KKworICAgIDwhLS0gRXhwZXJ0OiBNZXJnZSBTY2hlZHVsZXIKKyAgICAgICAgIFRoZSBNZXJnZSBTY2hlZHVsZXIgaW4gTHVjZW5lIGNvbnRyb2xzIGhvdyBtZXJnZXMgYXJlCisgICAgICAgICBwZXJmb3JtZWQuICBUaGUgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyIChMdWNlbmUgMi4zIGRlZmF1bHQpCisgICAgICAgICBjYW4gcGVyZm9ybSBtZXJnZXMgaW4gdGhlIGJhY2tncm91bmQgdXNpbmcgc2VwYXJhdGUgdGhyZWFkcy4KKyAgICAgICAgIFRoZSBTZXJpYWxNZXJnZVNjaGVkdWxlciAoTHVjZW5lIDIuMiBkZWZhdWx0KSBkb2VzIG5vdC4KKyAgICAgLS0+CisgICAgPCEtLSAKKyAgICAgICA8bWVyZ2VTY2hlZHVsZXIgY2xhc3M9Im9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkNvbmN1cnJlbnRNZXJnZVNjaGVkdWxlciIvPgorICAgICAgIC0tPgorCisgICAgPCEtLSBMb2NrRmFjdG9yeSAKKworICAgICAgICAgVGhpcyBvcHRpb24gc3BlY2lmaWVzIHdoaWNoIEx1Y2VuZSBMb2NrRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgdG8gdXNlLgorICAgICAgCisgICAgICAgICBzaW5nbGUgPSBTaW5nbGVJbnN0YW5jZUxvY2tGYWN0b3J5IC0gc3VnZ2VzdGVkIGZvciBhCisgICAgICAgICAgICAgICAgICByZWFkLW9ubHkgaW5kZXggb3Igd2hlbiB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZgorICAgICAgICAgICAgICAgICAgYW5vdGhlciBwcm9jZXNzIHRyeWluZyB0byBtb2RpZnkgdGhlIGluZGV4LgorICAgICAgICAgbmF0aXZlID0gTmF0aXZlRlNMb2NrRmFjdG9yeSAtIHVzZXMgT1MgbmF0aXZlIGZpbGUgbG9ja2luZy4KKyAgICAgICAgICAgICAgICAgIERvIG5vdCB1c2Ugd2hlbiBtdWx0aXBsZSBzb2xyIHdlYmFwcHMgaW4gdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgIEpWTSBhcmUgYXR0ZW1wdGluZyB0byBzaGFyZSBhIHNpbmdsZSBpbmRleC4KKyAgICAgICAgIHNpbXBsZSA9IFNpbXBsZUZTTG9ja0ZhY3RvcnkgIC0gdXNlcyBhIHBsYWluIGZpbGUgZm9yIGxvY2tpbmcKKworICAgICAgICAgRGVmYXVsdHM6ICduYXRpdmUnIGlzIGRlZmF1bHQgZm9yIFNvbHIzLjYgYW5kIGxhdGVyLCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAnc2ltcGxlJyBpcyB0aGUgZGVmYXVsdAorCisgICAgICAgICBNb3JlIGRldGFpbHMgb24gdGhlIG51YW5jZXMgb2YgZWFjaCBMb2NrRmFjdG9yeS4uLgorICAgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9sdWNlbmUtamF2YS9BdmFpbGFibGVMb2NrRmFjdG9yaWVzCisgICAgLS0+CisgICAgPGxvY2tUeXBlPiR7c29sci5sb2NrLnR5cGU6bmF0aXZlfTwvbG9ja1R5cGU+CisKKyAgICA8IS0tIFVubG9jayBPbiBTdGFydHVwCisKKyAgICAgICAgIElmIHRydWUsIHVubG9jayBhbnkgaGVsZCB3cml0ZSBvciBjb21taXQgbG9ja3Mgb24gc3RhcnR1cC4KKyAgICAgICAgIFRoaXMgZGVmZWF0cyB0aGUgbG9ja2luZyBtZWNoYW5pc20gdGhhdCBhbGxvd3MgbXVsdGlwbGUKKyAgICAgICAgIHByb2Nlc3NlcyB0byBzYWZlbHkgYWNjZXNzIGEgbHVjZW5lIGluZGV4LCBhbmQgc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgIHdpdGggY2FyZS4gRGVmYXVsdCBpcyAiZmFsc2UiLgorCisgICAgICAgICBUaGlzIGlzIG5vdCBuZWVkZWQgaWYgbG9jayB0eXBlIGlzICdzaW5nbGUnCisgICAgIC0tPgorICAgIDwhLS0KKyAgICA8dW5sb2NrT25TdGFydHVwPmZhbHNlPC91bmxvY2tPblN0YXJ0dXA+CisgICAgICAtLT4KKyAgICAKKyAgICA8IS0tIEV4cGVydDogQ29udHJvbHMgaG93IG9mdGVuIEx1Y2VuZSBsb2FkcyB0ZXJtcyBpbnRvIG1lbW9yeQorICAgICAgICAgRGVmYXVsdCBpcyAxMjggYW5kIGlzIGxpa2VseSBnb29kIGZvciBtb3N0IGV2ZXJ5b25lLgorICAgICAgLS0+CisgICAgPCEtLSA8dGVybUluZGV4SW50ZXJ2YWw+MTI4PC90ZXJtSW5kZXhJbnRlcnZhbD4gLS0+CisKKyAgICA8IS0tIElmIHRydWUsIEluZGV4UmVhZGVycyB3aWxsIGJlIG9wZW5lZC9yZW9wZW5lZCBmcm9tIHRoZSBJbmRleFdyaXRlcgorICAgICAgICAgaW5zdGVhZCBvZiBmcm9tIHRoZSBEaXJlY3RvcnkuIEhvc3RzIGluIGEgbWFzdGVyL3NsYXZlIHNldHVwCisgICAgICAgICBzaG91bGQgaGF2ZSB0aGlzIHNldCB0byBmYWxzZSB3aGlsZSB0aG9zZSBpbiBhIFNvbHJDbG91ZAorICAgICAgICAgY2x1c3RlciBuZWVkIHRvIGJlIHNldCB0byB0cnVlLiBEZWZhdWx0OiB0cnVlCisgICAgICAtLT4KKyAgICA8IS0tIAorICAgIDxucnRNb2RlPnRydWU8L25ydE1vZGU+CisgICAgICAtLT4KKworICAgIDwhLS0gQ29tbWl0IERlbGV0aW9uIFBvbGljeQorICAgICAgICAgQ3VzdG9tIGRlbGV0aW9uIHBvbGljaWVzIGNhbiBiZSBzcGVjaWZpZWQgaGVyZS4gVGhlIGNsYXNzIG11c3QKKyAgICAgICAgIGltcGxlbWVudCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleERlbGV0aW9uUG9saWN5LgorCisgICAgICAgICBUaGUgZGVmYXVsdCBTb2xyIEluZGV4RGVsZXRpb25Qb2xpY3kgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKKyAgICAgICAgIGRlbGV0aW5nIGluZGV4IGNvbW1pdCBwb2ludHMgb24gbnVtYmVyIG9mIGNvbW1pdHMsIGFnZSBvZgorICAgICAgICAgY29tbWl0IHBvaW50IGFuZCBvcHRpbWl6ZWQgc3RhdHVzLgorICAgICAgICAgCisgICAgICAgICBUaGUgbGF0ZXN0IGNvbW1pdCBwb2ludCBzaG91bGQgYWx3YXlzIGJlIHByZXNlcnZlZCByZWdhcmRsZXNzCisgICAgICAgICBvZiB0aGUgY3JpdGVyaWEuCisgICAgLS0+CisgICAgPCEtLSAKKyAgICA8ZGVsZXRpb25Qb2xpY3kgY2xhc3M9InNvbHIuU29sckRlbGV0aW9uUG9saWN5Ij4KKyAgICAtLT4KKyAgICAgIDwhLS0gVGhlIG51bWJlciBvZiBjb21taXQgcG9pbnRzIHRvIGJlIGtlcHQgLS0+CisgICAgICA8IS0tIDxzdHIgbmFtZT0ibWF4Q29tbWl0c1RvS2VlcCI+MTwvc3RyPiAtLT4KKyAgICAgIDwhLS0gVGhlIG51bWJlciBvZiBvcHRpbWl6ZWQgY29tbWl0IHBvaW50cyB0byBiZSBrZXB0IC0tPgorICAgICAgPCEtLSA8c3RyIG5hbWU9Im1heE9wdGltaXplZENvbW1pdHNUb0tlZXAiPjA8L3N0cj4gLS0+CisgICAgICA8IS0tCisgICAgICAgICAgRGVsZXRlIGFsbCBjb21taXQgcG9pbnRzIG9uY2UgdGhleSBoYXZlIHJlYWNoZWQgdGhlIGdpdmVuIGFnZS4KKyAgICAgICAgICBTdXBwb3J0cyBEYXRlTWF0aFBhcnNlciBzeW50YXggZS5nLgorICAgICAgICAtLT4KKyAgICAgIDwhLS0KKyAgICAgICAgIDxzdHIgbmFtZT0ibWF4Q29tbWl0QWdlIj4zME1JTlVURVM8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0ibWF4Q29tbWl0QWdlIj4xREFZPC9zdHI+CisgICAgICAtLT4KKyAgICA8IS0tIAorICAgIDwvZGVsZXRpb25Qb2xpY3k+CisgICAgLS0+CisKKyAgICA8IS0tIEx1Y2VuZSBJbmZvc3RyZWFtCisgICAgICAgCisgICAgICAgICBUbyBhaWQgaW4gYWR2YW5jZWQgZGVidWdnaW5nLCBMdWNlbmUgcHJvdmlkZXMgYW4gIkluZm9TdHJlYW0iCisgICAgICAgICBvZiBkZXRhaWxlZCBpbmZvcm1hdGlvbiB3aGVuIGluZGV4aW5nLgorCisgICAgICAgICBTZXR0aW5nIHRoZSB2YWx1ZSB0byB0cnVlIHdpbGwgaW5zdHJ1Y3QgdGhlIHVuZGVybHlpbmcgTHVjZW5lCisgICAgICAgICBJbmRleFdyaXRlciB0byB3cml0ZSBpdHMgaW5mbyBzdHJlYW0gdG8gc29scidzIGxvZy4gQnkgZGVmYXVsdCwKKyAgICAgICAgIHRoaXMgaXMgZW5hYmxlZCBoZXJlLCBhbmQgY29udHJvbGxlZCB0aHJvdWdoIGxvZzRqLnByb3BlcnRpZXMuCisgICAgICAtLT4KKyAgICAgPGluZm9TdHJlYW0+dHJ1ZTwvaW5mb1N0cmVhbT4KKyAgPC9pbmRleENvbmZpZz4KKworCisgIDwhLS0gSk1YCisgICAgICAgCisgICAgICAgVGhpcyBleGFtcGxlIGVuYWJsZXMgSk1YIGlmIGFuZCBvbmx5IGlmIGFuIGV4aXN0aW5nIE1CZWFuU2VydmVyCisgICAgICAgaXMgZm91bmQsIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIGNvbmZpZ3VyZSBKTVggdGhyb3VnaCBKVk0KKyAgICAgICBwYXJhbWV0ZXJzLiBSZW1vdmUgdGhpcyB0byBkaXNhYmxlIGV4cG9zaW5nIFNvbHIgY29uZmlndXJhdGlvbgorICAgICAgIGFuZCBzdGF0aXN0aWNzIHRvIEpNWC4KKworICAgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Tb2xySm14CisgICAgLS0+CisgIDxqbXggLz4KKyAgPCEtLSBJZiB5b3Ugd2FudCB0byBjb25uZWN0IHRvIGEgcGFydGljdWxhciBzZXJ2ZXIsIHNwZWNpZnkgdGhlCisgICAgICAgYWdlbnRJZCAKKyAgICAtLT4KKyAgPCEtLSA8am14IGFnZW50SWQ9Im15QWdlbnQiIC8+IC0tPgorICA8IS0tIElmIHlvdSB3YW50IHRvIHN0YXJ0IGEgbmV3IE1CZWFuU2VydmVyLCBzcGVjaWZ5IHRoZSBzZXJ2aWNlVXJsIC0tPgorICA8IS0tIDxqbXggc2VydmljZVVybD0ic2VydmljZTpqbXg6cm1pOi8vL2puZGkvcm1pOi8vbG9jYWxob3N0Ojk5OTkvc29sciIvPgorICAgIC0tPgorCisgIDwhLS0gVGhlIGRlZmF1bHQgaGlnaC1wZXJmb3JtYW5jZSB1cGRhdGUgaGFuZGxlciAtLT4KKyAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgorCisgICAgPCEtLSBFbmFibGVzIGEgdHJhbnNhY3Rpb24gbG9nLCB1c2VkIGZvciByZWFsLXRpbWUgZ2V0LCBkdXJhYmlsaXR5LCBhbmQKKyAgICAgICAgIGFuZCBzb2xyIGNsb3VkIHJlcGxpY2EgcmVjb3ZlcnkuICBUaGUgbG9nIGNhbiBncm93IGFzIGJpZyBhcworICAgICAgICAgdW5jb21taXR0ZWQgY2hhbmdlcyB0byB0aGUgaW5kZXgsIHNvIHVzZSBvZiBhIGhhcmQgYXV0b0NvbW1pdAorICAgICAgICAgaXMgcmVjb21tZW5kZWQgKHNlZSBiZWxvdykuCisgICAgICAgICAiZGlyIiAtIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGZvciB0cmFuc2FjdGlvbiBsb2dzLCBkZWZhdWx0cyB0byB0aGUKKyAgICAgICAgICAgICAgICBzb2xyIGRhdGEgZGlyZWN0b3J5LiAgLS0+IAorICAgIDx1cGRhdGVMb2c+CisgICAgICA8c3RyIG5hbWU9ImRpciI+JHtzb2xyLnVsb2cuZGlyOn08L3N0cj4KKyAgICA8L3VwZGF0ZUxvZz4KKyAKKyAgICA8IS0tIEF1dG9Db21taXQKKworICAgICAgICAgUGVyZm9ybSBhIGhhcmQgY29tbWl0IGF1dG9tYXRpY2FsbHkgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLgorICAgICAgICAgSW5zdGVhZCBvZiBlbmFibGluZyBhdXRvQ29tbWl0LCBjb25zaWRlciB1c2luZyAiY29tbWl0V2l0aGluIgorICAgICAgICAgd2hlbiBhZGRpbmcgZG9jdW1lbnRzLiAKKworICAgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1VwZGF0ZVhtbE1lc3NhZ2VzCisKKyAgICAgICAgIG1heERvY3MgLSBNYXhpbXVtIG51bWJlciBvZiBkb2N1bWVudHMgdG8gYWRkIHNpbmNlIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgY29tbWl0IGJlZm9yZSBhdXRvbWF0aWNhbGx5IHRyaWdnZXJpbmcgYSBuZXcgY29tbWl0LgorCisgICAgICAgICBtYXhUaW1lIC0gTWF4aW11bSBhbW91bnQgb2YgdGltZSBpbiBtcyB0aGF0IGlzIGFsbG93ZWQgdG8gcGFzcworICAgICAgICAgICAgICAgICAgIHNpbmNlIGEgZG9jdW1lbnQgd2FzIGFkZGVkIGJlZm9yZSBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmluZyBhIG5ldyBjb21taXQuIAorICAgICAgICAgb3BlblNlYXJjaGVyIC0gaWYgZmFsc2UsIHRoZSBjb21taXQgY2F1c2VzIHJlY2VudCBpbmRleCBjaGFuZ2VzCisgICAgICAgICAgIHRvIGJlIGZsdXNoZWQgdG8gc3RhYmxlIHN0b3JhZ2UsIGJ1dCBkb2VzIG5vdCBjYXVzZSBhIG5ldworICAgICAgICAgICBzZWFyY2hlciB0byBiZSBvcGVuZWQgdG8gbWFrZSB0aG9zZSBjaGFuZ2VzIHZpc2libGUuCisKKyAgICAgICAgIElmIHRoZSB1cGRhdGVMb2cgaXMgZW5hYmxlZCwgdGhlbiBpdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0bworICAgICAgICAgaGF2ZSBzb21lIHNvcnQgb2YgaGFyZCBhdXRvQ29tbWl0IHRvIGxpbWl0IHRoZSBsb2cgc2l6ZS4KKyAgICAgIC0tPgorICAgICA8YXV0b0NvbW1pdD4gCisgICAgICAgPG1heFRpbWU+JHtzb2xyLmF1dG9Db21taXQubWF4VGltZToxNTAwMH08L21heFRpbWU+IAorICAgICAgIDxvcGVuU2VhcmNoZXI+ZmFsc2U8L29wZW5TZWFyY2hlcj4gCisgICAgIDwvYXV0b0NvbW1pdD4KKworICAgIDwhLS0gc29mdEF1dG9Db21taXQgaXMgbGlrZSBhdXRvQ29tbWl0IGV4Y2VwdCBpdCBjYXVzZXMgYQorICAgICAgICAgJ3NvZnQnIGNvbW1pdCB3aGljaCBvbmx5IGVuc3VyZXMgdGhhdCBjaGFuZ2VzIGFyZSB2aXNpYmxlCisgICAgICAgICBidXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgZGF0YSBpcyBzeW5jZWQgdG8gZGlzay4gIFRoaXMgaXMKKyAgICAgICAgIGZhc3RlciBhbmQgbW9yZSBuZWFyLXJlYWx0aW1lIGZyaWVuZGx5IHRoYW4gYSBoYXJkIGNvbW1pdC4KKyAgICAgIC0tPgorCisgICAgIDxhdXRvU29mdENvbW1pdD4gCisgICAgICAgPG1heFRpbWU+JHtzb2xyLmF1dG9Tb2Z0Q29tbWl0Lm1heFRpbWU6LTF9PC9tYXhUaW1lPiAKKyAgICAgPC9hdXRvU29mdENvbW1pdD4KKworICAgIDwhLS0gVXBkYXRlIFJlbGF0ZWQgRXZlbnQgTGlzdGVuZXJzCisgICAgICAgICAKKyAgICAgICAgIFZhcmlvdXMgSW5kZXhXcml0ZXIgcmVsYXRlZCBldmVudHMgY2FuIHRyaWdnZXIgTGlzdGVuZXJzIHRvCisgICAgICAgICB0YWtlIGFjdGlvbnMuCisKKyAgICAgICAgIHBvc3RDb21taXQgLSBmaXJlZCBhZnRlciBldmVyeSBjb21taXQgb3Igb3B0aW1pemUgY29tbWFuZAorICAgICAgICAgcG9zdE9wdGltaXplIC0gZmlyZWQgYWZ0ZXIgZXZlcnkgb3B0aW1pemUgY29tbWFuZAorICAgICAgLS0+CisgICAgPCEtLSBUaGUgUnVuRXhlY3V0YWJsZUxpc3RlbmVyIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQgZnJvbSBhCisgICAgICAgICBob29rIHN1Y2ggYXMgcG9zdENvbW1pdCBvciBwb3N0T3B0aW1pemUuCisgICAgICAgICAKKyAgICAgICAgIGV4ZSAtIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRvIHJ1bgorICAgICAgICAgZGlyIC0gZGlyIHRvIHVzZSBhcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKGRlZmF1bHQ9Ii4iKQorICAgICAgICAgd2FpdCAtIHRoZSBjYWxsaW5nIHRocmVhZCB3YWl0cyB1bnRpbCB0aGUgZXhlY3V0YWJsZSByZXR1cm5zLiAKKyAgICAgICAgICAgICAgICAoZGVmYXVsdD0idHJ1ZSIpCisgICAgICAgICBhcmdzIC0gdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBwcm9ncmFtLiAgKGRlZmF1bHQgaXMgbm9uZSkKKyAgICAgICAgIGVudiAtIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQuICAoZGVmYXVsdCBpcyBub25lKQorICAgICAgLS0+CisgICAgPCEtLSBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IFJ1bkV4ZWN1dGFibGVMaXN0ZW5lciBjb3VsZCBiZSB1c2VkCisgICAgICAgICB3aXRoIHRoZSBzY3JpcHQgYmFzZWQgcmVwbGljYXRpb24uLi4KKyAgICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Db2xsZWN0aW9uRGlzdHJpYnV0aW9uCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxpc3RlbmVyIGV2ZW50PSJwb3N0Q29tbWl0IiBjbGFzcz0ic29sci5SdW5FeGVjdXRhYmxlTGlzdGVuZXIiPgorICAgICAgICAgPHN0ciBuYW1lPSJleGUiPnNvbHIvYmluL3NuYXBzaG9vdGVyPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImRpciI+Ljwvc3RyPgorICAgICAgICAgPGJvb2wgbmFtZT0id2FpdCI+dHJ1ZTwvYm9vbD4KKyAgICAgICAgIDxhcnIgbmFtZT0iYXJncyI+IDxzdHI+YXJnMTwvc3RyPiA8c3RyPmFyZzI8L3N0cj4gPC9hcnI+CisgICAgICAgICA8YXJyIG5hbWU9ImVudiI+IDxzdHI+TVlWQVI9dmFsMTwvc3RyPiA8L2Fycj4KKyAgICAgICA8L2xpc3RlbmVyPgorICAgICAgLS0+CisKKyAgPC91cGRhdGVIYW5kbGVyPgorICAKKyAgPCEtLSBJbmRleFJlYWRlckZhY3RvcnkKKworICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdCB0byBzcGVjaWZ5IGEgY3VzdG9tIEluZGV4UmVhZGVyRmFjdG9yeSwKKyAgICAgICB3aGljaCBhbGxvd3MgZm9yIGFsdGVybmF0ZSBJbmRleFJlYWRlciBpbXBsZW1lbnRhdGlvbnMuCisKKyAgICAgICAqKiBFeHBlcmltZW50YWwgRmVhdHVyZSAqKgorCisgICAgICAgUGxlYXNlIG5vdGUgLSBVc2luZyBhIGN1c3RvbSBJbmRleFJlYWRlckZhY3RvcnkgbWF5IHByZXZlbnQKKyAgICAgICBjZXJ0YWluIG90aGVyIGZlYXR1cmVzIGZyb20gd29ya2luZy4gVGhlIEFQSSB0bworICAgICAgIEluZGV4UmVhZGVyRmFjdG9yeSBtYXkgY2hhbmdlIHdpdGhvdXQgd2FybmluZyBvciBtYXkgZXZlbiBiZQorICAgICAgIHJlbW92ZWQgZnJvbSBmdXR1cmUgcmVsZWFzZXMgaWYgdGhlIHByb2JsZW1zIGNhbm5vdCBiZQorICAgICAgIHJlc29sdmVkLgorCisKKyAgICAgICAqKiBGZWF0dXJlcyB0aGF0IG1heSBub3Qgd29yayB3aXRoIGN1c3RvbSBJbmRleFJlYWRlckZhY3RvcnkgKioKKworICAgICAgIFRoZSBSZXBsaWNhdGlvbkhhbmRsZXIgYXNzdW1lcyBhIGRpc2stcmVzaWRlbnQgaW5kZXguIFVzaW5nIGEKKyAgICAgICBjdXN0b20gSW5kZXhSZWFkZXIgaW1wbGVtZW50YXRpb24gbWF5IGNhdXNlIGluY29tcGF0aWJpbGl0eQorICAgICAgIHdpdGggUmVwbGljYXRpb25IYW5kbGVyIGFuZCBtYXkgY2F1c2UgcmVwbGljYXRpb24gdG8gbm90IHdvcmsKKyAgICAgICBjb3JyZWN0bHkuIFNlZSBTT0xSLTEzNjYgZm9yIGRldGFpbHMuCisKKyAgICAtLT4KKyAgPCEtLQorICA8aW5kZXhSZWFkZXJGYWN0b3J5IG5hbWU9IkluZGV4UmVhZGVyRmFjdG9yeSIgY2xhc3M9InBhY2thZ2UuY2xhc3MiPgorICAgIDxzdHIgbmFtZT0ic29tZUFyZyI+U29tZSBWYWx1ZTwvc3RyPgorICA8L2luZGV4UmVhZGVyRmFjdG9yeSA+CisgIC0tPgorICA8IS0tIEJ5IGV4cGxpY2l0bHkgZGVjbGFyaW5nIHRoZSBGYWN0b3J5LCB0aGUgdGVybUluZGV4RGl2aXNvciBjYW4KKyAgICAgICBiZSBzcGVjaWZpZWQuCisgICAgLS0+CisgIDwhLS0KKyAgICAgPGluZGV4UmVhZGVyRmFjdG9yeSBuYW1lPSJJbmRleFJlYWRlckZhY3RvcnkiIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLlN0YW5kYXJkSW5kZXhSZWFkZXJGYWN0b3J5Ij4KKyAgICAgICA8aW50IG5hbWU9InNldFRlcm1JbmRleERpdmlzb3IiPjEyPC9pbnQ+CisgICAgIDwvaW5kZXhSZWFkZXJGYWN0b3J5ID4KKyAgICAtLT4KKworICA8IS0tIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICAgICAgIFF1ZXJ5IHNlY3Rpb24gLSB0aGVzZSBzZXR0aW5ncyBjb250cm9sIHF1ZXJ5IHRpbWUgdGhpbmdzIGxpa2UgY2FjaGVzCisgICAgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IC0tPgorICA8cXVlcnk+CisgICAgPCEtLSBNYXggQm9vbGVhbiBDbGF1c2VzCisKKyAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNsYXVzZXMgaW4gZWFjaCBCb29sZWFuUXVlcnksICBhbiBleGNlcHRpb24KKyAgICAgICAgIGlzIHRocm93biBpZiBleGNlZWRlZC4KKworICAgICAgICAgKiogV0FSTklORyAqKgorICAgICAgICAgCisgICAgICAgICBUaGlzIG9wdGlvbiBhY3R1YWxseSBtb2RpZmllcyBhIGdsb2JhbCBMdWNlbmUgcHJvcGVydHkgdGhhdAorICAgICAgICAgd2lsbCBhZmZlY3QgYWxsIFNvbHJDb3Jlcy4gIElmIG11bHRpcGxlIHNvbHJjb25maWcueG1sIGZpbGVzCisgICAgICAgICBkaXNhZ3JlZSBvbiB0aGlzIHByb3BlcnR5LCB0aGUgdmFsdWUgYXQgYW55IGdpdmVuIG1vbWVudCB3aWxsCisgICAgICAgICBiZSBiYXNlZCBvbiB0aGUgbGFzdCBTb2xyQ29yZSB0byBiZSBpbml0aWFsaXplZC4KKyAgICAgICAgIAorICAgICAgLS0+CisgICAgPG1heEJvb2xlYW5DbGF1c2VzPjEwMjQ8L21heEJvb2xlYW5DbGF1c2VzPgorCisKKyAgICA8IS0tIFNvbHIgSW50ZXJuYWwgUXVlcnkgQ2FjaGVzCisKKyAgICAgICAgIFRoZXJlIGFyZSB0d28gaW1wbGVtZW50YXRpb25zIG9mIGNhY2hlIGF2YWlsYWJsZSBmb3IgU29sciwKKyAgICAgICAgIExSVUNhY2hlLCBiYXNlZCBvbiBhIHN5bmNocm9uaXplZCBMaW5rZWRIYXNoTWFwLCBhbmQKKyAgICAgICAgIEZhc3RMUlVDYWNoZSwgYmFzZWQgb24gYSBDb25jdXJyZW50SGFzaE1hcC4gIAorCisgICAgICAgICBGYXN0TFJVQ2FjaGUgaGFzIGZhc3RlciBnZXRzIGFuZCBzbG93ZXIgcHV0cyBpbiBzaW5nbGUKKyAgICAgICAgIHRocmVhZGVkIG9wZXJhdGlvbiBhbmQgdGh1cyBpcyBnZW5lcmFsbHkgZmFzdGVyIHRoYW4gTFJVQ2FjaGUKKyAgICAgICAgIHdoZW4gdGhlIGhpdCByYXRpbyBvZiB0aGUgY2FjaGUgaXMgaGlnaCAoPiA3NSUpLCBhbmQgbWF5IGJlCisgICAgICAgICBmYXN0ZXIgdW5kZXIgb3RoZXIgc2NlbmFyaW9zIG9uIG11bHRpLWNwdSBzeXN0ZW1zLgorICAgIC0tPgorCisgICAgPCEtLSBGaWx0ZXIgQ2FjaGUKKworICAgICAgICAgQ2FjaGUgdXNlZCBieSBTb2xySW5kZXhTZWFyY2hlciBmb3IgZmlsdGVycyAoRG9jU2V0cyksCisgICAgICAgICB1bm9yZGVyZWQgc2V0cyBvZiAqYWxsKiBkb2N1bWVudHMgdGhhdCBtYXRjaCBhIHF1ZXJ5LiAgV2hlbiBhCisgICAgICAgICBuZXcgc2VhcmNoZXIgaXMgb3BlbmVkLCBpdHMgY2FjaGVzIG1heSBiZSBwcmVwb3B1bGF0ZWQgb3IKKyAgICAgICAgICJhdXRvd2FybWVkIiB1c2luZyBkYXRhIGZyb20gY2FjaGVzIGluIHRoZSBvbGQgc2VhcmNoZXIuCisgICAgICAgICBhdXRvd2FybUNvdW50IGlzIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gcHJlcG9wdWxhdGUuICBGb3IKKyAgICAgICAgIExSVUNhY2hlLCB0aGUgYXV0b3dhcm1lZCBpdGVtcyB3aWxsIGJlIHRoZSBtb3N0IHJlY2VudGx5CisgICAgICAgICBhY2Nlc3NlZCBpdGVtcy4KKworICAgICAgICAgUGFyYW1ldGVyczoKKyAgICAgICAgICAgY2xhc3MgLSB0aGUgU29sckNhY2hlIGltcGxlbWVudGF0aW9uIExSVUNhY2hlIG9yCisgICAgICAgICAgICAgICAoTFJVQ2FjaGUgb3IgRmFzdExSVUNhY2hlKQorICAgICAgICAgICBzaXplIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNhY2hlCisgICAgICAgICAgIGluaXRpYWxTaXplIC0gdGhlIGluaXRpYWwgY2FwYWNpdHkgKG51bWJlciBvZiBlbnRyaWVzKSBvZgorICAgICAgICAgICAgICAgdGhlIGNhY2hlLiAgKHNlZSBqYXZhLnV0aWwuSGFzaE1hcCkKKyAgICAgICAgICAgYXV0b3dhcm1Db3VudCAtIHRoZSBudW1iZXIgb2YgZW50cmllcyB0byBwcmVwb3B1bGF0ZSBmcm9tCisgICAgICAgICAgICAgICBhbmQgb2xkIGNhY2hlLiAgCisgICAgICAtLT4KKyAgICA8ZmlsdGVyQ2FjaGUgY2xhc3M9InNvbHIuRmFzdExSVUNhY2hlIgorICAgICAgICAgICAgICAgICBzaXplPSI1MTIiCisgICAgICAgICAgICAgICAgIGluaXRpYWxTaXplPSI1MTIiCisgICAgICAgICAgICAgICAgIGF1dG93YXJtQ291bnQ9IjAiLz4KKworICAgIDwhLS0gUXVlcnkgUmVzdWx0IENhY2hlCisgICAgICAgICAKKyAgICAgICAgIENhY2hlcyByZXN1bHRzIG9mIHNlYXJjaGVzIC0gb3JkZXJlZCBsaXN0cyBvZiBkb2N1bWVudCBpZHMKKyAgICAgICAgIChEb2NMaXN0KSBiYXNlZCBvbiBhIHF1ZXJ5LCBhIHNvcnQsIGFuZCB0aGUgcmFuZ2Ugb2YgZG9jdW1lbnRzIHJlcXVlc3RlZC4gIAorICAgICAgLS0+CisgICAgPHF1ZXJ5UmVzdWx0Q2FjaGUgY2xhc3M9InNvbHIuTFJVQ2FjaGUiCisgICAgICAgICAgICAgICAgICAgICBzaXplPSI1MTIiCisgICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2l6ZT0iNTEyIgorICAgICAgICAgICAgICAgICAgICAgYXV0b3dhcm1Db3VudD0iMCIvPgorICAgCisgICAgPCEtLSBEb2N1bWVudCBDYWNoZQorCisgICAgICAgICBDYWNoZXMgTHVjZW5lIERvY3VtZW50IG9iamVjdHMgKHRoZSBzdG9yZWQgZmllbGRzIGZvciBlYWNoCisgICAgICAgICBkb2N1bWVudCkuICBTaW5jZSBMdWNlbmUgaW50ZXJuYWwgZG9jdW1lbnQgaWRzIGFyZSB0cmFuc2llbnQsCisgICAgICAgICB0aGlzIGNhY2hlIHdpbGwgbm90IGJlIGF1dG93YXJtZWQuICAKKyAgICAgIC0tPgorICAgIDxkb2N1bWVudENhY2hlIGNsYXNzPSJzb2xyLkxSVUNhY2hlIgorICAgICAgICAgICAgICAgICAgIHNpemU9IjUxMiIKKyAgICAgICAgICAgICAgICAgICBpbml0aWFsU2l6ZT0iNTEyIgorICAgICAgICAgICAgICAgICAgIGF1dG93YXJtQ291bnQ9IjAiLz4KKyAgICAKKyAgICA8IS0tIGN1c3RvbSBjYWNoZSBjdXJyZW50bHkgdXNlZCBieSBibG9jayBqb2luIC0tPiAKKyAgICA8Y2FjaGUgbmFtZT0icGVyU2VnRmlsdGVyIgorICAgICAgY2xhc3M9InNvbHIuc2VhcmNoLkxSVUNhY2hlIgorICAgICAgc2l6ZT0iMTAiCisgICAgICBpbml0aWFsU2l6ZT0iMCIKKyAgICAgIGF1dG93YXJtQ291bnQ9IjEwIgorICAgICAgcmVnZW5lcmF0b3I9InNvbHIuTm9PcFJlZ2VuZXJhdG9yIiAvPgorCisgICAgPCEtLSBGaWVsZCBWYWx1ZSBDYWNoZQorICAgICAgICAgCisgICAgICAgICBDYWNoZSB1c2VkIHRvIGhvbGQgZmllbGQgdmFsdWVzIHRoYXQgYXJlIHF1aWNrbHkgYWNjZXNzaWJsZQorICAgICAgICAgYnkgZG9jdW1lbnQgaWQuICBUaGUgZmllbGRWYWx1ZUNhY2hlIGlzIGNyZWF0ZWQgYnkgZGVmYXVsdAorICAgICAgICAgZXZlbiBpZiBub3QgY29uZmlndXJlZCBoZXJlLgorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxmaWVsZFZhbHVlQ2FjaGUgY2xhc3M9InNvbHIuRmFzdExSVUNhY2hlIgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0iNTEyIgorICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3dhcm1Db3VudD0iMTI4IgorICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0l0ZW1zPSIzMiIgLz4KKyAgICAgIC0tPgorCisgICAgPCEtLSBDdXN0b20gQ2FjaGUKKworICAgICAgICAgRXhhbXBsZSBvZiBhIGdlbmVyaWMgY2FjaGUuICBUaGVzZSBjYWNoZXMgbWF5IGJlIGFjY2Vzc2VkIGJ5CisgICAgICAgICBuYW1lIHRocm91Z2ggU29sckluZGV4U2VhcmNoZXIuZ2V0Q2FjaGUoKSxjYWNoZUxvb2t1cCgpLCBhbmQKKyAgICAgICAgIGNhY2hlSW5zZXJ0KCkuICBUaGUgcHVycG9zZSBpcyB0byBlbmFibGUgZWFzeSBjYWNoaW5nIG9mCisgICAgICAgICB1c2VyL2FwcGxpY2F0aW9uIGxldmVsIGRhdGEuICBUaGUgcmVnZW5lcmF0b3IgYXJndW1lbnQgc2hvdWxkCisgICAgICAgICBiZSBzcGVjaWZpZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc29sci5DYWNoZVJlZ2VuZXJhdG9yIAorICAgICAgICAgaWYgYXV0b3dhcm1pbmcgaXMgZGVzaXJlZC4gIAorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxjYWNoZSBuYW1lPSJteVVzZXJDYWNoZSIKKyAgICAgICAgICAgICAgY2xhc3M9InNvbHIuTFJVQ2FjaGUiCisgICAgICAgICAgICAgIHNpemU9IjQwOTYiCisgICAgICAgICAgICAgIGluaXRpYWxTaXplPSIxMDI0IgorICAgICAgICAgICAgICBhdXRvd2FybUNvdW50PSIxMDI0IgorICAgICAgICAgICAgICByZWdlbmVyYXRvcj0iY29tLm15Y29tcGFueS5NeVJlZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAvPgorICAgICAgLS0+CisKKworICAgIDwhLS0gTGF6eSBGaWVsZCBMb2FkaW5nCisKKyAgICAgICAgIElmIHRydWUsIHN0b3JlZCBmaWVsZHMgdGhhdCBhcmUgbm90IHJlcXVlc3RlZCB3aWxsIGJlIGxvYWRlZAorICAgICAgICAgbGF6aWx5LiAgVGhpcyBjYW4gcmVzdWx0IGluIGEgc2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnQKKyAgICAgICAgIGlmIHRoZSB1c3VhbCBjYXNlIGlzIHRvIG5vdCBsb2FkIGFsbCBzdG9yZWQgZmllbGRzLAorICAgICAgICAgZXNwZWNpYWxseSBpZiB0aGUgc2tpcHBlZCBmaWVsZHMgYXJlIGxhcmdlIGNvbXByZXNzZWQgdGV4dAorICAgICAgICAgZmllbGRzLgorICAgIC0tPgorICAgIDxlbmFibGVMYXp5RmllbGRMb2FkaW5nPnRydWU8L2VuYWJsZUxhenlGaWVsZExvYWRpbmc+CisKKyAgIDwhLS0gVXNlIEZpbHRlciBGb3IgU29ydGVkIFF1ZXJ5CisKKyAgICAgICAgQSBwb3NzaWJsZSBvcHRpbWl6YXRpb24gdGhhdCBhdHRlbXB0cyB0byB1c2UgYSBmaWx0ZXIgdG8KKyAgICAgICAgc2F0aXNmeSBhIHNlYXJjaC4gIElmIHRoZSByZXF1ZXN0ZWQgc29ydCBkb2VzIG5vdCBpbmNsdWRlCisgICAgICAgIHNjb3JlLCB0aGVuIHRoZSBmaWx0ZXJDYWNoZSB3aWxsIGJlIGNoZWNrZWQgZm9yIGEgZmlsdGVyCisgICAgICAgIG1hdGNoaW5nIHRoZSBxdWVyeS4gSWYgZm91bmQsIHRoZSBmaWx0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZQorICAgICAgICBzb3VyY2Ugb2YgZG9jdW1lbnQgaWRzLCBhbmQgdGhlbiB0aGUgc29ydCB3aWxsIGJlIGFwcGxpZWQgdG8KKyAgICAgICAgdGhhdC4KKworICAgICAgICBGb3IgbW9zdCBzaXR1YXRpb25zLCB0aGlzIHdpbGwgbm90IGJlIHVzZWZ1bCB1bmxlc3MgeW91CisgICAgICAgIGZyZXF1ZW50bHkgZ2V0IHRoZSBzYW1lIHNlYXJjaCByZXBlYXRlZGx5IHdpdGggZGlmZmVyZW50IHNvcnQKKyAgICAgICAgb3B0aW9ucywgYW5kIG5vbmUgb2YgdGhlbSBldmVyIHVzZSAic2NvcmUiCisgICAgIC0tPgorICAgPCEtLQorICAgICAgPHVzZUZpbHRlckZvclNvcnRlZFF1ZXJ5PnRydWU8L3VzZUZpbHRlckZvclNvcnRlZFF1ZXJ5PgorICAgICAtLT4KKworICAgPCEtLSBSZXN1bHQgV2luZG93IFNpemUKKworICAgICAgICBBbiBvcHRpbWl6YXRpb24gZm9yIHVzZSB3aXRoIHRoZSBxdWVyeVJlc3VsdENhY2hlLiAgV2hlbiBhIHNlYXJjaAorICAgICAgICBpcyByZXF1ZXN0ZWQsIGEgc3VwZXJzZXQgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgZG9jdW1lbnQgaWRzCisgICAgICAgIGFyZSBjb2xsZWN0ZWQuICBGb3IgZXhhbXBsZSwgaWYgYSBzZWFyY2ggZm9yIGEgcGFydGljdWxhciBxdWVyeQorICAgICAgICByZXF1ZXN0cyBtYXRjaGluZyBkb2N1bWVudHMgMTAgdGhyb3VnaCAxOSwgYW5kIHF1ZXJ5V2luZG93U2l6ZSBpcyA1MCwKKyAgICAgICAgdGhlbiBkb2N1bWVudHMgMCB0aHJvdWdoIDQ5IHdpbGwgYmUgY29sbGVjdGVkIGFuZCBjYWNoZWQuICBBbnkgZnVydGhlcgorICAgICAgICByZXF1ZXN0cyBpbiB0aGF0IHJhbmdlIGNhbiBiZSBzYXRpc2ZpZWQgdmlhIHRoZSBjYWNoZS4gIAorICAgICAtLT4KKyAgIDxxdWVyeVJlc3VsdFdpbmRvd1NpemU+MjA8L3F1ZXJ5UmVzdWx0V2luZG93U2l6ZT4KKworICAgPCEtLSBNYXhpbXVtIG51bWJlciBvZiBkb2N1bWVudHMgdG8gY2FjaGUgZm9yIGFueSBlbnRyeSBpbiB0aGUKKyAgICAgICAgcXVlcnlSZXN1bHRDYWNoZS4gCisgICAgIC0tPgorICAgPHF1ZXJ5UmVzdWx0TWF4RG9jc0NhY2hlZD4yMDA8L3F1ZXJ5UmVzdWx0TWF4RG9jc0NhY2hlZD4KKworICAgPCEtLSBRdWVyeSBSZWxhdGVkIEV2ZW50IExpc3RlbmVycworCisgICAgICAgIFZhcmlvdXMgSW5kZXhTZWFyY2hlciByZWxhdGVkIGV2ZW50cyBjYW4gdHJpZ2dlciBMaXN0ZW5lcnMgdG8KKyAgICAgICAgdGFrZSBhY3Rpb25zLgorCisgICAgICAgIG5ld1NlYXJjaGVyIC0gZmlyZWQgd2hlbmV2ZXIgYSBuZXcgc2VhcmNoZXIgaXMgYmVpbmcgcHJlcGFyZWQKKyAgICAgICAgYW5kIHRoZXJlIGlzIGEgY3VycmVudCBzZWFyY2hlciBoYW5kbGluZyByZXF1ZXN0cyAoYWthCisgICAgICAgIHJlZ2lzdGVyZWQpLiAgSXQgY2FuIGJlIHVzZWQgdG8gcHJpbWUgY2VydGFpbiBjYWNoZXMgdG8KKyAgICAgICAgcHJldmVudCBsb25nIHJlcXVlc3QgdGltZXMgZm9yIGNlcnRhaW4gcmVxdWVzdHMuCisKKyAgICAgICAgZmlyc3RTZWFyY2hlciAtIGZpcmVkIHdoZW5ldmVyIGEgbmV3IHNlYXJjaGVyIGlzIGJlaW5nCisgICAgICAgIHByZXBhcmVkIGJ1dCB0aGVyZSBpcyBubyBjdXJyZW50IHJlZ2lzdGVyZWQgc2VhcmNoZXIgdG8gaGFuZGxlCisgICAgICAgIHJlcXVlc3RzIG9yIHRvIGdhaW4gYXV0b3dhcm1pbmcgZGF0YSBmcm9tLgorCisgICAgICAgIAorICAgICAtLT4KKyAgICA8IS0tIFF1ZXJ5U2VuZGVyTGlzdGVuZXIgdGFrZXMgYW4gYXJyYXkgb2YgTmFtZWRMaXN0IGFuZCBleGVjdXRlcyBhCisgICAgICAgICBsb2NhbCBxdWVyeSByZXF1ZXN0IGZvciBlYWNoIE5hbWVkTGlzdCBpbiBzZXF1ZW5jZS4gCisgICAgICAtLT4KKyAgICA8bGlzdGVuZXIgZXZlbnQ9Im5ld1NlYXJjaGVyIiBjbGFzcz0ic29sci5RdWVyeVNlbmRlckxpc3RlbmVyIj4KKyAgICAgIDxhcnIgbmFtZT0icXVlcmllcyI+CisgICAgICAgIDwhLS0KKyAgICAgICAgICAgPGxzdD48c3RyIG5hbWU9InEiPnNvbHI8L3N0cj48c3RyIG5hbWU9InNvcnQiPnByaWNlIGFzYzwvc3RyPjwvbHN0PgorICAgICAgICAgICA8bHN0PjxzdHIgbmFtZT0icSI+cm9ja3M8L3N0cj48c3RyIG5hbWU9InNvcnQiPndlaWdodCBhc2M8L3N0cj48L2xzdD4KKyAgICAgICAgICAtLT4KKyAgICAgIDwvYXJyPgorICAgIDwvbGlzdGVuZXI+CisgICAgPGxpc3RlbmVyIGV2ZW50PSJmaXJzdFNlYXJjaGVyIiBjbGFzcz0ic29sci5RdWVyeVNlbmRlckxpc3RlbmVyIj4KKyAgICAgIDxhcnIgbmFtZT0icXVlcmllcyI+CisgICAgICAgIDxsc3Q+CisgICAgICAgICAgPHN0ciBuYW1lPSJxIj5zdGF0aWMgZmlyc3RTZWFyY2hlciB3YXJtaW5nIGluIHNvbHJjb25maWcueG1sPC9zdHI+CisgICAgICAgIDwvbHN0PgorICAgICAgPC9hcnI+CisgICAgPC9saXN0ZW5lcj4KKworICAgIDwhLS0gVXNlIENvbGQgU2VhcmNoZXIKKworICAgICAgICAgSWYgYSBzZWFyY2ggcmVxdWVzdCBjb21lcyBpbiBhbmQgdGhlcmUgaXMgbm8gY3VycmVudAorICAgICAgICAgcmVnaXN0ZXJlZCBzZWFyY2hlciwgdGhlbiBpbW1lZGlhdGVseSByZWdpc3RlciB0aGUgc3RpbGwKKyAgICAgICAgIHdhcm1pbmcgc2VhcmNoZXIgYW5kIHVzZSBpdC4gIElmICJmYWxzZSIgdGhlbiBhbGwgcmVxdWVzdHMKKyAgICAgICAgIHdpbGwgYmxvY2sgdW50aWwgdGhlIGZpcnN0IHNlYXJjaGVyIGlzIGRvbmUgd2FybWluZy4KKyAgICAgIC0tPgorICAgIDx1c2VDb2xkU2VhcmNoZXI+ZmFsc2U8L3VzZUNvbGRTZWFyY2hlcj4KKworICAgIDwhLS0gTWF4IFdhcm1pbmcgU2VhcmNoZXJzCisgICAgICAgICAKKyAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHNlYXJjaGVycyB0aGF0IG1heSBiZSB3YXJtaW5nIGluIHRoZQorICAgICAgICAgYmFja2dyb3VuZCBjb25jdXJyZW50bHkuICBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGlzIGxpbWl0CisgICAgICAgICBpcyBleGNlZWRlZC4KKworICAgICAgICAgUmVjb21tZW5kIHZhbHVlcyBvZiAxLTIgZm9yIHJlYWQtb25seSBzbGF2ZXMsIGhpZ2hlciBmb3IKKyAgICAgICAgIG1hc3RlcnMgdy9vIGNhY2hlIHdhcm1pbmcuCisgICAgICAtLT4KKyAgICA8bWF4V2FybWluZ1NlYXJjaGVycz4yPC9tYXhXYXJtaW5nU2VhcmNoZXJzPgorCisgIDwvcXVlcnk+CisKKworICA8IS0tIFJlcXVlc3QgRGlzcGF0Y2hlcgorCisgICAgICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IgaG93IHRoZSBTb2xyRGlzcGF0Y2hGaWx0ZXIKKyAgICAgICBzaG91bGQgYmVoYXZlIHdoZW4gcHJvY2Vzc2luZyByZXF1ZXN0cyBmb3IgdGhpcyBTb2xyQ29yZS4KKworICAgICAgIGhhbmRsZVNlbGVjdCBpcyBhIGxlZ2FjeSBvcHRpb24gdGhhdCBhZmZlY3RzIHRoZSBiZWhhdmlvciBvZiByZXF1ZXN0cworICAgICAgIHN1Y2ggYXMgL3NlbGVjdD9xdD1YWFgKKworICAgICAgIGhhbmRsZVNlbGVjdD0idHJ1ZSIgd2lsbCBjYXVzZSB0aGUgU29sckRpc3BhdGNoRmlsdGVyIHRvIHByb2Nlc3MKKyAgICAgICB0aGUgcmVxdWVzdCBhbmQgZGlzcGF0Y2ggdGhlIHF1ZXJ5IHRvIGEgaGFuZGxlciBzcGVjaWZpZWQgYnkgdGhlIAorICAgICAgICJxdCIgcGFyYW0sIGFzc3VtaW5nICIvc2VsZWN0IiBpc24ndCBhbHJlYWR5IHJlZ2lzdGVyZWQuCisKKyAgICAgICBoYW5kbGVTZWxlY3Q9ImZhbHNlIiB3aWxsIGNhdXNlIHRoZSBTb2xyRGlzcGF0Y2hGaWx0ZXIgdG8KKyAgICAgICBpZ25vcmUgIi9zZWxlY3QiIHJlcXVlc3RzLCByZXN1bHRpbmcgaW4gYSA0MDQgdW5sZXNzIGEgaGFuZGxlcgorICAgICAgIGlzIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBuYW1lICIvc2VsZWN0IgorCisgICAgICAgaGFuZGxlU2VsZWN0PSJ0cnVlIiBpcyBub3QgcmVjb21tZW5kZWQgZm9yIG5ldyB1c2VycywgYnV0IGlzIHRoZSBkZWZhdWx0CisgICAgICAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgLS0+CisgIDxyZXF1ZXN0RGlzcGF0Y2hlciBoYW5kbGVTZWxlY3Q9ImZhbHNlIiA+CisgICAgPCEtLSBSZXF1ZXN0IFBhcnNpbmcKKworICAgICAgICAgVGhlc2Ugc2V0dGluZ3MgaW5kaWNhdGUgaG93IFNvbHIgUmVxdWVzdHMgbWF5IGJlIHBhcnNlZCwgYW5kCisgICAgICAgICB3aGF0IHJlc3RyaWN0aW9ucyBtYXkgYmUgcGxhY2VkIG9uIHRoZSBDb250ZW50U3RyZWFtcyBmcm9tCisgICAgICAgICB0aG9zZSByZXF1ZXN0cworCisgICAgICAgICBlbmFibGVSZW1vdGVTdHJlYW1pbmcgLSBlbmFibGVzIHVzZSBvZiB0aGUgc3RyZWFtLmZpbGUKKyAgICAgICAgIGFuZCBzdHJlYW0udXJsIHBhcmFtZXRlcnMgZm9yIHNwZWNpZnlpbmcgcmVtb3RlIHN0cmVhbXMuCisKKyAgICAgICAgIG11bHRpcGFydFVwbG9hZExpbWl0SW5LQiAtIHNwZWNpZmllcyB0aGUgbWF4IHNpemUgKGluIEtpQikgb2YKKyAgICAgICAgIE11bHRpcGFydCBGaWxlIFVwbG9hZHMgdGhhdCBTb2xyIHdpbGwgYWxsb3cgaW4gYSBSZXF1ZXN0LgorICAgICAgICAgCisgICAgICAgICBmb3JtZGF0YVVwbG9hZExpbWl0SW5LQiAtIHNwZWNpZmllcyB0aGUgbWF4IHNpemUgKGluIEtpQikgb2YKKyAgICAgICAgIGZvcm0gZGF0YSAoYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkKSBzZW50IHZpYQorICAgICAgICAgUE9TVC4gWW91IGNhbiB1c2UgUE9TVCB0byBwYXNzIHJlcXVlc3QgcGFyYW1ldGVycyBub3QKKyAgICAgICAgIGZpdHRpbmcgaW50byB0aGUgVVJMLgorICAgICAgICAgCisgICAgICAgICBhZGRIdHRwUmVxdWVzdFRvQ29udGV4dCAtIGlmIHNldCB0byB0cnVlLCBpdCB3aWxsIGluc3RydWN0CisgICAgICAgICB0aGUgcmVxdWVzdFBhcnNlcnMgdG8gaW5jbHVkZSB0aGUgb3JpZ2luYWwgSHR0cFNlcnZsZXRSZXF1ZXN0CisgICAgICAgICBvYmplY3QgaW4gdGhlIGNvbnRleHQgbWFwIG9mIHRoZSBTb2xyUXVlcnlSZXF1ZXN0IHVuZGVyIHRoZSAKKyAgICAgICAgIGtleSAiaHR0cFJlcXVlc3QiLiBJdCB3aWxsIG5vdCBiZSB1c2VkIGJ5IGFueSBvZiB0aGUgZXhpc3RpbmcKKyAgICAgICAgIFNvbHIgY29tcG9uZW50cywgYnV0IG1heSBiZSB1c2VmdWwgd2hlbiBkZXZlbG9waW5nIGN1c3RvbSAKKyAgICAgICAgIHBsdWdpbnMuCisgICAgICAgICAKKyAgICAgICAgICoqKiBXQVJOSU5HICoqKgorICAgICAgICAgVGhlIHNldHRpbmdzIGJlbG93IGF1dGhvcml6ZSBTb2xyIHRvIGZldGNoIHJlbW90ZSBmaWxlcywgWW91CisgICAgICAgICBzaG91bGQgbWFrZSBzdXJlIHlvdXIgc3lzdGVtIGhhcyBzb21lIGF1dGhlbnRpY2F0aW9uIGJlZm9yZQorICAgICAgICAgdXNpbmcgZW5hYmxlUmVtb3RlU3RyZWFtaW5nPSJ0cnVlIgorCisgICAgICAtLT4gCisgICAgPHJlcXVlc3RQYXJzZXJzIGVuYWJsZVJlbW90ZVN0cmVhbWluZz0idHJ1ZSIgCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGFydFVwbG9hZExpbWl0SW5LQj0iMjA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgZm9ybWRhdGFVcGxvYWRMaW1pdEluS0I9IjIwNDgiCisgICAgICAgICAgICAgICAgICAgIGFkZEh0dHBSZXF1ZXN0VG9Db250ZXh0PSJmYWxzZSIvPgorCisgICAgPCEtLSBIVFRQIENhY2hpbmcKKworICAgICAgICAgU2V0IEhUVFAgY2FjaGluZyByZWxhdGVkIHBhcmFtZXRlcnMgKGZvciBwcm94eSBjYWNoZXMgYW5kIGNsaWVudHMpLgorCisgICAgICAgICBUaGUgb3B0aW9ucyBiZWxvdyBpbnN0cnVjdCBTb2xyIG5vdCB0byBvdXRwdXQgYW55IEhUVFAgQ2FjaGluZworICAgICAgICAgcmVsYXRlZCBoZWFkZXJzCisgICAgICAtLT4KKyAgICA8aHR0cENhY2hpbmcgbmV2ZXIzMDQ9InRydWUiIC8+CisgICAgPCEtLSBJZiB5b3UgaW5jbHVkZSBhIDxjYWNoZUNvbnRyb2w+IGRpcmVjdGl2ZSwgaXQgd2lsbCBiZSB1c2VkIHRvCisgICAgICAgICBnZW5lcmF0ZSBhIENhY2hlLUNvbnRyb2wgaGVhZGVyIChhcyB3ZWxsIGFzIGFuIEV4cGlyZXMgaGVhZGVyCisgICAgICAgICBpZiB0aGUgdmFsdWUgY29udGFpbnMgIm1heC1hZ2U9IikKKyAgICAgICAgIAorICAgICAgICAgQnkgZGVmYXVsdCwgbm8gQ2FjaGUtQ29udHJvbCBoZWFkZXIgaXMgZ2VuZXJhdGVkLgorICAgICAgICAgCisgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgPGNhY2hlQ29udHJvbD4gb3B0aW9uIGV2ZW4gaWYgeW91IGhhdmUgc2V0CisgICAgICAgICBuZXZlcjMwND0idHJ1ZSIKKyAgICAgIC0tPgorICAgIDwhLS0KKyAgICAgICA8aHR0cENhY2hpbmcgbmV2ZXIzMDQ9InRydWUiID4KKyAgICAgICAgIDxjYWNoZUNvbnRyb2w+bWF4LWFnZT0zMCwgcHVibGljPC9jYWNoZUNvbnRyb2w+IAorICAgICAgIDwvaHR0cENhY2hpbmc+CisgICAgICAtLT4KKyAgICA8IS0tIFRvIGVuYWJsZSBTb2xyIHRvIHJlc3BvbmQgd2l0aCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBIVFRQCisgICAgICAgICBDYWNoaW5nIGhlYWRlcnMsIGFuZCB0byByZXNwb25zZSB0byBDYWNoZSBWYWxpZGF0aW9uIHJlcXVlc3RzCisgICAgICAgICBjb3JyZWN0bHksIHNldCB0aGUgdmFsdWUgb2YgbmV2ZXIzMDQ9ImZhbHNlIgorICAgICAgICAgCisgICAgICAgICBUaGlzIHdpbGwgY2F1c2UgU29sciB0byBnZW5lcmF0ZSBMYXN0LU1vZGlmaWVkIGFuZCBFVGFnCisgICAgICAgICBoZWFkZXJzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBJbmRleC4KKworICAgICAgICAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB0byBhZmZlY3QgdGhlCisgICAgICAgICB2YWx1ZXMgb2YgdGhlc2UgaGVhZGVycy4uLgorCisgICAgICAgICBsYXN0TW9kRnJvbSAtIHRoZSBkZWZhdWx0IHZhbHVlIGlzICJvcGVuVGltZSIgd2hpY2ggbWVhbnMgdGhlCisgICAgICAgICBMYXN0LU1vZGlmaWVkIHZhbHVlIChhbmQgdmFsaWRhdGlvbiBhZ2FpbnN0IElmLU1vZGlmaWVkLVNpbmNlCisgICAgICAgICByZXF1ZXN0cykgd2lsbCBhbGwgYmUgcmVsYXRpdmUgdG8gd2hlbiB0aGUgY3VycmVudCBTZWFyY2hlcgorICAgICAgICAgd2FzIG9wZW5lZC4gIFlvdSBjYW4gY2hhbmdlIGl0IHRvIGxhc3RNb2RGcm9tPSJkaXJMYXN0TW9kIiBpZgorICAgICAgICAgeW91IHdhbnQgdGhlIHZhbHVlIHRvIGV4YWN0bHkgY29ycmVzcG9uZCB0byB3aGVuIHRoZSBwaHlzaWNhbAorICAgICAgICAgaW5kZXggd2FzIGxhc3QgbW9kaWZpZWQuCisKKyAgICAgICAgIGV0YWdTZWVkPSIuLi4iIGlzIGFuIG9wdGlvbiB5b3UgY2FuIGNoYW5nZSB0byBmb3JjZSB0aGUgRVRhZworICAgICAgICAgaGVhZGVyIChhbmQgdmFsaWRhdGlvbiBhZ2FpbnN0IElmLU5vbmUtTWF0Y2ggcmVxdWVzdHMpIHRvIGJlCisgICAgICAgICBkaWZmZXJlbnQgZXZlbiBpZiB0aGUgaW5kZXggaGFzIG5vdCBjaGFuZ2VkIChpZTogd2hlbiBtYWtpbmcKKyAgICAgICAgIHNpZ25pZmljYW50IGNoYW5nZXMgdG8geW91ciBjb25maWcgZmlsZSkKKworICAgICAgICAgKGxhc3RNb2RpZmllZEZyb20gYW5kIGV0YWdTZWVkIGFyZSBib3RoIGlnbm9yZWQgaWYgeW91IHVzZQorICAgICAgICAgdGhlIG5ldmVyMzA0PSJ0cnVlIiBvcHRpb24pCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGh0dHBDYWNoaW5nIGxhc3RNb2RpZmllZEZyb209Im9wZW5UaW1lIgorICAgICAgICAgICAgICAgICAgICBldGFnU2VlZD0iU29sciI+CisgICAgICAgICA8Y2FjaGVDb250cm9sPm1heC1hZ2U9MzAsIHB1YmxpYzwvY2FjaGVDb250cm9sPiAKKyAgICAgICA8L2h0dHBDYWNoaW5nPgorICAgICAgLS0+CisgIDwvcmVxdWVzdERpc3BhdGNoZXI+CisKKyAgPCEtLSBSZXF1ZXN0IEhhbmRsZXJzIAorCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NvbHJSZXF1ZXN0SGFuZGxlcgorCisgICAgICAgSW5jb21pbmcgcXVlcmllcyB3aWxsIGJlIGRpc3BhdGNoZWQgdG8gYSBzcGVjaWZpYyBoYW5kbGVyIGJ5IG5hbWUKKyAgICAgICBiYXNlZCBvbiB0aGUgcGF0aCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCisKKyAgICAgICBMZWdhY3kgYmVoYXZpb3I6IElmIHRoZSByZXF1ZXN0IHBhdGggdXNlcyAiL3NlbGVjdCIgYnV0IG5vIFJlcXVlc3QKKyAgICAgICBIYW5kbGVyIGhhcyB0aGF0IG5hbWUsIGFuZCBpZiBoYW5kbGVTZWxlY3Q9InRydWUiIGhhcyBiZWVuIHNwZWNpZmllZCBpbgorICAgICAgIHRoZSByZXF1ZXN0RGlzcGF0Y2hlciwgdGhlbiB0aGUgUmVxdWVzdCBIYW5kbGVyIGlzIGRpc3BhdGNoZWQgYmFzZWQgb24KKyAgICAgICB0aGUgcXQgcGFyYW1ldGVyLiAgSGFuZGxlcnMgd2l0aG91dCBhIGxlYWRpbmcgJy8nIGFyZSBhY2Nlc3NlZCB0aGlzIHdheQorICAgICAgIGxpa2Ugc286IGh0dHA6Ly9ob3N0L2FwcC9bY29yZS9dc2VsZWN0P3F0PW5hbWUgIElmIG5vIHF0IGlzCisgICAgICAgZ2l2ZW4sIHRoZW4gdGhlIHJlcXVlc3RIYW5kbGVyIHRoYXQgZGVjbGFyZXMgZGVmYXVsdD0idHJ1ZSIgd2lsbCBiZQorICAgICAgIHVzZWQgb3IgdGhlIG9uZSBuYW1lZCAic3RhbmRhcmQiLgorCisgICAgICAgSWYgYSBSZXF1ZXN0IEhhbmRsZXIgaXMgZGVjbGFyZWQgd2l0aCBzdGFydHVwPSJsYXp5IiwgdGhlbiBpdCB3aWxsCisgICAgICAgbm90IGJlIGluaXRpYWxpemVkIHVudGlsIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXQgdXNlcyBpdC4KKworICAgIC0tPgorICA8IS0tIFNlYXJjaEhhbmRsZXIKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TZWFyY2hIYW5kbGVyCisKKyAgICAgICBGb3IgcHJvY2Vzc2luZyBTZWFyY2ggUXVlcmllcywgdGhlIHByaW1hcnkgUmVxdWVzdCBIYW5kbGVyCisgICAgICAgcHJvdmlkZWQgd2l0aCBTb2xyIGlzICJTZWFyY2hIYW5kbGVyIiBJdCBkZWxlZ2F0ZXMgdG8gYSBzZXF1ZW50CisgICAgICAgb2YgU2VhcmNoQ29tcG9uZW50cyAoc2VlIGJlbG93KSBhbmQgc3VwcG9ydHMgZGlzdHJpYnV0ZWQKKyAgICAgICBxdWVyaWVzIGFjcm9zcyBtdWx0aXBsZSBzaGFyZHMKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9zZWxlY3QiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgIDwhLS0gZGVmYXVsdCB2YWx1ZXMgZm9yIHF1ZXJ5IHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCwgdGhlc2UKKyAgICAgICAgIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBwYXJhbWV0ZXJzIGluIHRoZSByZXF1ZXN0CisgICAgICAtLT4KKyAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgPHN0ciBuYW1lPSJlY2hvUGFyYW1zIj5leHBsaWNpdDwvc3RyPgorICAgICAgIDxpbnQgbmFtZT0icm93cyI+MTA8L2ludD4KKyAgICAgICA8c3RyIG5hbWU9ImRmIj50ZXh0PC9zdHI+CisgICAgIDwvbHN0PgorICAgIDwhLS0gSW4gYWRkaXRpb24gdG8gZGVmYXVsdHMsICJhcHBlbmRzIiBwYXJhbXMgY2FuIGJlIHNwZWNpZmllZAorICAgICAgICAgdG8gaWRlbnRpZnkgdmFsdWVzIHdoaWNoIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGUgbGlzdCBvZgorICAgICAgICAgbXVsdGktdmFsIHBhcmFtcyBmcm9tIHRoZSBxdWVyeSAob3IgdGhlIGV4aXN0aW5nICJkZWZhdWx0cyIpLgorICAgICAgLS0+CisgICAgPCEtLSBJbiB0aGlzIGV4YW1wbGUsIHRoZSBwYXJhbSAiZnE9aW5zdG9jazp0cnVlIiB3b3VsZCBiZSBhcHBlbmRlZCB0bworICAgICAgICAgYW55IHF1ZXJ5IHRpbWUgZnEgcGFyYW1zIHRoZSB1c2VyIG1heSBzcGVjaWZ5LCBhcyBhIG1lY2hhbmlzbSBmb3IKKyAgICAgICAgIHBhcnRpdGlvbmluZyB0aGUgaW5kZXgsIGluZGVwZW5kZW50IG9mIGFueSB1c2VyIHNlbGVjdGVkIGZpbHRlcmluZworICAgICAgICAgdGhhdCBtYXkgYWxzbyBiZSBkZXNpcmVkIChwZXJoYXBzIGFzIGEgcmVzdWx0IG9mIGZhY2V0ZWQgc2VhcmNoaW5nKS4KKworICAgICAgICAgTk9URTogdGhlcmUgaXMgKmFic29sdXRlbHkqIG5vdGhpbmcgYSBjbGllbnQgY2FuIGRvIHRvIHByZXZlbnQgdGhlc2UKKyAgICAgICAgICJhcHBlbmRzIiB2YWx1ZXMgZnJvbSBiZWluZyB1c2VkLCBzbyBkb24ndCB1c2UgdGhpcyBtZWNoYW5pc20KKyAgICAgICAgIHVubGVzcyB5b3UgYXJlIHN1cmUgeW91IGFsd2F5cyB3YW50IGl0LgorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxsc3QgbmFtZT0iYXBwZW5kcyI+CisgICAgICAgICA8c3RyIG5hbWU9ImZxIj5pblN0b2NrOnRydWU8L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgICAgIC0tPgorICAgIDwhLS0gImludmFyaWFudHMiIGFyZSBhIHdheSBvZiBsZXR0aW5nIHRoZSBTb2xyIG1haW50YWluZXIgbG9jayBkb3duCisgICAgICAgICB0aGUgb3B0aW9ucyBhdmFpbGFibGUgdG8gU29sciBjbGllbnRzLiAgQW55IHBhcmFtcyB2YWx1ZXMKKyAgICAgICAgIHNwZWNpZmllZCBoZXJlIGFyZSB1c2VkIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB2YWx1ZXMgbWF5IGJlIHNwZWNpZmllZAorICAgICAgICAgaW4gZWl0aGVyIHRoZSBxdWVyeSwgdGhlICJkZWZhdWx0cyIsIG9yIHRoZSAiYXBwZW5kcyIgcGFyYW1zLgorCisgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmYWNldC5maWVsZCBhbmQgZmFjZXQucXVlcnkgcGFyYW1zIHdvdWxkCisgICAgICAgICBiZSBmaXhlZCwgbGltaXRpbmcgdGhlIGZhY2V0cyBjbGllbnRzIGNhbiB1c2UuICBGYWNldGluZyBpcworICAgICAgICAgbm90IHR1cm5lZCBvbiBieSBkZWZhdWx0IC0gYnV0IGlmIHRoZSBjbGllbnQgZG9lcyBzcGVjaWZ5CisgICAgICAgICBmYWNldD10cnVlIGluIHRoZSByZXF1ZXN0LCB0aGVzZSBhcmUgdGhlIG9ubHkgZmFjZXRzIHRoZXkKKyAgICAgICAgIHdpbGwgYmUgYWJsZSB0byBzZWUgY291bnRzIGZvcjsgcmVnYXJkbGVzcyBvZiB3aGF0IG90aGVyCisgICAgICAgICBmYWNldC5maWVsZCBvciBmYWNldC5xdWVyeSBwYXJhbXMgdGhleSBtYXkgc3BlY2lmeS4KKworICAgICAgICAgTk9URTogdGhlcmUgaXMgKmFic29sdXRlbHkqIG5vdGhpbmcgYSBjbGllbnQgY2FuIGRvIHRvIHByZXZlbnQgdGhlc2UKKyAgICAgICAgICJpbnZhcmlhbnRzIiB2YWx1ZXMgZnJvbSBiZWluZyB1c2VkLCBzbyBkb24ndCB1c2UgdGhpcyBtZWNoYW5pc20KKyAgICAgICAgIHVubGVzcyB5b3UgYXJlIHN1cmUgeW91IGFsd2F5cyB3YW50IGl0LgorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxsc3QgbmFtZT0iaW52YXJpYW50cyI+CisgICAgICAgICA8c3RyIG5hbWU9ImZhY2V0LmZpZWxkIj5jYXQ8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iZmFjZXQuZmllbGQiPm1hbnVfZXhhY3Q8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iZmFjZXQucXVlcnkiPnByaWNlOlsqIFRPIDUwMF08L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iZmFjZXQucXVlcnkiPnByaWNlOls1MDAgVE8gKl08L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgICAgIC0tPgorICAgIDwhLS0gSWYgdGhlIGRlZmF1bHQgbGlzdCBvZiBTZWFyY2hDb21wb25lbnRzIGlzIG5vdCBkZXNpcmVkLCB0aGF0CisgICAgICAgICBsaXN0IGNhbiBlaXRoZXIgYmUgb3ZlcnJpZGRlbiBjb21wbGV0ZWx5LCBvciBjb21wb25lbnRzIGNhbiBiZQorICAgICAgICAgcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIHRoZSBkZWZhdWx0IGxpc3QuICAoc2VlIGJlbG93KQorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxhcnIgbmFtZT0iY29tcG9uZW50cyI+CisgICAgICAgICA8c3RyPm5hbWVPZkN1c3RvbUNvbXBvbmVudDE8L3N0cj4KKyAgICAgICAgIDxzdHI+bmFtZU9mQ3VzdG9tQ29tcG9uZW50Mjwvc3RyPgorICAgICAgIDwvYXJyPgorICAgICAgLS0+CisgICAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIEEgcmVxdWVzdCBoYW5kbGVyIHRoYXQgcmV0dXJucyBpbmRlbnRlZCBKU09OIGJ5IGRlZmF1bHQgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvcXVlcnkiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgICA8c3RyIG5hbWU9ImVjaG9QYXJhbXMiPmV4cGxpY2l0PC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJ3dCI+anNvbjwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0iaW5kZW50Ij50cnVlPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJkZiI+dGV4dDwvc3RyPgorICAgICA8L2xzdD4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworCisgIDwhLS0gcmVhbHRpbWUgZ2V0IGhhbmRsZXIsIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBsYXRlc3Qgc3RvcmVkIGZpZWxkcyBvZgorICAgICAgIGFueSBkb2N1bWVudCwgd2l0aG91dCB0aGUgbmVlZCB0byBjb21taXQgb3Igb3BlbiBhIG5ldyBzZWFyY2hlci4gIFRoZQorICAgICAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoZSB1cGRhdGVMb2cgZmVhdHVyZSBiZWluZyBlbmFibGVkLgorCisgICAgICAgKiogV0FSTklORyAqKgorICAgICAgIERvIE5PVCBkaXNhYmxlIHRoZSByZWFsdGltZSBnZXQgaGFuZGxlciBhdCAvZ2V0IGlmIHlvdSBhcmUgdXNpbmcKKyAgICAgICBTb2xyQ2xvdWQgb3RoZXJ3aXNlIGFueSBsZWFkZXIgZWxlY3Rpb24gd2lsbCBjYXVzZSBhIGZ1bGwgc3luYyBpbiBBTEwKKyAgICAgICByZXBsaWNhcyBmb3IgdGhlIHNoYXJkIGluIHF1ZXN0aW9uLiBTaW1pbGFybHksIGEgcmVwbGljYSByZWNvdmVyeSB3aWxsCisgICAgICAgYWxzbyBhbHdheXMgZmV0Y2ggdGhlIGNvbXBsZXRlIGluZGV4IGZyb20gdGhlIGxlYWRlciBiZWNhdXNlIGEgcGFydGlhbAorICAgICAgIHN5bmMgd2lsbCBub3QgYmUgcG9zc2libGUgaW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBoYW5kbGVyLgorICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9nZXQiIGNsYXNzPSJzb2xyLlJlYWxUaW1lR2V0SGFuZGxlciI+CisgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgIDxzdHIgbmFtZT0ib21pdEhlYWRlciI+dHJ1ZTwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0id3QiPmpzb248L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImluZGVudCI+dHJ1ZTwvc3RyPgorICAgICA8L2xzdD4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworIAorICA8IS0tIEEgUm9idXN0IEV4YW1wbGUgCisgICAgICAgCisgICAgICAgVGhpcyBleGFtcGxlIFNlYXJjaEhhbmRsZXIgZGVjbGFyYXRpb24gc2hvd3Mgb2ZmIHVzYWdlIG9mIHRoZQorICAgICAgIFNlYXJjaEhhbmRsZXIgd2l0aCBtYW55IGRlZmF1bHRzIGRlY2xhcmVkCisKKyAgICAgICBOb3RlIHRoYXQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIFJlcXVlc3QgSGFuZGxlcgorICAgICAgIChTZWFyY2hIYW5kbGVyKSBjYW4gYmUgcmVnaXN0ZXJlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudAorICAgICAgIG5hbWVzIChhbmQgZGlmZmVyZW50IGluaXQgcGFyYW1ldGVycykKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9icm93c2UiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgICA8c3RyIG5hbWU9ImVjaG9QYXJhbXMiPmV4cGxpY2l0PC9zdHI+CisKKyAgICAgICA8IS0tIFZlbG9jaXR5UmVzcG9uc2VXcml0ZXIgc2V0dGluZ3MgLS0+CisgICAgICAgPHN0ciBuYW1lPSJ3dCI+dmVsb2NpdHk8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9InYudGVtcGxhdGUiPmJyb3dzZTwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0idi5sYXlvdXQiPmxheW91dDwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0idGl0bGUiPlNvbHJpdGFzPC9zdHI+CisKKyAgICAgICA8IS0tIFF1ZXJ5IHNldHRpbmdzIC0tPgorICAgICAgIDxzdHIgbmFtZT0iZGVmVHlwZSI+ZWRpc21heDwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0icWYiPgorICAgICAgICAgIHRleHReMC41IGZlYXR1cmVzXjEuMCBuYW1lXjEuMiBza3VeMS41IGlkXjEwLjAgbWFudV4xLjEgY2F0XjEuNAorICAgICAgICAgIHRpdGxlXjEwLjAgZGVzY3JpcHRpb25eNS4wIGtleXdvcmRzXjUuMCBhdXRob3JeMi4wIHJlc291cmNlbmFtZV4xLjAKKyAgICAgICA8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImRmIj50ZXh0PC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJtbSI+MTAwJTwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0icS5hbHQiPio6Kjwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0icm93cyI+MTA8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImZsIj4qLHNjb3JlPC9zdHI+CisKKyAgICAgICA8c3RyIG5hbWU9Im1sdC5xZiI+CisgICAgICAgICB0ZXh0XjAuNSBmZWF0dXJlc14xLjAgbmFtZV4xLjIgc2t1XjEuNSBpZF4xMC4wIG1hbnVeMS4xIGNhdF4xLjQKKyAgICAgICAgIHRpdGxlXjEwLjAgZGVzY3JpcHRpb25eNS4wIGtleXdvcmRzXjUuMCBhdXRob3JeMi4wIHJlc291cmNlbmFtZV4xLjAKKyAgICAgICA8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9Im1sdC5mbCI+dGV4dCxmZWF0dXJlcyxuYW1lLHNrdSxpZCxtYW51LGNhdCx0aXRsZSxkZXNjcmlwdGlvbixrZXl3b3JkcyxhdXRob3IscmVzb3VyY2VuYW1lPC9zdHI+CisgICAgICAgPGludCBuYW1lPSJtbHQuY291bnQiPjM8L2ludD4KKworICAgICAgIDwhLS0gRmFjZXRpbmcgZGVmYXVsdHMgLS0+CisgICAgICAgPHN0ciBuYW1lPSJmYWNldCI+b248L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImZhY2V0LmZpZWxkIj5jYXQ8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImZhY2V0LmZpZWxkIj5tYW51X2V4YWN0PC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmYWNldC5maWVsZCI+Y29udGVudF90eXBlPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmYWNldC5maWVsZCI+YXV0aG9yX3M8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImZhY2V0LnF1ZXJ5Ij5pcG9kPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmYWNldC5xdWVyeSI+R0I8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImZhY2V0Lm1pbmNvdW50Ij4xPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmYWNldC5waXZvdCI+Y2F0LGluU3RvY2s8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImZhY2V0LnJhbmdlLm90aGVyIj5hZnRlcjwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0iZmFjZXQucmFuZ2UiPnByaWNlPC9zdHI+CisgICAgICAgPGludCBuYW1lPSJmLnByaWNlLmZhY2V0LnJhbmdlLnN0YXJ0Ij4wPC9pbnQ+CisgICAgICAgPGludCBuYW1lPSJmLnByaWNlLmZhY2V0LnJhbmdlLmVuZCI+NjAwPC9pbnQ+CisgICAgICAgPGludCBuYW1lPSJmLnByaWNlLmZhY2V0LnJhbmdlLmdhcCI+NTA8L2ludD4KKyAgICAgICA8c3RyIG5hbWU9ImZhY2V0LnJhbmdlIj5wb3B1bGFyaXR5PC9zdHI+CisgICAgICAgPGludCBuYW1lPSJmLnBvcHVsYXJpdHkuZmFjZXQucmFuZ2Uuc3RhcnQiPjA8L2ludD4KKyAgICAgICA8aW50IG5hbWU9ImYucG9wdWxhcml0eS5mYWNldC5yYW5nZS5lbmQiPjEwPC9pbnQ+CisgICAgICAgPGludCBuYW1lPSJmLnBvcHVsYXJpdHkuZmFjZXQucmFuZ2UuZ2FwIj4zPC9pbnQ+CisgICAgICAgPHN0ciBuYW1lPSJmYWNldC5yYW5nZSI+bWFudWZhY3R1cmVkYXRlX2R0PC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmLm1hbnVmYWN0dXJlZGF0ZV9kdC5mYWNldC5yYW5nZS5zdGFydCI+Tk9XL1lFQVItMTBZRUFSUzwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0iZi5tYW51ZmFjdHVyZWRhdGVfZHQuZmFjZXQucmFuZ2UuZW5kIj5OT1c8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImYubWFudWZhY3R1cmVkYXRlX2R0LmZhY2V0LnJhbmdlLmdhcCI+KzFZRUFSPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmLm1hbnVmYWN0dXJlZGF0ZV9kdC5mYWNldC5yYW5nZS5vdGhlciI+YmVmb3JlPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmLm1hbnVmYWN0dXJlZGF0ZV9kdC5mYWNldC5yYW5nZS5vdGhlciI+YWZ0ZXI8L3N0cj4KKworICAgICAgIDwhLS0gSGlnaGxpZ2h0aW5nIGRlZmF1bHRzIC0tPgorICAgICAgIDxzdHIgbmFtZT0iaGwiPm9uPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJobC5mbCI+Y29udGVudCBmZWF0dXJlcyB0aXRsZSBuYW1lPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJobC5lbmNvZGVyIj5odG1sPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJobC5zaW1wbGUucHJlIj4mbHQ7YiZndDs8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImhsLnNpbXBsZS5wb3N0Ij4mbHQ7L2ImZ3Q7PC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmLnRpdGxlLmhsLmZyYWdzaXplIj4wPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmLnRpdGxlLmhsLmFsdGVybmF0ZUZpZWxkIj50aXRsZTwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0iZi5uYW1lLmhsLmZyYWdzaXplIj4wPC9zdHI+CisgICAgICAgPHN0ciBuYW1lPSJmLm5hbWUuaGwuYWx0ZXJuYXRlRmllbGQiPm5hbWU8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImYuY29udGVudC5obC5zbmlwcGV0cyI+Mzwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0iZi5jb250ZW50LmhsLmZyYWdzaXplIj4yMDA8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImYuY29udGVudC5obC5hbHRlcm5hdGVGaWVsZCI+Y29udGVudDwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0iZi5jb250ZW50LmhsLm1heEFsdGVybmF0ZUZpZWxkTGVuZ3RoIj43NTA8L3N0cj4KKworICAgICAgIDwhLS0gU3BlbGwgY2hlY2tpbmcgZGVmYXVsdHMgLS0+CisgICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrIj5vbjwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5leHRlbmRlZFJlc3VsdHMiPmZhbHNlPC9zdHI+ICAgICAgIAorICAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5jb3VudCI+NTwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5hbHRlcm5hdGl2ZVRlcm1Db3VudCI+Mjwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5tYXhSZXN1bHRzRm9yU3VnZ2VzdCI+NTwvc3RyPiAgICAgICAKKyAgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suY29sbGF0ZSI+dHJ1ZTwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5jb2xsYXRlRXh0ZW5kZWRSZXN1bHRzIj50cnVlPC9zdHI+ICAKKyAgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9uVHJpZXMiPjU8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9ucyI+Mzwvc3RyPiAgICAgICAgICAgCisgICAgIDwvbHN0PgorCisgICAgIDwhLS0gYXBwZW5kIHNwZWxsY2hlY2tpbmcgdG8gb3VyIGxpc3Qgb2YgY29tcG9uZW50cyAtLT4KKyAgICAgPGFyciBuYW1lPSJsYXN0LWNvbXBvbmVudHMiPgorICAgICAgIDxzdHI+c3BlbGxjaGVjazwvc3RyPgorICAgICA8L2Fycj4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworCisgIDwhLS0gVXBkYXRlIFJlcXVlc3QgSGFuZGxlci4gIAorICAgICAgIAorICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9VcGRhdGVYbWxNZXNzYWdlcworCisgICAgICAgVGhlIGNhbm9uaWNhbCBSZXF1ZXN0IEhhbmRsZXIgZm9yIE1vZGlmeWluZyB0aGUgSW5kZXggdGhyb3VnaAorICAgICAgIGNvbW1hbmRzIHNwZWNpZmllZCB1c2luZyBYTUwsIEpTT04sIENTViwgb3IgSkFWQUJJTgorCisgICAgICAgTm90ZTogU2luY2Ugc29scjEuMSByZXF1ZXN0SGFuZGxlcnMgcmVxdWlyZXMgYSB2YWxpZCBjb250ZW50CisgICAgICAgdHlwZSBoZWFkZXIgaWYgcG9zdGVkIGluIHRoZSBib2R5LiBGb3IgZXhhbXBsZSwgY3VybCBub3cKKyAgICAgICByZXF1aXJlczogLUggJ0NvbnRlbnQtdHlwZTp0ZXh0L3htbDsgY2hhcnNldD11dGYtOCcKKyAgICAgICAKKyAgICAgICBUbyBvdmVycmlkZSB0aGUgcmVxdWVzdCBjb250ZW50IHR5cGUgYW5kIGZvcmNlIGEgc3BlY2lmaWMgCisgICAgICAgQ29udGVudC10eXBlLCB1c2UgdGhlIHJlcXVlc3QgcGFyYW1ldGVyOiAKKyAgICAgICAgID91cGRhdGUuY29udGVudFR5cGU9dGV4dC9jc3YKKyAgICAgICAKKyAgICAgICBUaGlzIGhhbmRsZXIgd2lsbCBwaWNrIGEgcmVzcG9uc2UgZm9ybWF0IHRvIG1hdGNoIHRoZSBpbnB1dAorICAgICAgIGlmIHRoZSAnd3QnIHBhcmFtZXRlciBpcyBub3QgZXhwbGljaXQKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii91cGRhdGUiIGNsYXNzPSJzb2xyLlVwZGF0ZVJlcXVlc3RIYW5kbGVyIj4KKyAgICA8IS0tIFNlZSBiZWxvdyBmb3IgaW5mb3JtYXRpb24gb24gZGVmaW5pbmcgCisgICAgICAgICB1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW5zIHRoYXQgY2FuIGJlIHVzZWQgYnkgbmFtZSAKKyAgICAgICAgIG9uIGVhY2ggVXBkYXRlIFJlcXVlc3QKKyAgICAgIC0tPgorICAgIDwhLS0KKyAgICAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgICAgIDxzdHIgbmFtZT0idXBkYXRlLmNoYWluIj5kZWR1cGU8L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgICAgICAtLT4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIGZvciBiYWNrIGNvbXBhdCB3aXRoIGNsaWVudHMgdXNpbmcgL3VwZGF0ZS9qc29uIGFuZCAvdXBkYXRlL2NzdiAtLT4gIAorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL3VwZGF0ZS9qc29uIiBjbGFzcz0ic29sci5VcGRhdGVSZXF1ZXN0SGFuZGxlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgPHN0ciBuYW1lPSJzdHJlYW0uY29udGVudFR5cGUiPmFwcGxpY2F0aW9uL2pzb248L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii91cGRhdGUvY3N2IiBjbGFzcz0ic29sci5VcGRhdGVSZXF1ZXN0SGFuZGxlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgPHN0ciBuYW1lPSJzdHJlYW0uY29udGVudFR5cGUiPmFwcGxpY2F0aW9uL2Nzdjwvc3RyPgorICAgICAgIDwvbHN0PgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisgIDwhLS0gU29sciBDZWxsIFVwZGF0ZSBSZXF1ZXN0IEhhbmRsZXIKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9FeHRyYWN0aW5nUmVxdWVzdEhhbmRsZXIgCisKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii91cGRhdGUvZXh0cmFjdCIgCisgICAgICAgICAgICAgICAgICBzdGFydHVwPSJsYXp5IgorICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuZXh0cmFjdGlvbi5FeHRyYWN0aW5nUmVxdWVzdEhhbmRsZXIiID4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0ibG93ZXJuYW1lcyI+dHJ1ZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJ1cHJlZml4Ij5pZ25vcmVkXzwvc3RyPgorCisgICAgICA8IS0tIGNhcHR1cmUgbGluayBocmVmcyBidXQgaWdub3JlIGRpdiBhdHRyaWJ1dGVzIC0tPgorICAgICAgPHN0ciBuYW1lPSJjYXB0dXJlQXR0ciI+dHJ1ZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmbWFwLmEiPmxpbmtzPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZtYXAuZGl2Ij5pZ25vcmVkXzwvc3RyPgorICAgIDwvbHN0PgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisKKyAgPCEtLSBGaWVsZCBBbmFseXNpcyBSZXF1ZXN0IEhhbmRsZXIKKworICAgICAgIFJlcXVlc3RIYW5kbGVyIHRoYXQgcHJvdmlkZXMgbXVjaCB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzCisgICAgICAgYW5hbHlzaXMuanNwLiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IG11bHRpcGxlIGZpZWxkCisgICAgICAgdHlwZXMgYW5kIGZpZWxkIG5hbWVzIGluIHRoZSBzYW1lIHJlcXVlc3QgYW5kIG91dHB1dHMKKyAgICAgICBpbmRleC10aW1lIGFuZCBxdWVyeS10aW1lIGFuYWx5c2lzIGZvciBlYWNoIG9mIHRoZW0uCisKKyAgICAgICBSZXF1ZXN0IHBhcmFtZXRlcnMgYXJlOgorICAgICAgIGFuYWx5c2lzLmZpZWxkbmFtZSAtIGZpZWxkIG5hbWUgd2hvc2UgYW5hbHl6ZXJzIGFyZSB0byBiZSB1c2VkCisKKyAgICAgICBhbmFseXNpcy5maWVsZHR5cGUgLSBmaWVsZCB0eXBlIHdob3NlIGFuYWx5emVycyBhcmUgdG8gYmUgdXNlZAorICAgICAgIGFuYWx5c2lzLmZpZWxkdmFsdWUgLSB0ZXh0IGZvciBpbmRleC10aW1lIGFuYWx5c2lzCisgICAgICAgcSAob3IgYW5hbHlzaXMucSkgLSB0ZXh0IGZvciBxdWVyeSB0aW1lIGFuYWx5c2lzCisgICAgICAgYW5hbHlzaXMuc2hvd21hdGNoICh0cnVlfGZhbHNlKSAtIFdoZW4gc2V0IHRvIHRydWUgYW5kIHdoZW4KKyAgICAgICAgICAgcXVlcnkgYW5hbHlzaXMgaXMgcGVyZm9ybWVkLCB0aGUgcHJvZHVjZWQgdG9rZW5zIG9mIHRoZQorICAgICAgICAgICBmaWVsZCB2YWx1ZSBhbmFseXNpcyB3aWxsIGJlIG1hcmtlZCBhcyAibWF0Y2hlZCIgZm9yIGV2ZXJ5CisgICAgICAgICAgIHRva2VuIHRoYXQgaXMgcHJvZHVjZXMgYnkgdGhlIHF1ZXJ5IGFuYWx5c2lzCisgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hbmFseXNpcy9maWVsZCIgCisgICAgICAgICAgICAgICAgICBzdGFydHVwPSJsYXp5IgorICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuRmllbGRBbmFseXNpc1JlcXVlc3RIYW5kbGVyIiAvPgorCisKKyAgPCEtLSBEb2N1bWVudCBBbmFseXNpcyBIYW5kbGVyCisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvQW5hbHlzaXNSZXF1ZXN0SGFuZGxlcgorCisgICAgICAgQW4gYW5hbHlzaXMgaGFuZGxlciB0aGF0IHByb3ZpZGVzIGEgYnJlYWtkb3duIG9mIHRoZSBhbmFseXNpcworICAgICAgIHByb2Nlc3Mgb2YgcHJvdmlkZWQgZG9jdW1lbnRzLiBUaGlzIGhhbmRsZXIgZXhwZWN0cyBhIChzaW5nbGUpCisgICAgICAgY29udGVudCBzdHJlYW0gd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgICAgIDxkb2NzPgorICAgICAgICAgPGRvYz4KKyAgICAgICAgICAgPGZpZWxkIG5hbWU9ImlkIj4xPC9maWVsZD4KKyAgICAgICAgICAgPGZpZWxkIG5hbWU9Im5hbWUiPlRoZSBOYW1lPC9maWVsZD4KKyAgICAgICAgICAgPGZpZWxkIG5hbWU9InRleHQiPlRoZSBUZXh0IFZhbHVlPC9maWVsZD4KKyAgICAgICAgIDwvZG9jPgorICAgICAgICAgPGRvYz4uLi48L2RvYz4KKyAgICAgICAgIDxkb2M+Li4uPC9kb2M+CisgICAgICAgICAuLi4KKyAgICAgICA8L2RvY3M+CisKKyAgICBOb3RlOiBFYWNoIGRvY3VtZW50IG11c3QgY29udGFpbiBhIGZpZWxkIHdoaWNoIHNlcnZlcyBhcyB0aGUKKyAgICB1bmlxdWUga2V5LiBUaGlzIGtleSBpcyB1c2VkIGluIHRoZSByZXR1cm5lZCByZXNwb25zZSB0byBhc3NvY2lhdGUKKyAgICBhbiBhbmFseXNpcyBicmVha2Rvd24gdG8gdGhlIGFuYWx5emVkIGRvY3VtZW50LgorCisgICAgTGlrZSB0aGUgRmllbGRBbmFseXNpc1JlcXVlc3RIYW5kbGVyLCB0aGlzIGhhbmRsZXIgYWxzbyBzdXBwb3J0cworICAgIHF1ZXJ5IGFuYWx5c2lzIGJ5IHNlbmRpbmcgZWl0aGVyIGFuICJhbmFseXNpcy5xdWVyeSIgb3IgInEiCisgICAgcmVxdWVzdCBwYXJhbWV0ZXIgdGhhdCBob2xkcyB0aGUgcXVlcnkgdGV4dCB0byBiZSBhbmFseXplZC4gSXQKKyAgICBhbHNvIHN1cHBvcnRzIHRoZSAiYW5hbHlzaXMuc2hvd21hdGNoIiBwYXJhbWV0ZXIgd2hpY2ggd2hlbiBzZXQgdG8KKyAgICB0cnVlLCBhbGwgZmllbGQgdG9rZW5zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHRva2VucyB3aWxsIGJlIG1hcmtlZAorICAgIGFzIGEgIm1hdGNoIi4gCisgIC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2FuYWx5c2lzL2RvY3VtZW50IiAKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLkRvY3VtZW50QW5hbHlzaXNSZXF1ZXN0SGFuZGxlciIgCisgICAgICAgICAgICAgICAgICBzdGFydHVwPSJsYXp5IiAvPgorCisgIDwhLS0gQWRtaW4gSGFuZGxlcnMKKworICAgICAgIEFkbWluIEhhbmRsZXJzIC0gVGhpcyB3aWxsIHJlZ2lzdGVyIGFsbCB0aGUgc3RhbmRhcmQgYWRtaW4KKyAgICAgICBSZXF1ZXN0SGFuZGxlcnMuICAKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi8iIAorICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuYWRtaW4uQWRtaW5IYW5kbGVycyIgLz4KKyAgPCEtLSBUaGlzIHNpbmdsZSBoYW5kbGVyIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZy4uLiAtLT4KKyAgPCEtLQorICAgICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2FkbWluL2x1a2UiICAgICAgIGNsYXNzPSJzb2xyLmFkbWluLkx1a2VSZXF1ZXN0SGFuZGxlciIgLz4KKyAgICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi9zeXN0ZW0iICAgICBjbGFzcz0ic29sci5hZG1pbi5TeXN0ZW1JbmZvSGFuZGxlciIgLz4KKyAgICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi9wbHVnaW5zIiAgICBjbGFzcz0ic29sci5hZG1pbi5QbHVnaW5JbmZvSGFuZGxlciIgLz4KKyAgICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi90aHJlYWRzIiAgICBjbGFzcz0ic29sci5hZG1pbi5UaHJlYWREdW1wSGFuZGxlciIgLz4KKyAgICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi9wcm9wZXJ0aWVzIiBjbGFzcz0ic29sci5hZG1pbi5Qcm9wZXJ0aWVzUmVxdWVzdEhhbmRsZXIiIC8+CisgICAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvYWRtaW4vZmlsZSIgICAgICAgY2xhc3M9InNvbHIuYWRtaW4uU2hvd0ZpbGVSZXF1ZXN0SGFuZGxlciIgPgorICAgIC0tPgorICA8IS0tIElmIHlvdSB3aXNoIHRvIGhpZGUgZmlsZXMgdW5kZXIgJHtzb2xyLmhvbWV9L2NvbmYsIGV4cGxpY2l0bHkKKyAgICAgICByZWdpc3RlciB0aGUgU2hvd0ZpbGVSZXF1ZXN0SGFuZGxlciB1c2luZyB0aGUgZGVmaW5pdGlvbiBiZWxvdy4gCisgICAgICAgTk9URTogVGhlIGdsb2IgcGF0dGVybiAoJyonKSBpcyB0aGUgb25seSBwYXR0ZXJuIHN1cHBvcnRlZCBhdCBwcmVzZW50LCAqLnhtbCB3aWxsCisgICAgICAgICAgICAgbm90IGV4Y2x1ZGUgYWxsIGZpbGVzIGVuZGluZyBpbiAnLnhtbCcuIFVzZSBpdCB0byBleGNsdWRlIF9hbGxfIHVwZGF0ZXMKKyAgICAtLT4KKyAgPCEtLQorICAgICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2FkbWluL2ZpbGUiIAorICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuYWRtaW4uU2hvd0ZpbGVSZXF1ZXN0SGFuZGxlciIgPgorICAgICAgIDxsc3QgbmFtZT0iaW52YXJpYW50cyI+CisgICAgICAgICA8c3RyIG5hbWU9ImhpZGRlbiI+c3lub255bXMudHh0PC9zdHI+IAorICAgICAgICAgPHN0ciBuYW1lPSJoaWRkZW4iPmFub3RoZXJmaWxlLnR4dDwvc3RyPiAKKyAgICAgICAgIDxzdHIgbmFtZT0iaGlkZGVuIj4qPC9zdHI+IAorICAgICAgIDwvbHN0PgorICAgICA8L3JlcXVlc3RIYW5kbGVyPgorICAgIC0tPgorCisgIDwhLS0KKyAgICBFbmFibGluZyB0aGlzIHJlcXVlc3QgaGFuZGxlciAod2hpY2ggaXMgTk9UIGEgZGVmYXVsdCBwYXJ0IG9mIHRoZSBhZG1pbiBoYW5kbGVyKSB3aWxsIGFsbG93IHRoZSBTb2xyIFVJIHRvIGVkaXQKKyAgICBhbGwgdGhlIGNvbmZpZyBmaWxlcy4gVGhpcyBpcyBpbnRlbmRlZCBmb3Igc2VjdXJlL2RldmVsb3BtZW50IHVzZSBPTkxZISBMZWF2aW5nIGF2YWlsYWJsZSBhbmQgcHVibGljYWxseQorICAgIGFjY2Vzc2libGUgaXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFuZCBzaG91bGQgYmUgZG9uZSB3aXRoIGV4dHJlbWUgY2F1dGlvbiEKKyAgLS0+CisgIDwhLS0gcGluZy9oZWFsdGhjaGVjayAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi9waW5nIiBjbGFzcz0ic29sci5QaW5nUmVxdWVzdEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iaW52YXJpYW50cyI+CisgICAgICA8c3RyIG5hbWU9InEiPnNvbHJwaW5ncXVlcnk8L3N0cj4KKyAgICA8L2xzdD4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0iZWNob1BhcmFtcyI+YWxsPC9zdHI+CisgICAgPC9sc3Q+CisgICAgPCEtLSBBbiBvcHRpb25hbCBmZWF0dXJlIG9mIHRoZSBQaW5nUmVxdWVzdEhhbmRsZXIgaXMgdG8gY29uZmlndXJlIHRoZSAKKyAgICAgICAgIGhhbmRsZXIgd2l0aCBhICJoZWFsdGhjaGVja0ZpbGUiIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZS9kaXNhYmxlIAorICAgICAgICAgdGhlIFBpbmdSZXF1ZXN0SGFuZGxlci4KKyAgICAgICAgIHJlbGF0aXZlIHBhdGhzIGFyZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBkYXRhIGRpciAKKyAgICAgIC0tPgorICAgIDwhLS0gPHN0ciBuYW1lPSJoZWFsdGhjaGVja0ZpbGUiPnNlcnZlci1lbmFibGVkLnR4dDwvc3RyPiAtLT4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIEVjaG8gdGhlIHJlcXVlc3QgY29udGVudHMgYmFjayB0byB0aGUgY2xpZW50IC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2RlYnVnL2R1bXAiIGNsYXNzPSJzb2xyLkR1bXBSZXF1ZXN0SGFuZGxlciIgPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICA8c3RyIG5hbWU9ImVjaG9QYXJhbXMiPmV4cGxpY2l0PC9zdHI+IAorICAgICA8c3RyIG5hbWU9ImVjaG9IYW5kbGVyIj50cnVlPC9zdHI+CisgICAgPC9sc3Q+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisgIAorICA8IS0tIFNvbHIgUmVwbGljYXRpb24KKworICAgICAgIFRoZSBTb2xyUmVwbGljYXRpb25IYW5kbGVyIHN1cHBvcnRzIHJlcGxpY2F0aW5nIGluZGV4ZXMgZnJvbSBhCisgICAgICAgIm1hc3RlciIgdXNlZCBmb3IgaW5kZXhpbmcgYW5kICJzbGF2ZXMiIHVzZWQgZm9yIHF1ZXJpZXMuCisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU29sclJlcGxpY2F0aW9uIAorCisgICAgICAgSXQgaXMgYWxzbyBuZWNlc3NhcnkgZm9yIFNvbHJDbG91ZCB0byBmdW5jdGlvbiAoaW4gQ2xvdWQgbW9kZSwgdGhlCisgICAgICAgcmVwbGljYXRpb24gaGFuZGxlciBpcyB1c2VkIHRvIGJ1bGsgdHJhbnNmZXIgc2VnbWVudHMgd2hlbiBub2RlcyAKKyAgICAgICBhcmUgYWRkZWQgb3IgbmVlZCB0byByZWNvdmVyKS4KKworICAgICAgIGh0dHBzOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU29sckNsb3VkLworICAgIC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL3JlcGxpY2F0aW9uIiBjbGFzcz0ic29sci5SZXBsaWNhdGlvbkhhbmRsZXIiID4gCisgICAgPCEtLQorICAgICAgIFRvIGVuYWJsZSBzaW1wbGUgbWFzdGVyL3NsYXZlIHJlcGxpY2F0aW9uLCB1bmNvbW1lbnQgb25lIG9mIHRoZSAKKyAgICAgICBzZWN0aW9ucyBiZWxvdywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyBzb2xyIGluc3RhbmNlIHNob3VsZCBiZQorICAgICAgIHRoZSAibWFzdGVyIiBvciBhICJzbGF2ZSIuICBJZiB0aGlzIGluc3RhbmNlIGlzIGEgInNsYXZlIiB5b3Ugd2lsbCAKKyAgICAgICBhbHNvIG5lZWQgdG8gZmlsbCBpbiB0aGUgbWFzdGVyVXJsIHRvIHBvaW50IHRvIGEgcmVhbCBtYWNoaW5lLgorICAgIC0tPgorICAgIDwhLS0KKyAgICAgICA8bHN0IG5hbWU9Im1hc3RlciI+CisgICAgICAgICA8c3RyIG5hbWU9InJlcGxpY2F0ZUFmdGVyIj5jb21taXQ8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0icmVwbGljYXRlQWZ0ZXIiPnN0YXJ0dXA8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iY29uZkZpbGVzIj5zY2hlbWEueG1sLHN0b3B3b3Jkcy50eHQ8L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxzdCBuYW1lPSJzbGF2ZSI+CisgICAgICAgICA8c3RyIG5hbWU9Im1hc3RlclVybCI+aHR0cDovL3lvdXItbWFzdGVyLWhvc3RuYW1lOjg5ODMvc29scjwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJwb2xsSW50ZXJ2YWwiPjAwOjAwOjYwPC9zdHI+CisgICAgICAgPC9sc3Q+CisgICAgLS0+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKyAgPCEtLSBTZWFyY2ggQ29tcG9uZW50cworCisgICAgICAgU2VhcmNoIGNvbXBvbmVudHMgYXJlIHJlZ2lzdGVyZWQgdG8gU29sckNvcmUgYW5kIHVzZWQgYnkgCisgICAgICAgaW5zdGFuY2VzIG9mIFNlYXJjaEhhbmRsZXIgKHdoaWNoIGNhbiBhY2Nlc3MgdGhlbSBieSBuYW1lKQorICAgICAgIAorICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlOgorICAgICAgIAorICAgICAgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0icXVlcnkiICAgICBjbGFzcz0ic29sci5RdWVyeUNvbXBvbmVudCIgLz4KKyAgICAgICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9ImZhY2V0IiAgICAgY2xhc3M9InNvbHIuRmFjZXRDb21wb25lbnQiIC8+CisgICAgICAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJtbHQiICAgICAgIGNsYXNzPSJzb2xyLk1vcmVMaWtlVGhpc0NvbXBvbmVudCIgLz4KKyAgICAgICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9ImhpZ2hsaWdodCIgY2xhc3M9InNvbHIuSGlnaGxpZ2h0Q29tcG9uZW50IiAvPgorICAgICAgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0ic3RhdHMiICAgICBjbGFzcz0ic29sci5TdGF0c0NvbXBvbmVudCIgLz4KKyAgICAgICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9ImRlYnVnIiAgICAgY2xhc3M9InNvbHIuRGVidWdDb21wb25lbnQiIC8+CisgICAKKyAgICAgICBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gYSByZXF1ZXN0SGFuZGxlciB3b3VsZCBsb29rIGxpa2U6CisKKyAgICAgICA8YXJyIG5hbWU9ImNvbXBvbmVudHMiPgorICAgICAgICAgPHN0cj5xdWVyeTwvc3RyPgorICAgICAgICAgPHN0cj5mYWNldDwvc3RyPgorICAgICAgICAgPHN0cj5tbHQ8L3N0cj4KKyAgICAgICAgIDxzdHI+aGlnaGxpZ2h0PC9zdHI+CisgICAgICAgICA8c3RyPnN0YXRzPC9zdHI+CisgICAgICAgICA8c3RyPmRlYnVnPC9zdHI+CisgICAgICAgPC9hcnI+CisKKyAgICAgICBJZiB5b3UgcmVnaXN0ZXIgYSBzZWFyY2hDb21wb25lbnQgdG8gb25lIG9mIHRoZSBzdGFuZGFyZCBuYW1lcywgCisgICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdC4KKworICAgICAgIFRvIGluc2VydCBjb21wb25lbnRzIGJlZm9yZSBvciBhZnRlciB0aGUgJ3N0YW5kYXJkJyBjb21wb25lbnRzLCB1c2U6CisgICAgCisgICAgICAgPGFyciBuYW1lPSJmaXJzdC1jb21wb25lbnRzIj4KKyAgICAgICAgIDxzdHI+bXlGaXJzdENvbXBvbmVudE5hbWU8L3N0cj4KKyAgICAgICA8L2Fycj4KKyAgICAKKyAgICAgICA8YXJyIG5hbWU9Imxhc3QtY29tcG9uZW50cyI+CisgICAgICAgICA8c3RyPm15TGFzdENvbXBvbmVudE5hbWU8L3N0cj4KKyAgICAgICA8L2Fycj4KKworICAgICAgIE5PVEU6IFRoZSBjb21wb25lbnQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBuYW1lICJkZWJ1ZyIgd2lsbAorICAgICAgIGFsd2F5cyBiZSBleGVjdXRlZCBhZnRlciB0aGUgImxhc3QtY29tcG9uZW50cyIgCisgICAgICAgCisgICAgIC0tPgorICAKKyAgIDwhLS0gU3BlbGwgQ2hlY2sKKworICAgICAgICBUaGUgc3BlbGwgY2hlY2sgY29tcG9uZW50IGNhbiByZXR1cm4gYSBsaXN0IG9mIGFsdGVybmF0aXZlIHNwZWxsaW5nCisgICAgICAgIHN1Z2dlc3Rpb25zLiAgCisKKyAgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NwZWxsQ2hlY2tDb21wb25lbnQKKyAgICAgLS0+CisgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0ic3BlbGxjaGVjayIgY2xhc3M9InNvbHIuU3BlbGxDaGVja0NvbXBvbmVudCI+CisKKyAgICA8c3RyIG5hbWU9InF1ZXJ5QW5hbHl6ZXJGaWVsZFR5cGUiPnRleHRfZ2VuZXJhbDwvc3RyPgorCisgICAgPCEtLSBNdWx0aXBsZSAiU3BlbGwgQ2hlY2tlcnMiIGNhbiBiZSBkZWNsYXJlZCBhbmQgdXNlZCBieSB0aGlzCisgICAgICAgICBjb21wb25lbnQKKyAgICAgIC0tPgorCisgICAgPCEtLSBhIHNwZWxsY2hlY2tlciBidWlsdCBmcm9tIGEgZmllbGQgb2YgdGhlIG1haW4gaW5kZXggLS0+CisgICAgPGxzdCBuYW1lPSJzcGVsbGNoZWNrZXIiPgorICAgICAgPHN0ciBuYW1lPSJuYW1lIj5kZWZhdWx0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZpZWxkIj50ZXh0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImNsYXNzbmFtZSI+c29sci5EaXJlY3RTb2xyU3BlbGxDaGVja2VyPC9zdHI+CisgICAgICA8IS0tIHRoZSBzcGVsbGNoZWNrIGRpc3RhbmNlIG1lYXN1cmUgdXNlZCwgdGhlIGRlZmF1bHQgaXMgdGhlIGludGVybmFsIGxldmVuc2h0ZWluIC0tPgorICAgICAgPHN0ciBuYW1lPSJkaXN0YW5jZU1lYXN1cmUiPmludGVybmFsPC9zdHI+CisgICAgICA8IS0tIG1pbmltdW0gYWNjdXJhY3kgbmVlZGVkIHRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBzcGVsbGNoZWNrIHN1Z2dlc3Rpb24gLS0+CisgICAgICA8ZmxvYXQgbmFtZT0iYWNjdXJhY3kiPjAuNTwvZmxvYXQ+CisgICAgICA8IS0tIHRoZSBtYXhpbXVtICNlZGl0cyB3ZSBjb25zaWRlciB3aGVuIGVudW1lcmF0aW5nIHRlcm1zOiBjYW4gYmUgMSBvciAyIC0tPgorICAgICAgPGludCBuYW1lPSJtYXhFZGl0cyI+MjwvaW50PgorICAgICAgPCEtLSB0aGUgbWluaW11bSBzaGFyZWQgcHJlZml4IHdoZW4gZW51bWVyYXRpbmcgdGVybXMgLS0+CisgICAgICA8aW50IG5hbWU9Im1pblByZWZpeCI+MTwvaW50PgorICAgICAgPCEtLSBtYXhpbXVtIG51bWJlciBvZiBpbnNwZWN0aW9ucyBwZXIgcmVzdWx0LiAtLT4KKyAgICAgIDxpbnQgbmFtZT0ibWF4SW5zcGVjdGlvbnMiPjU8L2ludD4KKyAgICAgIDwhLS0gbWluaW11bSBsZW5ndGggb2YgYSBxdWVyeSB0ZXJtIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGNvcnJlY3Rpb24gLS0+CisgICAgICA8aW50IG5hbWU9Im1pblF1ZXJ5TGVuZ3RoIj40PC9pbnQ+CisgICAgICA8IS0tIG1heGltdW0gdGhyZXNob2xkIG9mIGRvY3VtZW50cyBhIHF1ZXJ5IHRlcm0gY2FuIGFwcGVhciB0byBiZSBjb25zaWRlcmVkIGZvciBjb3JyZWN0aW9uIC0tPgorICAgICAgPGZsb2F0IG5hbWU9Im1heFF1ZXJ5RnJlcXVlbmN5Ij4wLjAxPC9mbG9hdD4KKyAgICAgIDwhLS0gdW5jb21tZW50IHRoaXMgdG8gcmVxdWlyZSBzdWdnZXN0aW9ucyB0byBvY2N1ciBpbiAxJSBvZiB0aGUgZG9jdW1lbnRzCisgICAgICAJPGZsb2F0IG5hbWU9InRocmVzaG9sZFRva2VuRnJlcXVlbmN5Ij4uMDE8L2Zsb2F0PgorICAgICAgLS0+CisgICAgPC9sc3Q+CisgICAgCisgICAgPCEtLSBhIHNwZWxsY2hlY2tlciB0aGF0IGNhbiBicmVhayBvciBjb21iaW5lIHdvcmRzLiAgU2VlICIvc3BlbGwiIGhhbmRsZXIgYmVsb3cgZm9yIHVzYWdlIC0tPgorICAgIDxsc3QgbmFtZT0ic3BlbGxjaGVja2VyIj4KKyAgICAgIDxzdHIgbmFtZT0ibmFtZSI+d29yZGJyZWFrPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImNsYXNzbmFtZSI+c29sci5Xb3JkQnJlYWtTb2xyU3BlbGxDaGVja2VyPC9zdHI+ICAgICAgCisgICAgICA8c3RyIG5hbWU9ImZpZWxkIj5uYW1lPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImNvbWJpbmVXb3JkcyI+dHJ1ZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJicmVha1dvcmRzIj50cnVlPC9zdHI+CisgICAgICA8aW50IG5hbWU9Im1heENoYW5nZXMiPjEwPC9pbnQ+CisgICAgPC9sc3Q+CisKKyAgICA8IS0tIGEgc3BlbGxjaGVja2VyIHRoYXQgdXNlcyBhIGRpZmZlcmVudCBkaXN0YW5jZSBtZWFzdXJlIC0tPgorICAgIDwhLS0KKyAgICAgICA8bHN0IG5hbWU9InNwZWxsY2hlY2tlciI+CisgICAgICAgICA8c3RyIG5hbWU9Im5hbWUiPmphcm93aW5rbGVyPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImZpZWxkIj5zcGVsbDwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJjbGFzc25hbWUiPnNvbHIuRGlyZWN0U29sclNwZWxsQ2hlY2tlcjwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJkaXN0YW5jZU1lYXN1cmUiPgorICAgICAgICAgICBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc3BlbGwuSmFyb1dpbmtsZXJEaXN0YW5jZQorICAgICAgICAgPC9zdHI+CisgICAgICAgPC9sc3Q+CisgICAgIC0tPgorCisgICAgPCEtLSBhIHNwZWxsY2hlY2tlciB0aGF0IHVzZSBhbiBhbHRlcm5hdGUgY29tcGFyYXRvciAKKworICAgICAgICAgY29tcGFyYXRvckNsYXNzIGJlIG9uZSBvZjoKKyAgICAgICAgICAxLiBzY29yZSAoZGVmYXVsdCkKKyAgICAgICAgICAyLiBmcmVxIChGcmVxdWVuY3kgZmlyc3QsIHRoZW4gc2NvcmUpCisgICAgICAgICAgMy4gQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxsc3QgbmFtZT0ic3BlbGxjaGVja2VyIj4KKyAgICAgICAgIDxzdHIgbmFtZT0ibmFtZSI+ZnJlcTwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJmaWVsZCI+bG93ZXJmaWx0PC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImNsYXNzbmFtZSI+c29sci5EaXJlY3RTb2xyU3BlbGxDaGVja2VyPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImNvbXBhcmF0b3JDbGFzcyI+ZnJlcTwvc3RyPgorICAgICAgLS0+CisKKyAgICA8IS0tIEEgc3BlbGxjaGVja2VyIHRoYXQgcmVhZHMgdGhlIGxpc3Qgb2Ygd29yZHMgZnJvbSBhIGZpbGUgLS0+CisgICAgPCEtLQorICAgICAgIDxsc3QgbmFtZT0ic3BlbGxjaGVja2VyIj4KKyAgICAgICAgIDxzdHIgbmFtZT0iY2xhc3NuYW1lIj5zb2xyLkZpbGVCYXNlZFNwZWxsQ2hlY2tlcjwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJuYW1lIj5maWxlPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9InNvdXJjZUxvY2F0aW9uIj5zcGVsbGluZ3MudHh0PC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImNoYXJhY3RlckVuY29kaW5nIj5VVEYtODwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrSW5kZXhEaXIiPnNwZWxsY2hlY2tlckZpbGU8L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgICAgIC0tPgorICA8L3NlYXJjaENvbXBvbmVudD4KKyAgCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIHNwZWxsY2hlY2sgY29tcG9uZW50LiAgCisKKyAgICAgICBOT1RFOiBUaGlzIGlzIHB1cmVseSBhcyBhbiBleGFtcGxlLiAgVGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhlCisgICAgICAgU3BlbGxDaGVja0NvbXBvbmVudCBpcyB0byBob29rIGl0IGludG8gdGhlIHJlcXVlc3QgaGFuZGxlciB0aGF0CisgICAgICAgaGFuZGxlcyB5b3VyIG5vcm1hbCB1c2VyIHF1ZXJpZXMgc28gdGhhdCBhIHNlcGFyYXRlIHJlcXVlc3QgaXMKKyAgICAgICBub3QgbmVlZGVkIHRvIGdldCBzdWdnZXN0aW9ucy4KKworICAgICAgIElOIE9USEVSIFdPUkRTLCBUSEVSRSBJUyBSRUFMTFkgR09PRCBDSEFOQ0UgVEhFIFNFVFVQIEJFTE9XIElTCisgICAgICAgTk9UIFdIQVQgWU9VIFdBTlQgRk9SIFlPVVIgUFJPRFVDVElPTiBTWVNURU0hCisgICAgICAgCisgICAgICAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TcGVsbENoZWNrQ29tcG9uZW50IGZvciBkZXRhaWxzCisgICAgICAgb24gdGhlIHJlcXVlc3QgcGFyYW1ldGVycy4KKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9zcGVsbCIgY2xhc3M9InNvbHIuU2VhcmNoSGFuZGxlciIgc3RhcnR1cD0ibGF6eSI+CisgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICA8c3RyIG5hbWU9ImRmIj50ZXh0PC9zdHI+CisgICAgICA8IS0tIFNvbHIgd2lsbCB1c2Ugc3VnZ2VzdGlvbnMgZnJvbSBib3RoIHRoZSAnZGVmYXVsdCcgc3BlbGxjaGVja2VyCisgICAgICAgICAgIGFuZCBmcm9tIHRoZSAnd29yZGJyZWFrJyBzcGVsbGNoZWNrZXIgYW5kIGNvbWJpbmUgdGhlbS4KKyAgICAgICAgICAgY29sbGF0aW9ucyAocmUtd3JpdHRlbiBxdWVyaWVzKSBjYW4gaW5jbHVkZSBhIGNvbWJpbmF0aW9uIG9mCisgICAgICAgICAgIGNvcnJlY3Rpb25zIGZyb20gYm90aCBzcGVsbGNoZWNrZXJzIC0tPgorICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrLmRpY3Rpb25hcnkiPmRlZmF1bHQ8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5kaWN0aW9uYXJ5Ij53b3JkYnJlYWs8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjayI+b248L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5leHRlbmRlZFJlc3VsdHMiPnRydWU8L3N0cj4gICAgICAgCisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suY291bnQiPjEwPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suYWx0ZXJuYXRpdmVUZXJtQ291bnQiPjU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5tYXhSZXN1bHRzRm9yU3VnZ2VzdCI+NTwvc3RyPiAgICAgICAKKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5jb2xsYXRlIj50cnVlPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suY29sbGF0ZUV4dGVuZGVkUmVzdWx0cyI+dHJ1ZTwvc3RyPiAgCisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9uVHJpZXMiPjEwPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9ucyI+NTwvc3RyPiAgICAgICAgIAorICAgIDwvbHN0PgorICAgIDxhcnIgbmFtZT0ibGFzdC1jb21wb25lbnRzIj4KKyAgICAgIDxzdHI+c3BlbGxjaGVjazwvc3RyPgorICAgIDwvYXJyPgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0ic3VnZ2VzdCIgY2xhc3M9InNvbHIuU3VnZ2VzdENvbXBvbmVudCI+CisgIAk8bHN0IG5hbWU9InN1Z2dlc3RlciI+CisgICAgICA8c3RyIG5hbWU9Im5hbWUiPm15U3VnZ2VzdGVyPC9zdHI+CisgICAgICA8c3RyIG5hbWU9Imxvb2t1cEltcGwiPkZ1enp5TG9va3VwRmFjdG9yeTwvc3RyPiAgICAgIDwhLS0gb3JnLmFwYWNoZS5zb2xyLnNwZWxsaW5nLnN1Z2dlc3QuZnN0IC0tPgorICAgICAgPHN0ciBuYW1lPSJkaWN0aW9uYXJ5SW1wbCI+RG9jdW1lbnREaWN0aW9uYXJ5RmFjdG9yeTwvc3RyPiAgICAgPCEtLSBvcmcuYXBhY2hlLnNvbHIuc3BlbGxpbmcuc3VnZ2VzdC5IaWdoRnJlcXVlbmN5RGljdGlvbmFyeUZhY3RvcnkgLS0+IAorICAgICAgPHN0ciBuYW1lPSJmaWVsZCI+Y2F0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9IndlaWdodEZpZWxkIj5wcmljZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJzdWdnZXN0QW5hbHl6ZXJGaWVsZFR5cGUiPnN0cmluZzwvc3RyPgorICAgIDwvbHN0PgorICA8L3NlYXJjaENvbXBvbmVudD4KKworICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL3N1Z2dlc3QiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiIHN0YXJ0dXA9ImxhenkiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJzdWdnZXN0Ij50cnVlPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InN1Z2dlc3QuY291bnQiPjEwPC9zdHI+CisgICAgPC9sc3Q+CisgICAgPGFyciBuYW1lPSJjb21wb25lbnRzIj4KKyAgICAgIDxzdHI+c3VnZ2VzdDwvc3RyPgorICAgIDwvYXJyPgorICA8L3JlcXVlc3RIYW5kbGVyPgorICA8IS0tIFRlcm0gVmVjdG9yIENvbXBvbmVudAorCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1Rlcm1WZWN0b3JDb21wb25lbnQKKyAgICAtLT4KKyAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJ0dkNvbXBvbmVudCIgY2xhc3M9InNvbHIuVGVybVZlY3RvckNvbXBvbmVudCIvPgorCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIHRlcm0gdmVjdG9yIGNvbXBvbmVudAorCisgICAgICAgVGhpcyBpcyBwdXJlbHkgYXMgYW4gZXhhbXBsZS4KKworICAgICAgIEluIHJlYWxpdHkgeW91IHdpbGwgbGlrZWx5IHdhbnQgdG8gYWRkIHRoZSBjb21wb25lbnQgdG8geW91ciAKKyAgICAgICBhbHJlYWR5IHNwZWNpZmllZCByZXF1ZXN0IGhhbmRsZXJzLiAKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii90dnJoIiBjbGFzcz0ic29sci5TZWFyY2hIYW5kbGVyIiBzdGFydHVwPSJsYXp5Ij4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0iZGYiPnRleHQ8L3N0cj4KKyAgICAgIDxib29sIG5hbWU9InR2Ij50cnVlPC9ib29sPgorICAgIDwvbHN0PgorICAgIDxhcnIgbmFtZT0ibGFzdC1jb21wb25lbnRzIj4KKyAgICAgIDxzdHI+dHZDb21wb25lbnQ8L3N0cj4KKyAgICA8L2Fycj4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIENsdXN0ZXJpbmcgQ29tcG9uZW50CisKKyAgICAgICBZb3UnbGwgbmVlZCB0byBzZXQgdGhlIHNvbHIuY2x1c3RlcmluZy5lbmFibGVkIHN5c3RlbSBwcm9wZXJ0eQorICAgICAgIHdoZW4gcnVubmluZyBzb2xyIHRvIHJ1biB3aXRoIGNsdXN0ZXJpbmcgZW5hYmxlZDoKKworICAgICAgICAgICAgamF2YSAtRHNvbHIuY2x1c3RlcmluZy5lbmFibGVkPXRydWUgLWphciBzdGFydC5qYXIKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9DbHVzdGVyaW5nQ29tcG9uZW50CisgICAgICAgaHR0cDovL2NhcnJvdDIuZ2l0aHViLmlvL3NvbHItaW50ZWdyYXRpb24tc3RyYXRlZ2llcy8KKyAgICAtLT4KKyAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJjbHVzdGVyaW5nIgorICAgICAgICAgICAgICAgICAgIGVuYWJsZT0iJHtzb2xyLmNsdXN0ZXJpbmcuZW5hYmxlZDpmYWxzZX0iCisgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29tcG9uZW50IiA+CisgICAgPGxzdCBuYW1lPSJlbmdpbmUiPgorICAgICAgPHN0ciBuYW1lPSJuYW1lIj5saW5nbzwvc3RyPgorCisgICAgICA8IS0tIENsYXNzIG5hbWUgb2YgYSBjbHVzdGVyaW5nIGFsZ29yaXRobSBjb21wYXRpYmxlIHdpdGggdGhlIENhcnJvdDIgZnJhbWV3b3JrLgorCisgICAgICAgICAgIEN1cnJlbnRseSBhdmFpbGFibGUgb3BlbiBzb3VyY2UgYWxnb3JpdGhtcyBhcmU6CisgICAgICAgICAgICogb3JnLmNhcnJvdDIuY2x1c3RlcmluZy5saW5nby5MaW5nb0NsdXN0ZXJpbmdBbGdvcml0aG0KKyAgICAgICAgICAgKiBvcmcuY2Fycm90Mi5jbHVzdGVyaW5nLnN0Yy5TVENDbHVzdGVyaW5nQWxnb3JpdGhtCisgICAgICAgICAgICogb3JnLmNhcnJvdDIuY2x1c3RlcmluZy5rbWVhbnMuQmlzZWN0aW5nS01lYW5zQ2x1c3RlcmluZ0FsZ29yaXRobQorCisgICAgICAgICAgIFNlZSBodHRwOi8vcHJvamVjdC5jYXJyb3QyLm9yZy9hbGdvcml0aG1zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgICAgQSBjb21tZXJjaWFsIGFsZ29yaXRobSBMaW5nbzNHIChuZWVkcyB0byBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseSkgaXMgZGVmaW5lZCBhczoKKyAgICAgICAgICAgKiBjb20uY2Fycm90c2VhcmNoLmxpbmdvM2cuTGluZ28zR0NsdXN0ZXJpbmdBbGdvcml0aG0KKyAgICAgICAgLS0+CisgICAgICA8c3RyIG5hbWU9ImNhcnJvdC5hbGdvcml0aG0iPm9yZy5jYXJyb3QyLmNsdXN0ZXJpbmcubGluZ28uTGluZ29DbHVzdGVyaW5nQWxnb3JpdGhtPC9zdHI+CisKKyAgICAgIDwhLS0gT3ZlcnJpZGUgbG9jYXRpb24gb2YgdGhlIGNsdXN0ZXJpbmcgYWxnb3JpdGhtJ3MgcmVzb3VyY2VzIAorICAgICAgICAgICAoYXR0cmlidXRlIGRlZmluaXRpb25zIGFuZCBsZXhpY2FsIHJlc291cmNlcykuCisKKyAgICAgICAgICAgQSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBsb2FkIGFsZ29yaXRobS1zcGVjaWZpYyBzdG9wIHdvcmRzLAorICAgICAgICAgICBzdG9wIGxhYmVscyBhbmQgYXR0cmlidXRlIGRlZmluaXRpb24gWE1Mcy4gCisKKyAgICAgICAgICAgRm9yIGFuIG92ZXJ2aWV3IG9mIENhcnJvdDIgbGV4aWNhbCByZXNvdXJjZXMsIHNlZToKKyAgICAgICAgICAgaHR0cDovL2Rvd25sb2FkLmNhcnJvdDIub3JnL2hlYWQvbWFudWFsLyNjaGFwdGVyLmxleGljYWwtcmVzb3VyY2VzCisKKyAgICAgICAgICAgRm9yIGFuIG92ZXJ2aWV3IG9mIExpbmdvM0cgbGV4aWNhbCByZXNvdXJjZXMsIHNlZToKKyAgICAgICAgICAgaHR0cDovL2Rvd25sb2FkLmNhcnJvdHNlYXJjaC5jb20vbGluZ28zZy9tYW51YWwvI2NoYXB0ZXIubGV4aWNhbC1yZXNvdXJjZXMKKyAgICAgICAtLT4KKyAgICAgIDxzdHIgbmFtZT0iY2Fycm90LnJlc291cmNlc0RpciI+Y2x1c3RlcmluZy9jYXJyb3QyPC9zdHI+CisgICAgPC9sc3Q+CisKKyAgICA8IS0tIEFuIGV4YW1wbGUgZGVmaW5pdGlvbiBmb3IgdGhlIFNUQyBjbHVzdGVyaW5nIGFsZ29yaXRobS4gLS0+CisgICAgPGxzdCBuYW1lPSJlbmdpbmUiPgorICAgICAgPHN0ciBuYW1lPSJuYW1lIj5zdGM8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iY2Fycm90LmFsZ29yaXRobSI+b3JnLmNhcnJvdDIuY2x1c3RlcmluZy5zdGMuU1RDQ2x1c3RlcmluZ0FsZ29yaXRobTwvc3RyPgorICAgIDwvbHN0PgorCisgICAgPCEtLSBBbiBleGFtcGxlIGRlZmluaXRpb24gZm9yIHRoZSBiaXNlY3Rpbmcga21lYW5zIGNsdXN0ZXJpbmcgYWxnb3JpdGhtLiAtLT4KKyAgICA8bHN0IG5hbWU9ImVuZ2luZSI+CisgICAgICA8c3RyIG5hbWU9Im5hbWUiPmttZWFuczwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJjYXJyb3QuYWxnb3JpdGhtIj5vcmcuY2Fycm90Mi5jbHVzdGVyaW5nLmttZWFucy5CaXNlY3RpbmdLTWVhbnNDbHVzdGVyaW5nQWxnb3JpdGhtPC9zdHI+CisgICAgPC9sc3Q+CisgIDwvc2VhcmNoQ29tcG9uZW50PgorCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIGNsdXN0ZXJpbmcgY29tcG9uZW50CisKKyAgICAgICBUaGlzIGlzIHB1cmVseSBhcyBhbiBleGFtcGxlLgorCisgICAgICAgSW4gcmVhbGl0eSB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0byBhZGQgdGhlIGNvbXBvbmVudCB0byB5b3VyIAorICAgICAgIGFscmVhZHkgc3BlY2lmaWVkIHJlcXVlc3QgaGFuZGxlcnMuIAorICAgIC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2NsdXN0ZXJpbmciCisgICAgICAgICAgICAgICAgICBzdGFydHVwPSJsYXp5IgorICAgICAgICAgICAgICAgICAgZW5hYmxlPSIke3NvbHIuY2x1c3RlcmluZy5lbmFibGVkOmZhbHNlfSIKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPGJvb2wgbmFtZT0iY2x1c3RlcmluZyI+dHJ1ZTwvYm9vbD4KKyAgICAgIDxib29sIG5hbWU9ImNsdXN0ZXJpbmcucmVzdWx0cyI+dHJ1ZTwvYm9vbD4KKyAgICAgIDwhLS0gRmllbGQgbmFtZSB3aXRoIHRoZSBsb2dpY2FsICJ0aXRsZSIgb2YgYSBlYWNoIGRvY3VtZW50IChvcHRpb25hbCkgLS0+CisgICAgICA8c3RyIG5hbWU9ImNhcnJvdC50aXRsZSI+bmFtZTwvc3RyPgorICAgICAgPCEtLSBGaWVsZCBuYW1lIHdpdGggdGhlIGxvZ2ljYWwgIlVSTCIgb2YgYSBlYWNoIGRvY3VtZW50IChvcHRpb25hbCkgLS0+CisgICAgICA8c3RyIG5hbWU9ImNhcnJvdC51cmwiPmlkPC9zdHI+CisgICAgICA8IS0tIEZpZWxkIG5hbWUgd2l0aCB0aGUgbG9naWNhbCAiY29udGVudCIgb2YgYSBlYWNoIGRvY3VtZW50IChvcHRpb25hbCkgLS0+CisgICAgICA8c3RyIG5hbWU9ImNhcnJvdC5zbmlwcGV0Ij5mZWF0dXJlczwvc3RyPgorICAgICAgPCEtLSBBcHBseSBoaWdobGlnaHRlciB0byB0aGUgdGl0bGUvIGNvbnRlbnQgYW5kIHVzZSB0aGlzIGZvciBjbHVzdGVyaW5nLiAtLT4KKyAgICAgIDxib29sIG5hbWU9ImNhcnJvdC5wcm9kdWNlU3VtbWFyeSI+dHJ1ZTwvYm9vbD4KKyAgICAgIDwhLS0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGxhYmVscyBwZXIgY2x1c3RlciAtLT4KKyAgICAgIDwhLS08aW50IG5hbWU9ImNhcnJvdC5udW1EZXNjcmlwdGlvbnMiPjU8L2ludD4tLT4KKyAgICAgIDwhLS0gcHJvZHVjZSBzdWIgY2x1c3RlcnMgLS0+CisgICAgICA8Ym9vbCBuYW1lPSJjYXJyb3Qub3V0cHV0U3ViQ2x1c3RlcnMiPmZhbHNlPC9ib29sPgorCisgICAgICA8IS0tIENvbmZpZ3VyZSB0aGUgcmVtYWluaW5nIHJlcXVlc3QgaGFuZGxlciBwYXJhbWV0ZXJzLiAtLT4KKyAgICAgIDxzdHIgbmFtZT0iZGVmVHlwZSI+ZWRpc21heDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJxZiI+CisgICAgICAgIHRleHReMC41IGZlYXR1cmVzXjEuMCBuYW1lXjEuMiBza3VeMS41IGlkXjEwLjAgbWFudV4xLjEgY2F0XjEuNAorICAgICAgPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InEuYWx0Ij4qOio8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0icm93cyI+MTA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZmwiPiosc2NvcmU8L3N0cj4KKyAgICA8L2xzdD4KKyAgICA8YXJyIG5hbWU9Imxhc3QtY29tcG9uZW50cyI+CisgICAgICA8c3RyPmNsdXN0ZXJpbmc8L3N0cj4KKyAgICA8L2Fycj4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKyAgCisgIDwhLS0gVGVybXMgQ29tcG9uZW50CisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvVGVybXNDb21wb25lbnQKKworICAgICAgIEEgY29tcG9uZW50IHRvIHJldHVybiB0ZXJtcyBhbmQgZG9jdW1lbnQgZnJlcXVlbmN5IG9mIHRob3NlCisgICAgICAgdGVybXMKKyAgICAtLT4KKyAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJ0ZXJtcyIgY2xhc3M9InNvbHIuVGVybXNDb21wb25lbnQiLz4KKworICA8IS0tIEEgcmVxdWVzdCBoYW5kbGVyIGZvciBkZW1vbnN0cmF0aW5nIHRoZSB0ZXJtcyBjb21wb25lbnQgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvdGVybXMiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiIHN0YXJ0dXA9ImxhenkiPgorICAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxib29sIG5hbWU9InRlcm1zIj50cnVlPC9ib29sPgorICAgICAgPGJvb2wgbmFtZT0iZGlzdHJpYiI+ZmFsc2U8L2Jvb2w+CisgICAgPC9sc3Q+ICAgICAKKyAgICA8YXJyIG5hbWU9ImNvbXBvbmVudHMiPgorICAgICAgPHN0cj50ZXJtczwvc3RyPgorICAgIDwvYXJyPgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisKKyAgPCEtLSBRdWVyeSBFbGV2YXRpb24gQ29tcG9uZW50CisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvUXVlcnlFbGV2YXRpb25Db21wb25lbnQKKworICAgICAgIGEgc2VhcmNoIGNvbXBvbmVudCB0aGF0IGVuYWJsZXMgeW91IHRvIGNvbmZpZ3VyZSB0aGUgdG9wCisgICAgICAgcmVzdWx0cyBmb3IgYSBnaXZlbiBxdWVyeSByZWdhcmRsZXNzIG9mIHRoZSBub3JtYWwgbHVjZW5lCisgICAgICAgc2NvcmluZy4KKyAgICAtLT4KKyAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJlbGV2YXRvciIgY2xhc3M9InNvbHIuUXVlcnlFbGV2YXRpb25Db21wb25lbnQiID4KKyAgICA8IS0tIHBpY2sgYSBmaWVsZFR5cGUgdG8gYW5hbHl6ZSBxdWVyaWVzIC0tPgorICAgIDxzdHIgbmFtZT0icXVlcnlGaWVsZFR5cGUiPnN0cmluZzwvc3RyPgorICAgIDxzdHIgbmFtZT0iY29uZmlnLWZpbGUiPmVsZXZhdGUueG1sPC9zdHI+CisgIDwvc2VhcmNoQ29tcG9uZW50PgorCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIGVsZXZhdG9yIGNvbXBvbmVudCAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9lbGV2YXRlIiBjbGFzcz0ic29sci5TZWFyY2hIYW5kbGVyIiBzdGFydHVwPSJsYXp5Ij4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0iZWNob1BhcmFtcyI+ZXhwbGljaXQ8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZGYiPnRleHQ8L3N0cj4KKyAgICA8L2xzdD4KKyAgICA8YXJyIG5hbWU9Imxhc3QtY29tcG9uZW50cyI+CisgICAgICA8c3RyPmVsZXZhdG9yPC9zdHI+CisgICAgPC9hcnI+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKyAgPCEtLSBIaWdobGlnaHRpbmcgQ29tcG9uZW50CisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvSGlnaGxpZ2h0aW5nUGFyYW1ldGVycworICAgIC0tPgorICA8c2VhcmNoQ29tcG9uZW50IGNsYXNzPSJzb2xyLkhpZ2hsaWdodENvbXBvbmVudCIgbmFtZT0iaGlnaGxpZ2h0Ij4KKyAgICA8aGlnaGxpZ2h0aW5nPgorICAgICAgPCEtLSBDb25maWd1cmUgdGhlIHN0YW5kYXJkIGZyYWdtZW50ZXIgLS0+CisgICAgICA8IS0tIFRoaXMgY291bGQgbW9zdCBsaWtlbHkgYmUgY29tbWVudGVkIG91dCBpbiB0aGUgImRlZmF1bHQiIGNhc2UgLS0+CisgICAgICA8ZnJhZ21lbnRlciBuYW1lPSJnYXAiIAorICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5HYXBGcmFnbWVudGVyIj4KKyAgICAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgICAgPGludCBuYW1lPSJobC5mcmFnc2l6ZSI+MTAwPC9pbnQ+CisgICAgICAgIDwvbHN0PgorICAgICAgPC9mcmFnbWVudGVyPgorCisgICAgICA8IS0tIEEgcmVndWxhci1leHByZXNzaW9uLWJhc2VkIGZyYWdtZW50ZXIgCisgICAgICAgICAgIChmb3Igc2VudGVuY2UgZXh0cmFjdGlvbikgCisgICAgICAgIC0tPgorICAgICAgPGZyYWdtZW50ZXIgbmFtZT0icmVnZXgiIAorICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LlJlZ2V4RnJhZ21lbnRlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDwhLS0gc2xpZ2h0bHkgc21hbGxlciBmcmFnc2l6ZXMgd29yayBiZXR0ZXIgYmVjYXVzZSBvZiBzbG9wIC0tPgorICAgICAgICAgIDxpbnQgbmFtZT0iaGwuZnJhZ3NpemUiPjcwPC9pbnQ+CisgICAgICAgICAgPCEtLSBhbGxvdyA1MCUgc2xvcCBvbiBmcmFnbWVudCBzaXplcyAtLT4KKyAgICAgICAgICA8ZmxvYXQgbmFtZT0iaGwucmVnZXguc2xvcCI+MC41PC9mbG9hdD4KKyAgICAgICAgICA8IS0tIGEgYmFzaWMgc2VudGVuY2UgcGF0dGVybiAtLT4KKyAgICAgICAgICA8c3RyIG5hbWU9ImhsLnJlZ2V4LnBhdHRlcm4iPlstXHcgLC9cblwmcXVvdDsmYXBvcztdezIwLDIwMH08L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICA8L2ZyYWdtZW50ZXI+CisKKyAgICAgIDwhLS0gQ29uZmlndXJlIHRoZSBzdGFuZGFyZCBmb3JtYXR0ZXIgLS0+CisgICAgICA8Zm9ybWF0dGVyIG5hbWU9Imh0bWwiIAorICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuSHRtbEZvcm1hdHRlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwuc2ltcGxlLnByZSI+PCFbQ0RBVEFbPGVtPl1dPjwvc3RyPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwuc2ltcGxlLnBvc3QiPjwhW0NEQVRBWzwvZW0+XV0+PC9zdHI+CisgICAgICAgIDwvbHN0PgorICAgICAgPC9mb3JtYXR0ZXI+CisKKyAgICAgIDwhLS0gQ29uZmlndXJlIHRoZSBzdGFuZGFyZCBlbmNvZGVyIC0tPgorICAgICAgPGVuY29kZXIgbmFtZT0iaHRtbCIgCisgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuSHRtbEVuY29kZXIiIC8+CisKKyAgICAgIDwhLS0gQ29uZmlndXJlIHRoZSBzdGFuZGFyZCBmcmFnTGlzdEJ1aWxkZXIgLS0+CisgICAgICA8ZnJhZ0xpc3RCdWlsZGVyIG5hbWU9InNpbXBsZSIgCisgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5TaW1wbGVGcmFnTGlzdEJ1aWxkZXIiLz4KKyAgICAgIAorICAgICAgPCEtLSBDb25maWd1cmUgdGhlIHNpbmdsZSBmcmFnTGlzdEJ1aWxkZXIgLS0+CisgICAgICA8ZnJhZ0xpc3RCdWlsZGVyIG5hbWU9InNpbmdsZSIgCisgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5TaW5nbGVGcmFnTGlzdEJ1aWxkZXIiLz4KKyAgICAgIAorICAgICAgPCEtLSBDb25maWd1cmUgdGhlIHdlaWdodGVkIGZyYWdMaXN0QnVpbGRlciAtLT4KKyAgICAgIDxmcmFnTGlzdEJ1aWxkZXIgbmFtZT0id2VpZ2h0ZWQiIAorICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuV2VpZ2h0ZWRGcmFnTGlzdEJ1aWxkZXIiLz4KKyAgICAgIAorICAgICAgPCEtLSBkZWZhdWx0IHRhZyBGcmFnbWVudHNCdWlsZGVyIC0tPgorICAgICAgPGZyYWdtZW50c0J1aWxkZXIgbmFtZT0iZGVmYXVsdCIgCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LlNjb3JlT3JkZXJGcmFnbWVudHNCdWlsZGVyIj4KKyAgICAgICAgPCEtLSAKKyAgICAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5tdWx0aVZhbHVlZFNlcGFyYXRvckNoYXIiPi88L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICAgIC0tPgorICAgICAgPC9mcmFnbWVudHNCdWlsZGVyPgorCisgICAgICA8IS0tIG11bHRpLWNvbG9yZWQgdGFnIEZyYWdtZW50c0J1aWxkZXIgLS0+CisgICAgICA8ZnJhZ21lbnRzQnVpbGRlciBuYW1lPSJjb2xvcmVkIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5TY29yZU9yZGVyRnJhZ21lbnRzQnVpbGRlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwudGFnLnByZSI+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICA8YiBzdHlsZT0iYmFja2dyb3VuZDp5ZWxsb3ciPiw8YiBzdHlsZT0iYmFja2dyb3VuZDpsYXdncmVlbiI+LAorICAgICAgICAgICAgICAgPGIgc3R5bGU9ImJhY2tncm91bmQ6YXF1YW1hcmluZSI+LDxiIHN0eWxlPSJiYWNrZ3JvdW5kOm1hZ2VudGEiPiwKKyAgICAgICAgICAgICAgIDxiIHN0eWxlPSJiYWNrZ3JvdW5kOnBhbGVncmVlbiI+LDxiIHN0eWxlPSJiYWNrZ3JvdW5kOmNvcmFsIj4sCisgICAgICAgICAgICAgICA8YiBzdHlsZT0iYmFja2dyb3VuZDp3aGVhdCI+LDxiIHN0eWxlPSJiYWNrZ3JvdW5kOmtoYWtpIj4sCisgICAgICAgICAgICAgICA8YiBzdHlsZT0iYmFja2dyb3VuZDpsaW1lIj4sPGIgc3R5bGU9ImJhY2tncm91bmQ6ZGVlcHNreWJsdWUiPl1dPjwvc3RyPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwudGFnLnBvc3QiPjwhW0NEQVRBWzwvYj5dXT48L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICA8L2ZyYWdtZW50c0J1aWxkZXI+CisgICAgICAKKyAgICAgIDxib3VuZGFyeVNjYW5uZXIgbmFtZT0iZGVmYXVsdCIgCisgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5TaW1wbGVCb3VuZGFyeVNjYW5uZXIiPgorICAgICAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgICAgICA8c3RyIG5hbWU9ImhsLmJzLm1heFNjYW4iPjEwPC9zdHI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5icy5jaGFycyI+LiwhPyAmIzk7JiMxMDsmIzEzOzwvc3RyPgorICAgICAgICA8L2xzdD4KKyAgICAgIDwvYm91bmRhcnlTY2FubmVyPgorICAgICAgCisgICAgICA8Ym91bmRhcnlTY2FubmVyIG5hbWU9ImJyZWFrSXRlcmF0b3IiIAorICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuQnJlYWtJdGVyYXRvckJvdW5kYXJ5U2Nhbm5lciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDwhLS0gdHlwZSBzaG91bGQgYmUgb25lIG9mIENIQVJBQ1RFUiwgV09SRChkZWZhdWx0KSwgTElORSBhbmQgU0VOVEVOQ0UgLS0+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5icy50eXBlIj5XT1JEPC9zdHI+CisgICAgICAgICAgPCEtLSBsYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyBMb2NhbGUgb2JqZWN0LiAgLS0+CisgICAgICAgICAgPCEtLSBBbmQgdGhlIExvY2FsZSBvYmplY3Qgd2lsbCBiZSB1c2VkIHdoZW4gZ2V0dGluZyBpbnN0YW5jZSBvZiBCcmVha0l0ZXJhdG9yIC0tPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwuYnMubGFuZ3VhZ2UiPmVuPC9zdHI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5icy5jb3VudHJ5Ij5VUzwvc3RyPgorICAgICAgICA8L2xzdD4KKyAgICAgIDwvYm91bmRhcnlTY2FubmVyPgorICAgIDwvaGlnaGxpZ2h0aW5nPgorICA8L3NlYXJjaENvbXBvbmVudD4KKworICA8IS0tIFVwZGF0ZSBQcm9jZXNzb3JzCisKKyAgICAgICBDaGFpbnMgb2YgVXBkYXRlIFByb2Nlc3NvciBGYWN0b3JpZXMgZm9yIGRlYWxpbmcgd2l0aCBVcGRhdGUKKyAgICAgICBSZXF1ZXN0cyBjYW4gYmUgZGVjbGFyZWQsIGFuZCB0aGVuIHVzZWQgYnkgbmFtZSBpbiBVcGRhdGUKKyAgICAgICBSZXF1ZXN0IFByb2Nlc3NvcnMKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9VcGRhdGVSZXF1ZXN0UHJvY2Vzc29yCisKKyAgICAtLT4gCisgIDwhLS0gRGVkdXBsaWNhdGlvbgorCisgICAgICAgQW4gZXhhbXBsZSBkZWR1cCB1cGRhdGUgcHJvY2Vzc29yIHRoYXQgY3JlYXRlcyB0aGUgImlkIiBmaWVsZAorICAgICAgIG9uIHRoZSBmbHkgYmFzZWQgb24gdGhlIGhhc2ggY29kZSBvZiBzb21lIG90aGVyIGZpZWxkcy4gIFRoaXMKKyAgICAgICBleGFtcGxlIGhhcyBvdmVyd3JpdGVEdXBlcyBzZXQgdG8gZmFsc2Ugc2luY2Ugd2UgYXJlIHVzaW5nIHRoZQorICAgICAgIGlkIGZpZWxkIGFzIHRoZSBzaWduYXR1cmVGaWVsZCBhbmQgU29sciB3aWxsIG1haW50YWluCisgICAgICAgdW5pcXVlbmVzcyBiYXNlZCBvbiB0aGF0IGFueXdheS4gIAorICAgICAgIAorICAgIC0tPgorICA8IS0tCisgICAgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0iZGVkdXBlIj4KKyAgICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLnByb2Nlc3Nvci5TaWduYXR1cmVVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgICAgIDxib29sIG5hbWU9ImVuYWJsZWQiPnRydWU8L2Jvb2w+CisgICAgICAgICA8c3RyIG5hbWU9InNpZ25hdHVyZUZpZWxkIj5pZDwvc3RyPgorICAgICAgICAgPGJvb2wgbmFtZT0ib3ZlcndyaXRlRHVwZXMiPmZhbHNlPC9ib29sPgorICAgICAgICAgPHN0ciBuYW1lPSJmaWVsZHMiPm5hbWUsZmVhdHVyZXMsY2F0PC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9InNpZ25hdHVyZUNsYXNzIj5zb2xyLnByb2Nlc3Nvci5Mb29rdXAzU2lnbmF0dXJlPC9zdHI+CisgICAgICAgPC9wcm9jZXNzb3I+CisgICAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5Mb2dVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgorICAgICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIgLz4KKyAgICAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisgICAgLS0+CisgIAorICA8IS0tIExhbmd1YWdlIGlkZW50aWZpY2F0aW9uCisKKyAgICAgICBUaGlzIGV4YW1wbGUgdXBkYXRlIGNoYWluIGlkZW50aWZpZXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBpbmNvbWluZworICAgICAgIGRvY3VtZW50cyB1c2luZyB0aGUgbGFuZ2lkIGNvbnRyaWIuIFRoZSBkZXRlY3RlZCBsYW5ndWFnZSBpcworICAgICAgIHdyaXR0ZW4gdG8gZmllbGQgbGFuZ3VhZ2Vfcy4gTm8gZmllbGQgbmFtZSBtYXBwaW5nIGlzIGRvbmUuCisgICAgICAgVGhlIGZpZWxkcyB1c2VkIGZvciBkZXRlY3Rpb24gYXJlIHRleHQsIHRpdGxlLCBzdWJqZWN0IGFuZCBkZXNjcmlwdGlvbiwKKyAgICAgICBtYWtpbmcgdGhpcyBleGFtcGxlIHN1aXRhYmxlIGZvciBkZXRlY3RpbmcgbGFuZ3VhZ2VzIGZvcm0gZnVsbC10ZXh0CisgICAgICAgcmljaCBkb2N1bWVudHMgaW5qZWN0ZWQgdmlhIEV4dHJhY3RpbmdSZXF1ZXN0SGFuZGxlci4KKyAgICAgICBTZWUgbW9yZSBhYm91dCBsYW5nSWQgYXQgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL0xhbmd1YWdlRGV0ZWN0aW9uCisgICAgLS0+CisgICAgPCEtLQorICAgICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9ImxhbmdpZCI+CisgICAgICAgPHByb2Nlc3NvciBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuVGlrYUxhbmd1YWdlSWRlbnRpZmllclVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgICAgPHN0ciBuYW1lPSJsYW5naWQuZmwiPnRleHQsdGl0bGUsc3ViamVjdCxkZXNjcmlwdGlvbjwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJsYW5naWQubGFuZ0ZpZWxkIj5sYW5ndWFnZV9zPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImxhbmdpZC5mYWxsYmFjayI+ZW48L3N0cj4KKyAgICAgICA8L3Byb2Nlc3Nvcj4KKyAgICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLkxvZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkiIC8+CisgICAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgorICAgICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKyAgICAtLT4KKworICA8IS0tIFNjcmlwdCB1cGRhdGUgcHJvY2Vzc29yCisKKyAgICBUaGlzIGV4YW1wbGUgaG9va3MgaW4gYW4gdXBkYXRlIHByb2Nlc3NvciBpbXBsZW1lbnRlZCB1c2luZyBKYXZhU2NyaXB0LgorCisgICAgU2VlIG1vcmUgYWJvdXQgdGhlIHNjcmlwdCB1cGRhdGUgcHJvY2Vzc29yIGF0IGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TY3JpcHRVcGRhdGVQcm9jZXNzb3IKKyAgLS0+CisgIDwhLS0KKyAgICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InNjcmlwdCI+CisgICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlN0YXRlbGVzc1NjcmlwdFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgICA8c3RyIG5hbWU9InNjcmlwdCI+dXBkYXRlLXNjcmlwdC5qczwvc3RyPgorICAgICAgICA8bHN0IG5hbWU9InBhcmFtcyI+CisgICAgICAgICAgPHN0ciBuYW1lPSJjb25maWdfcGFyYW0iPmV4YW1wbGUgY29uZmlnIHBhcmFtZXRlcjwvc3RyPgorICAgICAgICA8L2xzdD4KKyAgICAgIDwvcHJvY2Vzc29yPgorICAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgorICAgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorICAtLT4KKyAKKyAgPCEtLSBSZXNwb25zZSBXcml0ZXJzCisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvUXVlcnlSZXNwb25zZVdyaXRlcgorCisgICAgICAgUmVxdWVzdCByZXNwb25zZXMgd2lsbCBiZSB3cml0dGVuIHVzaW5nIHRoZSB3cml0ZXIgc3BlY2lmaWVkIGJ5CisgICAgICAgdGhlICd3dCcgcmVxdWVzdCBwYXJhbWV0ZXIgbWF0Y2hpbmcgdGhlIG5hbWUgb2YgYSByZWdpc3RlcmVkCisgICAgICAgd3JpdGVyLgorCisgICAgICAgVGhlICJkZWZhdWx0IiB3cml0ZXIgaXMgdGhlIGRlZmF1bHQgYW5kIHdpbGwgYmUgdXNlZCBpZiAnd3QnIGlzCisgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4KKyAgICAtLT4KKyAgPCEtLSBUaGUgZm9sbG93aW5nIHJlc3BvbnNlIHdyaXRlcnMgYXJlIGltcGxpY2l0bHkgY29uZmlndXJlZCB1bmxlc3MKKyAgICAgICBvdmVycmlkZGVuLi4uCisgICAgLS0+CisgIDwhLS0KKyAgICAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0ieG1sIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuWE1MUmVzcG9uc2VXcml0ZXIiIC8+CisgICAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9Impzb24iIGNsYXNzPSJzb2xyLkpTT05SZXNwb25zZVdyaXRlciIvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJweXRob24iIGNsYXNzPSJzb2xyLlB5dGhvblJlc3BvbnNlV3JpdGVyIi8+CisgICAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InJ1YnkiIGNsYXNzPSJzb2xyLlJ1YnlSZXNwb25zZVdyaXRlciIvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJwaHAiIGNsYXNzPSJzb2xyLlBIUFJlc3BvbnNlV3JpdGVyIi8+CisgICAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InBocHMiIGNsYXNzPSJzb2xyLlBIUFNlcmlhbGl6ZWRSZXNwb25zZVdyaXRlciIvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJjc3YiIGNsYXNzPSJzb2xyLkNTVlJlc3BvbnNlV3JpdGVyIi8+CisgICAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InNjaGVtYS54bWwiIGNsYXNzPSJzb2xyLlNjaGVtYVhtbFJlc3BvbnNlV3JpdGVyIi8+CisgICAgLS0+CisKKyAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0ianNvbiIgY2xhc3M9InNvbHIuSlNPTlJlc3BvbnNlV3JpdGVyIj4KKyAgICAgPCEtLSBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSB0dXRvcmlhbCwgSlNPTiByZXNwb25zZXMgYXJlIHdyaXR0ZW4gYXMKKyAgICAgIHBsYWluIHRleHQgc28gdGhhdCB0aGV5IGFyZSBlYXN5IHRvIHJlYWQgaW4gKmFueSogYnJvd3Nlci4KKyAgICAgIElmIHlvdSBleHBlY3QgYSBNSU1FIHR5cGUgb2YgImFwcGxpY2F0aW9uL2pzb24iIGp1c3QgcmVtb3ZlIHRoaXMgb3ZlcnJpZGUuCisgICAgIC0tPgorICAgIDxzdHIgbmFtZT0iY29udGVudC10eXBlIj50ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04PC9zdHI+CisgIDwvcXVlcnlSZXNwb25zZVdyaXRlcj4KKyAgCisgIDwhLS0KKyAgICAgQ3VzdG9tIHJlc3BvbnNlIHdyaXRlcnMgY2FuIGJlIGRlY2xhcmVkIGFzIG5lZWRlZC4uLgorICAgIC0tPgorICAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InZlbG9jaXR5IiBjbGFzcz0ic29sci5WZWxvY2l0eVJlc3BvbnNlV3JpdGVyIiBzdGFydHVwPSJsYXp5Ii8+CisgIAorCisgIDwhLS0gWFNMVCByZXNwb25zZSB3cml0ZXIgdHJhbnNmb3JtcyB0aGUgWE1MIG91dHB1dCBieSBhbnkgeHNsdCBmaWxlIGZvdW5kCisgICAgICAgaW4gU29scidzIGNvbmYveHNsdCBkaXJlY3RvcnkuICBDaGFuZ2VzIHRvIHhzbHQgZmlsZXMgYXJlIGNoZWNrZWQgZm9yCisgICAgICAgZXZlcnkgeHNsdENhY2hlTGlmZXRpbWVTZWNvbmRzLiAgCisgICAgLS0+CisgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InhzbHQiIGNsYXNzPSJzb2xyLlhTTFRSZXNwb25zZVdyaXRlciI+CisgICAgPGludCBuYW1lPSJ4c2x0Q2FjaGVMaWZldGltZVNlY29uZHMiPjU8L2ludD4KKyAgPC9xdWVyeVJlc3BvbnNlV3JpdGVyPgorCisgIDwhLS0gUXVlcnkgUGFyc2VycworCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NvbHJRdWVyeVN5bnRheAorCisgICAgICAgTXVsdGlwbGUgUVBhcnNlclBsdWdpbnMgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgbmFtZSwgYW5kIHRoZW4KKyAgICAgICB1c2VkIGluIGVpdGhlciB0aGUgImRlZlR5cGUiIHBhcmFtIGZvciB0aGUgUXVlcnlDb21wb25lbnQgKHVzZWQKKyAgICAgICBieSBTZWFyY2hIYW5kbGVyKSBvciBpbiBMb2NhbFBhcmFtcworICAgIC0tPgorICA8IS0tIGV4YW1wbGUgb2YgcmVnaXN0ZXJpbmcgYSBxdWVyeSBwYXJzZXIgLS0+CisgIDwhLS0KKyAgICAgPHF1ZXJ5UGFyc2VyIG5hbWU9Im15cGFyc2VyIiBjbGFzcz0iY29tLm15Y29tcGFueS5NeVFQYXJzZXJQbHVnaW4iLz4KKyAgICAtLT4KKworICA8IS0tIEZ1bmN0aW9uIFBhcnNlcnMKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9GdW5jdGlvblF1ZXJ5CisKKyAgICAgICBNdWx0aXBsZSBWYWx1ZVNvdXJjZVBhcnNlcnMgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgbmFtZSwgYW5kIHRoZW4KKyAgICAgICB1c2VkIGFzIGZ1bmN0aW9uIG5hbWVzIHdoZW4gdXNpbmcgdGhlICJmdW5jIiBRUGFyc2VyLgorICAgIC0tPgorICA8IS0tIGV4YW1wbGUgb2YgcmVnaXN0ZXJpbmcgYSBjdXN0b20gZnVuY3Rpb24gcGFyc2VyICAtLT4KKyAgPCEtLQorICAgICA8dmFsdWVTb3VyY2VQYXJzZXIgbmFtZT0ibXlmdW5jIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb20ubXljb21wYW55Lk15VmFsdWVTb3VyY2VQYXJzZXIiIC8+CisgICAgLS0+CisgICAgCisgIAorICA8IS0tIERvY3VtZW50IFRyYW5zZm9ybWVycworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Eb2NUcmFuc2Zvcm1lcnMKKyAgICAtLT4KKyAgPCEtLQorICAgICBDb3VsZCBiZSBzb21ldGhpbmcgbGlrZToKKyAgICAgPHRyYW5zZm9ybWVyIG5hbWU9ImRiIiBjbGFzcz0iY29tLm15Y29tcGFueS5Mb2FkRnJvbURhdGFiYXNlVHJhbnNmb3JtZXIiID4KKyAgICAgICA8aW50IG5hbWU9ImNvbm5lY3Rpb24iPmpkYmM6Ly8uLi4uPC9pbnQ+CisgICAgIDwvdHJhbnNmb3JtZXI+CisgICAgIAorICAgICBUbyBhZGQgYSBjb25zdGFudCB2YWx1ZSB0byBhbGwgZG9jcywgdXNlOgorICAgICA8dHJhbnNmb3JtZXIgbmFtZT0ibXl0cmFuczIiIGNsYXNzPSJvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UudHJhbnNmb3JtLlZhbHVlQXVnbWVudGVyRmFjdG9yeSIgPgorICAgICAgIDxpbnQgbmFtZT0idmFsdWUiPjU8L2ludD4KKyAgICAgPC90cmFuc2Zvcm1lcj4KKyAgICAgCisgICAgIElmIHlvdSB3YW50IHRoZSB1c2VyIHRvIHN0aWxsIGJlIGFibGUgdG8gY2hhbmdlIGl0IHdpdGggX3ZhbHVlOnNvbWV0aGluZ18gdXNlIHRoaXM6CisgICAgIDx0cmFuc2Zvcm1lciBuYW1lPSJteXRyYW5zMyIgY2xhc3M9Im9yZy5hcGFjaGUuc29sci5yZXNwb25zZS50cmFuc2Zvcm0uVmFsdWVBdWdtZW50ZXJGYWN0b3J5IiA+CisgICAgICAgPGRvdWJsZSBuYW1lPSJkZWZhdWx0VmFsdWUiPjU8L2RvdWJsZT4KKyAgICAgPC90cmFuc2Zvcm1lcj4KKworICAgICAgSWYgeW91IGFyZSB1c2luZyB0aGUgUXVlcnlFbGV2YXRpb25Db21wb25lbnQsIHlvdSBtYXkgd2lzaCB0byBtYXJrIGRvY3VtZW50cyB0aGF0IGdldCBib29zdGVkLiAgVGhlCisgICAgICBFZGl0b3JpYWxNYXJrZXJGYWN0b3J5IHdpbGwgZG8gZXhhY3RseSB0aGF0OgorICAgICA8dHJhbnNmb3JtZXIgbmFtZT0icWVjQm9vc3RlciIgY2xhc3M9Im9yZy5hcGFjaGUuc29sci5yZXNwb25zZS50cmFuc2Zvcm0uRWRpdG9yaWFsTWFya2VyRmFjdG9yeSIgLz4KKyAgICAtLT4KKyAgICAKKworICA8IS0tIExlZ2FjeSBjb25maWcgZm9yIHRoZSBhZG1pbiBpbnRlcmZhY2UgLS0+CisgIDxhZG1pbj4KKyAgICA8ZGVmYXVsdFF1ZXJ5Pio6KjwvZGVmYXVsdFF1ZXJ5PgorICA8L2FkbWluPgorCis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3NwZWxsaW5ncy50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zcGVsbGluZ3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWRlNmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zcGVsbGluZ3MudHh0CkBAIC0wLDAgKzEsMiBAQAorcGl6emEKK2hpc3RvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zdG9wd29yZHMudHh0IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvc3RvcHdvcmRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFlODNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvc3RvcHdvcmRzLnR4dApAQCAtMCwwICsxLDE0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zeW5vbnltcy50eHQgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi9zeW5vbnltcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3MjEyOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3N5bm9ueW1zLnR4dApAQCAtMCwwICsxLDI5IEBACisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjc29tZSB0ZXN0IHN5bm9ueW0gbWFwcGluZ3MgdW5saWtlbHkgdG8gYXBwZWFyIGluIHJlYWwgaW5wdXQgdGV4dAorYWFhZm9vID0+IGFhYWJhcgorYmJiZm9vID0+IGJiYmZvbyBiYmJiYXIKK2NjY2ZvbyA9PiBjY2NiYXIgY2NjYmF6Citmb29hYWEsYmFyYWFhLGJhemFhYQorCisjIFNvbWUgc3lub255bSBncm91cHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlCitHQixnaWIsZ2lnYWJ5dGUsZ2lnYWJ5dGVzCitNQixtaWIsbWVnYWJ5dGUsbWVnYWJ5dGVzCitUZWxldmlzaW9uLCBUZWxldmlzaW9ucywgVFYsIFRWcworI25vdGljZSB3ZSB1c2UgImdpYiIgaW5zdGVhZCBvZiAiR2lCIiBzbyBhbnkgV29yZERlbGltaXRlckZpbHRlciBjb21pbmcKKyNhZnRlciB1cyB3b24ndCBzcGxpdCBpdCBpbnRvIHR3byB3b3Jkcy4KKworIyBTeW5vbnltIG1hcHBpbmdzIGNhbiBiZSB1c2VkIGZvciBzcGVsbGluZyBjb3JyZWN0aW9uIHRvbworcGl4aW1hID0+IHBpeG1hCisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3VwZGF0ZS1zY3JpcHQuanMgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi91cGRhdGUtc2NyaXB0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjA3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi91cGRhdGUtc2NyaXB0LmpzCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgIFRoaXMgaXMgYSBiYXNpYyBza2VsZXRvbiBKYXZhU2NyaXB0IHVwZGF0ZSBwcm9jZXNzb3IuCisKKyAgSW4gb3JkZXIgZm9yIHRoaXMgdG8gYmUgZXhlY3V0ZWQsIGl0IG11c3QgYmUgcHJvcGVybHkgd2lyZWQgaW50byBzb2xyY29uZmlnLnhtbDsgYnkgZGVmYXVsdCBpdCBpcyBjb21tZW50ZWQgb3V0IGluCisgIHRoZSBleGFtcGxlIHNvbHJjb25maWcueG1sIGFuZCBtdXN0IGJlIHVuY29tbWVudGVkIHRvIGJlIGVuYWJsZWQuCisKKyAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TY3JpcHRVcGRhdGVQcm9jZXNzb3IgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKK2Z1bmN0aW9uIHByb2Nlc3NBZGQoY21kKSB7CisKKyAgZG9jID0gY21kLnNvbHJEb2M7ICAvLyBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dERvY3VtZW50CisgIGlkID0gZG9jLmdldEZpZWxkVmFsdWUoImlkIik7CisgIGxvZ2dlci5pbmZvKCJ1cGRhdGUtc2NyaXB0I3Byb2Nlc3NBZGQ6IGlkPSIgKyBpZCk7CisKKy8vIFNldCBhIGZpZWxkIHZhbHVlOgorLy8gIGRvYy5zZXRGaWVsZCgiZm9vX3MiLCAid2hhdGV2ZXIiKTsKKworLy8gR2V0IGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI6CisvLyAgY29uZmlnX3BhcmFtID0gcGFyYW1zLmdldCgnY29uZmlnX3BhcmFtJyk7ICAvLyAicGFyYW1zIiBvbmx5IGV4aXN0cyBpZiBwcm9jZXNzb3IgY29uZmlndXJlZCB3aXRoIDxsc3QgbmFtZT0icGFyYW1zIj4KKworLy8gR2V0IGEgcmVxdWVzdCBwYXJhbWV0ZXI6CisvLyBzb21lX3BhcmFtID0gcmVxLmdldFBhcmFtcygpLmdldCgic29tZV9wYXJhbSIpCisKKy8vIEFkZCBhIGZpZWxkIG9mIGZpZWxkIG5hbWVzIHRoYXQgbWF0Y2ggYSBwYXR0ZXJuOgorLy8gICAtIFBvdGVudGlhbGx5IHVzZWZ1bCB0byBkZXRlcm1pbmUgdGhlIGZpZWxkcy9hdHRyaWJ1dGVzIHJlcHJlc2VudGVkIGluIGEgcmVzdWx0IHNldCwgdmlhIGZhY2V0aW5nIG9uIGZpZWxkX25hbWVfc3MKKy8vICBmaWVsZF9uYW1lcyA9IGRvYy5nZXRGaWVsZE5hbWVzKCkudG9BcnJheSgpOworLy8gIGZvcihpPTA7IGkgPCBmaWVsZF9uYW1lcy5sZW5ndGg7IGkrKykgeworLy8gICAgZmllbGRfbmFtZSA9IGZpZWxkX25hbWVzW2ldOworLy8gICAgaWYgKC9hdHRyXy4qLy50ZXN0KGZpZWxkX25hbWUpKSB7IGRvYy5hZGRGaWVsZCgiYXR0cmlidXRlX3NzIiwgZmllbGRfbmFtZXNbaV0pOyB9CisvLyAgfQorCit9CisKK2Z1bmN0aW9uIHByb2Nlc3NEZWxldGUoY21kKSB7CisgIC8vIG5vLW9wCit9CisKK2Z1bmN0aW9uIHByb2Nlc3NNZXJnZUluZGV4ZXMoY21kKSB7CisgIC8vIG5vLW9wCit9CisKK2Z1bmN0aW9uIHByb2Nlc3NDb21taXQoY21kKSB7CisgIC8vIG5vLW9wCit9CisKK2Z1bmN0aW9uIHByb2Nlc3NSb2xsYmFjayhjbWQpIHsKKyAgLy8gbm8tb3AKK30KKworZnVuY3Rpb24gZmluaXNoKCkgeworICAvLyBuby1vcAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvUkVBRE1FLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NjBiYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L1JFQURNRS50eHQKQEAgLTAsMCArMSwxMDEgQEAKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCitTb2xyIFNlYXJjaCBWZWxvY2l0eSBUZW1wbGF0ZXMKKworQSBxdWljayBkZW1vIG9mIHVzaW5nIFNvbHIgdXNpbmcgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1ZlbG9jaXR5UmVzcG9uc2VXcml0ZXIKKworWW91IHR5cGljYWxseSBhY2Nlc3MgdGhlc2UgdGVtcGxhdGVzIHZpYToKKwlodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9jb2xsZWN0aW9uMS9icm93c2UKKworSXQncyBjYWxsZWQgImJyb3dzZSIgYmVjYXVzZSB5b3UgY2FuIGNsaWNrIGFyb3VuZCB3aXRoIHlvdXIgbW91c2UKK3dpdGhvdXQgbmVlZGluZyB0byB0eXBlIGFueSBzZWFyY2ggdGVybXMuICBBbmQgb2YgY291cnNlIGl0CithbHNvIHdvcmtzIGFzIGEgc3RhbmRhcmQgc2VhcmNoIGFwcCBhcyB3ZWxsLgorCitLbm93biBMaW1pdGF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0KKyogVGhlIC9icm93c2UgYW5kIHRoZSBWZWxvY2l0eVJlc3BvbnNlV3JpdGVyIGNvbXBvbmVudAorICBzZXJ2ZSBjb250ZW50IGRpcmVjdGx5IGZyb20gU29sciwgd2hpY2ggdXN1YWxseSByZXF1aXJlcworICBTb2xyJ3MgSFRUUCBBUEkgdG8gYmUgZXhwb3NlZC4gIEFkdmFuY2VkIHVzZXJzIGNvdWxkCisgIHBvdGVudGlhbGx5IGFjY2VzcyBvdGhlciBwYXJ0cyBvZiBTb2xyIGRpcmVjdGx5LgorKiBUaGVyZSBhcmUgc29tZSBoYXJkIGNvZGVkIGZpZWxkcyBpbiB0aGVzZSB0ZW1wbGF0ZXMuCisgIFNpbmNlIHRoZXNlIHRlbXBsYXRlcyBsaXZlIHVuZGVyIGNvbmYsIHRoZXkgc2hvdWxkIGJlCisgIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLCBhbmQKKyAgbXVzdCBiZSBjb29yZGluYXRlZCB3aXRoIHNjaGVtYS54bWwgYW5kIHNvbHJjb25maWcueG1sCisKK1ZlbG9jaXR5IEluZm8KKy0tLS0tLS0tLS0tLS0KK0phdmEtYmFzZWQgdGVtcGxhdGUgbGFuZ3VhZ2UuCisKK0l0J3MgbmljZSBpbiB0aGlzIGNvbnRleHQgYmVjYXVzZSBjaGFuZ2UgdG8gdGhlIHRlbXBsYXRlcworYXJlIGltbWVkaWF0ZWx5IHZpc2libGUgaW4gYnJvd3NlciBvbiB0aGUgbmV4dCB2aXNpdC4KKworTGlua3M6CisJaHR0cDovL3ZlbG9jaXR5LmFwYWNoZS5vcmcKKwlodHRwOi8vd2lraS5hcGFjaGUub3JnL3ZlbG9jaXR5LworCWh0dHA6Ly92ZWxvY2l0eS5hcGFjaGUub3JnL2VuZ2luZS9yZWxlYXNlcy92ZWxvY2l0eS0xLjcvdXNlci1ndWlkZS5odG1sCisKKworRmlsZSBMaXN0CistLS0tLS0tLS0KKworU3lzdGVtIGFuZCBNaXNjOgorICBWTV9nbG9iYWxfbGlicmFyeS52bSAgICAtIE1hY3JvcyB1c2VkIG90aGVyIHRlbXBsYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCBmaWxlbmFtZSBpcyBpbXBvcnRhbnQgZm9yIFZlbG9jaXR5IHRvIHNlZSBpdAorICBlcnJvci52bSAgICAgICAgICAgICAgICAtIHNob3dzIGVycm9ycywgaWYgYW55CisgIGRlYnVnLnZtICAgICAgICAgICAgICAgIC0gaW5jbHVkZXMgdG9nZ2xlIGxpbmtzIGZvciAiZXhwbGFpbiIgYW5kICJhbGwgZmllbGRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlZCBieSBkZWJ1ZyBsaW5rIGluIGZvb3Rlci52bQorICBSRUFETUUudHh0ICAgICAgICAgICAgICAtIHRoaXMgZmlsZQorCitPdmVyYWxsIFBhZ2UgQ29tcG9zaXRpb246CisgIGJyb3dzZS52bSAgICAgICAgICAgICAgIC0gTWFpbiBlbnRyeSBwb2ludCBpbnRvIHRlbXBsYXRlcworICBsYXlvdXQudm0gICAgICAgICAgICAgICAtIG92ZXJhbGwgSFRNTCBwYWdlIGxheW91dAorICBoZWFkLnZtICAgICAgICAgICAgICAgICAtIGVsZW1lbnRzIGluIHRoZSA8aGVhZD4gc2VjdGlvbiBvZiB0aGUgSFRNTCBkb2N1bWVudAorICBoZWFkZXIudm0gICAgICAgICAgICAgICAtIHRvcCBzZWN0aW9uIG9mIHBhZ2UgdmlzaWJsZSB0byB1c2VycworICBmb290ZXIudm0gICAgICAgICAgICAgICAtIGJvdHRvbSBzZWN0aW9uIG9mIHBhZ2UgdmlzaWJsZSB0byB1c2VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBkZWJ1ZyBhbmQgaGVscCBsaW5rcworICBtYWluLmNzcyAgICAgICAgICAgICAgICAtIENTUyBzdHlsZSBmb3Igb3ZlcmFsbCBwYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBhbHNvIGpxdWVyeS5hdXRvY29tcGxldGUuY3NzCisKK1F1ZXJ5IEZvcm0gYW5kIE9wdGlvbnM6CisgIHF1ZXJ5X2Zvcm0udm0gICAgICAgICAgIC0gcmVuZGVycyBxdWVyeSBmb3JtCisgIHF1ZXJ5X2dyb3VwLnZtICAgICAgICAgIC0gZ3JvdXAgYnkgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLjogTWFudWZhY3R1cmVyIG9yIFBvcGx1bGFyaXR5CisgIHF1ZXJ5X3NwYXRpYWwudm0gICAgICAgIC0gc2VsZWN0IGJveCBmb3IgbG9jYXRpb24gYmFzZWQgR2Vvc3BhY2lhbCBzZWFyY2gKKworU3BlbGxpbmcgU3VnZ2VzdGlvbnM6CisgIGRpZF95b3VfbWVhbi52bSAgICAgICAgIC0gaHlwZXJsaW5rZWQgc3BlbGxpbmcgc3VnZ2VzdGlvbnMgaW4gcmVzdWx0cworICBzdWdnZXN0LnZtICAgICAgICAgICAgICAtIGR5bmFtaWMgc3BlbGxpbmcgc3VnZ2VzdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB5b3UgdHlwZSBpbiB0aGUgc2VhcmNoIGZvcm0KKyAganF1ZXJ5LmF1dG9jb21wbGV0ZS5qcyAgLSBzdXBwb3J0aW5nIGZpbGVzIGZvciBkeW5hbWljIHN1Z2dlc3Rpb25zCisgIGpxdWVyeS5hdXRvY29tcGxldGUuY3NzIC0gTW9zdCBDU1MgaXMgZGVmaW5lZCBpbiBtYWluLmNzcworCisKK1NlYXJjaCBSZXN1bHRzLCBHZW5lcmFsOgorICAoc2VlIGFsc28gYnJvd3NlLnZtKQorICB0YWJzLnZtICAgICAgICAgICAgICAgICAtIHByb3ZpZGVzIG5hdmlnYXRpb24gdG8gYWR2YW5jZWQgc2VhcmNoIG9wdGlvbnMKKyAgcGFnaW5hdGlvbl90b3Audm0gICAgICAgLSBwYWdpbmcgYW5kIHN0YXRpY2lzIGF0IHRvcCBvZiByZXN1bHRzCisgIHBhZ2luYXRpb25fYm90dG9tLnZtICAgIC0gcGFnaW5nIGFuZCBzdGF0aWNpcyBhdCBib3R0b20gb2YgcmVzdWx0cworICByZXN1bHRzX2xpc3Qudm0KKyAgaGl0LnZtICAgICAgICAgICAgICAgICAgLSBjYWxsZWQgZm9yIGVhY2ggbWF0Y2hpbmcgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lkZXMgd2hpY2ggdGVtcGxhdGUgdG8gdXNlCisgIGhpdF9ncm91cGVkLnZtICAgICAgICAgIC0gZGlzcGxheSByZXN1bHRzIGdyb3VwZWQgYnkgZmllbGQgdmFsdWVzCisgIHByb2R1Y3RfZG9jLnZtICAgICAgICAgIC0gZGlzcGxheSBhIFByb2R1Y3QKKyAgam9pbl9kb2Mudm0gICAgICAgICAgICAgLSBkaXNwbGF5IGEgam9pbmVkIGRvY3VtZW50CisgIHJpY2h0ZXh0X2RvYy52bSAgICAgICAgIC0gZGlzcGxheSBhIGNvbXBsZXgvbWlzYy4gZG9jdW1lbnQKKyAgaGl0X3BsYWluLnZtICAgICAgICAgICAgLSBiYXNpYyBkaXNwbGF5IG9mIGFsbCBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdCByZXN1bHRzX2xpc3Qudm0gdG8gZW5hYmxlIHRoaXMKKworCitTZWFyY2ggUmVzdWx0cywgRmFjZXRzICYgQ2x1c3RlcnM6CisgIGZhY2V0cy52bSAgICAgICAgICAgICAgIC0gY2FsbHMgdGhlIDQgZmFjZXQgYW5kIDEgY2x1c3RlciB0ZW1wbGF0ZQorICBmYWNldF9maWVsZHMudm0gICAgICAgICAtIGRpc3BsYXkgZmFjZXRzIGJhc2VkIG9uIGZpZWxkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy46IGZpZWxkcyBzcGVjaWZpZWQgYnkgJmZhY2V0LmZpZWxkPQorICBmYWNldF9xdWVyaWVzLnZtICAgICAgICAtIGRpc3BsYXkgZmFjZXRzIGJhc2VkIG9uIHNwZWNpZmljIGZhY2V0IHF1ZXJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuOiBmYWNldHMgc3BlY2lmaWVkIGJ5ICZmYWNldC5xdWVyeT0KKyAgZmFjZXRfcmFuZ2VzLnZtICAgICAgICAgLSBkaXNwbGF5IGZhY2V0cyBiYXNlZCBvbiByYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuOiByYW5nZXMgc3BlY2lmaWVkIGJ5ICZmYWNldC5yYW5nZT0KKyAgZmFjZXRfcGl2b3Qudm0gICAgICAgICAgLSBkaXNwbGF5IHBpdm90IGJhc2VkIGZhY2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy46IGZhY2V0cyBzcGVjaWZpZWQgYnkgJmZhY2V0LnBpdm90PQorICBjbHVzdGVyLnZtICAgICAgICAgICAgICAtIGlmIGNsdXN0ZXJpbmcgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBjYWxsIGNsdXN0ZXJfcmVzdWx0cy52bQorICBjbHVzdGVyX3Jlc3VsdHMudm0gICAgICAtIGFjdHVhbCByZW5kZXJpbmcgb2YgY2x1c3RlcnMKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L1ZNX2dsb2JhbF9saWJyYXJ5LnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvVk1fZ2xvYmFsX2xpYnJhcnkudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkYTA3YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L1ZNX2dsb2JhbF9saWJyYXJ5LnZtCkBAIC0wLDAgKzEsMTc1IEBACisjKioKKyAqICBHbG9iYWwgbWFjcm9zIHVzZWQgYnkgb3RoZXIgdGVtcGxhdGVzLgorICogIFRoaXMgZmlsZSBtdXN0IGJlIG5hbWVkIFZNX2dsb2JhbF9saWJyYXJ5LnZtCisgKiAgaW4gb3JkZXIgZm9yIFZlbG9jaXR5IHRvIGZpbmQgaXQuCisgKiMKKworI21hY3JvKHBhcmFtICRrZXkpJHJlcXVlc3QucGFyYW1zLmdldCgka2V5KSNlbmQKKworI21hY3JvKHVybF9yb290KS9zb2xyI2VuZAorCisjIyBUT0RPOiBzL3VybF9mb3Jfc29sci91cmxfZm9yX2NvcmUvIGFuZCBzL3VybF9yb290L3VybF9mb3Jfc29sci8KKyNtYWNybyhjb3JlX25hbWUpJHJlcXVlc3QuY29yZS5uYW1lI2VuZAorI21hY3JvKHVybF9mb3Jfc29scikje3VybF9yb290fSNpZigkcmVxdWVzdC5jb3JlLm5hbWUgIT0gIiIpLyRyZXF1ZXN0LmNvcmUubmFtZSNlbmQjZW5kCisjbWFjcm8odXJsX2Zvcl9ob21lKSN1cmxfZm9yX3NvbHIvYnJvd3NlI2VuZAorCisjbWFjcm8ocSkmcT0kIXtlc2MudXJsKCRwYXJhbXMuZ2V0KCdxJykpfSNlbmQKKworI21hY3JvKGZxcyAkcCkjZm9yZWFjaCgkZnEgaW4gJHApI2lmKCR2ZWxvY2l0eUNvdW50PjEpJiN7ZW5kfWZxPSRlc2MudXJsKCRmcSkjZW5kI2VuZAorCisjbWFjcm8oZGVidWcpI2lmKCRyZXF1ZXN0LnBhcmFtcy5nZXQoJ2RlYnVnUXVlcnknKSkmZGVidWdRdWVyeT10cnVlI2VuZCNlbmQKKworI21hY3JvKGJvb3N0UHJpY2UpI2lmKCRyZXF1ZXN0LnBhcmFtcy5nZXQoJ2JmJykgPT0gJ3ByaWNlJykmYmY9cHJpY2UjZW5kI2VuZCAgICAgICAgCisKKyNtYWNybyhhbm5vdGF0ZSkjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgnYW5ub3RhdGVCcm93c2UnKSkmYW5ub3RhdGVCcm93c2U9dHJ1ZSNlbmQjZW5kCisKKyNtYWNybyhhbm5UaXRsZSAkbXNnKSNpZigkYW5ub3RhdGUgPT0gdHJ1ZSl0aXRsZT0iJG1zZyIjZW5kI2VuZAorCisjbWFjcm8oc3BhdGlhbCkjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgnc2ZpZWxkJykpJnNmaWVsZD1zdG9yZSNlbmQjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgncHQnKSkmcHQ9JHJlcXVlc3QucGFyYW1zLmdldCgncHQnKSNlbmQjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgnZCcpKSZkPSRyZXF1ZXN0LnBhcmFtcy5nZXQoJ2QnKSNlbmQjZW5kCisKKyNtYWNybyhxT3B0cykjc2V0KCRxdWVyeU9wdHMgPSAkcmVxdWVzdC5wYXJhbXMuZ2V0KCJxdWVyeU9wdHMiKSkjaWYoJHF1ZXJ5T3B0cyAmJiAkcXVlcnlPcHRzICE9ICIiKSZxdWVyeU9wdHM9JHF1ZXJ5T3B0cyNlbmQjZW5kCisKKyNtYWNybyhncm91cCkjaWYoJHJlcXVlc3QucGFyYW1zLmdldEJvb2woImdyb3VwIikgPT0gdHJ1ZSkmZ3JvdXA9dHJ1ZSNlbmQjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgiZ3JvdXAuZmllbGQiKSkjZm9yZWFjaCgkZ3JwIGluICRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2dyb3VwLmZpZWxkJykpJmdyb3VwLmZpZWxkPSRncnAjZW5kI2VuZCNlbmQKKworI21hY3JvKHNvcnQgJHApI2lmKCRwKSNmb3JlYWNoKCRzIGluICRwKSZzb3J0PSRlc2MudXJsKCRzKSNlbmQjZW5kI2VuZAorCisjbWFjcm8obGVuc05vUSk/I2lmKCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2ZxJykgYW5kICRsaXN0LnNpemUoJHJlcXVlc3QucGFyYW1zLmdldFBhcmFtcygnZnEnKSkgPiAwKSYjZnFzKCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2ZxJykpI2VuZCNzb3J0KCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ3NvcnQnKSkjZGVidWcjYm9vc3RQcmljZSNhbm5vdGF0ZSNzcGF0aWFsI3FPcHRzI2dyb3VwI2VuZAorI21hY3JvKGxlbnMpI2xlbnNOb1EjcSNlbmQKKyAgICAgICAgCisKKyNtYWNybyh1cmxfZm9yX2xlbnMpI3t1cmxfZm9yX2hvbWV9I2xlbnMjZW5kCisKKyNtYWNybyh1cmxfZm9yX3N0YXJ0ICRzdGFydCkjdXJsX2Zvcl9ob21lI2xlbnMmc3RhcnQ9JHN0YXJ0I2VuZAorCisjbWFjcm8odXJsX2Zvcl9maWx0ZXJzICRwKSN1cmxfZm9yX2hvbWU/I3EjYm9vc3RQcmljZSNzcGF0aWFsI3FPcHRzI2lmKCRsaXN0LnNpemUoJHApID4gMCkmI2ZxcygkcCkjZW5kI2RlYnVnI2VuZAorCisjbWFjcm8odXJsX2Zvcl9uZXN0ZWRfZmFjZXRfcXVlcnkgJGZpZWxkKSN1cmxfZm9yX2hvbWUjbGVucyZmcT0kZXNjLnVybCgkZmllbGQpI2VuZAorCisjIyBUT0RPOiBjb252ZXJ0IHRvIHVzZSB7IXJhdyBmPSRmaWVsZH0kdmFsdWUgKHdpdGggZXNjYXBpbmcgb2YgY291cnNlKQorI21hY3JvKHVybF9mb3JfZmFjZXRfZmlsdGVyICRmaWVsZCAkdmFsdWUpI3VybF9mb3JfaG9tZSNsZW5zJmZxPSRlc2MudXJsKCRmaWVsZCk6JTIyJGVzYy51cmwoJHZhbHVlKSUyMiNlbmQKKworI21hY3JvKHVybF9mb3JfZmFjZXRfZGF0ZV9maWx0ZXIgJGZpZWxkICR2YWx1ZSkjdXJsX2Zvcl9ob21lI2xlbnMmZnE9JGVzYy51cmwoJGZpZWxkKTokZXNjLnVybCgkdmFsdWUpI2VuZAorCisjbWFjcm8odXJsX2Zvcl9mYWNldF9yYW5nZV9maWx0ZXIgJGZpZWxkICR2YWx1ZSkjdXJsX2Zvcl9ob21lI2xlbnMmZnE9JGVzYy51cmwoJGZpZWxkKTokZXNjLnVybCgkdmFsdWUpI2VuZAorCisKKyNtYWNybyhsaW5rX3RvX3ByZXZpb3VzX3BhZ2UgJHRleHQpCisgICNpZigkcGFnZS5jdXJyZW50X3BhZ2VfbnVtYmVyID4gMSkKKyAgICAjc2V0KCRwcmV2X3N0YXJ0ID0gJHBhZ2Uuc3RhcnQgLSAkcGFnZS5yZXN1bHRzX3Blcl9wYWdlKQorICAgIDxhIGNsYXNzPSJwcmV2LXBhZ2UiIGhyZWY9IiN1cmxfZm9yX3N0YXJ0KCRwcmV2X3N0YXJ0KSI+JHRleHQ8L2E+CisgICNlbmQKKyNlbmQKKworI21hY3JvKGxpbmtfdG9fbmV4dF9wYWdlICR0ZXh0KQorICAjaWYoJHBhZ2UuY3VycmVudF9wYWdlX251bWJlciA8ICRwYWdlLnBhZ2VfY291bnQpCisgICAgI3NldCgkbmV4dF9zdGFydCA9ICRwYWdlLnN0YXJ0ICsgJHBhZ2UucmVzdWx0c19wZXJfcGFnZSkKKyAgICA8YSBjbGFzcz0ibmV4dC1wYWdlIiBocmVmPSIjdXJsX2Zvcl9zdGFydCgkbmV4dF9zdGFydCkiPiR0ZXh0PC9hPgorICAjZW5kCisjZW5kCisKKyNtYWNybyhsaW5rX3RvX3BhZ2UgJHBhZ2VfbnVtYmVyICR0ZXh0KQorICAjaWYoJHBhZ2VfbnVtYmVyID09ICRwYWdlLmN1cnJlbnRfcGFnZV9udW1iZXIpCisgICAgJHRleHQKKyAgI2Vsc2UKKyAgICAjaWYoJHBhZ2VfbnVtYmVyIDw9ICRwYWdlLnBhZ2VfY291bnQpCisgICAgICAjc2V0KCRwYWdlX3N0YXJ0ID0gJHBhZ2VfbnVtYmVyICogJHBhZ2UucmVzdWx0c19wZXJfcGFnZSAtICRwYWdlLnJlc3VsdHNfcGVyX3BhZ2UpCisgICAgICA8YSBjbGFzcz0icGFnZSIgaHJlZj0iI3VybF9mb3Jfc3RhcnQoJHBhZ2Vfc3RhcnQpIj4kdGV4dDwvYT4KKyAgICAjZW5kCisgICNlbmQKKyNlbmQKKworI21hY3JvKGRpc3BsYXlfZmFjZXRfcXVlcnkgJGZpZWxkLCAkZGlzcGxheSwgJGZpZWxkTmFtZSkKKyAgI2lmKCRmaWVsZC5zaXplKCkgPiAwKQorICA8c3BhbiBjbGFzcz0iZmFjZXQtZmllbGQiPiRkaXNwbGF5PC9zcGFuPgorICAgIDx1bD4KKyAgICAjZm9yZWFjaCAoJGZhY2V0IGluICRmaWVsZCkKKyAgICAgICNpZiAoJGZhY2V0LnZhbHVlID4gMCkKKyAgICAgICAgI3NldCgkZmFjZXRVUkwgPSAiI3VybF9mb3JfbmVzdGVkX2ZhY2V0X3F1ZXJ5KCRmYWNldC5rZXkpIikKKyAgICAgICAgI2lmICgkZmFjZXRVUkwgIT0gJycpCisgICAgICAgICAgPGxpPjxhIGhyZWY9IiRmYWNldFVSTCI+JGZhY2V0LmtleTwvYT4gKCRmYWNldC52YWx1ZSk8L2xpPgorICAgICAgICAjZW5kCisgICAgICAjZW5kCisgICAgI2VuZAorICAgIDwvdWw+CisgICNlbmQgICAgICAKKyNlbmQKKworCisjbWFjcm8oZGlzcGxheV9mYWNldF9yYW5nZSAkZmllbGQsICRkaXNwbGF5LCAkZmllbGROYW1lLCAkc3RhcnQsICRlbmQsICRnYXAsICRiZWZvcmUsICRhZnRlcikKKyAgPHNwYW4gY2xhc3M9ImZhY2V0LWZpZWxkIj4kZGlzcGxheTwvc3Bhbj4KKyAgICA8dWw+CisgICAgI2lmKCRiZWZvcmUgJiYgJGJlZm9yZSAhPSAiIikKKyAgICAgICNzZXQoJHZhbHVlID0gIlsqIFRPICIgKyAiI2Zvcm1hdF92YWx1ZSgkc3RhcnQpIiArICJ9IikKKyAgICAgICNzZXQoJGZhY2V0VVJMID0gIiN1cmxfZm9yX2ZhY2V0X3JhbmdlX2ZpbHRlcigkZmllbGROYW1lLCAkdmFsdWUpIikKKyAgICAgIDxsaT48YSBocmVmPSIkZmFjZXRVUkwiPkxlc3MgdGhhbiAjZm9ybWF0X3ZhbHVlKCRzdGFydCk8L2E+ICgkYmVmb3JlKTwvbGk+CisgICAgI2VuZAorICAgICNmb3JlYWNoICgkZmFjZXQgaW4gJGZpZWxkKQorICAgICAgI3NldCgkcmFuZ2VFbmQgPSAiI3JhbmdlX2dldF90b192YWx1ZSgkZmFjZXQua2V5LCAkZ2FwKSIpCisgICAgICAjc2V0KCR2YWx1ZSA9ICJbIiArICRmYWNldC5rZXkgKyAiIFRPICIgKyAkcmFuZ2VFbmQgKyAifSIpCisgICAgICAjc2V0KCRmYWNldFVSTCA9ICIjdXJsX2Zvcl9mYWNldF9yYW5nZV9maWx0ZXIoJGZpZWxkTmFtZSwgJHZhbHVlKSIpCisgICAgICAjaWYgKCRmYWNldFVSTCAhPSAnJykKKyAgICAgICAgPGxpPjxhIGhyZWY9IiRmYWNldFVSTCI+JGZhY2V0LmtleSAtICNmb3JtYXRfdmFsdWUoJHJhbmdlRW5kKTwvYT4gKCRmYWNldC52YWx1ZSk8L2xpPgorICAgICAgI2VuZAorICAgICNlbmQKKyAgICAjaWYoJGVuZCAmJiAkZW5kICE9ICIiICYmICRhZnRlciA+IDApCisgICAgICAjc2V0KCR2YWx1ZSA9ICJbIiArICIjZm9ybWF0X3ZhbHVlKCRlbmQpIiArICIgVE8gKn0iKQorICAgICAgI3NldCgkZmFjZXRVUkwgPSAiI3VybF9mb3JfZmFjZXRfcmFuZ2VfZmlsdGVyKCRmaWVsZE5hbWUsICR2YWx1ZSkiKQorICAgICAgPGxpPjxhIGhyZWY9IiRmYWNldFVSTCI+TW9yZSB0aGFuICNmb3JtYXRfdmFsdWUoJGVuZCk8L2E+ICgkYWZ0ZXIpPC9saT4KKyAgICAjZW5kCisgICAgPC91bD4KKyNlbmQKKworIyMgJHBpdm90cyBpcyBhIGxpc3Qgb2YgZmFjZXRfcGl2b3QKKyNtYWNybyhkaXNwbGF5X2ZhY2V0X3Bpdm90ICRwaXZvdHMsICRkaXNwbGF5KQorICAjaWYoJHBpdm90cy5zaXplKCkgPiAwKQorICA8c3BhbiBjbGFzcz0iZmFjZXQtZmllbGQiPiRkaXNwbGF5PC9zcGFuPgorICAgIDx1bD4KKyAgICAgICNmb3JlYWNoICgkcGl2b3QgaW4gJHBpdm90cykKKyAgICAgICAgI2ZvcmVhY2ggKCRlbnRyeSBpbiAkcGl2b3QudmFsdWUpCisgICAgICAgICAgPGEgaHJlZj0iI3VybF9mb3JfZmFjZXRfZmlsdGVyKCRlbnRyeS5maWVsZCwgJGVudHJ5LnZhbHVlKSI+JGVudHJ5LmZpZWxkOjokZW50cnkudmFsdWU8L2E+ICgkZW50cnkuY291bnQpCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgI2ZvcmVhY2goJG5lc3QgaW4gJGVudHJ5LnBpdm90KQorICAgICAgICAgICAgICA8YSBocmVmPSIjdXJsX2Zvcl9mYWNldF9maWx0ZXIoJGVudHJ5LmZpZWxkLCAkZW50cnkudmFsdWUpJmZxPSRlc2MudXJsKCRuZXN0LmZpZWxkKTolMjIkZXNjLnVybCgkbmVzdC52YWx1ZSklMjIiPiRuZXN0LmZpZWxkOjokbmVzdC52YWx1ZTwvYT4gKCRuZXN0LmNvdW50KQorICAgICAgICAgICAgI2VuZAorICAgICAgICAgIDwvdWw+CisgICAgICAgICNlbmQKKyAgICAgICNlbmQKKyAgICA8L3VsPgorICAjZW5kCisjZW5kCisKKyNtYWNybyhmaWVsZCAkZikKKyAgI2lmKCRyZXNwb25zZS5yZXNwb25zZS5oaWdobGlnaHRpbmcuZ2V0KCRkb2NJZCkuZ2V0KCRmKS5nZXQoMCkpCisgICAgI3NldCgkcGFkID0gIiIpCisgICAgI2ZvcmVhY2goJHYgaW4gJHJlc3BvbnNlLnJlc3BvbnNlLmhpZ2hsaWdodGluZy5nZXQoJGRvY0lkKS5nZXQoJGYpKQorJHBhZCR2IyMKKyAgICAgICNzZXQoJHBhZCA9ICIgLi4uICIpCisgICAgI2VuZAorICAjZWxzZQorICAgICNmb3JlYWNoKCR2IGluICRkb2MuZ2V0RmllbGRWYWx1ZXMoJGYpKQorJHYjIworICAgICNlbmQKKyAgI2VuZAorI2VuZCAgCisKKyNtYWNybyh1dGNfZGF0ZSAkdGhlRGF0ZSkKKyRkYXRlLmZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzJ1onIiwkdGhlRGF0ZSwkZGF0ZS5nZXRMb2NhbGUoKSwkZGF0ZS5nZXRUaW1lWm9uZSgpLmdldFRpbWVab25lKCJVVEMiKSkjIworI2VuZAorCisjbWFjcm8oZm9ybWF0X3ZhbHVlICR2YWwpCisjaWYoJHt2YWwuY2xhc3MubmFtZX0gPT0gImphdmEudXRpbC5EYXRlIikKKyN1dGNfZGF0ZSgkdmFsKSMjCisjZWxzZQorJHZhbCMjCisjZW5kCisjZW5kCisKKyNtYWNybyhyYW5nZV9nZXRfdG9fdmFsdWUgJGludmFsLCAkZ2FwdmFsKQorI2lmKCR7Z2FwdmFsLmNsYXNzLm5hbWV9ID09ICJqYXZhLmxhbmcuU3RyaW5nIikKKyRpbnZhbCRnYXB2YWwjIworI2Vsc2VpZigke2dhcHZhbC5jbGFzcy5uYW1lfSA9PSAiamF2YS5sYW5nLkZsb2F0IiB8fCAke2ludmFsLmNsYXNzLm5hbWV9ID09ICJqYXZhLmxhbmcuRmxvYXQiKQorJG1hdGgudG9Eb3VibGUoJG1hdGguYWRkKCRpbnZhbCwkZ2FwdmFsKSkjIworI2Vsc2UKKyRtYXRoLmFkZCgkaW52YWwsJGdhcHZhbCkjIworI2VuZAorI2VuZApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvYnJvd3NlLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvYnJvd3NlLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZWNhZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9icm93c2Uudm0KQEAgLTAsMCArMSwzMyBAQAorIyoqCisgKiAgTWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSAvYnJvd3NlIHRlbXBsYXRlcworICojCisKKyNzZXQoJHNlYXJjaGVyID0gJHJlcXVlc3Quc2VhcmNoZXIpCisjc2V0KCRwYXJhbXMgPSAkcmVxdWVzdC5wYXJhbXMpCisjc2V0KCRjbHVzdGVycyA9ICRyZXNwb25zZS5yZXNwb25zZS5jbHVzdGVycykKKyNzZXQoJG1sdFJlc3VsdHMgPSAkcmVzcG9uc2UucmVzcG9uc2UuZ2V0KCJtb3JlTGlrZVRoaXMiKSkKKyNzZXQoJGFubm90YXRlID0gJHBhcmFtcy5nZXQoImFubm90YXRlQnJvd3NlIikpCisjcGFyc2UoJ3F1ZXJ5X2Zvcm0udm0nKQorI3BhcnNlKCdkaWRfeW91X21lYW4udm0nKQorCis8ZGl2IGNsYXNzPSJuYXZpZ2F0b3JzIj4KKyAgI3BhcnNlKCJmYWNldHMudm0iKQorPC9kaXY+CisKKzxkaXYgY2xhc3M9InBhZ2luYXRpb24iPgorICAjcGFyc2UoInBhZ2luYXRpb25fdG9wLnZtIikKKzwvZGl2PgorCisjIyBTaG93IEVycm9yIE1lc3NhZ2UsIGlmIGFueQorPGRpdiBjbGFzcz0iZXJyb3IiPgorICAjcGFyc2UoImVycm9yLnZtIikKKzwvZGl2PgorCisjIyBSZW5kZXIgUmVzdWx0cywgYWN0dWFsIG1hdGNoaW5nIGRvY3MKKzxkaXYgY2xhc3M9InJlc3VsdHMiPgorICAjcGFyc2UoInJlc3VsdHNfbGlzdC52bSIpCis8L2Rpdj4KKworPGRpdiBjbGFzcz0icGFnaW5hdGlvbiI+CisgICNwYXJzZSgicGFnaW5hdGlvbl9ib3R0b20udm0iKQorPC9kaXY+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9jbHVzdGVyLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvY2x1c3Rlci52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmUyZjNiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvY2x1c3Rlci52bQpAQCAtMCwwICsxLDE5IEBACisjKioKKyAqICBDaGVjayBpZiBDbHVzdGVyaW5nIGlzIEVuYWJsZWQgYW5kIHRoZW4KKyAqICBjYWxsIGNsdXN0ZXJfcmVzdWx0cy52bQorICojCisKKzxoMiAjYW5uVGl0bGUoIkNsdXN0ZXJzIGdlbmVyYXRlZCBieSBDYXJyb3QyIHVzaW5nIHRoZSAvY2x1c3RlcmluZyBSZXF1ZXN0SGFuZGxlciIpPgorICBDbHVzdGVycworPC9oMj4KKworIyMgRGl2IHRhZyBoYXMgcGxhY2Vob2xkZXIgdGV4dCBieSBkZWZhdWx0Cis8ZGl2IGlkPSJjbHVzdGVycyI+CisgIFJ1biBTb2xyIHdpdGggamF2YSAtRHNvbHIuY2x1c3RlcmluZy5lbmFibGVkPXRydWUgLWphciBzdGFydC5qYXIgdG8gc2VlIGNsdXN0ZXJlZCBzZWFyY2ggcmVzdWx0cy4KKzwvZGl2PgorCisjIyBSZXBsYWNlIHRoZSBkaXYgY29udGVudCAqaWYqIENhcnJvdF4yIGlzIGF2YWlsYWJsZQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAkKCcjY2x1c3RlcnMnKS5sb2FkKCIjdXJsX2Zvcl9zb2xyL2NsdXN0ZXJpbmcjbGVucyIsCisgICAgeyd3dCc6J3ZlbG9jaXR5JywgJ3YudGVtcGxhdGUnOiJjbHVzdGVyX3Jlc3VsdHMifSk7Cis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2NsdXN0ZXJfcmVzdWx0cy52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2NsdXN0ZXJfcmVzdWx0cy52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ0ODBkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvY2x1c3Rlcl9yZXN1bHRzLnZtCkBAIC0wLDAgKzEsMzEgQEAKKyMqKgorICogIEFjdHVhbCByZW5kZXJpbmcgb2YgQ2x1c3RlcnMKKyAqIworCisjIyBGb3IgZWFjaCBjbHVzdGVyCisjZm9yZWFjaCAoJGNsdXN0ZXJzIGluICRyZXNwb25zZS5yZXNwb25zZS5jbHVzdGVycykKKworICAjc2V0KCRsYWJlbHMgPSAkY2x1c3RlcnMuZ2V0KCdsYWJlbHMnKSkKKyAgI3NldCgkZG9jcyA9ICRjbHVzdGVycy5nZXQoJ2RvY3MnKSkKKworICAjIyBUaGlzIENsdXN0ZXIncyBIZWFkaW5nCisgIDxoMz4KKyAgICAjZm9yZWFjaCAoJGxhYmVsIGluICRsYWJlbHMpCisgICAgICAjIyBLZWVwIHRoZSBmb2xsb3dpbmcgbGluZSB0b2dldGhlciB0byBwcmV2ZW50CisgICAgICAjIyBhIHNwYWNlIGFwcGVhcmluZyBiZWZvcmUgZWFjaCBjb21tYQorICAgICAgJGxhYmVsI2lmKCAkZm9yZWFjaC5oYXNOZXh0ICksI2VuZAorICAgICNlbmQKKyAgPC9oMz4KKworICAjIyBUaGlzIENsdXN0ZXIncyBEb2N1bWVudHMKKyAgPG9sPgorICAgICMjIEZvciBlYWNoIGRvYyBpbiB0aGlzIGNsdXN0ZXIKKyAgICAjZm9yZWFjaCAoJGNsdURvYyBpbiAkZG9jcykKKyAgICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI3VybF9mb3JfaG9tZT9xPWlkOiRjbHVEb2MiPgorICAgICAgICAgICRjbHVEb2M8L2E+CisgICAgICA8L2xpPgorICAgICNlbmQKKyAgPC9vbD4KKworI2VuZCAgICMjIGVuZCBmb3IgZWFjaCBDbHVzdGVyCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9kZWJ1Zy52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2RlYnVnLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmQyMzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9kZWJ1Zy52bQpAQCAtMCwwICsxLDI4IEBACisjKioKKyAqICBTaG93IERlYnVnZ2luZyBJbmZvcm1hdGlvbiwgaWYgZW5hYmxlZAorICojCisKKyNpZiggJHBhcmFtcy5nZXRCb29sKCJkZWJ1Z1F1ZXJ5IixmYWxzZSkgKQorICA8YSBocmVmPSIjIiBvbmNsaWNrPSdqUXVlcnkodGhpcykuc2libGluZ3MoInByZSIpLnRvZ2dsZSgpOyByZXR1cm4gZmFsc2U7Jz4KKyAgICB0b2dnbGUgZXhwbGFpbjwvYT4KKworICA8cHJlIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICAgICRyZXNwb25zZS5nZXRFeHBsYWluTWFwKCkuZ2V0KCRkb2MuZ2V0Rmlyc3RWYWx1ZSgnaWQnKSkKKyAgPC9wcmU+CisKKyAgPGEgaHJlZj0iIyIgb25jbGljaz0nalF1ZXJ5KHRoaXMpLnNpYmxpbmdzKCJwcmUyIikudG9nZ2xlKCk7IHJldHVybiBmYWxzZTsnPgorICAgIHRvZ2dsZSBhbGwgZmllbGRzPC9hPgorCisgIDxwcmUyIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICAgICNmb3JlYWNoKCRmaWVsZG5hbWUgaW4gJGRvYy5maWVsZE5hbWVzKQorICAgICAgPGJyPgorICAgICAgICA8c3BhbiBjbGFzcz0iZmllbGQtbmFtZSI+JGZpZWxkbmFtZSA6PC9zcGFuPgorICAgICAgICA8c3Bhbj4KKyAgICAgICAgICAjZm9yZWFjaCgkdmFsdWUgaW4gJGRvYy5nZXRGaWVsZFZhbHVlcygkZmllbGRuYW1lKSkKKyAgICAgICAgICAgICRlc2MuaHRtbCgkdmFsdWUpCisgICAgICAgICAgI2VuZAorICAgICAgICA8L3NwYW4+CisgICAgICA8L2JyPgorICAgICNlbmQKKyAgPC9wcmUyPgorI2VuZApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZGlkX3lvdV9tZWFuLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZGlkX3lvdV9tZWFuLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmFhYTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9kaWRfeW91X21lYW4udm0KQEAgLTAsMCArMSw5IEBACisjKioKKyAqICBIeXBlcmxpbmtlZCBzcGVsbGluZyBzdWdnZXN0aW9ucyBpbiByZXN1bHRzIGxpc3QKKyAqIworCisjc2V0KCRkeW0gPSAkcmVzcG9uc2UucmVzcG9uc2Uuc3BlbGxjaGVjay5zdWdnZXN0aW9ucy5jb2xsYXRpb24uY29sbGF0aW9uUXVlcnkpCisjaWYoJGR5bSkKKyAgRGlkIHlvdSBtZWFuCisgIDxhIGhyZWY9IiN7dXJsX2Zvcl9ob21lfSN7bGVuc05vUX0mcT0kZXNjLnVybCgkZHltKSI+JGVzYy5odG1sKCRkeW0pPC9hPj8KKyNlbmQKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2Vycm9yLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZXJyb3Iudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiNTgxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2Vycm9yLnZtCkBAIC0wLDAgKzEsMTEgQEAKKyMqKgorICogIFNob3cgRXJyb3IgTWVzc2FnZSwgaWYgYW55CisgKiMKKworIyMgU2hvdyBFcnJvciBNZXNzYWdlLCBpZiBhbnkKKyMjIFVzdWFsbHkgcmVuZGVyZWQgaW5zaWRlIGRpdiBjbGFzcz1lcnJvcgorCisjaWYoICRyZXNwb25zZS5yZXNwb25zZS5lcnJvci5jb2RlICkKKyAgPGgxPkVSUk9SICRyZXNwb25zZS5yZXNwb25zZS5lcnJvci5jb2RlPC9oMT4KKyAgJHJlc3BvbnNlLnJlc3BvbnNlLmVycm9yLm1zZworI2VuZApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZmFjZXRfZmllbGRzLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZmFjZXRfZmllbGRzLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGI2NTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mYWNldF9maWVsZHMudm0KQEAgLTAsMCArMSwyMyBAQAorIyoqCisgKiAgRGlzcGxheSBmYWNldHMgYmFzZWQgb24gZmllbGQgdmFsdWVzCisgKiAgZS5nLjogZmllbGRzIHNwZWNpZmllZCBieSAmZmFjZXQuZmllbGQ9CisgKiMKKworI2lmKCRyZXNwb25zZS5mYWNldEZpZWxkcykKKyAgPGgyICNhbm5UaXRsZSgiRmFjZXRzIGdlbmVyYXRlZCBieSBhZGRpbmcgJmZhY2V0LmZpZWxkPSB0byB0aGUgcmVxdWVzdCIpPgorICAgIEZpZWxkIEZhY2V0cworICA8L2gyPgorICAjZm9yZWFjaCgkZmllbGQgaW4gJHJlc3BvbnNlLmZhY2V0RmllbGRzKQorICAgICMjIEhpZGUgZmFjZXRzIHdpdGhvdXQgdmFsdWUKKyAgICAjaWYoJGZpZWxkLnZhbHVlcy5zaXplKCkgPiAwKQorICAgICAgPHNwYW4gY2xhc3M9ImZhY2V0LWZpZWxkIj4kZmllbGQubmFtZTwvc3Bhbj4KKyAgICAgIDx1bD4KKyAgICAgICAgI2ZvcmVhY2goJGZhY2V0IGluICRmaWVsZC52YWx1ZXMpCisgICAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI3VybF9mb3JfZmFjZXRfZmlsdGVyKCRmaWVsZC5uYW1lLCAkZmFjZXQubmFtZSkiPiRmYWNldC5uYW1lPC9hPiAoJGZhY2V0LmNvdW50KQorICAgICAgICAgIDwvbGk+CisgICAgICAgICNlbmQKKyAgICAgIDwvdWw+CisgICAgI2VuZCAgIyMgZW5kIGlmID4gMAorICAjZW5kICAgICMjIGVuZCBmb3IgZWFjaCBmYWNldCBmaWVsZAorI2VuZCAgICAgICMjIGVuZCBpZiByZXNwb25zZSBoYXMgZmFjZXQgZmllbGRzCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mYWNldF9waXZvdC52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2ZhY2V0X3Bpdm90LnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTUwZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mYWNldF9waXZvdC52bQpAQCAtMCwwICsxLDEyIEBACisjKioKKyAqICBEaXNwbGF5IFBpdm90LUJhc2VkIEZhY2V0cworICogIGUuZy46IGZhY2V0cyBzcGVjaWZpZWQgYnkgJmZhY2V0LnBpdm90PQorICojCisKKzxoMiAjYW5uVGl0bGUoIkZhY2V0cyBnZW5lcmF0ZWQgYnkgYWRkaW5nICZmYWNldC5waXZvdD0gdG8gdGhlIHJlcXVlc3QiKT4KKyAgUGl2b3QgRmFjZXRzCis8L2gyPgorCisjc2V0KCRwaXZvdCA9ICRyZXNwb25zZS5yZXNwb25zZS5mYWNldF9jb3VudHMuZmFjZXRfcGl2b3QpCisKKyNkaXNwbGF5X2ZhY2V0X3Bpdm90KCRwaXZvdCwgIiIpCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mYWNldF9xdWVyaWVzLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZmFjZXRfcXVlcmllcy52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQ4OWM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZmFjZXRfcXVlcmllcy52bQpAQCAtMCwwICsxLDEyIEBACisjKioKKyAqICBEaXNwbGF5IGZhY2V0cyBiYXNlZCBvbiBzcGVjaWZpYyBmYWNldCBxdWVyaWVzCisgKiAgZS5nLjogZmFjZXRzIHNwZWNpZmllZCBieSAmZmFjZXQucXVlcnk9CisgKiMKKworI3NldCgkZmllbGQgPSAkcmVzcG9uc2UucmVzcG9uc2UuZmFjZXRfY291bnRzLmZhY2V0X3F1ZXJpZXMpCisKKzxoMiAjYW5uVGl0bGUoIkZhY2V0cyBnZW5lcmF0ZWQgYnkgYWRkaW5nICZmYWNldC5xdWVyeT0gdG8gdGhlIHJlcXVlc3QiKT4KKyAgUXVlcnkgRmFjZXRzCis8L2gyPgorCisjZGlzcGxheV9mYWNldF9xdWVyeSgkZmllbGQsICIiLCAiIikKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2ZhY2V0X3Jhbmdlcy52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2ZhY2V0X3Jhbmdlcy52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjEwODRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZmFjZXRfcmFuZ2VzLnZtCkBAIC0wLDAgKzEsMjMgQEAKKyMqKgorICogIERpc3BsYXkgZmFjZXRzIGJhc2VkIG9uIHJhbmdlcyBvZiB2YWx1ZXMsIEFLQSAiQnVrZXRzIgorICogIGUuZy46IHJhbmdlcyBzcGVjaWZpZWQgYnkgJmZhY2V0LnJhbmdlPQorICojCisKKzxoMiAjYW5uVGl0bGUoIkZhY2V0cyBnZW5lcmF0ZWQgYnkgYWRkaW5nICZmYWNldC5yYW5nZT0gdG8gdGhlIHJlcXVlc3QiKT4KKyAgUmFuZ2UgRmFjZXRzCis8L2gyPgorCisjZm9yZWFjaCAoJGZpZWxkIGluICRyZXNwb25zZS5yZXNwb25zZS5mYWNldF9jb3VudHMuZmFjZXRfcmFuZ2VzKQorICAjIyBIaWRlIGZhY2V0cyB3aXRob3V0IHZhbHVlCisgICNpZigkZmllbGQudmFsdWUuY291bnRzLnNpemUoKSA+IDApCisJI3NldCgkbmFtZSA9ICRmaWVsZC5rZXkpCisJI3NldCgkZGlzcGxheSA9ICRuYW1lKQorCSNzZXQoJGYgPSAkZmllbGQudmFsdWUuY291bnRzKQorCSNzZXQoJHN0YXJ0ID0gJGZpZWxkLnZhbHVlLnN0YXJ0KQorCSNzZXQoJGVuZCA9ICRmaWVsZC52YWx1ZS5lbmQpCisJI3NldCgkZ2FwID0gJGZpZWxkLnZhbHVlLmdhcCkKKwkjc2V0KCRiZWZvcmUgPSAkZmllbGQudmFsdWUuYmVmb3JlKQorCSNzZXQoJGFmdGVyID0gJGZpZWxkLnZhbHVlLmFmdGVyKQorCSNkaXNwbGF5X2ZhY2V0X3JhbmdlKCRmLCAkZGlzcGxheSwgJG5hbWUsICRzdGFydCwgJGVuZCwgJGdhcCwgJGJlZm9yZSwgJGFmdGVyKQorICAjZW5kICAjIyBlbmQgaWYgaGFzIGFueSB2YWx1ZXMKKyNlbmQgICAgIyMgZW5kIGZvciBlYWNoIGZhY2V0IHJhbmdlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mYWNldHMudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mYWNldHMudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkNDBjOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2ZhY2V0cy52bQpAQCAtMCwwICsxLDEwIEBACisjKioKKyAqICBPdmVyYWxsIEZhY2V0IGRpc3BsYXkgYmxvY2sKKyAqICBJbnZva2VzIHRoZSA0IGZhY2V0IGFuZCAxIGNsdXN0ZXIgdGVtcGxhdGUKKyAqIworCisjcGFyc2UoJ2ZhY2V0X2ZpZWxkcy52bScpCisjcGFyc2UoJ2ZhY2V0X3F1ZXJpZXMudm0nKQorI3BhcnNlKCdmYWNldF9yYW5nZXMudm0nKQorI3BhcnNlKCdmYWNldF9waXZvdC52bScpCisjcGFyc2UoJ2NsdXN0ZXIudm0nKQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZm9vdGVyLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvZm9vdGVyLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDRjMzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9mb290ZXIudm0KQEAgLTAsMCArMSw0MyBAQAorIyoqCisgKiAgUmVuZGVyIHRoZSBib3R0b20gc2VjdGlvbiBvZiB0aGUgcGFnZSB2aXNpYmxlIHRvIHVzZXJzCisgKiMKKworPGhyLz4KKzxkaXY+CisgIDxzcGFuPk9wdGlvbnM6PC9zcGFuPgorCisgICNpZigkcmVxdWVzdC5wYXJhbXMuZ2V0KCdkZWJ1Z1F1ZXJ5JykpCisgICAgPGEgaHJlZj0iI3VybF9mb3JfaG9tZT8jcSNpZigkbGlzdC5zaXplKCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2ZxJykpID4gMCkmI2ZxcygkcmVxdWVzdC5wYXJhbXMuZ2V0UGFyYW1zKCdmcScpKSNlbmQiPgorICAgICAgZGlzYWJsZSBkZWJ1ZzwvYT4KKyAgI2Vsc2UKKyAgICA8YSBocmVmPSIjdXJsX2Zvcl9sZW5zJmRlYnVnUXVlcnk9dHJ1ZSZmbD0qLHNjb3JlIj4KKyAgICAgIGVuYWJsZSBkZWJ1ZzwvYT4KKyAgI2VuZAorICAtCisgICNpZigkYW5ub3RhdGUpCisgICAgPGEgaHJlZj0iI3VybF9mb3JfaG9tZT8jcSNpZigkbGlzdC5zaXplKCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2ZxJykpID4gMCkmI2ZxcygkcmVxdWVzdC5wYXJhbXMuZ2V0UGFyYW1zKCdmcScpKSNlbmQjYm9vc3RQcmljZSI+CisgICAgICBkaXNhYmxlIGFubm90YXRpb248L2E+CisgICNlbHNlCisgICAgPGEgaHJlZj0iI3VybF9mb3JfbGVucyZhbm5vdGF0ZUJyb3dzZT10cnVlIj4KKyAgICAgIGVuYWJsZSBhbm5vdGF0aW9uPC9hPgorICAjZW5kCisgIC0KKyAgPGEgI2FublRpdGxlKCJDbGljayB0byBzd2l0Y2ggdG8gYW4gWE1MIHJlc3BvbnNlOiAmd3Q9eG1sIikgaHJlZj0iI3VybF9mb3JfbGVucyZ3dD14bWwjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgnZGVidWdRdWVyeScpKSZkZWJ1Z1F1ZXJ5PXRydWUjZW5kIj4KKyAgICBYTUwgcmVzdWx0czwvYT4KKworPC9kaXY+CisKKzxkaXY+CisgIEdlbmVyYXRlZCBieSA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvVmVsb2NpdHlSZXNwb25zZVdyaXRlciI+VmVsb2NpdHlSZXNwb25zZVdyaXRlcjwvYT4KKzwvZGl2PgorPGRpdj4KKyAgPHNwYW4+RG9jdW1lbnRhdGlvbjogPC9zcGFuPgorICA8YSBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmcvc29sciI+U29sciBIb21lIFBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIiPgorICAgIFNvbHIgV2lraTwvYT4KKyAgPC9kaXY+Cis8ZGl2PgorICBEaXNjbGFpbWVyOgorICBUaGUgbG9jYXRpb25zIGRpc3BsYXllZCBpbiB0aGlzIGRlbW9uc3RyYXRpb24gYXJlIHB1cmVseSBmaWN0aW9uYWwuCisgIEl0IGlzIG1vcmUgdGhhbiBsaWtlbHkgdGhhdCBubyBzdG9yZSB3aXRoIHRoZSBpdGVtcyBsaXN0ZWQgYWN0dWFsbHkKKyAgZXhpc3RzIGF0IHRoYXQgbG9jYXRpb24hCis8L2Rpdj4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2hlYWQudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oZWFkLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjZlZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oZWFkLnZtCkBAIC0wLDAgKzEsMzUgQEAKKyMqKgorICogIFByb3ZpZGUgZWxlbWVudHMgZm9yIHRoZSA8aGVhZD4gc2VjdGlvbiBvZiB0aGUgSFRNTCBkb2N1bWVudAorICojCisKKyAgIyMgQW4gZXhhbXBsZSBvZiB1c2luZyBhbiBhcmJpdHJhcnkgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgPHRpdGxlPiNwYXJhbSgndGl0bGUnKTwvdGl0bGU+CisgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+CisKKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iI3t1cmxfcm9vdH0vanMvbGliL2pxdWVyeS0xLjcuMi5taW4uanMiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIje3VybF9mb3Jfc29scn0vYWRtaW4vZmlsZT9maWxlPS92ZWxvY2l0eS9tYWluLmNzcyZjb250ZW50VHlwZT10ZXh0L2NzcyIvPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IiN7dXJsX2Zvcl9zb2xyfS9hZG1pbi9maWxlP2ZpbGU9L3ZlbG9jaXR5L2pxdWVyeS5hdXRvY29tcGxldGUuY3NzJmNvbnRlbnRUeXBlPXRleHQvY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iI3t1cmxfZm9yX3NvbHJ9L2FkbWluL2ZpbGU/ZmlsZT0vdmVsb2NpdHkvanF1ZXJ5LmF1dG9jb21wbGV0ZS5qcyZjb250ZW50VHlwZT10ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorCisKKyAgICA8c2NyaXB0PgorICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CisgICAgICAkKCJcI3EiKS5hdXRvY29tcGxldGUoJyN7dXJsX2Zvcl9zb2xyfS90ZXJtcycsIHsgICMjIGJhY2tzbGFzaCBlc2NhcGVkICNxIGFzIHRoYXQgaXMgYSBtYWNybyBkZWZpbmVkIGluIFZNX2dsb2JhbF9saWJyYXJ5LnZtCisgICAgICAgICAgIGV4dHJhUGFyYW1zOnsKKyAgICAgICAgICAgICAndGVybXMucHJlZml4JzogZnVuY3Rpb24oKSB7IHJldHVybiAkKCJcI3EiKS52YWwoKTt9LAorICAgICAgICAgICAgICd0ZXJtcy5zb3J0JzogJ2NvdW50JywKKyAgICAgICAgICAgICAndGVybXMuZmwnOiAnbmFtZScsCisgICAgICAgICAgICAgJ3d0JzogJ3ZlbG9jaXR5JywKKyAgICAgICAgICAgICAndi50ZW1wbGF0ZSc6ICdzdWdnZXN0JworICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICApLmtleWRvd24oZnVuY3Rpb24oZSl7CisgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKXsKKyAgICAgICAgICAkKCIjcXVlcnktZm9ybSIpLnRyaWdnZXIoJ3N1Ym1pdCcpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvY29sbGVjdGlvbjEvdGVybXM/dGVybXMuZmw9bmFtZSZ0ZXJtcy5wcmVmaXg9aSZ0ZXJtcy5zb3J0PWNvdW50Jnd0PXZlbG9jaXR5JnYudGVtcGxhdGU9c3VnZ2VzdAorICAgIH0pOworCisgICAgPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oZWFkZXIudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oZWFkZXIudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NjA0NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2hlYWRlci52bQpAQCAtMCwwICsxLDcgQEAKKyMqKgorICogIFJlbmRlciB0aGUgdG9wIHNlY3Rpb24gb2YgdGhlIHBhZ2UgdmlzaWJsZSB0byB1c2VycworICojCisKKzxkaXYgaWQ9ImhlYWQiPgorICA8c3BhbiA+PGEgaHJlZj0iI3VybF9mb3JfaG9tZSNpZigkcmVxdWVzdC5wYXJhbXMuZ2V0KCdkZWJ1Z1F1ZXJ5JykpP2RlYnVnUXVlcnk9dHJ1ZSNlbmQiPjxpbWcgc3JjPSIje3VybF9yb290fS9pbWcvc29sci5wbmciIGlkPSJsb2dvIi8+PC9hPjwvc3Bhbj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvaGl0LnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvaGl0LnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YzExZjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oaXQudm0KQEAgLTAsMCArMSwyNSBAQAorIyoqCisgKiAgQ2FsbGVkIGZvciBlYWNoIG1hdGNoaW5nIGRvY3VtZW50IGJ1dCB0aGVuCisgKiAgY2FsbHMgb25lIG9mIHByb2R1Y3RfZG9jLCBqb2luX2RvYyBvciByaWNodGV4dF9kb2MKKyAqICBkZXBlbmRpbmcgb24gd2hpY2ggZmllbGRzIHRoZSBkb2MgaGFzCisgKiMKKworI3NldCgkZG9jSWQgPSAkZG9jLmdldEZpZWxkVmFsdWUoJ2lkJykpCisKKzxkaXYgY2xhc3M9InJlc3VsdC1kb2N1bWVudCI+CisKKyAgIyMgSGFzIGEgIm5hbWUiIGZpZWxkID8KKyAgI2lmKCRkb2MuZ2V0RmllbGRWYWx1ZSgnbmFtZScpKQorICAgICNwYXJzZSgicHJvZHVjdF9kb2Mudm0iKQorCisgICMjIEhhcyBhICJjb21wTmFtZV9zIiBmaWVsZCA/CisgICNlbHNlaWYoJGRvYy5nZXRGaWVsZFZhbHVlKCdjb21wTmFtZV9zJykpCisgICAgI3BhcnNlKCJqb2luX2RvYy52bSIpCisKKyAgIyMgRmFsbGJhY2sgdG8gcmljaHRleHRfZG9jCisgICNlbHNlCisgICAgI3BhcnNlKCJyaWNodGV4dF9kb2Mudm0iKQorCisgICNlbmQKKworPC9kaXY+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oaXRfZ3JvdXBlZC52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2hpdF9ncm91cGVkLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTdmMWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oaXRfZ3JvdXBlZC52bQpAQCAtMCwwICsxLDQzIEBACisjKioKKyAqICBEaXNwbGF5IGdyb3VwZWQgcmVzdWx0cworICojCisKKzxkaXYgY2xhc3M9InJlc3VsdC1kb2N1bWVudCI+CisKKyAgPGRpdiBjbGFzcz0icmVzdWx0LXRpdGxlIj4KKyAgICA8Yj4kZ3JvdXBpbmcua2V5PC9iPgorICA8L2Rpdj4KKworICA8ZGl2PgorICAgIFRvdGFsIE1hdGNoZXMgaW4gR3JvdXA6ICRncm91cGluZy52YWx1ZS5tYXRjaGVzCisgIDwvZGl2PgorCisgIDxkaXY+ICAjIyBsaXN0IG9mIGdyb3VwcworCisgICAgI2ZvcmVhY2ggKCRncm91cCBpbiAkZ3JvdXBpbmcudmFsdWUuZ3JvdXBzKQorICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtdmFsdWUiPgorICAgICAgICAjaWYoJGdyb3VwLmdyb3VwVmFsdWUpJGdyb3VwLmdyb3VwVmFsdWUje2Vsc2V9PGk+Tm8gZ3JvdXA8L2k+I2VuZAorICAgICAgICA8c3BhbiAjYW5uVGl0bGUoIlRoZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBpbiB0aGlzIGdyb3VwIik+CisgICAgICAgICAgKCRncm91cC5kb2NsaXN0Lm51bUZvdW5kKQorICAgICAgICA8L3NwYW4+CisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtZG9jbGlzdCIKKyAgICAgICAgI2FublRpdGxlKCJDb250YWlucyB0aGUgdG9wIHNjb3JpbmcgZG9jdW1lbnRzIGluIHRoZSBncm91cCIpCisgICAgICA+CisgICAgICAgICNmb3JlYWNoICgkZG9jIGluICRncm91cC5kb2NsaXN0KQorICAgICAgICAgICNzZXQoJGRvY0lkID0gJGRvYy5nZXRGaWVsZFZhbHVlKCdpZCcpKQorICAgICAgICAgICNpZigkZG9jLmdldEZpZWxkVmFsdWUoJ25hbWUnKSkKKyAgICAgICAgICAgICNwYXJzZSgicHJvZHVjdF9kb2Mudm0iKQorICAgICAgICAgICNlbHNlaWYoJGRvYy5nZXRGaWVsZFZhbHVlKCdjb21wTmFtZV9zJykpCisgICAgICAgICAgICAjcGFyc2UoImpvaW5fZG9jLnZtIikKKyAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgI3BhcnNlKCJyaWNodGV4dF9kb2Mudm0iKQorICAgICAgICAgICNlbmQKKyAgICAgICAgI2VuZAorICAgICAgPC9kaXY+CisKKyAgICAjZW5kICAjIyBlbmQgb2YgZm9yZWFjaCBncm91cCBpbiBncm91cGluZy52YWx1ZS5ncm91cHMKKyAgPC9kaXY+ICAjIyBkaXYgdGFnIGZvciBlbnRpcmUgbGlzdCBvZiBncm91cHMKKworPC9kaXY+ICAjIyBlbmQgb2YgZGl2IGNsYXNzPXJlc3VsdC1kb2N1bWVudApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvaGl0X3BsYWluLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvaGl0X3BsYWluLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MzQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9oaXRfcGxhaW4udm0KQEAgLTAsMCArMSwyNSBAQAorIyoqCisgKiAgQW4gZXh0cmVtZWx5IHBsYWluIC8gZGVidWcgdmVyc2lvbiBvZiBoaXQudm0KKyAqIworCis8dGFibGU+CisgICMjIEZvciBlYWNoIGZpZWxkCisgICNmb3JlYWNoKCAkZmllbGROYW1lIGluICRkb2MuZmllbGROYW1lcyApCisgICAgIyMgRm9yIGVhY2ggdmFsdWUKKyAgICAjZm9yZWFjaCggJHZhbHVlIGluICRkb2MuZ2V0RmllbGRWYWx1ZXMoJGZpZWxkTmFtZSkgKQorICAgICAgPHRyPgorICAgICAgICAjIyBGaWVsZCBOYW1lCisgICAgICAgIDx0aCBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAjaWYoICRmb3JlYWNoLmNvdW50ID09IDEgKQorICAgICAgICAgICAgJGZpZWxkTmFtZToKKyAgICAgICAgICAjZW5kCisgICAgICAgIDwvdGg+CisgICAgICAgICMjIEZpZWxkIFZhbHVlKHMpCisgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICRlc2MuaHRtbCgkdmFsdWUpIDxici8+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICNlbmQgICAgICMjIGVuZCBmb3IgZWFjaCB2YWx1ZQorICAjZW5kICAgICAgICMjIGVuZCBmb3IgZWFjaCBmaWVsZAorPC90YWJsZT4KKzxoci8+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9qb2luX2RvYy52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2pvaW5fZG9jLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTYwMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9qb2luX2RvYy52bQpAQCAtMCwwICsxLDIwIEBACisjKioKKyAqICBEaXNwbGF5IGRvY3VtZW50cyB0aGF0IGFyZSBqb2luZWQgdG8gb3RoZXIgZG9jdW1lbnRzCisgKiMKKworPGRpdiBjbGFzcz0icmVzdWx0LXRpdGxlIj4KKyAgPGI+I2ZpZWxkKCdjb21wTmFtZV9zJyk8L2I+Cis8L2Rpdj4KKworPGRpdj4KKyAgSWQ6ICNmaWVsZCgnaWQnKQorICAoY29tcGFueS1kZXRhaWxzIGRvY3VtZW50IGZvcgorICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Kb2luIiB0YXJnZXQ9Il9uZXciPmpvaW48L2E+CisgICkKKzwvZGl2PgorCis8ZGl2PgorICBBZGRyZXNzOiAjZmllbGQoJ2FkZHJlc3NfcycpCis8L2Rpdj4KKworI3BhcnNlKCdkZWJ1Zy52bScpCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmNzcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2pxdWVyeS5hdXRvY29tcGxldGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjYyMjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmNzcwpAQCAtMCwwICsxLDQ4IEBACisuYWNfcmVzdWx0cyB7CisJcGFkZGluZzogMHB4OworCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworCW92ZXJmbG93OiBoaWRkZW47CisJei1pbmRleDogOTk5OTk7Cit9CisKKy5hY19yZXN1bHRzIHVsIHsKKwl3aWR0aDogMTAwJTsKKwlsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOworCWxpc3Qtc3R5bGU6IG5vbmU7CisJcGFkZGluZzogMDsKKwltYXJnaW46IDA7Cit9CisKKy5hY19yZXN1bHRzIGxpIHsKKwltYXJnaW46IDBweDsKKwlwYWRkaW5nOiAycHggNXB4OworCWN1cnNvcjogZGVmYXVsdDsKKwlkaXNwbGF5OiBibG9jazsKKwkvKiAKKwlpZiB3aWR0aCB3aWxsIGJlIDEwMCUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgd2lsbCBhcGVhciAKKwl3aGVuIHNjcm9sbCBtb2RlIHdpbGwgYmUgdXNlZAorCSovCisJLyp3aWR0aDogMTAwJTsqLworCWZvbnQ6IG1lbnU7CisJZm9udC1zaXplOiAxMnB4OworCS8qIAorCWl0IGlzIHZlcnkgaW1wb3J0YW50LCBpZiBsaW5lLWhlaWdodCBub3Qgc2V0dGVkIG9yIHNldHRlZCAKKwlpbiByZWxhdGl2ZSB1bml0cyBzY3JvbGwgd2lsbCBiZSBicm9rZW4gaW4gZmlyZWZveAorCSovCisJbGluZS1oZWlnaHQ6IDE2cHg7CisJb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworLmFjX2xvYWRpbmcgeworCWJhY2tncm91bmQ6IHdoaXRlIHVybCgnaW5kaWNhdG9yLmdpZicpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7Cit9CisKKy5hY19vZGQgeworCWJhY2tncm91bmQtY29sb3I6ICNlZWU7Cit9CisKKy5hY19vdmVyIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjMEEyNDZBOworCWNvbG9yOiB3aGl0ZTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2pxdWVyeS5hdXRvY29tcGxldGUuanMgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmpzCkBAIC0wLDAgKzEsNzYzIEBACisvKgorICogQXV0b2NvbXBsZXRlIC0galF1ZXJ5IHBsdWdpbiAxLjFwcmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRHlsYW4gVmVyaGV1bCwgRGFuIEcuIFN3aXR6ZXIsIEFuamVzaCBUdWxhZGhhciwgSsO2cm4gWmFlZmZlcmVyCisgKgorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6CisgKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCisgKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAorICoKKyAqIFJldmlzaW9uOiAkSWQ6IGpxdWVyeS5hdXRvY29tcGxldGUuanMgNTc4NSAyMDA4LTA3LTEyIDEwOjM3OjMzWiBqb2Vybi56YWVmZmVyZXIgJAorICoKKyAqLworCis7KGZ1bmN0aW9uKCQpIHsKKwkKKyQuZm4uZXh0ZW5kKHsKKwlhdXRvY29tcGxldGU6IGZ1bmN0aW9uKHVybE9yRGF0YSwgb3B0aW9ucykgeworCQl2YXIgaXNVcmwgPSB0eXBlb2YgdXJsT3JEYXRhID09ICJzdHJpbmciOworCQlvcHRpb25zID0gJC5leHRlbmQoe30sICQuQXV0b2NvbXBsZXRlci5kZWZhdWx0cywgeworCQkJdXJsOiBpc1VybCA/IHVybE9yRGF0YSA6IG51bGwsCisJCQlkYXRhOiBpc1VybCA/IG51bGwgOiB1cmxPckRhdGEsCisJCQlkZWxheTogaXNVcmwgPyAkLkF1dG9jb21wbGV0ZXIuZGVmYXVsdHMuZGVsYXkgOiAxMCwKKwkJCW1heDogb3B0aW9ucyAmJiAhb3B0aW9ucy5zY3JvbGwgPyAxMCA6IDE1MAorCQl9LCBvcHRpb25zKTsKKwkJCisJCS8vIGlmIGhpZ2hsaWdodCBpcyBzZXQgdG8gZmFsc2UsIHJlcGxhY2UgaXQgd2l0aCBhIGRvLW5vdGhpbmcgZnVuY3Rpb24KKwkJb3B0aW9ucy5oaWdobGlnaHQgPSBvcHRpb25zLmhpZ2hsaWdodCB8fCBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07CisJCQorCQkvLyBpZiB0aGUgZm9ybWF0TWF0Y2ggb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdXNlIGZvcm1hdEl0ZW0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCW9wdGlvbnMuZm9ybWF0TWF0Y2ggPSBvcHRpb25zLmZvcm1hdE1hdGNoIHx8IG9wdGlvbnMuZm9ybWF0SXRlbTsKKwkJCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQluZXcgJC5BdXRvY29tcGxldGVyKHRoaXMsIG9wdGlvbnMpOworCQl9KTsKKwl9LAorCXJlc3VsdDogZnVuY3Rpb24oaGFuZGxlcikgeworCQlyZXR1cm4gdGhpcy5iaW5kKCJyZXN1bHQiLCBoYW5kbGVyKTsKKwl9LAorCXNlYXJjaDogZnVuY3Rpb24oaGFuZGxlcikgeworCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZWFyY2giLCBbaGFuZGxlcl0pOworCX0sCisJZmx1c2hDYWNoZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnRyaWdnZXIoImZsdXNoQ2FjaGUiKTsKKwl9LAorCXNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXRPcHRpb25zIiwgW29wdGlvbnNdKTsKKwl9LAorCXVuYXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMudHJpZ2dlcigidW5hdXRvY29tcGxldGUiKTsKKwl9Cit9KTsKKworJC5BdXRvY29tcGxldGVyID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHsKKworCXZhciBLRVkgPSB7CisJCVVQOiAzOCwKKwkJRE9XTjogNDAsCisJCURFTDogNDYsCisJCVRBQjogOSwKKwkJUkVUVVJOOiAxMywKKwkJRVNDOiAyNywKKwkJQ09NTUE6IDE4OCwKKwkJUEFHRVVQOiAzMywKKwkJUEFHRURPV046IDM0LAorCQlCQUNLU1BBQ0U6IDgKKwl9OworCisJLy8gQ3JlYXRlICQgb2JqZWN0IGZvciBpbnB1dCBlbGVtZW50CisJdmFyICRpbnB1dCA9ICQoaW5wdXQpLmF0dHIoImF1dG9jb21wbGV0ZSIsICJvZmYiKS5hZGRDbGFzcyhvcHRpb25zLmlucHV0Q2xhc3MpOworCisJdmFyIHRpbWVvdXQ7CisJdmFyIHByZXZpb3VzVmFsdWUgPSAiIjsKKwl2YXIgY2FjaGUgPSAkLkF1dG9jb21wbGV0ZXIuQ2FjaGUob3B0aW9ucyk7CisJdmFyIGhhc0ZvY3VzID0gMDsKKwl2YXIgbGFzdEtleVByZXNzQ29kZTsKKwl2YXIgY29uZmlnID0geworCQltb3VzZURvd25PblNlbGVjdDogZmFsc2UKKwl9OworCXZhciBzZWxlY3QgPSAkLkF1dG9jb21wbGV0ZXIuU2VsZWN0KG9wdGlvbnMsIGlucHV0LCBzZWxlY3RDdXJyZW50LCBjb25maWcpOworCQorCXZhciBibG9ja1N1Ym1pdDsKKwkKKwkvLyBwcmV2ZW50IGZvcm0gc3VibWl0IGluIG9wZXJhIHdoZW4gc2VsZWN0aW5nIHdpdGggcmV0dXJuIGtleQorCSQuYnJvd3Nlci5vcGVyYSAmJiAkKGlucHV0LmZvcm0pLmJpbmQoInN1Ym1pdC5hdXRvY29tcGxldGUiLCBmdW5jdGlvbigpIHsKKwkJaWYgKGJsb2NrU3VibWl0KSB7CisJCQlibG9ja1N1Ym1pdCA9IGZhbHNlOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSk7CisJCisJLy8gb25seSBvcGVyYSBkb2Vzbid0IHRyaWdnZXIga2V5ZG93biBtdWx0aXBsZSB0aW1lcyB3aGlsZSBwcmVzc2VkLCBvdGhlcnMgZG9uJ3Qgd29yayB3aXRoIGtleXByZXNzIGF0IGFsbAorCSRpbnB1dC5iaW5kKCgkLmJyb3dzZXIub3BlcmEgPyAia2V5cHJlc3MiIDogImtleWRvd24iKSArICIuYXV0b2NvbXBsZXRlIiwgZnVuY3Rpb24oZXZlbnQpIHsKKwkJLy8gdHJhY2sgbGFzdCBrZXkgcHJlc3NlZAorCQlsYXN0S2V5UHJlc3NDb2RlID0gZXZlbnQua2V5Q29kZTsKKwkJc3dpdGNoKGV2ZW50LmtleUNvZGUpIHsKKwkJCisJCQljYXNlIEtFWS5VUDoKKwkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCWlmICggc2VsZWN0LnZpc2libGUoKSApIHsKKwkJCQkJc2VsZWN0LnByZXYoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlvbkNoYW5nZSgwLCB0cnVlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIEtFWS5ET1dOOgorCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJaWYgKCBzZWxlY3QudmlzaWJsZSgpICkgeworCQkJCQlzZWxlY3QubmV4dCgpOworCQkJCX0gZWxzZSB7CisJCQkJCW9uQ2hhbmdlKDAsIHRydWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgS0VZLlBBR0VVUDoKKwkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCWlmICggc2VsZWN0LnZpc2libGUoKSApIHsKKwkJCQkJc2VsZWN0LnBhZ2VVcCgpOworCQkJCX0gZWxzZSB7CisJCQkJCW9uQ2hhbmdlKDAsIHRydWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgS0VZLlBBR0VET1dOOgorCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJaWYgKCBzZWxlY3QudmlzaWJsZSgpICkgeworCQkJCQlzZWxlY3QucGFnZURvd24oKTsKKwkJCQl9IGVsc2UgeworCQkJCQlvbkNoYW5nZSgwLCB0cnVlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkKKwkJCS8vIG1hdGNoZXMgYWxzbyBzZW1pY29sb24KKwkJCWNhc2Ugb3B0aW9ucy5tdWx0aXBsZSAmJiAkLnRyaW0ob3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvcikgPT0gIiwiICYmIEtFWS5DT01NQToKKwkJCWNhc2UgS0VZLlRBQjoKKwkJCWNhc2UgS0VZLlJFVFVSTjoKKwkJCQlpZiggc2VsZWN0Q3VycmVudCgpICkgeworCQkJCQkvLyBzdG9wIGRlZmF1bHQgdG8gcHJldmVudCBhIGZvcm0gc3VibWl0LCBPcGVyYSBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCisJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJCWJsb2NrU3VibWl0ID0gdHJ1ZTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgS0VZLkVTQzoKKwkJCQlzZWxlY3QuaGlkZSgpOworCQkJCWJyZWFrOworCQkJCQorCQkJZGVmYXVsdDoKKwkJCQljbGVhclRpbWVvdXQodGltZW91dCk7CisJCQkJdGltZW91dCA9IHNldFRpbWVvdXQob25DaGFuZ2UsIG9wdGlvbnMuZGVsYXkpOworCQkJCWJyZWFrOworCQl9CisJfSkuZm9jdXMoZnVuY3Rpb24oKXsKKwkJLy8gdHJhY2sgd2hldGhlciB0aGUgZmllbGQgaGFzIGZvY3VzLCB3ZSBzaG91bGRuJ3QgcHJvY2VzcyBhbnkKKwkJLy8gcmVzdWx0cyBpZiB0aGUgZmllbGQgbm8gbG9uZ2VyIGhhcyBmb2N1cworCQloYXNGb2N1cysrOworCX0pLmJsdXIoZnVuY3Rpb24oKSB7CisJCWhhc0ZvY3VzID0gMDsKKwkJaWYgKCFjb25maWcubW91c2VEb3duT25TZWxlY3QpIHsKKwkJCWhpZGVSZXN1bHRzKCk7CisJCX0KKwl9KS5jbGljayhmdW5jdGlvbigpIHsKKwkJLy8gc2hvdyBzZWxlY3Qgd2hlbiBjbGlja2luZyBpbiBhIGZvY3VzZWQgZmllbGQKKwkJaWYgKCBoYXNGb2N1cysrID4gMSAmJiAhc2VsZWN0LnZpc2libGUoKSApIHsKKwkJCW9uQ2hhbmdlKDAsIHRydWUpOworCQl9CisJfSkuYmluZCgic2VhcmNoIiwgZnVuY3Rpb24oKSB7CisJCS8vIFRPRE8gd2h5IG5vdCBqdXN0IHNwZWNpZnlpbmcgYm90aCBhcmd1bWVudHM/CisJCXZhciBmbiA9IChhcmd1bWVudHMubGVuZ3RoID4gMSkgPyBhcmd1bWVudHNbMV0gOiBudWxsOworCQlmdW5jdGlvbiBmaW5kVmFsdWVDYWxsYmFjayhxLCBkYXRhKSB7CisJCQl2YXIgcmVzdWx0OworCQkJaWYoIGRhdGEgJiYgZGF0YS5sZW5ndGggKSB7CisJCQkJZm9yICh2YXIgaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJCQlpZiggZGF0YVtpXS5yZXN1bHQudG9Mb3dlckNhc2UoKSA9PSBxLnRvTG93ZXJDYXNlKCkgKSB7CisJCQkJCQlyZXN1bHQgPSBkYXRhW2ldOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiggdHlwZW9mIGZuID09ICJmdW5jdGlvbiIgKSBmbihyZXN1bHQpOworCQkJZWxzZSAkaW5wdXQudHJpZ2dlcigicmVzdWx0IiwgcmVzdWx0ICYmIFtyZXN1bHQuZGF0YSwgcmVzdWx0LnZhbHVlXSk7CisJCX0KKwkJJC5lYWNoKHRyaW1Xb3JkcygkaW5wdXQudmFsKCkpLCBmdW5jdGlvbihpLCB2YWx1ZSkgeworCQkJcmVxdWVzdCh2YWx1ZSwgZmluZFZhbHVlQ2FsbGJhY2ssIGZpbmRWYWx1ZUNhbGxiYWNrKTsKKwkJfSk7CisJfSkuYmluZCgiZmx1c2hDYWNoZSIsIGZ1bmN0aW9uKCkgeworCQljYWNoZS5mbHVzaCgpOworCX0pLmJpbmQoInNldE9wdGlvbnMiLCBmdW5jdGlvbigpIHsKKwkJJC5leHRlbmQob3B0aW9ucywgYXJndW1lbnRzWzFdKTsKKwkJLy8gaWYgd2UndmUgdXBkYXRlZCB0aGUgZGF0YSwgcmVwb3B1bGF0ZQorCQlpZiAoICJkYXRhIiBpbiBhcmd1bWVudHNbMV0gKQorCQkJY2FjaGUucG9wdWxhdGUoKTsKKwl9KS5iaW5kKCJ1bmF1dG9jb21wbGV0ZSIsIGZ1bmN0aW9uKCkgeworCQlzZWxlY3QudW5iaW5kKCk7CisJCSRpbnB1dC51bmJpbmQoKTsKKwkJJChpbnB1dC5mb3JtKS51bmJpbmQoIi5hdXRvY29tcGxldGUiKTsKKwl9KTsKKwkKKwkKKwlmdW5jdGlvbiBzZWxlY3RDdXJyZW50KCkgeworCQl2YXIgc2VsZWN0ZWQgPSBzZWxlY3Quc2VsZWN0ZWQoKTsKKwkJaWYoICFzZWxlY3RlZCApCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQl2YXIgdiA9IHNlbGVjdGVkLnJlc3VsdDsKKwkJcHJldmlvdXNWYWx1ZSA9IHY7CisJCQorCQlpZiAoIG9wdGlvbnMubXVsdGlwbGUgKSB7CisJCQl2YXIgd29yZHMgPSB0cmltV29yZHMoJGlucHV0LnZhbCgpKTsKKwkJCWlmICggd29yZHMubGVuZ3RoID4gMSApIHsKKwkJCQl2ID0gd29yZHMuc2xpY2UoMCwgd29yZHMubGVuZ3RoIC0gMSkuam9pbiggb3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvciApICsgb3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvciArIHY7CisJCQl9CisJCQl2ICs9IG9wdGlvbnMubXVsdGlwbGVTZXBhcmF0b3I7CisJCX0KKwkJCisJCSRpbnB1dC52YWwodik7CisJCWhpZGVSZXN1bHRzTm93KCk7CisJCSRpbnB1dC50cmlnZ2VyKCJyZXN1bHQiLCBbc2VsZWN0ZWQuZGF0YSwgc2VsZWN0ZWQudmFsdWVdKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCWZ1bmN0aW9uIG9uQ2hhbmdlKGNyYXAsIHNraXBQcmV2Q2hlY2spIHsKKwkJaWYoIGxhc3RLZXlQcmVzc0NvZGUgPT0gS0VZLkRFTCApIHsKKwkJCXNlbGVjdC5oaWRlKCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXZhciBjdXJyZW50VmFsdWUgPSAkaW5wdXQudmFsKCk7CisJCQorCQlpZiAoICFza2lwUHJldkNoZWNrICYmIGN1cnJlbnRWYWx1ZSA9PSBwcmV2aW91c1ZhbHVlICkKKwkJCXJldHVybjsKKwkJCisJCXByZXZpb3VzVmFsdWUgPSBjdXJyZW50VmFsdWU7CisJCQorCQljdXJyZW50VmFsdWUgPSBsYXN0V29yZChjdXJyZW50VmFsdWUpOworCQlpZiAoIGN1cnJlbnRWYWx1ZS5sZW5ndGggPj0gb3B0aW9ucy5taW5DaGFycykgeworCQkJJGlucHV0LmFkZENsYXNzKG9wdGlvbnMubG9hZGluZ0NsYXNzKTsKKwkJCWlmICghb3B0aW9ucy5tYXRjaENhc2UpCisJCQkJY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRvTG93ZXJDYXNlKCk7CisJCQlyZXF1ZXN0KGN1cnJlbnRWYWx1ZSwgcmVjZWl2ZURhdGEsIGhpZGVSZXN1bHRzTm93KTsKKwkJfSBlbHNlIHsKKwkJCXN0b3BMb2FkaW5nKCk7CisJCQlzZWxlY3QuaGlkZSgpOworCQl9CisJfTsKKwkKKwlmdW5jdGlvbiB0cmltV29yZHModmFsdWUpIHsKKwkJaWYgKCAhdmFsdWUgKSB7CisJCQlyZXR1cm4gWyIiXTsKKwkJfQorCQl2YXIgd29yZHMgPSB2YWx1ZS5zcGxpdCggb3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvciApOworCQl2YXIgcmVzdWx0ID0gW107CisJCSQuZWFjaCh3b3JkcywgZnVuY3Rpb24oaSwgdmFsdWUpIHsKKwkJCWlmICggJC50cmltKHZhbHVlKSApCisJCQkJcmVzdWx0W2ldID0gJC50cmltKHZhbHVlKTsKKwkJfSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCWZ1bmN0aW9uIGxhc3RXb3JkKHZhbHVlKSB7CisJCWlmICggIW9wdGlvbnMubXVsdGlwbGUgKQorCQkJcmV0dXJuIHZhbHVlOworCQl2YXIgd29yZHMgPSB0cmltV29yZHModmFsdWUpOworCQlyZXR1cm4gd29yZHNbd29yZHMubGVuZ3RoIC0gMV07CisJfQorCQorCS8vIGZpbGxzIGluIHRoZSBpbnB1dCBib3ggdy90aGUgZmlyc3QgbWF0Y2ggKGFzc3VtZWQgdG8gYmUgdGhlIGJlc3QgbWF0Y2gpCisJLy8gcTogdGhlIHRlcm0gZW50ZXJlZAorCS8vIHNWYWx1ZTogdGhlIGZpcnN0IG1hdGNoaW5nIHJlc3VsdAorCWZ1bmN0aW9uIGF1dG9GaWxsKHEsIHNWYWx1ZSl7CisJCS8vIGF1dG9maWxsIGluIHRoZSBjb21wbGV0ZSBib3ggdy90aGUgZmlyc3QgbWF0Y2ggYXMgbG9uZyBhcyB0aGUgdXNlciBoYXNuJ3QgZW50ZXJlZCBpbiBtb3JlIGRhdGEKKwkJLy8gaWYgdGhlIGxhc3QgdXNlciBrZXkgcHJlc3NlZCB3YXMgYmFja3NwYWNlLCBkb24ndCBhdXRvZmlsbAorCQlpZiggb3B0aW9ucy5hdXRvRmlsbCAmJiAobGFzdFdvcmQoJGlucHV0LnZhbCgpKS50b0xvd2VyQ2FzZSgpID09IHEudG9Mb3dlckNhc2UoKSkgJiYgbGFzdEtleVByZXNzQ29kZSAhPSBLRVkuQkFDS1NQQUNFICkgeworCQkJLy8gZmlsbCBpbiB0aGUgdmFsdWUgKGtlZXAgdGhlIGNhc2UgdGhlIHVzZXIgaGFzIHR5cGVkKQorCQkJJGlucHV0LnZhbCgkaW5wdXQudmFsKCkgKyBzVmFsdWUuc3Vic3RyaW5nKGxhc3RXb3JkKHByZXZpb3VzVmFsdWUpLmxlbmd0aCkpOworCQkJLy8gc2VsZWN0IHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBub3QgdHlwZWQgYnkgdGhlIHVzZXIgKHNvIHRoZSBuZXh0IGNoYXJhY3RlciB3aWxsIGVyYXNlKQorCQkJJC5BdXRvY29tcGxldGVyLlNlbGVjdGlvbihpbnB1dCwgcHJldmlvdXNWYWx1ZS5sZW5ndGgsIHByZXZpb3VzVmFsdWUubGVuZ3RoICsgc1ZhbHVlLmxlbmd0aCk7CisJCX0KKwl9OworCisJZnVuY3Rpb24gaGlkZVJlc3VsdHMoKSB7CisJCWNsZWFyVGltZW91dCh0aW1lb3V0KTsKKwkJdGltZW91dCA9IHNldFRpbWVvdXQoaGlkZVJlc3VsdHNOb3csIDIwMCk7CisJfTsKKworCWZ1bmN0aW9uIGhpZGVSZXN1bHRzTm93KCkgeworCQl2YXIgd2FzVmlzaWJsZSA9IHNlbGVjdC52aXNpYmxlKCk7CisJCXNlbGVjdC5oaWRlKCk7CisJCWNsZWFyVGltZW91dCh0aW1lb3V0KTsKKwkJc3RvcExvYWRpbmcoKTsKKwkJaWYgKG9wdGlvbnMubXVzdE1hdGNoKSB7CisJCQkvLyBjYWxsIHNlYXJjaCBhbmQgcnVuIGNhbGxiYWNrCisJCQkkaW5wdXQuc2VhcmNoKAorCQkJCWZ1bmN0aW9uIChyZXN1bHQpeworCQkJCQkvLyBpZiBubyB2YWx1ZSBmb3VuZCwgY2xlYXIgdGhlIGlucHV0IGJveAorCQkJCQlpZiggIXJlc3VsdCApIHsKKwkJCQkJCWlmIChvcHRpb25zLm11bHRpcGxlKSB7CisJCQkJCQkJdmFyIHdvcmRzID0gdHJpbVdvcmRzKCRpbnB1dC52YWwoKSkuc2xpY2UoMCwgLTEpOworCQkJCQkJCSRpbnB1dC52YWwoIHdvcmRzLmpvaW4ob3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvcikgKyAod29yZHMubGVuZ3RoID8gb3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvciA6ICIiKSApOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCSRpbnB1dC52YWwoICIiICk7CisJCQkJCX0KKwkJCQl9CisJCQkpOworCQl9CisJCWlmICh3YXNWaXNpYmxlKQorCQkJLy8gcG9zaXRpb24gY3Vyc29yIGF0IGVuZCBvZiBpbnB1dCBmaWVsZAorCQkJJC5BdXRvY29tcGxldGVyLlNlbGVjdGlvbihpbnB1dCwgaW5wdXQudmFsdWUubGVuZ3RoLCBpbnB1dC52YWx1ZS5sZW5ndGgpOworCX07CisKKwlmdW5jdGlvbiByZWNlaXZlRGF0YShxLCBkYXRhKSB7CisJCWlmICggZGF0YSAmJiBkYXRhLmxlbmd0aCAmJiBoYXNGb2N1cyApIHsKKwkJCXN0b3BMb2FkaW5nKCk7CisJCQlzZWxlY3QuZGlzcGxheShkYXRhLCBxKTsKKwkJCWF1dG9GaWxsKHEsIGRhdGFbMF0udmFsdWUpOworCQkJc2VsZWN0LnNob3coKTsKKwkJfSBlbHNlIHsKKwkJCWhpZGVSZXN1bHRzTm93KCk7CisJCX0KKwl9OworCisJZnVuY3Rpb24gcmVxdWVzdCh0ZXJtLCBzdWNjZXNzLCBmYWlsdXJlKSB7CisJCWlmICghb3B0aW9ucy5tYXRjaENhc2UpCisJCQl0ZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpOworCQl2YXIgZGF0YSA9IGNhY2hlLmxvYWQodGVybSk7CisJCWRhdGEgPSBudWxsOyAvLyBBdm9pZCBidWdneSBjYWNoZSBhbmQgZ28gdG8gU29sciBldmVyeSB0aW1lIAorCQkvLyByZWNpZXZlIHRoZSBjYWNoZWQgZGF0YQorCQlpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCkgeworCQkJc3VjY2Vzcyh0ZXJtLCBkYXRhKTsKKwkJLy8gaWYgYW4gQUpBWCB1cmwgaGFzIGJlZW4gc3VwcGxpZWQsIHRyeSBsb2FkaW5nIHRoZSBkYXRhIG5vdworCQl9IGVsc2UgaWYoICh0eXBlb2Ygb3B0aW9ucy51cmwgPT0gInN0cmluZyIpICYmIChvcHRpb25zLnVybC5sZW5ndGggPiAwKSApeworCQkJCisJCQl2YXIgZXh0cmFQYXJhbXMgPSB7CisJCQkJdGltZXN0YW1wOiArbmV3IERhdGUoKQorCQkJfTsKKwkJCSQuZWFjaChvcHRpb25zLmV4dHJhUGFyYW1zLCBmdW5jdGlvbihrZXksIHBhcmFtKSB7CisJCQkJZXh0cmFQYXJhbXNba2V5XSA9IHR5cGVvZiBwYXJhbSA9PSAiZnVuY3Rpb24iID8gcGFyYW0oKSA6IHBhcmFtOworCQkJfSk7CisJCQkKKwkJCSQuYWpheCh7CisJCQkJLy8gdHJ5IHRvIGxldmVyYWdlIGFqYXhRdWV1ZSBwbHVnaW4gdG8gYWJvcnQgcHJldmlvdXMgcmVxdWVzdHMKKwkJCQltb2RlOiAiYWJvcnQiLAorCQkJCS8vIGxpbWl0IGFib3J0aW9uIHRvIHRoaXMgaW5wdXQKKwkJCQlwb3J0OiAiYXV0b2NvbXBsZXRlIiArIGlucHV0Lm5hbWUsCisJCQkJZGF0YVR5cGU6IG9wdGlvbnMuZGF0YVR5cGUsCisJCQkJdXJsOiBvcHRpb25zLnVybCwKKwkJCQlkYXRhOiAkLmV4dGVuZCh7CisJCQkJCXE6IGxhc3RXb3JkKHRlcm0pLAorCQkJCQlsaW1pdDogb3B0aW9ucy5tYXgKKwkJCQl9LCBleHRyYVBhcmFtcyksCisJCQkJc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgeworCQkJCQl2YXIgcGFyc2VkID0gb3B0aW9ucy5wYXJzZSAmJiBvcHRpb25zLnBhcnNlKGRhdGEpIHx8IHBhcnNlKGRhdGEpOworCQkJCQljYWNoZS5hZGQodGVybSwgcGFyc2VkKTsKKwkJCQkJc3VjY2Vzcyh0ZXJtLCBwYXJzZWQpOworCQkJCX0KKwkJCX0pOworCQl9IGVsc2UgeworCQkJLy8gaWYgd2UgaGF2ZSBhIGZhaWx1cmUsIHdlIG5lZWQgdG8gZW1wdHkgdGhlIGxpc3QgLS0gdGhpcyBwcmV2ZW50cyB0aGUgdGhlIFtUQUJdIGtleSBmcm9tIHNlbGVjdGluZyB0aGUgbGFzdCBzdWNjZXNzZnVsIG1hdGNoCisJCQlzZWxlY3QuZW1wdHlMaXN0KCk7CisJCQlmYWlsdXJlKHRlcm0pOworCQl9CisJfTsKKwkKKwlmdW5jdGlvbiBwYXJzZShkYXRhKSB7CisJCXZhciBwYXJzZWQgPSBbXTsKKwkJdmFyIHJvd3MgPSBkYXRhLnNwbGl0KCJcbiIpOworCQlmb3IgKHZhciBpPTA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgcm93ID0gJC50cmltKHJvd3NbaV0pOworCQkJaWYgKHJvdykgeworCQkJCXJvdyA9IHJvdy5zcGxpdCgifCIpOworCQkJCXBhcnNlZFtwYXJzZWQubGVuZ3RoXSA9IHsKKwkJCQkJZGF0YTogcm93LAorCQkJCQl2YWx1ZTogcm93WzBdLAorCQkJCQlyZXN1bHQ6IG9wdGlvbnMuZm9ybWF0UmVzdWx0ICYmIG9wdGlvbnMuZm9ybWF0UmVzdWx0KHJvdywgcm93WzBdKSB8fCByb3dbMF0KKwkJCQl9OworCQkJfQorCQl9CisJCXJldHVybiBwYXJzZWQ7CisJfTsKKworCWZ1bmN0aW9uIHN0b3BMb2FkaW5nKCkgeworCQkkaW5wdXQucmVtb3ZlQ2xhc3Mob3B0aW9ucy5sb2FkaW5nQ2xhc3MpOworCX07CisKK307CisKKyQuQXV0b2NvbXBsZXRlci5kZWZhdWx0cyA9IHsKKwlpbnB1dENsYXNzOiAiYWNfaW5wdXQiLAorCXJlc3VsdHNDbGFzczogImFjX3Jlc3VsdHMiLAorCWxvYWRpbmdDbGFzczogImFjX2xvYWRpbmciLAorCW1pbkNoYXJzOiAxLAorCWRlbGF5OiA0MDAsCisJbWF0Y2hDYXNlOiBmYWxzZSwKKwltYXRjaFN1YnNldDogdHJ1ZSwKKwltYXRjaENvbnRhaW5zOiBmYWxzZSwKKwljYWNoZUxlbmd0aDogMTAsCisJbWF4OiAxMDAsCisJbXVzdE1hdGNoOiBmYWxzZSwKKwlleHRyYVBhcmFtczoge30sCisJc2VsZWN0Rmlyc3Q6IGZhbHNlLAorCWZvcm1hdEl0ZW06IGZ1bmN0aW9uKHJvdykgeyByZXR1cm4gcm93WzBdOyB9LAorCWZvcm1hdE1hdGNoOiBudWxsLAorCWF1dG9GaWxsOiBmYWxzZSwKKwl3aWR0aDogMCwKKwltdWx0aXBsZTogZmFsc2UsCisJbXVsdGlwbGVTZXBhcmF0b3I6ICIsICIsCisJaGlnaGxpZ2h0OiBmdW5jdGlvbih2YWx1ZSwgdGVybSkgeworCQlyZXR1cm4gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKCIoPyFbXiY7XSs7KSg/ITxbXjw+XSopKCIgKyB0ZXJtLnJlcGxhY2UoLyhbXF5cJFwoXClcW1xdXHtcfVwqXC5cK1w/XHxcXF0pL2dpLCAiXFwkMSIpICsgIikoPyFbXjw+XSo+KSg/IVteJjtdKzspIiwgImdpIiksICI8c3Ryb25nPiQxPC9zdHJvbmc+Iik7CisJfSwKKyAgICBzY3JvbGw6IHRydWUsCisgICAgc2Nyb2xsSGVpZ2h0OiAxODAKK307CisKKyQuQXV0b2NvbXBsZXRlci5DYWNoZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKworCXZhciBkYXRhID0ge307CisJdmFyIGxlbmd0aCA9IDA7CisJCisJZnVuY3Rpb24gbWF0Y2hTdWJzZXQocywgc3ViKSB7CisJCWlmICghb3B0aW9ucy5tYXRjaENhc2UpIAorCQkJcyA9IHMudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGkgPSBzLmluZGV4T2Yoc3ViKTsKKwkJaWYgKG9wdGlvbnMubWF0Y2hDb250YWlucyA9PSAid29yZCIpeworCQkJaSA9IHMudG9Mb3dlckNhc2UoKS5zZWFyY2goIlxcYiIgKyBzdWIudG9Mb3dlckNhc2UoKSk7CisJCX0KKwkJaWYgKGkgPT0gLTEpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIGkgPT0gMCB8fCBvcHRpb25zLm1hdGNoQ29udGFpbnM7CisJfTsKKwkKKwlmdW5jdGlvbiBhZGQocSwgdmFsdWUpIHsKKwkJaWYgKGxlbmd0aCA+IG9wdGlvbnMuY2FjaGVMZW5ndGgpeworCQkJZmx1c2goKTsKKwkJfQorCQlpZiAoIWRhdGFbcV0peyAKKwkJCWxlbmd0aCsrOworCQl9CisJCWRhdGFbcV0gPSB2YWx1ZTsKKwl9CisJCisJZnVuY3Rpb24gcG9wdWxhdGUoKXsKKwkJaWYoICFvcHRpb25zLmRhdGEgKSByZXR1cm4gZmFsc2U7CisJCS8vIHRyYWNrIHRoZSBtYXRjaGVzCisJCXZhciBzdE1hdGNoU2V0cyA9IHt9LAorCQkJbnVsbERhdGEgPSAwOworCisJCS8vIG5vIHVybCB3YXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgY2FjaGUgbGVuZ3RoIHRvIG1ha2Ugc3VyZSBpdCBmaXRzIHRoZSBsb2NhbCBkYXRhIHN0b3JlCisJCWlmKCAhb3B0aW9ucy51cmwgKSBvcHRpb25zLmNhY2hlTGVuZ3RoID0gMTsKKwkJCisJCS8vIHRyYWNrIGFsbCBvcHRpb25zIGZvciBtaW5DaGFycyA9IDAKKwkJc3RNYXRjaFNldHNbIiJdID0gW107CisJCQorCQkvLyBsb29wIHRocm91Z2ggdGhlIGFycmF5IGFuZCBjcmVhdGUgYSBsb29rdXAgc3RydWN0dXJlCisJCWZvciAoIHZhciBpID0gMCwgb2wgPSBvcHRpb25zLmRhdGEubGVuZ3RoOyBpIDwgb2w7IGkrKyApIHsKKwkJCXZhciByYXdWYWx1ZSA9IG9wdGlvbnMuZGF0YVtpXTsKKwkJCS8vIGlmIHJhd1ZhbHVlIGlzIGEgc3RyaW5nLCBtYWtlIGFuIGFycmF5IG90aGVyd2lzZSBqdXN0IHJlZmVyZW5jZSB0aGUgYXJyYXkKKwkJCXJhd1ZhbHVlID0gKHR5cGVvZiByYXdWYWx1ZSA9PSAic3RyaW5nIikgPyBbcmF3VmFsdWVdIDogcmF3VmFsdWU7CisJCQkKKwkJCXZhciB2YWx1ZSA9IG9wdGlvbnMuZm9ybWF0TWF0Y2gocmF3VmFsdWUsIGkrMSwgb3B0aW9ucy5kYXRhLmxlbmd0aCk7CisJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApCisJCQkJY29udGludWU7CisJCQkJCisJCQl2YXIgZmlyc3RDaGFyID0gdmFsdWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7CisJCQkvLyBpZiBubyBsb29rdXAgYXJyYXkgZm9yIHRoaXMgY2hhcmFjdGVyIGV4aXN0cywgbG9vayBpdCB1cCBub3cKKwkJCWlmKCAhc3RNYXRjaFNldHNbZmlyc3RDaGFyXSApIAorCQkJCXN0TWF0Y2hTZXRzW2ZpcnN0Q2hhcl0gPSBbXTsKKworCQkJLy8gaWYgdGhlIG1hdGNoIGlzIGEgc3RyaW5nCisJCQl2YXIgcm93ID0geworCQkJCXZhbHVlOiB2YWx1ZSwKKwkJCQlkYXRhOiByYXdWYWx1ZSwKKwkJCQlyZXN1bHQ6IG9wdGlvbnMuZm9ybWF0UmVzdWx0ICYmIG9wdGlvbnMuZm9ybWF0UmVzdWx0KHJhd1ZhbHVlKSB8fCB2YWx1ZQorCQkJfTsKKwkJCQorCQkJLy8gcHVzaCB0aGUgY3VycmVudCBtYXRjaCBpbnRvIHRoZSBzZXQgbGlzdAorCQkJc3RNYXRjaFNldHNbZmlyc3RDaGFyXS5wdXNoKHJvdyk7CisKKwkJCS8vIGtlZXAgdHJhY2sgb2YgbWluQ2hhcnMgemVybyBpdGVtcworCQkJaWYgKCBudWxsRGF0YSsrIDwgb3B0aW9ucy5tYXggKSB7CisJCQkJc3RNYXRjaFNldHNbIiJdLnB1c2gocm93KTsKKwkJCX0KKwkJfTsKKworCQkvLyBhZGQgdGhlIGRhdGEgaXRlbXMgdG8gdGhlIGNhY2hlCisJCSQuZWFjaChzdE1hdGNoU2V0cywgZnVuY3Rpb24oaSwgdmFsdWUpIHsKKwkJCS8vIGluY3JlYXNlIHRoZSBjYWNoZSBzaXplCisJCQlvcHRpb25zLmNhY2hlTGVuZ3RoKys7CisJCQkvLyBhZGQgdG8gdGhlIGNhY2hlCisJCQlhZGQoaSwgdmFsdWUpOworCQl9KTsKKwl9CisJCisJLy8gcG9wdWxhdGUgYW55IGV4aXN0aW5nIGRhdGEKKwlzZXRUaW1lb3V0KHBvcHVsYXRlLCAyNSk7CisJCisJZnVuY3Rpb24gZmx1c2goKXsKKwkJZGF0YSA9IHt9OworCQlsZW5ndGggPSAwOworCX0KKwkKKwlyZXR1cm4geworCQlmbHVzaDogZmx1c2gsCisJCWFkZDogYWRkLAorCQlwb3B1bGF0ZTogcG9wdWxhdGUsCisJCWxvYWQ6IGZ1bmN0aW9uKHEpIHsKKwkJCWlmICghb3B0aW9ucy5jYWNoZUxlbmd0aCB8fCAhbGVuZ3RoKQorCQkJCXJldHVybiBudWxsOworCQkJLyogCisJCQkgKiBpZiBkZWFsaW5nIHcvbG9jYWwgZGF0YSBhbmQgbWF0Y2hDb250YWlucyB0aGFuIHdlIG11c3QgbWFrZSBzdXJlCisJCQkgKiB0byBsb29wIHRocm91Z2ggYWxsIHRoZSBkYXRhIGNvbGxlY3Rpb25zIGxvb2tpbmcgZm9yIG1hdGNoZXMKKwkJCSAqLworCQkJaWYoICFvcHRpb25zLnVybCAmJiBvcHRpb25zLm1hdGNoQ29udGFpbnMgKXsKKwkJCQkvLyB0cmFjayBhbGwgbWF0Y2hlcworCQkJCXZhciBjc3ViID0gW107CisJCQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgZGF0YSBncmlkcyBmb3IgbWF0Y2hlcworCQkJCWZvciggdmFyIGsgaW4gZGF0YSApeworCQkJCQkvLyBkb24ndCBzZWFyY2ggdGhyb3VnaCB0aGUgc3RNYXRjaFNldHNbIiJdIChtaW5DaGFyczogMCkgY2FjaGUKKwkJCQkJLy8gdGhpcyBwcmV2ZW50cyBkdXBsaWNhdGVzCisJCQkJCWlmKCBrLmxlbmd0aCA+IDAgKXsKKwkJCQkJCXZhciBjID0gZGF0YVtrXTsKKwkJCQkJCSQuZWFjaChjLCBmdW5jdGlvbihpLCB4KSB7CisJCQkJCQkJLy8gaWYgd2UndmUgZ290IGEgbWF0Y2gsIGFkZCBpdCB0byB0aGUgYXJyYXkKKwkJCQkJCQlpZiAobWF0Y2hTdWJzZXQoeC52YWx1ZSwgcSkpIHsKKwkJCQkJCQkJY3N1Yi5wdXNoKHgpOworCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJCQl9CisJCQkJfQkJCQkKKwkJCQlyZXR1cm4gY3N1YjsKKwkJCX0gZWxzZSAKKwkJCS8vIGlmIHRoZSBleGFjdCBpdGVtIGV4aXN0cywgdXNlIGl0CisJCQlpZiAoZGF0YVtxXSl7CisJCQkJcmV0dXJuIGRhdGFbcV07CisJCQl9IGVsc2UKKwkJCWlmIChvcHRpb25zLm1hdGNoU3Vic2V0KSB7CisJCQkJZm9yICh2YXIgaSA9IHEubGVuZ3RoIC0gMTsgaSA+PSBvcHRpb25zLm1pbkNoYXJzOyBpLS0pIHsKKwkJCQkJdmFyIGMgPSBkYXRhW3Euc3Vic3RyKDAsIGkpXTsKKwkJCQkJaWYgKGMpIHsKKwkJCQkJCXZhciBjc3ViID0gW107CisJCQkJCQkkLmVhY2goYywgZnVuY3Rpb24oaSwgeCkgeworCQkJCQkJCWlmIChtYXRjaFN1YnNldCh4LnZhbHVlLCBxKSkgeworCQkJCQkJCQljc3ViW2NzdWIubGVuZ3RoXSA9IHg7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCQlyZXR1cm4gY3N1YjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfTsKK307CisKKyQuQXV0b2NvbXBsZXRlci5TZWxlY3QgPSBmdW5jdGlvbiAob3B0aW9ucywgaW5wdXQsIHNlbGVjdCwgY29uZmlnKSB7CisJdmFyIENMQVNTRVMgPSB7CisJCUFDVElWRTogImFjX292ZXIiCisJfTsKKwkKKwl2YXIgbGlzdEl0ZW1zLAorCQlhY3RpdmUgPSAtMSwKKwkJZGF0YSwKKwkJdGVybSA9ICIiLAorCQluZWVkc0luaXQgPSB0cnVlLAorCQllbGVtZW50LAorCQlsaXN0OworCQorCS8vIENyZWF0ZSByZXN1bHRzCisJZnVuY3Rpb24gaW5pdCgpIHsKKwkJaWYgKCFuZWVkc0luaXQpCisJCQlyZXR1cm47CisJCWVsZW1lbnQgPSAkKCI8ZGl2Lz4iKQorCQkuaGlkZSgpCisJCS5hZGRDbGFzcyhvcHRpb25zLnJlc3VsdHNDbGFzcykKKwkJLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUiKQorCQkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7CisJCisJCWxpc3QgPSAkKCI8dWwvPiIpLmFwcGVuZFRvKGVsZW1lbnQpLm1vdXNlb3ZlciggZnVuY3Rpb24oZXZlbnQpIHsKKwkJCWlmKHRhcmdldChldmVudCkubm9kZU5hbWUgJiYgdGFyZ2V0KGV2ZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09ICdMSScpIHsKKwkgICAgICAgICAgICBhY3RpdmUgPSAkKCJsaSIsIGxpc3QpLnJlbW92ZUNsYXNzKENMQVNTRVMuQUNUSVZFKS5pbmRleCh0YXJnZXQoZXZlbnQpKTsKKwkJCSAgICAkKHRhcmdldChldmVudCkpLmFkZENsYXNzKENMQVNTRVMuQUNUSVZFKTsgICAgICAgICAgICAKKwkgICAgICAgIH0KKwkJfSkuY2xpY2soZnVuY3Rpb24oZXZlbnQpIHsKKwkJCSQodGFyZ2V0KGV2ZW50KSkuYWRkQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOworCQkJc2VsZWN0KCk7CisJCQkvLyBUT0RPIHByb3ZpZGUgb3B0aW9uIHRvIGF2b2lkIHNldHRpbmcgZm9jdXMgYWdhaW4gYWZ0ZXIgc2VsZWN0aW9uPyB1c2VmdWwgZm9yIGNsZWFudXAtb24tZm9jdXMKKwkJCWlucHV0LmZvY3VzKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0pLm1vdXNlZG93bihmdW5jdGlvbigpIHsKKwkJCWNvbmZpZy5tb3VzZURvd25PblNlbGVjdCA9IHRydWU7CisJCX0pLm1vdXNldXAoZnVuY3Rpb24oKSB7CisJCQljb25maWcubW91c2VEb3duT25TZWxlY3QgPSBmYWxzZTsKKwkJfSk7CisJCQorCQlpZiggb3B0aW9ucy53aWR0aCA+IDAgKQorCQkJZWxlbWVudC5jc3MoIndpZHRoIiwgb3B0aW9ucy53aWR0aCk7CisJCQkKKwkJbmVlZHNJbml0ID0gZmFsc2U7CisJfSAKKwkKKwlmdW5jdGlvbiB0YXJnZXQoZXZlbnQpIHsKKwkJdmFyIGVsZW1lbnQgPSBldmVudC50YXJnZXQ7CisJCXdoaWxlKGVsZW1lbnQgJiYgZWxlbWVudC50YWdOYW1lICE9ICJMSSIpCisJCQllbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworCQkvLyBtb3JlIGZ1biB3aXRoIElFLCBzb21ldGltZXMgZXZlbnQudGFyZ2V0IGlzIGVtcHR5LCBqdXN0IGlnbm9yZSBpdCB0aGVuCisJCWlmKCFlbGVtZW50KQorCQkJcmV0dXJuIFtdOworCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwlmdW5jdGlvbiBtb3ZlU2VsZWN0KHN0ZXApIHsKKwkJbGlzdEl0ZW1zLnNsaWNlKGFjdGl2ZSwgYWN0aXZlICsgMSkucmVtb3ZlQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOworCQltb3ZlUG9zaXRpb24oc3RlcCk7CisgICAgICAgIHZhciBhY3RpdmVJdGVtID0gbGlzdEl0ZW1zLnNsaWNlKGFjdGl2ZSwgYWN0aXZlICsgMSkuYWRkQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOworICAgICAgICBpZihvcHRpb25zLnNjcm9sbCkgeworICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CisgICAgICAgICAgICBsaXN0SXRlbXMuc2xpY2UoMCwgYWN0aXZlKS5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCW9mZnNldCArPSB0aGlzLm9mZnNldEhlaWdodDsKKwkJCX0pOworICAgICAgICAgICAgaWYoKG9mZnNldCArIGFjdGl2ZUl0ZW1bMF0ub2Zmc2V0SGVpZ2h0IC0gbGlzdC5zY3JvbGxUb3AoKSkgPiBsaXN0WzBdLmNsaWVudEhlaWdodCkgeworICAgICAgICAgICAgICAgIGxpc3Quc2Nyb2xsVG9wKG9mZnNldCArIGFjdGl2ZUl0ZW1bMF0ub2Zmc2V0SGVpZ2h0IC0gbGlzdC5pbm5lckhlaWdodCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPCBsaXN0LnNjcm9sbFRvcCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5zY3JvbGxUb3Aob2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCX07CisJCisJZnVuY3Rpb24gbW92ZVBvc2l0aW9uKHN0ZXApIHsKKwkJYWN0aXZlICs9IHN0ZXA7CisJCWlmIChhY3RpdmUgPCAwKSB7CisJCQlhY3RpdmUgPSBsaXN0SXRlbXMuc2l6ZSgpIC0gMTsKKwkJfSBlbHNlIGlmIChhY3RpdmUgPj0gbGlzdEl0ZW1zLnNpemUoKSkgeworCQkJYWN0aXZlID0gMDsKKwkJfQorCX0KKwkKKwlmdW5jdGlvbiBsaW1pdE51bWJlck9mSXRlbXMoYXZhaWxhYmxlKSB7CisJCXJldHVybiBvcHRpb25zLm1heCAmJiBvcHRpb25zLm1heCA8IGF2YWlsYWJsZQorCQkJPyBvcHRpb25zLm1heAorCQkJOiBhdmFpbGFibGU7CisJfQorCQorCWZ1bmN0aW9uIGZpbGxMaXN0KCkgeworCQlsaXN0LmVtcHR5KCk7CisJCXZhciBtYXggPSBsaW1pdE51bWJlck9mSXRlbXMoZGF0YS5sZW5ndGgpOworCQlmb3IgKHZhciBpPTA7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKCFkYXRhW2ldKQorCQkJCWNvbnRpbnVlOworCQkJdmFyIGZvcm1hdHRlZCA9IG9wdGlvbnMuZm9ybWF0SXRlbShkYXRhW2ldLmRhdGEsIGkrMSwgbWF4LCBkYXRhW2ldLnZhbHVlLCB0ZXJtKTsKKwkJCWlmICggZm9ybWF0dGVkID09PSBmYWxzZSApCisJCQkJY29udGludWU7CisJCQl2YXIgbGkgPSAkKCI8bGkvPiIpLmh0bWwoIG9wdGlvbnMuaGlnaGxpZ2h0KGZvcm1hdHRlZCwgdGVybSkgKS5hZGRDbGFzcyhpJTIgPT0gMCA/ICJhY19ldmVuIiA6ICJhY19vZGQiKS5hcHBlbmRUbyhsaXN0KVswXTsKKwkJCSQuZGF0YShsaSwgImFjX2RhdGEiLCBkYXRhW2ldKTsKKwkJfQorCQlsaXN0SXRlbXMgPSBsaXN0LmZpbmQoImxpIik7CisJCWlmICggb3B0aW9ucy5zZWxlY3RGaXJzdCApIHsKKwkJCWxpc3RJdGVtcy5zbGljZSgwLCAxKS5hZGRDbGFzcyhDTEFTU0VTLkFDVElWRSk7CisJCQlhY3RpdmUgPSAwOworCQl9CisJCS8vIGFwcGx5IGJnaWZyYW1lIGlmIGF2YWlsYWJsZQorCQlpZiAoICQuZm4uYmdpZnJhbWUgKQorCQkJbGlzdC5iZ2lmcmFtZSgpOworCX0KKwkKKwlyZXR1cm4geworCQlkaXNwbGF5OiBmdW5jdGlvbihkLCBxKSB7CisJCQlpbml0KCk7CisJCQlkYXRhID0gZDsKKwkJCXRlcm0gPSBxOworCQkJZmlsbExpc3QoKTsKKwkJfSwKKwkJbmV4dDogZnVuY3Rpb24oKSB7CisJCQltb3ZlU2VsZWN0KDEpOworCQl9LAorCQlwcmV2OiBmdW5jdGlvbigpIHsKKwkJCW1vdmVTZWxlY3QoLTEpOworCQl9LAorCQlwYWdlVXA6IGZ1bmN0aW9uKCkgeworCQkJaWYgKGFjdGl2ZSAhPSAwICYmIGFjdGl2ZSAtIDggPCAwKSB7CisJCQkJbW92ZVNlbGVjdCggLWFjdGl2ZSApOworCQkJfSBlbHNlIHsKKwkJCQltb3ZlU2VsZWN0KC04KTsKKwkJCX0KKwkJfSwKKwkJcGFnZURvd246IGZ1bmN0aW9uKCkgeworCQkJaWYgKGFjdGl2ZSAhPSBsaXN0SXRlbXMuc2l6ZSgpIC0gMSAmJiBhY3RpdmUgKyA4ID4gbGlzdEl0ZW1zLnNpemUoKSkgeworCQkJCW1vdmVTZWxlY3QoIGxpc3RJdGVtcy5zaXplKCkgLSAxIC0gYWN0aXZlICk7CisJCQl9IGVsc2UgeworCQkJCW1vdmVTZWxlY3QoOCk7CisJCQl9CisJCX0sCisJCWhpZGU6IGZ1bmN0aW9uKCkgeworCQkJZWxlbWVudCAmJiBlbGVtZW50LmhpZGUoKTsKKwkJCWxpc3RJdGVtcyAmJiBsaXN0SXRlbXMucmVtb3ZlQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOworCQkJYWN0aXZlID0gLTE7CisJCX0sCisJCXZpc2libGUgOiBmdW5jdGlvbigpIHsKKwkJCXJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuaXMoIjp2aXNpYmxlIik7CisJCX0sCisJCWN1cnJlbnQ6IGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIHRoaXMudmlzaWJsZSgpICYmIChsaXN0SXRlbXMuZmlsdGVyKCIuIiArIENMQVNTRVMuQUNUSVZFKVswXSB8fCBvcHRpb25zLnNlbGVjdEZpcnN0ICYmIGxpc3RJdGVtc1swXSk7CisJCX0sCisJCXNob3c6IGZ1bmN0aW9uKCkgeworCQkJdmFyIG9mZnNldCA9ICQoaW5wdXQpLm9mZnNldCgpOworCQkJZWxlbWVudC5jc3MoeworCQkJCXdpZHRoOiB0eXBlb2Ygb3B0aW9ucy53aWR0aCA9PSAic3RyaW5nIiB8fCBvcHRpb25zLndpZHRoID4gMCA/IG9wdGlvbnMud2lkdGggOiAkKGlucHV0KS53aWR0aCgpLAorCQkJCXRvcDogb2Zmc2V0LnRvcCArIGlucHV0Lm9mZnNldEhlaWdodCwKKwkJCQlsZWZ0OiBvZmZzZXQubGVmdAorCQkJfSkuc2hvdygpOworICAgICAgICAgICAgaWYob3B0aW9ucy5zY3JvbGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0LnNjcm9sbFRvcCgwKTsKKyAgICAgICAgICAgICAgICBsaXN0LmNzcyh7CisJCQkJCW1heEhlaWdodDogb3B0aW9ucy5zY3JvbGxIZWlnaHQsCisJCQkJCW92ZXJmbG93OiAnYXV0bycKKwkJCQl9KTsKKwkJCQkKKyAgICAgICAgICAgICAgICBpZigkLmJyb3dzZXIubXNpZSAmJiB0eXBlb2YgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXhIZWlnaHQgPT09ICJ1bmRlZmluZWQiKSB7CisJCQkJCXZhciBsaXN0SGVpZ2h0ID0gMDsKKwkJCQkJbGlzdEl0ZW1zLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJCQlsaXN0SGVpZ2h0ICs9IHRoaXMub2Zmc2V0SGVpZ2h0OworCQkJCQl9KTsKKwkJCQkJdmFyIHNjcm9sbGJhcnNWaXNpYmxlID0gbGlzdEhlaWdodCA+IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBsaXN0LmNzcygnaGVpZ2h0Jywgc2Nyb2xsYmFyc1Zpc2libGUgPyBvcHRpb25zLnNjcm9sbEhlaWdodCA6IGxpc3RIZWlnaHQgKTsKKwkJCQkJaWYgKCFzY3JvbGxiYXJzVmlzaWJsZSkgeworCQkJCQkJLy8gSUUgZG9lc24ndCByZWNhbGN1bGF0ZSB3aWR0aCB3aGVuIHNjcm9sbGJhciBkaXNhcHBlYXJzCisJCQkJCQlsaXN0SXRlbXMud2lkdGgoIGxpc3Qud2lkdGgoKSAtIHBhcnNlSW50KGxpc3RJdGVtcy5jc3MoInBhZGRpbmctbGVmdCIpKSAtIHBhcnNlSW50KGxpc3RJdGVtcy5jc3MoInBhZGRpbmctcmlnaHQiKSkgKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKwkJfSwKKwkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeworCQkJdmFyIHNlbGVjdGVkID0gbGlzdEl0ZW1zICYmIGxpc3RJdGVtcy5maWx0ZXIoIi4iICsgQ0xBU1NFUy5BQ1RJVkUpLnJlbW92ZUNsYXNzKENMQVNTRVMuQUNUSVZFKTsKKwkJCXJldHVybiBzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggJiYgJC5kYXRhKHNlbGVjdGVkWzBdLCAiYWNfZGF0YSIpOworCQl9LAorCQllbXB0eUxpc3Q6IGZ1bmN0aW9uICgpeworCQkJbGlzdCAmJiBsaXN0LmVtcHR5KCk7CisJCX0sCisJCXVuYmluZDogZnVuY3Rpb24oKSB7CisJCQllbGVtZW50ICYmIGVsZW1lbnQucmVtb3ZlKCk7CisJCX0KKwl9OworfTsKKworJC5BdXRvY29tcGxldGVyLlNlbGVjdGlvbiA9IGZ1bmN0aW9uKGZpZWxkLCBzdGFydCwgZW5kKSB7CisJaWYoIGZpZWxkLmNyZWF0ZVRleHRSYW5nZSApeworCQl2YXIgc2VsUmFuZ2UgPSBmaWVsZC5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJc2VsUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CisJCXNlbFJhbmdlLm1vdmVTdGFydCgiY2hhcmFjdGVyIiwgc3RhcnQpOworCQlzZWxSYW5nZS5tb3ZlRW5kKCJjaGFyYWN0ZXIiLCBlbmQpOworCQlzZWxSYW5nZS5zZWxlY3QoKTsKKwl9IGVsc2UgaWYoIGZpZWxkLnNldFNlbGVjdGlvblJhbmdlICl7CisJCWZpZWxkLnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOworCX0gZWxzZSB7CisJCWlmKCBmaWVsZC5zZWxlY3Rpb25TdGFydCApeworCQkJZmllbGQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDsKKwkJCWZpZWxkLnNlbGVjdGlvbkVuZCA9IGVuZDsKKwkJfQorCX0KKwlmaWVsZC5mb2N1cygpOworfTsKKworfSkoalF1ZXJ5KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9sYXlvdXQudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9sYXlvdXQudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNGMxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L2xheW91dC52bQpAQCAtMCwwICsxLDI0IEBACisjKioKKyAqICBPdmVyYWxsIEhUTUwgcGFnZSBsYXlvdXQKKyAqIworCis8aHRtbD4KKzxoZWFkPgorICAjcGFyc2UoImhlYWQudm0iKQorPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJhZG1pbiI+PGEgaHJlZj0iI3VybF9yb290LyMvI2NvcmVfbmFtZSI+U29sciBBZG1pbjwvYT48L2Rpdj4KKyAgICA8ZGl2IGlkPSJoZWFkZXIiPgorICAgICAgI3BhcnNlKCJoZWFkZXIudm0iKQorICAgIDwvZGl2PgorICAgIDxkaXYgaWQ9InRhYnMiPgorICAgICAgI3BhcnNlKCJ0YWJzLnZtIikKKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJjb250ZW50Ij4KKyAgICAgICRjb250ZW50CisgICAgPC9kaXY+CisgICAgPGRpdiBpZD0iZm9vdGVyIj4KKyAgICAgICNwYXJzZSgiZm9vdGVyLnZtIikKKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvbWFpbi5jc3MgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9tYWluLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWVkNTMzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvbWFpbi5jc3MKQEAgLTAsMCArMSwyMzAgQEAKKyNhZG1pbnsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7IAorfQorCisjaGVhZHsKKyAgd2lkdGg6IDEwMCU7Cit9CisuYXJyYXktZmllbGQgeworICBib3JkZXI6IDJweCBzb2xpZCAjNDc0NzQ3OworICBiYWNrZ3JvdW5kOiAjRkZFOUQ4OworICBwYWRkaW5nOiA1cHg7CisgIG1hcmdpbjogNXB4OworfQorCisuYXJyYXktZmllbGQtbGlzdCBsaSB7CisgIGxpc3Qtc3R5bGU6IGNpcmNsZTsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisKKy5wYXJzZWRfcXVlcnlfaGVhZGVyIHsKKyAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTBwdDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5wYXJzZWRfcXVlcnkgeworICBmb250LWZhbWlseTogQ291cmllciwgQ291cmllciBOZXcsIG1vbm9zcGFjZWQ7CisgIGZvbnQtc2l6ZTogMTBwdDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworYm9keSB7CisgIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDEwcHQ7Cit9CisKK2EgeworICBjb2xvcjogIzQzYTRiMTsKK30KKworLm5hdmlnYXRvcnMgeworICBmbG9hdDogbGVmdDsKKyAgbWFyZ2luOiA1cHg7CisgIG1hcmdpbi10b3A6IDBweDsKKyAgd2lkdGg6IDE4NXB4OworICBwYWRkaW5nOiA1cHg7CisgIHRvcDogLTIwcHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsgIAorfQorCisudGFicy1iYXIgeworICBwYWRkaW5nOiA1cHg7CisgIHdpZHRoOiAxMDAlOworICBib3JkZXI6IDFweCBzb2xpZDsKKyAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweCAwcHg7Cit9CisudGFiIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHBhZGRpbmc6IDVweDsKKyAgbWFyZ2luOiAwcHggNXB4OworICBib3JkZXI6IDFweCBzb2xpZDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKKyAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworfQorLnRhYjpob3ZlciB7CisgIGJhY2tncm91bmQ6ICNGRUMyOTM7Cit9CisudGFiLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmZmZmY7Cit9CisKKy5uYXZpZ2F0b3JzIGgyIHsKKyAgYmFja2dyb3VuZDogI0ZFQzI5MzsKKyAgcGFkZGluZzogMnB4IDVweDsKK30KKworLm5hdmlnYXRvcnMgdWwgeworICBsaXN0LXN0eWxlOiBub25lOworICBtYXJnaW46IDA7CisgIG1hcmdpbi1ib3R0b206IDVweDsKKyAgbWFyZ2luLXRvcDogNXB4OworICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cit9CisKKy5uYXZpZ2F0b3JzIHVsIGxpIHsKKyAgY29sb3I6ICM5OTk7CisgIHBhZGRpbmc6IDJweDsKK30KKworCisKKy5mYWNldC1maWVsZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisuaGlnaGxpZ2h0IHsKKyAgY29sb3I6IHdoaXRlOworICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5OworICBib3JkZXI6IDFweCBibGFjayBzb2xpZDsKK30KKworLmhpZ2hsaWdodC1ib3ggeworICBtYXJnaW4tbGVmdDogMTVweDsKK30KKworLmZpZWxkLW5hbWUgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLmhpZ2hsaWdodGVkLWZhY2V0LWZpZWxkIHsKKyAgYmFja2dyb3VuZDogd2hpdGU7Cit9CisKKy5jb25zdHJhaW50cyB7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9CisKKyNxdWVyeS1mb3JteworICB3aWR0aDogODAlOworfQorCisKKworLnF1ZXJ5LWJveCwgLmNvbnN0cmFpbnRzIHsKKyAgcGFkZGluZzogNXB4OworICBtYXJnaW46IDVweDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgZm9udC1zaXplOiAyNHB4OworICBsZXR0ZXItc3BhY2luZzogMC4wOGVtOworfQorCisucXVlcnktYm94ICNxIHsKKyAgbWFyZ2luLWxlZnQ6IDhweDsKKyAgd2lkdGg6IDYwJTsKKyAgaGVpZ2h0OiA1MHB4OworICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICBmb250LXNpemU6IDFlbTsKKyAgcGFkZGluZzogMC40ZW07Cit9CisKKy5xdWVyeS1ib3ggeworICAKK30KKworLnF1ZXJ5LWJvb3N0IHsKKyAgCisgIHRvcDogMTBweDsKKyAgbGVmdDogNTBweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBmb250LXNpemU6IDAuOGVtOworfQorCisucXVlcnktYm94IC5pbnB1dHN7CisgIGxlZnQ6IDE4MHB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIAorfQorCisjbG9nbyB7CisgIG1hcmdpbjogMTBweDsKKyAgYm9yZGVyLXN0eWxlOiBub25lOworfQorCisucGFnaW5hdGlvbiB7CisgIHBhZGRpbmctbGVmdDogMzMlOworICBiYWNrZ3JvdW5kOiAjZWVlOworICBtYXJnaW46IDVweDsKKyAgbWFyZ2luLWxlZnQ6IDIxMHB4OworICBwYWRkaW5nLXRvcDogNXB4OworICBwYWRkaW5nLWJvdHRvbTogNXB4OworfQorCisucmVzdWx0LWRvY3VtZW50IHsKKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKyAgcGFkZGluZzogNXB4OworICBtYXJnaW46IDVweDsKKyAgbWFyZ2luLWxlZnQ6IDIxMHB4OworICBtYXJnaW4tYm90dG9tOiAxNXB4OworfQorCisucmVzdWx0LWRvY3VtZW50IGRpdnsKKyAgcGFkZGluZzogNXB4OworfQorCisucmVzdWx0LXRpdGxleworICB3aWR0aDo2MCU7Cit9CisKKy5yZXN1bHQtYm9keXsKKyAgYmFja2dyb3VuZDogI2RkZDsKK30KKworLm1sdHsKKyAgCit9CisKKy5tYXB7CisgIGZsb2F0OiByaWdodDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IC0yNXB4OyAgCit9CisKKy5yZXN1bHQtZG9jdW1lbnQ6bnRoLWNoaWxkKDJuKzEpIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKK30KKworCisuc2VsZWN0ZWQtZmFjZXQtZmllbGQgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworbGkuc2hvdyB7CisgIGxpc3Qtc3R5bGU6IGRpc2M7Cit9CisKKy5ncm91cC12YWx1ZXsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5lcnJvciB7CisgIGNvbG9yOiB3aGl0ZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworICBsZWZ0OiAyMTBweDsKKyAgd2lkdGg6ODAlOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L21pbWVfdHlwZV9saXN0cy52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L21pbWVfdHlwZV9saXN0cy52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDY4YmJkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvbWltZV90eXBlX2xpc3RzLnZtCkBAIC0wLDAgKzEsNjggQEAKKyMqKgorICogIERlZmluZSBzb21lIE1pbWUtVHlwZXMsIHNob3J0IGFuZCBsb25nIGZvcm0KKyAqIworCisjIyBNaW1lVHlwZSB0byBleHRlbnNpb24gbWFwIGZvciBkZXRlY3RpbmcgZmlsZSB0eXBlCisjIyBhbmQgc2hvd2luZyBwcm9wZXIgaWNvbgorIyMgTGlzdCBvZiB0eXBlcyBtYXRjaCB0aGUgaWNvbnMgaW4gL3NvbHIvaW1nL2ZpbGV0eXBlcworCisjIyBTaG9ydCBNaW1lVHlwZSBOYW1lcworIyMgV2FzIGNhbGxlZCAkc3VwcG9ydGVkdHlwZXMKKyNzZXQoJHN1cHBvcnRlZE1pbWVUeXBlcyA9ICI3ejthaTthaWZmO2FzYzthdWRpbztiaW47YnoyO2M7Y2ZjO2NmbTtjaG07Y2xhc3M7Y29uZjtjcHA7Y3M7Y3NzO2NzdjtkZWI7ZGl2eDtkb2M7ZG90O2VtbDtlbmM7ZmlsZTtnaWY7Z3o7aGxwO2h0bTtodG1sO2ltYWdlO2lzbztqYXI7amF2YTtqcGVnO2pwZztqcztsdWE7bTttbTttb3Y7bXAzO21wZztvZGM7b2RmO29kZztvZGk7b2RwO29kcztvZHQ7b2dnO3BkZjtwZ3A7cGhwO3BsO3BuZztwcHQ7cHM7cHk7cmFtO3JhcjtyYjtybTtycG07cnRmO3NpZztzcWw7c3dmO3N4YztzeGQ7c3hpO3N4dzt0YXI7dGV4O3Rnejt0eHQ7dmNmO3ZpZGVvO3ZzZDt3YXY7d21hO3dtdjt4bHM7eG1sO3hwaTt4dmlkO3ppcCIpCisKKyMjIExvbmcgRm9ybTogbWFwIE1pbWVUeXBlIGhlYWRlcnMgdG8gb3VyIFNob3J0IG5hbWVzCisjIyBXYXMgY2FsbGVkICRleHRNYXAKKyNzZXQoICRtaW1lRXh0ZW5zaW9uc01hcCA9IHsKKyAgICJhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQiOiAiN3oiLAorICAgImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiOiAiYWkiLAorICAgImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiOiAiYXNjIiwKKyAgICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOiAiYmluIiwKKyAgICJhcHBsaWNhdGlvbi94LWJ6aXAyIjogImJ6MiIsCisgICAidGV4dC94LWMiOiAiYyIsCisgICAiYXBwbGljYXRpb24vdm5kLm1zLWh0bWxoZWxwIjogImNobSIsCisgICAiYXBwbGljYXRpb24vamF2YS12bSI6ICJjbGFzcyIsCisgICAidGV4dC9jc3MiOiAiY3NzIiwKKyAgICJ0ZXh0L2NzdiI6ICJjc3YiLAorICAgImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiOiAiZGViIiwKKyAgICJhcHBsaWNhdGlvbi9tc3dvcmQiOiAiZG9jIiwKKyAgICJtZXNzYWdlL3JmYzgyMiI6ICJlbWwiLAorICAgImltYWdlL2dpZiI6ICJnaWYiLAorICAgImFwcGxpY2F0aW9uL3dpbmhscCI6ICJobHAiLAorICAgInRleHQvaHRtbCI6ICJodG1sIiwKKyAgICJhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUiOiAiamFyIiwKKyAgICJ0ZXh0L3gtamF2YS1zb3VyY2UiOiAiamF2YSIsCisgICAiaW1hZ2UvanBlZyI6ICJqcGVnIiwKKyAgICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IjogImpzIiwKKyAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0IjogIm9kYyIsCisgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIjogIm9kZiIsCisgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcyI6ICJvZGciLAorICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UiOiAib2RpIiwKKyAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiI6ICJvZHAiLAorICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiOiAib2RzIiwKKyAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiOiAib2R0IiwKKyAgICJhcHBsaWNhdGlvbi9wZGYiOiAicGRmIiwKKyAgICJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkIjogInBncCIsCisgICAiaW1hZ2UvcG5nIjogInBuZyIsCisgICAiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiOiAicHB0IiwKKyAgICJhdWRpby94LXBuLXJlYWxhdWRpbyI6ICJyYW0iLAorICAgImFwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQiOiAicmFyIiwKKyAgICJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhIjogInJtIiwKKyAgICJhcHBsaWNhdGlvbi9ydGYiOiAicnRmIiwKKyAgICJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI6ICJzd2YiLAorICAgImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiOiAic3hjIiwKKyAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3IjogInN4ZCIsCisgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyI6ICJzeGkiLAorICAgImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciI6ICJzeHciLAorICAgImFwcGxpY2F0aW9uL3gtdGFyIjogInRhciIsCisgICAiYXBwbGljYXRpb24veC10ZXgiOiAidGV4IiwKKyAgICJ0ZXh0L3BsYWluIjogInR4dCIsCisgICAidGV4dC94LXZjYXJkIjogInZjZiIsCisgICAiYXBwbGljYXRpb24vdm5kLnZpc2lvIjogInZzZCIsCisgICAiYXVkaW8veC13YXYiOiAid2F2IiwKKyAgICJhdWRpby94LW1zLXdtYSI6ICJ3bWEiLAorICAgInZpZGVvL3gtbXMtd212IjogIndtdiIsCisgICAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIjogInhscyIsCisgICAiYXBwbGljYXRpb24veG1sIjogInhtbCIsCisgICAiYXBwbGljYXRpb24veC14cGluc3RhbGwiOiAieHBpIiwKKyAgICJhcHBsaWNhdGlvbi96aXAiOiAiemlwIgorfSkKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3BhZ2luYXRpb25fYm90dG9tLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcGFnaW5hdGlvbl9ib3R0b20udm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiOGJkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3BhZ2luYXRpb25fYm90dG9tLnZtCkBAIC0wLDAgKzEsMjIgQEAKKyMqKgorICogIFBhZ2luZyBhbmQgU3RhdGlzdGljcyBhdCBib3R0b20gb2YgcmVzdWx0cworICojCisKKyMjIFVzdWFsbHkgcmVuZGVyZWQgaW4gcGFnaW5hdGlvbiBkaXYgdGFnCisKKyNpZigkcmVzcG9uc2UucmVzcG9uc2UuZ2V0KCdncm91cGVkJykpCisgICMjIHBhc3MKKyNlbHNlCisKKyAgI2xpbmtfdG9fcHJldmlvdXNfcGFnZSgicHJldmlvdXMiKQorCisgIDxzcGFuIGNsYXNzPSJyZXN1bHRzLWZvdW5kIj4kcGFnZS5yZXN1bHRzX2ZvdW5kPC9zcGFuPgorICByZXN1bHRzIGZvdW5kLgorCisgIFBhZ2UgPHNwYW4gY2xhc3M9InBhZ2UtbnVtIj4kcGFnZS5jdXJyZW50X3BhZ2VfbnVtYmVyPC9zcGFuPgorICAgIG9mIDxzcGFuIGNsYXNzPSJwYWdlLWNvdW50Ij4kcGFnZS5wYWdlX2NvdW50PC9zcGFuPgorCisgICNsaW5rX3RvX25leHRfcGFnZSgibmV4dCIpCisKKyNlbmQKKzxici8+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9wYWdpbmF0aW9uX3RvcC52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3BhZ2luYXRpb25fdG9wLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWM4YWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9wYWdpbmF0aW9uX3RvcC52bQpAQCAtMCwwICsxLDI5IEBACisjKioKKyAqICBQYWdpbmcgYW5kIFN0YXRpc3RpY3MgYXQgdG9wIG9mIHJlc3VsdHMKKyAqIworCisjIyBVc3VhbGx5IHJlbmRlcmVkIGluIHBhZ2luYXRpb24gZGl2IHRhZworCisjIyBHcm91cGVkIFJlc3VsdHMgLyBOb3QgUGFnaW5hdGVkCisjaWYoJHJlc3BvbnNlLnJlc3BvbnNlLmdldCgnZ3JvdXBlZCcpKQorCisgIDxzcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyZXN1bHRzLWZvdW5kIj4KKyAgICAgICRyZXNwb25zZS5yZXNwb25zZS5nZXQoJ2dyb3VwZWQnKS5zaXplKCkgZ3JvdXAocykKKyAgICA8L3NwYW4+CisgICAgZm91bmQgaW4gJHtyZXNwb25zZS5yZXNwb25zZUhlYWRlci5RVGltZX0gbXMKKyAgPC9zcGFuPgorCisjIyBSZWd1bGFyIFJlc3VsdHMgLyBVc2UgUGFnaW5nIExpbmtzIGlmIG5lZWRlZAorI2Vsc2UKKworICA8c3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmVzdWx0cy1mb3VuZCI+JHBhZ2UucmVzdWx0c19mb3VuZDwvc3Bhbj4KKyAgICByZXN1bHRzIGZvdW5kIGluCisgICAgJHtyZXNwb25zZS5yZXNwb25zZUhlYWRlci5RVGltZX0gbXMKKyAgPC9zcGFuPgorCisgIFBhZ2UgPHNwYW4gY2xhc3M9InBhZ2UtbnVtIj4kcGFnZS5jdXJyZW50X3BhZ2VfbnVtYmVyPC9zcGFuPgorICAgIG9mIDxzcGFuIGNsYXNzPSJwYWdlLWNvdW50Ij4kcGFnZS5wYWdlX2NvdW50PC9zcGFuPgorCisjZW5kICAgIyMgZW5kIGVsc2Ugbm9uLWdyb3VwZWQgcmVzdWx0cywgbm9ybWFsIHBhZ2luYXRpb24KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3Byb2R1Y3RfZG9jLnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcHJvZHVjdF9kb2Mudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3OGQ4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3Byb2R1Y3RfZG9jLnZtCkBAIC0wLDAgKzEsMzIgQEAKKyMqKgorICogIFJlbmRlciBhIGhpdCByZXByZXNlbnRpbmcgYSBQcm9kdWN0CisgKiAgYXNzdW1lZCB0byBoYXZlIGEgZmllbGQgY2FsbGVkICJuYW1lIgorICojCisKKzxkaXYgY2xhc3M9InJlc3VsdC10aXRsZSI+PGI+I2ZpZWxkKCduYW1lJyk8L2I+PHNwYW4gY2xhc3M9Im1sdCI+ICAgI2lmKCRwYXJhbXMuZ2V0Qm9vbCgnbWx0JywgZmFsc2UpID09IGZhbHNlKTxhIGhyZWY9IiNsZW5zTm9RJnE9aWQ6JGRvY0lkJm1sdD10cnVlIj5Nb3JlIExpa2UgVGhpczwvYT4jZW5kPC9zcGFuPjwvZGl2PgorIyNkbyB3ZSBoYXZlIGEgcGh5c2ljYWwgc3RvcmUgZm9yIHRoaXMgcHJvZHVjdAorI3NldCgkc3RvcmUgPSAkZG9jLmdldEZpZWxkVmFsdWUoJ3N0b3JlJykpCisjaWYoJHN0b3JlKTxkaXYgY2xhc3M9Im1hcCI+PGltZyBzcmM9Imh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcy9hcGkvc3RhdGljbWFwPyZ6b29tPTEyJnNpemU9MTUweDgwJm1hcHR5cGU9cm9hZG1hcCZtYXJrZXJzPSRkb2MuZ2V0RmllbGRWYWx1ZSgnc3RvcmUnKSZzZW5zb3I9ZmFsc2UiIC8+PGRpdj48c21hbGw+PGEgdGFyZ2V0PSJfbWFwIiBocmVmPSJodHRwOi8vbWFwcy5nb29nbGUuY29tLz9xPSRzdG9yZSZhbXA7c291cmNlPWVtYmVkIj5MYXJnZXIgTWFwPC9hPjwvc21hbGw+PC9kaXY+PC9kaXY+I2VuZAorPGRpdj5JZDogI2ZpZWxkKCdpZCcpPC9kaXY+Cis8ZGl2PlByaWNlOiAjZmllbGQoJ3ByaWNlX2MnKTwvZGl2PgorPGRpdj5GZWF0dXJlczogI2ZpZWxkKCdmZWF0dXJlcycpPC9kaXY+Cis8ZGl2PkluIFN0b2NrOiAjZmllbGQoJ2luU3RvY2snKTwvZGl2PgorPGRpdiBjbGFzcz0ibWx0Ij4KKyAgI3NldCgkbWx0ID0gJG1sdFJlc3VsdHMuZ2V0KCRkb2NJZCkpCisgICNzZXQoJG1sdE9uID0gJHBhcmFtcy5nZXRCb29sKCdtbHQnKSkKKyAgI2lmKCRtbHRPbiA9PSB0cnVlKTxkaXYgY2xhc3M9ImZpZWxkLW5hbWUiPlNpbWlsYXIgSXRlbXM8L2Rpdj4jZW5kCisgICNpZiAoJG1sdE9uICYmICRtbHQgJiYgJG1sdC5zaXplKCkgPiAwKQorICA8dWw+CisgICAgI2ZvcmVhY2goJG1sdEhpdCBpbiAkbWx0KQorICAgICAgI3NldCgkbWx0SWQgPSAkbWx0SGl0LmdldEZpZWxkVmFsdWUoJ2lkJykpCisgICAgICA8bGk+PGRpdj48YSBocmVmPSIjdXJsX2Zvcl9ob21lP3E9aWQ6JG1sdElkIj4kbWx0SWQ8L2E+PC9kaXY+PGRpdj48c3BhbiBjbGFzcz0iZmllbGQtbmFtZSI+TmFtZTo8L3NwYW4+ICRtbHRIaXQuZ2V0RmllbGRWYWx1ZSgnbmFtZScpPC9kaXY+CisgICAgICAgIDxkaXY+PHNwYW4gY2xhc3M9ImZpZWxkLW5hbWUiPlByaWNlOjwvc3Bhbj4gJCFudW1iZXIuY3VycmVuY3koJG1sdEhpdC5nZXRGaWVsZFZhbHVlKCdwcmljZScpKSA8c3BhbiBjbGFzcz0iZmllbGQtbmFtZSI+SW4gU3RvY2s6PC9zcGFuPiAkbWx0SGl0LmdldEZpZWxkVmFsdWUoJ2luU3RvY2snKTwvZGl2PgorCisgICAgICA8L2xpPgorICAgICNlbmQKKyAgPC91bD4KKyAgI2Vsc2VpZigkbWx0T24gJiYgJG1sdC5zaXplKCkgPT0gMCkKKyAgICA8ZGl2Pk5vIFNpbWlsYXIgSXRlbXMgRm91bmQ8L2Rpdj4KKyAgI2VuZAorPC9kaXY+CisjcGFyc2UoJ2RlYnVnLnZtJykKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3F1ZXJ5LnZtIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcXVlcnkudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiYWIzZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3F1ZXJ5LnZtCkBAIC0wLDAgKzEsNDIgQEAKKzxkaXYgY2xhc3M9InF1ZXJ5LWJveCI+CisgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiN7dXJsX2Zvcl9ob21lfSIgbWV0aG9kPSJHRVQiPgorICAgIDxkaXYgY2xhc3M9ImlucHV0cyI+CisgICAgICA8c3BhbiAjYW5uVGl0bGUoIkFkZCB0aGUgcXVlcnkgdXNpbmcgdGhlICZxPSBwYXJhbWV0ZXIiKT5GaW5kOiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InEiIG5hbWU9InEiIHZhbHVlPSIkIWVzYy5odG1sKCRwYXJhbXMuZ2V0KCdxJykpIi8+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJxdWVyeVN1Ym1pdCIvPiA8aW5wdXQgdHlwZT0icmVzZXQiLz48L3NwYW4+CisgICAgICA8ZGl2IGNsYXNzPSJxdWVyeS1ib29zdCI+PHNwYW4gI2FublRpdGxlKCJBZGQgdGhlIGJvb3N0IGZ1bmN0aW9uICZiZj1wcmljZSB0byB0aGUgcXVlcnkiKT48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJmIiB2YWx1ZT0icHJpY2UiICNpZigkcmVxdWVzdC5wYXJhbXMuZ2V0KCdiZicpID09ICdwcmljZScpY2hlY2tlZD0idHJ1ZSIjZW5kPkJvb3N0IGJ5IFByaWNlPC9pbnB1dD48L3NwYW4+CisgICAgICAjcGFyc2UoInF1ZXJ5U3BhdGlhbC52bSIpCisgICAgICAjcGFyc2UoInF1ZXJ5R3JvdXAudm0iKQorICAgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgI2lmKCRyZXF1ZXN0LnBhcmFtcy5nZXQoJ2RlYnVnUXVlcnknKSkKKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRlYnVnUXVlcnkiIHZhbHVlPSJ0cnVlIi8+CisgICAgI2VuZAorICAgICNpZigkYW5ub3RhdGUgPT0gdHJ1ZSkKKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFubm90YXRlQnJvd3NlIiB2YWx1ZT0idHJ1ZSIvPgorICAgICNlbmQKKyAgICAjZm9yZWFjaCgkZnEgaW4gJHJlcXVlc3QucGFyYW1zLmdldFBhcmFtcygnZnEnKSkKKyAgICAgICNpZiAoJGZxICE9ICJ7IWJib3h9IikKKyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZnEiIGlkPSJhbGxGUXMiIHZhbHVlPSIkZXNjLmh0bWwoJGZxKSIvPgorICAgICAgI2VuZAorICAgICNlbmQKKyAgICA8ZGl2IGNsYXNzPSJjb25zdHJhaW50cyIgI2FublRpdGxlKCJMaXN0cyBvdXQgdGhlICZmcSBmaWx0ZXJzLiAgQ2xpY2sgdG8gcmVtb3ZlLiIpPgorICAgICAgI2ZvcmVhY2goJGZxIGluICRwYXJhbXMuZ2V0UGFyYW1zKCdmcScpKQorICAgICAgICAjc2V0KCRwcmV2aW91c19mcV9jb3VudD0kdmVsb2NpdHlDb3VudCAtIDEpCisgICAgICAgICNpZigkZnEgIT0gJycpCisgICAgICAgICZndDsgPGEgc3R5bGU9Int0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDt9IiBocmVmPSIjdXJsX2Zvcl9maWx0ZXJzKCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2ZxJykuc3ViTGlzdCgwLCRwcmV2aW91c19mcV9jb3VudCkpIj4kZnE8L2E+CisgICAgICAgICNlbmQKKyAgICAgICNlbmQKKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJwYXJzZWRfcXVlcnlfaGVhZGVyIj4KKyAgICAgI2lmKCRyZXF1ZXN0LnBhcmFtcy5nZXQoJ2RlYnVnUXVlcnknKSkKKyAgICAgICAgPGEgaHJlZj0iIyIgb25jbGljaz0nalF1ZXJ5KHRoaXMpLnNpYmxpbmdzKCJkaXYiKS50b2dnbGUoKTsgcmV0dXJuIGZhbHNlOyc+dG9nZ2xlIHBhcnNlZCBxdWVyeTwvYT4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFyc2VkX3F1ZXJ5IiBzdHlsZT0iZGlzcGxheTpub25lIj4kcmVzcG9uc2UucmVzcG9uc2UuZGVidWcucGFyc2VkcXVlcnk8L2Rpdj4KKyAgICAgICNlbmQKKyAgICAgICNzZXQoJHF1ZXJ5T3B0cyA9ICRyZXF1ZXN0LnBhcmFtcy5nZXQoInF1ZXJ5T3B0cyIpKQorICAgICAgI2lmKCRxdWVyeU9wdHMgJiYgJHF1ZXJ5T3B0cyAhPSAiIikKKyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icXVlcnlPcHRzIiB2YWx1ZT0iJHF1ZXJ5T3B0cyIvPgorICAgICAgI2VuZAorICAgIDwvZGl2PgorICA8L2Zvcm0+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcXVlcnlfZm9ybS52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3F1ZXJ5X2Zvcm0udm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMGFmMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3F1ZXJ5X2Zvcm0udm0KQEAgLTAsMCArMSw2NCBAQAorIyoqCisgKiAgUmVuZGVycyB0aGUgbWFpbiBxdWVyeSBmb3JtCisgKiMKKworPGRpdiBjbGFzcz0icXVlcnktYm94Ij4KKyAgPGZvcm0gaWQ9InF1ZXJ5LWZvcm0iIGFjdGlvbj0iI3t1cmxfZm9yX2hvbWV9IiBtZXRob2Q9IkdFVCI+CisKKyAgICA8ZGl2IGNsYXNzPSJpbnB1dHMiPgorICAgICAgPHNwYW4gI2FublRpdGxlKCJBZGQgdGhlIHF1ZXJ5IHVzaW5nIHRoZSAmcT0gcGFyYW1ldGVyIik+CisgICAgICAgIEZpbmQ6CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icSIgbmFtZT0icSIgdmFsdWU9IiQhZXNjLmh0bWwoJHBhcmFtcy5nZXQoJ3EnKSkiLz4KKyAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9InF1ZXJ5U3VibWl0Ii8+CisgICAgICAgIDxpbnB1dCB0eXBlPSJyZXNldCIvPgorICAgICAgPC9zcGFuPgorICAgICAgPGRpdiBjbGFzcz0icXVlcnktYm9vc3QiPgorICAgICAgICA8c3BhbiAjYW5uVGl0bGUoIkFkZCB0aGUgYm9vc3QgZnVuY3Rpb24gJmJmPXByaWNlIHRvIHRoZSBxdWVyeSIpPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmYiIHZhbHVlPSJwcmljZSIKKyAgICAgICAgICAgICNpZigkcmVxdWVzdC5wYXJhbXMuZ2V0KCdiZicpID09ICdwcmljZScpY2hlY2tlZD0idHJ1ZSIjZW5kCisgICAgICAgICAgPgorICAgICAgICAgICAgQm9vc3QgYnkgUHJpY2UKKyAgICAgICAgICA8L2lucHV0PgorICAgICAgICA8L3NwYW4+CisgICAgICAjcGFyc2UoInF1ZXJ5X3NwYXRpYWwudm0iKQorICAgICAgI3BhcnNlKCJxdWVyeV9ncm91cC52bSIpCisgICAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAjaWYoJHJlcXVlc3QucGFyYW1zLmdldCgnZGVidWdRdWVyeScpKQorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZGVidWdRdWVyeSIgdmFsdWU9InRydWUiLz4KKyAgICAjZW5kCisgICAgI2lmKCRhbm5vdGF0ZSA9PSB0cnVlKQorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYW5ub3RhdGVCcm93c2UiIHZhbHVlPSJ0cnVlIi8+CisgICAgI2VuZAorICAgICNmb3JlYWNoKCRmcSBpbiAkcmVxdWVzdC5wYXJhbXMuZ2V0UGFyYW1zKCdmcScpKQorICAgICAgI2lmICgkZnEgIT0gInshYmJveH0iKQorICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmcSIgaWQ9ImFsbEZRcyIgdmFsdWU9IiRlc2MuaHRtbCgkZnEpIi8+CisgICAgICAjZW5kCisgICAgI2VuZAorCisgICAgPGRpdiBjbGFzcz0iY29uc3RyYWludHMiICNhbm5UaXRsZSgiTGlzdHMgb3V0IHRoZSAmZnEgZmlsdGVycy4gIENsaWNrIHRvIHJlbW92ZS4iKT4KKyAgICAgICNmb3JlYWNoKCRmcSBpbiAkcGFyYW1zLmdldFBhcmFtcygnZnEnKSkKKyAgICAgICAgI3NldCgkcHJldmlvdXNfZnFfY291bnQ9JHZlbG9jaXR5Q291bnQgLSAxKQorICAgICAgICAjaWYoJGZxICE9ICcnKQorICAgICAgICAgICZndDsKKyAgICAgICAgICA8YSBzdHlsZT0ie3RleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO30iCisgICAgICAgICAgICBocmVmPSIjdXJsX2Zvcl9maWx0ZXJzKCRyZXF1ZXN0LnBhcmFtcy5nZXRQYXJhbXMoJ2ZxJykuc3ViTGlzdCgwLCRwcmV2aW91c19mcV9jb3VudCkpIgorICAgICAgICAgID4kZnE8L2E+CisgICAgICAgICNlbmQKKyAgICAgICNlbmQKKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InBhcnNlZF9xdWVyeV9oZWFkZXIiPgorICAgICAgI2lmKCRyZXF1ZXN0LnBhcmFtcy5nZXQoJ2RlYnVnUXVlcnknKSkKKyAgICAgICAgPGEgaHJlZj0iIyIgb25jbGljaz0nalF1ZXJ5KHRoaXMpLnNpYmxpbmdzKCJkaXYiKS50b2dnbGUoKTsgcmV0dXJuIGZhbHNlOyc+dG9nZ2xlIHBhcnNlZCBxdWVyeTwvYT4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFyc2VkX3F1ZXJ5IiBzdHlsZT0iZGlzcGxheTpub25lIj4kcmVzcG9uc2UucmVzcG9uc2UuZGVidWcucGFyc2VkcXVlcnk8L2Rpdj4KKyAgICAgICNlbmQKKyAgICAgICNzZXQoJHF1ZXJ5T3B0cyA9ICRyZXF1ZXN0LnBhcmFtcy5nZXQoInF1ZXJ5T3B0cyIpKQorICAgICAgI2lmKCRxdWVyeU9wdHMgJiYgJHF1ZXJ5T3B0cyAhPSAiIikKKyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icXVlcnlPcHRzIiB2YWx1ZT0iJHF1ZXJ5T3B0cyIvPgorICAgICAgI2VuZAorICAgIDwvZGl2PgorCisgIDwvZm9ybT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcXVlcnlfZ3JvdXAudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9xdWVyeV9ncm91cC52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU1NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcXVlcnlfZ3JvdXAudm0KQEAgLTAsMCArMSw0MyBAQAorIyoqCisgKiAgUXVlcnkgc2V0dGluZ3MgZm9yIGdyb3VwaW5nIGJ5IGZpZWxkcywKKyAqICBlLmcuOiBNYW51ZmFjdHVyZXIgb3IgUG9wdWxhcml0eQorICojCisKKyNzZXQoJHF1ZXJ5T3B0cyA9ICRwYXJhbXMuZ2V0KCJxdWVyeU9wdHMiKSkKKworI2lmKCRxdWVyeU9wdHMgPT0gImdyb3VwIikKKyAgPGRpdj4KKyAgICAjc2V0KCRncm91cEYgPSAkcmVxdWVzdC5wYXJhbXMuZ2V0KCdncm91cC5maWVsZCcpKQorCisgICAgPGxhYmVsICNhbm5UaXRsZSgiQWRkIHRoZSAmZ3JvdXAuZmllbGQgcGFyYW1ldGVyLiBNdWx0aXNlbGVjdCBpcyBzdXBwb3J0ZWQiKT4KKyAgICAgIEdyb3VwIEJ5OgorICAgICAgPHNlbGVjdCBpZD0iZ3JvdXAiIG5hbWU9Imdyb3VwLmZpZWxkIiBtdWx0aXBsZT0idHJ1ZSI+CisgICAgICAgICMjIFRPRE86IEhhbmRsZSBtdWx0aXBsZSBzZWxlY3RzIGNvcnJlY3RseQorICAgICAgICAjIyBUT0RPOiBmaXggZW1wdHkgLyAiTm8gR3JvdXAiIHNlbGVjdGlvbgorCisgICAgICAgIDxvcHRpb24gdmFsdWU9IiIKKyAgICAgICAgICAjaWYoJGdyb3VwRiA9PSAnJylzZWxlY3RlZD0idHJ1ZSIjZW5kCisgICAgICAgID4KKyAgICAgICAgICBObyBHcm91cAorICAgICAgICA8L29wdGlvbj4KKworICAgICAgICA8b3B0aW9uIHZhbHVlPSJtYW51X2V4YWN0IgorICAgICAgICAgICNpZigkZ3JvdXBGID09ICdtYW51X2V4YWN0JylzZWxlY3RlZD0idHJ1ZSIjZW5kCisgICAgICAgID4KKyAgICAgICAgICBNYW51ZmFjdHVyZXIKKyAgICAgICAgPC9vcHRpb24+CisKKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0icG9wdWxhcml0eSIKKyAgICAgICAgICAjaWYoJGdyb3VwRiA9PSAncG9wdWxhcml0eScpc2VsZWN0ZWQ9InRydWUiI2VuZAorICAgICAgICA+CisgICAgICAgICAgUG9wdWxhcml0eQorICAgICAgICA8L29wdGlvbj4KKworICAgICAgPC9zZWxlY3Q+CisgICAgPC9sYWJlbD4gIAorCisgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZ3JvdXAiIHZhbHVlPSJ0cnVlIi8+CisKKyAgPC9kaXY+CisKKyNlbmQKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3F1ZXJ5X3NwYXRpYWwudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9xdWVyeV9zcGF0aWFsLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzIwNDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9xdWVyeV9zcGF0aWFsLnZtCkBAIC0wLDAgKzEsNzUgQEAKKyMqKgorICogIFF1ZXJ5IGxvZ2ljIGZvciBzZWxlY3RpbmcgbG9jYXRpb24gLyBHZW9zcGF0aWFsIHNlYXJjaAorICojCisKKyNzZXQoJHF1ZXJ5T3B0cyA9ICRwYXJhbXMuZ2V0KCJxdWVyeU9wdHMiKSkKKworI2lmKCRxdWVyeU9wdHMgPT0gInNwYXRpYWwiKQorCisgIDxkaXY+CisKKyAgICAjc2V0KCRsb2MgPSAkcmVxdWVzdC5wYXJhbXMuZ2V0KCdwdCcpKQorICAgICMjIE5vcm1hbGl6ZSBmaXJzdCB0cmlwIHRocm91Z2ggdG8gIm5vbmUiIGJlY2F1c2UKKyAgICAjIyBhbiBlbXB0eSBzdHJpbmcgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UgbGF0ZXIgb24KKyAgICAjaWYoICEgJGxvYyApCisgICAgICAjc2V0KCAkbG9jID0gIm5vbmUiICkKKyAgICAjZW5kCisKKyAgICAjc2V0KCRkaXN0ID0gJHJlcXVlc3QucGFyYW1zLmdldCgnZCcsICIxMCIpKQorCisgICAgIyMgQ2l0aWVzIGZvciBUaGUgU2VsZWN0IExpc3QKKyAgICAjc2V0KCAkY2l0aWVzID0geworICAgICAgIm5vbmUiOiAiTm8gRmlsdGVyIiwKKyAgICAgICI0NS4xNzYxNCwtOTMuODczNDEiOiAiQnVmZmFsbywgTU4iLAorICAgICAgIjM3Ljc3NTIsLTEwMC4wMjMyIjogIkRvZGdlIENpdHksIEtTIiwKKyAgICAgICIzNS4wNzUyLC05Ny4wMzIiOiAiT2tsYWhvbWEgQ2l0eSwgT0siLAorICAgICAgIjM3Ljc3NTIsLTEyMi40MjMyIjogIlNhbiBGcmFuY2lzY28gQ0EiCisgICAgfSkKKworICAgIDxsYWJlbCAjYW5uVGl0bGUoIkFkZCB0aGUgJnB0IHBhcmFtZXRlciIpPgorICAgICAgTG9jYXRpb24gRmlsdGVyOgorICAgICAgPHNlbGVjdCBpZD0icHQiIG5hbWU9InB0Ij4KKworICAgICAgICAjIyBHZW5lcmF0ZSA8b3B0aW9uPiB0YWcgZm9yIGVhY2ggY2l0eQorICAgICAgICAjZm9yZWFjaCggJGNpdHlfbG9uX2xhdCBpbiAkY2l0aWVzLmtleVNldCgpICkKKyAgICAgICAgICAjc2V0KCAkY2l0eV9uYW1lID0gJGNpdGllcy5nZXQoJGNpdHlfbG9uX2xhdCkgKQorICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiRjaXR5X2xvbl9sYXQiCisgICAgICAgICAgICAjaWYoJGxvYyA9PSAkY2l0eV9sb25fbGF0KXNlbGVjdGVkPSJ0cnVlIiNlbmQKKyAgICAgICAgICA+CisgICAgICAgICAgICAkY2l0eV9uYW1lCisgICAgICAgICAgPC9vcHRpb24+CisgICAgICAgICNlbmQKKworICAgICAgPC9zZWxlY3Q+CisKKyAgICA8L2xhYmVsPgorCisgICAgPHNwYW4gI2FublRpdGxlKCJBZGQgdGhlICZkIHBhcmFtZXRlciIpPgorICAgICAgRGlzdGFuY2UgKEtNKToKKyAgICAgIDxpbnB1dCBpZD0iZCIgbmFtZT0iZCIgdHlwZT0idGV4dCIgc2l6ZT0iNiIKKyAgICAgICAgdmFsdWU9IiNpZigkZGlzdCAhPSAnJykke2Rpc3R9I3tlbHNlfTEwI2VuZCIgICMjIFRPRE86IGlzbid0IHRoZSBkZWZhdWx0IG9mIDEwIGFib3ZlIHN1ZmZpY2llbnQ/ICBubyBpZi9lbHNlIG5lZWRlZD8KKyAgICAgIC8+CisgICAgPC9zcGFuPgorCisgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic2ZpZWxkIiB2YWx1ZT0ic3RvcmUiLz4KKyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ic3BhdGlhbEZRIiBuYW1lPSJmcSIgdmFsdWU9IiIvPgorICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InF1ZXJ5T3B0cyIgdmFsdWU9InNwYXRpYWwiLz4gICAgICAgIAorCisgIDwvZGl2PgorCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAkKCcjcXVlcnktZm9ybScpLnN1Ym1pdChmdW5jdGlvbigpIHsKKyAgICAgIGlmICgkKCIjcHQiKS52YWwoKSAhPSAibm9uZSIpIHsKKyAgICAgICAgJCgiI3NwYXRpYWxGUSIpLnZhbCgieyFiYm94fSIpOworICAgICAgfQorICAgICAgJGZxcyA9ICQoIiNhbGxGUXMiKS52YWwoKTsKKyAgICAgICRmcXMgPSAkZnFzLnJlcGxhY2UoInshYmJveH0iLCAiIik7CisgICAgICBpZiAoJGZxcyA9PSAnJyl7CisgICAgICAgICQoIiNhbGxGUXMiKS5yZW1vdmUoKTsKKyAgICAgIH0KKyAgICAgICQoIiNhbGxGUXMiKS52YWwoJGZxcyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9KTsKKyAgPC9zY3JpcHQ+CisKKyNlbmQKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3Jlc3VsdHNfbGlzdC52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3Jlc3VsdHNfbGlzdC52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM1MzJiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvcmVzdWx0c19saXN0LnZtCkBAIC0wLDAgKzEsMjIgQEAKKyMqKgorICogIFJlbmRlciB0aGUgbWFpbiBSZXN1bHRzIExpc3QKKyAqIworCisjIyBVc3VhbGx5IGRpc3BsYXllZCBpbnNpZGUgPGRpdiBjbGFzcz0icmVzdWx0cyI+CisKKyNpZigkcmVzcG9uc2UucmVzcG9uc2UuZ2V0KCdncm91cGVkJykpCisKKyAgI2ZvcmVhY2goJGdyb3VwaW5nIGluICRyZXNwb25zZS5yZXNwb25zZS5nZXQoJ2dyb3VwZWQnKSkKKyAgICAjcGFyc2UoImhpdF9ncm91cGVkLnZtIikKKyAgI2VuZAorCisjZWxzZQorCisgICNmb3JlYWNoKCRkb2MgaW4gJHJlc3BvbnNlLnJlc3VsdHMpCisgICAgI3BhcnNlKCJoaXQudm0iKQorICAgICMjIENhbiBnZXQgYW4gZXh0cmVtZWx5IHNpbXBsZSB2aWV3IG9mIHRoZSBkb2MKKyAgICAjIyB3aGljaCBtaWdodCBiZSBuaWNlciBmb3IgZGVidWdnaW5nCisgICAgIyNwYXJzZSgiaGl0X3BsYWluLnZtIikKKyAgI2VuZAorCisjZW5kCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9yaWNodGV4dF9kb2Mudm0gYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi92ZWxvY2l0eS9yaWNodGV4dF9kb2Mudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4ZDZjYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3JpY2h0ZXh0X2RvYy52bQpAQCAtMCwwICsxLDE1MyBAQAorIyoqCisgKiAgUmVuZGVyIGEgY29tcGxleCBkb2N1bWVudCBpbiB0aGUgcmVzdWx0cyBsaXN0CisgKiMKKworIyMgTG9hZCBNaW1lLVR5cGUgTGlzdCBhbmQgTWFwcGluZworI3BhcnNlKCdtaW1lX3R5cGVfbGlzdHMudm0nKQorIyMgU2V0czoKKyMjICogc3VwcG9ydGVkTWltZVR5cGVzLCBBS0Egc3VwcG9ydGVkdHlwZXMKKyMjICogbWltZUV4dGVuc2lvbnNNYXAsIEFLQSBleHRNYXAKKworIyMgVGl0bGUKKyNpZigkZG9jLmdldEZpZWxkVmFsdWUoJ3RpdGxlJykpCisgICNzZXQoJHRpdGxlID0gJGVzYy5odG1sKCRkb2MuZ2V0Rmlyc3RWYWx1ZSgndGl0bGUnKSkpCisjZWxzZQorICAjc2V0KCR0aXRsZSA9ICJbIiskZG9jLmdldEZpZWxkVmFsdWUoJ2lkJykrIl0iKQorI2VuZAorCisjIyBVUkwKKyNpZigkZG9jLmdldEZpZWxkVmFsdWUoJ3VybCcpKQorICAjc2V0KCR1cmwgPSAkZG9jLmdldEZpZWxkVmFsdWUoJ3VybCcpKQorI2Vsc2VpZigkZG9jLmdldEZpZWxkVmFsdWUoJ3Jlc291cmNlbmFtZScpKQorICAjc2V0KCR1cmwgPSAiZmlsZTovLy8kZG9jLmdldEZpZWxkVmFsdWUoJ3Jlc291cmNlbmFtZScpIikKKyNlbHNlCisgICNzZXQoJHVybCA9ICIkZG9jLmdldEZpZWxkVmFsdWUoJ2lkJykiKQorI2VuZAorCisjIyBTb3J0IG91dCBNaW1lLVR5cGUKKyNzZXQoJGN0ID0gJGxpc3QuZ2V0KCRkb2MuZ2V0Rmlyc3RWYWx1ZSgnY29udGVudF90eXBlJykuc3BsaXQoIjsiKSwwKSkKKyNzZXQoJGZpbGVuYW1lID0gJGRvYy5nZXRGaWVsZFZhbHVlKCdyZXNvdXJjZW5hbWUnKSkKKyNzZXQoJGZpbGV0eXBlID0gZmFsc2UpCisjc2V0KCRmaWxldHlwZSA9ICRtaW1lRXh0ZW5zaW9uc01hcC5nZXQoJGN0KSkKKworIyMgVE9ETzogZmFsbGluZyBiYWNrIHRvIGZpbGUgZXh0ZW5zaW9uIGlzIGNvbnZlbmllbnQsCisjIyBleGNlcHQgd2hlbiB5b3UgZG9uJ3QgaGF2ZSBhbiBpY29uIGZvciB0aGF0IGV4dGVuc2lvbgorIyMgZXhhbXBsZSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiCisjIyBkb2N1bWVudCB3aXRoIGEgLmRvY3ggZXh0ZW5zaW9uLgorIyMgSXQnZCBiZSBuaWNlIHRvIGZhbGwgYmFjayB0byBhbiAidW5rbm93biIgb3IgdGhlIGV4aXN0aW5nICJmaWxlIiB0eXBlCisjIyBXZSBzb3J0IG9mIGRvIHRoaXMgYmVsb3csIGJ1dCBvbmx5IGlmIHRoZSBmaWxlbmFtZSBoYXMgbm8gZXh0ZW5zaW9uCisjIyAoYW55dGhpbmcgYWZ0ZXIgdGhlIGxhc3QgZG90KS4KKworI2lmKCEkZmlsZXR5cGUpCisgICNzZXQoJGZpbGV0eXBlID0gJGZpbGVuYW1lLnN1YnN0cmluZygkZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKSkuc3Vic3RyaW5nKDEpKQorI2VuZAorCisjIyAjaWYoISRmaWxldHlwZSkKKyMjICAgI3NldCgkZmlsZXR5cGUgPSAiZmlsZSIpCisjIyAjZW5kCisjIyAjaWYoISRzdXBwb3J0ZWRNaW1lVHlwZXMuY29udGFpbnMoJGZpbGV0eXBlKSkKKyMjICAgI3NldCgkZmlsZXR5cGUgPSAiZmlsZSIpCisjIyAjZW5kCisKKyMjIFJvdyAxOiBJY29uIGFuZCBUaXRsZSBhbmQgbWx0IGxpbmsKKzxkaXYgY2xhc3M9InJlc3VsdC10aXRsZSI+CisgICMjIEljb24KKyAgIyMgU21hbGwgZmlsZSB0eXBlIGljb25zIGZyb20gaHR0cDovL3d3dy5zcGxpdGJyYWluLm9yZy9wcm9qZWN0cy9maWxlX2ljb25zIChwdWJsaWMgZG9tYWluKQorICA8aW1nIHNyYz0iI3t1cmxfcm9vdH0vaW1nL2ZpbGV0eXBlcy8ke2ZpbGV0eXBlfS5wbmciIGFsaWduPSJjZW50ZXIiPgorCisgICMjIFRpdGxlLCBoeXBlcmxpbmtlZAorICA8YSBocmVmPSIke3VybH0iIHRhcmdldD0iX2JsYW5rIj4KKyAgICA8Yj4kdGl0bGU8L2I+PC9hPgorCisgICMjIExpbmsgZm9yIE1MVCAvIE1vcmUgTGlrZSBUaGlzIC8gRmluZCBTaW1pbGFyCisgIDxzcGFuIGNsYXNzPSJtbHQiPgorICAgICNpZigkcGFyYW1zLmdldEJvb2woJ21sdCcsIGZhbHNlKSA9PSBmYWxzZSkKKyAgICAgIDxhIGhyZWY9IiNsZW5zTm9RJnE9aWQ6JTIyJGRvY0lkJTIyJm1sdD10cnVlIj4KKyAgICAgICAgTW9yZSBMaWtlIFRoaXM8L2E+CisgICAgI2VuZAorICA8L3NwYW4+CisKKzwvZGl2PgorCisjIyBSb3cgMj86IElEIC8gVVJMCis8ZGl2PgorICBJZDogI2ZpZWxkKCdpZCcpCis8L2Rpdj4KKworIyMgUmVzb3VyY2UgTmFtZQorPGRpdj4KKyAgI2lmKCRkb2MuZ2V0RmllbGRWYWx1ZSgncmVzb3VyY2VuYW1lJykpCisgICAgUmVzb3VyY2UgbmFtZTogJGZpbGVuYW1lIAorICAjZWxzZWlmKCR1cmwpCisgICAgVVJMOiAkdXJsCisgICNlbmQKKyAgI2lmKCRjdCkKKyAgICAoJGN0KQorICAjZW5kCis8L2Rpdj4KKworIyMgQXV0aG9yCisjaWYoJGRvYy5nZXRGaWVsZFZhbHVlKCdhdXRob3InKSkKKyAgPGRpdj4KKyAgICBBdXRob3I6ICNmaWVsZCgnYXV0aG9yJykKKyAgPC9kaXY+CisjZW5kCisKKyMjIExhc3RfTW9kaWZpZWQgRGF0ZQorI2lmKCRkb2MuZ2V0RmllbGRWYWx1ZSgnbGFzdF9tb2RpZmllZCcpKQorICA8ZGl2PgorICAgIGxhc3QtbW9kaWZpZWQ6CisgICAgI2ZpZWxkKCdsYXN0X21vZGlmaWVkJykKKyAgPC9kaXY+CisjZW5kCisKKyMjIE1haW4gY29udGVudCBvZiBkb2MKKzxkaXYgY2xhc3M9InJlc3VsdC1ib2R5Ij4KKyAgI2ZpZWxkKCdjb250ZW50JykKKzwvZGl2PgorCisjIyBEaXNwbGF5IFNpbWlsYXIgRG9jdW1lbnRzIC8gTUxUID0gTW9yZSBMaWtlIFRoaXMKKzxkaXYgY2xhc3M9Im1sdCI+CisgICNzZXQoJG1sdCA9ICRtbHRSZXN1bHRzLmdldCgkZG9jSWQpKQorICAjc2V0KCRtbHRPbiA9ICRwYXJhbXMuZ2V0Qm9vbCgnbWx0JykpCisgICNpZigkbWx0T24gPT0gdHJ1ZSkKKyAgICA8ZGl2IGNsYXNzPSJmaWVsZC1uYW1lIj4KKyAgICAgIFNpbWlsYXIgSXRlbXMKKyAgICA8L2Rpdj4KKyAgI2VuZAorICAjIyBJZiBoYXMgTUxUIGVuYWJsZWQgQW4gRW50cmllcyB0byBzaG93CisgICNpZiAoJG1sdE9uICYmICRtbHQgJiYgJG1sdC5zaXplKCkgPiAwKQorICAgIDx1bD4KKyAgICAgICNmb3JlYWNoKCRtbHRIaXQgaW4gJG1sdCkKKyAgICAgICAgI3NldCgkbWx0SWQgPSAkbWx0SGl0LmdldEZpZWxkVmFsdWUoJ2lkJykpCisgICAgICAgIDxsaT4KKyAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgPGEgaHJlZj0iI3VybF9mb3JfaG9tZT9xPWlkOiRtbHRJZCI+CisgICAgICAgICAgICAgICRtbHRJZDwvYT4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZpZWxkLW5hbWUiPgorICAgICAgICAgICAgICBUaXRsZToKKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICRtbHRIaXQuZ2V0RmllbGRWYWx1ZSgndGl0bGUnKQorICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmllbGQtbmFtZSI+CisgICAgICAgICAgICAgIEF1dGhvcjoKKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICRtbHRIaXQuZ2V0RmllbGRWYWx1ZSgnYXV0aG9yJykKKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmaWVsZC1uYW1lIj4KKyAgICAgICAgICAgICAgRGVzY3JpcHRpb246CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAkbWx0SGl0LmdldEZpZWxkVmFsdWUoJ2Rlc2NyaXB0aW9uJykKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9saT4KKyAgICAgICNlbmQgICAgIyMgZW5kIGZvciBlYWNoIG1sdEhpdCBpbiAkbWx0CisgICAgPC91bD4KKyAgIyMgRWxzZSBNTFQgRW5hYmxlZCBidXQgbm8gbWx0IHJlc3VsdHMgZm9yIHRoaXMgcXVlcnkKKyAgI2Vsc2VpZigkbWx0T24gJiYgJG1sdC5zaXplKCkgPT0gMCkKKyAgICA8ZGl2Pk5vIFNpbWlsYXIgSXRlbXMgRm91bmQ8L2Rpdj4KKyAgI2VuZAorPC9kaXY+ICAjIyBkaXYgY2xhc3M9bWx0CisKKyNwYXJzZSgnZGVidWcudm0nKQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvc3VnZ2VzdC52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3N1Z2dlc3Qudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlNmI4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3N1Z2dlc3Qudm0KQEAgLTAsMCArMSw4IEBACisjKioKKyAqICBQcm92aWRlcyBjeW5hbWljIHNwZWxsaW5nIHN1Z2dlc3Rpb25zCisgKiAgYXMgeW91IHR5cGUgaW4gdGhlIHNlYXJjaCBmb3JtCisgKiMKKworI2ZvcmVhY2goJHQgaW4gJHJlc3BvbnNlLnJlc3BvbnNlLnRlcm1zLm5hbWUpCisgICR0LmtleQorI2VuZApkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYvdmVsb2NpdHkvdGFicy52bSBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3RhYnMudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExOWNiYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3ZlbG9jaXR5L3RhYnMudm0KQEAgLTAsMCArMSw1MCBAQAorIyoqCisgKiAgUHJvdmlkZXMgbmF2aWdhdGlvbi9hY2Nlc3MgdG8gQWR2YW5jZWQgc2VhcmNoIG9wdGlvbnMKKyAqICBVc3VhbGx5IGRpc3BsYXllZCBuZWFyIHRoZSB0b3Agb2YgdGhlIHBhZ2UKKyAqIworCisjI1RPRE86IE1ha2Ugc29tZSBuaWNlIHRhYnMgaGVyZQorCisjc2V0KCRxdWVyeU9wdHMgPSAkcGFyYW1zLmdldCgicXVlcnlPcHRzIikpCisKKzxkaXYgY2xhc3M9InRhYnMtYmFyIiAjYW5uVGl0bGUoIkNsaWNrIHRoZSBsaW5rIHRvIGRlbW9uc3RyYXRlIHZhcmlvdXMgU29sciBjYXBhYmlsaXRpZXMiKT4KKworICA8c3Bhbj5UeXBlIG9mIFNlYXJjaDo8L3NwYW4+CisKKyAgIyNxdWVyeU9wdHM9JHF1ZXJ5T3B0cworCisgICMjIHJldHVybiB0byBTaW1wbGUgU2VhcmNoCisgICMjc2V0KCAkc2VsZWN0ZWQgPSAoJHF1ZXJ5T3B0cyAmJiAkcXVlcnlPcHRzICE9ICIiKSApCisgICNzZXQoICRzZWxlY3RlZCA9ICEgJHF1ZXJ5T3B0cyApCisgIDxzcGFuIGNsYXNzPSJ0YWIgI2lmKCRzZWxlY3RlZClzZWxlY3RlZCNlbmQiPgorICAgICNpZigkc2VsZWN0ZWQpCisgICAgICBTaW1wbGUKKyAgICAjZWxzZQorICAgICAgPGEgaHJlZj0iI3VybF9mb3JfaG9tZS8/I2RlYnVnI2Fubm90YXRlIj4KKyAgICAgICAgU2ltcGxlPC9hPgorICAgICNlbmQKKyAgPC9zcGFuPgorCisgICMjIEdFTy1TcGF0aWFsIC8gTG9jYXRpb24gQmFzZWQKKyAgI3NldCggJHNlbGVjdGVkID0gKCRxdWVyeU9wdHMgPT0gInNwYXRpYWwiKSApCisgIDxzcGFuIGNsYXNzPSJ0YWIgI2lmKCRzZWxlY3RlZClzZWxlY3RlZCNlbmQiPgorICAgICNpZigkc2VsZWN0ZWQpCisgICAgICBTcGF0aWFsCisgICAgI2Vsc2UKKyAgICAgIDxhIGhyZWY9IiN1cmxfZm9yX2hvbWU/JnF1ZXJ5T3B0cz1zcGF0aWFsI2RlYnVnI2Fubm90YXRlIj4KKyAgICAgICAgU3BhdGlhbDwvYT4KKyAgICAjZW5kCisgIDwvc3Bhbj4KKworICAjIyBHcm91cCBCeSBGaWVsZAorICAjc2V0KCAkc2VsZWN0ZWQgPSAoJHF1ZXJ5T3B0cyA9PSAiZ3JvdXAiKSApCisgIDxzcGFuIGNsYXNzPSJ0YWIgI2lmKCRzZWxlY3RlZClzZWxlY3RlZCNlbmQiPgorICAgICNpZigkc2VsZWN0ZWQpCisgICAgICBHcm91cCBCeQorICAgICNlbHNlCisgICAgICA8YSBocmVmPSIjdXJsX2Zvcl9ob21lPyNkZWJ1ZyNhbm5vdGF0ZSZxdWVyeU9wdHM9Z3JvdXAmZ3JvdXA9dHJ1ZSZncm91cC5maWVsZD1tYW51X2V4YWN0Ij4KKyAgICAgICAgR3JvdXAgQnk8L2E+CisgICAgI2VuZAorICA8L3NwYW4+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYveHNsdC9leGFtcGxlLnhzbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvZXhhbXBsZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OTI3MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvZXhhbXBsZS54c2wKQEAgLTAsMCArMSwxMzIgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+CisKKzwhLS0gCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPCEtLSAKKyAgU2ltcGxlIHRyYW5zZm9ybSBvZiBTb2xyIHF1ZXJ5IHJlc3VsdHMgdG8gSFRNTAorIC0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249JzEuMCcKKyAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScKKz4KKworICA8eHNsOm91dHB1dCBtZWRpYS10eXBlPSJ0ZXh0L2h0bWwiIGVuY29kaW5nPSJVVEYtOCIvPiAKKyAgCisgIDx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiIHNlbGVjdD0iY29uY2F0KCdTb2xyIHNlYXJjaCByZXN1bHRzICgnLHJlc3BvbnNlL3Jlc3VsdC9AbnVtRm91bmQsJyBkb2N1bWVudHMpJykiLz4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Jy8nPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNzcyIvPgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9oMT4KKyAgICAgICAgPGRpdiBjbGFzcz0ibm90ZSI+CisgICAgICAgICAgVGhpcyBoYXMgYmVlbiBmb3JtYXR0ZWQgYnkgdGhlIHNhbXBsZSAiZXhhbXBsZS54c2wiIHRyYW5zZm9ybSAtCisgICAgICAgICAgdXNlIHlvdXIgb3duIFhTTFQgdG8gZ2V0IGEgbmljZXIgcGFnZQorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwb3MiIHNlbGVjdD0icG9zaXRpb24oKSIvPgorICAgIDxkaXYgY2xhc3M9ImRvYyI+CisgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icG9zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvcyIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qW0BuYW1lPSdzY29yZSddIiBwcmlvcml0eT0iMTAwIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBvcyI+PC94c2w6cGFyYW0+CisgICAgPHRyPgorICAgICAgPHRkIGNsYXNzPSJuYW1lIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICA8L3RkPgorICAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisKKyAgICAgICAgPHhzbDppZiB0ZXN0PSJib29sZWFuKC8vbHN0W0BuYW1lPSdleHBsYWluJ10pIj4KKyAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+CisgICAgICAgICAgICA8IS0tIGNhbid0IGFsbG93IHdoaXRlc3BhY2UgaGVyZSAtLT4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6dG9nZ2xlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdleHAtJywkcG9zKSIgLz4iKTs8L3hzbDphdHRyaWJ1dGU+PzwveHNsOmVsZW1lbnQ+CisgICAgICAgICAgPGJyLz4KKyAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGl2Ij4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5leHA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+CisgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ2V4cC0nLCRwb3MpIiAvPgorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8vbHN0W0BuYW1lPSdleHBsYWluJ10vc3RyW3Bvc2l0aW9uKCk9JHBvc10iLz4KKyAgICAgICAgICA8L3hzbDplbGVtZW50PgorICAgICAgICA8L3hzbDppZj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jL2FyciIgcHJpb3JpdHk9IjEwMCI+CisgICAgPHRyPgorICAgICAgPHRkIGNsYXNzPSJuYW1lIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICA8L3RkPgorICAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+CisgICAgICAgIDx1bD4KKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IioiPgorICAgICAgICAgIDxsaT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvbGk+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3VsPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qIj4KKyAgICA8dHI+CisgICAgICA8dGQgY2xhc3M9Im5hbWUiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgY2xhc3M9InZhbHVlIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPgorICAKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjc3MiPgorICAgIDxzY3JpcHQ+CisgICAgICBmdW5jdGlvbiB0b2dnbGUoaWQpIHsKKyAgICAgICAgdmFyIG9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKKyAgICAgICAgb2JqLnN0eWxlLmRpc3BsYXkgPSAob2JqLnN0eWxlLmRpc3BsYXkgIT0gJ2Jsb2NrJykgPyAnYmxvY2snIDogJ25vbmUnOworICAgICAgfQorICAgIDwvc2NyaXB0PgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsgZm9udC1mYW1pbHk6ICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZiB9CisgICAgICB0ZC5uYW1lIHsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXNpemU6ODAlOyB9CisgICAgICB0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0KKyAgICAgIHVsIHsgbWFyZ2luOiAwcHg7IG1hcmdpbi1sZWZ0OiAxZW07IHBhZGRpbmc6IDBweDsgfQorICAgICAgLm5vdGUgeyBmb250LXNpemU6ODAlOyB9CisgICAgICAuZG9jIHsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItdG9wOiBzb2xpZCBncmV5IDFweDsgfQorICAgICAgLmV4cCB7IGRpc3BsYXk6IG5vbmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHdoaXRlLXNwYWNlOiBwcmU7IH0KKyAgICA8L3N0eWxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvZXhhbXBsZV9hdG9tLnhzbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvZXhhbXBsZV9hdG9tLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmMyMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYveHNsdC9leGFtcGxlX2F0b20ueHNsCkBAIC0wLDAgKzEsNjcgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+CisKKzwhLS0gCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPCEtLSAKKyAgU2ltcGxlIHRyYW5zZm9ybSBvZiBTb2xyIHF1ZXJ5IHJlc3VsdHMgdG8gQXRvbQorIC0tPgorCis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0nMS4wJworICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJz4KKworICA8eHNsOm91dHB1dAorICAgICAgIG1ldGhvZD0ieG1sIgorICAgICAgIGVuY29kaW5nPSJ1dGYtOCIKKyAgICAgICBtZWRpYS10eXBlPSJhcHBsaWNhdGlvbi94bWwiCisgIC8+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeSIgc2VsZWN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J3Jlc3BvbnNlSGVhZGVyJ10vbHN0W0BuYW1lPSdwYXJhbXMnXS9zdHJbQG5hbWU9J3EnXSIvPgorICAgIDxmZWVkIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iPgorICAgICAgPHRpdGxlPkV4YW1wbGUgU29sciBBdG9tIDEuMCBGZWVkPC90aXRsZT4KKyAgICAgIDxzdWJ0aXRsZT4KKyAgICAgICBUaGlzIGhhcyBiZWVuIGZvcm1hdHRlZCBieSB0aGUgc2FtcGxlICJleGFtcGxlX2F0b20ueHNsIiB0cmFuc2Zvcm0gLQorICAgICAgIHVzZSB5b3VyIG93biBYU0xUIHRvIGdldCBhIG5pY2VyIEF0b20gZmVlZC4KKyAgICAgIDwvc3VidGl0bGU+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8bmFtZT5BcGFjaGUgU29scjwvbmFtZT4KKyAgICAgICAgPGVtYWlsPnNvbHItdXNlckBsdWNlbmUuYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxsaW5rIHJlbD0ic2VsZiIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiIAorICAgICAgICAgICAgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvcT17JHF1ZXJ5fSZhbXA7d3Q9eHNsdCZhbXA7dHI9YXRvbS54c2wiLz4KKyAgICAgIDx1cGRhdGVkPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0icmVzcG9uc2UvcmVzdWx0L2RvY1twb3NpdGlvbigpPTFdL2RhdGVbQG5hbWU9J3RpbWVzdGFtcCddIi8+CisgICAgICA8L3VwZGF0ZWQ+CisgICAgICA8aWQ+dGFnOmxvY2FsaG9zdCwyMDA3OmV4YW1wbGU8L2lkPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+CisgICAgPC9mZWVkPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgICAKKyAgPCEtLSBzZWFyY2ggcmVzdWx0cyB4c2x0IC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaWQiIHNlbGVjdD0ic3RyW0BuYW1lPSdpZCddIi8+CisgICAgPGVudHJ5PgorICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdHJbQG5hbWU9J25hbWUnXSIvPjwvdGl0bGU+CisgICAgICA8bGluayBocmVmPSJodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9zZWxlY3Q/cT17JGlkfSIvPgorICAgICAgPGlkPnRhZzpsb2NhbGhvc3QsMjAwNzo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+PC9pZD4KKyAgICAgIDxzdW1tYXJ5Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhcnJbQG5hbWU9J2ZlYXR1cmVzJ10iLz48L3N1bW1hcnk+CisgICAgICA8dXBkYXRlZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZVtAbmFtZT0ndGltZXN0YW1wJ10iLz48L3VwZGF0ZWQ+CisgICAgPC9lbnRyeT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi94c2x0L2V4YW1wbGVfcnNzLnhzbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvZXhhbXBsZV9yc3MueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTdmMTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi94c2x0L2V4YW1wbGVfcnNzLnhzbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorCis8IS0tIAorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzwhLS0gCisgIFNpbXBsZSB0cmFuc2Zvcm0gb2YgU29sciBxdWVyeSByZXN1bHRzIHRvIFJTUworIC0tPgorCis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0nMS4wJworICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJz4KKworICA8eHNsOm91dHB1dAorICAgICAgIG1ldGhvZD0ieG1sIgorICAgICAgIGVuY29kaW5nPSJ1dGYtOCIKKyAgICAgICBtZWRpYS10eXBlPSJhcHBsaWNhdGlvbi94bWwiCisgIC8+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Jy8nPgorICAgIDxyc3MgdmVyc2lvbj0iMi4wIj4KKyAgICAgICA8Y2hhbm5lbD4KKwkgPHRpdGxlPkV4YW1wbGUgU29sciBSU1MgMi4wIEZlZWQ8L3RpdGxlPgorICAgICAgICAgPGxpbms+aHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHI8L2xpbms+CisgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgVGhpcyBoYXMgYmVlbiBmb3JtYXR0ZWQgYnkgdGhlIHNhbXBsZSAiZXhhbXBsZV9yc3MueHNsIiB0cmFuc2Zvcm0gLQorICAgICAgICAgIHVzZSB5b3VyIG93biBYU0xUIHRvIGdldCBhIG5pY2VyIFJTUyBmZWVkLgorICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgIDxsYW5ndWFnZT5lbi11czwvbGFuZ3VhZ2U+CisgICAgICAgICA8ZG9jcz5odHRwOi8vbG9jYWxob3N0Ojg5ODMvc29scjwvZG9jcz4KKyAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icmVzcG9uc2UvcmVzdWx0L2RvYyIvPgorICAgICAgIDwvY2hhbm5lbD4KKyAgICA8L3Jzcz4KKyAgPC94c2w6dGVtcGxhdGU+CisgIAorICA8IS0tIHNlYXJjaCByZXN1bHRzIHhzbHQgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCIgc2VsZWN0PSJzdHJbQG5hbWU9J2lkJ10iLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVzdGFtcCIgc2VsZWN0PSJkYXRlW0BuYW1lPSd0aW1lc3RhbXAnXSIvPgorICAgIDxpdGVtPgorICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdHJbQG5hbWU9J25hbWUnXSIvPjwvdGl0bGU+CisgICAgICA8bGluaz4KKyAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvc2VsZWN0P3E9aWQ6PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpZCIvPgorICAgICAgPC9saW5rPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXJyW0BuYW1lPSdmZWF0dXJlcyddIi8+CisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPHB1YkRhdGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aW1lc3RhbXAiLz48L3B1YkRhdGU+CisgICAgICA8Z3VpZD4KKyAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvc2VsZWN0P3E9aWQ6PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpZCIvPgorICAgICAgPC9ndWlkPgorICAgIDwvaXRlbT4KKyAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYveHNsdC9sdWtlLnhzbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvbHVrZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1M2YzYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb25mL3hzbHQvbHVrZS54c2wKQEAgLTAsMCArMSwzMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisKKzwhLS0gCisgIERpc3BsYXkgdGhlIGx1a2UgcmVxdWVzdCBoYW5kbGVyIHdpdGggZ3JhcGhzCisgLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKKyAgICB2ZXJzaW9uPSIxLjAiCisgICAgPgorICAgIDx4c2w6b3V0cHV0CisgICAgICAgIG1ldGhvZD0iaHRtbCIKKyAgICAgICAgZW5jb2Rpbmc9IlVURi04IgorICAgICAgICBtZWRpYS10eXBlPSJ0ZXh0L2h0bWwiCisgICAgICAgIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAgICAgZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiCisgICAgLz4KKworICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPlNvbHIgTHVrZSBSZXF1ZXN0IEhhbmRsZXIgUmVzcG9uc2U8L3hzbDp2YXJpYWJsZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzb2xyLWFkbWluLmNzcyIvPgorICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iZmF2aWNvbi5pY28iIHR5cGU9ImltYWdlL2ljbyIvPgorICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZmF2aWNvbi5pY28iIHR5cGU9ImltYWdlL2ljbyIvPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPgorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNzcyIvPgorCisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgICAgICA8aDE+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz4KKyAgICAgICAgICAgICAgICA8L2gxPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvYyI+CisgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdpbmRleCddIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNpbmRleCI+SW5kZXggU3RhdGlzdGljczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0nZmllbGRzJ10iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2ZpZWxkcyI+RmllbGQgU3RhdGlzdGljczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0nZmllbGRzJ10vbHN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiN7QG5hbWV9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdkb2MnXSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjZG9jIj5Eb2N1bWVudCBzdGF0aXN0aWNzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0naW5kZXgnXSI+CisgICAgICAgICAgICAgICAgICAgIDxoMj48YSBuYW1lPSJpbmRleCIvPkluZGV4IFN0YXRpc3RpY3M8L2gyPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0naW5kZXgnXSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdmaWVsZHMnXSI+CisgICAgICAgICAgICAgICAgICAgIDxoMj48YSBuYW1lPSJmaWVsZHMiLz5GaWVsZCBTdGF0aXN0aWNzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2ZpZWxkcyddIi8+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2RvYyddIj4KKyAgICAgICAgICAgICAgICAgICAgPGgyPjxhIG5hbWU9ImRvYyIvPkRvY3VtZW50IHN0YXRpc3RpY3M8L2gyPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0nZG9jJ10iLz4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgPC9odG1sPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibHN0Ij4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJwYXJlbnQ6OmxzdCI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imxpc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChwYXJlbnQ6OmxzdCkiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGlzdCIvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwveHNsOmlmPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJsaXN0Ij4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChjaGlsZDo6Kik+MCI+CisgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9IntAbmFtZX0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q9IkBuYW1lPSdoaXN0b2dyYW0nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJoaXN0b2dyYW0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iaGlzdG9ncmFtIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iZG9jIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJiYXJjaGFydCI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heF9iYXJfd2lkdGgiPjUwPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaXdpZHRoIj44MDA8L3hzbDp3aXRoLXBhcmFtPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpaGVpZ2h0Ij4xNjA8L3hzbDp3aXRoLXBhcmFtPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWxsIj5ibHVlPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvZGl2PgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJiYXJjaGFydCI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ibWF4X2Jhcl93aWR0aCIvPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9Iml3aWR0aCIvPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImloZWlnaHQiLz4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJmaWxsIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWF4Ij4KKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnQiPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBkYXRhLXR5cGU9Im51bWJlciIgb3JkZXI9ImRlc2NlbmRpbmciLz4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFycyI+CisgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChpbnQpIi8+CisgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhcl93aWR0aCI+CisgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWF4X2Jhcl93aWR0aCAmbHQ7ICgkaXdpZHRoIGRpdiAkYmFycykiPgorICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXhfYmFyX3dpZHRoIi8+CisgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaXdpZHRoIGRpdiAkYmFycyIvPgorICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJoaXN0b2dyYW0iPgorICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW50Ij4KKyAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imhpc3RvZ3JhbSI+CisgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSI+YmFja2dyb3VuZC1jb2xvcjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWxsIi8+OyB3aWR0aDogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXJfd2lkdGgiLz5weDsgaGVpZ2h0OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKCRpaGVpZ2h0Km51bWJlciguKSkgZGl2ICRtYXgiLz5weDs8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgIDwvdGQ+IAorICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImludCI+CisgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJrZXl2YWx1ZSI+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuYW1lIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW50fGJvb2x8bG9uZ3xmbG9hdHxkb3VibGV8dXVpZHxkYXRlIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleXZhbHVlIi8+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJhcnIiPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPgorICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNoaWxkOjoqIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InN0ciI+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuYW1lPSdzY2hlbWEnIG9yIEBuYW1lPSdpbmRleCcgb3IgQG5hbWU9J2ZsYWdzJyI+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNjaGVtYSIvPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXl2YWx1ZSIvPgorICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNjaGVtYSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibmFtZSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb250YWlucyguLCd1bnN0b3JlZCcpIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChjb250YWlucyguLCd1bnN0b3JlZCcpKSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmZvY2hhcjJzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoYXJMaXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImluZm9jaGFyMnN0cmluZyI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iaSI+MTwveHNsOnBhcmFtPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImNoYXJMaXN0Ii8+CisKKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGFyIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmcoJGNoYXJMaXN0LCRpLDEpIi8+CisgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nSSciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nSSddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nVCciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nVCddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nUyciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nUyddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nTSciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nTSddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nViciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nViddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nbyciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nbyddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0ncCciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0ncCddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nTyciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nTyddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nTCciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nTCddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nQiciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nQiddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nQyciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nQyddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nZiciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nZiddIi8+IC0gPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nbCciPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nbCddIi8+IC0KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgIDwveHNsOmNob29zZT4KKworICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkaT49c3RyaW5nLWxlbmd0aCgkY2hhckxpc3QpKSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5mb2NoYXIyc3RyaW5nIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaSsxIi8+CisgICAgICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hhckxpc3QiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNoYXJMaXN0Ii8+CisgICAgICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOmlmPgorICAgIDwveHNsOnRlbXBsYXRlPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iY3NzIj4KKyAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgICAgIDwhW0NEQVRBWworICAgICAgICAgICAgdGQubmFtZSB7Zm9udC1zdHlsZTogaXRhbGljOyBmb250LXNpemU6ODAlOyB9CisgICAgICAgICAgICAuZG9jIHsgbWFyZ2luOiAwLjVlbTsgYm9yZGVyOiBzb2xpZCBncmV5IDFweDsgfQorICAgICAgICAgICAgLmV4cCB7IGRpc3BsYXk6IG5vbmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHdoaXRlLXNwYWNlOiBwcmU7IH0KKyAgICAgICAgICAgIGRpdi5oaXN0b2dyYW0geyBiYWNrZ3JvdW5kOiBub25lIHJlcGVhdCBzY3JvbGwgMCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDt9CisgICAgICAgICAgICB0YWJsZS5oaXN0b2dyYW0geyB3aWR0aDogYXV0bzsgdmVydGljYWwtYWxpZ246IGJvdHRvbTsgfQorICAgICAgICAgICAgdGFibGUuaGlzdG9ncmFtIHRkLCB0YWJsZS5oaXN0b2dyYW0gdGggeyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBib3R0b207IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmY5OTMzOyB3aWR0aDogYXV0bzsgfQorICAgICAgICAgICAgXV0+CisgICAgICAgIDwvc3R5bGU+CisgICAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYveHNsdC91cGRhdGVYbWwueHNsIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9vb2R0LWZtL2NvbmYveHNsdC91cGRhdGVYbWwueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjEzNDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29uZi94c2x0L3VwZGF0ZVhtbC54c2wKQEAgLTAsMCArMSw3MCBAQAorPCEtLSAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tCisgIFNpbXBsZSB0cmFuc2Zvcm0gb2YgU29sciBxdWVyeSByZXNwb25zZSBpbnRvIFNvbHIgVXBkYXRlIFhNTCBjb21wbGlhbnQgWE1MLgorICBXaGVuIHVzZWQgaW4gdGhlIHhzbHQgcmVzcG9uc2Ugd3JpdGVyIHlvdSB3aWxsIGdldCBVcGRhYXRlWE1MIGFzIG91dHB1dC4KKyAgQnV0IHlvdSBjYW4gYWxzbyBzdG9yZSBhIHF1ZXJ5IHJlc3BvbnNlIFhNTCB0byBkaXNrIGFuZCBmZWVkIHRoaXMgWE1MIHRvCisgIHRoZSBYU0xUVXBkYXRlUmVxdWVzdEhhbmRsZXIgdG8gaW5kZXggdGhlIGNvbnRlbnQuIFByb3ZpZGVkIGFzIGV4YW1wbGUgb25seS4KKyAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Yc2x0VXBkYXRlUmVxdWVzdEhhbmRsZXIgZm9yIG1vcmUgaW5mbworIC0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249JzEuMCcgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nPgorICA8eHNsOm91dHB1dCBtZWRpYS10eXBlPSJ0ZXh0L3htbCIgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+CisgICAgPGFkZD4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+CisgICAgPC9hZGQ+CisgIDwveHNsOnRlbXBsYXRlPgorICAKKyAgPCEtLSBJZ25vcmUgc2NvcmUgKG1ha2VzIG5vIHNlbnNlIHRvIGluZGV4KSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jLypbQG5hbWU9J3Njb3JlJ10iIHByaW9yaXR5PSIxMDAiPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zIiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4KKyAgICA8ZG9jPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icG9zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvcyIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICA8L2RvYz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBGbGF0dGVuIGFycmF5cyB0byBkdXBsaWNhdGUgZmllbGQgbGluZXMgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy9hcnIiIHByaW9yaXR5PSIxMDAiPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmbiIgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgCisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iKiI+CisJCTx4c2w6ZWxlbWVudCBuYW1lPSJmaWVsZCI+CisJCSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZuIi8+PC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKwkJPC94c2w6ZWxlbWVudD4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qIj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZm4iIHNlbGVjdD0iQG5hbWUiLz4KKworCTx4c2w6ZWxlbWVudCBuYW1lPSJmaWVsZCI+CisJICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZm4iLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisJPC94c2w6ZWxlbWVudD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvb29kdC1mbS9jb3JlLnByb3BlcnRpZXMgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29yZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTJiZjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL29vZHQtZm0vY29yZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK25hbWU9b29kdC1mbQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zb2xyL3NyYy9tYWluL3Jlc291cmNlcy9zb2xyLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvc29sci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNjBiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvc29sci54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSAic29sci54bWwiIGZpbGUgZm9yIGNvbmZpZ3VyaW5nIG9uZSBvciAKKyAgIG1vcmUgU29sciBDb3JlcywgYXMgd2VsbCBhcyBhbGxvd2luZyBDb3JlcyB0byBiZSBhZGRlZCwgcmVtb3ZlZCwgYW5kIAorICAgcmVsb2FkZWQgdmlhIEhUVFAgcmVxdWVzdHMuCisKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIAorICAgYW5kIFNvbHIgQ29yZSBhZG1pbmlzdHJhdGlvbiBjYW4gYmUgZm91bmQgb25saW5lOgorICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL0NvcmVBZG1pbgorLS0+CisKKzxzb2xyPgorCisgIDxzb2xyY2xvdWQ+CisgICAgPHN0ciBuYW1lPSJob3N0Ij4ke2hvc3Q6fTwvc3RyPgorICAgIDxpbnQgbmFtZT0iaG9zdFBvcnQiPiR7amV0dHkucG9ydDo4OTgzfTwvaW50PgorICAgIDxzdHIgbmFtZT0iaG9zdENvbnRleHQiPiR7aG9zdENvbnRleHQ6c29scn08L3N0cj4KKyAgICA8aW50IG5hbWU9InprQ2xpZW50VGltZW91dCI+JHt6a0NsaWVudFRpbWVvdXQ6MzAwMDB9PC9pbnQ+CisgICAgPGJvb2wgbmFtZT0iZ2VuZXJpY0NvcmVOb2RlTmFtZXMiPiR7Z2VuZXJpY0NvcmVOb2RlTmFtZXM6dHJ1ZX08L2Jvb2w+CisgIDwvc29scmNsb3VkPgorCisgIDxzaGFyZEhhbmRsZXJGYWN0b3J5IG5hbWU9InNoYXJkSGFuZGxlckZhY3RvcnkiCisgICAgY2xhc3M9Ikh0dHBTaGFyZEhhbmRsZXJGYWN0b3J5Ij4KKyAgICA8aW50IG5hbWU9InNvY2tldFRpbWVvdXQiPiR7c29ja2V0VGltZW91dDowfTwvaW50PgorICAgIDxpbnQgbmFtZT0iY29ublRpbWVvdXQiPiR7Y29ublRpbWVvdXQ6MH08L2ludD4KKyAgPC9zaGFyZEhhbmRsZXJGYWN0b3J5PgorCis8L3NvbHI+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL3pvby5jZmcgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NvbHIvc3JjL21haW4vcmVzb3VyY2VzL3pvby5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhNDUxOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc29sci9zcmMvbWFpbi9yZXNvdXJjZXMvem9vLmNmZwpAQCAtMCwwICsxLDE3IEBACisjIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIGVhY2ggdGljawordGlja1RpbWU9MjAwMAorIyBUaGUgbnVtYmVyIG9mIHRpY2tzIHRoYXQgdGhlIGluaXRpYWwKKyMgc3luY2hyb25pemF0aW9uIHBoYXNlIGNhbiB0YWtlCitpbml0TGltaXQ9MTAKKyMgVGhlIG51bWJlciBvZiB0aWNrcyB0aGF0IGNhbiBwYXNzIGJldHdlZW4KKyMgc2VuZGluZyBhIHJlcXVlc3QgYW5kIGdldHRpbmcgYW4gYWNrbm93bGVkZ2VtZW50CitzeW5jTGltaXQ9NQorCisjIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNuYXBzaG90IGlzIHN0b3JlZC4KKyMgZGF0YURpcj0vb3B0L3pvb2tlZXBlci9kYXRhCisjIE5PVEU6IFNvbHIgZGVmYXVsdHMgdGhlIGRhdGFEaXIgdG8gPHNvbHJIb21lPi96b29fZGF0YQorCisjIHRoZSBwb3J0IGF0IHdoaWNoIHRoZSBjbGllbnRzIHdpbGwgY29ubmVjdAorIyBjbGllbnRQb3J0PTIxODEKKyMgTk9URTogU29sciBzZXRzIHRoaXMgYmFzZWQgb24gemtSdW4gLyB6a0hvc3QgcGFyYW1zCisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9mbXByb2QvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9mbXByb2QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMxMDJmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL2ZtcHJvZC9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxuYW1lPkZpbGVtYW5hZ2VyIFByb2R1Y3QgU2VydmljZXMgKEFwYWNoZSBPT0RUKTwvbmFtZT4KKyAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tJHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKworICA8YnVpbGQ+CisgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+CisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CisgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorCisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorCisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMS4xPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8b3ZlcmxheXM+CisgICAgICAgICAgICA8b3ZlcmxheT4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jYXMtcHJvZHVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvb3ZlcmxheT4KKyAgICAgICAgICA8L292ZXJsYXlzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1wcm9kdWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtvb2R0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL3JkZmNvbmYueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcmRmY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxMmNmMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL3JkZmNvbmYueG1sCkBAIC0wLDAgKzEsMTEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCisJCisJQXV0aG9yOiBDaHJpcyBBLiBNYXR0bWFubgorCURlc2NyaXB0aW9uOiBSZWZhY3RvcmVkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByZWxldmFudCBDQVMgUkRGCisJd2ViIHNlcnZpY2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gdGhpcyBmaWxlLiBTZWUgdGFnIHNwZWNpZmljCisJZG9jdW1lbnRhdGlvbiBiZWxvdyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgZmlsZSB0byBjb25maWd1cmUKKwl0aGUgQ0FTIFJERiB3ZWIgc2VydmljZS4KKyAKKy0tPgorPCEtLSBGSVhNRTogYWRqdXN0IG5hbWVzcGFjZSBVUkk/IC0tPgorPGNhczpyZGZjb25mIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorIDwhLS0gCisgICBIZXJlIHlvdSBjYW4gYWRkIGFzIG1hbnkgJnF1b3Q7bnMmcXVvdDsgdGFncyBhcyBkZXNpcmVkLiBFYWNoIAorICAgbnMgc2hvdWxkIGluY2x1ZGUgPGI+Ym90aDwvYj4gYSBuYW1lIGF0dHJpYnV0ZSBhbmQgYSB2YWx1ZSBhdHRyaWJ1dGUsIAorICAgd2hlcmUgbmFtZSx2YWx1ZSBhcmUgdGhlIHhtbG5zIG5hbWUgYW5kIHZhbHVlLCBlLmcuLCB4bWxuczombHQ7bmFtZSZndDs9JnF1b3Q7dmFsdWUmcXVvdDsKKyAgLS0+CisgPG5hbWVzcGFjZXM+CisgICA8bnMgbmFtZT0iY2FzIiB2YWx1ZT0idXJuOm9vZHQ6Ii8+CisgICA8bnMgbmFtZT0icmRmIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIvPgorICAgCisgICA8IS0tIGFuIGV4YW1wbGUgaW5jbHVkZWQgZnJvbSBFRFJOIC0tPgorICAgPG5zIG5hbWU9ImVkcm4iIHZhbHVlPSJ1cm46ZWRybjoiLz4KKyAgIDxucyBuYW1lPSJ4IiB2YWx1ZT0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvcmRmL3NjaGVtYS5yZGYjIi8+CisgPC9uYW1lc3BhY2VzPgorIAorIDwhLS0gIG9wdGlvbmFsbHkgc3BlY2lmeSBDQVMgbWV0IGtleXMgdG8gYmUgcmVuYW1lZCBpbiB0aGUgb3V0cHV0IFJERi4gRWFjaCBrZXkgdGFnCisgICAgICAgbXVzdCBpbmNsdWRlIGEgPGI+ZnJvbTwvYj4gYW5kIGEgPGI+dG88L2I+IGF0dHJpYnV0ZSwgcmVuYW1pbmcgdGhlIG9yaWdpbmFsIENBUworICAgICAgIHByb2R1Y3QgbWV0IGtleSAmcXVvdDtmcm9tJnF1b3Q7IHRvIHRoZSBuZXcgUkRGIG91dHB1dCBrZXkgJnF1b3Q7dG8mcXVvdDsKKyAgLS0+CisgPHJld3JpdGU+CisgICA8a2V5IGZyb209IlNpdGVJZCIgdG89InNpdGUiLz4KKyAgIDxrZXkgZnJvbT0iU2l0ZU5hbWUiIHRvPSJzaXRlIi8+CisgICA8a2V5IGZyb209IlByb3RvY29sSWQiIHRvPSJwcm90b2NvbCIvPiAKKyAgIDxrZXkgZnJvbT0iT3JnYW5JZCIgdG89Im9yZ2FuIi8+CisgICA8a2V5IGZyb209Ik9yZ2FuU2l0ZSIgdG89Im9yZ2FuIi8+CisgICA8a2V5IGZyb209IlByb3RvY29sTmFtZSIgdG89InByb3RvY29sIi8+CisgPC9yZXdyaXRlPgorIAorIDwhLS0gCisgICBQbGFjaW5nIGtleSB0YWdzIGluIHRoaXMgZmlsZSBkZWNsYXJlcyB0aGF0IHRoZSBzb3VyY2UgQ0FTIHByb2R1Y3QgbWV0IGtleXMKKyAgIGFyZSBpbiBmYWN0IHJlc291cmNlIGxpbmsgaWRlbnRpZmllcnMsIGFuZCBzaG91bGQgYmUgb3V0cHV0IGFzIHN1Y2ggaW4gdGhlIAorICAgUkRGLiBSZXF1aXJlZCBwYXJhbWV0ZXJzIGZvciBlYWNoIGtleSB0YWcgYXJlOiBuYW1lLCBpZGVudGlmeWluZyB0aGUgc291cmNlCisgICBDQVMgcHJvZHVjdCBtZXQga2V5LCBhbmQgbGluaywgaWRlbnRpZnlpbmcgdGhlIHN0YXJ0IG9mIHRoZSByZXNvdXJjZSBsaW5rIHRvCisgICBiZSB1c2VkIGluIHRoZSByZGY6cmVzb3VyY2Ugb3V0cHV0IHRhZywgZS5nLiwgCisgICAmbHQ7eDpwcm90b2NvbCByZGY6cmVzb3VyY2U9JnF1b3Q7Jmx0O2xpbmsmZ3Q7LyZsdDtrZXkgdmFsdWUmZ3Q7JnF1b3Q7Jmd0OworICAtLT4KKyA8cmVzb3VyY2VsaW5rcz4KKyAgIDxrZXkgbmFtZT0iU2l0ZUlkIiBsaW5rPSJodHRwOi8vZWRybi5uY2kubmloLmdvdi9kYXRhL3NpdGVzLyIvPgorICAgPGtleSBuYW1lPSJTaXRlTmFtZSIgbGluaz0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvZGF0YS9zaXRlcy8iLz4KKyAgIDxrZXkgbmFtZT0iUHJvdG9jb2xJZCIgbGluaz0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvZGF0YS9wcm90b2NvbHMvIi8+CisgICA8a2V5IG5hbWU9IlByb3RvY29sTmFtZSIgbGluaz0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvZGF0YS9wcm90b2NvbHMvIi8+CisgICA8a2V5IG5hbWU9Ik9yZ2FuSWQiIGxpbms9Imh0dHA6Ly9lZHJuLm5jaS5uaWguZ292L2RhdGEvYm9keS1zeXN0ZW1zLyIvPgorICAgPGtleSBuYW1lPSJPcmdhblNpdGUiIGxpbms9Imh0dHA6Ly9lZHJuLm5jaS5uaWguZ292L2RhdGEvYm9keS1zeXN0ZW1zLyIvPgorIDwvcmVzb3VyY2VsaW5rcz4KKyAKKyA8IS0tIAorICAgICAgYXNzb2NpYXRlcyBDQVMgcHJvZHVjdCBtZXQgc3BlY2lmaWMga2V5cyB0byBwcmV2aW91c2x5IGRlY2xhcmVkIG5hbWVzcGFjZXMuIEVhY2gga2V5CisgICAgICB0YWcgc2hvdWxkIGNvbnRhaW4gYSBuYW1lIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyB2YWxpZCBDQVMgcHJvZHVjdCBtZXQga2V5LCBhbmQgZWFjaCAKKyAgICAgIG5zIGF0dHJpYnV0ZSBvbiBlYWNoIGtleSB0YWcgc2hvdWxkIGJlIGEgcHJldmlvdXNseSBkZWNsYXJlZCBuYW1lc3BhY2UgZnJvbSB0aGUgbmFtZXNwYWNlcworICAgICAgdGFnLgorICAgICAgCisgICAKKyAgICAgIFlvdSA8Yj5tdXN0PC9iPiBkZWNsYXJlIGEgZGVmYXVsdCBucyBpbiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgaW4gdGhlIGtleW5zbWFwIHRhZy4gVGhpcworICAgICAgbnMgd2lsbCBiZSB1c2VkIGlmIG5vIGtleSBucyBpcyBkZWNsYXJlZCBpbiB0aGUgbnNtYXAuCisgIC0tPgorIDxrZXluc21hcCBkZWZhdWx0PSJjYXMiPgorICAgPGtleSBuYW1lPSJDQVMuUHJvZHVjdElkIiBucz0iY2FzIi8+CisgICA8a2V5IG5hbWU9IkNBUy5Qcm9kdWN0TmFtZSIgbnM9ImNhcyIvPgorICAgPGtleSBuYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIgbnM9ImNhcyIvPgorICAgPGtleSBuYW1lPSJGaWxlTG9jYXRpb24iIG5zPSJjYXMiLz4KKyAgIDxrZXkgbmFtZT0iRmlsZW5hbWUiIG5zPSJjYXMiLz4KKyAgIDxrZXkgbmFtZT0iUHJvZHVjdFR5cGUiIG5zPSJjYXMiLz4gIAorICAgPGtleSBuYW1lPSJEYXRhVmVyc2lvbiIgbnM9ImNhcyIvPgorICAgPGtleSBuYW1lPSJNaW1lVHlwZSIgbnM9ImNhcyIvPiAKKyAgIAorICAgPCEtLSAgRURSTiBleGFtcGxlIC0tPgorICAgPGtleSBuYW1lPSJTaXRlSWQiIG5zPSJ4Ii8+CisgICA8a2V5IG5hbWU9IlNpdGVOYW1lIiBucz0ieCIvPgorICAgPGtleSBuYW1lPSJQcm90b2NvbE5hbWUiIG5zPSJ4Ii8+CisgICA8a2V5IG5hbWU9IlByb3RvY29sSWQiIG5zPSJ4Ii8+CisgICA8a2V5IG5hbWU9Ik9yZ2FuSWQiIG5zPSJ4Ii8+CisgICA8a2V5IG5hbWU9Ik9yZ2FuU2l0ZSIgbnM9IngiLz4KKyA8L2tleW5zbWFwPgorIAorIDwhLS0gCisgICAgICBhc3NvY2lhdGVzIENBUyBwcm9kdWN0IHR5cGUgbmFtZXMgdG8gcHJldmlvdXNseSBkZWNsYXJlZCBuYW1lc3BhY2VzLiBFYWNoIHR5cGUKKyAgICAgIHRhZyBzaG91bGQgY29udGFpbiBhIG5hbWUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIHZhbGlkIENBUyBwcm9kdWN0IHR5cGUsIGFuZCBlYWNoIAorICAgICAgbnMgYXR0cmlidXRlIG9uIGVhY2gga2V5IHRhZyBzaG91bGQgYmUgYSBwcmV2aW91c2x5IGRlY2xhcmVkIG5hbWVzcGFjZSBmcm9tIHRoZSBuYW1lc3BhY2VzCisgICAgICB0YWcuCisgCisgICAgICBZb3UgPGI+bXVzdDwvYj4gZGVjbGFyZSBhIGRlZmF1bHQgbnMgaW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGluIHRoZSB0eXBlc25zbWFwIHRhZy4gVGhpcworICAgICAgbnMgd2lsbCBiZSB1c2VkIGlmIG5vIHR5cGUgbnMgaXMgZGVjbGFyZWQgaW4gdGhlIG5zbWFwLiAKKyAgLS0+CisgPHR5cGVzbnNtYXAgZGVmYXVsdD0iY2FzIj4KKyAgIDx0eXBlIG5hbWU9IkdlbmVyaWNGaWxlIiBucz0iY2FzIi8+CisgPC90eXBlc25zbWFwPgorPC9jYXM6cmRmY29uZj4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL3Jzc2NvbmYueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcnNzY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2OWUwYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL3Jzc2NvbmYueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKwkKKwlBdXRob3I6IENocmlzIEEuIE1hdHRtYW5uCisJRGVzY3JpcHRpb246IFRoaXMgZmlsZSBjb25maWd1cmVzIHRoZSBDQVMgUlNTIHdlYiBzZXJ2aWNlLiBUaGUKKwltYWluIGFzcGVjdHMgb2YgdGhpcyBmaWxlIGFyZSB0aGUgYWJpbGl0eSB0byByZWNhc3QgYSBwcm9kdWN0J3MgCisJbWV0YWRhdGEgYXMgcmVsZXZhbnQgUlNTIGNvbXBhdGlhYmxlIHRhZ3MuCistLT4KKzwhLS0gRklYTUU6IGFkanVzdCBuYW1lc3BhY2UgVVJJPyAtLT4KKzxjYXM6cnNzY29uZiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgPCEtLSAKKyAgICBBbiBvcHRpb24gImNoYW5uZWxMaW5rIiBhdHRyaWJ1dGUgbWF5IGJlIHNldCBvbiB0aGUgYWJvdmUgb3V0ZXIgdGFnIHRvIAorICAgIHNldCB0aGUgY2hhbm5lbCdzIGxpbmsgYXR0cmlidXRlLgorICAgIAorICAgIE1ldGFkYXRhIGF2YWlsYWJsZSBmb3IgcmVwbGFjZW1lbnQgaW4gdGhpcyBhdHRyaWJ1dGUgaXM6CisgICAgCisgICAgQmFzZVVybDogdGhlIGJhc2UgVVJMIGZvciB0aGUgQ0FTIHdlYiBzZXJ2aWNlIGxheWVyLgorICAgIFByb2R1Y3RUeXBlSWQ6IHRoZSBpZCBwYXNzZWQgdG8gdGhlIFJTUyBjaGFubmVsIHZpYSB0aGUgaWQgcGFyYW0KKyAgICBQcm9kdWN0VHlwZTogdGhlIGNoYW5uZWwgcHJvZHVjdCB0eXBlIG5hbWUgcGFzc2VkIHZpYSB0aGUgY2hhbm5lbCBwYXJhbQorICAgIFRvcE46IHRoZSB0b3BuIHBhcmFtLCBpZiBwYXNzZWQuCisgICAtLT4KKyAgCisgIDwhLS0gCisgICAgRWFjaCAmbHQ7dGFnJmd0OyB0YWcgZGVmaW5lcyAyIGF0dHJpYnV0ZXM6CisgICAgCisgICAgbmFtZSAocmVxdWlyZWQpIC0gdGhlIFJTUyBvdXRwdXQgdGFnIG5hbWUKKyAgICBzb3VyY2UgKG9wdGlvbmFsKSAtIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIENBUyBwcm9kdWN0J3MgbWV0YWRhdGEgYW5kIGl0cworICAgIGFzc29jaWF0ZWQgdmFsdWUuCisgICAgCisgICAgRWFjaCAmbHQ7dGFnJmd0OyBoYXMgYSBzZXQgb2YgJmx0O2F0dHJpYnV0ZSZndDsgdGFncywgd2hpY2ggZGVmaW5lIFhNTCBhdHRyaWJ1dGVzCisgICAgb24gdGhlIFJTUyBvdXRwdXQgdGFncy4gRWFjaCAmbHQ7YXR0cmlidXRlJmd0OyBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgIAorICAgIG5hbWUgKHJlcXVpcmVkKSAtIHRoZSBSU1Mgb3V0cHV0IHRhZyBhdHRyaWJ1dGUgbmFtZQorICAgIHZhbHVlIChyZXF1aXJlZCkgLSB0aGUgUlNTIG91dHB1dCB0YWcgYXR0cmlidXRlIHZhbHVlLiBCeSBkZWZhdWx0IHRoZXNlIHZhbHVlcyBhcmUKKyAgICBydW4gdGhyb3VnaCBQYXRoVXRpbHMjcmVwbGFjZUVudlZhcmlhYmxlcyB3aGljaCByZXBsYWNlcyBtZXQga2V5cyB1c2luZyB0aGUgc3RhbmRhcmQKKyAgICBDQVMgbWV0IHJlcGxhY2VtZW50IHN0cmF0ZWd5LgorICAgLS0+CisgICAgCisgICAgPCEtLSAKKyAgICAKKyAgICBJZiB5b3Ugd2FudCB0byB0dXJuIHlvdXIgQ0FTIEZpbGUgTWFuYWdlciBpbnRvIGEgUG9kY2FzdCBmZWVkZXIgZm9yIGlUdW5lcywgdW5jb21tZW50CisgICAgdGhlIGJlbG93IHRhZyBibG9jay4gWW91J2xsIG5lZWQgdG8gbW9kaWZ5IHlvdXIgd2ViLnhtbCBmb3IgdGhpcyB3ZWJhcHAgYW5kIGNoYW5nZQorICAgIHRoZSBkZWZhdWx0IG5hbWUgb2YgdGhlIC9kYXRhIHNlcnZpY2UgdG8gL2RhdGEubXAzLiBUaGVuIHlvdSdyZSBzZXQhCisgICAgCisgICAgPHRhZyBuYW1lPSJlbmNsb3N1cmUiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvZm1wcm9kL2RhdGEubXAzP3Byb2R1Y3RJRD1bQ0FTLlByb2R1Y3RJZF0iLz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB2YWx1ZT0iW0ZpbGVTaXplXSIvPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB2YWx1ZT0iYXVkaW8vbXBlZyIvPgorICAgIDwvdGFnPgorICAgIAorICAgIC0tPgorCisgICAgPCEtLSAKKyAgICAKKyAgICBJZiB5b3Ugd2FudCB0byB0dXJuIHlvdXIgQ0FTIEZpbGUgTWFuYWdlciBpbnRvIGEgR2VvUlNTIAorICAgIHNpbXBsZSBzZXJ2aWNlIChzZWUgaHR0cDovL2dlb3Jzcy5vcmcvc2ltcGxlKSwgYWRkIHRoZSAKKyAgICBmb2xsb3dpbmcgYmxvY2ssIGFzc3VtaW5nIHRoYXQgeW91IGhhdmUgaW5kZXhlZCBtZXQgZmllbGRzIAorICAgIG5hbWVkIExhdGl0dWRlIGFuZCBMb25naXR1ZGUgZm9yIHlvdXIgcHJvZHVjdCAodXBkYXRlIGFzIAorICAgIGFwcHJvcHJpYXRlIG90aGVyd2lzZSkuCisgICAgCisgICAgPHRhZyBuYW1lPSJnZW9yc3M6cG9pbnQiIHNvdXJjZT0iW0xhdGl0dWRlXSBbTG9uZ2l0dWRlXSIvPgorICAgIC0tPgorICAgIAorICAgIDx0YWcgbmFtZT0iY2FzOnNvdXJjZSIgc291cmNlPSJbUHJvZHVjdFR5cGVdIi8+CisgICAgPHRhZyBuYW1lPSJzb3VyY2UiIHNvdXJjZT0iW1Byb2R1Y3RUeXBlXSIvPgorCis8L2Nhczpyc3Njb25mPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL2ZtcHJvZC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvZm1wcm9kL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlkNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL2ZtcHJvZC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKQEAgLTAsMCArMSwyOSBAQAorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKworPENvbnRleHQgcGF0aD0iL2ZtcHJvZCIgZGVidWc9IjUiCisgIHJlbG9hZGFibGU9InRydWUiIGNyb3NzQ29udGV4dD0idHJ1ZSI+CisKKyAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgcHJlZml4PSJmbXByb2RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIgcGF0dGVybj0iY29tbW9uIiAvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci51cmwiIHZhbHVlPSJbRklMRU1HUl9VUkxdIiBvdmVycmlkZT0iZmFsc2UiIC8+CisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci5yZGZjb25mLmZpbGUiIHZhbHVlPSJbRk1QUk9EX0hPTUVdL3JkZmNvbmYueG1sIiBvdmVycmlkZT0iZmFsc2UiLz4KKyAgPFBhcmFtZXRlciBuYW1lPSJmaWxlbWdyLnJzc2NvbmYuZmlsZSIgdmFsdWU9IltGTVBST0RfSE9NRV0vcnNzY29uZi54bWwiIG92ZXJyaWRlPSJmYWxzZSIvPgorICA8UGFyYW1ldGVyIG5hbWU9ImZpbGVtZ3Iud29ya2luZy5kaXIiIHZhbHVlPSIvdG1wIiBvdmVycmlkZT0iZmFsc2UiIC8+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9vcHN1aS9wb20ueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL29wc3VpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1MWUxNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9vcHN1aS9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxuYW1lPlBDUyBPcHMgSW50ZXJmYWNlIChBcGFjaGUgT09EVCk8L25hbWU+CisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LSR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgPGJ1aWxkPgorICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvc291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnNyYy90ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKworICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8L3Jlc291cmNlPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKworICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPG92ZXJsYXlzPgorICAgICAgICAgICAgPG92ZXJsYXk+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGNzLW9wc3VpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9vdmVybGF5PgorICAgICAgICAgIDwvb3ZlcmxheXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGNzLW9wc3VpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtvb2R0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9vcHN1aS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvb3BzdWkvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjQxOTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvb3BzdWkvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL29wc3VpIj4KKwkJCisJPFBhcmFtZXRlciBuYW1lPSJmaWxlbWdyLnVybCIKKwkgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iLz4JCQorCQkKKwk8UGFyYW1ldGVyIG5hbWU9IndvcmtmbG93LnVybCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19VUkxdIi8+CisKKwk8UGFyYW1ldGVyIG5hbWU9InJlc21nci51cmwiCisJICAgIHZhbHVlPSJbUkVTTUdSX1VSTF0iLz4KKworCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS53b3JrZmxvdy5saWZlY3ljbGVGaWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctbGlmZWN5Y2xlLnhtbCIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkud2luc3Quc3RhdHVzZXMiCisJICAgIHZhbHVlPSJRVUVVRUQsIFJTVUJNSVQsIEJVSUxESU5HIENPTkZJRyBGSUxFLCBQR0UgRVhFQywgQ1JBV0xJTkcsIFNUQUdJTkcgSU5QVVQsIEZJTklTSEVELCBTVEFSVEVELCBQQVVTRUQiLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLndpbnN0Lm1ldEZpZWxkcy5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctaW5zdGFuY2UtbWV0LnhtbCIvPiAgIAorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLmNyYXdsZXIuY29uZi5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltQQ1NfSE9NRV0vcG9saWN5L3Bjcy1jcmF3bGVycy54bWwiLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC53b3JrZmxvdy5zdGF0dXNlcy5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltQQ1NfSE9NRV0vcG9saWN5L3Bjcy13b3JrZmxvdy1zdGF0dXNlcy54bWwiLz4JICAgIAorCSAKKwk8UGFyYW1ldGVyIG5hbWU9ImdhbmdsaWEudXJsIiB2YWx1ZT0iW0dBTkdMSUFfVVJMXSIvPgorCTxQYXJhbWV0ZXIgbmFtZT0iY29udGFjdC5lbWFpbCIgdmFsdWU9InVzZXJAb29kdC5hcGFjaGUub3JnIi8+CisKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MudHJhY2UuZXhjbHVkZUxpc3QiCisgICAgICAgICAgICAgICB2YWx1ZT0iIi8+ICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLnRyYWNlLmVuYWJsZU5vdENhdCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAJCisgICAgICAgIDwhLS0gT1BTVUkgU0tJTk5JTkcKKyAgICAgICAgICAgICAgICBEaXJlY3Rpb25zOiBTZXQgdGhlICdvcHN1aS5za2luJyBwcm9wZXJ0eSdzIHZhbHVlIGF0dHJpYnV0ZS4gCisgICAgICAgICAgICAgICAgU3VwcG9ydGVkIHNraW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgIiIgICAgICAgICAgID0+IE5vIHNraW4KKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhbndoaXRlIiA9PiBDbGVhbiwgd2hpdGUgYmFja2dyb3VuZCBPT0RUIGJhc2Ugc2tpbgorICAgICAgICAgICAgICAgICAgICAgICAgIm5hdnlibHVlIiAgID0+IERhcmtlciwgYmx1ZSBiYWNrZ3JvdW5kIE9PRFQgYmFzZSBza2luCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NpYyIgICAgPT4gVGhlIG9yaWdpbmFsLCBPQ08gKE9yYml0aW5nIENhcmJvbiBPYnNlcnZhdG9yeSkgc2tpbiBmb3IgT1BTVUkKKyAgICAgICAgICAgICAgICBPUiBhZGQgeW91ciBvd24hCisgICAgICAgIC0tPgorICAgICAgICA8UGFyYW1ldGVyIG5hbWU9Im9wc3VpLnNraW4iIHZhbHVlPSJjbGVhbndoaXRlIi8+CisgICAgICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3BzdWkuaG9tZXBhZ2UiIHZhbHVlPSJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLkhvbWVQYWdlIi8+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9vcHN1aS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL29wc3VpL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjZTgyMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9vcHN1aS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgIHZlcnNpb249IjIuNCI+CisKKyAgICA8ZGlzcGxheS1uYW1lPm9wc3VpPC9kaXNwbGF5LW5hbWU+CisKKyAgICAgPCEtLSAgCisgICAgICAgICAgVGhlcmUgYXJlIHRocmVlIG1lYW5zIHRvIGNvbmZpZ3VyZSBXaWNrZXRzIGNvbmZpZ3VyYXRpb24gbW9kZSBhbmQgdGhleSBhcmUKKyAgICAgICAgICB0ZXN0ZWQgaW4gdGhlIG9yZGVyIGdpdmVuLiAKKyAgICAgICAgICAxKSBBIHN5c3RlbSBwcm9wZXJ0eTogLUR3aWNrZXQuY29uZmlndXJhdGlvbgorICAgICAgICAgIDIpIHNlcnZsZXQgc3BlY2lmaWMgPGluaXQtcGFyYW0+CisgICAgICAgICAgMykgY29udGV4dCBzcGVjaWZpYyA8Y29udGV4dC1wYXJhbT4KKyAgICAgICAgICBUaGUgdmFsdWUgbWlnaHQgYmUgZWl0aGVyICJkZXZlbG9wbWVudCIgKHJlbG9hZGluZyB3aGVuIHRlbXBsYXRlcyBjaGFuZ2UpCisgICAgICAgICAgb3IgImRlcGxveW1lbnQiLiBJZiBubyBjb25maWd1cmF0aW9uIGlzIGZvdW5kLCAiZGV2ZWxvcG1lbnQiIGlzIHRoZSBkZWZhdWx0LgorICAgIC0tPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPndpY2tldC5icm93c2VyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldpY2tldEZpbHRlcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmFwcGxpY2F0aW9uQ2xhc3NOYW1lPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuT3BzdWlBcHA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyA8ZmlsdGVyLW1hcHBpbmc+CisgIDxmaWx0ZXItbmFtZT53aWNrZXQuYnJvd3NlcjwvZmlsdGVyLW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyA8L2ZpbHRlci1tYXBwaW5nPgorIAorICA8Y29udGV4dC1wYXJhbT4KKyAgICA8cGFyYW0tbmFtZT5maWxlbWdyLndvcmtpbmcuZGlyPC9wYXJhbS1uYW1lPgorICAgIDxwYXJhbS12YWx1ZT4vdG1wPC9wYXJhbS12YWx1ZT4KKyAgPC9jb250ZXh0LXBhcmFtPgorCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+RGF0YURlbGl2ZXJ5U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5kYXRhLkRhdGFEZWxpdmVyeVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhc2V0RGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmRhdGEuRGF0YXNldERlbGl2ZXJ5U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhRGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9kYXRhPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIAorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+RGF0YXNldERlbGl2ZXJ5U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vZGF0YXNldDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPiAgCisgCisKKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL3Bjcy1zZXJ2aWNlcy9wb20ueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL3Bjcy1zZXJ2aWNlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMGRhN2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvcGNzLXNlcnZpY2VzL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPG5hbWU+UENTIFNlcnZpY2VzIChBcGFjaGUgT09EVCk8L25hbWU+CisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LSR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgPGJ1aWxkPgorICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvc291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnNyYy90ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKworICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8L3Jlc291cmNlPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKworICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPG92ZXJsYXlzPgorICAgICAgICAgICAgPG92ZXJsYXk+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGNzLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9vdmVybGF5PgorICAgICAgICAgIDwvb3ZlcmxheXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGNzLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtvb2R0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9wY3Mtc2VydmljZXMvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL3Bjcy1zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3NzQyMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9wY3Mtc2VydmljZXMvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL3BjcyI+CisJCQorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5mbS51cmwiCisJICAgIHZhbHVlPSJbRklMRU1HUl9VUkxdIi8+CisKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMud20udXJsIgorCSAgICB2YWx1ZT0iW1dPUktGTE9XX1VSTF0iLz4KKworCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5ybS51cmwiCisJICAgIHZhbHVlPSJbUkVTTUdSX1VSTF0iLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLmxsLmNvbmYuZmlsZVBhdGgiCisJICAgIHZhbHVlPSJbUENTX0hPTUVdL3BvbGljeS9wY3MtbGwtY29uZi54bW5sIi8+CisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguY3Jhd2xlci5jb25mLmZpbGVQYXRoIgorCSAgICB2YWx1ZT0iW1BDU19IT01FXS9wb2xpY3kvcGNzLWNyYXdsZXJzLnhtbCIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLndvcmtmbG93LnN0YXR1c2VzLmZpbGVQYXRoIgorCSAgICB2YWx1ZT0iW1BDU19IT01FXS9wb2xpY3kvcGNzLXdvcmtmbG93LXN0YXR1c2VzLnhtbCIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MudHJhY2UuZW5hYmxlTm9uQ2F0IgorCSAgICB2YWx1ZT0idHJ1ZSIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MudHJhY2UucHJvZHVjdFR5cGVFeGNsdWRlTGlzdCIKKwkgICAgdmFsdWU9IlR5cGVOYW1lMSxUeXBlTmFtZTIiLz4KKworPC9Db250ZXh0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJkZGYzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL3BvbS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4NCisgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICA8L3BhcmVudD4NCisgIDxuYW1lPldlYiBBcHBsaWNhdGlvbnMgKEFwYWNoZSBPT0RUKTwvbmFtZT4NCisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQorICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfS0ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPg0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvc29sci13ZWJhcHAvcG9tLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9zb2xyLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvc29sci13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDEwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD4ke3Jvb3RBcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPG5hbWU+U29sciBXZWJhcHAgKEFwYWNoZSBTb2xyKTwvbmFtZT4KKyAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tJHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKworICA8YnVpbGQ+CisgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+CisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CisgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorCisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorCisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMS4xPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8b3ZlcmxheXM+CisgICAgICAgICAgICA8b3ZlcmxheT4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zb2xyPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zb2xyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9vdmVybGF5PgorICAgICAgICAgIDwvb3ZlcmxheXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zb2xyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c29scjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuNy4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICAKKwk8ZGVwZW5kZW5jeT4KKwkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjEuNi42PC92ZXJzaW9uPgorCTwvZGVwZW5kZW5jeT4KKwk8ZGVwZW5kZW5jeT4KKwkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5qY2wtb3Zlci1zbGY0ajwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS42LjY8L3ZlcnNpb24+CisJPC9kZXBlbmRlbmN5PgorCTxkZXBlbmRlbmN5PgorCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPmp1bC10by1zbGY0ajwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS42LjY8L3ZlcnNpb24+CisJPC9kZXBlbmRlbmN5PgorCTxkZXBlbmRlbmN5PgorCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjEuNi42PC92ZXJzaW9uPgorCTwvZGVwZW5kZW5jeT4KKwk8ZGVwZW5kZW5jeT4KKwkJPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjIuMTY8L3ZlcnNpb24+CisJPC9kZXBlbmRlbmN5PgorCQorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93ZWJhcHBzL3NvbHItd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9zb2xyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiMThjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9zb2xyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL3NvbHIiPgorICA8UGFyYW1ldGVyIG5hbWU9InNvbHIvaG9tZSIgdmFsdWU9Ii4uL3NvbHIiLz4KKzwvQ29udGV4dD4gCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvc29sci13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbGliL2xvZzRqLnByb3BlcnRpZXMgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvc29sci13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbGliL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzZmE3MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9zb2xyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9saWIvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjICBMb2dnaW5nIGxldmVsCitzb2xyLmxvZz1sb2dzLworbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBmaWxlLCBDT05TT0xFCisKK2xvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKKworbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Citsb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lLTRyIFsldF0gJS01cCAlYyAleCBcdTIwMTMgJW0lbgorCisjLSBzaXplIHJvdGF0aW9uIHdpdGggbG9nIGNsZWFudXAuCitsb2c0ai5hcHBlbmRlci5maWxlPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuZmlsZS5NYXhGaWxlU2l6ZT00TUIKK2xvZzRqLmFwcGVuZGVyLmZpbGUuTWF4QmFja3VwSW5kZXg9OQorCisjLSBGaWxlIHRvIGxvZyB0byBhbmQgbG9nIGZvcm1hdAorbG9nNGouYXBwZW5kZXIuZmlsZS5GaWxlPSR7c29sci5sb2d9L3NvbHIubG9nCitsb2c0ai5hcHBlbmRlci5maWxlLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLmZpbGUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSUtNXAgLSAlZHt5eXl5LU1NLWRkIEhIOm1tOnNzLlNTU307ICVDOyAlbVxuCisKK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnpvb2tlZXBlcj1XQVJOCitsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5oYWRvb3A9V0FSTgorCisjIHNldCB0byBJTkZPIHRvIGVuYWJsZSBpbmZvc3RyZWFtIGxvZyBtZXNzYWdlcworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuc29sci51cGRhdGUuTG9nZ2luZ0luZm9TdHJlYW09T0ZGCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvc29sci13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd2ViYXBwcy9zb2xyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzMzBmZTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dlYmFwcHMvc29sci13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDE4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKKyAgICAgICAgIHZlcnNpb249IjIuNSIKKyAgICAgICAgIG1ldGFkYXRhLWNvbXBsZXRlPSJ0cnVlIgorPgorCisKKyAgPCEtLSBVbmNvbW1lbnQgaWYgeW91IGFyZSB0cnlpbmcgdG8gdXNlIGEgUmVzaW4gdmVyc2lvbiBiZWZvcmUgMy4wLjE5LgorICAgIFRoZWlyIFhNTCBpbXBsZW1lbnRhdGlvbiBpc24ndCBlbnRpcmVseSBjb21wYXRpYmxlIHdpdGggWGVyY2VzLgorICAgIEJlbG93IGFyZSB0aGUgaW1wbGVtZW50YXRpb25zIHRvIHVzZSB3aXRoIFN1bidzIEpWTS4KKyAgPHN5c3RlbS1wcm9wZXJ0eSBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5PQorICAgICAgICAgICAgICJjb20uc3VuLm9yZy5hcGFjaGUueHBhdGguaW50ZXJuYWwuamF4cC5YUGF0aEZhY3RvcnlJbXBsIi8+CisgIDxzeXN0ZW0tcHJvcGVydHkgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeT0KKyAgICAgICAgICAgICAiY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsIi8+CisgIDxzeXN0ZW0tcHJvcGVydHkgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeT0KKyAgICAgICAgICAgICAiY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsIi8+CisgICAtLT4KKworICA8IS0tIFBlb3BsZSB3aG8gd2FudCB0byBoYXJkY29kZSB0aGVpciAiU29sciBIb21lIiBkaXJlY3RseSBpbnRvIHRoZQorICAgICAgIFdBUiBGaWxlIGNhbiBzZXQgdGhlIEpOREkgcHJvcGVydHkgaGVyZS4uLgorICAgLS0+CisgIAorICAgIDxlbnYtZW50cnk+CisgICAgICAgPGVudi1lbnRyeS1uYW1lPnNvbHIvaG9tZTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgPGVudi1lbnRyeS12YWx1ZT4uLi9zb2xyPC9lbnYtZW50cnktdmFsdWU+CisgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorICAgCisgICAKKyAgPCEtLSBBbnkgcGF0aCAobmFtZSkgcmVnaXN0ZXJlZCBpbiBzb2xyY29uZmlnLnhtbCB3aWxsIGJlIHNlbnQgdG8gdGhhdCBmaWx0ZXIgLS0+CisgIDxmaWx0ZXI+CisgICAgPGZpbHRlci1uYW1lPlNvbHJSZXF1ZXN0RmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUuc29sci5zZXJ2bGV0LlNvbHJEaXNwYXRjaEZpbHRlcjwvZmlsdGVyLWNsYXNzPgorICAgIDwhLS0gSWYgeW91IGFyZSB3aXJpbmcgU29sciBpbnRvIGEgbGFyZ2VyIHdlYiBhcHBsaWNhdGlvbiB3aGljaCBjb250cm9scworICAgICAgICAgdGhlIHdlYiBjb250ZXh0IHJvb3QsIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gbW91bnQgU29sciB1bmRlcgorICAgICAgICAgYSBwYXRoIHByZWZpeCAoYXBwLndhciB3aXRoIC9hcHAvc29sciBtb3VudGVkIGludG8gaXQsIGZvciBleGFtcGxlKS4KKyAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gcHV0IHRoaXMgcHJlZml4IGluIGZyb250IG9mIHRoZSBTb2xyRGlzcGF0Y2hGaWx0ZXIKKyAgICAgICAgIHVybC1wYXR0ZXJuIG1hcHBpbmcgdG9vICgvc29sci8qKSwgYW5kIGFsc28gb24gYW55IHBhdGhzIGZvcgorICAgICAgICAgbGVnYWN5IFNvbHIgc2VydmxldCBtYXBwaW5ncyB5b3UgbWF5IGJlIHVzaW5nLgorICAgICAgICAgRm9yIHRoZSBBZG1pbiBVSSB0byB3b3JrIHByb3Blcmx5IGluIGEgcGF0aC1wcmVmaXhlZCBjb25maWd1cmF0aW9uLAorICAgICAgICAgdGhlIGFkbWluIGZvbGRlciBjb250YWluaW5nIHRoZSByZXNvdXJjZXMgbmVlZHMgdG8gYmUgdW5kZXIgdGhlIGFwcCBjb250ZXh0IHJvb3QKKyAgICAgICAgIG5hbWVkIHRvIG1hdGNoIHRoZSBwYXRoLXByZWZpeC4gIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAud2FyCisgICAgICAgICAgICAgICB4eHgKKyAgICAgICAgICAgICAgICAganMKKyAgICAgICAgICAgICAgICAgICBtYWluLmpzCisgICAgLS0+CisgICAgPCEtLQorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+cGF0aC1wcmVmaXg8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+L3h4eDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIC0tPgorICA8L2ZpbHRlcj4KKworICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgPCEtLQorICAgICAgTk9URTogV2hlbiB1c2luZyBtdWx0aWNvcmUsIC9hZG1pbiBKU1AgVVJMcyB3aXRoIGEgY29yZSBzcGVjaWZpZWQKKyAgICAgIHN1Y2ggYXMgL3NvbHIvY29yZU5hbWUvYWRtaW4vc3RhdHMuanNwIGdldCBmb3J3YXJkZWQgYnkgYQorICAgICAgUmVxdWVzdERpc3BhdGNoZXIgdG8gL3NvbHIvYWRtaW4vc3RhdHMuanNwIHdpdGggdGhlIHNwZWNpZmllZCBjb3JlCisgICAgICBwdXQgaW50byByZXF1ZXN0IHNjb3BlIGtleWVkIGFzICJvcmcuYXBhY2hlLnNvbHIuU29sckNvcmUiLgorCisgICAgICBJdCBpcyB1bm5lY2Vzc2FyeSwgYW5kIHBvdGVudGlhbGx5IHByb2JsZW1hdGljLCB0byBoYXZlIHRoZSBTb2xyRGlzcGF0Y2hGaWx0ZXIKKyAgICAgIGNvbmZpZ3VyZWQgdG8gYWxzbyBmaWx0ZXIgb24gZm9yd2FyZHMuICBEbyBub3QgY29uZmlndXJlCisgICAgICB0aGlzIGRpc3BhdGNoZXIgYXMgPGRpc3BhdGNoZXI+Rk9SV0FSRDwvZGlzcGF0Y2hlcj4uCisgICAgLS0+CisgICAgPGZpbHRlci1uYW1lPlNvbHJSZXF1ZXN0RmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICA8L2ZpbHRlci1tYXBwaW5nPgorCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+Wm9va2VlcGVyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5zb2xyLnNlcnZsZXQuWm9va2VlcGVySW5mb1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKyAgCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+TG9hZEFkbWluVUk8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnNvbHIuc2VydmxldC5Mb2FkQWRtaW5VaVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKyAgCisgIDwhLS0gUmVtb3ZlIGluIFNvbHIgNS4wIC0tPgorICA8IS0tIFRoaXMgc2VuZHMgU0NfTU9WRURfUEVSTUFORU5UTFkgKDMwMSkgZm9yIHJlc291cmNlcyB0aGF0IGNoYW5nZWQgaW4gNC4wIC0tPgorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0T2xkQWRtaW5VSTwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuc29sci5zZXJ2bGV0LlJlZGlyZWN0U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmRlc3RpbmF0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPiR7Y29udGV4dH0vIy88L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgPC9zZXJ2bGV0PgorICAKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5SZWRpcmVjdE9sZFpvb2tlZXBlcjwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuc29sci5zZXJ2bGV0LlJlZGlyZWN0U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmRlc3RpbmF0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPiR7Y29udGV4dH0vem9va2VlcGVyPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKyAgCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3RMb2dnaW5nPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5zb2xyLnNlcnZsZXQuUmVkaXJlY3RTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVzdGluYXRpb248L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+JHtjb250ZXh0fS8jL35sb2dnaW5nPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKworICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPlNvbHJSZXN0QXBpPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLnJlc3RsZXQuZXh0LnNlcnZsZXQuU2VydmVyU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPm9yZy5yZXN0bGV0LmFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUuc29sci5yZXN0LlNvbHJSZXN0QXBpPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKyAgCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5SZWRpcmVjdE9sZEFkbWluVUk8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L2FkbWluLzwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3RPbGRBZG1pblVJPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9hZG1pbjwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3RPbGRab29rZWVwZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L3pvb2tlZXBlci5qc3A8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0TG9nZ2luZzwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vbG9nZ2luZzwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorCisgIDwhLS0gU2VydmxldCBNYXBwaW5nIC0tPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+Wm9va2VlcGVyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi96b29rZWVwZXI8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5Mb2FkQWRtaW5VSTwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vYWRtaW4uaHRtbDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5Tb2xyUmVzdEFwaTwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vc2NoZW1hLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgCisgIDxtaW1lLW1hcHBpbmc+CisgICAgPGV4dGVuc2lvbj4ueHNsPC9leHRlbnNpb24+CisgICAgPCEtLSBwZXIgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9QUi14c2x0MjAtMjAwNjExMjEvIC0tPgorICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veHNsdCt4bWw8L21pbWUtdHlwZT4KKyAgPC9taW1lLW1hcHBpbmc+CisKKyAgPHdlbGNvbWUtZmlsZS1saXN0PgorICAgIDx3ZWxjb21lLWZpbGU+YWRtaW4uaHRtbDwvd2VsY29tZS1maWxlPgorICA8L3dlbGNvbWUtZmlsZS1saXN0PgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3BvbS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2NzBhNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvcG9tLnhtbApAQCAtMCwwICsxLDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8bmFtZT5Xb3JrZmxvdyBNYW5hZ2VyIChBcGFjaGUgT09EVCk8L25hbWU+CisgIDxhcnRpZmFjdElkPiR7cm9vdEFydGlmYWN0SWR9LXdvcmtmbG93PC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+JHtyb290QXJ0aWZhY3RJZH0tZXh0ZW5zaW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8dHlwZT5qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FzLWZpbGVtZ3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy13b3JrZmxvdzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7b29kdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcGdlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtvb2R0LnBnZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNhcy1jcmF3bGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWUzMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw4MCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorICA8aWQ+YmluPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT53b3JrZmxvdzwvYmFzZURpcmVjdG9yeT4KKyAgPGluY2x1ZGVTaXRlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlU2l0ZURpcmVjdG9yeT4KKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2JpbjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT53b3JrZmxvdy9iaW48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgICA8ZmlsZU1vZGU+NzU1PC9maWxlTW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT53b3JrZmxvdy9sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqLyo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PndvcmtmbG93L3J1bjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT4qKi8qPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V0YzwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT53b3JrZmxvdy9ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3k8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+d29ya2Zsb3cvcG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5PgorICAgICAgPGZpbHRlcmVkPmZhbHNlPC9maWx0ZXJlZD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT53b3JrZmxvdy9saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3dtZ3IgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9iaW4vd21ncgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQyMTZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3dtZ3IKQEAgLTAsMCArMSwxNjggQEAKKyMhL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KK2N5Z3dpbj1mYWxzZQorb3M0MDA9ZmFsc2UKK2Rhcndpbj1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KK0NZR1dJTiopIGN5Z3dpbj10cnVlOzsKK09TNDAwKikgb3M0MDA9dHJ1ZTs7CitEYXJ3aW4qKSBkYXJ3aW49dHJ1ZTs7Citlc2FjCisKKyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKKworIyBPbmx5IHNldCBPT0RUX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitbIC16ICIkT09EVF9IT01FIiBdICYmIE9PRFRfSE9NRT1gY2QgIiRQUkdESVIvLi4vLi4iIDsgcHdkYAorCisjIEdldCBPT0RUIGVudmlyb25tZW50IHNldCB1cAoraWYgWyAtciAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaCBdOyB0aGVuCisgIC4gIiRPT0RUX0hPTUUiL2Jpbi9lbnYuc2gKK2ZpCisKKyMgT25seSBzZXQgV09SS0ZMT1dfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK2lmIFsgLXogIiRXT1JLRkxPV19IT01FIiBdOyB0aGVuCisgIFdPUktGTE9XX0hPTUU9IiRPT0RUX0hPTUUiL3dvcmtmbG93CisgIGV4cG9ydCBXT1JLRkxPV19IT01FCitmaQorCitpZiBbIC16ICIkV09SS0ZMT1dfUElEIiBdOyB0aGVuCisgIFdPUktGTE9XX1BJRD0iJFdPUktGTE9XX0hPTUUiL3J1bi9jYXMud29ya2Zsb3cucGlkCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJEpSRV9IT01FIiBdICYmIEpSRV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpSRV9IT01FImAKKyAgWyAtbiAiJE9PRFRfSE9NRSIgXSAmJiBPT0RUX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkT09EVF9IT01FImAKKyAgWyAtbiAiJFdPUktGTE9XX0hPTUUiIF0gJiYgV09SS0ZMT1dfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRXT1JLRkxPV19IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCitpZiBbICIkMSIgPSAic3RhcnQiIF07IHRoZW4KKyAgaWYgWyAhIC16ICIkV09SS0ZMT1dfUElEIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiJFdPUktGTE9XX1BJRCIgXTsgdGhlbgorICAgICAgZWNobyAiUElEIGZpbGUgKCRXT1JLRkxPV19QSUQpIGZvdW5kLiBJcyBXb3JrZmxvdyBNYW5hZ2VyIHN0aWxsIHJ1bm5pbmc/IFN0YXJ0IGFib3J0ZWQuIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZmkKKworICAjIEluIGNhc2UgdGhpcyBzY3JpcHQgd2FzIHJ1biBmcm9tIHNvbWV3aGVyZSBlbHNlIGNkIHRvIHRoaXMgZGlyZWN0b3J5CisgIGNkICIkV09SS0ZMT1dfSE9NRSIvYmluCisKKyAgIiRfUlVOSkFWQSIgJEpBVkFfT1BUUyAkT09EVF9PUFRTIFwKKyAgICAtRGphdmEuZXh0LmRpcnM9IiRXT1JLRkxPV19IT01FIi9saWIgXAorICAgIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9IiRXT1JLRkxPV19IT01FIi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucHJvcGVydGllcz0iJFdPUktGTE9XX0hPTUUiL2V0Yy93b3JrZmxvdy5wcm9wZXJ0aWVzIFwKKyAgICAtRGphdmEuaW8udG1wZGlyPSIkT09EVF9UTVBESVIiIFwKKyAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnRhc2subWV0a2V5cy5sZWdhY3lNb2RlPSJ0cnVlIiBcCisgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS50YXNrLnN0YXR1cy5sZWdhY3lNb2RlPSJ0cnVlIiBcCisgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW0uWG1sUnBjV29ya2Zsb3dNYW5hZ2VyIFwKKyAgICAtLXBvcnROdW0gIiRXT1JLRkxPV19QT1JUIiAyPiYxICYKKworICBpZiBbICEgLXogIiRXT1JLRkxPV19QSUQiIF07IHRoZW4KKyAgICBlY2hvICQhID4gJFdPUktGTE9XX1BJRAorICBmaQorCisgIGlmIFsgJGhhdmVfdHR5IC1lcSAxIF07IHRoZW4KKyAgICBlY2hvICJXb3JrZmxvdyBNYW5hZ2VyIHN0YXJ0ZWQgUElEIGZpbGUgKCRXT1JLRkxPV19QSUQpLiIKKyAgZmkKKworZWxpZiBbICIkMSIgPSAic3RvcCIgXTsgdGhlbgorCisgIHNoaWZ0CisKKyAgU0xFRVA9NQorICBpZiBbICEgLXogIiQxIiBdOyB0aGVuCisgICAgZWNobyAkMSB8IGdyZXAgIlteMC05XSIgPiAvZGV2L251bGwgMj4mMQorICAgIGlmIFsgJD8gLWVxIDEgXTsgdGhlbgorICAgICAgU0xFRVA9JDEKKyAgICAgIHNoaWZ0CisgICAgZmkKKyAgZmkKKworICBGT1JDRT0wCisgIGlmIFsgIiQxIiA9ICItZm9yY2UiIF07IHRoZW4KKyAgICBzaGlmdAorICAgIEZPUkNFPTEKKyAgZmkKKworICBpZiBbICEgLXogIiRXT1JLRkxPV19QSUQiIF07IHRoZW4KKyAgICBpZiBbIC1mICIkV09SS0ZMT1dfUElEIiBdOyB0aGVuCisgICAgICBraWxsIGBjYXQgJFdPUktGTE9XX1BJRGAgPi9kZXYvbnVsbCAyPiYxCisgICAgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgICAgZWNobyAiUElEIGZpbGUgKCRXT1JLRkxPV19QSUQpIGZvdW5kIGJ1dCBubyBtYXRjaGluZyBwcm9jZXNzIHdhcyBmb3VuZC4gU3RvcCBhYm9ydGVkLiIKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gIlwkV09SS0ZMT1dfUElEIHdhcyBzZXQgKCRXT1JLRkxPV19QSUQpIGJ1dCB0aGUgc3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3QuIElzIFdvcmtmbG93IE1hbmFnZXIgcnVubmluZz8gU3RvcCBhYm9ydGVkLiIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgaWYgWyAhIC16ICIkV09SS0ZMT1dfUElEIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiJFdPUktGTE9XX1BJRCIgXTsgdGhlbgorICAgICAgd2hpbGUgWyAkU0xFRVAgLWdlIDAgXTsgZG8KKyAgICAgICAga2lsbCAtMCBgY2F0ICRXT1JLRkxPV19QSURgID4vZGV2L251bGwgMj4mMQorICAgICAgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgICAgICBybSAkV09SS0ZMT1dfUElECisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAkU0xFRVAgLWd0IDAgXTsgdGhlbgorICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAkU0xFRVAgLWVxIDAgXTsgdGhlbgorICAgICAgICAgIGlmIFsgJEZPUkNFIC1lcSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIldvcmtmbG93IE1hbmFnZXIgZGlkIG5vdCBzdG9wIGluIHRpbWUuIFBJRCBmaWxlIHdhcyBub3QgcmVtb3ZlZC4iCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgU0xFRVA9YGV4cHIgJFNMRUVQIC0gMSBgCisgICAgICBkb25lCisgICAgZmkKKyAgZmkKKworICBpZiBbICRGT1JDRSAtZXEgMSBdOyB0aGVuCisgICAgaWYgWyAteiAiJFdPUktGTE9XX1BJRCIgXTsgdGhlbgorICAgICAgZWNobyAiS2lsbCBmYWlsZWQ6IFwkV09SS0ZMT1dfUElEIG5vdCBzZXQiCisgICAgZWxzZQorICAgICAgaWYgWyAtZiAiJFdPUktGTE9XX1BJRCIgXTsgdGhlbgorICAgICAgICBlY2hvICJLaWxsaW5nOiBgY2F0ICRXT1JLRkxPV19QSURgIgorICAgICAgICBraWxsIC05IGBjYXQgJFdPUktGTE9XX1BJRGAKKyAgICAgICAgcm0gJFdPUktGTE9XX1BJRAorICAgICAgZmkKKyAgICBmaQorICBmaQorCitlbHNlCisgIGVjaG8gIlVzYWdlOiB3bWdyIHtzdGFydHxzdG9wfSIKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3dtZ3ItY2xpZW50IGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3dtZ3ItY2xpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjE4YjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9iaW4vd21nci1jbGllbnQKQEAgLTAsMCArMSw3NSBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorZGFyd2luPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK0RhcndpbiopIGRhcndpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IE9PRFRfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRPT0RUX0hPTUUiIF0gJiYgT09EVF9IT01FPWBjZCAiJFBSR0RJUi8uLi8uLiIgOyBwd2RgCisKKyMgR2V0IE9PRFQgZW52aXJvbm1lbnQgc2V0IHVwCitpZiBbIC1yICIkT09EVF9IT01FIi9iaW4vZW52LnNoIF07IHRoZW4KKyAgLiAiJE9PRFRfSE9NRSIvYmluL2Vudi5zaAorZmkKKworIyBPbmx5IHNldCBXT1JLRkxPV19IT01FIGlmIG5vdCBhbHJlYWR5IHNldAoraWYgWyAteiAiJFdPUktGTE9XX0hPTUUiIF07IHRoZW4KKyAgV09SS0ZMT1dfSE9NRT0iJE9PRFRfSE9NRSIvd29ya2Zsb3cKKyAgZXhwb3J0IFdPUktGTE9XX0hPTUUKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICBbIC1uICIkSlJFX0hPTUUiIF0gJiYgSlJFX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSlJFX0hPTUUiYAorICBbIC1uICIkT09EVF9IT01FIiBdICYmIE9PRFRfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRPT0RUX0hPTUUiYAorICBbIC1uICIkV09SS0ZMT1dfSE9NRSIgXSAmJiBXT1JLRkxPV19IT01FPWBjeWdwYXRoIC0tdW5peCAiJFdPUktGTE9XX0hPTUUiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgSW4gY2FzZSB0aGlzIHNjcmlwdCB3YXMgcnVuIGZyb20gc29tZXdoZXJlIGVsc2UgY2QgdG8gdGhpcyBkaXJlY3RvcnkKK2NkICIkV09SS0ZMT1dfSE9NRSIvYmluCisKKyIkX1JVTkpBVkEiICRKQVZBX09QVFMgJE9PRFRfT1BUUyBcCisgIC1EamF2YS5leHQuZGlycz0iJFdPUktGTE9XX0hPTUUiL2xpYiBcCisgIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9IiRXT1JLRkxPV19IT01FIi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZz1maWxlOiIkV09SS0ZMT1dfSE9NRSIvcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sIFwKKyAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3ByaW5nLmNvbmZpZz1maWxlOiIkV09SS0ZMT1dfSE9NRSIvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sIFwKKyAgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW0uWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50ICIkQCIKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi93bWtpbGwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9iaW4vd21raWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjZWMyMmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9iaW4vd21raWxsCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9iYXNoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitleHBvcnQgT1JJR19ESVI9YHB3ZGAKK2V4cG9ydCBESVI9YGRpcm5hbWUgJDBgCitjZCAkRElSCitleHBvcnQgRElSX1BBVEg9YHB3ZGAKK2NkICRPUklHX0RJUgorCitpZiBbICIkIyIgLW5lIDEgXTsgdGhlbgorICAgIGVjaG8gIlVzYWdlOiAkMCA8d29ya2Zsb3cgaW5zdGFuY2UgaWQ+IgorICAgIGV4aXQgMQorZWxzZQorICAgIHB1c2hkICRESVJfUEFUSAorICAgIC4vd21nci1jbGllbnQgLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAxIC0tb3BlcmF0aW9uIC0tc3RvcFdvcmtmbG93SW5zdCAtLWlkICQxCisgICAgcG9wZAorZmkKKwpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3dta2lsbGFsbGJ5c3RhdHVzIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3dta2lsbGFsbGJ5c3RhdHVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwZGY5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9iaW4vd21raWxsYWxsYnlzdGF0dXMKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL2Jhc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAKKworZXhwb3J0IE9SSUdfRElSPWBwd2RgCitleHBvcnQgRElSPWBkaXJuYW1lICQwYAorY2QgJERJUgorZXhwb3J0IERJUl9QQVRIPWBwd2RgCitjZCAkT1JJR19ESVIKKworaWYgWyAiJCMiIC1uZSAxIF07IHRoZW4KKyAgICBlY2hvICJVc2FnZTogJDAgPHN0YXR1cywgZS5nLiwgUVVFVUVELCBSU1VCTUlULCBldGMuPiIKKyAgICBleGl0IDEKK2Vsc2UKKyAgICBwdXNoZCAkRElSX1BBVEgKKyAgICBmb3IgaWQgaW4gYC4vd21nci1jbGllbnQgLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAxIC0tb3BlcmF0aW9uIC0tZ2V0Rmlyc3RQYWdlIC0tc3RhdHVzICQxIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGN1dCAtZiAyIC1kID0gfCBjdXQgLWYgMSAtZCAsYCAKKyAgICAgICAgZG8KKyAgICAgICAgICAgIGVjaG8gIktpbGxpbmcgd29ya2Zsb3cgd2l0aCBJRCAkaWQiCisgICAgICAgICAgICAuL3dta2lsbCAkaWQKKyAgICBkb25lCisgICAgcG9wZAorZmkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ2N2RkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXRjL2xvZ2dpbmcucHJvcGVydGllcwpAQCAtMCwwICsxLDY4IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgZGVmYXVsdCBmaWxlIG91dHB1dCBpcyBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuID0gLi4vbG9ncy9jYXNfd29ya2Zsb3clZy5sb2cKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0ID0gNTAwMDAKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmNvdW50ID0gNQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuYXBwZW5kID0gdHJ1ZQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgc3Vic3lzdGVtcworCisjIGRhdGEgc3RydWN0dXJlcyBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5sZXZlbCA9IElORk8KKworIyBlbmdpbmUgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5sZXZlbCA9IElORk8KKworIyBpbnN0YW5jZSByZXBvc2l0b3J5IHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5sZXZlbCA9IElORk8KKworIyByZXBvc2l0b3J5IHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LmxldmVsID0gSU5GTworCisjIHN5c3RlbSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLmxldmVsID0gRklORQorCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjIAorb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmxldmVsID0gSU5GTworc3VuLm5ldC5sZXZlbCA9IE9GRgorc3VuLm5ldC53d3cubGV2ZWwgPSBPRkYKKworIyBzcHJpbmcgZnJhbWV3b3JrIGxvZ2dpbmcKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gU0VWRVJFCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9ldGMvd29ya2Zsb3cucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V0Yy93b3JrZmxvdy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjBkYmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9ldGMvd29ya2Zsb3cucHJvcGVydGllcwpAQCAtMCwwICsxLDcwIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisjIFByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSBXb3JrZmxvdyBNYW5hZ2VyCisKKyMgd29ya2Zsb3cgcmVwb3NpdG9yeSBmYWN0b3J5Cit3b3JrZmxvdy5yZXBvLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuWE1MV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeQorCisjIHdvcmtmbG93IGVuZ2luZSBmYWN0b3J5Cit3b3JrZmxvdy5lbmdpbmUuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLlRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZUZhY3RvcnkKKworIyB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IGZhY3RvcnkKK3dvcmtmbG93LmVuZ2luZS5pbnN0YW5jZVJlcC5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5MdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkKKworIyB0aHJlYWQgcG9vbCB3b3JrZmxvdyBlbmdpbmUgcHJvcGVydGllcworb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucXVldWVTaXplPQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUubWF4UG9vbFNpemU9CitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5taW5Qb29sU2l6ZT02CitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS50aHJlYWRLZWVwQWxpdmUubWludXRlcz01CitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS51bmxpbWl0ZWRRdWV1ZT10cnVlCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcmVDb25kaXRpb25XYWl0VGltZT0xMAorCisjIHNldCB0aGlzIGlmIHlvdSB3YW50IHRoZSB3b3JrZmxvdyBtYW5hZ2VyIHRvIHN1Ym1pdCBqb2JzIHRocm91Z2ggdGhlIHJlc291cmNlIG1ncgorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucmVzb3VyY2VtZ3IudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6OTAwMgorCisjIGlmIHlvdSB1c2UgdGhlIHJlc291cmNlIG1nciBzdWJtaXNzaW9uLCB5b3UgY2FuIHNwZWNpZnkgaG93IG1hbnkgc2Vjb25kcyB0aGUgCisjIHdvcmtmbG93IG1hbmFnZXIgc2hvdWxkIHdhaXQgaW5iZXR3ZWVuIGNoZWNraW5nIHRvIHNlZSBpZiBhIGpvYiBpcyBjb21wbGV0ZQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucmVzb3VyY2VtZ3IucG9sbGluZ1dhaXRUaW1lPTEwCisKKyMgd29ya2Zsb3cgaW5zdGFuY2UgcmVwb3NpdG9yeSBnZW5lcmFsIHByb3BlcnRpZXMKKyMgZGVmYXVsdCBwYWdlIHNpemUgdG8gcGFnZSB0aHJvdWdoIFdvcmtmbG93SW5zdGFuY2VzIHdpdGgKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2VSZXAucGFnZVNpemU9MjAKKworIyBsdWNlbmUgd29ya2Zsb3cgaW5zdGFuY2UgcmVwb3NpdG9yeSBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmx1Y2VuZS5pZHhQYXRoPVtPT0RUX0hPTUVdL2RhdGEvd29ya2Zsb3cKKworIyBkYXRhIHNvdXJjZSB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IHByb3BlcnRpZXMKKyMgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLmpkYmMudXJsPWpkYmM6dXJsCisjIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2VSZXAuZGF0YXNvdXJjZS5qZGJjLnVzZXI9dXNlcgorIyBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmRhdGFzb3VyY2UuamRiYy5wYXNzPXBhc3MKKyMgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLmpkYmMuZHJpdmVyPXlvdXIuamRiYy5Ecml2ZXIKKyMgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLnF1b3RlRmllbGRzPWZhbHNlCisKKyMgWE1MIHdvcmtmbG93IHJlcG9zaXRvcnkgcHJvcGVydGllcworb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRpcnM9ZmlsZTovL1tXT1JLRkxPV19IT01FXS9wb2xpY3kKKworIyB3ZW5naW5lLXN0eWxlIHBhY2thZ2VkIHdvcmtmbG93IHJlcG8gcHJvcGVydGllcworI29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2VuZ2luZS5wYWNrYWdlZFJlcG8uZGlyLnBhdGggPSAvcGF0aC90by93ZW5naW5lL3dvcmtmbG93L2ZpbGVzCisKKyMgZGF0YSBzb3VyY2Ugd29ya2Zsb3cgcmVwb3NpdG9yeSBwcm9wZXJ0aWVzCisjIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kYXRhc291cmNlLmpkYmMudXJsPWpkYmM6dXJsCisjIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCisjIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kYXRhc291cmNlLmpkYmMucGFzcz1wYXNzCisjIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kYXRhc291cmNlLmpkYmMuZHJpdmVyPXlvdXIuamRiYy5Ecml2ZXIKKworIyBTcHJpbmcgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgYWN0aW9uIHN0b3JlIHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnPXNyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbAorb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnNwcmluZy5jb25maWc9c3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLW9wdGlvbnMueG1sCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9sb2dzL1JFTU9WRS5sb2cgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9sb2dzL1JFTU9WRS5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzY2U3MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2xvZ3MvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDE5IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitZb3UgY2FuIHJlbW92ZSB0aGlzIGZpbGUuIEl0IHdhcyBvbmx5IGluY2x1ZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2cgZGlyZWN0b3J5IGZvciB0aGlzCitkaXN0cmlidXRpb24gd2FzIGNyZWF0ZWQgb24gYXNzZW1ibHkuCisKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMyMTJlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sCkBAIC0wLDAgKzEsODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisgICAgPGJlYW4gaWQ9InNlbmRFdmVudCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5TZW5kRXZlbnRDbGlBY3Rpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBhbiBldmVudCIgLz4KKyAgICA8L2JlYW4+CisgICAgPGJlYW4gaWQ9ImR5bldvcmtmbG93IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkR5bldvcmtmbG93Q2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJDcmVhdGVzIGEgd29ya2Zsb3cgdXNpbmcgdGhlIGdpdmVuIHRhc2tzIGFuZCB0aGVuIGV4ZWN1dGVzIGl0IiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRXb3JrZmxvd0luc3RzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFdvcmtmbG93SW5zdHNDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3QgYWxsIHdvcmtmbG93IGluc3RhbmNlcyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0V29ya2Zsb3dzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFdvcmtmbG93c0NsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTGlzdCBhbGwgd29ya2Zsb3cgbW9kZWxzIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRUYXNrQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRUYXNrQnlJZENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB0YXNrIGluZm9ybWF0aW9uIGZvciB0YXNrIHdpdGggZ2l2ZW4gSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldENvbmRpdGlvbkJ5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0Q29uZGl0aW9uQnlJZENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBjb25kaXRpb24gaW5mb3JtYXRpb24gZm9yIGNvbmRpdGlvbiB3aXRoIGdpdmVuIElEIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRXb3JrZmxvd0J5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0V29ya2Zsb3dCeUlkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHdvcmtmbG93IGluZm9ybWF0aW9uIGZvciB3b3JrZmxvdyB3aXRoIGdpdmVuIElEIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRXb3JrZmxvd3NCeUV2ZW50IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFdvcmtmbG93c0J5RXZlbnRDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3Qgd29ya2Zsb3cgaW5mb3JtYXRpb24gZm9yIHdvcmtmbG93cyB3aXRoIGF0dGFjaGVkIHRvIGV2ZW50IiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRSZWdpc3RlcmVkRXZlbnRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFJlZ2lzdGVyZWRFdmVudHNDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3QgcmVnaXN0ZXJlZCBldmVudHMiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFdvcmtmbG93SW5zdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRXb3JrZmxvd0luc3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgd29ya2Zsb3cgaW5zdGFuY2UgYnkgaW5zdGFuY2UgSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFdhbGxDbG9ja1RpbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0V2FsbENsb2NrVGltZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB3YWxsIGNsb2NrIHRpbWUgZm9yIHdvcmtmbG93IGluc3RhbmNlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRUYXNrV2FsbENsb2NrVGltZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRUYXNrV2FsbENsb2NrVGltZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB3YWxsIGNsb2NrIHRpbWUgZm9yIHdvcmtmbG93IGluc3RhbmNlJ3MgY3VycmVudCB0YXNrIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJzdG9wV29ya2Zsb3dJbnN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLlN0b3BXb3JrZmxvd0luc3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlN0b3BzIGEgd29ya2Zsb3cgaW5zdGFuY2UiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InBhdXNlV29ya2Zsb3dJbnN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLlBhdXNlV29ya2Zsb3dJbnN0Q2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQYXVzZXMgYSB3b3JrZmxvdyBpbnN0YW5jZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0icmVzdW1lV29ya2Zsb3dJbnN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLlJlc3VtZVdvcmtmbG93SW5zdENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUmVzdW1lcyBhIHBhdXNlZCB3b3JrZmxvdyBpbnN0YW5jZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0Rmlyc3RQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldEZpcnN0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBmaXJzdCBwYWdlIG9mIHdvcmtmbG93cyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0TmV4dFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0TmV4dFBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgbmV4dCBwYWdlIG9mIHdvcmtmbG93cyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0UHJldlBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0UHJldlBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgcHJldiBwYWdlIG9mIHdvcmtmbG93cyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0TGFzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0TGFzdFBhZ2VDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgbGFzdCBwYWdlIG9mIHdvcmtmbG93cyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0V29ya2Zsb3dJbnN0TWV0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFdvcmtmbG93SW5zdE1ldENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB3b3JrZmxvdyBpbnN0YW5jZSBtZXRhZGF0YSIgLz4KKyAgPC9iZWFuPgorCis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VmZDRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sCkBAIC0wLDAgKzEsNjgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IgCisgICAgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIAorICAgIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byAKKyAgICBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSAKKyAgICB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIAorICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgCisgICAgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSAKKyAgICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIAorICAgIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyAKKyAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiBBdXRob3I6IAorICAgIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikgLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworICAgIDxiZWFuIGlkPSJ1cmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IldvcmtmbG93IE1hbmFnZXIgVVJMIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1cmwiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuCisgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLlNldEphdmFQcm9wZXJ0aWVzSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5TmFtZXMiPgorICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnVybDwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9iZWFuPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJvcGVyYXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ib3AiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ib3BlcmF0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgICB2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByZXNlbnQgYW4gb3BlcmF0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9InNlbmRFdmVudCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJkeW5Xb3JrZmxvdyIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRXb3JrZmxvd0luc3RzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFdvcmtmbG93cyIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRUYXNrQnlJZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRDb25kaXRpb25CeUlkIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFdvcmtmbG93QnlJZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRXb3JrZmxvd3NCeUV2ZW50IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFJlZ2lzdGVyZWRFdmVudHMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0V29ya2Zsb3dJbnN0IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFdhbGxDbG9ja1RpbWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0VGFza1dhbGxDbG9ja1RpbWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgIHA6b3B0aW9uLXJlZj0ic3RvcFdvcmtmbG93SW5zdCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJwYXVzZVdvcmtmbG93SW5zdCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJyZXN1bWVXb3JrZmxvd0luc3QiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgIHA6b3B0aW9uLXJlZj0iZ2V0Rmlyc3RQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldE5leHRQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFByZXZQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldExhc3RQYWdlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFdvcmtmbG93SW5zdE1ldCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBTZW5kRXZlbnQgT3B0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0ic2VuZEV2ZW50IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzZW5kRXZlbnQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHNlbmRFdmVudCBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5zZW5kRXZlbnQ8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic2VuZEV2ZW50IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIER5bldvcmtmbG93IE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImR5bldvcmtmbG93IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkdyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJkeW5Xb3JrZmxvdyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZHluV29ya2Zsb3cgQWN0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+ZHluV29ya2Zsb3c8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZHluV29ya2Zsb3ciIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJ0YXNrSWRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InRpZHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idGFza0lkcyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTGlzdCBvZiB3b3JrZmxvdyB0YXNrIGlkcyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0idGFzay1pZHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJkeW5Xb3JrZmxvdyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIEdldFdvcmtmbG93SW5zdHMgT3B0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0iZ2V0V29ya2Zsb3dJbnN0cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0id2luc3RzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFdvcmtmbG93SW5zdHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIEdldFdvcmtmbG93SW5zdHMgQWN0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+Z2V0V29ya2Zsb3dJbnN0czwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJHZXRXb3JrZmxvd0luc3RzIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIEdldFdvcmtmbG93cyBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJnZXRXb3JrZmxvd3MiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9IndmbG93cyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRXb3JrZmxvd3MiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFdvcmtmbG93cyBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRXb3JrZmxvd3M8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0V29ya2Zsb3dzIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIEdldFRhc2tCeUlkIE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImdldFRhc2tCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0YnlpZCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRUYXNrQnlJZCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0VGFza0J5SWQgQWN0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+Z2V0VGFza0J5SWQ8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0VGFza0J5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gR2V0VGFza0J5SWQgT3B0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0iZ2V0Q29uZGl0aW9uQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iY2J5aWQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0Q29uZGl0aW9uQnlJZCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Q29uZGl0aW9uQnlJZCBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRDb25kaXRpb25CeUlkPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldENvbmRpdGlvbkJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gR2V0V29ya2Zsb3dCeUlkIE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImdldFdvcmtmbG93QnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0id2J5aWQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0V29ya2Zsb3dCeUlkIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRXb3JrZmxvd0J5SWQgQWN0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+Z2V0V29ya2Zsb3dCeUlkPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBHZXRXb3JrZmxvd3NCeUV2ZW50IE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImdldFdvcmtmbG93c0J5RXZlbnQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9IndieWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0V29ya2Zsb3dzQnlFdmVudCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0V29ya2Zsb3dzQnlFdmVudCBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRXb3JrZmxvd3NCeUV2ZW50PC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93c0J5RXZlbnQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gR2V0UmVnaXN0ZXJlZEV2ZW50cyBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJnZXRSZWdpc3RlcmVkRXZlbnRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJldmVudHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UmVnaXN0ZXJlZEV2ZW50cyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UmVnaXN0ZXJlZEV2ZW50cyBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRSZWdpc3RlcmVkRXZlbnRzPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFJlZ2lzdGVyZWRFdmVudHMiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gR2V0V29ya2Zsb3dJbnN0IE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImdldFdvcmtmbG93SW5zdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iaW5zdCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRXb3JrZmxvd0luc3QiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFdvcmtmbG93SW5zdCBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRXb3JrZmxvd0luc3Q8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0V29ya2Zsb3dJbnN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIEdldFdhbGxDbG9ja1RpbWUgT3B0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0iZ2V0V2FsbENsb2NrVGltZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idGltZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRXYWxsQ2xvY2tUaW1lIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRXYWxsQ2xvY2tUaW1lIEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPmdldFdhbGxDbG9ja1RpbWU8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0V2FsbENsb2NrVGltZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBHZXRUYXNrV2FsbENsb2NrVGltZSBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJnZXRUYXNrV2FsbENsb2NrVGltZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idHRpbWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0VGFza1dhbGxDbG9ja1RpbWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFRhc2tXYWxsQ2xvY2tUaW1lIEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPmdldFRhc2tXYWxsQ2xvY2tUaW1lPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFRhc2tXYWxsQ2xvY2tUaW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIFN0b3BXb3JrZmxvd0luc3QgT3B0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0ic3RvcFdvcmtmbG93SW5zdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic3RvcCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJzdG9wV29ya2Zsb3dJbnN0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBzdG9wV29ya2Zsb3dJbnN0IEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPnN0b3BXb3JrZmxvd0luc3Q8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3RvcFdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBQYXVzZVdvcmtmbG93SW5zdCBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJwYXVzZVdvcmtmbG93SW5zdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icGF1c2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icGF1c2VXb3JrZmxvd0luc3QiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHBhdXNlV29ya2Zsb3dJbnN0IEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPnBhdXNlV29ya2Zsb3dJbnN0PC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InBhdXNlV29ya2Zsb3dJbnN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIFJlc3VtZVdvcmtmbG93SW5zdCBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJyZXN1bWVXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJlc3VtZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJyZXN1bWVXb3JrZmxvd0luc3QiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHJlc3VtZVdvcmtmbG93SW5zdCBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5yZXN1bWVXb3JrZmxvd0luc3Q8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVzdW1lV29ya2Zsb3dJbnN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIEdldEZpcnN0UGFnZSBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJnZXRGaXJzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBhZ2UxIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldEZpcnN0UGFnZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Rmlyc3RQYWdlIEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPmdldEZpcnN0UGFnZTwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRGaXJzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gR2V0TmV4dFBhZ2UgT3B0aW9ucyAtLT4KKyAgICA8YmVhbiBpZD0iZ2V0TmV4dFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im5leHQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TmV4dFBhZ2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldE5leHRQYWdlIEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPmdldE5leHRQYWdlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8IS0tIEdldFByZXZQYWdlIE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImdldFByZXZQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwcmV2IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFByZXZQYWdlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRQcmV2UGFnZSBBY3Rpb24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRQcmV2UGFnZTwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRQcmV2UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorCisgICAgPCEtLSBHZXRMYXN0UGFnZSBPcHRpb25zIC0tPgorICAgIDxiZWFuIGlkPSJnZXRMYXN0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibGFzdCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRMYXN0UGFnZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0TGFzdFBhZ2UgQWN0aW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8dmFsdWU+Z2V0TGFzdFBhZ2U8L3ZhbHVlPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0TGFzdFBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gR2V0V29ya2Zsb3dJbnN0TWV0IE9wdGlvbnMgLS0+CisgICAgPGJlYW4gaWQ9ImdldFdvcmtmbG93SW5zdE1ldCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZ2V0TWV0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFdvcmtmbG93SW5zdE1ldCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0V29ya2Zsb3dJbnN0TWV0IEFjdGlvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPHZhbHVlPmdldFdvcmtmbG93SW5zdE1ldDwvdmFsdWU+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0luc3RNZXQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDwhLS0gT3B0aW9ucyB1c2VkIGZvciBtdWx0aXBsZSBBY3Rpb25zIC0tPgorICAgIDxiZWFuIGlkPSJldmVudE5hbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZW4iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZXZlbnROYW1lIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJOYW1lIG9mIHRoZSBFdmVudCB0byB0cmlnZ2VyIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJldmVudC1uYW1lIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic2VuZEV2ZW50IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0V29ya2Zsb3dzQnlFdmVudCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0ibWV0YURhdGEiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJtZXRhRGF0YSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVjbGFyZSB0aGF0IHlvdSB3aXNoIHRvIHByZXNlbnQgbWV0YWRhdGEiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJzZW5kRXZlbnQiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJkeW5NZXRhZGF0YSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWJPcHRpb25zIj4KKyAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgIHA6b3B0aW9uLXJlZj0ia2V5IiBwOnJlcXVpcmVkPSJ0cnVlIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIGlkPSJrZXkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIgorICAgICAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iayIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJrZXkiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IldvcmtmbG93IE1ldGFkYXRhOiBrZXkgdmFsIHZhbC4uLiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ia2V5LXZhbHMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBlYXRpbmciIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJzZW5kRXZlbnQiIHA6bWV0aG9kTmFtZT0iYWRkTWV0YWRhdGEiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImR5bldvcmtmbG93IiBwOm1ldGhvZE5hbWU9ImFkZE1ldGFkYXRhIiAvPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0iaWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iaWQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaWQiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IklEIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJpZCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFRhc2tCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0Q29uZGl0aW9uQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93QnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdhbGxDbG9ja1RpbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRUYXNrV2FsbENsb2NrVGltZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InN0b3BXb3JrZmxvd0luc3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJwYXVzZVdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InJlc3VtZVdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93SW5zdE1ldCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFRhc2tCeUlkIiBwOm1ldGhvZE5hbWU9InNldFRhc2tJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFyZ0Rlc2NyaXB0aW9uPSJ0YXNrLWlkIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRDb25kaXRpb25CeUlkIiBwOm1ldGhvZE5hbWU9InNldENvbmRpdGlvbklkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YXJnRGVzY3JpcHRpb249ImNvbmRpdGlvbi1pZCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0V29ya2Zsb3dCeUlkIiBwOm1ldGhvZE5hbWU9InNldFdvcmtmbG93SWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphcmdEZXNjcmlwdGlvbj0id29ya2Zsb3ctaWQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93SW5zdCIgcDptZXRob2ROYW1lPSJzZXRJbnN0YW5jZUlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YXJnRGVzY3JpcHRpb249Imluc3RhbmNlLWlkIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRXYWxsQ2xvY2tUaW1lIiBwOm1ldGhvZE5hbWU9InNldEluc3RhbmNlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphcmdEZXNjcmlwdGlvbj0iaW5zdGFuY2UtaWQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFRhc2tXYWxsQ2xvY2tUaW1lIiBwOm1ldGhvZE5hbWU9InNldEluc3RhbmNlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphcmdEZXNjcmlwdGlvbj0iaW5zdGFuY2UtaWQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9InN0b3BXb3JrZmxvd0luc3QiIHA6bWV0aG9kTmFtZT0ic2V0SW5zdGFuY2VJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFyZ0Rlc2NyaXB0aW9uPSJpbnN0YW5jZS1pZCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icGF1c2VXb3JrZmxvd0luc3QiIHA6bWV0aG9kTmFtZT0ic2V0SW5zdGFuY2VJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFyZ0Rlc2NyaXB0aW9uPSJpbnN0YW5jZS1pZCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0icmVzdW1lV29ya2Zsb3dJbnN0IiBwOm1ldGhvZE5hbWU9InNldEluc3RhbmNlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDphcmdEZXNjcmlwdGlvbj0iaW5zdGFuY2UtaWQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93SW5zdE1ldCIgcDptZXRob2ROYW1lPSJzZXRJbnN0YW5jZUlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YXJnRGVzY3JpcHRpb249Imluc3RhbmNlLWlkIiAvPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYmVhbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0ic3RhdHVzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic3RhdHVzIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJXb3JrZmxvdyBzdGF0dXMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InN0YXR1cyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEZpcnN0UGFnZSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRMYXN0UGFnZSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciIgLz4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBpZD0icGFnZU51bSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InBhZ2VOdW0iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlBhZ2UgTnVtYmVyIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImludCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0icGFnZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldE5leHRQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorPC9iZWFucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY29uZGl0aW9ucy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY29uZGl0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NWZjNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jb25kaXRpb25zLnhtbApAQCAtMCwwICsxLDIxIEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmNvbmRpdGlvbnMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+Cis8IS0tCisgIFRPRE86IEFkZCBzb21lIGV4YW1wbGVzCistLT4KKzwvY2FzOmNvbmRpdGlvbnM+CmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvZXZlbnRzLnhtbCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9ldmVudHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTAyYWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvZXZlbnRzLnhtbApAQCAtMCwwICsxLDIxIEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOndvcmtmbG93ZXZlbnRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorPCEtLQorICBUT0RPOiBBZGQgc29tZSBleGFtcGxlcworLS0+Cis8L2Nhczp3b3JrZmxvd2V2ZW50cz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS90YXNrcy54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvdGFza3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWE2N2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvdGFza3MueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6dGFza3MgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+Cis8IS0tCisgIFRPRE86IEFkZCBzb21lIGV4YW1wbGVzCistLT4KKzwvY2FzOnRhc2tzPgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3dvcmtmbG93LWluc3RhbmNlLW1ldC54bWwgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvd29ya2Zsb3ctaW5zdGFuY2UtbWV0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA1YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3dvcmtmbG93LWluc3RhbmNlLW1ldC54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEZJWE1FOiBDaGFuZ2UgbmFtZXNwYWNlIFVSST8gLS0+Cis8Y2FzOndpbnN0ZmllbGRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorPGRlZmF1bHQ+CisgIDxmaWVsZCBuYW1lPSJXb3JrZmxvd0luc3RJZCIvPgorICA8ZmllbGQgbmFtZT0iVGFza0lkIi8+CisgIDxmaWVsZCBuYW1lPSJQcm9jZXNzaW5nTm9kZSIvPgorPC9kZWZhdWx0PgorPHdvcmtmbG93IGlkPSJ1cm46b29kdDp0ZXN0V29ya2Zsb3ciPgorICA8ZmllbGQgbmFtZT0iV29ya2Zsb3dJbnN0SWQiLz4KKzwvd29ya2Zsb3c+Cis8d29ya2Zsb3cgaWQ9InVybjpvb2R0OnRlc3RNZXRFcnJvcldvcmtmbG93Ij4KKyAgPGZpZWxkIG5hbWU9Im51bVNlY29uZHMiLz4KKyAgPGZpZWxkIG5hbWU9IldvcmtmbG93SW5zdElkIi8+CisgIDxmaWVsZCBuYW1lPSJQcm9jZXNzaW5nTm9kZSIvPgorPC93b3JrZmxvdz4KKzwhLS0KKyAgVE9ETzogQWRkIHNvbWUgZG9jdW1lbnRhdGlvbgorLS0+Cis8L2Nhczp3aW5zdGZpZWxkcz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS93b3JrZmxvdy1saWZlY3ljbGUueG1sIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3dvcmtmbG93LWxpZmVjeWNsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiYTY0MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS93b3JrZmxvdy1saWZlY3ljbGUueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBGSVhNRTogQ2hhbmdlIG5hbWVzcGFjZSBVUkk/IC0tPgorPGNhczp3b3JrZmxvd2xpZmVjeWNsZXMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+Cis8ZGVmYXVsdD4KKyAgPHN0YWdlIG5hbWU9ImVycm9yIj4KKyAgICA8c3RhdHVzPk1FVE1JU1M8L3N0YXR1cz4KKyAgICA8c3RhdHVzPkVSUk9SPC9zdGF0dXM+CisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJzZXR1cCI+CisgICAgPHN0YXR1cz5RVUVVRUQ8L3N0YXR1cz4KKyAgICA8c3RhdHVzPkNSRUFURUQ8L3N0YXR1cz4KKyAgPC9zdGFnZT4KKyAgPHN0YWdlIG5hbWU9InByZWNvbmRfY2hlY2siPgorICAgIDxzdGF0dXM+UEFVU0VEPC9zdGF0dXM+ICAKKyAgPC9zdGFnZT4KKyAgPHN0YWdlIG5hbWU9IndvcmtmbG93X3N0YXJ0Ij4KKyAgICA8c3RhdHVzPlJTVUJNSVQ8L3N0YXR1cz4KKyAgICA8c3RhdHVzPlNUQVJURUQ8L3N0YXR1cz4KKyAgPC9zdGFnZT4KKyAgPHN0YWdlIG5hbWU9InBnZV9zZXR1cF9idWlsZF9jb25maWdfZmlsZSI+CisgICAgPHN0YXR1cz5CVUlMRElORyBDT05GSUcgRklMRTwvc3RhdHVzPgorICA8L3N0YWdlPgorICA8c3RhZ2UgbmFtZT0icGdlX3N0YWdpbmdfaW5wdXQiPgorICAgIDxzdGF0dXM+U1RBR0lORyBJTlBVVDwvc3RhdHVzPgorICA8L3N0YWdlPgorICA8c3RhZ2UgbmFtZT0icGdlX2V4ZWMiPgorICAgIDxzdGF0dXM+UEdFIEVYRUM8L3N0YXR1cz4KKyAgPC9zdGFnZT4KKyAgPHN0YWdlIG5hbWU9InBjc19jcmF3bCI+CisgICAgPHN0YXR1cz5DUkFXTElORzwvc3RhdHVzPgorICA8L3N0YWdlPgorICA8c3RhZ2UgbmFtZT0iY29tcGxldGlvbiI+CisgICAgPHN0YXR1cz5GSU5JU0hFRDwvc3RhdHVzPgorICA8L3N0YWdlPgorPC9kZWZhdWx0PgorCis8IS0tIAorICBMaWZlY3ljbGVzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhdCB0aGUgCisgIFdvcmtmbG93IElkIGxldmVsLCBieSBzdGFydGluZyB3aXRoIGEgCisgIDxsaWZlY3ljbGUgbmFtZT0iIiB3b3JrZmxvd0lkPSJzb21lX2lkIj4KKyAgICAKKyAgICBkZWNsYXJhdGlvbiwgYW5kIHRoZW4gdXNpbmcgdGhlIHN0YWdlCisgICAgYW5kIHN0YXR1cyB0YWdzIGFwcHJvcHJpYXRlbHkgYXMgc2hvd24KKyAgICBhYm92ZQorICAgIAorICA8L2xpZmVjeWNsZT4KKyAtLT4KKzwvY2FzOndvcmtmbG93bGlmZWN5Y2xlcz4KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9yYWRpeCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9yYWRpeApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDg1MDNhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9tdm4vYXJjaGV0eXBlcy9yYWRpeC9zcmMvbWFpbi9yZXNvdXJjZXMvYmluL3JhZGl4CkBAIC0wLDAgKzEsMTkgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworbXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUdyb3VwSWQ9b3JnLmFwYWNoZS5vb2R0IFwKKyAgICAtRGFyY2hldHlwZUFydGlmYWN0SWQ9cmFkaXgtYXJjaGV0eXBlIC1EYXJjaGV0eXBlVmVyc2lvbj0wLjkgXAorICAgIC1Eb29kdD0wLjEwIC1EZ3JvdXBJZD1jb20ubXljb21wYW55IFwKKyAgICAtRGFydGlmYWN0SWQ9b29kdCAtRHZlcnNpb249MC4xCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9iYXNpYy9hcmNoZXR5cGUucHJvcGVydGllcyBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2plY3RzL2Jhc2ljL2FyY2hldHlwZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NWRmNzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9iYXNpYy9hcmNoZXR5cGUucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjTW9uIE1heSAxNiAxMTo1NToyNiBQRFQgMjAxMQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit2ZXJzaW9uPTAuMS1TTkFQU0hPVAorZ3JvdXBJZD1hcmNoZXR5cGUuaXQKK2FydGlmYWN0SWQ9YmFzaWMKK29vZHQ9MC43LVNOQVBTSE9UCmRpZmYgLS1naXQgYS8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9iYXNpYy9nb2FsLnR4dCBiLzAuMTAvbXZuL2FyY2hldHlwZXMvcmFkaXgvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2plY3RzL2Jhc2ljL2dvYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWM3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9hcmNoZXR5cGVzL3JhZGl4L3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9iYXNpYy9nb2FsLnR4dApAQCAtMCwwICsxLDE2IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CmRpZmYgLS1naXQgYS8wLjEwL212bi9wbHVnaW5zL2Nhcy1pbnN0YWxsL3BvbS54bWwgYi8wLjEwL212bi9wbHVnaW5zL2Nhcy1pbnN0YWxsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZDIwNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL3BsdWdpbnMvY2FzLWluc3RhbGwvcG9tLnhtbApAQCAtMCwwICsxLDk1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5tYXZlbi1jYXMtaW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CisgIDxuYW1lPkNBUyBJbnN0YWxsZXIgTWF2ZW4gTW9qbzwvbmFtZT4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjcuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxidWlsZD4KKyAgCTxwbHVnaW5NYW5hZ2VtZW50PgorICAJCTxwbHVnaW5zPgorICAJCQk8IS0tVGhpcyBwbHVnaW4ncyBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgRWNsaXBzZSBtMmUgc2V0dGluZ3Mgb25seS4gSXQgaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGUgTWF2ZW4gYnVpbGQgaXRzZWxmLi0tPgorICAJCQk8cGx1Z2luPgorICAJCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UubTJlPC9ncm91cElkPgorICAJCQkJPGFydGlmYWN0SWQ+bGlmZWN5Y2xlLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisgIAkJCQk8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKyAgCQkJCTxjb25maWd1cmF0aW9uPgorICAJCQkJCTxsaWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgIAkJCQkJCTxwbHVnaW5FeGVjdXRpb25zPgorICAJCQkJCQkJPHBsdWdpbkV4ZWN1dGlvbj4KKyAgCQkJCQkJCQk8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorICAJCQkJCQkJCQk8Z3JvdXBJZD4KKyAgCQkJCQkJCQkJCW9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucworICAJCQkJCQkJCQk8L2dyb3VwSWQ+CisgIAkJCQkJCQkJCTxhcnRpZmFjdElkPgorICAJCQkJCQkJCQkJbWF2ZW4tcGx1Z2luLXBsdWdpbgorICAJCQkJCQkJCQk8L2FydGlmYWN0SWQ+CisgIAkJCQkJCQkJCTx2ZXJzaW9uUmFuZ2U+CisgIAkJCQkJCQkJCQlbMy4zLCkKKyAgCQkJCQkJCQkJPC92ZXJzaW9uUmFuZ2U+CisgIAkJCQkJCQkJCTxnb2Fscz4KKyAgCQkJCQkJCQkJCTxnb2FsPmRlc2NyaXB0b3I8L2dvYWw+CisgIAkJCQkJCQkJCTwvZ29hbHM+CisgIAkJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgIAkJCQkJCQkJPGFjdGlvbj4KKyAgCQkJCQkJCQkJPGlnbm9yZSAvPgorICAJCQkJCQkJCTwvYWN0aW9uPgorICAJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb24+CisgIAkJCQkJCTwvcGx1Z2luRXhlY3V0aW9ucz4KKyAgCQkJCQk8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKyAgCQkJCTwvY29uZmlndXJhdGlvbj4KKyAgCQkJPC9wbHVnaW4+CisgIAkJPC9wbHVnaW5zPgorICAJPC9wbHVnaW5NYW5hZ2VtZW50PgorICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vcGx1Z2lucy9jYXMtaW5zdGFsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvaW5zdGFsbC9BbnREZWNvcmF0b3IuamF2YSBiLzAuMTAvbXZuL3BsdWdpbnMvY2FzLWluc3RhbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2luc3RhbGwvQW50RGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwYjBiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvbXZuL3BsdWdpbnMvY2FzLWluc3RhbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2luc3RhbGwvQW50RGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5pbnN0YWxsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vQU5UIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNobW9kOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlbGV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VbnRhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VbnRhci5VbnRhckNvbXByZXNzaW9uTWV0aG9kOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGRlY29yYXRvciB3cmFwcGluZyA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BcGFjaGUgQW50PC9hPiBjb3JlCisgKiB0YXNrcworICogPC9wPi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFudERlY29yYXRvciB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNobW9kRmlsZShGaWxlIGZpbGUsIFN0cmluZyBwZXJtcyl7CisgICAgICAgIENobW9kZXIgY2htb2QgPSBuZXcgQ2htb2RlcigpOworICAgICAgICBjaG1vZC5zZXRGaWxlKGZpbGUpOworICAgICAgICBjaG1vZC5zZXRQZXJtKHBlcm1zKTsKKyAgICAgICAgY2htb2QuZXhlY3V0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxGaWxlc0FuZERpcihGaWxlIHN0YXJ0RGlyKSB7CisgICAgICAgIERlbGV0ZXIgZGVsZXRlID0gbmV3IERlbGV0ZXIoKTsKKyAgICAgICAgZGVsZXRlLnNldERpcihzdGFydERpcik7CisgICAgICAgIGRlbGV0ZS5zZXRJbmNsdWRlRW1wdHlEaXJzKHRydWUpOworICAgICAgICBkZWxldGUuc2V0VmVyYm9zZSh0cnVlKTsKKyAgICAgICAgZGVsZXRlLnNldEZvbGxvd1N5bWxpbmtzKHRydWUpOworICAgICAgICBkZWxldGUuZXhlY3V0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnRhckZpbGUoRmlsZSB0YXJGaWxlLCBGaWxlIGRlc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVudGFyZXIgdW50YXIgPSBuZXcgVW50YXJlcigpOworICAgICAgICBVbnRhci5VbnRhckNvbXByZXNzaW9uTWV0aG9kIGNvbXBNZXRob2QgPSBuZXcgVW50YXJDb21wcmVzc2lvbk1ldGhvZCgpOworICAgICAgICBjb21wTWV0aG9kLnNldFZhbHVlKCJnemlwIik7CisgICAgICAgIHVudGFyLnNldENvbXByZXNzaW9uKGNvbXBNZXRob2QpOworICAgICAgICB1bnRhci5zZXREZXN0KGRlc3REaXIpOworICAgICAgICB1bnRhci5zZXRTcmModGFyRmlsZSk7CisgICAgICAgIHVudGFyLmV4ZWN1dGUoKTsKKworICAgICAgICAvLyBub3cgdGhhdCB0aGUgd29yayBpcyBkb25lLCB1c2UgZmlsZSB1dGlscyB0bworICAgICAgICAvLyBtb3ZlIGV2ZXJ5dGhpbmcgb3V0IG9mIGRlc3REaXIvdGFyRmlsZU5vRXh0CisgICAgICAgIC8vIGludG8gZGVzdERpcgorICAgICAgICAvLyB0aGVuIGRlbGV0ZSBkZXN0RGlyL3RhckZpbGVOb0V4dAorICAgICAgICBTdHJpbmcgd3JvbmdJbnN0YWxsRGlyID0gZGVzdERpci5nZXRDYW5vbmljYWxQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgorICAgICAgICAgICAgICAgICsgZ2V0RmlsZU5hbWVOb0V4dCh0YXJGaWxlLmdldE5hbWUoKSk7CisgICAgICAgIEZpbGVVdGlscy5jb3B5RGlyZWN0b3J5KG5ldyBGaWxlKHdyb25nSW5zdGFsbERpciksIGRlc3REaXIsIHRydWUpOworCisgICAgICAgIC8vIGdycnIgamF2YSBJTywgbG92ZSBpdAorICAgICAgICAvLyBiZWNhdXNlIGl0IHN1Y2tzLCB3ZSBoYXZlIHRvIENITU9EIGV2ZXJ5dGhpbmcgaW4gZGVzdERpci9iaW4KKyAgICAgICAgRmlsZSBiaW5EaXIgPSBuZXcgRmlsZShkZXN0RGlyLmdldENhbm9uaWNhbFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgKyAiYmluIik7CisgICAgICAgIENobW9kZXIgY2htb2QgPSBuZXcgQ2htb2RlcigpOworICAgICAgICBjaG1vZC5zZXREaXIoYmluRGlyKTsKKyAgICAgICAgY2htb2Quc2V0UGVybSgidWdvK3J4Iik7CisgICAgICAgIGNobW9kLnNldEluY2x1ZGVzKCIqIik7CisgICAgICAgIGNobW9kLmV4ZWN1dGUoKTsKKworICAgICAgICBkZWxldGVBbGxGaWxlc0FuZERpcihuZXcgRmlsZSh3cm9uZ0luc3RhbGxEaXIpKTsKKworICAgIH0KKworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBVbnRhcmVyIGV4dGVuZHMgVW50YXIgeworICAgICAgICBwdWJsaWMgVW50YXJlcigpIHsKKyAgICAgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICAgICAgcHJvamVjdC5pbml0KCk7CisgICAgICAgICAgICB0YXNrVHlwZSA9ICJ1bnRhciI7CisgICAgICAgICAgICB0YXNrTmFtZSA9ICJ1bnRhciI7CisgICAgICAgICAgICB0YXJnZXQgPSBuZXcgVGFyZ2V0KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBEZWxldGVyIGV4dGVuZHMgRGVsZXRlIHsKKyAgICAgICAgcHVibGljIERlbGV0ZXIoKSB7CisgICAgICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgICAgIHByb2plY3QuaW5pdCgpOworICAgICAgICAgICAgdGFza1R5cGUgPSAiZGVsZXRlIjsKKyAgICAgICAgICAgIHRhc2tOYW1lID0gImRlbGV0ZSI7CisgICAgICAgICAgICB0YXJnZXQgPSBuZXcgVGFyZ2V0KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBDaG1vZGVyIGV4dGVuZHMgQ2htb2QgeworICAgICAgICBwdWJsaWMgQ2htb2RlcigpIHsKKyAgICAgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICAgICAgcHJvamVjdC5pbml0KCk7CisgICAgICAgICAgICB0YXNrVHlwZSA9ICJjaG1vZCI7CisgICAgICAgICAgICB0YXNrTmFtZSA9ICJjaG1vZCI7CisgICAgICAgICAgICB0YXJnZXQgPSBuZXcgVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVOb0V4dChTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5pbmRleE9mKCIudGFyIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vcGx1Z2lucy9jYXMtaW5zdGFsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvaW5zdGFsbC9DQVNJbnN0YWxsRGlyTWV0S2V5cy5qYXZhIGIvMC4xMC9tdm4vcGx1Z2lucy9jYXMtaW5zdGFsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvaW5zdGFsbC9DQVNJbnN0YWxsRGlyTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNmVhZmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9wbHVnaW5zL2Nhcy1pbnN0YWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9pbnN0YWxsL0NBU0luc3RhbGxEaXJNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmluc3RhbGw7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIE1ldCBrZXlzIGZvciB0aGUge0BsaW5rIENBU0luc3RhbGxEaXN0TW9qb30KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ0FTSW5zdGFsbERpck1ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MSUNZX0RJUl9OQU1FID0gInBvbGljeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElSX05BTUUgPSAiZXRjIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJfRElSX05BTUUgPSAibGliIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5fRElSX05BTUUgPSAiYmluIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk1fQ09ORklHX0ZJTEVTID0geyAiZmlsZW1nci5wcm9wZXJ0aWVzIiwKKyAgICAgICAgICAgICJsb2dnaW5nLnByb3BlcnRpZXMiIH07CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvbXZuL3BsdWdpbnMvY2FzLWluc3RhbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2luc3RhbGwvQ0FTSW5zdGFsbERpc3RNb2pvLmphdmEgYi8wLjEwL212bi9wbHVnaW5zL2Nhcy1pbnN0YWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9pbnN0YWxsL0NBU0luc3RhbGxEaXN0TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MGEzMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9wbHVnaW5zL2Nhcy1pbnN0YWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9pbnN0YWxsL0NBU0luc3RhbGxEaXN0TW9qby5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuaW5zdGFsbDsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMuaW5zdGFsbC5DQVNJbnN0YWxsRGlyTWV0S2V5cy4qOworCisvKioKKyAqIEdvYWwgdGhhdCB1bnBhY2thZ2VzIGEgLnRhci5neiBkaXN0cmlidXRpb24gb2YgYSBDQVMgZGlzdHJvIGFuZCBpbnN0YWxscyBpdCwKKyAqIG92ZXJyaWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgaW5zdGFsbGluZyBjdXN0b20gcG9saWN5IGZpbGVzLCBhcworICogc3BlY2lmaWVkLgorICogCisgKiBAZ29hbCBpbnN0YWxsCisgKi8KK3B1YmxpYyBjbGFzcyBDQVNJbnN0YWxsRGlzdE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8geworCisgICAgLyoqCisgICAgICogTG9jYXRpb24gb2YgdGhlIENBUyBkaXN0cmlidXRpb24gdG8gaW5zdGFsbCwgZS5nLiwKKyAgICAgKiAvcGF0aC90by9jYXMtZmlsZW1nci17dmVyc2lvbn0udGFyLmd6LgorICAgICAqIAorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgY2FzRGlzdHJpYnV0aW9uRmlsZTsKKworICAgIC8qKgorICAgICAqIExvY2F0aW9uIG9mIHBvbGljeSBkaXJlY3RvcmllcyBlYWNoIGNvbnRhaW5pbmcgWE1MLWJhc2VkIENBUyBwb2xpY3kgZmlsZXMKKyAgICAgKiAoZS5nLiwgPGNvZGU+cHJvZHVjdC10eXBlcy54bWw8L2NvZGU+LAorICAgICAqIDxjb2RlPnByb2R1Y3QtdHlwZS1lbGVtZW50LW1hcC54bWw8L2NvZGU+LCBhbmQKKyAgICAgKiA8Y29kZT5lbGVtZW50cy54bWw8L2NvZGU+IGZvciB0aGUgQ0FTKSB0aGF0IHdpbGwgYmUgaW5zdGFsbGVkIGludG8gdGhlCisgICAgICoge0BsaW5rICNjYXNJbnN0YWxsYXRpb25EaXJ9L3BvbGljeSBkaXJlY3RvcnkuCisgICAgICogCisgICAgICogQHBhcmFtZXRlcgorICAgICAqIAorICAgICAqLworICAgIHByaXZhdGUgRmlsZVtdIGN1c3RvbVBvbGljeURpcnM7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiBvZiBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgY3VzdG9tIENBUyBjb25maWd1cmF0aW9uLCBlLmcuLCBhCisgICAgICogZmlsZW1nci5wcm9wZXJ0aWVzIGFuZC9vciBhIGxvZ2dpbmcucHJvcGVydGllcyBmaWxlIGZvciBmaWxlbWdyIHRoYXQgd2lsbAorICAgICAqIGJlIGNvcGllZCBpbnRvIHRoZSB7QGxpbmsgI2Nhc0luc3RhbGxhdGlvbkRpcn0vZXRjIGRpcmVjdG9yeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGN1c3RvbUNvbmZpZ3VyYXRpb25EaXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdoaWNoIHRoZSBwbHVnaW4gd2lsbCBpbnN0YWxsIHRoZSBDQVMuIERlZmF1bHRzIHRvCisgICAgICogL3Vzci9sb2NhbC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LCBpZiBub3Qgc3BlY2lmaWVkLgorICAgICAqIAorICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0nL3Vzci9sb2NhbC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259JworICAgICAqLworICAgIHByaXZhdGUgRmlsZSBjYXNJbnN0YWxsYXRpb25EaXI7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiBvZiBjdXN0b20gamFyIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSBpbiB0aGUKKyAgICAgKiB7QGxpbmsgI2Nhc0luc3RhbGxhdGlvbkRpcn0vbGliIGRpcmVjdG9yeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gY3VzdG9tTGliczsKKworICAgIC8qKgorICAgICAqIEZpbGVzIHRvIGRvIGR5bmFtaWMge0BsaW5rIFBhdGhVdGlscyNyZXBsYWNlRW52VmFyaWFibGVzKFN0cmluZyl9IG9uLgorICAgICAqIAorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIEVudlJlcGxhY2VyW10gZW52VmFyUmVwbGFjZUZpbGVzOworCisgICAgLyoqCisgICAgICogU2NyaXB0IGZpbGVzIHRvIHBvdGVudGlhbGx5IG92ZXJ3cml0ZSBhbmQgY3VzdG9taXplIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorICAgICAqIENBUyBiaW4gc2NyaXB0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gY3VzdG9tQmluU2NyaXB0czsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbyNleGVjdXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoY2FzRGlzdHJpYnV0aW9uRmlsZSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgKGNhc0Rpc3RyaWJ1dGlvbkZpbGUgIT0gbnVsbCAmJiAhY2FzRGlzdHJpYnV0aW9uRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4aXN0cygpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oInRoZSBDQVMgZGlzdHJpYnV0aW9uOiBbIgorICAgICAgICAgICAgICAgICAgICArIGNhc0Rpc3RyaWJ1dGlvbkZpbGUgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSBjYXMgaW5zdGFsbGF0aW9uIGxpYnMgZGlyZWN0b3J5IGFuZCBpdHMgY29udGVudHMgaWYgY3VzdG9tIGxpYnMgc3BlY2lmaWVkLgorICAgICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgbGVnYWN5IGphcnMgZnJvbSBwb2xsdXRpbmcgdGhlIGNhcyBpbnN0YWxsYXRpb24gbGlicyBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGN1c3RvbUxpYnMgIT0gbnVsbCAmJiBjdXN0b21MaWJzLmxlbmd0aCA+IDApIHsKKworICAgICAgICAgICAgRmlsZSBsaWJEaXIgPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBnZXQgdGhlIGxpYiBkaXIKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGliRGlyID0gbmV3IEZpbGUoY2FzSW5zdGFsbGF0aW9uRGlyLmdldENhbm9uaWNhbFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIExJQl9ESVJfTkFNRSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlY3QgbGliIGRpcjogSU8gZXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZWxldGUgdGhlIGxpYiBkaXIKKyAgICAgICAgICAgIGlmIChsaWJEaXIgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigKKyAgICAgICAgICAgICAgICAJCSJyZW1vdmluZyBwcmUtZXhpc3RpbmcgQ0FTIGxpYnJhcmllcyBkaXJlY3RvcnkgWyIKKyAgICAgICAgICAgICAgICAJCStsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkrIl0gc2luY2UgY3VzdG9tIENBUyBsaWJyYXJpZXMgaGF2ZSBiZWVuIHNwZWNpZmllZCIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRyeSB7CisJCQkJCUZpbGVVdGlscy5kZWxldGVEaXJlY3RvcnkobGliRGlyKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oCisJICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZWxldGUgbGliIGRpciBbIitsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkrIl06ICIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCX0gICAgCisgICAgICAgICAgICB9ICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGdldExvZygpLmluZm8oCisgICAgICAgICAgICAgICAgInVucGFja2FnaW5nIGRpc3RybzogWyIgKyBjYXNEaXN0cmlidXRpb25GaWxlICsgIl0gdG86IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhc0luc3RhbGxhdGlvbkRpciArICJdIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBbnREZWNvcmF0b3IudW50YXJGaWxlKGNhc0Rpc3RyaWJ1dGlvbkZpbGUsIGNhc0luc3RhbGxhdGlvbkRpcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiYW4gSU8gZXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgdW50YXJyaW5nIHRoZSBDQVMgZGlzdHJpYnV0aW9uOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VzdG9tUG9saWN5RGlycyAhPSBudWxsICYmIGN1c3RvbVBvbGljeURpcnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKKyAgICAgICAgICAgICAgICAgICAgImluc3RhbGxpbmcgWyIgKyBjdXN0b21Qb2xpY3lEaXJzLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gY3VzdG9tIHBvbGljeSBkaXJzIik7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZGVmYXVsdCBwb2xpY3kKKyAgICAgICAgICAgIEZpbGUgcG9saWN5RGlyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcG9saWN5RGlyID0gbmV3IEZpbGUoY2FzSW5zdGFsbGF0aW9uRGlyLmdldENhbm9uaWNhbFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIFBPTElDWV9ESVJfTkFNRSk7CisgICAgICAgICAgICAgICAgQW50RGVjb3JhdG9yLmRlbGV0ZUFsbEZpbGVzQW5kRGlyKHBvbGljeURpcik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigKKyAgICAgICAgICAgICAgICAgICAgICAgICJJTyBleGNlcHRpb24gd2hlbiByZW1vdmluZyBkZWZhdWx0IHBvbGljeSBmcm9tOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBvbGljeURpciArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbVBvbGljeURpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgIkluc3RhbGxpbmc6IFsiICsgY3VzdG9tUG9saWN5RGlyc1tpXSArICJdIHRvOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBvbGljeURpciArICJdIik7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VzdG9tUG9saWN5RGlyc1tpXS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnlUb0RpcmVjdG9yeShjdXN0b21Qb2xpY3lEaXJzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lEaXIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgY29weWluZyBjdXN0b20gcG9saWN5IGRpcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1c3RvbVBvbGljeURpcnNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIHRvIHBvbGljeSBkaXI6IFsiICsgcG9saWN5RGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXN0b21Db25maWd1cmF0aW9uRGlyICE9IG51bGwgJiYgY3VzdG9tQ29uZmlndXJhdGlvbkRpci5leGlzdHMoKSkgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUoY2FzSW5zdGFsbGF0aW9uRGlyLmdldENhbm9uaWNhbFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIENPTkZJR19ESVJfTkFNRSk7CisKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVmYXVsdCBjb25maWcKKyAgICAgICAgICAgICAgICBBbnREZWNvcmF0b3IuZGVsZXRlQWxsRmlsZXNBbmREaXIoY29uZmlnRGlyKTsKKworICAgICAgICAgICAgICAgIGNvbmZpZ0Rpci5ta2RpcigpOworCisgICAgICAgICAgICAgICAgLy8gaW5zdGFsbCBjdXN0b20gY29uZmlnCisgICAgICAgICAgICAgICAgRmlsZVV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuY29weURpcmVjdG9yeShjdXN0b21Db25maWd1cmF0aW9uRGlyLCBjb25maWdEaXIsIHRydWUpOworCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZWN0IGNvbmZpZ3VyYXRpb24gZGlyOiBJTyBleGNlcHRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXN0b21MaWJzICE9IG51bGwgJiYgY3VzdG9tTGlicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKAorICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGluZyBbIiArIGN1c3RvbUxpYnMubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBjdXN0b20gQ0FTIGxpYnJhcmllcyIpOworCisgICAgICAgICAgICBGaWxlIGxpYkRpciA9IG51bGw7CisgICAgICAgICAgICAvLyBnZXQgdGhlIGxpYiBkaXIKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGliRGlyID0gbmV3IEZpbGUoY2FzSW5zdGFsbGF0aW9uRGlyLmdldENhbm9uaWNhbFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIExJQl9ESVJfTkFNRSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlY3QgbGliIGRpcjogSU8gZXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbUxpYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGxpbmcgWyIgKyBjdXN0b21MaWJzW2ldICsgIl0gdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpYkRpci5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkoY3VzdG9tTGlic1tpXSwgbGliRGlyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGluc3RhbGxpbmcgWyIgKyBjdXN0b21MaWJzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIHRvICIgKyBsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVudlZhclJlcGxhY2VGaWxlcyAhPSBudWxsICYmIGVudlZhclJlcGxhY2VGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKAorICAgICAgICAgICAgICAgICAgICAiUmVwbGFjaW5nIGVudiB2YXJzIG9uIFsiICsgZW52VmFyUmVwbGFjZUZpbGVzLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZmlsZXMiKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZWYXJSZXBsYWNlRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBlbnZWYXJSZXBsYWNlRmlsZXNbaV0uZG9FbnZSZXBsYWNlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGlsZSBkb2luZyBlbnYgcmVwbGFjZW1lbnQgb246IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVudlZhclJlcGxhY2VGaWxlc1tpXS5nZXRGaWxlcGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXN0b21CaW5TY3JpcHRzICE9IG51bGwgJiYgY3VzdG9tQmluU2NyaXB0cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKAorICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGluZyBbIiArIGN1c3RvbUJpblNjcmlwdHMubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBjdXN0b20gYmluIHNjcmlwdHMiKTsKKworICAgICAgICAgICAgRmlsZSBiaW5EaXIgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbkRpciA9IG5ldyBGaWxlKGNhc0luc3RhbGxhdGlvbkRpci5nZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBCSU5fRElSX05BTUUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRldGVjdCBiaW4gZGlyOiBJTyBleGNlcHRpb246IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tQmluU2NyaXB0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGluZyBbIiArIGN1c3RvbUJpblNjcmlwdHNbaV0gKyAiXSB0byBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJpbkRpciArICJdIik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkoY3VzdG9tQmluU2NyaXB0c1tpXSwgYmluRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm93IGNobW9kIGl0IHdpdGggZXhlYyBwZXJtcworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VzdEJpblNjcmlwdEZ1bGxQYXRoID0gYmluRGlyICsgRmlsZS5zZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1c3RvbUJpblNjcmlwdHNbaV0uZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oImZpeGluZyBwZXJtcyBvbiBbIitjdXN0QmluU2NyaXB0RnVsbFBhdGgrIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgQW50RGVjb3JhdG9yLmNobW9kRmlsZShuZXcgRmlsZShjdXN0QmluU2NyaXB0RnVsbFBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1Z28rcngiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBpbnN0YWxsIFsiICsgY3VzdG9tQmluU2NyaXB0c1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB0byBbIiArIGJpbkRpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogSU8gZXhjZXB0aW9uOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9tdm4vcGx1Z2lucy9jYXMtaW5zdGFsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvaW5zdGFsbC9FbnZSZXBsYWNlci5qYXZhIGIvMC4xMC9tdm4vcGx1Z2lucy9jYXMtaW5zdGFsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvaW5zdGFsbC9FbnZSZXBsYWNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZWJjOWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL212bi9wbHVnaW5zL2Nhcy1pbnN0YWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9pbnN0YWxsL0VudlJlcGxhY2VyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmluc3RhbGw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRG9lcyB7QGxpbmsgUGF0aFV0aWxzI3JlcGxhY2VFbnZWYXJpYWJsZXMoU3RyaW5nKX0gb24gdGhlIGdpdmVuCisgKiB7QGxpbmsgI2ZpbGVwYXRofSBieSByZWFkaW5nIHRoZSB7QGxpbmsgRmlsZX0gaW50byBhIFN0cmluZyB1c2luZworICoge0BsaW5rIEZpbGVVdGlscyNyZWFkRmlsZVRvU3RyaW5nKEZpbGUpfSBhbmQgdGhlbiBkb2luZworICoge0BsaW5rIFBhdGhVdGlscyNyZXBsYWNlRW52VmFyaWFibGVzKFN0cmluZyl9IG9uIHRoYXQgU3RyaW5nLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIEVudlJlcGxhY2VyIHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlcGF0aDsKKworICAgIHB1YmxpYyB2b2lkIGRvRW52UmVwbGFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLmZpbGVwYXRoICE9IG51bGwgJiYgdGhpcy5maWxlcGF0aC5leGlzdHMoKQorICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsZXBhdGguY2FuV3JpdGUoKSkgeworCisgICAgICAgICAgICBTdHJpbmcgZXhpc3RpbmdGaWxlU3RyID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcodGhpcy5maWxlcGF0aCk7CisgICAgICAgICAgICBTdHJpbmcgZW52UmVwbGFjZWRGaWxlU3RyID0gUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKGV4aXN0aW5nRmlsZVN0cik7CisgICAgICAgICAgICBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUodGhpcy5maWxlcGF0aCwgZW52UmVwbGFjZWRGaWxlU3RyKTsKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlcGF0aAorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldEZpbGVwYXRoKCkgeworICAgICAgICByZXR1cm4gZmlsZXBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGZpbGVwYXRoCisgICAgICogICAgICAgICAgICB0aGUgZmlsZXBhdGggdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZXBhdGgoRmlsZSBmaWxlcGF0aCkgeworICAgICAgICB0aGlzLmZpbGVwYXRoID0gZmlsZXBhdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvcG9tLnhtbCBiLzAuMTAvb3BlbmRhcHBzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxZjIxMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3BvbS54bWwKQEAgLTAsMCArMSw3NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxhcnRpZmFjdElkPm9wZW5kYXBwczwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+QXBhY2hlIE9PRFQgQ29uZmlndXJhYmxlIE9QZU5EQVAgUHJvZmlsZSBTZXJ2ZXI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BIGdlbmVyaWMsIGNvbmZpZ3VyYWJsZSBBcGFjaGUgT09EVCBwcm9maWxlIHNlcnZlcgorICBpbXBsZW1lbnRhdGlvbiB0aGF0IGVhc2lseSBjb25uZWN0cyB0byBPUGVOREFQIGRhdGEgc291cmNlcy4gQ29ubmVjdGlvbnMgCisgIGFyZSBjb25maWd1cmVkIHZpYSBhbiBYTUwgY29uZmlndXJhdGlvbiBmaWxlLCBwcm92aWRpbmcgaW5mb3JtYXRpb24gb24gaG93IAorICB0byBleHRyYWN0IGFuZCB0cmFuc2xhdGUgZGF0YXNldHMgZnJvbSBPUGVOREFQIGFuZCBUSFJFRERTIGludG8gT09EVCBwcm9maWxlcy4KKyAgPC9kZXNjcmlwdGlvbj4gCisgIDxzY20+CisgICAJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvb3BlbmRhcHBzPC9jb25uZWN0aW9uPgorICAgCTxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL29wZW5kYXBwczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgIAk8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyL29wZW5kYXBwczwvdXJsPgorICA8L3NjbT4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD4uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgorICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPCEtLSBlbmFibGUgY3JlYXRpb24gb2Ygc2luZ2xlIGphciB0byB1c2UgdGhpcyBtb2R1bGUgc3RhbmQgYWxvbmUgLS0+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+IDwhLS0gdGhpcyBpcyB1c2VkIGZvciBpbmhlcml0YW5jZSBtZXJnZXMgLS0+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+IDwhLS0gYmluZCB0byB0aGUgcGFja2FnaW5nIHBoYXNlIC0tPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxkZXBlbmRlbmNpZXM+CisgICA8ZGVwZW5kZW5jeT4KKyAgICAgPGdyb3VwSWQ+ZWR1LnVjYXI8L2dyb3VwSWQ+CisgICAgIDxhcnRpZmFjdElkPm5ldGNkZjwvYXJ0aWZhY3RJZD4KKyAgICAgPHZlcnNpb24+NC4yPC92ZXJzaW9uPgorICAgPC9kZXBlbmRlbmN5PgorICAgPGRlcGVuZGVuY3k+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtcHJvZmlsZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgPC9kZXBlbmRlbmN5PgorICAgPGRlcGVuZGVuY3k+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQteG1scXVlcnk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvRGFwTmFtZXMuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9EYXBOYW1lcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDhhNGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvRGFwTmFtZXMuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwczsKKworLy9PUGVOREFQIGltcG9ydHMKK2ltcG9ydCBvcGVuZGFwLmRhcC5EQVM7CisKKy8qKgorICogCisgKiBBIHNldCBvZiBuYW1lZCBjb25zdGFudHMgZm9yIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24gZnJvbSBPUGVOREFQIHtAbGluayBEQVN9CisgKiBwcm9maWxlcy4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIERhcE5hbWVzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RVQUxfUkFOR0UgPSAiYWN0dWFsX3JhbmdlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklUUyA9ICJ1bml0cyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlQgPSAic3RhcnQiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORCA9ICJlbmQiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvRGF0YXNldENyYXdsZXIuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9EYXRhc2V0Q3Jhd2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjhlODMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvRGF0YXNldENyYXdsZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5leHRyYWN0b3JzLk1ldGFkYXRhRXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuZXh0cmFjdG9ycy5UaHJlZGRzTWV0YWRhdGFFeHRyYWN0b3I7CisKK2ltcG9ydCB0aHJlZGRzLmNhdGFsb2cuSW52QWNjZXNzOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5JbnZDYXRhbG9nUmVmOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5JbnZEYXRhc2V0OworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5JbnZTZXJ2aWNlOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5TZXJ2aWNlVHlwZTsKK2ltcG9ydCB0aHJlZGRzLmNhdGFsb2cuY3Jhd2wuQ2F0YWxvZ0NyYXdsZXI7CisKKy8qKgorICogQ3Jhd2xzIGEgY2F0YWxvZyBhbmQgcmV0dXJucyBhbGwgdGhlIGRhdGFzZXRzIGFuZCB0aGVpciByZWZlcmVuY2VzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhc2V0Q3Jhd2xlciBpbXBsZW1lbnRzIENhdGFsb2dDcmF3bGVyLkxpc3RlbmVyIHsKKworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihEYXRhc2V0Q3Jhd2xlci5jbGFzcy5nZXROYW1lKCkpOworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHVybHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIE1ldGFkYXRhPiBkYXRhc2V0TWV0OworCisgIHByaXZhdGUgU3RyaW5nIGRhdGFzZXRVUkwgPSBudWxsOworICAKKyAgcHJpdmF0ZSBPcGVuZGFwQ29uZmlnIGNvbmYgPSBudWxsOworCisgIHB1YmxpYyBEYXRhc2V0Q3Jhd2xlcihTdHJpbmcgZGF0YXNldFVSTCwgT3BlbmRhcENvbmZpZyBjb25mKSB7CisgICAgdGhpcy5kYXRhc2V0VVJMID0gZGF0YXNldFVSTC5lbmRzV2l0aCgiLyIpID8gZGF0YXNldFVSTCA6IGRhdGFzZXRVUkwgKyAiLyI7CisgICAgdGhpcy5kYXRhc2V0TWV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRhZGF0YT4oKTsKKyAgICB0aGlzLmNvbmYgPSBjb25mOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiB0aHJlZGRzLmNhdGFsb2cuY3Jhd2wuQ2F0YWxvZ0NyYXdsZXIuTGlzdGVuZXIjZ2V0Q2F0YWxvZ1JlZih0aHJlZGRzLmNhdGFsb2cKKyAgICogLkludkNhdGFsb2dSZWYsIGphdmEubGFuZy5PYmplY3QpCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRDYXRhbG9nUmVmKEludkNhdGFsb2dSZWYgZGQsIE9iamVjdCBjb250ZXh0KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIHRocmVkZHMuY2F0YWxvZy5jcmF3bC5DYXRhbG9nQ3Jhd2xlci5MaXN0ZW5lciNnZXREYXRhc2V0KHRocmVkZHMuY2F0YWxvZworICAgKiAuSW52RGF0YXNldCwgamF2YS5sYW5nLk9iamVjdCkKKyAgICovCisgIHB1YmxpYyB2b2lkIGdldERhdGFzZXQoSW52RGF0YXNldCBkZCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgCVN0cmluZyB1cmwgPSB0aGlzLmRhdGFzZXRVUkwgKyBkZC5nZXRDYXRhbG9nVXJsKCkuc3BsaXQoIiMiKVsxXTsKKyAgICBTdHJpbmcgaWQgPSBkZC5nZXRJRCgpOyAgICAKKyAgICBMT0cubG9nKExldmVsLkZJTkUsIHVybCArICIgaXMgdGhlIGNvbXB1dGVkIGFjY2VzcyBVUkwgZm9yIHRoaXMgZGF0YXNldCIpOworICAgIC8vIGxvb2sgZm9yIGFuIE9wZW5EQVAgYWNjZXNzIFVSTCwgb25seSBleHRyYWN0IG1ldGFkYXRhIGlmIGl0IGlzIGZvdW5kCisgICAgTGlzdDxJbnZBY2Nlc3M+IGRhdGFzZXRzID0gZGQuZ2V0QWNjZXNzKCk7CisgICAgaWYgKGRkLmdldEFjY2VzcygpICE9IG51bGwgJiYgZGQuZ2V0QWNjZXNzKCkuc2l6ZSgpID4gMCkgeworICAgICAgSXRlcmF0b3I8SW52QWNjZXNzPiBzZXRzID0gZGF0YXNldHMuaXRlcmF0b3IoKTsKKyAgICAgIHdoaWxlIChzZXRzLmhhc05leHQoKSkgeworICAgICAgICBJbnZBY2Nlc3Mgc2luZ2xlID0gc2V0cy5uZXh0KCk7CisgICAgICAgIEludlNlcnZpY2Ugc2VydmljZSA9IHNpbmdsZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgIC8vIG5vdGU6IHNlbGVjdCB0aGUgT3BlbkRBUCBhY2Nlc3MgVVJMIGJhc2VkIG9uIFRIUkVERFMgc2VydmljZSB0eXBlCisgICAgICAgIGlmIChzZXJ2aWNlLmdldFNlcnZpY2VUeXBlKCk9PVNlcnZpY2VUeXBlLk9QRU5EQVApIHsKKyAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJGb3VuZCBPcGVuREFQIGFjY2VzcyBVUkw6ICIrIHNpbmdsZS5nZXRVcmxQYXRoKCkpOworICAgICAgICAgIFN0cmluZyBvcGVuZGFwdXJsID0gdGhpcy5kYXRhc2V0VVJMICsgc2luZ2xlLmdldFVybFBhdGgoKTsKKyAgICAgICAgICAvLyBleHRyYWN0IG1ldGFkYXRhIGZyb20gVEhSRUREUyBjYXRhbG9nCisgICAgICAgICAgTWV0YWRhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IFRocmVkZHNNZXRhZGF0YUV4dHJhY3RvcihkZCk7CisgICAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgICAgZXh0cmFjdG9yLmV4dHJhY3QobWV0LCBjb25mKTsKKyAgICAgICAgICAvLyBpbmRleCBtZXRhZGF0YSBieSBvcGVuZGFwIGFjY2VzcyBVUkwKKyAgICAgICAgICB0aGlzLmRhdGFzZXRNZXQucHV0KG9wZW5kYXB1cmwsIG1ldCk7CisgICAgICAgICAgdGhpcy51cmxzLmFkZChvcGVuZGFwdXJsKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXRzIHRoZSBzZXQgb2YgU3RyaW5nIHtAbGluayBVUkx9cyBjcmF3bGVkLgorICAgKiAKKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSByZXByZXNlbnRhdGlvbnMgb2Yge0BsaW5rIFVSTH1zLgorICAgKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRVUkxzKCkgeworICAgIHJldHVybiB0aGlzLnVybHM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZXhyYWN0ZWQgVEhSRUREUyB7QGxpbmsgSW52RGF0YXNldH0gbWV0YWRhdGEuIFRoZSBkYXRhc2V0CisgICAqIG1ldGFkYXRhIGlzIG1hcHBlZCB0byB0aGUgdW5pcXVlIFRIUkVERFMgZGF0YXNldCBVUkwuCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBleHJhY3RlZCBUSFJFRERTIHtAbGluayBJbnZEYXRhc2V0fSBtZXRhZGF0YS4KKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBNZXRhZGF0YT4gZ2V0RGF0YXNldE1ldCgpIHsKKyAgICByZXR1cm4gdGhpcy5kYXRhc2V0TWV0OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9EYXRhc2V0RXh0cmFjdG9yLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvRGF0YXNldEV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjY2YmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvRGF0YXNldEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CisKKy8vTmV0Q0RGLUphdmEgaW1wb3J0cworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5jcmF3bC5DYXRhbG9nQ3Jhd2xlcjsKK2ltcG9ydCB1Y2FyLm5jMi51dGlsLkNhbmNlbFRhc2s7CitpbXBvcnQgb3BlbmRhcC5kYXAuRENvbm5lY3Q7CitpbXBvcnQgb3BlbmRhcC5kYXAuRGF0YUREUzsKKworLyoqCisgKiAKKyAqIFRoaXMgY2xhc3MgdGFrZXMgaW4gYSBxdWVyeSBhbmQgdGhlIG1haW4gY2F0YWxvZyB1cmwgYW5kIHJldHVybnMgYSBsaXN0IG9mCisgKiByZWxldmFudCBkYXRhc2V0IHVybHMKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGF0YXNldEV4dHJhY3RvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihEYXRhc2V0RXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOREFMTCA9ICJQRnVuY3Rpb249ZmluZGFsbCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORFNPTUUgPSAiUEZ1bmN0aW9uPWZpbmRzb21lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EUVVFUlkgPSAiUEZ1bmN0aW9uPWZpbmRxdWVyeSI7CisKKyAgcHJpdmF0ZSBTdHJpbmcgcTsKKworICBwcml2YXRlIFN0cmluZyBtYWluQ2F0YWxvZ1VSTDsKKworICBwcml2YXRlIFN0cmluZyBkYXRhc2V0VVJMOworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGFsbFVybHM7CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRhZGF0YT4gZGF0YXNldE1ldDsKKyAgCisgIHByaXZhdGUgT3BlbmRhcENvbmZpZyBjb25mOworCisgIHB1YmxpYyBEYXRhc2V0RXh0cmFjdG9yKFhNTFF1ZXJ5IHEsIFN0cmluZyBtYWluQ2F0YWxvZ1VSTCwgU3RyaW5nIGRhdGFzZXRVUkwsIE9wZW5kYXBDb25maWcgY29uZikgeworICAgIHRoaXMucSA9IHEuZ2V0S3dkUXVlcnlTdHJpbmcoKS50cmltKCk7CisgICAgdGhpcy5tYWluQ2F0YWxvZ1VSTCA9IG1haW5DYXRhbG9nVVJMOworICAgIHRoaXMuZGF0YXNldFVSTCA9IGRhdGFzZXRVUkw7CisgICAgdGhpcy5jb25mID0gY29uZjsKKyAgICB0aGlzLmluaXRFeHRyYWN0aW9uKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERhcFVybHMoKSB7CisgICAgTGlzdDxTdHJpbmc+IHVybHMgPSBudWxsOworCisgICAgaWYgKHRoaXMucS5jb250YWlucyhGSU5EQUxMKSkKKyAgICAgIHVybHMgPSB0aGlzLmFsbFVybHM7CisgICAgZWxzZSBpZiAodGhpcy5xLmNvbnRhaW5zKEZJTkRTT01FKSkKKyAgICAgIHVybHMgPSB0aGlzLmdldEZpbmRTb21lKCk7CisgICAgZWxzZSBpZiAodGhpcy5xLmNvbnRhaW5zKEZJTkRRVUVSWSkpCisgICAgICB1cmxzID0gdGhpcy5nZXRGaW5kUXVlcnkoKTsKKworICAgIHJldHVybiB1cmxzOworICB9CisKKyAgcHVibGljIE1ldGFkYXRhIGdldERhdGFzZXRNZXQoU3RyaW5nIG9wZW5kYXBVcmwpeworICAgIHJldHVybiB0aGlzLmRhdGFzZXRNZXQuZ2V0KG9wZW5kYXBVcmwpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRFeHRyYWN0aW9uKCkgeworICAgIERhdGFzZXRDcmF3bGVyIGxpc3RlbmVyID0gbmV3IERhdGFzZXRDcmF3bGVyKHRoaXMuZGF0YXNldFVSTCwgdGhpcy5jb25mKTsKKyAgICBDYW5jZWxUYXNrIGlnbm9yZSA9IG5ldyBDYW5jZWxUYXNrKCkgeworICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc2V0RXJyb3IoU3RyaW5nIG1zZykgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsIG1zZyk7CisgICAgICB9CisKKyAgICB9OworCisgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiY2F0YWxvZ1VSTDogIiArIHRoaXMubWFpbkNhdGFsb2dVUkwpOworICAgIC8vIE5vdGU6IGxvb2sgZm9yIGFsbCBkYXRhc2V0cywgdGhhdCBoYXZlIGVpdGhlciBhIHVybFBhdGg9IiIgYXR0cmlidXRlLCBvciBhIDxhY2Nlc3M+IHN1YmVsZW1lbnQKKyAgICBDYXRhbG9nQ3Jhd2xlciBjcmF3bGVyID0gbmV3IENhdGFsb2dDcmF3bGVyKENhdGFsb2dDcmF3bGVyLlVTRV9BTEwsIGZhbHNlLCBsaXN0ZW5lcik7CisgICAgY3Jhd2xlci5jcmF3bCh0aGlzLm1haW5DYXRhbG9nVVJMLCBpZ25vcmUsIFN5c3RlbS5vdXQsIHRoaXMpOworICAgIHRoaXMuYWxsVXJscyA9IGxpc3RlbmVyLmdldFVSTHMoKTsKKyAgICB0aGlzLmRhdGFzZXRNZXQgPSBsaXN0ZW5lci5nZXREYXRhc2V0TWV0KCk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRGaW5kUXVlcnkoKSB7CisgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiUEZ1bmN0aW9uOiBmaW5kcXVlcnkgc2VsZWN0ZWQ6IG9yaWcgcXVlcnk6IFsiICsgdGhpcy5xCisgICAgICAgICsgIl0iKTsKKyAgICBTdHJpbmcgcXVlcnlFeHByZXNzaW9uID0gIiI7CisgICAgUGF0dGVybiBwYXJhbWV0ZXJQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJQUGFyYW1ldGVyPVwiKC4rPylcIiIpOworICAgIE1hdGNoZXIgdXJsc01hdGNoID0gcGFyYW1ldGVyUGF0dGVybi5tYXRjaGVyKHRoaXMucSk7CisgICAgd2hpbGUgKHVybHNNYXRjaC5maW5kKCkpIHsKKyAgICAgIHF1ZXJ5RXhwcmVzc2lvbiA9IHVybHNNYXRjaC5ncm91cCgxKTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gZGF0YXNldFVybHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworICAgIGZvciAoU3RyaW5nIGRhdGFzZXRVcmwgOiB0aGlzLmFsbFVybHMpIHsKKyAgICAgIERDb25uZWN0IGRDb25uID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIGRDb25uID0gbmV3IERDb25uZWN0KGRhdGFzZXRVcmwsIHRydWUpOworICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBkYXRhc2V0VXJsCisgICAgICAgICAgICArICIgaXMgbmVpdGhlciBhIHZhbGlkIFVSTCBub3IgYSBmaWxlbmFtZS4iKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIERhdGFERFMgZGRzID0gZENvbm4uZ2V0RGF0YShxdWVyeUV4cHJlc3Npb24sIG51bGwpOworCisgICAgICAgIGlmIChkZHMgIT0gbnVsbCkgeworICAgICAgICAgIGRhdGFzZXRVcmxzLmFkZChkYXRhc2V0VXJsKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICIgU29tZSBEQVAyRXhjZXB0aW9uIG9yIG5vdCBhIHZhbGlkYXRlIEREUyIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkYXRhc2V0VXJsczsKKworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0RmluZFNvbWUoKSB7CisgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiUEZ1bmN0aW9uOiBmaW5kc29tZSBzZWxlY3RlZCIpOworICAgIFN0cmluZyB1cmxzU3RyaW5nID0gIiI7CisgICAgUGF0dGVybiBwYXJhbWV0ZXJQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJQUGFyYW1ldGVyPVwiKC4rPylcIiIpOworICAgIE1hdGNoZXIgdXJsc01hdGNoID0gcGFyYW1ldGVyUGF0dGVybi5tYXRjaGVyKHRoaXMucSk7CisgICAgd2hpbGUgKHVybHNNYXRjaC5maW5kKCkpIHsKKyAgICAgIHVybHNTdHJpbmcgPSB1cmxzTWF0Y2guZ3JvdXAoMSk7CisgICAgfQorCisgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiUFBhcmFtZXRlcjogWyIgKyB1cmxzU3RyaW5nCisgICAgICAgICsgIl0gcGFyc2VkIGZyb20gb3JpZ2luYWwgc3RyaW5nIHF1ZXJ5OiBbIiArIHRoaXMucSArICJdIik7CisKKyAgICBMaXN0PFN0cmluZz4gb3BlbkRhcFVybHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHNTdHJpbmcsICIsIik7CisgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgIG9wZW5EYXBVcmxzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOworICAgIH0KKworICAgIExPRy5sb2coTGV2ZWwuRklORSwgIk9QZU5EQVAgdXJsczogWyIgKyBvcGVuRGFwVXJscyArICJdIik7CisgICAgcmV0dXJuIG9wZW5EYXBVcmxzOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9PcGVuZGFwUHJvZmlsZUVsZW1lbnRFeHRyYWN0b3IuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9PcGVuZGFwUHJvZmlsZUVsZW1lbnRFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY0MjBiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL09wZW5kYXBQcm9maWxlRWxlbWVudEV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PUGVOREFQL1RIUkVERFMgaW1wb3J0cworaW1wb3J0IG9wZW5kYXAuZGFwLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcGVuZGFwLmRhcC5BdHRyaWJ1dGVUYWJsZTsKK2ltcG9ydCBvcGVuZGFwLmRhcC5EQVM7CitpbXBvcnQgb3BlbmRhcC5kYXAuTm9TdWNoQXR0cmlidXRlRXhjZXB0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUmFuZ2VkUHJvZmlsZUVsZW1lbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5EYXBOYW1lcy4qOworCisvKioKKyAqIAorICogCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc2V0IGN1c3RvbSBmdW5jdGlvbmFsaXR5IGZvciBzY3JhcGluZyBkYXRhIGludG8KKyAqIGRpZmZlcmVudCB0eXBlcyBvZiBvYmplY3RzLiBUaGUgY2xhc3MgbG9va3MgYXQgdGhlIHtAbGluayBPcGVuZGFwQ29uZmlnfSBhbmQKKyAqIHRoZW4gdHJpZXMgdG8gc3R1ZmYgd2hhdCdzIGluIGVhY2ggJmx0O3ZhciZndDsgaW50bworICoge0BsaW5rIFJhbmdlZFByb2ZpbGVFbGVtZW50fSBvciB7QGxpbmsgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50fS4gVGhlIGNsYXNzCisgKiBpcyBkZXNpZ25lZCB3aXRoIGV4dGVuc2liaWxpdHkgaW4gbWluZCBpbiBjYXNlIG5ldyB7QGxpbmsgUHJvZmlsZUVsZW1lbnR9CisgKiB0eXBlcyBhcmUgY3JlYXRlZCBpbiB0aGUgZnV0dXJlLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBPcGVuZGFwUHJvZmlsZUVsZW1lbnRFeHRyYWN0b3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoT3BlbmRhcFByb2ZpbGVFbGVtZW50RXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHJpdmF0ZSBPcGVuZGFwQ29uZmlnIGNvbmY7CisKKyAgcHVibGljIE9wZW5kYXBQcm9maWxlRWxlbWVudEV4dHJhY3RvcihPcGVuZGFwQ29uZmlnIGNvbmYpIHsKKyAgICB0aGlzLmNvbmYgPSBjb25mOworICB9CisKKyAgcHVibGljIFJhbmdlZFByb2ZpbGVFbGVtZW50IGV4dHJhY3RSYW5nZWRQcm9maWxlRWxlbWVudChTdHJpbmcgZWxlbU5hbWUsIFN0cmluZyB2YXJuYW1lLAorICAgICAgUHJvZmlsZSBwcm9maWxlLCBEQVMgZGFzKSB0aHJvd3MgTm9TdWNoQXR0cmlidXRlRXhjZXB0aW9uIHsKKyAgICBSYW5nZWRQcm9maWxlRWxlbWVudCBlbGVtID0gbmV3IFJhbmdlZFByb2ZpbGVFbGVtZW50KHByb2ZpbGUpOworICAgIGVsZW0uc2V0TmFtZShlbGVtTmFtZSk7CisgICAgQXR0cmlidXRlVGFibGUgYXR0VGFibGUgPSBudWxsOworICAgIHRyeSB7CisgICAgICBhdHRUYWJsZSA9IGRhcy5nZXRBdHRyaWJ1dGVUYWJsZSh2YXJuYW1lKTsKKyAgICAgIAorICAgICAgLy8gbWFrZSB2YXJpYWJsZSBuYW1lcyBjYXNlIGluc2Vuc2l0aXZlCisgICAgICBpZihhdHRUYWJsZSA9PSBudWxsKSBhdHRUYWJsZSA9IGRhcy5nZXRBdHRyaWJ1dGVUYWJsZSh2YXJuYW1lLnRvTG93ZXJDYXNlKCkpOworICAgICAgaWYoYXR0VGFibGUgPT0gbnVsbCkgYXR0VGFibGUgPSBkYXMuZ2V0QXR0cmlidXRlVGFibGUodmFybmFtZS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgIGlmKGF0dFRhYmxlID09IG51bGwpIHRocm93IG5ldyBOb1N1Y2hBdHRyaWJ1dGVFeGNlcHRpb24oIkF0dCB0YWJsZSBmb3IgWyIrdmFybmFtZSsiXSBpcyBudWxsISIpOworICAgIH0gY2F0Y2ggKE5vU3VjaEF0dHJpYnV0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZXh0cmFjdGluZyBhdHRyaWJ1dGUgdGFibGUgZm9yIGVsZW1lbnQ6IFsiCisgICAgICAgICAgKyBlbGVtTmFtZSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdGhyb3cgZTsKKworICAgIH0KKworICAgIEVudW1lcmF0aW9uIGF0dHJpYnV0ZU5hbWVzID0gYXR0VGFibGUuZ2V0TmFtZXMoKTsKKworICAgIHdoaWxlIChhdHRyaWJ1dGVOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgYXR0cmlidXRlTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0VGFibGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTsKKyAgICAgCisgICAgICBpZiAoIWF0dHIuaXNDb250YWluZXIoKSkgeworICAgICAgCSBFbnVtZXJhdGlvbiBhdHRyVmFsdWVzID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIAl0cnkgeworICAgICAgICAgICAgYXR0clZhbHVlcyA9IGF0dHIuZ2V0VmFsdWVzKCk7CisgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQXR0cmlidXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJBdHRlbXB0IHRvIHJlc29sdmUgYXR0cmlidXRlOiBbIiArIGF0dHJOYW1lCisgICAgICAgICAgICAgICAgKyAiXSBmYWlsZWQ6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKyAgCisgICAgICAgIHdoaWxlIChhdHRyVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IChTdHJpbmcpIGF0dHJWYWx1ZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICBpZiAoYXR0ck5hbWUuZXF1YWxzKEFDVFVBTF9SQU5HRSkpIHsKKyAgICAgICAgICAgIGVsZW0uc2V0TWluVmFsdWUoYXR0clZhbHVlKTsKKyAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgIGVsZW0uc2V0TWF4VmFsdWUoKFN0cmluZykgYXR0clZhbHVlcy5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscyhVTklUUykpIHsKKyAgICAgICAgICAgIGVsZW0uc2V0VW5pdChhdHRyVmFsdWUpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKFNUQVJUKSkgeworICAgICAgICAgICAgZWxlbS5zZXRNaW5WYWx1ZShhdHRyVmFsdWUpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKEVORCkpIHsKKyAgICAgICAgICAgIGVsZW0uc2V0TWF4VmFsdWUoYXR0clZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgIH0gLy8gbm90IGEgY29udGFpbmVyIGF0dHJpYnV0ZQorICAgIAorICAgIHJldHVybiBlbGVtOworICB9CisKKyAgcHVibGljIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCBleHRyYWN0RW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KFN0cmluZyBlbGVtTmFtZSwgU3RyaW5nIHZhcm5hbWUsCisgICAgICBQcm9maWxlIHByb2ZpbGUsIERBUyBkYXMpCisgICAgICB0aHJvd3MgTm9TdWNoQXR0cmlidXRlRXhjZXB0aW9uIHsKKyAgICBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgZWxlbSA9IG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQocHJvZmlsZSk7CisgICAgZWxlbS5zZXROYW1lKGVsZW1OYW1lKTsKKworICAgIEF0dHJpYnV0ZVRhYmxlIGF0dFRhYmxlID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgYXR0VGFibGUgPSBkYXMuZ2V0QXR0cmlidXRlVGFibGUoZWxlbU5hbWUpOworICAgIH0gY2F0Y2ggKE5vU3VjaEF0dHJpYnV0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBleHRyYWN0aW5nIGF0dHJpYnV0ZSB0YWJsZSBmb3IgZWxlbWVudDogWyIKKyAgICAgICAgICArIGVsZW1OYW1lICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0aHJvdyBlOworCisgICAgfQorCisgICAgRW51bWVyYXRpb24gYXR0cmlidXRlTmFtZXMgPSBhdHRUYWJsZS5nZXROYW1lcygpOworICAgIHdoaWxlIChhdHRyaWJ1dGVOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgYXR0cmlidXRlTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0VGFibGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTsKKyAgICAgIEVudW1lcmF0aW9uIGF0dHJWYWx1ZXMgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgYXR0clZhbHVlcyA9IGF0dHIuZ2V0VmFsdWVzKCk7CisgICAgICB9IGNhdGNoIChOb1N1Y2hBdHRyaWJ1dGVFeGNlcHRpb24gZSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJBdHRlbXB0IHRvIHJlc29sdmUgYXR0cmlidXRlOiBbIiArIGF0dHJOYW1lCisgICAgICAgICAgICArICJdIGZhaWxlZDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChhdHRyVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSAoU3RyaW5nKSBhdHRyVmFsdWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgIGlmIChhdHRyTmFtZS5lcXVhbHMoQUNUVUFMX1JBTkdFKSkgeworICAgICAgICAgIFN0cmluZ1tdIHZhbHMgPSBhdHRyVmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICBlbGVtLmdldFZhbHVlcygpLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHMpKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoVU5JVFMpKSB7CisgICAgICAgICAgZWxlbS5zZXRVbml0KGF0dHJWYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZWxlbS5nZXRWYWx1ZXMoKS5hZGQoYXR0clZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIGVsZW07CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL09wZW5kYXBQcm9maWxlSGFuZGxlci5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL09wZW5kYXBQcm9maWxlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzBmZWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvT3BlbmRhcFByb2ZpbGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3BlbmRhcC5kYXAuRENvbm5lY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLkRhcFJvb3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuZXh0cmFjdG9ycy5EYXNNZXRhZGF0YUV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmV4dHJhY3RvcnMuTWV0YWRhdGFFeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5leHRyYWN0b3JzLk5jbWxNZXRhZGF0YUV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmV4dHJhY3RvcnMuVGhyZWRkc01ldGFkYXRhRXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMudXRpbC5Qcm9maWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworLyoqCisgKiAKKyAqIAorICogQSBnZW5lcmljIHJldXNhYmxlIE9PRFQge0BsaW5rIFByb2ZpbGVIYW5kbGVyfSBmb3IgdXNlIGluIGV4dHJhY3RpbmcgbWV0YWRhdGEKKyAqIGZyb20gT1BlTkRBUCBhbmQgVEhSRUREUy1hY2Nlc3NpYmxlIGRhdGFzZXRzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBPcGVuZGFwUHJvZmlsZUhhbmRsZXIgaW1wbGVtZW50cyBQcm9maWxlSGFuZGxlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfSEFORExFUl9JRCA9ICJPT0RUIE9QZU5EQVAgUHJvZmlsZSBIYW5kbGVyIjsKKworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihPcGVuZGFwUHJvZmlsZUhhbmRsZXIuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgT3BlbmRhcENvbmZpZyBjb25mOworCisgIHB1YmxpYyBPcGVuZGFwUHJvZmlsZUhhbmRsZXIoKXsKKyAgfQorCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgbWV0aG9kCisgICAqLworICBwdWJsaWMgTGlzdDxQcm9maWxlPiBmaW5kUHJvZmlsZXMoWE1MUXVlcnkgeG1sUXVlcnkpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgY29uZmlnRmlsZUxvYyA9IG51bGw7CisgICAgU3RyaW5nIHEgPSB4bWxRdWVyeS5nZXRLd2RRdWVyeVN0cmluZygpOworICAgIGlmIChxLmNvbnRhaW5zKCJDb25maWdVcmw9IikpeworICAgIAlQYXR0ZXJuIHBhcmFtZXRlclBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIkNvbmZpZ1VybD0oLis/KSggLiopPyQiKTsKKyAgICAJTWF0Y2hlciBmaWxlTWF0Y2ggPSBwYXJhbWV0ZXJQYXR0ZXJuLm1hdGNoZXIocSk7CisgICAgCXdoaWxlIChmaWxlTWF0Y2guZmluZCgpKSB7CisgICAgCQljb25maWdGaWxlTG9jID0gZmlsZU1hdGNoLmdyb3VwKDEpOworICAgIAl9CisgICAgfSBlbHNlIHsKKyAgICAJY29uZmlnRmlsZUxvYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXAuY29uZmlnLmZpbGVQYXRoIik7CisgICAgfQorICAgIAorICAgIGlmIChjb25maWdGaWxlTG9jLmlzRW1wdHkoKSl7CisgICAgCXRocm93IG5ldyBQcm9maWxlRXhjZXB0aW9uKAorICAgIAkJIkNvbmZpZ3VyYXRpb24gZmlsZSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IGluIFN5c3RlbSBwcm9wZXJ0eSBvcGVuZGFwLmNvbmZpZy5maWxlUGF0aCBvciBhcyBVUkwgcGFyYW1ldGVyIENvbmZpZ1VybCIpOworICAgIH0gZWxzZSB7CisgICAgCXRyeSB7CisgICAgCQl0aGlzLmNvbmYgPSBPcGVuZGFwQ29uZmlnUmVhZGVyLnJlYWQoY29uZmlnRmlsZUxvYyk7CisgICAgCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgCQl0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbigiRmlsZU5vdEZvdW5kRXhjZXB0aW9uOiBGaWxlIG5vdCBmb3VuZCEiKTsKKyAgICAJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAJCXRocm93IG5ldyBQcm9maWxlRXhjZXB0aW9uKCJNYWxmb3JtZWRVUkxFeGNlcHRpb246IHBsZWFzZSBmaXggZmlsZSBVUkwiKTsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICBMaXN0PFByb2ZpbGU+IHByb2ZpbGVzID0gbmV3IFZlY3RvcjxQcm9maWxlPigpOworICAgIExpc3Q8RGFwUm9vdD4gcm9vdHMgPSB0aGlzLmNvbmYuZ2V0Um9vdHMoKTsKKwkgIAorICAgIC8vIGxvb3Agb3ZlciBUSFJFRERTIGNhdGFsb2dzCisgICAgZm9yIChEYXBSb290IHJvb3QgOiByb290cykgeworICAgIAlMT0cubG9nKExldmVsLklORk8sIlBhcnNpbmcgRGFwUm9vdD0iK3Jvb3QuZ2V0RGF0YXNldFVybCgpKTsKKworICAgICAgRGF0YXNldEV4dHJhY3RvciBkID0gbmV3IERhdGFzZXRFeHRyYWN0b3IoeG1sUXVlcnksIHJvb3QuZ2V0Q2F0YWxvZ1VybCgpCisgICAgICAgICAgLnRvRXh0ZXJuYWxGb3JtKCksIHJvb3QuZ2V0RGF0YXNldFVybCgpLnRvRXh0ZXJuYWxGb3JtKCksIGNvbmYpOworICAgICAgaWYgKGQuZ2V0RGFwVXJscygpICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgb3BlbmRhcFVybCA6IGQuZ2V0RGFwVXJscygpKSB7CisgICAgICAgIAkKKyAgICAgICAgICAvLyB3cmFwIHRoZSBwcm9maWxlIGdlbmVyYXRpb24gaW4gdHJ5LWNhdGNoIHRvIGF2b2lkIHN0b3BwaW5nIHRoZSB3aG9sZSBoYXJ2ZXN0aW5nIHByb2Nlc3MgaW4gY2FzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgIAlMT0cubG9nKExldmVsLkZJTkUsIkNvbm5lY3RpbmcgdG8gb3BlbmRhcHVybD0iK29wZW5kYXBVcmwpOworICAKKyAgICAgICAgICAgIFByb2ZpbGUgcHJvZmlsZSA9IG5ldyBQcm9maWxlKCk7CisgICAgICAgICAgICBEQ29ubmVjdCBkQ29ubiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBkQ29ubiA9IG5ldyBEQ29ubmVjdChvcGVuZGFwVXJsLCB0cnVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIk9wZW5kYXAgVVJMIG5vdCBmb3VuZDogWyIgKyBvcGVuZGFwVXJsCisgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbigiT3BlbmRhcCBVUkwgbm90IGZvdW5kOiBbIiArIG9wZW5kYXBVcmwKKyAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJldHJpZXZlIGFscmVhZHkgZXh0cmFjdGVkIFRIUkVERFMgbWV0YWRhdGEKKyAgICAgICAgICAgIE1ldGFkYXRhIGRhdGFzZXRNZXQgPSBkLmdldERhdGFzZXRNZXQob3BlbmRhcFVybCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGV4dHJhY3QgREFTIG1ldGFkYXRhCisgICAgICAgICAgICBNZXRhZGF0YUV4dHJhY3RvciBkYXNFeHRyYWN0b3IgPSBuZXcgRGFzTWV0YWRhdGFFeHRyYWN0b3IoZENvbm4pOworICAgICAgICAgICAgZGFzRXh0cmFjdG9yLmV4dHJhY3QoZGF0YXNldE1ldCwgY29uZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGV4dHJhY3QgTmNNTCBtZXRhZGF0YSwgaWYgYXZhaWxhYmxlCisgICAgICAgICAgIGlmIChkYXRhc2V0TWV0LmNvbnRhaW5zS2V5KFRocmVkZHNNZXRhZGF0YUV4dHJhY3Rvci5TRVJWSUNFX1RZUEVfTkNNTCkpIHsKKyAgICAgICAgICAgIAkvLyByZXRyaWV2ZSBVUkwgb2YgTmNNTCBkb2N1bWVudCwgcHJldmlvdXNseSBzdG9yZWQKKyAgICAgICAgICAgIAlmaW5hbCBTdHJpbmcgbmNtbFVybCA9IGRhdGFzZXRNZXQuZ2V0TWV0YWRhdGEoVGhyZWRkc01ldGFkYXRhRXh0cmFjdG9yLlNFUlZJQ0VfVFlQRV9OQ01MKTsKKyAgICAgICAgICAgIAlNZXRhZGF0YUV4dHJhY3RvciBuY21sRXh0cmFjdG9yID0gbmV3IE5jbWxNZXRhZGF0YUV4dHJhY3RvcihuY21sVXJsKTsKKyAgICAgICAgICAgIAluY21sRXh0cmFjdG9yLmV4dHJhY3QoZGF0YXNldE1ldCwgY29uZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGRlYnVnOiB3cml0ZSBvdXQgYWxsIG1ldGFkYXRhIGVudHJpZXMKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGRhdGFzZXRNZXQuZ2V0QWxsS2V5cygpKSB7CisgICAgICAgICAgCSAgTE9HLmxvZyhMZXZlbC5GSU5FUiwgIk1ldGFkYXRhIGtleT0iK2tleSsiIHZhbHVlPSIrZGF0YXNldE1ldC5nZXRNZXRhZGF0YShrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgLy8gPHJlc0F0dHJpYnV0ZXM+CisgICAgICAgICAgICBwcm9maWxlLnNldFJlc291cmNlQXR0cmlidXRlcyhQcm9maWxlVXRpbHMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIHRoaXMuY29uZiwgb3BlbmRhcFVybCwgZENvbm4sIGRhdGFzZXRNZXQpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gPHByb2ZBdHRyaWJ1dGVzPgorICAgICAgICAgICAgcHJvZmlsZS5zZXRQcm9maWxlQXR0cmlidXRlcyhQcm9maWxlVXRpbHMKKyAgICAgICAgICAgICAgICAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXModGhpcy5jb25mLCBkYXRhc2V0TWV0KSk7CisgICAgICAgICAgICAvLyA8cHJvZkVsZW1lbnQ+CisgICAgICAgICAgICBwcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpLnB1dEFsbCgKKyAgICAgICAgICAgICAgICBQcm9maWxlVXRpbHMuZ2V0UHJvZmlsZUVsZW1lbnRzKHRoaXMuY29uZiwgZENvbm4sIGRhdGFzZXRNZXQsIHByb2ZpbGUpKTsKKyAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIkFkZGVkIHByb2ZpbGUgaWQ9Iitwcm9maWxlLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAJLy8gaW4gY2FzZSBvZiBleGNlcHRpb24sIGRvbid0IGhhcnZlc3QgdGhpcyBkYXRhc2V0LCBidXQga2VlcCBnb2luZworICAgICAgICAgIAlMT0cubG9nKExldmVsLldBUk5JTkcsIkVycm9yIHdoaWxlIGJ1aWxkaW5nIHByb2ZpbGUgZm9yIG9wZW5kYXB1cmw9IitvcGVuZGFwVXJsKTsgCisgICAgICAgICAgCUxPRy5sb2coTGV2ZWwuV0FSTklORyxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHByb2ZpbGVzOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5Qcm9maWxlSGFuZGxlciNnZXQoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBQcm9maWxlIGdldChTdHJpbmcgaWQpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbigibWV0aG9kIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVIYW5kbGVyI2dldElEKCkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisgICAgcmV0dXJuIFBST0ZJTEVfSEFORExFUl9JRDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvUHJvZmlsZXIuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9Qcm9maWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODU2ODQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvUHJvZmlsZXIuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMudXRpbC5Qcm9maWxlQ2hlY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLnV0aWwuUHJvZmlsZVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5Qcm9maWxlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIENvbW1hbmQgbGluZSBjbGFzcyB0byBkcml2ZSB0aGUgY3JlYXRpb24gb2YgT09EVCBwcm9maWxlcyBmcm9tIFRIUkVERFMKKyAqIGNhdGFsb2dzIHdpdGggT3BlbkRBUCBlbmRwb2ludHMuCisgKiA8cC8+CisgKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBsaXN0IG9mIFRIUkVERFMgY2F0YWxvZyBVUkxzIGZyb20gdGhlIGdpdmVuIG9wZW5kYXBwcworICogY29uZmlndXJhdGlvbiBmaWxlLCBwYXJzZXMgdGhlIGNhdGFsb2dzLCBhbmQgaXQgd3JpdGVzIHRoZSBPT0RUIHByb2ZpbGVzIChvbmUKKyAqIGZvciBlYWNoIFRIUkVERFMgZGF0YXNldCkgaW4gdGhlIGZpbGUgInByb2ZpbGVzLnhtbCIgaW4gdGhlIHNwZWNpZmllZAorICogZGlyZWN0b3J5LCBvciBpbiB0aGUgbG9jYWwgZXhlY3V0aW9uIGRpcmVjdG9yeSBpZiBub25lIGlzIHNwZWNpZmllZC4KKyAqIDxwLz4KKyAqIFVzYWdlOiBqYXZhIC1jbGFzc3BhdGggW3BhdGggdG8gb3BlbmRhcHBzLXZlcnNpb24tamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphcl0KKyAqIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuUHJvZmlsZXIgW2NvbmZpZ19maWxlX2xvY2F0aW9uXQorICogW29wdGlvbmFsX291dHB1dF9kaXJdCisgKiA8cC8+CisgKiBVc2FnZSBleGFtcGxlOiBqYXZhIC1jbGFzc3BhdGgKKyAqIC4vdGFyZ2V0L29wZW5kYXBwcy0wLjQtU05BUFNIT1QtamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphcgorICogb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5Qcm9maWxlciAvaG9tZS91c2Vycy90ZXN0dXNlci9vcGVuZGFwLmNvbmZpZy54bWwKKyAqIC90bXAKKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKiAKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVyIHsKKworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQcm9maWxlci5jbGFzcy5nZXROYW1lKCkpOworICAKKyAgLyoqCisgICAqIE9wdGlvbmFsIGRpcmVjdG9yeSB0byBzZXJpYWxpemUgdGhlIHByb2ZpbGVzIHRvLgorICAgKi8KKyAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcjsKKworICAvKioKKyAgICogQ29tbWFuZCBsaW5lIGludm9jYXRpb24gbWV0aG9kLgorICAgKiAKKyAgICogQHBhcmFtIGFyZ3MKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgLy8gcGFyc2UgY29tbWFuZCBsaW5lIGlucHV0CisgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEgJiYgYXJncy5sZW5ndGggIT0gMikgeworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7CisgICAgUHJvZmlsZXIgcHJvZmlsZXIgPSBuZXcgUHJvZmlsZXIoKTsKKyAgICBpZiAoYXJncy5sZW5ndGggPT0gMikgeworICAgICAgcHJvZmlsZXIuc2V0T3V0cHV0RGlyKCBuZXcgRmlsZShhcmdzWzFdKSApOworICAgIH0KKyAgICAKKyAgICAvLyBydW4gcHJvZmlsZXIKKyAgICBwcm9maWxlci5tYWtlUHJvZmlsZXMoY29uZmlnRmlsZSk7CisgICAgCisgIH0KKyAgCisgIC8qKgorICAgKiBObyBhcmd1bWVudCBjb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBQcm9maWxlcigpIHt9CisgIAorICAvKioKKyAgICogU2V0dGVyIG1ldGhvZCBmb3Igb3V0cHV0IGRpcmVjdG9yeS4KKyAgICogQHBhcmFtIG91dHB1dERpcgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyKEZpbGUgb3V0cHV0RGlyKSB7CisJCXRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCX0KKworCS8qKgorICAgKiBNZXRob2QgdG8gZ2VuZXJhdGUgT09EVCBwcm9maWxlcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb25zIGNvbnRhaW5lZCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICogCisgICAqIEBwYXJhbSBjb25maWdGaWxlIAorICAgKiBAcmV0dXJuCisgICAqLworICBwdWJsaWMgTGlzdDxQcm9maWxlPiBtYWtlUHJvZmlsZXMoZmluYWwgRmlsZSBjb25maWdGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIC8vIHBhcnNlIFRIUkVERFMgY2F0YWxvZ3MsIGNyZWF0ZSBPT0RUIHByb2ZpbGVzCisgICAgUHJvZmlsZUhhbmRsZXIgcHJvZmlsZUhhbmRsZXIgPSBuZXcgT3BlbmRhcFByb2ZpbGVIYW5kbGVyKCk7CisgICAgWE1MUXVlcnkgeG1sUXVlcnkgPSBQcm9maWxlci5idWlsZFhNTFF1ZXJ5KGNvbmZpZ0ZpbGUpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHZhbHVlID0gInVuY2hlY2tlZCIpCisgICAgZmluYWwgTGlzdDxQcm9maWxlPiBwcm9maWxlcyA9IHByb2ZpbGVIYW5kbGVyLmZpbmRQcm9maWxlcyh4bWxRdWVyeSk7CisgICAgCisgICAgLy8gY2hlY2sgcHJvZmlsZXMKKyAgICBmb3IgKGZpbmFsIFByb2ZpbGUgcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIAlib29sZWFuIG9rID0gUHJvZmlsZUNoZWNrZXIuY2hlY2socHJvZmlsZSwgc2IpOworICAgIAkvLyBwcmludCBvdXQgdGhlIHByb2ZpbGUgc3VtbWFyeSBmb3IgcXVpY2sgcmV2aWV3IGJ5IHRoZSBwdWJsaXNoZXIKKyAgICAJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgIAlpZiAoIW9rKSB7CisgICAgCQlMT0cubG9nKExldmVsLlNFVkVSRSwgIkVSUk9SOiBpbnZhbGlkIHByb2ZpbGU6Iitwcm9maWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldElkZW50aWZpZXIoKSk7CisgICAgCX0gCQorICAgIH0KKworICAgIC8vIHNlcmlhbGl6ZSBwcm9maWxlcyB0byBYTUwKKyAgICBTdHJpbmcgeG1sID0gUHJvZmlsZVNlcmlhbGl6ZXIudG9YTUwocHJvZmlsZXMpOworICAgIExPRy5sb2coTGV2ZWwuRklORSwgeG1sKTsKKworICAgIC8vIHdyaXRlIFhNTCB0byBkaXNrCisgICAgaWYgKG91dHB1dERpciAhPSBudWxsKSB7CisgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXIsICJwcm9maWxlcy54bWwiKTsKKyAgICAgIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZShmaWxlLCB4bWwpOworICAgIH0KKworICAgIHJldHVybiBwcm9maWxlczsKKyAgICAKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFhNTFF1ZXJ5IGJ1aWxkWE1MUXVlcnkoZmluYWwgRmlsZSBmaWxlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9ICI8cXVlcnk+PHF1ZXJ5S1dRU3RyaW5nPiIKKyAgICAgICAgKyAiUEZ1bmN0aW9uPWZpbmRhbGw/Q29uZmlnVXJsPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICsgIjwvcXVlcnlLV1FTdHJpbmc+PC9xdWVyeT4iOworICAgIGZpbmFsIFhNTFF1ZXJ5IHhtbFF1ZXJ5ID0gbmV3IFhNTFF1ZXJ5KHF1ZXJ5KTsKKyAgICByZXR1cm4geG1sUXVlcnk7CisKKyAgfQorCisgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgdXNhZ2UoKSB7CisgICAgU3lzdGVtLm91dAorICAgICAgICAucHJpbnRsbigiVXNhZ2U6IGphdmEgLWNsYXNzcGF0aCBbcGF0aCB0byBvcGVuZGFwcHMtdmVyc2lvbi1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyXSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLlByb2ZpbGVyIDxjb25maWcgZmlsZSBsb2NhdGlvbj4gWzxvdXRwdXRfZGlyPl0iKTsKKyAgICBTeXN0ZW0ub3V0CisgICAgICAgIC5wcmludGxuKCJFeGFtcGxlOiBqYXZhIC1jbGFzc3BhdGggLi90YXJnZXQvb3BlbmRhcHBzLTAuNC1TTkFQU0hPVC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuUHJvZmlsZXIgL2hvbWUvdXNlcnMvdGVzdHVzZXIvb3BlbmRhcC5jb25maWcueG1sIC90bXAiKTsKKyAgICBTeXN0ZW0uZXhpdCgtMSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9Db25zdGFudFNwZWMuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvQ29uc3RhbnRTcGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjM2ZlNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvQ29uc3RhbnRTcGVjLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5SZXNvdXJjZUF0dHJpYnV0ZXM7CisKKy8qKgorICogCisgKiBBIHNwZWNpZmljYXRpb24gb2YgYSBjb25zdGFudCBmaWVsZCB0byBmbG93IHRocm91Z2ggaW50byBlaXRoZXIgdGhlIGdlbmVyYXRlZAorICoge0BsaW5rIFByb2ZpbGV9cyB7QGxpbmsgUHJvZmlsZUF0dHJpYnV0ZXN9IHNlY3Rpb24gb3IgaXRzCisgKiB7QGxpbmsgUmVzb3VyY2VBdHRyaWJ1dGVzfSBzZWN0aW9uLiBQYXJ0IG9mIHRoZSB7QGxpbmsgT3BlbmRhcENvbmZpZ30uCisgKiAKKyAqLworcHVibGljIGNsYXNzIENvbnN0YW50U3BlYyB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgIHB1YmxpYyBDb25zdGFudFNwZWMoKSB7CisgICAgdGhpcy50eXBlID0gbnVsbDsKKyAgICB0aGlzLm5hbWUgPSBudWxsOworICAgIHRoaXMudmFsdWUgPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHR5cGUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdHlwZQorICAgKiAgICAgICAgICB0aGUgdHlwZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdmFsdWUKKyAgICogICAgICAgICAgdGhlIHZhbHVlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvRGFwUm9vdC5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9EYXBSb290LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4NDM2OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvRGFwUm9vdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiAKKyAqIEEgc2V0IG9mIHJvb3Qge0BsaW5rIFVSTH0gaW5mb3JtYXRpb24gZm9yIE9QZU5EQVAvVEhSRUREUyBjYXRhbG9ncyB0byBjcmF3bAorICogYW5kIG9idGFpbiBkYXRhc2V0IG1ldGFkYXRhIGZyb20uCisgKiAKKyAqLworcHVibGljIGNsYXNzIERhcFJvb3QgeworCisgIHByaXZhdGUgVVJMIGRhdGFzZXRVcmw7CisKKyAgcHJpdmF0ZSBVUkwgY2F0YWxvZ1VybDsKKworICBwcml2YXRlIFN0cmluZyBmaWx0ZXI7CisKKyAgcHVibGljIERhcFJvb3QoKSB7CisgICAgdGhpcy5kYXRhc2V0VXJsID0gbnVsbDsKKyAgICB0aGlzLmNhdGFsb2dVcmwgPSBudWxsOworICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBkYXRhc2V0VXJsCisgICAqLworICBwdWJsaWMgVVJMIGdldERhdGFzZXRVcmwoKSB7CisgICAgcmV0dXJuIGRhdGFzZXRVcmw7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGRhdGFzZXRVcmwKKyAgICogICAgICAgICAgdGhlIGRhdGFzZXRVcmwgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXREYXRhc2V0VXJsKFVSTCBkYXRhc2V0VXJsKSB7CisgICAgdGhpcy5kYXRhc2V0VXJsID0gZGF0YXNldFVybDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjYXRhbG9nVXJsCisgICAqLworICBwdWJsaWMgVVJMIGdldENhdGFsb2dVcmwoKSB7CisgICAgcmV0dXJuIGNhdGFsb2dVcmw7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNhdGFsb2dVcmwKKyAgICogICAgICAgICAgdGhlIGNhdGFsb2dVcmwgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nVXJsKFVSTCBjYXRhbG9nVXJsKSB7CisgICAgdGhpcy5jYXRhbG9nVXJsID0gY2F0YWxvZ1VybDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXIKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgeworICAgIHJldHVybiBmaWx0ZXI7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGZpbHRlcgorICAgKiAgICAgICAgICB0aGUgZmlsdGVyIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKKyAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL0RhdGFzZXRNZXRFbGVtLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL0RhdGFzZXRNZXRFbGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmYmRiOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvRGF0YXNldE1ldEVsZW0uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWc7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQ7CisKKy8qKgorICogCisgKiBTcGVjaWZpY2F0aW9uIGZvciB0aGUge0BsaW5rIE9wZW5kYXBDb25maWd9IHRoYXQgc3BlY2lmaWVzIHdoYXQgVEhSRUREUworICogZGF0YXNldCBtZXQgdG8gdXNlIHRvIGNyZWF0ZSB7QGxpbmsgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50fXMgZnJvbS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGF0YXNldE1ldEVsZW0geworCisgIHByaXZhdGUgU3RyaW5nIHByb2ZpbGVFbGVtZW50TmFtZTsKKworICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICBwdWJsaWMgRGF0YXNldE1ldEVsZW0oKSB7CisgICAgdGhpcy5wcm9maWxlRWxlbWVudE5hbWUgPSBudWxsOworICAgIHRoaXMudmFsdWUgPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHByb2ZpbGVFbGVtZW50TmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQcm9maWxlRWxlbWVudE5hbWUoKSB7CisgICAgcmV0dXJuIHByb2ZpbGVFbGVtZW50TmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcHJvZmlsZUVsZW1lbnROYW1lCisgICAqICAgICAgICAgIHRoZSBwcm9maWxlRWxlbWVudE5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcm9maWxlRWxlbWVudE5hbWUoU3RyaW5nIHByb2ZpbGVFbGVtZW50TmFtZSkgeworICAgIHRoaXMucHJvZmlsZUVsZW1lbnROYW1lID0gcHJvZmlsZUVsZW1lbnROYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdmFsdWUKKyAgICogICAgICAgICAgdGhlIHZhbHVlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvT3BlbmRhcENvbmZpZy5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9PcGVuZGFwQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5ZGFjYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvT3BlbmRhcENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIAorICogVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUge0BsaW5rIE9wZW5kYXBQcm9maWxlSGFuZGxlcn0uCisgKiAKKyAqLworcHVibGljIGNsYXNzIE9wZW5kYXBDb25maWcgeworCisgIHByaXZhdGUgTGlzdDxEYXBSb290PiByb290czsKKworICBwcml2YXRlIExpc3Q8UmV3cml0ZVNwZWM+IHJld3JpdGVTcGVjczsKKworICBwcml2YXRlIExpc3Q8Q29uc3RhbnRTcGVjPiBjb25zdFNwZWNzOworCisgIHByaXZhdGUgTGlzdDxEYXRhc2V0TWV0RWxlbT4gZGF0YXNldE1ldFNwZWNzOworICAKKyAgcHJpdmF0ZSBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zIHByb2Nlc3NpbmdJbnN0cnVjdGlvbnM7CisKKyAgcHVibGljIE9wZW5kYXBDb25maWcoKSB7CisgICAgdGhpcy5yb290cyA9IG5ldyBWZWN0b3I8RGFwUm9vdD4oKTsKKyAgICB0aGlzLnJld3JpdGVTcGVjcyA9IG5ldyBWZWN0b3I8UmV3cml0ZVNwZWM+KCk7CisgICAgdGhpcy5jb25zdFNwZWNzID0gbmV3IFZlY3RvcjxDb25zdGFudFNwZWM+KCk7CisgICAgdGhpcy5kYXRhc2V0TWV0U3BlY3MgPSBuZXcgVmVjdG9yPERhdGFzZXRNZXRFbGVtPigpOworICAgIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9ucyA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zKCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcm9vdHMKKyAgICovCisgIHB1YmxpYyBMaXN0PERhcFJvb3Q+IGdldFJvb3RzKCkgeworICAgIHJldHVybiByb290czsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcm9vdHMKKyAgICogICAgICAgICAgdGhlIHJvb3RzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Um9vdHMoTGlzdDxEYXBSb290PiByb290cykgeworICAgIHRoaXMucm9vdHMgPSByb290czsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSByZXdyaXRlU3BlY3MKKyAgICovCisgIHB1YmxpYyBMaXN0PFJld3JpdGVTcGVjPiBnZXRSZXdyaXRlU3BlY3MoKSB7CisgICAgcmV0dXJuIHJld3JpdGVTcGVjczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcmV3cml0ZVNwZWNzCisgICAqICAgICAgICAgIHRoZSByZXdyaXRlU3BlY3MgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSZXdyaXRlU3BlY3MoTGlzdDxSZXdyaXRlU3BlYz4gcmV3cml0ZVNwZWNzKSB7CisgICAgdGhpcy5yZXdyaXRlU3BlY3MgPSByZXdyaXRlU3BlY3M7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgY29uc3RTcGVjcworICAgKi8KKyAgcHVibGljIExpc3Q8Q29uc3RhbnRTcGVjPiBnZXRDb25zdFNwZWNzKCkgeworICAgIHJldHVybiBjb25zdFNwZWNzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjb25zdFNwZWNzCisgICAqICAgICAgICAgIHRoZSBjb25zdFNwZWNzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29uc3RTcGVjcyhMaXN0PENvbnN0YW50U3BlYz4gY29uc3RTcGVjcykgeworICAgIHRoaXMuY29uc3RTcGVjcyA9IGNvbnN0U3BlY3M7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZGF0YXNldE1ldFNwZWNzCisgICAqLworICBwdWJsaWMgTGlzdDxEYXRhc2V0TWV0RWxlbT4gZ2V0RGF0YXNldE1ldFNwZWNzKCkgeworICAgIHJldHVybiBkYXRhc2V0TWV0U3BlY3M7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGRhdGFzZXRNZXRTcGVjcworICAgKiAgICAgICAgICB0aGUgZGF0YXNldE1ldFNwZWNzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RGF0YXNldE1ldFNwZWNzKExpc3Q8RGF0YXNldE1ldEVsZW0+IGRhdGFzZXRNZXRTcGVjcykgeworICAgIHRoaXMuZGF0YXNldE1ldFNwZWNzID0gZGF0YXNldE1ldFNwZWNzOworICB9CisgIAorICAvKioKKyAgICogUmV0dXJucyBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zCisgICAqLworICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9ucyBnZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zKCkgeworICAJcmV0dXJuIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9uczsKKyAgfQorICAKKyAgLyoqCisgICAqIEFkZHMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgorICAgKiAKKyAgICogQHBhcmFtIGtleQorICAgKiBAcGFyYW0gdmFsdWUKKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgCXRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9ucy5hZGRJbnN0cnVjdGlvbihrZXksIHZhbHVlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL09wZW5kYXBDb25maWdNZXRLZXlzLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL09wZW5kYXBDb25maWdNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlODI5OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvT3BlbmRhcENvbmZpZ01ldEtleXMuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWc7CisKKy8qKgorICogCisgKiBBIHNldCBvZiBtZXRhZGF0YSBrZXlzIGZvciByZWFkaW5nIHRoZSB7QGxpbmsgT3BlbmRhcENvbmZpZ30uCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBPcGVuZGFwQ29uZmlnTWV0S2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0FUVFJfU1BFQ19UWVBFID0gInJlc0F0dHIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZfQVRUUl9TUEVDX1RZUEUgPSAicHJvZkF0dHIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZfRUxFTV9TUEVDX1RZUEUgPSAicHJvZkVsZW0iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fRUxFTUVOVF9UWVBFID0gIkVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VEX0VMRU1FTlRfVFlQRSA9ICJSYW5nZWRQcm9maWxlRWxlbWVudCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFQX1JPT1RfVEFHID0gInJvb3QiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFTRVRfVVJMX0FUVFIgPSAiZGF0YXNldFVSTCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19VUkxfQVRUUiA9ICJjYXRhbG9nVVJMIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQVRUUiA9ICJmaWx0ZXIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFV1JJVEVfUk9PVF9UQUcgPSAicmV3cml0ZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9WQVJfVEFHID0gInZhciI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9WQVJfTkFNRV9BVFRSID0gIm5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFV1JJVEVfVkFSX1JFTkFNRV9BVFRSID0gInJlbmFtZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9WQVJfVFlQRV9BVFRSID0gInR5cGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUQU5UX1JPT1RfVEFHID0gImNvbnN0YW50cyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RBTlRfVEFHID0gImNvbnN0IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVEFOVF9OQU1FX0FUVFIgPSAibmFtZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RBTlRfVFlQRV9BVFRSID0gInR5cGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUQU5UX1ZBTFVFX0FUVFIgPSAidmFsdWUiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQVNFVF9NRVRfUk9PVF9UQUcgPSAiZGF0YXNldE1ldGFkYXRhIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFTRVRfTUVUX0VMRU1fVEFHID0gImVsZW0iOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQVNFVF9NRVRfTkFNRV9BVFRSID0gIm5hbWUiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQVNFVF9NRVRfVkFMVUVfQVRUUiA9ICJ2YWx1ZSI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfTE9DQVRJT05fQVRUUiA9ICJyZXNMb2NhdGlvbiI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OU19UQUcgPSAicHJvY2Vzc2luZ0luc3RydWN0aW9ucyI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1RBRyA9ICJwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24iOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OQU1FX0FUVFIgPSAibmFtZSI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1ZBTFVFX0FUVFIgPSAidmFsdWUiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERV9WQVJJQUJMRVNfQVRUUiA9ICJleGNsdWRlVmFyaWFibGVzIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVUSU1FX0ZPUk1BVF9BVFRSID0gImRhdGV0aW1lRm9ybWF0IjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9PcGVuZGFwQ29uZmlnUmVhZGVyLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL09wZW5kYXBDb25maWdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM3ODA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9PcGVuZGFwQ29uZmlnUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZzsKKworLy8gT09EVCBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLkNBVEFMT0dfVVJMX0FUVFI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLkNPTlNUQU5UX05BTUVfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuQ09OU1RBTlRfUk9PVF9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLkNPTlNUQU5UX1RBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuQ09OU1RBTlRfVFlQRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5DT05TVEFOVF9WQUxVRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5EQVBfUk9PVF9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLkRBVEFTRVRfTUVUX0VMRU1fVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5EQVRBU0VUX01FVF9OQU1FX0FUVFI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLkRBVEFTRVRfTUVUX1JPT1RfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5EQVRBU0VUX01FVF9WQUxVRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5EQVRBU0VUX1VSTF9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5GSUxURVJfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05BTUVfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fVkFMVUVfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuUkVXUklURV9ST09UX1RBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuUkVXUklURV9WQVJfTkFNRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5SRVdSSVRFX1ZBUl9SRU5BTUVfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXMuUkVXUklURV9WQVJfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5SRVdSSVRFX1ZBUl9UWVBFX0FUVFI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIAorICogUmVhZHMgdGhlIHtAbGluayBPcGVuZGFwQ29uZmlnfSBmcm9tIGEgcHJvdmlkZWQgZmlsZSBhbmQgcmV0dXJucyBpdC4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgT3BlbmRhcENvbmZpZ1JlYWRlciB7CisKKyAgcHVibGljIHN0YXRpYyBPcGVuZGFwQ29uZmlnIHJlYWQoU3RyaW5nIGNvbmZGaWxlUGF0aCkKKyAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgT3BlbmRhcENvbmZpZyBjb25mID0gbmV3IE9wZW5kYXBDb25maWcoKTsKKyAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSgKKyAgICAgICAgY29uZkZpbGVQYXRoKSkpOworICAgIEVsZW1lbnQgcm9vdEVsZW0gPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBOb2RlTGlzdCBkYXBSb290Tm9kZUxpc3QgPSByb290RWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShEQVBfUk9PVF9UQUcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGFwUm9vdE5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgZGFwUm9vdEVsZW0gPSAoRWxlbWVudCkgZGFwUm9vdE5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICBEYXBSb290IHJvb3QgPSBuZXcgRGFwUm9vdCgpOworICAgICAgcm9vdC5zZXRDYXRhbG9nVXJsKG5ldyBVUkwoZGFwUm9vdEVsZW0uZ2V0QXR0cmlidXRlKENBVEFMT0dfVVJMX0FUVFIpKSk7CisgICAgICByb290LnNldERhdGFzZXRVcmwobmV3IFVSTChkYXBSb290RWxlbS5nZXRBdHRyaWJ1dGUoREFUQVNFVF9VUkxfQVRUUikpKTsKKyAgICAgIHJvb3Quc2V0RmlsdGVyKGRhcFJvb3RFbGVtLmdldEF0dHJpYnV0ZShGSUxURVJfQVRUUikpOworICAgICAgY29uZi5nZXRSb290cygpLmFkZChyb290KTsKKyAgICB9CisKKyAgICBFbGVtZW50IHJld3JpdGVSb290RWxlbSA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudChSRVdSSVRFX1JPT1RfVEFHLAorICAgICAgICByb290RWxlbSk7CisgICAgTm9kZUxpc3QgcmV3cml0ZU5vZGVMaXN0ID0gcmV3cml0ZVJvb3RFbGVtCisgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShSRVdSSVRFX1ZBUl9UQUcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV3cml0ZU5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgcmV3cml0ZUVsZW0gPSAoRWxlbWVudCkgcmV3cml0ZU5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICBSZXdyaXRlU3BlYyBzcGVjID0gbmV3IFJld3JpdGVTcGVjKCk7CisgICAgICBzcGVjLnNldE9yaWdOYW1lKHJld3JpdGVFbGVtLmdldEF0dHJpYnV0ZShSRVdSSVRFX1ZBUl9OQU1FX0FUVFIpKTsKKyAgICAgIHNwZWMuc2V0UmVuYW1lKHJld3JpdGVFbGVtLmdldEF0dHJpYnV0ZShSRVdSSVRFX1ZBUl9SRU5BTUVfQVRUUikpOworICAgICAgc3BlYy5zZXRFbGVtZW50VHlwZShyZXdyaXRlRWxlbS5nZXRBdHRyaWJ1dGUoUkVXUklURV9WQVJfVFlQRV9BVFRSKSk7CisgICAgICBjb25mLmdldFJld3JpdGVTcGVjcygpLmFkZChzcGVjKTsKKyAgICB9CisKKyAgICBFbGVtZW50IGRhdGFzZXRNZXRSb290RWxlbSA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudChEQVRBU0VUX01FVF9ST09UX1RBRywKKyAgICAgICAgcm9vdEVsZW0pOworICAgIE5vZGVMaXN0IGRhdGFzZXRNZXRFbGVtTm9kZUxpc3QgPSBkYXRhc2V0TWV0Um9vdEVsZW0KKyAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKERBVEFTRVRfTUVUX0VMRU1fVEFHKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzZXRNZXRFbGVtTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgRWxlbWVudCBkYXRhc2V0TWV0RWxlbSA9IChFbGVtZW50KSBkYXRhc2V0TWV0RWxlbU5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICBEYXRhc2V0TWV0RWxlbSBkYXRhc2V0TWV0U3BlYyA9IG5ldyBEYXRhc2V0TWV0RWxlbSgpOworICAgICAgZGF0YXNldE1ldFNwZWMuc2V0UHJvZmlsZUVsZW1lbnROYW1lKGRhdGFzZXRNZXRFbGVtCisgICAgICAgICAgLmdldEF0dHJpYnV0ZShEQVRBU0VUX01FVF9OQU1FX0FUVFIpKTsKKyAgICAgIGRhdGFzZXRNZXRTcGVjLnNldFZhbHVlKGRhdGFzZXRNZXRFbGVtCisgICAgICAgICAgLmdldEF0dHJpYnV0ZShEQVRBU0VUX01FVF9WQUxVRV9BVFRSKSk7CisgICAgICBjb25mLmdldERhdGFzZXRNZXRTcGVjcygpLmFkZChkYXRhc2V0TWV0U3BlYyk7CisgICAgfQorCisgICAgRWxlbWVudCBjb25zdFJvb3RFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KENPTlNUQU5UX1JPT1RfVEFHLAorICAgICAgICByb290RWxlbSk7CisgICAgTm9kZUxpc3QgY29uc3ROb2RlTGlzdCA9IGNvbnN0Um9vdEVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoQ09OU1RBTlRfVEFHKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0Tm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgRWxlbWVudCBjb25zdEVsZW0gPSAoRWxlbWVudCkgY29uc3ROb2RlTGlzdC5pdGVtKGkpOworICAgICAgQ29uc3RhbnRTcGVjIGNvbnN0U3BlYyA9IG5ldyBDb25zdGFudFNwZWMoKTsKKyAgICAgIGNvbnN0U3BlYy5zZXROYW1lKGNvbnN0RWxlbS5nZXRBdHRyaWJ1dGUoQ09OU1RBTlRfTkFNRV9BVFRSKSk7CisgICAgICBjb25zdFNwZWMuc2V0VHlwZShjb25zdEVsZW0uZ2V0QXR0cmlidXRlKENPTlNUQU5UX1RZUEVfQVRUUikpOworICAgICAgY29uc3RTcGVjLnNldFZhbHVlKGNvbnN0RWxlbQorICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoQ09OU1RBTlRfVkFMVUVfQVRUUikpOworICAgICAgY29uZi5nZXRDb25zdFNwZWNzKCkuYWRkKGNvbnN0U3BlYyk7CisgICAgfQorICAgIAorICAgIEVsZW1lbnQgcHJvY2Vzc2luZ0luc3RydWN0aW9uc0VsZW0gPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQoUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfVEFHLCByb290RWxlbSk7CisgICAgaWYgKHByb2Nlc3NpbmdJbnN0cnVjdGlvbnNFbGVtIT1udWxsKSB7CisgICAgCU5vZGVMaXN0IGluc3ROb2RlTGlzdCA9IHByb2Nlc3NpbmdJbnN0cnVjdGlvbnNFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fVEFHKTsKKyAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0Tm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgIAkJRWxlbWVudCBpbnN0RWxlbSA9IChFbGVtZW50KSBpbnN0Tm9kZUxpc3QuaXRlbShpKTsKKyAgICAJCWNvbmYuYWRkUHJvY2Vzc2luZ0luc3RydWN0aW9uKGluc3RFbGVtLmdldEF0dHJpYnV0ZShQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05BTUVfQVRUUiksIAorICAgIAkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RFbGVtLmdldEF0dHJpYnV0ZShQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1ZBTFVFX0FUVFIpICk7CisgICAgCX0KKyAgICB9CisKKyAgICByZXR1cm4gY29uZjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL09wZW5kYXBQcm9maWxlTWV0S2V5cy5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9PcGVuZGFwUHJvZmlsZU1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYwYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2NvbmZpZy9PcGVuZGFwUHJvZmlsZU1ldEtleXMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnOworCisvKioKKyAqIEludGVyZmFjZSBjb250YWluaW5nIG5hbWVzIGZvciB0aGUgbWV0YWRhdGEga2V5cyB3cml0dGVuIHRvIGFuIE9wZW5EQVAgcHJvZmlsZSBkb2N1bWVudC4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9wZW5kYXBQcm9maWxlTWV0S2V5cyB7CisJCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQkxFUyA9ICJWYXJpYWJsZXMiOworCSAKKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PUkRJTkFURVMgPSAiQ29vcmRpbmF0ZXMiOworCSAKKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCTEVTX0xPTkdfTkFNRVMgPSAiVmFyaWFibGUgTG9uZyBOYW1lcyI7CisJIAorCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRF9OQU1FUyA9ICJDRiBTdGFuZGFyZCBOYW1lcyI7CisJIAorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbnMuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvUHJvY2Vzc2luZ0luc3RydWN0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWQ1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbnMuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogQ2xhc3MgdGhhdCBob2xkcyBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBnZW5lcmF0aW5nIGFuIE9wZW5kYXAgcHJvZmlsZS4KKyAqIEluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGFzIChuYW1lLCB2YWx1ZXMpIHBhaXJzOiBlYWNoIG5hbWVkIGluc3RydWN0aW9uIGNhbiBoYXZlIG11bHRpcGxlIHZhbHVlcy4KKyAqIEFuIGluc3RydWN0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIGluIHRoZSBPcGVuZGFwIFhNTCBjb25maWd1cmF0aW9uIGZpbGUgYXMgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMsCisgKiBvciBhcyBtdWx0aXBsZSBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgKGFuZCBvbmUgb3IgbW9yZSB2YWx1ZXMgZWFjaCkuCisgKiAKKyAqIEBhdXRob3IgTHVjYSBDaW5xdWluaQorICoKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbnMgeworCQorCS8qKgorCSAqIExvY2FsIHN0b3JhZ2UgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLgorCSAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIFhNTCBlbGVtZW50cyBpcyBub3QgcHJlc2VydmVkIChvbiBwdXJwb3NlKS4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBpbnN0cnVjdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOworCQorCS8qKgorCSAqIFJldHVybnMgYWxsIHZhbHVlcyBmb3IgYSBuYW1lZCBpbnN0cnVjdGlvbiwKKwkgKiBvciBhbiBlbXB0eSBzZXQgaWYgdGhlIGluc3RydWN0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldEluc3RydWN0aW9uVmFsdWVzKFN0cmluZyBrZXkpIHsKKwkJaWYgKGluc3RydWN0aW9ucy5jb250YWluc0tleShrZXkpKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBpbnN0cnVjdGlvbnMuZ2V0KGtleSkgKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIG5ldyBIYXNoU2V0PFN0cmluZz4oKSApOworCQl9CisJfQorCQorCS8qKgorCSAqIElmIGFuIGluc3RydWN0aW9uIGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlLCBpdCBpcyByZXR1cm5lZC4KKwkgKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIHZhbHVlcyBvciBtdWx0aXBsZSB2YWx1ZXMsIHJldHVybnMgbnVsbCBpbnN0ZWFkLgorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRJbnN0cnVjdGlvblZhbHVlKFN0cmluZyBrZXkpIHsKKwkJaWYgKGluc3RydWN0aW9ucy5nZXQoa2V5KSE9bnVsbCAmJiAgaW5zdHJ1Y3Rpb25zLmdldChrZXkpLnNpemUoKT09MSkgeworCQkJZm9yIChTdHJpbmcgdmFsdWUgOiBpbnN0cnVjdGlvbnMuZ2V0KGtleSkpIHsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYWxsIGluc3RydWN0aW9ucy4KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBnZXRJbnN0cnVjdGlvbnMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoaW5zdHJ1Y3Rpb25zKTsKKwl9CisJCisJLyoqCisJICogTWV0aG9kIHRvIGFkZCBhIHZhbHVlIHRvIGEgbmFtZWQgaW5zdHJ1Y3Rpb24uCisJICogVmFsdWUgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzLgorCSAqIExlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBmb3IgZWFjaCB2YWx1ZSBhcmUgcmVtb3ZlZC4KKwkgKiBAcGFyYW0ga2V5CisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgYWRkSW5zdHJ1Y3Rpb24oU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmIChTdHJpbmdVdGlscy5oYXNUZXh0KGtleSkpIHsKKwkJCWlmICghaW5zdHJ1Y3Rpb25zLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCQlpbnN0cnVjdGlvbnMucHV0KGtleSwgbmV3IEhhc2hTZXQ8U3RyaW5nPigpKTsKKwkJCX0KKwkJCVN0cmluZ1tdIHZhbHMgPSB2YWx1ZS5zcGxpdCgiLCIpOworCQkJZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworCQkJCWlmIChTdHJpbmdVdGlscy5oYXNUZXh0KHZhbCkpIHsKKwkJCQkJaW5zdHJ1Y3Rpb25zLmdldChrZXkpLmFkZCh2YWwudHJpbSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL1Jld3JpdGVTcGVjLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvY29uZmlnL1Jld3JpdGVTcGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4YTBmZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9jb25maWcvUmV3cml0ZVNwZWMuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWc7CisKKy8qKgorICogCisgKiBBIHNwZWNpZmljYXRpb24gZm9yIHJld3JpdGluZyBPUGVOREFQIGVsZW1lbnQgbmFtZXMgYW5kIHRhZ3MgZnJvbSB0aGVpcgorICogb3JpZ2luYWwgT1BlTkRBUC9USFJFRERTIG5hbWVzIGludG8gT09EVCBwcm9maWxlIGVsZW1lbnRzLCBhbmQgdGhlaXIgbmFtZXMKKyAqIGFuZCB0eXBlcy4gUGFydCBvZiB0aGUge0BsaW5rIE9wZW5kYXBDb25maWd9LgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSZXdyaXRlU3BlYyB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgb3JpZ05hbWU7CisKKyAgcHJpdmF0ZSBTdHJpbmcgcmVuYW1lOworCisgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnRUeXBlOworCisgIHB1YmxpYyBSZXdyaXRlU3BlYygpIHsKKyAgICB0aGlzLm9yaWdOYW1lID0gbnVsbDsKKyAgICB0aGlzLnJlbmFtZSA9IG51bGw7CisgICAgdGhpcy5lbGVtZW50VHlwZSA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgb3JpZ05hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ05hbWUoKSB7CisgICAgcmV0dXJuIG9yaWdOYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBvcmlnTmFtZQorICAgKiAgICAgICAgICB0aGUgb3JpZ05hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRPcmlnTmFtZShTdHJpbmcgb3JpZ05hbWUpIHsKKyAgICB0aGlzLm9yaWdOYW1lID0gb3JpZ05hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcmVuYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFJlbmFtZSgpIHsKKyAgICByZXR1cm4gcmVuYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSByZW5hbWUKKyAgICogICAgICAgICAgdGhlIHJlbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFJlbmFtZShTdHJpbmcgcmVuYW1lKSB7CisgICAgdGhpcy5yZW5hbWUgPSByZW5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZWxlbWVudFR5cGUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGUoKSB7CisgICAgcmV0dXJuIGVsZW1lbnRUeXBlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBlbGVtZW50VHlwZQorICAgKiAgICAgICAgICB0aGUgZWxlbWVudFR5cGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZShTdHJpbmcgZWxlbWVudFR5cGUpIHsKKyAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2V4dHJhY3RvcnMvRGFzTWV0YWRhdGFFeHRyYWN0b3IuamF2YSBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9leHRyYWN0b3JzL0Rhc01ldGFkYXRhRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1YjE1ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9leHRyYWN0b3JzL0Rhc01ldGFkYXRhRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmV4dHJhY3RvcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisKKy8vT1BFTkRBUCBpbXBvcnRzCitpbXBvcnQgb3BlbmRhcC5kYXAuQXR0cmlidXRlOworaW1wb3J0IG9wZW5kYXAuZGFwLkF0dHJpYnV0ZVRhYmxlOworaW1wb3J0IG9wZW5kYXAuZGFwLkRBUzsKK2ltcG9ydCBvcGVuZGFwLmRhcC5EQ29ubmVjdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZ01ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcFByb2ZpbGVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLlByb2Nlc3NpbmdJbnN0cnVjdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy51dGlsLlByb2ZpbGVVdGlsczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1ldGFkYXRhRXh0cmFjdG9yfSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gYW4KKyAqIE9wZW5EQVAgREFTIHNvdXJjZS4gQ3VycmVudGx5IHRoaXMgY2xhc3Mgb25seSBleHRyYWN0cyBtZXRhZGF0YSBmcm9tIHRoZQorICogTmV0Q0RGIGdsb2JhbCBhdHRyaWJ1dGVzIG9mIHR5cGUgU3RyaW5nLCBkaXNyZWdhcmRpbmcgYWxsIG90aGVycy4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKiAKKyAqLworcHVibGljIGNsYXNzIERhc01ldGFkYXRhRXh0cmFjdG9yIGltcGxlbWVudHMgTWV0YWRhdGFFeHRyYWN0b3IgeworCisgIC8vIGNvbnN0YW50cyBmcm9tIE5ldENERiBtZXRhZGF0YSBjb252ZW50aW9uCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5DX0dMT0JBTCA9ICJOQ19HTE9CQUwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX05BTUUgPSAibG9uZ19uYW1lIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfTkFNRSA9ICJzdGFuZGFyZF9uYW1lIjsKKworICAvLyBOZXRDREYgZGF0YSB0eXBlcworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlQzMl9UWVBFID0gNjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UNjRfVFlQRSA9IDc7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUMzJfVFlQRSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUNjRfVFlQRSA9IDk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19UWVBFID0gMTA7CisgIAorICAvLyBvdXRwdXQgZm9ybWF0IGZvciBhbGwgZ2xvYmFsIGF0dHJpYnV0ZXMgaW50ZXJwcmV0ZWQgYXMgZGF0ZXMKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9VVFBVVF9EQVRFVElNRV9GT1JNQVQgPSAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzJ1onIjsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRGF0ZUZvcm1hdCBvdXRwdXREYXRldGltZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KE9VVFBVVF9EQVRFVElNRV9GT1JNQVQpOworCisgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERhc01ldGFkYXRhRXh0cmFjdG9yLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICAvKioKKyAgICogVGhlIERBUyBzdHJlYW0gd2hpY2ggaXMgdGhlIG1ldGFkYXRhIHNvdXJjZS4KKyAgICovCisgIHByaXZhdGUgZmluYWwgRENvbm5lY3QgZENvbm47CisKKyAgcHVibGljIERhc01ldGFkYXRhRXh0cmFjdG9yKERDb25uZWN0IGRDb25uKSB7CisgICAgdGhpcy5kQ29ubiA9IGRDb25uOworICB9CisKKyAgLyoqCisJICogVGhlIG1haW4gbWV0YWRhdGEgZXh0cmFjdGlvbiBtZXRob2QuCisJICogCisJICogQHBhcmFtIG1ldGFkYXRhCisJICogICAgICAgICAgOiB0aGUgbWV0YWRhdGEgdGFyZ2V0LCBzcGVjaWZpY2FsbHkgdGhlIENBUyBtZXRhZGF0YSBjb250YWluZXIuCisJICovCisJcHVibGljIHZvaWQgZXh0cmFjdChNZXRhZGF0YSBtZXRhZGF0YSwgT3BlbmRhcENvbmZpZyBjb25maWcpIHsKKwkKKwkgIExPRy5sb2coTGV2ZWwuSU5GTywgIlBhcnNpbmcgREFTIG1ldGFkYXRhIGZyb206ICIgKyBkQ29ubi5VUkwoKSk7CisJICAKKwkgIC8vIGxpc3Qgb2YgZXhjbHVkZWQgdmFyaWFibGVzCisJICBTZXQ8U3RyaW5nPiBleGNsdWRlZFZhcmlhYmxlcyAKKwkgIAk9IGNvbmZpZy5nZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zKCkuZ2V0SW5zdHJ1Y3Rpb25WYWx1ZXMoT3BlbmRhcENvbmZpZ01ldEtleXMuRVhDTFVERV9WQVJJQUJMRVNfQVRUUik7CisJCisJICB0cnkgeworCSAgICBEQVMgZGFzID0gZENvbm4uZ2V0REFTKCk7CisJICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCSAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IG5hbWVzID0gZGFzLmdldE5hbWVzKCk7CisJICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICAgIFN0cmluZyBhdHROYW1lID0gbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJFeHRyYWN0aW5nIERBUyBhdHRyaWJ1dGU6ICIgKyBhdHROYW1lKTsKKwkgICAgICBBdHRyaWJ1dGVUYWJsZSBhdCA9IGRhcy5nZXRBdHRyaWJ1dGVUYWJsZShhdHROYW1lKTsKKwkgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBhdC5nZXROYW1lcygpOworCSAgICAgIAorCSAgICAgIC8vIE5ldENERiBnbG9iYWwgYXR0cmlidXRlcworCSAgICAgIC8vIHN0b3JlIGF0dHJpYnV0ZSBuYW1lLCBhbGwgdmFsdWVzIGZvciBBTEwgYXR0cmlidXRlcyAoc3RyaW5ncyBhbmQgbnVtZXJpY3MpCisJICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9ucyBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zID0gY29uZmlnLmdldFByb2Nlc3NpbmdJbnN0cnVjdGlvbnMoKTsKKwkgICAgICBpZiAoYXR0TmFtZS5lcXVhbHMoTkNfR0xPQkFMKSkgeworCSAgICAgIAl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICAgIAkJU3RyaW5nIGtleSA9IGUubmV4dEVsZW1lbnQoKTsKKwkgICAgICAJCUF0dHJpYnV0ZSBhdHQgPSBhdC5nZXRBdHRyaWJ1dGUoa2V5KTsKKwkgICAgICAJCS8vIGNvbnZlcnQgYWxsIERBUyBhdHRyaWJ1dGUgbmFtZXMgdG8gbG93ZXIgY2FzZQorCSAgICAgIAkJU3RyaW5nIGxrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTsKKwkgICAgICAJCQorCSAgICAgIAkJLy8gbG9vayBmb3IgZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lIGluIGRhdGUvdGltZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24KKwkgICAgICAJCVN0cmluZyBkYXRlVGltZUZvcm1hdEtleSA9IE9wZW5kYXBDb25maWdNZXRLZXlzLkRBVEVUSU1FX0ZPUk1BVF9BVFRSICsgIjoiICsgbGtleTsKKwkgICAgICAJCVN0cmluZyBkYXRlVGltZUZvcm1hdFZhbHVlID0gcHJvY2Vzc2luZ0luc3RydWN0aW9ucy5nZXRJbnN0cnVjdGlvblZhbHVlKGRhdGVUaW1lRm9ybWF0S2V5KTsKKwkgICAgICAJCS8vIGFkZCB0aGlzIGF0dHJpYnV0ZSBhcyBwcm9wZXJseSBmb3JtYXR0ZWQgZGF0ZS90aW1lCisJICAgICAgCQlpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChkYXRlVGltZUZvcm1hdFZhbHVlKSkgeworCSAgICAgIAkJCURhdGVGb3JtYXQgaW5Gb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlVGltZUZvcm1hdFZhbHVlKTsKKwkgICAgICAJCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGVkdCA9IGF0dC5nZXRWYWx1ZXMoKTsKKwkgICAgICAJCQl3aGlsZSAoZWR0Lmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgICAgCQkJCVN0cmluZyB2YWx1ZSA9IGVkdC5uZXh0RWxlbWVudCgpOworCSAgICAgIAkJCQl0cnkgeworICAJICAgICAgCQkJCURhdGUgZGF0ZSA9IGluRm9ybWF0LnBhcnNlKHZhbHVlKTsKKyAgCSAgICAgIAkJCQlQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldGFkYXRhLCBsa2V5LCBvdXRwdXREYXRldGltZUZvcm1hdC5mb3JtYXQoZGF0ZSkpOworCSAgICAgIAkJCQl9IGNhdGNoKFBhcnNlRXhjZXB0aW9uIHBlKSB7CisJICAgICAgCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsIAorCSAgICAgIAkJCQkJCQkgICAgIkVycm9yIHBhcnNpbmcgZGF0ZS90aW1lIGZyb20gREFTIGF0dHJpYnV0ZTogIitrZXkrIiB2YWx1ZT0iK3ZhbHVlKyIgZXJyb3I9IitwZS5nZXRNZXNzYWdlKCkpOworCSAgICAgIAkJCQl9CisJICAgICAgCQkJfQorCSAgICAgIAkJLy8gYWRkIHRoaXMgZ2xvYmFsIGF0dHJpYnV0ZSBhcyBzdHJpbmcKKwkgICAgICAJCX0gZWxzZSB7CisJICAgICAgCQkJUHJvZmlsZVV0aWxzLmFkZElmTm90RXhpc3RpbmcobWV0YWRhdGEsIGxrZXksIGF0dC5nZXRWYWx1ZXMoKSk7CisJICAgICAgCQl9CisJICAgICAgCX0KKwkgICAgICAgIAorCSAgICAgIC8vIE5ldENERiBjb29yZGluYXRlcworCSAgICAgIH0gZWxzZSB7CisJICAgICAgCQorCSAgICAgIAlpZiAoICAgYXR0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJsYXQiKSB8fCBhdHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImxhdGl0dWRlIikKKwkgICAgICAJCQl8fCBhdHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImxvbiIpIHx8IGF0dE5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibG9uZ2l0dWRlIikKKwkgICAgICAJCQl8fCBhdHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRpbWUiKQorCSAgICAgIAkJCXx8IGF0dE5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWx0IikgfHwgYXR0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbHRpdHVkZSIpCisJICAgICAgCQkJfHwgYXR0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJsZXYiKSB8fCBhdHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImxldmVsIikKKwkgICAgICAJCQl8fCBhdHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRlcHRoIikKKwkgICAgICAJCQkpIHsKKwkgICAgICAJCQorCSAgICAgIAkJaWYgKCFleGNsdWRlZFZhcmlhYmxlcy5jb250YWlucyhhdHROYW1lKSkgeworCSAgICAgIAkJCS8vIHN0b3JlIGNvb3JkaW5hdGUgbmFtZQorCSAgICAgIAkJCVByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0YWRhdGEsIE9wZW5kYXBQcm9maWxlTWV0S2V5cy5DT09SRElOQVRFUywgYXR0TmFtZSk7CisJICAgICAgCQl9CisJICAgICAgICAJCisJICAgICAgCX0gZWxzZSBpZiAoYXR0TmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInRpbWVfIikgfHwgYXR0TmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCJfdGltZSIpKSB7CisJICAgICAgCQkKKwkgICAgICAJCS8vIGlnbm9yZSBmb3Igbm93IC0gaXQncyBub3QgYSBjb29yZGluYXRlIG5laXRoZXIgYSB2YXJpYWJsZSB5b3Ugd291bGQgd2FudCB0byBzZWFyY2ggb24KKwkgICAgICAJCQorCSAgICAgICAgLy8gTmV0Q0RGIHZhcmlhYmxlcworCSAgICAgIAl9IGVsc2UgeworCSAgICAgIAkJCisJICAgICAgCQlpZiAoIWV4Y2x1ZGVkVmFyaWFibGVzLmNvbnRhaW5zKGF0dE5hbWUpKSB7CisJICAgICAgICAgIAkvLyBzdG9yZSB2YXJpYWJsZSBuYW1lCisJICAgICAgICAgIAlQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldGFkYXRhLCBPcGVuZGFwUHJvZmlsZU1ldEtleXMuVkFSSUFCTEVTLCBhdHROYW1lKTsKKwkgICAgICAgICAgCS8vIHN0b3JlICJzdGFuZGFyZF9uYW1lIiwgImxvbmdfbmFtZSIKKwkgICAgICAgICAgCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgICAgICAgIAkJU3RyaW5nIGtleSA9IGUubmV4dEVsZW1lbnQoKTsKKwkgICAgICAgICAgCQlBdHRyaWJ1dGUgYXR0ID0gYXQuZ2V0QXR0cmlidXRlKGtleSk7CisJICAgICAgICAgIAkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNUQU5EQVJEX05BTUUpKSB7CisJICAgICAgICAgIAkJCVByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0YWRhdGEsIE9wZW5kYXBQcm9maWxlTWV0S2V5cy5DRl9TVEFOREFSRF9OQU1FUywgYXR0LmdldFZhbHVlQXQoMCkpOworCSAgICAgICAgICAJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoTE9OR19OQU1FKSkgeworCSAgICAgICAgICAJCQlQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldGFkYXRhLCBPcGVuZGFwUHJvZmlsZU1ldEtleXMuVkFSSUFCTEVTX0xPTkdfTkFNRVMsIGF0dC5nZXRWYWx1ZUF0KDApKTsKKwkgICAgICAgICAgCQl9ICAgICAgIAkJCisJICAgICAgICAgIAl9CQorCSAgICAgIAkJfQorCSAgICAgICAgCQorCSAgICAgIAl9CisJICAgICAgfQorCQorCSAgICB9CisJICAgIAorCSAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgcGFyc2luZyBEQVMgbWV0YWRhdGE6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJICB9CisJCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvZXh0cmFjdG9ycy9NZXRhZGF0YUV4dHJhY3Rvci5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2V4dHJhY3RvcnMvTWV0YWRhdGFFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y5ODA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2V4dHJhY3RvcnMvTWV0YWRhdGFFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5leHRyYWN0b3JzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZzsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGV4dHJhY3RpbmcgbWV0YWRhdGEgZnJvbSBhIGdlbmVyaWMgd2ViIGFjY2Vzc2libGUgcmVzb3VyY2UgaW50bworICogYSBDQVMgbWV0YWRhdGEgY29udGFpbmVyLiBFYWNoIGltcGxlbWVudGF0aW9uIGNsYXNzIG11c3QgYmUgcmVzcG9uc2libGUgZm9yCisgKiBpbnN0YW50aWF0aW5nIGFuZCBhY2Nlc3NpbmcgdGhlIHNwZWNpZmljIG1ldGFkYXRhIHNvdXJjZSBhcyBhcHByb3ByaWF0ZS4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBNZXRhZGF0YUV4dHJhY3RvciB7CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byAoZnVydGhlcikgcG9wdWxhdGUgdGhlIG1ldGFkYXRhIGNvbnRhaW5lci4gCisgICAqIEFueSBleHRyYWN0ZWQgbWV0YWRhdGEgaXMgYWRkZWQgdG8gdGhlIGN1cnJlbnQgbWV0YWRhdGEgY29udGVudC4KKyAgICogCisgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgKiBAcGFyYW0gY29uZmlnCisgICAqLworICB2b2lkIGV4dHJhY3QoTWV0YWRhdGEgbWV0YWRhdGEsIE9wZW5kYXBDb25maWcgY29uZmlnKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2V4dHJhY3RvcnMvTmNtbE1ldGFkYXRhRXh0cmFjdG9yLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvZXh0cmFjdG9ycy9OY21sTWV0YWRhdGFFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQwMzMwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2V4dHJhY3RvcnMvTmNtbE1ldGFkYXRhRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuZXh0cmFjdG9yczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWc7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1ldGFkYXRhRXh0cmFjdG9yfSB0aGF0IHBhcnNlcyBhbiBOY01MIFhNTCBkb2N1bWVudC4KKyAqIEN1cnJlbnRseSB0aGlzIGNsYXNzIGlzIHNpbXBseSBhIHN0dWIgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nLgorICogCisgKiBAYXV0aG9yIEx1Y2EgQ2lucXVpbmkKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTmNtbE1ldGFkYXRhRXh0cmFjdG9yIGltcGxlbWVudHMgTWV0YWRhdGFFeHRyYWN0b3IgeworCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5jbWxVcmw7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTmNtbE1ldGFkYXRhRXh0cmFjdG9yLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgTmNtbE1ldGFkYXRhRXh0cmFjdG9yKFN0cmluZyBuY21sVXJsKSB7CisgICAgdGhpcy5uY21sVXJsID0gbmNtbFVybDsKKyAgfQorCisgIC8qKgorICAgKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBtZXRob2QuCisgICAqLworICBwdWJsaWMgdm9pZCBleHRyYWN0KE1ldGFkYXRhIG1ldGFkYXRhLCBPcGVuZGFwQ29uZmlnIGNvbmZpZykgeworCisgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiUGFyc2luZyBOY01MIG1ldGFkYXRhIGZyb206ICIgKyBuY21sVXJsKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9leHRyYWN0b3JzL1RocmVkZHNNZXRhZGF0YUV4dHJhY3Rvci5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL2V4dHJhY3RvcnMvVGhyZWRkc01ldGFkYXRhRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjYmE5NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy9leHRyYWN0b3JzL1RocmVkZHNNZXRhZGF0YUV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5leHRyYWN0b3JzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMudXRpbC5Qcm9maWxlVXRpbHM7CisKKworLy9TcHJpbmcgaW1wb3J0cworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5TdHJpbmdVdGlsczsKKworLy9USFJFRERTIGltcG9ydHMKK2ltcG9ydCB0aHJlZGRzLmNhdGFsb2cuSW52QWNjZXNzOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5JbnZEYXRhc2V0OworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5JbnZEb2N1bWVudGF0aW9uOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5JbnZQcm9wZXJ0eTsKK2ltcG9ydCB0aHJlZGRzLmNhdGFsb2cuU2VydmljZVR5cGU7CitpbXBvcnQgdGhyZWRkcy5jYXRhbG9nLlRocmVkZHNNZXRhZGF0YS5Db250cmlidXRvcjsKK2ltcG9ydCB0aHJlZGRzLmNhdGFsb2cuVGhyZWRkc01ldGFkYXRhLkdlb3NwYXRpYWxDb3ZlcmFnZTsKK2ltcG9ydCB0aHJlZGRzLmNhdGFsb2cuVGhyZWRkc01ldGFkYXRhLlJhbmdlOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5UaHJlZGRzTWV0YWRhdGEuU291cmNlOworaW1wb3J0IHRocmVkZHMuY2F0YWxvZy5UaHJlZGRzTWV0YWRhdGEuVm9jYWI7CitpbXBvcnQgdWNhci5uYzIudW5pdHMuRGF0ZVR5cGU7CitpbXBvcnQgdWNhci51bmlkYXRhLmdlb2xvYy5MYXRMb25SZWN0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNZXRhZGF0YUV4dHJhY3Rvcn0gdGhhdCBleHRyYWN0cyBtZXRhZGF0YSBmcm9tIGEKKyAqIFRocmVkZHMgZGF0YXNldC4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRocmVkZHNNZXRhZGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFkYXRhRXh0cmFjdG9yIHsKKworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihUaHJlZGRzTWV0YWRhdGFFeHRyYWN0b3IuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8vIGNvbnN0YW50IG1pc3NpbmcgZm9yIDQuMiB2ZXJzaW9uIG9mIE5ldENERiBsaWJyYXJ5CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfVFlQRV9OQ01MID0gIk5DTUwiOworICAKKyAgLyoqCisgICAqIFRoZSBzb3VyY2Ugb2YgbWV0YWRhdGEgdG8gYmUgZXh0cmFjdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBJbnZEYXRhc2V0IGRhdGFzZXQ7CisKKyAgcHVibGljIFRocmVkZHNNZXRhZGF0YUV4dHJhY3RvcihmaW5hbCBJbnZEYXRhc2V0IGRhdGFzZXQpIHsKKyAgICB0aGlzLmRhdGFzZXQgPSBkYXRhc2V0OworICB9CisKKyAgcHVibGljIHZvaWQgZXh0cmFjdChNZXRhZGF0YSBtZXQsIE9wZW5kYXBDb25maWcgY29uZmlnKSB7CisKKyAgICBMT0cubG9nKExldmVsLklORk8sICJDcmF3bGluZyBjYXRhbG9nIFVSTD0iICsgZGF0YXNldC5nZXRDYXRhbG9nVXJsKCkKKyAgICAgICAgKyAiIGRhdGFzZXQgSUQ9IiArIGRhdGFzZXQuZ2V0SUQoKSk7CisKKyAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkF1dGhvcml0eSIsIGRhdGFzZXQuZ2V0QXV0aG9yaXR5KCkpOworICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiQ2F0YWxvZ1VybCIsIGRhdGFzZXQuZ2V0Q2F0YWxvZ1VybCgpKTsKKyAgICB0cnkgeworICAgIAlQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkhvc3QiLCAobmV3IFVSTChkYXRhc2V0LmdldENhdGFsb2dVcmwoKSkpLmdldEhvc3QoKSApOworICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiRGF0YXNldEZ1bGxOYW1lIiwgZGF0YXNldC5nZXRGdWxsTmFtZSgpKTsKKyAgICBpZiAoZGF0YXNldC5nZXRDb250cmlidXRvcnMoKSAhPSBudWxsKSB7CisgICAgICBmb3IgKENvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yIDogZGF0YXNldC5nZXRDb250cmlidXRvcnMoKSkgeworICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkNvbnRyaWJ1dG9yIiwgY29udHJpYnV0b3IuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGF0YXNldC5nZXRDcmVhdG9ycygpICE9IG51bGwpIHsKKyAgICAgIGZvciAoU291cmNlIHNvdXJjZSA6IGRhdGFzZXQuZ2V0Q3JlYXRvcnMoKSkgeworICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkNyZWF0b3IiLCBzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGF0YXNldC5nZXREYXRhRm9ybWF0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiRGF0YUZvcm1hdFR5cGUiLCBkYXRhc2V0CisgICAgICAgICAgLmdldERhdGFGb3JtYXRUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKGRhdGFzZXQuZ2V0RGF0YVR5cGUoKSAhPSBudWxsKSB7CisgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkRhdGFUeXBlIiwgZGF0YXNldC5nZXREYXRhVHlwZSgpCisgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGlmIChkYXRhc2V0LmdldERhdGVzKCkgIT0gbnVsbCkgeworICAgICAgZm9yIChEYXRlVHlwZSBkYXRlVHlwZSA6IGRhdGFzZXQuZ2V0RGF0ZXMoKSkgeworICAgICAgICBTdHJpbmcgZGF0ZVN0cmluZyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZGF0ZVN0cmluZyA9IFByb2ZpbGVVdGlscy50b0lTTzg2MDEoZGF0ZVR5cGUuZ2V0RGF0ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICJFcnJvciBjb252ZXJ0aW5nIGRhdGU6IFsiICsgZGF0ZVR5cGUuZ2V0RGF0ZSgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiRGF0ZXMiLCBkYXRlU3RyaW5nKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGF0YXNldC5nZXREb2N1bWVudGF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgZm9yIChJbnZEb2N1bWVudGF0aW9uIGRvYyA6IGRhdGFzZXQuZ2V0RG9jdW1lbnRhdGlvbigpKSB7CisgICAgICAJLy8gdGV4dHVhbCBkb2N1bWVudGF0aW9uCisgICAgICAJaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQoZG9jLmdldElubGluZUNvbnRlbnQoKSkpIHsKKyAgICAgIAkJaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQoZG9jLmdldFR5cGUoKSkpIHsKKyAgICAgIAkJCS8vIHVzZSBzcGVjaWZpYyBkb2N1bWVudGF0aW9uIHR5cGUsIHdoZW4gYXZhaWxhYmxlCisgICAgICAJCQlQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgZG9jLmdldFR5cGUoKSwgZG9jLmdldElubGluZUNvbnRlbnQoKSk7CisgICAgICAJCX0gZWxzZSB7CisgICAgICAJCQkvLyBvdGhlcndpc2UgdXNlIGdlbmVyaWMgIkRvY3VtZW50YXRpb24iIHRhZworICAgICAgCQkJUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJEb2N1bWVudGF0aW9uIiwgZG9jLmdldElubGluZUNvbnRlbnQoKSk7CisgICAgICAJCX0KKyAgICAgIAl9CisgICAgICAJLy8gaHlwZXJsaW5rZWQgZG9jdW1lbnRhdGlvbgorICAgICAgCWlmIChTdHJpbmdVdGlscy5oYXNUZXh0KGRvYy5nZXRYbGlua0hyZWYoKSkpIHsKKyAgICAgIAkJU3RyaW5nIHR1cGxlID0gdGhpcy5lbmNvZGVYbGlua1R1cGxlKGRvYy5nZXRYbGlua0hyZWYoKSwgZG9jLmdldFhsaW5rVGl0bGUoKSwgZG9jLmdldFR5cGUoKSk7CisgICAgICAJCVByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiWGxpbmsiLCB0dXBsZSk7CisgICAgICAJfQorICAgICAgCQorICAgICAgfQorICAgIH0KKworICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiRnVsbE5hbWUiLCBkYXRhc2V0LmdldEZ1bGxOYW1lKCkpOworICAgIEdlb3NwYXRpYWxDb3ZlcmFnZSBnZW9Db3ZlcmFnZSA9IGRhdGFzZXQuZ2V0R2Vvc3BhdGlhbENvdmVyYWdlKCk7CisgICAgCisgICAgaWYgKGdlb0NvdmVyYWdlICE9IG51bGwpIHsKKyAgICAJCisgICAgICBMYXRMb25SZWN0IGJib3ggPSBnZW9Db3ZlcmFnZS5nZXRCb3VuZGluZ0JveCgpOworICAgICAgaWYgKGJib3ggIT0gbnVsbCkgeworICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIlNvdXRod2VzdEJDIiwgYmJveC5nZXRMb3dlckxlZnRQb2ludCgpCisgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiTm9ydGh3ZXN0QkMiLCBiYm94LmdldFVwcGVyTGVmdFBvaW50KCkKKyAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJOb3J0aGVhc3RCQyIsIGJib3guZ2V0VXBwZXJSaWdodFBvaW50KCkKKyAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJTb3V0aGVhc3RCQyIsIGJib3guZ2V0TG93ZXJSaWdodFBvaW50KCkKKyAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gdHJ5IG5vcnRoIHNvdXRoLCBlYXN0IHdlc3QKKyAgICAgIGlmIChnZW9Db3ZlcmFnZS5nZXROb3J0aFNvdXRoUmFuZ2UoKSAhPSBudWxsKSB7ICAgICAgICAJCisgICAgICAgIFJhbmdlIG5zUmFuZ2UgPSBnZW9Db3ZlcmFnZS5nZXROb3J0aFNvdXRoUmFuZ2UoKTsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJOb3J0aFNvdXRoUmFuZ2VTdGFydCIsCisgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihuc1JhbmdlLmdldFN0YXJ0KCkpKTsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJOb3J0aFNvdXRoUmFuZ2VSZXNvbHV0aW9uIiwKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG5zUmFuZ2UuZ2V0UmVzb2x1dGlvbigpKSk7CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiTm9ydGhTb3V0aFJhbmdlU2l6ZSIsCisgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihuc1JhbmdlLmdldFNpemUoKSkpOworICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIk5vcnRoU291dGhSYW5nZVVuaXRzIiwKKyAgICAgICAgICAgIG5zUmFuZ2UuZ2V0VW5pdHMoKSk7CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiTm9ydGhTb3V0aFJhbmdlU3RvcCIsCisgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihuc1JhbmdlLmdldFN0YXJ0KCkrbnNSYW5nZS5nZXRTaXplKCkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdlb0NvdmVyYWdlLmdldEVhc3RXZXN0UmFuZ2UoKSAhPSBudWxsKSB7CisgICAgICAgIFJhbmdlIG5zUmFuZ2UgPSBnZW9Db3ZlcmFnZS5nZXRFYXN0V2VzdFJhbmdlKCk7CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiRWFzdFdlc3RSYW5nZVN0YXJ0IiwKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG5zUmFuZ2UuZ2V0U3RhcnQoKSkpOworICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkVhc3RXZXN0UmFuZ2VSZXNvbHV0aW9uIiwKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG5zUmFuZ2UuZ2V0UmVzb2x1dGlvbigpKSk7CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiRWFzdFdlc3RSYW5nZVNpemUiLAorICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YobnNSYW5nZS5nZXRTaXplKCkpKTsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJFYXN0V2VzdFJhbmdlVW5pdHMiLAorICAgICAgICAgICAgbnNSYW5nZS5nZXRVbml0cygpKTsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJFYXN0V2VzdFJhbmdlU3RvcCIsCisgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihuc1JhbmdlLmdldFN0YXJ0KCkrbnNSYW5nZS5nZXRTaXplKCkpKTsKKyAgICAgIH0gICAgICAKKworICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJHZW9zcGF0aWFsQ292ZXJhZ2VMYXRpdHVkZVJlc29sdXRpb24iLAorICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGRhdGFzZXQuZ2V0R2Vvc3BhdGlhbENvdmVyYWdlKCkuZ2V0TGF0UmVzb2x1dGlvbigpKSk7CisgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkdlb3NwYXRpYWxDb3ZlcmFnZUxvbmdpdHVkZVJlc29sdXRpb24iLAorICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGRhdGFzZXQuZ2V0R2Vvc3BhdGlhbENvdmVyYWdlKCkuZ2V0TG9uUmVzb2x1dGlvbigpKSk7CisgICAgICAKKyAgICAgIC8vIGFkZCBnZW8tc3BhdGlhbCBjb3ZlcmFnZSBhbHRlcm5hdGl2ZSBmb3JtCisgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkdlb3NwYXRpYWxDb3ZlcmFnZUxhdFNvdXRoIiwgU3RyaW5nLnZhbHVlT2YoZGF0YXNldC5nZXRHZW9zcGF0aWFsQ292ZXJhZ2UoKS5nZXRMYXRTb3V0aCgpKSk7CisgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkdlb3NwYXRpYWxDb3ZlcmFnZUxhdE5vcnRoIiwgU3RyaW5nLnZhbHVlT2YoZGF0YXNldC5nZXRHZW9zcGF0aWFsQ292ZXJhZ2UoKS5nZXRMYXROb3J0aCgpKSk7ICAgCisgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkdlb3NwYXRpYWxDb3ZlcmFnZUxvbldlc3QiLCBTdHJpbmcudmFsdWVPZihkYXRhc2V0LmdldEdlb3NwYXRpYWxDb3ZlcmFnZSgpLmdldExvbldlc3QoKSkpOworICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJHZW9zcGF0aWFsQ292ZXJhZ2VMb25FYXN0IiwgU3RyaW5nLnZhbHVlT2YoZGF0YXNldC5nZXRHZW9zcGF0aWFsQ292ZXJhZ2UoKS5nZXRMb25FYXN0KCkpKTsKKyAgICAgIAorICAgICAgaWYgKGRhdGFzZXQuZ2V0R2Vvc3BhdGlhbENvdmVyYWdlKCkuZ2V0TmFtZXMoKSAhPSBudWxsKSB7CisgICAgICAgIGZvciAoVm9jYWIgZ05hbWUgOiBkYXRhc2V0LmdldEdlb3NwYXRpYWxDb3ZlcmFnZSgpLmdldE5hbWVzKCkpIHsKKyAgICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIkdlb3NwYXRpYWxDb3ZlcmFnZSIsIGdOYW1lLmdldFRleHQoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKworICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiSGlzdG9yeSIsIGRhdGFzZXQuZ2V0SGlzdG9yeSgpKTsKKyAgICBpZiAoZGF0YXNldC5nZXRLZXl3b3JkcygpICE9IG51bGwpIHsKKyAgICAgIGZvciAoVm9jYWIgdm9jYWIgOiBkYXRhc2V0LmdldEtleXdvcmRzKCkpIHsKKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJLZXl3b3JkcyIsIHZvY2FiLmdldFRleHQoKSk7CisgICAgICB9CisgICAgfQorICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiTmFtZSIsIGRhdGFzZXQuZ2V0TmFtZSgpKTsKKyAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIlByb2Nlc3NpbmciLCBkYXRhc2V0LmdldFByb2Nlc3NpbmcoKSk7CisgICAgaWYgKGRhdGFzZXQuZ2V0UHJvamVjdHMoKSAhPSBudWxsKSB7CisgICAgICBmb3IgKFZvY2FiIHZvY2FiIDogZGF0YXNldC5nZXRQcm9qZWN0cygpKSB7CisgICAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiUHJvamVjdHMiLCB2b2NhYi5nZXRUZXh0KCkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkYXRhc2V0LmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7CisgICAgICBmb3IgKEludlByb3BlcnR5IHByb3AgOiBkYXRhc2V0LmdldFByb3BlcnRpZXMoKSkgeworICAgICAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgcHJvcC5nZXROYW1lKCksIHByb3AuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGRhdGFzZXQuZ2V0UHVibGlzaGVycygpICE9IG51bGwpIHsKKyAgICAgIGZvciAoU291cmNlIHNvdXJjZSA6IGRhdGFzZXQuZ2V0UHVibGlzaGVycygpKSB7CisgICAgICAJLy8gTm90ZTogdXNlICJQdWJsaXNoZXIiIChzaW5ndWxhcikgYXMgZnJvbSB0aGUgT09EVCBwcm9maWxlIHNwZWNpZmljYXRpb24KKyAgICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJQdWJsaXNoZXIiLCBzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQcm9maWxlVXRpbHMuYWRkSWZOb3ROdWxsKG1ldCwgIlJlc3RyaWN0QWNjZXNzIiwKKyAgICAgICAgZGF0YXNldC5nZXRSZXN0cmljdEFjY2VzcygpKTsKKyAgICBpZiAoZGF0YXNldC5nZXRUaW1lQ292ZXJhZ2UoKSAhPSBudWxsKSB7CisgICAgICBTdHJpbmcgc3RhcnREYXRlVGltZVN0ciA9IG51bGwsIGVuZERhdGVUaW1lU3RyID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0YXJ0RGF0ZVRpbWVTdHIgPSBQcm9maWxlVXRpbHMudG9JU084NjAxKGRhdGFzZXQuZ2V0VGltZUNvdmVyYWdlKCkKKyAgICAgICAgICAgIC5nZXRTdGFydCgpLmdldERhdGUoKSk7CisgICAgICAgIGVuZERhdGVUaW1lU3RyID0gUHJvZmlsZVV0aWxzLnRvSVNPODYwMShkYXRhc2V0LmdldFRpbWVDb3ZlcmFnZSgpCisgICAgICAgICAgICAuZ2V0RW5kKCkuZ2V0RGF0ZSgpKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPRy5sb2coCisgICAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgIkVycm9yIGNvbnZlcnRpbmcgc3RhcnQvZW5kIGRhdGUgdGltZSBzdHJpbmdzOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiU3RhcnREYXRlVGltZSIsIHN0YXJ0RGF0ZVRpbWVTdHIpOworICAgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJFbmREYXRlVGltZSIsIGVuZERhdGVUaW1lU3RyKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YXNldC5nZXRUaW1lQ292ZXJhZ2UoKSAhPSBudWxsCisgICAgICAgICYmIGRhdGFzZXQuZ2V0VGltZUNvdmVyYWdlKCkuZ2V0UmVzb2x1dGlvbigpICE9IG51bGwpIHsKKyAgICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiVGltZUNvdmVyYWdlUmVzb2x1dGlvbiIsIGRhdGFzZXQKKyAgICAgICAgICAuZ2V0VGltZUNvdmVyYWdlKCkuZ2V0UmVzb2x1dGlvbigpLmdldFRleHQoKSk7CisgICAgfQorICAgIC8vIGRhdGFzZXQgdW5pcXVlIElECisgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsICJVbmlxdWVJRCIsIGRhdGFzZXQuZ2V0VW5pcXVlSUQoKSk7CisKKyAgICAvLyBkYXRhc2V0IElEIGlzIHR5cGljYWxseSBub3QgbnVsbAorICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiSUQiLCBkYXRhc2V0LmdldElEKCkpOworCisgICAgLy8gZ2VuZXJhdGUgYSBVVUlEIGZvciBlYWNoIGRhdGFzZXQsIHRvIGJlIHVzZWQgYXMgcHJvZmlsZSBJRAorICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCAiVVVJRCIsIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworCisgICAgLy8gc3RvcmUgYWNjZXNzIHNlcnZpY2VzIC0gb25seSB0aGUgT3BlbkRBUCBlbmRwb2ludCBmb3Igbm93CisgICAgZm9yIChJbnZBY2Nlc3MgYWNjZXNzIDogZGF0YXNldC5nZXRBY2Nlc3MoKSkgeyAgICAJCisgICAgICBTdHJpbmcgdXJsID0gYWNjZXNzLmdldFN0YW5kYXJkVXJpKCkudG9TdHJpbmcoKTsKKyAgICAJU3RyaW5nIHR5cGUgPSBhY2Nlc3MuZ2V0U2VydmljZSgpLmdldFNlcnZpY2VUeXBlKCkudG9TdHJpbmcoKTsKKyAgICAJU3RyaW5nIG5hbWUgPSBhY2Nlc3MuZ2V0U2VydmljZSgpLmdldE5hbWUoKTsKKyAgICAJCisgICAgCS8vIGFkZCBvcGVuZGFwIGFjY2VzcyBVUkwKKyAgICAJaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShTZXJ2aWNlVHlwZS5PUEVOREFQLnRvU3RyaW5nKCkpKSB7CisgICAgCQkvLyBzdG9yZSBvcGVuZGFwIFVSTAorICAgIAkJUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsIk9wZW5kYXBVcmwiLHVybCk7CisgICAgCSAgLy8gbm90ZTogc3BlY2lhbCBwcm9jZXNzaW5nIG9mIG9wZW5kYXAgZW5kcG9pbnRzIHNpbmNlIFVSTCBpbiB0aHJlZGRzIGNhdGFsb2cgaXMgdW51c2FibGUgd2l0aG91dCBhIHN1ZmZpeAorICAgIAkJUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsIkFjY2VzcyIsIHRoaXMuZW5jb2RlQWNjZXNzVHVwbGUodXJsKyIuaHRtbCIsIFByb2ZpbGVVdGlscy5NSU1FX1RZUEVfT1BFTkRBUF9IVE1MLCB0eXBlKSk7CisgICAgCX0gCisgICAgfQorICAgIC8vIGFkZCBUUkVERFMgWE1MIGNhdGFsb2cgVVJMCisgICAgU3RyaW5nIHVybCA9IGRhdGFzZXQuZ2V0Q2F0YWxvZ1VybCgpOyAvLyBjYXRhbG9nX3VybC54bWwjZGF0YXNldF9pZAorICAgIFByb2ZpbGVVdGlscy5hZGRJZk5vdE51bGwobWV0LCJBY2Nlc3MiLCB0aGlzLmVuY29kZUFjY2Vzc1R1cGxlKHVybCwgUHJvZmlsZVV0aWxzLk1JTUVfVFlQRV9USFJFRERTLCAiQ2F0YWxvZy9YTUwiKSk7CisgICAgUHJvZmlsZVV0aWxzLmFkZElmTm90TnVsbChtZXQsIkFjY2VzcyIsIHRoaXMuZW5jb2RlQWNjZXNzVHVwbGUodXJsLnJlcGxhY2VBbGwoIlxcLnhtbCIsICIuaHRtbCIpLCBQcm9maWxlVXRpbHMuTUlNRV9UWVBFX0hUTUwsICJDYXRhbG9nL0hUTUwiKSk7CisKKyAgfQorICAKKwkvKioKKwkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGpvaW5zIHRoZSBwYXJ0cyBvZiBhbiB4bGluayB0dXBsZSAoaHJlZiwgdGl0bGUsIHR5cGUpIHdpdGggYSBkZWxpbWl0aW5nIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gaHJlZiA6IHRoZSB4bGluayBVUkwsIG11c3QgYmUgbm90IG51bGwKKwkgKiBAcGFyYW0gdGl0bGUgOiB0aGUgeGxpbmsgdGl0bGUsIG1heSBiZSBudWxsCisJICogQHBhcmFtIHR5cGUgOiB0aGUgeGxpbmsgdHlwZSwgbWF5IGJlIG51bGwKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZW5jb2RlWGxpbmtUdXBsZShmaW5hbCBTdHJpbmcgaHJlZiwgZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworCSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHR1cGxlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIHR1cGxlLmFwcGVuZChocmVmKQorICAgICAgICAgICAuYXBwZW5kKFByb2ZpbGVVdGlscy5DSEFSKQorICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLmhhc1RleHQodGl0bGUpID8gdGl0bGUgOiAiUmVmZXJlbmNlIiApCisgICAgICAgICAgIC5hcHBlbmQoUHJvZmlsZVV0aWxzLkNIQVIpCisgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nVXRpbHMuaGFzVGV4dCh0eXBlKSA/IHR5cGUgOiAiSFRNTCIgKTsKKyAgICAgIHJldHVybiB0dXBsZS50b1N0cmluZygpOworCX0KKwkKKwkvKioKKwkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGpvaW5zIHRoZSBwYXJ0IG9mIEEgVEhSRUREUyBhY2Nlc3MgcG9pbnQgKHVybCwgc2VydmljZSB0eXBlLCBzZXJ2aWNlIG5hbWUpIHdpdGggYSBkZWxpbWl0aW5nIGNoYXJhY3RlcgorCSAqIEBwYXJhbSB1cmwgOiB0aGUgYWNjZXNzIFVSTAorCSAqIEBwYXJhbSB0eXBlIDogdGhlIHNlcnZpY2UgdHlwZSwgbWFwcGVkIHRvIGEgbWltZSB0eXBlCisJICogQHBhcmFtIG5hbWUgOiB0aGUgc2VydmljZSBuYW1lCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgU3RyaW5nIGVuY29kZUFjY2Vzc1R1cGxlKGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdHVwbGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHR1cGxlLmFwcGVuZCh1cmwpCisgICAgICAgICAuYXBwZW5kKFByb2ZpbGVVdGlscy5DSEFSKQorICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5oYXNUZXh0KHR5cGUpID8gdHlwZSA6ICIiKQorICAgICAgICAgLmFwcGVuZChQcm9maWxlVXRpbHMuQ0hBUikKKyAgICAgICAgIC5hcHBlbmQoU3RyaW5nVXRpbHMuaGFzVGV4dChuYW1lKSA/IG5hbWUgOiAiIik7CisgICAgcmV0dXJuIHR1cGxlLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvdXRpbC9PcGVuZGFwVVJMRXZhbHVhdG9yLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvdXRpbC9PcGVuZGFwVVJMRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYzQ1YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy91dGlsL09wZW5kYXBVUkxFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuRGF0YXNldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CisKKy8qKgorICogCisgKiBFdmFsdWF0ZXMgdGhlIHJlc3VsdGFudCBPUGVOREFQIFVSTHMgcmV0dXJuZWQgZnJvbSBhIFRIUkVERFMgY2F0YWxvZyBieSB0aGUKKyAqIHtAbGluayBEYXRhc2V0RXh0cmFjdG9yfS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgT3BlbmRhcFVSTEV2YWx1YXRvciB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgZGF0YXNldFVybCA9IGFyZ3NbMF07CisgICAgU3RyaW5nIGNhdGFsb2dVcmwgPSBhcmdzWzFdOworCisgICAgRGF0YXNldEV4dHJhY3RvciBnZW4gPSBuZXcgRGF0YXNldEV4dHJhY3RvcihnZXRRdWVyeSgpLCBjYXRhbG9nVXJsLAorICAgICAgICBkYXRhc2V0VXJsLCBudWxsKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2VuLmdldERhcFVybHMoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBYTUxRdWVyeSBnZXRRdWVyeSgpIHsKKyAgICByZXR1cm4gbmV3IFhNTFF1ZXJ5KCJQRnVuY3Rpb249ZmluZGFsbCIsICJjbWRsaW5lIiwgImNtZGxpbmUiLCBudWxsLCBudWxsLAorICAgICAgICBudWxsLCBudWxsLCBudWxsLCBYTUxRdWVyeS5ERUZBVUxUX01BWF9SRVNVTFRTLCB0cnVlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvdXRpbC9Qcm9maWxlQ2hlY2tlci5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL3V0aWwvUHJvZmlsZUNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQyYjRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL3V0aWwvUHJvZmlsZUNoZWNrZXIuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLnV0aWw7CisKKy8vIEpESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vIE9PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUVsZW1lbnQ7CisKKy8vIFNwcmluZyBpbXBvcnRzCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBjaGVja3MgYW4gT09EVCBQcm9maWxlIHZlcnN1cyBhIGxpc3Qgb2YgcmVxdWlyZWQvb3B0aW9uYWwgZWxlbWVudHMsCisgKiBhbmQgcHJvdmlkZXMgYSB2YWxpZGF0aW9uIHN1bW1hcnkgZm9yIHF1aWNrIGluc3BlY3Rpb24gYnkgdGhlIHB1Ymxpc2hlci4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvZmlsZUNoZWNrZXIgeworCQorCS8vIGxpc3Qgb2YgbWFuZGF0b3J5IHByb2ZpbGUgZWxlbWVudHMKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBtYW5kYXRvcnlQcm9maWxlRWxlbWVudHMgPSBuZXcgU3RyaW5nW10geyAgfTsKKwkKKwkvLyBsaXN0IG9mIG9wdGlvbmFsIHByb2ZpbGUgZWxlbWVudHMKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBvcHRpb25hbFByb2ZpbGVFbGVtZW50cyA9IG5ldyBTdHJpbmdbXSB7ICJtaXNzaW9uX25hbWUiLCAic2Vuc29yIiwgImluc3RpdHV0ZSIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSIsICJjZl9zdGFuZGFyZF9uYW1lIiwgInZhcmlhYmxlX2xvbmdfbmFtZSIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGF0aWFsX2NvdmVyYWdlIiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnRoX2RlZ3JlZXMiLCAiZWFzdF9kZWdyZWVzIiwgInNvdXRoX2RlZ3JlZXMiLCAid2VzdF9kZWdyZWVzIiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGV0aW1lX3N0YXJ0IiwgImRhdGV0aW1lX3N0b3AiIH07CisJCQorCS8qKgorCSAqIE1haW4gbWV0aG9kIHRvIGNoZWNrIGFuIE9PRFQgcHJvZmlsZS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvZmlsZSA6IHRoZSBPT0RUIHByb2ZpbGUgdGhhdCBuZWVkcyB2YWxpZGF0aW9uLgorCSAqIEBwYXJhbSBzYiA6IGJ1ZmZlciB0byB3cml0ZSB0aGUgb3V0cHV0IHRvLgorCSAqIEByZXR1cm4gOiB0cnVlIGlmIHRoZSBwcm9maWxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKGZpbmFsIFByb2ZpbGUgcHJvZmlsZSwgZmluYWwgU3RyaW5nQnVpbGRlciBzYikgeworCQkKKwkJLy8gcHJvZmlsZSBwYXNzZXMgYnkgZGVmYXVsdAorCQlib29sZWFuIG9rID0gdHJ1ZTsKKwkJc2IuYXBwZW5kKCJcbkNoZWNraW5nIHByb2ZpbGU9Iitwcm9maWxlLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSk7CisJCQorCQlvayA9IG9rICYmIGNoZWNrUmVzb3VyY2VBdHRyaWJ1dGUoIklkZW50aWZpZXIiLCBwcm9maWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldElkZW50aWZpZXIoKSwgdHJ1ZSwgc2IpOworCQkKKwkJb2sgPSBvayAmJiBjaGVja1Jlc291cmNlQXR0cmlidXRlKCJUaXRsZSIsIHByb2ZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0VGl0bGUoKSwgdHJ1ZSwgc2IpOworCQkKKwkJb2sgPSBvayAmJiBjaGVja1Jlc291cmNlQXR0cmlidXRlKCJEZXNjcmlwdGlvbiIsIHByb2ZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0RGVzY3JpcHRpb24oKSwgZmFsc2UsIHNiKTsKKwkJCisJCW9rID0gb2sgJiYgY2hlY2tSZXNvdXJjZUF0dHJpYnV0ZSgiTG9jYXRpb24gb2YgdHlwZSAiK1Byb2ZpbGVVdGlscy5NSU1FX1RZUEVfT1BFTkRBUF9IVE1MLCAKKwkJCQkgICAgICAgICAgICAgc2VsZWN0UmVzb3VyY2VMb2NhdGlvbkJ5TWltZVR5cGUocHJvZmlsZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRSZXNMb2NhdGlvbnMoKSwgUHJvZmlsZVV0aWxzLk1JTUVfVFlQRV9PUEVOREFQX0hUTUwpLCAKKwkJCQkgICAgICAgICAgICAgdHJ1ZSwgc2IpOworCQkKKwkJb2sgPSBvayAmJiBjaGVja1Jlc291cmNlQXR0cmlidXRlKCJMb2NhdGlvbiBvZiB0eXBlICIrUHJvZmlsZVV0aWxzLk1JTUVfVFlQRV9USFJFRERTLCAKKyAgICAgICAgc2VsZWN0UmVzb3VyY2VMb2NhdGlvbkJ5TWltZVR5cGUocHJvZmlsZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRSZXNMb2NhdGlvbnMoKSwgUHJvZmlsZVV0aWxzLk1JTUVfVFlQRV9USFJFRERTKSwgCisgICAgICAgIHRydWUsIHNiKTsKKwkJCisJCW9rID0gb2sgJiYgY2hlY2tSZXNvdXJjZUF0dHJpYnV0ZSgiTG9jYXRpb24gb2YgdHlwZSAiK1Byb2ZpbGVVdGlscy5NSU1FX1RZUEVfSFRNTCwgCisgICAgICAgIHNlbGVjdFJlc291cmNlTG9jYXRpb25CeU1pbWVUeXBlKHByb2ZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVzTG9jYXRpb25zKCksIFByb2ZpbGVVdGlscy5NSU1FX1RZUEVfSFRNTCksIAorICAgICAgICB0cnVlLCBzYik7CisJCQorCQlvayA9IG9rICYmIGNoZWNrUmVzb3VyY2VBdHRyaWJ1dGUoIkxvY2F0aW9uIG9mIHR5cGUgIitQcm9maWxlVXRpbHMuTUlNRV9UWVBFX0dJUywgCisgICAgICAgIHNlbGVjdFJlc291cmNlTG9jYXRpb25CeU1pbWVUeXBlKHByb2ZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVzTG9jYXRpb25zKCksIFByb2ZpbGVVdGlscy5NSU1FX1RZUEVfR0lTKSwgCisgICAgICAgIHRydWUsIHNiKTsKKwkJCisJCWZvciAoU3RyaW5nIG5hbWUgOiBtYW5kYXRvcnlQcm9maWxlRWxlbWVudHMpIHsKKwkJCW9rID0gb2sgJiYgY2hlY2tQcm9maWxlRWxlbWVudChwcm9maWxlLCBuYW1lLCB0cnVlLCBzYik7CisJCX0KKwkJZm9yIChTdHJpbmcgbmFtZSA6IG9wdGlvbmFsUHJvZmlsZUVsZW1lbnRzKSB7CisJCQlvayA9IG9rICYmIGNoZWNrUHJvZmlsZUVsZW1lbnQocHJvZmlsZSwgbmFtZSwgZmFsc2UsIHNiKTsKKwkJfQorCQkKKwkJcmV0dXJuIG9rOworCX0KKwkKKwkvKioKKwkgKiBNZXRob2QgdG8gY2hlY2sgdGhhdCBhIHByb2ZpbGUgUmVzb3VyY2UgQXR0cmlidXRlIGhhcyBhIHZhbGlkIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIHZhbHVlCisJICogQHBhcmFtIG1hbmRhdG9yeQorCSAqIEBwYXJhbSBzYgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUmVzb3VyY2VBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBtYW5kYXRvcnksIFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKCJcblx0UmVzb3VyY2UgQXR0cmlidXRlICciICsgbmFtZSArICInID0gIik7CisJCWlmICghU3RyaW5nVXRpbHMuaGFzVGV4dCh2YWx1ZSkgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisJCQkJaWYgKG1hbmRhdG9yeSkgcmV0dXJuIGZhbHNlOyAvLyBiYWQgdmFsdWUKKwkJfSBlbHNlIHsKKwkJCXNiLmFwcGVuZCh2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBjaGVjayB0aGF0IHRoZSBwcm9maWxlIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB2YWxpZCB2YWx1ZSBmb3Igb2YgYSBzcGVjaWZpYyBlbGVtZW50IG5hbWUuCisJICogCisJICogQHBhcmFtIHByb2ZpbGUKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtYW5kYXRvcnkKKwkgKiBAcGFyYW0gc2IKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1Byb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gbWFuZGF0b3J5LCBTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQorCQlzYi5hcHBlbmQoIlxuXHRQcm9maWxlIEVsZW1lbnQgJyIgKyBuYW1lICsgIicgPSAiKTsKKwkgIC8vIHByb2ZpbGUgZWxlbWVudCBpcyB2YWxpZCBieSBkZWZhdWx0CisJCWJvb2xlYW4gb2sgPSB0cnVlOyAKKwkKKwkJaWYgKHByb2ZpbGUuZ2V0UHJvZmlsZUVsZW1lbnRzKCkuY29udGFpbnNLZXkobmFtZSkpIHsKKwkJCQlQcm9maWxlRWxlbWVudCBwcm9mRWxlbWVudCA9IChQcm9maWxlRWxlbWVudClwcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpLmdldChuYW1lKTsKKwkJCQorICAJCQkvLyBwcm9maWxlIGVsZW1lbnQgZm91bmQKKyAgCQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHByb2ZFbGVtZW50LmdldFZhbHVlcygpOworICAJCQlpZiAodmFsdWVzLnNpemUoKT4wKSB7CisgIAkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7CisgIAkJCQkJaWYgKCFTdHJpbmdVdGlscy5oYXNUZXh0KHZhbHVlKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJudWxsIikpIHsKKyAgCQkJCQkJaWYgKG1hbmRhdG9yeSkgb2sgPSBmYWxzZTsgLy8gaW52YWxpZCB2YWx1ZSBmb3IgdGhpcyBwcm9maWxlIGVsZW1lbnQKKyAgCQkJCQl9IGVsc2UgeworICAJCQkJCQlpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgIAkJCQkJCXNiLmFwcGVuZCh2YWx1ZSk7CisgIAkJCQkJCWZpcnN0ID0gZmFsc2U7CisgIAkJCQkJfQorICAJCQkJfQorICAJCQl9IGVsc2UgeworICAJCQkJaWYgKG1hbmRhdG9yeSkgb2sgPSBmYWxzZTsgLy8gbm8gdmFsdWVzIGZvdW5kIGZvciB0aGlzIHByb2ZpbGUgZWxlbWVudAorICAJCQl9CisJCQorCQl9IGVsc2UgeworCQkJaWYgKG1hbmRhdG9yeSkgb2sgPSBmYWxzZTsgLy8gbm8gcHJvZmlsZSBlbGVtZW50IGZvdW5kCisJCX0KKwkJCisJCXJldHVybiBvazsKKwkJCisJfQorCQorCS8qKgorCSAqIE1ldGhvZCB0byBzZWxlY3QgdGhlIHJlc291cmNlIGxvY2F0aW9uIG9mIGEgc3BlY2lmaWMgbWltZSB0eXBlLCBpZiBmb3VuZC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzTG9jYXRpb25zCisJICogQHBhcmFtIG1pbWVUeXBlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZWxlY3RSZXNvdXJjZUxvY2F0aW9uQnlNaW1lVHlwZShMaXN0PFN0cmluZz4gcmVzTG9jYXRpb25zLCBTdHJpbmcgbWltZVR5cGUpIHsKKwkJCisJCWZvciAoU3RyaW5nIHJlc0xvY2F0aW9uIDogcmVzTG9jYXRpb25zKSB7CisJCQlTdHJpbmdbXSBwYXJ0cyA9IHJlc0xvY2F0aW9uLnNwbGl0KCJcXHwiKTsgLy8gcmVndWxhciBleHByZXNzaW9uIG9mIFByb2ZpbGVVdGlscy5DSEFSCisJCQlpZiAocGFydHNbMV0uZXF1YWxzKG1pbWVUeXBlKSkgcmV0dXJuIHBhcnRzWzBdOworCQl9CisJCQorCQkvLyByZXNvdXJjZSBsb2NhdGlvbiBub3QgZm91bmQKKwkJcmV0dXJuIG51bGw7CisJCQorCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy91dGlsL1Byb2ZpbGVTZXJpYWxpemVyLmphdmEgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvdXRpbC9Qcm9maWxlU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzQ3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL29wZW5kYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9vcGVuZGFwcHMvdXRpbC9Qcm9maWxlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBzZXJpYWxpemUgYSBsaXN0IG9mIHByb2ZpbGVzIHRvIGFuIFhNTCBkb2N1bWVudC4KKyAqIDxwLz4KKyAqIEJhc2VkIG9uIGZ1bmN0aW9uYWxpdHkgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIE9PRFQgZ3JpZCBQcm9maWxlUXVlcnlTZXJ2bGV0CisgKiBjbGFzcywgYnV0IHNlcGFyYXRlZCBhcyBhIHN0YW5kIGFsb25lIHV0aWxpdHkgdG8gcmVkdWNlIGRlcGVuZGVuY2llcy4KKyAqIAorICogQGF1dGhvciBMdWNhIENpbnF1aW5pCisgKiAKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVTZXJpYWxpemVyIHsKKworICAvKioKKyAgICogRnVuY3Rpb24gdG8gc2VyaWFsaXplIGEgbGlzdCBvZiB7QGxpbmsgUHJvZmlsZX1zIHRvIFhNTC4KKyAgICogCisgICAqIEBwYXJhbSBwcm9maWxlcworICAgKiBAcmV0dXJuCisgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvWE1MKGZpbmFsIExpc3Q8UHJvZmlsZT4gcHJvZmlsZXMpCisgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworCisgICAgZmluYWwgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICB3cml0ZXIuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiIpOworICAgIHdyaXRlci5hcHBlbmQoIjwhRE9DVFlQRSBwcm9maWxlcyBQVUJMSUMgJyIgKyBQcm9maWxlLlBST0ZJTEVTX0RURF9GUEkKKyAgICAgICAgKyAiJyAnIiArIFByb2ZpbGUuUFJPRklMRVNfRFREX1VSTCArICInPiIpOworICAgIHdyaXRlci5hcHBlbmQoIjxwcm9maWxlcz4iKTsKKworICAgIGZpbmFsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gY3JlYXRlVHJhbnNmb3JtZXIoKTsKKyAgICBmaW5hbCBEb2N1bWVudCBkb2MgPSBQcm9maWxlLmNyZWF0ZVByb2ZpbGVEb2N1bWVudCgpOworICAgIGZvciAoZmluYWwgUHJvZmlsZSBwcm9maWxlIDogcHJvZmlsZXMpIHsKKworICAgICAgTm9kZSBwcm9maWxlTm9kZSA9IHByb2ZpbGUudG9YTUwoZG9jKTsKKyAgICAgIERPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKHByb2ZpbGVOb2RlKTsKKyAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7CisgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworCisgICAgfQorCisgICAgd3JpdGVyLmFwcGVuZCgiPC9wcm9maWxlcz4iKTsKKworICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKKworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIHRyYW5zZm9ybWVyLCBwcm9wZXJseSBjb25maWd1cmVkIGZvciBYTUwgdGV4dCBzZXJpYWxpemF0aW9uLgorICAgKiAKKyAgICogQHJldHVybiBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB2YWx1ZS4KKyAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgVHJhbnNmb3JtZXIgY3JlYXRlVHJhbnNmb3JtZXIoKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworCisgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXI7CisgICAgc3luY2hyb25pemVkIChUUkFOU0ZPUk1FUl9GQUNUT1JZKSB7CisgICAgICB0cmFuc2Zvcm1lciA9IFRSQU5TRk9STUVSX0ZBQ1RPUlkubmV3VHJhbnNmb3JtZXIoKTsKKyAgICB9CisKKyAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOworICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuVkVSU0lPTiwgIjEuMCIpOworICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOworICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKKyAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlNUQU5EQUxPTkUsICJubyIpOworICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7CisgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRURJQV9UWVBFLCAidGV4dC94bWwiKTsKKyAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLAorICAgICAgICAiNCIpOworCisgICAgcmV0dXJuIHRyYW5zZm9ybWVyOworICB9CisKKyAgLyoqIFNvbGUgdHJhbnNmb3JtZXIgZmFjdG9yeSB0aGlzIGNsYXNzIHdpbGwgZXZlciBuZWVkLiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkgVFJBTlNGT1JNRVJfRkFDVE9SWSA9IFRyYW5zZm9ybWVyRmFjdG9yeQorICAgICAgLm5ld0luc3RhbmNlKCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy91dGlsL1Byb2ZpbGVVdGlscy5qYXZhIGIvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvb3BlbmRhcHBzL3V0aWwvUHJvZmlsZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NTBlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L29wZW5kYXBwcy91dGlsL1Byb2ZpbGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDI3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLk9wZW5kYXBDb25maWdNZXRLZXlzLkVOVU1fRUxFTUVOVF9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5QUk9GX0FUVFJfU1BFQ19UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5QUk9GX0VMRU1fU1BFQ19UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5SQU5HRURfRUxFTUVOVF9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5PcGVuZGFwQ29uZmlnTWV0S2V5cy5SRVNfQVRUUl9TUEVDX1RZUEU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PUEVOREFQIGltcG9ydHMKK2ltcG9ydCBvcGVuZGFwLmRhcC5CYXNlVHlwZTsKK2ltcG9ydCBvcGVuZGFwLmRhcC5EQXJyYXk7CitpbXBvcnQgb3BlbmRhcC5kYXAuRENvbm5lY3Q7CitpbXBvcnQgb3BlbmRhcC5kYXAuRERTOworaW1wb3J0IG9wZW5kYXAuZGFwLkRHcmlkOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLk9wZW5kYXBQcm9maWxlRWxlbWVudEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5Db25zdGFudFNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuRGF0YXNldE1ldEVsZW07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5jb25maWcuT3BlbmRhcENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQub3BlbmRhcHBzLmNvbmZpZy5SZXdyaXRlU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5SZXNvdXJjZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIAorICogU3RhdGljIG1ldGhvZHMgZm9yIHVucmF2ZWxpbmcgYW5kIGdlbmVyYXRpbmcge0BsaW5rIFByb2ZpbGVFbGVtZW50fXMsCisgKiB7QGxpbmsgUHJvZmlsZUF0dHJpYnV0ZXN9IGFuZCB7QGxpbmsgUmVzb3VyY2VBdHRyaWJ1dGVzfSBmb3IgYQorICoge0BsaW5rIFByb2ZpbGV9LCBkZXJpdmVkIGZyb20gYSBzZXQgb2YgT1BlTkRBUCBkYXRhc2V0IGluZm9ybWF0aW9uIGFuZCBhbgorICoge0BsaW5rIE9wZW5kYXBDb25maWd9LgorICogCisgKiAKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVVdGlscyB7CisJCisJc3RhdGljIHsKKwkJLy8gTm90ZTogbXVzdCBvdmVycmlkZSB0aGUgQ0FTIFBhdGhVdGlscyBkZWxpbWl0ZXIgb3RoZXJ3aXNlIGV2ZXJ5IHNlbnRlbmNlIGlzIHNwbGl0IGF0IHRoZSAnLCcgYXMgZGlmZmVyZW50IG1ldGFkYXRhIGZpZWxkcy4KKwkJLy8gVGhlIGRlbGltaXRlciBtdXN0IGJlIGEgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGNvbW1vbmx5IHVzZWQgaW4gdGhlIG1ldGFkYXRhIHZhbHVlcywgCisJCS8vIGFuZCB0aGF0IGl0IGRvZXMgbm90IGEgc3BlY2lhbCByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyLgorCQkvLyBDYW5ub3QgdXNlICcjJyBhcyBpdCBpcyB1c2VkIGluIFVSTCBhbmNob3JzLCBzdWNoIGFzIFRIUkVERFMgdXJscy4KKwkJLy8gQ2Fubm90IHVzZXIgJz8nLCAnJicgYXMgdGhleSBhcmUgdXNlZCBpbiBVUkwgcXVlcnkgc3RyaW5ncy4KKwkJLy8gQ2Fubm90IHVzZSAnfCcgYXMgaXQgaXMgdXNlZCBhcyBtdWx0aS1wYXJ0IHNlcGFyYXRvcnMgaW4gZW5jb2Rpbmcgb2YgbWV0YWRhdGEgZmllbGRzLgorCQlQYXRoVXRpbHMuREVMSU1JVEVSID0gIn4iOworCX0KKwkKKyAgLy8gY2hhcmFjdGVyIHNlcGFyYXRpbmcgbXVsdGlwbGUgcGFydHMgb2YgdGhlIHNhbWUgbWV0YWRhdGEgZmllbGQsCisgIC8vIHdoZW4gbW9yZSB0aGFuIG9uZSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBzdG9yZWQgaW4gb25lIGZpZWxkCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENIQVIgPSAifCI7CisgIAorICAvLyBIVFRQIG1pbWUgdHlwZXMKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlNRV9UWVBFX1RIUkVERFMgPSAiYXBwbGljYXRpb24veG1sK3RocmVkZHMiOyAgIAorICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfTkVUQ0RGID0gImFwcGxpY2F0aW9uL25ldGNkZiI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9HUklERlRQID0gImFwcGxpY2F0aW9uL2dyaWRmdHAiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfRlRQID0gImFwcGxpY2F0aW9uL2Z0cCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9MQVMgPSAiYXBwbGljYXRpb24vbGFzIjsgICAKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlNRV9UWVBFX0hUTUwgPSAidGV4dC9odG1sIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlNRV9UWVBFX0dPT0dMRV9FQVJUSCA9ICJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmtteiI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9IREYgPSAiYXBwbGljYXRpb24veC1oZGYiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfT1BFTkRBUCA9ICJhcHBsaWNhdGlvbi9vcGVuZGFwIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlNRV9UWVBFX09QRU5EQVBfRE9EUyA9ICJhcHBsaWNhdGlvbi9vcGVuZGFwLWRvZHMiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfT1BFTkRBUF9EQVMgPSAiYXBwbGljYXRpb24vb3BlbmRhcC1kYXMiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfT1BFTkRBUF9ERFMgPSAiYXBwbGljYXRpb24vb3BlbmRhcC1kZHMiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfT1BFTkRBUF9IVE1MID0gImFwcGxpY2F0aW9uL29wZW5kYXAtaHRtbCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9SU1MgPSAiYXBwbGljYXRpb24vcnNzK3htbCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9HSVMgPSAiYXBwbGljYXRpb24vZ2lzIjsKKworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb2ZpbGVVdGlscy5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUF0dHJpYnV0ZXMgZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKE9wZW5kYXBDb25maWcgY29uZiwKKyAgICAgIFN0cmluZyBvcGVuZGFwVXJsLCBEQ29ubmVjdCBkQ29ubiwgTWV0YWRhdGEgZGF0YXNldE1ldCkgeworICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNBdHRyID0gbmV3IFJlc291cmNlQXR0cmlidXRlcygpOworICAgIGZvciAoQ29uc3RhbnRTcGVjIHNwZWMgOiBjb25mLmdldENvbnN0U3BlY3MoKSkgeworICAgICAgaWYgKHNwZWMuZ2V0VHlwZSgpLmVxdWFscyhSRVNfQVRUUl9TUEVDX1RZUEUpKSB7CisgICAgICAgIHRyeSB7ICAgICAgICAJCisgICAgICAgIAkgICAgICAJICAgICAgICAJCisgICAgICAgIAkvLyBmaXJzdCBwcm9jZXNzIGV4cGFuZGVkICdbQC4uLl0nIGluc3RydWN0aW9ucworICAgICAgICAJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG11bHRpcGxlRW52VmFyaWFibGVzUmVwbGFjZW1lbnQoc3BlYy5nZXRWYWx1ZSgpLCBkYXRhc2V0TWV0KTsKKyAgICAgICAgCQorICAgICAgICAJLy8gdGhlbiBwcm9jZXNzIHN0YW5kYXJkICdbLi4uXScgaW5zdHJ1Y3Rpb25zCisgICAgICAgIAlmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgIAlTdHJpbmcgX3ZhbHVlID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXModmFsdWUsIGRhdGFzZXRNZXQsIHRydWUpOyAgICAgICAgICAJCSAgICAgICAgCQkKKyAgICAgICAgCQlpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChfdmFsdWUpKSB7CisgICAgICAgIAkJCXNldFJlc291cmNlQXR0cmlidXRlcyhyZXNBdHRyLCBzcGVjLmdldE5hbWUoKSwgX3ZhbHVlKTsKKyAgICAgICAgCQl9CisgICAgICAgIAkJCisgICAgICAgIAl9CisgCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBzZXR0aW5nIGZpZWxkOiBbIiArIHNwZWMuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICsgIl0gaW4gcmVzb3VyY2UgYXR0cmlidXRlczogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuIHJlc0F0dHI7CisgIH0KKyAgCisgIC8qKgorICAgKiBVdGlsaXR5IG1ldGhvZCB0byBwcm9jZXNzIGVudmlyb25tZW50IHJlcGxhY2VtZW50IGluc3RydWN0aW9ucyBvZiB0aGUgZm9ybSAnW0BrZXldJworICAgKiByZXN1bHRpbmcgaW4gYXMgbWFueSBvdXRwdXQgdmFsdWVzIGFzIHRoZXJlIGFyZSB2YWx1ZXMgZm9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAna2V5Jy4KKyAgICogTm90ZSB0aGF0IGN1cnJlbnRseSBvbmx5IG9uZSBzdWNoIHBhdHRlcm4gJ1tAa2V5J10nIGNhbiBiZSBwcm9jZXNzZWQuCisgICAqIAorICAgKiBAcGFyYW0gdmFsdWUKKyAgICogQHBhcmFtIG1ldGFkYXRhCisgICAqIEByZXR1cm4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBtdWx0aXBsZUVudlZhcmlhYmxlc1JlcGxhY2VtZW50KFN0cmluZyB2YWx1ZSwgTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgCQorICAJTGlzdDxTdHJpbmc+IG5ld1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgIAkvLyByZWdleHAgbWF0Y2hpbmcgZm91bmQgPiByZXBsYWNlIHZhbHVlcworICAJaW50IHN0YXJ0ID0gdmFsdWUuaW5kZXhPZigiW0AiKTsKKyAgCWlmIChzdGFydD49MCkgeworICAJCQorICAJCQlpbnQgZW5kID0gdmFsdWUuaW5kZXhPZigiXSIsc3RhcnQrMik7CisgIAkJCS8vIHJlbW92ZSAnW0AnLCddJyB0byBvYnRhaW4gZW52aXJvbm1lbnQgdmFyaWFibGUga2V5CisgIAkJCVN0cmluZyBlbnZLZXkgPSB2YWx1ZS5zdWJzdHJpbmcoc3RhcnQrMixlbmQpOworICAgIAkJTGlzdDxTdHJpbmc+IGVudlZhbHVlcyA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGVudktleSk7CisgICAgCQlpZiAoZW52VmFsdWVzIT1udWxsKSB7CisgICAgICAJCWZvciAoU3RyaW5nIGVudlZhbHVlIDogZW52VmFsdWVzKSB7CisgICAgICAJCQkvLyBjcmVhdGUgbmV3IG1ldGFkYXRhIHZhbHVlIGZvciB0aGlzIGVudmlyb25tZW50IHJlcGxhY2VtZW50CisgICAgICAJCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCJcXFtAIitlbnZLZXkrIlxcXSIsIGVudlZhbHVlKTsKKyAgICAgIAkJCW5ld1ZhbHVlcy5hZGQobmV3VmFsdWUpOworICAgICAgCQl9CisgIAkJfQorICAJCQorICAgIC8vIHJlZ2V4cCBtYXRjaGluZyBub3QgZm91bmQgPiByZXR1cm4gb3JpZ2luYWwgdmFsdWUKKyAgCX0gZWxzZSB7CisgIAkJbmV3VmFsdWVzLmFkZCh2YWx1ZSk7CisgIAl9CisgIAkKKyAgCXJldHVybiBuZXdWYWx1ZXM7CisgIAkKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUHJvZmlsZUF0dHJpYnV0ZXMgZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoT3BlbmRhcENvbmZpZyBjb25mLCBNZXRhZGF0YSBkYXRhc2V0TWV0KSB7CisgICAgUHJvZmlsZUF0dHJpYnV0ZXMgcHJvZkF0dHIgPSBuZXcgUHJvZmlsZUF0dHJpYnV0ZXMoKTsKKyAgICBmb3IgKENvbnN0YW50U3BlYyBzcGVjIDogY29uZi5nZXRDb25zdFNwZWNzKCkpIHsKKyAgICAgIGlmIChzcGVjLmdldFR5cGUoKS5lcXVhbHMoUFJPRl9BVFRSX1NQRUNfVFlQRSkpIHsKKyAgICAgICAgc2V0UHJvZmlsZUF0dHJpYnV0ZXNQcm9wZXJ0eShwcm9mQXR0ciwgc3BlYy5nZXROYW1lKCksIFBhdGhVdGlscworICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoc3BlYy5nZXRWYWx1ZSgpLCBkYXRhc2V0TWV0LCB0cnVlKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2ZBdHRyOworCisgIH0KKworICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2ZpbGVFbGVtZW50PiBnZXRQcm9maWxlRWxlbWVudHMoCisgICAgICBPcGVuZGFwQ29uZmlnIGNvbmYsIERDb25uZWN0IGRDb25uLCBNZXRhZGF0YSBkYXRhc2V0TWV0LCBQcm9maWxlIHByb2ZpbGUpIHRocm93cyBFeGNlcHRpb24geworICAJCisgICAgT3BlbmRhcFByb2ZpbGVFbGVtZW50RXh0cmFjdG9yIHBlID0gbmV3IE9wZW5kYXBQcm9maWxlRWxlbWVudEV4dHJhY3Rvcihjb25mKTsKKyAgICBNYXA8U3RyaW5nLCBQcm9maWxlRWxlbWVudD4gcHJvZkVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9maWxlRWxlbWVudD4oKTsKKworICAgIC8vIGV4dHJhY3RzIGFsbCB2YXJpYWJsZXMgZGVmaW5lZCBpbiBERFMKKyAgICB0cnkgeworICAgICAgCQorICAgIAkJRERTIGRkcyA9IGRDb25uLmdldEREUygpOworICAgICAgCSAgICAgIAkKKyAgICAgIAkvLyBsb29wIG92ZXIgYWxsIHZhcmlhYmxlcyBmb3VuZAorICAgICAgCUVudW1lcmF0aW9uIHZhcmlhYmxlcyA9IGRkcy5nZXRWYXJpYWJsZXMoKTsKKyAgICAgIAl3aGlsZSAodmFyaWFibGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAJCQorICAgICAgCQlCYXNlVHlwZSB2YXJpYWJsZSA9IChCYXNlVHlwZSl2YXJpYWJsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgIAkJU3RyaW5nIHZhck5hbWUgPSB2YXJpYWJsZS5nZXROYW1lKCk7CisgICAgICAJCWlmICh2YXJpYWJsZSBpbnN0YW5jZW9mIERBcnJheSkgeworICAgICAgCQkJTE9HLmxvZyhMZXZlbC5GSU5FLCAiRXh0cmFjdGluZyBEYXJyYXkgdmFyaWFibGU6ICIrdmFyTmFtZSk7CisgICAgICAJCX0gZWxzZSBpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBER3JpZCkgeworICAgICAgCQkJTE9HLmxvZyhMZXZlbC5GSU5FLCAiRXh0cmFjdGluZyBEZ3JpZCB2YXJpYWJsZTogIit2YXJOYW1lKTsKKyAgICAgIAkJfSAgICAgCQkKKworICAgICAgCQlSZXdyaXRlU3BlYyBzcGVjID0gZ2V0UHJvZmlsZUVsZW1lbnRTcGVjKHZhck5hbWUsIGNvbmYpOworICAgICAgCQlpZiAoc3BlYyE9bnVsbCkgeworICAgICAgCQkJLy8gdXNlIGNvbmZpZ3VyYXRpb24gdG8gc2V0IHZhcmlhYmxlIHJlLW5hbWUgYW5kIHR5cGUKKyAgICAgIAkJCVN0cmluZyBwZU5hbWUgPSBzcGVjLmdldFJlbmFtZSgpICE9IG51bGwgJiYgIXNwZWMuZ2V0UmVuYW1lKCkuZXF1YWxzKCIiKSA/IHNwZWMuZ2V0UmVuYW1lKCkgOiBzcGVjLmdldE9yaWdOYW1lKCk7CisgICAgICAgICAgICBpZiAoc3BlYy5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhSQU5HRURfRUxFTUVOVF9UWVBFKSkgeworICAgICAgICAgICAgICBwcm9mRWxlbWVudHMucHV0KHBlTmFtZSwgcGUuZXh0cmFjdFJhbmdlZFByb2ZpbGVFbGVtZW50KHBlTmFtZSwgc3BlYy5nZXRPcmlnTmFtZSgpLCBwcm9maWxlLCBkQ29ubi5nZXREQVMoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcGVjLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKEVOVU1fRUxFTUVOVF9UWVBFKSkgeworICAgICAgICAgICAgICBwcm9mRWxlbWVudHMucHV0KHBlTmFtZSwgcGUuZXh0cmFjdEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChwZU5hbWUsIHNwZWMuZ2V0T3JpZ05hbWUoKSwgcHJvZmlsZSwgZENvbm4uZ2V0REFTKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgIAkJfSBlbHNlIHsKKyAgICAgIAkJCS8vIGlmIG5vdCBleHBsaWNpdGx5IGNvbmZpZ3VyZWQsIGFzc3VtZSB2YXJpYWJsZSBpZiBvZiBSQU5HRURfRUxFTUVOVF9UWVBFCisgICAgICAJCQlwcm9mRWxlbWVudHMucHV0KHZhck5hbWUsIHBlLmV4dHJhY3RSYW5nZWRQcm9maWxlRWxlbWVudCh2YXJOYW1lLCB2YXJOYW1lLCBwcm9maWxlLCBkQ29ubi5nZXREQVMoKSkpOworICAgICAgCQl9CisgICAgICAJCQorICAgICAgCX0KKyAgICAgIAkKKyAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZXh0cmFjdGluZyBtZXRhZGF0YSBmcm9tIEREUyAoIitkQ29ubi5VUkwoKSsiKSA6IiAgK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIC8vIHJldGhyb3cgdGhlIGV4Y2VwdGlvbiBzbyB0aGF0IHRoaXMgZGF0YXNldCBpcyBub3QgaGFydmVzdGVkCisgICAgICB0aHJvdyBlOworICAgIH0KKworICAgIC8vIGFkZCBwcm9maWxlIGVsZW1lbnRzIGZyb20gPGRhdGFzZXRNZXRhZGF0YT4gc3BlY2lmaWNhdGlvbgorICAgIGlmIChkYXRhc2V0TWV0ICE9IG51bGwpIHsKKyAgICAgIGZvciAoRGF0YXNldE1ldEVsZW0gZGF0YXNldFNwZWMgOiBjb25mLmdldERhdGFzZXRNZXRTcGVjcygpKSB7CisgICAgICAJLy8gcmV0cmlldmUgdmFsdWVzIGZyb20gbWV0YWRhdGEgY29udGFpbmVyCisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBkYXRhc2V0TWV0LmdldEFsbE1ldGFkYXRhKGRhdGFzZXRTcGVjLmdldFZhbHVlKCkpOworICAgICAgCWFkZFZhbHVlc1RvRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KGRhdGFzZXRTcGVjLmdldFByb2ZpbGVFbGVtZW50TmFtZSgpLCB2YWx1ZXMsIHByb2ZpbGUsIHByb2ZFbGVtZW50cyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIGFkZCBwcm9maWxlIGVsZW1lbnRzIGZyb20gPGNvbnN0YW50cz4gc3BlY2lmaWNhdGlvbgorICAgIGZvciAoQ29uc3RhbnRTcGVjIHNwZWMgOiBjb25mLmdldENvbnN0U3BlY3MoKSkgeworICAgICAgaWYgKHNwZWMuZ2V0VHlwZSgpLmVxdWFscyhQUk9GX0VMRU1fU1BFQ19UWVBFKSkgeworICAgICAgCS8vIHJldHJpZXZlIHZhbHVlIGZyb20gWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSwgcmVwbGFjZSB3aXRoIHZhbHVlIGZyb20gbWV0YWRhdGEgY29udGFpbmVyIGlmIHJlcXVpcmVkLAorICAgICAgCS8vIHNwbGl0IGFjY29yZGluZyB0byBkZWxpbWl0ZXIKKyAgICAgICAgU3RyaW5nIHJlcGxhY2VWYWwgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhzcGVjLmdldFZhbHVlKCksIGRhdGFzZXRNZXQpOworICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gQXJyYXlzLmFzTGlzdChyZXBsYWNlVmFsLnNwbGl0KFBhdGhVdGlscy5ERUxJTUlURVIpKTsKKyAgICAgIAlhZGRWYWx1ZXNUb0VudW1lcmF0ZWRQcm9maWxlRWxlbWVudChzcGVjLmdldE5hbWUoKSwgdmFsdWVzLCBwcm9maWxlLCBwcm9mRWxlbWVudHMpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwcm9mRWxlbWVudHM7CisKKyAgfQorICAKKyAgLyoqCisgICAqIE1ldGhvZCB0byBhZGQgb25lIG9yIG1vcmUgdmFsdWVzIHRvIGFuIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCwgY3JlYXRpbmcgdGhlIGVsZW1lbnQgaWYgbm90IGV4aXN0aW5nIGFscmVhZHkuCisgICAqIFRoZSBzdXBwbGllZCB2YWx1ZXMgYXJlIGFkZGVkIG9ubHkgaWYgdmFsaWQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFZhbHVlc1RvRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gdmFsdWVzLCBQcm9maWxlIHByb2ZpbGUsIE1hcDxTdHJpbmcsIFByb2ZpbGVFbGVtZW50PiBwcm9mRWxlbWVudHMpIHsKKyAgCQorICAJLy8gdHJ5IHJldHJpZXZlIGV4aXN0aW5nIHByb2ZpbGUgZWxlbWVudAorICAJUHJvZmlsZUVsZW1lbnQgZXBlID0gcHJvZkVsZW1lbnRzLmdldChuYW1lKTsKKyAgCS8vIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90IGZvdW5kCisgIAlpZiAoZXBlPT1udWxsKSB7CisgIAkJIGVwZSA9IG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQocHJvZmlsZSk7CisgIAkgICBlcGUuc2V0TmFtZShuYW1lKTsKKyAgCX0gCisgIAlpZiAodmFsdWVzIT1udWxsKSB7CisgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgCWlmIChTdHJpbmdVdGlscy5oYXNUZXh0KHZhbHVlKSAmJiAhdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisgICAgICAJCWVwZS5nZXRWYWx1ZXMoKS5hZGQodmFsdWUpOworICAgICAgCX0KKyAgICAgIH0KKyAgCX0KKyAgICAvLyBvbmx5IHNhdmUgcHJvZmlsZSBlbGVtZW50cyB3aXRoIG9uZSBvciBtb3JlIHZhbHVlcworICAgIGlmIChlcGUuZ2V0VmFsdWVzKCkuc2l6ZSgpPjApIHByb2ZFbGVtZW50cy5wdXQobmFtZSwgZXBlKTsKKyAgCQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9maWxlQXR0cmlidXRlc1Byb3BlcnR5KFByb2ZpbGVBdHRyaWJ1dGVzIGF0dHIsCisgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoInByb2ZJZCIpKSB7CisgICAgICBhdHRyLnNldElEKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygicHJvZlZlcnNpb24iKSkgeworICAgICAgYXR0ci5zZXRWZXJzaW9uKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygicHJvZlR5cGUiKSkgeworICAgICAgYXR0ci5zZXRUeXBlKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygicHJvZlN0YXR1c0lkIikpIHsKKyAgICAgIGF0dHIuc2V0U3RhdHVzSUQodmFsdWUpOworICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJwcm9mU2VjdXJpdHlUeXBlIikpIHsKKyAgICAgIGF0dHIuc2V0U2VjdXJpdHlUeXBlKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygicHJvZlBhcmVudElkIikpIHsKKyAgICAgIGF0dHIuc2V0UGFyZW50KHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygicHJvZlJlZ0F1dGhvcml0eSIpKSB7CisgICAgICBhdHRyLnNldFJlZ0F1dGhvcml0eSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoInByb2ZDaGlsZElkIikpIHsKKyAgICAgIGF0dHIuZ2V0Q2hpbGRyZW4oKS5hZGRBbGwoQXJyYXlzLmFzTGlzdCh2YWx1ZS5zcGxpdChQYXRoVXRpbHMuREVMSU1JVEVSKSkpOworICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJwcm9mUmV2aXNpb25Ob3RlIikpIHsKKyAgICAgIGF0dHIuZ2V0UmV2aXNpb25Ob3RlcygpLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlLnNwbGl0KFBhdGhVdGlscy5ERUxJTUlURVIpKSk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFJlc291cmNlQXR0cmlidXRlcyhSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzQXR0ciwKKyAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQodmFsdWUpICYmICF2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJudWxsIikpIHsKKyAgICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoIklkZW50aWZpZXIiKSkgeworICAgICAgICByZXNBdHRyLnNldElkZW50aWZpZXIodmFsdWUpOworICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIlRpdGxlIikpIHsKKyAgICAgICAgcmVzQXR0ci5zZXRUaXRsZSh2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiRm9ybWF0IikpIHsKKyAgICAgICAgcmVzQXR0ci5nZXRGb3JtYXRzKCkuYWRkQWxsKCBwYXJzZVZhbHVlcyh2YWx1ZSkgKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJEZXNjcmlwdGlvbiIpKSB7CisgICAgICAgIHJlc0F0dHIuc2V0RGVzY3JpcHRpb24odmFsdWUpOworICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIkNyZWF0b3IiKSkgeworICAgICAgICByZXNBdHRyLmdldENyZWF0b3JzKCkuYWRkQWxsKCBwYXJzZVZhbHVlcyh2YWx1ZSkgKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJTdWJqZWN0IikpIHsKKyAgICAgICAgcmVzQXR0ci5nZXRTdWJqZWN0cygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUHVibGlzaGVyIikpIHsKKyAgICAgICAgcmVzQXR0ci5nZXRQdWJsaXNoZXJzKCkuYWRkQWxsKCBwYXJzZVZhbHVlcyh2YWx1ZSkgKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJDb250cmlidXRvciIpKSB7CisgICAgICAgIHJlc0F0dHIuZ2V0Q29udHJpYnV0b3JzKCkuYWRkQWxsKCBwYXJzZVZhbHVlcyh2YWx1ZSkgKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJEYXRlIikpIHsKKyAgICAgICAgcmVzQXR0ci5nZXREYXRlcygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVHlwZSIpKSB7CisgICAgICAgIHJlc0F0dHIuZ2V0VHlwZXMoKS5hZGRBbGwoIHBhcnNlVmFsdWVzKHZhbHVlKSApOworICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIlNvdXJjZSIpKSB7CisgICAgICAgIHJlc0F0dHIuZ2V0U291cmNlcygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiTGFuZ3VhZ2UiKSkgeworICAgICAgICByZXNBdHRyLmdldExhbmd1YWdlcygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUmVsYXRpb24iKSkgeworICAgICAgICByZXNBdHRyLmdldFJlbGF0aW9ucygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiQ292ZXJhZ2UiKSkgeworICAgICAgICByZXNBdHRyLmdldENvdmVyYWdlcygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUmlnaHRzIikpIHsKKyAgICAgICAgcmVzQXR0ci5nZXRSaWdodHMoKS5hZGRBbGwoIHBhcnNlVmFsdWVzKHZhbHVlKSApOworICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoInJlc0NvbnRleHQiKSkgeworICAgICAgICByZXNBdHRyLmdldFJlc0NvbnRleHRzKCkuYWRkQWxsKCBwYXJzZVZhbHVlcyh2YWx1ZSkgKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJyZXNBZ2dyZWdhdGlvbiIpKSB7CisgICAgICAgIHJlc0F0dHIuc2V0UmVzQWdncmVnYXRpb24odmFsdWUpOworICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoInJlc0NsYXNzIikpIHsKKyAgICAgICAgcmVzQXR0ci5zZXRSZXNDbGFzcyh2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygicmVzTG9jYXRpb24iKSkgeworICAgICAgICByZXNBdHRyLmdldFJlc0xvY2F0aW9ucygpLmFkZEFsbCggcGFyc2VWYWx1ZXModmFsdWUpICk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogVXRpbGl0eSBtZXRob2QgdG8gZGlzY292ZXIgdGhlIHJld3JpdGUgc3BlY2lmaWNhdGlvbiBmb3IgYSBuYW1lZCB2YXJpYWJsZSwgaWYgYXZhaWxhYmxlLgorICAgKiBAcGFyYW0gbmFtZQorICAgKiBAcGFyYW0gY29uZgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgUmV3cml0ZVNwZWMgZ2V0UHJvZmlsZUVsZW1lbnRTcGVjKFN0cmluZyBvcmlnTmFtZSwgT3BlbmRhcENvbmZpZyBjb25mKSB7CisgIAlmb3IgKFJld3JpdGVTcGVjIHNwZWMgOiBjb25mLmdldFJld3JpdGVTcGVjcygpKSB7CisgIAkJaWYgKHNwZWMuZ2V0T3JpZ05hbWUoKS5lcXVhbHMob3JpZ05hbWUpKSB7CisgIAkJCXJldHVybiBzcGVjOworICAJCX0KKyAgCX0KKyAgCXJldHVybiBudWxsOworICB9CisgIAorICAvKioKKyAgICogVXRpbGl0eSBtZXRob2QgdG8gc3BsaXQgYSBtZXRhZGF0YSBmaWVsZCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGtub3duIGRlbGltaXRlci4KKyAgICogQHBhcmFtIHZhbHVlCisgICAqIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHBhcnNlVmFsdWVzKFN0cmluZyB2YWx1ZSkgeworICAJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAJZm9yIChTdHJpbmcgdmFsIDogdmFsdWUuc3BsaXQoUGF0aFV0aWxzLkRFTElNSVRFUikpIHsKKyAgCQlpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dCh2YWwpICYmICF2YWwuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisgIAkJCXZhbHVlcy5hZGQodmFsKTsKKyAgCQl9CisgIAl9CisgIAkKKyAgCXJldHVybiB2YWx1ZXM7CisgIH0KKyAgCisgIC8qKgorICAgKiBNZXRob2QgdG8gYWRkIGEgKG5hbWUsdmFsdWUpIHBhaXIgdG8gdGhlIG1ldGFkYXRhIGNvbnRhaW5lciBpZiB0aGUgdmFsdWUgaXMgbm90IG51bGwgb3IgZW1wdHksCisgICAqIGFuZCBkb2Vzbid0IGV4aXN0IGFscmVhZHkuCisgICAqIEBwYXJhbSBtZXQKKyAgICogQHBhcmFtIGZpZWxkCisgICAqIEBwYXJhbSB2YWx1ZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZElmTm90TnVsbChNZXRhZGF0YSBtZXQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAJLy8gZG8gbm90IGFkZCBhIG51bGwgdmFsdWUKKyAgCWlmIChTdHJpbmdVdGlscy5oYXNUZXh0KHZhbHVlKSAmJiAhdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisgIAkJLy8gZG8gbm90IGFkZCB0aGUgc2FtZSB2YWx1ZSB0d2ljZSBmb3IgdGhlIHNhbWUgbWV0YWRhdGEga2V5CisgIAkJaWYgKCFtZXQuY29udGFpbnNLZXkoa2V5KSB8fCAhbWV0LmdldEFsbE1ldGFkYXRhKGtleSkuY29udGFpbnModmFsdWUpKSB7CisgIAkJCW1ldC5hZGRNZXRhZGF0YShrZXksIHZhbHVlKTsKKyAgCQl9CisgICAgfQorICB9CisgIAorCS8qKgorCSAqIE1ldGhvZCB0byBhZGQgbXVsdGlwbGUgKGtleSwgdmFsdWUpIHBhaXJzIHRvIHRoZSBtZXRhZGF0YSBjb250YWluZXIgaWYgbm90IGV4aXN0aW5nIGFscmVhZHkuCisJICogQHBhcmFtIG1ldAorCSAqIEBwYXJhbSBmaWVsZAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJZk5vdEV4aXN0aW5nKE1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcga2V5LCBFbnVtZXJhdGlvbjxTdHJpbmc+IHZhbHVlcykgeworCQlpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChrZXkpICYmICFtZXRhZGF0YS5jb250YWluc0tleShrZXkpKSB7CisJCQl3aGlsZSAodmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJU3RyaW5nIHZhbHVlID0gdmFsdWVzLm5leHRFbGVtZW50KCk7CisJCQkJaWYgKFN0cmluZ1V0aWxzLmhhc1RleHQodmFsdWUpICYmICF2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJudWxsIikpIHsKKwkJCQkJbWV0YWRhdGEuYWRkTWV0YWRhdGEoa2V5LHZhbHVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisgIAorICAvLyBpbnNwaXJlZCBmcm9tIEFTTHYyIGNvZGUgYXQ6CisgIC8vIGh0dHA6Ly93d3cuamF2YTJzLmNvbS9Db2RlL0phdmEvRGF0YS1UeXBlL0lTTzg2MDFkYXRlcGFyc2luZ3V0aWxpdHkuaHRtCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSVNPODYwMShEYXRlIGRhdGUpIHsKKyAgICBTaW1wbGVEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcydaJyIpOworICAgIFRpbWVab25lIHR6ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpOworICAgIGRmLnNldFRpbWVab25lKHR6KTsKKyAgICBTdHJpbmcgb3V0cHV0ID0gZGYuZm9ybWF0KGRhdGUpOworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzMDA2YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNSBAQAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFNwZWNpZnkgdGhlIGhhbmRsZXJzIHRvIGNyZWF0ZSBpbiB0aGUgcm9vdCBsb2dnZXIKKyMgKGFsbCBsb2dnZXJzIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBsb2dnZXIpCisjIFRoZSBmb2xsb3dpbmcgY3JlYXRlcyB0d28gaGFuZGxlcnMKK2hhbmRsZXJzID0gamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCisgICAgICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKworb3JnLmFwYWNoZS5vb2R0Lm9wZW5kYXBwcy5sZXZlbCA9IElORk8KK29yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMudXRpbC5sZXZlbCA9IElORk8KK29yZy5hcGFjaGUub29kdC5vcGVuZGFwcHMuY29uZmlnLmxldmVsID0gSU5GTworCisjIFRvbmUgZG93biB0aGUgU3VuIGxvZyBtZXNzYWdlcworc3VuLm5ldC53d3cubGV2ZWw9U0VWRVJFClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9vcGVuZGFwcHMvc3JjL21haW4vcmVzb3VyY2VzL29wZW5kYXAuY29uZmlnLnhtbCBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL3Jlc291cmNlcy9vcGVuZGFwLmNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzODEzMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvb3BlbmRhcHBzL3NyYy9tYWluL3Jlc291cmNlcy9vcGVuZGFwLmNvbmZpZy54bWwKQEAgLTAsMCArMSwxOTIgQEAKKzwhLS0gCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgCitEZXNjcmlwdGlvbjogVGhpcyBmaWxlIGRlZmluZXMgYSBzZXQgb2YgaW5mb3JtYXRpb24gdXNlZCBieSBhbiBPT0RUIFByb2ZpbGUgU2VydmVyIAordG8gZXh0cmFjdCBhbmQgZGVsaXZlciBiYWNrIE9PRFQgUHJvZmlsZSBtZXRhZGF0YSBmcm9tIGFuIHVuZGVybHlpbmcgT1BlTkRBUC9USFJFRERTIAorYWNjZXNzaWJsZSBkYXRhIHNvdXJjZS4gVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgYnVpbGRzIG9uIHByaW9yIHdvcmsgdGhhdCB3YXMgb25seSAKK2NvbmZpZ3VyYWJsZSBpbiBKYXZhIGNvZGUsIGJ1dCBpcyBub3cgY29uZmlndXJhYmxlIHZpYSB0aGlzIGZpbGUuCisKKy0tPgorPG9vZHQ6b3BlbmRhcCB4bWxuczpvb2R0PSJodHRwOi8vb29kdC5hcGFjaGUub3JnLzEuMCIgaWQ9InVybjpvb2R0Om9wZW5kYXA6cHNpZCIgbmFtZT0iT1BlTkRBUCBIYW5kbGVyIj4KKworICAgIDwhLS0gCisgICAgICAgQSBzZXQgb2YgVEhSRUREUyBjYXRhbG9nIHJvb3RzIHRvIGRlcml2ZSBkYXRhc2V0cyBmcm9tLiBNdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHJvb3QuCisgICAgICAgCisgICAgICAgZGF0YXNldFVSTCAtIHRoZSBvcmlnaW5hbCBVUkwgdG8gdGhlIFRIUkVERFMgZGF0YXNldC4KKyAgICAgICBjYXRhbG9nVVJMIC0gdGhlIG9yaWdpbmFsIFVSTCB0byB0aGUgVEhSRUREUyBjYXRhbG9nLnhtbCBmaWxlIHVzZWQgdG8gb2J0YWluIGRhdGFzZXQgbWV0YWRhdGEgCisgICAgICAgICAgICAgICAgICAgIGFuZCBpbmZvcm1hdGlvbiBmcm9tLgorICAgICAgIGZpbHRlciAob3B0aW9uYWwpIC0gZGVmaW5lcyBhbiBvcHRpb25hbCBkYXRhc2V0IGZpbHRlciBmb3IgaW5jbHVzaW9uL2V4Y2x1c2lvbi4KKyAgICAKKyAgICAgLS0+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdE1XL2NobGEvY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdE1IL2NobGEvY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdFNXL2NobGEvY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdFNBL2NobGEvY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdEFHL3Rhbm0vY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdEFBL3NzdGEvY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisgICAgPHJvb3QgZGF0YXNldFVSTD0iaHR0cDovL3RocmVkZHMxLnBmZWcubm9hYS5nb3YvdGhyZWRkcy9kb2RzQy8iIGNhdGFsb2dVUkw9Imh0dHA6Ly90aHJlZGRzMS5wZmVnLm5vYWEuZ292L3RocmVkZHMvU2F0ZWxsaXRlL2FnZ3JlZ3NhdE1IL3NzdGQvY2F0YWxvZy54bWwiIGZpbHRlcj0iLioiIC8+CisJCisJCisJPCEtLSAKKwkgICBBIHNldCBvZiBzcGVjaWZpY2F0aW9ucyBmb3IgaG93IHRvIHJld3JpdGUgdGhlIG5hbWVzIG9mIHVuZGVybHlpbmcgT1BlTkRBUC9USFJFRERTIGRhdGFzZXQgdmFyaWFibGVzIAorCSAgIGludG8gcHJvZmlsZSBlbGVtZW50cyB3aXRoaW4gdGhlIGdlbmVyYXRlZCBPT0RUIHByb2ZpbGUuIFRoZXNlIGluZm9ybWF0aW9uIGFyZSB1c2VkIG9ubHkgdG8gdHJhbnNmb3JtIAorCSAgIE9QZU5EQVAgdmFyaWFibGVzIGludG8gT09EVCBwcm9maWxlIGVsZW1lbnRzLiBJZiBhbiBPUGVOREFQIGVsZW1lbnQgcGFydCBvZiBhIGRhdGFzZXQgaXMgbm90IHNwZWNpZmllZCAKKwkgICBpbiB0aGlzIHJld3JpdGUgYmxvY2ssIHRoZSB2YXJpYWJsZSBub3QgYmUgZXh0cmFjdGVkLgorCSAgIAorCSAgIG5hbWU6IFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSBPUGVOREFQIHZhcmlhYmxlLgorCSAgIHJlbmFtZSAob3B0aW9uYWwpOiBXaGF0IHRvIHJlbmFtZSB0aGUgdmFyaWFibGUgdG8gaW4gdGhlIE9PRFQgUHJvZmlsZSBFbGVtZW50cyBzZWN0aW9uLgorCSAgIHR5cGU6IEVpdGhlciBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgb3IgUmFuZ2VkUHJvZmlsZUVsZW1lbnQuIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCBpbmRpY2F0ZXMgdGhpcyBpcyAKKwkgICBhIHZhcmlhYmxlIHdpdGggYSBzZWxlY3Qgdm9jYWJ1bGFyeSBvZiBjaG9pY2VzLCB3aXRoIG11bHRpcGxlIHZhbHVlcyB0byBzcGVjaWZ5IHRob3NlIGNob2ljZXMuIFJhbmdlZFByb2ZpbGVFbGVtZW50IAorCSAgIGluZGljYXRlcyB0aGlzIGlzIGFuIE9QZU5EQVAgdmFyaWFibGUgd2l0aCBhIHNwZWNpZmllZCBtaW4vbWF4IHZhbHVlLgorCQorCSAtLT4KKwk8cmV3cml0ZT4KKwkJPHZhciBuYW1lPSJhbHRpdHVkZSIgdHlwZT0iUmFuZ2VkUHJvZmlsZUVsZW1lbnQiLz4KKwkJPHZhciBuYW1lPSJsYXQiIHJlbmFtZT0ibGF0aXR1ZGUiIHR5cGU9IlJhbmdlZFByb2ZpbGVFbGVtZW50Ii8+CisJCTx2YXIgbmFtZT0ibG9uIiByZW5hbWU9ImxvbmdpdHVkZSIgdHlwZT0iUmFuZ2VkUHJvZmlsZUVsZW1lbnQiLz4KKwkJPHZhciBuYW1lPSJ0aW1lIiB0eXBlPSJSYW5nZWRQcm9maWxlRWxlbWVudCIvPgkJCisJPC9yZXdyaXRlPgorCQorCQorCTwhLS0gCisJICBUSFJFRERTIERhdGFzZXQgbWV0YWRhdGEgdGhhdCB5b3Ugd2FudCB0byBmbG93IGludG8gdGhlIFByb2ZpbGUgCisJICBFbGVtZW50cyBwb3J0aW9uIG9mIHRoZSBwcm9maWxlLiBFYWNoIHNwZWNpZmllZCBkYXRhc2V0IG1ldGFkYXRhIAorCSAgd2lsbCBiZSB0dXJuZWQgaW50byBhbiBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgd2l0aCAxIG9yIG1vcmUgdmFsdWVzLgorCSAgCisJICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgcHJvZmlsZSBlbGVtZW50LgorCSAgdmFsdWU6IFRoZSBkYXRhc2V0IG1ldGFkYXRhIGVsZW1lbnQgdG8gZXh0cmFjdCB0aGUgbWV0YWRhdGEgZnJvbS4gVGhlIAorCSAgZXh0cmFjdGVkIG1ldGFkYXRhIGlzIHNob3ZlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50J3MKKwkgIHZhbHVlIHNldC4JCisJIC0tPgorCTxkYXRhc2V0TWV0YWRhdGE+CisJCisJICAgPCEtLSB2YXJpYWJsZSBuYW1lcyAtLT4KKwkgICA8ZWxlbSBuYW1lPSJ2YXJpYWJsZSIgdmFsdWU9IlZhcmlhYmxlcyIvPgorCSAgIDxlbGVtIG5hbWU9ImNmX3N0YW5kYXJkX25hbWUiIHZhbHVlPSJDRiBTdGFuZGFyZCBOYW1lcyIvPgorCSAgIDxlbGVtIG5hbWU9InZhcmlhYmxlX2xvbmdfbmFtZSIgdmFsdWU9IlZhcmlhYmxlIExvbmcgTmFtZXMiLz4KKwkgICAKKwkgICAJPCEtLSBnZW9zcGF0aWFsIGNvdmVyYWdlIC0tPgorCQk8ZWxlbSBuYW1lPSJzb3V0aF9kZWVncmVlcyIgdmFsdWU9Ikdlb3NwYXRpYWxDb3ZlcmFnZUxhdFNvdXRoIi8+CisJCTxlbGVtIG5hbWU9Im5vcnRoX2RlZWdyZWVzIiB2YWx1ZT0iR2Vvc3BhdGlhbENvdmVyYWdlTGF0Tm9ydGgiLz4KKwkJPGVsZW0gbmFtZT0id2VzdF9kZWVncmVlcyIgdmFsdWU9Ikdlb3NwYXRpYWxDb3ZlcmFnZUxvbldlc3QiLz4KKwkJPGVsZW0gbmFtZT0iZWFzdF9kZWVncmVlcyIgdmFsdWU9Ikdlb3NwYXRpYWxDb3ZlcmFnZUxvbkVhc3QiLz4KKwkJPGVsZW0gbmFtZT0ic3BhdGlhbF9jb3ZlcmFnZSIgdmFsdWU9Ikdlb3NwYXRpYWxDb3ZlcmFnZSIvPgorCQk8ZWxlbSBuYW1lPSJsYXRpdHVkZV9yZXNvbHV0aW9uIiB2YWx1ZT0iR2Vvc3BhdGlhbENvdmVyYWdlTGF0aXR1ZGVSZXNvbHV0aW9uIi8+CisJICAgIDxlbGVtIG5hbWU9ImxvbmdpdHVkZV9yZXNvbHV0aW9uIiB2YWx1ZT0iR2Vvc3BhdGlhbENvdmVyYWdlTG9uZ2l0dWRlUmVzb2x1dGlvbiIvPgorCQorCQk8IS0tIHRlbXBvcmFsIGNvdmVyYWdlIC0tPgorCQk8ZWxlbSBuYW1lPSJkYXRldGltZV9zdGFydCIgdmFsdWU9IlN0YXJ0RGF0ZVRpbWUiLz4KKwkgICAJPGVsZW0gbmFtZT0iZGF0ZXRpbWVfc3RvcCIgdmFsdWU9IkVuZERhdGVUaW1lIi8+CisJICAgIDxlbGVtIG5hbWU9InRlbXBvcmFsX3Jlc29sdXRpb24iIHZhbHVlPSJUaW1lQ292ZXJhZ2VSZXNvbHV0aW9uIi8+CisKKwk8L2RhdGFzZXRNZXRhZGF0YT4KKwkKKwk8IS0tIAorCSAgICBBIHNldCBvZiBjb25zdGFudCBtZXRhZGF0YSB0byBwbHVtYiB0aHJvdWdoIGludG8gdGhlIHByb2ZpbGUsIGVpdGhlciBpbiB0aGUgCisJICAgIHByb2ZpbGVBdHRyaWJ1dGVzIHNlY3Rpb24gb3IgdGhlIHJlc291cmNlQXR0cmlidXRlcyBzZWN0aW9uLiBUaGUgdHlwZSBwYXJhbWV0ZXIKKwkgICAgaW5kaWNhdGVzIHRoZSBzZWN0aW9uIG5hbWUsIGFuZCB0aGUgcmVzdCBvZiB0aGUgYXR0cmlidXRlcyBhcmUgZmFpcmx5IGV2aWRlbnQgZnJvbSB0aGVyZS4KKwkgICAgTm90ZTogdGhlIHZhbHVlIHRhZyBjYW4gdXNlIENBUy9PT0RUIGJhc2VkIGVudmlyb25tZW50IHZhcmlhYmxlIHJlcGxhY2VtZW50LCBieSBzcGVjaWZ5aW5nIAorCSAgICB2YWx1ZXMgd2l0aGluIHRoZSAnWycgYW5kICddJyBkZWxpbWl0ZXJzLCBlLmcuLCBbUFJPRklMRV9SRUdfQVVUSE9SSVRZXS4KKwkgICAgCisJICAgIHR5cGU6IGVpdGhlciBwcm9mQXR0ciwgcmVzQXR0ciwgb3IgcHJvZkVsZW0gdG8gaW5kaWNhdGUgd2hhdCBzZWN0aW9uIGluIHRoZSBwcm9maWxlIHRoZSBpbmZvcm1hdGlvbiAKKwkgICAgc2hvdWxkIGJlIHBhcnQgb2YuIElmIHByb2ZFbGVtIGlzIHNlbGVjdGVkLCB0aGVuIGFuIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCB3aXRoIHRoZSBwcm92aWRlZCAKKwkgICAgdmFsdWVzIHdpbGwgYmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHByb2ZpbGUuCisJICAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9maWxlQXR0cmlidXRlIG9yIHJlc291cmNlQXR0cmlidXRlIGZpZWxkLgorCSAgICB2YWx1ZTogdGhlIHZhbHVlIHRvIGJlIHNldC4KKwkgICAgCisJICAgIAorCSAgICBwcm9mQXR0ciBjYW4gYmUgYW55IG9mOgorCSAgICAgIHByb2ZJZAorCSAgICAgIHByb2ZWZXJzaW9uCisJICAgICAgcHJvZlR5cGUKKwkgICAgICBwcm9mU3RhdHVzSWQKKwkgICAgICBwcm9mU2VjdXJpdHlUeXBlCisJICAgICAgcHJvZlBhcmVudElkCisJICAgICAgcHJvZlJlZ0F1dGhvcml0eQorCSAgICAgIHByb2ZDaGlsZElkCisJICAgICAgcHJvZlJldmlzaW9uTm90ZQorCisgICAgICAgIHJlc0F0dHIgY2FuIGJlIGFueSBvZjoJCisgICAgICAgICAgSWRlbnRpZmllcgorICAgICAgICAgIFRpdGxlCisgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICAgICAgICBDcmVhdG9yCisgICAgICAgICAgU3ViamVjdAorICAgICAgICAgIFB1Ymxpc2hlcgorICAgICAgICAgIENvbnRyaWJ1dG9yCisgICAgICAgICAgRGF0ZQorICAgICAgICAgIFR5cGUKKyAgICAgICAgICBTb3VyY2UKKyAgICAgICAgICBMYW5ndWFnZQorICAgICAgICAgIFJlbGF0aW9uCisgICAgICAgICAgQ292ZXJhZ2UKKyAgICAgICAgICBSaWdodHMKKyAgICAgICAgICByZXNDb250ZXh0CisgICAgICAgICAgcmVzQWdncmVnYXRpb24KKyAgICAgICAgICByZXNDbGFzcworICAgICAgICAgIHJlc0xvY2F0aW9uICAgICAgICAgICAgICAKKwkgLS0+CisJPGNvbnN0YW50cz4KKwkKKwkgICAgPCEtLSBwcm9maWxlIGF0dHJpYnV0ZXMgLS0+CisJICAgIDxjb25zdCB0eXBlPSJwcm9mQXR0ciIgbmFtZT0icHJvZlR5cGUiIHZhbHVlPSJDTURTIE9jZWFuIERhdGFzZXQgUHJvZmlsZSIvPgorCSAgICA8Y29uc3QgdHlwZT0icHJvZkF0dHIiIG5hbWU9InByb2ZTdGF0dXNJZCIgdmFsdWU9ImFjdGl2ZSIvPgorCSAgICA8Y29uc3QgdHlwZT0icHJvZkF0dHIiIG5hbWU9InByb2ZSZWdBdXRob3JpdHkiIHZhbHVlPSJOQVNBIENvYXN0YWwgTWFyaW5lIERhdGEgRGlzY292ZXJ5IFNlcnZpY2UgKENNRFMpIiAvPgorCSAgICA8Y29uc3QgdHlwZT0icHJvZkF0dHIiIG5hbWU9InByb2ZJZCIgdmFsdWU9IltVVUlEXSIvPgorCSAgICA8Y29uc3QgdHlwZT0icHJvZkF0dHIiIG5hbWU9InByb2ZWZXJzaW9uIiB2YWx1ZT0iMS4wIi8+CisJICAgIAkgICAgCisJICAgIDwhLS0gcmVzb3VyY2UgYXR0cmlidXRlcyAtLT4KKwkgICAgPGNvbnN0IHR5cGU9InJlc0F0dHIiIG5hbWU9IklkZW50aWZpZXIiIHZhbHVlPSJbSURdfFtIb3N0XSIgLz4KKyAgICAgICAgPGNvbnN0IHR5cGU9InJlc0F0dHIiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iW0Z1bGxOYW1lXSIgLz4KKyAgICAgICAgPGNvbnN0IHR5cGU9InJlc0F0dHIiIG5hbWU9IkRlc2NyaXB0aW9uIiB2YWx1ZT0iW1N1bW1hcnldIiAvPgorICAgICAgICA8Y29uc3QgdHlwZT0icmVzQXR0ciIgbmFtZT0icmVzTG9jYXRpb24iIHZhbHVlPSJbQWNjZXNzXSIvPgorICAgICAgICA8Y29uc3QgdHlwZT0icmVzQXR0ciIgbmFtZT0iUmlnaHRzIiB2YWx1ZT0iW1JpZ2h0c10iIC8+ICAgICAgIAorICAgICAgICA8Y29uc3QgdHlwZT0icmVzQXR0ciIgbmFtZT0iUmVsYXRpb24iIHZhbHVlPSJbWGxpbmtdIi8+CisJCTxjb25zdCB0eXBlPSJyZXNBdHRyIiBuYW1lPSJQdWJsaXNoZXIiIHZhbHVlPSJbUHVibGlzaGVyXSIgLz4KKwkJPGNvbnN0IHR5cGU9InJlc0F0dHIiIG5hbWU9IkNyZWF0b3IiIHZhbHVlPSJbQ3JlYXRvcl0iIC8+CisJCTxjb25zdCB0eXBlPSJyZXNBdHRyIiBuYW1lPSJUeXBlIiB2YWx1ZT0iW0RhdGFUeXBlXSIvPgorCQk8Y29uc3QgdHlwZT0icmVzQXR0ciIgbmFtZT0iRm9ybWF0IiB2YWx1ZT0iW0RhdGFGb3JtYXRUeXBlXSIvPgorCQk8IS0tIGR5bmFtaWMga2V5d29yZHMgaGFydmVzdGVkIGZyb20gZGF0YSAtLT4KKwkJPGNvbnN0IHR5cGU9InJlc0F0dHIiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJbS2V5d29yZHNdIiAvPgorCQk8IS0tIHN0YXRpYyBrZXl3b3JkcyB0byBzdXBwbGVtZW50IGtleXdvcmRzIGhhcnZlc3RlZCBmcm9tIGRhdGEgLS0+CisJCTxjb25zdCB0eXBlPSJyZXNBdHRyIiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iQ29hc3RhbCBNYXJpbmUgRGF0YSIgLz4KKwkJPGNvbnN0IHR5cGU9InJlc0F0dHIiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJPY2VhbnMiIC8+CisJCTxjb25zdCB0eXBlPSJyZXNBdHRyIiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iQ2xpbWF0ZSBDaGFuZ2UiIC8+CisJCTwhLS0gT09EVCByZXNvdXJjZSBwYXJhbWV0ZXJzIC0tPgorCQk8Y29uc3QgdHlwZT0icmVzQXR0ciIgbmFtZT0icmVzQ2xhc3MiIHZhbHVlPSJkYXRhLmRhdGFTZXQiIC8+CisJCTxjb25zdCB0eXBlPSJyZXNBdHRyIiBuYW1lPSJyZXNDb250ZXh0IiB2YWx1ZT0iT2NlYW5vZ3JhcGh5Ii8+CisJCTxjb25zdCB0eXBlPSJyZXNBdHRyIiBuYW1lPSJyZXNBZ2dyZWdhdGlvbiIgdmFsdWU9ImRhdGFTZXQiLz4KKwkJCisJCTwhLS0gcHJvZmlsZSBlbGVtZW50cyBmcm9tIERBUy9OQ19HTE9CQUwgc2VjdGlvbiAtLT4KKwkJPGNvbnN0IHR5cGU9InByb2ZFbGVtIiBuYW1lPSJtaXNzaW9uX25hbWUiIHZhbHVlPSJbc2F0ZWxsaXRlXSIvPgorCQk8Y29uc3QgdHlwZT0icHJvZkVsZW0iIG5hbWU9InNlbnNvciIgdmFsdWU9IltzZW5zb3JdIi8+CisJCTxjb25zdCB0eXBlPSJwcm9mRWxlbSIgbmFtZT0ic291cmNlIiB2YWx1ZT0iW3NvdXJjZV0iLz4KKwkJPGNvbnN0IHR5cGU9InByb2ZFbGVtIiBuYW1lPSJwcm9qZWN0IiB2YWx1ZT0iW3Byb2plY3RdIi8+CisJCTxjb25zdCB0eXBlPSJwcm9mRWxlbSIgbmFtZT0icHJvY2Vzc2luZ19sZXZlbCIgdmFsdWU9Iltwcm9jZXNzaW5nX2xldmVsXSIvPgorCQk8IS0tIGNvbnN0YW50IHZhbHVlcyAtLT4KKwkJPGNvbnN0IHR5cGU9InByb2ZFbGVtIiBuYW1lPSJzcGF0aWFsX2NvdmVyYWdlIiB2YWx1ZT0iR2xvYmFsIi8+CisJCTxjb25zdCB0eXBlPSJwcm9mRWxlbSIgbmFtZT0iaW5zdGl0dXRlIiB2YWx1ZT0iTk9BQSBDb2FzdFdhdGNoIi8+CisJCQorCQk8IS0tIGNvbnN0YW50cyByZXF1aXJlZCBieSBFU0dGIGhhcnZlc3RpbmcgcHJvY2VzcyAtLT4KKwkJPGNvbnN0IHR5cGU9InByb2ZFbGVtIiBuYW1lPSJtYXN0ZXJfaWQiIHZhbHVlPSJbSURdfFtIb3N0XSIvPgorCQk8Y29uc3QgdHlwZT0icHJvZkVsZW0iIG5hbWU9InR5cGUiIHZhbHVlPSJEYXRhc2V0Ii8+CisJCTxjb25zdCB0eXBlPSJwcm9mRWxlbSIgbmFtZT0iZGF0YV9ub2RlIiB2YWx1ZT0iW0hvc3RdIi8+CisJCTxjb25zdCB0eXBlPSJwcm9mRWxlbSIgbmFtZT0iaW5kZXhfbm9kZSIgdmFsdWU9ImNtZHMtZXNnLmpwbC5uYXNhLmdvdiIvPgorCQkKKwkJCisJPC9jb25zdGFudHM+CisKKzwvb29kdDpvcGVuZGFwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvcG9tLnhtbCBiLzAuMTAvcGNzL2NvcmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk5OTkyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9wb20ueG1sCkBAIC0wLDAgKzEsMTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGFydGlmYWN0SWQ+cGNzLWNvcmU8L2FydGlmYWN0SWQ+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8bmFtZT5Qcm9jZXNzIENvbnRyb2wgU3lzdGVtIENvcmUgUGFja2FnZTwvbmFtZT4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPGRlc2NyaXB0aW9uPlRoZSBQcm9jZXNzIENvbnRyb2wgU3lzdGVtJ3MgY29yZSBzeXN0ZW0gZnJhbWV3b3JrLiBQQ1MgaXMgYW4gYWdnbG9tZXJhdGlvbiBvZiAKKyAgQ0FTIHNlcnZpY2VzIGFuZCBjb21wb25lbnRzIG5lZWRlZCB0byBidWlsZCBhIHNjaWVuY2UgZGF0YSBzeXN0ZW0uCisgIDwvZGVzY3JpcHRpb24+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLm9vZHQucGNzLnRvb2xzLlBDU0hlYWx0aE1vbml0b3I8L21haW5DbGFzcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPiAgICAKKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBjcy1pbnB1dDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtd29ya2Zsb3c8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4gICAgCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcmVzb3VyY2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtY3Jhd2xlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+eG1scnBjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eG1scnBjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBjNDRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKQEAgLTAsMCArMSw3MiBAQAorPCEtLSAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiskSWQkCistLT4NCis8YXNzZW1ibHk+DQorICA8aWQ+ZGlzdDwvaWQ+DQorICA8Zm9ybWF0cz4NCisgICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KKyAgICA8Zm9ybWF0PnppcDwvZm9ybWF0Pg0KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgIDxiYXNlRGlyZWN0b3J5PiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+CisgIDxpbmNsdWRlU2l0ZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZVNpdGVEaXJlY3Rvcnk+DQorICA8ZmlsZVNldHM+DQorICAgIDxmaWxlU2V0Pg0KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5Pg0KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KKyAgICAgICAgPGluY2x1ZGU+Q0hBTkdFUy50eHQ8L2luY2x1ZGU+DQorICAgICAgPC9pbmNsdWRlcz4NCisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2JpbjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5zY3JpcHRzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFTU9WRS5sb2c8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YXV4L3Bjczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5wY3MtY3Jhd2xlcnMueG1sPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5wY3Mtd29ya2Zsb3ctc3RhdHVzZXMueG1sPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5wY3MtbGwtY29uZi54bWw8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPnBjcy5sb2dnaW5nLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4NCisgIDwvZmlsZVNldHM+DQorICA8ZGVwZW5kZW5jeVNldHM+DQorICAgIDxkZXBlbmRlbmN5U2V0Pg0KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPg0KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4NCisgICAgPC9kZXBlbmRlbmN5U2V0Pg0KKyAgPC9kZXBlbmRlbmN5U2V0cz4NCis8L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vYmluL3Bjc19sbCBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vYmluL3Bjc19sbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMTA4NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9iaW4vcGNzX2xsCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi90Y3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgCisjCisjIFRvb2w6ICBMb25nIGxpc3RlcgorIyBQdXJwb3NlOiAgUHJvdmlkZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmb3IgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5LiAgCisjIEludGVyZmFjZTogIENvbW1hbmQtbGluZS4gIElmIG5vIGFyZ3VtZW50cyBwcm92aWRlZCwgYXNzdW1lIHRoZSBjdXJyZW50IAorIyBkaXJlY3RvcnkuICBBcmd1bWVudHMgY2FuIGJlIGEgZGlyZWN0b3J5IG9yIGEgZmlsZW5hbWUgc3BlY2lmaWNhdGlvbiAKKyMgd2l0aCB3aWxkY2FyZHMuCisjIE91dHB1dDogIFRleHQgdG8gc3RhbmRhcmQgb3V0LiAgT25lIGxpbmUgcGVyIGZpbGUuICBGaWVsZHMgb2YgbGluZSAKKyMgKHRhYi1zZXBhcmF0ZWQpOgorIyAgICBGaWxlbmFtZQorIyAgICBUZXN0IFRhZyhzKQorIyAgICBUZXN0IENvdW50ZXIocykKKyMgICAgU3VidGVzdCB0YWcocykKKyMgICAgRGF0YVN0YXJ0VGltZQorIyAgICBEYXRhRW5kVGltZQorIyAgCisjIE5vdGUgdGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHNwZWNpZmljYXRpb25zIGluIHRoZSBwY3MtbGwtY29uZi54bWwgCisjIGZpbGUuCisjCisjIFNhbXBsZSB1c2FnZTogLi9wY3NfbGwKKworCitzZXQgT1JJR19ESVIgPSBgcHdkYAorc2V0IERJUiA9IGBkaXJuYW1lICQwYAorY2QgJERJUgorc2V0IERJUl9QQVRIID0gYHB3ZGAKK2NkICRPUklHX0RJUgorCitqYXZhIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9JERJUl9QQVRILy4uL2F1eC9wY3MvcGNzLmxvZ2dpbmcucHJvcGVydGllcyBcCisgICAgLURqYXZhLmV4dC5kaXJzPSRESVJfUEFUSC8uLi9saWI6JERJUl9QQVRILy4uL2ZpbGVtZ3IvbGliOiRESVJfUEFUSC8uLi93b3JrZmxvdy9saWIgXAorCW9yZy5hcGFjaGUub29kdC5wY3MudG9vbHMuUENTTG9uZ0xpc3RlciBcCisJJEZJTEVNR1JfVVJMICRESVJfUEFUSC8uLi9hdXgvcGNzL3Bjcy1sbC1jb25mLnhtbCAkYXJndlsyLSQjYXJndl0KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vYmluL3Bjc19zdGF0IGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9iaW4vcGNzX3N0YXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmU1Y2RlMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vYmluL3Bjc19zdGF0CkBAIC0wLDAgKzEsNzggQEAKKyMhL2Jpbi90Y3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgCisjCisjIEEgdG9vbCB0byBwcm92aWRlIGEgcmVwb3J0IG9mIHRoZSBoZWFsdGggb2YgdGhlIFBDUy4KKyMgRXhhbXBsZSByZXBvcnQ6CisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBDUyBIZWFsdGggTW9uaXRvciBSZXBvcnQKKyMgR2VuZXJhdGVkIG9uOiAyMDA3LTA3LTEyVDEwOjU2OjIzLjAwMFoKKyMgCisjIFNlcnZpY2UgU3RhdHVzOgorIyAKKyMgRmlsZSBNYW5hZ2VyOiAgICAgICAgICAgIFtodHRwOi8vdm9zdG9rOjkwMDBdOiBVUAorIyBXb3JrZmxvdyBNYW5hZ2VyOiAgW2h0dHA6Ly92b3N0b2s6OTAwMV06IERPV04KKyMgUmVzb3VyY2UgTWFuYWdlcjogW2h0dHA6Ly92b3N0b2s6OTAwMl06IFVQCisjID4gYmF0Y2ggc3R1YjogICBbaHR0cDovL2NvbXB1dGUtMC05OjIwMDFdOiBVUAorIyA+IGJhdGNoIHN0dWI6IFtodHRwOi8vY29tcHV0ZS0wLTEwOjIwMDFdOiBVUAorIworIyBDcmF3bGVyczoKKyMgQ1BUT3ZlcnZpZXc6IFtodHRwOi8vZmxhdGlyb246OTAzMF06ICAgICAgICAgVVAKKyMgQ1BUSGVsaW9zdGF0OiAgW2h0dHA6Ly9mbGF0aXJvbjo5MDMxXTogICAgICAgICBET1dOCisjICAKKyMgUENTIEhlYWx0aDoKKyMgCisjIEZpbGVzOgorIyAtLS0tLS0tLQorIyBsYXN0IHByb2R1Y3QgaW5nZXN0ZWQ6IG9jb19MMWFSYWQwMXdka185MDIzM18wNzA2MDQwMTAwMDUuaGRmIGF0IDIwMDctMDYtMDRUMTA6MDA6MDAuMDAwWgorIworIyBKb2JzOgorIyAtLS0tLS0tLQorIyAxMCB0YXNrcyBRVUVVRUQKKyMgOSAgdGFza3MgQ1JBV0xJTkcKKyMgMSAgdGFza3MgUEdFIEVYRUMKKyMgCisjIEluZ2VzdDoKKyMgLS0tLS0tLS0KKyMgQ1BUT3ZlcnZpZXc6CisjIAorIyBudW1iZXIgb2YgY3Jhd2xzOiAxMAorIyBhdmVyYWdlIGNyYXdsIHRpbWUgKG1zKTogNTAKKyMgCisjIENQVEhlbGlvc3RhdDoKKyMgCisjIG51bWJlciBvZiBjcmF3bHM6IDU2CisjIGF2ZXJhZ2UgY3Jhd2wgdGltZSAobXMpOiAxMAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAKKyMgU2FtcGxlIHVzYWdlOiAuL3Bjc19zdGF0CisKK3NldCBPUklHX0RJUiA9IGBwd2RgCitzZXQgRElSID0gYGRpcm5hbWUgJDBgCitjZCAkRElSCitzZXQgRElSX1BBVEggPSBgcHdkYAorY2QgJE9SSUdfRElSCisKK2phdmEgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0kRElSX1BBVEgvLi4vYXV4L3Bjcy9wY3MubG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAtRGphdmEuZXh0LmRpcnM9JERJUl9QQVRILy4uL2xpYjokRElSX1BBVEgvLi4vZmlsZW1nci9saWI6JERJUl9QQVRILy4uL3dvcmtmbG93L2xpYjouLi9yZXNtZ3IvbGliIFwKKyAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5wcm9wZXJ0aWVzPSRESVJfUEFUSC8uLi9maWxlbWdyL2V0Yy9maWxlbWdyLnByb3BlcnRpZXMgXAorCW9yZy5hcGFjaGUub29kdC5wY3MudG9vbHMuUENTSGVhbHRoTW9uaXRvciBcCisJJEZJTEVNR1JfVVJMIFwKKwkkV09SS0ZMT1dfVVJMIFwKKwkkUkVTTUdSX1VSTCBcCisJJERJUl9QQVRILy4uL2F1eC9wY3MvcGNzLWNyYXdsZXJzLnhtbCBcCisJJERJUl9QQVRILy4uL2F1eC9wY3MvcGNzLXdvcmtmbG93LXN0YXR1c2VzLnhtbApkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9iaW4vcGNzX3RyYWNlIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9iaW4vcGNzX3RyYWNlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmMGViMDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2Jpbi9wY3NfdHJhY2UKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3Rjc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAKKyMKKyMgUENTIFRyYWNlIHV0aWxpdHkgdG8gZGlzY292ZXIgcHJvZHVjdCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgbGluZWFnZQorIyB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSwgbWV0YWRhdGEsIHBpcGVsaW5lIGluZm9ybWF0aW9uIGFuZCB0aGUgbGlrZQorIworIyBTYW1wbGUgdXNhZ2U6IC4vcGNzX3RyYWNlIG9jb19MMDMzU3VuMDFTdW5fOTE2MDFfMDcwOTIyMDU0ODM5LnBrdAorCisKK3NldCBESVIgPSBgZGlybmFtZSAkMGAKK2NkICRESVIKK3NldCBESVJfUEFUSCA9IGBwd2RgCisKK2lmICggJCNhcmd2ICE9IDEgKSB0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxwcm9kdWN0PiIKKwlleGl0IDEKK2Vsc2UKKwlqYXZhIC1EamF2YS5leHQuZGlycz0kRElSX1BBVEgvLi4vbGliOiRESVJfUEFUSC8uLi9maWxlbWdyL2xpYjokRElSX1BBVEgvLi4vd29ya2Zsb3cvbGliIFwKKyAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSRESVJfUEFUSC8uLi9hdXgvcGNzL3Bjcy5sb2dnaW5nLnByb3BlcnRpZXMgXAorICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnByb3BlcnRpZXM9JERJUl9QQVRILy4uL2ZpbGVtZ3IvZXRjL2ZpbGVtZ3IucHJvcGVydGllcyBcCisJb3JnLmFwYWNoZS5vb2R0LnBjcy50b29scy5QQ1NUcmFjZSBcCisJLS1mbSAkRklMRU1HUl9VUkwgXAorCS0td20gJFdPUktGTE9XX1VSTCBcCisJLS1wcm9kdWN0ICQxIFwKKwktLWVuYWJsZU5vbkNhdAorZW5kaWYKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bEluZm8uamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJlMDlkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL0NyYXdsSW5mby5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGNyYXdsZXI6IGl0cyA8Y29kZT5jcmF3bGVyTmFtZTwvY29kZT4gYW5kCisgKiA8Y29kZT5jcmF3bGVyUG9ydDwvY29kZT4uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENyYXdsSW5mbyB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgY3Jhd2xlck5hbWU7CisKKyAgcHJpdmF0ZSBTdHJpbmcgY3Jhd2xlclBvcnQ7CisKKyAgLyoqCisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAqIAorICAgKi8KKyAgcHVibGljIENyYXdsSW5mbygpIHsKKworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgQ3Jhd2xJbmZvIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgKiAKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENyYXdsZXIuCisgICAqIEBwYXJhbSBwb3J0CisgICAqICAgICAgICAgIFRoZSBwb3J0IHRoYXQgdGhlIENyYXdsZXIgd2FzIHJ1bm5pbmcgb24uCisgICAqLworICBwdWJsaWMgQ3Jhd2xJbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcgcG9ydCkgeworICAgIHRoaXMuY3Jhd2xlck5hbWUgPSBuYW1lOworICAgIHRoaXMuY3Jhd2xlclBvcnQgPSBwb3J0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNyYXdsZXJOYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENyYXdsZXJOYW1lKCkgeworICAgIHJldHVybiBjcmF3bGVyTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY3Jhd2xlck5hbWUKKyAgICogICAgICAgICAgdGhlIGNyYXdsZXJOYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q3Jhd2xlck5hbWUoU3RyaW5nIGNyYXdsZXJOYW1lKSB7CisgICAgdGhpcy5jcmF3bGVyTmFtZSA9IGNyYXdsZXJOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNyYXdsZXJQb3J0CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENyYXdsZXJQb3J0KCkgeworICAgIHJldHVybiBjcmF3bGVyUG9ydDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY3Jhd2xlclBvcnQKKyAgICogICAgICAgICAgdGhlIGNyYXdsZXJQb3J0IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q3Jhd2xlclBvcnQoU3RyaW5nIGNyYXdsZXJQb3J0KSB7CisgICAgdGhpcy5jcmF3bGVyUG9ydCA9IGNyYXdsZXJQb3J0OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bFByb3BlcnRpZXNGaWxlLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9oZWFsdGgvQ3Jhd2xQcm9wZXJ0aWVzRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmJmYTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9oZWFsdGgvQ3Jhd2xQcm9wZXJ0aWVzRmlsZS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRUNvbmZpZ3VyYXRpb25GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQuUEdFR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dC5QR0VDb25maWdGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIAorICogUHJvcGVydGllcyB1c2VkIGJ5IHRoZSB7QGxpbmsgUENTSGVhbHRoTW9uaXRvcn0gdG9vbCB0byBkZXRlcm1pbmUKKyAqIHtAbGluayBQcm9kdWN0Q3Jhd2xlcn0gc3RhdHVzLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDcmF3bFByb3BlcnRpZXNGaWxlIGltcGxlbWVudHMgQ3Jhd2xlclByb3BlcnRpZXNNZXRLZXlzIHsKKworICBwcml2YXRlIFBHRUNvbmZpZ3VyYXRpb25GaWxlIGZpbGU7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgQ3Jhd2xQcm9wZXJ0aWVzRmlsZS4KKyAgICogCisgICAqIEBwYXJhbSBmaWxlUGF0aAorICAgKiAgICAgICAgICBUaGUgcGF0aCB0byB0aGUgQ3Jhd2xQcm9wZXJ0aWVzRmlsZSB0byBsb2FkLgorICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIHNvbWUgZXJyb3IgcmVhZGluZyB0aGUgZmlsZS4KKyAgICovCisgIHB1YmxpYyBDcmF3bFByb3BlcnRpZXNGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB0aGlzLmZpbGUgPSBuZXcgUEdFQ29uZmlnRmlsZVJlYWRlcigpLnJlYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBDcmF3bEluZm99IG9iamVjdHMgZGVzY3JpYmluZyBhIENyYXdsZXIuCisgICAqLworICBwdWJsaWMgTGlzdCBnZXRDcmF3bGVycygpIHsKKyAgICBQR0VHcm91cCBjcmF3bEluZm8gPSAoUEdFR3JvdXApIHRoaXMuZmlsZS5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldCgKKyAgICAgICAgQ1JBV0xFUl9JTkZPX0dST1VQKTsKKworICAgIE1hcCBzY2FsYXJzID0gY3Jhd2xJbmZvLmdldFNjYWxhcnMoKTsKKyAgICBMaXN0IGNyYXdsZXJzID0gbmV3IFZlY3RvcihzY2FsYXJzLmtleVNldCgpLnNpemUoKSk7CisgICAgZm9yIChJdGVyYXRvciBpID0gc2NhbGFycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFN0cmluZyBjcmF3bGVyTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgU3RyaW5nIGNyYXdsZXJQb3J0ID0gY3Jhd2xJbmZvLmdldFNjYWxhcihjcmF3bGVyTmFtZSkuZ2V0VmFsdWUoKTsKKyAgICAgIENyYXdsSW5mbyBpbmZvID0gbmV3IENyYXdsSW5mbyhjcmF3bGVyTmFtZSwgY3Jhd2xlclBvcnQpOworICAgICAgY3Jhd2xlcnMuYWRkKGluZm8pOworICAgIH0KKworICAgIHJldHVybiBjcmF3bGVyczsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogQHJldHVybiBUaGUgU3RyaW5nIGhvc3RuYW1lIHRoYXQgdGhlIENyYXdsZXJzIHJ1biBvbi4gVGhpcyBpcyB1c2VkIGJ5IHRoZQorICAgKiAgICAgICAgIHtAbGluayBQQ1NIZWFsdGhNb25pdG9yfSB0b29sIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIENyYXdsZXJzIGFuZAorICAgKiAgICAgICAgIHRvIGNoZWNrIHRoZWlyIHN0YXR1cy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q3Jhd2xIb3N0KCkgeworICAgIFN0cmluZyBjcmF3bEhvc3QgPSAoKFBHRUdyb3VwKSB0aGlzLmZpbGUuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoCisgICAgICAgIENSQVdMRVJfUFJPUEVSVElFU19HUk9VUCkpLmdldFNjYWxhcihDUkFXTEVSX0hPU1RfTkFNRSkuZ2V0VmFsdWUoKTsKKyAgICBjcmF3bEhvc3QgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjcmF3bEhvc3QpOworICAgIHJldHVybiBjcmF3bEhvc3Q7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL0NyYXdsZXJIZWFsdGguamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bGVySGVhbHRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4MmU1ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bGVySGVhbHRoLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmRhZW1vbi5DcmF3bERhZW1vbjsgLy9mb3IgamF2YWRvYworCisvKioKKyAqIAorICogSGVhbHRoIG9mIGEgUENTIENyYXdsZXIgaW4gdGVybXMgb2YgdGhlIG51bWJlciBvZiBjcmF3bHMgcGVyZm9ybWVkLCBhbmQKKyAqIGF2ZXJhZ2UgY3Jhd2wgdGltZSBwcm92aWRlZCBieSBhIHtAbGluayBDcmF3bERhZW1vbn0KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDcmF3bGVySGVhbHRoIHsKKworICBwcml2YXRlIFN0cmluZyBjcmF3bGVyTmFtZTsKKworICBwcml2YXRlIGludCBudW1DcmF3bHM7CisKKyAgcHJpdmF0ZSBkb3VibGUgYXZnQ3Jhd2xUaW1lOworCisgIC8qKgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKiAKKyAgICovCisgIHB1YmxpYyBDcmF3bGVySGVhbHRoKCkgeworCisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBDcmF3bGVySGVhbHRoIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gY3Jhd2xlck5hbWUKKyAgICogICAgICAgICAgTmFtZSBvZiB0aGUgQ3Jhd2xlci4KKyAgICogQHBhcmFtIG51bUNyYXdscworICAgKiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNyYXdscyBwZXJmb3JtZWQuCisgICAqIEBwYXJhbSBhdmdDcmF3bFRpbWUKKyAgICogICAgICAgICAgVGhlIGF2ZXJhZ2UgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhIENyYXdsZXIgc3BlbmRzIGR1cmluZyBlYWNoCisgICAqICAgICAgICAgIGNyYXdsLgorICAgKi8KKyAgcHVibGljIENyYXdsZXJIZWFsdGgoU3RyaW5nIGNyYXdsZXJOYW1lLCBpbnQgbnVtQ3Jhd2xzLCBkb3VibGUgYXZnQ3Jhd2xUaW1lKSB7CisgICAgdGhpcy5jcmF3bGVyTmFtZSA9IGNyYXdsZXJOYW1lOworICAgIHRoaXMubnVtQ3Jhd2xzID0gbnVtQ3Jhd2xzOworICAgIHRoaXMuYXZnQ3Jhd2xUaW1lID0gYXZnQ3Jhd2xUaW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGF2Z0NyYXdsVGltZQorICAgKi8KKyAgcHVibGljIGRvdWJsZSBnZXRBdmdDcmF3bFRpbWUoKSB7CisgICAgcmV0dXJuIGF2Z0NyYXdsVGltZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXZnQ3Jhd2xUaW1lCisgICAqICAgICAgICAgIHRoZSBhdmdDcmF3bFRpbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRBdmdDcmF3bFRpbWUoZG91YmxlIGF2Z0NyYXdsVGltZSkgeworICAgIHRoaXMuYXZnQ3Jhd2xUaW1lID0gYXZnQ3Jhd2xUaW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNyYXdsZXJOYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENyYXdsZXJOYW1lKCkgeworICAgIHJldHVybiBjcmF3bGVyTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY3Jhd2xlck5hbWUKKyAgICogICAgICAgICAgdGhlIGNyYXdsZXJOYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q3Jhd2xlck5hbWUoU3RyaW5nIGNyYXdsZXJOYW1lKSB7CisgICAgdGhpcy5jcmF3bGVyTmFtZSA9IGNyYXdsZXJOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG51bUNyYXdscworICAgKi8KKyAgcHVibGljIGludCBnZXROdW1DcmF3bHMoKSB7CisgICAgcmV0dXJuIG51bUNyYXdsczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbnVtQ3Jhd2xzCisgICAqICAgICAgICAgIHRoZSBudW1DcmF3bHMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROdW1DcmF3bHMoaW50IG51bUNyYXdscykgeworICAgIHRoaXMubnVtQ3Jhd2xzID0gbnVtQ3Jhd2xzOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bGVyUHJvcGVydGllc01ldEtleXMuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bGVyUHJvcGVydGllc01ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTFkZDhkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL0NyYXdsZXJQcm9wZXJ0aWVzTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLyoqCisgKiAKKyAqIE1ldCBrZXlzIHJlYWQgZnJvbSB0aGUge0BsaW5rIENyYXdsUHJvcGVydGllc0ZpbGV9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ3Jhd2xlclByb3BlcnRpZXNNZXRLZXlzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkFXTEVSX0lORk9fR1JPVVAgPSAiQ3Jhd2xlckluZm8iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSQVdMRVJfUFJPUEVSVElFU19HUk9VUCA9ICJDcmF3bFByb3BlcnRpZXMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSQVdMRVJfSE9TVF9OQU1FID0gIkhvc3RuYW1lIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL0NyYXdsZXJTdGF0dXMuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bGVyU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MDRkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9DcmF3bGVyU3RhdHVzLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLyoqCisgKiBQcm92aWRlcyBzdGF0dXMgYWJvdXQgYSBDcmF3bGVyIHRvIHRoZSB7QGxpbmsgUENTSGVhbHRoTW9uaXRvcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENyYXdsZXJTdGF0dXMgeworCisgICAgcHJpdmF0ZSBDcmF3bEluZm8gaW5mbzsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIHByaXZhdGUgU3RyaW5nIGNyYXdsSG9zdDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICogCisgICAgICovCisgICAgcHVibGljIENyYXdsZXJTdGF0dXMoKSB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IENyYXdsZXJTdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5mbworICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBDcmF3bGVySW5mb30gZGVzY3JpYmluZyB0aGlzIENyYXdsZXIuCisgICAgICogQHBhcmFtIHN0YXR1cworICAgICAqICAgICAgICAgICAgT25lIG9mIHtAbGluayBQQ1NIZWFsdGhNb25pdG9yTWV0S2V5cyNTVEFUVVNfVVB9ICwgb3IKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQQ1NIZWFsdGhNb25pdG9yTWV0S2V5cyNTVEFUVVNfRE9XTn0uCisgICAgICogCisgICAgICogQHBhcmFtIGNyYXdsSG9zdAorICAgICAqICAgICAgICAgICAgVGhlIGhvc3QgdGhhdCB0aGUgQ3Jhd2xlciBpcyBydW5uaW5nIG9uLgorICAgICAqLworICAgIHB1YmxpYyBDcmF3bGVyU3RhdHVzKENyYXdsSW5mbyBpbmZvLCBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgY3Jhd2xIb3N0KSB7CisgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICB0aGlzLmNyYXdsSG9zdCA9IGNyYXdsSG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZvCisgICAgICovCisgICAgcHVibGljIENyYXdsSW5mbyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaW5mbworICAgICAqICAgICAgICAgICAgdGhlIGluZm8gdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5mbyhDcmF3bEluZm8gaW5mbykgeworICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdGF0dXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY3Jhd2xIb3N0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDcmF3bEhvc3QoKSB7CisgICAgICAgIHJldHVybiBjcmF3bEhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNyYXdsSG9zdAorICAgICAqICAgICAgICAgICAgdGhlIGNyYXdsSG9zdCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmF3bEhvc3QoU3RyaW5nIGNyYXdsSG9zdCkgeworICAgICAgICB0aGlzLmNyYXdsSG9zdCA9IGNyYXdsSG9zdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9Kb2JIZWFsdGhTdGF0dXMuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9Kb2JIZWFsdGhTdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQzNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL0pvYkhlYWx0aFN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsgLy9mb3IgamF2YWRvYworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1N0YXR1czsgLy9mb3IgamF2YWRvYworCisvKioKKyAqIAorICogQSBjb250YWluZXIgcmVwcmVzZW50aW5nIEpvYiBoZWFsdGggc3RhdHVzIGluIHRoZSBQQ1MKKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSm9iSGVhbHRoU3RhdHVzIHsKKworICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgcHJpdmF0ZSBpbnQgbnVtUGlwZWxpbmVzOworCisgIHB1YmxpYyBKb2JIZWFsdGhTdGF0dXMoKSB7CisKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgSm9iSGVhbHRoU3RhdHVzIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gc3RhdHVzCisgICAqICAgICAgICAgIFRoZSBKb2Igc3RhdHVzLCBvbmUgb2Yge0BsaW5rIFdvcmtmbG93U3RhdHVzI1NUQVJURUR9LCBvciBhbnkgb2YKKyAgICogICAgICAgICAgdGhlIG90aGVyIFdvcmtmbG93U3RhdHVzIGtleXMuCisgICAqIAorICAgKiBAcGFyYW0gbnVtUGlwZWxpbmVzCisgICAqICAgICAgICAgIFRoZSBudW1iZXIgb2Yge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cyB3aXRoIHRoZSBnaXZlbgorICAgKiAgICAgICAgICB7QGxpbmsgV29ya2Zsb3dTdGF0dXN9LgorICAgKi8KKyAgcHVibGljIEpvYkhlYWx0aFN0YXR1cyhTdHJpbmcgc3RhdHVzLCBpbnQgbnVtUGlwZWxpbmVzKSB7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgdGhpcy5udW1QaXBlbGluZXMgPSBudW1QaXBlbGluZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbnVtUGlwZWxpbmVzCisgICAqLworICBwdWJsaWMgaW50IGdldE51bVBpcGVsaW5lcygpIHsKKyAgICByZXR1cm4gbnVtUGlwZWxpbmVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBudW1QaXBlbGluZXMKKyAgICogICAgICAgICAgdGhlIG51bVBpcGVsaW5lcyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE51bVBpcGVsaW5lcyhpbnQgbnVtUGlwZWxpbmVzKSB7CisgICAgdGhpcy5udW1QaXBlbGluZXMgPSBudW1QaXBlbGluZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgc3RhdHVzCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzdGF0dXMKKyAgICogICAgICAgICAgdGhlIHN0YXR1cyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL1BDU0RhZW1vblN0YXR1cy5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL1BDU0RhZW1vblN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2Q0OGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9oZWFsdGgvUENTRGFlbW9uU3RhdHVzLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNpbXBsZSBkYXRhIHN0cnVjdHVyZSB0byBjYXB0dXJlIHRoZSBzdGF0dXMgb2YgYSBQQ1MgZGFlbW9uIChlaXRoZXIgdGhlCisgKiBGaWxlIE1hbmFnZXIsIHRoZSBXb3JrZmxvdyBNYW5hZ2VyLCBvciB0aGUgUmVzb3VyY2UgTWFuYWdlcikKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBQQ1NEYWVtb25TdGF0dXMgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGFlbW9uTmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIHVybFN0cjsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICogCisgICAgICovCisgICAgcHVibGljIFBDU0RhZW1vblN0YXR1cygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBDU0RhZW1vblN0YXR1cyB3aXRoIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGRhZW1vbk5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBQQ1MgRGFlbW9uLgorICAgICAqIEBwYXJhbSB1cmxTdHIKKyAgICAgKiAgICAgICAgICAgIEEgU3Rpcm5nIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFVSTH0gdGhhdCB0aGlzIGRhZW1vbiBydW5zCisgICAgICogICAgICAgICAgICBvbi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzCisgICAgICogICAgICAgICAgICBPbmUgb2Yge0BsaW5rIFBDU0hlYWx0aE1vbml0b3JNZXRLZXlzI1NUQVRVU19VUH0gLCBvcgorICAgICAqICAgICAgICAgICAge0BsaW5rIFBDU0hlYWx0aE1vbml0b3JNZXRLZXlzI1NUQVRVU19ET1dOfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUENTRGFlbW9uU3RhdHVzKFN0cmluZyBkYWVtb25OYW1lLCBTdHJpbmcgdXJsU3RyLCBTdHJpbmcgc3RhdHVzKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuZGFlbW9uTmFtZSA9IGRhZW1vbk5hbWU7CisgICAgICAgIHRoaXMudXJsU3RyID0gdXJsU3RyOworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBkYWVtb25OYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREYWVtb25OYW1lKCkgeworICAgICAgICByZXR1cm4gZGFlbW9uTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGFlbW9uTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGRhZW1vbk5hbWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGFlbW9uTmFtZShTdHJpbmcgZGFlbW9uTmFtZSkgeworICAgICAgICB0aGlzLmRhZW1vbk5hbWUgPSBkYWVtb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdGF0dXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdXJsU3RyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVcmxTdHIoKSB7CisgICAgICAgIHJldHVybiB1cmxTdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHVybFN0cgorICAgICAqICAgICAgICAgICAgdGhlIHVybFN0ciB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmxTdHIoU3RyaW5nIHVybFN0cikgeworICAgICAgICB0aGlzLnVybFN0ciA9IHVybFN0cjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9QQ1NIZWFsdGhNb25pdG9yTWV0S2V5cy5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL1BDU0hlYWx0aE1vbml0b3JNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4ZmViNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9QQ1NIZWFsdGhNb25pdG9yTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLyoqCisgKiBNZXQga2V5cyBmb3IgdGhlIHtAbGluayBQQ1NIZWFsdGhNb25pdG9yfSB0b29sCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBQQ1NIZWFsdGhNb25pdG9yTWV0S2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FORF9GT09URVIgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fU0VQQVJBVE9SID0gIi0tLS0tLS0tIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfQkFOTkVSID0gIlBDUyBIZWFsdGggTW9uaXRvciBSZXBvcnQiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTUFOQUdFUl9EQUVNT05fTkFNRSA9ICJGaWxlIE1hbmFnZXIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktGTE9XX01BTkFHRVJfREFFTU9OX05BTUUgPSAiV29ya2Zsb3cgTWFuYWdlciI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTUFOQUdFUl9EQUVNT05fTkFNRSA9ICJSZXNvdXJjZSBNYW5hZ2VyIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRDSF9TVFVCX0RBRU1PTl9OQU1FID0gImJhdGNoIHN0dWIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19VUCA9ICJVUCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX0RPV04gPSAiRE9XTiI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX05fUFJPRFVDVFMgPSAyMDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkFXTEVSX0RPV05fSU5UID0gLTE7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgQ1JBV0xFUl9ET1dOX0RPVUJMRSA9IC0xLjA7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9QQ1NIZWFsdGhNb25pdG9yUmVwb3J0LmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9oZWFsdGgvUENTSGVhbHRoTW9uaXRvclJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjU4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9oZWFsdGgvUENTSGVhbHRoTW9uaXRvclJlcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGg7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy50b29scy5QQ1NIZWFsdGhNb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7IC8vZm9yIGphdmFkb2MKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5leHRlcm4uWG1sUnBjQmF0Y2hTdHViOyAvL2ZvciBqYXZhZG9jCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogCisgKiBUaGUgb3V0cHV0IGdlbmVyYXRlZCBmcm9tIHJ1bm5pbmcgdGhlIHtAbGluayBQQ1NIZWFsdGhNb25pdG9yI2dldFJlcG9ydCgpfQorICogbWV0aG9kLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHsKKworICBwcml2YXRlIERhdGUgZ2VuZXJhdGlvbkRhdGU7CisKKyAgcHJpdmF0ZSBQQ1NEYWVtb25TdGF0dXMgZm1TdGF0dXM7CisKKyAgcHJpdmF0ZSBQQ1NEYWVtb25TdGF0dXMgd21TdGF0dXM7CisKKyAgcHJpdmF0ZSBQQ1NEYWVtb25TdGF0dXMgcm1TdGF0dXM7CisKKyAgcHJpdmF0ZSBMaXN0IGJhdGNoU3R1YlN0YXR1czsKKworICBwcml2YXRlIExpc3QgY3Jhd2xlclN0YXR1czsKKworICBwcml2YXRlIExpc3QgbGF0ZXN0UHJvZHVjdHNJbmdlc3RlZDsKKworICBwcml2YXRlIExpc3Qgam9iSGVhbHRoU3RhdHVzOworCisgIHByaXZhdGUgTGlzdCBjcmF3bGVySGVhbHRoU3RhdHVzOworCisgIC8qKgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKiAKKyAgICovCisgIHB1YmxpYyBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0KCkgeworCisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gZ2VuZXJhdGlvbkRhdGUKKyAgICogICAgICAgICAgVGhlIHtAbGluayBEYXRlfSB0aGF0IHRoaXMgcmVwb3J0IHdhcyBnZW5lcmF0ZWQuCisgICAqIEBwYXJhbSBmbVN0YXR1cworICAgKiAgICAgICAgICBUaGUge0BsaW5rIFBDU0RhZW1vblN0YXR1c30gZm9yIHRoZSBGaWxlIE1hbmFnZXIuCisgICAqIEBwYXJhbSB3bVN0YXR1cworICAgKiAgICAgICAgICBUaGUge0BsaW5rIFBDU0RhZW1vblN0YXR1c30gZm9yIHRoZSBXb3JrZmxvdyBNYW5hZ2VyLgorICAgKiBAcGFyYW0gcm1TdGF0dXMKKyAgICogICAgICAgICAgVEhlIHtAbGluayBQQ1NEYWVtb25TdGF0dXN9IGZvciB0aGUgUmVzb3VyY2UgTWFuYWdlci4KKyAgICogQHBhcmFtIGJhdGNoU3R1YlN0YXR1cworICAgKiAgICAgICAgICBBIHtAbGlrIExpc3R9IG9mIHtAbGluayBQQ1NEYWVtb25TdGF0dXN9ZXMgZm9yIGVhY2gKKyAgICogICAgICAgICAge0BsaW5rIFhtbFJwY0JhdGNoU3R1Yn0uCisgICAqIEBwYXJhbSBjcmF3bGVyU3RhdHVzCisgICAqICAgICAgICAgIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBDcmF3bGVyU3RhdHVzfWVzLgorICAgKiBAcGFyYW0gbGF0ZXN0UHJvZHVjdHNJbmdlc3RlZAorICAgKiAgICAgICAgICBBIHtAbGluayBMaXN0fSBvZiB0aGUgdG9wIE4ge0BsaW5rIFByb2R1Y3R9cyB0aGF0IGhhdmUgYmVlbgorICAgKiAgICAgICAgICBpbmdlc3RlZC4KKyAgICogQHBhcmFtIGpvYkhlYWx0aFN0YXR1cworICAgKiAgICAgICAgICBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgSm9iSGVhbHRoU3RhdHVzfWVzLgorICAgKiBAcGFyYW0gY3Jhd2xlckhlYWx0aFN0YXR1cworICAgKiAgICAgICAgICBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgQ3Jhd2xlckhlYWx0aH1zLgorICAgKi8KKyAgcHVibGljIFBDU0hlYWx0aE1vbml0b3JSZXBvcnQoRGF0ZSBnZW5lcmF0aW9uRGF0ZSwgUENTRGFlbW9uU3RhdHVzIGZtU3RhdHVzLAorICAgICAgUENTRGFlbW9uU3RhdHVzIHdtU3RhdHVzLCBQQ1NEYWVtb25TdGF0dXMgcm1TdGF0dXMsIExpc3QgYmF0Y2hTdHViU3RhdHVzLAorICAgICAgTGlzdCBjcmF3bGVyU3RhdHVzLCBMaXN0IGxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQsIExpc3Qgam9iSGVhbHRoU3RhdHVzLAorICAgICAgTGlzdCBjcmF3bGVySGVhbHRoU3RhdHVzKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLmdlbmVyYXRpb25EYXRlID0gZ2VuZXJhdGlvbkRhdGU7CisgICAgdGhpcy5mbVN0YXR1cyA9IGZtU3RhdHVzOworICAgIHRoaXMud21TdGF0dXMgPSB3bVN0YXR1czsKKyAgICB0aGlzLnJtU3RhdHVzID0gcm1TdGF0dXM7CisgICAgdGhpcy5iYXRjaFN0dWJTdGF0dXMgPSBiYXRjaFN0dWJTdGF0dXM7CisgICAgdGhpcy5jcmF3bGVyU3RhdHVzID0gY3Jhd2xlclN0YXR1czsKKyAgICB0aGlzLmxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQgPSBsYXRlc3RQcm9kdWN0c0luZ2VzdGVkOworICAgIHRoaXMuam9iSGVhbHRoU3RhdHVzID0gam9iSGVhbHRoU3RhdHVzOworICAgIHRoaXMuY3Jhd2xlckhlYWx0aFN0YXR1cyA9IGNyYXdsZXJIZWFsdGhTdGF0dXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgYmF0Y2hTdHViU3RhdHVzCisgICAqLworICBwdWJsaWMgTGlzdCBnZXRCYXRjaFN0dWJTdGF0dXMoKSB7CisgICAgcmV0dXJuIGJhdGNoU3R1YlN0YXR1czsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYmF0Y2hTdHViU3RhdHVzCisgICAqICAgICAgICAgIHRoZSBiYXRjaFN0dWJTdGF0dXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRCYXRjaFN0dWJTdGF0dXMoTGlzdCBiYXRjaFN0dWJTdGF0dXMpIHsKKyAgICB0aGlzLmJhdGNoU3R1YlN0YXR1cyA9IGJhdGNoU3R1YlN0YXR1czsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjcmF3bGVySGVhbHRoU3RhdHVzCisgICAqLworICBwdWJsaWMgTGlzdCBnZXRDcmF3bGVySGVhbHRoU3RhdHVzKCkgeworICAgIHJldHVybiBjcmF3bGVySGVhbHRoU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjcmF3bGVySGVhbHRoU3RhdHVzCisgICAqICAgICAgICAgIHRoZSBjcmF3bGVySGVhbHRoU3RhdHVzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q3Jhd2xlckhlYWx0aFN0YXR1cyhMaXN0IGNyYXdsZXJIZWFsdGhTdGF0dXMpIHsKKyAgICB0aGlzLmNyYXdsZXJIZWFsdGhTdGF0dXMgPSBjcmF3bGVySGVhbHRoU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNyYXdsZXJTdGF0dXMKKyAgICovCisgIHB1YmxpYyBMaXN0IGdldENyYXdsZXJTdGF0dXMoKSB7CisgICAgcmV0dXJuIGNyYXdsZXJTdGF0dXM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNyYXdsZXJTdGF0dXMKKyAgICogICAgICAgICAgdGhlIGNyYXdsZXJTdGF0dXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDcmF3bGVyU3RhdHVzKExpc3QgY3Jhd2xlclN0YXR1cykgeworICAgIHRoaXMuY3Jhd2xlclN0YXR1cyA9IGNyYXdsZXJTdGF0dXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZm1TdGF0dXMKKyAgICovCisgIHB1YmxpYyBQQ1NEYWVtb25TdGF0dXMgZ2V0Rm1TdGF0dXMoKSB7CisgICAgcmV0dXJuIGZtU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmbVN0YXR1cworICAgKiAgICAgICAgICB0aGUgZm1TdGF0dXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGbVN0YXR1cyhQQ1NEYWVtb25TdGF0dXMgZm1TdGF0dXMpIHsKKyAgICB0aGlzLmZtU3RhdHVzID0gZm1TdGF0dXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZ2VuZXJhdGlvbkRhdGUKKyAgICovCisgIHB1YmxpYyBEYXRlIGdldEdlbmVyYXRpb25EYXRlKCkgeworICAgIHJldHVybiBnZW5lcmF0aW9uRGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZ2VuZXJhdGlvbkRhdGUKKyAgICogICAgICAgICAgdGhlIGdlbmVyYXRpb25EYXRlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGlvbkRhdGUoRGF0ZSBnZW5lcmF0aW9uRGF0ZSkgeworICAgIHRoaXMuZ2VuZXJhdGlvbkRhdGUgPSBnZW5lcmF0aW9uRGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBqb2JIZWFsdGhTdGF0dXMKKyAgICovCisgIHB1YmxpYyBMaXN0IGdldEpvYkhlYWx0aFN0YXR1cygpIHsKKyAgICByZXR1cm4gam9iSGVhbHRoU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBqb2JIZWFsdGhTdGF0dXMKKyAgICogICAgICAgICAgdGhlIGpvYkhlYWx0aFN0YXR1cyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEpvYkhlYWx0aFN0YXR1cyhMaXN0IGpvYkhlYWx0aFN0YXR1cykgeworICAgIHRoaXMuam9iSGVhbHRoU3RhdHVzID0gam9iSGVhbHRoU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQKKyAgICovCisgIHB1YmxpYyBMaXN0IGdldExhdGVzdFByb2R1Y3RzSW5nZXN0ZWQoKSB7CisgICAgcmV0dXJuIGxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQKKyAgICogICAgICAgICAgdGhlIGxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRMYXRlc3RQcm9kdWN0c0luZ2VzdGVkKExpc3QgbGF0ZXN0UHJvZHVjdHNJbmdlc3RlZCkgeworICAgIHRoaXMubGF0ZXN0UHJvZHVjdHNJbmdlc3RlZCA9IGxhdGVzdFByb2R1Y3RzSW5nZXN0ZWQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcm1TdGF0dXMKKyAgICovCisgIHB1YmxpYyBQQ1NEYWVtb25TdGF0dXMgZ2V0Um1TdGF0dXMoKSB7CisgICAgcmV0dXJuIHJtU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBybVN0YXR1cworICAgKiAgICAgICAgICB0aGUgcm1TdGF0dXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSbVN0YXR1cyhQQ1NEYWVtb25TdGF0dXMgcm1TdGF0dXMpIHsKKyAgICB0aGlzLnJtU3RhdHVzID0gcm1TdGF0dXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgd21TdGF0dXMKKyAgICovCisgIHB1YmxpYyBQQ1NEYWVtb25TdGF0dXMgZ2V0V21TdGF0dXMoKSB7CisgICAgcmV0dXJuIHdtU3RhdHVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB3bVN0YXR1cworICAgKiAgICAgICAgICB0aGUgd21TdGF0dXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRXbVN0YXR1cyhQQ1NEYWVtb25TdGF0dXMgd21TdGF0dXMpIHsKKyAgICB0aGlzLndtU3RhdHVzID0gd21TdGF0dXM7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gVGhpcyByZXBvcnQncyB7QGxpbmsgI2dlbmVyYXRpb25EYXRlfSBpbiBJU08gODYwMSBTdHJpbmcgZm9ybWF0LgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVEYXRlSXNvRm9ybWF0KCkgeworICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgY2FsLnNldFRpbWUodGhpcy5nZW5lcmF0aW9uRGF0ZSk7CisgICAgcmV0dXJuIERhdGVVdGlscy50b1N0cmluZyhjYWwpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9Xb3JrZmxvd1N0YXRlc0ZpbGUuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2hlYWx0aC9Xb3JrZmxvd1N0YXRlc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBmM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL1dvcmtmbG93U3RhdGVzRmlsZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRUNvbmZpZ3VyYXRpb25GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQuUEdFR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dC5QR0VDb25maWdGaWxlUmVhZGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogCisgKiBBIGZpbGUgdGhhdCBtYW5hZ2VzIHRoZSB7QGxpbmsgV29ya2Zsb3d9IHN0YXRlcyB0aGF0IHRoZQorICoge0BsaW5rIFBDU0hlYWx0aE1vbml0b3J9IHRvb2wgd2lsbCBsb29rIHVwIHdoZW4gb2J0YWluaW5nIHN0YXR1cyBpbiB0aGUgUENTLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1N0YXRlc0ZpbGUgaW1wbGVtZW50cyBXb3JrZmxvd1N0YXRlc01ldEtleXMgeworCisgIHByaXZhdGUgUEdFQ29uZmlndXJhdGlvbkZpbGUgZmlsZTsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBXb3JrZmxvd1N0YXRlc0ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICogICAgICAgICAgVGhlIHtAbGluayBGaWxlfSBwYXRoIHRvIHRoZSBXb3JrZmxvd1N0YXRlc0ZpbGUuCisgICAqIAorICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciByZWFkaW5nIGFuZCBwYXJzaW5nIHRoZSBXb3JrZmxvd1N0YXRlcworICAgKiAgICAgICAgICAgZmlsZS4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd1N0YXRlc0ZpbGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuZmlsZSA9IG5ldyBQR0VDb25maWdGaWxlUmVhZGVyKCkucmVhZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gVGhlIHtAbGluayBMaXN0fSBvZiBTdHJpbmcgV29ya2Zsb3cgU3RhdGVzIGRlZmluZWQgaW4gdGhlIFdvcmtmbG93CisgICAqICAgICAgICAgU3RhdGVzIGZpbGUuCisgICAqLworICBwdWJsaWMgTGlzdCBnZXRTdGF0ZXMoKSB7CisgICAgcmV0dXJuICgoUEdFR3JvdXApIHRoaXMuZmlsZS5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldCgKKyAgICAgICAgV09SS0ZMT1dfU1RBVEVTX0dST1VQKSkuZ2V0VmVjdG9yKFdPUktGTE9XX1NUQVRFU19WRUNUT1IpLmdldEVsZW1lbnRzKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL1dvcmtmbG93U3RhdGVzTWV0S2V5cy5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaGVhbHRoL1dvcmtmbG93U3RhdGVzTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzFlNTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9oZWFsdGgvV29ya2Zsb3dTdGF0ZXNNZXRLZXlzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoOworCisvKioKKyAqIAorICogTWV0IGtleXMgZm9yIHRoZSB7QGxpbmsgV29ya2Zsb3dTdGF0ZXNGaWxlfQorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dTdGF0ZXNNZXRLZXlzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19TVEFURVNfR1JPVVAgPSAiV29ya2Zsb3dTdGF0ZXNHcm91cCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfU1RBVEVTX1ZFQ1RPUiA9ICJTdGF0ZXMiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9saXN0aW5nL0xpc3RpbmdDb25mLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9saXN0aW5nL0xpc3RpbmdDb25mLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzOTRlNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2xpc3RpbmcvTGlzdGluZ0NvbmYuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MubGlzdGluZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dC5QR0VDb25maWdGaWxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQuUEdFQ29uZmlnRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0LlBHRUNvbmZpZ3VyYXRpb25GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudG9vbHMuUENTTG9uZ0xpc3RlcjsgLy9mb3IgamF2YWRvYworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQucGNzLmxpc3RpbmcuTGlzdGluZ0NvbmZLZXlzLio7CisKKy8qKgorICogCisgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHtAbGluayBQQ1NMb25nTGlzdGVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0aW5nQ29uZiB7CisKKyAgcHJpdmF0ZSBQR0VDb25maWd1cmF0aW9uRmlsZSBjb25mOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExpc3RpbmdDb25mIHdpdGggdGhlIGdpdmVuIHtAbGluayBGaWxlfS4KKyAgICogCisgICAqIEBwYXJhbSBmaWxlCisgICAqICAgICAgICAgIFRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGUgY29uZmlnIGZpbGUgY2Fubm90IGJlIGZvdW5kLgorICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIHNvbWUgZXJyb3IgcmVhZGluZyB0aGUgY29uZmlnIGZpbGUuCisgICAqLworICBwdWJsaWMgTGlzdGluZ0NvbmYoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuY29uZiA9IG5ldyBQR0VDb25maWdGaWxlUmVhZGVyKCkucmVhZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZTsKKyAgICB9IGNhdGNoIChQR0VDb25maWdGaWxlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHRoaXMuY29uZiA9PSBudWxsKQorICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBpcyBudWxsISIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZXhjbHVkZWQgcHJvZHVjdCB0eXBlcy4KKyAgICogCisgICAqIEByZXR1cm4gVGhlIHNldCBvZiBleGNsdWRlZCBwcm9kdWN0IHR5cGVzLgorICAgKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGNsdWRlZFR5cGVzKCkgeworICAgIGlmICh0aGlzLmNvbmYuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoRVhDTFVERURfUFJPRFVDVF9UWVBFX0dST1VQKSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKyAgICB9CisKKyAgICByZXR1cm4gKExpc3Q8U3RyaW5nPikgKExpc3Q8Pz4pIHRoaXMuY29uZi5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldCgKKyAgICAgICAgRVhDTFVERURfUFJPRFVDVF9UWVBFX0dST1VQKS5nZXRWZWN0b3IoRVhDTFVERURfVkVDVE9SKS5nZXRFbGVtZW50cygpOworCisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgc2V0IG9mIEhlYWRlciBjb2x1bW4gbWV0IGtleSBuYW1lcyBmb3IgdGhlIGxvbmcgbGlzdGVyLgorICAgKiAKKyAgICogQHJldHVybiBUaGUgc2V0IG9mIEhlYWRlciBjb2x1bW4gbWV0IGtleSBuYW1lcyBmb3IgdGhlIGxvbmcgbGlzdGVyLgorICAgKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIZWFkZXJDb2xLZXlzKCkgeworICAgIGlmICh0aGlzLmNvbmYuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoTUVUX0ZJRUxEX0NPTFNfR1JPVVApID09IG51bGwpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgIH0KKworICAgIHJldHVybiAoTGlzdDxTdHJpbmc+KSAoTGlzdDw/PikgdGhpcy5jb25mLmdldFBnZVNwZWNpZmljR3JvdXBzKCkuZ2V0KAorICAgICAgICBNRVRfRklFTERfQ09MU19HUk9VUCkuZ2V0VmVjdG9yKE1FVF9GSUVMRFNfT1JERVJfVkVDVE9SKS5nZXRFbGVtZW50cygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlciBjb2wga2V5LgorICAgKiAKKyAgICogQHBhcmFtIGhlYWRlckNvbEtleQorICAgKiAgICAgICAgICBUaGUgaGVhZGVyIGNvbCBtZXQga2V5IHRvIGxvb2sgdXAgdGhlIGRpc3BsYXkgbmFtZSBmb3IuCisgICAqIEByZXR1cm4gVGhlIGhlYWRlciBjb2wgbWV0IGtleSdzIGRpc3BsYXkgbmFtZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyQ29sRGlzcGxheU5hbWUoU3RyaW5nIGhlYWRlckNvbEtleSkgeworICAgIGlmICh0aGlzLmNvbmYuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoTUVUX0ZJRUxEX0NPTFNfR1JPVVApID09IG51bGwpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb25mLmdldFBnZVNwZWNpZmljR3JvdXBzKCkuZ2V0KE1FVF9GSUVMRF9DT0xTX0dST1VQKQorICAgICAgICAuZ2V0U2NhbGFyKGhlYWRlckNvbEtleSkuZ2V0VmFsdWUoKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0ZXIgbWV0aG9kIHRvIGRldGVybWluZSBpZiBhbiBvdXRwdXQgZmllbGQgaXMgYSBjb2xsZWN0aW9uIGZpZWxkLCBhbmQKKyAgICogbmVlZHMgc3BlY2lhbCBoYW5kbGluZy4KKyAgICogCisgICAqIEBwYXJhbSBjb2xOYW1lCisgICAqICAgICAgICAgIFRoZSBmaWVsZCBuYW1lIHRvIGNoZWNrLgorICAgKiBAcmV0dXJuIFRydWUgaWYgaXQncyBhIGNvbGxlY3Rpb24gZmllbGQsIGZhbHNlIGlmIG5vdCwgb3IgaWYgdGhlIGNvbGxlY3Rpb24KKyAgICogICAgICAgICBmaWVsZHMgZ3JvdXAgZG9lc24ndCBleGlzdCBpbiB0aGUgY29uZi4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvbkZpZWxkKFN0cmluZyBjb2xOYW1lKSB7CisgICAgaWYgKHRoaXMuY29uZi5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldChDT0xMRUNUSU9OX0ZJRUxEU19HUk9VUCkgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbmYuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5nZXQoQ09MTEVDVElPTl9GSUVMRFNfR1JPVVApCisgICAgICAgIC5nZXRWZWN0b3IoQ09MTEVDVElPTl9GSUVMRFNfTkFNRVMpLmdldEVsZW1lbnRzKCkuY29udGFpbnMoY29sTmFtZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvbGlzdGluZy9MaXN0aW5nQ29uZktleXMuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2xpc3RpbmcvTGlzdGluZ0NvbmZLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0MDUyZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2xpc3RpbmcvTGlzdGluZ0NvbmZLZXlzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MubGlzdGluZzsKKworLyoqCisgKiAKKyAqIE1ldCBrZXlzIHJlcXVpcmVkIHRvIHJlYWQgdGhlIHtAbGluayBMaXN0aW5nQ29uZn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIExpc3RpbmdDb25mS2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUX0ZJRUxEX0NPTFNfR1JPVVAgPSAiTWV0RmllbGRDb2x1bW5zIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVF9GSUVMRFNfT1JERVJfVkVDVE9SID0gIk9yZGVyZWRNZXRLZXlzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX0ZJRUxEU19HUk9VUCA9ICJDb2xsZWN0aW9uRmllbGRzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX0ZJRUxEU19OQU1FUyA9ICJGaWVsZE5hbWVzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFRF9QUk9EVUNUX1RZUEVfR1JPVVAgPSAiRXhjbHVkZWRQcm9kdWN0VHlwZUxpc3QiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVEX1ZFQ1RPUiA9ICJQcm9kdWN0VHlwZXMiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9tZXRhZGF0YS9QQ1NDb25maWdNZXRhZGF0YS5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvbWV0YWRhdGEvUENTQ29uZmlnTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRmODk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvbWV0YWRhdGEvUENTQ29uZmlnTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIEEgc2V0IG9mIE1ldCBLZXlzIGZvciB0aGUgVGFzayBNZXRhZGF0YSByZXF1aXJlZCBieSB0aGUgUENTLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUENTQ29uZmlnTWV0YWRhdGEgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBHRV9UQVNLX1RZUEUgPSAiUENTX1BHRVRhc2tUeXBlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1fSkFWQV9FWFRfRElSUyA9ICJQQ1NfTnVtSmF2YUV4dERpcnMiOworCisgIC8vIHVzZSB0aGlzIGtleSBsaWtlOiBKQVZBX0VYVF9ESVIrIjEiLCBvciBKQVZBX0VYVF9ESVIrIjIiCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhUX0RJUiA9ICJQQ1NfSmF2YUV4dERpciI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9NQUlOX0NMQVNTID0gIlBDU19KYXZhTWFpbkNsYXNzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX01BTkFHRVJfVVJMID0gIlBDU19GaWxlTWFuYWdlclVybCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NGX0ZJTEVfTUFOQUdFUl9VUkwgPSAiU0NGX0ZpbGVNYW5hZ2VyVXJsIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19NQU5BR0VSX1VSTCA9ICJQQ1NfV29ya2Zsb3dNYW5hZ2VyVXJsIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQR0VfQ09ORklHX0ZJTEVfUFJPUEVSVFlfQURERVJfQ0xBU1MgPSAiUENTX1BHRUNvbmZpZ1Byb3BlcnR5QWRkZXJDbGFzcyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1RSQU5TRkVSX1NFUlZJQ0VfRkFDVE9SWSA9ICJQQ1NfQ2xpZW50VHJhbnNmZXJTZXJ2aWNlRmFjdG9yeSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JBV0xFUl9DTEVBTlVQID0gIlBDU19DcmF3bGVyQ2xlYW51cCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JBV0xFUl9DUkFXTERJUlMgPSAiUENTX0NyYXdsZXJDcmF3bEZvckRpcnMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GSUxFX1NDSEVNQV9QQVRIID0gIlBDU19Db25maWdGaWxlU2NoZW1hUGF0aCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEdFX0NPTkZJR19GSUxFX05BTUUgPSAiUENTX1BHRUNvbmZpZ0ZpbGVOYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQR0VfTE9HX0ZJTEVfTkFNRSA9ICJQQ1NfUEdFTG9nRmlsZU5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBHRV9UWVBFX0dEU19BREFQVE9SID0gIkdEU0FkYXB0b3IiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBHRV9UWVBFX0dEU19QR0UgPSAiR0RTUGdlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOID0gIlVOS05PV04iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktGTE9XX01HUl9VUkwgPSAiV29ya2Zsb3dNYW5hZ2VyVXJsIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19JTlNUX0lEID0gIldvcmtmbG93SW5zdElkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfQUxMT1dBQkxFX0dBUF9NSU5VVEVTID0gIlBDU19NYXhBbGxvd2FibGVUaW1lR2FwTWludXRlcyI7CisKKyAgLyogUEdFIHRhc2sgc3RhdHVzZXMgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBR0lOR19JTlBVVCA9ICJTVEFHSU5HIElOUFVUIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GX0ZJTEVfQlVJTEQgPSAiQlVJTERJTkcgQ09ORklHIEZJTEUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5JTkdfUEdFID0gIlBHRSBFWEVDIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkFXTElORyA9ICJDUkFXTElORyI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL21ldGFkYXRhL1BDU01ldGFkYXRhLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9tZXRhZGF0YS9QQ1NNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTA3YjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9tZXRhZGF0YS9QQ1NNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLm1ldGFkYXRhOworCisvKioKKyAqIAorICogQSBDb2xsZWN0aW9uIG9mIE1ldGFkYXRhIGZpZWxkIG5hbWVzIGZvciBQQ1MuCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBQQ1NNZXRhZGF0YSB7CisKKyAgLyogTWV0IEZpZWxkcyAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9TVUNDRVNTX0ZMQUcgPSAiQXBwbGljYXRpb25TdWNjZXNzRmxhZyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fRElTSyA9ICJPbkRpc2siOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUEVfTE9DQVRJT04gPSAiVGFwZUxvY2F0aW9uIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUSU9OX0xPQ0FUSU9OID0gIlByb2R1Y3Rpb25Mb2NhdGlvbiI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVElPTl9MT0NBVElPTl9DT0RFID0gIlByb2R1Y3Rpb25Mb2NhdGlvbkNvZGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVkVSU0lPTiA9ICJEYXRhVmVyc2lvbiI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QUk9WSURFUiA9ICJEYXRhUHJvdmlkZXIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fTEFCRUwgPSAiQ29sbGVjdGlvbkxhYmVsIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UUyA9ICJDb21tZW50cyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUQUJMRV9QQVRITkFNRVMgPSAiRXhlY3V0YWJsZVBhdGhuYW1lcyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUQUJMRV9WRVJTSU9OUyA9ICJFeGVjdXRhYmxlVmVyc2lvbnMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NJTkdfTEVWRUwgPSAiUHJvY2Vzc2luZ0xldmVsIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfSUQgPSAiSm9iSWQiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfSUQgPSAiVGFza0lkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUSU9OX0RBVEVfVElNRSA9ICJQcm9kdWN0aW9uRGF0ZVRpbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0ZJTEVTID0gIklucHV0RmlsZXMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBHRV9OQU1FID0gIlBHRU5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFUyA9ICJPdXRwdXRGaWxlcyI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RBRyA9ICJUZXN0VGFnIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVEVTVF9UQUcgPSAiU3ViVGVzdFRhZyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MT0NBVElPTiA9ICJUZXN0TG9jYXRpb24iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ09VTlRFUiA9ICJUZXN0Q291bnRlciI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9EQVRFID0gIlRlc3REYXRlIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0RBVEVfVElNRSA9ICJTdGFydERhdGVUaW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfREFURV9USU1FID0gIkVuZERhdGVUaW1lIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcGVkaWdyZWUvUGVkaWdyZWUuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3BlZGlncmVlL1BlZGlncmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhZTcxOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3BlZGlncmVlL1BlZGlncmVlLmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLnBlZGlncmVlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MubWV0YWRhdGEuUENTTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NDb25maWdNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnF1ZXJ5LkZpbGVuYW1lUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeS5JbnB1dEZpbGVzUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeS5Kb2JJZFF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudXRpbC5GaWxlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIEEgY2xhc3MgdG8gcHJvdmlkZSBwZWRpZ3JlIHRyYWNraW5nIGZvciBQQ1Mge0BsaW5rIFByb2R1Y3R9cy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUGVkaWdyZWUgaW1wbGVtZW50cyBQQ1NNZXRhZGF0YSwgUENTQ29uZmlnTWV0YWRhdGEgeworCisgIC8qIG91ciBmaWxlIG1hbmFnZXIgaW50ZXJmYWNlICovCisgIHByaXZhdGUgRmlsZU1hbmFnZXJVdGlscyBmbTsKKworICAvKiBzaG91bGQgd2UgaW5jbHVkZSBub3QgY2F0YWxvZ2VkIHByb2R1Y3RzIGluIHRoZSBwZWRpZ3JlZT8gKi8KKyAgcHJpdmF0ZSBib29sZWFuIGxpc3ROb3RDYXRhbG9nZWQgPSBmYWxzZTsKKworICAvKiBhcmUgdGhlcmUgYW55IHByb2R1Y3QgdHlwZXMgdGhhdCB3ZSBzaG91bGQgZXhjbHVkZSBmcm9tIHRoZSBwZWRpZ3JlZT8gKi8KKyAgcHJpdmF0ZSBMaXN0IHByb2RUeXBlRXhjbHVkZUxpc3Q7CisKKyAgLyoqCisgICAqIAorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBlZGlncmVlIG9iamVjdCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZmlsZSBtYW5hZ2VyIGF0CisgICAqIHRoZSBnaXZlbiB7QGxpbmsgVVJMfSBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmZtVXJsU3RyPC9jb2RlPiBzdHJpbmcKKyAgICogcGFyYW1ldGVyLgorICAgKiAKKyAgICogQHBhcmFtIGZtVXJsU3RyCisgICAqICAgICAgICAgIFRoZSBTdHJpbmcge0BsaW5rIFVSTH0gb2YgdGhlIGZpbGUgbWFuYWdlciB0byBjb25uZWN0IHRvLgorICAgKiBAcGFyYW0gbGlzdE5vdENhdAorICAgKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgaW5jbHVkZSBub24tY2F0YWxvZ2VkIHByb2R1Y3RzIGluIHRoZQorICAgKiAgICAgICAgICBwZWRpZ3JlZS4KKyAgICogQHBhcmFtIGV4Y2x1ZGVMaXN0CisgICAqICAgICAgICAgIEEge0BsaW5rIExpc3R9IG9mIFN0cmluZyB7QGxpbmsgUHJvZHVjdFR5cGV9IG5hbWVzIHRoYXQgc2hvdWxkIGJlCisgICAqICAgICAgICAgIGV4Y2x1ZGVkIGZyb20gdGhlIFBlZGlncmVlLgorICAgKi8KKyAgcHVibGljIFBlZGlncmVlKFN0cmluZyBmbVVybFN0ciwgYm9vbGVhbiBsaXN0Tm90Q2F0LCBMaXN0IGV4Y2x1ZGVMaXN0KSB7CisgICAgdGhpcyhuZXcgRmlsZU1hbmFnZXJVdGlscyhGaWxlTWFuYWdlclV0aWxzLnNhZmVHZXRVcmxGcm9tU3RyaW5nKGZtVXJsU3RyKSksCisgICAgICAgIGxpc3ROb3RDYXQsIGV4Y2x1ZGVMaXN0KTsKKworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBlZGlncmVlIG9iamVjdCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZmlsZSBtYW5hZ2VyCisgICAqIHNwZWNpZmllZCBieSB0aGUge0BsaW5rIEZpbGVNYW5hZ2VyVXRpbHN9IG9iamVjdCBwYXNzZWQgaW4uCisgICAqIAorICAgKiBAcGFyYW0gZm0KKyAgICogICAgICAgICAgVGhlIFBDUyBpbnRlcmZhY2UgdG8gdGhlIEZpbGUgTWFuYWdlci4KKyAgICogQHBhcmFtIGxpc3ROb3RDYXQKKyAgICogICAgICAgICAgV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGluY2x1ZGUgbm9uLWNhdGFsb2dlZCBwcm9kdWN0cyBpbiB0aGUKKyAgICogICAgICAgICAgcGVkaWdyZWUuCisgICAqIEBwYXJhbSBleGNsdWRlTGlzdAorICAgKiAgICAgICAgICBBIHtAbGluayBMaXN0fSBvZiBTdHJpbmcge0BsaW5rIFByb2R1Y3RUeXBlfSBuYW1lcyB0aGF0IHNob3VsZCBiZQorICAgKiAgICAgICAgICBleGNsdWRlZCBmcm9tIHRoZSBQZWRpZ3JlZS4KKyAgICovCisgIHB1YmxpYyBQZWRpZ3JlZShGaWxlTWFuYWdlclV0aWxzIGZtLCBib29sZWFuIGxpc3ROb3RDYXQsIExpc3QgZXhjbHVkZUxpc3QpIHsKKyAgICB0aGlzLmZtID0gZm07CisgICAgdGhpcy5saXN0Tm90Q2F0YWxvZ2VkID0gbGlzdE5vdENhdDsKKyAgICB0aGlzLnByb2RUeXBlRXhjbHVkZUxpc3QgPSBleGNsdWRlTGlzdDsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGZ1bGwgcGVkaWdyZWUgb2YgdGhlIHNwZWNpZmllZCB7QGxpbmsgUHJvZHVjdH0gPGNvZGU+b3JpZzwvY29kZT4KKyAgICogLiBJZiA8Y29kZT51cHN0cmVhbTwvY29kZT4gaXMgc2V0IHRvIHRydWUsIGFuIHVwc3RyZWFtIHBlZGlncmVlIGlzCisgICAqIHBlcmZvcm1lZCwgb3RoZXJ3aXNlLCBhIGRvd25zdHJlYW0gcGVkaWdyZWUgaXMgcGVyZm9ybWVkLgorICAgKiAKKyAgICogQHBhcmFtIG9yaWcKKyAgICogICAgICAgICAgVGhlIHtAbGluayBQcm9kdWN0fSB0byBwZXJmb3JtIGEgcGVkaWdyZWUgb2YuCisgICAqIEBwYXJhbSB1cHN0cmVhbQorICAgKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgZG8gYW4gdXBzdHJlYW0gKHRydWUpIG9yIGRvd25zdHJlYW0KKyAgICogICAgICAgICAgKGZhbHNlKSBwZWRpZ3JlZS4KKyAgICogQHJldHVybiBBIHtAbGluayBQZWRpZ3JlZVRyZWV9IGNvbnRhaW5pbmcgdGhlIFBlZGlncmVlIG9mIGEgZ2l2ZW4gcHJvZHVjdC4KKyAgICovCisgIHB1YmxpYyBQZWRpZ3JlZVRyZWUgZG9QZWRpZ3JlZShQcm9kdWN0IG9yaWcsIGJvb2xlYW4gdXBzdHJlYW0pIHsKKyAgICBMaXN0IHBlZFByb2RzID0gbnVsbDsKKyAgICBQZWRpZ3JlZVRyZWVOb2RlIG9yaWdSb290ID0gUGVkaWdyZWVUcmVlTm9kZQorICAgICAgICAuZ2V0UGVkaWdyZWVUcmVlTm9kZUZyb21Qcm9kdWN0KG9yaWcsIG51bGwpOworCisgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb2luZyBwZWRpZ3JlZTogdXBzdHJlYW06IFsiK3Vwc3RyZWFtKyJdIik7CisgICAgU3RhY2sgcm9vdHMgPSBuZXcgU3RhY2soKTsKKyAgICByb290cy5hZGQob3JpZ1Jvb3QpOworCisgICAgZG8geworCisgICAgICBQZWRpZ3JlZVRyZWVOb2RlIGN1cnJSb290ID0gKFBlZGlncmVlVHJlZU5vZGUpIHJvb3RzLnBvcCgpOworICAgICAgLyoKKyAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbigiRXhhbWluaW5nIHJvb3Q6IFsiK2N1cnJSb290LmdldE5vZGVQcm9kdWN0KCkuCisgICAgICAgKiBnZXRQcm9kdWN0TmFtZSgpKyJdIik7CisgICAgICAgKi8KKworICAgICAgaWYgKHVwc3RyZWFtKSB7CisgICAgICAgIHBlZFByb2RzID0gZ2V0VXBzdHJlYW1QZWRpZ3JlZWRQcm9kdWN0cyhjdXJyUm9vdC5nZXROb2RlUHJvZHVjdCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBlZFByb2RzID0gZ2V0RG93bnN0cmVhbVBlZGlncmVlZFByb2R1Y3RzKGN1cnJSb290LmdldE5vZGVQcm9kdWN0KCkpOworICAgICAgfQorCisgICAgICBpZiAocGVkUHJvZHMgIT0gbnVsbCAmJiBwZWRQcm9kcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBlZFByb2RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgIFByb2R1Y3QgcCA9IChQcm9kdWN0KSBpLm5leHQoKTsKKyAgICAgICAgICBpZiAocC5nZXRQcm9kdWN0TmFtZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgY3VyclJvb3QuZ2V0Tm9kZVByb2R1Y3QoKS5nZXRQcm9kdWN0TmFtZSgpKSkgeworICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZm9yIHRoZSBzYW1lIHBlZGlncmVlZCBwcm9kdWN0IHRvIGJlCisgICAgICAgICAgICAvLyBhZGRlZCB0byB0aGUgbGlzdAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIFBlZGlncmVlVHJlZU5vZGUgcHJvZE5vZGUgPSBQZWRpZ3JlZVRyZWVOb2RlCisgICAgICAgICAgICAgIC5nZXRQZWRpZ3JlZVRyZWVOb2RlRnJvbVByb2R1Y3QocCwgY3VyclJvb3QpOworICAgICAgICAgIHJvb3RzLmFkZChwcm9kTm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGVkaWdyZWUgcHJvZHVjdHMgaXMgbnVsbCBvciBzaXplIDAiKTsKKyAgICAgIH0KKworICAgIH0gd2hpbGUgKCFyb290cy5lbXB0eSgpKTsKKworICAgIHJldHVybiBuZXcgUGVkaWdyZWVUcmVlKG9yaWdSb290KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtb3N0IGRpcmVjdCBhbmNlc3RvcnMgKGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBQcm9kdWN0fXMpCisgICAqIHVwc3RyZWFtIGZyb20gdGhlIGdpdmVuIHtAbGluayBQcm9kdWN0fSBuYW1lZCA8Y29kZT5vcmlnPC9jb2RlPi4KKyAgICogCisgICAqIEBwYXJhbSBvcmlnCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgUHJvZHVjdH0gdG8gZ2V0IGRpcmVjdCB1cHN0cmVhbSByZWxhdGl2ZXMgb2YuCisgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3R9cyBkaXJlY3RseSB1cHN0cmVhbSBmcm9tIHRoZSBnaXZlbgorICAgKiAgICAgICAgIHtAbGluayBQcm9kdWN0fS4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFVwc3RyZWFtUGVkaWdyZWVkUHJvZHVjdHMoUHJvZHVjdCBvcmlnKSB7CisgICAgaWYgKG9yaWcgPT0gbnVsbAorICAgICAgICB8fCAob3JpZyAhPSBudWxsICYmIG9yaWcuZ2V0UHJvZHVjdFR5cGUoKSA9PSBudWxsKQorICAgICAgICB8fCAob3JpZyAhPSBudWxsICYmIG9yaWcuZ2V0UHJvZHVjdFR5cGUoKSAhPSBudWxsIAorICAgICAgICAgICAgJiYgb3JpZy5nZXRQcm9kdWN0VHlwZSgpLmdldE5hbWUoKSA9PSBudWxsKQorICAgICAgICB8fCAob3JpZyAhPSBudWxsICYmIG9yaWcuZ2V0UHJvZHVjdFR5cGUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBvcmlnLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpICE9IG51bGwgJiYgCisgICAgICAgICAgICBvcmlnLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscyhVTktOT1dOKSkpIHsKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yKCk7CisgICAgfQorICAgIE1ldGFkYXRhIHBNZXQgPSBmbS5zYWZlR2V0TWV0YWRhdGEob3JpZyk7CisgICAgcmV0dXJuIGdldFByb2R1Y3RzKHBNZXQuZ2V0QWxsTWV0YWRhdGEoSU5QVVRfRklMRVMpKTsKKworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1vc3QgZGlyZWN0IGFuY2VzdG9ycyAoYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3R9cykKKyAgICogZG93bnN0cmVhbSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgUHJvZHVjdH0gbmFtZWQgPGNvZGU+b3JpZzwvY29kZT4uCisgICAqIAorICAgKiBAcGFyYW0gb3JpZworICAgKiAgICAgICAgICBUaGUge0BsaW5rIFByb2R1Y3R9IHRvIGdldCBkaXJlY3QgZG93bnN0cmVhbSByZWxhdGl2ZXMgb2YuCisgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFByb2R1Y3R9cyBkaXJlY3RseSBkb3duc3RyZWFtIGZyb20gdGhlCisgICAqICAgICAgICAgZ2l2ZW4ge0BsaW5rIFByb2R1Y3R9LgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0RG93bnN0cmVhbVBlZGlncmVlZFByb2R1Y3RzKFByb2R1Y3Qgb3JpZykgeworICAgIHJldHVybiBmbS5xdWVyeUFsbFR5cGVzKG5ldyBJbnB1dEZpbGVzUXVlcnkob3JpZy5nZXRQcm9kdWN0TmFtZSgpLCBmbSkKKyAgICAgICAgLmJ1aWxkUXVlcnkoKSwgdGhpcy5wcm9kVHlwZUV4Y2x1ZGVMaXN0KTsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIGFsbCBhc3NvY2lhdGVkIHtAbGluayBQcm9kdWN0fXMgd2l0aCB0aGUgcHJvdmlkZWQKKyAgICoge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IGlkZW50aWZpZWQgYnkgaXRzIElEICh0aGUgPGNvZGU+d0luc3RJZDwvY29kZT4KKyAgICogc3RyaW5nIHBhcmFtZXRlcikuCisgICAqIAorICAgKiBAcGFyYW0gd0luc3RJZAorICAgKiAgICAgICAgICBUaGUgSUQgb2YgdGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSB0byBsb29rIHVwIHRoZQorICAgKiAgICAgICAgICB7QGxpbmsgUHJvZHVjdH1zIGZvci4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUHJvZHVjdH1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQKKyAgICogICAgICAgICBXb3JrZmxvdyBJbnN0YW5jZSBJRC4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93SW5zdFByb2RzKFN0cmluZyB3SW5zdElkKSB7CisgICAgcmV0dXJuIGZtLnF1ZXJ5QWxsVHlwZXMobmV3IEpvYklkUXVlcnkod0luc3RJZCwgZm0pLmJ1aWxkUXVlcnkoKSwKKyAgICAgICAgdGhpcy5wcm9kVHlwZUV4Y2x1ZGVMaXN0KTsKKyAgfQorCisgIHByaXZhdGUgTGlzdCBnZXRQcm9kdWN0cyhMaXN0IHByb2ROYW1lcykgeworICAgIGlmIChwcm9kTmFtZXMgPT0gbnVsbCB8fCAocHJvZE5hbWVzICE9IG51bGwgJiYgcHJvZE5hbWVzLnNpemUoKSA9PSAwKSkgeworICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICBMaXN0IHByb2RzID0gbmV3IFZlY3Rvcihwcm9kTmFtZXMuc2l6ZSgpKTsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2ROYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFN0cmluZyBwcm9kTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgTGlzdCBwcm9kTGlzdCA9IGZtLnF1ZXJ5QWxsVHlwZXMobmV3IEZpbGVuYW1lUXVlcnkocHJvZE5hbWUsIGZtKQorICAgICAgICAgIC5idWlsZFF1ZXJ5KCksIHRoaXMucHJvZFR5cGVFeGNsdWRlTGlzdCk7CisgICAgICBpZiAocHJvZExpc3QgIT0gbnVsbCAmJiBwcm9kTGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgIHByb2RzLmFkZCgoUHJvZHVjdCkgcHJvZExpc3QuZ2V0KDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0aGlzLmxpc3ROb3RDYXRhbG9nZWQpIHsKKyAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcHJvZHVjdCBhbmQgYWRkIGl0CisgICAgICAgICAgcHJvZHMuYWRkKFByb2R1Y3QuZ2V0RGVmYXVsdEZsYXRQcm9kdWN0KHByb2ROYW1lLCBVTktOT1dOKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcHJvZHM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcGVkaWdyZWUvUGVkaWdyZWVUcmVlLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9wZWRpZ3JlZS9QZWRpZ3JlZVRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk4ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcGVkaWdyZWUvUGVkaWdyZWVUcmVlLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLnBlZGlncmVlOworCisvKioKKyAqIAorICogQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYW4gdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gCisgKiBwZWRpZ3JlZSBmb3IgYSBwYXJ0aWN1bGFyIHtAbGluayBQcm9kdWN0fS4gVGhhdCBpczogd2hhdCBmaWxlcyAKKyAqIHdlbnQgaW50byBwcm9kdWNpbmcgdGhpcyB7QGxpbmsgUHJvZHVjdH0sIGFuZCBpbiB3aGF0IGZpbGVzIAorICogd2FzIHRoaXMge0BsaW5rIFByb2R1Y3R9IGluY2x1ZGVkPworICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBlZGlncmVlVHJlZSB7CisKKyAgICBwcml2YXRlIFBlZGlncmVlVHJlZU5vZGUgcm9vdDsKKworICAgIHB1YmxpYyBQZWRpZ3JlZVRyZWUoUGVkaWdyZWVUcmVlTm9kZSByb290KSB7CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1MZXZlbHMoKSB7CisgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cmF2ZXJzZShyb290LCAwKSArIDE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIFBlZGlncmVlVHJlZU5vZGUgZ2V0Um9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9vdChQZWRpZ3JlZVRyZWVOb2RlIHJvb3QpIHsKKyAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmVlOgorICAgICAqICAgICAgICAgICAgLS0tLS0tLS0+W04zXQorICAgICAqICAgICAgICAgIC0tLS0+W04yXQorICAgICAqICAgICAgICAgICAgLS0tLS0tLS0+W041XQorICAgICAqICAgW04xXS0tLQorICAgICAqICAgICAgICAgIC0tLS0+W040XQorICAgICAqICAgIAorICAgICAqIAorICAgICAqIAorICAgICAqIEBwYXJhbSBub2RlCisgICAgICogQHBhcmFtIGxldmVsCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgaW50IHRyYXZlcnNlKFBlZGlncmVlVHJlZU5vZGUgbm9kZSwgaW50IGxldmVsKSB7CisgICAgICAgIGludCBtYXhMZXZlbCA9IGxldmVsOworICAgICAgICBpZiAobm9kZS5nZXROdW1DaGlsZHJlbigpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldE51bUNoaWxkcmVuKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBsdmwgPSB0cmF2ZXJzZShub2RlLmdldENoaWxkQXQoaSksIGxldmVsICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGx2bCA+IG1heExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbHZsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXhMZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cmF2ZXJzZUFuZFByaW50KFBlZGlncmVlVHJlZU5vZGUgbm9kZSwgaW50IGxldmVsKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRUYWJTdHIobGV2ZWwpCisgICAgICAgICAgICAgICAgKyBub2RlLmdldE5vZGVQcm9kdWN0KCkuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgIGlmIChub2RlLmdldE51bUNoaWxkcmVuKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZ2V0TnVtQ2hpbGRyZW4oKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJhdmVyc2VBbmRQcmludChub2RlLmdldENoaWxkQXQoaSksIGxldmVsICsgMSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFRhYlN0cihpbnQgbnVtKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciB0YWJTdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgIHRhYlN0ckJ1Zi5hcHBlbmQoIlx0Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGFiU3RyQnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHByaW50UGVkaWdyZWVUcmVlKCkgeworICAgICAgICBQZWRpZ3JlZVRyZWVOb2RlIHJvb3QgPSBnZXRSb290KCk7CisgICAgICAgIHRyYXZlcnNlQW5kUHJpbnQocm9vdCwgMCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9wZWRpZ3JlZS9QZWRpZ3JlZVRyZWVOb2RlLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9wZWRpZ3JlZS9QZWRpZ3JlZVRyZWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNjcxZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3BlZGlncmVlL1BlZGlncmVlVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5wZWRpZ3JlZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIEEgbm9kZSBpbiB0aGUge0BsaW5rIFBlZGlncmVlVHJlZX0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFBlZGlncmVlVHJlZU5vZGUgeworCisgIHByaXZhdGUgUHJvZHVjdCBwcm9kOworCisgIHByaXZhdGUgTGlzdCBjaGlsZHJlbjsKKworICBwcml2YXRlIFBlZGlncmVlVHJlZU5vZGUgcGFyZW50OworCisgIHB1YmxpYyBQZWRpZ3JlZVRyZWVOb2RlKFBlZGlncmVlVHJlZU5vZGUgcGFyZW50KSB7CisgICAgdGhpcyhwYXJlbnQsIG51bGwpOworICB9CisKKyAgcHVibGljIFBlZGlncmVlVHJlZU5vZGUoUGVkaWdyZWVUcmVlTm9kZSBwYXJlbnQsIFByb2R1Y3QgcHJvZCkgeworICAgIHRoaXMocGFyZW50LCBuZXcgVmVjdG9yKCksIHByb2QpOworICB9CisKKyAgcHVibGljIFBlZGlncmVlVHJlZU5vZGUoUGVkaWdyZWVUcmVlTm9kZSBwYXJlbnQsIExpc3QgY2hpbGRyZW4sIFByb2R1Y3QgcHJvZCkgeworICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7CisgICAgICB0aGlzLnBhcmVudC5hZGRDaGlsZCh0aGlzKTsKKyAgICB9CisgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworICAgIHRoaXMucHJvZCA9IHByb2Q7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoUGVkaWdyZWVUcmVlTm9kZSBwYXJlbnQpIHsKKyAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFBlZGlncmVlVHJlZU5vZGUgY2hpbGQpIHsKKyAgICB0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7CisgIH0KKworICBwdWJsaWMgaW50IGdldE51bUNoaWxkcmVuKCkgeworICAgIGlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zaXplKCk7CisgIH0KKworICBwdWJsaWMgUGVkaWdyZWVUcmVlTm9kZSBnZXRDaGlsZEF0KGludCBpZHgpIHsKKyAgICByZXR1cm4gKFBlZGlncmVlVHJlZU5vZGUpIHRoaXMuY2hpbGRyZW4uZ2V0KGlkeCk7CisgIH0KKworICBwdWJsaWMgUHJvZHVjdCBnZXROb2RlUHJvZHVjdCgpIHsKKyAgICByZXR1cm4gdGhpcy5wcm9kOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Tm9kZVByb2R1Y3QoUHJvZHVjdCBwcm9kKSB7CisgICAgdGhpcy5wcm9kID0gcHJvZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUGVkaWdyZWVUcmVlTm9kZSBnZXRQZWRpZ3JlZVRyZWVOb2RlRnJvbVByb2R1Y3QoUHJvZHVjdCBwLAorICAgICAgUGVkaWdyZWVUcmVlTm9kZSBwYXJlbnQpIHsKKyAgICBQZWRpZ3JlZVRyZWVOb2RlIG5vZGUgPSBuZXcgUGVkaWdyZWVUcmVlTm9kZShwYXJlbnQpOworICAgIG5vZGUuc2V0Tm9kZVByb2R1Y3QocCk7CisgICAgcmV0dXJuIG5vZGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvQWJzdHJhY3RQQ1NRdWVyeS5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvQWJzdHJhY3RQQ1NRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzg0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9xdWVyeS9BYnN0cmFjdFBDU1F1ZXJ5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLkZpbGVNYW5hZ2VyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKKworLyoqCisgKiBBYnN0cmFjdCBmdW5jdGlvbmFsaXR5IGZvciBQQ1MgcXVlcmllcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQQ1NRdWVyeSBpbXBsZW1lbnRzIFBDU1F1ZXJ5IHsKKworICAvKiBpbnRlcmZhY2UgdG8gdGhlIGZpbGUgbWFuYWdlciBzbyB3ZSBjYW4gbG9vayB1cCBlbGVtIGRlZnMgKi8KKyAgcHJvdGVjdGVkIEZpbGVNYW5hZ2VyVXRpbHMgZm0gPSBudWxsOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEFic3RyYWN0T0NPUXVlcnkgdXNpbmcgdGhlIGdpdmVuIHtAbGluayBGaWxlTWFuYWdlclV0aWxzfQorICAgKiBmaWxlIG1hbmFnZXIgaW50ZXJmYWNlLgorICAgKiAKKyAgICogQHBhcmFtIGZtCisgICAqICAgICAgICAgIFRoZSBpbnRlcmZhY2UgdG8gdGhlIEZpbGUgTWFuYWdlci4KKyAgICovCisgIHByb3RlY3RlZCBBYnN0cmFjdFBDU1F1ZXJ5KEZpbGVNYW5hZ2VyVXRpbHMgZm0pIHsKKyAgICB0aGlzLmZtID0gZm07CisgIH0KKworICAvKioKKyAgICogV3JhcHBlciBtZXRob2QgYXJvdW5kIHtAbGluayAjZm0uc2FmZUdldEVsZW1lbnRCeU5hbWV9LgorICAgKiAKKyAgICogQHBhcmFtIGVsZW1OYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YSBlbGVtZW50IHRvIG9idGFpbiB0aGUgSUQgZm9yLgorICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgSUQgb2YgdGhlIGdpdmVuIDxjb2RlPmVsZW1OYW1lPC9jb2RlPi4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbUlkKFN0cmluZyBlbGVtTmFtZSkgeworICAgIEVsZW1lbnQgZWxlbSA9IGZtLnNhZmVHZXRFbGVtZW50QnlOYW1lKGVsZW1OYW1lKTsKKyAgICBpZiAoZWxlbSA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisKKyAgICByZXR1cm4gZWxlbS5nZXRFbGVtZW50SWQoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9xdWVyeS9GaWxlbmFtZVF1ZXJ5LmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9xdWVyeS9GaWxlbmFtZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzYjIyMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L0ZpbGVuYW1lUXVlcnkuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuRmlsZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKKworLyoqCisgKiAKKyAqIEEgcXVlcnkgdG8gdGhlIEZpbGUgTWFuYWdlciB1c2luZyB0aGUgPGNvZGU+RmlsZW5hbWU8L2NvZGU+IHByb2R1Y3QgbWV0IGZpZWxkLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlbmFtZVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RQQ1NRdWVyeSB7CisKKyAgLyogdGhlIHByb2R1Y3QgbmFtZSB0aGF0IHdlJ3JlIHF1ZXJ5aW5nIGZvciAqLworICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKyAgcHVibGljIEZpbGVuYW1lUXVlcnkoU3RyaW5nIG5hbWUsIEZpbGVNYW5hZ2VyVXRpbHMgZm0pIHsKKyAgICBzdXBlcihmbSk7CisgICAgdGhpcy5maWxlTmFtZSA9IG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZmlsZU5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisgICAgcmV0dXJuIGZpbGVOYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgKiAgICAgICAgICB0aGUgZmlsZU5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnkuUENTUXVlcnkjYnVpbGRRdWVyeSgpCisgICAqLworICBwdWJsaWMgUXVlcnkgYnVpbGRRdWVyeSgpIHsKKyAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgIFRlcm1RdWVyeUNyaXRlcmlhIGNyaXQgPSBuZXcgVGVybVF1ZXJ5Q3JpdGVyaWEoRklMRU5BTUUsIHRoaXMuZmlsZU5hbWUpOworICAgIHF1ZXJ5LmFkZENyaXRlcmlvbihjcml0KTsKKyAgICByZXR1cm4gcXVlcnk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvSW5wdXRGaWxlc1F1ZXJ5LmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9xdWVyeS9JbnB1dEZpbGVzUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGJiNDYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvSW5wdXRGaWxlc1F1ZXJ5LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuRmlsZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKKworLyoqCisgKiAKKyAqIEEgcXVlcnkgdG8gdGhlIEZpbGUgTWFuYWdlciB1c2luZyB0aGUgPGNvZGU+SW5wdXRGaWxlczwvY29kZT4gcHJvZHVjdCBtZXQKKyAqIGZpZWxkCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5wdXRGaWxlc1F1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RQQ1NRdWVyeSBpbXBsZW1lbnRzIFBDU01ldGFkYXRhIHsKKworICBwcml2YXRlIFN0cmluZyBvcmlnSW5wdXRGaWxlOworCisgIHB1YmxpYyBJbnB1dEZpbGVzUXVlcnkoU3RyaW5nIG9yaWdGaWxlLCBGaWxlTWFuYWdlclV0aWxzIGZtKSB7CisgICAgc3VwZXIoZm0pOworICAgIG9yaWdJbnB1dEZpbGUgPSBvcmlnRmlsZTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeS5QQ1NRdWVyeSNidWlsZFF1ZXJ5KCkKKyAgICovCisgIHB1YmxpYyBRdWVyeSBidWlsZFF1ZXJ5KCkgeworICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgVGVybVF1ZXJ5Q3JpdGVyaWEgY3JpdCA9IG5ldyBUZXJtUXVlcnlDcml0ZXJpYShJTlBVVF9GSUxFUywKKyAgICAgICAgdGhpcy5vcmlnSW5wdXRGaWxlKTsKKworICAgIHF1ZXJ5LmFkZENyaXRlcmlvbihjcml0KTsKKyAgICByZXR1cm4gcXVlcnk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvSm9iSWRRdWVyeS5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvSm9iSWRRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWQ5NmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9xdWVyeS9Kb2JJZFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuRmlsZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKKworLyoqCisgKiAKKyAqIEEgcXVlcnkgdG8gdGhlIEZpbGUgTWFuYWdlciB1c2luZyB0aGUgPGNvZGU+Sm9iSWQ8L2NvZGU+IHByb2R1Y3QgbWV0IGZpZWxkLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBKb2JJZFF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RQQ1NRdWVyeSBpbXBsZW1lbnRzIFBDU01ldGFkYXRhIHsKKworICBwcml2YXRlIFN0cmluZyBqb2JJZDsKKworICBwdWJsaWMgSm9iSWRRdWVyeShTdHJpbmcgam9iSWQsIEZpbGVNYW5hZ2VyVXRpbHMgZm0pIHsKKyAgICBzdXBlcihmbSk7CisgICAgdGhpcy5qb2JJZCA9IGpvYklkOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucGNzLnF1ZXJ5LlBDU1F1ZXJ5I2J1aWxkUXVlcnkoKQorICAgKi8KKyAgcHVibGljIFF1ZXJ5IGJ1aWxkUXVlcnkoKSB7CisgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKyAgICBUZXJtUXVlcnlDcml0ZXJpYSBjcml0ID0gbmV3IFRlcm1RdWVyeUNyaXRlcmlhKEpPQl9JRCwgdGhpcy5qb2JJZCk7CisKKyAgICBxdWVyeS5hZGRDcml0ZXJpb24oY3JpdCk7CisgICAgcmV0dXJuIHF1ZXJ5OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L091dHB1dEZpbGVzUXVlcnkuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L091dHB1dEZpbGVzUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFiMjdjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvT3V0cHV0RmlsZXNRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm1ldGFkYXRhLlBDU01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudXRpbC5GaWxlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworCisvKioKKyAqIAorICogQSBxdWVyeSB0byB0aGUgRmlsZSBNYW5hZ2VyIHVzaW5nIHRoZSA8Y29kZT5PdXRwdXRGaWxlczwvY29kZT4gcHJvZHVjdCBtZXQKKyAqIGZpZWxkLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRwdXRGaWxlc1F1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RQQ1NRdWVyeSBpbXBsZW1lbnRzIFBDU01ldGFkYXRhIHsKKworICBwcml2YXRlIFN0cmluZyBvcmlnT3V0cHV0RmlsZTsKKworICBwdWJsaWMgT3V0cHV0RmlsZXNRdWVyeShTdHJpbmcgZmlsZSwgRmlsZU1hbmFnZXJVdGlscyBmbSkgeworICAgIHN1cGVyKGZtKTsKKyAgICBvcmlnT3V0cHV0RmlsZSA9IGZpbGU7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnkuUENTUXVlcnkjYnVpbGRRdWVyeSgpCisgICAqLworICBwdWJsaWMgUXVlcnkgYnVpbGRRdWVyeSgpIHsKKyAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpOworICAgIFRlcm1RdWVyeUNyaXRlcmlhIGNyaXQgPSBuZXcgVGVybVF1ZXJ5Q3JpdGVyaWEoT1VUUFVUX0ZJTEVTLAorICAgICAgICB0aGlzLm9yaWdPdXRwdXRGaWxlKTsKKworICAgIHF1ZXJ5LmFkZENyaXRlcmlvbihjcml0KTsKKyAgICByZXR1cm4gcXVlcnk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvUENTUXVlcnkuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L1BDU1F1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlZjFiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L1BDU1F1ZXJ5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUXVlcnk7CisKKy8qKgorICogCisgKiBDb3JlIGludGVyZmFjZSBmb3IgUENTIHF1ZXJpZXMgKHdyYXBwZXJzIGFyb3VuZCBmaWxlIG1hbmFnZXIge0BsaW5rIFF1ZXJ5fXMKKyAqIHRoYXQgbWFrZSB0aGVtIGVhc2llciB0byBjb25zdHJ1Y3QpLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBQQ1NRdWVyeSBleHRlbmRzIFBDU01ldGFkYXRhLCBDb3JlTWV0S2V5cyB7CisKKyAgLyoqCisgICAqIEJ1aWxkcyBhIGZpbGVtZ3IgY29tcGxpYW50IHtAbGluayBRdWVyeX0gb2JqZWN0IGZyb20gYSBjb25jcmV0ZSBpbnN0YW5jZSBvZgorICAgKiB0aGUgaW1wbGVtZW50aW5nIGNsYXNzLgorICAgKiAKKyAgICogQHJldHVybiBBIGZpbGVtZ3IgY29tcGxpYW50IHtAbGluayBRdWVyeX0gb2JqZWN0LgorICAgKi8KKyAgcHVibGljIFF1ZXJ5IGJ1aWxkUXVlcnkoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvUHJvZHVjdE5hbWVRdWVyeS5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvUHJvZHVjdE5hbWVRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTdkNmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9xdWVyeS9Qcm9kdWN0TmFtZVF1ZXJ5LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MucXVlcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuRmlsZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKKworLyoqCisgKiAKKyAqIEEgcXVlcnkgdG8gdGhlIEZpbGUgTWFuYWdlciB1c2luZyB0aGUgPGNvZGU+UHJvZHVjdE5hbWU8L2NvZGU+IHByb2R1Y3QgbWV0CisgKiBmaWVsZC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0TmFtZVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RQQ1NRdWVyeSBpbXBsZW1lbnRzIFBDU01ldGFkYXRhIHsKKworICBwcml2YXRlIFN0cmluZyBwcm9kTmFtZTsKKworICBwdWJsaWMgUHJvZHVjdE5hbWVRdWVyeShTdHJpbmcgcHJvZE5hbWUsIEZpbGVNYW5hZ2VyVXRpbHMgZm0pIHsKKyAgICBzdXBlcihmbSk7CisgICAgdGhpcy5wcm9kTmFtZSA9IHByb2ROYW1lOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucGNzLnF1ZXJ5LlBDU1F1ZXJ5I2J1aWxkUXVlcnkoKQorICAgKi8KKyAgcHVibGljIFF1ZXJ5IGJ1aWxkUXVlcnkoKSB7CisgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKTsKKyAgICBUZXJtUXVlcnlDcml0ZXJpYSBjcml0ID0gbmV3IFRlcm1RdWVyeUNyaXRlcmlhKFBST0RVQ1RfTkFNRSwgdGhpcy5wcm9kTmFtZSk7CisKKyAgICBxdWVyeS5hZGRDcml0ZXJpb24oY3JpdCk7CisgICAgcmV0dXJuIHF1ZXJ5OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L1RlbXBvcmFsUXVlcnkuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3F1ZXJ5L1RlbXBvcmFsUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmY1NDZhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvcXVlcnkvVGVtcG9yYWxRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLnF1ZXJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudXRpbC5GaWxlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJhbmdlUXVlcnlDcml0ZXJpYTsKKworLyoqCisgKiAKKyAqIEEgcXVlcnkgd2l0aCBhIDxjb2RlPlN0YXJ0RGF0ZVRpbWU8L2NvZGU+IGFuZCBhbiA8Y29kZT5FbmREYXRlVGltZTwvY29kZT4KKyAqIHJhbmdlIHRoYXQgaWRlbnRpZmllcyBhIHNldCBvZiBtYXRjaGluZyB7QGxpbmsgUHJvZHVjdH1zLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wb3JhbFF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RQQ1NRdWVyeSB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgc3RhcnREYXRlVGltZTsKKworICBwcml2YXRlIFN0cmluZyBlbmREYXRlVGltZTsKKworICBwcml2YXRlIFN0cmluZyB0ZW1wb3JhbEZsZDsKKworICBwdWJsaWMgVGVtcG9yYWxRdWVyeShGaWxlTWFuYWdlclV0aWxzIGZtLCBTdHJpbmcgc3RhcnREYXRlVGltZSwKKyAgICAgIFN0cmluZyBlbmREYXRlVGltZSwgU3RyaW5nIHRlbXBvcmFsRmxkKSB7CisgICAgc3VwZXIoZm0pOworICAgIHRoaXMuc3RhcnREYXRlVGltZSA9IHN0YXJ0RGF0ZVRpbWU7CisgICAgdGhpcy5lbmREYXRlVGltZSA9IGVuZERhdGVUaW1lOworICAgIHRoaXMudGVtcG9yYWxGbGQgPSB0ZW1wb3JhbEZsZDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeS5QQ1NRdWVyeSNidWlsZFF1ZXJ5KCkKKyAgICovCisgIHB1YmxpYyBRdWVyeSBidWlsZFF1ZXJ5KCkgeworICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgUmFuZ2VRdWVyeUNyaXRlcmlhIGNyaXQgPSBuZXcgUmFuZ2VRdWVyeUNyaXRlcmlhKCk7CisgICAgY3JpdC5zZXRFbGVtZW50TmFtZSh0aGlzLnRlbXBvcmFsRmxkKTsKKyAgICBjcml0LnNldEluY2x1c2l2ZSh0cnVlKTsKKworICAgIGlmICh0aGlzLnN0YXJ0RGF0ZVRpbWUgIT0gbnVsbCkgeworICAgICAgY3JpdC5zZXRTdGFydFZhbHVlKHRoaXMuc3RhcnREYXRlVGltZSk7CisgICAgfQorCisgICAgaWYgKHRoaXMuZW5kRGF0ZVRpbWUgIT0gbnVsbCkgeworICAgICAgY3JpdC5zZXRFbmRWYWx1ZSh0aGlzLmVuZERhdGVUaW1lKTsKKyAgICB9CisKKyAgICBxdWVyeS5hZGRDcml0ZXJpb24oY3JpdCk7CisgICAgcmV0dXJuIHF1ZXJ5OworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3Rvb2xzL1BDU0hlYWx0aE1vbml0b3IuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3Rvb2xzL1BDU0hlYWx0aE1vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDVjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdG9vbHMvUENTSGVhbHRoTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsNjQ5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy50b29sczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNDbGllbnQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuZGFlbW9uLkNyYXdsRGFlbW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuRmlsZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuUmVzb3VyY2VNYW5hZ2VyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLldvcmtmbG93TWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLkNyYXdsSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5DcmF3bFByb3BlcnRpZXNGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLkNyYXdsZXJIZWFsdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguQ3Jhd2xlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5Kb2JIZWFsdGhTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguUENTRGFlbW9uU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLlBDU0hlYWx0aE1vbml0b3JNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLlBDU0hlYWx0aE1vbml0b3JSZXBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguV29ya2Zsb3dTdGF0ZXNGaWxlOworCisvKioKKyAqIAorICogQSB0b29sIHRvIG1vbml0b3IgdGhlIGhlYWx0aCBvZiB0aGUgUENTLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQQ1NIZWFsdGhNb25pdG9yIGltcGxlbWVudHMgQ29yZU1ldEtleXMsCisgICAgUENTSGVhbHRoTW9uaXRvck1ldEtleXMgeworCisgIHByaXZhdGUgRmlsZU1hbmFnZXJVdGlscyBmbTsKKworICBwcml2YXRlIFdvcmtmbG93TWFuYWdlclV0aWxzIHdtOworCisgIHByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyVXRpbHMgcm07CisKKyAgcHJpdmF0ZSBDcmF3bFByb3BlcnRpZXNGaWxlIGNyYXdsUHJvcHM7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1N0YXRlc0ZpbGUgc3RhdGVzRmlsZTsKKworICBwdWJsaWMgUENTSGVhbHRoTW9uaXRvcihTdHJpbmcgZm1VcmxTdHIsIFN0cmluZyB3bVVybFN0ciwgU3RyaW5nIHJtVXJsU3RyLAorICAgICAgU3RyaW5nIGNyYXdsUHJvcEZpbGVQYXRoLCBTdHJpbmcgc3RhdGVzRmlsZVBhdGgpCisgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgdGhpcy5mbSA9IG5ldyBGaWxlTWFuYWdlclV0aWxzKGZtVXJsU3RyKTsKKyAgICB0aGlzLndtID0gbmV3IFdvcmtmbG93TWFuYWdlclV0aWxzKHdtVXJsU3RyKTsKKyAgICB0aGlzLnJtID0gbmV3IFJlc291cmNlTWFuYWdlclV0aWxzKHJtVXJsU3RyKTsKKyAgICB0aGlzLmNyYXdsUHJvcHMgPSBuZXcgQ3Jhd2xQcm9wZXJ0aWVzRmlsZShjcmF3bFByb3BGaWxlUGF0aCk7CisgICAgdGhpcy5zdGF0ZXNGaWxlID0gbmV3IFdvcmtmbG93U3RhdGVzRmlsZShzdGF0ZXNGaWxlUGF0aCk7CisgIH0KKworICBwdWJsaWMgUENTSGVhbHRoTW9uaXRvclJlcG9ydCBnZXRSZXBvcnQoKSB7CisgICAgUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQgPSBuZXcgUENTSGVhbHRoTW9uaXRvclJlcG9ydCgpOworICAgIHJlcG9ydC5zZXRHZW5lcmF0aW9uRGF0ZShuZXcgRGF0ZSgpKTsKKyAgICByZXBvcnQuc2V0Rm1TdGF0dXMoZ2V0RmlsZU1hbmFnZXJTdGF0dXMoKSk7CisgICAgcmVwb3J0LnNldFdtU3RhdHVzKGdldFdvcmtmbG93TWFuYWdlclN0YXR1cygpKTsKKyAgICByZXBvcnQuc2V0Um1TdGF0dXMoZ2V0UmVzb3VyY2VNYW5hZ2VyU3RhdHVzKCkpOworICAgIHJlcG9ydC5zZXRCYXRjaFN0dWJTdGF0dXMoZ2V0QmF0Y2hTdHViU3RhdHVzKCkpOworICAgIHJlcG9ydC5zZXRDcmF3bGVyU3RhdHVzKGdldENyYXdsZXJTdGF0dXMoKSk7CisgICAgcmVwb3J0LnNldExhdGVzdFByb2R1Y3RzSW5nZXN0ZWQoZ2V0UHJvZHVjdEhlYWx0aCgpKTsKKyAgICByZXBvcnQuc2V0Sm9iSGVhbHRoU3RhdHVzKGdldEpvYlN0YXR1c0hlYWx0aCgpKTsKKyAgICByZXBvcnQuc2V0Q3Jhd2xlckhlYWx0aFN0YXR1cyhnZXRJbmdlc3RIZWFsdGgoKSk7CisKKyAgICByZXR1cm4gcmVwb3J0OworICB9CisKKyAgcHVibGljIHZvaWQgcXVpY2tQcmludE1vbml0b3JUb0NvbnNvbGUoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKEhFQURFUl9BTkRfRk9PVEVSKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oUkVQT1JUX0JBTk5FUik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0ZWQgb246ICIKKyAgICAgICAgKyBEYXRlVXRpbHMudG9TdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aWNlIFN0YXR1czoiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKEZJTEVfTUFOQUdFUl9EQUVNT05fTkFNRQorICAgICAgICArIGdldFN0clBhZGRpbmcoRklMRV9NQU5BR0VSX0RBRU1PTl9OQU1FLCBXT1JLRkxPV19NQU5BR0VSX0RBRU1PTl9OQU1FKQorICAgICAgICArICI6XHRbIiArIHRoaXMuZm0uZ2V0Rm1VcmwoKSArICJdOiAiICsgcHJpbnRVcChnZXRGbVVwKCkpKTsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbihXT1JLRkxPV19NQU5BR0VSX0RBRU1PTl9OQU1FICsgIjpcdFsiCisgICAgICAgICsgdGhpcy53bS5nZXRXbVVybCgpICsgIl06ICIgKyBwcmludFVwKGdldFdtVXAoKSkpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKFJFU09VUkNFX01BTkFHRVJfREFFTU9OX05BTUUgKyAiOlx0WyIKKyAgICAgICAgKyB0aGlzLnJtLmdldFJlc21nclVybCgpICsgIl06ICIgKyBwcmludFVwKGdldFJtVXAoKSkpOworCisgICAgcXVpY2tQcmludEJhdGNoU3R1YnMoKTsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmF3bGVyczoiKTsKKyAgICBxdWlja1ByaW50Q3Jhd2xlcnMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJQQ1MgSGVhbHRoOiAiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZXM6Iik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKFNFQ1RJT05fU0VQQVJBVE9SKTsKKworICAgIHF1aWNrUHJpbnRQcm9kdWN0SGVhbHRoKCk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSm9iczoiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oU0VDVElPTl9TRVBBUkFUT1IpOworCisgICAgcXVpY2tQcmludEpvYlN0YXR1c0hlYWx0aCgpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluZ2VzdDoiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oU0VDVElPTl9TRVBBUkFUT1IpOworCisgICAgcXVpY2tQcmludEluZ2VzdFN0YXR1c0hlYWx0aCgpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKEhFQURFUl9BTkRfRk9PVEVSKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgcHJpbnRNb25pdG9yVG9Db25zb2xlKFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0KSB7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oSEVBREVSX0FORF9GT09URVIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihSRVBPUlRfQkFOTkVSKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRlZCBvbjogIiArIHJlcG9ydC5nZXRDcmVhdGVEYXRlSXNvRm9ybWF0KCkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aWNlIFN0YXR1czoiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKHJlcG9ydC5nZXRGbVN0YXR1cygpLmdldERhZW1vbk5hbWUoKQorICAgICAgICArIGdldFN0clBhZGRpbmcocmVwb3J0LmdldEZtU3RhdHVzKCkuZ2V0RGFlbW9uTmFtZSgpLCByZXBvcnQKKyAgICAgICAgICAgIC5nZXRXbVN0YXR1cygpLmdldERhZW1vbk5hbWUoKSkgKyAiOlx0WyIKKyAgICAgICAgKyByZXBvcnQuZ2V0Rm1TdGF0dXMoKS5nZXRVcmxTdHIoKSArICJdOiAiCisgICAgICAgICsgcmVwb3J0LmdldEZtU3RhdHVzKCkuZ2V0U3RhdHVzKCkpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKHJlcG9ydC5nZXRXbVN0YXR1cygpLmdldERhZW1vbk5hbWUoKSArICI6XHRbIgorICAgICAgICArIHJlcG9ydC5nZXRXbVN0YXR1cygpLmdldFVybFN0cigpICsgIl06ICIKKyAgICAgICAgKyByZXBvcnQuZ2V0V21TdGF0dXMoKS5nZXRTdGF0dXMoKSk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVwb3J0LmdldFJtU3RhdHVzKCkuZ2V0RGFlbW9uTmFtZSgpICsgIjpcdFsiCisgICAgICAgICsgcmVwb3J0LmdldFJtU3RhdHVzKCkuZ2V0VXJsU3RyKCkgKyAiXTogIgorICAgICAgICArIHJlcG9ydC5nZXRSbVN0YXR1cygpLmdldFN0YXR1cygpKTsKKworICAgIHByaW50QmF0Y2hTdHVicyhyZXBvcnQpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyYXdsZXJzOiIpOworICAgIHByaW50Q3Jhd2xlcnMocmVwb3J0KTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJQQ1MgSGVhbHRoOiAiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZXM6Iik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKFNFQ1RJT05fU0VQQVJBVE9SKTsKKworICAgIHByaW50UHJvZHVjdEhlYWx0aChyZXBvcnQpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpvYnM6Iik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKFNFQ1RJT05fU0VQQVJBVE9SKTsKKworICAgIHByaW50Sm9iU3RhdHVzSGVhbHRoKHJlcG9ydCk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5nZXN0OiIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihTRUNUSU9OX1NFUEFSQVRPUik7CisKKyAgICBwcmludEluZ2VzdFN0YXR1c0hlYWx0aChyZXBvcnQpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKEhFQURFUl9BTkRfRk9PVEVSKTsKKworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHVzYWdlID0gIlBDU0hlYWx0aE1vbml0b3IgPGZtIHVybD4gPHdtIHVybD4gPHJtIHVybD4gPGNyYXdsZXIgeG1sIGZpbGUgcGF0aD4gPHdvcmtmbG93IHN0YXRlcyB4bWwgZmlsZSBwYXRoPlxuIjsKKyAgICBTdHJpbmcgZm1VcmxTdHIgPSBudWxsLCB3bVVybFN0ciA9IG51bGwsIHJtVXJsU3RyID0gbnVsbDsKKyAgICBTdHJpbmcgY3Jhd2xlclhtbEZpbGVQYXRoID0gbnVsbCwgd29ya2Zsb3dTdGF0ZVhtbFBhdGggPSBudWxsOworCisgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICBmbVVybFN0ciA9IGFyZ3NbMF07CisgICAgd21VcmxTdHIgPSBhcmdzWzFdOworICAgIHJtVXJsU3RyID0gYXJnc1syXTsKKyAgICBjcmF3bGVyWG1sRmlsZVBhdGggPSBhcmdzWzNdOworICAgIHdvcmtmbG93U3RhdGVYbWxQYXRoID0gYXJnc1s0XTsKKworICAgIFBDU0hlYWx0aE1vbml0b3IgbW9uID0gbmV3IFBDU0hlYWx0aE1vbml0b3IoZm1VcmxTdHIsIHdtVXJsU3RyLCBybVVybFN0ciwKKyAgICAgICAgY3Jhd2xlclhtbEZpbGVQYXRoLCB3b3JrZmxvd1N0YXRlWG1sUGF0aCk7CisgICAgdHJ5IHsKKyAgICAgIG1vbi5xdWlja1ByaW50TW9uaXRvclRvQ29uc29sZSgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgUENTRGFlbW9uU3RhdHVzIGdldEZpbGVNYW5hZ2VyU3RhdHVzKCkgeworICAgIFBDU0RhZW1vblN0YXR1cyBmbVN0YXR1cyA9IG5ldyBQQ1NEYWVtb25TdGF0dXMoKTsKKworICAgIGZtU3RhdHVzLnNldERhZW1vbk5hbWUoRklMRV9NQU5BR0VSX0RBRU1PTl9OQU1FKTsKKyAgICBmbVN0YXR1cy5zZXRTdGF0dXMocHJpbnRVcChnZXRGbVVwKCkpKTsKKyAgICBmbVN0YXR1cy5zZXRVcmxTdHIodGhpcy5mbS5nZXRGbVVybCgpLnRvU3RyaW5nKCkpOworCisgICAgcmV0dXJuIGZtU3RhdHVzOworICB9CisKKyAgcHJpdmF0ZSBQQ1NEYWVtb25TdGF0dXMgZ2V0V29ya2Zsb3dNYW5hZ2VyU3RhdHVzKCkgeworICAgIFBDU0RhZW1vblN0YXR1cyB3bVN0YXR1cyA9IG5ldyBQQ1NEYWVtb25TdGF0dXMoKTsKKworICAgIHdtU3RhdHVzLnNldERhZW1vbk5hbWUoV09SS0ZMT1dfTUFOQUdFUl9EQUVNT05fTkFNRSk7CisgICAgd21TdGF0dXMuc2V0U3RhdHVzKHByaW50VXAoZ2V0V21VcCgpKSk7CisgICAgd21TdGF0dXMuc2V0VXJsU3RyKHRoaXMud20uZ2V0V21VcmwoKS50b1N0cmluZygpKTsKKworICAgIHJldHVybiB3bVN0YXR1czsKKyAgfQorCisgIHByaXZhdGUgUENTRGFlbW9uU3RhdHVzIGdldFJlc291cmNlTWFuYWdlclN0YXR1cygpIHsKKyAgICBQQ1NEYWVtb25TdGF0dXMgcm1TdGF0dXMgPSBuZXcgUENTRGFlbW9uU3RhdHVzKCk7CisKKyAgICBybVN0YXR1cy5zZXREYWVtb25OYW1lKFJFU09VUkNFX01BTkFHRVJfREFFTU9OX05BTUUpOworICAgIHJtU3RhdHVzLnNldFN0YXR1cyhwcmludFVwKGdldFJtVXAoKSkpOworICAgIHJtU3RhdHVzLnNldFVybFN0cih0aGlzLnJtLmdldFJlc21nclVybCgpLnRvU3RyaW5nKCkpOworCisgICAgcmV0dXJuIHJtU3RhdHVzOworICB9CisKKyAgcHJpdmF0ZSBMaXN0IGdldEJhdGNoU3R1YlN0YXR1cygpIHsKKyAgICBMaXN0IGJhdGNoU3R1YlN0YXR1cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIGlmIChnZXRSbVVwKCkpIHsKKyAgICAgIC8vIG9ubHkgcHJpbnQgaWYgdGhlIHJlc291cmNlIG1hbmFnZXIgaXMgdXAKKyAgICAgIExpc3QgcmVzTm9kZXMgPSBybS5zYWZlR2V0UmVzb3VyY2VOb2RlcygpOworCisgICAgICBpZiAocmVzTm9kZXMgIT0gbnVsbCAmJiByZXNOb2Rlcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc05vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlID0gKFJlc291cmNlTm9kZSkgaS5uZXh0KCk7CisgICAgICAgICAgUENTRGFlbW9uU3RhdHVzIGJhdGNoU3RhdHVzID0gbmV3IFBDU0RhZW1vblN0YXR1cygpOworICAgICAgICAgIGJhdGNoU3RhdHVzLnNldERhZW1vbk5hbWUoQkFUQ0hfU1RVQl9EQUVNT05fTkFNRSk7CisgICAgICAgICAgYmF0Y2hTdGF0dXMuc2V0VXJsU3RyKG5vZGUuZ2V0SXBBZGRyKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYmF0Y2hTdGF0dXMuc2V0U3RhdHVzKHByaW50VXAoZ2V0QmF0Y2hTdHViVXAobm9kZSkpKTsKKyAgICAgICAgICBiYXRjaFN0dWJTdGF0dXMuYWRkKGJhdGNoU3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiYXRjaFN0dWJTdGF0dXM7CisgIH0KKworICBwcml2YXRlIExpc3QgZ2V0Q3Jhd2xlclN0YXR1cygpIHsKKyAgICBMaXN0IGNyYXdsZXJzID0gdGhpcy5jcmF3bFByb3BzLmdldENyYXdsZXJzKCk7CisgICAgU3RyaW5nIGNyYXdsSG9zdCA9IHRoaXMuY3Jhd2xQcm9wcy5nZXRDcmF3bEhvc3QoKTsKKyAgICBMaXN0IHN0YXR1c2VzID0gbmV3IFZlY3RvcigpOworCisgICAgaWYgKGNyYXdsZXJzICE9IG51bGwgJiYgY3Jhd2xlcnMuc2l6ZSgpID4gMCkgeworICAgICAgQ29sbGVjdGlvbnMuc29ydChjcmF3bGVycywgbmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgIENyYXdsSW5mbyBjMSA9IChDcmF3bEluZm8pIG8xOworICAgICAgICAgIENyYXdsSW5mbyBjMiA9IChDcmF3bEluZm8pIG8yOworCisgICAgICAgICAgcmV0dXJuIGMxLmdldENyYXdsZXJOYW1lKCkuY29tcGFyZVRvKGMyLmdldENyYXdsZXJOYW1lKCkpOworICAgICAgICB9CisKKyAgICAgIH0pOworCisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjcmF3bGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgQ3Jhd2xJbmZvIGluZm8gPSAoQ3Jhd2xJbmZvKSBpLm5leHQoKTsKKyAgICAgICAgU3RyaW5nIGNyYXdsZXJVcmxTdHIgPSAiaHR0cDovLyIgKyBjcmF3bEhvc3QgKyAiOiIKKyAgICAgICAgICAgICsgaW5mby5nZXRDcmF3bGVyUG9ydCgpOworICAgICAgICBDcmF3bGVyU3RhdHVzIHN0YXR1cyA9IG5ldyBDcmF3bGVyU3RhdHVzKCk7CisgICAgICAgIHN0YXR1cy5zZXRJbmZvKGluZm8pOworICAgICAgICBzdGF0dXMuc2V0U3RhdHVzKHByaW50VXAoZ2V0Q3Jhd2xlclVwKGNyYXdsZXJVcmxTdHIpKSk7CisgICAgICAgIHN0YXR1cy5zZXRDcmF3bEhvc3QoY3Jhd2xIb3N0KTsKKyAgICAgICAgc3RhdHVzZXMuYWRkKHN0YXR1cyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1c2VzOworCisgIH0KKworICBwcml2YXRlIExpc3QgZ2V0UHJvZHVjdEhlYWx0aCgpIHsKKyAgICBpZiAoZ2V0Rm1VcCgpKSB7CisgICAgICByZXR1cm4gdGhpcy5mbS5zYWZlR2V0VG9wTlByb2R1Y3RzKFRPUF9OX1BST0RVQ1RTKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yKCk7CisgIH0KKworICBwcml2YXRlIExpc3QgZ2V0Sm9iU3RhdHVzSGVhbHRoKCkgeworICAgIGlmICghZ2V0V21VcCgpKSB7CisgICAgICByZXR1cm4gbmV3IFZlY3RvcigpOworICAgIH0KKworICAgIExpc3Qgc3RhdHVzZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgTGlzdCBzdGF0ZXMgPSB0aGlzLnN0YXRlc0ZpbGUuZ2V0U3RhdGVzKCk7CisKKyAgICBpZiAoc3RhdGVzICE9IG51bGwgJiYgc3RhdGVzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0YXRlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgIGludCBudW1QaXBlbGluZXMgPSB0aGlzLndtLnNhZmVHZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHN0YXRlKTsKKyAgICAgICAgaWYgKG51bVBpcGVsaW5lcyA9PSAtMSkgeworICAgICAgICAgIG51bVBpcGVsaW5lcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBKb2JIZWFsdGhTdGF0dXMgam9iU3RhdHVzID0gbmV3IEpvYkhlYWx0aFN0YXR1cygpOworICAgICAgICBqb2JTdGF0dXMuc2V0U3RhdHVzKHN0YXRlKTsKKyAgICAgICAgam9iU3RhdHVzLnNldE51bVBpcGVsaW5lcyhudW1QaXBlbGluZXMpOworICAgICAgICBzdGF0dXNlcy5hZGQoam9iU3RhdHVzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzZXM7CisgIH0KKworICBwcml2YXRlIExpc3QgZ2V0SW5nZXN0SGVhbHRoKCkgeworICAgIGlmICh0aGlzLmNyYXdsUHJvcHMuZ2V0Q3Jhd2xlcnMoKSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbmV3IFZlY3RvcigpOworICAgIH0KKworICAgIExpc3Qgc3RhdHVzZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLmNyYXdsUHJvcHMuZ2V0Q3Jhd2xlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIENyYXdsSW5mbyBpbmZvID0gKENyYXdsSW5mbykgaS5uZXh0KCk7CisgICAgICBTdHJpbmcgY3Jhd2xVcmxTdHIgPSAiaHR0cDovLyIgKyB0aGlzLmNyYXdsUHJvcHMuZ2V0Q3Jhd2xIb3N0KCkgKyAiOiIKKyAgICAgICAgICArIGluZm8uZ2V0Q3Jhd2xlclBvcnQoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIENyYXdsRGFlbW9uQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IENyYXdsRGFlbW9uQ29udHJvbGxlcigKKyAgICAgICAgICAgIGNyYXdsVXJsU3RyKTsKKyAgICAgICAgQ3Jhd2xlckhlYWx0aCBoZWFsdGggPSBuZXcgQ3Jhd2xlckhlYWx0aCgpOworICAgICAgICBoZWFsdGguc2V0Q3Jhd2xlck5hbWUoaW5mby5nZXRDcmF3bGVyTmFtZSgpKTsKKyAgICAgICAgaGVhbHRoLnNldE51bUNyYXdscyhjb250cm9sbGVyLmdldE51bUNyYXdscygpKTsKKyAgICAgICAgaGVhbHRoCisgICAgICAgICAgICAuc2V0QXZnQ3Jhd2xUaW1lKChkb3VibGUpIChjb250cm9sbGVyLmdldEF2ZXJhZ2VDcmF3bFRpbWUoKSAvIDEwMDAuMCkpOworICAgICAgICBzdGF0dXNlcy5hZGQoaGVhbHRoKTsKKworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgQ3Jhd2xlckhlYWx0aCBoZWFsdGggPSBuZXcgQ3Jhd2xlckhlYWx0aCgpOworICAgICAgICBoZWFsdGguc2V0Q3Jhd2xlck5hbWUoaW5mby5nZXRDcmF3bGVyTmFtZSgpKTsKKyAgICAgICAgaGVhbHRoLnNldE51bUNyYXdscyhDUkFXTEVSX0RPV05fSU5UKTsKKyAgICAgICAgaGVhbHRoLnNldEF2Z0NyYXdsVGltZShDUkFXTEVSX0RPV05fRE9VQkxFKTsKKyAgICAgICAgc3RhdHVzZXMuYWRkKGhlYWx0aCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzZXM7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJpbnRJbmdlc3RTdGF0dXNIZWFsdGgoUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQpIHsKKyAgICBpZiAocmVwb3J0LmdldENyYXdsZXJIZWFsdGhTdGF0dXMoKSAhPSBudWxsCisgICAgICAgICYmIHJlcG9ydC5nZXRDcmF3bGVySGVhbHRoU3RhdHVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVwb3J0LmdldENyYXdsZXJIZWFsdGhTdGF0dXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgQ3Jhd2xlckhlYWx0aCBoZWFsdGggPSAoQ3Jhd2xlckhlYWx0aCkgaS5uZXh0KCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoaGVhbHRoLmdldENyYXdsZXJOYW1lKCkgKyAiOiIpOworICAgICAgICBpZiAoaGVhbHRoLmdldE51bUNyYXdscygpID09IENSQVdMRVJfRE9XTl9JTlQpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBET1dOIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBDcmF3bHM6ICIgKyBoZWFsdGguZ2V0TnVtQ3Jhd2xzKCkpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXZlcmFnZSBDcmF3bCBUaW1lIChzZWNvbmRzKTogIgorICAgICAgICAgICAgICArIGhlYWx0aC5nZXRBdmdDcmF3bFRpbWUoKSk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJpbnRKb2JTdGF0dXNIZWFsdGgoUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQpIHsKKyAgICBpZiAocmVwb3J0LmdldEpvYkhlYWx0aFN0YXR1cygpICE9IG51bGwKKyAgICAgICAgJiYgcmVwb3J0LmdldEpvYkhlYWx0aFN0YXR1cygpLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlcG9ydC5nZXRKb2JIZWFsdGhTdGF0dXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgSm9iSGVhbHRoU3RhdHVzIHN0YXR1cyA9IChKb2JIZWFsdGhTdGF0dXMpIGkubmV4dCgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzLmdldE51bVBpcGVsaW5lcygpICsgIiBwaXBlbGluZXMgIgorICAgICAgICAgICAgKyBzdGF0dXMuZ2V0U3RhdHVzKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcmludFByb2R1Y3RIZWFsdGgoUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQpIHsKKyAgICBpZiAocmVwb3J0LmdldExhdGVzdFByb2R1Y3RzSW5nZXN0ZWQoKSAhPSBudWxsCisgICAgICAgICYmIHJlcG9ydC5nZXRMYXRlc3RQcm9kdWN0c0luZ2VzdGVkKCkuc2l6ZSgpID4gMCkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMYXRlc3QgIiArIFRPUF9OX1BST0RVQ1RTICsgIiBwcm9kdWN0cyBpbmdlc3RlZDoiKTsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlcG9ydC5nZXRMYXRlc3RQcm9kdWN0c0luZ2VzdGVkKCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgIFByb2R1Y3QgcCA9IChQcm9kdWN0KSBpLm5leHQoKTsKKyAgICAgICAgcC5zZXRQcm9kdWN0VHlwZShmbS5zYWZlR2V0UHJvZHVjdFR5cGVCeUlkKHAuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICBwLnNldFByb2R1Y3RSZWZlcmVuY2VzKGZtLnNhZmVHZXRQcm9kdWN0UmVmZXJlbmNlcyhwKSk7CisgICAgICAgIE1ldGFkYXRhIHByb2RNZXQgPSBmbS5zYWZlR2V0TWV0YWRhdGEocCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmbS5nZXRGaWxlUGF0aChwKSArICIgYXQ6ICIKKyAgICAgICAgICAgICsgcHJvZE1ldC5nZXRNZXRhZGF0YSgiQ0FTLiIgKyBQUk9EVUNUX1JFQ0VWSUVEX1RJTUUpKTsKKyAgICAgIH0KKworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcmludEJhdGNoU3R1YnMoUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQpIHsKKyAgICBpZiAocmVwb3J0LmdldEJhdGNoU3R1YlN0YXR1cygpICE9IG51bGwKKyAgICAgICAgJiYgcmVwb3J0LmdldEJhdGNoU3R1YlN0YXR1cygpLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlcG9ydC5nZXRCYXRjaFN0dWJTdGF0dXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUENTRGFlbW9uU3RhdHVzIGJhdGNoU3RhdHVzID0gKFBDU0RhZW1vblN0YXR1cykgaS5uZXh0KCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPiAiICsgYmF0Y2hTdGF0dXMuZ2V0RGFlbW9uTmFtZSgpICsgIjogWyIKKyAgICAgICAgICAgICsgYmF0Y2hTdGF0dXMuZ2V0VXJsU3RyKCkgKyAiXTogIiArIGJhdGNoU3RhdHVzLmdldFN0YXR1cygpKTsKKyAgICAgIH0KKworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcmludENyYXdsZXJzKFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0KSB7CisgICAgaWYgKHJlcG9ydC5nZXRDcmF3bGVyU3RhdHVzKCkgIT0gbnVsbAorICAgICAgICAmJiByZXBvcnQuZ2V0Q3Jhd2xlclN0YXR1cygpLnNpemUoKSA+IDApIHsKKyAgICAgIExpc3QgY3Jhd2xlcnMgPSB0aGlzLmNyYXdsUHJvcHMuZ2V0Q3Jhd2xlcnMoKTsKKyAgICAgIFN0cmluZyBiaWdnZXN0U3RyaW5nID0gZ2V0QmlnZ2VzdFN0cmluZyhjcmF3bGVycyk7CisKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlcG9ydC5nZXRDcmF3bGVyU3RhdHVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIENyYXdsZXJTdGF0dXMgc3RhdHVzID0gKENyYXdsZXJTdGF0dXMpIGkubmV4dCgpOworICAgICAgICBTdHJpbmcgY3Jhd2xlclVybFN0ciA9ICJodHRwOi8vIiArIHN0YXR1cy5nZXRDcmF3bEhvc3QoKSArICI6IgorICAgICAgICAgICAgKyBzdGF0dXMuZ2V0SW5mbygpLmdldENyYXdsZXJQb3J0KCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRTdHJQYWRkaW5nKHN0YXR1cy5nZXRJbmZvKCkuZ2V0Q3Jhd2xlck5hbWUoKSwKKyAgICAgICAgICAgIGJpZ2dlc3RTdHJpbmcpCisgICAgICAgICAgICArIHN0YXR1cy5nZXRJbmZvKCkuZ2V0Q3Jhd2xlck5hbWUoKQorICAgICAgICAgICAgKyAiOiBbIgorICAgICAgICAgICAgKyBjcmF3bGVyVXJsU3RyCisgICAgICAgICAgICArICJdOiAiCisgICAgICAgICAgICArIHN0YXR1cy5nZXRTdGF0dXMoKSk7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBxdWlja1ByaW50Q3Jhd2xlcnMoKSB7CisgICAgTGlzdCBjcmF3bGVycyA9IHRoaXMuY3Jhd2xQcm9wcy5nZXRDcmF3bGVycygpOworICAgIFN0cmluZyBjcmF3bEhvc3QgPSB0aGlzLmNyYXdsUHJvcHMuZ2V0Q3Jhd2xIb3N0KCk7CisKKyAgICBpZiAoY3Jhd2xlcnMgIT0gbnVsbCAmJiBjcmF3bGVycy5zaXplKCkgPiAwKSB7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNyYXdsZXJzLCBuZXcgQ29tcGFyYXRvcigpIHsKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgQ3Jhd2xJbmZvIGMxID0gKENyYXdsSW5mbykgbzE7CisgICAgICAgICAgQ3Jhd2xJbmZvIGMyID0gKENyYXdsSW5mbykgbzI7CisKKyAgICAgICAgICByZXR1cm4gYzEuZ2V0Q3Jhd2xlck5hbWUoKS5jb21wYXJlVG8oYzIuZ2V0Q3Jhd2xlck5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgfSk7CisKKyAgICAgIFN0cmluZyBiaWdnZXN0U3RyaW5nID0gZ2V0QmlnZ2VzdFN0cmluZyhjcmF3bGVycyk7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjcmF3bGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgQ3Jhd2xJbmZvIGluZm8gPSAoQ3Jhd2xJbmZvKSBpLm5leHQoKTsKKyAgICAgICAgU3RyaW5nIGNyYXdsZXJVcmxTdHIgPSAiaHR0cDovLyIgKyBjcmF3bEhvc3QgKyAiOiIKKyAgICAgICAgICAgICsgaW5mby5nZXRDcmF3bGVyUG9ydCgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0U3RyUGFkZGluZyhpbmZvLmdldENyYXdsZXJOYW1lKCksIGJpZ2dlc3RTdHJpbmcpCisgICAgICAgICAgICArIGluZm8uZ2V0Q3Jhd2xlck5hbWUoKSArICI6IFsiICsgY3Jhd2xlclVybFN0ciArICJdOiAiCisgICAgICAgICAgICArIHByaW50VXAoZ2V0Q3Jhd2xlclVwKGNyYXdsZXJVcmxTdHIpKSk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHZvaWQgcXVpY2tQcmludEJhdGNoU3R1YnMoKSB7CisgICAgTGlzdCByZXNOb2RlcyA9IG51bGw7CisKKyAgICBpZiAoZ2V0Um1VcCgpKSB7CisgICAgICAvLyBvbmx5IHByaW50IGlmIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIHVwCisgICAgICByZXNOb2RlcyA9IHJtLnNhZmVHZXRSZXNvdXJjZU5vZGVzKCk7CisKKyAgICAgIGlmIChyZXNOb2RlcyAhPSBudWxsICYmIHJlc05vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVzTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgUmVzb3VyY2VOb2RlIG5vZGUgPSAoUmVzb3VyY2VOb2RlKSBpLm5leHQoKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4gIiArIEJBVENIX1NUVUJfREFFTU9OX05BTUUgKyAiOiBbIgorICAgICAgICAgICAgICArIG5vZGUuZ2V0SXBBZGRyKCkgKyAiXTogIiArIHByaW50VXAoZ2V0QmF0Y2hTdHViVXAobm9kZSkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBxdWlja1ByaW50Sm9iU3RhdHVzSGVhbHRoKCkgeworICAgIGlmICghZ2V0V21VcCgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdCBzdGF0ZXMgPSB0aGlzLnN0YXRlc0ZpbGUuZ2V0U3RhdGVzKCk7CisKKyAgICBpZiAoc3RhdGVzICE9IG51bGwgJiYgc3RhdGVzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0YXRlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgIGludCBudW1QaXBlbGluZXMgPSB0aGlzLndtLnNhZmVHZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHN0YXRlKTsKKyAgICAgICAgaWYgKG51bVBpcGVsaW5lcyA9PSAtMSkgeworICAgICAgICAgIG51bVBpcGVsaW5lcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG51bVBpcGVsaW5lcyArICIgcGlwZWxpbmVzICIgKyBzdGF0ZSk7CisKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcXVpY2tQcmludFByb2R1Y3RIZWFsdGgoKSB7CisgICAgaWYgKGdldEZtVXAoKSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMYXRlc3QgIiArIFRPUF9OX1BST0RVQ1RTICsgIiBwcm9kdWN0cyBpbmdlc3RlZDoiKTsKKworICAgICAgTGlzdCBwcm9kcyA9IHRoaXMuZm0uc2FmZUdldFRvcE5Qcm9kdWN0cyhUT1BfTl9QUk9EVUNUUyk7CisKKyAgICAgIGlmIChwcm9kcyAhPSBudWxsICYmIHByb2RzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgUHJvZHVjdCBwID0gKFByb2R1Y3QpIGkubmV4dCgpOworICAgICAgICAgIHAuc2V0UHJvZHVjdFR5cGUoZm0uc2FmZUdldFByb2R1Y3RUeXBlQnlJZChwLmdldFByb2R1Y3RUeXBlKCkKKyAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlSWQoKSkpOworICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoZm0uc2FmZUdldFByb2R1Y3RSZWZlcmVuY2VzKHApKTsKKyAgICAgICAgICBNZXRhZGF0YSBwcm9kTWV0ID0gZm0uc2FmZUdldE1ldGFkYXRhKHApOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmbS5nZXRGaWxlUGF0aChwKSArICIgYXQ6ICIKKyAgICAgICAgICAgICAgKyBwcm9kTWV0LmdldE1ldGFkYXRhKCJDQVMuIiArIFBST0RVQ1RfUkVDRVZJRURfVElNRSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcXVpY2tQcmludEluZ2VzdFN0YXR1c0hlYWx0aCgpIHsKKyAgICBpZiAodGhpcy5jcmF3bFByb3BzLmdldENyYXdsZXJzKCkgPT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMuY3Jhd2xQcm9wcy5nZXRDcmF3bGVycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgQ3Jhd2xJbmZvIGluZm8gPSAoQ3Jhd2xJbmZvKSBpLm5leHQoKTsKKyAgICAgIFN0cmluZyBjcmF3bFVybFN0ciA9ICJodHRwOi8vIiArIHRoaXMuY3Jhd2xQcm9wcy5nZXRDcmF3bEhvc3QoKSArICI6IgorICAgICAgICAgICsgaW5mby5nZXRDcmF3bGVyUG9ydCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgQ3Jhd2xEYWVtb25Db250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ3Jhd2xEYWVtb25Db250cm9sbGVyKAorICAgICAgICAgICAgY3Jhd2xVcmxTdHIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5mby5nZXRDcmF3bGVyTmFtZSgpICsgIjoiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgQ3Jhd2xzOiAiICsgY29udHJvbGxlci5nZXROdW1DcmF3bHMoKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXZlcmFnZSBDcmF3bCBUaW1lIChzZWNvbmRzKTogIgorICAgICAgICAgICAgKyAoZG91YmxlKSAoY29udHJvbGxlci5nZXRBdmVyYWdlQ3Jhd2xUaW1lKCkgLyAxMDAwLjApKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluZm8uZ2V0Q3Jhd2xlck5hbWUoKSArICI6IERPV04iKTsKKyAgICAgIH0KKworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldEJpZ2dlc3RTdHJpbmcoTGlzdCBjcmF3bEluZm9zKSB7CisgICAgaW50IGJpZ2dlc3RTdHJTeiA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgIFN0cmluZyBiaWdnZXN0U3RyID0gbnVsbDsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IGNyYXdsSW5mb3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBDcmF3bEluZm8gaW5mbyA9IChDcmF3bEluZm8pIGkubmV4dCgpOworICAgICAgU3RyaW5nIGNyYXdsSW5mb05hbWUgPSBpbmZvLmdldENyYXdsZXJOYW1lKCk7CisgICAgICBpZiAoY3Jhd2xJbmZvTmFtZS5sZW5ndGgoKSA+IGJpZ2dlc3RTdHJTeikgeworICAgICAgICBiaWdnZXN0U3RyID0gY3Jhd2xJbmZvTmFtZTsKKyAgICAgICAgYmlnZ2VzdFN0clN6ID0gYmlnZ2VzdFN0ci5sZW5ndGgoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmlnZ2VzdFN0cjsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFN0clBhZGRpbmcoU3RyaW5nIGluaXRTdHJpbmcsIFN0cmluZyBjb21wYXJlU3RyaW5nKSB7CisgICAgaW50IHNpemVJbml0U3RyID0gaW5pdFN0cmluZy5sZW5ndGgoKTsKKyAgICBpbnQgc2l6ZUNvbXBhcmVTdHIgPSBjb21wYXJlU3RyaW5nLmxlbmd0aCgpOworCisgICAgaW50IGRpZmYgPSBNYXRoLmFicyhzaXplSW5pdFN0ciAtIHNpemVDb21wYXJlU3RyKTsKKyAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlmZjsgaSsrKSB7CisgICAgICBidWYuYXBwZW5kKCIgIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGdldEJhdGNoU3R1YlVwKFJlc291cmNlTm9kZSBub2RlKSB7CisgICAgWG1sUnBjQ2xpZW50IGNsaWVudCA9IG5ldyBYbWxScGNDbGllbnQobm9kZS5nZXRJcEFkZHIoKSk7CisgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImJhdGNoc3R1Yi5pc0FsaXZlIiwgYXJnTGlzdCkpCisgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGdldENyYXdsZXJVcChTdHJpbmcgY3Jhd2xVcmxTdHIpIHsKKyAgICBDcmF3bERhZW1vbkNvbnRyb2xsZXIgY29udHJvbGxlciA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29udHJvbGxlciA9IG5ldyBDcmF3bERhZW1vbkNvbnRyb2xsZXIoY3Jhd2xVcmxTdHIpOworICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuaXNSdW5uaW5nKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gZ2V0Rm1VcCgpIHsKKyAgICByZXR1cm4gZm0uZ2V0Rm1nckNsaWVudCgpICE9IG51bGwgPyBmbS5nZXRGbWdyQ2xpZW50KCkuaXNBbGl2ZSgpIDogZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gZ2V0V21VcCgpIHsKKyAgICB0cnkgeworICAgICAgd20uZ2V0Q2xpZW50KCkuZ2V0UmVnaXN0ZXJlZEV2ZW50cygpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gZ2V0Um1VcCgpIHsKKyAgICB0cnkgeworICAgICAgcm0uZ2V0Q2xpZW50KCkuZ2V0Tm9kZXMoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgcHJpbnRVcChib29sZWFuIHVwRmxhZykgeworICAgIHJldHVybiB1cEZsYWcgPyBTVEFUVVNfVVAgOiBTVEFUVVNfRE9XTjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy90b29scy9QQ1NMb25nTGlzdGVyLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy90b29scy9QQ1NMb25nTGlzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlYWJkMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3Rvb2xzL1BDU0xvbmdMaXN0ZXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MudG9vbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5saXN0aW5nLkxpc3RpbmdDb25mOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MubWV0YWRhdGEuUENTTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5xdWVyeS5JbnB1dEZpbGVzUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLkZpbGVNYW5hZ2VyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIFRoZSBQQ1MgTG9uZyBMaXN0ZXIgdG9vbDogbWltaWNzIFVOSVgtbHMgYW5kIGxvb2tzIHVwIGRlc2NlbmRhbnQgbWV0YWRhdGEgZm9yCisgKiBmaWVsZHMgbGlrZSBUZXN0VGFnLCBTdWJUZXN0VGFnLCBUZXN0Q291bnRlci4gQWxzbyBkaXNwbGF5cyBGaWxlbmFtZSwKKyAqIFN0YXJ0RGF0ZVRpbWUsIGFuZCBFbmREYXRlVGltZSBmb3IgZWFjaCBsaXN0ZWQgZmlsZSwgYW5kIGFueSBvZiBpdHMgbWV0IGtleXMKKyAqIGNvbmZpZ3VyZWQgaW4gdGhlIDxjb2RlPnBjcy1sbC1jb25mLnhtbDwvY29kZT4gZmlsZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQQ1NMb25nTGlzdGVyIGltcGxlbWVudHMgUENTTWV0YWRhdGEsIENvcmVNZXRLZXlzIHsKKworICBwcml2YXRlIEZpbGVNYW5hZ2VyVXRpbHMgZm07CisKKyAgcHJpdmF0ZSBMaXN0aW5nQ29uZiBjb25mOworCisgIHB1YmxpYyBQQ1NMb25nTGlzdGVyKFN0cmluZyBmbVVybFN0ciwgU3RyaW5nIGNvbmZGaWxlKQorICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIGZtID0gbmV3IEZpbGVNYW5hZ2VyVXRpbHMoZm1VcmxTdHIpOworICAgIHRyeSB7CisgICAgICB0aGlzLmNvbmYgPSBuZXcgTGlzdGluZ0NvbmYobmV3IEZpbGUoY29uZkZpbGUpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvTGlzdChMaXN0IHByb2ROYW1lcykgeworICAgIGlmIChwcm9kTmFtZXMgIT0gbnVsbCAmJiBwcm9kTmFtZXMuc2l6ZSgpID4gMCkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldFRvb2xIZWFkZXIoKSk7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9kTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIFN0cmluZyBwcm9kTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHByb2R1Y3QgbmFtZSBoYXMgYSAiLyIgaW4gaXQKKyAgICAgICAgLy8gKHRoaXMgaXMgdHJ1ZSBpbiB0aGUgY2FzZSBvZiBzb21lb25lIHVzaW5nICovKiBmcm9tCisgICAgICAgIC8vIGEgc2hlbGwpOiBpZiBpdCBkb2VzLCB3ZSdsbCBjb25zaWRlciB0aGUgcHJvZE5hbWUgYQorICAgICAgICAvLyBwYXRoLCBhbmQgd2UnbGwgY2xlYW4gaXQgdXNpbmcgbmV3IEZpbGUocHJvZE5hbWUpLmdldE5hbWUoKQorICAgICAgICBpZiAocHJvZE5hbWUuaW5kZXhPZigiLyIpICE9IC0xKSB7CisgICAgICAgICAgLy8gY2xlYW4gdGhlIHByb2ROYW1lCisgICAgICAgICAgcHJvZE5hbWUgPSBuZXcgRmlsZShwcm9kTmFtZSkuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgUHJvZHVjdCBwcm9kID0gZm0uc2FmZUdldFByb2R1Y3RCeU5hbWUocHJvZE5hbWUpOworICAgICAgICBpZiAocHJvZCA9PSBudWxsKSB7CisgICAgICAgICAgLy8gcHJvZHVjdCBub3QgY2F0YWxvZ2VkCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByb2ROYW1lICsgIlx0Tm90IENhdGFsb2dlZCEiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBNZXRhZGF0YSBtZXQgPSBmbS5zYWZlR2V0TWV0YWRhdGEocHJvZCk7CisgICAgICAgIG91dHB1dExpc3RpbmdMaW5lKG1ldCwgcHJvZE5hbWUpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHVzYWdlID0gIlBDU0xvbmdMaXN0ZXIgPGNvbmYgZmlsZT4gPGZtdXJsPiBbZmlsZXNdIjsKKyAgICBMaXN0IGZpbGVMaXN0OworCisgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKworICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyKSB7CisgICAgICAvLyBhc3N1bWUgdGhleSBnYXZlIHVzIHRoZSBjdXJyZW50IGRpciAiLiIKKyAgICAgIC8vIGdldCBhIGxpc3Qgb2YgZmlsZXMgZnJvbSB0aGVyZQorICAgICAgZmlsZUxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBGaWxlKCIuIikubGlzdCgpKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMgJiYgbmV3IEZpbGUoYXJnc1syXSkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgZmlsZUxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBGaWxlKGFyZ3NbMl0pLmxpc3QoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0J3MgZ29pbmcgdG8gYmUgYSBsaXN0IG9mIGZpbGVzIGFueXdheXMKKyAgICAgIC8vIHNvIGp1c3QgdHJlYXQgdGhlIHdob2xlIGFyZ0xpc3QgYXMgYSBsaXN0IG9mIGZpbGUgbmFtZXMKKyAgICAgIExpc3QgYXJnTGlzdCA9IEFycmF5cy5hc0xpc3QoYXJncyk7CisgICAgICBmaWxlTGlzdCA9IGFyZ0xpc3Quc3ViTGlzdCgyLCBhcmdMaXN0LnNpemUoKSk7CisgICAgfQorCisgICAgUENTTG9uZ0xpc3RlciBsaXN0ZXIgPSBuZXcgUENTTG9uZ0xpc3RlcihhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICBsaXN0ZXIuZG9MaXN0KGZpbGVMaXN0KTsKKworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbEhlYWRlcigpIHsKKyAgICBTdHJpbmdCdWZmZXIgaGVhZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoU3RyaW5nIGNvbE5hbWUgOiB0aGlzLmNvbmYuZ2V0SGVhZGVyQ29sS2V5cygpKSB7CisgICAgICBoZWFkZXIuYXBwZW5kKHRoaXMuY29uZi5nZXRIZWFkZXJDb2xEaXNwbGF5TmFtZShjb2xOYW1lKSk7CisgICAgICBoZWFkZXIuYXBwZW5kKCJcdCIpOworICAgIH0KKyAgICByZXR1cm4gaGVhZGVyLnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgb3V0cHV0TGlzdGluZ0xpbmUoTWV0YWRhdGEgbWV0LCBTdHJpbmcgcHJvZE5hbWUpIHsKKyAgICBTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoU3RyaW5nIGNvbE5hbWVLZXkgOiB0aGlzLmNvbmYuZ2V0SGVhZGVyQ29sS2V5cygpKSB7CisgICAgICBpZiAoIXRoaXMuY29uZi5pc0NvbGxlY3Rpb25GaWVsZChjb2xOYW1lS2V5KSkgeworICAgICAgICBvdXRwdXQuYXBwZW5kKG1ldC5nZXRNZXRhZGF0YShjb2xOYW1lS2V5KSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlx0Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXQuYXBwZW5kKG91dHB1dE9yQmxhbmsoZ2V0QWxsUHJvZHVjdHNCeVRhZyhtZXQsIHByb2ROYW1lLAorICAgICAgICAgICAgY29sTmFtZUtleSkpKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiXHQiKTsKKyAgICAgIH0KKyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKG91dHB1dC50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBvdXRwdXRPckJsYW5rKExpc3QgaXRlbXMpIHsKKyAgICBpZiAoaXRlbXMgPT0gbnVsbCB8fCAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPT0gMCkpIHsKKyAgICAgIHJldHVybiAiTi9BIjsKKyAgICB9CisKKyAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZW1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgU3RyaW5nIGl0ZW0gPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgIGJ1Zi5hcHBlbmQoaXRlbSk7CisgICAgICBidWYuYXBwZW5kKCIsIik7CisgICAgfQorCisgICAgYnVmLmRlbGV0ZUNoYXJBdChidWYubGVuZ3RoKCkgLSAxKTsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIExpc3QgZ2V0QWxsUHJvZHVjdHNCeVRhZyhNZXRhZGF0YSBtZXQsIFN0cmluZyBwcm9kdWN0TmFtZSwKKyAgICAgIFN0cmluZyB0YWdUeXBlKSB7CisgICAgaWYgKG1ldC5jb250YWluc0tleSh0YWdUeXBlKSkgeworICAgICAgcmV0dXJuIG1ldC5nZXRBbGxNZXRhZGF0YSh0YWdUeXBlKTsKKyAgICB9CisKKyAgICAvLyBhc3N1bWUgbm93IHRoYXQgdGhlcmUgYXJlIG5vIHRlc3QgdGFncworICAgIC8vIHNvIHdoYXQgd2Ugd2FudCB0byBkbyBpcyB0byBxdWVyeSB0aGUgZmlsZSBjYXRhbG9nCisgICAgLy8gZm9yIElucHV0RmlsZXM6cHJvZHVjdE5hbWUgYW5kIHRoZW4ga2VlcCBkb2luZyB0aGlzIHVudGlsCisgICAgLy8gd2UgZ2V0IGFuIGFuc3dlciB0aGF0IGhhcyB0ZXN0IHRhZ3M6IGZvciBlYWNoIHRlc3QgdGFnIChvbmNlCisgICAgLy8gdGhleSBhcmUgZm91bmQpLCB3ZSdsbCBjb2xsZWN0IHRoZW0gaW4gYSBsaXN0CisgICAgTGlzdCB0YWdzID0gbmV3IFZlY3RvcigpOworICAgIGJvb2xlYW4gZm91bmRUYWcgPSBmYWxzZTsKKyAgICBTdGFjayBkZXNjZW5kYW50cyA9IG5ldyBTdGFjaygpOworICAgIGRlc2NlbmRhbnRzLnB1c2gocHJvZHVjdE5hbWUpOworCisgICAgd2hpbGUgKCFkZXNjZW5kYW50cy5lbXB0eSgpICYmICFmb3VuZFRhZykgeworICAgICAgU3RyaW5nIHByb2ROYW1lID0gKFN0cmluZykgZGVzY2VuZGFudHMucG9wKCk7CisgICAgICBMaXN0IHByb2R1Y3RzID0gZm0ucXVlcnlBbGxUeXBlcyhuZXcgSW5wdXRGaWxlc1F1ZXJ5KHByb2ROYW1lLCBmbSkKKyAgICAgICAgICAuYnVpbGRRdWVyeSgpLCB0aGlzLmNvbmYuZ2V0RXhjbHVkZWRUeXBlcygpKTsKKworICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgcHJvZHVjdHMKKyAgICAgIC8vIGdldCBlYWNoIHNldCBvZiBtZXRhZGF0YQorICAgICAgLy8gaWYgeW91IGZpbmQgb25lIHRhZywgdGhlbiBzZXQgZm91bmRUYWcgPSB0cnVlLCBhbmQgd2UKKyAgICAgIC8vIGJyZWFrCisgICAgICBpZiAocHJvZHVjdHMgIT0gbnVsbCAmJiBwcm9kdWN0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgIFByb2R1Y3QgcHJvZCA9IChQcm9kdWN0KSBpLm5leHQoKTsKKyAgICAgICAgICBNZXRhZGF0YSBwcm9kTWV0ID0gZm0uc2FmZUdldE1ldGFkYXRhKHByb2QpOworCisgICAgICAgICAgaWYgKHByb2RNZXQuY29udGFpbnNLZXkodGFnVHlwZSkpIHsKKyAgICAgICAgICAgIC8vIGdvdCBvbmUsIGRvbmUKKyAgICAgICAgICAgIGlmICghZm91bmRUYWcpCisgICAgICAgICAgICAgIGZvdW5kVGFnID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghdGFncy5jb250YWlucyhwcm9kTWV0LmdldE1ldGFkYXRhKHRhZ1R5cGUpKSkgeworICAgICAgICAgICAgICB0YWdzLmFkZChwcm9kTWV0LmdldE1ldGFkYXRhKHRhZ1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kVGFnKSB7CisgICAgICAgICAgLy8gY29udGludWUgdGhlIHNlYXJjaAorICAgICAgICAgIGRlc2NlbmRhbnRzLmFkZEFsbChGaWxlTWFuYWdlclV0aWxzLnRvUHJvZHVjdE5hbWVMaXN0KHByb2R1Y3RzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGFnczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy90b29scy9QQ1NUcmFjZS5qYXZhIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdG9vbHMvUENTVHJhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjQyNWMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdG9vbHMvUENTVHJhY2UuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MudG9vbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NDb25maWdNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm1ldGFkYXRhLlBDU01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MucGVkaWdyZWUuUGVkaWdyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5wZWRpZ3JlZS5QZWRpZ3JlZVRyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLkZpbGVNYW5hZ2VyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLldvcmtmbG93TWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKKworLyoqCisgKiAKKyAqIEEgcHJvZ3JhbSB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHBhcnRpY3VsYXIgUENTIHByb2R1Y3QuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUENTVHJhY2UgaW1wbGVtZW50cyBQQ1NNZXRhZGF0YSwgUENTQ29uZmlnTWV0YWRhdGEgeworCisgIC8qIG91ciBpbnRlcmZhY2UgdG8gdGhlIGZpbGUgbWFuYWdlciAqLworICBwcml2YXRlIEZpbGVNYW5hZ2VyVXRpbHMgZm07CisKKyAgLyogb3VyIGludGVyZmFjZSB0byB0aGUgd29ya2Zsb3cgbWFuYWdlciAqLworICBwcml2YXRlIFdvcmtmbG93TWFuYWdlclV0aWxzIHdtOworCisgIC8qIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBsaXN0IG5vbi1jYXRhbG9nZWQgcHJvZHVjdHMgaW4gcGVkaWdyZWUgKi8KKyAgcHJpdmF0ZSBib29sZWFuIGxpc3ROb3RDYXRhbG9nZWQgPSBmYWxzZTsKKworICAvKiBleGNsdWRlIGxpc3QgKi8KKyAgcHJpdmF0ZSBMaXN0IGV4Y2x1ZGVUeXBlTGlzdDsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUX0xJTkVfU0VQQVJBVE9SID0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICI7CisKKyAgcHVibGljIFBDU1RyYWNlKFVSTCB3bWdyVXJsLCBVUkwgZm1VcmwpIHsKKyAgICBmbSA9IG5ldyBGaWxlTWFuYWdlclV0aWxzKGZtVXJsKTsKKyAgICB3bSA9IG5ldyBXb3JrZmxvd01hbmFnZXJVdGlscyh3bWdyVXJsKTsKKyAgfQorCisgIHB1YmxpYyBQQ1NUcmFjZShTdHJpbmcgd21nclVybFN0ciwgU3RyaW5nIGZtVXJsU3RyKSB7CisgICAgdGhpcyhGaWxlTWFuYWdlclV0aWxzLnNhZmVHZXRVcmxGcm9tU3RyaW5nKHdtZ3JVcmxTdHIpLCBGaWxlTWFuYWdlclV0aWxzCisgICAgICAgIC5zYWZlR2V0VXJsRnJvbVN0cmluZyhmbVVybFN0cikpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBleGNsdWRlVHlwZUxpc3QKKyAgICogICAgICAgICAgdGhlIGV4Y2x1ZGVUeXBlTGlzdCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVUeXBlTGlzdChMaXN0IGV4Y2x1ZGVUeXBlTGlzdCkgeworICAgIHRoaXMuZXhjbHVkZVR5cGVMaXN0ID0gZXhjbHVkZVR5cGVMaXN0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGV4Y2x1ZGVUeXBlTGlzdAorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0RXhjbHVkZVR5cGVMaXN0KCkgeworICAgIHJldHVybiBleGNsdWRlVHlwZUxpc3Q7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0cyBhIHRyYWNlIHJlcG9ydCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgICogCisgICAqIFByb2R1Y3QgTmFtZTogPGk+b2NvX0wxYVJhZDA5MDg4XzA5Mzk4Mzg4MzguaGRmPC9pPgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2NhdGlvbjoKKyAgICogL3ByZWZsdC9qcGwvUmFkLzkwODgvbDFhL29jb19MMWFSYWQwOTA4OF8wOTM5ODM4ODM4LmhkZgorICAgKiAKKyAgICogTWV0YWRhdGE6CisgICAqIAorICAgKiAmbHQ7TWV0IEZpZWxkIE5hbWUmZ3Q7ID0mZ3Q7ICZsdDtNZXQgRmllbGQgVmFsdWUmZ3Q7ICZsdDtNZXQgRmllbGQKKyAgICogTmFtZTImZ3Q7ID0mZ3Q7ICZsdDtNZXQgRmllbGQgVmFsdWUyJmd0OworICAgKiAKKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyYXRlZCBmcm9tCisgICAqIHdvcmtmbG93czoKKyAgICogCisgICAqIENQVCBQaXBlbGluZTogSUQ6IFs5OTI5OS1hZGQ5OS05Mjk4My05ZDlkOS0wMDk5ZF0gU3RhdGU6IEZJTklTSEVECisgICAqIEFzc29jaWF0ZWQgcHJvZHVjdHM6CisgICAqIAorICAgKiBvY29fUmF3TDAxN185Mzk4Mzk5MzkzOC5wa3Qgb2NvX1Jhd0wwMzJfOTM5MzkzODgzODMucGt0CisgICAqIG9jb19SYXdMMDMzXzkzODM4MzgzODM4LnBrdCBvY29fUmF3TDAzNF85MzkzODM3ODU4NS5wa3QKKyAgICogCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdWxsIGxpbmVhZ2U6CisgICAqIAorICAgKiBVcHN0cmVhbTogQ1BUT3ZlcnZpZXdfOTgzODMzODhkLnR4dD0mZ3Q7b2NvX1Jhd0wwMTdfOTM5ODM5OTM5MzgucGt0PSZndDsKKyAgICogb2NvX1Jhd0wwMzJfOTM5MzkzODgzODMKKyAgICogLnBrdD0mZ3Q7b2NvX1Jhd0wwMzNfOTM4MzgzODM4MzgucGt0PSZndDtvY29fUmF3TDAzNF85MzkzODM3ODU4NS5wa3QKKyAgICogCisgICAqIERvd25zdHJlYW06IG9jb19MMUJSYWRfMTk4ODlfOTgzODM4MzgzLmhkZgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogCisgICAqIAorICAgKiBAcGFyYW0gcHJvZHVjdE5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QgdG8gdHJhY2UgbGluZWFnZSBmb3IuCisgICAqLworICBwdWJsaWMgdm9pZCBkb1RyYWNlKFN0cmluZyBwcm9kdWN0TmFtZSkgeworCisgICAgUHJvZHVjdCBwcm9kID0gZm0uc2FmZUdldFByb2R1Y3RCeU5hbWUocHJvZHVjdE5hbWUpOworCisgICAgUGVkaWdyZWUgcGVkaWdyZWUgPSBuZXcgUGVkaWdyZWUoZm0sIHRoaXMubGlzdE5vdENhdGFsb2dlZCwKKyAgICAgICAgdGhpcy5leGNsdWRlVHlwZUxpc3QpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oUkVQT1JUX0xJTkVfU0VQQVJBVE9SKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2R1Y3Q6ICIgKyBwcm9kLmdldFByb2R1Y3ROYW1lKCkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihSRVBPUlRfTElORV9TRVBBUkFUT1IpOworCisgICAgcHJvZC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhmbS5zYWZlR2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZCkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYXRpb246ICIgKyBmbS5nZXRGaWxlUGF0aChwcm9kKSk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKFJFUE9SVF9MSU5FX1NFUEFSQVRPUik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXRhZGF0YTogIik7CisgICAgTWV0YWRhdGEgbWV0ID0gZm0uc2FmZUdldE1ldGFkYXRhKHByb2QpOworICAgIGlmIChtZXQgIT0gbnVsbCAmJiBtZXQuZ2V0SGFzaHRhYmxlKCkgIT0gbnVsbAorICAgICAgICAmJiBtZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gbWV0LmdldEhhc2h0YWJsZSgpLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgIExpc3QgdmFscyA9IG1ldC5nZXRBbGxNZXRhZGF0YShrZXkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oa2V5ICsgIj0+IiArIHZhbHMpOworICAgICAgfQorICAgIH0KKworICAgIFN5c3RlbS5vdXQucHJpbnRsbihSRVBPUlRfTElORV9TRVBBUkFUT1IpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVkIGZyb20gd29ya2Zsb3c6Iik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGluc3QgPSBnZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3bS5zYWZlR2V0V29ya2Zsb3dJbnN0YW5jZXMoKSwgbWV0CisgICAgICAgICAgLmdldE1ldGFkYXRhKEpPQl9JRCkpOworCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdC5nZXRXb3JrZmxvdygpLmdldE5hbWUoKSArICI6IElEOiBbIgorICAgICAgICAgICsgaW5zdC5nZXRJZCgpICsgIl0iKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdHVzOiAiICsgaW5zdC5nZXRTdGF0dXMoKSk7CisgICAgICBMaXN0IHdJbnN0UHJvZHMgPSBwZWRpZ3JlZS5nZXRXb3JrZmxvd0luc3RQcm9kcyhpbnN0LmdldElkKCkpOworICAgICAgaWYgKHdJbnN0UHJvZHMgIT0gbnVsbCAmJiB3SW5zdFByb2RzLnNpemUoKSA+IDApIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBc3NvY2lhdGVkIHByb2R1Y3RzOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3SW5zdFByb2RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgIFByb2R1Y3Qgd0luc3RQcm9kID0gKFByb2R1Y3QpIGkubmV4dCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3SW5zdFByb2QuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93IGluc3RhbmNlIGZvciBwcm9kdWN0ISIpOworICAgIH0KKworICAgIFN5c3RlbS5vdXQucHJpbnRsbihSRVBPUlRfTElORV9TRVBBUkFUT1IpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnVsbCBsaW5lYWdlOiIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb3duc3RyZWFtOiIpOworCisgICAgUGVkaWdyZWVUcmVlIGRvd25zdHJlYW1MaW5lYWdlVHJlZSA9IHBlZGlncmVlLmRvUGVkaWdyZWUocHJvZCwgZmFsc2UpOworICAgIGRvd25zdHJlYW1MaW5lYWdlVHJlZS5wcmludFBlZGlncmVlVHJlZSgpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVwc3RyZWFtOiIpOworICAgIFBlZGlncmVlVHJlZSB1cHN0cmVhbUxpbmVhZ2VUcmVlID0gcGVkaWdyZWUuZG9QZWRpZ3JlZShwcm9kLCB0cnVlKTsKKyAgICB1cHN0cmVhbUxpbmVhZ2VUcmVlLnByaW50UGVkaWdyZWVUcmVlKCk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGVuYWJsZU5vbkNhdGFsb2dQcm9kdWN0c0luUGVkKCkgeworICAgIHRoaXMubGlzdE5vdENhdGFsb2dlZCA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEBwYXJhbSBhcmdzCisgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcHJvZHVjdE5hbWUgPSBudWxsOworICAgIFN0cmluZyB3b3JrZmxvd1VybFN0ciA9IG51bGwsIGZpbGVtZ3JVcmxTdHIgPSBudWxsOworICAgIGJvb2xlYW4gZW5hYmxlTm90Q2F0ID0gZmFsc2U7CisgICAgTGlzdCBleExpc3QgPSBudWxsOworCisgICAgU3RyaW5nIHVzYWdlID0gIlBDU1RyYWNlIC0tZm0gPHVybD4gLS13bSA8dXJsPiAtLXByb2R1Y3QgPG5hbWU+ICIKKyAgICAgICAgKyAiIFstLWVuYWJsZU5vbkNhdF0gWy0tZXhjbHVkZSA8dHlwZSBuYW1lIDE+LDx0eXBlIG5hbWUgMj4uLi4sPHR5cGUgbmFtZSBuPl1cbiI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1mbSIpKSB7CisgICAgICAgIGZpbGVtZ3JVcmxTdHIgPSBhcmdzWysraV07CisgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXdtIikpIHsKKyAgICAgICAgd29ya2Zsb3dVcmxTdHIgPSBhcmdzWysraV07CisgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXByb2R1Y3QiKSkgeworICAgICAgICBwcm9kdWN0TmFtZSA9IGFyZ3NbKytpXTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZW5hYmxlTm9uQ2F0IikpIHsKKyAgICAgICAgZW5hYmxlTm90Q2F0ID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZXhjbHVkZSIpKSB7CisgICAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVUeXBlcyA9IGFyZ3NbKytpXS5zcGxpdCgiLCIpOworICAgICAgICBleExpc3QgPSBBcnJheXMuYXNMaXN0KGV4Y2x1ZGVUeXBlcyk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAocHJvZHVjdE5hbWUgPT0gbnVsbCB8fCB3b3JrZmxvd1VybFN0ciA9PSBudWxsIHx8IGZpbGVtZ3JVcmxTdHIgPT0gbnVsbCkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKworICAgIFBDU1RyYWNlIHRyYWNlciA9IG5ldyBQQ1NUcmFjZSh3b3JrZmxvd1VybFN0ciwgZmlsZW1nclVybFN0cik7CisgICAgaWYgKGVuYWJsZU5vdENhdCkgeworICAgICAgdHJhY2VyLmVuYWJsZU5vbkNhdGFsb2dQcm9kdWN0c0luUGVkKCk7CisgICAgfQorICAgIGlmIChleExpc3QgIT0gbnVsbCkgeworICAgICAgdHJhY2VyLnNldEV4Y2x1ZGVUeXBlTGlzdChleExpc3QpOworICAgIH0KKyAgICB0cmFjZXIuZG9UcmFjZShwcm9kdWN0TmFtZSk7CisKKyAgfQorCisgIHByaXZhdGUgV29ya2Zsb3dJbnN0YW5jZSBnZXRXb3JrZmxvd0luc3RhbmNlQnlJZChMaXN0IGluc3RzLCBTdHJpbmcgaWQpIHsKKyAgICBpZiAoaW5zdHMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgZm9yIChJdGVyYXRvciBpID0gaW5zdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSAoV29ya2Zsb3dJbnN0YW5jZSkgaS5uZXh0KCk7CisgICAgICBpZiAoaW5zdC5nZXRJZCgpLmVxdWFscyhpZCkpIHsKKyAgICAgICAgcmV0dXJuIGluc3Q7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdXRpbC9GaWxlTWFuYWdlclV0aWxzLmphdmEgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy91dGlsL0ZpbGVNYW5hZ2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmODE5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdXRpbC9GaWxlTWFuYWdlclV0aWxzLmphdmEKQEAgLTAsMCArMSw0NTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5tZXRhZGF0YS5QQ1NDb25maWdNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnF1ZXJ5LkZpbGVuYW1lUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5WYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBBIHNldCBvZiB1dGlsaXR5IG1ldGhvZHMgZm9yIHVzZSBieSB0aGUgUENTIGluIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgRmlsZQorICogTWFuYWdlci4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTWFuYWdlclV0aWxzIGltcGxlbWVudHMgUENTQ29uZmlnTWV0YWRhdGEgeworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEZpbGVNYW5hZ2VyVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtZ3JDbGllbnQgPSBudWxsOworCisgIHByaXZhdGUgVVJMIGZtVXJsOworCisgIHB1YmxpYyBGaWxlTWFuYWdlclV0aWxzKFVSTCBmaWxlTWdyVXJsKSB7CisgICAgdHJ5IHsKKyAgICAgIGZtZ3JDbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQoZmlsZU1nclVybCk7CisgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIlVuYWJsZSB0byBjb25uZWN0IHRvIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICArIGZpbGVNZ3JVcmwudG9TdHJpbmcoKSArICJdIik7CisgICAgICBmbWdyQ2xpZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLmZtVXJsID0gZmlsZU1nclVybDsKKyAgfQorCisgIHB1YmxpYyBGaWxlTWFuYWdlclV0aWxzKFN0cmluZyBmbVVybFN0cikgeworICAgIHRoaXMoc2FmZUdldFVybEZyb21TdHJpbmcoZm1VcmxTdHIpKTsKKyAgfQorCisgIHB1YmxpYyBGaWxlTWFuYWdlclV0aWxzKFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudCkgeworICAgIHRoaXMuZm1nckNsaWVudCA9IGNsaWVudDsKKyAgfQorCisgIHB1YmxpYyBMaXN0IHNhZmVHZXRUb3BOUHJvZHVjdHMoaW50IG4pIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMuZm1nckNsaWVudC5nZXRUb3BOUHJvZHVjdHMobik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBvYnRhaW5pbmcgdG9wIiArIG4KKyAgICAgICAgICArICIgcHJvZHVjdHM6IG1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgUHJvZHVjdCBnZXRMYXRlc3RQcm9kdWN0QnlOYW1lKFN0cmluZyBwcm9kTmFtZSwgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgIHJldHVybiBnZXRMYXRlc3RQcm9kdWN0QnlOYW1lKHByb2ROYW1lLAorICAgICAgICBzYWZlR2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKSk7CisgIH0KKworICBwdWJsaWMgUHJvZHVjdCBnZXRMYXRlc3RQcm9kdWN0QnlOYW1lKFN0cmluZyBwcm9kTmFtZSwgUHJvZHVjdFR5cGUgdHlwZSkgeworICAgIHJldHVybiBnZXRMYXRlc3RQcm9kdWN0KG5ldyBGaWxlbmFtZVF1ZXJ5KHByb2ROYW1lLCB0aGlzKS5idWlsZFF1ZXJ5KCksCisgICAgICAgIHR5cGUpOworICB9CisKKyAgcHVibGljIFByb2R1Y3QgZ2V0TGF0ZXN0UHJvZHVjdChRdWVyeSBxdWVyeSwgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSkgeworICAgIHJldHVybiBnZXRMYXRlc3RQcm9kdWN0KHF1ZXJ5LCBzYWZlR2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKSk7CisgIH0KKworICBwdWJsaWMgTGlzdCB0b1Byb2R1Y3RUeXBlTGlzdChMaXN0IHR5cGVOYW1lcykgeworICAgIExpc3QgdHlwZUxpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBpZiAodHlwZU5hbWVzICE9IG51bGwgJiYgdHlwZU5hbWVzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBzYWZlR2V0UHJvZHVjdFR5cGVCeU5hbWUodHlwZU5hbWUpOworICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgdHlwZUxpc3QuYWRkKHR5cGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVMaXN0OworICB9CisKKyAgcHVibGljIExpc3QgcXVlcnlUeXBlTGlzdChRdWVyeSBxdWVyeSwgTGlzdCB0eXBlTGlzdCkgeworICAgIExpc3QgcHJvZHVjdHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBpZiAodHlwZUxpc3QgIT0gbnVsbCAmJiB0eXBlTGlzdC5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IChQcm9kdWN0VHlwZSkgaS5uZXh0KCk7CisgICAgICAgIExpc3QgcHJvZHMgPSBzYWZlSXNzdWVRdWVyeShxdWVyeSwgdHlwZSk7CisgICAgICAgIGlmIChwcm9kcyAhPSBudWxsICYmIHByb2RzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICBwcm9kdWN0cy5hZGRBbGwocHJvZHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2R1Y3RzOworICB9CisKKyAgcHVibGljIExpc3QgcXVlcnlBbGxUeXBlcyhRdWVyeSBxdWVyeSkgeworICAgIHJldHVybiBxdWVyeUFsbFR5cGVzKHF1ZXJ5LCBudWxsKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFByb2R1Y3Q+IHF1ZXJ5U3BlY2lmaWVkVHlwZXMoUXVlcnkgcXVlcnksIExpc3Q8U3RyaW5nPiB0eXBlTGlzdCkgeworICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBuZXcgVmVjdG9yPFByb2R1Y3Q+KCk7CisKKyAgICBmb3IgKFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgOiB0eXBlTGlzdCkgeworICAgICAgTGlzdDxQcm9kdWN0PiBwcm9kcyA9IHNhZmVJc3N1ZVF1ZXJ5KHF1ZXJ5LAorICAgICAgICAgIHNhZmVHZXRQcm9kdWN0VHlwZUJ5TmFtZShwcm9kdWN0VHlwZU5hbWUpKTsKKyAgICAgIGlmIChwcm9kcyAhPSBudWxsICYmIHByb2RzLnNpemUoKSA+IDApIHsKKyAgICAgICAgcHJvZHVjdHMuYWRkQWxsKHByb2RzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcHJvZHVjdHM7CisgIH0KKworICBwdWJsaWMgTGlzdCBxdWVyeUFsbFR5cGVzKFF1ZXJ5IHF1ZXJ5LCBMaXN0IGV4Y2x1ZGVUeXBlTGlzdCkgeworICAgIExpc3QgcHJvZHVjdFR5cGVzID0gc2FmZUdldFByb2R1Y3RUeXBlcygpOworICAgIExpc3QgcHJvZHVjdHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBpZiAocHJvZHVjdFR5cGVzICE9IG51bGwgJiYgcHJvZHVjdFR5cGVzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IChQcm9kdWN0VHlwZSkgaS5uZXh0KCk7CisgICAgICAgIGlmIChleGNsdWRlVHlwZUxpc3QgIT0gbnVsbCAmJiBleGNsdWRlVHlwZUxpc3QuY29udGFpbnModHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZzogWyIgKyB0eXBlLmdldE5hbWUoKSArICJdIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBMaXN0IHByb2RzID0gc2FmZUlzc3VlUXVlcnkocXVlcnksIHR5cGUpOworICAgICAgICBpZiAocHJvZHMgIT0gbnVsbCAmJiBwcm9kcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgcHJvZHVjdHMuYWRkQWxsKHByb2RzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwcm9kdWN0czsKKworICB9CisKKyAgcHVibGljIExpc3QgcXVlcnlBbmRSZXR1cm5NZXRhZGF0YShRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSkgeworICAgIExpc3QgcHJvZHMgPSBzYWZlSXNzdWVRdWVyeShxdWVyeSwgdHlwZSk7CisKKyAgICBpZiAocHJvZHMgPT0gbnVsbCB8fCAocHJvZHMgIT0gbnVsbCAmJiBwcm9kcy5zaXplKCkgPT0gMCkpIHsKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yKCk7CisgICAgfQorCisgICAgTGlzdCBwcm9kc01ldCA9IG5ldyBWZWN0b3IocHJvZHMuc2l6ZSgpKTsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgUHJvZHVjdCBwID0gKFByb2R1Y3QpIGkubmV4dCgpOworICAgICAgcHJvZHNNZXQuYWRkKHNhZmVHZXRNZXRhZGF0YShwKSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb2RzTWV0OworICB9CisKKyAgcHVibGljIExpc3Qgc2FmZUlzc3VlUXVlcnkoUXVlcnkgcXVlcnksIFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICBMaXN0IHJldFByb2RzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICByZXRQcm9kcyA9IHRoaXMuZm1nckNsaWVudC5xdWVyeShxdWVyeSwgdHlwZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBpc3N1aW5nIHF1ZXJ5OiBbIiArIHF1ZXJ5CisgICAgICAgICAgKyAiXSB0byBmaWxlIG1hbmFnZXIgYXQ6IFsiICsgdGhpcy5mbWdyQ2xpZW50LmdldEZpbGVNYW5hZ2VyVXJsKCkKKyAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKworICAgIHJldHVybiByZXRQcm9kczsKKworICB9CisKKyAgcHVibGljIEVsZW1lbnQgc2FmZUdldEVsZW1lbnRCeU5hbWUoU3RyaW5nIGVsZW1OYW1lKSB7CisgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBlbGVtZW50ID0gZm1nckNsaWVudC5nZXRFbGVtZW50QnlOYW1lKGVsZW1OYW1lKTsKKyAgICB9IGNhdGNoIChWYWxpZGF0aW9uTGF5ZXJFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gb2J0YWluaW5nIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgZWxlbWVudDogWyIgKyBlbGVtTmFtZQorICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9CisKKyAgcHVibGljIFByb2R1Y3RUeXBlIHNhZmVHZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKSB7CisgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgdHlwZSA9IGZtZ3JDbGllbnQuZ2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gb2J0YWluaW5nIHByb2R1Y3QgdHlwZSBkZWZpbml0aW9uIgorICAgICAgICAgICsgIiBmb3IgdHlwZTogWyIgKyBwcm9kdWN0VHlwZU5hbWUgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBQcm9kdWN0VHlwZSBzYWZlR2V0UHJvZHVjdFR5cGVCeUlkKFN0cmluZyBwcm9kdWN0VHlwZUlkKSB7CisgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgdHlwZSA9IGZtZ3JDbGllbnQuZ2V0UHJvZHVjdFR5cGVCeUlkKHByb2R1Y3RUeXBlSWQpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBvYnRhaW5pbmcgcHJvZHVjdCB0eXBlIGRlZmluaXRpb24iCisgICAgICAgICAgKyAiIGZvciB0eXBlOiBbIiArIHByb2R1Y3RUeXBlSWQgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBMaXN0IHNhZmVHZXRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICBMaXN0IHJlZnMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHJlZnMgPSBmbWdyQ2xpZW50LmdldFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gb2J0YWluaW5nIHByb2R1Y3QgcmVmZXJlbmNlcyIKKyAgICAgICAgICArICJmb3IgcHJvZHVjdDogWyIgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiByZWZzOworICB9CisKKyAgcHVibGljIE1ldGFkYXRhIHNhZmVHZXRNZXRhZGF0YShQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgbWV0YWRhdGEgPSBmbWdyQ2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIG9idGFpbiBtZXRhZGF0YSBmb3IgcHJvZHVjdDogWyIKKyAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICJdICIgKyAiZnJvbSBGaWxlIE1hbmFnZXIgYXQ6IFsiCisgICAgICAgICAgKyBmbWdyQ2xpZW50LmdldEZpbGVNYW5hZ2VyVXJsKCkgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0YWRhdGE7CisgIH0KKworICBwdWJsaWMgTGlzdCBzYWZlR2V0UHJvZHVjdFR5cGVzKCkgeworICAgIExpc3QgdHlwZXMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHR5cGVzID0gZm1nckNsaWVudC5nZXRQcm9kdWN0VHlwZXMoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byByZXRyaWV2ZSBwcm9kdWN0IHR5cGVzIGZyb20gZmlsZW1ncjogWyIKKyAgICAgICAgICArIGZtZ3JDbGllbnQuZ2V0RmlsZU1hbmFnZXJVcmwoKSArICJdOiByZWFzb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVzOworICB9CisKKyAgcHVibGljIFByb2R1Y3QgZ2V0TGF0ZXN0UHJvZHVjdChRdWVyeSBxdWVyeSwgUHJvZHVjdFR5cGUgdHlwZSkgeworICAgIExpc3QgcHJvZHVjdHMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHByb2R1Y3RzID0gZm1nckNsaWVudC5xdWVyeShxdWVyeSwgdHlwZSk7CisgICAgICBpZiAocHJvZHVjdHMgIT0gbnVsbCAmJiBwcm9kdWN0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIFByb2R1Y3QgcCA9IChQcm9kdWN0KSBwcm9kdWN0cy5nZXQoMCk7CisgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoc2FmZUdldFByb2R1Y3RSZWZlcmVuY2VzKHApKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiVW5hYmxlIHRvIG9idGFpbiBwcm9kdWN0czogcXVlcnk6IFsiICsgcXVlcnkKKyAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworCisgIH0KKworICBwdWJsaWMgUHJvZHVjdCBzYWZlR2V0UHJvZHVjdEJ5TmFtZShTdHJpbmcgcHJvZE5hbWUpIHsKKyAgICBQcm9kdWN0IHAgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHAgPSB0aGlzLmZtZ3JDbGllbnQuZ2V0UHJvZHVjdEJ5TmFtZShwcm9kTmFtZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIG9idGFpbmluZyBwcm9kdWN0OiBbIiArIHByb2ROYW1lCisgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoUHJvZHVjdCBwcm9kKSB7CisgICAgaWYgKHByb2QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSA9PSBudWxsKSB7CisgICAgICBwcm9kLnNldFByb2R1Y3RSZWZlcmVuY2VzKHNhZmVHZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kKSk7CisgICAgfQorCisgICAgaWYgKHByb2QuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSA9PSBudWxsCisgICAgICAgIHx8IChwcm9kLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkgIT0gbnVsbCAmJiBwcm9kLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkKKyAgICAgICAgICAgIC5zaXplKCkgPT0gMCkpIHsKKyAgICAgIHJldHVybiAiTi9BIjsKKyAgICB9CisKKyAgICAvLyBnZXQgdGhlIGZpcnN0IHJlZgorICAgIFJlZmVyZW5jZSByID0gKFJlZmVyZW5jZSkgcHJvZC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLmdldCgwKTsKKyAgICByZXR1cm4gc2FmZUdldEZpbGVGcm9tVXJpKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpLmdldEFic29sdXRlUGF0aCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0IHRvUHJvZHVjdE5hbWVMaXN0KExpc3QgcHJvZHVjdExpc3QpIHsKKyAgICBpZiAocHJvZHVjdExpc3QgPT0gbnVsbCB8fCAocHJvZHVjdExpc3QgIT0gbnVsbCAmJiBwcm9kdWN0TGlzdC5zaXplKCkgPT0gMCkpIHsKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yKCk7CisgICAgfQorCisgICAgTGlzdCBwcm9kTmFtZXMgPSBuZXcgVmVjdG9yKHByb2R1Y3RMaXN0LnNpemUoKSk7CisgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZHVjdExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBQcm9kdWN0IHAgPSAoUHJvZHVjdCkgaS5uZXh0KCk7CisgICAgICBwcm9kTmFtZXMuYWRkKHAuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb2ROYW1lczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVjayhTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCisgICAgICBNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCkgeworICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJQQ1M6ICIgKyBwcm9wTmFtZSArICI6IHZhbHVlOiAiICsgcHJvcFZhbHVlKTsKKyAgICAgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YSgiQXBwbGljYXRpb25TdWNjZXNzIiwgImZhbHNlIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVVJMIHNhZmVHZXRVcmxGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHIpIHsKKyAgICBVUkwgdXJsID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cik7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiUENTOiBVbmFibGUgdG8gZ2VuZXJhdGUgdXJsIGZyb20gdXJsIHN0cmluZzogWyIKKyAgICAgICAgICArIHVybFN0ciArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiB1cmw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEZpbGUgc2FmZUdldEZpbGVGcm9tVXJpKFN0cmluZyB1cmkpIHsKKyAgICBGaWxlIGYgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGYgPSBuZXcgRmlsZShuZXcgVVJJKHVyaSkpOworICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVSSSBzeW50YXggZXhjZXB0aW9uIG9idGFpbmluZyBmaWxlIG9iamVjdCBmcm9tIHVyaTogWyIgKyB1cmkgKyAiXSIpOworICAgIH0KKworICAgIHJldHVybiBmOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGZtZ3JDbGllbnQKKyAgICovCisgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRGbWdyQ2xpZW50KCkgeworICAgIHJldHVybiBmbWdyQ2xpZW50OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmbWdyQ2xpZW50CisgICAqICAgICAgICAgIHRoZSBmbWdyQ2xpZW50IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Rm1nckNsaWVudChYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbWdyQ2xpZW50KSB7CisgICAgdGhpcy5mbWdyQ2xpZW50ID0gZm1nckNsaWVudDsKKyAgICBpZiAodGhpcy5mbWdyQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgIHRoaXMuZm1VcmwgPSB0aGlzLmZtZ3JDbGllbnQuZ2V0RmlsZU1hbmFnZXJVcmwoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gVGhlIHtAbGluayBVUkx9IHRvIHRoZSBGaWxlIE1hbmFnZXIgdGhhdCB0aGlzIEZpbGVNYW5hZ2VyVXRpbHMKKyAgICogICAgICAgICBvYmplY3QgY29ubmVjdHMgdG8uCisgICAqLworICBwdWJsaWMgVVJMIGdldEZtVXJsKCkgeworICAgIHJldHVybiB0aGlzLmZtVXJsOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlyUHJvZHVjdEZpbGVQYXRoKFByb2R1Y3QgcCwgU3RyaW5nIHByb2ROYW1lKSB7CisgICAgcmV0dXJuIEZpbGVNYW5hZ2VyVXRpbHMuc2FmZUdldEZpbGVGcm9tVXJpKAorICAgICAgICBGaWxlTWFuYWdlclV0aWxzLmdldFJvb3RSZWZlcmVuY2UocHJvZE5hbWUsIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSkKKyAgICAgICAgICAgIC5nZXRPcmlnUmVmZXJlbmNlKCkpLmdldEFic29sdXRlUGF0aCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZWZlcmVuY2UgZ2V0Um9vdFJlZmVyZW5jZShTdHJpbmcgcHJvZHVjdE5hbWUsIExpc3QgcmVmcykgeworICAgIFJlZmVyZW5jZSByID0gbnVsbDsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlZnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaS5uZXh0KCk7CisgICAgICBpZiAoaXNSb290RGlyKHJlZiwgcHJvZHVjdE5hbWUpKSB7CisgICAgICAgIHIgPSByZWY7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290RGlyKFJlZmVyZW5jZSByLCBTdHJpbmcgcHJvZE5hbWUpIHsKKyAgICBpZiAoIXIuZ2V0T3JpZ1JlZmVyZW5jZSgpLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIHJlZmVyZW5jZVVSSSA9IHIuZ2V0T3JpZ1JlZmVyZW5jZSgpOworICAgICAgaW50IGxhc3RGb2xkZXJJblBhdGhTdGFydElkeCA9IHJlZmVyZW5jZVVSSS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICByZWZlcmVuY2VVUkkubGVuZ3RoKCkgLSAxKS5sYXN0SW5kZXhPZigiLyIpICsgMTsKKyAgICAgIFN0cmluZyBsYXN0Rm9sZGVySW5QYXRoID0gcmVmZXJlbmNlVVJJLnN1YnN0cmluZygKKyAgICAgICAgICBsYXN0Rm9sZGVySW5QYXRoU3RhcnRJZHgsIHJlZmVyZW5jZVVSSS5sZW5ndGgoKSAtIDEpOworICAgICAgcmV0dXJuIGxhc3RGb2xkZXJJblBhdGguc3RhcnRzV2l0aChwcm9kTmFtZSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3V0aWwvUmVzb3VyY2VNYW5hZ2VyVXRpbHMuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3V0aWwvUmVzb3VyY2VNYW5hZ2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQ5ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdXRpbC9SZXNvdXJjZU1hbmFnZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0uWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEgc2V0IG9mIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IFBDUyB0aGF0IG5lZWQgdG8KKyAqIGNvbW11bmljYXRlIHdpdGggdGhlIFJlc291cmNlIE1hbmFnZXIuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyVXRpbHMgeworCisgIC8qIG91ciByZXNvdXJjZSBtYW5hZ2VyIGNsaWVudCAqLworICBwcml2YXRlIFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUmVzb3VyY2VNYW5hZ2VyVXRpbHMuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgVVJMIHJtVXJsOworCisgIHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJVdGlscyhTdHJpbmcgdXJsU3RyKSB7CisgICAgdGhpcyhzYWZlR2V0VXJsRnJvbVN0cmluZyh1cmxTdHIpKTsKKyAgfQorCisgIHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJVdGlscyhVUkwgdXJsKSB7CisgICAgdGhpcy5jbGllbnQgPSBuZXcgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KHVybCk7CisgICAgdGhpcy5ybVVybCA9IHVybDsKKworICB9CisKKyAgcHVibGljIFJlc291cmNlTWFuYWdlclV0aWxzKFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjbGllbnQKKyAgICovCisgIHB1YmxpYyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgIHJldHVybiBjbGllbnQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNsaWVudAorICAgKiAgICAgICAgICB0aGUgY2xpZW50IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q2xpZW50KFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICBpZiAodGhpcy5jbGllbnQgIT0gbnVsbCkgeworICAgICAgdGhpcy5ybVVybCA9IHRoaXMuY2xpZW50LmdldFJlc01nclVybCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBMaXN0IHNhZmVHZXRSZXNvdXJjZU5vZGVzKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0Tm9kZXMoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZSBub2RlcyAiCisgICAgICAgICAgKyAid2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHJlc291cmNlIG1hbmFnZXIgYXQ6IFsiCisgICAgICAgICAgKyB0aGlzLmNsaWVudC5nZXRSZXNNZ3JVcmwoKSArICJdIik7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gVGhlIHtAbGluayBVUkx9IGZvciB0aGUgUmVzb3VyY2UgTWFuYWdlciB0aGF0IHRoaXMKKyAgICogICAgICAgICBSZXNvdXJjZU1hbmFnZXJVdGlscyBjb21tdW5pY2F0ZXMgd2l0aC4KKyAgICovCisgIHB1YmxpYyBVUkwgZ2V0UmVzbWdyVXJsKCkgeworICAgIHJldHVybiB0aGlzLnJtVXJsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgVVJMIHNhZmVHZXRVcmxGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHIpIHsKKyAgICBVUkwgdXJsID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cik7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiUENTOiBVbmFibGUgdG8gZ2VuZXJhdGUgdXJsIGZyb20gdXJsIHN0cmluZzogWyIKKyAgICAgICAgICArIHVybFN0ciArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiB1cmw7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3V0aWwvV29ya2Zsb3dNYW5hZ2VyVXRpbHMuamF2YSBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3V0aWwvV29ya2Zsb3dNYW5hZ2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RiMDcyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvdXRpbC9Xb3JrZmxvd01hbmFnZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW0uWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY0NsaWVudDsKKworLyoqCisgKiAKKyAqIEEgc2V0IG9mIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IFBDUyB0aGF0IG5lZWQgdG8gY29tbXVuaWNhdGUKKyAqIHdpdGggdGhlIFdvcmtmbG93IE1hbmFnZXIuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93TWFuYWdlclV0aWxzIHsKKworICAvKiBvdXIgd29ya2Zsb3cgbWFuYWdlciBjbGllbnQgKi8KKyAgcHJpdmF0ZSBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50OworCisgIC8qIG91ciBsb2cgc3RyZWFtICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdvcmtmbG93TWFuYWdlclV0aWxzLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIFVSTCB3bVVybDsKKworICBwdWJsaWMgV29ya2Zsb3dNYW5hZ2VyVXRpbHMoU3RyaW5nIHVybFN0cikgeworICAgIHRoaXMoc2FmZUdldFVybEZyb21TdHJpbmcodXJsU3RyKSk7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dNYW5hZ2VyVXRpbHMoVVJMIHVybCkgeworICAgIHRoaXMuY2xpZW50ID0gbmV3IFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCh1cmwpOworICAgIHRoaXMud21VcmwgPSB1cmw7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dNYW5hZ2VyVXRpbHMoWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGNsaWVudCkgeworICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICB9CisKKyAgcHVibGljIHZvaWQgdXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyhTdHJpbmcgd0luc3RJZCwgU3RyaW5nIHN0YXR1cykgeworICAgIHRyeSB7CisgICAgICB0aGlzLmNsaWVudC51cGRhdGVXb3JrZmxvd0luc3RhbmNlU3RhdHVzKHdJbnN0SWQsIHN0YXR1cyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgIH0KKworICBwdWJsaWMgTGlzdDxXb3JrZmxvd0luc3RhbmNlPiBzYWZlR2V0V29ya2Zsb3dJbnN0YW5jZXMoKSB7CisgICAgaWYgKCFpc0Nvbm5lY3RlZCgpKQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFdvcmtmbG93SW5zdGFuY2VzKCk7CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZSkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgfQorICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgdHJ5IHsKKyAgICAgIFhtbFJwY0NsaWVudCBjID0gbmV3IFhtbFJwY0NsaWVudCh0aGlzLmNsaWVudC5nZXRXb3JrZmxvd01hbmFnZXJVcmwoKSk7CisgICAgICBjLmV4ZWN1dGUoIndvcmtmbG93bWdyLmdldFdvcmtmbG93SW5zdGFuY2VzIiwgbmV3IFZlY3RvcigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTGlzdCBzYWZlR2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHN0YXR1cyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiZXhjZXB0aW9uIG9idGFpbmluZyB3b3JrZmxvdyBpbnN0YW5jZXMgYnkgc3RhdHVzOiBbIiArIHN0YXR1cworICAgICAgICAgICAgICArICJdOiBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBzYWZlR2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHN0YXR1cyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiZXhjZXB0aW9uIG9idGFpbmluZyBudW0gd29ya2Zsb3cgaW5zdGFuY2VzIGJ5IHN0YXR1czogWyIgKyBzdGF0dXMKKyAgICAgICAgICAgICAgKyAiXTogbWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgY2xpZW50CisgICAqLworICBwdWJsaWMgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICByZXR1cm4gY2xpZW50OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjbGllbnQKKyAgICogICAgICAgICAgdGhlIGNsaWVudCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENsaWVudChYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50KSB7CisgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgaWYgKHRoaXMuY2xpZW50ICE9IG51bGwpIHsKKyAgICAgIHRoaXMud21VcmwgPSB0aGlzLmNsaWVudC5nZXRXb3JrZmxvd01hbmFnZXJVcmwoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBVUkwgc2FmZUdldFVybEZyb21TdHJpbmcoU3RyaW5nIHVybFN0cikgeworICAgIFVSTCB1cmwgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJQQ1M6IFVuYWJsZSB0byBnZW5lcmF0ZSB1cmwgZnJvbSB1cmwgc3RyaW5nOiBbIgorICAgICAgICAgICsgdXJsU3RyICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHVybDsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogQHJldHVybiBUaGUge0BsaW5rIFVSTH0gcG9pbnRlciB0byB0aGUgV29ya2Zsb3cgTWFuYWdlciB0aGF0IHRoaXMKKyAgICogICAgICAgICBXb3JrZmxvd01hbmFnZXJVdGlscyBjb21tdW5pY2F0ZXMgd2l0aC4KKyAgICovCisgIHB1YmxpYyBVUkwgZ2V0V21VcmwoKSB7CisgICAgcmV0dXJuIHRoaXMud21Vcmw7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcGNzLWNyYXdsZXJzLnhtbCBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL3Bjcy1jcmF3bGVycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiZmVlMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL3Bjcy1jcmF3bGVycy54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0F1dGhvcjogQ2hyaXMgTWF0dG1hbm4KKworVGhpcyBmaWxlIGRlZmluZXMgd2hhdCBpbmdlc3QgY3Jhd2xlcnMgYXJlIGJlaW5nIHVzZWQgYnkgdGhlIFBDUy4KK1RoaXMgZmlsZSBpcyB1c2VkIGluIHRoZSBQQ1NIZWFsdGhNb25pdG9yIHRvb2wuCistLT4KKzxpbnB1dD4KKworICAgIDwhLS0gCisgICAgICBIZXJlIGFyZSBnbG9iYWwgcHJvcGVydGllcyBmb3IgdGhlIAorICAgICAgY3Jhd2xlci4gVGhlc2UgcHJvcGVydGllcyBhcmUgZW52aXJvbm1lbnQgCisgICAgICB2YXJpYWJsZSByZXBsYWNlZC4KKyAgICAgIAorICAgICAgVGhlIG9ubHkgY3VycmVudCBwcm9wZXJ0eSBpczoKKyAgICAgIAorICAgICAgSG9zdG5hbWU6IHRoZSBkZWZhdWx0IGhvc3RuYW1lIHRoYXQgdGhlIGNyYXdsZXIgCisgICAgICBkYWVtb25zIGFyZSBvcGVyYXRpbmcgb24uCisgICAgIC0tPgorCTxncm91cCBuYW1lPSJDcmF3bFByb3BlcnRpZXMiPgorCQk8c2NhbGFyIG5hbWU9Ikhvc3RuYW1lIj5sb2NhbGhvc3Q8L3NjYWxhcj4KKwk8L2dyb3VwPgorCisgICAgPCEtLSBIZXJlIGlzIGEgc2V0IG9mIHNjYWxhcnMgd2hlcmUgCisgICAgICAgICB0aGUgc2NhbGFyOgorICAgICAgICAgCisgICAgICAgICBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgY3Jhd2xlciB0byBtb25pdG9yIHN0YXR1cyBmb3IuCisgICAgICAgICB2YWx1ZTogdGhlIHBvcnQgbnVtYmVyIHRoYXQgdGhlIGNyYXdsZXIgZGFlbW9uIHRvIAorICAgICAgICAgbW9uaXRvciBpcyBydW5uaW5nIG9uLgorICAgICAtLT4KKwk8Z3JvdXAgbmFtZT0iQ3Jhd2xlckluZm8iPgorCSAgICA8c2NhbGFyIG5hbWU9IkNyYXdsZXIxIj45MDIwPC9zY2FsYXI+CisJPC9ncm91cD4KKworPC9pbnB1dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9wY3MtbGwtY29uZi54bWwgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9wY3MtbGwtY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzZDdlYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL3Bjcy1sbC1jb25mLnhtbApAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworQXV0aG9yOiBDaHJpcyBNYXR0bWFubgorCitUaGlzIGZpbGUgY29uZmlndXJlcyB0aGUgUENTIGxvbmcgbGlzdGVyLCBkZWZpbmluZyB3aGF0IHByb2R1Y3QgdHlwZXMKK3RvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdGluZywgd2hhdCBmaWVsZCBuYW1lcyB0byBpbmNsdWRlIGFzIGxpc3RpbmcgCitjb2x1bW5zLCBhbmQgd2hpY2ggb2YgdGhvc2UgZmllbGQgbmFtZXMgYXJlIGNvbGxlY3Rpb24gdGFncyB0aGF0IGdyb3VwIAorcHJvZHVjdHMgdG9nZXRoZXIuCistLT4KKzxpbnB1dD4KKworICA8IS0tIAorICAgIERlZmluZXMgbWV0YWRhdGEgZmllbGRzIHBlciBwcm9kdWN0IHRvIHNob3cgYXMgCisgICAgY29sdW1ucyBpbiB0aGUgbG9uZyBsaXN0aW5nLiBUaGUgc2NhbGFyIG5hbWUgCisgICAgYXR0cmlidXRlIGlzIHRoZSBwcm9kdWN0IG1ldCBmaWVsZCBuYW1lLCBhbmQgCisgICAgdGhlIHZhbHVlIGZvciB0aGUgc2NhbGFyIGlzIHRoZSBuYW1lIHRoYXQgdGhlIAorICAgIGxvbmcgbGlzdGVyIGRpc3BsYXlzIHdoaWxlIGxpc3RpbmcuIFRoZSB2ZWN0b3Igb2YgCisgICAgb3JkZXJlZCBtZXQga2V5cyBpcyB0aGUgZGlzcGxheSBvcmRlciBpbiB0aGUgbGlzdGluZy4KKyAgIC0tPgorICA8Z3JvdXAgbmFtZT0iTWV0RmllbGRDb2x1bW5zIj4KKyAgICA8dmVjdG9yIG5hbWU9Ik9yZGVyZWRNZXRLZXlzIj4KKyAgICAgIDxlbGVtZW50PkZpbGVuYW1lPC9lbGVtZW50PgorICAgICAgPGVsZW1lbnQ+VGVzdFRhZzwvZWxlbWVudD4KKyAgICAgIDxlbGVtZW50PlN1YlRlc3RUYWc8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudD5UZXN0Q291bnRlcjwvZWxlbWVudD4KKyAgICAgIDxlbGVtZW50PlN0YXJ0RGF0ZVRpbWU8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudD5FbmREYXRlVGltZTwvZWxlbWVudD4KKyAgICA8L3ZlY3Rvcj4KKyAgCisgICAgPHNjYWxhciBuYW1lPSJGaWxlbmFtZSI+RmlsZW5hbWU8L3NjYWxhcj4KKyAgICA8c2NhbGFyIG5hbWU9IlRlc3RUYWciPlRlc3QgVGFnKHMpPC9zY2FsYXI+CisgICAgPHNjYWxhciBuYW1lPSJTdWJUZXN0VGFnIj5TdWJ0ZXN0IHRhZyhzKTwvc2NhbGFyPgorICAgIDxzY2FsYXIgbmFtZT0iVGVzdENvdW50ZXIiPlRlc3QgQ291bnRlcihzKTwvc2NhbGFyPgorICAgIDxzY2FsYXIgbmFtZT0iU3RhcnREYXRlVGltZSI+RGF0YVN0YXJ0VGltZTwvc2NhbGFyPgorICAgIDxzY2FsYXIgbmFtZT0iRW5kRGF0ZVRpbWUiPkRhdGFFbmRUaW1lPC9zY2FsYXI+CisgIDwvZ3JvdXA+CisgIAorICA8IS0tIAorICAgIExldHMgdGhlIGxvbmcgbGlzdGVyIGtub3cgd2hpY2ggZmllbGRzIGFyZSAKKyAgICBjb2xsZWN0aW9uIGZpZWxkczogdGhhdCBpcywgZmllbGRzIHRoYXQgZ3JvdXAgCisgICAgcHJvZHVjdHMgdG9nZXRoZXIuIFRoZXNlIGZpZWxkcyB3aWxsIGJlIHVzZWQsIGFsb25nIAorICAgIHdpdGggdGhlIElucHV0RmlsZXMgbWV0IGZpZWxkLCB0byBmaW5kIGRlc2NlbmRhbnQgCisgICAgZmlsZXMgd2l0aCBtYXRjaGluZyBjb2xsZWN0aW9uIGZpZWxkIHZhbHVlcy4KKyAgIC0tPgorICA8Z3JvdXAgbmFtZT0iQ29sbGVjdGlvbkZpZWxkcyI+CisgICAgPHZlY3RvciBuYW1lPSJGaWVsZE5hbWVzIj4KKyAgICAgIDxlbGVtZW50PlRlc3RUYWc8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudD5TdWJUZXN0VGFnPC9lbGVtZW50PgorICAgICAgPGVsZW1lbnQ+VGVzdENvdW50ZXI8L2VsZW1lbnQ+CisgICAgPC92ZWN0b3I+CisgIDwvZ3JvdXA+CisgIAorICA8IS0tIAorICAgIElmIHlvdSBkb24ndCBleHBlY3QgYWxsIHRoZSBwcm9kdWN0IHR5cGVzIHRvIGJlIAorICAgIGxpc3RhYmxlLCB5b3UgY2FuIHNldCBhbiBleGNsdWRlIGxpc3QuIFRoaXMgaXMgCisgICAgdXNlZnVsIHdoZW4gZS5nLiwgc29tZSBwcm9kdWN0IHR5cGVzIGFyZSBzbyBtYXNzaXZlIAorICAgIHlvdSB3b3VsZCBuZXZlciBkbyBhIGxvbmcgbGlzdGluZyBvbiB0aGVtIGJlY2F1c2UgCisgICAgdGhlIGRlc2NlbmRhbnQgcXVlcnkgd291bGQgdGFrZSBhIGxvbmcgdGltZS4gIAorICAgLS0+CisgIDxncm91cCBuYW1lPSJFeGNsdWRlZFByb2R1Y3RUeXBlTGlzdCI+CisgICA8dmVjdG9yIG5hbWU9IlByb2R1Y3RUeXBlcyI+CisgICAgPGVsZW1lbnQ+RlRTU3BlY3RydW08L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+RlRTUnVubG9nPC9lbGVtZW50PgorICAgIDxlbGVtZW50PkZUU1N1bnJ1bjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5QcmltYXJ5TG9nPC9lbGVtZW50PgorICAgIDxlbGVtZW50Pk1vbml0b3JMb2c8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+T0NPVHJlbmRYTUw8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+U2F2ZXNldERpcjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5GVFNJZ3JhbURpcjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5TYXZlc2V0SW5mb0RpcjwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5DUFRIZWxpb3N0YXQ8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BUTW90b3I8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BUUGhvdG9kaW9kZTwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD5DUFRXYXZlbWV0ZXI8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BURVRMPC9lbGVtZW50PgorICAgIDxlbGVtZW50PkNQVFN0ZXA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+Q1BUQ29sbGltYXRvcjwvZWxlbWVudD4KKyAgIDwvdmVjdG9yPgorICA8L2dyb3VwPgorCis8L2lucHV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL3Bjcy13b3JrZmxvdy1zdGF0dXNlcy54bWwgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9wY3Mtd29ya2Zsb3ctc3RhdHVzZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDAyZTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9wY3Mtd29ya2Zsb3ctc3RhdHVzZXMueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIAorQXV0aG9yOiBDaHJpcyBNYXR0bWFubgorCitUaGlzIGZpbGUgZGVmaW5lcyB0aGUgd29ya2Zsb3cgc3RhdHVzZXMgdGhhdCB3ZSBjYXJlIGFib3V0CitpbiB0aGUgUENTIEhlYWx0aCBNb25pdG9yIHRvb2wuCistLT4KKzxpbnB1dD4KKworICAgIDwhLS0gIHRoaXMgaW5mb3JtYXRpb24gZGVmaW5lcyB0aGUgCisgICAgdmFsaWQgd29ya2Zsb3cgc3RhdGVzIHRoYXQgd2Ugd2FudCB0byAKKyAgICBjaGVjayBqb2Igc3RhdHVzIGZvci4KKyAgICAgLS0+CisJPGdyb3VwIG5hbWU9IldvcmtmbG93U3RhdGVzR3JvdXAiPgorCQk8dmVjdG9yIG5hbWU9IlN0YXRlcyI+CisJCSA8ZWxlbWVudD5RVUVVRUQ8L2VsZW1lbnQ+CisJCSA8ZWxlbWVudD5SU1VCTUlUPC9lbGVtZW50PgorCQkgPGVsZW1lbnQ+QlVJTERJTkcgQ09ORklHIEZJTEU8L2VsZW1lbnQ+CisJCSA8ZWxlbWVudD5QR0UgRVhFQzwvZWxlbWVudD4KKwkJIDxlbGVtZW50PkNSQVdMSU5HPC9lbGVtZW50PgorCQkgPGVsZW1lbnQ+U1RBR0lORyBJTlBVVDwvZWxlbWVudD4KKwkJIDxlbGVtZW50PkZJTklTSEVEPC9lbGVtZW50PgorCQkgPGVsZW1lbnQ+U1RBUlRFRDwvZWxlbWVudD4KKwkJIDxlbGVtZW50PlBBVVNFRDwvZWxlbWVudD4KKwkJPC92ZWN0b3I+CisJPC9ncm91cD4KKzwvaW5wdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcGNzLmxvZ2dpbmcucHJvcGVydGllcyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL3Bjcy5sb2dnaW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkZGRlNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL3Bjcy5sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0OCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIG9uZSBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcgorCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgcm9vdCBsb2dnZXIKKy5sZXZlbCA9IEFMTAorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwgPSBBTEwKKyAgICAgICAgCisjIFNldCB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbHMKK29yZy5hcGFjaGUub29kdC5wY3MubGV2ZWwgPSBTRVZFUkUKK29yZy5hcGFjaGUub29kdC5wY3MudXRpbC5sZXZlbCA9IFNFVkVSRQorb3JnLmFwYWNoZS5vb2R0LnBjcy50b29scy5sZXZlbCA9IFNFVkVSRQorCisjIHNldCBsb2dnaW5nIGxldmVscyBmb3IgRk0gaW50ZXJmYWNlCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLmxldmVsID0gU0VWRVJFCitvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLmxldmVsID0gT0ZGCisKKyMgc2V0IGxvZ2dpbmcgbGV2ZWxzIGZvciBXTSBpbnRlcmZhY2UKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLmxldmVsID0gT0ZGCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLmxldmVsID0gT0ZGCisKKyMgY29udHJvbCB0aGUgdW5kZXJseWluZyBjb21tb25zLWh0dHBjbGllbnQgdHJhbnNwb3J0IGxheWVyIGZvciB4bWxycGMgCitvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5sZXZlbCA9IE9GRgoraHR0cGNsaWVudC53aXJlLmhlYWRlci5sZXZlbCA9IE9GRgoraHR0cGNsaWVudC53aXJlLmxldmVsID0gT0ZGCitzdW4ubmV0Lnd3dy5wcm90b2NvbC5odHRwLmxldmVsID0gT0ZGCisKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2lucHV0L3BvbS54bWwgYi8wLjEwL3Bjcy9pbnB1dC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjVjM2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9pbnB1dC9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8YXJ0aWZhY3RJZD5wY3MtaW5wdXQ8L2FydGlmYWN0SWQ+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8bmFtZT5Qcm9jZXNzIENvbnRyb2wgU3lzdGVtIElucHV0IERhdGEgUGFja2FnZTwvbmFtZT4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPGRlc2NyaXB0aW9uPlRoZSBQcm9jZXNzIENvbnRyb2wgU3lzdGVtJ3MgZGF0YSBoYW5kbGluZyBwYWNrYWdlLiBUaGlzIHBhY2thZ2UgY29udGFpbnMgZGF0YSBzdHJ1Y3R1cmVzCisgIGFuZCByZWFkZXJzIGFuZCB3cml0ZXJzIHRvIHdyaXRlIGFuIGlucHV0IGZpbGUgZm9ybWF0IHNpbWlsYXIgdG8gSERGLCBhcyByZXByZXNlbnRlZCBpbiBYTUwuCisgIDwvZGVzY3JpcHRpb24+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Zm9ya01vZGU+cGVydGVzdDwvZm9ya01vZGU+CisgICAgICAgICAgPHVzZVN5c3RlbUNsYXNzTG9hZGVyPmZhbHNlPC91c2VTeXN0ZW1DbGFzc0xvYWRlcj4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L25hbWU+CisgICAgICAgICAgICAgIDx2YWx1ZT5jb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMudHJheC5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsPC92YWx1ZT4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICA8Zm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+MDwvZm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+CisgICAgICAgICAgIDxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPiAgCisgICAgPC9wbHVnaW5zPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQ8L3RhcmdldFBhdGg+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPnBnZS1jb25maWctZXhhbXBsZS54bWw8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b29kdC1jb21tb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlRXhjZXB0aW9uLmphdmEgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTM2YjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQ7CisKKy8qKgorICogCisgKiA8cD4KKyAqIEEgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlIHtAbGluayBQR0VDb25maWdGaWxlUmVhZGVyfSB3aGVuCisgKiB0aGVyZSBpcyBzb21lIGdlbmVyYWwgZXJyb3IgcGFyc2luZyB0aGUge0BsaW5rIFBHRUNvbmZpZ3VyYXRpb25GaWxlfS4KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQR0VDb25maWdGaWxlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAvKiBuZWVkZWQgZm9yIHNlcmlhbGl6YWJsZSBpbnRlcmZhY2UgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTI5Mzg4NTg1ODVMOworCisgIC8qKgorICAgKiA8cD4KKyAgICogQ29uc3RydWN0cyBhIG5ldyBQR0VDb25maWdGaWxlRXhjZXB0aW9uLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+bWVzc2FnZTwvY29kZT4KKyAgICogLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gbWVzc2FnZQorICAgKiAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KKyAgICovCisgIHB1YmxpYyBQR0VDb25maWdGaWxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVLZXlzLmphdmEgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFQ29uZmlnRmlsZUtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBiNGRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVLZXlzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dDsKKworLyoqCisgKiAKKyAqIDxwPgorICogTWV0YWRhdGEga2V5cyB1c2VkIHdoZW4gYnVpbGRpbmcgYSB7QGxpbmsgUEdFQ29uZmlndXJhdGlvbkZpbGV9CisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBQR0VDb25maWdGaWxlS2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfQVVYX0lOUFVUX0ZJTEVTX0dST1VQID0gIlJlY29yZGVkQXV4aWxpYXJ5SW5wdXRGaWxlcyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19BVVhfSU5QVVRfRklMRVNfR1JPVVAgPSAiRHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX1BST0RVQ1RfRklMRVNfR1JPVVAgPSAiSW5wdXRQcm9kdWN0RmlsZXMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfUEFUSF9HUk9VUCA9ICJQcm9kdWN0UGF0aEdyb3VwIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQR0VfTkFNRV9HUk9VUCA9ICJQR0VOYW1lR3JvdXAiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfR1JPVVAgPSAiTW9kZUdyb3VwIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU9NRVRSWV9HUk9VUCA9ICJHZW9tZXRyeSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9FWEVDVVRBQkxFX0dST1VQID0gIlByaW1hcnlFeGVjdXRhYmxlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRklGX0ZJTEVfR1JPVVAgPSAiU3RhdGljRmlsZUlkZW50aWZpY2F0aW9uRmlsZXMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9JREVOVElGSUNBVElPTl9HUk9VUCA9ICJKb2JJZGVudGlmaWNhdGlvbiI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NGX0lERU5USUZJQ0FUSU9OX0dST1VQID0gIlNDRklkZW50aWZpY2F0aW9uIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT05JVE9SX0dST1VQID0gIk1vbml0b3JHcm91cCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUl9MRVZFTF9HUk9VUCA9ICJNb25pdG9yTGV2ZWwiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19NRVRBREFUQV9HUk9VUCA9ICJMb2dNZXRhZGF0YSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MSU5FX1BBUkFNRVRFUlNfR1JPVVAgPSAiQ29tbWFuZExpbmVQYXJhbWV0ZXJzIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVSZWFkZXIuamF2YSBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1OWM5ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlUmVhZGVyLmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIAorICogPHA+CisgKiBBIFJlYWRlciBmb3IgcmVhZGluZyB0aGUgY29uc3RydWN0cyBkZWZpbmVkIGluIGEge0BsaW5rIFBHRUNvbmZpZ3VyYXRpb25GaWxlfS4KKyAqIFRoZSBjb25zdHJ1Y3RzIGFyZSByZWFkIGFuZCBhIG5ldyB7QGxpbmsgUEdFQ29uZmlndXJhdGlvbkZpbGV9IG9iamVjdCBpcworICogY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBHRUNvbmZpZ0ZpbGVSZWFkZXIgeworCisgIC8qKgorICAgKiA8cD4KKyAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgUEdFQ29uZmlnRmlsZVJlYWRlcigpIHsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogPHA+CisgICAqIFJlYWRzIHRoZSBQR0UgQ29uZmlndXJhdGlvbiBmaWxlIGZyb20gdGhlIGdpdmVuIDxjb2RlPnVybDwvY29kZT4uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSB1cmwKKyAgICogICAgICAgICAgVGhlIHtAbGluayBVUkx9IHBvaW50ZXIgdG8gdGhlIHBnZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFBHRUNvbmZpZ3VyYXRpb25GaWxlfSBvYmplY3QsIGNyZWF0ZWQgZnJvbSB0aGUKKyAgICogICAgICAgICBzcGVjaWZpZWQgVVJMLgorICAgKiBAdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHVybC4KKyAgICovCisgIHB1YmxpYyBQR0VDb25maWd1cmF0aW9uRmlsZSByZWFkKFVSTCB1cmwpIHRocm93cyBQR0VDb25maWdGaWxlRXhjZXB0aW9uIHsKKyAgICBQR0VDb25maWd1cmF0aW9uRmlsZSBjb25maWdGaWxlID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25maWdGaWxlID0gcmVhZCh1cmwub3BlblN0cmVhbSgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWQgUEdFICIKKyAgICAgICAgICArICJjb25maWd1cmF0aW9uIGZpbGUgZnJvbSB1cmw6ICIgKyB1cmwgKyAiOiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ0ZpbGU7CisgIH0KKworICAvKioKKyAgICogCisgICAqIDxwPgorICAgKiBSZWFkcyBhIFBHRUNvbmZpZ3VyYXRpb25GaWxlIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5pczwvY29kZT4KKyAgICogSW5wdXRTdHJlYW0uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSBpcworICAgKiAgICAgICAgICBUaGUgSW5wdXRTdHJlYW0gdG8gcmVhZCB0aGUgUEdFQ29uZmlndXJhdGlvbkZpbGUgZnJvbS4KKyAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgUEdFQ29uZmlndXJhdGlvbkZpbGV9LCBjcmVhdGVkIGZyb20gdGhlIHNwZWNpZmllZAorICAgKiAgICAgICAgIElucHV0U3RyZWFtLgorICAgKiBAdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgUEdFQ29uZmlndXJhdGlvbkZpbGUgcmVhZChJbnB1dFN0cmVhbSBpcykKKyAgICAgIHRocm93cyBQR0VDb25maWdGaWxlRXhjZXB0aW9uIHsKKyAgICBQR0VDb25maWd1cmF0aW9uRmlsZSBjb25maWdGaWxlID0gbnVsbDsKKworICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IG51bGw7CisgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworCisgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlzKTsKKworICAgIHRyeSB7CisgICAgICBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gcGFyc2VFeGNlcHRpb24pIHsKKyAgICAgIHBhcnNlRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gb2theSwgY29uc3RydWN0IHRoZSBQR0VDb25maWd1cmF0aW9uRmlsZSBub3cKKyAgICBjb25maWdGaWxlID0gbmV3IFBHRUNvbmZpZ3VyYXRpb25GaWxlKCk7CisKKyAgICBFbGVtZW50IHBnZUNvbmYgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgIE5vZGVMaXN0IHBnZUdyb3VwcyA9IHBnZUNvbmYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImdyb3VwIik7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBnZUdyb3Vwcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCisgICAgICBFbGVtZW50IGdyb3VwID0gKEVsZW1lbnQpIHBnZUdyb3Vwcy5pdGVtKGkpOworICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IGdyb3VwLmdldEF0dHJpYnV0ZSgibmFtZSIpOworCisgICAgICBpZiAoZ3JvdXBOYW1lLmVxdWFscygiUEdFTmFtZUdyb3VwIikpIHsKKyAgICAgICAgYWRkUEdFTmFtZShjb25maWdGaWxlLCBncm91cCk7CisgICAgICB9IGVsc2UgaWYgKGdyb3VwTmFtZS5lcXVhbHMoIklucHV0UHJvZHVjdEZpbGVzIikpIHsKKyAgICAgICAgYWRkSW5wdXRQcm9kdWN0RmlsZXMoY29uZmlnRmlsZSwgZ3JvdXApOworICAgICAgfSBlbHNlIGlmIChncm91cE5hbWUuZXF1YWxzKCJTdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlcyIpKSB7CisgICAgICAgIGFkZFNGSUZGaWxlcyhjb25maWdGaWxlLCBncm91cCk7CisgICAgICB9IGVsc2UgaWYgKGdyb3VwTmFtZS5lcXVhbHMoIkR5bmFtaWNBdXhpbGlhcnlJbnB1dEZpbGVzIikpIHsKKyAgICAgICAgYWRkRHluYW1pY0F1eElucHV0RmlsZXMoY29uZmlnRmlsZSwgZ3JvdXApOworICAgICAgfSBlbHNlIGlmIChncm91cE5hbWUuZXF1YWxzKCJSZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXMiKSkgeworICAgICAgICBhZGRSZWNBdXhJbnB1dEZpbGVzKGNvbmZpZ0ZpbGUsIGdyb3VwKTsKKyAgICAgIH0gZWxzZSBpZiAoZ3JvdXBOYW1lLmVxdWFscygiUHJvZHVjdFBhdGhHcm91cCIpKSB7CisgICAgICAgIGFkZFByb2R1Y3RQYXRoKGNvbmZpZ0ZpbGUsIGdyb3VwKTsKKyAgICAgIH0gZWxzZSBpZiAoZ3JvdXBOYW1lLmVxdWFscygiTW9uaXRvckdyb3VwIikpIHsKKyAgICAgICAgYWRkTW9uaXRvckdyb3VwKGNvbmZpZ0ZpbGUsIGdyb3VwKTsKKyAgICAgIH0gZWxzZSBpZiAoZ3JvdXBOYW1lLmVxdWFscygiTW9uaXRvckxldmVsIikpIHsKKyAgICAgICAgYWRkTW9uaXRvckxldmVscyhjb25maWdGaWxlLCBncm91cCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBwZ2Ugc3BlY2lmaWMgZ3JvdXBzLCBqdXN0IGFkZCBnZW5lcmljIGdyb3VwcworICAgICAgICBhZGRQR0VTcGVjaWZpY0dyb3VwKGNvbmZpZ0ZpbGUsIGdyb3VwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29uZmlnRmlsZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRQR0VTcGVjaWZpY0dyb3VwKFBHRUNvbmZpZ3VyYXRpb25GaWxlIGNvbmZpZ0ZpbGUsCisgICAgICBFbGVtZW50IGdyb3VwKSB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisKKyAgICBMaXN0IHNjYWxhcnMgPSBQR0VYTUxGaWxlVXRpbHMuZ2V0U2NhbGFycyhncm91cCk7CisgICAgTGlzdCB2ZWN0b3JzID0gUEdFWE1MRmlsZVV0aWxzLmdldFZlY3RvcnMoZ3JvdXApOworICAgIExpc3QgbWF0cml4cyA9IFBHRVhNTEZpbGVVdGlscy5nZXRNYXRyaXhzKGdyb3VwKTsKKworICAgIFBHRUdyb3VwIHBnZUdyb3VwID0gbmV3IFBHRUdyb3VwKGdyb3VwLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjYWxhcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBQR0VTY2FsYXIgcyA9IChQR0VTY2FsYXIpIGkubmV4dCgpOworICAgICAgcGdlR3JvdXAuYWRkU2NhbGFyKHMpOworICAgIH0KKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHZlY3RvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBQR0VWZWN0b3IgdiA9IChQR0VWZWN0b3IpIGkubmV4dCgpOworICAgICAgcGdlR3JvdXAuYWRkVmVjdG9yKHYpOworICAgIH0KKworICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hdHJpeHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBQR0VNYXRyaXggbSA9IChQR0VNYXRyaXgpIGkubmV4dCgpOworICAgICAgcGdlR3JvdXAuYWRkTWF0cml4KG0pOworICAgIH0KKworICAgIGNvbmZpZ0ZpbGUuZ2V0UGdlU3BlY2lmaWNHcm91cHMoKS5wdXQocGdlR3JvdXAuZ2V0TmFtZSgpLCBwZ2VHcm91cCk7CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRNb25pdG9yTGV2ZWxzKFBHRUNvbmZpZ3VyYXRpb25GaWxlIGNvbmZpZ0ZpbGUsIEVsZW1lbnQgZ3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisKKyAgICBMaXN0IHNjYWxhcnMgPSBQR0VYTUxGaWxlVXRpbHMuZ2V0U2NhbGFycyhncm91cCk7CisKKyAgICBpZiAoc2NhbGFycyAhPSBudWxsICYmIHNjYWxhcnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NhbGFycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUEdFU2NhbGFyIHNjYWxhciA9IChQR0VTY2FsYXIpIGkubmV4dCgpOworICAgICAgICBjb25maWdGaWxlLmdldE1vbml0b3JMZXZlbEdyb3VwKCkuYWRkU2NhbGFyKHNjYWxhcik7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkTW9uaXRvckdyb3VwKFBHRUNvbmZpZ3VyYXRpb25GaWxlIGNvbmZpZ0ZpbGUsIEVsZW1lbnQgZ3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisKKyAgICBMaXN0IHNjYWxhcnMgPSBQR0VYTUxGaWxlVXRpbHMuZ2V0U2NhbGFycyhncm91cCk7CisKKyAgICAvLyB0aGUgbGlzdCBzaG91bGQgYmUgbm90IGJlIG51bGwKKyAgICBpZiAoc2NhbGFycyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhlcmUgaXMgbm8gbW9uaXRvciBwYXRoIG9yIG1vbml0b3IgZmlsZW5hbWUgZm9ybWF0IGRlZmluZWQgaW4gdGhlIE1vbml0b3JHcm91cCEiKTsKKyAgICB9CisKKyAgICBQR0VTY2FsYXIgbW9uUGF0aCA9IG51bGwsIG1vbkZpbGVuYW1lRm9ybWF0ID0gbnVsbDsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjYWxhcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBQR0VTY2FsYXIgc2NhbGFyID0gKFBHRVNjYWxhcikgaS5uZXh0KCk7CisKKyAgICAgIGlmIChzY2FsYXIuZ2V0TmFtZSgpLmVxdWFscygiTW9uaXRvclBhdGgiKSkgeworICAgICAgICBtb25QYXRoID0gc2NhbGFyOworICAgICAgfSBlbHNlIGlmIChzY2FsYXIuZ2V0TmFtZSgpLmVxdWFscygiTW9uaXRvckZpbGVuYW1lRm9ybWF0IikpIHsKKyAgICAgICAgbW9uRmlsZW5hbWVGb3JtYXQgPSBzY2FsYXI7CisgICAgICB9CisgICAgfQorCisgICAgY29uZmlnRmlsZS5zZXRNb25pdG9yUGF0aChtb25QYXRoKTsKKyAgICBjb25maWdGaWxlLnNldE1vbml0b3JGaWxlbmFtZUZvcm1hdChtb25GaWxlbmFtZUZvcm1hdCk7CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRQcm9kdWN0UGF0aChQR0VDb25maWd1cmF0aW9uRmlsZSBjb25maWdGaWxlLCBFbGVtZW50IGdyb3VwKQorICAgICAgdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24geworICAgIExpc3Qgc2NhbGFycyA9IFBHRVhNTEZpbGVVdGlscy5nZXRTY2FsYXJzKGdyb3VwKTsKKworICAgIC8vIHRoZSBsaXN0IHNob3VsZCBiZSBzaXplIDEKKyAgICBpZiAoc2NhbGFycyA9PSBudWxsIHx8IChzY2FsYXJzICE9IG51bGwgJiYgc2NhbGFycy5zaXplKCkgIT0gMSkpIHsKKyAgICAgIHRocm93IG5ldyBQR0VDb25maWdGaWxlRXhjZXB0aW9uKAorICAgICAgICAgICJUaGVyZSBpcyBubyBwcm9kdWN0IHBhdGggZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCBvciB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNjYWxhciBsaXN0ZWQgaW4gdGhlIFByb2R1Y3RQYXRoR3JvdXAhIik7CisgICAgfQorCisgICAgUEdFU2NhbGFyIHNjYWxhciA9IChQR0VTY2FsYXIpIHNjYWxhcnMuZ2V0KDApOworCisgICAgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QgcGF0aCBzaG91bGQgYmUgUHJvZHVjdFBhdGgKKworICAgIGlmICghc2NhbGFyLmdldE5hbWUoKS5lcXVhbHMoIlByb2R1Y3RQYXRoIikpIHsKKyAgICAgIHRocm93IG5ldyBQR0VDb25maWdGaWxlRXhjZXB0aW9uKAorICAgICAgICAgICJUaGUgcHJvZHVjdCBwYXRoIHNob3VsZCBiZSBkZWZpbmVkIGFzIGEgc2NhbGFyIHdpdGggdGhlIG5hbWUgXCJQcm9kdWN0UGF0aFwiISIpOworICAgIH0KKworICAgIGNvbmZpZ0ZpbGUuc2V0UHJvZHVjdFBhdGgoc2NhbGFyKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRQR0VOYW1lKFBHRUNvbmZpZ3VyYXRpb25GaWxlIGNvbmZpZ0ZpbGUsIEVsZW1lbnQgZ3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisKKyAgICAvLyBnZXQgdGhlIHNjYWxhcnMsIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZQorICAgIExpc3Qgc2NhbGFycyA9IFBHRVhNTEZpbGVVdGlscy5nZXRTY2FsYXJzKGdyb3VwKTsKKworICAgIC8vIHRoZSBsaXN0IHNob3VsZCBiZSBzaXplIDEKKyAgICBpZiAoc2NhbGFycyA9PSBudWxsIHx8IChzY2FsYXJzICE9IG51bGwgJiYgc2NhbGFycy5zaXplKCkgIT0gMSkpIHsKKyAgICAgIHRocm93IG5ldyBQR0VDb25maWdGaWxlRXhjZXB0aW9uKAorICAgICAgICAgICJUaGVyZSBpcyBubyBQR0VOYW1lIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzY2FsYXIgbGlzdGVkIGluIHRoZSBQR0VOYW1lR3JvdXAiKTsKKyAgICB9CisKKyAgICAvLyB0aGUgbmFtZSBvZiB0aGUgc2NhbGFyIHNob3VsZCBiZSBQR0VOYW1lCisgICAgUEdFU2NhbGFyIHNjYWxhciA9IChQR0VTY2FsYXIpIHNjYWxhcnMuZ2V0KDApOworCisgICAgaWYgKCFzY2FsYXIuZ2V0TmFtZSgpLmVxdWFscygiUEdFTmFtZSIpKSB7CisgICAgICB0aHJvdyBuZXcgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhlIG5hbWUgb2YgdGhlIFBHRSBzaG91bGQgYmUgZGVmaW5lZCBhcyBhIHNjYWxhciB3aXRoIHRoZSBuYW1lIFwiUEdFTmFtZVwiISIpOworICAgIH0KKworICAgIC8vIG9rYXksIHdlJ3JlIHNldCwgc2V0IHRoZSBQR0UgTmFtZQorICAgIGNvbmZpZ0ZpbGUuc2V0UGdlTmFtZShzY2FsYXIpOworCisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkSW5wdXRQcm9kdWN0RmlsZXMoUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZmlnRmlsZSwKKyAgICAgIEVsZW1lbnQgZ3JvdXApIHRocm93cyBQR0VDb25maWdGaWxlRXhjZXB0aW9uIHsKKyAgICBhZGRTY2FsYXJGaWxlc1RvR3JvdXAoZ3JvdXAsIGNvbmZpZ0ZpbGUuZ2V0SW5wdXRQcm9kdWN0RmlsZXMoKSk7CisgICAgYWRkVmVjdG9yRmlsZXNUb0dyb3VwKGdyb3VwLCBjb25maWdGaWxlLmdldElucHV0UHJvZHVjdEZpbGVzKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZFNGSUZGaWxlcyhQR0VDb25maWd1cmF0aW9uRmlsZSBjb25maWdGaWxlLCBFbGVtZW50IGdyb3VwKQorICAgICAgdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24geworICAgIGFkZFNjYWxhckZpbGVzVG9Hcm91cChncm91cCwgY29uZmlnRmlsZS5nZXRTdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlcygpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGREeW5hbWljQXV4SW5wdXRGaWxlcyhQR0VDb25maWd1cmF0aW9uRmlsZSBjb25maWdGaWxlLAorICAgICAgRWxlbWVudCBncm91cCkgdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24geworICAgIGFkZFNjYWxhckZpbGVzVG9Hcm91cChncm91cCwgY29uZmlnRmlsZS5nZXREeW5hbWljQXV4aWxpYXJ5SW5wdXRGaWxlcygpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRSZWNBdXhJbnB1dEZpbGVzKFBHRUNvbmZpZ3VyYXRpb25GaWxlIGNvbmZpZ0ZpbGUsCisgICAgICBFbGVtZW50IGdyb3VwKSB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisgICAgYWRkU2NhbGFyRmlsZXNUb0dyb3VwKGdyb3VwLCBjb25maWdGaWxlLmdldFJlY29yZGVkQXV4aWxpYXJ5SW5wdXRGaWxlcygpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRTY2FsYXJGaWxlc1RvR3JvdXAoRWxlbWVudCBncm91cCwgUEdFR3JvdXAgcGdlR3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisgICAgLy8gZ2V0IHRoZSBzY2FsYXJzLCBhbmQgYWRkIHRoZW0gdG8gdGhlIGdyb3VwCisgICAgTGlzdCBzY2FsYXJzID0gUEdFWE1MRmlsZVV0aWxzLmdldFNjYWxhcnMoZ3JvdXApOworCisgICAgaWYgKHNjYWxhcnMgIT0gbnVsbCAmJiBzY2FsYXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjYWxhcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIFBHRVNjYWxhciBzY2FsYXIgPSAoUEdFU2NhbGFyKSBpLm5leHQoKTsKKyAgICAgICAgcGdlR3JvdXAuYWRkU2NhbGFyKHNjYWxhcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZFZlY3RvckZpbGVzVG9Hcm91cChFbGVtZW50IGdyb3VwLCBQR0VHcm91cCBwZ2VHcm91cCkKKyAgICAgIHRocm93cyBQR0VDb25maWdGaWxlRXhjZXB0aW9uIHsKKyAgICAvLyBnZXQgdGhlIHZlY3RvcnMsIGFuZCBhZGQgdGhlbSB0byB0aGUgZ3JvdXAKKyAgICBMaXN0IHZlY3RvcnMgPSBQR0VYTUxGaWxlVXRpbHMuZ2V0VmVjdG9ycyhncm91cCk7CisKKyAgICBpZiAodmVjdG9ycyAhPSBudWxsICYmIHZlY3RvcnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gdmVjdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUEdFVmVjdG9yIHZlY3RvciA9IChQR0VWZWN0b3IpIGkubmV4dCgpOworICAgICAgICBwZ2VHcm91cC5hZGRWZWN0b3IodmVjdG9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVXcml0ZXIuamF2YSBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4OWY0NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwzNTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiA8cD4KKyAqIEEgQ29uZmlndXJhdGlvbiBGaWxlIFdyaXRlciBmb3IgUEdFcy4KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQR0VDb25maWdGaWxlV3JpdGVyIGltcGxlbWVudHMgUEdFQ29uZmlnRmlsZUtleXMsCisgICAgUEdFRGF0YVBhcnNlS2V5cyB7CisKKyAgLyogdGhlIFBHRSBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB3ZSdyZSB3cml0aW5nICovCisgIHByaXZhdGUgUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZmlnRmlsZSA9IG51bGw7CisKKyAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUEdFQ29uZmlnRmlsZVdyaXRlci5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgLyoKKyAgICogd2hldGhlciBvciBub3QgdGhlIHZhbHVlcyBpbiB0aGUgWE1MIGZpbGUgc2hvdWxkIGJlIFVSTEVuY29kZWQ6IGlmIHRydWUsCisgICAqIHRoZSB2YWx1ZXMgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIFVURi04LgorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIHVybEVuY29kaW5nID0gZmFsc2U7CisKKyAgLyogc2NoZW1hIGxvY2F0aW9uIGZvciB0aGUgUEdFIGlucHV0LnhzZCBmaWxlICovCisgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gbnVsbDsKKworICAvKioKKyAgICogPHA+CisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICogPC9wPgorICAgKiAuCisgICAqIAorICAgKiBAcGFyYW0gY29uZmlnCisgICAqICAgICAgICAgIFRoZSBDb25maWd1cmF0aW9uRmlsZSB0aGF0IHRoaXMgd3JpdGVyIGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nLgorICAgKiAKKyAgICovCisgIHB1YmxpYyBQR0VDb25maWdGaWxlV3JpdGVyKFBHRUNvbmZpZ3VyYXRpb25GaWxlIGNvbmZpZykgeworICAgIHRoaXMuY29uZmlnRmlsZSA9IGNvbmZpZzsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogV3JpdGVzIHRoZSBDb25maWd1cmF0aW9uRmlsZSB0byB0aGUgc3BlY2lmaWVkIGZpbGVQYXRoLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICogICAgICAgICAgVGhlIGZpbGVQYXRoIG9mIHRoZSBYTUwgY29uZmlnIGZpbGUgdG8gd3JpdGUuCisgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGVUb1htbEZpbGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBYTUxVdGlscy53cml0ZVhtbEZpbGUoZ2V0Q29uZmlnRmlsZVhtbCgpLCBmaWxlUGF0aCk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gQW4gWE1MIERPTSB7QGxpbmsgRG9jdW1lbnR9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnRlcm5hbAorICAgKiAgICAgICAgIFBHRUNvbmZpZ3VyYXRpb25GaWxlLgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBEb2N1bWVudCBnZXRDb25maWdGaWxlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgIGRvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOworCisgICAgICBFbGVtZW50IHJvb3QgPSAoRWxlbWVudCkgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChQR0VfSU5QVVRfVEFHX05BTUUpOworICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzaSIsCisgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7CisgICAgICByb290CisgICAgICAgICAgLnNldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgKHNjaGVtYUxvY2F0aW9uID09IG51bGwKKyAgICAgICAgICAgICAgICAgIHx8IChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmVxdWFscygiIikpID8gImlucHV0LnhzZCIKKyAgICAgICAgICAgICAgICAgIDogc2NoZW1hTG9jYXRpb24pKTsKKyAgICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3QpOworCisgICAgICBpZiAoY29uZmlnRmlsZSAhPSBudWxsKSB7CisgICAgICAgIC8vIHdyaXRlIHRoZSBQR0UgTmFtZSBncm91cAorICAgICAgICBpZiAoY29uZmlnRmlsZS5nZXRQZ2VOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgIFBHRUdyb3VwIHBnZU5hbWVHcm91cCA9IG5ldyBQR0VHcm91cChQR0VfTkFNRV9HUk9VUCk7CisgICAgICAgICAgcGdlTmFtZUdyb3VwLmFkZFNjYWxhcihjb25maWdGaWxlLmdldFBnZU5hbWUoKSk7CisgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChnZXRHcm91cEVsZW1lbnQocGdlTmFtZUdyb3VwLCBkb2N1bWVudCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIGlucHV0IHByb2R1Y3QgZmlsZXMKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChnZXRHcm91cEVsZW1lbnQoY29uZmlnRmlsZS5nZXRJbnB1dFByb2R1Y3RGaWxlcygpLAorICAgICAgICAgICAgZG9jdW1lbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0aGUgc3RhdGljIGZpbGUgaWRlbnRpZmljYXRpb24gZmlsZXMKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChnZXRHcm91cEVsZW1lbnQoY29uZmlnRmlsZQorICAgICAgICAgICAgLmdldFN0YXRpY0ZpbGVJZGVudGlmaWNhdGlvbkZpbGVzKCksIGRvY3VtZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIGR5bmFtaWMgYXV4aWxsaWFyeSBmaWxlcworICAgICAgICByb290LmFwcGVuZENoaWxkKGdldEdyb3VwRWxlbWVudChjb25maWdGaWxlCisgICAgICAgICAgICAuZ2V0RHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMoKSwgZG9jdW1lbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0aGUgcmVjb3JkZWQgYXV4aWxsaWFyeSBmaWxlcworICAgICAgICByb290LmFwcGVuZENoaWxkKGdldEdyb3VwRWxlbWVudChjb25maWdGaWxlCisgICAgICAgICAgICAuZ2V0UmVjb3JkZWRBdXhpbGlhcnlJbnB1dEZpbGVzKCksIGRvY3VtZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIHByb2R1Y3QgcGF0aCBncm91cAorICAgICAgICBpZiAoY29uZmlnRmlsZS5nZXRQcm9kdWN0UGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICBQR0VHcm91cCBwcm9kdWN0UGF0aEdyb3VwID0gbmV3IFBHRUdyb3VwKFBST0RVQ1RfUEFUSF9HUk9VUCk7CisgICAgICAgICAgcHJvZHVjdFBhdGhHcm91cC5hZGRTY2FsYXIoY29uZmlnRmlsZS5nZXRQcm9kdWN0UGF0aCgpKTsKKyAgICAgICAgICByb290LmFwcGVuZENoaWxkKGdldEdyb3VwRWxlbWVudChwcm9kdWN0UGF0aEdyb3VwLCBkb2N1bWVudCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIG1vbml0b3IgbGV2ZWwgZ3JvdXAKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChnZXRHcm91cEVsZW1lbnQoY29uZmlnRmlsZS5nZXRNb25pdG9yTGV2ZWxHcm91cCgpLAorICAgICAgICAgICAgZG9jdW1lbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0aGUgbW9uaXRvciBncm91cAorICAgICAgICBpZiAoY29uZmlnRmlsZS5nZXRNb25pdG9yRmlsZW5hbWVGb3JtYXQoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBjb25maWdGaWxlLmdldE1vbml0b3JQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgIFBHRUdyb3VwIG1vbml0b3JHcm91cCA9IG5ldyBQR0VHcm91cChNT05JVE9SX0dST1VQKTsKKyAgICAgICAgICBtb25pdG9yR3JvdXAuYWRkU2NhbGFyKGNvbmZpZ0ZpbGUuZ2V0TW9uaXRvclBhdGgoKSk7CisgICAgICAgICAgbW9uaXRvckdyb3VwLmFkZFNjYWxhcihjb25maWdGaWxlLmdldE1vbml0b3JGaWxlbmFtZUZvcm1hdCgpKTsKKyAgICAgICAgICByb290LmFwcGVuZENoaWxkKGdldEdyb3VwRWxlbWVudChtb25pdG9yR3JvdXAsIGRvY3VtZW50KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSB0aGUgcGdlIHNwZWNpZmljIGdyb3VwcworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25maWdGaWxlLmdldFBnZVNwZWNpZmljR3JvdXBzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICBTdHJpbmcgcGdlU3BlY2lmaWNHcm91cE5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICBQR0VHcm91cCBwZ2VTcGVjaWZpY0dyb3VwID0gKFBHRUdyb3VwKSBjb25maWdGaWxlCisgICAgICAgICAgICAgIC5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldChwZ2VTcGVjaWZpY0dyb3VwTmFtZSk7CisKKyAgICAgICAgICByb290LmFwcGVuZENoaWxkKGdldEdyb3VwRWxlbWVudChwZ2VTcGVjaWZpY0dyb3VwLCBkb2N1bWVudCkpOworICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRvY3VtZW50OworCisgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKKyAgICAgIHBjZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGdlbmVyYXRpbmcgcGdlIGNvbmZpZ3VyYXRpb24gZmlsZSE6ICIKKyAgICAgICAgICArIHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBwZ2UgY29uZmlndXJhdGlvbiBmaWxlITogIgorICAgICAgICAgICsgcGNlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBlOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBFbGVtZW50IGdldEdyb3VwRWxlbWVudChQR0VHcm91cCBncm91cCwgRG9jdW1lbnQgZG9jdW1lbnQpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBFbGVtZW50IGdyb3VwRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoR1JPVVBfVEFHX05BTUUpOworICAgIGdyb3VwRWxlbS5zZXRBdHRyaWJ1dGUoTkFNRV9BVFRSLCBncm91cC5nZXROYW1lKCkpOworCisgICAgaWYgKGdyb3VwLmdldE51bVNjYWxhcnMoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyb3VwLmdldFNjYWxhcnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIHNjYWxhck5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgUEdFU2NhbGFyIHNjYWxhciA9IGdyb3VwLmdldFNjYWxhcihzY2FsYXJOYW1lKTsKKworICAgICAgICBFbGVtZW50IHNjYWxhckVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFNDQUxBUl9UQUdfTkFNRSk7CisgICAgICAgIHNjYWxhckVsZW0uc2V0QXR0cmlidXRlKE5BTUVfQVRUUiwgc2NhbGFyLmdldE5hbWUoKSk7CisKKyAgICAgICAgaWYgKHNjYWxhci5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHdyaXRlIG51bGwgdmFsdWUgZm9yIHNjYWxhcjogWyIKKyAgICAgICAgICAgICAgKyBzY2FsYXJOYW1lICsgIl0gdG8gUEdFIGNvbmZpZyBmaWxlISIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVybEVuY29kaW5nKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNjYWxhckVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoVVJMRW5jb2Rlci5lbmNvZGUoCisgICAgICAgICAgICAgICAgc2NhbGFyLmdldFZhbHVlKCksICJVVEYtOCIpKSk7CisgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgIkVycm9yIGNyZWF0aW5nIHRleHQgbm9kZSBmb3Igc2NhbGFyIGVsZW1lbnQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBzY2FsYXIuZ2V0TmFtZSgpICsgIiBpbiBwZ2UgZ3JvdXA6ICIgKyBncm91cC5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NhbGFyRWxlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzY2FsYXIuZ2V0VmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgZ3JvdXBFbGVtLmFwcGVuZENoaWxkKHNjYWxhckVsZW0pOworICAgICAgfQorCisgICAgfQorCisgICAgaWYgKGdyb3VwLmdldE51bVZlY3RvcnMoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyb3VwLmdldFZlY3RvcnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIHZlY3Rvck5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgUEdFVmVjdG9yIHZlY3RvciA9IGdyb3VwLmdldFZlY3Rvcih2ZWN0b3JOYW1lKTsKKworICAgICAgICBFbGVtZW50IHZlY3RvckVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFZFQ1RPUl9UQUdfTkFNRSk7CisgICAgICAgIHZlY3RvckVsZW0uc2V0QXR0cmlidXRlKE5BTUVfQVRUUiwgdmVjdG9yLmdldE5hbWUoKSk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBqID0gdmVjdG9yLmdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBqLm5leHQoKTsKKworICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkF0dGVtcHQgdG8gd3JpdGUgbnVsbCB2YWx1ZSBmb3IgdmVjdG9yOiBbIgorICAgICAgICAgICAgICAgICsgdmVjdG9yTmFtZSArICJdIHRvIFBHRSBjb25maWcgZmlsZSEiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBFbGVtZW50IGVsZW1lbnRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChWRUNUT1JfRUxFTUVOVF9UQUcpOworICAgICAgICAgIGlmICh1cmxFbmNvZGluZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZWxlbWVudEVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoVVJMRW5jb2RlcgorICAgICAgICAgICAgICAgICAgLmVuY29kZShlbGVtZW50LCAiVVRGLTgiKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICJFcnJvciBjcmVhdGluZyB0ZXh0IG5vZGUgZm9yIHZlY3RvciBlbGVtZW50OiAiCisgICAgICAgICAgICAgICAgICAgICAgKyB2ZWN0b3IuZ2V0TmFtZSgpICsgIiBpbiBwZ2UgZ3JvdXA6ICIgKyBncm91cC5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWxlbWVudEVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWxlbWVudCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIHZlY3RvckVsZW0uYXBwZW5kQ2hpbGQoZWxlbWVudEVsZW0pOworICAgICAgICB9CisKKyAgICAgICAgZ3JvdXBFbGVtLmFwcGVuZENoaWxkKHZlY3RvckVsZW0pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChncm91cC5nZXROdW1NYXRyaXhzKCkgPiAwKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cC5nZXRNYXRyaXhzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIFN0cmluZyBtYXRyaXhOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgIFBHRU1hdHJpeCBtYXRyaXggPSBncm91cC5nZXRNYXRyaXgobWF0cml4TmFtZSk7CisKKyAgICAgICAgRWxlbWVudCBtYXRyaXhFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChNQVRSSVhfVEFHX05BTUUpOworICAgICAgICBtYXRyaXhFbGVtLnNldEF0dHJpYnV0ZShOQU1FX0FUVFIsIG1hdHJpeC5nZXROYW1lKCkpOworCisgICAgICAgIGludCByb3dOdW0gPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtYXRyaXguZ2V0Um93cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgeworICAgICAgICAgIExpc3Qgcm93VmFsdWVzID0gKExpc3QpIGoubmV4dCgpOworCisgICAgICAgICAgRWxlbWVudCByb3dFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChNQVRSSVhfUk9XX1RBRyk7CisKKyAgICAgICAgICBpbnQgY29sTnVtID0gMDsKKyAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSByb3dWYWx1ZXMuaXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgY29sVmFsdWUgPSAoU3RyaW5nKSBrLm5leHQoKTsKKyAgICAgICAgICAgIEVsZW1lbnQgY29sRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTUFUUklYX0NPTF9UQUcpOworCisgICAgICAgICAgICBpZiAoY29sVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHdyaXRlIG51bGwgdmFsdWUgZm9yIG1hdHJpeDogWyIKKyAgICAgICAgICAgICAgICAgICsgbWF0cml4TmFtZSArICJdOiAiICsgIigiICsgcm93TnVtICsgIiwiICsgY29sTnVtICsgIikiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVybEVuY29kaW5nKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29sRWxlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShVUkxFbmNvZGVyLmVuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgY29sVmFsdWUsICJVVEYtOCIpKSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNyZWF0aW5nIG5vZGUgZm9yIG1hdHJpeCBlbGVtZW50OiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1hdHJpeC5nZXROYW1lKCkgKyAiICgiICsgcm93TnVtICsgIiwiICsgY29sTnVtCisgICAgICAgICAgICAgICAgICAgICAgICArICIpIGluIHBnZSBncm91cDogIiArIGdyb3VwLmdldE5hbWUoKSArICIgTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29sRWxlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xWYWx1ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb2xOdW0rKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByb3dOdW0rKzsKKyAgICAgICAgfQorCisgICAgICAgIGdyb3VwRWxlbS5hcHBlbmRDaGlsZChtYXRyaXhFbGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ3JvdXAuZ2V0TnVtR3JvdXBzKCkgPiAwKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cC5nZXRHcm91cHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICBQR0VHcm91cCBzdWJncm91cCA9IGdyb3VwLmdldEdyb3VwKGdyb3VwTmFtZSk7CisgICAgICAgIEVsZW1lbnQgc3ViZ3JvdXBFbGVtID0gZ2V0R3JvdXBFbGVtZW50KHN1Ymdyb3VwLCBkb2N1bWVudCk7CisgICAgICAgIGdyb3VwRWxlbS5hcHBlbmRDaGlsZChzdWJncm91cEVsZW0pOworICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIGdyb3VwRWxlbTsKKworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJsRW5jb2RpbmcuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc1VybEVuY29kaW5nKCkgeworICAgIHJldHVybiB1cmxFbmNvZGluZzsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdXJsRW5jb2RpbmcKKyAgICogICAgICAgICAgVGhlIHVybEVuY29kaW5nIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFVybEVuY29kaW5nKGJvb2xlYW4gdXJsRW5jb2RpbmcpIHsKKyAgICB0aGlzLnVybEVuY29kaW5nID0gdXJsRW5jb2Rpbmc7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzY2hlbWFMb2NhdGlvbi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb24oKSB7CisgICAgcmV0dXJuIHNjaGVtYUxvY2F0aW9uOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzY2hlbWFMb2NhdGlvbgorICAgKiAgICAgICAgICBUaGUgc2NoZW1hTG9jYXRpb24gdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nIHNjaGVtYUxvY2F0aW9uKSB7CisgICAgdGhpcy5zY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUxvY2F0aW9uOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWd1cmF0aW9uRmlsZS5qYXZhIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ3VyYXRpb25GaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4YmQwYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWd1cmF0aW9uRmlsZS5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0OworCisvL09DTyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiAKKyAqIDxwPgorICogQSBjb25maWd1cmF0aW9uIGZpbGUgdG8gcmVjb3JkIGlucHV0IHNpbWlsYXIgdG8gSERGIGZvcm1hdC4gVGhlIGNvbmZpZ3VyYXRpb24KKyAqIGZpbGUgaXMgYSBzZXQgb2YgbmFtZWQge0BsaW5rIFBHRUdyb3VwfXMuCisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUEdFQ29uZmlndXJhdGlvbkZpbGUgaW1wbGVtZW50cyBQR0VDb25maWdGaWxlS2V5cyB7CisKKyAgLyogdGhlIG5hbWUgb2YgdGhlIFBHRSB0aGF0IHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyAgcHJpdmF0ZSBQR0VTY2FsYXIgcGdlTmFtZSA9IG51bGw7CisKKyAgLyogdGhlIGxpc3Qgb2YgZGF0YSBwcm9kdWN0IGZpbGVzIGZvciB0aWhzIFBHRSAqLworICBwcml2YXRlIFBHRUdyb3VwIGlucHV0UHJvZHVjdEZpbGVzID0gbnVsbDsKKworICAvKiB0aGUgbGlzdCBvZiBzdGF0aWMgZmlsZSBpZGVudGlmaWNhdGlvbiBmaWxlcyAqLworICBwcml2YXRlIFBHRUdyb3VwIHN0YXRpY0ZpbGVJZGVudGlmaWNhdGlvbkZpbGVzID0gbnVsbDsKKworICAvKiB0aGUgbGlzdCBvZiBhbmNpbGxhcnkgZmlsZXMgaWRlbnRpZmllZCBieSB0aGUgUENTICovCisgIHByaXZhdGUgUEdFR3JvdXAgZHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMgPSBudWxsOworCisgIC8qCisgICAqIHRoZSBsaXN0IG9mIGFuY2lsbGFyeSBmaWxlcyB0aGF0IGFyZSBub3QgdXNlZCBieSB0aGUgUEdFIGRpcmVjdGx5LCBidXQgYXJlCisgICAqIHJlY29yZGVkIGluIHRoZSBBbmNpbGxhcnlEYXRhRGVzY3JpcHRvcnMgbWV0YWRhdGEgZWxlbWVudAorICAgKi8KKyAgcHJpdmF0ZSBQR0VHcm91cCByZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXMgPSBudWxsOworCisgIC8qIHRoZSBsb2NhdGlvbiB0byBwdXQgYW55IG91dHB1dCBwcm9kdWN0cyAqLworICBwcml2YXRlIFBHRVNjYWxhciBwcm9kdWN0UGF0aCA9IG51bGw7CisKKyAgLyogdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRvIHNhdmUgbW9uaXRvciBmaWxlcyAqLworICBwcml2YXRlIFBHRVNjYWxhciBtb25pdG9yUGF0aCA9IG51bGw7CisKKyAgLyogdGhlIGZpbGVuYW1lIGZvcm1hdCBvZiB0aGUgbW9uaXRvciBmaWxlcyAqLworICBwcml2YXRlIFBHRVNjYWxhciBtb25pdG9yRmlsZW5hbWVGb3JtYXQgPSBudWxsOworCisgIHByaXZhdGUgUEdFR3JvdXAgbW9uaXRvckxldmVsR3JvdXAgPSBudWxsOworCisgIC8qIHRoZSBwZ2Ugc3BlY2lmaWMgZ3JvdXBzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQR0VHcm91cD4gcGdlU3BlY2lmaWNHcm91cHMgPSBudWxsOworCisgIC8qKgorICAgKiA8cD4KKyAgICogQ29uc3RydWN0cyBhIG5ldyBQR0VDb25maWd1cmF0aW9uRmlsZSB3aXRoIG5vIGdyb3Vwcy4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIFBHRUNvbmZpZ3VyYXRpb25GaWxlKCkgeworICAgIHRoaXMucGdlU3BlY2lmaWNHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBHRUdyb3VwPigpOworICAgIHRoaXMuaW5wdXRQcm9kdWN0RmlsZXMgPSBuZXcgUEdFR3JvdXAoSU5QVVRfUFJPRFVDVF9GSUxFU19HUk9VUCk7CisgICAgdGhpcy5zdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlcyA9IG5ldyBQR0VHcm91cChTRklGX0ZJTEVfR1JPVVApOworICAgIHRoaXMuZHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMgPSBuZXcgUEdFR3JvdXAoCisgICAgICAgIERZTkFNSUNfQVVYX0lOUFVUX0ZJTEVTX0dST1VQKTsKKyAgICB0aGlzLnJlY29yZGVkQXV4aWxpYXJ5SW5wdXRGaWxlcyA9IG5ldyBQR0VHcm91cCgKKyAgICAgICAgUkVDT1JERURfQVVYX0lOUFVUX0ZJTEVTX0dST1VQKTsKKyAgICB0aGlzLm1vbml0b3JMZXZlbEdyb3VwID0gbmV3IFBHRUdyb3VwKE1PTklUT1JfTEVWRUxfR1JPVVApOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBnZU5hbWUKKyAgICovCisgIHB1YmxpYyBQR0VTY2FsYXIgZ2V0UGdlTmFtZSgpIHsKKyAgICByZXR1cm4gcGdlTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcGdlTmFtZQorICAgKiAgICAgICAgICB0aGUgcGdlTmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFBnZU5hbWUoUEdFU2NhbGFyIHBnZU5hbWUpIHsKKyAgICB0aGlzLnBnZU5hbWUgPSBwZ2VOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGlucHV0UHJvZHVjdEZpbGVzCisgICAqLworICBwdWJsaWMgUEdFR3JvdXAgZ2V0SW5wdXRQcm9kdWN0RmlsZXMoKSB7CisgICAgcmV0dXJuIGlucHV0UHJvZHVjdEZpbGVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBpbnB1dFByb2R1Y3RGaWxlcworICAgKiAgICAgICAgICB0aGUgaW5wdXRQcm9kdWN0RmlsZXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJbnB1dFByb2R1Y3RGaWxlcyhQR0VHcm91cCBpbnB1dFByb2R1Y3RGaWxlcykgeworICAgIHRoaXMuaW5wdXRQcm9kdWN0RmlsZXMgPSBpbnB1dFByb2R1Y3RGaWxlczsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBzdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlcworICAgKi8KKyAgcHVibGljIFBHRUdyb3VwIGdldFN0YXRpY0ZpbGVJZGVudGlmaWNhdGlvbkZpbGVzKCkgeworICAgIHJldHVybiBzdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gc3RhdGljRmlsZUlkZW50aWZpY2F0aW9uRmlsZXMKKyAgICogICAgICAgICAgdGhlIHN0YXRpY0ZpbGVJZGVudGlmaWNhdGlvbkZpbGVzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U3RhdGljRmlsZUlkZW50aWZpY2F0aW9uRmlsZXMoCisgICAgICBQR0VHcm91cCBzdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlcykgeworICAgIHRoaXMuc3RhdGljRmlsZUlkZW50aWZpY2F0aW9uRmlsZXMgPSBzdGF0aWNGaWxlSWRlbnRpZmljYXRpb25GaWxlczsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBkeW5hbWljQXV4aWxpYXJ5SW5wdXRGaWxlcworICAgKi8KKyAgcHVibGljIFBHRUdyb3VwIGdldER5bmFtaWNBdXhpbGlhcnlJbnB1dEZpbGVzKCkgeworICAgIHJldHVybiBkeW5hbWljQXV4aWxpYXJ5SW5wdXRGaWxlczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMKKyAgICogICAgICAgICAgdGhlIGR5bmFtaWNBdXhpbGlhcnlJbnB1dEZpbGVzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMoUEdFR3JvdXAgZHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXMpIHsKKyAgICB0aGlzLmR5bmFtaWNBdXhpbGlhcnlJbnB1dEZpbGVzID0gZHluYW1pY0F1eGlsaWFyeUlucHV0RmlsZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcmVjb3JkZWRBdXhpbGlhcnlJbnB1dEZpbGVzCisgICAqLworICBwdWJsaWMgUEdFR3JvdXAgZ2V0UmVjb3JkZWRBdXhpbGlhcnlJbnB1dEZpbGVzKCkgeworICAgIHJldHVybiByZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHJlY29yZGVkQXV4aWxpYXJ5SW5wdXRGaWxlcworICAgKiAgICAgICAgICB0aGUgcmVjb3JkZWRBdXhpbGlhcnlJbnB1dEZpbGVzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UmVjb3JkZWRBdXhpbGlhcnlJbnB1dEZpbGVzKAorICAgICAgUEdFR3JvdXAgcmVjb3JkZWRBdXhpbGlhcnlJbnB1dEZpbGVzKSB7CisgICAgdGhpcy5yZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXMgPSByZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcHJvZHVjdFBhdGgKKyAgICovCisgIHB1YmxpYyBQR0VTY2FsYXIgZ2V0UHJvZHVjdFBhdGgoKSB7CisgICAgcmV0dXJuIHByb2R1Y3RQYXRoOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwcm9kdWN0UGF0aAorICAgKiAgICAgICAgICB0aGUgcHJvZHVjdFBhdGggdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0UGF0aChQR0VTY2FsYXIgcHJvZHVjdFBhdGgpIHsKKyAgICB0aGlzLnByb2R1Y3RQYXRoID0gcHJvZHVjdFBhdGg7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbW9uaXRvclBhdGgKKyAgICovCisgIHB1YmxpYyBQR0VTY2FsYXIgZ2V0TW9uaXRvclBhdGgoKSB7CisgICAgcmV0dXJuIG1vbml0b3JQYXRoOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtb25pdG9yUGF0aAorICAgKiAgICAgICAgICB0aGUgbW9uaXRvclBhdGggdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yUGF0aChQR0VTY2FsYXIgbW9uaXRvclBhdGgpIHsKKyAgICB0aGlzLm1vbml0b3JQYXRoID0gbW9uaXRvclBhdGg7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbW9uaXRvckZpbGVuYW1lRm9ybWF0CisgICAqLworICBwdWJsaWMgUEdFU2NhbGFyIGdldE1vbml0b3JGaWxlbmFtZUZvcm1hdCgpIHsKKyAgICByZXR1cm4gbW9uaXRvckZpbGVuYW1lRm9ybWF0OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtb25pdG9yRmlsZW5hbWVGb3JtYXQKKyAgICogICAgICAgICAgdGhlIG1vbml0b3JGaWxlbmFtZUZvcm1hdCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE1vbml0b3JGaWxlbmFtZUZvcm1hdChQR0VTY2FsYXIgbW9uaXRvckZpbGVuYW1lRm9ybWF0KSB7CisgICAgdGhpcy5tb25pdG9yRmlsZW5hbWVGb3JtYXQgPSBtb25pdG9yRmlsZW5hbWVGb3JtYXQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbW9uaXRvckxldmVsR3JvdXAKKyAgICovCisgIHB1YmxpYyBQR0VHcm91cCBnZXRNb25pdG9yTGV2ZWxHcm91cCgpIHsKKyAgICByZXR1cm4gbW9uaXRvckxldmVsR3JvdXA7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG1vbml0b3JMZXZlbEdyb3VwCisgICAqICAgICAgICAgIHRoZSBtb25pdG9yTGV2ZWxHcm91cCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE1vbml0b3JMZXZlbEdyb3VwKFBHRUdyb3VwIG1vbml0b3JMZXZlbEdyb3VwKSB7CisgICAgdGhpcy5tb25pdG9yTGV2ZWxHcm91cCA9IG1vbml0b3JMZXZlbEdyb3VwOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBnZVNwZWNpZmljR3JvdXBzCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgUEdFR3JvdXA+IGdldFBnZVNwZWNpZmljR3JvdXBzKCkgeworICAgIHJldHVybiBwZ2VTcGVjaWZpY0dyb3VwczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcGdlU3BlY2lmaWNHcm91cHMKKyAgICogICAgICAgICAgdGhlIHBnZVNwZWNpZmljR3JvdXBzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UGdlU3BlY2lmaWNHcm91cHMoTWFwPFN0cmluZywgUEdFR3JvdXA+IHBnZVNwZWNpZmljR3JvdXBzKSB7CisgICAgdGhpcy5wZ2VTcGVjaWZpY0dyb3VwcyA9IHBnZVNwZWNpZmljR3JvdXBzOworICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRURhdGFIYW5kbGVyLmphdmEgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFRGF0YUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTE1YjZiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRURhdGFIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCisvKioKKyAqIAorICogPHA+CisgKiBBIFNBWC1iYXNlZCBldmVudCBoYW5kbGVyIHRvIHBhcnNlIFBHRSBkYXRhIG91dCBvZiBhbiB1bmRlcmx5aW5nIFhNTCBmaWxlLgorICogPC9wPgorICogCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFBHRURhdGFIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBQR0VEYXRhUGFyc2VLZXlzIHsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQR0VEYXRhSGFuZGxlci5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgLyogc2NhbGFycyB0byBiZSBzZXQgYXMgdGFncyBhcmUgZW5jb3VudGVyZWQgKi8KKyAgcHJpdmF0ZSBNYXAgc2NhbGFycyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgLyogdmVjdG9ycyB0byBiZSBzZXQgYXMgdGFncyBhcmUgZW5jb3VudGVyZWQgKi8KKyAgcHJpdmF0ZSBNYXAgdmVjdG9ycyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgLyogbWF0cmljZXMgdG8gYmUgc2V0IGFzIHRhZ3MgYXJlIGVuY291bnRlcmVkICovCisgIHByaXZhdGUgTWFwIG1hdHJpY2VzID0gbmV3IEhhc2hNYXAoKTsKKworICAvKiB0aGUgc3RhdHVzIG9mIHRoZSBwYXJzZSBoYW5kbGVyICovCisgIHByaXZhdGUgaW50IHBhcnNlU3RhdHVzID0gVU5TRVQ7CisKKyAgcHJpdmF0ZSBib29sZWFuIHZlY0VsZW1lbnQ7CisKKyAgcHJpdmF0ZSBib29sZWFuIG1hdHJpeEVsZW1lbnQ7CisKKyAgcHJpdmF0ZSBQR0VTY2FsYXIgY3VycmVudFNjYWxhciA9IG51bGw7CisKKyAgcHJpdmF0ZSBQR0VWZWN0b3IgY3VycmVudFZlY3RvciA9IG51bGw7CisKKyAgcHJpdmF0ZSBQR0VNYXRyaXggY3VycmVudE1hdHJpeCA9IG51bGw7CisKKyAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgY2hhckJ1ZjsKKworICAvLyBuZWVkZWQgZm9yIHBhcnNpbmcgbWF0cml4CisgIHByaXZhdGUgaW50IGN1cnJlbnRSb3cgPSAwOworCisgIHByaXZhdGUgaW50IGN1cnJlbnRDb2wgPSAwOworCisgIHB1YmxpYyBQR0VEYXRhSGFuZGxlcigpIHsKKyAgICB2ZWNFbGVtZW50ID0gZmFsc2U7CisgICAgbWF0cml4RWxlbWVudCA9IGZhbHNlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAorICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQorICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwKKyAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgaWYgKG5vdFBhcnNpbmcoKSkgeworICAgICAgLy8gb25seSBjYXJlIGFib3V0IGlmIGl0J3MgYSBzY2FsYXIvdmVjdG9yIG9yIG1hdHJpeAorICAgICAgaWYgKHFOYW1lLmVxdWFscyhTQ0FMQVJfVEFHX05BTUUpKSB7CisgICAgICAgIHBhcnNlU3RhdHVzID0gUEFSU0lOR19TQ0FMQVI7CisgICAgICAgIGN1cnJlbnRTY2FsYXIgPSBuZXcgUEdFU2NhbGFyKCk7CisgICAgICAgIGN1cnJlbnRTY2FsYXIuc2V0TmFtZShhdHRyaWJ1dGVzLmdldFZhbHVlKE5BTUVfQVRUUikpOworICAgICAgICBjaGFyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgfSBlbHNlIGlmIChxTmFtZS5lcXVhbHMoVkVDVE9SX1RBR19OQU1FKSkgeworICAgICAgICBwYXJzZVN0YXR1cyA9IFBBUlNJTkdfVkVDOworICAgICAgICBjdXJyZW50VmVjdG9yID0gbmV3IFBHRVZlY3RvcigpOworICAgICAgICBjdXJyZW50VmVjdG9yLnNldE5hbWUoYXR0cmlidXRlcy5nZXRWYWx1ZShOQU1FX0FUVFIpKTsKKyAgICAgIH0gZWxzZSBpZiAocU5hbWUuZXF1YWxzKE1BVFJJWF9UQUdfTkFNRSkpIHsKKyAgICAgICAgcGFyc2VTdGF0dXMgPSBQQVJTSU5HX01BVFJJWDsKKyAgICAgICAgY3VycmVudE1hdHJpeCA9IG5ldyBQR0VNYXRyaXgoYXR0cmlidXRlcy5nZXRWYWx1ZShOQU1FX0FUVFIpLCBJbnRlZ2VyCisgICAgICAgICAgICAucGFyc2VJbnQoYXR0cmlidXRlcy5nZXRWYWx1ZShST1dTX0FUVFIpKSwgSW50ZWdlcgorICAgICAgICAgICAgLnBhcnNlSW50KGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ09MU19BVFRSKSkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNQYXJzaW5nU2NhbGFyKCkpIHsKKyAgICAgIC8vIHNob3VsZG4ndCBlbmNvdW50ZXJlIGFub3RoZXIgdGFnIGhlcmUKKyAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIlBhcnNpbmcgc2NhbGFyOiBbIiArIHRoaXMuY3VycmVudFNjYWxhci5nZXROYW1lKCkKKyAgICAgICAgICArICJdOiBTaG91bGQgbm90IGVuY291bnRlciBhbm90aGVyIHRhZyB3aXRoaW4iKTsKKyAgICB9IGVsc2UgaWYgKGlzUGFyc2luZ1ZlY3RvcigpKSB7CisgICAgICBpZiAocU5hbWUuZXF1YWxzKFZFQ1RPUl9FTEVNRU5UX1RBRykpIHsKKyAgICAgICAgdmVjRWxlbWVudCA9IHRydWU7CisgICAgICAgIGNoYXJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGlzUGFyc2luZ01hdHJpeCgpKSB7CisgICAgICBpZiAocU5hbWUuZXF1YWxzKE1BVFJJWF9DT0xfVEFHKSkgeworICAgICAgICBtYXRyaXhFbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgY2hhckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCisgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKKyAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGlmIChxTmFtZS5lcXVhbHMoU0NBTEFSX1RBR19OQU1FKSkgeworICAgICAgdGhpcy5jdXJyZW50U2NhbGFyLnNldFZhbHVlKHRoaXMuY2hhckJ1Zi50b1N0cmluZygpKTsKKyAgICAgIHRoaXMuc2NhbGFycy5wdXQodGhpcy5jdXJyZW50U2NhbGFyLmdldE5hbWUoKSwgdGhpcy5jdXJyZW50U2NhbGFyKTsKKyAgICAgIGNsZWFyQ2hhckJ1ZigpOworICAgICAgcGFyc2VTdGF0dXMgPSBVTlNFVDsKKyAgICB9IGVsc2UgaWYgKHFOYW1lLmVxdWFscyhWRUNUT1JfRUxFTUVOVF9UQUcpKSB7CisgICAgICB0aGlzLmN1cnJlbnRWZWN0b3IuZ2V0RWxlbWVudHMoKS5hZGQodGhpcy5jaGFyQnVmLnRvU3RyaW5nKCkpOworICAgICAgY2xlYXJDaGFyQnVmKCk7CisgICAgICB0aGlzLnZlY0VsZW1lbnQgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHFOYW1lLmVxdWFscyhWRUNUT1JfVEFHX05BTUUpKSB7CisgICAgICAvLyBhZGQgdGhlIHZlY3RvcgorICAgICAgaWYgKHRoaXMuY3VycmVudFZlY3RvciAhPSBudWxsKSB7CisgICAgICAgIHRoaXMudmVjdG9ycy5wdXQodGhpcy5jdXJyZW50VmVjdG9yLmdldE5hbWUoKSwgdGhpcy5jdXJyZW50VmVjdG9yKTsKKyAgICAgICAgcGFyc2VTdGF0dXMgPSBVTlNFVDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHFOYW1lLmVxdWFscyhNQVRSSVhfVEFHX05BTUUpKSB7CisgICAgICBpZiAodGhpcy5jdXJyZW50TWF0cml4ICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy5tYXRyaWNlcy5wdXQodGhpcy5jdXJyZW50TWF0cml4LmdldE5hbWUoKSwgdGhpcy5jdXJyZW50TWF0cml4KTsKKworICAgICAgICBwYXJzZVN0YXR1cyA9IFVOU0VUOworICAgICAgICB0aGlzLmN1cnJlbnRDb2wgPSAwOworICAgICAgICB0aGlzLmN1cnJlbnRSb3cgPSAwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocU5hbWUuZXF1YWxzKE1BVFJJWF9ST1dfVEFHKSkgeworICAgICAgdGhpcy5jdXJyZW50Um93Kys7CisgICAgICB0aGlzLmN1cnJlbnRDb2wgPSAwOworICAgIH0gZWxzZSBpZiAocU5hbWUuZXF1YWxzKE1BVFJJWF9DT0xfVEFHKSkgeworICAgICAgdGhpcy5jdXJyZW50TWF0cml4LmFkZFZhbHVlKHRoaXMuY2hhckJ1Zi50b1N0cmluZygpLCB0aGlzLmN1cnJlbnRSb3csCisgICAgICAgICAgdGhpcy5jdXJyZW50Q29sKTsKKyAgICAgIHRoaXMuY3VycmVudENvbCsrOworICAgICAgY2xlYXJDaGFyQnVmKCk7CisgICAgICB0aGlzLm1hdHJpeEVsZW1lbnQgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQorICAgKi8KKyAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgLyoKKyAgICAgKiBTdHJpbmcgdmFsID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCkudHJpbSgpOyBpZighdmFsLmVxdWFscygiIikpeworICAgICAqIHRoaXMuY2hhckJ1Zi5hcHBlbmQodmFsKTsgfQorICAgICAqLworICAgIGlmIChpc1BhcnNpbmdTY2FsYXIoKSB8fCBpc1BhcnNpbmdWZWN0b3JFbGVtZW50KCkKKyAgICAgICAgfHwgaXNQYXJzaW5nTWF0cml4RWxlbWVudCgpKSB7CisgICAgICB0aGlzLmNoYXJCdWYuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbWF0cmljZXMKKyAgICovCisgIHB1YmxpYyBNYXAgZ2V0TWF0cmljZXMoKSB7CisgICAgcmV0dXJuIG1hdHJpY2VzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtYXRyaWNlcworICAgKiAgICAgICAgICB0aGUgbWF0cmljZXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNYXRyaWNlcyhNYXAgbWF0cmljZXMpIHsKKyAgICB0aGlzLm1hdHJpY2VzID0gbWF0cmljZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgc2NhbGFycworICAgKi8KKyAgcHVibGljIE1hcCBnZXRTY2FsYXJzKCkgeworICAgIHJldHVybiBzY2FsYXJzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzY2FsYXJzCisgICAqICAgICAgICAgIHRoZSBzY2FsYXJzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U2NhbGFycyhNYXAgc2NhbGFycykgeworICAgIHRoaXMuc2NhbGFycyA9IHNjYWxhcnM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgdmVjdG9ycworICAgKi8KKyAgcHVibGljIE1hcCBnZXRWZWN0b3JzKCkgeworICAgIHJldHVybiB2ZWN0b3JzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB2ZWN0b3JzCisgICAqICAgICAgICAgIHRoZSB2ZWN0b3JzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VmVjdG9ycyhNYXAgdmVjdG9ycykgeworICAgIHRoaXMudmVjdG9ycyA9IHZlY3RvcnM7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1BhcnNpbmdTY2FsYXIoKSB7CisgICAgcmV0dXJuIHBhcnNlU3RhdHVzID09IFBBUlNJTkdfU0NBTEFSOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nVmVjdG9yKCkgeworICAgIHJldHVybiBwYXJzZVN0YXR1cyA9PSBQQVJTSU5HX1ZFQzsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUGFyc2luZ01hdHJpeCgpIHsKKyAgICByZXR1cm4gcGFyc2VTdGF0dXMgPT0gUEFSU0lOR19NQVRSSVg7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1BhcnNpbmdNYXRyaXhFbGVtZW50KCkgeworICAgIHJldHVybiBtYXRyaXhFbGVtZW50OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nVmVjdG9yRWxlbWVudCgpIHsKKyAgICByZXR1cm4gdmVjRWxlbWVudDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG5vdFBhcnNpbmcoKSB7CisgICAgcmV0dXJuIHBhcnNlU3RhdHVzID09IFVOU0VUOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNsZWFyQ2hhckJ1ZigpIHsKKyAgICB0aGlzLmNoYXJCdWYuc2V0TGVuZ3RoKDApOworICAgIHRoaXMuY2hhckJ1ZiA9IG51bGw7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRURhdGFQYXJzZUtleXMuamF2YSBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VEYXRhUGFyc2VLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1ZTA2MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VEYXRhUGFyc2VLZXlzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dDsKKworLyoqCisgKiAKKyAqIDxwPgorICogQSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIGtleXMgcmVsYXRpbmcgdG8gdGhlIHtAbGluayBQR0VEYXRhSGFuZGxlcn0KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUEdFRGF0YVBhcnNlS2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0lOR19WRUMgPSAtMTA7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0lOR19TQ0FMQVIgPSAtMjA7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0lOR19NQVRSSVggPSAtMzA7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRVQgPSAtMTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9UQUdfTkFNRSA9ICJncm91cCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEFSX1RBR19OQU1FID0gInNjYWxhciI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVDVE9SX1RBR19OQU1FID0gInZlY3RvciI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUUklYX1RBR19OQU1FID0gIm1hdHJpeCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEdFX0lOUFVUX1RBR19OQU1FID0gImlucHV0IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRUNUT1JfRUxFTUVOVF9UQUcgPSAiZWxlbWVudCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUUklYX1JPV19UQUcgPSAidHIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVFJJWF9DT0xfVEFHID0gInRkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFIgPSAibmFtZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9XU19BVFRSID0gInJvd3MiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFNfQVRUUiA9ICJjb2xzIjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VHcm91cC5qYXZhIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjYjkzZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VHcm91cC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiA8cD4KKyAqIEEgUEdFR3JvdXAgaXMgYSBuYW1lZCBzZXQgb2YgbmFtZWQge0BsaW5rIFBHRVZlY3Rvcn1zLCB7QGxpbmsgUEdFU2NhbGFyfXMgYW5kCisgKiB7QGxpbmsgUEdFTWF0cml4fXMuCisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUEdFR3JvdXAgeworCisgIC8qIHRoZSBuYW1lIG9mIHRoZSBQR0VHcm91cCAqLworICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAvKiB0aGUgSGFzaE1hcCBvZiBQR0VTY2FsYXJzICovCisgIHByaXZhdGUgTWFwPFN0cmluZywgUEdFU2NhbGFyPiBzY2FsYXJzID0gbnVsbDsKKworICAvKiB0aGUgSGFzaE1hcCBvZiBQR0VWZWN0b3JzICovCisgIHByaXZhdGUgTWFwPFN0cmluZywgUEdFVmVjdG9yPiB2ZWN0b3JzID0gbnVsbDsKKworICAvKiB0aGUgSGFzaE1hcCBvZiBQR0VNYXRyaXhzICovCisgIHByaXZhdGUgTWFwPFN0cmluZywgUEdFTWF0cml4PiBtYXRyaXhzID0gbnVsbDsKKworICAvKiB0aGUgSGFzaE1hcCBvZiBQR0VHcm91cHMgKi8KKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQR0VHcm91cD4gZ3JvdXBzID0gbnVsbDsKKworICAvKioKKyAgICogPHA+CisgICAqIENvbnN0cnVjdHMgYSBuZXcgUEdFR3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgUEdFR3JvdXAoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMuc2NhbGFycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUEdFU2NhbGFyPigpOworICAgIHRoaXMudmVjdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUEdFVmVjdG9yPigpOworICAgIHRoaXMubWF0cml4cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUEdFTWF0cml4PigpOworICAgIHRoaXMuZ3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQR0VHcm91cD4oKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgdGhlIG5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBzY2FsYXJzCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgUEdFU2NhbGFyPiBnZXRTY2FsYXJzKCkgeworICAgIHJldHVybiBzY2FsYXJzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzY2FsYXJzCisgICAqICAgICAgICAgIHRoZSBzY2FsYXJzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U2NhbGFycyhNYXA8U3RyaW5nLCBQR0VTY2FsYXI+IHNjYWxhcnMpIHsKKyAgICB0aGlzLnNjYWxhcnMgPSBzY2FsYXJzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHZlY3RvcnMKKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBQR0VWZWN0b3I+IGdldFZlY3RvcnMoKSB7CisgICAgcmV0dXJuIHZlY3RvcnM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHZlY3RvcnMKKyAgICogICAgICAgICAgdGhlIHZlY3RvcnMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRWZWN0b3JzKE1hcDxTdHJpbmcsIFBHRVZlY3Rvcj4gdmVjdG9ycykgeworICAgIHRoaXMudmVjdG9ycyA9IHZlY3RvcnM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbWF0cml4cworICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFBHRU1hdHJpeD4gZ2V0TWF0cml4cygpIHsKKyAgICByZXR1cm4gbWF0cml4czsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbWF0cml4cworICAgKiAgICAgICAgICB0aGUgbWF0cml4cyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE1hdHJpeHMoTWFwPFN0cmluZywgUEdFTWF0cml4PiBtYXRyaXhzKSB7CisgICAgdGhpcy5tYXRyaXhzID0gbWF0cml4czsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBncm91cHMKKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBQR0VHcm91cD4gZ2V0R3JvdXBzKCkgeworICAgIHJldHVybiBncm91cHM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGdyb3VwcworICAgKiAgICAgICAgICB0aGUgZ3JvdXBzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0R3JvdXBzKE1hcDxTdHJpbmcsIFBHRUdyb3VwPiBncm91cHMpIHsKKyAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFNjYWxhcihQR0VTY2FsYXIgc2NhbGFyKSB7CisgICAgaWYgKHRoaXMuc2NhbGFycyAhPSBudWxsICYmICF0aGlzLnNjYWxhcnMuY29udGFpbnNLZXkoc2NhbGFyLmdldE5hbWUoKSkpIHsKKyAgICAgIHRoaXMuc2NhbGFycy5wdXQoc2NhbGFyLmdldE5hbWUoKSwgc2NhbGFyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRWZWN0b3IoUEdFVmVjdG9yIHZlY3RvcikgeworICAgIGlmICh0aGlzLnZlY3RvcnMgIT0gbnVsbCAmJiAhdGhpcy52ZWN0b3JzLmNvbnRhaW5zS2V5KHZlY3Rvci5nZXROYW1lKCkpKSB7CisgICAgICB0aGlzLnZlY3RvcnMucHV0KHZlY3Rvci5nZXROYW1lKCksIHZlY3Rvcik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYWRkTWF0cml4KFBHRU1hdHJpeCBtYXRyaXgpIHsKKyAgICBpZiAodGhpcy5tYXRyaXhzICE9IG51bGwgJiYgIXRoaXMubWF0cml4cy5jb250YWluc0tleShtYXRyaXguZ2V0TmFtZSgpKSkgeworICAgICAgdGhpcy5tYXRyaXhzLnB1dChtYXRyaXguZ2V0TmFtZSgpLCBtYXRyaXgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBQR0VTY2FsYXIgZ2V0U2NhbGFyKFN0cmluZyBuYW1lKSB7CisgICAgaWYgKHRoaXMuc2NhbGFycyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzLmdldChuYW1lKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIFBHRVZlY3RvciBnZXRWZWN0b3IoU3RyaW5nIG5hbWUpIHsKKyAgICBpZiAodGhpcy52ZWN0b3JzICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB0aGlzLnZlY3RvcnMuZ2V0KG5hbWUpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgUEdFTWF0cml4IGdldE1hdHJpeChTdHJpbmcgbmFtZSkgeworICAgIGlmICh0aGlzLm1hdHJpeHMgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRoaXMubWF0cml4cy5nZXQobmFtZSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBQR0VHcm91cCBnZXRHcm91cChTdHJpbmcgbmFtZSkgeworICAgIGlmICh0aGlzLmdyb3VwcyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gdGhpcy5ncm91cHMuZ2V0KG5hbWUpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgaW50IGdldE51bVNjYWxhcnMoKSB7CisgICAgaWYgKHRoaXMuc2NhbGFycyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzLnNpemUoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIGludCBnZXROdW1WZWN0b3JzKCkgeworICAgIGlmICh0aGlzLnZlY3RvcnMgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy5zaXplKCk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0TnVtTWF0cml4cygpIHsKKyAgICBpZiAodGhpcy5tYXRyaXhzICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB0aGlzLm1hdHJpeHMuc2l6ZSgpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgaW50IGdldE51bUdyb3VwcygpIHsKKyAgICBpZiAodGhpcy5ncm91cHMgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnNpemUoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VNYXRyaXguamF2YSBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VNYXRyaXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjYzNjJiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRU1hdHJpeC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIDxwPgorICogQSBQR0VNYXRyaXggaXMgYSBzZXQgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIHZhbHVlcyBpbiBlYWNoIGNlbGwgZGVmaW5lZCBieQorICogYSByb3cgbnVtYmVyIGFuZCBjb2x1bW4gbnVtYmVyLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBHRU1hdHJpeCB7CisKKyAgcHJpdmF0ZSBMaXN0PExpc3Q8T2JqZWN0Pj4gcm93czsKKworICBwcml2YXRlIGludCBudW1Db2xzOworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBHRU1hdHJpeCB3aXRoIG5vIHJvd3Mgb3IgY29sdW1ucy4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIFBHRU1hdHJpeCgpIHsKKyAgICB0aGlzKG51bGwsIDAsIDApOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBHRU1hdHJpeCB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+bnVtcm93czwvY29kZT4gYW5kCisgICAqIDxjb2RlPm51bWNvbHM8L2NvZGU+LgorICAgKiAKKyAgICogQHBhcmFtIG51bXJvd3MKKyAgICogICAgICAgICAgVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBtYXRyaXguCisgICAqIEBwYXJhbSBudW1jb2xzCisgICAqICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgZWFjaCByb3cgaW4gdGhlIG1hdHJpeC4KKyAgICovCisgIHB1YmxpYyBQR0VNYXRyaXgoU3RyaW5nIG5hbWUsIGludCBudW1yb3dzLCBpbnQgbnVtY29scykgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5yb3dzID0gbmV3IFZlY3RvcjxMaXN0PE9iamVjdD4+KG51bXJvd3MpOworICAgIHRoaXMubnVtQ29scyA9IG51bWNvbHM7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtcm93czsgaSsrKSB7CisgICAgICBMaXN0PE9iamVjdD4gY29sVmVjdG9yID0gbmV3IFZlY3RvcjxPYmplY3Q+KG51bWNvbHMpOworICAgICAgdGhpcy5yb3dzLmFkZChpLCBjb2xWZWN0b3IpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKE9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIGlmICgocm93ID4gdGhpcy5yb3dzLnNpemUoKSB8fCByb3cgPCAwKSB8fCAoY29sID4gdGhpcy5udW1Db2xzIHx8IGNvbCA8IDApKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgKChMaXN0PE9iamVjdD4pIHRoaXMucm93cy5nZXQocm93KSkuYWRkKGNvbCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgaWYgKChyb3cgPiB0aGlzLnJvd3Muc2l6ZSgpIHx8IHJvdyA8IDApIHx8IChjb2wgPiB0aGlzLm51bUNvbHMgfHwgY29sIDwgMCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiAoKExpc3Q8T2JqZWN0PikgdGhpcy5yb3dzLmdldChyb3cpKS5nZXQoY29sKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvd3MuCisgICAqLworICBwdWJsaWMgTGlzdDxMaXN0PE9iamVjdD4+IGdldFJvd3MoKSB7CisgICAgcmV0dXJuIHRoaXMucm93czsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcm93cworICAgKiAgICAgICAgICBUaGUgcm93cyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSb3dzKExpc3Q8TGlzdDxPYmplY3Q+PiByb3dzKSB7CisgICAgdGhpcy5yb3dzID0gcm93czsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICBUaGUgbmFtZSB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG51bUNvbHMuCisgICAqLworICBwdWJsaWMgaW50IGdldE51bUNvbHMoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtQ29sczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbnVtQ29scworICAgKiAgICAgICAgICBUaGUgbnVtQ29scyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXROdW1Db2xzKGludCBudW1Db2xzKSB7CisgICAgdGhpcy5udW1Db2xzID0gbnVtQ29sczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFU2NhbGFyLmphdmEgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFU2NhbGFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0MTAxYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VTY2FsYXIuamF2YQpAQCAtMCwwICsxLDgyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0OworCisvKioKKyAqIAorICogPHA+CisgKiBBIFBHRSBTY2FsYXIgcmVwcmVzZW50cyBhIG5hbWVkIHVuaXQgb2YgaW5mb3JtYXRpb24uIEluIGVzc2VuY2UsIGl0IGlzIGEKKyAqIG5hbWUvdmFsdWUgcGFpci4KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQR0VTY2FsYXIgeworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgLyoqCisgICAgICogCisgICAgICovCisgIHB1YmxpYyBQR0VTY2FsYXIoKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiBAcGFyYW0gdmFsdWUKKyAgICovCisgIHB1YmxpYyBQR0VTY2FsYXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lCisgICAqICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB2YWx1ZQorICAgKiAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRVZlY3Rvci5qYXZhIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRVZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTdjZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFVmVjdG9yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5pbnB1dDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogCisgKiA8cD4KKyAqIEEgUEdFVmVjdG9yIGlzIGEgZHluYW1pYyBzZXQgb2YgaW5mb3JtYXRpb24sIGNvdXBsZWQgd2l0aCBhIG5hbWUuIFRoZQorICogaW5mb3JtYXRpb24gbWF5IGluY2x1ZGUgbnVtYmVyLCBvciBzdHJpbmcgZGF0YS4KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQR0VWZWN0b3IgeworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gZWxlbWVudHM7CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lCisgICAqIEBwYXJhbSBlbGVtZW50cworICAgKi8KKyAgcHVibGljIFBHRVZlY3RvcihTdHJpbmcgbmFtZSwgTGlzdDxPYmplY3Q+IGVsZW1lbnRzKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICovCisgIHB1YmxpYyBQR0VWZWN0b3IoKSB7CisgICAgdGhpcyhudWxsLCBuZXcgVmVjdG9yPE9iamVjdD4oKSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lCisgICAqICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZWxlbWVudHMKKyAgICovCisgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0RWxlbWVudHMoKSB7CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBlbGVtZW50cworICAgKiAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0PE9iamVjdD4gZWxlbWVudHMpIHsKKyAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRVhNTEZpbGVVdGlscy5qYXZhIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRVhNTEZpbGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmNkYjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFWE1MRmlsZVV0aWxzLmphdmEKQEAgLTAsMCArMSwzNjUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLkRPTVV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworLyoqCisgKiA8cD4KKyAqIExvdy1sZXZlbCByZWFkaW5nIEFQSSB0byBnZXQge0BsaW5rIFBHRVZlY3Rvcn1zLCB7QGxpbmsgUEdFU2NhbGFyfXMsIGFuZAorICoge0BsaW5rIFBHRU1hdHJpeH1zIGZyb20gdW5kZXJseWluZyBPQ08gWE1MIGZpbGVzLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQR0VYTUxGaWxlVXRpbHMgeworCisgIC8qIG91ciBsb2cgc3RyZWFtICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBHRVhNTEZpbGVVdGlscy5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBNYXAgZ2V0TWF0cml4c0FzTWFwKEVsZW1lbnQgZ3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisgICAgLy8gZ2V0IHRoZSBub2RlbGlzdCBmb3IgdGhlIG1hdHJpeHMKKyAgICBOb2RlTGlzdCBtYXRyaXhzID0gZ3JvdXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1hdHJpeCIpOworCisgICAgLy8gaWYgaXQncyBudWxsLCByZXR1cm4gbnVsbAorICAgIGlmIChtYXRyaXhzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIE1hcCBtYXRyaXhNYXAgPSBuZXcgSGFzaE1hcChtYXRyaXhzLmdldExlbmd0aCgpKTsKKworICAgIC8vIGZvciBlYWNoIG1hdHJpeCBpbiB0aGUgbGlzdCwgY3JlYXRlIGEgUEdFTWF0cml4IHdpdGggdGhlIG5hbWUKKyAgICAvLyBhdHRyaWJ1dGUgYW5kIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRyaXhzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgbWF0cml4ID0gKEVsZW1lbnQpIG1hdHJpeHMuaXRlbShpKTsKKworICAgICAgLy8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBtYXRyaXgKKyAgICAgIFN0cmluZyBtYXRyaXhOYW1lID0gbWF0cml4LmdldEF0dHJpYnV0ZSgibmFtZSIpOworCisgICAgICAvLyBnZXQgdGhlIG51bWJlciBvZiBjb2xzCisgICAgICBOb2RlTGlzdCByb3dOb2RlTGlzdCA9IG1hdHJpeC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKTsKKworICAgICAgLy8gdGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSAxCisgICAgICBpZiAocm93Tm9kZUxpc3QgPT0gbnVsbAorICAgICAgICAgIHx8IChyb3dOb2RlTGlzdCAhPSBudWxsICYmIHJvd05vZGVMaXN0LmdldExlbmd0aCgpIDw9IDApKSB7CisgICAgICAgIHRocm93IG5ldyBQR0VDb25maWdGaWxlRXhjZXB0aW9uKAorICAgICAgICAgICAgInRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJvdyBpbiBhIG1hdHJpeCEiKTsKKyAgICAgIH0KKworICAgICAgUEdFTWF0cml4IHBnZU1hdHJpeCA9IG5ldyBQR0VNYXRyaXgoKTsKKyAgICAgIHBnZU1hdHJpeC5zZXROYW1lKG1hdHJpeE5hbWUpOworCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJvd05vZGVMaXN0LmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgRWxlbWVudCByb3dFbGVtID0gKEVsZW1lbnQpIHJvd05vZGVMaXN0Lml0ZW0oaik7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgY29scworICAgICAgICBOb2RlTGlzdCBjb2xOb2RlTGlzdCA9IHJvd0VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisKKyAgICAgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY29sdW0gaW4gZWFjaCByb3cKKyAgICAgICAgaWYgKGNvbE5vZGVMaXN0ID09IG51bGwKKyAgICAgICAgICAgIHx8IChjb2xOb2RlTGlzdCAhPSBudWxsICYmIGNvbE5vZGVMaXN0LmdldExlbmd0aCgpIDw9IDApKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICJ0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBjb2x1bW4gYSBtYXRyaXggcm93ISIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBnZU1hdHJpeC5nZXROdW1Db2xzKCkgPT0gMCkgeworICAgICAgICAgIC8vIHRoZW4gc2V0IGl0CisgICAgICAgICAgcGdlTWF0cml4LnNldE51bUNvbHMoY29sTm9kZUxpc3QuZ2V0TGVuZ3RoKCkpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdCBjb2xMaXN0ID0gbmV3IFZlY3Rvcihjb2xOb2RlTGlzdC5nZXRMZW5ndGgoKSk7CisKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb2xOb2RlTGlzdC5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgRWxlbWVudCBjb2xFbGVtZW50ID0gKEVsZW1lbnQpIGNvbE5vZGVMaXN0Lml0ZW0oayk7CisgICAgICAgICAgY29sTGlzdC5hZGQoRE9NVXRpbC5nZXRTaW1wbGVFbGVtZW50VGV4dChjb2xFbGVtZW50KSk7CisgICAgICAgIH0KKworICAgICAgICBwZ2VNYXRyaXguZ2V0Um93cygpLmFkZChjb2xMaXN0KTsKKyAgICAgIH0KKworICAgICAgbWF0cml4TWFwLnB1dChwZ2VNYXRyaXguZ2V0TmFtZSgpLCBwZ2VNYXRyaXgpOworICAgIH0KKyAgICByZXR1cm4gbWF0cml4TWFwOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0IGdldE1hdHJpeHMoRWxlbWVudCBncm91cCkgdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24geworICAgIC8vIGdldCB0aGUgbm9kZWxpc3QgZm9yIHRoZSBtYXRyaXhzCisgICAgTm9kZUxpc3QgbWF0cml4cyA9IGdyb3VwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtYXRyaXgiKTsKKworICAgIC8vIGlmIGl0J3MgbnVsbCwgcmV0dXJuIG51bGwKKyAgICBpZiAobWF0cml4cyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBMaXN0IG1hdHJpeExpc3QgPSBuZXcgVmVjdG9yKG1hdHJpeHMuZ2V0TGVuZ3RoKCkpOworCisgICAgLy8gZm9yIGVhY2ggbWF0cml4IGluIHRoZSBsaXN0LCBjcmVhdGUgYSBQR0VNYXRyaXggd2l0aCB0aGUgbmFtZQorICAgIC8vIGF0dHJpYnV0ZSBhbmQgdGhlIGFwcHJvcHJpYXRlIHZhbHVlCisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hdHJpeHMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgRWxlbWVudCBtYXRyaXggPSAoRWxlbWVudCkgbWF0cml4cy5pdGVtKGkpOworCisgICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIG1hdHJpeAorICAgICAgU3RyaW5nIG1hdHJpeE5hbWUgPSBtYXRyaXguZ2V0QXR0cmlidXRlKCJuYW1lIik7CisKKyAgICAgIC8vIGdldCB0aGUgbnVtYmVyIG9mIGNvbHMKKyAgICAgIE5vZGVMaXN0IHJvd05vZGVMaXN0ID0gbWF0cml4LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOworCisgICAgICAvLyB0aGVyZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIDEKKyAgICAgIGlmIChyb3dOb2RlTGlzdCA9PSBudWxsCisgICAgICAgICAgfHwgKHJvd05vZGVMaXN0ICE9IG51bGwgJiYgcm93Tm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPD0gMCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24oCisgICAgICAgICAgICAidGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcm93IGluIGEgbWF0cml4ISIpOworICAgICAgfQorCisgICAgICBQR0VNYXRyaXggcGdlTWF0cml4ID0gbmV3IFBHRU1hdHJpeCgpOworICAgICAgcGdlTWF0cml4LnNldE5hbWUobWF0cml4TmFtZSk7CisKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcm93Tm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICBFbGVtZW50IHJvd0VsZW0gPSAoRWxlbWVudCkgcm93Tm9kZUxpc3QuaXRlbShqKTsKKworICAgICAgICAvLyBnZXQgdGhlIG51bWJlciBvZiBjb2xzCisgICAgICAgIE5vZGVMaXN0IGNvbE5vZGVMaXN0ID0gcm93RWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKworICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBjb2x1bSBpbiBlYWNoIHJvdworICAgICAgICBpZiAoY29sTm9kZUxpc3QgPT0gbnVsbAorICAgICAgICAgICAgfHwgKGNvbE5vZGVMaXN0ICE9IG51bGwgJiYgY29sTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPD0gMCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgInRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGNvbHVtbiBhIG1hdHJpeCByb3chIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGdlTWF0cml4LmdldE51bUNvbHMoKSA9PSAwKSB7CisgICAgICAgICAgLy8gdGhlbiBzZXQgaXQKKyAgICAgICAgICBwZ2VNYXRyaXguc2V0TnVtQ29scyhjb2xOb2RlTGlzdC5nZXRMZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0IGNvbExpc3QgPSBuZXcgVmVjdG9yKGNvbE5vZGVMaXN0LmdldExlbmd0aCgpKTsKKworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGNvbE5vZGVMaXN0LmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgICAgICBFbGVtZW50IGNvbEVsZW1lbnQgPSAoRWxlbWVudCkgY29sTm9kZUxpc3QuaXRlbShrKTsKKyAgICAgICAgICBjb2xMaXN0LmFkZChET01VdGlsLmdldFNpbXBsZUVsZW1lbnRUZXh0KGNvbEVsZW1lbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBnZU1hdHJpeC5nZXRSb3dzKCkuYWRkKGNvbExpc3QpOworICAgICAgfQorCisgICAgICBtYXRyaXhMaXN0LmFkZChwZ2VNYXRyaXgpOworICAgIH0KKworICAgIHJldHVybiBtYXRyaXhMaXN0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBNYXAgZ2V0U2NhbGFyc0FzTWFwKEVsZW1lbnQgZ3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisgICAgLy8gZ2V0IHRoZSBub2RlbGlzdCBmb3Igc2NhbGFycworICAgIE5vZGVMaXN0IHNjYWxhcnMgPSBncm91cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NhbGFyIik7CisKKyAgICAvLyBpZiBpdCdzIG51bGwsIHJldHVybiBudWxsCisgICAgaWYgKHNjYWxhcnMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTWFwIHNjYWxhck1hcCA9IG5ldyBIYXNoTWFwKHNjYWxhcnMuZ2V0TGVuZ3RoKCkpOworCisgICAgLy8gZm9yIGVhY2ggc2NhbGFyIGluIHRoZSBsaXN0LCBjcmVhdGUgYSBQR0VTY2FsYXIgd2l0aCB0aGUgbmFtZQorICAgIC8vIGF0dHJpYnV0ZSwgYW5kIGFwcHJvcHJpYXRlIHZhbHVlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2FsYXJzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgc2NhbGFyID0gKEVsZW1lbnQpIHNjYWxhcnMuaXRlbShpKTsKKworICAgICAgLy8gbmFtZSBvZiB0aGUgc2NhbGFyIGlzIGluIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAgU3RyaW5nIHNjYWxhck5hbWUgPSBzY2FsYXIuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisKKyAgICAgIC8vIGdldCB0aGUgdmFsdWUgb2YgaXQKKyAgICAgIFN0cmluZyBzY2FsYXJWYWx1ZSA9IERPTVV0aWwuZ2V0U2ltcGxlRWxlbWVudFRleHQoc2NhbGFyKTsKKworICAgICAgc2NhbGFyTWFwLnB1dChzY2FsYXJOYW1lLCBuZXcgUEdFU2NhbGFyKHNjYWxhck5hbWUsIHNjYWxhclZhbHVlKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNjYWxhck1hcDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTY2FsYXJzKEVsZW1lbnQgZ3JvdXApIHRocm93cyBQR0VDb25maWdGaWxlRXhjZXB0aW9uIHsKKyAgICAvLyBnZXQgdGhlIG5vZGVsaXN0IGZvciBzY2FsYXJzCisgICAgTm9kZUxpc3Qgc2NhbGFycyA9IGdyb3VwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY2FsYXIiKTsKKworICAgIC8vIGlmIGl0J3MgbnVsbCwgcmV0dXJuIG51bGwKKyAgICBpZiAoc2NhbGFycyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBMaXN0IHNjYWxhckxpc3QgPSBuZXcgVmVjdG9yKHNjYWxhcnMuZ2V0TGVuZ3RoKCkpOworCisgICAgLy8gZm9yIGVhY2ggc2NhbGFyIGluIHRoZSBsaXN0LCBjcmVhdGUgYSBQR0VTY2FsYXIgd2l0aCB0aGUgbmFtZQorICAgIC8vIGF0dHJpYnV0ZSwgYW5kIGFwcHJvcHJpYXRlIHZhbHVlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2FsYXJzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgc2NhbGFyID0gKEVsZW1lbnQpIHNjYWxhcnMuaXRlbShpKTsKKworICAgICAgLy8gbmFtZSBvZiB0aGUgc2NhbGFyIGlzIGluIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAgU3RyaW5nIHNjYWxhck5hbWUgPSBzY2FsYXIuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisKKyAgICAgIC8vIGdldCB0aGUgdmFsdWUgb2YgaXQKKyAgICAgIFN0cmluZyBzY2FsYXJWYWx1ZSA9IERPTVV0aWwuZ2V0U2ltcGxlRWxlbWVudFRleHQoc2NhbGFyKTsKKworICAgICAgc2NhbGFyTGlzdC5hZGQobmV3IFBHRVNjYWxhcihzY2FsYXJOYW1lLCBzY2FsYXJWYWx1ZSkpOworICAgIH0KKworICAgIHJldHVybiBzY2FsYXJMaXN0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBNYXAgZ2V0VmVjdG9yc0FzTWFwKEVsZW1lbnQgZ3JvdXApCisgICAgICB0aHJvd3MgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiB7CisgICAgLy8gZ2V0IHRoZSBub2RlbGlzdCBmb3Igc2NhbGFycworICAgIE5vZGVMaXN0IHZlY3RvcnMgPSBncm91cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmVjdG9yIik7CisKKyAgICAvLyBpZiBpdCdzIG51bGwsIHJldHVybiBudWxsCisgICAgaWYgKHZlY3RvcnMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTWFwIHZlY3Rvck1hcCA9IG5ldyBIYXNoTWFwKHZlY3RvcnMuZ2V0TGVuZ3RoKCkpOworCisgICAgLy8gZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBsaXN0LCBjcmVhdGUgYSBQR0VWZWN0b3Igd2l0aCB0aGUgbmFtZQorICAgIC8vIGF0dHJpYnV0ZSwgYW5kIGFwcHJvcHJpYXRlIHZhbHVlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3JzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgdmVjdG9yID0gKEVsZW1lbnQpIHZlY3RvcnMuaXRlbShpKTsKKworICAgICAgLy8gbmFtZSBvZiB0aGUgdmVjdG9yIGlzIGluIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAgU3RyaW5nIHZlY3Rvck5hbWUgPSB2ZWN0b3IuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisKKyAgICAgIFBHRVZlY3RvciB2ZWMgPSBuZXcgUEdFVmVjdG9yKCk7CisgICAgICB2ZWMuc2V0TmFtZSh2ZWN0b3JOYW1lKTsKKworICAgICAgLy8gZ2V0IHRoZSBub2RlbGlzdCBvZiBlbGVtZW50cworICAgICAgTm9kZUxpc3QgdmVjRWxlbXMgPSB2ZWN0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVsZW1lbnQiKTsKKworICAgICAgaWYgKHZlY0VsZW1zID09IG51bGwgfHwgKHZlY0VsZW1zICE9IG51bGwgJiYgdmVjRWxlbXMuZ2V0TGVuZ3RoKCkgPD0gMCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24oCisgICAgICAgICAgICAiVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiBhIFBHRVZlY3RvciEiKTsKKyAgICAgIH0KKworICAgICAgTGlzdCB2ZWNFbGVtTGlzdCA9IG5ldyBWZWN0b3IodmVjRWxlbXMuZ2V0TGVuZ3RoKCkpOworCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZlY0VsZW1zLmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgRWxlbWVudCB2ZWNFbGVtID0gKEVsZW1lbnQpIHZlY0VsZW1zLml0ZW0oaik7CisgICAgICAgIHZlY0VsZW1MaXN0LmFkZChET01VdGlsLmdldFNpbXBsZUVsZW1lbnRUZXh0KHZlY0VsZW0pKTsKKyAgICAgIH0KKworICAgICAgdmVjLnNldEVsZW1lbnRzKHZlY0VsZW1MaXN0KTsKKyAgICAgIHZlY3Rvck1hcC5wdXQodmVjLmdldE5hbWUoKSwgdmVjKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmVjdG9yTWFwOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0IGdldFZlY3RvcnMoRWxlbWVudCBncm91cCkgdGhyb3dzIFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24geworICAgIC8vIGdldCB0aGUgbm9kZWxpc3QgZm9yIHNjYWxhcnMKKyAgICBOb2RlTGlzdCB2ZWN0b3JzID0gZ3JvdXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZlY3RvciIpOworCisgICAgLy8gaWYgaXQncyBudWxsLCByZXR1cm4gbnVsbAorICAgIGlmICh2ZWN0b3JzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIExpc3QgdmVjdG9yTGlzdCA9IG5ldyBWZWN0b3IodmVjdG9ycy5nZXRMZW5ndGgoKSk7CisKKyAgICAvLyBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGxpc3QsIGNyZWF0ZSBhIFBHRVZlY3RvciB3aXRoIHRoZSBuYW1lCisgICAgLy8gYXR0cmlidXRlLCBhbmQgYXBwcm9wcmlhdGUgdmFsdWUKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3RvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgRWxlbWVudCB2ZWN0b3IgPSAoRWxlbWVudCkgdmVjdG9ycy5pdGVtKGkpOworCisgICAgICAvLyBuYW1lIG9mIHRoZSB2ZWN0b3IgaXMgaW4gdGhlIG5hbWUgYXR0cmlidXRlCisgICAgICBTdHJpbmcgdmVjdG9yTmFtZSA9IHZlY3Rvci5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKworICAgICAgUEdFVmVjdG9yIHZlYyA9IG5ldyBQR0VWZWN0b3IoKTsKKyAgICAgIHZlYy5zZXROYW1lKHZlY3Rvck5hbWUpOworCisgICAgICAvLyBnZXQgdGhlIG5vZGVsaXN0IG9mIGVsZW1lbnRzCisgICAgICBOb2RlTGlzdCB2ZWNFbGVtcyA9IHZlY3Rvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZWxlbWVudCIpOworCisgICAgICBpZiAodmVjRWxlbXMgPT0gbnVsbCB8fCAodmVjRWxlbXMgIT0gbnVsbCAmJiB2ZWNFbGVtcy5nZXRMZW5ndGgoKSA8PSAwKSkgeworICAgICAgICB0aHJvdyBuZXcgUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIGEgUEdFVmVjdG9yISIpOworICAgICAgfQorCisgICAgICBMaXN0IHZlY0VsZW1MaXN0ID0gbmV3IFZlY3Rvcih2ZWNFbGVtcy5nZXRMZW5ndGgoKSk7CisKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmVjRWxlbXMuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICBFbGVtZW50IHZlY0VsZW0gPSAoRWxlbWVudCkgdmVjRWxlbXMuaXRlbShqKTsKKyAgICAgICAgdmVjRWxlbUxpc3QuYWRkKERPTVV0aWwuZ2V0U2ltcGxlRWxlbWVudFRleHQodmVjRWxlbSkpOworICAgICAgfQorCisgICAgICB2ZWMuc2V0RWxlbWVudHModmVjRWxlbUxpc3QpOworICAgICAgdmVjdG9yTGlzdC5hZGQodmVjKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmVjdG9yTGlzdDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnRSb290KFN0cmluZyB4bWxGaWxlKSB7CisgICAgLy8gb3BlbiB1cCB0aGUgWE1MIGZpbGUKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgIERvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBudWxsOworICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKyAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7CisKKyAgICBJbnB1dFN0cmVhbSB4bWxJbnB1dFN0cmVhbSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgeG1sSW5wdXRTdHJlYW0gPSBuZXcgRmlsZSh4bWxGaWxlKS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJJT0V4Y2VwdGlvbiB3aGVuIGdldHRpbmcgaW5wdXQgc3RyZWFtIGZyb20gWyIKKyAgICAgICAgICArIHhtbEZpbGUgKyAiXTogcmV0dXJuaW5nIG51bGwgZG9jdW1lbnQgcm9vdCIpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoeG1sSW5wdXRTdHJlYW0pOworCisgICAgdHJ5IHsKKyAgICAgIGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cud2FybmluZygiVW5hYmxlIHRvIHBhcnNlIHhtbCBmaWxlIFsiICsgeG1sRmlsZSArICJdLiIgKyAiUmVhc29uIGlzIFsiCisgICAgICAgICAgKyBlICsgIl0iKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiBkb2N1bWVudDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9yZXNvdXJjZXMvcGdlLWNvbmZpZy1leGFtcGxlLnhtbCBiLzAuMTAvcGNzL2lucHV0L3NyYy9tYWluL3Jlc291cmNlcy9wZ2UtY29uZmlnLWV4YW1wbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDY5M2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9yZXNvdXJjZXMvcGdlLWNvbmZpZy1leGFtcGxlLnhtbApAQCAtMCwwICsxLDkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzwhLS0gQ29uZmlndXJhdGlvbiBmaWxlIGZvciBydW5uaW5nIFBHRSBUZXN0IC0tPgorPCEtLSBDcmVhdGVkIGJ5IG1hdHRtYW5uIC0tPgorPCEtLSBDcmVhdGVkIG9uIE5vdmVtYmVyIDExLCAyMDA1IGF0IDA5OjIyOjAwIC0tPgorPCEtLSBHRFMgQnVpbGQgbi5tbS5wcCAtLT4KKzwhLS0gVGVzdCBuYW1lOiB0ZXN0UEdFQ29uZmlnRmlsZVJlYWRlciAtLT4KKworPGlucHV0PgorICAgPGdyb3VwIG5hbWU9IlBHRU5hbWVHcm91cCI+CisgICAgIDxzY2FsYXIgbmFtZT0iUEdFTmFtZSI+VGVzdCBQR0U8L3NjYWxhcj4KKyAgIDwvZ3JvdXA+CisgICAKKyAgIDxncm91cCBuYW1lPSJJbnB1dFByb2R1Y3RGaWxlcyI+CisgICAgIDxzY2FsYXIgbmFtZT0iVkNJRDE3U3RyZWFtIj4vZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV92Y2lkMTdfbWNmMjAwOTAxMDUxMjM0b3BzLmhkZjwvc2NhbGFyPgorICAgICA8c2NhbGFyIG5hbWU9IlZDSUQzMlN0cmVhbSI+L2RhdGEvbzA0NTIxLzEwL29jb18xMF8yMDAwOTA1MDNfbzA0NTIxX3AxMjVfdmNpZDMyX21jZjIwMDkwMTA1MTIzNG9wcy5oZGY8L3NjYWxhcj4KKyAgICAgPHNjYWxhciBuYW1lPSJWQ0lEMzNTdHJlYW0iPi9kYXRhL28wNDUyMS8xMC9vY29fMTBfMjAwMDkwNTAzX28wNDUyMV9wMTI1X3ZjaWQzM19tY2YyMDA5MDEwNTEyMzRvcHMuaGRmPC9zY2FsYXI+CisgICAgIDxzY2FsYXIgbmFtZT0iVkNJRDM0U3RyZWFtIj4vZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV92Y2lkMzRfbWNmMjAwOTAxMDUxMjM0b3BzLmhkZjwvc2NhbGFyPgorICAgPC9ncm91cD4KKworICAgPGdyb3VwIG5hbWU9IlN0YXRpY0ZpbGVJZGVudGlmaWNhdGlvbkZpbGVzIj4KKyAgICAgPHNjYWxhciBuYW1lPSJTRklGMTJTdHJlYW0iPi9kYXRhL28wNDUyMS8xMC9vY29fMTBfMjAwMDkwNTAzX28wNDUyMV9wMTI1X3NmaWYxMl9tY2YyMDA5MDEwNTEyMzRvcHMuaGRmPC9zY2FsYXI+CisgICAgIDxzY2FsYXIgbmFtZT0iU0ZJRjM0U3RyZWFtIj4vZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV9zZmlmMzRfbWNmMjAwOTAxMDUxMjM0b3BzLmhkZjwvc2NhbGFyPgorICAgPC9ncm91cD4KKyAgIAorICAgPGdyb3VwIG5hbWU9IkR5bmFtaWNBdXhpbGlhcnlJbnB1dEZpbGVzIj4KKyAgICAgPHNjYWxhciBuYW1lPSJBdXhTdHJlYW0xIj4vZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV9hdXgxX21jZjIwMDkwMTA1MTIzNG9wcy5hdXg8L3NjYWxhcj4KKyAgIDwvZ3JvdXA+CisgICAKKyAgIDxncm91cCBuYW1lPSJSZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXMiPgorICAgICAgPHNjYWxhciBuYW1lPSJSZWNBdXhTdHJlYW0xIj4vZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV9yYXV4MV9tY2YyMDA5MDEwNTEyMzRvcHMucmF1eDwvc2NhbGFyPgorICAgPC9ncm91cD4KKyAgIAorICAgPGdyb3VwIG5hbWU9IlByb2R1Y3RQYXRoR3JvdXAiPgorICAgICAgPHNjYWxhciBuYW1lPSJQcm9kdWN0UGF0aCI+L2RhdGE8L3NjYWxhcj4KKyAgIDwvZ3JvdXA+CisgICAKKyAgIDxncm91cCBuYW1lPSJNb25pdG9yR3JvdXAiPgorICAgICAgPHNjYWxhciBuYW1lPSJNb25pdG9yUGF0aCI+L2RhdGEvbW9uaXRvcjwvc2NhbGFyPgorICAgICAgPHNjYWxhciBuYW1lPSJNb25pdG9yRmlsZW5hbWVGb3JtYXQiPi5tb25pdG9yPC9zY2FsYXI+CisgICA8L2dyb3VwPgorCisgICA8Z3JvdXAgbmFtZT0iTW9uaXRvckxldmVsIj4KKyAgICAgIDxzY2FsYXIgbmFtZT0iTW9uSU8iPkhpZ2g8L3NjYWxhcj4KKyAgICAgIDxzY2FsYXIgbmFtZT0iTW9uQWxnIj5PZmY8L3NjYWxhcj4KKyAgICAgIDxzY2FsYXIgbmFtZT0iTW9uQ29udHJvbCI+TWVkPC9zY2FsYXI+CisgICA8L2dyb3VwPgorICAgCisgICA8IS0tICBQR0UgU3BlY2lmaWMgSW5mbyAtLT4KKyAgIAorICAgPGdyb3VwIG5hbWU9Ik15UEdFSW5mbyI+CisgICAgIDxzY2FsYXIgbmFtZT0iVGVzdFNjYWxhcjEiPlNjYWxhcjE8L3NjYWxhcj4KKyAgICAgPHZlY3RvciBuYW1lPSJUZXN0VmVjdG9yMSI+CisgICAgICAgPGVsZW1lbnQ+MTA8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+dGVzdCBzdHJpbmc8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+NTUuNTwvZWxlbWVudD4KKyAgICAgICA8ZWxlbWVudD4vZGF0YS8xLzIvMy9maWxlLmZpbGU8L2VsZW1lbnQ+CisgICAgIDwvdmVjdG9yPgorICAgICAKKyAgICAgPG1hdHJpeCBuYW1lPSJUZXN0TWF0cml4MSI+CisgICAgICAgPHRyPgorICAgICAgICAgPHRkPjU1PC90ZD4KKyAgICAgICAgIDx0ZD4xMjwvdGQ+CisgICAgICAgICA8dGQ+MTwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgPHRkPjQ0PC90ZD4KKyAgICAgICAgIDx0ZD4zMzwvdGQ+CisgICAgICAgICA8dGQ+MTAwPC90ZD4KKyAgICAgICA8L3RyPiAgICAKKyAgICAgPC9tYXRyaXg+CisgICA8L2dyb3VwPgorICAgCisgICAKKzwvaW5wdXQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9pbnB1dC9zcmMvbWFpbi9yZXNvdXJjZXMvcGdlLWRhdGEtc2F4LWV4YW1wbGUueG1sIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vcmVzb3VyY2VzL3BnZS1kYXRhLXNheC1leGFtcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzBkNGMwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvaW5wdXQvc3JjL21haW4vcmVzb3VyY2VzL3BnZS1kYXRhLXNheC1leGFtcGxlLnhtbApAQCAtMCwwICsxLDI3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgcGdlZGF0YSBbCisKKzwhLS1kZWZpbmUgdGhlIGludGVybmFsIERURC0tPgorICA8IUVMRU1FTlQgcGdlZGF0YSAoc2NhbGFyKix2ZWN0b3IqLG1hdHJpeCopPgorICA8IUVMRU1FTlQgbWF0cml4ICh0cispPgorICA8IUVMRU1FTlQgdHIgKHRkKyk+CisgIDwhRUxFTUVOVCB0ZCAoI1BDREFUQSk+CisgIDwhRUxFTUVOVCBzY2FsYXIgKCNQQ0RBVEEpPgorICA8IUFUVExJU1Qgc2NhbGFyIG5hbWUgQ0RBVEEgJyc+CisgIDwhQVRUTElTVCBtYXRyaXggbmFtZSBDREFUQSAnJz4KKyAgPCFBVFRMSVNUIG1hdHJpeCByb3dzIENEQVRBICcnPgorICA8IUFUVExJU1QgbWF0cml4IGNvbHMgQ0RBVEEgJyc+CisgIDwhRUxFTUVOVCB2ZWN0b3IgKGVsZW1lbnQqKT4KKyAgPCFBVFRMSVNUIHZlY3RvciBuYW1lIENEQVRBICcnPgorICA8IUVMRU1FTlQgZWxlbWVudCAoI1BDREFUQSk+CisKKzwhLS1jbG9zZSB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbi0tPgorXT4KKworPHBnZWRhdGE+Cis8c2NhbGFyIG5hbWU9ImZvbyI+YmFyPC9zY2FsYXI+Cis8dmVjdG9yIG5hbWU9InNvbGFyX2RlZ3JhZF9zdGRkZXZfcGl4ZWxfc3Ryb25nX2NvMiI+Cis8ZWxlbWVudD43LjE1NjgyOTQwODMyMjUwMWUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD4xLjAwMTIzMDAzNDY5Nzk0NGUtMTc8L2VsZW1lbnQ+Cis8ZWxlbWVudD4yLjUxNjM0NTgxMDE4Mzc2NWUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjA5NDU5NjY3MzU1MDkyMWUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD4zLjI1NTAxNDk2MzkzMDUxMmUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjQ2Mjc3MjQ4Nzc0NjA0N2UtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD40Ljg1NTE2MDE0NjUzMzc0OGUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD45LjkzMzcyMTk4MzA3NTAzOGUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD42LjY5MDUwMjU4Nzk0NjA0NGUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD45LjE1MTkzMzcxOTc0NDE5MWUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4NTQ0NjgzOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MzA3OTEwMWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NTQ2NDY2N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3MzY3NTc1M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4Mjc4NDgwNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3MjE4Njk5NWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3MzM4NzEwNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3OTEwODEyNGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NzgyNjgyNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3MzkzMDcwOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NTIzMjQ1N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4NTI0NTMzOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MDA1MjYxMWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4NTQyMDMzZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc5OTA2NjI0ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjczNjA2NDY5ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc1NjEzOTIyZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjgzMTA2NDI2ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjg5Mzc5OTQ1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc2MDE0MzAzZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjY5NjA5MDllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzcxMzk1ODNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzQ5NjAwOTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODE1MzA3OTJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzUyMDA4NDdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODYxMTE3NThlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODY4NTgzNzZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODAxMDEyN2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MjM0MjQyMmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3ODg4MDE4MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MjA2MTc1N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3ODgzMzg4ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc1MTUyNDQxZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjgyMzk0ODg1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc0OTQxMTE3ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjg0MTQwMzc3ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjgzNjYwMzA1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjgyMDUwNzg4ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjg3OTM1MTE4ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjgzODQ1OTY3ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc2Mjk0MDg2ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc5ODA5NzI1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjc2NzkzMTc3ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjg3ODE3ODhlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODQxNjc0NTZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODA2OTgyNzNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODIwOTM1MzFlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2Njg1Njc5MTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODQ5MjEzMDVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2Nzg0NDI2NTllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODMyMDAxNzdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzQwNTk0MDNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzU1NTY3NTJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzI3MjE3NzdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODQzNTg3N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MTY4Mjk1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjcyMDA0NzcyZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjUuNjUwMDMyNjgzNDMxNDllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzI5MzUxNDllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzM0MzU3MTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2NzYwOTQxOTVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODQxMzk5OTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODU1OTMwNzJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NS42NTAwMzI2ODM2NDQwNGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3OTQyMjY4NmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NTY1NjE2M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4NDk4MzgxN2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NzUyNjU4NWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NTk1NjI3M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4Nzg5NDA5NmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3ODU1OTMyMmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MjkxNDkxMWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3OTk2NDM1MmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4NDc2NDM3OGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NDk2ODExOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MTYzNzc5N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MTk0NzIxNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3ODI1MTc2N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY5MDk5MTI0OGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY5MDIzNTMxM2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY4MDM1MTExOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY1MDAzMjY3NjE2ODMzOGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD41LjY0Nzc3MjEyMzM1NjUxNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NTA3MTk0MmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NzQ3MzI3MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NzYxMTkyNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NjQxOTk1OGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5OTQ5MDEyMmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MTQ1MzUwN2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NjE5OTkwMmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NjMxMzEzNWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MzU2MDE2M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NDE1NzUxZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDg3NDM4MDI3ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDkwMjMxNDg5ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDg3NjkzNjY2ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk3MTkyNjYzZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk1MzEwNzE3ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDg5MzczMzVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDA1MDgyNDRlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQyMzUwOTJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODc3NjU2NDFlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDI1NzMwMzdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTE3OTc5NzRlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTk3NzgyMDZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDA3NzAwMDZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQ2NjUzMDdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTE1OTcxNjdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODk3OTgzMTZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQ4NjAyNjJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTc5NzA5NGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NzEzMDIxN2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ4NjkwMjk3MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NTcyOTczNmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NjU5NTA1MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5OTEwMzMwNmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjUwMDcxNTgyMWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ4MzkzMzY1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDg0NjY5OTA2ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDkyMzAzNzMxZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk1NjA2NTczZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDkwMDQxNjQ2ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDkzMjA1NzdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTUxMjY3NTZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQxMzM3OTFlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDIwODU2MzJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDM1MDA0MDNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQ1ODkwMjRlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTgzNjg2NTVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDA1NTEwMTFlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTc2NDUxOTNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDAyOTE1NjNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDIzNzM5MTllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDkwNTQyNjFlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTM1NzEyMjZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQyODc5NzdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODAzNTY4NDVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTg2MjI0ODVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTI3OTUwNjhlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTM2MzU0NzJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTU3NDI3MTFlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTI4MDA4OTllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODY3NzY0MzJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTE2NjM3MjllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODc1Mzg0NzllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDU4NDE5NzRlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQ3MTIyNDRlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDc1NTMwNzZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTY0Nzk1MDdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODkxNzQwOTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDYyMTM2NzVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTI3NjQ4NTNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDM4MjY2MDZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTc0NTczNTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDAwNjg4MDNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTE0MjQ1MDZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTAxODQzNDllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTk1MTY1NTVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDgwOTI4OTNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTcxNDk2NjNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTAxNjIwNDJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTcxNTA1MjZlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTYzMjgzNzVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDg3NzI5NDllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTQ3ODg0MjRlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTU0MzUwNTVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0ODg3ODc1MTJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTYzNzUzNjNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTY3NDA5OThlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTIxNTg1MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ4OTA2NTU0NGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5Mjc4ODMxNmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MDg5NzkzMWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NDQwMDQzZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk4MjM4MDY1ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk0MjI2MDgyZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk3NTY3NjQ2ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDkzMTQxODU4ZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDg4MTMwNjhlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDE0NjI2NDJlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTcyOTg0OTdlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTIxOTg5NTNlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDM2MjE1NDVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDg4MzQzNjVlLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY0OTcxNjkwM2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NzY3Mzc0M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MjM2OTU1M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ4ODQwODA5OGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5NzA2MTg0MmUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MjA4ODQxOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjUwNTM3ODkyNGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjUwMDMyNDM3NGUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjUwNTg1ODk2MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ4MzU3OTg4MWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MjA0Nzk0OWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjUwMjgzMzYxZS0wNzwvZWxlbWVudD4KKzxlbGVtZW50PjQuMzc2NDk2NDk5MzE5NTllLTA3PC9lbGVtZW50PgorPGVsZW1lbnQ+NC4zNzY0OTY1MDM0NTEzOWUtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5OTAwNzg0M2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjM3NjQ5NjQ5MDM3OTM3N2UtMDc8L2VsZW1lbnQ+Cis8ZWxlbWVudD4xLjA2MTExNTg1Mzk1MTY5OGUtMTc8L2VsZW1lbnQ+Cis8ZWxlbWVudD4xLjA0NDQ0MTg0MDIwMTMwMmUtMTc8L2VsZW1lbnQ+Cis8ZWxlbWVudD40Ljk1NzM4NTI1NDQ2NTQzMWUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD40LjMyOTU3NDY0MjA1MzUwNmUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD43LjIzNTIzODg4NzMyMjE4OGUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD42Ljk3OTQzMzA2NDIzMDYxOGUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD4xLjEwMDg0MzQ1MzYzMzQ5NmUtMTc8L2VsZW1lbnQ+Cis8ZWxlbWVudD43LjUxOTkxNDU1NDI3MjM3N2UtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD40Ljg3NDQ5MDY1NDg5MTE1MmUtMTg8L2VsZW1lbnQ+Cis8ZWxlbWVudD4xLjcxNjU1ODMzMTY4MDM0MmUtMTg8L2VsZW1lbnQ+Cis8L3ZlY3Rvcj4KKzxtYXRyaXggbmFtZT0iZm9vbWF0cml4IiByb3dzPSIyIiBjb2xzPSIyIj4KKyA8dHI+CisgICA8dGQ+MTk0PC90ZD4KKyAgIDx0ZD4xOTI8L3RkPgorIDwvdHI+CisgPHRyPgorICAgPHRkPjE8L3RkPgorICAgPHRkPjIuMjwvdGQ+CisgPC90cj4KKzwvbWF0cml4PgorPC9wZ2VkYXRhPgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3MvaW5wdXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlUmVhZGVyVGVzdC5qYXZhIGIvMC4xMC9wY3MvaW5wdXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VDb25maWdGaWxlUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDQxZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVSZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3MuaW5wdXQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiA8cD4KKyAqIEEgVGVzdENhc2UgdG8gdGVzdCB0aGUgUEdFQ29uZmlnRmlsZVJlYWRlcgorICogPC9wPgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBHRUNvbmZpZ0ZpbGVSZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZmlnRmlsZSA9IG51bGw7CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgUEdFQ29uZmlnRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgUEdFQ29uZmlnRmlsZVJlYWRlcigpOworCisgICAgdHJ5IHsKKyAgICAgIGNvbmZpZ0ZpbGUgPSByZWFkZXIucmVhZCh0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgInBnZS1jb25maWctZXhhbXBsZS54bWwiKSk7CisgICAgfSBjYXRjaCAoUEdFQ29uZmlnRmlsZUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBHRU5hbWUoKSB7CisgICAgYXNzZXJ0RXF1YWxzKCJUaGUgUEdFIE5hbWU6ICIgKyBjb25maWdGaWxlLmdldFBnZU5hbWUoKS5nZXRWYWx1ZSgpCisgICAgICAgICsgIiBpcyBub3QgZXF1YWwgdG8gVGVzdFBHRSIsICJUZXN0IFBHRSIsIGNvbmZpZ0ZpbGUuZ2V0UGdlTmFtZSgpCisgICAgICAgIC5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFByb2R1Y3RGaWxlcygpIHsKKyAgICBQR0VHcm91cCBpbnB1dFByb2R1Y3RGaWxlcyA9IGNvbmZpZ0ZpbGUuZ2V0SW5wdXRQcm9kdWN0RmlsZXMoKTsKKworICAgIGFzc2VydEVxdWFscygiVGhlcmUgaXMgbm90IDQgaW5wdXQgcHJvZHVjdCBmaWxlcyEiLCA0LCBpbnB1dFByb2R1Y3RGaWxlcworICAgICAgICAuZ2V0TnVtU2NhbGFycygpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICJUaGUgVkNJRDE3U3RyZWFtIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUhIiwKKyAgICAgICAgIi9kYXRhL28wNDUyMS8xMC9vY29fMTBfMjAwMDkwNTAzX28wNDUyMV9wMTI1X3ZjaWQxN19tY2YyMDA5MDEwNTEyMzRvcHMuaGRmIiwKKyAgICAgICAgaW5wdXRQcm9kdWN0RmlsZXMuZ2V0U2NhbGFyKCJWQ0lEMTdTdHJlYW0iKS5nZXRWYWx1ZSgpKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgIlRoZSBWQ0lEMzRTdHJlYW0gZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSEiLAorICAgICAgICAiL2RhdGEvbzA0NTIxLzEwL29jb18xMF8yMDAwOTA1MDNfbzA0NTIxX3AxMjVfdmNpZDM0X21jZjIwMDkwMTA1MTIzNG9wcy5oZGYiLAorICAgICAgICBpbnB1dFByb2R1Y3RGaWxlcy5nZXRTY2FsYXIoIlZDSUQzNFN0cmVhbSIpLmdldFZhbHVlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNGSUZJbnB1dEZpbGVzKCkgeworICAgIFBHRUdyb3VwIHNmaWZGaWxlcyA9IGNvbmZpZ0ZpbGUuZ2V0U3RhdGljRmlsZUlkZW50aWZpY2F0aW9uRmlsZXMoKTsKKworICAgIGFzc2VydEVxdWFscygiVGhlcmUgaXMgbm90IDIgc2ZpZiBmaWxlcyEiLCAyLCBzZmlmRmlsZXMuZ2V0TnVtU2NhbGFycygpKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgIlRoZSBTRklGMzRTdHJlYW0gZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSEiLAorICAgICAgICAiL2RhdGEvbzA0NTIxLzEwL29jb18xMF8yMDAwOTA1MDNfbzA0NTIxX3AxMjVfc2ZpZjM0X21jZjIwMDkwMTA1MTIzNG9wcy5oZGYiLAorICAgICAgICBzZmlmRmlsZXMuZ2V0U2NhbGFyKCJTRklGMzRTdHJlYW0iKS5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQXV4RmlsZXMoKSB7CisgICAgUEdFR3JvdXAgZHluQXV4RmlsZXMgPSBjb25maWdGaWxlLmdldER5bmFtaWNBdXhpbGlhcnlJbnB1dEZpbGVzKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIlRoZXJlIGlzIG5vdCAxIGR5bmFtaWMgYXV4IGZpbGUhIiwgMSwgZHluQXV4RmlsZXMKKyAgICAgICAgLmdldE51bVNjYWxhcnMoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICJUaGUgQXV4U3RyZWFtMSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlISIsCisgICAgICAgICIvZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV9hdXgxX21jZjIwMDkwMTA1MTIzNG9wcy5hdXgiLAorICAgICAgICBkeW5BdXhGaWxlcy5nZXRTY2FsYXIoIkF1eFN0cmVhbTEiKS5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRlZEF1eEZpbGVzKCkgeworICAgIFBHRUdyb3VwIHJlY0F1eEZpbGVzID0gY29uZmlnRmlsZS5nZXRSZWNvcmRlZEF1eGlsaWFyeUlucHV0RmlsZXMoKTsKKworICAgIGFzc2VydEVxdWFscygiVGhlcmUgaXMgbm90IDEgcmVjb3JkZWQgYXV4IGZpbGUhIiwgMSwgcmVjQXV4RmlsZXMKKyAgICAgICAgLmdldE51bVNjYWxhcnMoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICJUaGUgUmVjQXV4U3RyZWFtMSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlISIsCisgICAgICAgICIvZGF0YS9vMDQ1MjEvMTAvb2NvXzEwXzIwMDA5MDUwM19vMDQ1MjFfcDEyNV9yYXV4MV9tY2YyMDA5MDEwNTEyMzRvcHMucmF1eCIsCisgICAgICAgIHJlY0F1eEZpbGVzLmdldFNjYWxhcigiUmVjQXV4U3RyZWFtMSIpLmdldFZhbHVlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3RQYXRoKCkgeworICAgIGFzc2VydEVxdWFscygiVGhlIHByb2R1Y3QgcGF0aDogIiArIGNvbmZpZ0ZpbGUuZ2V0UHJvZHVjdFBhdGgoKS5nZXRWYWx1ZSgpCisgICAgICAgICsgIiBpcyBub3QgZXF1YWwgdG8gL2RhdGEiLCAiL2RhdGEiLCBjb25maWdGaWxlLmdldFByb2R1Y3RQYXRoKCkKKyAgICAgICAgLmdldFZhbHVlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1vbml0b3JQYXRoKCkgeworICAgIGFzc2VydEVxdWFscygiVGhlIG1vbml0b3IgcGF0aDogIiArIGNvbmZpZ0ZpbGUuZ2V0TW9uaXRvclBhdGgoKS5nZXRWYWx1ZSgpCisgICAgICAgICsgIiBpcyBub3QgZXF1YWwgdG8gL2RhdGEvbW9uaXRvciIsICIvZGF0YS9tb25pdG9yIiwgY29uZmlnRmlsZQorICAgICAgICAuZ2V0TW9uaXRvclBhdGgoKS5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNb25pdG9yRmlsZW5hbWVGb3JtYXQoKSB7CisgICAgYXNzZXJ0RXF1YWxzKCJUaGUgbW9uaXRvciBmaWxlbmFtZSBmb3JtYXQ6ICIKKyAgICAgICAgKyBjb25maWdGaWxlLmdldE1vbml0b3JGaWxlbmFtZUZvcm1hdCgpLmdldFZhbHVlKCkKKyAgICAgICAgKyAiIGlzIG5vdCBlcXVhbCB0byAubW9uaXRvciIsICIubW9uaXRvciIsIGNvbmZpZ0ZpbGUKKyAgICAgICAgLmdldE1vbml0b3JGaWxlbmFtZUZvcm1hdCgpLmdldFZhbHVlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1vbml0b3JMZXZlbHMoKSB7CisgICAgYXNzZXJ0RXF1YWxzKCJUaGUgTW9uSU8gbGV2ZWwgd2FzIG5vdCBzZXQgdG8gSGlnaCEiLCAiSGlnaCIsIGNvbmZpZ0ZpbGUKKyAgICAgICAgLmdldE1vbml0b3JMZXZlbEdyb3VwKCkuZ2V0U2NhbGFyKCJNb25JTyIpLmdldFZhbHVlKCkpOworICAgIGFzc2VydEVxdWFscygiVGhlIE1vbkFsZyBsZXZlbCB3YXMgbm90IHNldCB0byBPZmYhIiwgIk9mZiIsIGNvbmZpZ0ZpbGUKKyAgICAgICAgLmdldE1vbml0b3JMZXZlbEdyb3VwKCkuZ2V0U2NhbGFyKCJNb25BbGciKS5nZXRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlRoZSBNb25Db250cm9sIGxldmVsIHdhcyBub3Qgc2V0IHRvIE1lZCEiLCAiTWVkIiwgY29uZmlnRmlsZQorICAgICAgICAuZ2V0TW9uaXRvckxldmVsR3JvdXAoKS5nZXRTY2FsYXIoIk1vbkNvbnRyb2wiKS5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQR0VTcGVjaWZpY0luZm8oKSB7CisKKyAgICBQR0VHcm91cCBwZ2VTcGVjaWZpYyA9IChQR0VHcm91cCkgY29uZmlnRmlsZS5nZXRQZ2VTcGVjaWZpY0dyb3VwcygpLmdldCgKKyAgICAgICAgIk15UEdFSW5mbyIpOworCisgICAgYXNzZXJ0Tm90TnVsbChwZ2VTcGVjaWZpYyk7CisKKyAgICAvLyB0ZXN0IHRoYXQgdGhlIHNjYWxhciBpcyByZWFkCisgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdGVzdCBzY2FsYXIgMSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUgb2YgU2NhbGFyMSIsCisgICAgICAgICJTY2FsYXIxIiwgcGdlU3BlY2lmaWMuZ2V0U2NhbGFyKCJUZXN0U2NhbGFyMSIpLmdldFZhbHVlKCkpOworCisgICAgLy8gdGVzdCB0aGF0IHRoZSB2ZWN0b3IgaXMgcmVhZAorICAgIFBHRVZlY3RvciB0ZXN0VmVjID0gcGdlU3BlY2lmaWMuZ2V0VmVjdG9yKCJUZXN0VmVjdG9yMSIpOworCisgICAgU3RyaW5nIHRlc3RWYWwgPSAiL2RhdGEvMS8yLzMvZmlsZS5maWxlIjsKKyAgICBib29sZWFuIGhhc1ZhbHVlID0gZmFsc2U7CisKKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0ZXN0VmVjLmdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBTdHJpbmcgZWxlbSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgaWYgKGVsZW0uZXF1YWxzKHRlc3RWYWwpKSB7CisgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnRUcnVlKCJUaGUgdmVjdG9yIFRlc3RWZWN0b3IxIGRvZXMgbm90IGhhdmUgdGhlIHZhbHVlICIgKyB0ZXN0VmFsCisgICAgICAgICsgIiEiLCBoYXNWYWx1ZSk7CisKKyAgICAvLyB0ZXN0IHRoYXQgdGhlIG1hdHJpeCB3YXMgcmVhZCByaWdodAorICAgIFBHRU1hdHJpeCB0ZXN0TWF0cml4ID0gcGdlU3BlY2lmaWMuZ2V0TWF0cml4KCJUZXN0TWF0cml4MSIpOworCisgICAgLy8gcm93IDEsIGNvbCAwIHNob3VsZCBiZSA0NAorICAgIGFzc2VydEVxdWFscygiVGhlIG1hdHJpeCB2YWx1ZSBpc24ndCA0NCEiLCA0NCwgSW50ZWdlcgorICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgdGVzdE1hdHJpeC5nZXRWYWx1ZSgxLCAwKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9pbnB1dC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVXcml0ZXJUZXN0LmphdmEgYi8wLjEwL3Bjcy9pbnB1dC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRUNvbmZpZ0ZpbGVXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzMjdhOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL2lucHV0L3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9wY3MvaW5wdXQvUEdFQ29uZmlnRmlsZVdyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiA8cD4KKyAqIEEgVGVzdGNhc2UgZm9yIHRoZSBQR0VDb25maWdGaWxlV3JpdGVyLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBHRUNvbmZpZ0ZpbGVXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgUEdFQ29uZmlndXJhdGlvbkZpbGUgY29uZmlnRmlsZSA9IG51bGw7CisKKyAgcHJpdmF0ZSBQR0VDb25maWdGaWxlV3JpdGVyIGNvbmZpZ0ZpbGVXcml0ZXIgPSBudWxsOworCisgIC8qKgorICAgICAqIAorICAgICAqLworICBwdWJsaWMgUEdFQ29uZmlnRmlsZVdyaXRlclRlc3QoKSB7CisgICAgY29uZmlnRmlsZSA9IG5ldyBQR0VDb25maWd1cmF0aW9uRmlsZSgpOworICAgIGNvbmZpZ0ZpbGVXcml0ZXIgPSBuZXcgUEdFQ29uZmlnRmlsZVdyaXRlcihjb25maWdGaWxlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVJlYWQoKSB7CisgICAgY29uZmlnRmlsZS5zZXRQZ2VOYW1lKG5ldyBQR0VTY2FsYXIoIlBHRU5hbWUiLCAiZnRzX3NsaWNlaXBwIikpOworCisgICAgRG9jdW1lbnQgY29uZmlnRmlsZURvYyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29uZmlnRmlsZURvYyA9IGNvbmZpZ0ZpbGVXcml0ZXIuZ2V0Q29uZmlnRmlsZVhtbCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKGNvbmZpZ0ZpbGVEb2MsIG91dCk7CisKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgUEdFQ29uZmlnRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgUEdFQ29uZmlnRmlsZVJlYWRlcigpOworCisgICAgUEdFQ29uZmlndXJhdGlvbkZpbGUgcmVhZENvbmZpZ0ZpbGUgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHJlYWRDb25maWdGaWxlID0gcmVhZGVyLnJlYWQoaW4pOworICAgIH0gY2F0Y2ggKFBHRUNvbmZpZ0ZpbGVFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0Tm90TnVsbChyZWFkQ29uZmlnRmlsZSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmdHNfc2xpY2VpcHAiLCByZWFkQ29uZmlnRmlsZS5nZXRQZ2VOYW1lKCkuZ2V0VmFsdWUoKSk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9pbnB1dC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQvcGNzL2lucHV0L1BHRURhdGFIYW5kbGVyVGVzdC5qYXZhIGIvMC4xMC9wY3MvaW5wdXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VEYXRhSGFuZGxlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA0YmUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3MvaW5wdXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L3Bjcy9pbnB1dC9QR0VEYXRhSGFuZGxlclRlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLmlucHV0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogPHA+CisgKiBUZXN0IHN1aXRlIGZvciB0aGUge0BsaW5rIFBHRURhdGFIYW5kbGVyfQorICogPC9wPgorICogLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBHRURhdGFIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdEZpbGVQYXRoID0gIi4vc3JjL21haW4vcmVzb3VyY2VzL3BnZS1kYXRhLXNheC1leGFtcGxlLnhtbCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkVmVjVmFsU2l4dGhFbGVtZW50ID0gIjUuNDYyNzcyNDg3NzQ2MDQ3ZS0xOCI7CisKKyAgcHVibGljIHZvaWQgdGVzdEdldFNjYWxhcnMoKSB7CisgICAgUEdFRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBQR0VEYXRhSGFuZGxlcigpOworICAgIGRvUGFyc2UoaGFuZGxlcik7CisgICAgYXNzZXJ0Tm90TnVsbChoYW5kbGVyLmdldFNjYWxhcnMoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChoYW5kbGVyLmdldFNjYWxhcnMoKS5rZXlTZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGhhbmRsZXIuZ2V0U2NhbGFycygpLmtleVNldCgpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZShoYW5kbGVyLmdldFNjYWxhcnMoKS5jb250YWluc0tleSgiZm9vIikpOworICAgIGFzc2VydE5vdE51bGwoaGFuZGxlci5nZXRTY2FsYXJzKCkuZW50cnlTZXQoKSk7CisgICAgUEdFU2NhbGFyIHNjYWxhciA9IChQR0VTY2FsYXIpIGhhbmRsZXIuZ2V0U2NhbGFycygpLmdldCgiZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBzY2FsYXIuZ2V0VmFsdWUoKSk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRNYXRyaWNlcygpIHsKKyAgICBQR0VEYXRhSGFuZGxlciBoYW5kbGVyID0gbmV3IFBHRURhdGFIYW5kbGVyKCk7CisgICAgZG9QYXJzZShoYW5kbGVyKTsKKyAgICBhc3NlcnROb3ROdWxsKGhhbmRsZXIuZ2V0TWF0cmljZXMoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChoYW5kbGVyLmdldE1hdHJpY2VzKCkua2V5U2V0KCkpOworICAgIGFzc2VydEVxdWFscygxLCBoYW5kbGVyLmdldE1hdHJpY2VzKCkua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRUcnVlKGhhbmRsZXIuZ2V0TWF0cmljZXMoKS5jb250YWluc0tleSgiZm9vbWF0cml4IikpOworICAgIFBHRU1hdHJpeCBtYXRyaXggPSAoUEdFTWF0cml4KSBoYW5kbGVyLmdldE1hdHJpY2VzKCkuZ2V0KCJmb29tYXRyaXgiKTsKKyAgICBhc3NlcnROb3ROdWxsKG1hdHJpeCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1hdHJpeC5nZXROdW1Db2xzKCkpOworICAgIGFzc2VydEVxdWFscygyLCBtYXRyaXguZ2V0Um93cygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIxOTQiLCBtYXRyaXguZ2V0VmFsdWUoMCwgMCkpOworICAgIGFzc2VydEVxdWFscygiMi4yIiwgbWF0cml4LmdldFZhbHVlKDEsIDEpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRWZWN0b3JzKCkgeworICAgIFBHRURhdGFIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUEdFRGF0YUhhbmRsZXIoKTsKKyAgICBkb1BhcnNlKGhhbmRsZXIpOworICAgIGFzc2VydE5vdE51bGwoaGFuZGxlci5nZXRWZWN0b3JzKCkpOworICAgIGFzc2VydE5vdE51bGwoaGFuZGxlci5nZXRWZWN0b3JzKCkua2V5U2V0KCkpOworICAgIGFzc2VydEVxdWFscygxLCBoYW5kbGVyLmdldFZlY3RvcnMoKS5rZXlTZXQoKS5zaXplKCkpOworICAgIGFzc2VydFRydWUoaGFuZGxlci5nZXRWZWN0b3JzKCkuY29udGFpbnNLZXkoCisgICAgICAgICJzb2xhcl9kZWdyYWRfc3RkZGV2X3BpeGVsX3N0cm9uZ19jbzIiKSk7CisgICAgUEdFVmVjdG9yIHZlYyA9IChQR0VWZWN0b3IpIGhhbmRsZXIuZ2V0VmVjdG9ycygpLmdldCgKKyAgICAgICAgInNvbGFyX2RlZ3JhZF9zdGRkZXZfcGl4ZWxfc3Ryb25nX2NvMiIpOworICAgIGFzc2VydE5vdE51bGwodmVjKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWZWNWYWxTaXh0aEVsZW1lbnQsIHZlYy5nZXRFbGVtZW50cygpLmdldCg1KSk7CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkb1BhcnNlKFBHRURhdGFIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgdHJ5IHsKKyAgICAgIC8vIFBhcnNlIHRoZSBpbnB1dAorICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisgICAgICBzYXhQYXJzZXIucGFyc2UobmV3IEZpbGUodGVzdEZpbGVQYXRoKSwgaGFuZGxlcik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKCJleGNlcHRpb24gcmVhZGluZyBkYXRhIG91dCBvZjogWyIgKyB0ZXN0RmlsZVBhdGggKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3BvbS54bWwgYi8wLjEwL3Bjcy9vcHN1aS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjMDI2YWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9wb20ueG1sCkBAIC0wLDAgKzEsMjIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCQorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8YXJ0aWZhY3RJZD5wY3Mtb3BzdWk8L2FydGlmYWN0SWQ+CisJPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKwk8cGFyZW50PgorICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCTxuYW1lPlByb2Nlc3MgQ29udHJvbCBTeXN0ZW0gT3BlcmF0b3IgSW50ZXJmYWNlIFdlYmFwcDwvbmFtZT4KKwk8cHJvcGVydGllcz4KKwkJPHdpY2tldC52ZXJzaW9uPjEuNC4xNzwvd2lja2V0LnZlcnNpb24+CisJCTxqZXR0eS52ZXJzaW9uPjYuMS4yNTwvamV0dHkudmVyc2lvbj4KKwkJPHNsZjRqLnZlcnNpb24+MS41Ljg8L3NsZjRqLnZlcnNpb24+CisJCTxsb2c0ai52ZXJzaW9uPjEuMi4xNDwvbG9nNGoudmVyc2lvbj4KKwk8L3Byb3BlcnRpZXM+CisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLndpY2tldDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPndpY2tldDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7d2lja2V0LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53aWNrZXQ8L2dyb3VwSWQ+CisJCSAgICA8YXJ0aWZhY3RJZD53aWNrZXQtZXh0ZW5zaW9uczwvYXJ0aWZhY3RJZD4KKwkJICAgIDx2ZXJzaW9uPiR7d2lja2V0LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJICA8YXJ0aWZhY3RJZD5vb2R0LXdlYmFwcC1jb21wb25lbnRzPC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisJCSAgPGV4Y2x1c2lvbnM+CisJCSAgICA8ZXhjbHVzaW9uPgorCQkgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKwkJICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgICAgPC9leGNsdXNpb24+CisJCSAgICA8ZXhjbHVzaW9uPgorCQkgICAgICA8YXJ0aWZhY3RJZD5jYXMtd29ya2Zsb3c8L2FydGlmYWN0SWQ+CisJCSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJICAgIDwvZXhjbHVzaW9uPgorCQkgIDwvZXhjbHVzaW9ucz4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKwkJICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCSAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgIDxhcnRpZmFjdElkPmNhcy1wcm9kdWN0PC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisJCSAgPHR5cGU+d2FyPC90eXBlPgorCQk8L2RlcGVuZGVuY3k+CisJICAgIDxkZXBlbmRlbmN5PgorCSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkgICAgICA8YXJ0aWZhY3RJZD5jdXJhdG9yLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorCSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisJICAgICAgPHR5cGU+d2FyPC90eXBlPgorCSAgICA8L2RlcGVuZGVuY3k+CQkKKwkJPGRlcGVuZGVuY3k+CisJCSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgIDxhcnRpZmFjdElkPnBjcy1jb3JlPC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIExPR0dJTkcgREVQRU5ERU5DSUVTIC0gTE9HNEogLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7c2xmNGoudmVyc2lvbn08L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4yLjE0PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSAgSlVOSVQgREVQRU5ERU5DWSBGT1IgVEVTVElORyAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+NC44LjE8L3ZlcnNpb24+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tICBKRVRUWSBERVBFTkRFTkNJRVMgRk9SIFRFU1RJTkcgIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amV0dHk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amV0dHktdXRpbDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZXR0eS1tYW5hZ2VtZW50PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwk8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgPHByb2ZpbGVzPgorICAgICAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1VbmFwcHJvdmVkTGljZW5zZXM+MTwvbnVtVW5hcHByb3ZlZExpY2Vuc2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPC9wcm9maWxlcz4KKwk8YnVpbGQ+CisJCTxyZXNvdXJjZXM+CisJCQk8cmVzb3VyY2U+CisJCQkJPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorCQkJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisJCQk8L3Jlc291cmNlPgorCQkJPHJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKwkJCQk8aW5jbHVkZXM+CisJCQkJCTxpbmNsdWRlPioqPC9pbmNsdWRlPgorCQkJCTwvaW5jbHVkZXM+CisJCQkJPGV4Y2x1ZGVzPgorCQkJCQk8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisJCQkJPC9leGNsdWRlcz4KKwkJCTwvcmVzb3VyY2U+CisJCTwvcmVzb3VyY2VzPgorCQk8dGVzdFJlc291cmNlcz4KKwkJCTx0ZXN0UmVzb3VyY2U+CisJCQkJPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorCQkJCTxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvZGlyZWN0b3J5PgorCQkJCTxpbmNsdWRlcz4KKwkJCQkJPGluY2x1ZGU+Kio8L2luY2x1ZGU+CisJCQkJPC9pbmNsdWRlcz4KKwkJCQk8ZXhjbHVkZXM+CisJCQkJCTxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KKwkJCQk8L2V4Y2x1ZGVzPgorCQkJPC90ZXN0UmVzb3VyY2U+CisJCTwvdGVzdFJlc291cmNlcz4KKwkJPHBsdWdpbnM+CisJCQk8cGx1Z2luPgorCQkJCTxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxzb3VyY2U+MS41PC9zb3VyY2U+CisJCQkJCTx0YXJnZXQ+MS41PC90YXJnZXQ+CisJCQkJCTxvcHRpbWl6ZT50cnVlPC9vcHRpbWl6ZT4KKwkJCQkJPGRlYnVnPnRydWU8L2RlYnVnPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWNhdDctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisJCSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorCQkgICAgICAgICAgICAgICAgPHBvcnQ+ODE4MTwvcG9ydD4KKwkJICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorCQkgICAgICAgICAgICAgICAgICAgIDxDQVRBTElOQV9PUFRTPi1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSAtRGZpbGUuZW5jb2Rpbmc9VVRGLTgKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlcnZlciAtWG1zMTUzNm0gLVhteDE1MzZtCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDpOZXdTaXplPTI1Nm0gLVhYOk1heE5ld1NpemU9MjU2bSAtWFg6UGVybVNpemU9MjU2bQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6TWF4UGVybVNpemU9NTEybSAtWFg6K0Rpc2FibGVFeHBsaWNpdEdDCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDorVXNlQ29uY01hcmtTd2VlcEdDCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDorQ01TSW5jcmVtZW50YWxNb2RlCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDorQ01TSW5jcmVtZW50YWxQYWNpbmcKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOkNNU0luY3JlbWVudGFsRHV0eUN5Y2xlTWluPTAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOi1UcmFjZUNsYXNzVW5sb2FkaW5nCisJCSAgICAgICAgICAgICAgICAgICAgPC9DQVRBTElOQV9PUFRTPgorCQkgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorCQkgICAgICAgICAgICAgICAgPGNvbnRleHRGaWxlPiR7YmFzZWRpcn0vc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sPC9jb250ZXh0RmlsZT4KKwkJICAgICAgICAgICAgICAgIDxwYXRoPi8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfTwvcGF0aD4gIAorCQkgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAKKyAgICAgICAgICAgIDwvcGx1Z2luPiAgICAKKyAgICAgICAgPC9wbHVnaW5zPgkKKyAgICA8L2J1aWxkPgorCTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2guanMgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNGQxMjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmpzCkBAIC0wLDAgKzEsNjM5IEBACisvKgorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIEZpbGUgVHJlZQorCit2YXIgX3N0YWdpbmcgPSAnLyc7CS8vIGN1cnJlbnQgcm9vdCBwYXRoIGluIHN0YWdpbmcgYXJlYSBicm93c2VyCit2YXIgX2NhdGFsb2cgPSAnLyc7CS8vIGN1cnJlbnQgcm9vdCBwYXRoIGluIGNhdGFsb2cgYnJvd3NlcgordmFyIF9wYXRocyAgID0geyAic3RhZ2luZyIgOiAgJy8nLCAKKyAgICAgICAgICAgICAgICAgImNhdGFsb2ciIDogICcvJywKKyAgICAgICAgICAgICAgICAgImN1cnJlbnRTdGFnZWRGaWxlIiA6ICcnLAorICAgICAgICAgICAgICAgICAiY3VycmVudENhdGFsb2dlZEZpbGUiIDogJycsCisgICAgICAgICAgICAgICAgICJjdXJyZW50UHJvZHVjdFR5cGUiIDogJyd9CisKK2lmKGpRdWVyeSkgKGZ1bmN0aW9uKCQpeworCQorCSQuZXh0ZW5kKCQuZm4sIHsKKwkJZmlsZVRyZWU6IGZ1bmN0aW9uKG8sIGgsIGkpIHsKKwkJCS8vIERlZmF1bHRzCisJCQlpZiggIW8gKSB2YXIgbyA9IHt9OworCQkJaWYoIG8ucm9vdCA9PSB1bmRlZmluZWQgKSBvLnJvb3QgPSAnLyc7CisJCQlpZiggby5mb2xkZXJFdmVudCA9PSB1bmRlZmluZWQgKSBvLmZvbGRlckV2ZW50ID0gJ2RibGNsaWNrJzsKKwkJCWlmKCBvLmV4cGFuZFNwZWVkID09IHVuZGVmaW5lZCApIG8uZXhwYW5kU3BlZWQ9IDUwMDsKKwkJCWlmKCBvLmNvbGxhcHNlU3BlZWQgPT0gdW5kZWZpbmVkICkgby5jb2xsYXBzZVNwZWVkPSA1MDA7CisJCQlpZiggby5leHBhbmRFYXNpbmcgPT0gdW5kZWZpbmVkICkgby5leHBhbmRFYXNpbmcgPSBudWxsOworCQkJaWYoIG8uY29sbGFwc2VFYXNpbmcgPT0gdW5kZWZpbmVkICkgby5jb2xsYXBzZUVhc2luZyA9IG51bGw7CisJCQlpZiggby5tdWx0aUZvbGRlciA9PSB1bmRlZmluZWQgKSBvLm11bHRpRm9sZGVyID0gdHJ1ZTsKKwkJCWlmKCBvLmxvYWRNZXNzYWdlID09IHVuZGVmaW5lZCApIG8ubG9hZE1lc3NhZ2UgPSAnTG9hZGluZy4uLic7CisJCQkKKwkJCS8vIFVuZGVyc3RhbmQgd2hpY2ggb2YgdGhlIHR3byBicm93c2VycyB0byBhcHBseSBuYXYgYWN0aW9ucyB0bworCQkJaWYgKG8ud2hpY2ggPT0gdW5kZWZpbmVkKSB7IGFsZXJ0KCdwbGVhc2Ugc3BlY2lmeSBcJ3doaWNoXCcgKG9wdGlvbnMgYXJlOiAic3RhZ2luZyJ8ImNhdGFsb2ciKSAnKTsgby53aGljaCA9ICJzdGFnaW5nIjt9CisJCQkKKwkJCS8vIEVuc3VyZSBhIHNjcmlwdCBoYXMgYmVlbiBwcm92aWRlZAorCQkJaWYgKG8uc2NyaXB0ID09IHVuZGVmaW5lZCkgeyBhbGVydCgncGxlYXNlIHNwZWNpZnkgYSB0YXJnZXQgc2NyaXB0IFwnc2NyaXB0XCcgaW4gZmlsZVRyZWUgb3B0aW9ucycpOyB9CisJCQkKKwkJCS8vIEdldCBhIGhhbmRsZSB0byB0aGUgb3V0ZXIgVUwKKwkJCW8ub3V0ZXJDb250YWluZXIgPSAnIycgKyAkKHRoaXMpLmF0dHIoJ2lkJyk7CisJCQlpZiAoby5vdXRlckNvbnRhaW5lciA9PSB1bmRlZmluZWQpIHsgYWxlcnQoJ2NvbnRhaW5lciBtdXN0IGhhdmUgdW5pcXVlIGlkJykgfTsKKwkJCQorCQkJJCh0aGlzKS5lYWNoKCBmdW5jdGlvbigpIHsKKwkJCQkKKwkJCQlmdW5jdGlvbiBzaG93VHJlZShjLCB0KSB7CisJCQkJCSQoYykuYWRkQ2xhc3MoJ3dhaXQnKTsKKwkJCQkJJCgiLmZpbGVUcmVlLnN0YXJ0IikucmVtb3ZlKCk7CisJCQkJCSQuZ2V0KG8uc2NyaXB0LCB7IHBhdGg6IHQgfSwgZnVuY3Rpb24oZGF0YSkgeworCQkJCQkJJChjKS5maW5kKCcuc3RhcnQnKS5odG1sKCcnKTsKKwkJCQkJCSQoYykucmVtb3ZlQ2xhc3MoJ3dhaXQnKS5odG1sKGRhdGEpOworCQkJCQkJaWYgKG8ud2hpY2ggPT0gInN0YWdpbmciKQorCQkJCQkJCV9wYXRocy5zdGFnaW5nID0gZXNjYXBlKHQpOworCQkJCQkJZWxzZQorCQkJCQkJCV9wYXRocy5jYXRhbG9nID0gZXNjYXBlKHQpOworCQkJCQkJYmluZFRyZWUoYyk7CisJCQkJCQl1cGRhdGVOYXYoby53aGljaCk7CisJCQkJCQljbGVhck1ldGFkYXRhV29ya2JlbmNoQ29udGVudChvLndoaWNoKTsKKwkJCQkJCWluaXREcmFnZ2FibGVzKCk7CisJCQkJCX0pOworCQkJCX0KKwkJCQkKKwkJCQlmdW5jdGlvbiBiaW5kVHJlZSh0KSB7CisJCQkJCSQoby5vdXRlckNvbnRhaW5lcikuZmluZCgnVUwgTEkgQScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CisJCQkJCQlpZiAoJCh0aGlzKS5wYXJlbnQoKS5oYXNDbGFzcygncHJvZHVjdFR5cGUnKSkgeworCQkJCQkJCWkoJCh0aGlzKS5hdHRyKCdyZWwnKSk7CisJCQkJCQl9IGVsc2UgaWYgKCQodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoJ2ZpbGUnKSkgeworCQkJCQkJCWgoJCh0aGlzKS5hdHRyKCdyZWwnKSk7CisJCQkJCQl9CisJCQkJCX0pLmJpbmQoJ2RibGNsaWNrJywgZnVuY3Rpb24oKSB7CisJCQkJCQlpZiAoJCh0aGlzKS5wYXJlbnQoKS5oYXNDbGFzcygnZGlyZWN0b3J5JykgKSB7CisJCQkJCQkJJCh0aGlzKS5wYXJlbnQoKS5maW5kKCdVTCcpLnJlbW92ZSgpOyAvLyBjbGVhbnVwCisJCQkJCQkJc2hvd1RyZWUoICQoby5vdXRlckNvbnRhaW5lciksIGVzY2FwZSgkKHRoaXMpLmF0dHIoJ3JlbCcpKSApOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQkJCisJCQkJCS8vIFByZXZlbnQgQSBmcm9tIHRyaWdnZXJpbmcgdGhlICMgb24gbm9uLWNsaWNrIGV2ZW50cworCQkJCQlpZiggby5mb2xkZXJFdmVudC50b0xvd2VyQ2FzZSAhPSAnY2xpY2snICkgJCh0KS5maW5kKCdMSSBBJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9KTsKKwkJCQl9CisJCQkJCisJCQkJLy8gTG9hZGluZyBtZXNzYWdlCisJCQkJJCh0aGlzKS5odG1sKCc8dWwgY2xhc3M9ImZpbGVUcmVlIHN0YXJ0Ij48bGkgY2xhc3M9IndhaXQiPicgKyBvLmxvYWRNZXNzYWdlICsgJzxsaT48L3VsPicpOworCQkJCQorCQkJCS8vIEdldCB0aGUgaW5pdGlhbCBmaWxlIGxpc3QKKwkJCQlzaG93VHJlZSggJCh0aGlzKSwgZXNjYXBlKChvLndoaWNoID09ICJzdGFnaW5nIiApID8gX3BhdGhzLnN0YWdpbmcgOiBfcGF0aHMuY2F0YWxvZykgKTsKKwkJCX0pOworCQl9CisJfSk7Cit9KShqUXVlcnkpOworCisvLyBNZXRhZGF0YSBlZGl0b3JzCitmdW5jdGlvbiBtYWtlU3RhZ2VkTWV0YWRhdGFFZGl0YWJsZSgpIHsKKwltYWtlTWV0YWRhdGFFZGl0YWJsZSgKKwkJJCgiI3N0YWdlZE1ldGFkYXRhV29ya2JlbmNoQ29udGVudCA+IHRhYmxlID4gdGJvZHkgPiB0ciA+ICB0ZCIpLAorCQl1cGRhdGVTdGFnZWRNZXRhZGF0YSk7Cit9CisKK2Z1bmN0aW9uIG1ha2VQcm9kdWN0TWV0YWRhdGFFZGl0YWJsZSgpIHsKKwltYWtlTWV0YWRhdGFFZGl0YWJsZSgKKwkJJCgiI2NhdGFsb2dNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQgPiB0YWJsZSA+IHRib2R5ID4gdHIgPiB0ZCIpLAorCQl1cGRhdGVQcm9kdWN0TWV0YWRhdGEpOwkJCit9CisKK2Z1bmN0aW9uIG1ha2VQcm9kdWN0VHlwZU1ldGFkYXRhRWRpdGFibGUoKSB7CisJbWFrZU1ldGFkYXRhRWRpdGFibGUoCisJCSQoIiNsaXZlUHJvZHVjdFR5cGVXb3JrYmVuY2hDb250ZW50cyBkaXYucHR3Yk1ldGFkYXRhTGlzdCA+IHRhYmxlID4gdGJvZHkgPiB0ciA+IHRkIiksCisJCXVwZGF0ZVByb2R1Y3RUeXBlTWV0YWRhdGEpOworfQorCitmdW5jdGlvbiB1cGRhdGVTdGFnZWRNZXRhZGF0YSgpIHsKKwkvLyBEYXRhIGlzIHRoZSBjb2xsZWN0aW9uIG9mIDx0ci8+IGVsZW1lbnRzIHRoYXQgY29udGFpbiBtZXRhZGF0YSBrZXkvdmFsdWUgcGFpcnMKKwl2YXIgZGF0YSA9IGdldE1ldGFkYXRhRnJvbVNvdXJjZSgkKCcjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50ID4gdGFibGUgPiB0Ym9keSA+IHRyJykpOworCXZhciBxc3RyID0gZ2V0UXVlcnlTdHJpbmdGcm9tTWV0YWRhdGEoX3BhdGhzLmN1cnJlbnRTdGFnZWRGaWxlLCBkYXRhKTsKKwkKKwkkLnBvc3QoJy4uL3NlcnZpY2VzL21ldGFkYXRhL3N0YWdpbmcnLAorCQlxc3RyLAorCQlmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzKSB7CisJCQkvLyBhbGVydChkYXRhKTsKKwkJfQorCSk7Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVByb2R1Y3RNZXRhZGF0YSgpIHsKKwkvLyBEYXRhIGlzIHRoZSBjb2xsZWN0aW9uIG9mIDx0ci8+IGVsZW1lbnRzIHRoYXQgY29udGFpbiBtZXRhZGF0YSBrZXkvdmFsdWUgcGFpcnMKKwl2YXIgZGF0YSA9IGdldE1ldGFkYXRhRnJvbVNvdXJjZSgkKCcjY2F0YWxvZ01ldGFkYXRhV29ya2JlbmNoQ29udGVudCA+IHRhYmxlID4gdGJvZHkgPiB0cicpKTsKKwl2YXIgcXN0ciA9IGdldFF1ZXJ5U3RyaW5nRnJvbU1ldGFkYXRhKF9wYXRocy5jdXJyZW50Q2F0YWxvZ2VkRmlsZSwgZGF0YSk7CisKKwkkLnBvc3QoJy4uL3NlcnZpY2VzL21ldGFkYXRhL2NhdGFsb2cnLAorCQlxc3RyLAorCQlmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzKSB7CisJCQkvLyBhbGVydChkYXRhKTsKKwkJfQorCSk7Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVByb2R1Y3RUeXBlTWV0YWRhdGEoKSB7CisJLy8gRGF0YSBpcyB0aGUgY29sbGVjdGlvbiBvZiA8dHIvPiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEga2V5L3ZhbHVlIHBhaXJzCisJdmFyIGRhdGEgPSBnZXRNZXRhZGF0YUZyb21Tb3VyY2UoJCgnI2xpdmVQcm9kdWN0VHlwZVdvcmtiZW5jaENvbnRlbnRzIGRpdi5wdHdiTWV0YWRhdGFMaXN0ID4gdGFibGUgPiB0Ym9keSA+IHRyJykpOworCXZhciBxc3RyID0gZ2V0UXVlcnlTdHJpbmdGcm9tTWV0YWRhdGEoX3BhdGhzLmN1cnJlbnRQcm9kdWN0VHlwZSwgZGF0YSk7CisKKwkkLnBvc3QoJy4uL3NlcnZpY2VzL21ldGFkYXRhL3Byb2R1Y3RUeXBlJywKKwkJcXN0ciwKKwkJZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cykgeworCQkJLy8gYWxlcnQoZGF0YSk7CisJCX0KKwkpOworfQorCisKKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBlbmNhcHN1bGF0ZSBjb21tb24gZnVuY3Rpb25hbGl0eQorICoKKyAqLworCisvLyBzb3VyY2U6ICAgdGhlIGNvbGxlY3Rpb24gb2YgPHRkLz4gb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhIHZhbHVlcworLy8gY2FsbGJhY2s6IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gcGVyc2lzdCB0aGUgZWRpdHMKK2Z1bmN0aW9uIG1ha2VNZXRhZGF0YUVkaXRhYmxlKHNvdXJjZSwgY2FsbGJhY2spIHsKKwkvLyBTZXQgdXAgdGhlIGkvZiB0byBkaXNwbGF5IHRoZSBpY29uIG9ubHkgd2hlbiB0aGUgdXNlciBpcyBob3ZlcmluZyBvdmVyCisJLy8gdGhlIGZpZWxkCisJc291cmNlLmNsaWNrKGZ1bmN0aW9uKCkgeworCQl2YXIgJG1ldCA9ICQodGhpcyk7CisJCXZhciBtZXRWYWx1ZSA9ICRtZXQ7IC8vIHRoZSA8dGQ+IGl0c2VsZgorCQkJdmFyIG1ldEtleSA9ICQodGhpcykucHJldigpLnRleHQoKTsKKwkJCWpQcm9tcHRNdWx0aSgKKwkJCQkJbWV0S2V5LAorCQkJCQltZXRWYWx1ZSwKKwkJCQkJJ1VwZGF0ZSBNZXRhZGF0YScsCisJCQkJCWZ1bmN0aW9uKHIpIHsKKworCQkJCQkJaWYgKHIpIHsKKwkJCQkJCQkvLyB0dXJuIHIgaW50byBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgb2YgdmFsdWVzCisJCQkJCQkJaHRtbFJlc3VsdCA9ICc8c3Bhbj4nICsgci5qb2luKCc8L3NwYW4+LCA8c3Bhbj4nKSArICc8L3NwYW4+JzsKKwkJCQkJCQkvLyBhbGVydCggJ1lvdSBlbnRlcmVkICcgKyBodG1sUmVzdWx0ICkKKwkJCQkJCQkkbWV0Lmh0bWwoaHRtbFJlc3VsdCk7CisJCQkJCQkJY2FsbGJhY2soKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCX0pOworfQorCitmdW5jdGlvbiBnZXRNZXRhZGF0YUZyb21Tb3VyY2UoIHNvdXJjZSApIHsKKwkKKwkvLyBLZXlzIGFyZSAxIHBlciByb3cgaW4gPHRoLz4gZWxlbWVudHMKKwkvLyBWYWx1ZXMgYXJlIDEgcGVyIHJvdyBpbiA8dGQvPiBlbGVtZW50cworCQorCXZhciAkdGFibGUgPSBzb3VyY2U7CisJdmFyIGRhdGEgICA9IEFycmF5KCk7CisJJHRhYmxlLmVhY2goIGZ1bmN0aW9uICgpIHsKKwkJLy8gQ3JlYXRlIGEga2V5L3ZhbHVlIG1hcHBpbmcgb2YgdGhlIHN0YWdlZCBtZXRhZGF0YQorCQl2YXIgJHZhbHVlRWxtdCA9ICQodGhpcykuY2hpbGRyZW4oJ3RkJyk7CisJCS8vIEFsbCB2YWx1ZXMgYXJlIHdyYXBwZWQgaW4gPHNwYW4vPiBlbGVtZW50cyBhbmQgdGhlcmUgY2FuIGJlCisJCS8vIGFuIHVubGltaXRlZCBudW1iZXIgb2YgdGhlbSwgc28gYnVpbGQgYW4gYXJyYXkuCisJCXZhciAkdmFsdWVzICAgID0gJHZhbHVlRWxtdC5jaGlsZHJlbignc3BhbicpOworCQl2YXIgdmFsdWVEYXRhICA9IEFycmF5KCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgJHZhbHVlcy5sZW5ndGg7IGkgKysgKSB7CisJCQl2YWx1ZURhdGEucHVzaCgkdmFsdWVzW2ldLnRleHRDb250ZW50KTsKKwkJfQorCQkvLyBBc3NpZ24gdGhlIHZhbHVlIGRhdGEgdG8gdGhlIGNvcnJlY3QgZWxlbWVudAorCQlkYXRhLnB1c2goIHsgJ2tleScgOiAkKHRoaXMpLmNoaWxkcmVuKCd0aCcpLnRleHQoKSwgJ3ZhbHVlJyA6IHZhbHVlRGF0YSB9ICk7CisJfSk7CisJCisJcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIGdldFF1ZXJ5U3RyaW5nRnJvbU1ldGFkYXRhKGlkLGRhdGEpIHsKKwkvLyBCdWlsZCB0aGUgcXVlcnkgc3RyaW5nIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIKKwl2YXIgcXN0ciAgICAgID0gJyc7CisJcXN0ciAgICAgICAgICs9ICdpZD0nICsgaWQ7CisJZm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKyApIHsKKwkJZm9yICggdmFyIGogPSAwOyBqIDwgZGF0YVtpXS52YWx1ZS5sZW5ndGg7IGorKyApIHsKKwkJCXFzdHIgKz0gJyZtZXRhZGF0YS4nICsgZGF0YVtpXS5rZXkgKyAnPScgKyBkYXRhW2ldLnZhbHVlW2pdOworCQl9CisJfQorCQorCXJldHVybiBxc3RyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5HRVNUSU9OIFRBU0sgU0VUVVAKKyAqLworCisKKy8vIEtlZXAgdHJhY2sgb2YgZHJvcHBlZCBmaWxlcy4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZmlsZXMgCisvLyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gYW4gaW5nZXN0aW9uIHRhc2sKK3ZhciBkcm9wcGVkRmlsZXMgPSBBcnJheSgpOworCisvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHBvbGljeS4gVGhpcyBpcyB0aGUgcG9saWN5IHRoYXQgd2lsbAorLy8gYmUgdXNlZCBpbiB0aGUgaW5nZXN0aW9uIHRhc2suCit2YXIgaXRQb2xpY3k7CisKKy8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvZHVjdCB0eXBlLiBUaGlzIGlzIHRoZSBwcm9kdWN0IHR5cHRlIHRoYXQKKy8vIHdpbGwgYmUgdXNlZCBpbiB0aGUgaW5nZXN0aW9uIHRhc2sKK3ZhciBpdFByb2R1Y3RUeXBlOworCisKKy8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgTWV0YWRhdGEgRXh0cmFjdG9yIENvbmZpZ3VyYXRpb24gSWQKKy8vIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHNlbnQgd2l0aCB0aGUgaW5nZXN0aW9uIHRhc2sKK3ZhciBpdE1ldEV4dHJhY3RvckNvbmZpZ0lkID0gJ2RlZmF1bHQnOworCisKKworZnVuY3Rpb24gdXBkYXRlSW5nZXN0aW9uVGFza01ldEV4dHJhY3RvckNvbmZpZ0lkcygpIHsKKwkkLmdldCgnLi4vc2VydmljZXMvbWV0YWRhdGEvZXh0cmFjdG9yL2NvbmZpZycsCisJCQl7fSwKKwkJCWZ1bmN0aW9uKGRhdGEsdGV4dFN0YXRlKSB7CisJCQkJJCgnI2l0TWV0RXh0cmFjdG9yQ29uZmlnSWQnKS5odG1sKGRhdGEpOworCQkJCWl0TWV0RXh0cmFjdG9yQ29uZmlnSWQgPSAkKCcjaXRNZXRFeHRyYWN0b3JDb25maWdJZCcpLnZhbCgpOworCQkJfSk7Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkTWV0RXh0cmFjdG9yQ29uZmlnSWQoKSB7CisJaXRNZXRFeHRyYWN0b3JDb25maWdJZCA9ICQoJyNpdE1ldEV4dHJhY3RvckNvbmZpZ0lkJykudmFsKCk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUluZ2VzdGlvblRhc2soKSB7CisJLy8gVGhlIGZpbGVzIHRvIGluY2x1ZGUgYXJlIGluIGRyb3BwZWRGaWxlcworCXZhciBmaWxlcyAgICAgICA9IGRyb3BwZWRGaWxlczsKKwkvLyBUaGUgbWV0IGV4dHJhY3RvciBjb25maWcgaWQgaXMgaW4gaXRNZXRFeHRyYWN0b3JDb25maWdJZAorCXZhciBtZXRFeHRDZmdJZCA9IGl0TWV0RXh0cmFjdG9yQ29uZmlnSWQ7CisJLy8gVGhlIHBvbGljeSBhbmQgcHJvZHVjdCB0eXBlIGFyZSBpbiBpdFBvbGljeSBhbmQgaXRQcm9kdWN0VHlwZQorCXZhciBwb2xpY3kgICAgICA9IGl0UG9saWN5OworCXZhciBwcm9kdWN0VHlwZSA9IGl0UHJvZHVjdFR5cGU7CisJLy8gT3RoZXIgdmFyaWFibGVzIHdlJ2xsIG5lZWQKKwl2YXIgbnVtRmlsZXMgPSBkcm9wcGVkRmlsZXMubGVuZ3RoOworCQorCS8vIFNlbmQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBjcmVhdGUgaW5nZXN0aW9uIHRhc2sgc2VydmxldAorCSQuZ2V0KCcuLi9zZXJ2aWNlcy9pbmdlc3QvY3JlYXRlJywKKwkJCXsKKwkJCQknZmlsZXMnICAgICAgOiBmaWxlcy5qb2luKCcsJyksCisJCQkJJ251bWZpbGVzJyAgIDogbnVtRmlsZXMsCisJCQkJJ21ldEV4dENmZ0lkJzogbWV0RXh0Q2ZnSWQsCisJCQkJJ3BvbGljeScgICAgIDogcG9saWN5LAorCQkJCSdwdHlwZScgICAgICA6IHByb2R1Y3RUeXBlCisJCQl9LAorCQkJZnVuY3Rpb24gKGRhdGEsdGV4dFN0YXRlKSB7CisJCQkgICByZWZyZXNoSW5nZXN0VGFza0xpc3QoKTsJCQorCQkJfSk7IAorCQorICAgCit9CisKK2Z1bmN0aW9uIHJlZnJlc2hJbmdlc3RUYXNrTGlzdCgpeworICAgICQuZ2V0KCcuLi9zZXJ2aWNlcy9pbmdlc3QvbGlzdCcsCisgICAgICAgICAgICB7ICdmb3JtYXQnOiAnaHRtbCcKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSx0ZXh0U3RhdGUpIHsKKyAgICAgICAgICAgICAgICBzaG93SW5nZXN0aW9uVGFza0xpc3QoZGF0YSk7CisgICAgICAgICAgICB9KTsgICAgICAgICAKK30KKworZnVuY3Rpb24gc2hvd0luZ2VzdGlvblRhc2tMaXN0KGRhdGEpeworICAgICQoJyNpbmdlc3Rpb25UYXNrTGlzdEl0ZW1zID4gdGJvZHknKS5odG1sKGRhdGEpOworfQorCitmdW5jdGlvbiByZWdpc3RlckluZ2VzdGlvblRhc2tMaXN0ZW5lcigpeworICAgICQuUGVyaW9kaWNhbFVwZGF0ZXIoJy4uL3NlcnZpY2VzL2luZ2VzdC9saXN0JywgeworICAgICAgICBtZXRob2Q6ICdnZXQnLCAgICAgICAgIAorICAgICAgICBkYXRhOiB7ICdmb3JtYXQ6JzogJ2h0bWwnfSwgICAgICAgICAgCisgICAgICAgIG1pblRpbWVvdXQ6IDEwMDAsCisgICAgICAgIG1heFRpbWVvdXQ6IDYwMDAwLAorICAgICAgICBtdWx0aXBsaWVyOiAyCisgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgIHNob3dJbmdlc3Rpb25UYXNrTGlzdChkYXRhKTsKKyAgICAgICAgIH0pOworCit9CisKK2Z1bmN0aW9uIGNyZWF0ZUluZ2VzdGlvblRhc2tSb3coZGF0YSkgeyAgICAKKyAgICAkKCcjaW5nZXN0aW9uVGFza0xpc3RJdGVtcyA+IHRib2R5JykucmVwbGFjZShkYXRhKTsKK30KKworZnVuY3Rpb24gcmVtb3ZlSW5nZXN0aW9uVGFzayhpZCkgeworCSQuZ2V0KCcuLi9zZXJ2aWNlcy9pbmdlc3QvcmVtb3ZlJywKKwkJCXsgJ3Rhc2tJZCcgOiBpZCB9LAorCQkJcmVmcmVzaEluZ2VzdFRhc2tMaXN0KCkKKwkJCSk7Cit9CisKK2Z1bmN0aW9uIHN0YXJ0SW5nZXN0aW9uVGFzayhpZCkgeworCSQuZ2V0KCcuLi9zZXJ2aWNlcy9pbmdlc3Qvc3RhcnQnLAorCQkJeyAndGFza0lkJyA6IGlkIH0sCisJCQlmdW5jdGlvbihkYXRhLHRleHRTdGF0ZSkgeworCQkJCSQoJyMnK2lkKydfU3RhdHVzJykuaHRtbChkYXRhKTsJLy8gJ3N0YXJ0ZWQnIG9yICdlcnJvcicKKwkJCQlyZWZyZXNoSW5nZXN0VGFza0xpc3QoKTsKKwkJCX0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERSQUcgQU5EIERST1AgSU5JVElBTElaQVRJT04gQU5EIENPTkZJR1VSQVRJT04KKyAqIAorICovCitmdW5jdGlvbiBpbml0RHJhZ2dhYmxlcygpIHsKKwkkKCcuZHJhZ2d5JykuZHJhZ2dhYmxlKHsKKwkJcmV2ZXJ0OnRydWUsIAorCQl6SW5kZXg6JzUwMDAnLCAKKwkJYXBwZW5kVG86J2JvZHknCisJCSwgCisJCWhlbHBlcjogZnVuY3Rpb24oKSB7IAorCQkJcmV0dXJuICQoJzxsaT4nKQorCQkJCS5hZGRDbGFzcygnaGVscGVyJykKKwkJCQkuYWRkQ2xhc3MoJ2ZpbGUnKS5hZGRDbGFzcygnZXh0X3RpZmYnKQorCQkJCS5odG1sKCQodGhpcykuY2hpbGRyZW4oKS5jbG9uZSgpKTsKKwkJfQorCX0pOworfQorZnVuY3Rpb24gaW5pdERyYWdBbmREcm9wVGFyZ2V0KCkgeworCSQoJyNkcm9wcGVkRmlsZVRhcmdldCcpLmRyb3BwYWJsZSggeworCQlkcm9wOiBmdW5jdGlvbihldmVudCwgdWkpIHsKKwkJCWRyb3BwZWRGaWxlcy5wdXNoKHVpLmRyYWdnYWJsZS5jaGlsZHJlbignYScpWzBdLnJlbCk7CisJCQl1cGRhdGVEcm9wcGVkRmlsZXNMaXN0KCk7CisJCX0KKwl9KTsKK30KK2Z1bmN0aW9uIHVwZGF0ZURyb3BwZWRGaWxlc0xpc3QoKSB7CisJdmFyIGkgPSBkcm9wcGVkRmlsZXMubGVuZ3RoIC0xOworCSQoJyNkcm9wcGVkRmlsZUxpc3QgPiB1bCcpLmFwcGVuZCgKKwkJJzxsaSByZWw9IicrZHJvcHBlZEZpbGVzW2ldKyciPicrZHJvcHBlZEZpbGVzW2ldKyc8L2xpPicKKwkpOworfQorZnVuY3Rpb24gY2xlYXJEcm9wcGVkRmlsZXNMaXN0KCkgeworCWRyb3BwZWRGaWxlcyA9IEFycmF5KCk7CQkJCS8vIGNsZWFyIHRoZSBqcyBhcnJheQorCSQoJyNkcm9wcGVkRmlsZUxpc3QgdWwnKS5odG1sKCcnKTsJLy8gY2xlYXIgdGhlIGludGVyZmFjZSBkaXNwbGF5Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNQUlOIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OIChPTiBET00gUkVBRFkpCisgKi8KKyQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKKworCS8vIEluaXRpYWxpemUgdGhlIHN0YWdpbmcgYXJlYSBicm93c2VyCisJaW5pdFN0YWdpbmdBcmVhQnJvd3NlcigpOworCQorCS8vIEluaXRpYWxpemUgdGhlIHN0YWdpbmcgYXJlYSBuYXZpZ2F0aW9uIGJ1dHRvbnMKKwkkKCcjc3RhZ2luZ05hdlVwT25lJykKKyAgICAJLmRibGNsaWNrKHN0YWdpbmdOYXZpZ2F0ZVVwT25lKQorICAgIAkuY2xpY2soIGZ1bmN0aW9uKGV2ZW50KSB7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9KTsKKyAgICAkKCcjc3RhZ2luZ05hdlVwUm9vdCcpCisgICAgCS5kYmxjbGljayhzdGFnaW5nTmF2aWdhdGVVcFJvb3QpCisgICAgCS5jbGljayggZnVuY3Rpb24oZXZlbnQpIHtldmVudC5wcmV2ZW50RGVmYXVsdCgpO30pOworCisKKwkvLyBJbml0aWFsaXplIHRoZSBGaWxlIE1hbmFnZXIgYnJvd3NlcgorCWluaXRGaWxlTWFuYWdlckJyb3dzZXIoKTsKKworCS8vIEluaXRpYWxpemUgdGhlIGNhdGFsb2cgbmF2aWdhdGlvbiBidXR0b25zCisJJCgnI2NhdGFsb2dOYXZVcE9uZScpCisJCS5kYmxjbGljayhjYXRhbG9nTmF2aWdhdGVVcE9uZSkKKyAgICAJLmNsaWNrKCBmdW5jdGlvbihldmVudCkge2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fSk7CisJJCgnI2NhdGFsb2dOYXZVcFJvb3QnKQorCQkuZGJsY2xpY2soY2F0YWxvZ05hdmlnYXRlVXBSb290KQorICAgIAkuY2xpY2soIGZ1bmN0aW9uKGV2ZW50KSB7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9KTsKKworCisJLy8gTWFrZSBvdmVybGFpZCBpbmZvIG1lc3NhZ2VzIHNlbWktdHJhbnNwYXJlbnQKKwkkKCcuaW5mby5vdmVybGF5JykuZmFkZVRvKDAsMC44KTsKKwkKKwkvLyBDb25uZWN0IHN0YWdpbmcgbWV0IGV4dHJhY3RvciByZWZyZXNoIGJ1dHRvbgorCSQoJyNzdGFnaW5nTWV0RXh0cmFjdG9yUmVmcmVzaEJ1dHRvbicpLmNsaWNrKHJlZnJlc2hTdGFnZWRNZXRhZGF0YSk7CisJCit9KTsKKworZnVuY3Rpb24gdXBkYXRlTmF2KHdoaWNoKSB7CisJaWYgKHdoaWNoID09ICdzdGFnaW5nJykgCisJCSQoJyNicm93c2VTdGFnaW5nUGF0aCcpLmh0bWwoJ1BhdGg6ICcgKyBfcGF0aHMuc3RhZ2luZyk7CisJCWlmICgnLycgPT0gX3BhdGhzLnN0YWdpbmcpIHsKKwkJCS8vIFdlIGFyZSBhdCB0aGUgcm9vdCwgZG9uJ3Qgc2hvdyAuIGFuZCAuLgorCQkJJCgnI2Jyb3dzZVN0YWdpbmdOYXYnKS5oaWRlKCk7CisJCX0gZWxzZSB7CisJCQkkKCcjYnJvd3NlU3RhZ2luZ05hdicpLnNob3coKTsKKwkJfQorCWlmICh3aGljaCA9PSAnY2F0YWxvZycpIHsKKwkJLy8gQ2F0YWxvZyBuYXZpZ2F0aW9uIGlzIGEgbGl0dGxlIG1vcmUgY29tcGxleAorCQkkKCcjYnJvd3NlQ2F0YWxvZ1BhdGgnKS5odG1sKCdQYXRoOiAnICsgX3BhdGhzLmNhdGFsb2cpOworCQlpZiAoJy8nID09IF9wYXRocy5jYXRhbG9nKSB7CisJCQkvLyBXZSBhcmUgbGlzdGluZyBwb2xpY2llcywgZG9uJ3Qgc2hvdyAuIGFuZCAuLgorCQkJJCgnI2Jyb3dzZUNhdGFsb2dOYXYnKS5oaWRlKCk7CisJCX0gZWxzZSB7CisJCQkkKCcjYnJvd3NlQ2F0YWxvZ05hdicpLnNob3coKTsKKwkJfQorCisJfQorfQorCitmdW5jdGlvbiBjbGVhck1ldGFkYXRhV29ya2JlbmNoQ29udGVudCh3aGljaCkgeworCWlmICh3aGljaCA9PSAnc3RhZ2luZycpIHsKKwkJJCgnI2luZm9Ob01ldGFkYXRhRXh0cmFjdG9yRGVmaW5lZCcpLmhpZGUoKTsKKwkJJCgnI3N0YWdlZE1ldGFkYXRhV29ya2JlbmNoQ29udGVudCcpLmh0bWwoJycpOworCQloaWRlU3RhZ2luZ01ldEV4dHJhY3RvclNlbGVjdGlvbigpOworCQlfcGF0aHMuY3VycmVudFN0YWdlZEZpbGUgPSAnJzsKKwl9IGVsc2UgaWYgKHdoaWNoID09ICdjYXRhbG9nJykgeworCQkkKCcjY2F0YWxvZ01ldGFkYXRhV29ya2JlbmNoQ29udGVudCcpLmh0bWwoJycpOworCQlfcGF0aHMuY3VycmVudENhdGFsb2dlZEZpbGUgPSAnJzsKKwkJX3BhdGhzLmN1cnJlbnRQcm9kdWN0VHlwZSAgID0gJyc7CisJfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTVEFHSU5HIEFSRUEgQlJPV1NFUiBGVU5DVElPTlMKKyAqLworCit2YXIgc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkID0gJyc7CisKKyAKK2Z1bmN0aW9uIGluaXRTdGFnaW5nQXJlYUJyb3dzZXIoKSB7CisJICQoJyNicm93c2VTdGFnaW5nQ29udGVudHMnKS5maWxlVHJlZSgKKyAgICAJeyByb290OiAgICcvJywKKyAgICAgICAgICB3aGljaDogICdzdGFnaW5nJywKKyAgICAgICAgICBzY3JpcHQ6ICcuLi9zZXJ2aWNlcy9kaXJlY3Rvcnkvc3RhZ2luZycgCisgICAgICAgIH0sIGZ1bmN0aW9uKGZpbGUpIHsKKyAgICAgICAgCWdldE1ldGFkYXRhRm9yU3RhZ2VkRmlsZShmaWxlLCBmYWxzZSk7CisgICAgICB9KTsKKyAgICAgdXBkYXRlTmF2KCdzdGFnaW5nJyk7Cit9CisKK2Z1bmN0aW9uIHN0YWdpbmdOYXZpZ2F0ZVVwT25lKCkgeworCXZhciBwaWVjZXMgPSBfcGF0aHMuc3RhZ2luZy5zcGxpdCgnLycpOworCXZhciBuZXdwYXRoID0gJyc7CisJZm9yICh2YXIgaT0wOyBpIDwgKHBpZWNlcy5sZW5ndGgtMik7IGkrKykgeworCQluZXdwYXRoICs9IChwaWVjZXNbaV0gKyAnLycpOworCX0KKwlpZiAoJycgPT0gbmV3cGF0aCkgeworCQluZXdwYXRoID0gJy8nOworCX0KKwlfcGF0aHMuc3RhZ2luZyA9IG5ld3BhdGg7CisJaW5pdFN0YWdpbmdBcmVhQnJvd3NlcigpOworCWNsZWFyTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50KCdzdGFnaW5nJyk7CisJcmV0dXJuIGZhbHNlOworfQorCitmdW5jdGlvbiBzdGFnaW5nTmF2aWdhdGVVcFJvb3QoKSB7CisJLy8gUmUtSW5pdGlhbGl6ZSB0aGUgc3RhZ2luZyBhcmVhIGJyb3dzZXIKKwlfcGF0aHMuc3RhZ2luZyA9ICcvJzsKKwlpbml0U3RhZ2luZ0FyZWFCcm93c2VyKCk7CisJY2xlYXJNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQoJ3N0YWdpbmcnKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIGdldE1ldGFkYXRhRm9yU3RhZ2VkRmlsZShmaWxlLCBvdmVyd3JpdGUpIHsKKwkkLmdldCgnLi4vc2VydmljZXMvbWV0YWRhdGEvc3RhZ2luZycsCisJCQl7ICdpZCcgOiBmaWxlLAorCQkgICAgICAnY29uZmlnSWQnIDogc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkLAorCQkgICAgICAnb3ZlcndyaXRlJyA6IG92ZXJ3cml0ZQorCQkJfSwKKwkJCWZ1bmN0aW9uKGRhdGEsdGV4dFN0YXR1cykgeworCQkJCWRpc3BsYXlTdGFnZWRGaWxlTWV0YWRhdGEoZmlsZSxkYXRhKTsKKwkJCX0sICJodG1sIik7Cit9CisKK2Z1bmN0aW9uIGRpc3BsYXlTdGFnZWRGaWxlTWV0YWRhdGEoZmlsZSxkYXRhKSB7CisJc2hvd1N0YWdpbmdNZXRFeHRyYWN0b3JTZWxlY3Rpb24oKTsKKwlfcGF0aHMuY3VycmVudFN0YWdlZEZpbGUgPSBmaWxlOworCWlmICghIGRhdGEubWF0Y2goJ3RyJykpIHsKKwkJaWYgKHN0YWdpbmdNZXRFeHRyYWN0b3JDb25maWdJZCA9PSAnJykgeworCQkJJCgnI2luZm9Ob01ldGFkYXRhRXh0cmFjdG9yRGVmaW5lZCcpLnNob3coKTsKKwkJfQorCX0gZWxzZSB7IAorCQkkKCcjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbChkYXRhKTsKKwkJbWFrZVN0YWdlZE1ldGFkYXRhRWRpdGFibGUoKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVN0YWdpbmdNZXRFeHRyYWN0b3JDb25maWdJZHMoKSB7CisJJC5nZXQoJy4uL3NlcnZpY2VzL21ldGFkYXRhL2V4dHJhY3Rvci9jb25maWcnLAorCQl7J2N1cnJlbnQnIDogc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkIH0sCisJCWZ1bmN0aW9uKGRhdGEsdGV4dFN0YXRlKSB7CisJCQkkKCcjc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0xpc3QnKS5odG1sKGRhdGEpOworCQkJc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkID0gJCgnI3N0YWdpbmdNZXRFeHRyYWN0b3JDb25maWdMaXN0JykudmFsKCk7CisJCX0pOworfQorCitmdW5jdGlvbiBzaG93U3RhZ2luZ01ldEV4dHJhY3RvclNlbGVjdGlvbigpIHsKKwkkKCcjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuY3NzKCdoZWlnaHQnLCczMjNweCcpOworCSQoJyNzdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uJykuZmFkZUluKCdmYXN0Jyk7CisJdXBkYXRlU3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkcygpOworfQorCitmdW5jdGlvbiBoaWRlU3RhZ2luZ01ldEV4dHJhY3RvclNlbGVjdGlvbigpIHsKKwkkKCcjc3RhZ2luZ01ldEV4dHJhY3RvclNlbGVjdGlvbicpLmZhZGVPdXQoJ2Zhc3QnKTsKKwkkKCcjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuY3NzKCdoZWlnaHQnLCczNTBweCcpOworfQorCitmdW5jdGlvbiByZWZyZXNoU3RhZ2VkTWV0YWRhdGEoKSB7CisJc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkID0gJCgnI3N0YWdpbmdNZXRFeHRyYWN0b3JDb25maWdMaXN0JykudmFsKCk7CisJZ2V0TWV0YWRhdGFGb3JTdGFnZWRGaWxlKF9wYXRocy5jdXJyZW50U3RhZ2VkRmlsZSwgdHJ1ZSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZJTEUgTUFOQUdFUiBCUk9XU0VSIEZVTkNUSU9OUworICovCisKKy8vCisvLyBwYXRocyBpbiB0aGlzIGFyZWEgYXJlICJ2aXJ0dWFsIiwgdGhhdCBpcywgdGhleSByZWZsZWN0IHRoZSBsb2dpY2FsCisvLyBvcmdhbml6YXRpb24gb2YgdGhlIGZpbGUgbWFuYWdlciBjYXRhbG9nIHJhdGhlciB0aGFuIHRoZSBwaHlzaWNhbAorLy8gb3JnYW5pemF0aW9uIG9mIHRoZSBwcm9kdWN0cyBpbiB0aGUgcmVwb3NpdG9yeS4gQXMgc3VjaCwgdGhlIHZpcnR1YWwKKy8vIHBhdGggdG8gYSBwcm9kdWN0IGlzIG9idGFpbmVkIGJ5IHNwZWNpZnlpbmcgYm90aCB0aGUgJ3BvbGljeScgYW5kIAorLy8gJ3Byb2R1Y3RUeXBlJzoKKy8vCisvLyBkZW0wMDAwMS50aWZmIGV4aXN0cyBhdCAidmlydHVhbCIgcGF0aDogL0xtbXAvREVNIHdoZXJlCisvLyBMTU1QIGlzIHRoZSBwb2xpY3kKKy8vIGFuZCBERU0gaXMgYSBwcm9kdWN0IHR5cGUgZGVmaW5lZCB3aXRoaW4gdGhhdCBwb2xpY3kKKy8vCisKKyAKK2Z1bmN0aW9uIGluaXRGaWxlTWFuYWdlckJyb3dzZXIoKSB7CisJICQoJyNicm93c2VDYXRhbG9nQ29udGVudHMnKS5maWxlVHJlZSgKKyAgICAJeyByb290OiAgICcvJywKKyAgICAgICAgICB3aGljaDogICdjYXRhbG9nJywKKyAgICAgICAgICBzY3JpcHQ6ICcuLi9zZXJ2aWNlcy9wb2xpY3kvYnJvd3NlJworICAgICAgICB9LCBmdW5jdGlvbihmaWxlKSB7CisgICAgICAgIAlnZXRNZXRhZGF0YUZvckNhdGFsb2dlZEZpbGUoZmlsZSk7CisgICAgICAgIH0sIGZ1bmN0aW9uKHByb2R1Y3RUeXBlKSB7CisgICAgICAgICAgZ2V0UHJvZHVjdFR5cGVXb3JrYmVuY2gocHJvZHVjdFR5cGUpOworICAgICB9KTsKKyAgICAgdXBkYXRlTmF2KCdjYXRhbG9nJyk7CisgICAgIAorfQorCitmdW5jdGlvbiBjYXRhbG9nTmF2aWdhdGVVcE9uZSgpIHsKKwkKKwl2YXIgcGllY2VzID0gX3BhdGhzLmNhdGFsb2cuc3BsaXQoJy8nKTsKKwl2YXIgbmV3cGF0aCA9ICcnOworCWZvciAodmFyIGk9MDsgaSA8IChwaWVjZXMubGVuZ3RoLTIpOyBpKyspIHsKKwkJbmV3cGF0aCArPSAocGllY2VzW2ldICsgJy8nKTsKKwl9CisJaWYgKCcnID09IG5ld3BhdGgpIHsKKwkJbmV3cGF0aCA9ICcvJzsKKwl9CisJX3BhdGhzLmNhdGFsb2cgPSBuZXdwYXRoOworCWluaXRGaWxlTWFuYWdlckJyb3dzZXIoKTsKKwljbGVhck1ldGFkYXRhV29ya2JlbmNoQ29udGVudCgnY2F0YWxvZycpOworCXJldHVybiBmYWxzZTsKK30KKworZnVuY3Rpb24gY2F0YWxvZ05hdmlnYXRlVXBSb290KCkgeworCS8vIFJlLUluaXRpYWxpemUgdGhlIGNhdGFsb2cgYnJvd3NlcgorCV9wYXRocy5jYXRhbG9nID0gJy8nOworCWluaXRGaWxlTWFuYWdlckJyb3dzZXIoKTsKKwljbGVhck1ldGFkYXRhV29ya2JlbmNoQ29udGVudCgnY2F0YWxvZycpOworCXJldHVybiBmYWxzZTsKK30KKyAKK2Z1bmN0aW9uIGdldE1ldGFkYXRhRm9yQ2F0YWxvZ2VkRmlsZShmaWxlKSB7CisJJC5nZXQoJy4uL3NlcnZpY2VzL21ldGFkYXRhL2NhdGFsb2cnLAorCQkJeyAnaWQnIDogZmlsZSB9LAorCQkJZnVuY3Rpb24oZGF0YSx0ZXh0U3RhdHVzKSB7CisJCQkJZGlzcGxheUNhdGFsb2dlZEZpbGVNZXRhZGF0YShmaWxlLGRhdGEpOworCQkJCX0sICJodG1sIik7Cit9CisgCitmdW5jdGlvbiBkaXNwbGF5Q2F0YWxvZ2VkRmlsZU1ldGFkYXRhKGZpbGUsZGF0YSkgeworCSQoJyNjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbChkYXRhKTsKKwlfcGF0aHMuY3VycmVudENhdGFsb2dlZEZpbGUgPSBmaWxlOworCW1ha2VQcm9kdWN0TWV0YWRhdGFFZGl0YWJsZSgpOworfQorCitmdW5jdGlvbiBnZXRQcm9kdWN0VHlwZVdvcmtiZW5jaChwcm9kdWN0VHlwZSkgeworCXZhciBwaWVjZXMgPSBwcm9kdWN0VHlwZS5zcGxpdCgnLycpOworCXZhciBwb2xpY3kgPSBwaWVjZXNbMV07CisJdmFyIHB0eXBlICA9IHBpZWNlc1syXTsKKwkkLmdldCgnLi4vc2VydmljZXMvbWV0YWRhdGEvcHJvZHVjdFR5cGUnLAorCQkJeyAncG9saWN5JyA6IHBvbGljeSwgJ3Byb2R1Y3RUeXBlJyA6IHB0eXBlLCAnaWQnIDogcHJvZHVjdFR5cGUgfSwKKwkJCWZ1bmN0aW9uKGRhdGEsdGV4dFN0YXR1cykgeworCQkJCWRpc3BsYXlQcm9kdWN0VHlwZVdvcmtiZW5jaChwcm9kdWN0VHlwZSxkYXRhKTsKKwkJCX0sImh0bWwiKTsKKwlpdFBvbGljeSAgICAgID0gcG9saWN5OworCWl0UHJvZHVjdFR5cGUgPSBwdHlwZTsKK30KKworZnVuY3Rpb24gZGlzcGxheVByb2R1Y3RUeXBlV29ya2JlbmNoKHByb2R1Y3RUeXBlLGRhdGEpIHsKKwkkKCcjY2F0YWxvZ01ldGFkYXRhV29ya2JlbmNoQ29udGVudCcpLmh0bWwoJycpOwkvLyBjbGVhciB0aGUgb2xkIGNvbnRlbnRzCisJJCgnLnB0d2JNZXRhZGF0YUxpc3QnKS5odG1sKGRhdGEpOwkJCQkvLyBhZGQgbWV0YWRhdGEgZnJvbSBzZXJ2aWNlCQkKKwkKKwkkKCcjcHJvZHVjdFR5cGVXb3JrYmVuY2hDb250ZW50cycpCQkJCS8vIGRpc3BsYXkgcHQgd29ya2JlbmNoCisJCS5jbG9uZSgpCisJCS5hdHRyKCdpZCcsJ2xpdmVQcm9kdWN0VHlwZVdvcmtiZW5jaENvbnRlbnRzJykKKwkJLmFwcGVuZFRvKCcjY2F0YWxvZ01ldGFkYXRhV29ya2JlbmNoQ29udGVudCcpCisJCS5zaG93KCkKKwkJLnRhYnMoKTsKKwljbGVhckRyb3BwZWRGaWxlc0xpc3QoKTsJCQkJCQkvLyBjbGVhciBkcm9wcGVkIGZpbGVzIGxpc3QKKwlpbml0RHJhZ0FuZERyb3BUYXJnZXQoKTsJCQkJCQkvLyBzZXQgdXAgdGhlIGQmZCB0YXJnZXQgYm94CisJX3BhdGhzLmN1cnJlbnRQcm9kdWN0VHlwZSA9IHByb2R1Y3RUeXBlOwkJLy8gc2V0IHRoZSBwYXRoIGZvciB0aGUgcHR5cGUKKwltYWtlUHJvZHVjdFR5cGVNZXRhZGF0YUVkaXRhYmxlKCk7CQkJCS8vIGFsbG93IHB0eXBlIG1ldCBlZGl0aW5nCisJdXBkYXRlSW5nZXN0aW9uVGFza01ldEV4dHJhY3RvckNvbmZpZ0lkcygpOworfQorCisKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZS5jc3MgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDkyOGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2UuY3NzCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaGVhZGVyIHsKKyAgICB3aWR0aDoxMDAlOworICAgIGhlaWdodDo4MHB4OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjMmUzZTRlOworfQorCisjcHJvamVjdF9sb2dvIHsKKyAgICBmbG9hdDpsZWZ0OworfQorCisjdXNlcl9zdGF0dXMgeworICAgIGZsb2F0OnJpZ2h0OworICAgIHBhZGRpbmc6MTBweDsKK30KKworI25hdiB7CisgICAgbWFyZ2luLXRvcDoxMHB4OworfQorCisjbmF2IGEgeworICAgIGNvbG9yOiNjMGMwYzA7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgICAgYm9yZGVyLXJpZ2h0OnNvbGlkIDFweCAjNDU2OworICAgIHBhZGRpbmc6IDNweCAyMHB4OworfQorI25hdiBhLmZpcnN0IHsKK30KKyNuYXYgYS5sYXN0IHsKKyAgICBib3JkZXItcmlnaHQ6bm9uZTsKK30KKworI2Zvb3RlcnsKKyAgcG9zaXRpb246Zml4ZWQ7CisgIGJvdHRvbTowcHg7CisgIHdpZHRoOjEwMCU7CisgIGhlaWdodDo4MHB4OworICBwYWRkaW5nOjVweCAwcHg7CisgIGJvcmRlci1zcGFjaW5nOjBweDsKKyAgYm9yZGVyLXRvcDpzb2xpZCAxcHggIzJlM2U0ZTsKKyAgZm9udC1zaXplOjkwJTsKKyAgei1pbmRleDoxMDAwMDsKK30KKyNmb290ZXIgcCB7CisgIHdpZHRoOjEwMCU7CisgIHBhZGRpbmc6NXB4IDE1cHg7CisgIHRleHQtYWxpZ246Y2VudGVyOworfQorCisjZmVlZGJhY2sgeworICAgIG1hcmdpbjowcHg7CisgICAgbWFyZ2luLXRvcDotMjBweDsKKyAgICBmb250LXNpemU6OTAlOworfQorCisjcG93ZXJlZCwjZmVlZGJhY2sgeworICBtYXJnaW4tbGVmdDotMzBweDsKK30KKworCisKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlZDA2NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZS5odG1sCkBAIC0wLDAgKzEsMTMwIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbAorCXhtbG5zOndpY2tldD0iaHR0cDovL3dpY2tldC5hcGFjaGUub3JnL2R0ZHMuZGF0YS93aWNrZXQteGh0bWwxLjQtc3RyaWN0LmR0ZCI+Cis8aGVhZD4KKzx0aXRsZT5BcGFjaGUgT09EVCBQQ1MgT3BlcmF0b3IgSW50ZXJmYWNlPC90aXRsZT4KKzx3aWNrZXQ6bGluaz4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iQmFzZVBhZ2UuY3NzIi8+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgc3JjPSJqcXVlcnktMS43Lm1pbi5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgc3JjPSJCYXNlUGFnZS5qcyI+PC9zY3JpcHQ+Cis8L3dpY2tldDpsaW5rPgorPHdpY2tldDpyZW1vdmU+CisgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICA8IS0tCisKKyAgIGZ1bmN0aW9uIG1lbnVTZWxlY3RlZChjZWxsKSB7CisJCWNlbGwuY3NzKHsnYmFja2dyb3VuZC1jb2xvcic6JyMwMDY2OTknfSk7CisJfQorCWZ1bmN0aW9uIG1lbnVOb3RTZWxlY3RlZChjZWxsKSB7CisJCWNlbGwuY3NzKHsnYmFja2dyb3VuZC1jb2xvcic6JyM2NjY2NjYnfSk7CQorCX0gICAKKyAgIAorICAgZnVuY3Rpb24gc3ViTWVudVNlbGVjdGVkKGlkKSB7CisJCXZhciB4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJvd3M7CisJCXZhciB5ID0geFswXS5jZWxsczsKKwkJeVswXS5pbm5lckhUTUwgPSAiPGltZyBzcmM9J3NlbGxlZnRjb3JuZXIuZ2lmJz4iOworCQl5WzFdLmJnQ29sb3IgPSAiIzk5Q0NGRiI7CisJCXlbMl0uaW5uZXJIVE1MID0gIjxpbWcgc3JjPSdzZWxyaWdodGNvcm5lci5naWYnPiI7CisJfQorCisJZnVuY3Rpb24gc3ViTWVudU5vdFNlbGVjdGVkKGlkKSB7CisJCXZhciB4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJvd3M7CisJCXZhciB5ID0geFswXS5jZWxsczsKKwkJeVswXS5pbm5lckhUTUwgPSAiPGltZyBzcmM9J2xlZnRjb3JuZXIuZ2lmJz4iOworCQl5WzFdLmJnQ29sb3IgPSAiI2NjY2NjYyI7CisJCXlbMl0uaW5uZXJIVE1MID0gIjxpbWcgc3JjPSdyaWdodGNvcm5lci5naWYnPiI7CisJfSAgICAgCisJCisJdmFyIGludGVyZmFjZWltZyA9IG5ldyBBcnJheSgpOworCWZ1bmN0aW9uIHByZWxvYWRpbWcoKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlpbnRlcmZhY2VpbWdbaV0gPSBuZXcgSW1hZ2UoKTsKKwkJCWludGVyZmFjZWltZ1tpXS5zcmMgPSBhcmd1bWVudHNbaV07CisJCX0KKwl9CisKKwkvLyBFbnRlciBmdWxsIFVSTCB0byBpbWFnZSB0YWJzIHRvIHByZWxvYWQgYmVsb3cuIFNlcGFyYXRlIHdpdGggY29tbWE6CisKKwlwcmVsb2FkaW1nKCJyaWdodGNvcm5lci5naWYiLCAibGVmdGNvcm5lci5naWYiLAorCQkJInNlbHJpZ2h0Y29ybmVyLmdpZiIsICJzZWxsZWZ0Y29ybmVyLmdpZiIpOwkKKyAgIC8vLS0+CisgIDwvc2NyaXB0PgorPC93aWNrZXQ6cmVtb3ZlPgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJoZWFkZXIiPgorICAgIDxkaXYgaWQ9InByb2plY3RfbG9nbyI+CisgICAgICAgPHdpY2tldDpsaW5rPgorCSAgICAgPGltZyBzcmM9InByb2plY3RfbG9nby5wbmciIGFsdD0iYmFubmVyIGltYWdlIiBjbGFzcz0iYmFubmVyIi8+CisgICAgICAgPC93aWNrZXQ6bGluaz4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJ1c2VyX3N0YXR1cyI+CisJCTxzcGFuPkFwYWNoZSBPT0RUIFBDUyBPcGVyYXRvciBJbnRlcmZhY2U8L3NwYW4+CisgICAgICAgIDwhLS1UT0RPOiBhZGQgV2lja2V0IGxvZ29uIHdpZGdldCBoZXJlIC0tPgorCQk8c3BhbiBpZD0ibG9nb25fd2lkZ2V0Ii8+CisgICAgPC9kaXY+Cis8L2Rpdj4KKzxkaXYgaWQ9Im5hdiI+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0iaG9tZV9saW5rIiBjbGFzcz0iZmlyc3QiPgorCQkJCQkgIDxzcGFuPgorCQkJCQkgICAgSG9tZQorCQkJCQkgIDwvc3Bhbj4KKwkJCQkJPC9hPgorICAgICAgICA8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImZtYnJvd3Nlcl9saW5rIiA+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBGaWxlIENhdGFsb2cgQnJvd3NlCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0id21vbml0b3JfbGluayIgaWQ9Indtb25pdG9yX2xpbmsiID4KKwkJCQkJICA8c3Bhbj4KKwkJCQkJICAgIFdvcmtmbG93IE1vbml0b3IKKwkJCQkJICA8L3NwYW4+CisJCQkJCTwvYT4KKyAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJnYW5nbGlhX2xpbmsiID4KKwkJCQkJICA8c3Bhbj4KKwkJCQkJICAgIFJlc291cmNlIE1vbml0b3IKKwkJCQkJICA8L3NwYW4+CisJCQkJCTwvYT4KKyAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJjb25maWdfbGluayI+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBDb25maWd1cmF0aW9uCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0iY3VyYXRlX2xpbmsiPgorICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgSW5nZXN0CisgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICA8L2E+CQkJCQkKKyAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJwY3NzdGF0dXNfbGluayIgaWQ9InBjc3N0YXR1c19saW5rIiBjbGFzcz0ibGFzdCI+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBQQ1MgU3RhdHVzCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+Cis8L2Rpdj4KKworPHdpY2tldDpjaGlsZC8+CisKKzxwPiZuYnNwOzwvcD4KKzxwPiZuYnNwOzwvcD4KKworPGRpdiBpZD0iZm9vdGVyIj4KKyAgICAgICAgPHAgaWQ9InBvd2VyZWQiPlBvd2VyZWQgYnkgPGEgaHJlZj0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy8iPkFwYWNoZSBPT0RUPC9hPjwvcD4KKyAgICAgICAgPHAgaWQ9ImZlZWRiYWNrIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImNvbnRhY3RfbGluayI+RmVlZGJhY2s8L2E+PC9wPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODU5NDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2UuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aTsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuY29uZmlnLkNvbmZpZ1BhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5zdGF0dXMuU3RhdHVzUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkV4dGVybmFsTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CisKKy8qKgorICoKKyAqIFByb3ZpZGVzIHRoZSBjb250cm9sbGVyIGZvciB0aGUgT1BTVUkgdGVtcGxhdGUuCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEJhc2VQYWdlIGV4dGVuZHMgT1BTVUlXZWJQYWdlIHsKKyAgCisgIHByb3RlY3RlZCBPcHN1aUFwcCBhcHA7CisgIAorICBwdWJsaWMgQmFzZVBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycyl7ICAgIAorICAgIHRoaXMuYXBwID0gKE9wc3VpQXBwKWdldEFwcGxpY2F0aW9uKCk7CisgICAgYWRkKG5ldyBMaW5rKCJob21lX2xpbmsiKXsKKyAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rI29uQ2xpY2soKQorICAgICAgICovCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgIHNldFJlc3BvbnNlUGFnZShhcHAuZ2V0SG9tZVBhZ2UoKSk7CisgICAgICB9CisgICAgfSk7CisgICAgCisgICAgYWRkKG5ldyBMaW5rKCJmbWJyb3dzZXJfbGluayIpeworICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICBzZXRSZXNwb25zZVBhZ2UoVHlwZXNQYWdlLmNsYXNzKTsgCisgICAgICB9CisgICAgfSk7CisgICAgCisgICAgYWRkKG5ldyBMaW5rKCJwY3NzdGF0dXNfbGluayIpeworICAgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFN0YXR1c1BhZ2UuY2xhc3MpOworICAgICAgICAKKyAgICAgIH0KKyAgICB9KTsKKyAgICAKKyAgICBhZGQobmV3IExpbmsoIndtb25pdG9yX2xpbmsiKXsKKyAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLmFkZCgic3RhdHVzIiwgIkFMTCIpOworICAgICAgICBwYXJhbXMuYWRkKCJwYWdlTnVtIiwgIjEiKTsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFdvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlLmNsYXNzLCBwYXJhbXMpOworICAgICAgICAKKyAgICAgIH0KKyAgICB9KTsKKyAgICAKKyAgICBhZGQobmV3IExpbmsoImNvbmZpZ19saW5rIil7CisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICBwYXJhbXMuYWRkKCJ0YWIiLCAiRmlsZSBNYW5hZ2VyIik7CisgICAgICAgICAgc2V0UmVzcG9uc2VQYWdlKENvbmZpZ1BhZ2UuY2xhc3MsIHBhcmFtcyk7ICAKKyAgICAgICAgfQorICAgIH0pOworICAgIAorICAgIGFkZChuZXcgTGluaygiY3VyYXRlX2xpbmsiKXsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFdvcmtiZW5jaFBhZ2UuY2xhc3MpOworICAgICAgfQorICAgIH0pOworICAgIAorICAgIGFkZChuZXcgRXh0ZXJuYWxMaW5rKCJnYW5nbGlhX2xpbmsiLCBhcHAuZ2V0R2FuZ2xpYVVybCgpKSk7CisgICAgCisgICAgYWRkKG5ldyBFeHRlcm5hbExpbmsoImNvbnRhY3RfbGluayIsICJtYWlsdG86IisoKE9wc3VpQXBwKWdldEFwcGxpY2F0aW9uKCkpLmdldEVtYWlsQ29udGFjdExpbmsoKSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZS5qcyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI5YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlLmpzCkBAIC0wLDAgKzEgQEAKKy8vIEFwYWNoZSBPT0RUIE9QU1VJIEpTClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX2NsYXNzaWMuY3NzIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX2NsYXNzaWMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjFkNGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xhc3NpYy5jc3MKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitib2R5eworCWJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsKKwljb2xvcjojMDAwMDAwOworCW1hcmdpbi10b3A6IDA7CisJbWFyZ2luLWxlZnQ6MDsgCisJbWFyZ2luLXJpZ2h0OjA7IAorCW1hcmdpbi1ib3R0b206MDsKKwl3aWR0aDoxMDAlOworCWhlaWdodDoxMDAlOworfQorCisjb3BzdWlfaGVhZGVyX3RibHsKKyAgYm9yZGVyOjBweDsKKyAgYm9yZGVyLXNwYWNpbmc6MHB4OworICB3aGl0ZS1zcGFjZTpub3dyYXA7CisgIHBhZGRpbmc6MHB4OworICB3aWR0aDoxMDAlOworCit9CisKKyNvcHN1aV9pbm5lcl9oZWFkZXJfdGJseworICBib3JkZXI6MHB4OworICBib3JkZXItc3BhY2luZzowcHg7CisgIHdoaXRlLXNwYWNlOm5vd3JhcDsKKyAgcGFkZGluZzowcHg7CisgIHdpZHRoOjEwMCU7CisKK30KKworI21lbnVfaW5uZXJfdGJseworICBwYWRkaW5nOjBweDsKKyAgYm9yZGVyLXNwYWNpbmc6MXB4OworICBib3JkZXI6MHB4OworICB3aWR0aDoxMDAlOworICBjb2xvcjp3aGl0ZTsgCit9CisKKyNtZW51X2lubmVyX3RibF9ob21leworICBiYWNrZ3JvdW5kLWNvbG9yOiM2NjY2NjY7CisgIGhlaWdodDoyM3B4OworICB3aWR0aDoyMHB4OworICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworI21lbnVfdGJsX2xpbmtzeworICBwYWRkaW5nOjBweDsKKyAgYm9yZGVyLXNwYWNpbmc6MXB4OworICBib3JkZXI6MHB4OworICB3aWR0aDoxMDAlOworICBjb2xvcjp3aGl0ZTsgCit9CisKKyNtZW51X2lubmVyX3RibF9saW5rc19mbXsKKyAgYmFja2dyb3VuZC1jb2xvcjojNjY2NjY2OworICBoZWlnaHQ6MjNweDsKKyAgdGV4dC1hbGlnbjpjZW50ZXI7Cit9CisKKyNtZW51X2lubmVyX3RibF9saW5rc193bXsKKyAgYmFja2dyb3VuZC1jb2xvcjojNjY2NjY2OworICBoZWlnaHQ6MjNweDsKKyAgdGV4dC1hbGlnbjpjZW50ZXI7Cit9CisKKyNtZW51X2lubmVyX3RibF9saW5rc19ybXsKKyAgYmFja2dyb3VuZC1jb2xvcjojNjY2NjY2OworICBoZWlnaHQ6MjNweDsKKyAgdGV4dC1hbGlnbjpjZW50ZXI7Cit9CisKKyNtZW51X2lubmVyX3RibF9saW5rc19jZmd7CisgIGJhY2tncm91bmQtY29sb3I6IzY2NjY2NjsKKyAgaGVpZ2h0OjIzcHg7CisgIHRleHQtYWxpZ246Y2VudGVyOworfQorCisjbWVudV9pbm5lcl90YmxfbGlua3NfcGNzc3RhdHsKKyAgYmFja2dyb3VuZC1jb2xvcjojNjY2NjY2OworICBoZWlnaHQ6MjNweDsKKyAgdGV4dC1hbGlnbjpjZW50ZXI7Cit9CisKKyNmb290ZXJfdGJseworICBwYWRkaW5nOjRweDsKKyAgYm9yZGVyLXNwYWNpbmc6MHB4OworICB3aWR0aDo3MzBweDsKKyAgYm9yZGVyOjBweDsKK30KKworLmJhbm5lcnsKKyAgYm9yZGVyOjBweDsKKyAgd2lkdGg6Mzc5cHg7CisgIGhlaWdodDo2NXB4OyAgCit9CisKKy5zcGFjZXJ7CisgIHdpZHRoOjczMHB4OworICBoZWlnaHQ6MnB4OyAgCit9CisKKy50ZHNwYWNlcnsKKyAgYmFja2dyb3VuZC1jb2xvcjojNjY2NjY2OworICBoZWlnaHQ6MjNweDsKKyAgd2lkdGg6MjAlOworfQorCisudGlnaHQtbm9ib3JkZXJ7CisgIHZlcnRpY2FsLXNwYWNpbmc6MHB4OworICB3aWR0aDoxMDAlOworICBib3JkZXI6MHB4OworfQorCisud2hpdGUgeworICBjb2xvcjp3aGl0ZTsKK30KKworLndoaXRlYmd7CisJYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsKK30KKworLmJsYWNrYmd7CisJYmFja2dyb3VuZC1jb2xvcjpibGFjazsKK30KKworLmJsYWNrTGluayB7CisgIGNvbG9yOiMwMDAwMDA7CisgIGxpbmUtaGVpZ2h0OjE4cHg7Cit9CisKKy5maXJzdEdvdkltZ3sKKyAgaGVpZ2h0OjM5cHg7CisgIHdpZHRoOjEzNnB4OworICBib3JkZXI6MHB4OworfQorCisubmFzYUhvbWVQYWdlSW1neworICBoZWlnaHQ6NDBweDsKKyAgd2lkdGg6NjFweDsKKyAgYm9yZGVyOjBweDsKK30KKworLmZlZWRiYWNreworICBmb250LWZhbWlseTpBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6MnB4OworfQorCitheworCXRleHQtZGVjb3JhdGlvbjpub25lOworfQorCithOmhvdmVyeworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Cit9CisKKyNjcml0ZXJpYV9mb3JtX2FkZF9lbGVtZW50X3ZhbHVleworCWZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKyNwcm9kdWN0X3RhYmxleworCWJvcmRlcjoxcHg7CisJYm9yZGVyLXNwYWNpbmc6MnB4OworCWJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7CisJd2lkdGg6ODAwcHg7Cit9CisKKyNwcm9kdWN0X3RhYmxlIHRkeworICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOworICBtYXJnaW46IDA7IAorICBwYWRkaW5nOiAycHg7Cit9CisKKyNwYWdpbmF0aW9uX3RhYmxleworCWJvcmRlci1zcGFjaW5nOjNweDsKKwl3aWR0aDoxMDAlOworfQorCisjcGFnaW5hdGlvbl90YWJsZV9yZXN1bHRfaGRyeworCXdpZHRoOjEwMHB4OworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJZm9udC13ZWlnaHQ6Ym9sZDsKK30KKworI2Nhc19mbV9icm93c2VyX3B0eXBlX3RhYmxleworICBwYWRkaW5nOjJweDsKKyAgYm9yZGVyLXNwYWNpbmc6MnB4OworICB3aWR0aDo4MDBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDsKK30KKworI2Nhc19mbV9icm93c2VyX3B0eXBlX3RhYmxlIHRkeworICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOworICBtYXJnaW46IDA7IAorICBwYWRkaW5nOiAycHg7Cit9CisKKy53b3JrZmxvd19zdGF0dXN7CisgICBib3JkZXItbGVmdDogMXB4OworICAgcGFkZGluZy1sZWZ0OiAxcHg7CisgICBib3JkZXItcmlnaHQ6IDFweDsKKyAgIHBhZGRpbmctcmlnaHQ6IDFweDsKKyAgIGJvcmRlci13aWR0aDogMXB4OworICAgYm9yZGVyLXRvcDowcHg7CisgICBib3JkZXItYm90dG9tOjBweDsKKyAgIGJvcmRlci1zdHlsZTpzb2xpZDsKKyAgIGJvcmRlci1jb2xvcjpibGFjazsJCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xhc3NpYy5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX2NsYXNzaWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg4OTUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX2NsYXNzaWMuaHRtbApAQCAtMCwwICsxLDM1OCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwKKwl4bWxuczp3aWNrZXQ9Imh0dHA6Ly93aWNrZXQuYXBhY2hlLm9yZy9kdGRzLmRhdGEvd2lja2V0LXhodG1sMS40LXN0cmljdC5kdGQiPgorPGhlYWQ+Cis8dGl0bGU+QXBhY2hlIE9PRFQgUENTIE9wZXJhdG9yIEludGVyZmFjZTwvdGl0bGU+Cis8d2lja2V0Omxpbms+CisJPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iQmFzZVBhZ2VfY2xhc3NpYy5jc3MiIC8+CisJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhc2NyaXB0IgorCQlzcmM9ImpxdWVyeS0xLjcubWluLmpzIj48L3NjcmlwdD4KKwk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHNyYz0iQmFzZVBhZ2VfY2xhc3NpYy5qcyI+PC9zY3JpcHQ+Cis8L3dpY2tldDpsaW5rPgorPHdpY2tldDpyZW1vdmU+CisJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKwk8IS0tCisJCWZ1bmN0aW9uIG1lbnVTZWxlY3RlZChjZWxsKSB7CisJCQljZWxsLmNzcyh7CisJCQkJJ2JhY2tncm91bmQtY29sb3InIDogJyMwMDY2OTknCisJCQl9KTsKKwkJfQorCQlmdW5jdGlvbiBtZW51Tm90U2VsZWN0ZWQoY2VsbCkgeworCQkJY2VsbC5jc3MoeworCQkJCSdiYWNrZ3JvdW5kLWNvbG9yJyA6ICcjNjY2NjY2JworCQkJfSk7CisJCX0KKworCQlmdW5jdGlvbiBzdWJNZW51U2VsZWN0ZWQoaWQpIHsKKwkJCXZhciB4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJvd3M7CisJCQl2YXIgeSA9IHhbMF0uY2VsbHM7CisJCQl5WzBdLmlubmVySFRNTCA9ICI8aW1nIHNyYz0nc2VsbGVmdGNvcm5lci5naWYnPiI7CisJCQl5WzFdLmJnQ29sb3IgPSAiIzk5Q0NGRiI7CisJCQl5WzJdLmlubmVySFRNTCA9ICI8aW1nIHNyYz0nc2VscmlnaHRjb3JuZXIuZ2lmJz4iOworCQl9CisKKwkJZnVuY3Rpb24gc3ViTWVudU5vdFNlbGVjdGVkKGlkKSB7CisJCQl2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yb3dzOworCQkJdmFyIHkgPSB4WzBdLmNlbGxzOworCQkJeVswXS5pbm5lckhUTUwgPSAiPGltZyBzcmM9J2xlZnRjb3JuZXIuZ2lmJz4iOworCQkJeVsxXS5iZ0NvbG9yID0gIiNjY2NjY2MiOworCQkJeVsyXS5pbm5lckhUTUwgPSAiPGltZyBzcmM9J3JpZ2h0Y29ybmVyLmdpZic+IjsKKwkJfQorCisJCXZhciBpbnRlcmZhY2VpbWcgPSBuZXcgQXJyYXkoKTsKKwkJZnVuY3Rpb24gcHJlbG9hZGltZygpIHsKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCWludGVyZmFjZWltZ1tpXSA9IG5ldyBJbWFnZSgpOworCQkJCWludGVyZmFjZWltZ1tpXS5zcmMgPSBhcmd1bWVudHNbaV07CisJCQl9CisJCX0KKworCQkvLyBFbnRlciBmdWxsIFVSTCB0byBpbWFnZSB0YWJzIHRvIHByZWxvYWQgYmVsb3cuIFNlcGFyYXRlIHdpdGggY29tbWE6CisKKwkJcHJlbG9hZGltZygicmlnaHRjb3JuZXIuZ2lmIiwgImxlZnRjb3JuZXIuZ2lmIiwgInNlbHJpZ2h0Y29ybmVyLmdpZiIsCisJCQkJInNlbGxlZnRjb3JuZXIuZ2lmIik7CisJLy8tLT4KKwk8L3NjcmlwdD4KKzwvd2lja2V0OnJlbW92ZT4KKzwvaGVhZD4KKworPG1hcCBuYW1lPSJNYXAiPgorCTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjkxLDM2LDI3Miw1NCIgaHJlZj0iaHR0cDovL3d3dy5jYWx0ZWNoLmVkdS8iCisJCWFsdD0iQ2FsdGVjaCIgLz4KKwk8YXJlYSBzaGFwZT0iY2lyY2xlIiBjb29yZHM9IjYxLDM0LDI0IiBocmVmPSJodHRwOi8vd3d3Lm5hc2EuZ292IgorCQlhbHQ9Ik5BU0EiIC8+CisJPGFyZWEgc2hhcGU9InJlY3QiIGNvb3Jkcz0iOTEsMTEsMjc4LDM1IgorCQlocmVmPSJodHRwOi8vd3d3LmpwbC5uYXNhLmdvdi8iCisJCWFsdD0iRGFpbHkgUGxhbmV0IGUtTmV3cyBmb3IgdGhlIEpQTCBDb21tdW5pdHkiIC8+Cis8L21hcD4KKworPGJvZHk+CisJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBhbGlnbj0iY2VudGVyIgorCQliZ2NvbG9yPSIjRkZGRkZGIiB3aWR0aD0iNzMwIj4KKwkJPHRyIGNsYXNzPSJibGFja2JnIj4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6IDEwcHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxcHg7IiAvPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6IDczMnB4OyI+PHdpY2tldDpsaW5rPgorCQkJCQk8aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiCisJCQkJCQlzdHlsZT0id2lkdGg6IDczMHB4OyBoZWlnaHQ6IDEwcHg7Ij4KKwkJCQk8L3dpY2tldDpsaW5rPjwvdGQ+CisJCQk8dGQgc3R5bGU9IndpZHRoOiAxMHB4OyI+PHdpY2tldDpsaW5rPgorCQkJCQk8aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiCisJCQkJCQlzdHlsZT0id2lkdGg6IDEwcHg7IGhlaWdodDogMXB4OyIgLz4KKwkJCQk8L3dpY2tldDpsaW5rPjwvdGQ+CisJCTwvdHI+CisJCTx0cj4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6MTBweDsiPjx3aWNrZXQ6bGluaz48aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiIHN0eWxlPSJ3aWR0aDoxMHB4O2hlaWdodDoxcHg7Ii8+PC93aWNrZXQ6bGluaz48L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDo3MzJweDsiPjx3aWNrZXQ6bGluaz48aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiIHN0eWxlPSJ3aWR0aDo3MzBweDtoZWlnaHQ6MTBweDsiLz48L3dpY2tldDpsaW5rPjwvdGQ+CisJCQk8dGQgc3R5bGU9IndpZHRoOjEwcHg7Ij48d2lja2V0Omxpbms+PGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIiBzdHlsZT0id2lkdGg6MTBweDtoZWlnaHQ6MXB4OyIvPjwvd2lja2V0Omxpbms+PC90ZD4KKwkJPC90cj4KKwkJPHRyPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDoxMHB4OyI+PHdpY2tldDpsaW5rPjxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIgc3R5bGU9IndpZHRoOjEwcHg7aGVpZ2h0OjFweDsiLz48L3dpY2tldDpsaW5rPjwvdGQ+CisJCQk8dGQgc3R5bGU9IndpZHRoOjczMnB4O3ZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KKworCQkJCTx0YWJsZSBpZD0ib3BzdWlfaGVhZGVyX3RibCI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZD4KKwkJCQkJCQk8dGFibGUgaWQ9Im9wc3VpX2lubmVyX2hlYWRlcl90YmwiPgorCQkJCQkJCQk8dHI+CisJCQkJCQkJCQk8dGQgc3R5bGU9IndpZHRoOiAzNzlweDsgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjOyI+PHdpY2tldDpsaW5rPgorCQkJCQkJCQkJCQk8aW1nIHNyYz0ibmFzYV9sb2dvLmdpZiIgYWx0PSJiYW5uZXIgaW1hZ2UiIGNsYXNzPSJiYW5uZXIiCisJCQkJCQkJCQkJCQl1c2VtYXA9IiNNYXAiIC8+CisJCQkJCQkJCQkJPC93aWNrZXQ6bGluaz4KKwkJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCQk8dGQKKwkJCQkJCQkJCQlzdHlsZT0iaGVpZ2h0OiA3MHB4OyB3aWR0aDogMTM2cHg7IGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ij48L3RkPgorCQkJCQkJCQkJPHRkCisJCQkJCQkJCQkJc3R5bGU9IndpZHRoOiAyMDVweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDY2OTsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyI+CisJCQkJCQkJCQkJPCEtLVRPRE86IGFkZCBXaWNrZXQgbG9nb24gd2lkZ2V0IGhlcmUgLS0+IDxzcGFuCisJCQkJCQkJCQkJaWQ9ImxvZ29uX3dpZGdldCIgLz4gPHNwYW4KKwkJCQkJCQkJCQlzdHlsZT0iZm9udC1zaXplOiAxNHB4OyBjb2xvcjogd2hpdGU7Ij5XZWxjb21lIHRvIHRoZQorCQkJCQkJCQkJCQlPcGVyYXRvciBJbnRlcmZhY2UgV2ViIHNpdGU8L3NwYW4+IDxiciAvPiA8YnIgLz4KKwkJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCTwvdHI+CisJCQkJCQkJPC90YWJsZT4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZD48d2lja2V0Omxpbms+CisJCQkJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIgY2xhc3M9InNwYWNlciIgLz4KKwkJCQkJCQk8L3dpY2tldDpsaW5rPgorCQkJCQkJPC90ZD4KKwkJCQkJPC90cj4KKwkJCQkJPHRyPgorCQkJCQkJPHRkIGNsYXNzPSJ3aGl0ZSI+CisJCQkJCQkJPHRhYmxlIGlkPSJtZW51X2lubmVyX3RibCI+CisJCQkJCQkJCTx0cj4KKwkJCQkJCQkJCTx0ZCBpZD0ibWVudV9pbm5lcl90YmxfaG9tZSIKKwkJCQkJCQkJCQlvbk1vdXNlT3Zlcj0ibWVudVNlbGVjdGVkKCQodGhpcykpIgorCQkJCQkJCQkJCW9uTW91c2VPdXQ9Im1lbnVOb3RTZWxlY3RlZCgkKHRoaXMpKSI+PGEgaHJlZj0iIyIKKwkJCQkJCQkJCQl3aWNrZXQ6aWQ9ImhvbWVfbGluayIgY2xhc3M9IndoaXRlIj5IT01FPC9hPgorCQkJCQkJCQkJPC90ZD4KKwkJCQkJCQkJCTx0ZCBjbGFzcz0idGRzcGFjZXIiPjwvdGQ+CisJCQkJCQkJCQk8dGQgY2xhc3M9InRkc3BhY2VyIj48L3RkPgorCQkJCQkJCQkJPHRkIGNsYXNzPSJ0ZHNwYWNlciI+PC90ZD4KKwkJCQkJCQkJCTx0ZCBjbGFzcz0idGRzcGFjZXIiPjwvdGQ+CisJCQkJCQkJCTwvdHI+CisJCQkJCQkJPC90YWJsZT4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZD48d2lja2V0Omxpbms+CisJCQkJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIgY2xhc3M9InNwYWNlciIKKwkJCQkJCQkJCXN0eWxlPSJoZWlnaHQ6IDFweDsiIC8+CisJCQkJCQkJPC93aWNrZXQ6bGluaz4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZCBzdHlsZT0id2lkdGg6IDEwMCUiPjx3aWNrZXQ6bGluaz4KKwkJCQkJCQkJPGltZyBzcmM9ImJhbm5lci5qcGciIGNsYXNzPSJ0aWdodC1ub2JvcmRlciIgYWx0PSJCYW5uZXIiIC8+CisJCQkJCQkJPC93aWNrZXQ6bGluaz4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZCBjbGFzcz0id2hpdGUiPgorCQkJCQkJCTx0YWJsZSBpZD0ibWVudV90YmxfbGlua3MiPgorCQkJCQkJCQk8dHI+CisJCQkJCQkJCQk8dGQgaWQ9Im1lbnVfaW5uZXJfdGJsX2xpbmtzX2ZtIgorCQkJCQkJCQkJCW9uTW91c2VPdmVyPSJtZW51U2VsZWN0ZWQoJCh0aGlzKSkiCisJCQkJCQkJCQkJb25Nb3VzZU91dD0ibWVudU5vdFNlbGVjdGVkKCQodGhpcykpIj48YSBocmVmPSIjIgorCQkJCQkJCQkJCXdpY2tldDppZD0iZm1icm93c2VyX2xpbmsiIGNsYXNzPSJibGFja0xpbmsiPiA8c3BhbgorCQkJCQkJCQkJCQlzdHlsZT0iY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDsiPiBGaWxlIENhdGFsb2cKKwkJCQkJCQkJCQkJCUJyb3dzZSA8L3NwYW4+IDwvYT4KKwkJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCQk8dGQgaWQ9Im1lbnVfaW5uZXJfdGJsX2xpbmtzX3dtIgorCQkJCQkJCQkJCW9uTW91c2VPdmVyPSJtZW51U2VsZWN0ZWQoJCh0aGlzKSkiCisJCQkJCQkJCQkJb25Nb3VzZU91dD0ibWVudU5vdFNlbGVjdGVkKCQodGhpcykpIj48YSBocmVmPSIjIgorCQkJCQkJCQkJCXdpY2tldDppZD0id21vbml0b3JfbGluayIgaWQ9Indtb25pdG9yX2xpbmsiIGNsYXNzPSJibGFja0xpbmsiPgorCQkJCQkJCQkJCQk8c3BhbiBzdHlsZT0iY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDsiPgorCQkJCQkJCQkJCQkJV29ya2Zsb3cgTW9uaXRvciA8L3NwYW4+IDwvYT4KKwkJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCQk8dGQgaWQ9Im1lbnVfaW5uZXJfdGJsX2xpbmtzX3JtIgorCQkJCQkJCQkJCW9uTW91c2VPdmVyPSJtZW51U2VsZWN0ZWQoJCh0aGlzKSkiCisJCQkJCQkJCQkJb25Nb3VzZU91dD0ibWVudU5vdFNlbGVjdGVkKCQodGhpcykpIj48YSBocmVmPSIjIgorCQkJCQkJCQkJCXdpY2tldDppZD0iZ2FuZ2xpYV9saW5rIiBjbGFzcz0iYmxhY2tMaW5rIj4gPHNwYW4KKwkJCQkJCQkJCQkJc3R5bGU9ImNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gUmVzb3VyY2UKKwkJCQkJCQkJCQkJCU1vbml0b3IgPC9zcGFuPiA8L2E+CisJCQkJCQkJCQk8L3RkPgorCQkJCQkJCQkJPHRkIGlkPSJtZW51X2lubmVyX3RibF9saW5rc19jZmciCisJCQkJCQkJCQkJb25Nb3VzZU92ZXI9Im1lbnVTZWxlY3RlZCgkKHRoaXMpKSIKKwkJCQkJCQkJCQlvbk1vdXNlT3V0PSJtZW51Tm90U2VsZWN0ZWQoJCh0aGlzKSkiPjxhIGhyZWY9IiMiCisJCQkJCQkJCQkJd2lja2V0OmlkPSJjb25maWdfbGluayIgY2xhc3M9ImJsYWNrTGluayI+IDxzcGFuCisJCQkJCQkJCQkJCXN0eWxlPSJjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyI+CisJCQkJCQkJCQkJCQlDb25maWd1cmF0aW9uIDwvc3Bhbj4gPC9hPgorCQkJCQkJCQkJPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0ibWVudV9pbm5lcl90YmxfbGlua3NfY2ZnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VPdmVyPSJtZW51U2VsZWN0ZWQoJCh0aGlzKSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZU91dD0ibWVudU5vdFNlbGVjdGVkKCQodGhpcykpIj48YSBocmVmPSIjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpY2tldDppZD0iY3VyYXRlX2xpbmsiIGNsYXNzPSJibGFja0xpbmsiPiA8c3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDsiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5nZXN0IDwvc3Bhbj4gPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4JCQkJCQkJCQkKKwkJCQkJCQkJCTx0ZCBpZD0ibWVudV9pbm5lcl90YmxfbGlua3NfcGNzc3RhdCIKKwkJCQkJCQkJCQlvbk1vdXNlT3Zlcj0ibWVudVNlbGVjdGVkKCQodGhpcykpIgorCQkJCQkJCQkJCW9uTW91c2VPdXQ9Im1lbnVOb3RTZWxlY3RlZCgkKHRoaXMpKSI+PGEgaHJlZj0iIyIKKwkJCQkJCQkJCQl3aWNrZXQ6aWQ9InBjc3N0YXR1c19saW5rIiBpZD0icGNzc3RhdHVzX2xpbmsiCisJCQkJCQkJCQkJY2xhc3M9ImJsYWNrTGluayI+IDxzcGFuCisJCQkJCQkJCQkJCXN0eWxlPSJjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyI+IFBDUyBTdGF0dXMgPC9zcGFuPgorCQkJCQkJCQkJPC9hPgorCQkJCQkJCQkJPC90ZD4KKwkJCQkJCQkJPC90cj4KKwkJCQkJCQk8L3RhYmxlPgorCQkJCQkJPC90ZD4KKwkJCQkJPC90cj4KKwkJCQkJPHRyPgorCQkJCQkJPHRkPjx3aWNrZXQ6bGluaz4KKwkJCQkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIiBjbGFzcz0ic3BhY2VyIgorCQkJCQkJCQkJc3R5bGU9ImhlaWdodDogMXB4OyI+CisJCQkJCQkJPC93aWNrZXQ6bGluaz4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisKKwkJCQk8L3RhYmxlPgorCQkJPC90ZD4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6MTBweDsiPjx3aWNrZXQ6bGluaz48aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiIHN0eWxlPSJ3aWR0aDoxMHB4O2hlaWdodDoxcHg7Ii8+PC93aWNrZXQ6bGluaz4KKwkJCTwvdGQ+CisJCTwvdHI+CisKKwkJPHRyPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogMTBweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDFweDsiIC8+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogNzMycHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogNzMwcHg7IGhlaWdodDogMTBweDsiPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6IDEwcHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxcHg7IiAvPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJPC90cj4KKwkJPHRyPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDoxMHB4OyI+PHdpY2tldDpsaW5rPjxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIgc3R5bGU9IndpZHRoOjEwcHg7aGVpZ2h0OjEwMHB4OyIvPjwvd2lja2V0Omxpbms+PC90ZD4KKwkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDt3aWR0aDogNzMycHg7Ij4KKwkJCSAgCisJCQkgIDx3aWNrZXQ6Y2hpbGQgLz4KKwkJCQorCQkJCisJCQk8L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDoxMHB4OyI+CisJCQkgIDx3aWNrZXQ6bGluaz48aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiIHN0eWxlPSJ3aWR0aDoxMHB4O2hlaWdodDozMDBweDsiLz48L3dpY2tldDpsaW5rPgorCQkJPC90ZD4KKwkJPC90cj4KKwkJPHRyPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogMTBweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDFweDsiIC8+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogNzMycHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogNzMwcHg7IGhlaWdodDogMTBweDsiPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6IDEwcHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxcHg7IiAvPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJPC90cj4KKworCQk8dHI+CisJCQk8dGQgc3R5bGU9IndpZHRoOiAxMHB4OyI+PHdpY2tldDpsaW5rPgorCQkJCQk8aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiCisJCQkJCQlzdHlsZT0id2lkdGg6IDEwcHg7IGhlaWdodDogMXB4OyIgLz4KKwkJCQk8L3dpY2tldDpsaW5rPjwvdGQ+CisJCQk8dGQgc3R5bGU9IndpZHRoOiA3MzJweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiA3MzBweDsgaGVpZ2h0OiAxMHB4OyI+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogMTBweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDFweDsiIC8+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQk8L3RyPgorCQk8dHI+CisJCQk8dGQgd2lkdGg9IjEwIj48d2lja2V0Omxpbms+PGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIiBzdHlsZT0id2lkdGg6MTBweDtoZWlnaHQ6MXB4OyIvPjwvd2lja2V0Omxpbms+PC90ZD4KKworCQkJPHRkIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNjY2NjY2M7d2lkdGg6NzMycHg7Ij4KKworCisJCQkJPHRhYmxlIGlkPSJmb290ZXJfdGJsIj4KKwkJCQkJPHRyPgorCQkJCQkJPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyB3aWR0aDogMTYwcHg7Ij48YQorCQkJCQkJCXRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LmZpcnN0Z292Lmdvdi8iPiA8d2lja2V0Omxpbms+CisJCQkJCQkJCQk8aW1nIGNsYXNzPSJmaXJzdEdvdkltZyIgc3JjPSJmb290ZXJfaW1hZ2UxLmdpZiIgLz4KKwkJCQkJCQkJPC93aWNrZXQ6bGluaz4gPC9hPgorCQkJCQkJPC90ZD4KKwkJCQkJCTx0ZCBzdHlsZT0id2lkdGg6IDIwMHB4OyI+PGEgdGFyZ2V0PSJfYmxhbmsiCisJCQkJCQkJaHJlZj0iaHR0cDovL3d3dy5qcGwubmFzYS5nb3YvY29weXJpZ2h0cy5jZm0iPisgSlBML0NhbHRlY2gKKwkJCQkJCQkJUHJpdmFjeS9Db3B5cmlnaHQgPC9hPgorCQkJCQkJPC90ZD4KKwkJCQkJCTx0ZCBzdHlsZT0id2lkdGg6IDYxcHg7Ij48YSB0YXJnZXQ9Il9ibGFuayIKKwkJCQkJCQlocmVmPSJodHRwOi8vd3d3Lm5hc2EuZ292L2hvbWUvaW5kZXguaHRtbCI+IDx3aWNrZXQ6bGluaz4KKwkJCQkJCQkJCTxpbWcgY2xhc3M9Im5hc2FIb21lUGFnZUltZyIgYWx0PSJOQVNBIEhvbWUgUGFnZSIKKwkJCQkJCQkJCQlzcmM9ImZvb3Rlcl9pbWFnZTIuZ2lmIiAvPgorCQkJCQkJCQk8L3dpY2tldDpsaW5rPiA8L2E+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkIHN0eWxlPSJ3aWR0aDogMjgwcHg7Ij48c3BhbiBjbGFzcz0iZmVlZGJhY2siPiZuYnNwOzwvc3Bhbj4KKwkJCQkJCQk8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImNvbnRhY3RfbGluayI+RmVlZGJhY2s8L2E+CisJCQkJCQk8L3RkPgorCQkJCQk8L3RyPgorCQkJCTwvdGFibGU+IDx3aWNrZXQ6cmVtb3ZlPgorCQkJCQk8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgorCQkJCQkJPHA+CisJCQkJCQkJUG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vb29kdC5hcGFjaGUub3JnLyI+QXBhY2hlIE9PRFQ8L2E+CisJCQkJCQk8L3A+CisJCQkJCTwvZGl2PgorCQkJCTwvd2lja2V0OnJlbW92ZT4KKwkJCTwvdGQ+CisJCQk8dGQgc3R5bGU9IndpZHRoOjEwcHg7Ij48d2lja2V0Omxpbms+PGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIiBzdHlsZT0id2lkdGg6MTBweDtoZWlnaHQ6OHB4OyIvPjwvd2lja2V0Omxpbms+PC90ZD4KKwkJPC90cj4KKwkJPHRyPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogMTBweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDFweDsiIC8+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogNzMycHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogNzMwcHg7IGhlaWdodDogMTBweDsiPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJCTx0ZCBzdHlsZT0id2lkdGg6IDEwcHg7Ij48d2lja2V0Omxpbms+CisJCQkJCTxpbWcgc3JjPSJzcGFjZXIuZ2lmIiBhbHQ9InNwYWNlciIKKwkJCQkJCXN0eWxlPSJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxcHg7IiAvPgorCQkJCTwvd2lja2V0Omxpbms+PC90ZD4KKwkJPC90cj4KKworCisJCTx0ciBjbGFzcz0iYmxhY2tiZyI+CisJCQk8dGQgc3R5bGU9IndpZHRoOiAxMHB4OyI+PHdpY2tldDpsaW5rPgorCQkJCQk8aW1nIHNyYz0ic3BhY2VyLmdpZiIgYWx0PSJzcGFjZXIiCisJCQkJCQlzdHlsZT0id2lkdGg6IDEwcHg7IGhlaWdodDogMXB4OyIgLz4KKwkJCQk8L3dpY2tldDpsaW5rPjwvdGQ+CisJCQk8dGQgc3R5bGU9IndpZHRoOiA3MzJweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiA3MzBweDsgaGVpZ2h0OiAxMHB4OyI+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQkJPHRkIHN0eWxlPSJ3aWR0aDogMTBweDsiPjx3aWNrZXQ6bGluaz4KKwkJCQkJPGltZyBzcmM9InNwYWNlci5naWYiIGFsdD0ic3BhY2VyIgorCQkJCQkJc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDFweDsiIC8+CisJCQkJPC93aWNrZXQ6bGluaz48L3RkPgorCQk8L3RyPgorCTwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xhc3NpYy5qcyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZV9jbGFzc2ljLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGUxYzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xhc3NpYy5qcwpAQCAtMCwwICsxLDUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2Z1bmN0aW9uIG1lbnVTZWxlY3RlZChjZWxsKSB7CisJY2VsbC5jc3MoeworCQknYmFja2dyb3VuZC1jb2xvcicgOiAnIzAwNjY5OScKKwl9KTsKK30KK2Z1bmN0aW9uIG1lbnVOb3RTZWxlY3RlZChjZWxsKSB7CisJY2VsbC5jc3MoeworCQknYmFja2dyb3VuZC1jb2xvcicgOiAnIzY2NjY2NicKKwl9KTsKK30KKworZnVuY3Rpb24gc3ViTWVudVNlbGVjdGVkKGlkKSB7CisJdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucm93czsKKwl2YXIgeSA9IHhbMF0uY2VsbHM7CisJeVswXS5pbm5lckhUTUwgPSAiPGltZyBzcmM9Jy9pbWFnZXMvc2VsbGVmdGNvcm5lci5naWYnPiI7CisJeVsxXS5iZ0NvbG9yID0gIiM5OUNDRkYiOworCXlbMl0uaW5uZXJIVE1MID0gIjxpbWcgc3JjPScvaW1hZ2VzL3NlbHJpZ2h0Y29ybmVyLmdpZic+IjsKK30KKworZnVuY3Rpb24gc3ViTWVudU5vdFNlbGVjdGVkKGlkKSB7CisJdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucm93czsKKwl2YXIgeSA9IHhbMF0uY2VsbHM7CisJeVswXS5pbm5lckhUTUwgPSAiPGltZyBzcmM9Jy9pbWFnZXMvbGVmdGNvcm5lci5naWYnPiI7CisJeVsxXS5iZ0NvbG9yID0gIiNjY2NjY2MiOworCXlbMl0uaW5uZXJIVE1MID0gIjxpbWcgc3JjPScvaW1hZ2VzL3JpZ2h0Y29ybmVyLmdpZic+IjsKK30KKwordmFyIGludGVyZmFjZWltZyA9IG5ldyBBcnJheSgpOworZnVuY3Rpb24gcHJlbG9hZGltZygpIHsKKwlmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJaW50ZXJmYWNlaW1nW2ldID0gbmV3IEltYWdlKCk7CisJCWludGVyZmFjZWltZ1tpXS5zcmMgPSBhcmd1bWVudHNbaV07CisJfQorfQorCisvL3ByZWxvYWRpbWcoIi9pbWFnZXMvcmlnaHRjb3JuZXIuZ2lmIiwgIi9pbWFnZXMvbGVmdGNvcm5lci5naWYiLCAiL2ltYWdlcy9zZWxyaWdodGNvcm5lci5naWYiLAorLy8JCSIvaW1hZ2VzL3NlbGxlZnRjb3JuZXIuZ2lmIik7CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xlYW53aGl0ZS5jc3MgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xlYW53aGl0ZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4M2U5NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZV9jbGVhbndoaXRlLmNzcwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgYmcgICAgICAgICAgICAgIzMzNDQ1NQorIGJvcmRlcnMtdG9wICAgICMyZTNlNGUKKyBib3JkZXItbGVmdCAgICAjMzA0MDUwCisgYmctdGV4dCAgICAgICAgIzE2MjYzNgorIGxpbmstdGV4dCAgICAgICNjMGMwYzAKKyovCisKK2JvZHkgeworICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRjsKKyAgICBtYXJnaW46MHB4OworICAgIHBhZGRpbmc6MHB4OworICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiBzbWFsbDsKK30KKworI2NvbnRlbnQgeworCXBhZGRpbmc6IDEwcHg7CQorfQorCisjaGVhZGVyIHsKKyAgICB3aWR0aDoxMDAlOworICAgIGhlaWdodDo4MHB4OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjMmUzZTRlOworfQorCisjcHJvamVjdF9sb2dvIHsKKyAgICBmbG9hdDpsZWZ0OworfQorCisjdXNlcl9zdGF0dXMgeworICAgIGZsb2F0OnJpZ2h0OworICAgIHBhZGRpbmc6MTBweDsKKyAgICBjb2xvcjojMTYyNjM2OworfQorCisjbmF2IHsKKyAgICBtYXJnaW4tdG9wOjEwcHg7Cit9CisKKyNuYXYgYSB7CisgICAgY29sb3I6IzE5MzY3ODsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBmb250LXdlaWdodDogYm9sZGVyOworICAgIGJvcmRlci1yaWdodDpzb2xpZCAxcHggIzQ1NjsKKyAgICBwYWRkaW5nOiAzcHggMjBweDsKK30KKyNuYXYgYS5maXJzdCB7Cit9CisjbmF2IGEubGFzdCB7CisgICAgYm9yZGVyLXJpZ2h0Om5vbmU7Cit9CisjbmF2IGE6aG92ZXIgeworICAgIGNvbG9yOiM0OTY1QTY7Cit9CisKKyNmb290ZXJ7CisgIHBvc2l0aW9uOmZpeGVkOworICBib3R0b206MHB4OworICB3aWR0aDoxMDAlOworICBoZWlnaHQ6ODBweDsKKyAgcGFkZGluZzo1cHggMHB4OworICBib3JkZXItc3BhY2luZzowcHg7CisgIGJvcmRlci10b3A6c29saWQgMXB4ICMyZTNlNGU7CisgIGJhY2tncm91bmQtY29sb3I6ICNFRUU7CisgIGZvbnQtc2l6ZTo5MCU7CisgIHotaW5kZXg6MTAwMDA7Cit9CisjZm9vdGVyIGEgeworICBjb2xvcjojMTkzNjc4OworfQorCisjZm9vdGVyIHAgeworICB3aWR0aDoxMDAlOworICBwYWRkaW5nOjVweCAxNXB4OworICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworI2ZlZWRiYWNrIHsKKyAgICBtYXJnaW46MHB4OworICAgIG1hcmdpbi10b3A6LTIwcHg7CisgICAgZm9udC1zaXplOjkwJTsKK30KKworI3Bvd2VyZWQsI2ZlZWRiYWNrIHsKKyAgbWFyZ2luLWxlZnQ6LTMwcHg7Cit9CisKKworYXsKKwljb2xvcjogcmdiKDMxLCAzMSwgMTA3KTsKK30KKworYTpob3ZlcnsKK30KKworYTp2aXNpdGVkIHsKKwljb2xvcjogcHVycGxlOwkKK30KKworYSBpbWcsICB7CisgICAgYm9yZGVyOm5vbmU7Cit9CisKKy8qKgorICogSEVBREVSUyAKKyoqLworaDEsIGgyLCBoMywgaDQsIGg1IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiMxOTM2Nzg7CisgICAgY29sb3I6I0ZGRjsKKyAgICBib3JkZXItdG9wOnNvbGlkIDFweCAjREREOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICNEREQ7CisgICAgcGFkZGluZzo4cHg7Cit9CitoMSB7CisKK30KKworaDIgeworCit9CisKK2gzIHsKKyAgICAKK30KKworaDQgeworICAgIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7CisgICAgY29sb3I6ICM0NDQ7CisgICAgYm9yZGVyLXRvcDpub25lOworICAgIG1hcmdpbjoxMHB4OworfQorCitoNSB7CisKK30KKworLyoqCisgKiBUQUJMRVMKKyoqLwordGFibGUgeworCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7CisJZm9udC1zaXplOjExcHg7CisJY29sb3I6IzMzMzMzMzsKKwlib3JkZXItd2lkdGg6IDFweDsKKwlib3JkZXItY29sb3I6ICMzMDQwNTA7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKK30KK3RhYmxlIHRoIHsKKwlib3JkZXItd2lkdGg6IDFweDsKKwlwYWRkaW5nOiA4cHg7CisJYm9yZGVyLXN0eWxlOiBzb2xpZDsKKwlib3JkZXItY29sb3I6ICMxOTM2Nzg7CisJYmFja2dyb3VuZC1jb2xvcjogIzE5MzY3ODsKKwljb2xvcjogI0ZGRjsKK30KK3RhYmxlIHRkIHsKKwlib3JkZXItd2lkdGg6IDFweDsKKwlwYWRkaW5nOiA4cHg7CisJYm9yZGVyLXN0eWxlOiBzb2xpZDsKKwlib3JkZXItY29sb3I6ICMzMDQwNTA7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKK30KKworCisvKioKKyAqIEJSRUFEQ1JVTUJTCisgKi8KK2RpdiNicmVhZGNydW1icyB7CisgICAgY29sb3I6Izc3NzsKKyAgICBtYXJnaW4tbGVmdDoyMHB4OworICAgIG1hcmdpbi10b3A6MTVweDsKK30KKworZGl2I2JyZWFkY3J1bWJzIGEgeworCit9CisKK2RpdiNicmVhZGNydW1icyBzcGFuLmRpdmlkZXIgeworICAgIHBhZGRpbmc6MHB4IDVweDsKK30KKworCisKKworCisKKy8qKgorICogRklMRSBNQU5BR0VSOiBUeXBlcy5jc3MKKyoqLyAKKyNjYXNfZm1fYnJvd3Nlcl9wdHlwZV90YWJsZXsKKworfQorCisjY2FzX2ZtX2Jyb3dzZXJfcHR5cGVfdGFibGUgdGR7CisKK30KKworLyoqCisgKiBGSUxFIE1BTkFHRVI6IFR5cGVCcm93c2VyLmNzcworKiovIAorCisjY3JpdGVyaWFfZm9ybV9hZGRfZWxlbWVudF92YWx1ZXsKKwlmb250LXdlaWdodDpib2xkOworfQorCisjcHJvZHVjdF90YWJsZXsKKworfQorCisjcHJvZHVjdF90YWJsZSB0ZHsKKworfQorCisjcGFnaW5hdGlvbl90YWJsZXsKKwlib3JkZXItc3BhY2luZzozcHg7CisJd2lkdGg6MTAwJTsKK30KKworI3BhZ2luYXRpb25fdGFibGVfcmVzdWx0X2hkcnsKKwl3aWR0aDoxMDBweDsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworCWZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKy8qKgorICogRklMRSBNQU5BR0VSOiBQcm9kdWN0QnJvd3Nlci5jc3MKKyoqLyAKKyNtZXRfdGFibGV7CisKK30KKworI21ldF9lbGVtX25hbWV7CisJCit9CisKKyNtZXRfdmFsdWVzX3RhYmxleworCit9CisKKy5uYWRheworCQorfQorCisjcmVmX3RhYmxleworCQorfQorCisjcmVmX3RhYmxlX2hkcnsKKwkKK30KKworLyoqCisgKiBGSUxFIE1BTkFHRVI6IFByb2R1Y3RSZWZzQnJvd3Nlci5jc3MKKyoqLyAKKyAKKy5uYWRheworCQorfQorCisjcmVmX3RhYmxleworCQorfQorCisjcmVmX3RhYmxlX2hkcnsKKwkKK30KKworLyoqCisgKiBGSUxFIE1BTkFHRVI6IFByb2R1Y3RQYWdpbmF0b3IuY3NzCisqKi8gCisjcGFnaW5hdG9yLWJyZWFreworICBib3JkZXI6MjsKKyAgd2lkdGg6MTAwJTsKK30KKworI2NvbnRhaW5lci1kaXZ7CisgIHdpZHRoOjEwMCU7Cit9CisKKyNwYWdpbmF0b3ItdGFibGV7CisgIGJvcmRlci1zcGFjaW5nOjM7CisgIHdpZHRoOjEwMDsKK30KKworI3BhZ2luYXRvci10YWJsZS1oZWFkZXJ7CisgIHdpZHRoOjEwMCU7CisgIHdoaXRlLXNwYWNlOm5vd3JhcDsKKyAgZm9udC13ZWlnaHQ6Ym9sZDsKK30KKworCisjcGFnZV9yZXBlYXRlcnsKKworfQorCithLCBhOmhvdmVyLCBhOmZvY3VzLCBhOmFjdGl2ZXsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy5zZWxlY3RlZHsKKyAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgY29sb3I6cmVkOworfQorCisvKioKKyAqIEZJTEUgTUFOQUdFUjogTWV0YWRhdGFCcm93c2VyLmNzcworKiovIAorCisjbWV0X3RhYmxleworCit9CisKKyNtZXRfZWxlbV9uYW1leworCQorfQorCisjbWV0X3ZhbHVlc190YWJsZXsKKworfQorCisubmFkYXsKKwkKK30KKworLyoqCisgKiBXT1JLRkxPVyBNQU5BR0VSOiBXb3JrZmxvdyBJbnN0YW5jZXMgCisqKi8KKyNpbnN0YW5jZV9maWx0ZXJfaGVhZGVyIHAgeworICAgIHBhZGRpbmctbGVmdDoyMHB4OworfQorYS53b3JrZmxvd19zdGF0dXMgeworICAgIGJvcmRlci1yaWdodDpzb2xpZCAxcHggI2NjYzsKKyAgICBwYWRkaW5nLWxlZnQ6MTVweDsKKyAgICBwYWRkaW5nLXJpZ2h0OjE1cHg7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvQmFzZVBhZ2VfY2xlYW53aGl0ZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX2NsZWFud2hpdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTZlN2RjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX2NsZWFud2hpdGUuaHRtbApAQCAtMCwwICsxLDEzMiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwKKwl4bWxuczp3aWNrZXQ9Imh0dHA6Ly93aWNrZXQuYXBhY2hlLm9yZy9kdGRzLmRhdGEvd2lja2V0LXhodG1sMS40LXN0cmljdC5kdGQiPgorPGhlYWQ+Cis8dGl0bGU+QXBhY2hlIE9PRFQgUENTIE9wZXJhdG9yIEludGVyZmFjZTwvdGl0bGU+Cis8d2lja2V0Omxpbms+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9IkJhc2VQYWdlLmNzcyIvPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHNyYz0ianF1ZXJ5LTEuNy5taW4uanMiPjwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHNyYz0iQmFzZVBhZ2UuanMiPjwvc2NyaXB0PgorPC93aWNrZXQ6bGluaz4KKzx3aWNrZXQ6cmVtb3ZlPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgPCEtLQorCisgICBmdW5jdGlvbiBtZW51U2VsZWN0ZWQoY2VsbCkgeworCQljZWxsLmNzcyh7J2JhY2tncm91bmQtY29sb3InOicjMDA2Njk5J30pOworCX0KKwlmdW5jdGlvbiBtZW51Tm90U2VsZWN0ZWQoY2VsbCkgeworCQljZWxsLmNzcyh7J2JhY2tncm91bmQtY29sb3InOicjNjY2NjY2J30pOwkKKwl9ICAgCisgICAKKyAgIGZ1bmN0aW9uIHN1Yk1lbnVTZWxlY3RlZChpZCkgeworCQl2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yb3dzOworCQl2YXIgeSA9IHhbMF0uY2VsbHM7CisJCXlbMF0uaW5uZXJIVE1MID0gIjxpbWcgc3JjPSdzZWxsZWZ0Y29ybmVyLmdpZic+IjsKKwkJeVsxXS5iZ0NvbG9yID0gIiM5OUNDRkYiOworCQl5WzJdLmlubmVySFRNTCA9ICI8aW1nIHNyYz0nc2VscmlnaHRjb3JuZXIuZ2lmJz4iOworCX0KKworCWZ1bmN0aW9uIHN1Yk1lbnVOb3RTZWxlY3RlZChpZCkgeworCQl2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yb3dzOworCQl2YXIgeSA9IHhbMF0uY2VsbHM7CisJCXlbMF0uaW5uZXJIVE1MID0gIjxpbWcgc3JjPSdsZWZ0Y29ybmVyLmdpZic+IjsKKwkJeVsxXS5iZ0NvbG9yID0gIiNjY2NjY2MiOworCQl5WzJdLmlubmVySFRNTCA9ICI8aW1nIHNyYz0ncmlnaHRjb3JuZXIuZ2lmJz4iOworCX0gICAgIAorCQorCXZhciBpbnRlcmZhY2VpbWcgPSBuZXcgQXJyYXkoKTsKKwlmdW5jdGlvbiBwcmVsb2FkaW1nKCkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJaW50ZXJmYWNlaW1nW2ldID0gbmV3IEltYWdlKCk7CisJCQlpbnRlcmZhY2VpbWdbaV0uc3JjID0gYXJndW1lbnRzW2ldOworCQl9CisJfQorCisJLy8gRW50ZXIgZnVsbCBVUkwgdG8gaW1hZ2UgdGFicyB0byBwcmVsb2FkIGJlbG93LiBTZXBhcmF0ZSB3aXRoIGNvbW1hOgorCisJcHJlbG9hZGltZygicmlnaHRjb3JuZXIuZ2lmIiwgImxlZnRjb3JuZXIuZ2lmIiwKKwkJCSJzZWxyaWdodGNvcm5lci5naWYiLCAic2VsbGVmdGNvcm5lci5naWYiKTsJCisgICAvLy0tPgorICA8L3NjcmlwdD4KKzwvd2lja2V0OnJlbW92ZT4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBpZD0iY29udGVudCI+Cis8ZGl2IGlkPSJoZWFkZXIiPgorICAgIDxkaXYgaWQ9InByb2plY3RfbG9nbyI+CisgICAgICAgPHdpY2tldDpsaW5rPgorCSAgICAgPGltZyBzcmM9InByb2plY3RfbG9nby5wbmciIGFsdD0iYmFubmVyIGltYWdlIiBjbGFzcz0iYmFubmVyIi8+CisgICAgICAgPC93aWNrZXQ6bGluaz4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJ1c2VyX3N0YXR1cyI+CisJCTxzcGFuPkFwYWNoZSBPT0RUIFBDUyBPcGVyYXRvciBJbnRlcmZhY2U8L3NwYW4+CisgICAgICAgIDwhLS1UT0RPOiBhZGQgV2lja2V0IGxvZ29uIHdpZGdldCBoZXJlIC0tPgorCQk8c3BhbiBpZD0ibG9nb25fd2lkZ2V0Ii8+CisgICAgPC9kaXY+Cis8L2Rpdj4KKzxkaXYgaWQ9Im5hdiI+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0iaG9tZV9saW5rIiBjbGFzcz0iZmlyc3QiPgorCQkJCQkgIDxzcGFuPgorCQkJCQkgICAgSG9tZQorCQkJCQkgIDwvc3Bhbj4KKwkJCQkJPC9hPgorICAgICAgICA8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImZtYnJvd3Nlcl9saW5rIiA+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBGaWxlIENhdGFsb2cgQnJvd3NlCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0id21vbml0b3JfbGluayIgaWQ9Indtb25pdG9yX2xpbmsiID4KKwkJCQkJICA8c3Bhbj4KKwkJCQkJICAgIFdvcmtmbG93IE1vbml0b3IKKwkJCQkJICA8L3NwYW4+CisJCQkJCTwvYT4KKyAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJnYW5nbGlhX2xpbmsiID4KKwkJCQkJICA8c3Bhbj4KKwkJCQkJICAgIFJlc291cmNlIE1vbml0b3IKKwkJCQkJICA8L3NwYW4+CisJCQkJCTwvYT4KKyAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJjb25maWdfbGluayI+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBDb25maWd1cmF0aW9uCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0iY3VyYXRlX2xpbmsiPgorICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgSW5nZXN0CisgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0icGNzc3RhdHVzX2xpbmsiIGlkPSJwY3NzdGF0dXNfbGluayIgY2xhc3M9Imxhc3QiPgorCQkJCQkgIDxzcGFuPgorCQkJCQkgICAgUENTIFN0YXR1cworCQkJCQkgIDwvc3Bhbj4KKwkJCQkJPC9hPgorPC9kaXY+CisKKzx3aWNrZXQ6Y2hpbGQvPgorCis8cD4mbmJzcDs8L3A+Cis8cD4mbmJzcDs8L3A+CisKKzwvZGl2PiA8IS0tICBlbmQgY29udGVudCBibG9jayAtLT4KKzxkaXYgaWQ9ImZvb3RlciI+CisgICAgICAgIDxwIGlkPSJwb3dlcmVkIj5Qb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvIj5BcGFjaGUgT09EVDwvYT48L3A+CisgICAgICAgIDxwIGlkPSJmZWVkYmFjayI+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJjb250YWN0X2xpbmsiPkZlZWRiYWNrPC9hPjwvcD4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0Jhc2VQYWdlX25hdnlibHVlLmNzcyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZV9uYXZ5Ymx1ZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0M2RhZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9CYXNlUGFnZV9uYXZ5Ymx1ZS5jc3MKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorIGJnICAgICAgICAgICAgICMzMzQ0NTUKKyBib3JkZXJzLXRvcCAgICAjMmUzZTRlCisgYm9yZGVyLWxlZnQgICAgIzMwNDA1MAorIGJnLXRleHQgICAgICAgICMxNjI2MzYKKyBsaW5rLXRleHQgICAgICAjYzBjMGMwCisqLworCitib2R5IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiMzNDU7CisgICAgbWFyZ2luOjBweDsKKyAgICBwYWRkaW5nOjBweDsKKyAgICBmb250LWZhbWlseTogYXJpYWwsIHZlcmRhbmEsIHNhbnMtc2VyaWY7Cit9CisKKyNoZWFkZXIgeworICAgIHdpZHRoOjEwMCU7CisgICAgaGVpZ2h0OjgwcHg7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICMyZTNlNGU7Cit9CisKKyNwcm9qZWN0X2xvZ28geworICAgIGZsb2F0OmxlZnQ7Cit9CisKKyN1c2VyX3N0YXR1cyB7CisgICAgZmxvYXQ6cmlnaHQ7CisgICAgcGFkZGluZzoxMHB4OworICAgIGNvbG9yOiMxNjI2MzY7Cit9CisKKyNuYXYgeworICAgIG1hcmdpbi10b3A6MTBweDsKK30KKworI25hdiBhIHsKKyAgICBjb2xvcjojYzBjMGMwOworICAgIHRleHQtZGVjb3JhdGlvbjpub25lOworICAgIGJvcmRlci1yaWdodDpzb2xpZCAxcHggIzQ1NjsKKyAgICBwYWRkaW5nOiAzcHggMjBweDsKK30KKyNuYXYgYS5maXJzdCB7Cit9CisjbmF2IGEubGFzdCB7CisgICAgYm9yZGVyLXJpZ2h0Om5vbmU7Cit9CisjbmF2IGE6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisgICAgY29sb3I6I2ZmZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiMyZTNlNGU7Cit9CisKKyNmb290ZXJ7CisgIHBvc2l0aW9uOmZpeGVkOworICBib3R0b206MHB4OworICB3aWR0aDoxMDAlOworICBoZWlnaHQ6ODBweDsKKyAgcGFkZGluZzo1cHggMHB4OworICBib3JkZXItc3BhY2luZzowcHg7CisgIGJvcmRlci10b3A6c29saWQgMXB4ICMyZTNlNGU7CisgIGNvbG9yOiMyMzQ7CisgIGJhY2tncm91bmQtY29sb3I6IzM2NDY1NjsKKyAgZm9udC1zaXplOjkwJTsKKyAgei1pbmRleDoxMDAwMDsKK30KKyNmb290ZXIgYSB7CisgIGNvbG9yOiNhYWE7Cit9CisKKyNmb290ZXIgcCB7CisgIHdpZHRoOjEwMCU7CisgIHBhZGRpbmc6NXB4IDE1cHg7CisgIHRleHQtYWxpZ246Y2VudGVyOworfQorCisjZmVlZGJhY2sgeworICAgIG1hcmdpbjowcHg7CisgICAgbWFyZ2luLXRvcDotMjBweDsKKyAgICBmb250LXNpemU6OTAlOworfQorCisjcG93ZXJlZCwjZmVlZGJhY2sgeworICBtYXJnaW4tbGVmdDotMzBweDsKK30KKworCitheworICAgIGNvbG9yOiNjMGMwYzA7CisJdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cit9CisKK2E6aG92ZXJ7CisJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKK30KKworYSBpbWcsICB7CisgICAgYm9yZGVyOm5vbmU7Cit9CisKKworLyoqCisgKiBIRUFERVJTIAorKiovCitoMSwgaDIsIGgzLCBoNCwgaDUgeworICAgIGJhY2tncm91bmQtY29sb3I6IzI4Mzg0ODsKKyAgICBjb2xvcjojZWVlOworICAgIGJvcmRlci10b3A6c29saWQgMXB4ICMyZTNlNGU7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzIzMzM0MzsKKyAgICBwYWRkaW5nOjhweDsKK30KK2gxIHsKKworfQorCitoMiB7CisKK30KKworaDMgeworICAgIAorfQorCitoNCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKKyAgICBib3JkZXItdG9wOm5vbmU7CisgICAgbWFyZ2luOjEwcHg7Cit9CisKK2g1IHsKKworfQorCisvKioKKyAqIFRBQkxFUworKiovCit0YWJsZSB7CisgIHBhZGRpbmc6MnB4OworICB3aWR0aDoxMDAlOworICBib3JkZXI6IG5vbmU7Cit9Cit0YWJsZSB0ciB7CisgICAgCit9CisKK3RhYmxlIHRyIHRoIHsKKworfQorCit0YWJsZSB0ciB0ZCB7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzIzNDsKKyAgICBib3JkZXItcmlnaHQ6c29saWQgMXB4ICMyMzQ7CisgICAgcGFkZGluZzo1cHg7CisgICAgY29sb3I6IzExMTsKK30KKwordGFibGUgdGFibGUgdGQgeworICAgIGJvcmRlci1ib3R0b206bm9uZTsKKyAgICBib3JkZXItcmlnaHQ6bm9uZTsKK30KKworLyoqCisgKiBCUkVBRENSVU1CUworICovCitkaXYjYnJlYWRjcnVtYnMgeworICAgIGNvbG9yOiM3Nzc7CisgICAgbWFyZ2luLWxlZnQ6MjBweDsKKyAgICBtYXJnaW4tdG9wOjE1cHg7Cit9CisKK2RpdiNicmVhZGNydW1icyBhIHsKKworfQorCitkaXYjYnJlYWRjcnVtYnMgc3Bhbi5kaXZpZGVyIHsKKyAgICBwYWRkaW5nOjBweCA1cHg7Cit9CisKKworCisKKworCisvKioKKyAqIEZJTEUgTUFOQUdFUjogVHlwZXMuY3NzCisqKi8gCisjY2FzX2ZtX2Jyb3dzZXJfcHR5cGVfdGFibGV7CisKK30KKworI2Nhc19mbV9icm93c2VyX3B0eXBlX3RhYmxlIHRkeworCit9CisKKy8qKgorICogRklMRSBNQU5BR0VSOiBUeXBlQnJvd3Nlci5jc3MKKyoqLyAKKworI2NyaXRlcmlhX2Zvcm1fYWRkX2VsZW1lbnRfdmFsdWV7CisJZm9udC13ZWlnaHQ6Ym9sZDsKK30KKworI3Byb2R1Y3RfdGFibGV7CisKK30KKworI3Byb2R1Y3RfdGFibGUgdGR7CisKK30KKworI3BhZ2luYXRpb25fdGFibGV7CisJYm9yZGVyLXNwYWNpbmc6M3B4OworCXdpZHRoOjEwMCU7Cit9CisKKyNwYWdpbmF0aW9uX3RhYmxlX3Jlc3VsdF9oZHJ7CisJd2lkdGg6MTAwcHg7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwlmb250LXdlaWdodDpib2xkOworfQorCisvKioKKyAqIEZJTEUgTUFOQUdFUjogUHJvZHVjdEJyb3dzZXIuY3NzCisqKi8gCisjbWV0X3RhYmxleworCit9CisKKyNtZXRfZWxlbV9uYW1leworCQorfQorCisjbWV0X3ZhbHVlc190YWJsZXsKKworfQorCisubmFkYXsKKwkKK30KKworI3JlZl90YWJsZXsKKwkKK30KKworI3JlZl90YWJsZV9oZHJ7CisJCit9CisKKy8qKgorICogRklMRSBNQU5BR0VSOiBQcm9kdWN0UmVmc0Jyb3dzZXIuY3NzCisqKi8gCisgCisubmFkYXsKKwkKK30KKworI3JlZl90YWJsZXsKKwkKK30KKworI3JlZl90YWJsZV9oZHJ7CisJCit9CisKKy8qKgorICogRklMRSBNQU5BR0VSOiBQcm9kdWN0UGFnaW5hdG9yLmNzcworKiovIAorI3BhZ2luYXRvci1icmVha3sKKyAgYm9yZGVyOjI7CisgIHdpZHRoOjEwMCU7Cit9CisKKyNjb250YWluZXItZGl2eworICB3aWR0aDoxMDAlOworfQorCisjcGFnaW5hdG9yLXRhYmxleworICBib3JkZXItc3BhY2luZzozOworICB3aWR0aDoxMDA7Cit9CisKKyNwYWdpbmF0b3ItdGFibGUtaGVhZGVyeworICB3aWR0aDoxMDAlOworICB3aGl0ZS1zcGFjZTpub3dyYXA7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKworI3BhZ2VfcmVwZWF0ZXJ7CisKK30KKworYSwgYTpob3ZlciwgYTpmb2N1cywgYTphY3RpdmV7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuc2VsZWN0ZWR7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgIGNvbG9yOnJlZDsKK30KKworLyoqCisgKiBGSUxFIE1BTkFHRVI6IE1ldGFkYXRhQnJvd3Nlci5jc3MKKyoqLyAKKworI21ldF90YWJsZXsKKworfQorCisjbWV0X2VsZW1fbmFtZXsKKwkKK30KKworI21ldF92YWx1ZXNfdGFibGV7CisKK30KKworLm5hZGF7CisJCit9CisKKy8qKgorICogV09SS0ZMT1cgTUFOQUdFUjogV29ya2Zsb3cgSW5zdGFuY2VzIAorKiovCisjaW5zdGFuY2VfZmlsdGVyX2hlYWRlciBwIHsKKyAgICBwYWRkaW5nLWxlZnQ6MjBweDsKK30KK2Eud29ya2Zsb3dfc3RhdHVzIHsKKyAgICBib3JkZXItcmlnaHQ6c29saWQgMXB4ICNjY2M7CisgICAgcGFkZGluZy1sZWZ0OjE1cHg7CisgICAgcGFkZGluZy1yaWdodDoxNXB4OworfQorI3dvcmtmbG93X21vZGVsX3RibCB0ZC50YXNrX2J1YmJsZSB7CisJYmFja2dyb3VuZC1jb2xvcjogIzMzMyAhaW1wb3J0YW50OwkvKiBOT1RFOiBUaGlzIG92ZXJyaWRlcyBvb2R0LXdlYmFwcC1jb21wb25lbnRzJ3MgQ1NTIHZhbHVlICovCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2UuY3NzIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0hvbWVQYWdlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjMyZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0hvbWVQYWdlLmNzcwpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3NwbGFzaCB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgbGVmdDo1MCU7CisgICAgdG9wOjUwJTsKKyAgICBtYXJnaW46LTE4MHB4IDAgMCAtMzcwcHg7CisgICAgaGVpZ2h0OjI2MHB4OyAgICAKKyAgICB3aWR0aDo3MzBweDsKKyAgICB6LWluZGV4OjA7Cit9Cisjc3BsYXNoX2JyYW5kaW5nIHsKKyAgICBwYWRkaW5nOjVweDsKKyAgICB3aWR0aDozMTVweDsKKyAgICBoZWlnaHQ6MjAwcHg7CisgICAgcGFkZGluZzozMnB4IDUwcHggMzBweCAwOworICAgIHRleHQtYWxpZ246cmlnaHQ7CisgICAgZmxvYXQ6bGVmdDsKK30KKyNzcGxhc2hfbmF2IHsKKyAgICBmbG9hdDpsZWZ0OworICAgIGhlaWdodDoyMDBweDsKKyAgICB3aWR0aDozMTVweDsKKyAgICBwYWRkaW5nOiAzMHB4IDAgMzBweCA0NXB4OworICAgIGJvcmRlci1sZWZ0OnNvbGlkIDFweCAjMzA0MDUwOworfQorI3NwbGFzaF9uYXYgYSB7CisgICAgZGlzcGxheTpibG9jazsKKyAgICBwYWRkaW5nOjEwcHg7Cit9ICAKKworCisuYm9yZGVyIHsKKyAgICBib3JkZXItdG9wOiBzb2xpZCAxcHggIzIzNDsKK30KKworCisKKyNmb290ZXJ7CisgIHBvc2l0aW9uOmFic29sdXRlOworICBib3R0b206MjBweDsKKyAgd2lkdGg6MTAwJTsKKyAgcGFkZGluZzoxMHB4IDBweDsKKyAgYm9yZGVyLXNwYWNpbmc6MHB4OworICBib3JkZXItdG9wOnNvbGlkIDFweCAjMmUzZTRlOworICBjb2xvcjojMjM0OworICBmb250LXNpemU6OTAlOworfQorCisjZm9vdGVyIHAgeworICB3aWR0aDoxMDAlOworICBwYWRkaW5nOjVweCAxNXB4OworICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworI3Bvd2VyZWQgeworICBtYXJnaW4tbGVmdDotMzBweDsKK30KKworCmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2UuaHRtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Ib21lUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2UuaHRtbApAQCAtMCwwICsxLDc3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbAorCXhtbG5zOndpY2tldD0iaHR0cDovL3dpY2tldC5hcGFjaGUub3JnL2R0ZHMuZGF0YS93aWNrZXQteGh0bWwxLjQtc3RyaWN0LmR0ZCI+Cis8aGVhZD4KKzx0aXRsZT5BcGFjaGUgT09EVCBQQ1MgT3BlcmF0b3IgSW50ZXJmYWNlPC90aXRsZT4KKzx3aWNrZXQ6bGluaz4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iSG9tZVBhZ2UuY3NzIi8+Cis8L3dpY2tldDpsaW5rPgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJzcGxhc2giPgorICAgIDxkaXYgaWQ9InNwbGFzaF9icmFuZGluZyI+CisgICAgICAgIDx3aWNrZXQ6bGluaz4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJzcGxhc2gucG5nIiBpZD0ic3BsYXNoX2xvZ28iLz4KKyAgICAgICAgPC93aWNrZXQ6bGluaz4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJzcGxhc2hfbmF2Ij4KKyAgICAgICAgPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJmbWJyb3dzZXJfbGluayIgPgorCQkJCQkgIDxzcGFuPgorCQkJCQkgICAgRmlsZSBDYXRhbG9nIEJyb3dzZQorCQkJCQkgIDwvc3Bhbj4KKwkJCQkJPC9hPgorICAgICAgICA8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9Indtb25pdG9yX2xpbmsiIGlkPSJ3bW9uaXRvcl9saW5rIiA+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBXb3JrZmxvdyBNb25pdG9yCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0iZ2FuZ2xpYV9saW5rIiA+CisJCQkJCSAgPHNwYW4+CisJCQkJCSAgICBSZXNvdXJjZSBNb25pdG9yCisJCQkJCSAgPC9zcGFuPgorCQkJCQk8L2E+CisgICAgICAgIDxhIGhyZWY9IiMiIHdpY2tldDppZD0iY29uZmlnX2xpbmsiPgorCQkJCQkgIDxzcGFuPgorCQkJCQkgICAgQ29uZmlndXJhdGlvbgorCQkJCQkgIDwvc3Bhbj4KKwkJCQkJPC9hPgorICAgICAgICA8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImN1cmF0ZV9saW5rIj4KKyAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluZ2VzdAorICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgPC9hPiAgICAJCQkJCQorICAgICAgICA8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9InBjc3N0YXR1c19saW5rIiBpZD0icGNzc3RhdHVzX2xpbmsiPgorCQkJCQkgIDxzcGFuPgorCQkJCQkgICAgUENTIFN0YXR1cworCQkJCQkgIDwvc3Bhbj4KKwkJCQkJPC9hPgorICAgIDwvZGl2PgorPC9kaXY+CisKKworCisKKworPGRpdiBpZD0iZm9vdGVyIj4KKyAgICAgICAgPHAgaWQ9InBvd2VyZWQiPlBvd2VyZWQgYnkgPGEgaHJlZj0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy8iPkFwYWNoZSBPT0RUPC9hPjwvcD4KKzwvZGl2PgorCisKKzwvYm9keT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0hvbWVQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM5MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0hvbWVQYWdlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWk7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLmNvbmZpZy5Db25maWdQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuc3RhdHVzLlN0YXR1c1BhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5FeHRlcm5hbExpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworCisvKioKKyAqCisgKiBNYWluIGhvbWUgcGFnZSBvZiB0aGUgd2ViIGFwcC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEhvbWVQYWdlIGV4dGVuZHMgT1BTVUlXZWJQYWdlIHsKKworICBwcm90ZWN0ZWQgT3BzdWlBcHAgYXBwOworICAKKyAgcHVibGljIEhvbWVQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpeworICAgIHRoaXMuYXBwID0gKE9wc3VpQXBwKWdldEFwcGxpY2F0aW9uKCk7CisgICAgCisgICAgYWRkKG5ldyBMaW5rKCJmbWJyb3dzZXJfbGluayIpeworICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICBzZXRSZXNwb25zZVBhZ2UoVHlwZXNQYWdlLmNsYXNzKTsgCisgICAgICB9CisgICAgfSk7CisgICAgCisgICAgYWRkKG5ldyBMaW5rKCJwY3NzdGF0dXNfbGluayIpeworICAgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFN0YXR1c1BhZ2UuY2xhc3MpOworICAgICAgICAKKyAgICAgIH0KKyAgICB9KTsKKyAgICAKKyAgICBhZGQobmV3IExpbmsoIndtb25pdG9yX2xpbmsiKXsKKyAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLmFkZCgic3RhdHVzIiwgIkFMTCIpOworICAgICAgICBwYXJhbXMuYWRkKCJwYWdlTnVtIiwgIjEiKTsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFdvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlLmNsYXNzLCBwYXJhbXMpOworICAgICAgICAKKyAgICAgIH0KKyAgICB9KTsKKyAgICAKKyAgICBhZGQobmV3IEV4dGVybmFsTGluaygiZ2FuZ2xpYV9saW5rIiwgYXBwLmdldEdhbmdsaWFVcmwoKSkpOworICAgIAorICAgIGFkZChuZXcgTGluaygiY29uZmlnX2xpbmsiKXsKKyAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rI29uQ2xpY2soKQorICAgICAgICovCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgIFBhZ2VQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYWdlUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuYWRkKCJ0YWIiLCAiRmlsZSBNYW5hZ2VyIik7CisgICAgICAgIHNldFJlc3BvbnNlUGFnZShDb25maWdQYWdlLmNsYXNzLCBwYXJhbXMpOyAgCisgICAgICB9CisgIH0pOyAgIAorICAgIAorICAgIGFkZChuZXcgTGluaygiY3VyYXRlX2xpbmsiKXsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFdvcmtiZW5jaFBhZ2UuY2xhc3MpOworICAgICAgfQorICAgIH0pOworICAgIAorICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2VfY2xlYW53aGl0ZS5jc3MgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2VfY2xlYW53aGl0ZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyNWM5NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Ib21lUGFnZV9jbGVhbndoaXRlLmNzcwpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyBiZyAgICAgICAgICAgICAjMzM0NDU1CisgYm9yZGVycy10b3AgICAgIzJlM2U0ZQorIGJvcmRlci1sZWZ0ICAgICMzMDQwNTAKKyovCisKK2JvZHkgeworICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRjsKKyAgICBtYXJnaW46MHB4OworICAgIHBhZGRpbmc6MHB4OworICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgIHNhbnMtc2VyaWY7Cit9CisKKyNzcGxhc2ggeworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIGxlZnQ6NTAlOworICAgIHRvcDo1MCU7CisgICAgbWFyZ2luOi0xODBweCAwIDAgLTM3MHB4OworICAgIGhlaWdodDoyNjBweDsgICAgCisgICAgd2lkdGg6ODAwcHg7CisgICAgei1pbmRleDowOworfQorI3NwbGFzaF9icmFuZGluZyB7CisgICAgcGFkZGluZzo1cHg7CisgICAgd2lkdGg6MzE1cHg7CisgICAgaGVpZ2h0OjIwMHB4OworICAgIHBhZGRpbmc6MzJweCA1MHB4IDMwcHggMDsKKyAgICB0ZXh0LWFsaWduOnJpZ2h0OworICAgIGZsb2F0OmxlZnQ7Cit9Cisjc3BsYXNoX25hdiB7CisgICAgZmxvYXQ6bGVmdDsKKyAgICBoZWlnaHQ6MjAwcHg7CisgICAgd2lkdGg6MzE1cHg7CisgICAgcGFkZGluZzogMzBweCAwIDMwcHggNDVweDsKKyAgICBib3JkZXItbGVmdDpzb2xpZCAxcHggIzMwNDA1MDsKK30KKyNzcGxhc2hfbmF2IGEgeworICAgIGRpc3BsYXk6YmxvY2s7CisgICAgcGFkZGluZzoxMHB4OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBjb2xvcjojMTkzNjc4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7Cit9ICAKKyNzcGxhc2hfbmF2IGE6aG92ZXIgeworICAgIGNvbG9yOiM0OTY1QTY7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisKKy5ib3JkZXIgeworICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAjMjM0OworfQorCisKKworI2Zvb3RlcnsKKyAgcG9zaXRpb246YWJzb2x1dGU7CisgIGJvdHRvbToyMHB4OworICB3aWR0aDoxMDAlOworICBwYWRkaW5nOjEwcHggMHB4OworICBib3JkZXItc3BhY2luZzowcHg7CisgIGJvcmRlci10b3A6c29saWQgMXB4ICMyZTNlNGU7CisgIGNvbG9yOiMyMzQ7CisgIGZvbnQtc2l6ZTo5MCU7Cit9CisjZm9vdGVyIGEgeworICBjb2xvcjojMTkzNjc4OworfQorCisjZm9vdGVyIHAgeworICB3aWR0aDoxMDAlOworICBwYWRkaW5nOjVweCAxNXB4OworICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworI3Bvd2VyZWQgeworICBtYXJnaW4tbGVmdDotMzBweDsKK30KKworCmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvSG9tZVBhZ2VfbmF2eWJsdWUuY3NzIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0hvbWVQYWdlX25hdnlibHVlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIyMmFjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL0hvbWVQYWdlX25hdnlibHVlLmNzcwpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyBiZyAgICAgICAgICAgICAjMzM0NDU1CisgYm9yZGVycy10b3AgICAgIzJlM2U0ZQorIGJvcmRlci1sZWZ0ICAgICMzMDQwNTAKKyovCisKK2JvZHkgeworICAgIGJhY2tncm91bmQtY29sb3I6IzM0NTsKKyAgICBtYXJnaW46MHB4OworICAgIHBhZGRpbmc6MHB4OworICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgdmVyZGFuYSwgc2Fucy1zZXJpZjsKK30KKworI3NwbGFzaCB7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgbGVmdDo1MCU7CisgICAgdG9wOjUwJTsKKyAgICBtYXJnaW46LTE4MHB4IDAgMCAtMzcwcHg7CisgICAgaGVpZ2h0OjI2MHB4OyAgICAKKyAgICB3aWR0aDo3MzBweDsKKyAgICB6LWluZGV4OjA7Cit9Cisjc3BsYXNoX2JyYW5kaW5nIHsKKyAgICBwYWRkaW5nOjVweDsKKyAgICB3aWR0aDozMTVweDsKKyAgICBoZWlnaHQ6MjAwcHg7CisgICAgcGFkZGluZzozMnB4IDUwcHggMzBweCAwOworICAgIHRleHQtYWxpZ246cmlnaHQ7CisgICAgZmxvYXQ6bGVmdDsKK30KKyNzcGxhc2hfbmF2IHsKKyAgICBmbG9hdDpsZWZ0OworICAgIGhlaWdodDoyMDBweDsKKyAgICB3aWR0aDozMTVweDsKKyAgICBwYWRkaW5nOiAzMHB4IDAgMzBweCA0NXB4OworICAgIGJvcmRlci1sZWZ0OnNvbGlkIDFweCAjMzA0MDUwOworfQorI3NwbGFzaF9uYXYgYSB7CisgICAgZGlzcGxheTpibG9jazsKKyAgICBwYWRkaW5nOjEwcHg7CisgICAgY29sb3I6I2MwYzBjMDsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKK30gIAorI3NwbGFzaF9uYXYgYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKKyAgICBjb2xvcjojZmZmOworfQorCisKKy5ib3JkZXIgeworICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAjMjM0OworfQorCisKKworI2Zvb3RlcnsKKyAgcG9zaXRpb246YWJzb2x1dGU7CisgIGJvdHRvbToyMHB4OworICB3aWR0aDoxMDAlOworICBwYWRkaW5nOjEwcHggMHB4OworICBib3JkZXItc3BhY2luZzowcHg7CisgIGJvcmRlci10b3A6c29saWQgMXB4ICMyZTNlNGU7CisgIGNvbG9yOiMyMzQ7CisgIGZvbnQtc2l6ZTo5MCU7CisgIGJhY2tncm91bmQtY29sb3I6IzM2NDY1NjsKK30KKyNmb290ZXIgYSB7CisgIGNvbG9yOiNhYWE7Cit9CisKKyNmb290ZXIgcCB7CisgIHdpZHRoOjEwMCU7CisgIHBhZGRpbmc6NXB4IDE1cHg7CisgIHRleHQtYWxpZ246Y2VudGVyOworfQorCisjcG93ZXJlZCB7CisgIG1hcmdpbi1sZWZ0Oi0zMHB4OworfQorCisKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9PUFNVSVdlYlBhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9PUFNVSVdlYlBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDU1OWUyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL09QU1VJV2ViUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpOworCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYlJlc3BvbnNlOworCisvKioKKyoKKyogRXh0ZW5zaW9uIG9mIFdlYlBhZ2UgZm9yIGN1c3RvbWl6ZWQgZmVhdHVyZXMKKyoKKyogQGF1dGhvciByaXZlcm1hCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyoKKyovCitwdWJsaWMgY2xhc3MgT1BTVUlXZWJQYWdlIGV4dGVuZHMgV2ViUGFnZSB7CisKKwkgIC8qKgorCSAgICogTmVjZXNzYXJ5IHRvIGFsbGV2aWF0ZSAnUGFnZSBleHBpcmVkJyBjYWNoaW5nIGlzc3VlLgorCSAgICogU2VlOiBodHRwOi8vd3d3LnJpY2hhcmRuaWNob2xzLm5ldC8yMDEwLzAzL2FwYWNoZS13aWNrZXQtZm9yY2UtcGFnZS1yZWxvYWQtdG8tZml4LWFqYXgtYmFjay8KKwkgICAqLworCSAgQE92ZXJyaWRlCisJICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXNwb25zZSgpIHsKKwkgICAgICBzdXBlci5jb25maWd1cmVSZXNwb25zZSgpOworCSAgICAgIFdlYlJlc3BvbnNlIHJlc3BvbnNlID0gZ2V0V2ViUmVxdWVzdEN5Y2xlKCkuZ2V0V2ViUmVzcG9uc2UoKTsKKwkgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAKKwkgICAgICAgICAgICAibm8tY2FjaGUsIG1heC1hZ2U9MCxtdXN0LXJldmFsaWRhdGUsIG5vLXN0b3JlIik7CisJICB9IAorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL09wc3VpQXBwLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvT3BzdWlBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTkzYzMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL09wc3VpQXBwLmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuY3VyYXRpb24ud29ya2JlbmNoLldvcmtiZW5jaDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5GTUJyb3dzZXJTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5pbnN0YW5jZS5Xb3JrZmxvd0luc3RhbmNlc1ZpZXdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLmNvbmZpZy5Db25maWdQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuc3RhdHVzLlN0YXR1c1BhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy53ZWJjb21wb25lbnRzLnRyYWNlLlRyYWNlOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlJlc291cmNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XZWJBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5yZXF1ZXN0LnRhcmdldC5jb2RpbmcuTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LnV0aWwuZmlsZS5GaWxlOworCisvKioKKyAqIAorICogVGhlIE9QU1VJIGFwcGxpY2F0aW9uIG9iamVjdC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBPcHN1aUFwcCBleHRlbmRzIFdlYkFwcGxpY2F0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDAzMjg4NjU3MzY5MjgyMjU5TDsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKE9wc3VpQXBwLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIE9wc3VpQXBwKCkgeworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSB0eXBlcyA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJ0eXBlcyIsIFR5cGVzUGFnZS5jbGFzcywgbmV3IFN0cmluZ1tdIHt9KTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSB0eXBlQnJvd3NlciA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJ0eXBlIiwgVHlwZUJyb3dzZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAibmFtZSIsICJwYWdlTnVtIiB9KTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSBwcm9kQnJvd3NlciA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJwcm9kdWN0IiwgUHJvZHVjdEJyb3dzZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAiaWQiIH0pOworCisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IHBjc1N0YXR1cyA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJzdGF0dXMiLCBTdGF0dXNQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10ge30pOworCisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IHRhc2tQYWdlTW91bnQgPSBuZXcgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5KAorICAgICAgICAidGFzayIsIFdvcmtmbG93VGFza1ZpZXdlclBhZ2UuY2xhc3MsIG5ldyBTdHJpbmdbXSB7ICJpZCIgfSk7CisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IGNvbmRQYWdlTW91bnQgPSBuZXcgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5KAorICAgICAgICAiY29uZGl0aW9uIiwgV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAiaWQiIH0pOworCisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IHdvcmtmbG93UGFnZU1vdW50ID0gbmV3IE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSgKKyAgICAgICAgIndvcmtmbG93IiwgV29ya2Zsb3dWaWV3ZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAiaWQiIH0pOworCisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IHdvcmtmbG93c1BhZ2VNb3VudCA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJ3b3JrZmxvd3MiLCBXb3JrZmxvd3NWaWV3ZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10ge30pOworCisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IHdvcmtmbG93SW5zdHNQYWdlTW91bnQgPSBuZXcgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5KAorICAgICAgICAiaW5zdGFuY2VzIiwgV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuY2xhc3MsIG5ldyBTdHJpbmdbXSB7ICJzdGF0dXMiLAorICAgICAgICAgICAgInBhZ2VOdW0iIH0pOworICAgIAorICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSBjb25maWdQYWdlTW91bnQgPSBuZXcgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5KCJjb25maWciLCAKKyAgICAgICAgQ29uZmlnUGFnZS5jbGFzcywgbmV3IFN0cmluZyBbXSB7InRhYiJ9KTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSBjdXJhdGVNb3VudCA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koImN1cmF0ZSIsIAorICAgICAgICBXb3JrYmVuY2hQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW117fSk7CisgICAgCisgICAgbW91bnQocGNzU3RhdHVzKTsKKyAgICBtb3VudCh0eXBlcyk7CisgICAgbW91bnQodHlwZUJyb3dzZXIpOworICAgIG1vdW50KHByb2RCcm93c2VyKTsKKyAgICBtb3VudCh0YXNrUGFnZU1vdW50KTsKKyAgICBtb3VudChjb25kUGFnZU1vdW50KTsKKyAgICBtb3VudCh3b3JrZmxvd1BhZ2VNb3VudCk7CisgICAgbW91bnQod29ya2Zsb3dzUGFnZU1vdW50KTsKKyAgICBtb3VudCh3b3JrZmxvd0luc3RzUGFnZU1vdW50KTsKKyAgICBtb3VudChjb25maWdQYWdlTW91bnQpOworICAgIG1vdW50KGN1cmF0ZU1vdW50KTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQuQXBwbGljYXRpb24jZ2V0SG9tZVBhZ2UoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgUGFnZT4gZ2V0SG9tZVBhZ2UoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiAoQ2xhc3M8PyBleHRlbmRzIFBhZ2U+KSBDbGFzcy5mb3JOYW1lKGdldEhvbWVQYWdlQ2xhc3MoKSk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIEhvbWVQYWdlLmNsYXNzOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0Rm1VcmxTdHIoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgImZpbGVtZ3IudXJsIikpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRXbVVybFN0cigpIHsKKyAgICByZXR1cm4gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKAorICAgICAgICAid29ya2Zsb3cudXJsIikpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRSbVVybFN0cigpIHsKKyAgICByZXR1cm4gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKAorICAgICAgICAicmVzbWdyLnVybCIpKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWxDb250YWN0TGluaygpIHsKKyAgICByZXR1cm4gZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKCJjb250YWN0LmVtYWlsIik7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldENyYXdsZXJDb25mRmlsZVBhdGgoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLmNyYXdsZXIuY29uZi5maWxlUGF0aCIpKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGVzRmlsZVBhdGgoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLndvcmtmbG93LnN0YXR1c2VzLmZpbGVQYXRoIikpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRXb3JrZmxvd0xpZmVjeWNsZUZpbGVQYXRoKCkgeworICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLndvcmtmbG93LmxpZmVjeWNsZUZpbGVQYXRoIikpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRHYW5nbGlhVXJsKCkgeworICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICJnYW5nbGlhLnVybCIpKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2tpbigpIHsKKyAgICByZXR1cm4gZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKCJvcHN1aS5za2luIik7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhvbWVQYWdlQ2xhc3MoKSB7CisgICAgcmV0dXJuIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigib3BzdWkuaG9tZXBhZ2UiKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0V29ya2Zsb3dJbnN0U3RhdHVlcygpIHsKKyAgICBTdHJpbmdbXSBzdGF0dXNlcyA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkud2luc3Quc3RhdHVzZXMiKS5zcGxpdCgiLCIpOworICAgIExpc3Q8U3RyaW5nPiBzdGF0dXNMaXN0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgZm9yIChTdHJpbmcgc3RhdHVzIDogc3RhdHVzZXMpIHsKKyAgICAgIHN0YXR1c0xpc3QuYWRkKHN0YXR1cy50cmltKCkpOworICAgIH0KKyAgICBzdGF0dXNMaXN0LmFkZCgiQUxMIik7CisgICAgcmV0dXJuIHN0YXR1c0xpc3Q7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFdvcmtmbG93SW5zdE1ldEZpZWxkc0ZpbGVQYXRoKCkgeworICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLndpbnN0Lm1ldEZpZWxkcy5maWxlUGF0aCIpKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZFRyYWNlTm90Q2F0UHJvZHVjdHMoKSB7CisgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQucGNzLnRyYWNlLmVuYWJsZU5vdENhdCIpKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VHJhY2VFeGNsdWRlZFByb2R1Y3RUeXBlTGlzdCgpIHsKKyAgICBTdHJpbmdbXSB0eXBlcyA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgIm9yZy5hcGFjaGUub29kdC5wY3MudHJhY2UuZXhjbHVkZUxpc3QiKS5zcGxpdCgiLCIpOworICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCisgICAgZm9yIChTdHJpbmcgdHlwZSA6IHR5cGVzKSB7CisgICAgICBleGNsdWRlcy5hZGQodHlwZSk7CisgICAgfQorCisgICAgcmV0dXJuIGV4Y2x1ZGVzOworCisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFJvb3RDb250ZXh0KCkgeworICAgIHJldHVybiBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFNlcnZsZXRDb250ZXh0TmFtZSgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYkFwcGxpY2F0aW9uI25ld1Nlc3Npb24ob3JnLmFwYWNoZS53aWNrZXQKKyAgICogLlJlcXVlc3QsIG9yZy5hcGFjaGUud2lja2V0LlJlc3BvbnNlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXNzaW9uIG5ld1Nlc3Npb24oUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgeworICAgIEZNQnJvd3NlclNlc3Npb24gc2Vzc2lvbiA9IG5ldyBGTUJyb3dzZXJTZXNzaW9uKHJlcXVlc3QpOworICAgIGlmIChnZXRTa2luKCkgIT0gbnVsbCkgeworICAgICAgc2Vzc2lvbi5zZXRTdHlsZShnZXRTa2luKCkpOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbjsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XZWJBcHBsaWNhdGlvbiNpbml0KCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworICAgIHN1cGVyLmluaXQoKTsKKworICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvcGVyY2VudEltYWdlX2JhY2sxLnBuZyIsCisgICAgICAgIG5ldyBSZXNvdXJjZVJlZmVyZW5jZShXb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5jbGFzcywKKyAgICAgICAgICAgICJwZXJjZW50SW1hZ2VfYmFjazEucG5nIikuZ2V0U2hhcmVkUmVzb3VyY2VLZXkoKSk7CisgICAgbW91bnRTaGFyZWRSZXNvdXJjZSgiL2ltYWdlcy9wZXJjZW50SW1hZ2VfYmFjazIucG5nIiwKKyAgICAgICAgbmV3IFJlc291cmNlUmVmZXJlbmNlKFdvcmtmbG93SW5zdGFuY2VzVmlld2VyLmNsYXNzLAorICAgICAgICAgICAgInBlcmNlbnRJbWFnZV9iYWNrMi5wbmciKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL3BlcmNlbnRJbWFnZV9iYWNrMy5wbmciLAorICAgICAgICBuZXcgUmVzb3VyY2VSZWZlcmVuY2UoV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuY2xhc3MsCisgICAgICAgICAgICAicGVyY2VudEltYWdlX2JhY2szLnBuZyIpLmdldFNoYXJlZFJlc291cmNlS2V5KCkpOworICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvcGVyY2VudEltYWdlX2JhY2s0LnBuZyIsCisgICAgICAgIG5ldyBSZXNvdXJjZVJlZmVyZW5jZShXb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5jbGFzcywKKyAgICAgICAgICAgICJwZXJjZW50SW1hZ2VfYmFjazQucG5nIikuZ2V0U2hhcmVkUmVzb3VyY2VLZXkoKSk7CisKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL2ljb25fYXJyb3dfdXAuZ2lmIiwgbmV3IFJlc291cmNlUmVmZXJlbmNlKAorICAgICAgICBTdGF0dXNQYWdlLmNsYXNzLCAiaWNvbl9hcnJvd191cC5naWYiKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKworICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvcmlnaHRjb3JuZXIuZ2lmIiwgbmV3IFJlc291cmNlUmVmZXJlbmNlKAorICAgICAgICBCYXNlUGFnZS5jbGFzcywgInJpZ2h0Y29ybmVyLmdpZiIpLmdldFNoYXJlZFJlc291cmNlS2V5KCkpOworICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvbGVmdGNvcm5lci5naWYiLCBuZXcgUmVzb3VyY2VSZWZlcmVuY2UoCisgICAgICAgIEJhc2VQYWdlLmNsYXNzLCAibGVmdGNvcm5lci5naWYiKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL3NlbHJpZ2h0Y29ybmVyLmdpZiIsIG5ldyBSZXNvdXJjZVJlZmVyZW5jZSgKKyAgICAgICAgQmFzZVBhZ2UuY2xhc3MsICJzZWxyaWdodGNvcm5lci5naWYiKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL3NlbGxlZnRjb3JuZXIuZ2lmIiwgbmV3IFJlc291cmNlUmVmZXJlbmNlKAorICAgICAgICBCYXNlUGFnZS5jbGFzcywgInNlbGxlZnRjb3JuZXIuZ2lmIikuZ2V0U2hhcmVkUmVzb3VyY2VLZXkoKSk7CisKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL29wZW4uZ2lmIiwgbmV3IFJlc291cmNlUmVmZXJlbmNlKFRyYWNlLmNsYXNzLAorICAgICAgICAib3Blbi5naWYiKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL2Nsb3NlZC5naWYiLCBuZXcgUmVzb3VyY2VSZWZlcmVuY2UoCisgICAgICAgIFRyYWNlLmNsYXNzLCAiY2xvc2VkLmdpZiIpLmdldFNoYXJlZFJlc291cmNlS2V5KCkpOworICAgIAorICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvdGFiX2JvdHRvbS5naWYiLCBuZXcgUmVzb3VyY2VSZWZlcmVuY2UoQ29uZmlnUGFnZS5jbGFzcywgCisgICAgICAgICJ0YWJfYm90dG9tLmdpZiIpLmdldFNoYXJlZFJlc291cmNlS2V5KCkpOworICAgIAorICAgIAorICAgIFNldDxTdHJpbmc+IGJlbmNoUmVzb3VyY2VzID0gV29ya2JlbmNoLmdldEltYWdlRmlsZXMoKTsKKyAgICBkb0ltYWdlTW91bnRzKGJlbmNoUmVzb3VyY2VzLCBXb3JrYmVuY2guY2xhc3MpOworCisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBkb0ltYWdlTW91bnRzKFNldDxTdHJpbmc+IHJlc291cmNlcywgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgIGZvciAoU3RyaW5nIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisgICAgICAgIFN0cmluZyByZXNOYW1lID0gbmV3IEZpbGUocmVzb3VyY2UpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHJlc1BhdGggPSAiL2ltYWdlcy8iICsgcmVzTmFtZTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiTW91bnRpbmc6IFsiICsgcmVzUGF0aCArICJdIG9yaWdOYW1lOiBbIiArIHJlc05hbWUKKyAgICAgICAgICAgICsgIl06IHJlc291cmNlOiBbIiArIHJlc291cmNlICsgIl0iKTsKKyAgICAgICAgbW91bnRTaGFyZWRSZXNvdXJjZShyZXNQYXRoLAorICAgICAgICAgICAgbmV3IFJlc291cmNlUmVmZXJlbmNlKGNsYXp6LCByZXNOYW1lKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1Byb2R1Y3RCcm93c2VyUGFnZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1Byb2R1Y3RCcm93c2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MGZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvUHJvZHVjdEJyb3dzZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpleHRlbmQ+CisgPGRpdiBpZD0icHJvZF9icm93c2VyX2NvbXBvbmVudCIgd2lja2V0OmlkPSJwcm9kX2Jyb3dzZXJfY29tcG9uZW50Ii8+Cis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvUHJvZHVjdEJyb3dzZXJQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvUHJvZHVjdEJyb3dzZXJQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjMjZjNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Qcm9kdWN0QnJvd3NlclBhZ2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkucGVkaWdyZWUuVHJhY2VhYmxlUHJvZHVjdEJyb3dzZXI7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKKworLyoqCisgKgorICogU2hvd3MgYSBwcm9kdWN0LCBpdHMgbWV0YWRhdGEsIGFuZCBpdHMgcmVmZXJlbmNlcywgYWxsIAorICogb24gYSBzaW5nbGUgcGFnZS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdEJyb3dzZXJQYWdlIGV4dGVuZHMgQmFzZVBhZ2UgeworCisgIHB1YmxpYyBQcm9kdWN0QnJvd3NlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycyl7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgYWRkKG5ldyBUcmFjZWFibGVQcm9kdWN0QnJvd3NlcigicHJvZF9icm93c2VyX2NvbXBvbmVudCIsIAorICAgICAgICBhcHAuZ2V0Rm1VcmxTdHIoKSwKKyAgICAgICAgcGFyYW1ldGVycy5nZXRTdHJpbmcoImlkIiksIGFwcC5pc0VuYWJsZWRUcmFjZU5vdENhdFByb2R1Y3RzKCksIAorICAgICAgICBhcHAuZ2V0VHJhY2VFeGNsdWRlZFByb2R1Y3RUeXBlTGlzdCgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Qcm9kdWN0TWV0QnJvd3NlclBhZ2UuaHRtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Qcm9kdWN0TWV0QnJvd3NlclBhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNmNWExCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1Byb2R1Y3RNZXRCcm93c2VyUGFnZS5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6ZXh0ZW5kPgorICA8ZGl2IGlkPSJtZXRfYnJvd3Nlcl9jb21wb25lbnQiIHdpY2tldDppZD0ibWV0X2Jyb3dzZXJfY29tcG9uZW50Ii8+Cis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NDIwOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Qcm9kdWN0TWV0QnJvd3NlclBhZ2UuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyLmJyb3dzZXIubWV0YWRhdGEuTWV0YWRhdGFCcm93c2VyOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CisKKy8qKgorICoKKyAqIFNob3cncyBhIHByb2R1Y3QncyBtZXRhZGF0YS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdE1ldEJyb3dzZXJQYWdlIGV4dGVuZHMgQmFzZVBhZ2UgeworICAKKyAgcHVibGljIFByb2R1Y3RNZXRCcm93c2VyUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbWV0ZXJzKXsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICBhZGQobmV3IE1ldGFkYXRhQnJvd3NlcigibWV0X2Jyb3dzZXJfY29tcG9uZW50IiwgYXBwLmdldEZtVXJsU3RyKCksIAorICAgICAgICBwYXJhbWV0ZXJzLmdldFN0cmluZygiaWQiKSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Qcm9kdWN0UmVmQnJvd3NlclBhZ2UuaHRtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Qcm9kdWN0UmVmQnJvd3NlclBhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU4YzBkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1Byb2R1Y3RSZWZCcm93c2VyUGFnZS5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6ZXh0ZW5kPgorICA8ZGl2IGlkPSJyZWZzX2NvbXBvbmVudCIgd2lja2V0OmlkPSJyZWZzX2NvbXBvbmVudCIvPgorPC93aWNrZXQ6ZXh0ZW5kPgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1Byb2R1Y3RSZWZCcm93c2VyUGFnZS5qYXZhIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1Byb2R1Y3RSZWZCcm93c2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmE0NjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvUHJvZHVjdFJlZkJyb3dzZXJQYWdlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnByb2R1Y3QuUHJvZHVjdFJlZnNCcm93c2VyOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CisKKy8qKgorICoKKyAqIFBhZ2UgdGhhdCBzaG93cyBhIFByb2R1Y3QncyByZWZlcmVuY2UgCisgKiBpbmZvcm1hdGlvbi4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFJlZkJyb3dzZXJQYWdlIGV4dGVuZHMgQmFzZVBhZ2UgeworICAKKyAgcHVibGljIFByb2R1Y3RSZWZCcm93c2VyUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbWV0ZXJzKXsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsgICAgCisgICAgYWRkKG5ldyBQcm9kdWN0UmVmc0Jyb3dzZXIoInJlZnNfY29tcG9uZW50IiwKKyAgICAgICAgYXBwLmdldEZtVXJsU3RyKCksCisgICAgICAgIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1R5cGVCcm93c2VyUGFnZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1R5cGVCcm93c2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NjFmNmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvVHlwZUJyb3dzZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpleHRlbmQ+CisKKyA8ZGl2IHdpY2tldDppZD0idHlwZV9icm93c2VyX2NvbXBvbmVudCIgaWQ9InR5cGVfYnJvd3Nlcl9jb21wb25lbnQiLz4KKzwvd2lja2V0OmV4dGVuZD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9UeXBlQnJvd3NlclBhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9UeXBlQnJvd3NlclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTc5NzJmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1R5cGVCcm93c2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuYnJvd3Nlci50eXBlcy5UeXBlQnJvd3NlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworCisvKioKKyAqCisgKiBUaGUgdHlwZSBicm93c2VyIHBhZ2UgdGhhdCBzaG93cyBhIHRhYmxlIGluY2x1ZGluZyAKKyAqIGFsbCBvZiB0aGUgcXVlcmllZCBwcm9kdWN0cyBmb3IgYSBnaXZlbiB0eXBlIGFuZCBhIAorICogcXVlcnkgc2VsZWN0aW9uIGZvcm0uCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFR5cGVCcm93c2VyUGFnZSBleHRlbmRzIEJhc2VQYWdlIHsKKworICBwdWJsaWMgVHlwZUJyb3dzZXJQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIGFkZChuZXcgVHlwZUJyb3dzZXIoInR5cGVfYnJvd3Nlcl9jb21wb25lbnQiLCBhcHAuZ2V0Rm1VcmxTdHIoKSwKKyAgICAgICAgcGFyYW1ldGVycy5nZXRTdHJpbmcoIm5hbWUiKSwgcGFyYW1ldGVycy5nZXRJbnQoInBhZ2VOdW0iLCAxKSwgICAgICAgIAorICAgICAgICBUeXBlQnJvd3NlclBhZ2UuY2xhc3MsIFByb2R1Y3RCcm93c2VyUGFnZS5jbGFzcywgUHJvZHVjdFJlZkJyb3dzZXJQYWdlLmNsYXNzLCAKKyAgICAgICAgUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmNsYXNzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9UeXBlc1BhZ2UuaHRtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9UeXBlc1BhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJjNmJkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1R5cGVzUGFnZS5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6ZXh0ZW5kPgorICA8ZGl2IGlkPSJ0eXBlc19jb21wb25lbnQiIHdpY2tldDppZD0idHlwZXNfY29tcG9uZW50Ii8+Cis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvVHlwZXNQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvVHlwZXNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNGE2MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9UeXBlc1BhZ2UuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnR5cGVzLlR5cGVzOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CisKKy8qKgorICogCisgKiBUaGUgdHlwZXMgcGFnZSB0aGF0IHNob3dzIHR5cGUgbmFtZXMgYW5kIGJ1Y2tldCBjb3VudHMKKyAqICh0aGF0IGFyZSBjbGlja2FibGUpLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFR5cGVzUGFnZSBleHRlbmRzIEJhc2VQYWdlIHsKKworICBwdWJsaWMgVHlwZXNQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsgICAgCisgICAgYWRkKG5ldyBUeXBlcygidHlwZXNfY29tcG9uZW50IiwKKyAgICAgICBhcHAuZ2V0Rm1VcmxTdHIoKSwgVHlwZUJyb3dzZXJQYWdlLmNsYXNzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrYmVuY2hQYWdlLmh0bWwgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2JlbmNoUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzlmNjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2JlbmNoUGFnZS5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6ZXh0ZW5kPgorICA8ZGl2IGlkPSJjdXJhdGlvbl9jb21wb25lbnQiIHdpY2tldDppZD0iY3VyYXRpb25fY29tcG9uZW50Ii8+Cis8L3dpY2tldDpleHRlbmQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtiZW5jaFBhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrYmVuY2hQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YTY5YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrYmVuY2hQYWdlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuY3VyYXRpb24ud29ya2JlbmNoLldvcmtiZW5jaDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKKworcHVibGljIGNsYXNzIFdvcmtiZW5jaFBhZ2UgZXh0ZW5kcyBCYXNlUGFnZSB7CisgIAorICBwdWJsaWMgV29ya2JlbmNoUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbWV0cnMpeworICAgIHN1cGVyKHBhcmFtZXRycyk7CisgICAgYWRkKG5ldyBXb3JrYmVuY2goImN1cmF0aW9uX2NvbXBvbmVudCIpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmh0bWwgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM1N2FjYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UuaHRtbApAQCAtMCwwICsxLDIwIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OmV4dGVuZD4KKzxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImNydW1iX2hvbWVfbGluayI+SG9tZTwvYT4mbmJzcDs8c3BhbiBjbGFzcz0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDtDb25kaXRpb25zJm5ic3A7PHNwYW4gY2xhc3M9ImRpdmlkZXIiPi88L3NwYW4+Jm5ic3A7PHNwYW4gd2lja2V0OmlkPSJjb25kX2lkIj51cm46b29kdDpUZXN0Q29uZGl0aW9uPC9zcGFuPjwvZGl2PgorPGRpdiB3aWNrZXQ6aWQ9ImNvbmRfdmlld2VyIi8+Cis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1OTg3NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuY29uZGl0aW9ucy5Xb3JrZmxvd0NvbmRpdGlvblZpZXdlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworCisvKioKKyAqIAorICogUGFnZSBjb250cm9sbGVyIGZvciB0aGUgV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmh0bWwgZmlsZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UgZXh0ZW5kcyBXb3JrZmxvd0NydW1iZWRQYWdlIHsKKworICAvKioKKyAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIGFkZChuZXcgV29ya2Zsb3dDb25kaXRpb25WaWV3ZXIoImNvbmRfdmlld2VyIiwgYXBwLmdldFdtVXJsU3RyKCksCisgICAgICAgIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpKSk7CisgICAgYWRkKG5ldyBMYWJlbCgiY29uZF9pZCIsIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93Q3J1bWJlZFBhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd0NydW1iZWRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxMTZhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd0NydW1iZWRQYWdlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLnN0YXR1cy5TdGF0dXNQYWdlOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworCisvKioKKyAqCisgKiBBZGRzIGEgYnJlYWQgY3J1bWIgbGluayB0byB0aGUgT1BTVUkgYXBwIGhvbWUsIAorICogdGhlIFBDUyBzdGF0dXMgcGFnZS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dDcnVtYmVkUGFnZSBleHRlbmRzIEJhc2VQYWdlIHsKKworICAvKioKKyAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0NydW1iZWRQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICBhZGQobmV3IExpbmsoImNydW1iX2hvbWVfbGluayIpeworICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFN0YXR1c1BhZ2UuY2xhc3MpOyAgICAgICAgCisgICAgICB9CisgICAgfSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlLmh0bWwgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2FmZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpleHRlbmQ+Cis8ZGl2IGlkPSJicmVhZGNydW1icyI+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJjcnVtYl9ob21lX2xpbmsiPkhvbWU8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9ImRpdmlkZXIiPi88L3NwYW4+Jm5ic3A7SW5zdGFuY2VzJm5ic3A7PC9kaXY+Cis8ZGl2IHdpY2tldDppZD0iaW5zdGFuY2Vfdmlld2VyIi8+Cis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODIwYWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5pbnN0YW5jZS5Xb3JrZmxvd0luc3RhbmNlc1ZpZXdlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworCisvKioKKyAqCisgKiBTaG93cyBhIHNldCBvZiB3b3JrZmxvdyBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlIGV4dGVuZHMgV29ya2Zsb3dDcnVtYmVkUGFnZSB7CisKKyAgLyoqCisgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIE9wc3VpQXBwIGFwcCA9IChPcHN1aUFwcClnZXRBcHBsaWNhdGlvbigpOworICAgIGFkZChuZXcgV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIoImluc3RhbmNlX3ZpZXdlciIsIAorICAgICAgICBhcHAuZ2V0V21VcmxTdHIoKSwgcGFyYW1ldGVycy5nZXRTdHJpbmcoInN0YXR1cyIpLCAKKyAgICAgICAgcGFyYW1ldGVycy5nZXRJbnQoInBhZ2VOdW0iLCAxKSwgCisgICAgICAgIGFwcC5nZXRXb3JrZmxvd0luc3RTdGF0dWVzKCksIGFwcC5nZXRXb3JrZmxvd0xpZmVjeWNsZUZpbGVQYXRoKCksIAorICAgICAgICBhcHAuZ2V0V29ya2Zsb3dJbnN0TWV0RmllbGRzRmlsZVBhdGgoKSwgV29ya2Zsb3dWaWV3ZXJQYWdlLmNsYXNzLCAKKyAgICAgICAgV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5jbGFzcywgV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuY2xhc3MpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93VGFza1ZpZXdlclBhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjI3N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93VGFza1ZpZXdlclBhZ2UuaHRtbApAQCAtMCwwICsxLDIxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OmV4dGVuZD4KKzxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImNydW1iX2hvbWVfbGluayI+SG9tZTwvYT4mbmJzcDs8c3BhbiBjbGFzcz0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDtUYXNrcyZuYnNwOzxzcGFuIGNsYXNzPSJkaXZpZGVyIj4vPC9zcGFuPiZuYnNwOzxzcGFuIHdpY2tldDppZD0idGFza19pZCI+dXJuOm9vZHQ6TG9uZ1Rhc2s8L3NwYW4+PC9kaXY+Cis8aDM+V29ya2Zsb3cgVGFzayBNZXRhZGF0YTo8L2gzPgorPGRpdiB3aWNrZXQ6aWQ9InRhc2tfdmlld2VyIiBpZD0idGFza192aWV3ZXIiLz4KKzwvd2lja2V0OmV4dGVuZD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTBkZTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LnRhc2tzLldvcmtmbG93VGFza1ZpZXdlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworCisvKioKKyAqCisgKiBDb250cm9sbGVyIGZvciB0aGUgVGFza1ZpZXdlclBhZ2UuaHRtbC4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dUYXNrVmlld2VyUGFnZSBleHRlbmRzIFdvcmtmbG93Q3J1bWJlZFBhZ2UgeworCisgIC8qKgorICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgKi8KKyAgcHVibGljIFdvcmtmbG93VGFza1ZpZXdlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIGFkZChuZXcgV29ya2Zsb3dUYXNrVmlld2VyKCJ0YXNrX3ZpZXdlciIsIGFwcC5nZXRXbVVybFN0cigpLAorICAgICAgICBwYXJhbWV0ZXJzLmdldFN0cmluZygiaWQiKSwgV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmNsYXNzKSk7CisgICAgYWRkKG5ldyBMYWJlbCgidGFza19pZCIsIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93Vmlld2VyUGFnZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93Vmlld2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjNWMyMWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dWaWV3ZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpleHRlbmQ+Cis8ZGl2IGlkPSJicmVhZGNydW1icyI+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJjcnVtYl9ob21lX2xpbmsiPkhvbWU8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9ImRpdmlkZXIiPi88L3NwYW4+Jm5ic3A7PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJ3b3JrZmxvd3Nfdmlld2VyX2xpbmsiPldvcmtmbG93czwvYT4mbmJzcDs8c3BhbiBjbGFzcz0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDs8c3BhbiB3aWNrZXQ6aWQ9IndvcmtmbG93X2lkIj51cm46b29kdDpMb25nV29ya2Zsb3c8L3NwYW4+PC9kaXY+Cis8aDM+V29ya2Zsb3cgRGV0YWlsczo8L2gzPgorPGRpdiB3aWNrZXQ6aWQ9IndvcmtmbG93X3ZpZXdlciIgaWQ9IndvcmtmbG93X3ZpZXdlciIvPgorPC93aWNrZXQ6ZXh0ZW5kPgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93Vmlld2VyUGFnZS5qYXZhIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93Vmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODc2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dWaWV3ZXJQYWdlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93Lm1vZGVsLldvcmtmbG93Vmlld2VyOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworCisvKioKKyAqIAorICogQ29udHJvbGxlciBmb3IgdGhlIFdvcmtmbG93Vmlld2VyUGFnZS5odG1sLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93Vmlld2VyUGFnZSBleHRlbmRzIFdvcmtmbG93Q3J1bWJlZFBhZ2UgeworCisgIC8qKgorICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgKi8KKyAgcHVibGljIFdvcmtmbG93Vmlld2VyUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgYWRkKG5ldyBXb3JrZmxvd1ZpZXdlcigid29ya2Zsb3dfdmlld2VyIiwgYXBwLmdldFdtVXJsU3RyKCksCisgICAgICAgIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpLCBXb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlLmNsYXNzKSk7CisgICAgYWRkKG5ldyBMaW5rKCJ3b3JrZmxvd3Nfdmlld2VyX2xpbmsiKXsKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShXb3JrZmxvd3NWaWV3ZXJQYWdlLmNsYXNzKTsgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9KTsKKyAgICAKKyAgICBhZGQobmV3IExhYmVsKCJ3b3JrZmxvd19pZCIsIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL1dvcmtmbG93c1ZpZXdlclBhZ2UuaHRtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd3NWaWV3ZXJQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDUxNjdmYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd3NWaWV3ZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpleHRlbmQ+Cis8ZGl2IGlkPSJicmVhZGNydW1icyI+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJjcnVtYl9ob21lX2xpbmsiPkhvbWU8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9ImRpdmlkZXIiPi88L3NwYW4+Jm5ic3A7V29ya2Zsb3dzJm5ic3A7PC9kaXY+Cis8ZGl2IHdpY2tldDppZD0id29ya2Zsb3dzX3ZpZXdlciIgaWQ9IndvcmtmbG93c192aWV3ZXIiLz4KKzwvd2lja2V0OmV4dGVuZD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9Xb3JrZmxvd3NWaWV3ZXJQYWdlLmphdmEgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dzVmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZjBkZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvV29ya2Zsb3dzVmlld2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93Lm1vZGVsLldvcmtmbG93c1ZpZXdlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworCisvKioKKyAqCisgKiBQYWdlIGNvbnRyb2xsZXIgZm9yIHRoZSBXb3JrZmxvd3NWaWV3ZXJQYWdlLmh0bWwuCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93c1ZpZXdlclBhZ2UgZXh0ZW5kcyBXb3JrZmxvd0NydW1iZWRQYWdlIHsKKworICAvKioKKyAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd3NWaWV3ZXJQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICBhZGQobmV3IFdvcmtmbG93c1ZpZXdlcigid29ya2Zsb3dzX3ZpZXdlciIsIGFwcC5nZXRXbVVybFN0cigpLAorICAgICAgICBXb3JrZmxvd1ZpZXdlclBhZ2UuY2xhc3MpKTsKKyAgCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2Jhbm5lci5qcGcgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvYmFubmVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMGU4YTFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2Jhbm5lci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2NvbmZpZy9Db25maWdQYWdlLmNzcyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvQ29uZmlnUGFnZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3YWYxNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvQ29uZmlnUGFnZS5jc3MKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2Rpdi50YWJwYW5lbCBkaXYudGFiLXJvdyB1bCB7CisgICAgaGVpZ2h0OiAyMHB4OworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgYmFja2dyb3VuZDogdXJsKCAuLi8uLi9pbWFnZXMvdGFiX2JvdHRvbS5naWYgKSByZXBlYXQteCBib3R0b207Cit9CisKK2Rpdi50YWJwYW5lbCBkaXYudGFiLXJvdyBsaSB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKK30KKworZGl2LnRhYnBhbmVsIGRpdi50YWItcm93IGE6bGluaywgZGl2LnRhYnBhbmVsIGRpdi50YWItcm93IGE6dmlzaXRlZCB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgYmFja2dyb3VuZDogI2YzZjNmMzsKKyAgICBmb250LXNpemU6IDEycHg7CisgICAgbGluZS1oZWlnaHQ6IDE0cHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogMnB4IDEwcHggMnB4IDEwcHg7CisgICAgbWFyZ2luLXJpZ2h0OiA0cHg7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgY29sb3I6ICM2NjY7Cit9CisKK2Rpdi50YWJwYW5lbCBkaXYudGFiLXJvdyBsaS5zZWxlY3RlZCBhOmxpbmssIGRpdi50YWJwYW5lbCBkaXYudGFiLXJvdyBhOnZpc2l0ZWQuYWN0aXZlIHsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZjsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIGNvbG9yOiAjMDAwOworfQorCitkaXYudGFicGFuZWwgZGl2LnRhYi1yb3cgYTpob3ZlciB7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvQ29uZmlnUGFnZS5odG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2NvbmZpZy9Db25maWdQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOTA4NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvQ29uZmlnUGFnZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6ZXh0ZW5kPgorPHdpY2tldDpsaW5rPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJDb25maWdQYWdlLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKworPHA+Jm5ic3A7PC9wPgorPGRpdiB3aWNrZXQ6aWQ9InRhYnMiIGNsYXNzPSJ0YWJwYW5lbCI+W3RhYmJlZCBwYW5lbCB3aWxsIGJlIGhlcmVdPC9kaXY+Cis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvY29uZmlnL0NvbmZpZ1BhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvQ29uZmlnUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWJhOGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvY29uZmlnL0NvbmZpZ1BhZ2UuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuQmFzZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5jb25maWcuZmlsZW1nci5GaWxlTWFuYWdlckNvbmZpZ1BhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuZXh0ZW5zaW9ucy5tYXJrdXAuaHRtbC50YWJzLkFic3RyYWN0VGFiOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LmV4dGVuc2lvbnMubWFya3VwLmh0bWwudGFicy5JVGFiOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LmV4dGVuc2lvbnMubWFya3VwLmh0bWwudGFicy5UYWJiZWRQYW5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5wYW5lbC5QYW5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC5Nb2RlbDsKKworLyoqCisgKiAKKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWdQYWdlIGV4dGVuZHMgQmFzZVBhZ2UgeworCisgIC8qKgorICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgKi8KKyAgcHVibGljIENvbmZpZ1BhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworCisgICAgTGlzdDxJVGFiPiB0YWJzID0gbmV3IFZlY3RvcjxJVGFiPigpOworICAgIHRhYnMuYWRkKG5ldyBBYnN0cmFjdFRhYihuZXcgTW9kZWw8U3RyaW5nPigiRmlsZSBNYW5hZ2VyIikpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFBhbmVsIGdldFBhbmVsKFN0cmluZyBpZCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVNYW5hZ2VyQ29uZmlnUGFnZShpZCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0YWJzLmFkZChuZXcgQWJzdHJhY3RUYWIobmV3IE1vZGVsPFN0cmluZz4oIldvcmtmbG93IE1hbmFnZXIiKSkgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZQorICAgICAgICogb3JnLmFwYWNoZS53aWNrZXQuZXh0ZW5zaW9ucy5tYXJrdXAuaHRtbC50YWJzLkFic3RyYWN0VGFiI2dldFBhbmVsKAorICAgICAgICogamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUGFuZWwgZ2V0UGFuZWwoU3RyaW5nIGlkKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0YWJzLmFkZChuZXcgQWJzdHJhY3RUYWIobmV3IE1vZGVsPFN0cmluZz4oIlJlc291cmNlIE1hbmFnZXIiKSkgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZQorICAgICAgICogb3JnLmFwYWNoZS53aWNrZXQuZXh0ZW5zaW9ucy5tYXJrdXAuaHRtbC50YWJzLkFic3RyYWN0VGFiI2dldFBhbmVsKAorICAgICAgICogamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUGFuZWwgZ2V0UGFuZWwoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRhYnMuYWRkKG5ldyBBYnN0cmFjdFRhYihuZXcgTW9kZWw8U3RyaW5nPigiUEdFIENvbmZpZ3VyYXRpb24iKSkgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZQorICAgICAgICogb3JnLmFwYWNoZS53aWNrZXQuZXh0ZW5zaW9ucy5tYXJrdXAuaHRtbC50YWJzLkFic3RyYWN0VGFiI2dldFBhbmVsKAorICAgICAgICogamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUGFuZWwgZ2V0UGFuZWwoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIFRhYmJlZFBhbmVsIHRhYmJlZFBhbmVsID0gbmV3IFRhYmJlZFBhbmVsKCJ0YWJzIiwgdGFicyk7CisgICAgdGFiYmVkUGFuZWwuc2V0U2VsZWN0ZWRUYWIoZ2V0VGFiSWR4KHRhYnMsCisgICAgICAgIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJ0YWIiLCAiRmlsZSBNYW5hZ2VyIikpKTsKKworICAgIGFkZCh0YWJiZWRQYW5lbCk7CisgIH0KKworICBwcml2YXRlIGludCBnZXRUYWJJZHgoTGlzdDxJVGFiPiB0YWJzLCBTdHJpbmcgdGFiTmFtZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5zaXplKCk7IGkrKykgeworICAgICAgSVRhYiB0YWIgPSB0YWJzLmdldChpKTsKKyAgICAgIGlmICh0YWIuZ2V0VGl0bGUoKS5nZXRPYmplY3QoKS5lcXVhbHModGFiTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvZmlsZW1nci9GaWxlTWFuYWdlckNvbmZpZ1BhZ2UuY3NzIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2NvbmZpZy9maWxlbWdyL0ZpbGVNYW5hZ2VyQ29uZmlnUGFnZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4ZWU1NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvZmlsZW1nci9GaWxlTWFuYWdlckNvbmZpZ1BhZ2UuY3NzCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZm1fY2ZnX291dGVyX3NoZWxseworCXdpZHRoOjEwMCU7CisJaGVpZ2h0OjU3MHB4OworCWJvcmRlci1zcGFjaW5nOjBweDsKKwlib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOworfQorCisjc2l4cGFkZGVkeworCXdpZHRoOjEwMHB4OworCWJvcmRlcjoxcHggc29saWQgIzAwMDAwMDsKKwlib3JkZXItc3BhY2luZzowcHg7CisJcGFkZGluZzogNnB4OworfQorCisKK3RkLmZjZmdfaGVhZGVyeworCXdoaXRlLXNwYWNlOm5vd3JhcDsKKwl0ZXh0LWFsaWduOnJpZ2h0OworCWZvbnQtd2VpZ2h0OmJvbGQ7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvY29uZmlnL2ZpbGVtZ3IvRmlsZU1hbmFnZXJDb25maWdQYWdlLmh0bWwgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvY29uZmlnL2ZpbGVtZ3IvRmlsZU1hbmFnZXJDb25maWdQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlODE5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvZmlsZW1nci9GaWxlTWFuYWdlckNvbmZpZ1BhZ2UuaHRtbApAQCAtMCwwICsxLDEwNCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpwYW5lbD4KKzx3aWNrZXQ6bGluaz4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iRmlsZU1hbmFnZXJDb25maWdQYWdlLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKzxkaXYgaWQ9ImZvcm1fc2hlbGwiPgorPHA+Jm5ic3A7PC9wPgorCTxmb3JtPgorCQk8dGFibGUgaWQ9ImZtX2NmZ19vdXRlcl9zaGVsbCI+CisJCQk8dHIgc3R5bGU9ImhlaWdodDoxMCUiPgorCQkJCTx0ZD4KKwkJCQkJPHRhYmxlIGlkPSJzaXhwYWRkZWQiPgorCQkJCQkJPHRyPgorCQkJCQkJCTx0ZCBjbGFzcz0iZmNmZ19oZWFkZXIiPlBvcnQgTnVtYmVyOiZuYnNwOyZuYnNwOworCQkJCQkJCTwvdGQ+CisJCQkJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48aW5wdXQgaWQ9InBvcnRfbnVtYmVyIiBzaXplPSIyMCIKKwkJCQkJCQkJbWF4bGVuZ3RoPSI1MCIgdmFsdWU9IjkwMDAiIC8+CisJCQkJCQkJPC90ZD4KKwkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCQk8dHI+CisJCQkJCQkJPHRkIGNsYXNzPSJmY2ZnX2hlYWRlciI+VHJhbnNmZXI6CisJCQkJCQkJPC90ZD4KKwkJCQkJCQk8dGQgY29sc3Bhbj0iMyI+Jm5ic3A7PC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCQk8dHIgaWQ9InRyYW5zZmVyX3R5cGVzIj4KKwkJCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJCQk8dGQ+Jm5ic3A7Jm5ic3A7PGlucHV0IHR5cGU9InJhZGlvIiBpZD0idHJhbnNmZXJfdHlwZSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5Ij5Mb2NhbDwvaW5wdXQ+CisJCQkJCQkJPHdpY2tldDpyZW1vdmU+CisJCQkJCQkJICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0idHJhbnNmZXJfdHlwZSIgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuUmVtb3RlRGF0YVRyYW5zZmVyRmFjdG9yeSI+UmVtb3RlPC9pbnB1dD4KKwkJCQkJCQk8L3dpY2tldDpyZW1vdmU+CisJCQkJCQkJPC90ZD4KKwkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCQk8dHI+CisJCQkJCQkJPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CisJCQkJCQkJPHRkIGNsYXNzPSJmY2ZnX2hlYWRlciI+Q2h1bmsgU2l6ZToKKwkJCQkJCQk8L3RkPgorCQkJCQkJCTx0ZCBhbGlnbj0ibGVmdCI+PGlucHV0IHR5cGU9InRleHQiIGlkPSJyZW1vdGVfY2h1bmtfc2l6ZSIKKwkJCQkJCQkJc2l6ZT0iMjAiIG1heGxlbmd0aD0iNTAiIHZhbHVlPSIiIC8+CisJCQkJCQkJPC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCTwvdGFibGU+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHIgc3R5bGU9ImhlaWdodDoyNSUiPgorCQkJCTx0ZD4KKwkJCQkJPCEtLSBpbmNsdWRlIGNhdGFsb2cganNwIC0tPjwvdGQ+CisJCQk8L3RyPgorCQkJPHRyIHN0eWxlPSJoZWlnaHQ6MjUlOyI+CisJCQkJPHRkPgorCQkJCQk8IS0tIGluY2x1ZGUgUmVwb3NpdG9yeSBqc3AgLS0+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHIgc3R5bGU9ImhlaWdodDoyNSU7Ij4KKwkJCQk8dGQ+CisJCQkJCTwhLS0gaW5jbHVkZSBWYWxpZGF0aW9uIGpzcCAtLT48L3RkPgorCQkJPC90cj4KKwkJCTx0ciBzdHlsZT0iaGVpZ2h0OjEwJTsiPgorCQkJCTx0ZD4KKwkJCQkJPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDAlIj4KKwkJCQkJCTx0cj4KKwkJCQkJCQk8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImZjZmdfaGVhZGVyIj48Yj5YTUwtUlBMIENvbmZpZ3VyYXRpb246PC9iPgorCQkJCQkJCTwvdGQ+CisJCQkJCQk8L3RyPgorCQkJCQkJPHRyPgorCQkJCQkJCTx0ZCBzdHlsZT0id2lkdGg6MzAlIiBjbGFzcz0iZmNmZ19oZWFkZXIiPkNvbm5lY3Rpb24gVGltZW91dDombmJzcDsmbmJzcDs8aW5wdXQKKwkJCQkJCQkJdHlwZT0idGV4dCIgaWQ9ImNvbm5lY3Rpb25fdGltZV9vdXQiIHNpemU9IjIwIiB2YWx1ZT0iMjAiIC8+CisJCQkJCQkJPC90ZD4KKwkJCQkJCQk8dGQgc3R5bGU9IndpZHRoOjMwJSIgY2xhc3M9ImZjZmdfaGVhZGVyIj5SZXF1ZXN0IFRpbWVvdXQ6Jm5ic3A7Jm5ic3A7PGlucHV0CisJCQkJCQkJCXR5cGU9InRleHQiIGlkPSJyZXF1ZXN0X3RpbWVvdXQiIHNpemU9IjIwIiB2YWx1ZT0iNjAiIC8+CisJCQkJCQkJPC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCTwvdGFibGU+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCQk8dHIgc3R5bGU9ImhlaWdodDo1JTsiPgorCQkJCTx0ZD4KKwkJCQkJPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDAlIj4KKwkJCQkJCTx0cj4KKwkJCQkJCQk8dGQgYWxpZ249InJpZ2h0Ij48aW5wdXQKKwkJCQkJCQkJdHlwZT0ic3VibWl0IiBpZD0ic2F2ZV9mbV9jZmciIHZhbHVlPSJTYXZlIi8+CisJCQkJCQkJPC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCTwvdGFibGU+CisJCQkgICAgPC90ZD4KKwkJCTwvdHI+CisJCTwvdGFibGU+CisJPC9mb3JtPgorPC9kaXY+Cis8L3dpY2tldDpwYW5lbD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvZmlsZW1nci9GaWxlTWFuYWdlckNvbmZpZ1BhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvZmlsZW1nci9GaWxlTWFuYWdlckNvbmZpZ1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWE2MTAzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2NvbmZpZy9maWxlbWdyL0ZpbGVNYW5hZ2VyQ29uZmlnUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuY29uZmlnLmZpbGVtZ3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5wYW5lbC5QYW5lbDsKKworLyoqCisgKgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTWFuYWdlckNvbmZpZ1BhZ2UgZXh0ZW5kcyBQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQ1MzM2MjQwNDM0NDI4OTE5TDsKKworICAvKioKKyAgICogQHBhcmFtIGlkCisgICAqLworICBwdWJsaWMgRmlsZU1hbmFnZXJDb25maWdQYWdlKFN0cmluZyBpZCkgeworICAgIHN1cGVyKGlkKTsKKyAgfQorCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9jb25maWcvdGFiX2JvdHRvbS5naWYgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvY29uZmlnL3RhYl9ib3R0b20uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzBhYWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvY29uZmlnL3RhYl9ib3R0b20uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9mb290ZXJfaW1hZ2UxLmdpZiBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9mb290ZXJfaW1hZ2UxLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYzk0YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2Zvb3Rlcl9pbWFnZTEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9mb290ZXJfaW1hZ2UyLmdpZiBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9mb290ZXJfaW1hZ2UyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NjgzNmMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2Zvb3Rlcl9pbWFnZTIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9qcXVlcnktMS43Lm1pbi5qcyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9qcXVlcnktMS43Lm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E1ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2pxdWVyeS0xLjcubWluLmpzCkBAIC0wLDAgKzEsNCBAQAorLyohIGpRdWVyeSB2MS43IGpxdWVyeS5jb20gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KKyhmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGNBKGEpe3JldHVybiBmLmlzV2luZG93KGEpP2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9ZnVuY3Rpb24gY3goYSl7aWYoIWNtW2FdKXt2YXIgYj1jLmJvZHksZD1mKCI8IithKyI+IikuYXBwZW5kVG8oYiksZT1kLmNzcygiZGlzcGxheSIpO2QucmVtb3ZlKCk7aWYoZT09PSJub25lInx8ZT09PSIiKXtjbnx8KGNuPWMuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksY24uZnJhbWVCb3JkZXI9Y24ud2lkdGg9Y24uaGVpZ2h0PTApLGIuYXBwZW5kQ2hpbGQoY24pO2lmKCFjb3x8IWNuLmNyZWF0ZUVsZW1lbnQpY289KGNuLmNvbnRlbnRXaW5kb3d8fGNuLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsY28ud3JpdGUoKGMuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0Ij8iPCFkb2N0eXBlIGh0bWw+IjoiIikrIjxodG1sPjxib2R5PiIpLGNvLmNsb3NlKCk7ZD1jby5jcmVhdGVFbGVtZW50KGEpLGNvLmJvZHkuYXBwZW5kQ2hpbGQoZCksZT1mLmNzcyhkLCJkaXNwbGF5IiksYi5yZW1vdmVDaGlsZChjbil9Y21bYV09ZX1yZXR1cm4gY21bYV19ZnVuY3Rpb24gY3coYSxiKXt2YXIgYz17fTtmLmVhY2goY3MuY29uY2F0LmFwcGx5KFtdLGNzLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7Y1t0aGlzXT1hfSk7cmV0dXJuIGN9ZnVuY3Rpb24gY3YoKXtjdD1ifWZ1bmN0aW9uIGN1KCl7c2V0VGltZW91dChjdiwwKTtyZXR1cm4gY3Q9Zi5ub3coKX1mdW5jdGlvbiBjbCgpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fWZ1bmN0aW9uIGNrKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uIGNlKGEsYyl7YS5kYXRhRmlsdGVyJiYoYz1hLmRhdGFGaWx0ZXIoYyxhLmRhdGFUeXBlKSk7dmFyIGQ9YS5kYXRhVHlwZXMsZT17fSxnLGgsaT1kLmxlbmd0aCxqLGs9ZFswXSxsLG0sbixvLHA7Zm9yKGc9MTtnPGk7ZysrKXtpZihnPT09MSlmb3IoaCBpbiBhLmNvbnZlcnRlcnMpdHlwZW9mIGg9PSJzdHJpbmciJiYoZVtoLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1toXSk7bD1rLGs9ZFtnXTtpZihrPT09IioiKWs9bDtlbHNlIGlmKGwhPT0iKiImJmwhPT1rKXttPWwrIiAiK2ssbj1lW21dfHxlWyIqICIra107aWYoIW4pe3A9Yjtmb3IobyBpbiBlKXtqPW8uc3BsaXQoIiAiKTtpZihqWzBdPT09bHx8alswXT09PSIqIil7cD1lW2pbMV0rIiAiK2tdO2lmKHApe289ZVtvXSxvPT09ITA/bj1wOnA9PT0hMCYmKG49byk7YnJlYWt9fX19IW4mJiFwJiZmLmVycm9yKCJObyBjb252ZXJzaW9uIGZyb20gIittLnJlcGxhY2UoIiAiLCIgdG8gIikpLG4hPT0hMCYmKGM9bj9uKGMpOnAobyhjKSkpfX1yZXR1cm4gY31mdW5jdGlvbiBjZChhLGMsZCl7dmFyIGU9YS5jb250ZW50cyxmPWEuZGF0YVR5cGVzLGc9YS5yZXNwb25zZUZpZWxkcyxoLGksaixrO2ZvcihpIGluIGcpaSBpbiBkJiYoY1tnW2ldXT1kW2ldKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxoPT09YiYmKGg9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGgpZm9yKGkgaW4gZSlpZihlW2ldJiZlW2ldLnRlc3QoaCkpe2YudW5zaGlmdChpKTticmVha31pZihmWzBdaW4gZClqPWZbMF07ZWxzZXtmb3IoaSBpbiBkKXtpZighZlswXXx8YS5jb252ZXJ0ZXJzW2krIiAiK2ZbMF1dKXtqPWk7YnJlYWt9a3x8KGs9aSl9aj1qfHxrfWlmKGope2ohPT1mWzBdJiZmLnVuc2hpZnQoaik7cmV0dXJuIGRbal19fWZ1bmN0aW9uIGNjKGEsYixjLGQpe2lmKGYuaXNBcnJheShiKSlmLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fGJHLnRlc3QoYSk/ZChhLGUpOmNjKGErIlsiKyh0eXBlb2YgZT09Im9iamVjdCJ8fGYuaXNBcnJheShlKT9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZighYyYmYiE9bnVsbCYmdHlwZW9mIGI9PSJvYmplY3QiKWZvcih2YXIgZSBpbiBiKWNjKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBjYihhLGMpe3ZhciBkLGUsZz1mLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYyljW2RdIT09YiYmKChnW2RdP2E6ZXx8KGU9e30pKVtkXT1jW2RdKTtlJiZmLmV4dGVuZCghMCxhLGUpfWZ1bmN0aW9uIGNhKGEsYyxkLGUsZixnKXtmPWZ8fGMuZGF0YVR5cGVzWzBdLGc9Z3x8e30sZ1tmXT0hMDt2YXIgaD1hW2ZdLGk9MCxqPWg/aC5sZW5ndGg6MCxrPWE9PT1iVixsO2Zvcig7aTxqJiYoa3x8IWwpO2krKylsPWhbaV0oYyxkLGUpLHR5cGVvZiBsPT0ic3RyaW5nIiYmKCFrfHxnW2xdP2w9YjooYy5kYXRhVHlwZXMudW5zaGlmdChsKSxsPWNhKGEsYyxkLGUsbCxnKSkpOyhrfHwhbCkmJiFnWyIqIl0mJihsPWNhKGEsYyxkLGUsIioiLGcpKTtyZXR1cm4gbH1mdW5jdGlvbiBiXyhhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt0eXBlb2YgYiE9InN0cmluZyImJihjPWIsYj0iKiIpO2lmKGYuaXNGdW5jdGlvbihjKSl7dmFyIGQ9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KGJSKSxlPTAsZz1kLmxlbmd0aCxoLGksajtmb3IoO2U8ZztlKyspaD1kW2VdLGo9L15cKy8udGVzdChoKSxqJiYoaD1oLnN1YnN0cigxKXx8IioiKSxpPWFbaF09YVtoXXx8W10saVtqPyJ1bnNoaWZ0IjoicHVzaCJdKGMpfX19ZnVuY3Rpb24gYkUoYSxiLGMpe3ZhciBkPWI9PT0id2lkdGgiP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZT1iPT09IndpZHRoIj9iejpiQTtpZihkPjApe2MhPT0iYm9yZGVyIiYmZi5lYWNoKGUsZnVuY3Rpb24oKXtjfHwoZC09cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDApLGM9PT0ibWFyZ2luIj9kKz1wYXJzZUZsb2F0KGYuY3NzKGEsYyt0aGlzKSl8fDA6ZC09cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwfSk7cmV0dXJuIGQrInB4In1kPWJCKGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MCxjJiZmLmVhY2goZSxmdW5jdGlvbigpe2QrPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrdGhpcykpfHwwLGMhPT0icGFkZGluZyImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDApLGM9PT0ibWFyZ2luIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK3RoaXMpKXx8MCl9KTtyZXR1cm4gZCsicHgifWZ1bmN0aW9uIGJyKGEsYil7Yi5zcmM/Zi5hamF4KHt1cmw6Yi5zcmMsYXN5bmM6ITEsZGF0YVR5cGU6InNjcmlwdCJ9KTpmLmdsb2JhbEV2YWwoKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKGJpLCIvKiQwKi8iKSksYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gYnEoYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JwKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxicCl9ZnVuY3Rpb24gYnAoYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibyhhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBibihhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYm0oYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmwoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gWChhKXt2YXIgYj1ZLnNwbGl0KCIgIiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFcoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoUi50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gVihhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gTigpe3JldHVybiEwfWZ1bmN0aW9uIE0oKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBLKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChLLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L1xkLyxuPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sbz0vXltcXSw6e31cc10qJC8scD0vXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLHE9LyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLHI9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxzPS8od2Via2l0KVsgXC9dKFtcdy5dKykvLHQ9LyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLHU9Lyhtc2llKSAoW1x3Ll0rKS8sdj0vKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLHc9Ly0oW2Etel18WzAtOV0pL2lnLHg9L14tbXMtLyx5PWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LHo9ZC51c2VyQWdlbnQsQSxCLEMsRD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxGPUFycmF5LnByb3RvdHlwZS5wdXNoLEc9QXJyYXkucHJvdG90eXBlLnNsaWNlLEg9U3RyaW5nLnByb3RvdHlwZS50cmltLEk9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsSj17fTtlLmZuPWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLGluaXQ6ZnVuY3Rpb24oYSxkLGYpe3ZhciBnLGgsaixrO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhZCYmYy5ib2R5KXt0aGlzLmNvbnRleHQ9Yyx0aGlzWzBdPWMuYm9keSx0aGlzLnNlbGVjdG9yPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09InN0cmluZyIpe2EuY2hhckF0KDApIT09IjwifHxhLmNoYXJBdChhLmxlbmd0aC0xKSE9PSI+Inx8YS5sZW5ndGg8Mz9nPWkuZXhlYyhhKTpnPVtudWxsLGEsbnVsbF07aWYoZyYmKGdbMV18fCFkKSl7aWYoZ1sxXSl7ZD1kIGluc3RhbmNlb2YgZT9kWzBdOmQsaz1kP2Qub3duZXJEb2N1bWVudHx8ZDpjLGo9bi5leGVjKGEpLGo/ZS5pc1BsYWluT2JqZWN0KGQpPyhhPVtjLmNyZWF0ZUVsZW1lbnQoalsxXSldLGUuZm4uYXR0ci5jYWxsKGEsZCwhMCkpOmE9W2suY3JlYXRlRWxlbWVudChqWzFdKV06KGo9ZS5idWlsZEZyYWdtZW50KFtnWzFdXSxba10pLGE9KGouY2FjaGVhYmxlP2UuY2xvbmUoai5mcmFnbWVudCk6ai5mcmFnbWVudCkuY2hpbGROb2Rlcyk7cmV0dXJuIGUubWVyZ2UodGhpcyxhKX1oPWMuZ2V0RWxlbWVudEJ5SWQoZ1syXSk7aWYoaCYmaC5wYXJlbnROb2RlKXtpZihoLmlkIT09Z1syXSlyZXR1cm4gZi5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1ofXRoaXMuY29udGV4dD1jLHRoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31yZXR1cm4hZHx8ZC5qcXVlcnk/KGR8fGYpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihkKS5maW5kKGEpfWlmKGUuaXNGdW5jdGlvbihhKSlyZXR1cm4gZi5yZWFkeShhKTthLnNlbGVjdG9yIT09YiYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KTtyZXR1cm4gZS5tYWtlQXJyYXkoYSx0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjciLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gRy5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY29uc3RydWN0b3IoKTtlLmlzQXJyYXkoYSk/Ri5hcHBseShkLGEpOmUubWVyZ2UoZCxhKSxkLnByZXZPYmplY3Q9dGhpcyxkLmNvbnRleHQ9dGhpcy5jb250ZXh0LGI9PT0iZmluZCI/ZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrYzpiJiYoZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIitiKyIoIitjKyIpIik7cmV0dXJuIGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7ZS5iaW5kUmVhZHkoKSxCLmFkZChhKTtyZXR1cm4gdGhpc30sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSwrYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRy5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixHLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpGLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm4sZS5leHRlbmQ9ZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZixnLGgsaT1hcmd1bWVudHNbMF18fHt9LGo9MSxrPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgaT09ImJvb2xlYW4iJiYobD1pLGk9YXJndW1lbnRzWzFdfHx7fSxqPTIpLHR5cGVvZiBpIT0ib2JqZWN0IiYmIWUuaXNGdW5jdGlvbihpKSYmKGk9e30pLGs9PT1qJiYoaT10aGlzLC0taik7Zm9yKDtqPGs7aisrKWlmKChhPWFyZ3VtZW50c1tqXSkhPW51bGwpZm9yKGMgaW4gYSl7ZD1pW2NdLGY9YVtjXTtpZihpPT09Ziljb250aW51ZTtsJiZmJiYoZS5pc1BsYWluT2JqZWN0KGYpfHwoZz1lLmlzQXJyYXkoZikpKT8oZz8oZz0hMSxoPWQmJmUuaXNBcnJheShkKT9kOltdKTpoPWQmJmUuaXNQbGFpbk9iamVjdChkKT9kOnt9LGlbY109ZS5leHRlbmQobCxoLGYpKTpmIT09YiYmKGlbY109Zil9cmV0dXJuIGl9LGUuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGIpe2EuJD09PWUmJihhLiQ9ZyksYiYmYS5qUXVlcnk9PT1lJiYoYS5qUXVlcnk9Zik7cmV0dXJuIGV9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/ZS5yZWFkeVdhaXQrKzplLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoYT09PSEwJiYhLS1lLnJlYWR5V2FpdHx8YSE9PSEwJiYhZS5pc1JlYWR5KXtpZighYy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7ZS5pc1JlYWR5PSEwO2lmKGEhPT0hMCYmLS1lLnJlYWR5V2FpdD4wKXJldHVybjtCLmZpcmVXaXRoKGMsW2VdKSxlLmZuLnRyaWdnZXImJmUoYykudHJpZ2dlcigicmVhZHkiKS51bmJpbmQoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighQil7Qj1lLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKTtpZihjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7aWYoYy5hZGRFdmVudExpc3RlbmVyKWMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQywhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlLnJlYWR5LCExKTtlbHNlIGlmKGMuYXR0YWNoRXZlbnQpe2MuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQyksYS5hdHRhY2hFdmVudCgib25sb2FkIixlLnJlYWR5KTt2YXIgYj0hMTt0cnl7Yj1hLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChkKXt9Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmImJksoKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmdHlwZW9mIGE9PSJvYmplY3QiJiYic2V0SW50ZXJ2YWwiaW4gYX0saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiBhIT1udWxsJiZtLnRlc3QoYSkmJiFpc05hTihhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SltELmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFFLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUUuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RS5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IGF9LHBhcnNlSlNPTjpmdW5jdGlvbihiKXtpZih0eXBlb2YgYiE9InN0cmluZyJ8fCFiKXJldHVybiBudWxsO2I9ZS50cmltKGIpO2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYik7aWYoby50ZXN0KGIucmVwbGFjZShwLCJAIikucmVwbGFjZShxLCJdIikucmVwbGFjZShyLCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrYikpKCk7ZS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxwYXJzZVhNTDpmdW5jdGlvbihjKXt2YXIgZCxmO3RyeXthLkRPTVBhcnNlcj8oZj1uZXcgRE9NUGFyc2VyLGQ9Zi5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChnKXtkPWJ9KCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmZS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyk7cmV0dXJuIGR9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmai50ZXN0KGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHgsIm1zLSIpLnJlcGxhY2Uodyx5KX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnPTAsaD1hLmxlbmd0aCxpPWg9PT1ifHxlLmlzRnVuY3Rpb24oYSk7aWYoZCl7aWYoaSl7Zm9yKGYgaW4gYSlpZihjLmFwcGx5KGFbZl0sZCk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmFwcGx5KGFbZysrXSxkKT09PSExKWJyZWFrfWVsc2UgaWYoaSl7Zm9yKGYgaW4gYSlpZihjLmNhbGwoYVtmXSxmLGFbZl0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5jYWxsKGFbZ10sZyxhW2crK10pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06SD9mdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpILmNhbGwoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKGssIiIpLnJlcGxhY2UobCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO2lmKGEhPW51bGwpe3ZhciBkPWUudHlwZShhKTthLmxlbmd0aD09bnVsbHx8ZD09PSJzdHJpbmcifHxkPT09ImZ1bmN0aW9uInx8ZD09PSJyZWdleHAifHxlLmlzV2luZG93KGEpP0YuY2FsbChjLGEpOmUubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYoSSlyZXR1cm4gSS5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmxlbmd0aCxlPTA7aWYodHlwZW9mIGMubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGY9Yy5sZW5ndGg7ZTxmO2UrKylhW2QrK109Y1tlXTtlbHNlIHdoaWxlKGNbZV0hPT1iKWFbZCsrXT1jW2UrK107YS5sZW5ndGg9ZDtyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSxjIT09ZSYmZC5wdXNoKGFbZl0pO3JldHVybiBkfSxtYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGcsaD1bXSxpPTAsaj1hLmxlbmd0aCxrPWEgaW5zdGFuY2VvZiBlfHxqIT09YiYmdHlwZW9mIGo9PSJudW1iZXIiJiYoaj4wJiZhWzBdJiZhW2otMV18fGo9PT0wfHxlLmlzQXJyYXkoYSkpO2lmKGspZm9yKDtpPGo7aSsrKWY9YyhhW2ldLGksZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO2Vsc2UgZm9yKGcgaW4gYSlmPWMoYVtnXSxnLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtyZXR1cm4gaC5jb25jYXQuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIil7dmFyIGQ9YVtjXTtjPWEsYT1kfWlmKCFlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGI7dmFyIGY9Ry5jYWxsKGFyZ3VtZW50cywyKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYyxmLmNvbmNhdChHLmNhbGwoYXJndW1lbnRzKSkpfTtnLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8Zy5ndWlkfHxlLmd1aWQrKztyZXR1cm4gZ30sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyxoKXt2YXIgaT1hLmxlbmd0aDtpZih0eXBlb2YgYz09Im9iamVjdCIpe2Zvcih2YXIgaiBpbiBjKWUuYWNjZXNzKGEsaixjW2pdLGYsZyxkKTtyZXR1cm4gYX1pZihkIT09Yil7Zj0haCYmZiYmZS5pc0Z1bmN0aW9uKGQpO2Zvcih2YXIgaz0wO2s8aTtrKyspZyhhW2tdLGMsZj9kLmNhbGwoYVtrXSxrLGcoYVtrXSxjKSk6ZCxoKTtyZXR1cm4gYX1yZXR1cm4gaT9nKGFbMF0sYyk6Yn0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9cy5leGVjKGEpfHx0LmV4ZWMoYSl8fHUuZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmdi5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjpiWzFdfHwiIix2ZXJzaW9uOmJbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtyZXR1cm4gbmV3IGEuZm4uaW5pdChiLGMpfWUuZXh0ZW5kKCEwLGEsdGhpcyksYS5zdXBlcmNsYXNzPXRoaXMsYS5mbj1hLnByb3RvdHlwZT10aGlzKCksYS5mbi5jb25zdHJ1Y3Rvcj1hLGEuc3ViPXRoaXMuc3ViLGEuZm4uaW5pdD1mdW5jdGlvbihkLGYpe2YmJmYgaW5zdGFuY2VvZiBlJiYhKGYgaW5zdGFuY2VvZiBhKSYmKGY9YShmKSk7cmV0dXJuIGUuZm4uaW5pdC5jYWxsKHRoaXMsZCxmLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShjKTtyZXR1cm4gYX0sYnJvd3Nlcjp7fX0pLGUuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0pbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksQT1lLnVhTWF0Y2goeiksQS5icm93c2VyJiYoZS5icm93c2VyW0EuYnJvd3Nlcl09ITAsZS5icm93c2VyLnZlcnNpb249QS52ZXJzaW9uKSxlLmJyb3dzZXIud2Via2l0JiYoZS5icm93c2VyLnNhZmFyaT0hMCksai50ZXN0KCLCoCIpJiYoaz0vXltcc1x4QTBdKy8sbD0vW1xzXHhBMF0rJC8pLGg9ZShjKSxjLmFkZEV2ZW50TGlzdGVuZXI/Qz1mdW5jdGlvbigpe2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQywhMSksZS5yZWFkeSgpfTpjLmF0dGFjaEV2ZW50JiYoQz1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSImJihjLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEMpLGUucmVhZHkoKSl9KSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KTtyZXR1cm4gZX0oKSxnPXt9O2YuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9YT9nW2FdfHxoKGEpOnt9O3ZhciBjPVtdLGQ9W10sZSxpLGosayxsLG09ZnVuY3Rpb24oYil7dmFyIGQsZSxnLGgsaTtmb3IoZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylnPWJbZF0saD1mLnR5cGUoZyksaD09PSJhcnJheSI/bShnKTpoPT09ImZ1bmN0aW9uIiYmKCFhLnVuaXF1ZXx8IW8uaGFzKGcpKSYmYy5wdXNoKGcpfSxuPWZ1bmN0aW9uKGIsZil7Zj1mfHxbXSxlPSFhLm1lbW9yeXx8W2IsZl0saT0hMCxsPWp8fDAsaj0wLGs9Yy5sZW5ndGg7Zm9yKDtjJiZsPGs7bCsrKWlmKGNbbF0uYXBwbHkoYixmKT09PSExJiZhLnN0b3BPbkZhbHNlKXtlPSEwO2JyZWFrfWk9ITEsYyYmKGEub25jZT9lPT09ITA/by5kaXNhYmxlKCk6Yz1bXTpkJiZkLmxlbmd0aCYmKGU9ZC5zaGlmdCgpLG8uZmlyZVdpdGgoZVswXSxlWzFdKSkpfSxvPXthZGQ6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYT1jLmxlbmd0aDttKGFyZ3VtZW50cyksaT9rPWMubGVuZ3RoOmUmJmUhPT0hMCYmKGo9YSxuKGVbMF0sZVsxXSkpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYj1hcmd1bWVudHMsZD0wLGU9Yi5sZW5ndGg7Zm9yKDtkPGU7ZCsrKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWlmKGJbZF09PT1jW2ZdKXtpJiZmPD1rJiYoay0tLGY8PWwmJmwtLSksYy5zcGxpY2UoZi0tLDEpO2lmKGEudW5pcXVlKWJyZWFrfX1yZXR1cm4gdGhpc30saGFzOmZ1bmN0aW9uKGEpe2lmKGMpe3ZhciBiPTAsZD1jLmxlbmd0aDtmb3IoO2I8ZDtiKyspaWYoYT09PWNbYl0pcmV0dXJuITB9cmV0dXJuITF9LGVtcHR5OmZ1bmN0aW9uKCl7Yz1bXTtyZXR1cm4gdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe2M9ZD1lPWI7cmV0dXJuIHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWN9LGxvY2s6ZnVuY3Rpb24oKXtkPWIsKCFlfHxlPT09ITApJiZvLmRpc2FibGUoKTtyZXR1cm4gdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWR9LGZpcmVXaXRoOmZ1bmN0aW9uKGIsYyl7ZCYmKGk/YS5vbmNlfHxkLnB1c2goW2IsY10pOighYS5vbmNlfHwhZSkmJm4oYixjKSk7cmV0dXJuIHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtvLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9fTtyZXR1cm4gb307dmFyIGk9W10uc2xpY2U7Zi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGM9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZD1mLkNhbGxiYWNrcygibWVtb3J5IiksZT0icGVuZGluZyIsZz17cmVzb2x2ZTpiLHJlamVjdDpjLG5vdGlmeTpkfSxoPXtkb25lOmIuYWRkLGZhaWw6Yy5hZGQscHJvZ3Jlc3M6ZC5hZGQsc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZX0saXNSZXNvbHZlZDpiLmZpcmVkLGlzUmVqZWN0ZWQ6Yy5maXJlZCx0aGVuOmZ1bmN0aW9uKGEsYixjKXtpLmRvbmUoYSkuZmFpbChiKS5wcm9ncmVzcyhjKTtyZXR1cm4gdGhpc30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyl9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGI9Yy5kb2N1bWVudEVsZW1lbnQsZCxlLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1O2Euc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksYS5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+PG5hdj48L25hdj4iLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFkfHwhZC5sZW5ndGh8fCFlKXJldHVybnt9O2c9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxoPWcuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksaT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGs9e2xlYWRpbmdXaGl0ZXNwYWNlOmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi90b3AvLnRlc3QoZS5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmUuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1Ly50ZXN0KGUuc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFlLnN0eWxlLmNzc0Zsb2F0LHVua25vd25FbGVtczohIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm5hdiIpLmxlbmd0aCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOmEuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFjLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLHN1Ym1pdEJ1YmJsZXM6ITAsY2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xvbmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEscmVsaWFibGVNYXJnaW5SaWdodDohMH0saS5jaGVja2VkPSEwLGsubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKHYpe2suZGVsZXRlRXhwYW5kbz0hMX0hYS5hZGRFdmVudExpc3RlbmVyJiZhLmF0dGFjaEV2ZW50JiZhLmZpcmVFdmVudCYmKGEuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxhLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxhLmFwcGVuZENoaWxkKGkpLGw9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbC5hcHBlbmRDaGlsZChhLmxhc3RDaGlsZCksay5jaGVja0Nsb25lPWwuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGEuaW5uZXJIVE1MPSIiLGEuc3R5bGUud2lkdGg9YS5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4IixtPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxvPWMuY3JlYXRlRWxlbWVudChtPyJkaXYiOiJib2R5IikscD17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxtJiZmLmV4dGVuZChwLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii05OTlweCIsdG9wOiItOTk5cHgifSk7Zm9yKHQgaW4gcClvLnN0eWxlW3RdPXBbdF07by5hcHBlbmRDaGlsZChhKSxuPW18fGIsbi5pbnNlcnRCZWZvcmUobyxuLmZpcnN0Q2hpbGQpLGsuYXBwZW5kQ2hlY2tlZD1pLmNoZWNrZWQsay5ib3hNb2RlbD1hLm9mZnNldFdpZHRoPT09Miwiem9vbSJpbiBhLnN0eWxlJiYoYS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLGEuc3R5bGUuem9vbT0xLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hLm9mZnNldFdpZHRoPT09MixhLnN0eWxlLmRpc3BsYXk9IiIsYS5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiIsay5zaHJpbmtXcmFwQmxvY2tzPWEub2Zmc2V0V2lkdGghPT0yKSxhLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLHE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSx1PXFbMF0ub2Zmc2V0SGVpZ2h0PT09MCxxWzBdLnN0eWxlLmRpc3BsYXk9IiIscVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz11JiZxWzBdLm9mZnNldEhlaWdodD09PTAsYS5pbm5lckhUTUw9IiIsYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLGEuYXBwZW5kQ2hpbGQoaiksay5yZWxpYWJsZU1hcmdpblJpZ2h0PShwYXJzZUludCgoYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGosbnVsbCl8fHttYXJnaW5SaWdodDowfSkubWFyZ2luUmlnaHQsMTApfHwwKT09PTApO2lmKGEuYXR0YWNoRXZlbnQpZm9yKHQgaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSlzPSJvbiIrdCx1PXMgaW4gYSx1fHwoYS5zZXRBdHRyaWJ1dGUocywicmV0dXJuOyIpLHU9dHlwZW9mIGFbc109PSJmdW5jdGlvbiIpLGtbdCsiQnViYmxlcyJdPXU7ZihmdW5jdGlvbigpe3ZhciBhLGIsZCxlLGcsaCxpPTEsaj0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbD0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitqKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLHA9IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7bT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IW18fChhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5zdHlsZS5jc3NUZXh0PWwrIndpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10b3A6IitpKyJweCIsbS5pbnNlcnRCZWZvcmUoYSxtLmZpcnN0Q2hpbGQpLG89Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxvLnN0eWxlLmNzc1RleHQ9aitsLG8uaW5uZXJIVE1MPXAsYS5hcHBlbmRDaGlsZChvKSxiPW8uZmlyc3RDaGlsZCxkPWIuZmlyc3RDaGlsZCxnPWIubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLGg9e2RvZXNOb3RBZGRCb3JkZXI6ZC5vZmZzZXRUb3AhPT01LGRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzOmcub2Zmc2V0VG9wPT09NX0sZC5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGQuc3R5bGUudG9wPSIyMHB4IixoLmZpeGVkUG9zaXRpb249ZC5vZmZzZXRUb3A9PT0yMHx8ZC5vZmZzZXRUb3A9PT0xNSxkLnN0eWxlLnBvc2l0aW9uPWQuc3R5bGUudG9wPSIiLGIuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWQub2Zmc2V0VG9wPT09LTUsaC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1tLm9mZnNldFRvcCE9PWksbS5yZW1vdmVDaGlsZChhKSxvPWE9bnVsbCxmLmV4dGVuZChrLGgpKX0pLG8uaW5uZXJIVE1MPSIiLG4ucmVtb3ZlQ2hpbGQobyksbz1sPWc9aD1tPWo9YT1pPW51bGw7cmV0dXJuIGt9KCksZi5ib3hNb2RlbD1mLnN1cHBvcnQuYm94TW9kZWw7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2FbZi5leHBhbmRvXTphW2YuZXhwYW5kb10mJmYuZXhwYW5kbyxvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtmLmV4cGFuZG9dPW49KytmLnV1aWQ6bj1mLmV4cGFuZG8pLG1bbl18fChtW25dPXt9LGx8fChtW25dLnRvSlNPTj1mLm5vb3ApKTtpZih0eXBlb2YgYz09Im9iamVjdCJ8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWU/bVtuXT1mLmV4dGVuZChtW25dLGMpOm1bbl0uZGF0YT1mLmV4dGVuZChtW25dLmRhdGEsYyk7Zz1oPW1bbl0sZXx8KGguZGF0YXx8KGguZGF0YT17fSksaD1oLmRhdGEpLGQhPT1iJiYoaFtmLmNhbWVsQ2FzZShjKV09ZCk7aWYobyYmIWhbY10pcmV0dXJuIGcuZXZlbnRzO2s/KGk9aFtjXSxpPT1udWxsJiYoaT1oW2YuY2FtZWxDYXNlKGMpXSkpOmk9aDtyZXR1cm4gaX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiLGMpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZCxlLGcsaD1mLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9mLmNhY2hlOmEsaz1pP2FbZi5leHBhbmRvXTpmLmV4cGFuZG87aWYoIWpba10pcmV0dXJuO2lmKGIpe2Q9Yz9qW2tdOmpba10uZGF0YTtpZihkKXtmLmlzQXJyYXkoYik/Yj1iOmIgaW4gZD9iPVtiXTooYj1mLmNhbWVsQ2FzZShiKSxiIGluIGQ/Yj1bYl06Yj1iLnNwbGl0KCIgIikpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbZi5leHBhbmRvXTphLnJlbW92ZUF0dHJpYnV0ZT9hLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pOmFbZi5leHBhbmRvXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTtpZighYXJndW1lbnRzLmxlbmd0aCl7aWYoZyl7Yz1mLnZhbEhvb2tzW2cubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbZy50eXBlXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGcsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWcudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocSwiIik6ZD09bnVsbD8iIjpkfXJldHVybiBifWU9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGc9Zih0aGlzKSxoO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtlP2g9YS5jYWxsKHRoaXMsZCxnLnZhbCgpKTpoPWEsaD09bnVsbD9oPSIiOnR5cGVvZiBoPT0ibnVtYmVyIj9oKz0iIjpmLmlzQXJyYXkoaCkmJihoPWYubWFwKGgsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPWYudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1t0aGlzLnR5cGVdO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsaCwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1ofX0pfX0pLGYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiFifHxiLnNwZWNpZmllZD9hLnZhbHVlOmEudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGc9YS5zZWxlY3RlZEluZGV4LGg9W10saT1hLm9wdGlvbnMsaj1hLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZzwwKXJldHVybiBudWxsO2M9aj9nOjAsZD1qP2crMTppLmxlbmd0aDtmb3IoO2M8ZDtjKyspe2U9aVtjXTtpZihlLnNlbGVjdGVkJiYoZi5zdXBwb3J0Lm9wdERpc2FibGVkPyFlLmRpc2FibGVkOmUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpPT09bnVsbCkmJighZS5wYXJlbnROb2RlLmRpc2FibGVkfHwhZi5ub2RlTmFtZShlLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtiPWYoZSkudmFsKCk7aWYoailyZXR1cm4gYjtoLnB1c2goYil9fWlmKGomJiFoLmxlbmd0aCYmaS5sZW5ndGgpcmV0dXJuIGYoaVtnXSkudmFsKCk7cmV0dXJuIGh9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWYubWFrZUFycmF5KGIpO2YoYSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Zi5pbkFycmF5KGYodGhpcykudmFsKCksYyk+PTB9KSxjLmxlbmd0aHx8KGEuc2VsZWN0ZWRJbmRleD0tMSk7cmV0dXJuIGN9fX0sYXR0ckZuOnt2YWw6ITAsY3NzOiEwLGh0bWw6ITAsdGV4dDohMCxkYXRhOiEwLHdpZHRoOiEwLGhlaWdodDohMCxvZmZzZXQ6ITB9LGF0dHI6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGcsaCxpLGo9YS5ub2RlVHlwZTtpZighYXx8aj09PTN8fGo9PT04fHxqPT09MilyZXR1cm4gYjtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKCEoImdldEF0dHJpYnV0ZSJpbiBhKSlyZXR1cm4gZi5wcm9wKGEsYyxkKTtpPWohPT0xfHwhZi5pc1hNTERvYyhhKSxpJiYoYz1jLnRvTG93ZXJDYXNlKCksaD1mLmF0dHJIb29rc1tjXXx8KHUudGVzdChjKT94OncpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybiBifWlmKGgmJiJzZXQiaW4gaCYmaSYmKGc9aC5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGc7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihoJiYiZ2V0ImluIGgmJmkmJihnPWguZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gZztnPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBnPT09bnVsbD9iOmd9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYS5ub2RlVHlwZT09PTEpe2Q9KGJ8fCIiKS5zcGxpdChwKSxnPWQubGVuZ3RoO2Zvcig7aDxnO2grKyllPWRbaF0udG9Mb3dlckNhc2UoKSxjPWYucHJvcEZpeFtlXXx8ZSxmLmF0dHIoYSxlLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh2P2U6YyksdS50ZXN0KGUpJiZjIGluIGEmJihhW2NdPSExKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoci50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaT1hLm5vZGVUeXBlO2lmKCFhfHxpPT09M3x8aT09PTh8fGk9PT0yKXJldHVybiBiO2g9aSE9PTF8fCFmLmlzWE1MRG9jKGEpLGgmJihjPWYucHJvcEZpeFtjXXx8YyxnPWYucHJvcEhvb2tzW2NdKTtyZXR1cm4gZCE9PWI/ZyYmInNldCJpbiBnJiYoZT1nLnNldChhLGQsYykpIT09Yj9lOmFbY109ZDpnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsYykpIT09bnVsbD9lOmFbY119LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNlSW50KGMudmFsdWUsMTApOnMudGVzdChhLm5vZGVOYW1lKXx8dC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifX19fSksZi5hdHRySG9va3MudGFiaW5kZXg9Zi5wcm9wSG9va3MudGFiSW5kZXgseD17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT1mLnByb3AoYSxjKTtyZXR1cm4gZT09PSEwfHx0eXBlb2YgZSE9ImJvb2xlYW4iJiYoZD1hLmdldEF0dHJpYnV0ZU5vZGUoYykpJiZkLm5vZGVWYWx1ZSE9PSExP2MudG9Mb3dlckNhc2UoKTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2I9PT0hMT9mLnJlbW92ZUF0dHIoYSxjKTooZD1mLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gY319LHZ8fCh5PXtuYW1lOiEwLGlkOiEwfSx3PWYudmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZDtkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZCYmKHlbY10/ZC5ub2RlVmFsdWUhPT0iIjpkLnNwZWNpZmllZCk/ZC5ub2RlVmFsdWU6Yn0sc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hLmdldEF0dHJpYnV0ZU5vZGUoZCk7ZXx8KGU9Yy5jcmVhdGVBdHRyaWJ1dGUoZCksYS5zZXRBdHRyaWJ1dGVOb2RlKGUpKTtyZXR1cm4gZS5ub2RlVmFsdWU9YisiIn19LGYuYXR0ckhvb2tzLnRhYmluZGV4LnNldD13LnNldCxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5hdHRySG9va3NbYl09Zi5leHRlbmQoZi5hdHRySG9va3NbYl0se3NldDpmdW5jdGlvbihhLGMpe2lmKGM9PT0iIil7YS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpO3JldHVybiBjfX19KX0pLGYuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17Z2V0OncuZ2V0LHNldDpmdW5jdGlvbihhLGIsYyl7Yj09PSIiJiYoYj0iZmFsc2UiKSx3LnNldChhLGIsYyl9fSksZi5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHxmLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGMpe2YuYXR0ckhvb2tzW2NdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2NdLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoYywyKTtyZXR1cm4gZD09PW51bGw/YjpkfX0pfSksZi5zdXBwb3J0LnN0eWxlfHwoZi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fGJ9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9IiIrYn19KSxmLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChmLnByb3BIb29rcy5zZWxlY3RlZD1mLmV4dGVuZChmLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpO3JldHVybiBudWxsfX0pKSxmLnN1cHBvcnQuZW5jdHlwZXx8KGYucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpLGYuc3VwcG9ydC5jaGVja09ufHxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmEudmFsdWV9fX0pLGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109Zi5leHRlbmQoZi52YWxIb29rc1t0aGlzXSx7c2V0OmZ1bmN0aW9uKGEsYil7aWYoZi5pc0FycmF5KGIpKXJldHVybiBhLmNoZWNrZWQ9Zi5pbkFycmF5KGYoYSkudmFsKCksYik+PTB9fSl9KTt2YXIgej0vXC4oLiopJC8sQT0vXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksQj0vXC4vZyxDPS8gL2csRD0vW15cd1xzLnxgXS9nLEU9L14oW15cLl0qKT8oPzpcLiguKykpPyQvLEY9L1xiaG92ZXIoXC5cUyspPy8sRz0vXmtleS8sSD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sST0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEo9ZnVuY3Rpb24oYSl7dmFyIGI9SS5leGVjKGEpO2ImJgorKGJbMV09KGJbMV18fCIiKS50b0xvd2VyQ2FzZSgpLGJbM109YlszXSYmbmV3IFJlZ0V4cCgiKD86XnxcXHMpIitiWzNdKyIoPzpcXHN8JCkiKSk7cmV0dXJuIGJ9LEs9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fGEuaWQ9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoYS5jbGFzc05hbWUpKX0sTD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKEYsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07Zi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9TChjKS5zcGxpdCgiICIpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspe2w9RS5leGVjKGNba10pfHxbXSxtPWxbMV0sbj0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxtPShnP3MuZGVsZWdhdGVUeXBlOnMuYmluZFR5cGUpfHxtLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxvPWYuZXh0ZW5kKHt0eXBlOm0sb3JpZ1R5cGU6bFsxXSxkYXRhOmUsaGFuZGxlcjpkLGd1aWQ6ZC5ndWlkLHNlbGVjdG9yOmcsbmFtZXNwYWNlOm4uam9pbigiLiIpfSxwKSxnJiYoby5xdWljaz1KKGcpLCFvLnF1aWNrJiZmLmV4cHIubWF0Y2guUE9TLnRlc3QoZykmJihvLmlzUG9zaXRpb25hbD0hMCkpLHI9alttXTtpZighcil7cj1qW21dPVtdLHIuZGVsZWdhdGVDb3VudD0wO2lmKCFzLnNldHVwfHxzLnNldHVwLmNhbGwoYSxlLG4saSk9PT0hMSlhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG0saSwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK20saSl9cy5hZGQmJihzLmFkZC5jYWxsKGEsbyksby5oYW5kbGVyLmd1aWR8fChvLmhhbmRsZXIuZ3VpZD1kLmd1aWQpKSxnP3Iuc3BsaWNlKHIuZGVsZWdhdGVDb3VudCsrLDAsbyk6ci5wdXNoKG8pLGYuZXZlbnQuZ2xvYmFsW21dPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5oYXNEYXRhKGEpJiZmLl9kYXRhKGEpLGcsaCxpLGosayxsLG0sbixvLHAscTtpZighIWUmJiEhKG09ZS5ldmVudHMpKXtiPUwoYnx8IiIpLnNwbGl0KCIgIik7Zm9yKGc9MDtnPGIubGVuZ3RoO2crKyl7aD1FLmV4ZWMoYltnXSl8fFtdLGk9aFsxXSxqPWhbMl07aWYoIWkpe2o9aj8iLiIrajoiIjtmb3IobCBpbiBtKWYuZXZlbnQucmVtb3ZlKGEsbCtqLGMsZCk7cmV0dXJufW49Zi5ldmVudC5zcGVjaWFsW2ldfHx7fSxpPShkP24uZGVsZWdhdGVUeXBlOm4uYmluZFR5cGUpfHxpLHA9bVtpXXx8W10saz1wLmxlbmd0aCxqPWo/bmV3IFJlZ0V4cCgiKF58XFwuKSIrai5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsO2lmKGN8fGp8fGR8fG4ucmVtb3ZlKWZvcihsPTA7bDxwLmxlbmd0aDtsKyspe3E9cFtsXTtpZighY3x8Yy5ndWlkPT09cS5ndWlkKWlmKCFqfHxqLnRlc3QocS5uYW1lc3BhY2UpKWlmKCFkfHxkPT09cS5zZWxlY3Rvcnx8ZD09PSIqKiImJnEuc2VsZWN0b3IpcC5zcGxpY2UobC0tLDEpLHEuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLG4ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEscSl9ZWxzZSBwLmxlbmd0aD0wO3AubGVuZ3RoPT09MCYmayE9PXAubGVuZ3RoJiYoKCFuLnRlYXJkb3dufHxuLnRlYXJkb3duLmNhbGwoYSxqKT09PSExKSYmZi5yZW1vdmVFdmVudChhLGksZS5oYW5kbGUpLGRlbGV0ZSBtW2ldKX1mLmlzRW1wdHlPYmplY3QobSkmJihvPWUuaGFuZGxlLG8mJihvLmVsZW09bnVsbCksZi5yZW1vdmVEYXRhKGEsWyJldmVudHMiLCJoYW5kbGUiXSwhMCkpfX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxlLGcpe2lmKCFlfHxlLm5vZGVUeXBlIT09MyYmZS5ub2RlVHlwZSE9PTgpe3ZhciBoPWMudHlwZXx8YyxpPVtdLGosayxsLG0sbixvLHAscSxyLHM7aC5pbmRleE9mKCIhIik+PTAmJihoPWguc2xpY2UoMCwtMSksaz0hMCksaC5pbmRleE9mKCIuIik+PTAmJihpPWguc3BsaXQoIi4iKSxoPWkuc2hpZnQoKSxpLnNvcnQoKSk7aWYoKCFlfHxmLmV2ZW50LmN1c3RvbUV2ZW50W2hdKSYmIWYuZXZlbnQuZ2xvYmFsW2hdKXJldHVybjtjPXR5cGVvZiBjPT0ib2JqZWN0Ij9jW2YuZXhwYW5kb10/YzpuZXcgZi5FdmVudChoLGMpOm5ldyBmLkV2ZW50KGgpLGMudHlwZT1oLGMuaXNUcmlnZ2VyPSEwLGMuZXhjbHVzaXZlPWssYy5uYW1lc3BhY2U9aS5qb2luKCIuIiksYy5uYW1lc3BhY2VfcmU9Yy5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIraS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsLG89aC5pbmRleE9mKCI6Iik8MD8ib24iK2g6IiIsKGd8fCFlKSYmYy5wcmV2ZW50RGVmYXVsdCgpO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG49bnVsbDtmb3IobT1lLnBhcmVudE5vZGU7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGg7bCsrKXttPXJbbF1bMF0sYy50eXBlPXJbbF1bMV0scT0oZi5fZGF0YShtLCJldmVudHMiKXx8e30pW2MudHlwZV0mJmYuX2RhdGEobSwiaGFuZGxlIikscSYmcS5hcHBseShtLGQpLHE9byYmbVtvXSxxJiZmLmFjY2VwdERhdGEobSkmJnEuYXBwbHkobSxkKTtpZihjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9Yy50eXBlPWgsYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8KCFwLl9kZWZhdWx0fHxwLl9kZWZhdWx0LmFwcGx5KGUub3duZXJEb2N1bWVudCxkKT09PSExKSYmKGghPT0iY2xpY2sifHwhZi5ub2RlTmFtZShlLCJhIikpJiZmLmFjY2VwdERhdGEoZSkmJm8mJmVbaF0mJihoIT09ImZvY3VzIiYmaCE9PSJibHVyInx8Yy50YXJnZXQub2Zmc2V0V2lkdGghPT0wKSYmIWYuaXNXaW5kb3coZSkmJihuPWVbb10sbiYmKGVbb109bnVsbCksZi5ldmVudC50cmlnZ2VyZWQ9aCxlW2hdKCksZi5ldmVudC50cmlnZ2VyZWQ9YixuJiYoZVtvXT1uKSk7cmV0dXJuIGMucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYyl7Yz1mLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZD0oZi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2MudHlwZV18fFtdLGU9ZC5kZWxlZ2F0ZUNvdW50LGc9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCksaD0hYy5leGNsdXNpdmUmJiFjLm5hbWVzcGFjZSxpPShmLmV2ZW50LnNwZWNpYWxbYy50eXBlXXx8e30pLmhhbmRsZSxqPVtdLGssbCxtLG4sbyxwLHEscixzLHQsdTtnWzBdPWMsYy5kZWxlZ2F0ZVRhcmdldD10aGlzO2lmKGUmJiFjLnRhcmdldC5kaXNhYmxlZCYmKCFjLmJ1dHRvbnx8Yy50eXBlIT09ImNsaWNrIikpZm9yKG09Yy50YXJnZXQ7bSE9dGhpczttPW0ucGFyZW50Tm9kZXx8dGhpcyl7bz17fSxxPVtdO2ZvcihrPTA7azxlO2srKylyPWRba10scz1yLnNlbGVjdG9yLHQ9b1tzXSxyLmlzUG9zaXRpb25hbD90PSh0fHwob1tzXT1mKHMpKSkuaW5kZXgobSk+PTA6dD09PWImJih0PW9bc109ci5xdWljaz9LKG0sci5xdWljayk6ZihtKS5pcyhzKSksdCYmcS5wdXNoKHIpO3EubGVuZ3RoJiZqLnB1c2goe2VsZW06bSxtYXRjaGVzOnF9KX1kLmxlbmd0aD5lJiZqLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaz0wO2s8ai5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aysrKXtwPWpba10sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3IobD0wO2w8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtsKyspe3I9cC5tYXRjaGVzW2xdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KGl8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQgd2hlZWxEZWx0YSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxkKXt2YXIgZSxmLGcsaD1kLmJ1dHRvbixpPWQuZnJvbUVsZW1lbnQ7YS5wYWdlWD09bnVsbCYmZC5jbGllbnRYIT1udWxsJiYoZT1hLnRhcmdldC5vd25lckRvY3VtZW50fHxjLGY9ZS5kb2N1bWVudEVsZW1lbnQsZz1lLmJvZHksYS5wYWdlWD1kLmNsaWVudFgrKGYmJmYuc2Nyb2xsTGVmdHx8ZyYmZy5zY3JvbGxMZWZ0fHwwKS0oZiYmZi5jbGllbnRMZWZ0fHxnJiZnLmNsaWVudExlZnR8fDApLGEucGFnZVk9ZC5jbGllbnRZKyhmJiZmLnNjcm9sbFRvcHx8ZyYmZy5zY3JvbGxUb3B8fDApLShmJiZmLmNsaWVudFRvcHx8ZyYmZy5jbGllbnRUb3B8fDApKSwhYS5yZWxhdGVkVGFyZ2V0JiZpJiYoYS5yZWxhdGVkVGFyZ2V0PWk9PT1hLnRhcmdldD9kLnRvRWxlbWVudDppKSwhYS53aGljaCYmaCE9PWImJihhLndoaWNoPWgmMT8xOmgmMj8zOmgmND8yOjApO3JldHVybiBhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbZi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgZCxlLGc9YSxoPWYuZXZlbnQuZml4SG9va3NbYS50eXBlXXx8e30saT1oLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGgucHJvcHMpOnRoaXMucHJvcHM7YT1mLkV2ZW50KGcpO2ZvcihkPWkubGVuZ3RoO2Q7KWU9aVstLWRdLGFbZV09Z1tlXTthLnRhcmdldHx8KGEudGFyZ2V0PWcuc3JjRWxlbWVudHx8YyksYS50YXJnZXQubm9kZVR5cGU9PT0zJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PT09YiYmKGEubWV0YUtleT1hLmN0cmxLZXkpO3JldHVybiBoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpmLmJpbmRSZWFkeX0sZm9jdXM6e2RlbGVnYXRlVHlwZToiZm9jdXNpbiIsbm9CdWJibGU6ITB9LGJsdXI6e2RlbGVnYXRlVHlwZToiZm9jdXNvdXQiLG5vQnViYmxlOiEwfSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5leHRlbmQobmV3IGYuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP2YuZXZlbnQudHJpZ2dlcihlLG51bGwsYik6Zi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sZi5ldmVudC5oYW5kbGU9Zi5ldmVudC5kaXNwYXRjaCxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/TjpNKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxmLm5vdygpLHRoaXNbZi5leHBhbmRvXT0hMH0sZi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Tjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1OO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1OLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpNLGlzUHJvcGFnYXRpb25TdG9wcGVkOk0saXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6TX0sZi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09Zi5ldmVudC5zcGVjaWFsW2JdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9YS5yZWxhdGVkVGFyZ2V0LGQ9YS5oYW5kbGVPYmosZT1kLnNlbGVjdG9yLGcsaDtpZighY3x8ZC5vcmlnVHlwZT09PWEudHlwZXx8YyE9PWImJiFmLmNvbnRhaW5zKGIsYykpZz1hLnR5cGUsYS50eXBlPWQub3JpZ1R5cGUsaD1kLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1nO3JldHVybiBofX19KSxmLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXt2YXIgYz1hLnRhcmdldCxkPWYubm9kZU5hbWUoYywiaW5wdXQiKXx8Zi5ub2RlTmFtZShjLCJidXR0b24iKT9jLmZvcm06YjtkJiYhZC5fc3VibWl0X2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmZi5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxkLl9zdWJtaXRfYXR0YWNoZWQ9ITApfSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxmLnN1cHBvcnQuY2hhbmdlQnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7aWYoQS50ZXN0KHRoaXMubm9kZU5hbWUpKXtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iKWYuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe2Eub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWU9PT0iY2hlY2tlZCImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksZi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtBLnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxiLl9jaGFuZ2VfYXR0YWNoZWQ9ITApfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIik7cmV0dXJuIEEudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxmLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9ZnVuY3Rpb24oYSl7Zi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LGYuZXZlbnQuZml4KGEpLCEwKX07Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxnKXt2YXIgaCxpO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1jLGM9Yik7Zm9yKGkgaW4gYSl0aGlzLm9uKGksYyxkLGFbaV0sZyk7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1NO2Vsc2UgaWYoIWUpcmV0dXJuIHRoaXM7Zz09PTEmJihoPWUsZT1mdW5jdGlvbihhKXtmKCkub2ZmKGEpO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWguZ3VpZHx8KGguZ3VpZD1mLmd1aWQrKykpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGEsZSxkLGMpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbi5jYWxsKHRoaXMsYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYyxkKXtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iail7dmFyIGU9YS5oYW5kbGVPYmo7ZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZS5uYW1lc3BhY2U/ZS50eXBlKyIuIitlLm5hbWVzcGFjZTplLnR5cGUsZS5zZWxlY3RvcixlLmhhbmRsZXIpO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ib2JqZWN0Iil7Zm9yKHZhciBnIGluIGEpdGhpcy5vZmYoZyxjLGFbZ10pO3JldHVybiB0aGlzfWlmKGM9PT0hMXx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZD1jLGM9YjtkPT09ITEmJihkPU0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLGEsZCxjKX0pfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sbGl2ZTpmdW5jdGlvbihhLGIsYyl7Zih0aGlzLmNvbnRleHQpLm9uKGEsdGhpcy5zZWxlY3RvcixiLGMpO3JldHVybiB0aGlzfSxkaWU6ZnVuY3Rpb24oYSxiKXtmKHRoaXMuY29udGV4dCkub2ZmKGEsdGhpcy5zZWxlY3Rvcnx8IioqIixiKTtyZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT0xP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhLGMpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0sITApfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YXJndW1lbnRzLGM9YS5ndWlkfHxmLmd1aWQrKyxkPTAsZT1mdW5jdGlvbihjKXt2YXIgZT0oZi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQpfHwwKSVkO2YuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSksYy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2UuZ3VpZD1jO3doaWxlKGQ8Yi5sZW5ndGgpYltkKytdLmd1aWQ9YztyZXR1cm4gdGhpcy5jbGljayhlKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSksZi5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhLGMpe2M9PW51bGwmJihjPWEsYT1udWxsKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMuYmluZChiLGEsYyk6dGhpcy50cmlnZ2VyKGIpfSxmLmF0dHJGbiYmKGYuYXR0ckZuW2JdPSEwKSxHLnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQua2V5SG9va3MpLEgudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5tb3VzZUhvb2tzKX0pLGZ1bmN0aW9uKCl7ZnVuY3Rpb24geChhLGIsYyxlLGYsZyl7Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1lW2hdO2lmKGope3ZhciBrPSExO2o9althXTt3aGlsZShqKXtpZihqW2RdPT09Yyl7az1lW2ouc2l6c2V0XTticmVha31pZihqLm5vZGVUeXBlPT09MSl7Z3x8KGpbZF09YyxqLnNpenNldD1oKTtpZih0eXBlb2YgYiE9InN0cmluZyIpe2lmKGo9PT1iKXtrPSEwO2JyZWFrfX1lbHNlIGlmKG0uZmlsdGVyKGIsW2pdKS5sZW5ndGg+MCl7az1qO2JyZWFrfX1qPWpbYV19ZVtoXT1rfX19ZnVuY3Rpb24gdyhhLGIsYyxlLGYsZyl7Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1lW2hdO2lmKGope3ZhciBrPSExO2o9althXTt3aGlsZShqKXtpZihqW2RdPT09Yyl7az1lW2ouc2l6c2V0XTticmVha31qLm5vZGVUeXBlPT09MSYmIWcmJihqW2RdPWMsai5zaXpzZXQ9aCk7aWYoai5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yil7az1qO2JyZWFrfWo9althXX1lW2hdPWt9fX12YXIgYT0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXlxbXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteXFtcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLGQ9InNpemNhY2hlIisoTWF0aC5yYW5kb20oKSsiIikucmVwbGFjZSgiLiIsIiIpLGU9MCxnPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsaD0hMSxpPSEwLGo9L1xcL2csaz0vXHJcbi9nLGw9L1xXLztbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7aT0hMTtyZXR1cm4gMH0pO3ZhciBtPWZ1bmN0aW9uKGIsZCxlLGYpe2U9ZXx8W10sZD1kfHxjO3ZhciBoPWQ7aWYoZC5ub2RlVHlwZSE9PTEmJmQubm9kZVR5cGUhPT05KXJldHVybltdO2lmKCFifHx0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIGU7dmFyIGksaixrLGwsbixxLHIsdCx1PSEwLHY9bS5pc1hNTChkKSx3PVtdLHg9Yjtkb3thLmV4ZWMoIiIpLGk9YS5leGVjKHgpO2lmKGkpe3g9aVszXSx3LnB1c2goaVsxXSk7aWYoaVsyXSl7bD1pWzNdO2JyZWFrfX19d2hpbGUoaSk7aWYody5sZW5ndGg+MSYmcC5leGVjKGIpKWlmKHcubGVuZ3RoPT09MiYmby5yZWxhdGl2ZVt3WzBdXSlqPXkod1swXSt3WzFdLGQsZik7ZWxzZXtqPW8ucmVsYXRpdmVbd1swXV0/W2RdOm0ody5zaGlmdCgpLGQpO3doaWxlKHcubGVuZ3RoKWI9dy5zaGlmdCgpLG8ucmVsYXRpdmVbYl0mJihiKz13LnNoaWZ0KCkpLGo9eShiLGosZil9ZWxzZXshZiYmdy5sZW5ndGg+MSYmZC5ub2RlVHlwZT09PTkmJiF2JiZvLm1hdGNoLklELnRlc3Qod1swXSkmJiFvLm1hdGNoLklELnRlc3Qod1t3Lmxlbmd0aC0xXSkmJihuPW0uZmluZCh3LnNoaWZ0KCksZCx2KSxkPW4uZXhwcj9tLmZpbHRlcihuLmV4cHIsbi5zZXQpWzBdOm4uc2V0WzBdKTtpZihkKXtuPWY/e2V4cHI6dy5wb3AoKSxzZXQ6cyhmKX06bS5maW5kKHcucG9wKCksdy5sZW5ndGg9PT0xJiYod1swXT09PSJ+Inx8d1swXT09PSIrIikmJmQucGFyZW50Tm9kZT9kLnBhcmVudE5vZGU6ZCx2KSxqPW4uZXhwcj9tLmZpbHRlcihuLmV4cHIsbi5zZXQpOm4uc2V0LHcubGVuZ3RoPjA/az1zKGopOnU9ITE7d2hpbGUody5sZW5ndGgpcT13LnBvcCgpLHI9cSxvLnJlbGF0aXZlW3FdP3I9dy5wb3AoKTpxPSIiLHI9PW51bGwmJihyPWQpLG8ucmVsYXRpdmVbcV0oayxyLHYpfWVsc2Ugaz13PVtdfWt8fChrPWopLGt8fG0uZXJyb3IocXx8Yik7aWYoZy5jYWxsKGspPT09IltvYmplY3QgQXJyYXldIilpZighdSllLnB1c2guYXBwbHkoZSxrKTtlbHNlIGlmKGQmJmQubm9kZVR5cGU9PT0xKWZvcih0PTA7a1t0XSE9bnVsbDt0Kyspa1t0XSYmKGtbdF09PT0hMHx8a1t0XS5ub2RlVHlwZT09PTEmJm0uY29udGFpbnMoZCxrW3RdKSkmJmUucHVzaChqW3RdKTtlbHNlIGZvcih0PTA7a1t0XSE9bnVsbDt0Kyspa1t0XSYma1t0XS5ub2RlVHlwZT09PTEmJmUucHVzaChqW3RdKTtlbHNlIHMoayxlKTtsJiYobShsLGgsZSxmKSxtLnVuaXF1ZVNvcnQoZSkpO3JldHVybiBlfTttLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7aWYodSl7aD1pLGEuc29ydCh1KTtpZihoKWZvcih2YXIgYj0xO2I8YS5sZW5ndGg7YisrKWFbYl09PT1hW2ItMV0mJmEuc3BsaWNlKGItLSwxKX1yZXR1cm4gYX0sbS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG0oYSxudWxsLG51bGwsYil9LG0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG0oYixudWxsLG51bGwsW2FdKS5sZW5ndGg+MH0sbS5maW5kPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk7aWYoIWEpcmV0dXJuW107Zm9yKGU9MCxmPW8ub3JkZXIubGVuZ3RoO2U8ZjtlKyspe2g9by5vcmRlcltlXTtpZihnPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpe2k9Z1sxXSxnLnNwbGljZSgxLDEpO2lmKGkuc3Vic3RyKGkubGVuZ3RoLTEpIT09IlxcIil7Z1sxXT0oZ1sxXXx8IiIpLnJlcGxhY2UoaiwiIiksZD1vLmZpbmRbaF0oZyxiLGMpO2lmKGQhPW51bGwpe2E9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2JyZWFrfX19fWR8fChkPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6W10pO3JldHVybntzZXQ6ZCxleHByOmF9fSxtLmZpbHRlcj1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLHAscT1hLHI9W10scz1jLHQ9YyYmY1swXSYmbS5pc1hNTChjWzBdKTt3aGlsZShhJiZjLmxlbmd0aCl7Zm9yKGggaW4gby5maWx0ZXIpaWYoKGY9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSkhPW51bGwmJmZbMl0pe2s9by5maWx0ZXJbaF0sbD1mWzFdLGc9ITEsZi5zcGxpY2UoMSwxKTtpZihsLnN1YnN0cihsLmxlbmd0aC0xKT09PSJcXCIpY29udGludWU7cz09PXImJihyPVtdKTtpZihvLnByZUZpbHRlcltoXSl7Zj1vLnByZUZpbHRlcltoXShmLHMsZCxyLGUsdCk7aWYoIWYpZz1pPSEwO2Vsc2UgaWYoZj09PSEwKWNvbnRpbnVlfWlmKGYpZm9yKG49MDsoaj1zW25dKSE9bnVsbDtuKyspaiYmKGk9ayhqLGYsbixzKSxwPWVeaSxkJiZpIT1udWxsP3A/Zz0hMDpzW25dPSExOnAmJihyLnB1c2goaiksZz0hMCkpO2lmKGkhPT1iKXtkfHwocz1yKSxhPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTtpZighZylyZXR1cm5bXTticmVha319aWYoYT09PXEpaWYoZz09bnVsbCltLmVycm9yKGEpO2Vsc2UgYnJlYWs7cT1hfXJldHVybiBzfSxtLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYX07dmFyIG49bS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLm5vZGVUeXBlLGU9IiI7aWYoZCl7aWYoZD09PTEpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBPPS9VbnRpbCQvLFA9L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sUT0vLC8sUj0vXi5bXjojXFtcLixdKiQvLFM9QXJyYXkucHJvdG90eXBlLnNsaWNlLFQ9Zi5leHByLm1hdGNoLlBPUyxVPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhXKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVyh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/VC50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9VC50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhWKGNbMF0pfHxWKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpLGc9Uy5jYWxsKGFyZ3VtZW50cyk7Ty50ZXN0KGEpfHwoZD1jKSxkJiZ0eXBlb2YgZD09InN0cmluZyImJihlPWYuZmlsdGVyKGQsZSkpLGU9dGhpcy5sZW5ndGg+MSYmIVVbYV0/Zi51bmlxdWUoZSk6ZSwodGhpcy5sZW5ndGg+MXx8US50ZXN0KGQpKSYmUC50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxnLmpvaW4oIiwiKSl9fSksZi5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsYyl7YyYmKGE9Ijpub3QoIithKyIpIik7cmV0dXJuIGIubGVuZ3RoPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmYuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGMsZCl7dmFyIGU9W10sZz1hW2NdO3doaWxlKGcmJmcubm9kZVR5cGUhPT05JiYoZD09PWJ8fGcubm9kZVR5cGUhPT0xfHwhZihnKS5pcyhkKSkpZy5ub2RlVHlwZT09PTEmJmUucHVzaChnKSxnPWdbY107cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxkKXtiPWJ8fDE7dmFyIGU9MDtmb3IoO2E7YT1hW2NdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KTt2YXIgWT0iYWJiciBhcnRpY2xlIGFzaWRlIGF1ZGlvIGNhbnZhcyBkYXRhbGlzdCBkZXRhaWxzIGZpZ2NhcHRpb24gZmlndXJlIGZvb3RlciBoZWFkZXIgaGdyb3VwIG1hcmsgbWV0ZXIgbmF2IG91dHB1dCBwcm9ncmVzcyBzZWN0aW9uIHN1bW1hcnkgdGltZSB2aWRlbyIsWj0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCQ9L15ccysvLF89LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZyxiYT0vPChbXHc6XSspLyxiYj0vPHRib2R5L2ksYmM9Lzx8JiM/XHcrOy8sYmQ9LzwoPzpzY3JpcHR8c3R5bGUpL2ksYmU9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSxiZj1uZXcgUmVnRXhwKCI8KD86IitZLnJlcGxhY2UoIiAiLCJ8IikrIikiLCJpIiksYmc9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmg9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiaT0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiaj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaz1YKGMpO2JqLm9wdGdyb3VwPWJqLm9wdGlvbixiai50Ym9keT1iai50Zm9vdD1iai5jb2xncm91cD1iai5jYXB0aW9uPWJqLnRoZWFkLGJqLnRoPWJqLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmouX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS53cmFwQWxsKGEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtmLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8Zih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1mKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9dGhpcy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiCissYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShaLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJkLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCEkLnRlc3QoYSkpJiYhYmpbKGJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShfLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKHZhciBjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXRoaXNbY10ubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEodGhpc1tjXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSx0aGlzW2NdLmlubmVySFRNTD1hKX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGYuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjLmh0bWwoYS5jYWxsKHRoaXMsYixjLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pO3R5cGVvZiBhIT0ic3RyaW5nIiYmKGE9ZihhKS5kZXRhY2goKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7Zih0aGlzKS5yZW1vdmUoKSxiP2YoYikuYmVmb3JlKGEpOmYoYykuYXBwZW5kKGEpfSl9cmV0dXJuIHRoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKGYoZi5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaSxqPWFbMF0saz1bXTtpZighZi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2Ygaj09InN0cmluZyImJmJnLnRlc3QoaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZG9tTWFuaXAoYSxjLGQsITApfSk7aWYoZi5pc0Z1bmN0aW9uKGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGc9Zih0aGlzKTthWzBdPWouY2FsbCh0aGlzLGUsYz9nLmh0bWwoKTpiKSxnLmRvbU1hbmlwKGEsYyxkKX0pO2lmKHRoaXNbMF0pe2k9aiYmai5wYXJlbnROb2RlLGYuc3VwcG9ydC5wYXJlbnROb2RlJiZpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD9lPXtmcmFnbWVudDppfTplPWYuYnVpbGRGcmFnbWVudChhLHRoaXMsayksaD1lLmZyYWdtZW50LGguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2c9aD1oLmZpcnN0Q2hpbGQ6Zz1oLmZpcnN0Q2hpbGQ7aWYoZyl7Yz1jJiZmLm5vZGVOYW1lKGcsInRyIik7Zm9yKHZhciBsPTAsbT10aGlzLmxlbmd0aCxuPW0tMTtsPG07bCsrKWQuY2FsbChjP2JsKHRoaXNbbF0sZyk6dGhpc1tsXSxlLmNhY2hlYWJsZXx8bT4xJiZsPG4/Zi5jbG9uZShoLCEwLCEwKTpoKX1rLmxlbmd0aCYmZi5lYWNoKGssYnIpfXJldHVybiB0aGlzfX0pLGYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZyxoLGksaj1hWzBdO2ImJmJbMF0mJihpPWJbMF0ub3duZXJEb2N1bWVudHx8YlswXSksaS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwoaT1jKSxhLmxlbmd0aD09PTEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmai5sZW5ndGg8NTEyJiZpPT09YyYmai5jaGFyQXQoMCk9PT0iPCImJiFiZS50ZXN0KGopJiYoZi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFiZy50ZXN0KGopKSYmIWYuc3VwcG9ydC51bmtub3duRWxlbXMmJmJmLnRlc3QoaikmJihnPSEwLGg9Zi5mcmFnbWVudHNbal0saCYmaCE9PTEmJihlPWgpKSxlfHwoZT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxmLmNsZWFuKGEsaSxlLGQpKSxnJiYoZi5mcmFnbWVudHNbal09aD9lOjEpO3JldHVybntmcmFnbWVudDplLGNhY2hlYWJsZTpnfX0sZi5mcmFnbWVudHM9e30sZi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMpe3ZhciBkPVtdLGU9ZihjKSxnPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGcmJmcubm9kZVR5cGU9PT0xMSYmZy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmUubGVuZ3RoPT09MSl7ZVtiXSh0aGlzWzBdKTtyZXR1cm4gdGhpc31mb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPShoPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7ZihlW2hdKVtiXShqKSxkPWQuY29uY2F0KGopfXJldHVybiB0aGlzLnB1c2hTdGFjayhkLGEsZS5zZWxlY3Rvcil9fSksZi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmNsb25lTm9kZSghMCksZSxnLGg7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7Ym4oYSxkKSxlPWJvKGEpLGc9Ym8oZCk7Zm9yKGg9MDtlW2hdOysraClnW2hdJiZibihlW2hdLGdbaF0pfWlmKGIpe2JtKGEsZCk7aWYoYyl7ZT1ibyhhKSxnPWJvKGQpO2ZvcihoPTA7ZVtoXTsrK2gpYm0oZVtoXSxnW2hdKX19ZT1nPW51bGw7cmV0dXJuIGR9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIWJjLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoXywiPCQxPjwvJDI+Iik7dmFyIGw9KGJhLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbT1ialtsXXx8YmouX2RlZmF1bHQsbj1tWzBdLG89Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtiPT09Yz9iay5hcHBlbmRDaGlsZChvKTpYKGIpLmFwcGVuZENoaWxkKG8pLG8uaW5uZXJIVE1MPW1bMV0rayttWzJdO3doaWxlKG4tLSlvPW8ubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBwPWJiLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmJC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKCQuZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJxKGtbaV0pO2Vsc2UgYnEoayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiaC50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJzPS9hbHBoYVwoW14pXSpcKS9pLGJ0PS9vcGFjaXR5PShbXildKikvLGJ1PS8oW0EtWl18Xm1zKS9nLGJ2PS9eLT9cZCsoPzpweCk/JC9pLGJ3PS9eLT9cZC8sYng9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnk9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ6PVsiTGVmdCIsIlJpZ2h0Il0sYkE9WyJUb3AiLCJCb3R0b20iXSxiQixiQyxiRDtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YkIoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1ieC5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYkIpcmV0dXJuIGJCKGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiRShhLGIsZCk7Zi5zd2FwKGEsYnksZnVuY3Rpb24oKXtlPWJFKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ2LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBidC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnMsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icy50ZXN0KGcpP2cucmVwbGFjZShicyxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1iQihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkM9ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGc7Yz1jLnJlcGxhY2UoYnUsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoIShlPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykpcmV0dXJuIGI7aWYoZz1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlkPWcuZ2V0UHJvcGVydHlWYWx1ZShjKSxkPT09IiImJiFmLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihkPWYuc3R5bGUoYSxjKSk7cmV0dXJuIGR9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiRD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSwhYnYudGVzdChmKSYmYncudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDAsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYkI9YkN8fGJELGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkY9LyUyMC9nLGJHPS9cW1xdJC8sYkg9L1xyP1xuL2csYkk9LyMuKiQvLGJKPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYks9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJMPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYk09L14oPzpHRVR8SEVBRCkkLyxiTj0vXlwvXC8vLGJPPS9cPy8sYlA9LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYlE9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYlI9L1xzKy8sYlM9LyhbPyZdKV89W14mXSovLGJUPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiVT1mLmZuLmxvYWQsYlY9e30sYlc9e30sYlgsYlksYlo9WyIqLyJdK1siKiJdO3RyeXtiWD1lLmhyZWZ9Y2F0Y2goYiQpe2JYPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJYLmhyZWY9IiIsYlg9YlguaHJlZn1iWT1iVC5leGVjKGJYLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiVSlyZXR1cm4gYlUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYlAsIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJRLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJLLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJILCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiSCwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJpbmQoYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2NiKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksY2IoYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlgsaXNMb2NhbDpiTC50ZXN0KGJZWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylp9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Yl8oYlYpLGFqYXhUcmFuc3BvcnQ6Yl8oYlcpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NkKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNlKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJKLmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJJLCIiKS5yZXBsYWNlKGJOLGJZWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJULmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iWVsxXSYmclsyXT09YllbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiWVszXXx8KGJZWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGNhKGJWLGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJNLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJPLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlMsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk8udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWisiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1jYShiVyxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7czwyP3coLTEseik6Zi5lcnJvcih6KX19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpY2MoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkYsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2Y9Zi5ub3coKSxjZz0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjZisrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZy50ZXN0KGIudXJsKXx8ZSYmY2cudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2csbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNnLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2g9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNqKWNqW2FdKDAsMSl9OiExLGNpPTAsY2o7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNrKCl8fGNsKCl9OmNrLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2gmJmRlbGV0ZSBjaltpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjaSxjaCYmKGNqfHwoY2o9e30sZihhKS51bmxvYWQoY2gpKSxjaltpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY209e30sY24sY28sY3A9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNxPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY3IsY3M9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3Q7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjeChkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdygidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN4KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNwLnRlc3QoaCk/KG89Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxvPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxvPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbb10oKSk6altoXSgpKTooaz1jcS5leGVjKGgpLGw9ai5jdXIoKSxrPyhtPXBhcnNlRmxvYXQoa1syXSksbj1rWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbiE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobXx8MSkrbiksbD0obXx8MSkvai5jdXIoKSpsLGYuc3R5bGUodGhpcyxpLGwrbikpLGtbMV0mJihtPShrWzFdPT09Ii09Ij8tMToxKSptK2wpLGouY3VzdG9tKGwsbSxuKSk6ai5jdXN0b20obCxoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3coInNob3ciLDEpLHNsaWRlVXA6Y3coImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN3KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jdHx8Y3UoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2Uub3B0aW9ucy5oaWRlJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjciYmKGNyPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3R8fGN1KCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY3IpLGNyPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN5PS9edCg/OmFibGV8ZHxoKSQvaSxjej0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y0EoZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjeS50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3oudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3oudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y0EoZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y0EodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zn0pKHdpbmRvdyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2xlZnRjb3JuZXIuZ2lmIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL2xlZnRjb3JuZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3Yzc3OWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvbGVmdGNvcm5lci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL25hc2FfbG9nby5naWYgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvbmFzYV9sb2dvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDkzNjAzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL25hc2FfbG9nby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3BlZGlncmVlL1RyYWNlYWJsZVByb2R1Y3RCcm93c2VyLmh0bWwgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvcGVkaWdyZWUvVHJhY2VhYmxlUHJvZHVjdEJyb3dzZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgxYTYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3BlZGlncmVlL1RyYWNlYWJsZVByb2R1Y3RCcm93c2VyLmh0bWwKQEAgLTAsMCArMSw2NCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpwYW5lbD4KKzx3aWNrZXQ6cmVtb3ZlPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJQcm9kdWN0QnJvd3Nlci5jc3MiLz4KKzwvd2lja2V0OnJlbW92ZT4KKworPGgzPlByb2R1Y3Q6IDxzcGFuIHdpY2tldDppZD0icHJvZHVjdF9uYW1lIj5mb28udHh0PC9zcGFuPjwvaDM+Cis8cD48Zm9ybSB3aWNrZXQ6aWQ9InRyYWNlX2Zvcm0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJUcmFjZSIgd2lja2V0OmlkPSJ0cmFjZV9idXR0b24iIGlkPSJ0cmFjZV9idXR0b24iLz48L2Zvcm0+PC9wPgorPHA+UGVyY2VudCBUcmFuc2ZlcnJlZDogPHNwYW4gd2lja2V0OmlkPSJwcm9kdWN0X3BjdF90cmFuc2ZlciI+MTAwJTwvc3Bhbj48L3A+Cis8YSBocmVmPSIjUmVmZXJlbmNlcyI+SnVtcCB0byBSZWZlcmVuY2VzPC9hPgorICAgICAgICAgICAgICAgIAorPGgzPk1ldGFkYXRhPC9oMz4KKyAgPHRhYmxlIGlkPSJtZXRfdGFibGUiPgorICAgIDx0ciB3aWNrZXQ6aWQ9Im1ldF9lbGVtIj4KKyAgICAgIDx0ZCB3aWNrZXQ6aWQ9Im1ldF9lbGVtX25hbWUiIGlkPSJtZXRfZWxlbV9uYW1lIj5DQVMuUHJvZHVjdE5hbWU8L3RkPgorICAgICAgPHRkPgorICAgICAgICAgPHRhYmxlIGlkPSJtZXRfdmFsdWVzX3RhYmxlIj4KKyAgICAgICAgICA8dHIgd2lja2V0OmlkPSJtZXRfdmFsdWVzX2xpc3QiPgorICAgICAgICAgICAgIDx0ZCB3aWNrZXQ6aWQ9Im1ldF92YWx1ZSI+Zm9vLnR4dDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgIDwvdGFibGU+CisgICAgICA8L3RkPgorICAgICA8L3RyPgorICAgPC90YWJsZT4KKyAgIAorICAgPGgzIHdpY2tldDppZD0ibm9fcHJvZF9tZXRfZGlzcGxheSIgY2xhc3M9Im5hZGEiPk5vIFByb2R1Y3QgTWV0YWRhdGEhPC9oMz4KKyAgIDxwPiZuYnNwOzwvcD4KKyAgIDxwPiZuYnNwOzwvcD4KKyAgIDxhIG5hbWU9IlJlZmVyZW5jZXMiPjwvYT4KKworPGgzPlJlZmVyZW5jZXM8L2gzPgorICA8dGFibGUgaWQ9InJlZl90YWJsZSI+CisgICAgPHRyIGlkPSJyZWZfdGFibGVfaGRyIj4KKyAgICAgIDx0ZD5GaWxlIExvY2F0aW9uPC90ZD4KKyAgICAgIDx0ZD5GaWxlIFNpemU8L3RkPgorICAgICAgPHRkPlBlcmNlbnQgVHJhbnNmZXJyZWQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIHdpY2tldDppZD0icmVmX2xpc3QiPgorICAgICAgPHRkPjxhIHdpY2tldDppZD0icmVmX2ZpbGVfcGF0aF9saW5rIiBocmVmPSIjIj48c3BhbiB3aWNrZXQ6aWQ9InJlZl9maWxlX3BhdGgiPi9ob21lL2ZpbGVzL2Zvby50eHQvZm9vLnR4dDwvc3Bhbj48L2E+PC90ZD4KKyAgICAgIDx0ZCB3aWNrZXQ6aWQ9InJlZl9maWxlX3NpemUiPjQwMjg8L3RkPgorICAgICAgPHRkIHdpY2tldDppZD0icmVmX3BjdF90cmFuc2ZlcnJlZCI+MTAwJTwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDMgd2lja2V0OmlkPSJub19wcm9kX3JlZl9kaXNwbGF5IiBjbGFzcz0ibmFkYSI+Tm8gUHJvZHVjdCBSZWZlcmVuY2VzITwvaDM+CisgIAorCis8c3BhbiB3aWNrZXQ6aWQ9InBlZGlncmVlIi8+Cis8L3dpY2tldDpwYW5lbD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wZWRpZ3JlZS9UcmFjZWFibGVQcm9kdWN0QnJvd3Nlci5qYXZhIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3BlZGlncmVlL1RyYWNlYWJsZVByb2R1Y3RCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlNzY3NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wZWRpZ3JlZS9UcmFjZWFibGVQcm9kdWN0QnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5wZWRpZ3JlZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuRmlsZU1hbmFnZXJDb25uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyLmJyb3dzZXIucHJvZHVjdC5Qcm9kdWN0QnJvd3NlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLk9wc3VpQXBwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mud2ViY29tcG9uZW50cy50cmFjZS5UcmFjZTsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYk1hcmt1cENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLkJ1dHRvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5FeHRlcm5hbExpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLnV0aWwuTGlzdE1vZGVsOworCisvKioKKyAqIAorICogRXh0ZW5kcyB0aGUgZXhpc3Rpbmcge0BsaW5rIFByb2R1Y3RCcm93c2VyfSBhbmQgYWRkcyBhIFdlYiBmb3JtIGFuZAorICogYXNzb2NpYXRlZCBwZWRpZ3JlZSB0cmVlIGNvbnRhaW5lciB0byBleHBvc2UgdGhlIHtAbGluayBUcmFjZX0gY29tcG9uZW50LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRyYWNlYWJsZVByb2R1Y3RCcm93c2VyIGV4dGVuZHMgUHJvZHVjdEJyb3dzZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU1MTI4Nzg2NzYxNDU3Mzc4MThMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoVHJhY2VhYmxlUHJvZHVjdEJyb3dzZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKioKKyAgICogQHBhcmFtIGNvbXBvbmVudElkCisgICAqIEBwYXJhbSBmbVVybFN0cgorICAgKiBAcGFyYW0gcHJvZHVjdElkCisgICAqLworICBwdWJsaWMgVHJhY2VhYmxlUHJvZHVjdEJyb3dzZXIoU3RyaW5nIGNvbXBvbmVudElkLCBmaW5hbCBTdHJpbmcgZm1VcmxTdHIsCisgICAgICBmaW5hbCBTdHJpbmcgcHJvZHVjdElkLCBmaW5hbCBib29sZWFuIGVuYWJsZU5vdENhdCwgZmluYWwgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVzKSB7CisgICAgc3VwZXIoY29tcG9uZW50SWQsIGZtVXJsU3RyLCBwcm9kdWN0SWQpOworICAgIGZpbmFsIEZpbGVNYW5hZ2VyQ29ubiBmbSA9IG5ldyBGaWxlTWFuYWdlckNvbm4oZm1VcmxTdHIpOworICAgIGZpbmFsIFByb2R1Y3QgcHJvZHVjdCA9IGZtLnNhZmVHZXRQcm9kdWN0QnlJZChwcm9kdWN0SWQpOworICAgIGZpbmFsIE9wc3VpQXBwIGFwcCA9IChPcHN1aUFwcClnZXRBcHBsaWNhdGlvbigpOworCisgICAgRm9ybSB0cmFjZUZvcm0gPSBuZXcgRm9ybSgidHJhY2VfZm9ybSIpOworICAgIHRyYWNlRm9ybS5hZGQobmV3IEJ1dHRvbigidHJhY2VfYnV0dG9uIikgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLkJ1dHRvbiNvblN1Ym1pdCgpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25TdWJtaXQoKSB7CisgICAgICAgIFRyYWNlIHRyYWNlciA9IG5ldyBUcmFjZSgicGVkaWdyZWUiLCBmbVVybFN0ciwgZW5hYmxlTm90Q2F0LCBleGNsdWRlcywKKyAgICAgICAgICAgIHByb2R1Y3QpOworICAgICAgICB0cmFjZXIuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkucmVwbGFjZSh0cmFjZXIpOworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIH0KKworICAgIH0pOworICAgIGFkZCh0cmFjZUZvcm0pOworICAgIGFkZChuZXcgV2ViTWFya3VwQ29udGFpbmVyKCJwZWRpZ3JlZSIpLnNldFZpc2libGUoZmFsc2UpKTsKKworICAgIExpc3Q8UmVmZXJlbmNlPiByZWZzID0gZm0uZ2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCk7CisgICAgaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKKyAgICAgIHJlcGxhY2UobmV3IExhYmVsKCJub19wcm9kX3JlZl9kaXNwbGF5IikgeworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0LkNvbXBvbmVudCNpc1Zpc2libGUoKQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICByZXBsYWNlKG5ldyBMaXN0VmlldzxSZWZlcmVuY2U+KCJyZWZfbGlzdCIsIG5ldyBMaXN0TW9kZWw8UmVmZXJlbmNlPihyZWZzKSkgeworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlCisgICAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAgICogLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtKQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxSZWZlcmVuY2U+IHJlZkl0ZW0pIHsKKyAgICAgICAgICBSZWZlcmVuY2UgciA9IHJlZkl0ZW0uZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBudWxsOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlUGF0aCA9IG5ldyBGaWxlKG5ldyBVUkkoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgRXh0ZXJuYWxMaW5rIHJlZkxpbmsgPSBuZXcgRXh0ZXJuYWxMaW5rKCJyZWZfZmlsZV9wYXRoX2xpbmsiLCAKKyAgICAgICAgICAgICAgIi8iICsgYXBwLmdldFJvb3RDb250ZXh0KCkgKyAiL2RhdGE/cHJvZHVjdElEPSIrcHJvZHVjdElkKTsKKyAgICAgICAgICByZWZMaW5rLmFkZChuZXcgTGFiZWwoInJlZl9maWxlX3BhdGgiLCBmaWxlUGF0aCkpOworICAgICAgICAgIHJlZkl0ZW0uYWRkKHJlZkxpbmspOworICAgICAgICAgIHJlZkl0ZW0uYWRkKG5ldyBMYWJlbCgicmVmX2ZpbGVfc2l6ZSIsCisgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHIuZ2V0RmlsZVNpemUoKSkpKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVmSXRlbS5hZGQobmV3IExhYmVsKCJyZWZfcGN0X3RyYW5zZmVycmVkIiwgTnVtYmVyRm9ybWF0CisgICAgICAgICAgICAgICAgLmdldFBlcmNlbnRJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLmZvcm1hdChmbS5nZXRGbSgpLmdldFJlZlBjdFRyYW5zZmVycmVkKHIpKSkpOworICAgICAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKAorICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgcHJvZHVjdCByZWZlcmVuY2Ugc2l6ZTogUmVhc29uOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmVmSXRlbS5hZGQobmV3IExhYmVsKCJyZWZfcGN0X3RyYW5zZmVycmVkIiwgIk4vQSIpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcGxhY2UobmV3IExhYmVsKCJub19wcm9kX3JlZl9kaXNwbGF5IiwgIk5vIFByb2R1Y3QgUmVmZXJlbmNlcyEiKSk7CisgICAgfQorCisgIH0KKyAgCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wcm9qZWN0X2xvZ28ucG5nIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3Byb2plY3RfbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4YTFlMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wcm9qZWN0X2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wcm9qZWN0X2xvZ29fY2xlYW53aGl0ZS5wbmcgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvcHJvamVjdF9sb2dvX2NsZWFud2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGExZTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvcHJvamVjdF9sb2dvX2NsZWFud2hpdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wcm9qZWN0X2xvZ29fbmF2eWJsdWUucG5nIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3Byb2plY3RfbG9nb19uYXZ5Ymx1ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4MDkxYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9wcm9qZWN0X2xvZ29fbmF2eWJsdWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9yaWdodGNvcm5lci5naWYgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvcmlnaHRjb3JuZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5NzcyZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvcmlnaHRjb3JuZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zZWxsZWZ0Y29ybmVyLmdpZiBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zZWxsZWZ0Y29ybmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODk4N2JmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3NlbGxlZnRjb3JuZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zZWxyaWdodGNvcm5lci5naWYgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc2VscmlnaHRjb3JuZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhNzljMWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc2VscmlnaHRjb3JuZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGFjZXIuZ2lmIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3NwYWNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDZhMmNmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGFjZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGxhc2gucG5nIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3NwbGFzaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlYjZkYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGxhc2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGxhc2hfY2xlYW53aGl0ZS5wbmcgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3BsYXNoX2NsZWFud2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZWI2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3BsYXNoX2NsZWFud2hpdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGxhc2hfbmF2eWJsdWUucG5nIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL29wc3VpL3NwbGFzaF9uYXZ5Ymx1ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyMTVhMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zcGxhc2hfbmF2eWJsdWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zdGF0dXMvU3RhdHVzUGFnZS5jc3MgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3RhdHVzL1N0YXR1c1BhZ2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzg1MmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3RhdHVzL1N0YXR1c1BhZ2UuY3NzCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjd2lkZW5vYm9yZGVyeworICB3aWR0aDoxMDAlOworICBib3JkZXI6MHB4OworfQorCisjZm1fc3RhdHVzeworCit9CisKKyN3bV9zdGF0dXN7CisKK30KKworI3JtX3N0YXR1c3sKKworfQorCisjcmVwb3J0X2RhdGV7CisKK30KKworLnJvdW5kdGFibGUgdGFibGV7Citib3JkZXItdG9wOiAycHggc29saWQgI2JiYjhhOTsKK2JvcmRlci1ib3R0b206IDJweCBzb2xpZCAjYmJiOGE5OworYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjYmJiOGE5OworYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI2JiYjhhOTsKK30KKworLm5vd3JhcHsKKyAgd2hpdGUtc3BhY2U6bm93cmFwOworfQorCisuaGVhZGluZ3sKKyAgZm9udC1zaXplOjE0cHg7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKy5hdmdfY3Jhd2xfdGltZXsKKworfQorCisubnVtX2NyYXdsc3sKKworfQorCisuY3Jhd2xlcl9uYW1leworCit9CisKKy5maWxlX2luZ2VzdF9kYXRldGltZXsKKworfQorCisuZmlsZV9wYXRoeworCit9CisKKy5zdGF0dXNfbmFtZXsKKworfQorCisuYmF0Y2hfc3R1Yl91cmx7CisKK30KKworLmNyYXdsZXJfbmFtZV9hbmRfdXJseworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3RhdHVzL1N0YXR1c1BhZ2UuaHRtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zdGF0dXMvU3RhdHVzUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTMxZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3RhdHVzL1N0YXR1c1BhZ2UuaHRtbApAQCAtMCwwICsxLDI0IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OmV4dGVuZD4KKzx3aWNrZXQ6bGluaz4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlN0YXR1c1BhZ2UuY3NzIi8+Cis8L3dpY2tldDpsaW5rPgorCis8ZGl2IHdpY2tldDppZD0iaGVhbHRoX21vbml0b3IiIGlkPSJoZWFsdGhfbW9uaXRvciIvPgorCis8L3dpY2tldDpleHRlbmQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3RhdHVzL1N0YXR1c1BhZ2UuamF2YSBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9vcHN1aS9zdGF0dXMvU3RhdHVzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmQ3YWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvb3BzdWkvc3RhdHVzL1N0YXR1c1BhZ2UuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5zdGF0dXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5Qcm9kdWN0QnJvd3NlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS5CYXNlUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLk9wc3VpQXBwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkuV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy50b29scy5QQ1NIZWFsdGhNb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Mud2ViY29tcG9uZW50cy5oZWFsdGguSGVhbHRoTW9uaXRvcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworCisvKioKKyAqIAorICogQSB3aWNrZXQgY29udHJvbGxlciBmb3IgZXhwb3NpbmcgdGhlIHN1cGVyIGF3ZXNvbWUgcG93ZXIgb2YgdGhlCisgKiB7QGxpbmsgUENTSGVhbHRoTW9uaXRvcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgU3RhdHVzUGFnZSBleHRlbmRzIEJhc2VQYWdlIHsKKworICAvKioKKyAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgU3RhdHVzUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisKKyAgICBPcHN1aUFwcCBhcHAgPSAoT3BzdWlBcHApIGdldEFwcGxpY2F0aW9uKCk7CisgICAgU3RyaW5nIGZtVXJsU3RyID0gYXBwLmdldEZtVXJsU3RyKCk7CisgICAgU3RyaW5nIHdtVXJsU3RyID0gYXBwLmdldFdtVXJsU3RyKCk7CisgICAgU3RyaW5nIHJtVXJsU3RyID0gYXBwLmdldFJtVXJsU3RyKCk7CisgICAgU3RyaW5nIGNyYXdsZXJDb25mRmlsZVBhdGggPSBhcHAuZ2V0Q3Jhd2xlckNvbmZGaWxlUGF0aCgpOworICAgIFN0cmluZyBzdGF0ZXNGaWxlUGF0aCA9IGFwcC5nZXRTdGF0ZXNGaWxlUGF0aCgpOworICAgIGFkZChuZXcgSGVhbHRoTW9uaXRvcigiaGVhbHRoX21vbml0b3IiLCBmbVVybFN0ciwgd21VcmxTdHIsIHJtVXJsU3RyLAorICAgICAgICBjcmF3bGVyQ29uZkZpbGVQYXRoLCBzdGF0ZXNGaWxlUGF0aCwgUHJvZHVjdEJyb3dzZXJQYWdlLmNsYXNzLAorICAgICAgICBXb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZS5jbGFzcykpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbCBiLzAuMTAvcGNzL29wc3VpL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZjVjMWNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCkBAIC0wLDAgKzEsOTkgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPENvbnRleHQgcGF0aD0iL3Bjcy1vcHN1aSI+CisJCQorCTxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci51cmwiCisJICAgIHZhbHVlPSJbRklMRU1HUl9VUkxdIi8+CQkKKwkKKwk8UGFyYW1ldGVyIG5hbWU9IndvcmtmbG93LnVybCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19VUkxdIi8+CisKKwk8UGFyYW1ldGVyIG5hbWU9InJlc21nci51cmwiCisJICAgIHZhbHVlPSJbUkVTTUdSX1VSTF0iLz4KKworCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5vcHN1aS53b3JrZmxvdy5saWZlY3ljbGVGaWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd2VuZ2luZS93ZW5naW5lLWxpZmVjeWNsZS54bWwiLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLndpbnN0LnN0YXR1c2VzIgorCSAgICB2YWx1ZT0iTnVsbCwgTG9hZGVkLCBRdWV1ZWQsIEJsb2NrZWQsIFdhaXRpbmdPblJlc291cmNlcywgUHJlQ29uZGl0aW9uU3VjY2VzcywgRXhlY3V0aW9uQ29tcGxldGUsIFVua25vd24sIFBhdXNlZCwgUHJlQ29uZGl0aW9uRXZhbCwgRXhlY3V0aW5nLCBQb3N0Q29uZGl0aW9uRXZhbCwgUmVzdWx0c1N1Y2Nlc3MsIFJlc3VsdHNGYWlsdXJlLCBSZXN1bHRzQmFpbCwgU3RvcHBlZCwgT2ZmLCBGYWlsdXJlLCBTdWNjZXNzIi8+CisJCisJPCEtLSA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3Mub3BzdWkud2luc3Quc3RhdHVzZXMiCisJICAgIHZhbHVlPSJRVUVVRUQsIFJTVUJNSVQsIEJVSUxESU5HIENPTkZJRyBGSUxFLCBQR0UgRVhFQywgQ1JBV0xJTkcsIFNUQUdJTkcgSU5QVVQsIEZJTklTSEVELCBTVEFSVEVELCBQQVVTRUQiLz4tLT4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLndpbnN0Lm1ldEZpZWxkcy5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctaW5zdGFuY2UtbWV0LnhtbCIvPiAgIAorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLmNyYXdsZXIuY29uZi5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltQQ1NfSE9NRV0vYXV4L3Bjcy9wY3MtY3Jhd2xlcnMueG1sIi8+CisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGgud29ya2Zsb3cuc3RhdHVzZXMuZmlsZVBhdGgiCisJICAgIHZhbHVlPSJbUENTX0hPTUVdL2F1eC9wY3MvcGNzLXdvcmtmbG93LXN0YXR1c2VzLnhtbCIvPgkgICAgCisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy50cmFjZS5leGNsdWRlTGlzdCIKKwkgICAgdmFsdWU9IiIvPgorCQorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy50cmFjZS5lbmFibGVOb3RDYXQiCisJICAgIHZhbHVlPSJ0cnVlIi8+CisJIAorCTxQYXJhbWV0ZXIgbmFtZT0iZ2FuZ2xpYS51cmwiIHZhbHVlPSJbR0FOR0xJQV9VUkxdIi8+CisJPFBhcmFtZXRlciBuYW1lPSJjb250YWN0LmVtYWlsIiB2YWx1ZT0idXNlckBvb2R0LmFwYWNoZS5vcmciLz4KKworCTwhLS0gT1BTVUkgU0tJTk5JTkcKKwkJRGlyZWN0aW9uczogU2V0IHRoZSAnb3BzdWkuc2tpbicgcHJvcGVydHkncyB2YWx1ZSBhdHRyaWJ1dGUuIAorCQlTdXBwb3J0ZWQgc2tpbnM6CisJCQkiIiAgICAgICAgICAgPT4gTm8gc2tpbgorCQkJImNsZWFud2hpdGUiID0+IENsZWFuLCB3aGl0ZSBiYWNrZ3JvdW5kIE9PRFQgYmFzZSBza2luCisJCQkibmF2eWJsdWUiICAgPT4gRGFya2VyLCBibHVlIGJhY2tncm91bmQgT09EVCBiYXNlIHNraW4KKwkJCSJjbGFzc2ljIiAgICA9PiBUaGUgb3JpZ2luYWwsIE9DTyAoT3JiaXRpbmcgQ2FyYm9uIE9ic2VydmF0b3J5KSBza2luIGZvciBPUFNVSQorCQlPUiBhZGQgeW91ciBvd24hCisJLS0+CisJPFBhcmFtZXRlciBuYW1lPSJvcHN1aS5za2luIiB2YWx1ZT0iIi8+CisJCisJPCEtLSAKKwlpZiB5b3UgdXNlIHRoZSBjbGFzc2ljIHNraW4sIGNoYW5nZSB0aGUgaG9tZSBwYWdlIHRvIAorCSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLnN0YXR1cy5TdGF0dXNQYWdlCisJIC0tPgorCTxQYXJhbWV0ZXIgbmFtZT0ib3BzdWkuaG9tZXBhZ2UiIHZhbHVlPSJvcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLkhvbWVQYWdlIi8+CisJCisJCisgICAgPCEtLSAgbmVlZGVkIGJ5IEN1cmF0aW9uIFNlcnZpY2VzIC0tPiAgICAgICAgICAKKyAgICA8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRvci5tZXRFeHRyYWN0b3JDb25mLnVwbG9hZFBhdGgiCisgICAgICAgIHZhbHVlPSJbT09EVF9IT01FXS9leHRyYWN0b3JzIiAvPgorCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IuZGF0YURlZmluaXRpb24udXBsb2FkUGF0aCIKKyAgICAgICAgdmFsdWU9IltGSUxFTUdSX0hPTUVdL3BvbGljeSIgLz4KKyAgICAgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3Iuc3RhZ2luZ0FyZWFQYXRoIgorICAgICAgICB2YWx1ZT0iW09PRFRfSE9NRV0vZGF0YS9zdGFnaW5nIi8+CisgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0QXJlYVBhdGgiCisgICAgICAgIHZhbHVlPSJbT09EVF9IT01FXS9kYXRhL21ldCIvPgorICAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmZtUHJvcHMiCisgICAgICAgIHZhbHVlPSJbRklMRU1HUl9IT01FXS9ldGMvZmlsZW1nci5wcm9wZXJ0aWVzIi8+CisgICAgCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0b3IubWV0RXh0ZW5zaW9uIgorICAgICAgICB2YWx1ZT0iLm1ldCIvPgorCisgICAgPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZtLnVybCIKKyAgICAgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iLz4KKyAgIAorICAgIDxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdG9yLmNhdGFsb2dGYWN0b3J5Q2xhc3MiIAorICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5jYXRhbG9nLkx1Y2VuZUNhdGFsb2dGYWN0b3J5IiAvPgkKKwkgICAgCis8L0NvbnRleHQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9vcHN1aS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDBhZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvb3BzdWkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDEwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKKwkgdmVyc2lvbj0iMi40Ij4KKworCTxkaXNwbGF5LW5hbWU+cGNzLW9wc3VpPC9kaXNwbGF5LW5hbWU+CisKKwkgPCEtLSAgCisJICAgICAgVGhlcmUgYXJlIHRocmVlIG1lYW5zIHRvIGNvbmZpZ3VyZSBXaWNrZXRzIGNvbmZpZ3VyYXRpb24gbW9kZSBhbmQgdGhleSBhcmUKKwkgICAgICB0ZXN0ZWQgaW4gdGhlIG9yZGVyIGdpdmVuLiAKKwkgICAgICAxKSBBIHN5c3RlbSBwcm9wZXJ0eTogLUR3aWNrZXQuY29uZmlndXJhdGlvbgorCSAgICAgIDIpIHNlcnZsZXQgc3BlY2lmaWMgPGluaXQtcGFyYW0+CisJICAgICAgMykgY29udGV4dCBzcGVjaWZpYyA8Y29udGV4dC1wYXJhbT4KKwkgICAgICBUaGUgdmFsdWUgbWlnaHQgYmUgZWl0aGVyICJkZXZlbG9wbWVudCIgKHJlbG9hZGluZyB3aGVuIHRlbXBsYXRlcyBjaGFuZ2UpCisJICAgICAgb3IgImRlcGxveW1lbnQiLiBJZiBubyBjb25maWd1cmF0aW9uIGlzIGZvdW5kLCAiZGV2ZWxvcG1lbnQiIGlzIHRoZSBkZWZhdWx0LgorCS0tPgorCisJPGZpbHRlcj4KKwkJPGZpbHRlci1uYW1lPndpY2tldC5icm93c2VyPC9maWx0ZXItbmFtZT4KKyAJCTxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XaWNrZXRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKwkJPGluaXQtcGFyYW0+CisJCQk8cGFyYW0tbmFtZT5hcHBsaWNhdGlvbkNsYXNzTmFtZTwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm9vZHQucGNzLm9wc3VpLk9wc3VpQXBwPC9wYXJhbS12YWx1ZT4KKyAJCTwvaW5pdC1wYXJhbT4KKyAJPC9maWx0ZXI+CisKKyA8ZmlsdGVyLW1hcHBpbmc+CisgIDxmaWx0ZXItbmFtZT53aWNrZXQuYnJvd3NlcjwvZmlsdGVyLW5hbWU+CisJPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyA8L2ZpbHRlci1tYXBwaW5nPgorIAorICA8Y29udGV4dC1wYXJhbT4KKyAgICA8cGFyYW0tbmFtZT5maWxlbWdyLndvcmtpbmcuZGlyPC9wYXJhbS1uYW1lPgorICAgIDxwYXJhbS12YWx1ZT4vdG1wPC9wYXJhbS12YWx1ZT4KKyAgPC9jb250ZXh0LXBhcmFtPgorCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+RGF0YURlbGl2ZXJ5U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5kYXRhLkRhdGFEZWxpdmVyeVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhc2V0RGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmRhdGEuRGF0YXNldERlbGl2ZXJ5U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhRGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9kYXRhPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIAorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+RGF0YXNldERlbGl2ZXJ5U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vZGF0YXNldDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPiAgCisgCisgPCEtLSAgbmVlZGVkIGJ5IEN1cmF0aW9uIFNlcnZpY2VzIC0tPgorICAgIDxzZXJ2bGV0PgorICAgICA8c2VydmxldC1uYW1lPkNYRlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICAgb3JnLmFwYWNoZS5jeGYuamF4cnMuc2VydmxldC5DWEZOb25TcHJpbmdKYXhyc1NlcnZsZXQKKyAgICAgPC9zZXJ2bGV0LWNsYXNzPgorICAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmpheHJzLnNlcnZpY2VDbGFzc2VzPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPgorICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLmN1cmF0aW9uLnNlcnZpY2UuRGlyZWN0b3J5UmVzb3VyY2UsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZS5Jbmdlc3Rpb25SZXNvdXJjZSwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLk1ldGFkYXRhUmVzb3VyY2UsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMuY3VyYXRpb24uc2VydmljZS5Qb2xpY3lSZXNvdXJjZSwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLlN5c3RlbVJlc291cmNlCisgICAgICA8L3BhcmFtLXZhbHVlPgorICAgICA8L2luaXQtcGFyYW0+CisgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIAorICAgIDxzZXJ2bGV0PgorICAgICAgIDxkaXNwbGF5LW5hbWU+Q3VyYXRpb24gU2VydmljZTwvZGlzcGxheS1uYW1lPgorICAgICAgIDxzZXJ2bGV0LW5hbWU+Q3VyYXRpb24gU2VydmljZTwvc2VydmxldC1uYW1lPgorICAgICAgIDxzZXJ2bGV0LWNsYXNzPgorICAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5jdXJhdGlvbi5zZXJ2aWNlLkN1cmF0aW9uU2VydmljZQorICAgICAgIDwvc2VydmxldC1jbGFzcz4KKyAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5DWEZTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc2VydmljZXMvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIAorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9zZXJ2aWNlcy9wb20ueG1sIGIvMC4xMC9wY3Mvc2VydmljZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhiZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvc2VydmljZXMvcG9tLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPnBjcy1zZXJ2aWNlczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+T09EVCBQcm9jZXNzIENvbnRyb2wgU3lzdGVtIEpBWC1SUyBzZXJ2aWNlIGxheWVyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QSB3ZWIgYXBwbGljYXRpb24gZm9yIGV4cG9zaW5nIHNlcnZpY2VzIGZvcm0gdGhlIHVuZGVybHlpbmcgCisgIE9PRFQgUHJvY2VzcyBDb250cm9sIFN5c3RlbSB2aWEgdGhlIEpBWC1SUyBzcGVjaWZpY2F0aW9uLjwvZGVzY3JpcHRpb24+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0LnNmLmpzb24tbGliPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anNvbi1saWI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+CisgICAgICA8Y2xhc3NpZmllcj5qZGsxNTwvY2xhc3NpZmllcj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICAgPGdyb3VwSWQ+c2VydmxldGFwaTwvZ3JvdXBJZD4KKyAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0YXBpPC9hcnRpZmFjdElkPgorICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jeGY8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jeGYtcnQtZnJvbnRlbmQtamF4cnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjYuMDwvdmVyc2lvbj4KKyAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9IZWFsdGhSZXNvdXJjZS5qYXZhIGIvMC4xMC9wY3Mvc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3NlcnZpY2VzL0hlYWx0aFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0M2VlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9IZWFsdGhSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5zZXJ2aWNlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL0pBWC1SUyBpbXBvcnRzCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvL0pTT04gaW1wb3J0cworaW1wb3J0IG5ldC5zZi5qc29uLkpTT05PYmplY3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5DcmF3bGVySGVhbHRoOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLkNyYXdsZXJTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguSm9iSGVhbHRoU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLlBDU0RhZW1vblN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5QQ1NIZWFsdGhNb25pdG9yTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5QQ1NIZWFsdGhNb25pdG9yUmVwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudG9vbHMuUENTSGVhbHRoTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLnV0aWwuRmlsZU1hbmFnZXJVdGlsczsKKworLyoqCisgKiAKKyAqIFRoZSBKQVgtUlMgcmVzb3VyY2UgZXhwb3NpbmcgdGhlIHtAbGluayBQQ1NIZWFsdGhNb25pdG9yfS4KKyAqIAorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworQFBhdGgoImhlYWx0aCIpCitwdWJsaWMgY2xhc3MgSGVhbHRoUmVzb3VyY2UgZXh0ZW5kcyBQQ1NTZXJ2aWNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzc2ODgzNjAwMTQ1OTIyNzMyM0w7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoSGVhbHRoUmVzb3VyY2UuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgUENTSGVhbHRoTW9uaXRvciBtb247CisKKyAgcHVibGljIEhlYWx0aFJlc291cmNlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgc3VwZXIoKTsKKyAgICBtb24gPSBuZXcgUENTSGVhbHRoTW9uaXRvcihQQ1NTZXJ2aWNlLmNvbmYuZ2V0Rm1VcmwoKS50b1N0cmluZygpLAorICAgICAgICBQQ1NTZXJ2aWNlLmNvbmYuZ2V0V21VcmwoKS50b1N0cmluZygpLCBQQ1NTZXJ2aWNlLmNvbmYuZ2V0Um1VcmwoKQorICAgICAgICAgICAgLnRvU3RyaW5nKCksIFBDU1NlcnZpY2UuY29uZi5nZXRDcmF3bGVyQ29uZmlnRmlsZVBhdGgoKSwKKyAgICAgICAgUENTU2VydmljZS5jb25mLmdldFdvcmtmbG93U3RhdHVzZXNGaWxlUGF0aCgpKTsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInJlcG9ydCIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgaGVhbHRoUmVwb3J0KCkgeworICAgIFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0ID0gbW9uLmdldFJlcG9ydCgpOworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gb3V0cHV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgb3V0cHV0LnB1dCgiZ2VuZXJhdGVkIiwgcmVwb3J0LmdldENyZWF0ZURhdGVJc29Gb3JtYXQoKSk7CisgICAgb3V0cHV0LnB1dCgiZGFlbW9uU3RhdHVzIiwgdGhpcy5lbmNvZGVEYWVtb25PdXRwdXQocmVwb3J0KSk7CisgICAgb3V0cHV0LnB1dCgiY3Jhd2xlclN0YXR1cyIsIHRoaXMuZW5jb2RlQ3Jhd2xlckhlYWx0aFJlcG9ydE91dHB1dChyZXBvcnQpKTsKKyAgICBvdXRwdXQucHV0KCJsYXRlc3RGaWxlcyIsIHRoaXMuZW5jb2RlTGF0ZXN0RmlsZXNPdXRwdXQocmVwb3J0KSk7CisgICAgb3V0cHV0LnB1dCgiam9iSGVhbHRoIiwgdGhpcy5lbmNvZGVKb2JIZWFsdGhTdGF0dXNMaXN0KHJlcG9ydCkpOworICAgIG91dHB1dC5wdXQoImluZ2VzdEhlYWx0aCIsIHRoaXMuZW5jb2RlSW5nZXN0SGVhbHRoTGlzdChyZXBvcnQpKTsKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVSZXBvcnRBc0pzb24ob3V0cHV0KTsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInJlcG9ydC9pbmdlc3QiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGluZ2VzdFJlcG9ydCgpIHsKKyAgICBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHJlcG9ydCA9IG1vbi5nZXRSZXBvcnQoKTsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG91dHB1dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIG91dHB1dC5wdXQoImdlbmVyYXRlZCIsIHJlcG9ydC5nZXRDcmVhdGVEYXRlSXNvRm9ybWF0KCkpOworICAgIG91dHB1dC5wdXQoImluZ2VzdEhlYWx0aCIsIHRoaXMuZW5jb2RlSW5nZXN0SGVhbHRoTGlzdChyZXBvcnQpKTsKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVSZXBvcnRBc0pzb24ob3V0cHV0KTsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInJlcG9ydC9pbmdlc3Qve2NuYW1lfSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgaW5nZXN0UmVwb3J0QnlOYW1lKEBQYXRoUGFyYW0oImNuYW1lIikgU3RyaW5nIGNyYXdsZXJOYW1lKSB7CisgICAgUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQgPSBtb24uZ2V0UmVwb3J0KCk7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBvdXRwdXQucHV0KCJnZW5lcmF0ZWQiLCByZXBvcnQuZ2V0Q3JlYXRlRGF0ZUlzb0Zvcm1hdCgpKTsKKyAgICBvdXRwdXQucHV0KCJpbmdlc3RIZWFsdGgiLCB0aGlzCisgICAgICAgIC5lbmNvZGVJbmdlc3RIZWFsdGhMaXN0KHJlcG9ydCwgY3Jhd2xlck5hbWUpKTsKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVSZXBvcnRBc0pzb24ob3V0cHV0KTsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInJlcG9ydC9qb2JzIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBqb2JzUmVwb3J0KCkgeworICAgIFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0ID0gbW9uLmdldFJlcG9ydCgpOworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gb3V0cHV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgb3V0cHV0LnB1dCgiZ2VuZXJhdGVkIiwgcmVwb3J0LmdldENyZWF0ZURhdGVJc29Gb3JtYXQoKSk7CisgICAgb3V0cHV0LnB1dCgiam9iSGVhbHRoIiwgdGhpcy5lbmNvZGVKb2JIZWFsdGhTdGF0dXNMaXN0KHJlcG9ydCkpOworICAgIHJldHVybiB0aGlzLmVuY29kZVJlcG9ydEFzSnNvbihvdXRwdXQpOworICB9CisKKyAgQEdFVAorICBAUGF0aCgicmVwb3J0L2pvYnMve3N0YXRlfSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgam9ic1JlcG9ydEJ5U3RhdGUoQFBhdGhQYXJhbSgic3RhdGUiKSBTdHJpbmcgam9iU3RhdGUpIHsKKyAgICBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHJlcG9ydCA9IG1vbi5nZXRSZXBvcnQoKTsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG91dHB1dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIG91dHB1dC5wdXQoImdlbmVyYXRlZCIsIHJlcG9ydC5nZXRDcmVhdGVEYXRlSXNvRm9ybWF0KCkpOworICAgIG91dHB1dC5wdXQoImpvYkhlYWx0aCIsIHRoaXMuZW5jb2RlSm9iSGVhbHRoU3RhdHVzTGlzdChyZXBvcnQsIGpvYlN0YXRlKSk7CisgICAgcmV0dXJuIHRoaXMuZW5jb2RlUmVwb3J0QXNKc29uKG91dHB1dCk7CisgIH0KKworICBAR0VUCisgIEBQYXRoKCJyZXBvcnQvZGFlbW9uIikKKyAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgcHVibGljIFN0cmluZyBkYWVtb25SZXBvcnQoKSB7CisgICAgUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQgPSBtb24uZ2V0UmVwb3J0KCk7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBvdXRwdXQucHV0KCJnZW5lcmF0ZWQiLCByZXBvcnQuZ2V0Q3JlYXRlRGF0ZUlzb0Zvcm1hdCgpKTsKKyAgICBvdXRwdXQucHV0KCJkYWVtb25TdGF0dXMiLCB0aGlzLmVuY29kZURhZW1vbk91dHB1dChyZXBvcnQpKTsKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVSZXBvcnRBc0pzb24ob3V0cHV0KTsKKyAgfQorCisgIEBHRVQKKyAgQFBhdGgoInJlcG9ydC9kYWVtb24ve2RuYW1lfSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgZGFlbW9uUmVwb3J0QnlOYW1lKEBQYXRoUGFyYW0oImRuYW1lIikgU3RyaW5nIGRhZW1vbk5hbWUpIHsKKyAgICBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHJlcG9ydCA9IG1vbi5nZXRSZXBvcnQoKTsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG91dHB1dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIG91dHB1dC5wdXQoImdlbmVyYXRlZCIsIHJlcG9ydC5nZXRDcmVhdGVEYXRlSXNvRm9ybWF0KCkpOworICAgIG91dHB1dC5wdXQoImRhZW1vblN0YXR1cyIsIHRoaXMuZW5jb2RlRGFlbW9uT3V0cHV0KHJlcG9ydCwgZGFlbW9uTmFtZSkpOworICAgIHJldHVybiB0aGlzLmVuY29kZVJlcG9ydEFzSnNvbihvdXRwdXQpOworCisgIH0KKworICBAR0VUCisgIEBQYXRoKCJyZXBvcnQvY3Jhd2xlcnMiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGNyYXdsZXJIZWFsdGhSZXBvcnQoKSB7CisgICAgUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQgPSBtb24uZ2V0UmVwb3J0KCk7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBvdXRwdXQucHV0KCJnZW5lcmF0ZWQiLCByZXBvcnQuZ2V0Q3JlYXRlRGF0ZUlzb0Zvcm1hdCgpKTsKKyAgICBvdXRwdXQucHV0KCJjcmF3bGVyU3RhdHVzIiwgdGhpcy5lbmNvZGVDcmF3bGVySGVhbHRoUmVwb3J0T3V0cHV0KHJlcG9ydCkpOworICAgIHJldHVybiB0aGlzLmVuY29kZVJlcG9ydEFzSnNvbihvdXRwdXQpOworICB9CisKKyAgQEdFVAorICBAUGF0aCgicmVwb3J0L2NyYXdsZXJzL3tjbmFtZX0iKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdldENyYXdsZXJIZWFsdGhSZXBvcnRCeU5hbWUoCisgICAgICBAUGF0aFBhcmFtKCJjbmFtZSIpIFN0cmluZyBjcmF3bGVyTmFtZSkgeworICAgIFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0ID0gbW9uLmdldFJlcG9ydCgpOworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gb3V0cHV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgb3V0cHV0LnB1dCgiZ2VuZXJhdGVkIiwgcmVwb3J0LmdldENyZWF0ZURhdGVJc29Gb3JtYXQoKSk7CisgICAgb3V0cHV0LnB1dCgiY3Jhd2xlclN0YXR1cyIsIHRoaXMuZW5jb2RlQ3Jhd2xlckhlYWx0aFJlcG9ydE91dHB1dChyZXBvcnQsCisgICAgICAgIGNyYXdsZXJOYW1lKSk7CisgICAgcmV0dXJuIHRoaXMuZW5jb2RlUmVwb3J0QXNKc29uKG91dHB1dCk7CisgIH0KKworICBAR0VUCisgIEBQYXRoKCJyZXBvcnQvbGF0ZXN0ZmlsZXMiKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdldExhdGVzdEluZ2VzdGVkRmlsZXMoKSB7CisgICAgUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQgPSBtb24uZ2V0UmVwb3J0KCk7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBvdXRwdXQucHV0KCJnZW5lcmF0ZWQiLCByZXBvcnQuZ2V0Q3JlYXRlRGF0ZUlzb0Zvcm1hdCgpKTsKKyAgICBvdXRwdXQucHV0KCJsYXRlc3RGaWxlcyIsIHRoaXMuZW5jb2RlTGF0ZXN0RmlsZXNPdXRwdXQocmVwb3J0KSk7CisgICAgcmV0dXJuIHRoaXMuZW5jb2RlUmVwb3J0QXNKc29uKG91dHB1dCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBlbmNvZGVSZXBvcnRBc0pzb24oTWFwPFN0cmluZywgT2JqZWN0PiByZXBvcnRIYXNoKSB7CisgICAgSlNPTk9iamVjdCByZXNwb25zZSA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgcmVzcG9uc2UucHV0KCJyZXBvcnQiLCByZXBvcnRIYXNoKTsKKyAgICByZXR1cm4gcmVzcG9uc2UudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBlbmNvZGVDcmF3bGVySGVhbHRoKENyYXdsZXJIZWFsdGggaGVhbHRoKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBvdXRwdXQucHV0KCJjcmF3bGVyIiwgaGVhbHRoLmdldENyYXdsZXJOYW1lKCkpOworICAgIG91dHB1dC5wdXQoImF2Z0NyYXdsVGltZSIsIGhlYWx0aC5nZXRBdmdDcmF3bFRpbWUoKSk7CisgICAgb3V0cHV0LnB1dCgibnVtQ3Jhd2xzIiwgaGVhbHRoLmdldE51bUNyYXdscygpKTsKKyAgICByZXR1cm4gb3V0cHV0OworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGVuY29kZUpvYlN0YXR1cyhKb2JIZWFsdGhTdGF0dXMgc3RhdHVzKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBvdXRwdXQucHV0KCJzdGF0ZSIsIHN0YXR1cy5nZXRTdGF0dXMoKSk7CisgICAgb3V0cHV0LnB1dCgibnVtSm9icyIsIHN0YXR1cy5nZXROdW1QaXBlbGluZXMoKSk7CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBlbmNvZGVMYXRlc3RGaWxlKExpc3Q8T2JqZWN0PiBsYXRlc3RGaWxlc091dHB1dCwgUHJvZHVjdCBwKQorICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgRmlsZU1hbmFnZXJVdGlscyBmbSA9IG5ldyBGaWxlTWFuYWdlclV0aWxzKFBDU1NlcnZpY2UuY29uZi5nZXRGbVVybCgpKTsKKyAgICBwLnNldFByb2R1Y3RUeXBlKGZtLnNhZmVHZXRQcm9kdWN0VHlwZUJ5SWQocC5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgIC5nZXRQcm9kdWN0VHlwZUlkKCkpKTsKKyAgICBwLnNldFByb2R1Y3RSZWZlcmVuY2VzKGZtLnNhZmVHZXRQcm9kdWN0UmVmZXJlbmNlcyhwKSk7CisgICAgTWV0YWRhdGEgcHJvZE1ldCA9IGZtLnNhZmVHZXRNZXRhZGF0YShwKTsKKyAgICBpZiAocHJvZE1ldCA9PSBudWxsKQorICAgICAgcHJvZE1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZmlsZU91dHB1dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIGZpbGVPdXRwdXQucHV0KCJmaWxlcGF0aCIsIGZtLmdldEZpbGVQYXRoKHApKTsKKyAgICBmaWxlT3V0cHV0LnB1dCgicmVjZWl2ZWRUaW1lIiwgcHJvZE1ldC5nZXRNZXRhZGF0YSgiQ0FTLiIKKyAgICAgICAgKyBDb3JlTWV0S2V5cy5QUk9EVUNUX1JFQ0VWSUVEX1RJTUUpICE9IG51bGwgPyBwcm9kTWV0CisgICAgICAgIC5nZXRNZXRhZGF0YSgiQ0FTLiIgKyBDb3JlTWV0S2V5cy5QUk9EVUNUX1JFQ0VWSUVEX1RJTUUpIDogIlVOS05PV04iKTsKKyAgICBsYXRlc3RGaWxlc091dHB1dC5hZGQoZmlsZU91dHB1dCk7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZW5jb2RlQ3Jhd2xlclN0YXR1cyhDcmF3bGVyU3RhdHVzIHN0YXR1cykgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3V0cHV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgb3V0cHV0LnB1dCgiY3Jhd2xlck5hbWUiLCBzdGF0dXMuZ2V0SW5mbygpLmdldENyYXdsZXJOYW1lKCkpOworICAgIG91dHB1dC5wdXQoImNyYXdsZXJQb3J0Iiwgc3RhdHVzLmdldEluZm8oKS5nZXRDcmF3bGVyUG9ydCgpKTsKKyAgICBvdXRwdXQucHV0KCJ1cmwiLCBzdGF0dXMuZ2V0Q3Jhd2xIb3N0KCkpOworICAgIG91dHB1dC5wdXQoInN0YXR1cyIsIHN0YXR1cy5nZXRTdGF0dXMoKSk7CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGVuY29kZUluZ2VzdEhlYWx0aExpc3QoUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQsCisgICAgICBTdHJpbmcuLi4gY3Jhd2xlck5hbWUpIHsKKyAgICBMaXN0PE9iamVjdD4gY3Jhd2xlckhlYWx0aExpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICBpZiAoY3Jhd2xlck5hbWUubGVuZ3RoID4gMCkgeworICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChDcmF3bGVySGVhbHRoIGNoIDogKExpc3Q8Q3Jhd2xlckhlYWx0aD4pIChMaXN0PD8+KSByZXBvcnQKKyAgICAgICAgICAuZ2V0Q3Jhd2xlckhlYWx0aFN0YXR1cygpKSB7CisgICAgICAgIGlmIChjaC5nZXRDcmF3bGVyTmFtZSgpLmVxdWFscyhjcmF3bGVyTmFtZVswXSkpIHsKKyAgICAgICAgICBjcmF3bGVySGVhbHRoTGlzdC5hZGQodGhpcy5lbmNvZGVDcmF3bGVySGVhbHRoKGNoKSk7CisgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKQorICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJObyBpbmdlc3QgY3Jhd2xlciBmb3VuZCB3aXRoIG5hbWU6IFsiICsgY3Jhd2xlck5hbWVbMF0gKyAiXSIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKENyYXdsZXJIZWFsdGggY2ggOiAoTGlzdDxDcmF3bGVySGVhbHRoPikgKExpc3Q8Pz4pIHJlcG9ydAorICAgICAgICAgIC5nZXRDcmF3bGVySGVhbHRoU3RhdHVzKCkpIHsKKyAgICAgICAgY3Jhd2xlckhlYWx0aExpc3QuYWRkKHRoaXMuZW5jb2RlQ3Jhd2xlckhlYWx0aChjaCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3Jhd2xlckhlYWx0aExpc3Q7CisgIH0KKworICBwcml2YXRlIExpc3Q8T2JqZWN0PiBlbmNvZGVKb2JIZWFsdGhTdGF0dXNMaXN0KFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0LAorICAgICAgU3RyaW5nLi4uIGpvYlN0YXRlKSB7CisgICAgTGlzdDxPYmplY3Q+IGpvYlN0YXR1c0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICBpZiAoam9iU3RhdGUubGVuZ3RoID4gMCkgeworICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChKb2JIZWFsdGhTdGF0dXMganMgOiAoTGlzdDxKb2JIZWFsdGhTdGF0dXM+KSAoTGlzdDw/PikgcmVwb3J0CisgICAgICAgICAgLmdldEpvYkhlYWx0aFN0YXR1cygpKSB7CisgICAgICAgIGlmIChqcy5nZXRTdGF0dXMoKS5lcXVhbHMoam9iU3RhdGVbMF0pKSB7CisgICAgICAgICAgam9iU3RhdHVzTGlzdC5hZGQodGhpcy5lbmNvZGVKb2JTdGF0dXMoanMpKTsKKyAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghZm91bmQpCisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGFueSBqb2JzIHdpdGggYXNzb2NpYXRlZCBzdGF0ZTogWyIgKyBqb2JTdGF0ZVswXQorICAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChKb2JIZWFsdGhTdGF0dXMganMgOiAoTGlzdDxKb2JIZWFsdGhTdGF0dXM+KSAoTGlzdDw/PikgcmVwb3J0CisgICAgICAgICAgLmdldEpvYkhlYWx0aFN0YXR1cygpKSB7CisgICAgICAgIGpvYlN0YXR1c0xpc3QuYWRkKHRoaXMuZW5jb2RlSm9iU3RhdHVzKGpzKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBqb2JTdGF0dXNMaXN0OworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGVuY29kZUxhdGVzdEZpbGVzT3V0cHV0KAorICAgICAgUENTSGVhbHRoTW9uaXRvclJlcG9ydCByZXBvcnQpIHsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGxhdGVzdEZpbGVzT3V0cHV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgbGF0ZXN0RmlsZXNPdXRwdXQucHV0KCJ0b3BOIiwgUENTSGVhbHRoTW9uaXRvci5UT1BfTl9QUk9EVUNUUyk7CisgICAgTGlzdDxPYmplY3Q+IGxhdGVzdEZpbGVzTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgIGZvciAoUHJvZHVjdCBwcm9kIDogKExpc3Q8UHJvZHVjdD4pIChMaXN0PD8+KSByZXBvcnQKKyAgICAgICAgLmdldExhdGVzdFByb2R1Y3RzSW5nZXN0ZWQoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5lbmNvZGVMYXRlc3RGaWxlKGxhdGVzdEZpbGVzTGlzdCwgcHJvZCk7CisgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZW5jb2RlIGxhdGVzdCBmaWxlOiBbIgorICAgICAgICAgICAgKyBwcm9kLmdldFByb2R1Y3ROYW1lKCkgKyAiXTogZXJyb3I6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorICAgIGxhdGVzdEZpbGVzT3V0cHV0LnB1dCgiZmlsZXMiLCBsYXRlc3RGaWxlc0xpc3QpOworICAgIHJldHVybiBsYXRlc3RGaWxlc091dHB1dDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGVuY29kZUNyYXdsZXJIZWFsdGhSZXBvcnRPdXRwdXQoCisgICAgICBQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHJlcG9ydCwgU3RyaW5nLi4uIGNyYXdsZXJOYW1lKSB7CisgICAgTGlzdDxPYmplY3Q+IGNyYXdsZXJPdXRwdXQgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICBpZiAoY3Jhd2xlck5hbWUubGVuZ3RoID4gMCkgeworICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChDcmF3bGVyU3RhdHVzIGNzIDogKExpc3Q8Q3Jhd2xlclN0YXR1cz4pIChMaXN0PD8+KSByZXBvcnQKKyAgICAgICAgICAuZ2V0Q3Jhd2xlclN0YXR1cygpKSB7CisgICAgICAgIGlmIChjcy5nZXRJbmZvKCkuZ2V0Q3Jhd2xlck5hbWUoKS5lcXVhbHMoY3Jhd2xlck5hbWVbMF0pKSB7CisgICAgICAgICAgY3Jhd2xlck91dHB1dC5hZGQodGhpcy5lbmNvZGVDcmF3bGVyU3RhdHVzKGNzKSk7CisgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKQorICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBhbnkgY3Jhd2xlcnMgd2l0aCBuYW1lOiBbIiArIGNyYXdsZXJOYW1lWzBdICsgIl0iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChDcmF3bGVyU3RhdHVzIGNzIDogKExpc3Q8Q3Jhd2xlclN0YXR1cz4pIChMaXN0PD8+KSByZXBvcnQKKyAgICAgICAgICAuZ2V0Q3Jhd2xlclN0YXR1cygpKSB7CisgICAgICAgIGNyYXdsZXJPdXRwdXQuYWRkKHRoaXMuZW5jb2RlQ3Jhd2xlclN0YXR1cyhjcykpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjcmF3bGVyT3V0cHV0OworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGVuY29kZURhZW1vbk91dHB1dChQQ1NIZWFsdGhNb25pdG9yUmVwb3J0IHJlcG9ydCwKKyAgICAgIFN0cmluZy4uLiBkYWVtb25OYW1lKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYWVtb25PdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBpZiAoZGFlbW9uTmFtZS5sZW5ndGggPiAwKSB7CisgICAgICBpZiAoZGFlbW9uTmFtZVswXS5lcXVhbHMoImZtIikpIHsKKyAgICAgICAgZGFlbW9uT3V0cHV0LnB1dCgiZm0iLCB0aGlzLmVuY29kZURhZW1vblN0YXR1cyhyZXBvcnQuZ2V0Rm1TdGF0dXMoKSkpOworICAgICAgfSBlbHNlIGlmIChkYWVtb25OYW1lWzBdLmVxdWFscygid20iKSkgeworICAgICAgICBkYWVtb25PdXRwdXQucHV0KCJ3bSIsIHRoaXMuZW5jb2RlRGFlbW9uU3RhdHVzKHJlcG9ydC5nZXRXbVN0YXR1cygpKSk7CisgICAgICB9IGVsc2UgaWYgKGRhZW1vbk5hbWVbMF0uZXF1YWxzKCJybSIpKSB7CisgICAgICAgIGRhZW1vbk91dHB1dC5wdXQoInJtIiwgdGhpcy5lbmNvZGVEYWVtb25TdGF0dXMocmVwb3J0LmdldFJtU3RhdHVzKCkpKTsKKyAgICAgIH0gZWxzZSBpZiAoZGFlbW9uTmFtZVswXS5lcXVhbHMoInN0dWJzIikpIHsKKyAgICAgICAgaWYgKHJlcG9ydC5nZXRSbVN0YXR1cygpLmdldFN0YXR1cygpLmVxdWFscygKKyAgICAgICAgICAgIFBDU0hlYWx0aE1vbml0b3JNZXRLZXlzLlNUQVRVU19VUCkpIHsKKyAgICAgICAgICAvLyBwcmludCBvdXQgdGhlIGJhdGNoIHN0dWJzCisgICAgICAgICAgTGlzdDxPYmplY3Q+IHN0dWJzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgICAgZm9yIChQQ1NEYWVtb25TdGF0dXMgYlN0YXR1cyA6IChMaXN0PFBDU0RhZW1vblN0YXR1cz4pIChMaXN0PD8+KSByZXBvcnQKKyAgICAgICAgICAgICAgLmdldEJhdGNoU3R1YlN0YXR1cygpKSB7CisgICAgICAgICAgICBzdHVicy5hZGQodGhpcy5lbmNvZGVEYWVtb25TdGF0dXMoYlN0YXR1cykpOworICAgICAgICAgIH0KKyAgICAgICAgICBkYWVtb25PdXRwdXQucHV0KCJzdHVicyIsIHN0dWJzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJSZXNvdXJjZSBNYW5hZ2VyIG5vdCBydW5uaW5nIHNvIG5vIGJhdGNoIHN0dWJzIHRvIGNoZWNrLiIpOworICAgICAgfSBlbHNlCisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCJEYWVtb24gbm90IGZvdW5kIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhZW1vbk91dHB1dC5wdXQoImZtIiwgdGhpcy5lbmNvZGVEYWVtb25TdGF0dXMocmVwb3J0LmdldEZtU3RhdHVzKCkpKTsKKyAgICAgIGRhZW1vbk91dHB1dC5wdXQoIndtIiwgdGhpcy5lbmNvZGVEYWVtb25TdGF0dXMocmVwb3J0LmdldFdtU3RhdHVzKCkpKTsKKyAgICAgIGRhZW1vbk91dHB1dC5wdXQoInJtIiwgdGhpcy5lbmNvZGVEYWVtb25TdGF0dXMocmVwb3J0LmdldFJtU3RhdHVzKCkpKTsKKyAgICAgIGlmIChyZXBvcnQuZ2V0Um1TdGF0dXMoKS5nZXRTdGF0dXMoKS5lcXVhbHMoCisgICAgICAgICAgUENTSGVhbHRoTW9uaXRvck1ldEtleXMuU1RBVFVTX1VQKSkgeworICAgICAgICAvLyBwcmludCBvdXQgdGhlIGJhdGNoIHN0dWJzCisgICAgICAgIExpc3Q8T2JqZWN0PiBzdHVicyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICBmb3IgKFBDU0RhZW1vblN0YXR1cyBiU3RhdHVzIDogKExpc3Q8UENTRGFlbW9uU3RhdHVzPikgKExpc3Q8Pz4pIHJlcG9ydAorICAgICAgICAgICAgLmdldEJhdGNoU3R1YlN0YXR1cygpKSB7CisgICAgICAgICAgc3R1YnMuYWRkKHRoaXMuZW5jb2RlRGFlbW9uU3RhdHVzKGJTdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgICBkYWVtb25PdXRwdXQucHV0KCJzdHVicyIsIHN0dWJzKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhZW1vbk91dHB1dDsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBlbmNvZGVEYWVtb25TdGF0dXMoUENTRGFlbW9uU3RhdHVzIHN0YXR1cykgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3V0cHV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgb3V0cHV0LnB1dCgiZGFlbW9uIiwgc3RhdHVzLmdldERhZW1vbk5hbWUoKSk7CisgICAgb3V0cHV0LnB1dCgidXJsIiwgc3RhdHVzLmdldFVybFN0cigpKTsKKyAgICBvdXRwdXQucHV0KCJzdGF0dXMiLCBzdGF0dXMuZ2V0U3RhdHVzKCkpOworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9QQ1NTZXJ2aWNlLmphdmEgYi8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvc2VydmljZXMvUENTU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmUyNGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvc2VydmljZXMvUENTU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLnNlcnZpY2VzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CisKKy8vSkFYLVJTIGltcG9ydHMKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3Muc2VydmljZXMuY29uZmlnLlBDU1NlcnZpY2VDb25maWc7CisKKworLyoqCisgKgorICogQmFzZSBjbGFzcyBmb3IgUENTIEpBWC1SUyBzZXJ2aWNlcy4gTG9hZHMgdXAgCisgKiB0aGUge0BsaW5rIFBDU1NlcnZpY2VDb25maWd9IGFuZCBtYWtlcyBpdCBhdmFpbGFibGUKKyAqIHN0YXRpY2FsbHkgdG8gZG93bnN0cmVhbSBkZXNjZW5kYW50cy4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUENTU2VydmljZSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyNTYwODk3MDA0Mjk5Mzg0OTZMOworICAKKyAgcHJvdGVjdGVkIHN0YXRpYyBQQ1NTZXJ2aWNlQ29uZmlnIGNvbmY7CisgIAorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBqYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0I2luaXQoamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBzdXBlci5pbml0KGNvbmZpZyk7CisgICAgY29uZiA9IG5ldyBQQ1NTZXJ2aWNlQ29uZmlnKGNvbmZpZyk7CisgIH0KKyAgCisKKyAgcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpIHsKKyAgICAgIHN1cGVyKFJlc3BvbnNlLnN0YXR1cyhTdGF0dXMuTk9UX0ZPVU5EKS50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICBzdXBlcihSZXNwb25zZS5zdGF0dXMoU3RhdHVzLk5PVF9GT1VORCkuZW50aXR5KG1zZykudHlwZSgKKyAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9QZWRpZ3JlZVJlc291cmNlLmphdmEgYi8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvc2VydmljZXMvUGVkaWdyZWVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjNlYjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvc2VydmljZXMvUGVkaWdyZWVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5zZXJ2aWNlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9KQVgtUlMgaW1wb3J0cworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLy9KU09OIGltcG9ydHMKK2ltcG9ydCBuZXQuc2YuanNvbi5KU09OT2JqZWN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MucGVkaWdyZWUuUGVkaWdyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5wZWRpZ3JlZS5QZWRpZ3JlZVRyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5wZWRpZ3JlZS5QZWRpZ3JlZVRyZWVOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudXRpbC5GaWxlTWFuYWdlclV0aWxzOworCisvKioKKyAqIAorICogRXhwb3NlcyB0aGUge0BsaW5rIFBlZGlncmVlfSBBUEkgb2YgdGhlIFBDUyB0byBwcm92aWRlIGFuIHVwc3RyZWFtIGFuZAorICogZG93bnN0cmVhbSBsaW5lYWdlIG9mIGEgcGFydGljdWxhciBPT0RUIHtAbGluayBQcm9kdWN0fSB1c2luZyBKQVgtUlMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitAUGF0aCgicGVkaWdyZWUiKQorcHVibGljIGNsYXNzIFBlZGlncmVlUmVzb3VyY2UgZXh0ZW5kcyBQQ1NTZXJ2aWNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0ODUxNjIzNTQ2NzE4MTEyMjA1TDsKKworICBwcml2YXRlIFBlZGlncmVlIHRyYWNlOworCisgIHByaXZhdGUgRmlsZU1hbmFnZXJVdGlscyBmbTsKKworICBwdWJsaWMgUGVkaWdyZWVSZXNvdXJjZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgIHRoaXMuZm0gPSBuZXcgRmlsZU1hbmFnZXJVdGlscyhQQ1NTZXJ2aWNlLmNvbmYuZ2V0Rm1VcmwoKSk7CisgICAgdGhpcy50cmFjZSA9IG5ldyBQZWRpZ3JlZSh0aGlzLmZtLCBQQ1NTZXJ2aWNlLmNvbmYKKyAgICAgICAgLmlzVHJhY2VOb3RDYXRhbG9nZWRGaWxlcygpLCBBcnJheXMuYXNMaXN0KFBDU1NlcnZpY2UuY29uZgorICAgICAgICAuZ2V0VHJhY2VQcm9kdWN0VHlwZUV4Y2x1ZGVMaXN0KCkuc3BsaXQoIiwiKSkpOworICB9CisKKyAgQEdFVAorICBAUGF0aCgicmVwb3J0L3tmaWxlbmFtZX0iKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlUGVkaWdyZWUoQFBhdGhQYXJhbSgiZmlsZW5hbWUiKSBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICBQZWRpZ3JlZVRyZWUgdXBzdHJlYW1UcmVlID0gdGhpcy50cmFjZS5kb1BlZGlncmVlKHRoaXMuZm0KKyAgICAgICAgLnNhZmVHZXRQcm9kdWN0QnlOYW1lKGZpbGVuYW1lKSwgdHJ1ZSk7CisgICAgUGVkaWdyZWVUcmVlIGRvd25zdHJlYW1UcmVlID0gdGhpcy50cmFjZS5kb1BlZGlncmVlKHRoaXMuZm0KKyAgICAgICAgLnNhZmVHZXRQcm9kdWN0QnlOYW1lKGZpbGVuYW1lKSwgZmFsc2UpOworICAgIHJldHVybiB0aGlzLmVuY29kZVBlZGlncmVlQXNKc29uKHVwc3RyZWFtVHJlZSwgZG93bnN0cmVhbVRyZWUpOworICB9CisKKyAgQEdFVAorICBAUGF0aCgicmVwb3J0L3tmaWxlbmFtZX0vdXBzdHJlYW0iKQorICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVXBzdHJlYW1QZWRpZ3JlZShAUGF0aFBhcmFtKCJmaWxlbmFtZSIpIFN0cmluZyBmaWxlbmFtZSkgeworICAgIFBlZGlncmVlVHJlZSB1cHN0cmVhbVRyZWUgPSB0aGlzLnRyYWNlLmRvUGVkaWdyZWUodGhpcy5mbQorICAgICAgICAuc2FmZUdldFByb2R1Y3RCeU5hbWUoZmlsZW5hbWUpLCB0cnVlKTsKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVQZWRpZ3JlZUFzSnNvbih1cHN0cmVhbVRyZWUsIG51bGwpOworICB9CisKKyAgQEdFVAorICBAUGF0aCgicmVwb3J0L3tmaWxlbmFtZX0vZG93bnN0cmVhbSIpCisgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVEb3duc3RyZWFtUGVkaWdyZWUoCisgICAgICBAUGF0aFBhcmFtKCJmaWxlbmFtZSIpIFN0cmluZyBmaWxlbmFtZSkgeworICAgIFBlZGlncmVlVHJlZSBkb3duc3RyZWFtVHJlZSA9IHRoaXMudHJhY2UuZG9QZWRpZ3JlZSh0aGlzLmZtCisgICAgICAgIC5zYWZlR2V0UHJvZHVjdEJ5TmFtZShmaWxlbmFtZSksIGZhbHNlKTsKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVQZWRpZ3JlZUFzSnNvbihudWxsLCBkb3duc3RyZWFtVHJlZSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBlbmNvZGVQZWRpZ3JlZUFzSnNvbihQZWRpZ3JlZVRyZWUgdXAsIFBlZGlncmVlVHJlZSBkb3duKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBpZiAodXAgIT0gbnVsbCkKKyAgICAgIG91dHB1dC5wdXQoInVwc3RyZWFtIiwgdGhpcy5lbmNvZGVQZWRpZ3JlZVRyZWVBc0pzb24odXAuZ2V0Um9vdCgpKSk7CisgICAgaWYgKGRvd24gIT0gbnVsbCkKKyAgICAgIG91dHB1dC5wdXQoImRvd25zdHJlYW0iLCB0aGlzLmVuY29kZVBlZGlncmVlVHJlZUFzSnNvbihkb3duLmdldFJvb3QoKSkpOworICAgIEpTT05PYmplY3QganNvbiA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAganNvbi5wdXQoInBlZGlncmVlIiwgb3V0cHV0KTsKKyAgICByZXR1cm4ganNvbi50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgZW5jb2RlUGVkaWdyZWVUcmVlQXNKc29uKFBlZGlncmVlVHJlZU5vZGUgbm9kZSkgeworICAgIGlmIChub2RlLmdldE51bUNoaWxkcmVuKCkgPiAwKSB7CisgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5nZXROdW1DaGlsZHJlbigpOyBpKyspIHsKKyAgICAgICAgbGlzdC5hZGQodGhpcworICAgICAgICAgICAgLmVuY29kZVBlZGlncmVlVHJlZUFzSnNvbihub2RlLmdldENoaWxkQXQoaSkpKTsKKyAgICAgIH0KKyAgICAgIG1hcC5wdXQobm9kZS5nZXROb2RlUHJvZHVjdCgpLmdldFByb2R1Y3ROYW1lKCksIGxpc3QpOworICAgICAgcmV0dXJuIG1hcDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZVByb2R1Y3QoKS5nZXRQcm9kdWN0TmFtZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wY3Mvc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3NlcnZpY2VzL2NvbmZpZy9QQ1NTZXJ2aWNlQ29uZk1ldEtleXMuamF2YSBiLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9jb25maWcvUENTU2VydmljZUNvbmZNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3Y2RkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9jb25maWcvUENTU2VydmljZUNvbmZNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Muc2VydmljZXMuY29uZmlnOworCisvKioKKyAqIAorICogQ29uZmlnIGZpbGUgbWV0IGtleXMgZm9yIHRoZSBQQ1Mgc2VydmljZXMgPGNvZGU+Y29udGV4dC54bWw8L2NvZGU+IGZpbGUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBDU1NlcnZpY2VDb25mTWV0S2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1fVVJMID0gIm9yZy5hcGFjaGUub29kdC5jYXMuZm0udXJsIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9VUkwgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy53bS51cmwiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJNX1VSTCA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnJtLnVybCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENTX0xMX0NPTkZfRklMRV9QQVRIID0gIm9yZy5hcGFjaGUub29kdC5wY3MubGwuY29uZi5maWxlUGF0aCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENTX0hFQUxUSF9DUkFXTEVSX0NPTkZfUEFUSCA9ICJvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5jcmF3bGVyLmNvbmYuZmlsZVBhdGgiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDU19IRUFMVEhfV09SS0ZMT1dfU1RBVFVTX1BBVEggPSAib3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGgud29ya2Zsb3cuc3RhdHVzZXMuZmlsZVBhdGgiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDU19UUkFDRV9FTkFCTEVfTk9OX0NBVCA9ICJvcmcuYXBhY2hlLm9vZHQucGNzLnRyYWNlLmVuYWJsZU5vbkNhdCI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ1NfVFJBQ0VfUFRZUEVfRVhDTFVERV9MSVNUID0gIm9yZy5hcGFjaGUub29kdC5wY3MudHJhY2UucHJvZHVjdFR5cGVFeGNsdWRlTGlzdCI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9jb25maWcvUENTU2VydmljZUNvbmZpZy5qYXZhIGIvMC4xMC9wY3Mvc2VydmljZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3NlcnZpY2VzL2NvbmZpZy9QQ1NTZXJ2aWNlQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzZjQ3MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy9zZXJ2aWNlcy9jb25maWcvUENTU2VydmljZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy5zZXJ2aWNlcy5jb25maWc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLyoqCisgKiAKKyAqIFRoZSBjb25maWd1cmF0aW9uIGNsYXNzIGZvciB0aGUgUENTIEpBWCBSUyBzZXJ2aWNlcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQQ1NTZXJ2aWNlQ29uZmlnIGltcGxlbWVudHMgUENTU2VydmljZUNvbmZNZXRLZXlzIHsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyczsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQQ1NTZXJ2aWNlQ29uZmlnLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgUENTU2VydmljZUNvbmZpZyhTZXJ2bGV0Q29uZmlnIGNvbmZpZykgeworICAgIHRoaXMucGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHRoaXMucmVhZENvbnRleHRQYXJhbXMoY29uZmlnKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBmbVVybAorICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFVSTCBnZXRGbVVybCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgVVJMKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHRoaXMucGFyYW1ldGVycy5nZXQoRk1fVVJMKSkpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHdtVXJsCisgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgVVJMIGdldFdtVXJsKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBVUkwoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXModGhpcy5wYXJhbWV0ZXJzLmdldChXTV9VUkwpKSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcm1VcmwKKyAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBVUkwgZ2V0Um1VcmwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFVSTChQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyh0aGlzLnBhcmFtZXRlcnMuZ2V0KFJNX1VSTCkpKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBsaXN0aW5nQ29uZkZpbGVQYXRoCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldExpc3RpbmdDb25mRmlsZVBhdGgoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHRoaXMucGFyYW1ldGVycworICAgICAgICAuZ2V0KFBDU19MTF9DT05GX0ZJTEVfUEFUSCkpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNyYXdsZXJDb25maWdGaWxlUGF0aAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDcmF3bGVyQ29uZmlnRmlsZVBhdGgoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHRoaXMucGFyYW1ldGVycworICAgICAgICAuZ2V0KFBDU19IRUFMVEhfQ1JBV0xFUl9DT05GX1BBVEgpKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB3b3JrZmxvd1N0YXR1c2VzRmlsZVBhdGgKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2Zsb3dTdGF0dXNlc0ZpbGVQYXRoKCkgeworICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyh0aGlzLnBhcmFtZXRlcnMKKyAgICAgICAgLmdldChQQ1NfSEVBTFRIX1dPUktGTE9XX1NUQVRVU19QQVRIKSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgdHJhY2VOb3RDYXRhbG9nZWRGaWxlcworICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNUcmFjZU5vdENhdGFsb2dlZEZpbGVzKCkgeworICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5wYXJhbWV0ZXJzLmdldChQQ1NfVFJBQ0VfRU5BQkxFX05PTl9DQVQpKTsKKyAgfQorICAKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByb2R1Y3QgdHlwZXMgdG8gZXhjbHVkZSBmcm9tCisgICAqIHBlZGlncmVlIHRyYWNraW5nLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRUcmFjZVByb2R1Y3RUeXBlRXhjbHVkZUxpc3QoKXsKKyAgICByZXR1cm4gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXModGhpcy5wYXJhbWV0ZXJzLmdldChQQ1NfVFJBQ0VfUFRZUEVfRVhDTFVERV9MSVNUKSk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHJpdmF0ZSB2b2lkIHJlYWRDb250ZXh0UGFyYW1zKFNlcnZsZXRDb25maWcgY29uZmlnKSB7CisgICAgZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IHBhcmFtTmFtZXMgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKQorICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7IHBhcmFtTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChwYXJhbU5hbWUsIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpCisgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIocGFyYW1OYW1lKSk7CisgICAgfQorCisgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiSW5pdCBQYXJhbWV0ZXJzOiAiICsgdGhpcy5wYXJhbWV0ZXJzKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwgYi8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxNzgxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGNzL3NlcnZpY2VzL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxDb250ZXh0IHBhdGg9Ii9wY3MiIGRvY0Jhc2U9Ii9wYXRoL3RvL3Bjcy1zZXJ2aWNlcy1YLlkud2FyIj4KKwkJCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmZtLnVybCIKKwkgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iLz4KKworCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy53bS51cmwiCisJICAgIHZhbHVlPSJbV09SS0ZMT1dfVVJMXSIvPgorCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJtLnVybCIKKwkgICAgdmFsdWU9IltSRVNNR1JfVVJMXSIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5wY3MubGwuY29uZi5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltQQ1NfSE9NRV0vYXV4L3Bjcy9wY3MtbGwtY29uZi54bW5sIi8+CisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguY3Jhd2xlci5jb25mLmZpbGVQYXRoIgorCSAgICB2YWx1ZT0iW1BDU19IT01FXS9hdXgvcGNzL3Bjcy1jcmF3bGVycy54bWwiLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC53b3JrZmxvdy5zdGF0dXNlcy5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltQQ1NfSE9NRV0vYXV4L3Bjcy9wY3Mtd29ya2Zsb3ctc3RhdHVzZXMueG1sIi8+CisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy50cmFjZS5lbmFibGVOb25DYXQiCisJICAgIHZhbHVlPSJ0cnVlIi8+CisJICAgIAorCTxQYXJhbWV0ZXIgbmFtZT0ib3JnLmFwYWNoZS5vb2R0LnBjcy50cmFjZS5wcm9kdWN0VHlwZUV4Y2x1ZGVMaXN0IgorCSAgICB2YWx1ZT0iVHlwZU5hbWUxLFR5cGVOYW1lMiIvPgorCis8L0NvbnRleHQ+CmRpZmYgLS1naXQgYS8wLjEwL3Bjcy9zZXJ2aWNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvMC4xMC9wY3Mvc2VydmljZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWIxNWUxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wY3Mvc2VydmljZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzx3ZWItYXBwIGlkPSJQQ1MiIHZlcnNpb249IjIuNCIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiIAorICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKyAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIj4KKwk8ZGlzcGxheS1uYW1lPlBDUzwvZGlzcGxheS1uYW1lPgorCTxzZXJ2bGV0PgorCSA8c2VydmxldC1uYW1lPkNYRlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKwkgPHNlcnZsZXQtY2xhc3M+CisJICAgb3JnLmFwYWNoZS5jeGYuamF4cnMuc2VydmxldC5DWEZOb25TcHJpbmdKYXhyc1NlcnZsZXQKKwkgPC9zZXJ2bGV0LWNsYXNzPgorCSA8aW5pdC1wYXJhbT4KKwkgIDxwYXJhbS1uYW1lPmpheHJzLnNlcnZpY2VDbGFzc2VzPC9wYXJhbS1uYW1lPgorCSAgPHBhcmFtLXZhbHVlPgorCSAgICBvcmcuYXBhY2hlLm9vZHQucGNzLnNlcnZpY2VzLkhlYWx0aFJlc291cmNlCisJICAgIG9yZy5hcGFjaGUub29kdC5wY3Muc2VydmljZXMuUGVkaWdyZWVSZXNvdXJjZQorCSAgPC9wYXJhbS12YWx1ZT4KKwkgPC9pbml0LXBhcmFtPgorCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorCTwvc2VydmxldD4KKyAgIDxzZXJ2bGV0PgorICAgICAgICA8ZGlzcGxheS1uYW1lPlBDUyBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UENTIFNlcnZpY2U8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5vb2R0LnBjcy5zZXJ2aWNlcy5QQ1NTZXJ2aWNlPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CQorCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+Q1hGU2VydmxldDwvc2VydmxldC1uYW1lPgorCQk8dXJsLXBhdHRlcm4+L3NlcnZpY2VzLyo8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2UvcG9tLnhtbCBiLzAuMTAvcGdlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNTNjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3BvbS54bWwKQEAgLTAsMCArMSwxNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIAorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5jYXMtcGdlPC9hcnRpZmFjdElkPgorICA8bmFtZT5DQVMgUEdFIEFkYXB0b3IgRnJhbWV3b3JrPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QWxsb3dzIGRhdGEgcHJvY2Vzc2luZyBqb2JzIG5vdCB3cml0dGVuIGluIGNvbmZvcm1hbmNlIHdpdGggdGhlCisgICAgICAgIFBDUyBQR0UgaW50ZXJmYWNlIHRvIGJlIHJ1biB3aXRoaW4gdGhlIFBDUy48L2Rlc2NyaXB0aW9uPgorIDxidWlsZD4KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy90ZXN0L2phdmE8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+IAorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5hcGFjaGUub29kdC5jYXMucGdlLlBHRVRhc2s8L21haW5DbGFzcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPiAKKyAgICA8L3BsdWdpbnM+CisgPC9idWlsZD4KKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3Jlc291cmNlcy9leGFtcGxlcy8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgPG51bVVuYXBwcm92ZWRMaWNlbnNlcz4yPC9udW1VbmFwcHJvdmVkTGljZW5zZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4gICAKKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtbWV0YWRhdGE8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9vZHQtY29tbW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtd29ya2Zsb3c8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1jcmF3bGVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjUuNDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi41LjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi41LjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MTAuMC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbGFuZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnZlbG9jaXR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+dmVsb2NpdHk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5zZi5zYXhvbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNheG9uLWRvbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjguNzwvdmVyc2lvbj4gICAgICAKKwkgIDwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi8wLjEwL3BnZS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzODQxYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmRpc3Q8L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT4ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9iYXNlRGlyZWN0b3J5PgorICA8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5PgorICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Q0hBTkdFUy50eHQ8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+bG9nZ2luZy5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxvZ3M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+UkVNT1ZFLmxvZzwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGMvZXhhbXBsZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc2l0ZS9hcGlkb2NzPC9kaXJlY3Rvcnk+CisgICAgICA8ZmlsdGVyZWQ+ZmFsc2U8L2ZpbHRlcmVkPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorICA8ZGVwZW5kZW5jeVNldHM+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgPHVucGFja09wdGlvbnMvPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgPC9kZXBlbmRlbmN5U2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9iaW4vcGdldGFzayBiLzAuMTAvcGdlL3NyYy9tYWluL2Jpbi9wZ2V0YXNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIzYWFlNjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9iaW4vcGdldGFzawpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworJEpBVkFfSE9NRS9iaW4vamF2YSAtRGphdmEuZXh0LmRpcnM9Li4vbGliIFwKKyAgICAgICAgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeT1uZXQuc2Yuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLlBHRVRhc2sgLS1tZXRhZGF0YSAuLi9ldGMvZXhhbXBsZXMvV29ya2Zsb3dNZ3JJbnB1dC9wY3MtcGdlLWR5bi1tZXRhZGF0YS5tZXQgXAorICAgICAgICAtLWNvbmZpZyAuLi9ldGMvZXhhbXBsZXMvV29ya2Zsb3dNZ3JJbnB1dC9wY3MtcGdlLXRhc2std29ya2Zsb3cucHJvcGVydGllcyBcCisgICAgICAgIC0taW5zdGFuY2VDbGFzcyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTcwOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9Db25maWdGaWxlUHJvcGVydHlBZGRlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gaW50ZXJmYWNlIGZvciBhZGRpbmcgZHluYW1pYyBwcm9wZXJ0aWVzIHRvIHRoZSB7QGxpbmsgTWV0YWRhdGF9IGJhc2VkIG9uCisgKiBtZXRhZGF0YSBzdXBwbGllZC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgUEdFVGFzayB0byBkeW5hbWljYWxseSBhZGQKKyAqIFBHRS1zcGVjaWZpYyBwcm9wZXJ0aWVzIHRoYXQgYXJlbid0IGdlbmVyYWwgdG8gYWxsIFBHRXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBDb25maWdGaWxlUHJvcGVydHlBZGRlciB7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWdQcm9wZXJ0aWVzKFBnZU1ldGFkYXRhIG1ldGFkYXRhLCBPYmplY3QuLi4gb2Jqcyk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvUEdFVGFzay5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9QR0VUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmOGE2MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvUEdFVGFzay5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZTsKKworLy9KREsgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5HZW5lcmljUGdlT2JqZWN0RmFjdG9yeS5jcmVhdGVQR0VUYXNrSW5zdGFuY2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLldvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKKworLyoqCisgKiBSdW5zIGEge0BsaW5rIFBHRVRhc2tJbnN0YW5jZX0gZ2l2ZW4ge0BsaW5rIE1ldGFkYXRhfSBhbmQgYQorICoge0BsaW5rIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb259LgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBQR0VUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBHRVRhc2suY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgTWV0YWRhdGEgbWV0YWRhdGE7CisKKyAgICBwcml2YXRlIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gd2Z0Q29uZmlnOworCisgICAgcHVibGljIFBHRVRhc2soTWV0YWRhdGEgbWV0YWRhdGEsIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gd2Z0Q29uZmlnKSB7CisgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgdGhpcy53ZnRDb25maWcgPSB3ZnRDb25maWc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKFN0cmluZyBwZ2VUYXNrSW5zdGFuY2VDbGFzc3BhdGgpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uIHsKKyAgICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2tJbnN0ID0gY3JlYXRlUEdFVGFza0luc3RhbmNlKAorICAgICAgICAgICAgICAgIHBnZVRhc2tJbnN0YW5jZUNsYXNzcGF0aCwgTE9HR0VSKTsKKyAgICAgICAgcGdlVGFza0luc3QucnVuKHRoaXMubWV0YWRhdGEsIHRoaXMud2Z0Q29uZmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG1ldGFkYXRhRmlsZVBhdGggPSBudWxsLCBjb25maWdQcm9wZXJ0aWVzUGF0aCA9IG51bGw7CisgICAgICAgIFN0cmluZyBwZ2VUYXNrSW5zdGFuY2VDbGFzc3BhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiUEdFVGFzayAtLWluc3RhbmNlQ2xhc3MgPFBHRVRhc2tJbnN0YW5jZT4gIgorICAgICAgICAgICAgICAgICsgIi0tbWV0YWRhdGEgPC9wYXRoL3RvL21ldGFkYXRhL2ZpbGU+ICIKKyAgICAgICAgICAgICAgICArICItLWNvbmZpZyA8L3BhdGgvdG8vdGFzay9jb25maWcvZmlsZT5cbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tbWV0YWRhdGEiKSkgeworICAgICAgICAgICAgICAgIG1ldGFkYXRhRmlsZVBhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWNvbmZpZyIpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnUHJvcGVydGllc1BhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWluc3RhbmNlQ2xhc3MiKSkgeworICAgICAgICAgICAgICAgIHBnZVRhc2tJbnN0YW5jZUNsYXNzcGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhZGF0YUZpbGVQYXRoID09IG51bGwgfHwgY29uZmlnUHJvcGVydGllc1BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgU2VyaWFsaXphYmxlTWV0YWRhdGEgc20gPSBuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEoIlVURi04IiwgZmFsc2UpOworICAgICAgICBzbS5sb2FkTWV0YWRhdGFGcm9tWG1sU3RyZWFtKG5ldyBGaWxlKG1ldGFkYXRhRmlsZVBhdGgpLnRvVVJMKCkKKyAgICAgICAgICAgICAgICAub3BlblN0cmVhbSgpKTsKKyAgICAgICAgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLmxvYWQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUoY29uZmlnUHJvcGVydGllc1BhdGgpLnRvVVJMKCkub3BlblN0cmVhbSgpKTsKKworICAgICAgICBQR0VUYXNrIHRhc2sgPSBuZXcgUEdFVGFzayhzbSwgY29uZmlnKTsKKyAgICAgICAgdGFzay5ydW4ocGdlVGFza0luc3RhbmNlQ2xhc3NwYXRoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvUEdFVGFza0luc3RhbmNlLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL1BHRVRhc2tJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDEwYTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL1BHRVRhc2tJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2U7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5BQ1RJT05fSURTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5BVFRFTVBUX0lOR0VTVF9BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkNSQVdMRVJfQ09ORklHX0ZJTEU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkNSQVdMRVJfQ1JBV0xfRk9SX0RJUlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkNSQVdMRVJfUkVDVVI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkRVTVBfTUVUQURBVEE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkZJTEVfU1RBR0VSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5JTkdFU1RfQ0xJRU5UX1RSQU5TRkVSX1NFUlZJQ0VfRkFDVE9SWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuSU5HRVNUX0ZJTEVfTUFOQUdFUl9VUkw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkxPR19GSUxFTkFNRV9QQVRURVJOOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5NRVRfRklMRV9FWFQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLk5BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLk1JTUVfRVhUUkFDVE9SX1JFUE87CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLlBHRV9DT05GSUdfQlVJTERFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuUEdFX1JVTlRJTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLlBST1BFUlRZX0FEREVSUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuUkVRVUlSRURfTUVUQURBVEE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLldPUktGTE9XX01BTkFHRVJfVVJMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrU3RhdHVzLkNPTkZfRklMRV9CVUlMRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza1N0YXR1cy5DUkFXTElORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza1N0YXR1cy5SVU5OSU5HX1BHRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza1N0YXR1cy5TVEFHSU5HX0lOUFVUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLkdlbmVyaWNQZ2VPYmplY3RGYWN0b3J5LmNyZWF0ZUNvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLkdlbmVyaWNQZ2VPYmplY3RGYWN0b3J5LmNyZWF0ZUZpbGVTdGFnZXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuR2VuZXJpY1BnZU9iamVjdEZhY3RvcnkuY3JlYXRlUGdlQ29uZmlnQnVpbGRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5HZW5lcmljUGdlT2JqZWN0RmFjdG9yeS5jcmVhdGVTY2lQZ2VDb25maWdGaWxlV3JpdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5BdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5Qcm9kdWN0Q3Jhd2xlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLlN0ZFByb2R1Y3RDcmF3bGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuc3RhdHVzLkluZ2VzdFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuU2VyaWFsaXphYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5maWxlbmFtaW5nLlBhdGhVdGlsc05hbWluZ0NvbnZlbnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLkR5bmFtaWNDb25maWdGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5PdXRwdXREaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUmVnRXhwck91dHB1dEZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5YbWxGaWxlUGdlQ29uZmlnQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5zdGFnaW5nLkZpbGVNYW5hZ2VyRmlsZVN0YWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5zdGFnaW5nLkZpbGVTdGFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy5QY3NNZXRGaWxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuU2NpUGdlQ29uZmlnRmlsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLlNjcmlwdEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZXhlYy5FeGVjVXRpbHM7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBSdW5zIGEgQ0FTLXN0eWxlIFByb2R1Y3QgR2VuZXJhdGlvbiBFeGVjdXRpdmUgYmFzZWQgb24gdGhlIFBDUyBXcmFwcGVyCisgKiBBcmNoaXRlY3R1cmUgZnJvbSBtYXR0bWFubiBldCBhbC4gb24gT0NPLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBQR0VUYXNrSW5zdGFuY2UgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKyAgIHByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQR0VUYXNrSW5zdGFuY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgIHByb3RlY3RlZCBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgd207CisgICBwcm90ZWN0ZWQgU3RyaW5nIHdvcmtmbG93SW5zdElkOworICAgcHJvdGVjdGVkIFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhOworICAgcHJvdGVjdGVkIFBnZUNvbmZpZyBwZ2VDb25maWc7CisKKyAgIHByb3RlY3RlZCBQR0VUYXNrSW5zdGFuY2UoKSB7fQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpCisgICAgICAgICB0aHJvd3MgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIC8vIEluaXRpYWxpemUgQ0FTLVBHRS4KKyAgICAgICAgIHBnZU1ldGFkYXRhID0gY3JlYXRlUGdlTWV0YWRhdGEobWV0YWRhdGEsIGNvbmZpZyk7CisgICAgICAgICBwZ2VDb25maWcgPSBjcmVhdGVQZ2VDb25maWcoKTsKKyAgICAgICAgIHJ1blByb3BlcnR5QWRkZXJzKCk7CisgICAgICAgICB3bSA9IGNyZWF0ZVdvcmtmbG93TWFuYWdlckNsaWVudCgpOworICAgICAgICAgd29ya2Zsb3dJbnN0SWQgPSBnZXRXb3JrZmxvd0luc3RhbmNlSWQoKTsKKyAgICAgICAgIGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigpOyAvLyB1c2Ugd29ya2Zsb3cgSUQgc3BlY2lmaWMgbG9nZ2VyIGZyb20gbm93IG9uIAorCisgICAgICAgICAvLyBXcml0ZSBvdXQgUGdlTWV0YWRhdGEuCisgICAgICAgICBkdW1wTWV0YWRhdGFJZlJlcXVlc3RlZCgpOworCisgICAgICAgICAvLyBTZXR1cCB0aGUgUEdFLgorICAgICAgICAgY3JlYXRlRXhlRGlyKCk7CisgICAgICAgICBjcmVhdGVPdXB1dERpcnNJZlJlcXVlc3RlZCgpOworICAgICAgICAgdXBkYXRlU3RhdHVzKENPTkZfRklMRV9CVUlMRC5nZXRXb3JrZmxvd1N0YXR1c05hbWUoKSk7CisgICAgICAgICBjcmVhdGVEeW5hbWljQ29uZmlnRmlsZXMoKTsKKyAgICAgICAgIHVwZGF0ZVN0YXR1cyhTVEFHSU5HX0lOUFVULmdldFdvcmtmbG93U3RhdHVzTmFtZSgpKTsKKyAgICAgICAgIHN0YWdlRmlsZXMoKTsKKworICAgICAgICAgLy8gUnVuIHRoZSBQR0UuCisgICAgICAgICBydW5QZ2UoKTsKKworICAgICAgICAgLy8gSW5nZXN0IHByb2R1Y3RzLgorICAgICAgICAgcnVuSW5nZXN0Q3Jhd2xlcihjcmVhdGVQcm9kdWN0Q3Jhd2xlcigpKTsKKworICAgICAgICAgLy8gQ29tbWl0IGR5bmFtaWMgbWV0YWRhdGEuCisgICAgICAgICB1cGRhdGVEeW5hbWljTWV0YWRhdGEoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIlBHRVRhc2sgRkFJTEVEISEhIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbigiUEdFVGFzayBGQUlMRUQhISEgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKFN0cmluZyBzdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0aW5nIHN0YXR1cyB0byB3b3JrZmxvdyBhcyBbIiArIHN0YXR1cyArICJdIik7CisgICAgICBpZiAoIXdtLnVwZGF0ZVdvcmtmbG93SW5zdGFuY2VTdGF0dXMod29ya2Zsb3dJbnN0SWQsIHN0YXR1cykpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHVwZGF0ZSB3b3JrZmxvdyBzdGF0dXMgOiBjbGllbnQgcmV0dXJuZWQgZmFsc2UiKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIExvZ2dlciBjcmVhdGVMb2dnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIEZpbGUgbG9nRGlyID0gbmV3IEZpbGUocGdlQ29uZmlnLmdldEV4ZURpcigpLCAibG9ncyIpOworICAgICAgaWYgKCEobG9nRGlyLmV4aXN0cygpIHx8IGxvZ0Rpci5ta2RpcnMoKSkpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm1rZGlycyBmb3IgbG9ncyBkaXJlY3RvcnkgcmV0dXJuIGZhbHNlIik7CisgICAgICB9CisKKyAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBHRVRhc2tJbnN0YW5jZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICsgIi4iICsgd29ya2Zsb3dJbnN0SWQpOworICAgICAgRmlsZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBGaWxlSGFuZGxlcigKKyAgICAgICAgICAgIG5ldyBGaWxlKGxvZ0RpciwgY3JlYXRlTG9nRmlsZU5hbWUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgaGFuZGxlci5zZXRFbmNvZGluZygiVVRGLTgiKTsKKyAgICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKG5ldyBTaW1wbGVGb3JtYXR0ZXIoKSk7CisgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKyAgICAgIHJldHVybiBsb2dnZXI7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTG9nRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFN0cmluZyBmaWxlbmFtZVBhdHRlcm4gPSBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShMT0dfRklMRU5BTUVfUEFUVEVSTik7CisgICAgICBpZiAoZmlsZW5hbWVQYXR0ZXJuICE9IG51bGwpIHsKKyAgICAgICAgIHJldHVybiBmaWxlbmFtZVBhdHRlcm47CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKE5BTUUpICsgIi4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgICsgIi5sb2ciOworICAgICAgfQorICAgfQorCisgICBwcm90ZWN0ZWQgUGdlTWV0YWRhdGEgY3JlYXRlUGdlTWV0YWRhdGEoTWV0YWRhdGEgZHluTWV0YWRhdGEsCisgICAgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsb2dnZXIuaW5mbygiQ29udmVydGluZyB3b3JrZmxvdyBjb25maWd1cmF0aW9uIHRvIHN0YXRpYyBtZXRhZGF0YS4uLiIpOworICAgICAgTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgIGZvciAoT2JqZWN0IG9iaktleSA6IGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKKyAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBvYmpLZXk7CisgICAgICAgICBQZ2VUYXNrTWV0S2V5cyBtZXRLZXkgPSBQZ2VUYXNrTWV0S2V5cy5nZXRCeU5hbWUoa2V5KTsKKyAgICAgICAgIGlmIChtZXRLZXkgIT0gbnVsbCAmJiBtZXRLZXkuaXNWZWN0b3IoKSkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgKKyAgICAgICAgICAgICAgICAgIFNwbGl0dGVyLm9uKCIsIikudHJpbVJlc3VsdHMoKQorICAgICAgICAgICAgICAgICAgLm9taXRFbXB0eVN0cmluZ3MoKQorICAgICAgICAgICAgICAgICAgLnNwbGl0KGNvbmZpZy5nZXRQcm9wZXJ0eShrZXkpKSk7CisgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJBZGRpbmcgc3RhdGljIG1ldGFkYXRhOiBrZXkgPSBbIiArIGtleQorICAgICAgICAgICAgICAgICAgKyAiXSB2YWx1ZSA9ICIgKyB2YWx1ZXMpOworICAgICAgICAgICAgc3RhdGljTWV0YWRhdGEuYWRkTWV0YWRhdGEoa2V5LCB2YWx1ZXMpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgiQWRkaW5nIHN0YXRpYyBtZXRhZGF0YToga2V5ID0gWyIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICsgIl0gdmFsdWUgPSBbIiArIHZhbHVlICsgIl0iKTsKKyAgICAgICAgICAgIHN0YXRpY01ldGFkYXRhLmFkZE1ldGFkYXRhKGtleSwgdmFsdWUpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgbG9nZ2VyLmluZm8oIkxvYWRpbmcgd29ya2Zsb3cgY29udGV4dCBtZXRhZGF0YS4uLiIpOworICAgICAgZm9yIChTdHJpbmcga2V5IDogZHluTWV0YWRhdGEuZ2V0QWxsS2V5cygpKSB7CisgICAgICAgICBsb2dnZXIuZmluZXN0KAorICAgICAgICAgICAgICAgIkFkZGluZyBkeW5hbWljIG1ldGFkYXRhOiBrZXkgPSBbIiArIGtleSArICJdIHZhbHVlID0gIgorICAgICAgICAgICAgICAgICAgICAgKyBkeW5NZXRhZGF0YS5nZXRBbGxNZXRhZGF0YShrZXkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgUGdlTWV0YWRhdGEoc3RhdGljTWV0YWRhdGEsIGR5bk1ldGFkYXRhKTsKKyAgIH0KKworICAgcHJvdGVjdGVkIFBnZUNvbmZpZyBjcmVhdGVQZ2VDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJDcmVhdGUgUGdlQ29uZmlnLi4uIik7CisgICAgICBTdHJpbmcgcGdlQ29uZmlnQnVpbGRlckNsYXNzID0gcGdlTWV0YWRhdGEKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YShQR0VfQ09ORklHX0JVSUxERVIpOworICAgICAgaWYgKHBnZUNvbmZpZ0J1aWxkZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcgUGdlQ29uZmlnQnVpbGRlcjogIiArIHBnZUNvbmZpZ0J1aWxkZXJDbGFzcyk7CisgICAgICAgICByZXR1cm4gY3JlYXRlUGdlQ29uZmlnQnVpbGRlcihwZ2VDb25maWdCdWlsZGVyQ2xhc3MsIGxvZ2dlcikKKyAgICAgICAgICAgICAgIC5idWlsZChwZ2VNZXRhZGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbG9nZ2VyLmluZm8oIlVzaW5nIGRlZmF1bHQgUGdlQ29uZmlnQnVpbGRlcjogIgorICAgICAgICAgICAgICAgKyBYbWxGaWxlUGdlQ29uZmlnQnVpbGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgcmV0dXJuIG5ldyBYbWxGaWxlUGdlQ29uZmlnQnVpbGRlcigpLmJ1aWxkKHBnZU1ldGFkYXRhKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIHZvaWQgcnVuUHJvcGVydHlBZGRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBsb2dnZXIuaW5mbygiTG9hZGluZy9SdW5uaW5nIHByb3BlcnR5IGFkZGVycy4uLiIpOworICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BlcnR5QWRkZXJzID0gcGdlTWV0YWRhdGEKKyAgICAgICAgICAgICAgIC5nZXRBbGxNZXRhZGF0YShQUk9QRVJUWV9BRERFUlMpOworICAgICAgICAgaWYgKHByb3BlcnR5QWRkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5QWRkZXIgOiBwcm9wZXJ0eUFkZGVycykgeworICAgICAgICAgICAgICAgcnVuUHJvcGVydHlBZGRlcihsb2FkUHJvcGVydHlBZGRlcihwcm9wZXJ0eUFkZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIHByb3BlcnR5IGFkZGVycyBzcGVjaWZpZWQiKTsKKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5zdGFuY2lhdGUvcnVuIFByb3BlcnR5IEFkZGVycyA6ICIKKyAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwcm90ZWN0ZWQgQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIgbG9hZFByb3BlcnR5QWRkZXIoCisgICAgICAgICBTdHJpbmcgcHJvcGVydHlBZGRlckNsYXNzcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsb2dnZXIuZmluZSgiTG9hZGluZyBwcm9wZXJ0eSBhZGRlcjogIiArIHByb3BlcnR5QWRkZXJDbGFzc3BhdGgpOworICAgICAgcmV0dXJuIGNyZWF0ZUNvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyKHByb3BlcnR5QWRkZXJDbGFzc3BhdGgsIGxvZ2dlcik7CisgICB9CisKKyAgIHByb3RlY3RlZCB2b2lkIHJ1blByb3BlcnR5QWRkZXIoQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIgcHJvcEFkZGVyKQorICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsb2dnZXIuaW5mbygiUnVubmluZyBwcm9wZXJ0eSBhZGRlcjogIgorICAgICAgICAgICAgKyBwcm9wQWRkZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgcHJvcEFkZGVyLmFkZENvbmZpZ1Byb3BlcnRpZXMocGdlTWV0YWRhdGEsCisgICAgICAgICAgICBwZ2VDb25maWcuZ2V0UHJvcGVydHlBZGRlckN1c3RvbUFyZ3MoKSk7CisgICB9CisKKyAgIHByb3RlY3RlZCBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY3JlYXRlV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KCkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgU3RyaW5nIHVybCA9IHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKFdPUktGTE9XX01BTkFHRVJfVVJMKTsKKyAgICAgIGxvZ2dlci5pbmZvKCJDcmVhdGluZyBXb3JrZmxvd01hbmFnZXIgY2xpZW50IGZvciB1cmwgWyIgKyB1cmwgKyAiXSIpOworICAgICAgVmFsaWRhdGUubm90TnVsbCh1cmwsICJNdXN0IHNwZWNpZnkgIiArIFdPUktGTE9XX01BTkFHRVJfVVJMKTsKKyAgICAgIHJldHVybiBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KG5ldyBVUkwodXJsKSk7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V29ya2Zsb3dJbnN0YW5jZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgaW5zdGFuY2VJZCA9IHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKENvcmVNZXRLZXlzLldPUktGTE9XX0lOU1RfSUQpOworICAgICAgbG9nZ2VyLmluZm8oIldvcmtmbG93IGluc3RhbmNlSWQgaXMgWyIgKyBpbnN0YW5jZUlkICsgIl0iKTsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoaW5zdGFuY2VJZCwgIk11c3Qgc3BlY2lmeSAiCisgICAgICAgICAgICArIENvcmVNZXRLZXlzLldPUktGTE9XX0lOU1RfSUQpOworICAgICAgcmV0dXJuIGluc3RhbmNlSWQ7CisgICB9CisKKyAgIHByb3RlY3RlZCB2b2lkIGR1bXBNZXRhZGF0YUlmUmVxdWVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocGdlTWV0YWRhdGEKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YShEVU1QX01FVEFEQVRBKSkpIHsKKyAgICAgICAgIG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShwZ2VNZXRhZGF0YS5hc01ldGFkYXRhKCkpCisgICAgICAgICAgICAgICAud3JpdGVNZXRhZGF0YVRvWG1sU3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgZ2V0RHVtcE1ldGFkYXRhUGF0aCgpKSk7CisgICAgICB9CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RHVtcE1ldGFkYXRhUGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgcmV0dXJuIG5ldyBGaWxlKHBnZUNvbmZpZy5nZXRFeGVEaXIoKSkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLyIKKyAgICAgICAgICAgICsgZ2V0RHVtcE1ldGFkYXRhTmFtZSgpOworICAgfQorCisgICBwcm90ZWN0ZWQgU3RyaW5nIGdldER1bXBNZXRhZGF0YU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiAicGdldGFzay1tZXRhZGF0YS54bWwiOworICAgfQorCisgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeGVEaXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJDcmVhdGluZyBQR0UgZXhlY3V0aW9uIHdvcmtpbmcgZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgKyBwZ2VDb25maWcuZ2V0RXhlRGlyKCkgKyAiXSIpOworICAgICAgRmlsZSBleGVjdXRpb25EaXIgPSBuZXcgRmlsZShwZ2VDb25maWcuZ2V0RXhlRGlyKCkpOworICAgICAgaWYgKCEoZXhlY3V0aW9uRGlyLmV4aXN0cygpIHx8IGV4ZWN1dGlvbkRpci5ta2RpcnMoKSkpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm1rZGlycyByZXR1cm5lZCBmYWxzZSBmb3IgY3JlYXRpbmcgWyIKKyAgICAgICAgICAgICAgICsgcGdlQ29uZmlnLmdldEV4ZURpcigpICsgIl0iKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3VwdXREaXJzSWZSZXF1ZXN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoT3V0cHV0RGlyIG91dHB1dERpciA6IHBnZUNvbmZpZy5nZXRPdXB1dERpcnMoKSkgeworICAgICAgICAgaWYgKG91dHB1dERpci5pc0NyZWF0ZUJlZm9yZUV4ZSgpKSB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiQ3JlYXRpbmcgUEdFIGZpbGUgb3VwdXQgZGlyZWN0b3J5OiBbIgorICAgICAgICAgICAgICAgICAgKyBvdXRwdXREaXIuZ2V0UGF0aCgpICsgIl0iKTsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUob3V0cHV0RGlyLmdldFBhdGgoKSk7CisgICAgICAgICAgICBpZiAoIShkaXIuZXhpc3RzKCkgfHwgZGlyLm1rZGlycygpKSkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibWtkaXIgcmV0dXJuZWQgZmFsc2UgZm9yIGNyZWF0aW5nIFsiCisgICAgICAgICAgICAgICAgICAgICArIG91dHB1dERpci5nZXRQYXRoKCkgKyAiXSIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBwcm90ZWN0ZWQgdm9pZCBzdGFnZUZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBpZiAocGdlQ29uZmlnLmdldEZpbGVTdGFnaW5nSW5mbygpICE9IG51bGwpIHsKKyAgICAgICAgIEZpbGVTdGFnZXIgZmlsZVN0YWdlciA9IGdldEZpbGVTdGFnZXIoKTsKKyAgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyBmaWxlIHN0YWdpbmcuLi4iKTsKKyAgICAgICAgIGZpbGVTdGFnZXIuc3RhZ2VGaWxlcygKKyAgICAgICAgICAgICAgIHBnZUNvbmZpZy5nZXRGaWxlU3RhZ2luZ0luZm8oKSwgcGdlTWV0YWRhdGEsIGxvZ2dlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIGZpbGVzIHRvIHN0YWdlLiIpOworICAgICAgfQorICAgfQorCisgICBwcm90ZWN0ZWQgRmlsZVN0YWdlciBnZXRGaWxlU3RhZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgZmlsZVN0YWdlckNsYXNzID0gcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoRklMRV9TVEFHRVIpOworICAgICAgaWYgKGZpbGVTdGFnZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICBsb2dnZXIuaW5mbygiTG9hZGluZyBGaWxlU3RhZ2VyIFsiICsgZmlsZVN0YWdlckNsYXNzICsgIl0iKTsKKyAgICAgICAgIHJldHVybiBjcmVhdGVGaWxlU3RhZ2VyKGZpbGVTdGFnZXJDbGFzcywgbG9nZ2VyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcgZGVmYXVsdCBGaWxlU3RhZ2VyIFsiCisgICAgICAgICAgICAgICArIEZpbGVNYW5hZ2VyRmlsZVN0YWdlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgKyAiXSIpOworICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTWFuYWdlckZpbGVTdGFnZXIoKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHluYW1pY0NvbmZpZ0ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcgY3JlYXRpb24gb2Ygc2NpIHBnZSBjb25maWcgZmlsZXMuLi4iKTsKKyAgICAgIGZvciAoRHluYW1pY0NvbmZpZ0ZpbGUgZHluYW1pY0NvbmZpZ0ZpbGUgOiBwZ2VDb25maWcKKyAgICAgICAgICAgIC5nZXREeW5hbWljQ29uZmlnRmlsZXMoKSkgeworICAgICAgICAgY3JlYXRlRHluYW1pY0NvbmZpZ0ZpbGUoZHluYW1pY0NvbmZpZ0ZpbGUpOworICAgICAgfQorICAgICAgbG9nZ2VyLmluZm8oIlN1Y2Nlc3NmdWxseSB3cm90ZSBhbGwgc2NpIHBnZSBjb25maWcgZmlsZXMhIik7CisgICB9CisKKyAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUR5bmFtaWNDb25maWdGaWxlKER5bmFtaWNDb25maWdGaWxlIGR5bmFtaWNDb25maWdGaWxlKQorICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGR5bmFtaWNDb25maWdGaWxlLCAiZHluYW1pY0NvbmZpZ0ZpbGUgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgIGxvZ2dlci5maW5lKCJTdGFydGluZyBjcmVhdGlvbiBvZiBzY2kgcGdlIGNvbmZpZyBmaWxlIFsiCisgICAgICAgICAgICArIGR5bmFtaWNDb25maWdGaWxlLmdldEZpbGVQYXRoKCkgKyAiXS4uLiIpOworCisgICAgICAvLyBDcmVhdGUgcGFyZW50IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZShkeW5hbWljQ29uZmlnRmlsZS5nZXRGaWxlUGF0aCgpKQorICAgICAgICAgICAgLmdldFBhcmVudEZpbGUoKTsKKyAgICAgIGlmICghKHBhcmVudERpci5leGlzdHMoKSB8fCBwYXJlbnREaXIubWtkaXJzKCkpKSB7CisgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSB3aGVyZSBzY2kgcGdlIGNvbmZpZyBmaWxlIFsiCisgICAgICAgICAgICAgICArIGR5bmFtaWNDb25maWdGaWxlLmdldEZpbGVQYXRoKCkgKyAiXSB3YXMgdG8gYmUgd3JpdHRlbiIpOworICAgICAgfQorCisgICAgICAvLyBMb2FkIHdyaXRlciBhbmQgd3JpdGUgZmlsZS4KKyAgICAgIGxvZ2dlci5maW5lKCJMb2FkaW5nIHdyaXRlciBjbGFzcyBmb3Igc2NpIHBnZSBjb25maWcgZmlsZSBbIgorICAgICAgICAgICAgKyBkeW5hbWljQ29uZmlnRmlsZS5nZXRGaWxlUGF0aCgpICsgIl0uLi4iKTsKKyAgICAgIFNjaVBnZUNvbmZpZ0ZpbGVXcml0ZXIgd3JpdGVyID0gY3JlYXRlU2NpUGdlQ29uZmlnRmlsZVdyaXRlcigKKyAgICAgICAgICAgIGR5bmFtaWNDb25maWdGaWxlLmdldFdyaXRlckNsYXNzKCksIGxvZ2dlcik7CisgICAgICBsb2dnZXIuZmluZSgiTG9hZGVkIHdyaXRlciBbIiArIHdyaXRlci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKQorICAgICAgICAgICAgKyAiXSBmb3Igc2NpIHBnZSBjb25maWcgZmlsZSBbIiArIGR5bmFtaWNDb25maWdGaWxlLmdldEZpbGVQYXRoKCkKKyAgICAgICAgICAgICsgIl0uLi4iKTsKKyAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIHNjaSBwZ2UgY29uZmlnIGZpbGUgWyIgKyBkeW5hbWljQ29uZmlnRmlsZS5nZXRGaWxlUGF0aCgpCisgICAgICAgICAgICAgICAgICArICJdLi4uIik7CisgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSB3cml0ZXIuY3JlYXRlQ29uZmlnRmlsZShkeW5hbWljQ29uZmlnRmlsZS5nZXRGaWxlUGF0aCgpLAorICAgICAgICAgICAgcGdlTWV0YWRhdGEuYXNNZXRhZGF0YSgpLCBkeW5hbWljQ29uZmlnRmlsZS5nZXRBcmdzKCkpOworICAgICAgaWYgKCFjb25maWdGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJXcml0ZXIgZmFpbGVkIHRvIGNyZWF0ZSBjb25maWcgZmlsZSBbIgorICAgICAgICAgICAgICAgKyBjb25maWdGaWxlICsgIl0sIGV4aXN0cyByZXR1cm5lZCBmYWxzZSIpOworICAgICAgfQorICAgfQorCisgICBwcm90ZWN0ZWQgU2NyaXB0RmlsZSBidWlsZFBnZVJ1blNjcmlwdCgpIHsKKyAgICAgIGxvZ2dlci5maW5lKCJDcmVhdGluZyBQR0UgcnVuIHNjcmlwdCBmb3Igc2hlbGwgWyIgKyBwZ2VDb25maWcuZ2V0U2hlbGxUeXBlKCkKKyAgICAgICAgICAgICAgICAgICsgIl0gd2l0aCBjb250ZW50cyAiICsgcGdlQ29uZmlnLmdldEV4ZUNtZHMoKSk7CisgICAgICBTY3JpcHRGaWxlIHNmID0gbmV3IFNjcmlwdEZpbGUocGdlQ29uZmlnLmdldFNoZWxsVHlwZSgpKTsKKyAgICAgIHNmLnNldENvbW1hbmRzKHBnZUNvbmZpZy5nZXRFeGVDbWRzKCkpOworICAgICAgcmV0dXJuIHNmOworICAgfQorCisgICBwcm90ZWN0ZWQgRmlsZSBnZXRTY3JpcHRQYXRoKCkgeworICAgICAgRmlsZSBzY3JpcHQgPSBuZXcgRmlsZShwZ2VDb25maWcuZ2V0RXhlRGlyKCksIGdldFBnZVNjcmlwdE5hbWUoKSk7CisgICAgICBsb2dnZXIuZmluZSgiU2NyaXB0IGZpbGUgd2l0aCBiZSB3cml0dGVuIHRvIFsiICsgc2NyaXB0ICsgIl0iKTsKKyAgICAgIHJldHVybiBzY3JpcHQ7CisgICB9CisKKyAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGdlU2NyaXB0TmFtZSgpIHsKKyAgICAgIFN0cmluZyBwZ2VTY3JpcHROYW1lID0gInNjaVBnZUV4ZVNjcmlwdF8iICsgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoTkFNRSk7CisgICAgICBsb2dnZXIuZmluZSgiR2VuZXJhdGVkIHNjcmlwdCBmaWxlIG5hbWUgWyIgKyBwZ2VTY3JpcHROYW1lICsgIl0iKTsKKyAgICAgIHJldHVybiBwZ2VTY3JpcHROYW1lOworICAgfQorCisgICBwcm90ZWN0ZWQgdm9pZCBydW5QZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFNjcmlwdEZpbGUgc2YgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICBsb2dnZXIuaW5mbygiUEdFIHN0YXJ0IHRpbWUgWyIgKyBuZXcgRGF0ZShzdGFydFRpbWUpICsgIl0iKTsKKworICAgICAgICAgLy8gY3JlYXRlIHNjcmlwdCB0byBydW4KKyAgICAgICAgIHNmID0gYnVpbGRQZ2VSdW5TY3JpcHQoKTsKKyAgICAgICAgIHNmLndyaXRlU2NyaXB0RmlsZShnZXRTY3JpcHRQYXRoKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAvLyBydW4gc2NyaXB0IGFuZCBldmFsdWF0ZSB3aGV0aGVyIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgICAgICAgdXBkYXRlU3RhdHVzKFJVTk5JTkdfUEdFLmdldFdvcmtmbG93U3RhdHVzTmFtZSgpKTsKKyAgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyBleGVjdXRpb24gb2YgUEdFLi4uIik7CisgICAgICAgICBpZiAoIXdhc1BnZVN1Y2Nlc3NmdWwoRXhlY1V0aWxzLmNhbGxQcm9ncmFtKAorICAgICAgICAgICAgICAgcGdlQ29uZmlnLmdldFNoZWxsVHlwZSgpICsgIiAiICsgZ2V0U2NyaXB0UGF0aCgpLCBsb2dnZXIsCisgICAgICAgICAgICAgICBuZXcgRmlsZShwZ2VDb25maWcuZ2V0RXhlRGlyKCkpLmdldEFic29sdXRlRmlsZSgpKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQZ2UgZGlkbid0IGZpbmlzaCBzdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygKKyAgICAgICAgICAgICAgICAgICJTdWNjZXNzZnVsbHkgY29tcGxldGVkIHJ1bm5pbmc6ICciICsgc2YuZ2V0Q29tbWFuZHMoKSArICInIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgbG9nZ2VyLmluZm8oIlBHRSBlbmQgdGltZSBbIiArIG5ldyBEYXRlKHN0YXJ0VGltZSkgKyAiXSIpOworCisgICAgICAgICBsb25nIHJ1blRpbWUgPSBlbmRUaW1lIC0gc3RhcnRUaW1lOworICAgICAgICAgbG9nZ2VyLmluZm8oIlBHRSBydW50aW1lIGluIG1pbGxpcyBbIiArIHJ1blRpbWUgKyAiXSIpOworCisgICAgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoUEdFX1JVTlRJTUUsIExvbmcudG9TdHJpbmcocnVuVGltZSkpOworCisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoZW4gZXhlY3V0aW5nIFBHRSBjb21tYW5kcyAnIgorICAgICAgICAgICAgICAgKyAoc2YgIT0gbnVsbCA/IHNmLmdldENvbW1hbmRzKCkgOiAiTlVMTCIpICsgIicgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIGJvb2xlYW4gd2FzUGdlU3VjY2Vzc2Z1bChpbnQgcmV0dXJuQ29kZSkgeworICAgICAgcmV0dXJuIHJldHVybkNvZGUgPT0gMDsKKyAgIH0KKyAgIAorICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc091dHB1dCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgZm9yIChmaW5hbCBPdXRwdXREaXIgb3V0cHV0RGlyIDogdGhpcy5wZ2VDb25maWcuZ2V0T3VwdXREaXJzKCkpIHsKKyAgICAgICAgIEZpbGVbXSBjcmVhdGVkRmlsZXMgPSBuZXcgRmlsZShvdXRwdXREaXIuZ2V0UGF0aCgpKS5saXN0RmlsZXMoKTsKKyAgICAgICAgIGZvciAoRmlsZSBjcmVhdGVkRmlsZSA6IGNyZWF0ZWRGaWxlcykgeworICAgICAgICAgICAgIE1ldGFkYXRhIG91dHB1dE1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgICAgICAgZm9yIChSZWdFeHByT3V0cHV0RmlsZXMgcmVnRXhwckZpbGVzIDogb3V0cHV0RGlyCisgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVnRXhwck91dHB1dEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhyZWdFeHByRmlsZXMuZ2V0UmVnRXhwKCksIGNyZWF0ZWRGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgUGNzTWV0RmlsZVdyaXRlciB3cml0ZXIgPSAoUGNzTWV0RmlsZVdyaXRlcikgQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKHJlZ0V4cHJGaWxlcy5nZXRDb252ZXJ0ZXJDbGFzcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHRoaXMuZ2V0TWV0YWRhdGFGb3JGaWxlKAorICAgICAgICAgICAgICAgICAocmVnRXhwckZpbGVzLmdldFJlbmFtaW5nQ29udigpICE9IG51bGwpIAorICAgICAgICAgICAgICAgPyBjcmVhdGVkRmlsZSA9IHRoaXMucmVuYW1lRmlsZShjcmVhdGVkRmlsZSwgcmVnRXhwckZpbGVzLmdldFJlbmFtaW5nQ29udigpKQorICAgICAgICAgICAgICAgOiBjcmVhdGVkRmlsZSwgd3JpdGVyLCByZWdFeHByRmlsZXMuZ2V0QXJncygpKSk7CisgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5zZXZlcmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhZGF0YSBmaWxlIGZvciAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNyZWF0ZWRGaWxlICsgIicgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChvdXRwdXRNZXRhZGF0YS5nZXRBbGxLZXlzKCkuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgICAgIHRoaXMud3JpdGVGcm9tTWV0YWRhdGEob3V0cHV0TWV0YWRhdGEsIGNyZWF0ZWRGaWxlLmdldEFic29sdXRlUGF0aCgpIAorICAgICAgICAgICAgICAgICAgICsgIi4iICsgdGhpcy5wZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShNRVRfRklMRV9FWFQpKTsKKyAgICAgICAgIH0KKyAgICAgfQorIH0KKworCXByb3RlY3RlZCBGaWxlIHJlbmFtZUZpbGUoRmlsZSBmaWxlLCBQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uIHJlbmFtaW5nQ29udikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlNZXRhZGF0YSBjdXJNZXRhZGF0YSA9IHRoaXMucGdlTWV0YWRhdGEuYXNNZXRhZGF0YSgpOworCQljdXJNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEocmVuYW1pbmdDb252LmdldFRtcFJlcGxhY2VNZXQoKSk7CisJCXJldHVybiByZW5hbWluZ0NvbnYucmVuYW1lKGZpbGUsIGN1ck1ldGFkYXRhKTsKKwl9CisKKwlwcm90ZWN0ZWQgTWV0YWRhdGEgZ2V0TWV0YWRhdGFGb3JGaWxlKEZpbGUgc2NpUGdlQ3JlYXRlZERhdGFGaWxlLAorCQkJUGNzTWV0RmlsZVdyaXRlciB3cml0ZXIsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gd3JpdGVyLmdldE1ldGFkYXRhRm9yRmlsZShzY2lQZ2VDcmVhdGVkRGF0YUZpbGUsCisJCQkJdGhpcy5wZ2VNZXRhZGF0YSwgYXJncyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgd3JpdGVGcm9tTWV0YWRhdGEoTWV0YWRhdGEgbWV0YWRhdGEsIFN0cmluZyB0b01ldEZpbGVQYXRoKQorCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQluZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEobWV0YWRhdGEsICJVVEYtOCIsIGZhbHNlKQorCQkJCS53cml0ZU1ldGFkYXRhVG9YbWxTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odG9NZXRGaWxlUGF0aCkpOworCX0KKworCXByb3RlY3RlZCBQcm9kdWN0Q3Jhd2xlciBjcmVhdGVQcm9kdWN0Q3Jhd2xlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAvKiBjcmVhdGUgYSBQcm9kdWN0Q3Jhd2xlciBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgb3V0cHV0IGRpciBzcGVjaWZpZXMgYSBNSU1FX0VYVFJBQ1RPUl9SRVBPICovCisgICAgICBsb2dnZXIuaW5mbygiQ29uZmlndXJpbmcgUHJvZHVjdENyYXdsZXIuLi4iKTsKKyAgICAgIFByb2R1Y3RDcmF3bGVyIGNyYXdsZXIgPSBudWxsOworICAgICAgaWYgKHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKE1JTUVfRVhUUkFDVE9SX1JFUE8pICE9IG51bGwgJiYgCisgICAgCQkgICFwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShNSU1FX0VYVFJBQ1RPUl9SRVBPKS5lcXVhbHMoIiIpKXsKKyAgICAgICAgICBjcmF3bGVyID0gbmV3IEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlcigpOworICAgICAgICAgICgoQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyKWNyYXdsZXIpLgorICAgICAgICAgICAgc2V0TWltZUV4dHJhY3RvclJlcG8ocGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoTUlNRV9FWFRSQUNUT1JfUkVQTykpOyAgICAJICAKKyAgICAgIH0KKyAgICAgIGVsc2V7CisgICAgCSAgY3Jhd2xlciA9IG5ldyBTdGRQcm9kdWN0Q3Jhd2xlcigpOworICAgICAgfQorCisgICAgICBjcmF3bGVyLnNldENsaWVudFRyYW5zZmVyZXIocGdlTWV0YWRhdGEKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YShJTkdFU1RfQ0xJRU5UX1RSQU5TRkVSX1NFUlZJQ0VfRkFDVE9SWSkpOworICAgICAgY3Jhd2xlci5zZXRGaWxlbWdyVXJsKHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKElOR0VTVF9GSUxFX01BTkFHRVJfVVJMKSk7CisgICAgICBTdHJpbmcgY3Jhd2xlckNvbmZpZ0ZpbGUgPSBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShDUkFXTEVSX0NPTkZJR19GSUxFKTsKKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGNyYXdsZXJDb25maWdGaWxlKSkgeworICAgICAgICAgY3Jhd2xlci5zZXRBcHBsaWNhdGlvbkNvbnRleHQoCisgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbVhtbEFwcGxpY2F0aW9uQ29udGV4dChjcmF3bGVyQ29uZmlnRmlsZSkpOworICAgICAgICAgTGlzdDxTdHJpbmc+IGFjdGlvbklkcyA9IHBnZU1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKEFDVElPTl9JRFMpOworICAgICAgICAgaWYgKGFjdGlvbklkcyAhPSBudWxsKSB7CisgICAgICAgICAgICBjcmF3bGVyLnNldEFjdGlvbklkcyhhY3Rpb25JZHMpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgY3Jhd2xlci5zZXRSZXF1aXJlZE1ldGFkYXRhKHBnZU1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKFJFUVVJUkVEX01FVEFEQVRBKSk7CisgICAgICBjcmF3bGVyLnNldENyYXdsRm9yRGlycyhCb29sZWFuLnBhcnNlQm9vbGVhbihwZ2VNZXRhZGF0YQorICAgICAgICAgICAgLmdldE1ldGFkYXRhKENSQVdMRVJfQ1JBV0xfRk9SX0RJUlMpKSk7CisgICAgICBjcmF3bGVyLnNldE5vUmVjdXIoIUJvb2xlYW4ucGFyc2VCb29sZWFuKAorICAgICAgICAgICAgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoQ1JBV0xFUl9SRUNVUikpKTsKKyAgICAgIGxvZ2dlci5maW5lKAorICAgICAgICAgICAgIlBhc3NpbmcgV29ya2Zsb3cgTWV0YWRhdGEgdG8gQ0FTLUNyYXdsZXIgYXMgZ2xvYmFsIG1ldGFkYXRhIC4gLiAuIik7CisgICAgICBjcmF3bGVyLnNldEdsb2JhbE1ldGFkYXRhKHBnZU1ldGFkYXRhLmFzTWV0YWRhdGEoUGdlTWV0YWRhdGEuVHlwZS5EWU5BTUlDKSk7CisgICAgICBsb2dnZXIuZmluZSgiQ3JlYXRlZCBQcm9kdWN0Q3Jhd2xlciBbIgorICAgICAgICAgICAgKyBjcmF3bGVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIl0iKTsKKyAgICAgIHJldHVybiBjcmF3bGVyOworICAgfQorCisgICBwcm90ZWN0ZWQgdm9pZCBydW5Jbmdlc3RDcmF3bGVyKFByb2R1Y3RDcmF3bGVyIGNyYXdsZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gY3JlYXRlIE1ldGFkYXRhIGZpbGVzCisJICAgaWYgKGNyYXdsZXIgaW5zdGFuY2VvZiBTdGRQcm9kdWN0Q3Jhd2xlcil7CisJCSAgIHRoaXMucHJvY2Vzc091dHB1dCgpOworCSAgIH0KKwkgICAKKwkgICAvLyBEZXRlcm1pbmUgZGlyZWN0b3JpZXMgdG8gY3Jhd2wuCisgICAgICBMaXN0PEZpbGU+IGNyYXdsRGlycyA9IG5ldyBMaW5rZWRMaXN0PEZpbGU+KCk7CisgICAgICBmb3IgKE91dHB1dERpciBvdXRwdXREaXIgOiBwZ2VDb25maWcuZ2V0T3VwdXREaXJzKCkpIHsKKyAgICAgICAgIGNyYXdsRGlycy5hZGQobmV3IEZpbGUob3V0cHV0RGlyLmdldFBhdGgoKSkpOworICAgICAgfQorCisgICAgICAvLyBTdGFydCBjcmF3bGluLi4uCisgICAgICB1cGRhdGVTdGF0dXMoQ1JBV0xJTkcuZ2V0V29ya2Zsb3dTdGF0dXNOYW1lKCkpOworICAgICAgYm9vbGVhbiBhdHRlbXB0SW5nZXN0QWxsID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocGdlTWV0YWRhdGEKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YShBVFRFTVBUX0lOR0VTVF9BTEwpKTsKKyAgICAgIGZvciAoRmlsZSBjcmF3bERpciA6IGNyYXdsRGlycykgeworICAgICAgICAgbG9nZ2VyLmluZm8oIkNyYXdsaW5nIGZvciBwcm9kdWN0cyBpbiBbIiArIGNyYXdsRGlyICsgIl0iKTsKKyAgICAgICAgIGNyYXdsZXIuY3Jhd2woY3Jhd2xEaXIpOworICAgICAgICAgaWYgKCFhdHRlbXB0SW5nZXN0QWxsKSB7CisgICAgICAgICAgICB2ZXJpZnlJbmdlc3RzKGNyYXdsZXIpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGF0dGVtcHRJbmdlc3RBbGwpIHsKKyAgICAgICAgIHZlcmlmeUluZ2VzdHMoY3Jhd2xlcik7CisgICAgICB9CisgICB9CisKKyAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUluZ2VzdHMoUHJvZHVjdENyYXdsZXIgY3Jhd2xlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsb2dnZXIuaW5mbygiVmVyaWZ5aW5nIGluZ2VzdHMgc3VjY2Vzc2Z1bC4uLiIpOworICAgICAgYm9vbGVhbiBpbmdlc3RzU3VjY2VzcyA9IHRydWU7CisgICAgICBTdHJpbmcgZXhjZXB0aW9uTXNnID0gIiI7CisgICAgICBmb3IgKEluZ2VzdFN0YXR1cyBzdGF0dXMgOiBjcmF3bGVyLmdldEluZ2VzdFN0YXR1cygpKSB7CisgICAgICAgICBpZiAoc3RhdHVzLmdldFJlc3VsdCgpLmVxdWFscyhJbmdlc3RTdGF0dXMuUmVzdWx0LkZBSUxVUkUpKSB7CisgICAgICAgICAgICBleGNlcHRpb25Nc2cgKz0gKGV4Y2VwdGlvbk1zZy5lcXVhbHMoIiIpID8gIiIgOiAiIDogIikKKyAgICAgICAgICAgICAgICAgICsgIkZhaWxlZCB0byBpbmdlc3QgcHJvZHVjdCBbZmlsZT0nIgorICAgICAgICAgICAgICAgICAgKyBzdGF0dXMuZ2V0UHJvZHVjdCgpLmdldEFic29sdXRlUGF0aCgpICsgIicscmVzdWx0PSciCisgICAgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRSZXN1bHQoKSArICInLG1zZz0nIiArIHN0YXR1cy5nZXRNZXNzYWdlKCkgKyAiJ10iOworICAgICAgICAgICAgaW5nZXN0c1N1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXR1cy5nZXRSZXN1bHQoKS5lcXVhbHMoSW5nZXN0U3RhdHVzLlJlc3VsdC5TVUNDRVNTKSkgeworICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlByb2R1Y3Qgd2FzIG5vdCBpbmdlc3RlZCBbZmlsZT0nIgorICAgICAgICAgICAgICAgICAgKyBzdGF0dXMuZ2V0UHJvZHVjdCgpLmdldEFic29sdXRlUGF0aCgpICsgIicscmVzdWx0PSciCisgICAgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRSZXN1bHQoKSArICInLG1zZz0nIiArIHN0YXR1cy5nZXRNZXNzYWdlKCkgKyAiJ10iKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghaW5nZXN0c1N1Y2Nlc3MpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZXhjZXB0aW9uTXNnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBsb2dnZXIuaW5mbygiSW5nZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwiKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRHluYW1pY01ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBwZ2VNZXRhZGF0YS5jb21taXRNYXJrZWREeW5hbWljTWV0YWRhdGFLZXlzKCk7CisgICAgICB3bS51cGRhdGVNZXRhZGF0YUZvcldvcmtmbG93KHdvcmtmbG93SW5zdElkLAorICAgICAgICAgICAgcGdlTWV0YWRhdGEuYXNNZXRhZGF0YShQZ2VNZXRhZGF0YS5UeXBlLkRZTkFNSUMpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvU3RkUEdFVGFza0luc3RhbmNlLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL1N0ZFBHRVRhc2tJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjQwMzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL1N0ZFBHRVRhc2tJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2U7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBQR0VUYXNrSW5zdGFuY2V9LiBEb2Vzbid0IG92ZXJyaWRlCisgKiBhbnkgb2YgdGhlIGRlZmF1bHQgZnVuY3Rpb25hbGl0eQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFN0ZFBHRVRhc2tJbnN0YW5jZSBleHRlbmRzIFBHRVRhc2tJbnN0YW5jZSB7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL1dpblBHRVRhc2tJbnN0YW5jZS5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9XaW5QR0VUYXNrSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY0YmViCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9XaW5QR0VUYXNrSW5zdGFuY2UuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkN5Z3dpblNjcmlwdEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLlNjcmlwdEZpbGU7CisKKy8qKgorICogUnVucyBhIENBUy1zdHlsZSBQcm9kdWN0IEdlbmVyYXRpb24gRXhlY3V0aXZlIGJhc2VkIG9uIHRoZSBQQ1MgV3JhcHBlcgorICogQXJjaGl0ZWN0dXJlIGZyb20gbWF0dG1hbm4gZXQgYWwuIG9uIE9DTyBzcGVjaWZpY2FsbHkgb24gYSBXaW5kb3dzIEN5Z3dpbi1ydW5uaW5nCisgKiBtYWNoaW5lCisgKgorICogQGF1dGhvciByaXZlcm1hIChSaXNoaSBWZXJtYSkKKyAqLworcHVibGljIGNsYXNzIFdpblBHRVRhc2tJbnN0YW5jZSBleHRlbmRzIFBHRVRhc2tJbnN0YW5jZSB7CisKKwkgIC8qKgorCSAgICogT3ZlcnJpZGUgYnVpbGRQZ2VSdW5TY3JpcHQgbWV0aG9kIHRvIGNhbGwgYSB3aW5kb3dzIHNwZWNpZmljIHNjcmlwdCBmaWxlCisJICAgKi8KKwkgIEBPdmVycmlkZQorCSAgcHJvdGVjdGVkIFNjcmlwdEZpbGUgYnVpbGRQZ2VSdW5TY3JpcHQoKSB7CisJCSAgQ3lnd2luU2NyaXB0RmlsZSBzZiA9IG5ldyBDeWd3aW5TY3JpcHRGaWxlKHRoaXMucGdlQ29uZmlnLmdldFNoZWxsVHlwZSgpKTsKKwkgICAgICBzZi5zZXRDb21tYW5kcyh0aGlzLnBnZUNvbmZpZy5nZXRFeGVDbWRzKCkpOworCSAgIAorCSAgICAgIHJldHVybiBzZjsKKwkgIH0JCisJCit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL2NvbmZpZy9EeW5hbWljQ29uZmlnRmlsZS5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvRHluYW1pY0NvbmZpZ0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGEyZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvRHluYW1pY0NvbmZpZ0ZpbGUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZzsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgZHluYW1pYyByZXByZXNlbnRhdGlvbiBvZiBhIFNjaVBnZUNvbmZpZ0ZpbGUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljQ29uZmlnRmlsZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlUGF0aCwgd3JpdGVyQ2xhc3M7CisKKyAgICBwcml2YXRlIE9iamVjdFtdIGFyZ3M7CisKKyAgICBwdWJsaWMgRHluYW1pY0NvbmZpZ0ZpbGUoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgd3JpdGVyQ2xhc3MsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoOworICAgICAgICB0aGlzLndyaXRlckNsYXNzID0gd3JpdGVyQ2xhc3M7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsZVBhdGgoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgICAgIHRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgeworICAgICAgICByZXR1cm4gdGhpcy5maWxlUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZXJDbGFzcyhTdHJpbmcgd3JpdGVyQ2xhc3MpIHsKKyAgICAgICAgdGhpcy53cml0ZXJDbGFzcyA9IHdyaXRlckNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLndyaXRlckNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3MoT2JqZWN0W10gYXJncykgeworICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcmdzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcmdzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvRmlsZVN0YWdpbmdJbmZvLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL2NvbmZpZy9GaWxlU3RhZ2luZ0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNmMGJjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvRmlsZVN0YWdpbmdJbmZvLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZpbGVzIHNob3VsZCBiZSBzdGFnZWQgYW5kIHdoZXJlLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgRmlsZVN0YWdpbmdJbmZvIHsKKworICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RhZ2luZ0RpcjsKKyAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmb3JjZVN0YWdpbmc7CisgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IGZpbGVQYXRoczsKKyAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gcHJvZHVjdElkczsKKworICAgcHVibGljIEZpbGVTdGFnaW5nSW5mbyhTdHJpbmcgc3RhZ2luZ0RpcikgeworICAgICAgdGhpcyhzdGFnaW5nRGlyLCBmYWxzZSk7CisgICB9CisKKyAgIHB1YmxpYyBGaWxlU3RhZ2luZ0luZm8oU3RyaW5nIHN0YWdpbmdEaXIsIGJvb2xlYW4gZm9yY2VTdGFnaW5nKSB7CisgICAgICB0aGlzLnN0YWdpbmdEaXIgPSBzdGFnaW5nRGlyOworICAgICAgdGhpcy5mb3JjZVN0YWdpbmcgPSBmb3JjZVN0YWdpbmc7CisgICAgICBmaWxlUGF0aHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIHByb2R1Y3RJZHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgYWRkRmlsZVBhdGgoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgICBmaWxlUGF0aHMuYWRkKGZpbGVQYXRoKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgYWRkRmlsZVBhdGhzKExpc3Q8U3RyaW5nPiBmaWxlUGF0aHMpIHsKKyAgICAgIHRoaXMuZmlsZVBhdGhzLmFkZEFsbChmaWxlUGF0aHMpOworICAgfQorCisgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEZpbGVQYXRocygpIHsKKyAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QoZmlsZVBhdGhzKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdElkKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgIHByb2R1Y3RJZHMuYWRkKHByb2R1Y3RJZCk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIGFkZFByb2R1Y3RJZHMoTGlzdDxTdHJpbmc+IHByb2R1Y3RJZHMpIHsKKyAgICAgIHByb2R1Y3RJZHMuYWRkQWxsKHByb2R1Y3RJZHMpOworICAgfQorCisgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFByb2R1Y3RJZHMoKSB7CisgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KHByb2R1Y3RJZHMpOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldFN0YWdpbmdEaXIoKSB7CisgICAgICByZXR1cm4gc3RhZ2luZ0RpcjsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gaXNGb3JjZVN0YWdpbmcoKSB7CisgICAgICByZXR1cm4gZm9yY2VTdGFnaW5nOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvT3V0cHV0RGlyLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL2NvbmZpZy9PdXRwdXREaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdlZDRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvT3V0cHV0RGlyLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLyoqCisgKiBBbiBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIFBHRSB3aWxsIGNyZWF0ZSBmaWxlcy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRwdXREaXIgeworCisgICBwcml2YXRlIFN0cmluZyBwYXRoOworICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUJlZm9yZUV4ZTsKKyAgIHByaXZhdGUgTGlzdDxSZWdFeHByT3V0cHV0RmlsZXM+IHJlZ0V4cHJPdXRwdXRGaWxlc0xpc3Q7CisKKyAgIHB1YmxpYyBPdXRwdXREaXIoKSB7CisJICB0aGlzKG51bGwsIGZhbHNlKTsKKyAgIH0KKworICAgcHVibGljIE91dHB1dERpcihTdHJpbmcgcGF0aCwgYm9vbGVhbiBjcmVhdGVCZWZvcmVFeGUpIHsKKyAgICAgIHNldFBhdGgocGF0aCk7CisgICAgICBzZXRDcmVhdGVCZWZvcmVFeGUoY3JlYXRlQmVmb3JlRXhlKTsKKyAgICAgIHRoaXMucmVnRXhwck91dHB1dEZpbGVzTGlzdCA9IG5ldyBWZWN0b3I8UmVnRXhwck91dHB1dEZpbGVzPigpOworCisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwocGF0aCwgInBhdGggY2Fubm90IGJlIG51bGwiKTsKKyAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICB9CisgICAgICAKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgIHJldHVybiBwYXRoOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVCZWZvcmVFeGUoYm9vbGVhbiBjcmVhdGVCZWZvcmVFeGUpIHsKKyAgICAgIHRoaXMuY3JlYXRlQmVmb3JlRXhlID0gY3JlYXRlQmVmb3JlRXhlOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBpc0NyZWF0ZUJlZm9yZUV4ZSgpIHsKKyAgICAgIHJldHVybiBjcmVhdGVCZWZvcmVFeGU7CisgICB9CisgICAKKyAgIHB1YmxpYyB2b2lkIGFkZFJlZ0V4cHJPdXRwdXRGaWxlcyhSZWdFeHByT3V0cHV0RmlsZXMgcmVnRXhwck91dHB1dEZpbGVzKSB7CisgICAgIHRoaXMucmVnRXhwck91dHB1dEZpbGVzTGlzdC5hZGQocmVnRXhwck91dHB1dEZpbGVzKTsKKyAgIH0gCisKKyAgIHB1YmxpYyBMaXN0PFJlZ0V4cHJPdXRwdXRGaWxlcz4gZ2V0UmVnRXhwck91dHB1dEZpbGVzKCkgeworICAgICByZXR1cm4gdGhpcy5yZWdFeHByT3V0cHV0RmlsZXNMaXN0OworIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvUGdlQ29uZmlnLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL2NvbmZpZy9QZ2VDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE5N2YyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvUGdlQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKiogCisgKiBDb25maWd1cmF0aW9uIGZpbGUgZm9yIENBUy1QR0UuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBQZ2VDb25maWcgeworCisgICAgcHJpdmF0ZSBMaXN0PER5bmFtaWNDb25maWdGaWxlPiBkeW5hbWljQ29uZmlnRmlsZXM7CisgICAgcHJpdmF0ZSBMaXN0PE91dHB1dERpcj4gb3V0cHV0RGlyczsKKyAgICBwcml2YXRlIE9iamVjdFtdIHByb3BlcnR5QWRkZXJDdXN0b21BcmdzOworICAgIHByaXZhdGUgU3RyaW5nIGV4ZURpcjsKKyAgICBwcml2YXRlIFN0cmluZyBzaGVsbFR5cGU7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhlQ21kczsKKyAgICBwcml2YXRlIEZpbGVTdGFnaW5nSW5mbyBmaWxlU3RhZ2luZ0luZm87CisKKyAgICBwdWJsaWMgUGdlQ29uZmlnKCkgeworICAgICAgICBzaGVsbFR5cGUgPSAic2giOworICAgICAgICBvdXRwdXREaXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGR5bmFtaWNDb25maWdGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBleGVDbWRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRHluYW1pY0NvbmZpZ0ZpbGUoRHluYW1pY0NvbmZpZ0ZpbGUgZHluYW1pY0NvbmZpZ0ZpbGUpIHsKKyAgICAgICAgZHluYW1pY0NvbmZpZ0ZpbGVzLmFkZChkeW5hbWljQ29uZmlnRmlsZSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RHluYW1pY0NvbmZpZ0ZpbGU+IGdldER5bmFtaWNDb25maWdGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIGR5bmFtaWNDb25maWdGaWxlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPdXB1dERpckFuZEV4cHJlc3Npb25zKE91dHB1dERpciBvdXRwdXREaXIpIHsKKyAgICAgICAgb3V0cHV0RGlycy5hZGQob3V0cHV0RGlyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxPdXRwdXREaXI+IGdldE91cHV0RGlycygpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXhlRGlyKFN0cmluZyBleGVEaXIpIHsKKyAgICAgICAgdGhpcy5leGVEaXIgPSBleGVEaXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFeGVEaXIoKSB7CisgICAgICAgIHJldHVybiBleGVEaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hlbGxUeXBlKFN0cmluZyBzaGVsbFR5cGUpIHsKKyAgICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoc2hlbGxUeXBlKSkgeworICAgICAgICAgICAgdGhpcy5zaGVsbFR5cGUgPSBzaGVsbFR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNoZWxsVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHNoZWxsVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVDbWRzKExpc3Q8U3RyaW5nPiBleGVDbWRzKSB7CisgICAgICAgIHRoaXMuZXhlQ21kcyA9IGV4ZUNtZHM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGVDbWRzKCkgeworICAgICAgICByZXR1cm4gZXhlQ21kczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFkZGVyQ3VzdG9tQXJncyhPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIHByb3BlcnR5QWRkZXJDdXN0b21BcmdzID0gYXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UHJvcGVydHlBZGRlckN1c3RvbUFyZ3MoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eUFkZGVyQ3VzdG9tQXJncyAhPSBudWxsID8gcHJvcGVydHlBZGRlckN1c3RvbUFyZ3MKKyAgICAgICAgICAgICAgICA6IG5ldyBPYmplY3RbMF07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsZVN0YWdpbmdJbmZvKEZpbGVTdGFnaW5nSW5mbyBmaWxlU3RhZ2luZ0luZm8pIHsKKyAgICAgICB0aGlzLmZpbGVTdGFnaW5nSW5mbyA9IGZpbGVTdGFnaW5nSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZVN0YWdpbmdJbmZvIGdldEZpbGVTdGFnaW5nSW5mbygpIHsKKyAgICAgICByZXR1cm4gZmlsZVN0YWdpbmdJbmZvOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1BnZUNvbmZpZ0J1aWxkZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1BnZUNvbmZpZ0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmRlMTUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvUGdlQ29uZmlnQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlTWV0YWRhdGE7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBidWlsZGluZyBhIHtAbGluayBQZ2VDb25maWd9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBnZUNvbmZpZ0J1aWxkZXIgeworCisgICAgcHVibGljIFBnZUNvbmZpZyBidWlsZChQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1BnZUNvbmZpZ01ldEtleXMuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1BnZUNvbmZpZ01ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkxMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvUGdlQ29uZmlnTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWc7CisKKy8qKgorICogTWV0IEtleXMgdXNlZCB3aGVuIHJlYWRpbmcgYSB7QGxpbmsgUGdlQ29uZmlnfSBYTUwgZmlsZS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBnZUNvbmZpZ01ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1RBRyA9ICJpbXBvcnQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFIgPSAibmFtZXNwYWNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfQVRUUiA9ICJmaWxlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBREFUQV9UQUcgPSAiY3VzdG9tTWV0YWRhdGEiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfVEFHID0gIm1ldGFkYXRhIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVJFRl9BVFRSID0gImtleS1yZWYiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dFTl9BVFRSID0gImtleS1nZW4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FUVFIgPSAia2V5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9BVFRSID0gInZhbCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfUkVQTEFDRV9BVFRSID0gImVudlJlcGxhY2UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX1JFUExBQ0VfTk9fUkVDVVJfQVRUUiA9ICJlbnZSZXBsYWNlLU5vUmVjdXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfQVRUUiA9ICJzcGxpdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19NRVRfQVRUUiA9ICJ3b3JrZmxvd01ldCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5fSU5QVVRfRklMRVNfVEFHID0gImR5bklucHV0RmlsZXMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9UQUcgPSAiZmlsZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0FUVFIgPSAicGF0aCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURVJfQ0xBU1NfQVRUUiA9ICJ3cml0ZXJDbGFzcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX0FUVFIgPSAiYXJncyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVfVEFHID0gImV4ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfQVRUUiA9ICJkaXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hFTExfVFlQRV9BVFRSID0gInNoZWxsVHlwZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfVEFHID0gImNtZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfVEFHID0gIm91dHB1dCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfVEFHID0gImRpciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQkVGT1JFX0VYRUNfQVRUUiA9ICJjcmVhdGVCZWZvcmVFeGUiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVTX1RBRyA9ICJmaWxlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9BVFRSID0gInJlZ0V4cCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFIgPSAibmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRfRklMRV9XUklURVJfQ0xBU1NfQVRUUiA9ICJtZXRGaWxlV3JpdGVyQ2xhc3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1JTkdfQ09OVl9UQUcgPSAicmVuYW1pbmdDb252IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUlOR19FWFBSX0FUVFIgPSAibmFtaW5nRXhwciI7ICAgIAorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TVEFHSU5HX1RBRyA9ICJmaWxlU3RhZ2luZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFHRV9GSUxFU19UQUcgPSAic3RhZ2VGaWxlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQVRUUiA9ICJtZXRhZGF0YUtleSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9BVFRSID0gImZvcmNlIjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1JlZ0V4cHJPdXRwdXRGaWxlcy5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvUmVnRXhwck91dHB1dEZpbGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwMDY5NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1JlZ0V4cHJPdXRwdXRGaWxlcy5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5maWxlbmFtaW5nLlBhdGhVdGlsc05hbWluZ0NvbnZlbnRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBjbGFzcyB0byBkZWZpbmUgd2hhdCBPdXRwdXRGaWxlcworICogdG8gaWRlbnRpZnkgYWZ0ZXIgcnVubmluZyBhIFBHRQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFJlZ0V4cHJPdXRwdXRGaWxlcyB7CisKKyAgICBwcml2YXRlIFN0cmluZyByZWdFeHA7CisKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKKworICAgIHByaXZhdGUgT2JqZWN0W10gYXJnczsKKworICAgIHByaXZhdGUgUGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbiByZW5hbWluZ0NvbnY7CisgICAgCisgICAgcHVibGljIFJlZ0V4cHJPdXRwdXRGaWxlcyhTdHJpbmcgcmVnRXhwLCBTdHJpbmcgY29udmVydGVyQ2xhc3MsIAorICAgIAkJUGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbiByZW5hbWluZ0NvbnYsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgdGhpcy5yZWdFeHAgPSByZWdFeHA7CisgICAgICAgIHRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKKyAgICAgICAgdGhpcy5yZW5hbWluZ0NvbnYgPSByZW5hbWluZ0NvbnY7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uIGdldFJlbmFtaW5nQ29udigpIHsKKyAgICAJcmV0dXJuIHRoaXMucmVuYW1pbmdDb252OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnRXhwKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWdFeHA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIGdldEFyZ3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFyZ3M7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL2NvbmZpZy9YbWxGaWxlUGdlQ29uZmlnQnVpbGRlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvWG1sRmlsZVBnZUNvbmZpZ0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUxOGUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvWG1sRmlsZVBnZUNvbmZpZ0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZzsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkNPTkZJR19GSUxFX1BBVEg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmZpbGxJbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0Q3VzdG9tTWV0YWRhdGFFbGVtZW50OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLlhtbEhlbHBlci5nZXREaXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldER5bmFtaWNDb25maWdGaWxlczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0RXhlQ21kczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0RmlsZVN0YWdpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldEltcG9ydHM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldE1ldGFkYXRhRWxlbWVudHM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldE1ldGFkYXRhS2V5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLlhtbEhlbHBlci5nZXRNZXRhZGF0YUtleVJlZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0TWV0YWRhdGFWYWx1ZXM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldE91cHV0RGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0T3V0cHV0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLlhtbEhlbHBlci5nZXRSb290RWxlbWVudDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0U2hlbGxUeXBlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLlhtbEhlbHBlci5nZXRTdGFnZUZpbGVzTWV0S2V5czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuaXNGb3JjZVN0YWdlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsLlhtbEhlbHBlci5pc1dvcmtmbG93TWV0S2V5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5QYWlyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyOworCisvL0RPTSBpbXBvcnRzCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBQZ2VDb25maWdCdWlsZGVyfSB0aGF0IHJlYWRzIGFuIFhNTCBmaWxlCisgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIFBnZUNvbmZpZ30uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxGaWxlUGdlQ29uZmlnQnVpbGRlciBpbXBsZW1lbnRzIFBnZUNvbmZpZ0J1aWxkZXIgeworCisgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nTWV0YWRhdGFLZXlzOworCisgICBwdWJsaWMgWG1sRmlsZVBnZUNvbmZpZ0J1aWxkZXIoKSB7CisgICAgICBtaXNzaW5nTWV0YWRhdGFLZXlzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFBnZUNvbmZpZyBidWlsZChQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBtaXNzaW5nTWV0YWRhdGFLZXlzLmNsZWFyKCk7CisKKyAgICAgICAgIFBnZUNvbmZpZyBwZ2VDb25maWcgPSBuZXcgUGdlQ29uZmlnKCk7CisgICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGZpbGxJbihwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShDT05GSUdfRklMRV9QQVRIKSwKKyAgICAgICAgICAgICAgIHBnZU1ldGFkYXRhLmFzTWV0YWRhdGEoKSk7CisgICAgICAgICBpZiAoY29uZmlnRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgbWV0YWRhdGEgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgICsgQ09ORklHX0ZJTEVfUEFUSCArICInIik7CisgICAgICAgICB9CisgICAgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEobG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgcGdlQ29uZmlnLAorICAgICAgICAgICAgICAgcGdlTWV0YWRhdGEpKTsKKyAgICAgICAgIHJldHVybiBwZ2VDb25maWc7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gYnVpbGQgUGdlQ29uZmlnIDogIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgZSk7CisgICAgICB9CisgICB9CisKKyAgIHByaXZhdGUgUGdlTWV0YWRhdGEgbG9hZENvbmZpZ0ZpbGUoU3RyaW5nIGNvbmZpZ0ZpbGUsIFBnZUNvbmZpZyBwZ2VDb25maWcsCisgICAgICAgICBQZ2VNZXRhZGF0YSBwYXJlbnRQZ2VNZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSA9IG5ldyBQZ2VNZXRhZGF0YShwYXJlbnRQZ2VNZXRhZGF0YSk7CisgICAgICBFbGVtZW50IHJvb3QgPSBnZXRSb290RWxlbWVudChjb25maWdGaWxlKTsKKworICAgICAgLy8gUmVhZCBpbiBpbXBvcnRzCisgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRzID0gZ2V0SW1wb3J0cyhyb290LCBwZ2VNZXRhZGF0YS5hc01ldGFkYXRhKCkpOworICAgICAgZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBpbXAgOiBpbXBvcnRzKSB7CisgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gaW1wLmdldEZpcnN0KCk7CisgICAgICAgICBTdHJpbmcgZmlsZSA9IGltcC5nZXRTZWNvbmQoKTsKKworICAgICAgICAgLy8gSWYgcmVsYXRpdmUgcGF0aCwgdGhlbiBtYWtlIHBhdGggcmVsYXRpdmUgdG8gY29uZmlnRmlsZS4KKyAgICAgICAgIGlmICghZmlsZS5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGNvbmZpZ0ZpbGUpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlOworICAgICAgICAgfQorCisgICAgICAgICAvLyBBZGQgbWV0YWRhdGEgZ2VuZXJhdGVkIGZyb20gaW1wb3J0LgorICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICBsb2FkQ29uZmlnRmlsZShmaWxlLCBwZ2VDb25maWcsIHBhcmVudFBnZU1ldGFkYXRhKSwKKyAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGxvYWRDb25maWdGaWxlKGZpbGUsIHBnZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgIHBhcmVudFBnZU1ldGFkYXRhKSk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIGxvYWQgY3VzdG9tIG1ldGFkYXRhCisgICAgICBsb2FkQ3VzdG9tTWV0YWRhdGEocm9vdCwgcGdlTWV0YWRhdGEpOworICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBwZ2VNZXRhZGF0YS5hc01ldGFkYXRhKCk7CisKKyAgICAgIC8vIGxvYWQgZHluYW1pYyBjb25maWcgZmlsZSBpbmZvCisgICAgICBmb3IgKER5bmFtaWNDb25maWdGaWxlIGRjZiA6IGdldER5bmFtaWNDb25maWdGaWxlcyhyb290LCBtZXRhZGF0YSkpIHsKKyAgICAgICAgIHBnZUNvbmZpZy5hZGREeW5hbWljQ29uZmlnRmlsZShkY2YpOworICAgICAgfQorCisgICAgICAvLyBsb2FkIGZpbGUgc3RhZ2luZyBpbmZvLgorICAgICAgbG9hZEZpbGVTdGFnaW5nSW5mbyhyb290LCBwZ2VDb25maWcsIHBnZU1ldGFkYXRhKTsKKworICAgICAgLy8gbG9hZCBleGUgaW5mbworICAgICAgRWxlbWVudCBleGVFbGVtID0gWG1sSGVscGVyLmdldEV4ZShyb290KTsKKyAgICAgIGlmIChleGVFbGVtICE9IG51bGwpIHsKKyAgICAgICAgIHBnZUNvbmZpZy5zZXRFeGVEaXIoZ2V0RGlyKGV4ZUVsZW0sIG1ldGFkYXRhKSk7CisgICAgICAgICBwZ2VDb25maWcuc2V0U2hlbGxUeXBlKGdldFNoZWxsVHlwZShleGVFbGVtLCBtZXRhZGF0YSkpOworICAgICAgICAgcGdlQ29uZmlnLnNldEV4ZUNtZHMoZ2V0RXhlQ21kcyhleGVFbGVtLCBtZXRhZGF0YSkpOworICAgICAgfQorCisgICAgICAvLyBsb2FkIG91dHB1dCBkaXJzCisgICAgICBFbGVtZW50IG91dHB1dEVsZW0gPSBnZXRPdXRwdXQocm9vdCk7CisgICAgICBpZiAob3V0cHV0RWxlbSAhPSBudWxsKSB7CisgICAgICAgICBmb3IgKE91dHB1dERpciBvdXRwdXREaXIgOiBnZXRPdXB1dERpcnMob3V0cHV0RWxlbSwgbWV0YWRhdGEpKSB7CisgICAgICAgICAgICBwZ2VDb25maWcuYWRkT3VwdXREaXJBbmRFeHByZXNzaW9ucyhvdXRwdXREaXIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gcGdlTWV0YWRhdGE7CisgICB9CisKKyAgIHByaXZhdGUgdm9pZCBsb2FkQ3VzdG9tTWV0YWRhdGEoRWxlbWVudCByb290LCBQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKyAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgJ2N1c3RvbU1ldGFkYXRhJyBlbGVtIGFuZCBsb2FkIGl0LgorICAgICAgRWxlbWVudCBjdXN0b21NZXRhZGF0YUVsZW0gPSBnZXRDdXN0b21NZXRhZGF0YUVsZW1lbnQocm9vdCk7CisgICAgICBpZiAoY3VzdG9tTWV0YWRhdGFFbGVtID09IG51bGwpIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIG1ldGFkYXRhIGVsZW1lbnRzLgorICAgICAgZm9yIChFbGVtZW50IG1ldEVsZW0gOiBnZXRNZXRhZGF0YUVsZW1lbnRzKGN1c3RvbU1ldGFkYXRhRWxlbSkpIHsKKyAgICAgICAgIE1ldGFkYXRhIGN1ck1ldGFkYXRhID0gcGdlTWV0YWRhdGEuYXNNZXRhZGF0YSgpOworCisgICAgICAgICAvLyBMb2FkIHN1cHBvcnRlZCBtZXRhZGF0YSBlbGVtZW50IGF0dHJpYnV0ZXMuCisgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0TWV0YWRhdGFLZXkobWV0RWxlbSwgY3VyTWV0YWRhdGEpOworICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IGdldE1ldGFkYXRhVmFsdWVzKG1ldEVsZW0sIGN1ck1ldGFkYXRhKTsKKyAgICAgICAgIFN0cmluZyBrZXlSZWYgPSBnZXRNZXRhZGF0YUtleVJlZihtZXRFbGVtLCBjdXJNZXRhZGF0YSk7CisKKyAgICAgICAgIC8vIENoZWNrIHRoYXQgZWl0aGVyIHZhbCBvciBrZXktcmVmIGlzIGdpdmVuLgorICAgICAgICAgaWYgKCF2YWx1ZXMuaXNFbXB0eSgpICYmIGtleVJlZiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzcGVjaWZ5IGJvdGggdmFsdWVzIGFuZCBrZXlyZWYgZm9yIG1ldGFkYXRhIGtleSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXkgKyAiJyIpOworCisgICAgICAgICAgICAvLyBJZiB2YWwgaXMgZ2l2ZW4gdGhlbiBzZXQgbWV0YWRhdGEgd2l0aCBrZXkgYW5kIHZhbC4KKyAgICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShrZXksIHZhbHVlcyk7CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBrZXktcmVmIHdhcyBnaXZlbiwgc28gc2V0IHRoZSBsaW5rLgorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBnZU1ldGFkYXRhLmxpbmtLZXkoa2V5LCBrZXlSZWYpOworICAgICAgICAgfQorCisgICAgICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGtleSBzaG91bGQgYmUgbWFya2VkIGFzIHdvcmtmbG93IG1ldGFkYXRhLgorICAgICAgICAgaWYgKGlzV29ya2Zsb3dNZXRLZXkobWV0RWxlbSwgY3VyTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBwZ2VNZXRhZGF0YS5tYXJrQXNEeW5hbWljTWV0YWRhdGFLZXkoa2V5KTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcHJpdmF0ZSB2b2lkIGxvYWRGaWxlU3RhZ2luZ0luZm8oRWxlbWVudCByb290LCBQZ2VDb25maWcgcGdlQ29uZmlnLAorICAgICAgICAgUGdlTWV0YWRhdGEgcGdlTWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBwZ2VNZXRhZGF0YS5hc01ldGFkYXRhKCk7CisgICAgICBFbGVtZW50IGZpbGVTdGFnaW5nRWxlbSA9IGdldEZpbGVTdGFnaW5nKHJvb3QpOworCisgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBmaWxlIHN0YWdpbmcgaW5mbyBzcGVjaWZpZWQuCisgICAgICBpZiAoZmlsZVN0YWdpbmdFbGVtICE9IG51bGwpIHsKKyAgICAgICAgIEZpbGVTdGFnaW5nSW5mbyBmaWxlU3RhZ2luZ0luZm8gPSBuZXcgRmlsZVN0YWdpbmdJbmZvKGdldERpcigKKyAgICAgICAgICAgICAgIGZpbGVTdGFnaW5nRWxlbSwgbWV0YWRhdGEpLCBpc0ZvcmNlU3RhZ2UoZmlsZVN0YWdpbmdFbGVtLAorICAgICAgICAgICAgICAgbWV0YWRhdGEpKTsKKworICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGxpc3Qgb2YgbWV0YWRhdGEga2V5cyB3aGljaCBoYXZlIGxpc3Qgb2YgZmlsZXMgYXMKKyAgICAgICAgIC8vIHRoZWlyIHZhbHVlcyB3aGljaCBzaG91bGQgYmUgc3RhZ2VkLgorICAgICAgICAgZm9yIChTdHJpbmcgbWV0S2V5IDogZ2V0U3RhZ2VGaWxlc01ldEtleXMoZmlsZVN0YWdpbmdFbGVtLCBtZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmaWxlcyA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKG1ldEtleSk7CisgICAgICAgICAgICBmaWxlU3RhZ2luZ0luZm8uYWRkRmlsZVBhdGhzKGZpbGVzKTsKKworICAgICAgICAgICAgLy8gR2VuZXJhdGUgcGF0aHMgd2hpY2ggdGhlIGZpbGVzIHdpbGwgYmUgc3RhZ2VkIHRvLgorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG5ld1BhdGhzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgICAgIEZpbGUgZmlsZUhhbmRsZSA9IG5ldyBGaWxlKGZpbGUpOworICAgICAgICAgICAgICAgaWYgKGZpbGVTdGFnaW5nSW5mby5pc0ZvcmNlU3RhZ2luZygpIHx8ICFmaWxlSGFuZGxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICBuZXdQYXRocy5hZGQoZmlsZVN0YWdpbmdJbmZvLmdldFN0YWdpbmdEaXIoKSArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVIYW5kbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBuZXdQYXRocy5hZGQoZmlsZSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YSBrZXkgd2l0aCB3aGF0IHdpbGwgYmUgdGhlIG5ldyBwYXRocyBvZiB0aGUgZmlsZXMuCisgICAgICAgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEobWV0S2V5LCBuZXdQYXRocyk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8vIEFkZCBzdGFnaW5nIGluZm8gdG8gUGdlQ29uZmlnLgorICAgICAgICAgcGdlQ29uZmlnLnNldEZpbGVTdGFnaW5nSW5mbyhmaWxlU3RhZ2luZ0luZm8pOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9tZXRhZGF0YS9QZ2VNZXRhZGF0YS5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9tZXRhZGF0YS9QZ2VNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmM4YzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL21ldGFkYXRhL1BnZU1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCisvKioKKyAqIEEgd3JhcHBlciBjbGFzcyB0byBhY3QgYXMgYSBmYWNhZGUgaW50ZXJmYWNlIHRvIGFsbCB0aGUgZGlmZmVyZW50CisgKiB7QGxpbmsgTWV0YWRhdGF9IHNvdXJjZXMgZ2l2ZW4gdG8gYSBQR0UuCisgKiAKKyAqIE5PVEU6IDIgd2F5cyB0byB1cGRhdGUgRFlOQU1JQyBtZXRhZGF0YTogMSkgQ3JlYXRlIGEga2V5IGxpbmsgdG8gYSBEWU5BTUlDIG1ldGFkYXRhCisgKiBrZXksIHRoZW4gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGxpbmsgb3IgMikgYWRkIG1ldGFkYXRhIHRoZW4gbWFyayB0aGUKKyAqIGtleSBhcyBkeW5hbWljIGFuZCBjb21taXQgaXQuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBjbGFzcyBQZ2VNZXRhZGF0YSB7CisKKyAgIHB1YmxpYyBlbnVtIFR5cGUgeworICAgICAgU1RBVElDLCBEWU5BTUlDLCBMT0NBTDsKKyAgIH0KKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUeXBlPiBERUZBVUxUX0NPTUJJTkVfT1JERVIgPSBMaXN0cworICAgICAgICAgLm5ld0FycmF5TGlzdChUeXBlLkxPQ0FMLCBUeXBlLkRZTkFNSUMsIFR5cGUuU1RBVElDKTsKKyAgIAorICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFR5cGU+IERFRkFVTFRfUVVFUllfT1JERVIgPSBMaXN0cworCQkgICAubmV3QXJyYXlMaXN0KFR5cGUuU1RBVElDLCBUeXBlLkRZTkFNSUMsIFR5cGUuTE9DQUwpOworCisgICBwcml2YXRlIGZpbmFsIE1ldGFkYXRhIHN0YXRpY01ldGFkYXRhOworICAgcHJpdmF0ZSBmaW5hbCBNZXRhZGF0YSBkeW5hbWljTWV0YWRhdGE7CisgICBwcml2YXRlIGZpbmFsIE1ldGFkYXRhIGxvY2FsTWV0YWRhdGE7CisKKyAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBrZXlMaW5rTWFwOworICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtYXJrZWRBc0R5bmFtaWNNZXRLZXlzOworCisgICBwdWJsaWMgUGdlTWV0YWRhdGEoKSB7CisgICAgICBrZXlMaW5rTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICBtYXJrZWRBc0R5bmFtaWNNZXRLZXlzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBzdGF0aWNNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgZHluYW1pY01ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBsb2NhbE1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICB9CisKKyAgIHB1YmxpYyBQZ2VNZXRhZGF0YShQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSkgeworICAgICAgdGhpcygpOworCisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHBnZU1ldGFkYXRhLCAicGdlTWV0YWRhdGEgY2Fubm90IGJlIG51bGwiKTsKKworICAgICAgcmVwbGFjZU1ldGFkYXRhKHBnZU1ldGFkYXRhKTsKKyAgIH0KKworICAgcHVibGljIFBnZU1ldGFkYXRhKE1ldGFkYXRhIHN0YXRpY01ldGFkYXRhLCBNZXRhZGF0YSBkeW5hbWljTWV0YWRhdGEpIHsKKyAgICAgIHRoaXMoKTsKKworICAgICAgVmFsaWRhdGUubm90TnVsbChzdGF0aWNNZXRhZGF0YSwgInN0YXRpY01ldGFkYXRhIGNhbm5vdCBiZSBudWxsIik7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGR5bmFtaWNNZXRhZGF0YSwgImR5bmFtaWNNZXRhZGF0YSBjYW5ub3QgYmUgbnVsbCIpOworCisgICAgICB0aGlzLnN0YXRpY01ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShzdGF0aWNNZXRhZGF0YSk7CisgICAgICB0aGlzLmR5bmFtaWNNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoZHluYW1pY01ldGFkYXRhKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXBsYWNlcyBvciBjcmVhdGVzIHRoaXMge0BsaW5rIFBnZU1ldGFkYXRhfSdzIG1ldGFkYXRhIHdpdGggZ2l2ZW4KKyAgICAqIHtAbGluayBQZ2VNZXRhZGF0YX0ncyBtZXRhZGF0YS4gQWxzbyBhZGRzIGluIHRoZSBsaXN0IG9mIGdpdmVuCisgICAgKiB7QGxpbmsgUGdlTWV0YWRhdGF9J3MgTE9DQUwgbWV0YWRhdGEgbWFya2VkIGZvciBwcm9tb3Rpb24gRFlOQU1JQworICAgICogbWV0YWRhdGEgYW5kIGxpc3Qgb2Yga2V5IGxpbmtzLgorICAgICogCisgICAgKiBAcGFyYW0gcGdlTWV0YWRhdGEKKyAgICAqICAgICAgICAgICBBIHtAbGluayBQZ2VNZXRhZGF0YX0gd2hvc2UgbWV0YWRhdGEgYW5kIGtleSBsaW5rcyB3aWxsIGJlIGFkZGVkCisgICAgKiAgICAgICAgICAgdG8gdGhpcyB7QGxpbmsgUGdlTWV0YWRhdGF9J3MgbWV0YWRhdGEgYW5kIGtleSBsaW5rcy4KKyAgICAqLworICAgcHVibGljIHZvaWQgcmVwbGFjZU1ldGFkYXRhKFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHBnZU1ldGFkYXRhLCAicGdlTWV0YWRhdGEgY2Fubm90IGJlIG51bGwiKTsKKworICAgICAgc3RhdGljTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHBnZU1ldGFkYXRhLnN0YXRpY01ldGFkYXRhKTsKKyAgICAgIGR5bmFtaWNNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEocGdlTWV0YWRhdGEuZHluYW1pY01ldGFkYXRhKTsKKyAgICAgIGxvY2FsTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHBnZU1ldGFkYXRhLmxvY2FsTWV0YWRhdGEpOworCisgICAgICBrZXlMaW5rTWFwLnB1dEFsbChwZ2VNZXRhZGF0YS5rZXlMaW5rTWFwKTsKKyAgICAgIG1hcmtlZEFzRHluYW1pY01ldEtleXMuYWRkQWxsKHBnZU1ldGFkYXRhLm1hcmtlZEFzRHluYW1pY01ldEtleXMpOworICAgfQorCisgICAvKioKKyAgICAqIFJlcGxhY2VzIG9yIGNyZWF0ZXMgdGhpcyB7QGxpbmsgUGdlTWV0YWRhdGF9J3MgbWV0YWRhdGEgd2l0aCBnaXZlbgorICAgICoge0BsaW5rIFBnZU1ldGFkYXRhfSdzIG1ldGFkYXRhLiBUaGUgcHJvdmlkZWQgImdyb3VwIiB3aWxsIGJlIHVzZWQgdG8KKyAgICAqIG5hbWVzcGFjZSB0aGUgZ2l2ZW4ge0BsaW5rIFBnZU1ldGFkYXRhfSdzIExPQ0FMIG1ldGFkYXRhIHdoZW4gYWRkIHRvIHRoaXMKKyAgICAqIHtAbGluayBQZ2VNZXRhZGF0YX0ncyBMT0NBTCBtZXRhZGF0YS4gSXQgd2lsbCBhbHNvIG5hbWVzcGFjZSBnaXZlbgorICAgICoge0BsaW5rIFBnZU1ldGFkYXRhfSdzIGtleSBsaW5rcyBiZWZvcmUgYWRkaW5nIHRoZW4gdG8gdGhpcworICAgICoge0BsaW5rIFBnZU1ldGFkYXRhfSdzIGtleSBsaW5rcy4gQWxzbyBhZGQgaW4gdGhlIGxpc3Qgb2YgZ2l2ZW4KKyAgICAqIHtAbGluayBQZ2VNZXRhZGF0YX0ncyBMT0NBTCBtZXRhZGF0YSBtYXJrZWQgZm9yIHByb21vdGlvbiBEWU5BTUlDCisgICAgKiBtZXRhZGF0YS4KKyAgICAqIAorICAgICogQHBhcmFtIHBnZU1ldGFkYXRhCisgICAgKiAgICAgICAgICAgQSB7QGxpbmsgUGdlTWV0YWRhdGF9IHdob3NlIG1ldGFkYXRhIGFuZCBrZXkgbGlua3Mgd2lsbCBiZSBhZGRlZAorICAgICogICAgICAgICAgIHRvIHRoaXMge0BsaW5rIFBnZU1ldGFkYXRhfSdzIG1ldGFkYXRhIGFuZCBrZXkgbGlua3MuCisgICAgKiBAcGFyYW0gZ3JvdXAKKyAgICAqICAgICAgICAgICBUaGUgbmFtZXNwYWNlIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYW1lc3BhY2UgZ2l2ZW4KKyAgICAqICAgICAgICAgICB7QGxpbmsgUGdlTWV0YWRhdGF9J3MgTE9DQUwgbWV0YWRhdGEgYW5kIGtleSBsaW5rcyBiZWZvcmUgYmVpbmcKKyAgICAqICAgICAgICAgICBhZGRlZCB0byB0aGlzIHtAbGluayBQZ2VNZXRhZGF0YX0ncyBMT0NBTCBtZXRhZGF0YSBhbmQga2V5CisgICAgKiAgICAgICAgICAgbGlua3MuCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSwgU3RyaW5nIGdyb3VwKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHBnZU1ldGFkYXRhLCAicGdlTWV0YWRhdGEgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoZ3JvdXAsICJncm91cCBjYW5ub3QgYmUgbnVsbCIpOworCisgICAgICBzdGF0aWNNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEocGdlTWV0YWRhdGEuc3RhdGljTWV0YWRhdGEpOworICAgICAgZHluYW1pY01ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShwZ2VNZXRhZGF0YS5keW5hbWljTWV0YWRhdGEpOworICAgICAgbG9jYWxNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoZ3JvdXAsIHBnZU1ldGFkYXRhLmxvY2FsTWV0YWRhdGEpOworCisgICAgICAvLyBOYW1lc3BhY2UgbGluayBrZXlzIHRoYXQgcG9pbnQgdG8gZWl0aGVyIGltcG9ydGluZworICAgICAgLy8gbWV0YWRhdGEncyBsb2NhbCBrZXkgb3IgbGluayBrZXkuCisgICAgICBmb3IgKFN0cmluZyBrZXlMaW5rIDogcGdlTWV0YWRhdGEua2V5TGlua01hcC5rZXlTZXQoKSkgeworICAgICAgICAgU3RyaW5nIGtleSA9IHBnZU1ldGFkYXRhLmtleUxpbmtNYXAuZ2V0KGtleUxpbmspOworICAgICAgICAgLy8gQ2hlY2sgaWYga2V5IGlzIHdhcyBsb2NhbCBrZXkgb3IgYSBsaW5rIGtleQorICAgICAgICAgaWYgKHBnZU1ldGFkYXRhLmxvY2FsTWV0YWRhdGEuY29udGFpbnNLZXkoa2V5KQorICAgICAgICAgICAgICAgfHwgcGdlTWV0YWRhdGEua2V5TGlua01hcC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICBrZXkgPSBncm91cCArICIvIiArIGtleTsKKyAgICAgICAgIH0KKyAgICAgICAgIGxpbmtLZXkoZ3JvdXAgKyAiLyIgKyBrZXlMaW5rLCBrZXkpOworICAgICAgfQorCisgICAgICAvLyBOYW1lc3BhY2Ugd29ya2Zsb3cga2V5cyB0aGF0IHBvaW50IHRvIGVpdGhlciBpbXBvcnRpbmcKKyAgICAgIC8vIG1ldGFkYXRhJ3MgbG9jYWwga2V5IG9yIGxpbmsga2V5LgorICAgICAgZm9yIChTdHJpbmcga2V5IDogcGdlTWV0YWRhdGEubWFya2VkQXNEeW5hbWljTWV0S2V5cykgeworICAgICAgICAgaWYgKHBnZU1ldGFkYXRhLmxvY2FsTWV0YWRhdGEuY29udGFpbnNLZXkoa2V5KQorICAgICAgICAgICAgICAgfHwgcGdlTWV0YWRhdGEua2V5TGlua01hcC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICBrZXkgPSBncm91cCArICIvIiArIGtleTsKKyAgICAgICAgIH0KKyAgICAgICAgIG1hcmtBc0R5bmFtaWNNZXRhZGF0YUtleShrZXkpOworICAgICAgfQorICAgfQorCisgICAvKioKKyAgICAqIFVzZSB0byBtYXJrIExPQ0FMIGtleXMgd2hpY2ggc2hvdWxkIGJlIG1vdmVkIGludG8gRFlOQU1JQyBtZXRhZGF0YSB3aGVuCisgICAgKiB7QGxpbmsgI2NvbW1pdE1hcmtlZER5bmFtaWNNZXRhZGF0YUtleXMoU3RyaW5nLi4uKX0gaXMgaW52b2tlZC4gSWYgbm8gCisgICAgKiBhcmdzIGFyZSBzcGVjaWZpZWQgdGhlbiBhbGwgTE9DQUwgbWV0YWRhdGEgaXMgbWFya2VkIGZvciBtb3ZlIHRvCisgICAgKiBEWU5BTUlDIG1ldGFkYXRhLgorICAgICogCisgICAgKiBAcGFyYW0ga2V5cworICAgICogICAgICAgICAgIEtleXMgdG8gbWFyayBhcyB0byBiZSBtYWRlIERZTkFNSUMsIG90aGVyd2lzZSBpZiBubyBrZXlzIHRoZW4KKyAgICAqICAgICAgICAgICBhbGwgTE9DQUwgbWV0YWRhdGEga2V5cyBhcmUgbWFyayBmb3IgbW92ZSB0byBEWU5BTUlDLgorICAgICovCisgICBwdWJsaWMgdm9pZCBtYXJrQXNEeW5hbWljTWV0YWRhdGFLZXkoU3RyaW5nLi4uIGtleXMpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiBtYXJrZWRLZXlzID0gTGlzdHMubmV3QXJyYXlMaXN0KGtleXMpOworICAgICAgaWYgKG1hcmtlZEtleXMuaXNFbXB0eSgpKSB7CisgICAgICAgICBtYXJrZWRLZXlzLmFkZEFsbChsb2NhbE1ldGFkYXRhLmdldEFsbEtleXMoKSk7CisgICAgICB9CisgICAgICBtYXJrZWRBc0R5bmFtaWNNZXRLZXlzLmFkZEFsbChtYXJrZWRLZXlzKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBVc2UgdG8gY29tbWl0IG1hcmtlZCBMT0NBTCBrZXlzIHRvIERZTkFNSUMga2V5cy4gU3BlY2lmeSBhIGxpc3Qgb2Yga2V5cworICAgICogb25seSBpZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUga2V5cyB3aGljaCBnZXQgY29tbWl0dGVkLCBvdGhlcndpc2UgYWxsCisgICAgKiBtYXJrZWQga2V5cyB3aWxsIGJlIG1vdmVkIGludG8gRFlOQU1JQyBtZXRhZGF0YS4KKyAgICAqIAorICAgICogQHBhcmFtIGtleXMKKyAgICAqICAgICAgICAgICBUaGUgbGlzdCBvZiBtYXJrZWQgTE9DQUwgbWV0YWRhdGEga2V5cyB3aGljaCBzaG91bGQgYmUgbW92ZWQKKyAgICAqICAgICAgICAgICBpbnRvIERZTkFNSUMgbWV0YWRhdGEuIElmIG5vIGtleXMgYXJlIHNwZWNpZmllZCB0aGVuIGFsbCBtYXJrZWQKKyAgICAqICAgICAgICAgICBrZXlzIGFyZSBtb3ZlZC4KKyAgICAqLworICAgcHVibGljIHZvaWQgY29tbWl0TWFya2VkRHluYW1pY01ldGFkYXRhS2V5cyhTdHJpbmcuLi4ga2V5cykgeworICAgICAgU2V0PFN0cmluZz4gY29tbWl0S2V5cyA9IFNldHMubmV3SGFzaFNldChrZXlzKTsKKyAgICAgIGlmIChjb21taXRLZXlzLmlzRW1wdHkoKSkgeworICAgICAgICAgY29tbWl0S2V5cy5hZGRBbGwobWFya2VkQXNEeW5hbWljTWV0S2V5cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgY29tbWl0S2V5cy5yZXRhaW5BbGwobWFya2VkQXNEeW5hbWljTWV0S2V5cyk7CisgICAgICB9CisgICAgICBmb3IgKFN0cmluZyBrZXkgOiBjb21taXRLZXlzKSB7CisgICAgICAgICBkeW5hbWljTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGtleSwKKyAgICAgICAgICAgICAgIGxvY2FsTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEocmVzb2x2ZUtleShrZXkpKSk7CisgICAgICAgICBsb2NhbE1ldGFkYXRhLnJlbW92ZU1ldGFkYXRhKGtleSk7CisgICAgICAgICBtYXJrZWRBc0R5bmFtaWNNZXRLZXlzLnJlbW92ZShrZXkpOworICAgICAgfQorICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRNYXJrZWRBc0R5bmFtaWNNZXRhZGF0YUtleXMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG1hcmtlZEFzRHluYW1pY01ldEtleXMpOworICAgfQorCisgICAvKioKKyAgICAqIENyZWF0ZSBhIGtleSB3aGljaCBpcyBhIGxpbmsgdG8gYW5vdGhlciBrZXksIHN1Y2ggdGhhdCBpZiB5b3UgZ2V0IHRoZQorICAgICogbWV0YWRhdGEgdmFsdWVzIGZvciB0aGUgY3JlYXRlZCBsaW5rIGl0IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IG1ldGFkYXRhCisgICAgKiB2YWx1ZXMgb2YgdGhlIGtleSBpdCB3YXMgbGlua2VkIHRvLiBOT1RFOiBpZiB0aGUga2V5J3MgbWV0YWRhdGEgdmFsdWVzCisgICAgKiBjaGFuZ2UsIHRoZW4gdGhlIG1ldGFkYXRhIHZhbHVlcyBmb3IgdGhlIGxpbmsga2V5IHdpbGwgYWxzbyBiZSB0aGUgY2hhbmdlZAorICAgICogdmFsdWVzLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBrZXkgd2hpY2ggaG9sZHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYQorICAgICoga2V5LCB0aGVuIGNyZWF0ZSBhIG5ldyBtZXRhZGF0YSBrZXkuCisgICAgKiAKKyAgICAqIEBwYXJhbSBrZXlMaW5rCisgICAgKiAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGxpbmsga2V5IHlvdSB3aXNoIHRvIGNyZWF0ZS4KKyAgICAqIEBwYXJhbSBrZXkKKyAgICAqICAgICAgICAgICBUaGUga2V5IHlvdSB3aGljaCB0byBsaW5rIHRvIChtYXkgYWxzbyBiZSBhIGtleSBsaW5rKQorICAgICovCisgICBwdWJsaWMgdm9pZCBsaW5rS2V5KFN0cmluZyBrZXlMaW5rLCBTdHJpbmcga2V5KSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGtleUxpbmssICJrZXlMaW5rIGNhbm5vdCBiZSBudWxsIik7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGtleSwgImtleSBjYW5ub3QgYmUgbnVsbCIpOworCisgICAgICBsb2NhbE1ldGFkYXRhLnJlbW92ZU1ldGFkYXRhKGtleUxpbmspOworICAgICAga2V5TGlua01hcC5wdXQoa2V5TGluaywga2V5KTsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZW1vdmVzIGEga2V5IGxpbmsgcmVmZXJlbmNlLiBUaGUga2V5IHdoaWNoIHRoZSBrZXkgbGluayB3YXMgbGlua2VkIHRvCisgICAgKiByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAqIAorICAgICogQHBhcmFtIGtleUxpbmsKKyAgICAqICAgICAgICAgICBUaGUga2V5IGxpbmsgd2hpY2ggeW91IHdpc2ggdG8gZGVzdHJveS4KKyAgICAqLworICAgcHVibGljIHZvaWQgdW5saW5rS2V5KFN0cmluZyBrZXlMaW5rKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGtleUxpbmssICJrZXlMaW5rIGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgIGtleUxpbmtNYXAucmVtb3ZlKGtleUxpbmspOworICAgfQorCisgICAvKioKKyAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBrZXkgbmFtZSBpcyBhIGtleSBsaW5rLgorICAgICogCisgICAgKiBAcGFyYW0ga2V5CisgICAgKiAgICAgICAgICAgVGhlIGtleSBuYW1lIGluIHF1ZXN0aW9uLgorICAgICogQHJldHVybiBUcnVlIGlzIHRoZSBnaXZlbiBrZXkgbmFtZSBpcyBhIGtleSBsaW5rLCBmYWxzZSBpZiBrZXkgbmFtZSBpcyBhbgorICAgICogICAgICAgICBhY3R1YWwga2V5LgorICAgICovCisgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmsoU3RyaW5nIGtleSkgeworICAgICAgVmFsaWRhdGUubm90TnVsbChrZXksICJrZXkgY2Fubm90IGJlIG51bGwiKTsKKworICAgICAgcmV0dXJuIGtleUxpbmtNYXAuY29udGFpbnNLZXkoa2V5KTsKKyAgIH0KKworICAgLyoqCisgICAgKiBGaW5kIHRoZSBhY3R1YWwga2V5IHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHRoZSBnaXZlbiBrZXkuIElmIHRoZQorICAgICogZ2l2ZW4ga2V5IGlzIGEga2V5IChub3QgYSBrZXkgbGluaykgdGhlbiB0aGUgZ2l2ZW4ga2V5IHdpbGwganVzdCBiZQorICAgICogcmV0dXJuZWQsIG90aGVyd2lzZSBpdCB3aWxsIHRyYWNlIHRocm91Z2gga2V5IGxpbmsgbWFwcGluZyB0byBmaW5kIHRoZSBrZXkKKyAgICAqIHdoaWNoIHRoZSBnaXZlbiBrZXkgbGluayBwb2ludHMgdG8uCisgICAgKiAKKyAgICAqIEBwYXJhbSBrZXkKKyAgICAqICAgICAgICAgICBUaGUgbmFtZSBvZiBhIGtleSBvciBrZXkgbGluay4KKyAgICAqIEByZXR1cm4gVGhlIGtleSB3aG9zZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgZ2l2ZW4ga2V5IG9yIGtleQorICAgICogICAgICAgICBsaW5rLgorICAgICovCisgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVLZXkoU3RyaW5nIGtleSkgeworICAgICAgVmFsaWRhdGUubm90TnVsbChrZXksICJrZXkgY2Fubm90IGJlIG51bGwiKTsKKworICAgICAgd2hpbGUgKGtleUxpbmtNYXAuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAga2V5ID0ga2V5TGlua01hcC5nZXQoa2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBrZXk7CisgICB9CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lcyB0aGUgcGF0aCBieSB3aGljaCB0aGUgZ2l2ZW4ga2V5IChpZiBpdCBpcyBhIGtleSBsaW5rKSBsaW5rcyB0bworICAgICogdGhlIGtleSB3aG9zZSB2YWx1ZSBpdCB3aWxsIHJldHVybi4gSWYgdGhlIGdpdmVuIGtleSBpcyBhIGtleSBsaW5rIGFuZAorICAgICogcG9pbnRzIHRvIGEga2V5IHRoZW4gdGhlIHJldHVybmluZyB7QGxpbmsgTGlzdH0gd2lsbCBiZSBvZiBzaXplIDEgYW5kIHdpbGwKKyAgICAqIGNvbnRhaW4ganVzdCB0aGF0IGtleS4gSG93ZXZlciwgaWYgdGhlIGdpdmVuIGtleSBpcyBhIGtleSBsaW5rIHdoaWNoCisgICAgKiBwb2ludHMgdG8gYW5vdGhlciBrZXkgbGluayB0aGVuIHRoZSByZXR1cm5pbmcge0BsaW5rIExpc3R9IHdpbGwgYmUgZ3JlYXRlcgorICAgICogdGhhbiAxICh3aWxsIGRlcGVuZCBvbiBob3cgbWFueSBrZXkgbGlua3MgYXJlIGNvbm5lY3RlZCBiZWZvcmUgdGhleSBhY3R1YWwKKyAgICAqIHBvaW50IHRvIGEga2V5LiBJZiB0aGUgZ2l2ZW4ga2V5IGlzIGEga2V5LCB0aGVuIHRoZSByZXR1cm5pbmcge0BsaW5rIExpc3R9CisgICAgKiB3aWxsIGJlIGVtcHR5LgorICAgICogCisgICAgKiBAcGFyYW0ga2V5CisgICAgKiAgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIGtleSB3aG9zZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgZ2l2ZQorICAgICogICAgICAgICAgIGtleS4KKyAgICAqIEByZXR1cm4gQSBrZXkgcGF0aCB7QGxpbmsgTGlzdH0uCisgICAgKi8KKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlS2V5UGF0aChTdHJpbmcga2V5KSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGtleSwgImtleSBjYW5ub3QgYmUgbnVsbCIpOworCisgICAgICBMaXN0PFN0cmluZz4ga2V5UGF0aCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgd2hpbGUgKGtleUxpbmtNYXAuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgIGtleVBhdGguYWRkKGtleSA9IGtleUxpbmtNYXAuZ2V0KGtleSkpOworICAgICAgcmV0dXJuIGtleVBhdGg7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShQZ2VUYXNrTWV0S2V5cyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgVmFsaWRhdGUubm90TnVsbChrZXksICJrZXkgY2Fubm90IGJlIG51bGwiKTsKKworICAgICAgcmVwbGFjZU1ldGFkYXRhKGtleS5nZXROYW1lKCksIHZhbHVlKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXBsYWNlIHRoZSBnaXZlbiBrZXkncyB2YWx1ZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gSWYgdGhlIGdpdmVuIGtleSBpcyBhCisgICAgKiBrZXkgbGluaywgdGhlbiBpdCB3aWxsIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGtleSBpdCBpcyBsaW5rZWQgdG8gaWYgdGhhdAorICAgICoga2V5IGlzIERZTkFNSUMgb3IgTE9DQUwuIElmIGdpdmVuIGtleSBpcyBhIGtleSBsaW5rIGFuZCBpdCBsaW5rcyB0byBhCisgICAgKiBTVEFUSUMga2V5LCB0aGVuIGEgbmV3IExPQ0FMIGtleSB3aWxsIGJlIGNyZWF0ZS4KKyAgICAqIAorICAgICogQHBhcmFtIGtleQorICAgICogICAgICAgICAgIFRoZSBrZXkgb3Iga2V5IGxpbmsgZm9yIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXBsYWNlZC4KKyAgICAqIEBwYXJhbSB2YWx1ZQorICAgICogICAgICAgICAgIFRoZSB2YWx1ZSB0byBnaXZlIHRoZSBnaXZlbiBrZXkuIFdpbGwgcmVwbGFjZSBhbnkgZXhpc3RpbmcgdmFsdWUKKyAgICAqICAgICAgICAgICBvciB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBhIG5ld2x5IGNyZWF0ZWQgTE9DQUwga2V5LgorICAgICovCisgICBwdWJsaWMgdm9pZCByZXBsYWNlTWV0YWRhdGEoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGtleSwgImtleSBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgVmFsaWRhdGUubm90TnVsbCh2YWx1ZSwgInZhbHVlIGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgIFN0cmluZyByZXNvbHZlS2V5ID0gcmVzb2x2ZUtleShrZXkpOworICAgICAgLy8gSWYga2V5IGlzIGEga2V5IGxpbmsgd2hpY2ggcG9pbnRzIHRvIGEgRFlOQU1JQyBrZXkgdGhlbiB1cGRhdGUgdGhlCisgICAgICAvLyBEWU5BTUlDIGtleSdzIHZhbHVlLgorICAgICAgaWYgKGtleUxpbmtNYXAuY29udGFpbnNLZXkoa2V5KQorICAgICAgICAgICAgJiYgZHluYW1pY01ldGFkYXRhLmNvbnRhaW5zS2V5KHJlc29sdmVLZXkpKSB7CisgICAgICAgICBkeW5hbWljTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHJlc29sdmVLZXksIHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBsb2NhbE1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShyZXNvbHZlS2V5LCB2YWx1ZSk7CisgICAgICB9CisgICB9CisKKyAgIC8qKgorICAgICogUmVwbGFjZSBhbGwga2V5IHZhbHVlcyB3aXRoIHRoZSBnaXZlbiBrZXkgdmFsdWVzIGluIHRoZSBwcm92aWRlZAorICAgICoge0BsaW5rIE1ldGFkYXRhfS4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpdCB3aWxsIGJlIGNyZWF0ZWQuCisgICAgKiAKKyAgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgICogICAgICAgICAgIHtAbGluayBNZXRhZGF0YX0gdG8gcmVwbGFjZSBvciBjcmVhdGUuCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgVmFsaWRhdGUubm90TnVsbChtZXRhZGF0YSwgIm1ldGFkYXRhIGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkgeworICAgICAgICAgcmVwbGFjZU1ldGFkYXRhKGtleSwgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHJlcGxhY2VNZXRhZGF0YShQZ2VUYXNrTWV0S2V5cyBrZXksIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoa2V5LCAia2V5IGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgIHJlcGxhY2VNZXRhZGF0YShrZXkuZ2V0TmFtZSgpLCB2YWx1ZXMpOworICAgfQorCisgICAvKioKKyAgICAqIFJlcGxhY2UgdGhlIGdpdmVuIGtleSdzIHZhbHVlcyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuIElmIHRoZSBnaXZlbiBrZXkgaXMKKyAgICAqIGEga2V5IGxpbmssIHRoZW4gaXQgd2lsbCB1cGRhdGUgdGhlIHZhbHVlcyBvZiB0aGUga2V5IGl0IGlzIGxpbmtlZCB0byBpZgorICAgICogdGhhdCBrZXkgaXMgRFlOQU1JQyBvciBMT0NBTC4gSWYgZ2l2ZW4ga2V5IGlzIGEga2V5IGxpbmsgYW5kIGl0IGxpbmtzIHRvIGEKKyAgICAqIFNUQVRJQyBrZXksIHRoZW4gYSBuZXcgTE9DQUwga2V5IHdpbGwgYmUgY3JlYXRlLgorICAgICogCisgICAgKiBAcGFyYW0ga2V5CisgICAgKiAgICAgICAgICAgVGhlIGtleSBvciBrZXkgbGluayBmb3Igd2hvc2UgdmFsdWVzIHNob3VsZCBiZSByZXBsYWNlZC4KKyAgICAqIEBwYXJhbSB2YWx1ZXMKKyAgICAqICAgICAgICAgICBUaGUgdmFsdWVzIHRvIGdpdmUgdGhlIGdpdmVuIGtleS4gV2lsbCByZXBsYWNlIGFueSBleGlzdGluZworICAgICogICAgICAgICAgIHZhbHVlcyBvciB3aWxsIGJlIHRoZSB2YWx1ZXMgb2YgYSBuZXdseSBjcmVhdGVkIExPQ0FMIGtleS4KKyAgICAqLworICAgcHVibGljIHZvaWQgcmVwbGFjZU1ldGFkYXRhKFN0cmluZyBrZXksIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoa2V5LCAia2V5IGNhbm5vdCBiZSBudWxsIik7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHZhbHVlcywgInZhbHVlcyBjYW5ub3QgYmUgbnVsbCIpOworCisgICAgICBTdHJpbmcgcmVzb2x2ZUtleSA9IHJlc29sdmVLZXkoa2V5KTsKKyAgICAgIGlmIChrZXlMaW5rTWFwLmNvbnRhaW5zS2V5KGtleSkgJiYgZHluYW1pY01ldGFkYXRhLmNvbnRhaW5zS2V5KHJlc29sdmVLZXkpKSB7CisgICAgICAgICBkeW5hbWljTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKHJlc29sdmVLZXksIHZhbHVlcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbG9jYWxNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEocmVzb2x2ZUtleSwgdmFsdWVzKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyoqCisgICAgKiBDb21iaW5lcyBTVEFUSUMsIERZTkFNSUMsIGFuZCBMT0NBTCBtZXRhZGF0YSBpbnRvIG9uZSBtZXRhZGF0YSBvYmplY3QuIFlvdQorICAgICogY2FuIHJlc3RyaWN0IHdoaWNoIG1ldGFkYXRhIHlvdSB3YW50IGNvbWJpbmVkIGFuZCBjaGFuZ2UgdGhlIG9yZGVyIGluCisgICAgKiB3aGljaCBjb21iaW5pbmcgdGFrZXMgcGxhY2UgYnkgc3BlY2lmeWluZyBUeXBlIGFyZ3VtZW50cyBpbiB0aGUgb3JkZXIgeW91CisgICAgKiB3aGljaCBwcmVjZWRlbmNlIHRvIGJlIG9ic2VydmVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IHBlcmZvcm0gdGhlCisgICAgKiBmb2xsb3dpbmc6IHBnZU1ldGFkYXRhLmFzTWV0YWRhdGEoTE9DQUwsIFNUQVRJQykgdGhlbiBvbmx5IExPQ0FMIGFuZAorICAgICogU1RBVElDIG1ldGFkYXRhIHdpbGwgYmUgY29tYmluZWQgYW5kIExPQ0FMIG1ldGFkYXRhIHdpbGwgdHJ1bXAgU1RBVElDCisgICAgKiBtZXRhZGF0YSBpZiB0aGV5IGJvdGggY29udGFpbiB0aGUgc2FtZSBrZXkuIElmIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkCisgICAgKiB0aGVuIERFRkFVTFRfQ09NQklORV9PUkRFUiBpcyB1c2VkLgorICAgICogCisgICAgKiBAcGFyYW0gdHlwZXMKKyAgICAqICAgICAgICAgICBUaGUgVHlwZSBoaWVyYXJjaHkgeW91IHdoaWNoIHRvIHVzZSB3aGVuIG1ldGFkYXRhIGlzIGNvbWJpbmVkLAorICAgICogICAgICAgICAgIGlmIG5vIGFyZ3MgdGhlbiBERUZBVUxUX0NPTUJJTkVfT1JERVIgaXMgdXNlZC4KKyAgICAqIEByZXR1cm4gQ29tYmluZWQgbWV0YWRhdGEuCisgICAgKi8KKyAgIHB1YmxpYyBNZXRhZGF0YSBhc01ldGFkYXRhKFR5cGUuLi4gdHlwZXMpIHsKKyAgICAgIExpc3Q8VHlwZT4gY29tYmluZU9yZGVyID0gTGlzdHMubmV3QXJyYXlMaXN0KHR5cGVzKTsKKyAgICAgIGlmIChjb21iaW5lT3JkZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICBjb21iaW5lT3JkZXIuYWRkQWxsKERFRkFVTFRfQ09NQklORV9PUkRFUik7CisgICAgICB9CisKKyAgICAgIE1ldGFkYXRhIGNvbWJpbmVkTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgIGZvciAoVHlwZSB0eXBlIDogY29tYmluZU9yZGVyKSB7CisgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRFlOQU1JQzoKKyAgICAgICAgICAgICAgIGNvbWJpbmVkTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGR5bmFtaWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgY29tYmluZWRNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExPQ0FMOgorICAgICAgICAgICAgICAgY29tYmluZWRNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEobG9jYWxNZXRhZGF0YSk7CisgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlMaW5rTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gZ2V0QWxsTWV0YWRhdGEoa2V5KTsKKyAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoa2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gY29tYmluZWRNZXRhZGF0YTsKKyAgIH0KKworICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbGxNZXRhZGF0YShQZ2VUYXNrTWV0S2V5cyBrZXksIFR5cGUuLi4gdHlwZXMpIHsKKyAgICAgIHJldHVybiBnZXRBbGxNZXRhZGF0YShrZXkuZ2V0TmFtZSgpLCB0eXBlcyk7CisgICB9CisKKyAgIC8qKgorICAgICogR2V0IG1ldGFkYXRhIHZhbHVlcyBmb3IgZ2l2ZW4ga2V5LiBJZiBUeXBlcyBhcmUgc3BlY2lmaWVkIHRoZW4gaXQgcHJvdmlkZXMKKyAgICAqIHRoZSBwcmVjZWRlbmNlIG9yZGVyIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIGtleS4gSWYgbm8gVHlwZSBhcmdzIGFyZQorICAgICogc3BlY2lmaWVkIHRoZW4gREVGQVVMVF9RVUVSWV9PUkRFUiB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlIGlmCisgICAgKiB5b3UgcGFzcyBpbiBUeXBlIGFyZ3M6IFNUQVRJQywgTE9DQUwgdGhlbiBTVEFUSUMgbWV0YWRhdGEgd2lsbCBmaXJzdCBiZQorICAgICogY2hlY2tlZCBmb3IgdGhlIGtleSBhbmQgaWYgaXQgY29udGFpbnMgaXQsIHRoZW4gaXQgd2lsbCByZXR1cm4gdGhlIGZvdW5kCisgICAgKiB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHdpbGwgdGhlbiBjaGVjayBMT0NBTCBtZXRhZGF0YSBmb3IgdGhlIGtleSBhbmQgaWYgaXQKKyAgICAqIGZpbmRzIHRoZSB2YWx1ZSBpdCB3aWxsIHJldHVybiBpdCwgb3RoZXJ3aXNlIG51bGwuCisgICAgKiAKKyAgICAqIEBwYXJhbSBrZXkKKyAgICAqICAgICAgICAgICBUaGUga2V5IGZvciB3aG9zZSBtZXRhZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICogQHBhcmFtIHR5cGVzCisgICAgKiAgICAgICAgICAgVGhlIHR5cGUgaGllcmFyY2h5IHdoaWNoIHNob3VsZCBiZSB1c2VkLCBpZiBubyBUeXBlcyBzcGVjaWZpZWQKKyAgICAqICAgICAgICAgICBERUZBVUxUX1FVRVJZX09SREVSIHdpbGwgYmUgdXNlZC4KKyAgICAqIEByZXR1cm4gTWV0YWRhdGEgdmFsdWVzIGZvciBnaXZlbiBrZXkuCisgICAgKi8KKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsTWV0YWRhdGEoU3RyaW5nIGtleSwgVHlwZS4uLiB0eXBlcykgeworICAgICAgTGlzdDxUeXBlPiBxdWVyeU9yZGVyID0gTGlzdHMubmV3QXJyYXlMaXN0KHR5cGVzKTsKKyAgICAgIGlmIChxdWVyeU9yZGVyLmlzRW1wdHkoKSkgeworICAgICAgICAgcXVlcnlPcmRlci5hZGRBbGwoREVGQVVMVF9RVUVSWV9PUkRFUik7CisgICAgICB9CisKKyAgICAgIFN0cmluZyB1c2VLZXkgPSByZXNvbHZlS2V5KGtleSk7CisgICAgICBmb3IgKFR5cGUgdHlwZSA6IHF1ZXJ5T3JkZXIpIHsKKyAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBEWU5BTUlDOgorICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNNZXRhZGF0YS5jb250YWluc0tleSh1c2VLZXkpKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY01ldGFkYXRhLmdldEFsbE1ldGFkYXRhKHVzZUtleSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgaWYgKHN0YXRpY01ldGFkYXRhLmNvbnRhaW5zS2V5KHVzZUtleSkpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSh1c2VLZXkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExPQ0FMOgorICAgICAgICAgICAgICAgaWYgKGxvY2FsTWV0YWRhdGEuY29udGFpbnNLZXkodXNlS2V5KSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEodXNlS2V5KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFkYXRhKFBnZVRhc2tNZXRLZXlzIGtleSwgVHlwZS4uLiB0eXBlcykgeworICAgICAgcmV0dXJuIGdldE1ldGFkYXRhKGtleS5nZXROYW1lKCksIHR5cGVzKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB2YWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldEFsbE1ldGFkYXRhKFN0cmluZywgVHlwZS4uLil9LCBpZiBpdCByZXR1cm5zCisgICAgKiBudWxsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBhbHNvIHJldHVybiBudWxsLgorICAgICovCisgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFkYXRhKFN0cmluZyBrZXksIFR5cGUuLi4gdHlwZXMpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBnZXRBbGxNZXRhZGF0YShrZXksIHR5cGVzKTsKKyAgICAgIHJldHVybiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMuc2l6ZSgpID4gMCA/IHZhbHVlcy5nZXQoMCkgOiBudWxsOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9tZXRhZGF0YS9QZ2VUYXNrTWV0S2V5cy5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9tZXRhZGF0YS9QZ2VUYXNrTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjBiNTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL21ldGFkYXRhL1BnZVRhc2tNZXRLZXlzLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YTsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCisvKioKKyAqIFBHRVRhc2tJbnN0YW5jZSBSZXNlcnZlZCBNZXRhZGF0YSBrZXlzLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgZW51bSBQZ2VUYXNrTWV0S2V5cyB7CisKKyAgIC8qKgorICAgICogUEdFIE5hbWUgdXNlZCB0byBjcmVhdGUgdGhlIGV4ZWN1dGlvbiBzY3JpcHQgZmlsZSBuYW1lIGFuZCBuYW1lIHRoZSBKYXZhIExvZ2dlci4KKyAgICAqLworICAgTkFNRSgKKyAgICAgICAgICJQR0VUYXNrL05hbWUiLAorICAgICAgICAgIlBHRVRhc2tfTmFtZSIpLAorICAgLyoqCisgICAgKiBQYXRoIHRvIENBUy1QR0UncyBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgKi8KKyAgIENPTkZJR19GSUxFX1BBVEgoCisgICAgICAgICAiUEdFVGFzay9Db25maWdGaWxlUGF0aCIsCisgICAgICAgICAiUEdFVGFza19Db25maWdGaWxlUGF0aCIpLAorICAgLyoqCisgICAgKiBDQVMtUEdFJ3MgQ29uZmlnQnVpbGRlciBjbGFzc3BhdGguCisgICAgKi8KKyAgIFBHRV9DT05GSUdfQlVJTERFUigKKyAgICAgICAgICJQR0VUYXNrL1BnZUNvbmZpZ0J1aWxkZXIiLAorICAgICAgICAgIlBHRVRhc2tfUGdlQ29uZmlnQnVpbGRlciIpLAorICAgLyoqCisgICAgKiBUaGUgamF2YSBsb2dnZXIge0BsaW5rIEZpbGVIYW5kbGVyfSBwYXR0ZXJuIChvbmx5IGZvciBmaWxlbmFtZSB0aG91Z2gpLgorICAgICovCisgICBMT0dfRklMRU5BTUVfUEFUVEVSTigKKyAgICAgICAgICJQR0VUYXNrL0xvZ0ZpbGVuYW1lUGF0dGVybiIsCisgICAgICAgICAiUEdFVGFza19Mb2dGaWxlbmFtZVBhdHRlcm4iKSwKKyAgIC8qKgorICAgICogTGlzdCBvZiB7QGxpbmsgQ29uZmlnRmlsZVByb3BlcnR5QWRkZXJ9cyBjbGFzc3BhdGhzIHRvIGJlIHJ1bi4KKyAgICAqLworICAgUFJPUEVSVFlfQURERVJTKAorICAgICAgICAgIlBHRVRhc2svUHJvcGVydHlBZGRlcnMiLAorICAgICAgICAgIlBHRVRhc2tfUHJvcGVydHlBZGRlckNsYXNzcGF0aCIsCisgICAgICAgICB0cnVlKSwKKyAgIC8qKgorICAgICoge0BsaW5rIEZpbGVTdGFnZXJ9cyBjbGFzc3BhdGguCisgICAgKi8KKyAgIEZJTEVfU1RBR0VSKAorICAgICAgICAgIlBHRVRhc2svRmlsZVN0YWdlciIsCisgICAgICAgICAiUEdFVGFza19GaWxlU3RhZ2VyIiksCisgICAvKioKKyAgICAqIExpc3Qgb2Yge0BsaW5rIENvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyfXMgY2xhc3NwYXRocyB0byBiZSBydW4uCisgICAgKi8KKyAgIERVTVBfTUVUQURBVEEoCisgICAgICAgICAiUEdFVGFzay9EdW1wTWV0YWRhdGEiLAorICAgICAgICAgIlBHRVRhc2tfRHVtcE1ldGFkYXRhIiksCisgICAvKioKKyAgICAqIFNldCBieSBDQVMtUEdFIHRvIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgQ0FTLVBHRSB0byBydW4uCisgICAgKi8KKyAgIFBHRV9SVU5USU1FKAorICAgICAgICAgIlBHRVRhc2svUnVudGltZSIsCisgICAgICAgICAiUEdFVGFza19SdW50aW1lIiksCisgICAvKioKKyAgICAqIENBUyBXb3JrZmxvdyBNYW5hZ2VyIFVSTCB0byB3aGljaCBDQVMtUEdFIHNob3VsZCB1cGRhdGUgaXQncyBzdGF0dXMKKyAgICAqIGFuZCBtZXRhZGF0YS4KKyAgICAqLworICAgV09SS0ZMT1dfTUFOQUdFUl9VUkwoCisgICAgICAgICAiUEdFVGFzay9Xb3JrZmxvd01hbmFnZXJVcmwiLAorICAgICAgICAgIlBDU19Xb3JrZmxvd01hbmFnZXJVcmwiKSwKKyAgIC8qKgorICAgICogQ0FTIEZpbGUgTWFuYWdlciBVUkwgdXNlZCBmb3IgcXVlcmllcy4KKyAgICAqLworICAgUVVFUllfRklMRV9NQU5BR0VSX1VSTCgKKyAgICAgICAgICJQR0VUYXNrL1F1ZXJ5L0ZpbGVNYW5hZ2VyVXJsIiwKKyAgICAgICAgICJQQ1NfRmlsZU1hbmFnZXJVcmwiKSwKKyAgIC8qKgorICAgICogQ0FTIEZpbGUgTWFuYWdlciBVUkwgdXNlZCBmb3IgcHJvZHVjdCBpbmdlc3Rpb24uCisgICAgKi8KKyAgIElOR0VTVF9GSUxFX01BTkFHRVJfVVJMKAorICAgICAgICAgIlBHRVRhc2svSW5nZXN0L0ZpbGVNYW5hZ2VyVXJsIiwKKyAgICAgICAgICJQQ1NfRmlsZU1hbmFnZXJVcmwiKSwKKyAgIC8qKgorICAgICogVGhlIHtAbGluayBEYXRhVHJhbnNmZXJGYWN0b3J5fSB1c2VkIGZvciBwcm9kdWN0IHN0YWdpbmcuCisgICAgKi8KKyAgIFFVRVJZX0NMSUVOVF9UUkFOU0ZFUl9TRVJWSUNFX0ZBQ1RPUlkoCisgICAgICAgICAiUEdFVGFzay9RdWVyeS9DbGllbnRUcmFuc2ZlclNlcnZpY2VGYWN0b3J5IiwKKyAgICAgICAgICJQQ1NfQ2xpZW50VHJhbnNmZXJTZXJ2aWNlRmFjdG9yeSIpLAorICAgLyoqCisgICAgKiBUaGUge0BsaW5rIERhdGFUcmFuc2ZlckZhY3Rvcnl9IHVzZWQgZm9yIHByb2R1Y3QgaW5nZXN0aW9uLgorICAgICovCisgICBJTkdFU1RfQ0xJRU5UX1RSQU5TRkVSX1NFUlZJQ0VfRkFDVE9SWSgKKyAgICAgICAgICJQR0VUYXNrL0luZ2VzdC9DbGllbnRUcmFuc2ZlclNlcnZpY2VGYWN0b3J5IiwKKyAgICAgICAgICJQQ1NfQ2xpZW50VHJhbnNmZXJTZXJ2aWNlRmFjdG9yeSIpLAorICAgLyoqCisgICAgKiBQYXRoIHRvIENyYXdsZXIgU3ByaW5nIFhNTCBjb25maWcgZmlsZS4KKyAgICAqLworICAgQ1JBV0xFUl9DT05GSUdfRklMRSgKKyAgICAgICAgICJQR0VUYXNrL0luZ2VzdC9DcmF3bGVyQ29uZmlnRmlsZSIsCisgICAgICAgICAiUENTX0FjdGlvblJlcG9GaWxlIiksCisgICAvKioKKyAgICAqIFRoZSBJRHMgb2YgdGhlIHtAbGluayBDcmF3bGVyQWN0aW9ufXMgaW4gdGhlIHtAbGluayAjQUNUSU9OX1JFUE9fRklMRX0gdG8gcnVuLgorICAgICovCisgICBBQ1RJT05fSURTKAorICAgICAgICAgIlBHRVRhc2svSW5nZXN0L0FjdGlvbnNJZHMiLAorICAgICAgICAgIlBDU19BY3Rpb25zSWRzIiwKKyAgICAgICAgIHRydWUpLAorICAgLyoqCisgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGUgY3Jhd2xlciB3aWxsIGNyYXdsIGZvciBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGZpbGVzLgorICAgICovCisgICBDUkFXTEVSX0NSQVdMX0ZPUl9ESVJTKAorICAgICAgICAgIlBHRVRhc2svSW5nZXN0L0NyYXdsZXJDcmF3bEZvckRpcnMiLAorICAgICAgICAgIlBDU19DcmF3bGVyQ3Jhd2xGb3JEaXJzIiksCisgICAvKioKKyAgICAqIElmIHNldCB0byB0cnVlIHRoZSBjcmF3bGVyIHdpbGwgcGVyZm9ybSBhIGRlZXAgY3Jhd2wgZm9yIGZpbGVzLgorICAgICovCisgICBDUkFXTEVSX1JFQ1VSKAorICAgICAgICAgIlBHRVRhc2svSW5nZXN0L0NyYXdsZXJSZWN1ciIsCisgICAgICAgICAiUENTX0NyYXdsZXJSZWN1ciIpLAorICAgLyoqCisgICAgKiBQYXRoIHRvIEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlcidzIE1pbWVFeHRyYWN0b3JSZXBvIFhNTCBjb25maWcuCisgICAgKi8KKyAgIE1JTUVfRVhUUkFDVE9SX1JFUE8oCisgICAgICAgICAiUEdFVGFzay9Jbmdlc3QvTWltZUV4dHJhY3RvclJlcG8iLAorICAgICAgICAgIlBHRVRhc2tfTWltZUV4dHJhY3RvclJlcG8iKSwKKyAgIC8qKgorICAgICogTGlzdCBvZiBtZXRhZGF0YSBrZXlzIHJlcXVpcmVkIGZvciBQcm9kdWN0IGluZ2VzdC4KKyAgICAqLworICAgUkVRVUlSRURfTUVUQURBVEEoCisgICAgICAgICAiUEdFVGFzay9Jbmdlc3QvUmVxdWlyZWRNZXRhZGF0YSIsCisgICAgICAgICAiUENTX1JlcXVpcmVkTWV0YWRhdGEiLAorICAgICAgICAgdHJ1ZSksCisgICAvKioKKyAgICAqIElmIHNldCB0byB0cnVlIHRoZW4gd2lsbCBhdHRlbXB0IHRvIGluZ2VzdCBhbGwgUHJvZHVjdCdzIGV2ZW4gaWYgb25lCisgICAgKiBmYWlscy4gSWYgZmFsc2UsIHdpbGwgYmFpbCBpbmdlc3QgYWZ0ZXIgZmlyc3QgZmFpbGVkIFByb2R1Y3QgaW5nZXN0LgorICAgICovCisgICBBVFRFTVBUX0lOR0VTVF9BTEwoCisgICAgICAgICAiUEdFVGFzay9Jbmdlc3QvQXR0ZW1wdEluZ2VzdEFsbCIsCisgICAgICAgICAiUEdFVGFza19BdHRlbXB0SW5nZXN0QWxsIiksCisgICAKKyAgIC8qKgorICAgICogSWRlbnRpZmllcyB0aGUgbWV0YWRhdGEgZmlsZSBuYW1lIGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBDQVMtUEdFIAorICAgICogaXMgcnVubmluZyBpbiBsZWdhY3kgbW9kZSBhbmQgZ2VuZXJhdGluZyBtZXRhZGF0YSBmaWxlcyBmb3IgdGhlIAorICAgICogU3RkUHJvZHVjdENyYXdsZXIuIElmIG5vdCBzZXQsIHdpbGwgZGVmYXVsdCBpbiBDQVMtUEdFIHRvIC5tZXQuCisgICAgKiBOb3RlLCB0aGVyZSBpcyBubyBuZXcgdmVyc2lvbiBvZiB0aGlzIHByb3BlcnR5LCBpdCBvbmx5IGV4aXN0cyBpbgorICAgICogbGVnYWN5IG1vZGUsIGJ1dCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcHJvdmlkZSBhIG5ldyBwYXRoIHN0eWxlL2dyb3VwZWQKKyAgICAqIHZlcnNpb24gb2YgdGhlIGtleSBmb3IgZm9yd2FyZCBjb21wYXQuCisgICAgKi8KKyAgIE1FVF9GSUxFX0VYVCgiUEdFVGFzay9Jbmdlc3QvTWV0RmlsZUV4dGVuc2lvbiIsIAorICAgICAgICAgICAgICAgICJQQ1NfTWV0RmlsZUV4dGVuc2lvbiIpOworCisKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9MRUdBQ1lfUFJPUEVSVFkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudGFzay5tZXRrZXlzLmxlZ2FjeU1vZGUiOworCisgICBAVmlzaWJsZUZvclRlc3RpbmcgU3RyaW5nIG5hbWU7CisgICBAVmlzaWJsZUZvclRlc3RpbmcgU3RyaW5nIGxlZ2FjeU5hbWU7CisgICBwcml2YXRlIGJvb2xlYW4gaXNWZWN0b3I7CisKKyAgIFBnZVRhc2tNZXRLZXlzKFN0cmluZyBuYW1lLCBTdHJpbmcgbGVnYWN5TmFtZSkgeworICAgICAgdGhpcyhuYW1lLCBsZWdhY3lOYW1lLCBmYWxzZSk7CisgICB9CisKKyAgIFBnZVRhc2tNZXRLZXlzKFN0cmluZyBuYW1lLCBTdHJpbmcgbGVnYWN5TmFtZSwgYm9vbGVhbiBpc1ZlY3RvcikgeworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIHRoaXMubGVnYWN5TmFtZSA9IGxlZ2FjeU5hbWU7CisgICAgICB0aGlzLmlzVmVjdG9yID0gaXNWZWN0b3I7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgIHJldHVybiBCb29sZWFuLmdldEJvb2xlYW4oVVNFX0xFR0FDWV9QUk9QRVJUWSkgPyBsZWdhY3lOYW1lIDogbmFtZTsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gaXNWZWN0b3IoKSB7CisgICAgICByZXR1cm4gaXNWZWN0b3I7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgUGdlVGFza01ldEtleXMgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICBmb3IgKFBnZVRhc2tNZXRLZXlzIGtleSA6IHZhbHVlcygpKSB7CisgICAgICAgICBpZiAoa2V5LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvbWV0YWRhdGEvUGdlVGFza1N0YXR1cy5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9tZXRhZGF0YS9QZ2VUYXNrU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhZjU3NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvbWV0YWRhdGEvUGdlVGFza1N0YXR1cy5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YTsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCisvKioKKyAqIFdvcmtmbG93IFN0YXR1c2VzIGZvciB7QGxpbmsgUEdFVGFza0luc3RhbmNlfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICovCitwdWJsaWMgZW51bSBQZ2VUYXNrU3RhdHVzIHsKKwkKKwkvKioKKwkgKiBUaGUgUEdFIGlzIHN0YWdpbmcgaXRzIGlucHV0IHRvIHRoZSBqb2Igd29ya2luZyBkaXJlY3RvcnkuCisJICovCisgICBTVEFHSU5HX0lOUFVUKCJQR0VUYXNrX1N0YWdpbmdfSW5wdXQiLCAiU1RBR0lORyBJTlBVVCIpLAorICAgCisgICAvKioKKyAgICAqIFRoZSBQR0UgaXMgYnVpbGRpbmcgaXRzIGludGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAqLworICAgQ09ORl9GSUxFX0JVSUxEKCJQR0VUYXNrX0J1aWxkaW5nX0NvbmZpZ19GaWxlIiwgIkJVSUxESU5HIENPTkZJRyBGSUxFIiksCisgICAKKyAgIC8qKgorICAgICogVGhlIFBHRSBpcyBleGVjdXRpbmcuCisgICAgKi8KKyAgIFJVTk5JTkdfUEdFKCJQR0VUYXNrX1J1bm5pbmciLCAiUEdFIEVYRUMiKSwKKyAgIAorICAgLyoqCisgICAgKiBUaGUgaW5nZXN0IGNyYXdsZXIgaGFzIGJlZW4gY3JlYXRlZCwgZWl0aGVyIGEgU3RkUHJvZHVjdENyYXdsZXIKKyAgICAqIG9yIGlmIHtAbGluayBQZ2VUYXNrTWV0S2V5cyNNSU1FX0VYVFJBQ1RPUl9SRVBPfSBoYXMgYmVlbiBzcGVjaWZpZWQKKyAgICAqIGFuIEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci4KKyAgICAqLworICAgQ1JBV0xJTkcoIlBHRVRhc2tfQ3Jhd2xpbmciLCAiQ1JBV0xJTkciKTsKKworICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0xFR0FDWV9TVEFUVVNfUFJPUEVSVFkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudGFzay5zdGF0dXMubGVnYWN5TW9kZSI7CisgICAKKyAgIEBWaXNpYmxlRm9yVGVzdGluZyBwcml2YXRlIFN0cmluZyB3b3JrZmxvd1N0YXR1c05hbWU7CisgICBAVmlzaWJsZUZvclRlc3RpbmcgcHJpdmF0ZSBTdHJpbmcgbGVnYWN5TmFtZTsKKworICAgUGdlVGFza1N0YXR1cyhTdHJpbmcgd29ya2Zsb3dTdGF0dXNOYW1lLCBTdHJpbmcgbGVnYWN5TmFtZSkgeworICAgICAgdGhpcy53b3JrZmxvd1N0YXR1c05hbWUgPSB3b3JrZmxvd1N0YXR1c05hbWU7CisgICAgICB0aGlzLmxlZ2FjeU5hbWUgPSBsZWdhY3lOYW1lOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtmbG93U3RhdHVzTmFtZSgpIHsKKyAgICAgIHJldHVybiBCb29sZWFuLmdldEJvb2xlYW4oVVNFX0xFR0FDWV9TVEFUVVNfUFJPUEVSVFkpID8gdGhpcy5sZWdhY3lOYW1lOnRoaXMud29ya2Zsb3dTdGF0dXNOYW1lOworICAgfQorICAgCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gZ2V0V29ya2Zsb3dTdGF0dXNOYW1lKCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3F1ZXJ5L2NvbnYvRGF0ZVZlcnNpb25Db252ZXJ0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvcXVlcnkvY29udi9EYXRlVmVyc2lvbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3F1ZXJ5L2NvbnYvRGF0ZVZlcnNpb25Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnF1ZXJ5LmNvbnY7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuY29udi5WZXJzaW9uQ29udmVydGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIERhdGVWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgVmVyc2lvbkNvbnZlcnRlciB7CisKKyAgICBwdWJsaWMgZG91YmxlIGNvbnZlcnRUb1ByaW9yaXR5KFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBDYWxlbmRhciBjYWwgPSBEYXRlVXRpbHMudG9DYWxlbmRhcih2ZXJzaW9uLAorICAgICAgICAgICAgICAgIERhdGVVdGlscy5Gb3JtYXRUeXBlLlVUQ19GT1JNQVQpOworICAgICAgICByZXR1cm4gKGNhbC5nZXQoQ2FsZW5kYXIuWUVBUikgKiAxMDAwMCkKKyAgICAgICAgICAgICAgICArICgoY2FsLmdldChDYWxlbmRhci5NT05USCkgKyAxKSAqIDEwMCkKKyAgICAgICAgICAgICAgICArIChjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9zdGFnaW5nL0ZpbGVNYW5hZ2VyRmlsZVN0YWdlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9zdGFnaW5nL0ZpbGVNYW5hZ2VyRmlsZVN0YWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2MwZmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3N0YWdpbmcvRmlsZU1hbmFnZXJGaWxlU3RhZ2VyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnN0YWdpbmc7CisKKy8vT09EVCBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5RVUVSWV9DTElFTlRfVFJBTlNGRVJfU0VSVklDRV9GQUNUT1JZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5RVUVSWV9GSUxFX01BTkFHRVJfVVJMOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuUmVtb3RlRGF0YVRyYW5zZmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5HZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZU1ldGFkYXRhOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQSB7QGxpbmsgRmlsZVN0YWdlcn0gd2hpY2ggdXNlcyBhIEZpbGVNYW5hZ2VyIHtAbGluayBEYXRhVHJhbnNmZXJlcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTWFuYWdlckZpbGVTdGFnZXIgZXh0ZW5kcyBGaWxlU3RhZ2VyIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBzdGFnZUZpbGUoVVJJIHN0YWdlRmlsZSwgRmlsZSBkZXN0RGlyLAorICAgICAgICAgUGdlTWV0YWRhdGEgcGdlTWV0YWRhdGEsIExvZ2dlciBsb2dnZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgRGF0YVRyYW5zZmVyIGRhdGFUcmFuc2ZlcmVyID0gY3JlYXRlRGF0YVRyYW5zZmVyKHBnZU1ldGFkYXRhLCBsb2dnZXIpOworICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAiVXNpbmcgRGF0YVRyYW5zZmVyIFsiCisgICAgICAgICAgICAgICArIGRhdGFUcmFuc2ZlcmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIl0iKTsKKyAgICAgIHNldEZpbGVNYW5hZ2VyVXJsKGRhdGFUcmFuc2ZlcmVyLCBwZ2VNZXRhZGF0YSwgbG9nZ2VyKTsKKyAgICAgIGRhdGFUcmFuc2ZlcmVyLnJldHJpZXZlUHJvZHVjdChjcmVhdGVQcm9kdWN0KHN0YWdlRmlsZSksIGRlc3REaXIpOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHN0YXRpYyBEYXRhVHJhbnNmZXIgY3JlYXRlRGF0YVRyYW5zZmVyKFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhLAorICAgICAgICAgTG9nZ2VyIGxvZ2dlcikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKFFVRVJZX0NMSUVOVF9UUkFOU0ZFUl9TRVJWSUNFX0ZBQ1RPUlkpICE9IG51bGwpIHsKKyAgICAgICAgIHJldHVybiBHZW5lcmljRmlsZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAuZ2V0RGF0YVRyYW5zZmVyU2VydmljZUZyb21GYWN0b3J5KHBnZU1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoUVVFUllfQ0xJRU5UX1RSQU5TRkVSX1NFUlZJQ0VfRkFDVE9SWSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywgIlVzaW5nIGRlZmF1bHQgRGF0YVRyYW5zZmVyZXIiKTsKKyAgICAgICAgIHJldHVybiBuZXcgUmVtb3RlRGF0YVRyYW5zZmVyRmFjdG9yeSgpLmNyZWF0ZURhdGFUcmFuc2ZlcigpOworICAgICAgfQorICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHN0YXRpYyB2b2lkIHNldEZpbGVNYW5hZ2VyVXJsKERhdGFUcmFuc2ZlciBkYXRhVHJhbnNmZXJlciwKKyAgICAgICAgIFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhLCBMb2dnZXIgbG9nZ2VyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgIFN0cmluZyBmaWxlbWdyVXJsID0gcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoUVVFUllfRklMRV9NQU5BR0VSX1VSTCk7CisgICAgICBpZiAoZmlsZW1nclVybCAhPSBudWxsKSB7CisgICAgICAgICBkYXRhVHJhbnNmZXJlci5zZXRGaWxlTWFuYWdlclVybChuZXcgVVJMKGZpbGVtZ3JVcmwpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJNZXRhZGF0YSBmaWVsZCBbIiArIFFVRVJZX0ZJTEVfTUFOQUdFUl9VUkwKKyAgICAgICAgICAgICAgICsgIl0gd2FzIG5vdCBzZXQsIGlmIERhdGFUcmFuZmVyZXIgcmVxdWlyZXMgZmlsZW1nciBzZXJ2ZXIsIgorICAgICAgICAgICAgICAgKyAiIHlvdXIgdHJhbnNmZXJzIHdpbGwgZmFpbCIpOworICAgICAgfQorICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHN0YXRpYyBQcm9kdWN0IGNyZWF0ZVByb2R1Y3QoVVJJIHBhdGgpIHsKKyAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSgpOworICAgICAgcmVmZXJlbmNlLnNldERhdGFTdG9yZVJlZmVyZW5jZShwYXRoLnRvU3RyaW5nKCkpOworICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhMaXN0cy5uZXdBcnJheUxpc3QocmVmZXJlbmNlKSk7CisgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvc3RhZ2luZy9GaWxlU3RhZ2VyLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3N0YWdpbmcvRmlsZVN0YWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjIyYTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3N0YWdpbmcvRmlsZVN0YWdlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uuc3RhZ2luZzsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLlFVRVJZX0ZJTEVfTUFOQUdFUl9VUkw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5GaWxlU3RhZ2luZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlTWV0YWRhdGE7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIFJlc3BvbnNpYmxlIGZvciB0cmFuc2ZlcnJpbmcgUHJvZHVjdCBmaWxlcyB0byBhIGRpcmVjdG9yeSBhY2Nlc3NpYmxlIGJ5CisgKiBieSBDQVMtUEdFLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZVN0YWdlciB7CisKKyAgIHB1YmxpYyB2b2lkIHN0YWdlRmlsZXMoRmlsZVN0YWdpbmdJbmZvIGZpbGVTdGFnaW5nSW5mbywKKyAgICAgICAgIFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhLCBMb2dnZXIgbG9nZ2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywgIkNyZWF0aW5nIHN0YWdpbmcgZGlyZWN0b3J5IFsiCisgICAgICAgICAgICArIGZpbGVTdGFnaW5nSW5mby5nZXRTdGFnaW5nRGlyKCkgKyAiXSIpOworICAgICAgbmV3IEZpbGUoZmlsZVN0YWdpbmdJbmZvLmdldFN0YWdpbmdEaXIoKSkubWtkaXJzKCk7CisgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZVN0YWdpbmdJbmZvLmdldEZpbGVQYXRocygpKSB7CisgICAgICAgICBGaWxlIGZpbGVIYW5kbGUgPSBuZXcgRmlsZShmaWxlKTsKKyAgICAgICAgIGlmIChmaWxlU3RhZ2luZ0luZm8uaXNGb3JjZVN0YWdpbmcoKSB8fCAhZmlsZUhhbmRsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAiU3RhZ2luZyBmaWxlIFsiICsgZmlsZQorICAgICAgICAgICAgICAgICAgKyAiXSB0byBkaXJlY3RvcnkgWyIKKyAgICAgICAgICAgICAgICAgICsgZmlsZVN0YWdpbmdJbmZvLmdldFN0YWdpbmdEaXIoKSArICJdIik7CisgICAgICAgICAgICBzdGFnZUZpbGUoYXNVUkkoZmlsZSksIG5ldyBGaWxlKGZpbGVTdGFnaW5nSW5mby5nZXRTdGFnaW5nRGlyKCkpLAorICAgICAgICAgICAgICAgICAgcGdlTWV0YWRhdGEsIGxvZ2dlcik7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZpbGVTdGFnaW5nSW5mby5nZXRQcm9kdWN0SWRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbUNsaWVudCA9IGNyZWF0ZUZpbGVNYW5hZ2VyQ2xpZW50KHBnZU1ldGFkYXRhKTsKKyAgICAgICAgIGZvciAoU3RyaW5nIHByb2R1Y3RJZCA6IGZpbGVTdGFnaW5nSW5mby5nZXRQcm9kdWN0SWRzKCkpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywgIlN0YWdpbmcgcHJvZHVjdCBbIiArIHByb2R1Y3RJZAorICAgICAgICAgICAgICAgICAgKyAiXSB0byBkaXJlY3RvcnkgWyIKKyAgICAgICAgICAgICAgICAgICsgZmlsZVN0YWdpbmdJbmZvLmdldFN0YWdpbmdEaXIoKSArICJdIik7CisgICAgICAgICAgICBmb3IgKFVSSSB1cmkgOiBnZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0SWQsIGZtQ2xpZW50KSkgeworICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAiU3RhZ2luZyBwcm9kdWN0IFsiICsgcHJvZHVjdElkCisgICAgICAgICAgICAgICAgICAgICArICJdIHJlZmVyZW5jZSBbIiArIHVyaQorICAgICAgICAgICAgICAgICAgICAgKyAiXSB0byBkaXJlY3RvcnkgWyIKKyAgICAgICAgICAgICAgICAgICAgICsgZmlsZVN0YWdpbmdJbmZvLmdldFN0YWdpbmdEaXIoKSArICJdIik7CisgICAgICAgICAgICAgICBzdGFnZUZpbGUodXJpLCBuZXcgRmlsZShmaWxlU3RhZ2luZ0luZm8uZ2V0U3RhZ2luZ0RpcigpKSwKKyAgICAgICAgICAgICAgICAgICAgIHBnZU1ldGFkYXRhLCBsb2dnZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHN0YXRpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjcmVhdGVGaWxlTWFuYWdlckNsaWVudChQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgU3RyaW5nIGZpbGVtZ3JVcmwgPSBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShRVUVSWV9GSUxFX01BTkFHRVJfVVJMKTsKKyAgICAgIGlmIChmaWxlbWdyVXJsID09IG51bGwpIHsKKyAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBbIiArIFFVRVJZX0ZJTEVfTUFOQUdFUl9VUkwKKyAgICAgICAgICAgICAgICsgIl0gaWYgeW91IHdhbnQgdG8gc3RhZ2UgcHJvZHVjdCBJRHMiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTChmaWxlbWdyVXJsKSk7CisgICB9CisKKyAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgc3RhdGljIExpc3Q8VVJJPiBnZXRQcm9kdWN0UmVmZXJlbmNlcygKKyAgICAgICAgIFN0cmluZyBwcm9kdWN0SWQsIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZtQ2xpZW50KQorICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgQ2F0YWxvZ0V4Y2VwdGlvbiB7CisgICAgICBMaXN0PFVSST4gZmlsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KCk7CisgICAgICBwcm9kdWN0LnNldFByb2R1Y3RJZChwcm9kdWN0SWQpOworICAgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBmbUNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICAgIGZvciAoUmVmZXJlbmNlIHJlZiA6IHJlZnMpIHsKKyAgICAgICAgIGZpbGVzLmFkZChuZXcgVVJJKHJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZpbGVzOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHN0YXRpYyBVUkkgYXNVUkkoU3RyaW5nIHBhdGgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgVmFsaWRhdGUubm90TnVsbChwYXRoLCAicGF0aCBtdXN0IG5vdCBiZSBudWxsIik7CisKKyAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHBhdGgpOworICAgICAgaWYgKHVyaS5nZXRTY2hlbWUoKSA9PSBudWxsKSB7CisgICAgICAgICB1cmkgPSBVUkkuY3JlYXRlKCJmaWxlOi8vIiArIG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB1cmk7CisgICB9CisKKyAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YWdlRmlsZShVUkkgc3RhZ2VGaWxlLCBGaWxlIGRlc3REaXIsCisgICAgICAgICBQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSwgTG9nZ2VyIGxvZ2dlcikgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9HZW5lcmljUGdlT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS91dGlsL0dlbmVyaWNQZ2VPYmplY3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNTllMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9HZW5lcmljUGdlT2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuQ29uZmlnRmlsZVByb3BlcnR5QWRkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuUEdFVGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnN0YWdpbmcuRmlsZVN0YWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLkR5bmFtaWNDb25maWdGaWxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuU2NpUGdlQ29uZmlnRmlsZVdyaXRlcjsKKworLyoqCisgKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgT2JqZWN0fXMuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljUGdlT2JqZWN0RmFjdG9yeSB7CisKKyAgIHByaXZhdGUgR2VuZXJpY1BnZU9iamVjdEZhY3RvcnkoKSB7fQorCisgICBwdWJsaWMgc3RhdGljIFBHRVRhc2tJbnN0YW5jZSBjcmVhdGVQR0VUYXNrSW5zdGFuY2UoCisgICAgICAgICBTdHJpbmcgY2xhenosIExvZ2dlciBsb2dnZXIpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICByZXR1cm4gKFBHRVRhc2tJbnN0YW5jZSkgQ2xhc3MuZm9yTmFtZShjbGF6eikubmV3SW5zdGFuY2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBjcmVhdGUgUEdFVGFza0luc3RhbmNlIFsiCisgICAgICAgICAgICAgICArIGNsYXp6ICsgIl0gOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgUGdlQ29uZmlnQnVpbGRlciBjcmVhdGVQZ2VDb25maWdCdWlsZGVyKAorICAgICAgICAgU3RyaW5nIGNsYXp6LCBMb2dnZXIgbG9nZ2VyKSB7CisgICAgICB0cnkgeworICAgICAgICAgcmV0dXJuIChQZ2VDb25maWdCdWlsZGVyKSBDbGFzcy5mb3JOYW1lKGNsYXp6KS5uZXdJbnN0YW5jZSgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGNyZWF0ZSBQZ2VDb25maWdCdWlsZGVyIFsiCisgICAgICAgICAgICAgICArIGNsYXp6ICsgIl0gOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIgY3JlYXRlQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIoCisgICAgICAgICBTdHJpbmcgY2xhenosIExvZ2dlciBsb2dnZXIpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICByZXR1cm4gKENvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyKSBDbGFzcy5mb3JOYW1lKGNsYXp6KS5uZXdJbnN0YW5jZSgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGNyZWF0ZSBDb25maWdGaWxlUHJvcGVydHlBZGRlciBbIgorICAgICAgICAgICAgICAgKyBjbGF6eiArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgc3RhdGljIEZpbGVTdGFnZXIgY3JlYXRlRmlsZVN0YWdlcigKKyAgICAgICAgIFN0cmluZyBjbGF6eiwgTG9nZ2VyIGxvZ2dlcikgeworICAgICAgdHJ5IHsKKyAgICAgICAgIHJldHVybiAoRmlsZVN0YWdlcikgQ2xhc3MuZm9yTmFtZShjbGF6eikubmV3SW5zdGFuY2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBjcmVhdGUgRmlsZVN0YWdlciBbIgorICAgICAgICAgICAgICAgKyBjbGF6eiArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgc3RhdGljIFNjaVBnZUNvbmZpZ0ZpbGVXcml0ZXIgY3JlYXRlU2NpUGdlQ29uZmlnRmlsZVdyaXRlcigKKyAgICAgICAgIFN0cmluZyBjbGF6eiwgTG9nZ2VyIGxvZ2dlcikgeworICAgICAgdHJ5IHsKKyAgICAgICAgIHJldHVybiAoU2NpUGdlQ29uZmlnRmlsZVdyaXRlcikgQ2xhc3MuZm9yTmFtZShjbGF6eikubmV3SW5zdGFuY2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBjcmVhdGUgU2NpUGdlQ29uZmlnRmlsZVdyaXRlciBbIgorICAgICAgICAgICAgICAgKyBjbGF6eiArICJdIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS91dGlsL1BhaXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9QYWlyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyYzNkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9QYWlyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWw7CisKKy8qKgorICogV3JhcHBlciBjbGFzcyBhcm91bmQgMiBvYmplY3RzLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUGFpcjxUeXBlMSwgVHlwZTI+IHsKKworICAgcHJpdmF0ZSBmaW5hbCBUeXBlMSBmaXJzdDsKKyAgIHByaXZhdGUgZmluYWwgVHlwZTIgc2Vjb25kOworCisgICBwdWJsaWMgUGFpcihUeXBlMSBmaXJzdCwgVHlwZTIgc2Vjb25kKSB7CisgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CisgICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsKKyAgIH0KKworICAgcHVibGljIFR5cGUxIGdldEZpcnN0KCkgeworICAgICAgcmV0dXJuIGZpcnN0OworICAgfQorCisgICBwdWJsaWMgVHlwZTIgZ2V0U2Vjb25kKCkgeworICAgICAgcmV0dXJuIHNlY29uZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9YbWxIZWxwZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9YbWxIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjUyOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS91dGlsL1htbEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbDsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLkFSR1NfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuQ01EX1RBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuQ1JFQVRFX0JFRk9SRV9FWEVDX0FUVFI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLkNVU1RPTV9NRVRBREFUQV9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLkRJUl9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5ESVJfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5EWU5fSU5QVVRfRklMRVNfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5FTlZfUkVQTEFDRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5FTlZfUkVQTEFDRV9OT19SRUNVUl9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5FWEVfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5GSUxFX0FUVFI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLkZJTEVfU1RBR0lOR19UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLkZJTEVfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5GSUxFU19UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLkZPUkNFX0FUVFI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLklNUE9SVF9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLktFWVJFRl9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5LRVlfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuS0VZX0dFTl9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5NRVRBREFUQV9LRVlfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuTUVUQURBVEFfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5NRVRfRklMRV9XUklURVJfQ0xBU1NfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuTkFNRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5OQU1JTkdfRVhQUl9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5OQU1FU1BBQ0VfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuT1VUUFVUX1RBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuUEFUSF9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5SRU5BTUlOR19DT05WX1RBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuUkVHRVhfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuU0hFTExfVFlQRV9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5TUExJVF9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5TVEFHRV9GSUxFU19UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLlZBTF9BVFRSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuUGdlQ29uZmlnTWV0S2V5cy5XT1JLRkxPV19NRVRfQVRUUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZ01ldEtleXMuV1JJVEVSX0NMQVNTX0FUVFI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLlFVRVJZX0ZJTEVfTUFOQUdFUl9VUkw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwuUXVlcnlVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IudXRpbC5TcWxQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmZpbGVuYW1pbmcuUGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5EeW5hbWljQ29uZmlnRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuT3V0cHV0RGlyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5SZWdFeHByT3V0cHV0RmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvL0RPTSBpbXBvcnRzCitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIEhlbHAgY2xhc3Mgd2l0aCBtZXRob2QgZm9yIHBhcnNpbmcgWE1MRmlsZVBnZUNvbmZpZ0J1aWxkZXIgY29uZmlnIFhNTCBmaWxlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICovCitwdWJsaWMgY2xhc3MgWG1sSGVscGVyIHsKKworCXByaXZhdGUgWG1sSGVscGVyKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRSb290RWxlbWVudChTdHJpbmcgeG1sRmlsZVBhdGgpCisJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJcmV0dXJuIFhNTFV0aWxzLmdldERvY3VtZW50Um9vdCgKKwkJCQluZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHhtbEZpbGVQYXRoKSkpCisJCQkJLmdldERvY3VtZW50RWxlbWVudCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZ2V0SW1wb3J0cyhFbGVtZW50IGVsZW0sCisJCQlNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGltcG9ydHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKElNUE9SVF9UQUcpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCUVsZW1lbnQgaW1wb3J0RWxlbSA9IChFbGVtZW50KSBub2RlTGlzdC5pdGVtKGkpOworCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShpbXBvcnRFbGVtLCBtZXRhZGF0YSk7CisJCQlTdHJpbmcgZmlsZSA9IGdldEZpbGUoaW1wb3J0RWxlbSwgbWV0YWRhdGEpOworCQkJaW1wb3J0cy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KG5hbWVzcGFjZSwgZmlsZSkpOworCQl9CisJCXJldHVybiBpbXBvcnRzOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZShFbGVtZW50IGVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBuYW1lc3BhY2UgPSBlbGVtLmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUUik7CisJCWlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KG5hbWVzcGFjZSkpIHsKKwkJCXJldHVybiBmaWxsSW4obmFtZXNwYWNlLCBtZXRhZGF0YSwgZmFsc2UpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGUgPSBlbGVtLmdldEF0dHJpYnV0ZShGSUxFX0FUVFIpOworCQlpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShmaWxlKSkgeworCQkJcmV0dXJuIGZpbGxJbihmaWxlLCBtZXRhZGF0YSwgZmFsc2UpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Q3VzdG9tTWV0YWRhdGFFbGVtZW50KEVsZW1lbnQgcm9vdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQ1VTVE9NX01FVEFEQVRBX1RBRyk7CisJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIGlmIChub2Rlcy5nZXRMZW5ndGgoKSA9PSAxKSB7CisJCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGb3VuZCBtb3JlIHRoYW4gb25lICciICsgQ1VTVE9NX01FVEFEQVRBX1RBRworCQkJCQkrICInIGVsZW1lbnQiKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxFbGVtZW50PiBnZXRNZXRhZGF0YUVsZW1lbnRzKEVsZW1lbnQgY3VzdG9tTWV0YWRhdGFFbGVtKSB7CisJCU5vZGVMaXN0IG1ldEVsZW1zTm9kZUxpc3QgPSBjdXN0b21NZXRhZGF0YUVsZW0KKwkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoTUVUQURBVEFfVEFHKTsKKwkJTGlzdDxFbGVtZW50PiBtZXRFbGVtcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldEVsZW1zTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJbWV0RWxlbXMuYWRkKChFbGVtZW50KSBtZXRFbGVtc05vZGVMaXN0Lml0ZW0oaSkpOworCQl9CisJCXJldHVybiBtZXRFbGVtczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhZGF0YUtleShFbGVtZW50IG1ldEVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBrZXkgPSBtZXRFbGVtLmdldEF0dHJpYnV0ZShLRVlfQVRUUik7CisKKwkJLy8gbm8ga2V5IGF0dHIsIHNvIGNoZWNrIGZvciBrZXlfZ2VuIGF0dHIuCisJCWlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoa2V5KSkgeworCQkJa2V5ID0gZmlsbEluKG1ldEVsZW0uZ2V0QXR0cmlidXRlKEtFWV9HRU5fQVRUUiksIG1ldGFkYXRhKTsKKwkJfQorCisJCS8vIGlmIHN0aWxsIG5vIGtleSB2YWx1ZSwgdGhlbiBmYWlsLgorCQlpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGtleSkpIHsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBlaXRoZXIgbWV0YWRhdGEgYXR0ciAnIgorCQkJCQkrIEtFWV9BVFRSICsgIicgb3IgJyIgKyBLRVlfR0VOX0FUVFIgKyAiJyIpOworCQl9CisKKwkJLy8gZWxzZSBzdWNjZXNzIQorCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VudlJlcGxhY2VOb1JlY3VyKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlzRW52UmVwbGFjZU5vUmVjdXIgPSBlbGVtCisJCQkJLmdldEF0dHJpYnV0ZShFTlZfUkVQTEFDRV9OT19SRUNVUl9BVFRSKTsKKwkJaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShpc0VudlJlcGxhY2VOb1JlY3VyKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGlzRW52UmVwbGFjZU5vUmVjdXIudHJpbSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0cnVlIik7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbnZSZXBsYWNlKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlzRW52UmVwbGFjZSA9IGVsZW0uZ2V0QXR0cmlidXRlKEVOVl9SRVBMQUNFX0FUVFIpOworCQlpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGlzRW52UmVwbGFjZSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcmV0dXJuICFpc0VudlJlcGxhY2UudHJpbSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJmYWxzZSIpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTXVsdGlWYWx1ZShFbGVtZW50IGVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihmaWxsSW4oZWxlbS5nZXRBdHRyaWJ1dGUoU1BMSVRfQVRUUiksCisJCQkJbWV0YWRhdGEpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRNZXRhZGF0YVZhbHVlcyhFbGVtZW50IGVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworCQkvLyBSZWFkIHZhbCBhdHRyLgorCQlTdHJpbmcgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShWQUxfQVRUUik7CisKKwkJLy8gQ2hlY2sgaWYgdmFsIHRhZyB3YXMgbm90IHNwZWNpZmllZCBzZWUgaWYgdmFsdWUgd2FzIGdpdmVuIGFzIGVsZW1lbnQKKwkJLy8gdGV4dC4KKwkJaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKwkJCXZhbHVlID0gZWxlbS5nZXRUZXh0Q29udGVudCgpOworCQl9CisKKwkJLy8gSWYgdmFsdWUgd2FzIGZvdW5kLgorCQlpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKworCQkJLy8gSXMgbXVsdGktdmFsdWUgc28gc3BsaXQgdXAgdmFsdWUuCisJCQlpZiAoaXNNdWx0aVZhbHVlKGVsZW0sIG1ldGFkYXRhKSkgeworCQkJCWZvciAoU3RyaW5nIHYgOiBTcGxpdHRlci5vbigiLCIpLnNwbGl0KHZhbHVlKSkgeworCisJCQkJCS8vIENoZWNrIGZvciBlbnZSZXBsYWNlIGFuZCBwZXJmb3JtIG1ldCByZXBsYWNlbWVudCBvbiB2YWx1ZQorCQkJCQkvLyBpZiBzZXQuCisJCQkJCWlmIChpc0VudlJlcGxhY2VOb1JlY3VyKGVsZW0sIG1ldGFkYXRhKSkgeworCQkJCQkJdmFsdWVzLmFkZChmaWxsSW4odiwgbWV0YWRhdGEsIGZhbHNlKSk7CisJCQkJCX0gZWxzZSBpZiAoaXNFbnZSZXBsYWNlKGVsZW0sIG1ldGFkYXRhKSkgeworCQkJCQkJdmFsdWVzLmFkZChmaWxsSW4odiwgbWV0YWRhdGEpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIElzIHNjYWxhcgorCQkJfSBlbHNlIHsKKworCQkJCS8vIENoZWNrIGZvciBlbnZSZXBsYWNlIGFuZCBwZXJmb3JtIG1ldCByZXBsYWNlbWVudCBvbiB2YWx1ZSBpZgorCQkJCS8vIHNldC4KKwkJCQlpZiAoaXNFbnZSZXBsYWNlTm9SZWN1cihlbGVtLCBtZXRhZGF0YSkpIHsKKwkJCQkJdmFsdWUgPSBmaWxsSW4odmFsdWUsIG1ldGFkYXRhLCBmYWxzZSk7CisJCQkJfSBlbHNlIGlmIChpc0VudlJlcGxhY2UoZWxlbSwgbWV0YWRhdGEpKSB7CisJCQkJCXZhbHVlID0gZmlsbEluKHZhbHVlLCBtZXRhZGF0YSk7CisJCQkJfQorCQkJCXZhbHVlcy5hZGQodmFsdWUpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhZGF0YUtleVJlZihFbGVtZW50IGVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBrZXlSZWYgPSBlbGVtLmdldEF0dHJpYnV0ZShLRVlSRUZfQVRUUik7CisJCWlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGtleVJlZikpIHsKKworCQkJLy8gQ2hlY2sgZm9yIGVudlJlcGxhY2UgYW5kIHBlcmZvcm0gbWV0IHJlcGxhY2VtZW50IG9uIHZhbHVlIGlmIHNldC4KKwkJCWlmIChpc0VudlJlcGxhY2VOb1JlY3VyKGVsZW0sIG1ldGFkYXRhKSkgeworCQkJCWtleVJlZiA9IGZpbGxJbihrZXlSZWYsIG1ldGFkYXRhLCBmYWxzZSk7CisJCQl9IGVsc2UgaWYgKGlzRW52UmVwbGFjZShlbGVtLCBtZXRhZGF0YSkpIHsKKwkJCQlrZXlSZWYgPSBmaWxsSW4oa2V5UmVmLCBtZXRhZGF0YSk7CisJCQl9CisKKwkJCXJldHVybiBrZXlSZWY7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dvcmtmbG93TWV0S2V5KEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKGZpbGxJbigKKwkJCQllbGVtLmdldEF0dHJpYnV0ZShXT1JLRkxPV19NRVRfQVRUUiksIG1ldGFkYXRhLCBmYWxzZSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoRWxlbWVudCBlbGVtLCBNZXRhZGF0YSBtZXRhZGF0YSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gZmlsbEluKGVsZW0uZ2V0QXR0cmlidXRlKFBBVEhfQVRUUiksIG1ldGFkYXRhLCBmYWxzZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V3JpdGVyKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZpbGxJbihlbGVtLmdldEF0dHJpYnV0ZShXUklURVJfQ0xBU1NfQVRUUiksIG1ldGFkYXRhLCBmYWxzZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0QXJncyhFbGVtZW50IGVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiBhcmdzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisJCWZvciAoU3RyaW5nIGFyZyA6IFNwbGl0dGVyLm9uKCIsIikuc3BsaXQoZWxlbS5nZXRBdHRyaWJ1dGUoQVJHU19BVFRSKSkpIHsKKwkJCWFyZ3MuYWRkKGZpbGxJbihhcmcsIG1ldGFkYXRhLCBmYWxzZSkpOworCQl9CisJCWlmIChhcmdzLnNpemUoKSA9PSAxICYmIFN0cmluZ3MuaXNOdWxsT3JFbXB0eShhcmdzLmdldCgwKSkpIHsKKwkJCXJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBhcmdzOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PER5bmFtaWNDb25maWdGaWxlPiBnZXREeW5hbWljQ29uZmlnRmlsZXMoRWxlbWVudCBlbGVtLAorCQkJTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PER5bmFtaWNDb25maWdGaWxlPiBkeW5hbWljQ29uZmlnRmlsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKERZTl9JTlBVVF9GSUxFU19UQUcpOworCisJCS8vIENoZWNrIGlmIGR5bklucHV0IGVsZW1lbnQgZXhpc3RzLgorCQlpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisJCQlFbGVtZW50IGR5bmFtaWNDb25maWdGaWxlc0VsZW0gPSAoRWxlbWVudCkgbm9kZUxpc3QuaXRlbSgwKTsKKwkJCW5vZGVMaXN0ID0gZHluYW1pY0NvbmZpZ0ZpbGVzRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShGSUxFX1RBRyk7CisKKwkJCS8vIExvYWQgZWFjaCBkeW5hbWljIGlucHV0IGZpbGUgaW5mb3JtYXRpb24uCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCQlFbGVtZW50IGZpbGVFbGVtID0gKEVsZW1lbnQpIG5vZGVMaXN0Lml0ZW0oaSk7CisJCQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKGZpbGVFbGVtLCBtZXRhZGF0YSk7CisJCQkJU3RyaW5nIHdyaXRlciA9IGdldFdyaXRlcihmaWxlRWxlbSwgbWV0YWRhdGEpOworCQkJCUxpc3Q8U3RyaW5nPiBhcmdzID0gZ2V0QXJncyhmaWxlRWxlbSwgbWV0YWRhdGEpOworCQkJCWR5bmFtaWNDb25maWdGaWxlcy5hZGQobmV3IER5bmFtaWNDb25maWdGaWxlKHBhdGgsIHdyaXRlciwgYXJncworCQkJCQkJLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZHluYW1pY0NvbmZpZ0ZpbGVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRFeGUoRWxlbWVudCBlbGVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKEVYRV9UQUcpOworCQlpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKSB7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4gb25seSBzcGVjaWZ5ICciICsgRVhFX1RBRyArICInIG9uY2UhIik7CisJCX0gZWxzZSBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMSkgeworCQkJcmV0dXJuIChFbGVtZW50KSBub2RlTGlzdC5pdGVtKDApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXIoRWxlbWVudCBlbGVtLCBNZXRhZGF0YSBtZXRhZGF0YSkKKwkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBmaWxsSW4oZWxlbS5nZXRBdHRyaWJ1dGUoRElSX0FUVFIpLCBtZXRhZGF0YSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2hlbGxUeXBlKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZmlsbEluKGVsZW0uZ2V0QXR0cmlidXRlKFNIRUxMX1RZUEVfQVRUUiksIG1ldGFkYXRhKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRFeGVDbWRzKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBET01FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiBleGVDbWRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisJCU5vZGVMaXN0IG5vZGVMaXN0ID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShDTURfVEFHKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlFbGVtZW50IGNtZEVsZW0gPSAoRWxlbWVudCkgbm9kZUxpc3QuaXRlbShpKTsKKwkJCVN0cmluZyBleGVDbWQgPSBjbWRFbGVtLmdldFRleHRDb250ZW50KCk7CisJCQlpZiAoaXNFbnZSZXBsYWNlTm9SZWN1cihjbWRFbGVtLCBtZXRhZGF0YSkpIHsKKwkJCQlleGVDbWQgPSBmaWxsSW4oZXhlQ21kLCBtZXRhZGF0YSwgZmFsc2UpOworCQkJfSBlbHNlIGlmIChpc0VudlJlcGxhY2UoY21kRWxlbSwgbWV0YWRhdGEpKSB7CisJCQkJZXhlQ21kID0gZmlsbEluKGV4ZUNtZCwgbWV0YWRhdGEpOworCQkJfQorCQkJZXhlQ21kcy5hZGQoZXhlQ21kKTsKKwkJfQorCQlyZXR1cm4gZXhlQ21kczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0RmlsZVN0YWdpbmcoRWxlbWVudCBlbGVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKEZJTEVfU1RBR0lOR19UQUcpOworCQlpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKSB7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4gb25seSBzcGVjaWZ5ICciICsgRklMRV9TVEFHSU5HX1RBRworCQkJCQkrICInIG9uY2UhIik7CisJCX0gZWxzZSBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMSkgeworCQkJcmV0dXJuIChFbGVtZW50KSBub2RlTGlzdC5pdGVtKDApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGb3JjZVN0YWdlKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKGZpbGxJbihlbGVtLmdldEF0dHJpYnV0ZShGT1JDRV9BVFRSKSwKKwkJCQltZXRhZGF0YSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVTdGFnaW5nTWV0YWRhdGFLZXkoRWxlbWVudCBlbGVtLAorCQkJTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gZmlsbEluKGVsZW0uZ2V0QXR0cmlidXRlKE1FVEFEQVRBX0tFWV9BVFRSKSwgbWV0YWRhdGEpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFN0YWdlRmlsZXNNZXRLZXlzKEVsZW1lbnQgZWxlbSwKKwkJCU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IG1ldEtleXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFNUQUdFX0ZJTEVTX1RBRyk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJRWxlbWVudCBzdGFnZUZpbGVzRWxlbSA9IChFbGVtZW50KSBub2RlTGlzdC5pdGVtKGkpOworCQkJbWV0S2V5cy5hZGQoZ2V0RmlsZVN0YWdpbmdNZXRhZGF0YUtleShzdGFnZUZpbGVzRWxlbSwgbWV0YWRhdGEpKTsKKwkJfQorCQlyZXR1cm4gbWV0S2V5czsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0T3V0cHV0KEVsZW1lbnQgZWxlbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU5vZGVMaXN0IG5vZGVMaXN0ID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShPVVRQVVRfVEFHKTsKKwkJaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkgeworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuIG9ubHkgc3BlY2lmeSAnIiArIE9VVFBVVF9UQUcgKyAiJyBvbmNlISIpOworCQl9IGVsc2UgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID09IDEpIHsKKwkJCXJldHVybiAoRWxlbWVudCkgbm9kZUxpc3QuaXRlbSgwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ3JlYXRlQmVmb3JlRXhlKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKGZpbGxJbigKKwkJCQllbGVtLmdldEF0dHJpYnV0ZShDUkVBVEVfQkVGT1JFX0VYRUNfQVRUUiksIG1ldGFkYXRhKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PE91dHB1dERpcj4gZ2V0T3VwdXREaXJzKEVsZW1lbnQgZWxlbSwgTWV0YWRhdGEgbWV0YWRhdGEpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxPdXRwdXREaXI+IG91dHB1dERpcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKwkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKERJUl9UQUcpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCUVsZW1lbnQgb3V0cHV0RGlyRWxlbSA9IChFbGVtZW50KSBub2RlTGlzdC5pdGVtKGkpOworCQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKG91dHB1dERpckVsZW0sIG1ldGFkYXRhKTsKKwkJCWJvb2xlYW4gY3JlYXRlQmVmb3JlRXhlID0gaXNDcmVhdGVCZWZvcmVFeGUob3V0cHV0RGlyRWxlbSwgbWV0YWRhdGEpOworCQkJT3V0cHV0RGlyIG91dHB1dERpciA9IG5ldyBPdXRwdXREaXIocGF0aCwgY3JlYXRlQmVmb3JlRXhlKTsKKwkJCWdldFJlZ0V4cE91dHB1dEZpbGVzKG91dHB1dERpckVsZW0sIG1ldGFkYXRhLCBvdXRwdXREaXIpOworCQkJb3V0cHV0RGlycy5hZGQob3V0cHV0RGlyKTsKKwkJfQorCQlyZXR1cm4gb3V0cHV0RGlyczsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRSZWdFeHBPdXRwdXRGaWxlcyhFbGVtZW50IGVsZW0sIE1ldGFkYXRhIG1ldGFkYXRhLAorCQkJT3V0cHV0RGlyIG91dHB1dERpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU5vZGVMaXN0IGZpbGVMaXN0ID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShGSUxFU19UQUcpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVMaXN0LmdldExlbmd0aCgpOyBqKyspIHsKKwkJCUVsZW1lbnQgZmlsZUVsZW1lbnQgPSAoRWxlbWVudCkgZmlsZUxpc3QuaXRlbShqKTsKKwkJCVN0cmluZyBvdXRwdXRGaWxlID0gZmlsZUVsZW1lbnQuZ2V0QXR0cmlidXRlKFJFR0VYX0FUVFIpOworCQkJaWYgKG91dHB1dEZpbGUuZXF1YWxzKCIiKSl7CisJCQkJb3V0cHV0RmlsZSA9IGZpbGxJbihmaWxlRWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRV9BVFRSKSwKKwkJCQkJCW1ldGFkYXRhKTsKKwkJCX0KKwkJCVBhdGhVdGlsc05hbWluZ0NvbnZlbnRpb24gcmVuYW1pbmdDb252ZW50aW9uID0gbnVsbDsKKwkJCU5vZGVMaXN0IHJlbmFtaW5nQ29udk5vZGVzID0gZmlsZUVsZW1lbnQKKwkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKFJFTkFNSU5HX0NPTlZfVEFHKTsKKworCQkJaWYgKHJlbmFtaW5nQ29udk5vZGVzLmdldExlbmd0aCgpID4gMCkgeworCQkJCUVsZW1lbnQgcmVuYW1pbmdFbGVtZW50ID0gKEVsZW1lbnQpIHJlbmFtaW5nQ29udk5vZGVzLml0ZW0oMCk7CisJCQkJU3RyaW5nIG5hbWluZ0V4cHIgPSByZW5hbWluZ0VsZW1lbnQKKwkJCQkJCS5nZXRBdHRyaWJ1dGUoTkFNSU5HX0VYUFJfQVRUUik7CisJCQkJaWYgKHJlbmFtaW5nRWxlbWVudC5nZXRBdHRyaWJ1dGUoRU5WX1JFUExBQ0VfQVRUUikKKwkJCQkJCS50b0xvd2VyQ2FzZSgpLmVxdWFscygidHJ1ZSIpKXsKKwkJCQkJbmFtaW5nRXhwciA9IGZpbGxJbihuYW1pbmdFeHByLCBtZXRhZGF0YSwgZmFsc2UpOworCQkJCX0KKwkJCQllbHNlIGlmICghcmVuYW1pbmdFbGVtZW50LmdldEF0dHJpYnV0ZShFTlZfUkVQTEFDRV9BVFRSKQorCQkJCQkJLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJmYWxzZSIpKXsKKwkJCQkJbmFtaW5nRXhwciA9IGZpbGxJbihuYW1pbmdFeHByLCBtZXRhZGF0YSk7CisJCQkJfQorCQkJCXJlbmFtaW5nQ29udmVudGlvbiA9IG5ldyBQYXRoVXRpbHNOYW1pbmdDb252ZW50aW9uKCk7CisJCQkJcmVuYW1pbmdDb252ZW50aW9uLnNldE5hbWluZ0NvbnYobmFtaW5nRXhwcik7CisJCQkJTm9kZUxpc3QgbWV0YWRhdGFOb2RlcyA9IHJlbmFtaW5nRWxlbWVudAorCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKE1FVEFEQVRBX1RBRyk7CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBtZXRhZGF0YU5vZGVzLmdldExlbmd0aCgpOyBrKyspIHsKKwkJCQkJcmVuYW1pbmdDb252ZW50aW9uLmFkZFRtcFJlcGxhY2VNZXQoKChFbGVtZW50KSBtZXRhZGF0YU5vZGVzCisJCQkJCQkJLml0ZW0oaykpLmdldEF0dHJpYnV0ZShLRVlfQVRUUiksIEFycmF5cworCQkJCQkJCS5hc0xpc3QoKChFbGVtZW50KSBtZXRhZGF0YU5vZGVzLml0ZW0oaykpCisJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFZBTF9BVFRSKS5zcGxpdCgiLCIpKSk7CisJCQkJfQorCQkJfQorCisJCQlvdXRwdXREaXIKKwkJCQkJLmFkZFJlZ0V4cHJPdXRwdXRGaWxlcyhuZXcgUmVnRXhwck91dHB1dEZpbGVzKG91dHB1dEZpbGUsCisJCQkJCQkJZmlsbEluKGZpbGVFbGVtZW50CisJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKE1FVF9GSUxFX1dSSVRFUl9DTEFTU19BVFRSKSwKKwkJCQkJCQkJCW1ldGFkYXRhKSwgcmVuYW1pbmdDb252ZW50aW9uLCAoT2JqZWN0W10pIGZpbGxJbigKKwkJCQkJCQkJCWZpbGVFbGVtZW50LmdldEF0dHJpYnV0ZShBUkdTX0FUVFIpLAorCQkJCQkJCQkJbWV0YWRhdGEpLnNwbGl0KCIsIikpKTsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsbEluKFN0cmluZyB2YWx1ZSwgTWV0YWRhdGEgaW5wdXRNZXRhZGF0YSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gZmlsbEluKHZhbHVlLCBpbnB1dE1ldGFkYXRhLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxsSW4oU3RyaW5nIHZhbHVlLCBNZXRhZGF0YSBpbnB1dE1ldGFkYXRhLAorCQkJYm9vbGVhbiBlbnZSZXBsYWNlUmVjdXIpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJd2hpbGUgKCh2YWx1ZSA9IFBhdGhVdGlscworCQkJCQkuZG9EeW5hbWljUmVwbGFjZW1lbnQodmFsdWUsIGlucHV0TWV0YWRhdGEpKS5jb250YWlucygiWyIpCisJCQkJCSYmIGVudlJlcGxhY2VSZWN1cikKKwkJCQk7CisJCQlpZiAodmFsdWUudG9VcHBlckNhc2UoKS5tYXRjaGVzKAorCQkJCQkiXlxccypTUUxcXHMqXFwoLipcXClcXHMqXFx7LipcXH1cXHMqJCIpKQorCQkJCXZhbHVlID0gUXVlcnlVdGlscworCQkJCQkJLmdldFF1ZXJ5UmVzdWx0c0FzU3RyaW5nKG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCgKKwkJCQkJCQkJbmV3IFVSTChpbnB1dE1ldGFkYXRhCisJCQkJCQkJCQkJLmdldE1ldGFkYXRhKFFVRVJZX0ZJTEVfTUFOQUdFUl9VUkwKKwkJCQkJCQkJCQkJCS5nZXROYW1lKCkpKSkKKwkJCQkJCQkJLmNvbXBsZXhRdWVyeShTcWxQYXJzZXIKKwkJCQkJCQkJCQkucGFyc2VTcWxRdWVyeU1ldGhvZCh2YWx1ZSkpKTsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSB2YWx1ZTogIiArIHZhbHVlLCBlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9Dc3ZDb25maWdGaWxlV3JpdGVyLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvQ3N2Q29uZmlnRmlsZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMWYyNTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvQ3N2Q29uZmlnRmlsZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVyczsKKworLy9Hb29nbGUgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBDU1Yge0BsaW5rIFNjaVBnZUNvbmZpZ0ZpbGVXcml0ZXJ9IHdoaWNoIHRha2VzIGEgY29tbWEgc2VwYXJ0ZWQgbGlzdCBvZgorICoge0BsaW5rIFN0cmluZ31zIGFzIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgYXJncyBhbmQgZ2VuZXJhdGVzIGEgQ1NWIGZpbGUgZnJvbQorICogdGhlIG1ldGFkYXRhIGZpZWxkcyBsaXN0ZWQuIEZvciBleGFtcGxlLCBpZiB0aGUgbGlzdCBvZiB7QGxpbmsgU3RyaW5nfXMgZ2l2ZW4KKyAqIGlzOgorICoKKyAqIDxwcmU+CisgKiAgICBJbnB1dEZpbGVzLElzVGV4dAorICogPC9wcmU+CisgKgorICogQW5kOgorICoKKyAqIDxwcmU+CisgKiAgICBJbnB1dEZpbGVzPUZpbGUxLnR4dCxGaWxlMi5kYXQsRmlsZTMueG1sCisgKiAgICBJc1RleHQ9dHJ1ZSxmYWxzZSx0cnVlCisgKiA8L3ByZT4KKyAqCisgKiBUaGVuIHRoZSBDU1YgZmlsZSBjcmVhdGUgd2lsbCBsb29rIGxpa2U6CisgKgorICogPHByZT4KKyAqICAgIElucHV0RmlsZXMsSXNUZXh0CisgKiAgICBGaWxlMS50ZXh0LHRydWUKKyAqICAgIEZpbGUyLmRhdCxmYWxzZQorICogICAgRmlsZTMueG1sLHRydWUKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgQ3N2Q29uZmlnRmlsZVdyaXRlciBleHRlbmRzIER5bmFtaWNDb25maWdGaWxlV3JpdGVyIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURFUl9JTkRFWCA9IDA7CisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMSU1fSU5ERVggPSAwOworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERUxJTSA9ICIsIjsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgRmlsZSBnZW5lcmF0ZUZpbGUoU3RyaW5nIGZpbGVQYXRoLCBNZXRhZGF0YSBtZXRhZGF0YSwgTG9nZ2VyIGxvZ2dlciwKKyAgICAgICAgIE9iamVjdC4uLiBjdXN0b21BcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGNoZWNrQXJndW1lbnQoY3VzdG9tQXJncy5sZW5ndGggPiAwLAorICAgICAgICAgICAgQ3N2Q29uZmlnRmlsZVdyaXRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICsgIiBoYXMgbm8gYXJncyBzcGVjaWZpZWQiKTsKKyAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXIgPSBjaGVja05vdE51bGwoCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoU3BsaXR0ZXIub24oIiwiKS5zcGxpdCgKKyAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGN1c3RvbUFyZ3NbSEVBREVSX0lOREVYXSkpLAorICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBDU1YgaGVhZGVyIGluIGFyZ3MgYXQgaW5kZXggPSAnIiArIEhFQURFUl9JTkRFWCArICInIik7CisgICAgICBTdHJpbmcgZGVsaW0gPSBERUZBVUxUX0RFTElNOworICAgICAgaWYgKGN1c3RvbUFyZ3MubGVuZ3RoID4gREVMSU1fSU5ERVgpIHsKKyAgICAgICAgIGRlbGltID0gKFN0cmluZykgY3VzdG9tQXJnc1tERUxJTV9JTkRFWF07CisgICAgICB9CisKKyAgICAgIHJldHVybiB3cml0ZUNzdkZpbGUoZmlsZVBhdGgsIGhlYWRlciwgZ2VuZXJhdGVSb3dzKGhlYWRlciwgbWV0YWRhdGEpLAorICAgICAgICAgICAgZGVsaW0pOworICAgfQorCisgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgIHByb3RlY3RlZCBMaXN0PExpc3Q8U3RyaW5nPj4gZ2VuZXJhdGVSb3dzKExpc3Q8U3RyaW5nPiBoZWFkZXIsCisgICAgICAgICBNZXRhZGF0YSBtZWF0YWRhdGEpIHsKKyAgICAgIExpc3Q8TGlzdDxTdHJpbmc+PiByb3dzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgVE9QOiB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgZm9yIChTdHJpbmcgY29sdW1uTmFtZSA6IGhlYWRlcikgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG1lYXRhZGF0YS5nZXRBbGxNZXRhZGF0YShjb2x1bW5OYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICBicmVhayBUT1A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gcm93ID0gcm93cy5nZXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHJvdyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICByb3cgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvdy5hZGQodmFsdWVzLmdldChpbmRleCkpOworICAgICAgICAgICAgcm93cy5zZXQoaW5kZXgsIHJvdyk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcm93czsKKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nCisgICBwcm90ZWN0ZWQgRmlsZSB3cml0ZUNzdkZpbGUoU3RyaW5nIGZpbGUsIExpc3Q8U3RyaW5nPiBoZWFkZXIsCisgICAgICAgICBMaXN0PExpc3Q8U3RyaW5nPj4gcm93cywgU3RyaW5nIGRlbGltKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZmlsZSk7CisgICAgICBQcmludFN0cmVhbSBwcyA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICAgcHMgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSkpOworICAgICAgICAgcHMucHJpbnRsbihKb2luZXIub24oZGVsaW0pLmpvaW4oaGVhZGVyKSk7CisgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiByb3cgOiByb3dzKSB7CisgICAgICAgICAgICBwcy5wcmludGxuKEpvaW5lci5vbihkZWxpbSkuam9pbihyb3cpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBvdXRwdXRGaWxlOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIHdyaXRlIENTViBmaWxlICciICsgZmlsZSArICInIDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBzLmNsb3NlKCk7CisgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9EeW5hbWljQ29uZmlnRmlsZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzQzNzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVyczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgZ2VuZXJhdGluZyBQR0UgY29uZmlnIGlucHV0IGZpbGVzIGRlZmluaW5nIHRoZSBpbnB1dAorICogbmVjZXNzYXJ5IHRvIHJ1biB0aGUgdW5kZXJseWluZyBQR0UuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEeW5hbWljQ29uZmlnRmlsZVdyaXRlciBpbXBsZW1lbnRzIFNjaVBnZUNvbmZpZ0ZpbGVXcml0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlcgorCQkJLmdldExvZ2dlcihEeW5hbWljQ29uZmlnRmlsZVdyaXRlci5jbGFzcy5nZXROYW1lKCkpOworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZQorCSAqIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuU2NpUGdlQ29uZmlnRmlsZVdyaXRlciNjcmVhdGVDb25maWdGaWxlCisJICogKGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisJICogamF2YS5sYW5nLk9iamVjdFtdKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBGaWxlIGNyZWF0ZUNvbmZpZ0ZpbGUoU3RyaW5nIHNjaVBnZUNvbmZpZ0ZpbGVQYXRoLAorCQkJTWV0YWRhdGEgaW5wdXRNZXRhZGF0YSwgT2JqZWN0Li4uIGN1c3RvbUFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZUZpbGUoc2NpUGdlQ29uZmlnRmlsZVBhdGgsIGlucHV0TWV0YWRhdGEsCisJCQkJCWxvZ2dlciwgY3VzdG9tQXJncyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCisJICogR2VuZXJhdGVzIGEgY29uZmlnIGZpbGUgZm9yIENBUy1QR0UgdG8gdXNlIGFzIFBHRSBpbnB1dCB3aXRoIHRoZSBnaXZlbgorCSAqIGRlZmF1bHQgbG9nZ2VyLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlUGF0aAorCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZyBmaWxlIHRvIGdlbmVyYXRlLgorCSAqIEBwYXJhbSBtZXRhZGF0YQorCSAqICAgICAgICAgICAgSW5wdXQgQ0FTLVBHRSBtZXRhZGF0YS4KKwkgKiBAcGFyYW0gbG9nZ2VyCisJICogICAgICAgICAgICBUaGUgbG9nZ2VyIHRvIHdyaXRlIGFueSBzdGF0dXMgaW5mb3JtYXRpb24gdG8uCisJICogQHBhcmFtIGFyZ3MKKwkgKiAgICAgICAgICAgIEFueSBjdXN0b20gcGFyYW1ldGVycyBuZWVkZWQgZm9yIHRoZSB3cml0ZXIgdG8gd3JpdGUgdGhlIGlucHV0CisJICogICAgICAgICAgICBjb25maWcgZmlsZS4KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBnZW5lcmF0ZWQgQ0FTLVBHRSBpbnB1dCBjb25maWcgZmlsZS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIGFic3RyYWN0IEZpbGUgZ2VuZXJhdGVGaWxlKFN0cmluZyBmaWxlUGF0aCwgTWV0YWRhdGEgbWV0YWRhdGEsCisJCQlMb2dnZXIgbG9nZ2VyLCBPYmplY3QuLi4gYXJncykgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9FeHRlcm5FeHRyYWN0b3JNZXRXcml0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9FeHRlcm5FeHRyYWN0b3JNZXRXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzljNjFlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL0V4dGVybkV4dHJhY3Rvck1ldFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLkV4dGVybkNvbmZpZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRXh0ZXJuTWV0RXh0cmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuUGNzTWV0RmlsZVdyaXRlcjsKKworLyoqCisgKiAKKyAqIFdyYXBzIHRoZSBPT0RUIENBUyB7QGxpbmsgRXh0ZXJuTWV0RXh0cmFjdG9yfSBhbmQgZXhwb3NlcyBpdCBhcyBhIENBUy1QR0UKKyAqIHtAbGluayBQY3NNZXRGaWxlV3JpdGVyfS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuRXh0cmFjdG9yTWV0V3JpdGVyIGV4dGVuZHMgUGNzTWV0RmlsZVdyaXRlciB7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBNZXRhZGF0YSBnZXRTY2lQZ2VTcGVjaWZpY01ldGFkYXRhKEZpbGUgc2NpUGdlQ29uZmlnRmlsZVBhdGgsCisgICAgICBNZXRhZGF0YSBpbnB1dE1ldGFkYXRhLCBPYmplY3QuLi4gY3VzdG9tQXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRXh0ZXJuTWV0RXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRlcm5NZXRFeHRyYWN0b3IoKTsKKyAgICBleHRyYWN0b3Iuc2V0Q29uZmlnRmlsZShuZXcgRXh0ZXJuQ29uZmlnUmVhZGVyKCkucGFyc2VDb25maWdGaWxlKG5ldyBGaWxlKAorICAgICAgICAoU3RyaW5nKSBjdXN0b21BcmdzWzBdKSkpOworICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtLmFkZE1ldGFkYXRhKGV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEoc2NpUGdlQ29uZmlnRmlsZVBhdGgpCisgICAgICAgIC5nZXRIYXNodGFibGUoKSwgdHJ1ZSk7CisgICAgcmV0dXJuIG07CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL0ZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvRmlsZW5hbWVFeHRyYWN0b3JXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2FlNjRmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL0ZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlBjc01ldEZpbGVXcml0ZXI7CisKKy8qKgorICogCisgKiBXcmFwIENBUy1NZXRhZGF0YSdzIHtAbGluayBGaWxlbmFtZVRva2VuTWV0RXh0cmFjdG9yfSBhcyBhIENBUy1QR0UKKyAqIHtAbGluayBQY3NNZXRGaWxlV3JpdGVyfS4gRmlyc3QgYXJnIHBhc3NlZCBpbiBpcyB0aGUgY29uZmlnIGZpbGUgZnVsbCBwYXRoLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyIGV4dGVuZHMgUGNzTWV0RmlsZVdyaXRlciB7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlBjc01ldEZpbGVXcml0ZXIjZ2V0U2NpUGdlU3BlY2lmaWNNZXRhZGF0YQorICAgKiAoamF2YS5pby5GaWxlLCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhLCBqYXZhLmxhbmcuT2JqZWN0W10pCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIE1ldGFkYXRhIGdldFNjaVBnZVNwZWNpZmljTWV0YWRhdGEoRmlsZSBnZW5lcmF0ZWRGaWxlLAorICAgICAgTWV0YWRhdGEgd29ya2Zsb3dNZXQsIE9iamVjdC4uLiBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgbWV0Q29uZkZpbGVQYXRoID0gU3RyaW5nLnZhbHVlT2YoYXJnc1swXSk7CisgICAgRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvcigpOworICAgIGV4dHJhY3Rvci5zZXRDb25maWdGaWxlKG1ldENvbmZGaWxlUGF0aCk7CisgICAgcmV0dXJuIGV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEoZ2VuZXJhdGVkRmlsZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL01ldGFkYXRhS2V5UmVwbGFjZXJUZW1wbGF0ZVdyaXRlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL01ldGFkYXRhS2V5UmVwbGFjZXJUZW1wbGF0ZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTQ0NWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvTWV0YWRhdGFLZXlSZXBsYWNlclRlbXBsYXRlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIAorICogU2ltcGxlIHRlbXBsYXRlIGJhc2VkIHJlcGxhY2VtZW50IHdyaXRlciwgcmVwbGFjZXMgJHZhcmlhYmxlcyBpbnNpZGUgb2YgYQorICogdGV4dCBmaWxlIHRlbXBsYXRlIHdpdGggaW5mb3JtYXRpb24gY29tcHV0ZWQgYnkgQXBhY2hlIE9PRFQgKGUuZy4sIGZyb20KKyAqIGVudmlyb25tZW50IHZhcmlhYmxlcywgZnJvbSBpbnB1dCB3b3JrZmxvdyBvciBmaWxlIG1ldGFkYXRhLCBkZXJpdmVkCisgKiBtZXRhZGF0YSwgZXRjIGV0Yy4pCisgKiAKKyAqIE11bHRpLXZhbHVlZCBtZXRhZGF0YSBrZXlzIGFyZSBleHBhbmRlZCB0byBqb2luZWQgc3RyaW5ncyBkZWxpbWl0ZWQgYnkgdGhlCisgKiAybmQgdmFyYXJncyBhcmd1bWVudCB0bworICoge0BsaW5rICNjcmVhdGVDb25maWdGaWxlKFN0cmluZywgTWV0YWRhdGEsIE9iamVjdC4uLil9LiBUaGUgMXN0IHZhcmFyZ3MKKyAqIGFyZ3VtZW50IHRvIHtAbGluayAjY3JlYXRlQ29uZmlnRmlsZShTdHJpbmcsIE1ldGFkYXRhLCBPYmplY3QuLi4pfSBpcyB0aGUKKyAqIHRlbXBsYXRlIGZpbGUgdG8gdXNlIGFzIGEgYmFzaXMuCisgKiAKKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhS2V5UmVwbGFjZXJUZW1wbGF0ZVdyaXRlciBleHRlbmRzCisgICAgRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUEFSQVRPUiA9ICIsIjsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIjZ2VuZXJhdGVGaWxlKGphdmEKKyAgICogLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhLAorICAgKiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIsIGphdmEubGFuZy5PYmplY3RbXSkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgRmlsZSBnZW5lcmF0ZUZpbGUoU3RyaW5nIGZpbGVQYXRoLCBNZXRhZGF0YSBtZXRhZGF0YSwgTG9nZ2VyIGxvZ2dlciwKKyAgICAgIE9iamVjdC4uLiBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdGVtcGxhdGVGaWxlID0gKFN0cmluZykgYXJnc1swXTsKKyAgICBTdHJpbmcgcHJvY2Vzc2VkVGVtcGxhdGUgPSBGaWxlVXRpbHMKKyAgICAgICAgLnJlYWRGaWxlVG9TdHJpbmcobmV3IEZpbGUodGVtcGxhdGVGaWxlKSk7CisgICAgU3RyaW5nIHNlcGFyYXRvciA9IGFyZ3MubGVuZ3RoID09IDIgPyAoU3RyaW5nKSBhcmdzWzFdIDogREVGQVVMVF9TRVBBUkFUT1I7CisKKyAgICBmb3IgKFN0cmluZyBrZXkgOiBtZXRhZGF0YS5nZXRBbGxLZXlzKCkpIHsKKyAgICAgIFN0cmluZyByZXBsYWNlVmFsID0gbnVsbDsKKyAgICAgIGlmIChtZXRhZGF0YS5pc011bHRpVmFsdWVkKGtleSkpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSk7CisgICAgICAgIHJlcGxhY2VWYWwgPSBTdHJpbmdVdGlscy5qb2luKHZhbHVlcywgc2VwYXJhdG9yKTsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXBsYWNlVmFsID0gbWV0YWRhdGEuZ2V0TWV0YWRhdGEoa2V5KTsKKyAgICAgIHByb2Nlc3NlZFRlbXBsYXRlID0gcHJvY2Vzc2VkVGVtcGxhdGUucmVwbGFjZUFsbCgiXFwkIiArIGtleSwgcmVwbGFjZVZhbCk7CisgICAgfQorCisgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOworICAgIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZShjb25maWdGaWxlLCBwcm9jZXNzZWRUZW1wbGF0ZSk7CisgICAgcmV0dXJuIGNvbmZpZ0ZpbGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL1Bjc01ldEZpbGVXcml0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9QY3NNZXRGaWxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyNTZlMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9QY3NNZXRGaWxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFdyaXRlcyBhIFBDUyBtZXRhZGF0YSBmaWxlIGZvciB0aGUgZ2l2ZSBkYXRhIGZpbGUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQY3NNZXRGaWxlV3JpdGVyIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0laRSA9ICJGaWxlU2l6ZSI7CisJCisgICAgcHVibGljIE1ldGFkYXRhIGdldE1ldGFkYXRhRm9yRmlsZShGaWxlIHNjaVBnZUNyZWF0ZWREYXRhRmlsZSwKKyAgICAgICAgICAgIFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhLCBPYmplY3QuLi4gY3VzdG9tQXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRhZGF0YSBpbnB1dE1ldGFkYXRhID0gcGdlTWV0YWRhdGEuYXNNZXRhZGF0YSgpOworCisgICAgICAgICAgICBpbnB1dE1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgc2NpUGdlQ3JlYXRlZERhdGFGaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpbnB1dE1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICBzY2lQZ2VDcmVhdGVkRGF0YUZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGlucHV0TWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKEZJTEVfU0laRSwgTG9uZy50b1N0cmluZyhuZXcgRmlsZSgKKwkJCQkJaW5wdXRNZXRhZGF0YS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFX0xPQ0FUSU9OKSwKKwkJCQkJaW5wdXRNZXRhZGF0YS5nZXRNZXRhZGF0YShDb3JlTWV0S2V5cy5GSUxFTkFNRSkpLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNjaVBnZVNwZWNpZmljTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgIHNjaVBnZUNyZWF0ZWREYXRhRmlsZSwgaW5wdXRNZXRhZGF0YSwgY3VzdG9tQXJncyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIFBDUyBtZXRhZGF0YSBmaWxlIGZvciAnIgorICAgICAgICAgICAgICAgICAgICArIHNjaVBnZUNyZWF0ZWREYXRhRmlsZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhZGF0YSBnZXRTY2lQZ2VTcGVjaWZpY01ldGFkYXRhKAorICAgICAgICAgICAgRmlsZSBzY2lQZ2VDcmVhdGVkRGF0YUZpbGUsIE1ldGFkYXRhIGlucHV0TWV0YWRhdGEsCisgICAgICAgICAgICBPYmplY3QuLi4gY3VzdG9tQXJncykgdGhyb3dzIEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL1NjaVBnZUNvbmZpZ0ZpbGVXcml0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9TY2lQZ2VDb25maWdGaWxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhZjU1ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9TY2lQZ2VDb25maWdGaWxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgZ2VuZXJhdGluZyBQR0UgY29uZmlnIGlucHV0IGZpbGVzIGRlZmluaW5nIHRoZSBpbnB1dAorICogbmVjZXNzYXJ5IHRvIHJ1biB0aGUgdW5kZXJseWluZyBQR0UKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NpUGdlQ29uZmlnRmlsZVdyaXRlciB7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2NpUGdlQ29uZmlnRmlsZVBhdGgKKyAgICAgKiBAcGFyYW0gaW5wdXRNZXRhZGF0YQorICAgICAqIEBwYXJhbSBjdXN0b21BcmdzCisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBjcmVhdGVDb25maWdGaWxlKFN0cmluZyBzY2lQZ2VDb25maWdGaWxlUGF0aCwKKyAgICAgICAgICAgIE1ldGFkYXRhIGlucHV0TWV0YWRhdGEsIE9iamVjdC4uLiBjdXN0b21BcmdzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9UZXh0Q29uZmlnRmlsZVdyaXRlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL1RleHRDb25maWdGaWxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYjIxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9UZXh0Q29uZmlnRmlsZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL0dvb2dsZSBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmZpbGxJbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogVGV4dCB7QGxpbmsgU2NpUGdlQ29uZmlnRmlsZVdyaXRlcn0gd2hpY2ggdGFrZXMgYSB0ZW1wbGF0ZSB3aXRoIGVudlJlcGxhY2UKKyAqIG1ldGFkYXRhIHRoYXQgZ2V0cyBkeW5hbWljYWxseSBmaWxsZWQgb3V0IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRleHRDb25maWdGaWxlV3JpdGVyIGV4dGVuZHMgRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIgeworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVNUExBVEVfSU5ERVggPSAwOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBGaWxlIGdlbmVyYXRlRmlsZShTdHJpbmcgZmlsZVBhdGgsIE1ldGFkYXRhIG1ldGFkYXRhLCBMb2dnZXIgbG9nZ2VyLAorICAgICAgICAgT2JqZWN0Li4uIGN1c3RvbUFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgY2hlY2tBcmd1bWVudChjdXN0b21BcmdzLmxlbmd0aCA+IDAsCisgICAgICAgICAgICBUZXh0Q29uZmlnRmlsZVdyaXRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICsgIiBoYXMgbm8gYXJncyBzcGVjaWZpZWQiKTsKKyAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IGNoZWNrTm90TnVsbCgoU3RyaW5nKSBjdXN0b21BcmdzW1RFTVBMQVRFX0lOREVYXSwKKyAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgVGV4dCBmaWxlIHRlbXBsYXRlIGluIGFyZ3MgYXQgaW5kZXggPSAnIgorICAgICAgICAgICAgICAgICAgKyBURU1QTEFURV9JTkRFWCArICInIik7CisKKyAgICAgIHRyeSB7CisgICAgICAgICByZXR1cm4gd3JpdGVUZXh0RmlsZShmaWxlUGF0aCwgZmlsbEluKHRlbXBsYXRlLCBtZXRhZGF0YSkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgIH0KKworICAgQFZpc2libGVGb3JUZXN0aW5nCisgICBwcm90ZWN0ZWQgRmlsZSB3cml0ZVRleHRGaWxlKFN0cmluZyBmaWxlLCBTdHJpbmcgdGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGZpbGUpOworICAgICAgUHJpbnRTdHJlYW0gcHMgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgIHBzID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKTsKKyAgICAgICAgIHBzLnByaW50bG4odGV4dCk7CisgICAgICAgICByZXR1cm4gb3V0cHV0RmlsZTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byB3cml0ZSB0ZXh0IGZpbGUgJyIgKyBmaWxlICsgIicgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgcHMuY2xvc2UoKTsKKyAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9WZWxvY2l0eUNvbmZpZ0ZpbGVXcml0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9WZWxvY2l0eUNvbmZpZ0ZpbGVXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWE0NTI2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL1ZlbG9jaXR5Q29uZmlnRmlsZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlRlbXBsYXRlOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5OworCisvKioKKyAqIAorICogQSBQR0UgaW5wdXQgZmlsZSB3cml0ZXIgYmFzZWQgb24gQXBhY2hlIFZlbG9jaXR5IGFuZCBQYXVsIFJhbWlyZXoncyBuZWVkIHRvCisgKiBtYWtlIG15IGNvZGUgYmV0dGVyLgorICogCisgKiBGaXJzdCB2YXIgYXJncyBwYXJhbWV0ZXIgdG8KKyAqIHtAbGluayAjY3JlYXRlQ29uZmlnRmlsZShTdHJpbmcsIE1ldGFkYXRhLCBPYmplY3QuLi4pfSBpcyB0aGUgdGVtcGxhdGUKKyAqIGRpcmVjdG9yeSBmdWxsIHBhdGguIFNlY29uZCB2YXIgYXJncyBwYXJhbWV0ZXIgdG8KKyAqIHtAbGluayAjY3JlYXRlQ29uZmlnRmlsZShTdHJpbmcsIE1ldGFkYXRhLCBPYmplY3QuLi4pfSBpcyB0aGUgdGVtcGxhdGUgZmlsZQorICogbmFtZS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgVmVsb2NpdHlDb25maWdGaWxlV3JpdGVyIGV4dGVuZHMgRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIgeworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy5EeW5hbWljQ29uZmlnRmlsZVdyaXRlciNnZW5lcmF0ZUZpbGUoamF2YQorICAgKiAubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAqIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlciwgamF2YS5sYW5nLk9iamVjdFtdKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBGaWxlIGdlbmVyYXRlRmlsZShTdHJpbmcgZmlsZVBhdGgsIE1ldGFkYXRhIG1ldGFkYXRhLCBMb2dnZXIgbG9nZ2VyLAorICAgICAgT2JqZWN0Li4uIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKyAgICBWZWxvY2l0eU1ldGFkYXRhIHZlbG9jaXR5TWV0YWRhdGEgPSBuZXcgVmVsb2NpdHlNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgLy8gVmVsb2NpdHkgcmVxdWlyZXMgeW91IHRvIHNldCBhIHBhdGggb2Ygd2hlcmUgdG8gbG9vayBmb3IKKyAgICAvLyB0ZW1wbGF0ZXMuIFRoaXMgcGF0aCBkZWZhdWx0cyB0byAuIGlmIG5vdCBzZXQuCisgICAgaW50IHNsYXNoSW5kZXggPSAoKFN0cmluZykgYXJnc1swXSkubGFzdEluZGV4T2YoJy8nKTsKKyAgICBTdHJpbmcgdGVtcGxhdGVQYXRoID0gKChTdHJpbmcpIGFyZ3NbMF0pLnN1YnN0cmluZygwLCBzbGFzaEluZGV4KTsKKyAgICBWZWxvY2l0eS5zZXRQcm9wZXJ0eSgiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlUGF0aCk7CisgICAgLy8gSW5pdGlhbGl6ZSBWZWxvY2l0eSBhbmQgc2V0IGNvbnRleHQgdXAKKyAgICBWZWxvY2l0eS5pbml0KCk7CisgICAgVmVsb2NpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7CisgICAgY29udGV4dC5wdXQoIm1ldGFkYXRhIiwgdmVsb2NpdHlNZXRhZGF0YSk7CisgICAgY29udGV4dC5wdXQoImVudiIsIFN5c3RlbS5nZXRlbnYoKSk7CisgICAgLy8gTG9hZCB0ZW1wbGF0ZSBmcm9tIHRlbXBsYXRlUGF0aAorICAgIFN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAoKFN0cmluZykgYXJnc1swXSkuc3Vic3RyaW5nKHNsYXNoSW5kZXgpOworICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gVmVsb2NpdHkuZ2V0VGVtcGxhdGUodGVtcGxhdGVOYW1lKTsKKyAgICAvLyBGaWxsIG91dCB0ZW1wbGF0ZSBhbmQgd3JpdGUgdG8gZmlsZQorICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCBzdyk7CisgICAgRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlKGNvbmZpZ0ZpbGUsIHN3LnRvU3RyaW5nKCkpOworICAgIHJldHVybiBjb25maWdGaWxlOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9WZWxvY2l0eU1ldGFkYXRhLmphdmEgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvVmVsb2NpdHlNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTczMTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvVmVsb2NpdHlNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBDQVMge0BsaW5rIE1ldGFkYXRhfSBvYmplY3QgdG8gcHJvdmlkZSBWZWxvY2l0eSB0ZW1wbGF0ZQorICogc2VtYW50aWNzLCBlLmcuLCBhIHtAbGluayAjZ2V0KFN0cmluZyl9IG1ldGhvZCB0aGF0IGFsbG93cyBmb3IKKyAqICR7bWV0YWRhdGEuYXV0aG9yfSAodGhlICcuJyBpcyBhIGNhbGwgdGhhdCBWZWxvY2l0eSB0aGVuIG1ha2VzIGZyb20gdGhlCisgKiB0ZW1wbGF0ZSB0byB0aGUge0BsaW5rICNnZXQoU3RyaW5nKX0gbWV0aG9kIGluIHRoZSBjbGFzcy4KKyAqIAorICogQGF1dGhvciBwcmFtaXJlegorICogCisgKi8KK3B1YmxpYyBjbGFzcyBWZWxvY2l0eU1ldGFkYXRhIGV4dGVuZHMgTWV0YWRhdGEgeworICBwcml2YXRlIE1ldGFkYXRhIF9tZXRhZGF0YSA9IG51bGw7CisKKyAgcHVibGljIFZlbG9jaXR5TWV0YWRhdGEoTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSkgeworICAgIHJldHVybiBfbWV0YWRhdGEuZ2V0TWV0YWRhdGEoa2V5KTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsdWVzKFN0cmluZyBrZXkpIHsKKyAgICByZXR1cm4gKExpc3Q8U3RyaW5nPikgX21ldGFkYXRhLmdldEFsbE1ldGFkYXRhKGtleSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9tZXRsaXN0L01ldGFkYXRhTGlzdFBjc01ldEZpbGVXcml0ZXIuamF2YSBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9tZXRsaXN0L01ldGFkYXRhTGlzdFBjc01ldEZpbGVXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTllNGNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL21ldGxpc3QvTWV0YWRhdGFMaXN0UGNzTWV0RmlsZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy5tZXRsaXN0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLio7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy5QY3NNZXRGaWxlV3JpdGVyOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgUGNzTWV0RmlsZVdyaXRlcn0gdGhhdCBnZW5lcmF0ZXMgUENTIG1ldCBmaWxlcyBiYXNlZCBvbiBhIE1ldExpc3QKKyAqIFhNTCBkb2N1bWVudAorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhTGlzdFBjc01ldEZpbGVXcml0ZXIgZXh0ZW5kcyBQY3NNZXRGaWxlV3JpdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBNZXRhZGF0YSBnZXRTY2lQZ2VTcGVjaWZpY01ldGFkYXRhKEZpbGUgc2NpUGdlQ3JlYXRlZERhdGFGaWxlLAorICAgICAgICAgICAgTWV0YWRhdGEgaW5wdXRNZXRhZGF0YSwgT2JqZWN0Li4uIGN1c3RvbUFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgICAgICBmb3IgKE9iamVjdCBhcmcgOiBjdXN0b21BcmdzKSB7CisgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QoCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoKFN0cmluZykgYXJnKSkpCisgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgICAgIE5vZGVMaXN0IG1ldGFkYXRhTm9kZUxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKE1FVEFEQVRBX1RBRyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFkYXRhTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgbWV0YWRhdGFFbGVtZW50ID0gKEVsZW1lbnQpIG1ldGFkYXRhTm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbWV0YWRhdGFFbGVtZW50LmdldEF0dHJpYnV0ZShLRVlfQVRUUik7CisgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgIAlrZXkgPSBQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQobWV0YWRhdGFFbGVtZW50LmdldEF0dHJpYnV0ZShLRVlfR0VOX0FUVFIpLCBpbnB1dE1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gbWV0YWRhdGFFbGVtZW50LmdldEF0dHJpYnV0ZShWQUxfQVRUUik7CisgICAgICAgICAgICAJaWYgKHZhbC5lcXVhbHMoIiIpKSAKKyAgICAgICAgICAgIAkJdmFsID0gbWV0YWRhdGFFbGVtZW50LmdldFRleHRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmICF2YWwuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhRWxlbWVudC5nZXRBdHRyaWJ1dGUoRU5WX1JFUExBQ0VfQVRUUikudG9Mb3dlckNhc2UoKS5lcXVhbHMoImZhbHNlIikpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQodmFsLCBpbnB1dE1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdmFscyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YUVsZW1lbnQuZ2V0QXR0cmlidXRlKFNQTElUX0FUVFIpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxzID0gbmV3IFN0cmluZ1tdIHsgdmFsIH07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVsaW1pdGVyID0gbWV0YWRhdGFFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVsaW1pdGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1pdGVyID09IG51bGwgfHwgZGVsaW1pdGVyLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gIiwiOworICAgICAgICAgICAgICAgICAgICAgICAgdmFscyA9ICh2YWwgKyBkZWxpbWl0ZXIpLnNwbGl0KGRlbGltaXRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGtleSwgQXJyYXlzLmFzTGlzdCh2YWxzKSk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0TWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGtleSwgQXJyYXlzLmFzTGlzdCh2YWxzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dE1ldGFkYXRhLmdldE1ldGFkYXRhKGtleSkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlucHV0TWV0YWRhdGEuZ2V0TWV0YWRhdGEoa2V5KS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShrZXksIGlucHV0TWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsTWV0YWRhdGEoa2V5KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRhZGF0YTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy94c2x0L1hzbFRyYW5zZm9ybVdyaXRlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL3hzbHQvWHNsVHJhbnNmb3JtV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3ODNjYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy94c2x0L1hzbFRyYW5zZm9ybVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy54c2x0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLlNlcmlhbGl6YWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuU2NpUGdlQ29uZmlnRmlsZVdyaXRlcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFhTTCBUcmFuc2Zvcm1hdGlvbiBjbGFzcyB3aGljaCB3cml0ZXMgU2NpZW5jZSBQR0UgY29uZmlnIGZpbGVzIGJhc2VkIGZyb20gdGhlCisgKiBYTUwgZm9ybWF0IG9mIFNlcmlhbGl6YWJsZU1ldGFkYXRhCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgWHNsVHJhbnNmb3JtV3JpdGVyIGltcGxlbWVudHMgU2NpUGdlQ29uZmlnRmlsZVdyaXRlciB7CisKKyAgICBwdWJsaWMgRmlsZSBjcmVhdGVDb25maWdGaWxlKFN0cmluZyBzY2lQZ2VDb25maWdGaWxlUGF0aCwKKyAgICAgICAgICAgIE1ldGFkYXRhIGlucHV0TWV0YWRhdGEsIE9iamVjdC4uLiBjdXN0b21BcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZSBzY2lQZ2VDb25maWdGaWxlID0gbmV3IEZpbGUoc2NpUGdlQ29uZmlnRmlsZVBhdGgpOworCisgICAgICAgICAgICBTdHJpbmcgeHNsdEZpbGVQYXRoID0gKFN0cmluZykgY3VzdG9tQXJnc1swXTsKKyAgICAgICAgICAgIFNvdXJjZSB4c2x0U291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgRmlsZSh4c2x0RmlsZVBhdGgpKTsKKyAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHNjaVBnZUNvbmZpZ0ZpbGUpOworCisgICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNGYWN0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IHRyYW5zRmFjdC5uZXdUcmFuc2Zvcm1lcih4c2x0U291cmNlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlQ0RBVEEgPSBjdXN0b21BcmdzLmxlbmd0aCA+IDEgPyAoKFN0cmluZykgY3VzdG9tQXJnc1sxXSkKKyAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0cnVlIikgOiBmYWxzZTsKKyAgICAgICAgICAgIFNvdXJjZSB4bWxTb3VyY2UgPSBuZXcgRE9NU291cmNlKChuZXcgU2VyaWFsaXphYmxlTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgIGlucHV0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIHRyYW5zLmdldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcpLCB1c2VDREFUQSkpCisgICAgICAgICAgICAgICAgICAgIC50b1hNTCgpKTsKKworICAgICAgICAgICAgdHJhbnMuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKyAgICAgICAgICAgIHRyYW5zLnRyYW5zZm9ybSh4bWxTb3VyY2UsIHJlc3VsdCk7CisKKyAgICAgICAgICAgIHJldHVybiBzY2lQZ2VDb25maWdGaWxlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBzY2llbmNlIFBHRSBjb25maWcgZmlsZSAnIgorICAgICAgICAgICAgICAgICAgICArIHNjaVBnZUNvbmZpZ0ZpbGVQYXRoICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvQ0FTLVBHRV9sZWFybl9ieV9leGFtcGxlLmRvY3ggYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvQ0FTLVBHRV9sZWFybl9ieV9leGFtcGxlLmRvY3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMDk4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9DQVMtUEdFX2xlYXJuX2J5X2V4YW1wbGUuZG9jeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvUkVNT1ZFLmxvZyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjdkMTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDE4IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK1lvdSBjYW4gcmVtb3ZlIHRoaXMgZmlsZS4gSXQgd2FzIG9ubHkgaW5jbHVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZyBkaXJlY3RvcnkgZm9yIHRoaXMKK2Rpc3RyaWJ1dGlvbiB3YXMgY3JlYXRlZCBvbiBhc3NlbWJseS4KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL2FjdGlvbi1iZWFucy5wcm9wZXJ0aWVzIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvYWN0aW9uLWJlYW5zLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4OWZiZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL2FjdGlvbi1iZWFucy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisjIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorIyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisjIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyMgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyMgdGhlIExpY2Vuc2UuCisKK2NyYXdsZXIuZmFpbHVyZS5kaXI9L3BhdGgvdG8vZmFpbHVyZS9kaXIKK2NyYXdsZXIuYmFja3VwLmRpcj0vcGF0aC90by9iYWNrdXAvZGlyCitjcmF3bGVyLndvcmtmbG93bWdyLnVybD1odHRwOi8vbG9jYWxob3N0OjkwMDEKK2NyYXdsZXIuZmlsZW1nci51cmw9aHR0cDovL2xvY2FsaG9zdDo5MDAwCitjcmF3bGVyLm1ldC5maWxlLmV4dD1tZXQKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL2FjdGlvbi1iZWFucy54bWwgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9hY3Rpb24tYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDBjZTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9hY3Rpb24tYmVhbnMueG1sCkBAIC0wLDAgKzEsMTEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcucG9zdHByb2Nlc3Nvci5TZXRJZEJlYW5Qb3N0UHJvY2Vzc29yIiAvPgorCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnV0aWwuQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIiPgorCisJCTwhLS0gQWxsb3cgZm9yIHN5c3RlbS1sZXZlbCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlIGFsbCBwcm9wZXJ0aWVzIGJlbG93IC0tPgorCQk8cHJvcGVydHkgbmFtZT0ic3lzdGVtUHJvcGVydGllc01vZGUiIHZhbHVlPSIyIiAvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImxvY2F0aW9uIiB2YWx1ZT0ic3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvYWN0aW9uLWJlYW5zLnByb3BlcnRpZXMiIC8+IAorCTwvYmVhbj4KKworCTwhLS0gREVMRVRFIEFjdGlvbnMgLS0+CisJPGJlYW4gaWQ9IkRlbGV0ZURhdGFGaWxlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5EZWxldGVGaWxlIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVsZXRlcyB0aGUgY3VycmVudCBkYXRhIGZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RTdWNjZXNzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iRGVsZXRlTWV0YWRhdGFGaWxlIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5EZWxldGVGaWxlIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRGVsZXRlcyB0aGUgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7Y3Jhd2xlci5tZXQuZmlsZS5leHR9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0U3VjY2VzczwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBNT1ZFIHRvIEZBSUxVUkVfRElSIEFjdGlvbnMgLS0+CisJPGJlYW4gaWQ9Ik1vdmVEYXRhRmlsZVRvRmFpbHVyZURpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gZmFpbHVyZSBkaXJlY3RvcnkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0b0RpciIgdmFsdWU9IiR7Y3Jhd2xlci5mYWlsdXJlLmRpcn0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjcmVhdGVUb0RpciIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RGYWlsdXJlPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iTW92ZU1ldGFkYXRhRmlsZVRvRmFpbHVyZURpciIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uTW92ZUZpbGUiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJNb3ZlcyB0aGUgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBmaWxlIHRvIGZhaWx1cmUgZGlyZWN0b3J5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7Y3Jhd2xlci5tZXQuZmlsZS5leHR9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0idG9EaXIiIHZhbHVlPSIke2NyYXdsZXIuZmFpbHVyZS5kaXJ9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY3JlYXRlVG9EaXIiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wb3N0SW5nZXN0RmFpbHVyZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBNT1ZFIHRvIEJBQ0tVUF9ESVIgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0iTW92ZU1ldGFkYXRhRmlsZVRvQmFja3VwRGlyIiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5Nb3ZlRmlsZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik1vdmVzIHRoZSBtZXRhZGF0YSBmaWxlIGZvciB0aGUgY3VycmVudCBkYXRhIGZpbGUgdG8gc3VjY2VzcyBkaXJlY3RvcnkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtjcmF3bGVyLm1ldC5maWxlLmV4dH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0b0RpciIgdmFsdWU9IiR7Y3Jhd2xlci5iYWNrdXAuZGlyfSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImNyZWF0ZVRvRGlyIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBoYXNlcyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWUgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+cG9zdEluZ2VzdFN1Y2Nlc3M8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gV29ya2Zsb3cgTWFuYWdlciBBY3Rpb25zIC0tPgorCTxiZWFuIGlkPSJUcmlnZ2VyUG9zdEluZ2VzdFdvcmtmbG93IiBsYXp5LWluaXQ9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5Xb3JrZmxvd01nclN0YXR1c1VwZGF0ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHdvcmtmbG93IGV2ZW50IHdpdGggdGhlIG5hbWUgW1Byb2R1Y3RUeXBlXUluZ2VzdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImluZ2VzdFN1ZmZpeCIgdmFsdWU9IkluZ2VzdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9IndvcmtmbG93TWdyVXJsIiB2YWx1ZT0iJHtjcmF3bGVyLndvcmtmbG93bWdyLnVybH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwaGFzZXMiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPnBvc3RJbmdlc3RTdWNjZXNzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEZpbGUgTWFuYWdlciBBY3Rpb25zIC0tPgorCTxiZWFuIGlkPSJVbmlxdWUiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuYWN0aW9uLkZpbGVtZ3JVbmlxdWVuZXNzQ2hlY2tlciI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrcyB0aGUgZmlsZW1nciBhZ2FpbnN0IHRoZSBQUk9EVUNUX05BTUUgZm9yIHRoZSBjdXJyZW50IGRhdGEgZmlsZSB0byBtYWtlIHN1cmUgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbmdlc3RlZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImZpbGVtZ3JVcmwiIHZhbHVlPSIke2NyYXdsZXIuZmlsZW1nci51cmx9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGhhc2VzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj5wcmVJbmdlc3Q8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9jcmF3bGVyLWNvbmZpZy54bWwgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9jcmF3bGVyLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjcyNzM4NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL2NyYXdsZXItY29uZmlnLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wudXRpbC5DYXNQcm9wZXJ0eU92ZXJyaWRlQ29uZmlndXJlciIgLz4KKworCTxpbXBvcnQgcmVzb3VyY2U9ImFjdGlvbi1iZWFucy54bWwiIC8+CisJPGltcG9ydCByZXNvdXJjZT0icHJlY29uZGl0aW9uLWJlYW5zLnhtbCIgLz4KKyAgPGltcG9ydCByZXNvdXJjZT0ibmFtaW5nLWJlYW5zLnhtbCIgLz4KKworPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL2ZpbGVuYW1lLmV4dHJhY3Rvci5jb25maWcueG1sIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvZmlsZW5hbWUuZXh0cmFjdG9yLmNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxM2U5ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL2ZpbGVuYW1lLmV4dHJhY3Rvci5jb25maWcueG1sCkBAIC0wLDAgKzEsODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGlucHV0PgorCisgICA8Z3JvdXAgbmFtZT0iVG9rZW5OYW1lTGlzdEdyb3VwIj4KKyAgICAgPHNjYWxhciBuYW1lPSJEZWxpbWV0ZXIiPl88L3NjYWxhcj4KKyAgICAgPHZlY3RvciBuYW1lPSJUb2tlbk1ldEtleXMiPgorICAgIAorICAgICA8IS0tIAorICAgICBbc291cmNlbmFtZV1fW3RhYmxlbmFtZV1fW3Byb2R1Y3Rpb25kYXRldGltZV0uW2V4dF0KKyAgICAgCisgICAgIGV4IGZpbGUgbmFtZTogZGF0YXNvdXJjZV90YWJsZW5hbWVfMjAxMDExMjkxMjI3MDAudHh0CisgICAgIC0tPgorICAgICAgIDxlbGVtZW50PlNvdXJjZU5hbWU8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+VGFibGVOYW1lPC9lbGVtZW50PgorICAgICAgIDxlbGVtZW50PlByb2R1Y3Rpb25EYXRlVGltZTwvZWxlbWVudD4KKyAgICAgPC92ZWN0b3I+CisgIAorICAgPC9ncm91cD4KKworCisgICAgPGdyb3VwIG5hbWU9IlN1YnN0cmluZ09mZnNldEdyb3VwIj4KKyAgICAgPCEtLSAgdGhlIGluZGljZXMgZm9yIHRoZSBzdWJzdHJpbmcgbWV0IGtleSBzZWxlY3Rpb24gLS0+CisgICAgIDwhLS0gIHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgc3RyaW5nIC0tPgorICAgICA8IS0tICBOT1RFOiB0aGlzIGFzc3VtZXMgMS1pbmRleGVkIHN0cmluZ3MgKGFuZCBpcyBpbnRlcm5hbGx5IGNvbnZlcnRlZCB0bworICAgICAgICAgICAwLWluZGV4ZWQuCisgICAgICAtLT4KKyAgICAgPCEtLSAgdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBsZW5ndGggLS0+CisgICAgIAorICAgICA8IS0tICBNaXNzaW9uTmFtZV9EYXRlX1N0YXJ0T3JiaXROdW1iZXJfU3RvcE9yYml0TnVtYmVyLnR4dCAtLT4KKyAgICAgCisgICAgICA8dmVjdG9yIG5hbWU9Ik1pc3Npb25OYW1lIj4KKyAgICAgICAgPGVsZW1lbnQ+MTwvZWxlbWVudD4KKyAgICAgICAgPGVsZW1lbnQ+MTE8L2VsZW1lbnQ+ICAgICAgCisgICAgICA8L3ZlY3Rvcj4KKyAgICAgIAorICAgICAgPHZlY3RvciBuYW1lPSJEYXRlIj4KKyAgICAgICAgPGVsZW1lbnQ+MTM8L2VsZW1lbnQ+CisgICAgICAgIDxlbGVtZW50PjQ8L2VsZW1lbnQ+CisgICAgICA8L3ZlY3Rvcj4KKyAgICAgIAorICAgICAgPHZlY3RvciBuYW1lPSJTdGFydE9yYml0TnVtYmVyIj4KKyAgICAgICAgPGVsZW1lbnQ+MTg8L2VsZW1lbnQ+CisgICAgICAgIDxlbGVtZW50PjE2PC9lbGVtZW50PgorICAgICAgPC92ZWN0b3I+CisgICAgICAKKyAgICAgIDx2ZWN0b3IgbmFtZT0iU3RvcE9yYml0TnVtYmVyIj4KKyAgICAgICAgPGVsZW1lbnQ+MzU8L2VsZW1lbnQ+CisgICAgICAgIDxlbGVtZW50PjE1PC9lbGVtZW50PgorICAgICAgPC92ZWN0b3I+CisgICAgICAKKyAgIDwvZ3JvdXA+CisgICAKKyAgIDxncm91cCBuYW1lPSJQcm9kdWN0aW9uRGF0ZVRpbWVHcm91cCI+CisgICAgIDxzY2FsYXIgbmFtZT0iRGF0ZVRpbWVGb3JtYXQiPnl5eXlNTWRkSEhtbXNzPC9zY2FsYXI+CisgICA8L2dyb3VwPiAgIAorICAgIAorICAgIDxncm91cCBuYW1lPSJDb21tb25NZXRhZGF0YSI+CisgICAgICAgPCEtLSAgY2FuIG5vdyB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVwbGFjZW1lbnQgaW4gYW55IG9mIHRoZSB2YWx1ZXMgZm9yIAorICAgICAgICAgICAgIHNjYWxhcnMgb3IgdmVjdG9ycywganVzdCB1c2UgQ0FTIGJyYWNrZXQgc3R5bGUgW0VOViBWQVIgTkFNRV0KKyAgICAgICAgIAorICAgICAgICAgICAgIEFsc28gY2FuIHVzZSB2ZWN0b3IgdG8gaW5kaWNhdGUgbXVsdGlwbGUgdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgbWV0IGZpZWxkLgorICAgICAgICAtLT4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJEYXRhVmVyc2lvbiI+MS4wPC9zY2FsYXI+CisgICAgICAgIDxzY2FsYXIgbmFtZT0iQ29sbGVjdGlvbk5hbWUiPlByb2R1Y3RzIGV4dHJhY3RlZCBieSB0aGUgT09EVCBGaWxlbmFtZSBNZXQgRXh0cmFjdG9yPC9zY2FsYXI+CisgICAgICAgIDxzY2FsYXIgbmFtZT0iRGF0YVByb3ZpZGVyIj5PT0RUPC9zY2FsYXI+CisgICAgPC9ncm91cD4KKzwvaW5wdXQ+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9taW1lLWV4dHJhY3Rvci1tYXAueG1sIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvbWltZS1leHRyYWN0b3ItbWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ1ZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvbWltZS1leHRyYWN0b3ItbWFwLnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxjYXM6bWltZXR5cGVtYXAgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzc2EuZ292LzEuMC9jYXMiIG1hZ2ljPSJmYWxzZSIKKyAgICBtaW1lUmVwbz0ibWltZS10eXBlcy54bWwiPgorCisgIDwhLS0gVGhpcyB3aWxsIGJlIHRoZSBkZWZhdWx0IGV4dHJhY3RvciB1c2VkIGlmIHByb2R1Y3QgZG9lc24ndCBtYXRjaCBhbnkKKyAgICBvZiB0aGUgbWltZS10eXBlcyBkZWZpbmVkIGluIG1pbWUtdHlwZXMueG1sIGZpbGUgKHRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCkgLS0+CisgIDxkZWZhdWx0PgorICAgIDwhLS0geW91IGNhbiBwdXQgYSBkZWZhdWx0IE5hbWluZ0NvbnZlbnRpb24gaGVyZSB0b28uCisgICAgPG5hbWluZ0NvbnZlbnRpb24gaWQ9IlBERk5hbWluZ0NvbnYiIC8+CisgICAgLS0+CisgICAgPCEtLSBZb3UgY2FuIGFkZCBtdWx0aXBsZSBleHRyYWN0b3JzIGhlcmUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUsCisgICAgICBob3dldmVyIGV4dHJhY3RvciBpcyBvcHRpb25hbCwgc28gYmVsb3cgZXh0cmFjdG9yIGNhbiBiZSByZW1vdmVkIC0tPgorICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5NZXRSZWFkZXJFeHRyYWN0b3IiIC8+CisgIDwvZGVmYXVsdD4KKworICA8bWltZSB0eXBlPSJhbGwvcHJvZHVjdHMiPgorICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5NZXRSZWFkZXJFeHRyYWN0b3IiIC8+CisgIDwvbWltZT4KKworICA8IS0tIEV4YW1wbGUgdHlwZSB3aGVyZSBQR0UgZ2VuZXJhdGVzIGEgbWV0YWRhdGEgZmlsZSBmb3IgdGhlIHByb2R1Y3QsIGJ1dAorICAgIHRoZSBwcm9kdWN0IGFsc28gbmVlZHMgYWRkaXRpb25hbCBtZXRhZGF0YSBleHRyYWN0aW9uIGZyb20gaXQuLi4gaW4gdGhlCisgICAgbWltZS10eXBlcy54bWwgZmlsZSB0eHQvcHJvZHVjdCBoYXMgc3VwZXIgdHlwZSBhbGwvcHJvZHVjdHMsIHdoaWNoIG1lYW5zCisgICAgdGhhdCBmb3IgYW55IHByb2R1Y3QgdGhhdCBpcyBhIHR4dC9wcm9kdWN0IHRoZW4gYWxsL3Byb2R1Y3RzIGV4dHJhY3RvcnMKKyAgICB3aWxsIGJlIGZpcnN0IGJlIHJ1biBvbiBpdCAod2hpY2gsIGluIHRoaXMgY2FzZSwgaXMganVzdCBvbmUgZXh0cmFjdG9yCisgICAgd2hpY2ggcmVhZHMgaW4gdGhlIGV4aXN0aW5nIG1ldGFkYXRhIGZpbGUpIGZvbGxvd2VkIGJ5IHR4dC9wcm9kdWN0CisgICAgZXh0cmFjdG9ycyB3aGljaCBpcyBhIGZpbGVuYW1lIGJhc2VkIGV4dHJhY3Rvci4gLS0+CisgIDxtaW1lIHR5cGU9InR4dC9wcm9kdWN0Ij4KKyAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvciI+CisgICAgICA8Y29uZmlnIGZpbGU9ImZpbGVuYW1lLmV4dHJhY3Rvci5jb25maWcueG1sIiAvPgorICAgIDwvZXh0cmFjdG9yPgorICA8L21pbWU+CisKKyAgPCEtLSBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSB0eXBlIHdoZXJlIG9ubHkgb25lIGV4dHJhY3RvciBpcyBydW4gb24KKyAgICBwcm9kdWN0LCB0aGlzIGlzIGJlY2F1c2UgcGRmL3Byb2R1Y3Qgb25seSBzcGVjaWZpZXMgb25lIGV4dHJhY3RvciBhbmQKKyAgICBpbiBtaW1lLXR5cGVzLnhtbCBmaWxlIHBkZi9wcm9kdWN0IGhhcyBubyBzdXBlciB0eXBlLiAtLT4KKyAgPG1pbWUgdHlwZT0icGRmL3Byb2R1Y3QiPgorICAgIDxuYW1pbmdDb252ZW50aW9uIGlkPSJQREZOYW1pbmdDb252IiAvPgorICAgIDxleHRyYWN0b3IgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuZXh0cmFjdG9ycy5GaWxlbmFtZVRva2VuTWV0RXh0cmFjdG9yIj4KKyAgICAgIDxjb25maWcgZmlsZT0iZmlsZW5hbWUuZXh0cmFjdG9yLmNvbmZpZy54bWwiIC8+CisgICAgPC9leHRyYWN0b3I+CisgIDwvbWltZT4KKworICA8IS0tIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHR5cGUgd2hlcmUgdHdvIGV4dHJhY3RvcnMgZ2V0IHJ1bi4uLiB0aGlzIGNhc2UKKyAgICBpcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgaGFuZGxpbmcgdHh0L3Byb2R1Y3QuLi4gdHh0L3Byb2R1Y3Qgd2lsbCBydW4KKyAgICB0aGUgc2FtZSAyIGV4dHJhY3RvcnMgd2hpY2ggdGhpcyB0eXBlIHdpbGwgcnVuIGJ1dCBmb3IgZGlmZmVyZW50IHJlYXNvbnMuLi4KKyAgICBkb2MvcHJvZHVjdCBkb2Vzbid0IGhhdmUgYW55IHN1cGVyIHR5cGUsIGl0IGluc3RlYWQgZGVmaW5lcyBib3RoIGV4dHJhY3RvcnMKKyAgICBkaXJlY3RseSB0byBpdHNlbGYuIC0tPgorICA8bWltZSB0eXBlPSJkb2MvcHJvZHVjdCI+CisgICAgPGV4dHJhY3RvciBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5leHRyYWN0b3JzLk1ldFJlYWRlckV4dHJhY3RvciIgLz4KKyAgICA8ZXh0cmFjdG9yIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvciI+CisgICAgICA8Y29uZmlnIGZpbGU9ImZpbGVuYW1lLmV4dHJhY3Rvci5jb25maWcueG1sIiAvPgorICAgIDwvZXh0cmFjdG9yPgorICA8L21pbWU+Cis8L2NhczptaW1ldHlwZW1hcD4KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL21pbWUtdHlwZXMueG1sIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvbWltZS10eXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMGQ1MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL21pbWUtdHlwZXMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPG1pbWUtaW5mbz4KKwkKKwk8bWltZS10eXBlIHR5cGU9ImFsbC9wcm91ZHVjdHMiIC8+CisKKyAgPG1pbWUtdHlwZSB0eXBlPSJ0eHQvcHJvZHVjdCI+CisgICAgPHN1Yi1jbGFzcy1vZiB0eXBlPSJhbGwvcHJvdWR1Y3RzIiAvPgorICAgIDxnbG9iIHBhdHRlcm49Ii4qXC50eHQiIGlzcmVnZXg9InRydWUiIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0icGRmL3Byb2R1Y3QiPgorICAgIDxnbG9iIHBhdHRlcm49Ii4qXC5wZGYiIGlzcmVnZXg9InRydWUiIC8+CisgIDwvbWltZS10eXBlPgorCisgIDxtaW1lLXR5cGUgdHlwZT0iZG9jL3Byb2R1Y3QiPgorICAgIDxnbG9iIHBhdHRlcm49Ii4qXC5kb2MiIGlzcmVnZXg9InRydWUiIC8+CisgIDwvbWltZS10eXBlPgorPC9taW1lLWluZm8+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9uYW1pbmctYmVhbnMueG1sIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvbmFtaW5nLWJlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QxNGFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvbmFtaW5nLWJlYW5zLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgPGJlYW4gaWQ9IlBERk5hbWluZ0NvbnYiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmZpbGVuYW1pbmcuUGF0aFV0aWxzTmFtaW5nQ29udmVudGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9Im5hbWluZ0NvbnYiIHZhbHVlPSJbUHJvZHVjdFR5cGVdLltOb21pbmFsRGF0ZV0ucGRmIiAvPgorICA8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NyYXdsZXIvcHJlY29uZGl0aW9uLWJlYW5zLnhtbCBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL3ByZWNvbmRpdGlvbi1iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNzA4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL3ByZWNvbmRpdGlvbi1iZWFucy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKwk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuc3ByaW5nLnBvc3Rwcm9jZXNzb3IuU2V0SWRCZWFuUG9zdFByb2Nlc3NvciIgLz4KKworCTwhLS0gUHJlY29uZGl0aW9uIENvbXBhcmF0b3JzIC0tPgorCTxiZWFuIGlkPSJDaGVja1RoYXREYXRhRmlsZVNpemVJc0dyZWF0ZXJUaGFuWmVybyIgbGF6eS1pbml0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5wcmVjb25kaXRpb25zLkZpbGVTaXplQ29tcGFyYXRvciI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrIGlmIHRoZSBjdXJyZW50IGRhdGEgZmlsZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Mb25nIj4wPC92YWx1ZT4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJncmVhdGVyX3RoYW4iIC8+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9IkFwcmlvcmlVbmlxdWVzc0NoZWNrV2l0aEZpbGVtZ3IiIGxhenktaW5pdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuY29tcGFyYXRvci5GaWxlbWdyVW5pcXVlbmVzc0NoZWNrQ29tcGFyYXRvciI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNoZWNrcyB3aGVyZSB0aGUgY3VycmVudCBkYXRhIGZpbGUgZXhpc3RpbmcgaW4gdGhlIGZpbGVtZ3IgYmFzZWQgb24gaXRzIEZJTEVOQU1FIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iY29tcGFyZUl0ZW0iPgorCQkJPHZhbHVlIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIj5mYWxzZTwvdmFsdWU+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZXF1YWxfdG8iIC8+CisJPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9QZ2VDb25maWdGaWxlcy9wZ2UtY29uZmlnLnhtbCBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9QZ2VDb25maWdGaWxlcy9wZ2UtY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZWYxYThkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1BnZUNvbmZpZ0ZpbGVzL3BnZS1jb25maWcueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKworVE9ETyhiZm9zdGVyKTogTWFrZSB0aGlzIGEgd29ya2luZyBleGFtcGxlLgorLS0+Cis8cGdlQ29uZmlnPgorICAgIAorICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJvcHRpb25hbC1OUyIgZmlsZT0iYWJzb2x1dGUtb3ItcmVsYXRpdmUtdG8tdGhpcy1maWxlLWFub3RoZXItcGdlQ29uZmlnLWltcG9ydC1maWxlLXBhdGgiLz4KKyAgICAKKyAgICA8IS0tIGlucHV0IGZpbGUgZm9yIHNjaWVuY2UgUEdFIHRoYXQgbmVlZCB0byBiZSBjcmVhdGVkICAtLT4KKyAgICA8ZHluSW5wdXRGaWxlcz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gb25lIG9yIG1vcmUgb2YgdGhlc2UgLS0+CisgICAgICAgIDxmaWxlIHBhdGg9InBhdGgtd2l0aC1uYW1lLXRvLWNyZWF0ZSIgd3JpdGVyQ2xhc3M9ImNsYXNzLXBhdGgtdG8tU2NpUGdlQ29uZmlnRmlsZVdyaXRlciIgYXJncz0iemVyby1vci1tb3JlLWFyZ3MtY29tbWEtc2VncmVnYXRlZCIvPgorICAgICAgICAKKyAgICA8L2R5bklucHV0RmlsZXM+CisgICAgCisgICAgPCEtLSBob3cgdG8gcnVuIHNjaWVuY2UgUEdFIC0tPgorICAgIDxleGUgZGlyPSJzZXQtd29ya2luZy1kaXItZm9yLXNjcmlwdCIgc2hlbGxUeXBlPSJzY3JpcHQtdHlwZSI+CisgICAgICAgIAorICAgICAgICA8IS0tIG9uZSBvciBtb3JlIG9mIHRoZXNlIC0tPgorICAgICAgICA8Y21kPmxpbmUtaW4tc2NyaXB0LWZpbGU8L2NtZD4KKyAgICAgICAgCisgICAgPC9leGU+CisgICAgCisgICAgPCEtLSBmaWxlcyB0byBpbmdlc3QgLS0+CisgICAgPG91dHB1dD4KKworICAgICAgICA8IS0tIG9uZSBvciBtb3JlIG9mIHRoZXNlIC0tPgorICAgICAgICA8IS0tIGlmIGEgZGlyIHBhdGggaXMgc3BlY2lmaWVkIFdJVEhPVVQgc3BlY2lmeWluZyBhbiBhc3NvY2lhdGVkIAorICAgICAgICAgICAgIHNldCBvZiBmaWxlcyB0YWdzLCBhbG9uZyB3aXRoIHRoZSByZWdFeHAgYW5kIG1ldEZpbGVXcml0ZXJDbGFzcworICAgICAgICAgICAgIGFuZCBhcmdzIHJlcXVpcmVkIHRvIHByb2R1Y2UgbWV0YWRhdGEgQ0FTLVBHRSB3aWxsIFJFUVVJUkUgdGhhdCAKKyAgICAgICAgICAgICB5b3UgcHJvdmlkZSAoYXMgcGFydCBvZiB0aGUgdGFza3MueG1sIGRlZmluaXRpb24gZm9yIHRoaXMgdGFzazoKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBQR0VUYXNrL0luZ2VzdC9NaW1lRXh0cmFjdG9yUmVwbyAtIFBhdGggdG8gQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyJ3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW1lRXh0cmFjdG9yUmVwbyBYTUwgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICBBbmQgYW4gQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyIHdpbGwgYmUgY3JlYXRlZCBpbiBsaWV1IG9mIHRoZSAKKyAgICAgICAgICAgICBTdGRQcm9kdWN0Q3Jhd2xlci4gSW4gYWRkaXRpb24geW91IHdpbGwgbm90IHNlZSB0aGUgZXh0cmFjdGVkCisgICAgICAgICAgICAgbWV0YWRhdGEgcHJvZHVjZWQgYXMgLm1ldCBmaWxlcyBpbiB0aGUgam9iIHdvcmtpbmcgZGlyZWN0b3J5IGZvcgorICAgICAgICAgICAgIHRoZXNlIENBUy1QR0Ugam9icyBhcyB0aGUgZXh0cmFjdGVkIG1ldGFkYXRhIHdvbid0IGJlIHNlcmlhbGl6ZWQuCisgICAgICAgICAtLT4KKyAgICAgICAgPGRpciBwYXRoPSJwYXRoLXRvLWFuLW91dHB1dC1kaXIiIGNyZWF0ZUJlZm9yZUV4ZT0idHJ1ZS1vci1mYWxzZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxkaXIgcGF0aD0icGF0aC10by1hbi1vdXRwdXQtZGlyIiBjcmVhdGVCZWZvcmVFeGU9InRydWUtb3ItZmFsc2UiPgorICAgICAgICAgIDwhLS0gYmFjayBjb21wYXRhYmlsaXR5IHJlLWludHJvZHVjZWQgaW4gT09EVC02NjcKKyAgICAgICAgICAgIGJ5IHNwZWNpZnlpbmcgb25lIG9yIG1vcmUgZmlsZXMgeW91IGNhdXNlIENBUy1QR0UgdG8gZ2VuZXJhdGUgYSBTdGRQcm9kdWN0Q3Jhd2xlciwKKyAgICAgICAgICAgIHRvIGNyYXdsIGdlbmVyYXRlZCBtZXRhZGF0YSBmaWxlcyBkZXJpdmVkIGZyb20gY2FsbGluZyB0aGUgbWV0RmlsZVdyaXRlckNsYXNzIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBvbiBmaWxlcyBtYXRjaGluZyBKYXZhIFJlZ0V4IG9yIGZpbGUgbmFtZSAoZXhhY3QgbWF0Y2gpIGluIHBhdGgtdG8tYW4tb3V0cHV0LWRpci4gTWV0IGZpbGVzIGFyZSBzZXJpYWxpemVkIGFuZCBzdG9yZWQgaW4gdGhlIGpvYgorICAgICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRoZSBDQVMtUEdFIGpvYiByYW4sIGFuZCBhcmUgdGhlbiBpbmdlc3RlZCBpbnRvIHRoZSBmaWxlIG1hbmFnZXIgYWxvbmcKKyAgICAgICAgICAgIHdpdGggdGhlIG9yaWdpbiBkYXRhIGZpbGUuCisgICAgICAgICAgICAKKyAgICAgICAgICAgLS0+CisgICAgICAgICAgPGZpbGVzIHJlZ0V4cD0iamF2YS1yZWdleCIgCisgICAgICAgICAgICAgICAgIG5hbWU9ImZpbGUtbmFtZSIKKyAgICAgICAgICAgICAgICAgbWV0RmlsZVdyaXRlckNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlBjc01ldEZpbGVXcml0ZXIuc3ViY2xhc3MiIAorICAgICAgICAgICAgICAgICBhcmdzPSJ6ZXJvLW9yLW1vcmUtYXJncy1jb21tYS1zZWdyZWdhdGVkIj4KKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgPCEtLSAKKyAgICAgICAgICAgICAgIEEgY29udmVudGlvbiBmb3IgcmVuYW1pbmcgdGhlIGZpbGVzIGFzIHRoZXkgYXJlIHByb2Nlc3NlZCBvbiBvdXRwdXQuCisgICAgICAgICAgICAgICBCeSBkZWZhdWx0IHVzZXMgdGhlIFBhdGhVdGlsc05hbWluZ0NvbnZlbnRpb24uCisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgIDxyZW5hbWluZ0NvbnYgbmFtaW5nRXhwcj0iL1tTb21lUGF0aFV0aWxzXS9bTWV0YWRhdGFdIiBlbnZSZXBsYWNlPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxtZXRhZGF0YSBrZXk9InNvbWUta2V5IiB2YWw9InNvbWUtdmFsIi8+CisgICAgICAgICAgICAgICA8bWV0YWRhdGEga2V5PSJzb21lLW90aGVyLWtleSIgdmFsPSJ6ZXJvLW9yLW1vcmUtdmFscy1jb21tYS1zZWdyZWdhdGVkIi8+ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICA8L3JlbmFtaW5nQ29udj4gICAgICAKKyAgICAgICAgICA8L2ZpbGVzPgorICAgICAgICA8L2Rpcj4KKworICAgIDwvb3V0cHV0PgorICAgIAorICAgIDwhLS0gbWV0YWRhdGEga2V5cyB5b3Ugd2FudCB0byBzZXQgLS0+CisgICAgPGN1c3RvbU1ldGFkYXRhPgorICAgICAgICAKKyAgICAgICAgPCEtLSBvbmUgb3IgbW9yZSBvZiB0aGVzZSAtLT4KKyAgICAgICAgPG1ldGFkYXRhIGtleT0ibmFtZS1vZi1tZXRhZGF0YS1maWVsZCIgdmFsPSJtZXRhZGF0YS12YWx1ZSIvPgorICAgICAgICAKKyAgICA8L2N1c3RvbU1ldGFkYXRhPgorICAgIAorPC9wZ2VDb25maWc+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvV29ya2Zsb3dNZ3JJbnB1dC9wY3MtcGdlLWR5bi1tZXRhZGF0YS5tZXQgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvV29ya2Zsb3dNZ3JJbnB1dC9wY3MtcGdlLWR5bi1tZXRhZGF0YS5tZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMTBmOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9Xb3JrZmxvd01ncklucHV0L3Bjcy1wZ2UtZHluLW1ldGFkYXRhLm1ldApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNhczptZXRhZGF0YSB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKzwhLS0gIHRoaXMgZHluIG1ldGFkYXRhIHNob3VsZCBjb21lIGZyb20gdGhlIHdvcmtmbG93L3Byb2Nlc3MgbWFuYWdlciAtLT4KKyA8a2V5dmFsPgorICAgPGtleT5UYXNrSWQ8L2tleT4KKyAgIDx2YWw+MTwvdmFsPgorIDwva2V5dmFsPgorIDxrZXl2YWw+CisgICA8a2V5PkpvYklkPC9rZXk+CisgICA8dmFsPjE5Mjk8L3ZhbD4KKyA8L2tleXZhbD4KKyA8a2V5dmFsPgorICAgPGtleT5Qcm9jZXNzaW5nTm9kZTwva2V5PgorICAgPHZhbD5jb21wdXRlLTAtMTM8L3ZhbD4KKyA8L2tleXZhbD4KKyAKKyA8IS0tICB0aGlzIGR5bmFtaWMgbWV0YWRhdGEgaXMgdGhlIGFjdHVhbCBpbnB1dCB0byB0aGUgdGFzayAtLT4KKyA8a2V5dmFsPgorICAgPGtleT5TaXRlTmFtZTwva2V5PgorICAgPHZhbD5wYXJrZmFsbHM8L3ZhbD4KKyA8L2tleXZhbD4KKyA8a2V5dmFsPgorICAgPGtleT5JbnN0cnVtZW50SWQ8L2tleT4KKyAgIDx2YWw+aWZzMTwvdmFsPgorIDwva2V5dmFsPgorIDxrZXl2YWw+CisgICA8a2V5PkxvY2FsRGF5PC9rZXk+CisgICA8dmFsPjA1MDUwNjwvdmFsPgorIDwva2V5dmFsPgorIDxrZXl2YWw+CisgICA8a2V5PlByb2R1Y3RUeXBlPC9rZXk+CisgICA8dmFsPklBU0lfQ2FsU3ViPC92YWw+CisgPC9rZXl2YWw+CisgIAorPC9jYXM6bWV0YWRhdGE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1dvcmtmbG93TWdySW5wdXQvcGNzLXBnZS10YXNrLXdvcmtmbG93LnByb3BlcnRpZXMgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvV29ya2Zsb3dNZ3JJbnB1dC9wY3MtcGdlLXRhc2std29ya2Zsb3cucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZTliZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1dvcmtmbG93TWdySW5wdXQvcGNzLXBnZS10YXNrLXdvcmtmbG93LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCitmb29iYXI9Zm9vCmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvV29ya2Zsb3dUYXNrL3Rhc2tzLnhtbCBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9Xb3JrZmxvd1Rhc2svdGFza3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Mjg1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvV29ya2Zsb3dUYXNrL3Rhc2tzLnhtbApAQCAtMCwwICsxLDM3IEBACis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gQSBzYW1wbGUgQ0FTIHdvcmtmbG93IHRhc2sgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBiYXNpYyBzZXQgb2YgCisgICAgIENBUy1QR0UgcHJvcGVydGllcy4gWW91IGNhbiBmaW5kIGEgZnVsbCBsaXN0IG9mIHRoZSBwcm9wZXJ0aWVzCisgICAgIGhlcmU6CisKKyAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RydW5rL3BnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL21ldGFkYXRhL1BnZVRhc2tNZXRLZXlzLmphdmEKKy0tPiAKKzxjYXM6d29ya2Zsb3d0YXNrcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvMS4wL2NhcyI+Cis8dGFzayBpZD0idXJuOm9vZHQ6Y2FzUGdlVGFzayIgbmFtZT0iQ0FTIFBHRSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLlN0ZFBHRVRhc2tJbnN0YW5jZSI+CisgICAgICA8Y29uZGl0aW9ucy8+CisgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrX05hbWUiIHZhbHVlPSJDQVMgUEdFIi8+CisgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFza19Db25maWdGaWxlUGF0aCIgdmFsdWU9IltQR0VfUk9PVF0vcG9saWN5L3BnZS1jb25maWcueG1sIiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUEdFVGFza19EdW1wTWV0YWRhdGEiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUENTX1dvcmtmbG93TWFuYWdlclVybCIgdmFsdWU9IltXT1JLRkxPV19VUkxdIiBlbnZSZXBsYWNlPSJ0cnVlIiAvPgorICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBDU19GaWxlTWFuYWdlclVybCIgdmFsdWU9IltGSUxFTUdSX1VSTF0iIGVudlJlcGxhY2U9InRydWUiLz4KKyAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQQ1NfTWV0RmlsZUV4dGVuc2lvbiIgdmFsdWU9Im1ldCIvPgorICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlBDU19DbGllbnRUcmFuc2ZlclNlcnZpY2VGYWN0b3J5IiB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiLz4KKyAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJQQ1NfQWN0aW9uUmVwb0ZpbGUiIHZhbHVlPSJmaWxlOltDUkFXTEVSX0hPTUVdL3BvbGljeS9jcmF3bGVyLWNvbmZpZy54bWwiIGVudlJlcGxhY2U9InRydWUiLz4KKyAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDxyZXF1aXJlZE1ldEZpZWxkcz4KKyAgICAgIDwvcmVxdWlyZWRNZXRGaWVsZHM+Cis8L3Rhc2s+Cis8L2Nhczp3b3JrZmxvd3Rhc2tzPgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1hzbHRGaWxlcy94c2x0X3Byb3BfZXFfdmFsLnhtbCBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9Yc2x0RmlsZXMveHNsdF9wcm9wX2VxX3ZhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzZmMzYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9Yc2x0RmlsZXMveHNsdF9wcm9wX2VxX3ZhbC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMi4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4gICAgCisKKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGltaXRlciI+PHhzbDp0ZXh0Piw8L3hzbDp0ZXh0PjwveHNsOnZhcmlhYmxlPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZXF1YWxUbyI+PHhzbDp0ZXh0Pj08L3hzbDp0ZXh0PjwveHNsOnZhcmlhYmxlPiAgICAKKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5ld2xpbmUiPjx4c2w6dGV4dD4mI3gwQTs8L3hzbDp0ZXh0PjwveHNsOnZhcmlhYmxlPgorICAgICAgICAKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0YWRhdGEva2V5dmFsIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImtleSIvPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVxdWFsVG8iLz4KKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbCI+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QocG9zaXRpb24oKSA9IGxhc3QoKSkiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaW1pdGVyIi8+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmV3bGluZSIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorICAgICAgICAgICAgCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2ZpbGVjb25jYXRlbmF0b3ItcGdlLnRhciBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9maWxlY29uY2F0ZW5hdG9yLXBnZS50YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzODRlNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9maWxlY29uY2F0ZW5hdG9yLXBnZS50YXIKQEAgLTAsMCArMSwyMzcgQEAKK2ZpbGVjb25jYXRlbmF0b3ItcGdlLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MTAxNDIwIDAxNTYwMSA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS8uY2xhc3NwYXRoMDAwNjQ0IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDEyNzMgMTE2MTcwNTUzMjEgMDE3NTc3IDB1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0idGFyZ2V0L2NsYXNzZXMiIHBhdGg9InNyYy9tYWluL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSIqKiIga2luZD0ic3JjIiBvdXRwdXQ9InRhcmdldC9jbGFzc2VzIiBwYXRoPSJzcmMvbWFpbi9yZXNvdXJjZXMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9InRhcmdldC90ZXN0LWNsYXNzZXMiIHBhdGg9InNyYy90ZXN0L2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSIqKiIga2luZD0ic3JjIiBvdXRwdXQ9InRhcmdldC90ZXN0LWNsYXNzZXMiIHBhdGg9InNyYy90ZXN0L3Jlc291cmNlcyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcubWF2ZW4uaWRlLmVjbGlwc2UuTUFWRU4yX0NMQVNTUEFUSF9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgorPC9jbGFzc3BhdGg+CitmaWxlY29uY2F0ZW5hdG9yLXBnZS8ucHJvamVjdDAwMDY0NCAwMzYxNjQgMDAwMDI0IDAwMDAwMDAxMDQ3IDExNjE3MDU1MzIwIDAxNzI2MSAwdXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5maWxlY29uY2F0ZW5hdG9yLXBnZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5tYXZlbi5pZGUuZWNsaXBzZS5tYXZlbjJCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLm1hdmVuLmlkZS5lY2xpcHNlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgorZmlsZWNvbmNhdGVuYXRvci1wZ2UvLnNldHRpbmdzLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MTAxNDI1IDAxNzUyNCA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9wb20ueG1sMDAwNjQ0IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDE2NjIgMTE2MTcxMDEzMDUgMDE3MTI1IDB1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUub29kdC5wZ2U8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmZpbGVjb25jYXRlbmF0b3ItcGdlPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgIDxuYW1lPkZpbGVDb25jYXRlbmF0b3JQR0U8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5FeGFtcGxlIGZpbGUtY29uY2F0ZW5hdG9yIHByb2plY3QgZm9yIGxlYXJuaW5nIGFib3V0IENBUy1QR0U8L2Rlc2NyaXB0aW9uPgorICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAJPGRlcGVuZGVuY3k+CisgIAkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAJCTxhcnRpZmFjdElkPmNhcy1wZ2U8L2FydGlmYWN0SWQ+CisgIAkJPHZlcnNpb24+MC4zPC92ZXJzaW9uPgorICAJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgCTwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CitmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDE2NDEzIDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIGZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAxNzMzNyA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvdGVzdC8wMDA3NTUgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMDAwMCAxMTYxNzA1NDc1NiAwMTczNzIgNXVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgZmlsZWNvbmNhdGVuYXRvci1wZ2Uvc3JjL3Rlc3QvamF2YS8wMDA3NTUgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMDAwMCAxMTYxNzA1NDc1NiAwMjAzMTMgNXVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgZmlsZWNvbmNhdGVuYXRvci1wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAyMTQwNCA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9qYXZhLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAyMDI2MCA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9yZXNvdXJjZXMvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDIxMzUxIDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIGZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDIyNjE2IDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIGZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leHRyYWN0b3JzLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAyMzU0NyA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZmlsZXMvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDIyNDUzIDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIGZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL3Jlc291cmNlcy9maWxlcy9jb25jYXRlbmF0aW5nSW5wdXRGaWxlMS50eHQwMDA2NDQgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMTYzMyAxMTYxNzA1NDc1NiAwMjc3MzUgMHVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gRnVzY2UgcXVpcyBudW5jCitxdWFtLCB2ZWwgbGFvcmVldCBsaWJlcm8uIFBlbGxlbnRlc3F1ZSBzaXQgYW1ldCBtYXVyaXMgbGlndWxhLiBFdGlhbSBzZWQKK21ldHVzIHZlbCBlbGl0IGZldWdpYXQgYWNjdW1zYW4gYXQgYWMgbmlzaS4gQ3JhcyBhIHR1cnBpcyBzY2VsZXJpc3F1ZQorYXVndWUgc2VtcGVyIG1vbGxpcy4gUHJvaW4gcnV0cnVtIHNvbGxpY2l0dWRpbiBlc3QgYXQgc2NlbGVyaXNxdWUuCitBZW5lYW4gbGlndWxhIGVyb3MsIGx1Y3R1cyBjb25zZXF1YXQgZ3JhdmlkYSBldCwgZ3JhdmlkYSBpbiBsaWd1bGEuIE51bmMKK3ZlbmVuYXRpcyB0ZWxsdXMgaW4gdXJuYSBwbGFjZXJhdCBhY2N1bXNhbi4gVXQgdmVoaWN1bGEgYWRpcGlzY2luZworZmF1Y2lidXMuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuCitQaGFzZWxsdXMgaWQgZGlhbSBzZWQgbnVsbGEgdmVuZW5hdGlzIGxhb3JlZXQgYXQgbmVjIGVsaXQuIFN1c3BlbmRpc3NlCitldCBtYXVyaXMgbmVjIHRvcnRvciB2ZWhpY3VsYSBhbGlxdWV0LiBDcmFzIG9ybmFyZSBkaWduaXNzaW0gdmVzdGlidWx1bS4KK1Zlc3RpYnVsdW0gYWxpcXVldCBtYWduYSBuZWMgZGlhbSBncmF2aWRhIGdyYXZpZGEuIER1aXMgc2VtcGVyLCBlcmF0IGluCit1bHRyaWNlcyBjb252YWxsaXMsIGxvcmVtIGVuaW0gbGFvcmVldCBtYWduYSwgZWdldCBzYWdpdHRpcyBsaWd1bGEgbnVuYworZXUgcXVhbS4gTnVuYyBhYyB0ZW1wdXMgb3JjaS4gUGVsbGVudGVzcXVlIHNlbXBlciBlbGVpZmVuZCBzdXNjaXBpdC4gTmFtCitlc3QgbmlzaSwgc2NlbGVyaXNxdWUgc29kYWxlcyBiaWJlbmR1bSBlZ2V0LCBwb3J0dGl0b3IgZnJpbmdpbGxhIG1ldHVzLiBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9yZXNvdXJjZXMvZmlsZXMvY29uY2F0ZW5hdGluZ0lucHV0RmlsZTIudHh0MDAwNjQ0IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDE0NTMgMTE2MTcwNTQ3NTYgMDI3NzM2IDB1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIAorCitBZW5lYW4gdmVsIG51bGxhIHV0IG51bGxhIHRlbXB1cyB2ZW5lbmF0aXMgaW4gZWdldCBlc3QuIEN1cmFiaXR1cgordGluY2lkdW50IG1hdHRpcyBkb2xvciBydXRydW0gZ3JhdmlkYS4gTnVuYyB2ZWwgZHVpIGV1IGRpYW0gbHVjdHVzCitkaWN0dW0gbm9uIHZpdGFlIGxlby4gTW9yYmkgZXQgdmVsaXQgbmVxdWUuIFBoYXNlbGx1cyBwbGFjZXJhdCBhdWd1ZSBldQorbmlzaSBjb252YWxsaXMgYWRpcGlzY2luZy4gRG9uZWMgc2FnaXR0aXMgdHJpc3RpcXVlIHRlbGx1cywgdXQgYWxpcXVldAorcXVhbSBwZWxsZW50ZXNxdWUgdXQuIFV0IHRvcnRvciBuaWJoLCB1bHRyaWNlcyBpbiBiaWJlbmR1bSB2aXRhZSwgbW9sbGlzCithIGp1c3RvLiBOdWxsYSBmZXJtZW50dW0sIHVybmEgc2VkIGJpYmVuZHVtIHRlbXBvciwgaXBzdW0gbGVvIHRpbmNpZHVudAordGVsbHVzLCBhYyBsYWNpbmlhIHB1cnVzIGp1c3RvIHV0IG5pYmguIFBlbGxlbnRlc3F1ZSBncmF2aWRhLCBtZXR1cworbG9ib3J0aXMgY29udmFsbGlzIGVnZXN0YXMsIGVyYXQgZHVpIHVsbGFtY29ycGVyIGxlbywgdml0YWUgYWxpcXVldAoranVzdG8gbnVuYyBhYyBqdXN0by4gVml2YW11cyBkYXBpYnVzLCBxdWFtIGluIGVsZWlmZW5kIGFsaXF1ZXQsIGVyYXQKK251bGxhIG1vbGVzdGllIGxlY3R1cywgdXQgZ3JhdmlkYSBudW5jIGF1Z3VlIHZpdGFlIG51bGxhLiBOYW0gdnVscHV0YXRlCithcmN1IHV0IGFudGUgcGhhcmV0cmEgYSBkaWN0dW0gbnVuYyB0aW5jaWR1bnQuIE51bmMgdG9ydG9yIHF1YW0sCitjb252YWxsaXMgdmVsIGxhY2luaWEgYWMsIGRpZ25pc3NpbSBzZWQgc2VtLiAKK2ZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL3Jlc291cmNlcy9leHRyYWN0b3JzL2NvbmNhdGVuYXRpbmdmaWxlbmFtZS5leHRyYWN0b3IuY29uZmlnLnhtbDAwMDY0NCAwMzYxNjQgMDAwMDI0IDAwMDAwMDAxMDM3IDExNjE3MDc3NzA2IDAzNDA2NiAwdXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorICA8aW5wdXQ+CisgICAgPGdyb3VwIG5hbWU9IlN1YnN0cmluZ09mZnNldEdyb3VwIj4KKyAgICAgIDx2ZWN0b3IgbmFtZT0iQ29uY2F0ZW5hdGluZ0lucHV0RmlsZU5hbWUiPgorICAgICAgICA8ZWxlbWVudD4xPC9lbGVtZW50PgorICAgICAgICA8ZWxlbWVudD4zMzwvZWxlbWVudD4gICAgICAKKyAgICAgIDwvdmVjdG9yPgorICAgPC9ncm91cD4KKyAgICAKKyAgICA8Z3JvdXAgbmFtZT0iQ29tbW9uTWV0YWRhdGEiPgorICAgICAgICA8c2NhbGFyIG5hbWU9IkRhdGFWZXJzaW9uIj4xLjA8L3NjYWxhcj4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJDb2xsZWN0aW9uTmFtZSI+RmlsZSBDb25jYXRlbmF0b3IgcHJvZHVjdDwvc2NhbGFyPgorICAgICAgICA8c2NhbGFyIG5hbWU9IkRhdGFQcm92aWRlciI+T09EVC1QR0U8L3NjYWxhcj4KKyAgICAgICAgPHNjYWxhciBuYW1lPSJQcm9kdWN0VHlwZSI+RmlsZUNvbmNhdGVuYXRvclByb2R1Y3RUeXBlPC9zY2FsYXI+CisgICAgPC9ncm91cD4KKyAgICAKKzwvaW5wdXQ+ZmlsZWNvbmNhdGVuYXRvci1wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4dHJhY3RvcnMvbWV0bGlzdHdyaXRlci8wMDA3NTUgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMDAwMCAxMTYxNzA1NDc1NiAwMjY0NjUgNXVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgZmlsZWNvbmNhdGVuYXRvci1wZ2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4dHJhY3RvcnMvbWV0bGlzdHdyaXRlci9tZXRvdXQueG1sMDAwNjQ0IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAyMzUgMTE2MTcwNTQ3NTYgMDMwNTI0IDB1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bWV0YWRhdGFMaXN0PgorICAgIAorICAgIDwhLS0gb25lIG9yIG1vcmUgb2YgdGhlc2UgLS0+CisgICAgPG1ldGFkYXRhIGtleT0iSm9iSWQiIHZhbHVlPSJbSm9iSWRdIi8+CisgICAgCis8L21ldGFkYXRhTGlzdD5maWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL1BHRUNvbmZpZy54bWwwMDA2NDQgMDM2MTY0IDAwMDAyNCAwMDAwMDAwNDM3NSAxMTYxNzA3NzcwMSAwMjUxMDUgMHVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwZ2VDb25maWc+CisKKyAgICAgICAgPCEtLSBIb3cgdG8gcnVuIHRoZSBQR0UgLS0+CisgICAgICAgIDxleGUgZGlyPSJbSm9iRGlyXSIgc2hlbGw9Ii9iaW4vYmFzaCI+CisgICAgICAgICAgPCEtLSBjZCB0byBQR0Ugcm9vdCAtLT4KKyAgICAgICAgICA8Y21kPmNkIFtQR0VfUk9PVF0vZmlsZV9jb25jYXRlbmF0b3I8L2NtZD4KKyAgICAgICAgICAgICAgCTxjbWQ+Y3AgW0lucHV0RmlsZTFdIFtPdXRwdXRGaWxlXTwvY21kPgorICAgICAgICAgICAgICAJPGNtZD5jYXQgW0lucHV0RmlsZTJdID4+IFtPdXRwdXRGaWxlXTwvY21kPgorICAgICAgICA8L2V4ZT4KKworCSAgICA8IS0tIEZpbGVzIHRvIGluZ2VzdCAtLT4KKwkgICAgPG91dHB1dD4KKyAgICAgICAgCTwhLS0gb25lIG9yIG1vcmUgb2YgdGhlc2UgLS0+CisgICAgICAgCSAJPGRpciBwYXRoPSJbSm9iRGlyXSIgY3JlYXRlQmVmb3JlRXhlPSJmYWxzZSI+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAk8IS0tIG9uZSBvciBtb3JlIG9mIHRoZXNlICoqIHJlZ0V4cCBvciBuYW1lIGNhbiBiZSB1c2VkLS0+CisgICAgICAgICAgICAJPGZpbGVzIHJlZ0V4cD0iLipcLnR4dCIgbWV0RmlsZVdyaXRlckNsYXNzPSJvcmcuYXBhY2hlLm9vZHQucGdlLmV4YW1wbGVzLmZpbGVjb25jYXRlbmF0b3Iud3JpdGVycy5Db25jYWN0ZW5hdGluZ0ZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyIiAgYXJncz0iW1BHRV9ST09UXS9maWxlX2NvbmNhdGVuYXRvci9leHRyYWN0b3JzL2NvbmNhdGVuYXRpbmdmaWxlbmFtZS5leHRyYWN0b3IuY29uZmlnLnhtbCIvPgorICAgICAgICAgICAgICAgIDxmaWxlcyByZWdFeHA9Ii4qXC50eHQiIG1ldEZpbGVXcml0ZXJDbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy5tZXRsaXN0Lk1ldGFkYXRhTGlzdFBjc01ldEZpbGVXcml0ZXIiIGFyZ3M9IltQR0VfUk9PVF0vZmlsZV9jb25jYXRlbmF0b3IvZXh0cmFjdG9ycy9tZXRsaXN0d3JpdGVyL21ldG91dC54bWwiLz4KKyAgICAgICAgICAgIDwvZGlyPgorICAgICAgICA8L291dHB1dD4KKworICAgICAgICA8IS0tIEN1c3RvbSBtZXRhZGF0YSB0byBhZGQgdG8gb3V0cHV0IGZpbGVzIC0tPgorICAgICAgICA8Y3VzdG9tTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgPCEtLSBoZWxwZnVsIGtleXMgLS0+CisgICAgICAgICAgICAgICAgPG1ldGFkYXRhIGtleT0iTGVzc1RoYW4iIHZhbD0iJiN4M0M7Ii8+CisgICAgICAgICAgICAgICAgPG1ldGFkYXRhIGtleT0iTGVzc1RoYW5PckVxdWFsVG8iIHZhbD0iW0xlc3NUaGFuXT0iLz4KKyAgICAgICAgICAgICAgICA8bWV0YWRhdGEga2V5PSJHcmVhdGVyVGhhbiIgdmFsPSImI3gzRTsiLz4KKyAgICAgICAgICAgICAgICA8bWV0YWRhdGEga2V5PSJHcmVhdGVyVGhhbk9yRXF1YWxUbyIgdmFsPSJbR3JlYXRlclRoYW5dPSIvPgorICAgICAgICAgICAgICAgIDxtZXRhZGF0YSBrZXk9IkV4Y2xhbWF0aW9uIiB2YWw9IiYjMzM7Ii8+CisgICAgICAgICAgICAgICAgPG1ldGFkYXRhIGtleT0iQW1wZXJzYW5kIiB2YWw9IiYjMzg7Ii8+CisgICAgICAgICAgICAgICAgPG1ldGFkYXRhIGtleT0iTm90RXF1YWxUbyIgdmFsPSJbQW1wZXJzYW5kXT0iLz4KKyAgICAgICAgICAgICAgICA8bWV0YWRhdGEga2V5PSJMb2dpY2FsQW5kIiB2YWw9IltBbXBlcnNhbmRdW0FtcGVyc2FuZF0iLz4KKyAgICAgICAgICAgICAgICA8bWV0YWRhdGEga2V5PSJDc2hQaXBlVG9TdGRPdXRBbmRFcnJvciIgdmFsPSJbR3JlYXRlclRoYW5dW0FtcGVyc2FuZF1bRXhjbGFtYXRpb25dIi8+CisKKwkJCQk8bWV0YWRhdGEga2V5PSJQcm9kdWN0aW9uRGF0ZVRpbWUiIHZhbD0iW0RBVEUuVVRDXSIvPgorCQkJCTxtZXRhZGF0YSBrZXk9IkpvYkRpciIgdmFsPSJbUEdFX1JPT1RdL2ZpbGVfY29uY2F0ZW5hdG9yL291dHB1dC9qb2JzL2pvYi1bUHJvZHVjdGlvbkRhdGVUaW1lXSIvPgorCQkJCTxtZXRhZGF0YSBrZXk9IklucHV0RmlsZTEiIHZhbD0iW1BHRV9ST09UXS9maWxlX2NvbmNhdGVuYXRvci9maWxlcy9jb25jYXRlbmF0aW5nSW5wdXRGaWxlMS50eHQiLz4KKwkJCQk8bWV0YWRhdGEga2V5PSJJbnB1dEZpbGUyIiB2YWw9IltQR0VfUk9PVF0vZmlsZV9jb25jYXRlbmF0b3IvZmlsZXMvY29uY2F0ZW5hdGluZ0lucHV0RmlsZTIudHh0Ii8+CisJCQkJPG1ldGFkYXRhIGtleT0iT3V0cHV0RmlsZSIgdmFsPSJbSm9iRGlyXS9jb25jYXRlbmF0ZWRPdXRwdXRGaWxlLVtQcm9kdWN0aW9uRGF0ZVRpbWVdLnR4dCIvPiAgICAgICAgCisgICAgICA8L2N1c3RvbU1ldGFkYXRhPgorCis8L3BnZUNvbmZpZz4KK2ZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL2phdmEvb3JnLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAyMTA0NyA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDIyMjcwIDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIGZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0LzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAyMzIzNSA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wZ2UvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDI0MDEwIDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIGZpbGVjb25jYXRlbmF0b3ItcGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3BnZS9leGFtcGxlcy8wMDA3NTUgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMDAwMCAxMTYxNzA1NDc1NiAwMjU2MjYgNXVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgZmlsZWNvbmNhdGVuYXRvci1wZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGdlL2V4YW1wbGVzL2ZpbGVjb25jYXRlbmF0b3IvMDAwNzU1IDAzNjE2NCAwMDAwMjQgMDAwMDAwMDAwMDAgMTE2MTcwNTQ3NTYgMDMxMTQ2IDV1c3RhcjAwcnZlcm1hc3RhZmYwMDAwMDAgMDAwMDAwIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3BnZS9leGFtcGxlcy9maWxlY29uY2F0ZW5hdG9yL0ZpbGVDb25jYXRlbmF0b3JQR0VUYXNrLmphdmEwMDA2NDQgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMjQyMCAxMTYxNzA1NDc1NiAwMzYzMjcgMHVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgZmlsZWNvbmNhdGVuYXRvci1wZ2VwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wZ2UuZXhhbXBsZXMuZmlsZWNvbmNhdGVuYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLlBHRVRhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0YWRhdGFLZXlzOworCitwdWJsaWMgY2xhc3MgRmlsZUNvbmNhdGVuYXRvclBHRVRhc2sgZXh0ZW5kcyBQR0VUYXNrSW5zdGFuY2UgeworCSAgCisJLyogUEdFIHRhc2sgc3RhdHVzZXMgKi8KKwkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUdJTkdfSU5QVVQgPSAiU1RBR0lORyBJTlBVVCI7CisJICAKKwkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZfRklMRV9CVUlMRCA9ICJCVUlMRElORyBDT05GSUcgRklMRSI7CisJICAKKwkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5JTkdfUEdFID0gIlBHRSBFWEVDIjsKKwkgIAorCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JBV0xJTkcgPSAiQ1JBV0xJTkciOworCisJICAvKiAobm9uLUphdmFkb2MpCisJICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLlBHRVRhc2tJbnN0YW5jZSN1cGRhdGVTdGF0dXMoamF2YS5sYW5nLlN0cmluZykKKwkgICAqLworCSAgQE92ZXJyaWRlCisJICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCSAgICAgU3RyaW5nIHByb3Rlb1N0YXR1cyA9IHRoaXMuY29udmVydFN0YXR1cyhzdGF0dXMpOworCSAgICAgc3VwZXIudXBkYXRlU3RhdHVzKHByb3Rlb1N0YXR1cyk7CisJICB9CisKKwkgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRTdGF0dXMoU3RyaW5nIGNhc1BnZVN0YXR1cykgeworCSAgICBpZiAoY2FzUGdlU3RhdHVzLmVxdWFscyhQZ2VUYXNrTWV0YWRhdGFLZXlzLkNPTkZfRklMRV9CVUlMRCkpIHsKKwkgICAgICAgIHJldHVybiBDT05GX0ZJTEVfQlVJTEQ7CisJICAgIH0gZWxzZSBpZiAoY2FzUGdlU3RhdHVzLmVxdWFscyhQZ2VUYXNrTWV0YWRhdGFLZXlzLlNUQUdJTkdfSU5QVVQpKSB7CisJICAgICAgICByZXR1cm4gU1RBR0lOR19JTlBVVDsKKwkgICAgfSBlbHNlIGlmIChjYXNQZ2VTdGF0dXMuZXF1YWxzKFBnZVRhc2tNZXRhZGF0YUtleXMuQ1JBV0xJTkcpKSB7CisJICAgICAgICByZXR1cm4gQ1JBV0xJTkc7CisJICAgIH0gZWxzZSBpZiAoY2FzUGdlU3RhdHVzLmVxdWFscyhQZ2VUYXNrTWV0YWRhdGFLZXlzLlJVTk5JTkdfUEdFKSkgeworCSAgICAgICAgcmV0dXJuIFJVTk5JTkdfUEdFOworCSAgICB9IGVsc2UKKwkgICAgICAgIHJldHVybiBjYXNQZ2VTdGF0dXM7CisJfQorCSAgCit9CitmaWxlY29uY2F0ZW5hdG9yLXBnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wZ2UvZXhhbXBsZXMvZmlsZWNvbmNhdGVuYXRvci93cml0ZXJzLzAwMDc1NSAwMzYxNjQgMDAwMDI0IDAwMDAwMDAwMDAwIDExNjE3MDU0NzU2IDAzMjY0NSA1dXN0YXIwMHJ2ZXJtYXN0YWZmMDAwMDAwIDAwMDAwMCBvcmcvYXBhY2hlL29vZHQvcGdlL2V4YW1wbGVzL2ZpbGVjb25jYXRlbmF0b3Ivd3JpdGVycy9Db25jYWN0ZW5hdGluZ0ZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyLmphdmEwMDA2MDAgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMjEyNSAxMTYxNzA3NzIxMyAwNDMwNjQgMHVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgZmlsZWNvbmNhdGVuYXRvci1wZ2Uvc3JjL21haW4vamF2YXBhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBnZS5leGFtcGxlcy5maWxlY29uY2F0ZW5hdG9yLndyaXRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLmV4dHJhY3RvcnMuRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlBjc01ldEZpbGVXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBDb25jYWN0ZW5hdGluZ0ZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyIGV4dGVuZHMgUGNzTWV0RmlsZVdyaXRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDb25jYWN0ZW5hdGluZ0ZpbGVuYW1lRXh0cmFjdG9yV3JpdGVyLmNsYXNzCisJCSAgICAgIC5nZXROYW1lKCkpOwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTWV0YWRhdGEgZ2V0U2NpUGdlU3BlY2lmaWNNZXRhZGF0YShGaWxlIHNjaVBnZUNyZWF0ZWREYXRhRmlsZSwKKwkJCU1ldGFkYXRhIGlucHV0TWV0YWRhdGEsIE9iamVjdC4uLiBjdXN0b21BcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKwkJbWV0LmFkZE1ldGFkYXRhKGlucHV0TWV0YWRhdGEpOworCQltZXQuYWRkTWV0YWRhdGEoIlByb2R1Y3RUeXBlIiwgIkdlbmVyaWNGaWxlIik7CisJCQorCSAgICBTdHJpbmcgbWV0Q29uZkZpbGVQYXRoID0gU3RyaW5nLnZhbHVlT2YoY3VzdG9tQXJnc1swXSk7CisJICAgIExPRy5pbmZvKCJtZXRDb25mRmlsZVBhdGggPSBbIittZXRDb25mRmlsZVBhdGgrIl0iKTsKKwkgICAgRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRmlsZW5hbWVUb2tlbk1ldEV4dHJhY3RvcigpOworCSAgICBleHRyYWN0b3Iuc2V0Q29uZmlnRmlsZShtZXRDb25mRmlsZVBhdGgpOworCSAgICBtZXQuYWRkTWV0YWRhdGEoZXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShzY2lQZ2VDcmVhdGVkRGF0YUZpbGUpKTsKKwkgICAgCisJCXJldHVybiBtZXQ7CisJfQorCit9CitmaWxlY29uY2F0ZW5hdG9yLXBnZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMwMDA2NDQgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMDQxNCAxMTYxNzA1NTMyMCAwMjQ1MDcgMHVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgI0ZyaSBBdWcgMDUgMTQ6MDQ6MTYgUERUIDIwMTEKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKK2ZpbGVjb25jYXRlbmF0b3ItcGdlLy5zZXR0aW5ncy9vcmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnMwMDA2NDQgMDM2MTY0IDAwMDAyNCAwMDAwMDAwMDQwNiAxMTYxNzA1NTMwMCAwMjQ2NDQgMHVzdGFyMDBydmVybWFzdGFmZjAwMDAwMCAwMDAwMDAgI0ZyaSBBdWcgMDUgMTQ6MDQ6MDAgUERUIDIwMTEKK2FjdGl2ZVByb2ZpbGVzPQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2Z1bGxCdWlsZEdvYWxzPXByb2Nlc3MtdGVzdC1yZXNvdXJjZXMKK2luY2x1ZGVNb2R1bGVzPWZhbHNlCityZXNvbHZlV29ya3NwYWNlUHJvamVjdHM9dHJ1ZQorcmVzb3VyY2VGaWx0ZXJHb2Fscz1wcm9jZXNzLXJlc291cmNlcyByZXNvdXJjZXNcOnRlc3RSZXNvdXJjZXMKK3NraXBDb21waWxlclBsdWdpbj10cnVlCit2ZXJzaW9uPTEKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGI2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgdHdvIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcgorCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgcm9vdCBsb2dnZXIKKy5sZXZlbCA9IEFMTAorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwgPSBBTEwKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxldmVsID0gQUxMCisgICAgICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKworIyBkZWZhdWx0IGZpbGUgb3V0cHV0IGlzIGluIHVzZXIncyBob21lIGRpcmVjdG9yeS4KK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm4gPSAuLi9sb2dzL2Nhc19wZ2UlZy5sb2cKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0ID0gNTAwMDAKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmNvdW50ID0gNQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuYXBwZW5kID0gdHJ1ZQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgc3Vic3lzdGVtcworCisjIGNhdGFsb2cgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuY2F0YWxvZy5sZXZlbCA9IElORk8KKworIyByZXBvc2l0b3J5IHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnJlcG9zaXRvcnkubGV2ZWwgPSBGSU5FCisKKyMgc3lzdGVtIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5sZXZlbCA9IElORk8KKworIyB2ZXJzaW9uaW5nIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZlcnNpb25pbmcubGV2ZWwgPSBJTkZPCisKKyMgZGF0YSB0cmFuc2ZlciBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIubGV2ZWwgPSBGSU5FCisKKyMgdXRpbAorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnV0aWwubGV2ZWwgPSBJTkZPCisKKyMgdmFsaWRhdGlvbgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnZhbGlkYXRpb24ubGV2ZWwgPSBJTkZPCisKKyMgY29udHJvbCB0aGUgdW5kZXJseWluZyBjb21tb25zLWh0dHBjbGllbnQgdHJhbnNwb3J0IGxheWVyIGZvciB4bWxycGMgCitvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5oZWFkZXIubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUubGV2ZWwgPSBJTkZPCisKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLXBnZS5qcGcgYi8wLjEwL3BnZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wZ2UuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Zjc3YzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wZ2UuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLXBnZS5wc2QgYi8wLjEwL3BnZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wZ2UucHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYTU4M2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wZ2UucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcGdlX2luc3RhbmNlX3BsdWdpbl9wb2ludHMucG5nIGIvMC4xMC9wZ2Uvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9wZ2VfaW5zdGFuY2VfcGx1Z2luX3BvaW50cy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzZDNlNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcGdlX2luc3RhbmNlX3BsdWdpbl9wb2ludHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy9zaXRlL3NpdGUueG1sIGIvMC4xMC9wZ2Uvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDczMzhiNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iY2FzLXBnZSI+CisKKyAgPGJvZHk+CisgICAgPGxpbmtzPgorICAgICAgPGl0ZW0gbmFtZT0iT09EVCIgaHJlZj0iLi4vb29kdC1zaXRlLyIvPgorICAgIDwvbGlua3M+CisKKyAgICA8bWVudSByZWY9InJlcG9ydHMiIGluaGVyaXQ9ImJvdHRvbSIvPgorICAgIDxtZW51IG5hbWU9IlNvZnR3YXJlIERvY3VtZW50YXRpb24iPgorICAgICAgPGl0ZW0gbmFtZT0iRGV2ZWxvcGVyIEd1aWRlIiBocmVmPSJkZXZlbG9wbWVudC9kZXZlbG9wZXIuaHRtbCIvPgorICAgIDwvbWVudT4KKyAgPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9kZXZlbG9wZXIueG1sIGIvMC4xMC9wZ2Uvc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9kZXZlbG9wZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmQ2YzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L2RldmVsb3Blci54bWwKQEAgLTAsMCArMSwxMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAgPHByb3BlcnRpZXM+CisgICAgICA8dGl0bGU+Q0FTIFBHRSBCYXNpYyBEZXZlbG9wZXIgR3VpZGU8L3RpdGxlPgorICAgICAgPGF1dGhvciBlbWFpbD0iaG9sZW5vdGVyQG1lLmNvbSI+QnJpYW4gRm9zdGVyPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJydmVybWFAanBsLm5hc2EuZ292Ij5SaXNoaSBWZXJtYTwvYXV0aG9yPgorICAgPC9wcm9wZXJ0aWVzPgorCisgICA8Ym9keT4KKyAgIAorICAgICAgPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgVGhpcyBpcyB0aGUgZGV2ZWxvcGVyIGd1aWRlIGZvciB0aGUgQXBhY2hlIE9PRFQgQ2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2aWNlIChDQVMpIAorICAgICAgICAgIFByb2dyYW0gR2VuZXJhdGlvbiBFeGVjdXRhYmxlIChQR0UpIGNvbXBvbmVudCwgb3IgQ0FTLVBHRSBmb3Igc2hvcnQuIFRoaXMgZ3VpZGUgCisgICAgICAgICAgZXhwbGFpbnMgdGhlIENBUy1QR0UgYXJjaGl0ZWN0dXJlIGFzIHdlbGwgYXMgaXRzIHRhaWxvcmFibGUgZXh0ZW5zaW9uIAorICAgICAgICAgIHBvaW50cy4gCisgICAgICAgICAKKyAgICAgICAgPHA+VGhlIHJlbWFpbmRlciBvZiB0aGlzIGd1aWRlIGlzIHNlcGFyYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PC9wPgorICAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMSI+UHJvamVjdCBEZXNjcmlwdGlvbjwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24yIj5BcmNoaXRlY3R1cmU8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMyI+RXh0ZW5zaW9uIFBvaW50czwvYT48L2xpPgorICAgICAgPC91bD4KKyAgICAgICAgPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjEiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlByb2plY3QgRGVzY3JpcHRpb24iPgorICAgICAgICA8cD5JbiBvcmRlciB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBDQVMtUEdFIGNvbXBvbmVudCwgaXQgaXMgaGVscGZ1bCB0byBoYXZlIGEgc29saWQgZ3Jhc3AKKyAgICAgICAgb2YgdGhlIENBUyBXb3JrZmxvdyBjb21wb25lbnQuIElmIHlvdSBuZWVkIHNvbWUgYmFja2dyb3VuZCBvbiBDQVMgV29ya2Zsb3csIHBsZWFzZQorICAgICAgICBzZWUgb3VyIDxhIGhyZWY9Ii4uLy4uL3dvcmtmbG93L2RldmVsb3BtZW50L2RldmVsb3Blci5odG1sIj5DQVMgV29ya2Zsb3cgRGV2ZWxvcGVyIEd1aWRlPC9hPi4KKyAgICAgICAgV2l0aCBDQVMgV29ya2Zsb3cgaW4gbWluZCwgaXQgaXMgb2Z0ZW4gdGhlIGNhc2UgdGhhdCBDQVMgV29ya2Zsb3cgaXMgdXNlZCBhcyBwYXJ0IG9mIGEgZGF0YSAKKyAgICAgICAgcHJvY2Vzc2luZyBzeXN0ZW0gLSB3aGVyZSAKKyAgICAgICAgd29ya2Zsb3dzIGFyZSByZXNwb25zaWJsZSBmb3IgY29udHJvbGxpbmcgdGhlIHJ1biBvcmRlciBvZiBkaWZmZXJlbnQgUHJvZHVjdCBHZW5lcmF0aW9uIAorICAgICAgICBFeGVjdXRhYmxlcyAoUEdFcykuIEluIGNpcmN1bXN0YW5jZXMgbGlrZSB0aGlzLCBDQVMtUEdFIGNhbiBoZWxwIHdyYXAgYSBQR0UgYXMgcGFydCBvZiBhCisgICAgICAgIENBUyBXb3JrZmxvdy4gT25lIGNhbiB0aGluayBvZiBhIFBHRSBhcyBhIHBpZWNlIG9mIGNvZGUsIHdoaWNoIGdpdmVuIGEgc2V0IG9mIGlucHV0cywgCisgICAgICAgIGdlbmVyYXRlcyBvdXRwdXQgZmlsZXMuIFRodXMsIENBUy1QR0UgaXMgZGVzaWduZWQgdG8gaGVscCBhY2NvbXBsaXNoIHRoZSBtb3N0IGNvbW1vbiBhY3Rpb25zIAorICAgICAgICByZXF1aXJlZCB0byBydW4gUEdFczogaWUuIGZpbmRpbmcgdGhlaXIgaW5wdXQgZmlsZXMsIGV4ZWN1dGluZyB0aGUgUEdFLCBhbmQgc2F2aW5nIHRoZWlyIG91dHB1dCBmaWxlcy4gCisgICAgICAgIENBUy1QR0UgcGVyZm9ybXMgc29tZSBvZiB0aGVzZSBhY3Rpb25zIGJ5IGludGVyYWN0aW5nIHdpdGggYSBzZWNvbmQgQ0FTIGNvbXBvbmVudCBhcyB3ZWxsOiAKKyAgICAgICAgQ0FTIEZpbGUgTWFuYWdlci4gIFRoZSBDQVMgRmlsZSBNYW5hZ2VyIGNhbiBiZSBwYXJ0IG9mIHRoaXMgdHlwZSBvZiB3b3JrZmxvdy1iYXNlZCBkYXRhIHByb2Nlc3NpbmcgCisgICAgICAgIHN5c3RlbSwgd2hpY2ggbWFuYWdlcyBkYXRhIGZpbGVzLCBhbmQgY2FuIHN1cHBvcnQgbWV0YWRhdGEtZmlsdGVyaW5nIHF1ZXJpZXMgYWNyb3NzIHRob3NlCisgICAgICAgIGZpbGVzIHRvIGFsbG93IGZvciBmYXN0IHJldHJpZXZhbC4gSW4gb3RoZXIgd29yZHMsIENBUyBGaWxlIE1hbmdlciBjb21wbGVtZW50cyBDQVMtUEdFIGJ5IAorICAgICAgICBzdXBwb3J0aW5nIGZpbGUgY2F0YWxvZ2luZyBmb3IgZmlsZXMgaW52b2x2ZWQgaW4gUEdFIG9wZXJhdGlvbnMuIDwvcD4KKyAgICAgICAgPHA+SW4gc3VtbWFyeSwgQ0FTLVBHRSdzIHJvbGUgaXMgdG8gcHJvdmlkZSB0b29scyBmb3IgCisgICAgICAgIGVuY2Fwc3VsYXRpbmcgUEdFczsgaG93ZXZlciwgaXQgYWxzbyBzZWVrcyB0byBsZXZlcmFnZSBhbmQgbWFrZSB0aGUgdXNlIG9mIG90aGVyIENBUyAKKyAgICAgICAgY29tcG9uZW50cyB0byBzdXBwb3J0IHRoZSBhZm9yZW1lbnRpb25lZCBnb2FsLjwvcD4gCisgICAgICA8L3NlY3Rpb24+ICAgIAorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iQXJjaGl0ZWN0dXJlIj4KKyAgICAgIDxwPltUQkRdPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMyIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iRXh0ZW5zaW9uIFBvaW50cyI+CisJICA8cD5QR0VzIHVzdWFsbHkgbmVlZCBhIG1ldGhvZCBieSB3aGljaCBpbmZvcm1hdGlvbiBpcyBnaXZlbiB0byB0aGVtIG9uIGhvdworCQl0byBydW4sIHdoYXQgdG8gcnVuIHdpdGggKGkuZS4gaW5wdXQgZmlsZXMpLCBhbmQgd2hlcmUgdG8gcGxhY2UgdGhlCisJCW91dHB1dCBmaWxlcyBhcyB3ZWxsIGFzIHdoYXQgdG8gbmFtZSB0aGVtLiBDQVMtUEdFIGFjY29tcGxpc2hlcyB0aGlzLCBhbmQgb3RoZXIgdGFza3MsCisJCWJ5IG1ha2luZyB1c2Ugb2YgY3VzdG9taXphYmxlIGV4dGVuc2lvbiBwb2ludHMuCisJIDwvcD4KKwkgPHA+VGhlIGZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtb3N0IGNvbW1vbiBleHRlbnNpb24gcG9pbnRzPC9wPgorCSA8dWw+CisJICAgPGxpPjxiPlNjaVBnZUNvbmZpZ0ZpbGVXcml0ZXI8L2I+IC0gd3JpdGVzIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGRlc2NyaWJpbmcgaG93IGEgCisJICAgUEdFIHdpbGwgcnVuLCB3aXRoIHdoaWNoIGlucHV0IGZpbGVzIGl0IHdpbGwgcnVuIHdpdGgsIGFuZCB3aGVyZSB0aGUgb3V0cHV0IHdpbGwgYmUgcGxhY2VkPC9saT4KKwkgICA8bGk+PGI+UGNzTWV0RmlsZVdyaXRlcjwvYj4gLSBjb250cm9scyB3aGljaCBtZXRhZGF0YSBzaG91bGQgYmUgc2VudCB0byB0aGUgQ0FTIEZpbGUgCisJICAgTWFuYWdlciAod2l0aCBlYWNoIG91dHB1dCBmaWxlKSBmb3IgaW5nZXN0aW9uPC9saT4KKwkgICA8bGk+PGI+UEdFVGFza0luc3RhbmNlPC9iPiAtIGFuIGV4dGVuc2libGUgbW9kdWxlIHdoaWNoIHBlcmZvcm1zIHRoZSBtb3N0IGdlbmVyaWMgCisJICAgYW5kIGNvbW1vbiBhY3Rpb25zIHJlcXVpcmVkIGJ5IHR5cGljYWwgUEdFcy4gVGhpcyBtb2R1bGUgbWFrZXMgZ2V0dGluZyBzdGFydGVkIHdpdGggYQorCSAgIGRlZmF1bHQgUEdFIGNvbmZpZ3VyYXRpb24gc2ltcGxlLjwvbGk+CisJICAgPGxpPjxiPlBnZUNvbmZpZ0J1aWxkZXI8L2I+IC0gYnVpbGRzIGEgUGdlQ29uZmlnIG9iamVjdCwgd2hpY2ggaGFzIHRoZSBhYmlsaXR5IHRvCisJICAgY29udHJvbCBob3cgYSBDQVMtUEdFIHdpbGwgcnVuPC9saT4KKwkgICA8L3VsPgorCSAgIAorCSAgIDxwPlRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBleHRlbnNpb24tcG9pbnRzIGFuZCBvdGhlciBDQVMtUEdFIGNvbXBvbmVudHMgCisJICAgaXMgZGVzY3JpYmVkIGluIHRoZSBiZWxvdyBmaWd1cmUuIDwvcD4KKwkgICAKKwkgICA8cD48aW1nIHNyYz0iLi4vaW1hZ2VzL3BnZV9pbnN0YW5jZV9wbHVnaW5fcG9pbnRzLnBuZyIgCisgICAgICAgIGFsdD0iRXh0ZW5zaW9uIFBvaW50cyIvPjwvcD4gICAgCisJICAgCisJICAgPHN1YnNlY3Rpb24gbmFtZT0iUnVudGltZSBFeGVjdXRpb24iPgorCSAgIDxwPgorCSAgIEluIHRlcm1zIG9mIHJ1bnRpbWUgZXhlY3V0aW9uLCBDQVMtUEdFIG1ha2VzIHVzZSBvZiB0d28gbWVkaXVtcyB0byBjb25maWd1cmUgaG93IGEgCisJICAgUEdFIHdpbGwgcnVuOiBtZXRhZGF0YSBhbmQgYSAKKwkgICBQZ2VDb25maWcgb2JqZWN0LiBVc2luZyB0aGVzZSB0d28gcGllY2VzIG9mIGluZm9ybWF0aW9uLCBDQVMtUEdFIGNhbiBjb25maWd1cmUgaG93IAorCSAgIG1hbnkgY29uZmlndXJhdGlvbiBmaWxlcyBpdCBzaG91bGQgZ2VuZXJhdGUsIHdoaWNoIFNjaVBnZUNvbmZpZ0ZpbGVXcml0ZXIocykgdG8gdXNlIHRvIGNyZWF0ZSAKKwkgICB0aGVzZSBjb25maWd1cmF0aW9uIGZpbGVzLCB3aGljaCBvdXRwdXQgZmlsZXMgbmVlZCB3aGljaCBQY3NNZXRGaWxlV3JpdGVyIHRvIGdlbmVyYXRlIHRoZWlyCisJCW1ldGFkYXRhIGZvciBDQVMgRmlsZSBNYW5hZ2VyIGluZ2VzdGlvbiwgaG93IHRvIHJ1biB0aGUgUEdFLCB3aGljaCBDQVMgRmlsZQorCQlNYW5hZ2VyIHRvIHRhbGsgdG8sIGV0Yy4gIEZvciB0aGUgZmlyc3QgbWVkaXVtIChtZXRhZGF0YSksIHRoZXJlIGlzIGEgc2V0IG9mIHJlc2VydmVkIG1ldGFkYXRhCisJCWZpZWxkcyB0aGF0IENBUy1QR0UgZXhwZWN0cywgd2hpY2ggYWZmZWN0cyB0aGUgd2F5IENBUy1QR0UgcnVucyAoaS5lLiB3aGljaCBDQVMKKwkJRmlsZSBNYW5hZ2VyIHRvIGluZ2VzdCB0bykuICBGb3IgdGhlIHNlY29uZCBtZWRpdW0gKFBnZUNvbmZpZyksIHRoZSBQZ2VDb25maWdCdWlsZGVyIGJ1aWxkcyB1cCBhIAorCQlQZ2VDb25maWcgb2JqZWN0LCB3aGljaCBjYW4gYWxzbyBjb250cm9sIGhvdyBDQVMtUEdFIHJ1bnMuIAorICAgICAgPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgCisgICA8L2JvZHk+Cis8L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvTW9ja0NvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyLmphdmEgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL01vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjA4M2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL01vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VNZXRhZGF0YTsKKworLyoqCisgKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25maWdGaWxlUHJvcGVydHlBZGRlcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrQ29uZmlnRmlsZVByb3BlcnR5QWRkZXIgaW1wbGVtZW50cyBDb25maWdGaWxlUHJvcGVydHlBZGRlciB7CisKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9DT1VOVEVSID0gIk1vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci9SdW5Db3VudGVyIjsKKworICAgcHVibGljIHZvaWQgYWRkQ29uZmlnUHJvcGVydGllcyhQZ2VNZXRhZGF0YSBtZXRhZGF0YSwgT2JqZWN0Li4uIG9ianMpIHsKKyAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBvYmpzWzBdOworICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgb2Jqc1sxXTsKKyAgICAgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShrZXksIHZhbHVlKTsKKyAgICAgIFN0cmluZyBydW5Db3VudGVyID0gbWV0YWRhdGEuZ2V0TWV0YWRhdGEoUlVOX0NPVU5URVIpOworICAgICAgaWYgKHJ1bkNvdW50ZXIgPT0gbnVsbCkgeworICAgICAgICAgbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKFJVTl9DT1VOVEVSLCAiMSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIG1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShSVU5fQ09VTlRFUiwgSW50ZWdlci50b1N0cmluZyhJbnRlZ2VyLnBhcnNlSW50KHJ1bkNvdW50ZXIpICsgMSkpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9UZXN0UEdFVGFza0luc3RhbmNlLmphdmEgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL1Rlc3RQR0VUYXNrSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVlYTNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9UZXN0UEdFVGFza0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZTsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkFDVElPTl9JRFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLkFUVEVNUFRfSU5HRVNUX0FMTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuQ09ORklHX0ZJTEVfUEFUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuQ1JBV0xFUl9DT05GSUdfRklMRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuQ1JBV0xFUl9DUkFXTF9GT1JfRElSUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuQ1JBV0xFUl9SRUNVUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuRFVNUF9NRVRBREFUQTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuSU5HRVNUX0NMSUVOVF9UUkFOU0ZFUl9TRVJWSUNFX0ZBQ1RPUlk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLklOR0VTVF9GSUxFX01BTkFHRVJfVVJMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5NSU1FX0VYVFJBQ1RPUl9SRVBPOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5cy5QR0VfQ09ORklHX0JVSUxERVI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLlBST1BFUlRZX0FEREVSUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuUkVRVUlSRURfTUVUQURBVEE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzLldPUktGTE9XX01BTkFHRVJfVVJMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrU3RhdHVzLkNSQVdMSU5HOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlTW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY3Jhd2wuUHJvZHVjdENyYXdsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC5hY3Rpb24uQ3Jhd2xlckFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLmFjdGlvbi5Nb3ZlRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnN0YXR1cy5Jbmdlc3RTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25maWcuRHluYW1pY0NvbmZpZ0ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLk1vY2tQZ2VDb25maWdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5PdXRwdXREaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnLlBnZUNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VUYXNrU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuTW9ja0R5bmFtaWNDb25maWdGaWxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW0uWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIFBHRVRhc2tJbnN0YW5jZX0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UEdFVGFza0luc3RhbmNlIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZT4gdG1wRGlycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmb3IgKEZpbGUgdG1wRGlyIDogdG1wRGlycykgeworICAgICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRtcERpcik7CisgICAgICB9CisgICAgICB0bXBEaXJzLmNsZWFyKCk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkUHJvcGVydHlBZGRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFBHRVRhc2tJbnN0YW5jZSBwZ2VUYXNrID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICBDb25maWdGaWxlUHJvcGVydHlBZGRlciBwcm9wQWRkZXIgPSBwZ2VUYXNrCisgICAgICAgICAgICAubG9hZFByb3BlcnR5QWRkZXIoTW9ja0NvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyLmNsYXNzCisgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgIGFzc2VydE5vdE51bGwocHJvcEFkZGVyKTsKKyAgICAgIGFzc2VydFRydWUocHJvcEFkZGVyIGluc3RhbmNlb2YgTW9ja0NvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFJ1blByb3BlcnR5QWRkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBQR0VUYXNrSW5zdGFuY2UgcGdlVGFzayA9IGNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoUFJPUEVSVFlfQURERVJTLAorICAgICAgICAgICAgTW9ja0NvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICBwZ2VUYXNrLnBnZUNvbmZpZy5zZXRQcm9wZXJ0eUFkZGVyQ3VzdG9tQXJncyhuZXcgT2JqZWN0W10geyAia2V5IiwKKyAgICAgICAgICAgICJ2YWx1ZSIgfSk7CisgICAgICBwZ2VUYXNrLnJ1blByb3BlcnR5QWRkZXJzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcGdlVGFzay5wZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgia2V5IikpOworCisgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YSgKKyAgICAgICAgICAgIE1vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5SVU5fQ09VTlRFUiwgIjAiKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKFBST1BFUlRZX0FEREVSUywgTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAgICAgTW9ja0NvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKKyAgICAgICAgICAgIE1vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICAgIHBnZVRhc2sucnVuUHJvcGVydHlBZGRlcnMoKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBwZ2VUYXNrLnBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJrZXkiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIjIiLAorICAgICAgICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YQorICAgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKE1vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5SVU5fQ09VTlRFUikpOworCisgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YSgKKyAgICAgICAgICAgIE1vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5SVU5fQ09VTlRFUiwgIjAiKTsKKyAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShQZ2VUYXNrTWV0S2V5cy5VU0VfTEVHQUNZX1BST1BFUlRZLCAidHJ1ZSIpOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoUFJPUEVSVFlfQURERVJTLmdldE5hbWUoKSwKKyAgICAgICAgICAgIE1vY2tDb25maWdGaWxlUHJvcGVydHlBZGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgcGdlVGFzay5ydW5Qcm9wZXJ0eUFkZGVycygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHBnZVRhc2sucGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoImtleSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiMSIsCisgICAgICAgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoTW9ja0NvbmZpZ0ZpbGVQcm9wZXJ0eUFkZGVyLlJVTl9DT1VOVEVSKSk7CisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShQZ2VUYXNrTWV0S2V5cy5VU0VfTEVHQUNZX1BST1BFUlRZKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVBnZU1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBTdHJpbmcgUEdFX05BTUUgPSAiUEdFX1Rlc3QiOworICAgICAgZmluYWwgU3RyaW5nIFBHRV9SRVFVSVJFRF9NRVRBREFUQSA9ICJGaWxlbmFtZSwgRmlsZUxvY2F0aW9uICI7CisgICAgICBmaW5hbCBTdHJpbmcgUFJPUF9BRERFUlMgPSAic29tZS5wcm9wLmFkZGVyLmNsYXNzcGF0aCxzb21lLm90aGVyLmNsYXNzcGF0aCI7CisgICAgICBQR0VUYXNrSW5zdGFuY2UgcGdlVGFzayA9IGNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgTWV0YWRhdGEgZHluTWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCk7CisgICAgICBjb25maWcuYWRkQ29uZmlnUHJvcGVydHkoTkFNRS5nZXROYW1lKCksIFBHRV9OQU1FKTsKKyAgICAgIGNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eShSRVFVSVJFRF9NRVRBREFUQS5nZXROYW1lKCksCisgICAgICAgICAgICBQR0VfUkVRVUlSRURfTUVUQURBVEEpOworICAgICAgY29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KFBST1BFUlRZX0FEREVSUy5nZXROYW1lKCksIFBST1BfQURERVJTKTsKKworICAgICAgUGdlTWV0YWRhdGEgcGdlTWV0ID0gcGdlVGFzay5jcmVhdGVQZ2VNZXRhZGF0YShkeW5NZXQsIGNvbmZpZyk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgcGdlTWV0LmdldEFsbE1ldGFkYXRhKE5BTUUpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoUEdFX05BTUUsIHBnZU1ldC5nZXRBbGxNZXRhZGF0YShOQU1FKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBnZU1ldC5nZXRBbGxNZXRhZGF0YShSRVFVSVJFRF9NRVRBREFUQSkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydFRydWUocGdlTWV0LmdldEFsbE1ldGFkYXRhKFJFUVVJUkVEX01FVEFEQVRBKS5jb250YWlucygiRmlsZW5hbWUiKSk7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5nZXRBbGxNZXRhZGF0YShSRVFVSVJFRF9NRVRBREFUQSkuY29udGFpbnMoCisgICAgICAgICAgICAiRmlsZUxvY2F0aW9uIikpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBnZU1ldC5nZXRBbGxNZXRhZGF0YShQUk9QRVJUWV9BRERFUlMpLnNpemUoKSk7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5nZXRBbGxNZXRhZGF0YShQUk9QRVJUWV9BRERFUlMpLmNvbnRhaW5zKAorICAgICAgICAgICAgInNvbWUucHJvcC5hZGRlci5jbGFzc3BhdGgiKSk7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5nZXRBbGxNZXRhZGF0YShQUk9QRVJUWV9BRERFUlMpLmNvbnRhaW5zKAorICAgICAgICAgICAgInNvbWUub3RoZXIuY2xhc3NwYXRoIikpOworCisgICAgICAvLyBWZXJpZnkgc3RpbGwgd29ya3Mgd2hlbiBvbmx5IG9uZSBwcm9wZXJ0eSBhZGRlciBpcyBzcGVjaWZpZWQuCisgICAgICBwZ2VUYXNrID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICBjb25maWcgPSBuZXcgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbigpOworICAgICAgY29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KFBnZVRhc2tNZXRLZXlzLlBST1BFUlRZX0FEREVSUy5nZXROYW1lKCksCisgICAgICAgICAgICAib25lLnByb3AuYWRkZXIub25seSIpOworCisgICAgICBwZ2VNZXQgPSBwZ2VUYXNrLmNyZWF0ZVBnZU1ldGFkYXRhKGR5bk1ldCwgY29uZmlnKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBwZ2VNZXQuZ2V0QWxsTWV0YWRhdGEoUFJPUEVSVFlfQURERVJTKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUucHJvcC5hZGRlci5vbmx5IiwgcGdlTWV0CisgICAgICAgICAgICAuZ2V0QWxsTWV0YWRhdGEoUFJPUEVSVFlfQURERVJTKS5nZXQoMCkpOworICAgfQorCisgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gRmlsZVV0aWxzLnJlYWRMaW5lcyBjYXN0IHRvIExpc3Q8U3RyaW5nPgorICAgcHVibGljIHZvaWQgdGVzdExvZ2dlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sxID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICBQR0VUYXNrSW5zdGFuY2UgcGdlVGFzazIgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKworICAgICAgcGdlVGFzazEubG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAicGdlMSBtZXNzYWdlMSIpOworICAgICAgcGdlVGFzazEubG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAicGdlMSBtZXNzYWdlMiIpOworICAgICAgcGdlVGFzazIubG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJwZ2UyIG1lc3NhZ2UxIik7CisgICAgICBwZ2VUYXNrMS5sb2dnZXIubG9nKExldmVsLklORk8sICJwZ2UxIG1lc3NhZ2UzIik7CisKKyAgICAgIGZvciAoSGFuZGxlciBoYW5kbGVyIDogcGdlVGFzazEubG9nZ2VyLmdldEhhbmRsZXJzKCkpIHsKKyAgICAgICAgIGhhbmRsZXIuZmx1c2goKTsKKyAgICAgIH0KKyAgICAgIGZvciAoSGFuZGxlciBoYW5kbGVyIDogcGdlVGFzazIubG9nZ2VyLmdldEhhbmRsZXJzKCkpIHsKKyAgICAgICAgIGhhbmRsZXIuZmx1c2goKTsKKyAgICAgIH0KKyAgICAgIEZpbGUgbG9nRGlyID0gbmV3IEZpbGUocGdlVGFzazEucGdlQ29uZmlnLmdldEV4ZURpcigpICsgIi9sb2dzIik7CisgICAgICBhc3NlcnRUcnVlKGxvZ0Rpci5leGlzdHMoKSk7CisgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZXMgPSBGaWxlVXRpbHMucmVhZExpbmVzKGxvZ0Rpci5saXN0RmlsZXMoCisgICAgICAgICBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5sb2ciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0pWzBdLCAiVVRGLTgiKTsKKyAgICAgIGFzc2VydEVxdWFscyhMZXZlbC5JTkZPLmdldExvY2FsaXplZE5hbWUoKSArICI6IHBnZTEgbWVzc2FnZTEiLCBtZXNzYWdlcy5nZXQoMSkpOworICAgICAgYXNzZXJ0RXF1YWxzKExldmVsLklORk8uZ2V0TG9jYWxpemVkTmFtZSgpICsgIjogcGdlMSBtZXNzYWdlMiIsIG1lc3NhZ2VzLmdldCgzKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTGV2ZWwuSU5GTy5nZXRMb2NhbGl6ZWROYW1lKCkgKyAiOiBwZ2UxIG1lc3NhZ2UzIiwgbWVzc2FnZXMuZ2V0KDUpKTsKKyAgICAgIGxvZ0RpciA9IG5ldyBGaWxlKHBnZVRhc2syLnBnZUNvbmZpZy5nZXRFeGVEaXIoKSArICIvbG9ncyIpOworICAgICAgYXNzZXJ0VHJ1ZShsb2dEaXIuZXhpc3RzKCkpOworICAgICAgbWVzc2FnZXMgPSBGaWxlVXRpbHMucmVhZExpbmVzKGxvZ0Rpci5saXN0RmlsZXMoCisgICAgICAgICBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5sb2ciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0pWzBdLCAiVVRGLTgiKTsKKyAgICAgIGFzc2VydEVxdWFscyhMZXZlbC5TRVZFUkUuZ2V0TG9jYWxpemVkTmFtZSgpICsgIjogcGdlMiBtZXNzYWdlMSIsIG1lc3NhZ2VzLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIHBnZVRhc2sud20gPSBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KG51bGwpIHsKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyhTdHJpbmcgaW5zdGFuY2VJZCwKKyAgICAgICAgICAgICAgIFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgICAgIGFyZ3MucHV0KCJJbnN0YW5jZUlkIiwgaW5zdGFuY2VJZCk7CisgICAgICAgICAgICBhcmdzLnB1dCgiU3RhdHVzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgfQorICAgICAgfTsKKyAgICAgIFN0cmluZyBpbnN0YW5jZUlkID0gIlRlc3QgSUQiOworICAgICAgU3RyaW5nIHN0YXR1cyA9IFBnZVRhc2tTdGF0dXMuQ1JBV0xJTkcuZ2V0V29ya2Zsb3dTdGF0dXNOYW1lKCk7CisgICAgICBwZ2VUYXNrLndvcmtmbG93SW5zdElkID0gaW5zdGFuY2VJZDsKKyAgICAgIHBnZVRhc2sudXBkYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgICBhc3NlcnRFcXVhbHMoaW5zdGFuY2VJZCwgYXJncy5nZXQoIkluc3RhbmNlSWQiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLCBhcmdzLmdldCgiU3RhdHVzIikpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUGdlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBTdHJpbmcgS0VZID0gIlRlc3RLZXkiOworICAgICAgZmluYWwgU3RyaW5nIFZBTFVFID0gIlRlc3RWYWx1ZSI7CisgICAgICBGaWxlIHBnZUNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShjcmVhdGVUbXBEaXIoKSwgInBnZUNvbmZpZy54bWwiKTsKKyAgICAgIEZpbGVVdGlscy53cml0ZUxpbmVzKHBnZUNvbmZpZ0ZpbGUsICJVVEYtOCIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiwKKyAgICAgICAgICAgICAgICI8cGdlQ29uZmlnPiIsCisgICAgICAgICAgICAgICAiICAgPGN1c3RvbU1ldGFkYXRhPiIsCisgICAgICAgICAgICAgICAiICAgICAgPG1ldGFkYXRhIGtleT1cIiIgKyBLRVkgKyAiXCIgdmFsPVwiIiArIFZBTFVFCisgICAgICAgICAgICAgICAJCSsgIlwiLz4iLAorICAgICAgICAgICAgICAgIiAgIDwvY3VzdG9tTWV0YWRhdGE+IiwKKyAgICAgICAgICAgICAgICI8L3BnZUNvbmZpZz4iKSk7CisgICAgICBQR0VUYXNrSW5zdGFuY2UgcGdlVGFzayA9IGNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoQ09ORklHX0ZJTEVfUEFUSCwKKyAgICAgICAgICAgIHBnZUNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgUGdlQ29uZmlnIHBnZUNvbmZpZyA9IHBnZVRhc2suY3JlYXRlUGdlQ29uZmlnKCk7CisgICAgICBhc3NlcnROb3ROdWxsKHBnZUNvbmZpZyk7CisgICAgICBhc3NlcnRFcXVhbHMoVkFMVUUsIHBnZVRhc2sucGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoS0VZKSk7CisKKyAgICAgIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKFBHRV9DT05GSUdfQlVJTERFUiwKKyAgICAgICAgICAgIE1vY2tQZ2VDb25maWdCdWlsZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICBwZ2VDb25maWcgPSBwZ2VUYXNrLmNyZWF0ZVBnZUNvbmZpZygpOworICAgICAgYXNzZXJ0RXF1YWxzKE1vY2tQZ2VDb25maWdCdWlsZGVyLk1PQ0tfRVhFX0RJUiwgcGdlQ29uZmlnLmdldEV4ZURpcigpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdvcmtmbG93TWFuYWdlckNsaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKFdPUktGTE9XX01BTkFHRVJfVVJMLAorICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODg4OCIpOworICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IHdtQ2xpZW50ID0KKyAgICAgICAgIHBnZVRhc2suY3JlYXRlV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KCk7CisgICAgICBhc3NlcnROb3ROdWxsKHdtQ2xpZW50KTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtmbG93SW5zdGFuY2VJZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgU3RyaW5nIHdvcmtmbG93SW5zdElkID0gIjEyMzQ1IjsKKyAgICAgIFBHRVRhc2tJbnN0YW5jZSBwZ2VUYXNrID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShDb3JlTWV0S2V5cy5XT1JLRkxPV19JTlNUX0lELAorICAgICAgICAgICAgd29ya2Zsb3dJbnN0SWQpOworICAgICAgYXNzZXJ0RXF1YWxzKHdvcmtmbG93SW5zdElkLCBwZ2VUYXNrLmdldFdvcmtmbG93SW5zdGFuY2VJZCgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUV4ZURpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIEZpbGUgZXhlRGlyID0gbmV3IEZpbGUocGdlVGFzay5wZ2VDb25maWcuZ2V0RXhlRGlyKCkpOworICAgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShleGVEaXIpOworICAgICAgYXNzZXJ0RmFsc2UoZXhlRGlyLmV4aXN0cygpKTsKKyAgICAgIHBnZVRhc2suY3JlYXRlRXhlRGlyKCk7CisgICAgICBhc3NlcnRUcnVlKGV4ZURpci5leGlzdHMoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPdXB1dERpcnNJZlJlcXVlc3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIEZpbGUgb3V0cHV0RGlyMSA9IGNyZWF0ZVRtcERpcigpOworICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKG91dHB1dERpcjEpOworICAgICAgRmlsZSBvdXRwdXREaXIyID0gY3JlYXRlVG1wRGlyKCk7CisgICAgICBGaWxlVXRpbHMuZm9yY2VEZWxldGUob3V0cHV0RGlyMik7CisgICAgICBGaWxlIG91dHB1dERpcjMgPSBuZXcgRmlsZSgiL3NvbWUvZmlsZS9wYXRoIik7CisgICAgICBhc3NlcnRGYWxzZShvdXRwdXREaXIxLmV4aXN0cygpKTsKKyAgICAgIGFzc2VydEZhbHNlKG91dHB1dERpcjIuZXhpc3RzKCkpOworICAgICAgYXNzZXJ0RmFsc2Uob3V0cHV0RGlyMy5leGlzdHMoKSk7CisgICAgICBwZ2VUYXNrLnBnZUNvbmZpZy5hZGRPdXB1dERpckFuZEV4cHJlc3Npb25zKG5ldyBPdXRwdXREaXIob3V0cHV0RGlyMQorICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSk7CisgICAgICBwZ2VUYXNrLnBnZUNvbmZpZy5hZGRPdXB1dERpckFuZEV4cHJlc3Npb25zKG5ldyBPdXRwdXREaXIob3V0cHV0RGlyMgorICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSk7CisgICAgICBwZ2VUYXNrLnBnZUNvbmZpZy5hZGRPdXB1dERpckFuZEV4cHJlc3Npb25zKG5ldyBPdXRwdXREaXIob3V0cHV0RGlyMworICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpLCBmYWxzZSkpOworICAgICAgcGdlVGFzay5jcmVhdGVPdXB1dERpcnNJZlJlcXVlc3RlZCgpOworICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXREaXIxLmV4aXN0cygpKTsKKyAgICAgIGFzc2VydFRydWUob3V0cHV0RGlyMi5leGlzdHMoKSk7CisgICAgICBhc3NlcnRGYWxzZShvdXRwdXREaXIzLmV4aXN0cygpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUR5bmFtaWNDb25maWdGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBGaWxlIHRtcERpciA9IGNyZWF0ZVRtcERpcigpOworICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRtcERpcik7CisgICAgICBhc3NlcnRGYWxzZSh0bXBEaXIuZXhpc3RzKCkpOworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIEZpbGUgZHluYW1pY0NvbmZpZ0ZpbGUgPSBuZXcgRmlsZSh0bXBEaXIsICJEeW5hbWljQ29uZmlnLnhtbCIpOworICAgICAgYXNzZXJ0RmFsc2UoZHluYW1pY0NvbmZpZ0ZpbGUuZXhpc3RzKCkpOworICAgICAgcGdlVGFzay5jcmVhdGVEeW5hbWljQ29uZmlnRmlsZShuZXcgRHluYW1pY0NvbmZpZ0ZpbGUoZHluYW1pY0NvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICBNb2NrRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9KSk7CisgICAgICBhc3NlcnRUcnVlKGR5bmFtaWNDb25maWdGaWxlLmV4aXN0cygpKTsKKyAgIH0KKworICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYbWxGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgRG9jdW1lbnQgZG9tID0gbnVsbDsKKyAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgIGRvbSA9IGRiLnBhcnNlKGZpbGUpOworICAgICAgcmV0dXJuIGRvbTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhtbFN0cmluZyhTdHJpbmcgeG1sKSB0aHJvd3MgRXhjZXB0aW9uICB7CisJIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCSBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHhtbCkpOworCSByZXR1cm4gYnVpbGRlci5wYXJzZShpcyk7CisgICAgfQorICAgIAorICAgcHVibGljIHZvaWQgdGVzdER1bXBNZXRhZGF0YUlmUmVxdWVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBQR0VUYXNrSW5zdGFuY2UgcGdlVGFzayA9IGNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgRmlsZSBkdW1wTWV0RmlsZSA9IG5ldyBGaWxlKHBnZVRhc2suZ2V0RHVtcE1ldGFkYXRhUGF0aCgpKTsKKyAgICAgIHBnZVRhc2suZHVtcE1ldGFkYXRhSWZSZXF1ZXN0ZWQoKTsKKyAgICAgIGFzc2VydEZhbHNlKGR1bXBNZXRGaWxlLmV4aXN0cygpKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKERVTVBfTUVUQURBVEEsICJ0cnVlIik7CisgICAgICBwZ2VUYXNrLmR1bXBNZXRhZGF0YUlmUmVxdWVzdGVkKCk7CisgICAgICBhc3NlcnRUcnVlKGR1bXBNZXRGaWxlLmV4aXN0cygpKTsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgU3RyaW5nIGV4cGVjdGVkTWV0U3RyaW5nID0gICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKKyAgICAJCSsgIjxjYXM6bWV0YWRhdGEgeG1sbnM6Y2FzPVwiaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXNcIj4iCisgICAgICAJCSsgIjxrZXl2YWwgdHlwZT1cInZlY3RvclwiPiIKKyAgICAJCSsgIjxrZXk+UEdFVGFzayUyRk5hbWU8L2tleT4iCisgICAgICAJCSsgIjx2YWw+IgorICAgIAkJKyBwZ2VUYXNrLnBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKE5BTUUpCisgICAgCQkrICI8L3ZhbD4iCisgICAgCQkrICI8L2tleXZhbD4iCisgICAgCQkrICI8a2V5dmFsIHR5cGU9XCJ2ZWN0b3JcIj4iCisgICAgCQkrICI8a2V5PlBHRVRhc2slMkZEdW1wTWV0YWRhdGE8L2tleT4iCisgICAgCQkrICI8dmFsPiIKKyAgICAJCSsgcGdlVGFzay5wZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShEVU1QX01FVEFEQVRBKQorICAgIAkJKyAiPC92YWw+IgorICAgIAkJKyAiPC9rZXl2YWw+IgorICAgIAkJKyAiPC9jYXM6bWV0YWRhdGE+IjsKKyAgICAgICAKKyAgICAgICBEb2N1bWVudCBkdW1wTWV0RG9jID0gcGFyc2VYbWxGaWxlKGR1bXBNZXRGaWxlKTsKKyAgICAgICBEb2N1bWVudCBleHBlY3RlZE1ldERvYyA9IHBhcnNlWG1sU3RyaW5nKGV4cGVjdGVkTWV0U3RyaW5nKTsKKyAgICAgICAKKyAgICAgICAKKyAgICAgICBFbGVtZW50IGR1bXBNZXRSb290LCBleHBlY3RlZE1ldFJvb3Q7CisgICAgICAgZHVtcE1ldFJvb3QgPSBkdW1wTWV0RG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgIGV4cGVjdGVkTWV0Um9vdCA9IGV4cGVjdGVkTWV0RG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgIAorICAgICAgIAorICAgICAgIE5vZGVMaXN0IGR1bXBLZXlMaXN0ID0gZHVtcE1ldFJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImtleSIpOworICAgICAgIE5vZGVMaXN0IGV4cGVjdGVkS2V5TGlzdCA9IGV4cGVjdGVkTWV0Um9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgia2V5Iik7CisgICAgICAgCisgICAgICAgTm9kZUxpc3QgZHVtcFZhbExpc3QgPSBkdW1wTWV0Um9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmFsIik7CisgICAgICAgTm9kZUxpc3QgZXhwZWN0ZWRWYWxMaXN0ID0gZXhwZWN0ZWRNZXRSb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2YWwiKTsKKyAgICAgICAKKyAgICAgICBhc3NlcnRFcXVhbHMoZHVtcEtleUxpc3QuZ2V0TGVuZ3RoKCksIGV4cGVjdGVkS2V5TGlzdC5nZXRMZW5ndGgoKSk7CisgICAgICAgYXNzZXJ0RXF1YWxzKGR1bXBWYWxMaXN0LmdldExlbmd0aCgpLCBleHBlY3RlZFZhbExpc3QuZ2V0TGVuZ3RoKCkpOworICAgICAgIAorICAgICAgIAorICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZHVtcEtleVZhbE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWRLZXlWYWxNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAKKyAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGR1bXBLZXlMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgCisgICAgICAgICAgIE5vZGUgazEgPSBkdW1wS2V5TGlzdC5pdGVtKGkpOworICAgICAgICAgICBOb2RlIGsyID0gZXhwZWN0ZWRLZXlMaXN0Lml0ZW0oaSk7CisgICAgICAgICAgIAorICAgICAgICAgICBOb2RlIHYxID0gZHVtcFZhbExpc3QuaXRlbShpKTsKKyAgICAgICAgICAgTm9kZSB2MiA9IGV4cGVjdGVkVmFsTGlzdC5pdGVtKGkpOworICAgICAgICAgICAKKyAgICAgICAgICAgZHVtcEtleVZhbE1hcC5wdXQoazEuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpLCB2MS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICBleHBlY3RlZEtleVZhbE1hcC5wdXQoazIuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpLCB2Mi5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICAKKyAgICAgICB9CisgICAgICAgCisgICAgICAgYXNzZXJ0VHJ1ZShkdW1wS2V5VmFsTWFwLmVxdWFscyhleHBlY3RlZEtleVZhbE1hcCkpOworICAgICAgIAorICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvZHVjdENyYXdsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFBHRVRhc2tJbnN0YW5jZSBwZ2VUYXNrID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShNSU1FX0VYVFJBQ1RPUl9SRVBPLAorICAgICAgICAgICAgInNyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DcmF3bGVyL21pbWUtZXh0cmFjdG9yLW1hcC54bWwiKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKAorICAgICAgICAgICAgSU5HRVNUX0NMSUVOVF9UUkFOU0ZFUl9TRVJWSUNFX0ZBQ1RPUlksCisgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKElOR0VTVF9GSUxFX01BTkFHRVJfVVJMLAorICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoQ1JBV0xFUl9DT05GSUdfRklMRSwKKyAgICAgICAgICAgICJzcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9jcmF3bGVyLWNvbmZpZy54bWwiKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKEFDVElPTl9JRFMsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoIkRlbGV0ZURhdGFGaWxlIiwgIk1vdmVNZXRhZGF0YUZpbGVUb0ZhaWx1cmVEaXIiKSk7CisgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShSRVFVSVJFRF9NRVRBREFUQSwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgiT3duZXJzIikpOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoQ1JBV0xFUl9DUkFXTF9GT1JfRElSUywKKyAgICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcoZmFsc2UpKTsKKyAgICAgIHBnZVRhc2sucGdlTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKENSQVdMRVJfUkVDVVIsCisgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKHRydWUpKTsKKworICAgICAgUHJvZHVjdENyYXdsZXIgcGMgPSBwZ2VUYXNrLmNyZWF0ZVByb2R1Y3RDcmF3bGVyKCk7CisgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiLAorICAgICAgICAgICAgcGMuZ2V0Q2xpZW50VHJhbnNmZXJlcigpKTsKKyAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiwgcGMuZ2V0RmlsZW1nclVybCgpKTsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFNldHMubmV3SGFzaFNldCgiRGVsZXRlRGF0YUZpbGUiLCAiTW92ZU1ldGFkYXRhRmlsZVRvRmFpbHVyZURpciIpLAorICAgICAgICAgICAgU2V0cy5uZXdIYXNoU2V0KHBjLmdldEFjdGlvbklkcygpKSk7CisgICAgICBDcmF3bGVyQWN0aW9uIGFjdGlvbiA9IChDcmF3bGVyQWN0aW9uKSBwYy5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRCZWFuKCJEZWxldGVEYXRhRmlsZSIpOworICAgICAgYXNzZXJ0Tm90TnVsbChhY3Rpb24pOworICAgICAgTW92ZUZpbGUgbW92ZUZpbGVBY3Rpb24gPSAoTW92ZUZpbGUpIHBjLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldEJlYW4oIk1vdmVNZXRhZGF0YUZpbGVUb0ZhaWx1cmVEaXIiKTsKKyAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICBwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSgKKyAgICAgICAgICAgICJzcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvQ3Jhd2xlci9hY3Rpb24tYmVhbnMucHJvcGVydGllcyIpKSk7CisgICAgICBhc3NlcnRFcXVhbHMocHJvcGVydGllcy5nZXQoImNyYXdsZXIuZmFpbHVyZS5kaXIiKSwKKyAgICAgICAgICAgIG1vdmVGaWxlQWN0aW9uLmdldFRvRGlyKCkpOworICAgICAgYXNzZXJ0VHJ1ZShwYy5nZXRSZXF1aXJlZE1ldGFkYXRhKCkuY29udGFpbnMoIk93bmVycyIpKTsKKyAgICAgIGFzc2VydEZhbHNlKHBjLmlzQ3Jhd2xGb3JEaXJzKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGMuaXNOb1JlY3VyKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0UnVuSW5nZXN0Q3Jhd2xlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgLy8gQ2FzZTogVXBkYXRlU3RhdHVzIFN1Y2Nlc3MsIFZlcmlmeUluZ2VzdCBTdWNjZXNzLAorICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgIHBnZVRhc2sucGdlQ29uZmlnLmFkZE91cHV0RGlyQW5kRXhwcmVzc2lvbnMobmV3IE91dHB1dERpcigiL3RtcC9kaXIxIiwgdHJ1ZSkpOworICAgICAgcGdlVGFzay5wZ2VDb25maWcuYWRkT3VwdXREaXJBbmRFeHByZXNzaW9ucyhuZXcgT3V0cHV0RGlyKCIvdG1wL2RpcjIiLCB0cnVlKSk7CisgICAgICBwZ2VUYXNrLnBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShBVFRFTVBUX0lOR0VTVF9BTEwsIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpOworICAgICAgcGdlVGFzay53b3JrZmxvd0luc3RJZCA9ICJXb3JrZmxvd0luc3RhbmNlSWQiOworCisgICAgICBwZ2VUYXNrLndtID0gY3JlYXRlTW9jayhYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuY2xhc3MpOworICAgICAgZXhwZWN0KHBnZVRhc2sud20udXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyhwZ2VUYXNrLndvcmtmbG93SW5zdElkLAorICAgICAgICAgICAgQ1JBV0xJTkcuZ2V0V29ya2Zsb3dTdGF0dXNOYW1lKCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICByZXBsYXkocGdlVGFzay53bSk7CisKKyAgICAgIEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlciBwYyA9IGNyZWF0ZU1vY2soQXV0b0RldGVjdFByb2R1Y3RDcmF3bGVyLmNsYXNzKTsKKyAgICAgIHBjLmNyYXdsKG5ldyBGaWxlKCIvdG1wL2RpcjEiKSk7CisgICAgICBwYy5jcmF3bChuZXcgRmlsZSgiL3RtcC9kaXIyIikpOworICAgICAgZXhwZWN0KHBjLmdldEluZ2VzdFN0YXR1cygpKS5hbmRSZXR1cm4oQ29sbGVjdGlvbnMuPEluZ2VzdFN0YXR1cz5lbXB0eUxpc3QoKSk7CisgICAgICByZXBsYXkocGMpOworCisgICAgICBwZ2VUYXNrLnJ1bkluZ2VzdENyYXdsZXIocGMpOworCisgICAgICB2ZXJpZnkocGdlVGFzay53bSk7CisgICAgICB2ZXJpZnkocGMpOworCisgICAgICAvLyBDYXNlOiBVcGRhdGVTdGF0dXMgRmFpbAorICAgICAgcGdlVGFzay53bSA9IGNyZWF0ZU1vY2soWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50LmNsYXNzKTsKKyAgICAgIGV4cGVjdChwZ2VUYXNrLndtLnVwZGF0ZVdvcmtmbG93SW5zdGFuY2VTdGF0dXMocGdlVGFzay53b3JrZmxvd0luc3RJZCwKKyAgICAgICAgICAgIENSQVdMSU5HLmdldFdvcmtmbG93U3RhdHVzTmFtZSgpKSkuYW5kUmV0dXJuKGZhbHNlKTsKKyAgICAgIHJlcGxheShwZ2VUYXNrLndtKTsKKworICAgICAgcGMgPSBjcmVhdGVNb2NrKEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5jbGFzcyk7CisgICAgICByZXBsYXkocGMpOworCisgICAgICB0cnkgeworICAgICAgICAgcGdlVGFzay5ydW5Jbmdlc3RDcmF3bGVyKHBjKTsKKyAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLyogZXhwZWN0IHRocm93ICovIH0KKworICAgICAgdmVyaWZ5KHBnZVRhc2sud20pOworICAgICAgdmVyaWZ5KHBjKTsKKworICAgICAgLy8gQ2FzZTogVXBkYXRlU3RhdHVzIFN1Y2Nlc3MsIFZlcmlmeUluZ2VzdCBGYWlsCisgICAgICBwZ2VUYXNrLndtID0gY3JlYXRlTW9jayhYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuY2xhc3MpOworICAgICAgZXhwZWN0KHBnZVRhc2sud20udXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyhwZ2VUYXNrLndvcmtmbG93SW5zdElkLAorICAgICAgICAgICAgQ1JBV0xJTkcuZ2V0V29ya2Zsb3dTdGF0dXNOYW1lKCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICByZXBsYXkocGdlVGFzay53bSk7CisKKyAgICAgIHBjID0gY3JlYXRlTW9jayhBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuY2xhc3MpOworICAgICAgcGMuY3Jhd2wobmV3IEZpbGUoIi90bXAvZGlyMSIpKTsKKyAgICAgIHBjLmNyYXdsKG5ldyBGaWxlKCIvdG1wL2RpcjIiKSk7CisgICAgICBJbmdlc3RTdGF0dXMgZmFpbGVkSW5nZXN0U3RhdHVzID0gbmV3IEluZ2VzdFN0YXR1cygpIHsKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbmdlc3QgRmFpbHVyZSI7CisgICAgICAgICB9CisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyBGaWxlIGdldFByb2R1Y3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoIi90bXAvZGlyMSIpOworICAgICAgICAgfQorICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgUmVzdWx0IGdldFJlc3VsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICAgIH07CisgICAgICBleHBlY3QocGMuZ2V0SW5nZXN0U3RhdHVzKCkpLmFuZFJldHVybigKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdChmYWlsZWRJbmdlc3RTdGF0dXMpKTsKKyAgICAgIHJlcGxheShwYyk7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBwZ2VUYXNrLnJ1bkluZ2VzdENyYXdsZXIocGMpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8gfQorCisgICAgICB2ZXJpZnkocGdlVGFzay53bSk7CisgICAgICB2ZXJpZnkocGMpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5SW5nZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgUEdFVGFza0luc3RhbmNlIHBnZVRhc2sgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTsKKworICAgICAgLy8gVGVzdCBjYXNlIGZhaWx1cmUuCisgICAgICBBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIgcGMgPSBjcmVhdGVNb2NrKEF1dG9EZXRlY3RQcm9kdWN0Q3Jhd2xlci5jbGFzcyk7CisgICAgICBJbmdlc3RTdGF0dXMgZmFpbGVkSW5nZXN0U3RhdHVzID0gbmV3IEluZ2VzdFN0YXR1cygpIHsKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbmdlc3QgRmFpbHVyZSI7CisgICAgICAgICB9CisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyBGaWxlIGdldFByb2R1Y3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoIi90bXAvZGlyMSIpOworICAgICAgICAgfQorICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgUmVzdWx0IGdldFJlc3VsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICAgIH07CisgICAgICBleHBlY3QocGMuZ2V0SW5nZXN0U3RhdHVzKCkpLmFuZFJldHVybigKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdChmYWlsZWRJbmdlc3RTdGF0dXMpKTsKKyAgICAgIHJlcGxheShwYyk7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBwZ2VUYXNrLnZlcmlmeUluZ2VzdHMocGMpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvKiBleHBlY3QgdGhyb3cgKi8gfQorCisgICAgICB2ZXJpZnkocGMpOworCisgICAgICAvLyBUZXN0IGNhc2Ugd2FybiBmYWlsdXJlIG9mIHByZWNvbmRpdGlvbiwgYnV0IHN1Y2Nlc3Mgb3ZlcmFsbC4KKyAgICAgIHBjID0gY3JlYXRlTW9jayhBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuY2xhc3MpOworICAgICAgSW5nZXN0U3RhdHVzIHByZWNvbmRzRmFpbEluZ2VzdFN0YXR1cyA9IG5ldyBJbmdlc3RTdGF0dXMoKSB7CisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiUHJlY29uZGl0aW9ucyBmYWlsZWQiOworICAgICAgICAgfQorICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgRmlsZSBnZXRQcm9kdWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCIvdG1wL2RpcjEiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIFJlc3VsdCBnZXRSZXN1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LlBSRUNPTkRTX0ZBSUxFRDsKKyAgICAgICAgIH0KKyAgICAgIH07CisgICAgICBleHBlY3QocGMuZ2V0SW5nZXN0U3RhdHVzKCkpLmFuZFJldHVybigKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdChwcmVjb25kc0ZhaWxJbmdlc3RTdGF0dXMpKTsKKyAgICAgIHJlcGxheShwYyk7CisKKyAgICAgIHBnZVRhc2subG9nZ2VyID0gY3JlYXRlTW9jayhMb2dnZXIuY2xhc3MpOworICAgICAgcGdlVGFzay5sb2dnZXIuaW5mbygiVmVyaWZ5aW5nIGluZ2VzdHMgc3VjY2Vzc2Z1bC4uLiIpOworICAgICAgcGdlVGFzay5sb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICJQcm9kdWN0IHdhcyBub3QgaW5nZXN0ZWQgW2ZpbGU9Jy90bXAvZGlyMScscmVzdWx0PSdQUkVDT05EU19GQUlMRUQnLG1zZz0nUHJlY29uZGl0aW9ucyBmYWlsZWQnXSIpOworICAgICAgcGdlVGFzay5sb2dnZXIuaW5mbygiSW5nZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwiKTsKKyAgICAgIHJlcGxheShwZ2VUYXNrLmxvZ2dlcik7CisKKyAgICAgIHBnZVRhc2sudmVyaWZ5SW5nZXN0cyhwYyk7CisKKyAgICAgIHZlcmlmeShwYyk7CisgICAgICB2ZXJpZnkocGdlVGFzay5sb2dnZXIpOworCisgICAgICAvLyBUZXN0IGNhc2Ugc3VjY2Vzcy4KKyAgICAgIHBjID0gY3JlYXRlTW9jayhBdXRvRGV0ZWN0UHJvZHVjdENyYXdsZXIuY2xhc3MpOworICAgICAgSW5nZXN0U3RhdHVzIHN1Y2Nlc3NJbmdlc3RTdGF0dXMgPSBuZXcgSW5nZXN0U3RhdHVzKCkgeworICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gIkluZ2VzdCBTdWNjZXNzIjsKKyAgICAgICAgIH0KKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIEZpbGUgZ2V0UHJvZHVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSgiL3RtcC9kaXIxIik7CisgICAgICAgICB9CisgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgIHB1YmxpYyBSZXN1bHQgZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5TVUNDRVNTOworICAgICAgICAgfQorICAgICAgfTsKKyAgICAgIGV4cGVjdChwYy5nZXRJbmdlc3RTdGF0dXMoKSkuYW5kUmV0dXJuKAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KHN1Y2Nlc3NJbmdlc3RTdGF0dXMpKTsKKyAgICAgIHJlcGxheShwYyk7CisKKyAgICAgIHBnZVRhc2subG9nZ2VyID0gY3JlYXRlTW9jayhMb2dnZXIuY2xhc3MpOworICAgICAgcGdlVGFzay5sb2dnZXIuaW5mbygiVmVyaWZ5aW5nIGluZ2VzdHMgc3VjY2Vzc2Z1bC4uLiIpOworICAgICAgcGdlVGFzay5sb2dnZXIuaW5mbygiSW5nZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwiKTsKKyAgICAgIHJlcGxheShwZ2VUYXNrLmxvZ2dlcik7CisKKyAgICAgIHBnZVRhc2sudmVyaWZ5SW5nZXN0cyhwYyk7CisKKyAgICAgIHZlcmlmeShwYyk7CisgICAgICB2ZXJpZnkocGdlVGFzay5sb2dnZXIpOworICAgfQorCisgICBwcml2YXRlIFBHRVRhc2tJbnN0YW5jZSBjcmVhdGVUZXN0SW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBjcmVhdGVUZXN0SW5zdGFuY2UoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisgICB9CisKKyAgIHByaXZhdGUgUEdFVGFza0luc3RhbmNlIGNyZWF0ZVRlc3RJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFBHRVRhc2tJbnN0YW5jZSBwZ2VUYXNrID0gbmV3IFBHRVRhc2tJbnN0YW5jZSgpOworICAgICAgcGdlVGFzay53b3JrZmxvd0luc3RJZCA9IHdvcmtmbG93SW5zdElkOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YSA9IG5ldyBQZ2VNZXRhZGF0YSgpOworICAgICAgcGdlVGFzay5wZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoTkFNRSwgIlRlc3RQR0UiKTsKKyAgICAgIHBnZVRhc2sucGdlQ29uZmlnID0gbmV3IFBnZUNvbmZpZygpOworICAgICAgRmlsZSBleGVEaXIgPSBuZXcgRmlsZShjcmVhdGVUbXBEaXIoKSwgd29ya2Zsb3dJbnN0SWQpOworICAgICAgcGdlVGFzay5wZ2VDb25maWcuc2V0RXhlRGlyKGV4ZURpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICBwZ2VUYXNrLmxvZ2dlciA9IHBnZVRhc2suY3JlYXRlTG9nZ2VyKCk7CisgICAgICByZXR1cm4gcGdlVGFzazsKKyAgIH0KKworICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRtcERpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYm9ndXMiLCAiYm9ndXMiKTsKKyAgICAgIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUodG1wRmlsZS5nZXRQYXJlbnRGaWxlKCksIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworICAgICAgdG1wRmlsZS5kZWxldGUoKTsKKyAgICAgIHRtcERpci5ta2RpcnMoKTsKKyAgICAgIHRtcERpcnMuYWRkKHRtcERpcik7CisgICAgICByZXR1cm4gdG1wRGlyOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvTW9ja1BnZUNvbmZpZ0J1aWxkZXIuamF2YSBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL01vY2tQZ2VDb25maWdCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2NmRiMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL01vY2tQZ2VDb25maWdCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VNZXRhZGF0YTsKKworLyoqCisgKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZ2VDb25maWdCdWlsZGVyfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIE1vY2tQZ2VDb25maWdCdWlsZGVyIGltcGxlbWVudHMgUGdlQ29uZmlnQnVpbGRlciB7CisKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PQ0tfRVhFX0RJUiA9ICIvbW9jay9leGUvZGlyIjsKKworICAgcHVibGljIFBnZUNvbmZpZyBidWlsZChQZ2VNZXRhZGF0YSBwZ2VNZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBQZ2VDb25maWcgcGdlQ29uZmlnID0gbmV3IFBnZUNvbmZpZygpOworICAgICAgcGdlQ29uZmlnLnNldEV4ZURpcihNT0NLX0VYRV9ESVIpOworICAgICAgcmV0dXJuIHBnZUNvbmZpZzsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1Rlc3RYbWxGaWxlUGdlQ29uZmlnQnVpbGRlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9jb25maWcvVGVzdFhtbEZpbGVQZ2VDb25maWdCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZDFmOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvY29uZmlnL1Rlc3RYbWxGaWxlUGdlQ29uZmlnQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZmlnOworCisvL09PRFQgc3RhdGljIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlVGFza01ldEtleXMuQ09ORklHX0ZJTEVfUEFUSDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGEuUGdlTWV0YWRhdGE7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgWG1sRmlsZVBnZUNvbmZpZ0J1aWxkZXJ9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFhtbEZpbGVQZ2VDb25maWdCdWlsZGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRSA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvcGdlLWNvbmZpZy54bWwiOworCisgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgWG1sRmlsZVBnZUNvbmZpZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBYbWxGaWxlUGdlQ29uZmlnQnVpbGRlcigpOworICAgICAgUGdlTWV0YWRhdGEgcGdlTWV0YWRhdGEgPSBuZXcgUGdlTWV0YWRhdGEoKTsKKyAgICAgIHBnZU1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShDT05GSUdfRklMRV9QQVRILCBDT05GSUdfRklMRSk7CisgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoIklOUFVUX0ZJTEVfMSIsICJzcmMvdGVzdC9yZXNvdXJjZXMvZGF0YS1maWxlLTEudHh0Iik7CisgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoIklOUFVUX0ZJTEVfMiIsICJzcmMvdGVzdC9yZXNvdXJjZXMvZGF0YS1maWxlLTIudHh0Iik7CisgICAgICBwZ2VNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoIldPUktJTkdfRElSIiwgIi90bXAiKTsKKyAgICAgIHBnZU1ldGFkYXRhLm1hcmtBc0R5bmFtaWNNZXRhZGF0YUtleSgpOworICAgICAgcGdlTWV0YWRhdGEuY29tbWl0TWFya2VkRHluYW1pY01ldGFkYXRhS2V5cygpOworICAgICAgUGdlQ29uZmlnIHBnZUNvbmZpZyA9IGJ1aWxkZXIuYnVpbGQocGdlTWV0YWRhdGEpOworCisgICAgICAvLyBWZXJpZnkgbWV0YWRhdGEgY2hlY2tzIG91dC4KKyAgICAgIGFzc2VydEVxdWFscyg0MCwgcGdlTWV0YWRhdGEuYXNNZXRhZGF0YSgpLmdldEFsbEtleXMoKS5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKENPTkZJR19GSUxFLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YShDT05GSUdfRklMRV9QQVRIKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInNyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMS50eHQiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiSU5QVVRfRklMRV8xIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzcmMvdGVzdC9yZXNvdXJjZXMvZGF0YS1maWxlLTIudHh0IiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIklOUFVUX0ZJTEVfMiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3RtcCIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJXT1JLSU5HX0RJUiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiPiIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJjb21tb25zL0dyZWF0ZXJUaGFuIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCI8IiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoImNvbW1vbnMvTGVzc1RoYW4iKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiYiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiY29tbW9ucy9BbXBlcnNhbmQiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiciLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiY29tbW9ucy9BcG9zdHJvcGhlIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJcIiIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJjb21tb25zL1F1b3RhdGlvbk1hcmsiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuVGV4dENvbmZpZ0ZpbGVXcml0ZXIiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgid3JpdGVycy9UZXh0V3JpdGVyIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLkNzdkNvbmZpZ0ZpbGVXcml0ZXIiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgid3JpdGVycy9Dc3ZXcml0ZXIiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlNpbXBsZSIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJHUkVFVElOR19FTlVNIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIkZPUkNFX1NUQUdJTkciKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkN1c3RvbSIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJDVVNUT01fR1JFRVRJTkdfRU5VTSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiPEN1c3RvbSBHcmVldGluZyBIZXJlPiIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJDVVNUT01fR1JFRVRJTkdfRU5VTV9WQUxVRSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3RtcCIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJXb3JraW5nRGlyIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJTaW1wbGUiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiR3JlZXRpbmdFbnVtIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJDdXN0b20iLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiQ3VzdG9tR3JlZXRpbmdFbnVtIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCI8Q3VzdG9tIEdyZWV0aW5nIEhlcmU+IiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIkN1c3RvbUdyZWV0aW5nRW51bVZhbHVlIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzcmMvdGVzdC9yZXNvdXJjZXMvZGF0YS1maWxlLTEudHh0IiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIklucHV0RmlsZTEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInNyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMi50eHQiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiSW5wdXRGaWxlMiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJGb3JjZVN0YWdpbmciKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KCIvdG1wL3N0YWdpbmcvZGF0YS1maWxlLTEudHh0IiwgIi90bXAvc3RhZ2luZy9kYXRhLWZpbGUtMi50eHQiKSwgcGdlTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoIklucHV0RmlsZXMiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIi90bXAvY29uZmlnIiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIkNvbmZpZ0RpciIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3RtcC9vdXRwdXQiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiT3V0cHV0RGlyIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCIvdG1wL3N0YWdpbmciLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiU3RhZ2luZ0RpciIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZHluLWlucHV0LnR4dCIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJEeW5JbnB1dC9UZXh0L05hbWUiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImR5bi1pbnB1dC5jc3YiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiRHluSW5wdXQvQ1NWL05hbWUiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIi90bXAvY29uZmlnL2R5bi1pbnB1dC50eHQiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiVGV4dElucHV0RmlsZSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3RtcC9jb25maWcvZHluLWlucHV0LmNzdiIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJDc3ZJbnB1dEZpbGUiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlBnZU91dHB1dC50eHQiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiT3V0cHV0RmlsZU5hbWUiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIlxuICAgICAgW0dyZWV0aW5nXSxcbiAgICAgIFRoaXMgaXMgYSB0ZW1wbGF0ZSBmb3IgdGV4dCBmaWxlIFtUZXh0SW5wdXRGaWxlXS5cbiAgICAgIFRoaXMgdGVtcGxhdGUgd2FzIHdyaXR0ZW4gYXQ6IFtEQVRFLlVUQ10uXG4gICAgICBbU2lnbmF0dXJlXVxuICAgICIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJUZXh0RmlsZVRlbXBsYXRlIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyIsIHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKCJTaW1wbGVHcmVldGluZyIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiSGkiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiQ2FzdWFsR3JlZXRpbmciKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIjxDdXN0b20gR3JlZXRpbmcgSGVyZT4iLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiQ3VzdG9tR3JlZXRpbmciKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIiwgcGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoIkdyZWF0aW5nIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCItYmZvc3QiLCBwZ2VNZXRhZGF0YS5nZXRNZXRhZGF0YSgiU2lnbmF0dXJlIikpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCgiRmlsZTEudHh0IiwiRmlsZTIuZGF0IiwiRmlsZTMueG1sIiksIHBnZU1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKCJBdXhJbnB1dEZpbGVzIikpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCgidHJ1ZSIsImZhbHNlIiwidHJ1ZSIpLCBwZ2VNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgiSXNUZXh0IikpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCgiQXV4SW5wdXRGaWxlcyIsIklzVGV4dCIpLCBwZ2VNZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgiQ3N2SGVhZGVyIikpOworCisgICAgICAvLyBWZXJpZnkgcGdlY29uZmlnIGNoZWNrcyBvdXQuCisgICAgICBMaXN0PER5bmFtaWNDb25maWdGaWxlPiBkeW5Db25maWdGaWxlcyA9IHBnZUNvbmZpZy5nZXREeW5hbWljQ29uZmlnRmlsZXMoKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBkeW5Db25maWdGaWxlcy5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlRleHRDb25maWdGaWxlV3JpdGVyIiwgZHluQ29uZmlnRmlsZXMuZ2V0KDApLmdldFdyaXRlckNsYXNzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCIvdG1wL2NvbmZpZy9keW4taW5wdXQudHh0IiwgZHluQ29uZmlnRmlsZXMuZ2V0KDApLmdldEZpbGVQYXRoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCgiXG4gICAgICBbR3JlZXRpbmddLFxuICAgICAgVGhpcyBpcyBhIHRlbXBsYXRlIGZvciB0ZXh0IGZpbGUgW1RleHRJbnB1dEZpbGVdLlxuICAgICAgVGhpcyB0ZW1wbGF0ZSB3YXMgd3JpdHRlbiBhdDogW0RBVEUuVVRDXS5cbiAgICAgIFtTaWduYXR1cmVdXG4gICAgIiksIEFycmF5cy5hc0xpc3QoZHluQ29uZmlnRmlsZXMuZ2V0KDApLmdldEFyZ3MoKSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLkNzdkNvbmZpZ0ZpbGVXcml0ZXIiLCBkeW5Db25maWdGaWxlcy5nZXQoMSkuZ2V0V3JpdGVyQ2xhc3MoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIi90bXAvY29uZmlnL2R5bi1pbnB1dC5jc3YiLCBkeW5Db25maWdGaWxlcy5nZXQoMSkuZ2V0RmlsZVBhdGgoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KCJBdXhJbnB1dEZpbGVzLElzVGV4dCIpLCBBcnJheXMuYXNMaXN0KGR5bkNvbmZpZ0ZpbGVzLmdldCgxKS5nZXRBcmdzKCkpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKDUsIHBnZUNvbmZpZy5nZXRFeGVDbWRzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZWNobyAvdG1wL2NvbmZpZy9keW4taW5wdXQudHh0ID4gUGdlT3V0cHV0LnR4dCIsIHBnZUNvbmZpZy5nZXRFeGVDbWRzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscygiZWNobyAvdG1wL2NvbmZpZy9keW4taW5wdXQuY3N2ID4+IFBnZU91dHB1dC50eHQiLCBwZ2VDb25maWcuZ2V0RXhlQ21kcygpLmdldCgxKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImlmICggISAtZSBzcmMvdGVzdC9yZXNvdXJjZXMvZGF0YS1maWxlLTEudHh0IHx8ICEgLWUgc3JjL3Rlc3QvcmVzb3VyY2VzL2RhdGEtZmlsZS0yLnR4dCApIHRoZW4iLCBwZ2VDb25maWcuZ2V0RXhlQ21kcygpLmdldCgyKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiAgZXhpdCAxIiwgcGdlQ29uZmlnLmdldEV4ZUNtZHMoKS5nZXQoMykpOworICAgICAgYXNzZXJ0RXF1YWxzKCJlbmRpZiIsIHBnZUNvbmZpZy5nZXRFeGVDbWRzKCkuZ2V0KDQpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3RtcCIsIHBnZUNvbmZpZy5nZXRFeGVEaXIoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImNzaCIsIHBnZUNvbmZpZy5nZXRTaGVsbFR5cGUoKSk7CisKKyAgICAgIEZpbGVTdGFnaW5nSW5mbyBmaWxlU3RhZ2luZ0luZm8gPSBwZ2VDb25maWcuZ2V0RmlsZVN0YWdpbmdJbmZvKCk7CisgICAgICBhc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KCJzcmMvdGVzdC9yZXNvdXJjZXMvZGF0YS1maWxlLTIudHh0IiwgInNyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMS50eHQiKSwgZmlsZVN0YWdpbmdJbmZvLmdldEZpbGVQYXRocygpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3RtcC9zdGFnaW5nIiwgZmlsZVN0YWdpbmdJbmZvLmdldFN0YWdpbmdEaXIoKSk7CisgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZmlsZVN0YWdpbmdJbmZvLmlzRm9yY2VTdGFnaW5nKCkpOworCisgICAgICBMaXN0PE91dHB1dERpcj4gb3V0cHV0RGlycyA9IHBnZUNvbmZpZy5nZXRPdXB1dERpcnMoKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBvdXRwdXREaXJzLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgb3V0cHV0RGlycy5nZXQoMCkuaXNDcmVhdGVCZWZvcmVFeGUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIi90bXAvb3V0cHV0Iiwgb3V0cHV0RGlycy5nZXQoMCkuZ2V0UGF0aCgpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvbWV0YWRhdGEvVGVzdFBnZU1ldGFkYXRhLmphdmEgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL21ldGFkYXRhL1Rlc3RQZ2VNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjJhNTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL21ldGFkYXRhL1Rlc3RQZ2VNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UubWV0YWRhdGE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5tZXRhZGF0YS5QZ2VNZXRhZGF0YS5UeXBlOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBQZ2VNZXRhZGF0YX0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFBnZU1ldGFkYXRhIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVBnZU1ldGFkYXRhKCkgeworICAgICAgTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgIHN0YXRpY01ldGFkYXRhLmFkZE1ldGFkYXRhKCJrZXkxIiwgInN0YXRpY1ZhbHVlMSIpOworICAgICAgc3RhdGljTWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTIiLCAic3RhdGljVmFsdWUyIik7CisgICAgICBzdGF0aWNNZXRhZGF0YS5hZGRNZXRhZGF0YSgia2V5MyIsICJzdGF0aWNWYWx1ZTMiKTsKKworICAgICAgTWV0YWRhdGEgZHluYW1pY01ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBkeW5hbWljTWV0YWRhdGEuYWRkTWV0YWRhdGEoImtleTIiLCAiZHluVmFsdWUyIik7CisKKyAgICAgIFBnZU1ldGFkYXRhIHBnZU1ldCA9IG5ldyBQZ2VNZXRhZGF0YShzdGF0aWNNZXRhZGF0YSwgZHluYW1pY01ldGFkYXRhKTsKKyAgICAgIFBnZU1ldGFkYXRhIHBnZU1ldDIgPSBuZXcgUGdlTWV0YWRhdGEoc3RhdGljTWV0YWRhdGEsIGR5bmFtaWNNZXRhZGF0YSk7CisgICAgICBwZ2VNZXQyLnJlcGxhY2VNZXRhZGF0YSgia2V5NCIsICJsb2NhbFZhbHVlNCIpOworICAgICAgcGdlTWV0Mi5saW5rS2V5KCJrZXlMaW5rMSIsICJrZXkxIik7CisgICAgICBwZ2VNZXQyLm1hcmtBc0R5bmFtaWNNZXRhZGF0YUtleSgia2V5NCIpOworICAgICAgcGdlTWV0LnJlcGxhY2VNZXRhZGF0YShwZ2VNZXQyLCAidGVzdCIpOworCisgICAgICBhc3NlcnRFcXVhbHMoInN0YXRpY1ZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5MSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygic3RhdGljVmFsdWUyIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXkyIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzdGF0aWNWYWx1ZTIiLAorICAgICAgICAgICAgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXkyIiwgUGdlTWV0YWRhdGEuVHlwZS5TVEFUSUMpKTsKKyAgICAgIGFzc2VydEVxdWFscygic3RhdGljVmFsdWUzIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXkzIikpOworICAgICAgYXNzZXJ0TnVsbChwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleTQiKSk7CisKKyAgICAgIGFzc2VydE51bGwocGdlTWV0LmdldE1ldGFkYXRhKCJ0ZXN0L2tleTEiKSk7CisgICAgICBhc3NlcnROdWxsKHBnZU1ldC5nZXRNZXRhZGF0YSgidGVzdC9rZXkyIikpOworICAgICAgYXNzZXJ0TnVsbChwZ2VNZXQuZ2V0TWV0YWRhdGEoInRlc3Qva2V5MiIsIFBnZU1ldGFkYXRhLlR5cGUuU1RBVElDKSk7CisgICAgICBhc3NlcnROdWxsKHBnZU1ldC5nZXRNZXRhZGF0YSgidGVzdC9rZXkzIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJsb2NhbFZhbHVlNCIsIHBnZU1ldC5nZXRNZXRhZGF0YSgidGVzdC9rZXk0IikpOworCisgICAgICBhc3NlcnROdWxsKHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMocGdlTWV0LmdldE1ldGFkYXRhKCJrZXkxIiksCisgICAgICAgICAgICBwZ2VNZXQuZ2V0TWV0YWRhdGEoInRlc3Qva2V5TGluazEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgcGdlTWV0LmdldE1hcmtlZEFzRHluYW1pY01ldGFkYXRhS2V5cygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qva2V5NCIsIHBnZU1ldC5nZXRNYXJrZWRBc0R5bmFtaWNNZXRhZGF0YUtleXMoKQorICAgICAgICAgICAgLml0ZXJhdG9yKCkubmV4dCgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdENoYW5naW5nRHluYW1pY01ldGFkYXRhKCkgeworICAgICAgUGdlTWV0YWRhdGEgcGdlTWV0ID0gbmV3IFBnZU1ldGFkYXRhKCk7CisKKyAgICAgIGFzc2VydFRydWUocGdlTWV0LmFzTWV0YWRhdGEoVHlwZS5EWU5BTUlDKS5nZXRBbGxLZXlzKCkuaXNFbXB0eSgpKTsKKyAgICAgIHBnZU1ldC5yZXBsYWNlTWV0YWRhdGEoImtleTEiLCAidmFsdWUxIik7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0QWxsS2V5cygpLmlzRW1wdHkoKSk7CisgICAgICBwZ2VNZXQubWFya0FzRHluYW1pY01ldGFkYXRhS2V5KCk7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0QWxsS2V5cygpLmlzRW1wdHkoKSk7CisgICAgICBwZ2VNZXQuY29tbWl0TWFya2VkRHluYW1pY01ldGFkYXRhS2V5cygpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0QWxsS2V5cygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YSgia2V5MSIpKTsKKworICAgICAgcGdlTWV0ID0gbmV3IFBnZU1ldGFkYXRhKCk7CisKKyAgICAgIGFzc2VydFRydWUocGdlTWV0LmFzTWV0YWRhdGEoVHlwZS5EWU5BTUlDKS5nZXRBbGxLZXlzKCkuaXNFbXB0eSgpKTsKKyAgICAgIHBnZU1ldC5yZXBsYWNlTWV0YWRhdGEoImtleTEiLCAidmFsdWUxIik7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0QWxsS2V5cygpLmlzRW1wdHkoKSk7CisgICAgICBwZ2VNZXQubWFya0FzRHluYW1pY01ldGFkYXRhS2V5KCJrZXkxIik7CisgICAgICBhc3NlcnRUcnVlKHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0QWxsS2V5cygpLmlzRW1wdHkoKSk7CisgICAgICBwZ2VNZXQuY29tbWl0TWFya2VkRHluYW1pY01ldGFkYXRhS2V5cygia2V5MSIpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0QWxsS2V5cygpLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YSgia2V5MSIpKTsKKworICAgICAgcGdlTWV0LmxpbmtLZXkoImtleUxpbmsxIiwgImtleTEiKTsKKyAgICAgIHBnZU1ldC5yZXBsYWNlTWV0YWRhdGEoImtleUxpbmsxIiwgIm5ld1ZhbHVlIik7CisgICAgICBhc3NlcnRFcXVhbHMoIm5ld1ZhbHVlIiwKKyAgICAgICAgICAgIHBnZU1ldC5hc01ldGFkYXRhKFR5cGUuRFlOQU1JQykuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RMaW5raW5nKCkgeworICAgICAgUGdlTWV0YWRhdGEgcGdlTWV0ID0gbmV3IFBnZU1ldGFkYXRhKCk7CisKKyAgICAgIHBnZU1ldC5yZXBsYWNlTWV0YWRhdGEoImtleTEiLCAidmFsdWUxIik7CisgICAgICBwZ2VNZXQubGlua0tleSgia2V5TGluazEiLCAia2V5MSIpOworICAgICAgcGdlTWV0LmxpbmtLZXkoImtleUxpbmsyIiwgImtleUxpbmsxIik7CisgICAgICBwZ2VNZXQubGlua0tleSgia2V5TGluazMiLCAia2V5TGluazEiKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazIiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazMiKSk7CisKKyAgICAgIHBnZU1ldC5yZXBsYWNlTWV0YWRhdGEoImtleUxpbmszIiwgIm5ld1ZhbHVlIik7CisKKyAgICAgIGFzc2VydEVxdWFscygibmV3VmFsdWUiLCBwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIm5ld1ZhbHVlIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXlMaW5rMSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygibmV3VmFsdWUiLCBwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleUxpbmsyIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJuZXdWYWx1ZSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazMiKSk7CisKKyAgICAgIGFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QoImtleUxpbmsxIiwgImtleTEiKSwKKyAgICAgICAgICAgIHBnZU1ldC5nZXRSZWZlcmVuY2VLZXlQYXRoKCJrZXlMaW5rMiIpKTsKKyAgICAgIGFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QoImtleUxpbmsxIiwgImtleTEiKSwKKyAgICAgICAgICAgIHBnZU1ldC5nZXRSZWZlcmVuY2VLZXlQYXRoKCJrZXlMaW5rMyIpKTsKKworICAgICAgcGdlTWV0LnJlcGxhY2VNZXRhZGF0YSgia2V5MSIsICJ2YWx1ZTEiKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleTEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazIiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5TGluazMiKSk7CisKKyAgICAgIHBnZU1ldC51bmxpbmtLZXkoImtleUxpbmsxIik7CisKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXkxIikpOworICAgICAgYXNzZXJ0TnVsbChwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleUxpbmsxIikpOworICAgICAgYXNzZXJ0TnVsbChwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleUxpbmsyIikpOworICAgICAgYXNzZXJ0TnVsbChwZ2VNZXQuZ2V0TWV0YWRhdGEoImtleUxpbmszIikpOworCisgICAgICBwZ2VNZXQubGlua0tleSgia2V5TGluazEiLCAia2V5MSIpOworCisgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHBnZU1ldC5nZXRNZXRhZGF0YSgia2V5MSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXlMaW5rMSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXlMaW5rMiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgcGdlTWV0LmdldE1ldGFkYXRhKCJrZXlMaW5rMyIpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKCJrZXkxIiwgcGdlTWV0LnJlc29sdmVLZXkoImtleTEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImtleTEiLCBwZ2VNZXQucmVzb2x2ZUtleSgia2V5TGluazEiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImtleTEiLCBwZ2VNZXQucmVzb2x2ZUtleSgia2V5TGluazIiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImtleTEiLCBwZ2VNZXQucmVzb2x2ZUtleSgia2V5TGluazMiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImtleUxpbms0IiwgcGdlTWV0LnJlc29sdmVLZXkoImtleUxpbms0IikpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9tZXRhZGF0YS9UZXN0UGdlVGFza01ldEtleXMuamF2YSBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvbWV0YWRhdGEvVGVzdFBnZVRhc2tNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjZTc3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvbWV0YWRhdGEvVGVzdFBnZVRhc2tNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIFBnZVRhc2tNZXRLZXlzfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RQZ2VUYXNrTWV0S2V5cyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdExlZ2FjeU1vZGUoKSB7CisgICAgICBhc3NlcnRFcXVhbHMoUGdlVGFza01ldEtleXMuTkFNRS5nZXROYW1lKCksIFBnZVRhc2tNZXRLZXlzLk5BTUUubmFtZSk7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoUGdlVGFza01ldEtleXMuVVNFX0xFR0FDWV9QUk9QRVJUWSwgInRydWUiKTsKKyAgICAgIGFzc2VydEVxdWFscyhQZ2VUYXNrTWV0S2V5cy5OQU1FLmdldE5hbWUoKSwgUGdlVGFza01ldEtleXMuTkFNRS5sZWdhY3lOYW1lKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdElzVmVjdG9yKCkgeworICAgICAgYXNzZXJ0RmFsc2UoUGdlVGFza01ldEtleXMuTkFNRS5pc1ZlY3RvcigpKTsKKyAgICAgIGFzc2VydEZhbHNlKFBnZVRhc2tNZXRLZXlzLmdldEJ5TmFtZSgKKyAgICAgICAgICAgIFBnZVRhc2tNZXRLZXlzLk5BTUUuZ2V0TmFtZSgpKS5pc1ZlY3RvcigpKTsKKyAgICAgIGFzc2VydFRydWUoUGdlVGFza01ldEtleXMuUFJPUEVSVFlfQURERVJTLmlzVmVjdG9yKCkpOworICAgICAgYXNzZXJ0VHJ1ZShQZ2VUYXNrTWV0S2V5cy5nZXRCeU5hbWUoCisgICAgICAgICAgICBQZ2VUYXNrTWV0S2V5cy5QUk9QRVJUWV9BRERFUlMuZ2V0TmFtZSgpKS5pc1ZlY3RvcigpKTsKKyAgICAgIGFzc2VydE51bGwoUGdlVGFza01ldEtleXMuZ2V0QnlOYW1lKCJCT0dVUy9CT0dVUy9CT0dVUyIpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvc3RhZ2luZy9UZXN0RmlsZVN0YWdlci5qYXZhIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS9zdGFnaW5nL1Rlc3RGaWxlU3RhZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhN2MxOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvc3RhZ2luZy9UZXN0RmlsZVN0YWdlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uuc3RhZ2luZzsKKworLy9FYXN5TW9jayBzdGF0aWMgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlU3RyaWN0TW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcG9ydE1hdGNoZXI7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucGdlLm1ldGFkYXRhLlBnZVRhc2tNZXRLZXlzOworCisvL0Vhc3lNb2NrIGltcG9ydHMKK2ltcG9ydCBvcmcuZWFzeW1vY2suSUFyZ3VtZW50TWF0Y2hlcjsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgRmlsZVN0YWdlcn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEZpbGVTdGFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGaWxlTWFuYWdlckNsaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgLy8gVGVzdCB0aHJvd3MgY2FzZS4KKyAgICAgIFBnZU1ldGFkYXRhIHBnZU1ldGFkYXRhID0gY3JlYXRlU3RyaWN0TW9jayhQZ2VNZXRhZGF0YS5jbGFzcyk7CisgICAgICBleHBlY3QocGdlTWV0YWRhdGEuZ2V0TWV0YWRhdGEoUGdlVGFza01ldEtleXMuUVVFUllfRklMRV9NQU5BR0VSX1VSTCkpCisgICAgICAgICAgICAuYW5kUmV0dXJuKG51bGwpOworICAgICAgcmVwbGF5KHBnZU1ldGFkYXRhKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgIEZpbGVTdGFnZXIuY3JlYXRlRmlsZU1hbmFnZXJDbGllbnQocGdlTWV0YWRhdGEpOworICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLyogZXhwZWN0IHRocm93ICovCisgICAgICB9CisgICAgICB2ZXJpZnkocGdlTWV0YWRhdGEpOworCisgICAgICAvLyBUZXN0IHN1Y2Nlc3MgY2FzZS4KKyAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZmlsZW1nci5jYXRhbG9nLmZhY3RvcnkiLCAiIik7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImZpbGVtZ3IucmVwb3NpdG9yeS5mYWN0b3J5IiwgIiIpOworICAgICAgaW50IHBvcnQgPSA5ODc2OworICAgICAgWG1sUnBjRmlsZU1hbmFnZXIgZmlsZW1nciA9IG5ldyBYbWxScGNGaWxlTWFuYWdlcihwb3J0KTsKKyAgICAgIFN0cmluZyBmaWxlbWdyVXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6IiArIHBvcnQ7CisgICAgICBwZ2VNZXRhZGF0YSA9IGNyZWF0ZVN0cmljdE1vY2soUGdlTWV0YWRhdGEuY2xhc3MpOworICAgICAgZXhwZWN0KHBnZU1ldGFkYXRhLmdldE1ldGFkYXRhKFBnZVRhc2tNZXRLZXlzLlFVRVJZX0ZJTEVfTUFOQUdFUl9VUkwpKQorICAgICAgICAgICAgLmFuZFJldHVybihmaWxlbWdyVXJsKTsKKyAgICAgIHJlcGxheShwZ2VNZXRhZGF0YSk7CisKKyAgICAgIGFzc2VydEVxdWFscyhmaWxlbWdyVXJsLCBGaWxlU3RhZ2VyLmNyZWF0ZUZpbGVNYW5hZ2VyQ2xpZW50KHBnZU1ldGFkYXRhKQorICAgICAgICAgICAgLmdldEZpbGVNYW5hZ2VyVXJsKCkudG9TdHJpbmcoKSk7CisgICAgICB2ZXJpZnkocGdlTWV0YWRhdGEpOworICAgICAgZmlsZW1nci5zaHV0ZG93bigpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvZHVjdFJlZmVyZW5jZXMoKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiwKKyAgICAgICAgIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgcHJvZHVjdElkID0gIjEyMzQ1IjsKKworICAgICAgU3RyaW5nIHVyaTEgPSAiZmlsZTovLy9wYXRoL3RvL2ZpbGUxIjsKKyAgICAgIFN0cmluZyB1cmkyID0gImZpbGU6Ly8vcGF0aC90by9maWxlMiI7CisgICAgICBSZWZlcmVuY2UgcmVmMSA9IG5ldyBSZWZlcmVuY2UoKTsKKyAgICAgIHJlZjEuc2V0RGF0YVN0b3JlUmVmZXJlbmNlKHVyaTEpOworICAgICAgUmVmZXJlbmNlIHJlZjIgPSBuZXcgUmVmZXJlbmNlKCk7CisgICAgICByZWYyLnNldERhdGFTdG9yZVJlZmVyZW5jZSh1cmkyKTsKKworICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1DbGllbnQgPSBjcmVhdGVTdHJpY3RNb2NrKFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50LmNsYXNzKTsKKyAgICAgIGV4cGVjdChmbUNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0SWRNYXRjaGVyLmVxUHJvZHVjdElkKHByb2R1Y3RJZCkpKS5hbmRSZXR1cm4oCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QocmVmMSwgcmVmMikpOworICAgICAgcmVwbGF5KGZtQ2xpZW50KTsKKworICAgICAgTGlzdDxVUkk+IHVyaXMgPSBGaWxlU3RhZ2VyLmdldFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3RJZCwgZm1DbGllbnQpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHVyaXMuc2l6ZSgpKTsKKyAgICAgIGFzc2VydFRydWUodXJpcy5jb250YWlucyhuZXcgVVJJKCJmaWxlOi8vL3BhdGgvdG8vZmlsZTEiKSkpOworICAgICAgYXNzZXJ0VHJ1ZSh1cmlzLmNvbnRhaW5zKG5ldyBVUkkoImZpbGU6Ly8vcGF0aC90by9maWxlMiIpKSk7CisKKyAgICAgIHZlcmlmeShmbUNsaWVudCk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RBc1VSSSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgU3RyaW5nIGFic29sdXRlSHR0cFVyaSA9ICJodHRwOi8vc29tZXdoZXJlLmNvbS9wYXRoL3RvL2RhdGEuZGF0IjsKKyAgICAgIFN0cmluZyBhYnNvbHV0ZUZpbGVVcmkgPSAiZmlsZTovLy9wYXRoL3RvL2RhdGEuZGF0IjsKKyAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSAicGF0aC90by9kYXRhLmRhdCI7CisgICAgICBTdHJpbmcgYWJzb2x1dGVQYXRoID0gIi9wYXRoL3RvL2RhdGEuZGF0IjsKKworICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9wYXRoL3RvL2RhdGEuZGF0IiwKKyAgICAgICAgICAgIEZpbGVTdGFnZXIuYXNVUkkoYWJzb2x1dGVIdHRwVXJpKS50b1N0cmluZygpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZmlsZTovLy9wYXRoL3RvL2RhdGEuZGF0IiwgRmlsZVN0YWdlcgorICAgICAgICAgICAgLmFzVVJJKGFic29sdXRlRmlsZVVyaSkudG9TdHJpbmcoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6Ly8iICsgbmV3IEZpbGUoIiIpLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICArICIvcGF0aC90by9kYXRhLmRhdCIsIEZpbGVTdGFnZXIuYXNVUkkocmVsYXRpdmVQYXRoKS50b1N0cmluZygpKTsKKyAgICAgIGFzc2VydEVxdWFscygiZmlsZTovLy9wYXRoL3RvL2RhdGEuZGF0IiwgRmlsZVN0YWdlci5hc1VSSShhYnNvbHV0ZVBhdGgpCisgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZHVjdElkTWF0Y2hlciBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworCisgICAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0SWQ7CisKKyAgICAgIHB1YmxpYyBQcm9kdWN0SWRNYXRjaGVyKFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICAgICAgIHRoaXMucHJvZHVjdElkID0gcHJvZHVjdElkOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImVxUHJvZHVjdCgiKTsKKyAgICAgICAgIGJ1ZmZlci5hcHBlbmQoUHJvZHVjdC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIHdpdGggcHJvZHVjdCBpZCBbIik7CisgICAgICAgICBidWZmZXIuYXBwZW5kKHByb2R1Y3RJZCArICJdKSIpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG9iaikgeworICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2R1Y3QpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWN0SWQuZXF1YWxzKCgoUHJvZHVjdCkgb2JqKS5nZXRQcm9kdWN0SWQoKSk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzdGF0aWMgUHJvZHVjdCBlcVByb2R1Y3RJZChTdHJpbmcgcHJvZHVjdElkKSB7CisgICAgICAgICByZXBvcnRNYXRjaGVyKG5ldyBQcm9kdWN0SWRNYXRjaGVyKHByb2R1Y3RJZCkpOworICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICB9CisgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2UvdXRpbC9UZXN0WG1sSGVscGVyLmphdmEgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3V0aWwvVGVzdFhtbEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTM3YjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3V0aWwvVGVzdFhtbEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmZpZy5QZ2VDb25maWdNZXRLZXlzLklNUE9SVF9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldEZpbGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldEltcG9ydHM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnV0aWwuWG1sSGVscGVyLmdldE5hbWVzcGFjZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbC5YbWxIZWxwZXIuZ2V0Um9vdEVsZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFhtbEhlbHBlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMQU5LX1BHRV9DT05GSUcgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2JsYW5rLXBnZS1jb25maWcueG1sIjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRTX09OTFlfUEdFX0NPTkZJRyA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvaW1wb3J0cy1vbmx5LXBnZS1jb25maWcueG1sIjsKKworICAgLy8gVGVzdHMgdGhhdCBvbmx5IHJvb3Qgbm9kZSBpcyByZXF1aXJlZC4KKyAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkQmxhbmtYbWxGaWxlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICBFbGVtZW50IGVsZW0gPSBnZXRSb290RWxlbWVudChCTEFOS19QR0VfQ09ORklHKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZWxlbSk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgZWxlbS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCIjdGV4dCIsIGVsZW0uZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIGVsZW0uZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldEltcG9ydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIEVsZW1lbnQgZWxlbSA9IGdldFJvb3RFbGVtZW50KElNUE9SVFNfT05MWV9QR0VfQ09ORklHKTsKKyAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRzID0gZ2V0SW1wb3J0cyhlbGVtLCBtZXRhZGF0YSk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgaW1wb3J0cy5zaXplKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJibGFuayIsIGltcG9ydHMuZ2V0KDApLmdldEZpcnN0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJibGFuay1wZ2UtY29uZmlnLnhtbCIsIGltcG9ydHMuZ2V0KDApLmdldFNlY29uZCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhudWxsLCBpbXBvcnRzLmdldCgxKS5nZXRGaXJzdCgpKTsKKyAgICAgIGFzc2VydEVxdWFscygicGdlLWNvbmZpZy54bWwiLCBpbXBvcnRzLmdldCgxKS5nZXRTZWNvbmQoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIEVsZW1lbnQgZWxlbSA9IGdldFJvb3RFbGVtZW50KElNUE9SVFNfT05MWV9QR0VfQ09ORklHKTsKKyAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisKKyAgICAgIE5vZGVMaXN0IGltcG9ydFRhZ3MgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKElNUE9SVF9UQUcpOworICAgICAgYXNzZXJ0RXF1YWxzKCJibGFuayIsIGdldE5hbWVzcGFjZSgoRWxlbWVudCkgaW1wb3J0VGFncy5pdGVtKDApLCBtZXRhZGF0YSkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJibGFuay1wZ2UtY29uZmlnLnhtbCIsIGdldEZpbGUoKEVsZW1lbnQpIGltcG9ydFRhZ3MuaXRlbSgwKSwgbWV0YWRhdGEpKTsKKyAgICAgIGFzc2VydE51bGwoZ2V0TmFtZXNwYWNlKChFbGVtZW50KSBpbXBvcnRUYWdzLml0ZW0oMSksIG1ldGFkYXRhKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInBnZS1jb25maWcueG1sIiwgZ2V0RmlsZSgoRWxlbWVudCkgaW1wb3J0VGFncy5pdGVtKDEpLCBtZXRhZGF0YSkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS91dGlsL1V0aWxzVGVzdC5qYXZhIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS91dGlsL1V0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMmU0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3V0aWwvVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5RdWVyeUZvcm11bGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCX0KKworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEV2YWxTUUwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb25uZWN0aW9uRXhjZXB0aW9uLCBDYXRhbG9nRXhjZXB0aW9uLCBSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiwgUXVlcnlGb3JtdWxhdGlvbkV4Y2VwdGlvbiB7CisJCS8vVXRpbHMuZXZhbFNRTCgiU1FMIHsgU0VMRUNUIEZpbGVuYW1lIEZST00gSUFTSV9MMUMgV0hFUkUgRGF0YVZlcnNpb24gPj0gJzIzLjQnIEFORCBEYXRhVmVyc2lvbiA8PSAnMjQuNCcgQU5EIERhdGFWZXJzaW9uICE9ICcyNC4wJyBPUiBGaWxlbmFtZSAhPSAnU29tZU5hbWUnIH0iKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9NZXRhZGF0YUtleVJlcGxhY2VtZW50VGVtcGxhdGVXcml0ZXJUZXN0LmphdmEgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvTWV0YWRhdGFLZXlSZXBsYWNlbWVudFRlbXBsYXRlV3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2M1NTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvTWV0YWRhdGFLZXlSZXBsYWNlbWVudFRlbXBsYXRlV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciB0aGUgTWV0YWRhdGFLZXlSZXBsYWNlbWVudFdyaXRlci4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YUtleVJlcGxhY2VtZW50VGVtcGxhdGVXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoTWV0YWRhdGFLZXlSZXBsYWNlbWVudFRlbXBsYXRlV3JpdGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9ICJXZWxjb21lIHRvIEFwYWNoZUNvbiBQYXVsIGFuZCBDaHJpcyEgWW91IGFyZSBhIG1lbWJlciBvZiB0aGUgZm9sbG93aW5nIHByb2plY3RzIE9PRFQsVGlrYSxTSVMsR29yYS4iOworCisgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNZXRhZGF0YUtleVJlcGxhY2VyVGVtcGxhdGVXcml0ZXIgd3JpdGVyID0gbmV3IE1ldGFkYXRhS2V5UmVwbGFjZXJUZW1wbGF0ZVdyaXRlcigpOworICAgIFN0cmluZyB0ZW1wbGF0ZVNvdXJjZVBhdGggPSAiLi9zcmMvdGVzdC9yZXNvdXJjZXMvbWV0a2V5cmVwbGFjZS50ZW1wbGF0ZSI7CisgICAgU3RyaW5nIG91dFBhdGggPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJmb28iLCAiYmFyIikuZ2V0UGFyZW50RmlsZSgpCisgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICBpZiAoIW91dFBhdGguZW5kc1dpdGgoIi8iKSkKKyAgICAgIG91dFBhdGggKz0gIi8iOworCisgICAgb3V0UGF0aCArPSAiZ2VuZXJhdGVkLnRlbXBsYXRlIjsKKworICAgIE1ldGFkYXRhIG1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldC5hZGRNZXRhZGF0YSgiUGVyc29uMSIsICJQYXVsIik7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJQZXJzb24yIiwgIkNocmlzIik7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJQcm9qZWN0cyIsICJPT0RUIik7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJQcm9qZWN0cyIsICJUaWthIik7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJQcm9qZWN0cyIsICJTSVMiKTsKKyAgICBtZXQuYWRkTWV0YWRhdGEoIlByb2plY3RzIiwgIkdvcmEiKTsKKworICAgIHRyeSB7CisgICAgICB3cml0ZXIuZ2VuZXJhdGVGaWxlKG91dFBhdGgsIG1ldCwgTE9HLCB0ZW1wbGF0ZVNvdXJjZVBhdGgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRQYXRoKS5leGlzdHMoKSk7CisgICAgU3RyaW5nIGZpbGVTdHJpbmcgPSBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyhuZXcgRmlsZShvdXRQYXRoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChmaWxlU3RyaW5nKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZpbGVTdHJpbmcpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvTW9ja0R5bmFtaWNDb25maWdGaWxlV3JpdGVyLmphdmEgYi8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvTW9ja0R5bmFtaWNDb25maWdGaWxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5ZmFiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wZ2Uvd3JpdGVycy9Nb2NrRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVyczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBEeW5hbWljQ29uZmlnRmlsZVdyaXRlcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrRHluYW1pY0NvbmZpZ0ZpbGVXcml0ZXIgZXh0ZW5kcyBEeW5hbWljQ29uZmlnRmlsZVdyaXRlciB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIEZpbGUgZ2VuZXJhdGVGaWxlKFN0cmluZyBmaWxlUGF0aCwgTWV0YWRhdGEgbWV0YWRhdGEsIExvZ2dlciBsb2dnZXIsCisgICAgICAgICBPYmplY3QuLi4gY3VzdG9tQXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKyAgICAgIGNvbmZpZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgRmlsZVV0aWxzLnRvdWNoKGNvbmZpZ0ZpbGUpOworICAgICAgcmV0dXJuIGNvbmZpZ0ZpbGU7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcGdlL3dyaXRlcnMvVmVsb2NpdHlDb25maWdGaWxlV3JpdGVyVGVzdC5qYXZhIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL1ZlbG9jaXR5Q29uZmlnRmlsZVdyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM0ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3BnZS93cml0ZXJzL1ZlbG9jaXR5Q29uZmlnRmlsZVdyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlZlbG9jaXR5Q29uZmlnRmlsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS53cml0ZXJzLlZlbG9jaXR5TWV0YWRhdGE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBWZWxvY2l0eUNvbmZpZ0ZpbGVXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoVmVsb2NpdHlDb25maWdGaWxlV3JpdGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb25maWdGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvdGVzdC1jb25maWcudm0iKTsKKyAgICBWZWxvY2l0eUNvbmZpZ0ZpbGVXcml0ZXIgdmNmdyA9IG5ldyBWZWxvY2l0eUNvbmZpZ0ZpbGVXcml0ZXIoKTsKKyAgICBWZWxvY2l0eU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IFZlbG9jaXR5TWV0YWRhdGEobmV3IE1ldGFkYXRhKCkpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKCJuYW1lIiwgIkNocmlzIik7CisgICAgbWV0YWRhdGEuYWRkTWV0YWRhdGEoIm5hbWUiLCAiUGF1bCIpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKCJjb25mZXJlbmNlIiwgIkFwYWNoZUNvbiIpOworICAgIEZpbGUgY29uZmlnID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiY29uZmlnIiwgIi5vdXQiKTsKKyAgICB0cnkgeworICAgICAgdmNmdy5nZW5lcmF0ZUZpbGUoY29uZmlnLnRvU3RyaW5nKCksIG1ldGFkYXRhLCBMT0csIHVybC5nZXRGaWxlKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIFN0cmluZyBvdXRwdXQgPSBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyhjb25maWcpOworICAgIGFzc2VydEVxdWFscyhTeXN0ZW0uZ2V0ZW52KCkuZ2V0KCJVU0VSIikgKyAiIFdlbGNvbWVzIHRvIEFwYWNoZUNvbiBDaHJpcyBQYXVsISIsIG91dHB1dCk7CisgICAgY29uZmlnLmRlbGV0ZSgpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9ibGFuay1wZ2UtY29uZmlnLnhtbCBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9ibGFuay1wZ2UtY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MDM5NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2JsYW5rLXBnZS1jb25maWcueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCitFbXB0eSBQZ2VDb25maWcgZmlsZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKy0tPgorPHBnZUNvbmZpZz4gICAgCis8L3BnZUNvbmZpZz4KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9jb21tb24tbWV0YWRhdGEtcGdlLWNvbmZpZy54bWwgYi8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29tbW9uLW1ldGFkYXRhLXBnZS1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3MjU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29tbW9uLW1ldGFkYXRhLXBnZS1jb25maWcueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIAorICBPbmx5IGN1c3RvbU1ldGFkYXRhIG90aGVyIFBnZUNvbmZpZyBYTUwgZmlsZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKy0tPgorPHBnZUNvbmZpZz4KKworCTxjdXN0b21NZXRhZGF0YT4KKwkJPG1ldGFkYXRhIGtleT0iR3JlYXRlclRoYW4iIHZhbD0iJmd0OyIgLz4KKwkJPG1ldGFkYXRhIGtleT0iTGVzc1RoYW4iIHZhbD0iJmx0OyIgLz4KKyAgICA8bWV0YWRhdGEga2V5PSJBbXBlcnNhbmQiIHZhbD0iJmFtcDsiIC8+CisgICAgPG1ldGFkYXRhIGtleT0iQXBvc3Ryb3BoZSIgdmFsPSImYXBvczsiIC8+CisgICAgPG1ldGFkYXRhIGtleT0iUXVvdGF0aW9uTWFyayIgdmFsPSImcXVvdDsiIC8+CQkKKwk8L2N1c3RvbU1ldGFkYXRhPgorCis8L3BnZUNvbmZpZz4KZGlmZiAtLWdpdCBhLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9jdXN0b20tbWV0YWRhdGEtb25seS1wZ2UtY29uZmlnLnhtbCBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9jdXN0b20tbWV0YWRhdGEtb25seS1wZ2UtY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2E3ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2N1c3RvbS1tZXRhZGF0YS1vbmx5LXBnZS1jb25maWcueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIAorICBPbmx5IGN1c3RvbU1ldGFkYXRhIG90aGVyIFBnZUNvbmZpZyBYTUwgZmlsZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKy0tPgorPHBnZUNvbmZpZz4KKworCTxjdXN0b21NZXRhZGF0YT4KKwkJPG1ldGFkYXRhIGtleT0iIiB2YWw9IiIgLz4KKwkJPG1ldGFkYXRhIGtleT0iIiBrZXktcmVmPSIiIC8+CisJCTxtZXRhZGF0YSBrZXktZ2VuPSIiIHZhbD0iIiAvPgorCTwvY3VzdG9tTWV0YWRhdGE+CisKKzwvcGdlQ29uZmlnPgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2RhdGEtZmlsZS0xLnR4dCBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMTdjNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMS50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGlzIGlzIGEgdGVzdCBkYXRhIGZpbGUgMQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2RhdGEtZmlsZS0yLnR4dCBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhYTVkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9kYXRhLWZpbGUtMi50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGlzIGlzIGEgdGVzdCBkYXRhIGZpbGUgMgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2R5bi1pbnB1dC13cml0ZXJzLXBnZS1jb25maWcueG1sIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2R5bi1pbnB1dC13cml0ZXJzLXBnZS1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4YTFjMzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvZHluLWlucHV0LXdyaXRlcnMtcGdlLWNvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwZ2VDb25maWc+CisKKwk8Y3VzdG9tTWV0YWRhdGE+CisJICA8bWV0YWRhdGEga2V5PSJUZXh0V3JpdGVyIiB2YWw9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLndyaXRlcnMuVGV4dENvbmZpZ0ZpbGVXcml0ZXIiIC8+CisJICA8bWV0YWRhdGEga2V5PSJDc3ZXcml0ZXIiIHZhbD0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2Uud3JpdGVycy5Dc3ZDb25maWdGaWxlV3JpdGVyIiAvPgorCTwvY3VzdG9tTWV0YWRhdGE+CisKKzwvcGdlQ29uZmlnPgpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL2ltcG9ydHMtb25seS1wZ2UtY29uZmlnLnhtbCBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9pbXBvcnRzLW9ubHktcGdlLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTY3ZjI1YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9pbXBvcnRzLW9ubHktcGdlLWNvbmZpZy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KK09ubHkgaW1wb3J0cyBvdGhlciBQZ2VDb25maWcgWE1MIGZpbGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuCistLT4KKzxwZ2VDb25maWc+CisgICAgCisgICAgPGltcG9ydCBuYW1lc3BhY2U9ImJsYW5rIiBmaWxlPSJibGFuay1wZ2UtY29uZmlnLnhtbCIvPgorICAgIDxpbXBvcnQgZmlsZT0icGdlLWNvbmZpZy54bWwiLz4KKworPC9wZ2VDb25maWc+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvbWV0a2V5cmVwbGFjZS50ZW1wbGF0ZSBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy9tZXRrZXlyZXBsYWNlLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODY0OGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvbWV0a2V5cmVwbGFjZS50ZW1wbGF0ZQpAQCAtMCwwICsxIEBACitXZWxjb21lIHRvIEFwYWNoZUNvbiAkUGVyc29uMSBhbmQgJFBlcnNvbjIhIFlvdSBhcmUgYSBtZW1iZXIgb2YgdGhlIGZvbGxvd2luZyBwcm9qZWN0cyAkUHJvamVjdHMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3BnZS1jb25maWcueG1sIGIvMC4xMC9wZ2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3BnZS1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlNGYxMjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvcGdlLWNvbmZpZy54bWwKQEAgLTAsMCArMSw5OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorCitUT0RPKGJmb3N0ZXIpOiBNYWtlIHRoaXMgYSB3b3JraW5nIGV4YW1wbGUuCistLT4KKzxwZ2VDb25maWc+CisKKyAgPGltcG9ydCBuYW1lc3BhY2U9ImNvbW1vbnMiIGZpbGU9ImNvbW1vbi1tZXRhZGF0YS1wZ2UtY29uZmlnLnhtbCIgLz4KKyAgPGltcG9ydCBuYW1lc3BhY2U9IndyaXRlcnMiIGZpbGU9ImR5bi1pbnB1dC13cml0ZXJzLXBnZS1jb25maWcueG1sIiAvPgorCisJPGR5bklucHV0RmlsZXM+CisJCTxmaWxlIHBhdGg9IltUZXh0SW5wdXRGaWxlXSIgd3JpdGVyQ2xhc3M9Ilt3cml0ZXJzL1RleHRXcml0ZXJdIiBhcmdzPSJbVGV4dEZpbGVUZW1wbGF0ZV0iIC8+CisgICAgPGZpbGUgcGF0aD0iW0NzdklucHV0RmlsZV0iIHdyaXRlckNsYXNzPSJbd3JpdGVycy9Dc3ZXcml0ZXJdIiBhcmdzPSJbQ3N2SGVhZGVyXSIgLz4KKwk8L2R5bklucHV0RmlsZXM+CisKKyAgPGZpbGVTdGFnaW5nIGRpcj0iW1N0YWdpbmdEaXJdIiBmb3JjZT0iW0ZvcmNlU3RhZ2luZ10iPgorICAgIDxzdGFnZUZpbGVzIG1ldGFkYXRhS2V5PSJJbnB1dEZpbGVzIiAvPgorICA8L2ZpbGVTdGFnaW5nPgorCisJPGV4ZSBkaXI9IltXb3JraW5nRGlyXSIgc2hlbGxUeXBlPSJjc2giPgorCQk8Y21kPmVjaG8gW1RleHRJbnB1dEZpbGVdIFtjb21tb25zL0dyZWF0ZXJUaGFuXSBbT3V0cHV0RmlsZU5hbWVdPC9jbWQ+CisgICAgPGNtZD5lY2hvIFtDc3ZJbnB1dEZpbGVdIFtjb21tb25zL0dyZWF0ZXJUaGFuXVtjb21tb25zL0dyZWF0ZXJUaGFuXSBbT3V0cHV0RmlsZU5hbWVdPC9jbWQ+CisgICAgPGNtZD5pZiAoICEgLWUgW0lucHV0RmlsZTFdIHx8ICEgLWUgW0lucHV0RmlsZTJdICkgdGhlbjwvY21kPgorICAgIDxjbWQ+ICBleGl0IDE8L2NtZD4KKyAgICA8Y21kPmVuZGlmPC9jbWQ+CisJPC9leGU+CisKKwk8b3V0cHV0PgorCQk8ZGlyIHBhdGg9IltPdXRwdXREaXJdIiBjcmVhdGVCZWZvcmVFeGU9InRydWUiLz4KKwk8L291dHB1dD4KKworCTxjdXN0b21NZXRhZGF0YT4KKyAgICA8IS0tIERlZmF1bHRzIC0tPgorICAgIDxtZXRhZGF0YSBrZXk9IkdSRUVUSU5HX0VOVU0iIHZhbD0iU2ltcGxlIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkZPUkNFX1NUQUdJTkciIHZhbD0idHJ1ZSIgLz4KKyAgICA8bWV0YWRhdGEga2V5PSJDVVNUT01fR1JFRVRJTkdfRU5VTSIgdmFsPSJDdXN0b20iIC8+CisgICAgPG1ldGFkYXRhIGtleT0iQ1VTVE9NX0dSRUVUSU5HX0VOVU1fVkFMVUUiIHZhbD0iW2NvbW1vbnMvTGVzc1RoYW5dQ3VzdG9tIEdyZWV0aW5nIEhlcmVbY29tbW9ucy9HcmVhdGVyVGhhbl0iIC8+CisgICAgCisJICA8IS0tIFJlbWFwIGV4dGVybmFsbHkgc2V0IG1ldGFkYXRhIHNvIGlmIG5hbWUgY2hhbmdlcyBlYXN5IHRvIHVwZGF0ZSBjb25maWcgZmlsZSAtLT4KKwkgIDxtZXRhZGF0YSBrZXk9IldvcmtpbmdEaXIiIGtleS1yZWY9IldPUktJTkdfRElSIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkdyZWV0aW5nRW51bSIga2V5LXJlZj0iR1JFRVRJTkdfRU5VTSIgLz4KKyAgICA8bWV0YWRhdGEga2V5PSJDdXN0b21HcmVldGluZ0VudW0iIGtleS1yZWY9IkNVU1RPTV9HUkVFVElOR19FTlVNIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkN1c3RvbUdyZWV0aW5nRW51bVZhbHVlIiBrZXktcmVmPSJDVVNUT01fR1JFRVRJTkdfRU5VTV9WQUxVRSIgLz4KKyAgICA8bWV0YWRhdGEga2V5PSJJbnB1dEZpbGUxIiBrZXktcmVmPSJJTlBVVF9GSUxFXzEiIC8+CisgICAgPG1ldGFkYXRhIGtleT0iSW5wdXRGaWxlMiIga2V5LXJlZj0iSU5QVVRfRklMRV8yIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkZvcmNlU3RhZ2luZyIga2V5LXJlZj0iRk9SQ0VfU1RBR0lORyIgLz4KKworICAgIDwhLS0gSW5wdXQgRmlsZXMgLS0+CisgICAgPG1ldGFkYXRhIGtleT0iSW5wdXRGaWxlcyIgdmFsPSJbSW5wdXRGaWxlMV0sW0lucHV0RmlsZTJdIiBzcGxpdD0idHJ1ZSIgLz4KKyAgICAKKyAgICA8IS0tIFdvcmtpbmcgc3ViLWRpcmVjdG9yaWVzIC0tPgorICAgIDxtZXRhZGF0YSBrZXk9IkNvbmZpZ0RpciIgdmFsPSJbV29ya2luZ0Rpcl0vY29uZmlnIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9Ik91dHB1dERpciIgdmFsPSJbV29ya2luZ0Rpcl0vb3V0cHV0IiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IlN0YWdpbmdEaXIiIHZhbD0iW1dvcmtpbmdEaXJdL3N0YWdpbmciIC8+CisKKyAgICA8IS0tIER5bmFtaWNhbGx5IGdlbmVyYXRlZCBQR0UgaW5wdXQgY29uZmlnIGZpbGVzIC0tPgorICAgIDxtZXRhZGF0YSBrZXk9IkR5bklucHV0L1RleHQvTmFtZSIgdmFsPSJkeW4taW5wdXQudHh0IiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkR5bklucHV0L0NTVi9OYW1lIiB2YWw9ImR5bi1pbnB1dC5jc3YiIC8+CisgICAgPG1ldGFkYXRhIGtleT0iVGV4dElucHV0RmlsZSIgdmFsPSJbQ29uZmlnRGlyXS9bRHluSW5wdXQvVGV4dC9OYW1lXSIgLz4KKyAgICA8bWV0YWRhdGEga2V5PSJDc3ZJbnB1dEZpbGUiIHZhbD0iW0NvbmZpZ0Rpcl0vW0R5bklucHV0L0NTVi9OYW1lXSIgLz4KKworICAgIDwhLS0gT3V0cHV0IGZpbGUgbmFtZXMgLS0+CisgICAgPG1ldGFkYXRhIGtleT0iT3V0cHV0RmlsZU5hbWUiIHZhbD0iUGdlT3V0cHV0LnR4dCIgLz4KKworICAgIDwhLS0gVGV4dCBpbnB1dCBmaWxlIHRlbXBsYXRlIG1ldGFkYXRhIC0tPgorICAgIDxtZXRhZGF0YSBrZXk9IlRleHRGaWxlVGVtcGxhdGUiIGVudlJlcGxhY2U9ImZhbHNlIj4KKyAgICAgIFtHcmVldGluZ10sCisgICAgICBUaGlzIGlzIGEgdGVtcGxhdGUgZm9yIHRleHQgZmlsZSBbVGV4dElucHV0RmlsZV0uCisgICAgICBUaGlzIHRlbXBsYXRlIHdhcyB3cml0dGVuIGF0OiBbREFURS5VVENdLgorICAgICAgW1NpZ25hdHVyZV0KKyAgICA8L21ldGFkYXRhPgorICAgIDxtZXRhZGF0YSBrZXk9IlNpbXBsZUdyZWV0aW5nIiB2YWw9IkhlbGxvIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkNhc3VhbEdyZWV0aW5nIiB2YWw9IkhpIiAvPiAgICAKKyAgICA8bWV0YWRhdGEga2V5LWdlbj0iW0N1c3RvbUdyZWV0aW5nRW51bV1HcmVldGluZyIgdmFsPSJbQ3VzdG9tR3JlZXRpbmdFbnVtVmFsdWVdIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkdyZWF0aW5nIiBrZXktcmVmPSJbR3JlZXRpbmdFbnVtXUdyZWV0aW5nIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IlNpZ25hdHVyZSIgdmFsPSItYmZvc3QiIC8+CisKKyAgICA8IS0tIENTViBpbnB1dCBmaWxlIG1ldGFkYXRhIC0tPgorICAgIDxtZXRhZGF0YSBrZXk9IkF1eElucHV0RmlsZXMiIHZhbD0iRmlsZTEudHh0LEZpbGUyLmRhdCxGaWxlMy54bWwiIHNwbGl0PSJ0cnVlIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IklzVGV4dCIgdmFsPSJ0cnVlLGZhbHNlLHRydWUiIHNwbGl0PSJ0cnVlIiAvPgorICAgIDxtZXRhZGF0YSBrZXk9IkNzdkhlYWRlciIgdmFsPSJBdXhJbnB1dEZpbGVzLElzVGV4dCIgc3BsaXQ9InRydWUiIC8+CisJPC9jdXN0b21NZXRhZGF0YT4KKworPC9wZ2VDb25maWc+CmRpZmYgLS1naXQgYS8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1jb25maWcudm0gYi8wLjEwL3BnZS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1jb25maWcudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkZGM0MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcGdlL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWNvbmZpZy52bQpAQCAtMCwwICsxIEBACiskZW52LlVTRVIgV2VsY29tZXMgdG8gJG1ldGFkYXRhLmNvbmZlcmVuY2UjZm9yZWFjaCgkbmFtZSBpbiAkbWV0YWRhdGEuZ2V0VmFsdWVzKCduYW1lJykpICRuYW1lI2VuZCEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3BvbS54bWwgYi8wLjEwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkZWI2OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcG9tLnhtbApAQCAtMCwwICsxLDEwNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Y29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5vb2R0PC9hcnRpZmFjdElkPgorICAgIDxuYW1lPkFwYWNoZSBPT0RUPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBBcGFjaGUgT09EVCBpcyBtaWRkbGV3YXJlIGZvciBtZXRhZGF0YS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHNjbT4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzI8L2Nvbm5lY3Rpb24+CisgICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyPC91cmw+CisgICAgPC9zY20+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y29tbW9uczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNsaTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBjcy9pbnB1dDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1ldGFkYXRhPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJvdG9jb2wvYXBpPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJvdG9jb2wvZnRwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJvdG9jb2wvaHR0cDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnByb3RvY29sL2ltYXBzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJvdG9jb2wvc2Z0cDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnhtbHF1ZXJ5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c3NvPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZmlsZW1ncjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNhdGFsb2c8L21vZHVsZT4gCisgICAgICAgIDxtb2R1bGU+d29ya2Zsb3c8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jcmF3bGVyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cmVzb3VyY2U8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jdXJhdG9yL3NlcnZpY2VzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y3VyYXRvci93ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wZ2U8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tdm4vcGx1Z2lucy9jYXMtaW5zdGFsbDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm12bi9hcmNoZXR5cGVzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHVzaHB1bGw8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wcm9kdWN0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJvZmlsZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmdyaWQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT54bWxwczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9wZW5kYXBwczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndlYmFwcC9jb21wb25lbnRzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+d2ViYXBwL2ZtYnJvd3NlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndlYmFwcC9mbXByb2Q8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53ZWJhcHAvd21vbml0b3I8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5hcHAvZm1icm93c2VyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+YXBwL3dlZGl0b3I8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wY3MvY29yZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBjcy9vcHN1aTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBjcy9zZXJ2aWNlczwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1VbmFwcHJvdmVkTGljZW5zZXM+MTE8L251bVVuYXBwcm92ZWRMaWNlbnNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3QvcG9tLnhtbCBiLzAuMTAvcHJvZHVjdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2IwZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3QvcG9tLnhtbApAQCAtMCwwICsxLDEyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LXByb2R1Y3Q8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+UHJvZHVjdCBTZXJ2aWNlPC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhlIFByb2R1Y3QgU2VydmljZSBwcm92aWRlcyBhY2Nlc3MgdG8gZGF0YSBwcm9kdWN0cy4gIFByb2R1Y3RzIGNhbiBiZQorICAgICAgICBzY2llbnRpZmljIGRhdGFzZXRzLCBpbWFnZXMsIGRvY3VtZW50cywgb3IgYW55dGhpbmcgd2l0aCBhbiBlbGVjdHJvbmljCisgICAgICAgIHJlcHJlc2VudGF0aW9uLiAgVGhlIFByb2R1Y3QgU2VydmljZSBhY2NlcHRzIHN0YW5kYXJkIHF1ZXJ5IGV4cHJlc3Npb25zIChzZWUKKyAgICAgICAgdGhlIFF1ZXJ5IEV4cHJlc3Npb24gY29tcG9uZW50KSBhbmQgcmV0dXJucyB6ZXJvIG9yIG1vcmUgbWF0Y2hpbmcgcHJvZHVjdHMuCisgICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcHJvZHVjdCBzZXJ2aWNlIGNhbiB0cmFuc2Zvcm0gcHJvZHVjdHMgZnJvbSBwcm9wcmlldGFyeQorICAgICAgICBmb3JtYXRzIGFuZCBpbnRvIEludGVybmV0IHN0YW5kYXJkIGZvcm1hdHMgb3IgcnVuIG90aGVyIHRyYW5zZm9ybWF0aW9ucywgYWxsCisgICAgICAgIHdpdGhvdXQgaW1wYWN0aW5nIGxvY2FsIHN0b3JlcyBvciBvcGVyYXRpb25zLgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPHNjbT4KKyAgIAkJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvcHJvZHVjdDwvY29ubmVjdGlvbj4KKyAgIAkJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvcHJvZHVjdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgIAkJPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjEwLXJjMi9wcm9kdWN0PC91cmw+CisgICAgPC9zY20+CisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9wcm9kdWN0PC90YXJnZXRQYXRoPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9jb25mPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5kaXNwbGF5YWJsZVR5cGVzLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmphci13aXRoLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b29kdC1jb21tb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpa2E8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50aWthLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vb2R0LXhtbHF1ZXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCSAgICA8ZGVwZW5kZW5jeT4KKwkgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKwkgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisJICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKwkgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2NvbmYvZGlzcGxheWFibGVUeXBlcy54bWwgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vY29uZi9kaXNwbGF5YWJsZVR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E5YWQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2NvbmYvZGlzcGxheWFibGVUeXBlcy54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KKzwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8IURPQ1RZUEUgZGlzcGxheWFibGVUeXBlcyBbDQorICA8IUVMRU1FTlQgZGlzcGxheWFibGVUeXBlcyAodHlwZSopPg0KKyAgPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpPg0KK10+DQorPGRpc3BsYXlhYmxlVHlwZXM+DQorICA8dHlwZT50ZXh0L3BsYWluPC90eXBlPg0KKyAgPHR5cGU+dGV4dC9yaWNodGV4dDwvdHlwZT4NCisgIDx0eXBlPnRleHQvZW5yaWNoZWQ8L3R5cGU+DQorICA8dHlwZT50ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzPC90eXBlPg0KKyAgPHR5cGU+dGV4dC9odG1sPC90eXBlPg0KKyAgPHR5cGU+dGV4dC94bWw8L3R5cGU+DQorICA8dHlwZT50ZXh0L3J0ZjwvdHlwZT4NCisgIDx0eXBlPm1lc3NhZ2UvcmZjODIyPC90eXBlPg0KKyAgPHR5cGU+bWVzc2FnZS9wYXJ0aWFsPC90eXBlPg0KKyAgPHR5cGU+bWVzc2FnZS9leHRlcm5hbC1ib2R5PC90eXBlPg0KKyAgPHR5cGU+bWVzc2FnZS9uZXdzPC90eXBlPg0KKyAgPHR5cGU+bWVzc2FnZS9odHRwPC90eXBlPg0KKyAgPHR5cGU+bWVzc2FnZS9kZWxpdmVyeS1zdGF0dXM8L3R5cGU+DQorICA8dHlwZT5tZXNzYWdlL2Rpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvbjwvdHlwZT4NCisgIDx0eXBlPm1lc3NhZ2Uvcy1odHRwPC90eXBlPg0KKyAgPHR5cGU+YXBwbGljYXRpb24vcnRmPC90eXBlPg0KKyAgPHR5cGU+YXBwbGljYXRpb24vcGRmPC90eXBlPg0KKyAgPHR5cGU+aW1hZ2UvanBlZzwvdHlwZT4NCisgIDx0eXBlPmltYWdlL2dpZjwvdHlwZT4NCisgIDx0eXBlPmltYWdlL3RpZmY8L3R5cGU+DQorICA8dHlwZT5pbWFnZS9wbmc8L3R5cGU+DQorICA8dHlwZT5hdWRpby9iYXNpYzwvdHlwZT4NCisgIDx0eXBlPmF1ZGlvLzMya2FkcGNtPC90eXBlPg0KKyAgPHR5cGU+YXVkaW8vbXBlZzwvdHlwZT4NCisgIDx0eXBlPnZpZGVvL21wZWc8L3R5cGU+DQorICA8dHlwZT52aWRlby9xdWlja3RpbWU8L3R5cGU+DQorICA8dHlwZT5tb2RlbC92cm1sPC90eXBlPg0KKzwvZGlzcGxheWFibGVUeXBlcz4NCmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vY29uZi9vZnNuLXBzLnhtbCBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9jb25mL29mc24tcHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTM5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vY29uZi9vZnNuLXBzLnhtbApAQCAtMCwwICsxLDIwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSAgCitDb25maWd1cmVzIGEgbmV3IE9PRFQgT0ZTTiBzdHlsZSBwcm9kdWN0IHNlcnZlci4gVGhpcyBpcyBhIHByb2R1Y3Qgc2VydmVyCitvZiB0aGUgZm9ybToKKworaHR0cDovL2hvc3Qvd2ViZ3JpZC9wcm9kP09GU049L3NvbWUvb2ZzbitBTkQrUlQ9c29tZXR5cGUKKworT0ZTTiBpcyBhbiBvbmxpbmUgZmlsZSBzcGVjaWZpY2F0aW9uIG5hbWUsIGFzIGRlZmluZWQgYnkgdGhlIFBEUyBzdGFuZGFyZHMuCitSVCBpcyBhIHRyYW5zZm9ybWF0aW9uIGlkZW50aWZpZXIsIGlkZW50aWZ5aW5nIGEgcmVtb3RlIHRyYW5zZm9ybWF0aW9uIHRvIGJlIGFwcGxpZWQKK2F0IHRoZSBnaXZlbiBPRlNOIHBhdGguCisKK01vcmUgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgT0ZTTiBzdHlsZSBwcm9kdWN0IHNlcnZlcnMsIHNlZSB0aGUgUERTIG9yaWdpbmFsIGhlcmU6CisKK2h0dHA6Ly9vb2R0L3Bkcy1jbGllbnQvZ3VpZGUvcHJvZHVjdAorICAgCitSZXF1aXJlZCBhdHRyaWJ1dGVzOgorICAgaWQ6IGRlZmluZXMgYSB1bmlxdWUgVVJOL2lkIGZvciB0aGlzIHByb2R1Y3Qgc2VydmVyIGluc3RhbmNlCisgICBuYW1lOiBkZWZpbmVzIGEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBwcm9kdWN0IHNlcnZlciBpbnN0YW5jZQorICAgcHJvZHVjdFJvb3Q6IGRlZmluZXMgdGhlIHJvb3QgcGF0aCBpbiB3aGljaCB0aGUgT0ZTTiBwcm9kdWN0IHNlcnZlciBzaG91bGQgc3RhcnQgbG9va2luZyBmb3IgCisgICBwYXRocyBiYXNlZCBvbiBhIGdpdmVuIE9GU04KKworRklYTUU6IENoYW5nZSBYTUwgbmFtZXNwYWNlIFVSSSBmb3Igb29kdCBwcmVmaXg/CistLT4KKzxvb2R0Om9mc24geG1sbnM6b29kdD0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292L3htbC9uYW1lc3BhY2VzL29vZHQvMS4wIgorICAgICAgaWQ9InVybjpvb2R0OnByb2Q6b2ZzbiIKKyAgICAgIG5hbWU9Ik9PRFQgT0ZTTiBTdHlsZSBQcm9kdWN0IEhhbmRsZXIiCisgICAgICBwcm9kdWN0Um9vdD0iL3NvbWUvcGF0aCIKKyAgICAgID4KKyAgICAgIAorICA8IS0tICBkZWZpbmVzIGEgbmV3IE9GU04gaGFuZGxlci4gVGhlcmUgYXJlIDIgdmFsaWQgdHlwZXM6CisgICAgIAorICAgICBsaXN0aW5nOiB0aGlzIHR5cGUgZ2VuZXJhdGVzIGEgbGlzdCBvZiBmaWxlcyBnaXZlbiBhbiBPRlNOLiBUaGUgbGlzdCB3aWxsIAorICAgICBiZSByZXR1cm5lZCBhbmQgZm9ybWF0dGVkIGluIFhNTCBmb3IgZWFzeSBwYXJzaW5nLgorICAgICAKKyAgICAgZ2V0OiB0aGlzIHR5cGUgcmV0dXJucyB0aGUgYml0cyBvZiB0aGUgcmVxdWVzdGVkIG9mc24sIGFmdGVyIHBlcmZvcm1pbmcgc29tZQorICAgICB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIG9uIHRoZW0uCisgICAgIAorICAgICBSZXF1aXJlZCBhdHRyaWJ1dGVzOgorICAgICAKKyAgICAgbmFtZTogZ2l2ZXMgdGhlIGhhbmRsZXIgdHlwZSBhIGlkZW50aWZpYWJsZSBuYW1lLiBUaGlzIHNob3VsZCBiZSBhIHZhbGlkIFJUIG5hbWUgZm9yIHVzZSBpbiB0aGUgT09EVAorICAgICBwcm9kdWN0IHNlcnZlciBxdWVyeSwgZS5nLiwgaWYgeW91IHdhbnQgdGhlIGRpciBsaXN0IG5vbi1yZWN1cnNpdmUgbGlzdGluZyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiAKKyAgICAgUlQ9RElSTElTVDEsIHRoZW4gc2V0IG5hbWUgdG8gIkRJUkxJU1QxIiwgYXMgYmVsb3cuCisgICAgIAorICAgICB0eXBlOiBlaXRoZXIgbGlzdGluZywgb3IgZ2V0LCBkZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgaGFuZGxlciB0eXBlLgorICAgICAKKyAgICAgY2xhc3M6IGRlZmluZXMgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgZWl0aGVyIHRoZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05MaXN0SGFuZGxlcgorICAgICBpbnRlcmZhY2UgKGZvciAibGlzdGluZyIgaGFuZGxlcnMpLCBvciB0aGUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOR2V0SGFuZGxlciAoZm9yCisgICAgICJnZXQiIGhhbmRsZXJzKS4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgbXVzdCBiZSBvbiB0aGUgY2xhc3NwYXRoIGluIG9yZGVyIGZvciBpdCB0byBiZSByZWZlcmVuY2VkIGluCisgICAgIHRoaXMgY29uZmlndXJhdGlvbi4KKyAgCisgICAtLT4KKyAgIAorICAgPCEtLSAKKyAgICAgT3B0aW9uYWxseSwgZWFjaCBoYW5kbGVyIGNhbiBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiwgc3BlY2lmaWVkIG9uIHRoZSBmb3JtIG9mCisgICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7c29tZSBuYW1lJnF1b3Q7IHZhbHVlPSZxdW90O3NvbWUgdmFsdWUmcXVvdDsvJmd0OworICAgICAgIAorICAgICAgIHdoZXJlIHNvbWUgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhbmQgc29tZSB2YWx1ZSBpcyB0aGUKKyAgICAgICB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KKyAgICAgICAKKyAgICAgICBPcHRpb25hbCBwcm9wZXJ0aWVzIChmb3IgR0VUIGhhbmRsZXJzKToKKyAgICAgICAKKyAgICAgICBwcm9wZXJ0eSBuYW1lOiBtaW1lVHlwZQorICAgICAgIHByb3BlcnR5IHZhbHVlOiB0aGUgZGVzaXJlZCBNSU1FIHR5cGUgKGFsc28gcmVmZXJyZWQgdG8gYXMgY29udGVudC10eXBlKSBhIGhhbmRsZXIgc2hvdWxkIHJldHVybgorICAgICAgIGNvbnRlbnQgYXMgKGVnLiAidGV4dC9wbGFpbiIpLiBNb3JlIGZvcm1hbGx5LCBhbnkgdmFsdWUgb2YgdGhlIGZvcm0gCisgICAgICAgInR5cGUvc3VidHlwZSg7IHBhcmFtZXRlcj0uLi4pKiIgYXMgZGVmaW5lZCBpbiBSRkMgMjA0NS4KKyAgICAtLT4KKyAgICAKKyAgICAgICAgCisgICA8IS0tIAorICAgVGhlIERJUkxJU1QxIHR5cGUgaXMgaWRlbnRpY2FsIHRvIERJUkxJU1QgYnV0IGRvZXMgbm90IHJlY3Vyc2l2ZWx5CisgICBkZXNjZW5kIGludG8gc3ViZGlyZWN0b3JpZXMuCisgICAtLT4KKyAgPGhhbmRsZXIgbmFtZT0iRElSTElTVDEiIHR5cGU9Imxpc3RpbmciIAorICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLkRpckxpc3ROb25SZWN1cnNpdmVIYW5kbGVyIi8+CisgICAgICAgCisgICAgICAgCisgIDwhLS0gCisgICAgVGhlIERJUkxJU1QgdHlwZSByZXR1cm5zIGFuIFhNTCBmaWxlIHdpdGggZGlyZWN0b3J5IG5hbWVzIChhbmQgb25seQorICAgIGRpcmVjdG9yeSBuYW1lcykgYW5kIHRvdGFsIHNpemUgb2YgZmlsZXMgaW4gZWFjaCBkaXJlY3Rvcnkgc3RhcnRpbmcgaW4KKyAgICB0aGUgcmVxdWVzdGVkIGRpcmVjdG9yeSBhbmQgdHJhdmVyc2luZyBpbnRvIHRoZSBzdWJkaXJlY3Rvcmllcy4gCisgICAtLT4KKyAgPGhhbmRsZXIgbmFtZT0iRElSTElTVCIgdHlwZT0ibGlzdGluZyIKKyAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5EaXJMaXN0UmVjdXJzaXZlSGFuZGxlciIvPgorICAgIAorCisgIDwhLS0gCisgICAgVGhlIERJUkZJTEVMSVNUMSBpcyBpZGVudGljYWwgdG8gRElSRklMRUxJU1QgZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QKKyAgICByZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMuCisgICAtLT4KKyAgPGhhbmRsZXIgbmFtZT0iRElSRklMRUxJU1QxIiB0eXBlPSJsaXN0aW5nIgorICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLkZpbGVMaXN0Tm9uUmVjdXJzaXZlSGFuZGxlciIvPgorCisgIDwhLS0gCisgICAgVGhlIERJUkZJTEVMSVNUIHJldHVybnMgYW4gWE1MIGRvY3VtZW50IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBmaWxlbmFtZXMKKyAgICAoYW5kIG9ubHkgdGhlIGZpbGVzLCBub3QgZGlyZWN0b3JpZXMpIGFuZCB0aGVpciBzaXplcywgcmVjdXJzaW5nIGludG8KKyAgICBzdWJkaXJlY3Rvcmllcy4gIAorICAgLS0+ICAgICAgICAgIAorICA8aGFuZGxlciBuYW1lPSJESVJGSUxFTElTVCIgdHlwZT0ibGlzdGluZyIKKyAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5GaWxlTGlzdFJlY3Vyc2l2ZUhhbmRsZXIiLz4KKworICA8IS0tIAorICAgIFRoZSAgUkFXX1NJWkUgIGdlbmVyYXRlcyBhbiBYTUwgZG9jdW1lbnQgdGVsbGluZyB0aGUgc2l6ZSBvZiB0aGUgcmF3IGZpbGUgdGhhdCAKKyAgICB3b3VsZCBiZSByZXR1cm5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBSQVcgdHlwZS4gIAorICAgLS0+ICAgICAKKyAgPGhhbmRsZXIgbmFtZT0iUkFXX1NJWkUiIHR5cGU9Imxpc3RpbmciCisgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uUmF3U2l6ZUxpc3RIYW5kbGVyIj4KKyAgICAgCisgICAgIDwhLS0gCisgICAgICAgUmVxdWlyZWQgYXR0cmlidXRlczoKKyAgICAgICAgICBpc1NpemVDbWQ6IHRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIGluIHRoaXMgaGFuZGxlciB0byBlbnN1cmUgdGhhdAorICAgICAgICAgIG9ubHkgdGhlIHNpemUgaXMgcHJpbnRlZCBpbiB0aGUgT0ZTTiBkb2MuCisgICAgICAtLT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImlzU2l6ZUNtZCIgdmFsdWU9InRydWUiLz4KKyAgPC9oYW5kbGVyPgorCisgICA8IS0tIAorICAgIFRoZSBGSUxFTElTVCB0eXBlIHJldHVybnMgYW4gWE1MIGZpbGUgbmFtaW5nIHRoZSByZXF1ZXN0ZWQgZmlsZSBhbmQgYWxzbworICAgIGdpdmluZyBpdHMgc2l6ZS4gICAKKyAgIC0tPgorICA8aGFuZGxlciBuYW1lPSJGSUxFX0xJU1QiIHR5cGU9Imxpc3RpbmciCisgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uU2luZ2xlRmlsZUxpc3RIYW5kbGVyIi8+CisgICAgCisgCisgIDwhLS0gCisgICAgVGhlIEZJTEVMSVNUWklQIGlzIHNpbWlsYXIgdG8gRklMRUxJU1QgZXhjZXB0IHRoYXQgaXQgdGVsbHMgd2hhdCB0aGUgc2l6ZQorICAgIG9mIHRoZSByZXF1ZXN0ZWQgZmlsZSB3b3VsZCBiZSBpZiBjb21wcmVzc2VkIGludG8gYSBaSVAgYXJjaGl2ZS4gIAorICAtLT4gICAKKyAgPGhhbmRsZXIgbmFtZT0iRklMRV9MSVNUX1pJUCIgdHlwZT0ibGlzdGluZyIKKyAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5TaW5nbGVaaXBGaWxlTGlzdEhhbmRsZXIiPgorICAgICAgIAorICAgICAgIDwhLS0gCisgICAgICAgIE9wdGlvbmFsIGF0dHJpYnV0ZXM6CisgICAgICAgICAgY2FjaGVEaXJSb290OiBkZWZpbmVzIHRoZSBjYWNoZSBkaXIgdGhhdCB0aGUgcHJvZHVjdCBzZXJ2ZXIgc2hvdWxkIHVzZSB3aGVuIGFza2VkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkKKyAgICAgICAgICBmaWxlcywgZS5nLiwgYnkgYSBsaXN0aW5nIG9yIGdldCBoYW5kbGVyLiBCeSBkZWZhdWx0LCBpZiBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byAvdG1wCisgICAgICAgCisgICAgICAgIC0tPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZURpclJvb3QiIHZhbHVlPSIvdG1wIi8+ICAgICAgIAorICA8L2hhbmRsZXI+CisKKyAgPCEtLSAKKyAgICBUaGUgUkFXIHR5cGUgbWVyZWx5IHJldHVybnMgdGhlIHJlcXVlc3RlZCBmaWxlIHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbiAKKyAgICAoTUlNRSB0eXBlIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSApLiAKKyAgLS0+ICAKKyAgPGhhbmRsZXIgbmFtZT0iUkFXIiB0eXBlPSJnZXQiCisgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uU3RkT0ZTTkdldEhhbmRsZXIiLz4gICAgICAgCisgICAgICAgCisgIAorICA8IS0tICAKKyAgICBUaGUgTUQ1IHR5cGUgcmV0dXJucyBhbiBNRDUgaGFzaCBvZiB0aGUgZmlsZSBieXRlcyBnZW5lcmF0ZWQgb24gdGhlIHNlcnZlciBzaWRlLgorICAgLS0+CisgICAKKyAgIDxoYW5kbGVyIG5hbWU9Ik1ENSIgdHlwZT0iZ2V0IgorICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk1ENUdldEhhbmRsZXIiPgorICAgICAgIAorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW1lVHlwZSIgdmFsdWU9InRleHQvcGxhaW4iLz4KKyAgICAgICAKKyAgIDwvaGFuZGxlcj4KKworCisgIDwhLS0gIAorICAgIFRoZSBVUkwgdHlwZSByZXR1cm5zIGEgVVJMIGxpc3RpbmcgcG9pbnRpbmcgdG8gZmlsZXMgd2l0aGluIGFuIE9GU04KKyAgICAKKyAgICAoT3B0aW9uYWwpIFVzZSB0aGUgYmVsb3cgcHJvcGVydGllcyB0byBjdXN0b21pemUgdGhlIGNvbnN0cnVjdGVkIFVSTCByZXR1cm5lZDoKKyAgICAgICAgMS4gcHJvZFNlcnZlckhvc3RuYW1lOiB0aGUgcHJvZHVjdCBzZXJ2ZXIgaG9zdG5hbWUKKyAgICAgICAgMi4gcHJvZFNlcnZlclBvcnQ6IHRoZSBwcm9kdWN0IHNlcnZlcidzIHBvcnQKKyAgICAgICAgMy4gcHJvZFNlcnZlckNvbnRleHRSb290OiB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBzZXJ2ZXIgd2ViYXBwCisgICAgICAgIDQuIHByb2R1Y3RSb290OiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2R1Y3Qgc2VydmVyIC0gaWRlbnRpY2FsCisgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcm9vdCBkaXJlY3RvcnkgYXQgdGhlIHRvcCBvZiB0aGlzIFhNTCBmaWxlCisgICAgICAgIDUuIHJldHVyblR5cGU6IHRoZSBkZXNpcmVkIHJldHVybiB0eXBlLiBpLmUuIFJBVywgTUQ1LCBldGMuCisgICAtLT4KKyAgPGhhbmRsZXIgbmFtZT0iVVJMIiB0eXBlPSJnZXQiCisgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uVVJMR2V0SGFuZGxlciI+CisgICAgICAgCisgICAgICAgPCEtLSB0aGUgYmVsb3cgdmFsdWVzIGFyZSB0aGUgZGVmYXVsdCBpZiBub3RoaW5nIHNwZWNpZmllZAorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9kU2VydmVySG9zdG5hbWUiIHZhbHVlPSJsb2NhbGhvc3QiLz4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvZFNlcnZlclBvcnQiIHZhbHVlPSI4MDgwIi8+CisgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2RTZXJ2ZXJDb250ZXh0Um9vdCIgdmFsdWU9IndlYi1ncmlkIi8+CisgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2R1Y3RSb290IiB2YWx1ZT0iL3NvbWUvcGF0aCIvPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXR1cm5UeXBlIiB2YWx1ZT0iUkFXIi8+CisgICAgICAgLS0+CisgIAkgICAKKyAgICAgICA8cHJvcGVydHkgbmFtZT0ibWltZVR5cGUiIHZhbHVlPSJ0ZXh0L3BsYWluIi8+CisgIAkgICAKKyAgPC9oYW5kbGVyPgorPC9vb2R0Om9mc24+CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L0xhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGVhZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCisvKioKKyAqIEhhbmRsZSByZXF1ZXN0cyBmb3IgcHJvZHVjdHMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGZpdCBpbiBhbiB7QGxpbmsKKyAqIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeX0gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjEuMSAkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHsKKwkvKioKKwkgKiBSZXRyaWV2ZSBhIGNodW5rIG9mIGEgcHJvZHVjdC4KKwkgKgorCSAqIFRoZSBwcm9kdWN0IGlzIGlkZW50aWZpZWQgYnkgYSBzdHJpbmcgSUQuICBUaGUgcXVlcnkgaGFuZGxlciBzaG91bGQgcmV0dXJuIGEKKwkgKiBiaW5hcnkgY2h1bmsgb2YgdGhlIHByb2R1Y3QgdXNpbmcgdGhlIGdpdmVuIG9mZnNldCBhbmQgbGVuZ3RoLiAgSWYgdGhlIElEIGlzbid0CisJICogcmVjb2duaXplZCwgaXQgc2hvdWxkIHJldHVybiBudWxsLiAgSXQgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpZiByZXRyaWV2YWwKKwkgKiBmYWlscyBmb3Igc29tZSByZWFzb24uCisJICoKKwkgKiBAcGFyYW0gaWQgUHJvZHVjdCBJRC4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIGluIHRoZSBwcm9kdWN0IHRvIGdldCBhIGNodW5rIG9mIGl0LgorCSAqIEBwYXJhbSBsZW5ndGggSG93IG11Y2ggb2YgdGhlIHByb2R1Y3QgdG8gZ2V0LgorCSAqIEByZXR1cm4gQSBjaHVuaywgb3IgbnVsbCBpZiB0aGUgPHZhcj5pZDwvdmFyPiBpcyB1bmtub3duLgorCSAqIEB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJYnl0ZVtdIHJldHJpZXZlQ2h1bmsoU3RyaW5nIGlkLCBsb25nIG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb247CisKKwkvKioKKwkgKiBDbG9zZSBvZmYgYSBwcm9kdWN0LgorCSAqCisJICogVGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIHByb2R1Y3QgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZCBpdHMgcmVzb3VyY2VzCisJICogY2FuIGJlIGZyZWVkIGJ5IHRoZSBxdWVyeSBoYW5kbGVyLiAgSWYgdGhlIElEIGlzIHVua25vd24sIG5vIHVudG93YXJkIGFjdGlvbiBpcworCSAqIHJlcXVpcmVkLiAgSXQgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlCisJICogcmVzb3VyY2UgcmVsZWFzZSAoc3VjaCBhcyBhbiB7QGxpbmsgamF2YS5pby5JT0V4Y2VwdGlvbn0gd2hlbiBjbG9zaW5nIGEgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBpZCBQcm9kdWN0IElELgorCSAqIEB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJdm9pZCBjbG9zZShTdHJpbmcgaWQpIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvUXVlcnlIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9RdWVyeUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRkYmNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvUXVlcnlIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworLyoqCisgKiBIYW5kbGVyIGZvciBxdWVyaWVzIGluIGEgcHJvZHVjdCBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjEuMSAkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlIYW5kbGVyIHsKKwkvKioKKwkgKiBSdW4gYSBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBxIFRoZSBxdWVyeS4KKwkgKiBAcmV0dXJuIFRoZSByZXNwb25zZS4KKwkgKiBAdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCVhNTFF1ZXJ5IHF1ZXJ5KFhNTFF1ZXJ5IHEpIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9BYnN0cmFjdENyYXdsTGlzdGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL0Fic3RyYWN0Q3Jhd2xMaXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDlkY2JkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9BYnN0cmFjdENyYXdsTGlzdGVyLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CisKKy8qKgorICogCisgKiBBbiBhYnN0cmFjdCB7QGxpbmsgT0ZTTkxpc3RIYW5kbGVyfSBmb3IgZ2VuZXJhdGluZyBmaWxlIGxpc3RzIGJhc2VkIG9uIHR3bworICogc2ltcGxlIGZsYWdzOiByZWN1cnNlLCBhbmQgY3Jhd2xGb3JEaXJzLCBpbmRpY2F0aW5nIHRvIGNyYXdsIGZvciBkaXJlY3RvcmllcworICogcmF0aGVyIHRoYW4gZmlsZXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcmF3bExpc3RlciBpbXBsZW1lbnRzIE9GU05MaXN0SGFuZGxlciB7CisKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEFic3RyYWN0Q3Jhd2xMaXN0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZpbGVGaWx0ZXIgRklMRV9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgeworICAgICAgaWYgKHBhdGhuYW1lLmlzRmlsZSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGaWxlRmlsdGVyIERJUl9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgeworICAgICAgaWYgKHBhdGhuYW1lLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uT0ZTTkxpc3RIYW5kbGVyI2NvbmZpZ3VyZShqYXZhLgorICAgKiB1dGlsLlByb3BlcnRpZXMpCisgICAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBjb25mKTsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uT0ZTTkxpc3RIYW5kbGVyI2dldExpc3RpbmcoamF2YQorICAgKiAubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgRmlsZVtdIGdldExpc3RpbmcoU3RyaW5nIG9mc24pIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uOworCisgIHByb3RlY3RlZCBGaWxlW10gY3Jhd2xGaWxlcyhGaWxlIGRpclJvb3QsIGJvb2xlYW4gcmVjdXIsCisgICAgICBib29sZWFuIGNyYXdsRm9yRGlycykgeworICAgIGlmIChkaXJSb290ID09IG51bGwgfHwgKChkaXJSb290ICE9IG51bGwgJiYgIWRpclJvb3QuZXhpc3RzKCkpKSkKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRpciByb290OiBbIiArIGRpclJvb3QKKyAgICAgICAgICArICJdIGlzIG51bGwgb3Igbm9uIGV4aXN0YW50ISIpOworCisgICAgTGlzdDxGaWxlPiBmaWxlTGlzdCA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKKworICAgIC8vIHN0YXJ0IGNyYXdsaW5nCisgICAgU3RhY2s8RmlsZT4gc3RhY2sgPSBuZXcgU3RhY2s8RmlsZT4oKTsKKyAgICBzdGFjay5wdXNoKGRpclJvb3QuaXNEaXJlY3RvcnkoKSA/IGRpclJvb3QgOiBkaXJSb290LmdldFBhcmVudEZpbGUoKSk7CisgICAgd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgIEZpbGUgZGlyID0gKEZpbGUpIHN0YWNrLnBvcCgpOworICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiT0ZTTjogQ3Jhd2xpbmcgIiArIGRpcik7CisKKyAgICAgIEZpbGVbXSBwcm9kdWN0RmlsZXMgPSBudWxsOworICAgICAgaWYgKGNyYXdsRm9yRGlycykgeworICAgICAgICBwcm9kdWN0RmlsZXMgPSBkaXIubGlzdEZpbGVzKERJUl9GSUxURVIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvZHVjdEZpbGVzID0gZGlyLmxpc3RGaWxlcyhGSUxFX0ZJTFRFUik7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvZHVjdEZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGZpbGVMaXN0LmFkZChwcm9kdWN0RmlsZXNbal0pOworICAgICAgfQorCisgICAgICBpZiAocmVjdXIpIHsKKyAgICAgICAgRmlsZVtdIHN1YmRpcnMgPSBkaXIubGlzdEZpbGVzKERJUl9GSUxURVIpOworICAgICAgICBpZiAoc3ViZGlycyAhPSBudWxsKQorICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViZGlycy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgIHN0YWNrLnB1c2goc3ViZGlyc1tqXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZpbGVMaXN0LnRvQXJyYXkobmV3IEZpbGVbZmlsZUxpc3Quc2l6ZSgpXSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9EaXJMaXN0Tm9uUmVjdXJzaXZlSGFuZGxlci5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9EaXJMaXN0Tm9uUmVjdXJzaXZlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWJiNGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL0Rpckxpc3ROb25SZWN1cnNpdmVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CisKKy8qKgorICogCisgKiBHZW5lcmF0ZXMgYSBkaXJlY3RvcnkgbGlzdGluZywgd2l0aG91dCByZWN1cnNpbmcgaW50byB0aGUgT0ZTTiBwYXRoLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIERpckxpc3ROb25SZWN1cnNpdmVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDcmF3bExpc3RlciB7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05MaXN0SGFuZGxlciNnZXRMaXN0aW5nKGphdmEKKyAgICogLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIEZpbGVbXSBnZXRMaXN0aW5nKFN0cmluZyBvZnNuKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgIHJldHVybiBjcmF3bEZpbGVzKG5ldyBGaWxlKG9mc24pLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uT0ZTTkxpc3RIYW5kbGVyI2NvbmZpZ3VyZShqYXZhLgorICAgKiB1dGlsLlByb3BlcnRpZXMpCisgICAqLworICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBjb25mKSB7CisgICAgIC8vIG5vIHByb3BlcnRpZXMgZGVmaW5lZCB5ZXQKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL0Rpckxpc3RSZWN1cnNpdmVIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL0Rpckxpc3RSZWN1cnNpdmVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkZDRlYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vRGlyTGlzdFJlY3Vyc2l2ZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUHJvZHVjdEV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEdlbmVyYXRlcyBhIGRpcmVjdG9yeSBsaXN0aW5nLCByZWN1cnNpbmcgaW50byB0aGUgT0ZTTiBwYXRoLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIERpckxpc3RSZWN1cnNpdmVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDcmF3bExpc3RlciB7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLkFic3RyYWN0Q3Jhd2xMaXN0ZXIjY29uZmlndXJlKGphdmEKKyAgICogLnV0aWwuUHJvcGVydGllcykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBjb25mKSB7CisgICAgLy8gbm8gcHJvcGVydGllcyB5ZXQKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLkFic3RyYWN0Q3Jhd2xMaXN0ZXIjZ2V0TGlzdGluZygKKyAgICogamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgRmlsZVtdIGdldExpc3RpbmcoU3RyaW5nIG9mc24pIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY3Jhd2xGaWxlcyhuZXcgRmlsZShvZnNuKSwgdHJ1ZSwgdHJ1ZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9GaWxlTGlzdE5vblJlY3Vyc2l2ZUhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vRmlsZUxpc3ROb25SZWN1cnNpdmVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4Y2ZlYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vRmlsZUxpc3ROb25SZWN1cnNpdmVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CisKKy8qKgorICoKKyAqIEEgbm9uIHJlY3Vyc2l2ZSBmaWxlIGxpc3RpbmcgZnJvbSBhIGdpdmVuIE9GU04uCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEZpbGVMaXN0Tm9uUmVjdXJzaXZlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q3Jhd2xMaXN0ZXIgeworCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05MaXN0SGFuZGxlciNjb25maWd1cmUoamF2YS51dGlsLlByb3BlcnRpZXMpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgY29uZikgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAvLyBub3RoaW5nIHlldAorCisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOTGlzdEhhbmRsZXIjZ2V0TGlzdGluZyhqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBGaWxlW10gZ2V0TGlzdGluZyhTdHJpbmcgb2ZzbikgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIHJldHVybiBjcmF3bEZpbGVzKG5ldyBGaWxlKG9mc24pLCBmYWxzZSwgZmFsc2UpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vRmlsZUxpc3RSZWN1cnNpdmVIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL0ZpbGVMaXN0UmVjdXJzaXZlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDM0OTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL0ZpbGVMaXN0UmVjdXJzaXZlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5Qcm9kdWN0RXhjZXB0aW9uOworCisvKioKKyAqCisgKiBBIHJlY3Vyc2l2ZSBmaWxlIGxpc3RpbmcgZnJvbSB0aGUgcHJvdmlkZWQgb2Zzbi4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgRmlsZUxpc3RSZWN1cnNpdmVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDcmF3bExpc3RlciB7CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uQWJzdHJhY3RDcmF3bExpc3RlciNjb25maWd1cmUoamF2YS51dGlsLlByb3BlcnRpZXMpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgY29uZikgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAvLyBub3RoaW5nIHlldAorICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uQWJzdHJhY3RDcmF3bExpc3RlciNnZXRMaXN0aW5nKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIEZpbGVbXSBnZXRMaXN0aW5nKFN0cmluZyBvZnNuKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyYXdsRmlsZXMobmV3IEZpbGUob2ZzbiksIHRydWUsIGZhbHNlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL01ENUdldEhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vTUQ1R2V0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWUzZGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL01ENUdldEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkhleDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CisKKy8qKgorICogCisgKiBBIHtAbGluayBPRlNOR2V0SGFuZGxlcn0gdG8gcGVyZm9ybSBhbiBNRDUgZm9yIGEgZmlsZSBvbiB0aGUgc2VydmVyIHNpZGUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTUQ1R2V0SGFuZGxlciBpbXBsZW1lbnRzIE9GU05HZXRIYW5kbGVyIHsKKworICBwcml2YXRlIE1lc3NhZ2VEaWdlc3QgbWQgPSBudWxsOworCisgIHB1YmxpYyBNRDVHZXRIYW5kbGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB0aGlzLm1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05MaXN0SGFuZGxlciNjb25maWd1cmUoamF2YS4KKyAgICogdXRpbC5Qcm9wZXJ0aWVzKQorICAgKi8KKyAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgY29uZikgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05HZXRIYW5kbGVyI3JldHJpZXZlQ2h1bmsoamF2YQorICAgKiAubGFuZy5TdHJpbmcsIGxvbmcsIGludCkKKyAgICovCisgIHB1YmxpYyBieXRlW10gcmV0cmlldmVDaHVuayhTdHJpbmcgZmlsZXBhdGgsIGxvbmcgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBTdHJpbmcgaGFzaCA9IHRoaXMuaGFzaERhdGEoRmlsZVV0aWxzLnJlYWRGaWxlVG9CeXRlQXJyYXkobmV3IEZpbGUoCisgICAgICAgICAgZmlsZXBhdGgpKSk7CisgICAgICBieXRlW10gcmV0Qnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgYnl0ZVtdIGhhc2hCeXRlcyA9IGhhc2guZ2V0Qnl0ZXMoKTsgICAgICAKKyAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGhhc2hCeXRlcyk7CisgICAgICBpcy5za2lwKG9mZnNldCk7CisgICAgICBpcy5yZWFkKHJldEJ5dGVzLCAwLCBsZW5ndGgpOworICAgICAgcmV0dXJuIHJldEJ5dGVzOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyBieXRlcyBmcm9tIGZpbGU6IFsiICsgZmlsZXBhdGgKKyAgICAgICAgICArICJdIE1ENTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uT0ZTTkdldEhhbmRsZXIjc2l6ZU9mKGphdmEubGFuZworICAgKiAuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIGxvbmcgc2l6ZU9mKFN0cmluZyBmaWxlcGF0aCkgeworICAgIHRyeSB7CisgICAgICBTdHJpbmcgaGFzaCA9IHRoaXMuaGFzaERhdGEoRmlsZVV0aWxzLnJlYWRGaWxlVG9CeXRlQXJyYXkobmV3IEZpbGUoCisgICAgICAgICAgZmlsZXBhdGgpKSk7CisgICAgICByZXR1cm4gaGFzaC5nZXRCeXRlcygpLmxlbmd0aDsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2UgdGhpcyBtZXRob2Qgb3QgZ2VuZXJhdGUgYSB0ZXN0IE1ENSBvZiBhIHByb3ZpZGUge0BsaW5rIEZpbGV9IHNwZWNpZmllZAorICAgKiBpbiBhcmdzWzBdLgorICAgKiAKKyAgICogQHBhcmFtIGFyZ3MKKyAgICogICAgICAgICAgT25seSBuZWVkIHRvIHNwZWNpZnkgMSBhcmcsIHRoZSBmdWxsIHBhdGggdG8gdGhlIHtAbGluayBGaWxlfSB0bworICAgKiAgICAgICAgICBNRDUuCisgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTUQ1R2V0SGFuZGxlciA8ZmlsZT4iKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKworICAgIFN0cmluZyBmaWxlcGF0aCA9IGFyZ3NbMF07CisgICAgU3RyaW5nIGhhc2hTdHJpbmcgPSBuZXcgTUQ1R2V0SGFuZGxlcigpLmhhc2hEYXRhKEZpbGVVdGlscworICAgICAgICAucmVhZEZpbGVUb0J5dGVBcnJheShuZXcgRmlsZShmaWxlcGF0aCkpKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oaGFzaFN0cmluZyk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBoYXNoRGF0YShieXRlW10gZGF0YVRvSGFzaCkgeworICAgIHRoaXMubWQudXBkYXRlKGRhdGFUb0hhc2gsIDAsIGRhdGFUb0hhc2gubGVuZ3RoKTsKKyAgICBieXRlW10gaGFzaCA9IHRoaXMubWQuZGlnZXN0KCk7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoSGV4LmVuY29kZUhleChoYXNoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9PRlNORmlsZUhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkZpbGVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmZDFmNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkZpbGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NaW1lVHlwZXNGYWN0b3J5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLm1ldGFkYXRhLk9GU05NZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24ubWV0YWRhdGEuT0ZTTlhNTENvbmZpZ01ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5tZXRhZGF0YS5PRlNOWE1MTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLm1ldGFkYXRhLlhNTFF1ZXJ5TWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLnV0aWwuT0ZTTk9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi51dGlsLk9GU05VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUHJvZHVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuTGFyZ2VSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CisKKy8qKgorICogCisgKiBBbiBleHRlbnNpYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQRFMtaW5zcGlyZWQgT25saW5lIEZpbGUgU3BlY2lmaWNhdGlvbgorICogTmFtZSAoT0ZTTikgc3R5bGUgcHJvZHVjdCBzZXJ2ZXIuIFNlZSB0aGUgb2Zzbi1wcy54bWwgZmlsZSBmb3IgYSBkZXRhaWxlZAorICogc3BlY2lmaWNhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBhbmQgbW90aXZhdGlvbiBiZWhpbmQgdGhpcyBwcm9kdWN0CisgKiBoYW5kbGVyLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBPRlNORmlsZUhhbmRsZXIgaW1wbGVtZW50cyBMYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIsCisgICAgWE1MUXVlcnlNZXRLZXlzLCBPRlNOWE1MTWV0S2V5cywgT0ZTTk1ldEtleXMsIE9GU05YTUxDb25maWdNZXRLZXlzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihPRlNORmlsZUhhbmRsZXIuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfU0VQQVJBVE9SID0gIjsiOworCisgIC8vIGJ5IGRlZmF1bHQgcmV0dXJuIGRpciBzaXplIG9uIGxpc3RpbmcgY29tbWFuZHMKKyAgcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVEaXJTaXplID0gdHJ1ZTsKKyAgCisgIC8vIGJ5IGRlZmF1bHQgcmV0dXJuIGZpbGUgc2l6ZSBvbiBsaXN0aW5nIGNvbW1hbmRzCisgIHByaXZhdGUgYm9vbGVhbiBjb21wdXRlRmlsZVNpemUgPSB0cnVlOworCisgIHByaXZhdGUgT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvbiBjb25mOworCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gSEFORExFUl9DQUNIRTsKKworICBwdWJsaWMgT0ZTTkZpbGVIYW5kbGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIC8vIGluaXQgY29uZiBoZXJlCisgICAgU3RyaW5nIHhtbENvbmZpZ0ZpbGVQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KE9GU05fWE1MX0NPTkZfRklMRV9LRVkpOworICAgIHRoaXMuY29tcHV0ZURpclNpemUgPSBCb29sZWFuLmdldEJvb2xlYW4oT0ZTTl9DT01QVVRFX0RJUl9TSVpFKTsKKyAgICB0aGlzLmNvbXB1dGVGaWxlU2l6ZSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihPRlNOX0NPTVBVVEVfRklMRV9TSVpFKTsKKworCisgICAgaWYgKHhtbENvbmZpZ0ZpbGVQYXRoID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJNdXN0IGRlZmluZSB4bWwgY29uZmlndXJhdGlvbiBmaWxlIHBhdGggdmlhIHByb3BlcnR5IDogWyIKKyAgICAgICAgICAgICAgKyBPRlNOX1hNTF9DT05GX0ZJTEVfS0VZICsgIl0iKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgdGhpcy5jb25mID0gT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvblJlYWRlcgorICAgICAgICAgIC5nZXRDb25maWcoeG1sQ29uZmlnRmlsZVBhdGgpOworICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigieG1sIGNvbmZpZ3VyYXRpb24gZmlsZTogWyIKKyAgICAgICAgICArIHhtbENvbmZpZ0ZpbGVQYXRoICsgIl0gbm90IGZvdW5kISIpOworICAgIH0KKworICAgIGlmICh0aGlzLmNvbmYuZ2V0UHJvZHVjdFJvb3QoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiTXVzdCBkZWZpbmU6IFtwcm9kdWN0Um9vdF0gYXR0cmlidXRlIGluIFhNTCBjb25maWd1cmF0aW9uISIpOworICAgIH0KKworICAgIC8vIHVzZWQgdG8gY2FjaGUgaGFuZGxlcnMgLS0gbWFwIG9mIFJUIHR5cGUgdG8gR2V0L0xpc3QgaGFuZGxlciBpbnN0YW5jZQorICAgIEhBTkRMRVJfQ0FDSEUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUXVlcnlIYW5kbGVyI3F1ZXJ5KG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeSkKKyAgICovCisgIHB1YmxpYyBYTUxRdWVyeSBxdWVyeShYTUxRdWVyeSB4bWxRdWVyeSkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIFN0cmluZyBvZnNuID0gT0ZTTlV0aWxzLmV4dHJhY3RGaWVsZEZyb21RdWVyeSh4bWxRdWVyeSwgT0ZTTik7CisgICAgU3RyaW5nIGNtZCA9IE9GU05VdGlscy5leHRyYWN0RmllbGRGcm9tUXVlcnkoeG1sUXVlcnksIFJFVFVSTl9UWVBFKTsKKyAgICB2YWxpZGF0ZShvZnNuLCBjbWQpOworICAgIFN0cmluZyBjbWRJZCA9IG9mc24gKyBDTURfU0VQQVJBVE9SICsgY21kOworICAgIE9GU05IYW5kbGVyQ29uZmlnIGNmZyA9IHRoaXMuY29uZi5nZXRIYW5kbGVyQ29uZmlnKGNtZCk7CisgICAgdmFsaWRhdGVIYW5kbGVyQ29uZmlnKGNmZywgY21kKTsKKworICAgIFN0cmluZyByZWFsUGF0aCA9IHRoaXMuY29uZi5nZXRQcm9kdWN0Um9vdCgpICsgb2ZzbjsKKworICAgIGlmIChpc0xpc3RpbmdDbWQoY21kKSkgeworICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIE9GU05MaXN0SGFuZGxlciBoYW5kbGVyID0gZ2V0TGlzdEhhbmRsZXIoY21kLCBjZmcuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgRmlsZVtdIGZpbGVMaXN0ID0gaGFuZGxlci5nZXRMaXN0aW5nKHJlYWxQYXRoKTsKKyAgICAgIGdlbmVyYXRlT0ZTTlhtbChmaWxlTGlzdCwgY2ZnLCBvdXRTdHJlYW0pOworICAgICAgeG1sUXVlcnkuZ2V0UmVzdWx0cygpLmFkZCgKKyAgICAgICAgICBuZXcgUmVzdWx0KGNtZElkLCBYTUxfTUlNRV9UWVBFLCBudWxsLCBjbWRJZCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKKyAgICAgICAgICAgICAgb3V0U3RyZWFtLnRvU3RyaW5nKCkpKTsKKyAgICB9IGVsc2UgaWYgKGlzR2V0Q21kKGNtZCkpIHsKKyAgICAgIE9GU05HZXRIYW5kbGVyIGhhbmRsZXIgPSBnZXRHZXRIYW5kbGVyKGNtZCwgY2ZnLmdldENsYXNzTmFtZSgpKTsKKyAgICAgIFN0cmluZyBydEFuZFBhdGggPSBjbWQgKyBDTURfU0VQQVJBVE9SICsgcmVhbFBhdGg7CisgICAgICBTdHJpbmcgbWltZVR5cGU7CisgICAgICAKKyAgICAgIC8vIGNoZWNrIGZvciBhbmQgdXNlIG1pbWV0eXBlIGNvbmYgcHJvcGVydHkgaWYgYXZhaWxhYmxlCisgICAgICBpZiAoY2ZnLmdldEhhbmRsZXJDb25mKCkuY29udGFpbnNLZXkoUFJPUEVSVFlfTUlNRVRZUEVfQVRUUikpIHsKKyAgICAJICBNZWRpYVR5cGUgbWVkaWFUeXBlID0gTWVkaWFUeXBlLnBhcnNlKGNmZy5nZXRIYW5kbGVyQ29uZigpCisgICAgCQkJICAuZ2V0UHJvcGVydHkoUFJPUEVSVFlfTUlNRVRZUEVfQVRUUikpOworICAgIAkgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgIAkJICBMT0cubG9nKExldmVsLldBUk5JTkcsICJNSU1FIHR5cGUgWyIKKyAgICAJCQkJICArY2ZnLmdldEhhbmRsZXJDb25mKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFlfTUlNRVRZUEVfQVRUUikrIl0gc3BlY2lmaWVkICIKKyAgICAJCQkJICArImZvciBoYW5kbGVyIFsiK2NmZy5nZXRDbGFzc05hbWUoKSsiXSBpbnZhbGlkLiBEZWZhdWx0aW5nIHRvIE1JTUUgdHlwZSBbIgorICAgIAkJCQkgICtNZWRpYVR5cGUuT0NURVRfU1RSRUFNLnRvU3RyaW5nKCkrIl0iKTsKKyAgICAJCSAgbWVkaWFUeXBlID0gTWVkaWFUeXBlLk9DVEVUX1NUUkVBTTsKKyAgICAJICB9CisgICAgCSAgbWltZVR5cGUgPSBtZWRpYVR5cGUudG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSB7IC8vIHVzZSBkZWZhdWx0IG1pbWV0eXBlIG9mIHByb2R1Y3Qgb24gZGlzaworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIG1pbWVUeXBlID0gTWltZVR5cGVzRmFjdG9yeS5jcmVhdGUoKS5nZXRNaW1lVHlwZShuZXcgRmlsZShyZWFsUGF0aCkpLmdldE5hbWUoKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBtaW1lVHlwZSA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICB4bWxRdWVyeS5nZXRSZXN1bHRzKCkuYWRkKAorICAgICAgICAgIG5ldyBMYXJnZVJlc3VsdCgvKiBpZCAqL3J0QW5kUGF0aCwvKiBtaW1lVHlwZSAqLyBtaW1lVHlwZSwgLyogcHJvZmlsZUlEICovbnVsbCwgCisgICAgICAgIAkJICAvKiByZXNvdXJjZUlEICovbmV3IEZpbGUocmVhbFBhdGgpLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgCisgICAgICAgIAkJICBoYW5kbGVyLnNpemVPZihyZWFsUGF0aCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oInJldHVybiB0eXBlOiBbIiArIGNtZCArICJdIGlzIHVuc3VwcG9ydGVkISIpOworICAgIH0KKworICAgIHJldHVybiB4bWxRdWVyeTsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIjY2xvc2UoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyB2b2lkIGNsb3NlKFN0cmluZyBpZCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuTGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyI3JldHJpZXZlQ2h1bmsoamF2YS5sYW5nLlN0cmluZywKKyAgICogbG9uZywgaW50KQorICAgKi8KKyAgcHVibGljIGJ5dGVbXSByZXRyaWV2ZUNodW5rKFN0cmluZyBpZCwgbG9uZyBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgLy8gdW5tYXJzaGFsbCB0aGUgcmV0dXJuIHR5cGUgYW5kIHBhdGgKKyAgICBTdHJpbmdbXSBydFR5cGVBbmRQYXRoQXJyID0gaWQuc3BsaXQoQ01EX1NFUEFSQVRPUik7CisgICAgU3RyaW5nIHJ0VHlwZSA9IHJ0VHlwZUFuZFBhdGhBcnJbMF07CisgICAgU3RyaW5nIGZpbGVwYXRoID0gcnRUeXBlQW5kUGF0aEFyclsxXTsKKworICAgIE9GU05HZXRIYW5kbGVyIGhhbmRsZXIgPSBnZXRHZXRIYW5kbGVyKHJ0VHlwZSwgdGhpcy5jb25mCisgICAgICAgIC5nZXRIYW5kbGVyQ2xhc3MocnRUeXBlKSk7CisgICAgCisgICAgcmV0dXJuIGhhbmRsZXIucmV0cmlldmVDaHVuayhmaWxlcGF0aCwgb2Zmc2V0LCBsZW5ndGgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlT0ZTTlhtbChGaWxlW10gbWxzRmlsZUxpc3QsIE9GU05IYW5kbGVyQ29uZmlnIGNmZywKKyAgICAgIE91dHB1dFN0cmVhbSBvdXRTdHJlYW0pIHsKKyAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKE9GU05VdGlscy5nZXRPRlNORG9jKEFycmF5cy5hc0xpc3QobWxzRmlsZUxpc3QpLAorICAgICAgICBjZmcsIHRoaXMuY29uZi5nZXRQcm9kdWN0Um9vdCgpLCB0aGlzLmNvbXB1dGVEaXJTaXplLCB0aGlzLmNvbXB1dGVGaWxlU2l6ZSksCisgICAgICAgIG91dFN0cmVhbSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoU3RyaW5nIG9mc24sIFN0cmluZyBjbWQpIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uIHsKKyAgICBpZiAob2ZzbiA9PSBudWxsIHx8IGNtZCA9PSBudWxsIHx8IChvZnNuICE9IG51bGwgJiYgb2Zzbi5lcXVhbHMoIiIpKQorICAgICAgICB8fCAoY21kICE9IG51bGwgJiYgY21kLmVxdWFscygiIikpKSB7CisgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbigibXVzdCBzcGVjaWZ5IE9GU04gYW5kIFJUIHBhcmFtZXRlcnMhIik7CisgICAgfSBlbHNlIGlmICghT0ZTTlV0aWxzLnZhbGlkYXRlT0ZTTihvZnNuKSkgeworICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oIk9GU04gaXMgaW52YWxpZCIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUhhbmRsZXJDb25maWcoT0ZTTkhhbmRsZXJDb25maWcgY2ZnLCBTdHJpbmcgY21kKQorICAgICAgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIGlmIChjZmcgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oIlVucmVjb2duaXplZCBjb21tYW5kOiBbIiArIGNtZCArICJdISIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgT0ZTTkxpc3RIYW5kbGVyIGdldExpc3RIYW5kbGVyKFN0cmluZyBydFR5cGUsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICBpZiAoSEFORExFUl9DQUNIRS5jb250YWluc0tleShydFR5cGUpKSB7CisgICAgICByZXR1cm4gKE9GU05MaXN0SGFuZGxlcikgSEFORExFUl9DQUNIRS5nZXQocnRUeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgT0ZTTkxpc3RIYW5kbGVyIGhhbmRsZXIgPSBPRlNOT2JqZWN0RmFjdG9yeS5nZXRMaXN0SGFuZGxlcihjbGFzc05hbWUpOworICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiR2V0dGluZyBoYW5kbGVyIGNvbmZpZyBmb3IgUlQ6IFsiK3J0VHlwZSsiXSIpOworICAgICAgaGFuZGxlci5jb25maWd1cmUodGhpcy5jb25mLmdldEhhbmRsZXJDb25maWcocnRUeXBlKS5nZXRIYW5kbGVyQ29uZigpKTsKKyAgICAgIEhBTkRMRVJfQ0FDSEUucHV0KHJ0VHlwZSwgaGFuZGxlcik7CisgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9CisgIH0KKworICBwcml2YXRlIE9GU05HZXRIYW5kbGVyIGdldEdldEhhbmRsZXIoU3RyaW5nIHJ0VHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgIGlmIChIQU5ETEVSX0NBQ0hFLmNvbnRhaW5zS2V5KHJ0VHlwZSkpIHsKKyAgICAgIHJldHVybiAoT0ZTTkdldEhhbmRsZXIpIEhBTkRMRVJfQ0FDSEUuZ2V0KHJ0VHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE9GU05HZXRIYW5kbGVyIGhhbmRsZXIgPSBPRlNOT2JqZWN0RmFjdG9yeS5nZXRHZXRIYW5kbGVyKGNsYXNzTmFtZSk7CisgICAgICBoYW5kbGVyLmNvbmZpZ3VyZSh0aGlzLmNvbmYuZ2V0SGFuZGxlckNvbmZpZyhydFR5cGUpLmdldEhhbmRsZXJDb25mKCkpOworICAgICAgSEFORExFUl9DQUNIRS5wdXQocnRUeXBlLCBoYW5kbGVyKTsKKyAgICAgIHJldHVybiBoYW5kbGVyOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc0xpc3RpbmdDbWQoU3RyaW5nIGNtZCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIE9GU05IYW5kbGVyQ29uZmlnIGNmZyA9IHRoaXMuY29uZi5nZXRIYW5kbGVyQ29uZmlnKGNtZCk7CisgICAgaWYgKGNmZyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIGNvbW1hbmQ6IFsiICsgY21kICsgIl0hIik7CisgICAgfQorCisgICAgaWYgKGNmZy5nZXRUeXBlKCkuZXF1YWxzKExJU1RJTkdfQ01EKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNHZXRDbWQoU3RyaW5nIGNtZCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIE9GU05IYW5kbGVyQ29uZmlnIGNmZyA9IHRoaXMuY29uZi5nZXRIYW5kbGVyQ29uZmlnKGNtZCk7CisKKyAgICBpZiAoY2ZnLmdldFR5cGUoKS5lcXVhbHMoR0VUX0NNRCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvbi5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9PRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2M2Y1NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogCisgKiBUaGUgT0ZTTiBwcm9kdWN0IGhhbmRsZXIncyBjb25maWd1cmF0aW9uIG9iamVjdC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uIHsKKworICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT0ZTTkhhbmRsZXJDb25maWc+IGhhbmRsZXJUYWJsZTsKKworICBwcml2YXRlIFN0cmluZyBwcm9kdWN0Um9vdDsKKworICBwcml2YXRlIFN0cmluZyBpZDsKKworICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgIHB1YmxpYyBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uKFN0cmluZyBwcm9kdWN0Um9vdCwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgeworICAgIHRoaXMuaGFuZGxlclRhYmxlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPRlNOSGFuZGxlckNvbmZpZz4oKTsKKyAgICB0aGlzLnByb2R1Y3RSb290ID0gcHJvZHVjdFJvb3Q7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgY2xlYW5zZSh0aGlzLnByb2R1Y3RSb290KTsKKyAgfQorCisgIHB1YmxpYyBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uKCkgeworICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJUeXBlKFN0cmluZyBoYW5kbGVyTmFtZSkgeworICAgIGlmICh0aGlzLmhhbmRsZXJUYWJsZS5jb250YWluc0tleShoYW5kbGVyTmFtZSkpIHsKKyAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJUYWJsZS5nZXQoaGFuZGxlck5hbWUpLmdldFR5cGUoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoU3RyaW5nIGhhbmRsZXJOYW1lKSB7CisgICAgaWYgKHRoaXMuaGFuZGxlclRhYmxlLmNvbnRhaW5zS2V5KGhhbmRsZXJOYW1lKSkgeworICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlclRhYmxlLmdldChoYW5kbGVyTmFtZSkuZ2V0Q2xhc3NOYW1lKCk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBMaXN0PE9GU05IYW5kbGVyQ29uZmlnPiBnZXRIYW5kbGVyQ29uZmlncygpIHsKKyAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh0aGlzLmhhbmRsZXJUYWJsZS52YWx1ZXMoKS50b0FycmF5KAorICAgICAgICBuZXcgT0ZTTkhhbmRsZXJDb25maWdbdGhpcy5oYW5kbGVyVGFibGUuc2l6ZSgpXSkpOworICB9CisKKyAgcHVibGljIE9GU05IYW5kbGVyQ29uZmlnIGdldEhhbmRsZXJDb25maWcoU3RyaW5nIGhhbmRsZXJOYW1lKSB7CisgICAgcmV0dXJuIHRoaXMuaGFuZGxlclRhYmxlLmdldChoYW5kbGVyTmFtZSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcHJvZHVjdFJvb3QKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFJvb3QoKSB7CisgICAgcmV0dXJuIHByb2R1Y3RSb290OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwcm9kdWN0Um9vdAorICAgKiAgICAgICAgICB0aGUgcHJvZHVjdFJvb3QgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0Um9vdChTdHJpbmcgcHJvZHVjdFJvb3QpIHsKKyAgICB0aGlzLnByb2R1Y3RSb290ID0gcHJvZHVjdFJvb3Q7CisgICAgY2xlYW5zZSh0aGlzLnByb2R1Y3RSb290KTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBpZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGlkCisgICAqICAgICAgICAgIHRoZSBpZCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgdGhlIG5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjbGVhbnNlKFN0cmluZyBwYXRoKSB7CisgICAgaWYgKHBhdGggIT0gbnVsbCAmJiAhcGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICBwYXRoICs9ICIvIjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvblJlYWRlci5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9PRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlYjczOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvblJlYWRlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLm1ldGFkYXRhLk9GU05YTUxDb25maWdNZXRLZXlzOworCisvKioKKyAqIAorICogUmVhZHMgYW4gWE1MIGZpbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9ufS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uUmVhZGVyIGltcGxlbWVudHMKKyAgICBPRlNOWE1MQ29uZmlnTWV0S2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uIGdldENvbmZpZyhTdHJpbmcgZmlsZVBhdGgpCisgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uKCk7CisKKyAgICBEb2N1bWVudCBjb25maWdEb2MgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSgKKyAgICAgICAgZmlsZVBhdGgpKSk7CisgICAgRWxlbWVudCBjb25maWdFbGVtID0gY29uZmlnRG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgIGNvbmZpZy5zZXRJZChjb25maWdFbGVtLmdldEF0dHJpYnV0ZShPRlNOX0NGR19JRF9BVFRSKSk7CisgICAgY29uZmlnLnNldE5hbWUoY29uZmlnRWxlbS5nZXRBdHRyaWJ1dGUoT0ZTTl9DRkdfTkFNRV9BVFRSKSk7CisgICAgY29uZmlnLnNldFByb2R1Y3RSb290KGNvbmZpZ0VsZW0uZ2V0QXR0cmlidXRlKE9GU05fUFJPRFVDVF9ST09UX0FUVFIpKTsKKyAgICBhZGRIYW5kbGVycyhjb25maWdFbGVtLCBjb25maWcpOworICAgIHJldHVybiBjb25maWc7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEhhbmRsZXJzKEVsZW1lbnQgY29uZmlnUm9vdEVsZW0sCisgICAgICBPRlNORmlsZUhhbmRsZXJDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgIE5vZGVMaXN0IGhhbmRsZXJOb2RlcyA9IGNvbmZpZ1Jvb3RFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKEhBTkRMRVJfVEFHKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICBPRlNOSGFuZGxlckNvbmZpZyBjZmcgPSBnZXRIYW5kbGVyQ29uZmlnKChFbGVtZW50KSBoYW5kbGVyTm9kZXMuaXRlbShpKSk7CisgICAgICBjb25maWcuaGFuZGxlclRhYmxlLnB1dChjZmcuZ2V0TmFtZSgpLCBjZmcpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9GU05IYW5kbGVyQ29uZmlnIGdldEhhbmRsZXJDb25maWcoRWxlbWVudCBoYW5kbGVyTm9kZUVsZW0pIHsKKyAgICBPRlNOSGFuZGxlckNvbmZpZyBjZmcgPSBuZXcgT0ZTTkhhbmRsZXJDb25maWcoKTsKKyAgICBjZmcuc2V0Q2xhc3NOYW1lKGhhbmRsZXJOb2RlRWxlbS5nZXRBdHRyaWJ1dGUoSEFORExFUl9DTEFTU05BTUVfQVRUUikpOworICAgIGNmZy5zZXROYW1lKGhhbmRsZXJOb2RlRWxlbS5nZXRBdHRyaWJ1dGUoSEFORExFUl9OQU1FX0FUVFIpKTsKKyAgICBjZmcuc2V0VHlwZShoYW5kbGVyTm9kZUVsZW0uZ2V0QXR0cmlidXRlKEhBTkRMRVJfVFlQRV9BVFRSKSk7CisgICAgY2ZnLnNldEhhbmRsZXJDb25mKHJlYWRDb25maWcoaGFuZGxlck5vZGVFbGVtKSk7CisgICAgcmV0dXJuIGNmZzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgcmVhZENvbmZpZyhFbGVtZW50IGhhbmRsZXJOb2RlRWxlbSkgeworICAgIFByb3BlcnRpZXMgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBOb2RlTGlzdCBwcm9wZXJ0eU5vZGVzID0gaGFuZGxlck5vZGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFBST1BFUlRZX1RBRyk7CisKKyAgICBpZiAocHJvcGVydHlOb2RlcyAhPSBudWxsICYmIHByb3BlcnR5Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3BlcnR5Tm9kZXMuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICBFbGVtZW50IHByb3BlcnR5RWxlbSA9IChFbGVtZW50KSBwcm9wZXJ0eU5vZGVzLml0ZW0oaik7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUVsZW0uZ2V0QXR0cmlidXRlKFBST1BFUlRZX05BTUVfQVRUUik7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlFbGVtLmdldEF0dHJpYnV0ZShQUk9QRVJUWV9WQUxVRV9BVFRSKTsKKworICAgICAgICBjb25maWcuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29uZmlnOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL09GU05HZXRIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL09GU05HZXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzOGEyMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkdldEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5Qcm9kdWN0RXhjZXB0aW9uOworCisvKioKKyAqIAorICogVGhlIGRlZmF1bHQgT0ZTTiBoYW5kbGVyIGZvciBnZXR0aW5nIHJlbW90ZSBkYXRhLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBPRlNOR2V0SGFuZGxlciB7CisKKyAgLyoqCisgICAqIFJldHJpZXZlcyBhIGNodW5rIG9mIGRhdGEgZnJvbSB0aGUgcmVtb3RlIGZpbGUuCisgICAqIAorICAgKiBAcGFyYW0gZmlsZXBhdGgKKyAgICogICAgICAgICAgVGhlIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlLgorICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqICAgICAgICAgIFRoZSBvZmZzZXQgaW4gdGhlIHJlbW90ZSBkYXRhIHRvIHJldHJpZXZlLgorICAgKiBAcGFyYW0gbGVuZ3RoCisgICAqICAgICAgICAgIFRoZSBsZW5ndGggb2YgZGF0YSB0byByZWFkCisgICAqIEByZXR1cm4gVGhlIGJ5dGVbXSBkYXRhLCByZWFkLCBvciBudWxsIG90aGVyd2lzZS4KKyAgICogQHRocm93cyBQcm9kdWN0RXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSByZXRyaWV2ZUNodW5rKFN0cmluZyBmaWxlcGF0aCwgbG9uZyBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcmVtb3RlIGRhdGEsIHdoaWNoIG1heSBiZSB0aGUgZW50aXJlIGZpbGUgaW4KKyAgICogcXVlc3Rpb24sIG9yIHNvbWUgc3Vic2V0L3RyYW5zZm9ybWF0aW9uIG9uIGl0LgorICAgKiAKKyAgICogQHBhcmFtIGZpbGVwYXRoCisgICAqICAgICAgICAgIFRoZSByZW1vdGUgZmlsZSBpbiBxdWVzdGlvbi4KKyAgICogQHJldHVybiBUaGUgc2l6ZSBvZiB0aGUgcmVtb3RlIGZpbGUsIHBvdGVudGlhbGx5IGFmdGVyIGEgcmVtb3RlCisgICAqICAgICAgICAgdHJhbnNmb3JtYXRpb24gaGFzIG9jY3VyZWQuCisgICAqLworICBwdWJsaWMgbG9uZyBzaXplT2YoU3RyaW5nIGZpbGVwYXRoKTsKKworICAvKioKKyAgICogQ29uZmlndXJlcyB0aGlzIGhhbmRsZXIgd2l0aCB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBzdG9yZWQgaW4gYQorICAgKiB7QGxpbmsgUHJvcGVydGllc30gb2JqZWN0LgorICAgKiAKKyAgICogQHBhcmFtIGNvbmYKKyAgICogICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgbGlzdCBoYW5kbGVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgY29uZik7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkhhbmRsZXJDb25maWcuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkhhbmRsZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhhYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9PRlNOSGFuZGxlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiAKKyAqIEEgY29uZmlndXJhdGlvbiBlbGVtZW50IGluIHRoZSBYTUwgY29uZmlnIGZpbGUgZm9yIHRoZSBPRlNOIGhhbmRsZXIuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgT0ZTTkhhbmRsZXJDb25maWcgeworCisgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgIAorICBwcml2YXRlIFByb3BlcnRpZXMgaGFuZGxlckNvbmY7CisKKyAgLyoqCisgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICogQHBhcmFtIHR5cGUKKyAgICogQHBhcmFtIG5hbWUKKyAgICovCisgIHB1YmxpYyBPRlNOSGFuZGxlckNvbmZpZyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLmhhbmRsZXJDb25mID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICovCisgIHB1YmxpYyBPRlNOSGFuZGxlckNvbmZpZygpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNsYXNzTmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAqICAgICAgICAgIHRoZSBjbGFzc05hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHR5cGUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdHlwZQorICAgKiAgICAgICAgICB0aGUgdHlwZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGhhbmRsZXJDb25mCisgICAqLworICBwdWJsaWMgUHJvcGVydGllcyBnZXRIYW5kbGVyQ29uZigpIHsKKyAgICByZXR1cm4gaGFuZGxlckNvbmY7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGhhbmRsZXJDb25mIHRoZSBoYW5kbGVyQ29uZiB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDb25mKFByb3BlcnRpZXMgaGFuZGxlckNvbmYpIHsKKyAgICB0aGlzLmhhbmRsZXJDb25mID0gaGFuZGxlckNvbmY7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9PRlNOTGlzdEhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkxpc3RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjMjRkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vT0ZTTkxpc3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CisKKy8qKgorICogPHA+CisgKiBDbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRlZmluZSBob3cgdG8gcmV0dXJuIGZpbGUgbGlzdGluZ3Mgb24gYQorICogcmVtb3RlIHNlcnZlciBmcm9tIGFuIDxjb2RlPm9mc248L2NvZGU+LgorICogPC9wPgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBPRlNOTGlzdEhhbmRsZXIgeworCisgIC8qKgorICAgKiBIYW5kbGVycyB0aGF0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0YWtlIGFuIDxjb2RlPk88L2NvZGU+bmxpbmUKKyAgICogPGNvZGU+RjwvY29kZT5pbGUgPGNvZGU+UzwvY29kZT5wZWNpZmljYXRpb24gPGNvZGU+TjwvY29kZT5hbWUgYW5kIHJldHVybgorICAgKiBiYWNrIGEgbGlzdGluZyBvZiBmaWxlcyBvbiB0aGUgcmVtb3RlIHNlcnZlci4KKyAgICogCisgICAqIEBwYXJhbSBvZnNuCisgICAqICAgICAgICAgIFRoZSBPRlNOIHBhdGggdG8gbGlzdCBmaWxlcyBmcm9tLgorICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBGaWxlfSBvYmplY3RzLgorICAgKiBAdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMgcGVyZm9ybWluZyB0aGUgbGlzdGluZyBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAqLworICBwdWJsaWMgRmlsZVtdIGdldExpc3RpbmcoU3RyaW5nIG9mc24pIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uOworCisgIC8qKgorICAgKiBDb25maWd1cmVzIHRoaXMgaGFuZGxlciB3aXRoIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIHN0b3JlZCBpbiBhCisgICAqIHtAbGluayBQcm9wZXJ0aWVzfSBvYmplY3QuCisgICAqIAorICAgKiBAcGFyYW0gY29uZgorICAgKiAgICAgICAgICBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaXN0IGhhbmRsZXIuCisgICAqLworICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBjb25mKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vUmF3U2l6ZUxpc3RIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL1Jhd1NpemVMaXN0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4M2UxYjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL1Jhd1NpemVMaXN0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5Qcm9kdWN0RXhjZXB0aW9uOworCisvKioKKyAqCisgKiBIYW5kbGVzIGEgbGlzdGluZyByZXF1ZXN0IGZvciB0aGUgcmF3IHNpemUgb2YgYSBmaWxlLiBUaGlzIGxpc3RpbmcKKyAqIHJldHVybnMgYSBzaW5nbGUgZmlsZSBvciBkaXJlY3RvcnksIHdoaWNoIHdpbGwgdGhlbiBoYXZlIGl0cyBzaXplCisgKiBjb21wdXRlZC4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUmF3U2l6ZUxpc3RIYW5kbGVyIGltcGxlbWVudHMgT0ZTTkxpc3RIYW5kbGVyIHsKKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOTGlzdEhhbmRsZXIjY29uZmlndXJlKGphdmEudXRpbC5Qcm9wZXJ0aWVzKQorICAgKi8KKyAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgY29uZikgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAvLyBub3RoaW5nIHlldAorCisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOTGlzdEhhbmRsZXIjZ2V0TGlzdGluZyhqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIEZpbGVbXSBnZXRMaXN0aW5nKFN0cmluZyBvZnNuKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgaWYgKCFuZXcgRmlsZShvZnNuKS5leGlzdHMoKSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm9kdWN0RXhjZXB0aW9uKCJmaWxlOiBbIiArIG9mc24KKyAgICAgICAgICAgICAgICAgICsgIl0gZG9lcyBub3QgZXhpc3QhIik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKG9mc24pIH07CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9TaW5nbGVGaWxlTGlzdEhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vU2luZ2xlRmlsZUxpc3RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkNTU5YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vU2luZ2xlRmlsZUxpc3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUHJvZHVjdEV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIFJldHVybnMgYSBzaW5nbGUgcmVtb3RlIGZpbGUgbGlzdGluZyBvZiB0aGUgZ2l2ZW4gb2Zzbi4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWxlTGlzdEhhbmRsZXIgaW1wbGVtZW50cyBPRlNOTGlzdEhhbmRsZXIgeworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOTGlzdEhhbmRsZXIjY29uZmlndXJlKGphdmEuCisgICAqIHV0aWwuUHJvcGVydGllcykKKyAgICovCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShQcm9wZXJ0aWVzIGNvbmYpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgLy8gbm90aGluZyB5ZXQKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05MaXN0SGFuZGxlciNnZXRMaXN0aW5nKGphdmEKKyAgICogLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIEZpbGVbXSBnZXRMaXN0aW5nKFN0cmluZyBvZnNuKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgaWYgKCFuZXcgRmlsZShvZnNuKS5leGlzdHMoKSkgeworICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oImZpbGU6IFsiICsgb2ZzbiArICJdIGRvZXMgbm90IGV4aXN0ISIpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKG9mc24pIH07CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9TaW5nbGVaaXBGaWxlTGlzdEhhbmRsZXIuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vU2luZ2xlWmlwRmlsZUxpc3RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4YTUzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vU2luZ2xlWmlwRmlsZUxpc3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24udXRpbC5PRlNOVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUHJvZHVjdEV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworCisvKioKKyAqIAorICogR2VuZXJhdGVzIGEgbGlzdGluZyBvZiB0aGUgc2l6ZSBvZiBhIHJlbW90ZSBmaWxlIGlkZW50aWZpZWQgYnkgaXRzIE9GU04gYXMgYQorICogemlwIHdvdWxkIGJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZVppcEZpbGVMaXN0SGFuZGxlciBpbXBsZW1lbnRzIE9GU05MaXN0SGFuZGxlciB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVSb290OworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOTGlzdEhhbmRsZXIjY29uZmlndXJlKGphdmEuCisgICAqIHV0aWwuUHJvcGVydGllcykKKyAgICovCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShQcm9wZXJ0aWVzIGNvbmYpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICB0aGlzLmNhY2hlUm9vdCA9IGNvbmYuZ2V0UHJvcGVydHkoImNhY2hlRGlyUm9vdCIpOworCisgICAgaWYgKHRoaXMuY2FjaGVSb290ID09IG51bGwpIHsKKyAgICAgIHRoaXMuY2FjaGVSb290ID0gIi90bXAiOworICAgIH0KKworICAgIGlmICghdGhpcy5jYWNoZVJvb3QuZW5kc1dpdGgoIi8iKSkgeworICAgICAgdGhpcy5jYWNoZVJvb3QgKz0gIi8iOworICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05MaXN0SGFuZGxlciNnZXRMaXN0aW5nKGphdmEKKyAgICogLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIEZpbGVbXSBnZXRMaXN0aW5nKFN0cmluZyBvZnNuKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgaWYgKCFuZXcgRmlsZShvZnNuKS5leGlzdHMoKSkgeworICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oImZpbGU6IFsiICsgb2ZzbiArICJdIGRvZXMgbm90IGV4aXN0ISIpOworICAgIH0KKworICAgIFN0cmluZyB6aXBGaWxlUGF0aCA9IHRoaXMuY2FjaGVSb290ICsgbmV3IEZpbGUob2ZzbikuZ2V0TmFtZSgpICsgIi56aXAiOworICAgIEZpbGUgemlwRmlsZSA9IE9GU05VdGlscy5idWlsZFppcEZpbGUoemlwRmlsZVBhdGgsIG5ldyBGaWxlW10geyBuZXcgRmlsZSgKKyAgICAgICAgb2ZzbikgfSk7CisgICAgcmV0dXJuIG5ldyBGaWxlW10geyB6aXBGaWxlIH07CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9TdGRPRlNOR2V0SGFuZGxlci5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9TdGRPRlNOR2V0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNTZjZjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL1N0ZE9GU05HZXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUHJvZHVjdEV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIFN0YW5kYXJkIHdheSBvZiByZXRyaWV2aW5nIGEgZmlsZSB3aXRob3V0IHBlcmZvcm1pbmcgCisgKiBhbnkgdHJhbnNmb3JtYXRpb24gb24gaXQuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgU3RkT0ZTTkdldEhhbmRsZXIgaW1wbGVtZW50cyBPRlNOR2V0SGFuZGxlciB7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05HZXRIYW5kbGVyI3JldHJpZXZlQ2h1bmsoamF2YQorICAgKiAubGFuZy5TdHJpbmcsIGxvbmcsIGludCkKKyAgICovCisgIHB1YmxpYyBieXRlW10gcmV0cmlldmVDaHVuayhTdHJpbmcgZmlsZXBhdGgsIGxvbmcgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBieXRlW10gYnVmID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZmlsZXBhdGgpKTsKKworICAgICAgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgIGludCBudW1SZWFkOworICAgICAgbG9uZyBudW1Ta2lwcGVkOworICAgICAgbnVtU2tpcHBlZCA9IGluLnNraXAob2Zmc2V0KTsKKyAgICAgIGlmIChudW1Ta2lwcGVkICE9IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbigiV2FzIG5vdCBhYmxlIHRvIHNraXA6IFsiICsgb2Zmc2V0CisgICAgICAgICAgICArICJdIGJ5dGVzIGludG8gcHJvZHVjdDogbnVtIGFjdHVhbGx5IHNraXBwZWQ6IFsiICsgbnVtU2tpcHBlZAorICAgICAgICAgICAgKyAiXSIpOworICAgICAgfQorCisgICAgICBudW1SZWFkID0gaW4ucmVhZChidWYsIDAsIGxlbmd0aCk7CisKKyAgICAgIGlmIChudW1SZWFkICE9IGxlbmd0aCkgeworICAgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbigiV2FzIG5vdCBhYmxlIHRvIHJlYWQ6IFsiICsgbGVuZ3RoCisgICAgICAgICAgICArICJdIGJ5dGVzIGZyb20gcHJvZHVjdDogbnVtIGFjdHVhbGx5IHJlYWQ6IFsiICsgbnVtUmVhZCArICJdIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHRocm93IG5ldyBQcm9kdWN0RXhjZXB0aW9uKCJJTyBleGNlcHRpb24gcmV0cmlldmluZyBjaHVuayBvZiBwcm9kdWN0OiBbIgorICAgICAgICAgICsgZmlsZXBhdGggKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBpbiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOR2V0SGFuZGxlciNzaXplT2YoamF2YS5sYW5nCisgICAqIC5TdHJpbmcpCisgICAqLworICBwdWJsaWMgbG9uZyBzaXplT2YoU3RyaW5nIGZpbGVwYXRoKSB7CisgICAgIHJldHVybiBuZXcgRmlsZShmaWxlcGF0aCkubGVuZ3RoKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOR2V0SGFuZGxlciNjb25maWd1cmUoamF2YS51dGlsLlByb3BlcnRpZXMpCisgICAqLworICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBjb25mKSB7CisgICAgLy8gbm8gcHJvcGVydGllcyB0byBjb25maWd1cmUgICAgCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9VUkxHZXRIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL1VSTEdldEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU1ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9VUkxHZXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2ZzbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5BYnN0cmFjdENyYXdsTGlzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uT0ZTTkdldEhhbmRsZXI7CisKKy8qKgorICAqIEEge0BsaW5rIE9GU05HZXRIYW5kbGVyfSBmb3IgcmV0dXJuaW5nIGEgVVJMIGxpc3RpbmcgcG9pbnRpbmcgdG8gZmlsZXMgd2l0aGluIGFuIE9GU04KKyAqIAorICogTk9URTogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIGNsYXNzIGluY2x1ZGU6CisgKiAxLiBTZXJ2ZXIgaG9zdG5hbWUKKyAqIDIuIFNlcnZlciBwb3J0CisgKiAzLiBXZWJhcHAgY29udGV4dC1yb290CisgKiA0LiBQYXRoIHRvIHByb2R1Y3Qtcm9vdAorICogNS4gUmV0dXJuIHR5cGUgZGVzaXJlZCBmb3IgVVJMcworICogCisgKiBAYXV0aG9yIHJ2ZXJtYQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFVSTEdldEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENyYXdsTGlzdGVyIGltcGxlbWVudHMgT0ZTTkdldEhhbmRsZXIgeworCisJTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoVVJMR2V0SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworCQorCS8vIENvbnN0YW50cworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EX1NFUlZFUl9IT1NUTkFNRSA9ICJwcm9kU2VydmVySG9zdG5hbWUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EX1NFUlZFUl9QT1JUID0gInByb2RTZXJ2ZXJQb3J0IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRF9TRVJWRVJfQ09OVEVYVCA9ICJwcm9kU2VydmVyQ29udGV4dFJvb3QiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1JPT1QgPSAicHJvZHVjdFJvb3QiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5fVFlQRSA9ICJyZXR1cm5UeXBlIjsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFVFVSTl9WQUxVRT0iIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST0RfU0VSVkVSX0hPU1ROQU1FID0gImxvY2FsaG9zdCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9EX1NFUlZFUl9QT1JUID0gIjgwODAiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJPRF9TRVJWRVJfQ09OVEVYVCA9ICJ3ZWItZ3JpZCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9EVUNUX1JPT1QgPSAiL3NvbWUvcGF0aCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVRVUk5fVFlQRSA9ICJSQVciOworCQorCS8vIEluc3RhbmNlCisJcHJpdmF0ZSBTdHJpbmcgcHJvZFNlcnZlckhvc3RuYW1lID0gbmV3IFN0cmluZygpOworCXByaXZhdGUgU3RyaW5nIHByb2RTZXJ2ZXJQb3J0ID0gbmV3IFN0cmluZygpOworCXByaXZhdGUgU3RyaW5nIHByb2RTZXJ2ZXJDb250ZXh0ID0gbmV3IFN0cmluZygpOworCXByaXZhdGUgU3RyaW5nIHByb2R1Y3RSb290ID0gbmV3IFN0cmluZygpOwkKKwlwcml2YXRlIFN0cmluZyByZXR1cm5UeXBlID0gbmV3IFN0cmluZygpOworCQorCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5BYnN0cmFjdENyYXdsTGlzdGVyI2NvbmZpZ3VyZShqYXZhLnV0aWwuUHJvcGVydGllcykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBwcm9wKSB7CisJCQorCQlpZiAocHJvcCAhPSBudWxsKSB7CisJCQlpZiAocHJvcC5nZXRQcm9wZXJ0eShQUk9EX1NFUlZFUl9IT1NUTkFNRSkgIT0gbnVsbCkKKwkJCQl0aGlzLnByb2RTZXJ2ZXJIb3N0bmFtZSA9IHByb3AuZ2V0UHJvcGVydHkoUFJPRF9TRVJWRVJfSE9TVE5BTUUpOworCQkJZWxzZSB7IAorCQkJCUxPRy53YXJuaW5nKCJDb25maWd1cmF0aW9uIHByb3BlcnR5IFsiK1BST0RfU0VSVkVSX0hPU1ROQU1FKyJdIG5vdCBzcGVjaWZpZWQsIHVzaW5nIGRlZmF1bHQiKTsKKwkJCQl0aGlzLnByb2RTZXJ2ZXJIb3N0bmFtZSA9IERFRkFVTFRfUFJPRF9TRVJWRVJfSE9TVE5BTUU7CisJCQl9CisJCQlMT0cuaW5mbygiUHJvcGVydHkgWyIrUFJPRF9TRVJWRVJfSE9TVE5BTUUrIl0gc2V0IHdpdGggdmFsdWUgWyIrdGhpcy5wcm9kU2VydmVySG9zdG5hbWUrIl0iKTsKKwkJCQorCQkJaWYgKHByb3AuZ2V0UHJvcGVydHkoUFJPRF9TRVJWRVJfUE9SVCkgIT0gbnVsbCkKKwkJCQl0aGlzLnByb2RTZXJ2ZXJQb3J0ID0gcHJvcC5nZXRQcm9wZXJ0eShQUk9EX1NFUlZFUl9QT1JUKTsKKwkJCWVsc2UgeyAKKwkJCQlMT0cud2FybmluZygiQ29uZmlndXJhdGlvbiBwcm9wZXJ0eSBbIitQUk9EX1NFUlZFUl9QT1JUKyJdIG5vdCBzcGVjaWZpZWQsIHVzaW5nIGRlZmF1bHQiKTsKKwkJCQl0aGlzLnByb2RTZXJ2ZXJQb3J0ID0gREVGQVVMVF9QUk9EX1NFUlZFUl9QT1JUOworCQkJfQorCQkJTE9HLmluZm8oIlByb3BlcnR5IFsiK1BST0RfU0VSVkVSX1BPUlQrIl0gc2V0IHdpdGggdmFsdWUgWyIrdGhpcy5wcm9kU2VydmVyUG9ydCsiXSIpOworCQkJCisJCQlpZiAocHJvcC5nZXRQcm9wZXJ0eShQUk9EX1NFUlZFUl9DT05URVhUKSAhPSBudWxsKQorCQkJCXRoaXMucHJvZFNlcnZlckNvbnRleHQgPSBwcm9wLmdldFByb3BlcnR5KFBST0RfU0VSVkVSX0NPTlRFWFQpOwkJCisJCQllbHNlIHsgCisJCQkJTE9HLndhcm5pbmcoIkNvbmZpZ3VyYXRpb24gcHJvcGVydHkgWyIrUFJPRF9TRVJWRVJfQ09OVEVYVCsiXSBub3Qgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0Iik7CisJCQkJdGhpcy5wcm9kU2VydmVyQ29udGV4dCA9IERFRkFVTFRfUFJPRF9TRVJWRVJfQ09OVEVYVDsKKwkJCX0KKwkJCUxPRy5pbmZvKCJQcm9wZXJ0eSBbIitQUk9EX1NFUlZFUl9DT05URVhUKyJdIHNldCB3aXRoIHZhbHVlIFsiK3RoaXMucHJvZFNlcnZlckNvbnRleHQrIl0iKTsKKwkJCQorCQkJaWYgKHByb3AuZ2V0UHJvcGVydHkoUFJPRFVDVF9ST09UKSAhPSBudWxsKQorCQkJCXRoaXMucHJvZHVjdFJvb3QgPSBwcm9wLmdldFByb3BlcnR5KFBST0RVQ1RfUk9PVCk7CQkKKwkJCWVsc2UgeyAKKwkJCQlMT0cud2FybmluZygiQ29uZmlndXJhdGlvbiBwcm9wZXJ0eSBbIitQUk9EVUNUX1JPT1QrIl0gbm90IHNwZWNpZmllZCwgdXNpbmcgZGVmYXVsdCIpOworCQkJCXRoaXMucHJvZHVjdFJvb3QgPSBERUZBVUxUX1BST0RVQ1RfUk9PVDsKKwkJCX0KKwkJCUxPRy5pbmZvKCJQcm9wZXJ0eSBbIitQUk9EVUNUX1JPT1QrIl0gc2V0IHdpdGggdmFsdWUgWyIrdGhpcy5wcm9kdWN0Um9vdCsiXSIpOworCQkJCisJCQlpZiAocHJvcC5nZXRQcm9wZXJ0eShSRVRVUk5fVFlQRSkgIT0gbnVsbCkKKwkJCQl0aGlzLnJldHVyblR5cGUgPSBwcm9wLmdldFByb3BlcnR5KFJFVFVSTl9UWVBFKTsKKwkJCWVsc2UgeyAKKwkJCQlMT0cud2FybmluZygiQ29uZmlndXJhdGlvbiBwcm9wZXJ0eSBbIitSRVRVUk5fVFlQRSsiXSBub3Qgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0Iik7CisJCQkJdGhpcy5yZXR1cm5UeXBlID0gREVGQVVMVF9SRVRVUk5fVFlQRTsKKwkJCX0KKwkJCUxPRy5pbmZvKCJQcm9wZXJ0eSBbIitSRVRVUk5fVFlQRSsiXSBzZXQgd2l0aCB2YWx1ZSBbIit0aGlzLnJldHVyblR5cGUrIl0iKTsKKwkJCQorCQl9IGVsc2UgeworCQkJTE9HLndhcm5pbmcoIkNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBjb3VsZCBub3QgYmUgbG9hZGVkIik7CisJCX0KKwkJCisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05HZXRIYW5kbGVyI3JldHJpZXZlQ2h1bmsoamF2YS5sYW5nLlN0cmluZywgbG9uZywgaW50KQorCSAqLworCXB1YmxpYyBieXRlW10gcmV0cmlldmVDaHVuayhTdHJpbmcgZmlsZXBhdGgsIGxvbmcgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorCQkJdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworCSAgCisJCUxPRy5pbmZvKCJSZXRyaWV2aW5nIGNodW5rIG9mIFVSTCBsaXN0aW5nIGZvciBwYXRoOiBbIitmaWxlcGF0aCsiXSBhdCBvZmZzZXQgIgorCSAgICAJCQkrIG9mZnNldCsiIGZvciAiK2xlbmd0aCsiIGJ5dGVzIik7CisKKwkJU3RyaW5nIHVybExpc3RpbmcgPSBERUZBVUxUX1JFVFVSTl9WQUxVRTsKKwkJdHJ5IHsKKwkJCXVybExpc3RpbmcgPSBnZXRVUkxMaXN0aW5nKGZpbGVwYXRoKTsKKwkJfSBjYXRjaCAoUHJvZHVjdEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cud2FybmluZygiVW5hYmxlIHRvIG9idGFpbiBieXRlIGNodW5rICgiK29mZnNldCsiIC0gIisob2Zmc2V0K2xlbmd0aCkrIikgIiAKKwkJCQkJKyAiZm9yIGZpbGVwYXRoIGxpc3RpbmcgWyIrZmlsZXBhdGgrIl0iKTsKKwkJCUxPRy53YXJuaW5nKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCUxPRy53YXJuaW5nKCJVbmFibGUgdG8gb2J0YWluIGJ5dGUgY2h1bmsgKCIrb2Zmc2V0KyIgLSAiKyhvZmZzZXQrbGVuZ3RoKSsiKSAiIAorCQkJCQkrICJmb3IgZmlsZXBhdGggbGlzdGluZyBbIitmaWxlcGF0aCsiXSIpOworCQkJTE9HLndhcm5pbmcoZS5nZXRNZXNzYWdlKCkpOworCQl9CisJCQorICAgICAgICAvLyBDb252ZXJ0IGxpc3RpbmcgdG8gYnl0ZXMKKyAgICAgICAgYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgYnl0ZVtdIG1ldEJ5dGVzID0gdXJsTGlzdGluZy5nZXRCeXRlcygpOyAgICAgIAorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtZXRCeXRlcyk7CisgICAgICAgIGlzLnNraXAob2Zmc2V0KTsKKyAgICAgICAgaXMucmVhZChyZXRCeXRlcywgMCwgbGVuZ3RoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXRCeXRlczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3LWxpbmUgc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBmb3IgYWxsIGZpbGVzIGxvY2F0ZWQgdW5kZXIgdGhlIGdpdmVuIGZpbGVwYXRoCisJICogCisJICogQHBhcmFtIGZpbGVQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcm9vdC1kaXJlY3RvcnkgdG8gZ2V0IGEgcHJvZHVjdCBsaXN0aW5nIGZvcgorCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIG5ldy1saW5lIHNlcGFyYXRlZCBsaXN0IG9mIFVSTHMKKwkgKiBAdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRVUkxMaXN0aW5nKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24sIAorCQkJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsgICAgIAorCQkKKwkJLy8gY3Jhd2wgYW5kIGNvbGxlY3QgYWxsIGZpbGVzIChpbmNsdWRpbmcgd2l0aGluIHN1YmRpcnMpIHVuZGVyIGZpbGVwYXRoCisJCUZpbGVbXSBmaWxlTGlzdGluZyA9IGdldExpc3RpbmcoZmlsZVBhdGgpOworCQkgCisJCS8vIGNvbnZlcnQgZWFjaCBjcmF3bGVkIGZpbGUncyBwYXRoIGludG8gYW4gT0ZTTiBkb3dubG9hZCBsaW5rCisJCVN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoaW50IGk9MDsgaSA8IGZpbGVMaXN0aW5nLmxlbmd0aDsgaSsrKSB7CisJCQlGaWxlIGZpbGUgPSAoRmlsZSkgZmlsZUxpc3RpbmdbaV07CisJCQlzdHJpbmdCdWlsZGVyLmFwcGVuZChidWlsZE9GU05VUkwoZmlsZSkudG9TdHJpbmcoKSk7CisJCQlzdHJpbmdCdWlsZGVyLmFwcGVuZCgiXG4iKTsKKwkJfQorCQkKKyAgICAJcmV0dXJuIHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIFVSTCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVUkwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFydGljdWxhciBwcm9kdWN0IGZpbGUuCisJICogCisJICogVGhlIFVSTCBpcyBkZWZpbmVkIHRvIGhhdmUgaXRlbXMgc3VjaCBhczogaG9zdG5hbWUsIHNlcnZlciBwb3J0LCBzZXJ2ZXIgY29udGV4dCByb290LAorCSAqIGFuZCByZXR1cm4gdHlwZSBjb25maWd1cmVkIGJhc2VkIHVwb24gYSBwcm9kdWN0IHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZSB0aGUgcHJvZHVjdCBmaWxlCisJICogQHJldHVybiBhIFVSTAorCSAqLworCXByaXZhdGUgVVJMIGJ1aWxkT0ZTTlVSTChGaWxlIGZpbGUpIHsKKwkJVVJMIHVybCA9IG51bGw7CisJCQorCQlTdHJpbmcgZmlsZVJlbGF0aXZlUGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHRoaXMucHJvZHVjdFJvb3QubGVuZ3RoKCkpOworCQkKKwkJLy8gY29uc3RydWN0IGEgVVJMIGZvciB0aGUgZmlsZSwgb3B0aW9uYWxseSB1c2luZyBhIHBvcnQgaWYgYXZhaWxhYmxlCisJCVN0cmluZyBvZnNuUGF0aDsKKwkJaWYgKHRoaXMucHJvZFNlcnZlclBvcnQgIT0gbnVsbCkgeworCQkJaWYgKCF0aGlzLnByb2RTZXJ2ZXJQb3J0LmlzRW1wdHkoKSkgeworCQkJCW9mc25QYXRoID0gImh0dHA6Ly8iICsgdGhpcy5wcm9kU2VydmVySG9zdG5hbWUgCisJCQkJKyAiOiIgKyB0aGlzLnByb2RTZXJ2ZXJQb3J0ICsgIi8iICsgdGhpcy5wcm9kU2VydmVyQ29udGV4dCAKKwkJCQkrICIvcHJvZD9xPU9GU049IiArIGZpbGVSZWxhdGl2ZVBhdGggKyAiK0FORCtSVCUzRCIgKyB0aGlzLnJldHVyblR5cGU7CisJCQl9IGVsc2UgeworCQkJCW9mc25QYXRoID0gImh0dHA6Ly8iICsgdGhpcy5wcm9kU2VydmVySG9zdG5hbWUgCisJCQkJKyAiLyIgKyB0aGlzLnByb2RTZXJ2ZXJDb250ZXh0ICsgIi9wcm9kP3E9T0ZTTj0iICsgZmlsZVJlbGF0aXZlUGF0aCAKKwkJCQkrICIrQU5EK1JUJTNEIiArIHRoaXMucmV0dXJuVHlwZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW9mc25QYXRoID0gImh0dHA6Ly8iICsgdGhpcy5wcm9kU2VydmVySG9zdG5hbWUgCisJCQkrICIvIiArIHRoaXMucHJvZFNlcnZlckNvbnRleHQgKyAiL3Byb2Q/cT1PRlNOPSIgKyBmaWxlUmVsYXRpdmVQYXRoIAorCQkJKyAiK0FORCtSVCUzRCIgKyB0aGlzLnJldHVyblR5cGU7CisJCX0KKwkJCisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKG9mc25QYXRoKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy53YXJuaW5nKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQkKKwkJcmV0dXJuIHVybDsKKwl9CisJCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05HZXRIYW5kbGVyI3NpemVPZihqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBsb25nIHNpemVPZihTdHJpbmcgZmlsZXBhdGgpIHsKKwkJU3RyaW5nIHVybExpc3RpbmcgPSBERUZBVUxUX1JFVFVSTl9WQUxVRTsKKwkJdHJ5IHsKKwkJCXVybExpc3RpbmcgPSBnZXRVUkxMaXN0aW5nKGZpbGVwYXRoKTsKKwkJfSBjYXRjaCAoUHJvZHVjdEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cud2FybmluZygiVW5hYmxlIHRvIG9idGFpbiBzaXplIGluZm9ybWF0aW9uIGZvciBmaWxlcGF0aCBsaXN0aW5nIFsiK2ZpbGVwYXRoKyJdIik7CisJCQlMT0cud2FybmluZyhlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cud2FybmluZygiVW5hYmxlIHRvIG9idGFpbiBzaXplIGluZm9ybWF0aW9uIGZvciBmaWxlcGF0aCBsaXN0aW5nIFsiK2ZpbGVwYXRoKyJdIik7CisJCQlMT0cud2FybmluZyhlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJCisJCXJldHVybiB1cmxMaXN0aW5nLmdldEJ5dGVzKCkubGVuZ3RoOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5BYnN0cmFjdENyYXdsTGlzdGVyI2dldExpc3RpbmcoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgRmlsZVtdIGdldExpc3RpbmcoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiwgCisJCQlJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCQlyZXR1cm4gY3Jhd2xGaWxlcyhuZXcgRmlsZShmaWxlUGF0aCksIHRydWUsIGZhbHNlKTsKKwl9IAorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PRlNOTWV0S2V5cy5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PRlNOTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmUzZjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL21ldGFkYXRhL09GU05NZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLm1ldGFkYXRhOworCisvKioKKyAqIE1ldCBrZXlzIGZvciB1c2UgaW4gT0ZTTiBoYW5kbGVyIGRlZmluaXRpb24uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9GU05NZXRLZXlzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUSU5HX0NNRCA9ICJsaXN0aW5nIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfQ01EID0gImdldCI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRlNOX1hNTF9DT05GX0ZJTEVfS0VZID0gIm9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24ueG1sQ29uZmlnRmlsZVBhdGgiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZTTl9DT01QVVRFX0RJUl9TSVpFID0gIm9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uY29tcHV0ZURpclNpemUiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZTTl9DT01QVVRFX0ZJTEVfU0laRSA9ICJvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLmNvbXB1dGVGaWxlU2l6ZSI7CisKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PRlNOWE1MQ29uZmlnTWV0S2V5cy5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PRlNOWE1MQ29uZmlnTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWNlZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL21ldGFkYXRhL09GU05YTUxDb25maWdNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLm1ldGFkYXRhOworCisvLyBPT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05GaWxlSGFuZGxlckNvbmZpZ3VyYXRpb25SZWFkZXI7IC8vamF2YWRvYworCisvKioKKyAqIAorICogTWV0IEtleXMgZm9yIHRoZSB7QGxpbmsgT0ZTTkZpbGVIYW5kbGVyQ29uZmlndXJhdGlvblJlYWRlcn0KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT0ZTTlhNTENvbmZpZ01ldEtleXMgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9GU05fQ0ZHX0lEX0FUVFIgPSAiaWQiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9GU05fQ0ZHX05BTUVfQVRUUiA9ICJuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRlNOX1BST0RVQ1RfUk9PVF9BVFRSID0gInByb2R1Y3RSb290IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX1RBRyA9ICJoYW5kbGVyIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX0NMQVNTTkFNRV9BVFRSID0gImNsYXNzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX05BTUVfQVRUUiA9ICJuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX1RZUEVfQVRUUiA9ICJ0eXBlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9UQUcgPSAicHJvcGVydHkiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUVfQVRUUiA9ICJuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxVRV9BVFRSID0gInZhbHVlIjsKKyAgCisgIC8qIG9wdGlvbmFsIGhhbmRsZXIgcHJvcGVydHkgYXR0cmlidXRlcyBzdXBwb3J0ZWQgYnkgYWxsIGhhbmRsZXJzICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX01JTUVUWVBFX0FUVFIgPSAibWltZVR5cGUiOyAKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PRlNOWE1MTWV0S2V5cy5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PRlNOWE1MTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTRjOTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL21ldGFkYXRhL09GU05YTUxNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24ubWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT0ZTTlhNTE1ldEtleXMgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9SRVNVTFRfVEFHID0gImRpclJlc3VsdCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX0VOVFJZX1RBRyA9ICJkaXJFbnRyeSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZTTl9UQUcgPSAiT0ZTTiI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TSVpFX1RBRyA9ICJmaWxlU2l6ZSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX01JTUVfVFlQRSA9ICJ0ZXh0L3htbCI7CisgICAgCisgICAgLy8gRklYTUU6IGNoYW5nZSBuYW1lc3BhY2UgVVJJPworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9MSVNUSU5HX05TID0gImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi94bWwvbmFtZXNwYWNlcy9kaXJsaXN0LzEuMCI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vbWV0YWRhdGEvT09EVE1ldEtleXMuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vbWV0YWRhdGEvT09EVE1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdmYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi9tZXRhZGF0YS9PT0RUTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5tZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBPT0RUTWV0S2V5cyB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MUVVFUllfUVVFUllFTEVNX1JPTEVfRUxFTSA9ICJlbGVtTmFtZSI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vbWV0YWRhdGEvWE1MUXVlcnlNZXRLZXlzLmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL21ldGFkYXRhL1hNTFF1ZXJ5TWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTUxMDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL21ldGFkYXRhL1hNTFF1ZXJ5TWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5tZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBYTUxRdWVyeU1ldEtleXMgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9GU04gPSAiT0ZTTiI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1RZUEUgPSAiUlQiOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi91dGlsL09GU05PYmplY3RGYWN0b3J5LmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL3V0aWwvT0ZTTk9iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTdlMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi91dGlsL09GU05PYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24uT0ZTTkdldEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5PRlNOTGlzdEhhbmRsZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBUaGUgT2JqZWN0IGZhY3RvcnkgdG8gdXNlIGluIHRoZSBPRlNOIHByb2R1Y3Qgc2VydmVyLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9GU05PYmplY3RGYWN0b3J5IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihPRlNOT2JqZWN0RmFjdG9yeS5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBPRlNOTGlzdEhhbmRsZXJ9IGZyb20gdGhlIHNwZWNpZmllZAorICAgKiA8Y29kZT5jbGFzc05hbWU8L2NvZGU+LgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAqICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBPRlNOTGlzdEhhbmRsZXIgb2JqZWN0IHRvIGNyZWF0ZS4KKyAgICogQHJldHVybiBBIG5ld2x5IGNvbnN0cnVjdGVkIHtAbGluayBPRlNOTGlzdEhhbmRsZXJ9IG9iamVjdC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgT0ZTTkxpc3RIYW5kbGVyIGdldExpc3RIYW5kbGVyKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICB0cnkgeworICAgICAgQ2xhc3M8T0ZTTkxpc3RIYW5kbGVyPiBsaXN0SGFuZGxlciA9IChDbGFzczxPRlNOTGlzdEhhbmRsZXI+KSBDbGFzcworICAgICAgICAgIC5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICByZXR1cm4gbGlzdEhhbmRsZXIubmV3SW5zdGFuY2UoKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGxpc3QgaGFuZGxlciBjbGFzcyAiICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgbGlzdCBoYW5kbGVyIGNsYXNzICIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBsaXN0IGhhbmRsZXIgY2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgT0ZTTkdldEhhbmRsZXJ9IGZyb20gdGhlIHNwZWNpZmllZAorICAgKiA8Y29kZT5jbGFzc05hbWU8L2NvZGU+LgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAqICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBPRlNOR2V0SGFuZGxlciBvYmplY3QgdG8gY3JlYXRlLgorICAgKiBAcmV0dXJuIEEgbmV3bHkgY29uc3RydWN0ZWQge0BsaW5rIE9GU05HZXRIYW5kbGVyfSBvYmplY3QuCisgICAqLworICBwdWJsaWMgc3RhdGljIE9GU05HZXRIYW5kbGVyIGdldEdldEhhbmRsZXIoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgIHRyeSB7CisgICAgICBDbGFzczxPRlNOR2V0SGFuZGxlcj4gZ2V0SGFuZGxlciA9IChDbGFzczxPRlNOR2V0SGFuZGxlcj4pIENsYXNzCisgICAgICAgICAgLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgIHJldHVybiBnZXRIYW5kbGVyLm5ld0luc3RhbmNlKCk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBnZXQgaGFuZGxlciBjbGFzcyAiICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgZ2V0IGhhbmRsZXIgY2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGdldCBoYW5kbGVyIGNsYXNzICIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi91dGlsL09GU05VdGlscy5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi91dGlsL09GU05VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjMzNWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9oYW5kbGVycy9vZnNuL3V0aWwvT0ZTTlV0aWxzLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLk9GU05IYW5kbGVyQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LmhhbmRsZXJzLm9mc24ubWV0YWRhdGEuT0ZTTk1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuaGFuZGxlcnMub2Zzbi5tZXRhZGF0YS5PRlNOWE1MTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLm1ldGFkYXRhLk9PRFRNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVuYW1lVXRpbHM7CisKKy8qKgorICogCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT0ZTTlV0aWxzIGltcGxlbWVudHMgT09EVE1ldEtleXMsIE9GU05YTUxNZXRLZXlzLAorICAgIE9GU05NZXRLZXlzIHsKKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0RmllbGRGcm9tUXVlcnkoWE1MUXVlcnkgcXVlcnksIFN0cmluZyBuYW1lKSB7CisgICAgZm9yIChJdGVyYXRvcjxRdWVyeUVsZW1lbnQ+IGkgPSBxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5pdGVyYXRvcigpOyBpCisgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICBRdWVyeUVsZW1lbnQgZWxlbWVudCA9IGkubmV4dCgpOworICAgICAgaWYgKGVsZW1lbnQuZ2V0Um9sZSgpLmVxdWFscyhYTUxRVUVSWV9RVUVSWUVMRU1fUk9MRV9FTEVNKQorICAgICAgICAgICYmIGVsZW1lbnQuZ2V0VmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgIC8vIGdldCB0aGUgbmV4dCBlbGVtZW50IGFuZCBlbnN1cmUgdGhhdCBpdCBpcyBhIExJVEVSQUwsIGFuZAorICAgICAgICAvLyByZXR1cm4gdGhhdAorICAgICAgICBRdWVyeUVsZW1lbnQgbGl0RWxlbWVudCA9IGkubmV4dCgpOworICAgICAgICByZXR1cm4gbGl0RWxlbWVudC5nZXRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXRPRlNORG9jKExpc3Q8RmlsZT4gZmlsZUxpc3QsIE9GU05IYW5kbGVyQ29uZmlnIGNmZywKKyAgICAgIFN0cmluZyBwcm9kdWN0Um9vdCwgYm9vbGVhbiBzaG93RGlyU2l6ZSwgYm9vbGVhbiBzaG93RmlsZVNpemUpIHsKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgZG9jdW1lbnQgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7CisKKyAgICAgIEVsZW1lbnQgcm9vdCA9IChFbGVtZW50KSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KERJUl9SRVNVTFRfVEFHKTsKKyAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2N1bWVudCwgcm9vdCwgInhtbG5zIiwgRElSX0xJU1RJTkdfTlMpOworICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7CisKKyAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZUxpc3QpIHsKKyAgICAgICAgRWxlbWVudCBkaXJFbnRyeUVsZW0gPSBYTUxVdGlscy5hZGROb2RlKGRvY3VtZW50LCByb290LCBESVJfRU5UUllfVEFHKTsKKyAgICAgICAgU3RyaW5nIG9mc24gPSB0b09GU04oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcHJvZHVjdFJvb3QpOworICAgICAgICAvL1RoaXMgZW5zdXJlcyB0aGF0IHdlIGdldCBvZnNuIG5hbWVzIHdpdGggdW5peCBzdHlsZSBzZXBhcmF0b3JzLgorICAgICAgICAvL09uIGEgV2luZG93cyBtYWNoaW5lLCB0aGUgcHJvZHVjdCBzZXJ2ZXIgd291bGQgcmV0dXJuICdcJworICAgICAgICAvL3NlcGFyYXRvcnMuCisgICAgICAgIFN0cmluZyB1bml4U3R5bGVPRlNOID0gRmlsZW5hbWVVdGlscy5zZXBhcmF0b3JzVG9Vbml4KG9mc24pOworICAgICAgICBpZiAoY2ZnLmdldFR5cGUoKS5lcXVhbHMoTElTVElOR19DTUQpKSB7CisgICAgICAgICAgaWYgKCFCb29sZWFuLnZhbHVlT2YoY2ZnLmdldEhhbmRsZXJDb25mKCkuZ2V0UHJvcGVydHkoImlzU2l6ZUNtZCIpKSkgeworICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2N1bWVudCwgZGlyRW50cnlFbGVtLCBPRlNOX1RBRywgdW5peFN0eWxlT0ZTTik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzaXplID0gTG9uZy5NSU5fVkFMVUU7CisKKyAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgIGlmIChzaG93RGlyU2l6ZSkgeworICAgICAgICAgICAgc2l6ZSA9IEZpbGVVdGlscy5zaXplT2ZEaXJlY3RvcnkoZmlsZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzaG93RmlsZVNpemUpIHsKKyAgICAgICAgICAgIHNpemUgPSBmaWxlLmxlbmd0aCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplICE9IExvbmcuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2N1bWVudCwgZGlyRW50cnlFbGVtLCBGSUxFX1NJWkVfVEFHLCBTdHJpbmcKKyAgICAgICAgICAgICAgLnZhbHVlT2Yoc2l6ZSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkb2N1bWVudDsKKyAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbGF0aXZlaXplKFN0cmluZyBwYXRoLCBTdHJpbmcgcHJvZHVjdFJvb3QpIHsKKyAgICByZXR1cm4gcHJvZHVjdFJvb3QgKyAocGF0aC5zdGFydHNXaXRoKCIvIikgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkWmlwRmlsZShTdHJpbmcgemlwRmlsZUZ1bGxQYXRoLCBGaWxlW10gZmlsZXMpIHsKKyAgICAvLyBDcmVhdGUgYSBidWZmZXIgZm9yIHJlYWRpbmcgdGhlIGZpbGVzCisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgIFppcE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIC8vIENyZWF0ZSB0aGUgWklQIGZpbGUKKyAgICAgIG91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oemlwRmlsZUZ1bGxQYXRoKSk7CisKKyAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKworICAgICAgICAvLyBBZGQgWklQIGVudHJ5IHRvIG91dHB1dCBzdHJlYW0uCisgICAgICAgIG91dC5wdXROZXh0RW50cnkobmV3IFppcEVudHJ5KGZpbGUuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgLy8gVHJhbnNmZXIgYnl0ZXMgZnJvbSB0aGUgZmlsZSB0byB0aGUgWklQIGZpbGUKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgeworICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wbGV0ZSB0aGUgZW50cnkKKyAgICAgICAgb3V0LmNsb3NlRW50cnkoKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEZpbGUoemlwRmlsZUZ1bGxQYXRoKTsKKworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlT0ZTTihTdHJpbmcgb2ZzbikgeworICAgICAgaWYgKG9mc24gPT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICFvZnNuLmVxdWFscygiIikgJiYgIW9mc24ubWF0Y2hlcygiLipcXC5cXC4uKiIpOworICAgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9PRlNOKFN0cmluZyBhYnNvbHV0ZVBhdGgsIFN0cmluZyBwcm9kdWN0Um9vdFBhdGgpIHsKKyAgICBpZiAoYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgocHJvZHVjdFJvb3RQYXRoKSkgeworICAgICAgcmV0dXJuIGFic29sdXRlUGF0aC5zdWJzdHJpbmcocHJvZHVjdFJvb3RQYXRoLmxlbmd0aCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gbXVzdCBoYXZlIGJlZW4gYSAqLnppcCBmaWxlLCBnZW5lcmF0ZWQgaW4gc29tZSBjYWNoZSBkaXIKKyAgICAgIC8vIGp1c3QgcmV0dXJuIHRoZSBmaWxlIG5hbWUKKyAgICAgIHJldHVybiBuZXcgRmlsZShhYnNvbHV0ZVBhdGgpLmdldE5hbWUoKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW0uamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9DaHVua2VkUHJvZHVjdElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4OGY4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9DaHVua2VkUHJvZHVjdElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5Qcm9kdWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlJldHJpZXZlcjsKKworLyoqCisgKiBTdHJlYW1lciBmb3IgY2h1bmtlZCBwcm9kdWN0cy4KKyAqCisgKiBUaGlzIHN0cmVhbWVyIHN0YXJ0cyBhIGJhY2tncm91bmQgdGhyZWFkIHRvIHJlcGVhdGVkbHkgcmVhZCBjaHVua3Mgb2YgYSBwcm9kdWN0IGludG8gYQorICogYm91bmRlZCBidWZmZXIuICBSZWFkcyByZWFkIGZyb20gY2h1bmtzIGluIHRoZSBidWZmZXIuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAorICovCitmaW5hbCBjbGFzcyBDaHVua2VkUHJvZHVjdElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2h1bmtlZFByb2R1Y3RJbnB1dFN0cmVhbTwvY29kZT4gaW5zdGFuY2UuCisJICoKKwkgKiBAcGFyYW0gaWQgUHJvZHVjdCBJRC4KKwkgKiBAcGFyYW0gcmV0cmlldmVyIFJldHJpZXZlciB0byB1c2UuCisJICogQHBhcmFtIHNpemUgSG93IGJpZyB0aGUgcHJvZHVjdCBpcy4KKwkgKi8KKwlDaHVua2VkUHJvZHVjdElucHV0U3RyZWFtKFN0cmluZyBpZCwgUmV0cmlldmVyIHJldHJpZXZlciwgbG9uZyBzaXplKSB7CisJCXRoaXMuaWQgPSBpZDsJCQkJCQkJICAgICAgIC8vIFNhdmUgcHJvZHVjdCBJRAorCQl0aGlzLnNpemUgPSBzaXplOwkJCQkJCSAgICAgICAvLyBTYXZlIHNpemUKKwkJdGhpcy5yZXRyaWV2ZXIgPSByZXRyaWV2ZXI7CQkJCQkgICAgICAgLy8gQW5kIHRoZSByZXRyaWV2ZXIgdXNlZCB0byBnZXQgY2h1bmtzCisJCW9wZW4gPSB0cnVlOwkJCQkJCQkgICAgICAgLy8gU3RhcnQgb3V0IG9wZW4KKwkJZW9mID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgbm90IHlldCByZWFjaGVkIEVPRiwgZXZlbiBpZiBzaXplPTAKKwl9CisKKworCS8qKgorCSAqIFJlYWQgYSBzaW5nbGUgYnl0ZS4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHJlYWRzIGZyb20gYSBjaHVuayBzdG9yZWQgaW4gdGhlIGJvdW5kZWQgYnVmZmVyLiAgSXQgbWF5IGJsb2NrIGlmCisJICogdGhlcmUgYXJlIG5vIG1vcmUgYmxvY2tzIGluIHRoZSBidWZmZXIuCisJICoKKwkgKiBAcmV0dXJuIEJ5dGUsIG9yIC0xIGlmIGF0IGVuZCBvZiBmaWxlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoZWNrT3BlbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzdHJlYW0ncyBvcGVuCisJCWlmIChlb2YpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW5kIG9mIGZpbGUiKTsJCQkgICAgICAgLy8gQWxyZWFkeSByZWFjaGVkIEVPRj8gIFlvdSBsb3NlLgorCQlmZXRjaEJsb2NrKCk7CQkJCQkJCSAgICAgICAvLyBHZXQgYSBibG9jay4KKwkJaWYgKGVvZikgcmV0dXJuIC0xOwkJCQkJCSAgICAgICAvLyBObyBtb3JlIGJsb2Nrcz8gIFNpZ25hbCBFT0YuCisJCXJldHVybiBibG9ja1tibG9ja0luZGV4KytdOwkJCQkJICAgICAgIC8vIFlpZWxkIG5leHQgYnl0ZSAocHJvbW90ZWQpIGZyb20gYmxvY2suCisJfQorCisJLyoqCisJICogUmVhZCBpbnRvIGFuIGFycmF5LgorCSAqCisJICogVGhpcyBtZXRob2QgcmVhZHMgZnJvbSBhIGNodW5rIHN0b3JlZCBpbiB0aGUgYm91bmRlZCBidWZmZXIuICBJdCBtYXkgYmxvY2sgaWYKKwkgKiB0aGVyZSBhcmUgbm8gbW9yZSBibG9ja3MgaW4gdGhlIGJ1ZmZlci4KKwkgKgorCSAqIEBwYXJhbSBiIGEgPGNvZGU+Ynl0ZVtdPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIGluIDx2YXI+YjwvdmFyPiB0byBzYXZlIHJlYWQgYnl0ZXMuCisJICogQHBhcmFtIGxlbmd0aCBIb3cgbWFueSBieXRlcyB0byB0cnkgdG8gcmVhZC4KKwkgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCBvciAtMSBhdCBlbmQgb2YgZmlsZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoZWNrT3BlbigpOwkJCQkJCQkgICAgICAgLy8gQ2hlY2sgaWYgb3BlbgorCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBiLmxlbmd0aCB8fCBsZW5ndGggPCAwIHx8IChvZmZzZXQgKyBsZW5ndGgpID4gYi5sZW5ndGggfHwgKG9mZnNldCArIGxlbmd0aCkgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBvZmZzZXQ9IiArIG9mZnNldCArICIvbGVuZ3RoPSIgKyBsZW5ndGgKKwkJCQkrICIgZm9yIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoICIgKyBiLmxlbmd0aCk7CisJCWVsc2UgaWYgKGxlbmd0aCA9PSAwKQkJCQkJCSAgICAgICAvLyBXYW50IHplcm8/CisJCQlyZXR1cm4gMDsJCQkJCQkgICAgICAgLy8gVGhlbiB5b3UgZ2V0IHplcm8KKwkJaWYgKGVvZikgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSIpOwkJCSAgICAgICAvLyBBbHJlYWR5IHJlYWNoZWQgRU9GPyAgWW91IGxvc2UuCisJCWZldGNoQmxvY2soKTsJCQkJCQkJICAgICAgIC8vIEdldCBhIGJsb2NrLgorCQlpZiAoZW9mKSByZXR1cm4gLTE7CQkJCQkJICAgICAgIC8vIE5vIG1vcmUgYmxvY2tzPyAgU2lnbmFsIEVPRi4KKwkJaW50IGFtb3VudCA9IE1hdGgubWluKGxlbmd0aCwgYmxvY2subGVuZ3RoIC0gYmxvY2tJbmRleCk7CSAgICAgICAvLyBSZXR1cm4gcmVxdWVzdGVkIGFtb3VudCBvciB3aGF0ZXZlcidzIGxlZnQKKwkJU3lzdGVtLmFycmF5Y29weShibG9jaywgYmxvY2tJbmRleCwgYiwgb2Zmc2V0LCBhbW91bnQpOwkJICAgICAgIC8vIFRyYW5zZmVyCisJCWJsb2NrSW5kZXggKz0gYW1vdW50OwkJCQkJCSAgICAgICAvLyBBZHZhbmNlCisJCXJldHVybiBhbW91bnQ7CQkJCQkJCSAgICAgICAvLyBEb25lCisJfQorCisJLyoqCisJICogRmV0Y2ggYW5vdGhlciBibG9jay4KKwkgKgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXByaXZhdGUgdm9pZCBmZXRjaEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJsb2NrID09IG51bGwgfHwgYmxvY2tJbmRleCA9PSBibG9jay5sZW5ndGgpIHRyeSB7CQkgICAgICAgLy8gTm8gYmxvY2ssIG9yIGN1cnJlbnQgYmxvY2sgZXhoYXVzdGVkPworCQkJaWYgKHByb2R1Y3RJbmRleCA9PSBzaXplKSB7CQkJCSAgICAgICAvLyBObyBtb3JlIGJsb2NrcyBsZWZ0IHRvIGdldD8KKwkJCQlibG9jayA9IG51bGw7CQkJCQkgICAgICAgLy8gRHJvcCBjdXJyZW50IGJsb2NrCisJCQkJZW9mID0gdHJ1ZTsJCQkJCSAgICAgICAvLyBTaWduYWwgRU9GCisJCQl9IGVsc2UgewkJCQkJCSAgICAgICAvLyBPdGhlcndpc2UgdGhlcmUgYXJlIG1vcmUgYmxvY2tzCisJCQkJaW50IHg9KGludClNYXRoLm1pbihCTE9DS19TSVpFLCBzaXplIC0gcHJvZHVjdEluZGV4KTsgIC8vIENhbiBvbmx5IGZldGNoIHNvIG11Y2gKKwkJCQlibG9jayA9IHJldHJpZXZlci5yZXRyaWV2ZUNodW5rKGlkLCBwcm9kdWN0SW5kZXgsIHgpOyAgLy8gR2V0IHgncyB3b3J0aCBvZiBkYXRhCisJCQkJYmxvY2tJbmRleCA9IDA7CQkJCQkgICAgICAgLy8gU3RhcnQgYXQgYmxvY2sncyBiZWdpbm5pbmcKKwkJCQlwcm9kdWN0SW5kZXggKz0gYmxvY2subGVuZ3RoOwkJCSAgICAgICAvLyBBZHZhbmNlIHByb2R1Y3QgaW5kZXggYnkgYmxvY2sgc2l6ZQorCQkJfQorCQl9IGNhdGNoIChQcm9kdWN0RXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGF2YWlsYWJsZS4KKwkgKgorCSAqIElmIHdlIGhhdmUgYSBibG9jaywgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgYnl0ZXMgaXMgd2hhdGV2ZXIncyBpbiB0aGUgYmxvY2suCisJICogT3RoZXJ3aXNlIHdlIGRvbid0IGtub3cgaG93IG1hbnkgYnl0ZXMsIGFuZCB3ZSBjb3VsZCBibG9jaywgc28gc2F5IHplcm8gYXJlIGF2YWlsYWJsZS4KKwkgKgorCSAqIEByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoZWNrT3BlbigpOwkJCQkJCQkgICAgICAgLy8gT3Blbj8KKwkJcmV0dXJuIGJsb2NrID09IG51bGw/IDAgOiBibG9jay5sZW5ndGggLSBibG9ja0luZGV4OwkJICAgICAgIC8vIElmIG5vIGN1cnJlbnQgYmxvY2ssIHlvdSBjYW4gb25seSBnZXQgMAorCX0KKworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJY2hlY2tPcGVuKCk7CQkJCQkJCSAgICAgICAvLyBPcGVuPworCQl0cnkgeworCQkJcmV0cmlldmVyLmNsb3NlKGlkKTsJCQkJCSAgICAgICAvLyBUZWxsIHJldHJpZXZlciB3ZSdyZSBkb25lCisJCQlvcGVuID0gZmFsc2U7CQkJCQkJICAgICAgIC8vIEZsYWcgaXQKKwkJfSBjYXRjaCAoUHJvZHVjdEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBNYXJrIGlzIG5vdCBzdXBwb3J0ZWQuCisJICoKKwkgKiBAcGFyYW0gbGltaXQgVW51c2VkIHBhcmFtZXRlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYXJrKGludCBsaW1pdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1hcmsgbm90IHN1cHBvcnRlZCIpOworCX0KKworCS8qKgorCSAqIFJlc2V0IGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVzZXQgbm90IHN1cHBvcnRlZCIpOworCX0KKworCS8qKgorCSAqIE1hcmsvcmVzZXQgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KKwkgKgorCSAqIEByZXR1cm4gRmFsc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gbWFya1N1cHBvdGVkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtJ3MgY2xvc2VkLgorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtJ3MgY2xvc2VkLgorCSAqLworCXByaXZhdGUgZmluYWwgdm9pZCBjaGVja09wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAob3BlbikgcmV0dXJuOworCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKwl9CisKKwkvKiogUHJvZHVjdCBJRC4gKi8KKwlwcml2YXRlIFN0cmluZyBpZDsKKworCS8qKiBXaGF0IGNhbiByZXRyaWV2ZSB0aGUgcHJvZHVjdC4gKi8KKwlwcml2YXRlIFJldHJpZXZlciByZXRyaWV2ZXI7CisKKwkvKiogSG93IGJpZyB0aGUgcHJvZHVjdCBpcy4gKi8KKwlwcml2YXRlIGxvbmcgc2l6ZTsKKworCS8qKiBDdXJyZW50IGJsb2NrIG9yIG51bGwgaWYgdGhlcmUncyBubyBjdXJyZW50IGJsb2NrLiAqLworCXByaXZhdGUgYnl0ZVtdIGJsb2NrOworCisJLyoqIEZyb20gd2hlcmUgaW4gPGNvZGU+YmxvY2s8L2NvZGU+IHRvIHJlYWQuICovCisJcHJpdmF0ZSBpbnQgYmxvY2tJbmRleDsKKworCS8qKiBGcm9tIHdoZXJlIGluIHRoZSBwcm9kdWN0IHRvIHJlYWQgdGhlIG5leHQgYmxvY2suICovCisJcHJpdmF0ZSBsb25nIHByb2R1Y3RJbmRleCA9IDBMOworCisJLyoqIFRydWUgaWYgd2UgZ290IHRvIHRoZSBlbmQgb2YgZmlsZS4gKi8KKwlwcml2YXRlIGJvb2xlYW4gZW9mOworCQorCS8qKiBJcyB0aGUgc3RyZWFtIG9wZW4/ICovCisJcHJpdmF0ZSBib29sZWFuIG9wZW47CisKKwkvKiogU2l6ZSBvZiBjaHVua3MuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMT0NLX1NJWkUgPSBJbnRlZ2VyLmdldEludGVnZXIoIm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5ibG9ja1NpemUiLCA0MDk2KS5pbnRWYWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0xhcmdlUmVzdWx0LmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvTGFyZ2VSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM2MTAyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0xhcmdlUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5SZXRyaWV2ZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvLyBGSVhNRTogY2hhbmdlIE1JTUUgdHlwZSBhcHBsaWNhdGlvbi92bmQuanBsLmxhcmdlLXByb2R1Y3Q/CisKKy8qKgorICogQSA8ZW0+bGFyZ2U8L2VtPiByZXN1bHQgaXMgYSByZXN1bHQgZm9yIDxlbT5sYXJnZTwvZW0+IHByb2R1Y3RzLgorICoKKyAqIFdoYXQgaXMgbGFyZ2U/ICBTb21lIG1pZ2h0IHNheSBsYXJnZSBpcyBzb21ldGhpbmcgdGhhdCBleGNlZWRzIG1vc3Qgb3RoZXIgdGhpbmdzIG9mCisgKiBsaWtlIGtpbmQgaW4gYnVsaywgY2FwYWNpdHksIHF1YW50aXR5LCBzdXBlcmZpY2lhbCBkaW1lbnNpb25zLCBvciBudW1iZXIgb2YgY29uc3RpdHVlbnQKKyAqIHVuaXRzLiAgTGFyZ2UgbWlnaHQgYmUgYmlnLCBncmVhdCwgY2FwYWNpb3VzLCBleHRlbnNpdmUuICBMYXJnZSBtaWdodCBiZSBvcHBvc2VkIHRvCisgKiBzbWFsbDsgYXMsIGEgbGFyZ2UgaG9yc2U7IGEgbGFyZ2UgaG91c2Ugb3Igcm9vbTsgYSBsYXJnZSBsYWtlIG9yIHBvb2w7IGEgbGFyZ2UganVnIG9yCisgKiBzcG9vbjsgYSBsYXJnZSB2aW5leWFyZDsgYSBsYXJnZSBhcm15OyBhIGxhcmdlIGNpdHkuICBTb21lIG1pZ2h0IHNheSB0aGF0IHBhcnRpY3VsYXJseQorICogaWYgdGhleSdyZSBuYW1lZCBXZWJzdGVyLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKKyAqLworcHVibGljIGNsYXNzIExhcmdlUmVzdWx0IGV4dGVuZHMgUmVzdWx0IHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSByZXN1bHQgYSA8Y29kZT5SZXN1bHQ8L2NvZGU+IHZhbHVlLgorCSAqLworCXB1YmxpYyBMYXJnZVJlc3VsdChSZXN1bHQgcmVzdWx0KSB7CisJCXN1cGVyKHJlc3VsdC5nZXRJRCgpLCAiYXBwbGljYXRpb24vdm5kLmpwbC5sYXJnZS1wcm9kdWN0IiwgcmVzdWx0LmdldFByb2ZpbGVJRCgpLCByZXN1bHQuZ2V0UmVzb3VyY2VJRCgpLAorCQkJcmVzdWx0LmdldEhlYWRlcnMoKSwgdHJhbnNmb3JtTWltZVR5cGUocmVzdWx0KSk7CisJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZykgdmFsdWUpOworCQlzdC5uZXh0VG9rZW4oKTsKKwkJdGhpcy5zaXplID0gTG9uZy5wYXJzZUxvbmcoc3QubmV4dFRva2VuKCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+IGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIGlkIFJlc3VsdCBJRC4KKwkgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlLgorCSAqIEBwYXJhbSBwcm9maWxlSUQgUHJvZmlsZSBJRC4KKwkgKiBAcGFyYW0gcmVzb3VyY2VJRCBSZXNvdXJjZSBJRC4KKwkgKiBAcGFyYW0gaGVhZGVycyBIZWFkZXJzLgorCSAqIEBwYXJhbSBzaXplIFNpemUgb2YgdGhlIHByb2R1Y3QuCisJICovCisJcHVibGljIExhcmdlUmVzdWx0KFN0cmluZyBpZCwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgcHJvZmlsZUlELCBTdHJpbmcgcmVzb3VyY2VJRCwgTGlzdCBoZWFkZXJzLCBsb25nIHNpemUpIHsKKwkJc3VwZXIoaWQsICJhcHBsaWNhdGlvbi92bmQuanBsLmxhcmdlLXByb2R1Y3QiLCBwcm9maWxlSUQsIHJlc291cmNlSUQsIGhlYWRlcnMsIG1pbWVUeXBlICsgIiAiICsgc2l6ZSk7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBzaXplIG9mIHRoZSBwcm9kdWN0LgorCSAqCisJICogQHJldHVybiBJdHMgc2l6ZS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgbG9uZyBnZXRTaXplKCkgeworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ1Rva2VuaXplcigoU3RyaW5nKSB2YWx1ZSkubmV4dFRva2VuKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXN1bHQncyB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gYSBTdHJpbmcuCisJICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgYWx3YXlzIHRyZWF0cyBpdHMgdmFsdWUgYXMgaWYgaXQgd2VyZSBhIFN0cmluZy4gIFdvcnNlLAorCSAqIGZvciB2ZXJ5IGxhcmdlIHJlc3VsdHMsIGl0IGNhbm5vdCBjb250YWluIHRoZSBlbnRpcmUgcmVzdWx0IGluIG1lbW9yeS4gIFVzZQorCSAqIHtAbGluayAjZ2V0SW5wdXRTdHJlYW19IGluc3RlYWQgdG8gcGVyZm9ybSBzdHJlYW0gcHJvY2Vzc2luZyBvbiByZXN1bHQgZGF0YS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgT2JqZWN0IGdldFZhbHVlKCkgeworCQlPYmplY3QgdmFsdWUgPSBudWxsOworCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoc2l6ZSA+IEludGVnZXIuTUFYX1ZBTFVFKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCB1c2UgZ2V0VmFsdWUoKSBmb3IgdGhpcyBwcm9kdWN0LCByZXN1bHQgaXMgdG9vIGxhcmdlOyAiCisJCQkJCSsgInVzZSBMYXJnZVJlc3VsdC5nZXRJbnB1dFN0cmVhbSBpbnN0ZWFkIik7CisJCQlpbnQgc2l6ZVRvUmVhZCA9IChpbnQpIHNpemU7CisJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZVRvUmVhZF07CisJCQlpbnQgaW5kZXggPSAwOworCQkJaW50IG51bTsKKwkJCWluID0gZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCXdoaWxlICgobnVtID0gaW4ucmVhZChidWYsIGluZGV4LCBzaXplVG9SZWFkKSkgIT0gLTEpIHsKKwkJCQlpbmRleCArPSBudW07CisJCQkJc2l6ZVRvUmVhZCAtPSBudW07CisJCQkJaWYgKHNpemVUb1JlYWQgPT0gMCkgYnJlYWs7CisJCQl9CisKKwkJCS8vIE9LLCB0aGlzIHN1Y2tzLiAgU3Vja3Mgc3Vja3Mgc3Vja3MuICBMb29rLCBnZXRWYWx1ZSBpcyBub3QgdG8KKwkJCS8vIGJlIHVzZWQgYW55d2F5LiAgSXQgc3Vja3MuICBCdXQgZGFtbWl0LCB0aGVyZSdzIHNvbWUgYW5ub3lpbmcKKwkJCS8vIGNvZGUgb3ZlciBpbiBFRFJOIHdoaWNoIGlzIHVzaW5nIGl0IHdoZW4gdGhleSBzaG91bGQgYmUgdXNpbmcKKwkJCS8vIGdldElucHV0U3RyZWFtLiAgQmFzaWNhbGx5LCBpZiB5b3UgY2FsbCB0aGlzLCB5b3UncmUgYSBob3Nlci4KKwkJCS8vIEFuZCBpZiB5b3UgY2FsbCBpdCBhbmQgeW91J3JlIG5vdCBleHBlY3RpbmcgYSBTdHJpbmcsIHlvdSdyZSBhCisJCQkvLyBsb3Nlci9ob3Nlci4gIERFUFJFQ0FURUQhCisJCQl2YWx1ZSA9IG5ldyBTdHJpbmcoYnVmKTsKKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gIT0gbnVsbCkgdHJ5IHsKKwkJCQlpbi5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCQl9CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKiogU2l6ZSBvZiB0aGUgcHJvZHVjdC4gKi8KKwlwcml2YXRlIGxvbmcgc2l6ZTsKKworCS8qKgorCSAqIEdldCBhbiBpbnB1dCBzdHJlYW0gdGhhdCBzdHJlYW1zIHRoZSByZXN1bHQgZnJvbSB0aGUgcHJvZHVjdCBzZXJ2ZXIuCisJICoKKwkgKiBAcmV0dXJuIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB2YWx1ZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gbmV3IENodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW0oaWQsIHJldHJpZXZlciwgc2l6ZSk7CisJfQorCisJLyoqCisJICogR2l2ZW4gYW4gZXhpc3RpbmcgPGNvZGU+UmVzdWx0PC9jb2RlPiB5aWVsZCBpdHMgTUlNRSB0eXBlLgorCSAqCisJICogVGhlIGV4aXN0aW5nIDxjb2RlPlJlc3VsdDwvY29kZT4gbWlnaHQgYmUgYSA8Y29kZT5MYXJnZVJlc3VsdDwvY29kZT4sIGluIHdoaWNoCisJICogY2FzZSB0aGUgcmVhbCBNSU1FIHR5cGUgaXMgaGlkZGVuIGluIHRoZSB2YWx1ZS4gIE90aGVyd2lzZSwgaXQncyBkaXJlY3RseSBpbgorCSAqIHRoZSBvYmplY3QuCisJICoKKwkgKiBAcGFyYW0gcmVzdWx0IGEgPGNvZGU+UmVzdWx0PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSBNSU1FIHR5cGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyYW5zZm9ybU1pbWVUeXBlKFJlc3VsdCByZXN1bHQpIHsKKwkJaWYgKCJhcHBsaWNhdGlvbi92bmQuanBsLmxhcmdlLXByb2R1Y3QiLmVxdWFscyhyZXN1bHQubWltZVR5cGUpKQorCQkJcmV0dXJuIChTdHJpbmcpIHJlc3VsdC52YWx1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIHJlc3VsdC5taW1lVHlwZSArICIgMCI7CisJfQorCisJLyoqIFNlcmlhbCB2ZXJzaW9uIHVuaXF1ZSBJRC4gKi8KKwlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTk2OTgzODc3NTU5NTcwNTQ0NEw7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9kZWxlZ2F0aW9uLnBuZyBiLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2RlbGVnYXRpb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTg2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9kZWxlZ2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9kZWxlZ2F0aW9uLnBzZCBiLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2RlbGVnYXRpb24ucHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzRkY2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9kZWxlZ2F0aW9uLnBzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9ncmlkLXByb2R1Y3QuanBnIGIvMC4xMC9wcm9kdWN0L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZ3JpZC1wcm9kdWN0LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjExMjZlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZ3JpZC1wcm9kdWN0LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvc2l0ZS54bWwgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyYzk0YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS9zaXRlLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IlByb2R1Y3QgU2VydmljZSI+CisKKyAgPGJvZHk+CisgICAgPGxpbmtzPgorICAgICAgPGl0ZW0gbmFtZT0iT09EVCIgaHJlZj0iLi4vb29kdC1zaXRlLyIvPgorICAgICAgPGl0ZW0gbmFtZT0iR3JpZCIgaHJlZj0iLi4vZ3JpZC8iLz4KKyAgICA8L2xpbmtzPgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJib3R0b20iLz4KKyAgICA8bWVudSBuYW1lPSJVc2VyJ3MgR3VpZGUiPgorICAgICAgPGl0ZW0gbmFtZT0iVHV0b3JpYWxzIiBocmVmPSJ0dXRvcmlhbHMvIi8+CisgICAgICA8aXRlbSBuYW1lPSJQcm9kdWN0IFNlcnZsZXQiIGhyZWY9InNlcnZsZXQvIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy9zZXJ2bGV0L2luZGV4LnhtbCBiLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS94ZG9jL3NlcnZsZXQvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjliZDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy9zZXJ2bGV0L2luZGV4LnhtbApAQCAtMCwwICsxLDI0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPlVzaW5nIHRoZSBQcm9kdWN0IFNlcnZsZXQ8L3RpdGxlPgorICAgIDxhdXRob3IgZW1haWw9ImtlbGx5QGFwYWNoZS5vcmciPlNlYW4gS2VsbHk8L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IlVzaW5nIHRoZSBQcm9kdWN0IFNlcnZsZXQiPgorICAgICAgPHA+VGhlIHF1ZXJ5IHNlcnZsZXQgaXMgbmljZSBmb3IgZ2VuZXJhbCBwdXJwb3NlIHF1ZXJpZXMsIGJ1dCBmb3IKKwl0aG9zZSB3aG8ganVzdCB3YW50IHRvIHJldHJpZXZlIHByb2R1Y3RzLCBpdCdzIGEgYml0IGFubm95aW5nIHRvCisJaGF2ZSB0byBwcm9jZXNzIGFsbCB0aGF0IFhNTCBhbmQgZG8gYmFzZS02NCBjb252ZXJzaW9ucy4gIElzIHRoZXJlCisJYSBzaW1wbGVyIHdheT8gIEFic29sdXRlbHkuICBUaGUgcHJvZHVjdCBzZXJ2bGV0IGRlYWxzIHdpdGgganVzdAorCXByb2R1Y3RzLCBhbmQgZGVsaXZlcnMgdGhlbSBpbiB0aGVpciBhcHByb3ByaWF0ZSBmb3JtIGRpcmVjdCBvdmVyCisJSFRUUC4KKyAgICAgIDwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iUmVxdWlyZW1lbnRzIj4KKworICAgICAgPHA+VGhlIHByb2R1Y3Qgc2VydmxldCBwcm92aWRlcyBIVFRQIGFjY2VzcyB0byBwcm9kdWN0cywgc28KKwluYXR1cmFsbHksIHlvdSdsbCBuZWVkIHRvIHVzZSBhIGxhbmd1YWdlIG9yIHN5c3RlbSB0aGF0IHN1cHBvcnRzCisJSFRUUCBjbGllbnQgYWNjZXNzIHRvIEhUVFAgc2VydmVycy4gIFdoZXJlIGNhbiB5b3UgZmluZCBzdWNoIGEKKwlzeXN0ZW0/ICBZb3VyIGhhbmR5LWRhbmR5IHdlYiBicm93c2VyIGlzIG9uZSEgIE1vc3QgcHJvZ3JhbW1pbmcKKwlsYW5ndWFnZXMgYWxzbyBoYXZlIEhUVFAgQVBJcyBlaXRoZXIgYnVpbHQtaW4gb3IgZnJlZWx5IGF2YWlsYWJsZS4KKyAgICAgIDwvcD4KKworICAgICAgPHA+WW91IGFsc28gbmVlZCB0byBrbm93PC9wPgorCisgICAgICA8dWw+CisJPGxpPlRoZSBVUkwgb2YgdGhlIHByb2R1Y3Qgc2VydmxldCB0aGF0IGhhcyBhY2Nlc3MgdG8gdGhlCisJICBwcm9kdWN0IHNlcnZlciB5b3Ugd2FudCB0byBxdWVyeS48L2xpPgorCTxsaT5UaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHByb2R1Y3Qgc2VydmVyIHlvdSB3YW50IHRvCisJICBhY2Nlc3MuPC9saT4KKwk8bGk+VGhlIGtleXdvcmQgcXVlcnkgZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1bmRlcnN0b29kIGJ5IHRoZQorCSAgcHJvZHVjdCBzZXJ2ZXIuPC9saT4KKyAgICAgIDwvdWw+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIG5hbWU9Ik1ha2luZyBhIFF1ZXJ5Ij4KKworICAgICAgPHA+VGhlIHByb2R1Y3Qgc2VydmxldCBhY2NlcHRzIGVpdGhlciA8Y29kZT5HRVQ8L2NvZGU+IG9yCisJPGNvZGU+UE9TVDwvY29kZT4gcmVxdWVzdHMgb2YgVVJMLWVuY29kZWQgZm9ybSBkYXRhLiAgSW4KKwlyZXNwb25zZSwgaXQgZGVsaXZlcnMgYSBtYXRjaGluZyBwcm9kdWN0IChpZiBhbnkgY2FuIGJlIGZvdW5kKQorCWluIHRoZSBmb3JtYXQgYXBwcm9wcmlhdGUgdG8gdGhlIHByb2R1Y3QncyBNSU1FIHR5cGUuICBZb3UgY2FuCisJYWxzbyByZXF1ZXN0IGEgc3BlY2lmaWMgTUlNRSB0eXBlLiAgSWYgdGhlcmUncyBubyBtYXRjaGluZworCXByb2R1Y3QsIHlvdSBnZXQgSFRUUCBlcnJvciA0MDQgKG5vdCBmb3VuZCkuCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRoZSBwYXJhbWV0ZXJzIHRoYXQgdGhlIHNlcnZsZXQgZXhwZWN0cyBhcmU6PC9wPgorCisgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgorCisJPHRoZWFkPgorCSAgPHRyPgorCSAgICA8dGg+UGFyYW1ldGVyIE5hbWU8L3RoPgorCSAgICA8dGg+T2JsaWdhdGlvbjwvdGg+CisJICAgIDx0aD5NZWFuaW5nPC90aD4KKwkgIDwvdHI+CisJPC90aGVhZD4KKworCTx0Ym9keT4KKwkgIDx0cj4KKwkgICAgPHRkPjxjb2RlPm9iamVjdDwvY29kZT48L3RkPgorCSAgICA8dGQ+T25jZTwvdGQ+CisJICAgIDx0ZD5OYW1lcyB0aGUgcHJvZHVjdCBzZXJ2ZXIgdG8gcmVjZWl2ZSB0aGUgcXVlcnkuICBUaGlzCisJICAgICAgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkIGV4YWN0bHkgb25jZSBhbmQgdGFrZXMgdGhlIGZvcm0KKwkgICAgICA8Y29kZT51cm46ZWRhOjx2YXI+cHJvdG88L3Zhcj46PHZhcj5uYW1lPC92YXI+PC9jb2RlPiwgc3VjaAorCSAgICAgIGFzIDxjb2RlPnVybjplZGE6cm1pOlBEUy5BdG1vcy5Qcm9kdWN0PC9jb2RlPiBmb3IgdGhlCisJICAgICAgUk1JLWFjY2Vzc2VkIEF0bW9zaHBoZXJlcyBub2RlIG9mIHRoZSBQbGFuZXRhcnkgRGF0YSBTeXN0ZW0uCisJICAgIDwvdGQ+CisKKwkgIDwvdHI+CisKKwkgIDx0cj4KKwkgICAgPHRkPjxjb2RlPmtleXdvcmRRdWVyeTwvY29kZT48L3RkPgorCSAgICA8dGQ+T25jZTwvdGQ+CisJICAgIDx0ZD5MaXN0cyB0aGUga2V5d29yZCBxdWVyeSBleHByZXNzaW9uIHRvIHBhc3MgdG8gdGhlCisJICAgICAgcHJvZHVjdCBzZXJ2ZXIsIHN1Y2ggYXMgPGNvZGU+UGF0aWVudElEID0gMTk5Mjg8L2NvZGU+IG9yCisJICAgICAgPGNvZGU+T05MSU5FX0ZJTEVfU1BFQ0lGSUNBVElPTl9OQU1FID0KKwkJZGF0YS9pbWFnZXMvbWFycy5qcGc8L2NvZGU+LgorCSAgICA8L3RkPgorCisJICA8L3RyPgorCisJICA8dHI+CisJICAgIDx0ZD48Y29kZT5pZDwvY29kZT48L3RkPgorCSAgICA8dGQ+Tm9uZSBvciBPbmNlPC90ZD4KKwkgICAgPHRkPk9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGlkZW50aWZpZXMgYSBzaW5nbGUgcHJvZHVjdCB0bworCSAgICAgIHJldHJpZXZlIGlmIG1vcmUgdGhhbiBvbmUgcHJvZHVjdCBtYXRjaC4gIEEgcHJvZHVjdCBzZXJ2ZXIKKwkgICAgICBtYXkgcmV0dXJuIG11bHRpcGxlIG1hdGNoaW5nIHByb2R1Y3RzLiAgQnkgZGVmYXVsdCwgdGhlCisJICAgICAgcHJvZHVjdCBzZXJ2bGV0IHJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIHByb2R1Y3Qgb25seS4gIEJ5CisJICAgICAgc3BlY2lmeWluZyB0aGUgPGNvZGU+aWQ8L2NvZGU+IHBhcmFtZXRlciwgeW91IGNhbiBzZWxlY3QgYQorCSAgICAgIHNwZWNpZmljIHByb2R1Y3Qgd2hlbiBtb3JlIHRoYW4gb25lIG1hdGNoLiAgKEluIHByYWN0aWNlLAorCSAgICAgIG5vdCBhIHNpbmdsZSBwcm9kdWN0IHNlcnZlciA8ZW0+dG8gZGF0ZTwvZW0+IGhhcyBldmVyCisJICAgICAgcmV0dXJuZWQgbW9yZSB0aGFuIG9uZSBtYXRjaC4pCisJICAgIDwvdGQ+CisKKwkgIDwvdHI+CisKKwkgIDx0cj4KKwkgICAgPHRkPjxjb2RlPm1pbWVUeXBlPC9jb2RlPjwvdGQ+CisJICAgIDx0ZD5aZXJvIHRvIE1hbnk8L3RkPgorCSAgICA8dGQ+T3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgbGlzdHMgYWNjZXB0YWJsZSBNSU1FIHR5cGVzIGZvcgorCSAgICAgIHRoZSBwcm9kdWN0IChzZWUgYmVsb3cpLgorCSAgICA8L3RkPgorCisJICA8L3RyPgorCisJPC90Ym9keT4KKyAgICAgIDwvdGFibGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIG5hbWU9Ik1JTUUgVHlwZXMiPgorCisgICAgICA8cD5NYW55IHByb2R1Y3Qgc2VydmVycyBhcmUgY2FwYWJsZSBvZiBjb252ZXJzaW9uIG9mIHByb2R1Y3RzIGZyb20KKwlhIHN5c3RlbS1zcGVjaWZpYyBzdG9yYWdlIG1lZGl1bSBpbnRvIGFuIEludGVybmV0LXN0YW5kYXJkCisJaW50ZXJvcGVyYWJsZSBmb3JtYXQuICBJbnRlcm5ldC1zdGFuZGFyZCBNSU1FIHR5cGVzIGFyZSB3aGF0CisJZHJpdmVzIHRoaXMgbWVjaGFuaXNtLiAgVGhlIHByb2R1Y3Qgc2VydmxldCBjYW4gdGFrZSBhIGxpc3Qgb2YKKwlzcGVjaWZpYyBNSU1FIHR5cGVzIGFuZCBwYXNzIHRoZW0gdG8gdGhlIHByb2R1Y3Qgc2VydmVyIGZvcgorCWNvbnNpZGVyYXRpb24gaW4gcmV0cmlldmluZyB5b3VyIHByb2R1Y3RzLgorICAgICAgPC9wPgorCisgICAgICA8cD5NSU1FIHR5cGUgY29udmVyc2lvbnMgYXJlIGxpa2UgPGVtPnN1Z2dlc3Rpb25zPC9lbT4gdG8gcHJvZHVjdAorCXNlcnZlcnMuICBQcm9kdWN0IHNlcnZlcnMgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gaG9ub3IgYWxsCisJY29udmVyc2lvbnMsIGFuZCBpbmRlZWQgeW91IG1heSB3ZWxsIHJlY2VpdmUgNDA0IChub3QgZm91bmQpIGZvciBhCisJY29udmVyc2lvbiB0aGF0IG1ha2VzIG5vIHNlbnNlIHRvIGEgcGFydGljdWxhciBwcm9kdWN0IHNlcnZlcgorCShzdWNoIGFzIGFuIGF1ZGlvIGNsaXAgdG8gPGNvZGU+dGV4dC9odG1sPC9jb2RlPikuCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRoZSA8Y29kZT5taW1lVHlwZTwvY29kZT4gcGFyYW1ldGVyIGlzIHdoYXQgZHJpdmVzIHRoaXMKKwltZWNoYW5pc20uICBCeSBzcGVjaWZ5aW5nIG9uZSBvciBtb3JlIDxjb2RlPm1pbWVUeXBlPC9jb2RlPgorCXBhcmFtZXRlcnMgaW4geW91ciA8Y29kZT5HRVQ8L2NvZGU+IG9yIDxjb2RlPlBPU1Q8L2NvZGU+IHJlcXVlc3QsCisJeW91IGxpc3QgdGhlIHByZWZlcnJlZCBNSU1FIHR5cGVzIGluIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRoZQorCXByb2R1Y3QgZGVsaXZlcmVkLiAgRnVydGhlcm1vcmUsIHlvdSBjYW4gdXNlIHdpbGRjYXJkcyB0byBmdXJ0aGVyCisJZW5hYmxlIGEgcHJvZHVjdCBzZXJ2ZXIgdG8gc2F0aXNmeSB5b3UuICBUaGUgb3JkZXJpbmcgb2YgdGhlCisJcGFyYW1ldGVycyBpcyBzaWduaWZpY2FudC4KKyAgICAgIDwvcD4KKworICAgICAgPHA+SGVyZSBhcmUgc29tZSBleGFtcGxlcy4gIFN1cHBvc2UgdGhlIHJlcXVlc3QgVVJJIHBhcnQgb2YgdGhlCisJVVJMIGNvbnRhaW5lZDo8L3A+CisKKyAgICAgIDxwcmU+Li4ubWltZVR5cGU9dGV4dC9ydGYmYW1wO21pbWVUeXBlPXRleHQvKi4uLjwvcHJlPgorCisgICAgICA8cD5UaGlzIHNwZWNpZmllcyB0d28gTUlNRSB0eXBlczo8L3A+CisKKyAgICAgIDxvbD4KKwk8bGk+PGNvZGU+dGV4dC9ydGY8L2NvZGU+LCB0aGUgUmljaCBUZXh0IEZvcm1hdCwgaXMgdGhlCisJICBwcmVmZXJyZWQgZm9ybWF0IGZvciBkZWxpdmVyaW5nIHByb2R1Y3RzLgorCTwvbGk+CisKKwk8bGk+PGNvZGU+dGV4dC8qPC9jb2RlPiBtZWFucyBhbnkgdGV4dCB0eXBlLiAgQW55IHRleHQgaXMgYmV0dGVyCisJICB0aGFuIG5vIHRleHQgaWYgZm9yIHNvbWUgcmVhc29uIHRoZSBwcm9kdWN0IHNlcnZlciBjYW4ndCBnaXZlIGEKKwkgIFJpY2ggVGV4dCBGb3JtYXQgcHJvZHVjdC4KKwk8L2xpPgorICAgICAgPC9vbD4KKworICAgICAgPHA+SGVyZSdzIGFub3RoZXIgZXhhbXBsZTo8L3A+CisKKyAgICAgIDxwcmU+Li4ubWltZVR5cGU9aW1hZ2UvcG5nJmFtcDttaW1lVHlwZT1pbWFnZS9qcGVnLi4uPC9wcmU+CisKKyAgICAgIDxwPlRoaXMgaW5kaWNhdGVzIHRoYXQgeW91J2QgbGlrZSBhIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpYworCWZvcm1hdCBpbWFnZSwgaWYgcG9zc2libGUsIGJ1dCB3aWxsIHNldHRsZSBmb3IgYSBKUEVHLUpGSUYgZm9ybWF0CisJaW1hZ2UuICBObyBvdGhlciBpbWFnZSBmb3JtYXQgKGVzcGVjaWFsbHkgbm90IHRoZSBwcm9wcmlldGFyeSBhbmQKKwlhbmNpZW50IEdJRiBmb3JtYXQpIGlzIGFjY2VwdGFibGUuICBBZGRpbmcgYW4gYWRkaXRpb25hbAorCTxjb2RlPiZhbXA7bWltZVR5cGU9aW1hZ2UvKjwvY29kZT4gd291bGQgbWVhbiBhbnkgaW1hZ2UgZm9ybWF0CisJd291bGQgYmUgZmluZS4gIEFkZGluZyA8Y29kZT4mYW1wO21pbWVUeXBlPSovKjwvY29kZT4gbWVhbnMKKwk8ZW0+YW55IGZvcm1hdDwvZW0+IHdvdWxkIGJlIGFjY2VwdGFibGUsIGJlIGl0IGF1ZGlvLCB2aWRlbywgdGV4dCwKKwlpbWFnZSwgb3Igb3RoZXJ3aXNlLgorICAgICAgPC9wPgorCisgICAgICA8cD5JZiB0aGVyZSBhcmUgPGVtPm5vPC9lbT4gPGNvZGU+bWltZVR5cGU8L2NvZGU+IHBhcmFtZXRlcnMsIHRoZW4KKwl0aGUgcHJvZHVjdCBzZXJ2bGV0IHVzZXMgYSBkZWZhdWx0IGxpc3QgY29udGFpbmluZyBqdXN0CisJPGNvZGU+Ki8qPC9jb2RlPiwgbWVhbmluZyBhbnkgdHlwZSBpcyBmaW5lLgorICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBuYW1lPSJFeGFtcGxlIj4KKworICAgICAgPHA+VG8gcmV0cmlldmUgYW4gaW1hZ2Ugb2YgTWFycyBmcm9tIHRoZSBQRFMgcHJvZHVjdCBzZXJ2ZXIgYXQgdGhlCisJSW1hZ2luZyBOb2RlLCBpbiBQTkcgZm9ybWF0IGlmIHBvc3NpYmxlIGFuZCBhbnkgaW1hZ2UgZm9ybWF0CisJb3RoZXJ3aXNlLCB0cnkgdGhlIGZvbGxvd2luZzoKKyAgICAgIDwvcD4KKworICAgICAgPHA+PGNvZGU+PGEKKwkgICAgaHJlZj0iaHR0cDovL3N0YXJicml0ZS5qcGwubmFzYS5nb3YvcHJvZD9taW1lVHlwZT1pbWFnZS9wbmcmYW1wO21pbWVUeXBlPWltYWdlLyomYW1wO29iamVjdD11cm46ZWRhOnJtaTpQRFMuSW1nLlByb2R1Y3QmYW1wO2tleXdvcmRRdWVyeT1PTkxJTkVfRklMRV9TUEVDSUZJQ0FUSU9OX05BTUUrJTNEK3RodW1ibmFpbC9tZ3MtbS1tb2MtbmFfd2EtMi1zZHAtbDAtdjEuMC9tZ3NjXzEwODIvbTA5MDYzL20wOTA2MzUyLmltcS5qcGciPmh0dHA6Ly9zdGFyYnJpdGUuanBsLm5hc2EuZ292L3Byb2Q/PGJyLz5taW1lVHlwZT1pbWFnZS9wbmcmYW1wOzxici8+bWltZVR5cGU9aW1hZ2UvKiZhbXA7PGJyLz5vYmplY3Q9dXJuOmVkYTpybWk6UERTLkltZy5Qcm9kdWN0JmFtcDs8YnIvPmtleXdvcmRRdWVyeT1PRlNOKyUzRCt0aHVtYm5haWwvbWdzLW0tbW9jLW5hX3dhLTItc2RwLWwwLXYxLjAvbWdzY18xMDgyL20wOTA2My9tMDkwNjM1Mi5pbXEuanBnPC9hPjwvY29kZT48L3A+CisKKyAgICAgIDxwPlRoaXMgVVJMIGNvbnRhaW5zIGxpbmVicmVha3MgZm9yIHJlYWRhYmlsaXR5IG9ubHkuICBMZXQncyB0YWtlCisJdGhpcyBVUkwgYXBhcnQgdG8gc2VlIHdoYXQncyBnb2luZyBvbjoKKyAgICAgIDwvcD4KKworICAgICAgPHVsPgorCTxsaT5UaGUgVVJMIHRvIHRoZSBwcm9kdWN0IHNlcnZsZXQgaW4gdGhpcyBjYXNlIGlzCisJICA8Y29kZT5odHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9wcm9kPC9jb2RlPi4gIE9mdGVuIHRoZSBVUkwKKwkgIHdpbGwgdGFrZSB0aGlzIGZvcm0sIG9yIG1heSBiZQorCSAgPGNvZGU+aHR0cDovLzx2YXI+aG9zdG5hbWU8L3Zhcj4vc2VydmxldC9qcGwub29kdC5zZXJ2bGV0cy5Qcm9kdWN0U2VydmxldDwvY29kZT4uCisJICBNb3N0IHBlb3BsZSBwcmVmZXIgdGhlIHNob3J0ZXIgZm9ybS4KKwk8L2xpPgorCisJPGxpPlRoZSBxdWVzdGlvbiBtYXJrIDxjb2RlPj88L2NvZGU+IHNlcGFyYXRlcyB0aGUgcmVxdWVzdCBVUkkKKwkgIGZyb20gaXRzIHBhcmFtZXRlcnMuCisJPC9saT4KKworCTxsaT5UaGUgZmlyc3QgcGFyYW1ldGVyLCA8Y29kZT5taW1lVHlwZT1pbWFnZS9wbmc8L2NvZGU+LCBzYXlzCisJICB0aGF0IFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgaW1hZ2VzIGFyZSBwcmVmZXJyZWQuCisJPC9saT4KKworCTxsaT5UaGUgc2Vjb25kIHBhcmFtZXRlciwgPGNvZGU+bWltZVR5cGU9aW1hZ2UvKjwvY29kZT4sIHNheXMKKwkgIHRoYXQgaWYgdGhlIHByb2R1Y3Qgc2VydmVyIGNhbid0IGNvbnZlcnQgdG8gb3Igb3RoZXIgcHJvdmlkZQorCSAgUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyBmb3JtYXQgaW1hZ2VzLCB0aGVuIDxlbT5hbnkgaW1hZ2UKKwkgICAgZm9ybWF0PC9lbT4gaXMgYWNjZXB0YWJsZS4KKwk8L2xpPgorCisJPGxpPlRoZSB0aGlyZCBwYXJhbWV0ZXIsCisJICA8Y29kZT5vYmplY3Q9dXJuOmVkYTpybWk6UERTLkltZy5Qcm9kdWN0PC9jb2RlPiwgaWRlbnRpZmllcyB0aGUKKwkgIHByb2R1Y3Qgc2VydmVyLgorCTwvbGk+CisKKwk8bGk+VGhlIGZvdXJ0aCBwYXJhbWV0ZXIsIDxjb2RlPmtleXdvcmRRdWVyeT0uLi48L2NvZGU+IG5hbWVzCisJICB0aGUgcXVlcnkgZXhwcmVzc2lvbi4gIEluIHRoaXMgY2FzZSwgaXQncyA8Y29kZT5PRlNOID0KKwkgICAgdGh1bWJuYWlsL21ncy1tLW1vYy1uYV93YS0yLXNkcC1sMC12MS4wL21nc2NfMTA4Mi9tMDkwNjMvbTA5MDYzNTIuaW1xLmpwZzwvY29kZT4uCisJPC9saT4KKyAgICAgIDwvdWw+CisKKyAgICAgIDxwPlRoZSByZXNwb25zZSB0byB0aGlzIFVSTCdzIEdFVCByZXF1ZXN0IGlzIGEgSlBFRy1KRklGIGltYWdlCisJKHNvcnJ5LCBQTkcncyBub3QgeWV0IGF2YWlsYWJsZSBmcm9tIHRoZSBQRFMgSW1hZ2UgTm9kZSkKKwljb250YWluaW5nIGEgcGljdHVyZSBvZiBzb21lIHBsYW5ldGFyeSBzdXJmYWNlLiAgTmVhdCwgaHVoPworICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS94ZG9jL3R1dG9yaWFscy9pbmRleC54bWwgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy90dXRvcmlhbHMvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxMzBlYTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy90dXRvcmlhbHMvaW5kZXgueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzxkb2N1bWVudD4NCisgIDxwcm9wZXJ0aWVzPg0KKyAgICA8dGl0bGU+UHJvZHVjdCBTZXJ2aWNlIFR1dG9yaWFsczwvdGl0bGU+DQorICAgIDxhdXRob3IgZW1haWw9IlNlYW4uS2VsbHlAanBsLm5hc2EuZ292Ij5TZWFuIEtlbGx5PC9hdXRob3I+DQorICA8L3Byb3BlcnRpZXM+DQorDQorICA8Ym9keT4NCisgICAgPHNlY3Rpb24gbmFtZT0iUHJvZHVjdCBTZXJ2aWNlIFR1dG9yaWFscyI+DQorICAgICAgPHA+VGhlIGZvbGxvd2luZyB0dXRvcmlhbHMgYXJlIGF2YWlsYWJsZTo8L3A+DQorICAgICAgPHVsPg0KKwk8bGk+PGEgaHJlZj0iLi9wcyI+WW91ciBGaXJzdCBQcm9kdWN0IFNlcnZpY2U8L2E+PC9saT4NCisJPGxpPjxhIGhyZWY9Ii4vcWgiPkRldmVsb3BpbmcgYSBRdWVyeSBIYW5kbGVyPC9hPjwvbGk+DQorCTxsaT48YSBocmVmPSIuL2xoIj5TZXJ2aW5nIExhcmdlIFByb2R1Y3RzPC9hPjwvbGk+DQorICAgICAgPC91bD4NCisgICAgPC9zZWN0aW9uPg0KKyAgPC9ib2R5Pg0KKzwvZG9jdW1lbnQ+DQorDQorDQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy9zaXRlL3hkb2MvdHV0b3JpYWxzL2xoL2luZGV4LnhtbCBiLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS94ZG9jL3R1dG9yaWFscy9saC9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2IzZGUwMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS94ZG9jL3R1dG9yaWFscy9saC9pbmRleC54bWwKQEAgLTAsMCArMSw3MTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzxkb2N1bWVudD4NCisgIDxwcm9wZXJ0aWVzPg0KKyAgICA8dGl0bGU+U2VydmluZyBMYXJnZSBQcm9kdWN0czwvdGl0bGU+DQorICAgIDxhdXRob3IgZW1haWw9IlNlYW4uS2VsbHlAanBsLm5hc2EuZ292Ij5TZWFuIEtlbGx5PC9hdXRob3I+DQorICA8L3Byb3BlcnRpZXM+DQorDQorICA8Ym9keT4NCisgICAgPHNlY3Rpb24gbmFtZT0iU2VydmluZyBMYXJnZSBQcm9kdWN0cyI+DQorICAgICAgPHA+SW4gdGhlIDxhIGhyZWY9Ii4uL3FoLyI+bGFzdCB0dXRvcmlhbDwvYT4sIHdlIGNyZWF0ZWQgYSBxdWVyeQ0KKwloYW5kbGVyIGFuZCAiaW5zdGFsbGVkIiBpdCBpbiBhIHByb2R1Y3Qgc2VydmVyLiAgV2UgY291bGQNCisJcXVlcnkgaXQgZm9yIHByb2R1Y3RzIChtYXRoZW1hdGljYWwgY29uc3RhbnRzKSB1c2luZyB0aGUNCisJWE1MUXVlcnkncyBwb3N0Zml4IGJvb2xlYW4gc3RhY2tzLiAgVGhlIGhhbmRsZXIgd291bGQgcmV0dXJuDQorCXJlc3VsdHMgYnkgZW1iZWRkaW5nIHRoZW0gaW4gdGhlIHJldHVybmVkIFhNTFF1ZXJ5LiAgTm93IHdlJ2xsDQorCXJldHVybiBsYXJnZXIgcHJvZHVjdHMgdGhhdCBsaXZlIG91dHNpZGUgb2YgdGhlIFhNTFF1ZXJ5Lg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSJXaGF0J3MgTGFyZ2U/Ij4NCisgICAgICA8cD5UaGVyZSdzIGEgPGENCisJICBocmVmPSJodHRwOi8vd3d3Lndvcmxkc2xhcmdlc3R0aGluZ3MuY29tL2NhbGlmb3JuaWEvY2xhbS5odG0iPmdpYW50DQorCSAgY2xhbTwvYT4gYXQgUGlzbW8gQmVhY2gsIGEgPGENCisJICBocmVmPSJodHRwOi8vd3d3Lndvcmxkc2xhcmdlc3R0aGluZ3MuY29tL2thbnNhcy9jYXdrZXJjaXR5Lmh0bSI+Z2lhbnQNCisJICBiYWxsIG9mIHR3aW5lPC9hPiBpbiBLYW5zYXMsIGFuZCBmb3IgdGhvc2Ugd2hvIGRyaXZlIFNVVnMsIGENCisJICA8YQ0KKwkgIGhyZWY9Imh0dHA6Ly93d3cud29ybGRzbGFyZ2VzdHRoaW5ncy5jb20vbWlzc291cmkvZ2FzcHVtcC5odG0iPmdpYW50DQorCSAgZ2FzIHB1bXA8L2E+LiAgRm9yIHRoZSBPT0RUIGZyYW1ld29yaywgbGFyZ2UgaXMgc2ltaWxhcmx5IGhhcmQgdG8gZGVmaW5lLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5PbmUgb2YgdGhlIG9yaWdpbmFsIGFyY2hpdGVjdHMgb2YgdGhlIE9PRFQgZnJhbWV3b3JrIHRob3VnaHQNCisJdGhhdCBwdXR0aW5nIGEgcHJvZHVjdHMgcmVzdWx0IGluIHdpdGggdGhlIHF1ZXJ5IG1lYW50IHRoYXQNCisJeW91J2QgbmV2ZXIgbG9zZSB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHByb2R1Y3QgYW5kIHRoZSBxdWVyeQ0KKwl0aGF0IGdlbmVyYXRlZCBpdC4gIEknbSBub3Qgc3VyZSBJIHNlZSB0aGUgdmFsdWUgaW4gdGhhdCwgYnV0DQorCXJlZ2FyZGxlc3MsIGl0IHBvc2VkIGEgcHJhY3RpY2FsIGNoYWxsZW5nZTogYW4NCisJPGNvZGU+WE1MUXVlcnk8L2NvZGU+IG9iamVjdCBpbiBtZW1vcnkgd2l0aCBvbmUgb3IgdHdvIGxhcmdlDQorCXJlc3VsdHMgaW4gaXQgd2lsbCBleGhhdXN0IHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZSdzIGF2YWlsYWJsZQ0KKwltZW1vcnkuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkl0J3MgZXZlbiB3b3JzZSBpbiB3aGVuIHRoZSBYTUxRdWVyeSBpcyBleHByZXNzZWQgYXMgYQ0KKwl0ZXh0dWFsIFhNTCBkb2N1bWVudC4gIEluIHRoaXMgY2FzZSwgYSBiaW5hcnkgcHJvZHVjdCBtdXN0IGJlDQorCWVuY29kZWQgaW4gYSB0ZXh0IGZvcm1hdCAod2UgdXNlIDxhDQorCWhyZWY9ImZ0cDovL2Z0cC5yZmMtZWRpdG9yLm9yZy9pbi1ub3Rlcy9yZmMyMDQ1LnR4dCI+QmFzZTY0PC9hPiksDQorCW1ha2luZyB0aGUgWE1MUXVlcnkgaW4gWE1MIGZvcm1hdCBldmVuIGxhcmdlciB0aGFuIGFzIGEgSmF2YQ0KKwlvYmplY3QuICBNb3Jlb3ZlciwgdGhvc2UgWE1MIGRvY3VtZW50cyBtdXN0IGJlIHBhcnNlZCBhdCBzb21lDQorCXRpbWUgdG8gcmVjb25zdGl0dXRlIHRoZW0gYXMgSmF2YSBvYmplY3RzLiAgV2UgdXNlIGEgRE9NLWJhc2VkDQorCXBhcnNlciwgd2hpY2ggaG9sZHMgdGhlIGVudGlyZSBkb2N1bWVudCBpbiBtZW1vcnkuICBOYXR1cmFsbHksDQorCXRoaW5ncyB0ZW5kIHRvIGV4cGxvZGUgYXQgdGhpcyByYXRlLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5UaGVyZSBpcyBhIHdheSBvdXQgb2YgdGhlIHF1YWdtaXJlLCB0aG91Z2guICBJbnN0ZWFkIG9mDQorCXdyaXRpbmcgYSA8Y29kZT5RdWVyeUhhbmRsZXI8L2NvZGU+LCB3cml0ZSBhDQorCTxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4uICBBDQorCTxjb2RlPlF1ZXJ5SGFuZGxlcjwvY29kZT4gcHV0cyA8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdHMNCisJaW50byB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IHdoaWNoIGhvbGQgdGhlIGVudGlyZSBwcm9kdWN0Lg0KKwlBIDxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4gcHV0cw0KKwk8Y29kZT5MYXJnZVJlc3VsdDwvY29kZT4gb2JqZWN0cyB3aGljaCBob2xkIDxlbT5hIHJlZmVyZW5jZSB0bw0KKwl0aGUgcHJvZHVjdDwvZW0+Lg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSJMYXJnZSBIYW5kbGVycyBhbmQgTGFyZ2UgUmVzdWx0cyI+DQorICAgICAgPHA+VGhlIE9PRFQgZnJhbWV3b3JrIHByb3ZpZGVzIGFuIGV4dGVuc2lvbiB0byB0aGUNCisJPGNvZGU+UXVlcnlIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UgY2FsbGVkDQorCTxjb2RlPmpwbC5lZGEucHJvZHVjdC5MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXI8L2NvZGU+LiAgVGhpcw0KKwlpbnRlcmZhY2UgYWRkcyB0d28gbWV0aG9kcyB0aGF0IHlvdSBtdXN0IGltcGxlbWVudDoNCisgICAgICA8L3A+DQorDQorICAgICAgPHVsPg0KKwk8bGk+PGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4uICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgYnl0ZQ0KKwkgIGFycmF5IHJlcHJlc2VudGluZyBhIGNodW5rIG9mIHRoZSBwcm9kdWN0LiAgVGhlIE9PRFQNCisJICBmcmFtZXdvcmsgY2FsbHMgdGhpcyBtZXRob2QgcmVwZWF0ZWRseSB0byBnYXRoZXIgY2h1bmtzIG9mDQorCSAgdGhlIHByb2R1Y3QgZm9yIHRoZSBwcm9kdWN0IGNsaWVudC4gIEl0IHRha2VzIGEgPGVtPnByb2R1Y3QNCisJICBJRDwvZW0+IChhIHN0cmluZykgdGhhdCBpZGVudGlmaWVzIHdoaWNoIHByb2R1Y3QgaXMgYmVpbmcNCisJICByZXRyaWV2ZWQuICBJdCBhbHNvIHRha2VzIGFuIGJ5dGUgb2Zmc2V0IGludG8gdGhlIHByb2R1Y3QNCisJICBkYXRhIGFuZCBhIHNpemUgb2YgdGhlIGJ5dGUgY2h1bmsgdG8gcmV0dXJuLiAgWW91IHJldHVybiB0aGUNCisJICBtYXRjaGluZyBjaHVuay4NCisJPC9saT4NCisNCisJPGxpPjxjb2RlPmNsb3NlPC9jb2RlPi4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgT09EVA0KKwkgIGZyYW1ld29yayB0byB0ZWxsIHRoZSBxdWVyeSBoYW5kbGVyIGl0J3MgZG9uZSBnZXR0aW5nIGENCisJICBwcm9kdWN0LiAgSXQgdGFrZXMgYSA8ZW0+cHJvZHVjdCBJRDwvZW0+IHRoYXQgdGVsbHMgd2hpY2gNCisJICBwcm9kdWN0IGlzIG5vIGxvbmdlciBiZWluZyByZXRyaWV2ZWQuICBZb3UgdXNlIHRoaXMgbWV0aG9kDQorCSAgdG8gcGVyZm9ybSBhbnkgY2xlYW51cCBuZWNlc3NhcnkuDQorCTwvbGk+DQorICAgICAgPC91bD4NCisJICANCisgICAgICA8cD5CZWNhdXNlIGl0IGV4dGVuZHMgdGhlIDxjb2RlPlF1ZXJ5SGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLA0KKwl5b3Ugc3RpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIDxjb2RlPnF1ZXJ5PC9jb2RlPiBtZXRob2QuDQorCUhvd2V2ZXIsIGFzIGEgPGNvZGU+TGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyPC9jb2RlPiwgeW91IGNhbg0KKwlhZGQgPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+IG9iamVjdHMgdG8gdGhlDQorCTxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBwYXNzZWQgaW4uICA8Y29kZT5MYXJnZVJlc3VsdDwvY29kZT5zDQorCWlkZW50aWZ5IHRoZSA8ZW0+cHJvZHVjdCBJRDwvZW0+IChzdHJpbmcpIHRoYXQgdGhlIE9PRFQNCisJZnJhbWV3b3JrIHdpbGwgbGF0ZXIgdXNlIHdoZW4gaXQgY2FsbHMNCisJPGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4gYW5kIDxjb2RlPmNsb3NlPC9jb2RlPi4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91J3JlIHNlcnZpbmcgbGFyZ2UgaW1hZ2VzIGJ5DQorCWdlbmVyYXRpbmcgdGhlbSBmcm9tIHZhcmlvdXMgb3RoZXIgZGF0YSBzb3VyY2VzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8b2w+DQorCTxsaT5UaGUgPGNvZGU+cXVlcnk8L2NvZGU+IG1ldGhvZCB3b3VsZCBleGFtaW5lIHRoZSB1c2VyJ3MNCisJICBxdWVyeSwgY29uc3VsdCB0aGUgdmFyaW91cyBkYXRhIHNvdXJjZXMsIGFuZCBnZW5lcmF0ZSB0aGUNCisJICBpbWFnZSwgc3RvcmluZyBpdCBpbiBhIHRlbXBvcmFyeSBmaWxlLiAgSXQgd291bGQgYWxzbyBhc3NpZ24NCisJICBhIHN0cmluZyA8ZW0+cHJvZHVjdCBJRDwvZW0+IHRvIHRoaXMgZmlsZSwgdXNlIHRoYXQgcHJvZHVjdA0KKwkgIElEIGluIGEgPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+IG9iamVjdCwgYWRkIHRoZQ0KKwkgIDxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPiB0byB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+LCBhbmQNCisJICByZXR1cm4gdGhlIG1vZGlmaWVkIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPi4NCisJPC9saT4NCisNCisJPGxpPlNob3J0bHkgYWZ0ZXJ3YXJkLCB0aGUgT09EVCBmcmFtZXdvcmsgd2lsbCByZXBlYXRlZGx5IGNhbGwNCisJICB0aGUgPGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4gbWV0aG9kLiAgVGhpcyBtZXRob2Qgd291bGQNCisJICBjaGVjayB0aGUgPGVtPnByb2R1Y3QgSUQ8L2VtPiBwYXNzZWQgaW4gYW5kIGxvY2F0ZSB0aGUNCisJICBjb3JyZXNwb25kaW5nIHRlbXBvcmFyeSBmaWxlIGdlbmVyYXRlZCBlYXJsaWVyIGJ5IHRoZQ0KKwkgIDxjb2RlPnF1ZXJ5PC9jb2RlPiBtZXRob2QuICBJdCB3b3VsZCBpbmRleCBpbnRvIHRoZSBmaWxlIGJ5DQorCSAgdGhlIG9mZnNldCByZXF1ZXN0ZWQgYnkgdGhlIGZyYW1ld29yaywgcmVhZCB0aGUgbnVtYmVyIG9mDQorCSAgYnl0ZXMgcmVxdWVzdGVkIGJ5IHRoZSBmcmFtZXdvcmssIHBhY2thZ2UgdGhhdCB1cCBpbnRvIGENCisJICBieXRlIGFycmF5LCBhbmQgcmV0dXJuIGl0LiAgRXZlbnR1YWxseSwgdGhlIE9PRFQgZnJhbWV3b3JrDQorCSAgd2lsbCBoYXZlIHJlYWQgdGhlIGVudGlyZSBwcm9kdWN0IHRoaXMgd2F5Lg0KKwk8L2xpPg0KKw0KKwk8bGk+TGFzdGx5LCB0aGUgT09EVCBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoZQ0KKwkgIDxjb2RlPmNsb3NlPC9jb2RlPiBtZXRob2QuICBUaGlzIG1ldGhvZCB3b3VsZCBjaGVjayB0aGUNCisJICA8ZW0+cHJvZHVjdCBJRDwvZW0+IGFuZCBsb2NhdGUgYW5kIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5DQorCSAgZmlsZS4NCisJPC9saT4NCisgICAgICA8L29sPg0KKw0KKyAgICAgIDxwPlRvIHB1dCB0aGlzIGludG8gcHJhY3RpY2UsIGxldCdzIGNyZWF0ZSBhDQorCTxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4gdGhhdCBzZXJ2ZXMgZmlsZXMgb3V0IG9mDQorCXRoZSBwcm9kdWN0IHNlcnZlcidzIGZpbGVzeXN0ZW0uDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IldyaXRpbmcgdGhlIEhhbmRsZXIiPg0KKyAgICAgIDxwPldlJ2xsIGRldmVsb3AgYSA8Y29kZT5GaWxlSGFuZGxlcjwvY29kZT4gdGhhdCB3aWxsIHNlcnZlDQorCWZpbGVzIG91dCBvZiB0aGUgcHJvZHVjdCBzZXJ2ZXIncyBmaWxlc3lzdGVtLiAgUHJvdmlkaW5nDQorCWZpbGVzeXN0ZW0gYWNjZXNzIHRocm91Z2ggdGhlIE9PRFQgZnJhbWV3b3JrIGluIHRoaXMgd2F5IGlzDQorCXByb2JhYmx5IG5vdCBhIHZlcnkgZ29vZCBpZGVhIChhZnRlciBhbGwsIHByb2R1Y3QgY2xpZW50cw0KKwljb3VsZCByZXF1ZXN0IGNvcGllcyBvZiBzZW5zaXRpdmUgZmlsZXMpLCBidXQgZm9yIGENCisJZGVtb25zdHJhdGlvbiBpdCdsbCBkby4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+QmVjYXVzZSBmaWxlcyBjYW4gYmUgcXVpdGUgbGFyZ2UsIHdlJ2xsIHVzZSBhDQorCTxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4uICBJdCB3aWxsIHNlcnZlIHF1ZXJpZXMNCisJb2YgdGhlIGZvcm0NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+PGNvZGU+ZmlsZSA9IDx2YXI+cGF0aDwvdmFyPjwvY29kZT48L3A+DQorDQorICAgICAgPHA+d2hlcmUgPHZhcj5wYXRoPC92YXI+IGlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgdGhlIHVzZXINCisJd2FudHMuICBUaGUgaGFuZGxlciB3aWxsIGFkZCA8Y29kZT5MYXJnZVJlc3VsdDwvY29kZT5zIHRvIHRoZQ0KKwlYTUxRdWVyeSwgYW5kIHRoZSA8ZW0+cHJvZHVjdCBJRDwvZW0+IHdpbGwganVzdCBzaW1wbHkgYmUgdGhlDQorCTx2YXI+cGF0aDwvdmFyPiBvZiB0aGUgcmVxdWVzdGVkIGZpbGUuICBUaGUNCisJPGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4gbWV0aG9kIHdpbGwgb3BlbiB0aGUgZmlsZSB3aXRoIHRoZQ0KKwlnaXZlbiBwcm9kdWN0IElEICh3aGljaCBpcyBqdXN0IHRoZSBwYXRoIHRvIHRoZSBmaWxlKSBhbmQNCisJcmV0dXJuIGEgYmxvY2sgb2YgZGF0YSBvdXQgb2YgaXQuICBUaGUgPGNvZGU+Y2xvc2U8L2NvZGU+DQorCW1ldGhvZCB3b24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLCBzaW5jZSB3ZSdyZSBub3QgY3JlYXRpbmcNCisJdGVtcG9yYXJ5IGZpbGVzIG9yIG1ha2luZyBuZXR3b3JrIGNvbm5jZXRpb25zIG9yIGFueXRoaW5nOw0KKwl0aGVyZSdzIGp1c3Qgbm90aGluZyB0byBjbGVhbiB1cC4NCisgICAgICA8L3A+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iR2V0dGluZyB0aGUgUGF0aCI+DQorCTxwPkZpcnN0LCBsZXQncyBjcmVhdGUgYSB1dGlsaXR5IG1ldGhvZCB0aGF0IHRha2VzIHRoZQ0KKwkgIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBhbmQgcmV0dXJucyBhIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4NCisJICB0aGF0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBmaWxlLiAgQmVjYXVzZSB0aGUgcXVlcnkgdGFrZXMgdGhlIGZvcm0NCisJPC9wPg0KKw0KKwk8cD48Y29kZT5maWxlID0gPHZhcj5wYXRoPC92YXI+PC9jb2RlPjwvcD4NCisNCisJPHA+dGhlcmUgc2hvdWxkIGJlIHRocmVlIDxjb2RlPlF1ZXJ5RWxlbWVudDwvY29kZT5zIG9uIHRoZSAid2hlcmUiIHN0YWNrOjwvcD4NCisNCisJPG9sPg0KKwkgIDxsaT5UaGUgemVyb3RoICh0b3Btb3N0KSBoYXMgcm9sZSA9IDxjb2RlPmVsZW1OYW1lPC9jb2RlPg0KKwkgICAgYW5kIHZhbHVlID0gPGNvZGU+ZmlsZTwvY29kZT4uDQorCSAgPC9saT4NCisJICA8bGk+VGhlIGZpcnN0IChtaWRkbGUpIGhhcyByb2xlID0gPGNvZGU+TElURVJBTDwvY29kZT4gYW5kDQorCSAgICB2YWx1ZSA9IHRoZSA8dmFyPnBhdGg8L3Zhcj4gb2YgdGhlIGZpbGUgdGhlIHVzZXIgd2FudHMuDQorCSAgPC9saT4NCisJICA8bGk+VGhlIGxhc3QgKGJvdHRvbSkgaGFzIHJvbGUgPSA8Y29kZT5SRUxPUDwvY29kZT4gYW5kDQorCSAgICB2YWx1ZSA9IDxjb2RlPkVRPC9jb2RlPi4NCisJICA8L2xpPg0KKwk8L29sPg0KKw0KKwk8cD5XZSdsbCByZWplY3QgYW55IG90aGVyIHF1ZXJ5IGJ5IHJldHVybmluZyA8Y29kZT5udWxsPC9jb2RlPg0KKwkgIGZyb20gdGhpcyBtZXRob2QuICBGdXJ0aGVyLCBpZiB0aGUgZmlsZSBuYW1lZCBieSB0aGUNCisJICA8dmFyPnBhdGg8L3Zhcj4gZG9lc24ndCBleGlzdCwgb3IgaWYgaXQncyBub3QgYSBmaWxlIChmb3INCisJICBleGFtcGxlLCBpdCdzIGEgZGlyZWN0b3J5IG9yIGEgc29ja2V0KSwgd2UnbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Lg0KKwk8L3A+DQorDQorCTxwPkhlcmUncyB0aGUgc3RhcnQgb2Ygb3VyIDxjb2RlPkZpbGVIYW5kbGVyLmphdmE8L2NvZGU+OjwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQganBsLmVkYS5wcm9kdWN0LkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjsNCitpbXBvcnQganBsLmVkYS54bWxxdWVyeS5RdWVyeUVsZW1lbnQ7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuWE1MUXVlcnk7DQorcHVibGljIGNsYXNzIEZpbGVIYW5kbGVyDQorICBpbXBsZW1lbnRzIExhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlciB7DQorICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEZpbGUoWE1MUXVlcnkgcSkgew0KKyAgICBMaXN0IHN0YWNrID0gcS5nZXRXaGVyZUVsZW1lbnRTZXQoKTsNCisgICAgaWYgKHN0YWNrLnNpemUoKSAhPSAzKSByZXR1cm4gbnVsbDsNCisgICAgUXVlcnlFbGVtZW50IGUgPSAoUXVlcnlFbGVtZW50KSBzdGFjay5nZXQoMCk7DQorICAgIGlmICghImVsZW1OYW1lIi5lcXVhbHMoZS5nZXRSb2xlKCkpDQorICAgICAgfHwgISJmaWxlIi5lcXVhbHMoZS5nZXRWYWx1ZSgpKSkNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgZSA9IChRdWVyeUVsZW1lbnQpIHN0YWNrLmdldCgyKTsNCisgICAgaWYgKCEiUkVMT1AiLmVxdWFscyhlLmdldFJvbGUoKSkNCisgICAgICB8fCAhIkVRIi5lcXVhbHMoZS5nZXRWYWx1ZSgpKSkNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgZSA9IChRdWVyeUVsZW1lbnQpIHN0YWNrLmdldCgxKTsgICAJICAgIA0KKyAgICBpZiAoISJMSVRFUkFMIi5lcXVhbHMoZS5nZXRSb2xlKCkpKQ0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShlLmdldFZhbHVlKCkpOw0KKyAgICBpZiAoIWZpbGUuaXNGaWxlKCkpIHJldHVybiBudWxsOw0KKyAgICByZXR1cm4gZmlsZTsNCisgIH0NCit9PC9zb3VyY2U+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNoZWNraW5nIHRoZSBNSU1FIFR5cGUiPg0KKwk8cD5SZWNhbGwgdGhhdCB0aGUgdXNlciBjYW4gc2F5IHdoYXQgTUlNRSB0eXBlcyBvZiBwcm9kdWN0cw0KKwkgIGFyZSBhY2NlcHRhYmxlIGJ5IHNwZWNpZnlpbmcgdGhlIHByZWZlcmVuY2UgbGlzdCBpbiB0aGUNCisJICBYTUxRdWVyeS4gIFRoaXMgbGV0cyBhIHByb2R1Y3Qgc2VydmVyIHRoYXQgc2VydmVzLCBzYXksDQorCSAgdmlkZW8gY2xpcHMsIGNvbnZlcnQgdGhlbSB0byA8Y29kZT52aWRlby9tcGVnPC9jb2RlPg0KKwkgIChNUEVHLTIpLCA8Y29kZT52aWRlby9tcGVnNC1nZW5lcmljPC9jb2RlPiAoTVBFRy00KSwNCisJICA8Y29kZT52aWRlby9xdWlja3RpbWU8L2NvZGU+IChBcHBsZSBRdWlja3RpbWUpLCBvciBzb21lDQorCSAgb3RoZXIgZm9ybWF0LCBpbiBvcmRlciB0byBiZXR0ZXIgc2VydmUgaXRzIGNsaWVudHMuDQorCTwvcD4NCisNCisJPHA+U2luY2Ugb3VyIHByb2R1Y3Qgc2VydmVyIGp1c3Qgc2VydmVzIDxlbT5maWxlcyBvZiBhbnkNCisJICAgIGZvcm1hdDwvZW0+LCB3ZSB3b24ndCByZWFsbHkgYm90aGVyIHdpdGggdGhlIGxpc3Qgb2YNCisJICAgIGFjY2VwdGFibGUgTUlNRSB0eXBlcy4gIEFmdGVyIGFsbCwgdGhlDQorCSAgICA8Y29kZT4vZXRjL3Bhc3N3ZDwvY29kZT4gZmlsZSA8ZW0+Y291bGQ8L2VtPiBiZSBhIEpQRUcNCisJICAgIGltYWdlIG9uIHNvbWUgc3lzdGVtcy4gIChZZXMsIHdlIGNvdWxkIGdvIHRocm91Z2ggdGhlDQorCSAgICBleHRyYSBzdGVwIG9mIGRldGVybWluaW5nIHRoZSBNSU1FIHR5cGUgb2YgYSBmaWxlIGJ5DQorCSAgICBsb29raW5nIGF0IGl0cyBleHRlbnNpb24gb3IgaXRzIGNvbnRlbnRzLCBidXQgdGhpcyBpcyBhbg0KKwkgICAgT09EVCB0dXRvcmlhbCwgbm90IGEgc29tZXRoaW5nLWVsc2UtdHV0b3JpYWwhKQ0KKwk8L3A+DQorDQorCTxwPkhvd2V2ZXIsIHdlIHdpbGwgaG9ub3IgdGhlIHVzZXIncyB3aXNoZXMgYnkgbGFiZWxpbmcgdGhlDQorCSAgcmVzdWx0J3MgTUlNRSB0eXBlIGJhc2VkIG9uIHdoYXQgdGhlIHVzZXIgc3BlY2lmaWVzIGluIHRoZQ0KKwkgIGFjY2VwdGFibGUgTUlNRSB0eXBlIGxpc3QuICBTbywgaWYgdGhlIHByb2R1Y3QgY2xpZW50IHNheXMNCisJICB0aGF0IDxjb2RlPmltYWdlL2pwZWc8L2NvZGU+IGlzIGFjY2VwdGFibGUgYW5kIHRoZSBmaWxlIGlzDQorCSAgPGNvZGU+L2V0Yy9wYXNzd2Q8L2NvZGU+LCB3ZSdsbCBjYWxsDQorCSAgPGNvZGU+L2V0Yy9wYXNzd2Q8L2NvZGU+IGEgSlBFRyBpbWFnZS4gIEhvd2V2ZXIsIHdlIHdvbid0DQorCSAgdHJ5IHRvIHJlYWQgdGhlIGNsaWVudCdzIG1pbmQ6IGlmIHRoZSB1c2VyIHdhbnRzDQorCSAgPGNvZGU+aW1hZ2UvKjwvY29kZT4sIHRoZW4gd2UnbGwganVzdCBzYXkgaXQncyBhIGJpbmFyeQ0KKwkgIGZpbGUsIDxjb2RlPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvY29kZT4uDQorCTwvcD4NCisNCisJPHA+SGVyZSdzIHRoZSBjb2RlOjwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKy4uLg0KK3B1YmxpYyBjbGFzcyBGaWxlSGFuZGxlcg0KKyAgaW1wbGVtZW50cyBMYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIgew0KKyAgLi4uDQorICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGUoWE1MUXVlcnkgcSkgew0KKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxLmdldE1pbWVBY2NlcHQoKS5pdGVyYXRvcigpOw0KKyAgICAgIGkuaGFzTmV4dCgpOykgew0KKyAgICAgIFN0cmluZyB0ID0gKFN0cmluZykgaS5uZXh0KCk7DQorICAgICAgaWYgKHQuaW5kZXhPZignKicpID09IC0xKSByZXR1cm4gdDsNCisgICAgfQ0KKyAgICByZXR1cm4gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7DQorICB9DQorfTwvc291cmNlPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbnNlcnRpbmcgdGhlIFJlc3VsdCI+DQorCTxwPk9uY2Ugd2UndmUgZ290IHRoZSBmaWxlIHRoYXQgdGhlIHVzZXIgd2FudHMgYW5kIHRoZSBNSU1FDQorCSAgdHlwZSB0byBjYWxsIGl0LCBhbGwgd2UgaGF2ZSB0byBkbyBpcyBpbnNlcnQgdGhlDQorCSAgPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+LiAgUmVtZW1iZXIgdGhhdCBpdCdzIHRoZQ0KKwkgIDxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPiB0aGF0IHRlbGxzIHRoZSBPT0RUIGZyYW1ld29yayB3aGF0DQorCSAgdGhlIDxlbT5wcm9kdWN0IElEPC9lbT4gaXMgZm9yIGxhdGVyDQorCSAgPGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4gYW5kIDxjb2RlPmNsb3NlPC9jb2RlPiBjYWxscy4NCisJICBUaGUgPGVtPnByb2R1Y3QgSUQ8L2VtPiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvDQorCSAgdGhlIDxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPiBjb25zdHJ1Y3Rvci4NCisJPC9wPg0KKw0KKwk8cD5XZSdsbCB3cml0ZSBhIHV0aWxpdHkgbWV0aG9kIHRvIGluc2VydCB0aGUgPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+OjwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqcGwuZWRhLnhtbHF1ZXJ5LkxhcmdlUmVzdWx0Ow0KKy4uLg0KK3B1YmxpYyBjbGFzcyBGaWxlSGFuZGxlcg0KKyAgaW1wbGVtZW50cyBMYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIgew0KKyAgLi4uDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydChGaWxlIGZpbGUsIFN0cmluZyB0eXBlLA0KKyAgICBYTUxRdWVyeSBxKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICBTdHJpbmcgaWQgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsNCisgICAgbG9uZyBzaXplID0gZmlsZS5sZW5ndGgoKTsNCisgICAgTGFyZ2VSZXN1bHQgbHIgPSBuZXcgTGFyZ2VSZXN1bHQoaWQsIHR5cGUsDQorICAgICAgLypwcm9maWxlSUQqL251bGwsIC8qcmVzb3VyY2VJRCovbnVsbCwNCisgICAgICAvKmhlYWRlcnMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIHNpemUpOw0KKyAgICBxLmdldFJlc3VsdHMoKS5hZGQobHIpOw0KKyAgfQ0KK308L3NvdXJjZT4NCisNCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nSGFuZGxpbmcgdGhlIFF1ZXJ5Jz4NCisJPHA+V2l0aCBvdXIgdGhyZWUgdXRpbGl0eSBtZXRob2RzIGluIGhhbmQsIHdyaXRpbmcgdGhlDQorCSAgcmVxdWlyZWQgPGNvZGU+cXVlcnk8L2NvZGU+IG1ldGhvZCBpcyBhIHBpZWNlIG9mIGNha2UuICBIZXJlDQorCSAgaXQgaXM6DQorCTwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQganBsLmVkYS5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247DQorLi4uDQorcHVibGljIGNsYXNzIEZpbGVIYW5kbGVyDQorICBpbXBsZW1lbnRzIExhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlciB7DQorICAuLi4NCisgIHB1YmxpYyBYTUxRdWVyeSBxdWVyeShYTUxRdWVyeSBxKQ0KKyAgICB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7DQorICAgIHRyeSB7DQorICAgICAgRmlsZSBmaWxlID0gZ2V0RmlsZShxKTsNCisgICAgICBpZiAoZmlsZSA9PSBudWxsKSByZXR1cm4gcTsNCisgICAgICBTdHJpbmcgdHlwZSA9IGdldE1pbWVUeXBlKHEpOw0KKyAgICAgIGluc2VydChmaWxlLCB0eXBlLCBxKTsNCisgICAgICByZXR1cm4gcTsNCisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCisgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbihleCk7DQorICAgIH0NCisgIH0NCit9PC9zb3VyY2U+DQorDQorCTxwPlRoZSA8Y29kZT5xdWVyeTwvY29kZT4gbWV0aG9kIGFzIGRlZmluZWQgYnkgdGhlDQorCSAgPGNvZGU+UXVlcnlIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UgKGFuZCBleHRlbmRlZCBpbnRvIHRoZQ0KKwkgIDxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlKSBpcyBhbGxvd2VkDQorCSAgdG8gdGhyb3cgb25seSBvbmUga2luZCBvZiBjaGVja2VkIGV4Y2VwdGlvbjoNCisJICA8Y29kZT5Qcm9kdWN0RXhjZXB0aW9uPC9jb2RlPi4gIFNvLCBpbiBjYXNlIHRoZQ0KKwkgIDxjb2RlPmluc2VydDwvY29kZT4gbWV0aG9kIHRocm93cyBhbg0KKwkgIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPiwgd2UgdHJhbnNmb3JtIGl0IGludG8gYQ0KKwkgIDxjb2RlPlByb2R1Y3RFeGNlcHRpb248L2NvZGU+Lg0KKwk8L3A+DQorDQorCTxwPk5vdyB0aGVyZSBhcmUganVzdCB0d28gbW9yZSByZXF1aXJlZCBtZXRob2RzIHRvIGltcGxlbWVudCwNCisJICA8Y29kZT5yZXRyaWV2ZUNodW5rPC9jb2RlPiBhbmQgPGNvZGU+Y2xvc2U8L2NvZGU+Lg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J0Jsb3dpbmcgQ2h1bmtzJz4NCisJPHA+VGhlIE9PRFQgZnJhbWV3b3JrIHJlcGVhdGVkbHkgY2FsbHMgaGFuZGxlcidzDQorCSAgPGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4gbWV0aG9kIHRvIGdldCBjaHVua3Mgb2YgdGhlDQorCSAgcHJvZHVjdCwgZXZlbnV0YWxseSBnZXR0aW5nIHRoZSBlbnRpcmUgcHJvZHVjdCAodW5sZXNzIHRoZQ0KKwkgIHByb2R1Y3QgY2xpZW50IGRlY2lkZXMgdG8gYWJvcnQgdGhlIHRyYW5zZmVyKS4gIEZvciBvdXIgZmlsZQ0KKwkgIGhhbmRsZXIsIHJldHJpZXZlIGNodW5rIGp1c3QgaGFzIHRvDQorCTwvcD4NCisJPG9sPg0KKwkgIDxsaT5NYWtlIHN1cmUgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+cHJvZHVjdCBJRDwvZW0+DQorCSAgICBzdGlsbCBleGlzdHMgKGFmdGVyIGFsbCwgaXQgY291bGQgYmUgZGVsZXRlZCBhdCBhbnkgdGltZSwNCisJICAgIGV2ZW4gYmVmb3JlIHRoZSBmaXJzdCA8Y29kZT5yZXRyaWV2ZUNodW5rPC9jb2RlPiBnb3QNCisJICAgIGNhbGxlZCkuDQorCSAgPC9saT4NCisJICA8bGk+T3BlbiB0aGUgZmlsZS48L2xpPg0KKwkgIDxsaT5Ta2lwIGludG8gdGhlIGZpbGUgYnkgdGhlIHJlcXVlc3RlZCBvZmZzZXQuPC9saT4NCisJICA8bGk+UmVhZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBvdXQgb2YgdGhlIGZpbGUuPC9saT4NCisJICA8bGk+UmV0dXJuIHRob3NlIGJ5dGVzLjwvbGk+DQorCSAgPGxpPkNsb3NlIHRoZSBmaWxlLjwvbGk+DQorCTwvb2w+DQorDQorCTxwPldlJ2xsIHdyaXRlIGEgcXVpY2sgbGl0dGxlIDxjb2RlPnNraXA8L2NvZGU+IG1ldGhvZCB0byBza2lwDQorCSAgaW50byBhIGZpbGUncyBpbnB1dCBzdHJlYW06DQorCTwvcD4NCisNCisJPHNvdXJjZT5wcml2YXRlIHN0YXRpYyB2b2lkIHNraXAobG9uZyBvZmZzZXQsDQorICBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgIHdoaWxlIChvZmZzZXQgPiAwKQ0KKyAgICBvZmZzZXQgLT0gaW4uc2tpcChvZmZzZXQpOw0KK308L3NvdXJjZT4NCisNCisJPHA+QW5kIGhlcmUncyBhbm90aGVyIGxpdHRsZSB1dGlsaXR5IG1ldGhvZCB0byByZWFkIGENCisJICBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIG91dCBvZiBhIGZpbGUncyBpbnB1dCBzdHJlYW06DQorCTwvcD4NCisNCisJPHNvdXJjZT5wcml2YXRlIHN0YXRpYyBieXRlW10gcmVhZChpbnQgbGVuZ3RoLA0KKyAgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsNCisgIGludCBudW1SZWFkOw0KKyAgaW50IGluZGV4ID0gMDsNCisgIGludCB0b1JlYWQgPSBsZW5ndGg7DQorICB3aGlsZSAodG9SZWFkID4gMCkgew0KKyAgICBudW1SZWFkID0gaW4ucmVhZChidWYsIGluZGV4LCB0b1JlYWQpOw0KKyAgICBpbmRleCArPSBudW1SZWFkOw0KKyAgICB0b1JlYWQgLT0gbnVtUmVhZDsNCisgIH0NCisgIHJldHVybiBidWY7DQorfTwvc291cmNlPg0KKw0KKwk8cD4oQnkgbm93LCB5b3UncmUgcHJvYmFibHkgd29uZGVyaW5nIHdoeSB3ZSBqdXN0IGRpZG4ndCB1c2UNCisJICA8Y29kZT5qYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU8L2NvZGU+OyBJJ20gd29uZGVyaW5nIHRoYXQNCisJICB0b28hKTwvcD4NCisNCisJPHA+RmluYWxseSwgd2UgY2FuIGltcGxlbWVudCB0aGUgcmVxdWlyZWQNCisJICA8Y29kZT5yZXRyaWV2ZUNodW5rPC9jb2RlPiBtZXRob2Q6DQorCTwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCisuLi4NCitwdWJsaWMgY2xhc3MgRmlsZUhhbmRsZXINCisgIGltcGxlbWVudHMgTGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyIHsNCisgIC4uLg0KKyAgcHVibGljIGJ5dGVbXSByZXRyaWV2ZUNodW5rKFN0cmluZyBpZCwgbG9uZyBvZmZzZXQsDQorICAgIGludCBsZW5ndGgpIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uIHsNCisgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG51bGw7DQorICAgIHRyeSB7DQorICAgICAgRmlsZSBmID0gbmV3IEZpbGUoaWQpOw0KKyAgICAgIGlmICghZi5pc0ZpbGUoKSkgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oaWQNCisgICAgICAgICsgIiBpc24ndCBhIGZpbGUgKGFueW1vcmU/KSIpOw0KKyAgICAgIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmKSk7DQorICAgICAgc2tpcChvZmZzZXQsIGluKTsNCisgICAgICBieXRlW10gYnVmID0gcmVhZChsZW5ndGgsIGluKTsNCisgICAgICByZXR1cm4gYnVmOw0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KKyAgICAgIHRocm93IG5ldyBQcm9kdWN0RXhjZXB0aW9uKGV4KTsNCisgICAgfSBmaW5hbGx5IHsNCisgICAgICBpZiAoaW4gIT0gbnVsbCkgdHJ5IHsNCisgICAgICAgIGluLmNsb3NlKCk7DQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQ0KKyAgICB9DQorICB9DQorfTwvc291cmNlPg0KKw0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSdDbG9zaW5nIFVwJz4NCisJPHA+QmVjYXVzZSB0aGUgT09EVCBmcmFtZXdvcmsgaGFzIG5vIGlkZWEgd2hhdCBkYXRhIHNvdXJjZXMgYQ0KKwkgIDxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4gd2lsbCBldmVudHVhbGx5DQorCSAgY29uc3VsdCwgd2hhdCB0ZW1wb3JhcnkgZmlsZXMgaXQgbWF5IG5lZWQgdG8gY2xlYW4gdXAsIHdoYXQNCisJICBuZXR3b3JrIHNvY2tldHMgaXQgbWlnaHQgbmVlZCB0byBzaHV0IGRvd24sIGFuZCBzbyBmb3J0aCwgaXQNCisJICBuZWVkcyBzb21lIHdheSB0byBpbmRpY2F0ZSB0byBhIHF1ZXJ5IGhhbmRsZXIgdGhhdCdzIGl0J3MNCisJICBkb25lIGNhbGxpbmcgPGNvZGU+cmV0cmlldmVDaHVuazwvY29kZT4gZm9yIGEgY2VydGFpbg0KKwkgIDxlbT5wcm9kdWN0IElEPC9lbT4uICBUaGUgPGNvZGU+Y2xvc2U8L2NvZGU+IG1ldGhvZCBkb2VzIHRoaXMuDQorCTwvcD4NCisNCisJPHA+SW4gb3VyIGV4YW1wbGUsIDxjb2RlPmNsb3NlPC9jb2RlPiBkb2Vzbid0IG5lZWQgdG8gZG8NCisJICBhbnl0aGluZywgYnV0IHdlIGFyZSBvYmxpZ2F0ZWQgdG8gaW1wbGVtZW50IGl0Og0KKwk8L3A+DQorDQorCTxzb3VyY2U+Li4uDQorcHVibGljIGNsYXNzIEZpbGVIYW5kbGVyDQorICBpbXBsZW1lbnRzIExhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlciB7DQorICAuLi4NCisgIHB1YmxpYyB2b2lkIGNsb3NlKFN0cmluZyBpZCkge30NCit9PC9zb3VyY2U+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J0NvbXBsZXRlIFNvdXJjZSBDb2RlJz4NCisJPHA+SGVyZSdzIHRoZSBjb21wbGV0ZSBzb3VyY2UgZmlsZSwgPGNvZGU+RmlsZUhhbmRsZXIuamF2YTwvY29kZT46PC9wPg0KKwk8c291cmNlPmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQganBsLmVkYS5wcm9kdWN0LkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjsNCitpbXBvcnQganBsLmVkYS5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuTGFyZ2VSZXN1bHQ7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuUXVlcnlFbGVtZW50Ow0KK2ltcG9ydCBqcGwuZWRhLnhtbHF1ZXJ5LlhNTFF1ZXJ5Ow0KKw0KK3B1YmxpYyBjbGFzcyBGaWxlSGFuZGxlcg0KKyAgaW1wbGVtZW50cyBMYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIgew0KKyAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRGaWxlKFhNTFF1ZXJ5IHEpIHsNCisgICAgTGlzdCBzdGFjayA9IHEuZ2V0V2hlcmVFbGVtZW50U2V0KCk7DQorICAgIGlmIChzdGFjay5zaXplKCkgIT0gMykgcmV0dXJuIG51bGw7DQorICAgIFF1ZXJ5RWxlbWVudCBlID0gKFF1ZXJ5RWxlbWVudCkgc3RhY2suZ2V0KDApOw0KKyAgICBpZiAoISJlbGVtTmFtZSIuZXF1YWxzKGUuZ2V0Um9sZSgpKQ0KKyAgICAgIHx8ICEiZmlsZSIuZXF1YWxzKGUuZ2V0VmFsdWUoKSkpDQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIGUgPSAoUXVlcnlFbGVtZW50KSBzdGFjay5nZXQoMik7DQorICAgIGlmICghIlJFTE9QIi5lcXVhbHMoZS5nZXRSb2xlKCkpDQorICAgICAgfHwgISJFUSIuZXF1YWxzKGUuZ2V0VmFsdWUoKSkpDQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIGUgPSAoUXVlcnlFbGVtZW50KSBzdGFjay5nZXQoMSk7ICAgCSAgICANCisgICAgaWYgKCEiTElURVJBTCIuZXF1YWxzKGUuZ2V0Um9sZSgpKSkNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZS5nZXRWYWx1ZSgpKTsNCisgICAgaWYgKCFmaWxlLmlzRmlsZSgpKSByZXR1cm4gbnVsbDsNCisgICAgcmV0dXJuIGZpbGU7DQorICB9DQorICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGUoWE1MUXVlcnkgcSkgew0KKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxLmdldE1pbWVBY2NlcHQoKS5pdGVyYXRvcigpOw0KKyAgICAgIGkuaGFzTmV4dCgpOykgew0KKyAgICAgIFN0cmluZyB0ID0gKFN0cmluZykgaS5uZXh0KCk7DQorICAgICAgaWYgKHQuaW5kZXhPZignKicpID09IC0xKSByZXR1cm4gdDsNCisgICAgfQ0KKyAgICByZXR1cm4gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7DQorICB9DQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydChGaWxlIGZpbGUsIFN0cmluZyB0eXBlLA0KKyAgICBYTUxRdWVyeSBxKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICBTdHJpbmcgaWQgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsNCisgICAgbG9uZyBzaXplID0gZmlsZS5sZW5ndGgoKTsNCisgICAgTGFyZ2VSZXN1bHQgbHIgPSBuZXcgTGFyZ2VSZXN1bHQoaWQsIHR5cGUsDQorICAgICAgLypwcm9maWxlSUQqL251bGwsIC8qcmVzb3VyY2VJRCovbnVsbCwNCisgICAgICAvKmhlYWRlcnMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIHNpemUpOw0KKyAgICBxLmdldFJlc3VsdHMoKS5hZGQobHIpOw0KKyAgfQ0KKyAgcHVibGljIFhNTFF1ZXJ5IHF1ZXJ5KFhNTFF1ZXJ5IHEpDQorICAgIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uIHsNCisgICAgdHJ5IHsNCisgICAgICBGaWxlIGZpbGUgPSBnZXRGaWxlKHEpOw0KKyAgICAgIGlmIChmaWxlID09IG51bGwpIHJldHVybiBxOw0KKyAgICAgIFN0cmluZyB0eXBlID0gZ2V0TWltZVR5cGUocSk7DQorICAgICAgaW5zZXJ0KGZpbGUsIHR5cGUsIHEpOw0KKyAgICAgIHJldHVybiBxOw0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KKyAgICAgIHRocm93IG5ldyBQcm9kdWN0RXhjZXB0aW9uKGV4KTsNCisgICAgfQ0KKyAgfQ0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBza2lwKGxvbmcgb2Zmc2V0LA0KKyAgICBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgd2hpbGUgKG9mZnNldCA+IDApDQorICAgICAgb2Zmc2V0IC09IGluLnNraXAob2Zmc2V0KTsNCisgIH0NCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkKGludCBsZW5ndGgsDQorICAgIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsNCisgICAgaW50IG51bVJlYWQ7DQorICAgIGludCBpbmRleCA9IDA7DQorICAgIGludCB0b1JlYWQgPSBsZW5ndGg7DQorICAgIHdoaWxlICh0b1JlYWQgPiAwKSB7DQorICAgICAgbnVtUmVhZCA9IGluLnJlYWQoYnVmLCBpbmRleCwgdG9SZWFkKTsNCisgICAgICBpbmRleCArPSBudW1SZWFkOw0KKyAgICAgIHRvUmVhZCAtPSBudW1SZWFkOw0KKyAgICB9DQorICAgIHJldHVybiBidWY7DQorICB9DQorICBwdWJsaWMgYnl0ZVtdIHJldHJpZXZlQ2h1bmsoU3RyaW5nIGlkLCBsb25nIG9mZnNldCwNCisgICAgaW50IGxlbmd0aCkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24gew0KKyAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbnVsbDsNCisgICAgdHJ5IHsNCisgICAgICBGaWxlIGYgPSBuZXcgRmlsZShpZCk7DQorICAgICAgaWYgKCFmLmlzRmlsZSgpKSB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbihpZA0KKyAgICAgICAgKyAiIGlzbid0IGEgZmlsZSAoYW55bW9yZT8pIik7DQorICAgICAgaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsNCisgICAgICBza2lwKG9mZnNldCwgaW4pOw0KKyAgICAgIGJ5dGVbXSBidWYgPSByZWFkKGxlbmd0aCwgaW4pOw0KKyAgICAgIHJldHVybiBidWY7DQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQorICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oZXgpOw0KKyAgICB9IGZpbmFsbHkgew0KKyAgICAgIGlmIChpbiAhPSBudWxsKSB0cnkgew0KKyAgICAgICAgaW4uY2xvc2UoKTsNCisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9DQorICAgIH0NCisgIH0NCisgIHB1YmxpYyB2b2lkIGNsb3NlKFN0cmluZyBpZCkge30NCit9PC9zb3VyY2U+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9J0NvbXBpbGluZyB0aGUgQ29kZSc+DQorICAgICAgPHA+V2UnbGwgY29tcGlsZSB0aGlzIGNvZGUgdXNpbmcgdGhlIEoyU0RLIGNvbW1hbmQtbGluZSB0b29scywNCisJYnV0IGlmIHlvdSdyZSBtb3JlIGNvbWZvcnRhYmxlIHdpdGggc29tZSBraW5kIG9mIEludGVncmF0ZWQNCisJRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSksIGFkanVzdCBhcyBuZWNlc3NhcnkuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkxldCdzIGdvIGJhY2sgYWdhaW4gdG8gdGhlIDxjb2RlPiRQU19IT01FPC9jb2RlPiBkaXJlY3Rvcnkgd2UNCisJbWFkZSBlYXJsaWVyOyBjcmVhdGUgdGhlIGZpbGUNCisJPGNvZGU+JFBTX0hPTUUvc3JjL0ZpbGVIYW5kbGVyLmphdmE8L2NvZGU+IHdpdGggdGhlIGNvbnRlbnRzDQorCXNob3duIGFib3ZlLiAgVGhlbiwgY29tcGlsZSBhbmQgdXBkYXRlIHRoZSBqYXIgZmlsZSBhcyBmb2xsb3dzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c291cmNlPiUgPGI+amF2YWMgLWV4dGRpcnMgbGliIFwNCisgIC1kIGNsYXNzZXMgc3JjL0ZpbGVIYW5kbGVyLmphdmE8L2I+DQorJSA8Yj5scyAtbCBjbGFzc2VzPC9iPg0KK3RvdGFsIDgNCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgMjUyNCAyNSBGZWIgMTU6NDYgQ29uc3RhbnRIYW5kbGVyLmNsYXNzDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgIDMxNjMgMjYgRmViIDE2OjE1IEZpbGVIYW5kbGVyLmNsYXNzDQorJSA8Yj5qYXIgLXVmIGxpYi9teS1oYW5kbGVycy5qYXIgXA0KKyAgLUMgY2xhc3NlcyBGaWxlSGFuZGxlci5jbGFzczwvYj4NCislIDxiPmphciAtdGYgbGliL215LWhhbmRsZXJzLmphcjwvYj4NCitNRVRBLUlORi8NCitNRVRBLUlORi9NQU5JRkVTVC5NRg0KK0NvbnN0YW50SGFuZGxlci5jbGFzcw0KK0ZpbGVIYW5kbGVyLmNsYXNzPC9zb3VyY2U+DQorDQorICAgICAgPHA+V2UndmUgbm93IGdvdCBhIGphciB3aXRoIHRoZSA8Y29kZT5Db25zdGFudEhhbmRsZXI8L2NvZGU+DQorCWZyb20gdGhlIDxhIGhyZWY9Ii4uL3FoLyI+bGFzdCB0dXRvcmlhbDwvYT4gYW5kIG91ciBuZXcNCisJPGNvZGU+RmlsZUhhbmRsZXI8L2NvZGU+Lg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSdTcGVjaWZ5aW5nIGFuZCBSdW5uaW5nIHRoZSBOZXcgUXVlcnkgSGFuZGxlcic+DQorICAgICAgPHA+VGhlIDxjb2RlPiRQU19IT01FL2Jpbi9wczwvY29kZT4gc2NyaXB0IGFscmVhZHkgaGFzIGEgc3lzdGVtDQorCXByb3BlcnR5IHNwZWNpZnlpbmcgdGhlIDxjb2RlPkNvbnN0YW50SGFuZGxlcjwvY29kZT4sIHNvIHdlDQorCWp1c3QgbmVlZCB0byBhZGQgdGhlIDxjb2RlPkZpbGVIYW5kbGVyPC9jb2RlPiB0byB0aGF0IGxpc3QuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkZpcnN0LCBzdG9wIHRoZSBwcm9kdWN0IHNlcnZlciBieSBoaXR0aW5nIENUUkwrQyAob3IgeW91cg0KKwlpbnRlcnJ1cHQga2V5KSBpbiB0aGUgd2luZG93IGluIHdoaWNoIGl0J3MgY3VycmVudGx5IHJ1bm5pbmcuDQorCVRoZW4sIG1vZGlmeSB0aGUgPGNvZGU+JFBTX0hPTUUvYmluL3BzPC9jb2RlPiBzY3JpcHQgdG8gcmVhZA0KKwlhcyBmb2xsb3dzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c291cmNlPiMhL2Jpbi9zaA0KK2V4ZWMgamF2YSAtRGphdmEuZXh0LmRpcnM9JFBTX0hPTUUvbGliIFwNCisgICAgLURoYW5kbGVycz1Db25zdGFudEhhbmRsZXIsRmlsZUhhbmRsZXIgXA0KKyAgICBqcGwuZWRhLkV4ZWNTZXJ2ZXIgXA0KKyAgICBqcGwuZWRhLnByb2R1Y3Qucm1pLlByb2R1Y3RTZXJ2aWNlSW1wbCBcDQorICAgIHVybjplZGE6cm1pOk15UHJvZHVjdFNlcnZpY2U8L3NvdXJjZT4NCisNCisgICAgICA8cD5UaGVuIHN0YXJ0IHRoZSBzZXJ2ZXIgYnkgcnVubmluZw0KKwk8Y29kZT4kUFNfSE9NRS9iaW4vcHM8L2NvZGU+LiAgSWYgYWxsIGdvZXMgd2VsbCwgdGhlIHByb2R1Y3QNCisJc2VydmVyIHdpbGwgYmUgcmVhZHkgdG8gYW5zd2VyIHF1ZXJpZXMgYWdhaW4sIHRoaXMgdGltZQ0KKwlwYXNzaW5nIGVhY2ggaW5jb21pbmcgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IHRvIDxlbT50d288L2VtPg0KKwlkaWZmZXJlbnQgcXVlcnkgaGFuZGxlcnMuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkVkaXQgdGhlIDxjb2RlPiRQU19IT01FL2Jpbi9wYzwvY29kZT4gc2NyaXB0IG9uY2UgbW9yZSB0bw0KKwltYWtlIHN1cmUgdGhlIDxjb2RlPi1vdXQ8L2NvZGU+IGFuZCBub3QgdGhlIDxjb2RlPi14bWw8L2NvZGU+DQorCWNvbW1hbmQtbGluZSBhcmd1bWVudCBpcyBiZWluZyB1c2VkLiAgTGV0J3MgdHJ5IHF1ZXJ5aW5nIGZvciBhDQorCWZpbGU6DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+JSA8Yj4kUFNfSE9NRS9iaW4vcGMgImZpbGUgPSAvZXRjL3Bhc3N3ZCI8L2I+DQorbm9ib2R5Oio6LTI6LTI6VW5wcml2aWxlZ2VkIFVzZXI6LzovdXNyL2Jpbi9mYWxzZQ0KK3Jvb3Q6KjowOjA6U3lzdGVtIEFkbWluaXN0cmF0b3I6L3Zhci9yb290Oi9iaW4vc2gNCitkYWVtb246KjoxOjE6U3lzdGVtIFNlcnZpY2VzOi92YXIvcm9vdDovdXNyL2Jpbi9mYWxzZQ0KKy4uLjwvc291cmNlPg0KKw0KKyAgICAgIDxwPklmIHlvdSBsaWtlLCB5b3UgY2FuIGNoYW5nZSB0aGUgPGNvZGU+LW91dDwvY29kZT4gdG8NCisJPGNvZGU+LXhtbDwvY29kZT4gYWdhaW4gYW5kIGV4YW1pbmUgdGhlIFhNTCB2ZXJzaW9uLiAgVGhpcw0KKwl0aW1lLCB0aGUgcHJvZHVjdCBkYXRhIGlzbid0IGluIHRoZSBYTUxRdWVyeSBvYmplY3QuDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IldoYXQncyB0aGUgRGlmZmVyZW5jZT8iPg0KKyAgICAgIDxwPk9uIHRoZSBjbGllbnQgc2lkZSwgdGhlIGludGVyZmFjZSB0byBnZXQgcHJvZHVjdCByZXN1bHRzIGluDQorCTxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPnMgdmVyc3VzIHJlZ3VsYXIgPGNvZGU+UmVzdWx0PC9jb2RlPnMNCisJaXMgaWRlbnRpY2FsLiAgVGhlIGNsaWVudCBjYWxscyA8Y29kZT5nZXRJbnB1dFN0cmVhbTwvY29kZT4gdG8NCisJZ2V0IGEgYmluYXJ5IHN0cmVhbSB0byByZWFkIHRoZSBwcm9kdWN0IGRhdGEuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPlRoZXJlIGlzIGEgc3BlZWQgcGVuYWx0eSBmb3IgbGFyZ2UgcmVzdWx0cy4gIFdoYXQNCisJPGNvZGU+UmVzdWx0LmdldElucHV0U3RyZWFtPC9jb2RlPiByZXR1cm5zIGlzIGFuIGlucHV0IHN0cmVhbQ0KKwl0byBwcm9kdWN0IGRhdGEgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIFhNTFF1ZXJ5LiAgSXQncyBhDQorCXN0cmVhbSB0byBhIGJ1ZmZlciBhbHJlYWR5IGluIHRoZSBjbGllbnQncyBhZGRyZXNzIHNwYWNlLCBzbw0KKwlpdCdzIG5pY2UgYW5kIGZhc3QuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPjxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPiBvdmVycmlkZXMgdGhlDQorCTxjb2RlPmdldElucHV0U3RyZWFtPC9jb2RlPiBtZXRob2QgdG8gaW5zdGVhZCByZXR1cm4gYW4gaW5wdXQNCisJc3RyZWFtIHRoYXQgcmVwZWF0ZWRseSBtYWtlcyBjYWxscyBiYWNrIHRvIHRoZSBwcm9kdWN0DQorCXNlcnZlcidzIDxjb2RlPnJldHJpZXZlQ2h1bms8L2NvZGU+IG1ldGhvZC4gIFNpbmNlIHRoZSBwcm9kdWN0DQorCWlzIDxlbT5ub3Q8L2VtPiBhbHJlYWR5IGluIHRoZSBsb2NhbCBhZGRyZXNzIHNwYWNlIG9mIHRoZQ0KKwljbGllbnQsIGdldHRpbmcgbGFyZ2UgcHJvZHVjdHMgaXMgYSBiaXQgc2xvd2VyLiAgVG8NCisJY29tcGVuc2F0ZSwgdGhlIGlucHV0IHN0cmVhbSBhY3R1YWxseSBzdGFydHMgYSBiYWNrZ3JvdW5kDQorCXRocmVhZCB0byBzdGFydCByZXRyaWV2aW5nIGNodW5rcyBvZiB0aGUgcHJvZHVjdCBhaGVhZCBvZiB0aGUNCisJcHJvZHVjdCBjbGllbnQsIHVwIHRvIGEgY2VydGFpbiBwb2ludCAod2UgZG9uJ3Qgd2FudCB0byBydW4NCisJb3V0IG9mIG1lbW9yeSBhZ2FpbikuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPk9uIHRoZSBzZXJ2ZXIgc2lkZSwgdGhlIGRpZmZlcmVuY2UgaXMgaW4gcHJvZ3JhbW1pbmcNCisJY29tcGxleGl0eS4gIENyZWF0aW5nIGEgPGNvZGU+TGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyPC9jb2RlPg0KKwlyZXF1aXJlcyBpbXBsZW1lbnRpbmcgdGhyZWUgbWV0aG9kcyBpbnN0ZWFkIG9mIGp1c3Qgb25lLiAgWW91DQorCW1heSBoYXZlIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBmaWxlcywgY2xvc2UgbmV0d29yayBwb3J0cywgb3INCisJZG8gb3RoZXIgY2xlYW51cC4gIFlvdSBtYXkgZXZlbiBoYXZlIHRvIGd1YXJkIGFnYWluc3QgY2xpZW50cw0KKwl0aGF0IHByZXNlbnQgc3BlY2lhbGx5LWNyYWZ0ZWQgcHJvZHVjdCBJRHMgdGhhdCB0cnkgdG8NCisJY2lyY3VtdmVudCBhY2Nlc3MgY29udHJvbHMgdG8gcHJvZHVjdHMuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPjxjb2RlPkxhcmdlUmVzdWx0PC9jb2RlPnMgYXJlIG1vcmUgZ2VuZXJhbCwgYW5kIHdpbGwgd29yayBmb3INCisJYW55IHNpemUgcHJvZHVjdCwgZnJvbSB6ZXJvIGJ5dGVzIG9uIHVwLiAgQW5kIHlvdSBjYW4gZXZlbiBtaXgNCisJYW5kIG1hdGNoOiBhIDxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT4gY2FuIGFkZA0KKwlyZWd1bGFyIDxjb2RlPlJlc3VsdDwvY29kZT5zIHRvIGFuIFhNTFF1ZXJ5IGFzIHdlbGwgYXMNCisJPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+cy4gIFlvdSBtaWdodCBwcm9ncmFtIHNvbWUgbG9naWMgdGhhdCwNCisJdW5kZXIgYSBjZXJ0YWluIHRocmVzaG9sZCwgdG8gcmV0dXJuIHJlZ3VsYXINCisJPGNvZGU+UmVzdWx0PC9jb2RlPnMgZm9yIHNtYWxsIHNpemVkIHByb2R1Y3RzLCBhbmQNCisJPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+cyBmb3IgYW55dGhpbmcgYmlnZ2VyIHRoYW4gc21hbGwuDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9J0NvbmNsdXNpb24nPg0KKyAgICAgIDxwPkluIHRoaXMgdHV0b3JpYWwsIHdlIGltcGxlbWVudGVkIGENCisJPGNvZGU+TGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyPC9jb2RlPiB0aGF0IHNlcnZlZCBsYXJnZQ0KKwlwcm9kdWN0cy4gIEluIHRoaXMgY2FzZSwgbGFyZ2UgY291bGQgbWVhbiB6ZXJvIGJ5dGVzIChlbXB0eQ0KKwlwcm9kdWN0cykgdXAgdG8gZ2FyZ2FudHVhbiBudW1iZXJzIG9mIGJ5dGVzLiAgVGhpcyBoYW5kbGVyDQorCXF1ZXJpZWQgZm9yIGZpbGVzIGluIHRoZSBwcm9kdWN0IHNlcnZlcidzIGZpbGVzeXN0ZW0sIHdoaWNoIGlzDQorCWEgYml0IGluc2VjdXJlIHNvIHlvdSBtaWdodCB3YW50IHRvIHRlcm1pbmF0ZSB0aGUgcHJvZHVjdA0KKwlzZXJ2ZXIgYXMgc29vbiBhcyBwb3NzaWJsZS4gIFdlIGFsc28gbGVhcm5lZCB0aGF0IHdoYXQgdGhlDQorCWFkdmFudGFnZXMgYW5kIGRpc2FkdmFudGFnZXMgd2VyZSBiZXR3ZWVuIHJlZ3VsYXIgcHJvZHVjdA0KKwlyZXN1bHRzIGFuZCBsYXJnZSBwcm9kdWN0IHJlc3VsdHMsIGFuZCB0aGF0DQorCTxjb2RlPkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjwvY29kZT5zIGNhbiB1c2UNCisJPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+IG9iamVjdHMgaW4gYWRkaXRpb24gdG8gcmVndWxhcg0KKwk8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdHMuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPklmIHlvdSd2ZSBhbHNvIGNvbXBsZXRlZCB0aGUgPGEgaHJlZj0iLi4vcHMiPllvdXIgRmlyc3QNCisJICBQcm9kdWN0IFNlcnZpY2U8L2E+IHR1dG9yaWFsIGFuZCB0aGUgPGENCisJICBocmVmPSIuLi9xaC8iPkRldmVsb3BpbmcgYSBRdWVyeSBIYW5kbGVyPC9hPiB0dXRvcmlhbCwgeW91DQorCWFyZSBub3cgYSBtYXN0ZXIgb2YgdGhlIE9PRFQgUHJvZHVjdCBTZXJ2aWNlLg0KKwlDb25ncmF0dWxhdGlvbnMhDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorICA8L2JvZHk+DQorPC9kb2N1bWVudD4NCmRpZmYgLS1naXQgYS8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy90dXRvcmlhbHMvcHMvaW5kZXgueG1sIGIvMC4xMC9wcm9kdWN0L3NyYy9zaXRlL3hkb2MvdHV0b3JpYWxzL3BzL2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWJmYzAwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy9zaXRlL3hkb2MvdHV0b3JpYWxzL3BzL2luZGV4LnhtbApAQCAtMCwwICsxLDQ4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPGRvY3VtZW50Pg0KKyAgPHByb3BlcnRpZXM+DQorICAgIDx0aXRsZT5Zb3VyIEZpcnN0IFByb2R1Y3QgU2VydmljZTwvdGl0bGU+DQorICAgIDxhdXRob3IgZW1haWw9IlNlYW4uS2VsbHlAanBsLm5hc2EuZ292Ij5TZWFuIEtlbGx5PC9hdXRob3I+DQorICA8L3Byb3BlcnRpZXM+DQorDQorICA8Ym9keT4NCisgICAgPHNlY3Rpb24gbmFtZT0iWW91ciBGaXJzdCBQcm9kdWN0IFNlcnZpY2UiPg0KKyAgICAgIDxwPlRoaXMgdHV0b3JpYWwgaW50cm9kdWNlcyBzdGFydGluZyBhIGJhc2ljIHByb2R1Y3Qgc2VydmVyLg0KKwlUaGlzIHByb2R1Y3Qgc2VydmVyIHdpbGwgYmUgY2FwYWJsZSBvZiBhY2NlcHRpbmcgcXVlcmllcywgYnV0DQorCXdpbGwgbm90IGFjdHVhbGx5IHJlc3BvbmQgd2l0aCBhbnkgZGF0YS4gIEJ5IGNvbXBsZXRpbmcgdGhpcw0KKwl0dXRvcmlhbCwgeW91J2xsIGhhdmUgYSB3b3JraW5nIHByb2R1Y3Qgc2VydmVyIGluIHdoaWNoIHlvdQ0KKwljYW4gaW5zdGFsbCBtb3JlIGNvbXBsZXggbG9naWMgdG8gYWN0dWFsbHkgaGFuZGxlIHByb2R1Y3QNCisJcmVxdWVzdHMuDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IlRoZSBQcm9kdWN0IFNlcnZpY2UiPg0KKyAgICAgIDxwPlRoZSBPT0RUIFByb2R1Y3QgU2VydmljZSBpcyBhIHJlbW90ZWx5IGFjY2Vzc2libGUgc29mdHdhcmUNCisJY29tcG9uZW50IHRoYXQgZW5hYmxlcyB5b3UgdG8gcmV0cmlldmUgcHJvZHVjdHMsIHdoaWNoIGNhbiBiZQ0KKwlhbnkga2luZCBvZiBkYXRhLiAgSW4gT09EVCwgYSA8ZW0+cHJvZHVjdCBjbGllbnQ8L2VtPiBwYXNzZXMgYQ0KKwk8ZW0+cXVlcnk8L2VtPiBpbnRvIGEga25vd24gcHJvZHVjdCBzZXJ2ZXIuICBUaGUgcHJvZHVjdA0KKwlzZXJ2ZXIgZGVsZWdhdGVzIHRoYXQgcXVlcnkgdG8gaXRzIGluc3RhbGxlZCA8ZW0+cXVlcnkNCisJaGFuZGxlcnM8L2VtPjsgZWFjaCBvbmUgZ2V0cyBhIGNoYW5jZSBhdCBzYXRpc2Z5aW5nIHRoZSBxdWVyeQ0KKwl3aXRoIHJlcXVlc3RlZCBkYXRhLiAgUXVlcnkgaGFuZGxlcnMgYXJlIHRoZSBpbnRlcmZhY2VzIGJldHdlZW4NCisJdGhlIGdlbmVyaWMgT09EVCBmcmFtZXdvcmsgYW5kIHlvdXIgc3lzdGVtLXNwZWNpZmljIGRhdGENCisJc3RvcmVzLiAgVGhleSBoYXZlIHRoZSBqb2Igb2YgdW5kZXJzdGFuZGluZyB0aGUgcGFzc2VkIGluDQorCXF1ZXJ5LCBmaW5kaW5nIG9yIGV2ZW4gc3ludGhlc2l6aW5nIHRoZSBtYXRjaGluZyBwcm9kdWN0LA0KKwlhcHBseWluZyBjb252ZXJzaW9ucyB0byBJbnRlcm5ldC1zdGFuZGFyZCBmb3JtYXRzLCBhbmQNCisJcmV0dXJuaW5nIHJlc3VsdHMuICBUaGUgcHJvZHVjdCBzZXJ2aWNlIHRoZW4gY29sbGVjdHMgYWxsIHRoZQ0KKwltYXRjaGluZyBwcm9kdWN0cyBmcm9tIHRoZSBxdWVyeSBoYW5kbGVycyBhbmQgcmV0dXJucyB0aGVtIHRvDQorCXRoZSBwcm9kdWN0IGNsaWVudC4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+VG8gZGVwbG95IGEgcHJvZHVjdCBzZXJ2ZXIsIHlvdSBuZWVkIHRvIGNvbWUgdXAgd2l0aCBxdWVyeQ0KKwloYW5kbGVycyB0aGF0IGludGVyZmFjZSB0byB5b3VyIHNpdGUtIG9yIGRpc2NpcGxpbmUtc3BlY2lmaWMNCisJZGF0YSBzdG9yZXMuICBUaGVuLCBzdGFydCBhIHByb2R1Y3Qgc2VydmVyIGFuZCBpbmZvcm0gaXQgb2YNCisJd2hhdCBxdWVyeSBoYW5kbGVycyB0byB1c2UuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRlbGVnYXRpb24gTW9kZWwiPg0KKwk8cD5UaGUgT09EVCBwcm9kdWN0IHNlcnZpY2UgPGVtPmRlbGVnYXRlczwvZW0+IGluY29taW5nDQorCSAgcXVlcmllcyB0byB6ZXJvIG9yIG1vcmUgcXVlcnkgaGFuZGxlcnMuICBJbiB0aGUgY2FzZSBvZiB6ZXJvDQorCSAgcXVlcnkgaGFuZGxlcnMsIHRoZSBwcm9kdWN0IHNlcnZpY2UgYWx3YXlzIHJlcGxpZXMgdG8gZXZlcnkNCisJICBxdWVyeSB3aXRoICJ6ZXJvIG1hdGNoZXMuIiAgT3RoZXJ3aXNlLCB0aGUgcXVlcnkgaGFuZGxlcnMNCisJICBnZXQgYSBjaGFuY2UgdG8gc2F0aXNmeSB0aGUgcXVlcnksIGFuZCBtYXkgb3IgbWF5IG5vdCBhZGQNCisJICBtYXRjaGluZyBwcm9kdWN0cyB0byB0aGUgcmVzdWx0Lg0KKwk8L3A+DQorDQorCTxwPlRoZSBmb2xsb3dpbmcgY2xhc3MgZGlhZ3JhbSBkZW1vbnN0cmF0ZXMgdGhpcyBkZWxlZ2F0aW9uIG1vZGVsOjwvcD4NCisNCisJPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9kZWxlZ2F0aW9uLnBuZyIgYWx0PSJEZWxlZ2F0aW9uIENsYXNzIERpYWdyYW0iIC8+DQorDQorCTxwPkhlcmUsIGEgcHJvZHVjdCBjbGllbnQgY2FsbHMgYSBzZXJ2ZXIgdG8gcHJvY2VzcyBhIHF1ZXJ5DQorCSAgZm9yIHByb2R1Y3RzLiBUaGUgc2VydmVyIGRlbGVnYXRlcyB0byBxdWVyeSBoYW5kbGVycywgd2hpY2gNCisJICBhcmUgSmF2YSBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZQ0KKwkgIDxjb2RlPlF1ZXJ5SGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLiAgVHdvIHF1ZXJ5IGhhbmRsZXJzIGluDQorCSAgdGhpcyBkaWFncmFtLCA8Y29kZT5NeUhhbmRsZXI8L2NvZGU+IGFuZA0KKwkgIDxjb2RlPk15T3RoZXJIYW5kbGVyPC9jb2RlPiBjYW4gYm90aCB0cnkgdG8gc2F0aXNmeSB0aGUNCisJICBxdWVyeSBieSBhZGRpbmcgbWF0Y2hpbmcgcHJvZHVjdHMgdG8gdGhlIHRvdGFsIHJlc3VsdC4gIFRoZXkNCisJICBjYW4gZWFjaCBhZGQgbW9yZSB0aGFuIG9uZSBtYXRjaGluZyBwcm9kdWN0LCBqdXN0IG9uZSwgb3INCisJICBub25lIGF0IGFsbC4gIFRoZSBzZXJ2ZXIgdGhlbiByZXR1cm5zIHRoZSBtYXRjaGVzLCBpZiBhbnksDQorCSAgdG8gdGhlIGNsaWVudC4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJMYXJnZSBQcm9kdWN0cyI+DQorCTxwPkluIE9PRFQsIGEgcXVlcnkgY29udGFpbnMgaXRzIG1hdGNoaW5nIHByb2R1Y3RzLiAgV2hlbiBhDQorCSAgY2xpZW50IHBhc3NlcyBhIHF1ZXJ5IHRvIGEgcHJvZHVjdCBzZXJ2ZXIsIHRoZSBxdWVyeSBvYmplY3QNCisJICByZXR1cm5zIHRvIHRoZSBjbGllbnQgPGVtPndpdGggbWF0Y2hpbmcgcHJvZHVjdHMgZW1iZWRkZWQgaW4NCisJICAgIGl0PC9lbT4uICBUaGlzIGNhbiwgaG93ZXZlciwgbWFrZSBxdWVyeSBvYmplY3RzIHRvbyBsYXJnZSB0bw0KKwkgIGJlIGNvbWZvcnRhYmx5IHBhc3NlZCBhcm91bmQgYSBuZXR3b3JrIG9mIE9PRFQgc2VydmljZXMgKHF1ZXJ5DQorCSAgb2JqZWN0cyBtdXN0IHJlc2lkZSBjb21wbGV0ZWx5IGluIG1lbW9yeSkuICBJbiB0aGlzIGNhc2UsIGENCisJICBzcGVjaWFsIGV4dGVuc2lvbiBvZiBhIDxjb2RlPlF1ZXJ5SGFuZGxlcjwvY29kZT4sIGENCisJICA8Y29kZT5MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXI8L2NvZGU+LCBjYW4gaW5zdGVhZCBwbGFjZSBhDQorCSAgPGVtPnJlZmVyZW5jZTwvZW0+IHRvIHRoZSBwcm9kdWN0IGRhdGEgaW4gdGhlIHF1ZXJ5Lg0KKwk8L3A+DQorCTxwPlRvIHByb2R1Y3QgY2xpZW50cywgdGhlIGRpZmZlcmVuY2UgaXMgaW52aXNpYmxlOiB0aGUNCisJICBwcm9kdWN0IGRhdGEgaXMgc3RpbGwgYWNjZXNzZWQgZnJvbSB0aGUgcXVlcnkgb2JqZWN0IHRoZQ0KKwkgIHNhbWUgd2F5LiAgQXMgYSBkZXZlbG9wZXIgb2YgcHJvZHVjdCBzZXJ2aWNlcywgdGhvdWdoLCB5b3UNCisJICBtYXkgbmVlZCB0byBkZWNpZGUgd2hpY2gga2luZCBvZiBxdWVyeSBoYW5kbGVyIHRvIG1ha2U6DQorCSAgcmVndWxhciBvciBsYXJnZS4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDb21tdW5pY2F0aW5nIHdpdGggYSBQcm9kdWN0IFNlcnZpY2UiPg0KKwk8cD5UaGUgcHJvZHVjdCBzZXJ2aWNlIGlzIGEgcmVtb3RlbHkgYWNjZXNzaWJsZSBvYmplY3QuDQorCSAgVGhlcmVmb3JlLCBwcm9kdWN0IGNsaWVudHMgYWNjZXNzIGl0IHdpdGggYSByZW1vdGUgb2JqZWN0DQorCSAgYWNjZXNzIHByb3RvY29sLiAgQ3VycmVudGx5LCBPT0RUIHN1cHBvcnRzIFJNSSBhbmQgQ09SQkEuICBZb3UNCisJICBjYW4gYWxzbyBhY2Nlc3MgcHJvZHVjdCBzZXJ2aWNlcyB3aXRoIEhUVFA7IGluIHRoaXMgY2FzZSwgYQ0KKwkgIHByb3h5IG9iamVjdCBwcm92aWRlcyB0aGUgSFRUUCBpbnRlcmZhY2Ugd2hpbGUgaW50ZXJuYWxseSBpdA0KKwkgIGFjY2Vzc2VzIGEgcHJvZHVjdCBzZXJ2aWNlIHdpdGggUk1JIG9yIENPUkJBLg0KKwk8L3A+DQorDQorCTxwPkZvciB0aGlzIHR1dG9yaWFsLCB3ZSdsbCB1c2UgUk1JIGJlY2F1c2UgaXQncyBlbm9ybW91c2x5DQorCSAgbGVzcyBjb21wbGV4IHRoYW4gQ09SQkEuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iTWFraW5nIHRoZSBTdGFnaW5nIEFyZWEiPg0KKyAgICAgIDxwPlRvIHN0YXJ0IGEgcHJvZHVjdCBzZXJ2aWNlLCB3ZSdsbCBjcmVhdGUgYSBkaXJlY3RvcnkNCisJc3RydWN0dXJlIHRoYXQgd2lsbCBob2xkIHNvZnR3YXJlIGNvbXBvbmVudHMgKGphciBmaWxlcykgYXMNCisJd2VsbCBhcyBzY3JpcHRzIHRoYXQgd2lsbCBzaW1wbGlmeSB0aGUgdXN1YWxseSBvdmVyLWxvbmcgSmF2YQ0KKwljb21tYW5kIGxpbmVzLiAgKE5vdGUgdGhhdCB0aGVzZSBleGFtcGxlcyBhcmUgZm9yIE1hYyBPUyBYLA0KKwlMaW51eCwgb3Igb3RoZXIgVW5peC1saWtlIHN5c3RlbXMuICBXaW5kb3dzIHVzZXJzIHdpbGwgaGF2ZSB0bw0KKwlhZGFwdC4pDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkxldCdzIHN0YXJ0IGJ5IG1ha2luZyBhIGRpcmVjdG9yeSBoaWVyYXJjaHkgZm9yIG91ciBwcm9kdWN0DQorCXNlcnZpY2UgY2FsbGVkIDxjb2RlPnBzPC9jb2RlPiAodGhpcyBleGFtcGxlIHVzZXMgYSBDLXN0eWxlDQorCXNoZWxsIDxjb2RlPmNzaDwvY29kZT4sIGlmIHlvdSdyZSB1c2luZyA8Y29kZT5iYXNoPC9jb2RlPiBvcg0KKwlhbm90aGVyIHN0eWxlIHNoZWxsLCBzdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcykuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+JSA8Yj5ta2RpciBwczwvYj4NCislIDxiPmNkIHBzPC9iPg0KKyUgPGI+c2V0ZW52IFBTX0hPTUUgYHB3ZGA8L2I+DQorJSA8Yj5ta2RpciBiaW4gbGliPC9iPg0KKyUgPGI+bHMgLVJGICRQU19IT01FPC9iPg0KK2Jpbi8gICAgbGliLw0KKw0KKy9Vc2Vycy9rZWxseS90bXAvcHMvYmluOg0KKw0KKy9Vc2Vycy9rZWxseS90bXAvcHMvbGliOjwvc291cmNlPg0KKw0KKyAgICAgIDxwPk5vdGUgdGhhdCB3ZSdyZSB1c2luZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KKwk8Y29kZT5QU19IT01FPC9jb2RlPiB0byBjb250YWluIHRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkNCisJd2UncmUgdXNpbmcgdG8gaG9sZCBldmVyeXRoaW5nLiAgV2UnbGwgdXNlIHRoaXMgZW52aXJvbm1lbnQNCisJdmFyaWFibGUgYXMgd2UgZGV2ZWxvcCB0aGUgc2NyaXB0cyB0byBsYXVuY2ggdGhlIHByb2R1Y3Qgc2VydmljZS4NCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iVGhlIFJNSSBSZWdpc3RyeSI+DQorICAgICAgPHA+U2luY2Ugd2UncmUgdXNpbmcgUmVtb3RlIE1ldGhvZCBJbnZvY2F0aW9uIChSTUkpIGZvciB0aGlzDQorCXR1dG9yaWFsLCB3ZSdsbCBuZWVkIHRvIHN0YXJ0IGFuIFJNSSBSZWdpc3RyeS4gIEFuIFJNSQ0KKwlSZWdpc3RyeSBzZXJ2ZXMgYXMgYSBjYXRhbG9nIHRoYXQgbWFwcyBiZXR3ZWVuIG5hbWVkIG9iamVjdHMsDQorCXN1Y2ggYXMgeW91ciBwcm9kdWN0IHNlcnZlciwgdG8gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsNCisJYWRkcmVzcyBhbmQgcG9ydCB3aGVyZSB0aGUgb2JqZWN0IGNhbiBiZSBsb2NhdGVkLiAgWW91cg0KKwlwcm9kdWN0IGNsaWVudCB3aWxsIHVzZSB0aGUgUk1JIHJlZ2lzdHJ5IHRvIGxvY2F0ZSB0aGUgcHJvZHVjdA0KKwlzZXJ2ZXIgc28gaXQgY2FuIGNvbm5lY3QgdG8gdGhlIHByb2R1Y3Qgc2VydmVyIGFuZCBjb21tdW5pY2F0ZSB3aXRoIGl0Lg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDb2xsZWN0aW5nIHRoZSBSTUkgUmVnaXN0cnkgQ29tcG9uZW50cyI+DQorCTxwPlRvIHN0YXJ0IGFuIFJNSSBSZWdpc3RyeSwgeW91J2xsIG5lZWQgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOjwvcD4NCisNCisJPHVsPg0KKwkgIDxsaT48YSBocmVmPSIvZWRtLWNvbW1vbnMvIj5FRE0gQ29tbW9uIENvbXBvbmVudHM8L2E+Lg0KKwkgICAgVGhlc2UgYXJlIGNvbW1vbiB1dGlsaXRpZXMgdXNlZCBieSBldmVyeSBPT0RUDQorCSAgICBzZXJ2aWNlLjwvbGk+IDxsaT48YSBocmVmPSIvZ3JpZC1wcm9kdWN0LyI+R3JpZCBQcm9kdWN0DQorCSAgICBTZXJ2aWNlPC9hPi4gIFRoaXMgaXMgdGhlIHByb2R1Y3Qgc2VydmljZSwgcHJvZHVjdCBjbGllbnQsDQorCSAgICBxdWVyeSBoYW5kbGVyIGludGVyZmFjZSwgYW5kIHJlbGF0ZWQgY2xhc3Nlcy48L2xpPiA8bGk+PGENCisJICAgIGhyZWY9Ii9ybWktcmVnaXN0cnkvIj5PT0RUIFJNSSBSZWdpc3RyeTwvYT4uICBUaGlzIGlzIHRoZQ0KKwkgICAgYWN0dWFsIFJNSSByZWdpc3RyeS48L2xpPg0KKwk8L3VsPg0KKw0KKwk8cD5Eb3dubG9hZCBlYWNoIGNvbXBvbmVudCdzIGJpbmFyeSBkaXN0cmlidXRpb24sIHVucGFjayBlYWNoDQorCSAgb25lLCBhbmQgdGFrZSBjb2xsZWN0IHRoZSBqYXIgZmlsZXMgaW50byB0aGUNCisJICA8Y29kZT5saWI8L2NvZGU+IGRpcmVjdG9yeS4gIEZvciBleGFtcGxlOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+JSA8Yj5jcCAvdG1wL2VkbS1jb21tb25zLTIuMi41LyouamFyICRQU19IT01FL2xpYjwvYj4NCislIDxiPmNwIC90bXAvZ3JpZC1wcm9kdWN0LTMuMC4zLyouamFyICRQU19IT01FL2xpYjwvYj4NCislIDxiPmNwIC90bXAvcm1pLXJlZ2lzdHJ5LTEuMC4wLyouamFyICRQU19IT01FL2xpYjwvYj4NCislIDxiPmxzIC1sICRQU19IT01FL2xpYjwvYj4NCit0b3RhbCAzMTINCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgMTQ5NTAzIDI0IEZlYiAxNDowNiBlZG0tY29tbW9ucy0yLjIuNS5qYXINCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgMTIwODQ0IDI0IEZlYiAxNDowNyBncmlkLXByb2R1Y3QtMy4wLjMuamFyDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgICAgODA1NSAyNCBGZWIgMTQ6MDcgcm1pLXJlZ2lzdHJ5LTEuMC4wLmphcjwvc291cmNlPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJXcml0aW5nIHRoZSBSTUkgU2NyaXB0Ij4NCisJPHA+VG8ga2VlcCBmcm9tIGhhdmluZyB0byB0eXBlIGxvbmcgSmF2YSBjb21tYW5kIGxpbmVzLCB3ZSdsbA0KKwkgIGNyZWF0ZSBhIHNpbXBsZSBzaGVsbCBzY3JpcHQgdGhhdCB3aWxsIHN0YXJ0IHRoZSBSTUkNCisJICByZWdpc3RyeS4gIFdlJ2xsIGNhbGwgaXQgPGNvZGU+cm1pLXJlZzwvY29kZT4gYW5kIHN0aWNrIGl0DQorCSAgaW4gdGhlIDxjb2RlPmJpbjwvY29kZT4gZGlyZWN0b3J5Lg0KKwk8L3A+DQorDQorCTxwPkhlcmUncyB0aGUgPGNvZGU+cm1pLXJlZzwvY29kZT4gc2NyaXB0OjwvcD4NCisJPHNvdXJjZT4jIS9iaW4vc2gNCitleGVjIGphdmEgLURqYXZhLmV4dC5kaXJzPSRQU19IT01FL2xpYiBcDQorICAgIGdvdi5uYXNhLmpwbC5vb2R0LnJtaS5STUlSZWdpc3RyeTwvc291cmNlPg0KKw0KKwk8cD5UaGlzIHNjcmlwdCB0ZWxscyB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUgdG8gZmluZA0KKwkgIGV4dGVuc2lvbiBqYXJzIGluIHRoZSBkaXJlY3RvcnkgPGNvZGU+JFBTX0hPTUUvbGliPC9jb2RlPi4gIEl0DQorCSAgdGhlbiBzYXlzIHRoYXQgdGhlIG1haW4gY2xhc3MgdG8gZXhlY3V0ZSBpcw0KKwkgIDxjb2RlPmdvdi5uYXNhLmpwbC5vb2R0LnJtaS5STUlSZWdpc3RyeTwvY29kZT4uDQorCTwvcD4NCisNCisJPHA+R28gYWhlYWQgYW5kIG1ha2UgdGhpcyBzY3JpcHQgZXhlY3V0YWJsZSBhbmQgc3RhcnQgdGhlIFJNSQ0KKwkgIFJlZ2lzdHJ5LiBJbiBhbm90aGVyIHdpbmRvdyAod2l0aCB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZyBvZg0KKwkgIDxjb2RlPlBTX0hPTUU8L2NvZGU+KSwgcnVuDQorCSAgPGNvZGU+JFBTX0hPTUUvYmluL3JtaS1yZWc8L2NvZGU+LiAgWW91IHNob3VsZCBzZWUgb3V0cHV0DQorCSAgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+JSA8Yj5jaG1vZCA3NTUgJFBTX0hPTUUvYmluL3JtaS1yZWc8L2I+DQorJSA8Yj4kUFNfSE9NRS9iaW4vcm1pLXJlZzwvYj4NCitUaHUgRmViIDI0IDE0OjEwOjI1IENTVCAyMDA1OiBubyBvYmplY3RzIHJlZ2lzdGVyZWQ8L3NvdXJjZT4NCisNCisJPHA+VGhlIFJNSSBSZWdpc3RyeSBpcyBub3cgcnVubmluZy4gIEV2ZXJ5IHR3byBtaW51dGVzIGl0IHdpbGwNCisJICBkaXNwbGF5IGFuIHVwZGF0ZSBvZiBhbGwgcmVnaXN0ZXJlZCBvYmplY3RzLiAgTmF0dXJhbGx5LCB3ZQ0KKwkgIGRvbid0IGhhdmUgYW55IHByb2R1Y3Qgc2VydmljZSBydW5uaW5nIHJpZ2h0IG5vdywgc28gaXQgd2lsbA0KKwkgIHNheSA8Y29kZT5ubyBvYmplY3RzIHJlZ2lzdGVyZWQ8L2NvZGU+LiAgR28gYWhlYWQgYW5kIGlnbm9yZQ0KKwkgIHRoaXMgd2luZG93IGZvciBub3cuICBJdCdzIHRpbWUgdG8gc3RhcnQgb3VyIHByb2R1Y3Qgc2VydmVyLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IlRoZSBQcm9kdWN0IFNlcnZlciI+DQorICAgICAgPHA+V2l0aCBhbiBSTUkgUmVnaXN0cnkgaW4gcGxhY2UsIHdlJ3JlIHJlYWR5IHRvIHN0YXJ0IG91cg0KKwlwcm9kdWN0IHNlcnZlci4gIEFzIHdpdGggdGhlIFJNSSBSZWdpc3RyeSwgd2UnbGwgbmVlZCB0aGUNCisJc29mdHdhcmUgY29tcG9uZW50cyBhbmQgdG8gbWFrZSBhIHNjcmlwdCB0byBsYXVuY2ggaXQuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbGxlY3RpbmcgdGhlIFByb2R1Y3QgU2VydmVyIENvbXBvbmVudHMiPg0KKwk8cD5XZSBhbHJlYWR5IGhhdmUgdHdvIG9mIHRoZSBjb21wb25lbnRzIG5lZWRlZCB0byBzdGFydCB0aGUNCisJICBwcm9kdWN0IHNlcnZlciwgPGNvZGU+ZWRtLWNvbW1vbnM8L2NvZGU+IGFuZA0KKwkgIDxjb2RlPmdyaWQtcHJvZHVjdDwvY29kZT4uICBXZSBuZWVkIHR3byBtb3JlOg0KKwk8L3A+DQorDQorCTx1bD4NCisJICA8bGk+PGEgaHJlZj0iL2VkbS1xdWVyeS8iPkVETSBRdWVyeSBFeHByZXNzaW9uPC9hPi4gIFRoaXMNCisJICBjb21wb25lbnQgZW5jYXBzdWxhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBPT0RUIHF1ZXJ5DQorCSAgYW5kIGFsc28gY29udGFpbnMgc29tZSBwcm9kdWN0IHJldHJpZXZhbCB1dGlsaXRpZXMuPC9saT4NCisJICA8bGk+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcveG1scnBjIj5BcGFjaGUNCisJICBYTUwtUlBDPC9hPi4gIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IE9PRFQgc2VydmljZXMuDQorCSAgRG93bmxvYWQgdmVyc2lvbiAxLjEsIG5vdCBhIGxhdGVyIHZlcnNpb24hICBJZiB5b3UgcHJlZmVyLA0KKwkgIHlvdSBjYW4gPGENCisJICBocmVmPSJodHRwOi8vaWJpYmxpby5vcmcvbWF2ZW4veG1scnBjL2phcnMveG1scnBjLTEuMS5qYXIiPmZldGNoDQorCSAgdGhlIGphciBmaWxlIGRpcmVjdGx5PC9hPi48L2xpPg0KKwk8L3VsPg0KKw0KKwk8cD5BcyBiZWZvcmUsIHB1dCB0aGVzZSBqYXJzIGludG8gdGhlDQorCSAgPGNvZGU+JFBTX0hPTUUvbGliPC9jb2RlPiBkaXJlY3Rvcnk6DQorCTwvcD4NCisNCisJPHNvdXJjZT4lIDxiPmxzIC1sICRQU19IT01FL2xpYjwvYj4NCit0b3RhbCAzNzYNCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgMTQ5NTAzIDI0IEZlYiAxNDowNiBlZG0tY29tbW9ucy0yLjIuNS5qYXINCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgIDQzODc5IDI0IEZlYiAxNDozNSBlZG0tcXVlcnktMi4wLjIuamFyDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgIDEyMDg0NCAyNCBGZWIgMTQ6MDcgZ3JpZC1wcm9kdWN0LTMuMC4zLmphcg0KKy1ydy1yLS1yLS0gIDEga2VsbHkgIGtlbGx5ICAgIDgwNTUgMjQgRmViIDE0OjA3IHJtaS1yZWdpc3RyeS0xLjAuMC5qYXINCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgIDUzOTc4IDI0IEZlYiAxNDozNSB4bWxycGMtMS4xLmphcjwvc291cmNlPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJXcml0aW5nIHRoZSBQcm9kdWN0IFNlcnZlciBTY3JpcHQiPg0KKwk8cD5UbyBsYXVuY2ggdGhlIHByb2R1Y3Qgc2VydmVyLCB3ZSdsbCBjcmVhdGUgYSBzY3JpcHQgY2FsbGVkDQorCSAgPGNvZGU+cHM8L2NvZGU+IGluIHRoZSA8Y29kZT4kUFNfSE9NRS9iaW48L2NvZGU+IGRpcmVjdG9yeS4NCisJICBIZXJlJ3MgaXRzIGNvbnRlbnRzOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+IyEvYmluL3NoDQorZXhlYyBqYXZhIC1EamF2YS5leHQuZGlycz0kUFNfSE9NRS9saWIgXA0KKyAgICBqcGwuZWRhLkV4ZWNTZXJ2ZXIgXA0KKyAgICBqcGwuZWRhLnByb2R1Y3Qucm1pLlByb2R1Y3RTZXJ2aWNlSW1wbCBcDQorICAgIHVybjplZGE6cm1pOk15UHJvZHVjdFNlcnZpY2U8L3NvdXJjZT4NCisNCisJPHA+TGlrZSB3aXRoIHRoZSBSTUkgc2VydmVyLCB0aGlzIHRlbGxzIEphdmEgd2hlcmUgdG8gZmluZA0KKwkgIGV4dGVuc2lvbiBqYXJzICg8Y29kZT4kUFNfSE9NRS9saWI8L2NvZGU+KS4gIFRoZSBtYWluIGNsYXNzDQorCSAgaXMgPGNvZGU+anBsLmVkYS5FeGVjU2VydmVyPC9jb2RlPiwgdGhpcyBpcyBhIGZyYW1ld29yaw0KKwkgIGNsYXNzIGZyb20gPGNvZGU+ZWRtLWNvbW1vbnM8L2NvZGU+IHRoYXQgcHJvdmlkZXMgYmFzaWMNCisJICBzdGFydC11cCBmdW5jdGlvbnMgZm9yIGEgdmFyaWV0eSBvZiBzZXJ2aWNlcy4gIEluIHRoaXMgY2FzZSwNCisJICB0aGUgc2VydmljZSBpcw0KKwkgIDxjb2RlPmpwbC5lZGEucHJvZHVjdC5ybWkuUHJvZHVjdFNlcnZpY2VJbXBsPC9jb2RlPjsgdGhpcyBpcw0KKwkgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBSTUkgdmVyc2lvbiBvZiB0aGUNCisJICBPT0RUIHByb2R1Y3Qgc2VydmljZS4gIFdlIHRoZW4gcGFzcyBpbiBvbmUgZmluYWwNCisJICBjb21tYW5kLWxpbmUgYXJndW1lbnQsDQorCSAgPGNvZGU+dXJuOmVkYTpybWk6TXlQcm9kdWN0U2VydmljZTwvY29kZT4uICBUaGlzIG5hbWVzIHRoZSBwcm9kdWN0IHNlcnZpY2UuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iV2hhdCdzIGluIGEgTmFtZT8iPg0KKwk8cD5UaGUgcHJvZHVjdCBzZXJ2aWNlIHJlZ2lzdGVycyBpdHNlbGYgdXNpbmcgYSBuYW1lIHByb3ZpZGVkDQorCSAgb24gdGhlIGNvbW1hbmQtbGluZSwgaW4gdGhpcyBjYXNlLA0KKwkgIDxjb2RlPnVybjplZGE6cm1pOk15UHJvZHVjdFNlcnZpY2U8L2NvZGU+LiAgTGV0J3MgdGFrZSBhcGFydA0KKwkgIHRoZSBuYW1lIGFuZCBzZWUgaG93IGl0IHdvcmtzLg0KKwk8L3A+DQorDQorCTxwPklmIHlvdSdyZSBmYW1pbGlhciB3aXRoIHdlYiBzdGFuZGFyZHMsIHlvdSBjYW4gc2VlIHRoYXQgdGhlDQorCSAgbmFtZSBpcyBhIFVuaWZvcm0gUmVzb3VyY2UgTmFtZSAoVVJOKSwgc2luY2UgaXQgc3RhcnRzIHdpdGgNCisJICA8Y29kZT51cm46PC9jb2RlPi4gIFRoZSBPT0RUIEZyYW1ld29yayB1c2VzIFVSTnMgdG8gaWRlbnRpZnkNCisJICBzZXJ2aWNlcyBhbmQgb3RoZXIgb2JqZWN0cy4gIFRoZSA8Y29kZT5lZGE6PC9jb2RlPiB0ZWxscw0KKwkgIHRoYXQgdGhlIG5hbWUgaXMgcGFydCBvZiB0aGUgRW50ZXJwcmlzZSBEYXRhIEFyY2hpdGVjdHVyZQ0KKwkgIChFREEpIG5hbWVzcGFjZS4gIChFREEgd2FzIHRoZSBuYW1lIG9mIGEgcHJvamVjdCByZWxhdGVkIHRvDQorCSAgT09EVCB0aGF0IHdhcyBtZXJnZWQgd2l0aCBPT0RULiAgRm9yIG5vdywganVzdCBhbHdheXMgdXNlDQorCSAgPGNvZGU+ZWRhOjwvY29kZT4gaW4geW91ciBVUk5zLikNCisJPC9wPg0KKwkNCisJPHA+TmV4dCBjb21lcyA8Y29kZT5ybWk6PC9jb2RlPi4gIFRoaXMgaXMgYSBzcGVjaWFsIGZsYWcgZm9yDQorCSAgdGhlIE9PRFQgc2VydmljZXMgdGhhdCB0ZWxscyB0aGF0IHdlJ3JlIHVzaW5nIGEgbmFtZSBvZiBhbg0KKwkgIFJNSS1hY2Nlc3NpYmxlIG9iamVjdC4gIFRoZSBPT0RUIGZyYW1ld29yayB3aWxsIGtub3cgdG8gdXNlDQorCSAgYW4gUk1JIFJlZ2lzdHJ5IHRvIHJlZ2lzdGVyIHRoZSBzZXJ2ZXIuIA0KKwk8L3A+DQorDQorCTxwPkZpbmFsbHkgaXMgPGNvZGU+TXlQcm9kdWN0U2VydmljZTwvY29kZT4uICBUaGlzIGlzIHRoZQ0KKwkgIGFjdHVhbCBuYW1lIHVzZWQgaW4gdGhlIFJNSSBSZWdpc3RyeS4gIFlvdSBjYW4gY2FsbCB5b3VyDQorCSAgcHJvZHVjdCBzZXJ2aWNlIGFueXRoaW5nIHlvdSB3YW50LiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91DQorCSAgaGF2ZSB0aHJlZSBwcm9kdWN0IHNlcnZlcnM7IG9uZSBpbiB0aGUgVVMsIG9uZSBpbiBDYW5hZGEsDQorCSAgYW5kIG9uZSBpbiBBdXN0cmFsaWEuICBZb3UgbWlnaHQgbmFtZSB0aGVtOg0KKwk8L3A+DQorDQorCTx1bD4NCisJICA8bGk+PGNvZGU+dXJuOmVkYTpybWk6VVM8L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+dXJuOmVkYTpybWk6Q2FuYWRhPC9jb2RlPjwvbGk+DQorCSAgPGxpPjxjb2RlPnVybjplZGE6cm1pOkF1c3RyYWxpYTwvY29kZT48L2xpPg0KKwk8L3VsPg0KKw0KKwk8cD5PciB5b3UgbWlnaHQgcHJlZmVyIHRvIHVzZSBJU08gY291bnRyeSBjb2Rlcy4gIE9yIHlvdSBtaWdodA0KKwkgIG5hbWUgdGhlbSBhY2NvcmRpbmcgdG8gdGhlIGtpbmRzIG9mIHByb2R1Y3RzIHRoZXkgc2VydmUsDQorCSAgc3VjaCBhcyA8Y29kZT51cm46ZWRhOnJtaTpCaW9tYXJrZXJzPC9jb2RlPiBvcg0KKwkgIDxjb2RlPnVybjplZGE6cm1pOkJ1c25pZXNzRm9yZWNhc3RzPC9jb2RlPi4NCisJPC9wPg0KKw0KKwk8cD5UaGUgUk1JIFJlZ2lzdHJ5IHdpbGwgaGFwcGlseSByZS1hc3NpZ24gYSBuYW1lIGlmIG9uZSdzDQorCSAgYWxyZWFkeSBpbiB1c2UsIHNvIHdoZW4gZGVwbG95aW5nIHlvdXIgb3duIHByb2R1Y3Qgc2VydmVycywNCisJICBiZSBzdXJlIHRvIGdpdmUgZWFjaCBvbmUgYSB1bmlxdWUgbmFtZS4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJMYXVuY2hpbmcgdGhlIFByb2R1Y3QgU2VydmVyIj4NCisJPHA+TWFrZSB0aGUgPGNvZGU+cHM8L2NvZGU+IHNjcmlwdCBleGVjdXRhYmxlIGFuZCBzdGFydCB0aGUNCisJICBwcm9kdWN0IHNlcnZlciBhdCB0aGlzIHRpbWUuICBEbyB0aGlzIGluIGEgc2VwYXJhdGUgd2luZG93DQorCSAgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZyBvZiA8Y29kZT5QU19IT01FPC9jb2RlPjoNCisJPC9wPg0KKw0KKwk8c291cmNlPiUgPGI+Y2htb2QgNzU1ICRQU19IT01FL2Jpbi9wczwvYj4NCislIDxiPiRQU19IT01FL2Jpbi9wczwvYj4NCitPYmplY3QgY29udGV4dCByZWFkeTsgZGVsZWdhdGluZyB0bzogW2pwbC5lZGEub2JqZWN0LmpuZGkuUk1JQ29udGV4dEA5NDI1N2ZdPC9zb3VyY2U+DQorDQorCTxwPlRoZSBwcm9kdWN0IHNlcnZpY2UgaXMgbm93IHJ1bm5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdA0KKwkgIHByb2R1Y3QgcXVlcmllcy4gIFNpbmNlIHdlIGRpZG4ndCB0ZWxsIGl0IHdoYXQgcXVlcnkNCisJICBoYW5kbGVycyB0byB1c2UsIGl0IHdpbGwgYWx3YXlzIHJlc3BvbmQgd2l0aCB6ZXJvIG1hdGNoaW5nDQorCSAgcHJvZHVjdHMuICBUaGF0IG1heSBub3QgYmUgaW50ZXJlc3RpbmcsIGJ1dCBpdCdzIGEgZ29vZCB0ZXN0DQorCSAgdG8gc2VlIGlmIHdlIGNhbiBhdCBsZWFzdCBsYXVuY2ggYSBwcm9kdWN0IHNlcnZlci4gIE5vdywNCisJICBsZXQncyBsYXVuY2ggYSBwcm9kdWN0IGNsaWVudCBhbmQgcXVlcnkgaXQuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iUXVlcnlpbmcgdGhlIFByb2R1Y3QgU2VydmVyIj4NCisgICAgICA8cD5UbyBxdWVyeSB0aGUgcHJvZHVjdCBzZXJ2ZXIsIHdlIHVzZSBhIHByb2R1Y3QgY2xpZW50LiAgVGhlDQorCUphdmEgY2xhc3MgPGNvZGU+anBsLmVkYS5wcm9kdWN0LlByb2R1Y3RDbGllbnQ8L2NvZGU+IHByb3ZpZGVzDQorCXRoZSBBUEkgZm9yIHlvdXIgb3duIHByb2dyYW1zIHRvIHF1ZXJ5IGZvciBhbmQgcmV0cmlldmUNCisJcHJvZHVjdHMuICBCdXQgaXQncyBhbHNvIGFuIGV4ZWN1dGFibGUgY2xhc3MsIHNvIHdlIGNhbiBydW4gaXQNCisJZnJvbSB0aGUgY29tbWFuZC1saW5lIGluIG9yZGVyIHRvIHRlc3Qgb3VyIHByb2R1Y3Qgc2VydmVyLg0KKwlIb3dldmVyLCBsZXQncyBhZ2FpbiBtYWtlIGEgc2NyaXB0IHRvIG1ha2UgaW52b2tpbmcgaXQgYSBiaXQNCisJZWFzaWVyLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5XZSdsbCBjYWxsIHRoZSBzY3JpcHQgPGNvZGU+cGM8L2NvZGU+IGZvciAicHJvZHVjdCBjbGllbnQsIg0KKwlhbmQgaXQgd2lsbCB0YWtlIGEgc2luZ2xlIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgd2hpY2ggd2lsbCBiZQ0KKwl0aGUgPGVtPnF1ZXJ5IGV4cHJlc3Npb248L2VtPiB0byBwYXNzIGludG8gdGhlIHByb2R1Y3Qgc2VydmVyLg0KKwlRdWVyeSBleHByZXNzaW9ucyBkZWZpbmUgdGhlIGNvbnN0cmFpbnRzIG9uIHRoZSBraW5kcyBvZg0KKwlwcm9kdWN0cyB3ZSB3YW50IHRvIGFjaGlldmUuICBTaW5jZSB0aGUgcHJvZHVjdCBzZXJ2ZXIgd2UndmUNCisJc2V0IHVwIHdpbGwgYWx3YXlzIHJlc3BvbmQgd2l0aCB6ZXJvIHByb2R1Y3RzLCB0aG91Z2gsIHdlIGNhbg0KKwlwYXNzIGluIGFueSBzeW50YWN0aWNhbGx5IHZhbGlkIHF1ZXJ5IGV4cHJlc3Npb24uDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkhlcmUncyB0aGUgc2NyaXB0OjwvcD4NCisNCisgICAgICA8c291cmNlPiMhL2Jpbi9zaA0KK2lmIFsgJCMgLW5lIDEgXTsgdGhlbg0KKyAgIGVjaG8gIlVzYWdlOiBgYmFzZW5hbWUgJDBgICZsdDtxdWVyeS1leHByZXNzaW9uJmd0OyIgMT4mYW1wOzINCisgICBleGl0IDENCitmaQ0KKw0KK2V4ZWMgamF2YSAtRGphdmEuZXh0LmRpcnM9JFBTX0hPTUUvbGliIFwNCisgICAgIGpwbC5lZGEucHJvZHVjdC5Qcm9kdWN0Q2xpZW50IFwNCisgICAgIC1vdXQgXA0KKyAgICAgdXJuOmVkYTpybWk6TXlQcm9kdWN0U2VydmljZSBcDQorICAgICAiJDEiPC9zb3VyY2U+DQorDQorDQorICAgICAgPHA+VGhpcyBzY3JpcHQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGVyZSdzIGV4YWN0bHkgb25lDQorCWNvbW1hbmQtbGluZSBhcmd1bWVudCwgdGhlIHF1ZXJ5IGV4cHJlc3Npb24uICBJZiB0aGVyZSBpc24ndCwNCisJaXQgcHJpbnRzIGEgaGVscGZ1bCB1c2FnZSBtZXNzYWdlIHRvIHRoZSBzdGFuZGFyZCBlcnJvcg0KKwlzdHJlYW0sIGFzIGlzIFVuaXggdHJhZGl0aW9uLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGV4ZWN1dGUgdGhlDQorCTxjb2RlPmpwbC5lZGEucHJvZHVjdC5Qcm9kdWN0Q2xpZW50PC9jb2RlPiBjbGFzcyB3aXRoIEphdmEuDQorCVdoZW4gZXhlY3V0ZWQsIHRoaXMgY2xhc3MgZXhwZWN0cyB0aHJlZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8b2w+DQorCTxsaT48Y29kZT4tb3V0PC9jb2RlPiBvciA8Y29kZT4teG1sPC9jb2RlPi4gIE9PRFQgdXNlcyBYTUwgdG8NCisJICByZXByZXNlbnQgdGhlIHF1ZXJ5IHRoYXQgaXQgcGFzc2VzIHRvIGFuZCByZWNlaXZlcyBiYWNrIGZyb20NCisJICBhIHByb2R1Y3Qgc2VydmVyLiAgV2l0aCA8Y29kZT4tb3V0PC9jb2RlPiwgdGhlIHByb2R1Y3QNCisJICBjbGllbnQgd2lsbCB3cml0ZSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHRoZSByYXcgcHJvZHVjdA0KKwkgIGRhdGEuICBXaXRoIDxjb2RlPi14bWw8L2NvZGU+LCB5b3UnbGwgaW5zdGVhZCBzZWUgdGhlIFhNTA0KKwkgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeSAod2l0aCBhbnkgZW1iZWRkZWQgbWF0Y2hpbmcNCisJICBwcm9kdWN0cykgaW5zdGVhZC4NCisJPC9saT4NCisNCisJPGxpPlRoZSBuYW1lIG9mIHRoZSBwcm9kdWN0IHNlcnZpY2UgdG8gY29udGFjdC4gIEluIHRoaXMgY2FzZSwNCisJICB3ZSdyZSB1c2luZyB0aGUgb25lIHdlIHN0YXJ0ZWQgZWFybGllciwgcmVnaXN0ZXJlZCB1bmRlciB0aGUNCisJICBuYW1lIDxjb2RlPnVybjplZGE6cm1pOk15UHJvZHVjdFNlcnZpY2U8L2NvZGU+Lg0KKwk8L2xpPg0KKw0KKwk8bGk+VGhlIHF1ZXJ5IGV4cHJlc3Npb24uPC9saT4NCisgICAgICA8L29sPg0KKw0KKyAgICAgIDxwPk5vdyB3ZSBjYW4gbWFrZSB0aGlzIHNjcmlwdCBleGVjdXRhYmxlIGFuZCBydW4gaXQ6PC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+JSA8Yj5jaG1vZCA3NTUgJFBTX0hPTUUvYmluL3BjPC9iPg0KKzxiPiRQU19IT01FL2Jpbi9wYyAieCA9IDMiPC9iPg0KK09iamVjdCBjb250ZXh0IHJlYWR5OyBkZWxlZ2F0aW5nIHRvOiBbanBsLmVkYS5vYmplY3Quam5kaS5STUlDb250ZXh0QGM3OTgwOV0NCitObyBtYXRjaGluZyByZXN1bHRzPC9zb3VyY2U+DQorDQorICAgICAgPHA+QWx0aG91Z2ggbm90IHRlcnJpYmx5IGV4Y2l0aW5nLCB0aGlzIGlzIGdvb2QgbmV3cy4gIEhlcmUncw0KKwl3aGF0IGhhcHBlbmVkOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8b2w+DQorCTxsaT5UaGUgcHJvZHVjdCBjbGllbnQgY3JlYXRlZCBhIHF1ZXJ5IG9iamVjdCAob2YgY2xhc3MNCisJICA8Y29kZT5qcGwuZWRhLnhtbHF1ZXJ5LlhNTFF1ZXJ5PC9jb2RlPiBmcm9tIHRoZQ0KKwkgIDxjb2RlPmVkbS1xdWVyeTwvY29kZT4gY29tcG9uZW50KSBvdXQgb2YgdGhlIHN0cmluZyBxdWVyeQ0KKwkgIDxjb2RlPnggPSAzPC9jb2RlPi4NCisJPC9saT4NCisNCisJPGxpPkl0IGFza2VkIHRoZSBSTUkgUmVnaXN0cnkgdG8gdGVsbCBpdCB3aGVyZSAobmV0d29yaw0KKwkgIGFkZHJlc3MpIGl0IGNvdWxkIGZpbmQgdGhlIHByb2R1Y3Qgc2VydmljZSBuYW1lZA0KKwkgIDxjb2RlPk15UHJvZHVjdFNlcnZpY2U8L2NvZGU+Lg0KKwk8L2xpPg0KKw0KKwk8bGk+QWZ0ZXIgZ2V0dGluZyB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBSTUkgUmVnaXN0cnksIGl0DQorCSAgdGhlbiBjb250YWN0ZWQgdGhlIHByb2R1Y3Qgc2VydmljZSBvdmVyIGEgbmV0d29yayBjb25uZWN0aW9uDQorCSAgKGV2ZW4gaWYgdG8gdGhlIHNhbWUgbG9jYWwgc3lzdGVtKSBhbmQgYXNrZWQgaXQgdG8gaGFuZGxlDQorCSAgdGhlIHF1ZXJ5LCBwYXNzaW5nIHRoZSBxdWVyeSBvYmplY3QuDQorCTwvbGk+DQorDQorCTxsaT5UaGUgcHJvZHVjdCBzZXJ2aWNlLCBoYXZpbmcgbm8gcXVlcnkgaGFuZGxlcnMgdG8gd2hpY2ggdG8NCisJICBkZWxlZ2F0ZSwgbWVyZWx5IHJldHVybmVkIHRoZSBxdWVyeSBvYmplY3QgdW5tb2RpZmllZCBvdmVyDQorCSAgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4NCisJPC9saT4NCisNCisJPGxpPlRoZSBwcm9kdWN0IGNsaWVudCwgaGF2aW5nIG5vIHByb2R1Y3QgdG8gd3JpdGUgdG8gdGhlDQorCSAgc3RhbmRhcmQgb3V0cHV0IChhcyBpbmRpY2F0ZWQgYnkgdGhlIDxjb2RlPi1vdXQ8L2NvZGU+DQorCSAgYXJndW1lbnQpLCB3cm90ZSB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlIDxjb2RlPk5vIG1hdGNoaW5nDQorCSAgcmVzdWx0czwvY29kZT4uDQorCTwvbGk+DQorICAgICAgPC9vbD4NCisNCisgICAgICA8cD5Zb3UgY2FuIG1ha2UgdGhpcyBleGFtcGxlIHNsaWdodGx5IG1vcmUgaW50ZXJlc3RpbmcgYnkNCisJY2hhbmdpbmcgdGhlIDxjb2RlPi1vdXQ8L2NvZGU+IGluIHRoZSA8Y29kZT5wYzwvY29kZT4gc2NyaXB0DQorCXRvIDxjb2RlPi14bWw8L2NvZGU+LiAgTm93LCB3aGVuIHlvdSBydW4gaXQsIHlvdSdsbCBzZWUgYW4gWE1MDQorCWRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIHF1ZXJ5LiAgT25lIG9mIHRoZSBwZXJ0aW5lbnQgc2VjdGlvbnMNCisJdG8gbm90ZSBpczoNCisgICAgICA8L3A+DQorDQorICAgICAgPHNvdXJjZT4uLi4mbHQ7cXVlcnlSZXN1bHRTZXQvJmd0Oy4uLjwvc291cmNlPg0KKw0KKyAgICAgIDxwPlRoaXMgZW1wdHkgWE1MIGVsZW1lbnQgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlIG5vIHJlc3VsdHMuPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IkNvbmNsdXNpb24iPg0KKyAgICAgIDxwPkJ5IGZvbGxvd2luZyB0aGlzIHR1dG9yaWFsLCB5b3UndmUgc3RhcnRlZCBib3RoIGFuIFJNSQ0KKwlSZWdpc3RyeSBhbmQgYSBiYXNpYyBwcm9kdWN0IHNlcnZlci4gIFlvdSd2ZSBxdWVyaWVkIHRoYXQNCisJcHJvZHVjdCBzZXJ2ZXIgdG8gaW5zdXJlIHRoYXQgeW91IGNhbiBjb21tdW5pY2F0ZSB3aXRoIGl0LiAgSW4NCisJbGF0ZXIgdHV0b3JpYWxzLCB5b3UnbGwgYnVpbGQgb24gdGhpcyBwcm9kdWN0IHNlcnZlciBieSBhZGRpbmcNCisJYSBxdWVyeSBoYW5kbGVyIHRvIGl0IGFuZCByZXR1cm5pbmcgYWN0dWFsIHByb2R1Y3QgZGF0YS4NCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisNCisgIDwvYm9keT4NCis8L2RvY3VtZW50Pg0KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZHVjdC9zcmMvc2l0ZS94ZG9jL3R1dG9yaWFscy9xaC9pbmRleC54bWwgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy90dXRvcmlhbHMvcWgvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2ODRhZDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL3NpdGUveGRvYy90dXRvcmlhbHMvcWgvaW5kZXgueG1sCkBAIC0wLDAgKzEsNzA0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8ZG9jdW1lbnQ+DQorICA8cHJvcGVydGllcz4NCisgICAgPHRpdGxlPkRldmVsb3BpbmcgYSBRdWVyeSBIYW5kbGVyPC90aXRsZT4NCisgICAgPGF1dGhvciBlbWFpbD0iU2Vhbi5LZWxseUBqcGwubmFzYS5nb3YiPlNlYW4gS2VsbHk8L2F1dGhvcj4NCisgIDwvcHJvcGVydGllcz4NCisNCisgIDxib2R5Pg0KKyAgICA8c2VjdGlvbiBuYW1lPSJEZXZlbG9waW5nIGEgUXVlcnkgSGFuZGxlciI+DQorICAgICAgPHA+SW4gdGhlIDxhIGhyZWY9Ii4uL3BzLyI+bGFzdCB0dXRvcmlhbDwvYT4sIHdlIHN0YXJ0ZWQgYQ0KKwlwcm9kdWN0IHNlcnZlci4gIEJ1dCB0aGlzIHdhc24ndCBhIHZlcnkgdXNlZnVsIHByb2R1Y3Qgc2VydmVyOw0KKwlpdCBjb3VsZCBhbnN3ZXIgcXVlcmllcyBidXQgYWx3YXlzIHJlc3BvbmQgd2l0aCBubyByZXN1bHRzLg0KKwlUaGF0J3MgYmVjYXVzZSBpdCBoYWQgbm8gcXVlcnkgaGFuZGxlcnMuICBRdWVyeSBoYW5kbGVycyBoYXZlDQorCXRoZSByZXNwb25zaWJpbGl0eSBvZiBhY3R1YWxseSBoYW5kbGluZyBwcm9kdWN0IHF1ZXJpZXMuICBJbg0KKwl0aGlzIHR1dG9yaWFsLCB3ZSdsbCBkZXZlbG9wIGEgcXVlcnkgaGFuZGxlciwgaW5zdGFsbCBpdCBpbnRvDQorCW91ciBwcm9kdWN0IHNlcnZlciwgYW5kIHF1ZXJ5IGl0IHRvIHNlZSBpZiBpdCB3b3Jrcy4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+VG8gZG8gdGhpcyB0dXRvcmlhbCwgeW91J2xsIG5lZWQgbWFzdGVyeSBvZiB0d28gdGhpbmdzOjwvcD4NCisgICAgICA8dWw+DQorCTxsaT5Vc2luZyB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGNsYXNzLiAgRm9sbG93IHRoZSA8YQ0KKwkgICAgaHJlZj0iL2VkbS1xdWVyeS90dXRvcmlhbC8iPnF1ZXJ5IGV4cHJlc3Npb24gdHV0b3JhaWw8L2E+DQorCSAgICBub3cgaWYgeW91J3JlIG5vdCBmYW1pbGlhciB3aXRoIGl0Lg0KKwk8L2xpPg0KKw0KKwk8bGk+UnVubmluZyBhbmQgcXVlcnlpbmcgYSBwcm9kdWN0IHNlcnZlci4gIEZvbGxvdyB0aGUgPGENCisJICAgIGhyZWY9Ii4uL3BzLyI+WW91ciBGaXJzdCBQcm9kdWN0IFNlcnZlcjwvYT4gdHV0b3JpYWwgdG8NCisJICAgIGdldCB5b3VyIHByb2R1Y3Qgc2VydmVyIHVwIGFuZCBydW5uaW5nLiAgSW4gdGhpcyB0dXRvcmlhbCwNCisJICAgIHdlJ2xsIGJ1aWxkIG9uIHRoYXQgcHJvZHVjdCBzZXJ2ZXIsIHNvIGl0J3MgZXNwZWNpYWxseQ0KKwkgICAgaW1wb3J0YW50IHRvIGhhdmUgaXQgaW4gZ29vZCBzaGFwZS4NCisJPC9saT4NCisgICAgICA8L3VsPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IlNlcnZpbmcgVXAgQ29uc3RhbnRzIj4NCisgICAgICA8cD5Qcm9kdWN0IHNlcnZlcnMgZGVsZWdhdGUgdG8gcXVlcnkgaGFuZGxlcnMuICBJdCdzIHRoZSBqb2Igb2YNCisJcXVlcnkgaGFuZGxlcnMgdG8gaW50ZXJwcmV0IGluY29taW5nIHF1ZXJpZXMgKGV4cHJlc3NlZCBhcw0KKwk8Y29kZT5YTUxRdWVyeTwvY29kZT4gb2JqZWN0cyksIHNlYXJjaCBmb3IsIHJldHJpZXZlLCBjb252ZXJ0LA0KKwlvciBzeW50aGVzaXplIG1hdGNoaW5nIHByb2R1Y3QgcmVzdWx0cywgYWRvcm4gdGhlDQorCTxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBvYmplY3Qgd2l0aCA8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdHMsDQorCWFuZCByZXR1cm4gdGhlIG1vZGlmaWVkIHF1ZXJ5LiAgQXQgdGhhdCBwb2ludCB0aGUgT09EVA0KKwlmcmFtZXdvcmsgdGFrZXMgb3ZlciBhZ2FpbiBhbmQgdHJpZXMgb3RoZXIgaW5zdGFsbGVkIHF1ZXJ5DQorCWhhbmRsZXJzLCBldmVudHVhbGx5IHJldHVybmluZyB0aGUgY29tcGxldGVkDQorCTxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBiYWNrIHRvIHRoZSBwcm9kdWN0IGNsaWVudCB0aGF0IG1hZGUgdGhlDQorCXF1ZXJ5IGluIHRoZSBmaXJzdCBwbGFjZS4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+V2UnbGwgbWFrZSBhIHF1ZXJ5IGhhbmRsZXIgdGhhdCBzZXJ2ZXMgbWF0aGVtYXRpY2FsDQorCWNvbnN0YW50cy4gIEhhdmUgeW91IGV2ZXIgYmVlbiBpbiBhIHBvc2l0aW9uIHdoZXJlIHlvdSBuZWVkZWQsDQorCXNheSwgdGhlIHZhbHVlIG9mIHRoZSB0aGlyZCBGbGFqb2xldCBudW1iZXIgb3IgcGVyaGFwcw0KKwlaZXRhKDkpPyAgTm8/ICBXZWxsLCBqdXN0IHByZXRlbmQgZm9yIG5vdyB5b3UgZGlkLiAgV2hhdCB3ZSdsbA0KKwlkbyBpcyBkZXZlbG9wIGEgcXVlcnkgaGFuZGxlciBmb3IgYSBwcm9kdWN0IHNlcnZlciB0aGF0IHdpbGwNCisJc2VydmUgdmFsdWVzIG9mIHZhcmlvdXMgbWF0aGVtYXRpY2FsIGNvbnN0YW50cy4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+VGhlIGFwcHJvYWNoIHdlJ2xsIHRha2UgaGFzIHRocmVlIHNpbXBsZSBzdGVwczo8L3A+DQorDQorICAgICAgPG9sPg0KKwk8bGk+R2V0IHNvbWUgaGFuZHkgY29uc3RhbnRzLjwvbGk+DQorCTxsaT5EZWZpbmUgdGhlIHF1ZXJ5IGV4cHJlc3Npb24uPC9saT4NCisJPGxpPldyaXRlIGEgcXVlcnkgaGFuZGxlci4gIFRoZSBxdWVyeSBoYW5kbGVyIHdpbGw6DQorCSAgPG9sPg0KKwkgICAgPGxpPkV4YW1pbmUgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gdG8gc2VlIGlmIGl0J3MgYSByZXF1ZXN0DQorCSAgICAgIGZvciBhIGNvbnN0YW50LCBhbmQgaWYgc28sIHdoYXQgY29uc3RhbnQgaXMNCisJICAgICAgcmVxdWVzdGVkLg0KKwkgICAgPC9saT4NCisJICAgIDxsaT5FeGFtaW5lIHRoZSBxdWVyeSdzIGxpc3Qgb2YgYWNjZXB0YWJsZSBNSU1FIHR5cGVzLjwvbGk+DQorCSAgICA8bGk+SWYgYm90aCBjaGVjayBvdXQsIGxvb2sgdXAgdGhlIGRlc2lyZWQgY29uc3RhbnQncyB2YWx1ZS48L2xpPg0KKwkgICAgPGxpPklmIGZvdW5kLCBhZGQgaXQgYXMgYSA8Y29kZT5SZXN1bHQ8L2NvZGU+IGluIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4uPC9saT4NCisJICA8L29sPg0KKwk8L2xpPg0KKyAgICAgIDwvb2w+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iV3JpdGluZyB0aGUgQ29kZSI+DQorICAgICAgPHA+SW4gdGhpcyBzZWN0aW9uLCB3ZSdsbCBidWlsZCB1cCB0aGUgcXVlcnkgaGFuZGxlciBzb3VyY2UgY29kZQ0KKwlpbiBwaWVjZXMsIGV4YW1pbmluZyBlYWNoIHBpZWNlIHRob3JvdWdobHkuICBXZSdsbCB0aGVuDQorCXByZXNlbnQgdGhlIGVudGlyZSBzb3VyY2UgZmlsZS4NCisgICAgICA8L3A+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nR2F0aGVyaW5nIEhhbmR5IENvbnN0YW50cyc+DQorCTxwPlRoZSB3b25kZXJmdWwgd29ybGQgb2Ygc2NpZW5jZSBhbmQgbWF0aGVtYXRpY3MgaXMgcmVwbGV0ZQ0KKwkgIHdpdGggdXNlZnVsIGNvbnN0YW50IHZhbHVlcy4gIEZvciB0aGlzIGV4YW1wbGUsIGxldCdzIGp1c3QgcGljayB0aHJlZToNCisJPC9wPg0KKw0KKwk8dWw+DQorCSAgPGxpPjx2YXI+cGk8L3Zhcj4gPSAzLjE0MTU5MjY1Li4uPC9saT4NCisJICA8bGk+PHZhcj5lPC92YXI+ID0gMi43MTgyODE4Mjg1Li4uPC9saT4NCisJICA8bGk+PHZhcj5nYW1tYTwvdmFyPiA9IDAuNTc3MjE1NjY0Li4uPC9saT4NCisJPC91bD4NCisNCisJPHA+SW4gSmF2YSBjb2RlLCB3ZSBjYW4gc2V0IHVwIHRob3NlIHZhbHVlcyBhcyBhDQorCSAgPGNvZGU+TWFwPC9jb2RlPiBpbiBhIHN0YXRpYyBmaWVsZC4gIFRodXMgd2Ugc3RhcnQgZm9ybWluZyBvdXINCisJICBzb3VyY2UgZmlsZSwgPGNvZGU+Q29uc3RhbnRIYW5kbGVyLmphdmE8L2NvZGU+Og0KKwk8L3A+DQorDQorCTxzb3VyY2U+aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqcGwuZWRhLnByb2R1Y3QuUXVlcnlIYW5kbGVyOw0KK3B1YmxpYyBjbGFzcyBDb25zdGFudEhhbmRsZXINCisgIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyIHsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBDT05TVEFOVFMgPSBuZXcgSGFzaE1hcCgpOw0KKyAgc3RhdGljIHsNCisgICAgQ09OU1RBTlRTLnB1dCgicGkiLCAgICAiMy4xNDE1OTI2NS4uLiIpOw0KKyAgICBDT05TVEFOVFMucHV0KCJlIiwgICAgICIyLjcxODI4MTgyODUuLi4iKTsNCisgICAgQ09OU1RBTlRTLnB1dCgiZ2FtbWEiLCAiMC41NzcyMTU2NjQuLi4iKTsNCisgIH0NCit9PC9zb3VyY2U+DQorDQorCTxwPkFzIHlvdSBjYW4gc2VlLCB3ZSdyZSBzdG9yaW5nIGJvdGggdGhlIGNvbnN0YW50IG5hbWUgYW5kIGl0cw0KKwkgIHZhbHVlIGFzIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IG9iamVjdHMuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nRGVmaW5pbmcgdGhlIFF1ZXJ5IEV4cHJlc3Npb24nPg0KKwk8cD5SZWNhbGwgdGhhdCB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGNsYXNzIGNhbiB1c2UgcGFyc2VkDQorCSAgcXVlcmllcyAod2hlcmUgaXQgZ2VuZXJhdGVzIHBvc3RmaXggYm9vbGVhbiBzdGFja3MpIG9yDQorCSAgdW5wYXJzZWQgb25lcy4gIFdoaWxlIHVucGFyc2VkIG9uZXMgYXJlIGVhc2llciwgd2UnbGwgZ28gd2l0aA0KKwkgIHBhcnNlZCBvbmVzIHRvIGRlbW9uc3RyYXRlIGhvdyBvbiB0aGUgc2VydmVyLXNpZGUgeW91IGRlYWwNCisJICB3aXRoIHRob3NlIHBvc3RmaXggc3RhY2tzLg0KKwk8L3A+DQorDQorCTxwPlVzaW5nIHRoZSBYTUxRdWVyeSdzIGV4cHJlc3Npb24gbGFuZ3VhZ2UsIHdlJ2xsIGxvb2sgZm9yDQorCSAgcXVlcmllcyBvZiB0aGUgZm9ybTo8L3A+DQorCQ0KKwk8cD48Y29kZT5jb25zdGFudCA9IDx2YXI+bmFtZTwvdmFyPjwvY29kZT48L3A+DQorDQorCTxwPndoZXJlIDx2YXI+bmFtZTwvdmFyPiBpcyB0aGUgbmFtZSBvZiBhIGNvbnN0YW50LiAgVGhhdCB3aWxsDQorCSAgZm9ybSBhIHBvc3RmaXggIndoZXJlIiBzdGFjayB3aXRoIGV4YWN0bHkgdGhyZWUNCisJICA8Y29kZT5RdWVyeUVsZW1lbnQ8L2NvZGU+IG9iamVjdHMgb24gaXQ6DQorCTwvcD4NCisNCisJPG9sPg0KKwkgIDxsaT5UaGUgZmlyc3QgKHRvcCkgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPiB3aWxsIGhhdmUgcm9sZSA9DQorCSAgICA8Y29kZT5lbGVtTmFtZTwvY29kZT4gYW5kIHZhbHVlID0gPGNvZGU+Y29uc3RhbnQ8L2NvZGU+Lg0KKwkgIDwvbGk+DQorDQorCSAgPGxpPlRoZSBzZWNvbmQgKG1pZGRsZSkgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPiB3aWxsIGhhdmUNCisJICAgIHJvbGUgPSA8Y29kZT5MSVRFUkFMPC9jb2RlPiBhbmQgYSB2YWx1ZSBlcXVhbCB0byB0aGUNCisJICAgIGNvbnN0YW50IDx2YXI+bmFtZTwvdmFyPi4NCisJICA8L2xpPg0KKw0KKwkgIDxsaT5UaGUgdGhpcmQgKGJvdHRvbSkgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPiB3aWxsIGhhdmUNCisJICAgIHJvbGUgPSA8Y29kZT5SRUxPUDwvY29kZT4gYW5kIHZhbHVlID0gPGNvZGU+RVE8L2NvZGU+Lg0KKwkgIDwvbGk+DQorCTwvb2w+DQorDQorCTxwPklmIHdlIGdldCBhbnkgb3RoZXIga2luZCBvZiBzdGFjaywgd2UnbGwgcmVqZWN0IGl0IGFuZCByZXR1cm4NCisJICBubyBtYXRjaGluZyByZXN1bHRzLiAgVGhhdCdzIHJlYXNvbmFibGUgYmVoYXZpb3I7IGFmdGVyIGFsbCwgYQ0KKwkgIHF1ZXJ5IGZvciA8Y29kZT5kb251dHNFYXRlbiAmZ3Q7IDUgQU5EIFJFVFVSTiA9DQorCSAgICBlcGlzb2RlTnVtYmVyPC9jb2RlPiBtYXkgYmUgaGFuZGxlZCBieSBhDQorCSAgPGNvZGU+U2ltcHNvbnNFcGlzb2RlUXVlcnlIYW5kbGVyPC9jb2RlPiB0aGF0J3MgPGVtPmFsc288L2VtPg0KKwkgIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBwcm9kdWN0IHNlcnZlci4NCisJPC9wPg0KKw0KKwk8cD5XZSdsbCBkZWZpbmUgYSB1dGlsaXR5IG1ldGhvZCwgPGNvZGU+Z2V0Q29uc3RhbnROYW1lPC9jb2RlPiwNCisJICB0aGF0IHdpbGwgdGFrZSB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+LCBjaGVjayBmb3IgdGhlDQorCSAgcG9zdGZpeCAid2hlcmUiIHN0YWNrIGFzIGRlc2NyaWJlZCwgYW5kIHJldHVybiB0aGUgbWF0Y2hpbmcNCisJICBjb25zdGFudCA8dmFyPm5hbWU8L3Zhcj4uICBJZiBpdCBnZXRzIGEgc3RhY2sgd2hvc2Ugc3RydWN0dXJlDQorCSAgZG9lc24ndCBtYXRjaCwgaXQgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uICBXZSdsbCBhZGQNCisJICB0aGlzIG1ldGhvZCB0byBvdXIgPGNvZGU+Q29uc3RhbnRIYW5kbGVyLmphdmE8L2NvZGU+IGZpbGU6DQorCTwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuWE1MUXVlcnk7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuUXVlcnlFbGVtZW50Ow0KKy4uLg0KK3B1YmxpYyBjbGFzcyBDb25zdGFudEhhbmRsZXINCisgIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyIHsNCisgIC4uLg0KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50TmFtZShYTUxRdWVyeSBxKSB7DQorICAgIExpc3Qgc3RhY2sgPSBxLmdldFdoZXJlRWxlbWVudFNldCgpOw0KKyAgICBpZiAoc3RhY2suc2l6ZSgpICE9IDMpIHJldHVybiBudWxsOw0KKyAgICBRdWVyeUVsZW1lbnQgZSA9IChRdWVyeUVsZW1lbnQpIHN0YWNrLmdldCgwKTsNCisgICAgaWYgKCEiZWxlbU5hbWUiLmVxdWFscyhlLmdldFJvbGUoKSkNCisgICAgICB8fCAhImNvbnN0YW50Ii5lcXVhbHMoZS5nZXRWYWx1ZSgpKSkNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgZSA9IChRdWVyeUVsZW1lbnQpIHN0YWNrLmdldCgyKTsNCisgICAgaWYgKCEiUkVMT1AiLmVxdWFscyhlLmdldFJvbGUoKSkNCisgICAgICB8fCAhIkVRIi5lcXVhbHMoZS5nZXRWYWx1ZSgpKSkNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgZSA9IChRdWVyeUVsZW1lbnQpIHN0YWNrLmdldCgxKTsNCisgICAgaWYgKCEiTElURVJBTCIuZXF1YWxzKGUuZ2V0Um9sZSgpKSkNCisJcmV0dXJuIG51bGw7DQorICAgIHJldHVybiBlLmdldFZhbHVlKCk7DQorICB9DQorfTwvc291cmNlPg0KKw0KKwk8cD5IZXJlLCB3ZSBmaXJzdCBjaGVjayB0byBtYWtlIHN1cmUgdGhlcmUncyBleGFjdGx5IHRocmVlDQorCSAgZWxlbWVudHMsIHJldHVybmluZyBudWxsIGlmIG5vdC4gIFRoZXJlJ3Mgbm8gbmVlZCB0byBnbyBmdXJ0aGVyLg0KKwk8L3A+DQorDQorCTxwPkFzc3VtaW5nIHRoZXJlJ3MgdGhyZWUgZWxlbWVudHMsIHRoZSBjb2RlIHRoZW4gY2hlY2tzIHRoZQ0KKwkgIHRvcG1vc3QgZWxlbWVudC4gIEZvciBhbiBleHByZXNzaW9uIDxjb2RlPmNvbnN0YW50ID0NCisJICAgIDx2YXI+bmFtZTwvdmFyPjwvY29kZT4sIHRoZSB0b3Btb3N0IGVsZW1lbnQgd2lsbCBoYXZlIHJvbGUNCisJICA8Y29kZT5lbGVtTmFtZTwvY29kZT4gYW5kIHZhbHVlIDxjb2RlPmNvbnN0YW50PC9jb2RlPi4gIElmDQorCSAgbmVpdGhlciBjb25kaXRpb24gaXMgdHJ1ZSwgd2UgcmV0dXJuIG51bGwgcmlnaHQgYXdheS4gIE5vIG5lZWQNCisJICB0byBjaGVjayBmdXJ0aGVyLg0KKwk8L3A+DQorDQorCTxwPklmIHRoZSB0b3Btb3N0IGVsZW1lbnQgY2hlY2tzIG91dCwgd2UgdGhlbiBjaGVjayB0aGUNCisJICBib3R0b21tb3N0IGVsZW1lbnQuICBGb3IgPGNvZGU+Y29uc3RhbnQgPQ0KKwkgICAgPHZhcj5uYW1lPC92YXI+PC9jb2RlPiwgdGhlIGJvdHRvbSBlbGVtZW50IGlzIGdlbmVyYXRlZCBmcm9tDQorCSAgdGhlIGVxdWFscyBzaWduLiAgSXQgd2lsbCBoYXZlIHJvbGUgPGNvZGU+UkVMT1A8L2NvZGU+DQorCSAgKHJlbGF0aW9uYWwgb3BlcmF0b3IpIGFuZCB2YWx1ZSA8Y29kZT5FUTwvY29kZT4sIG1lYW5pbmcNCisJICAiZXF1YWxzIi4NCisJPC9wPg0KKw0KKwk8cD5JZiBpdCBjaGVja3Mgb3V0LCBhbGwgd2UgaGF2ZSB0byBkbyBpcyBjaGVjayB0aGUgbWlkZGxlDQorCSAgZWxlbWVudC4gIFRoZSBpbmZpeCBleHByZXNzaW9uIDxjb2RlPmNvbnN0YW50ID0NCisJICAgIDx2YXI+bmFtZTwvdmFyPjwvY29kZT4gZ2VuZXJhdGVzIGEgcG9zdGZpeCBtaWRkbGUgZWxlbWVudCBvZg0KKwkgIDx2YXI+bmFtZTwvdmFyPiBhcyB0aGUgdmFsdWUsIHdpdGggYSByb2xlIG9mDQorCSAgPGNvZGU+TElURVJBTDwvY29kZT4uICBXZSBtYWtlIHN1cmUgaXQncyA8Y29kZT5MSVRFUkFMPC9jb2RlPi4NCisJICBJZiBub3QsIHdlJ3JlIGRvbmU7IGl0J3Mgbm90IGEgdmFsaWQgZXhwcmVzc2lvbiBmb3Igb3VyIHF1ZXJ5DQorCSAgaGFuZGxlci4NCisJPC9wPg0KKw0KKwk8cD5CdXQgaWYgc28sIHRoZW4gdGhlIHZhbHVlIG9mIHRoYXQgcXVlcnkgZWxlbWVudCBpcyB0aGUgbmFtZQ0KKwkgIG9mIHRoZSBkZXNpcmVkIGNvbnN0YW50LiAgU28gd2UgcmV0dXJuIGl0LCByZWdhcmRsZXNzIG9mIHdoYXQNCisJICBpdCBpcy4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSdDaGVja2luZyBmb3IgQWNjZXB0YWJsZSBNSU1FIFR5cGVzJz4NCisJPHA+U2luY2UgYWxsIG9mIG91ciBtYXRoZW1hdGljYWwgY29uc3RhbnRzIGFyZSBzdHJpbmdzLCB3ZSdsbA0KKwkgIHNheSB0aGF0IHRoZSByZXN1bHQgTUlNRSB0eXBlIG9mIG91ciBwcm9kdWN0cyBpcw0KKwkgIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LiAgVGhhdCBtZWFucyB0aGF0IGFueSBpbmNvbWluZw0KKwkgIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBtdXN0IGluY2x1ZGUgYW55IG9mIHRoZSBmb2xsb3dpbmcgTUlNRSB0eXBlczoNCisJPC9wPg0KKwk8b2w+DQorCSAgPGxpPjxjb2RlPnRleHQvcGxhaW48L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+dGV4dC8qPC9jb2RlPjwvbGk+DQorCSAgPGxpPjxjb2RlPiovKjwvY29kZT48L2xpPg0KKwk8L29sPg0KKwk8cD5BbGwgb2YgdGhlc2UgbWF0Y2ggPGNvZGU+dGV4dC9wbGFpbjwvY29kZT4sIHdoaWNoIGlzIHRoZSBvbmx5DQorCSAgcHJvZHVjdCB0eXBlIHdlJ3JlIGNhcGFibGUgb2Ygc2VydmluZy4gIChJbiB5b3VyIG93biBwcm9kdWN0DQorCSAgc2VydmVycywgeW91IG1pZ2h0IGhhdmUgbW9yZSBjb21wbGV4IGxvZ2ljOyBmb3IgZXhhbXBsZSwgeW91DQorCSAgY291bGQgd3JpdGUgY29kZSB0byBkcmF3IHRoZSBudW1iZXJzIGludG8gYW4gaW1hZ2UgZmlsZSBpZiB0aGUNCisJICByZXF1ZXN0ZWQgdHlwZSBpcyA8Y29kZT5pbWFnZS9qcGVnPC9jb2RlPiAuLi4gYnV0IEkgd291bGRuJ3QNCisJICB3YW50IHRvLikNCisJPC9wPg0KKwk8cD5UbyBzdXBwb3J0IHRoaXMgaW4gb3VyIHF1ZXJ5IGhhbmRsZXIsIHdlJ2xsIHdyaXRlIGFub3RoZXINCisJICB1dGlsaXR5IG1ldGhvZC4gIEl0J2xsIGJlIGNhbGxlZA0KKwkgIDxjb2RlPmlzQWNjZXB0YWJsZVR5cGU8L2NvZGU+LCBhbmQgaXQgd2lsbCB0YWtlIHRoZQ0KKwkgIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBhbmQgZXhhbWluZSBpdCB0byBzZWUgd2hhdCBNSU1FIHR5cGVzDQorCSAgYXJlIGFjY2VwdGFibGUgdG8gdGhlIGNhbGxlci4gIElmIGl0IGZpbmRzIGFueSBvZiB0aGUgb25lcyBpbg0KKwkgIHRoZSBhYm92ZSBsaXN0LCBpdCB3aWxsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgYW5kIHRoZQ0KKwkgIGNhbGxlciBjYW4gY29udGludWUgdG8gcHJvY2VzcyB0aGUgcXVlcnkuICBJZiBub3QsIGl0IHdpbGwNCisJICByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBhbmQgdGhlIHF1ZXJ5IGhhbmRsZXIgd2lsbCBzdG9wDQorCSAgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gdW5hZG9ybmVkIHdpdGgNCisJICBhbnkgcmVzdWx0cy4NCisJPC9wPg0KKwk8cD5IZXJlJ3MgdGhlIGNvZGU6PC9wPg0KKw0KKwk8c291cmNlPmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorLi4uDQorcHVibGljIGNsYXNzIENvbnN0YW50SGFuZGxlcg0KKyAgaW1wbGVtZW50cyBRdWVyeUhhbmRsZXIgew0KKyAgLi4uDQorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWNjZXB0YWJsZVR5cGUoWE1MUXVlcnkgcSkgew0KKyAgICBMaXN0IG1pbWVzID0gcS5nZXRNaW1lQWNjZXB0KCk7DQorICAgIGlmIChtaW1lcy5pc0VtcHR5KCkpIHJldHVybiB0cnVlOw0KKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtaW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsNCisgICAgICBTdHJpbmcgdHlwZSA9IChTdHJpbmcpIGkubmV4dCgpOw0KKyAgICAgIGlmICgidGV4dC9wbGFpbiIuZXF1YWxzKHR5cGUpDQorICAgICAgICB8fCAidGV4dC8qIi5lcXVhbHModHlwZSkNCisgICAgICAgIHx8ICIqLyoiLmVxdWFscyh0eXBlKSkgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KK308L3NvdXJjZT4NCisNCisJPHA+SGVyZSwgd2UgY2hlY2sgaWYgdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBNSU1FIHR5cGVzIGlzIGVtcHR5Lg0KKwkgIEFuIGVtcHR5IGxpc3QgaXMgdGhlIHNhbWUgYXMgc2F5aW5nIDxjb2RlPiovKjwvY29kZT4sIHNvIHRoYXQNCisJICBhdXRvbWF0aWNhbGx5IHNheXMgd2UndmUgZ290IGFuIGFjY2VwdGFibGUgdHlwZS4gIEZvciBhDQorCSAgbm9uLWVtcHR5IGxpc3QsIHdlIGdvIHRocm91Z2ggZWFjaCB0eXBlIG9uZS1ieS1vbmUuICBJZiBpdCdzDQorCSAgYW55IG9mIHRoZSBzdHJpbmdzIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LA0KKwkgIDxjb2RlPnRleHQvKjwvY29kZT4sIG9yIDxjb2RlPiovKjwvY29kZT4sIHRoZW4gdGhhdCdzIGFuDQorCSAgYWNjZXB0YWJsZSB0eXBlLg0KKwk8L3A+DQorDQorCTxwPkhvd2V2ZXIsIGlmIHdlIGdldCB0aHJvdWdoIHRoZSBlbnRpcmUgbGlzdCBhbmQgd2UgZG9uJ3QgZmluZA0KKwkgIGFueSB0eXBlIHRoYXQgdGhlIHVzZXIgd2FudHMgdGhhdCB3ZSBjYW4gcHJvdmlkZSwgd2UgcmV0dXJuDQorCSAgPGNvZGU+ZmFsc2U8L2NvZGU+LiAgVGhlIHF1ZXJ5IGhhbmRsZXIgd2lsbCBjaGVjayBmb3IgYQ0KKwkgIDxjb2RlPmZhbHNlPC9jb2RlPiB2YWx1ZSBhbmQgcmV0dXJuIGVhcmx5IGZyb20gaGFuZGxpbmcgdGhlDQorCSAgcXVlcnksIGxlYXZpbmcgdGhlIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiB1bnRvdWNoZWQuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nSW5zZXJ0aW5nIHRoZSBSZXN1bHQnPg0KKwk8cD5Bc3N1bWluZyB0aGUgcXVlcnkgaGFuZGxlciBoYXMgZm91bmQgYW4gYWNjZXB0YWJsZSBNSU1FIHR5cGUsDQorCSAgYW5kIGhhcyBmb3VuZCBhIHZhbGlkIHF1ZXJ5IGFuZCB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZA0KKwkgIGNvbnN0YW50LCBpdCBjYW4gbG9va3VwIHRoZSBjb25zdGFudCBpbiB0aGUNCisJICA8Y29kZT5DT05TVEFOVFM8L2NvZGU+IG1hcC4gIEFuZCBhc3N1bWluZyBpdCBmaW5kcyBhIG1hdGNoaW5nDQorCSAgY29uc3RhbnQgaW4gdGhhdCBtYXAsIGl0IGNhbiBpbnNlcnQgdGhlIHZhbHVlIGFzIGENCisJICA8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdC4NCisJPC9wPg0KKw0KKwk8cD5UbyBpbnNlcnQgdGhlIGNvbnN0YW50J3MgdmFsdWUsIHdlJ2xsIGRldmVsb3AgeWV0IGFub3RoZXINCisJICB1dGlsaXR5IG1ldGhvZCwgdGhpcyB0aW1lIGNhbGxlZCA8Y29kZT5pbnNlcnQ8L2NvZGU+LiAgVGhpcw0KKwkgIG1ldGhvZCB3aWxsIHRha2UgdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50LCBpdHMgdmFsdWUsIGFuZCB0aGUNCisJICA8Y29kZT5YTUxRdWVyeTwvY29kZT4uICBJdCB3aWxsIGFkZCBhIDxjb2RlPlJlc3VsdDwvY29kZT4NCisJICBvYmplY3QgdG8gdGhlIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPi4gIFdoZW4gdGhlIHF1ZXJ5IGhhbmRsZXINCisJICByZXR1cm5zIHRoaXMgbW9kaWZpZWQgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IG9iamVjdCwgdGhlDQorCSAgZnJhbWV3b3JrIHdpbGwgcmV0dXJuIGl0IHRvIHRoZSBwcm9kdWN0IGNsaWVudCwgd2hpY2ggY2FuIHRoZW4NCisJICBkaXNwbGF5IHRoZSBtYXRjaGluZyByZXN1bHQuDQorCTwvcD4NCisNCisJPHA+PGNvZGU+UmVzdWx0PC9jb2RlPiBvYmplY3RzIGNhbiBhbHNvIGhhdmUgb3B0aW9uYWwNCisJICA8Y29kZT5IZWFkZXI8L2NvZGU+IG9iamVjdHMgdGhhdCBzZXJ2ZSBhcyAiY29sdW1uIGhlYWRpbmdzIg0KKwkgIGZvciB0YWJ1bGFyIGxpa2UgcmVzdWx0cy4gIE91ciByZXN1bHQgaXNuJ3QgdGFidWxhciwgaXQncyBqdXN0DQorCSAgYSBzaW5nbGUgdmFsdWUsIGJ1dCB3ZSdsbCBhZGQgYSBoZWFkaW5nIGFueXdheSBqdXN0IHRvDQorCSAgZGVtb25zdHJhdGUgaG93IGl0J3MgZG9uZS4gIChZb3UgY291bGQgYXJndWUgdGhhdCBpdCdzIGENCisJICBvbmUtYnktb25lIHRhYmxlLCB0b28hKSAgVGhlIGhlYWRlcidzIG5hbWUgd2lsbCBiZSB0aGUgc2FtZSBhcw0KKwkgIHRoZSBjb25zdGFudCdzIG5hbWU7IHRoZSBkYXRhIHR5cGUgd2lsbCBiZSA8Y29kZT5yZWFsPC9jb2RlPg0KKwkgIGFuZCB0aGUgdW5pdHMgd2lsbCBiZSA8Y29kZT5ub25lPC9jb2RlPi4NCisJPC9wPg0KKw0KKwk8cD5IZXJlJ3MgdGhlIGNvZGU6PC9wPg0KKw0KKwk8c291cmNlPmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuSGVhZGVyOw0KK2ltcG9ydCBqcGwuZWRhLnhtbHF1ZXJ5LlJlc3VsdDsNCisuLi4NCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRIYW5kbGVyDQorICBpbXBsZW1lbnRzIFF1ZXJ5SGFuZGxlciB7DQorICAuLi4NCisgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5zZXJ0KFN0cmluZyBuYW1lLA0KKyAgICBTdHJpbmcgdmFsdWUsIFhNTFF1ZXJ5IHEpIHsNCisgICAgSGVhZGVyIGggPSBuZXcgSGVhZGVyKG5hbWUsICJyZWFsIiwgIm5vbmUiKTsNCisgICAgUmVzdWx0IHIgPSBuZXcgUmVzdWx0KG5hbWUsICJ0ZXh0L3BsYWluIiwNCisgICAgICAvKnByb2ZpbGVJRCovbnVsbCwgLypyZXNvdXJjZUlEKi9udWxsLA0KKyAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaCksDQorICAgICAgdmFsdWUsIC8qY2xhc3NpZmllZCovZmFsc2UsIFJlc3VsdC5JTkZJTklURSk7DQorICAgIHEuZ2V0UmVzdWx0cygpLmFkZChyKTsNCisgIH0NCit9PC9zb3VyY2U+DQorDQorCTxwPkluIHRoaXMgbWV0aG9kLCB3ZSBmaXJzdCBjcmVhdGUgdGhlIGhlYWRlci4gIFRoZW4gd2UgY3JlYXRlDQorCSAgdGhlIHJlc3VsdDsgdGhlIHJlc3VsdCdzIElEICh3aGljaCBkaWZmZXJlbnRpYXRlcyBpdCBmcm9tDQorCSAgb3RoZXIgcmVzdWx0cyBpbiB0aGUgc2FtZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gaXMganVzdCB0aGUNCisJICBuYW1lIG9mIHRoZSBjb25zdGFudC4gIEl0cyBNSU1FIHR5cGUgaXMNCisJICA8Y29kZT50ZXh0L3BsYWluPC9jb2RlPi4gIFdlIHNldCB0aGUgcHJvZmlsZSBJRCBhbmQgcmVzb3VyY2UNCisJICBJRCBmaWVsZHMgdG8gPGNvZGU+bnVsbDwvY29kZT4sIGFzIHJlY29tbWVuZGVkIGJhY2sgaW4gdGhlIDxhDQorCSAgICBocmVmPSIvZWRtLXF1ZXJ5L3R1dG9yaWFsLyI+WE1MUXVlcnkgVHV0b3JpYWw8L2E+LiAgVGhlbiB3ZQ0KKwkgIGFkZCBvdXIgc29sZSBoZWFkZXIuICBUaGVuIHdlIGFkZCB0aGUgbWF0aGVtYXRpY2FsIGNvbnN0YW50J3MNCisJICB2YWx1ZS4gIEZpbmFsbHksIHRoaXMgY29uc3RhbnQgaXNuJ3QgY2xhc3NpZmllZCwgc28gd2Ugc2V0IHRoZQ0KKwkgIGNsYXNzaWZpZWQgZmxhZyB0byA8Y29kZT5mYWxzZTwvY29kZT4uICBBbHNvLCB0aGVzZQ0KKwkgIG1hdGhlbWF0aWNhbCBjb25zdGFudHMgc2hvdWxkIGJlIHZhbGlkIGZvcmV2ZXIsIHNvIHdlIHNldCB0aGUNCisJICB2YWxpZGl0eSBwZXJpb2QgdG8gPGNvZGU+UmVzdWx0LklORklOSVRFPC9jb2RlPiwgYSBzcGVjaWFsDQorCSAgdmFsdWUgdGhhdCBtZWFucyBhIG5ldmVyLWVuZGluZyB2YWxpZGl0eSBwZXJpb2QuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nSGFuZGxpbmcgdGhlIFF1ZXJ5Jz4NCisJPHA+V2l0aCBhbGwgb2YgdGhlc2UgdXRpbGl0eSBtZXRob2RzIGluIGhhbmQsIGl0J3MgZWFzeSB0bw0KKwkgIGhhbmRsZSB0aGUgcXVlcnkgbm93LiAgVGhlDQorCSAgPGNvZGU+anBsLmVkYS5wcm9kdWN0LlF1ZXJ5SGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlDQorCSAgc3BlY2lmaWVzIGEgc2luZ2xlIG1ldGhvZCB0aGF0IHdlIG11c3QgaW1wbGVtZW50LA0KKwkgIDxjb2RlPnF1ZXJ5PC9jb2RlPi4gIFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4NCisJICA8Y29kZT5YTUxRdWVyeTwvY29kZT4gb2JqZWN0IGFuZCByZXR1cm5zIGFuDQorCSAgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IG9iamVjdC4gIFRoZSByZXR1cm5lZCBvbmUgbWF5IG9yIG1heQ0KKwkgIG5vdCBiZSBhZG9ybmVkIHdpdGggbWF0Y2hpbmcgcmVzdWx0cy4NCisJPC9wPg0KKw0KKwk8cD5IZXJlJ3Mgd2hhdCB3ZSBoYXZlIHRvIGRvOjwvcD4NCisJPG9sPg0KKwkgIDxsaT5HZXQgdGhlIGNvbnN0YW50IG5hbWUgd2l0aCA8Y29kZT5nZXRDb25zdGFudE5hbWU8L2NvZGU+Lg0KKwkgICAgSWYgd2UgZ2V0IDxjb2RlPm51bGw8L2NvZGU+LCBpdCBtZWFucyB0aGUgcXVlcnkncyBub3Qgb2YNCisJICAgIHRoZSBmb3JtIDxjb2RlPmNvbnN0YW50ID0gPHZhcj5uYW1lPC92YXI+PC9jb2RlPiwgc28gd2UNCisJICAgIGlnbm9yZSBpdC4NCisJICA8L2xpPg0KKw0KKwkgIDxsaT5TZWUgaWYgdGhlIHVzZXIncyB3aWxsaW5nIHRvIGFjY2VwdCBhDQorCSAgICA8Y29kZT50ZXh0L3BsYWluPC9jb2RlPiBNSU1FIHR5cGUuICBJZiBub3QsIHdlIGlnbm9yZSB0aGlzIHF1ZXJ5Lg0KKwkgIDwvbGk+DQorDQorCSAgPGxpPkZpbmQgdGhlIGNvbnN0YW50IGluIG91ciA8Y29kZT5DT05TVEFOVFM8L2NvZGU+IG1hcC4gIElmDQorCSAgICBpdCdzIG5vdCB0aGVyZSwgd2UgaWdub3JlIHRoaXMgcXVlcnkuDQorCSAgPC9saT4NCisNCisJICA8bGk+SW5zZXJ0IHRoZSBjb25zdGFudCdzIHZhbHVlIGludG8gdGhlIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPi48L2xpPg0KKw0KKwkgIDxsaT5SZXR1cm5lZCB0aGUgbW9kaWZpZWQgPGNvZGU+WE1MUXVlcnk8L2NvZGU+LjwvbGk+DQorCTwvb2w+DQorDQorCTxwPlRoZSBzb3VyY2U6PC9wPg0KKw0KKwk8c291cmNlPnB1YmxpYyBjbGFzcyBDb25zdGFudEhhbmRsZXINCisgIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyIHsNCisgIC4uLg0KKyAgcHVibGljIFhNTFF1ZXJ5IHF1ZXJ5KFhNTFF1ZXJ5IHEpIHsNCisgICAgU3RyaW5nIG5hbWUgPSBnZXRDb25zdGFudE5hbWUocSk7DQorICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBxOw0KKyAgICBpZiAoIWlzQWNjZXB0YWJsZVR5cGUocSkpIHJldHVybiBxOw0KKyAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBDT05TVEFOVFMuZ2V0KG5hbWUpOw0KKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHE7DQorICAgIGluc2VydChuYW1lLCB2YWx1ZSwgcSk7DQorICAgIHJldHVybiBxOw0KKyAgfQ0KK308L3NvdXJjZT4NCisNCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nQ29tcGxldGUgU291cmNlIENvZGUnPg0KKwk8cD5IZXJlIGlzIHRoZSBjb21wbGV0ZSBzb3VyY2UgZmlsZSwNCisJPGNvZGU+Q29uc3RhbnRIYW5kbGVyLmphdmE8L2NvZGU+OjwvcD4NCisNCisJPHNvdXJjZT5pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQganBsLmVkYS5wcm9kdWN0LlF1ZXJ5SGFuZGxlcjsNCitpbXBvcnQganBsLmVkYS54bWxxdWVyeS5IZWFkZXI7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuUmVzdWx0Ow0KK2ltcG9ydCBqcGwuZWRhLnhtbHF1ZXJ5LlF1ZXJ5RWxlbWVudDsNCitpbXBvcnQganBsLmVkYS54bWxxdWVyeS5YTUxRdWVyeTsNCisNCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRIYW5kbGVyDQorICBpbXBsZW1lbnRzIFF1ZXJ5SGFuZGxlciB7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgQ09OU1RBTlRTID0gbmV3IEhhc2hNYXAoKTsNCisgIHN0YXRpYyB7DQorICAgIENPTlNUQU5UUy5wdXQoInBpIiwgICAgIjMuMTQxNTkyNjUuLi4iKTsNCisgICAgQ09OU1RBTlRTLnB1dCgiZSIsICAgICAiMi43MTgyODE4Mjg1Li4uIik7DQorICAgIENPTlNUQU5UUy5wdXQoImdhbW1hIiwgIjAuNTc3MjE1NjY0Li4uIik7DQorICB9DQorICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnROYW1lKFhNTFF1ZXJ5IHEpIHsNCisgICAgTGlzdCBzdGFjayA9IHEuZ2V0V2hlcmVFbGVtZW50U2V0KCk7DQorICAgIGlmIChzdGFjay5zaXplKCkgIT0gMykgcmV0dXJuIG51bGw7DQorICAgIFF1ZXJ5RWxlbWVudCBlID0gKFF1ZXJ5RWxlbWVudCkgc3RhY2suZ2V0KDApOw0KKyAgICBpZiAoISJlbGVtTmFtZSIuZXF1YWxzKGUuZ2V0Um9sZSgpKQ0KKyAgICAgIHx8ICEiY29uc3RhbnQiLmVxdWFscyhlLmdldFZhbHVlKCkpKQ0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICBlID0gKFF1ZXJ5RWxlbWVudCkgc3RhY2suZ2V0KDIpOw0KKyAgICBpZiAoISJSRUxPUCIuZXF1YWxzKGUuZ2V0Um9sZSgpKQ0KKyAgICAgIHx8ICEiRVEiLmVxdWFscyhlLmdldFZhbHVlKCkpKQ0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICBlID0gKFF1ZXJ5RWxlbWVudCkgc3RhY2suZ2V0KDEpOw0KKyAgICBpZiAoISJMSVRFUkFMIi5lcXVhbHMoZS5nZXRSb2xlKCkpKQ0KKwlyZXR1cm4gbnVsbDsNCisgICAgcmV0dXJuIGUuZ2V0VmFsdWUoKTsNCisgIH0NCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBY2NlcHRhYmxlVHlwZShYTUxRdWVyeSBxKSB7DQorICAgIExpc3QgbWltZXMgPSBxLmdldE1pbWVBY2NlcHQoKTsNCisgICAgaWYgKG1pbWVzLmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7DQorICAgIGZvciAoSXRlcmF0b3IgaSA9IG1pbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgew0KKyAgICAgIFN0cmluZyB0eXBlID0gKFN0cmluZykgaS5uZXh0KCk7DQorICAgICAgaWYgKCJ0ZXh0L3BsYWluIi5lcXVhbHModHlwZSkNCisgICAgICAgIHx8ICJ0ZXh0LyoiLmVxdWFscyh0eXBlKQ0KKyAgICAgICAgfHwgIiovKiIuZXF1YWxzKHR5cGUpKSByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydChTdHJpbmcgbmFtZSwNCisgICAgU3RyaW5nIHZhbHVlLCBYTUxRdWVyeSBxKSB7DQorICAgIEhlYWRlciBoID0gbmV3IEhlYWRlcihuYW1lLCAicmVhbCIsICJub25lIik7DQorICAgIFJlc3VsdCByID0gbmV3IFJlc3VsdChuYW1lLCAidGV4dC9wbGFpbiIsDQorICAgICAgLypwcm9maWxlSUQqL251bGwsIC8qcmVzb3VyY2VJRCovbnVsbCwNCisgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGgpLA0KKyAgICAgIHZhbHVlLCAvKmNsYXNzaWZpZWQqL2ZhbHNlLCBSZXN1bHQuSU5GSU5JVEUpOw0KKyAgICBxLmdldFJlc3VsdHMoKS5hZGQocik7DQorICB9DQorICBwdWJsaWMgWE1MUXVlcnkgcXVlcnkoWE1MUXVlcnkgcSkgew0KKyAgICBTdHJpbmcgbmFtZSA9IGdldENvbnN0YW50TmFtZShxKTsNCisgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIHE7DQorICAgIGlmICghaXNBY2NlcHRhYmxlVHlwZShxKSkgcmV0dXJuIHE7DQorICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIENPTlNUQU5UUy5nZXQobmFtZSk7DQorICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gcTsNCisgICAgaW5zZXJ0KG5hbWUsIHZhbHVlLCBxKTsNCisgICAgcmV0dXJuIHE7DQorICB9DQorfTwvc291cmNlPg0KKw0KKwk8cD5Ib3cgc2hvdWxkIHlvdSBnbyBhYm91dCBjb21waWxpbmcgdGhpcyBhbmQgaW5zdGFsbGluZyBpdCBpbg0KKwkgIGEgcHJvZHVjdCBzZXJ2ZXI/ICBSZWFkIG9uIQ0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IkNvbXBpbGluZyB0aGUgQ29kZSI+DQorICAgICAgPHA+V2UnbGwgY29tcGlsZSB0aGlzIGNvZGUgdXNpbmcgdGhlIEoyU0RLIGNvbW1hbmQtbGluZSB0b29scywNCisJYnV0IGlmIHlvdSdyZSBtb3JlIGNvbWZvcnRhYmxlIHdpdGggc29tZSBraW5kIG9mIEludGVncmF0ZWQNCisJRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSksIGFkanVzdCBhcyBuZWNlc3NhcnkuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkZpcnN0LCBsZXQncyBnbyBiYWNrIHRvIHRoZSA8Y29kZT4kUFNfSE9NRTwvY29kZT4gZGlyZWN0b3J5DQorCXdlIG1hZGUgZWFybGllciBhbmQgbWFrZSBkaXJlY3RvcmllcyB0byBob2xkIGJvdGggdGhlIHNvdXJjZQ0KKwljb2RlIGFuZCBjbGFzc2VzIHRoYXQgd2UnbGwgY29tcGlsZSBmcm9tIGl0Og0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c291cmNlPiUgPGI+Y2QgJFBTX0hPTUU8L2I+DQorJSA8Yj5ta2RpciBjbGFzc2VzIHNyYzwvYj48L3NvdXJjZT4NCisNCisgICAgICA8cD5UaGVuLCBjcmVhdGUgPGNvZGU+JFBTX0hPTUUvc3JjL0NvbnN0YW50SGFuZGxlci5qYXZhPC9jb2RlPiB1c2luZw0KKwl5b3VyIGZhdm9yaXRlIHRleHQgZWRpdG9yIChvciBieSBjdXR0aW5nIGFuZCBwYXN0aW5nIHRoZSBzb3VyY2UNCisJZnJvbSB0aGlzIHBhZ2UsIG9yIHdoYXRldmVyKS4gIEZpbmFsbHksIGNvbXBpbGUgdGhlIGZpbGUgYXMgZm9sbG93czoNCisgICAgICA8L3A+DQorDQorICAgICAgPHNvdXJjZT4lIDxiPmphdmFjIC1leHRkaXJzIGxpYiBcDQorICAtZCBjbGFzc2VzIHNyYy9Db25zdGFudEhhbmRsZXIuamF2YTwvYj4NCislIGxzIC1sIGNsYXNzZXMNCit0b3RhbCA0DQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgIDI1MjQgMjUgRmViIDE1OjQ2IENvbnN0YW50SGFuZGxlci5jbGFzczwvc291cmNlPg0KKw0KKyAgICAgIDxwPlRoZSA8Y29kZT5qYXZhYzwvY29kZT4gY29tbWFuZCBpcyB0aGUgSmF2YSBjb21waWxlci4gIFRoZQ0KKwk8Y29kZT4tZXh0ZGlycyBsaWI8L2NvZGU+IGFyZ3VtZW50cyB0ZWxsIHRoZSBjb21waWxlciB3aGVyZSB0bw0KKwlmaW5kIGV4dGVuc2lvbiBqYXJzLiAgSW4gdGhpcyBjYXNlLCB0aGUgY29kZSByZWZlcmVuY2VzIHRoaW5ncw0KKwlkZWZpbmVkIGluIGVkbS1xdWVyeS0yLjAuMi5qYXIgYW5kIGdyaWQtcHJvZHVjdC0zLjAuMy5qYXIuDQorCVRoZSA8Y29kZT4tZCBjbGFzc2VzPC9jb2RlPiB0ZWxscyB3aGVyZSBjb21waWxlZCBjbGFzc2VzDQorCXNob3VsZCBnby4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+TmV4dCwgbWFrZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgeW91ciBjb21waWxlZCBjbGFzczo8L3A+DQorDQorICAgICAgPHNvdXJjZT4lIDxiPmphciAtY2YgbGliL215LWhhbmRsZXJzLmphciBcDQorICAtQyBjbGFzc2VzIENvbnN0YW50SGFuZGxlci5jbGFzczwvYj4NCislIDxiPmphciAtdGYgbGliL215LWhhbmRsZXJzLmphcjwvYj4NCitNRVRBLUlORi8NCitNRVRBLUlORi9NQU5JRkVTVC5NRg0KK0NvbnN0YW50SGFuZGxlci5jbGFzczwvc291cmNlPg0KKw0KKyAgICAgIDxwPldlIG5vdyBoYXZlIGEgbmV3IGphciBmaWxlIG9mIG91ciBvd24gY3JlYXRpb24gaW4gdGhlDQorCTxjb2RlPiRQU19IT01FL2xpYjwvY29kZT4gZGlyZWN0b3J5OyB0aGlzIG1lYW5zIHRoYXQgdGhlDQorCXByb2R1Y3Qgc2VydmVyIHdpbGwgYmUgYWJsZSB0byBmaW5kIG91dCBuZXcgcXVlcnkgaGFuZGxlci4NCisJQWxsIHdlIGhhdmUgdG8gZG8gbm93IGlzIHRlbGwgb3VyIHByb2R1Y3Qgc2VydmVyIGFib3V0IGl0Lg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSdTcGVjZnlpbmcgdGhlIFF1ZXJ5IEhhbmRsZXInPg0KKyAgICAgIDxwPlF1ZXJ5IGhhbmRsZXJzIGFyZW4ndCByZWFsbHkgPGVtPmluc3RhbGxlZDwvZW0+IGludG8gcHJvZHVjdA0KKwlzZXJ2ZXJzLiAgV2hhdCB5b3UgZG8gaXMgdGVsbCB0aGUgcHJvZHVjdCBzZXJ2ZXIgd2hhdCBxdWVyeQ0KKwloYW5kbGVycyB5b3Ugd2FudCBpdCB0byB1c2UgYnkgbmFtaW5nIHRoZWlyIGNsYXNzZXMuICBUaGUNCisJcHJvZHVjdCBzZXJ2ZXIgd2lsbCBpbnN0YW50aWF0ZSBhbiBvYmplY3Qgb2YgZWFjaCBjbGFzcyBhbmQsDQorCWFzIHF1ZXJpZXMgY29tZSBpbiwgaXQgd2lsbCBkZWxlZ2F0ZSBxdWVyaWVzIHRvIGVhY2gNCisJaW5zdGFudGlhdGVkIHF1ZXJ5IGhhbmRsZXIuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPlRvIHRlbGwgYSBwcm9kdWN0IHNlcnZlciB3aGF0IHF1ZXJ5IGhhbmRsZXJzIHRvIGluc3RhbnRpYXRlLA0KKwl5b3Ugc3BlY2lmeSBhIHN5c3RlbSBwcm9wZXJ0eSBjYWxsZWQgPGNvZGU+aGFuZGxlcnM8L2NvZGU+Lg0KKwlZb3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcw0KKwluYW1lcy4gIFRoZXNlIHNob3VsZCBiZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZXMgKHdpdGgNCisJcGFja2FnZSBwcmVmaXhlcywgaWYgeW91IHVzZWQgcGFja2FnZXMgd2hlbiBtYWtpbmcgeW91ciBxdWVyeQ0KKwloYW5kbGVycyksIHNlcGFyYXRlZCBieSBjb21tYXMuICBJbiB0aGlzIHR1dG9yaWFsLCB3ZSBtYWRlDQorCWp1c3Qgb25lIHF1ZXJ5IGhhbmRsZXIsIGFuZCB3ZSBkaWRuJ3QgcHV0IGl0IGludG8gYSBwYWNrYWdlLA0KKwlzbyB3ZSdsbCBqdXN0IHVzZSA8Y29kZT5Db25zdGFudEhhbmRsZXI8L2NvZGU+Lg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5GaXJzdCwgc3RvcCBhbnkgcHJvZHVjdCBzZXJ2ZXIgeW91IGhhdmUgcnVubmluZyBub3cgYnkNCisJcHJlc3NpbmcgQ1RSTCtDIChvciB3aGF0ZXZlciB5b3VyIGludGVycnVwdCBrZXkgaXMpIGluIHRoZQ0KKwl3aW5kb3cgdGhhdCB3YXMgcnVubmluZyB0aGUgcHJvZHVjdCBzZXJ2ZXIuICBOZXh0LCBtb2RpZnkgdGhlDQorCTxjb2RlPiRQU19IT01FL2Jpbi9wczwvY29kZT4gZmlsZSBzbyBpdCByZWFkcyBhcyBmb2xsb3dzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c291cmNlPiMhL2Jpbi9zaA0KK2V4ZWMgamF2YSAtRGphdmEuZXh0LmRpcnM9JFBTX0hPTUUvbGliIFwNCisgICAgLURoYW5kbGVycz1Db25zdGFudEhhbmRsZXIgXA0KKyAgICBqcGwuZWRhLkV4ZWNTZXJ2ZXIgXA0KKyAgICBqcGwuZWRhLnByb2R1Y3Qucm1pLlByb2R1Y3RTZXJ2aWNlSW1wbCBcDQorICAgIHVybjplZGE6cm1pOk15UHJvZHVjdFNlcnZpY2U8L3NvdXJjZT4NCisNCisgICAgICA8cD5XZSBzcGVjaWZpZWQgYSBzeXN0ZW0gcHJvcGVydHkgb24gdGhlIGNvbW1hbmQgbGluZSB1c2luZw0KKwlKYXZhJ3MgPGNvZGU+LUQ8L2NvZGU+IG9wdGlvbi4gIFRoaXMgZGVmaW5lcyB0aGUgc3lzdGVtDQorCXByb3BlcnR5IDxjb2RlPmhhbmRsZXJzPC9jb2RlPiBhcyBoYXZpbmcgdGhlIHZhbHVlDQorCTxjb2RlPkNvbnN0YW50SGFuZGxlcjwvY29kZT4uICBGaW5hbGx5LCBzdGFydCB0aGUgcHJvZHVjdA0KKwlzZXJ2ZXIgYWdhaW4gYnkgcnVubmluZyA8Y29kZT4kUFNfSE9NRS9iaW4vcHM8L2NvZGU+Lg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSdRdWVyeWluZyBmb3IgQ29uc3RhbnRzJz4NCisgICAgICA8cD5PbmNlIGFnYWluLCBlZGl0IHRoZSA8Y29kZT4kUFNfSE9NRS9iaW4vcGM8L2NvZGU+IHNjcmlwdCBhbmQNCisJY2hhbmdlIDxjb2RlPi14bWw8L2NvZGU+IGJhY2sgdG8gPGNvZGU+LW91dDwvY29kZT4gc28gdGhhdA0KKwlpbnN0ZWFkIG9mIHRoZSBYTUwgb3V0cHV0IHdlJ2xsIHNlZSB0aGUgcmF3IHByb2R1Y3QgZGF0YS4NCisJVGhlbiBydW4gaXQgYW5kIHNlZSB3aGF0IGhhcHBlbnM6DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+JSA8Yj4kUFNfSE9NRS9iaW4vcGMgJ2NvbnN0YW50ID0gcGknPC9iPg0KKzMuMTQxNTkyNjUuLi4lIDwvc291cmNlPg0KKw0KKyAgICAgIDxwPkJlY2F1c2UgdGhlIHJhdyBwcm9kdWN0IGRhdGEgd2FzIHRoZSBzdHJpbmcNCisJPGNvZGU+My4xNDE1OTI2NS4uLjwvY29kZT4gd2l0aG91dCBhbnkgdHJhaWxpbmcgbmV3bGluZSwgdGhlDQorCXNoZWxsJ3MgcHJvbXB0IGFwcGVhcmVkIHJpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIHByb2R1Y3QNCisJcmVzdWx0LiAgWW91IG1pZ2h0IHRyeSBwaXBpbmcgdGhlIG91dHB1dCBvZiB0aGUgYWJvdmUgY29tbWFuZA0KKwl0aHJvdWdoIGEgcGFnZXIgbGlrZSA8Y29kZT5tb3JlPC9jb2RlPiBvciA8Y29kZT5sZXNzPC9jb2RlPiB0bw0KKwlhdm9pZCB0aGlzLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5IZXJlJ3Mgd2hhdCBoYXBwZW5lZCB3aGVuIHdlIHJhbiB0aGlzIGNvbW1hbmQ6PC9wPg0KKw0KKyAgICAgIDxvbD4NCisJPGxpPlRoZSBwcm9kdWN0IGNsaWVudCBjcmVhdGVkIGFuIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBvYmplY3QNCisJICBvdXQgb2YgdGhlIHN0cmluZyBxdWVyeSA8Y29kZT5jb25zdGFudCA9IHBpPC9jb2RlPi4NCisJPC9saT4NCisNCisJPGxpPkl0IGFza2VkIHRoZSBSTUkgUmVnaXN0cnkgdG8gdGVsbCBpdCB3aGVyZSAobmV0d29yaw0KKwkgIGFkZHJlc3MpIGl0IGNvdWxkIGZpbmQgdGhlIHByb2R1Y3Qgc2VydmljZSBuYW1lZA0KKwkgIDxjb2RlPk15UHJvZHVjdFNlcnZpY2U8L2NvZGU+Lg0KKwk8L2xpPg0KKw0KKwk8bGk+QWZ0ZXIgZ2V0dGluZyB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBSTUkgUmVnaXN0cnksIGl0DQorCSAgdGhlbiBjb250YWN0ZWQgdGhlIHByb2R1Y3Qgc2VydmljZSBvdmVyIGEgbmV0d29yayBjb25uZWN0aW9uDQorCSAgKGV2ZW4gaWYgdG8gdGhlIHNhbWUgbG9jYWwgc3lzdGVtKSBhbmQgYXNrZWQgaXQgdG8gaGFuZGxlDQorCSAgdGhlIHF1ZXJ5LCBwYXNzaW5nIHRoZSBxdWVyeSBvYmplY3QuDQorCTwvbGk+DQorDQorCTxsaT5UaGUgcHJvZHVjdCBzZXJ2aWNlIGhhZCBvbmx5IG9uZSBxdWVyeSBoYW5kbGVyLCB0aGUNCisJICA8Y29kZT5Db25zdGFudEhhbmRsZXI8L2NvZGU+LCB0byB3aGljaCB0byBkZWxlZ2F0ZSwgc28gaXQNCisJICBwYXNzZWQgdGhlIFhNTFF1ZXJ5IHRvIGl0Lg0KKwk8L2xpPg0KKw0KKwk8bGk+VGhlIDxjb2RlPkNvbnN0YW50SGFuZGxlcjwvY29kZT4ncyA8Y29kZT5xdWVyeTwvY29kZT4NCisJICBtZXRob2Qgd2FzIGNhbGxlZC4gIEl0IGNoZWNrZWQgaWYgdGhlIHF1ZXJ5IHdhcyB0aGUga2luZCBpdA0KKwkgIHdhbnRlZCwgZXh0cmFjdGVkIHRoZSBkZXNpcmVkIG1hdGhlbWF0aWNhbCBjb25zdGFudCdzIG5hbWUsDQorCSAgY2hlY2tlZCBmb3IgYW4gYWNjZXB0YWJsZSByZXF1ZXN0ZWQgTUlNRSB0eXBlLCBsb29rZWQgdXAgdGhlDQorCSAgY29uc3RhbnQncyB2YWx1ZSwgaW5zZXJ0ZWQgaXQgYXMgYSA8Y29kZT5SZXN1bHQ8L2NvZGU+IGludG8NCisJICB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+LCBhbmQgcmV0dXJuZWQgdGhlIG1vZGlmaWVkIHF1ZXJ5Lg0KKwk8L2xpPg0KKw0KKwk8bGk+VGhlIHByb2R1Y3Qgc2VydmljZSwgc2VlaW5nIGl0IGhhZCBubyBvdGhlciBoYW5kbGVycyB0bw0KKwkgIHRyeSwgcmV0dXJuZWQgdGhlIG1vZGlmaWVkIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiB0byB0aGUNCisJICBwcm9kdWN0IGNsaWVudCBvdmVyIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24uDQorCTwvbGk+DQorDQorCTxsaT5UaGUgcHJvZHVjdCBjbGllbnQgdG9vayB0aGUgZmlyc3QgPGNvZGU+UmVzdWx0PC9jb2RlPiBvdXQNCisJICBvZiB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+LCBjYWxsZWQNCisJICA8Y29kZT5SZXN1bHQuZ2V0SW5wdXRTdHJlYW08L2NvZGU+LCBhbmQgY29waWVkIGVhY2ggYnl0ZSBvZg0KKwkgIHRoZSByZXN1bHQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIFRoaXMgd3JvdGUNCisJICA8Y29kZT4zLjE0MTU5MjY1Li4uPC9jb2RlPiB0byB5b3VyIHdpbmRvdy4NCisJPC9saT4NCisgICAgICA8L29sPg0KKw0KKyAgICAgIDxwPklmIHlvdSBjaGFuZ2UgdGhlIDxjb2RlPiRQU19IT01FL2Jpbi9wYzwvY29kZT4gc2NyaXB0IGFnYWluDQorCXNvIHRoYXQgaW5zdGVhZCBvZiA8Y29kZT4tb3V0PC9jb2RlPiBpdCdzIDxjb2RlPi14bWw8L2NvZGU+LA0KKwl5b3UnbGwgYWdhaW4gc2VlIHRoZSBYTUxRdWVyeSBhcyBhbiBYTUwgZG9jdW1lbnQuICBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgPGNvZGU+Jmx0O3F1ZXJ5UmVzdWx0U2V0Jmd0OzwvY29kZT46DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbPHF1ZXJ5UmVzdWx0U2V0Pg0KKyAgPHJlc3VsdEVsZW1lbnQgY2xhc3NpZmllZD0iZmFsc2UiIHZhbGlkaXR5PSItMSI+DQorICAgIDxyZXN1bHRJZD5waTwvcmVzdWx0SWQ+DQorICAgIDxyZXN1bHRNaW1lVHlwZT50ZXh0L3BsYWluPC9yZXN1bHRNaW1lVHlwZT4NCisgICAgPHByb2ZJZC8+DQorICAgIDxpZGVudGlmaWVyLz4NCisgICAgPHJlc3VsdEhlYWRlcj4NCisgICAgICA8aGVhZGVyRWxlbWVudD4NCisJPGVsZW1OYW1lPnBpPC9lbGVtTmFtZT4NCisJPGVsZW1UeXBlPnJlYWw8L2VsZW1UeXBlPg0KKwk8ZWxlbVVuaXQ+bm9uZTwvZWxlbVVuaXQ+DQorICAgICAgPC9oZWFkZXJFbGVtZW50Pg0KKyAgICA8L3Jlc3VsdEhlYWRlcj4NCisgICAgPHJlc3VsdFZhbHVlIHhtbDpzcGFjZT0icHJlc2VydmUiPjMuMTQxNTkyNjUuLi48L3Jlc3VsdFZhbHVlPg0KKyAgPC9yZXN1bHRFbGVtZW50Pg0KKzwvcXVlcnlSZXN1bHRTZXQ+XV0+PC9zb3VyY2U+DQorDQorICAgICAgPHA+SSdsbCBsZXQgeW91IGZpZ3VyZSBvdXQgaG93IHRoaXMgbWFwcyB0byB0aGUNCisJPGNvZGU+UmVzdWx0PC9jb2RlPiBvYmplY3Qgd2UgY3JlYXRlZCBpbiB0aGUgY29kZS4gIE9LLCBzbyBpcw0KKwl0aGlzIHJlYWxseSBpbnRlcmVzdGluZz8gIE5vdCByZWFsbHksIGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlDQorCWFjdHVhbCByZXN1bHQgZGF0YSwgPGNvZGU+My4xNDE1MjY1Li4uPC9jb2RlPiwgYXBwZWFycyBpbiB0aGUNCisJWE1MIGRvY3VtZW50LiAgSW4gdGhlIE9PRFQgZnJhbWV3b3JrLCB3ZSBjYWxsIHRoaXMgYSAic21hbGwiDQorCXJlc3VsdCwgYmVjYXVzZSB0aGUgcHJvZHVjdCBkYXRhIHdhcyBlbWJlZGRlZCBpbiB0aGUgWE1MUXVlcnkNCisJb2JqZWN0LiAgVGV4dCBkYXRhIGxpa2UgPGNvZGU+dGV4dC9wbGFpbjwvY29kZT4gcHJvZHVjdHMNCisJYXBwZWFyIGp1c3QgYXMgdGV4dC4gIEJpbmFyeSBkYXRhIGxpa2UgPGNvZGU+aW1hZ2UvanBlZzwvY29kZT4NCisJYW5kIDxjb2RlPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvY29kZT4gZ2V0IGJhc2UtNjQgZW5jb2RlZA0KKwlpbnRvIHRleHQuDQorICAgICAgPC9wPg0KKyAgICAgIDxwPkFzIHlvdSBjYW4gZ3Vlc3MsIHRoZXJlJ3MgYSBwb2ludCBhdCB3aGljaCBlbmNvZGVkIGRhdGEgZ29lcw0KKwlmcm9tIGJlaW5nIG5pY2UgYW5kIHNtYWxsIGFuZCB0aWR5IHRvIGp1c3QgdG9vIGxhcmdlIHRvDQorCWNvbnRhaW4gaW4gYSBzaW5nbGUgb2JqZWN0LiAgSW4gdGhlIE9PRFQgZnJhbWV3b3JrLCB3ZSBjYW4gdXNlDQorCWEgc3BlY2lhbCBxdWVyeSBoYW5kbGVyIGZvciBzdWNoIGxhcmdlIHByb2R1Y3RzLCBidXQgdGhhdCdzDQorCWFub3RoZXIgdHV0b3JpYWwuDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9J0NvbmNsdXNpb24nPg0KKyAgICAgIDxwPkluIHRoaXMgdHV0b3JpYWwsIHdlIGxlYXJuZWQgaG93IHRvIHdyaXRlIGEgY29tcGxldGUgcXVlcnkNCisJaGFuZGxlciBmb3IgYSBwcm9kdWN0IHNlcnZlciwgaW5jbHVkaW5nIGhhbmRsaW5nIG9mIHBvc3RmaXgNCisJYm9vbGVhbiAid2hlcmUiIHN0YWNrcywgbGlzdHMgb2YgYWNjZXB0YWJsZSBNSU1FIHR5cGVzLCBhbmQNCisJcmVzdWx0IGhlYWRlcnMuICBXZSBjb21waWxlZCB0aGUgcXVlcnkgaGFuZGxlciwgcHV0IGl0IGludG8gYQ0KKwlqYXIgZmlsZSwgYW5kIHNwZWNpZmllZCBpdCB0byBvdXIgcHJvZHVjdCBzZXJ2ZXIuICBBbmQgd2UNCisJY291bGQgZXZlbiBxdWVyeSBpdCBhbmQgZ2V0IGRhdGEgYmFjay4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+RG9uJ3QgdG9zcyBvdXQgdGhpcyBwcm9kdWN0IHNlcnZlciB5ZXQsIHRob3VnaC4gIEFub3RoZXINCisJdHV0b3JpYWwgd2lsbCB1c2UgaXQgYW5kIGNvdmVyIHRoZSBpbmZhbW91cw0KKwk8Y29kZT5MYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXI8L2NvZGU+Lg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKyAgPC9ib2R5Pg0KKzwvZG9jdW1lbnQ+DQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vdXRpbC9PRlNOVXRpbHNUZXN0LmphdmEgYi8wLjEwL3Byb2R1Y3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvaGFuZGxlcnMvb2Zzbi91dGlsL09GU05VdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWE0NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9kdWN0L3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L2hhbmRsZXJzL29mc24vdXRpbC9PRlNOVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5oYW5kbGVycy5vZnNuLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBPRlNOVXRpbHN9LgorICoKKyAqIEBhdXRob3Igcml2ZXJtYQorICovCitwdWJsaWMgY2xhc3MgT0ZTTlV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgT0ZTTlV0aWxzVGVzdChTdHJpbmcgaWQpIHsKKyAgICAgICAgc3VwZXIoaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU9GU04oKSB7CisgICAgICAgIAorICAgICAgICBhc3NlcnRUcnVlKE9GU05VdGlscy52YWxpZGF0ZU9GU04oIi9kYXRhc2V0L2RpcjEiKSk7CisgICAgICAgIGFzc2VydFRydWUoT0ZTTlV0aWxzLnZhbGlkYXRlT0ZTTigiL2RhdGFzZXQvZGlyMS8iKSk7CisgICAgICAgIGFzc2VydFRydWUoT0ZTTlV0aWxzLnZhbGlkYXRlT0ZTTigiL2RhdGFzZXQvZGlyMS9maWxlMS5oNSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoT0ZTTlV0aWxzLnZhbGlkYXRlT0ZTTigiL2RhdGFzZXQvLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZCIpKTsKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9DaHVua2VkUHJvZHVjdElucHV0U3RyZWFtVGVzdC5qYXZhIGIvMC4xMC9wcm9kdWN0L3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9DaHVua2VkUHJvZHVjdElucHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjUzMWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2R1Y3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUmV0cmlldmVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIDxjb2RlPkNodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW08L2NvZGU+LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS41ICQKKyAqLworcHVibGljIGNsYXNzIENodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBSZXRyaWV2ZXIgeworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2h1bmtlZFByb2R1Y3RJbnB1dFN0cmVhbVRlc3Q8L2NvZGU+IGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIGlkIENhc2UgbmFtZS4KKwkgKi8KKwlwdWJsaWMgQ2h1bmtlZFByb2R1Y3RJbnB1dFN0cmVhbVRlc3QoU3RyaW5nIGlkKSB7CisJCXN1cGVyKGlkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlkYXRhID0gbmV3IGJ5dGVbNDA5Nl07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgKytpKQorCQkJZGF0YVtpXSA9IChieXRlKSAoaSAlIDI1Nik7CisJfQorCisJLyoqCisJICogVGVzdCByZWFkaW5nIGEgc2luZ2xlIGJ5dGUgYXQgYSB0aW1lLgorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisgCXB1YmxpYyB2b2lkIHRlc3RCeXRlUmVhZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgCQlDaHVua2VkUHJvZHVjdElucHV0U3RyZWFtIGluID0gbmV3IENodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW0oInRlc3QiLCB0aGlzLCA0MDk2KTsKKyAJCWZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgKytpKQorIAkJCWFzc2VydEVxdWFscyh0b0J5dGUoaSAlIDI1NiksIHRvQnl0ZShpbi5yZWFkKCkgJiAweGZmKSk7CisgCQlhc3NlcnRFcXVhbHMoLTEsIGluLnJlYWQoKSk7CisgCQlpbi5jbG9zZSgpOworIAl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlSZWFkaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ2h1bmtlZFByb2R1Y3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBDaHVua2VkUHJvZHVjdElucHV0U3RyZWFtKCJ0ZXN0IiwgdGhpcywgNDA5Nik7CisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDQwOTYpOworCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU2XTsKKwkJaW50IG51bTsKKwkJd2hpbGUgKChudW0gPSBpbi5yZWFkKGJ1ZikpICE9IC0xKQorCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbnVtKTsKKwkJaW4uY2xvc2UoKTsKKwkJb3V0LmNsb3NlKCk7CisJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhkYXRhLCBvdXQudG9CeXRlQXJyYXkoKSkpOworCX0KKworCS8qKgorCSAqIFRlc3QgcmVhZGluZyBhbmQgc2tpcHBpbmcgYnkgdmFyaW91cyBhbW91bnRzLgorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFJlYWRpbmdBbmRTa2lwcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgQ2h1bmtlZFByb2R1Y3RJbnB1dFN0cmVhbSgidGVzdCIsIHRoaXMsIDQwOTYpOworCQkKKwkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzRdOwkJCQkJCQkgICAgLy8gQnl0ZSBudW1iZXI6CisJCWFzc2VydEVxdWFscygwLCBpbi5yZWFkKCkpOwkJCQkJCQkgICAgLy8gMAorCQlhc3NlcnRFcXVhbHMoMCwgaW4uc2tpcCgwKSk7CQkJCQkJCSAgICAvLyAwCisJCWFzc2VydEVxdWFscyg0LCBpbi5yZWFkKGJ1ZikpOwkJCQkJCQkgICAgLy8gMSwgMiwgMywgNAorCQlhc3NlcnRFcXVhbHModG9CeXRlKDEpLCBidWZbMF0pOworCQlhc3NlcnRFcXVhbHModG9CeXRlKDIpLCBidWZbMV0pOworCQlhc3NlcnRFcXVhbHModG9CeXRlKDMpLCBidWZbMl0pOworCQlhc3NlcnRFcXVhbHModG9CeXRlKDQpLCBidWZbM10pOworCQlhc3NlcnRFcXVhbHModG9CeXRlKDUpLCB0b0J5dGUoaW4ucmVhZCgpKSk7CQkJCQkgICAgLy8gNQorCQlhc3NlcnRFcXVhbHMoNCwgaW4uc2tpcCg0KSk7CQkJCQkJCSAgICAvLyA2LCA3LCA4LCA5CisJCWFzc2VydEVxdWFscyh0b0J5dGUoMTApLCB0b0J5dGUoaW4ucmVhZCgpKSk7CQkJCQkgICAgLy8gMTAKKwkJYXNzZXJ0RXF1YWxzKDEwMDAsIGluLnNraXAoMTAwMCkpOwkJCQkJCSAgICAvLyAxMSwgMTIsIC4uLiwgMTAxMAorCQlhc3NlcnRFcXVhbHModG9CeXRlKDEwMTEgJSAyNTYpLCB0b0J5dGUoaW4ucmVhZCgpKSk7CQkJCSAgICAvLyAxMDExCisKKwkJYnVmID0gbmV3IGJ5dGVbMTAwMF07CisJCWludCB0b1JlYWQgPSAxMDAwOworCQlpbnQgaW5kZXggPSAwOworCQl3aGlsZSAodG9SZWFkID4gMCkgewkJCQkJCQkJICAgIC8vIDEwMTIsIDEwMTMsIC4uLiwgMjAxMQorCQkJaW50IG51bVJlYWQgPSBpbi5yZWFkKGJ1ZiwgaW5kZXgsIHRvUmVhZCk7CisJCQlpZiAobnVtUmVhZCA9PSAtMSkKKwkJCQlmYWlsKCJQcmVtYXR1cmUgRU9GIik7CisJCQl0b1JlYWQgLT0gbnVtUmVhZDsKKwkJCWluZGV4ICs9IG51bVJlYWQ7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpCisJCQlhc3NlcnRFcXVhbHMoZGF0YVtpICsgMTAxMl0sIGJ1ZltpXSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGluLnJlYWQoYnVmLCAxLCAyKSk7CQkJCQkJICAgIC8vIDIwMTIsIDIwMTMKKwkJYXNzZXJ0RXF1YWxzKHRvQnl0ZSgxMDEyICUgMjU2KSwgYnVmWzBdKTsKKwkJYXNzZXJ0RXF1YWxzKHRvQnl0ZSgyMDEyICUgMjU2KSwgYnVmWzFdKTsKKwkJYXNzZXJ0RXF1YWxzKHRvQnl0ZSgyMDEzICUgMjU2KSwgYnVmWzJdKTsKKwkJYXNzZXJ0RXF1YWxzKHRvQnl0ZSgxMDE1ICUgMjU2KSwgYnVmWzNdKTsKKworCQlhc3NlcnRFcXVhbHMoMjA4MiwgaW4uc2tpcCgyMDgzKSk7CQkJCQkJICAgIC8vIDIwMTQsIDIwMTUsIC4uLiwgNDA5NQorCQkvLyBTaG91bGRuJ3Qgd2UgZ2V0IHRoZSAtMSByZWFkIGZpcnN0LCBhbmQgVEhFTiBnZXQgYW4gSU9FeGNlcHRpb24gb24gc3Vic2VxdWVudCByZWFkcz8KKwkJdHJ5IHsKKwkJCWFzc2VydEVxdWFscygtMSwgaW4ucmVhZCgpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQorCQlpbi5jbG9zZSgpOworCX0KKworCS8qKgorCSAqIFRlc3QgcmVhZGluZyBpbnRvIGxhcmdlciBhbmQgbGFyZ2VyIGFycmF5cy4KKwkgKgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RXaWRlbmluZ1dpbmRvd3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBTY2FyeTsgdGhpcyB0ZXN0IGhhbmdzIG9uIFdpbmRvd3MuICBXZSByZWFsbHkgc2hvdWxkIGludmVzdGlnYXRlIHdoeSBhcworCQkvLyBpdCBjb3VsZCBiaXRlIHVzIG9uIHRoZSBidW0gaW4gdGhlIGZ1dHVyZS4KKwkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIsICJ1bmtub3duIikuaW5kZXhPZigiV2luZG93cyIpICE9IC0xKSByZXR1cm47CisKKwkJYnl0ZVtdIHJlYWQgPSBuZXcgYnl0ZVs0MDk2XTsKKwkJZm9yIChpbnQgc2l6ZSA9IDE7IHNpemUgPD0gNDA5Njsgc2l6ZSAqPSAyKSB7CisJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisJCQlDaHVua2VkUHJvZHVjdElucHV0U3RyZWFtIGluID0gbmV3IENodW5rZWRQcm9kdWN0SW5wdXRTdHJlYW0oInRlc3QiLCB0aGlzLCA0MDk2KTsKKwkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDQwOTYpOworCQkJaW50IG51bTsKKwkJCXdoaWxlICgobnVtID0gaW4ucmVhZChidWYpKSAhPSAtMSkKKwkJCQlvdXQud3JpdGUoYnVmLCAwLCBudW0pOworCQkJaW4uY2xvc2UoKTsKKwkJCW91dC5jbG9zZSgpOworCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGRhdGEsIG91dC50b0J5dGVBcnJheSgpKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgYnl0ZVtdIHJldHJpZXZlQ2h1bmsoU3RyaW5nIGlkLCBsb25nIG9mZnNldCwgaW50IGxlbmd0aCkgeworCQlpZiAoIWlkLmVxdWFscygidGVzdCIpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBpZCAiICsgaWQpOworCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiA0MDk2IHx8IGxlbmd0aCA8IDAgfHwKKwkJCShvZmZzZXQgKyBsZW5ndGgpID4gNDA5NiB8fCAob2Zmc2V0ICsgbGVuZ3RoKSA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgb2Zmc2V0IGFuZC9vciBsZW5ndGgiKTsKKwkJCisJCWludCBpbmRleCA9IChpbnQpIG9mZnNldDsKKwkJYnl0ZVtdIHN1YiA9IG5ldyBieXRlW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgaW5kZXgsIHN1YiwgMCwgbGVuZ3RoKTsKKwkJcmV0dXJuIHN1YjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBieXRlIHRvQnl0ZShpbnQgYikgeworCQlyZXR1cm4gKGJ5dGUpIChiICYgMHhmZik7CisJfQorCisJcHVibGljIHZvaWQgY2xvc2UoU3RyaW5nIGlkKSB7fQorCisJLyoqIFRlc3QgZGF0YS4gKi8KKwlwcml2YXRlIGJ5dGVbXSBkYXRhOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9kdWN0L3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9MYXJnZVJlc3VsdFRlc3QuamF2YSBiLzAuMTAvcHJvZHVjdC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvTGFyZ2VSZXN1bHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzNjc5YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZHVjdC9zcmMvdGVzdC9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvTGFyZ2VSZXN1bHRUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIExhcmdlUmVzdWx0fS4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCisgKi8KK3B1YmxpYyBjbGFzcyBMYXJnZVJlc3VsdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJcHVibGljIExhcmdlUmVzdWx0VGVzdChTdHJpbmcgaWQpIHsKKwkJc3VwZXIoaWQpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RMYXJnZVJlc3VsdHMoKSB7CisJCUxhcmdlUmVzdWx0IGxyMSA9IG5ldyBMYXJnZVJlc3VsdCgiMS4yLjMiLCAidGV4dC9wbGFpbiIsICJKUEwuUHJvZmlsZSIsICJKUEwuUmVzb3VyY2UiLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCAxKTsKKwkJYXNzZXJ0RXF1YWxzKCIxLjIuMyIsIGxyMS5nZXRJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgbHIxLmdldE1pbWVUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIkpQTC5Qcm9maWxlIiwgbHIxLmdldFByb2ZpbGVJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJKUEwuUmVzb3VyY2UiLCBscjEuZ2V0UmVzb3VyY2VJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGxyMS5nZXRTaXplKCkpOworCQlhc3NlcnRUcnVlKGxyMS5nZXRIZWFkZXJzKCkuaXNFbXB0eSgpKTsKKworCQlSZXN1bHQgciA9IG5ldyBSZXN1bHQoIjIuMy40IiwgImFwcGxpY2F0aW9uL3ZuZC5qcGwubGFyZ2UtcHJvZHVjdCIsICJKUEwuUHJvZmlsZSIsICJKUEwuUmVzb3VyY2UiLAorCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgInRleHQvcGxhaW4gMiIpOworCQlMYXJnZVJlc3VsdCBscjIgPSBuZXcgTGFyZ2VSZXN1bHQocik7CisJCWFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIGxyMi5nZXRNaW1lVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGxyMi5nZXRTaXplKCkpOworCisJCUxhcmdlUmVzdWx0IGxyMyA9IG5ldyBMYXJnZVJlc3VsdChscjIpOworCQlhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCBscjIuZ2V0TWltZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygyLCBscjMuZ2V0U2l6ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvcG9tLnhtbCBiLzAuMTAvcHJvZmlsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzYyMDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvcG9tLnhtbApAQCAtMCwwICsxLDEzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5vb2R0LXByb2ZpbGU8L2FydGlmYWN0SWQ+CisgIDxuYW1lPlByb2ZpbGUgU2VydmljZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlRoZSBQcm9maWxlIFNlcnZpY2UgZGVzY3JpYmVzIGFuZCBsb2NhdGVzIHJlc291cmNlcyB1c2luZyBtZXRhZGF0YQorICAgIGRlc2NyaXB0aW9ucy4gIFRoZXNlIGRlc2NyaXB0aW9ucywgY2FsbGVkIHByb2ZpbGVzLCB0ZWxsIG9mIGEKKyAgICByZXNvdXJjZSdzIGluY2VwdGlvbiwgY29tcG9zaXRpb24sIGFuZCBsb2NhdGlvbiB1c2luZyBhIG1peCBvZgorICAgIER1YmxpbiBDb3JlIGFuZCBJU08tMTExNzkgbWV0YWRhdGEgYXMgd2VsbCBhcyBVUklzIGZvciBsb2NhdGlvbnMuCisgICAgVGhlIFByb2ZpbGUgU2VydmljZSBjYXRhbG9ncyBtZXRhZGF0YSBkZXNjcmlwdGlvbnMgYW5kIHByb3ZpZGVzCisgICAgY3JlYXRpbmcsIHVwZGF0aW5nLCBhbmQgcXVlcnlpbmcgY2FwYWJpbGl0aWVzLjwvZGVzY3JpcHRpb24+CisgIDxzY20+CisgICAJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvcHJvZmlsZTwvY29ubmVjdGlvbj4KKyAgIAk8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjEwLXJjMi9wcm9maWxlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgCTx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9vb2R0L3RhZ3MvMC4xMC1yYzIvcHJvZmlsZTwvdXJsPgorICA8L3NjbT4KKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9kdGQ8L2RpcmVjdG9yeT4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxmb3JrTW9kZT5vbmNlPC9mb3JrTW9kZT4KKyAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlRWxlbWVudFRlc3RDYXNlLmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8cHJvZmlsZXM+CisgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+YXVkaXQ8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovdGVzdGRhdGEvKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9oYW5kbGVycy9saWdodHdlaWdodC9wYWNrYWdlLmh0bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9vZHQteG1scXVlcnk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uaHAuaHBsLmplbmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZW5hPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi42LjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmlibS5pY3U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5pY3U0ajwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuNC40PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMC1hbHBoYTE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vZHRkL3Byb2YuZHRkIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2R0ZC9wcm9mLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZThhZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2R0ZC9wcm9mLmR0ZApAQCAtMCwwICsxLDg2IEBACis8P3htbCBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCFFTEVNRU5UIHByb2ZpbGVzCisgIChwcm9maWxlKik+CisKKzwhRUxFTUVOVCBwcm9maWxlCisgIChwcm9mQXR0cmlidXRlcywKKyAgIHJlc0F0dHJpYnV0ZXMsCisgICBwcm9mRWxlbWVudCopPgorCisgICAgPCFFTEVNRU5UIHByb2ZBdHRyaWJ1dGVzCisgICAgICAocHJvZklkLCBwcm9mVmVyc2lvbj8sIHByb2ZUeXBlLAorICAgICAgIHByb2ZTdGF0dXNJZCwgcHJvZlNlY3VyaXR5VHlwZT8sIHByb2ZQYXJlbnRJZD8sIHByb2ZDaGlsZElkKiwKKyAgICAgICBwcm9mUmVnQXV0aG9yaXR5PywgcHJvZlJldmlzaW9uTm90ZSopPgorCisgICAgPCFFTEVNRU5UIHJlc0F0dHJpYnV0ZXMKKyAgICAgIChJZGVudGlmaWVyLCBUaXRsZT8sIEZvcm1hdCosIERlc2NyaXB0aW9uPywgQ3JlYXRvciosIFN1YmplY3QqLAorICAgICAgIFB1Ymxpc2hlciosIENvbnRyaWJ1dG9yKiwgRGF0ZSosIFR5cGUqLCBTb3VyY2UqLAorICAgICAgIExhbmd1YWdlKiwgUmVsYXRpb24qLCBDb3ZlcmFnZSosIFJpZ2h0cyosCisgICAgICAgcmVzQ29udGV4dCssIHJlc0FnZ3JlZ2F0aW9uPywgcmVzQ2xhc3MsIHJlc0xvY2F0aW9uKik+CisKKyAgICA8IUVMRU1FTlQgcHJvZkVsZW1lbnQKKyAgICAgIChlbGVtSWQ/LCBlbGVtTmFtZSwgZWxlbURlc2M/LCBlbGVtVHlwZT8sIGVsZW1Vbml0PywgCisgICAgICAgZWxlbUVudW1GbGFnLCAoZWxlbVZhbHVlKiB8IChlbGVtTWluVmFsdWUsIGVsZW1NYXhWYWx1ZSkpLAorICAgICAgIGVsZW1TeW5vbnltKiwKKyAgICAgICBlbGVtT2JsaWdhdGlvbj8sIGVsZW1NYXhPY2N1cnJlbmNlPywgZWxlbUNvbW1lbnQ/KT4KKworICAgIDwhRUxFTUVOVCBwcm9mSWQgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBwcm9mVmVyc2lvbiAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHByb2ZUeXBlICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcHJvZlBhcmVudElkICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcHJvZkNoaWxkSWQgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBwcm9mU3RhdHVzSWQgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBwcm9mU2VjdXJpdHlUeXBlICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcHJvZlJlZ0F1dGhvcml0eSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHByb2ZSZXZpc2lvbk5vdGUgKCNQQ0RBVEEpPgorCisgICAgPCFFTEVNRU5UIElkZW50aWZpZXIgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBUaXRsZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIEZvcm1hdCAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIERlc2NyaXB0aW9uICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgQ3JlYXRvciAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIFN1YmplY3QgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBQdWJsaXNoZXIgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBDb250cmlidXRvciAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIERhdGUgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBUeXBlICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgU291cmNlICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgTGFuZ3VhZ2UgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBSZWxhdGlvbiAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIENvdmVyYWdlICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgUmlnaHRzICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcmVzQ29udGV4dCAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHJlc0FnZ3JlZ2F0aW9uICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcmVzQ2xhc3MgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCByZXNMb2NhdGlvbiAoI1BDREFUQSk+CisKKyAgICA8IUVMRU1FTlQgZWxlbUlkICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgZWxlbU5hbWUgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBlbGVtVHlwZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIGVsZW1FbnVtRmxhZyAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIGVsZW1EZXNjICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgZWxlbVN5bm9ueW0gKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBlbGVtVW5pdCAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIGVsZW1WYWx1ZSAoI1BDREFUQSk+CQorICAgIDwhRUxFTUVOVCBlbGVtTWluVmFsdWUgKCNQQ0RBVEEpPgkKKyAgICA8IUVMRU1FTlQgZWxlbU1heFZhbHVlICgjUENEQVRBKT4JCisgICAgPCFFTEVNRU5UIGVsZW1PYmxpZ2F0aW9uICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgZWxlbU1heE9jY3VycmVuY2UgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBlbGVtQ29tbWVudCAoI1BDREFUQSk+CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9EZWZhdWx0RmFjdG9yeS5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvRGVmYXVsdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JiZTNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvRGVmYXVsdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogRGVmYXVsdCBmYWN0b3J5IGZvciBwcm9maWxlIG9iamVjdHMuCisgKgorICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgdGhlIHR5cGljYWwgcHJvZmlsZSBvYmplY3RzIHtAbGluayBSYW5nZWRQcm9maWxlRWxlbWVudH0sIHtAbGluaworICogVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudH0sIHtAbGluayBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnR9LCB7QGxpbmsgUHJvZmlsZX0sIHtAbGluaworICogUHJvZmlsZUF0dHJpYnV0ZXN9LCBhbmQge0BsaW5rIFJlc291cmNlQXR0cmlidXRlc30uCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqLworY2xhc3MgRGVmYXVsdEZhY3RvcnkgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKwlwdWJsaWMgUmFuZ2VkUHJvZmlsZUVsZW1lbnQgY3JlYXRlUmFuZ2VkUHJvZmlsZUVsZW1lbnQoUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgZGVzYywgU3RyaW5nIHR5cGUsCisJCVN0cmluZyB1bml0LCBMaXN0IHN5bm9ueW1zLCBib29sZWFuIG9ibGlnYXRpb24sIGludCBtYXhPY2N1cnJlbmNlLCBTdHJpbmcgY29tbWVudHMsIFN0cmluZyBtaW4sIFN0cmluZyBtYXgpIHsKKwkJcmV0dXJuIG5ldyBSYW5nZWRQcm9maWxlRWxlbWVudChwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sIG1heE9jY3VycmVuY2UsCisJCQljb21tZW50cywgbWluLCBtYXgpOworCX0KKwlwdWJsaWMgVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudCBjcmVhdGVVbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsCisJCVN0cmluZyB0eXBlLCBTdHJpbmcgdW5pdCwgTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnRzKSB7CisJCXJldHVybiBuZXcgVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudChwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sIG1heE9jY3VycmVuY2UsCisJCQljb21tZW50cyk7CisJfQorCXB1YmxpYyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgY3JlYXRlRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsCisJCVN0cmluZyB0eXBlLCBTdHJpbmcgdW5pdCwgTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnRzLCBMaXN0IHZhbHVlcykgeworCQlyZXR1cm4gbmV3IEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sIG1heE9jY3VycmVuY2UsCisJCQljb21tZW50cywgdmFsdWVzKTsKKwl9CisJcHVibGljIFByb2ZpbGUgY3JlYXRlUHJvZmlsZShFbGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIG5ldyBQcm9maWxlKG5vZGUsIHRoaXMpOworCX0KKwlwdWJsaWMgUHJvZmlsZUF0dHJpYnV0ZXMgY3JlYXRlUHJvZmlsZUF0dHJpYnV0ZXMoRWxlbWVudCBub2RlKSB7CisJCXJldHVybiBuZXcgUHJvZmlsZUF0dHJpYnV0ZXMobm9kZSk7CisJfQorCXB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMgY3JlYXRlUmVzb3VyY2VBdHRyaWJ1dGVzKFByb2ZpbGUgcHJvZmlsZSwgRWxlbWVudCBub2RlKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKHByb2ZpbGUsIG5vZGUpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL0VudW1lcmF0ZWRQcm9maWxlRWxlbWVudC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwODRjMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL0VudW1lcmF0ZWRQcm9maWxlRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLk1vZGVsOworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEVudW1lcmF0ZWQgcHJvZmlsZSBlbGVtZW50LgorICoKKyAqIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgZWxlbWVudHMgb2YgYSBwcm9maWxlIHRoYXQgaGF2ZSBzZXZlcmFsIGVudW1lcmF0ZWQgdmFsdWVzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCBleHRlbmRzIFByb2ZpbGVFbGVtZW50IHsKKwkvKioKKwkgKiBDcmVhdGUgYmxhbmsgcHJvZmlsZSBlbGVtZW50IGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcHJvZmlsZS4KKwkgKi8KKwlwdWJsaWMgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSkgeworCQlzdXBlcihwcm9maWxlKTsKKyAgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIHByb2ZpbGUgZWxlbWVudCBmcm9tIGNvbnN0aXR1ZW50IGF0dHJpYnV0ZXMuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBQcm9maWxlIHRvIHdoaWNoIHRoaXMgZWxlbWVudCBiZWxvbmdzLgorCSAqIEBwYXJhbSBuYW1lIFJlcXVpcmVkIG5hbWUgb2YgdGhlIGVsZW1lbnQuCisJICogQHBhcmFtIGlkIElEIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSBkZXNjIExvbmcgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQuCisJICogQHBhcmFtIHR5cGUgRGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSB1bml0IFVuaXRzLgorCSAqIEBwYXJhbSBzeW5vbnltcyBDb2xsZWN0aW9uIG9mIGVsZW1lbnQgSURzICh7QGxpbmsgU3RyaW5nfSkgdGhhdCBhcmUgc3lub255bXMgZm9yIHRoaXMgZWxlbWVudC4KKwkgKiBAcGFyYW0gb2JsaWdhdGlvbiBUcnVlIGlmIHRoaXMgaXMgYSByZXF1aXJlZCBlbGVtZW50CisJICogQHBhcmFtIG1heE9jY3VycmVuY2UgTWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhpcyBlbGVtZW50LgorCSAqIEBwYXJhbSBjb21tZW50IEFueSBjb21tZW50cyBhYm91dCB0aGlzIGVsZW1lbnQuCisJICogQHBhcmFtIHZhbHVlcyBWYWxpZCB2YWx1ZXMuCisJICovCisJcHVibGljIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIFN0cmluZyBkZXNjLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHVuaXQsCisJCUxpc3Qgc3lub255bXMsIGJvb2xlYW4gb2JsaWdhdGlvbiwgaW50IG1heE9jY3VycmVuY2UsIFN0cmluZyBjb21tZW50LCBMaXN0IHZhbHVlcykgeworCQlzdXBlcihwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sIG1heE9jY3VycmVuY2UsIGNvbW1lbnQpOworCQlpZiAodmFsdWVzLmNvbnRhaW5zKG51bGwpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBpdGVtIGluICd2YWx1ZXMnIG5vdCBhbGxvd2VkIGZvciBlbnVtZXJhdGVkIHByb2ZpbGUgZWxlbWVudHMiKTsKKwkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZXMoTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJaWYgKHZhbHVlcyA9PSBudWxsKSByZXR1cm47CisJCWZvciAoSXRlcmF0b3IgaSA9IHZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCUVsZW1lbnQgZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoImVsZW1WYWx1ZSIpOworCQkJZS5hcHBlbmRDaGlsZChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDREFUQVNlY3Rpb24oKFN0cmluZykgaS5uZXh0KCkpKTsKKwkJCW5vZGUuYXBwZW5kQ2hpbGQoZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1pblZhbHVlKCkgeworCQlyZXR1cm4gIiI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXhWYWx1ZSgpIHsKKwkJcmV0dXJuICIiOworCX0KKworCXB1YmxpYyBMaXN0IGdldFZhbHVlcygpIHsKKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50U3BlY2lmaWNQcm9wZXJ0aWVzKE1vZGVsIG1vZGVsLCBSZXNvdXJjZSBlbGVtZW50LCBQcm9maWxlQXR0cmlidXRlcyBwcm9mQXR0ciwgVVJJIHVyaSkgeworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbVZhbHVlLCB2YWx1ZXMsIHByb2ZBdHRyLCB1cmkpOworCX0KKworCS8qKiBWYWxpZCB2YWx1ZXMuICovCisJcHJvdGVjdGVkIExpc3QgdmFsdWVzOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyYjdhNGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9PYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBGYWN0b3J5IHRvIGNyZWF0ZSBwcm9maWxlLXJlbGF0ZWQgb2JqZWN0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMS4xLjEgJAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9iamVjdEZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZSBhIHJhbmdlZCBwcm9maWxlIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBhIDxjb2RlPlByb2ZpbGU8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBuYW1lIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gaWQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBkZXNjIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gdHlwZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHVuaXQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBzeW5vbnltcyBhIDxjb2RlPkxpc3Q8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBvYmxpZ2F0aW9uIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIG1heE9jY3VycmVuY2UgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gY29tbWVudHMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBtaW4gYSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBtYXggYSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlLgorCSAqIEByZXR1cm4gYSA8Y29kZT5SYW5nZWRQcm9maWxlRWxlbWVudDwvY29kZT4gdmFsdWUuCisJICovCisJUmFuZ2VkUHJvZmlsZUVsZW1lbnQgY3JlYXRlUmFuZ2VkUHJvZmlsZUVsZW1lbnQoUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgZGVzYywgU3RyaW5nIHR5cGUsCisJCVN0cmluZyB1bml0LCBMaXN0IHN5bm9ueW1zLCBib29sZWFuIG9ibGlnYXRpb24sIGludCBtYXhPY2N1cnJlbmNlLCBTdHJpbmcgY29tbWVudHMsIFN0cmluZyBtaW4sIFN0cmluZyBtYXgpOworCisJLyoqCisJICogQ3JlYXRlIGEgcHJvZmlsZSBlbGVtZW50IHdpdGggdW5zcGVjaWZpZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHByb2ZpbGUgYSA8Y29kZT5Qcm9maWxlPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gbmFtZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIGlkIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gZGVzYyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHR5cGUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSB1bml0IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gc3lub255bXMgYSA8Y29kZT5MaXN0PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gb2JsaWdhdGlvbiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBtYXhPY2N1cnJlbmNlIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIGNvbW1lbnRzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcmV0dXJuIGFuIDxjb2RlPlVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQ8L2NvZGU+IHZhbHVlLgorCSAqLworCVVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQgY3JlYXRlVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudChQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIFN0cmluZyBkZXNjLCBTdHJpbmcgdHlwZSwKKwkJU3RyaW5nIHVuaXQsIExpc3Qgc3lub255bXMsIGJvb2xlYW4gb2JsaWdhdGlvbiwgaW50IG1heE9jY3VycmVuY2UsIFN0cmluZyBjb21tZW50cyk7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIGVsZW1lbnQgd2l0aCBlbnVtZXJhdGVkIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlIGEgPGNvZGU+UHJvZmlsZTwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIG5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBpZCBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIGRlc2MgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSB0eXBlIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gdW5pdCBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHN5bm9ueW1zIGEgPGNvZGU+TGlzdDwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIG9ibGlnYXRpb24gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gbWF4T2NjdXJyZW5jZSBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgorCSAqIEBwYXJhbSBjb21tZW50cyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCisJICogQHBhcmFtIHZhbHVlcyBhIDxjb2RlPkxpc3Q8L2NvZGU+IHZhbHVlLgorCSAqIEByZXR1cm4gYW4gPGNvZGU+RW51bWVyYXRlZDwvY29kZT4gdmFsdWUuCisJICovCisJRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50IGNyZWF0ZUVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIFN0cmluZyBkZXNjLCBTdHJpbmcgdHlwZSwKKwkJU3RyaW5nIHVuaXQsIExpc3Qgc3lub255bXMsIGJvb2xlYW4gb2JsaWdhdGlvbiwgaW50IG1heE9jY3VycmVuY2UsIFN0cmluZyBjb21tZW50cywgTGlzdCB2YWx1ZXMpOworCisJLyoqCisJICogQ3JlYXRlIGEgcHJvZmlsZSBmcm9tIGEgRE9NIG5vZGUuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiB2YWx1ZS4KKwkgKiBAcmV0dXJuIGEgPGNvZGU+UHJvZmlsZTwvY29kZT4gdmFsdWUuCisJICovCisJUHJvZmlsZSBjcmVhdGVQcm9maWxlKEVsZW1lbnQgbm9kZSk7CisKKwkvKioKKwkgKiBDcmVhdGUgcHJvZmlsZSBhdHRyaWJ1dGVzIGZyb20gYSBET00gbm9kZS4KKwkgKgorCSAqIEBwYXJhbSBub2RlIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHZhbHVlLgorCSAqIEByZXR1cm4gYSA8Y29kZT5Qcm9maWxlQXR0cmlidXRlczwvY29kZT4gdmFsdWUuCisJICovCisJUHJvZmlsZUF0dHJpYnV0ZXMgY3JlYXRlUHJvZmlsZUF0dHJpYnV0ZXMoRWxlbWVudCBub2RlKTsKKworCS8qKgorCSAqIENyZWF0ZSByZXNvdXJjZSBhdHRyaWJ1dGVzIGZyb20gYSBET00gbm9kZS4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlIE93bmluZyBwcm9maWxlLgorCSAqIEBwYXJhbSBub2RlIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHZhbHVlLgorCSAqIEByZXR1cm4gYSA8Y29kZT5SZXNvdXJjZUF0dHJpYnV0ZXM8L2NvZGU+IHZhbHVlLgorCSAqLworCVJlc291cmNlQXR0cmlidXRlcyBjcmVhdGVSZXNvdXJjZUF0dHJpYnV0ZXMoUHJvZmlsZSBwcm9maWxlLCBFbGVtZW50IG5vZGUpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZS5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTQwNmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlLmphdmEKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGU7CisKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLk1vZGVsOworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuUHJvcGVydHk7CitpbXBvcnQgY29tLmhwLmhwbC5qZW5hLnJkZi5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRG9jdW1lbnRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKKworLyoqCisgKiBBIHByb2ZpbGUuCisgKgorICogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFyZSBwcm9maWxlcy4gIFByb2ZpbGVzIGFyZSBtZXRhZGF0YSBkZXNjcmlwdGlvbnMgb2YgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZSwgRG9jdW1lbnRhYmxlIHsKKyAgICAgICAgLyoqIFNlcmlhbCB2ZXJzaW9uIHVuaXF1ZSBJRC4gKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zOTM2ODUxODA5MTg0MzYwNTkxTDsKKworCS8qKiBUaGUgZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBwcm9maWxlcyBEVEQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRVNfRFREX0ZQSSA9ICItLy9KUEwvL0RURCBQcm9maWxlIDEuMS8vRU4iOworCisJLyoqIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgcHJvZmlsZXMgRFRELiAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0ZJTEVTX0RURF9VUkwgPSAiaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2dyaWQtcHJvZmlsZS9kdGQvcHJvZi5kdGQiOworCisJLyoqCisJICogQ3JlYXRlIGEgbGlzdCBvZiBwcm9maWxlcyBieSBkZXNlcmlhbGl6aW5nIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gWE1MIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcm9vdCBFaXRoZXIgYSAmbHQ7cHJvZmlsZXMmZ3Q7IG9yIGEgJmx0O3Byb2ZpbGUmZ3Q7IGVsZW1lbnQuCisJICogQHBhcmFtIGZhY3RvcnkgRmFjdG9yeSBmb3IgY3JlYXRpb24gb2YgcHJvZmlsZS1yZWxhdGVkIG9iamVjdHMuCisJICogQHJldHVybiBBIGxpc3Qgb2YgcHJvZmlsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZVByb2ZpbGVzKEVsZW1lbnQgcm9vdCwgT2JqZWN0RmFjdG9yeSBmYWN0b3J5KSB7CisJCUxpc3QgcHJvZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWlmICgicHJvZmlsZSIuZXF1YWxzKHJvb3QuZ2V0Tm9kZU5hbWUoKSkpCisJCQkvLyBUaGUgcm9vdCBpcyBhIDxwcm9maWxlPiwgc28gYWRkIHRoZSBzaW5nbGUgcHJvZmlsZSB0byB0aGUgbGlzdC4KKwkJCXByb2ZpbGVzLmFkZChmYWN0b3J5LmNyZWF0ZVByb2ZpbGUoKEVsZW1lbnQpIHJvb3QpKTsKKwkJZWxzZSBpZiAoInByb2ZpbGVzIi5lcXVhbHMocm9vdC5nZXROb2RlTmFtZSgpKSkgeworCQkJLy8gVGhlIHJvb3QgaXMgYSA8cHJvZmlsZXM+LCBzbyBhZGQgZWFjaCA8cHJvZmlsZT4gdG8gdGhlIGxpc3QuCisJCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQkJTm9kZSBub2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQlpZiAoInByb2ZpbGUiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCQlwcm9maWxlcy5hZGQoZmFjdG9yeS5jcmVhdGVQcm9maWxlKChFbGVtZW50KSBub2RlKSk7CisJCQl9CisJCX0gZWxzZSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHBlY3RlZCBhIDxwcm9maWxlcz4gb3IgPHByb2ZpbGU+IHRvcCBsZXZlbCBlbGVtZW50IGJ1dCBnb3QgIgorCQkJKyByb290LmdldE5vZGVOYW1lKCkpOworCQlyZXR1cm4gcHJvZmlsZXM7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGUgYSBsaXN0IG9mIHByb2ZpbGVzIGJ5IGRlc2VyaWFsaXppbmcgZGF0YSBmcm9tIHRoZSBnaXZlbiBYTUwgZWxlbWVudC4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSB0aGF0IHlpZWxkcyBvYmplY3RzIG9mIHRoaXMgcGFja2FnZSwKKwkgKiBuYW1lbHkge0BsaW5rIFByb2ZpbGV9LCB7QGxpbmsgUHJvZmlsZUF0dHJpYnV0ZXN9LCB7QGxpbmsgUmVzb3VyY2VBdHRyaWJ1dGVzfSwKKwkgKiBhbmQge0BsaW5rIFByb2ZpbGVFbGVtZW50fSBhbmQgaXRzIHN1YmNsYXNzZXMuCisJICoKKwkgKiBAcGFyYW0gcm9vdCBFaXRoZXIgYSAmbHQ7cHJvZmlsZXMmZ3Q7IG9yIGEgJmx0O3Byb2ZpbGUmZ3Q7IGVsZW1lbnQuCisJICogQHJldHVybiBBIGxpc3Qgb2YgcHJvZmlsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZVByb2ZpbGVzKEVsZW1lbnQgcm9vdCkgeworCQlyZXR1cm4gY3JlYXRlUHJvZmlsZXMocm9vdCwgbmV3IERlZmF1bHRGYWN0b3J5KCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIGJsYW5rIHByb2ZpbGUuCisJICovCisJcHVibGljIFByb2ZpbGUoKSB7CisJCXByb2ZBdHRyID0gbmV3IFByb2ZpbGVBdHRyaWJ1dGVzKCk7CisJCXJlc0F0dHIgPSBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIHByb2ZpbGUgZnJvbSBhbiBYTUwgZG9jdW1lbnQuCisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIFRoZSBYTUwgZG9jdW1lbnQgKGFzIGEgc3RyaW5nKS4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiB0aGUgPHZhcj5zdHJpbmc8L3Zhcj4gY2FuJ3QgYmUgcGFyc2VkLgorCSAqLworCXB1YmxpYyBQcm9maWxlKFN0cmluZyBzdHJpbmcpIHRocm93cyBTQVhFeGNlcHRpb24geworCQl0aGlzKFhNTC5wYXJzZShzdHJpbmcpLmdldERvY3VtZW50RWxlbWVudCgpLCBuZXcgRGVmYXVsdEZhY3RvcnkoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgcHJvZmlsZSBmcm9tIGFuIFhNTCBkb2N1bWVudC4KKwkgKgorCSAqIEBwYXJhbSBzdHJpbmcgVGhlIFhNTCBkb2N1bWVudCAoYXMgYSBzdHJpbmcpLgorCSAqIEBwYXJhbSBmYWN0b3J5IE9iamVjdCBmYWN0b3J5IHRvIHVzZS4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiB0aGUgPHZhcj5zdHJpbmc8L3Zhcj4gY2FuJ3QgYmUgcGFyc2VkLgorCSAqLworCXB1YmxpYyBQcm9maWxlKFN0cmluZyBzdHJpbmcsIE9iamVjdEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCXRoaXMoWE1MLnBhcnNlKHN0cmluZykuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvZmlsZTwvY29kZT4gaW5zdGFuY2UuCisJICoKKwkgKiBAcGFyYW0gcm9vdCBhIDxjb2RlPk5vZGU8L2NvZGU+IHZhbHVlLgorCSAqLworCXB1YmxpYyBQcm9maWxlKE5vZGUgcm9vdCkgeworCQl0aGlzKHJvb3QsIG5ldyBEZWZhdWx0RmFjdG9yeSgpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIGZyb20gYW4gWE1MIGRvY3VtZW50LgorCSAqCisJICogQHBhcmFtIHJvb3QgVGhlICZsdDtwcm9maWxlJmd0OyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBQcm9maWxlKE5vZGUgcm9vdCwgT2JqZWN0RmFjdG9yeSBmYWN0b3J5KSB7CisJCWlmICghcm9vdC5nZXROb2RlTmFtZSgpLmVxdWFscygicHJvZmlsZSIpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uc3RydWN0IGEgUHJvZmlsZSBmcm9tIGEgPHByb2ZpbGU+IGVsZW1lbnQsIG5vdCBhIDwiCisJCQkJKyByb290LmdldE5vZGVOYW1lKCkgKyAiPiIpOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpIHsKKwkJCU5vZGUgbm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoInByb2ZBdHRyaWJ1dGVzIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlwcm9mQXR0ciA9IGZhY3RvcnkuY3JlYXRlUHJvZmlsZUF0dHJpYnV0ZXMoKEVsZW1lbnQpIG5vZGUpOworCQkJZWxzZSBpZiAoInJlc0F0dHJpYnV0ZXMiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXJlc0F0dHIgPSBmYWN0b3J5LmNyZWF0ZVJlc291cmNlQXR0cmlidXRlcyh0aGlzLCAoRWxlbWVudCkgbm9kZSk7CisJCQllbHNlIGlmICgicHJvZkVsZW1lbnQiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJUHJvZmlsZUVsZW1lbnQgZWxlbWVudCA9IFByb2ZpbGVFbGVtZW50LmNyZWF0ZVByb2ZpbGVFbGVtZW50KChFbGVtZW50KSBub2RlLCB0aGlzLCBmYWN0b3J5KTsKKwkJCQllbGVtZW50cy5wdXQoZWxlbWVudC5nZXROYW1lKCksIGVsZW1lbnQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgcHJvZmlsZSBmcm9tIGl0cyBhdHRyaWJ1dGVzLgorCSAqCisJICogQHBhcmFtIHByb2ZBdHRyIFByb2ZpbGUgYXR0cmlidXRlcy4KKwkgKiBAcGFyYW0gcmVzQXR0ciBSZXNvdXJjZSBhdHRyaWJ1dGVzLgorCSAqLworCXB1YmxpYyBQcm9maWxlKFByb2ZpbGVBdHRyaWJ1dGVzIHByb2ZBdHRyLCBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzQXR0cikgeworCQl0aGlzLnByb2ZBdHRyID0gcHJvZkF0dHI7CisJCXRoaXMucmVzQXR0ciA9IHJlc0F0dHI7CisJCWlmICh0aGlzLnJlc0F0dHIgIT0gbnVsbCkgdGhpcy5yZXNBdHRyLnByb2ZpbGUgPSB0aGlzOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBwcm9mQXR0ci5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIFByb2ZpbGUpKSByZXR1cm4gZmFsc2U7CisJCVByb2ZpbGUgb2JqID0gKFByb2ZpbGUpIHJoczsKKwkJcmV0dXJuIHByb2ZBdHRyLmVxdWFscyhvYmoucHJvZkF0dHIpOworCX0KKworCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCByaHMpIHsKKwkJUHJvZmlsZSBvYmogPSAoUHJvZmlsZSkgcmhzOworCQlyZXR1cm4gcHJvZkF0dHIuY29tcGFyZVRvKG9iai5wcm9mQXR0cik7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJRG9jdW1lbnQgZG9jID0gY3JlYXRlUHJvZmlsZURvY3VtZW50KCk7CisJCWRvYy5yZW1vdmVDaGlsZChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOworCQlkb2MuYXBwZW5kQ2hpbGQodG9YTUwoZG9jKSk7CisJCXJldHVybiBYTUwuc2VyaWFsaXplKGRvYyk7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IGNsb25lID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNsb25lID0gc3VwZXIuY2xvbmUoKTsKKwkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJcmV0dXJuIGNsb25lOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvZmlsZSBhdHRyaWJ1dGVzLgorCSAqCisJICogQHJldHVybiBUaGUgcHJvZmlsZSBhdHRyaWJ1dGVzLgorCSAqLworCXB1YmxpYyBQcm9maWxlQXR0cmlidXRlcyBnZXRQcm9maWxlQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIHByb2ZBdHRyOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcmVzb3VyY2UgYXR0cmlidXRlcy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJlc291cmNlIGF0dHJpYnV0ZXMuCisJICovCisJcHVibGljIFJlc291cmNlQXR0cmlidXRlcyBnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSB7CisJCXJldHVybiByZXNBdHRyOworCX0KKworCS8qKgorCSAqIFNldCB0aGlzIHByb2ZpbGUncyBwcm9maWxlIGF0dHJpYnV0ZXMuCisJICoKKwkgKiBAcGFyYW0gcHJvZkF0dHIgYSA8Y29kZT5Qcm9maWxlQXR0cmlidXRlczwvY29kZT4gdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvZmlsZUF0dHJpYnV0ZXMoUHJvZmlsZUF0dHJpYnV0ZXMgcHJvZkF0dHIpIHsKKwkJdGhpcy5wcm9mQXR0ciA9IHByb2ZBdHRyOworCX0KKworCS8qKgorCSAqIFNldCB0aGlzIHByb2ZpbGUncyByZXNvdXJjZSBhdHRyaWJ1dGVzLgorCSAqCisJICogQHBhcmFtIHJlc0F0dHIgYSA8Y29kZT5SZXNvdXJjZUF0dHJpYnV0ZXM8L2NvZGU+IHZhbHVlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQXR0cmlidXRlcyhSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzQXR0cikgeworCQl0aGlzLnJlc0F0dHIgPSByZXNBdHRyOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvZmlsZSBlbGVtZW50cy4KKwkgKgorCSAqIFRoZSBwcm9maWxlIGVsZW1lbnRzIGFyZSBhIG1hcHBpbmcgZnJvbSB0aGUgZWxlbWVudCBuYW1lICh7QGxpbmsKKwkgKiBqYXZhLmxhbmcuU3RyaW5nfSkgdG8ge0BsaW5rIFByb2ZpbGVFbGVtZW50fS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHByb2ZpbGUgZWxlbWVudHMuCisJICovCisJcHVibGljIE1hcCBnZXRQcm9maWxlRWxlbWVudHMoKSB7CisJCXJldHVybiBlbGVtZW50czsKKwl9CisKKwlwdWJsaWMgVVJJIGdldFVSSSgpIHsKKwkJcmV0dXJuIHJlc0F0dHIuZ2V0VVJJKCk7CisJfQorCisJLyoqCisJICogQWRkIHRoaXMgcHJvZmlsZSBhcyBhbiBSREYgcmVzb3VyY2UgZGVzY3JpcHRpb24gdG8gYW4gUkRGIG1vZGVsLgorCSAqCisJICogVGhpcyBjcmVhdGVzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJlc291cmNlIHRoYXQgdGhpcyBwcm9maWxlIGRlc2NyaWJlcywgYXMgd2VsbAorCSAqIGFzIGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZvciB0aGUgcmVpZmllZCBzdGF0ZW1lbnRzIGFib3V0IHRoZSBwcm9maWxlIGl0c2VsZiwKKwkgKiBhbmQgYWRkcyB0aGVtIGFsbCB0byB0aGUgZ2l2ZW4gbW9kZWwuCisJICoKKwkgKiBAcGFyYW0gbW9kZWwgTW9kZWwgdG8gd2hpY2ggdG8gYWRkIHRoZSBwcm9maWxlIGFuZCBpdHMgcmVsYXRlZCBkZXNjcmlwdGlvbnMuCisJICovCisJcHVibGljIHZvaWQgYWRkVG9Nb2RlbChNb2RlbCBtb2RlbCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1vZGVsLmNyZWF0ZVJlc291cmNlKGdldFVSSSgpLnRvU3RyaW5nKCkpOworCQlyZXNBdHRyLmFkZFRvTW9kZWwobW9kZWwsIHJlc291cmNlLCBwcm9mQXR0cik7CisJCWZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUHJvZmlsZUVsZW1lbnQgZSA9IChQcm9maWxlRWxlbWVudCkgaS5uZXh0KCk7CisJCQllLmFkZFRvTW9kZWwobW9kZWwsIHJlc291cmNlLCBwcm9mQXR0cik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemUgdGhpcyBwcm9maWxlIGFzIGFuIFhNTCBub2RlLgorCSAqCisJICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdGhhdCB3aWxsIG93biB0aGlzIG5vZGUuCisJICogQHJldHVybiBUaGUgWE1MIGVsZW1lbnQgJmx0O3Byb2ZpbGUmZ3Q7IHJlcHJlc2VudGluZyB0aGVzZSBhdHRyaWJ1dGVzLgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgWE1MIG5vZGVzLgorCSAqLworCXB1YmxpYyBOb2RlIHRvWE1MKERvY3VtZW50IGRvYykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCXJldHVybiB0b1hNTChkb2MsIC8qd2l0aEVsZW1lbnRzKi90cnVlKTsKKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemUgdGhpcyBwcm9maWxlIGFzIGFuIFhNTCBub2RlIGJ1dCB3aXRob3V0IGFueSBlbGVtZW50cy4KKwkgKgorCSAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRoYXQgd2lsbCBvd24gdGhpcyBub2RlLgorCSAqIEByZXR1cm4gVGhlIFhNTCBlbGVtZW50ICZsdDtwcm9maWxlJmd0OyByZXByZXNlbnRpbmcgdGhlc2UgYXR0cmlidXRlcy4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIFhNTCBub2Rlcy4KKwkgKi8KKwlwdWJsaWMgTm9kZSB0b1hNTFdpdGhvdXRFbGVtZW50cyhEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlyZXR1cm4gdG9YTUwoZG9jLCAvKndpdGhFbGVtZW50cyovZmFsc2UpOworCX0KKworCS8qKgorCSAqIFNlcmlhbGl6ZSB0aGlzIHByb2ZpbGUgYXMgYW4gWE1MIG5vZGUuCisJICoKKwkgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0aGF0IHdpbGwgb3duIHRoaXMgbm9kZS4KKwkgKiBAcGFyYW0gd2l0aEVsZW1lbnRzIEluY2x1ZGUgdGhlIHByb2ZpbGUgZWxlbWVudHM/CisJICogQHJldHVybiBUaGUgWE1MIGVsZW1lbnQgJmx0O3Byb2ZpbGUmZ3Q7IHJlcHJlc2VudGluZyB0aGVzZSBhdHRyaWJ1dGVzLgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgWE1MIG5vZGVzLgorCSAqLworCXByaXZhdGUgTm9kZSB0b1hNTChEb2N1bWVudCBkb2MsIGJvb2xlYW4gd2l0aEVsZW1lbnRzKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJRWxlbWVudCBwcm9maWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2ZpbGUiKTsKKwkJcHJvZmlsZS5hcHBlbmRDaGlsZChwcm9mQXR0ci50b1hNTChkb2MpKTsKKwkJcHJvZmlsZS5hcHBlbmRDaGlsZChyZXNBdHRyLnRvWE1MKGRvYykpOworCQlpZiAod2l0aEVsZW1lbnRzKSBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCisJCQlwcm9maWxlLmFwcGVuZENoaWxkKCgoUHJvZmlsZUVsZW1lbnQpIGkubmV4dCgpKS50b1hNTChkb2MpKTsKKwkJcmV0dXJuIHByb2ZpbGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgJmx0O3Byb2ZpbGVzJmd0OyBkb2N1bWVudCB1c2luZyB0aGUgcHJvZmlsZXMgRFRELgorCSAqCisJICogQHJldHVybiBBICZsdDtwcm9maWxlcyZndDsgZG9jdW1lbnQgd2l0aCB0aGUgcHJvZmlsZXMgRFRELgorCSAqLworCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgY3JlYXRlUHJvZmlsZXNEb2N1bWVudCgpIHsKKwkJcmV0dXJuIGNyZWF0ZURvY3VtZW50KCJwcm9maWxlcyIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhICZsdDtwcm9maWxlJmd0OyBkb2N1bWVudCB1c2luZyB0aGUgcHJvZmlsZXMgRFRELgorCSAqCisJICogQHJldHVybiBBICZsdDtwcm9maWxlJmd0OyBkb2N1bWVudCB3aXRoIHRoZSBwcm9maWxlcyBEVEQuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVQcm9maWxlRG9jdW1lbnQoKSB7CisJCXJldHVybiBjcmVhdGVEb2N1bWVudCgicHJvZmlsZSIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIGRvY3VtZW50IHVzaW5nIHRoZSBwcm9maWxlcyBEVEQgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIHJvb3QgTmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50LgorCSAqIEByZXR1cm4gVGhlIGRvY3VtZW50IHdpdGggdGhlIGFwcHJvcHJpYXRlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24uCisJICovCisJc3RhdGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyByb290KSB7CisJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gWE1MLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnRUeXBlKHJvb3QsIFBST0ZJTEVTX0RURF9GUEksIFBST0ZJTEVTX0RURF9VUkwpOworCQlEb2N1bWVudCBkb2MgPSBYTUwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgvKm5hbWVzcGFjZVVSSSovbnVsbCwgcm9vdCwgZG9jVHlwZSk7CisJCXJldHVybiBkb2M7CisJfQorCisJLyoqIE15IHByb2ZpbGUgYXR0cmlidXRlcy4gKi8KKwlwcm90ZWN0ZWQgUHJvZmlsZUF0dHJpYnV0ZXMgcHJvZkF0dHI7CisKKwkvKiogTXkgcmVzb3VyY2UgYXR0cmlidXRlcy4gKi8KKwlwcm90ZWN0ZWQgUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc0F0dHI7CisKKwkvKiogTXkgZWxlbWVudHMuCisJICoKKwkgKiBUaGlzIG1hcHBpbmcgaXMgZnJvbSBlbGVtZW50IG5hbWUgKGEge0BsaW5rIFN0cmluZ30pIHRvIHtAbGluayBQcm9maWxlRWxlbWVudH0uCisJICovCisJcHJvdGVjdGVkIE1hcCBlbGVtZW50cyA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKioKKwkgKiBUcnkgdG8gcGFyc2UgYW4gWE1MIHByb2ZpbGUgaW4gYSBmaWxlIGluIGl0cyBYTUwgdm9jYWJ1bGFyeS4gIElmIHN1Y2Nlc3NmdWwsCisJICogeW91IGdldCB0aGUgcHJvZmlsZSBhcyBSREYgZG9jdW1lbnQgKGluIFhNTCBmb3JtYXQpIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQKKwkgKiBhZnRlciBpdCdzIGJlZW4gZGlnZXN0ZWQgYnkgdGhlIHByb2ZpbGUgY2xhc3MuICBJZiBub3QsIHRoZW4geW91IGdldCBhbgorCSAqIGV4Y2VwdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhcmd2IENvbW1hbmQtbGluZSBhcmd1bWVudHMsIG9mIHdoaWNoIHRoZXJlIHNob3VsZCBiZSBvbmUsIHRoZSBuYW1lIG9mIFhNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIHByb2ZpbGUgdG8gcGFyc2UKKwkgKiBAdGhyb3dzIFRocm93YWJsZSBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgdGhyb3dzIFRocm93YWJsZSB7CisJCWlmIChhcmd2Lmxlbmd0aCAhPSAxKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiA8cHJvZmlsZS54bWw+Iik7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3ZbMF0pKTsKKwkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzUxMl07CisJCWludCBudW07CisJCXdoaWxlICgobnVtID0gcmVhZGVyLnJlYWQoYnVmKSkgIT0gLTEpCisJCQliLmFwcGVuZChidWYsIDAsIG51bSk7CisJCXJlYWRlci5jbG9zZSgpOworCQlQcm9maWxlIHAgPSBuZXcgUHJvZmlsZShiLnRvU3RyaW5nKCkpOworCisJCU1vZGVsIG1vZGVsID0gTW9kZWxGYWN0b3J5LmNyZWF0ZURlZmF1bHRNb2RlbCgpOworCQlwLmFkZFRvTW9kZWwobW9kZWwpOworCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KTsKKwkJbW9kZWwud3JpdGUod3JpdGVyKTsKKwkJd3JpdGVyLmNsb3NlKCk7CisJCVN5c3RlbS5leGl0KDApOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVBdHRyaWJ1dGVzLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTIxMTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlQXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRvY3VtZW50YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogUHJvZmlsZSBhdHRyaWJ1dGVzLgorICoKKyAqIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgYXR0cmlidXRlcyBvZiBwcm9maWxlcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9maWxlQXR0cmlidXRlcyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlLCBEb2N1bWVudGFibGUgeworCS8qKgorCSAqIENyZWF0ZSBibGFuayBwcm9maWxlIGF0dHJpYnV0ZXMuCisJICovCisJcHVibGljIFByb2ZpbGVBdHRyaWJ1dGVzKCkgeworCQlpZCA9ICJVTktOT1dOIjsKKwkJdHlwZSA9ICJVTktOT1dOIjsKKwkJc3RhdHVzSUQgPSAiVU5LTk9XTiI7CisJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQlyZXZpc2lvbk5vdGVzID0gbmV3IEFycmF5TGlzdCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBwcm9maWxlIGF0dHJpYnV0ZXMgZnJvbSBhbiBYTUwgZG9jdW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcm9vdCBUaGUgJmx0O3Byb2ZBdHRyaWJ1dGVzJmd0OyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBQcm9maWxlQXR0cmlidXRlcyhOb2RlIHJvb3QpIHsKKwkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJldmlzaW9uTm90ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSByb290LmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyArK2kpIHsKKwkJCU5vZGUgbm9kZSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKKwkJCWlmICgicHJvZklkIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlpZCA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJZWxzZSBpZiAoInByb2ZWZXJzaW9uIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQl2ZXJzaW9uID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgicHJvZlR5cGUiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXR5cGUgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCWVsc2UgaWYgKCJwcm9mU3RhdHVzSWQiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXN0YXR1c0lEID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgicHJvZlNlY3VyaXR5VHlwZSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJc2VjdXJpdHlUeXBlID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgicHJvZlBhcmVudElkIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlwYXJlbnQgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCWVsc2UgaWYgKCJwcm9mQ2hpbGRJZCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJY2hpbGRyZW4uYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJCWVsc2UgaWYgKCJwcm9mUmVnQXV0aG9yaXR5Ii5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlyZWdBdXRob3JpdHkgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCWVsc2UgaWYgKCJwcm9mUmV2aXNpb25Ob3RlIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlyZXZpc2lvbk5vdGVzLmFkZChYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgcHJvZmlsZSBhdHRyaWJ1dGVzIGZyb20gY29uc3RpdHVlbnQgYXR0cmlidXRlcy4KKwkgKgorCSAqIEBwYXJhbSBpZCBUaGUgcHJvZmlsZSBJRC4KKwkgKiBAcGFyYW0gdmVyc2lvbiBWZXJzaW9uLgorCSAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgdGhlIHByb2ZpbGUuCisJICogQHBhcmFtIHN0YXR1c0lEIFN0YXR1cyBJRC4KKwkgKiBAcGFyYW0gc2VjdXJpdHlUeXBlIFNlY3VyaXR5IHR5cGUuCisJICogQHBhcmFtIHBhcmVudCBQYXJlbnQgcHJvZmlsZSBJRHMuCisJICogQHBhcmFtIGNoaWxkcmVuIFplcm8gb3IgbW9yZSB7QGxpbmsgU3RyaW5nfSBjaGlsZCBwcm9maWxlIElEcy4KKwkgKiBAcGFyYW0gcmVnQXV0aG9yaXR5IFJlZ2lzdHJhdGlvbiBhdXRob3JpdHkuCisJICogQHBhcmFtIHJldmlzaW9uTm90ZXMgWmVybyBvciBtb3JlIHtAbGluayBTdHJpbmd9IHJldmlzaW9uIG5vdGVzLgorCSAqLworCXB1YmxpYyBQcm9maWxlQXR0cmlidXRlcyhTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHN0YXR1c0lELCBTdHJpbmcgc2VjdXJpdHlUeXBlLCBTdHJpbmcgcGFyZW50LAorCQlMaXN0IGNoaWxkcmVuLCBTdHJpbmcgcmVnQXV0aG9yaXR5LCBMaXN0IHJldmlzaW9uTm90ZXMpIHsKKwkJdGhpcy5pZCA9IGlkOworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnN0YXR1c0lEID0gc3RhdHVzSUQ7CisJCXRoaXMuc2VjdXJpdHlUeXBlID0gc2VjdXJpdHlUeXBlOworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworCQl0aGlzLnJlZ0F1dGhvcml0eSA9IHJlZ0F1dGhvcml0eTsKKwkJdGhpcy5yZXZpc2lvbk5vdGVzID0gcmV2aXNpb25Ob3RlczsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gaWQuaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgeworCQlpZiAocmhzID09IHRoaXMpIHJldHVybiB0cnVlOworCQlpZiAocmhzID09IG51bGwgfHwgIShyaHMgaW5zdGFuY2VvZiBQcm9maWxlQXR0cmlidXRlcykpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuICgoUHJvZmlsZUF0dHJpYnV0ZXMpIHJocykuaWQuZXF1YWxzKGlkKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgcmhzKSB7CisJCVByb2ZpbGVBdHRyaWJ1dGVzIG9iaiA9IChQcm9maWxlQXR0cmlidXRlcykgcmhzOworCQlyZXR1cm4gaWQuY29tcGFyZVRvKG9iai5pZCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltpZD0iICsgaWQgKyAiXSI7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IGNsb25lID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNsb25lID0gc3VwZXIuY2xvbmUoKTsKKwkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJcmV0dXJuIGNsb25lOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgSUQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBJRC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElEKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSB2ZXJzaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgdmVyc2lvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHByb2ZpbGUuCisJICovCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHN0YXR1cyBJRC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHN0YXR1cyBJRC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0lEKCkgeworCQlyZXR1cm4gc3RhdHVzSUQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBzZWN1cml0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBUaGUgc2VjdXJpdHkgdHlwZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNlY3VyaXR5VHlwZSgpIHsKKwkJcmV0dXJuIHNlY3VyaXR5VHlwZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHBhcmVudCBvZiB0aGlzIHByb2ZpbGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgcHJvZmlsZSdzIElELgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gcGFyZW50OworCX0KKworCS8qKgorCSAqIEdldCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwcm9maWxlLgorCSAqCisJICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIFN0cmluZ30gSURzIG9mIGl0cyBjaGlsZHJlbi4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKKwkJcmV0dXJuIGNoaWxkcmVuOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcmVnaXN0cmF0aW9uIGF1dGhvcml0eSBvZiB0aGlzIHByb2ZpbGUuCisJICoKKwkgKiBAcmV0dXJuIEl0cyByZWdpc3RyYXRpb24gYXV0aG9yaXR5LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVnQXV0aG9yaXR5KCkgeworCQlyZXR1cm4gcmVnQXV0aG9yaXR5OworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcmV2aXNpb24gbm90ZXMgb2YgdGhpcyBwcm9maWxlLgorCSAqCisJICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIFN0cmluZ30gcmV2aXNpb24gbm90ZXMuCisJICovCisJcHVibGljIExpc3QgZ2V0UmV2aXNpb25Ob3RlcygpIHsKKwkJcmV0dXJuIHJldmlzaW9uTm90ZXM7CisJfQorCisJLyoqCisJICogCisJICogU2V0IHRoZSBQYXJlbnQKKwkgKiAKKwkgKiBAcGFyYW0gdGhlUGFyZW50IFRoZSBQYXJlbnQgU3RyaW5nLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudChTdHJpbmcgdGhlUGFyZW50KXsKKwkJcGFyZW50ID0gdGhlUGFyZW50OworCX0KKworCS8qKgorCSAqIFNldCB0aGUgSUQuCisJICoKKwkgKiBAcGFyYW0gaWQgVGhlIElELgorCSAqLworCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJLyoqCisJICogU2V0IHRoZSB2ZXJzaW9uLgorCSAqCisJICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24uCisJICovCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgdHlwZS4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBwcm9maWxlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHN0YXR1cyBJRC4KKwkgKgorCSAqIEBwYXJhbSBzdGF0dXNJRCBUaGUgc3RhdHVzIElELgorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1c0lEKFN0cmluZyBzdGF0dXNJRCkgeworCQl0aGlzLnN0YXR1c0lEID0gc3RhdHVzSUQ7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBzZWN1cml0eSB0eXBlLgorCSAqCisJICogQHBhcmFtIHNlY3VyaXR5VHlwZSBUaGUgc2VjdXJpdHkgdHlwZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWN1cml0eVR5cGUoU3RyaW5nIHNlY3VyaXR5VHlwZSkgeworCQl0aGlzLnNlY3VyaXR5VHlwZSA9IHNlY3VyaXR5VHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHJlZ2lzdHJhdGlvbiBhdXRob3JpdHkgb2YgdGhpcyBwcm9maWxlLgorCSAqCisJICogQHBhcmFtIHJlZ0F1dGhvcml0eSBJdHMgcmVnaXN0cmF0aW9uIGF1dGhvcml0eS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWdBdXRob3JpdHkoU3RyaW5nIHJlZ0F1dGhvcml0eSkgeworCQl0aGlzLnJlZ0F1dGhvcml0eSA9IHJlZ0F1dGhvcml0eTsKKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemUgdGhpcyBhdHRyaWJ1dGVzIGFzIGFuIFhNTCBub2RlLgorCSAqCisJICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdGhhdCB3aWxsIG93biB0aGlzIG5vZGUuCisJICogQHJldHVybiBUaGUgWE1MIGVsZW1lbnQgJmx0O3Byb2ZBdHRyaWJ1dGVzJmd0OyByZXByZXNlbnRpbmcgdGhlc2UgYXR0cmlidXRlcy4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIFhNTCBub2Rlcy4KKwkgKi8KKwlwdWJsaWMgTm9kZSB0b1hNTChEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvZkF0dHJpYnV0ZXMiKTsKKwkJWE1MLmFkZChyb290LCAicHJvZklkIiwgaWQpOworCQlYTUwuYWRkTm9uTnVsbChyb290LCAicHJvZlZlcnNpb24iLCB2ZXJzaW9uKTsKKwkJWE1MLmFkZE5vbk51bGwocm9vdCwgInByb2ZUeXBlIiwgdHlwZSk7CisJCVhNTC5hZGROb25OdWxsKHJvb3QsICJwcm9mU3RhdHVzSWQiLCBzdGF0dXNJRCk7CisJCVhNTC5hZGROb25OdWxsKHJvb3QsICJwcm9mU2VjdXJpdHlUeXBlIiwgc2VjdXJpdHlUeXBlKTsKKwkJWE1MLmFkZE5vbk51bGwocm9vdCwgInByb2ZQYXJlbnRJZCIsIHBhcmVudCk7CisJCVhNTC5hZGQocm9vdCwgInByb2ZDaGlsZElkIiwgY2hpbGRyZW4pOworCQlYTUwuYWRkTm9uTnVsbChyb290LCAicHJvZlJlZ0F1dGhvcml0eSIsIHJlZ0F1dGhvcml0eSk7CisJCVhNTC5hZGQocm9vdCwgInByb2ZSZXZpc2lvbk5vdGUiLCByZXZpc2lvbk5vdGVzKTsKKwkJcmV0dXJuIHJvb3Q7CisJfQorCisJLyoqIFVuaXF1ZSBpZGVudGlmaWVyLCByZXF1aXJlZC4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkOworCisJLyoqIFZlcnNpb24sIG9wdGlvbmFsLiAqLworCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKKworCS8qKiBUeXBlLCByZXF1aXJlZC4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7CisKKwkvKiogU3RhdHVzIElELCByZXF1aXJlZC4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1c0lEOworCisJLyoqIFR5cGUgb2Ygc2VjdXJpdHkgdG8gYXBwbHksIG9wdGlvbmFsLiAqLworCXByb3RlY3RlZCBTdHJpbmcgc2VjdXJpdHlUeXBlOworCisJLyoqIFBhcmVudCBwcm9maWxlIElELCBvcHRpb25hbC4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudDsKKworCS8qKiBMaXN0IG9mIHplcm8gb3IgbW9yZSBjaGlsZHJlbiBwcm9maWxlIElEcyAoe0BsaW5rIFN0cmluZ31zKS4gKi8KKwlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKKworCS8qKiBSZWdpc3RyYXRpb24gYXV0aG9yaXR5LCBvcHRpb25hbC4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlZ0F1dGhvcml0eTsKKworCS8qKiBSZXZpc2lvbiBub3RlcywgemVybyBvciBtb3JlIHtAbGluayBTdHJpbmd9cy4gKi8KKwlwcm90ZWN0ZWQgTGlzdCByZXZpc2lvbk5vdGVzOworCisgICAgICAgIC8qKiBTZXJpYWwgdmVyc2lvbiB1bmlxdWUgSUQuICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MTQwMjY0MzEyNDYyMDgwMDU4TDsKKworCS8qKgorCSAqIENyZWF0ZSBhICZsdDtwcm9mQXR0cmlidXRlcyZndDsgZG9jdW1lbnQgdXNpbmcgdGhlIHByb2ZpbGVzIERURC4KKwkgKgorCSAqIEByZXR1cm4gQSAmbHQ7cHJvZkF0dHJpYnV0cyZndDsgZG9jdW1lbnQgd2l0aCB0aGUgcHJvZmlsZXMgRFRELgorCSAqLworCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgY3JlYXRlUHJvZkF0dHJpYnV0ZXNEb2N1bWVudCgpIHsKKwkJcmV0dXJuIFByb2ZpbGUuY3JlYXRlRG9jdW1lbnQoInByb2ZBdHRyaWJ1dGVzIik7CisJfQorCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVFbGVtZW50LmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGQwMjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgY29tLmhwLmhwbC5qZW5hLnJkZi5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLlJlc291cmNlOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRG9jdW1lbnRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKgorICogUHJvZmlsZSBlbGVtZW50LgorICoKKyAqIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgZWxlbWVudHMgdGhhdCBkZXNjcmliZSB0aGUgY29tcG9zaXRpb24gb2YgYSByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9maWxlRWxlbWVudCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlLCBEb2N1bWVudGFibGUgeworCS8qKgorCSAqIENyZWF0ZSBhIHByb2ZpbGUgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBYTUwgbm9kZS4KKwkgKgorCSAqIEBwYXJhbSByb290IFRoZSAmbHQ7cHJvZkVsZW1lbnQmZ3Q7IG5vZGUuCisJICogQHBhcmFtIHByb2ZpbGUgVG8gd2hhdCBwcm9maWxlIHRoZSBlbGVtZW50IGJlbG9uZ3MuCisJICogQHJldHVybiBBIHByb2ZpbGUgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFByb2ZpbGVFbGVtZW50IGNyZWF0ZVByb2ZpbGVFbGVtZW50KEVsZW1lbnQgcm9vdCwgUHJvZmlsZSBwcm9maWxlLCBPYmplY3RGYWN0b3J5IGZhY3RvcnkpIHsKKwkJU3RyaW5nIG5hbWUgPSBudWxsOworCQlTdHJpbmcgaWQgPSBudWxsOworCQlTdHJpbmcgZGVzYyA9IG51bGw7CisJCVN0cmluZyB0eXBlID0gbnVsbDsKKwkJU3RyaW5nIHVuaXQgPSBudWxsOworCQlMaXN0IHN5bm9ueW1zID0gbmV3IEFycmF5TGlzdCgpOworCQlib29sZWFuIG9ibGlnYXRpb24gPSBmYWxzZTsKKwkJaW50IG1heE9jY3VycmVuY2UgPSAwOworCQlTdHJpbmcgY29tbWVudHMgPSBudWxsOworCQlib29sZWFuIHJhbmdlZCA9IGZhbHNlOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOworCQlTdHJpbmcgbWluID0gIjAuMCIsIG1heCA9ICIwLjAiOworCQlib29sZWFuIGdvdE1pbiA9IGZhbHNlOworCQlib29sZWFuIGdvdE1heCA9IGZhbHNlOworCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQlOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJaWYgKCJlbGVtSWQiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCWlkID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgiZWxlbU5hbWUiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCW5hbWUgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCWVsc2UgaWYgKCJlbGVtRGVzYyIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJZGVzYyA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJZWxzZSBpZiAoImVsZW1UeXBlIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQl0eXBlID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgiZWxlbVVuaXQiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXVuaXQgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCWVsc2UgaWYgKCJlbGVtRW51bUZsYWciLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXJhbmdlZCA9ICJGIi5lcXVhbHMoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoImVsZW1TeW5vbnltIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlzeW5vbnltcy5hZGQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoImVsZW1PYmxpZ2F0aW9uIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkgeworCQkJCVN0cmluZyB2YWx1ZSA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJCW9ibGlnYXRpb24gPSAiUmVxdWlyZWQiLmVxdWFscyh2YWx1ZSkgfHwgIlQiLmVxdWFscyh2YWx1ZSk7CisJCQl9IGVsc2UgaWYgKCJlbGVtTWF4T2NjdXJyZW5jZSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJdHJ5IHsKKwkJCQkJbWF4T2NjdXJyZW5jZSA9IEludGVnZXIucGFyc2VJbnQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQllbHNlIGlmICgiZWxlbUNvbW1lbnQiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCWNvbW1lbnRzID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgiZWxlbVZhbHVlIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkgeworCQkJCXZhbHVlcy5hZGQodGV4dChub2RlKSk7CisJCQl9IGVsc2UgaWYgKCJlbGVtTWluVmFsdWUiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXRyeSB7CisJCQkJCW1pbiA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJCQlnb3RNaW4gPSB0cnVlOworCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCQllbHNlIGlmICgiZWxlbU1heFZhbHVlIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQl0cnkgeworCQkJCQltYXggPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJCQkJZ290TWF4ID0gdHJ1ZTsKKwkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7fQorCQl9CisJCWlmIChyYW5nZWQpIHsKKwkJCWlmIChnb3RNaW4gJiYgZ290TWF4KSB7CisJCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlUmFuZ2VkUHJvZmlsZUVsZW1lbnQocHJvZmlsZSwgbmFtZSwgaWQsIGRlc2MsIHR5cGUsIHVuaXQsIHN5bm9ueW1zLCBvYmxpZ2F0aW9uLAorCQkJCQltYXhPY2N1cnJlbmNlLCBjb21tZW50cywgbWluLCBtYXgpOworCQkJfQorCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudChwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sCisJCQkJbWF4T2NjdXJyZW5jZSwgY29tbWVudHMpOworCQl9IGVsc2UKKwkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sCisJCQkJbWF4T2NjdXJyZW5jZSwgY29tbWVudHMsIHZhbHVlcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGJsYW5rIHByb2ZpbGUgYXR0cmlidXRlcyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHByb2ZpbGUuCisJICovCisJcHJvdGVjdGVkIFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOworCQlzeW5vbnltcyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIGVsZW1lbnQgZnJvbSBjb25zdGl0dWVudCBhdHRyaWJ1dGVzLgorCSAqCisJICogQHBhcmFtIHByb2ZpbGUgUHJvZmlsZSB0byB3aGljaCB0aGlzIGVsZW1lbnQgYmVsb25ncy4KKwkgKiBAcGFyYW0gbmFtZSBSZXF1aXJlZCBuYW1lIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgZWxlbWVudC4KKwkgKiBAcGFyYW0gZGVzYyBMb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSB0eXBlIERhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKwkgKiBAcGFyYW0gdW5pdCBVbml0cy4KKwkgKiBAcGFyYW0gc3lub255bXMgQ29sbGVjdGlvbiBvZiBlbGVtZW50IElEcyAoe0BsaW5rIFN0cmluZ30pIHRoYXQgYXJlIHN5bm9ueW1zIGZvciB0aGlzIGVsZW1lbnQuCisJICogQHBhcmFtIG9ibGlnYXRpb24gVHJ1ZSBpZiB0aGlzIGlzIGEgcmVxdWlyZWQgZWxlbWVudAorCSAqIEBwYXJhbSBtYXhPY2N1cnJlbmNlIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoaXMgZWxlbWVudC4KKwkgKiBAcGFyYW0gY29tbWVudHMgQW55IGNvbW1lbnRzIGFib3V0IHRoaXMgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgUHJvZmlsZUVsZW1lbnQoUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgZGVzYywgU3RyaW5nIHR5cGUsIFN0cmluZyB1bml0LCBMaXN0IHN5bm9ueW1zLAorCQlib29sZWFuIG9ibGlnYXRpb24sIGludCBtYXhPY2N1cnJlbmNlLCBTdHJpbmcgY29tbWVudHMpIHsKKwkJdGhpcy5wcm9maWxlID0gcHJvZmlsZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5pZCA9IGlkOworCQl0aGlzLmRlc2MgPSBkZXNjOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnVuaXQgPSB1bml0OworCQl0aGlzLnN5bm9ueW1zID0gc3lub255bXM7CisJCXRoaXMub2JsaWdhdGlvbiA9IG9ibGlnYXRpb247CisJCXRoaXMubWF4T2NjdXJyZW5jZSA9IG1heE9jY3VycmVuY2U7CisJCXRoaXMuY29tbWVudHMgPSBjb21tZW50czsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIFByb2ZpbGVFbGVtZW50KSkgcmV0dXJuIGZhbHNlOworCQlQcm9maWxlRWxlbWVudCBvYmogPSAoUHJvZmlsZUVsZW1lbnQpIHJoczsKKwkJcmV0dXJuIHByb2ZpbGUuZXF1YWxzKG9iai5wcm9maWxlKSAmJiBuYW1lLmVxdWFscyhvYmoubmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltwcm9maWxlPSIgKyBwcm9maWxlLnRvU3RyaW5nKCkgKyAiLG5hbWU9IiArIG5hbWUgKyAiXSI7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IG9iaiA9IG51bGw7CisJCXRyeSB7CisJCQlvYmogPSBzdXBlci5jbG9uZSgpOworCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjYW50SGFwcGVuKSB7fQorCQlyZXR1cm4gb2JqOworCX0KKworCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCByaHMpIHsKKwkJUHJvZmlsZUVsZW1lbnQgb2JqID0gKFByb2ZpbGVFbGVtZW50KSByaHM7CisJCWlmIChwcm9maWxlLmNvbXBhcmVUbyhvYmoucHJvZmlsZSkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAocHJvZmlsZS5jb21wYXJlVG8ob2JqLnByb2ZpbGUpID09IDApCisJCQlyZXR1cm4gbmFtZS5jb21wYXJlVG8ob2JqLm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHByb2ZpbGUgdG8gd2hvbSBJIGJlbG9uZy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG93bmluZyBwcm9maWxlLgorCSAqLworCXB1YmxpYyBQcm9maWxlIGdldFByb2ZpbGUoKSB7CisJCXJldHVybiBwcm9maWxlOworCX0KKworCS8qKgorCSAqIEdldCBteSBuYW1lLgorCSAqCisJICogQHJldHVybiBNeSBuYW1lLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogR2V0IG15IGVsZW1lbnQgSUQuCisJICoKKwkgKiBAcmV0dXJuIE15IElELgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiBHZXQgbXkgbG9uZyBkZXNjcmlwdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gTXkgbG9uZyBkZXNjcmlwdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwkvKioKKwkgKiBHZXQgbXkgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gTXkgdHlwZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIEdldCBteSB1bml0LgorCSAqCisJICogQHJldHVybiBNeSB1bml0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIHVuaXQ7CisJfQorCisJLyoqCisJICogR2V0IG15IHN5bm9ueW1zLgorCSAqCisJICogQHJldHVybiBBIGxpc3Qgb2Ygc3lub255bXMuCisJICovCisJcHVibGljIExpc3QgZ2V0U3lub255bXMoKSB7CisJCXJldHVybiBzeW5vbnltczsKKwl9CisKKwkvKioKKwkgKiBBbSBJIG9ibGlnYXRvcnk/CisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgSSBhbSwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzT2JsaWdhdG9yeSgpIHsKKwkJcmV0dXJuIG9ibGlnYXRpb247CisJfQorCisJLyoqCisJICogR2V0IGhvdyBtYW55IHRpbWVzIEkgY2FuIG9jY3VyLgorCSAqCisJICogQHJldHVybiBIb3cgbWFueSB0aW1lcyBJIGNhbiBvY2N1ci4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heE9jY3VycmVuY2UoKSB7CisJCXJldHVybiBtYXhPY2N1cnJlbmNlOworCX0KKworCS8qKgorCSAqIEdldCBhbnkgY29tbWVudHMgYWJvdXQgbWUuCisJICoKKwkgKiBAcmV0dXJuIEFueSBjb21tZW50cy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRzKCkgeworCQlyZXR1cm4gY29tbWVudHM7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBwcm9maWxlIHRvIHdob20gSSBiZWxvbmcuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBUaGUgb3duaW5nIHByb2ZpbGUuCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvZmlsZShQcm9maWxlIHByb2ZpbGUpIHsKKwkJdGhpcy5wcm9maWxlID0gcHJvZmlsZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgbXkgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE15IG5hbWUuCisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIFNldCBteSBlbGVtZW50IElELgorCSAqCisJICogQHBhcmFtIGlkIE15IElELgorCSAqLworCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJLyoqCisJICogU2V0IG15IGxvbmcgZGVzY3JpcHRpb24uCisJICoKKwkgKiBAcGFyYW0gZGVzYyBNeSBsb25nIGRlc2NyaXB0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJLyoqCisJICogU2V0IG15IHR5cGUuCisJICoKKwkgKiBAcGFyYW0gdHlwZSBNeSB0eXBlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgbXkgdW5pdC4KKwkgKgorCSAqIEBwYXJhbSB1bml0IE15IHVuaXQuCisJICovCisJcHVibGljIHZvaWQgc2V0VW5pdChTdHJpbmcgdW5pdCkgeworCQl0aGlzLnVuaXQgPSB1bml0OworCX0KKworCS8qKgorCSAqIFNldCB3aGV0aGVyIEknbSBvYmxpZ2F0b3J5LgorCSAqCisJICogQHBhcmFtIG9ibGlnYXRvcnkgVHJ1ZSBpZiBJIGFtLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIHZvaWQgc2V0T2JsaWdhdGlvbihib29sZWFuIG9ibGlnYXRvcnkpIHsKKwkJdGhpcy5vYmxpZ2F0aW9uID0gb2JsaWdhdG9yeTsKKwl9CisKKwkvKioKKwkgKiBTZXQgaG93IG1hbnkgdGltZXMgSSBjYW4gb2NjdXIuCisJICoKKwkgKiBAcGFyYW0gb2NjdXJyZW5jZSBIb3cgbWFueSB0aW1lcyBJIGNhbiBvY2N1ci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnJlbmNlKGludCBvY2N1cnJlbmNlKSB7CisJCXRoaXMubWF4T2NjdXJyZW5jZSA9IG9jY3VycmVuY2U7CisJfQorCisJLyoqCisJICogU2V0IGFueSBjb21tZW50cyBhYm91dCBtZS4KKwkgKgorCSAqIEBwYXJhbSBjb21tZW50cyBBbnkgY29tbWVudHMuCisJICovCisJcHVibGljIHZvaWQgc2V0Q29tbWVudHMoU3RyaW5nIGNvbW1lbnRzKSB7CisJCXRoaXMuY29tbWVudHMgPSBjb21tZW50czsKKwl9CisKKwkvKioKKwkgKiBHZXQgbXkgbWluaW11bSB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gTXkgbWluaW11bSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1pblZhbHVlKCk7CisKKwkvKioKKwkgKiBHZXQgbXkgbWF4aW11bSB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gTXkgbWF4aW11bSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1heFZhbHVlKCk7CisKKwkvKioKKwkgKiBHZXQgbGVnYWwgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBMaXN0IG9mIGxlZ2FsIHZhbHVlcyAoYXMge0BsaW5rIFN0cmluZ31zKS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRWYWx1ZXMoKTsKKworCS8qKgorCSAqIFNlcmlhbGl6ZSB0aGlzIGVsZW1lbnQgYXMgYW4gWE1MIG5vZGUuCisJICoKKwkgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0aGF0IHdpbGwgb3duIHRoaXMgbm9kZS4KKwkgKiBAcmV0dXJuIFRoZSBYTUwgZWxlbWVudCAmbHQ7cmVzQXR0cmlidXRlcyZndDsgcmVwcmVzZW50aW5nIHRoZXNlIGF0dHJpYnV0ZXMuCisJICogQHRocm93cyBET01FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBYTUwgbm9kZXMuCisJICovCisJcHVibGljIE5vZGUgdG9YTUwoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRvWE1MKGRvYywgLyp3aXRoVmFsdWVzKi90cnVlKTsKKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemUgdGhpcyBlbGVtZW50IGFzIGFuIFhNTCBub2RlIHdpdGhvdXQgYW55IHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRoYXQgd2lsbCBvd24gdGhpcyBub2RlLgorCSAqIEByZXR1cm4gVGhlIFhNTCBlbGVtZW50ICZsdDtyZXNBdHRyaWJ1dGVzJmd0OyByZXByZXNlbnRpbmcgdGhlc2UgYXR0cmlidXRlcy4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIFhNTCBub2Rlcy4KKwkgKi8KKwlwdWJsaWMgTm9kZSB0b1hNTFdpdGhvdXRWYWx1ZXMoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRvWE1MKGRvYywgLyp3aXRoVmFsdWVzKi9mYWxzZSk7CisJfQorCisJLyoqCisJICogU2VyaWFsaXplIHRoaXMgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRoYXQgd2lsbCBvd24gdGhpcyBub2RlLgorCSAqIEBwYXJhbSB3aXRoVmFsdWVzIElmIHRydWUsIHNlcmlhbGl6ZSB0aGUgdmFsdWVzIGFzIHdlbGwuCisJICogQHJldHVybiBUaGUgWE1MIGVsZW1lbnQgJmx0O3Byb2ZFbGVtZW50Jmd0OyByZXByZXNlbnRpbmcgdGhpcyBlbGVtZW50LgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgWE1MIG5vZGVzLgorCSAqLworCXByaXZhdGUgTm9kZSB0b1hNTChEb2N1bWVudCBkb2MsIGJvb2xlYW4gd2l0aFZhbHVlcykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCUVsZW1lbnQgcHJvZkVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvZkVsZW1lbnQiKTsKKwkJWE1MLmFkZE5vbk51bGwocHJvZkVsZW1lbnQsICJlbGVtSWQiLCBpZCk7CisJCVhNTC5hZGROb25OdWxsKHByb2ZFbGVtZW50LCAiZWxlbU5hbWUiLCBuYW1lKTsKKwkJWE1MLmFkZE5vbk51bGwocHJvZkVsZW1lbnQsICJlbGVtRGVzYyIsIGRlc2MpOworCQlYTUwuYWRkTm9uTnVsbChwcm9mRWxlbWVudCwgImVsZW1UeXBlIiwgdHlwZSk7CisJCVhNTC5hZGROb25OdWxsKHByb2ZFbGVtZW50LCAiZWxlbVVuaXQiLCB1bml0KTsKKwkJWE1MLmFkZChwcm9mRWxlbWVudCwgImVsZW1FbnVtRmxhZyIsIGlzRW51bWVyYXRlZCgpPyAiVCIgOiAiRiIpOworCQlpZiAod2l0aFZhbHVlcykgYWRkVmFsdWVzKHByb2ZFbGVtZW50KTsKKwkJWE1MLmFkZChwcm9mRWxlbWVudCwgImVsZW1TeW5vbnltIiwgc3lub255bXMpOworCQlpZiAoaXNPYmxpZ2F0b3J5KCkpCisJCQlYTUwuYWRkKHByb2ZFbGVtZW50LCAiZWxlbU9ibGlnYXRpb24iLCJSZXF1aXJlZCIpOworCQlpZiAoZ2V0TWF4T2NjdXJyZW5jZSgpID49IDApCisJCQlYTUwuYWRkKHByb2ZFbGVtZW50LCAiZWxlbU1heE9jY3VycmVuY2UiLCBTdHJpbmcudmFsdWVPZihnZXRNYXhPY2N1cnJlbmNlKCkpKTsKKwkJWE1MLmFkZChwcm9mRWxlbWVudCwgImVsZW1Db21tZW50IiwgY29tbWVudHMpOworCQlyZXR1cm4gcHJvZkVsZW1lbnQ7CisJfQorCisJLyoqCisJICogVGVsbCBpZiB0aGlzIGVsZW1lbnQgaXMgb2YgdGhlIGVudW1lcmF0ZWQga2luZC4KKwkgKgorCSAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0VudW1lcmF0ZWQoKTsKKworCS8qKgorCSAqIEFkZCB0aGUgdmFsdWVzIG9mIHRoaXMgZWxlbWVudCB0byB0aGUgZ2l2ZW4gbm9kZS4KKwkgKgorCSAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZCB0by4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIFhNTCBub2Rlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRWYWx1ZXMoTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOworCisJLyoqCisJICogQWRkIHRoaXMgZWxlbWVudCB0byBhbiBSREYgbW9kZWwgaW5jbHVkaW5nIHRoaXMgZWxlbWVudCdzIHByb2ZpbGUuCisJICoKKwkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIHdoaWNoIHdlJ3JlIGJlaW5nIGFkZGVkLgorCSAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcHJvZmlsZSBhcyBhbiBSREYgcmVzb3VyY2UgZGVzY3JpcHRpb24uCisJICogQHBhcmFtIHByb2ZBdHRyIFRoZSBwcm9maWxlJ3MgYXR0cmlidXRlcy4KKwkgKi8KKwl2b2lkIGFkZFRvTW9kZWwoTW9kZWwgbW9kZWwsIFJlc291cmNlIHJlc291cmNlLCBQcm9maWxlQXR0cmlidXRlcyBwcm9mQXR0cikgeworCQlVUkkgcHJvZmlsZVVSSSA9IHByb2ZpbGUuZ2V0VVJJKCk7CisJCVVSSSBteVVSSSA9IFVSSS5jcmVhdGUocHJvZmlsZVVSSS50b1N0cmluZygpICsgIiMiICsgbmFtZSk7CisKKwkJUmVzb3VyY2UgZWxlbWVudCA9IG1vZGVsLmNyZWF0ZVJlc291cmNlKG15VVJJLnRvU3RyaW5nKCkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCByZXNvdXJjZSwgVXRpbGl0eS5lZG1FbGVtZW50LCBlbGVtZW50LCBwcm9mQXR0ciwgbXlVUkkpOworCisJCVN0cmluZyBvYlN0ciA9IG9ibGlnYXRpb24/ICJSZXF1aXJlZCIgOiAiT3B0aW9uYWwiOworCQlTdHJpbmcgb2NjdXJTdHIgPSBTdHJpbmcudmFsdWVPZihtYXhPY2N1cnJlbmNlKTsKKworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbUVsZW1JRCwgICAgICAgIGlkLCAgICAgICBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbURlc2NyaXB0aW9uLCAgIGRlc2MsICAgICBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbUVsZW1UeXBlLCAgICAgIHR5cGUsICAgICBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbVVuaXQsICAgICAgICAgIHVuaXQsICAgICBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbVN5bm9ueW0sICAgICAgIHN5bm9ueW1zLCBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbU9ibGlnYXRpb24sICAgIG9iU3RyLCAgICBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbU1heE9jY3VycmVuY2UsIG9jY3VyU3RyLCBwcm9mQXR0ciwgbXlVUkkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbUNvbW1lbnQsICAgICAgIGNvbW1lbnRzLCBwcm9mQXR0ciwgbXlVUkkpOworCisJCWFkZEVsZW1lbnRTcGVjaWZpY1Byb3BlcnRpZXMobW9kZWwsIGVsZW1lbnQsIHByb2ZBdHRyLCBteVVSSSk7CisJfQorCisJLyoqCisJICogQWRkIHRoZSBzdGF0ZW1lbnRzIHNwZWNpZmljIHRvIHRoaXMga2luZCBvZiBwcm9maWxlIGVsZW1lbnQgdG8gYW4gUkRGIG1vZGVsLgorCSAqCisJICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbC4KKwkgKiBAcGFyYW0gZWxlbWVudCBUaGlzIGVsZW1lbnQsIGFzIGFuIFJERiByZXNvdXJjZS4KKwkgKiBAcGFyYW0gcHJvZkF0dHIgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQncyBwcm9maWxlLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZEVsZW1lbnRTcGVjaWZpY1Byb3BlcnRpZXMoTW9kZWwgbW9kZWwsIFJlc291cmNlIGVsZW1lbnQsIFByb2ZpbGVBdHRyaWJ1dGVzIHByb2ZBdHRyLCBVUkkgdXJpKTsKKworCS8qKiBNeSBwcm9maWxlLiAqLworCXByb3RlY3RlZCBQcm9maWxlIHByb2ZpbGU7CisKKwkvKiogTXkgcmVxdWlyZWQgbmFtZS4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKwkvKiogTXkgb3B0aW9uYWwgaWQuICovCisJcHJvdGVjdGVkIFN0cmluZyBpZDsKKworCS8qKiBNeSBvcHRpb25hbCBkZXNjcmlwdGlvbi4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2M7CisKKwkvKiogTXkgb3B0aW9uYWwgdHlwZS4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7CisKKwkvKiogTXkgb3B0aW9uYWwgdW5pdC4gKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHVuaXQ7CisKKwkvKiogTXkgc3lub255bXMuICovCisJcHJvdGVjdGVkIExpc3Qgc3lub255bXM7CisKKwkvKiogTXkgb2JsaWdhdGlvbi4gKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBvYmxpZ2F0aW9uOworCisJLyoqIE15IG1heE9jY3VycmVuY2UuICovCisJcHJvdGVjdGVkIGludCBtYXhPY2N1cnJlbmNlOworCisJLyoqIE15IG9wdGlvbmFsIGNvbW1lbnRzLiAqLworCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudHM7CisKKwkvKioKKwkgKiBDcmVhdGUgYSAmbHQ7cHJvZkVsZW1lbnQmZ3Q7IGRvY3VtZW50IHVzaW5nIHRoZSBwcm9maWxlcyBEVEQuCisJICoKKwkgKiBAcmV0dXJuIEEgJmx0O3Byb2ZFbGVtZW50Jmd0OyBkb2N1bWVudCB3aXRoIHRoZSBwcm9maWxlcyBEVEQuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVQcm9mRWxlbWVudERvY3VtZW50KCkgeworCQlyZXR1cm4gUHJvZmlsZS5jcmVhdGVEb2N1bWVudCgicHJvZkVsZW1lbnQiKTsKKwl9CisKKwkvKioKKwkgKiBHaXZlbiBhIHNldCBvZiBwcm9maWxlIGVsZW1lbnRzLCByZXR1cm4gYSBzZXQgb2YgcHJvZmlsZXMgdGhhdCBvd24gdGhvc2UgZWxlbWVudHMuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudHMgUHJvZmlsZSBlbGVtZW50cy4KKwkgKiBAcmV0dXJuIFByb2ZpbGVzIHRoYXQgb3duIHRob3NlIGVsZW1lbnRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU2V0IHByb2ZpbGVzKFNldCBlbGVtZW50cykgeworCQlTZXQgcmMgPSBuZXcgSGFzaFNldCgpOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCVByb2ZpbGVFbGVtZW50IGVsZW1lbnQgPSAoUHJvZmlsZUVsZW1lbnQpIGkubmV4dCgpOworCQkJcmMuYWRkKGVsZW1lbnQuZ2V0UHJvZmlsZSgpKTsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorCisJLyoqCisJICogR2l2ZW4gYSBzZXQgb2YgcHJvZmlsZXMgYW5kIG9mIHByb2ZpbGUgZWxlbWVudHMsIHJldHVybiB0aG9zZSBlbGVtZW50cyB0aGF0CisJICogYXJlIG93bmVkIGJ5IGFueSBvZiB0aGUgZ2l2ZW4gcHJvZmlsZXMuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZXMgUHJvZmlsZXMuCisJICogQHBhcmFtIGVsZW1lbnRzIFByb2ZpbGUgZWxlbWVudHMuCisJICogQHJldHVybiBNZW1iZXJzIG9mIDx2YXI+ZWxlbWVudHM8L3Zhcj4gdGhhdCBhcmUgb3duZWQgYnkgbWVtYmVycyBvZiA8dmFyPnByb2ZpbGVzPC92YXI+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgU2V0IGVsZW1lbnRzKFNldCBwcm9maWxlcywgU2V0IGVsZW1lbnRzKSB7CisJCVNldCByYyA9IG5ldyBIYXNoU2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUHJvZmlsZUVsZW1lbnQgZWxlbWVudCA9IChQcm9maWxlRWxlbWVudCkgaS5uZXh0KCk7CisJCQlpZiAocHJvZmlsZXMuY29udGFpbnMoZWxlbWVudC5nZXRQcm9maWxlKCkpKQorCQkJCXJjLmFkZChlbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorCisJc3RhdGljIFN0cmluZyB0ZXh0KE5vZGUgbm9kZSkgeworCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkgICAgICAgIHRleHQwKGIsIG5vZGUpOworCQlyZXR1cm4gYi50b1N0cmluZygpOworCX0KKworCXN0YXRpYyB2b2lkIHRleHQwKFN0cmluZ0J1ZmZlciBiLCBOb2RlIG5vZGUpIHsKKwkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKKwkJCWIuYXBwZW5kKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOworCQkJcmV0dXJuOworCQl9CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkKKwkJCXRleHQwKGIsIGNoaWxkcmVuLml0ZW0oaSkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjRlNmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZTsKKworLyoqCisgKiBBIHByb2ZpbGUtcmVsYXRlZCBleGNlcHRpb24uCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgUHJvZmlsZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisJLyoqCisJICogQ3JlYXRlIGEgcHJvZmlsZSBleGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgUHJvZmlsZUV4Y2VwdGlvbigpIHt9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgUHJvZmlsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBjaGFpbmVkIHByb2ZpbGUgZXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIGNhdXNlIENhdXNpbmcgZXhjZXB0aW9uLgorCSAqLworCXB1YmxpYyBQcm9maWxlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihjYXVzZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIGNoYWluZWQgcHJvZmlsZSBleGNlcHRpb24gd2l0aCBkZXRhaWwgbWVzc2FnZS4KKwkgKgorCSAqIEBwYXJhbSBtc2cgRGV0YWlsIG1lc3NhZ2UuCisJICogQHBhcmFtIGNhdXNlIENhdXNpbmcgZXhjZXB0aW9uLgorCSAqLworCXB1YmxpYyBQcm9maWxlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtc2csIGNhdXNlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlU0FYRXhjZXB0aW9uLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlU0FYRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhNDBmNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVTQVhFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEFuIFhNTC1yZWxhdGVkIFNBWCBleGNlcHRpb24gZnJvbSBhIHByb2ZpbGUgc2VydmVyLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVTQVhFeGNlcHRpb24gZXh0ZW5kcyBQcm9maWxlRXhjZXB0aW9uIHsKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIFNBWCBleGNlcHRpb24uCisJICoKKwkgKiBAcGFyYW0gY2F1c2UgVGhlIFNBWCBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBwcm9maWxlIGV4Y2VwdGlvbi4KKwkgKi8KKwlwdWJsaWMgUHJvZmlsZVNBWEV4Y2VwdGlvbihTQVhFeGNlcHRpb24gY2F1c2UpIHsKKwkJc3VwZXIoY2F1c2UpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVTUUxFeGNlcHRpb24uamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVTUUxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU3Yjk1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZVNRTEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCisvKioKKyAqIEEgZGF0YWJhc2UtcmVsYXRlZCBTUUwgZXhjZXB0aW9uIGZyb20gYSBwcm9maWxlIHNlcnZlci4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9maWxlU1FMRXhjZXB0aW9uIGV4dGVuZHMgUHJvZmlsZUV4Y2VwdGlvbiB7CisJLyoqCisJICogQ3JlYXRlIGEgcHJvZmlsZSBTUUwgZXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIGNhdXNlIFRoZSBTUUwgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoaXMgcHJvZmlsZSBleGNlcHRpb24uCisJICovCisJcHVibGljIFByb2ZpbGVTUUxFeGNlcHRpb24oU1FMRXhjZXB0aW9uIGNhdXNlKSB7CisJCXN1cGVyKGNhdXNlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9SYW5nZWRQcm9maWxlRWxlbWVudC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUmFuZ2VkUHJvZmlsZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY3MDljCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUmFuZ2VkUHJvZmlsZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLk1vZGVsOworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgamF2YS5uZXQuVVJJOworCisvKioKKyAqIFJhbmdlZCBwcm9maWxlIGVsZW1lbnQuCisgKgorICogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFyZSBlbGVtZW50cyBvZiBhIHByb2ZpbGUgdGhhdCByZXByZXNlbnQgYSByYW5nZSBvZiB2YWx1ZXMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgUmFuZ2VkUHJvZmlsZUVsZW1lbnQgZXh0ZW5kcyBQcm9maWxlRWxlbWVudCB7CisJLyoqCisJICogQ3JlYXRlIGJsYW5rIHByb2ZpbGUgYXR0cmlidXRlcyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHByb2ZpbGUuCisJICovCisJcHVibGljIFJhbmdlZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSkgeworCQlzdXBlcihwcm9maWxlKTsKKwkJbWluID0gIiI7CisJCW1heCA9ICIiOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIHByb2ZpbGUgZWxlbWVudCBmcm9tIGNvbnN0aXR1ZW50IGF0dHJpYnV0ZXMuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBQcm9maWxlIHRvIHdoaWNoIHRoaXMgZWxlbWVudCBiZWxvbmdzLgorCSAqIEBwYXJhbSBuYW1lIFJlcXVpcmVkIG5hbWUgb2YgdGhlIGVsZW1lbnQuCisJICogQHBhcmFtIGlkIElEIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSBkZXNjIExvbmcgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQuCisJICogQHBhcmFtIHR5cGUgRGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSB1bml0IFVuaXRzLgorCSAqIEBwYXJhbSBzeW5vbnltcyBDb2xsZWN0aW9uIG9mIGVsZW1lbnQgSURzICh7QGxpbmsgU3RyaW5nfSkgdGhhdCBhcmUgc3lub255bXMgZm9yIHRoaXMgZWxlbWVudC4KKwkgKiBAcGFyYW0gb2JsaWdhdGlvbiBUcnVlIGlmIHRoaXMgaXMgYSByZXF1aXJlZCBlbGVtZW50CisJICogQHBhcmFtIG1heE9jY3VycmVuY2UgTWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhpcyBlbGVtZW50LgorCSAqIEBwYXJhbSBjb21tZW50IEFueSBjb21tZW50cyBhYm91dCB0aGlzIGVsZW1lbnQuCisJICogQHBhcmFtIG1pbiBNaW5pbXVtIHZhbHVlLgorCSAqIEBwYXJhbSBtYXggTWF4aW11bSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgUmFuZ2VkUHJvZmlsZUVsZW1lbnQoUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgZGVzYywgU3RyaW5nIHR5cGUsIFN0cmluZyB1bml0LCBMaXN0IHN5bm9ueW1zLAorCQlib29sZWFuIG9ibGlnYXRpb24sIGludCBtYXhPY2N1cnJlbmNlLCBTdHJpbmcgY29tbWVudCwgU3RyaW5nIG1pbiwgU3RyaW5nIG1heCkgeworCQlzdXBlcihwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sIG1heE9jY3VycmVuY2UsIGNvbW1lbnQpOworCQl0aGlzLm1pbiA9IG1pbjsKKwkJdGhpcy5tYXggPSBtYXg7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1pblZhbHVlKFN0cmluZyBtaW4peworCQl0aGlzLm1pbiA9IG1pbjsKKwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1heFZhbHVlKFN0cmluZyBtYXgpeworCQl0aGlzLm1heCA9IG1heDsKKwkJCisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVzKE5vZGUgbm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCVhNTC5hZGQobm9kZSwgImVsZW1NaW5WYWx1ZSIsIG1pbik7CisJCVhNTC5hZGQobm9kZSwgImVsZW1NYXhWYWx1ZSIsIG1heCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKG1pbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXhWYWx1ZSgpIHsKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKG1heCk7CisJfQorCisJcHVibGljIExpc3QgZ2V0VmFsdWVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50U3BlY2lmaWNQcm9wZXJ0aWVzKE1vZGVsIG1vZGVsLCBSZXNvdXJjZSBlbGVtZW50LCBQcm9maWxlQXR0cmlidXRlcyBwcm9mQXR0ciwgVVJJIHVyaSkgeworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbU1pblZhbHVlLCBtaW4sIHByb2ZBdHRyLCB1cmkpOworCQlVdGlsaXR5LmFkZFByb3BlcnR5KG1vZGVsLCBlbGVtZW50LCBVdGlsaXR5LmVkbU1heFZhbHVlLCBtYXgsIHByb2ZBdHRyLCB1cmkpOworCX0KKworCS8qKiBNaW5pbXVtIHZhbHVlLiAqLworCXByb3RlY3RlZCBTdHJpbmcgbWluOworCisJLyoqIE1heGltdW0gdmFsdWUuICovCisJcHJvdGVjdGVkIFN0cmluZyBtYXg7CisKKyAgICAgICAgLyoqIFNlcmlhbCB2ZXJzaW9uIHVuaXF1ZSBJRC4gKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01Njk3MTAyNTk3NDQzMDg5NzUzTDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Jlc291cmNlQXR0cmlidXRlcy5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUmVzb3VyY2VBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlOGYyZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Jlc291cmNlQXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQgY29tLmhwLmhwbC5qZW5hLnJkZi5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLlByb3BlcnR5OworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRvY3VtZW50YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKgorICogUmVzb3VyY2UgYXR0cmlidWV0cy4KKyAqCisgKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIHJlc291cmNlIGF0dHJpYnV0ZXMgb2YgcHJvZmlsZXMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VBdHRyaWJ1dGVzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGUsIERvY3VtZW50YWJsZSB7CisJLyoqCisJICogQ3JlYXRlIGJsYW5rIHByb2ZpbGUgYXR0cmlidXRlcy4KKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VBdHRyaWJ1dGVzKCkgeworCQl0aGlzKC8qcHJvZmlsZSovbnVsbCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGJsYW5rIHByb2ZpbGUgYXR0cmlidXRlcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIHByb2ZpbGUuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBPd25pbmcgcHJvZmlsZS4KKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VBdHRyaWJ1dGVzKFByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOworCQlpZGVudGlmaWVyID0gIlVOS05PV04iOworCisJCS8vIE90aGVyIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsIGFjY29yZGluZyB0byBwcm9mLmR0ZC4KKwkJaW5pdGlhbGl6ZUxpc3RzKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHJlc291cmNlIGF0dHJpYnV0ZXMgZnJvbSBhbiBYTUwgZG9jdW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBPd25pbmcgcHJvZmlsZS4KKwkgKiBAcGFyYW0gcm9vdCBUaGUgJmx0O3Jlc0F0dHJpYnV0ZXMmZ3Q7IGVsZW1lbnQuCisJICovCisJcHVibGljIFJlc291cmNlQXR0cmlidXRlcyhQcm9maWxlIHByb2ZpbGUsIE5vZGUgcm9vdCkgeworCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOworCQlpbml0aWFsaXplTGlzdHMoKTsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSByb290LmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQlOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJaWYgKCJJZGVudGlmaWVyIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlpZGVudGlmaWVyID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgiVGl0bGUiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXRpdGxlID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgiRm9ybWF0Ii5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlmb3JtYXRzLmFkZChYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCQllbHNlIGlmICgiRGVzY3JpcHRpb24iLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCWRlc2NyaXB0aW9uID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisJCQllbHNlIGlmICgiQ3JlYXRvciIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJY3JlYXRvcnMuYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJCWVsc2UgaWYgKCJTdWJqZWN0Ii5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlzdWJqZWN0cy5hZGQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoIlB1Ymxpc2hlciIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJcHVibGlzaGVycy5hZGQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoIkNvbnRyaWJ1dG9yIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQljb250cmlidXRvcnMuYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJCWVsc2UgaWYgKCJEYXRlIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlkYXRlcy5hZGQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoIlR5cGUiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCXR5cGVzLmFkZChYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCQllbHNlIGlmICgiU291cmNlIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlzb3VyY2VzLmFkZChYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCQllbHNlIGlmICgiTGFuZ3VhZ2UiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJCWxhbmd1YWdlcy5hZGQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoIlJlbGF0aW9uIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlyZWxhdGlvbnMuYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJCWVsc2UgaWYgKCJDb3ZlcmFnZSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJY292ZXJhZ2VzLmFkZChYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCQllbHNlIGlmICgiUmlnaHRzIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlyaWdodHMuYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJCWVsc2UgaWYgKCJyZXNDb250ZXh0Ii5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQljb250ZXh0cy5hZGQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkJZWxzZSBpZiAoInJlc0FnZ3JlZ2F0aW9uIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlhZ2dyZWdhdGlvbiA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJZWxzZSBpZiAoInJlc0NsYXNzIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQljbGF6eiA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkJZWxzZSBpZiAoInJlc0xvY2F0aW9uIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQlsb2NhdGlvbnMuYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZSByZXNvdXJjZSBhdHRyaWJ1dGVzIGZyb20gY29uc3RpdHVlbnQgYXR0cmlidXRlcy4KKwkgKgorCSAqIEFjY29yZGluZyB0byB0aGUgRHVibGluIENvcmUsIHRoZXNlIGF0dHJpYnV0ZXMgbWF5IGJlIG11bHRpdmFsdWVkLCBidXQgd2UgZm9yY2UKKwkgKiB0aGUgaWRlbnRpZmllciwgdGl0bGUsIGFuZCBkZXNjcmlwdGlvbiB0byBiZSBzaW5nbHkgdmFsdWVzIGluIHRoZSBEVEQsIHNvIGl0IGlzCisJICogaGVyZSwgdG9vLiAgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZXNlIGFyZSBhbGwgY29sbGVjdGlvbnMgb2Yge0BsaW5rCisJICogU3RyaW5nfS4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlIE93bmluZyBwcm9maWxlLgorCSAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSB1bmlxdWUgaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gdGl0bGUgVGl0bGUgb2YgdGhlIHJlc291cmNlLgorCSAqIEBwYXJhbSBmb3JtYXRzIEZvcm1hdCBvZiB0aGUgcmVzb3VyY2UuCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAcGFyYW0gY3JlYXRvcnMgV2hvL3doYXQgY3JlYXRlZCB0aGUgcmVzb3VyY2UuCisJICogQHBhcmFtIHN1YmplY3RzIFN1YmplY3QgbWF0dGVyIGNvdmVyZWQgYnkgdGhlIHJlc291cmNlLgorCSAqIEBwYXJhbSBwdWJsaXNoZXJzIFdoby93aGF0IHB1Ymxpc2hlZCB0aGUgcmVzcm91Y2UuCisJICogQHBhcmFtIGNvbnRyaWJ1dG9ycyBXaG8vd2hhdCBjb250cmlidXRlZCB0byB0aGUgcmVzb3VyY2UuCisJICogQHBhcmFtIGRhdGVzIFdoZW4gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIChjb2xsZWN0aW9uIG9mIHtAbGluayBqYXZhLnV0aWwuRGF0ZX0uCisJICogQHBhcmFtIHR5cGVzIFR5cGUgb2YgdGhlIHJlc291cmNlLgorCSAqIEBwYXJhbSBzb3VyY2VzIFNvdXJjZSBvZiB0aGUgcmVzb3VyY2UuCisJICogQHBhcmFtIGxhbmd1YWdlcyBMYW5ndWFnZSBpbiB3aGljaCB0aGUgcmVzb3VyY2UgaXMgd3JpdHRlbi4KKwkgKiBAcGFyYW0gcmVsYXRpb25zIFJlbGF0aW9uc2hpcHMgdG8gdGhlIHJlc291cmNlLgorCSAqIEBwYXJhbSBjb3ZlcmFnZXMgQ292ZXJhZ2Ugb2YgdGhlIHJlc291cmNlLgorCSAqIEBwYXJhbSByaWdodHMgUmlnaHRzIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAcGFyYW0gY29udGV4dHMgQ29udGV4dCBvZiB0aGUgcmVzb3VyY2UuCisJICogQHBhcmFtIGFnZ3JlZ2F0aW9uIEFnZ3JlZ2F0aW9uIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAcGFyYW0gY2xhenogQ2xhc3Mgb2YgdGhlIHJlc291cmNlLgorCSAqIEBwYXJhbSBsb2NhdGlvbnMgTG9jYXRpb24gb2YgdGhlIHJlc291cmNlLgorCSAqLworCXB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMoUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgaWRlbnRpZmllciwgU3RyaW5nIHRpdGxlLCBMaXN0IGZvcm1hdHMsIFN0cmluZyBkZXNjcmlwdGlvbiwKKwkJTGlzdCBjcmVhdG9ycywgTGlzdCBzdWJqZWN0cywgTGlzdCBwdWJsaXNoZXJzLCBMaXN0IGNvbnRyaWJ1dG9ycywgTGlzdCBkYXRlcywgTGlzdCB0eXBlcywgTGlzdCBzb3VyY2VzLAorCQlMaXN0IGxhbmd1YWdlcywgTGlzdCByZWxhdGlvbnMsIExpc3QgY292ZXJhZ2VzLCBMaXN0IHJpZ2h0cywgTGlzdCBjb250ZXh0cywgU3RyaW5nIGFnZ3JlZ2F0aW9uLCBTdHJpbmcgY2xhenosCisJCUxpc3QgbG9jYXRpb25zKSB7CisJCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7CisJCXRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisJCXRoaXMudGl0bGUgPSB0aXRsZTsKKwkJdGhpcy5mb3JtYXRzID0gZm9ybWF0czsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQl0aGlzLmNyZWF0b3JzID0gY3JlYXRvcnM7CisJCXRoaXMuc3ViamVjdHMgPSBzdWJqZWN0czsKKwkJdGhpcy5wdWJsaXNoZXJzID0gcHVibGlzaGVyczsKKwkJdGhpcy5jb250cmlidXRvcnMgPSBjb250cmlidXRvcnM7CisJCXRoaXMuZGF0ZXMgPSBkYXRlczsKKwkJdGhpcy50eXBlcyA9IHR5cGVzOworCQl0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOworCQl0aGlzLmxhbmd1YWdlcyA9IGxhbmd1YWdlczsKKwkJdGhpcy5yZWxhdGlvbnMgPSByZWxhdGlvbnM7CisJCXRoaXMuY292ZXJhZ2VzID0gY292ZXJhZ2VzOworCQl0aGlzLnJpZ2h0cyA9IHJpZ2h0czsKKwkJdGhpcy5jb250ZXh0cyA9IGNvbnRleHRzOworCQl0aGlzLmFnZ3JlZ2F0aW9uID0gYWdncmVnYXRpb247CisJCXRoaXMuY2xhenogPSBjbGF6ejsKKwkJdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnM7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGlkZW50aWZpZXIuaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgeworCQlpZiAocmhzID09IHRoaXMpIHJldHVybiB0cnVlOworCQlpZiAocmhzID09IG51bGwgfHwgIShyaHMgaW5zdGFuY2VvZiBSZXNvdXJjZUF0dHJpYnV0ZXMpKSByZXR1cm4gZmFsc2U7CisJCXJldHVybiAoKFJlc291cmNlQXR0cmlidXRlcykgcmhzKS5pZGVudGlmaWVyLmVxdWFscyhpZGVudGlmaWVyKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgcmhzKSB7CisJCVJlc291cmNlQXR0cmlidXRlcyBvYmogPSAoUmVzb3VyY2VBdHRyaWJ1dGVzKSByaHM7CisJCXJldHVybiBpZGVudGlmaWVyLmNvbXBhcmVUbyhvYmouaWRlbnRpZmllcik7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltpZGVudGlmZXI9IiArIGlkZW50aWZpZXIgKyAiXSI7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IGNsb25lID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNsb25lID0gc3VwZXIuY2xvbmUoKTsKKwkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJcmV0dXJuIGNsb25lOworCX0KKworCS8qKgorCSAqIEFkZCByZXNvdXJjZSBhdHRyaWJ1dGUgc3RhdGVtZW50cyB0byB0aGUgcHJvZmlsZSBkZXNjcmlwdGlvbiBpbiBhbiBSREYgbW9kZWwuCisJICoKKwkgKiBAcGFyYW0gbW9kZWwgTW9kZWwgdG8gd2hpY2ggdGhlIHByb2ZpbGUgYmVsb25ncy4KKwkgKiBAcGFyYW0gcmVzb3VyY2UgUmVzb3VyY2UgZGVzY3JpcHRpb24gb2YgdGhlIHByb2ZpbGUuCisJICogQHBhcmFtIHByb2ZBdHRyIFByb2ZpbGUncyBhdHRyaWJ1dGVzLgorCSAqLworCXZvaWQgYWRkVG9Nb2RlbChNb2RlbCBtb2RlbCwgUmVzb3VyY2UgcmVzb3VyY2UsIFByb2ZpbGVBdHRyaWJ1dGVzIHByb2ZBdHRyKSB7CisJCVVSSSBteVVSSSA9IGdldFVSSSgpOworCisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjVGl0bGUsICAgICAgICB0aXRsZSwgICAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjRm9ybWF0LCAgICAgICBmb3JtYXRzLCAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjRGVzY3JpcHRpb24sICBkZXNjcmlwdGlvbiwgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjQ3JlYXRvciwgICAgICBjcmVhdG9ycywgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjU3ViamVjdCwgICAgICBzdWJqZWN0cywgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjUHVibGlzaGVyLCAgICBwdWJsaXNoZXJzLCAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjQ29udHJpYnV0b3IsICBjb250cmlidXRvcnMsIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjRGF0ZSwgICAgICAgICBkYXRlcywgICAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjVHlwZSwgICAgICAgICB0eXBlcywgICAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjU291cmNlLCAgICAgICBzb3VyY2VzLCAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjTGFuZ3VhZ2UsICAgICBsYW5ndWFnZXMsICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjUmVsYXRpb24sICAgICByZWxhdGlvbnMsICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmRjUmlnaHRzLCAgICAgICByaWdodHMsICAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmVkbUNvbnRleHQsICAgICBjb250ZXh0cywgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmVkbUFnZ3JlZ2F0aW9uLCBhZ2dyZWdhdGlvbiwgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmVkbUNsYXNzLCAgICAgICBjbGF6eiwgICAgICAgIHByb2ZBdHRyLCBteVVSSSk7CisJCVV0aWxpdHkuYWRkUHJvcGVydHkobW9kZWwsIHJlc291cmNlLCBVdGlsaXR5LmVkbUxvY2F0aW9uLCAgICBsb2NhdGlvbnMsICAgIHByb2ZBdHRyLCBteVVSSSk7CisJfQorCisJcHVibGljIFVSSSBnZXRVUkkoKSB7CisJCVN0cmluZyBpZGVudGlmaWNhdGlvbjsKKwkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCB8fCBpZGVudGlmaWVyLmxlbmd0aCgpID09IDApIHsKKwkJCWlmIChsb2NhdGlvbnMuaXNFbXB0eSgpKQorCQkJCWlkZW50aWZpY2F0aW9uID0gbnVsbDsKKwkJCWVsc2UKKwkJCQlpZGVudGlmaWNhdGlvbiA9IChTdHJpbmcpIGxvY2F0aW9ucy5nZXQoMCk7CisJCX0gZWxzZQorCQkJaWRlbnRpZmljYXRpb24gPSBpZGVudGlmaWVyOworCisJCXJldHVybiBpZGVudGlmaWNhdGlvbiA9PSBudWxsPyBVTktOT1dOX1VSSSA6IFVSSS5jcmVhdGUoaWRlbnRpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgaWRlbnRpZmllci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGlkZW50aWZpZXIuCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gaWRlbnRpZmllcjsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGlkZW50aWZpZXIuCisJICoKKwkgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CisJCXRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogR2V0IHRoZSB0aXRsZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRpdGxlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisJCXJldHVybiB0aXRsZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIHRpdGxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgICAgICB9CisKKworCS8qKgorCSAqIEdldCB0aGUgZm9ybWF0cy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGZvcm1hdHMuCisJICovCisJcHVibGljIExpc3QgZ2V0Rm9ybWF0cygpIHsKKwkJcmV0dXJuIGZvcm1hdHM7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBkZXNjcmlwdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogR2V0IHRoZSBkZXNjcmlwdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGNyZWF0b3JzLgorCSAqCisJICogQHJldHVybiBUaGUgY3JlYXRvcnMuCisJICovCisJcHVibGljIExpc3QgZ2V0Q3JlYXRvcnMoKSB7CisJCXJldHVybiBjcmVhdG9yczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHN1YmplY3RzLgorCSAqCisJICogQHJldHVybiBUaGUgc3ViamVjdHMuCisJICovCisJcHVibGljIExpc3QgZ2V0U3ViamVjdHMoKSB7CisJCXJldHVybiBzdWJqZWN0czsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHB1Ymxpc2hlcnMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwdWJsaXNoZXJzLgorCSAqLworCXB1YmxpYyBMaXN0IGdldFB1Ymxpc2hlcnMoKSB7CisJCXJldHVybiBwdWJsaXNoZXJzOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgY29udHJpYnV0b3JzLgorCSAqCisJICogQHJldHVybiBUaGUgY29udHJpYnV0b3JzLgorCSAqLworCXB1YmxpYyBMaXN0IGdldENvbnRyaWJ1dG9ycygpIHsKKwkJcmV0dXJuIGNvbnRyaWJ1dG9yczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGRhdGVzLgorCSAqCisJICogQHJldHVybiBUaGUgZGF0ZXMuCisJICovCisJcHVibGljIExpc3QgZ2V0RGF0ZXMoKSB7CisJCXJldHVybiBkYXRlczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHR5cGVzLgorCSAqCisJICogQHJldHVybiBUaGUgdHlwZXMuCisJICovCisJcHVibGljIExpc3QgZ2V0VHlwZXMoKSB7CisJCXJldHVybiB0eXBlczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHNvdXJjZXMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzb3VyY2VzLgorCSAqLworCXB1YmxpYyBMaXN0IGdldFNvdXJjZXMoKSB7CisJCXJldHVybiBzb3VyY2VzOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgbGFuZ3VhZ2VzLgorCSAqCisJICogQHJldHVybiBUaGUgbGFuZ3VhZ2VzLgorCSAqLworCXB1YmxpYyBMaXN0IGdldExhbmd1YWdlcygpIHsKKwkJcmV0dXJuIGxhbmd1YWdlczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHJlbGF0aW9ucy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJlbGF0aW9ucy4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRSZWxhdGlvbnMoKSB7CisJCXJldHVybiByZWxhdGlvbnM7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBjb3ZlcmFnZXMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjb3ZlcmFnZXMuCisJICovCisJcHVibGljIExpc3QgZ2V0Q292ZXJhZ2VzKCkgeworCQlyZXR1cm4gY292ZXJhZ2VzOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcmlnaHRzLgorCSAqCisJICogQHJldHVybiBUaGUgcmlnaHRzLgorCSAqLworCXB1YmxpYyBMaXN0IGdldFJpZ2h0cygpIHsKKwkJcmV0dXJuIHJpZ2h0czsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGNvbnRleHRzLgorCSAqCisJICogQHJldHVybiBUaGUgY29udGV4dHMsIGEgbGlzdCBvZiB7QGxpbmsgU3RyaW5nfXMuCisJICovCisJcHVibGljIExpc3QgZ2V0UmVzQ29udGV4dHMoKSB7CisJCXJldHVybiBjb250ZXh0czsKKwl9CisKKworCS8qKgorCSAqIEdldCB0aGUgYWdncmVnYXRpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlc0FnZ3JlZ2F0aW9uKCkgeworCQlyZXR1cm4gYWdncmVnYXRpb247CisJfQorCisJLyoqCisJICogU2V0IHRoZSBhZ2dyZWdhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhZ2dyZWdhdGlvbiBUaGUgYWdncmVnYXRpb24uCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzQWdncmVnYXRpb24oU3RyaW5nIGFnZ3JlZ2F0aW9uKSB7CisJCXRoaXMuYWdncmVnYXRpb24gPSBhZ2dyZWdhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGNsYXNzLgorCSAqCisJICogQHJldHVybiBUaGUgY2xhc3MuCisJICovCisJcHVibGljIFN0cmluZyBnZXRSZXNDbGFzcygpIHsKKwkJcmV0dXJuIGNsYXp6OworCX0KKworCS8qKgorCSAqIFNldCB0aGUgY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc0NsYXNzKFN0cmluZyBjbGF6eikgeworCQl0aGlzLmNsYXp6ID0gY2xheno7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBsb2NhdGlvbnMuCisJICoKKwkgKiBAcmV0dXJuIExvY2F0aW9ucywgYSBsaXN0IG9mIHtAbGluayBTdHJpbmd9cy4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRSZXNMb2NhdGlvbnMoKSB7CisJCXJldHVybiBsb2NhdGlvbnM7CisJfQorCisKKwkvKioKKwkgKiBJbml0aWFsaXplIGFsbCB0aGUgdmFyaW91cyB7QGxpbmsgamF2YS51dGlsLkxpc3R9IGZpZWxkcy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGlzdHMoKSB7CisJCWZvcm1hdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWNyZWF0b3JzID0gbmV3IEFycmF5TGlzdCgpOworCQlzdWJqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcHVibGlzaGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY29udHJpYnV0b3JzID0gbmV3IEFycmF5TGlzdCgpOworCQlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWxhbmd1YWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmVsYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworCQljb3ZlcmFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJpZ2h0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisKKwkvKiogUHJvZmlsZSBJIGRlc2NyaWJlLiAqLworCXByb3RlY3RlZCBQcm9maWxlIHByb2ZpbGU7CisKKwkvKiogSWRlbnRpZmVyLiAqLworCXByb3RlY3RlZCBTdHJpbmcgaWRlbnRpZmllcjsKKworCS8qKiBUaXRsZXMuICovCisJcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKKworCS8qKiBGb3JtYXRzLiAqLworCXByb3RlY3RlZCBMaXN0IGZvcm1hdHM7CisKKwkvKiogRGVzY3JpcHRpb25zLiAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247CisKKwkvKiogQ3JlYXRvcnMuICovCisJcHJvdGVjdGVkIExpc3QgY3JlYXRvcnM7CisKKwkvKiogU3ViamVjdHMuICovCisJcHJvdGVjdGVkIExpc3Qgc3ViamVjdHM7CisKKwkvKiogUHVibGlzaGVycy4gKi8KKwlwcm90ZWN0ZWQgTGlzdCBwdWJsaXNoZXJzOworCisJLyoqIENvbnRyaWJ1dG9ycy4gKi8KKwlwcm90ZWN0ZWQgTGlzdCBjb250cmlidXRvcnM7CisKKwkvKiogRGF0ZXMuICovCisJcHJvdGVjdGVkIExpc3QgZGF0ZXM7CisKKwkvKiogVHlwZXMuICovCisJcHJvdGVjdGVkIExpc3QgdHlwZXM7CisKKwkvKiogU291cmNlcy4gKi8KKwlwcm90ZWN0ZWQgTGlzdCBzb3VyY2VzOworCisJLyoqIExhbmd1YWdlcy4gKi8KKwlwcm90ZWN0ZWQgTGlzdCBsYW5ndWFnZXM7CisKKwkvKiogUmVsYXRpb25zLiAqLworCXByb3RlY3RlZCBMaXN0IHJlbGF0aW9uczsKKworCS8qKiBDb3ZlcmFnZXMuICovCisJcHJvdGVjdGVkIExpc3QgY292ZXJhZ2VzOworCisJLyoqIFJpZ2h0cy4gKi8KKwlwcm90ZWN0ZWQgTGlzdCByaWdodHM7CisKKwkvKiogQ29udGV4dHMsIG9uZSBvciBtb3JlIGxpc3Qgb2Yge0BsaW5rIFN0cmluZ31zLiAqLworCXByb3RlY3RlZCBMaXN0IGNvbnRleHRzOworCisJLyoqIEFnZ3JlZ2F0aW9uLiAqLworCXByb3RlY3RlZCBTdHJpbmcgYWdncmVnYXRpb247CisKKwkvKiogQ2xhenouICovCisJcHJvdGVjdGVkIFN0cmluZyBjbGF6ejsKKworCS8qKiBMb2NhdGlvbnMsIHplcm8gb3IgbW9yZSB7QGxpbmsgU3RyaW5nfXMuICovCisJcHJvdGVjdGVkIExpc3QgbG9jYXRpb25zOworCisJLyoqCisJICogU2VyaWFsaXplIHRoaXMgYXR0cmlidXRlcyBhcyBhbiBYTUwgbm9kZS4KKwkgKgorCSAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRoYXQgd2lsbCBvd24gdGhpcyBub2RlLgorCSAqIEByZXR1cm4gVGhlIFhNTCBlbGVtZW50ICZsdDtyZXNBdHRyaWJ1dGVzJmd0OyByZXByZXNlbnRpbmcgdGhlc2UgYXR0cmlidXRlcy4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIFhNTCBub2Rlcy4KKwkgKi8KKwlwdWJsaWMgTm9kZSB0b1hNTChEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgicmVzQXR0cmlidXRlcyIpOworCQlYTUwuYWRkKHJvb3QsICJJZGVudGlmaWVyIiwgaWRlbnRpZmllcik7CisJCVhNTC5hZGROb25OdWxsKHJvb3QsICJUaXRsZSIsIHRpdGxlKTsKKwkJWE1MLmFkZChyb290LCAiRm9ybWF0IiwgZm9ybWF0cyk7CisJCVhNTC5hZGROb25OdWxsKHJvb3QsICJEZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJWE1MLmFkZChyb290LCAiQ3JlYXRvciIsIGNyZWF0b3JzKTsKKwkJWE1MLmFkZChyb290LCAiU3ViamVjdCIsIHN1YmplY3RzKTsKKwkJWE1MLmFkZChyb290LCAiUHVibGlzaGVyIiwgcHVibGlzaGVycyk7CisJCVhNTC5hZGQocm9vdCwgIkNvbnRyaWJ1dG9yIiwgY29udHJpYnV0b3JzKTsKKwkJWE1MLmFkZChyb290LCAiRGF0ZSIsIGRhdGVzKTsKKwkJWE1MLmFkZChyb290LCAiVHlwZSIsIHR5cGVzKTsKKwkJWE1MLmFkZChyb290LCAiU291cmNlIiwgc291cmNlcyk7CisJCVhNTC5hZGQocm9vdCwgIkxhbmd1YWdlIiwgbGFuZ3VhZ2VzKTsKKwkJWE1MLmFkZChyb290LCAiUmVsYXRpb24iLCByZWxhdGlvbnMpOworCQlYTUwuYWRkKHJvb3QsICJDb3ZlcmFnZSIsIGNvdmVyYWdlcyk7CisJCVhNTC5hZGQocm9vdCwgIlJpZ2h0cyIsIHJpZ2h0cyk7CisJCUxpc3QgY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KHRoaXMuY29udGV4dHMpOworCQlpZiAoY29udGV4dHMuaXNFbXB0eSgpKSBjb250ZXh0cy5hZGQoIlVOS05PV04iKTsKKwkJWE1MLmFkZChyb290LCAicmVzQ29udGV4dCIsIGNvbnRleHRzKTsKKwkJWE1MLmFkZE5vbk51bGwocm9vdCwgInJlc0FnZ3JlZ2F0aW9uIiwgYWdncmVnYXRpb24pOworCQlpZihjbGF6ej09bnVsbCkgY2xheno9IlVOS05PV04iOworCQlYTUwuYWRkTm9uTnVsbChyb290LCAicmVzQ2xhc3MiLCBjbGF6eik7CisJCVhNTC5hZGQocm9vdCwgInJlc0xvY2F0aW9uIiwgbG9jYXRpb25zKTsKKworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSAmbHQ7cmVzQXR0cmlidXRlcyZndDsgZG9jdW1lbnQgdXNpbmcgdGhlIHByb2ZpbGVzIERURC4KKwkgKgorCSAqIEByZXR1cm4gQSAmbHQ7cmVzQXR0cmlidXRzJmd0OyBkb2N1bWVudCB3aXRoIHRoZSBwcm9maWxlcyBEVEQuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVSZXNBdHRyaWJ1dGVzRG9jdW1lbnQoKSB7CisJCXJldHVybiBQcm9maWxlLmNyZWF0ZURvY3VtZW50KCJyZXNBdHRyaWJ1dGVzIik7CisJfQorCisJLyoqIFVSSSBvZiBhIHByb2ZpbGUgd2hvc2UgVVJJIGlzIHVua25vd24uICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFVOS05PV05fVVJJID0gVVJJLmNyZWF0ZSgidXJuOmVkYTpwcm9maWxlOlVOS05PV04iKTsKKworICAgICAgICAvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLworICAgICAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyNTE3NjM1NTk2MDc2NDI2MDdMOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTE4ODUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9VbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuTW9kZWw7CitpbXBvcnQgY29tLmhwLmhwbC5qZW5hLnJkZi5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKgorICogQSBwcm9maWxlIGVsZW1lbnQgd2l0aCB1bnNwZWNpZmllZCB2YWx1ZXMuCisKKyAqIFRoaXMgaXMgYSBwcm9maWxlIGVsZW1lbnQgdGhhdCBpcyBub3QgZW51bWVyYXRlZCAoaXQgZG9lc24ndCBoYXZlIGxpc3RlZCB2YWx1ZXMsIGFuZCBzbworICogPGNvZGU+Jmx0O2VsZW1FbnVtRmxhZyZndDs8L2NvZGU+IGlzIGZhbHNlKSwgbm9yIGRvZXMgaXQgaGF2ZSBtaW5pbXVtIG9yIG1heGltdW0KKyAqIHZhbHVlcy4gIEFzIHN1Y2gsIGl0IGFsd2F5cyBtYXRjaGVzIGFueSBxdWVyeSBpbiB3aGljaCBpdCdzIGludm9sdmVkIGluIGFuIGV4cHJlc3Npb24uCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudCBleHRlbmRzIFByb2ZpbGVFbGVtZW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgeworCS8qKgorCSAqIENyZWF0ZXMgYSBwcm9maWxlIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcHJvZmlsZSBhIDxjb2RlPlByb2ZpbGU8L2NvZGU+IHZhbHVlLgorCSAqLworCXB1YmxpYyBVbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSkgeworCQlzdXBlcihwcm9maWxlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIGVsZW1lbnQgZnJvbSBjb25zdGl0dWVudCBhdHRyaWJ1dGVzLgorCSAqCisJICogQHBhcmFtIHByb2ZpbGUgUHJvZmlsZSB0byB3aGljaCB0aGlzIGVsZW1lbnQgYmVsb25ncy4KKwkgKiBAcGFyYW0gbmFtZSBSZXF1aXJlZCBuYW1lIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgZWxlbWVudC4KKwkgKiBAcGFyYW0gZGVzYyBMb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LgorCSAqIEBwYXJhbSB0eXBlIERhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKwkgKiBAcGFyYW0gdW5pdCBVbml0cy4KKwkgKiBAcGFyYW0gc3lub255bXMgQ29sbGVjdGlvbiBvZiBlbGVtZW50IElEcyAoe0BsaW5rIFN0cmluZ30pIHRoYXQgYXJlIHN5bm9ueW1zIGZvciB0aGlzIGVsZW1lbnQuCisJICogQHBhcmFtIG9ibGlnYXRpb24gVHJ1ZSBpZiB0aGlzIGlzIGEgcmVxdWlyZWQgZWxlbWVudAorCSAqIEBwYXJhbSBtYXhPY2N1cnJlbmNlIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoaXMgZWxlbWVudC4KKwkgKiBAcGFyYW0gY29tbWVudCBBbnkgY29tbWVudHMgYWJvdXQgdGhpcyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBVbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsIFN0cmluZyB0eXBlLCBTdHJpbmcgdW5pdCwKKwkJTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnQpIHsKKwkJc3VwZXIocHJvZmlsZSwgbmFtZSwgaWQsIGRlc2MsIHR5cGUsIHVuaXQsIHN5bm9ueW1zLCBvYmxpZ2F0aW9uLCBtYXhPY2N1cnJlbmNlLCBjb21tZW50KTsKKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRWYWx1ZXMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWluVmFsdWUoKSB7CisJCXJldHVybiAiIjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1heFZhbHVlKCkgeworCQlyZXR1cm4gIiI7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVzKE5vZGUgbm9kZSkge30KKworCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRTcGVjaWZpY1Byb3BlcnRpZXMoTW9kZWwgbW9kZWwsIFJlc291cmNlIGVsZW1lbnQsIFByb2ZpbGVBdHRyaWJ1dGVzIHByb2ZBdHRyLCBVUkkgdXJpKSB7fQorCisgICAgICAgIC8qKiBTZXJpYWwgdmVyc2lvbiB1bmlxdWUgSUQuICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzcxNzU4Mjk2OTEyNTkyNzYyOUw7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9VdGlsaXR5LmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9VdGlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxZWI3YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1V0aWxpdHkuamF2YQpAQCAtMCwwICsxLDI0MCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisvLyBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKKy8vIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorLy8gdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisvLyB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisvLyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorLy8gdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ocC5ocGwuamVuYS5yZGYubW9kZWwuTW9kZWw7CitpbXBvcnQgY29tLmhwLmhwbC5qZW5hLnJkZi5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgY29tLmhwLmhwbC5qZW5hLnJkZi5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLlByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLkJhZzsKK2ltcG9ydCBjb20uaHAuaHBsLmplbmEucmRmLm1vZGVsLlNlcTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKgorICogUHJvZmlsZSB1dGlsaXRpZXMuCisgKgorICogVXRpbGl0eSBtZXRob2RzIGZvciBwcm9maWxlcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIFV0aWxpdHkgeworCS8qKgorCSAqIERvbid0IGNhbGwgYmVjYXVzZSB0aGlzIGlzIGEgdXRpbGl5IGNsYXNzLgorCSAqLworCXByaXZhdGUgVXRpbGl0eSgpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXRpbGl0eSBjbGFzcyIpOworCX0KKworCXN0YXRpYyB2b2lkIGFkZFByb3BlcnR5KE1vZGVsIG1vZGVsLCBSZXNvdXJjZSByZXNvdXJjZSwgUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCB2YWx1ZSwgUHJvZmlsZUF0dHJpYnV0ZXMgcHJvZkF0dHIsCisJCVVSSSB1cmkpIHsKKworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHJldHVybjsKKworCQlPYmplY3Qgb2JqOworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdmFsdWU7CisJCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHJldHVybjsKKwkJCUJhZyBiYWcgPSBtb2RlbC5jcmVhdGVCYWcodXJpICsgIl8iICsgcHJvcGVydHkuZ2V0TG9jYWxOYW1lKCkgKyAiX2JhZyIpOworCQkJZm9yIChJdGVyYXRvciBpID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCisJCQkJYmFnLmFkZChpLm5leHQoKSk7CisJCQlyZXNvdXJjZS5hZGRQcm9wZXJ0eShwcm9wZXJ0eSwgYmFnKTsKKwkJCW9iaiA9IGJhZzsKKwkJfSBlbHNlIHsKKwkJCXJlc291cmNlLmFkZFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZS50b1N0cmluZygpKTsKKwkJCW9iaiA9IHZhbHVlOworCQl9CisKKwkJUmVzb3VyY2UgcmVpZmljYXRpb24gPSBtb2RlbC5jcmVhdGVSZXNvdXJjZSh1cmkgKyAiXyIgKyBwcm9wZXJ0eS5nZXRMb2NhbE5hbWUoKSArICJfcmVpZmljYXRpb24iKTsKKworCQlyZWlmaWNhdGlvbi5hZGRQcm9wZXJ0eShyZGZTdWJqZWN0LCByZXNvdXJjZSk7CisJCXJlaWZpY2F0aW9uLmFkZFByb3BlcnR5KHJkZlByZWRpY2F0ZSwgcHJvcGVydHkpOworCQlyZWlmaWNhdGlvbi5hZGRQcm9wZXJ0eShyZGZPYmplY3QsIG9iai50b1N0cmluZygpKTsKKwkJcmVpZmljYXRpb24uYWRkUHJvcGVydHkocmRmVHlwZSwgcmRmU3RhdGVtZW50KTsKKworCQlhZGRQb3RlbnRpYWxseU51bGxSZWlmaWVkU3RhdGVtZW50KHJlaWZpY2F0aW9uLCBlZG1JRCwgcHJvZkF0dHIuZ2V0VmVyc2lvbigpKTsKKwkJYWRkUG90ZW50aWFsbHlOdWxsUmVpZmllZFN0YXRlbWVudChyZWlmaWNhdGlvbiwgZWRtVmVyc2lvbiwgcHJvZkF0dHIuZ2V0VmVyc2lvbigpKTsKKwkJYWRkUG90ZW50aWFsbHlOdWxsUmVpZmllZFN0YXRlbWVudChyZWlmaWNhdGlvbiwgZWRtVHlwZSwgcHJvZkF0dHIuZ2V0VHlwZSgpKTsKKwkJYWRkUG90ZW50aWFsbHlOdWxsUmVpZmllZFN0YXRlbWVudChyZWlmaWNhdGlvbiwgZWRtU3RhdHVzLCBwcm9mQXR0ci5nZXRTdGF0dXNJRCgpKTsKKwkJYWRkUG90ZW50aWFsbHlOdWxsUmVpZmllZFN0YXRlbWVudChyZWlmaWNhdGlvbiwgZWRtU2VjdXJpdHksIHByb2ZBdHRyLmdldFNlY3VyaXR5VHlwZSgpKTsKKwkJYWRkUG90ZW50aWFsbHlOdWxsUmVpZmllZFN0YXRlbWVudChyZWlmaWNhdGlvbiwgZWRtUGFyZW50LCBwcm9mQXR0ci5nZXRQYXJlbnQoKSk7CisJCWFkZFBvdGVudGlhbGx5TnVsbFJlaWZpZWRTdGF0ZW1lbnQocmVpZmljYXRpb24sIGVkbVJlZ0F1dGgsIHByb2ZBdHRyLmdldFJlZ0F1dGhvcml0eSgpKTsKKworCQlMaXN0IGNoaWxkcmVuID0gcHJvZkF0dHIuZ2V0Q2hpbGRyZW4oKTsKKwkJaWYgKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKKwkJCUJhZyBiYWcgPSBtb2RlbC5jcmVhdGVCYWcodXJpICsgIl8iICsgcHJvcGVydHkuZ2V0TG9jYWxOYW1lKCkgKyAiX2NoaWxkcmVuQmFnIik7CisJCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCisJCQkJYmFnLmFkZChpLm5leHQoKSk7CisJCQlyZWlmaWNhdGlvbi5hZGRQcm9wZXJ0eShlZG1DaGlsZCwgYmFnKTsKKwkJfQorCisJCUxpc3QgcmV2Tm90ZXMgPSBwcm9mQXR0ci5nZXRSZXZpc2lvbk5vdGVzKCk7CisJCWlmICghcmV2Tm90ZXMuaXNFbXB0eSgpKSB7CisJCQlTZXEgc2VxID0gbW9kZWwuY3JlYXRlU2VxKHVyaSArICJfIiArIHByb3BlcnR5LmdldExvY2FsTmFtZSgpICsgIl9yZXZOb3Rlc1NlcSIpOworCQkJZm9yIChJdGVyYXRvciBpID0gcmV2Tm90ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQorCQkJCXNlcS5hZGQoaS5uZXh0KCkpOworCQkJcmVpZmljYXRpb24uYWRkUHJvcGVydHkoZWRtUmV2Tm90ZSwgc2VxKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUG90ZW50aWFsbHlOdWxsUmVpZmllZFN0YXRlbWVudChSZXNvdXJjZSByZWlmaWNhdGlvbiwgUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHJldHVybjsKKwkJcmVpZmljYXRpb24uYWRkUHJvcGVydHkocHJvcGVydHksIHZhbHVlLnRvU3RyaW5nKCkpOworCX0KKworCisJLyoqIER1YmxpbiBjb3JlJ3MgdGl0bGUgKi8KKwlzdGF0aWMgUHJvcGVydHkgZGNUaXRsZTsKKwlzdGF0aWMgUHJvcGVydHkgZGNTdWJqZWN0OworCXN0YXRpYyBQcm9wZXJ0eSBkY0Rlc2NyaXB0aW9uOworCXN0YXRpYyBQcm9wZXJ0eSBkY1B1Ymxpc2hlcjsKKwlzdGF0aWMgUHJvcGVydHkgZGNDb250cmlidXRvcjsKKwlzdGF0aWMgUHJvcGVydHkgZGNDcmVhdG9yOworCXN0YXRpYyBQcm9wZXJ0eSBkY0RhdGU7CisJc3RhdGljIFByb3BlcnR5IGRjVHlwZTsKKwlzdGF0aWMgUHJvcGVydHkgZGNGb3JtYXQ7CisJc3RhdGljIFByb3BlcnR5IGRjU291cmNlOworCXN0YXRpYyBQcm9wZXJ0eSBkY0xhbmd1YWdlOworCXN0YXRpYyBQcm9wZXJ0eSBkY1JlbGF0aW9uOworCXN0YXRpYyBQcm9wZXJ0eSBkY0NvdmVyYWdlOworCXN0YXRpYyBQcm9wZXJ0eSBkY1JpZ2h0czsKKworCS8qKiBBIHJlc291cmNlIHRoYXQgaXMgYW4gUkRGIHN0YXRlbWVudC4gKi8KKwlzdGF0aWMgUmVzb3VyY2UgcmRmU3RhdGVtZW50OworCisJLyoqIEEgcHJvcGVydHkgdGhhdCBpcyBhbiBSREYgc3ViamVjdCBvZiBhIHN0YXRlbWVudC4gKi8KKwlzdGF0aWMgUHJvcGVydHkgcmRmU3ViamVjdDsKKworCS8qKiBBIHByb3BlcnR5IHRoYXQgaXMgYW4gUkRGIHByZWRpY2F0ZSBvZiBhIHN0YXRlbWVudC4gKi8KKwlzdGF0aWMgUHJvcGVydHkgcmRmUHJlZGljYXRlOworCisJLyoqIEEgcHJvcGVydHkgdGhhdCBpcyBhbiBvYmplY3Qgb2YgYSBzdGF0ZW1lbnQuICovCisJc3RhdGljIFByb3BlcnR5IHJkZk9iamVjdDsKKworCS8qKiBBIHByb3BlcnR5IHRoYXQgbmFtZXMgdGhlIHR5cGUgb2YgYW4gUkRGIHJlc291cmNlLiAqLworCXN0YXRpYyBQcm9wZXJ0eSByZGZUeXBlOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJERl9TWU5UQVhfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRENfTlMgPSAiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iOworCisJcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHkgZWRtSUQ7CisJcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHkgZWRtVmVyc2lvbjsKKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eSBlZG1UeXBlOworCXByaXZhdGUgc3RhdGljIFByb3BlcnR5IGVkbVN0YXR1czsKKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eSBlZG1TZWN1cml0eTsKKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eSBlZG1QYXJlbnQ7CisJcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHkgZWRtQ2hpbGQ7CisJcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHkgZWRtUmVnQXV0aDsKKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eSBlZG1SZXZOb3RlOworCisJc3RhdGljIFByb3BlcnR5IGVkbUVsZW1lbnQ7CisJc3RhdGljIFByb3BlcnR5IGVkbUNvbnRleHQ7CisJc3RhdGljIFByb3BlcnR5IGVkbUFnZ3JlZ2F0aW9uOworCXN0YXRpYyBQcm9wZXJ0eSBlZG1DbGFzczsKKwlzdGF0aWMgUHJvcGVydHkgZWRtTG9jYXRpb247CisJc3RhdGljIFByb3BlcnR5IGVkbUVsZW1JRDsKKwlzdGF0aWMgUHJvcGVydHkgZWRtRGVzY3JpcHRpb247CisJc3RhdGljIFByb3BlcnR5IGVkbUVsZW1UeXBlOworCXN0YXRpYyBQcm9wZXJ0eSBlZG1Vbml0OworCXN0YXRpYyBQcm9wZXJ0eSBlZG1TeW5vbnltOworCXN0YXRpYyBQcm9wZXJ0eSBlZG1PYmxpZ2F0aW9uOworCXN0YXRpYyBQcm9wZXJ0eSBlZG1NYXhPY2N1cnJlbmNlOworCXN0YXRpYyBQcm9wZXJ0eSBlZG1Db21tZW50OworCXN0YXRpYyBQcm9wZXJ0eSBlZG1NaW5WYWx1ZTsKKwlzdGF0aWMgUHJvcGVydHkgZWRtTWF4VmFsdWU7CisJc3RhdGljIFByb3BlcnR5IGVkbVZhbHVlOworCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGlzIGNsYXNzLgorCSAqLworCXN0YXRpYyB7CisJCXRyeSB7CisJCQlDb25maWd1cmF0aW9uIGNvbmZpZyA9IENvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbigpOworCQkJU3RyaW5nIHByb2ZOUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgianBsLnJkZi5ucyIsICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvZ3JpZC1wcm9maWxlL3JkZnMvcHJvZi5yZGYiKTsKKwkJCU1vZGVsIG1vZGVsID0gTW9kZWxGYWN0b3J5LmNyZWF0ZURlZmF1bHRNb2RlbCgpOworCisJCQlyZGZTdGF0ZW1lbnQgICAgID0gbW9kZWwuY3JlYXRlUmVzb3VyY2UoUkRGX1NZTlRBWF9OUyArICJTdGF0ZW1lbnQiKTsKKworCQkJcmRmU3ViamVjdCAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KFJERl9TWU5UQVhfTlMsICJzdWJqZWN0Iik7CisJCQlyZGZQcmVkaWNhdGUgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkoUkRGX1NZTlRBWF9OUywgInByZWRpY2F0ZSIpOworCQkJcmRmT2JqZWN0ICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KFJERl9TWU5UQVhfTlMsICJvYmplY3QiKTsKKwkJCXJkZlR5cGUgICAgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShSREZfU1lOVEFYX05TLCAidHlwZSIpOworCisJCQlkY1RpdGxlICAgICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkoRENfTlMsICJ0aXRsZSIpOworCQkJZGNDcmVhdG9yICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KERDX05TLCAiY3JlYXRvciIpOworCQkJZGNTdWJqZWN0ICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KERDX05TLCAic3ViamVjdCIpOworCQkJZGNEZXNjcmlwdGlvbiAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KERDX05TLCAiZGVzY3JpcHRpb24iKTsKKwkJCWRjUHVibGlzaGVyICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShEQ19OUywgInB1Ymxpc2hlciIpOworCQkJZGNDb250cmlidXRvciAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KERDX05TLCAiY29udHJpYnV0b3IiKTsKKwkJCWRjRGF0ZSAgICAgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShEQ19OUywgImRhdGUiKTsKKwkJCWRjVHlwZSAgICAgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShEQ19OUywgInR5cGUiKTsKKwkJCWRjRm9ybWF0ICAgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShEQ19OUywgImZvcm1hdCIpOworCQkJZGNTb3VyY2UgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KERDX05TLCAic291cmNlIik7CisJCQlkY0xhbmd1YWdlICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkoRENfTlMsICJsYW5ndWFnZSIpOworCQkJZGNSZWxhdGlvbiAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KERDX05TLCAicmVsYXRpb24iKTsKKwkJCWRjQ292ZXJhZ2UgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShEQ19OUywgImNvdmVyYWdlIik7CisJCQlkY1JpZ2h0cyAgICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkoRENfTlMsICJyaWdodHMiKTsKKworCQkJZWRtSUQgICAgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgImlkIik7CisJCQllZG1WZXJzaW9uICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAidmVyc2lvbiIpOworCQkJZWRtVHlwZSAgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgInR5cGUiKTsKKwkJCWVkbVN0YXR1cyAgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJzdGF0dXMiKTsKKwkJCWVkbVNlY3VyaXR5ICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJzZWN1cml0eSIpOworCQkJZWRtUGFyZW50ICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgInBhcmVudCIpOworCQkJZWRtQ2hpbGQgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgImNoaWxkIik7CisJCQllZG1SZWdBdXRoICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAicmVnQXV0aCIpOworCQkJZWRtUmV2Tm90ZSAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgInJldk5vdGUiKTsKKwkJCWVkbUVsZW1lbnQgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJlbGVtZW50Iik7CisJCQllZG1Db250ZXh0ICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAiY29udGV4dCIpOworCQkJZWRtQ2xhc3MgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgImNsYXNzIik7CisJCQllZG1BZ2dyZWdhdGlvbiAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAiYWdncmVnYXRpb24iKTsKKwkJCWVkbUxvY2F0aW9uICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJsb2NhdGlvbiIpOworCisJCQllZG1FbGVtSUQgICAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAiZWRtRWxlbUlEIik7CisJCQllZG1EZXNjcmlwdGlvbiAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAiZWRtRGVzY3JpcHRpb24iKTsKKwkJCWVkbUVsZW1UeXBlICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJlZG1FbGVtVHlwZSIpOworCQkJZWRtVW5pdCAgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgImVkbVVuaXQiKTsKKwkJCWVkbVN5bm9ueW0gICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJlZG1TeW5vbnltIik7CisJCQllZG1PYmxpZ2F0aW9uICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAiZWRtT2JsaWdhdGlvbiIpOworCQkJZWRtTWF4T2NjdXJyZW5jZSA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgImVkbU1heE9jY3VycmVuY2UiKTsKKwkJCWVkbUNvbW1lbnQgICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJlZG1Db21tZW50Iik7CisJCQllZG1NaW5WYWx1ZSAgICAgID0gbW9kZWwuY3JlYXRlUHJvcGVydHkocHJvZk5TLCAiZWRtTWluVmFsdWUiKTsKKwkJCWVkbU1heFZhbHVlICAgICAgPSBtb2RlbC5jcmVhdGVQcm9wZXJ0eShwcm9mTlMsICJlZG1NYXhWYWx1ZSIpOworCQkJZWRtVmFsdWUgICAgICAgICA9IG1vZGVsLmNyZWF0ZVByb3BlcnR5KHByb2ZOUywgImVkbVZhbHVlIik7CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRmF0YWwgSS9PIGVycm9yIHByZXZlbnRzIHJlYWRpbmcgb2YgY29uZmlndXJhdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRmF0YWwgZXJyb3IgcGFyc2luZyBmaWxlIChwdWJsaWMgSUQgXCIiICsgZXguZ2V0UHVibGljSWQoKSArICJcIiwgc3lzdGVtIElEIFwiIgorCQkJCSsgZXguZ2V0U3lzdGVtSWQoKSArICJcIiksIGxpbmUgIiArIGV4LmdldExpbmVOdW1iZXIoKSArICIgY29sdW1uICIgKyBleC5nZXRDb2x1bW5OdW1iZXIoKQorCQkJCSsgIjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZhdGFsIFNBWCBleGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkgKyAoZXguZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbD8gIiIKKwkJCQk6ICIgKGVtYmVkZGVkIGV4Y2VwdGlvbiAiICsgZXguZ2V0RXhjZXB0aW9uKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiCisJCQkJKyBleC5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgKyAiKSIpKTsKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvYWN0aXZpdHkvQ29ubmVjdGVkVG9TZXJ2ZXIuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2FjdGl2aXR5L0Nvbm5lY3RlZFRvU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwZmE2YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2FjdGl2aXR5L0Nvbm5lY3RlZFRvU2VydmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5hY3Rpdml0eTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkluY2lkZW50OworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGVkVG9TZXJ2ZXIgZXh0ZW5kcyBJbmNpZGVudCB7CisgICAvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElEICovCisgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTE1OTM2NzcxOTIxMzEzMjJMOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvYWN0aXZpdHkvUHJvZmlsZUNsaWVudENvbnN0cnVjdGVkLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9hY3Rpdml0eS9Qcm9maWxlQ2xpZW50Q29uc3RydWN0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmEwMGZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvYWN0aXZpdHkvUHJvZmlsZUNsaWVudENvbnN0cnVjdGVkLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5hY3Rpdml0eTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkluY2lkZW50OworCitwdWJsaWMgY2xhc3MgUHJvZmlsZUNsaWVudENvbnN0cnVjdGVkIGV4dGVuZHMgSW5jaWRlbnQgeworICAgLyoqIFNlcmlhbCB2ZXJzaW9uIHVuaXF1ZSBJRC4gKi8KKyAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MjI5MDI4NjQ5ODA4MjYyMzkyTDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2FjdGl2aXR5L1F1ZXJpZWRIYW5kbGVycy5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvYWN0aXZpdHkvUXVlcmllZEhhbmRsZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1NWExNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2FjdGl2aXR5L1F1ZXJpZWRIYW5kbGVycy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuYWN0aXZpdHk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5hY3Rpdml0eS5JbmNpZGVudDsKKworcHVibGljIGNsYXNzIFF1ZXJpZWRIYW5kbGVycyBleHRlbmRzIEluY2lkZW50IHsKKyAgIC8qKiBTZXJpYWwgdmVyc2lvbiB1bmlxdWUgSUQuICovCisgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM4NDU5NjMwMDQ2MDI5ODIyNjRMOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvYWN0aXZpdHkvUmVjZWl2ZWRRdWVyeS5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvYWN0aXZpdHkvUmVjZWl2ZWRRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmQ3MjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9hY3Rpdml0eS9SZWNlaXZlZFF1ZXJ5LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5hY3Rpdml0eTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmFjdGl2aXR5LkluY2lkZW50OworCitwdWJsaWMgY2xhc3MgUmVjZWl2ZWRRdWVyeSBleHRlbmRzIEluY2lkZW50IHsKKyAgIC8qKiBTZXJpYWwgdmVyc2lvbiB1bmlxdWUgSUQuICovCisgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzY0NjQwNjUyNTI2MDI0NjcxNEw7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvTGVhZkxpc3RlbmVyLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvTGVhZkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWJiNjY3MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9MZWFmTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuZ3VpOworCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVBhdGg7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUG9wdXBNZW51OworCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKKworCisKK3B1YmxpYyBjbGFzcyBMZWFmTGlzdGVuZXIgZXh0ZW5kcyBNb3VzZUFkYXB0ZXJ7CisJICBwcm9maWxlVHJlZSB0cmVlOworCSAgCisJICBwdWJsaWMgTGVhZkxpc3RlbmVyKHByb2ZpbGVUcmVlIGp0cil7CisKKwkgICAgdHJlZSA9IGp0cjsKKworCSAgfQorCisJICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE11bHRpVGVybShTdHJpbmcgdCl7CisJICAJaWYodD09bnVsbCl7cmV0dXJuIGZhbHNlO30KKwkgIAkKKwkgIAlpZih0LmVxdWFscygiQ2hpbGRyZW4iKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKwkgIAllbHNlIGlmKHQuZXF1YWxzKCJSZXZpc2lvbiBOb3RlcyIpKXsKKwkgIAkJcmV0dXJuIHRydWU7CisJICAJfQorCSAgCWVsc2UgaWYodC5lcXVhbHMoIkNvbnRleHRzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiQ29udHJpYnV0b3JzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiQ292ZXJhZ2VzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiQ3JlYXRvcnMiKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKwkgIAllbHNlIGlmKHQuZXF1YWxzKCJEYXRlcyIpKXsKKwkgIAkJcmV0dXJuIHRydWU7CisJICAJfQorCSAgCWVsc2UgaWYodC5lcXVhbHMoIkZvcm1hdHMiKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKwkgIAllbHNlIGlmKHQuZXF1YWxzKCJMYW5ndWFnZXMiKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKwkgIAllbHNlIGlmKHQuZXF1YWxzKCJSZXNvdXJjZSBMb2NhdGlvbnMiKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKwkgIAllbHNlIGlmKHQuZXF1YWxzKCJQdWJsaXNoZXJzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiUmVsYXRpb25zIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiUmlnaHRzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiU291cmNlcyIpKXsKKwkgIAkJcmV0dXJuIHRydWU7CisJICAJfQorCSAgCWVsc2UgaWYodC5lcXVhbHMoIlN1YmplY3RzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiVHlwZXMiKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKwkgIAllbHNlIGlmKHQuZXF1YWxzKCJQcm9maWxlIEVsZW1lbnRzIikpeworCSAgCQlyZXR1cm4gdHJ1ZTsKKwkgIAl9CisJICAJZWxzZSBpZih0LmVxdWFscygiU3lub255bXMiKSl7CisJICAJCXJldHVybiB0cnVlOworCSAgCX0KKworCSAgCXJldHVybiBmYWxzZTsKKwkgICAgCisJICB9CisJICAKKwkgIHB1YmxpYyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGdlbmVyYXRlTmV3UHJvZmlsZUVsZW1lbnRUcmVlKFN0cmluZyBwZU5hbWUpeworCSAgCSBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHBlUm9vdCA9IG51bGw7CisJICAJIAorCSAgCSBQcm9maWxlRWxlbWVudCB0aGVQcm9maWxlRWxlbWVudCA9IG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQobmV3IFByb2ZpbGUoKSk7CisgICAgICAgICAgCisJICAgIAkKKwkgICAgCXBlUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHBlTmFtZSk7CisJICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZUNvbW1lbnRzUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJDb21tZW50cyIpOworCSAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVDb21tZW50cyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHRoZVByb2ZpbGVFbGVtZW50LmdldENvbW1lbnRzKCkpOworCSAgICAJCisJICAgIAl0aGVDb21tZW50c1Jvb3QuYWRkKHRoZUNvbW1lbnRzKTsKKwkgICAgCQorCSAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVEZXNjID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlUHJvZmlsZUVsZW1lbnQuZ2V0RGVzY3JpcHRpb24oKSk7CisJICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZURlc2NSb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIkRlc2NyaXB0aW9uIik7CisJICAgIAkKKwkgICAgCXRoZURlc2NSb290LmFkZCh0aGVEZXNjKTsKKwkgICAgCQorCSAgICAJCisJICAgIAkKKwkgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlSUQgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVQcm9maWxlRWxlbWVudC5nZXRJRCgpKTsKKwkgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlSURSb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIklEIik7CisJICAgIAkKKwkgICAgCXRoZUlEUm9vdC5hZGQodGhlSUQpOworCSAgICAJCisJICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZU1PID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUobmV3IEludGVnZXIodGhlUHJvZmlsZUVsZW1lbnQuZ2V0TWF4T2NjdXJyZW5jZSgpKS50b1N0cmluZygpKTsKKwkgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlTU9Sb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIk1heCBPY2N1cmVuY2UiKTsKKwkgICAgCXRoZU1PUm9vdC5hZGQodGhlTU8pOworCSAgICAJCisJICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVN5bm9ueW1zID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlN5bm9ueW1zIik7CisJICAgIAkKKwkgICAgCWZvcihJdGVyYXRvciBpMiA9IHRoZVByb2ZpbGVFbGVtZW50LmdldFN5bm9ueW1zKCkuaXRlcmF0b3IoKTsgaTIuaGFzTmV4dCgpOyApeworCSAgICAJCVN0cmluZyB0aGVTeW5vbnltID0gKFN0cmluZylpMi5uZXh0KCk7CisJICAgIAkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBzTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHRoZVN5bm9ueW0pOworCSAgICAJCXRoZVN5bm9ueW1zLmFkZChzTm9kZSk7CisJICAgIAl9CisJCisJICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVR5cGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVQcm9maWxlRWxlbWVudC5nZXRUeXBlKCkpOworCSAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVUeXBlUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJUeXBlIik7CisJICAgIAl0aGVUeXBlUm9vdC5hZGQodGhlVHlwZSk7CisJICAgIAkKKwkgICAgCQorCSAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVVbml0ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlUHJvZmlsZUVsZW1lbnQuZ2V0VW5pdCgpKTsKKwkgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlVW5pdFJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiVW5pdCIpOworCSAgICAJdGhlVW5pdFJvb3QuYWRkKHRoZVVuaXQpOworICAgIAkKKyAgICAJcGVSb290LmFkZCh0aGVDb21tZW50c1Jvb3QpOworICAgIAlwZVJvb3QuYWRkKHRoZURlc2NSb290KTsKKyAgICAJcGVSb290LmFkZCh0aGVJRFJvb3QpOworICAgIAlwZVJvb3QuYWRkKHRoZU1PUm9vdCk7CisgICAgCXBlUm9vdC5hZGQodGhlU3lub255bXMpOworICAgIAlwZVJvb3QuYWRkKHRoZVR5cGVSb290KTsKKyAgICAJcGVSb290LmFkZCh0aGVVbml0Um9vdCk7CisgICAgCQorICAgIAkKKwkgIAkgcmV0dXJuIHBlUm9vdDsKKwkgIAkKKwkgIH0KKworCSAgcHJvdGVjdGVkIHZvaWQgbWVudUl0ZW0yQWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCxEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVRyZWVOb2RlLERlZmF1bHRUcmVlTW9kZWwgdGhlTW9kZWwpeworCSAgCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgY2hpbGQiKTsKKwkgIAkKKwkgIAkvL29ubHkgYWRkIGNoaWxkIGlmIGl0J3Mgb25lIG9mIHRoZSB0aGluZ3MgdGhhdCBzaG91bGQgaGF2ZSBjaGlsZHJlbgorCSAgCVN0cmluZyB0cmVlTm9kZU5hbWUgPSAoU3RyaW5nKXRoZVRyZWVOb2RlLmdldFVzZXJPYmplY3QoKTsKKwkgIAkKKwkgIAlpZihpc1ZhbGlkTXVsdGlUZXJtKHRyZWVOb2RlTmFtZSkpeworCSAgCQlyZXR1cm47IC8vb25seSBlZGl0IG5vbiBtdWx0aS10ZXJtIGZpZWxkcworCSAgCX0KKwkKKwkgIAkKKwkgIAlTdHJpbmcgbmV3Tm9kZU5hbWUgPSAoU3RyaW5nKUpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyhudWxsLCJFZGl0IiwiRW50ZXIgTmV3IE5vZGUgVmFsdWUiLCBKT3B0aW9uUGFuZS5QTEFJTl9NRVNTQUdFLG51bGwsbnVsbCwiTmV3IFZhbHVlIik7CisJICAJCisJICAJaWYobmV3Tm9kZU5hbWUgPT0gbnVsbCl7cmV0dXJuOyB9IC8vdGhleSBkaWRuJ3Qgc3BlY2lmeSBuYW1lIG9yIGhpdCBjYW5jZWwKKwkgIAl0aGVUcmVlTm9kZS5zZXRVc2VyT2JqZWN0KG5ld05vZGVOYW1lKTsKKwkgIAl0aGVNb2RlbC5yZWxvYWQoKTsKKwkgIH0KKwkgIAorCSAgCisJICBwcm90ZWN0ZWQgdm9pZCBtZW51SXRlbTFBY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0LERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlVHJlZU5vZGUsRGVmYXVsdFRyZWVNb2RlbCB0aGVNb2RlbCl7CisJICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBjaGlsZCIpOworCSAgCQorCSAgCS8vb25seSBhZGQgY2hpbGQgaWYgaXQncyBvbmUgb2YgdGhlIHRoaW5ncyB0aGF0IHNob3VsZCBoYXZlIGNoaWxkcmVuCisJICAJU3RyaW5nIHRyZWVOb2RlTmFtZSA9IChTdHJpbmcpdGhlVHJlZU5vZGUuZ2V0VXNlck9iamVjdCgpOworCSAgCQorCSAgCWlmKCFpc1ZhbGlkTXVsdGlUZXJtKHRyZWVOb2RlTmFtZSkpeworCSAgCQlyZXR1cm47CisJICAJfQorCQorCSAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlQWRkTm9kZSA9IG51bGw7CisJICAJU3RyaW5nIGNoaWxkTm9kZU5hbWUgPSAoU3RyaW5nKUpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyhudWxsLCJBZGQiLCJFbnRlciBOb2RlIE5hbWUiLCBKT3B0aW9uUGFuZS5QTEFJTl9NRVNTQUdFLG51bGwsbnVsbCwiQ2hpbGQgVmFsdWUiKTsKKwkgIAkKKwkgIAlpZihjaGlsZE5vZGVOYW1lID09IG51bGwpe3JldHVybjsgfSAvL3RoZXkgZGlkbid0IHNwZWNpZnkgbmFtZSBvciBoaXQgY2FuY2VsCisJICAJCisJICAJaWYodHJlZU5vZGVOYW1lLmVxdWFscygiUHJvZmlsZSBFbGVtZW50cyIpKXsKKwkgIAkJdGhlQWRkTm9kZSA9IGdlbmVyYXRlTmV3UHJvZmlsZUVsZW1lbnRUcmVlKGNoaWxkTm9kZU5hbWUpOworCSAgCX0KKwkgIAllbHNleworCSAgCQl0aGVBZGROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY2hpbGROb2RlTmFtZSk7CisJICAJfQorCSAgCQorCSAgCSAKKyAgICAgICAgICAgCQorCSAgCXRoZVRyZWVOb2RlLmFkZCh0aGVBZGROb2RlKTsKKwkgIAl0aGVNb2RlbC5yZWxvYWQoKTsKKwkgIH0KKwkgIAorCSAgCisJICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7CisKKwkgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiSW4gTW91c2UgUHJlc3NlZCBldmVudCAiKTsKKwkgICAgaW50IHNlbGVjdGVkUm93ID0gdHJlZS5nZXRSb3dGb3JMb2NhdGlvbihlLmdldFgoKSwgZS5nZXRZKCkpOworCSAgICBUcmVlUGF0aCBzZWxlY3RlZFBhdGggPSB0cmVlLmdldFBhdGhGb3JMb2NhdGlvbihlLmdldFgoKSwgZS5nZXRZKCkpOworCSAgICAKKwkgICAgaWYoc2VsZWN0ZWRSb3cgIT0gLTEpIHsKKwkgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0biAgICAgICAgICAgICAgIC8vZ2V0IGVuZCBvZiBjdXJyZW50IHBhdGgKKwkgICAgICAgID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpKHNlbGVjdGVkUGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpKTsKKwkgICAgICAvLyBpZiAodG4uaXNMZWFmKCkpeyAvL3dlIG5lZWQgbGVhZiBvbmx5CisJICAgICAgICAgLy93cml0ZSB5b3VyIHJlcXVpcmVkIHByb2Nlc3MgZm9yIHRuIGhlcmUKKwkgICAgICAgICAvL2ZvciBpbnN0YW5jZTogcG9wdXBNZW51LnNob3coIC4uLi4uICk7CisJICAgICAgICAgLy9iZWxvdyBpcyBhIGR1bW15IHByb2Nlc3MKKwkgICAgICAgICAvL1N0cmluZyBzdHIgPSAoU3RyaW5nKSh0bi5nZXRVc2VyT2JqZWN0KCkpOworCSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7CisJICAgICAgIAkKKwkgICAgICAgCUpNZW51SXRlbSBtZW51SXRlbTEgPSBuZXcgSk1lbnVJdGVtKCJBZGQiKTsKKwkgICAgICAgCUpNZW51SXRlbSBtZW51SXRlbTIgPSBuZXcgSk1lbnVJdGVtKCJFZGl0Iik7CisJICAgICAgIAkKKwkgICAgICAgCW1lbnVJdGVtMi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgVHJlZU5vZGVBY3Rpb25MaXN0ZW5lcih0bix0aGlzLChEZWZhdWx0VHJlZU1vZGVsKXRyZWUuZ2V0TW9kZWwoKSwiRURJVCIpKTsKKwkgICAgICAgCW1lbnVJdGVtMS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgVHJlZU5vZGVBY3Rpb25MaXN0ZW5lcih0bix0aGlzLChEZWZhdWx0VHJlZU1vZGVsKXRyZWUuZ2V0TW9kZWwoKSwiQUREIikpOyAgICAgICAJCisJICAgICAgIAlKUG9wdXBNZW51IHBvcHVwID0gbmV3IEpQb3B1cE1lbnUoKTsKKwkgICAgICAgCXBvcHVwLmFkZChtZW51SXRlbTEpOworCSAgICAgICAJcG9wdXAuYWRkKG1lbnVJdGVtMik7CisJICAgICAgIAkKKwkgICAgICAgCWlmKGUuaXNQb3B1cFRyaWdnZXIoKSl7CisJICAgICAgIAkJcG9wdXAuc2hvdyh0cmVlLGUuZ2V0WCgpLGUuZ2V0WSgpKTsKKwkgICAgICAgCX0KKwkgICAgICAgCWVsc2V7CisJICAgICAgIAkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIldhc24ndCBwb3B1cCB0cmlnZ2VyISIpOworCSAgICAgICAJfQorCisJICAgICAgIC8vfQorCSAgICB9CisJICB9CisJICAKKwkgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisKKwkgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiSW4gTW91c2UgUHJlc3NlZCBldmVudCAiKTsKKwkgICAgaW50IHNlbGVjdGVkUm93ID0gdHJlZS5nZXRSb3dGb3JMb2NhdGlvbihlLmdldFgoKSwgZS5nZXRZKCkpOworCSAgICBUcmVlUGF0aCBzZWxlY3RlZFBhdGggPSB0cmVlLmdldFBhdGhGb3JMb2NhdGlvbihlLmdldFgoKSwgZS5nZXRZKCkpOworCSAgICAKKwkgICAgaWYoc2VsZWN0ZWRSb3cgIT0gLTEpIHsKKwkgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0biAgICAgICAgICAgICAgIC8vZ2V0IGVuZCBvZiBjdXJyZW50IHBhdGgKKwkgICAgICAgID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpKHNlbGVjdGVkUGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpKTsKKwkgICAgICAvLyBpZiAodG4uaXNMZWFmKCkpeyAvL3dlIG5lZWQgbGVhZiBvbmx5CisJICAgICAgICAgLy93cml0ZSB5b3VyIHJlcXVpcmVkIHByb2Nlc3MgZm9yIHRuIGhlcmUKKwkgICAgICAgICAvL2ZvciBpbnN0YW5jZTogcG9wdXBNZW51LnNob3coIC4uLi4uICk7CisJICAgICAgICAgLy9iZWxvdyBpcyBhIGR1bW15IHByb2Nlc3MKKwkgICAgICAgICAvL1N0cmluZyBzdHIgPSAoU3RyaW5nKSh0bi5nZXRVc2VyT2JqZWN0KCkpOworCSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7CisJICAgICAgIAkKKwkgICAgICAgCQorCSAgICAgICAJSk1lbnVJdGVtIG1lbnVJdGVtMSA9IG5ldyBKTWVudUl0ZW0oIkFkZCIpOworCSAgICAgICAJSk1lbnVJdGVtIG1lbnVJdGVtMiA9IG5ldyBKTWVudUl0ZW0oIkVkaXQiKTsKKwkgICAgICAgCQorCSAgICAgICAJbWVudUl0ZW0yLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBUcmVlTm9kZUFjdGlvbkxpc3RlbmVyKHRuLHRoaXMsKERlZmF1bHRUcmVlTW9kZWwpdHJlZS5nZXRNb2RlbCgpLCJFRElUIikpOworCSAgICAgICAJbWVudUl0ZW0xLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBUcmVlTm9kZUFjdGlvbkxpc3RlbmVyKHRuLHRoaXMsKERlZmF1bHRUcmVlTW9kZWwpdHJlZS5nZXRNb2RlbCgpLCJBREQiKSk7ICAKKwkgICAgICAgCUpQb3B1cE1lbnUgcG9wdXAgPSBuZXcgSlBvcHVwTWVudSgpOworCSAgICAgICAJcG9wdXAuYWRkKG1lbnVJdGVtMSk7CisJICAgICAgIAlwb3B1cC5hZGQobWVudUl0ZW0yKTsKKwkgICAgICAgCQorCSAgICAgICAJaWYoZS5pc1BvcHVwVHJpZ2dlcigpKXsKKwkgICAgICAgCQlwb3B1cC5zaG93KHRyZWUsZS5nZXRYKCksZS5nZXRZKCkpOworCSAgICAgICAJfQorCSAgICAgICAJZWxzZXsKKwkgICAgICAgCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiV2Fzbid0IHBvcHVwIHRyaWdnZXIhIik7CisJICAgICAgIAl9CisKKwkgICAgICAgLy99CisJICAgIH0KKwkgIH0KKwkgIAorCSAgcHVibGljIGNsYXNzIFRyZWVOb2RlQWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lcnsKKwkgIAkgcHJpdmF0ZSBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG15VHJlZU5vZGUgPSBudWxsOworCSAgCSBwcml2YXRlIERlZmF1bHRUcmVlTW9kZWwgbXlUcmVlTW9kZWwgPSBudWxsOworCSAgCSBwcml2YXRlIExlYWZMaXN0ZW5lciB0aGVMZWFmTGlzdGVuZXI9bnVsbDsKKwkgIAkgcHJpdmF0ZSBTdHJpbmcgdHlwZT1udWxsOworCSAgCSAKKwkgIAkgIHB1YmxpYyBUcmVlTm9kZUFjdGlvbkxpc3RlbmVyKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdCxMZWFmTGlzdGVuZXIgbCxEZWZhdWx0VHJlZU1vZGVsIHRtLFN0cmluZyB0aGVUeXBlKXsKKwkgIAkgIAlteVRyZWVOb2RlID0gdDsKKwkgIAkgIAl0aGVMZWFmTGlzdGVuZXIgPSBsOworCSAgCSAgCW15VHJlZU1vZGVsID0gdG07CisJICAJICAJdHlwZSA9IHRoZVR5cGU7CisJICAJICB9CisJICAJICAKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0IGNsaWNrIik7CisJCQkJaWYodHlwZS5lcXVhbHMoIkFERCIpKXsKKwkJCQkJdGhlTGVhZkxpc3RlbmVyLm1lbnVJdGVtMUFjdGlvblBlcmZvcm1lZChldnQsbXlUcmVlTm9kZSxteVRyZWVNb2RlbCk7CQkJCQorCQkJCX0KKwkJCQllbHNlIGlmKHR5cGUuZXF1YWxzKCJFRElUIikpeworCQkJCQl0aGVMZWFmTGlzdGVuZXIubWVudUl0ZW0yQWN0aW9uUGVyZm9ybWVkKGV2dCxteVRyZWVOb2RlLG15VHJlZU1vZGVsKTsKKwkJCQl9CisJCQl9CisJICAJICAKKwkgIH0KKwkgIAorCX0KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9Qcm9maWxlQnVpbGRlckdVSS5mb3JtIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvZ3VpL1Byb2ZpbGVCdWlsZGVyR1VJLmZvcm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzBiOWZmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9Qcm9maWxlQnVpbGRlckdVSS5mb3JtCkBAIC0wLDAgKzEsNDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8Rm9ybSBzdHlsZT0iU3dpbmciIGlkZT0iZWNsaXBzZSIgYnVpbGRlcj0iamlnbG9vIiBsYWY9ImNvbS5zdW4uamF2YS5zd2luZy5wbGFmLndpbmRvd3MuV2luZG93c0xvb2tBbmRGZWVsIiB2ZXJzaW9uPSIyLjcuMiI+DQorPEV4dHJhQ29tcG9uZW50cz4NCisJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpNZW51QmFyIiBuYW1lPSJqTWVudUJhcjEiPg0KKwkJCTxDb25zdHJhaW50cz4NCisJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCTwvQ29uc3RyYWludHM+DQorCQkJPExheW91dCBjbGFzcz0iQm94Ij4NCisJCQkJPFByb3BlcnR5IG5hbWU9ImF4aXMiIHZhbHVlPSJudWxsIi8+DQorCQkJPC9MYXlvdXQ+DQorCQkJPEV2ZW50cz4NCisJCQk8L0V2ZW50cz4NCisJCQk8UHJvcGVydGllcz4NCisJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCTxSZWN0YW5nbGUgdmFsdWU9IlswLCAwLCA2NzUsIDIxXSIvPg0KKwkJCQk8L1Byb3BlcnR5Pg0KKwkJCTwvUHJvcGVydGllcz4NCisJCQk8U3ViQ29tcG9uZW50cz4NCisJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSk1lbnUiIG5hbWU9ImpNZW51MyI+DQorCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJPC9Db25zdHJhaW50cz4NCisJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJPEV2ZW50cz4NCisJCQkJCTwvRXZlbnRzPg0KKwkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9IlN0cmluZyIgdmFsdWU9IkZpbGUiLz4NCisJCQkJCQk8UHJvcGVydHkgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCTxTdWJDb21wb25lbnRzPg0KKwkJCQkJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpNZW51SXRlbSIgbmFtZT0ibmV3RmlsZU1lbnVJdGVtIj4NCisJCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQkJCQk8TGF5b3V0IGNsYXNzPSJBYnNvbHV0ZSI+DQorCQkJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJCQk8RXZlbnRzPg0KKwkJCQkJCQkJPEV2ZW50SGFuZGxlciBldmVudD0iYWN0aW9uUGVyZm9ybWVkIiBsaXN0ZW5lcj0iamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIiIGhhbmRsZXI9Im5ld0ZpbGVNZW51SXRlbUFjdGlvblBlcmZvcm1lZCIvPg0KKwkJCQkJCQk8L0V2ZW50cz4NCisJCQkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0iTmV3IFByb2ZpbGUiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InByZWZlcnJlZFNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCQkJCQkJPERpbWVuc2lvbiB2YWx1ZT0iWzI4LCAxNl0iLz4NCisJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iYm91bmRzIiB0eXBlPSJSZWN0YW5nbGUiPg0KKwkJCQkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9Ils1LCA1LCAyOCwgMTZdIi8+DQorCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQk8L1Byb3BlcnRpZXM+DQorCQkJCQkJPC9Db21wb25lbnQ+DQorCQkJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSk1lbnVJdGVtIiBuYW1lPSJvcGVuRmlsZU1lbnVJdGVtIj4NCisJCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQkJCQk8TGF5b3V0IGNsYXNzPSJBYnNvbHV0ZSI+DQorCQkJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJCQk8RXZlbnRzPg0KKwkJCQkJCQkJPEV2ZW50SGFuZGxlciBldmVudD0iYWN0aW9uUGVyZm9ybWVkIiBsaXN0ZW5lcj0iamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIiIGhhbmRsZXI9Im9wZW5GaWxlTWVudUl0ZW1BY3Rpb25QZXJmb3JtZWQiLz4NCisJCQkJCQkJPC9FdmVudHM+DQorCQkJCQkJCTxQcm9wZXJ0aWVzPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9IlN0cmluZyIgdmFsdWU9Ik9wZW4gUHJvZmlsZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InZpc2libGUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iYm91bmRzIiB0eXBlPSJSZWN0YW5nbGUiPg0KKwkJCQkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9Ils1LCA1LCA2MCwgMzBdIi8+DQorCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQk8L1Byb3BlcnRpZXM+DQorCQkJCQkJPC9Db21wb25lbnQ+DQorCQkJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSk1lbnVJdGVtIiBuYW1lPSJzYXZlTWVudUl0ZW0iPg0KKwkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQk8TGF5b3V0Q29uc3RyYWludC8+DQorCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCQkJPC9MYXlvdXQ+DQorCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCQk8RXZlbnRIYW5kbGVyIGV2ZW50PSJhY3Rpb25QZXJmb3JtZWQiIGxpc3RlbmVyPSJqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lciIgaGFuZGxlcj0ic2F2ZU1lbnVJdGVtQWN0aW9uUGVyZm9ybWVkIi8+DQorCQkJCQkJCTwvRXZlbnRzPg0KKwkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJTYXZlIFByb2ZpbGUiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InZlcmlmeUlucHV0V2hlbkZvY3VzVGFyZ2V0IiB0eXBlPSJib29sZWFuIiB2YWx1ZT0iZmFsc2UiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCQkJCQkJPFJlY3RhbmdsZSB2YWx1ZT0iWzUsIDUsIDYwLCAzMF0iLz4NCisJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCQk8L0NvbXBvbmVudD4NCisJCQkJCQk8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTWVudUl0ZW0iIG5hbWU9ImNsb3NlRmlsZU1lbnVJdGVtIj4NCisJCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQkJCQk8TGF5b3V0IGNsYXNzPSJBYnNvbHV0ZSI+DQorCQkJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJCQk8RXZlbnRzPg0KKwkJCQkJCQk8L0V2ZW50cz4NCisJCQkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0iQ2xvc2UiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCQkJCQk8UmVjdGFuZ2xlIHZhbHVlPSJbNSwgNSwgNjAsIDMwXSIvPg0KKwkJCQkJCQkJPC9Qcm9wZXJ0eT4NCisJCQkJCQkJPC9Qcm9wZXJ0aWVzPg0KKwkJCQkJCTwvQ29tcG9uZW50Pg0KKwkJCQkJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpTZXBhcmF0b3IiIG5hbWU9ImpTZXBhcmF0b3IyIj4NCisJCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQkJCQk8TGF5b3V0IGNsYXNzPSJBYnNvbHV0ZSI+DQorCQkJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJCQk8RXZlbnRzPg0KKwkJCQkJCQk8L0V2ZW50cz4NCisJCQkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCQkJCQkJPFJlY3RhbmdsZSB2YWx1ZT0iWzUsIDUsIDYwLCAzMF0iLz4NCisJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCQk8L0NvbXBvbmVudD4NCisJCQkJCQk8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTWVudUl0ZW0iIG5hbWU9ImV4aXRNZW51SXRlbSI+DQorCQkJCQkJCTxDb25zdHJhaW50cz4NCisJCQkJCQkJCTxMYXlvdXRDb25zdHJhaW50Lz4NCisJCQkJCQkJPC9Db25zdHJhaW50cz4NCisJCQkJCQkJPExheW91dCBjbGFzcz0iQWJzb2x1dGUiPg0KKwkJCQkJCQk8L0xheW91dD4NCisJCQkJCQkJPEV2ZW50cz4NCisJCQkJCQkJCTxFdmVudEhhbmRsZXIgZXZlbnQ9ImFjdGlvblBlcmZvcm1lZCIgbGlzdGVuZXI9ImphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyIiBoYW5kbGVyPSJleGl0TWVudUl0ZW1BY3Rpb25QZXJmb3JtZWQiLz4NCisJCQkJCQkJPC9FdmVudHM+DQorCQkJCQkJCTxQcm9wZXJ0aWVzPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9IlN0cmluZyIgdmFsdWU9IkV4aXQiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCQkJCQk8UmVjdGFuZ2xlIHZhbHVlPSJbNSwgNSwgNjAsIDMwXSIvPg0KKwkJCQkJCQkJPC9Qcm9wZXJ0eT4NCisJCQkJCQkJPC9Qcm9wZXJ0aWVzPg0KKwkJCQkJCTwvQ29tcG9uZW50Pg0KKwkJCQkJPC9TdWJDb21wb25lbnRzPg0KKwkJCQk8L0NvbXBvbmVudD4NCisJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSk1lbnUiIG5hbWU9ImpNZW51NCI+DQorCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJPC9Db25zdHJhaW50cz4NCisJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJPEV2ZW50cz4NCisJCQkJCTwvRXZlbnRzPg0KKwkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9IlN0cmluZyIgdmFsdWU9IkVkaXQiLz4NCisJCQkJCQk8UHJvcGVydHkgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCTxTdWJDb21wb25lbnRzPg0KKwkJCQkJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpNZW51SXRlbSIgbmFtZT0iY3V0TWVudUl0ZW0iPg0KKwkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQk8TGF5b3V0Q29uc3RyYWludC8+DQorCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCQkJPC9MYXlvdXQ+DQorCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCTwvRXZlbnRzPg0KKwkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJDdXQiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InByZWZlcnJlZFNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCQkJCQkJPERpbWVuc2lvbiB2YWx1ZT0iWzI3LCAxNl0iLz4NCisJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iYm91bmRzIiB0eXBlPSJSZWN0YW5nbGUiPg0KKwkJCQkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9Ils1LCA1LCAyNywgMTZdIi8+DQorCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQk8L1Byb3BlcnRpZXM+DQorCQkJCQkJPC9Db21wb25lbnQ+DQorCQkJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSk1lbnVJdGVtIiBuYW1lPSJjb3B5TWVudUl0ZW0iPg0KKwkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQk8TGF5b3V0Q29uc3RyYWludC8+DQorCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCQkJPC9MYXlvdXQ+DQorCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCTwvRXZlbnRzPg0KKwkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJDb3B5Ii8+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCQkJCQkJPFJlY3RhbmdsZSB2YWx1ZT0iWzUsIDUsIDYwLCAzMF0iLz4NCisJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCQk8L0NvbXBvbmVudD4NCisJCQkJCQk8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTWVudUl0ZW0iIG5hbWU9InBhc3RlTWVudUl0ZW0iPg0KKwkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQk8TGF5b3V0Q29uc3RyYWludC8+DQorCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCQkJPC9MYXlvdXQ+DQorCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCTwvRXZlbnRzPg0KKwkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJQYXN0ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InZpc2libGUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iYm91bmRzIiB0eXBlPSJSZWN0YW5nbGUiPg0KKwkJCQkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9Ils1LCA1LCA2MCwgMzBdIi8+DQorCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQk8L1Byb3BlcnRpZXM+DQorCQkJCQkJPC9Db21wb25lbnQ+DQorCQkJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSlNlcGFyYXRvciIgbmFtZT0ialNlcGFyYXRvcjEiPg0KKwkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQk8TGF5b3V0Q29uc3RyYWludC8+DQorCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCQkJPC9MYXlvdXQ+DQorCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCTwvRXZlbnRzPg0KKwkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCQkJCQk8UmVjdGFuZ2xlIHZhbHVlPSJbNSwgNSwgNjAsIDMwXSIvPg0KKwkJCQkJCQkJPC9Qcm9wZXJ0eT4NCisJCQkJCQkJPC9Qcm9wZXJ0aWVzPg0KKwkJCQkJCTwvQ29tcG9uZW50Pg0KKwkJCQkJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpNZW51SXRlbSIgbmFtZT0iZGVsZXRlTWVudUl0ZW0iPg0KKwkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQk8TGF5b3V0Q29uc3RyYWludC8+DQorCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCQkJPC9MYXlvdXQ+DQorCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCTwvRXZlbnRzPg0KKwkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJEZWxldGUiLz4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCQkJCQk8UmVjdGFuZ2xlIHZhbHVlPSJbNSwgNSwgNjAsIDMwXSIvPg0KKwkJCQkJCQkJPC9Qcm9wZXJ0eT4NCisJCQkJCQkJPC9Qcm9wZXJ0aWVzPg0KKwkJCQkJCTwvQ29tcG9uZW50Pg0KKwkJCQkJPC9TdWJDb21wb25lbnRzPg0KKwkJCQk8L0NvbXBvbmVudD4NCisJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSk1lbnUiIG5hbWU9ImpNZW51NSI+DQorCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJPC9Db25zdHJhaW50cz4NCisJCQkJCTxMYXlvdXQgY2xhc3M9IkFic29sdXRlIj4NCisJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJPEV2ZW50cz4NCisJCQkJCTwvRXZlbnRzPg0KKwkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9IlN0cmluZyIgdmFsdWU9IkhlbHAiLz4NCisJCQkJCQk8UHJvcGVydHkgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCTxTdWJDb21wb25lbnRzPg0KKwkJCQkJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpNZW51SXRlbSIgbmFtZT0iaGVscE1lbnVJdGVtIj4NCisJCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQkJCQk8TGF5b3V0IGNsYXNzPSJBYnNvbHV0ZSI+DQorCQkJCQkJCTwvTGF5b3V0Pg0KKwkJCQkJCQk8RXZlbnRzPg0KKwkJCQkJCQk8L0V2ZW50cz4NCisJCQkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0iSGVscCIvPg0KKwkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InZpc2libGUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0icHJlZmVycmVkU2l6ZSIgdHlwZT0iRGltZW5zaW9uIj4NCisJCQkJCQkJCQk8RGltZW5zaW9uIHZhbHVlPSJbMzEsIDE2XSIvPg0KKwkJCQkJCQkJPC9Qcm9wZXJ0eT4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCQkJCQkJPFJlY3RhbmdsZSB2YWx1ZT0iWzUsIDUsIDMxLCAxNl0iLz4NCisJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCQk8L0NvbXBvbmVudD4NCisJCQkJCTwvU3ViQ29tcG9uZW50cz4NCisJCQkJPC9Db21wb25lbnQ+DQorCQkJPC9TdWJDb21wb25lbnRzPg0KKwkJPC9Db21wb25lbnQ+PC9FeHRyYUNvbXBvbmVudHM+DQorPE5vblZpc3VhbENvbXBvbmVudHM+DQorCQk8Q29tcG9uZW50IGNsYXNzPSJqYXZhLmxhbmcuT2JqZWN0IiBuYW1lPSJvYmplY3QxIj4NCisJCQk8Q29uc3RyYWludHM+DQorCQkJCTxMYXlvdXRDb25zdHJhaW50Lz4NCisJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCTxQcm9wZXJ0aWVzPg0KKwkJCTwvUHJvcGVydGllcz4NCisJCTwvQ29tcG9uZW50PjwvTm9uVmlzdWFsQ29tcG9uZW50cz4NCisJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSkZyYW1lIiBuYW1lPSJQcm9maWxlQnVpbGRlckdVSSI+DQorCQk8Q29uc3RyYWludHM+DQorCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJPC9Db25zdHJhaW50cz4NCisJCTxMYXlvdXQgY2xhc3M9IkJvcmRlciI+DQorCQkJPFByb3BlcnR5IG5hbWU9ImhnYXAiIHR5cGU9ImludCIgdmFsdWU9IjAiLz4NCisJCQk8UHJvcGVydHkgbmFtZT0idmdhcCIgdHlwZT0iaW50IiB2YWx1ZT0iMCIvPg0KKwkJPC9MYXlvdXQ+DQorCQk8RXZlbnRzPg0KKwkJPC9FdmVudHM+DQorCQk8UHJvcGVydGllcz4NCisJCQk8UHJvcGVydHkgbmFtZT0idGl0bGUiIHR5cGU9IlN0cmluZyIgdmFsdWU9Ik9PRFQgUHJvZmlsZSBCdWlsZGVyIi8+DQorCQkJPFByb3BlcnR5IG5hbWU9InNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCTxEaW1lbnNpb24gdmFsdWU9Ils2NzUsIDM2MF0iLz4NCisJCQk8L1Byb3BlcnR5Pg0KKwkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCTxSZWN0YW5nbGUgdmFsdWU9IlswLCAwLCA2NzUsIDM2MF0iLz4NCisJCQk8L1Byb3BlcnR5Pg0KKwkJPC9Qcm9wZXJ0aWVzPg0KKwkJPFN1YkNvbXBvbmVudHM+DQorCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSlBhbmVsIiBuYW1lPSJqUGFuZWwxIj4NCisJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJPENvbnN0cmFpbnQgZGlyZWN0aW9uPSJDZW50ZXIiLz4NCisJCQkJCTxMYXlvdXRDb25zdHJhaW50Pg0KKwkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9IlN0cmluZyIgdmFsdWU9IkNlbnRlciIvPg0KKwkJCQkJPC9MYXlvdXRDb25zdHJhaW50Pg0KKwkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQk8TGF5b3V0IGNsYXNzPSJCb3JkZXIiPg0KKwkJCQkJPFByb3BlcnR5IG5hbWU9ImhnYXAiIHR5cGU9ImludCIgdmFsdWU9IjAiLz4NCisJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ2Z2FwIiB0eXBlPSJpbnQiIHZhbHVlPSIwIi8+DQorCQkJCTwvTGF5b3V0Pg0KKwkJCQk8RXZlbnRzPg0KKwkJCQk8L0V2ZW50cz4NCisJCQkJPFByb3BlcnRpZXM+DQorCQkJCQk8UHJvcGVydHkgbmFtZT0iYm91bmRzIiB0eXBlPSJSZWN0YW5nbGUiPg0KKwkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9IlswLCAwLCA2NzUsIDMxNl0iLz4NCisJCQkJCTwvUHJvcGVydHk+DQorCQkJCTwvUHJvcGVydGllcz4NCisJCQkJPFN1YkNvbXBvbmVudHM+DQorCQkJCQk8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KU2Nyb2xsUGFuZSIgbmFtZT0ialBhbmVsMiI+DQorCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQk8Q29uc3RyYWludCBkaXJlY3Rpb249Ildlc3QiLz4NCisJCQkJCQkJPExheW91dENvbnN0cmFpbnQ+DQorCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJTdHJpbmciIHZhbHVlPSJXZXN0Ii8+DQorCQkJCQkJCTwvTGF5b3V0Q29uc3RyYWludD4NCisJCQkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQkJCTxFdmVudHM+DQorCQkJCQkJPC9FdmVudHM+DQorCQkJCQkJPFByb3BlcnRpZXM+DQorCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJwcmVmZXJyZWRTaXplIiB0eXBlPSJEaW1lbnNpb24iPg0KKwkJCQkJCQkJPERpbWVuc2lvbiB2YWx1ZT0iWzIzMSwgMzM5XSIvPg0KKwkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQk8UHJvcGVydHkgbmFtZT0iYXV0b3Njcm9sbHMiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCQkJCQk8UmVjdGFuZ2xlIHZhbHVlPSJbMCwgMCwgMjMxLCAzMTZdIi8+DQorCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJPC9Qcm9wZXJ0aWVzPg0KKwkJCQkJCTxTdWJDb21wb25lbnRzPg0KKwkJCQkJCQk8Q29tcG9uZW50IGNsYXNzPSJqcGwuZWRhLnByb2ZpbGUuZ3VpLnByb2ZpbGVUcmVlIiBuYW1lPSJqVHJlZTEiPg0KKwkJCQkJCQkJPENvbnN0cmFpbnRzPg0KKwkJCQkJCQkJCTxMYXlvdXRDb25zdHJhaW50Lz4NCisJCQkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJCQk8RXZlbnRzPg0KKwkJCQkJCQkJPC9FdmVudHM+DQorCQkJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iZWRpdGFibGUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InByZWZlcnJlZFNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCQkJCQkJCTxEaW1lbnNpb24gdmFsdWU9Ils0MjYsIDgwMF0iLz4NCisJCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJhdXRvc2Nyb2xscyIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0ibWF4aW11bVNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCQkJCQkJCTxEaW1lbnNpb24gdmFsdWU9Ils0MjYsIDgwMF0iLz4NCisJCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJvcGFxdWUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCQkJPFByb3BlcnR5IG5hbWU9InNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCQkJCQkJCTxEaW1lbnNpb24gdmFsdWU9Ils0MjYsIDgwMF0iLz4NCisJCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJib3VuZHMiIHR5cGU9IlJlY3RhbmdsZSI+DQorCQkJCQkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9IlswLCAwLCA0MjYsIDgwMF0iLz4NCisJCQkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCQkJPC9Qcm9wZXJ0aWVzPg0KKwkJCQkJCQk8L0NvbXBvbmVudD4NCisJCQkJCQk8L1N1YkNvbXBvbmVudHM+DQorCQkJCQk8L0NvbXBvbmVudD4NCisJCQkJCTxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpTY3JvbGxQYW5lIiBuYW1lPSJqUGFuZWwzIj4NCisJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCTxDb25zdHJhaW50IGRpcmVjdGlvbj0iRWFzdCIvPg0KKwkJCQkJCQk8TGF5b3V0Q29uc3RyYWludD4NCisJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9IlN0cmluZyIgdmFsdWU9IkVhc3QiLz4NCisJCQkJCQkJPC9MYXlvdXRDb25zdHJhaW50Pg0KKwkJCQkJCTwvQ29uc3RyYWludHM+DQorCQkJCQkJPEV2ZW50cz4NCisJCQkJCQk8L0V2ZW50cz4NCisJCQkJCQk8UHJvcGVydGllcz4NCisJCQkJCQkJPFByb3BlcnR5IG5hbWU9InByZWZlcnJlZFNpemUiIHR5cGU9IkRpbWVuc2lvbiI+DQorCQkJCQkJCQk8RGltZW5zaW9uIHZhbHVlPSJbNDQ0LCAzMzldIi8+DQorCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJhdXRvc2Nyb2xscyIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4NCisJCQkJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCQkJCTxSZWN0YW5nbGUgdmFsdWU9IlsyMzEsIDAsIDQ0NCwgMzE2XSIvPg0KKwkJCQkJCQk8L1Byb3BlcnR5Pg0KKwkJCQkJCTwvUHJvcGVydGllcz4NCisJCQkJCQk8U3ViQ29tcG9uZW50cz4NCisJCQkJCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSkVkaXRvclBhbmUiIG5hbWU9ImpFZGl0b3JQYW5lMSI+DQorCQkJCQkJCQk8Q29uc3RyYWludHM+DQorCQkJCQkJCQkJPExheW91dENvbnN0cmFpbnQvPg0KKwkJCQkJCQkJPC9Db25zdHJhaW50cz4NCisJCQkJCQkJCTxFdmVudHM+DQorCQkJCQkJCQk8L0V2ZW50cz4NCisJCQkJCQkJCTxQcm9wZXJ0aWVzPg0KKwkJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSIiLz4NCisJCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iZWRpdGFibGUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJmYWxzZSIvPg0KKwkJCQkJCQkJCTxQcm9wZXJ0eSBuYW1lPSJwcmVmZXJyZWRTaXplIiB0eXBlPSJEaW1lbnNpb24iPg0KKwkJCQkJCQkJCQk8RGltZW5zaW9uIHZhbHVlPSJbNDE0LCAzMjBdIi8+DQorCQkJCQkJCQkJPC9Qcm9wZXJ0eT4NCisJCQkJCQkJCQk8UHJvcGVydHkgbmFtZT0iYXV0b3Njcm9sbHMiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+DQorCQkJCQkJCQkJPFByb3BlcnR5IG5hbWU9ImJvdW5kcyIgdHlwZT0iUmVjdGFuZ2xlIj4NCisJCQkJCQkJCQkJPFJlY3RhbmdsZSB2YWx1ZT0iWzAsIDAsIDQ0MiwgMzE0XSIvPg0KKwkJCQkJCQkJCTwvUHJvcGVydHk+DQorCQkJCQkJCQk8L1Byb3BlcnRpZXM+DQorCQkJCQkJCTwvQ29tcG9uZW50Pg0KKwkJCQkJCTwvU3ViQ29tcG9uZW50cz4NCisJCQkJCTwvQ29tcG9uZW50Pg0KKwkJCQk8L1N1YkNvbXBvbmVudHM+DQorCQkJPC9Db21wb25lbnQ+DQorCQkJPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSkJ1dHRvbiIgbmFtZT0iakJ1dHRvbjEiPg0KKwkJCQk8Q29uc3RyYWludHM+DQorCQkJCQk8Q29uc3RyYWludCBkaXJlY3Rpb249IlNvdXRoIi8+DQorCQkJCQk8TGF5b3V0Q29uc3RyYWludD4NCisJCQkJCQk8UHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJTdHJpbmciIHZhbHVlPSJTb3V0aCIvPg0KKwkJCQkJPC9MYXlvdXRDb25zdHJhaW50Pg0KKwkJCQk8L0NvbnN0cmFpbnRzPg0KKwkJCQk8RXZlbnRzPg0KKwkJCQkJPEV2ZW50SGFuZGxlciBldmVudD0iYWN0aW9uUGVyZm9ybWVkIiBsaXN0ZW5lcj0iamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIiIGhhbmRsZXI9ImpCdXR0b24xQWN0aW9uUGVyZm9ybWVkIi8+DQorCQkJCTwvRXZlbnRzPg0KKwkJCQk8UHJvcGVydGllcz4NCisJCQkJCTxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJTdHJpbmciIHZhbHVlPSJTaG93IFhNTCIvPg0KKwkJCQk8L1Byb3BlcnRpZXM+DQorCQkJPC9Db21wb25lbnQ+DQorCQk8L1N1YkNvbXBvbmVudHM+DQorCTwvQ29tcG9uZW50Pg0KKzwvRm9ybT4NCmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvUHJvZmlsZUJ1aWxkZXJHVUkuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9Qcm9maWxlQnVpbGRlckdVSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1ZmQwMmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvUHJvZmlsZUJ1aWxkZXJHVUkuamF2YQpAQCAtMCwwICsxLDk5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuZ3VpOworCitpbXBvcnQgamF2YXguc3dpbmcuSlNlcGFyYXRvcjsKK2ltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnU7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVCYXI7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpFZGl0b3JQYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5SYW5nZWRQcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5ndWkucHJvZmlsZVRyZWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5ndWkucHN0cnVjdHMuUHJvZmlsZVByaW50ZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisqIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIHVzaW5nIENsb3VkR2FyZGVuJ3MgSmlnbG9vCisqIFNXVC9Td2luZyBHVUkgQnVpbGRlciwgd2hpY2ggaXMgZnJlZSBmb3Igbm9uLWNvbW1lcmNpYWwKKyogdXNlLiBJZiBKaWdsb28gaXMgYmVpbmcgdXNlZCBjb21tZXJjaWFsbHkgKGllLCBieSBhCisqIGZvci1wcm9maXQgY29tcGFueSBvciBidXNpbmVzcykgdGhlbiB5b3Ugc2hvdWxkIHB1cmNoYXNlCisqIGEgbGljZW5zZSAtIHBsZWFzZSB2aXNpdCB3d3cuY2xvdWRnYXJkZW4uY29tIGZvciBkZXRhaWxzLgorKi8KK3B1YmxpYyBjbGFzcyBQcm9maWxlQnVpbGRlckdVSSBleHRlbmRzIGphdmF4LnN3aW5nLkpGcmFtZSB7CisJcHJpdmF0ZSBKQnV0dG9uIGpCdXR0b24xOworCXByaXZhdGUgSkVkaXRvclBhbmUgakVkaXRvclBhbmUxOworCXByaXZhdGUgSlNjcm9sbFBhbmUgalBhbmVsMzsKKwlwcml2YXRlIHByb2ZpbGVUcmVlIGpUcmVlMTsKKwlwcml2YXRlIEpTY3JvbGxQYW5lIGpQYW5lbDI7CisJcHJpdmF0ZSBKUGFuZWwgalBhbmVsMTsKKwlwcml2YXRlIEpNZW51SXRlbSBoZWxwTWVudUl0ZW07CisJcHJpdmF0ZSBKTWVudSBqTWVudTU7CisJcHJpdmF0ZSBKTWVudUl0ZW0gZGVsZXRlTWVudUl0ZW07CisJcHJpdmF0ZSBKU2VwYXJhdG9yIGpTZXBhcmF0b3IxOworCXByaXZhdGUgSk1lbnVJdGVtIHBhc3RlTWVudUl0ZW07CisJcHJpdmF0ZSBKTWVudUl0ZW0gY29weU1lbnVJdGVtOworCXByaXZhdGUgSk1lbnVJdGVtIGN1dE1lbnVJdGVtOworCXByaXZhdGUgSk1lbnUgak1lbnU0OworCXByaXZhdGUgSk1lbnVJdGVtIGV4aXRNZW51SXRlbTsKKwlwcml2YXRlIEpTZXBhcmF0b3IgalNlcGFyYXRvcjI7CisJcHJpdmF0ZSBKTWVudUl0ZW0gY2xvc2VGaWxlTWVudUl0ZW07CisJcHJpdmF0ZSBKTWVudUl0ZW0gc2F2ZU1lbnVJdGVtOworCXByaXZhdGUgSk1lbnVJdGVtIG9wZW5GaWxlTWVudUl0ZW07CisJcHJpdmF0ZSBKTWVudUl0ZW0gbmV3RmlsZU1lbnVJdGVtOworCXByaXZhdGUgSk1lbnUgak1lbnUzOworCXByaXZhdGUgSk1lbnVCYXIgak1lbnVCYXIxOworCQorCXByaXZhdGUgUHJvZmlsZSBjcmVhdGVkUHJvZmlsZT1udWxsOworCQorCisJcHVibGljIFByb2ZpbGVCdWlsZGVyR1VJKCkgeworCQlpbml0R1VJKCk7CisJfQorCisJLyoqCisJKiBJbml0aWFsaXplcyB0aGUgR1VJLgorCSogQXV0by1nZW5lcmF0ZWQgY29kZSAtIGFueSBjaGFuZ2VzIHlvdSBtYWtlIHdpbGwgZGlzYXBwZWFyLgorCSovCisJcHVibGljIHZvaWQgaW5pdEdVSSgpeworCQl0cnkgeworCQkJcHJlSW5pdEdVSSgpOworCQorCQkJdHJ5IHsKKwkJCQlqYXZheC5zd2luZy5VSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoImNvbS5zdW4uamF2YS5zd2luZy5wbGFmLndpbmRvd3MuV2luZG93c0xvb2tBbmRGZWVsIik7CisJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCWpQYW5lbDEgPSBuZXcgSlBhbmVsKCk7CisJCQlqUGFuZWwyID0gbmV3IEpTY3JvbGxQYW5lKCk7CisJCQlqVHJlZTEgPSBuZXcgcHJvZmlsZVRyZWUoKTsKKwkJCWpQYW5lbDMgPSBuZXcgSlNjcm9sbFBhbmUoKTsKKwkJCWpFZGl0b3JQYW5lMSA9IG5ldyBKRWRpdG9yUGFuZSgpOworCQkJakJ1dHRvbjEgPSBuZXcgSkJ1dHRvbigpOworCQorCQkJQm9yZGVyTGF5b3V0IHRoaXNMYXlvdXQgPSBuZXcgQm9yZGVyTGF5b3V0KCk7CisJCQl0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KHRoaXNMYXlvdXQpOworCQkJdGhpc0xheW91dC5zZXRIZ2FwKDApOworCQkJdGhpc0xheW91dC5zZXRWZ2FwKDApOworCQkJdGhpcy5zZXRUaXRsZSgiT09EVCBQcm9maWxlIEJ1aWxkZXIiKTsKKwkJCXRoaXMuc2V0U2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDY4MiwzODcpKTsKKwkKKwkJCUJvcmRlckxheW91dCBqUGFuZWwxTGF5b3V0ID0gbmV3IEJvcmRlckxheW91dCgpOworCQkJalBhbmVsMS5zZXRMYXlvdXQoalBhbmVsMUxheW91dCk7CisJCQlqUGFuZWwxTGF5b3V0LnNldEhnYXAoMCk7CisJCQlqUGFuZWwxTGF5b3V0LnNldFZnYXAoMCk7CisJCQl0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKGpQYW5lbDEsIEJvcmRlckxheW91dC5DRU5URVIpOworCQorCQkJalBhbmVsMi5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oMjMxLDMzOSkpOworCQkJalBhbmVsMi5zZXRBdXRvc2Nyb2xscyh0cnVlKTsKKwkJCWpQYW5lbDEuYWRkKGpQYW5lbDIsIEJvcmRlckxheW91dC5XRVNUKTsKKwkKKwkJCWpUcmVlMS5zZXRFZGl0YWJsZSh0cnVlKTsKKwkJCWpUcmVlMS5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNDI2LDgwMCkpOworCQkJalRyZWUxLnNldEF1dG9zY3JvbGxzKHRydWUpOworCQkJalRyZWUxLnNldE1heGltdW1TaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNDI2LDgwMCkpOworCQkJalRyZWUxLnNldE9wYXF1ZSh0cnVlKTsKKwkJCWpUcmVlMS5zZXRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNDI2LDgwMCkpOworCQkJalBhbmVsMi5hZGQoalRyZWUxKTsKKwkJCWpQYW5lbDIuc2V0Vmlld3BvcnRWaWV3KGpUcmVlMSk7CisJCisJCQlqUGFuZWwzLnNldFByZWZlcnJlZFNpemUobmV3IGphdmEuYXd0LkRpbWVuc2lvbig0NDQsMzM5KSk7CisJCQlqUGFuZWwzLnNldEF1dG9zY3JvbGxzKHRydWUpOworCQkJalBhbmVsMS5hZGQoalBhbmVsMywgQm9yZGVyTGF5b3V0LkVBU1QpOworCQorCQkJakVkaXRvclBhbmUxLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCWpFZGl0b3JQYW5lMS5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNDE0LDMyMCkpOworCQkJakVkaXRvclBhbmUxLnNldEF1dG9zY3JvbGxzKHRydWUpOworCQkJalBhbmVsMy5hZGQoakVkaXRvclBhbmUxKTsKKwkJCWpQYW5lbDMuc2V0Vmlld3BvcnRWaWV3KGpFZGl0b3JQYW5lMSk7CisJCisJCQlqQnV0dG9uMS5zZXRUZXh0KCJTaG93IFhNTCIpOworCQkJdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChqQnV0dG9uMSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJCWpCdXR0b24xLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkgeworCQkJCQlqQnV0dG9uMUFjdGlvblBlcmZvcm1lZChldnQpOworCQkJCX0KKwkJCX0pOworCQkJak1lbnVCYXIxID0gbmV3IEpNZW51QmFyKCk7CisJCQlqTWVudTMgPSBuZXcgSk1lbnUoKTsKKwkJCW5ld0ZpbGVNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCW9wZW5GaWxlTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQlzYXZlTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQljbG9zZUZpbGVNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCWpTZXBhcmF0b3IyID0gbmV3IEpTZXBhcmF0b3IoKTsKKwkJCWV4aXRNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCWpNZW51NCA9IG5ldyBKTWVudSgpOworCQkJY3V0TWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQljb3B5TWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQlwYXN0ZU1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgpOworCQkJalNlcGFyYXRvcjEgPSBuZXcgSlNlcGFyYXRvcigpOworCQkJZGVsZXRlTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQlqTWVudTUgPSBuZXcgSk1lbnUoKTsKKwkJCWhlbHBNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkKKwkJCXNldEpNZW51QmFyKGpNZW51QmFyMSk7CisJCisJCQlqTWVudTMuc2V0VGV4dCgiRmlsZSIpOworCQkJak1lbnUzLnNldFZpc2libGUodHJ1ZSk7CisJCQlqTWVudUJhcjEuYWRkKGpNZW51Myk7CisJCisJCQluZXdGaWxlTWVudUl0ZW0uc2V0VGV4dCgiTmV3IFByb2ZpbGUiKTsKKwkJCW5ld0ZpbGVNZW51SXRlbS5zZXRWaXNpYmxlKHRydWUpOworCQkJbmV3RmlsZU1lbnVJdGVtLnNldFByZWZlcnJlZFNpemUobmV3IGphdmEuYXd0LkRpbWVuc2lvbigyOCwxNikpOworCQkJbmV3RmlsZU1lbnVJdGVtLnNldEJvdW5kcyhuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNSwyOCwxNikpOworCQkJak1lbnUzLmFkZChuZXdGaWxlTWVudUl0ZW0pOworCQkJbmV3RmlsZU1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkgeworCQkJCQluZXdGaWxlTWVudUl0ZW1BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKwkJCQl9CisJCQl9KTsKKwkKKwkJCW9wZW5GaWxlTWVudUl0ZW0uc2V0VGV4dCgiT3BlbiBQcm9maWxlIik7CisJCQlvcGVuRmlsZU1lbnVJdGVtLnNldFZpc2libGUodHJ1ZSk7CisJCQlvcGVuRmlsZU1lbnVJdGVtLnNldEJvdW5kcyhuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNSw2MCwzMCkpOworCQkJak1lbnUzLmFkZChvcGVuRmlsZU1lbnVJdGVtKTsKKwkJCW9wZW5GaWxlTWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KSB7CisJCQkJCW9wZW5GaWxlTWVudUl0ZW1BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKwkJCQl9CisJCQl9KTsKKwkKKwkJCXNhdmVNZW51SXRlbS5zZXRUZXh0KCJTYXZlIFByb2ZpbGUiKTsKKwkJCXNhdmVNZW51SXRlbS5zZXRWaXNpYmxlKHRydWUpOworCQkJc2F2ZU1lbnVJdGVtLnNldFZlcmlmeUlucHV0V2hlbkZvY3VzVGFyZ2V0KGZhbHNlKTsKKwkJCXNhdmVNZW51SXRlbS5zZXRCb3VuZHMobmV3IGphdmEuYXd0LlJlY3RhbmdsZSg1LDUsNjAsMzApKTsKKwkJCWpNZW51My5hZGQoc2F2ZU1lbnVJdGVtKTsKKwkJCXNhdmVNZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lciggbmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpIHsKKwkJCQkJc2F2ZU1lbnVJdGVtQWN0aW9uUGVyZm9ybWVkKGV2dCk7CisJCQkJfQorCQkJfSk7CisJCisJCQljbG9zZUZpbGVNZW51SXRlbS5zZXRUZXh0KCJDbG9zZSIpOworCQkJY2xvc2VGaWxlTWVudUl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKKwkJCWNsb3NlRmlsZU1lbnVJdGVtLnNldEJvdW5kcyhuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNSw2MCwzMCkpOworCQkJak1lbnUzLmFkZChjbG9zZUZpbGVNZW51SXRlbSk7CisJCisJCQlqU2VwYXJhdG9yMi5zZXRWaXNpYmxlKHRydWUpOworCQkJalNlcGFyYXRvcjIuc2V0Qm91bmRzKG5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoNSw1LDYwLDMwKSk7CisJCQlqTWVudTMuYWRkKGpTZXBhcmF0b3IyKTsKKwkKKwkJCWV4aXRNZW51SXRlbS5zZXRUZXh0KCJFeGl0Iik7CisJCQlleGl0TWVudUl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKKwkJCWV4aXRNZW51SXRlbS5zZXRCb3VuZHMobmV3IGphdmEuYXd0LlJlY3RhbmdsZSg1LDUsNjAsMzApKTsKKwkJCWpNZW51My5hZGQoZXhpdE1lbnVJdGVtKTsKKwkJCWV4aXRNZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lciggbmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpIHsKKwkJCQkJZXhpdE1lbnVJdGVtQWN0aW9uUGVyZm9ybWVkKGV2dCk7CisJCQkJfQorCQkJfSk7CisJCisJCQlqTWVudTQuc2V0VGV4dCgiRWRpdCIpOworCQkJak1lbnU0LnNldFZpc2libGUodHJ1ZSk7CisJCQlqTWVudUJhcjEuYWRkKGpNZW51NCk7CisJCisJCQljdXRNZW51SXRlbS5zZXRUZXh0KCJDdXQiKTsKKwkJCWN1dE1lbnVJdGVtLnNldFZpc2libGUodHJ1ZSk7CisJCQljdXRNZW51SXRlbS5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oMjcsMTYpKTsKKwkJCWN1dE1lbnVJdGVtLnNldEJvdW5kcyhuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNSwyNywxNikpOworCQkJak1lbnU0LmFkZChjdXRNZW51SXRlbSk7CisJCisJCQljb3B5TWVudUl0ZW0uc2V0VGV4dCgiQ29weSIpOworCQkJY29weU1lbnVJdGVtLnNldFZpc2libGUodHJ1ZSk7CisJCQljb3B5TWVudUl0ZW0uc2V0Qm91bmRzKG5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoNSw1LDYwLDMwKSk7CisJCQlqTWVudTQuYWRkKGNvcHlNZW51SXRlbSk7CisJCisJCQlwYXN0ZU1lbnVJdGVtLnNldFRleHQoIlBhc3RlIik7CisJCQlwYXN0ZU1lbnVJdGVtLnNldFZpc2libGUodHJ1ZSk7CisJCQlwYXN0ZU1lbnVJdGVtLnNldEJvdW5kcyhuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNSw2MCwzMCkpOworCQkJak1lbnU0LmFkZChwYXN0ZU1lbnVJdGVtKTsKKwkKKwkJCWpTZXBhcmF0b3IxLnNldFZpc2libGUodHJ1ZSk7CisJCQlqU2VwYXJhdG9yMS5zZXRCb3VuZHMobmV3IGphdmEuYXd0LlJlY3RhbmdsZSg1LDUsNjAsMzApKTsKKwkJCWpNZW51NC5hZGQoalNlcGFyYXRvcjEpOworCQorCQkJZGVsZXRlTWVudUl0ZW0uc2V0VGV4dCgiRGVsZXRlIik7CisJCQlkZWxldGVNZW51SXRlbS5zZXRWaXNpYmxlKHRydWUpOworCQkJZGVsZXRlTWVudUl0ZW0uc2V0Qm91bmRzKG5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoNSw1LDYwLDMwKSk7CisJCQlqTWVudTQuYWRkKGRlbGV0ZU1lbnVJdGVtKTsKKwkKKwkJCWpNZW51NS5zZXRUZXh0KCJIZWxwIik7CisJCQlqTWVudTUuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCWpNZW51QmFyMS5hZGQoak1lbnU1KTsKKwkKKwkJCWhlbHBNZW51SXRlbS5zZXRUZXh0KCJIZWxwIik7CisJCQloZWxwTWVudUl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKKwkJCWhlbHBNZW51SXRlbS5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oMzEsMTYpKTsKKwkJCWhlbHBNZW51SXRlbS5zZXRCb3VuZHMobmV3IGphdmEuYXd0LlJlY3RhbmdsZSg1LDUsMzEsMTYpKTsKKwkJCWpNZW51NS5hZGQoaGVscE1lbnVJdGVtKTsKKwkKKwkJCXBvc3RJbml0R1VJKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCS8qKiBBZGQgeW91ciBwcmUtaW5pdCBjb2RlIGluIGhlcmUgCSovCisJcHVibGljIHZvaWQgcHJlSW5pdEdVSSgpeworCX0KKworCS8qKiBBZGQgeW91ciBwb3N0LWluaXQgY29kZSBpbiBoZXJlIAkqLworCXB1YmxpYyB2b2lkIHBvc3RJbml0R1VJKCl7CisJfQorCisJLyoqIEF1dG8tZ2VuZXJhdGVkIG1haW4gbWV0aG9kICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CisJCS8vc2hvd0dVSSgpOworCQlzaG93TWFpbkdVSSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93TWFpbkdVSSgpeworCQl0cnkgeworCQkJUHJvZmlsZUJ1aWxkZXJHVUkgaW5zdCA9IG5ldyBQcm9maWxlQnVpbGRlckdVSSgpOworCQkJaW5zdC5zZXRWaXNpYmxlKHRydWUpOworCQkJaW5zdC5nZXRKVHJlZTEoKS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBMZWFmTGlzdGVuZXIoaW5zdC5nZXRKVHJlZTEoKSkpOworCQkgICAgaW5zdC5nZXRKVHJlZTEoKS5zZXRFeHBhbmRzU2VsZWN0ZWRQYXRocyh0cnVlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKworCisJCisJCisJCisJLyoqCisJKiBUaGlzIHN0YXRpYyBtZXRob2QgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCBzaG93cworCSogaXQgaW5zaWRlIGEgbmV3IEpGcmFtZSwgKHVubGVzcyBpdCBpcyBhbHJlYWR5IGEgSkZyYW1lKS4KKwkqCisJKiBJdCBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2hvd2luZyB0aGUgR1VJLCBidXQgaXQgY2FuIGJlCisJKiBjb3BpZWQgYW5kIHVzZWQgYXMgYSBiYXNpcyBmb3IgeW91ciBvd24gY29kZS4JKgorCSogSXQgaXMgYXV0by1nZW5lcmF0ZWQgY29kZSAtIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUKKwkqIHJlLWdlbmVyYXRlZCBhZnRlciBhbnkgY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgR1VJLgorCSogSG93ZXZlciwgaWYgeW91IGRlbGV0ZSB0aGlzIG1ldGhvZCBpdCB3aWxsIG5vdCBiZSByZS1jcmVhdGVkLgkqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93R1VJKCl7CisJCXRyeSB7CisJCQlQcm9maWxlQnVpbGRlckdVSSBpbnN0ID0gbmV3IFByb2ZpbGVCdWlsZGVyR1VJKCk7CisJCQlpbnN0LnNldFZpc2libGUodHJ1ZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorLyoqCisqIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZAorKi9wdWJsaWMgSlBhbmVsIGdldEpQYW5lbDEoKXsKK3JldHVybiBqUGFuZWwxOwl9CisvKioKKyogQXV0by1nZW5lcmF0ZWQgbWV0aG9kCisqL3B1YmxpYyBKU2Nyb2xsUGFuZSBnZXRKUGFuZWwyKCl7CityZXR1cm4galBhbmVsMjsJfQorLyoqCisqIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZAorKi9wdWJsaWMgcHJvZmlsZVRyZWUgZ2V0SlRyZWUxKCl7CityZXR1cm4galRyZWUxOwl9CisKK3B1YmxpYyB2b2lkIHNldEpUcmVlMShwcm9maWxlVHJlZSBqdCl7CisJalRyZWUxID0ganQ7CisJcmVwYWludCgpOworfQorLyoqCisqIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZAorKi9wdWJsaWMgSlNjcm9sbFBhbmUgZ2V0SlBhbmVsMygpeworcmV0dXJuIGpQYW5lbDM7CX0KKy8qKgorKiBBdXRvLWdlbmVyYXRlZCBtZXRob2QKKyovcHVibGljIEpFZGl0b3JQYW5lIGdldEpFZGl0b3JQYW5lMSgpeworcmV0dXJuIGpFZGl0b3JQYW5lMTsJfQorCisKKworCS8qKiBBdXRvLWdlbmVyYXRlZCBldmVudCBoYW5kbGVyIG1ldGhvZCAqLworCXByb3RlY3RlZCB2b2lkIG5ld0ZpbGVNZW51SXRlbUFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpeworCQkvL1RPRE8gYWRkIHlvdXIgaGFuZGxlciBjb2RlIGhlcmUKKwkJCisJCQljcmVhdGVkUHJvZmlsZSA9IG5ldyBQcm9maWxlKCk7CisJCQlqRWRpdG9yUGFuZTEuc2V0VGV4dChuZXcgUHJvZmlsZVByaW50ZXIoY3JlYXRlZFByb2ZpbGUsImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi9kdGQvcHJvZi5kdGQiKS50b1hNTFN0cmluZygpKTsKKwkJCQorCQkJZ2V0SlRyZWUxKCkuc2V0TW9kZWwoZ2VuZXJhdGVNb2RlbEZyb21Qcm9maWxlKGNyZWF0ZWRQcm9maWxlKSk7CisJCQkvL2dldEpUcmVlMSgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IExlYWZMaXN0ZW5lcihnZXRKVHJlZTEoKSkpOworCX0KKworCS8qKiBBdXRvLWdlbmVyYXRlZCBldmVudCBoYW5kbGVyIG1ldGhvZCAqLworCXByb3RlY3RlZCB2b2lkIGV4aXRNZW51SXRlbUFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpeworCQkvL1RPRE8gYWRkIHlvdXIgaGFuZGxlciBjb2RlIGhlcmUKKwkJU3lzdGVtLmV4aXQoMSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50c0Zyb21UcmVlTm9kZShUcmVlTm9kZSB0LCBMaXN0IG11bHRpVmFsdWVFbGVtKXsKKwkJZm9yKEVudW1lcmF0aW9uIGkgPSB0LmNoaWxkcmVuKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7ICl7CisgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZU5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlpLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyB0aGVTdHIgPSAoU3RyaW5nKXRoZU5vZGUuZ2V0VXNlck9iamVjdCgpOworICAgICAgICAgICAgbXVsdGlWYWx1ZUVsZW0uYWRkKHRoZVN0cik7ICAgIAorCQl9CisJfQorCQorCQorCQorCXByaXZhdGUgUHJvZmlsZSBnZW5lcmF0ZVByb2ZpbGVGcm9tTW9kZWwoVHJlZU1vZGVsIGR0bSl7CisJCQorCQlQcm9maWxlIHAgPSBuZXcgUHJvZmlsZSgpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVByb2ZpbGVSb290ID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpZHRtLmdldFJvb3QoKTsKKwkJCisJCS8vZ2V0IHRoZSBwcm9maWxlIGF0dHJpYnV0ZXMKKwkJLy9jaGlsZHJlbiBMaXN0CisJCS8vaWQgU3RyaW5nCisJCS8vcGFyZW50IFN0cmluZworCQkvL3JlZ0F1dGhvcml0eSBTdHJpbmcKKwkJLy9yZXZpc2lvbk5vdGVzIExpc3QKKwkJLy9zZWN1cml0eVR5cGUgU3RyaW5nCisJCS8vc3RhdHVzSUQgU3RyaW5nCisJCS8vdHlwZSBTdHJpbmcKKwkJLy92ZXJzaW9uIFN0cmluZworCQlUcmVlTm9kZSB0aGVQcm9mQXR0clJvb3QgPSB0aGVQcm9maWxlUm9vdC5nZXRDaGlsZEF0KDApOworCisJCVRyZWVOb2RlIHRoZVByb2ZBdHRyX0NoaWxkcmVuID0gdGhlUHJvZkF0dHJSb290LmdldENoaWxkQXQoMCk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHRoZVByb2ZBdHRyX0NoaWxkcmVuLHAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRDaGlsZHJlbigpKTsKKworCQlUcmVlTm9kZSB0aGVQcm9mQXR0cl9JRFJvb3QgPSB0aGVQcm9mQXR0clJvb3QuZ2V0Q2hpbGRBdCgxKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVQcm9mQXR0cl9JRCA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXRoZVByb2ZBdHRyX0lEUm9vdC5nZXRDaGlsZEF0KDApOworCQlwLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuc2V0SUQoKFN0cmluZyl0aGVQcm9mQXR0cl9JRC5nZXRVc2VyT2JqZWN0KCkpOworCQkKKwkJVHJlZU5vZGUgdGhlUHJvZkF0dHJfUGFyZW50Um9vdCA9IHRoZVByb2ZBdHRyUm9vdC5nZXRDaGlsZEF0KDIpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVByb2ZBdHRyX1BhcmVudCA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXRoZVByb2ZBdHRyX1BhcmVudFJvb3QuZ2V0Q2hpbGRBdCgwKTsKKwkJcC5nZXRQcm9maWxlQXR0cmlidXRlcygpLnNldFBhcmVudCgoU3RyaW5nKXRoZVByb2ZBdHRyX1BhcmVudC5nZXRVc2VyT2JqZWN0KCkpOworCQkKKwkJCisJCVRyZWVOb2RlIHRoZVByb2ZBdHRyX1JlZ0F1dGhvcml0eVJvb3QgPSB0aGVQcm9mQXR0clJvb3QuZ2V0Q2hpbGRBdCgzKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVQcm9mQXR0cl9SZWdBdXRob3JpdHkgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl0aGVQcm9mQXR0cl9SZWdBdXRob3JpdHlSb290LmdldENoaWxkQXQoMCk7CisJCXAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5zZXRSZWdBdXRob3JpdHkoKFN0cmluZyl0aGVQcm9mQXR0cl9SZWdBdXRob3JpdHkuZ2V0VXNlck9iamVjdCgpKTsKKwkJCisJCVRyZWVOb2RlIHRoZVByb2ZBdHRyX3Jldk5vdGVzID0gdGhlUHJvZkF0dHJSb290LmdldENoaWxkQXQoNCk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHRoZVByb2ZBdHRyX3Jldk5vdGVzLHAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRSZXZpc2lvbk5vdGVzKCkpOworCisJCVRyZWVOb2RlIHRoZVByb2ZBdHRyX1NlY3VyaXR5VHlwZVJvb3QgPSB0aGVQcm9mQXR0clJvb3QuZ2V0Q2hpbGRBdCg1KTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVQcm9mQXR0cl9TZWN1cml0eVR5cGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl0aGVQcm9mQXR0cl9TZWN1cml0eVR5cGVSb290LmdldENoaWxkQXQoMCk7CisJCXAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5zZXRTZWN1cml0eVR5cGUoKFN0cmluZyl0aGVQcm9mQXR0cl9TZWN1cml0eVR5cGUuZ2V0VXNlck9iamVjdCgpKTsKKwkJCisJCVRyZWVOb2RlIHRoZVByb2ZBdHRyX1N0YXR1c0lEUm9vdCA9IHRoZVByb2ZBdHRyUm9vdC5nZXRDaGlsZEF0KDYpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVByb2ZBdHRyX1N0YXR1c0lEID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpdGhlUHJvZkF0dHJfU3RhdHVzSURSb290LmdldENoaWxkQXQoMCk7CisJCXAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5zZXRTdGF0dXNJRCgoU3RyaW5nKXRoZVByb2ZBdHRyX1N0YXR1c0lELmdldFVzZXJPYmplY3QoKSk7CisJCQorCQlUcmVlTm9kZSB0aGVQcm9mQXR0cl9UeXBlUm9vdCA9IHRoZVByb2ZBdHRyUm9vdC5nZXRDaGlsZEF0KDcpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVByb2ZBdHRyX1R5cGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl0aGVQcm9mQXR0cl9UeXBlUm9vdC5nZXRDaGlsZEF0KDApOworCQlwLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuc2V0VHlwZSgoU3RyaW5nKXRoZVByb2ZBdHRyX1R5cGUuZ2V0VXNlck9iamVjdCgpKTsKKwkJCisJCVRyZWVOb2RlIHRoZVByb2ZBdHRyX1ZlcnNpb25Sb290ID0gdGhlUHJvZkF0dHJSb290LmdldENoaWxkQXQoOCk7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlUHJvZkF0dHJfVmVyc2lvbiA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXRoZVByb2ZBdHRyX1ZlcnNpb25Sb290LmdldENoaWxkQXQoMCk7CisJCXAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5zZXRWZXJzaW9uKChTdHJpbmcpdGhlUHJvZkF0dHJfVmVyc2lvbi5nZXRVc2VyT2JqZWN0KCkpOworCQkJCQorCisJCS8vcmVzb3VyY2UgYXR0cmlidXRlcworCQkvL2FnZ3JlZ2F0aW9uIC0gc3RyaW5nCisJCS8vY2xhc3MgLSBzdHJpbmcKKwkJLy9jb250ZXh0cyAtIGxpc3QKKwkJLy9jb250cmlidXRvcnMgLSBsaXN0CisJCS8vY292ZXJhZ2VzIC0gbGlzdAorCQkvL2NyZWF0b3JzIC0gbGlzdAorCQkvL2RhdGVzIC0gbGlzdAorCQkvL2Rlc2NyaXB0aW9uIC0gc3RyaW5nCisJCS8vZm9ybWF0cyAtIGxpc3QKKwkJLy9pZGVudGlmaWVyIC0gc3RyaW5nCisJCS8vbGFuZ3VhZ2VzIC0gbGlzdAorCQkvL2xvY2F0aW9ucyAtIGxpc3QKKwkJLy9wdWJsaXNoZXJzIC0gbGlzdAorCQkvL3JlbGF0aW9ucyAtIGxpc3QKKwkJLy9yaWdodHMgLSBsaXN0CisJCS8vc291cmNlcyAtIGxpc3QKKwkJLy9zdWJqZWN0cyAtIGxpc3QKKwkJLy90aXRsZSAtIHN0cmluZworCQkvL3R5cGVzIC0gbGlzdAorCQkKKwkJVHJlZU5vZGUgdGhlUmVzQXR0clJvb3QgPSB0aGVQcm9maWxlUm9vdC5nZXRDaGlsZEF0KDEpOworCQkKKwkJVHJlZU5vZGUgcmFfYWdnUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDApOworCQlUcmVlTm9kZSByYV9jbGFzc1Jvb3Q9dGhlUmVzQXR0clJvb3QuZ2V0Q2hpbGRBdCgxKTsKKwkJVHJlZU5vZGUgcmFfY29udGV4dFJvb3Q9dGhlUmVzQXR0clJvb3QuZ2V0Q2hpbGRBdCgyKTsKKwkJVHJlZU5vZGUgcmFfY29udHJpYlJvb3Q9dGhlUmVzQXR0clJvb3QuZ2V0Q2hpbGRBdCgzKTsKKwkJVHJlZU5vZGUgcmFfY292ZXJhZ2VSb290PXRoZVJlc0F0dHJSb290LmdldENoaWxkQXQoNCk7CisJCVRyZWVOb2RlIHJhX2NyZWF0b3JSb290PXRoZVJlc0F0dHJSb290LmdldENoaWxkQXQoNSk7CisJCVRyZWVOb2RlIHJhX2RhdGVzUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDYpOworCQlUcmVlTm9kZSByYV9kZXNjUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDcpOworCQlUcmVlTm9kZSByYV9mb3JtYXRzUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDgpOworCQlUcmVlTm9kZSByYV9pZGVudGlmaWVyUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDkpOworCQlUcmVlTm9kZSByYV9sYW5nUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDEwKTsKKwkJVHJlZU5vZGUgcmFfbG9jYXRpb25Sb290PXRoZVJlc0F0dHJSb290LmdldENoaWxkQXQoMTEpOworCQlUcmVlTm9kZSByYV9wdWJsaXNoZXJzUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDEyKTsKKwkJVHJlZU5vZGUgcmFfcmVsYXRpb25zUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDEzKTsKKwkJVHJlZU5vZGUgcmFfcmlnaHRzUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDE0KTsKKwkJVHJlZU5vZGUgcmFfc291cmNlc1Jvb3Q9dGhlUmVzQXR0clJvb3QuZ2V0Q2hpbGRBdCgxNSk7CisJCVRyZWVOb2RlIHJhX3N1YmplY3RzUm9vdD10aGVSZXNBdHRyUm9vdC5nZXRDaGlsZEF0KDE2KTsKKwkJVHJlZU5vZGUgcmFfdGl0bGVSb290PXRoZVJlc0F0dHJSb290LmdldENoaWxkQXQoMTcpOworCQlUcmVlTm9kZSByYV90eXBlc1Jvb3Q9dGhlUmVzQXR0clJvb3QuZ2V0Q2hpbGRBdCgxOCk7CisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJhX2FnZyA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXJhX2FnZ1Jvb3QuZ2V0Q2hpbGRBdCgwKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByYV9jbGFzcyA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXJhX2NsYXNzUm9vdC5nZXRDaGlsZEF0KDApOworCQkKKwkJCisJCXAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0UmVzQWdncmVnYXRpb24oKFN0cmluZylyYV9hZ2cuZ2V0VXNlck9iamVjdCgpKTsKKwkJcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5zZXRSZXNDbGFzcygoU3RyaW5nKXJhX2NsYXNzLmdldFVzZXJPYmplY3QoKSk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX2NvbnRleHRSb290LHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVzQ29udGV4dHMoKSk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX2NvbnRyaWJSb290LHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0Q29udHJpYnV0b3JzKCkpOworCQlhZGRFbGVtZW50c0Zyb21UcmVlTm9kZShyYV9jb3ZlcmFnZVJvb3QscC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRDb3ZlcmFnZXMoKSk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX2NyZWF0b3JSb290LHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0Q3JlYXRvcnMoKSk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX2RhdGVzUm9vdCxwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldERhdGVzKCkpOworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByYV9kZXNjID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpcmFfZGVzY1Jvb3QuZ2V0Q2hpbGRBdCgwKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByYV9pZGVudGlmaWVyID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpcmFfaWRlbnRpZmllclJvb3QuZ2V0Q2hpbGRBdCgwKTsKKwkJCisJCXAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0RGVzY3JpcHRpb24oKFN0cmluZylyYV9kZXNjLmdldFVzZXJPYmplY3QoKSk7CisJCXAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0SWRlbnRpZmllcigoU3RyaW5nKXJhX2lkZW50aWZpZXIuZ2V0VXNlck9iamVjdCgpKTsKKwkJCisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX2Zvcm1hdHNSb290LHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0Rm9ybWF0cygpKTsKKwkJYWRkRWxlbWVudHNGcm9tVHJlZU5vZGUocmFfbGFuZ1Jvb3QscC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRMYW5ndWFnZXMoKSk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX2xvY2F0aW9uUm9vdCxwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldFJlc0xvY2F0aW9ucygpKTsKKwkJYWRkRWxlbWVudHNGcm9tVHJlZU5vZGUocmFfcHVibGlzaGVyc1Jvb3QscC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRQdWJsaXNoZXJzKCkpOworCQlhZGRFbGVtZW50c0Zyb21UcmVlTm9kZShyYV9yZWxhdGlvbnNSb290LHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVsYXRpb25zKCkpOworCQlhZGRFbGVtZW50c0Zyb21UcmVlTm9kZShyYV9yaWdodHNSb290LHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmlnaHRzKCkpOworCQlhZGRFbGVtZW50c0Zyb21UcmVlTm9kZShyYV9zb3VyY2VzUm9vdCxwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldFNvdXJjZXMoKSk7CisJCWFkZEVsZW1lbnRzRnJvbVRyZWVOb2RlKHJhX3N1YmplY3RzUm9vdCxwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldFN1YmplY3RzKCkpOworCQlhZGRFbGVtZW50c0Zyb21UcmVlTm9kZShyYV90eXBlc1Jvb3QscC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRUeXBlcygpKTsKKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmFfdGl0bGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlyYV90aXRsZVJvb3QuZ2V0Q2hpbGRBdCgwKTsKKwkJcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5zZXRUaXRsZSgoU3RyaW5nKXJhX3RpdGxlLmdldFVzZXJPYmplY3QoKSk7CisJCQorCQkvL2hhbmRsZSBwcm9maWxlIGVsZW1lbnRzIGhlcmUKKwkJVHJlZU5vZGUgdGhlUHJvZkVsZW1Sb290ID0gdGhlUHJvZmlsZVJvb3QuZ2V0Q2hpbGRBdCgyKTsKKwkJCisJCWZvcihFbnVtZXJhdGlvbiBlID0gdGhlUHJvZkVsZW1Sb290LmNoaWxkcmVuKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICl7CisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByb2ZFbGVtTl9Sb290ID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpZS5uZXh0RWxlbWVudCgpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJHb3QgUHJvZmlsZSBFbGVtZW50ICIrKFN0cmluZylwcm9mRWxlbU5fUm9vdC5nZXRVc2VyT2JqZWN0KCkpOworCQkJUHJvZmlsZUVsZW1lbnQgcHJvZkVsZW0gPSBtYWtlUHJvZmlsZUVsZW1lbnRGcm9tVHJlZU5vZGUocCxwcm9mRWxlbU5fUm9vdCk7CisJCQkKKwkJCWlmKHByb2ZFbGVtICE9IG51bGwpeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWFraW5nIHByb2ZpbGUgZWxlbWVudCIpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9mRWxlbS50b1N0cmluZygpKTsKKwkJCQkKKwkJCQlwLmdldFByb2ZpbGVFbGVtZW50cygpLnB1dCgoU3RyaW5nKXByb2ZFbGVtTl9Sb290LmdldFVzZXJPYmplY3QoKSxwcm9mRWxlbSk7CisJCQl9CisJCQkKKwkJCQorCQl9CisJCQorCQkKKwkJcmV0dXJuIHA7CisJfQorCQorCXByaXZhdGUgUHJvZmlsZUVsZW1lbnQgbWFrZVByb2ZpbGVFbGVtZW50RnJvbVRyZWVOb2RlKFByb2ZpbGUgdGhlUHJvZmlsZSxEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRuKXsKKwkJCisJCVByb2ZpbGVFbGVtZW50IHRoZVByb2ZpbGVFbGVtZW50ID0gbmV3IFJhbmdlZFByb2ZpbGVFbGVtZW50KHRoZVByb2ZpbGUpOworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjb21tZW50Um9vdCA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXRuLmdldENoaWxkQXQoMCk7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgZGVzY1Jvb3QgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl0bi5nZXRDaGlsZEF0KDEpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGlkUm9vdCA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXRuLmdldENoaWxkQXQoMik7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbW9Sb290ID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpdG4uZ2V0Q2hpbGRBdCgzKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBzeW5Sb290ID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpdG4uZ2V0Q2hpbGRBdCg0KTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0eXBlUm9vdCA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXRuLmdldENoaWxkQXQoNSk7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdW5pdFJvb3QgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl0bi5nZXRDaGlsZEF0KDYpOworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwZV9Db21tZW50cyA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKWNvbW1lbnRSb290LmdldENoaWxkQXQoMCk7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcGVfZGVzYyA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKWRlc2NSb290LmdldENoaWxkQXQoMCk7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcGVfaWQgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlpZFJvb3QuZ2V0Q2hpbGRBdCgwKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwZV9tbyA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKW1vUm9vdC5nZXRDaGlsZEF0KDApOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHBlX3R5cGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl0eXBlUm9vdC5nZXRDaGlsZEF0KDApOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHBlX3VuaXQgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl1bml0Um9vdC5nZXRDaGlsZEF0KDApOworCQkKKwkJYWRkRWxlbWVudHNGcm9tVHJlZU5vZGUoc3luUm9vdCx0aGVQcm9maWxlRWxlbWVudC5nZXRTeW5vbnltcygpKTsKKwkJCisJCXRoZVByb2ZpbGVFbGVtZW50LnNldE5hbWUoKFN0cmluZyl0bi5nZXRVc2VyT2JqZWN0KCkpOworCQl0aGVQcm9maWxlRWxlbWVudC5zZXRDb21tZW50cygoU3RyaW5nKXBlX0NvbW1lbnRzLmdldFVzZXJPYmplY3QoKSk7CisJCXRoZVByb2ZpbGVFbGVtZW50LnNldERlc2NyaXB0aW9uKChTdHJpbmcpcGVfZGVzYy5nZXRVc2VyT2JqZWN0KCkpOworCQl0aGVQcm9maWxlRWxlbWVudC5zZXRJRCgoU3RyaW5nKXBlX2lkLmdldFVzZXJPYmplY3QoKSk7CisJCXRoZVByb2ZpbGVFbGVtZW50LnNldE1heE9jY3VycmVuY2UoSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXBlX21vLmdldFVzZXJPYmplY3QoKSkpOworCQl0aGVQcm9maWxlRWxlbWVudC5zZXRUeXBlKChTdHJpbmcpcGVfdHlwZS5nZXRVc2VyT2JqZWN0KCkpOworCQl0aGVQcm9maWxlRWxlbWVudC5zZXRVbml0KChTdHJpbmcpcGVfdW5pdC5nZXRVc2VyT2JqZWN0KCkpOworCQkKKwkJcmV0dXJuIHRoZVByb2ZpbGVFbGVtZW50OworCQkKKwkJLy9yZXR1cm4gbmV3IFJhbmdlZFByb2ZpbGVFbGVtZW50KG5ldyBQcm9maWxlKCkpOworCX0KKwkKKwkKKwkKKwlwcml2YXRlIERlZmF1bHRUcmVlTW9kZWwgZ2VuZXJhdGVNb2RlbEZyb21Qcm9maWxlKFByb2ZpbGUgcCl7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJQcm9maWxlIik7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0clJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiUmVzb3VyY2UgQXR0cmlidXRlcyIpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByb2ZBdHRyUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJQcm9maWxlIEF0dHJpYnV0ZXMiKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwcm9mRWxlbVJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiUHJvZmlsZSBFbGVtZW50cyIpOworCQkKKwkJLy9kbyB0aGUgUHJvZmlsZSBBdHRyaWJ1dGVzIGhlcmUKKwkJLy9jaGlsZHJlbiBMaXN0CisJCS8vaWQgU3RyaW5nCisJCS8vcGFyZW50IFN0cmluZworCQkvL3JlZ0F1dGhvcml0eSBTdHJpbmcKKwkJLy9yZXZpc2lvbk5vdGVzIExpc3QKKwkJLy9zZWN1cml0eVR5cGUgU3RyaW5nCisJCS8vc3RhdHVzSUQgU3RyaW5nCisJCS8vdHlwZSBTdHJpbmcKKwkJLy92ZXJzaW9uIFN0cmluZworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwcm9mQXR0cl9jaGlsZHJlbiA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJDaGlsZHJlbiIpOworCQkKKwkJZm9yKEl0ZXJhdG9yIGkgPSBwLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyB0aGVDaGlsZCA9IChTdHJpbmcpaS5uZXh0KCk7CisJCQkKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvZkF0dHJfY2hpbGROID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlQ2hpbGQpOworCQkJcHJvZkF0dHJfY2hpbGRyZW4uYWRkKHByb2ZBdHRyX2NoaWxkTik7CisJCX0KKwkJCisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByb2ZBdHRyX2lkID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIklkIik7CisJCXByb2ZBdHRyX2lkLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSkpOworCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvZkF0dHJfcGFyZW50ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlBhcmVudCIpOworCQlwcm9mQXR0cl9wYXJlbnQuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRQYXJlbnQoKSkpOwkJCisKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwcm9mQXR0cl9yZWdBdXRoID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlJlZ2lzdHJhdGlvbiBBdXRob3JpdHkiKTsKKwkJcHJvZkF0dHJfcmVnQXV0aC5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocC5nZXRQcm9maWxlQXR0cmlidXRlcygpLmdldFJlZ0F1dGhvcml0eSgpKSk7CQkKKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvZkF0dHJfcmV2Tm90ZXMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiUmV2aXNpb24gTm90ZXMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRQcm9maWxlQXR0cmlidXRlcygpLmdldFJldmlzaW9uTm90ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyByZXZOb3RlU3RyaW5nID0gKFN0cmluZylpLm5leHQoKTsKKwkJCQorCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXZOb3RlX0NoaWxkID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocmV2Tm90ZVN0cmluZyk7CisJCQlwcm9mQXR0cl9yZXZOb3Rlcy5hZGQocmV2Tm90ZV9DaGlsZCk7CisJCX0KKworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByb2ZBdHRyX3NlY3VyaXR5VHlwZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJTZWN1cml0eSBUeXBlIik7CisJCXByb2ZBdHRyX3NlY3VyaXR5VHlwZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocC5nZXRQcm9maWxlQXR0cmlidXRlcygpLmdldFNlY3VyaXR5VHlwZSgpKSk7CQkKKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvZkF0dHJfc3RhdHVzSUQgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiU3RhdHVzIElEIik7CisJCXByb2ZBdHRyX3N0YXR1c0lELmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0U3RhdHVzSUQoKSkpOwkJCisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByb2ZBdHRyX3R5cGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiVHlwZSIpOworCQlwcm9mQXR0cl90eXBlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0VHlwZSgpKSk7CQkKKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvZkF0dHJfdmVyc2lvbiA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJWZXJzaW9uIik7CisJCXByb2ZBdHRyX3ZlcnNpb24uYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9uKCkpKTsJCQorCQkKKwkJcHJvZkF0dHJSb290LmFkZChwcm9mQXR0cl9jaGlsZHJlbik7CisJCXByb2ZBdHRyUm9vdC5hZGQocHJvZkF0dHJfaWQpOworCQlwcm9mQXR0clJvb3QuYWRkKHByb2ZBdHRyX3BhcmVudCk7CisJCXByb2ZBdHRyUm9vdC5hZGQocHJvZkF0dHJfcmVnQXV0aCk7CisJCXByb2ZBdHRyUm9vdC5hZGQocHJvZkF0dHJfcmV2Tm90ZXMpOworCQlwcm9mQXR0clJvb3QuYWRkKHByb2ZBdHRyX3NlY3VyaXR5VHlwZSk7CisJCXByb2ZBdHRyUm9vdC5hZGQocHJvZkF0dHJfc3RhdHVzSUQpOworCQlwcm9mQXR0clJvb3QuYWRkKHByb2ZBdHRyX3R5cGUpOworCQlwcm9mQXR0clJvb3QuYWRkKHByb2ZBdHRyX3ZlcnNpb24pOworCQkKKwkJLy9yZXNvdXJjZSBhdHRyaWJ1dGVzCisJCS8vYWdncmVnYXRpb24gLSBzdHJpbmcKKwkJLy9jbGFzcyAtIHN0cmluZworCQkvL2NvbnRleHRzIC0gbGlzdAorCQkvL2NvbnRyaWJ1dG9ycyAtIGxpc3QKKwkJLy9jb3ZlcmFnZXMgLSBsaXN0CisJCS8vY3JlYXRvcnMgLSBsaXN0CisJCS8vZGF0ZXMgLSBsaXN0CisJCS8vZGVzY3JpcHRpb24gLSBzdHJpbmcKKwkJLy9mb3JtYXRzIC0gbGlzdAorCQkvL2lkZW50aWZpZXIgLSBzdHJpbmcKKwkJLy9sYW5ndWFnZXMgLSBsaXN0CisJCS8vbG9jYXRpb25zIC0gbGlzdAorCQkvL3B1Ymxpc2hlcnMgLSBsaXN0CisJCS8vcmVsYXRpb25zIC0gbGlzdAorCQkvL3JpZ2h0cyAtIGxpc3QKKwkJLy9zb3VyY2VzIC0gbGlzdAorCQkvL3N1YmplY3RzIC0gbGlzdAorCQkvL3RpdGxlIC0gc3RyaW5nCisJCS8vdHlwZXMgLSBsaXN0CisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfYWdncmVnYXRpb24gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiQWdncmVnYXRpb24iKTsKKwkJcmVzQXR0cl9hZ2dyZWdhdGlvbi5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRSZXNBZ2dyZWdhdGlvbigpKSk7CQkKKworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfY2xhc3MgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiQ2xhc3MiKTsKKwkJcmVzQXR0cl9jbGFzcy5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRSZXNDbGFzcygpKSk7CQkKKwkJCisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfY29udGV4dHMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiQ29udGV4dHMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRSZXNDb250ZXh0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkJU3RyaW5nIHRoZUNvbnRleHQgPSAoU3RyaW5nKWkubmV4dCgpOworCQkJCisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfY29udGV4dE4gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVDb250ZXh0KTsKKwkJCXJlc0F0dHJfY29udGV4dHMuYWRkKHJlc0F0dHJfY29udGV4dE4pOworCQl9CisKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX2NvbnRyaWJ1dG9ycyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJDb250cmlidXRvcnMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRDb250cmlidXRvcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyB0aGVDb250cmlidXRvciA9IChTdHJpbmcpaS5uZXh0KCk7CisJCQkKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9jb250cmliTiA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHRoZUNvbnRyaWJ1dG9yKTsKKwkJCXJlc0F0dHJfY29udHJpYnV0b3JzLmFkZChyZXNBdHRyX2NvbnRyaWJOKTsKKwkJfQorCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX2NvdmVyYWdlcyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJDb3ZlcmFnZXMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRDb3ZlcmFnZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyB0aGVDb3ZlcmFnZSA9IChTdHJpbmcpaS5uZXh0KCk7CisJCQkKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9jb3ZlcmFnZU49IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHRoZUNvdmVyYWdlKTsKKwkJCXJlc0F0dHJfY292ZXJhZ2VzLmFkZChyZXNBdHRyX2NvdmVyYWdlTik7CisJCX0KKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9jcmVhdG9ycyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJDcmVhdG9ycyIpOworCQkKKwkJZm9yKEl0ZXJhdG9yIGkgPSBwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldENyZWF0b3JzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgdGhlQ3JlYXRvciA9IChTdHJpbmcpaS5uZXh0KCk7CisJCQkKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9jcmVhdG9yTiA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHRoZUNyZWF0b3IpOworCQkJcmVzQXR0cl9jcmVhdG9ycy5hZGQocmVzQXR0cl9jcmVhdG9yTik7CisJCX0KKworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfZGF0ZXMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiRGF0ZXMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXREYXRlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkJU3RyaW5nIHRoZURhdGUgPSAoU3RyaW5nKWkubmV4dCgpOworCQkJCisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfZGF0ZU4gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVEYXRlKTsKKwkJCXJlc0F0dHJfZGF0ZXMuYWRkKHJlc0F0dHJfZGF0ZU4pOworCQl9CisJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9kZXNjcmlwdGlvbiA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJEZXNjcmlwdGlvbiIpOworCQlyZXNBdHRyX2Rlc2NyaXB0aW9uLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldERlc2NyaXB0aW9uKCkpKTsJCQorCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9mb3JtYXRzID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIkZvcm1hdHMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRGb3JtYXRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgdGhlRm9ybWF0ID0gKFN0cmluZylpLm5leHQoKTsKKwkJCQorCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX2Zvcm1hdE4gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVGb3JtYXQpOworCQkJcmVzQXR0cl9mb3JtYXRzLmFkZChyZXNBdHRyX2Zvcm1hdE4pOworCQl9CisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfaWRlbnRpZmllciA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJJZGVudGlmaWVyIik7CisJCXJlc0F0dHJfaWRlbnRpZmllci5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRJZGVudGlmaWVyKCkpKTsJCQorCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9sYW5ndWFnZXMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiTGFuZ3VhZ2VzIik7CisJCQorCQlmb3IoSXRlcmF0b3IgaSA9IHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0TGFuZ3VhZ2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgdGhlTGFuZ3VhZ2UgPSAoU3RyaW5nKWkubmV4dCgpOworCQkJCisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfbGFuZ04gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVMYW5ndWFnZSk7CisJCQlyZXNBdHRyX2xhbmd1YWdlcy5hZGQocmVzQXR0cl9sYW5nTik7CisJCX0KKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9sb2NhdGlvbnMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiUmVzb3VyY2UgTG9jYXRpb25zIik7CisJCQorCQlmb3IoSXRlcmF0b3IgaSA9IHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVzTG9jYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgdGhlTG9jID0gKFN0cmluZylpLm5leHQoKTsKKwkJCQorCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX2xvY04gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVMb2MpOworCQkJcmVzQXR0cl9sb2NhdGlvbnMuYWRkKHJlc0F0dHJfbG9jTik7CisJCX0KKworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfcHVibGlzaGVycyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJQdWJsaXNoZXJzIik7CisJCQorCQlmb3IoSXRlcmF0b3IgaSA9IHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UHVibGlzaGVycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkJU3RyaW5nIHRoZVB1Ymxpc2hlciA9IChTdHJpbmcpaS5uZXh0KCk7CisJCQkKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9wdWJOID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlUHVibGlzaGVyKTsKKwkJCXJlc0F0dHJfcHVibGlzaGVycy5hZGQocmVzQXR0cl9wdWJOKTsKKwkJfQorCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX3JlbGF0aW9ucyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJSZWxhdGlvbnMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRSZWxhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyB0aGVSZWxhdGlvbiA9IChTdHJpbmcpaS5uZXh0KCk7CisJCQkKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9yZWxhdGlvbk4gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVSZWxhdGlvbik7CisJCQlyZXNBdHRyX3JlbGF0aW9ucy5hZGQocmVzQXR0cl9yZWxhdGlvbk4pOworCQl9CisKKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9yaWdodHMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiUmlnaHRzIik7CisJCQorCQlmb3IoSXRlcmF0b3IgaSA9IHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmlnaHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgdGhlUmlnaHQgPSAoU3RyaW5nKWkubmV4dCgpOworCQkJCisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfcmlnaHROID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlUmlnaHQpOworCQkJcmVzQXR0cl9yaWdodHMuYWRkKHJlc0F0dHJfcmlnaHROKTsKKwkJfQorCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl9zb3VyY2VzID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlNvdXJjZXMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRTb3VyY2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgdGhlU291cmNlID0gKFN0cmluZylpLm5leHQoKTsKKwkJCQorCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX3NvdXJjZU4gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVTb3VyY2UpOworCQkJcmVzQXR0cl9zb3VyY2VzLmFkZChyZXNBdHRyX3NvdXJjZU4pOworCQl9CisKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX3N1YmplY3RzID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlN1YmplY3RzIik7CisJCQorCQlmb3IoSXRlcmF0b3IgaSA9IHAuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0U3ViamVjdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyB0aGVTdWJqZWN0ID0gKFN0cmluZylpLm5leHQoKTsKKwkJCQorCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyX3N1YmplY3ROID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlU3ViamVjdCk7CisJCQlyZXNBdHRyX3N1YmplY3RzLmFkZChyZXNBdHRyX3N1YmplY3ROKTsKKwkJfQorCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcmVzQXR0cl90aXRsZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJUaXRsZSIpOworCQlyZXNBdHRyX3RpdGxlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldFRpdGxlKCkpKTsJCQorCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfdHlwZXMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiVHlwZXMiKTsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gcC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkJU3RyaW5nIHRoZVR5cGUgPSAoU3RyaW5nKWkubmV4dCgpOworCQkJCisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc0F0dHJfdHlwZU4gPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVUeXBlKTsKKwkJCXJlc0F0dHJfdHlwZXMuYWRkKHJlc0F0dHJfdHlwZU4pOworCQl9CisJCisKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfYWdncmVnYXRpb24pOworCQlyZXNBdHRyUm9vdC5hZGQocmVzQXR0cl9jbGFzcyk7CisJCXJlc0F0dHJSb290LmFkZChyZXNBdHRyX2NvbnRleHRzKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfY29udHJpYnV0b3JzKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfY292ZXJhZ2VzKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfY3JlYXRvcnMpOworCQlyZXNBdHRyUm9vdC5hZGQocmVzQXR0cl9kYXRlcyk7CisJCXJlc0F0dHJSb290LmFkZChyZXNBdHRyX2Rlc2NyaXB0aW9uKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfZm9ybWF0cyk7CisJCXJlc0F0dHJSb290LmFkZChyZXNBdHRyX2lkZW50aWZpZXIpOworCQlyZXNBdHRyUm9vdC5hZGQocmVzQXR0cl9sYW5ndWFnZXMpOworCQlyZXNBdHRyUm9vdC5hZGQocmVzQXR0cl9sb2NhdGlvbnMpOworCQlyZXNBdHRyUm9vdC5hZGQocmVzQXR0cl9wdWJsaXNoZXJzKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfcmVsYXRpb25zKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfcmlnaHRzKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfc291cmNlcyk7CisJCXJlc0F0dHJSb290LmFkZChyZXNBdHRyX3N1YmplY3RzKTsKKwkJcmVzQXR0clJvb3QuYWRkKHJlc0F0dHJfdGl0bGUpOworCQlyZXNBdHRyUm9vdC5hZGQocmVzQXR0cl90eXBlcyk7CisKKyAgICAgICAgZm9yKEl0ZXJhdG9yIGkgPSBwLmdldFByb2ZpbGVFbGVtZW50cygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgICAgICAJU3RyaW5nIHBlS2V5ID0gKFN0cmluZylpLm5leHQoKTsKKyAgICAgICAgCQorICAgICAgICAJUHJvZmlsZUVsZW1lbnQgdGhlUHJvZmlsZUVsZW1lbnQgPSAoUHJvZmlsZUVsZW1lbnQpcC5nZXRQcm9maWxlRWxlbWVudHMoKS5nZXQocGVLZXkpOworICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVQRU5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVQcm9maWxlRWxlbWVudC5nZXROYW1lKCkpOworICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVDb21tZW50c1Jvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiQ29tbWVudHMiKTsKKyAgICAgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlQ29tbWVudHMgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVQcm9maWxlRWxlbWVudC5nZXRDb21tZW50cygpKTsKKyAgICAgICAgCQorICAgICAgICAJdGhlQ29tbWVudHNSb290LmFkZCh0aGVDb21tZW50cyk7CisgICAgICAgIAkKKyAgICAgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlRGVzYyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHRoZVByb2ZpbGVFbGVtZW50LmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVEZXNjUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJEZXNjcmlwdGlvbiIpOworICAgICAgICAJCisgICAgICAgIAl0aGVEZXNjUm9vdC5hZGQodGhlRGVzYyk7CisgICAgICAgIAkKKyAgICAgICAgCQorICAgICAgICAJCisgICAgICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZUlEID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlUHJvZmlsZUVsZW1lbnQuZ2V0SUQoKSk7CisgICAgICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZUlEUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJJRCIpOworICAgICAgICAJCisgICAgICAgIAl0aGVJRFJvb3QuYWRkKHRoZUlEKTsKKyAgICAgICAgCQorICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVNTyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKG5ldyBJbnRlZ2VyKHRoZVByb2ZpbGVFbGVtZW50LmdldE1heE9jY3VycmVuY2UoKSkudG9TdHJpbmcoKSk7CisgICAgICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZU1PUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJNYXggT2NjdXJlbmNlIik7CisgICAgICAgIAl0aGVNT1Jvb3QuYWRkKHRoZU1PKTsKKyAgICAgICAgCQorICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVTeW5vbnltcyA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJTeW5vbnltcyIpOworICAgICAgICAJCisgICAgICAgIAlmb3IoSXRlcmF0b3IgaTIgPSB0aGVQcm9maWxlRWxlbWVudC5nZXRTeW5vbnltcygpLml0ZXJhdG9yKCk7IGkyLmhhc05leHQoKTsgKXsKKyAgICAgICAgCQlTdHJpbmcgdGhlU3lub255bSA9IChTdHJpbmcpaTIubmV4dCgpOworICAgICAgICAJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgc05vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVTeW5vbnltKTsKKyAgICAgICAgCQl0aGVTeW5vbnltcy5hZGQoc05vZGUpOworICAgICAgICAJfQorCisgICAgICAgIAlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRoZVR5cGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSh0aGVQcm9maWxlRWxlbWVudC5nZXRUeXBlKCkpOworICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVUeXBlUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJUeXBlIik7CisgICAgICAgIAl0aGVUeXBlUm9vdC5hZGQodGhlVHlwZSk7CisgICAgICAgIAkKKyAgICAgICAgCQorICAgICAgICAJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB0aGVVbml0ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGhlUHJvZmlsZUVsZW1lbnQuZ2V0VW5pdCgpKTsKKyAgICAgICAgCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdGhlVW5pdFJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiVW5pdCIpOworICAgICAgICAJdGhlVW5pdFJvb3QuYWRkKHRoZVVuaXQpOworICAgICAgICAJCisgICAgICAgIAl0aGVQRU5vZGUuYWRkKHRoZUNvbW1lbnRzUm9vdCk7CisgICAgICAgIAl0aGVQRU5vZGUuYWRkKHRoZURlc2NSb290KTsKKyAgICAgICAgCXRoZVBFTm9kZS5hZGQodGhlSURSb290KTsKKyAgICAgICAgCXRoZVBFTm9kZS5hZGQodGhlTU9Sb290KTsKKyAgICAgICAgCXRoZVBFTm9kZS5hZGQodGhlU3lub255bXMpOworICAgICAgICAJdGhlUEVOb2RlLmFkZCh0aGVUeXBlUm9vdCk7CisgICAgICAgIAl0aGVQRU5vZGUuYWRkKHRoZVVuaXRSb290KTsKKyAgICAgICAgCQorICAgICAgICAJcHJvZkVsZW1Sb290LmFkZCh0aGVQRU5vZGUpOworICAgICAgICB9CisJCQorCQlyb290LmFkZChwcm9mQXR0clJvb3QpOworCQlyb290LmFkZChyZXNBdHRyUm9vdCk7CisJCXJvb3QuYWRkKHByb2ZFbGVtUm9vdCk7CisJCQorCQlyZXR1cm4gbmV3IERlZmF1bHRUcmVlTW9kZWwocm9vdCk7CQkKKwkJCisJCQorCX0KKworCS8qKiBBdXRvLWdlbmVyYXRlZCBldmVudCBoYW5kbGVyIG1ldGhvZCAqLworCXByb3RlY3RlZCB2b2lkIG9wZW5GaWxlTWVudUl0ZW1BY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KXsKKwkJLy9UT0RPIGFkZCB5b3VyIGhhbmRsZXIgY29kZSBoZXJlCisJCQorCSAgICBTdHJpbmcgZmlsZW5hbWUgPSBGaWxlLnNlcGFyYXRvcisidG1wIjsKKwkgICAgSkZpbGVDaG9vc2VyIGZjID0gbmV3IEpGaWxlQ2hvb3NlcihuZXcgRmlsZShmaWxlbmFtZSkpOworCSAgICAKKwkgICAgLy8gU2hvdyBvcGVuIGRpYWxvZzsgdGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIHVudGlsIHRoZSBkaWFsb2cgaXMgY2xvc2VkCisJICAgIGludCBkZWNpc2lvbiA9IGZjLnNob3dPcGVuRGlhbG9nKHRoaXMpOworCSAgICAKKwkgICAgaWYoZGVjaXNpb24gIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKXsKKwkgICAgCXJldHVybjsgCisJICAgIH0KKwkgICAgCisJICAgIEZpbGUgc2VsRmlsZSA9IGZjLmdldFNlbGVjdGVkRmlsZSgpOworCSAgICAKKwkgICAgLy9jcmVhdGUgYSBidWZmZXJlZCByZWFkZXIsIHJlYWQgaXQgaW4sIGNyZWF0ZSBhIG5ldyBwcm9maWxlIGZyb20gdGhhdCBmaWxlCisJICAgIEZpbGVSZWFkZXIgZnIgPSBudWxsOworCSAgICAKKwkgICAgdHJ5eworCSAgICAJZnIgPSBuZXcgRmlsZVJlYWRlcihzZWxGaWxlKTsKKwkgICAgfQorCSAgICBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5lKXsKKwkgICAgCWZuZS5wcmludFN0YWNrVHJhY2UoKTsKKwkgICAgCVN5c3RlbS5vdXQucHJpbnRsbihmbmUuZ2V0TWVzc2FnZSgpKTsKKwkgICAgfQorCSAgICAKKwkgICAgY2hhciBbXSBidWYgPSBuZXcgY2hhclsyNTZdOworCSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJICAgIAorCSAgICBpbnQgbnVtUmVhZCA9IC0xOworCSAgICAKKwkgICAgdHJ5eworCQkgICAgd2hpbGUoKG51bVJlYWQgPSBmci5yZWFkKGJ1ZiwwLDI1NikpICE9IC0xKXsKKwkJICAgICAgc2IuYXBwZW5kKGJ1ZiwwLG51bVJlYWQpOworCQkgICAgICBidWYgPSBuZXcgY2hhclsyNTZdOworCQkgICAgfQorCSAgICB9CisJICAgIGNhdGNoKElPRXhjZXB0aW9uIGlvZSl7CisJICAgIAlpb2UucHJpbnRTdGFja1RyYWNlKCk7CisJICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaW9lLmdldE1lc3NhZ2UoKSk7CSAgICAJCisJICAgIH0KKwkgICAgCisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVhZCBpbiAiK3NiLnRvU3RyaW5nKCkpOworCSAgICB0cnl7CisJICAgIAljcmVhdGVkUHJvZmlsZSA9IG5ldyBQcm9maWxlKHNiLnRvU3RyaW5nKCkpOyAgICAgICAgCisJICAgIAlqRWRpdG9yUGFuZTEuc2V0VGV4dChuZXcgUHJvZmlsZVByaW50ZXIoY3JlYXRlZFByb2ZpbGUsImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi9kdGQvcHJvZi5kdGQiKS50b1hNTFN0cmluZygpKTsKKwkJCQorCQkJZ2V0SlRyZWUxKCkuc2V0TW9kZWwoZ2VuZXJhdGVNb2RlbEZyb21Qcm9maWxlKGNyZWF0ZWRQcm9maWxlKSk7CisJCQkvL2dldEpUcmVlMSgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IExlYWZMaXN0ZW5lcihnZXRKVHJlZTEoKSkpOworCSAgICB9Y2F0Y2goU0FYRXhjZXB0aW9uIHNlKXsKKwkgICAgCXNlLnByaW50U3RhY2tUcmFjZSgpOworCSAgICAJU3lzdGVtLm91dC5wcmludGxuKHNlLmdldE1lc3NhZ2UoKSk7CisJICAgIH0KKworCSAgICAKKwl9CisKKwkvKiogQXV0by1nZW5lcmF0ZWQgZXZlbnQgaGFuZGxlciBtZXRob2QgKi8KKwlwcm90ZWN0ZWQgdm9pZCBqQnV0dG9uMUFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpeworCQkvL1RPRE8gYWRkIHlvdXIgaGFuZGxlciBjb2RlIGhlcmUKKwkJCisJCS8vYmFzaWNhbGx5IHdlIHdhbnQgdG8gc2V0IHRoZSBjcmVhdGVkUHJvZmlsZSB0byBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY3VycmVudCB0cmVlIG1vZGVsCisJCS8vdGhlbiB3ZSB3YW50IHRvIHNldCB0aGUgamVkaXRvciBwYW5lIHRvIGhhdmUgdGhlIGNyZWF0ZWRQcm9maWxlVGV4dAorCQkKKwkJY3JlYXRlZFByb2ZpbGUgPSBnZW5lcmF0ZVByb2ZpbGVGcm9tTW9kZWwoZ2V0SlRyZWUxKCkuZ2V0TW9kZWwoKSk7CisJCS8vakVkaXRvclBhbmUxLnNldFRleHQoY3JlYXRlZFByb2ZpbGUudG9TdHJpbmcoKSk7CisJCWpFZGl0b3JQYW5lMS5zZXRUZXh0KG5ldyBQcm9maWxlUHJpbnRlcihjcmVhdGVkUHJvZmlsZSwiaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2R0ZC9wcm9mLmR0ZCIpLnRvWE1MU3RyaW5nKCkpOworCQkKKwl9CisKKwkvKiogQXV0by1nZW5lcmF0ZWQgZXZlbnQgaGFuZGxlciBtZXRob2QgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzYXZlTWVudUl0ZW1BY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KXsKKwkJLy9UT0RPIGFkZCB5b3VyIGhhbmRsZXIgY29kZSBoZXJlCisJICAgIAorCQkKKwkgICAgSkZpbGVDaG9vc2VyIGZjID0gbmV3IEpGaWxlQ2hvb3NlcigpOworCSAgICBpbnQgZGVjaXNpb24gPSBmYy5zaG93U2F2ZURpYWxvZyh0aGlzKTsKKwkgICAgCisJICAgIGlmKGRlY2lzaW9uICE9IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTil7CisJICAgIAlyZXR1cm47IAorCSAgICB9CisJICAgIAorCSAgICAvL2ZpcnN0IHRoaW5nIC0tIHNldCB0aGUgY3JlYXRlZCBwcm9maWxlIHRvIHRoZSBjdXJyZW50IHRyZWUKKwkgICAgY3JlYXRlZFByb2ZpbGUgPSBnZW5lcmF0ZVByb2ZpbGVGcm9tTW9kZWwoZ2V0SlRyZWUxKCkuZ2V0TW9kZWwoKSk7CisJICAgIAorCQlGaWxlIGZpbGUgPSBmYy5nZXRTZWxlY3RlZEZpbGUoKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICAKKyAgICAgICAgdHJ5eworICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCJUcnlpbmcgdG8gd3JpdGUgdG8gIitmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtIChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgCWZvcy53cml0ZShuZXcgUHJvZmlsZVByaW50ZXIoY3JlYXRlZFByb2ZpbGUsImh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi9kdGQvcHJvZi5kdGQiKS50b1hNTFN0cmluZygpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmUpeworICAgICAgICAJZm5lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKGZuZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGlvZSl7CisgICAgICAgIAlpb2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseXsKKyAgICAgICAgCXRyeXsKKyAgICAgICAgCQlmb3MuY2xvc2UoKTsKKyAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gaWdub3JlKXsKKyAgICAgICAgCQkvL2lnbm9yZQorICAgICAgICAJfQorICAgICAgICB9CisKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHJvZmlsZVRyZWUuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9wcm9maWxlVHJlZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjOWNmOTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHJvZmlsZVRyZWUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5ndWk7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOworCisKK3B1YmxpYyBjbGFzcyBwcm9maWxlVHJlZSBleHRlbmRzIEpUcmVleworCQorCXB1YmxpYyBwcm9maWxlVHJlZSgpeworCQlzZXRFZGl0YWJsZSh0cnVlKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBkdG1Sb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlByb2ZpbGUiKTsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByZXNBdHRyUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJSZXNvdXJjZSBBdHRyaWJ1dGVzIik7CisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvZkF0dHJSb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlByb2ZpbGUgQXR0cmlidXRlcyIpOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHByb2ZFbGVtUm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJQcm9maWxlIEVsZW1lbnRzIik7CisJCWR0bVJvb3QuYWRkKHJlc0F0dHJSb290KTsKKwkJZHRtUm9vdC5hZGQocHJvZkF0dHJSb290KTsKKwkJZHRtUm9vdC5hZGQocHJvZkVsZW1Sb290KTsKKwkJRGVmYXVsdFRyZWVNb2RlbCB0aGVNb2RlbCA9IG5ldyBEZWZhdWx0VHJlZU1vZGVsKGR0bVJvb3QpOworCQlzZXRNb2RlbCh0aGVNb2RlbCk7CisJfQorCQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvZ3VpL3BzdHJ1Y3RzL1Byb2ZpbGVBdHRyaWJ1dGVzUHJpbnRlci5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvZ3VpL3BzdHJ1Y3RzL1Byb2ZpbGVBdHRyaWJ1dGVzUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxZDU3YWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHN0cnVjdHMvUHJvZmlsZUF0dHJpYnV0ZXNQcmludGVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBDcmVhdGVkIG9uIEp1biAyNSwgMjAwNAorICoKKyAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5ndWkucHN0cnVjdHM7CisKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9maWxlQXR0cmlidXRlc1ByaW50ZXIgeworCQorCXByaXZhdGUgUHJvZmlsZUF0dHJpYnV0ZXMgbXlQcm9mQXR0cmlidXRlcz1udWxsOworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBQcm9maWxlQXR0cmlidXRlc1ByaW50ZXIoUHJvZmlsZUF0dHJpYnV0ZXMgcGEpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJCW15UHJvZkF0dHJpYnV0ZXMgPSBwYTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1hNTFN0cmluZygpeworCQlTdHJpbmcgclN0cj0iIjsKKwkJCisJCXJTdHIrPSI8cHJvZkF0dHJpYnV0ZXM+XG4iOworCQlyU3RyKz0iXHQ8cHJvZklkPiIrbXlQcm9mQXR0cmlidXRlcy5nZXRJRCgpKyI8L3Byb2ZJZD5cbiI7CisJCXJTdHIrPSJcdDxwcm9mVHlwZT4iK215UHJvZkF0dHJpYnV0ZXMuZ2V0VHlwZSgpKyI8L3Byb2ZUeXBlPlxuIjsKKwkJclN0cis9Ilx0PHByb2ZWZXJzaW9uPiIrbXlQcm9mQXR0cmlidXRlcy5nZXRWZXJzaW9uKCkrIjwvcHJvZlZlcnNpb24+XG4iOworCQlyU3RyKz0iXHQ8cHJvZlN0YXR1c0lkPiIrbXlQcm9mQXR0cmlidXRlcy5nZXRTdGF0dXNJRCgpKyI8L3Byb2ZTdGF0dXNJZD5cbiI7CisJCXJTdHIrPSJcdDxwcm9mU2VjdXJpdHlUeXBlPiIrbXlQcm9mQXR0cmlidXRlcy5nZXRTZWN1cml0eVR5cGUoKSsiPC9wcm9mU2VjdXJpdHlUeXBlPlxuIjsKKwkJclN0cis9Ilx0PHByb2ZQYXJlbnRJZD4iK215UHJvZkF0dHJpYnV0ZXMuZ2V0UGFyZW50KCkrIjwvcHJvZlBhcmVudElkPlxuIjsKKwkJCisJCWZvcihJdGVyYXRvciBpID0gbXlQcm9mQXR0cmlidXRlcy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkJU3RyaW5nIHRoZUNoaWxkID0gKFN0cmluZylpLm5leHQoKTsKKwkJCXJTdHIrPSJcdDxwcm9mQ2hpbGRJZD4iK3RoZUNoaWxkKyI8L3Byb2ZDaGlsZElkPlxuIjsKKwkJfQorCQkKKwkJclN0cis9Ilx0PHByb2ZSZWdBdXRob3JpdHk+IitteVByb2ZBdHRyaWJ1dGVzLmdldFJlZ0F1dGhvcml0eSgpKyI8L3Byb2ZSZWdBdXRob3JpdHk+XG4iOworCQkKKwkJZm9yKEl0ZXJhdG9yIGkgPSBteVByb2ZBdHRyaWJ1dGVzLmdldFJldmlzaW9uTm90ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCVN0cmluZyB0aGVOb3RlID0gKFN0cmluZylpLm5leHQoKTsKKwkJCXJTdHIrPSJcdDxwcm9mUmV2aXNpb25Ob3RlPiIrdGhlTm90ZSsiPC9wcm9mUmV2aXNpb25Ob3RlPlxuIjsKKwkJfQorCQkKKwkJclN0cis9IjwvcHJvZkF0dHJpYnV0ZXM+XG5cbiI7CisJCQorCisJCXJldHVybiByU3RyOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9wc3RydWN0cy9Qcm9maWxlRWxlbWVudFByaW50ZXIuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9wc3RydWN0cy9Qcm9maWxlRWxlbWVudFByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NWU5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvZ3VpL3BzdHJ1Y3RzL1Byb2ZpbGVFbGVtZW50UHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQ3JlYXRlZCBvbiBKdW4gMjUsIDIwMDQKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuZ3VpLnBzdHJ1Y3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUVsZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVFbGVtZW50UHJpbnRlciB7CisJcHJpdmF0ZSBQcm9maWxlRWxlbWVudCBteVByb2ZpbGVFbGVtZW50PW51bGw7CisJCisJLyoqCisJICogCisJICovCisJcHVibGljIFByb2ZpbGVFbGVtZW50UHJpbnRlcihQcm9maWxlRWxlbWVudCBwZSkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwkJbXlQcm9maWxlRWxlbWVudCA9IHBlOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKCl7CisJCVN0cmluZyByU3RyPSIiOworCQkKKwkJICByU3RyKz0iPHByb2ZFbGVtZW50PlxuIjsKKwkJICByU3RyKz0iXHQ8ZWxlbU5hbWU+IitteVByb2ZpbGVFbGVtZW50LmdldE5hbWUoKSsiPC9lbGVtTmFtZT5cbiI7CisJCSAgclN0cis9Ilx0PGVsZW1NYXhPY2N1cnJlbmNlPiIrbXlQcm9maWxlRWxlbWVudC5nZXRNYXhPY2N1cnJlbmNlKCkrIjwvZWxlbU1heE9jY3VycmVuY2U+XG4iOworCQkgIHJTdHIrPSJcdDxlbGVtTWF4VmFsdWU+IitteVByb2ZpbGVFbGVtZW50LmdldE1heFZhbHVlKCkrIjwvZWxlbU1heFZhbHVlPlxuIjsKKwkJICByU3RyKz0iXHQ8ZWxlbU1pblZhbHVlPiIrbXlQcm9maWxlRWxlbWVudC5nZXRNaW5WYWx1ZSgpKyI8L2VsZW1NaW5WYWx1ZT5cbiI7CisJCSAgCisJCSAgZm9yKEl0ZXJhdG9yIGkgPSBteVByb2ZpbGVFbGVtZW50LmdldFZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgIAlTdHJpbmcgdGhlVmFsdWUgPSAoU3RyaW5nKWkubmV4dCgpOworCQkgIAlyU3RyKz0iPGVsZW1WYWx1ZT4iK3RoZVZhbHVlKyI8L2VsZW1WYWx1ZT5cbiI7CisJCSAgfQorCQkgIHJTdHIrPSJcdDxlbGVtQ29tbWVudD4iK215UHJvZmlsZUVsZW1lbnQuZ2V0Q29tbWVudHMoKSsiPC9lbGVtQ29tbWVudD5cbiI7CisJCSAgclN0cis9IjwvcHJvZkVsZW1lbnQ+XG4iOworCQlyZXR1cm4gclN0cjsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHN0cnVjdHMvUHJvZmlsZVByaW50ZXIuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9wc3RydWN0cy9Qcm9maWxlUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyZjUyYTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHN0cnVjdHMvUHJvZmlsZVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIENyZWF0ZWQgb24gSnVuIDI1LCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmd1aS5wc3RydWN0czsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRWxlbWVudDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9maWxlUHJpbnRlciB7CisJCisJcHJpdmF0ZSBQcm9maWxlIG15UHJvZmlsZT1udWxsOworCXByaXZhdGUgU3RyaW5nIGR0ZFVybD1udWxsOworCQorCS8qKgorCSAqIFByZXR0eSBwcmludGluZyBjbGFzcyBmb3IgYSBwcm9maWxlLCB1c2luZyBsaWdodHdlaWdodCwgc3RyaW5nCisJICogY29uY2F0ZW5hdGlvbiBjbGFzc2VzIGFuZCBtZXRob2RzCisJICovCisJcHVibGljIFByb2ZpbGVQcmludGVyKFByb2ZpbGUgcCxTdHJpbmcgcHJvZkRURFVSTCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwkJbXlQcm9maWxlID0gcDsKKwkJZHRkVXJsID0gcHJvZkRURFVSTDsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1hNTFN0cmluZygpeworCQlTdHJpbmcgclN0ciA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgPz5cbiI7CisJCXJTdHIrPSI8IURPQ1RZUEUgcHJvZmlsZSBTWVNURU0gXCIiK2R0ZFVybCsiXCI+XG5cbiI7CisJCXJTdHIrPSI8cHJvZmlsZT5cbiI7CisKKwkJCisJCVByb2ZpbGVBdHRyaWJ1dGVzUHJpbnRlciBwYXAgPSBuZXcgUHJvZmlsZUF0dHJpYnV0ZXNQcmludGVyKG15UHJvZmlsZS5nZXRQcm9maWxlQXR0cmlidXRlcygpKTsKKwkJclN0cis9cGFwLnRvWE1MU3RyaW5nKCk7CisJCQorCQkKKwkJUmVzb3VyY2VBdHRyaWJ1dGVzUHJpbnRlciByYXAgPSBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzUHJpbnRlcihteVByb2ZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkpOworCQlyU3RyKz1yYXAudG9YTUxTdHJpbmcoKTsKKworCQkKKwkJZm9yKEl0ZXJhdG9yIGkgPSBteVByb2ZpbGUuZ2V0UHJvZmlsZUVsZW1lbnRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQlTdHJpbmcgcHJvZkVsZW1OYW1lID0gKFN0cmluZylpLm5leHQoKTsKKwkJCQorCQkJUHJvZmlsZUVsZW1lbnQgcGUgPSAoUHJvZmlsZUVsZW1lbnQpbXlQcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpLmdldChwcm9mRWxlbU5hbWUpOworCQkJUHJvZmlsZUVsZW1lbnRQcmludGVyIHBQcmludGVyID0gbmV3IFByb2ZpbGVFbGVtZW50UHJpbnRlcihwZSk7CisJCQlyU3RyKz1wUHJpbnRlci50b1hNTFN0cmluZygpOworCQl9CisJCQorCQlyU3RyKz0iPC9wcm9maWxlPlxuIjsKKwkJCisJCXJldHVybiByU3RyOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2d1aS9wc3RydWN0cy9SZXNvdXJjZUF0dHJpYnV0ZXNQcmludGVyLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHN0cnVjdHMvUmVzb3VyY2VBdHRyaWJ1dGVzUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiYzFhOTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9ndWkvcHN0cnVjdHMvUmVzb3VyY2VBdHRyaWJ1dGVzUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIENyZWF0ZWQgb24gSnVuIDE4LCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmd1aS5wc3RydWN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlJlc291cmNlQXR0cmlidXRlczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICoKKyAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VBdHRyaWJ1dGVzUHJpbnRlciB7CisJCisJcHJpdmF0ZSBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzQXR0cj1udWxsOworCQorCS8qKgorCSAqIDxwPkNvbnN0cnVjdHMgYSBuZXcgUmVzb3VyY2UgQXR0cmlidXRlcyBwcmludGVyIGZyb20gYSB7QGxpbmsgUmVzb3VyY2VBdHRyaWJ1dGVzfQorCSAqIG9iamVjdC48L3A+CisJICovCisJcHVibGljIFJlc291cmNlQXR0cmlidXRlc1ByaW50ZXIoUmVzb3VyY2VBdHRyaWJ1dGVzIHIpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJCXJlc0F0dHIgPSByOworCQkKKwl9CisJCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VBdHRyaWJ1dGVzKFJlc291cmNlQXR0cmlidXRlcyByKXtyZXNBdHRyPXI7fQorCXB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMgZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCl7cmV0dXJuIHJlc0F0dHI7fQorCQorCXB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoKXsKKwkJU3RyaW5nIHJTdHI9IiI7CisJCQorCQkgICByU3RyKz0iPHJlc0F0dHJpYnV0ZXM+XG4iOworCQkgICAKKwkJICAgclN0cis9Ilx0PElkZW50aWZpZXI+IityZXNBdHRyLmdldElkZW50aWZpZXIoKSsiPC9JZGVudGlmaWVyPlxuIjsKKwkJICAgclN0cis9Ilx0PFRpdGxlPiIrcmVzQXR0ci5nZXRUaXRsZSgpKyI8L1RpdGxlPlxuIjsKKwkJICAgclN0cis9Ilx0PHJlc0NsYXNzPiIrcmVzQXR0ci5nZXRSZXNDbGFzcygpKyI8L3Jlc0NsYXNzPlxuIjsKKwkJICAgclN0cis9Ilx0PHJlc0FnZ3JlZ2F0aW9uPiIrcmVzQXR0ci5nZXRSZXNBZ2dyZWdhdGlvbigpKyI8L3Jlc0FnZ3JlZ2F0aW9uPlxuIjsKKworCQkgICBmb3IoSXRlcmF0b3IgaSA9IHJlc0F0dHIuZ2V0UmlnaHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCSAgIAlTdHJpbmcgdGhlUmlnaHQgPSAoU3RyaW5nKWkubmV4dCgpOworCQkgICAJclN0cis9Ilx0PFJpZ2h0PiIrdGhlUmlnaHQrIjwvUmlnaHQ+XG4iOworCQkgICB9CisJCSAgIAorCQkgICBmb3IoSXRlcmF0b3IgaSA9IHJlc0F0dHIuZ2V0U291cmNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZVNvdXJjZSA9IChTdHJpbmcpaS5uZXh0KCk7CisJCSAgIAlyU3RyKz0iXHQ8U291cmNlPiIrdGhlU291cmNlKyI8L1NvdXJjZT5cbiI7CisJCSAgIH0KKwkJICAgCisJCSAgIGZvcihJdGVyYXRvciBpID0gcmVzQXR0ci5nZXRTdWJqZWN0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZVN1YmplY3QgPSAoU3RyaW5nKWkubmV4dCgpOworCQkgICAJclN0cis9Ilx0PFN1YmplY3Q+Iit0aGVTdWJqZWN0KyI8L1N1YmplY3Q+XG4iOworCQkgICB9CisJCSAgIAorCQkgICBmb3IoSXRlcmF0b3IgaSA9IHJlc0F0dHIuZ2V0Rm9ybWF0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZUZvcm1hdCA9IChTdHJpbmcpaS5uZXh0KCk7CisJCSAgIAlyU3RyKz0iXHQ8Rm9ybWF0PiIrdGhlRm9ybWF0KyI8L0Zvcm1hdD5cbiI7CisJCSAgIH0KKwkJICAgCisJCSAgIGZvcihJdGVyYXRvciBpID0gcmVzQXR0ci5nZXRDcmVhdG9ycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZUNyZWF0b3IgPSAoU3RyaW5nKWkubmV4dCgpOworCQkgICAJclN0cis9Ilx0PENyZWF0b3I+Iit0aGVDcmVhdG9yKyI8L0NyZWF0b3I+XG4iOworCQkgICB9CisJCSAgIAorCQkgICBmb3IoSXRlcmF0b3IgaSA9IHJlc0F0dHIuZ2V0UHVibGlzaGVycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZVB1Ymxpc2hlciA9IChTdHJpbmcpaS5uZXh0KCk7CisJCSAgIAlyU3RyKz0iXHQ8UHVibGlzaGVyPiIrdGhlUHVibGlzaGVyKyI8L1B1Ymxpc2hlcj5cbiI7CisJCSAgIH0KKwkJICAgCisJCSAgIGZvcihJdGVyYXRvciBpID0gcmVzQXR0ci5nZXRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZVR5cGUgPSAoU3RyaW5nKWkubmV4dCgpOworCQkgICAJclN0cis9Ilx0PFR5cGU+Iit0aGVUeXBlKyI8L1R5cGU+XG4iOworCQkgICB9CisJCSAgIAorCQkgICBmb3IoSXRlcmF0b3IgaSA9IHJlc0F0dHIuZ2V0UmVzQ29udGV4dHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJICAgCVN0cmluZyB0aGVDb250ZXh0ID0gKFN0cmluZylpLm5leHQoKTsKKwkJICAgCXJTdHIrPSJcdDxyZXNDb250ZXh0PiIrdGhlQ29udGV4dCsiPC9yZXNDb250ZXh0PlxuIjsKKwkJICAgfQorCQkgICAKKwkJICAgZm9yKEl0ZXJhdG9yIGkgPSByZXNBdHRyLmdldFJlc0xvY2F0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZUxvY2F0aW9uID0gKFN0cmluZylpLm5leHQoKTsKKwkJICAgCXJTdHIrPSJcdDxyZXNMb2NhdGlvbj4iK3RoZUxvY2F0aW9uKyI8L3Jlc0xvY2F0aW9uPlxuIjsKKwkJICAgfQorCQkgICAKKwkJICAgZm9yKEl0ZXJhdG9yIGkgPSByZXNBdHRyLmdldENvbnRyaWJ1dG9ycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZUNvbnRyaWJ1dG9yID0gKFN0cmluZylpLm5leHQoKTsKKwkJICAgCXJTdHIrPSJcdDxDb250cmlidXRvcj4iK3RoZUNvbnRyaWJ1dG9yKyI8L0NvbnRyaWJ1dG9yPlxuIjsKKwkJICAgfQorCQkgICAKKwkJICAgZm9yKEl0ZXJhdG9yIGkgPSByZXNBdHRyLmdldENvdmVyYWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZUNvdmVyYWdlID0gKFN0cmluZylpLm5leHQoKTsKKwkJICAgCXJTdHIrPSJcdDxDb3ZlcmFnZT4iK3RoZUNvdmVyYWdlKyI8L0NvdmVyYWdlPlxuIjsKKwkJICAgfQorCQkgICAKKwkJICAgZm9yKEl0ZXJhdG9yIGkgPSByZXNBdHRyLmdldExhbmd1YWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkgICAJU3RyaW5nIHRoZUxhbmcgPSAoU3RyaW5nKWkubmV4dCgpOworCQkgICAJclN0cis9Ilx0PExhbmd1YWdlPiIrdGhlTGFuZysiPC9MYW5ndWFnZT5cbiI7CisJCSAgIH0KKwkJICAgCisJCSAgIGZvcihJdGVyYXRvciBpID0gcmVzQXR0ci5nZXRSZWxhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJICAgCVN0cmluZyB0aGVSZWxhdGlvbiA9IChTdHJpbmcpaS5uZXh0KCk7CisJCSAgIAlyU3RyKz0iXHQ8UmVsYXRpb24+Iit0aGVSZWxhdGlvbisiPC9SZWxhdGlvbj5cbiI7CisJCSAgIH0KKwkJICAgCisJCSAgIHJTdHIrPSI8L3Jlc0F0dHJpYnV0ZXM+XG4iOworCQkgICAKKwkJcmV0dXJuIHJTdHI7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvRGF0YWJhc2VQcm9maWxlTWFuYWdlci5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvRGF0YWJhc2VQcm9maWxlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczZWIyOTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9EYXRhYmFzZVByb2ZpbGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorLy8gbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCisvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisvLyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKy8vIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorLy8gdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy8gV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorLy8gTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKy8vIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5ET01QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS4qOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIERhdGFiYXNlUHJvZmlsZU1hbmFnZXIuamF2YQorKioKKyoqIEBhdXRob3IgRGFuIENyaWNodG9uCisqKiAKKyoqIGRhdGU6IDExLzEwLzIwMDAKKyoqCisqKiBkZXNjcmlwdGlvbjogTWFwIGEgcHJvZmlsZSBpbnRvL291dCBvZiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFiYXNlUHJvZmlsZU1hbmFnZXIgaW1wbGVtZW50cyBQcm9maWxlTWFuYWdlcgoreworCS8qKiBBZGQgYW4gZWxlbWVudCB0byB0aGUgZ2l2ZW4gbm9kZSBpbiBhbiBYTUwgZG9jdW1lbnQuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBUbyB3aGF0IG5vZGUgdG8gYWRkIGEgbmV3IGVsZW1lbnQuCisJICogQHBhcmFtIG5hbWUgV2hhdCB0aGUgbmV3IGVsZW1lbnQgc2hvdWxkIGJlIG5hbWVkLgorCSAqIEBwYXJhbSB2YWx1ZSBXaGF0IHN0cmluZyB2YWx1ZSB0aGUgZWxlbWVudCBzaG91bGQgY29udGFpbjsgaWYgbnVsbCwgdGhlbiBkb24ndCBhZGQgdGhlIGVsZW1lbnQuCisJICogQHRocm93cyBET01FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCWlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47CisJCVhNTC5hZGQobm9kZSwgbmFtZSwgdmFsdWUudHJpbSgpKTsKKwl9CisKKwkvKiogRHVtcCBwcm9maWxlcyBpbiB0aGUgZGF0YWJhc2UuCisJICoKKwkgKiBUaGlzIHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9maWxlcy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHByb2ZpbGVzIGluIHRoZSBkYXRhYmFzZSwgYXMgYSBsaXN0LgorCSAqIEB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIGFic3RyYWN0IExpc3QgZ2V0UHJvZmlsZXMoQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsKKworICAgIAlDb25uZWN0aW9uIGNvbm47CisgICAJUHJvcGVydGllcyBwcm9wczsKKworCisgICAgCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgCSAqKgorICAgIAkgKiogRGF0YWJhc2VQcm9maWxlTWFuYWdlcgorICAgICAJICoqCisgICAgCSAqKgorICAgIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisKKyAgICAJcHVibGljIERhdGFiYXNlUHJvZmlsZU1hbmFnZXIoUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJdGhpcyhwcm9wcywgb3BlbkNvbm5lY3Rpb24ocHJvcHMpKTsKKyAgICAJfQorCisgICAgCXB1YmxpYyBEYXRhYmFzZVByb2ZpbGVNYW5hZ2VyIChQcm9wZXJ0aWVzIHByb3BzLCBDb25uZWN0aW9uIGNvbm4pIAorICAgIAl7CisJCXRoaXMuY29ubiA9IGNvbm47CisJCXRoaXMucHJvcHMgPSBwcm9wczsKKyAgICAJfQorCisKKyAgICAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAJKioKKyAgICAJKiogZmluZFByb2ZpbGVzCisgICAgCSoqCisgICAgCSoqICBSZXR1cm5zIGEgbGlzdCBvZiBtYXRjaGluZyBwcm9maWxlcworICAgIAkqKgorICAgIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisgICAgCXB1YmxpYyBMaXN0IGZpbmRQcm9maWxlcyhYTUxRdWVyeSBxdWVyeSkgdGhyb3dzIERPTUV4Y2VwdGlvbiwgUHJvZmlsZUV4Y2VwdGlvbiAKKyAgICAJeworCQl0cnkKKwkJeworCQkJcmV0dXJuKGZpbmRQcm9maWxlcyhjb25uLCBxdWVyeSkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgbmV3IFByb2ZpbGVFeGNlcHRpb24gKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorICAgIAl9CisKKyAgICAJcHVibGljIGFic3RyYWN0IExpc3QgZmluZFByb2ZpbGVzKENvbm5lY3Rpb24gY29ubiwgWE1MUXVlcnkgcXVlcnkpIHRocm93cyBET01FeGNlcHRpb24sIFByb2ZpbGVFeGNlcHRpb247CisKKworCXB1YmxpYyB2b2lkIGFkZChQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKworCQl0cnkKKwkJeworCQkJYWRkKGNvbm4sIHByb2ZpbGUpOworCQkJY29ubi5jb21taXQoKTsKKwkJfQorCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCisJCXsKKwkJCXRocm93IG5ldyBQcm9maWxlU1FMRXhjZXB0aW9uIChlKTsKKwkJfQorCX0KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGQoQ29ubmVjdGlvbiBjb25uLCBQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIDsKKwkKKworCXB1YmxpYyB2b2lkIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uCisJeworCQl0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGwoY29ubiwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIH0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsJCisJCQl0cnkgeworCQkJCWNvbm4ucm9sbGJhY2soKTsKKwkJCX1jYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisJCQkJdGhyb3cgbmV3IFByb2ZpbGVTUUxFeGNlcHRpb24oc2UpOworCQkJfQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2ZpbGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRBbGwoQ29ubmVjdGlvbiBjb25uLENvbGxlY3Rpb24gY29sbGVjdGlvbikgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcihDb25uZWN0aW9uIGNvbm4pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIDsKKworCXB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24gCisJeworCQkvLyBDcmVhdGUgZGF0YWJhc2UgY29ubmVjdGlvbgorCisJCXRyeQorCQl7CisJCQljbGVhcihjb25uKTsKKwkJCWNvbm4uY29tbWl0KCk7CisJCX0KKwkJY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgUHJvZmlsZVNRTEV4Y2VwdGlvbiAoZSk7CisJCX0KKwl9CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoUHJvZmlsZSBwcm9maWxlKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZCIpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisJfQorCisJcHVibGljIGFic3RyYWN0IFByb2ZpbGUgZ2V0KENvbm5lY3Rpb24gY29ubiwgU3RyaW5nIHByb2ZJRCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwlwdWJsaWMgUHJvZmlsZSBnZXQoU3RyaW5nIHByb2ZJZCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24geworCQkvLyBDcmVhdGUgZGF0YWJhc2UgY29ubmVjdGlvbgorCisJCXRyeQorCQl7IAorCQkJcmV0dXJuKGdldChjb25uLCBwcm9mSWQpKTsKKwkJfQorCQljYXRjaCAoUHJvZmlsZUV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsKCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKwl9CisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisJfQorCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIik7CisJfQorCisJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlKENvbm5lY3Rpb24gY29ubiwgU3RyaW5nIHByb2ZJZCwgU3RyaW5nIHZlcnNpb24pCisJCSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsKKworCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlbW92ZShDb25uZWN0aW9uIGNvbm4sIFN0cmluZyBwcm9mSWQpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOworCisKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmUoU3RyaW5nIHByb2ZJZCwgU3RyaW5nIHZlcnNpb24pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIAorCXsKKwkJLy8gQ3JlYXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24KKworCQl0cnkKKwkJeworCQkJYm9vbGVhbiBzdGF0dXMgPSByZW1vdmUoY29ubiwgcHJvZklkLCB2ZXJzaW9uKTsKKwkJCWNvbm4uY29tbWl0KCk7CisJCQlyZXR1cm4oc3RhdHVzKTsKKwkJfQorCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCisJCXsKKwkJCXRocm93IG5ldyBQcm9maWxlU1FMRXhjZXB0aW9uIChlKTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIHJlbW92ZShTdHJpbmcgcHJvZklkKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBkYXRhYmFzZSBjb25uZWN0aW9uCisKKwkJdHJ5CisJCXsKKwkJCWJvb2xlYW4gc3RhdHVzID0gcmVtb3ZlKGNvbm4sIHByb2ZJZCk7CisJCQljb25uLmNvbW1pdCgpOworCQkJcmV0dXJuKHN0YXR1cyk7CisJCX0KKwkJY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgUHJvZmlsZVNRTEV4Y2VwdGlvbiAoZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgaW50IHNpemUoKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiB7CisJCXRyeQorCQl7CisJCQlyZXR1cm4oc2l6ZShjb25uKSk7CisJCX0KKwkJY2F0Y2ggKFByb2ZpbGVFeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgZTsKKwkJfQorCisJfQorCisJcHVibGljIGFic3RyYWN0IGludCBzaXplKENvbm5lY3Rpb24gY29ubikgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24gOworCisJcHVibGljIHZvaWQgcmVwbGFjZShQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24KKworCQl0cnkKKwkJeworCQkJcmVwbGFjZShjb25uLCBwcm9maWxlKTsKKwkJCWNvbm4uY29tbWl0KCk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisJcHVibGljIGFic3RyYWN0IHZvaWQgcmVwbGFjZShDb25uZWN0aW9uIGNvbm4sIFByb2ZpbGUgcHJvZmlsZSkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24gOworCisJcHJvdGVjdGVkICBzdGF0aWMgQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgU1FMRXhjZXB0aW9uLCBQcm9maWxlRXhjZXB0aW9uCisJeworCQkvLyBsb2FkIEpEQkMgZHJpdmVyCisJCVN0cmluZyBkcml2ZXIgPSBwcm9wcy5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LnV0aWwuSkRCQ19EQi5kcml2ZXIiLCJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIik7CisJCXRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkF0dGVtcHRpbmcgdG8gbG9hZCBjbGFzcyAiICsgZHJpdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoZHJpdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTG9hZGVkICIgKyBkcml2ZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2ZpbGVFeGNlcHRpb24oIkNhbid0IGxvYWQgSkRCQyBkcml2ZXIgXCIiICsgZHJpdmVyICsgIlwiOiAiICtlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAKKworCQkvLyBnZXQgY29ubmVjdGlvbgorCQlTdHJpbmcgdXJsID0gcHJvcHMuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC51dGlsLkpEQkNfREIudXJsIiwgImpkYmM6b3JhY2xlOkAiKTsKKwkJU3RyaW5nIGRhdGFiYXNlID0gcHJvcHMuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC51dGlsLkpEQkNfREIuZGF0YWJhc2UiKTsKKwkJaWYoZGF0YWJhc2UgIT0gbnVsbCkgdXJsICs9IGRhdGFiYXNlOworCisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gRHJpdmVyTWFuYWdlci5nZXRDb25uZWN0aW9uKHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJcHJvcHMuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC51dGlsLkpEQkNfREIudXNlciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgCQlwcm9wcy5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LnV0aWwuSkRCQ19EQi5wYXNzd29yZCIpKTsKKworCQljb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworCQlyZXR1cm4gY29ubjsKKyAgICAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL1Byb2ZpbGVIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9Qcm9maWxlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmFlM2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9Qcm9maWxlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCisvKioKKyAqIEludGVyZmFjZSBvZiBhIHByb2ZpbGUgaGFuZGxlci4KKyAqCisgKiBBIHByb2ZpbGUgaGFuZGxlciBjYW4gc2VhcmNoIGZvciBwcm9maWxlcyBvciByZXRyaWV2ZSBhIHNpbmdsZSBwcm9maWxlIGJ5IGl0cyBJRC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvZmlsZUhhbmRsZXIgeworCS8qKgorCSAqIEZpbmQgYSBzZXQgb2YgcHJvZmlsZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gPHZhcj5xdWVyeTwvdmFyPi4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHNlYXJjaHMgdGhlIHByb2ZpbGVzIHByb3ZpZGVkIGJ5IHRoaXMgcHJvZmlsZSBzZXJ2aWNlIHByb3ZpZGVyCisJICogYmFzZWQgb24gY3JpdGVyaWEgaW4gdGhlIDx2YXI+cXVlcnk8L3Zhcj4uICBJdCByZXR1cm5zIGFuIFhNTCBkb2N1bWVudAorCSAqIGRlc2NyaWJpbmcgdGhlIHByb2ZpbGVzIGFuZCBwcm9maWxlIGVsZW1lbnRzIHRoYXQgbWF0Y2guCisJICoKKwkgKiBAcGFyYW0gcXVlcnkgU2VhcmNoIGNyaXRlcmlhLgorCSAqIEByZXR1cm4gTGlzdCBvZiBtYXRjaGluZyB7QGxpbmsgUHJvZmlsZX0gb2JqZWN0cy4KKwkgKiBAdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24gSWYgYW55IG90aGVyIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlMaXN0IGZpbmRQcm9maWxlcyhYTUxRdWVyeSBxdWVyeSkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBHZXQgYSBwcm9maWxlLgorCSAqCisJICogQHBhcmFtIHByb2ZJRCBJRCBvZiB0aGUgcHJvZmlsZSB0byBnZXQuCisJICogQHJldHVybiBUaGUgcHJvZmlsZSB3aXRoIHRoZSBnaXZlbiA8dmFyPnByb2ZJRDwvdmFyPiwgb3IgbnVsbCBpZiBpdCdzIG5vdCBmb3VuZC4KKwkgKiBAdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKwkgKi8KKwlQcm9maWxlIGdldChTdHJpbmcgcHJvZklEKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBHZXQgbXkgSUQuCisJICoKKwkgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGlzIHByb2ZpbGUgaGFuZGxlciBpbiBzb21lIHdheS4KKwkgKi8KKwlTdHJpbmcgZ2V0SUQoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL1Byb2ZpbGVNYW5hZ2VyLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9Qcm9maWxlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3ZDE3YzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9Qcm9maWxlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKKy8vIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworLy8gZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisvLyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKy8vIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKy8vIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKy8vIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisvLyB0aGUgTGljZW5zZS4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVyczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCisvKioKKyAqIEludGVyZmFjZSBvZiBhIHByb2ZpbGUgbWFuYWdlci4KKyAqCisgKiBBIHByb2ZpbGUgbWFuYWdlciBjYW4gbWFuYWdlIHByb2ZpbGVzIGJ5IGFkZGluZywgcmVtb3ZpbmcsIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS0tLWluCisgKiBhZGRpdGlvbiB0byBzZWFyY2hpbmcgdGhlbS4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMS4xLjEgJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb2ZpbGVNYW5hZ2VyIGV4dGVuZHMgUHJvZmlsZUhhbmRsZXIgeworCS8qKgorCSAqIEFkZCBhIHByb2ZpbGUgaW50byB0aGUgc2V0IG9mIHByb2ZpbGVzIG1hbmFnZWQgYnkgdGhpcyBwcm9maWxlIHNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGFkZCBvciByZXBsYWNlLgorCSAqIEB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorCSAqLworCXZvaWQgYWRkKFByb2ZpbGUgcHJvZmlsZSkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBBZGQgYWxsIG9mIHRoZSBwcm9maWxlcyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0byB0aGUgc2V0IG1hbmFnZWQgYnkgdGhpcworCSAqIHNlcnZlci4KKwkgKgorCSAqIEFueSBwcm9maWxlcyB0aGF0IGFscmVhZHkgZXhpc3QgKGFzIGlkZW50aWZpZWQgYnkgdGhlaXIgcHJvZmlsZSBJRHMpIGFyZSByZXBsYWNlZC4KKwkgKgorCSAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gb2Yge0BsaW5rIFByb2ZpbGV9cyB0byBhZGQuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJdm9pZCBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIENsZWFyIGFsbCBwcm9maWxlcy4KKwkgKgorCSAqIFRoaXMgaXJyZXZvY2FibHkgcmVtb3ZlcyBhbGwgcHJvZmlsZXMgZnJvbSB0aGUgc2VydmVyLCBsZWF2aW5nIGl0IHdpdGggbm9uZS4KKwkgKgorCSAqIEB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorCSAqLworCXZvaWQgY2xlYXIoKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFRlbGwgaWYgdGhlIGdpdmVuIHByb2ZpbGUgaXMgbWFuYWdlZCBieSB0aGlzIHNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGNoZWNrLgorCSAqIEByZXR1cm4gVHJ1ZSBpZiA8dmFyPnByb2ZpbGU8L3Zhcj4gaXMgcHJlc2VudCBpbiB0aGUgc2VydmVyLCBmYWxzZSBvdGhlcndpc2UuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJYm9vbGVhbiBjb250YWlucyhQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOworCisJLyoqCisJICogVGVsbCBpZiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiBwcm9maWxlcyBhcmUgbWFuYWdlZCBieSB0aGlzIHNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBQcm9maWxlfXMgdG8gY2hlY2suCisJICogQHJldHVybiBUcnVlIGlmIGV2ZXJ5IHtAbGluayBQcm9maWxlfSBpbiA8dmFyPmNvbGxlY3Rpb248L3Zhcj4gYXJlIHByZXNlbnQgaW4KKwkgKiB0aGUgc2VydmVyLCBmYWxzZSBvdGhlcndpc2UuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOworCisJLyoqCisJICogR2V0IGFsbCBwcm9maWxlcy4KKwkgKgorCSAqIEByZXR1cm4gIEEgY29sbGVjdGlvbiBvZiBwcm9maWxlcworCSAqIEB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorCSAqLworCUNvbGxlY3Rpb24gZ2V0QWxsKCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBUZWxsIGlmIHRoZSBzZXQgb2YgcHJvZmlsZXMgbWFuYWdlZCBieSB0aGlzIHNlcnZlciBpcyBlbXB0eS4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBhcmUgbm8gcHJvZmlsZXMgaW4gdGhpcyBzZXJ2ZXIuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJYm9vbGVhbiBpc0VtcHR5KCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBJdGVyYXRlIG92ZXIgdGhlIGF2YWlsYWJsZSBwcm9maWxlcy4KKwkgKgorCSAqIEVhY2ggY2FsbCB0byA8Y29kZT5uZXh0PC9jb2RlPiB5aWVsZHMgYSBjb3B5IG9mIHRoZSBuZXh0IHtAbGluayBQcm9maWxlfSBvYmplY3QKKwkgKiBtYW5hZ2VkIGJ5IHRoaXMgc2VydmVyLiAgVXBkYXRlcyB0byBwcm9maWxlIG9iamVjdHMgYXJlIG5vdCBiYWNrZWQgYnkgdGhlCisJICogc2VydmVyOyBtYWtlIHlvdXIgdXBkYXRlcyBhbmQgdGhlbiBjYWxsIHtAbGluayAjYWRkfS4KKwkgKgorCSAqIEByZXR1cm4gQW4gaXRlcmF0b3Igb3ZlciB7QGxpbmsgUHJvZmlsZX1zLgorCSAqIEB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorCSAqLworCUl0ZXJhdG9yIGl0ZXJhdG9yKCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIHByb2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gSUQuCisJICoKKwkgKiBUaGlzIHJlbW92ZXMgZm9yZXZlciB0aGUgZ2l2ZW4gcHJvZmlsZSBmcm9tIHRoZSBzZXQgb2YgcHJvZmlsZXMgbWFuYWdlZCBieSB0aGlzCisJICogc2VydmVyLgorCSAqCisJICogQHBhcmFtIHByb2ZJRCBXaGF0IHByb2ZpbGUgdG8gcmVtb3ZlLgorCSAqIEBwYXJhbSB2ZXJzaW9uIFdoYXQgdmVyc2lvbiBvZiB0aGUgdGhlIHByb2ZpbGUgaWRlbnRpZmllZCBieSA8dmFyPnByb2ZJRDwvdmFyPiB0byByZW1vdmUuCisJICogQHJldHVybiBUcnVlIGlmIHRoaWUgcHJvZmlsZSB3YXMgYWN0dWFsbHkgcHJlc2VudCBhbmQgcmVtb3ZlZDsgZmFsc2UgaWYgaXQgd2Fzbid0IHByZXNlbnQuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJYm9vbGVhbiByZW1vdmUoU3RyaW5nIHByb2ZJRCwgU3RyaW5nIHZlcnNpb24pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOworCisJLyoqCisJICogUmVtb3ZlIHRoZSBwcm9maWxlIHdpdGggdGhlIGdpdmVuIElELgorCSAqCisJICogVGhpcyByZW1vdmVzIGZvcmV2ZXIgdGhlIGdpdmVuIHByb2ZpbGUgZnJvbSB0aGUgc2V0IG9mIHByb2ZpbGVzIG1hbmFnZWQgYnkgdGhpcworCSAqIHNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBwcm9mSUQgSUQgb2YgcHJvZmlsZSB0byByZW1vdmUuCisJICogQHJldHVybiBUcnVlIGlmIHRoaWUgcHJvZmlsZSB3YXMgYWN0dWFsbHkgcHJlc2VudCBhbmQgcmVtb3ZlZDsgZmFsc2UgaWYgaXQgd2Fzbid0IHByZXNlbnQuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisJICovCisJYm9vbGVhbiByZW1vdmUoU3RyaW5nIHByb2ZJRCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247CisKKwkvKioKKwkgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNldCBvZiBwcm9maWxlcyBtYW5hZ2VkIGJ5IHRoaXMgc2VydmVyLgorCSAqCisJICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9maWxlcy4KKwkgKiBAdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKwkgKi8KKwlpbnQgc2l6ZSgpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOworCisJLyoqCisJICogUmVwbGFjZSBhIHByb2ZpbGUgaW50byB0aGUgc2V0IG9mIHByb2ZpbGVzIG1hbmFnZWQgYnkgdGhpcyBwcm9maWxlIHNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGFkZCBvciByZXBsYWNlLgorCSAqIEB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorCSAqLworCXZvaWQgcmVwbGFjZShQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvY2FzL0NBU1Byb2ZpbGVIYW5kbGVyLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9jYXMvQ0FTUHJvZmlsZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNjNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvY2FzL0NBU1Byb2ZpbGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuY2FzOworCisvL0NBUyBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5jYXMudXRpbC5Qcm9maWxlVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5Qcm9maWxlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuUXVlcnlFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gT09EVCB7QGxpbmsgUHJvZmlsZUhhbmRsZXJ9IHRoYXQgcXVlcmllcyBhIGJhY2tlbmQgT09EVCBGaWxlIE1hbmFnZW1lbnQKKyAqIGNvbXBvbmVudCwgYW5kIGNvbnZlcnRzIHtAbGluayBQcm9kdWN0fXMgYW5kIHRoZWlyIHtAbGluayBNZXRhZGF0YX0gaW50bworICogT09EVCB7QGxpbmsgUHJvZmlsZX1zLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgQ0FTUHJvZmlsZUhhbmRsZXIgaW1wbGVtZW50cyBQcm9maWxlSGFuZGxlciB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKENBU1Byb2ZpbGVIYW5kbGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciBmaWxlbWdyIGNsaWVudCAqLworICAgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm1DbGllbnQgPSBudWxsOworCisgICAgLyogdGhlIGJhc2UgVVJMIHRvIHRoZSBkYXRhIGRlbGl2ZXJ5IHNlcnZsZXQgZm9yIHByb2R1Y3RzICovCisgICAgLyogQUtBIG91ciAid2ViLWlmaWVkIiBwcm9kdWN0IHNlcnZlciAqLworICAgIHByaXZhdGUgU3RyaW5nIGRhdGFEZWxpdkJhc2VVcmxTdHIgPSBudWxsOworCisgICAgLyogcHJvZHVjdCB0eXBlIGZpbHRlcjogYSBsaXN0IG9mIHByb2R1Y3QgdHlwZXMgdG8gcXVlcnkgYWNyb3NzICovCisgICAgcHJpdmF0ZSBMaXN0IHByb2R1Y3RUeXBlRmlsdGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBDQVNQcm9maWxlSGFuZGxlcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbmVlZCB0byByZWFkIGluIHRoZSBzeXN0ZW0gcHJvcGVydHkKKyAgICAgICAgLy8gdGVsbGluZyB1cyB3aGljaCBmaWxlbWdyIHRvIGNvbW11bmljYXRlIHdpdGgKKworICAgICAgICBTdHJpbmcgZmlsZW1nclVybFN0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9maWxlLmZtVXJsIiwgImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbUNsaWVudCA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKGZpbGVtZ3JVcmxTdHIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBmaWxlbWdyOiBbIiArIGZpbGVtZ3JVcmxTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVhZCBpbiBkYXRhIGRlbGl2IGJhc2UgdXJsCisgICAgICAgIGRhdGFEZWxpdkJhc2VVcmxTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucHJvZmlsZS5kYXRhRGVsaXZCYXNlVXJsIiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2ZpbGVtZ3IvZGF0YSIpOworCisgICAgICAgIHByb2R1Y3RUeXBlRmlsdGVyID0gYnVpbGRGaWx0ZXIoU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2ZpbGUucHJvZHVjdC50eXBlcyIpKTsKKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXIjZmluZFByb2ZpbGVzKG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBmaW5kUHJvZmlsZXMoWE1MUXVlcnkgcXVlcnkpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCBwcm9mcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBpZiAocHJvZHVjdFR5cGVGaWx0ZXIgIT0gbnVsbCAmJiBwcm9kdWN0VHlwZUZpbHRlci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9kdWN0VHlwZUZpbHRlci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gKFByb2R1Y3RUeXBlKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBRdWVyeSBjUXVlcnkgPSBjb252ZXJ0UXVlcnkocXVlcnkpOworCisgICAgICAgICAgICAgICAgcHJvZnMuYWRkQWxsKHF1ZXJ5QW5kQnVpbGRQcm9maWxlcyh0eXBlLCBjUXVlcnkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9mczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVIYW5kbGVyI2dldChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBQcm9maWxlIGdldChTdHJpbmcgYXJnMCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVIYW5kbGVyI2dldElEKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gIkNBUyBGaWxlbWdyIFByb2ZpbGUgSGFuZGxlciI7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IHNhZmVHZXRQcm9kdWN0VHlwZXMoKSB7CisgICAgICAgIExpc3QgdHlwZXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlcyA9IGZtQ2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Qgc2FmZUdldFByb2R1Y3RzKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICAgICAgTGlzdCBwcm9kdWN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2R1Y3RzID0gZm1DbGllbnQuZ2V0UHJvZHVjdHNCeVByb2R1Y3RUeXBlKHR5cGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9kdWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIFByb2R1Y3RUeXBlIHNhZmVHZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHlwZSA9IGZtQ2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKG5hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHByaXZhdGUgTWV0YWRhdGEgc2FmZUdldE1ldGFkYXRhKFByb2R1Y3QgcCkgeworICAgICAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtZXQgPSBmbUNsaWVudC5nZXRNZXRhZGF0YShwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWV0OworICAgIH0KKworICAgIHByaXZhdGUgTGlzdCBzYWZlR2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwKSB7CisgICAgICAgIExpc3QgcmVmZXJlbmNlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZmVyZW5jZXMgPSBmbUNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVmZXJlbmNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIEVsZW1lbnQgc2FmZUdldEVsZW1lbnRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZWxlbSA9IGZtQ2xpZW50LmdldEVsZW1lbnRCeU5hbWUobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVsZW07CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IGJ1aWxkRmlsdGVyKFN0cmluZyBwcm9kdWN0VHlwZU5hbWVzKSB7CisgICAgICAgIExpc3QgdHlwZUZpbHRlciA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaWYgKHByb2R1Y3RUeXBlTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZUZpbHRlciA9IHNhZmVHZXRQcm9kdWN0VHlwZXMoKTsgLy8ganVzdCBncmFiIHRoZW0gYWxsCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzcGxpdCB0aGUgc3RyaW5nIG9uICIsIgorICAgICAgICAgICAgU3RyaW5nW10gdHlwZU5hbWVzID0gcHJvZHVjdFR5cGVOYW1lcy5zcGxpdCgiLCIpOworCisgICAgICAgICAgICBpZiAodHlwZU5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVOYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gc2FmZUdldFByb2R1Y3RUeXBlQnlOYW1lKHR5cGVOYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIHR5cGVGaWx0ZXIuYWRkKHR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBjb21tYSBkZWxpbWl0ZWQgdHlwZSBzdHJpbmc6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVOYW1lcyArICJdOiB1c2luZyBhbGwgdHlwZXMiKTsKKyAgICAgICAgICAgICAgICB0eXBlRmlsdGVyID0gc2FmZUdldFByb2R1Y3RUeXBlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHR5cGVGaWx0ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBRdWVyeSBjb252ZXJ0UXVlcnkoWE1MUXVlcnkgeG1sUXVlcnkpIHsKKyAgICAgICAgLy8gaGVyZSdzIHRoZSBkdW1iZWQgZG93biBhbGdvcml0aG0KKyAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSB3aGVyZVNldAorICAgICAgICAvLyB3aGVuIHlvdSBmaW5kIGEgZWxlbU5hbWUsIGdyYWIgdGhlIG5leHQgcXVlcnkgZWxlbWVudAorICAgICAgICAvLyBlbnN1cmUgaXQncyBhIGxpdGVyYWwsIGlmIHNvLCB0aGVyZSdzIHlvdXIgdGVybSBxdWVyeQorCisgICAgICAgIC8vIHRoYXQncyBhbGwgd2UnbGwgc3VwcG9ydCBmb3Igbm93CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisKKyAgICAgICAgaWYgKHhtbFF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiB4bWxRdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4bWxRdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5pdGVyYXRvcigpOyBpCisgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUXVlcnlFbGVtZW50IGVsZW0gPSAoUXVlcnlFbGVtZW50KSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRSb2xlKCkuZXF1YWxzKCJlbGVtTmFtZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtTmFtZSA9IGVsZW0uZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0byBnZXQgdGhlIGVsZW0gdmFsdWUsIHdlIG5lZWQgdG8gZ3JhYiB0aGUgbmV4dCBlbGVtCisgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCdzIGEgbGl0ZXJhbCwgYW5kIHRoZW4gZ3JhYiBpdAorICAgICAgICAgICAgICAgICAgICBRdWVyeUVsZW1lbnQgbGl0RWxlbSA9IChRdWVyeUVsZW1lbnQpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWxpdEVsZW0uZ2V0Um9sZSgpLmVxdWFscygiTElURVJBTCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXh0IGVsZW1lbnQgbm90IGxpdGVyYWw6IGVsZW1lbnQ6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaXRFbGVtICsgIl06IG1hbGZvcm1lZCB4bWwgcXVlcnkhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbVZhbHVlID0gbGl0RWxlbS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBUZXJtUXVlcnlDcml0ZXJpYSBjcml0ID0gbmV3IFRlcm1RdWVyeUNyaXRlcmlhKCk7CisgICAgICAgICAgICAgICAgICAgIGNyaXQuc2V0RWxlbWVudE5hbWUoZWxlbU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjcml0LnNldFZhbHVlKGVsZW1WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmFkZENyaXRlcmlvbihjcml0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IHF1ZXJ5QW5kQnVpbGRQcm9maWxlcyhQcm9kdWN0VHlwZSB0eXBlLCBRdWVyeSBxdWVyeSkgeworICAgICAgICBMaXN0IHByb2ZpbGVzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIExpc3QgcHJvZHVjdHMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9kdWN0cyA9IGZtQ2xpZW50LnF1ZXJ5KHF1ZXJ5LCB0eXBlKTsKKworICAgICAgICAgICAgaWYgKHByb2R1Y3RzICE9IG51bGwgJiYgcHJvZHVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IHAgPSAoUHJvZHVjdCkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoc2FmZUdldFByb2R1Y3RSZWZlcmVuY2VzKHApKTsKKyAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgbWV0ID0gc2FmZUdldE1ldGFkYXRhKHApOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKFByb2ZpbGVVdGlscy5idWlsZFByb2ZpbGUocCwgbWV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRGVsaXZCYXNlVXJsU3RyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBxdWVyeWluZyB0aGUgZmlsZSBtYW5hZ2VyIGZvciBwcm9kdWN0czogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2ZpbGVzOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvY2FzL3V0aWwvUHJvZmlsZVV0aWxzLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9jYXMvdXRpbC9Qcm9maWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM4YzczCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvY2FzL3V0aWwvUHJvZmlsZVV0aWxzLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuY2FzLnV0aWw7CisKKy8vQ0FTIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUmVzb3VyY2VBdHRyaWJ1dGVzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNldCBvZiB1dGlsaXR5IG1ldGhvZHMgdG8gYWlkIGluIENBUyBGaWxlbWdyIHZvY2FidWxhcnkgY29udmVyc2lvbiB0byBPT0RUCisgKiB7QGxpbmsgUHJvZmlsZX0gdm9jYWJ1bGFyeS4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFByb2ZpbGVVdGlscyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZfSURfUFJFID0gInVybjpvb2R0OnByb2ZpbGU6IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRl9UWVBFID0gInByb2ZpbGUiOworCisgIHByaXZhdGUgUHJvZmlsZVV0aWxzKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJEb24ndCBjb25zdHJ1Y3QgdXRpbGl0eSBjbGFzc2VzISIpOworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkcyBhIHtAbGluayBQcm9maWxlfSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgUHJvZHVjdH0sIGFuZCBpdHMKKyAgICoge0BsaW5rIE1ldGFkYXRhfS4KKyAgICogCisgICAqIEBwYXJhbSBwCisgICAqICAgICAgICAgIFRoZSBnaXZlbiB7QGxpbmsgUHJvZHVjdH0uCisgICAqIEBwYXJhbSBtZXQKKyAgICogICAgICAgICAgVGhlIGdpdmVuIHtAbGluayBNZXRhZGF0YX0uCisgICAqIEBwYXJhbSBkYXRhRGVsaXZCYXNlVXJsCisgICAqICAgICAgICAgIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFVSTH0gdG8gdGhlIGRhdGEgZGVsaXZlcnkKKyAgICogICAgICAgICAgc2VydmljZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHtAbGluayBQcm9kdWN0fS4gVGhpcyBpcyB1c2VkLCBpbgorICAgKiAgICAgICAgICBjb21iaW5hdGlvbiB3aXRoIHRoZSB7QGxpbmsgUHJvZHVjdH0ncyBJRCwgdG8gcG9wdWxhdGUgdGhlCisgICAqICAgICAgICAgIHtAbGluayBSZXNvdXJjZUF0dHJpYnV0ZXN9IDxjb2RlPnJlc0xvY2F0aW9uPC9jb2RlPiBmaWVsZC4KKyAgICogQHJldHVybiBBbiBPT0RUIHtAbGluayBQcm9maWxlfSByZXByZXNlbnRhdGlvbiBwb2ludGluZyBhdCB0aGUgZ2l2ZW4KKyAgICogICAgICAgICB7QGxpbmsgUHJvZHVjdH0uCisgICAqLworICBwdWJsaWMgc3RhdGljIFByb2ZpbGUgYnVpbGRQcm9maWxlKFByb2R1Y3QgcCwgTWV0YWRhdGEgbWV0LAorICAgICAgU3RyaW5nIGRhdGFEZWxpdkJhc2VVcmwpIHsKKworICAgIFByb2ZpbGUgcHJvZiA9IG5ldyBQcm9maWxlKCk7CisKKyAgICBQcm9maWxlQXR0cmlidXRlcyBwcm9mQXR0cnMgPSBuZXcgUHJvZmlsZUF0dHJpYnV0ZXMoKTsKKyAgICBwcm9mQXR0cnMuc2V0SUQoUFJPRl9JRF9QUkUgKyBwLmdldFByb2R1Y3RJZCgpKTsKKyAgICBwcm9mQXR0cnMuc2V0UmVnQXV0aG9yaXR5KCJDQVMiKTsKKyAgICBwcm9mQXR0cnMuc2V0VHlwZShQUk9GX1RZUEUpOworCisgICAgcHJvZi5zZXRQcm9maWxlQXR0cmlidXRlcyhwcm9mQXR0cnMpOworCisgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc0F0dHJzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcygpOworICAgIHJlc0F0dHJzLnNldERlc2NyaXB0aW9uKHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICByZXNBdHRycy5zZXRJZGVudGlmaWVyKHAuZ2V0UHJvZHVjdElkKCkpOworICAgIHJlc0F0dHJzLnNldFJlc0NsYXNzKHAuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCkpOworICAgIHJlc0F0dHJzLnNldFRpdGxlKHAuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgcmVzQXR0cnMuZ2V0UHVibGlzaGVycygpLmFkZCgiQ0FTIik7CisgICAgcmVzQXR0cnMuZ2V0UmVzTG9jYXRpb25zKCkuYWRkKAorICAgICAgICBkYXRhRGVsaXZCYXNlVXJsICsgIj9wcm9kdWN0SUQ9IiArIHAuZ2V0UHJvZHVjdElkKCkpOworCisgICAgcHJvZi5zZXRSZXNvdXJjZUF0dHJpYnV0ZXMocmVzQXR0cnMpOworCisgICAgLy8gYnVpbGQgdXAgcHJvZmlsZSBlbGVtZW50cworICAgIGZvcihJdGVyYXRvciBpID0gbWV0LmdldEhhc2h0YWJsZSgpLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICBMaXN0IHZhbHMgPSBtZXQuZ2V0QWxsTWV0YWRhdGEoa2V5KTsKKyAgICAgIAorICAgICAgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50IGVsZW0gPSBuZXcgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KHByb2YpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgWyIra2V5KyJdPT4iK3ZhbHMpOworICAgICAgZWxlbS5zZXROYW1lKGtleSk7CisgICAgICBlbGVtLmdldFZhbHVlcygpLmFkZEFsbCh2YWxzKTsKKyAgICAgIHByb2YuZ2V0UHJvZmlsZUVsZW1lbnRzKCkucHV0KGtleSwgZWxlbSk7CisgICAgfQorICAgIAorICAgIAorICAgIHJldHVybiBwcm9mOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvQW5kRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvQW5kRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NGYyYTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9BbmRFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQW4gImFuZCIgY29tcG9uZW50IG9mIGEgd2hlcmUtZXhwcmVzc2lvbi4KKyAqCisgKiBUaGlzIGNvbXBvbmVudCBldmFsdWF0ZXMgYSByZXN1bHQgdGhhdCdzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGxlZnQgYW5kIHJpZ2h0CisgKiBleHByZXNzaW9ucy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIEFuZEV4cHJlc3Npb24gaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb24geworCS8qKgorCSAqIENvbnN0cnVjdCBhbiAiYW5kIiB3aGVyZS1leHByZXNzaW9uLgorCSAqCisJICogQHBhcmFtIGxocyBMZWZ0LWhhbmQgc2lkZQorCSAqIEBwYXJhbSByaHMgUmlnaHQtaGFuZCBzaWRlLgorCSAqLworCXB1YmxpYyBBbmRFeHByZXNzaW9uKFdoZXJlRXhwcmVzc2lvbiBsaHMsIFdoZXJlRXhwcmVzc2lvbiByaHMpIHsKKwkJdGhpcy5saHMgPSBsaHM7CisJCXRoaXMucmhzID0gcmhzOworCX0KKworCXB1YmxpYyBSZXN1bHQgcmVzdWx0KFNlYXJjaGFibGVSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzQXR0ciwgTWFwIGVsZW1lbnRzKSB7CisJCXJldHVybiBuZXcgSW50ZXJzZWN0aW9uKGxocy5yZXN1bHQocmVzQXR0ciwgZWxlbWVudHMpLCByaHMucmVzdWx0KHJlc0F0dHIsIGVsZW1lbnRzKSk7CisJfQorCisJcHVibGljIFdoZXJlRXhwcmVzc2lvbiBzaW1wbGlmeSgpIHsKKwkJLy8gU2ltcGxpZnkgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzLCBhbmQga2VlcCB0aGlzIG5vZGUuCisJCWxocyA9IGxocy5zaW1wbGlmeSgpOworCQlyaHMgPSByaHMuc2ltcGxpZnkoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFdoZXJlRXhwcmVzc2lvbiBuZWdhdGUoKSB7CisJCXJldHVybiBuZXcgT3JFeHByZXNzaW9uKGxocy5uZWdhdGUoKSwgcmhzLm5lZ2F0ZSgpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gImFuZFsiICsgbGhzICsgIiwiICsgcmhzICsgIl0iOworCX0KKworCS8qKiBMZWZ0LWhhbmQgc2lkZSBvZiB0aGUgZXhwcmVzc2lvbi4gKi8KKwlwcml2YXRlIFdoZXJlRXhwcmVzc2lvbiBsaHM7CisKKwkvKiogUmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBleHByZXNzaW9uLiAqLworCXByaXZhdGUgV2hlcmVFeHByZXNzaW9uIHJoczsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0NvbnN0YW50RXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvQ29uc3RhbnRFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0MTA1MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0NvbnN0YW50RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgY29uc3RhbnQgZXhwcmVzc2lvbi4KKyAqCisgKiBUaGlzIGV4cHJlc3Npb24geWllbGRzIGVpdGhlciBhbGwgdGhlIGVsZW1lbnRzIChpZiBpdCdzIGEgY29uc3RhbnQgdHJ1ZSkgb3Igbm9uZSAoaWYKKyAqIGl0J3MgYSBjb25zdGFudCBmYWxzZSkuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitjbGFzcyBDb25zdGFudEV4cHJlc3Npb24gaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb24geworCS8qKgorCSAqIENvbnN0cnVjdCBhIGNvbnN0YW50IHdoZXJlLWV4cHJlc3Npb24uCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVHJ1dGggdmFsdWUgb2YgdGhpcyBleHByZXNzaW9uLgorCSAqLworCXB1YmxpYyBDb25zdGFudEV4cHJlc3Npb24oYm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFJlc3VsdCByZXN1bHQoU2VhcmNoYWJsZVJlc291cmNlQXR0cmlidXRlcyByZXNBdHRyLCBNYXAgZWxlbWVudHMpIHsKKwkJaWYgKHZhbHVlKQorCQkJcmV0dXJuIG5ldyBNYXRjaGluZ1Jlc3VsdChuZXcgSGFzaFNldChlbGVtZW50cy52YWx1ZXMoKSkpOworCQllbHNlCisJCQlyZXR1cm4gRmFsc2VSZXN1bHQuSU5TVEFOQ0U7CisJfQorCisJcHVibGljIFdoZXJlRXhwcmVzc2lvbiBzaW1wbGlmeSgpIHsKKwkJLy8gQ2FuJ3QgZ2V0IHNpbXBsZXIgdGhhbiB0aGlzLgorCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgV2hlcmVFeHByZXNzaW9uIG5lZ2F0ZSgpIHsKKwkJcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24oIXZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gImNvbnN0YW50WyIgKyB2YWx1ZSArICJdIjsKKwl9CisKKwkvKiogVHJ1dGggdmFsdWUuICovCisJcHJpdmF0ZSBib29sZWFuIHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvRmFsc2VSZXN1bHQuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0ZhbHNlUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0ZhbHNlUmVzdWx0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIEEgY29uc3RhbnQgZmFsc2UgcmVzdWx0LgorICoKKyAqIFRoaXMgcmVzdWx0IG5ldmVyIGNvbnRhaW5zIGFueSBtYXRjaGluZyBlbGVtZW50cy4KKyAqCisgKiA8cD5Eb24ndCBjcmVhdGUgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QuICBKdXN0IHVzZSB0aGUge0BsaW5rICNJTlNUQU5DRX0gZmllbGQsIHNpbmNlCisgKiBvbmx5IG9uZSBpcyBhbnkgcHJvZ3JhbSB3aWxsIGV2ZXIgbmVlZC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIEZhbHNlUmVzdWx0IGltcGxlbWVudHMgUmVzdWx0IHsKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBmYWxzZSByZXN1bHQuCisJICovCisJcHJpdmF0ZSBGYWxzZVJlc3VsdCgpIHt9CisKKwkvKiogVGhlIHNpbmdsZSBmYWxzZSByZXN1bHQgYW55IHByb2dyYW0gd2lsbCBldmVyIG5lZWQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBGYWxzZVJlc3VsdCBJTlNUQU5DRSA9IG5ldyBGYWxzZVJlc3VsdCgpOworCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJmYWxzZVJlc3VsdCI7CisJfQorCisJcHVibGljIFNldCBtYXRjaGluZ0VsZW1lbnRzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0ludGVyc2VjdGlvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvSW50ZXJzZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmNTJmNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0ludGVyc2VjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFbGVtZW50OworCisvKioKKyAqIEludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHNldHMgaXMgdGhlIHJlc3VsdC4KKyAqCisgKiBUaGlzIHJlc3VsdCB0YWtlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBvdGhlciByZXN1bHRzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworY2xhc3MgSW50ZXJzZWN0aW9uIGltcGxlbWVudHMgUmVzdWx0IHsKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYW4gaW50ZXJzZWN0aW9uLgorCSAqCisJICogQHBhcmFtIGxocyBMZWZ0LWhhbmQgc2lkZQorCSAqIEBwYXJhbSByaHMgUmlnaHQtaGFuZCBzaWRlLgorCSAqLworCXB1YmxpYyBJbnRlcnNlY3Rpb24oUmVzdWx0IGxocywgUmVzdWx0IHJocykgeworCQl0aGlzLmxocyA9IGxoczsKKwkJdGhpcy5yaHMgPSByaHM7CisJfQorCisJcHVibGljIFNldCBtYXRjaGluZ0VsZW1lbnRzKCkgeworCQlTZXQgaW50ZXJzZWN0aW9uID0gUHJvZmlsZUVsZW1lbnQucHJvZmlsZXMobGhzLm1hdGNoaW5nRWxlbWVudHMoKSk7CisJCWludGVyc2VjdGlvbi5yZXRhaW5BbGwoUHJvZmlsZUVsZW1lbnQucHJvZmlsZXMocmhzLm1hdGNoaW5nRWxlbWVudHMoKSkpOworCQlTZXQgcmMgPSBQcm9maWxlRWxlbWVudC5lbGVtZW50cyhpbnRlcnNlY3Rpb24sIGxocy5tYXRjaGluZ0VsZW1lbnRzKCkpOworCQlyYy5hZGRBbGwoUHJvZmlsZUVsZW1lbnQuZWxlbWVudHMoaW50ZXJzZWN0aW9uLCByaHMubWF0Y2hpbmdFbGVtZW50cygpKSk7CisJCXJldHVybiByYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gImludGVyc2VjdGlvblsiICsgbGhzICsgIiwiICsgcmhzICsgIl0iOworCX0KKworCS8qKiBMZWZ0LWhhbmQgc2lkZSBvZiB0aGUgcmVzdWx0LiAqLworCXByaXZhdGUgUmVzdWx0IGxoczsKKworCS8qKiBSaWdodC1oYW5kIHNpZGUgb2YgdGhlIHJlc3VsdC4gKi8KKwlwcml2YXRlIFJlc3VsdCByaHM7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9MaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L0xpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTc3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9MaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuRXhlY1NlcnZlckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5ET01QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5YTUw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlF1ZXJ5RWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnk7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIEEgbGlnaHR3ZWlnaHQgcHJvZmlsZSBzZXJ2ZXIuCisgKgorICogQSBsaWdodHdlaWdodCBwcm9maWxlIHNlcnZlciBpcyBsaWdodHdlaWdodCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvbiBhbnkgZXh0ZXJuYWwKKyAqIGRhdGFiYXNlIG9yIG90aGVyIHNlYXJjaC9yZXRyaWV2YWwgbWVjaGFuaXNtLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworZmluYWwgcHVibGljIGNsYXNzIExpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlciBpbXBsZW1lbnRzIFByb2ZpbGVIYW5kbGVyIHsKKwkvKioKKwkgKiBDcmVhdGUgYSBsaWdodHdlaWdodCBwcm9maWxlIHNlcnZlciB1c2luZyBkZWZhdWx0cy4KKwkgKgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgcGFyc2luZyB0aGUgcHJvZmlsZSBmaWxlLgorCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIElmIHRoZSBkZWZhdWx0IHByb2ZpbGUgVVJMIGlzIG1hbGZvcm1lZC4KKwkgKi8KKwlwdWJsaWMgTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCXRoaXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbGlnaHR3ZWlnaHQgcHJvZmlsZSBzZXJ2ZXIgdXNpbmcgdGhlIGdpdmVuIHByb3BlcnRpZXMuCisJICoKKwkgKiBUaGUgcHJvcGVydHkgd2UgdXNlIGlzCisJICogPGNvZGU+cHJvZmlsZXMudXJsPC9jb2RlPiwKKwkgKiB3aGljaCBpcyB0aGUgVVJMIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgcHJvZmlsZSBkZWZpbml0aW9ucyB0aGF0IHRoaXMgc2VydmVyCisJICogd2lsbCByZWFkIGFuZCBzZXJ2ZS4KKwkgKgorCSAqIEBwYXJhbSBwcm9wcyBQcm9wZXJ0aWVzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgcGFyc2luZyB0aGUgcHJvZmlsZSBmaWxlLgorCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIElmIHRoZSBVUkwgdG8gdGhlIHByb2ZpbGUgZmlsZSBpcyBtYWxmb3JtZWQuCisJICovCisJcHVibGljIExpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlcihQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJdGhpcyhuZXcgVVJMKHByb3BzLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5MaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIucHJvZmlsZXMudXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS53ZWJTZXJ2ZXIuYmFzZVVSTCIsICJodHRwOi8vZWRhLmpwbC5uYXNhLmdvdiIpCisgICAgICAgICAgICAgICAgICAgICAgICArICIvcHJvZmlsZXMueG1sIikpLAorCQkJcHJvcHMuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLkxpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlci5pZCIsICJsaWdodHdlaWdodCIpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBsaWdodHdlaWdodCBwcm9maWxlIHNlcnZlciB1c2luZyB0aGUgZ2l2ZW4gVVJMLgorCSAqCisJICogQHBhcmFtIHVybCBVUkwgb2YgdGhlIGZpbGUgY29udGFpbmluZyBwcm9maWxlIGRlZmluaXRpb25zIHRoYXQgdGhpcyBzZXJ2ZXIgd2lsbCByZWFkIGFuZCBzZXJ2ZS4KKwkgKiBAcGFyYW0gaWQgSWRlbnRpZmllciB0byByZXBvcnQgZm9yIHdoZW4gdGhpcyBoYW5kbGVyIGlzIHF1ZXJpZWQgYnkgbmFtZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisJICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHBhcnNpbmcgdGhlIHByb2ZpbGUgZmlsZS4KKwkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBJZiA8dmFyPnVybDwvdmFyPiBpcyBtYWxmb3JtZWQuCisJICovCisJcHVibGljIExpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlcihVUkwgdXJsLCBTdHJpbmcgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQl0aGlzLmlkID0gaWQ7CisKKwkJLy8gR2V0IHRoZSBsaXN0IG9mIHByb2ZpbGVzIGZyb20gdGhlIGNhY2hlLCBpZiBpdCdzIHRoZXJlLgorCQlwcm9maWxlcyA9IChMaXN0KSBjYWNoZS5nZXQodXJsKTsKKwkJaWYgKHByb2ZpbGVzICE9IG51bGwpIHJldHVybjsKKworCQkvLyBJdCB3YXNuJ3QgaW4gdGhlIGNhY2hlLCBzbyBjcmVhdGUgYSBwYXJzZXIgdG8gcGFyc2UgdGhlIGZpbGUuICBXZSBvbmx5CisJCS8vIGRlYWwgd2l0aCBjb3JyZWN0IGZpbGVzLCBzbyB0dXJuIG9uIHZhbGlkYXRpb24gYW5kIGluc3RhbGwgYW4gZXJyb3IKKwkJLy8gaGFuZGxlciB0aGF0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgorCQlwcm9maWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJRE9NUGFyc2VyIHBhcnNlciA9IFhNTC5jcmVhdGVET01QYXJzZXIoKTsKKwkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgeworCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJQYXJzZSBlcnJvciBsaW5lICIgKyBleC5nZXRMaW5lTnVtYmVyKCkgKyAiIGNvbHVtbiAiCisJCQkJCSsgZXguZ2V0Q29sdW1uTnVtYmVyKCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJCQl0aHJvdyBleDsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlBhcnNlIHdhcm5pbmc6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQkJfQorCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKwkJCQl0aHJvdyBleDsKKwkJCX0KKwkJfSk7CisKKwkJLy8gUGFyc2UgdGhlIGZpbGUuCisJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVybC50b1N0cmluZygpKTsKKwkJcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKKwkJRG9jdW1lbnQgZG9jID0gcGFyc2VyLmdldERvY3VtZW50KCk7CisKKwkJLy8gTm9ybWFsaXplIGl0IGFuZCBnZXQgdGhlIGRvY3VtZW50IGVsZW1lbnQsIGFuZCBmcm9tIHRoYXQsIGNyZWF0ZSBhIGxpc3QKKwkJLy8gb2YgcHJvZmlsZXMsIGFuZCBhZGQgaXQgdG8gdGhlIGNhY2hlLgorCQlkb2Mubm9ybWFsaXplKCk7CisJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJcHJvZmlsZXMgPSBQcm9maWxlLmNyZWF0ZVByb2ZpbGVzKHJvb3QsIG5ldyBTZWFyY2hhYmxlT2JqZWN0RmFjdG9yeSgpKTsKKwkJY2FjaGUucHV0KHVybCwgcHJvZmlsZXMpOworCisJCVN5c3RlbS5lcnIucHJpbnRsbigiTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyIHJlYWR5Iik7CisJfQorCisJcHVibGljIExpc3QgZmluZFByb2ZpbGVzKFhNTFF1ZXJ5IHF1ZXJ5KSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbiB7CisJCS8vIENvbXB1dGUgdGhlIHdoZXJlLWV4cHJlc3Npb24gYmFzZWQgb24gdGhlIHF1ZXJ5IHN0cmluZywgYW5kIHN0YXJ0IG9mZgorCQkvLyB3aXRoIGFuIGVtcHR5IHNldCBvZiByZXN1bHRzLgorCQlTZXQgbWF0Y2hpbmdQcm9maWxlcyA9IG5ldyBIYXNoU2V0KCk7CisJCVdoZXJlRXhwcmVzc2lvbiB3aGVyZUV4cHJlc3Npb24gPSBjcmVhdGVXaGVyZUV4cHJlc3Npb24ocXVlcnkpOworCisJCS8vIFNlYXJjaCBlYWNoIHByb2ZpbGUsIGFuZCBhZGQgdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCB0byB0aGUgc2V0IG9mIHJlc3VsdHMuCisJCWZvciAoSXRlcmF0b3IgaSA9IHByb2ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJU2VhcmNoYWJsZVByb2ZpbGUgcHJvZmlsZSA9IChTZWFyY2hhYmxlUHJvZmlsZSkgaS5uZXh0KCk7CisKKwkJCS8vIFNlYXJjaCB0aGUgcHJvZmlsZSB3aXRoIHRoZSB3aGVyZS1leHByZXNzaW9uLgorCQkJUmVzdWx0IHJlc3VsdCA9IHByb2ZpbGUuc2VhcmNoKHdoZXJlRXhwcmVzc2lvbik7CisKKwkJCS8vIElmIHRoZXJlIGFyZSBhbnkgbWF0Y2hpbmcgZWxlbWVudHMsIGFkZCB0aGUgcHJvZmlsZSB0byB0aGUgc2V0LgorCQkJaWYgKCFyZXN1bHQubWF0Y2hpbmdFbGVtZW50cygpLmlzRW1wdHkoKSkKKwkJCQltYXRjaGluZ1Byb2ZpbGVzLmFkZChwcm9maWxlKTsKKwkJfQorCisJCS8vIENvbnZlcnQgZnJvbSBzZXQgdG8gbGlzdC4KKwkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWF0Y2hpbmdQcm9maWxlcyk7CisJfQorCisJLyoqCisJICogR2V0IGEgc2luZ2xlIHByb2ZpbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIElELgorCSAqCisJICogQHBhcmFtIHByb2ZJRCBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgorCSAqIEByZXR1cm4gYSB7QGxpbmsgUHJvZmlsZX0gdmFsdWUuCisJICovCisJcHVibGljIFByb2ZpbGUgZ2V0KFN0cmluZyBwcm9mSUQpIHsKKwkJaWYgKHByb2ZJRCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJUHJvZmlsZSByYyA9IG51bGw7CisJCWZvciAoSXRlcmF0b3IgaSA9IHByb2ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUHJvZmlsZSBwID0gKFByb2ZpbGUpIGkubmV4dCgpOworCQkJaWYgKHAuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRJRCgpLmVxdWFscyhwcm9mSUQpKSB7CisJCQkJcmMgPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiByYzsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0IHRoZSBYTUwgcXVlcnkgdG8gYSB3aGVyZSBleHByZXNzaW9uLgorCSAqCisJICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBjb252ZXJ0CisJICogQHJldHVybiBUaGUgZXF1aXZhbGVudCwgc2ltcGxpZmllZCB3aGVyZSBleHByZXNzaW9uLgorCSAqLworCXByaXZhdGUgc3RhdGljIFdoZXJlRXhwcmVzc2lvbiBjcmVhdGVXaGVyZUV4cHJlc3Npb24oWE1MUXVlcnkgcXVlcnkpIHsKKwkJU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKKwkJIAorCQkvLyBDb2xsZWN0IHRvZ2V0aGVyIHRoZSB3aGVyZS0gYW5kIGZyb20tc2V0cywgam9pbmVkIHdpdGggYW4gImFuZCIuCisJCUxpc3QgYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KHF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpKTsKKwkJTGlzdCBmcm9tRWxlbWVudHMgPSBxdWVyeS5nZXRGcm9tRWxlbWVudFNldCgpOworCQlpZiAoIWZyb21FbGVtZW50cy5pc0VtcHR5KCkpIHsKKwkJCWFsbEVsZW1lbnRzLmFkZEFsbChmcm9tRWxlbWVudHMpOworCQkJYWxsRWxlbWVudHMuYWRkKG5ldyBRdWVyeUVsZW1lbnQoIkxPR09QIiwgIkFORCIpKTsKKwkJfQorCQkKKwkJLy8gRm9yIGVhY2ggaXRlbSBpbiB0aGUgd2hlcmUtc2V0CisJCWZvciAoSXRlcmF0b3IgaSA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUXVlcnlFbGVtZW50IHF1ZXJ5RWxlbWVudCA9IChRdWVyeUVsZW1lbnQpIGkubmV4dCgpOworCisJCQkvLyBHZXQgdGhlIGtleXdvcmQgYW5kIGl0cyB0eXBlLgorCQkJU3RyaW5nIGtleXdvcmQgPSBxdWVyeUVsZW1lbnQuZ2V0VmFsdWUoKTsKKwkJCVN0cmluZyB0eXBlID0gcXVlcnlFbGVtZW50LmdldFJvbGUoKTsKKworCQkJaWYgKHR5cGUuZXF1YWxzKCJlbGVtTmFtZSIpKSB7CisJCQkJLy8gSXQncyBhbiBlbGVtZW50IG5hbWUsIHNvIHB1c2ggdGhlIGVsZW1lbnQgbmFtZS4KKwkJCQlzdGFjay5wdXNoKGtleXdvcmQpOworCQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygiTElURVJBTCIpKSB7CisJCQkJLy8gSXQncyBhIGxpdGVyYWwgdmFsdWUsIHNvIHB1c2ggdGhlIHZhbHVlLgorCQkJCXN0YWNrLnB1c2goa2V5d29yZCk7CisJCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJMT0dPUCIpKSB7CisJCQkJLy8gSXQncyBhIGxvZ2ljYWwgb3BlcmF0b3IuICBQb3AgdGhlIG9wZXJhbmRzIG9mZiB0aGUKKwkJCQkvLyBzdGFjayBhbmQgcHVzaCB0aGUgYXBwcm9wcmlhdGUgb3BlcmF0b3IgYmFjayBvbi4KKwkJCQlpZiAoa2V5d29yZC5lcXVhbHMoIkFORCIpKSB7CisJCQkJCXN0YWNrLnB1c2gobmV3IEFuZEV4cHJlc3Npb24oKFdoZXJlRXhwcmVzc2lvbikgc3RhY2sucG9wKCksIChXaGVyZUV4cHJlc3Npb24pc3RhY2sucG9wKCkpKTsKKwkJCQl9IGVsc2UgaWYgKGtleXdvcmQuZXF1YWxzKCJPUiIpKSB7CisJCQkJCXN0YWNrLnB1c2gobmV3IE9yRXhwcmVzc2lvbigoV2hlcmVFeHByZXNzaW9uKSBzdGFjay5wb3AoKSwgKFdoZXJlRXhwcmVzc2lvbilzdGFjay5wb3AoKSkpOworCQkJCX0gZWxzZSBpZiAoa2V5d29yZC5lcXVhbHMoIk5PVCIpKSB7CisJCQkJCXN0YWNrLnB1c2gobmV3IE5vdEV4cHJlc3Npb24oKFdoZXJlRXhwcmVzc2lvbikgc3RhY2sucG9wKCkpKTsKKwkJCQl9IGVsc2UgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBvcGVyYXRvciBcIiIgKyBrZXl3b3JkICsgIlwiIGluIHF1ZXJ5Iik7CisJCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJSRUxPUCIpKSB7CisJCQkJLy8gSXQncyBhIHJlbGF0aW9uYWwgb3BlcmF0b3IuICBQb3AgdGhlIGVsZW1lbnQgbmFtZSBhbmQKKwkJCQkvLyBsaXRlcmFsIHZhbHVlIG9mZiB0aGUgc3RhY2ssIGFuZCBwdXNoIHRoZSBvcGVyYXRvcgorCQkJCS8vIGV4cHJlc3Npb24gb24gd2l0aCB0aGUgZ2l2ZW4gb3BlcmF0b3IuCisJCQkJc3RhY2sucHVzaChuZXcgT3BlcmF0b3JFeHByZXNzaW9uKChTdHJpbmcpIHN0YWNrLnBvcCgpLCAoU3RyaW5nKSBzdGFjay5wb3AoKSwga2V5d29yZCkpOworCQkJfQorCQl9CisKKwkJLy8gSWYgdGhlcmUncyBub3RoaW5nIG9uIHRoZSBzdGFjaywgd2UncmUgZ2l2ZW4gbm90aGluZywgc28gZ2l2ZSBiYWNrIGV2ZXJ5dGhpbmcuCisJCWlmIChzdGFjay5zaXplKCkgPT0gMCkKKwkJCXJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKHRydWUpOworCQllbHNlIGlmIChzdGFjay5zaXplKCkgPiAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW1iYWxhbmNlZCBleHByZXNzaW9uIGluIHF1ZXJ5Iik7CisJCQorCQkvLyBTaW1wbGlmeS9vcHRpbWl6ZSB0aGUgd2hlcmUtZXhwcmVzc2lvbiBhbmQgcmV0dXJuIGl0LgorCQlyZXR1cm4gKChXaGVyZUV4cHJlc3Npb24pIHN0YWNrLnBvcCgpKS5zaW1wbGlmeSgpOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKiBQcm9maWxlcyBJIHNlcnZlLiAqLworCXByaXZhdGUgTGlzdCBwcm9maWxlczsKKworCS8qKgorCSAqIENhY2hlIG9mIHByb2ZpbGVzLgorCSAqCisJICogVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSB7QGxpbmsgamF2YS5uZXQuVVJMfSBvZiB0aGUgcHJvZmlsZSBzb3VyY2UgdG8gdGhlIHtAbGluaworCSAqIExpc3R9IG9mIHByb2ZpbGVzLiAgV2UgZG8gdGhpcyBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgcmVyZWFkaW5nIGFuZCByZXBhcnNpbmcKKwkgKiB0aGUgcG9zc2libHkgaHVnZSBwcm9maWxlIGZpbGUgZWFjaCB0aW1lIGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzCisJICogaW5zdGFudGlhdGVkLgorCSAqCisJICogPHA+PGVtPlF1ZXN0aW9uOjwvZW0+IFNpbmNlIHdoZW4gYXJlIG11bHRpcGxlIExpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlcnMgYmVpbmcKKwkgKiBjb25zdHJ1Y3RlZCBhbnl3YXk/ICBUaGVyZSdzIGp1c3Qgb25lIHBlciBwcm9maWxlIHNlcnZlciBwcm9jZXNzLCBhbmQgaXQncworCSAqIHVzaW5nIGp1c3QgdGhlIG9uZSBmaWxlLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gbmVlZCBmb3IgdGhpcyBjYWNoZS4gIFdobyBhZGRlZAorCSAqIHRoaXM/ICBBbmQgaWYgaXQgd2VyZSBtZSwgd2hhdCB3YXMgSSBzbW9raW5nPworCSAqLworCXByaXZhdGUgc3RhdGljIE1hcCBjYWNoZSA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKiogTXkgSUQuICovCisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwkvKioKKwkgKiBBcHBsaWNhdGlvbiBleGVjdXRpb24gZW50cnkgcG9pbnQuCisJICoKKwkgKiBUaGlzIGxldHMgeW91IHRyeSBvdXQgYSBxdWVyeSB0byB0aGUgTGlnaHR3ZWlnaHQgUHJvZmlsZSBzZXJ2ZXIuCisJICoKKwkgKiBAcGFyYW0gYXJndiBDb21tYW5kLWxpbmUgYXJndW1lbnRzLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIFNob3VsZCBhbnkgZXJyb3Igb2NjdXIuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChhcmd2Lmxlbmd0aCA9PSAwKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiA8cXVlcnk+Li4uIik7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCS8vIENyZWF0ZSB0aGUgcHJvZmlsZQorCQlMaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIgbHAgPSBuZXcgTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyKCk7CisKKwkJLy8gR2F0aGVyIHRvZ2V0aGVyIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgbG9uZyBzdHJpbmcuCisJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyArK2kpCisJCQliLmFwcGVuZChhcmd2W2ldKS5hcHBlbmQoJyAnKTsKKworCQkvLyBDcmVhdGUgdGhlIHF1ZXJ5IG9iamVjdCBmcm9tIHRoZSBleHByZXNzaW9uLgorCQlYTUxRdWVyeSBxdWVyeSA9IG5ldyBYTUxRdWVyeShiLnRvU3RyaW5nKCkudHJpbSgpLCAvKmlkKi8iY2xpMSIsIC8qdGl0bGUqLyJDbWRMaW5lLTEiLAorCQkJLypkZXNjKi8iVGhpcyBpcyBhIHF1ZXJ5IGVudGVyZWQgb24gdGhlIGNvbW1hbmQtbGluZSIsIC8qZGRJZCovbnVsbCwgLypyZXN1bHRNb2RlSWQqL251bGwsCisJCQkvKnByb3BUeXBlKi9udWxsLCAvKnByb3BMZXZlbHMqL251bGwsIFhNTFF1ZXJ5LkRFRkFVTFRfTUFYX1JFU1VMVFMpOworCisJCS8vIERpc3BsYXkgdGhlIHJlc3VsdHMuCisJCVN5c3RlbS5vdXQucHJpbnRsbihscC5maW5kUHJvZmlsZXMocXVlcnkpKTsKKworCQkvLyBBbGwgZG9uZS4KKwkJU3lzdGVtLmV4aXQoMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvTWF0Y2hpbmdSZXN1bHQuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L01hdGNoaW5nUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNDk5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L01hdGNoaW5nUmVzdWx0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFbGVtZW50OworCisvKioKKyAqIEEgbWF0Y2hpbmcgcmVzdWx0LgorICoKKyAqIFRoaXMgcmVzdWx0IG1hdGNoZXMgcHJvZmlsZSBlbGVtZW50cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIE1hdGNoaW5nUmVzdWx0IGltcGxlbWVudHMgUmVzdWx0IHsKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBtYXRjaGluZyByZXN1bHQuCisJICoKKwkgKiBAcGFyYW0gZWxlbWVudCBUaGUgcHJvZmlsZSBlbGVtZW50IHRoYXQgbWF0Y2hlcy4KKwkgKi8KKwlwdWJsaWMgTWF0Y2hpbmdSZXN1bHQoUHJvZmlsZUVsZW1lbnQgZWxlbWVudCkgeworCQl0aGlzLmVsZW1lbnRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVsZW1lbnQpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhIG1hdGNoaW5nIHJlc3VsdC4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50cyBUaGUgcHJvZmlsZSBlbGVtZW50cyB0aGF0IGFsbCBtYXRjaC4KKwkgKi8KKwlwdWJsaWMgTWF0Y2hpbmdSZXN1bHQoU2V0IGVsZW1lbnRzKSB7CisJCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKwl9CisKKwlwdWJsaWMgU2V0IG1hdGNoaW5nRWxlbWVudHMoKSB7CisJCXJldHVybiBlbGVtZW50czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIm1hdGNoWyIgKyBlbGVtZW50cyArICJdIjsKKwl9CisKKwkvKiogVGhlIG1hdGNoaW5nIGVsZW1lbnRzLiAqLworCXByaXZhdGUgU2V0IGVsZW1lbnRzOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvTm90RXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvTm90RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTI5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9Ob3RFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSAibm90IiBjb21wb25lbnQgb2YgYSB3aGVyZS1leHByZXNzaW9uLgorICoKKyAqIFRoaXMgZXhwcmVzc2lvbiBjb21wb25lbnQgbmVnYXRlcyBpdHMgZ2l2ZW4gb3BlcmFuZC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIE5vdEV4cHJlc3Npb24gaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb24geworCS8qKgorCSAqIENvbnN0cnVjdCBhICJub3QiIHdoZXJlLWV4cHJlc3Npb24uCisJICoKKwkgKiBAcGFyYW0gb3BlcmFuZCBUaGUgb3BlcmFuZC4KKwkgKi8KKwlwdWJsaWMgTm90RXhwcmVzc2lvbihXaGVyZUV4cHJlc3Npb24gb3BlcmFuZCkgeworCQl0aGlzLm9wZXJhbmQgPSBvcGVyYW5kOworCX0KKworCXB1YmxpYyBSZXN1bHQgcmVzdWx0KFNlYXJjaGFibGVSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzQXR0ciwgTWFwIGVsZW1lbnRzKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdC1ub2RlcyBtdXN0IGJlIHNpbXBsaWZpZWQgb3V0IHNpbmNlIHRoZXkgY2Fubm90IHlpZWxkIHJlc3VsdHMiKTsKKwl9CisKKwlwdWJsaWMgV2hlcmVFeHByZXNzaW9uIHNpbXBsaWZ5KCkgeworCQkvLyBOZWdhdGUgbXkgb3BlcmFuZCByaWdodCBub3csIHRoZW4gc2ltcGxpZnkgaXQsIGFuZCBkcm9wIG15c2VsZiBvdXQuCisJCXJldHVybiBvcGVyYW5kLm5lZ2F0ZSgpLnNpbXBsaWZ5KCk7CisJfQorCisJcHVibGljIFdoZXJlRXhwcmVzc2lvbiBuZWdhdGUoKSB7CisJCXJldHVybiBuZXcgTm90RXhwcmVzc2lvbihvcGVyYW5kLm5lZ2F0ZSgpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIm5vdFsiICsgb3BlcmFuZCArICJdIjsKKwl9CisKKwkvKiogRXhwcmVzc2lvbiB0byBuZWdhdGUuICovCisJcHJpdmF0ZSBXaGVyZUV4cHJlc3Npb24gb3BlcmFuZDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0NjAxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLmxpZ2h0d2VpZ2h0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBvcGVyYXRvciBjb21wb25lbnQgb2YgYSB3aGVyZS1leHByZXNzaW9uLgorICoKKyAqIFRoaXMgY29tcG9uZW50IGFwcGxpZXMgYW4gb3BlcmF0b3IsIGxpa2UgJmx0OywgPSwgJmdlOywgZXRjLiwgdG8gYSBlbGVtZW50IG5hbWUgYW5kIGEKKyAqIGxpdGVyYWwgdmFsdWUuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitjbGFzcyBPcGVyYXRvckV4cHJlc3Npb24gaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb24geworCS8qKgorCSAqIENvbnN0cnVjdCBhbiBvcGVyYXRvciB3aGVyZS1leHByZXNzaW9uLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHdoaWNoIHRvIGNvbXBhcmUuCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiBlbGVtZW50IHRvIG1hdGNoLgorCSAqIEBwYXJhbSBvcGVyYXRvciBXaGF0IG9wZXJhdG9yIHRvIHVzZQorCSAqLworCXB1YmxpYyBPcGVyYXRvckV4cHJlc3Npb24oU3RyaW5nIHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG9wZXJhdG9yKSB7CisJCWlmIChBcnJheXMuYmluYXJ5U2VhcmNoKFZBTElEX09QRVJBVE9SUywgb3BlcmF0b3IpIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb3BlcmF0b3IgXCIiICsgb3BlcmF0b3IgKyAiXCIiKTsKKworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKKwl9CisKKwlwdWJsaWMgUmVzdWx0IHJlc3VsdChTZWFyY2hhYmxlUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc0F0dHIsIE1hcCBlbGVtZW50cykgeworCQkvLyBJcyBpdCBhICJmcm9tIiByZWxhdGlvbiBvciBhICJ3aGVyZSIgcmVsYXRpb24/CisJCWlmIChGUk9NX1RPS0VOUy5jb250YWlucyhuYW1lKSkgeworCQkJLy8gIkZyb20uIiAgU28gbGV0IHRoZSByZXNvdXJjZSBhdHRyaWJ1dGVzIHRha2UgY2FyZSBvZiBpdC4KKwkJCXJldHVybiByZXNBdHRyLnJlc3VsdChuYW1lLCB2YWx1ZSwgb3BlcmF0b3IpOworCQl9IGVsc2UgaWYgKFJFU09VUkNFX0FUVFJJQlVURVMuY29udGFpbnMobmFtZSkpIHsKKwkJCS8vIFJlc291cmNlIGF0dHJpYnV0ZXMgaW4gIldoZXJlIgorCQkJLy8gbGV0IHRoZSByZXNvdXJjZSBhdHRyaWJ1dGVzIHRha2UgY2FyZSBvZiBpdC4KKwkJCXJldHVybiByZXNBdHRyLnJlc3VsdChuYW1lLCB2YWx1ZSwgb3BlcmF0b3IpOworCQl9IGVsc2UgeworCQkJLy8gIldoZXJlLiIgIFNlZSBpZiBvdXIga2V5d29yZCBpcyBwcmVzZW50IGluIHRoZSBnaXZlbiBzZXQuCisJCQlTZWFyY2hhYmxlUHJvZmlsZUVsZW1lbnQgZWxlbWVudCA9IChTZWFyY2hhYmxlUHJvZmlsZUVsZW1lbnQpIGVsZW1lbnRzLmdldChuYW1lKTsKKworCQkJLy8gTm9wZS4gIFdlIGNhbiBvbmx5IGdpdmUgYSBmYWxzZSByZXN1bHQuCisJCQlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gRmFsc2VSZXN1bHQuSU5TVEFOQ0U7CisKKwkJCS8vIFllcC4gIEFzayB0aGUgZWxlbWVudCB0byB5aWVsZCB0aGUgcmVzdWx0LgorCQkJcmV0dXJuIGVsZW1lbnQucmVzdWx0KHZhbHVlLCBvcGVyYXRvcik7CisJCX0KKwl9CisKKwlwdWJsaWMgV2hlcmVFeHByZXNzaW9uIHNpbXBsaWZ5KCkgeworCQkvLyBDYW4ndCBnZXQgc2ltcGxlciB0aGFuIHRoaXMuCisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBXaGVyZUV4cHJlc3Npb24gbmVnYXRlKCkgeworCQlTdHJpbmcgbmVnYXRlZDsKKwkJaWYgKG9wZXJhdG9yLmVxdWFscygiRVEiKSkKKwkJCW5lZ2F0ZWQgPSAiTkUiOworCQllbHNlIGlmIChvcGVyYXRvci5lcXVhbHMoIk5FIikpCisJCQluZWdhdGVkID0gIkVRIjsKKwkJZWxzZSBpZiAob3BlcmF0b3IuZXF1YWxzKCJMVCIpKQorCQkJbmVnYXRlZCA9ICJHRSI7CisJCWVsc2UgaWYgKG9wZXJhdG9yLmVxdWFscygiR1QiKSkKKwkJCW5lZ2F0ZWQgPSAiTEUiOworCQllbHNlIGlmIChvcGVyYXRvci5lcXVhbHMoIkxFIikpCisJCQluZWdhdGVkID0gIkdUIjsKKwkJZWxzZSBpZiAob3BlcmF0b3IuZXF1YWxzKCJMSUtFIikpCisJCQluZWdhdGVkID0gIk5FIjsKKwkJZWxzZSBpZiAob3BlcmF0b3IuZXF1YWxzKCJOT1RMSUtFIikpCisJCQluZWdhdGVkID0gIkVRIjsKKwkJZWxzZQorCQkJbmVnYXRlZCA9ICJMVCI7CisJCXJldHVybiBuZXcgT3BlcmF0b3JFeHByZXNzaW9uKHZhbHVlLCBuYW1lLCBuZWdhdGVkKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIm9wZXJhdG9yWyIgKyBuYW1lICsgIiAiICsgb3BlcmF0b3IgKyAiICIgKyB2YWx1ZSArICJdIjsKKwl9CisKKwkvKiogTmFtZSBvZiBlbGVtZW50IHRvIG1hdGNoLiAqLworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwkvKiogVmFsdWUgdG8gY29tcGFyZS4gKi8KKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCS8qKiBPcGVyYXRvciB0byB1c2UuICovCisJcHJpdmF0ZSBTdHJpbmcgb3BlcmF0b3I7CisKKwkvKioKKwkgKiBWYWxpZCBvcGVyYXRvcnMuCisJICoKKwkgKiA8c3Ryb25nPktFRVAgVEhJUyBJTiBPUkRFUiE8L3N0cm9uZz4gIFdlIGJpbmFyeSBzZWFyY2ggb24gdGhlbSEKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9PUEVSQVRPUlMgPSB7CisJCSJFUSIsICJHRSIsICJHVCIsICJMRSIsICJMSUtFIiwgIkxUIiwgIk5FIiwgIk5PVExJS0UiCisJfTsKKworCS8qKgorCSAqIFJlbGF0aW9uYWwgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlICJmcm9tIiBwYXJ0IG9mIGEgcXVlcnkgaW5zdGVhZCBvZiB0aGUKKwkgKiAid2hlcmUiIHBhcnQuICBUaGVzZSB3b3JrIG9mZiB0aGUgcmVzb3VyY2UgYXR0cmlidXRlcyByYXRoZXIgdGhhbiB0aGUgcHJvZmlsZQorCSAqIGVsZW1lbnRzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBGUk9NX1RPS0VOUyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3Qob3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5LkZST01fVE9LRU5TKSk7CisKKwkvKioKKwkgKiBSZXNvdXJjZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIHBhcnNlZCBpbnRvIFdIRVJFIHBhcnQgb2YgdGhlIHhtbHF1ZXJ5CisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0IFJFU09VUkNFX0FUVFJJQlVURVMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAorCQluZXcgU3RyaW5nW117CisJCSJJZGVudGlmaWVyIiwgIlRpdGxlIiwgIkZvcm1hdCIsICJEZXNjcmlwdGlvbiIsICJDcmVhdG9yIiwgCisJCSJTdWJqZWN0IiwgIlB1Ymxpc2hlciIsICJDb250cmlidXRvciIsICJEYXRlIiwgIlR5cGUiLCAKKwkJIlNvdXJjZSIsICJMYW5ndWFnZSIsICJSZWxhdGlvbiIsICJDb3ZlcmFnZSIsICJSaWdodHMiLCAKKwkJInJlc0NvbnRleHQiLCAicmVzQ2xhc3MiLCAicmVzTG9jYXRpb24iIH0pKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L09yRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvT3JFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhYjE3ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L09yRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFuICJvciIgY29tcG9uZW50IG9mIGEgd2hlcmUtZXhwcmVzc2lvbi4KKyAqCisgKiBUaGlzIGNvbXBvbmVudCB5aWVsZHMgYSByZXN1bHQgdGhhdCdzIHRoZSB1bmlvbiBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQKKyAqIHNpZGVzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworY2xhc3MgT3JFeHByZXNzaW9uIGltcGxlbWVudHMgV2hlcmVFeHByZXNzaW9uIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYW4gIm9yIiB3aGVyZS1leHByZXNzaW9uLgorCSAqCisJICogQHBhcmFtIGxocyBMZWZ0LWhhbmQgc2lkZQorCSAqIEBwYXJhbSByaHMgUmlnaHQtaGFuZCBzaWRlLgorCSAqLworCXB1YmxpYyBPckV4cHJlc3Npb24oV2hlcmVFeHByZXNzaW9uIGxocywgV2hlcmVFeHByZXNzaW9uIHJocykgeworCQl0aGlzLmxocyA9IGxoczsKKwkJdGhpcy5yaHMgPSByaHM7CisJfQorCisJcHVibGljIFJlc3VsdCByZXN1bHQoU2VhcmNoYWJsZVJlc291cmNlQXR0cmlidXRlcyByZXNBdHRyLCBNYXAgZWxlbWVudHMpIHsKKwkJcmV0dXJuIG5ldyBVbmlvbihsaHMucmVzdWx0KHJlc0F0dHIsIGVsZW1lbnRzKSwgcmhzLnJlc3VsdChyZXNBdHRyLCBlbGVtZW50cykpOworCX0KKworCXB1YmxpYyBXaGVyZUV4cHJlc3Npb24gc2ltcGxpZnkoKSB7CisJCS8vIFNpbXBsaWZ5IHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcywgYW5kIGtlZXAgdGhpcyBub2RlLgorCQlsaHMgPSBsaHMuc2ltcGxpZnkoKTsKKwkJcmhzID0gcmhzLnNpbXBsaWZ5KCk7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBXaGVyZUV4cHJlc3Npb24gbmVnYXRlKCkgeworCQlyZXR1cm4gbmV3IEFuZEV4cHJlc3Npb24obGhzLm5lZ2F0ZSgpLCByaHMubmVnYXRlKCkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAib3JbIiArIGxocyArICIsIiArIHJocyArICJdIjsKKwl9CisKKwkvKiogTGVmdC1oYW5kIHNpZGUgb2YgdGhlIGV4cHJlc3Npb24uICovCisJcHJpdmF0ZSBXaGVyZUV4cHJlc3Npb24gbGhzOworCisJLyoqIFJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgZXhwcmVzc2lvbi4gKi8KKwlwcml2YXRlIFdoZXJlRXhwcmVzc2lvbiByaHM7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9SZXN1bHQuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1Jlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNGNlYjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9SZXN1bHQuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLmxpZ2h0d2VpZ2h0OworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHJlc3VsdCBvZiBhIHByb2ZpbGUgbWF0Y2guCisgKgorICogQGF1dGhvciBLZWxseQorICovCitpbnRlcmZhY2UgUmVzdWx0IHsKKwkvKioKKwkgKiBHZXQgdGhlIHNldCBvZiBtYXRjaGluZyBlbGVtZW50cy4KKwkgKgorCSAqIElmIHRoZSBzZXQgaXMgZW1wdHksIGl0IG1lYW5zIG5vIGVsZW1lbnRzIG1hdGNoZWQuCisJICovCisJU2V0IG1hdGNoaW5nRWxlbWVudHMoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1NlYXJjaGFibGVFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1NlYXJjaGFibGVFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk5YmNlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZUVudW1lcmF0ZWRQcm9maWxlRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLkVudW1lcmF0ZWRQcm9maWxlRWxlbWVudDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBTZWFyY2hhYmxlLCBlbnVtZXJhdGVkLCBwcm9maWxlIGVsZW1lbnQuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqLworcHVibGljIGNsYXNzIFNlYXJjaGFibGVFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgZXh0ZW5kcyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgaW1wbGVtZW50cyBTZWFyY2hhYmxlUHJvZmlsZUVsZW1lbnQgeworCXB1YmxpYyBTZWFyY2hhYmxlRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KFNlYXJjaGFibGVQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIFN0cmluZyBkZXNjLCBTdHJpbmcgdHlwZSwKKwkJU3RyaW5nIHVuaXQsIExpc3Qgc3lub255bXMsIGJvb2xlYW4gb2JsaWdhdGlvbiwgaW50IG1heE9jY3VycmVuY2UsIFN0cmluZyBjb21tZW50LCBMaXN0IHZhbHVlcykgeworCQlzdXBlcihwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsIG9ibGlnYXRpb24sIG1heE9jY3VycmVuY2UsIGNvbW1lbnQsIHZhbHVlcyk7CisJfQorCisJcHVibGljIFJlc3VsdCByZXN1bHQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgb3BlcmF0b3IpIHsKKwkJUmVzdWx0IHJjID0gRmFsc2VSZXN1bHQuSU5TVEFOQ0U7CisJCWlmIChvcGVyYXRvci5lcXVhbHMoIkVRIikgfHwgb3BlcmF0b3IuZXF1YWxzKCJMRSIpIHx8IG9wZXJhdG9yLmVxdWFscygiR0UiKSB8fAorCQkJb3BlcmF0b3IuZXF1YWxzKCJMSUtFIikpIHsKKwkJCWlmICh2YWx1ZXMuY29udGFpbnModmFsdWUpKQorCQkJCXJjID0gbmV3IE1hdGNoaW5nUmVzdWx0KHRoaXMpOworCQl9IGVsc2UgaWYgKG9wZXJhdG9yLmVxdWFscygiTkUiKSB8fCBvcGVyYXRvci5lcXVhbHMoIk5PVExJS0UiKSkgeworCQkJaWYgKCF2YWx1ZXMuY29udGFpbnModmFsdWUpKQorCQkJCXJjID0gbmV3IE1hdGNoaW5nUmVzdWx0KHRoaXMpOworCQl9CisJCXJldHVybiByYzsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZU9iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQ0ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZU9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLmxpZ2h0d2VpZ2h0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLk9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5SYW5nZWRQcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5SZXNvdXJjZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEZhY3RvcnkgdGhhdCB5aWVsZHMgc2VhcmNoYWJsZSBwcm9maWxlIG9iamVjdHMuCisgKgorICogQGF1dGhvciBLZWxseQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqLworY2xhc3MgU2VhcmNoYWJsZU9iamVjdEZhY3RvcnkgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKwlwdWJsaWMgUmFuZ2VkUHJvZmlsZUVsZW1lbnQgY3JlYXRlUmFuZ2VkUHJvZmlsZUVsZW1lbnQoUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgZGVzYywgU3RyaW5nIHR5cGUsCisJCVN0cmluZyB1bml0LCBMaXN0IHN5bm9ueW1zLCBib29sZWFuIG9ibGlnYXRpb24sIGludCBtYXhPY2N1cnJlbmNlLCBTdHJpbmcgY29tbWVudHMsIFN0cmluZyBtaW4sIFN0cmluZyBtYXgpIHsKKwkJcmV0dXJuIG5ldyBTZWFyY2hhYmxlUmFuZ2VkUHJvZmlsZUVsZW1lbnQoKFNlYXJjaGFibGVQcm9maWxlKSBwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsCisJCQlvYmxpZ2F0aW9uLCBtYXhPY2N1cnJlbmNlLCBjb21tZW50cywgbWluLCBtYXgpOworCX0KKwlwdWJsaWMgVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudCBjcmVhdGVVbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsCisJCVN0cmluZyB0eXBlLCBTdHJpbmcgdW5pdCwgTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnRzKSB7CisJCXJldHVybiBuZXcgU2VhcmNoYWJsZVVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQoKFNlYXJjaGFibGVQcm9maWxlKSBwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsCisJCQlvYmxpZ2F0aW9uLCBtYXhPY2N1cnJlbmNlLCBjb21tZW50cyk7CisJfQorCXB1YmxpYyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgY3JlYXRlRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KFByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsCisJCVN0cmluZyB0eXBlLCBTdHJpbmcgdW5pdCwgTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnRzLCBMaXN0IHZhbHVlcykgeworCQlyZXR1cm4gbmV3IFNlYXJjaGFibGVFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQoKFNlYXJjaGFibGVQcm9maWxlKSBwcm9maWxlLCBuYW1lLCBpZCwgZGVzYywgdHlwZSwgdW5pdCwgc3lub255bXMsCisJCQlvYmxpZ2F0aW9uLCBtYXhPY2N1cnJlbmNlLCBjb21tZW50cywgdmFsdWVzKTsKKwl9CisJcHVibGljIFByb2ZpbGUgY3JlYXRlUHJvZmlsZShFbGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIG5ldyBTZWFyY2hhYmxlUHJvZmlsZShub2RlLCB0aGlzKTsKKwl9CisJcHVibGljIFByb2ZpbGVBdHRyaWJ1dGVzIGNyZWF0ZVByb2ZpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gbmV3IFByb2ZpbGVBdHRyaWJ1dGVzKG5vZGUpOworCX0KKwlwdWJsaWMgUmVzb3VyY2VBdHRyaWJ1dGVzIGNyZWF0ZVJlc291cmNlQXR0cmlidXRlcyhQcm9maWxlIHByb2ZpbGUsIEVsZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gbmV3IFNlYXJjaGFibGVSZXNvdXJjZUF0dHJpYnV0ZXMoKFNlYXJjaGFibGVQcm9maWxlKSBwcm9maWxlLCBub2RlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlUHJvZmlsZS5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZVByb2ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTlhMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZVByb2ZpbGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLmxpZ2h0d2VpZ2h0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQSBwcm9maWxlIHRoYXQgY2FuIGJlIHNlYXJjaGVkLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjEuMSAkCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFyY2hhYmxlUHJvZmlsZSBleHRlbmRzIFByb2ZpbGUgeworCXB1YmxpYyBTZWFyY2hhYmxlUHJvZmlsZShFbGVtZW50IG5vZGUsIE9iamVjdEZhY3RvcnkgZmFjdG9yeSkgeworCQlzdXBlcihub2RlLCBmYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBTZWFyY2ggdGhpcyBwcm9maWxlLgorCSAqCisJICogQHBhcmFtIGV4cHJlc3Npb24gU3RhdGVtZW50IG9mIHdoYXQgdG8gcmV0cmlldmUuCisJICovCisJcHVibGljIFJlc3VsdCBzZWFyY2goV2hlcmVFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIGV4cHJlc3Npb24ucmVzdWx0KChTZWFyY2hhYmxlUmVzb3VyY2VBdHRyaWJ1dGVzKSByZXNBdHRyLCBlbGVtZW50cyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZVByb2ZpbGVFbGVtZW50LmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlUHJvZmlsZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE4MDkzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZVByb2ZpbGVFbGVtZW50LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFbGVtZW50OworCisvKioKKyAqIEEgcHJvZmlsZSBlbGVtZW50IHRoYXQgY2FuIGJlIHNlYXJjaGVkLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjEuMSAkCisgKi8KK2ludGVyZmFjZSBTZWFyY2hhYmxlUHJvZmlsZUVsZW1lbnQgeworCS8qKiBQcm9kdWNlIGEgc2VhcmNoIHJlc3VsdC4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgZGVzaXJlZCB2YWx1ZS4KKwkgKiBAcGFyYW0gb3BlcmF0b3IgV2hhdCBvcGVyYXRvciB0byB1c2UgZm9yIGNvbXBhcmlzb24uCisJICogQHJldHVybiBBIHNlYXJjaCByZXN1bHQuCisJICovCisJUmVzdWx0IHJlc3VsdChTdHJpbmcgdmFsdWUsIFN0cmluZyBvcGVyYXRvcik7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlUmFuZ2VkUHJvZmlsZUVsZW1lbnQuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1NlYXJjaGFibGVSYW5nZWRQcm9maWxlRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWUwZjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlUmFuZ2VkUHJvZmlsZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLmxpZ2h0d2VpZ2h0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUmFuZ2VkUHJvZmlsZUVsZW1lbnQ7CisKKy8qKgorICogU2VhcmNoYWJsZSBwcm9maWxlIGVsZW1lbnQgd2l0aCBhIHJhbmdlIG9mIHZhbGlkIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMS4xLjEgJAorICovCitwdWJsaWMgY2xhc3MgU2VhcmNoYWJsZVJhbmdlZFByb2ZpbGVFbGVtZW50IGV4dGVuZHMgUmFuZ2VkUHJvZmlsZUVsZW1lbnQgaW1wbGVtZW50cyBTZWFyY2hhYmxlUHJvZmlsZUVsZW1lbnQgeworCXB1YmxpYyBTZWFyY2hhYmxlUmFuZ2VkUHJvZmlsZUVsZW1lbnQoU2VhcmNoYWJsZVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsIFN0cmluZyB0eXBlLAorCQlTdHJpbmcgdW5pdCwgTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnQsIFN0cmluZyBtaW4sIFN0cmluZyBtYXgpIHsKKwkJc3VwZXIocHJvZmlsZSwgbmFtZSwgaWQsIGRlc2MsIHR5cGUsIHVuaXQsIHN5bm9ueW1zLCBvYmxpZ2F0aW9uLCBtYXhPY2N1cnJlbmNlLCBjb21tZW50LCBtaW4sIG1heCk7CisJfQorCisJcHVibGljIFJlc3VsdCByZXN1bHQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgb3BlcmF0b3IpIHsKKwkJUmVzdWx0IHJjID0gRmFsc2VSZXN1bHQuSU5TVEFOQ0U7CisJCWRvdWJsZSBudW1lcmljID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKKwkJaWYgKG9wZXJhdG9yLmVxdWFscygiRVEiKSB8fCBvcGVyYXRvci5lcXVhbHMoIkxJS0UiKSkgeworCQkJaWYgKERvdWJsZS5wYXJzZURvdWJsZShtaW4pIDw9IG51bWVyaWMgJiYgbnVtZXJpYyA8PSBEb3VibGUucGFyc2VEb3VibGUobWF4KSkgcmMgPSBuZXcgTWF0Y2hpbmdSZXN1bHQodGhpcyk7CisJCX0gZWxzZSBpZiAob3BlcmF0b3IuZXF1YWxzKCJORSIpIHx8IG9wZXJhdG9yLmVxdWFscygiTk9UTElLRSIpKSB7CisJCQlpZiAobnVtZXJpYyA8IERvdWJsZS5wYXJzZURvdWJsZShtaW4pIHx8IG51bWVyaWMgPiBEb3VibGUucGFyc2VEb3VibGUobWF4KSkgcmMgPSBuZXcgTWF0Y2hpbmdSZXN1bHQodGhpcyk7CisJCX0gZWxzZSBpZiAob3BlcmF0b3IuZXF1YWxzKCJMVCIpKSB7CisJCQlpZiAobnVtZXJpYyA+IERvdWJsZS5wYXJzZURvdWJsZShtaW4pKSByYyA9IG5ldyBNYXRjaGluZ1Jlc3VsdCh0aGlzKTsKKwkJfSBlbHNlIGlmIChvcGVyYXRvci5lcXVhbHMoIkdUIikpIHsKKwkJCWlmIChudW1lcmljIDwgRG91YmxlLnBhcnNlRG91YmxlKG1heCkpIHJjID0gbmV3IE1hdGNoaW5nUmVzdWx0KHRoaXMpOworCQl9IGVsc2UgaWYgKG9wZXJhdG9yLmVxdWFscygiTEUiKSkgeworCQkJaWYgKG51bWVyaWMgPj0gRG91YmxlLnBhcnNlRG91YmxlKG1pbikpIHJjID0gbmV3IE1hdGNoaW5nUmVzdWx0KHRoaXMpOworCQl9IGVsc2UgeworCQkJaWYgKG51bWVyaWMgPD0gRG91YmxlLnBhcnNlRG91YmxlKG1heCkpIHJjID0gbmV3IE1hdGNoaW5nUmVzdWx0KHRoaXMpOworCQl9CisJCXJldHVybiByYzsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlUmVzb3VyY2VBdHRyaWJ1dGVzLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlUmVzb3VyY2VBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMmY5OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1NlYXJjaGFibGVSZXNvdXJjZUF0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5saWdodHdlaWdodDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5SZXNvdXJjZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBSZXNvdXJjZSBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNlYXJjaGVkLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xLjEuMSAkCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFyY2hhYmxlUmVzb3VyY2VBdHRyaWJ1dGVzIGV4dGVuZHMgUmVzb3VyY2VBdHRyaWJ1dGVzIHsKKwlwdWJsaWMgU2VhcmNoYWJsZVJlc291cmNlQXR0cmlidXRlcyhTZWFyY2hhYmxlUHJvZmlsZSBwcm9maWxlLCBFbGVtZW50IG5vZGUpIHsKKwkJc3VwZXIocHJvZmlsZSwgbm9kZSk7CisJfQorCisJLyoqCisJICogUHJvZHVjZSBhIHNlYXJjaCByZXN1bHQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgRGVzaXJlZCB2YWx1ZS4KKwkgKiBAcGFyYW0gb3BlcmF0b3IgV2hhdCBvcGVyYXRvciB0byB1c2UgZm9yIGNvbXBhcmlzb24uCisJICogQHJldHVybiBhIDxjb2RlPlJlc3VsdDwvY29kZT4gdmFsdWUuCisJICovCisJcHVibGljIFJlc3VsdCByZXN1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIG9wZXJhdG9yKSB7CisJCWlmICgiSWRlbnRpZmllciIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoaWRlbnRpZmllciwgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIlRpdGxlIi5lcXVhbHMobmFtZSkpCisJCQlyZXR1cm4gY29tcHV0ZVJlc3VsdCh0aXRsZSwgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIkZvcm1hdCIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoZm9ybWF0cywgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIkRlc2NyaXB0aW9uIi5lcXVhbHMobmFtZSkpCisJCQlyZXR1cm4gY29tcHV0ZVJlc3VsdChkZXNjcmlwdGlvbiwgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIkNyZWF0b3IiLmVxdWFscyhuYW1lKSkKKwkJCXJldHVybiBjb21wdXRlUmVzdWx0KGNyZWF0b3JzLCB2YWx1ZSwgb3BlcmF0b3IpOworCQllbHNlIGlmICgiU3ViamVjdCIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoc3ViamVjdHMsIHZhbHVlLCBvcGVyYXRvcik7CisJCWVsc2UgaWYgKCJQdWJsaXNoZXIiLmVxdWFscyhuYW1lKSkKKwkJCXJldHVybiBjb21wdXRlUmVzdWx0KHB1Ymxpc2hlcnMsIHZhbHVlLCBvcGVyYXRvcik7CisJCWVsc2UgaWYgKCJDb250cmlidXRvciIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoY29udHJpYnV0b3JzLCB2YWx1ZSwgb3BlcmF0b3IpOworCQllbHNlIGlmICgiRGF0ZSIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoZGF0ZXMsIHZhbHVlLCBvcGVyYXRvcik7CisJCWVsc2UgaWYgKCJUeXBlIi5lcXVhbHMobmFtZSkpCisJCQlyZXR1cm4gY29tcHV0ZVJlc3VsdCh0eXBlcywgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIlNvdXJjZSIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoc291cmNlcywgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIkxhbmd1YWdlIi5lcXVhbHMobmFtZSkpCisJCQlyZXR1cm4gY29tcHV0ZVJlc3VsdChsYW5ndWFnZXMsIHZhbHVlLCBvcGVyYXRvcik7CisJCWVsc2UgaWYgKCJSZWxhdGlvbiIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQocmVsYXRpb25zLCB2YWx1ZSwgb3BlcmF0b3IpOworCQllbHNlIGlmICgiQ292ZXJhZ2UiLmVxdWFscyhuYW1lKSkKKwkJCXJldHVybiBjb21wdXRlUmVzdWx0KGNvdmVyYWdlcywgdmFsdWUsIG9wZXJhdG9yKTsKKwkJZWxzZSBpZiAoIlJpZ2h0cyIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQocmlnaHRzLCB2YWx1ZSwgb3BlcmF0b3IpOworCQllbHNlIGlmICgicmVzQ29udGV4dCIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoY29udGV4dHMsIHZhbHVlLCBvcGVyYXRvcik7CisJCWVsc2UgaWYgKCJyZXNDbGFzcyIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQoY2xhenosIHZhbHVlLCBvcGVyYXRvcik7CisJCWVsc2UgaWYgKCJyZXNMb2NhdGlvbiIuZXF1YWxzKG5hbWUpKQorCQkJcmV0dXJuIGNvbXB1dGVSZXN1bHQobG9jYXRpb25zLCB2YWx1ZSwgb3BlcmF0b3IpOworCQllbHNlCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGF0dHJpYnV0ZSBcIiIgKyBuYW1lICsgIlwiIik7CisJfQorCisJcHJpdmF0ZSBSZXN1bHQgY29tcHV0ZVJlc3VsdChTdHJpbmcgYSwgU3RyaW5nIGIsIFN0cmluZyBvcCkgeworCQlpbnQgYyA9IGEuY29tcGFyZVRvKGIpOworCQlib29sZWFuIHQ7CisJCWlmICgiRVEiLmVxdWFscyhvcCkgfHwgIkxJS0UiLmVxdWFscyhvcCkpCisJCQl0ID0gYyA9PSAwOworCQllbHNlIGlmICgiR0UiLmVxdWFscyhvcCkpCisJCQl0ID0gYyA+PSAwOworCQllbHNlIGlmICgiR1QiLmVxdWFscyhvcCkpCisJCQl0ID0gYyA+IDA7CisJCWVsc2UgaWYgKCJMRSIuZXF1YWxzKG9wKSkKKwkJCXQgPSBjIDw9IDA7CisJCWVsc2UgaWYgKCJMVCIuZXF1YWxzKG9wKSkKKwkJCXQgPSBjIDwgMDsKKwkJZWxzZSBpZiAoIk5FIi5lcXVhbHMob3ApIHx8ICJOT1RMSUtFIi5lcXVhbHMob3ApKQorCQkJdCA9IGMgIT0gMDsKKwkJZWxzZQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biByZWxhdGlvbmFsIG9wZXJhdG9yIFwiIiArIG9wICsgIlwiIik7CisJCWlmICh0KQorCQkJcmV0dXJuIG5ldyBNYXRjaGluZ1Jlc3VsdChuZXcgSGFzaFNldChwcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpLnZhbHVlcygpKSk7CisJCWVsc2UKKwkJCXJldHVybiBGYWxzZVJlc3VsdC5JTlNUQU5DRTsKKwl9CisKKwlwcml2YXRlIFJlc3VsdCBjb21wdXRlUmVzdWx0KExpc3QgYSwgU3RyaW5nIGIsIFN0cmluZyBvcCkgewkJCisJCWlmIChhID09IG51bGwgfHwgYS5pc0VtcHR5KCkpIHJldHVybiBGYWxzZVJlc3VsdC5JTlNUQU5DRTsKKworCQlSZXN1bHQgZiA9IEZhbHNlUmVzdWx0LklOU1RBTkNFOworCQlSZXN1bHQgdCA9IG5ldyBNYXRjaGluZ1Jlc3VsdChuZXcgSGFzaFNldChwcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpLnZhbHVlcygpKSk7CisJCVJlc3VsdCByYyA9IGY7CisJCWlmICgiRVEiLmVxdWFscyhvcCkgfHwgIkxJS0UiLmVxdWFscyhvcCkpCisJCQlpZiAoYS5jb250YWlucyhiKSkgcmMgPSB0OworCQllbHNlIGlmICgiTkUiLmVxdWFscyhvcCkgIHx8ICJOT1RMSUtFIi5lcXVhbHMob3ApKQorCQkJaWYgKCFhLmNvbnRhaW5zKGIpKSByYyA9IHQ7CisJCWVsc2UgaWYgKCJMVCIuZXF1YWxzKG9wKSB8fCAiR1QiLmVxdWFscyhvcCkgfHwgIkxFIi5lcXVhbHMob3ApIHx8ICJHRSIuZXF1YWxzKG9wKSkgeworCQkJZm9yIChJdGVyYXRvciBpID0gYS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKwkJCQlyYyA9IGNvbXB1dGVSZXN1bHQodmFsdWUsIGIsIG9wKTsKKwkJCQlpZiAocmMgIT0gZikgYnJlYWs7CisJCQl9CisJCX0gZWxzZSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHJlbGF0aW9uYWwgb3BlcmF0b3IgXCIiICsgb3AgKyAiXCIiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9TZWFyY2hhYmxlVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZVVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDgwODc3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvU2VhcmNoYWJsZVVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLmxpZ2h0d2VpZ2h0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuVW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudDsKKworLyoqCisgKiBTZWFyY2hhYmxlIHByb2ZpbGUgZWxlbWVudCB3aXRoIHVuc3BlY2lmaWVkIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMS4xLjEgJAorICovCitwdWJsaWMgY2xhc3MgU2VhcmNoYWJsZVVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQgZXh0ZW5kcyBVbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50IGltcGxlbWVudHMgU2VhcmNoYWJsZVByb2ZpbGVFbGVtZW50IHsKKwlwdWJsaWMgU2VhcmNoYWJsZVVuc3BlY2lmaWVkUHJvZmlsZUVsZW1lbnQoU2VhcmNoYWJsZVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIGRlc2MsIFN0cmluZyB0eXBlLAorCQlTdHJpbmcgdW5pdCwgTGlzdCBzeW5vbnltcywgYm9vbGVhbiBvYmxpZ2F0aW9uLCBpbnQgbWF4T2NjdXJyZW5jZSwgU3RyaW5nIGNvbW1lbnQpIHsKKwkJc3VwZXIocHJvZmlsZSwgbmFtZSwgaWQsIGRlc2MsIHR5cGUsIHVuaXQsIHN5bm9ueW1zLCBvYmxpZ2F0aW9uLCBtYXhPY2N1cnJlbmNlLCBjb21tZW50KTsKKwl9CisKKwlwdWJsaWMgUmVzdWx0IHJlc3VsdChTdHJpbmcgdmFsdWUsIFN0cmluZyBvcGVyYXRvcikgeworCQlyZXR1cm4gbmV3IE1hdGNoaW5nUmVzdWx0KHRoaXMpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1VuaW9uLmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9Vbmlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzY3MGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9Vbmlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGVFbGVtZW50OworCisvKioKKyAqIEEgdW5pb24gb2YgbWF0Y2hpbmcgZWxlbWVudHMuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitjbGFzcyBVbmlvbiBpbXBsZW1lbnRzIFJlc3VsdCB7CisJLyoqCisJICogQ29uc3RydWN0IGEgdW5pb24uCisJICoKKwkgKiBAcGFyYW0gbGhzIExlZnQtaGFuZCBzaWRlCisJICogQHBhcmFtIHJocyBSaWdodC1oYW5kIHNpZGUuCisJICovCisJcHVibGljIFVuaW9uKFJlc3VsdCBsaHMsIFJlc3VsdCByaHMpIHsKKwkJdGhpcy5saHMgPSBsaHM7CisJCXRoaXMucmhzID0gcmhzOworCX0KKworCXB1YmxpYyBTZXQgbWF0Y2hpbmdFbGVtZW50cygpIHsKKwkJU2V0IHVuaW9uID0gUHJvZmlsZUVsZW1lbnQucHJvZmlsZXMobGhzLm1hdGNoaW5nRWxlbWVudHMoKSk7CisJCXVuaW9uLmFkZEFsbChQcm9maWxlRWxlbWVudC5wcm9maWxlcyhyaHMubWF0Y2hpbmdFbGVtZW50cygpKSk7CisJCVNldCByYyA9IFByb2ZpbGVFbGVtZW50LmVsZW1lbnRzKHVuaW9uLCBsaHMubWF0Y2hpbmdFbGVtZW50cygpKTsKKwkJcmMuYWRkQWxsKFByb2ZpbGVFbGVtZW50LmVsZW1lbnRzKHVuaW9uLCByaHMubWF0Y2hpbmdFbGVtZW50cygpKSk7CisJCXJldHVybiByYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gInVuaW9uWyIgKyBsaHMgKyAiLCIgKyByaHMgKyAiXSI7CisJfQorCisJLyoqIExlZnQtaGFuZCBzaWRlIG9mIHRoZSByZXN1bHQuICovCisJcHJpdmF0ZSBSZXN1bHQgbGhzOworCisJLyoqIFJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgcmVzdWx0LiAqLworCXByaXZhdGUgUmVzdWx0IHJoczsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1doZXJlRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvV2hlcmVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0ODhhNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L1doZXJlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgd2hlcmUtZXhwcmVzc2lvbi4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2ludGVyZmFjZSBXaGVyZUV4cHJlc3Npb24geworCS8qKgorCSAqIENvbXB1dGUgdGhlIHJlc3VsdCB0cmVlIG9mIHRoaXMgd2hlcmUgZXhwcmVzc2lvbiBiYXNlZCBvbiB0aGUgbWFwIG9mIHByb2ZpbGUgZWxlbWVudHMuCisJICoKKwkgKiBAcGFyYW0gcmVzQXR0ciBSZXNvdXJjZSBhdHRyaWJ1dGVzIHRvIGNoZWNrLgorCSAqIEBwYXJhbSBlbGVtZW50cyBNYXAgZnJvbSB7QGxpbmsgU3RyaW5nfSBlbGVtZW50IG5hbWUgdG8ge0BsaW5rIFByb2ZpbGVFbGVtZW50fS4KKwkgKiBAcmV0dXJuIEEgcmVzdWx0IHRyZWUgdGhhdCB3aGVuIGV2YWx1YXRlZCB5aWVsZHMgbWF0Y2hpbmcge0BsaW5rIFByb2ZpbGVFbGVtZW50fXMuCisJICovCisJUmVzdWx0IHJlc3VsdChTZWFyY2hhYmxlUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc0F0dHIsIE1hcCBlbGVtZW50cyk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhpcyBleHByZXNzaW9uLgorCSAqCisJICogT3VyIHJlc3VsdCBnZW5lcmF0aW9uIGNhbid0IGhhbmRsZSAiTk9UIiBleHByZXNzaW9ucyAobGlrZSAibm90IChibGFoIDwgMykiKQorCSAqIHNpbmNlIHdlIGNhbid0IGRvIHNldCBpbnZlcnNpb24sIHNvIHdlIHNpbXBsaWZ5IHRoZSBleHByZXNzaW9uIGJ5IHJlbW92aW5nIGFsbAorCSAqICJOT1QiIG5vZGVzLgorCSAqCisJICogQHJldHVybiBBbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gd2l0aG91dCBuZWdhdGl2ZSBub2Rlcy4KKwkgKi8KKwlXaGVyZUV4cHJlc3Npb24gc2ltcGxpZnkoKTsKKworCS8qKgorCSAqIE5lZ2F0ZSB0aGlzIGV4cHJlc3Npb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuZWdhdGlvbiBvZiB0aGlzIGV4cHJlc3Npb24uCisJICovCisJV2hlcmVFeHByZXNzaW9uIG5lZ2F0ZSgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvcGFja2FnZS5odG1sIGIvMC4xMC9wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDczY2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkxpZ2h0d2VpZ2h0IFByb2ZpbGUgSGFuZGxlci4KKyAgICA8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkxpZ2h0d2VpZ2h0IHByb2ZpbGUgaGFuZGxlci4gIFRoZSBsaWdodHdlaWdodCBwcm9maWxlIGhhbmRsZXIKKyAgICAgIGlzIGxpZ2h0d2VpZ2h0IGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uIGFueSBleHRlcm5hbAorICAgICAgc2VhcmNoL3JldHJpZXZhbCBtZWNoYW5pc20uICBJdCdzIDEwMCUgcHVyZSBKYXZhLCBiYWJ5LgorICAgIDwvcD4KKyAgICA8cD5UbyB1c2UgdGhpcyBoYW5kbGVyLCBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBjb250YWlucyB0aGUKKyAgICAgIHByb2ZpbGVzIHlvdSB3YW50IHRvIHNlcnZlLiAgU2V0IHRoZSBzeXN0ZW0gcHJvcGVydHkKKyAgICAgIDxjb2RlPnByb2ZpbGVzLnVybDwvY29kZT4KKyAgICAgIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGF0IGZpbGUuICBGaXJlICdlciB1cC4KKyAgICA8L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvZXhhbXBsZXMvc3JjLmphciBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvZXhhbXBsZXMvc3JjLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWRiYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9leGFtcGxlcy9zcmMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NsYXNzLnBuZyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NsYXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGE3YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2xhc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NsYXNzLnBzZCBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NsYXNzLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTIwZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2xhc3MucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2RlbGVnYXRpb24ucG5nIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZGVsZWdhdGlvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4ZDVjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2RlbGVnYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2RlbGVnYXRpb24ucHNkIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZGVsZWdhdGlvbi5wc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMmZkOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2RlbGVnYXRpb24ucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2dyaWQtcHJvZmlsZS5qcGcgYi8wLjEwL3Byb2ZpbGUvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9ncmlkLXByb2ZpbGUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzE1NjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9ncmlkLXByb2ZpbGUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N0YWNrLnBuZyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N0YWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg1NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvc3RhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N0YWNrLnBzZCBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N0YWNrLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDIzZTJkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvc3RhY2sucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUucG5nIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvdHJlZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjZjMxZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUucHNkIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvdHJlZS5wc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxY2U5OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ZlY2RmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJQcm9maWxlIFNlcnZpY2UiPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICAgIDxpdGVtIG5hbWU9IkdyaWQiIGhyZWY9Ii4uL2dyaWQvIi8+CisgICAgPC9saW5rcz4KKworICAgIDxtZW51IHJlZj0icmVwb3J0cyIgaW5oZXJpdD0iYm90dG9tIi8+CisgICAgPG1lbnUgbmFtZT0iVXNlcidzIEd1aWRlIj4KKyAgICAgIDxpdGVtIG5hbWU9IkluZm9ybWF0aW9uIENhcHR1cmVkIiBocmVmPSJpbmZvLyIvPgorICAgICAgPGl0ZW0gbmFtZT0iUXVlcnlpbmcgUHJvZmlsZXMiIGhyZWY9InF1ZXJ5aW5nLyIvPgorICAgICAgPGl0ZW0gbmFtZT0iUHJvZmlsZSBSZXByLiIgaHJlZj0icmVwLyIvPgorICAgICAgPGl0ZW0gbmFtZT0iQmFzaWMgSGFuZGxlciIgaHJlZj0iaGFuZGxlci8iLz4KKyAgICAgIDxpdGVtIG5hbWU9IkFkdmFuY2VkIEhhbmRsZXIiIGhyZWY9ImFkdi8iLz4KKyAgICA8L21lbnU+CisgICAgCisgIDwvYm9keT4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL2Fkdi9pbmRleC54bWwgYi8wLjEwL3Byb2ZpbGUvc3JjL3NpdGUveGRvYy9hZHYvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjOGI5MTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3NpdGUveGRvYy9hZHYvaW5kZXgueG1sCkBAIC0wLDAgKzEsMTA3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yDQorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yDQorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcw0KK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdA0KK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZg0KK3RoZSBMaWNlbnNlIGF0DQorDQorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVA0KK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUNCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcg0KK3RoZSBMaWNlbnNlLg0KKy0tPg0KKzxkb2N1bWVudD4NCisgIDxwcm9wZXJ0aWVzPg0KKyAgICA8dGl0bGU+RGV2ZWxvcGluZyBhIFJlYWwgUHJvZmlsZSBIYW5kbGVyPC90aXRsZT4NCisgICAgPGF1dGhvciBlbWFpbD0iU2Vhbi5LZWxseUBqcGwubmFzYS5nb3YiPlNlYW4gS2VsbHk8L2F1dGhvcj4NCisgIDwvcHJvcGVydGllcz4NCisgIDwhLS0gV2l6enkgTm9pc2UgLSBIYWlrdSAtLT4NCisgIDxib2R5Pg0KKyAgICA8c2VjdGlvbiBuYW1lPSJEZXZlbG9waW5nIGEgUmVhbCBQcm9maWxlIEhhbmRsZXIiPg0KKyAgICAgIDxwPkluIHRoZSA8YSBocmVmPSIuLi9oYW5kbGVyLyI+YmFzaWMgcHJvZmlsZSBoYW5kbGVyDQorCSAgdHV0b3JpYWw8L2E+LCB3ZSBkZXZlbG9wZWQgYSBwcm9maWxlIGhhbmRsZXIgdGhhdCBhbnN3ZXJlZA0KKwlldmVyeSBxdWVyeSB3aXRoIGEgbGlzdCBvZiBleGFjdGx5IHplcm8gcHJvZmlsZSBvYmplY3RzLiAgSXQNCisJYWxzbyByZXNwb25kZWQgdG8gcmVxdWVzdHMgdG8gcmV0cmlldmUgYSBwcm9maWxlIGJ5IGENCisJc3BlY2lmaWMgSUQgd2l0aCA8Y29kZT5udWxsPC9jb2RlPiwgbWVhbmluZyAibm90IGZvdW5kIGJ5DQorCXRoaXMgaGFuZGxlci4iICBVc2VmdWwsIGh1aD8gIE5vdCByZWFsbHkuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkJ1dCBpdCBkaWQgZ2V0IG91ciBwcm9maWxlIHNlcnZlciByZWFkeSBmb3IgPGVtPnRoaXM8L2VtPg0KKwl0dXRvcmlhbCwgd2hlcmUgd2UnbGwgd3JpdGUgYSA8ZW0+cmVhbDwvZW0+IHByb2ZpbGUgaGFuZGxlcg0KKwl0aGF0IGFuYWx5emVzIGluY29taW5nIHF1ZXJpZXMsIGNvbnN1bHRzIGEgbG9jYWwgImRhdGFiYXNlIiwNCisJY29uc3RydWN0cyBhIHNldCBvZiBtYXRjaGluZyBwcm9maWxlIHJlc3VsdHMsIGFuZCByZXNwb25kcyB0bw0KKwlyZXF1ZXN0cyB0byBwcm9maWxlcyBieSBJRC4gIEdldCBzb21lIGZyZXNoIGNvZmZlZSwgYmVjYXVzZQ0KKwl0aGlzIGlzIGdvaW5nIHRvIGJlIGEgdG91Z2ggb25lLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5BbmQgeWVzLCB5b3UnbGwgbmVlZCB0byBoYXZlIGdvbmUgdGhyb3VnaCA8ZW0+YWxsPC9lbT4gb2YgdGhlDQorCWZvbGxvd2luZyBiZWZvcmUgcHJvY2VlZGluZzoNCisgICAgICA8L3A+DQorDQorICAgICAgPHVsPg0KKwk8bGk+PGEgaHJlZj0iLi4vaW5mby8iPkluZm9ybWF0aW9uIENhcHR1cmVkIGluIGEgUHJvZmlsZTwvYT48L2xpPg0KKwk8bGk+PGEgaHJlZj0iLi4vcXVlcnlpbmcvIj5RdWVyeWluZyBQcm9maWxlczwvYT48L2xpPg0KKwk8bGk+PGEgaHJlZj0iLi4vcmVwIj5Qcm9maWxlIFJlcHJlc2VudGF0aW9uPC9hPjwvbGk+DQorCTxsaT48YSBocmVmPSIuLi9oYW5kbGVyIj5EZXZlbG9waW5nIGEgUHJvZmlsZSBIYW5kbGVyPC9hPjwvbGk+DQorICAgICAgPC91bD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSJUaGUgTXVzaWMgRGF0YWJhc2UiPg0KKyAgICAgIDxwPkxldCdzIHNheSB5b3UndmUgZ290IGFuIE9PRFQgPGEgaHJlZj0iL2dyaWQtcHJvZHVjdC8iPnByb2R1Y3QNCisJICBzZXJ2ZXI8L2E+IGFscmVhZHkgcnVubmluZyB0aGF0IHNlcnZlcyB1cCB5b3VyIGZhdm9yaXRlDQorCSAgbXVzaWMgZmlsZXMuICBBbGwgeW91IGhhdmUgdG8gZG8gaXMgcGFzcyBpbiB0aGUgVVJJIHRvIGENCisJICB0cmFjayBhbmQgaXQgc3BpdHMgYmFjayB0aGUgTVAzIGRhdGEgd2hpY2ggY2FuIHJ1biBpbnRvIHlvdXINCisJICBmYXZvcml0ZSBtZWRpYSBwbGF5ZXIuICBZb3UndmUgc2V0IGl0IHVwIHNvIHlvdXIgVVJJcyBhcmUNCisJICBhbGwgdW5pcXVlIGZvciBlYWNoIHRyYWNrLCBhbmQgeW91IGp1c3QgaGF2ZSB0byBwYXNzIGluIGFuDQorCSAgdW5wYXJzZWQgWE1MUXVlcnkgbGlrZSA8Y29kZT51cm46c2s6dHI1QjdFLm1wMzwvY29kZT4gYW5kDQorCSAgeW91IGdldCB0aGUgbWF0Y2hpbmcgZGF0YS4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+QnV0IHNpbmNlIHlvdSdyZSBub3QgaW4gdGhlIGhhYml0IG9mIG1lbW9yaXppbmcgaGV4YWRlY2ltYWwNCisJbnVtYmVycyBpbnNpZGUgb2YgVVJJcywgbGV0J3Mgd3JpdGUgYSBwcm9maWxlIHNlcnZlciB3aG8ncyBqb2INCisJaXQgaXMgdG8gdGFrZSBxdWVyaWVzIGZvciBzcGVjaWZpYyBhcnRpc3RzLCBnZW5yZXMsIGFsYnVtcywNCisJcmF0aW5ncywgdHJhY2sgdGl0bGVzLCBhbmQgc28gZm9ydGgsIGFuZCBzcGl0IG91dCB0aGUgbWF0Y2hpbmcNCisJcHJvZmlsZXMuICBUaGUgcHJvZmlsZXMgaGF2ZSBhIHBsYWNlcyBmb3IgYSBVUkkgKGluIHRoZQ0KKwk8Y29kZT5JZGVudGlmaWVyPC9jb2RlPiBmaWVsZCkgdGhhdCB5b3UgY2FuIHRoZW4gcGFzcyB0byB0aGUNCisJaHlwb3RoZXRpY2FsIHByb2R1Y3Qgc2VydmVyIHRvIGdldCB0aGUgdHJhY2sgZGF0YS4gIChJbiBmYWN0LA0KKwl0aGlzIGlzIGEgY29tbW9uIE9PRFQgcGF0dGVybjogcHJvZmlsZSBxdWVyeSB0byBkbyByZXNvdXJjZQ0KKwlsb2NhdGlvbiwgcHJvZHVjdCBxdWVyeSB0byBkbyByZXNvdXJjZSByZXRyaWV2YWwuKSAgV2hpbGUNCisJeW91J3JlIGxpc3RlbmluZyB0byB0aGUgdHJhY2ssIHlvdSBjYW4gcmVhZCBhbGwgc29ydHMgb2Ygb3RoZXINCisJanVpY3kgbWV0YWRhdGEgYWJvdXQgaXQgYnkgZXhhbWluaW5nIHRoZSByZXR1cm5lZCBwcm9maWxlLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUaGUgTWV0YWRhdGEiPg0KKwk8cD5Gb3IgdGhpcyBkZW1vbnN0cmF0aW9uLCB3ZSdsbCBqdXN0IGZvY3VzIG9uIHRocmVlIGtpbmRzIG9mDQorCSAgbWV0YWRhdGEgaW5zdGVhZCBvZiBnb2luZyBhbGwtb3V0LCA8YQ0KKwkgICAgaHJlZj0iaHR0cDovL3d3dy5hcHBsZS5jb20vaXR1bmVzLyI+aVR1bmVzPC9hPiBzdHlsZToNCisJPC9wPg0KKw0KKwk8dWw+DQorCSAgPGxpPkFydGlzdCBuYW1lPC9saT4NCisJICA8bGk+QWxidW0gbmFtZTwvbGk+DQorCSAgPGxpPlRyYWNrIG5hbWU8L2xpPg0KKwk8L3VsPg0KKw0KKwk8cD5FYWNoIHByb2ZpbGUgd2lsbCBkZXNjcmliZSBhIHNpbmdsZSB0cmFjay4gIFRoZSByZXNvdXJjZQ0KKwkgIGF0dHJpYnV0ZXMgd2lsbCBoYXZlOg0KKwk8L3A+DQorDQorCTx1bD4NCisJICA8bGk+VGhlIFVSSSBvZiB0aGUgdHJhY2sgYXMgdGhlIDxjb2RlPklkZW50aWZpZXI8L2NvZGU+LjwvbGk+DQorCSAgPGxpPlRoZSBuYW1lIG9mIHRoZSB0cmFjayBhcyB0aGUgPGNvZGU+VGl0bGU8L2NvZGU+LjwvbGk+DQorCSAgPGxpPlRoZSBuYW1lIG9mIHRoZSBhcnRpc3QgYXMgdGhlIDxjb2RlPkNyZWF0b3I8L2NvZGU+LjwvbGk+DQorCTwvdWw+DQorDQorCTxwPkluIGFkZGl0aW9uLCB3ZSdsbCBwdXQgaW4gdHdvIHByb2ZpbGUgZWxlbWVudHM6PC9wPg0KKw0KKwk8dWw+DQorCSAgPGxpPlRoZSBuYW1lIG9mIHRoZSBhbGJ1bSBhcyBhbg0KKwkgICAgPGNvZGU+RW51bWVyYXRlZFByb2ZpbGVFbGVtZW50PC9jb2RlPi4NCisJICA8L2xpPg0KKwkgIDxsaT5UaGUgbmFtZSBvZiB0aGUgYXJ0aXN0IGFzIGFuDQorCSAgICA8Y29kZT5FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQ8L2NvZGU+LiAgWWVzLCB0aGlzIGlzDQorCSAgICByZWR1bmRhbnQgd2l0aCB0aGUgYXJ0aXN0IG5hbWVkIGFzIHRoZSA8Y29kZT5DcmVhdG9yPC9jb2RlPg0KKwkgICAgaW4gdGhlIHJlc291cmNlIGF0dHJpYnV0ZXM7IGJ1dCBvbmUgcHJvZmlsZSBlbGVtZW50IGJ5DQorCSAgICBpdHNlbGYgd291bGQgZ2V0IHRvbyBsb25lbHkhPC9saT4NCisJPC91bD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUXVlcnkgU3R5bGUiPg0KKwk8cD5Cb3RoIHByb2R1Y3QgaGFuZGxlcnMgYW5kIHByb2ZpbGUgaGFuZGxlcnMgZ2V0IHRvIGNob29zZQ0KKwkgIHdoZXRoZXIgdGhleSB3YW50IHVucGFyc2VkIHF1ZXJ5IGV4cHJlc3Npb25zIGluIHRoZWlyDQorCSAgWE1MUXVlcnkgb2JqZWN0cyBvciBpZiB0aGV5IHdhbnQgcGFyc2VkIHF1ZXJ5IGV4cHJlc3Npb25zLg0KKwkgIFBhcnNlZCBxdWVyeSBleHByZXNzaW9ucyBnZW5lcmF0ZSB0aGUgIndoZXJlIiBib29sZWFuIHN0YWNrLg0KKwkgIFdoaWxlIHRoZSBwcm9kdWN0IHNlcnZlciB0aGF0IHRoaXMgcHJvZmlsZSBzZXJ2ZXIgaXMgbWVhbnQNCisJICB0byB3b3JrIHdpdGggd2FudHMgdW5wYXJzZWQgb25lcywgd2UnbGwgdXNlIHBhcnNlZA0KKwkgIGV4cHJlc3Npb25zIGZvciB0aGlzIHByb2ZpbGUgaGFuZGxlci4gIFdoeT8gIFdlbGwsIGhhdmluZyBhDQorCSAgd2VsbC1kZWZpbmVkIHF1ZXJ5IGxhbmd1YWdlIGFuZCBhIHdheSB0byBvcGVyYXRlIG9uIGl0IHdpbGwNCisJICBzYXZlIGEgbGl0dGxlIHRyb3VibGUgZnJvbSB1cyBoYXZpbmcgdG8gZ2VuZXJhdGUgYSBwYXJzZXIuDQorCTwvcD4NCisNCisJPHA+VGhlIHF1ZXJpZXMgd2lsbCB1c2UgZWxlbWVudCBuYW1lcyA8Y29kZT5hcnRpc3Q8L2NvZGU+LA0KKwkgIDxjb2RlPmFsYnVtPC9jb2RlPiwgYW5kIDxjb2RlPnRyYWNrPC9jb2RlPiBvbmx5LCB0byBtYXRjaA0KKwkgIHdoYXQgd2UnbGwgc2F2ZSBpbiBvdXIgbXVzaWMgZGF0YWJhc2UuICBIZXJlIGFyZSBhIGNvdXBsZSBleGFtcGxlIHF1ZXJpZXM6DQorCTwvcD4NCisNCisJPHNvdXJjZT5hcnRpc3QgPSBCZWF0bGVzIEFORCBhbGJ1bSA9IFJldm9sdmVyDQordHJhY2sgPSAnQmx1ZSBTdWVkZSBTaG9lcyc8L3NvdXJjZT4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iRGV2ZWxvcGluZyB0aGUgSGFuZGxlciI+DQorICAgICAgPHA+V2UnbGwgZGV2ZWxvcCB0aGUgaGFuZGxlciBpbiBwYXJ0cywgc28gd2UgY2FuIGRpc2N1c3MgZWFjaA0KKwlzZWN0aW9uLCBhbmQgdGhlbiBzaG93IHRoZSBlbnRpcmUgc291cmNlIGZpbGUuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J01ha2luZyB0aGUgIkRhdGFiYXNlIic+DQorCTxwPk91ciBtdXNpYyBkYXRhYmFzZSB3aWxsIGJlIG5vdGhpbmcgbW9yZSB0aGFuIEphdmEgb2JqZWN0cw0KKwkgIGtlcHQgaW4gbWVtb3J5LiAgV2UnbGwgY3JlYXRlIHNlcGFyYXRlIG9iamVjdHMgb2YgdGhyZWUNCisJICBjbGFzc2VzOg0KKwk8L3A+DQorDQorCTx1bD4NCisJICA8bGk+PGNvZGU+QXJ0aXN0PC9jb2RlPi4gIDxjb2RlPkFydGlzdDwvY29kZT4gb2JqZWN0cyByZXByZXNlbnQNCisJICAgICAgcGVvcGxlIG9yIGdyb3VwcyB3aG8gY3JlYXRlIG11c2ljLiAgPGNvZGU+QXJ0aXN0PC9jb2RlPnMNCisJICAgICAgd2lsbCBoYXZlIHplcm8gb3IgbW9yZSA8Y29kZT5UcmFjazwvY29kZT5zLg0KKwkgIDwvbGk+DQorCSAgPGxpPjxjb2RlPkFsYnVtPC9jb2RlPi4gIDxjb2RlPkFsYnVtPC9jb2RlPiBvYmplY3RzIGFyZQ0KKwkgICAgY29sbGVjdGlvbnMgb2YgPGNvZGU+VHJhY2s8L2NvZGU+cy4NCisJICA8L2xpPg0KKwkgIDxsaT48Y29kZT5UcmFjazwvY29kZT4uICA8Y29kZT5UcmFjazwvY29kZT4gb2JqZWN0cyBhcHBlYXINCisJICAgIG9uIG9uZSA8Y29kZT5BbGJ1bTwvY29kZT4gYW5kIGFyZSBtYWRlIGJ5IG9uZQ0KKwkgICAgPGNvZGU+QXJ0aXN0PC9jb2RlPi4gIFRoZXkgaGF2ZSB0aGUgVVJOIG5lY2Vzc2FyeSB0byBwYXNzDQorCSAgICB0byB0aGUgaHlwb3RoZXRpY2FsIG11c2ljIHByb2R1Y3Qgc2VydmVyIGluIG9yZGVyIHRvDQorCSAgICBhY3R1YWxseSBwbGF5IG11c2ljLg0KKwkgIDwvbGk+DQorCTwvdWw+DQorDQorCTxwPkEgYmV0dGVyIG11c2ljIG1vZGVsIHdvdWxkIHByb2JhYmx5IHNlcGFyYXRlIG91dCBhcnRpc3RzDQorCSAgYW5kIGNvbXBvc2VycywgYWNjb3VudCBmb3IgcmVtaXhlcywgY29tcGlsYXRpb24gYWxidW1zLA0KKwkgIHJlLWlzc3VlcywgbXVsdGlwbGUgcmVuZGl0aW9ucywgYW5kIHNvIGZvcnRoLCBidXQgdGhpcyBpcw0KKwkgIGdvdmVybm1lbnQgd29yaywgYW5kIGl0J2xsIGRvLg0KKwk8L3A+DQorDQorCTxwPkhlcmUncyBjbGFzcyA8Y29kZT5BcnRpc3Q8L2NvZGU+OjwvcD4NCisNCisJPHNvdXJjZT5jbGFzcyBBcnRpc3Qgew0KKyAgcHVibGljIEFydGlzdChTdHJpbmcgbmFtZSkgew0KKyAgICB0aGlzLm5hbWUgPSBuYW1lOw0KKyAgICB0cmFja3MgPSBuZXcgQXJyYXlMaXN0KCk7DQorICB9DQorICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgIHJldHVybiBuYW1lOw0KKyAgfQ0KKyAgcHVibGljIExpc3QgZ2V0VHJhY2tzKCkgew0KKyAgICByZXR1cm4gdHJhY2tzOw0KKyAgfQ0KKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsNCisgIH0NCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgIGlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7DQorICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEFydGlzdCkpIHJldHVybiBmYWxzZTsNCisgICAgQXJ0aXN0IHJocyA9IChBcnRpc3QpIG9iajsNCisgICAgcmV0dXJuIG5hbWUuZXF1YWxzKHJocy5uYW1lKTsNCisgIH0NCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorICBwcml2YXRlIExpc3QgdHJhY2tzOw0KK308L3NvdXJjZT4NCisNCisJPHA+QXMgeW91IGNhbiBzZWUsIDxjb2RlPkFydGlzdDwvY29kZT5zIGhhdmUgYSBuYW1lIGFuZCBhDQorCSAgPGNvZGU+TGlzdDwvY29kZT4gb2YgPGNvZGU+VHJhY2s8L2NvZGU+cyB0aGV5J3ZlIG1hZGUuICBOb3csDQorCSAgaGVyZSdzIGNsYXNzIDxjb2RlPkFsYnVtPC9jb2RlPjoNCisJPC9wPg0KKw0KKwk8c291cmNlPmNsYXNzIEFsYnVtIHsNCisgIHB1YmxpYyBBbGJ1bShTdHJpbmcgbmFtZSkgew0KKyAgICB0aGlzLm5hbWUgPSBuYW1lOw0KKyAgICB0cmFja3MgPSBuZXcgQXJyYXlMaXN0KCk7DQorICB9DQorICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgIHJldHVybiBuYW1lOw0KKyAgfQ0KKyAgcHVibGljIExpc3QgZ2V0VHJhY2tzKCkgew0KKyAgICByZXR1cm4gdHJhY2tzOw0KKyAgfQ0KKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsNCisgIH0NCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgIGlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7DQorICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEFsYnVtKSkgcmV0dXJuIGZhbHNlOw0KKyAgICBBbGJ1bSByaHMgPSAoQWxidW0pIG9iajsNCisgICAgcmV0dXJuIG5hbWUuZXF1YWxzKHJocy5uYW1lKTsNCisgIH0NCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorICBwcml2YXRlIExpc3QgdHJhY2tzOw0KK308L3NvdXJjZT4NCisNCisJPHA+QXMgd2l0aCA8Y29kZT5BcnRpc3Q8L2NvZGU+cywgPGNvZGU+QWxidW08L2NvZGU+cyAob3INCisJICBzaG91bGQgdGhhdCBiZSA8ZW0+QWxiYTwvZW0+PykgaGF2ZSBuYW1lcyBhbmQgY29sbGVjdGlvbnMgb2YNCisJICA8Y29kZT5UcmFjazwvY29kZT5zLiAgRmluYWxseSwgaGVyZSdzIGNsYXNzIDxjb2RlPlRyYWNrPC9jb2RlPjoNCisJPC9wPg0KKw0KKwk8c291cmNlPmNsYXNzIFRyYWNrIHsNCisgIHB1YmxpYyBUcmFjayhTdHJpbmcgbmFtZSwgVVJJIGlkLCBBcnRpc3QgYXJ0aXN0LA0KKyAgICBBbGJ1bSBhbGJ1bSkgew0KKyAgICB0aGlzLm5hbWUgPSBuYW1lOw0KKyAgICB0aGlzLmlkID0gaWQ7DQorICAgIHRoaXMuYXJ0aXN0ID0gYXJ0aXN0Ow0KKyAgICB0aGlzLmFsYnVtID0gYWxidW07DQorICAgIGFydGlzdC5nZXRUcmFja3MoKS5hZGQodGhpcyk7DQorICAgIGFsYnVtLmdldFRyYWNrcygpLmFkZCh0aGlzKTsNCisgIH0NCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0NCisgIHB1YmxpYyBVUkkgZ2V0SUQoKSB7IHJldHVybiBpZDsgfQ0KKyAgcHVibGljIEFydGlzdCBnZXRBcnRpc3QoKSB7IHJldHVybiBhcnRpc3Q7IH0NCisgIHB1YmxpYyBBbGJ1bSBnZXRBbGJ1bSgpIHsgcmV0dXJuIGFsYnVtOyB9DQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpIF4gaWQuaGFzaENvZGUoKTsNCisgIH0NCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgIGlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7DQorICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFRyYWNrKSkgcmV0dXJuIGZhbHNlOw0KKyAgICBUcmFjayByaHMgPSAoVHJhY2spIG9iajsNCisgICAgcmV0dXJuIGlkLmVxdWFscyhyaHMuaWQpOw0KKyAgfQ0KKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisgIHByaXZhdGUgVVJJIGlkOw0KKyAgcHJpdmF0ZSBBcnRpc3QgYXJ0aXN0Ow0KKyAgcHJpdmF0ZSBBbGJ1bSBhbGJ1bTsNCit9PC9zb3VyY2U+DQorDQorCTxwPkFzIHlvdSBjYW4gc2VlIGZyb20gdGhlIGNvZGUsIGEgdHJhY2sgYmVsb25ncyB0byBhbg0KKwkgIDxjb2RlPkFydGlzdDwvY29kZT4gYW5kIHRvIGFuIDxjb2RlPkFsYnVtPC9jb2RlPiBhbmQgaGFzIGENCisJICBVUkkgd2hpY2ggeW91IGNhbiB1c2UgdG8gZ2V0IHRvIHRoZSB0cmFjaydzIE1QMyBkYXRhLg0KKwkgIEZpbmFsbHksIHdpdGggdGhlc2UgdGhyZWUgImVudGl0eSIgY2xhc3NlcyBpbiBoYW5kLCB3ZSBjYW4NCisJICBjcmVhdGUgYSBtdXNpYyBkYXRhYmFzZToNCisJPC9wPg0KKw0KKwk8c291cmNlPmNsYXNzIERCIHsNCisgIHB1YmxpYyBzdGF0aWMgU2V0IEFSVElTVFMgPSBuZXcgSGFzaFNldCgpOw0KKyAgcHVibGljIHN0YXRpYyBTZXQgQUxCVU1TID0gbmV3IEhhc2hTZXQoKTsNCisgIHB1YmxpYyBzdGF0aWMgU2V0IFRSQUNLUyA9IG5ldyBIYXNoU2V0KCk7DQorICBzdGF0aWMgew0KKyAgICBBcnRpc3QgYmFjaCA9IG5ldyBBcnRpc3QoIkJhY2giKTsNCisgICAgQWxidW0gYnJhbmRlbmJ1cmcxMjMNCisgICAgICA9IG5ldyBBbGJ1bSgiQnJhbmRlbmJ1cmcgQ29uY2VydGkgMSwgMiwgMyIpOw0KKyAgICBBbGJ1bSBicmFuZGVuYnVyZzQ1Ng0KKyAgICAgID0gbmV3IEFsYnVtKCJCcmFuZGVuYnVyZyBDb25jZXJ0aSA0LCA1LCA2Iik7DQorICAgIFRyYWNrIGJyYW5kZW5idXJnMQ0KKyAgICAgID0gbmV3IFRyYWNrKCJCcmFuZGVuYnVyZyBDb25jZXJ0byAjMSIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyOTFCQy5tcDMiKSwgYmFjaCwNCisgICAgICBicmFuZGVuYnVyZzEyMyk7DQorICAgIFRyYWNrIGJyYW5kZW5idXJnMg0KKyAgICAgID0gbmV3IFRyYWNrKCJCcmFuZGVuYnVyZyBDb25jZXJ0byAjMiIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyMzExRS5tcDMiKSwgYmFjaCwNCisgICAgICBicmFuZGVuYnVyZzEyMyk7DQorICAgIFRyYWNrIGJyYW5kZW5idXJnMw0KKyAgICAgID0gbmV3IFRyYWNrKCJCcmFuZGVuYnVyZyBDb25jZXJ0byAjMyIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyQTk4MS5tcDMiKSwgYmFjaCwNCisgICAgICBicmFuZGVuYnVyZzEyMyk7DQorICAgIFRyYWNrIGJyYW5kZW5idXJnNA0KKyAgICAgID0gbmV3IFRyYWNrKCJCcmFuZGVuYnVyZyBDb25jZXJ0byAjNCIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyMjMzQS5tcDMiKSwgYmFjaCwNCisgICAgICBicmFuZGVuYnVyZzQ1Nik7DQorICAgIFRyYWNrIGJyYW5kZW5idXJnNQ0KKyAgICAgID0gbmV3IFRyYWNrKCJCcmFuZGVuYnVyZyBDb25jZXJ0byAjNSIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyQTZFNS5tcDMiKSwgYmFjaCwNCisgICAgICBicmFuZGVuYnVyZzQ1Nik7DQorDQorICAgICBUcmFjayBicmFuZGVuYnVyZzYNCisgICAgICA9IG5ldyBUcmFjaygiQnJhbmRlbmJ1cmcgQ29uY2VydG8gIzYiLA0KKyAgICAgIFVSSS5jcmVhdGUoInVybjpzazp0cjAxRTkubXAzIiksIGJhY2gsDQorICAgICAgYnJhbmRlbmJ1cmc0NTYpOw0KKw0KKyAgICBBcnRpc3QgZGVsZXJpdW0gPSBuZXcgQXJ0aXN0KCJEZWxlcml1bSIpOw0KKyAgICBBbGJ1bSBzZW1hbnRpYyA9IG5ldyBBbGJ1bSgiU2VtYW50aWMgU3BhY2VzIik7DQorICAgIEFsYnVtIHBvZW0gPSBuZXcgQWxidW0oIlBvZW0iKTsNCisgICAgVHJhY2sgZmxvd2Vycw0KKyAgICAgID0gbmV3IFRyYWNrKCJGbG93ZXJzIEJlY29tZSBTY3JlZW5zIiwNCisgICAgICBVUkkuY3JlYXRlKCJ1cm46c2s6dHIzQTVFLm1wMyIpLCBkZWxlcml1bSwNCisgICAgICBzZW1hbnRpYyk7DQorICAgIFRyYWNrIG1ldGFwaG9yID0gbmV3IFRyYWNrKCJNZXRhcGhvciIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyMEUxMy5tcDMiKSwgZGVsZXJpdW0sDQorICAgICAgc2VtYW50aWMpOw0KKyAgICBUcmFjayBpbm5vY2VudGUgPSBuZXcgVHJhY2soIklubm9jZW50ZSIsDQorICAgICAgVVJJLmNyZWF0ZSgidXJuOnNrOnRyMDA0QS5tcDMiKSwgZGVsZXJpdW0sDQorICAgICAgcG9lbSk7DQorICAgIFRyYWNrIGFyaWEgPSBuZXcgVHJhY2soIkFyaWEiLA0KKyAgICAgIFVSSS5jcmVhdGUoInVybjpzazp0cjAwNEEubXAzIiksIGRlbGVyaXVtLA0KKyAgICAgIHBvZW0pOw0KKw0KKyAgICBBUlRJU1RTLmFkZChiYWNoKTsNCisgICAgQVJUSVNUUy5hZGQoZGVsZXJpdW0pOw0KKyAgICBBTEJVTVMuYWRkKGJyYW5kZW5idXJnMTIzKTsNCisgICAgQUxCVU1TLmFkZChicmFuZGVuYnVyZzQ1Nik7DQorICAgIEFMQlVNUy5hZGQoc2VtYW50aWMpOw0KKyAgICBBTEJVTVMuYWRkKHBvZW0pOw0KKyAgICBUUkFDS1MuYWRkKGJyYW5kZW5idXJnMSk7DQorICAgIFRSQUNLUy5hZGQoYnJhbmRlbmJ1cmcyKTsNCisgICAgVFJBQ0tTLmFkZChicmFuZGVuYnVyZzMpOw0KKyAgICBUUkFDS1MuYWRkKGJyYW5kZW5idXJnNCk7DQorICAgIFRSQUNLUy5hZGQoYnJhbmRlbmJ1cmc1KTsNCisgICAgVFJBQ0tTLmFkZChicmFuZGVuYnVyZzYpOw0KKyAgICBUUkFDS1MuYWRkKGZsb3dlcnMpOw0KKyAgICBUUkFDS1MuYWRkKG1ldGFwaG9yKTsNCisgICAgVFJBQ0tTLmFkZChpbm5vY2VudGUpOw0KKyAgICBUUkFDS1MuYWRkKGFyaWEpOw0KKyAgfQ0KK308L3NvdXJjZT4NCisNCisJPHA+KFBsZWFzZSBkb24ndCBqdWRnZSB0aGlzIGxpbWl0ZWQgY29sbGVjdGlvbiBhcyB0aGUgYnJlYWR0aA0KKwkgIG9mIG15IGxpc3RlbmluZyB0YXN0ZXMuICBJdCdzIGFjdHVhbGx5IG11Y2ggbmFycm93ZXIgbm93ISkNCisJICBJbiB0aGlzIHNtYWxsIGRhdGFiYXNlLCB3ZSd2ZSBnb3QgdHdvIGFydGlzdHMsIEJhY2ggYW5kDQorCSAgRGVsZXJpdW0sIHdpdGggZm91ciBhbGJ1bXM6IDxpPkJyYW5kZW5idXJnIENvbmNlcnRpIDEsIDIsDQorCSAgMzwvaT4gYW5kIDxpPjQsIDUsIDY8L2k+OyBhbmQgPGk+U2VtYW50aWMgU3BhY2VzPC9pPiBhbmQNCisJICA8aT5Qb2VtPC9pPi4gIEFuZCB3ZSd2ZSBnb3QgMTAgdHJhY2tzOiAzIGJlbG9uZ2luZyB0byBvbmUNCisJICBhbGJ1bSwgMyBiZWxvbmdpbmcgdG8gYW5vdGhlciwgMiBiZWxvbmdpbmcgdG8geWV0IGFub3RoZXIsDQorCSAgYW5kIHRoZSBsYXN0IDIgYmVsb25naW5nIHRvIHRoZSBsYXN0IGFsYnVtLiAgU2l4IGFyZSBieQ0KKwkgIEJhY2gsIGFuZCBmb3VyIGJ5IERlbGVyaXVtLiAgRWFjaCB0cmFjayBoYXMNCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJRdWVyeWluZyBvdXIgRGF0YWJhc2UiPg0KKwk8cD5SZWNhbGwgdGhhdCB0aGUgPGEgaHJlZj0iL2VkbS1xdWVyeS8iPlhNTFF1ZXJ5PC9hPidzIHF1ZXJ5DQorCSAgbGFuZ3VhZ2UgdXNlcyB0cmlwbGVzIG9mIHRoZSBmb3JtIChlbGVtZW50LCByZWxhdGlvbiwNCisJICBsaXRlcmFsKSBsaWtlIDxjb2RlPmFsYnVtICE9IFBvZW08L2NvZGU+LiAgVGhlIHJlbGF0aW9ucw0KKwkgIGluY2x1ZGUgPSwgIT0sICZsdDssICZndDssICZsdDs9LCAmZ3Q7PSwgTElLRSwgYW5kIE5PVExJS0UuDQorCSAgVGhlIHRyaXBsZXMgYXJlIGxpbmtlZCB3aXRoIEFORCwgT1IsIGFuZCBOT1QuICBGb3IgdGhpcw0KKwkgIHR1dG9yaWFsLCB3ZSdsbCBkbyB0aGUgPSBhbmQgIT0gY2FzZXMuICBUaGUgcmVzdCB5b3UgY2FuDQorCSAgZmlsbCBpbiBmb3IgeW91ciBvd24gZWRpZmljYXRpb24uICBPdXIgYXBwcm9hY2ggd2lsbCBiZSB0bw0KKwkgIGV4YW1pbmUgdGhlIHBvc3RmaXggIndoZXJlIiBib29sZWFuIHN0YWNrIGFuZCBjb252ZXJ0IGl0DQorCSAgaW50byBhbiBpbmZpeCBib29sZWFuIGV4cHJlc3Npb24gdHJlZS4gIFdlJ2xsIGFzayB0aGUgdHJlZQ0KKwkgIHRvIGV2YWx1YXRlIGl0c2VsZiBpbnRvIGEgbWF0Y2hpbmcgc2V0IG9mDQorCSAgPGNvZGU+VHJhY2s8L2NvZGU+cy4gIFRoZW4gYWxsIHdlIGhhdmUgdG8gZG8gaXMgZGVzY2liZSB0aGUNCisJICBtYXRjaGluZyA8Y29kZT5UcmFjazwvY29kZT5zIGFzIDxjb2RlPlByb2ZpbGU8L2NvZGU+DQorCSAgb2JqZWN0cy4NCisJPC9wPg0KKw0KKwk8cD5MZXQncyBzdGFydCBieSBkZWZpbmluZyBhIG5vZGUgaW4gb3VyIGV4cHJlc3Npb24gdHJlZTo8L3A+DQorDQorCTxzb3VyY2U+aW50ZXJmYWNlIEV4cHIgew0KKyAgU2V0IGV2YWx1YXRlKCk7DQorfTwvc291cmNlPg0KKw0KKwk8cD5UaGUgPGNvZGU+ZXZhbHVhdGU8L2NvZGU+IG1ldGhvZCBtZWFucyAiZXZhbHVhdGUgaW50byBhDQorCSAgPGNvZGU+U2V0PC9jb2RlPiBvZiBtYXRjaGluZyA8Y29kZT5UcmFjazwvY29kZT4gb2JqZWN0cy4iDQorCSAgV2l0aCB0aGlzIGludGVyZmFjZSwgd2UgY2FuIHRoZW4gZGVmaW5lIGNsYXNzZXMgdGhhdCBtYWtlIHVwDQorCSAgZGlmZmVyZW50IGZsYXZvcnMgb2YgdHJlZSBub2Rlcy4gIE9uZSBvZiB0aGUgZWFzaWVyIG9uZXMgaXMNCisJICBhIGNvbnN0YW50IHRyZWUgbm9kZSB0aGF0IGVpdGhlciBtYXRjaGVzIDxlbT5ldmVyeTwvZW0+DQorCSAgdHJhY2sgYXZhaWxhYmxlIChjb25zdGFudCB0cnVlKSBvciA8ZW0+bm9uZTwvZW0+IG9mIHRoZW0NCisJICAoY29uc3RhbnQgZmFsc2UpOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+Y2xhc3MgQ29uc3RhbnQgaW1wbGVtZW50cyBFeHByIHsNCisgIHB1YmxpYyBDb25zdGFudChib29sZWFuIHZhbHVlKSB7DQorICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCisgIH0NCisgIHB1YmxpYyBTZXQgZXZhbHVhdGUoKSB7DQorICAgIHJldHVybiB2YWx1ZT8gREIuVFJBQ0tTDQorICAgICAgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7DQorICB9DQorICBwcml2YXRlIGJvb2xlYW4gdmFsdWU7DQorfTwvc291cmNlPg0KKw0KKwk8cD5OZXh0LCBsZXQncyBkbyBuZWdhdGlvbi4gIFRoaXMgdGFrZXMgdGhlIHNldCBjb21wbGVtZW50IG9mDQorCSAgYW4gZXhpc3RpbmcgdHJlZSBub2RlOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+Y2xhc3MgTm90IGltcGxlbWVudHMgRXhwciB7DQorICBwdWJsaWMgTm90KEV4cHIgZXhwcikgew0KKyAgICB0aGlzLmV4cHIgPSBleHByOw0KKyAgfQ0KKyAgcHVibGljIFNldCBldmFsdWF0ZSgpIHsNCisgICAgU2V0IG1hdGNoZXMgPSBleHByLmV2YWx1YXRlKCk7DQorICAgIFNldCBpbnZlcnNlID0gbmV3IEhhc2hTZXQoKTsNCisgICAgZm9yIChJdGVyYXRvciBpID0gREIuVFJBQ0tTLml0ZXJhdG9yKCk7DQorICAgICAgaS5oYXNOZXh0KCk7KSB7DQorICAgICAgVHJhY2sgdCA9IChUcmFjaykgaS5uZXh0KCk7DQorICAgICAgaWYgKCFtYXRjaGVzLmNvbnRhaW5zKHQpKQ0KKyAgICAgICAgaW52ZXJzZS5hZGQodCk7DQorICAgIH0NCisgICAgcmV0dXJuIGludmVyc2U7DQorICB9DQorICBwcml2YXRlIEV4cHIgZXhwcjsNCit9PC9zb3VyY2U+DQorDQorCTxwPkFzIHlvdSBjYW4gc2VlLCB0aGlzIG5vZGUgaXMgY29uc3RydWN0ZWQgd2l0aCBhbm90aGVyIHRyZWUNCisJICBub2RlIGV4cHJlc3Npb24uICBUbyBldmFsdWF0ZSB0aGlzIG5vZGUsIHdlIGV2YWx1YXRlIHRoZQ0KKwkgIGV4cHJlc3Npb24gcGFzc2VkIGluLiAgVGhlbiB3ZSB0YWtlIGl0cyBpbnZlcnNlIGJ5IGl0ZXJhdGluZw0KKwkgIHRocm91Z2ggZWFjaCB0cmFjayBpbiB0aGUgZGF0YWJhc2UgYW5kIGFkZGluZyBpdCB0byB0aGUNCisJICBtYXRjaGluZyBzZXQgaWYgaXQgPGVtPmRvZXNuJ3Q8L2VtPiBvY2N1ciBpbiB0aGUNCisJICBleHByZXNzaW9uJ3MgbWF0Y2hpbmcgc2V0Lg0KKwk8L3A+DQorDQorCTxwPlRoZSB1bmlvbiB0cmVlIG5vZGUgdGFrZXMgdHdvIGV4cHJlc3Npb25zIGFuZCBhZGRzIHRoZSB0d28NCisJICBzZXRzIG9mIG1hdGNoaW5nIHRyYWNrcyB0b2dldGhlcjoNCisJPC9wPg0KKw0KKwk8c291cmNlPmNsYXNzIE9yIGltcGxlbWVudHMgRXhwciB7DQorICBwdWJsaWMgT3IoRXhwciBsaHMsIEV4cHIgcmhzKSB7DQorICAgIHRoaXMubGhzID0gbGhzOw0KKyAgICB0aGlzLnJocyA9IHJoczsNCisgIH0NCisgIHB1YmxpYyBTZXQgZXZhbHVhdGUoKSB7DQorICAgIFNldCBsZWZ0ID0gbGhzLmV2YWx1YXRlKCk7DQorICAgIFNldCByaWdodCA9IHJocy5ldmFsdWF0ZSgpOw0KKyAgICBsZWZ0LmFkZEFsbChyaWdodCk7DQorICAgIHJldHVybiBsZWZ0Ow0KKyAgfQ0KKyAgcHJpdmF0ZSBFeHByIGxoczsNCisgIHByaXZhdGUgRXhwciByaHM7DQorfTwvc291cmNlPg0KKw0KKwk8cD5UaGUgaW50ZXJzZWN0aW9uIHRyZWUgbm9kZSBldmFsdWF0ZXMgdG8gPGNvZGU+VHJhY2s8L2NvZGU+cw0KKwkgIHRoYXQgb2NjdXIgb25seSBpbiBib3RoIGV4cHJlc3Npb25zJyB0cmFja3M6DQorCTwvcD4NCisNCisJPHNvdXJjZT5jbGFzcyBBbmQgaW1wbGVtZW50cyBFeHByIHsNCisgIHB1YmxpYyBBbmQoRXhwciBsaHMsIEV4cHIgcmhzKSB7DQorICAgIHRoaXMubGhzID0gbGhzOw0KKyAgICB0aGlzLnJocyA9IHJoczsNCisgIH0NCisgIHB1YmxpYyBTZXQgZXZhbHVhdGUoKSB7DQorICAgIFNldCBsZWZ0ID0gbGhzLmV2YWx1YXRlKCk7DQorICAgIFNldCByaWdodCA9IHJocy5ldmFsdWF0ZSgpOw0KKyAgICBsZWZ0LnJldGFpbkFsbChyaWdodCk7DQorICAgIHJldHVybiBsZWZ0Ow0KKyAgfQ0KKyAgcHJpdmF0ZSBFeHByIGxoczsNCisgIHByaXZhdGUgRXhwciByaHM7DQorfTwvc291cmNlPg0KKw0KKwk8cD5XaXRoIHRoZXNlIG5vZGVzLCB3ZSBjYW4gY292ZXIgdGhlIGxvZ2ljYWwgb3BlcmF0b3JzIEFORCwNCisJICBPUiwgYW5kIE5PVCB0aGF0IGFwcGVhciBpbiBhIHBvc3RmaXggIndoZXJlIiBzdGFjaywgYXMgd2VsbA0KKwkgIGFzIGFuIGVtcHR5ICJ3aGVyZSIgc3RhY2ssIHdoaWNoLCBieSBjb252ZW50aW9uLCBpcyBtZWFudCB0bw0KKwkgIGJlIGEgY29uc3RhbnQgInRydWUiLCBtYXRjaGluZyBhbGwgYXZhaWxhYmxlIHJlc291cmNlcy4gIE5vdw0KKwkgIHdlIGp1c3QgaGF2ZSB0byBoYW5kbGUgdHJpcGxlcyAoZWxlbWVudCwgcmVsYXRpb24sIGxpdGVyYWwpLg0KKwkgIEZpcnN0IHVwLCBjb21wYXJpc29ucyBhZ2FpbnN0IDxjb2RlPkFydGlzdDwvY29kZT5zOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+Y2xhc3MgQXJ0aXN0RXhwciBpbXBsZW1lbnRzIEV4cHIgew0KKyAgcHVibGljIEFydGlzdEV4cHIoU3RyaW5nIG9wLCBTdHJpbmcgdmFsdWUpIHsNCisgICAgdGhpcy5vcCA9IG9wOw0KKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQorICB9DQorICBwdWJsaWMgU2V0IGV2YWx1YXRlKCkgew0KKyAgICBTZXQgdHJhY2tzID0gbmV3IEhhc2hTZXQoKTsNCisgICAgaWYgKCJFUSIuZXF1YWxzKG9wKSkgew0KKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IERCLkFSVElTVFMuaXRlcmF0b3IoKTsNCisgICAgICAgIGkuaGFzTmV4dCgpOykgew0KKyAgICAgICAgQXJ0aXN0IGEgPSAoQXJ0aXN0KSBpLm5leHQoKTsNCisgICAgICAgIGlmIChhLmdldE5hbWUoKS5lcXVhbHModmFsdWUpKQ0KKyAgICAgICAgICB0cmFja3MuYWRkQWxsKGEuZ2V0VHJhY2tzKCkpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICgiTkUiLmVxdWFscyhvcCkpIHsNCisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBEQi5BUlRJU1RTLml0ZXJhdG9yKCk7DQorICAgICAgICBpLmhhc05leHQoKTspIHsNCisgICAgICAgIEFydGlzdCBhID0gKEFydGlzdCkgaS5uZXh0KCk7DQorICAgICAgICBpZiAoIWEuZ2V0TmFtZSgpLmVxdWFscyh2YWx1ZSkpDQorICAgICAgICAgIHRyYWNrcy5hZGRBbGwoYS5nZXRUcmFja3MoKSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgdGhyb3cgbmV3DQorICAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5ZSSIpOw0KKyAgICByZXR1cm4gdHJhY2tzOw0KKyAgfQ0KKyAgcHJpdmF0ZSBTdHJpbmcgb3A7DQorICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCit9PC9zb3VyY2U+DQorDQorCTxwPkZvciBhbiBleHByZXNzaW9uIGxpa2UgPGNvZGU+YXJ0aXN0ID0gQmFjaDwvY29kZT4gb3INCisJICA8Y29kZT5hcnRpc3QgIT0gRGVsZXJpdW08L2NvZGU+IHdlIHVzZSBhIGV4cHJlc3Npb24gbm9kZQ0KKwkgIG9iamVjdCBvZiB0aGUgYWJvdmUgY2xhc3MuICBXaGVuIGl0J3MgPGNvZGU+RVE8L2NvZGU+LCB3ZQ0KKwkgIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGFydGlzdHMgaW4gdGhlIGRhdGFiYXNlIGFuZCwgd2hlbg0KKwkgIHRoZSBhcnRpc3QncyBuYW1lIG1hdGNoZXMsIGFkZCBhbGwgb2YgdGhhdCBhcnRpc3QncyB0cmFja3MNCisJICB0byB0aGUgc2V0IG9mIG1hdGNoZXMuICBXaGVuIGl0J3MgPGNvZGU+TkU8L2NvZGU+LCB3ZQ0KKwkgIGluc3RlYWQgYWRkIGFsbCBvZiB0aGUgYXJ0aXN0cycgdHJhY2tzIHdob3NlIG5hbWUNCisJICA8ZW0+ZG9lc24ndDwvZW0+IG1hdGNoLiAgKFRoZSBvdGhlciByZWxhdGlvbmFsIG9wZXJhdG9ycywNCisJICA8Y29kZT5MVDwvY29kZT4sIDxjb2RlPkdUPC9jb2RlPiwgPGNvZGU+TEU8L2NvZGU+LA0KKwkgIDxjb2RlPkdFPC9jb2RlPiwgPGNvZGU+TElLRTwvY29kZT4sIGFuZCA8Y29kZT5OT1RMSUtFPC9jb2RlPg0KKwkgIGN1cnJlbnRseSB0aHJvdyBhbiBleGNlcHRpb24uICBZb3UncmUgd2VsY29tZSB0byB0cnkgdG8NCisJICBpbXBsZW1lbnQgdGhvc2UuKQ0KKwk8L3A+DQorDQorCTxwPlRoZSA8Y29kZT5BbGJ1bUV4cHI8L2NvZGU+IGV4cHJlc3Npb24gbm9kZSBpcyBxdWl0ZSBzaW1pbGFyOjwvcD4NCisNCisJPHNvdXJjZT5jbGFzcyBBbGJ1bUV4cHIgaW1wbGVtZW50cyBFeHByIHsNCisgIHB1YmxpYyBBbGJ1bUV4cHIoU3RyaW5nIG9wLCBTdHJpbmcgdmFsdWUpIHsNCisgICAgdGhpcy5vcCA9IG9wOw0KKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQorICB9DQorICBwdWJsaWMgU2V0IGV2YWx1YXRlKCkgew0KKyAgICBTZXQgdHJhY2tzID0gbmV3IEhhc2hTZXQoKTsNCisgICAgaWYgKCJFUSIuZXF1YWxzKG9wKSkgew0KKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IERCLkFMQlVNUy5pdGVyYXRvcigpOw0KKyAgICAgICAgaS5oYXNOZXh0KCk7KSB7DQorICAgICAgICBBbGJ1bSBhID0gKEFsYnVtKSBpLm5leHQoKTsNCisgICAgICAgIGlmIChhLmdldE5hbWUoKS5lcXVhbHModmFsdWUpKQ0KKyAgICAgICAgICB0cmFja3MuYWRkQWxsKGEuZ2V0VHJhY2tzKCkpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICgiTkUiLmVxdWFscyhvcCkpIHsNCisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBEQi5BTEJVTVMuaXRlcmF0b3IoKTsNCisgICAgICAgIGkuaGFzTmV4dCgpOykgew0KKyAgICAgICAgQWxidW0gYSA9IChBbGJ1bSkgaS5uZXh0KCk7DQorICAgICAgICBpZiAoIWEuZ2V0TmFtZSgpLmVxdWFscyh2YWx1ZSkpDQorICAgICAgICAgIHRyYWNrcy5hZGRBbGwoYS5nZXRUcmFja3MoKSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgdGhyb3cgbmV3DQorICAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5ZSSIpOw0KKyAgICByZXR1cm4gdHJhY2tzOw0KKyAgfQ0KKyAgcHJpdmF0ZSBTdHJpbmcgb3A7DQorICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCit9PC9zb3VyY2U+DQorDQorCTxwPihBbm90aGVyIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyOiByZWZhY3RvciBvdXQgY29tbW9uIGNvZGUNCisJICBiZXR3ZWVuIHRoZXNlIHR3byBjbGFzc2VzLikgIEZpbmFsbHksIHRoZQ0KKwkgIDxjb2RlPlRyYWNrRXhwcjwvY29kZT4gbm9kZSBpcyBmb3IgZXhwcmVzc2lvbnMgbGlrZQ0KKwkgIDxjb2RlPnRyYWNrID0gUG9lbTwvY29kZT46DQorCTwvcD4NCisNCisJPHNvdXJjZT5jbGFzcyBUcmFja0V4cHIgaW1wbGVtZW50cyBFeHByIHsNCisgIHB1YmxpYyBUcmFja0V4cHIoU3RyaW5nIG9wLCBTdHJpbmcgdmFsdWUpIHsNCisgICAgdGhpcy5vcCA9IG9wOw0KKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQorICB9DQorICBwdWJsaWMgU2V0IGV2YWx1YXRlKCkgew0KKyAgICBTZXQgdHJhY2tzID0gbmV3IEhhc2hTZXQoKTsNCisgICAgaWYgKCJFUSIuZXF1YWxzKG9wKSkgew0KKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IERCLlRSQUNLUy5pdGVyYXRvcigpOw0KKyAgICAgICAgaS5oYXNOZXh0KCk7KSB7DQorICAgICAgICBUcmFjayB0ID0gKFRyYWNrKSBpLm5leHQoKTsNCisgICAgICAgIGlmICh0LmdldE5hbWUoKS5lcXVhbHModmFsdWUpKQ0KKyAgICAgICAgICB0cmFja3MuYWRkKHQpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICgiTkUiLmVxdWFscyhvcCkpIHsNCisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBEQi5UUkFDS1MuaXRlcmF0b3IoKTsNCisgICAgICAgIGkuaGFzTmV4dCgpOykgew0KKyAgICAgICAgVHJhY2sgdCA9IChUcmFjaykgaS5uZXh0KCk7DQorICAgICAgICBpZiAoIXQuZ2V0TmFtZSgpLmVxdWFscyh2YWx1ZSkpDQorICAgICAgICAgIHRyYWNrcy5hZGQodCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgdGhyb3cgbmV3DQorICAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5ZSSIpOw0KKyAgICByZXR1cm4gdHJhY2tzOw0KKyAgfQ0KKyAgcHJpdmF0ZSBTdHJpbmcgb3A7DQorICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCit9PC9zb3VyY2U+DQorDQorCTxwPkZvciA8Y29kZT5FUTwvY29kZT4sIHdlIGp1c3QgaXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IHRyYWNrIGluDQorCSAgdGhlIGRhdGFiYXNlIGFuZCBhZGQgaXQgdG8gdGhlIHNldCBvZiBtYXRjaGluZyB0cmFja3MgaWYgdGhlDQorCSAgbmFtZXMgbWF0Y2ggdGhlIG5hbWUgcGFzc2VkIGludG8gdGhlIHVzZXIncyBxdWVyeS4gIEZvcg0KKwkgIDxjb2RlPk5FPC9jb2RlPiwgd2UgYWRkIHRoZW0gaWYgdGhlaXIgbmFtZXMgPGVtPmRvbid0PC9lbT4gbWF0Y2guDQorCTwvcD4NCisNCisJPHA+VGhhdCBjb21wbGV0ZXMgYWxsIHRoZSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvbiB0cmVlLiAgTm93DQorCSAgd2UgY2FuIHN0YXJ0IHdvcmtpbmcgb24gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUNCisJICA8Y29kZT5Qcm9maWxlSGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLA0KKwkgIDxjb2RlPk11c2ljSGFuZGxlcjwvY29kZT4uICBIZXJlLCB3ZSdsbCBidWlsZCB0aGF0DQorCSAgZXhwcmVzc2lvbiB0cmVlIHdpdGggdGhlIGluY29taW5nIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiwNCisJICB3aGljaCBwcm92aWRlcyBpdHMgIndoZXJlIiBlbGVtZW50IHN0YWNrIGFzIGEgcG9zdGZpeA0KKwkgIGJvb2xlYW4gZXhwcmVzc2lvbi4gIEhlcmUncyB0aGUgYXBwcm9hY2g6DQorCTwvcD4NCisNCisJPG9sPg0KKwkgIDxsaT5NYWtlIGEgbmV3LCBlbXB0eSBzdGFjay48L2xpPg0KKwkgIDxsaT5Gb3IgZWFjaCBlbGVtZW50IGluIHRoZSAid2hlcmUiIHN0YWNrOg0KKwkgICAgPG9sPg0KKwkgICAgICA8bGk+SWYgaXQncyBhbiBlbGVtZW50IG5hbWUgKDxjb2RlPmFydGlzdDwvY29kZT4sDQorCQk8Y29kZT5hbGJ1bTwvY29kZT4sIDxjb2RlPnRyYWNrPC9jb2RlPiksIHB1c2ggdGhlIG5hbWUNCisJCW9udG8gdGhlIHN0YWNrLg0KKwkgICAgICA8L2xpPg0KKwkgICAgICA8bGk+SWYgaXQncyBhIGxpdGVyYWwgdmFsdWUgKDxjb2RlPkJhY2g8L2NvZGU+LA0KKwkJPGNvZGU+UG9lbTwvY29kZT4sIGV0Yy4pLCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrLg0KKwkgICAgICA8L2xpPg0KKwkgICAgICA8bGk+SWYgaXQncyBhIHJlbGF0aW9uYWwgb3BlcmF0b3IgKDxjb2RlPkVRPC9jb2RlPiwgPGNvZGU+TkU8L2NvZGU+LCBldGMuKToNCisJCTxvbD4NCisJCSAgPGxpPlBvcCB0d28gdmFsdWVzIG9mZi48L2xpPg0KKwkJICA8bGk+UHVzaCBhbiA8Y29kZT5BcnRpc3RFeHByPC9jb2RlPiwgPGNvZGU+QWxidW1FeHByPC9jb2RlPiwgb3IgPGNvZGU+VHJhY2tFeHByPC9jb2RlPi48L2xpPg0KKwkJPC9vbD4NCisJICAgICAgPC9saT4NCisJICAgICAgPGxpPkl0IGl0J3MgYSBsb2dpY2FsIG9wZXJhdG9yOg0KKwkJPHVsPg0KKwkJICA8bGk+Rm9yIDxjb2RlPkFORDwvY29kZT4sIHBvcCB0d28gdmFsdWVzIG9mZiBhbmQgcHVzaCBhbiA8Y29kZT5BbmQ8L2NvZGU+IG5vZGUuPC9saT4NCisJCSAgPGxpPkZvciA8Y29kZT5PUjwvY29kZT4sIHBvcCB0d28gdmFsdWVzIG9mZiBhbmQgcHVzaCBhbiA8Y29kZT5PcjwvY29kZT4gbm9kZS48L2xpPg0KKwkJICA8bGk+Rm9yIDxjb2RlPk5PVDwvY29kZT4sIHBvcCBvbmUgdmFsdWUgb2ZmIGFuZCBwdXNoIGEgPGNvZGU+Tm90PC9jb2RlPiBub2RlLjwvbGk+DQorCQk8L3VsPg0KKwkgICAgICA8L2xpPg0KKwkgICAgPC9vbD4NCisJICA8L2xpPg0KKwk8L29sPg0KKwk8cD5JbiB0aGUgZW5kLCB0aGVyZSB3aWxsIGJlIG9uZSBlbGVtZW50IGxlZnQgb24gdGhlIHN0YWNrLCBhbg0KKwkgIDxjb2RlPkV4cHI8L2NvZGU+IG5vZGUgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIHRoZQ0KKwkgIGV4cHJlc3Npb24gdHJlZS4gIEhlcmUncyB0aGUgbWV0aG9kIG9mDQorCSAgPGNvZGU+TXVzaWNIYW5kbGVyPC9jb2RlPiB0aGF0IGltcGxlbWVudHMgdGhlIGFsZ29yaXRobToNCisJPC9wPg0KKw0KKwk8c291cmNlPnByaXZhdGUgc3RhdGljIEV4cHIgdHJhbnNmb3JtKFhNTFF1ZXJ5IHEpIHsNCisgIFN0YWNrIHN0YWNrID0gbmV3IFN0YWNrKCk7DQorICBmb3IgKEl0ZXJhdG9yIGkgPSBxLmdldFdoZXJlRWxlbWVudFNldCgpDQorICAgIC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsNCisgICAgUXVlcnlFbGVtZW50IGUgPSAoUXVlcnlFbGVtZW50KSBpLm5leHQoKTsNCisgICAgU3RyaW5nIGtleXdvcmQgPSBlLmdldFZhbHVlKCk7DQorICAgIFN0cmluZyB0eXBlID0gZS5nZXRSb2xlKCk7DQorICAgIGlmICgiZWxlbU5hbWUiLmVxdWFscyh0eXBlKSkNCisJc3RhY2sucHVzaChrZXl3b3JkKTsNCisgICAgZWxzZSBpZiAoIkxJVEVSQUwiLmVxdWFscyh0eXBlKSkNCisJc3RhY2sucHVzaChrZXl3b3JkKTsNCisgICAgZWxzZSBpZiAoIlJFTE9QIi5lcXVhbHModHlwZSkpDQorCWFkZFJlbGF0aW9uYWwoa2V5d29yZCwgKFN0cmluZylzdGFjay5wb3AoKSwNCisJICAoU3RyaW5nKXN0YWNrLnBvcCgpLCBzdGFjayk7DQorICAgIGVsc2UgaWYgKCJMT0dPUCIuZXF1YWxzKHR5cGUpKQ0KKwlhZGRMb2dpY2FsKGtleXdvcmQsIHN0YWNrKTsNCisgICAgZWxzZSB0aHJvdyBuZXcNCisJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHF1ZXJ5ICINCisJICArIHR5cGUgKyAiIHR5cGUiKTsNCisgIH0NCisgIGlmIChzdGFjay5zaXplKCkgPT0gMCkNCisgICAgcmV0dXJuIG5ldyBDb25zdGFudCh0cnVlKTsNCisgIGVsc2UgaWYgKHN0YWNrLnNpemUoKSA+IDEpDQorICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYmFsYW5jZWQiDQorICAgICAgKyAiIHF1ZXJ5Iik7DQorICBlbHNlIHJldHVybiAoRXhwcikgc3RhY2sucG9wKCk7DQorfTwvc291cmNlPg0KKw0KKwk8cD5Gb3IgcmVsYXRpb25hbCBhbmQgbG9naWNhbCBvcGVyYXRvcnMsIHRoaXMgbWV0aG9kIGRlZmVycyB0bw0KKwkgIHR3byBvdGhlciB1dGlsaXR5IG1ldGhvZHMsIHdoaWNoIHdlJ2xsIHNlZSBzaG9ydGx5LiAgQWZ0ZXINCisJICBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZW50aXJlICJ3aGVyZSIgc2V0LCB3ZSBjaGVjayB0byBzZWUgaWYNCisJICB0aGVyZSdzIGFuIGVtcHR5IHN0YWNrLiAgVGhhdCdzIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyDQorCSAgcGFzc2VzIGluIGFuIGVtcHR5IGV4cHJlc3Npb24sIHdoaWNoIGJ5IGNvbnZlbnRpb24gd2UnbGwNCisJICB0YWtlIHRvIG1lYW4gdGhleSB3YW50IGV2ZXJ5dGhpbmcuICBPdGhlcndpc2UsIHRoZXJlIHNob3VsZA0KKwkgIGJlIGp1c3Qgb25lIDxjb2RlPkV4cHI8L2NvZGU+IG5vZGUgb24gdGhlIHN0YWNrLCB0aGUgcm9vdCBvZg0KKwkgIHRoZSBleHByZXNzaW9uIHRyZWUuDQorCTwvcD4NCisNCisJPHA+VG8gaGFuZGxlIGFkZGluZyBhIDxjb2RlPlJFTE9QPC9jb2RlPiwgd2UgcG9wIHR3byB2YWx1ZXMNCisJICBvZmYsIHRoZSBlbGVtZW50IG5hbWUgKDxjb2RlPmFydGlzdDwvY29kZT4sDQorCSAgPGNvZGU+YWxidW08L2NvZGU+LCBvciA8Y29kZT50cmFjazwvY29kZT4pLCBhbmQgdGhlIGxpdGVyYWwNCisJICB2YWx1ZSB0aGUgdXNlciB3YW50cyAoPGNvZGU+QmFjaDwvY29kZT4sIDxjb2RlPlBvZW08L2NvZGU+LA0KKwkgIGV0Yy4pLCBhbG9uZyB3aXRoIHRoZSBvcGVyYXRvciBhbmQgdGhlIHN0YWNrOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+cHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSZWxhdGlvbmFsKFN0cmluZyBvcCwNCisgIFN0cmluZyB2YWx1ZSwgU3RyaW5nIGtpbmQsIFN0YWNrIHN0YWNrKSB7DQorICBpZiAoImFydGlzdCIuZXF1YWxzKGtpbmQpKQ0KKyAgICBzdGFjay5wdXNoKG5ldyBBcnRpc3RFeHByKG9wLCB2YWx1ZSkpOw0KKyAgZWxzZSBpZiAoImFsYnVtIi5lcXVhbHMoa2luZCkpDQorICAgIHN0YWNrLnB1c2gobmV3IEFsYnVtRXhwcihvcCwgdmFsdWUpKTsNCisgIGVsc2UgaWYgKCJ0cmFjayIuZXF1YWxzKGtpbmQpKQ0KKyAgICBzdGFjay5wdXNoKG5ldyBUcmFja0V4cHIob3AsIHZhbHVlKSk7DQorICBlbHNlIHRocm93IG5ldw0KKyAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcHJvZmlsZSINCisgICAgICArICIgZWxlbWVudCAiICsga2luZCk7DQorfTwvc291cmNlPg0KKw0KKwk8cD5UaGlzIG1ldGhvZCB0aGVuIHJlcGxhY2VzIHRoZSBwb3BwZWQgb2ZmIHZhbHVlcyB3aXRoIHRoZQ0KKwkgIG1hdGNoaW5nIDxjb2RlPkV4cHI8L2NvZGU+IGNsYXNzIGZvciBhcnRpc3RzLCBhbGJ1bXMsIG9yDQorCSAgdHJhY2tzLg0KKwk8L3A+DQorDQorCTxwPlRvIGhhbmRsZSBhZGRpbmcgYSA8Y29kZT5MT0dPUDwvY29kZT4sIHdlIHBhc3MgdGhlIGxvZ2ljYWwNCisJICBvcGVyYXRvciBhbmQgdGhlIGVudGlyZSBzdGFjayB0byB0aGlzIG1ldGhvZDoNCisJPC9wPg0KKw0KKwk8c291cmNlPnByaXZhdGUgc3RhdGljIHZvaWQgYWRkTG9naWNhbChTdHJpbmcgb3AsDQorICBTdGFjayBzdGFjaykgew0KKyAgaWYgKCJBTkQiLmVxdWFscyhvcCkpDQorICAgIHN0YWNrLnB1c2gobmV3IEFuZCgoRXhwcilzdGFjay5wb3AoKSwNCisgICAgICAoRXhwcikgc3RhY2sucG9wKCkpKTsNCisgIGVsc2UgaWYgKCJPUiIuZXF1YWxzKG9wKSkNCisgICAgc3RhY2sucHVzaChuZXcgT3IoKEV4cHIpc3RhY2sucG9wKCksDQorICAgICAgKEV4cHIpIHN0YWNrLnBvcCgpKSk7DQorICBlbHNlIGlmICgiTk9UIi5lcXVhbHMob3ApKQ0KKyAgICBzdGFjay5wdXNoKG5ldyBOb3QoKEV4cHIpc3RhY2sucG9wKCkpKTsNCisgIGVsc2UgdGhyb3cgbmV3DQorICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBvcGVyYXRvciAiDQorICAgICAgKyBvcCk7DQorfTwvc291cmNlPg0KKw0KKwk8cD5XaXRoIGFsbCB0aGlzIGNvZGUgaW4gcGxhY2Ugd2UgY2FuIGdlbmVyYXRlIHRoZSBleHByZXNzaW9uDQorCSAgdHJlZS4gIExldCdzIGxvb2sgYXQgYW4gZXhhbXBsZS4gIFN1cHBvc2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlDQorCSAgPGNvZGU+WE1MUXVlcnk8L2NvZGU+LCB0aGUgdXNlciBwYXNzZWQgaW48L3A+DQorDQorCTxzb3VyY2U+YXJ0aXN0ID0gQmFjaCBhbmQgbm90IGFsYnVtID0gUG9lbSBvciB0cmFjayAhPSBBcmlhPC9zb3VyY2U+DQorDQorCTxwPlRoZSBYTUxRdWVyeSBxdWVyeSBsYW5ndWFnZSBnZW5lcmF0ZXMgYSBwb3N0Zml4IHN0YWNrIG9mDQorCSAgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPiBvYmplY3RzIGluIHRoZSAid2hlcmUiIGxpc3Q6DQorCTwvcD4NCisNCisJPGltZyBzcmM9Ii4uL2ltYWdlcy9zdGFjay5wbmciIGFsdD0iU3RhY2siIC8+DQorDQorCTxwPkFuZCB3ZSB0aGVuIGNyZWF0ZSB0aGlzIHRyZWU6PC9wPg0KKw0KKwk8aW1nIHNyYz0iLi4vaW1hZ2VzL3RyZWUucG5nIiBhbHQ9IlRyZWUiIC8+DQorDQorCTxwPkNhbGxpbmcgdGhlIHJvb3QncyA8Y29kZT5ldmFsdWF0ZTwvY29kZT4gbWV0aG9kIHRoZW4geWllbGRzDQorCSAgYSA8Y29kZT5qYXZhLnV0aWwuU2V0PC9jb2RlPiBvZiA8Y29kZT5UcmFjazwvY29kZT4gb2JqZWN0cw0KKwkgIHRoYXQgbWF0Y2ggdGhhdCBleHByZXNzaW9uLg0KKwk8L3A+DQorDQorCTxwPk9LLCB3ZSd2ZSBnb3QgYSBzZXQgb2YgPGNvZGU+VHJhY2s8L2NvZGU+cy4gIEJ1dCB3aGF0IHdlDQorCSAgd2FudCBhcmUgYSBzZXQgb2YgPGVtPjxjb2RlPlByb2ZpbGU8L2NvZGU+czwvZW0+LiAgVGhlIG5leHQNCisJICBzdGVwIGlzIHRvIGRlc2NyaWJlIHRob3NlIHRyYWNrcyB1c2luZyB0aGUgcHJvZmlsZSBtZXRhZGF0YQ0KKwkgIG1vZGVsLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRlc2NyaWJpbmcgVHJhY2tzIj4NCisJPHA+UXVlcnkgaGFuZGxlcnMgc2VydmUgdXAgPGNvZGU+TGlzdDwvY29kZT5zIG9mDQorCSAgPGNvZGU+UHJvZmlsZTwvY29kZT4gb2JqZWN0cywgd2hlcmUgPGNvZGU+UHJvZmlsZTwvY29kZT5zDQorCSAgY29udGFpbiBtZXRhZGF0YSBkZXNjcmlwdGlvbnMgb2YgcmVzb3VyY2VzLiAgRm9yIHRoaXMNCisJICB0dXRvcmlhbCwgdGhlIHJlc291cmNlcyB3ZSdyZSBkZXNjcmliaW5nIGFyZSBtdXNpYyB0cmFja3MsDQorCSAgcmVwcmVzZW50ZWQgYnkgaW5zdGFuY2VzIG9mIDxjb2RlPlRyYWNrPC9jb2RlPiBvYmplY3RzLg0KKwkgIFdoZW4gdGhlIGhhbmRsZXIncyA8Y29kZT5maW5kUHJvZmlsZXM8L2NvZGU+IGFuZA0KKwkgIDxjb2RlPmdldDwvY29kZT4gbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHRoZSBPT0RUIGZyYW1ld29yayB0bw0KKwkgIHNlcnZpY2UgYSByZXF1ZXN0LCBhbGwgd2UgaGF2ZSB0byBkbyBpcyBmaW5kIHRoZSBtYXRjaGluZw0KKwkgIDxjb2RlPlRyYWNrPC9jb2RlPiAob3IgPGNvZGU+VHJhY2s8L2NvZGU+cykgYW5kIGNyZWF0ZQ0KKwkgIG1hdGNoaW5nIDxjb2RlPlByb2ZpbGU8L2NvZGU+cy4NCisJPC9wPg0KKw0KKwk8cD5SZWNhbGwgdGhhdCB3ZSdyZSBzZXR0aW5nIHVwIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGVzIG9mIHRoZQ0KKwkgIHByb2ZpbGUgc28gdGhhdA0KKwk8L3A+DQorCTx1bD4NCisJICA8bGk+VGhlIFVSSSBvZiB0aGUgdHJhY2sgYXBwZWFycyBpbiB0aGUgPGNvZGU+SWRlbnRpZmllcjwvY29kZT4uPC9saT4NCisJICA8bGk+VGhlIG5hbWUgb2YgdGhlIHRyYWNrIGFwcGVhcnMgaW4gdGhlIDxjb2RlPlRpdGxlPC9jb2RlPi48L2xpPg0KKwkgIDxsaT5UaGUgbmFtZSBvZiB0aGUgYXJ0aXN0IGFwcGVhcnMgdGhlIDxjb2RlPkNyZWF0b3I8L2NvZGU+LjwvbGk+DQorCTwvdWw+DQorDQorCTxwPkluIGFkZGl0aW9uLCB3ZSdsbCBwdXQgaW4gdHdvIHByb2ZpbGUgZWxlbWVudHM6PC9wPg0KKw0KKwk8dWw+DQorCSAgPGxpPlRoZSBuYW1lIG9mIHRoZSBhbGJ1bSBhcyBhbg0KKwkgICAgPGNvZGU+RW51bWVyYXRlZFByb2ZpbGVFbGVtZW50PC9jb2RlPi4NCisJICA8L2xpPg0KKwkgIDxsaT5UaGUgbmFtZSBvZiB0aGUgYXJ0aXN0IHJlZHVuZGFudGx5IGFzIGFuDQorCSAgICA8Y29kZT5FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQ8L2NvZGU+Lg0KKwkgIDwvbGk+DQorCTwvdWw+DQorDQorCTxwPk5vdywgbGV0J3MgY3JlYXRlIGEgdXRpbGl0eSBtZXRob2QgPGNvZGU+ZGVzY3JpYmU8L2NvZGU+DQorCSAgd2hpY2ggdGFrZXMgYSA8Y29kZT5qYXZhLnV0aWwuU2V0PC9jb2RlPiBvZiBtYXRjaGluZw0KKwkgIDxjb2RlPlRyYWNrPC9jb2RlPnMgYW5kIHlpZWxkcyBhIDxjb2RlPmphdmEudXRpbC5MaXN0PC9jb2RlPg0KKwkgIG9mIGNvcnJlc3BvbmRpbmcgPGNvZGU+UHJvZmlsZTwvY29kZT5zOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+cHJpdmF0ZSBzdGF0aWMgTGlzdCBkZXNjcmliZShTZXQgdHJhY2tzKSB7DQorICBMaXN0IHByb2ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOw0KKyAgZm9yIChJdGVyYXRvciBpID0gdHJhY2tzLml0ZXJhdG9yKCk7DQorICAgIGkuaGFzTmV4dCgpOykgew0KKyAgICBUcmFjayB0ID0gKFRyYWNrKSBpLm5leHQoKTsNCisgICAgU3RyaW5nIGlkID0gdC5nZXRJRCgpLnRvU3RyaW5nKCk7DQorICAgIFN0cmluZyB0cmFja05hbWUgPSB0LmdldE5hbWUoKTsNCisgICAgU3RyaW5nIGFsYnVtTmFtZSA9IHQuZ2V0QWxidW0oKS5nZXROYW1lKCk7DQorICAgIFN0cmluZyBhcnRpc3ROYW1lID0gdC5nZXRBcnRpc3QoKS5nZXROYW1lKCk7DQorICAgIFByb2ZpbGUgcCA9IGNyZWF0ZVByb2ZpbGUoaWQsIHRyYWNrTmFtZSwNCisgICAgICBhbGJ1bU5hbWUsIGFydGlzdE5hbWUpOw0KKyAgICBwcm9maWxlcy5hZGQocCk7DQorICB9DQorICByZXR1cm4gcHJvZmlsZXM7DQorfTwvc291cmNlPg0KKw0KKwk8cD5XZSBidWlsZCBhIGxpc3Qgb2YgPGNvZGU+UHJvZmlsZTwvY29kZT5zIGJ5IGNhbGxpbmcgYW5vdGhlcg0KKwkgIG1ldGhvZCwgPGNvZGU+Y3JlYXRlUHJvZmlsZTwvY29kZT4uICBJdCB0YWtlcyB0aGUgdHJhY2sncw0KKwkgIFVSSSwgaXRzIG5hbWUsIHRoZSBuYW1lIG9mIHRoZSBhbGJ1bSBvbiB3aGljaCBpdCBhcHBlYXJzLA0KKwkgIGFuZCB0aGUgbmFtZSBvZiB0aGUgYXJ0aXN0IHdobyBjcmVhdGVkIGl0LCBhbmQgeWllbGRzIGENCisJICA8Y29kZT5Qcm9maWxlPC9jb2RlPjoNCisJPC9wPg0KKw0KKwk8c291cmNlPnByaXZhdGUgc3RhdGljIFByb2ZpbGUgY3JlYXRlUHJvZmlsZShTdHJpbmcgaWQsDQorICBTdHJpbmcgdHJhY2tOYW1lLCBTdHJpbmcgYWxidW1OYW1lLA0KKyAgU3RyaW5nIGFydGlzdE5hbWUpIHsNCisgIFByb2ZpbGUgcCA9IG5ldyBQcm9maWxlKCk7DQorICBQcm9maWxlQXR0cmlidXRlcyBwYT1uZXcgUHJvZmlsZUF0dHJpYnV0ZXMoaWQsDQorICAgICIxLjAiLCAicHJvZmlsZSIsICJhY3RpdmUiLCAidW5jbGFzc2lmaWVkIiwNCisgICAgLypwYXJlbnQqL251bGwsIC8qY2hpbGRyZW4qL0VMLA0KKyAgICAiMS4zLjYuMS40LjEuNzY1NSIsIC8qcmV2Tm90ZXMqL0VMKTsNCisgIHAuc2V0UHJvZmlsZUF0dHJpYnV0ZXMocGEpOw0KKyAgUmVzb3VyY2VBdHRyaWJ1dGVzIHJhPW5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMocCwNCisgICAgaWQsIHRyYWNrTmFtZSwNCisgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiYXVkaW8vbXBlZyIpLA0KKyAgICAvKmRlc2MqL251bGwsDQorICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYXJ0aXN0TmFtZSksDQorICAgIC8qc3ViamVjdHMqL0VMLCAvKnB1YnMqL0VMLCAvKmNvbnRyaWIqL0VMLA0KKyAgICAvKmRhdGVzKi9FTCwgLyp0eXBlcyovRUwsIC8qc291cmNlcyovRUwsDQorICAgIC8qbGFuZ3MqL0VMLCAvKnJlbGF0aW9ucyovRUwsIC8qY292cyovRUwsDQorICAgIC8qcmlnaHRzKi9FTCwNCisgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiU0suTXVzaWMiKSwNCisgICAgImdyYW51bGUiLCAic3lzdGVtLnByb2R1Y3RTZXJ2ZXIiLA0KKyAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJ1cm46ZWRhOnJtaToiDQorICAgICAgKyAiTXlQcm9kdWN0U2VydmVyIikpOw0KKyAgICBwLnNldFJlc291cmNlQXR0cmlidXRlcyhyYSk7DQorICAgIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCBhcnRpc3RFbGVtID0NCisgICAgbmV3IEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChwLCAiYXJ0aXN0IiwNCisgICAgImFydGlzdCIsICJOYW1lIG9mIHRoZSBhcnRpc3Qgb2YgYSB3b3JrIiwNCisgICAgInN0cmluZyIsICJuYW1lIiwgLypzeW5zKi9FTCwgLypvYiovdHJ1ZSwNCisgICAgLyptYXhPY2N1ciovMSwgLypjb21tZW50Ki9udWxsLA0KKyAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFydGlzdE5hbWUpKTsNCisgIHAuZ2V0UHJvZmlsZUVsZW1lbnRzKCkucHV0KCJhcnRpc3QiLA0KKyAgICBhcnRpc3RFbGVtKTsNCisgIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCBhbGJ1bUVsZW0gPQ0KKyAgICBuZXcgRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KHAsICJhbGJ1bSIsDQorICAgICJhbGJ1bSIsICJOYW1lIG9mIGFsYnVtIHdoZXJlIHRyYWNrIG9jY3VycyIsDQorICAgICJzdHJpbmciLCAibmFtZSIsIC8qc3lucyovRUwsIC8qb2IqL3RydWUsDQorICAgIC8qbWF4T2NjdXIqLzEsIC8qY29tbWVudCovbnVsbCwNCisgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhbGJ1bU5hbWUpKTsNCisgIHAuZ2V0UHJvZmlsZUVsZW1lbnRzKCkucHV0KCJhbGJ1bSIsDQorICAgIGFsYnVtRWxlbSk7DQorICByZXR1cm4gcDsNCit9PC9zb3VyY2U+DQorDQorCTxwPlRoZSBwcm9maWxlIGF0dHJpYnV0ZXMgc2F5IHRoYXQ8L3A+DQorCTx1bD4NCisJICA8bGk+VGhlIElEIG9mIHRoZSBwcm9maWxlIGl0c2VsZiBpcyB0aGUgc2FtZSBhcyB0aGUgdHJhY2sncyBVUkkuPC9saT4NCisJICA8bGk+VGhlIHZlcnNpb24gb2YgdGhlIHByb2ZpbGUgaXMgMS4wLjwvbGk+DQorCSAgPGxpPlRoZSB0eXBlIGlzICJwcm9maWxlIi48L2xpPg0KKwkgIDxsaT5JdCdzIGN1cnJlbnRseSBhY3RpdmUuPC9saT4NCisJICA8bGk+SXQncyBub3QgdG9wLXNlY3JldCwgaXQncyAidW5jbGFzc2lmaWVkIi48L2xpPg0KKwkgIDxsaT5JdCBoYXMgbm8gcGFyZW50IHByb2ZpbGUuPC9saT4NCisJICA8bGk+SXQgaGFzIG5vIGNoaWxkIHByb2ZpbGVzLjwvbGk+DQorCSAgPGxpPlRoZSByZWdpc3RyYXRpb24gYXV0aG9yaXR5IGhhcyBPSUQgMS4zLjYuMS40LjEuNzY1NTwvbGk+DQorCSAgPGxpPlRoZXJlIGFyZSBubyByZXZpc2lvbiBub3Rlcy48L2xpPg0KKwk8L3VsPg0KKw0KKwk8cD5UaGUgcmVzb3VyY2UgYXR0cmlidXRlcyBzYXkgdGhhdDwvcD4NCisJPHVsPg0KKwkgIDxsaT5UaGUgSWRlbnRpZmllciBpcyB0aGUgdHJhY2sncyBVUkkuPC9saT4gPGxpPlRoZSBUaXRsZSBpcw0KKwkgIHRoZSB0cmFjaydzIHRpdGxlLjwvbGk+IDxsaT5UaGUgc29sZSBGb3JtYXQgaW4gd2hpY2ggdGhlDQorCSAgdHJhY2sgaXMgYXZhaWxhYmxlIGlzIDxjb2RlPmF1ZGlvL21wZWc8L2NvZGU+LjwvbGk+DQorCSAgPGxpPlRoZXJlJ3Mgbm8gZGVzY3JpcHRpb24uPC9saT4gPGxpPlRoZSBzb2xlIENyZWF0b3IgaXMgdGhlDQorCSAgbmFtZSBvZiB0aGUgYXJ0aXN0LjwvbGk+IDxsaT5UaGVyZSBhcmUgbm8gc3ViamVjdCBrZXl3b3JkcywNCisJICBwdWJsaXNoZXJzLCBjb250cmlidXRvcnMsIGRhdGVzLCB0eXBlcywgc291cmNlcywgbGFuZ3VhZ2VzLA0KKwkgIHJlbGF0aW9ucywgY292ZXJhZ2VzLCBub3IgcmlnaHRzLjwvbGk+DQorCSAgPGxpPlRoZSBzb2xlIHJlc291cmNlIGNvbnRleHQgaXMgIlR1dG9yaWFsLk11c2ljIi48L2xpPg0KKwkgIDxsaT5UaGUgcmVzb3VyY2UncyBhZ2dyZWdhdGlvbiBpcyAiZ3JhbnVsZSIsIG1lYW5pbmcgdGhpcyBwcm9maWxlIGlzIGRlc2NyaWJpbmcgYSBzaW5nbGUsIGRpc2NyZXRlIHJlc291cmNlLjwvbGk+DQorCSAgPGxpPlRoZSByZXNvdXJjZSdzIGNsYXNzIGlzICJzeXN0ZW0ucHJvZHVjdFNlcnZlciIsIG1lYW5pbmcgeW91IG5lZWQgdG8gY29udGFjdCBhIHByb2R1Y3Qgc2VydmVyIGF0IHRoZSByZXNvdXJjZSBsb2NhdGlvbiB0byByZXRyaWV2ZSB0aGUgcmVzb3VyY2UuPC9saT4NCisJICA8bGk+VGhlIHJlc291cmNlIGxvY2F0aW9uIGlzIDxjb2RlPnVybjplZGE6cm1pOk15UHJvZHVjdFNlcnZlcjwvY29kZT4uPC9saT4NCisJPC91bD4NCisNCisJPHA+RmluYWxseSwgdGhlIHR3byBwcm9maWxlIGVsZW1lbnRzIHRlbGwgKGFnYWluKSB3aG8gdGhlDQorCSAgYXJ0aXN0IHdhcyBhbmQgYWxzbyBvbiB3aGF0IGFsYnVtIHRoZSB0cmFjayBhcHBlYXJzLg0KKwk8L3A+DQorDQorCTxwPldoYXQncyB3aXRoIGFsbCB0aGUgPGNvZGU+RUw8L2NvZGU+cz8gIEl0J3MganVzdCB0byBzYXZlIG9uIHR5cGluZzo8L3A+DQorDQorCTxzb3VyY2U+cHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBFTA0KKyAgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOzwvc291cmNlPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbXBsZW1lbnRuZyB0aGUgSW50ZXJmYWNlIj4NCisJPHA+VGhlIDxjb2RlPlByb2ZpbGVIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2Ugc3RpcHVsYXRlcyB0d28NCisJICBtZXRob2RzLCBvbmUgZm9yIGZpbmRpbmcgcHJvZmlsZXMgZ2l2ZW4gYW4NCisJICA8Y29kZT5YTUxRdWVyeTwvY29kZT4gYW5kIGFub3RoZXIgZm9yIHJldHJpZXZpbmcgYSBzaW5nbGUNCisJICBwcm9maWxlIGdpdmVuIGl0cyBJRC4gIFdpdGggYWxsIG9mIHRoZXNlIHV0aWxpdHkgbWV0aG9kcyBpbg0KKwkgIHBsYWNlLCB0aGVzZSBhcmUgYm90aCBlYXN5IHRvIHdyaXRlLiAgRmlyc3QsIHRoZQ0KKwkgIDxjb2RlPmZpbmRQcm9maWxlczwvY29kZT4gbWV0aG9kOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+cHVibGljIExpc3QgZmluZFByb2ZpbGVzKFhNTFF1ZXJ5IHEpIHsNCisgIEV4cHIgZXhwciA9IHRyYW5zZm9ybShxKTsNCisgIFNldCBtYXRjaGVzID0gZXhwci5ldmFsdWF0ZSgpOw0KKyAgTGlzdCBwcm9maWxlcyA9IGRlc2NyaWJlKG1hdGNoZXMpOw0KKyAgcmV0dXJuIHByb2ZpbGVzOw0KK308L3NvdXJjZT4NCisNCisJPHA+VGhlIGFsZ29yaXRobSBzaG91bGQgYmUgcGFpbmZ1bGx5IG9idmlvdXMgYnkgbm93OiB0cmFuc2Zvcm0NCisJICB0aGUgcXVlcnkgdG8gYSB0cmVlLCBldmFsdWF0ZSB0aGUgdHJlZSBpbnRvIGEgc2V0IG9mDQorCSAgbWF0Y2hpbmcgdHJhY2tzLCBhbmQgZGVzY3JpYmUgdGhlIHRyYWNrcy4NCisJPC9wPg0KKw0KKwk8cD5UaGUgPGNvZGU+Z2V0PC9jb2RlPiBtZXRob2QgdGFrZXMgYSBwcm9maWxlJ3MgSUQgYW5kDQorCSAgcmV0dXJucyB0aGUgbWF0Y2hpbmcgcHJvZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQncw0KKwkgIG5vdCBmb3VuZC4gIFNpbmNlIHdlJ3JlIHVzaW5nIHRoZSB0cmFjaydzIElEIGFzIHRoZQ0KKwkgIHByb2ZpbGUncyBJRCBhcyB3ZWxsLCB3ZSBjYW4ganVzdCBpdGVyYXRlIHRocm91Z2ggb3VyDQorCSAgdHJhY2tzLCBmaW5kIHRoZSBvbmUgd2l0aCB0aGUgbWF0Y2hpbmcgSUQsIGFuZA0KKwkgIDxjb2RlPmRlc2NyaWJlPC9jb2RlPiBpdDoNCisJPC9wPg0KKw0KKwk8c291cmNlPnB1YmxpYyBQcm9maWxlIGdldChTdHJpbmcgaWQpIHsNCisgIFVSSSB1cmkgPSBVUkkuY3JlYXRlKGlkKTsNCisgIGZvciAoSXRlcmF0b3IgaSA9IERCLlRSQUNLUy5pdGVyYXRvcigpOw0KKyAgICBpLmhhc05leHQoKTspIHsNCisgICAgVHJhY2sgdCA9IChUcmFjaykgaS5uZXh0KCk7DQorICAgIGlmICh0LmdldElEKCkuZXF1YWxzKHVyaSkpDQorICAgICAgcmV0dXJuIGNyZWF0ZVByb2ZpbGUodC5nZXRJRCgpLnRvU3RyaW5nKCksDQorICAgICAgICB0LmdldE5hbWUoKSwgdC5nZXRBbGJ1bSgpLmdldE5hbWUoKSwNCisgICAgICAgIHQuZ2V0QXJ0aXN0KCkuZ2V0TmFtZSgpKTsNCisgIH0NCisgIHJldHVybiBudWxsOw0KK308L3NvdXJjZT4NCisNCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tcGxldGUgU291cmNlIENvZGUiPg0KKwk8cD5Eb24ndCBmZWVsIGxpa2UgY3V0dGluZyBhbmQgcGFzdGluZyBhbGwgb2YgdGhvc2UgY29kZQ0KKwkgIGZyYWdtZW50cz8gIE5vIHByb2JsZW0uICBBbGwgb2YgdGhlIHNvdXJjZSBmaWxlcyBhcmUNCisJICBhdmFpbGFibGUgPGEgaHJlZj0iLi4vZXhhbXBsZXMvc3JjLmphciI+aW4gYSBqYXI8L2E+Lg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IkNvbXBpbGluZyB0aGUgSGFuZGxlciI+DQorICAgICAgPHA+QXMgd2l0aCB0aGUgPGENCisJICBocmVmPSIuLi9oYW5kbGVyLyI+PGNvZGU+TnVsbEhhbmRsZXI8L2NvZGU+PC9hPiwgd2UnbGwgdXNlIHRoZQ0KKwlKMlNESyBjb21tYW5kLWxpbmUgdG9vbHMuICBBbmQgaWYgeW91J3ZlIGdvbmUgdGhyb3VnaCB0aGUgPGENCisJICBocmVmPSIuLi9oYW5kbGVyLyI+PGNvZGU+TnVsbEhhbmRsZXI8L2NvZGU+IHR1dG9yaWFsPC9hPiwgeW91J3ZlDQorCWdvdCBhbGwgdGhlIGRlcGVuZGVudCBqYXJzIGluIHBsYWNlIGFscmVhZHkuICBKdXN0IHB1dCB0aGUNCisJPGNvZGU+TXVzaWNIYW5kbGVyLmphdmE8L2NvZGU+IGFuZCBhbGwgdGhlIHJlbGF0ZWQgc291cmNlIGZpbGVzDQorCXVuZGVyIDxjb2RlPiRQU19IT01FL3NyYzwvY29kZT4sIGNvbXBpbGUsIGFuZCBidWlsZCB0aGUgamFyOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c291cmNlPiUgPGI+bHMgc3JjPC9iPg0KK0FsYnVtLmphdmEgICAgICAgICBFeHByLmphdmENCitBbGJ1bUV4cHIuamF2YSAgICAgTXVzaWNIYW5kbGVyLmphdmENCitBbmQuamF2YSAgICAgICAgICAgTm90LmphdmENCitBcnRpc3QuamF2YSAgICAgICAgTnVsbEhhbmRsZXIuamF2YQ0KK0FydGlzdEV4cHIuamF2YSAgICBPci5qYXZhDQorQ29uc3RhbnQuamF2YSAgICAgIFRyYWNrLmphdmENCitEQi5qYXZhICAgICAgICAgICAgVHJhY2tFeHByLmphdmENCislIDxiPmphdmFjIC1leHRkaXJzIGxpYiAtZCBjbGFzc2VzIHNyYy8qLmphdmE8L2I+DQorJSA8Yj5scyBjbGFzc2VzPC9iPg0KK0FsYnVtLmNsYXNzICAgICAgICAgRXhwci5jbGFzcw0KK0FsYnVtRXhwci5jbGFzcyAgICAgTXVzaWNIYW5kbGVyLmNsYXNzDQorQW5kLmNsYXNzICAgICAgICAgICBOb3QuY2xhc3MNCitBcnRpc3QuY2xhc3MgICAgICAgIE51bGxIYW5kbGVyLmNsYXNzDQorQXJ0aXN0RXhwci5jbGFzcyAgICBPci5jbGFzcw0KK0NvbnN0YW50LmNsYXNzICAgICAgVHJhY2suY2xhc3MNCitEQi5jbGFzcyAgICAgICAgICAgIFRyYWNrRXhwci5jbGFzcw0KKyUgPGI+Y2QgY2xhc3NlczwvYj4NCislIDxiPmphciAtdWYgLi4vbGliL215LWhhbmRsZXIuamFyICouY2xhc3M8L2I+DQorJSA8Yj5jZCAuLjwvYj4NCislIDxiPmphciAtdGYgbGliL215LWhhbmRsZXIuamFyPC9iPg0KK01FVEEtSU5GLw0KK01FVEEtSU5GL01BTklGRVNULk1GDQorTnVsbEhhbmRsZXIuY2xhc3MNCitBbGJ1bS5jbGFzcw0KK0FsYnVtRXhwci5jbGFzcw0KK0FuZC5jbGFzcw0KK0FydGlzdC5jbGFzcw0KK0FydGlzdEV4cHIuY2xhc3MNCitDb25zdGFudC5jbGFzcw0KK0RCLmNsYXNzDQorRXhwci5jbGFzcw0KK011c2ljSGFuZGxlci5jbGFzcw0KK05vdC5jbGFzcw0KK09yLmNsYXNzDQorVHJhY2suY2xhc3MNCitUcmFja0V4cHIuY2xhc3M8L3NvdXJjZT4NCisNCisgICAgICA8cD5XZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSA8Y29kZT4kUFNfSE9NRS9iaW4vcHM8L2NvZGU+DQorCXNjcmlwdC4gIEN1cnJlbnRseSwgaXQncyBpbnN0YW50aWF0aW5nIGp1c3QgdGhlDQorCTxjb2RlPk51bGxIYW5kbGVyPC9jb2RlPjsgd2UgbmVlZCBpdCB0byBpbnN0YW50aWF0ZSB0aGUNCisJPGNvZGU+TXVzaWNIYW5kbGVyPC9jb2RlPiB0b28uICBTdG9wIGFueSBjdXJyZW50bHkgcnVubmluZw0KKwlwcm9maWxlIHNlcnZlciBieSBwcmVzc2luZyBDVFJMK0MgKG9yIHdoYXRldmVyIHlvdXIgaW50ZXJydXB0DQorCWtleSBpcykgaW4gdGhlIHdpbmRvdyBydW5uaW5nIHRoZSBzZXJ2ZXIuICBUaGVuIGVkaXQgdGhlDQorCXNjcmlwdCBzbyBpdCByZWFkcyBhcyBmb2xsb3dzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c291cmNlPiMhL2Jpbi9zaA0KK2V4ZWMgamF2YSAtRGphdmEuZXh0LmRpcnM9JFBTX0hPTUUvbGliIFwNCisgICAgLURoYW5kbGVycz1OdWxsSGFuZGxlcixNdXNpY0hhbmRsZXIgXA0KKyAgICBqcGwuZWRhLkV4ZWNTZXJ2ZXIgXA0KKyAgICBqcGwuZWRhLnByb2ZpbGUucm1pLlByb2ZpbGVTZXJ2aWNlSW1wbCBcDQorICAgIHVybjplZGE6cm1pOk15UHJvZmlsZVNlcnZpY2U8L3NvdXJjZT4NCisNCisgICAgICA8cD5Ob3cgdGhlIHByb2ZpbGUgc2VydmVyIHdpbGwgZGVsZWdhdGUgdG8gPGVtPnR3bzwvZW0+DQorCWhhbmRsZXJzOiB0aGUgPGNvZGU+TnVsbEhhbmRsZXI8L2NvZGU+IGFuZCB0aGUNCisJPGNvZGU+TXVzaWNIYW5kbGVyPC9jb2RlPi4gIFdpdGggbW9yZSB0aGFuIG9uZSBoYW5kbGVyLCB0aGUNCisJT09EVCBmcmFtZXdvcmsgY2FsbHMgZWFjaCBvbmUgaW4gdHVybiBhbmQgY29sbGVjdHMgYWxsIG9mIHRoZQ0KKwltYXRjaGluZyBwcm9maWxlcyB0b2dldGhlciB0byByZXR1cm4gdG8gdGhlDQorCTxjb2RlPlByb2ZpbGVDbGllbnQ8L2NvZGU+LiAgKE9mIGNvdXJzZSwgdGhlDQorCTxjb2RlPk51bGxIYW5kbGVyPC9jb2RlPiBuZXZlciBhY3R1YWxseSBnZW5lcmF0ZXMgYW55IG1hdGNoaW5nDQorCXByb2ZpbGVzLikNCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iUXVlcnlpbmcgdGhlIFByb2ZpbGUgU2VydmVyIj4NCisgICAgICA8cD5TdGFydCB0aGUgcHJvZmlsZSBzZXJ2ZXIgYnkgcnVubmluZw0KKwk8Y29kZT4kUFNfSE9NRS9iaW4vcHM8L2NvZGU+IGluIG9uZSB3aW5kb3cgKHByZXN1bWFibHkgdGhlIFJNSQ0KKwlyZWdpc3RyeSBpcyBzdGlsbCBydW5uaW5nIGluIGFub3RoZXIgd2luZG93KS4gIEluIHlldCBhbm90aGVyDQorCXdpbmRvdywgd2UnbGwgcnVuIG91ciA8Y29kZT4kUFNfSE9NRS9iaW4vcGM8L2NvZGU+IHNjcmlwdCB0bw0KKwlxdWVyeSB0aGUgcHJvZmlsZSBzZXJ2ZXI6DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+JSA8Yj4kUFNfSE9NRS9iaW4vcGMgJ2FydGlzdCA9IERlbGVyaXVtDQorIEFORCBhbGJ1bSAhPSBQb2VtIE9SIGFydGlzdCA9IEJhY2gnPC9iPjwhW0NEQVRBWw0KK09iamVjdCBjb250ZXh0IHJlYWR5OyBkZWxlZ2F0aW5nIHRvOg0KK1tqcGwuZWRhLm9iamVjdC5qbmRpLlJNSUNvbnRleHRAZGVjOGIzXQ0KK1s8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9maWxlPjxwcm9mQXR0cmlidXRlcz48cHJvZklkPnVybjpzazp0cjkxQkMubXAzPC9wcm9mSWQ+Li4uXV0+PC9zb3VyY2U+DQorDQorICAgICAgPHA+V2hvYSEgIFRoZXJlJ3MgYSBodWdlIGxvYWQgb2YgWE1MISAgSW4gZmFjdCB3aGF0IHRoZQ0KKwk8Y29kZT5Qcm9maWxlQ2xpZW50PC9jb2RlPiBpcyBwcmludGluZyBpcyBhDQorCTxjb2RlPmphdmEudXRpbC5MaXN0PC9jb2RlPiBvZiBwcm9maWxlcyBpbiBYTUwgZm9ybWF0LCBlYWNoDQorCXNlcGFyYXRlZCBieSBhIGNvbW1hLCBhbmQgdGhlIHdob2xlIGxpc3QgaW4gc3F1YXJlIGJyYWNrZXRzLg0KKwlJZiB5b3Ugc2VhcmNoIHRoaXMgb3V0cHV0IGNhcmVmdWxseSwgdGhvdWdoLCB5b3UgY2FuIHBpY2sgb3V0DQorCXRoZSA8Y29kZT4mbHQ7VGl0bGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhbmQgc2VlIGluZGVlZCB0aGF0DQorCXdlJ3ZlIGdvdCBzaXggbWF0Y2hpbmcgdHJhY2tzOg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8dWw+DQorCTxsaT5CcmFuZGVuYnVyZyBDb25jZXJ0byAjMTwvbGk+DQorCTxsaT5CcmFuZGVuYnVyZyBDb25jZXJ0byAjMjwvbGk+DQorCTxsaT5CcmFuZGVuYnVyZyBDb25jZXJ0byAjMzwvbGk+DQorCTxsaT5CcmFuZGVuYnVyZyBDb25jZXJ0byAjNDwvbGk+DQorCTxsaT5CcmFuZGVuYnVyZyBDb25jZXJ0byAjNTwvbGk+DQorCTxsaT5CcmFuZGVuYnVyZyBDb25jZXJ0byAjNjwvbGk+DQorCTxsaT5GbG93ZXJzIEJlY29tZSBTY3JlZW5zPC9saT4NCisJPGxpPk1ldGFwaG9yPC9saT4NCisgICAgICA8L3VsPg0KKw0KKyAgICAgIDxwPlN1cmUgZW5vdWdoLCB0aGlzIG1hdGNoZXMgdGhlIFhNTFF1ZXJ5IHF1ZXJ5IGxhbmd1YWdlDQorCWV4cHJlc3Npb24gd2UgcGFzc2VkIGluOiBUaGVyZSBhcmUgdHJhY2tzIGJ5IERlbGVyaXVtIGJ1dA0KKwk8ZW0+bm90PC9lbT4gZnJvbSB0aGUgUG9lbSBhbGJ1bSwgYW5kIHRoZXJlIGFyZSBhbGwgdGhlIHRyYWNrcw0KKwlieSBCYWNoLg0KKyAgICAgIDwvcD4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSdDb25jbHVzaW9uJz4NCisgICAgICA8cD5JbiB0aGlzIGxvbmcgdHV0b3JpYWwgd2UgZGV2ZWxvcGVkIGEgcmVhbCBwcm9maWxlIGhhbmRsZXINCisJdGhhdCBhbnN3ZXJlZCBxdWVyaWVzIGJ5IHRyYW5zZm9ybWluZyB0aGVtIGZyb20gcG9zdGZpeCBzdGFja3MNCisJaW50byBleHByZXNzaW9uIHRyZWVzIGFuZCB1c2luZyB0aG9zZSB0cmVlcyB0byBxdWVyeSBhbg0KKwlpbi1tZW1vcnkgZGF0YWJhc2UgbWFkZSBvZiBKYXZhIG9iamVjdHMuICBXZSB0aGVuIGRlc2NyaWJlZA0KKwltYXRjaGluZyBkYXRhIGJ5IGNyZWF0aW5nIDxjb2RlPlByb2ZpbGU8L2NvZGU+cy4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+WW91IG1pZ2h0IGJlIHRoaW5raW5nIHRoYXQgdGhpcyBzZWVtcyBsaWtlIGEgbG90IG9mIHdvcmssIGFuZA0KKwl0aGVyZSBtaWdodCBiZSBzb21lIGVhc2llciB3YXlzIHRvIGdvLiAgWW91IGNvdWxkIHVzZSB0aGUNCisJPGNvZGU+TGlnaHR3ZWlnaHRQcm9maWxlSGFuZGxlcjwvY29kZT4gZm9yIHJlc291cmNlcyB0aGF0DQorCW5ldmVyIGNoYW5nZSwgYnV0IG9ubHkgaWYgeW91IGRvbid0IGhhdmUgdG9vIG1hbnkgb2YgdGhlbSBhbmQNCisJZG9uJ3QgbWluZCBtYW5hZ2luZyBwb3RlbnRpYWxseSBsYXJnZSBYTUwgZG9jdW1lbnRzLiAgWW91DQorCWNvdWxkIGNob29zZSB0byB1c2UgdW5wYXJzZWQgWE1MUXVlcnkgZXhwcmVzc2lvbnMgYW5kIGluc3RlYWQNCisJbWFrZSB0aGUgdXNlciBxdWVyeSBpbiB0aGUgc2FtZSBsYW5ndWFnZSBhcyB5b3VyIGRhdGEgc3lzdGVtLA0KKwlvYnZpYXRpbmcgdGhlIG5lZWQgZm9yIGNvbXBsZXggZXhwcmVzc2lvbiB0cmVlcy4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+SG93ZXZlciwgd2l0aCB0aGUgdG9vbHMgcHJlc2VudGVkIGluIHRoaXMgdHV0b3JpYWwsIHlvdSBjb3VsZA0KKwlhZGFwdCB0aGUgZXhwcmVzc2lvbiB0cmVlIGNvZGUgdG8gZ2VuZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMNCisJcXVlcmllcywgYW5kIGRlc2NyaWJlIHRob3NlIHJlc3VsdHMgd2l0aCBhcyBtdWNoIG9yIGFzIGxpdHRsZQ0KKwlkZXRhaWwgYXMgbmVjZXNzYXJ5Lg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5IYXBweSBwcm9maWxpbmchPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorICA8L2JvZHk+DQorPC9kb2N1bWVudD4NCmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL3NpdGUveGRvYy9oYW5kbGVyL2luZGV4LnhtbCBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL2hhbmRsZXIvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhMDJiMTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3NpdGUveGRvYy9oYW5kbGVyL2luZGV4LnhtbApAQCAtMCwwICsxLDU5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yDQorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yDQorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcw0KK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdA0KK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZg0KK3RoZSBMaWNlbnNlIGF0DQorDQorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVA0KK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUNCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcg0KK3RoZSBMaWNlbnNlLg0KKy0tPg0KKzxkb2N1bWVudD4NCisgIDxwcm9wZXJ0aWVzPg0KKyAgICA8dGl0bGU+RGV2ZWxvcGluZyBhIFByb2ZpbGUgSGFuZGxlcjwvdGl0bGU+DQorICAgIDxhdXRob3IgZW1haWw9IlNlYW4uS2VsbHlAanBsLm5hc2EuZ292Ij5TZWFuIEtlbGx5PC9hdXRob3I+DQorICA8L3Byb3BlcnRpZXM+DQorICA8IS0tIFNoaWZ0IC0gTmV4dXMgT3ZlcmxvYWQgLS0+DQorICA8Ym9keT4NCisgICAgPHNlY3Rpb24gbmFtZT0iRGV2ZWxvcGluZyBhIFByb2ZpbGUgSGFuZGxlciI+DQorICAgICAgPHA+UHJvZmlsZXMgZGVzY3JpYmUgcmVzb3VyY2VzLiBCdXQgd2hlcmUgZG8gcHJvZmlsZXMgY29tZSBmcm9tPw0KKwlGcm9tIHByb2ZpbGUgaGFuZGxlcnMuIFByb2ZpbGUgaGFuZGxlcnMgYXJlIGludGVyY2hhbmdlYWJsZQ0KKwljb21wb25lbnRzIG9mIGEgcHJvZmlsZSBzZXJ2ZXIgdGhhdCBhY2NlcHQgcXVlcmllcyBmb3INCisJcHJvZmlsZXMgYW5kIHJldHVybiBtYXRjaGluZyBwcm9maWxlcy4gUHJvZmlsZSBoYW5kbGVycyB0YWtlIGENCisJc3RhdGljIG9yIGEgZHluYW1pYyBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFuZCBzZXJ2ZSBhbg0KKwllcXVpdmFsZW50IHNldCBvZiBwcm9maWxlcy4gRGV2ZWxvcGluZyBhIG5ldyBwcm9maWxlIGhhbmRsZXINCisJaXMgYXMgc2ltcGxlIGFzIHdyaXRpbmcgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhDQorCXNwZWNpZmljIGludGVyZmFjZSBvciB0d28uDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPklmIHlvdSdyZSBub3QgYWxyZWFkeSBmYW1pbGlhciB3aXRoIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4NCisJY2xhc3MsIGdvIGFoZWFkIGFuZCA8YSBocmVmPSIvZWRtLXF1ZXJ5L3R1dG9yaWFsLyI+dGFrZSBpdHMNCisJICB0dXRvcmlhbCBub3c8L2E+LiAgV2UnbGwgd2FpdCENCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4NCisgICAgICA8cD5Qcm9maWxlIGhhbmRsZXJzIGhhbmRsZSBxdWVyaWVzIGZvciBwcm9maWxlcy4gIFRoZXkncmUgdGhlDQorCWludGVyY2hhbmdlYWJsZSBwYXJ0IG9mIGEgcHJvZmlsZSBzZXJ2ZXIgdGhhdCB5b3UgY2FuIGRldmVsb3ANCisJZm9yIHNwZWNpYWwgbmVlZHMuICBQcm9maWxlIHNlcnZlcnMgZGVsZWdhdGUgYWxsIGluY29taW5nDQorCXJlcXVlc3RzIHRvIHplcm8gb3IgbW9yZSBwcm9maWxlIGhhbmRsZXJzLCBhcyBzaG93biBpbiB0aGUNCisJZm9sbG93aW5nIGNsYXNzIGRpYWdyYW06DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvZGVsZWdhdGlvbi5wbmciIGFsdD0iRGVsZWdhdGlvbiBtb2RlbCIgLz4NCisNCisgICAgICA8cD5EZXZlbG9waW5nLCB0ZXN0aW5nLCBhbmQgZGVwbG95aW5nIGEgbmV3IHByb2ZpbGUgaGFuZGxlcg0KKwlpbnZvbHZlczoNCisgICAgICA8L3A+DQorICAgICAgPG9sPg0KKwk8bGk+Q3JlYXRpbmcgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgKGhvd2V2ZXIgaW5kaXJlY3RseSkNCisJICB0aGUgPGNvZGU+anBsLmVkYS5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UuDQorCTwvbGk+DQorCTxsaT5DcmVhdGluZyBhIG5ldyBwcm9jZXNzIHRoYXQgcnVucyBlaXRoZXIgdGhlIFJNSSBvcg0KKwkgICAgQ09SQkEgPGNvZGU+UHJvZmlsZVNlcnZpY2VJbXBsPC9jb2RlPiBjbGFzcywNCisJICAgIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgeW91ciBoYW5kbGVyIGNsYXNzLg0KKwk8L2xpPg0KKwk8bGk+U3RhcnRpbmcgdGhlIHNlcnZlciBhbmQgc2VuZGluZyBpbiBxdWVyaWVzLg0KKwk8L2xpPg0KKyAgICAgIDwvb2w+DQorICAgICAgPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgZWFjaCBvZiB0aGVzZSBzdGVwcyBpbiBkZXRhaWwuPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IldyaXRpbmcgdGhlIEhhbmRsZXIgQ2xhc3MiPg0KKyAgICAgIDxwPldyaXRpbmcgdGhlIGNsYXNzIHRoYXQgaGFuZGxlcyBwcm9maWxlIHF1ZXJpZXMgYW5kIGRlbGl2ZXJzDQorCXByb2ZpbGUgcmVzdWx0cyBpcyBlYXNpbHkgdGhlIGhhcmRlc3QgcGFydCBpbiBkZXZlbG9waW5nIGEgbmV3DQorCWtpbmQgb2YgcHJvZmlsZSBzZXJ2ZXIuICBQcm9maWxlIHNlcnZlcnMnIGhhbmRsZXJzIGNhbiBzZXJ2ZQ0KKwlwcm9maWxlcyBkZXNjcmliaW5nIHN0YXRpYyByZXNvdXJjZXMsIGNhbiBzeW50aGVzaXplIHByb2ZpbGUNCisJb24gdGhlIGZseSB0byBkZXNjcmliZSByZXNvdXJjZXMsIGFuZCBjYW4gY3JlYXRlIHByb2ZpbGUNCisJbWV0YWRhdGEgZm9yIHJlc291cmNlcyB0aGF0IGNoYW5nZSBhbGwgdGhlIHRpbWUuDQorICAgICAgPC9wPg0KKyAgICAgIA0KKyAgICAgIDxwPlVuZGVyc3RhbmRpbmcgdGhlIHJlc291cmNlcyB5b3UncmUgdHJ5aW5nIHRvIGRlc2NyaWJlIHdpdGgNCisJcHJvZmlsZXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nIHlvdSBjYW4gZG8gYmVmb3JlDQorCWJlZ2lubmluZyB0byB3cml0ZSB5b3VyIHByb2ZpbGUgaGFuZGxlcjoNCisgICAgICA8L3A+DQorDQorICAgICAgPHVsPg0KKwk8bGk+RG8geW91IGFsd2F5cyBoYXZlIHRoZSBzYW1lIHNldCBvZiBzdGF0aWMgcmVzb3VyY2VzPw0KKwkgIElmIHNvLCB5b3UgY2FuIHdyaXRlIGEgc3RhdGljIHByb2ZpbGUgZG9jdW1lbnQgdG8gZGVzY3JpYmUNCisJICB0aGVtIGFuZCB1c2UgdGhlDQorCSAgPGNvZGU+TGlnaHR3ZWlnaHRQcm9maWxlSGFuZGxlcjwvY29kZT4sIHRodXMNCisJICBhdm9pZGluZyBoYXZpbmcgdG8gd3JpdGUgYSBuZXcgaGFuZGxlciBhdCBhbGwuDQorCTwvbGk+DQorCTxsaT5EbyB5b3UgaGF2ZSByZXNvdXJjZXMgdGhhdCBuZXZlciBjaGFuZ2UsIGJ1dCBtYXkgYWRkIHRvIG9yDQorCSAgcmVtb3ZlIGZyb20gdGhhdCBzZXQ/ICBJZiBzbywgeW91IGNhbiB1c2UgdGhlDQorCSAgPGNvZGU+T3JhY2xlUHJvZmlsZUltcGw8L2NvZGU+IGhhbmRsZXIgd2hpY2ggdXNlcyBhbiBPcmFjbGUNCisJICBkYXRhYmFzZSB0byBzdG9yZSBhIHNldCBvZiBwcm9maWxlcyB0aGF0IHlvdSBjYW4gdXBkYXRlLg0KKwk8L2xpPg0KKwk8bGk+RG8geW91IGhhdmUgcmVzb3VyY2VzIHRoYXQgZG8gY2hhbmdlLCBvciB0aGF0IGNvbWUNCisJICBmcm9tIGEgZHluYW1pYyBzZXQgb2YgZGF0YT8gIElmIHNvLCB5b3UnbGwgaGF2ZSB0byB3cml0ZSBhDQorCSAgaGFuZGxlci4NCisJPC9saT4NCisgICAgICA8L3VsPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNob29zaW5nIHRoZSBIYW5kbGVyIEludGVyZmFjZSB0byBJbXBsZW1lbnQiPg0KKwk8cD5UaGUgT09EVCBGcmFtZXdvcmsgcHJvdmlkZXMgdHdvIGhhbmRsZXIgaW50ZXJmYWNlcyAob25lIGlzDQorCSAgYW4gZXh0ZW5zaW9uIG9mIHRoZSBvdGhlcik6DQorCTwvcD4NCisJPHVsPg0KKwkgIDxsaT48Y29kZT5qcGwuZWRhLnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXI8L2NvZGU+DQorCSAgICAgIGlzIHRoZSBiYXNpYyBwcm9maWxlIGhhbmRsZXIuICBJdCBkZWZpbmVzIG1ldGhvZHMgZm9yDQorCSAgICA8ZW0+aGFuZGxpbmc8L2VtPiBzZWFyY2hlcyBmb3IgcHJvZmlsZXMuDQorCSAgPC9saT4NCisNCisJICA8bGk+PGNvZGU+anBsLmVkYS5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVNYW5hZ2VyPC9jb2RlPiBpcyBhbg0KKwkgICAgZXh0ZW5zaW9uIHRoYXQgbm90IGp1c3QgPGVtPmhhbmRsZXM8L2VtPiBwcm9maWxlIHF1ZXJpZXMNCisJICAgIGJ1dCBhbHNvIDxlbT5tYW5hZ2VzPC9lbT4gdGhlIHNldCBvZiBwcm9maWxlcyBtYWludGFpbmVkDQorCSAgICBieSB0aGUgc2VydmVyLCBieSBwcm92aWRpbmcgbWV0aG9kcyBmb3IgYWRkaW5nIHRvLA0KKwkgICAgcmVtb3ZpbmcgZnJvbSwgYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2YgbWFuYWdlZCBwcm9maWxlcy4NCisJICA8L2xpPg0KKwk8L3VsPg0KKyAgICAgIA0KKwk8cD5Gb3IgbmVhcmx5IGFsbCBhcHBsaWNhdGlvbnMsIHRoZSA8Y29kZT5Qcm9maWxlSGFuZGxlcjwvY29kZT4NCisJICBpbnRlcmZhY2UgaXMgc3VmZmljaWVudC4gIElmIHlvdSBuZWVkIHRvIHByb3ZpZGUgcHJvZmlsZQ0KKwkgIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzLCBpdCBzdGlsbCBtYXkgYmUgaGFuZHkgdG8gc3RhcnQgd2l0aA0KKwkgIHRoZSA8Y29kZT5Qcm9maWxlSGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLCBpbXBsZW1lbnQgYW5kIHRlc3QNCisJICBpdHMgbWV0aG9kcywgYW5kIDxlbT50aGVuPC9lbT4gY2hhbmdlIHRvIHRoZQ0KKwkgIDxjb2RlPlByb2ZpbGVNYW5hZ2VyPC9jb2RlPi4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUaGUgUHJvZmlsZUhhbmRsZXIgSW50ZXJmYWNlIj4NCisJPHA+VGhlIDxjb2RlPlByb2ZpbGVIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UgaXMNCisJICBhcyBmb2xsb3dzOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+cGFja2FnZSBqcGwuZWRhLnByb2ZpbGUuaGFuZGxlcnM7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqcGwuZWRhLnByb2ZpbGUuUHJvZmlsZTsNCitpbXBvcnQganBsLmVkYS5wcm9maWxlLlByb2ZpbGVFeGNlcHRpb247DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuWE1MUXVlcnk7DQorDQorcHVibGljIGludGVyZmFjZSBQcm9maWxlSGFuZGxlciB7DQorICBMaXN0IGZpbmRQcm9maWxlcyhYTUxRdWVyeSBxdWVyeSkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICBQcm9maWxlIGdldChTdHJpbmcgcHJvZklEKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsNCit9PC9zb3VyY2U+DQorDQorCTxwPlRoZSB0d28gbWV0aG9kcyBhcmUgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy48L3A+DQorDQorCTxkbD4NCisJICA8ZHQ+PGNvZGU+ZmluZFByb2ZpbGVzPC9jb2RlPjwvZHQ+DQorCSAgPGRkPlRoaXMgbWV0aG9kIGFjY2VwdHMgYSBxdWVyeSBpbiB0aGUgZm9ybSBvZiBhbg0KKwkgICAgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IG9iamVjdCBhbmQgcmV0dXJucyBhDQorCSAgICBKYXZhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mDQorCSAgICA8Y29kZT5Qcm9maWxlPC9jb2RlPiBvYmplY3RzIHRoYXQgbWF0Y2guICBJZg0KKwkgICAgdGhlcmUgYXJlIG5vIG1hdGNoZXMsIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGFuIGVtcHR5DQorCSAgICBsaXN0LiAgSWYgYW4gZXJyb3Igb2NjdXJzLCBpdCBzaG91bGQgdGhyb3cgdGhlDQorCSAgICAgIDxjb2RlPlByb2ZpbGVFeGNlcHRpb248L2NvZGU+Lg0KKw0KKwkgICAgPHA+VGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgdXNlZCBhbmQgbW9zdCBpbXBvcnRhbnQNCisJICAgICAgbWV0aG9kLCBhbmQgcmVhbGx5IGlzIHRoZSA8aT5yYWlzb24NCisJICAgICAgZCdldHJlPC9pPiBmb3IgcHJvZmlsZSBzZXJ2ZXJzLiAgSXQncw0KKwkgICAgICB3aGF0IHRoZSBPT0RUIEZyYW1ld29yayB1c2VzIHRvIGFsbG93IGNsaWVudHMgdG8gYXNrDQorCSAgICAgIHlvdXIgc2VydmVyIGZvciByZXNvdXJjZXMgYmFzZWQgb24gbWV0YWRhdGEgLg0KKwkgICAgPC9wPg0KKwkgIDwvZGQ+DQorCSAgPGR0Pjxjb2RlPmdldDwvY29kZT48L2R0Pg0KKwkgIDxkZD5UaGlzIG1ldGhvZCBhY2NlcHRzIHRoZSBJRCBvZiBhIHByb2ZpbGUgaW4gdGhlIGZvcm0NCisJICAgIG9mIGEgSmF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGFuZCByZXR1cm5zDQorCSAgICBlaXRoZXIgYSA8Y29kZT5Qcm9maWxlPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGF0DQorCSAgICBJRCBvciBudWxsIGlmIHRoZSBJRCBpcyB1bmtub3duLiAgVGhpcyBtZXRob2QgZW5hYmxlcyBhDQorCSAgICBjbGllbnQgdG8gcmV0cmlldmUgYSBwcm9maWxlIHVzaW5nIGEgcHJpb3JpIGtub3dsZWRnZSBvZg0KKwkgICAgdGhlIHByb2ZpbGUncyBJRCAocGVyaGFwcyBmcm9tIGEgcHJldmlvdXMgc2VhcmNoKS4NCisJICA8L2RkPg0KKwk8L2RsPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUaGUgUHJvZmlsZU1hbmFnZXIgSW50ZXJmYWNlIj4NCisJPHA+VGhlIDxjb2RlPlByb2ZpbGVNYW5hZ2VyPC9jb2RlPiBpbnRlcmZhY2UNCisJICBidWlsZHMgb24gdGhlIDxjb2RlPlByb2ZpbGVIYW5kbGVyPC9jb2RlPiwgYW5kIGlzDQorCSAgbGlzdGVkIGJlbG93Og0KKwk8L3A+DQorCTxzb3VyY2U+cGFja2FnZSBqcGwuZWRhLnByb2ZpbGUuaGFuZGxlcnM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGpwbC5lZGEucHJvZmlsZS5Qcm9maWxlOw0KK2ltcG9ydCBqcGwuZWRhLnByb2ZpbGUuUHJvZmlsZUV4Y2VwdGlvbjsNCitpbXBvcnQganBsLmVkYS54bWxxdWVyeS5YTUxRdWVyeTsNCisNCitwdWJsaWMgaW50ZXJmYWNlIFByb2ZpbGVNYW5hZ2VyIGV4dGVuZHMgUHJvZmlsZUhhbmRsZXIgew0KKyAgdm9pZCBhZGQoUHJvZmlsZSBwcm9maWxlKSB0aHJvd3MgUHJvZmlsZUV4Y2VwdGlvbjsNCisgIHZvaWQgYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICB2b2lkIGNsZWFyKCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICBib29sZWFuIGNvbnRhaW5zKFByb2ZpbGUgcHJvZmlsZSkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICBDb2xsZWN0aW9uIGdldEFsbCgpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOw0KKyAgYm9vbGVhbiBpc0VtcHR5KCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICBJdGVyYXRvciBpdGVyYXRvcigpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOw0KKyAgYm9vbGVhbiByZW1vdmUoU3RyaW5nIHByb2ZJRCwgU3RyaW5nIHZlcnNpb24pIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOw0KKyAgYm9vbGVhbiByZW1vdmUoU3RyaW5nIHByb2ZJRCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorICBpbnQgc2l6ZSgpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uOw0KKyAgdm9pZCByZXBsYWNlKFByb2ZpbGUgcHJvZmlsZSkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb247DQorfTwvc291cmNlPg0KKw0KKwk8cD5JZiB5b3UgY2hvb3NlIHRvIGltcGxlbWVudCBhIHByb2ZpbGUgbWFuYWdlciwgcGxlYXNlIHNlZQ0KKwkgIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlDQorCSAgPGNvZGU+UHJvZmlsZU1hbmFnZXI8L2NvZGU+IGNsYXNzIGZvciB0aGUNCisJICBleHBlY3RhdGlvbnMgb2YgZWFjaCBtZXRob2QuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iT3VyIEZpcnN0IFByb2ZpbGUgSGFuZGxlciI+DQorICAgICAgPHA+QWx0aG91Z2ggbm90IHRlcnJpYmx5IHVzZWZ1bCwgYSAmIzgyMjA7bnVsbCYjODIyMTsgcHJvZmlsZQ0KKwloYW5kbGVyIGlzIGEgZ29vZCBleGFtcGxlIHRvIHN0YXJ0IHdpdGggYmVjYXVzZSBpdCBpcyBzbWFsbCBhbmQNCisJd2lsbCBtYWtlIHN1cmUgeW91ciBlbnZpcm9ubWVudCBpcyBpbiBnb29kIHdvcmtpbmcgb3JkZXIgYmVmb3JlDQorCXByb2NlZWRpbmcgdG8gYSByZWFsIHByb2ZpbGUgaGFuZGxlci4NCisgICAgICA8L3A+DQorICAgICAgDQorICAgICAgPHA+V2hhdCdzIGEgJiM4MjIwO251bGwmIzgyMjE7IHByb2ZpbGUgaGFuZGxlcj8gIEl0J3Mgb25lIHRoYXQNCisJc2VydmVzIG5vIHByb2ZpbGVzLiAgVGhhdCBpcywgZm9yIGFueSBxdWVyeSB3aXRoDQorCTxjb2RlPmZpbmRQcm9maWxlczwvY29kZT4gYW5kIGFueSByZXRyaWV2YWwgd2l0aA0KKwk8Y29kZT5nZXQ8L2NvZGU+IGl0IG5ldmVyIHJldHVybnMgYW55IHByb2ZpbGVzLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEaXJlY3RvcnkgTGF5b3V0Ij4NCisJPHA+Rm9yIHRoZXNlIGV4YW1wbGVzLCB3ZSdsbCB3b3JrIG9uIGEga2luZCBvZiBVbml4IHN5c3RlbQ0KKwkgIHdpdGggYSA8Y29kZT5jc2g8L2NvZGU+IHNoZWxsLiAgT3RoZXIgc2hlbGwgdXNlcnMgb3IgV2luZG93cw0KKwkgIHVzZXJzIHdpbGwgbmVlZCB0byBhZGp1c3QuICBXZSdsbCBhbHNvIHVzZSB0aGUgSjJTREsNCisJICBjb21tYW5kLWxpbmUgdG9vbHMuICBJZiB5b3UncmUgdXNpbmcgYW4gSW50ZWdyYXRlZA0KKwkgIERldmVsb3BtZW50IEVudmlyb25tZW50IG9mIHNvbWUgc29ydCwgcGxlYXNlIGFkanVzdA0KKwkgIGFjY29yZGluZ2x5Lg0KKwk8L3A+DQorDQorCTxwPldlJ2xsIGNyZWF0ZSBhICJob21lIiBkaXJlY3RvcnkgZm9yIG91ciBwcm9maWxlIHNlcnZlcnMNCisJICB3aXRoIHN1YmRpcmVjdG9yaWVzIHRvIGhvbGQgc3BlY2lmaWMgY29tcG9uZW50cyBsaWtlIHNvdXJjZQ0KKwkgIGNvZGUsIGphciBmaWxlcywgYW5kIHNjcmlwdHMuICBXZSdsbCBjYWxsIHRoaXMgaG9tZQ0KKwkgIGRpcmVjdG9yeSBieSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgPGNvZGU+UFNfSE9NRTwvY29kZT4NCisJICAoUFMgZm9yIFByb2ZpbGUgU2VydmVyKSwgc28gdGhhdCBzY3JpcHRzIHdvbid0IGhhdmUgdG8gcmVmZXINCisJICB0byB0aGluZ3MgYnkgcmVsYXRpdmUgcGF0aHM6DQorCTwvcD4NCisNCisJPHNvdXJjZT4lIDxiPm1rZGlyIHBzPC9iPg0KKyUgPGI+Y2QgcHM8L2I+DQorJSA8Yj5zZXRlbnYgUFNfSE9NRSBgcHdkYDwvYj4NCislIDxiPm1rZGlyIGJpbiBjbGFzc2VzIGxpYiBzcmM8L2I+PC9zb3VyY2U+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlNvdXJjZSBGaWxlIj4NCisJPHA+T25lIG9mIHRoZSBlYXNpZXIgcGFydHMgaXMgdGhlIHNvdXJjZSBpdHNlbGYgZm9yIHRoZQ0KKwkgICYjODIxNjtudWxsJiM4MjE3OyBwcm9maWxlIGhhbmRsZXIuICBIZXJlIGl0IGlzOg0KKwk8L3A+DQorCTxzb3VyY2U+aW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGpwbC5lZGEucHJvZmlsZS5Qcm9maWxlOw0KK2ltcG9ydCBqcGwuZWRhLnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXI7DQoraW1wb3J0IGpwbC5lZGEueG1scXVlcnkuWE1MUXVlcnk7DQorDQorcHVibGljIGNsYXNzIE51bGxIYW5kbGVyIGltcGxlbWVudHMgUHJvZmlsZUhhbmRsZXIgew0KKyAgcHVibGljIExpc3QgZmluZFByb2ZpbGVzKFhNTFF1ZXJ5IHF1ZXJ5KSB7DQorICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKyAgfQ0KKyAgcHVibGljIFByb2ZpbGUgZ2V0KFN0cmluZyBpZCkgew0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCit9PC9zb3VyY2U+DQorDQorCTxwPk5vdGUgdGhhdCBmb3IgZXZlcnkgcXVlcnksIHRoZQ0KKwkgIDxjb2RlPmZpbmRQcm9maWxlczwvY29kZT4gbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdA0KKwkgIChtZWFuaW5nIHRoYXQgbm8gcHJvZmlsZXMgbWF0Y2hlZCksIGFuZCB0aGF0IGZvciBhbnkgcmV0cmlldmFsDQorCSAgdGhlIDxjb2RlPmdldDwvY29kZT4gbWV0aG9kIHJldHVybnMgbnVsbCwgbWVhbmluZyB0aGF0DQorCSAgdGhlIGhhbmRsZXIgYmVsaWV2ZXMgdGhlcmUncyBubyBzdWNoIHByb2ZpbGUuDQorCTwvcD4NCisJPHA+VGhpcyBjbGFzcyBzaG91bGQgYmUgY29tcGlsZWQgaW50byBhIGZpbGUgbmFtZWQNCisJICA8Y29kZT4kUFNfSE9NRS9zcmMvTnVsbEhhbmRsZXIuamF2YTwvY29kZT4NCisJICBzaW5jZSBpdCBpcyBhIHB1YmxpYyBjbGFzcy4NCisJPC9wPg0KKw0KKwk8cD48ZW0+Tm90ZTo8L2VtPiBQcm9maWxlIGhhbmRsZXIgY2xhc3NlcyA8ZW0+bXVzdDwvZW0+IGJlDQorCSAgcHVibGljIDxlbT5hbmQ8L2VtPiBwcm92aWRlIGEgbm8tYXJndW1lbnRzDQorCSAgY29uc3RydWN0b3IuICBZb3Ugc2hvdWxkIHJldHJpZXZlIGFueSBpbml0aWFsaXphdGlvbg0KKwkgIHNldHRpbmdzIHRocm91Z2ggdGhlIFN5c3RlbSBQcm9wZXJ0aWVzIG9yIGJ5IG90aGVyIG1lYW5zDQorCSAgc3BlY2lmaWMgdG8geW91ciBwcm9maWxlIGhhbmRsZXIuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgICAgDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tcGlsaW5nIHRoZSBIYW5kbGVyIj4NCisJPHA+Q29tcGlsaW5nIHRoaXMgcHJvZmlsZSBoYW5kbGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcNCisJICBkZXBlbmRlbnQgY29tcG9uZW50czoNCisJPC9wPg0KKw0KKwk8dWw+DQorCSAgPGxpPjxhIGhyZWY9Ii9ncmlkLXByb2ZpbGUvIj5Qcm9maWxlIFNlcnZpY2U8L2E+LiAgVGhpcw0KKwkgICAgZGVmaW5lcyB0aGUgZW50aXJlIHByb2ZpbGUgbW9kZWwsIGhhbmRsZXIgaW50ZXJmYWNlcywNCisJICAgIHNlcnZlcnMsIGNsaWVudHMsIGFuZCBzbyBmb3J0aC4NCisJICA8L2xpPg0KKwkgIDxsaT48YSBocmVmPSIvZWRtLXF1ZXJ5LyI+UXVlcnkgRXhwcmVzc2lvbjwvYT4uICBUaGlzDQorCSAgICBkZWZpbmVzIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gYW5kIHJlbGF0ZWQgY2xhc3Nlcy4NCisJICA8L2xpPg0KKwk8L3VsPg0KKw0KKwk8cD5Eb3dubG9hZCB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbnMgb2YgdGhlIGFib3ZlIHR3byBwYWNrYWdlcw0KKwkgIGFuZCBjb3B5IHRoZSBqYXIgZmlsZSBmcm9tIGVhY2ggaW50byB0aGUNCisJICA8Y29kZT4kUFNfSE9NRS9saWI8L2NvZGU+IGRpcmVjdG9yeS4gIFRoZW4geW91IGNhbiBjb21waWxlDQorCSAgdGhlIDxjb2RlPk51bGxIYW5kbGVyLmphdmE8L2NvZGU+IGZpbGUuDQorCTwvcD4NCisNCisJPHNvdXJjZT4lIDxiPmxzPC9iPg0KK2JpbiAgIGNsYXNzZXMgICBsaWIgICAgc3JjDQorJSA8Yj5scyAtbCBsaWI8L2I+DQordG90YWwgMjQ0DQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgICA0Mzg3OSAyOCBGZWIgMDc6MDUgZWRtLXF1ZXJ5LTIuMC4yLmphcg0KKy1ydy1yLS1yLS0gIDEga2VsbHkgIGtlbGx5ICAyMDE0NTMgMjggRmViIDA3OjAxIGdyaWQtcHJvZmlsZS0zLjAuMi5qYXINCislIDxiPmphdmFjIC1leHRkaXJzIGxpYiAtZCBjbGFzc2VzIHNyYy9OdWxsSGFuZGxlci5qYXZhPC9iPg0KKyUgPGI+bHMgLWwgY2xhc3NlczwvYj4NCit0b3RhbCA0DQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgIDUxMSAyOCBGZWIgMDc6MDcgTnVsbEhhbmRsZXIuY2xhc3MNCislIDxiPmphciAtY2YgbGliL215LWhhbmRsZXIuamFyIC1DIGNsYXNzZXMgTnVsbEhhbmRsZXIuY2xhc3M8L2I+DQorJSA8Yj5qYXIgLXRmIGxpYi9teS1oYW5kbGVyLmphcjwvYj4NCitNRVRBLUlORi8NCitNRVRBLUlORi9NQU5JRkVTVC5NRg0KK051bGxIYW5kbGVyLmNsYXNzPC9zb3VyY2U+DQorDQorCTxwPldlIG5vdyBoYXZlIGEgbmV3IGphciBmaWxlLCA8Y29kZT5teS1oYW5kbGVyLmphcjwvY29kZT4NCisJICB3aGljaCBjb250YWlucyBvdXIgJiM4MjE2O251bGwmIzgyMTc7IHByb2ZpbGUgaGFuZGxlciwNCisJICBjb21waWxlZCBhbmQgcmVhZHkgdG8gZ28uDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhcnRpbmcgYW4gUk1JIFJlZ2lzdHJ5Ij4NCisJPHA+Q2xpZW50cyBhY2Nlc3MgcHJvZmlsZSBzZXJ2ZXJzIHdpdGggYW4gb3Blbi1lbmRlZCBzZXQgb2YNCisJICBuZXR3b3JrIHByb3RvY29scy4gIFdlIGN1cnJlbnRseSBoYXZlIGltcGxlbWVudGF0aW9ucyBmb3INCisJICBSTUkgYW5kIENPUkJBLiAgRm9yIHRoaXMgdHV0b3JpYWwsIHdlJ2xsIHVzZSBSTUksIHNpbmNlIGl0J3MNCisJICBlbm9ybW91c2x5IGxlc3MgY29tcGxleC4gIENsaWVudHMgb2YgUk1JIHN5c3RlbXMgZmlyc3QNCisJICBjb250YWN0IGFuIFJNSSByZWdpc3RyeSBhbmQgbG9vayB1cCBhIHNlcnZlciBvYmplY3Qncw0KKwkgIG5ldHdvcmsgYWRkcmVzcy4gIFRoZSByZWdpc3RyeSBtYWludGFpbnMgbWFwcGluZ3MgZnJvbSBhDQorCSAgc2VydmVyIG9iamVjdCdzIG5hbWUgdG8gaXRzIG5ldHdvcmsgYWRkcmVzcy4gIFdoZW4gc2VydmVycw0KKwkgIHN0YXJ0IHVwLCB0aGV5IHJlZ2lzdGVyIHdpdGggdGhlIFJNSSByZWdpc3RyeSBzbyBjbGllbnRzIGNhbg0KKwkgIGxhdGVyIGZpbmQgdGhlbS4NCisJPC9wPg0KKw0KKwk8cD5UbyBzdGFydCBhbiBSTUkgUmVnaXN0cnksIHlvdSdsbCBuZWVkIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czo8L3A+DQorDQorCTx1bD4NCisJICA8bGk+PGEgaHJlZj0iL2VkbS1jb21tb25zLyI+RURNIENvbW1vbiBDb21wb25lbnRzPC9hPi4NCisJICAgIFRoZXNlIGFyZSBjb21tb24gdXRpbGl0aWVzIHVzZWQgYnkgZXZlcnkgT09EVA0KKwkgICAgc2VydmljZS4NCisJICA8L2xpPg0KKwkgIDxsaT48YSBocmVmPSIvcm1pLXJlZ2lzdHJ5LyI+T09EVCBSTUkgUmVnaXN0cnk8L2E+LiAgVGhpcyBpcyB0aGUNCisJICAgIGFjdHVhbCBSTUkgcmVnaXN0cnkuPC9saT4NCisJPC91bD4NCisNCisJPHA+RG93bmxvYWQgZWFjaCBjb21wb25lbnQncyBiaW5hcnkgZGlzdHJpYnV0aW9uLCB1bnBhY2sgZWFjaA0KKwkgIG9uZSwgYW5kIHRha2UgY29sbGVjdCB0aGUgamFyIGZpbGVzIGludG8gdGhlDQorCSAgPGNvZGU+bGliPC9jb2RlPiBkaXJlY3RvcnkuICBUaGUgUk1JIFJlZ2lzdHJ5IHdpbGwgYWxzbyBuZWVkDQorCSAgdGhlIDxjb2RlPmdyaWQtcHJvZmlsZTwvY29kZT4gamFyIGZpbGUsIHdoaWNoIHdlJ3ZlIGFscmVhZHkNCisJICBnb3QuDQorCTwvcD4NCisNCisJPHNvdXJjZT4lIDxiPmxzIC1sICRQU19IT01FL2xpYjwvYj4NCit0b3RhbCA0MDQNCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgMTQ5NTAzIDI4IEZlYiAwNzoyOCBlZG0tY29tbW9ucy0yLjIuNS5qYXINCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgIDQzODc5IDI4IEZlYiAwNzowNSBlZG0tcXVlcnktMi4wLjIuamFyDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgIDIwMTQ1MyAyOCBGZWIgMDc6MDEgZ3JpZC1wcm9maWxlLTMuMC4yLmphcg0KKy1ydy1yLS1yLS0gIDEga2VsbHkgIGtlbGx5ICAgICA3OTYgMjggRmViIDA3OjA3IG15LWhhbmRsZXIuamFyDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgICAgODA1NSAyOCBGZWIgMDc6Mjggcm1pLXJlZ2lzdHJ5LTEuMC4wLmphcjwvc291cmNlPg0KKw0KKwk8cD5Ob3cgYWxsIHdlIG5lZWQgaXMgYSBjb252ZW5pZW50IHNjcmlwdCB0byBzdGFydCB0aGUgUk1JDQorCSAgcmVnaXN0cnkuICBXZSdsbCBjYWxsIGl0IDxjb2RlPnJtaS1yZWc8L2NvZGU+IGFuZCBzdGljayBpdA0KKwkgIGluIHRoZSA8Y29kZT5iaW48L2NvZGU+IGRpcmVjdG9yeS4gIEhlcmUncyB0aGUNCisJICA8Y29kZT5ybWktcmVnPC9jb2RlPiBzY3JpcHQ6PC9wPg0KKw0KKwk8c291cmNlPiMhL2Jpbi9zaA0KK2V4ZWMgamF2YSAtRGphdmEuZXh0LmRpcnM9JFBTX0hPTUUvbGliIFwNCisgICAgZ292Lm5hc2EuanBsLm9vZHQucm1pLlJNSVJlZ2lzdHJ5PC9zb3VyY2U+DQorDQorCTxwPlRoaXMgc2NyaXB0IHRlbGxzIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZSB0byBmaW5kDQorCSAgZXh0ZW5zaW9uIGphcnMgaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT4kUFNfSE9NRS9saWI8L2NvZGU+LiAgSXQNCisJICB0aGVuIHNheXMgdGhhdCB0aGUgbWFpbiBjbGFzcyB0byBleGVjdXRlIGlzDQorCSAgPGNvZGU+Z292Lm5hc2EuanBsLm9vZHQucm1pLlJNSVJlZ2lzdHJ5PC9jb2RlPi4NCisJPC9wPg0KKw0KKwk8cD5HbyBhaGVhZCBhbmQgbWFrZSB0aGlzIHNjcmlwdCBleGVjdXRhYmxlIGFuZCBzdGFydCB0aGUgUk1JDQorCSAgUmVnaXN0cnkuIEluIGFub3RoZXIgd2luZG93ICh3aXRoIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIG9mDQorCSAgPGNvZGU+UFNfSE9NRTwvY29kZT4pLCBydW4NCisJICA8Y29kZT4kUFNfSE9NRS9iaW4vcm1pLXJlZzwvY29kZT4uICBZb3Ugc2hvdWxkIHNlZSBvdXRwdXQNCisJICBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6DQorCTwvcD4NCisNCisJPHNvdXJjZT4lIDxiPmNobW9kIDc1NSAkUFNfSE9NRS9iaW4vcm1pLXJlZzwvYj4NCislIDxiPiRQU19IT01FL2Jpbi9ybWktcmVnPC9iPg0KK01vbiBGZWIgMjggMDc6MzA6MTMgQ1NUIDIwMDU6IG5vIG9iamVjdHMgcmVnaXN0ZXJlZDwvc291cmNlPg0KKw0KKwk8cD5UaGUgUk1JIFJlZ2lzdHJ5IGlzIG5vdyBydW5uaW5nLiAgRXZlcnkgdHdvIG1pbnV0ZXMgaXQgd2lsbA0KKwkgIGRpc3BsYXkgYW4gdXBkYXRlIG9mIGFsbCByZWdpc3RlcmVkIG9iamVjdHMuICBOYXR1cmFsbHksIHdlDQorCSAgZG9uJ3QgaGF2ZSBhbnkgcHJvZmlsZSBzZXJ2aWNlIHJ1bm5pbmcgcmlnaHQgbm93LCBzbyBpdCB3aWxsDQorCSAgc2F5IDxjb2RlPm5vIG9iamVjdHMgcmVnaXN0ZXJlZDwvY29kZT4uICBHbyBhaGVhZCBhbmQgaWdub3JlDQorCSAgdGhpcyB3aW5kb3cgZm9yIG5vdy4gIEl0J3MgdGltZSB0byBzdGFydCBvdXIgcHJvZmlsZSBzZXJ2ZXIuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhcnRpbmcgdGhlIFByb2ZpbGUgU2VydmVyIj4NCisJPHA+V2l0aCBvdXIgaGFuZGxlciBjb21waWxlZCBhbmQgb3VyIFJNSSByZWdpc3RyeSBydW5uaW5nLA0KKwkgIHdlJ3JlIHJlYWR5IHRvIHN0YXJ0IG91ciBwcm9maWxlIHNlcnZlci4gIEFzIHNhaWQgYmVmb3JlLA0KKwkgIHByb2ZpbGUgc2VydmVycyBkZWxlZ2F0ZSB0byB6ZXJvIG9yIG1vcmUgcHJvZmlsZSBoYW5kbGVycyB0bw0KKwkgIGFjdHVhbGx5IGhhbmRsZSBhbGwgaW5jb21pbmcgcmVxdWVzdHMuICBZb3UgdGVsbCB0aGUgcHJvZmlsZQ0KKwkgIHNlcnZlciB3aGF0IGhhbmRsZXJzIHRvIGluc3RhbnRpYXRlIGJ5IG5hbWluZyB0aGVpciBjbGFzc2VzDQorCSAgaW4gYSBzeXN0ZW0gcHJvcGVydHkuICBUaGF0IHByb3BlcnR5IGlzIGNhbGxlZA0KKwkgIDxjb2RlPmhhbmRsZXJzPC9jb2RlPiwgYW5kIGl0cyB2YWx1ZSBpcyBhIGNvbW1hLXNlcGFyYXRlZA0KKwkgIGxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzLCBpbmNsdWRpbmcgdGhlIHBhY2thZ2UNCisJICBuYW1lIHByZWZpeGVzLiAgU2luY2Ugb3VyIDxjb2RlPk51bGxIYW5kbGVyPC9jb2RlPiBpcyBqdXN0DQorCSAgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSwgPGNvZGU+TnVsbEhhbmRsZXI8L2NvZGU+IDxlbT5pczwvZW0+DQorCSAgaXRzIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lLg0KKwk8L3A+DQorDQorCTxwPlByb2ZpbGUgc2VydmVyIHByb2Nlc3NlcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cw0KKwkgIGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIHdlJ3ZlIGRvd25sb2FkZWQgc28gZmFyOjwvcD4NCisNCisJPHVsPg0KKwkgIDxsaT48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy94bWxycGMiPkFwYWNoZQ0KKwkgICAgICBYTUwtUlBDPC9hPi4gIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IE9PRFQgc2VydmljZXMuDQorCSAgICBEb3dubG9hZCB2ZXJzaW9uIDEuMSwgbm90IGEgbGF0ZXIgdmVyc2lvbiEgIElmIHlvdSBwcmVmZXIsDQorCSAgICB5b3UgY2FuIDxhDQorCSAgICAgIGhyZWY9Imh0dHA6Ly9pYmlibGlvLm9yZy9tYXZlbi94bWxycGMvamFycy94bWxycGMtMS4xLmphciI+ZmV0Y2gNCisJICAgICAgdGhlIGphciBmaWxlIGRpcmVjdGx5PC9hPi4NCisJICA8L2xpPg0KKw0KKwkgIDxsaT48YSBocmVmPSJodHRwOi8vamVuYS5zb3VyY2Vmb3JnZS5uZXQvIj5KZW5hIFNlbWFudGljIFdlYg0KKwkgICAgICBGcmFtZXdvcmsgZm9yIEphdmE8L2E+LiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBjbGFzc2VzDQorCSAgICAgIHRoYXQgcmVwcmVzZW50IHByb2ZpbGVzLiAgWW91J2xsIG5lZWQgdmVyc2lvbiAxLjYuMSBZb3UNCisJICAgICAgY2FuIGFsc28gPGENCisJICAgICAgaHJlZj0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292L2Rvd25sb2FkL3B1YmxpYy9KZW5hL2phcnMvamVuYS0xLjYuMS5qYXIiPmZldGNoDQorCSAgICAgIHRoZSBqYXIgZmlsZSBkaXJlY3RseTwvYT4uDQorCSAgPC9saT4NCisJPC91bD4NCisNCisJPHA+Q29weSB0aGVzZSB0d28gb3RoZXIgamFycyB0byB0aGUgPGNvZGU+JFBTX0hPTUUvbGliPC9jb2RlPg0KKwkgIGRpcmVjdG9yeS4gIFlvdSBzaG91bGQgbm93IGhhdmUgc2V2ZW4gamFycyB0aGVyZToNCisJPC9wPg0KKw0KKwk8c291cmNlPiUgPGI+bHMgLWwgJFBTX0hPTUUvbGliPC9iPg0KK3RvdGFsIDE1ODANCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgIDE0OTUwMyAyOCBGZWIgMDc6MjggZWRtLWNvbW1vbnMtMi4yLjUuamFyDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgICAgNDM4NzkgMjggRmViIDA3OjA1IGVkbS1xdWVyeS0yLjAuMi5qYXINCistcnctci0tci0tICAxIGtlbGx5ICBrZWxseSAgIDIwMTQ1MyAyOCBGZWIgMDc6MDEgZ3JpZC1wcm9maWxlLTMuMC4yLmphcg0KKy1ydy1yLS1yLS0gIDEga2VsbHkgIGtlbGx5ICAxMTQ0MTA3IDI4IEZlYiAwOToyMyBqZW5hLTEuNi4xLmphcg0KKy1ydy1yLS1yLS0gIDEga2VsbHkgIGtlbGx5ICAgICAgNzk2IDI4IEZlYiAwNzowNyBteS1oYW5kbGVyLmphcg0KKy1ydy1yLS1yLS0gIDEga2VsbHkgIGtlbGx5ICAgICA4MDU1IDI4IEZlYiAwNzoyOCBybWktcmVnaXN0cnktMS4wLjAuamFyDQorLXJ3LXItLXItLSAgMSBrZWxseSAga2VsbHkgICAgNTM5NzggMjggRmViIDA5OjIwIHhtbHJwYy0xLjEuamFyPC9zb3VyY2U+DQorDQorCTxwPk5vdywgY3JlYXRlIGEgc2Vjb25kIHNoZWxsIHNjcmlwdCB0byBtYWtlIHN0YXJ0aW5nIHRoZQ0KKwkgIHByb2ZpbGUgc2VydmVyIGNvbnZlbmllbnQgYW5kIGNhbGwgaXQNCisJICA8Y29kZT4kUFNfSE9NRS9iaW4vcHM8L2NvZGU+LiAgSXQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOg0KKwk8L3A+DQorDQorCTxzb3VyY2U+IyEvYmluL3NoDQorZXhlYyBqYXZhIC1EamF2YS5leHQuZGlycz0kUFNfSE9NRS9saWIgXA0KKyAgICAtRGhhbmRsZXJzPU51bGxIYW5kbGVyIFwNCisgICAganBsLmVkYS5FeGVjU2VydmVyIFwNCisgICAganBsLmVkYS5wcm9maWxlLnJtaS5Qcm9maWxlU2VydmljZUltcGwgXA0KKyAgICB1cm46ZWRhOnJtaTpNeVByb2ZpbGVTZXJ2aWNlPC9zb3VyY2U+DQorDQorCTxwPk1ha2UgdGhlIHNjcmlwdCBleGVjdXRhYmxlIGFuZCBzdGFydCB0aGUgcHJvZmlsZSBzZXJ2ZXI6PC9wPg0KKw0KKwk8c291cmNlPiUgPGI+Y2htb2QgNzU1ICRQU19IT01FL2Jpbi9wczwvYj4NCislIDxiPiRQU19IT01FL2Jpbi9wczwvYj4NCitPYmplY3QgY29udGV4dCByZWFkeTsgZGVsZWdhdGluZyB0bzogW2pwbC5lZGEub2JqZWN0LmpuZGkuUk1JQ29udGV4dEBkZWM4YjNdPC9zb3VyY2U+DQorDQorCTxwPlRoZSBwcm9maWxlIHNlcnZlciB3aWxsIHN0YXJ0LCBjaGVjayBpdHMNCisJICA8Y29kZT5oYW5kbGVyczwvY29kZT4gcHJvcGVydHksIGFuZCBjcmVhdGUgYW4gb2JqZWN0IG9mIGVhY2gNCisJICBjbGFzcyBuYW1lZCBieSBpdC4gIFRoZW4gaXQnbGwgcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIFJNSQ0KKwkgIHJlZ2lzdHJ5IGFuZCB3YWl0IGZvciByZXF1ZXN0cyB0byBjb21lIGluIGZyb20gcHJvZmlsZSBjbGllbnRzLg0KKwk8L3A+DQorDQorICAgICAgPC9zdWJzZWN0aW9uPg0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IldoYXQncyBpbiBhIE5hbWU/Ij4NCisJPHA+VGhlIHByb2ZpbGUgc2VydmVyIHJlZ2lzdGVycyBpdHNlbGYgdXNpbmcgYSBuYW1lIHByb3ZpZGVkDQorCSAgb24gdGhlIGNvbW1hbmQtbGluZSwgaW4gdGhpcyBjYXNlLA0KKwkgIDxjb2RlPnVybjplZGE6cm1pOk15UHJvZmlsZVNlcnZpY2U8L2NvZGU+LiAgTGV0J3MgdGFrZSBhcGFydA0KKwkgIHRoZSBuYW1lIGFuZCBzZWUgaG93IGl0IHdvcmtzLg0KKwk8L3A+DQorDQorCTxwPklmIHlvdSdyZSBmYW1pbGlhciB3aXRoIHdlYiBzdGFuZGFyZHMsIHlvdSBjYW4gc2VlIHRoYXQgdGhlDQorCSAgbmFtZSBpcyBhIFVuaWZvcm0gUmVzb3VyY2UgTmFtZSAoVVJOKSwgc2luY2UgaXQgc3RhcnRzIHdpdGgNCisJICA8Y29kZT51cm46PC9jb2RlPi4gIFRoZSBPT0RUIEZyYW1ld29yayB1c2VzIFVSTnMgdG8gaWRlbnRpZnkNCisJICBzZXJ2aWNlcyBhbmQgb3RoZXIgb2JqZWN0cy4gIFRoZSA8Y29kZT5lZGE6PC9jb2RlPiB0ZWxscw0KKwkgIHRoYXQgdGhlIG5hbWUgaXMgcGFydCBvZiB0aGUgRW50ZXJwcmlzZSBEYXRhIEFyY2hpdGVjdHVyZQ0KKwkgIChFREEpIG5hbWVzcGFjZS4gIChFREEgd2FzIHRoZSBuYW1lIG9mIGEgcHJvamVjdCByZWxhdGVkIHRvDQorCSAgT09EVCB0aGF0IHdhcyBtZXJnZWQgd2l0aCBPT0RULiAgRm9yIG5vdywganVzdCBhbHdheXMgdXNlDQorCSAgPGNvZGU+ZWRhOjwvY29kZT4gaW4geW91ciBVUk5zLikNCisJPC9wPg0KKwkNCisJPHA+TmV4dCBjb21lcyA8Y29kZT5ybWk6PC9jb2RlPi4gIFRoaXMgaXMgYSBzcGVjaWFsIGZsYWcgZm9yDQorCSAgdGhlIE9PRFQgc2VydmljZXMgdGhhdCB0ZWxscyB0aGF0IHdlJ3JlIHVzaW5nIGEgbmFtZSBvZiBhbg0KKwkgIFJNSS1hY2Nlc3NpYmxlIG9iamVjdC4gIFRoZSBPT0RUIGZyYW1ld29yayB3aWxsIGtub3cgdG8gdXNlDQorCSAgYW4gUk1JIHJlZ2lzdHJ5IHRvIHJlZ2lzdGVyIHRoZSBzZXJ2ZXIuIA0KKwk8L3A+DQorDQorCTxwPkZpbmFsbHkgaXMgPGNvZGU+TXlQcm9maWxlU2VydmljZTwvY29kZT4uICBUaGlzIGlzIHRoZQ0KKwkgIGFjdHVhbCBuYW1lIHVzZWQgaW4gdGhlIFJNSSByZWdpc3RyeS4gIFlvdSBjYW4gY2FsbCB5b3VyDQorCSAgcHJvZmlsZSBzZXJ2ZXIgYW55dGhpbmcgeW91IHdhbnQuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UNCisJICBoYXZlIHRocmVlIHByb2ZpbGUgc2VydmVyczsgb25lIGluIHRoZSBVUywgb25lIGluIENhbmFkYSwNCisJICBhbmQgb25lIGluIEF1c3RyYWxpYS4gIFlvdSBtaWdodCBuYW1lIHRoZW06DQorCTwvcD4NCisNCisJPHVsPg0KKwkgIDxsaT48Y29kZT51cm46ZWRhOnJtaTpVUzwvY29kZT48L2xpPg0KKwkgIDxsaT48Y29kZT51cm46ZWRhOnJtaTpDYW5hZGE8L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+dXJuOmVkYTpybWk6QXVzdHJhbGlhPC9jb2RlPjwvbGk+DQorCTwvdWw+DQorDQorCTxwPk9yIHlvdSBtaWdodCBwcmVmZXIgdG8gdXNlIElTTyBjb3VudHJ5IGNvZGVzLiAgT3IgeW91IG1pZ2h0DQorCSAgbmFtZSB0aGVtIGFjY29yZGluZyB0byB0aGUga2luZHMgb2YgcHJvZmlsZXMgdGhleSBzZXJ2ZSwNCisJICBzdWNoIGFzIDxjb2RlPnVybjplZGE6cm1pOkJpb21hcmtlck1ldGFkYXRhPC9jb2RlPiBvcg0KKwkgIDxjb2RlPnVybjplZGE6cm1pOkJ1c25pZXNzRm9yZWNhc3RNZXRhZGF0YTwvY29kZT4uDQorCTwvcD4NCisNCisJPHA+VGhlIFJNSSByZWdpc3RyeSB3aWxsIGhhcHBpbHkgcmUtYXNzaWduIGEgbmFtZSBpZiBvbmUncw0KKwkgIGFscmVhZHkgaW4gdXNlLCBzbyB3aGVuIGRlcGxveWluZyB5b3VyIG93biBwcm9maWxlIChhbmQNCisJICBvdGhlcikgc2VydmVycywgYmUgc3VyZSB0byBnaXZlIGVhY2ggb25lIGEgdW5pcXVlIG5hbWUuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUXVlcnlpbmcgdGhlIFByb2ZpbGUgU2VydmVyIj4NCisJPHA+VG8gcXVlcnkgYSBwcm9maWxlIHNlcnZlciwgeW91IHVzZSB0aGUNCisJICA8Y29kZT5Qcm9maWxlQ2xpZW50PC9jb2RlPiBjbGFzcy4gIEl0IHByb3ZpZGVzIG1ldGhvZHMgdG8NCisJICBjb250YWN0IGEgbmFtZWQgcHJvZmlsZSBzZXJ2ZXIsIHBlcmZvcm1pbmcgdGhlIGxvb2t1cCBpbiB0aGUNCisJICBSTUkgcmVnaXN0cnksIGNvbnRhY3RpbmcgdGhlIHByb2ZpbGUgc2VydmVyLCBhbmQgcGFzc2luZyBpbg0KKwkgIHF1ZXJpZXMgYW5kIHByb2ZpbGUgcmV0cmlldmFscy4gIFRoZQ0KKwkgIDxjb2RlPlByb2ZpbGVDbGllbnQ8L2NvZGU+IGNsYXNzIGlzIGFsc28gYW4NCisJICA8ZW0+ZXhlY3V0YWJsZTwvZW0+IGNsYXNzLCBtYWtpbmcgaXQgcGVyZmVjdCBmb3IgdGVzdGluZyBhDQorCSAgbmV3IHByb2ZpbGUgc2VydmVyIGZyb20gdGhlIGNvbW1hbmQtbGluZS4NCisJPC9wPg0KKw0KKwk8cD5TdGlsbCwgd2UnbGwgbWFrZSBhIHNjcmlwdCwgY2FsbGVkDQorCSAgPGNvZGU+JFBTX0hPTUUvYmluL3BjPC9jb2RlPiAoZm9yICJwcm9maWxlIGNsaWVudCIpIHRvDQorCSAgZXhlY3V0ZSBpdCwgdGhvdWdoLCB0byBzYXZlIGZyb20gaGF2aW5nIHRvIHR5cGUgaHVnZWx5IGxvbmcNCisJICBKYXZhIGNvbW1hbmQtbGluZXM6DQorCTwvcD4NCisNCisJPHNvdXJjZT4jIS9iaW4vc2gNCitpZiBbICQjIC1uZSAxIF07IHRoZW4NCisgICBlY2hvICJVc2FnZTogYGJhc2VuYW1lICQwYCAmbHQ7cXVlcnktZXhwcmVzc2lvbiZndDsiIDEmZ3Q7JmFtcDsyDQorICAgZXhpdCAxDQorZmkNCitleGVjIGphdmEgLURqYXZhLmV4dC5kaXJzPSRQU19IT01FL2xpYiBcDQorICAgICBqcGwuZWRhLnByb2ZpbGUuUHJvZmlsZUNsaWVudCBcDQorICAgICB1cm46ZWRhOnJtaTpNeVByb2ZpbGVTZXJ2aWNlIFwNCisgICAgICIkMSI8L3NvdXJjZT4NCisNCisJPHA+TWFrZSB0aGlzIHNjcmlwdCBleGVjdXRhYmxlIGFuZCB0aGVuIHJ1biBpdDo8L3A+DQorDQorCTxzb3VyY2U+JSA8Yj5jaG1vZCA3NTUgJFBTX0hPTUUvYmluL3BjPC9iPg0KKyUgPGI+JFBTX0hPTUUvYmluL3BjICJ0ZW1wZXJhdHVyZSA9IDM3IjwvYj4NCitPYmplY3QgY29udGV4dCByZWFkeTsgZGVsZWdhdGluZyB0bzogW2pwbC5lZGEub2JqZWN0LmpuZGkuUk1JQ29udGV4dEBkZWM4YjNdDQorW108L3NvdXJjZT4NCisNCisJPHA+QWx0aG91Z2ggaXQgbWF5IG5vdCBsb29rIHNwZXRhY3VsYXIsIHRoaXMgaXMgYSBzdWNjZXNzIQ0KKwkgIFRoZSB0d28gc3F1YXJlIGJyYWNrZXRzLCA8Y29kZT5bXTwvY29kZT4sIGluZGljYXRlcyB0aGUgbGlzdA0KKwkgIG9mIG1hdGNoaW5nIHByb2ZpbGVzIHRvIG91ciBxdWVyeSBleHByZXNzaW9uLA0KKwkgIDxjb2RlPnRlbXBlcmF0dXJlID0gMzc8L2NvZGU+LiAgSW4gdGhpcyBjYXNlLCB0aGVyZSB3ZXJlIG5vDQorCSAgbWF0Y2hlcywgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnRlZC4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSJDb25jbHVzaW9uIj4NCisgICAgICA8cD5UaGUgTnVsbCBQcm9maWxlIFNlcnZlciBtYWRlIHN1cmUgb3VyIGRldmVsb3BtZW50DQorCWVudmlyb25tZW50IHdvcmtlZCBmcm9tIGVuZCB0byBlbmQgZm9yIGNyZWF0aW5nLCBkZXBsb3lpbmcsIGFuZA0KKwl0ZXN0aW5nIGEgcHJvZmlsZSBoYW5kbGVyLiAgTm93IHlvdSdyZSByZWFkeSB0byBpbXBsZW1lbnQgYSByZWFsDQorCXByb2ZpbGUgaGFuZGxlcjoNCisgICAgICA8L3A+DQorDQorICAgICAgPHVsPg0KKwk8bGk+SW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCwgY3JlYXRlIGENCisJICAgIDxjb2RlPlByb2ZpbGU8L2NvZGU+IG9iamVjdCBhbmQgcmV0dXJuIGl0IGFzIGENCisJICAgIHNpbmdsZXRvbiBsaXN0LiAgU2VlIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3INCisJICAgIDxjb2RlPlByb2ZpbGU8L2NvZGU+IGFzIHdlbGwgYXMgb3RoZXIgYXJ0aWNsZXMNCisJICAgIGZvciBtYW5pcHVsYXRpbmcgdGhpcyBjbGFzcy4NCisJPC9saT4NCisJPGxpPkFuYWx5emUgdGhlIG1ldGhvZHMgb2YgdGhlDQorCSAgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGNsYXNzIHRvIGRldGVybWluZSB0aGUNCisJICBxdWVyeSBwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4gIFVzZSB0aGF0IGluZm9ybWF0aW9uIHRvDQorCSAgc3ludGhlc2l6ZSB0aGUgY29ycmVjdCA8Y29kZT5Qcm9maWxlPC9jb2RlPg0KKwkgIG9iamVjdC4gIFNlZSB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIGNsYXNzDQorCSAgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKwk8L2xpPg0KKwk8bGk+Q29ubmVjdGluZyB0byBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSAoc3VjaCBhcyB0aGUNCisJICAgIGxvY2FsIGZpbGVzeXN0ZW0gb3IgYSBkYXRhYmFzZSksIHN5bnRoZXNpemUgYXBwcm9wcmlhdGUNCisJICBwcm9maWxlcyBpbiByZXNwb25zZSB0byBxdWVyaWVzIGFuZCBwcm9maWxlIHJldHJpZXZhbCB3aXRoDQorCSAgdGhlIDxjb2RlPmdldDwvY29kZT4gbWV0aG9kLg0KKwk8L2xpPg0KKyAgICAgIDwvdWw+DQorICAgIDwvc2VjdGlvbj4NCisgIDwvYm9keT4NCis8L2RvY3VtZW50Pg0KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL2luZm8vaW5kZXgueG1sIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3hkb2MvaW5mby9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmU0NGMxZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL2luZm8vaW5kZXgueG1sCkBAIC0wLDAgKzEsODQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3INCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3INCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzDQorZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90DQordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mDQordGhlIExpY2Vuc2UgYXQNCisNCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUDQorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQ0KK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyDQordGhlIExpY2Vuc2UuDQorLS0+DQorPGRvY3VtZW50Pg0KKyAgPHByb3BlcnRpZXM+DQorICAgIDx0aXRsZT5JbmZvcm1hdGlvbiBDYXB0dXJlZCBpbiBhIFByb2ZpbGU8L3RpdGxlPg0KKyAgICA8YXV0aG9yIGVtYWlsPSJTZWFuLktlbGx5QGpwbC5uYXNhLmdvdiI+U2VhbiBLZWxseTwvYXV0aG9yPg0KKyAgPC9wcm9wZXJ0aWVzPg0KKyAgPCEtLSBJbmZlY3RlZCBNdXNocm9vbSAtIERlZXBseSBEaXN0dXJiZWQgLS0+DQorICA8Ym9keT4NCisgICAgPHNlY3Rpb24gbmFtZT0iSW5mb3JtYXRpb24gQ2FwdHVyZWQgaW4gYSBQcm9maWxlIj4NCisNCisgICAgICA8cD5BIHByb2ZpbGUgc2VydmVzIGFzIGEgZ2VuZXJpYyB0ZW1wbGF0ZSBmb3IgZGVzY3JpYmluZyB0aGUNCisJY2hhcmFjdGVyaXN0aWNzIG9mIGEgcmVzb3VyY2UuIFRoZSBxdWVzdGlvbiBwb3NlZCB0byBhIHByb2ZpbGUNCisJZ2VuZXJhbGx5IHRha2VzIHRoZSBmb3JtIG9mLCAiQ2FuIHlvdSBhbnN3ZXIgPHZhcj5YPC92YXI+PyIgb3INCisJIkRvIHlvdSBrbm93IHRoZSBsb2NhdGlvbiBvZiA8dmFyPlg8L3Zhcj4/IiB3aGVyZSA8dmFyPlg8L3Zhcj4NCisJaXMgc29tZSByZXNvdXJjZSBiZWluZyBzb3VnaHQuIFRoZSBtb3JlIGZ1bGx5IGEgcHJvZmlsZSBkZXNjcmliZXMNCisJYSBwYXJ0aWN1bGFyIHJlc291cmNlLCB0aGUgYmV0dGVyIHRoZSBwcm9maWxlIGNhbiBiZSB1c2VkIHRvDQorCWRldGVybWluZSBpZiB0aGUgcmVzb3VyY2UgaGFzIHRoZSBpbmZvcm1hdGlvbiBpbiA8dmFyPlg8L3Zhcj4uDQorICAgICAgPC9wPg0KKw0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IkluZm9ybWF0aW9uIGFuZCBPcmdhbml6YXRpb24iPg0KKyAgICAgIDxwPlByb2ZpbGUgc2VydmVycyBjYXB0dXJlIHRocmVlIGtpbmRzIG9mIGluZm9ybWF0aW9uOjwvcD4NCisNCisgICAgICA8dWw+DQorCTxsaT48Yj5SZXNvdXJjZSBBdHRyaWJ1dGVzPC9iPiA8cD5SZXNvdXJjZSBhdHRyaWJ1dGVzIGFyZQ0KKwkgIG1ldGFkYXRhIGFib3V0IHRoZSByZXNvdXJjZSdzIDxlbT5pbmNlcHRpb248L2VtPi4gIFRoZXNlDQorCSAgYXR0cmlidXRlcyBpbmNsdWRlIHRoZSBjcmVhdG9yIG9mIHRoZSByZXNvdXJjZSwgaW4gd2hhdA0KKwkgIGxhbmd1YWdlIGl0IGV4aXN0cywgd2hlbiBpdCB3YXMgY3JlYXRlZCwgYW5kIHNvIGZvcnRoLg0KKwkgIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIGJhc2VkIG9uIHRoZSB3b3JrIG9mIHRoZSA8YQ0KKwkgIGhyZWY9Imh0dHA6Ly93d3cuZG1jaS5vcmcvIj5EdWJsaW4gQ29yZSBNZXRhZGF0YSBJbml0aWF0aXZlPC9hPi4NCisJICA8L3A+DQorCTwvbGk+DQorDQorCTxsaT48Yj5Qcm9maWxlIEVsZW1lbnRzPC9iPiA8cD5Qcm9maWxlIGVsZW1lbnRzIGFyZSBtZXRhZGF0YQ0KKwkgICAgYWJvdXQgdGhlIHJlc291cmNlJ3MgPGVtPmNvbXBvc2l0aW9uPC9lbT4uICBUaGVzZSB0ZWxsIHlvdQ0KKwkgICAgYWJvdXQgdGhlIG1vcnBob2xvZ3kgb2YgdGhlIHJlc291cmNlLCBzdWNoIGFzIGRhdGEgdHlwZXMNCisJICAgIGNhcHR1cmVkIHdpdGhpbiBpbiwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMsIHN5bm9ueW1vdXMNCisJICAgIGVsZW1lbnRzLCBhbmQgc28gZm9ydGguICBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBiYXNlZCBvbiA8YQ0KKwkgICAgaHJlZj0iaHR0cDovL21ldGFkYXRhLXN0YW5kYXJkcy5vcmcvMTExNzkvIj5JU08vSUVDIDExMTc5DQorCSAgICBzdGFuZGFyZHM8L2E+Lg0KKwkgIDwvcD4NCisJPC9saT4NCisNCisJPGxpPjxiPlByb2ZpbGUgQXR0cmlidXRlczwvYj4gPHA+UHJvZmlsZSBhdHRyaWJ1dGVzIGFyZQ0KKwkgICAgbWV0YWRhdGEgYWJvdXQgdGhlIDxlbT5wcm9maWxlIGl0c2VsZjwvZW0+LCBzdWNoIGFzIHdobw0KKwkgICAgbWFkZSBpdCwgd2hldGhlciBpdCdzIGNsYXNzaWZpZWQsIHJldmlzaW9uIG5vdGVzLCBhbmQgc28NCisJICAgIGZvcnRoLiAgSXQgYWxzbyBoYXMgYSB1bmlxdWUgaWRlbnRpZnlpbmcgPGENCisJICAgIGhyZWY9Imh0dHA6Ly93d3cuYWx2ZXN0cmFuZC5uby9vYmplY3RpZC9pbmRleC5odG1sIj5PYmplY3QNCisJICAgIElkZW50aWZpZXIgKE9JRCk8L2E+Lg0KKwkgIDwvcD4NCisJPC9saT4NCisgICAgICA8L3VsPg0KKw0KKyAgICAgIDxwPlRoZSBmb2xsb3dpbmcgY2xhc3MgZGlhZ3JhbSBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4NCisJdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiBhIHByb2ZpbGU6DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvY2xhc3MucG5nIiBhbHQ9IkNsYXNzIGRpYWdyYW0iLz4NCisNCisgICAgICA8cD5XaGlsZSB0aGlzIGRpYWdyYW0gc2hvd3MgdGhlIEphdmEgZmllbGQgbmFtZXMgYW5kIEphdmENCisJY2xhc3NlcywgdGhlIHJlbGF0aW9uc2hpcCBhcHBsaWVzIHRvIHByb2ZpbGVzIHdoZXRoZXIgdGhleQ0KKwlleGlzdCBhcyBKYXZhIG9iamVjdHMsIGFzIFJERiBkb2N1bWVudHMsIG9yIGFzIFhNTCBkb2N1bWVudHMNCisJaW4gdGhlIHByb2ZpbGUgdm9jYWJ1bGFyeS4NCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iSW5jZXB0aW9uIE1ldGFkYXRhIj4NCisgICAgICA8cD5Qcm9maWxlcywgd2hldGhlciBleHByZXNzZWQgaW4gUkRGIG9yIGluIHRoZWlyIG93biBYTUwNCisJdm9jYWJ1bGFyeSwgaGF2ZSBhIHNlY3Rpb24gZm9yIGNhcHR1cmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUNCisJcmVzb3VyY2UncyBpbmNlcHRpb24uICBUaGlzIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gdGhlDQorCXJlc291cmNlIHdhcyBjcmVhdGVkLCB3aG8gY3JlYXRlZCBpdCwgaW4gd2hhdCBsYW5ndWFnZSBpdA0KKwlleGlzdHMsIGFuZCBzbyBmb3J0aC4gIFByb2ZpbGVzIHVzZSB0aGUgZWxlbWVudCBzZXQgcmVjb21tZW5kZWQNCisJYnkgdGhlIER1YmxpbiBDb3JlIE1ldGFkYXRhIEluaXRpYXRpdmUgKERDTUkpIHNldCBpbiBvcmRlciB0bw0KKwlkZXNjcmliZSB0aGUgaW5jZXB0aW9uIG9mIGEgcmVzb3VyY2UsIHdpdGggc29tZSBleHRlbnNpb25zLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5Db2xsZWN0aXZlbHksIHRoZXNlIG1ldGFkYXRhIGFyZSBjYWxsZWQgdGhlIDxpPnJlc291cmNlDQorCWF0dHJpYnV0ZXM8L2k+IG9yIDxjb2RlPnJlc0F0dHJpYnV0ZXM8L2NvZGU+IG9mIHRoZSBwcm9maWxlLg0KKwlFdmVyeSBwcm9maWxlIGhhcyBvbmUgYW5kIG9ubHkgb25lIHNldCBvZg0KKwk8Y29kZT5yZXNBdHRyaWJ1dGVzPC9jb2RlPi4gIFRoZSBtZXRhZGF0YSBlbGVtZW50cyB3aXRoaW4gdGhlDQorCTxjb2RlPnJlc0F0dHJpYnV0ZXM8L2NvZGU+IGFyZSBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4NCisgICAgICA8L3A+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSWRlbnRpZmllciI+DQorCTxwPkFzIGRlZmluZWQgYnkgdGhlIERDTUksIHRoZSA8Y29kZT5JZGVudGlmaWVyPC9jb2RlPiBvZiBhDQorCSAgcmVzb3VyY2UgaXMgc29tZSB1bmFtYmlndW91cyB3YXkgdG8gaWRlbnRpZnkgdGhlIHJlc291cmNlLg0KKwkgIEluIHRoZSBwcm9maWxlIGltcGxlbWVudGF0aW9uLCBvbmUgYW5kIG9ubHkgb25lDQorCSAgPGNvZGU+SWRlbnRpZmllcjwvY29kZT4gaXMgPHNwYW4NCisJICBjbGFzcz0iZW1waGFzaXMiPjxlbT5yZXF1aXJlZDwvZW0+PC9zcGFuPi4NCisJPC9wPg0KKw0KKwk8cD5JdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IDxjb2RlPklkZW50aWZpZXI8L2NvZGU+cyBhbmQNCisJICA8Y29kZT5yZXNMb2NhdGlvbjwvY29kZT5zIChzZWUgYmVsb3cpIGJlIFVSSXMsIGJ1dCB0aGVyZSdzDQorCSAgbm8gc29mdHdhcmUgZW5mb3JjbWVudCBmb3IgdGhpcyA8ZW0+dW5sZXNzIHlvdSBjb252ZXJ0IGENCisJICBKYXZhIHByb2ZpbGUgdG8gUkRGPC9lbT4gd2l0aCB0aGUgPGNvZGU+dG9SREY8L2NvZGU+IG1ldGhvZC4NCisJICBJZGVudGlmaWVycyBzaG91bGQgYmUgbW9yZSBsaWtlIFVSTnMsIHdoaWxlIHJlc0xvY2F0aW9ucw0KKwkgIHNob3VsZCBiZSBtb3JlIGxpa2UgVVJMcy4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUaXRsZSI+DQorCTxwPlRoZSA8Y29kZT5UaXRsZTwvY29kZT4gbmFtZXMgdGhlIHJlc291cmNlLCBhbmQgaXMgdGhlIG5hbWUgYnkNCisJICB3aGljaCB0aGUgcmVzb3VyY2UgaXMgZm9ybWFsbHkga25vd24uICBUaGUgPGNvZGU+VGl0bGU8L2NvZGU+IGlzDQorCSAgb3B0aW9uYWw7IGlmIHByZXNlbnQsIGl0IG1heSBvY2N1ciBvbmx5IG9uY2UgaW4gYSBwcm9maWxlLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkZvcm1hdCI+DQorCTxwPlRoZSA8Y29kZT5Gb3JtYXQ8L2NvZGU+IGluZGljYXRlcyB0aGUgbWFuaWZlc3RhdGlvbiBvZiB0aGUNCisJICByZXNvdXJjZS4gIFlvdSBjYW4gc3BlY2lmeSBhbnkgbnVtYmVyIG9mIDxjb2RlPkZvcm1hdDwvY29kZT5zIGluDQorCSAgYSBwcm9maWxlLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRlc2NyaXB0aW9uIj4NCisJPHA+VGhlIDxjb2RlPkRlc2NyaXB0aW9uPC9jb2RlPiBlbGVtZW50IGNvbnRhaW5zIGEgZnJlZSB0ZXh0DQorCSAgYWNjb3VudCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBJdCdzIG9wdGlvbmFsIGluIGENCisJICBwcm9maWxlOyBpZiBwcmVzZW50LCBpdCBtYXkgb2NjdXIgb25seSBvbmNlLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNyZWF0b3IiPg0KKwk8cD5aZXJvIG9yIG1vcmUgPGNvZGU+Q3JlYXRvcjwvY29kZT5zIG1heSBiZSBzcGVjaWZpZWQgaW4gYQ0KKwkgIHByb2ZpbGUuICA8Y29kZT5DcmVhdG9yPC9jb2RlPnMgY29udGFpbiB0aGUgbmFtZSBvZiBwZW9wbGUgb3INCisJICBvcmdhbml6YXRpb25zIHRoYXQgY3JlYXRlZCB0aGUgcmVzb3VyY2UuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU3ViamVjdCI+DQorCTxwPllvdSBjYW4gbGlzdCB6ZXJvIG9yIG1vcmUgPGNvZGU+U3ViamVjdDwvY29kZT5zIGluIGEgcHJvZmlsZS4NCisJICBUaGUgcHVycG9zZSBvZiB0aGUgPGNvZGU+U3ViamVjdDwvY29kZT4gZWxlbWVudHMgaXMgdG8gY29udGFpbiBhDQorCSAga2V5d29yZHMgdGhhdCBkZXNjcmliZSB0aGUgcmVzb3VyY2UsIHVzdWFsbHkgc2VsZWN0ZWQgZnJvbSBhDQorCSAgY29udHJvbGxlZCB2b2NhYnVsYXJ5Lg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlB1Ymxpc2hlciI+DQorCTxwPkFueSBudW1iZXIgb2YgPGNvZGU+UHVibGlzaGVyPC9jb2RlPiBlbGVtZW50cyBtYXkgYXBwZWFyIGluIGENCisJICBwcm9maWxlLiAgVGhleSBjb250YWluIHRoZSBvcmdhbml6YXRpb24gcmVzcG9uc2libGUgZm9yDQorCSAgbWFraW5nIHRoZSByZXNvdXJjZSBhdmFpbGFibGUuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udHJpYnV0b3IiPg0KKwk8cD5BIDxjb2RlPkNvbnRyaWJ1dG9yPC9jb2RlPiBpcyBhIHBlcnNvbiBvciBvcmdhbml6YXRpb24NCisJICBwcm92aWRpbmcgYXV4aWxsaWFyeSB3b3JrIHRvd2FyZHMgdGhlIHJlc291cmNlJ3MgY3JlYXRpb24uDQorCSAgQW55IG51bWJlciBvZiA8Y29kZT5Db250cmlidXRvcjwvY29kZT5zIG1heSBiZSBsaXN0ZWQgaW4gYQ0KKwkgIHByb2ZpbGUuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRGF0ZSI+DQorCTxwPjxjb2RlPkRhdGU8L2NvZGU+IGVsZW1lbnRzIGluZGljYXRlIHRoZSB0aW1lcyBpbiBoaXN0b3J5IHdoZW4NCisJICB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuICBZb3UgY2FuIGluY2x1ZGUgYW55IG51bWJlciBvZg0KKwkgIDxjb2RlPkRhdGU8L2NvZGU+cyBpbiBhIHByb2ZpbGUsIGFsdGhvdWdoIHR5cGljYWxseSB5b3UnbGwNCisJICBzcGVjaWZ5IGp1c3Qgb25lIGlmIHlvdSBzcGVjaXkgYW55IGF0IGFsbC4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUeXBlIj4NCisJPHA+VGhlIDxjb2RlPlR5cGU8L2NvZGU+IGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBuYXR1cmUgb2YgdGhlDQorCSAgY29udGVudCBvZiB0aGUgcmVzb3VyY2UsIHN1Y2ggYXMgImZpY3Rpb24iIGZvciBhIHdvcmsgb2YNCisJICBmaWN0aW9uIG9yICJpbWFnZSIgZm9yIGEgZGF0YXNldCByZW5kZXJlZCBncmFwaGljYWxseS4gIFlvdQ0KKwkgIGNhbiBpbmNsdWRlIGFueSBudW1iZXIgb2YgPGNvZGU+VHlwZTwvY29kZT5zIGluIGEgcHJvZmlsZS4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJTb3VyY2UiPg0KKwk8cD5XaGVuIGEgcmVzb3VyY2UgaXMgZGVyaXZlZCBvdGhlcnMsIHRoZSA8Y29kZT5Tb3VyY2U8L2NvZGU+DQorCSAgZWxlbWVudCBzaG91bGQgaW5kaWNhdGUgdGhlIDxjb2RlPklkZW50aWZpZXI8L2NvZGU+cyBvZiB0aGUNCisJICByZWZlcmVuY2VkIHJlc291cmNlcy4gIFlvdSBjYW4gc3BlY2lmeSBhbnkgbnVtYmVyIG9mDQorCSAgPGNvZGU+U291cmNlPC9jb2RlPnMgaW4gYSBwcm9maWxlLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ikxhbmd1YWdlIj4NCisJPHA+Rm9yIHJlc291cmNlcyB0aGF0IGNvbnRhaW4gbmF0dXJhbCBsYW5ndWFnZSBjb250ZW50LCB0aGUNCisJICA8Y29kZT5MYW5ndWFnZTwvY29kZT4gZWxlbWVudCBpbmRpY2F0ZXMgdGhlIGxhbmd1YWdlcyBpbiB1c2UuDQorCSAgWW91IGNhbiBzcGVjaWZ5IHRoaXMgZWxlbWVudCBhbnkgbnVtYmVyIG9mIHRpbWVzIGluIGENCisJICBwcm9maWxlLg0KKyAgICAgIAk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlJlbGF0aW9uIj4NCisJPHA+V2hlbiBhIHJlc291cmNlIGlzIHJlbGF0ZWQgdG8gb3RoZXJzLCB5b3UgY2FuIHNwZWNpZnkgdGhlDQorCSAgPGNvZGU+SWRlbnRpZmllcjwvY29kZT5zIG9mIHRoZSByZWxhdGVkIHJlc291cmNlcyB1c2luZyB6ZXJvIG9yDQorCSAgbW9yZSA8Y29kZT5SZWxhdGlvbjwvY29kZT4gZWxlbWVudHMuDQorICAgICAgCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ292ZXJhZ2UiPg0KKwk8cD5Gb3IgcmVzb3VyY2VzIHRoYXQgY292ZXIgYSBzcGFjZSBvciB0aW1lIG9yIGp1cmlzZGljdGlvbiwNCisJICB1c2UgdGhlIDxjb2RlPkNvdmVyYWdlPC9jb2RlPiBlbGVtZW50IHRvIGluZGljYXRlIHN1Y2ggY292ZXJhZ2UuDQorCSAgVGhpcyBlbGVtZW50IG1heSBiZSBsaXN0ZWQgYW55IG51bWJlciBvZiB0aW1lcyBpbiBhIHByb2ZpbGUsDQorCSAgYW5kIGl0cyBjb250ZW50IHNob3VsZCBjb21lIGZyb20gYSBjb250cm9sbGVkIHZvY2FidWxhcnkuDQorCSAgRm9yIHJlc291cmNlcyB3aXRoIHNwZWNpZmljIGNvb3JkaW5hdGUgc3lzdGVtcywgaXQncyBiZXR0ZXINCisJICB0byB1c2UgcHJvZmlsZSBlbGVtZW50cywgZGVzY3JpYmVkIGJlbG93Lg0KKyAgICAgIAk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlJpZ2h0cyI+DQorCTxwPkNvcHlyaWdodCwgb3duZXJzaGlwLCByZWRpc3RyaWJ1dGlvbiwgdXNlLCBhbmQgb3RoZXIgbGVnYWwNCisJICBpc3N1ZXMgbWF5IGV4aXN0IGZvciBhIHJlc291cmNlLiAgV2hlbiB0aGF0IGhhcHBlbnMsIHVzZSB0aGUNCisJICA8Y29kZT5SaWdodHM8L2NvZGU+IGVsZW1lbnQgdG8gbGlzdCB0aGUgcmlnaHRzIG1hbmFnZW1lbnQNCisJICBpbmZvcm1hdGlvbi4gIFlvdSBjYW4gbGlzdCB6ZXJvIG9yIG1vcmUgPGNvZGU+UmlnaHRzPC9jb2RlPg0KKwkgIGVsZW1lbnRzIGluIGEgcHJvZmlsZS4NCisJPC9wPg0KKwk8cD48ZW0+Tm90ZTo8L2VtPiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiBlbGVtZW50IGZvciBpcyBwbHVyYWwNCisJICA8Y29kZT5SaWdodHM8L2NvZGU+OyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlcg0KKwkgIG1ldGFkYXRhIGVsZW1lbnRzLCBidXQgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBEQ01JLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InJlc0NvbnRleHQiPg0KKwk8cD5UaGUgPGNvZGU+cmVzQ29udGV4dDwvY29kZT4gZWxlbWVudCBpZGVudGlmaWVzIHRoZSBhcHBsaWNhdGlvbg0KKwkgIGVudmlyb25tZW50IG9yIGRpc2NpcGxpbmUgd2l0aGluIHdoaWNoIHRoZSByZXNvdXJjZQ0KKwkgIG9yaWdpbmF0ZXMgYW5kIGlzIGRlcml2ZWQgZnJvbSBhIHRheG9ub215IG9mIHNjaWVudGlmaWMNCisJICBkaXNjaXBsaW5lcy4gIFRoaXMgZWxlbWVudCBpcyByZXF1aXJlZCBpbiBhIHByb2ZpbGUgYW5kIG1heQ0KKwkgIG9jY3VyIG11bHRpcGxlIHRpbWVzLg0KKwk8L3A+DQorDQorCTxwPkFzIGFuIGV4YW1wbGUsIGEgPGNvZGU+cmVzQ29udGV4dDwvY29kZT4gb2YNCisJICA8Y29kZT5OQVNBLlBEUy5HZW9zY2llbmNlPC9jb2RlPiB0ZWxscyB0aGF0IHRoZSByZXNvdXJjZSBpcw0KKwkgIGFzc29jaWF0ZWQgd2l0aCB0aGUgR2Vvc2NpZW5jZSBub2RlIG9mIHRoZSBQbGFuZXRhcnkgRGF0YQ0KKwkgIFN5c3RlbS4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJyZXNBZ2dyZWdhdGlvbiI+DQorCTxwPlRoZSA8Y29kZT5yZXNBZ2dyZWdhdGlvbjwvY29kZT4gZWxlbWVudCBpbmRpY2F0ZXMgdGhlDQorCSAgYWdncmVnYXRpdmUgc3RydWN0dXJlIG9mIHRoZSByZXNvdXJjZS4gIEl0IHRlbGxzIHlvdSB3aGF0DQorCSAgeW91J2xsIGdldCBpZiB5b3UgcmV0cmlldmUgdGhlIHJlc291cmNlOiBhIGdyYW51bGUsIGENCisJICBkYXRhc2V0LCBvciBhIGNvbGxlY3Rpb24gb2YgZGF0YXNldHMuICBUaGUgbGVnYWwgdmFsdWVzIG9mDQorCSAgdGhpcyBvcHRpb25hbCBlbGVtZW50cyBhcmU6DQorCTwvcD4NCisNCisJPHVsPg0KKwkgIDxsaT48Y29kZT5ncmFudWxlPC9jb2RlPiwgbWVhbmluZyB0aGUgcmVzb3VyY2UgaXMgYSBzaW5nbGUNCisJICAgIHByb2R1Y3QNCisJICA8L2xpPg0KKwkgIDxsaT48Y29kZT5kYXRhU2V0PC9jb2RlPiwgbWVhbmluZyB0aGUgcmVzb3VyY2UgaXMgYSBzZXQgb2YNCisJICAgIHByb2R1Y3RzDQorCSAgPC9saT4NCisJICANCisJICA8bGk+PGNvZGU+ZGF0YVNldENvbGxlY3Rpb248L2NvZGU+LCBtZWFuaW5nIHRoZSByZXNvdXJjZSBpcw0KKwkgICAgY29sbGVjdGlvbiBvZiBkYXRhc2V0cw0KKwkgIDwvbGk+DQorCTwvdWw+DQorDQorCTxwPlRoZSA8Y29kZT5yZXNBZ2dyZWdhdGlvbjwvY29kZT4gZWxlbWVudCBpcyBvcHRpb25hbDsgaG93ZXZlciwNCisJICBpZiBzcGVjaWZpZWQsIGl0IG1heSBhcHBlYXIgaW4gYSBwcm9maWxlIG9ubHkgb25jZS4NCisgICAgICAJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJyZXNDbGFzcyI+DQorCTxwPlRoZSA8Y29kZT5yZXNDbGFzczwvY29kZT4gZWxlbWVudCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIHRoZQ0KKwkgIHJlc291cmNlIHdpdGhpbiBhIHRheG9ub215IG9mIHJlc291cmNlIHR5cGVzLiAgSXQncyBhDQorCSAgPGVtPnJlcXVpcmVkPC9lbT4gZWxlbWVudCB0aGF0IGlzIHVzZWQgYnkgdGhlIE9PRFQgRnJhbWV3b3JrDQorCSAgdG8gZGV0ZXJtaW5lIGhvdyB0byB0cmVhdCB0aGUgcHJvZmlsZSBhcyB3ZWxsIGFzIHRoZQ0KKwkgIHJlc291cmNlIG5hbWVkIGJ5IHRoZSBwcm9maWxlLg0KKwk8L3A+DQorDQorCTxwPkZvciBleGFtcGxlLCBhIDxjb2RlPnJlc0NsYXNzPC9jb2RlPiBvZg0KKwkgIDxjb2RlPnN5c3RlbS5wcm9kdWN0U2VydmVyPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzb3VyY2UgaXMNCisJICBhbiBPT0RUIHByb2R1Y3Qgc2VydmVyLiAgQSBxdWVyeSB0aGF0IG1hdGNoZXMgdGhpcyBwcm9maWxlDQorCSAgbWVhbnMgdGhhdCBpZiB0aGUgc2FtZSBxdWVyeSB3ZXJlIGdpdmVuIHRvIHRoZSBpZGVudGlmaWVkDQorCSAgcHJvZHVjdCBzZXJ2ZXIsIGl0IHdvdWxkIHlpZWxkIGEgcmVzdWx0LiAgQQ0KKwkgIDxjb2RlPnJlc0NsYXNzPC9jb2RlPiBvZiA8Y29kZT5zeXN0ZW0ucHJvZmlsZVNlcnZlcjwvY29kZT4gbWVhbnMgdGhlDQorCSAgcmVzb3VyY2UgaXMgYSBwcm9maWxlIHNlcnZlci4gIFRoYXQgbWVhbnMgdGhhdCB3aGlsZSB0aGUNCisJICBjdXJyZW50IHByb2ZpbGUgc2VydmVyIG1heSBvciBtYXkgbm90IHByb3ZpZGUgYSBtYXRjaGluZw0KKwkgIHByb2ZpbGUsIGFub3RoZXIgcHJvZmlsZSBzZXJ2ZXIgbWlnaHQsIGZvcm1pbmcgYW4gaW1wbGljaXQNCisJICBkaWdyYXBoIG9mIHByb2ZpbGUgc2VydmVycy4gIE90aGVyIHZhbGlkIDxjb2RlPnJlc0NsYXNzPC9jb2RlPg0KKwkgIHZhbHVlcyBpbmNsdWRlIDxjb2RlPmRhdGEuZ3JhbnVsZTwvY29kZT4sIDxjb2RlPmRhdGEuZGF0YVNldDwvY29kZT4sDQorCSAgYW5kIDxjb2RlPmFwcGxpY2F0aW9uLmludGVyZmFjZTwvY29kZT4uDQorICAgICAgCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0icmVzTG9jYXRpb24iPg0KKwk8cD5aZXJvIG9yIG1vcmUgPGNvZGU+cmVzTG9jYXRpb248L2NvZGU+IGVsZW1lbnRzIG1heSBhcHBlYXIgaW4NCisJICBhIHByb2ZpbGUuICBUaGV5IHRlbGwgd2hlcmUgdGhlIHJlc291cmNlIGlzIGxvY2F0ZWQsIGVhc2lseQ0KKwkgIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBwcm9maWxlLiAgQmVjYXVzZSB0aGlzDQorCSAgZWxlbWVudCBtYXkgYXBwZWFyIHNldmVyYWwgdGltZXMsIGFsbCBsb2NhdGlvbnMgc2hvdWxkIGJlDQorCSAgY29uc2lkZXJlZCB2YWxpZDsgdGhlIGFwcGxpY2F0aW9uIG1heSBwaWNrIHRoZSBvbmUgdGhhdCdzDQorCSAgbW9zdCBjb252ZW5pZW50LiAgVGhlIDxjb2RlPnJlc0xvY2F0aW9uPC9jb2RlPiBtYXkgYWxzbyBhcHBlYXIgemVybw0KKwkgIHRpbWVzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBwcm9maWxlIGluZGljYXRlcyBzb2xlbHkgdGhhdA0KKwkgIHRoZSByZXNvdXJjZSBleGlzdHN3aGVyZSBpcyB1bmtub3duLg0KKwk8L3A+DQorDQorCTxwPlRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzTG9jYXRpb24gaXMgYXMgYSBVUkkuICBGb3INCisJICBleGFtcGxlLCBhIDxjb2RlPnJlc0NsYXNzPC9jb2RlPiBvZg0KKwkgIDxjb2RlPnN5c3RlbS5wcm9kdWN0U2VydmVyPC9jb2RlPiBvcg0KKwkgIDxjb2RlPnN5c3RlbS5wcm9maWxlU2VydmVyPC9jb2RlPiBtZWFucyB0aGF0IHRoZQ0KKwkgIDxjb2RlPnJlc0xvY2F0aW9uPC9jb2RlPiBpbmRpY2F0ZXMgYW4gVVJOIHRvIGEgc29mdHdhcmUgb2JqZWN0DQorCSAgbmFtZS4gIFF1ZXJ5aW5nIHRoYXQgb2JqZWN0IHdpbGwgeWllbGQgZWl0aGVyIHRoZSBkZXNpcmVkDQorCSAgcmVzdWx0IChmb3IgcHJvZHVjdCBzZXJ2ZXJzKSBvciBtb3JlIG1hdGNoaW5nIHByb2ZpbGVzIChmb3INCisJICBwcm9maWxlIHNlcnZlcnMpLiAgRm9yIGEgcmVzQ2xhc3Mgb2YgPGNvZGU+ZGF0YS5ncmFudWxlPC9jb2RlPg0KKwkgIG9yIDxjb2RlPmRhdGEuZGF0YVNldDwvY29kZT4sIHRoZSA8Y29kZT5yZXNMb2NhdGlvbjwvY29kZT4gaXMgYW4gVVJMDQorCSAgdG8gdGhlIGdyYW51bGUgb3IgZGF0YXNldC4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSJDb21wb3NpdGlvbiBNZXRhZGF0YSI+DQorICAgICAgPHA+VGhlIG1vc3QgaW50ZXJlc3RpbmcgcGFydCBvZiBhIHByb2ZpbGUgaXMgaW4gdGhlIG1ldGFkYXRhDQorCXRoYXQgZGVzY3JpYmVzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCB0aGUNCisJcHJvZmlsZSBwcm9maWxlcy4gIFRoZSBjb21wb3NpdGlvbiBtZXRhZGF0YSBpcyB3aGF0IGVuYWJsZXMgYQ0KKwlwcm9maWxlIHNlcnZlciB0byB0ZWxsIGlmIGEgcGFydGljdWxhciByZXNvdXJjZSBjYW4gYW5zd2VyIGENCisJcXVlcnkuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPlRoZSBjb21wb3NpdGlvbiBtZXRhZGF0YSBpcyBiYXNlZCBvbiB0aGUgZGF0YSBlbGVtZW50DQorCWRlc2NyaXB0aW9uIHN0YW5kYXJkcyBpbiBJU08vSUVDIHN0YW5kYXJkIDExMTc5LiAgVGhleSBhcmUgdGhlDQorCTxpPnByb2ZpbGUgZWxlbWVudHM8L2k+IG9yIDxjb2RlPnByb2ZFbGVtZW50PC9jb2RlPnMgb2YgYSBwcm9maWxlLg0KKwlFdmVyeSBwcm9maWxlIG1heSBoYXZlIHplcm8gb3IgbW9yZSA8Y29kZT5wcm9mRWxlbWVudDwvY29kZT5zLCB0aGUNCisJY29tcG9uZW50cyBvZiB3aGljaCBhcmUgZGlzY3Vzc2VkIGluIHRoaXMgc2VjdGlvbi4NCisgICAgICA8L3A+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iZWxlbUlkIj4NCisJPHA+VGhlIDxjb2RlPmVsZW1JZDwvY29kZT4gaXMgYW4gb3B0aW9uYWwgdW5pdmVyc2FsbHkgdW5pcXVlDQorCSAgaWRlbnRpZmllciBhcHBsaWVkIHRvIHRoZSBlbGVtZW50Lg0KKyAgICAgIAk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9ImVsZW1OYW1lIj4NCisJPHA+VGhlIDxjb2RlPmVsZW1OYW1lPC9jb2RlPiBpcyB0aGUgPGVtPnJlcXVpcmVkPC9lbT4gbmFtZSBvZiB0aGUNCisJICBwcm9maWxlIGVsZW1lbnQuICBJdCBzZXJ2ZXMgYXMgdGhlIHRpdGxlIHJvbGUgb2Ygb25lIG9mIHRoZQ0KKwkgIGNvbXBvbmVudHMgb2YgdGhlIHJlc291cmNlLg0KKyAgICAgIAk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9ImVsZW1EZXNjIj4NCisJPHA+VGhlIDxjb2RlPmVsZW1EZXNjPC9jb2RlPiBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHByb2ZpbGUNCisJICBlbGVtZW50LiAgQWx0aG91Z2ggdGhlIHRpdGxlIG1heSBvZnRlbiBiZSBlbm91Z2ggdG8gaWRlbnRpZnkNCisJICB0aGUgcHVycG9zZSBvZiB0aGUgcHJvZmlsZSBlbGVtZW50LCB0aGUgZGVzY3JpcHRpb24gc2hvdWxkDQorCSAgYmUgdXNlZCB0byBwcm92aWRlIGFueSBmdXJ0aGVyLCBmcmVlLXRleHQgaW5mb3JtYXRpb24gdGhhdA0KKwkgIG1heSBiZSBvZiBpbXBvcnRhbmNlIHRvIGFuYWx5c3RzIGFuZCBwcm9maWxlIGFkbWluaXN0cmF0b3JzLg0KKwkgIFRoZSBkZXNjcmlwdGlvbiBpcyBvcHRpb25hbC4NCisgICAgICAJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJlbGVtVHlwZSI+DQorCTxwPlRoZSA8Y29kZT5lbGVtVHlwZTwvY29kZT4gaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRhdGENCisJICByZXByZXNlbnRlZCBpbiB0aGUgcHJvZmlsZSBlbGVtZW50LCBzeW5vbnltb3VzIHRvIHRoZQ0KKwkgIElTTy9JRUMgMTExNzkgPGNvZGU+RGF0YXR5cGU8L2NvZGU+IGF0dHJpYnV0ZS4gIFRoZSBwZXJtaXNzaWJsZQ0KKwkgIHZhbHVlcyBhcmU6DQorCTwvcD4NCisNCisJPHVsPg0KKwkgIDxsaT48Y29kZT5ib29sZWFuPC9jb2RlPjwvbGk+DQorCSAgPGxpPjxjb2RlPmNoYXJhY3RlcjwvY29kZT48L2xpPg0KKwkgIDxsaT48Y29kZT5kYXRlX3RpbWU8L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+ZW51bWVyYXRlZDwvY29kZT48L2xpPg0KKwkgIDxsaT48Y29kZT5pbnRlZ2VyPC9jb2RlPjwvbGk+DQorCSAgPGxpPjxjb2RlPm9yZGluYWw8L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+cmF0aW9uYWw8L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+c2NhbGVkPC9jb2RlPjwvbGk+DQorCSAgPGxpPjxjb2RlPnJlYWw8L2NvZGU+PC9saT4NCisJICA8bGk+PGNvZGU+Y29tcGxleDwvY29kZT48L2xpPg0KKwkgIDxsaT48Y29kZT5zdGF0ZTwvY29kZT48L2xpPg0KKwkgIDxsaT48Y29kZT52b2lkPC9jb2RlPjwvbGk+DQorCTwvdWw+DQorDQorCTxwPlRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCB3aXRoaW4gYSBwcm9maWxlIGVsZW1lbnQuICBXaGVuDQorCSAgaXQncyBub3QgcHJlc2VudCwgdGhlIHByb2ZpbGUgZWxlbWVudCBtZXJlbHkgaW5kaWNhdGVzIHRoYXQNCisJICB0aGUgcmVzb3VyY2UncyBjb250ZW50IHBvc3Nlc3NlcyB0aGUgYXR0cmlidXRlLCBidXQgbW9yZSBpcw0KKwkgIG5vdCBrbm93bi4NCisgICAgICAJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJlbGVtVW5pdCI+DQorCTxwPlRoZSA8Y29kZT5lbGVtVW5pdDwvY29kZT4gaW5kaWNhdGVzIHRoZSB1bml0cyBhc3NvY2lhdGVkIHdpdGgNCisJICB0aGUgdmFsdWVzIG9mIHRoZSBkYXRhIGVsZW1lbnQuIFRoaXMgZWxlbWVudCBpcyBzeW5vbnltb3VzDQorCSAgdG8gdGhlIElTTy9JRUMgMTExNzkgYXR0cmlidXRlIDxjb2RlPnVuaXQub2YucXVhbnRpdHk8L2NvZGU+Lg0KKwkgIFZhbHVlcyBmb3IgdGhpcyBvcHRpb25hbCBlbGVtZW50IHNob3VsZCBiZSBzZWxlY3RlZCBmcm9tDQorCSAgc3RhbmRhcmRpemVkIHRhYmxlcyBvZiB1bml0cy4NCisgICAgICAJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJlbGVtRW51bUZsYWcsIGVsZW1WYWx1ZSwgZWxlbU1pblZhbHVlLCBhbmQgZWxlbU1heFZhbHVlIj4NCisJPHA+VGhlIDxjb2RlPmVsZW1FbnVtRmxhZzwvY29kZT4gdGVsbHMgaG93IHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUNCisJICBwcm9maWxlIGVsZW1lbnQgYXJlIHNwZWNpZmllZC4gIEl0IHdvcmtzIHdpdGggdGhlDQorCSAgPGNvZGU+ZWxlbVZhbHVlPC9jb2RlPiwgPGNvZGU+ZWxlbU1pblZhbHVlPC9jb2RlPiwgYW5kDQorCSAgPGNvZGU+ZWxlbU1heFZhbHVlPC9jb2RlPiBlbGVtZW50czoNCisJPC9wPg0KKw0KKwk8dWw+DQorCSAgPGxpPklmIHRoZSA8Y29kZT5lbGVtRW51bUZsYWc8L2NvZGU+J3MgdmFsdWUgaXMgPGNvZGU+VDwvY29kZT4gYW5kDQorCSAgICBvbmUgb3IgbW9yZSA8Y29kZT5lbGVtVmFsdWU8L2NvZGU+cyBhcHBlYXIsIHRoZW4gdGhlIHZhbHVlcw0KKwkgICAgbGlzdGVkIGFyZSB0aGUgdmFsaWQgdmFsdWVzIG9mIHRoZSBlbGVtZW50Lg0KKwkgIDwvbGk+DQorCSAgPGxpPklmIHRoZSB2YWx1ZSBpcyA8Y29kZT5GPC9jb2RlPiwgdGhlbiBhIGNsb3NlZCByYW5nZSBvZg0KKwkgICAgdmFsdWVzIGJvdW5kZWQgYnkgdGhlIHByb2ZpbGUncyA8Y29kZT5lbGVtTWluVmFsdWU8L2NvZGU+IGFuZA0KKwkgICAgPGNvZGU+ZWxlbU1heFZhbHVlPC9jb2RlPiBlbGVtZW50cyBpbmRpY2F0ZXMgdGhlIHZhbGlkIHZhbHVlcy4NCisJICA8L2xpPg0KKwkgIDxsaT5JZiB0aGUgdmFsdWUgaXMgPGNvZGU+VDwvY29kZT4gYnV0IG5vIDxjb2RlPmVsZW1WYWx1ZTwvY29kZT5zDQorCSAgICBhcHBlYXIsIHRoZW4gaXQgbWVhbnMgdGhhdCBhbnkgdmFsdWUgaXMgYSB2YWxpZA0KKwkgICAgdmFsdWUgZm9yIHRoZSByZXNvdXJjZS4NCisJICA8L2xpPg0KKwk8L3VsPg0KKw0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJlbGVtU3lub255bSI+DQorCTxwPk9mdGVuLCBhIGNoYXJhY3RlcmlzdGljIG9mIGEgcmVzb3VyY2Ugd2lsbCBnbyBieSBzZXZlcmFsDQorCSAgbmFtZXMsIGVzcGVjaWFsbHkgYmV0d2VlbiBzY2llbnRpZmljIGRpc2NpcGxpbmVzLiAgV2hhdCBvbmUNCisJICBwZXJzb24gbWF5IGNhbGwgPGk+bGF0aXR1ZGU8L2k+LCBhbm90aGVyIG1heSBjYWxsIDxpPngNCisJICAgIGNvb3JkaW5hdGU8L2k+LCBmb3IgZXhhbXBsZS4gIEJ5IHNwZWNpZml5bmcgc3lub255bXMgZm9yIGENCisJICBwcm9maWxlIGVsZW1lbnQsIHlvdSBjYW4gYXNzaXN0IGluIGF1dG9tYXRpYyBjb3JyZWxhdGlvbiBvZg0KKwkgIHJlc3VsdHMgYW5kIGNyb3NzLWRpc2NpcGxpbmFyeSBkaXNjb3ZlcnkuDQorCTwvcD4NCisNCisJPHA+VGhlIDxjb2RlPmVsZW1TeW5vbnltPC9jb2RlPiBwcm92aWRlcyBhIHdheSB0byBkbyBqdXN0IHRoYXQuDQorCSAgWmVybyBvciBtb3JlIDxjb2RlPmVsZW1TeW5vbnltPC9jb2RlPnMgbWF5IGFwcGVhciBpbiBhIHByb2ZpbGUNCisJICBlbGVtZW50LiAgVGhlIHZhbHVlcyBvZiB0aGlzIGVsZW1lbnQgYXJlIG5hbWVzIGZyb20gZGF0YQ0KKwkgIGRpY3Rpb25hcmllcyBvdGhlciB0aGFuIHRoZSBkaXNjaXBsaW5lIGRhdGEgZGljdGlvbmFyeQ0KKwkgIGhvc3RpbmcgdGhlIHByb2ZpbGUuDQorICAgICAgCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iZWxlbU9ibGlnYXRpb24iPg0KKwk8cD5UaGUgPGNvZGU+ZWxlbU9ibGlnYXRpb248L2NvZGU+IHRlbGxzIHdoZXRoZXIgdGhlIGRhdGEgZWxlbWVudA0KKwkgIGlzIHJlcXVpcmVkIHRvIGFsd2F5cyBvciBzb21ldGltZXMgYmUgcHJlc2VudC4gVGhpcyBlbGVtZW50DQorCSAgaXMgc3lub255bW91cyB0byB0aGUgSVNPL0lFQyAxMTE3OSBhdHRyaWJ1dGUNCisJICA8Y29kZT5PYmxpZ2F0aW9uPC9jb2RlPiwgYW5kIGlzIG9wdGlvbmFsIHdpdGhpbiBhIHByb2ZpbGUNCisJICBlbGVtZW50Lg0KKwk8L3A+DQorDQorCTxwPlRoZSBsZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgPGNvZGU+UmVxdWlyZWQ8L2NvZGU+IGFuZA0KKwkgIDxjb2RlPk9wdGlvbmFsPC9jb2RlPiwgd2l0aCB0aGUgb2J2aW91cyBtZWFuaW5ncy4NCisgICAgICAJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJlbGVtQ29tbWVudCI+DQorCTxwPlRoZSA8Y29kZT5lbGVtQ29tbWVudDwvY29kZT4gZmllbGQgcHJvdmlkZXMgYSByZW1hcmsgY29uY2VybmluZw0KKwkgIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgZGF0YSBlbGVtZW50LiAgVGhpcyBlbGVtZW50IGlzDQorCSAgc3lub255bW91cyB0byB0aGUgSVNPL0lFQyAxMTE3OSBhdHRyaWJ1dGUgPGNvZGU+Q29tbWVudDwvY29kZT4sDQorCSAgYW5kIGlzIG9wdGlvbmFsIHdpdGhpbiBhIHByb2ZpbGUgZWxlbWVudC4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgPC9zZWN0aW9uPg0KKw0KKyAgICA8c2VjdGlvbiBuYW1lPSJNZXRhZGF0YSBhYm91dCB0aGUgUHJvZmlsZSI+DQorICAgICAgPHA+Rm9yIGEgcHJvZmlsZSBzZXJ2ZXIgdG8gbWFuYWdlIGEgc2V0IG9mIHByb2ZpbGVzLCBpdCdzDQorCW5lY2Vzc2FyeSB0byBoYXZlIG1ldGFkYXRhIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHByb2ZpbGUgdGhhdA0KKwlkZXNjcmliZXMgdGhlIHByb2ZpbGUgaXRzZWxmLiAgVGhpcyBtZXRhZGF0YSwgY29sbGVjdGl2ZWx5DQorCWNhbGxlZCB0aGUgcHJvZmlsZSBhdHRyaWJ1dGVzLCBvciA8Y29kZT5wcm9mQXR0cmlidXRlczwvY29kZT4sDQorCXNlcnZlcyB0aGF0IHB1cnBvc2UuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPk1vc3Qgb2YgdGhlIGVsZW1lbnRzIHdpdGhpbiB0aGUgPGNvZGU+cHJvZkF0dHJpYnV0ZXM8L2NvZGU+IGFyZQ0KKwlvcHRpb25hbC4gIFRoaXMgc2VjdGlvbnMgZGVzY3JpYmVzIGVhY2ggb2YgdGhlbS4NCisgICAgICA8L3A+DQorDQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0icHJvZklkIj4NCisJPHA+VGhlIDxjb2RlPnByb2ZJZDwvY29kZT4gc2VydmVzIHRvIGdpdmUgYSB1bmlxdWUgaWRlbnRpZmllciB0bw0KKwkgIHRoZSBwcm9maWxlLiAgSXQgc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyBhIFVSSSwgYW5kIG9mdGVuIGFzDQorCSAgYW4gVVJOLg0KKyAgICAgIAk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZWZXJzaW9uIj4NCisJPHA+VGhlIDxjb2RlPnByb2ZWZXJzaW9uPC9jb2RlPiBpZGVudGlmaWVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZg0KKwkgIHRoZSBwcm9maWxlLg0KKyAgICAgIAk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZUeXBlIj4NCisJPHA+VGhlIDxjb2RlPnByb2ZUeXBlPC9jb2RlPiBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwcm9maWxlLg0KKwkgIFRoZSB0eXBlIHRoYXQgdHlwaWNhbGx5IGFwcGVhcnMgaGVyZSBpcyA8Y29kZT5wcm9maWxlPC9jb2RlPiwNCisJICBtZWFuaW5nIHRoZSBwcm9maWxlIGlzIGEgcHJvZmlsZSAob2J2aW91c2x5KS4NCisJPC9wPg0KKw0KKwk8cD5Bbm90aGVyIHR5cGUgdGhhdCBjYW4gYmUgaGVyZSBpcyA8Y29kZT5kYXRhRGljdDwvY29kZT4sIHdoaWNoDQorCSAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb2ZpbGUgZG9lc24ndCBkZXNjcmliZSBhIHJlc291cmNlLCBidXQNCisJICBpbnN0ZWFkIGlzIGEgZGF0YSBkaWN0aW9uYXJ5IGZvciBvdGhlciBwcm9maWxlcy4gIFN1Y2ggYQ0KKwkgIHByb2ZpbGUncyBjb21wb3NpdGlvbiBlbGVtZW50cyBuYW1lIHRoZSBleHBlY3RlZCBwcm9maWxlDQorCSAgZWxlbWVudHMgYW5kIHJhbmdlcyBvZiB2YWxpZCB2YWx1ZXNlIHRoYXQgd2lsbCBhcHBlYXIgaW4NCisJICBvdGhlciBwcm9maWxlcy4gIFRoZSA8Y29kZT5wcm9mRGF0YURpY3RJZDwvY29kZT4gZWxlbWVudA0KKwkgIGlkZW50aWZpZXMgdGhlIHByb2ZpbGUgc2VydmluZyBhcyBpdHMgZGF0YSBkaWN0aW9uYXJ5Lg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZTdGF0dXNJZCI+DQorCTxwPlRoZSA8Y29kZT5wcm9mU3RhdHVzSWQ8L2NvZGU+IGlkZW50aWZpZXMgdGhlIHN0YXRlIG9mIHRoZQ0KKwkgIHByb2ZpbGUuICBQcm9maWxlcyBtYXkgYmUgZWl0aGVyIDxjb2RlPmFjdGl2ZTwvY29kZT4gb3INCisJICA8Y29kZT5pbmFjdGl2ZTwvY29kZT4uICBBbiBpbmFjdGl2ZSBwcm9maWxlIGlzIGxpa2VseSBtYWludGFpbmVkDQorCSAgZm9yIGhpc3RvcmljYWwgb3IgZXhlbXBsYXJ5IHJlYXNvbnMgYnV0IGlzIG90aGVyd2lzZSBub3QNCisJICBjdXJyZW50bHkgdXNlZCBmb3Igc2VhcmNoZXMgb3IgcmVzb3VyY2UgZGVzY3JpcHRpb25zLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZTZWN1cml0eVR5cGUiPg0KKwk8cD5UaGUgPGNvZGU+cHJvZlNlY3VyaXR5VHlwZTwvY29kZT4gaWRlbnRpZmllcyB3aGV0aGVyIHRoZQ0KKwkgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgcHJvZmlsZSBtYXkgYmUgb2YgYSBzZW5zaXRpdmUNCisJICBuYXR1cmUuICBBbnkgc3RyaW5nIGlzIHZhbGlkIGhlcmUgYXMgdGhlIGN1cnJlbnQgT09EVA0KKwkgIHNvZnR3YXJlIGRvZXMgbm90IHVzZSB0aGlzIGZpZWxkLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZQYXJlbnRJZCI+DQorCTxwPlRoZSA8Y29kZT5wcm9mUGFyZW50SWQ8L2NvZGU+IG9wdGlvbmFsbHkgaWRlbnRpZmllcyB0aGUgVVJJIG9mDQorCSAgdGhlIHBhcmVudCBvZiB0aGlzIHByb2ZpbGUuICBQcm9maWxlcyBtYXkgYmUgYXJyYW5nZWQNCisJICBoaWVyYXJjaGljYWxseSBpbiBhIHNpbmdseSByb290ZWQgdHJlZSBpbiBhIGZvcmVzdC4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJwcm9mQ2hpbGRJZCI+DQorCTxwPlRoZSA8Y29kZT5wcm9mQ2hpbGRJZDwvY29kZT4NCisJICBpZGVudGlmaWVzIHplcm8gb3IgbW9yZSBjaGlsZHJlbiAoYnkgZHVwbGljYXRpbmcgdGhlIGVsZW1lbnQpIG9mDQorCSAgdGhpcyBwcm9maWxlLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZSZWdBdXRob3JpdHkiPg0KKwk8cD5UaGUgPGNvZGU+cHJvZlJlZ0F1dGhvcml0eTwvY29kZT4NCisJICBuYW1lcyB0aGUgcmVnaXN0cmF0aW9uIGF1dGhvcml0eSByZXNwb25zaWJsZSBmb3IgYXV0aG9yaW5nIGFuZA0KKwkgIG1haW50YWluaW5nIHRoZSBwcm9maWxlLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InByb2ZSZXZpc2lvbk5vdGUiPg0KKwk8cD5UaGUgPGNvZGU+cHJvZlJldmlzaW9uTm90ZTwvY29kZT4gYXBwZWFycyB6ZXJvIG9yIG1vcmUgdGltZXMgaW4NCisJICB0aGUgcHJvZmlsZSB0byBkZXNjcmliZSBjaGFuZ2VzIG1hZGUgdG8gaXQgb3ZlciB0aW1lLiAgVGhlDQorCSAgbm90ZXMgYXJlIGZyZWUgZm9ybSB0ZXh0LCBhbmQgZWFjaCBlbGVtZW50IGlzIG9yZGVyZWQgZnJvbQ0KKwkgIG5ld2VzdCB0byBvbGRlc3Qgbm90ZS4NCisJPC9wPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJwcm9mRGF0YURpY3RJZCI+DQorCTxwPlRoZSA8Y29kZT5wcm9mRGF0YURpY3RJZDwvY29kZT4NCisJICBpZGVudGlmaWVzIHRoZSBwcm9maWxlIHByb3ZpZGluZyBhIGRhdGEgZGljdGlvbmFyeSB0byB0aGUNCisJICBjdXJyZW50IHByb2ZpbGUuDQorCTwvcD4NCisgICAgICA8L3N1YnNlY3Rpb24+DQorICAgIDwvc2VjdGlvbj4NCisNCisgICAgPHNlY3Rpb24gbmFtZT0iRGVzY3JpYmluZyBSZXNvdXJjZXMiPg0KKyAgICAgIDxwPkxldCdzIHRha2UgYSBsb29rIGF0IGhvdyBwcm9maWxlcyB3b3VsZCBkZXNjcmliZSByZXNvdXJjZXMgYnkNCisJbG9va2luZyBhdCBhbiBleGFtcGxlIHNldCBvZiBzY2llbnRpZmljIGRhdGEuICBTdXBwb3NlIHlvdQ0KKwlhcmNoaXZlIGhpZ2ggdGVtcGVyYXR1cmUgZGF0YSBmb3IgeW91ciB3ZWF0aGVyIHNlcnZpY2U7IHRoaXMNCisJZGF0YSBjb21lcyBpbiB0aGUgZm9ybSBvZiB0YWJsZXMgb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlDQorCWxvY2F0aW9ucyBhbmQgdGhlIGhpZ2ggdGVtcGVyYXR1cmUgcmVjb3JkZWQgYXQgZWFjaCBwb2ludC4NCisJU2luY2UgeW91J3JlIGFyY2hpdmluZyBkYWlseSBoaWdoIHRlbXBlcmF0dXJlcywgdGhlcmUncyBvbmUNCisJdGFibGUgcGVyIGRheSwgc28gZWFjaCBkYXkncyB0YWJsZSBpcyBhIGRpc2NyZXRlIHJlc291cmNlLg0KKwlMZXQncyBzYXkgeW91J3ZlIGdvdCBqdXN0IHRocmVlIGRheXMgb2YgZGF0YSBzbyBmYXIsIHRob3VnaCwNCisJYW5kIGl0IGxvb2tzIGxpa2UgdGhpcyAodG8ga2VlcCB0aGluZ3Mgc2ltcGxlKS4NCisgICAgICA8L3A+DQorDQorICAgICAgPHRhYmxlPg0KKwk8dGhlYWQ+DQorCSAgPHRyPg0KKwkgICAgPHRoPkRheSBOdW1iZXI8L3RoPiANCisJICAgIDx0aD5MYXQ8L3RoPg0KKwkgICAgPHRoPkxvbjwvdGg+DQorCSAgICA8dGg+SGlnaCBUZW1wPC90aD4NCisJICA8L3RyPg0KKwk8L3RoZWFkPg0KKwk8dGJvZHk+DQorCSAgPHRyPjx0ZCByb3dzcGFuPSIzIj4xPC90ZD48dGQ+MTA0LjE8L3RkPjx0ZD4zOS4yPC90ZD48dGQ+MjYuNTwvdGQ+PC90cj4NCisJICA8dHI+PHRkPjExMC4zPC90ZD48dGQ+NDIuNDwvdGQ+PHRkPjI5Ljk8L3RkPjwvdHI+DQorCSAgPHRyPjx0ZD4xMjEuNTwvdGQ+PHRkPjQ1LjY8L3RkPjx0ZD4yMy4zPC90ZD48L3RyPg0KKw0KKwkgIDx0cj48dGQgcm93c3Bhbj0iMyI+MjwvdGQ+PHRkPjEwNC4xPC90ZD48dGQ+MzkuMjwvdGQ+PHRkPjMxLjU8L3RkPjwvdHI+DQorCSAgPHRyPjx0ZD4xMTAuMzwvdGQ+PHRkPjQyLjQ8L3RkPjx0ZD4zMC45PC90ZD48L3RyPg0KKwkgIDx0cj48dGQ+MTIxLjU8L3RkPjx0ZD40NS42PC90ZD48dGQ+MjcuNTwvdGQ+PC90cj4NCisNCisJICA8dHI+PHRkIHJvd3NwYW49IjMiPjI8L3RkPjx0ZD4xMDQuMTwvdGQ+PHRkPjM5LjI8L3RkPjx0ZD4yMC44PC90ZD48L3RyPg0KKwkgIDx0cj48dGQ+MTEwLjM8L3RkPjx0ZD40Mi40PC90ZD48dGQ+MTkuNTwvdGQ+PC90cj4NCisJPC90Ym9keT4NCisgICAgICA8L3RhYmxlPg0KKw0KKyAgICAgIDxwPihPbiBkYXkgIzMsIHZhbmRhbHMgZGVzdHJveWVkIHRoZSB3ZWF0aGVyIHNlbnNvciBzdGF0aW9uIGF0DQorCSgxMjEuNSwgNDUuNiksIHNvIHRoZXJlIGFyZSBvbmx5IHR3byBtZWFzdXJlbWVudHMgdGhhdCBkYXkuKQ0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5UbyBtYWtlIHByb2ZpbGVzIGZvciBlYWNoIGRheSdzIG9mIGRhdGEsIGxldCdzIGdhdGhlciBzb21lDQorCWRhdGEgdGhhdCB3aWxsIGJlIGNvbW1vbiB0byBhbGwgb2YgdGhlbS4gIEZpcnN0LCBzYXkgdGhlDQorCXdlYXRoZXIgc2VydmljZSdzIE9JRCBpcyAyLjYuMS45LCBhbmQgZm9yIGFsbCBjb2xsZWN0ZWQgZGF0YQ0KKwl0aGUgd2VhdGhlciBzZXJ2aWNlIGhhcyByZXNlcnZlZCBhbiBPSUQgMi42LjEuOS4yLCBoaWdoDQorCXRlbXBlcmF0dXJlIG1lYXN1cmVtZW50cyAyLjYuMS45LjIuMS4gIFRoZXkgY2hvb3NlIHRvIG1ha2UgYQ0KKwlVUkkgZm9yIGVhY2ggZGF0YXNldCwNCisJPGNvZGU+dXJuOndlYXRoZXI6ZGF0YTpoaWdoczo8dmFyPmRheS1udW1iZXI8L3Zhcj48L2NvZGU+DQorCXdoZXJlIDx2YXI+ZGF5LW51bWJlcjwvdmFyPiBpcyB0aGUgZGF5IG51bWJlciBvZiB0aGUgZGF0YS4NCisJVGhlIG9mZmljaWFsIGNyZWF0b3IgZm9yIGFsbCB0aGlzIGRhdGEgd2lsbCBiZSAiV2VhdGhlcg0KKwlTZXJ2aWNlIiwgdW5kZXIgc3ViamVjdCBrZXl3b3JkcyAid2VhdGhlciIsICJ0ZW1wZXJhdHVyZXMiLA0KKwlhbmQgIm1lYXN1cmVtZW50cyIuICBUaGV5J2xsIGFsc28gbWFrZSB0aGUgZGF0YSB0YWJsZXMNCisJYWNjZXNzaWJsZSBhcyB3ZWIgZG9jdW1lbnRzIGluIE1JTUUgZm9ybWF0DQorCTxjb2RlPnRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXM8L2NvZGU+IGF0IHRoZSBhZGRyZXNzDQorCTxjb2RlPmh0dHA6Ly93ZWF0aGVyLmdvdi9kYXRhL2hpZ2hzLzx2YXI+ZGF5LW51bWJlcjwvdmFyPi50eHQ8L2NvZGU+Lg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5IZXJlLCB0aGVuLCBpcyB0aGUgcHJvZmlsZSBmb3IgdGhlIGRheSAxOjwvcD4NCisNCisgICAgICA8c291cmNlPjwhW0NEQVRBWzxwcm9maWxlPg0KKyAgPHByb2ZBdHRyaWJ1dGVzPg0KKyAgICA8cHJvZklkPjIuNi4xLjkuMi4xLjE8L3Byb2ZJZD4NCisgICAgPHByb2ZUeXBlPnByb2ZpbGU8L3Byb2ZUeXBlPg0KKyAgICA8cHJvZlN0YXR1c0lkPmFjdGl2ZTwvcHJvZlN0YXR1c0lkPg0KKyAgPC9wcm9mQXR0cmlidXRlcz4NCisgIDxyZXNBdHRyaWJ1dGVzPg0KKyAgICA8SWRlbnRpZmllcj51cm46d2VhdGhlcjpkYXRhOmhpZ2hzOjE8L0lkZW50aWZpZXI+DQorICAgIDxUaXRsZT5IaWdoIFRlbXBlcmF0dXJlcyAtIERheSAxPC9UaXRsZT4NCisgICAgPEZvcm1hdD50ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzPC9Gb3JtYXQ+DQorICAgIDxDcmVhdG9yPldlYXRoZXIgU2VydmljZTwvQ3JlYXRvcj4NCisgICAgPFN1YmplY3Q+d2VhdGhlcjwvU3ViamVjdD4NCisgICAgPFN1YmplY3Q+dGVtcGVyYXR1cmVzPC9TdWJqZWN0Pg0KKyAgICA8U3ViamVjdD5tZWFzdXJlbWVudHM8L1N1YmplY3Q+DQorICAgIDxyZXNDb250ZXh0Pk5PQUEuTldTLkRhdGE8L3Jlc0NvbnRleHQ+DQorICAgIDxyZXNDbGFzcz5kYXRhLmdyYW51bGU8L3Jlc0NsYXNzPg0KKyAgICA8cmVzTG9jYXRpb24+aHR0cDovL3dlYXRoZXIuZ292L2RhdGEvaGlnaHMvMS50eHQ8L3Jlc0xvY2F0aW9uPg0KKyAgPC9yZXNBdHRyaWJ1dGVzPg0KKyAgPHByb2ZFbGVtZW50Pg0KKyAgICA8ZWxlbU5hbWU+bGF0aXR1ZGU8L2VsZW1OYW1lPg0KKyAgICA8ZWxlbVR5cGU+cmVhbDwvZWxlbVR5cGU+DQorICAgIDxlbGVtVW5pdD5kZWdyZWU8L2VsZW1Vbml0Pg0KKyAgICA8ZWxlbUVudW1GbGFnPkY8L2VsZW1FbnVtRmxhZz4NCisgICAgPGVsZW1NaW5WYWx1ZT4xMDQuMTwvZWxlbU1pblZhbHVlPg0KKyAgICA8ZWxlbU1heFZhbHVlPjEyMS41PC9lbGVtTWF4VmFsdWU+DQorICA8L3Byb2ZFbGVtZW50Pg0KKyAgPHByb2ZFbGVtZW50Pg0KKyAgICA8ZWxlbU5hbWU+bG9uZ2l0dWRlPC9lbGVtTmFtZT4NCisgICAgPGVsZW1UeXBlPnJlYWw8L2VsZW1UeXBlPg0KKyAgICA8ZWxlbVVuaXQ+ZGVncmVlPC9lbGVtVW5pdD4NCisgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+DQorICAgIDxlbGVtTWluVmFsdWU+MzkuMjwvZWxlbU1pblZhbHVlPg0KKyAgICA8ZWxlbU1heFZhbHVlPjQ1LjY8L2VsZW1NYXhWYWx1ZT4NCisgIDwvcHJvZkVsZW1lbnQ+DQorICA8cHJvZkVsZW1lbnQ+DQorICAgIDxlbGVtTmFtZT50ZW1wZXJhdHVyZTwvZWxlbU5hbWU+DQorICAgIDxlbGVtVHlwZT5yZWFsPC9lbGVtVHlwZT4NCisgICAgPGVsZW1Vbml0PmNlbHNpdXM8L2VsZW1Vbml0Pg0KKyAgICA8ZWxlbUVudW1GbGFnPkY8L2VsZW1FbnVtRmxhZz4NCisgICAgPGVsZW1NaW5WYWx1ZT4yMy4zPC9lbGVtTWluVmFsdWU+DQorICAgIDxlbGVtTWF4VmFsdWU+MjkuOTwvZWxlbU1heFZhbHVlPg0KKyAgPC9wcm9mRWxlbWVudD4NCis8L3Byb2ZpbGU+XV0+PC9zb3VyY2U+DQorDQorICAgICAgPHA+U29tZW9uZSBzZWFyY2hpbmcgZm9yIGEgaGlnaCB0ZW1wZXJhdHVyZSB0aGF0IGV4Y2VlZGVkIDI1DQorCWRlZ3JlZXMsIGZvciBleGFtcGxlLCB3b3VsZCBmaW5kIHRoaXMgYXMgYSBtYXRjaGluZw0KKwlyZXNvdXJjZSwgYXMgdGhlIDxjb2RlPmVsZW1NaW5WYWx1ZTwvY29kZT4gZm9yDQorCTxjb2RlPnRlbXBlcmF0dXJlPC9jb2RlPiBpcyAyMy4zLCBhbmQgMjUgaXMgb3ZlciB0aGF0Lg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD5IZXJlIGFyZSBhbGwgdGhyZWUgcHJvZmlsZXMgaW4gb25lIGRvY3VtZW50OjwvcD4NCisNCisgICAgICA8c291cmNlPjwhW0NEQVRBWzxwcm9maWxlcz4NCisgIDxwcm9maWxlPg0KKyAgICA8cHJvZkF0dHJpYnV0ZXM+DQorICAgICAgPHByb2ZJZD4yLjYuMS45LjIuMS4xPC9wcm9mSWQ+DQorICAgICAgPHByb2ZUeXBlPnByb2ZpbGU8L3Byb2ZUeXBlPg0KKyAgICAgIDxwcm9mU3RhdHVzSWQ+YWN0aXZlPC9wcm9mU3RhdHVzSWQ+DQorICAgIDwvcHJvZkF0dHJpYnV0ZXM+DQorICAgIDxyZXNBdHRyaWJ1dGVzPg0KKyAgICAgIDxJZGVudGlmaWVyPnVybjp3ZWF0aGVyOmRhdGE6aGlnaHM6MTwvSWRlbnRpZmllcj4NCisgICAgICA8VGl0bGU+SGlnaCBUZW1wZXJhdHVyZXMgLSBEYXkgMTwvVGl0bGU+DQorICAgICAgPEZvcm1hdD50ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzPC9Gb3JtYXQ+DQorICAgICAgPENyZWF0b3I+V2VhdGhlciBTZXJ2aWNlPC9DcmVhdG9yPg0KKyAgICAgIDxTdWJqZWN0PndlYXRoZXI8L1N1YmplY3Q+DQorICAgICAgPFN1YmplY3Q+dGVtcGVyYXR1cmVzPC9TdWJqZWN0Pg0KKyAgICAgIDxTdWJqZWN0Pm1lYXN1cmVtZW50czwvU3ViamVjdD4NCisgICAgICA8cmVzQ29udGV4dD5OT0FBLk5XUy5EYXRhPC9yZXNDb250ZXh0Pg0KKyAgICAgIDxyZXNDbGFzcz5kYXRhLmdyYW51bGU8L3Jlc0NsYXNzPg0KKyAgICAgIDxyZXNMb2NhdGlvbj5odHRwOi8vd2VhdGhlci5nb3YvZGF0YS9oaWdocy8xLnR4dDwvcmVzTG9jYXRpb24+DQorICAgIDwvcmVzQXR0cmlidXRlcz4NCisgICAgPHByb2ZFbGVtZW50Pg0KKyAgICAgIDxlbGVtTmFtZT5sYXRpdHVkZTwvZWxlbU5hbWU+DQorICAgICAgPGVsZW1UeXBlPnJlYWw8L2VsZW1UeXBlPg0KKyAgICAgIDxlbGVtVW5pdD5kZWdyZWU8L2VsZW1Vbml0Pg0KKyAgICAgIDxlbGVtRW51bUZsYWc+RjwvZWxlbUVudW1GbGFnPg0KKyAgICAgIDxlbGVtTWluVmFsdWU+MTA0LjE8L2VsZW1NaW5WYWx1ZT4NCisgICAgICA8ZWxlbU1heFZhbHVlPjEyMS41PC9lbGVtTWF4VmFsdWU+DQorICAgIDwvcHJvZkVsZW1lbnQ+DQorICAgIDxwcm9mRWxlbWVudD4NCisgICAgICA8ZWxlbU5hbWU+bG9uZ2l0dWRlPC9lbGVtTmFtZT4NCisgICAgICA8ZWxlbVR5cGU+cmVhbDwvZWxlbVR5cGU+DQorICAgICAgPGVsZW1Vbml0PmRlZ3JlZTwvZWxlbVVuaXQ+DQorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+DQorICAgICAgPGVsZW1NaW5WYWx1ZT4zOS4yPC9lbGVtTWluVmFsdWU+DQorICAgICAgPGVsZW1NYXhWYWx1ZT40NS42PC9lbGVtTWF4VmFsdWU+DQorICAgIDwvcHJvZkVsZW1lbnQ+DQorICAgIDxwcm9mRWxlbWVudD4NCisgICAgICA8ZWxlbU5hbWU+dGVtcGVyYXR1cmU8L2VsZW1OYW1lPg0KKyAgICAgIDxlbGVtVHlwZT5yZWFsPC9lbGVtVHlwZT4NCisgICAgICA8ZWxlbVVuaXQ+Y2Vsc2l1czwvZWxlbVVuaXQ+DQorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+DQorICAgICAgPGVsZW1NaW5WYWx1ZT4yMy4zPC9lbGVtTWluVmFsdWU+DQorICAgICAgPGVsZW1NYXhWYWx1ZT4yOS45PC9lbGVtTWF4VmFsdWU+DQorICAgIDwvcHJvZkVsZW1lbnQ+DQorICA8L3Byb2ZpbGU+DQorICA8cHJvZmlsZT4NCisgICAgPHByb2ZBdHRyaWJ1dGVzPg0KKyAgICAgIDxwcm9mSWQ+Mi42LjEuOS4yLjEuMjwvcHJvZklkPg0KKyAgICAgIDxwcm9mVHlwZT5wcm9maWxlPC9wcm9mVHlwZT4NCisgICAgICA8cHJvZlN0YXR1c0lkPmFjdGl2ZTwvcHJvZlN0YXR1c0lkPg0KKyAgICA8L3Byb2ZBdHRyaWJ1dGVzPg0KKyAgICA8cmVzQXR0cmlidXRlcz4NCisgICAgICA8SWRlbnRpZmllcj51cm46d2VhdGhlcjpkYXRhOmhpZ2hzOjI8L0lkZW50aWZpZXI+DQorICAgICAgPFRpdGxlPkhpZ2ggVGVtcGVyYXR1cmVzIC0gRGF5IDI8L1RpdGxlPg0KKyAgICAgIDxGb3JtYXQ+dGV4dC90YWItc2VwYXJhdGVkLXZhbHVlczwvRm9ybWF0Pg0KKyAgICAgIDxDcmVhdG9yPldlYXRoZXIgU2VydmljZTwvQ3JlYXRvcj4NCisgICAgICA8U3ViamVjdD53ZWF0aGVyPC9TdWJqZWN0Pg0KKyAgICAgIDxTdWJqZWN0PnRlbXBlcmF0dXJlczwvU3ViamVjdD4NCisgICAgICA8U3ViamVjdD5tZWFzdXJlbWVudHM8L1N1YmplY3Q+DQorICAgICAgPHJlc0NvbnRleHQ+Tk9BQS5OV1MuRGF0YTwvcmVzQ29udGV4dD4NCisgICAgICA8cmVzQ2xhc3M+ZGF0YS5ncmFudWxlPC9yZXNDbGFzcz4NCisgICAgICA8cmVzTG9jYXRpb24+aHR0cDovL3dlYXRoZXIuZ292L2RhdGEvaGlnaHMvMi50eHQ8L3Jlc0xvY2F0aW9uPg0KKyAgICA8L3Jlc0F0dHJpYnV0ZXM+DQorICAgIDxwcm9mRWxlbWVudD4NCisgICAgICA8ZWxlbU5hbWU+bGF0aXR1ZGU8L2VsZW1OYW1lPg0KKyAgICAgIDxlbGVtVHlwZT5yZWFsPC9lbGVtVHlwZT4NCisgICAgICA8ZWxlbVVuaXQ+ZGVncmVlPC9lbGVtVW5pdD4NCisgICAgICA8ZWxlbUVudW1GbGFnPkY8L2VsZW1FbnVtRmxhZz4NCisgICAgICA8ZWxlbU1pblZhbHVlPjEwNC4xPC9lbGVtTWluVmFsdWU+DQorICAgICAgPGVsZW1NYXhWYWx1ZT4xMjEuNTwvZWxlbU1heFZhbHVlPg0KKyAgICA8L3Byb2ZFbGVtZW50Pg0KKyAgICA8cHJvZkVsZW1lbnQ+DQorICAgICAgPGVsZW1OYW1lPmxvbmdpdHVkZTwvZWxlbU5hbWU+DQorICAgICAgPGVsZW1UeXBlPnJlYWw8L2VsZW1UeXBlPg0KKyAgICAgIDxlbGVtVW5pdD5kZWdyZWU8L2VsZW1Vbml0Pg0KKyAgICAgIDxlbGVtRW51bUZsYWc+RjwvZWxlbUVudW1GbGFnPg0KKyAgICAgIDxlbGVtTWluVmFsdWU+MzkuMjwvZWxlbU1pblZhbHVlPg0KKyAgICAgIDxlbGVtTWF4VmFsdWU+NDUuNjwvZWxlbU1heFZhbHVlPg0KKyAgICA8L3Byb2ZFbGVtZW50Pg0KKyAgICA8cHJvZkVsZW1lbnQ+DQorICAgICAgPGVsZW1OYW1lPnRlbXBlcmF0dXJlPC9lbGVtTmFtZT4NCisgICAgICA8ZWxlbVR5cGU+cmVhbDwvZWxlbVR5cGU+DQorICAgICAgPGVsZW1Vbml0PmNlbHNpdXM8L2VsZW1Vbml0Pg0KKyAgICAgIDxlbGVtRW51bUZsYWc+RjwvZWxlbUVudW1GbGFnPg0KKyAgICAgIDxlbGVtTWluVmFsdWU+MjcuNTwvZWxlbU1pblZhbHVlPg0KKyAgICAgIDxlbGVtTWF4VmFsdWU+MzEuNTwvZWxlbU1heFZhbHVlPg0KKyAgICA8L3Byb2ZFbGVtZW50Pg0KKyAgPC9wcm9maWxlPg0KKyAgPHByb2ZpbGU+DQorICAgIDxwcm9mQXR0cmlidXRlcz4NCisgICAgICA8cHJvZklkPjIuNi4xLjkuMi4xLjM8L3Byb2ZJZD4NCisgICAgICA8cHJvZlR5cGU+cHJvZmlsZTwvcHJvZlR5cGU+DQorICAgICAgPHByb2ZTdGF0dXNJZD5hY3RpdmU8L3Byb2ZTdGF0dXNJZD4NCisgICAgPC9wcm9mQXR0cmlidXRlcz4NCisgICAgPHJlc0F0dHJpYnV0ZXM+DQorICAgICAgPElkZW50aWZpZXI+dXJuOndlYXRoZXI6ZGF0YTpoaWdoczozPC9JZGVudGlmaWVyPg0KKyAgICAgIDxUaXRsZT5IaWdoIFRlbXBlcmF0dXJlcyAtIERheSAzPC9UaXRsZT4NCisgICAgICA8Rm9ybWF0PnRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXM8L0Zvcm1hdD4NCisgICAgICA8Q3JlYXRvcj5XZWF0aGVyIFNlcnZpY2U8L0NyZWF0b3I+DQorICAgICAgPFN1YmplY3Q+d2VhdGhlcjwvU3ViamVjdD4NCisgICAgICA8U3ViamVjdD50ZW1wZXJhdHVyZXM8L1N1YmplY3Q+DQorICAgICAgPFN1YmplY3Q+bWVhc3VyZW1lbnRzPC9TdWJqZWN0Pg0KKyAgICAgIDxyZXNDb250ZXh0Pk5PQUEuTldTLkRhdGE8L3Jlc0NvbnRleHQ+DQorICAgICAgPHJlc0NsYXNzPmRhdGEuZ3JhbnVsZTwvcmVzQ2xhc3M+DQorICAgICAgPHJlc0xvY2F0aW9uPmh0dHA6Ly93ZWF0aGVyLmdvdi9kYXRhL2hpZ2hzLzMudHh0PC9yZXNMb2NhdGlvbj4NCisgICAgPC9yZXNBdHRyaWJ1dGVzPg0KKyAgICA8cHJvZkVsZW1lbnQ+DQorICAgICAgPGVsZW1OYW1lPmxhdGl0dWRlPC9lbGVtTmFtZT4NCisgICAgICA8ZWxlbVR5cGU+cmVhbDwvZWxlbVR5cGU+DQorICAgICAgPGVsZW1Vbml0PmRlZ3JlZTwvZWxlbVVuaXQ+DQorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+DQorICAgICAgPGVsZW1NaW5WYWx1ZT4xMDQuMTwvZWxlbU1pblZhbHVlPg0KKyAgICAgIDxlbGVtTWF4VmFsdWU+MTEwLjM8L2VsZW1NYXhWYWx1ZT4NCisgICAgPC9wcm9mRWxlbWVudD4NCisgICAgPHByb2ZFbGVtZW50Pg0KKyAgICAgIDxlbGVtTmFtZT5sb25naXR1ZGU8L2VsZW1OYW1lPg0KKyAgICAgIDxlbGVtVHlwZT5yZWFsPC9lbGVtVHlwZT4NCisgICAgICA8ZWxlbVVuaXQ+ZGVncmVlPC9lbGVtVW5pdD4NCisgICAgICA8ZWxlbUVudW1GbGFnPkY8L2VsZW1FbnVtRmxhZz4NCisgICAgICA8ZWxlbU1pblZhbHVlPjM5LjI8L2VsZW1NaW5WYWx1ZT4NCisgICAgICA8ZWxlbU1heFZhbHVlPjQyLjQ8L2VsZW1NYXhWYWx1ZT4NCisgICAgPC9wcm9mRWxlbWVudD4NCisgICAgPHByb2ZFbGVtZW50Pg0KKyAgICAgIDxlbGVtTmFtZT50ZW1wZXJhdHVyZTwvZWxlbU5hbWU+DQorICAgICAgPGVsZW1UeXBlPnJlYWw8L2VsZW1UeXBlPg0KKyAgICAgIDxlbGVtVW5pdD5jZWxzaXVzPC9lbGVtVW5pdD4NCisgICAgICA8ZWxlbUVudW1GbGFnPkY8L2VsZW1FbnVtRmxhZz4NCisgICAgICA8ZWxlbU1pblZhbHVlPjE5LjU8L2VsZW1NaW5WYWx1ZT4NCisgICAgICA8ZWxlbU1heFZhbHVlPjIwLjg8L2VsZW1NYXhWYWx1ZT4NCisgICAgPC9wcm9mRWxlbWVudD4NCisgIDwvcHJvZmlsZT4NCis8L3Byb2ZpbGVzPl1dPjwvc291cmNlPg0KKw0KKyAgICAgIDxwPkdpdmVuIHRoaXMgc2V0IG9mIHByb2ZpbGVzLCBhIHByb2ZpbGUgc2VhcmNoIGZvciByZXNvdXJjZXMNCisJd2l0aCA8Y29kZT5sYXRpdHVkZSAmZ3Q7IDEyMC4wPC9jb2RlPiB3b3VsZCBtYXRjaCBwcm9maWxlcw0KKwlmb3IgZGF5IDEgYW5kIDIsIGJ1dCBub3QgZGF5IDMuICBBY3R1YWwgcHJvZmlsZSBzZWFyY2hlcyBhcmUNCisJcG9zc2libGUgYnkgdGFraW5nIHRoZSBhYm92ZSBkb2N1bWVudCBhbmQgbG9hZGluZyBpdCBpbnRvDQorCXRoZSA8Y29kZT5MaWdodHdlaWdodFByb2ZpbGVIYW5kbGVyPC9jb2RlPiwgeWV0IHRoYXQgYmVjb21lcw0KKwlpbXByYWN0aWNhbCBmb3IgbWFueSBtYW55IHByb2ZpbGVzLCBhcyBpdCBob2xkcyBhbGwgb2YgdGhlDQorCXByb2ZpbGUgb2JqZWN0cyBpbiBtZW1vcnkgYW5kICJzZWFyY2hlcyIgdGhlbSBpbiBwbGFjZS4NCisJTW9yZSBsaWtlbHksIGRhdGEgc3VjaCBhcyB0aGVzZSB3b3VsZCBiZSBzdG9yZWQgaW4gYQ0KKwlyZWxhdGlvbmFsIGRhdGFiYXNlLCBhbmQgdGhlIG1hdGNoaW5nIHByb2ZpbGVzIHdvdWxkIGJlDQorCWdlbmVyYXRlZCBvbiBkZW1hbmQuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkxldCdzIG1ha2Ugb25lIG1vcmUgcHJvZmlsZSwgYSBwcm9maWxlIHRoYXQgZGVzY3JpYmVzDQorCTxlbT50aGUgZW50aXJlIGNvbGxlY3Rpb248L2VtPjoNCisgICAgICA8L3A+DQorDQorICAgICAgPHNvdXJjZT48IVtDREFUQVsNCisgIDxwcm9maWxlPg0KKyAgICA8cHJvZkF0dHJpYnV0ZXM+DQorICAgICAgPHByb2ZJZD4yLjYuMS45LjIuMTwvcHJvZklkPg0KKyAgICAgIDxwcm9mVHlwZT5wcm9maWxlPC9wcm9mVHlwZT4NCisgICAgICA8cHJvZlN0YXR1c0lkPmFjdGl2ZTwvcHJvZlN0YXR1c0lkPg0KKyAgICA8L3Byb2ZBdHRyaWJ1dGVzPg0KKyAgICA8cmVzQXR0cmlidXRlcz4NCisgICAgICA8SWRlbnRpZmllcj51cm46d2VhdGhlcjpkYXRhOmhpZ2hzOmluZGV4PC9JZGVudGlmaWVyPg0KKyAgICAgIDxUaXRsZT5IaWdoIFRlbXBlcmF0dXJlczwvVGl0bGU+DQorICAgICAgPEZvcm1hdD50ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzPC9Gb3JtYXQ+DQorICAgICAgPENyZWF0b3I+V2VhdGhlciBTZXJ2aWNlPC9DcmVhdG9yPg0KKyAgICAgIDxTdWJqZWN0PndlYXRoZXI8L1N1YmplY3Q+DQorICAgICAgPFN1YmplY3Q+dGVtcGVyYXR1cmVzPC9TdWJqZWN0Pg0KKyAgICAgIDxTdWJqZWN0Pm1lYXN1cmVtZW50czwvU3ViamVjdD4NCisgICAgICA8cmVzQ29udGV4dD5OT0FBLk5XUy5EYXRhPC9yZXNDb250ZXh0Pg0KKyAgICAgIDxyZXNDbGFzcz5zeXN0ZW0ucHJvZmlsZVNlcnZlcjwvcmVzQ2xhc3M+DQorICAgICAgPHJlc0xvY2F0aW9uPnVybjp3ZWF0aGVyOmRhdGE6aGlnaHM6UHJvZmlsZVNlcnZlcjwvcmVzTG9jYXRpb24+DQorICAgIDwvcmVzQXR0cmlidXRlcz4NCisgICAgPHByb2ZFbGVtZW50Pg0KKyAgICAgIDxlbGVtTmFtZT5sYXRpdHVkZTwvZWxlbU5hbWU+DQorICAgICAgPGVsZW1UeXBlPnJlYWw8L2VsZW1UeXBlPg0KKyAgICAgIDxlbGVtVW5pdD5kZWdyZWU8L2VsZW1Vbml0Pg0KKyAgICAgIDxlbGVtRW51bUZsYWc+RjwvZWxlbUVudW1GbGFnPg0KKyAgICAgIDxlbGVtTWluVmFsdWU+MTA0LjE8L2VsZW1NaW5WYWx1ZT4NCisgICAgICA8ZWxlbU1heFZhbHVlPjEyMS41PC9lbGVtTWF4VmFsdWU+DQorICAgIDwvcHJvZkVsZW1lbnQ+DQorICAgIDxwcm9mRWxlbWVudD4NCisgICAgICA8ZWxlbU5hbWU+bG9uZ2l0dWRlPC9lbGVtTmFtZT4NCisgICAgICA8ZWxlbVR5cGU+cmVhbDwvZWxlbVR5cGU+DQorICAgICAgPGVsZW1Vbml0PmRlZ3JlZTwvZWxlbVVuaXQ+DQorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+DQorICAgICAgPGVsZW1NaW5WYWx1ZT4xOS41PC9lbGVtTWluVmFsdWU+DQorICAgICAgPGVsZW1NYXhWYWx1ZT4zMS41PC9lbGVtTWF4VmFsdWU+DQorICAgIDwvcHJvZkVsZW1lbnQ+DQorICAgIDxwcm9mRWxlbWVudD4NCisgICAgICA8ZWxlbU5hbWU+dGVtcGVyYXR1cmU8L2VsZW1OYW1lPg0KKyAgICAgIDxlbGVtVHlwZT5yZWFsPC9lbGVtVHlwZT4NCisgICAgICA8ZWxlbVVuaXQ+Y2Vsc2l1czwvZWxlbVVuaXQ+DQorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+DQorICAgICAgPGVsZW1NaW5WYWx1ZT4xOS41PC9lbGVtTWluVmFsdWU+DQorICAgICAgPGVsZW1NYXhWYWx1ZT4zMS41PC9lbGVtTWF4VmFsdWU+DQorICAgIDwvcHJvZkVsZW1lbnQ+DQorICA8L3Byb2ZpbGU+XV0+PC9zb3VyY2U+DQorDQorICAgICAgPHA+Tm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIHNldmVyYWwgY2hhbmdlcyBpbiB0aGUgcmVzb3VyY2UNCisJYXR0cmlidXRlcywgd2UndmUgYWxzbyBjaGFuZ2VkIHRoZSBwcm9maWxlIGVsZW1lbnRzIHRvDQorCWNvdmVyIHRoZSBlbnRpcmUgcmFuZ2Ugb2YgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kDQorCXRlbXBlcmF0dXJlIGluIHRoZSBlbnRpcmUgZGF0YSBzZXQuICBTbywgZm9yIHRlbXBlcmF0dXJlLA0KKwl0aGUgbG93ZXN0IGhpZ2ggdGVtcGVyYXR1cmUgZm9yIGFsbCB0aHJlZSBkYXlzIHdhcyAxOS41LA0KKwlhbmQgdGhlIGhpZ2hlc3Qgd2FzIDMxLjUuICBOb3csIGEgcHJvZmlsZSBzZWFyY2ggY2FuIGZvcg0KKwl0ZW1wZXJhdHVyZXMgZ3JlYXRlciB0aGFuIDMwIHdpbGwgbWF0Y2ggdGhlIHByb2ZpbGUgZm9yDQorCXRoZSB3aG9sZSBjb2xsZWN0aW9uLCBhcyB3ZWxsIGFzIHRoZSBwcm9maWxlIGZvciBkYXkgIzIuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkluIGZhY3QsIHRoZSBPT0RUIGZyYW1ld29yayBzdXBwb3J0cyBhdXRvbWF0aWMgZHJpbGwtZG93biBvZg0KKwl0aGlzIGtpbmQuICBUaGUgPGEgaHJlZj0iL2dyaWQtcXVlcnkvIj5RdWVyeSBTZXJ2aWNlPC9hPiwgdXBvbg0KKwllbmNvdW50ZXJpbmcgYSBtYXRjaGluZyBwcm9maWxlLCBjaGVja3MgdG8gc2VlIGlmIHRoZQ0KKwk8Y29kZT5yZXNDbGFzczwvY29kZT4gaXMgPGNvZGU+c3lzdGVtLnByb2ZpbGVTZXJ2ZXI8L2NvZGU+LA0KKwlhbmQgaWYgc28sIHdpbGwgcGFzcyB0aGUgcXVlcnkgdG8gdGhlIHByb2ZpbGUgc2VydmVyIGF0IHRoZQ0KKwk8Y29kZT5yZXNMb2NhdGlvbjwvY29kZT4gaW4gdGhlIG1hdGNoZWQgcHJvZmlsZS4gIEl0IHdpbGwNCisJZ2F0aGVyIHVwIGFsbCBtYXRjaGluZyBwcm9maWxlcyBhbmQgcmV0dXJuIHRoZW0gdG8gdGhlIHVzZXIuDQorCUluIHRoaXMgd2F5LCBpdCBjYW4gZm9sbG93IGEgZGlyZWN0ZWQgZ3JhcGggb2YgbGlua2VkIHByb2ZpbGUNCisJc2VydmVycyAoYXV0b21hdGljYWxseSBhdm9pZGluZyBjeWNsZXMpLCBhbmQgZ2F0aGVyaW5nIG1vcmUNCisJYW5kIG1vcmUgcmVzdWx0cy4NCisgICAgICA8L3A+DQorICAgIDwvc2VjdGlvbj4NCisgIDwvYm9keT4NCis8L2RvY3VtZW50Pg0KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL3F1ZXJ5aW5nL2luZGV4LnhtbCBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL3F1ZXJ5aW5nL2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTU3NzRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3hkb2MvcXVlcnlpbmcvaW5kZXgueG1sCkBAIC0wLDAgKzEsMjAzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPlF1ZXJ5aW5nIFByb2ZpbGUgRWxlbWVudHM8L3RpdGxlPgorICAgIDxhdXRob3IgZW1haWw9IlNlYW4uS2VsbHlAanBsLm5hc2EuZ292Ij5TZWFuIEtlbGx5PC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKyAgPCEtLSBGb3VyIENhcnJ5IE51dHMgLSBIZXhhZ29uIC0tPgorICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJRdWVyeWluZyBQcm9maWxlIEVsZW1lbnRzIj4KKworICAgICAgPHA+QXMgZGVzcmliZWQgaW4gPGEgaHJlZj0iLi4vaW5mby8iPkluZm9ybWF0aW9uIENhcHR1cmVkIGluIGEKKwlQcm9maWxlPC9hPiwgcHJvZmlsZSBlbGVtZW50cyBkZXNjcmliZSB0aGUgY29tcG9zaXRpb24gb2YgYQorCXJlc291cmNlIHVzaW5nIG1ldGFkYXRhIGRlc2NyaXB0aW9ucyB0YWtlbiBmcm9tIHRoZSA8YQorCWhyZWY9Imh0dHA6Ly9tZXRhZGF0YS1zdGFuZGFyZHMub3JnLzExMTc5LyI+SVNPL0lFQyAxMTE3OQorCXN0YW5kYXJkczwvYT4uICBUaGUgcHJvZmlsZSBlbGVtZW50cyBjYXRhbG9nIGxpc3RzIG9mIHZhbGlkCisJdmFsdWVzLCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcywgZGF0YSB0eXBlcywgYW5kIHNvIGZvcnRoLgorICAgICAgPC9wPgorCisgICAgICA8cD5BcyB5b3UgZGV2ZWxvcCBhIHByb2ZpbGUgaGFuZGxlciB0byBwZXJmb3JtIHF1ZXJpZXMgYW5kCisJZ2VuZXJhdGUgcHJvZmlsZXMsIHlvdSdsbCBlbmNvdW50ZXIgdGhyZWUgY2FzZXMgd2hlbiBxdWVyeWluZworCXByb2ZpbGUgZWxlbWVudHMgb3IgdGhlIGRhdGEgc291cmNlcyB0aGV5IGRlc2NyaWJlOgorICAgICAgPC9wPgorCisgICAgICA8dWw+CisJPGxpPlF1ZXJ5aW5nIHJhbmdlcyBvZiB2YWx1ZXM8L2xpPgorCTxsaT5RdWVyeWluZyBlbnVtZXJhdGVkIHZhbHVlczwvbGk+CisJPGxpPlF1ZXJ5aW5nIHVuc3BlY2lmaWVkIHByb2ZpbGUgbGVtZW50czwvbGk+CisgICAgICA8L3VsPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IlF1ZXJpZXMgQWdhaW5zdCBSYW5nZXMiPgorICAgICAgPHA+UmFuZ2VkIHByb2ZpbGUgZWxlbWVudHMgYXJlIHRob3NlIHRoYXQgZGVzY3JpYmUgYW4gYXR0cmlidXRlCisJb2YgYSByZXNvdXJjZSdzIGNvbXBvc2l0aW9uIGluIHRlcm1zIG9mIGEgY29udGludW91cyBzcGFjZSBvZgorCXZhbGlkIHZhbHVlcy4gIEluIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uLCB0aGVyZSdzIGEgc3ViY2xhc3MKKwlvZiA8Y29kZT5Qcm9maWxlRWxlbWVudDwvY29kZT4gdG8gcmVwcmVzZW50IHN1Y2ggcmFuZ2VzOgorCTxjb2RlPlJhbmdlZFByb2ZpbGVFbGVtZW50PC9jb2RlPi4gIEluIHRoZSBYTUwgcmVwcmVzZW50YXRpb24sCisJdGhlIDxjb2RlPiZsdDtlbGVtRW51bUZsYWcmZ3Q7PC9jb2RlPiBpcyA8Y29kZT5GPC9jb2RlPiBhbmQKKwl0aGVyZSBhcmUgdmFsdWVzIGxpc3RlZCBmb3IgPGNvZGU+Jmx0O2VsZW1NaW5WYWx1ZSZndDs8L2NvZGU+CisJYW5kIDxjb2RlPiZsdDtlbGVtTWF4VmFsdWUmZ3Q7PC9jb2RlPi4KKyAgICAgIDwvcD4KKworICAgICAgPHA+QW4gZXhhbXBsZSBvZiBhIHJhbmdlZCBwcm9maWxlIGVsZW1lbnQgbWlnaHQgYmU6PC9wPgorICAgICAgPHRhYmxlPgorCTx0Ym9keT4KKwkgIDx0cj48dGQ+TmFtZTo8L3RkPjx0ZD50ZW1wZXJhdHVyZTwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+RGVzY3JpcHRpb246PC90ZD48dGQ+VGVtcGVyYXR1cmVzIG1lYXN1cmVkIHVzaW5nCisJICBvcmFsLCBtZWRpY2FsLXVzZSwgYWxjb2hvbC1iYXNlZCB0aGVybW9tZXRlci48L3RkPjwvdHI+CisJICA8dHI+PHRkPlR5cGU6PC90ZD48dGQ+cmVhbDwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+VW5pdDo8L3RkPjx0ZD5rZWx2aW48L3RkPjwvdHI+CisJICA8dHI+PHRkPkVudW1lcmF0aW9uIGZsYWc6PC90ZD48dGQ+ZmFsc2U8L3RkPjwvdHI+CisJICA8dHI+PHRkPk1pbiB2YWx1ZTo8L3RkPjx0ZD4yODIuMzE8L3RkPjwvdHI+CisJICA8dHI+PHRkPk1heCB2YWx1ZTo8L3RkPjx0ZD4zMDEuNDU8L3RkPjwvdHI+CisJPC90Ym9keT4KKyAgICAgIDwvdGFibGU+CisKKyAgICAgIDxwPldoZW4geW91J3JlIGdlbmVyYXRpbmcgYSBwcm9maWxlIChvciBxdWVyeWluZyBhIHNpbWlsYXIKKwltZXRhZGF0YSBtb2RlbCkgd2l0aCBhIHJhbmdlZCBlbGVtZW50LCBxdWVyaWVzIHNob3VsZCBtYXRjaCBpZgorCXRoZSBzb3VnaHQgdmFsdWUgb2NjdXJzIHdpdGhpbiB0aGUgZ2l2ZW4sIGluY2x1c2l2ZSByYW5nZS4gIElmCisJaXQncyBhIG5lZ2F0aXZlIHF1ZXJ5LCB0aGVuIGl0IHNob3VsZCBtYXRjaCBpZiB0aGUgc291Z2h0CisJdmFsdWUgPGVtPmRvZXNuJ3Q8L2VtPiBvY2N1ciB3aXRoaW4gdGhlIHJhbmdlLgorICAgICAgPC9wPgorCisgICAgICA8cD5IZXJlJ3MgYW4gZXhhbXBsZS4gIFN1cHBvc2UgeW91IGhhdmUgYSByYW5nZWQgcHJvZmlsZSBlbGVtZW50CisJY2FsbGVkIDxjb2RlPmx1bWVuczwvY29kZT4gYW5kIGl0cyBtaW5pbXVtIHZhbHVlIGlzIDEwIGFuZCBpdHMKKwltYXhpbXVtIHZhbHVlIGlzIDIwLiAgSGVyZSdzIGEgdGFibGUgdGhhdCBzaG93cyBxdWVyaWVzIGFuZAorCXdoZXRoZXIgdGhleSBtYXRjaDoKKyAgICAgIDwvcD4KKworICAgICAgPHRhYmxlPgorCTx0aGVhZD4KKwkgIDx0cj48dGg+UXVlcnk8L3RoPjx0aD5NYXRjaD88L3RoPjwvdHI+CisJPC90aGVhZD4KKwk8dGJvZHk+CisJICA8dHI+PHRkPmx1bWVucyA9IDEyPC90ZD48dGQ+WWVzLCBzaW5jZSAxMiBpcyBiZXR3ZWVuIDEwIGFuZCAyMDwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+bHVtZW5zID0gNDU8L3RkPjx0ZD5Obywgc2luY2UgNDUgaXMgYWJvdmUgMjA8L3RkPjwvdHI+CisJICA8dHI+PHRkPmx1bWVucyAhPSAxMjwvdGQ+PHRkPlllcywgc2luY2UgdGhlcmUgYXJlIDxlbT5vdGhlciB2YWx1ZXM8L2VtPiBpbiB0aGUgcmFuZ2UgMTAuLjIwIHRoYXQgbWF0Y2gsIHN1Y2ggYXMgMTMsIDE0LCAxMi4xLCBldGMuPC90ZD48L3RyPgorCSAgPHRyPjx0ZD5sdW1lbnMgIT0gNDU8L3RkPjx0ZD5ZZXMsIHNpbmNlIGFyZSBhbiBpbmZpbml0ZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSByYW5nZSAxMC4uMjIgdGhhdCBhcmUgbm90IDQ1PC90ZD48L3RyPgorCSAgPHRyPjx0ZD5sdW1lbnMgIT0gMTA8L3RkPjx0ZD5ZZXM8L3RkPjwvdHI+CisJICA8dHI+PHRkPmx1bWVucyAmbHQ7IDQ1PC90ZD48dGQ+WWVzPC90ZD48L3RyPgorCSAgPHRyPjx0ZD5sdW1lbnMgJmd0OyAxNTwvdGQ+PHRkPlllczwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+bHVtZW5zICZndDsgMzU8L3RkPjx0ZD5ObzsgdGhlIGhpZ2hlc3QgbHVtZW4gdmFsdWUgaXMgMjA8L3RkPjwvdHI+CisJICA8dHI+PHRkPmx1bWVucyBMSUtFIDEyPC90ZD48dGQ+TWF5YmU8L3RkPjwvdHI+CisJPC90Ym9keT4KKyAgICAgIDwvdGFibGU+CisKKyAgICAgIDxwPlRoZSAiTElLRSIgcmVsYXRpb25hbCBvcGVyYXRvciBkZWZpbmVkIGJ5IHRoZSBYTUxRdWVyeSBxdWVyeQorCWxhbmdhdWdlIHdhcyBtZWFudCBmb3Igc3RyaW5nIGNvbXBhcmlzb25zLCB5ZXQgdGhlcmUncyBub3RoaW5nCisJaW4gdGhlIHNvZnR3YXJlIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBwcmVzZW50ZWQgZm9yCisJcmFuZ2VkIHF1ZXJpZXMuICBUaGUgY2hvaWNlIG9mIHdoZXRoZXIgdG8gbWF0Y2ggaXQgaXMgdXAgdG8geW91LgorICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IlF1ZXJpZXMgQWdhaW5zdCBFbnVtZXJhdGVkIFZhbHVlcyI+CisgICAgICA8cD5FbnVtZXJhdGVkIHByb2ZpbGUgZWxlbWVudHMgYXJlIHRob3NlIHRoYXQgZGVzY3JpYmUgYW4KKwlhdHRyaWJ1dGUgb2YgYSByZXNvdXJjZSdzIGNvbXBvc2l0aW9uIGluIHRlcm1zIG9mIGEgZGlzY3JldGUKKwlsaXN0IG9mIHZhbGlkIHZhbHVlcy4gIEluIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uLCB0aGVyZSdzIGEKKwlzdWJjbGFzcyBvZiA8Y29kZT5Qcm9maWxlRWxlbWVudDwvY29kZT4gdG8gcmVwcmVzZW50IHN1Y2gKKwlyYW5nZXM6IDxjb2RlPkVudW1lcmF0ZWRQcm9maWxlRWxlbWVudDwvY29kZT4uICBJbiB0aGUgWE1MCisJcmVwcmVzZW50YXRpb24sIHRoZSA8Y29kZT4mbHQ7ZWxlbUVudW1GbGFnJmd0OzwvY29kZT4gaXMKKwk8Y29kZT5UPC9jb2RlPiBhbmQgdGhlcmUgYXJlIG9uZSBvciBtb3JlCisJPGNvZGU+Jmx0O2VsZW1WYWx1ZSZndDs8L2NvZGU+IGVsZW1lbnRzLgorICAgICAgPC9wPgorCisgICAgICA8cD5BbiBleGFtcGxlIG9mIGFuIGVudW1lcmF0ZWQgcHJvZmlsZSBlbGVtZW50IG1pZ2h0IGJlOjwvcD4KKyAgICAgIDx0YWJsZT4KKwk8dGJvZHk+CisJICA8dHI+PHRkPk5hbWU6PC90ZD48dGQ+em9uZTwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+RGVzY3JpcHRpb246PC90ZD48dGQ+Q2l0eSBQbGFubmluZyBDb21taXNzaW9uIHpvbmluZyBjb2RlIGZvciBwZXJtaXR0ZWQgbGFuZCB1c2UuPC90ZD48L3RyPgorCSAgPHRyPjx0ZD5UeXBlOjwvdGQ+PHRkPnN0cmluZzwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+VW5pdDo8L3RkPjx0ZD5jb2RlPC90ZD48L3RyPgorCSAgPHRyPjx0ZD5FbnVtZXJhdGlvbiBmbGFnOjwvdGQ+PHRkPnRydWU8L3RkPjwvdHI+CisJICA8dHI+PHRkPlZhbHVlOjwvdGQ+PHRkPkE8L3RkPjwvdHI+CisJICA8dHI+PHRkPlZhbHVlOjwvdGQ+PHRkPkIxPC90ZD48L3RyPgorCSAgPHRyPjx0ZD5WYWx1ZTo8L3RkPjx0ZD5CMjwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+VmFsdWU6PC90ZD48dGQ+QjQ8L3RkPjwvdHI+CisJICA8dHI+PHRkPlZhbHVlOjwvdGQ+PHRkPkM8L3RkPjwvdHI+CisJICA8dHI+PHRkPlZhbHVlOjwvdGQ+PHRkPkg8L3RkPjwvdHI+CisJICA8dHI+PHRkPlZhbHVlOjwvdGQ+PHRkPlBERDwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+VmFsdWU6PC90ZD48dGQ+UjI8L3RkPjwvdHI+CisJICA8dHI+PHRkPlZhbHVlOjwvdGQ+PHRkPlIzPC90ZD48L3RyPgorCSAgPHRyPjx0ZD5WYWx1ZTo8L3RkPjx0ZD5SNDwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+VmFsdWU6PC90ZD48dGQ+UjU8L3RkPjwvdHI+CisJPC90Ym9keT4KKyAgICAgIDwvdGFibGU+CisKKyAgICAgIDxwPldoZW4geW91J3JlIGdlbmVyYXRpbmcgYSBwcm9maWxlIChvciBxdWVyeWluZyBhIHNpbWlsYXIKKwltZXRhZGF0YSBtb2RlbCkgd2l0aCBhbiBlbnVtZXJhdGVkIGVsZW1lbnQsIHF1ZXJpZXMgc2hvdWxkCisJbWF0Y2ggaWYgdGhlIHNvdWdodCB2YWx1ZSBhcHBlYXJzIGFzIG9uZSBvZiB0aGUgbGlzdGVkCisJZWxlbWVudHMuCisgICAgICA8L3A+CisKKyAgICAgIDxwPkhlcmUncyBhbiBleGFtcGxlLiAgU3VwcG9zZSB5b3UgaGF2ZSBhbiBwcm9maWxlIGVsZW1lbnQKKwljYWxsZWQgPGNvZGU+cGxhbmV0PC9jb2RlPiB0aGF0IGhhcyBhcyB2YWxpZCB2YWx1ZXMKKwk8Y29kZT5NZXJjdXJ5PC9jb2RlPiwgPGNvZGU+VmVudXM8L2NvZGU+LCA8Y29kZT5FYXJ0aDwvY29kZT4sCisJYW5kIDxjb2RlPk1hcnM8L2NvZGU+LiAgSGVyZSdzIGEgdGFibGUgdGhhdCBzaG93cyBxdWVyaWVzIGFuZAorCXdoZXRoZXIgdGhleSBtYXRjaDoKKyAgICAgIDwvcD4KKworICAgICAgPHRhYmxlPgorCTx0aGVhZD4KKwkgIDx0cj48dGg+UXVlcnk8L3RoPjx0aD5NYXRjaD88L3RoPjwvdHI+CisJPC90aGVhZD4KKwk8dGJvZHk+CisJICA8dHI+PHRkPnBsYW5ldCA9IE1lcmN1cnk8L3RkPjx0ZD5ZZXM8L3RkPjwvdHI+CisJICA8dHI+PHRkPnBsYW5ldCA9IEp1cGl0ZXI8L3RkPjx0ZD5ObzwvdGQ+PC90cj4KKwkgIDx0cj48dGQ+cGxhbmV0ICE9IE1lcmN1cnk8L3RkPjx0ZD5ZZXMgc2luY2UgRWFydGgsIFZlbnVzLCBhbmQgTWFycyBhcmUgYWxsIG5vdCBNZXJjdXJ5PC90ZD48L3RyPgorCSAgPHRyPjx0ZD5wbGFuZXQgIT0gSnVwaXRlcjwvdGQ+PHRkPlllcyBzaW5jZSB0aGVyZSBhcmUgNCBwbGFuZXRzIHdoaWNoIGFyZSBhbGwgbm90IEp1cGl0ZXI8L3RkPjwvdHI+CisJICA8dHI+PHRkPnBsYW5ldCAmbHQ7IEVhcnRoPC90ZD48dGQ+TWF5YmU8L3RkPjwvdHI+CisJICA8dHI+PHRkPnBsYW5ldCBMSUtFICVFJTwvdGQ+PHRkPlllcywgc2luY2UgYWxsIGZvdXIgcGxhbmV0cyBoYXZlIGFuIEUgaW4gdGhlbSAod2l0aG91dCByZWdhcmQgdG8gY2FzZSk8L3RkPjwvdHI+CisJICA8dHI+PHRkPnBsYW5ldCBOT1RMSUtFICVFJTwvdGQ+PHRkPk5vLCBzaW5jZSBhbGwgZm91ciBwbGFuZXRzIGhhdmUgYW4gRSBpbiB0aGVtPC90ZD48L3RyPgorCTwvdGJvZHk+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8cD5SZWxhdGlvbmFsIG9yZGVyaW5nIGlzIG5vdCBzcGVjaWZpZWQgYnkgdGhlIHByb2ZpbGUgbW9kZWwsIHNvIHdoZXRoZXIKKwlhIHF1ZXJ5IGxpa2UgPGNvZGU+cGxhbmV0ICZsdDsgRWFydGg8L2NvZGU+IG1hdGNoZXMgaXMgdXAgdG8geW91LgorICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IlF1ZXJ5aW5nIEFnYWluc3QgVW5zcGVjaWZpZWQgVmFsdWVzIj4KKyAgICAgIDxwPkFuIHVuc3BlY2lmaWMgcHJvZmlsZSBlbGVtZW50IGluZGljYXRlcyBvbmx5IHRoZQorCTxlbT5wcmVzZW5jZTwvZW0+IG9mIGFuIGF0dHJpYnV0ZSBpbiB0aGUgY29tcG9zaXRpb24gb2YgYQorCXJlc291cmNlLCBhbmQgbm90aGluZyBlbHNlLiAgSW4gdGhlIEphdmEgaW1wbGVtZW50YXRpb24sCisJdGhlcmUncyBhIHN1YmNsYXNzIG9mIDxjb2RlPlByb2ZpbGVFbGVtZW50PC9jb2RlPiB0byByZXByZXNlbnQKKwl0aGlzLCA8Y29kZT5VbnNwZWNpZmllZFByb2ZpbGVFbGVtZW50PC9jb2RlPi4gIEluIHRoZSBYTUwKKwlyZXByZXNlbnRhdGlvbiwgdGhlIDxjb2RlPiZsdDtlbGVtRW51bUZsYWcmZ3Q7PC9jb2RlPiBpcworCTxjb2RlPlQ8L2NvZGU+IGFuZCB0aGVyZSBhcmUgemVybworCTxjb2RlPiZsdDtlbGVtVmFsdWUmZ3Q7PC9jb2RlPiBlbGVtZW50cy4KKyAgICAgIDwvcD4KKworICAgICAgPHA+VW5zcGVjaWZpZWQgcHJvZmlsZSBlbGVtZW50cyBjYW4gYmUgdXNlZnVsIHdoZXJlIHlvdSBoYXZlCisJcHJvZmlsZXMgbm90IGRlc2NyaWJpbmcgc2luZ2xlIHJlc291cmNlcywgYnV0IGVudGlyZQorCWNvbGxlY3Rpb25zIG9mIHJlc291cmNlcy4gIEZvciBleGFtcGxlLCB5b3UgbWF5IGhhdmUgcmFuZ2VkCisJcHJvZmlsZSBlbGVtZW50cyBjYWxsZWQgPGNvZGU+dGVtcGVyYXR1cmU8L2NvZGU+IGZvciBlYWNoCisJdGVtcGVyYXR1cmUgcmVzb3VyY2UuICBCdXQgaWYgdGhlcmUgYXJlIGEgYmlsbGlvbiByZXNvdXJjZXMsCisJdGhlbiBkZXRlcm1pbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBmb3IgdGhlCisJcHJvZmlsZSBvZiB0aGUgZW50aXJlIGNvbGxlY3Rpb24gbWlnaHQgYmUgcGFpbmZ1bCwgaW4gd2hpY2gKKwljYXNlIHlvdSBjYW4gc2F5IHRoYXQgdGhlIGNvbGxlY3Rpb24gaGFzIGEKKwk8Y29kZT50ZW1wZXJhdHVyZTwvY29kZT4gYXR0cmlidXRlIGJ5IHVzaW5nIGFuIHVuc3BlY2lmaWVkCisJcHJvZmlsZSBmb3IgdGhlIGVsZW1lbnQgZm9yIHRoZSBjb2xsZWN0aW9uLgorICAgICAgPC9wPgorCisgICAgICA8cD5RdWVyaWVzIGFnYWluc3QgdW5zcGVjaWZpZWQgZWxlbWVudHMgYWx3YXlzIG1hdGNoLCByZWdhcmRsZXNzCisJd2hhdCB0aGUgcXVlcnkgaXMuCisgICAgICA8L3A+CisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy9zaXRlL3hkb2MvcmVwL2luZGV4LnhtbCBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL3JlcC9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTFjNWQzZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvc2l0ZS94ZG9jL3JlcC9pbmRleC54bWwKQEAgLTAsMCArMSwzMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcg0KK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcg0KK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMNCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QNCit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YNCit0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQNCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlDQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXINCit0aGUgTGljZW5zZS4NCistLT4NCis8ZG9jdW1lbnQ+DQorICA8cHJvcGVydGllcz4NCisgICAgPHRpdGxlPlJlcHJlc2VudGF0aW9uIG9mIFByb2ZpbGVzPC90aXRsZT4NCisgICAgPGF1dGhvciBlbWFpbD0iU2Vhbi5LZWxseUBqcGwubmFzYS5nb3YiPlNlYW4gS2VsbHk8L2F1dGhvcj4NCisgIDwvcHJvcGVydGllcz4NCisNCisgIDxib2R5Pg0KKyAgICA8c2VjdGlvbiBuYW1lPSJSZXByZXNlbnRhdGlvbiBvZiBQcm9maWxlcyI+DQorICAgICAgPHA+V2l0aGluIHRoZSBPT0RUIEZyYW1ld29yaywgcHJvZmlsZXMgYXJlIHJlcHJlc2VudGVkIGFzIFJERg0KKwlkb2N1bWVudHMsIFhNTCBkb2N1bWVudHMsIG9yIEphdmEgb2JqZWN0cy4gVGhlIEphdmEgUHJvZmlsZQ0KKwljbGFzcyBjYW4geWllbGQgaXRzZWxmIGFzIGFuIFJERiBvciBYTUwgZG9jdW1lbnQsIGFuZCB5b3UgY2FuDQorCWNvbnN0cnVjdCBhIEphdmEgUHJvZmlsZSBmcm9tIGFuIFhNTCBkb2N1bWVudCB0aGF0IGRlc2NyaWJlcyBhDQorCXByb2ZpbGUuDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+DQorICAgICAgPHA+Tm8gbWF0dGVyIHdoYXQgdGhlaXIgb3JpZ2luIG9yIHdoZXRoZXIgdGhleSdyZSB0byBiZSBzaG9ydA0KKwlsaXZlZCwgcHJvZmlsZXMgaGF2ZSBhIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIGF0IG9uZSB0aW1lDQorCXdpdGhpbiB0aGUgT09EVCBmcmFtZXdvcmsuICBUeXBpY2FsbHksIHlvdSdsbCB1c2UgdGhlIEphdmEgY2xhc3MNCisJPGNvZGU+UHJvZmlsZTwvY29kZT4gd2hlbiB3b3JraW5nIHdpdGggSmF2YSwgb3IgdGhlDQorCVJERiBvciBYTUwgZG9jdW1lbnQgdmVyc2lvbiB3aGVuIHdvcmtpbmcgaW4gb3RoZXIgZW52aXJvbm1lbnRzLg0KKwlUaGUgUkRGIHJlcHJlc2VudGF0aW9uIHVzZXMgdGhlIFJERiBYTUwgc3RydWN0dXJlIGFuZCBSREYgc2NoZW1hDQorCXRvIGRlc2NyaWJlIHByb2ZpbGVzLiAgVGhlIFhNTCBkb2N1bWVudCB2ZXJzaW9uIHVzZXMgYW4NCisJT09EVC1zcGVjaWZpYyBYTUwgdm9jYWJ1bGFyeSBhbmQgRFRELg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8cD48ZW0+Rm9yIEMvQysrIFVzZXJzOjwvZW0+IFRoZXJlIGlzIG5vdCB5ZXQgYSBDL0MrKyByZXByZXNlbnRhdGlvbiBvZiBhIHByb2ZpbGUuDQorCVVzZSB0aGUgUkRGIG9yIFhNTCByZXByZXNlbnRhdGlvbi4NCisgICAgICA8L3A+DQorDQorICAgICAgPHA+PGVtPk5vdGU6PC9lbT5UaGUgUkRGIHJlcHJlc2VudGF0aW9uIGlzIGN1cnJlbnRseSBhIHdvcmstaW4tcHJvZ3Jlc3MuDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPklmIHlvdSdyZSBkZXZlbG9waW5nIGEgbmV3IGtpbmQgb2YgcHJvZmlsZSBzZXJ2ZXIsIHlvdQ0KKwlzaG91bGQgYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIEphdmENCisJPGNvZGU+UHJvZmlsZTwvY29kZT4gY2xhc3MuICBJZiB5b3UncmUgc2VhcmNoaW5nIGZvcg0KKwlwcm9maWxlcywgeW91IGNhbiBqdXN0IHVzZSB0aGUgUkRGIG9yIFhNTCByZXByZXNlbnRhdGlvbnMuDQorICAgICAgPC9wPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IlhNTCBQcm9maWxlcyI+DQorICAgICAgPHA+UHJvZmlsZXMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIFhNTCBkb2N1bWVudHMgdGhhdCBjb25mb3JtIHRvDQorCXRoZSBPT0RUIFByb2ZpbGUgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIChEVEQpLiAgVGhlIEZvcm1hbA0KKwlQdWJsaWMgSWRlbnRpZmllciBvZiB0aGUgT09EVCBQcm9maWxlIERURCBpcyA8Y29kZT4tLy9KUEwvL0RURA0KKwlQcm9maWxlIDEuMC8vRU48L2NvZGU+LiAgVGhlIG5vcm1hdGl2ZSBTeXN0ZW0gSWRlbnRpZmllciBpcw0KKwk8YT5odHRwOi8vb29kdC5qcGwubmFzYS5nb3YvZ3JpZC1wcm9maWxlL2R0ZC9wcm9mLmR0ZDwvYT4uDQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxwPkFsdGhvdWdoIHlvdSBzaG91bGQgcmVmZXIgdG8gdGhlIG5vcm1hdGl2ZSBTeXN0ZW0NCisJSWRlbnRpZmllciBmb3IgdGhlIGxhdGVzdCByZWZlcmVuY2UgdmVyc2lvbiwgc2VlIHRoZSBmb2xsb3dpbmc6DQorICAgICAgPC9wPg0KKw0KKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbPCFFTEVNRU5UIHByb2ZpbGVzDQorICAocHJvZmlsZSopPg0KKw0KKzwhRUxFTUVOVCBwcm9maWxlDQorICAocHJvZkF0dHJpYnV0ZXMsDQorICAgcmVzQXR0cmlidXRlcywNCisgICBwcm9mRWxlbWVudCopPg0KKw0KKyAgICA8IUVMRU1FTlQgcHJvZkF0dHJpYnV0ZXMNCisgICAgICAocHJvZklkLCBwcm9mVmVyc2lvbj8sIHByb2ZUeXBlLA0KKyAgICAgICBwcm9mU3RhdHVzSWQsIHByb2ZTZWN1cml0eVR5cGU/LCBwcm9mUGFyZW50SWQ/LCBwcm9mQ2hpbGRJZCosDQorICAgICAgIHByb2ZSZWdBdXRob3JpdHk/LCBwcm9mUmV2aXNpb25Ob3RlKik+DQorDQorICAgIDwhRUxFTUVOVCByZXNBdHRyaWJ1dGVzDQorICAgICAgKElkZW50aWZpZXIsIFRpdGxlPywgRm9ybWF0KiwgRGVzY3JpcHRpb24/LCBDcmVhdG9yKiwgU3ViamVjdCosDQorICAgICAgIFB1Ymxpc2hlciosIENvbnRyaWJ1dG9yKiwgRGF0ZSosIFR5cGUqLCBTb3VyY2UqLA0KKyAgICAgICBMYW5ndWFnZSosIFJlbGF0aW9uKiwgQ292ZXJhZ2UqLCBSaWdodHMqLA0KKyAgICAgICByZXNDb250ZXh0KywgcmVzQWdncmVnYXRpb24/LCByZXNDbGFzcywgcmVzTG9jYXRpb24qKT4NCisNCisgICAgPCFFTEVNRU5UIHByb2ZFbGVtZW50DQorICAgICAgKGVsZW1JZD8sIGVsZW1OYW1lLCBlbGVtRGVzYz8sIGVsZW1UeXBlPywgZWxlbVVuaXQ/LCANCisgICAgICAgZWxlbUVudW1GbGFnLCAoZWxlbVZhbHVlKiB8IChlbGVtTWluVmFsdWUsIGVsZW1NYXhWYWx1ZSkpLA0KKyAgICAgICBlbGVtU3lub255bSosDQorICAgICAgIGVsZW1PYmxpZ2F0aW9uPywgZWxlbU1heE9jY3VycmVuY2U/LCBlbGVtQ29tbWVudD8pPg0KKw0KKyAgICA8IUVMRU1FTlQgcHJvZklkICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHByb2ZWZXJzaW9uICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHByb2ZUeXBlICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHByb2ZQYXJlbnRJZCAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBwcm9mQ2hpbGRJZCAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBwcm9mU3RhdHVzSWQgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgcHJvZlNlY3VyaXR5VHlwZSAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBwcm9mUmVnQXV0aG9yaXR5ICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHByb2ZSZXZpc2lvbk5vdGUgKCNQQ0RBVEEpPg0KKw0KKyAgICA8IUVMRU1FTlQgSWRlbnRpZmllciAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBUaXRsZSAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBGb3JtYXQgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgRGVzY3JpcHRpb24gKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgQ3JlYXRvciAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBTdWJqZWN0ICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIFB1Ymxpc2hlciAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBDb250cmlidXRvciAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBEYXRlICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIFR5cGUgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgU291cmNlICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIExhbmd1YWdlICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIFJlbGF0aW9uICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIENvdmVyYWdlICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIFJpZ2h0cyAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCByZXNDb250ZXh0ICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHJlc0FnZ3JlZ2F0aW9uICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHJlc0NsYXNzICgjUENEQVRBKT4NCisgICAgPCFFTEVNRU5UIHJlc0xvY2F0aW9uICgjUENEQVRBKT4NCisNCisgICAgPCFFTEVNRU5UIGVsZW1JZCAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBlbGVtTmFtZSAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBlbGVtVHlwZSAoI1BDREFUQSk+DQorICAgIDwhRUxFTUVOVCBlbGVtRW51bUZsYWcgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgZWxlbURlc2MgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgZWxlbVN5bm9ueW0gKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgZWxlbVVuaXQgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgZWxlbVZhbHVlICgjUENEQVRBKT4JDQorICAgIDwhRUxFTUVOVCBlbGVtTWluVmFsdWUgKCNQQ0RBVEEpPgkNCisgICAgPCFFTEVNRU5UIGVsZW1NYXhWYWx1ZSAoI1BDREFUQSk+CQ0KKyAgICA8IUVMRU1FTlQgZWxlbU9ibGlnYXRpb24gKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgZWxlbU1heE9jY3VycmVuY2UgKCNQQ0RBVEEpPg0KKyAgICA8IUVMRU1FTlQgZWxlbUNvbW1lbnQgKCNQQ0RBVEEpPl1dPjwvc291cmNlPg0KKw0KKw0KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbGxlY3Rpb25zIG9mIFByb2ZpbGVzIj4NCisJPHA+QXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgYWJvdmUsYW4NCisJICBYTUwgZWxlbWVudCwgPGNvZGU+cHJvZmlsZXM8L2NvZGU+IGlzIGENCisJICBjb250YWluZXIgZWxlbWVudCB0byBob2xkIHplcm8gb3IgbW9yZSBwcm9maWxlcy4gIFVzZSB0aGlzDQorCSAgZWxlbWVudCB3aGVyZSBpdCdzIG5lY2Vzc2FyeSB0byBtYW5pcHVsYXRlIGEgY29sbGVjdGlvbiBvZg0KKwkgIHByb2ZpbGVzIHdpdGhvdXQgcmVnYXJkIHRvIG9yZGVyLg0KKwk8L3A+DQorICAgICAgPC9zdWJzZWN0aW9uPg0KKyAgICA8L3NlY3Rpb24+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IkphdmEgUmVwcmVzZW50YXRpb24gb2YgUHJvZmlsZXMiPg0KKyAgICAgIDxwPlRoZSBPT0RUIHNvdXJjZSBjb2RlIGluY2x1ZGVzIGEgY2xhc3MNCisJPGNvZGU+anBsLmVkYS5wcm9maWxlLlByb2ZpbGU8L2NvZGU+IGZvciBvYmplY3QNCisJcmVwcmVzZW5hdGlvbiBvZiBhIHByb2ZpbGUuICBZb3UgY2FuIGNvbnN0cnVjdCBhDQorCTxjb2RlPlByb2ZpbGU8L2NvZGU+IG9iamVjdCBmcm9tIGFuIFJERiBvciBYTUwNCisJZG9jdW1lbnQgb3IgY3JlYXRlIGEgYmxhbmsgb25lIHRvIHBvcHVsYXRlIHdpdGggbWV0YWRhdGENCisJbGF0ZXIuDQorICAgICAgPC9wPg0KKyAgICAgIDxwPlRvIGNvbnN0cnVjdCBhIG5ldywgYmxhbmsgcHJvZmlsZSwgdXNlIHRoZSBuby1hcmd1bWVudHMNCisJY29uc3RydWN0b3IuICBUbyBjb25zdHJ1Y3QgYSBwcm9maWxlIGZyb20gYW4gUkRGIG9yIFhNTA0KKwlkb2N1bWVudCwgdXNlIHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRpbmcgYSBSZXNvdXJjZSBvciBhIERPTQ0KKwk8Y29kZT5Ob2RlPC9jb2RlPiwgcmVzcGVjdGl2ZWx5LiAgVGhlIERPTSBub2RlDQorCXNob3VsZCBiZSBhIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUNCisJPGNvZGU+cHJvZmlsZTwvY29kZT4gZWxlbWVudC4NCisJQWx0ZXJuYXRpdmVseSwgaWYgeW91ciBYTUwgZG9jdW1lbnQgZXhpc3RzIGFzIGEgc3RyaW5nLCBjYWxsDQorCXRoZSBjb25zdHJ1Y3RvciB0YWtpbmcgYSBzaW5nbGUgc3RyaW5nLg0KKyAgICAgIDwvcD4NCisNCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBY2Nlc3NpbmcgUHJvZmlsZSBNZXRhZGF0YSI+DQorCTxwPlRvIGFjY2VzcyB0aGUgbWV0YWRhdGEgb2YgYSBwcm9maWxlLCBjYWxsIHRoZSBtZXRob2RzIHRvDQorCSAgcmV0cmlldmUgdGhlIHByb2ZpbGUgYXR0cmlidXRlcywgdGhlIHJlc291cmNlIGF0dHJpYnV0ZXMsIG9yDQorCSAgdGhlIHByb2ZpbGUgZWxlbWVudHMuDQorCTwvcD4NCisNCisJPHN1YnNlY3Rpb24gbmFtZT0iQWNjZXNzaW5nIHRoZSBQcm9maWxlIEF0dHJpYnV0ZXMiPg0KKwkgIDxwPllvdSByZXRyaWV2ZSB0aGUgcHJvZmlsZSBhdHRyaWJ1dGVzIGJ5IGNhbGxpbmcNCisJICAgIDxjb2RlPmdldFByb2ZpbGVBdHRyaWJ1dGVzPC9jb2RlPiBvbiBhDQorCSAgICA8Y29kZT5Qcm9maWxlPC9jb2RlPi4gIFRoaXMgcmV0dXJucyBhbg0KKwkgICAgPGNvZGU+UHJvZmlsZUF0dHJpYnV0ZXM8L2NvZGU+IG9iamVjdCB3aGljaCBwcm92aWRlcw0KKwkgICAgbWV0aG9kcyB0byBnZXQgYW5kIHNldCB0aGUgdmFyaW91cyBhdHRyaWJ1dGVzLiAgU2V0dGluZyBhDQorCSAgICB2YWx1ZSBzZXRzIGl0IGZvciB0aGUgPGNvZGU+UHJvZmlsZTwvY29kZT4gdG8gd2hpY2gNCisJICAgIHRoZSA8Y29kZT5Qcm9maWxlQXR0cmlidXRlczwvY29kZT4gYmVsb25ncy4NCisJICA8L3A+DQorCSAgDQorCSAgPHA+QSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYW4gb3B0aW9uYWwNCisJICAgIGF0dHJpYnV0ZSBtZWFucyB0aGUgdmFsdWUgaXNuJ3Qgc2V0Lg0KKwkgIDwvcD4NCisJPC9zdWJzZWN0aW9uPg0KKw0KKwk8c3Vic2VjdGlvbiBuYW1lPSJBY2Nlc3NpbmcgdGhlIFJlc291cmNlIEF0dHJpYnV0ZXMiPg0KKwkgIDxwPllvdSByZXRyaWV2ZSB0aGUgcmVzb3VyY2UgYXR0cmlidXRlcyBzaW1pbGFybHkgYXMgZm9yDQorCSAgICBwcm9maWxlIGF0dHJpYnV0ZXMsIGNhbGxpbmcNCisJICAgIDxjb2RlPmdldFJlc291cmNlQXR0cmlidXRlczwvY29kZT4gdG8geWllbGQgYQ0KKwkgICAgPGNvZGU+UmVzb3VyY2VBdHRyaWJ1dGVzPC9jb2RlPiBvYmplY3QuDQorCSAgPC9wPg0KKwkgIDxwPlRoZSA8Y29kZT5SZXNvdXJjZUF0dHJpYnV0ZXM8L2NvZGU+IGhhcw0KKwkgICAgbWV0aG9kcyB0byBnZXQgYW5kIHNldCB2YXJpb3VzIGF0dHJpYnV0ZXMuICBOb3RlIHRoYXQgbWFueQ0KKwkgICAgb2YgdGhlIGF0dHJpYnV0ZXMgYXJlIG11bHRpLXZhbHVlZC4gIEZvciBleGFtcGxlLCB0aGUNCisJICAgIHJlc291cmNlIHByb2ZpbGVkIHdpbGwgbGlrZWx5IGNvdmVyIHNldmVyYWwgc3ViamVjdHMuICBJbg0KKwkgIHRoaXMgY2FzZSwgdGhlICJnZXQiIG1ldGhvZCwNCisJICA8Y29kZT5nZXRTdWJqZWN0czwvY29kZT4sIHJldHVybnMgYQ0KKwkgIDxjb2RlPmphdmEudXRpbC5MaXN0PC9jb2RlPiBvZg0KKwkgIDxjb2RlPlN0cmluZzwvY29kZT5zLiAgVGhlcmUgaXMgbm8gc2V0IG1ldGhvZC4NCisJICAgIEluc3RlYWQsIHlvdSBqdXN0IG1hbmlwdWxhdGUgdGhlIGxpc3QgdG8gYWRkIGFuZCByZW1vdmUNCisJICAgIHN1YmplY3RzLg0KKwkgIDwvcD4NCisNCisJICA8cD48ZW0+Tm90ZTo8L2VtPiBBbGwgb2YgdGhlICJnZXQiIGZ1bmN0aW9ucyB0aGF0IHJldHVybg0KKwkgICAgPGNvZGU+TGlzdDwvY29kZT5zIHJldHVybiBsaXN0cyBvZg0KKwkgICAgPGNvZGU+U3RyaW5nPC9jb2RlPnMsIGV4Y2VwdCBmb3INCisJICAgIDxjb2RlPmdldERhdGVzPC9jb2RlPiwgd2hpY2ggcmV0dXJucyBhIGxpc3Qgb2YNCisJICAgIDxjb2RlPmphdmEudXRpbC5EYXRlPC9jb2RlPnMuDQorCSAgPC9wPg0KKw0KKwkgIDxwPkZvciBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBzaW5nbHkgdmFsdWVkLCB0aGVyZSBpcw0KKwkgICAgYm90aCBhIHNldCBhbmQgZ2V0IG1ldGhvZC4gIEZvciBvcHRpb25hbCB2YWx1ZXMsIGEgdmFsdWUgb2YNCisJICAgIDxjb2RlPm51bGw8L2NvZGU+IG1lYW5zIHRoZSBhdHRyaWJ1dGUgaXNuJ3Qgc2V0Lg0KKwkgIDwvcD4NCisJPC9zdWJzZWN0aW9uPg0KKw0KKwk8c3Vic2VjdGlvbiBuYW1lPSJBY2Nlc3NpbmcgdGhlIFByb2ZpbGUgRWxlbWVudHMiPg0KKwkgIDxwPlRoZSBwcm9maWxlIHN0b3JlcyBpdHMgcHJvZmlsZSBlbGVtZW50cyBpbiBhDQorCSAgICA8Y29kZT5qYXZhLnV0aWwuTWFwPC9jb2RlPiwgbWFwcGluZyB0aGUgbmFtZSBvZg0KKwkgICAgdGhlIHByb2ZpbGUgZWxlbWVudCAoYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+KSB0bw0KKwkgICAgYW4gb2JqZWN0IG9mIGNsYXNzIDxjb2RlPlByb2ZpbGVFbGVtZW50PC9jb2RlPi4NCisJICAgIFRvIGFjY2VzcyB0aGlzIG1hcCwgY2FsbCB0aGUgbWV0aG9kDQorCSAgICA8Y29kZT5nZXRQcm9maWxlRWxlbWVudHM8L2NvZGU+IG9uIGENCisJICAgIDxjb2RlPlByb2ZpbGU8L2NvZGU+LiAgQmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zDQorCSAgICBhIHJlZmVyZW5jZSB0byB0aGUgPGNvZGU+UHJvZmlsZTwvY29kZT4ncyBtYXAsIGFueQ0KKwkgICAgdXBkYXRlcyB0byB0aGUgbWFwIGFmZmVjdCB0aGUgcHJvZmlsZSBpbW1lZGlhdGVseS4NCisJICA8L3A+DQorDQorCSAgPHA+PGVtPkNhdXRpb246PC9lbT4gTmV2ZXIgc3RvcmUgYW55dGhpbmcgYnV0DQorCSAgICA8Y29kZT5TdHJpbmc8L2NvZGU+cyBhcyBrZXlzIGFuZA0KKwkgICAgPGNvZGU+UHJvZmlsZUVsZW1lbnQ8L2NvZGU+cyAob3Igb2JqZWN0cyBvZiBpdHMNCisJICAgIHN1YmNsYXNzZXMpIGFzIHZhbHVlcyBpbiBhIHByb2ZpbGUgZWxlbWVudCBtYXAuICBUaGUNCisJICAgIHNvZnR3YXJlIHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5IGlmIGFueSBvdGhlciBraW5kIG9mDQorCSAgICBvYmplY3QgaXMgc3RvcmVkLg0KKwkgIDwvcD4NCisNCisJICA8c3Vic2VjdGlvbiBuYW1lPSJDb21tb24gQXR0cmlidXRlcyBvZiBQcm9maWxlIEVsZW1lbnRzIj4NCisJICAgIDxwPlRoZSBjbGFzcw0KKwkgICAgICA8Y29kZT5qcGwuZWRhLnByb2ZpbGUuUHJvZmlsZUVsZW1lbnQ8L2NvZGU+DQorCSAgICAgIGNvbnRhaW5zIHRoZSBjb21tb24gcGFydHMgb2YgZXZlcnkgcHJvZmlsZSBlbGVtZW50LCBzdWNoDQorCSAgICAgIGFzIGl0cyByZXF1aXJlZCBuYW1lLCBpdHMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCBzbw0KKwkgICAgICBmb3J0aC4gIFVzZSB0aGUgdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGFueQ0KKwkgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgdGhhdCdzIHVuc2V0Lg0KKwkgICAgPC9wPg0KKwkgICAgPHA+VGhlIDxjb2RlPlByb2ZpbGVFbGVtZW50PC9jb2RlPiBzdG9yZXMgaXRzDQorCSAgICAgIHN5bm9ueW1zIGFzIGEgPGNvZGU+amF2YS51dGlsLkxpc3Q8L2NvZGU+IG9mDQorCSAgICAgIDxjb2RlPlN0cmluZzwvY29kZT5zLiAgTWFuaXB1bGF0ZSB0aGUgbGlzdA0KKwkgICAgICBkaXJlY3RseSB0byBhZGQgb3IgcmVtb3ZlIHN5bm9ueW1zLg0KKwkgICAgPC9wPg0KKwkgICAgPHA+VGhlIDxjb2RlPlByb2ZpbGVFbGVtZW50PC9jb2RlPiBjbGFzcyBpcw0KKwkgICAgICBhYnN0cmFjdC4gIFRvIGNyZWF0ZSBuZXcgcHJvZmlsZSBlbGVtZW50cyBmb3IgYSBwcm9maWxlLA0KKwkgICAgICB5b3UgbmVlZCB0byBjcmVhdGUgb2JqZWN0cyBvZiBvbmUgb2YgdGhlIGNvbmNyZXRlDQorCSAgICAgIDxjb2RlPlByb2ZpbGVFbGVtZW50PC9jb2RlPiBzdWJjbGFzc2VzOg0KKwkgICAgPC9wPg0KKw0KKwkgICAgPHVsPg0KKwkgICAgICA8bGk+PGNvZGU+RW51bWVyYXRlZFByb2ZpbGVFbGVtZW50PC9jb2RlPjwvbGk+DQorCSAgICAgIDxsaT48Y29kZT5SYW5nZWRQcm9maWxlRWxlbWVudDwvY29kZT48L2xpPg0KKwkgICAgICA8bGk+PGNvZGU+VW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudDwvY29kZT48L2xpPg0KKwkgICAgPC91bD4NCisNCisJICAgIDxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGV0YWlsIGVhY2gga2luZCBvZiBwcm9maWxlDQorCSAgICAgIGVsZW1lbnQuDQorCSAgICA8L3A+DQorCSAgPC9zdWJzZWN0aW9uPg0KKw0KKwkgIDxzdWJzZWN0aW9uIG5hbWU9IkVsZW1lbnRzIHdpdGggRW51bWVyYXRlZCBWYWx1ZXMiPg0KKwkgICAgPHA+Rm9yIHByb2ZpbGUgZWxlbWVudHMgdGhhdCBtYWludGFpbiBhIHNwZWNpZmllZCBsaXN0IG9mDQorCSAgICAgIHZhbGlkIHZhbHVlcywgdXNlIHRoZQ0KKwkgICAgICA8Y29kZT5FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQ8L2NvZGU+IGNsYXNzLg0KKwkgICAgICBPYmplY3RzIG9mIHRoaXMgY2xhc3MgbWFpbnRpYW4gYQ0KKwkgICAgICA8Y29kZT5qYXZhLnV0aWwuTGlzdDwvY29kZT4gb2YgdmFsdWVzLiAgWW91IGNhbg0KKwkgICAgICBwYXNzIGluIGEgbGlzdCBvZiB2YWx1ZXMgd2hlbiBjb25zdHJjdXRpbmcgdGhlIG9iamVjdCwgb3INCisJICAgICAgY2FuIGNhbGwgdGhlIDxjb2RlPmdldFZhbHVlczwvY29kZT4gbWV0aG9kIGFuZA0KKwkgICAgICBtYW5pcHVsYXRlIHRoZSBsaXN0IGRpcmVjdGx5Lg0KKwkgICAgPC9wPg0KKwkgICAgPHA+UXVlcmllcyB0aGF0IGFycml2ZSBmb3IgYW4gZW51bWVyYXRlZCBwcm9maWxlDQorCSAgICAgIGVsZW1lbnQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGxpc3RlZCBlbGVtZW50cyBleGFjdGx5DQorCSAgICAgIHVubGVzcyBpdCdzIGEgbmVnYXRpdmUgKG5vdC1lcXVhbC10bykgcXVlcnkuICBGb3INCisJICAgICAgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYWQgYW4gZW51bWVyYXRlZCBwcm9maWxlIGVsZW1lbnQNCisJICAgICAgPGNvZGU+ZmlsdGVyPC9jb2RlPiB3aXRoIHZhbHVlcw0KKwkgICAgICA8Y29kZT5pbmZyYXJlZDwvY29kZT4sIDxjb2RlPnZpc2libGU8L2NvZGU+LA0KKwkgICAgICBhbmQgPGNvZGU+dWx0cmF2aW9sZXQ8L2NvZGU+LiAgQSBxdWVyeSBhc2tpbmcgZm9yDQorCSAgICAgIGEgZmlsdGVyIGVxdWFsIHRvIGluZnJhcmVkIHNob3VsZCBtYXRjaCwgYXMgd2VsbCBhcyBhDQorCSAgICAgIHF1ZXJ5IGFza2luZyBmb3IgYSBmaWx0ZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvDQorCSAgICAgIGluZnJhcmVkLiAgQSBxdWVyeSBhc2tpbmcgZm9yIGEgZmlsdGVyIG5vdCBlcXVhbCB0bw0KKwkgICAgICBpbmZyYXJlZCBzaG91bGRuJ3QgbWF0Y2gsIHdoaWxlIGEgcXVlcnkgYXNraW5nIGZvciBhDQorCSAgICAgIGZpbHRlciBub3QgZXF1YWwgdG8geC1yYXkgc2hvdWxkIG1hdGNoLg0KKwkgICAgPC9wPg0KKwkgIDwvc3Vic2VjdGlvbj4NCisNCisJICA8c3Vic2VjdGlvbiBuYW1lPSJFbGVtZW50cyB3aXRoIGEgUmFuZ2Ugb2YgVmFsdWVzIj4NCisJICAgIDxwPllvdSBjYW4gcmVwcmVzZW50IHByb2ZpbGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgcmFuZ2UNCisJICAgICAgb2YgdmFsaWQgdmFsdWVzIHdpdGggdGhlDQorCSAgICAgIDxjb2RlPlJhbmdlZFByb2ZpbGVFbGVtZW50PC9jb2RlPiBjbGFzcy4NCisJICAgICAgQ29uc3RydWN0IHRoaXMgY2xhc3Mgd2l0aCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMsDQorCSAgICAgIHdoaWNoIG11c3QgYmUgbnVtZXJpYy4NCisJICAgIDwvcD4NCisJICAgIDxwPlVzZSB0aGUgPGNvZGU+Z2V0TWluVmFsdWU8L2NvZGU+IHRvIGdldCB0aGUNCisJICAgICAgbWluaW11bSB2YWx1ZSBhbmQgPGNvZGU+Z2V0TWF4VmFsdWU8L2NvZGU+IHRvDQorCSAgICAgIGdldCB0aGUgbWF4aW11bSB2YWx1ZS4NCisJICAgIDwvcD4NCisJICAgIDxwPlF1ZXJ5aW5nIGEgcHJvZmlsZSB0aGF0IHVzZXMgYSByYW5nZSBvZiB2YWx1ZXMNCisJICAgICAgY29uc2lkZXJzIHRoZSByYW5nZSBhcyBpbmNsdXNpdmUuICBGb3IgZXhhbXBsZSwgc3VwcG9zZQ0KKwkgICAgICB0aGUgcmFuZ2VkIHByb2ZpbGUgZWxlbWVudA0KKwkgICAgICA8Y29kZT50ZW1wZXJhdHVyZTwvY29kZT4gaGFzIGEgbWluaW11bSB2YWx1ZSBvZiAzMg0KKwkgICAgICBhbmQgYSBtYXhpbXVtIHZhbHVlIG9mIDIxMi4gIEEgcXVlcnkgdGhhdCByZXF1ZXN0cw0KKwkgICAgICB0ZW1wZXJhdHVyZXMgbGVzcyB0aGFuIDMyIHNob3VsZG4ndCBtYXRjaCwgYnV0IGxlc3MgdGhhbiBvcg0KKwkgICAgICBlcXVhbCB0byAzMiBzaG91bGQgbWF0Y2guDQorCSAgICA8L3A+DQorCSAgPC9zdWJzZWN0aW9uPg0KKw0KKwkgIDxzdWJzZWN0aW9uIG5hbWU9IkVsZW1lbnRzIHdpdGggbm8gU3BlY2lmaWVkIFZhbHVlcyI+DQorCSAgICA8cD5Gb3IgcHJvZmlsZSBlbGVtZW50cyB0aGF0IHlvdSBhbHdheXMgd2FudCB0byBtYXRjaCBhDQorCSAgICAgIHF1ZXJ5IHdpdGhvdXQgZXhwbGljaXRseSBsaXN0aW5nIGVhY2ggdmFsaWQgdmFsdWUgb3IgYQ0KKwkgICAgICByYW5nZSBvZiBsZWdhbCBudW1lcmljIHZhbHVlcyB5b3UgY2FuIHVzZSB0aGUgY2xhc3MNCisJICAgICAgPGNvZGU+VW5zcGVjaWZpZWRQcm9maWxlRWxlbWVudDwvY29kZT4uICBUaGlzDQorCSAgICAgIGNsYXNzIGlkZW50aWZpZXMgYW4gZWxlbWVudCB3aXRoIG5vIHJhbmdlIG9yIGxpc3Qgb2YNCisJICAgICAgdmFsaWQgdmFsdWVzLg0KKwkgICAgPC9wPg0KKwkgICAgPHA+UXVlcmllcyB0aGF0IGFycml2ZSBhdCBzdWNoIGFuIGVsZW1lbnQgd2lsbA0KKwkgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5hbHdheXM8L2VtPjwvc3Bhbj4gbWF0Y2gsIGV2ZW4gaWYgdGhleSdyZQ0KKwkgICAgICBuZWdhdGl2ZSAobm90LWVxdWFsLXRvKSBxdWVyaWVzLg0KKwkgICAgPC9wPg0KKwkgIDwvc3Vic2VjdGlvbj4NCisJPC9zdWJzZWN0aW9uPg0KKyAgICAgIDwvc3Vic2VjdGlvbj4NCisgICAgPC9zZWN0aW9uPg0KKyAgPC9ib2R5Pg0KKzwvZG9jdW1lbnQ+DQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50VGVzdC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWE3OWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9FbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uTnVsbE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvKioKKyAqIFVuaXQgdGVzdCB0aGUge0BsaW5rIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudH0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudFRlc3QgZXh0ZW5kcyBQcm9maWxlRWxlbWVudFRlc3RDYXNlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnR9IGNsYXNzLgorCSAqLworCXB1YmxpYyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnRUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByb3RlY3RlZCBQcm9maWxlRWxlbWVudCBjcmVhdGVQcm9maWxlRWxlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQoUHJvZmlsZVRlc3QuVEVTVF9QUk9GSUxFLCAibmFtZSIsICJpZCIsICJkZXNjIiwgInR5cGUiLCAidW5pdCIsCisJCQkvKnN5bm9ueW1zKi8gbmV3IEFycmF5TGlzdCgpLCAvKm9ibGlnYXRpb24qL2ZhbHNlLCAvKm1heE9jY3VycmVuY2UqLzEsICJjb21tZW50IiwgVkFMVUVTKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SXQoKSB7CisJCVByb2ZpbGVFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVQcm9maWxlRWxlbWVudCgpOworCQlMaXN0IHZhbHVlcyA9IGVsZW1lbnQuZ2V0VmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygzLCB2YWx1ZXMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCIxIiwgdmFsdWVzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscygiMiIsIHZhbHVlcy5nZXQoMSkpOworCQlhc3NlcnRFcXVhbHMoIjMiLCB2YWx1ZXMuZ2V0KDIpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB7CisJCXRyeSB7CisJCQlFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQoY3JlYXRlUHJvZmlsZUVsZW1lbnQoKS5nZXRQcm9maWxlKCksCisJCQkJInRlc3QiLCAidGVzdCIsICJ0ZXN0IiwgInRlc3QiLCAidGVzdCIsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIC8qb2JsaWdhdGlvbiovdHJ1ZSwgLyptYXhPY2N1ciovMSwKKwkJCQkiY29tbWVudCIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobnVsbCkpOworCQkJZmFpbCgiTnVsbCB2YWx1ZXMgbXVzdCBub3QgYmUgYWxsb3dlZCBhcyB2YWx1ZXMgaW4gZW51bWVyYXRlZCBlbGVtZW50cy4iKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGdvb2QpIHt9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tFbnVtRmxhZyhTdHJpbmcgdGV4dCkgeworCQlhc3NlcnRFcXVhbHMoIlQiLCB0ZXh0KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1ZhbHVlKFN0cmluZyB0ZXh0KSB7CisJCWFzc2VydFRydWUoVkFMVUVTLmNvbnRhaW5zKHRleHQpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja01heFZhbHVlKFN0cmluZyB0ZXh0KSB7CisJCWZhaWwoIkVudW1lcmF0ZWQgcHJvZmlsZSBlbGVtZW50IHNob3VsZG4ndCBoYXZlIGEgbWF4aW11bSB2YWx1ZSIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrTWluVmFsdWUoU3RyaW5nIHRleHQpIHsKKwkJZmFpbCgiRW51bWVyYXRlZCBwcm9maWxlIGVsZW1lbnQgc2hvdWxkbid0IGhhdmUgYSBtaW5pbXVtIHZhbHVlIik7CisJfQorCisJLyoqCisJICogVGVzdCB0byBzZWUgaWYgc3BhY2VzIGFyZSBwcmVzZXJ2ZWQgaW4gWE1MIGdlbmVyYXRpb24gYW5kIHBhcnNpbmcuCisJICoKKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNwYWNlUHJlc2VydmluZygpIHRocm93cyBTQVhFeGNlcHRpb24geworCQlQcm9maWxlIHAgPSBuZXcgUHJvZmlsZSgpOworCQlQcm9maWxlQXR0cmlidXRlcyBwYSA9IG5ldyBQcm9maWxlQXR0cmlidXRlcygiMSIsICIxIiwgInByb2ZpbGUiLCAiYWN0aXZlIiwgIjEiLCAiMSIsCisJCQkvKmNoaWxkcmVuKi9Db2xsZWN0aW9ucy5FTVBUWV9MSVNULCAiMSIsIC8qcmV2Tm90ZXMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQlwLnNldFByb2ZpbGVBdHRyaWJ1dGVzKHBhKTsKKwkJUmVzb3VyY2VBdHRyaWJ1dGVzIHJhID0gbmV3IFJlc291cmNlQXR0cmlidXRlcyhwLCAiaWQiLCAidGl0bGUiLCAvKmZvcm1hdHMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsICJkZXNjcmlwdGlvbiIsCisJCQkvKmNyZWF0b3JzKi9Db2xsZWN0aW9ucy5FTVBUWV9MSVNULCAvKnN1YmplY3RzKi9Db2xsZWN0aW9ucy5FTVBUWV9MSVNULCAvKnB1Ymxpc2hlcnMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsCisJCQkvKmNvbnRyaWJ1dG9ycyovQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgLypkYXRlcyovQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgLyp0eXBlcyovQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKKwkJCS8qc291cmNlcyovQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgLypsYW5ndWFnZXMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIC8qcmVsYXRpb25zKi9Db2xsZWN0aW9ucy5FTVBUWV9MSVNULAorCQkJLypjb3ZlcmFnZXMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIC8qcmlnaHRzKi9Db2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJjb250ZXh0IiksCisJCQkiZ3JhbnVsZSIsICJncmFpbnkiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJmaWxlOi9kZXYvbnVsbCIpKTsKKwkJcC5zZXRSZXNvdXJjZUF0dHJpYnV0ZXMocmEpOworCQlFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQgZSA9IG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQocCwgIm1vZGUiLCAibW9kZSIsICJNb2RlIiwgInN0cmluZyIsICJtb2RlIiwKKwkJCS8qc3lub255bXMqL0NvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIC8qb2JsaWdhdGlvbiovZmFsc2UsIC8qbWF4T2NjdXJyZW5jZSovMSwgIk5vIGNvbW1lbnQiLAorCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiVGhlIGN1cnJlbnRcbiBtb2RlIHNldHRpbmdcbiAgaXMgc2V0IHRvIGluZGVudFxuXG4gICBhXG5cbiIKKwkJCQkrICIgICAgbnVtYmVyIG9mIGluY3JlYXNpbmdcbiAgICAgdGltZXMuIikpOworCQlwLmdldFByb2ZpbGVFbGVtZW50cygpLnB1dCgibW9kZSIsIGUpOworCisJCVByb2ZpbGUgcSA9IG5ldyBQcm9maWxlKHAudG9TdHJpbmcoKSk7CisJCWUgPSAoRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50KSBxLmdldFByb2ZpbGVFbGVtZW50cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIlRoZSBjdXJyZW50XG4gbW9kZSBzZXR0aW5nXG4gIGlzIHNldCB0byBpbmRlbnRcblxuICAgYVxuXG4iCisJCQkrICIgICAgbnVtYmVyIG9mIGluY3JlYXNpbmdcbiAgICAgdGltZXMuIiwgZS5nZXRWYWx1ZXMoKS5nZXQoMCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RYTUxTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2ZpbGUgcCA9IG5ldyBQcm9maWxlKCk7CisJCUVudW1lcmF0ZWRQcm9maWxlRWxlbWVudCBlID0gbmV3IEVudW1lcmF0ZWRQcm9maWxlRWxlbWVudChwKTsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCU5vZGUgcm9vdCA9IGUudG9YTUwoZG9jKTsKKwkJVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisJCVRyYW5zZm9ybWVyIHQgPSB0Zi5uZXdUcmFuc2Zvcm1lcigpOworCQlET01Tb3VyY2UgcyA9IG5ldyBET01Tb3VyY2Uocm9vdCk7CisJCVN0cmVhbVJlc3VsdCByID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgTnVsbE91dHB1dFN0cmVhbSgpKTsKKwkJdC50cmFuc2Zvcm0ocywgcik7CisJfQorCisJLyoqIEVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgdGVzdCBlbGVtZW50LiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117IjEiLCAiMiIsICIzIn0pOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZUF0dHJpYnV0ZXNUZXN0LmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlQXR0cmlidXRlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjNhODZmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZUF0dHJpYnV0ZXNUZXN0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uTnVsbE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiBVbml0IHRlc3QgdGhlIHtAbGluayBQcm9maWxlQXR0cmlidXRlc30gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIFByb2ZpbGVBdHRyaWJ1dGVzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSB7QGxpbmsgUHJvZmlsZUF0dHJpYnV0ZXN9IGNsYXNzLiAqLworCXB1YmxpYyBQcm9maWxlQXR0cmlidXRlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5vQXJnc0N0b3IoKSB7CisJCVByb2ZpbGVBdHRyaWJ1dGVzIGJsYW5rID0gbmV3IFByb2ZpbGVBdHRyaWJ1dGVzKCk7CisJCWFzc2VydEVxdWFscygiVU5LTk9XTiIsIGJsYW5rLmdldElEKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0Q2hpbGRyZW4oKS5zaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDdG9yKCkgeworCQlhc3NlcnRFcXVhbHMoImlkIiwgVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMuZ2V0SUQoKSk7CisJCWFzc2VydEVxdWFscygidmVyc2lvbiIsIFRFU1RfUFJPRklMRV9BVFRSSUJVVEVTLmdldFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscygidHlwZSIsIFRFU1RfUFJPRklMRV9BVFRSSUJVVEVTLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3RhdHVzSUQiLCBURVNUX1BST0ZJTEVfQVRUUklCVVRFUy5nZXRTdGF0dXNJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzZWN1cml0eVR5cGUiLCBURVNUX1BST0ZJTEVfQVRUUklCVVRFUy5nZXRTZWN1cml0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygicGFyZW50IiwgVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMuZ2V0UGFyZW50KCkpOworCQlhc3NlcnRFcXVhbHMoMiwgVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMuZ2V0Q2hpbGRyZW4oKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImNoaWxkMSIsIFRFU1RfUFJPRklMRV9BVFRSSUJVVEVTLmdldENoaWxkcmVuKCkuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGlsZDIiLCBURVNUX1BST0ZJTEVfQVRUUklCVVRFUy5nZXRDaGlsZHJlbigpLmdldCgxKSk7CisJCWFzc2VydEVxdWFscygicmVnQXV0aG9yaXR5IiwgVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMuZ2V0UmVnQXV0aG9yaXR5KCkpOworCQlhc3NlcnRFcXVhbHMoMiwgVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMuZ2V0UmV2aXNpb25Ob3RlcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygibm90ZTEiLCBURVNUX1BST0ZJTEVfQVRUUklCVVRFUy5nZXRSZXZpc2lvbk5vdGVzKCkuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKCJub3RlMiIsIFRFU1RfUFJPRklMRV9BVFRSSUJVVEVTLmdldFJldmlzaW9uTm90ZXMoKS5nZXQoMSkpOworCX0JCQorCisJcHVibGljIHZvaWQgdGVzdE9iamVjdE1ldGhvZHMoKSB7CisJCVByb2ZpbGVBdHRyaWJ1dGVzIHExID0gbmV3IFByb2ZpbGVBdHRyaWJ1dGVzKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsICI3IiwKKwkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQlQcm9maWxlQXR0cmlidXRlcyBxMiA9IG5ldyBQcm9maWxlQXR0cmlidXRlcygiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCAiNyIsCisJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKKwkJUHJvZmlsZUF0dHJpYnV0ZXMgcTMgPSBuZXcgUHJvZmlsZUF0dHJpYnV0ZXMoIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgIjgiLAorCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisJCWFzc2VydEVxdWFscyhxMSwgcTEpOworCQlhc3NlcnRFcXVhbHMocTEsIHEyKTsKKwkJYXNzZXJ0VHJ1ZSghcTEuZXF1YWxzKHEzKSk7CisJCVByb2ZpbGVBdHRyaWJ1dGVzIHE0ID0gKFByb2ZpbGVBdHRyaWJ1dGVzKSBxMy5jbG9uZSgpOworCQlhc3NlcnRFcXVhbHMocTMsIHE0KTsKKwkJYXNzZXJ0VHJ1ZShxMyAhPSBxNCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldHRlcnMoKSB7CisJCVByb2ZpbGVBdHRyaWJ1dGVzIHEgPSAoUHJvZmlsZUF0dHJpYnV0ZXMpIFRFU1RfUFJPRklMRV9BVFRSSUJVVEVTLmNsb25lKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHEuZ2V0SUQoKSk7CisJCXEuc2V0SUQoIm5ld0lkIik7CisJCWFzc2VydEVxdWFscygibmV3SWQiLCBxLmdldElEKCkpOworCisJCWFzc2VydEVxdWFscygidmVyc2lvbiIsIHEuZ2V0VmVyc2lvbigpKTsKKwkJcS5zZXRWZXJzaW9uKCJuZXdWZXJzaW9uIik7CisJCWFzc2VydEVxdWFscygibmV3VmVyc2lvbiIsIHEuZ2V0VmVyc2lvbigpKTsKKworCQlhc3NlcnRFcXVhbHMoInR5cGUiLCBxLmdldFR5cGUoKSk7CisJCXEuc2V0VHlwZSgibmV3VHlwZSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld1R5cGUiLCBxLmdldFR5cGUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0dXNJRCIsIHEuZ2V0U3RhdHVzSUQoKSk7CisJCXEuc2V0U3RhdHVzSUQoIm5ld1N0YXR1c2lkIik7CisJCWFzc2VydEVxdWFscygibmV3U3RhdHVzaWQiLCBxLmdldFN0YXR1c0lEKCkpOworCisJCWFzc2VydEVxdWFscygic2VjdXJpdHlUeXBlIiwgcS5nZXRTZWN1cml0eVR5cGUoKSk7CisJCXEuc2V0U2VjdXJpdHlUeXBlKCJuZXdTZWN1cml0eXR5cGUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdTZWN1cml0eXR5cGUiLCBxLmdldFNlY3VyaXR5VHlwZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoInJlZ0F1dGhvcml0eSIsIHEuZ2V0UmVnQXV0aG9yaXR5KCkpOworCQlxLnNldFJlZ0F1dGhvcml0eSgibmV3UmVnQXV0aG9yaXR5Iik7CisJCWFzc2VydEVxdWFscygibmV3UmVnQXV0aG9yaXR5IiwgcS5nZXRSZWdBdXRob3JpdHkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFhNTCgpIHRocm93cyBFeGNlcHRpb24geworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJTm9kZSByb290ID0gVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMudG9YTUwoZG9jKTsKKwkJYXNzZXJ0RXF1YWxzKCJwcm9mQXR0cmlidXRlcyIsIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7CisJCQlpZiAoInByb2ZJZCIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJpZCIsIFhNTC50ZXh0KGNoaWxkKSk7CisJCQl9IGVsc2UgaWYgKCJwcm9mVmVyc2lvbiIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoInByb2ZUeXBlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInR5cGUiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicHJvZlN0YXR1c0lkIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInN0YXR1c0lEIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoInByb2ZTZWN1cml0eVR5cGUiLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygic2VjdXJpdHlUeXBlIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoInByb2ZQYXJlbnRJZCIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJwYXJlbnQiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicHJvZkNoaWxkSWQiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlLCBsaXN0IHNlcmlhbGl6YXRpb24gdGVzdGVkIGluIFhNTFRlc3QKKwkJCX0gZWxzZSBpZiAoInByb2ZSZWdBdXRob3JpdHkiLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygicmVnQXV0aG9yaXR5IiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoInByb2ZSZXZpc2lvbk5vdGUiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlLCBsaXN0IHNlcmlhbGl6YXRpb24gdGVzdGVkIGluIFhNTFRlc3QKKwkJCX0gZWxzZSBmYWlsKCJVbmtub3duIG5vZGUgXCIiICsgbmFtZSArICJcIiBpbiBYTUwgcmVzdWx0Iik7CisJCX0KKwkJUHJvZmlsZUF0dHJpYnV0ZXMgcCA9IG5ldyBQcm9maWxlQXR0cmlidXRlcyhyb290KTsKKwkJYXNzZXJ0RXF1YWxzKFRFU1RfUFJPRklMRV9BVFRSSUJVVEVTLCBwKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFhNTFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZmlsZUF0dHJpYnV0ZXMgcCA9IG5ldyBQcm9maWxlQXR0cmlidXRlcygpOworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJTm9kZSByb290ID0gcC50b1hNTChkb2MpOworCQlUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJVHJhbnNmb3JtZXIgdCA9IHRmLm5ld1RyYW5zZm9ybWVyKCk7CisJCURPTVNvdXJjZSBzID0gbmV3IERPTVNvdXJjZShyb290KTsKKwkJU3RyZWFtUmVzdWx0IHIgPSBuZXcgU3RyZWFtUmVzdWx0KG5ldyBOdWxsT3V0cHV0U3RyZWFtKCkpOworCQl0LnRyYW5zZm9ybShzLCByKTsKKwl9CisKKwlzdGF0aWMgZmluYWwgUHJvZmlsZUF0dHJpYnV0ZXMgVEVTVF9QUk9GSUxFX0FUVFJJQlVURVM7CisKKwlzdGF0aWMgeworCQlMaXN0IHBhcmVudHMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJwYXJlbnQiKTsKKwkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY2hpbGRyZW4uYWRkKCJjaGlsZDEiKTsKKwkJY2hpbGRyZW4uYWRkKCJjaGlsZDIiKTsKKwkJTGlzdCByZXZpc2lvbk5vdGVzID0gbmV3IEFycmF5TGlzdCgpOworCQlyZXZpc2lvbk5vdGVzLmFkZCgibm90ZTEiKTsKKwkJcmV2aXNpb25Ob3Rlcy5hZGQoIm5vdGUyIik7CisJCVRFU1RfUFJPRklMRV9BVFRSSUJVVEVTID0gbmV3IFByb2ZpbGVBdHRyaWJ1dGVzKCJpZCIsICJ2ZXJzaW9uIiwgInR5cGUiLCAic3RhdHVzSUQiLAorCQkJInNlY3VyaXR5VHlwZSIsICJwYXJlbnQiLCBjaGlsZHJlbiwgInJlZ0F1dGhvcml0eSIsIHJldmlzaW9uTm90ZXMpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVFbGVtZW50VGVzdENhc2UuamF2YSBiLzAuMTAvcHJvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Byb2ZpbGVFbGVtZW50VGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdjNjljCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZUVsZW1lbnRUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5YTUw7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciBwcm9maWxlIGVsZW1lbnRzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9maWxlRWxlbWVudFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBQcm9maWxlRWxlbWVudH0gc3VwZXJjbGFzcy4gKi8KKwlwdWJsaWMgUHJvZmlsZUVsZW1lbnRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcm9maWxlIGVsZW1lbnQgb2JqZWN0IHRvIHRlc3QuCisJICoKKwkgKiBUaGUgZWxlbWVudCByZXR1cm5lZCBtdXN0IGhhdmUgYXMgaXRzIG93bmluZyBwcm9maWxlIHRoZQorCSAqIDxjb2RlPlByb2ZpbGVUZXN0LlRFU1RfUFJPRklMRTwvY29kZT4sIGJlIG5hbWVkICJuYW1lIiwgaGF2ZSAiaWQiIGFzIGl0cyBJRCwKKwkgKiBoYXZlICJkZXNjIiBhcyBpdHMgZGVzY3JpcHRpb24sIG11c3QgYmUgb2YgdHlwZSAidHlwZSIsIGhhdmUgInVuaXQiIHVuaXRzLCBoYXZlCisJICogbm8gc3lub255bXMsIG5vdCBiZSBvYmxpZ2F0b3J5LCBtYXkgb2NjdXIgb25jZSwgYW5kIGhhdmUgImNvbW1lbnQiIGFzIGl0cworCSAqIGNvbW1lbnQuCisJICoKKwkgKiBAcmV0dXJuIEEgcHJvZmlsZSBlbGVtZW50LgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9maWxlRWxlbWVudCBjcmVhdGVQcm9maWxlRWxlbWVudCgpOworCisJLyoqCisJICogQ2hlY2sgaWYgdGhlIGdpdmVuIGVudW1lcmF0aW9uIGZsYWcgaXMgdmFsaWQuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBtZXJlbHkgYXNzZXJ0cyB0aGF0IGl0J3MgdmFsaWQgZm9yIHRoZSBwcm9maWxlIGVsZW1lbnQgaW4gcXVlc3Rpb24uCisJICoKKwkgKiBAcGFyYW0gdGV4dCBUZXh0IHRvIGNoZWNrLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoZWNrRW51bUZsYWcoU3RyaW5nIHRleHQpOworCisJLyoqCisJICogQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBtZXJlbHkgYXNzZXJ0cyB0aGF0IGl0J3MgdmFsaWQgZm9yIHRoZSBwcm9maWxlIGVsZW1lbnQgaW4gcXVlc3Rpb24uCisJICoKKwkgKiBAcGFyYW0gdGV4dCBUZXh0IHRvIGNoZWNrLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoZWNrVmFsdWUoU3RyaW5nIHRleHQpOworCisJLyoqCisJICogQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gbWF4aW11bSB2YWx1ZSBpcyB2YWxpZC4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIG1lcmVseSBhc3NlcnRzIHRoYXQgaXQncyB2YWxpZCBmb3IgdGhlIHByb2ZpbGUgZWxlbWVudCBpbiBxdWVzdGlvbi4KKwkgKgorCSAqIEBwYXJhbSB0ZXh0IFRleHQgdG8gY2hlY2suCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2hlY2tNYXhWYWx1ZShTdHJpbmcgdGV4dCk7CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBtaW5pbXVtIHZhbHVlIGlzIHZhbGlkLgorCSAqCisJICogVGhpcyBtZXRob2QgbWVyZWx5IGFzc2VydHMgdGhhdCBpdCdzIHZhbGlkIGZvciB0aGUgcHJvZmlsZSBlbGVtZW50IGluIHF1ZXN0aW9uLgorCSAqCisJICogQHBhcmFtIHRleHQgVGV4dCB0byBjaGVjay4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjaGVja01pblZhbHVlKFN0cmluZyB0ZXh0KTsKKworCXB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXJpc3RpY3MoKSB7CisJCVByb2ZpbGVFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVQcm9maWxlRWxlbWVudCgpOworCQlhc3NlcnRFcXVhbHMoUHJvZmlsZVRlc3QuVEVTVF9QUk9GSUxFLCBlbGVtZW50LmdldFByb2ZpbGUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZWxlbWVudC5nZXROYW1lKCkpOworCQllbGVtZW50LnNldE5hbWUoIm5ld05hbWUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudC5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiaWQiLCBlbGVtZW50LmdldElEKCkpOworCQllbGVtZW50LnNldElEKCJuZXdJRCIpOworCQlhc3NlcnRFcXVhbHMoIm5ld0lEIiwgZWxlbWVudC5nZXRJRCgpKTsKKworCQlhc3NlcnRFcXVhbHMoImRlc2MiLCBlbGVtZW50LmdldERlc2NyaXB0aW9uKCkpOworCQllbGVtZW50LnNldERlc2NyaXB0aW9uKCJuZXdEZXNjIik7CisJCWFzc2VydEVxdWFscygibmV3RGVzYyIsIGVsZW1lbnQuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ0eXBlIiwgZWxlbWVudC5nZXRUeXBlKCkpOworCQllbGVtZW50LnNldFR5cGUoIm5ld1R5cGUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdUeXBlIiwgZWxlbWVudC5nZXRUeXBlKCkpOworCisJCWFzc2VydEVxdWFscygidW5pdCIsIGVsZW1lbnQuZ2V0VW5pdCgpKTsKKwkJZWxlbWVudC5zZXRVbml0KCJuZXdVbml0Iik7CisJCWFzc2VydEVxdWFscygibmV3VW5pdCIsIGVsZW1lbnQuZ2V0VW5pdCgpKTsKKworCQlhc3NlcnRFcXVhbHMoMCwgZWxlbWVudC5nZXRTeW5vbnltcygpLnNpemUoKSk7CisJCWVsZW1lbnQuZ2V0U3lub255bXMoKS5hZGQoInN5bm9ueW0iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGVsZW1lbnQuZ2V0U3lub255bXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoInN5bm9ueW0iLCBlbGVtZW50LmdldFN5bm9ueW1zKCkuZ2V0KDApKTsKKworCQlhc3NlcnRUcnVlKCFlbGVtZW50LmlzT2JsaWdhdG9yeSgpKTsKKwkJZWxlbWVudC5zZXRPYmxpZ2F0aW9uKHRydWUpOworCQlhc3NlcnRUcnVlKGVsZW1lbnQuaXNPYmxpZ2F0b3J5KCkpOworCisJCWFzc2VydEVxdWFscygxLCBlbGVtZW50LmdldE1heE9jY3VycmVuY2UoKSk7CisJCWVsZW1lbnQuc2V0TWF4T2NjdXJyZW5jZSgyKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGVsZW1lbnQuZ2V0TWF4T2NjdXJyZW5jZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoImNvbW1lbnQiLCBlbGVtZW50LmdldENvbW1lbnRzKCkpOworCQllbGVtZW50LnNldENvbW1lbnRzKCJuZXdDb21tZW50Iik7CisJCWFzc2VydEVxdWFscygibmV3Q29tbWVudCIsIGVsZW1lbnQuZ2V0Q29tbWVudHMoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE9iamVjdE1ldGhvZHMoKSB7CisJCVByb2ZpbGVFbGVtZW50IGVsZW0xID0gY3JlYXRlUHJvZmlsZUVsZW1lbnQoKTsKKwkJUHJvZmlsZUVsZW1lbnQgZWxlbTIgPSBjcmVhdGVQcm9maWxlRWxlbWVudCgpOworCQlQcm9maWxlRWxlbWVudCBlbGVtMyA9IGNyZWF0ZVByb2ZpbGVFbGVtZW50KCk7CisJCWVsZW0zLnNldE5hbWUoIm5ld05hbWUiKTsKKwkJYXNzZXJ0RXF1YWxzKGVsZW0xLCBlbGVtMSk7CisJCWFzc2VydEVxdWFscyhlbGVtMSwgZWxlbTIpOworCQlhc3NlcnRUcnVlKCFlbGVtMS5lcXVhbHMoZWxlbTMpKTsKKwkJUHJvZmlsZUVsZW1lbnQgZWxlbTQgPSAoUHJvZmlsZUVsZW1lbnQpIGVsZW0zLmNsb25lKCk7CisJCWFzc2VydEVxdWFscyhlbGVtMywgZWxlbTQpOworCQlhc3NlcnRUcnVlKGVsZW0zICE9IGVsZW00KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0WE1MKCkgeworCQlQcm9maWxlRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlUHJvZmlsZUVsZW1lbnQoKTsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCU5vZGUgcm9vdCA9IGVsZW1lbnQudG9YTUwoZG9jKTsKKwkJYXNzZXJ0RXF1YWxzKCJwcm9mRWxlbWVudCIsIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCWJvb2xlYW4gZm91bmROYW1lID0gZmFsc2U7CisJCWJvb2xlYW4gZm91bmRFbnVtRmxhZyA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpIHsKKwkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOworCQkJU3RyaW5nIHRleHQgPSBQcm9maWxlRWxlbWVudC50ZXh0KGNoaWxkKTsKKwkJCWlmICgiZWxlbUlkIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImlkIiwgdGV4dCk7CisJCQl9IGVsc2UgaWYgKCJlbGVtTmFtZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdGV4dCk7CisJCQkJZm91bmROYW1lID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoImVsZW1EZXNjIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImRlc2MiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1UeXBlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInR5cGUiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1Vbml0Ii5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInVuaXQiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1FbnVtRmxhZyIuZXF1YWxzKG5hbWUpKSB7CisJCQkJY2hlY2tFbnVtRmxhZyh0ZXh0KTsKKwkJCQlmb3VuZEVudW1GbGFnID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoImVsZW1WYWx1ZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJY2hlY2tWYWx1ZSh0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1NaW5WYWx1ZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJY2hlY2tNaW5WYWx1ZSh0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1NYXhWYWx1ZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJY2hlY2tNYXhWYWx1ZSh0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1TeW5vbnltIi5lcXVhbHMobmFtZSkpIHsKKwkJCQk7IC8vIGlnbm9yZQorCQkJfSBlbHNlIGlmICgiZWxlbU9ibGlnYXRpb24iLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygiT3B0aW9uYWwiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1NYXhPY2N1cnJlbmNlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoIjEiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoImVsZW1Db21tZW50Ii5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImNvbW1lbnQiLCB0ZXh0KTsKKwkJCX0gZWxzZSBmYWlsKCJVbmtub3duIG5vZGUgPCIgKyBuYW1lICsgIj4gdW5kZXIgPHByb2ZFbGVtZW50PiIpOworCQl9CisJCWFzc2VydFRydWUoIlJlcXVpcmVkIDxlbGVtTmFtZT4gbWlzc2luZyIsIGZvdW5kTmFtZSk7CisJCWFzc2VydFRydWUoIlJlcXVpcmVkIDxlbGVtRW51bUZsYWc+IG1pc3NpbmciLCBmb3VuZEVudW1GbGFnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9Qcm9maWxlVGVzdC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVlZTRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUHJvZmlsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVW5pdCB0ZXN0IHRoZSBQcm9maWxlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBQcm9maWxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSBQcm9maWxlIGNsYXNzLiAqLworCXB1YmxpYyBQcm9maWxlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlvbGRQcm9mTlMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImpwbC5yZGYubnMiKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJqcGwucmRmLm5zIiwgImh0dHA6Ly9lbnRlcnByaXNlLmpwbC5uYXNhLmdvdi9yZGZzL3Byb2YucmRmIyIpOworCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOworCQlidWZmZXIuYXBwZW5kKCI8IURPQ1RZUEUgcHJvZmlsZSBQVUJMSUMgXCIiKS5hcHBlbmQoUHJvZmlsZS5QUk9GSUxFU19EVERfRlBJKS5hcHBlbmQoIlwiIFwiIikKKwkJCS5hcHBlbmQoUHJvZmlsZS5QUk9GSUxFU19EVERfVVJMKS5hcHBlbmQoIlwiPlxuIik7CisJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0LnhtbCIpKSk7CisJCVN0cmluZyBsaW5lOworCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZChsaW5lKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7CisJCX0KKwkJcmVhZGVyLmNsb3NlKCk7CisJCURvY3VtZW50IGRvYyA9IFhNTC5wYXJzZShidWZmZXIudG9TdHJpbmcoKSk7CisJCXByb2ZpbGUxID0gbmV3IFByb2ZpbGUoYnVmZmVyLnRvU3RyaW5nKCkpOworCQlwcm9maWxlMiA9IG5ldyBQcm9maWxlKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKG9sZFByb2ZOUyAhPSBudWxsKQorCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqcGwucmRmLm5zIiwgb2xkUHJvZk5TKTsKKwkJZWxzZQorCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoImpwbC5yZGYubnMiKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UXVlcmllcygpIHsKKwkJLy8gV2UgdGVzdCBib3RoIHByb2ZpbGUxIChidWlsdCBmcm9tIGEgc3RyaW5nKSBhbmQgcHJvZmlsZTIgKGZyb20gYW4gWE1MCisJCS8vIGRvY3VtZW50IG5vZGUpOyB0aGV5IHNob3VsZCB5aWVsZCB0aGUgc2FtZSByZXN1bHRzIGJlY2F1c2UgdGhleQorCQkvLyByZXByZXNlbnQgdGhlIHNhbWUgZG9jdW1lbnQuCisKKwkJLy8gVGVzdCB0aGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUgbWV0aG9kLgorCQlhc3NlcnRFcXVhbHMoIlBEU19QUk9GSUxFX1NFUlZFUiIsIHByb2ZpbGUxLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldElkZW50aWZpZXIoKSk7CisJCWFzc2VydEVxdWFscygiUERTX1BST0ZJTEVfU0VSVkVSIiwgcHJvZmlsZTIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0SWRlbnRpZmllcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCBwcm9maWxlMS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRGb3JtYXRzKCkuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCBwcm9maWxlMi5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRGb3JtYXRzKCkuZ2V0KDApKTsKKworCQkvLyBUZXN0IHRoZSBnZXRQcm9maWxlSUQgbWV0aG9kLgorCQlhc3NlcnRFcXVhbHMoIk9PRFRfUERTX1BST0ZJTEVfU0VSVkVSIiwgcHJvZmlsZTEuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPT0RUX1BEU19QUk9GSUxFX1NFUlZFUiIsIHByb2ZpbGUyLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSk7CisKKwkJLy8gVGVzdCB0aGUgZ2V0UHJvZmlsZUF0dHJpYnV0ZSBtZXRob2QKKwkJYXNzZXJ0RXF1YWxzKCJwcm9maWxlIiwgcHJvZmlsZTEuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInByb2ZpbGUiLCBwcm9maWxlMi5nZXRQcm9maWxlQXR0cmlidXRlcygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiTlVMTCIsIHByb2ZpbGUxLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0U2VjdXJpdHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIk5VTEwiLCBwcm9maWxlMi5nZXRQcm9maWxlQXR0cmlidXRlcygpLmdldFNlY3VyaXR5VHlwZSgpKTsKKworCQkvLyBUZXN0IHRoZSBnZXRQcm9maWxlRWxlbWVudEl0ZW0gbWV0aG9kLgorCQlNYXAgZWxlbWVudHMxID0gcHJvZmlsZTEuZ2V0UHJvZmlsZUVsZW1lbnRzKCk7CisJCU1hcCBlbGVtZW50czIgPSBwcm9maWxlMi5nZXRQcm9maWxlRWxlbWVudHMoKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGVsZW1lbnRzMS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZWxlbWVudHMyLnNpemUoKSk7CisJCWFzc2VydFRydWUoZWxlbWVudHMxLmNvbnRhaW5zS2V5KCJURVNUIikpOworCQlhc3NlcnRUcnVlKGVsZW1lbnRzMi5jb250YWluc0tleSgiVEVTVCIpKTsKKwkJYXNzZXJ0VHJ1ZSghZWxlbWVudHMxLmNvbnRhaW5zS2V5KCJkb2VzLW5vdC1leGlzdCIpKTsKKwkJYXNzZXJ0VHJ1ZSghZWxlbWVudHMyLmNvbnRhaW5zS2V5KCJkb2VzLW5vdC1leGlzdCIpKTsKKwkJUHJvZmlsZUVsZW1lbnQgZWxlbWVudDEgPSAoUHJvZmlsZUVsZW1lbnQpIGVsZW1lbnRzMS5nZXQoIlRFU1QyIik7CisJCVByb2ZpbGVFbGVtZW50IGVsZW1lbnQyID0gKFByb2ZpbGVFbGVtZW50KSBlbGVtZW50czIuZ2V0KCJURVNUMiIpOworCQlhc3NlcnRFcXVhbHMoIlRlc3RpbmciLCBlbGVtZW50MS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIlRlc3RpbmciLCBlbGVtZW50Mi5nZXRUeXBlKCkpOworCisJCS8vIFRlc3QgdGhlIHRvU3RyaW5nIGFuZCBnZXRQcm9maWxlU3RyaW5nIG1ldGhvZHMgLi4uIE5COiB0aGlzIHRlc3Qgc2hvdWxkCisJCS8vIGFjdHVhbGx5IGNoZWNrIHZhbHVlLCBub3QganVzdCBzZWUgaWYgdGhleSdyZSBlcXVhbC4KKwkJYXNzZXJ0RXF1YWxzKHByb2ZpbGUxLnRvU3RyaW5nKCksIHByb2ZpbGUyLnRvU3RyaW5nKCkpOworCisJCS8vIFRlc3Qgc29tZSBtaXNjZWxsYW5lb3VzIHF1ZXJ5IG1ldGhvZHMKKwkJYXNzZXJ0RXF1YWxzKCJQbGFuZXRhcnkgRGF0YSBTeXN0ZW0gKFBEUykgLSBQcm9maWxlIFNlcnZlciBWMS4wIiwgcHJvZmlsZTEuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0VGl0bGUoKSk7CisJCWFzc2VydEVxdWFscygiaWlvcDovL29vZHQuanBsLm5hc2EuZ292OjEwMDAwL0pQTC5QRFMuUFJPRklMRSIsIHByb2ZpbGUxLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldFJlc0xvY2F0aW9ucygpCisJCQkuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKCJzeXN0ZW0ucHJvZmlsZVNlcnZlciIsIHByb2ZpbGUxLmdldFJlc291cmNlQXR0cmlidXRlcygpLmdldFJlc0NsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIlBsYW5ldGFyeSBEYXRhIFN5c3RlbSAoUERTKSAtIFByb2ZpbGUgU2VydmVyIFYxLjAiLCBwcm9maWxlMi5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5nZXRUaXRsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpaW9wOi8vb29kdC5qcGwubmFzYS5nb3Y6MTAwMDAvSlBMLlBEUy5QUk9GSUxFIiwgcHJvZmlsZTIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVzTG9jYXRpb25zKCkKKwkJCS5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoInN5c3RlbS5wcm9maWxlU2VydmVyIiwgcHJvZmlsZTIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuZ2V0UmVzQ2xhc3MoKSk7CisJfQorCisJLyoqIEEgdGVzdCBwcm9maWxlLCBidWlsdCBmcm9tIGEgc3RyaW5nLiAqLworCXByaXZhdGUgUHJvZmlsZSBwcm9maWxlMTsKKworCS8qKiBBbm90aGVyIHRlc3QgcHJvZmlsZSwgYnVpbHQgZnJvbSBhbiBYTUwgZG9jdW1lbnQgbm9kZS4gKi8KKwlwcml2YXRlIFByb2ZpbGUgcHJvZmlsZTI7CisKKwkvKiogUHJldmlvdXMgdmFsdWUgb2YgdGhlIEpQTCBSREYgbmFtZXNwYWNlIGluIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4gKi8KKwlwcml2YXRlIFN0cmluZyBvbGRQcm9mTlM7CisKKwkvKiogQW5vdGhlciAoc3RhdGljKSB0ZXN0IHByb2ZpbGUsIGZvciB1c2UgYnkgb3RoZXIgdGVzdCBjYXNlcy4gKi8KKwlzdGF0aWMgUHJvZmlsZSBURVNUX1BST0ZJTEUgPSBuZXcgUHJvZmlsZShvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlQXR0cmlidXRlc1Rlc3QuVEVTVF9QUk9GSUxFX0FUVFJJQlVURVMsCisJCW9yZy5hcGFjaGUub29kdC5wcm9maWxlLlJlc291cmNlQXR0cmlidXRlc1Rlc3QuVEVTVF9SRVNPVVJDRV9BVFRSSUJVVEVTKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1JhbmdlZFByb2ZpbGVFbGVtZW50VGVzdC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvUmFuZ2VkUHJvZmlsZUVsZW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlZGU0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1JhbmdlZFByb2ZpbGVFbGVtZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5OdWxsT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvKioKKyAqIFVuaXQgdGVzdCB0aGUge0BsaW5rIFJhbmdlZFByb2ZpbGVFbGVtZW50fSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgUmFuZ2VkUHJvZmlsZUVsZW1lbnRUZXN0IGV4dGVuZHMgUHJvZmlsZUVsZW1lbnRUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIFJhbmdlZFByb2ZpbGVFbGVtZW50fSBjbGFzcy4gKi8KKwlwdWJsaWMgUmFuZ2VkUHJvZmlsZUVsZW1lbnRUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByb3RlY3RlZCBQcm9maWxlRWxlbWVudCBjcmVhdGVQcm9maWxlRWxlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBSYW5nZWRQcm9maWxlRWxlbWVudChQcm9maWxlVGVzdC5URVNUX1BST0ZJTEUsICJuYW1lIiwgImlkIiwgImRlc2MiLCAidHlwZSIsICJ1bml0IiwKKwkJCS8qc3lub255bXMqLyBuZXcgQXJyYXlMaXN0KCksIC8qb2JsaWdhdGlvbiovZmFsc2UsIC8qbWF4T2NjdXJyZW5jZSovMSwgImNvbW1lbnQiLCAvKm1pbiovIi0xMDAuMCIsCisJCQkvKm1heCovIjEwMC4wIik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEl0KCkgeworCQlQcm9maWxlRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlUHJvZmlsZUVsZW1lbnQoKTsKKwkJYXNzZXJ0RXF1YWxzKCIxMDAuMCIsIGVsZW1lbnQuZ2V0TWF4VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiLTEwMC4wIiwgZWxlbWVudC5nZXRNaW5WYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVsZW1lbnQuZ2V0VmFsdWVzKCkuc2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFhNTFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZmlsZSBwID0gbmV3IFByb2ZpbGUoKTsKKwkJUmFuZ2VkUHJvZmlsZUVsZW1lbnQgZSA9IG5ldyBSYW5nZWRQcm9maWxlRWxlbWVudChwKTsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCU5vZGUgcm9vdCA9IGUudG9YTUwoZG9jKTsKKwkJVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisJCVRyYW5zZm9ybWVyIHQgPSB0Zi5uZXdUcmFuc2Zvcm1lcigpOworCQlET01Tb3VyY2UgcyA9IG5ldyBET01Tb3VyY2Uocm9vdCk7CisJCVN0cmVhbVJlc3VsdCByID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgTnVsbE91dHB1dFN0cmVhbSgpKTsKKwkJdC50cmFuc2Zvcm0ocywgcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tFbnVtRmxhZyhTdHJpbmcgdGV4dCkgeworCQlhc3NlcnRFcXVhbHMoIkYiLCB0ZXh0KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1ZhbHVlKFN0cmluZyB0ZXh0KSB7CisJCWZhaWwoIlJhbmdlZCBwcm9maWxlIGVsZW1lbnQgc2hvdWxkbid0IGhhdmUgYW4gZW51bWVyYXRlZCB2YWx1ZSIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrTWF4VmFsdWUoU3RyaW5nIHRleHQpIHsKKwkJYXNzZXJ0RXF1YWxzKCIxMDAuMCIsIHRleHQpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrTWluVmFsdWUoU3RyaW5nIHRleHQpIHsKKwkJYXNzZXJ0RXF1YWxzKCItMTAwLjAiLCB0ZXh0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9SZXNvdXJjZUF0dHJpYnV0ZXNUZXN0LmphdmEgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9SZXNvdXJjZUF0dHJpYnV0ZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmYWE1NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL1Jlc291cmNlQXR0cmlidXRlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5OdWxsT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIFVuaXQgdGVzdCB0aGUge0BsaW5rIFJlc291cmNlQXR0cmlidXRlc30gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIFJlc291cmNlQXR0cmlidXRlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIFJlc291cmNlQXR0cmlidXRlc30gY2xhc3MuICovCisJcHVibGljIFJlc291cmNlQXR0cmlidXRlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5vQXJnc0N0b3IoKSB7CisJCVJlc291cmNlQXR0cmlidXRlcyBibGFuayA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJVTktOT1dOIiwgYmxhbmsuZ2V0SWRlbnRpZmllcigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGJsYW5rLmdldEZvcm1hdHMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0Q3JlYXRvcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0U3ViamVjdHMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0UHVibGlzaGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBibGFuay5nZXRDb250cmlidXRvcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0RGF0ZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0VHlwZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0U291cmNlcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBibGFuay5nZXRMYW5ndWFnZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0UmVsYXRpb25zKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGJsYW5rLmdldENvdmVyYWdlcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBibGFuay5nZXRSaWdodHMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0UmVzQ29udGV4dHMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYmxhbmsuZ2V0UmVzTG9jYXRpb25zKCkuc2l6ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0TWV0aG9kcygpIHsKKwkJTGlzdCBjb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY29udGV4dHMuYWRkKCJjb250ZXh0Iik7CisJCVJlc291cmNlQXR0cmlidXRlcyByMSA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMobnVsbCwgIjEiLCAidGl0bGUiLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCAiZGVzYyIsCisJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULAorCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKKwkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsCisJCQljb250ZXh0cywgImFnZ3JlZ2F0aW9uIiwgImNsYXNzIiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisJCVJlc291cmNlQXR0cmlidXRlcyByMiA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMobnVsbCwgIjEiLCAidGl0bGUiLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCAiZGVzYyIsCisJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULAorCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKKwkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsCisJCQljb250ZXh0cywgImFnZ3JlZ2F0aW9uIiwgImNsYXNzIiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisJCVJlc291cmNlQXR0cmlidXRlcyByMyA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMobnVsbCwgIjIiLCAidGl0bGUyIiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgImRlc2MyIiwKKwkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsCisJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULAorCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKKwkJCWNvbnRleHRzLCAiYWdncmVnYXRpb24yIiwgImNsYXNzMiIsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQlhc3NlcnRFcXVhbHMocjEsIHIxKTsKKwkJYXNzZXJ0RXF1YWxzKHIxLCByMik7CisJCWFzc2VydFRydWUoIXIxLmVxdWFscyhyMykpOworCQlSZXNvdXJjZUF0dHJpYnV0ZXMgcjQgPSAoUmVzb3VyY2VBdHRyaWJ1dGVzKSByMy5jbG9uZSgpOworCQlhc3NlcnRFcXVhbHMocjMsIHI0KTsKKwkJYXNzZXJ0VHJ1ZShyMyAhPSByNCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldHRlcnMoKSB7CisJCVJlc291cmNlQXR0cmlidXRlcyBxID0gKFJlc291cmNlQXR0cmlidXRlcykgVEVTVF9SRVNPVVJDRV9BVFRSSUJVVEVTLmNsb25lKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJpZGVudGlmaWVyIiwgcS5nZXRJZGVudGlmaWVyKCkpOworCQlxLnNldElkZW50aWZpZXIoIm5ld0lkZW50aWZpZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdJZGVudGlmaWVyIiwgcS5nZXRJZGVudGlmaWVyKCkpOworCisJCWFzc2VydEVxdWFscygiYWdncmVnYXRpb24iLCBxLmdldFJlc0FnZ3JlZ2F0aW9uKCkpOworCQlxLnNldFJlc0FnZ3JlZ2F0aW9uKCJuZXdBZ2dlcmdhdGlvbiIpOworCQlhc3NlcnRFcXVhbHMoIm5ld0FnZ2VyZ2F0aW9uIiwgcS5nZXRSZXNBZ2dyZWdhdGlvbigpKTsKKworCQlhc3NlcnRFcXVhbHMoImNsYXNzIiwgcS5nZXRSZXNDbGFzcygpKTsKKwkJcS5zZXRSZXNDbGFzcygibmV3Q2xhc3MiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdDbGFzcyIsIHEuZ2V0UmVzQ2xhc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFhNTCgpIHRocm93cyBFeGNlcHRpb24geworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJTm9kZSByb290ID0gVEVTVF9SRVNPVVJDRV9BVFRSSUJVVEVTLnRvWE1MKGRvYyk7CisJCWFzc2VydEVxdWFscygicmVzQXR0cmlidXRlcyIsIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7CisJCQlpZiAoIklkZW50aWZpZXIiLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygiaWRlbnRpZmllciIsIFhNTC50ZXh0KGNoaWxkKSk7CisJCQl9IGVsc2UgaWYgKCJUaXRsZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJ0aXRsZSIsIFhNTC50ZXh0KGNoaWxkKSk7CisJCQl9IGVsc2UgaWYgKCJGb3JtYXQiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlCisJCQl9IGVsc2UgaWYgKCJEZXNjcmlwdGlvbiIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJkZXNjIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoIkNyZWF0b3IiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlCisJCQl9IGVsc2UgaWYgKCJTdWJqZWN0Ii5lcXVhbHMobmFtZSkpIHsKKwkJCQk7IC8vIGlnbm9yZQorCQkJfSBlbHNlIGlmICgiUHVibGlzaGVyIi5lcXVhbHMobmFtZSkpIHsKKwkJCQk7IC8vIGlnbm9yZQorCQkJfSBlbHNlIGlmICgiQ29udHJpYnV0b3IiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlCisJCQl9IGVsc2UgaWYgKCJEYXRlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQk7IC8vIGlnbm9yZQorCQkJfSBlbHNlIGlmICgiVHlwZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJOyAvLyBpZ25vcmUKKwkJCX0gZWxzZSBpZiAoIlNvdXJjZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJOyAvLyBpZ25vcmUKKwkJCX0gZWxzZSBpZiAoIkxhbmd1YWdlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQk7IC8vIGlnbm9yZQorCQkJfSBlbHNlIGlmICgiQ292ZXJhZ2UiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlCisJCQl9IGVsc2UgaWYgKCJSaWdodHMiLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlCisJCQl9IGVsc2UgaWYgKCJyZXNDb250ZXh0Ii5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImNvbnRleHQiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicmVzQWdncmVnYXRpb24iLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygiYWdncmVnYXRpb24iLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicmVzQ2xhc3MiLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygiY2xhc3MiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicmVzTG9jYXRpb24iLmVxdWFscyhuYW1lKSkgeworCQkJCTsgLy8gaWdub3JlCisJCQl9IGVsc2UgZmFpbCgiVW5rbm93biBub2RlIFwiIiArIG5hbWUgKyAiXCIgaW4gWE1MIHJlc3VsdCIpOworCQl9CisJCVJlc291cmNlQXR0cmlidXRlcyBxID0gbmV3IFJlc291cmNlQXR0cmlidXRlcyhudWxsLCByb290KTsKKwkJYXNzZXJ0RXF1YWxzKFRFU1RfUkVTT1VSQ0VfQVRUUklCVVRFUywgcSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RYTUxTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2ZpbGUgcCA9IG5ldyBQcm9maWxlKCk7CisJCVJlc291cmNlQXR0cmlidXRlcyByYSA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMocCk7CisJCURvY3VtZW50IGRvYyA9IFhNTC5jcmVhdGVEb2N1bWVudCgpOworCQlOb2RlIHJvb3QgPSByYS50b1hNTChkb2MpOworCQlUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJVHJhbnNmb3JtZXIgdCA9IHRmLm5ld1RyYW5zZm9ybWVyKCk7CisJCURPTVNvdXJjZSBzID0gbmV3IERPTVNvdXJjZShyb290KTsKKwkJU3RyZWFtUmVzdWx0IHIgPSBuZXcgU3RyZWFtUmVzdWx0KG5ldyBOdWxsT3V0cHV0U3RyZWFtKCkpOworCQl0LnRyYW5zZm9ybShzLCByKTsKKwl9CisJCisJc3RhdGljIFJlc291cmNlQXR0cmlidXRlcyBURVNUX1JFU09VUkNFX0FUVFJJQlVURVM7IHsKKwkJTGlzdCBjb250ZXh0cyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImNvbnRleHQiKTsKKwkJTGlzdCBsb2NhdGlvbnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJsb2NhdGlvbiIpOworCQlURVNUX1JFU09VUkNFX0FUVFJJQlVURVMgPSBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKG51bGwsICJpZGVudGlmaWVyIiwgInRpdGxlIiwKKwkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QsICJkZXNjIiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKKwkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsCisJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULAorCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgY29udGV4dHMsICJhZ2dyZWdhdGlvbiIsICJjbGFzcyIsIGxvY2F0aW9ucyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyVGVzdC5qYXZhIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvaGFuZGxlcnMvbGlnaHR3ZWlnaHQvTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTRlY2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9MaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMubGlnaHR3ZWlnaHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5Qcm9maWxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3QgdGhlIExpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlciBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSBMaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIgY2xhc3MuICovCisJcHVibGljIExpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKCJsaWdodHdlaWdodFRlc3QueG1sIik7CisJCXNlcnZlciA9IG5ldyBMaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIodXJsLCAidGVzdGluZyIpOworCX0KKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRJRCBtZXRob2QuCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldElEKCkgeworCQlhc3NlcnRFcXVhbHMoInRlc3RpbmciLCBzZXJ2ZXIuZ2V0SUQoKSk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGUgc2VhcmNoaW5nIG1ldGhvZHMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNlYXJjaGluZygpIHsKKwkJdHJ5IHsKKwkJCUxpc3QgcHJvZmlsZXM7CisKKwkJCS8vIFRyeSBhIHBvc2l0aXZlIHNlYXJjaC4KKwkJCXByb2ZpbGVzID0gZG9TZWFyY2goIlRFU1QgPiAyIEFORCBURVNUIDwgMzAiKTsKKwkJCWFzc2VydEVxdWFscygxLCBwcm9maWxlcy5zaXplKCkpOworCQkJU2VhcmNoYWJsZVByb2ZpbGUgcHJvZmlsZSA9IChTZWFyY2hhYmxlUHJvZmlsZSkgcHJvZmlsZXMuZ2V0KDApOworCQkJYXNzZXJ0RXF1YWxzKCJQUk9GSUxFMSIsIHByb2ZpbGUuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRJRCgpKTsKKwkJCU1hcCBlbGVtZW50cyA9IHByb2ZpbGUuZ2V0UHJvZmlsZUVsZW1lbnRzKCk7CisJCQlhc3NlcnRFcXVhbHMoMywgZWxlbWVudHMuc2l6ZSgpKTsKKwkJCVByb2ZpbGVFbGVtZW50IGVsZW1lbnQgPSAoUHJvZmlsZUVsZW1lbnQpIGVsZW1lbnRzLmdldCgiVEVTVCIpOworCQkJYXNzZXJ0Tm90TnVsbChlbGVtZW50KTsKKwkJCWFzc2VydEVxdWFscygiMy4xNDE1OSIsIGVsZW1lbnQuZ2V0SUQoKSk7CisKKwkJCS8vIE5vdyBhIG5lZ2F0aXZlIG9uZS4KKwkJCXByb2ZpbGVzID0gZG9TZWFyY2goIk5PTkVYSVNURU5UID0gNDUyNzEyOTE3ODI0ODEyMTIzMTI1MTAwODg0Iik7CisJCQlhc3NlcnRFcXVhbHMoMCwgcHJvZmlsZXMuc2l6ZSgpKTsKKworCQkJLy8gTm93IG9uZSB0aGF0IGhhcyBtdWx0aXBsZSBlbGVtZW50cyBmcm9tIG9uZSBwcm9maWxlCisJCQlwcm9maWxlcyA9IGRvU2VhcmNoKCJURVNUIDw9IDE0IEFORCBURVNUMiA+PSAxMCIpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHByb2ZpbGVzLnNpemUoKSk7CisJCQlwcm9maWxlID0gKFNlYXJjaGFibGVQcm9maWxlKSBwcm9maWxlcy5nZXQoMCk7CisJCQlhc3NlcnRFcXVhbHMoIlBST0ZJTEUxIiwgcHJvZmlsZS5nZXRQcm9maWxlQXR0cmlidXRlcygpLmdldElEKCkpOworCQkJZWxlbWVudHMgPSBwcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpOworCQkJYXNzZXJ0RXF1YWxzKDMsIGVsZW1lbnRzLnNpemUoKSk7CisJCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmNvbnRhaW5zS2V5KCJURVNUIikpOworCQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWluc0tleSgiVEVTVDIiKSk7CisKKwkJCS8vIEFuZCBhZ2FpbiwgYnV0IHdpdGggT1IgaW5zdGVhZCBvZiBBTkQKKwkJCXByb2ZpbGVzID0gZG9TZWFyY2goIlRFU1QgPD0gMTQgT1IgVEVTVDIgPj0gMTAiKTsKKwkJCWFzc2VydEVxdWFscygxLCBwcm9maWxlcy5zaXplKCkpOworCQkJcHJvZmlsZSA9IChTZWFyY2hhYmxlUHJvZmlsZSkgcHJvZmlsZXMuZ2V0KDApOworCQkJYXNzZXJ0RXF1YWxzKCJQUk9GSUxFMSIsIHByb2ZpbGUuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRJRCgpKTsKKwkJCWVsZW1lbnRzID0gcHJvZmlsZS5nZXRQcm9maWxlRWxlbWVudHMoKTsKKwkJCWFzc2VydEVxdWFscygzLCBlbGVtZW50cy5zaXplKCkpOworCQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWluc0tleSgiVEVTVCIpKTsKKwkJCWFzc2VydFRydWUoZWxlbWVudHMuY29udGFpbnNLZXkoIlRFU1QyIikpOworCisJCQkvLyBBbmQgYWdhaW4sIGJ1dCB3aXRoIG9uZSBvZiB0aGUgZWxlbWVudHMgYmVpbmcgbm90IGZvdW5kCisJCQlwcm9maWxlcyA9IGRvU2VhcmNoKCJOT05FWElTVEVOVCA9IDEyMzQ1Njc4OSBPUiBURVNUMiA8PSAxMDAwMDAwIik7CisJCQlhc3NlcnRFcXVhbHMoMSwgcHJvZmlsZXMuc2l6ZSgpKTsKKwkJCXByb2ZpbGUgPSAoU2VhcmNoYWJsZVByb2ZpbGUpIHByb2ZpbGVzLmdldCgwKTsKKwkJCWFzc2VydEVxdWFscygiUFJPRklMRTEiLCBwcm9maWxlLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSk7CisJCQllbGVtZW50cyA9IHByb2ZpbGUuZ2V0UHJvZmlsZUVsZW1lbnRzKCk7CisJCQlhc3NlcnRFcXVhbHMoMywgZWxlbWVudHMuc2l6ZSgpKTsKKwkJCWFzc2VydFRydWUoZWxlbWVudHMuY29udGFpbnNLZXkoIlRFU1QyIikpOworCisJCQkvLyBBbmQgYWdhaW4sIGJ1dCBzcGFubmluZyBwcm9maWxlcworCQkJcHJvZmlsZXMgPSBkb1NlYXJjaCgiVEVTVDIgPSA0OCBPUiBURVNUNCA9IDE5MiIpOworCQkJYXNzZXJ0RXF1YWxzKDIsIHByb2ZpbGVzLnNpemUoKSk7CisJCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9maWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlwcm9maWxlID0gKFNlYXJjaGFibGVQcm9maWxlKSBpLm5leHQoKTsKKwkJCQllbGVtZW50cyA9IHByb2ZpbGUuZ2V0UHJvZmlsZUVsZW1lbnRzKCk7CisJCQkJYXNzZXJ0RXF1YWxzKDMsIGVsZW1lbnRzLnNpemUoKSk7CisJCQkJaWYgKHByb2ZpbGUuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRJRCgpLmVxdWFscygiUFJPRklMRTEiKSkgeworCQkJCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmNvbnRhaW5zS2V5KCJURVNUMiIpKTsKKwkJCQl9IGVsc2UgaWYgKHByb2ZpbGUuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKS5nZXRJRCgpLmVxdWFscygiUFJPRklMRTIiKSkgeworCQkJCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmNvbnRhaW5zS2V5KCJURVNUNCIpKTsKKwkJCQl9IGVsc2UgZmFpbCgiUHJvZmlsZSBcIiIgKyBwcm9maWxlLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSArICJcIiBtYXRjaGVkLCBidXQgc2hvdWxkbid0Iik7CisJCQl9CisKKwkJCS8vIEFuZCBhZ2FpbiwgYnV0IHdpdGggYSBxdWVyeSBvbiB0aGUgImZyb20iIHBhcnQuCisJCQlwcm9maWxlcyA9IGRvU2VhcmNoKCIoIFRFU1QyID0gNDggT1IgVEVTVDQgPSAxOTIgKSBBTkQgQ3JlYXRvciA9IEFsaWNlIik7CisJCQlhc3NlcnRFcXVhbHMoMSwgcHJvZmlsZXMuc2l6ZSgpKTsKKwkJCXByb2ZpbGUgPSAoU2VhcmNoYWJsZVByb2ZpbGUpIHByb2ZpbGVzLmdldCgwKTsKKwkJCWFzc2VydEVxdWFscygiUFJPRklMRTEiLCBwcm9maWxlLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSk7CisKKwkJCS8vIEFuZCBhZ2FpbiwgYnV0IG9uIGEgbm9uZW51bWVyYXRlZCBlbGVtZW50IHdpdGggbm8gbWluL21heCB2YWx1ZXMuCisJCQlwcm9maWxlcyA9IGRvU2VhcmNoKCJURVNUNSA9IEdFRUJBIik7CisJCQlhc3NlcnRFcXVhbHMoMSwgcHJvZmlsZXMuc2l6ZSgpKTsKKwkJCXByb2ZpbGUgPSAoU2VhcmNoYWJsZVByb2ZpbGUpIHByb2ZpbGVzLmdldCgwKTsKKwkJCWFzc2VydEVxdWFscygiUFJPRklMRTIiLCBwcm9maWxlLmdldFByb2ZpbGVBdHRyaWJ1dGVzKCkuZ2V0SUQoKSk7CisKKwkJCS8vIEFuZCBhZ2FpbiwgYnV0IHdpdGggIlJFVFVSTiA9IiBwYXJ0cy4KKwkJCS8vZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOworCisJCX0gY2F0Y2ggKFByb2ZpbGVFeGNlcHRpb24gZXgpIHsKKwkJCWZhaWwoIlByb2ZpbGUgc2VydmVyIGZhaWxlZCB3aXRoIGV4Y2VwdG9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEV4ZWN1dGUgdGhlIGdpdmVuIHNlYXJjaC4KKwkgKgorCSAqIEBwYXJhbSBleHByIFRoZSBzZWFyY2ggZXhwZXJzc2lvbi4KKwkgKiBAcmV0dXJuIExpc3Qgb2YgbWF0Y2hpbmcgcHJvZmlsZXMuCisJICogQHRocm93cyBQcm9maWxlRXhjZXB0aW9uIElmIHRoZSBwcm9maWxlIHNlcnZlciBmYWlscy4KKwkgKi8KKwlwcml2YXRlIExpc3QgZG9TZWFyY2goU3RyaW5nIGV4cHIpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKwkJWE1MUXVlcnkgcXVlcnkgPSBuZXcgWE1MUXVlcnkoZXhwciwgInRlc3QxIiwgIkxpZ2h0d2VpZ2h0UHJvZmlsZVNlcnZlclRlc3QiLAorCQkJIlRoaXMgcXVlcnkgaXMgdG8gdGVzdCB0aGUgTGlnaHR3ZWlnaHRQcm9maWxlU2VydmVyIiwgLypkZElkKi9udWxsLCAvKnJlc3VsdE1vZGVJZCovbnVsbCwKKwkJCS8qcHJvcFR5cGUqL251bGwsIC8qcHJvcExldmVscyovbnVsbCwgWE1MUXVlcnkuREVGQVVMVF9NQVhfUkVTVUxUUyk7CisJCXJldHVybiBzZXJ2ZXIuZmluZFByb2ZpbGVzKHF1ZXJ5KTsKKwl9CisJCQorCisJLyoqIFRoZSBsaWdodHdlaWdodCBwcm9maWxlIHNlcnZlciBiZWluZyB0ZXN0ZWQuICovCisJcHJpdmF0ZSBMaWdodHdlaWdodFByb2ZpbGVTZXJ2ZXIgc2VydmVyOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm9maWxlL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9saWdodHdlaWdodFRlc3QueG1sIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29vZHQvcHJvZmlsZS9oYW5kbGVycy9saWdodHdlaWdodC9saWdodHdlaWdodFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmZiNjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL2hhbmRsZXJzL2xpZ2h0d2VpZ2h0L2xpZ2h0d2VpZ2h0VGVzdC54bWwKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBwcm9maWxlcyBQVUJMSUMgIi0vL0pQTC8vRFREIEVEQSBQcm9maWxlIDEuMS8vRU4iICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvZ3JpZC1wcm9maWxlL2R0ZC9wcm9mLmR0ZCI+Cis8cHJvZmlsZXM+CisgIDxwcm9maWxlPgorICAgIDxwcm9mQXR0cmlidXRlcz4KKyAgICAgIDxwcm9mSWQ+UFJPRklMRTE8L3Byb2ZJZD4KKyAgICAgIDxwcm9mVHlwZT5wcm9maWxlPC9wcm9mVHlwZT4KKyAgICAgIDxwcm9mU3RhdHVzSWQ+YWN0aXZlPC9wcm9mU3RhdHVzSWQ+CisgICAgICA8cHJvZlNlY3VyaXR5VHlwZT5OVUxMPC9wcm9mU2VjdXJpdHlUeXBlPgorICAgICAgPHByb2ZSZXZpc2lvbk5vdGU+MS4wPC9wcm9mUmV2aXNpb25Ob3RlPgorICAgIDwvcHJvZkF0dHJpYnV0ZXM+CisgICAgPHJlc0F0dHJpYnV0ZXM+CisgICAgICA8SWRlbnRpZmllcj5URVNUX1BST0ZJTEVfMTwvSWRlbnRpZmllcj4KKyAgICAgIDxUaXRsZT5UZXN0IHByb2ZpbGUgbnVtYmVyIDE8L1RpdGxlPgorICAgICAgPEZvcm1hdD50ZXh0L2h0bWw8L0Zvcm1hdD4KKyAgICAgIDxDcmVhdG9yPkFsaWNlPC9DcmVhdG9yPgorICAgICAgPHJlc0NvbnRleHQ+VEVTVDwvcmVzQ29udGV4dD4KKyAgICAgIDxyZXNBZ2dyZWdhdGlvbj5OL0E8L3Jlc0FnZ3JlZ2F0aW9uPgorICAgICAgPHJlc0NsYXNzPnN5c3RlbS5wcm9maWxlU2VydmVyPC9yZXNDbGFzcz4KKyAgICAgIDxyZXNMb2NhdGlvbj5paW9wOi8vb29kdC5qcGwubmFzYS5nb3Y6MTAwMDAvVGVzdC5Qcm9maWxlPC9yZXNMb2NhdGlvbj4KKyAgICA8L3Jlc0F0dHJpYnV0ZXM+CisgICAgPHByb2ZFbGVtZW50PgorICAgICAgPGVsZW1JZD4zLjE0MTU5PC9lbGVtSWQ+CisgICAgICA8ZWxlbU5hbWU+VEVTVDwvZWxlbU5hbWU+CisgICAgICA8ZWxlbURlc2M+VGhpcyBpcyBhIHRlc3QgZWxlbWVudDwvZWxlbURlc2M+CisgICAgICA8ZWxlbVR5cGU+VGVzdGluZzwvZWxlbVR5cGU+CisgICAgICA8ZWxlbVVuaXQ+Zm9ydG5pZ2h0cy1wZXItZnVybG9uZzwvZWxlbVVuaXQ+CisgICAgICA8ZWxlbUVudW1GbGFnPkY8L2VsZW1FbnVtRmxhZz4KKyAgICAgIDxlbGVtTWluVmFsdWU+MDwvZWxlbU1pblZhbHVlPgorICAgICAgPGVsZW1NYXhWYWx1ZT4zMjwvZWxlbU1heFZhbHVlPgorICAgICAgPGVsZW1Db21tZW50PlRlc3Rpbmcgb25seS48L2VsZW1Db21tZW50PgorICAgIDwvcHJvZkVsZW1lbnQ+CisgICAgPHByb2ZFbGVtZW50PgorICAgICAgPGVsZW1JZD4zLjI8L2VsZW1JZD4KKyAgICAgIDxlbGVtTmFtZT5URVNUMjwvZWxlbU5hbWU+CisgICAgICA8ZWxlbURlc2M+VGhpcyBpcyBhbm90aGVyIHRlc3QgZWxlbWVudDwvZWxlbURlc2M+CisgICAgICA8ZWxlbVR5cGU+VGVzdGluZzwvZWxlbVR5cGU+CisgICAgICA8ZWxlbVVuaXQ+ZmxlYXMtcGVyLXRpY2s8L2VsZW1Vbml0PgorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+CisgICAgICA8ZWxlbU1pblZhbHVlPjMyPC9lbGVtTWluVmFsdWU+CisgICAgICA8ZWxlbU1heFZhbHVlPjY0PC9lbGVtTWF4VmFsdWU+CisgICAgICA8ZWxlbUNvbW1lbnQ+TW9yZSB0ZXN0aW5nLjwvZWxlbUNvbW1lbnQ+CisgICAgPC9wcm9mRWxlbWVudD4KKyAgICA8cHJvZkVsZW1lbnQ+CisgICAgICA8ZWxlbUlkPjMuNTwvZWxlbUlkPgorICAgICAgPGVsZW1OYW1lPlRFU1QzPC9lbGVtTmFtZT4KKyAgICAgIDxlbGVtRGVzYz5ZZXQgYW5vdGhlciB0ZXN0IGVsZW1lbnQ8L2VsZW1EZXNjPgorICAgICAgPGVsZW1UeXBlPlRlc3Rpbmc8L2VsZW1UeXBlPgorICAgICAgPGVsZW1FbnVtRmxhZz5UPC9lbGVtRW51bUZsYWc+CisgICAgICA8ZWxlbVZhbHVlPmFscGhhPC9lbGVtVmFsdWU+CisgICAgICA8ZWxlbVZhbHVlPmJldGE8L2VsZW1WYWx1ZT4KKyAgICAgIDxlbGVtVmFsdWU+Z2FtbWE8L2VsZW1WYWx1ZT4KKyAgICAgIDxlbGVtVmFsdWU+ZGVsdGE8L2VsZW1WYWx1ZT4KKyAgICAgIDxlbGVtQ29tbWVudD5BIGJ1bmNoIG9mIGdyZWVrIGxldHRlcnMsIGVoPzwvZWxlbUNvbW1lbnQ+CisgICAgPC9wcm9mRWxlbWVudD4KKyAgPC9wcm9maWxlPgorCisgIDxwcm9maWxlPgorICAgIDxwcm9mQXR0cmlidXRlcz4KKyAgICAgIDxwcm9mSWQ+UFJPRklMRTI8L3Byb2ZJZD4KKyAgICAgIDxwcm9mVHlwZT5wcm9maWxlPC9wcm9mVHlwZT4KKyAgICAgIDxwcm9mU3RhdHVzSWQ+YWN0aXZlPC9wcm9mU3RhdHVzSWQ+CisgICAgICA8cHJvZlNlY3VyaXR5VHlwZT5OVUxMPC9wcm9mU2VjdXJpdHlUeXBlPgorICAgICAgPHByb2ZSZXZpc2lvbk5vdGU+MS4wPC9wcm9mUmV2aXNpb25Ob3RlPgorICAgIDwvcHJvZkF0dHJpYnV0ZXM+CisgICAgPHJlc0F0dHJpYnV0ZXM+CisgICAgICA8SWRlbnRpZmllcj5URVNUX1BST0ZJTEVfMjwvSWRlbnRpZmllcj4KKyAgICAgIDxUaXRsZT5UZXN0IHByb2ZpbGUgbnVtYmVyIDI8L1RpdGxlPgorICAgICAgPEZvcm1hdD50ZXh0L2h0bWw8L0Zvcm1hdD4KKyAgICAgIDxDcmVhdG9yPkJpbGw8L0NyZWF0b3I+CisgICAgICA8cmVzQ29udGV4dD5URVNUPC9yZXNDb250ZXh0PgorICAgICAgPHJlc0FnZ3JlZ2F0aW9uPk4vQTwvcmVzQWdncmVnYXRpb24+CisgICAgICA8cmVzQ2xhc3M+c3lzdGVtLnByb2ZpbGVTZXJ2ZXI8L3Jlc0NsYXNzPgorICAgICAgPHJlc0xvY2F0aW9uPmlpb3A6Ly9vb2R0LmpwbC5uYXNhLmdvdjoxMDAwMC9UZXN0LlByb2ZpbGU8L3Jlc0xvY2F0aW9uPgorICAgIDwvcmVzQXR0cmlidXRlcz4KKyAgICA8cHJvZkVsZW1lbnQ+CisgICAgICA8ZWxlbUlkPjMuNTwvZWxlbUlkPgorICAgICAgPGVsZW1OYW1lPlRFU1QzPC9lbGVtTmFtZT4KKyAgICAgIDxlbGVtRGVzYz5ZZXQgYW5vdGhlciB0ZXN0IGVsZW1lbnQ8L2VsZW1EZXNjPgorICAgICAgPGVsZW1UeXBlPlRlc3Rpbmc8L2VsZW1UeXBlPgorICAgICAgPGVsZW1FbnVtRmxhZz5UPC9lbGVtRW51bUZsYWc+CisgICAgICA8ZWxlbVZhbHVlPmFscGhhPC9lbGVtVmFsdWU+CisgICAgICA8ZWxlbVZhbHVlPmJldGE8L2VsZW1WYWx1ZT4KKyAgICAgIDxlbGVtVmFsdWU+Z2FtbWE8L2VsZW1WYWx1ZT4KKyAgICAgIDxlbGVtVmFsdWU+ZGVsdGE8L2VsZW1WYWx1ZT4KKyAgICAgIDxlbGVtQ29tbWVudD5BIGJ1bmNoIG9mIGdyZWVrIGxldHRlcnMsIGVoPzwvZWxlbUNvbW1lbnQ+CisgICAgPC9wcm9mRWxlbWVudD4KKyAgICA8cHJvZkVsZW1lbnQ+CisgICAgICA8ZWxlbUlkPjMuNjwvZWxlbUlkPgorICAgICAgPGVsZW1OYW1lPlRFU1Q0PC9lbGVtTmFtZT4KKyAgICAgIDxlbGVtRGVzYz5BbmQgc3RpbGwgYW5vdGhlciB0ZXN0IGVsZW1lbnQ8L2VsZW1EZXNjPgorICAgICAgPGVsZW1UeXBlPlRlc3Rpbmc8L2VsZW1UeXBlPgorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+CisgICAgICA8ZWxlbU1pblZhbHVlPjEyODwvZWxlbU1pblZhbHVlPgorICAgICAgPGVsZW1NYXhWYWx1ZT4yNTY8L2VsZW1NYXhWYWx1ZT4KKyAgICA8L3Byb2ZFbGVtZW50PgorICAgIDxwcm9mRWxlbWVudD4KKyAgICAgIDxlbGVtSWQ+My43PC9lbGVtSWQ+CisgICAgICA8ZWxlbU5hbWU+VEVTVDU8L2VsZW1OYW1lPgorICAgICAgPGVsZW1EZXNjPlRoaXMgaXMgYSBub25lbnVtZXJhdGVkIGZpZWxkIHdpdGggbm8gbWluL21heCB2YWx1ZXMsIG1lYW5pbmcgaXQgc2hvdWxkIGFsd2F5cyBtYXRjaC48L2VsZW1EZXNjPgorICAgICAgPGVsZW1UeXBlPmNoYXI8L2VsZW1UeXBlPgorICAgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+CisgICAgPC9wcm9mRWxlbWVudD4KKyAgPC9wcm9maWxlPgorPC9wcm9maWxlcz4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvZmlsZS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vb2R0L3Byb2ZpbGUvdGVzdC54bWwgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzhjODIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb29kdC9wcm9maWxlL3Rlc3QueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhLS0gRE8gTk9UIHB1dCB0aGUgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gb3IgRE9DVFlQRSBkZWNsIGluIHRoaXMgLS0+Cis8IS0tIGZpbGUhICBUaGV5J3JlIGFkZGVkIGJ5IHRoZSB1bml0IHRlc3QgYXV0b21hdGljYWxseS4gLS0+Cis8IS0tICRJZDogdGVzdC54bWwsdiAxLjEuMS4xIDIwMDQvMDMvMDIgMjA6NTM6Mzkga2VsbHkgRXhwICQgLS0+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2ZpbGU+CisgIDxwcm9mQXR0cmlidXRlcz4KKyAgICA8cHJvZklkPk9PRFRfUERTX1BST0ZJTEVfU0VSVkVSPC9wcm9mSWQ+CisgICAgPHByb2ZUeXBlPnByb2ZpbGU8L3Byb2ZUeXBlPgorICAgIDxwcm9mU3RhdHVzSWQ+YWN0aXZlPC9wcm9mU3RhdHVzSWQ+CisgICAgPHByb2ZTZWN1cml0eVR5cGU+TlVMTDwvcHJvZlNlY3VyaXR5VHlwZT4KKyAgICA8cHJvZlJldmlzaW9uTm90ZT4xOTk5LTA5LTMwPC9wcm9mUmV2aXNpb25Ob3RlPgorICA8L3Byb2ZBdHRyaWJ1dGVzPgorICA8cmVzQXR0cmlidXRlcz4KKyAgICA8SWRlbnRpZmllcj5QRFNfUFJPRklMRV9TRVJWRVI8L0lkZW50aWZpZXI+CisgICAgPFRpdGxlPlBsYW5ldGFyeSBEYXRhIFN5c3RlbSAoUERTKSAtIFByb2ZpbGUgU2VydmVyIFYxLjA8L1RpdGxlPgorICAgIDxGb3JtYXQ+dGV4dC9odG1sPC9Gb3JtYXQ+CisgICAgPHJlc0NvbnRleHQ+UERTPC9yZXNDb250ZXh0PgorICAgIDxyZXNBZ2dyZWdhdGlvbj5OL0E8L3Jlc0FnZ3JlZ2F0aW9uPgorICAgIDxyZXNDbGFzcz5zeXN0ZW0ucHJvZmlsZVNlcnZlcjwvcmVzQ2xhc3M+CisgICAgPHJlc0xvY2F0aW9uPmlpb3A6Ly9vb2R0LmpwbC5uYXNhLmdvdjoxMDAwMC9KUEwuUERTLlBST0ZJTEU8L3Jlc0xvY2F0aW9uPgorICA8L3Jlc0F0dHJpYnV0ZXM+CisgIDxwcm9mRWxlbWVudD4KKyAgICA8ZWxlbUlkPjMuMTQxNTk8L2VsZW1JZD4KKyAgICA8ZWxlbU5hbWU+VEVTVDwvZWxlbU5hbWU+CisgICAgPGVsZW1EZXNjPlRoaXMgaXMgYSB0ZXN0IGVsZW1lbnQ8L2VsZW1EZXNjPgorICAgIDxlbGVtVHlwZT5UZXN0aW5nPC9lbGVtVHlwZT4KKyAgICA8ZWxlbVVuaXQ+Zm9ydG5pZ2h0cy1wZXItZnVybG9uZzwvZWxlbVVuaXQ+CisgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+CisgICAgPGVsZW1NaW5WYWx1ZT4wPC9lbGVtTWluVmFsdWU+CisgICAgPGVsZW1NYXhWYWx1ZT4zMjwvZWxlbU1heFZhbHVlPgorICAgIDxlbGVtQ29tbWVudD5UZXN0aW5nIG9ubHkuPC9lbGVtQ29tbWVudD4KKyAgPC9wcm9mRWxlbWVudD4KKyAgPHByb2ZFbGVtZW50PgorICAgIDxlbGVtSWQ+My4yPC9lbGVtSWQ+CisgICAgPGVsZW1OYW1lPlRFU1QyPC9lbGVtTmFtZT4KKyAgICA8ZWxlbURlc2M+VGhpcyBpcyBhbm90aGVyIHRlc3QgZWxlbWVudDwvZWxlbURlc2M+CisgICAgPGVsZW1UeXBlPlRlc3Rpbmc8L2VsZW1UeXBlPgorICAgIDxlbGVtVW5pdD5mbGVhcy1wZXItdGljazwvZWxlbVVuaXQ+CisgICAgPGVsZW1FbnVtRmxhZz5GPC9lbGVtRW51bUZsYWc+CisgICAgPGVsZW1NaW5WYWx1ZT4zMjwvZWxlbU1pblZhbHVlPgorICAgIDxlbGVtTWF4VmFsdWU+NjQ8L2VsZW1NYXhWYWx1ZT4KKyAgICA8ZWxlbUNvbW1lbnQ+TW9yZSB0ZXN0aW5nLjwvZWxlbUNvbW1lbnQ+CisgIDwvcHJvZkVsZW1lbnQ+CisgIDxwcm9mRWxlbWVudD4KKyAgICA8ZWxlbUlkPjMuNTwvZWxlbUlkPgorICAgIDxlbGVtTmFtZT5URVNUMzwvZWxlbU5hbWU+CisgICAgPGVsZW1EZXNjPllldCBhbm90aGVyIHRlc3QgZWxlbWVudDwvZWxlbURlc2M+CisgICAgPGVsZW1UeXBlPlRlc3Rpbmc8L2VsZW1UeXBlPgorICAgIDxlbGVtRW51bUZsYWc+VDwvZWxlbUVudW1GbGFnPgorICAgIDxlbGVtVmFsdWU+YWxwaGE8L2VsZW1WYWx1ZT4KKyAgICA8ZWxlbVZhbHVlPmJldGE8L2VsZW1WYWx1ZT4KKyAgICA8ZWxlbVZhbHVlPmdhbW1hPC9lbGVtVmFsdWU+CisgICAgPGVsZW1WYWx1ZT5kZWx0YTwvZWxlbVZhbHVlPgorICAgIDxlbGVtQ29tbWVudD5BIGJ1bmNoIG9mIGdyZWVrIGxldHRlcnMsIGVoPzwvZWxlbUNvbW1lbnQ+CisgIDwvcHJvZkVsZW1lbnQ+Cis8L3Byb2ZpbGU+CmRpZmYgLS1naXQgYS8wLjEwL3Byb2ZpbGUvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QueG1sIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM4YzgyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm9maWxlL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LnhtbApAQCAtMCwwICsxLDcxIEBACis8IS0tIERPIE5PVCBwdXQgdGhlIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIERPQ1RZUEUgZGVjbCBpbiB0aGlzIC0tPgorPCEtLSBmaWxlISAgVGhleSdyZSBhZGRlZCBieSB0aGUgdW5pdCB0ZXN0IGF1dG9tYXRpY2FsbHkuIC0tPgorPCEtLSAkSWQ6IHRlc3QueG1sLHYgMS4xLjEuMSAyMDA0LzAzLzAyIDIwOjUzOjM5IGtlbGx5IEV4cCAkIC0tPgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9maWxlPgorICA8cHJvZkF0dHJpYnV0ZXM+CisgICAgPHByb2ZJZD5PT0RUX1BEU19QUk9GSUxFX1NFUlZFUjwvcHJvZklkPgorICAgIDxwcm9mVHlwZT5wcm9maWxlPC9wcm9mVHlwZT4KKyAgICA8cHJvZlN0YXR1c0lkPmFjdGl2ZTwvcHJvZlN0YXR1c0lkPgorICAgIDxwcm9mU2VjdXJpdHlUeXBlPk5VTEw8L3Byb2ZTZWN1cml0eVR5cGU+CisgICAgPHByb2ZSZXZpc2lvbk5vdGU+MTk5OS0wOS0zMDwvcHJvZlJldmlzaW9uTm90ZT4KKyAgPC9wcm9mQXR0cmlidXRlcz4KKyAgPHJlc0F0dHJpYnV0ZXM+CisgICAgPElkZW50aWZpZXI+UERTX1BST0ZJTEVfU0VSVkVSPC9JZGVudGlmaWVyPgorICAgIDxUaXRsZT5QbGFuZXRhcnkgRGF0YSBTeXN0ZW0gKFBEUykgLSBQcm9maWxlIFNlcnZlciBWMS4wPC9UaXRsZT4KKyAgICA8Rm9ybWF0PnRleHQvaHRtbDwvRm9ybWF0PgorICAgIDxyZXNDb250ZXh0PlBEUzwvcmVzQ29udGV4dD4KKyAgICA8cmVzQWdncmVnYXRpb24+Ti9BPC9yZXNBZ2dyZWdhdGlvbj4KKyAgICA8cmVzQ2xhc3M+c3lzdGVtLnByb2ZpbGVTZXJ2ZXI8L3Jlc0NsYXNzPgorICAgIDxyZXNMb2NhdGlvbj5paW9wOi8vb29kdC5qcGwubmFzYS5nb3Y6MTAwMDAvSlBMLlBEUy5QUk9GSUxFPC9yZXNMb2NhdGlvbj4KKyAgPC9yZXNBdHRyaWJ1dGVzPgorICA8cHJvZkVsZW1lbnQ+CisgICAgPGVsZW1JZD4zLjE0MTU5PC9lbGVtSWQ+CisgICAgPGVsZW1OYW1lPlRFU1Q8L2VsZW1OYW1lPgorICAgIDxlbGVtRGVzYz5UaGlzIGlzIGEgdGVzdCBlbGVtZW50PC9lbGVtRGVzYz4KKyAgICA8ZWxlbVR5cGU+VGVzdGluZzwvZWxlbVR5cGU+CisgICAgPGVsZW1Vbml0PmZvcnRuaWdodHMtcGVyLWZ1cmxvbmc8L2VsZW1Vbml0PgorICAgIDxlbGVtRW51bUZsYWc+RjwvZWxlbUVudW1GbGFnPgorICAgIDxlbGVtTWluVmFsdWU+MDwvZWxlbU1pblZhbHVlPgorICAgIDxlbGVtTWF4VmFsdWU+MzI8L2VsZW1NYXhWYWx1ZT4KKyAgICA8ZWxlbUNvbW1lbnQ+VGVzdGluZyBvbmx5LjwvZWxlbUNvbW1lbnQ+CisgIDwvcHJvZkVsZW1lbnQ+CisgIDxwcm9mRWxlbWVudD4KKyAgICA8ZWxlbUlkPjMuMjwvZWxlbUlkPgorICAgIDxlbGVtTmFtZT5URVNUMjwvZWxlbU5hbWU+CisgICAgPGVsZW1EZXNjPlRoaXMgaXMgYW5vdGhlciB0ZXN0IGVsZW1lbnQ8L2VsZW1EZXNjPgorICAgIDxlbGVtVHlwZT5UZXN0aW5nPC9lbGVtVHlwZT4KKyAgICA8ZWxlbVVuaXQ+ZmxlYXMtcGVyLXRpY2s8L2VsZW1Vbml0PgorICAgIDxlbGVtRW51bUZsYWc+RjwvZWxlbUVudW1GbGFnPgorICAgIDxlbGVtTWluVmFsdWU+MzI8L2VsZW1NaW5WYWx1ZT4KKyAgICA8ZWxlbU1heFZhbHVlPjY0PC9lbGVtTWF4VmFsdWU+CisgICAgPGVsZW1Db21tZW50Pk1vcmUgdGVzdGluZy48L2VsZW1Db21tZW50PgorICA8L3Byb2ZFbGVtZW50PgorICA8cHJvZkVsZW1lbnQ+CisgICAgPGVsZW1JZD4zLjU8L2VsZW1JZD4KKyAgICA8ZWxlbU5hbWU+VEVTVDM8L2VsZW1OYW1lPgorICAgIDxlbGVtRGVzYz5ZZXQgYW5vdGhlciB0ZXN0IGVsZW1lbnQ8L2VsZW1EZXNjPgorICAgIDxlbGVtVHlwZT5UZXN0aW5nPC9lbGVtVHlwZT4KKyAgICA8ZWxlbUVudW1GbGFnPlQ8L2VsZW1FbnVtRmxhZz4KKyAgICA8ZWxlbVZhbHVlPmFscGhhPC9lbGVtVmFsdWU+CisgICAgPGVsZW1WYWx1ZT5iZXRhPC9lbGVtVmFsdWU+CisgICAgPGVsZW1WYWx1ZT5nYW1tYTwvZWxlbVZhbHVlPgorICAgIDxlbGVtVmFsdWU+ZGVsdGE8L2VsZW1WYWx1ZT4KKyAgICA8ZWxlbUNvbW1lbnQ+QSBidW5jaCBvZiBncmVlayBsZXR0ZXJzLCBlaD88L2VsZW1Db21tZW50PgorICA8L3Byb2ZFbGVtZW50PgorPC9wcm9maWxlPgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvcG9tLnhtbCBiLzAuMTAvcHJvdG9jb2wvYXBpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjMzYyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3BvbS54bWwKQEAgLTAsMCArMSwxMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvciAKKwlsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgCisJaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIAorCVlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIAorCXRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgCisJdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCAKKwlieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIAorCUxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgCisJT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIAorCWxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisJCTxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisJPC9wYXJlbnQ+CisJPGFydGlmYWN0SWQ+Y2FzLXByb3RvY29sLWFwaTwvYXJ0aWZhY3RJZD4KKwk8bmFtZT5DQVMgUHJvdG9jb2w8L25hbWU+CisJPHByb2ZpbGVzPgorCQk8cHJvZmlsZT4KKwkJCTxpZD5hdWRpdDwvaWQ+CisJCQk8YWN0aXZhdGlvbj4KKwkJCQk8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisJCQk8L2FjdGl2YXRpb24+CisJCQk8YnVpbGQ+CisJCQkJPHBsdWdpbnM+CisJCQkJCTxwbHVnaW4+CisJCQkJCQk8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKwkJCQkJCTxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8ZXhjbHVkZXM+CisJCQkJCQkJCTxleGNsdWRlPioqL3Jlc291cmNlcy9leGFtcGxlcy8qKi8qPC9leGNsdWRlPgorCQkJCQkJCTwvZXhjbHVkZXM+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJCQk8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKwkJCQkJCQkJPGdvYWxzPgorCQkJCQkJCQkJPGdvYWw+Y2hlY2s8L2dvYWw+CisJCQkJCQkJCTwvZ29hbHM+CisJCQkJCQkJPC9leGVjdXRpb24+CisJCQkJCQk8L2V4ZWN1dGlvbnM+CisJCQkJCTwvcGx1Z2luPgorCQkJCTwvcGx1Z2lucz4KKwkJCTwvYnVpbGQ+CisJCTwvcHJvZmlsZT4KKwk8L3Byb2ZpbGVzPgorCTxidWlsZD4KKwkJPHBsdWdpbnM+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi4yLWJldGEtMjwvdmVyc2lvbj4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPGRlc2NyaXB0b3JzPgorCQkJCQkJPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgorCQkJCQk8L2Rlc2NyaXB0b3JzPgorCQkJCQk8YXJjaGl2ZT4KKwkJCQkJCTxtYW5pZmVzdD4KKwkJCQkJCQk8bWFpbkNsYXNzPm9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtLkNMUHJvdG9jb2xNYW5hZ2VyPC9tYWluQ2xhc3M+CisJCQkJCQk8L21hbmlmZXN0PgorCQkJCQk8L2FyY2hpdmU+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPnNpbmdsZTwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCTwvZXhlY3V0aW9uPgorCQkJCTwvZXhlY3V0aW9ucz4KKwkJCTwvcGx1Z2luPgorCQk8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPHRhcmdldFBhdGg+b3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbDwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3k8L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPnByb3RvY29sLWNvbmZpZy54bWw8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorCTwvYnVpbGQ+CisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5vb2R0LWNvbW1vbnM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtbGFuZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPnhtbHJwYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnhtbHJwYzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy54c3RyZWFtPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+eHN0cmVhbTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMy4xPC92ZXJzaW9uPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPCEtLSB4b20gaXMgYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvZiB4c3RyZWFtLiBJdHMgYWxzbyBhbiBBcGFjaGUgaW5jb21wYXRpYmxlIAorCQkJCQkJbGljZW5zZSAtLT4KKwkJCQkJPGdyb3VwSWQ+eG9tPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD54b208L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQk8L2V4Y2x1c2lvbnM+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwk8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWYxM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorICA8aWQ+ZGlzdDwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgIDxiYXNlRGlyZWN0b3J5PiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+CisgIDxpbmNsdWRlU2l0ZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZVNpdGVEaXJlY3Rvcnk+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT4uPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5DSEFOR0VTLnR4dDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2JpbjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5iaW48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgICA8ZmlsZU1vZGU+NzU1PC9maWxlTW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmV0Yzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPmpzc2VjYWNlcnRzPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmV0Yy9leGFtcGxlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxvZ3M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+UkVNT1ZFLmxvZzwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3k8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPmNtZC1saW5lLWFjdGlvbnMueG1sPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5jbWQtbGluZS1vcHRpb25zLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2w8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPnByb3RvY29sLWNvbmZpZy54bWw8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5PgorICAgICAgPGZpbHRlcmVkPmZhbHNlPC9maWx0ZXJlZD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgorCmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9iaW4vcHJvdG9jb2wgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9iaW4vcHJvdG9jb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0Y2MyMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2Jpbi9wcm90b2NvbApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vY3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgYXJncworCitpZiAoICQjYXJncyA+IDAgKSB0aGVuCisgICAgICAgIHNldCBhcmdzID0gIiQqIgorZW5kaWYKKworJHtKQVZBX0hPTUV9L2Jpbi9qYXZhIFwKKyAgICAgICAgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBcCisgICAgICAgIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9Li4vZXRjL2xvZ2dpbmcucHJvcGVydGllcyBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnNwcmluZy5jb25maWc9Li4vcG9saWN5L2NtZC1saW5lLWFjdGlvbnMueG1sIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uc3ByaW5nLmNvbmZpZz0uLi9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwgXAorICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnN5c3RlbS5Qcm90b2NvbENvbW1hbmRMaW5lICR7YXJnc30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9Qcm90b2NvbC5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL1Byb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMDVlMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9Qcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmV4Y2VwdGlvbnMuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC51dGlsLlByb3RvY29sRmlsZUZpbHRlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpb24gb3ZlciBkaWZmZXJlbnQgdHJhbnNmZXIgcHJvdG9jb2xzCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb3RvY29sIHsKKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoU3RyaW5nIGhvc3QsIEF1dGhlbnRpY2F0aW9uIGF1dGhlbnRpY2F0aW9uKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb247CisgICAgCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb247CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ZWQoKTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjZChQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgY2RSb290KCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgY2RIb21lKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgZ2V0KFByb3RvY29sRmlsZSBmcm9tRmlsZSwgRmlsZSB0b0ZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHB1dChGaWxlIGZyb21GaWxlLCBQcm90b2NvbEZpbGUgdG9GaWxlKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb247CisgICAgCisgICAgcHVibGljIFByb3RvY29sRmlsZSBwd2QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb247CisKKyAgICBwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uOworCisgICAgcHVibGljIExpc3Q8UHJvdG9jb2xGaWxlPiBscyhQcm90b2NvbEZpbGVGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoUHJvdG9jb2xGaWxlIGZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL1Byb3RvY29sRmFjdG9yeS5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL1Byb3RvY29sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjE1M2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvUHJvdG9jb2xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2w7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFByb3RvY29sfXMKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvdG9jb2xGYWN0b3J5IHsKKworICAgIHB1YmxpYyBQcm90b2NvbCBuZXdJbnN0YW5jZSgpOworCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKTsKKyAgICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9Qcm90b2NvbEZpbGUuamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9Qcm90b2NvbEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzVkY2M3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL1Byb3RvY29sRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbDsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvKioKKyAqIEEgcGF0aCByZXByZXNlbnRpbmcgYSBmaWxlL2RpcmVjdG9yeSBvdmVyIHNvbWUge0BsaW5rIFByb3RvY29sfQorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFByb3RvY29sRmlsZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLyI7CisJCisJcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKwlwcml2YXRlIGJvb2xlYW4gaXNEaXI7CisJcHJpdmF0ZSBQcm90b2NvbEZpbGUgcGFyZW50OworCQorCXB1YmxpYyBQcm90b2NvbEZpbGUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNEaXIpIHsKKwkJdGhpcyhudWxsLCBwYXRoLCBpc0Rpcik7CisJfQorCQorCXB1YmxpYyBQcm90b2NvbEZpbGUoUHJvdG9jb2xGaWxlIHBhcmVudCwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNEaXIpIHsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCXRoaXMuaXNEaXIgPSBpc0RpcjsKKwkJVmFsaWRhdGUubm90TnVsbChwYXRoLCAiUHJvdG9jb2xGaWxlJ3MgcGF0aCBjYW5ub3QgYmUgTlVMTCIpOworCQl0aGlzLnBhdGggPSBwYXRoLmxlbmd0aCgpID4gMCAmJiAhcGF0aC5lcXVhbHMoU0VQQVJBVE9SKSA/IFN0cmluZ1V0aWxzCisJCQkJLmNob21wKHBhdGgsIFNFUEFSQVRPUikgOiBwYXRoOworCX0KKworCS8qKgorCSAqIFRydWUgaXMgdGhpcyBwYXRoIGlzIGEgZGlyZWN0b3J5LgorCSAqIAorCSAqIEByZXR1cm4gVHJ1ZSBpZiBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGlyKCkgeworCQlyZXR1cm4gaXNEaXI7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUge0BsaW5rIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwYXRoLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIHtAbGluayBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGF0aAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgdGhpcyBwYXRoIHJlcHJlc2VudHMgKGkuZS4gJy9wYXRoL3RvL2ZpbGUnIHdpbGwKKwkgKiByZXR1cm4gJ2ZpbGUnKQorCSAqIAorCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhpcyBwYXRoIHJlcHJlc2VudHMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFNFUEFSQVRPUikgKyAxKTsKKwl9CisKKwkvKioKKwkgKiBUcnVlIGlmIHRoaXMgcGF0aCBpcyBhIHJlbGF0aXZlIHBhdGggKGkuZS4gZG9lcyBub3Qgc3RhcnQgd2l0aAorCSAqIHtAbGluayBTRVBBUkFUT1J9KS4KKwkgKiAKKwkgKiBAcmV0dXJuIFRydWUgaXMgdGhpcyBhIHJlbGF0aXZlIHBhdGgsIGZhbHNlIG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKSB7CisJCXJldHVybiAhcGF0aC5zdGFydHNXaXRoKFNFUEFSQVRPUik7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgcGFyZW50IHtAbGluayBQcm90b2NvbEZpbGV9IGZvciB0aGlzIHBhdGguCisJICogCisJICogQHJldHVybiBUaGUgcGFyZW50IHtAbGluayBQcm90b2NvbEZpbGV9CisJICovCisJcHVibGljIFByb3RvY29sRmlsZSBnZXRQYXJlbnQoKSB7CisJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHBhcmVudDsKKwkJfSBlbHNlIHsKKwkJCWludCBpbmRleCA9IFN0cmluZ1V0aWxzLmxhc3RJbmRleE9mKHBhdGgsIFNFUEFSQVRPUik7CisJCQlyZXR1cm4gKGluZGV4ID4gMCkgPyBuZXcgUHJvdG9jb2xGaWxlKFN0cmluZ1V0aWxzLnN1YnN0cmluZyhwYXRoLCAwLCBpbmRleCksIHRydWUpIDogbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIEdldCBBYnNvbHV0ZSBwYXRoZWQge0BsaW5rIFByb3RvY29sRmlsZX0gdmVyc2lvbiBvZiB0aGlzIHtAbGluayBQcm90b2NvbEZpbGV9LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGhlZCB2ZXJzaW9uIG9mIHRoaXMge0BsaW5rIFByb3RvY29sRmlsZX0KKwkgKi8KKwlwdWJsaWMgUHJvdG9jb2xGaWxlIGdldEFic29sdXRlRmlsZSgpIHsKKwkJaWYgKHRoaXMuaXNSZWxhdGl2ZSgpKSB7CisJCSAgUHJvdG9jb2xGaWxlIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7CisJCSAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBQcm90b2NvbEZpbGUoU3RyaW5nVXRpbHMuY2hvbXAocGFyZW50LmdldEFic29sdXRlRmlsZSgpLmdldFBhdGgoKSwgU0VQQVJBVE9SKQorCQkJCQkJKyBTRVBBUkFUT1IgKyB0aGlzLmdldFBhdGgoKSwgdGhpcy5pc0RpcigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGF0aCgpLmhhc2hDb2RlKCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcGF0aCkgeworCQlpZiAocGF0aCBpbnN0YW5jZW9mIFByb3RvY29sRmlsZSkgeworCQkJUHJvdG9jb2xGaWxlIHAgPSAoUHJvdG9jb2xGaWxlKSBwYXRoOworCQkJcmV0dXJuIChwLmdldEFic29sdXRlRmlsZSgpLmdldFBhdGgoKQorCQkJCQkuZXF1YWxzKHRoaXMuZ2V0QWJzb2x1dGVGaWxlKCkuZ2V0UGF0aCgpKSAmJiBwLmlzRGlyKCkgPT0gdGhpcworCQkJCQkuaXNEaXIoKSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIntwYXJlbnQgPSAnIiArIHRoaXMucGFyZW50ICsgIicsIHBhdGggPSAnIiArIHBhdGggKyAiJywgaXNEaXIgPSAnIiArIGlzRGlyICsgIid9IjsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvYXV0aC9BdXRoZW50aWNhdGlvbi5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvQXV0aGVudGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODFlN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvQXV0aGVudGljYXRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoOworCisvKioKKyAqIEF1dGhlbnRpY2F0aW9uIGludGVyZmFjZSBmb3Ige0BsaW5rIFByb3RvY29sfSBjb25uZWN0aW9ucworICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBBdXRoZW50aWNhdGlvbiB7CisKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKTsKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFBhc3MoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvQmFzaWNBdXRoZW50aWNhdGlvbi5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvQmFzaWNBdXRoZW50aWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTQ0MzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvYXV0aC9CYXNpY0F1dGhlbnRpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvKioKKyAqIEJhc2ljIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB7QGxpbmsgQXV0aGVudGljYXRpb259CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQmFzaWNBdXRoZW50aWNhdGlvbiBpbXBsZW1lbnRzIEF1dGhlbnRpY2F0aW9uIHsKKworCXByaXZhdGUgU3RyaW5nIHVzZXI7CisJcHJpdmF0ZSBTdHJpbmcgcGFzczsKKwkKKwlwdWJsaWMgQmFzaWNBdXRoZW50aWNhdGlvbihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3MpIHsKKwkJVmFsaWRhdGUubm90TnVsbCh1c2VyLCAiTlVMTCB1c2VyIG5vdCBhbGxvd2VkIik7CisJCVZhbGlkYXRlLm5vdE51bGwocGFzcywgIk5VTEwgcGFzcyBub3QgYWxsb3dlZCIpOworCQl0aGlzLnVzZXIgPSB1c2VyOworCQl0aGlzLnBhc3MgPSBwYXNzOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CisJCXJldHVybiB1c2VyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGFzcygpIHsKKwkJcmV0dXJuIHBhc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvTm9BdXRoZW50aWNhdGlvbi5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvTm9BdXRoZW50aWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDAyZDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvYXV0aC9Ob0F1dGhlbnRpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aDsKKworLyoqCisgKiBVc2Ugd2hlbiB7QGxpbmsgUHJvdG9jb2x9IHJlcXVpcmVzIG5vIHtAbGluayBBdXRoZW50aWNhdGlvbn0gCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgTm9BdXRoZW50aWNhdGlvbiBpbXBsZW1lbnRzIEF1dGhlbnRpY2F0aW9uIHsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKKwkJcmV0dXJuICIiOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGFzcygpIHsKKwkJcmV0dXJuICIiOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vQmFzaWNWZXJpZnlDbGlBY3Rpb24uamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0Jhc2ljVmVyaWZ5Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzZmE5ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0Jhc2ljVmVyaWZ5Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtLlByb3RvY29sTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnZlcmlmeS5Qcm90b2NvbFZlcmlmaWVyOworCisvKioKKyAqIEFjdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGdpdmVuIHtAbGluayBQcm90b2NvbH0gb3IgYXV0by1kZXRlcm1pbmVkCisgKiB7QGxpbmsgUHJvdG9jb2x9IHZpYSB7QGxpbmsgUHJvdG9jb2xNYW5hZ2VyfSBjYW4gY29ubmVjdCBhbmQgcGFzcworICogdmVyaWZpY2F0aW9uIG9mIHRoZSBnaXZlbiB7QGxpbmsgVmVyaWZpZXJ9IGZvciBnaXZlbiBzaXRlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEJhc2ljVmVyaWZ5Q2xpQWN0aW9uIGV4dGVuZHMgUHJvdG9jb2xDbGlBY3Rpb24geworCisgICBwcml2YXRlIFByb3RvY29sVmVyaWZpZXIgdmVyaWZpZXI7CisgICBwcml2YXRlIFByb3RvY29sRmFjdG9yeSBmYWN0b3J5OworCisgICBwcml2YXRlIGJvb2xlYW4gbGFzdFZlcmlmaWNhdGlvblJlc3VsdDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBmYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAobGFzdFZlcmlmaWNhdGlvblJlc3VsdCA9IHZlcmlmaWVyLnZlcmlmeShwcm90b2NvbCwgZ2V0U2l0ZSgpLAorICAgICAgICAgICAgICAgICAgZ2V0QXV0aGVudGljYXRpb24oKSkpIHsKKyAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUHJvdG9jb2wgJyIKKyAgICAgICAgICAgICAgICAgICAgICsgcHJvdG9jb2wuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIicgUEFTU0VEIHZlcmlmaWNhdGlvbiEiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb3RvY29sICciCisgICAgICAgICAgICAgICAgICAgICArIHByb3RvY29sLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICArICInIEZBSUxFRCB2ZXJpZmljYXRpb24hIik7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBnZXRQcm90b2NvbE1hbmFnZXIoKS5nZXRQcm90b2NvbEJ5U2l0ZSgKKyAgICAgICAgICAgICAgICAgIGdldFNpdGUoKSwgZ2V0QXV0aGVudGljYXRpb24oKSwgdmVyaWZpZXIpOworICAgICAgICAgICAgaWYgKGxhc3RWZXJpZmljYXRpb25SZXN1bHQgPSBwcm90b2NvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlByb3RvY29sICciCisgICAgICAgICAgICAgICAgICAgICArIHByb3RvY29sLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICArICInIFBBU1NFRCB2ZXJpZmljYXRpb24hIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJObyBQcm90b2NvbCBkZXRlcm1pbmVkLCBGQUlMRUQgdmVyaWZpY2F0aW9uISIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gdmVyaWZ5IGZhY3RvcnkgJyIKKyAgICAgICAgICAgICAgICsgZmFjdG9yeSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0VmVyaWZpZXIoUHJvdG9jb2xWZXJpZmllciB2ZXJpZmllcikgeworICAgICAgdGhpcy52ZXJpZmllciA9IHZlcmlmaWVyOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbEZhY3RvcnkoUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICB9CisKKyAgIHByb3RlY3RlZCBib29sZWFuIGdldExhc3RWZXJpZmljYXRpb25SZXN1bHRzKCkgeworICAgICAgcmV0dXJuIGxhc3RWZXJpZmljYXRpb25SZXN1bHQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Dcm9zc1Byb3RvY29sVHJhbnNmZXJDbGlBY3Rpb24uamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0Nyb3NzUHJvdG9jb2xUcmFuc2ZlckNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmVlYjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Dcm9zc1Byb3RvY29sVHJhbnNmZXJDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQmFzaWNBdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguTm9BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnN5c3RlbS5Qcm90b2NvbE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC52ZXJpZnkuUHJvdG9jb2xWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnZlcmlmeS5Qcm90b2NvbFZlcmlmaWVyRmFjdG9yeTsKKworLyoqCisgKiB7QGxpbmsgUHJvdG9jb2xBY3Rpb259IGZvciB0cmFuc2ZlcnJpbmcgYSBmaWxlIGZyb20gb25lIGhvc3QgdG8gYW5vdGhlcgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIENyb3NzUHJvdG9jb2xUcmFuc2ZlckNsaUFjdGlvbiBleHRlbmRzIFByb3RvY29sQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBVUkkgZnJvbVVyaTsKKyAgIHByaXZhdGUgVVJJIHRvVXJpOworICAgcHJpdmF0ZSBQcm90b2NvbFZlcmlmaWVyRmFjdG9yeSB2ZXJpZmllckZhY3Rvcnk7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFByb3RvY29sVmVyaWZpZXIgdmVyaWZpZXIgPSBudWxsOworICAgICAgICAgaWYgKHZlcmlmaWVyRmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICB2ZXJpZmllciA9IHZlcmlmaWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgfQorCisgICAgICAgICBGaWxlIGxvY2FsRmlsZSA9IGNyZWF0ZVRlbXBEb3dubG9hZEZpbGUoKTsKKyAgICAgICAgIGlmIChsb2NhbEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wb3J5IGxvY2FsIGZpbGUiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgUHJvdG9jb2xNYW5hZ2VyIHByb3RvY29sTWFuYWdlciA9IGdldFByb3RvY29sTWFuYWdlcigpOworICAgICAgICAgUHJvdG9jb2wgZnJvbVByb3RvY29sID0gcHJvdG9jb2xNYW5hZ2VyLmdldFByb3RvY29sQnlTaXRlKGZyb21VcmksCisgICAgICAgICAgICAgICBnZXRBdXRoZW50aWNhdGlvbihmcm9tVXJpKSwgdmVyaWZpZXIpOworICAgICAgICAgaWYgKGZyb21Qcm90b2NvbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHByb3RvY29sIGZvciAnZnJvbScgVVJJICciCisgICAgICAgICAgICAgICAgICArIGZyb21VcmkgKyAiJyIpOworICAgICAgICAgfQorCisgICAgICAgICBQcm90b2NvbCB0b1Byb3RvY29sID0gcHJvdG9jb2xNYW5hZ2VyLmdldFByb3RvY29sQnlTaXRlKHRvVXJpLAorICAgICAgICAgICAgICAgZ2V0QXV0aGVudGljYXRpb24odG9VcmkpLCB2ZXJpZmllcik7CisgICAgICAgICBpZiAodG9Qcm90b2NvbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHByb3RvY29sIGZvciAndG8nIFVSSSAnIiArIHRvVXJpCisgICAgICAgICAgICAgICAgICArICInIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGZyb21Qcm90b2NvbAorICAgICAgICAgICAgICAgLmdldChuZXcgUHJvdG9jb2xGaWxlKGZyb21VcmkuZ2V0UGF0aCgpLCBmYWxzZSksIGxvY2FsRmlsZSk7CisgICAgICAgICB0b1Byb3RvY29sLnB1dChsb2NhbEZpbGUsIG5ldyBQcm90b2NvbEZpbGUodG9VcmkuZ2V0UGF0aCgpLCBmYWxzZSkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byB0cmFuc2ZlciBiZXR3ZWVuIDIgcHJvdG9jb2xzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RnJvbVVyaShTdHJpbmcgZnJvbVVyaSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICB0aGlzLmZyb21VcmkgPSBuZXcgVVJJKGZyb21VcmkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRUb1VyaShTdHJpbmcgdG9VcmkpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgdGhpcy50b1VyaSA9IG5ldyBVUkkodG9VcmkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRWZXJpZmllckZhY3RvcnkoUHJvdG9jb2xWZXJpZmllckZhY3RvcnkgdmVyaWZpZXJGYWN0b3J5KSB7CisgICAgICB0aGlzLnZlcmlmaWVyRmFjdG9yeSA9IHZlcmlmaWVyRmFjdG9yeTsKKyAgIH0KKworICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBEb3dubG9hZEZpbGUoKSB7CisgICAgICBGaWxlIGJvZ3VzRmlsZSA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICAgYm9ndXNGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYm9ndXMiLCAiYm9ndXMiKTsKKyAgICAgICAgIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUoYm9ndXNGaWxlLmdldFBhcmVudEZpbGUoKSwgIlByb3RvY29sVHJhbnNmZXIvIgorICAgICAgICAgICAgICAgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsKKyAgICAgICAgIHRtcERpci5ta2RpcnMoKTsKKyAgICAgICAgIHJldHVybiBuZXcgRmlsZSh0bXBEaXIsICJ0ZW1wX2ZpbGUiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9ndXNGaWxlLmRlbGV0ZSgpOworICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcHJpdmF0ZSBBdXRoZW50aWNhdGlvbiBnZXRBdXRoZW50aWNhdGlvbihVUkkgdXJpKSB7CisgICAgICBpZiAodXJpLmdldFVzZXJJbmZvKCkgIT0gbnVsbCkgeworICAgICAgICAgU3RyaW5nW10gdXNlckluZm8gPSB1cmkuZ2V0VXNlckluZm8oKS5zcGxpdCgiXFw6Iik7CisgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXV0aGVudGljYXRpb24odXNlckluZm9bMF0sIHVzZXJJbmZvWzFdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gbmV3IE5vQXV0aGVudGljYXRpb24oKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0RlbGV0ZUVtcHR5RGlyZWN0b3JpZXNDbGlBY3Rpb24uamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0RlbGV0ZUVtcHR5RGlyZWN0b3JpZXNDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRjOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vRGVsZXRlRW1wdHlEaXJlY3Rvcmllc0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNsaS5hY3Rpb247CisKKy8vIEpESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKworCisvLyBPT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudmVyaWZ5LlByb3RvY29sVmVyaWZpZXJGYWN0b3J5OworCisvKioKKyAqIHtAbGluayBQcm90b2NvbEFjdGlvbn0gZm9yIGRlbGV0aW5nIGVtcHR5IGZpbGVzIGZyb20gc2l0ZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxldGVFbXB0eURpcmVjdG9yaWVzQ2xpQWN0aW9uIGV4dGVuZHMgUHJvdG9jb2xDbGlBY3Rpb24geworCisgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVJlZ2V4ID0gIi4rIjsKKyAgcHJpdmF0ZSBQcm90b2NvbFZlcmlmaWVyRmFjdG9yeSB2ZXJpZmllckZhY3Rvcnk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IGdldFByb3RvY29sTWFuYWdlcigpLmdldFByb3RvY29sQnlTaXRlKAorICAgICAgICAgIGdldFNpdGUoKSwgZ2V0QXV0aGVudGljYXRpb24oKSwgdmVyaWZpZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkpOworICAgICAgTGlzdDxQcm90b2NvbEZpbGU+IGZpbGVzID0gcHJvdG9jb2wubHMoKTsKKyAgICAgIGZvciAoUHJvdG9jb2xGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgICBpZiAoZmlsZS5pc0RpcigpICYmIFBhdHRlcm4ubWF0Y2hlcyhkaXJlY3RvcnlSZWdleCwgZmlsZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3RvY29sLmRlbGV0ZShmaWxlKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3VjY2VzczogIiArIGZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJGYWlsZWQ6ICIgKyBmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlIGRpcmVjdG9yaWVzIiwgZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5UmVnZXgoU3RyaW5nIGRpcmVjdG9yeVJlZ2V4KSB7CisgICAgdGhpcy5kaXJlY3RvcnlSZWdleCA9IGRpcmVjdG9yeVJlZ2V4OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VmVyaWZpZXJGYWN0b3J5KFByb3RvY29sVmVyaWZpZXJGYWN0b3J5IHZlcmlmaWVyRmFjdG9yeSkgeworICAgIHRoaXMudmVyaWZpZXJGYWN0b3J5ID0gdmVyaWZpZXJGYWN0b3J5OworICB9Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0Rvd25sb2FkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Eb3dubG9hZENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDBiNjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Eb3dubG9hZENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtLlByb3RvY29sTWFuYWdlcjsKKworLyoqCisgKiBBIHtAbGluayBQcm90b2NvbEFjdGlvbn0gd2hpY2ggd2lsbCBkb3dubGFvZCBhIHVybAorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIERvd25sb2FkQ2xpQWN0aW9uIGV4dGVuZHMgUHJvdG9jb2xDbGlBY3Rpb24geworCisgICBwcm90ZWN0ZWQgVVJJIHVyaTsKKyAgIHByb3RlY3RlZCBTdHJpbmcgdG9EaXI7CisgICBwcm90ZWN0ZWQgUHJvdG9jb2wgdXNlZFByb3RvY29sOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICB1c2VkUHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbChnZXRQcm90b2NvbE1hbmFnZXIoKSk7CisgICAgICAgICBQcm90b2NvbEZpbGUgZnJvbUZpbGUgPSBjcmVhdGVQcm90b2NvbEZpbGUoKTsKKyAgICAgICAgIFN0cmluZyB0b0ZpbGVuYW1lID0gZnJvbUZpbGUuZXF1YWxzKFByb3RvY29sRmlsZS5TRVBBUkFUT1IpCisgICAgICAgICAgICAgICB8fCBmcm9tRmlsZS5nZXROYW1lKCkuaXNFbXB0eSgpID8gdXJpLmdldEhvc3QoKSA6IGZyb21GaWxlCisgICAgICAgICAgICAgICAuZ2V0TmFtZSgpOworICAgICAgICAgRmlsZSB0b0ZpbGUgPSAodG9EaXIgIT0gbnVsbCkgPyBuZXcgRmlsZSh0b0RpciwgdG9GaWxlbmFtZSkKKyAgICAgICAgICAgICAgIDogbmV3IEZpbGUodG9GaWxlbmFtZSk7CisgICAgICAgICB1c2VkUHJvdG9jb2wuZ2V0KGZyb21GaWxlLCB0b0ZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZG93bmxvYWQgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmxTdHJpbmcpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgdXJpID0gbmV3IFVSSSh1cmxTdHJpbmcpOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRUb0RpcihTdHJpbmcgdG9EaXIpIHsKKyAgICAgIHRoaXMudG9EaXIgPSB0b0RpcjsKKyAgIH0KKworICAgcHJvdGVjdGVkIFByb3RvY29sIGdldFVzZWRQcm90b2NvbCgpIHsKKyAgICAgIHJldHVybiB1c2VkUHJvdG9jb2w7CisgICB9CisKKyAgIHByb3RlY3RlZCBQcm90b2NvbEZpbGUgY3JlYXRlUHJvdG9jb2xGaWxlKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbmV3IFByb3RvY29sRmlsZSh1cmkuZ2V0UGF0aCgpLCBmYWxzZSk7CisgICB9CisKKyAgIHByb3RlY3RlZCBQcm90b2NvbCBjcmVhdGVQcm90b2NvbChQcm90b2NvbE1hbmFnZXIgcHJvdG9jb2xNYW5hZ2VyKQorICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gcHJvdG9jb2xNYW5hZ2VyLmdldFByb3RvY29sQnlTaXRlKAorICAgICAgICAgICAgbmV3IFVSSSh1cmkuZ2V0U2NoZW1lKCksIHVyaS5nZXRIb3N0KCksIG51bGwsIG51bGwpLAorICAgICAgICAgICAgZ2V0QXV0aGVudGljYXRpb24oKSwgbnVsbCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9HZXRTdXBwb3J0ZWRGYWN0b3JpZXNDbGlBY3Rpb24uamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL0dldFN1cHBvcnRlZEZhY3Rvcmllc0NsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDI5NDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9HZXRTdXBwb3J0ZWRGYWN0b3JpZXNDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5jbGkuYWN0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworCisvKioKKyAqIHtAbGluayBQcm90b2NvbEFjdGlvbn0gZm9yIGdldCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHtAbGluayBQcm90b2NvbEZhY3Rvcnl9cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRTdXBwb3J0ZWRGYWN0b3JpZXNDbGlBY3Rpb24gZXh0ZW5kcyBQcm90b2NvbENsaUFjdGlvbiB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3VwcG9ydGVkIEZhY3RvcmllczoiKTsKKyAgICAgICAgIGZvciAoUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBnZXRQcm90b2NvbE1hbmFnZXIoKS5nZXRGYWN0b3JpZXMoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLSAiICsgZmFjdG9yeS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBzdXBwb3J0ZWQgZmFjdG9yaWVzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL1Byb3RvY29sQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Qcm90b2NvbENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTg3ODQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Qcm90b2NvbENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoLkF1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5CYXNpY0F1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5Ob0F1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY29uZmlnLlNwcmluZ1Byb3RvY29sQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtLlByb3RvY29sTWFuYWdlcjsKKworLyoqCisgKiBBY3Rpb24gdXNlZCB0byBwZXJmb3JtIHNvbWUgdGFzayB2aWEgYSB7QGxpbmsgUHJvdG9jb2xNYW5hZ2VyfQorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3RvY29sQ2xpQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHVzZXI7CisgICBwcml2YXRlIFN0cmluZyBwYXNzOworICAgcHJpdmF0ZSBTdHJpbmcgc2l0ZTsKKyAgIHByaXZhdGUgUHJvdG9jb2xNYW5hZ2VyIHByb3RvY29sTWFuYWdlcjsKKworICAgcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgdXNlcikgeworICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UGFzcyhTdHJpbmcgcGFzcykgeworICAgICAgdGhpcy5wYXNzID0gcGFzczsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0U2l0ZShTdHJpbmcgc2l0ZSkgeworICAgICAgdGhpcy5zaXRlID0gc2l0ZTsKKyAgIH0KKworICAgcHVibGljIFVSSSBnZXRTaXRlKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc2l0ZSAhPSBudWxsID8gbmV3IFVSSShzaXRlKSA6IG51bGw7CisgICB9CisKKyAgIHB1YmxpYyBBdXRoZW50aWNhdGlvbiBnZXRBdXRoZW50aWNhdGlvbigpIHsKKyAgICAgIGlmICh1c2VyID09IG51bGwgfHwgcGFzcyA9PSBudWxsKSB7CisgICAgICAgICByZXR1cm4gbmV3IE5vQXV0aGVudGljYXRpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXV0aGVudGljYXRpb24odXNlciwgcGFzcyk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sTWFuYWdlcihQcm90b2NvbE1hbmFnZXIgcHJvdG9jb2xNYW5hZ2VyKSB7CisgICAgICB0aGlzLnByb3RvY29sTWFuYWdlciA9IHByb3RvY29sTWFuYWdlcjsKKyAgIH0KKworICAgcHVibGljIFByb3RvY29sTWFuYWdlciBnZXRQcm90b2NvbE1hbmFnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmIChwcm90b2NvbE1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgcmV0dXJuIHByb3RvY29sTWFuYWdlcjsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBwcm90b2NvbENvbmZpZyA9IFBhdGhVdGlscworICAgICAgICAgICAgLmRvRHluYW1pY1JlcGxhY2VtZW50KFN5c3RlbQorICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wubWFuYWdlci5jb25maWcuZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NwYXRoOi9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3Byb3RvY29sLWNvbmZpZy54bWwiKSk7CisgICAgICByZXR1cm4gcHJvdG9jb2xNYW5hZ2VyID0gbmV3IFByb3RvY29sTWFuYWdlcihuZXcgU3ByaW5nUHJvdG9jb2xDb25maWcoCisgICAgICAgICAgICBwcm90b2NvbENvbmZpZykpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NvbmZpZy9Qcm90b2NvbENvbmZpZy5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NvbmZpZy9Qcm90b2NvbENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjk1MWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY29uZmlnL1Byb3RvY29sQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY29uZmlnOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtLlByb3RvY29sTWFuYWdlcjsKKworLyoqCisgKiBQcm90b2NvbCBjb25maWd1cmF0aW9uIGZvciBjb25maWd1cmluZyB7QGxpbmsgUHJvdG9jb2xNYW5hZ2VyfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBQcm90b2NvbENvbmZpZyB7CisKKwlwdWJsaWMgTGlzdDxQcm90b2NvbEZhY3Rvcnk+IGdldEFsbEZhY3RvcmllcygpOworCQorCXB1YmxpYyBMaXN0PFByb3RvY29sRmFjdG9yeT4gZ2V0RmFjdG9yaWVzQnlTaXRlKFVSSSBzaXRlKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jb25maWcvU3ByaW5nUHJvdG9jb2xDb25maWcuamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jb25maWcvU3ByaW5nUHJvdG9jb2xDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU4OTIxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NvbmZpZy9TcHJpbmdQcm90b2NvbENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNvbmZpZzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8vU3ByaW5nIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0OworCisvKioKKyAqIFNwcmluZyBGcmFtZXdvcmsgYmFzZSB7QGxpbmsgUHJvdG9jb2xDb25maWd9IHdoaWNoIGxvYWRzIHtAbGluayBQcm90b2NvbEZhY3Rvcnl9cworICogZnJvbSBhIFNwcmluZyB4bWwgYmVhbiBmaWxlLgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nUHJvdG9jb2xDb25maWcgaW1wbGVtZW50cyBQcm90b2NvbENvbmZpZyB7CisKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgTGlzdDxQcm90b2NvbEZhY3Rvcnk+PiBmYWN0b3J5TWFwOworCQorCXB1YmxpYyBTcHJpbmdQcm90b2NvbENvbmZpZyhTdHJpbmcgY29uZmlnRmlsZSkgeworCQlWYWxpZGF0ZS5ub3ROdWxsKGNvbmZpZ0ZpbGUsICJTcHJpbmdQcm90b2NvbENvbmZpZyBjb25maWdGaWxlIGNhbm5ub3QgYmUgTlVMTCIpOworCQlmYWN0b3J5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3RvY29sRmFjdG9yeT4+KCk7CisJCWxvYWRGYWN0b3JpZXMobmV3IEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQoY29uZmlnRmlsZSkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgbG9hZEZhY3RvcmllcyhGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQpIHsKKwkJQ29sbGVjdGlvbjxQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yaWVzID0gYXBwQ29udGV4dC5nZXRCZWFuc09mVHlwZShQcm90b2NvbEZhY3RvcnkuY2xhc3MpLnZhbHVlcygpOworCQlmb3IgKFByb3RvY29sRmFjdG9yeSBmYWN0b3J5IDogcHJvdG9jb2xGYWN0b3JpZXMpIHsKKwkJCUxpc3Q8UHJvdG9jb2xGYWN0b3J5PiBmYWN0b3JpZXMgPSBmYWN0b3J5TWFwLmdldChmYWN0b3J5LmdldFNjaGVtYSgpKTsKKwkJCWlmIChmYWN0b3JpZXMgPT0gbnVsbCkgeworCQkJCWZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xGYWN0b3J5PigpOworCQkJfQorCQkJZmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKKwkJCWZhY3RvcnlNYXAucHV0KGZhY3RvcnkuZ2V0U2NoZW1hKCksIGZhY3Rvcmllcyk7CisJCX0KKwl9CisJCisJcHVibGljIExpc3Q8UHJvdG9jb2xGYWN0b3J5PiBnZXRBbGxGYWN0b3JpZXMoKSB7CisJCUFycmF5TGlzdDxQcm90b2NvbEZhY3Rvcnk+IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xGYWN0b3J5PigpOworCQlmb3IgKExpc3Q8UHJvdG9jb2xGYWN0b3J5PiBncm91cE9mRmFjdG9yaWVzIDogZmFjdG9yeU1hcC52YWx1ZXMoKSkgeworCQkJZmFjdG9yaWVzLmFkZEFsbChncm91cE9mRmFjdG9yaWVzKTsKKwkJfQorCQlyZXR1cm4gZmFjdG9yaWVzOworCX0KKwkKKwlwdWJsaWMgTGlzdDxQcm90b2NvbEZhY3Rvcnk+IGdldEZhY3Rvcmllc0J5U2l0ZShVUkkgc2l0ZSkgeworCQlWYWxpZGF0ZS5ub3ROdWxsKHNpdGUsICJVUkkgc2l0ZSBjYW5ub3QgYmUgTlVMTCIpOworCQlMaXN0PFByb3RvY29sRmFjdG9yeT4gZmFjdG9yaWVzID0gZmFjdG9yeU1hcC5nZXQoc2l0ZS5nZXRTY2hlbWUoKSk7CisJCWlmIChmYWN0b3JpZXMgPT0gbnVsbCkgeworCQkJZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdDxQcm90b2NvbEZhY3Rvcnk+KCk7CisJCX0KKwkJcmV0dXJuIGZhY3RvcmllczsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9leGNlcHRpb25zL1Byb3RvY29sRXhjZXB0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvZXhjZXB0aW9ucy9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzJlOTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvZXhjZXB0aW9ucy9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmV4Y2VwdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODQ2MzM4NzAyNjE2NzkyMTM2MEw7CisKKyAgICBwdWJsaWMgUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBzdXBlcihtc2csIHRocm93YWJsZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3N5c3RlbS9Qcm90b2NvbENvbW1hbmRMaW5lLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc3lzdGVtL1Byb3RvY29sQ29tbWFuZExpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ2M2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3N5c3RlbS9Qcm90b2NvbENvbW1hbmRMaW5lLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLkNtZExpbmVVdGlsaXR5OworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUHJvdG9jb2xDb21tYW5kTGluZSB7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIENtZExpbmVVdGlsaXR5IGNtZExpbmVVdGlsaXR5ID0gbmV3IENtZExpbmVVdGlsaXR5KCk7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oYXJncyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3N5c3RlbS9Qcm90b2NvbE1hbmFnZXIuamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zeXN0ZW0vUHJvdG9jb2xNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4ZTY3ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zeXN0ZW0vUHJvdG9jb2xNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnN5c3RlbTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5jb25maWcuUHJvdG9jb2xDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC52ZXJpZnkuUHJvdG9jb2xWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEEgTWFuYWdlciByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgc2l0ZSB0byB7QGxpbmsgUHJvdG9jb2xGYWN0b3J5fSBtYXBwaW5nCisgKgorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90b2NvbE1hbmFnZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUHJvdG9jb2xNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisJCisJcHJpdmF0ZSBQcm90b2NvbENvbmZpZyBwcm90b2NvbENvbmZpZzsKKwlwcml2YXRlIE1hcDxVUkksIFByb3RvY29sRmFjdG9yeT4gdmVyaWZpZWRNYXA7CisJCisgICAgcHVibGljIFByb3RvY29sTWFuYWdlcihQcm90b2NvbENvbmZpZyBwcm90b2NvbENvbmZpZykgeworICAgIAlWYWxpZGF0ZS5ub3ROdWxsKHByb3RvY29sQ29uZmlnLCAicHJvdG9jb2xDb25maWcgbXVzdCBub3QgYmUgTlVMTCIpOworICAgIAl0aGlzLnByb3RvY29sQ29uZmlnID0gcHJvdG9jb2xDb25maWc7CisgICAgCXZlcmlmaWVkTWFwID0gbmV3IEhhc2hNYXA8VVJJLCBQcm90b2NvbEZhY3Rvcnk+KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBQcm90b2NvbENvbmZpZyBnZXRDb25maWcoKSB7CisgICAgCXJldHVybiBwcm90b2NvbENvbmZpZzsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3Q8UHJvdG9jb2xGYWN0b3J5PiBnZXRGYWN0b3JpZXMoKSB7CisgICAgCXJldHVybiBwcm90b2NvbENvbmZpZy5nZXRBbGxGYWN0b3JpZXMoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcy9jcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgUHJvdG9jb2x9IGZvciB0aGUgZ2l2ZW4gc2l0ZSBhbmQge0BsaW5rIEF1dGhlbnRpY2F0aW9ufS4KKyAgICAgKiB7QGxpbmsgUHJvdG9jb2xWZXJpZmllcn0gaXMgcnVuIGFuZCB0aGUgZmlyc3Qge0BsaW5rIFByb3RvY29sfSB0byBwYXNzIGl0cyB2ZXJpZmljYXRpb24sIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZCBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgZ2l2ZW4gc2l0ZS4gIElmIGEge0BsaW5rIFByb3RvY29sfSBpcyByZXR1cm5lZCBvbmNlIGZvciBhIGdpdmVuCisgICAgICogc2l0ZS9BdXRoZW50aWNhdGlvbiBjb21iaW5hdGlvbiwgdGhlbiBpdCB3aWxsIGJlIHJlbWVtYmVyIG5leHQgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYW4KKyAgICAgKiB7QGxpbmsgUHJvdG9jb2xWZXJpZmllcn0gd2lsbCBub3QgYmUgcnVuIChhc3N1bWVkIHBhc3MpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXRlIFRoZSBVUkkgZm9yIHdoaWNoIGEge0BsaW5rIFByb3RvY29sfSB3aWxsIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gYXV0aCBUaGUgY29ubmVjdGlvbiB7QGxpbmsgQXV0aGVudGljYXRpb259IHRvIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZ2l2ZW4gc2l0ZQorICAgICAqIEBwYXJhbSB2ZXJpZmllciBUaGUge0BsaW5rIFByb3RvY29sVmVyaWZpZXJ9IHdoaWNoIGFueSB7QGxpbmsgUHJvdG9jb2x9IG11c3QgcGFzcyB0byBiZSByZXR1cm5lZCAKKyAgICAgKiAJCQlhcyB0aGUgYXBwcm92ZWQge0BsaW5rIFByb3RvY29sfSBmb3IgdGhlIGdpdmVuIHNpdGUgYW5kIHtAbGluayBBdXRoZW50aWNhdGlvbn07IG1heSBiZSBudWxsLAorICAgICAqIAkJCWluIHdoaWNoIGNhc2UgYXMgbG9uZyBhcyB0aGUge0BsaW5rIFByb3RvY29sfSBjYW4gY29ubmVjdCB0byB0aGUgc2l0ZSBpdCBpcyBjb25zaWRlcmVkIGEgcGFzcworICAgICAqIAkJCWFzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIEEgdmVyaWZpZWQge0BsaW5rIFByb3RvY29sfSBmb3IgdGhlIGdpdmVuIHNpdGUgYW5kIHtAbGluayBBdXRoZW50aWNhdGlvbn0sIG90aGVyd2lzZSBudWxsIGlmCisgICAgICogCW5vIHtAbGluayBQcm90b2NvbH0gY291bGQgYmUgZGV0ZXJtaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvdG9jb2wgZ2V0UHJvdG9jb2xCeVNpdGUoVVJJIHNpdGUsIEF1dGhlbnRpY2F0aW9uIGF1dGgsIFByb3RvY29sVmVyaWZpZXIgdmVyaWZpZXIpIHsKKyAgICAJaWYgKHZlcmlmaWVkTWFwLmNvbnRhaW5zS2V5KHNpdGUpKSB7CisgICAgCQlyZXR1cm4gdmVyaWZpZWRNYXAuZ2V0KHNpdGUpLm5ld0luc3RhbmNlKCk7CisgICAgCX0gZWxzZSB7CisgICAgCQlmb3IgKFByb3RvY29sRmFjdG9yeSBmYWN0b3J5IDogcHJvdG9jb2xDb25maWcuZ2V0RmFjdG9yaWVzQnlTaXRlKHNpdGUpKSB7CisgICAgCQkJUHJvdG9jb2wgcHJvdG9jb2wgPSBudWxsOworICAgIAkJCXRyeSB7CisgICAgCQkJCXByb3RvY29sID0gZmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIAkJCQlpZiAodmVyaWZpZXIgPT0gbnVsbCB8fCB2ZXJpZmllci52ZXJpZnkocHJvdG9jb2wsIHNpdGUsIGF1dGgpKSB7CisgICAgCQkJCQl2ZXJpZmllZE1hcC5wdXQoc2l0ZSwgZmFjdG9yeSk7CisgICAgCQkJCQlpZiAocHJvdG9jb2wuY29ubmVjdGVkKCkpIHsKKyAgICAJCQkJCQlwcm90b2NvbC5jbG9zZSgpOworICAgIAkJCQkJfQorICAgIAkJCQkJcHJvdG9jb2wuY29ubmVjdChzaXRlLmdldEhvc3QoKSwgYXV0aCk7CisgICAgCQkJCQlyZXR1cm4gcHJvdG9jb2w7CisgICAgCQkJCX0KKyAgICAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlMT0cud2FybmluZygiRmFpbGVkIHRvIGNyZWF0ZS92ZXJpZnkgcHJvdG9jb2wgZnJvbSBmYWN0b3J5ICciCisJCQkJCQkJKyBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpCisJCQkJCQkJKyAiJyA6ICIKKwkJCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2l0ZQorICAgICAqIEBwYXJhbSBhdXRoCisgICAgICogQHBhcmFtIGZhY3RvcnkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBhcmUgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFVSSSBzaXRlLCBBdXRoZW50aWNhdGlvbiBhdXRoLCBQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSkgeworICAgIAlWYWxpZGF0ZS5ub3ROdWxsKHNpdGUsICJzaXRlIG11c3Qgbm90IGJlIE5VTEwiKTsKKyAgICAJVmFsaWRhdGUubm90TnVsbChhdXRoLCAiYXV0aCBtdXN0IG5vdCBiZSBOVUxMIik7CisgICAgCVZhbGlkYXRlLm5vdE51bGwoZmFjdG9yeSwgImZhY3RvcnkgbXVzdCBub3QgYmUgTlVMTCIpOworICAgIAl2ZXJpZmllZE1hcC5wdXQoc2l0ZSwgZmFjdG9yeSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3V0aWwvUHJvdG9jb2xGaWxlRmlsdGVyLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvdXRpbC9Qcm90b2NvbEZpbGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGVkMTQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3V0aWwvUHJvdG9jb2xGaWxlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmlsZTsKKworLyoqCisgKiBGaWx0ZXIgZm9yIGZpbHRlcmluZyB7QFByb3RvY29sRmlsZX1zLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBQcm90b2NvbEZpbGVGaWx0ZXIgeworCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFByb3RvY29sRmlsZSBmaWxlKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3ZlcmlmeS9CYXNpY1Byb3RvY29sVmVyaWZpZXIuamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC92ZXJpZnkvQmFzaWNQcm90b2NvbFZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZjE4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC92ZXJpZnkvQmFzaWNQcm90b2NvbFZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudmVyaWZ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoLkF1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuZXhjZXB0aW9ucy5Qcm90b2NvbEV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgUHJvdG9jb2xWZXJpZmllcn0gd2hpY2ggcGVyZm9ybXMgYmFzaWMgdmVyaWZpY2F0aW9uIG9mIGEgZ2l2ZW4ge0BsaW5rIFByb3RvY29sfSB0bworICogYSBnaXZlbiBzaXRlLiAgSXQgY2hlY2sgdGhhdCB7QGxpbmsgUHJvdG9jb2x9IGNhbiBjb25uZWN0IHRvIHRoZSBzaXRlLCBjZCB0byBhIGRpcmVjdG9yeSwKKyAqIGNkIGJhY2sgdG8gSE9NRSBkaXJlY3RvcnksIGFuZCBhYmxlIHRvIHBlcmZvcm0gYW4gbHMgYW5kIHB3ZC4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY1Byb3RvY29sVmVyaWZpZXIgaW1wbGVtZW50cyBQcm90b2NvbFZlcmlmaWVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEJhc2ljUHJvdG9jb2xWZXJpZmllci5jbGFzcy5nZXROYW1lKCkpOworCQorCXByaXZhdGUgTWFwPFVSSSwgUHJvdG9jb2xGaWxlPiB1cmlUZXN0Q2RNYXA7CisJCisJcHVibGljIEJhc2ljUHJvdG9jb2xWZXJpZmllcihNYXA8VVJJLCBQcm90b2NvbEZpbGU+IHVyaVRlc3RDZE1hcCkgeworCQl0aGlzLnVyaVRlc3RDZE1hcCA9IHVyaVRlc3RDZE1hcDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoUHJvdG9jb2wgcHJvdG9jb2wsIFVSSSBzaXRlLCBBdXRoZW50aWNhdGlvbiBhdXRoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJUZXN0aW5nIHByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm90b2NvbC5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgLiAuIC4gdGhpcyBtYXkgdGFrZSBhIGZldyBtaW51dGVzIC4gLiAuIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRlc3QgY29ubmVjdGl2aXR5CisgICAgICAgICAgICBwcm90b2NvbC5jb25uZWN0KHNpdGUuZ2V0SG9zdCgpLCBhdXRoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVGVzdCBscywgY2QsIGFuZCBwd2QKKyAgICAgICAgICAgIHByb3RvY29sLmNkSG9tZSgpOworICAgICAgICAgICAgUHJvdG9jb2xGaWxlIGhvbWUgPSBwcm90b2NvbC5wd2QoKTsKKyAgICAgICAgICAgIHByb3RvY29sLmxzKCk7CisgICAgICAgICAgICBpZiAodXJpVGVzdENkTWFwLmNvbnRhaW5zS2V5KHNpdGUpKSB7CisgICAgICAgICAgICAJcHJvdG9jb2wuY2QodXJpVGVzdENkTWFwLmdldChzaXRlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCXByb3RvY29sLmNkSG9tZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvdG9jb2wuY2RIb21lKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFZlcmlmeSBhZ2FpbiBhdCBob21lIGRpcmVjdG9yeQorICAgICAgICAgICAgaWYgKGhvbWUgPT0gbnVsbCB8fCAhaG9tZS5lcXVhbHMocHJvdG9jb2wucHdkKCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJIb21lIGRpcmVjdG9yeSBub3QgdGhlIHNhbWUgYWZ0ZXIgY2QiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAgICArIHByb3RvY29sLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBmYWlsZWQgY29tcGF0aWJpbGl0eSB0ZXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgCXRyeSB7IHByb3RvY29sLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3ZlcmlmeS9CYXNpY1Byb3RvY29sVmVyaWZpZXJGYWN0b3J5LmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvdmVyaWZ5L0Jhc2ljUHJvdG9jb2xWZXJpZmllckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZhNmVmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3ZlcmlmeS9CYXNpY1Byb3RvY29sVmVyaWZpZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudmVyaWZ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CisKKy8qKgorICoge0BsaW5rIFByb3RvY29sVmVyaWZpZXJGYWN0b3J5fSB3aGljaCBjcmVhdGVzIHtAbGluayBCYXNpY1Byb3RvY29sVmVyaWZpZXJ9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgQmFzaWNQcm90b2NvbFZlcmlmaWVyRmFjdG9yeSBpbXBsZW1lbnRzIFByb3RvY29sVmVyaWZpZXJGYWN0b3J5IHsKKworCXByaXZhdGUgTWFwPFVSSSwgUHJvdG9jb2xGaWxlPiB0ZXN0Q2RNYXA7CisJCisJcHVibGljIFByb3RvY29sVmVyaWZpZXIgbmV3SW5zdGFuY2UoKSB7CisJCWlmICh0ZXN0Q2RNYXAgIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBCYXNpY1Byb3RvY29sVmVyaWZpZXIodGVzdENkTWFwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBuZXcgQmFzaWNQcm90b2NvbFZlcmlmaWVyKG5ldyBIYXNoTWFwPFVSSSwgUHJvdG9jb2xGaWxlPigpKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldFRlc3RDZE1hcChNYXA8VVJJLCBQcm90b2NvbEZpbGU+IHRlc3RDZE1hcCkgeworCQl0aGlzLnRlc3RDZE1hcCA9IHRlc3RDZE1hcDsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvdmVyaWZ5L1Byb3RvY29sVmVyaWZpZXIuamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC92ZXJpZnkvUHJvdG9jb2xWZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2QwMGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvdmVyaWZ5L1Byb3RvY29sVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC52ZXJpZnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQXV0aGVudGljYXRpb247CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB2ZXJpZnlpbmcge0BsaW5rIFByb3RvY29sfXMgY2FuIGNvbm5lY3QgdG8gc2l0ZXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb3RvY29sVmVyaWZpZXIgeworCQorICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShQcm90b2NvbCBwcm90b2NvbCwgVVJJIHNpdGUsIEF1dGhlbnRpY2F0aW9uIGF1dGgpOworICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3ZlcmlmeS9Qcm90b2NvbFZlcmlmaWVyRmFjdG9yeS5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3ZlcmlmeS9Qcm90b2NvbFZlcmlmaWVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTZkYjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvdmVyaWZ5L1Byb3RvY29sVmVyaWZpZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudmVyaWZ5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBQcm90b2NvbFZlcmlmaWVyfXMKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvdG9jb2xWZXJpZmllckZhY3RvcnkgeworCisJcHVibGljIFByb3RvY29sVmVyaWZpZXIgbmV3SW5zdGFuY2UoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ODdiZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gCisgIEF1dGhvcjogYmZvc3RlciAKKyAgRGVzY3JpcHRpb246IFByb3RvY29sTWFuYWdlciBDb25maWd1cmF0aW9uCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisJPGJlYW4gaWQ9IkRvd25sb2FkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5jbGkuYWN0aW9uLkRvd25sb2FkQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iRG93bmxvYWRzIGEgZmlsZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9IkdldFN1cHBvcnRlZEZhY3RvcmllcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbi5HZXRTdXBwb3J0ZWRGYWN0b3JpZXNDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQcmludHMgb3V0IGxpc3Qgb2Ygc3VwcG9ydGVkIFByb3RvY29sRmFjdG9yeShzKSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9IkNyb3NzUHJvdG9jb2xUcmFuc2ZlciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbi5Dcm9zc1Byb3RvY29sVHJhbnNmZXJDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmFuc2ZlcnMgYSBmaWxlIGFjcm9zcyAyIGRpZmZlcmVudCBwcm90b2NvbHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJpZmllckZhY3RvcnkiIHJlZj0iQmFzaWNWZXJpZmllciIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9IkRlbGV0ZUVtcHR5RGlyZWN0b3JpZXMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNsaS5hY3Rpb24uRGVsZXRlRW1wdHlEaXJlY3Rvcmllc0NsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlbGV0ZXMgZW1wdHkgZGlyZWN0b3JpZXMgZnJvbSBhIGdpdmVuIHNpdGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJpZmllckZhY3RvcnkiIHJlZj0iQmFzaWNWZXJpZmllciIgLz4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iQmFzaWNWZXJpZmllciIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudmVyaWZ5LkJhc2ljUHJvdG9jb2xWZXJpZmllckZhY3RvcnkiIC8+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlYWE5YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvY21kLWxpbmUtb3B0aW9ucy54bWwKQEAgLTAsMCArMSwxNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEF1dGhvcjogYmZvc3RlciBEZXNjcmlwdGlvbjogUHJvdG9jb2xNYW5hZ2VyIENvbmZpZ3VyYXRpb24gLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworCTxiZWFuIGlkPSJ1c2VyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idXNlciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVXNlcm5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJ1c2VybmFtZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iRG93bmxvYWQiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IkRvd25sb2FkIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJwYXNzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InAiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icGFzcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJwYXNzd29yZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iRG93bmxvYWQiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKyAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IkRvd25sb2FkIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJ1cmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVVJMIHRvIGRvd25sb2FkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJVUkwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9IkRvd25sb2FkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJEb3dubG9hZCIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iZnJvbVVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJmdSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJmcm9tVXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJVUkwgdG8gZ2V0IGZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9IlVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iQ3Jvc3NQcm90b2NvbFRyYW5zZmVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJDcm9zc1Byb3RvY29sVHJhbnNmZXIiIHA6bWV0aG9kTmFtZT0ic2V0RnJvbVVyaSIgLz4KKyAgICAgICAgICA8L2xpc3Q+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2JlYW4+CisgICAgPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0idG9VcmwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idHUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idG9VcmwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlVSTCB0byBzZW5kIGZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9IlVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iQ3Jvc3NQcm90b2NvbFRyYW5zZmVyIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJDcm9zc1Byb3RvY29sVHJhbnNmZXIiIHA6bWV0aG9kTmFtZT0ic2V0VG9VcmkiIC8+CisgICAgICAgICAgPC9saXN0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC9iZWFuPgorICAgIDwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImRpcmVjdG9yaWVzUmVnZXgiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZHIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZGlyc1JlZ2V4IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJEaXJlY3RvcnkgcmVnZXggb2YgZGlyZWN0b3JpZXMgdG8gZGVsZXRlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJVUkwiIC8+CisJICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkgICAgICA8bGlzdD4KKwkgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkgICAgICAgICAgcDphY3Rpb25OYW1lPSJEZWxldGVFbXB0eURpcmVjdG9yaWVzIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkgICAgICA8L2xpc3Q+CisJICAgIDwvcHJvcGVydHk+CisJICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorCSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKwkgICAgICAgICAgPGxpc3Q+CisJICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJICAgICAgICAgICAgICBwOmFjdGlvbk5hbWU9IkRlbGV0ZUVtcHR5RGlyZWN0b3JpZXMiIHA6bWV0aG9kTmFtZT0ic2V0RGlyZWN0b3J5UmVnZXgiIC8+CisJICAgICAgICAgIDwvbGlzdD4KKwkgICAgICAgIDwvcHJvcGVydHk+CisJICAgICAgPC9iZWFuPgorCSAgICA8L3Byb3BlcnR5PgorCTwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3Byb3RvY29sLWNvbmZpZy54bWwgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3Byb3RvY29sLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0MjAwNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvcHJvdG9jb2wtY29uZmlnLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSAKKwkKKwlBdXRob3I6IGJmb3N0ZXIKKwlEZXNjcmlwdGlvbjogUHJvdG9jb2xNYW5hZ2VyIENvbmZpZ3VyYXRpb24KKwkKKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkIj4KKworCTxpbXBvcnQgcmVzb3VyY2U9ImNsYXNzcGF0aCo6L29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvKiovKi1wcm90b2NvbC1jb25maWcueG1sIi8+CisJCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL01vY2tQcm90b2NvbC5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL01vY2tQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NzdhNzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvTW9ja1Byb3RvY29sLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmV4Y2VwdGlvbnMuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC51dGlsLlByb3RvY29sRmlsZUZpbHRlcjsKKworLyoqCisgKiBNb2NrIHtAbGluayBQcm90b2NvbH0gZm9yIHRlc3RpbmcKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUHJvdG9jb2wgaW1wbGVtZW50cyBQcm90b2NvbCB7CisKKwlwcml2YXRlIGJvb2xlYW4gY29ubmVjdGVkOworCXByaXZhdGUgUHJvdG9jb2xGaWxlIGN3ZDsKKwlwcml2YXRlIFN0cmluZyBmYWN0b3J5SWQ7CisJCisJcHJpdmF0ZSBMaXN0PFByb3RvY29sRmlsZT4gZGVsZXRlZEZpbGVzOworCXByaXZhdGUgTGlzdDxQcm90b2NvbEZpbGU+IHB1dEZpbGVzOworCXByaXZhdGUgTGlzdDxQcm90b2NvbEZpbGU+IGdldEZpbGVzOworCXByaXZhdGUgaW50IHRpbWVzQ29ubmVjdGVkOworCQorCXB1YmxpYyBNb2NrUHJvdG9jb2woU3RyaW5nIGZhY3RvcnlJZCkgeworCQljb25uZWN0ZWQgPSBmYWxzZTsKKwkJdGhpcy5mYWN0b3J5SWQgPSBmYWN0b3J5SWQ7CisJCWRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xGaWxlPigpOworCQlwdXRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xGaWxlPigpOworCQlnZXRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xGaWxlPigpOworCQl0aW1lc0Nvbm5lY3RlZCA9IDA7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgeworCQlyZXR1cm4gZmFjdG9yeUlkOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjb25uZWN0KFN0cmluZyBob3N0LCBBdXRoZW50aWNhdGlvbiBhdXRoZW50aWNhdGlvbikKKwkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCWNvbm5lY3RlZCA9IHRydWU7CisJCWRlbGV0ZWRGaWxlcy5jbGVhcigpOworCQlwdXRGaWxlcy5jbGVhcigpOworCQlnZXRGaWxlcy5jbGVhcigpOworCQl0aW1lc0Nvbm5lY3RlZCsrOworCX0KKwkKKwlwdWJsaWMgaW50IGdldFRpbWVzQ29ubmVjdGVkKCkgeworCQlyZXR1cm4gdGltZXNDb25uZWN0ZWQ7CisJfQorCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQljb25uZWN0ZWQgPSBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb25uZWN0ZWQoKSB7CisJCXJldHVybiBjb25uZWN0ZWQ7CisJfQorCisJcHVibGljIHZvaWQgY2QoUHJvdG9jb2xGaWxlIGZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCWN3ZCA9IGZpbGU7CisJfQorCQorCXB1YmxpYyB2b2lkIGNkSG9tZSgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCWN3ZCA9IG5ldyBQcm90b2NvbEZpbGUoIiIsIHRydWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjZFJvb3QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQljd2QgPSBuZXcgUHJvdG9jb2xGaWxlKCIvIiwgdHJ1ZSk7CisJfQorCisJcHVibGljIHZvaWQgZ2V0KFByb3RvY29sRmlsZSBmcm9tRmlsZSwgRmlsZSB0b0ZpbGUpCisJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQlnZXRGaWxlcy5hZGQoZnJvbUZpbGUpOworCX0KKworCXB1YmxpYyBMaXN0PFByb3RvY29sRmlsZT4gZ2V0R2V0RmlsZXMoKSB7CisJCXJldHVybiBnZXRGaWxlczsKKwl9CisJCisJcHVibGljIHZvaWQgcHV0KEZpbGUgZnJvbUZpbGUsIFByb3RvY29sRmlsZSB0b0ZpbGUpCisJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQlwdXRGaWxlcy5hZGQodG9GaWxlKTsKKwl9CisJCisJcHVibGljIExpc3Q8UHJvdG9jb2xGaWxlPiBnZXRQdXRGaWxlcygpIHsKKwkJcmV0dXJuIHB1dEZpbGVzOworCX0KKworCXB1YmxpYyBQcm90b2NvbEZpbGUgcHdkKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGN3ZDsKKwl9CisKKwlwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCXB1YmxpYyBMaXN0PFByb3RvY29sRmlsZT4gbHMoUHJvdG9jb2xGaWxlRmlsdGVyIGZpbHRlcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCXB1YmxpYyB2b2lkIGRlbGV0ZShQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJZGVsZXRlZEZpbGVzLmFkZChmaWxlKTsKKwl9CisJCisJcHVibGljIExpc3Q8UHJvdG9jb2xGaWxlPiBnZXREZWxldGVkRmlsZXMoKSB7CisJCXJldHVybiBkZWxldGVkRmlsZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvTW9ja1Byb3RvY29sRmFjdG9yeS5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL01vY2tQcm90b2NvbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTgwMzYyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL01vY2tQcm90b2NvbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5zcHJpbmcuU3ByaW5nU2V0SWRJbmplY3Rpb25UeXBlOworCisvKioKKyAqIE1vY2sge0BsaW5rIFByb3RvY29sRmFjdG9yeX0gZm9yIHRlc3RpbmcKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgUHJvdG9jb2xGYWN0b3J5LCBTcHJpbmdTZXRJZEluamVjdGlvblR5cGUgeworCisJcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOworCXByaXZhdGUgU3RyaW5nIGlkOworCQorCXB1YmxpYyBNb2NrUHJvdG9jb2wgbmV3SW5zdGFuY2UoKSB7CisJCXJldHVybiBuZXcgTW9ja1Byb3RvY29sKGlkKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuIHNjaGVtYTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL1Rlc3RQcm90b2NvbEZpbGUuamF2YSBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9UZXN0UHJvdG9jb2xGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNDcyZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9UZXN0UHJvdG9jb2xGaWxlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2w7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgUHJvdG9jb2xGaWxlfQorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RQcm90b2NvbEZpbGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFN0YXRlKCkgeworCQlTdHJpbmcgZmlsZVBhdGggPSBQcm90b2NvbEZpbGUuU0VQQVJBVE9SICsgInBhdGgiICsgUHJvdG9jb2xGaWxlLlNFUEFSQVRPUiArICJ0byIgKyBQcm90b2NvbEZpbGUuU0VQQVJBVE9SICsgImZpbGUiOworCQlQcm90b2NvbEZpbGUgcEZpbGUgPSBuZXcgUHJvdG9jb2xGaWxlKGZpbGVQYXRoLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscyhmaWxlUGF0aCwgcEZpbGUuZ2V0UGF0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmaWxlIiwgcEZpbGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UocEZpbGUuaXNEaXIoKSk7CisJCWFzc2VydEZhbHNlKHBGaWxlLmlzUmVsYXRpdmUoKSk7CisJCQorCQkvLyBUZXN0IFBhcmVudCBmaWxlCisJCVN0cmluZyBwYXJlbnRQYXRoID0gUHJvdG9jb2xGaWxlLlNFUEFSQVRPUiArICJwYXRoIiArIFByb3RvY29sRmlsZS5TRVBBUkFUT1IgKyAidG8iOworCQlhc3NlcnRFcXVhbHMocGFyZW50UGF0aCwgcEZpbGUuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0byIsIHBGaWxlLmdldFBhcmVudCgpLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUocEZpbGUuZ2V0UGFyZW50KCkuaXNEaXIoKSk7CisJCWFzc2VydEZhbHNlKHBGaWxlLmdldFBhcmVudCgpLmlzUmVsYXRpdmUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisJCWFzc2VydEVxdWFscyhuZXcgUHJvdG9jb2xGaWxlKCIvdGVzdC9kaXJlY3RvcnkiLCB0cnVlKSwgbmV3IFByb3RvY29sRmlsZSgKKwkJCQluZXcgUHJvdG9jb2xGaWxlKCIvdGVzdCIsIHRydWUpLCAiZGlyZWN0b3J5IiwgdHJ1ZSkpOworCQlhc3NlcnRFcXVhbHMobmV3IFByb3RvY29sRmlsZShuZXcgUHJvdG9jb2xGaWxlKCIvIiwgdHJ1ZSksICJyZXBvIiwgdHJ1ZSksIG5ldyBQcm90b2NvbEZpbGUoIi9yZXBvIiwgdHJ1ZSkpOworCQlhc3NlcnRFcXVhbHMobmV3IFByb3RvY29sRmlsZShuZXcgUHJvdG9jb2xGaWxlKCIvIiwgdHJ1ZSksICIiLCB0cnVlKSwgbmV3IFByb3RvY29sRmlsZSgiLyIsIHRydWUpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvYXV0aC9UZXN0QmFzaWNBdXRoZW50aWNhdGlvbi5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvVGVzdEJhc2ljQXV0aGVudGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDllNTgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2F1dGgvVGVzdEJhc2ljQXV0aGVudGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEJhc2ljQXV0aGVudGljYXRpb259CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgVGVzdEJhc2ljQXV0aGVudGljYXRpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFN0YXRlKCkgeworCQlCYXNpY0F1dGhlbnRpY2F0aW9uIGF1dGggPSBuZXcgQmFzaWNBdXRoZW50aWNhdGlvbigidXNlciIsICJwYXNzIik7CisJCWFzc2VydEVxdWFscygidXNlciIsIGF1dGguZ2V0VXNlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJwYXNzIiwgYXV0aC5nZXRQYXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbENhc2UoKSB7CisJCXRyeSB7CisJCQluZXcgQmFzaWNBdXRoZW50aWNhdGlvbihudWxsLCAicGFzcyIpOworCQkJZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworCQl9Y2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQorCQl0cnkgeworCQkJbmV3IEJhc2ljQXV0aGVudGljYXRpb24oInVzZXIiLCBudWxsKTsKKwkJCWZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKwkJfWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KKwkJdHJ5IHsKKwkJCW5ldyBCYXNpY0F1dGhlbnRpY2F0aW9uKG51bGwsIG51bGwpOworCQkJZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworCQl9Y2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9hdXRoL1Rlc3ROb0F1dGhlbnRpY2F0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvYXV0aC9UZXN0Tm9BdXRoZW50aWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTk1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvYXV0aC9UZXN0Tm9BdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGg7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgTm9BdXRoZW50aWNhdGlvbn0uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgVGVzdE5vQXV0aGVudGljYXRpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFN0YXRlKCkgeworCQlOb0F1dGhlbnRpY2F0aW9uIGF1dGggPSBuZXcgTm9BdXRoZW50aWNhdGlvbigpOworCQlhc3NlcnRFcXVhbHMoIiIsIGF1dGguZ2V0VXNlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBhdXRoLmdldFBhc3MoKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vTW9ja1Byb3RvY29sQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9Nb2NrUHJvdG9jb2xDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTFmYzYyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vTW9ja1Byb3RvY29sQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBNb2NrIGNsYXNzIGZvciB7QFByb3RvY29sQWN0aW9ufS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUHJvdG9jb2xDbGlBY3Rpb24gZXh0ZW5kcyBQcm90b2NvbENsaUFjdGlvbiB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geyAgICAgIAorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vVGVzdEJhc2ljVmVyaWZ5Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9UZXN0QmFzaWNWZXJpZnlDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDY2NzFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vVGVzdEJhc2ljVmVyaWZ5Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSSTsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uLkFjdGlvbk1lc3NhZ2VQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoLkF1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY29uZmlnLk1vY2tTcHJpbmdQcm90b2NvbENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnN5c3RlbS5Qcm90b2NvbE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC52ZXJpZnkuUHJvdG9jb2xWZXJpZmllcjsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgQmFzaWNWZXJpZnlDbGlBY3Rpb259CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEJhc2ljVmVyaWZ5Q2xpQWN0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBCYXNpY1ZlcmlmeUNsaUFjdGlvbiBidmEgPSBuZXcgQmFzaWNWZXJpZnlDbGlBY3Rpb24oKTsKKyAgICAgIGJ2YS5zZXRTaXRlKCJodHRwOi8vbG9jYWxob3N0Iik7CisgICAgICBidmEuc2V0VmVyaWZpZXIobmV3IFByb3RvY29sVmVyaWZpZXIoKSB7CisgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoUHJvdG9jb2wgcHJvdG9jb2wsIFVSSSBzaXRlLAorICAgICAgICAgICAgICAgQXV0aGVudGljYXRpb24gYXV0aCkgeworICAgICAgICAgICAgcmV0dXJuIGF1dGggIT0gbnVsbCAmJiBzaXRlLnRvU3RyaW5nKCkuZXF1YWxzKCJodHRwOi8vbG9jYWxob3N0Iik7CisgICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGJ2YS5zZXRQcm90b2NvbE1hbmFnZXIobmV3IFByb3RvY29sTWFuYWdlcihuZXcgTW9ja1NwcmluZ1Byb3RvY29sQ29uZmlnKCkpKTsKKyAgICAgIGJ2YS5leGVjdXRlKG5ldyBBY3Rpb25NZXNzYWdlUHJpbnRlcigpKTsKKyAgICAgIGFzc2VydFRydWUoYnZhLmdldExhc3RWZXJpZmljYXRpb25SZXN1bHRzKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vVGVzdERvd25sb2FkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY2xpL2FjdGlvbi9UZXN0RG93bmxvYWRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRhZTBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vVGVzdERvd25sb2FkQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbi5BY3Rpb25NZXNzYWdlUHJpbnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLk1vY2tQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuY29uZmlnLk1vY2tTcHJpbmdQcm90b2NvbENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnN5c3RlbS5Qcm90b2NvbE1hbmFnZXI7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgRG93bmxvYWRDbGlBY3Rpb259LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3REb3dubG9hZENsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKyAgIAorICAgcHJpdmF0ZSBQcm90b2NvbE1hbmFnZXIgcG07CisgICAKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICBwbSA9IG5ldyBQcm90b2NvbE1hbmFnZXIobmV3IE1vY2tTcHJpbmdQcm90b2NvbENvbmZpZygpKTsKKyAgIH0KKyAgIAorICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3RvY29sKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBEb3dubG9hZENsaUFjdGlvbiBkYSA9IG5ldyBEb3dubG9hZENsaUFjdGlvbigpOworICAgICAgZGEuc2V0VXJsKCJodHRwOi8vbG9jYWxob3N0L3NvbWUvZmlsZSIpOworICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBkYS5jcmVhdGVQcm90b2NvbChwbSk7CisgICAgICBhc3NlcnROb3ROdWxsKHByb3RvY29sKTsKKyAgICAgIGFzc2VydFRydWUocHJvdG9jb2wgaW5zdGFuY2VvZiBNb2NrUHJvdG9jb2wpOworICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwMSIsICgoTW9ja1Byb3RvY29sKSBwcm90b2NvbCkuZ2V0RmFjdG9yeUlkKCkpOworICAgfQorICAgCisgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvdG9jb2xGaWxlKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBEb3dubG9hZENsaUFjdGlvbiBkYSA9IG5ldyBEb3dubG9hZENsaUFjdGlvbigpOworICAgICAgZGEuc2V0VXJsKCJodHRwOi8vbG9jYWxob3N0L3NvbWUvZmlsZSIpOworICAgICAgUHJvdG9jb2xGaWxlIGZpbGUgPSBkYS5jcmVhdGVQcm90b2NvbEZpbGUoKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZmlsZSk7CisgICAgICBhc3NlcnRFcXVhbHMoIi9zb21lL2ZpbGUiLCBmaWxlLmdldFBhdGgoKSk7CisgICAgICBhc3NlcnRGYWxzZShmaWxlLmlzUmVsYXRpdmUoKSk7CisgICAgICBhc3NlcnRGYWxzZShmaWxlLmlzRGlyKCkpOworICAgfQorICAgCisgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZURvd25sb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBEb3dubG9hZENsaUFjdGlvbiBkYSA9IG5ldyBEb3dubG9hZENsaUFjdGlvbigpOworICAgICAgZGEuc2V0VXJsKCJodHRwOi8vbG9jYWxob3N0L3NvbWUvZmlsZSIpOworICAgICAgZGEuc2V0UHJvdG9jb2xNYW5hZ2VyKHBtKTsKKyAgICAgIGRhLmV4ZWN1dGUobmV3IEFjdGlvbk1lc3NhZ2VQcmludGVyKCkpOworICAgICAgYXNzZXJ0Tm90TnVsbChkYS5nZXRVc2VkUHJvdG9jb2woKSk7CisgICAgICBhc3NlcnRUcnVlKGRhLmdldFVzZWRQcm90b2NvbCgpIGluc3RhbmNlb2YgTW9ja1Byb3RvY29sKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCAoKE1vY2tQcm90b2NvbCkgZGEuZ2V0VXNlZFByb3RvY29sKCkpLmdldEdldEZpbGVzKCkuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiL3NvbWUvZmlsZSIsICgoTW9ja1Byb3RvY29sKSBkYS5nZXRVc2VkUHJvdG9jb2woKSkuZ2V0R2V0RmlsZXMoKS5nZXQoMCkuZ2V0UGF0aCgpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL1Rlc3RQcm90b2NvbENsaUFjdGlvbi5qYXZhIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2NsaS9hY3Rpb24vVGVzdFByb3RvY29sQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4OGM0NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jbGkvYWN0aW9uL1Rlc3RQcm90b2NvbENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgUHJvdG9jb2xDbGlBY3Rpb259LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFRlc3RQcm90b2NvbENsaUFjdGlvbiBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxTdGF0ZSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgTW9ja1Byb3RvY29sQ2xpQWN0aW9uIGFjdGlvbiA9IG5ldyBNb2NrUHJvdG9jb2xDbGlBY3Rpb24oKTsKKyAgICAgIGFjdGlvbi5zZXRVc2VyKCJ1c2VyIik7CisgICAgICBhY3Rpb24uc2V0UGFzcygicGFzcyIpOworICAgICAgYWN0aW9uLnNldFNpdGUoImh0dHA6Ly9zb21lLXNpdGUiKTsKKyAgICAgIGFzc2VydEVxdWFscygidXNlciIsIGFjdGlvbi5nZXRBdXRoZW50aWNhdGlvbigpLmdldFVzZXIoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoInBhc3MiLCBhY3Rpb24uZ2V0QXV0aGVudGljYXRpb24oKS5nZXRQYXNzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc29tZS1zaXRlIiwgYWN0aW9uLmdldFNpdGUoKS50b1N0cmluZygpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9jb25maWcvTW9ja1NwcmluZ1Byb3RvY29sQ29uZmlnLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY29uZmlnL01vY2tTcHJpbmdQcm90b2NvbENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzdjZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvY29uZmlnL01vY2tTcHJpbmdQcm90b2NvbENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmFjdG9yeTsKKworLyoqCisgKiBNb2NrIHtAbGluayBTcHJpbmdQcm90b2NvbENvbmZpZ30KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrU3ByaW5nUHJvdG9jb2xDb25maWcgZXh0ZW5kcyBTcHJpbmdQcm90b2NvbENvbmZpZyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0ZJTEUgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtcHJvdG9jb2wtY29uZmlnLnhtbCI7CisKKwlwdWJsaWMgTW9ja1NwcmluZ1Byb3RvY29sQ29uZmlnKCkgeworCQlzdXBlcihDT05GSUdfRklMRSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlKCkgeworCQlyZXR1cm4gQ09ORklHX0ZJTEU7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8UHJvdG9jb2xGYWN0b3J5Pj4gZ2V0RmFjdG9yeU1hcCgpIHsKKwkJcmV0dXJuIGZhY3RvcnlNYXA7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3N5c3RlbS9UZXN0UHJvdG9jb2xNYW5hZ2VyLmphdmEgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc3lzdGVtL1Rlc3RQcm90b2NvbE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE4NGFkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3N5c3RlbS9UZXN0UHJvdG9jb2xNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc3lzdGVtOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLk1vY2tQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguTm9BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmNvbmZpZy5Nb2NrU3ByaW5nUHJvdG9jb2xDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC52ZXJpZnkuUHJvdG9jb2xWZXJpZmllcjsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBQcm90b2NvbE1hbmFnZXJ9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RQcm90b2NvbE1hbmFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJCisJcHJpdmF0ZSBQcm90b2NvbE1hbmFnZXIgcHJvdG9jb2xNYW5hZ2VyOworCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgeworCQlwcm90b2NvbE1hbmFnZXIgPSBuZXcgUHJvdG9jb2xNYW5hZ2VyKG5ldyBNb2NrU3ByaW5nUHJvdG9jb2xDb25maWcoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsU3RhdGUoKSB7CisJCWFzc2VydE5vdE51bGwocHJvdG9jb2xNYW5hZ2VyLmdldENvbmZpZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFByb3RvY29sRmFjdG9yeU1hcHBpbmcoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKwkJUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b2NvbE1hbmFnZXIuZ2V0UHJvdG9jb2xCeVNpdGUobmV3IFVSSSgiZnRwOi8vbG9jYWxob3N0IiksIG5ldyBOb0F1dGhlbnRpY2F0aW9uKCksIG51bGwpOworCQlhc3NlcnROb3ROdWxsKHByb3RvY29sKTsKKwkJYXNzZXJ0VHJ1ZShwcm90b2NvbCBpbnN0YW5jZW9mIE1vY2tQcm90b2NvbCk7CisJCU1vY2tQcm90b2NvbCBtb2NrUHJvdG9jb2wgPSAoTW9ja1Byb3RvY29sKSBwcm90b2NvbDsKKwkJYXNzZXJ0RXF1YWxzKCJmdHAxIiwgbW9ja1Byb3RvY29sLmdldEZhY3RvcnlJZCgpKTsKKwkJCisJCS8vdGVzdCB0aGF0IGZ0cDEgd2FzIG1lbW9yaXplZCBhbmQgaXMgcmV0dXJuZWQgYWdhaW4gZXZlbiB0aG91Z2ggYSBWZXJpZmllciB3YXMgc3VwcGxpZWQgdGhpcyB0aW1lIHRoYXQgd291bGQgcmV0dXJuIGZ0cDMKKwkJcHJvdG9jb2wgPSBwcm90b2NvbE1hbmFnZXIuZ2V0UHJvdG9jb2xCeVNpdGUobmV3IFVSSSgiZnRwOi8vbG9jYWxob3N0IiksIG5ldyBOb0F1dGhlbnRpY2F0aW9uKCksIG5ldyBQcm90b2NvbFZlcmlmaWVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gdmVyaWZ5KFByb3RvY29sIHByb3RvY29sLCBVUkkgc2l0ZSwKKwkJCQkJQXV0aGVudGljYXRpb24gYXV0aCkgeworCQkJCWlmIChwcm90b2NvbCBpbnN0YW5jZW9mIE1vY2tQcm90b2NvbCkgeworCQkJCQlNb2NrUHJvdG9jb2wgbW9ja1Byb3RvY29sID0gKE1vY2tQcm90b2NvbCkgcHJvdG9jb2w7CisJCQkJCXJldHVybiBtb2NrUHJvdG9jb2wuZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKCJmdHAzIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCWFzc2VydE5vdE51bGwocHJvdG9jb2wpOworCQlhc3NlcnRUcnVlKHByb3RvY29sIGluc3RhbmNlb2YgTW9ja1Byb3RvY29sKTsKKwkJbW9ja1Byb3RvY29sID0gKE1vY2tQcm90b2NvbCkgcHJvdG9jb2w7CisJCWFzc2VydEVxdWFscygiZnRwMSIsIG1vY2tQcm90b2NvbC5nZXRGYWN0b3J5SWQoKSk7CisKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZlcmlmaWVyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisJCVByb3RvY29sIHByb3RvY29sID0gcHJvdG9jb2xNYW5hZ2VyLmdldFByb3RvY29sQnlTaXRlKG5ldyBVUkkoImZ0cDovL2xvY2FsaG9zdCIpLCBuZXcgTm9BdXRoZW50aWNhdGlvbigpLCBuZXcgUHJvdG9jb2xWZXJpZmllcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIHZlcmlmeShQcm90b2NvbCBwcm90b2NvbCwgVVJJIHNpdGUsCisJCQkJCUF1dGhlbnRpY2F0aW9uIGF1dGgpIHsKKwkJCQlpZiAocHJvdG9jb2wgaW5zdGFuY2VvZiBNb2NrUHJvdG9jb2wpIHsKKwkJCQkJTW9ja1Byb3RvY29sIG1vY2tQcm90b2NvbCA9IChNb2NrUHJvdG9jb2wpIHByb3RvY29sOworCQkJCQlyZXR1cm4gbW9ja1Byb3RvY29sLmdldEZhY3RvcnlJZCgpLmVxdWFscygiZnRwMyIpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlhc3NlcnRUcnVlKHByb3RvY29sIGluc3RhbmNlb2YgTW9ja1Byb3RvY29sKTsKKwkJTW9ja1Byb3RvY29sIG1vY2tQcm90b2NvbCA9IChNb2NrUHJvdG9jb2wpIHByb3RvY29sOworCQlhc3NlcnRFcXVhbHMoImZ0cDMiLCBtb2NrUHJvdG9jb2wuZ2V0RmFjdG9yeUlkKCkpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvYXBpL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LXByb3RvY29sLWNvbmZpZy54bWwgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1wcm90b2NvbC1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODRiNzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2FwaS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1wcm90b2NvbC1jb25maWcueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIAorCQorCUF1dGhvcjogYmZvc3RlcgorCURlc2NyaXB0aW9uOiBQcm90b2NvbE1hbmFnZXIgQ29uZmlndXJhdGlvbgorCQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jb21tb25zLnNwcmluZy5wb3N0cHJvY2Vzc29yLlNldElkQmVhblBvc3RQcm9jZXNzb3IiLz4KKworCTwhLS0gbGlzdCBQcm90b2NvbEZhY3RvcmllcyBoZXJlIC0tPgorCTxiZWFuIGlkPSJmdHAxIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Nb2NrUHJvdG9jb2xGYWN0b3J5Ij4KKwkJPHByb3BlcnR5IG5hbWU9InNjaGVtYSIgdmFsdWU9ImZ0cCIvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iZnRwMiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuTW9ja1Byb3RvY29sRmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEiIHZhbHVlPSJmdHAiLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImZ0cDMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLk1vY2tQcm90b2NvbEZhY3RvcnkiPgorCQk8cHJvcGVydHkgbmFtZT0ic2NoZW1hIiB2YWx1ZT0iZnRwIi8+CisJPC9iZWFuPgorCQorCTxiZWFuIGlkPSJzZnRwMSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuTW9ja1Byb3RvY29sRmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEiIHZhbHVlPSJzZnRwIi8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJzZnRwMiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuTW9ja1Byb3RvY29sRmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEiIHZhbHVlPSJzZnRwIi8+CisJPC9iZWFuPgorCQorCTxiZWFuIGlkPSJodHRwMSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuTW9ja1Byb3RvY29sRmFjdG9yeSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEiIHZhbHVlPSJodHRwIi8+CisJPC9iZWFuPgorCQorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvZnRwL3BvbS54bWwgYi8wLjEwL3Byb3RvY29sL2Z0cC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMGQ3NDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2Z0cC9wb20ueG1sCkBAIC0wLDAgKzEsMTA5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IgCisJbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIAorCWluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byAKKwlZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSAKKwl0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIAorCXRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgCisJYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSAKKwlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIAorCU9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyAKKwlsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoPi4uLy4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorCTwvcGFyZW50PgorCTxhcnRpZmFjdElkPmNhcy1wcm90b2NvbC1mdHA8L2FydGlmYWN0SWQ+CisJPG5hbWU+Q0FTIFByb3RvY29sIEZUUCBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KKwk8cHJvZmlsZXM+CisJCTxwcm9maWxlPgorCQkJPGlkPmF1ZGl0PC9pZD4KKwkJCTxhY3RpdmF0aW9uPgorCQkJCTxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKwkJCTwvYWN0aXZhdGlvbj4KKwkJCTxidWlsZD4KKwkJCQk8cGx1Z2lucz4KKwkJCQkJPHBsdWdpbj4KKwkJCQkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorCQkJCQkJPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCTxleGNsdWRlcz4KKwkJCQkJCQkJPGV4Y2x1ZGU+KiovcmVzb3VyY2VzL2V4YW1wbGVzLyoqLyo8L2V4Y2x1ZGU+CisJCQkJCQkJPC9leGNsdWRlcz4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJCTxleGVjdXRpb25zPgorCQkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJCTxwaGFzZT52ZXJpZnk8L3BoYXNlPgorCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQk8Z29hbD5jaGVjazwvZ29hbD4KKwkJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQkJCTwvZXhlY3V0aW9ucz4KKwkJCQkJPC9wbHVnaW4+CisJCQkJPC9wbHVnaW5zPgorCQkJPC9idWlsZD4KKwkJPC9wcm9maWxlPgorCTwvcHJvZmlsZXM+CisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8dGFyZ2V0UGF0aD5vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2Z0cDwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3k8L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPmZ0cC1wcm90b2NvbC1jb25maWcueG1sPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgPC9idWlsZD4KKwk8ZGVwZW5kZW5jaWVzPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhcy1wcm90b2NvbC1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmpnbG9idXM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5KR2xvYnVzLUdyaWRGVFA8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjAuMDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5qZ2xvYnVzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3NzPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4wLjY8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLW5ldDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbmV0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS40LjA8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmZ0cHNlcnZlcjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmZ0cHNlcnZlci1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS41LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjkuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9mdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2Z0cC9Db2dKR2xvYnVzRnRwUHJvdG9jb2wuamF2YSBiLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29nSkdsb2J1c0Z0cFByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1NTNjYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29nSkdsb2J1c0Z0cFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKworCisvL0dsb2J1cyBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudXRpbC5Qcm90b2NvbEZpbGVGaWx0ZXI7CitpbXBvcnQgb3JnLmdsb2J1cy5mdHAuRlRQQ2xpZW50OworaW1wb3J0IG9yZy5nbG9idXMuZnRwLkZpbGVJbmZvOworaW1wb3J0IG9yZy5nbG9idXMuZnRwLkhvc3RQb3J0OworaW1wb3J0IG9yZy5nbG9idXMuZnRwLmV4Y2VwdGlvbi5DbGllbnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsb2J1cy5mdHAuZXhjZXB0aW9uLlNlcnZlckV4Y2VwdGlvbjsKKworLyoqCisgKiBGVFAgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgUHJvdG9jb2x9CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgQ29nSkdsb2J1c0Z0cFByb3RvY29sIGltcGxlbWVudHMgUHJvdG9jb2wgeworCisgIHByaXZhdGUgRlRQQ2xpZW50IGZ0cDsKKyAgcHJpdmF0ZSBib29sZWFuIGlzQ29ubmVjdGVkOworICBwcml2YXRlIGludCBwb3J0OworICBwcml2YXRlIFN0cmluZyBob21lRGlyOworICAKKyAgcHVibGljIENvZ0pHbG9idXNGdHBQcm90b2NvbCgpIHsKKyAgCXRoaXMoMjEpOworICB9CisgIAorICBwdWJsaWMgQ29nSkdsb2J1c0Z0cFByb3RvY29sKGludCBwb3J0KSB7CisgIAl0aGlzLnBvcnQgPSBwb3J0OworICB9CisgIAorICBwdWJsaWMgdm9pZCBjZChQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICAgZnRwLmNoYW5nZURpcihmaWxlLmdldFBhdGgoKSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNkIHRvICIgKyBmaWxlICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBjZFJvb3QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAJY2QobmV3IFByb3RvY29sRmlsZShQcm90b2NvbEZpbGUuU0VQQVJBVE9SLCB0cnVlKSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNkSG9tZSgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgIAljZChuZXcgUHJvdG9jb2xGaWxlKGhvbWVEaXIsIHRydWUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNvbm5lY3QoU3RyaW5nIGhvc3QsIEF1dGhlbnRpY2F0aW9uIGF1dGgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgIGZ0cCA9IG5ldyBGVFBDbGllbnQoaG9zdCwgcG9ydCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNvbm5lY3QgdG86ICIgKyBob3N0ICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlOworCisgICAgICB0cnkgeworICAgICAgICAgIGZ0cC5hdXRob3JpemUoYXV0aC5nZXRVc2VyKCksIGF1dGguZ2V0UGFzcygpKTsKKyAgICAgICAgICBmdHAuc2V0QWN0aXZlKGZ0cC5zZXRMb2NhbFBhc3NpdmUoKSk7CisgICAgICAgICAgaG9tZURpciA9IGZ0cC5nZXRDdXJyZW50RGlyKCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvZ2luIHRvOiAiICsgaG9zdCArICIgOiAiCisgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICAgZnRwLmNsb3NlKCk7CisgICAgICAgICAgaXNDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJFcnJvciBkaXNjb25uZWN0aW5nIGZyb20gIgorICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0SG9zdCgpICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBnZXQoUHJvdG9jb2xGaWxlIGZyb21GaWxlLCBGaWxlIHRvRmlsZSkKKyAgICAgICAgICB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgICBmdHAuc2V0QWN0aXZlKGZ0cC5zZXRMb2NhbFBhc3NpdmUoKSk7CisgICAgICAgICAgZnRwLmdldChmcm9tRmlsZS5nZXRQYXRoKCksIHRvRmlsZSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRvd25sb2FkOiAiICsgZnJvbUZpbGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBwdXQoRmlsZSBmcm9tRmlsZSwgUHJvdG9jb2xGaWxlIHRvRmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkgIHRyeSB7CisJCSAgZnRwLnB1dChmcm9tRmlsZSwgdG9GaWxlLmdldFBhdGgoKSwgZmFsc2UpOworCSAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIHB1dCBmaWxlICciICsgZnJvbUZpbGUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJICB9CisgIH0KKworICAgIC8qKgorICAgICAqIFNldEFjdGl2ZQorICAgICAqIFNldHMgdGhlIEZUUCBBY3RpdmUgUHJvdG9jb2wKKyAgICAgKiBQYWNrYWdlIHByb3RlY3RlZCBzbyB3ZSBjYW4gdGVzdCB0aGUgbm9uIEZUUCBzZXJ2ZXIgcGFydHMgb2YgdGhlIGNvZGViYXNlLgorICAgICAqIEB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24KKyAgICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgc2V0QWN0aXZlKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICAgZnRwLnNldEFjdGl2ZShmdHAuc2V0TG9jYWxQYXNzaXZlKCkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgZnRwIGFjdGl2ZSA6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICB9CisKKyAgICAvKioKKyAgICAgKiBmdHBMaXN0CisgICAgICogR2V0cyBhIGZpbGUgbGlzdCBmcm9tIHRoZSBGVFAgU2VydmVyCisgICAgICogUGFja2FnZSBwcm90ZWN0ZWQgc28gd2UgY2FuIHRlc3QgdGhlIG5vbiBzZXJ2ZXIgcG9ydGlvbiBvZiB0aGUgY29kZS4KKyAgICAgKiBAcGFyYW0gZmlsdGVyCisgICAgICogQHBhcmFtIG1vZGlmaWVyCisgICAgICogQHJldHVybgorICAgICAqLworICBwcm90ZWN0ZWQgVmVjdG9yIGZ0cExpc3QoU3RyaW5nIGZpbHRlciwgU3RyaW5nIG1vZGlmaWVyKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gZnRwLmxpc3QoZmlsdGVyLCBtb2RpZmllcik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBsaXN0IG9mIGZpbGVzIDogIgorICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgfQorICBwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICAgc2V0QWN0aXZlKCk7CisgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgVmVjdG9yPEZpbGVJbmZvPiBmaWxlTGlzdCA9IChWZWN0b3I8RmlsZUluZm8+KSBmdHBMaXN0KCIqIiwgbnVsbCk7CisgICAgICAgICAgVmVjdG9yPFByb3RvY29sRmlsZT4gcmV0dXJuTGlzdCA9IG5ldyBWZWN0b3I8UHJvdG9jb2xGaWxlPigpOworICAgICAgICAgIGZvciAoRmlsZUluZm8gZmlsZSA6IGZpbGVMaXN0KSB7CisgICAgICAgICAgICAgIHJldHVybkxpc3QuYWRkKG5ldyBQcm90b2NvbEZpbGUodGhpcy5wd2QoKSwgZmlsZS5nZXROYW1lKCksIGZpbGUuaXNEaXJlY3RvcnkoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGxpc3Qgb2YgZmlsZXMgOiAiCisgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgfQorICAKKwlwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKFByb3RvY29sRmlsZUZpbHRlciBmaWx0ZXIpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZ0cC5zZXRBY3RpdmUoZnRwLnNldExvY2FsUGFzc2l2ZSgpKTsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgVmVjdG9yPEZpbGVJbmZvPiBmaWxlTGlzdCA9IChWZWN0b3I8RmlsZUluZm8+KSBmdHAubGlzdCgiKiIsIG51bGwpOworICAgICAgVmVjdG9yPFByb3RvY29sRmlsZT4gcmV0dXJuTGlzdCA9IG5ldyBWZWN0b3I8UHJvdG9jb2xGaWxlPigpOworICAgICAgZm9yIChGaWxlSW5mbyBmaWxlIDogZmlsZUxpc3QpIHsKKyAgICAgIAlQcm90b2NvbEZpbGUgcEZpbGUgPSBuZXcgUHJvdG9jb2xGaWxlKHRoaXMucHdkKCksIGZpbGUuZ2V0TmFtZSgpLCBmaWxlLmlzRGlyZWN0b3J5KCkpOworICAgICAgCWlmIChmaWx0ZXIuYWNjZXB0KHBGaWxlKSkgeworICAgICAgCQlyZXR1cm5MaXN0LmFkZChwRmlsZSk7CisgICAgICAJfQorICAgICAgfQorICAgICAgcmV0dXJuIHJldHVybkxpc3Q7CisJICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBsaXN0IG9mIGZpbGVzIDogIgorCSAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisJICB9CisgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgRGlyZWN0b3J5LgorICAgICAqIFBhY2thZ2UgcHJvdGVjdGVkIHNvIHdlIGNhbiB0ZXN0IHRoZSBub24gZnRwIHBhcnRzIG9mIHRoZSBjb2RlYmFzZS4KKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbgorICAgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cmVudERpcigpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiBmdHAuZ2V0Q3VycmVudERpcigpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgY3VycmVudCBkaXJlY3RvcnkgOiAiCisgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKworCisgIH0KKwkKKyAgcHVibGljIFByb3RvY29sRmlsZSBwd2QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gbmV3IFByb3RvY29sRmlsZShnZXRDdXJlbnREaXIoKSwgdHJ1ZSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIHB3ZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ZWQoKSB7CisgICAgICByZXR1cm4gaXNDb25uZWN0ZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBkZWxldGUoUHJvdG9jb2xGaWxlIGZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJICB0cnkgeworCSAgCWZ0cC5kZWxldGVGaWxlKGZpbGUuZ2V0UGF0aCgpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRvd25sb2FkIGZpbGUgJyIgCisJCQkJCSsgZmlsZS5nZXRQYXRoKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2Z0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvZnRwL0NvZ0pHbG9idXNGdHBQcm90b2NvbEZhY3RvcnkuamF2YSBiLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29nSkdsb2J1c0Z0cFByb3RvY29sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTY5ODEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2Z0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvZnRwL0NvZ0pHbG9idXNGdHBQcm90b2NvbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5mdHA7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIENvZ0pHbG9idXNGdHBQcm90b2NvbH1zCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb2dKR2xvYnVzRnRwUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgUHJvdG9jb2xGYWN0b3J5IHsKKworICBwdWJsaWMgQ29nSkdsb2J1c0Z0cFByb3RvY29sIG5ld0luc3RhbmNlKCkgeworICAgIHJldHVybiBuZXcgQ29nSkdsb2J1c0Z0cFByb3RvY29sKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwlyZXR1cm4gImZ0cCI7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9mdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2Z0cC9Db21tb25zTmV0RnRwUHJvdG9jb2wuamF2YSBiLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29tbW9uc05ldEZ0cFByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMGYzYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29tbW9uc05ldEZ0cFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuYXV0aC5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmV4Y2VwdGlvbnMuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC51dGlsLlByb3RvY29sRmlsZUZpbHRlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBGVFAgdHJhbnNmZXJzLiBJdCBpcyBidWlsdCBhcyBhIHdyYXBwZXIgYXJvdW5kCisgKiBBcGFjaGUncyBGVFBDbGllbnQgY2xhc3MgaW4gb3JkZXIgdG8gY29ubmVjdCBpdCBpbnRvIHRoZSBDcmF3bGVyJ3MgUHJvdG9jb2wKKyAqIGluZnJhc3RydWN0dXJlLgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICoKKyAqLworcHVibGljIGNsYXNzIENvbW1vbnNOZXRGdHBQcm90b2NvbCBpbXBsZW1lbnRzIFByb3RvY29sIHsKKworCXByaXZhdGUgZmluYWwgRlRQQ2xpZW50IGZ0cDsKKwlwcml2YXRlIFN0cmluZyBob21lRGlyOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBGdHBDbGllbnQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uc05ldEZ0cFByb3RvY29sKCkgeworCQlmdHAgPSBuZXcgRlRQQ2xpZW50KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyB2b2lkIGNvbm5lY3QoU3RyaW5nIGhvc3QsIEF1dGhlbnRpY2F0aW9uIGF1dGgpCisJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQkvLyBzZXJ2ZXIgY2Fubm90IGJlIG51bGwKKwkJaWYgKGhvc3QgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJUcmllZCB0byBjb25uZWN0IHRvIHNlcnZlciA9PSBOVUxMIik7CisJCX0KKworCQl0cnkgeworCQkJZnRwLmNvbm5lY3QoaG9zdCk7CisJCQlmdHAuZW50ZXJMb2NhbFBhc3NpdmVNb2RlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlciA6ICIKKwkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQl0cnkgeworCQkJLy8gdHJ5IGxvZ2dpbmcgaW4KKwkJCWlmICghZnRwLmxvZ2luKGF1dGguZ2V0VXNlcigpLCBhdXRoLmdldFBhc3MoKSkpIHsKKwkJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCBsb2dnaW5nIGludG8gaG9zdCAiICsgaG9zdAorCQkJCQkJKyAiIGFzIHVzZXIgIiArIGF1dGguZ2V0VXNlcigpKTsKKwkJCX0KKworCQkJLy8gc2V0IGZpbGUgdHlwZSB0byBiaW5hcnkKKwkJCWZ0cC5zZXRGaWxlVHlwZShGVFBDbGllbnQuQklOQVJZX0ZJTEVfVFlQRSk7CisKKwkJCWhvbWVEaXIgPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBsb2dpbiBmYWlsZWQKKwkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRXhjZXB0aW9uIHRocm93biB3aGlsZSBsb2dnaW5nIGludG8gaG9zdCAiCisJCQkJCSsgaG9zdCArICIgYXMgdXNlciAiICsgYXV0aC5nZXRVc2VyKCkpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBQcm90b2NvbEZpbGUgcHdkKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgUHJvdG9jb2xGaWxlKGZ0cC5wcmludFdvcmtpbmdEaXJlY3RvcnkoKSwgdHJ1ZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBwd2QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8UHJvdG9jb2xGaWxlPiBscygpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlTdHJpbmcgcGF0aCA9IHRoaXMucHdkKCkuZ2V0UGF0aCgpOworCQkJRlRQRmlsZVtdIGZpbGVzID0gZnRwLmxpc3RGaWxlcygpOworCQkJTGlzdDxQcm90b2NvbEZpbGU+IHJldHVybkZpbGVzID0gbmV3IExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJCUZUUEZpbGUgZmlsZSA9IGZpbGVzW2ldOworCQkJCWlmIChmaWxlID09IG51bGwpCisJCQkJCWNvbnRpbnVlOworCQkJCXJldHVybkZpbGVzLmFkZChuZXcgUHJvdG9jb2xGaWxlKHBhdGggKyAiLyIgKyBmaWxlLmdldE5hbWUoKSwgZmlsZQorCQkJCQkJLmlzRGlyZWN0b3J5KCkpKTsKKwkJCX0KKwkJCXJldHVybiByZXR1cm5GaWxlczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBmaWxlIGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBMaXN0PFByb3RvY29sRmlsZT4gbHMoUHJvdG9jb2xGaWxlRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlGVFBGaWxlW10gZmlsZXMgPSBmdHAubGlzdEZpbGVzKCk7CisJCQlMaXN0PFByb3RvY29sRmlsZT4gcmV0dXJuRmlsZXMgPSBuZXcgTGlua2VkTGlzdDxQcm90b2NvbEZpbGU+KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJRlRQRmlsZSBmaWxlID0gZmlsZXNbaV07CisJCQkJaWYgKGZpbGUgPT0gbnVsbCkKKwkJCQkJY29udGludWU7CisJCQkJU3RyaW5nIHBhdGggPSB0aGlzLnB3ZCgpLmdldFBhdGgoKTsKKwkJCQlQcm90b2NvbEZpbGUgcEZpbGUgPSBuZXcgUHJvdG9jb2xGaWxlKHBhdGggKyAiLyIgKyBmaWxlLmdldE5hbWUoKSwgZmlsZQorCQkJCQkJLmlzRGlyZWN0b3J5KCkpOworCQkJCWlmIChmaWx0ZXIuYWNjZXB0KHBGaWxlKSkgeworCQkJCQlyZXR1cm5GaWxlcy5hZGQocEZpbGUpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiByZXR1cm5GaWxlczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBmaWxlIGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyB2b2lkIGdldChQcm90b2NvbEZpbGUgZnJvbUZpbGUsIEZpbGUgdG9GaWxlKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQkvLyBmaWxlIG9yIHRvTG9jYWxGaWxlIGNhbm5vdCBiZSBudWxsCisJCWlmIChmcm9tRmlsZSA9PSBudWxsIHx8IHRvRmlsZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCSJDYW4ndCBkb3dubG9hZCBmaWxlIC0+IFByb3RvY29sRmlsZSA9PSBudWxsIHx8IHRvTG9jYWxGaWxlID09IG51bGwiKTsKKwkJfQorCisJCS8vIGRvd25sb2FkIGZpbGUKKwkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG9GaWxlKTsKKwkJCWlmICghZnRwLnJldHJpZXZlRmlsZShmcm9tRmlsZS5nZXROYW1lKCksIG9zKSkgeworCQkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRvd25sb2FkIGZpbGUgIgorCQkJCQkJKyBmcm9tRmlsZS5nZXROYW1lKCkpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gZG93bmxvYWQgZmFpbGVkCisJCQl0b0ZpbGUuZGVsZXRlKCk7CisJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZBSUxFRCB0byBkb3dubG9hZDogIiArIGZyb21GaWxlLmdldE5hbWUoKQorCQkJCQkrICIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9IGZpbmFsbHkgeworCQkJLy8gY2xvc2Ugb3V0cHV0IHN0cmVhbQorCQkJaWYgKG9zICE9IG51bGwpCisJCQkJdHJ5IHsKKwkJCQkJb3MuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQl0b0ZpbGUuZGVsZXRlKCk7CisJCQkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNsb3NlIG91dHB1dHN0cmVhbSA6ICIKKwkJCQkJCQkrIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIHZvaWQgcHV0KEZpbGUgZnJvbUZpbGUsIFByb3RvY29sRmlsZSB0b0ZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlmdHAuc3RvcmVGaWxlKHRvRmlsZS5nZXRQYXRoKCksIG5ldyBGaWxlSW5wdXRTdHJlYW0oZnJvbUZpbGUpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIHB1dCBmaWxlICciICsgZnJvbUZpbGUgKyAiJyA6ICIKKwkJCQkJKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIHZvaWQgY2QoUHJvdG9jb2xGaWxlIGZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGZpbGUuZ2V0UGF0aCgpKSkKKwkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJEaXJlY3RvcnkgY2hhbmdlIG1ldGhvZCByZXR1cm5lZCBmYWxzZSIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY2QgdG8gIiArIGZpbGUuZ2V0UGF0aCgpICsgIiA6ICIKKwkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBjZFJvb3QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQljZChuZXcgUHJvdG9jb2xGaWxlKFByb3RvY29sRmlsZS5TRVBBUkFUT1IsIHRydWUpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjZEhvbWUoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQljZChuZXcgUHJvdG9jb2xGaWxlKGhvbWVEaXIsIHRydWUpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQl0cnkgeworCQkJZnRwLmRpc2Nvbm5lY3QoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBzZXJ2ZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjb25uZWN0ZWQoKSB7CisJCXJldHVybiBmdHAuaXNDb25uZWN0ZWQoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIHZvaWQgZGVsZXRlKFByb3RvY29sRmlsZSBmaWxlKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCQl0cnkgeworCQkJZnRwLmRlbGV0ZUZpbGUoZmlsZS5nZXRQYXRoKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlIGZpbGUgJyIgKyBmaWxlLmdldFBhdGgoKQorCQkJCQkrICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29tbW9uc05ldEZ0cFByb3RvY29sRmFjdG9yeS5qYXZhIGIvMC4xMC9wcm90b2NvbC9mdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2Z0cC9Db21tb25zTmV0RnRwUHJvdG9jb2xGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjYmQ0MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9mdHAvQ29tbW9uc05ldEZ0cFByb3RvY29sRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmFjdG9yeTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIG5ldyB7QGxpbmsgQ29tbW9uc05ldEZ0cFByb3RvY29sfXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uc05ldEZ0cFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFByb3RvY29sRmFjdG9yeSB7CisKKyAgcHVibGljIENvbW1vbnNOZXRGdHBQcm90b2NvbCBuZXdJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gbmV3IENvbW1vbnNOZXRGdHBQcm90b2NvbCgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJcmV0dXJuICJmdHAiOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvZnRwL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvZnRwLXByb3RvY29sLWNvbmZpZy54bWwgYi8wLjEwL3Byb3RvY29sL2Z0cC9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2Z0cC1wcm90b2NvbC1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjRlYzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2Z0cC9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2Z0cC1wcm90b2NvbC1jb25maWcueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIAorCQorCUF1dGhvcjogYmZvc3RlcgorCURlc2NyaXB0aW9uOiBQcm90b2NvbE1hbmFnZXIgQ29uZmlndXJhdGlvbgorCQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cC5Db2dKR2xvYnVzRnRwUHJvdG9jb2xGYWN0b3J5Ii8+CisgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cC5Db21tb25zTmV0RnRwUHJvdG9jb2xGYWN0b3J5Ii8+CisJCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9mdHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2Z0cC9UZXN0Q29nSkdsb2J1c0Z0cFByb3RvY29sLmphdmEgYi8wLjEwL3Byb3RvY29sL2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvZnRwL1Rlc3RDb2dKR2xvYnVzRnRwUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjliZjllCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9mdHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2Z0cC9UZXN0Q29nSkdsb2J1c0Z0cFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cDsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuZnRwc2VydmVyLkNvbm5lY3Rpb25Db25maWdGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZnRwc2VydmVyLkRhdGFDb25uZWN0aW9uQ29uZmlndXJhdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5mdHBzZXJ2ZXIuRnRwU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZnRwc2VydmVyLkZ0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5mdHBzZXJ2ZXIubGlzdGVuZXIuTGlzdGVuZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZnRwc2VydmVyLnVzZXJtYW5hZ2VyLkNsZWFyVGV4dFBhc3N3b3JkRW5jcnlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZnRwc2VydmVyLnVzZXJtYW5hZ2VyLlByb3BlcnRpZXNVc2VyTWFuYWdlckZhY3Rvcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoLkJhc2ljQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmdsb2J1cy5mdHAuRmlsZUluZm87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBDb2dKR2xvYnVzRnRwUHJvdG9jb2x9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgVGVzdENvZ0pHbG9idXNGdHBQcm90b2NvbCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1JUID0gOTAwMDsKKwlwcml2YXRlIEZ0cFNlcnZlciBzZXJ2ZXI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgVVNFUlNfRklMRSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvdXNlcnMucHJvcGVydGllcyIpOworICAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRUcnVlKFVTRVJTX0ZJTEUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIG11c3QgZXhpc3QiLAorCQkJCVVTRVJTX0ZJTEUuZXhpc3RzKCkpOworCisJCUZ0cFNlcnZlckZhY3Rvcnkgc2VydmVyRmFjdG9yeSA9IG5ldyBGdHBTZXJ2ZXJGYWN0b3J5KCk7CisKKwkJc2VydmVyRmFjdG9yeS5zZXRDb25uZWN0aW9uQ29uZmlnKG5ldyBDb25uZWN0aW9uQ29uZmlnRmFjdG9yeSgpCisJCQkJLmNyZWF0ZUNvbm5lY3Rpb25Db25maWcoKSk7CisKKwkJTGlzdGVuZXJGYWN0b3J5IGxpc3RlbmVyRmFjdG9yeSA9IG5ldyBMaXN0ZW5lckZhY3RvcnkoKTsKKworCQlsaXN0ZW5lckZhY3Rvcnkuc2V0UG9ydChQT1JUKTsKKworCQlsaXN0ZW5lckZhY3RvcnkKKwkJCQkuc2V0RGF0YUNvbm5lY3Rpb25Db25maWd1cmF0aW9uKG5ldyBEYXRhQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb25GYWN0b3J5KCkKKwkJCQkJCS5jcmVhdGVEYXRhQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24oKSk7CisKKwkJc2VydmVyRmFjdG9yeS5hZGRMaXN0ZW5lcigiZGVmYXVsdCIsIGxpc3RlbmVyRmFjdG9yeS5jcmVhdGVMaXN0ZW5lcigpKTsKKworCQlQcm9wZXJ0aWVzVXNlck1hbmFnZXJGYWN0b3J5IHVtRmFjdG9yeSA9IG5ldyBQcm9wZXJ0aWVzVXNlck1hbmFnZXJGYWN0b3J5KCk7CisJCXVtRmFjdG9yeS5zZXRQYXNzd29yZEVuY3J5cHRvcihuZXcgQ2xlYXJUZXh0UGFzc3dvcmRFbmNyeXB0b3IoKSk7CisJCXVtRmFjdG9yeS5zZXRGaWxlKFVTRVJTX0ZJTEUpOworCisJCXNlcnZlckZhY3Rvcnkuc2V0VXNlck1hbmFnZXIodW1GYWN0b3J5LmNyZWF0ZVVzZXJNYW5hZ2VyKCkpOworCisJCXNlcnZlciA9IHNlcnZlckZhY3RvcnkuY3JlYXRlU2VydmVyKCk7CisJCS8vc2VydmVyLnN0YXJ0KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworCQlzZXJ2ZXIuc3RvcCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TFNhbmRDRGFuZFBXRCgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ29nSkdsb2J1c0Z0cFByb3RvY29sIGZ0cFByb3RvY29sID0gc3B5KG5ldyBDb2dKR2xvYnVzRnRwUHJvdG9jb2woUE9SVCkpOworICAgICAgICBCYXNpY0F1dGhlbnRpY2F0aW9uIGF1dGggPSBuZXcgQmFzaWNBdXRoZW50aWNhdGlvbigiYW5vbnltb3VzIiwgInBhc3N3b3JkIik7CisKKyAgICAgICAgLyoqIE1vY2tpbmcgc2VydmVyIHJlc3BvbnNlcyB0byBwcmV2ZW50IHNlcnZlciBmYWlsdXJlICoqLworCisgICAgICAgIE1vY2tpdG8uZG9SZXR1cm4oInRlc3QvcmVzb3VyY2VzIikud2hlbihmdHBQcm90b2NvbCkuZ2V0Q3VyZW50RGlyKCk7CisKKyAgICAgICAgVmVjdG9yPEZpbGVJbmZvPiB2ZWN0b3IgPSBuZXcgVmVjdG9yPEZpbGVJbmZvPigpOworICAgICAgICBGaWxlSW5mbyBmaWxlID0gbmV3IEZpbGVJbmZvKCk7CisgICAgICAgIGZpbGUuc2V0TmFtZSgidXNlcnMucHJvcGVydGllcyIpOworICAgICAgICBieXRlIGIgPSAxOworICAgICAgICBmaWxlLnNldEZpbGVUeXBlKGIpOworICAgICAgICB2ZWN0b3IuYWRkKGZpbGUpOworCisgICAgICAgIE1vY2tpdG8uZG9BbnN3ZXIobmV3IEFuc3dlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfX0pLndoZW4oZnRwUHJvdG9jb2wpLnNldEFjdGl2ZSgpOworCisgICAgICAgIE1vY2tpdG8uZG9SZXR1cm4odmVjdG9yKS53aGVuKGZ0cFByb3RvY29sKS5mdHBMaXN0KCIqIiwgbnVsbCk7CisKKyAgICAgICAgTW9ja2l0by5kb0Fuc3dlcihuZXcgQW5zd2VyKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9fSkud2hlbihmdHBQcm90b2NvbCkuY29ubmVjdCgibG9jYWxob3N0IiwgYXV0aCk7CisKKyAgICAgICAgTW9ja2l0by5kb0Fuc3dlcihuZXcgQW5zd2VyKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9fSkud2hlbihmdHBQcm90b2NvbCkuY2QobmV3IFByb3RvY29sRmlsZSgidGVzdC9yZXNvdXJjZXMiLCB0cnVlKSk7CisKKworCisgICAgICAgIGZ0cFByb3RvY29sLmNvbm5lY3QoImxvY2FsaG9zdCIsIGF1dGgpOworCisKKwkJZnRwUHJvdG9jb2wuY2QobmV3IFByb3RvY29sRmlsZSgidGVzdC9yZXNvdXJjZXMiLCB0cnVlKSk7CisKKwkJTGlzdDxQcm90b2NvbEZpbGU+IGxzUmVzdWx0cyA9IGZ0cFByb3RvY29sLmxzKCk7CisJCWFzc2VydFRydWUobHNSZXN1bHRzLmNvbnRhaW5zKG5ldyBQcm90b2NvbEZpbGUoZnRwUHJvdG9jb2wucHdkKCksICJ1c2Vycy5wcm9wZXJ0aWVzIiwgZmFsc2UpKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9mdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3VzZXJzLnByb3BlcnRpZXMgYi8wLjEwL3Byb3RvY29sL2Z0cC9zcmMvdGVzdC9yZXNvdXJjZXMvdXNlcnMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFjZTBiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9mdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3VzZXJzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Z0cHNlcnZlci51c2VyLmFub255bW91cy51c2VycGFzc3dvcmQ9CitmdHBzZXJ2ZXIudXNlci5hbm9ueW1vdXMubWF4bG9naW5wZXJpcD0yCitmdHBzZXJ2ZXIudXNlci5hbm9ueW1vdXMudXBsb2FkcmF0ZT00ODAwCitmdHBzZXJ2ZXIudXNlci5hbm9ueW1vdXMud3JpdGVwZXJtaXNzaW9uPWZhbHNlCitmdHBzZXJ2ZXIudXNlci5hbm9ueW1vdXMubWF4bG9naW5udW1iZXI9MjAKK2Z0cHNlcnZlci51c2VyLmFub255bW91cy5lbmFibGVmbGFnPXRydWUKK2Z0cHNlcnZlci51c2VyLmFub255bW91cy5ob21lZGlyZWN0b3J5PXNyYworZnRwc2VydmVyLnVzZXIuYW5vbnltb3VzLmlkbGV0aW1lPTMwMAorZnRwc2VydmVyLnVzZXIuYW5vbnltb3VzLmRvd25sb2FkcmF0ZT00ODAwCmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2h0dHAvcG9tLnhtbCBiLzAuMTAvcHJvdG9jb2wvaHR0cC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGQ3OGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvcG9tLnhtbApAQCAtMCwwICsxLDkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IgCisJbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIAorCWluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byAKKwlZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSAKKwl0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIAorCXRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgCisJYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSAKKwlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIAorCU9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyAKKwlsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoPi4uLy4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorCTwvcGFyZW50PgorCTxhcnRpZmFjdElkPmNhcy1wcm90b2NvbC1odHRwPC9hcnRpZmFjdElkPgorCTxuYW1lPkNBUyBQcm90b2NvbCBIVFRQIEltcGxlbWVudGF0aW9uPC9uYW1lPgorCTxwcm9maWxlcz4KKwkJPHByb2ZpbGU+CisJCQk8aWQ+YXVkaXQ8L2lkPgorCQkJPGFjdGl2YXRpb24+CisJCQkJPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorCQkJPC9hY3RpdmF0aW9uPgorCQkJPGJ1aWxkPgorCQkJCTxwbHVnaW5zPgorCQkJCQk8cGx1Z2luPgorCQkJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisJCQkJCQk8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGV4Y2x1ZGVzPgorCQkJCQkJCQk8ZXhjbHVkZT4qKi9yZXNvdXJjZXMvZXhhbXBsZXMvKiovKjwvZXhjbHVkZT4KKwkJCQkJCQk8L2V4Y2x1ZGVzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCQkJPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisJCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJCTxnb2FsPmNoZWNrPC9nb2FsPgorCQkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQkJPC9leGVjdXRpb25zPgorCQkJCQk8L3BsdWdpbj4KKwkJCQk8L3BsdWdpbnM+CisJCQk8L2J1aWxkPgorCQk8L3Byb2ZpbGU+CisJPC9wcm9maWxlcz4KKwk8YnVpbGQ+CisJCTxyZXNvdXJjZXM+CisJCQk8cmVzb3VyY2U+CisJCQkJPHRhcmdldFBhdGg+b3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwPC90YXJnZXRQYXRoPgorCQkJCTxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisJCQkJPGluY2x1ZGVzPgorCQkJCQk8aW5jbHVkZT5odHRwLXByb3RvY29sLWNvbmZpZy54bWw8L2luY2x1ZGU+CisJCQkJPC9pbmNsdWRlcz4KKwkJCTwvcmVzb3VyY2U+CisJCTwvcmVzb3VyY2VzPgorCTwvYnVpbGQ+CisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jYXMtcHJvdG9jb2wtYXBpPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm5la29odG1sPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bmVrb2h0bWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjkuNi4yPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS50aWthPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGlrYS1wYXJzZXJzPC9hcnRpZmFjdElkPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvSHR0cEZpbGUuamF2YSBiLzAuMTAvcHJvdG9jb2wvaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cC9IdHRwRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzg5NDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvSHR0cEZpbGUuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5odHRwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEhUVFAgZXh0ZW5zaW9uIG9mIHtAbGluayBQcm90b2NvbEZpbGV9CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSHR0cEZpbGUgZXh0ZW5kcyBQcm90b2NvbEZpbGUgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc3ODAwNTk4ODk0MTMwODE4MDBMOworCisJcHJpdmF0ZSBVUkwgbGluazsKKworCXB1YmxpYyBIdHRwRmlsZShTdHJpbmcgdmlydHVhbFBhdGgsIGJvb2xlYW4gaXNEaXIsIFVSTCBsaW5rKSB7CisJCXRoaXMobnVsbCwgdmlydHVhbFBhdGgsIGlzRGlyLCBsaW5rKTsKKwl9CisJCisJcHVibGljIEh0dHBGaWxlKEh0dHBGaWxlIHBhcmVudCwgU3RyaW5nIHZpcnR1YWxQYXRoLCBib29sZWFuIGlzRGlyLCBVUkwgbGluaykgeworCQlzdXBlcihwYXJlbnQsIHZpcnR1YWxQYXRoLCBpc0Rpcik7CisJCVZhbGlkYXRlLm5vdE51bGwobGluaywgIlVSTCBsaW5rIG11c3Qgbm90IGJlIE5VTEwiKTsKKwkJdGhpcy5saW5rID0gbGluazsKKwl9CisKKwlwdWJsaWMgVVJMIGdldExpbmsoKSB7CisJCXJldHVybiB0aGlzLmxpbms7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9odHRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL0h0dHBQcm90b2NvbC5qYXZhIGIvMC4xMC9wcm90b2NvbC9odHRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL0h0dHBQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDc3YzcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvSHR0cFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmh0dHA7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC51dGlsLkh0dHBVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnV0aWwuUHJvdG9jb2xGaWxlRmlsdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiAKKyAqIEh0dHAgUHJvdG9jb2wgY29tbXVuaWNhdGlvbiBjbGFzcworICogCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwUHJvdG9jb2wgaW1wbGVtZW50cyBQcm90b2NvbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxIdHRwRmlsZT4+IGxpbmtDaGlsZHJlbiA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxIdHRwRmlsZT4+KCk7CisKKyAgcHJpdmF0ZSBIdHRwRmlsZSBwYXJlbnRGaWxlOworICBwcml2YXRlIEh0dHBGaWxlIGN1cnJlbnRGaWxlOworICBwcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0ZWQ7CisgIAorICBwdWJsaWMgSHR0cFByb3RvY29sKCkgeworICAgIGlzQ29ubmVjdGVkID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBjZChQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgIAlIdHRwRmlsZSBodHRwRmlsZSA9IG51bGw7CisgICAgCWlmICghKGZpbGUgaW5zdGFuY2VvZiBIdHRwRmlsZSkpIHsKKyAgICAJCVVSTCBsaW5rID0gSHR0cFV0aWxzLnJlc29sdmVVcmkoY3VycmVudEZpbGUuZ2V0TGluaygpLnRvVVJJKCksIGZpbGUuZ2V0UGF0aCgpKS50b1VSTCgpOworICAJCQlodHRwRmlsZSA9IG5ldyBIdHRwRmlsZShsaW5rLmdldFBhdGgoKSwgZmlsZS5pc0RpcigpLCBsaW5rKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh0dHBGaWxlID0gKEh0dHBGaWxlKSBmaWxlOworICAgICAgfQorICAgIAkKKyAgICAgIGlmICghSHR0cFV0aWxzCisgICAgICAgICAgLmlzRGlyZWN0b3J5KGh0dHBGaWxlLmdldExpbmsoKSwgZmlsZS5nZXRQYXRoKCkpKQorICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oZmlsZQorICAgICAgICAgICAgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSAobWltZSB0eXBlIG11c3QgYmUgdGV4dC9odG1sKSIpOworICAgICAgdGhpcy5jdXJyZW50RmlsZSA9IGh0dHBGaWxlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBjZCB0byAiICsgZmlsZSArICIgOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBjZFJvb3QoKSB7CisgIAljdXJyZW50RmlsZSA9IHBhcmVudEZpbGU7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNkSG9tZSgpIHsKKyAgCWNkUm9vdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgY29ubmVjdChTdHJpbmcgaG9zdCwgQXV0aGVudGljYXRpb24gYXV0aCkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwOi8vIiArIGhvc3QgKyAiLyIpOworICAgICAgdXJsLm9wZW5TdHJlYW0oKS5jbG9zZSgpOworICAgICAgY3VycmVudEZpbGUgPSBwYXJlbnRGaWxlID0gbmV3IEh0dHBGaWxlKCIvIiwgdHJ1ZSwgdXJsKTsKKyAgICAgIGlzQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY29ubmVjdCB0byBodHRwOi8vIiArIGhvc3QgKyAiIDogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBjdXJyZW50RmlsZSA9IHBhcmVudEZpbGUgPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgZ2V0KFByb3RvY29sRmlsZSBmcm9tRmlsZSwgRmlsZSB0b0ZpbGUpCisgICAgICB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworCisgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgIHRyeSB7CisgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odG9GaWxlKSk7CisgICAgICBpZiAoZnJvbUZpbGUgaW5zdGFuY2VvZiBIdHRwRmlsZSkgeworICAgIAkgIGluID0gKChIdHRwRmlsZSkgZnJvbUZpbGUpLmdldExpbmsoKS5vcGVuU3RyZWFtKCk7CisgICAgICB9IGVsc2UgeworICAgIAkgIGluID0gSHR0cFV0aWxzLnJlc29sdmVVcmkoY3VycmVudEZpbGUuZ2V0TGluaygpLnRvVVJJKCksIGZyb21GaWxlLmdldFBhdGgoKSkudG9VUkwoKS5vcGVuU3RyZWFtKCk7CisgICAgICB9CisKKyAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgIGludCBudW1SZWFkOworICAgICAgbG9uZyBudW1Xcml0dGVuID0gMDsKKyAgICAgIHdoaWxlICgobnVtUmVhZCA9IGluLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgbnVtUmVhZCk7CisgICAgICAgIG51bVdyaXR0ZW4gKz0gbnVtUmVhZDsKKyAgICAgIH0KKyAgICAgIGluLmNsb3NlKCk7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGZpbGUgJyIgKyBmcm9tRmlsZSArICInIDogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIC8vIGxvZyBmYWlsdXJlCisgICAgICAgIH0KKyAgICAgIGlmIChvdXQgIT0gbnVsbCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAvLyBsb2cgZmFpbHVyZQorICAgICAgICB9CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBwdXQoRmlsZSBmcm9tRmlsZSwgUHJvdG9jb2xGaWxlIHRvRmlsZSkgeworCSAgLy9kbyBub3RoaW5nCisgIH0KKworICBwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgCUxpc3Q8UHJvdG9jb2xGaWxlPiBsc1Jlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgCWZvciAoSHR0cEZpbGUgZmlsZSA6IHBhcnNlTGluayhjdXJyZW50RmlsZSkpIHsKKyAgCQlsc1Jlc3VsdHMuYWRkKGZpbGUpOworICAJfQorICAgIHJldHVybiBsc1Jlc3VsdHM7CisgIH0KKworCXB1YmxpYyBMaXN0PFByb3RvY29sRmlsZT4gbHMoUHJvdG9jb2xGaWxlRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgIAlMaXN0PFByb3RvY29sRmlsZT4gbHNSZXN1bHRzID0gbmV3IEFycmF5TGlzdDxQcm90b2NvbEZpbGU+KCk7CisgIAlmb3IgKEh0dHBGaWxlIGZpbGUgOiBwYXJzZUxpbmsoY3VycmVudEZpbGUpKSB7CisgIAkJaWYgKGZpbHRlci5hY2NlcHQoZmlsZSkpIHsKKyAgCQkJbHNSZXN1bHRzLmFkZChmaWxlKTsKKyAgCQl9CisgIAl9CisgICAgcmV0dXJuIGxzUmVzdWx0czsKKwl9CisJCisgIHB1YmxpYyBQcm90b2NvbEZpbGUgcHdkKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGN1cnJlbnRGaWxlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSA6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQ7CisgIH0KKworICBwdWJsaWMgTGlzdDxIdHRwRmlsZT4gcGFyc2VMaW5rKEh0dHBGaWxlIGZpbGUpCisgICAgICB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgIExpc3Q8SHR0cEZpbGU+IGNoaWxkcmVuID0gbGlua0NoaWxkcmVuLmdldChmaWxlLmdldExpbmsoKQorICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgaWYgKGZpbGUuaXNEaXIoKSAmJiBjaGlsZHJlbiA9PSBudWxsKSB7CisgICAgICB0cnkgeworCisgICAgICAgIC8vIE9wZW4gbGluay4KKyAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IEh0dHBVdGlscy5jb25uZWN0KGZpbGUuZ2V0TGluaygpKTsKKworICAgICAgICAvLyBJZiByZWRpcmVjdGlvbiB0b29rIHBsYWNlLCB0aGVuIGNoYW5nZSB0aGUgUHJvdG9jb2xGaWxlJ3MgVVJMLgorICAgICAgICBpZiAoSHR0cFV0aWxzLmNoZWNrRm9yUmVkaXJlY3Rpb24oZmlsZS5nZXRMaW5rKCksIGNvbm4uZ2V0VVJMKCkpKSB7CisgICAgICAgICAgZmlsZSA9IG5ldyBIdHRwRmlsZShmaWxlLCBmaWxlLmdldFBhdGgoKSwgZmlsZS5pc0RpcigpLCBjb25uLmdldFVSTCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgbGlua3MgaW4gVVJMLgorICAgICAgICBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PEh0dHBGaWxlPigpOworICAgICAgICBjaGlsZHJlbi5hZGRBbGwoSHR0cFV0aWxzLmZpbmRMaW5rcyhmaWxlKSk7CisgICAgICAgIAorICAgICAgICAvLyBTYXZlIGNoaWxkcmVuIGxpbmtzIGZvdW5kLgorICAgICAgICBsaW5rQ2hpbGRyZW4ucHV0KGZpbGUuZ2V0TGluaygpLnRvU3RyaW5nKCksIGNoaWxkcmVuKTsKKworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGNoaWxkcmVuIGxpbmtzIGZvciAiICsgZmlsZQorICAgICAgICAgICAgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoaWxkcmVuOworICB9CisKKy8vICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kTGlua0luQVRhZyhTdHJpbmcgYVRhZykgeworLy8gICAgLy8gZmluZCAnaHJlZicgYXR0cmlidXRlCisvLyAgICBTdHJpbmcgZmluZCA9IGFUYWcuc3Vic3RyaW5nKGFUYWcuaW5kZXhPZigiaHJlZiIpICsgNCk7CisvLyAgICAvLyBVU0UgU1RSSUNUIEZJTkRJTkcgRklSU1QKKy8vICAgIC8vIChbJ1wiXSlccyo/WyhodHRwKSguLykoLi4pLyNdLis/XFwxCisvLyAgICAvLyBmaW5kcyBsaW5rIGJldHdlZW4gJyBvciAiLCB3aGljaCBzdGFydHMgd2l0aCBvbmUgb2YKKy8vICAgIC8vIHRoZSBmb2xsb3dpbmc6IGh0dHAsIC4vLCAuLiwgLywgIworLy8gICAgLy8gdGhlc2Ugc3RhcnRpbmcgcG9zc2liaWxpdGllcyBjYW4gdGhlbiBiZSBmb2xsb3dlZCBhbnkKKy8vICAgIC8vIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nCisvLyAgICAvLyAnIG9yICIgaXMgcmVhY2hlZC4KKy8vICAgIFN0cmluZyBwYXR0ZXJuUmVnRXhwID0gIihbJ1wiXSlcXHMqP1tcXChodHRwXFwpXFwoXFwuL1xcKVxcKFxcLlxcLlxcKS8jXS4rP1xcMSI7CisvLyAgICBQYXR0ZXJuIGxpbmtQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm5SZWdFeHApOworLy8gICAgTWF0Y2hlciBsaW5rTWF0Y2ggPSBsaW5rUGF0dGVybi5tYXRjaGVyKGZpbmQpOworLy8gICAgaWYgKGxpbmtNYXRjaC5maW5kKCkpCisvLyAgICAgIGZpbmQgPSBmaW5kLnN1YnN0cmluZyhsaW5rTWF0Y2guc3RhcnQoKSArIDEsIGxpbmtNYXRjaC5lbmQoKSAtIDEpOworLy8gICAgZWxzZSB7CisvLyAgICAgIC8vIFJFTEFYIEZJTkRJTkcgU09NRQorLy8gICAgICBwYXR0ZXJuUmVnRXhwID0gIihbJ1wiXSlcXHMqP1teLi9dLis/XFwxIjsKKy8vICAgICAgbGlua1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVyblJlZ0V4cCk7CisvLyAgICAgIGxpbmtNYXRjaCA9IGxpbmtQYXR0ZXJuLm1hdGNoZXIoZmluZCk7CisvLyAgICAgIGlmIChsaW5rTWF0Y2guZmluZCgpKQorLy8gICAgICAgIGZpbmQgPSBmaW5kLnN1YnN0cmluZyhsaW5rTWF0Y2guc3RhcnQoKSArIDEsIGxpbmtNYXRjaC5lbmQoKSAtIDEpOworLy8gICAgICBlbHNlIHsKKy8vICAgICAgICAvLyBFWFRSRU1FTFkgUkVMQVggRklORElORworLy8gICAgICAgIHBhdHRlcm5SZWdFeHAgPSAiW15cIj0nLz5cXHNdKz9bXlxccz5cIiddKj8iOworLy8gICAgICAgIGxpbmtQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm5SZWdFeHApOworLy8gICAgICAgIGxpbmtNYXRjaCA9IGxpbmtQYXR0ZXJuLm1hdGNoZXIoZmluZCk7CisvLyAgICAgICAgaWYgKGxpbmtNYXRjaC5maW5kKCkpCisvLyAgICAgICAgICBmaW5kID0gZmluZC5zdWJzdHJpbmcobGlua01hdGNoLnN0YXJ0KCksIGxpbmtNYXRjaC5lbmQoKSk7CisvLyAgICAgICAgZWxzZSB7CisvLyAgICAgICAgICByZXR1cm4gbnVsbDsKKy8vICAgICAgICB9CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICAgIHJldHVybiBmaW5kOworLy8gIH0KKy8vCisvLyAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTGlua0Zyb21IcmVmKEh0dHBGaWxlIHBhcmVudCwgU3RyaW5nIGhyZWYpIHsKKy8vICAgIGlmICghaHJlZi5zdGFydHNXaXRoKCJodHRwIikpIHsKKy8vICAgICAgU3RyaW5nIGxpbmsgPSBwYXJlbnQuZ2V0TGluaygpLnRvRXh0ZXJuYWxGb3JtKCk7CisvLyAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoIi4uIikpIHsKKy8vICAgICAgICBpbnQgaW5kZXggPSBsaW5rLnN1YnN0cmluZygwLCBsaW5rLmxhc3RJbmRleE9mKCIvIikpLmxhc3RJbmRleE9mKCIvIik7CisvLyAgICAgICAgaHJlZiA9IChpbmRleCA8IDcpID8gbGluayArIGhyZWYuc3Vic3RyaW5nKDIpIDogbGluay5zdWJzdHJpbmcoMCwgbGluaworLy8gICAgICAgICAgICAuc3Vic3RyaW5nKDAsIGxpbmsubGFzdEluZGV4T2YoIi8iKSkubGFzdEluZGV4T2YoIi8iKSkKKy8vICAgICAgICAgICAgKyBocmVmLnN1YnN0cmluZygyKTsKKy8vICAgICAgfSBlbHNlIGlmIChocmVmLnN0YXJ0c1dpdGgoIi4vIikpIHsKKy8vICAgICAgICBpbnQgaW5kZXggPSBsaW5rLmxhc3RJbmRleE9mKCIvIik7CisvLyAgICAgICAgaHJlZiA9IChpbmRleCA8IDcpID8gbGluayArIGhyZWYuc3Vic3RyaW5nKDEpIDogbGluaworLy8gICAgICAgICAgICAuc3Vic3RyaW5nKDAsIGluZGV4KQorLy8gICAgICAgICAgICArIGhyZWYuc3Vic3RyaW5nKDEpOworLy8gICAgICB9IGVsc2UgaWYgKGhyZWYuc3RhcnRzV2l0aCgiLyIpKSB7CisvLyAgICAgICAgVVJMIHVybCA9IHBhcmVudC5nZXRMaW5rKCk7CisvLyAgICAgICAgaHJlZiA9IHVybC5nZXRQcm90b2NvbCgpICsgIjovLyIgKyB1cmwuZ2V0SG9zdCgpICsgaHJlZjsKKy8vICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IC8gaW4gY3VycmVudCBsaW5rCisvLyAgICAgICAgaW50IGluZGV4ID0gbGluay5sYXN0SW5kZXhPZigiLyIpOworLy8gICAgICAgIC8vIChpbmRleCA8IDcpIGNoZWNrcyBpZiBpbiB0aGUgY3VycmVudCBsaW5rLCAiLyIgb25seSBleGlzdHMKKy8vICAgICAgICAvLyBpbiB0aGUgcHJvdG9jb2wgc2VjdGlvbiBvZiBsaW5rIChpLmUuIGh0dHA6Ly9qcGwubmFzYS5nb3YpCisvLyAgICAgICAgaHJlZiA9IChpbmRleCA8IDcpID8gbGluayArICIvIiArIGhyZWYgOiBsaW5rLnN1YnN0cmluZygwLCBpbmRleCkgKyAiLyIKKy8vICAgICAgICAgICAgKyBocmVmOworLy8gICAgICB9CisvLyAgICB9CisvLworLy8gICAgLy8gcmVtb3ZlICIvIiBhdCBlbmQgb2YgbGluaworLy8gICAgaWYgKGhyZWYuZW5kc1dpdGgoIi8iKSkKKy8vICAgICAgaHJlZiA9IGhyZWYuc3Vic3RyaW5nKDAsIGhyZWYubGVuZ3RoKCkgLSAxKTsKKy8vICAgIGhyZWYgPSBocmVmLnRyaW0oKTsKKy8vCisvLyAgICByZXR1cm4gaHJlZjsKKy8vICB9CisvLworLy8gIHB1YmxpYyBQcm90b2NvbEZpbGUgZ2V0UHJvdG9jb2xGaWxlRm9yKFN0cmluZyBwYXRoLCBib29sZWFuIGlzRGlyKQorLy8gICAgICB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworLy8gICAgdHJ5IHsKKy8vICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLyAiKTsKKy8vICAgICAgSHR0cEZpbGUgY3VyUGF0aCA9IHRoaXMucGFyZW50RmlsZTsKKy8vICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHBhcmVudFBhdGgpOworLy8gICAgICBpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7CisvLyAgICAgICAgZG8geworLy8gICAgICAgICAgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7CisvLyAgICAgICAgICBMaXN0PEh0dHBGaWxlPiBjaGlsZHJlbiA9IHRoaXMucGFyc2VMaW5rKGN1clBhdGgpOworLy8gICAgICAgICAgZm9yIChIdHRwRmlsZSBwRmlsZSA6IGNoaWxkcmVuKSB7CisvLyAgICAgICAgICAgIGlmIChwRmlsZS5nZXROYW1lKCkuZXF1YWxzKHRva2VuKSkgeworLy8gICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigidG9rZW4gIiArIHRva2VuICsgIiAiICsKKy8vICAgICAgICAgICAgICAvLyBwRmlsZSk7CisvLyAgICAgICAgICAgICAgY3VyUGF0aCA9IHBGaWxlOworLy8gICAgICAgICAgICAgIGNvbnRpbnVlOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgICB9CisvLyAgICAgICAgfSB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKTsKKy8vICAgICAgICBpZiAoY3VyUGF0aC5lcXVhbHModGhpcy5wYXJlbnRGaWxlKSkKKy8vICAgICAgICAgIHJldHVybiBuZXcgSHR0cEZpbGUocGF0aCwgaXNEaXIsIG5ldyBVUkwoImh0dHA6Ly8iCisvLyAgICAgICAgICAgICAgICAgICsgdGhpcy5nZXRTaXRlKCkuZ2V0SG9zdCgpICsgcGF0aCksIGN1clBhdGgpOworLy8gICAgICB9CisvLyAgICAgIHJldHVybiBjdXJQYXRoOworLy8gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IFByb3RvY29sUGF0aCBmb3IgIiArIHBhdGgpOworLy8gICAgfQorLy8gIH0KKworICBwdWJsaWMgdm9pZCBkZWxldGUoUHJvdG9jb2xGaWxlIGZpbGUpIHt9CisKKy8vICBwcml2YXRlIFVSTCBnZXRTaXRlKCkgeworLy8JcmV0dXJuIGN1cnJlbnRVUkw7ICAKKy8vICB9CisgIAorICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdXJsU3RyaW5nID0gbnVsbCwgZG93bmxvYWRUb0RpciA9IG51bGw7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdXJsIikpCisgICAgICAgIHVybFN0cmluZyA9IGFyZ3NbKytpXTsKKyAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWRvd25sb2FkVG9EaXIiKSkKKyAgICAgICAgZG93bmxvYWRUb0RpciA9IGFyZ3NbKytpXTsKKyAgICB9CisKKyAgICBpZiAodXJsU3RyaW5nID09IG51bGwpCisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgYSB1cmwgdG8gZG93bmxvYWQ6IC0tdXJsIDx1cmw+Iik7CisKKyAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOworICAgIFByb3RvY29sRmlsZSB1cmxGaWxlID0gbmV3IEh0dHBGaWxlKHVybC5nZXRQYXRoKCksIGZhbHNlLCB1cmwpOworICAgIEZpbGUgdG9GaWxlID0gbmV3IEZpbGUoZG93bmxvYWRUb0RpciwgdXJsRmlsZS5nZXROYW1lKCkpOworICAgIHRvRmlsZSA9IHRvRmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICB0b0ZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgIG5ldyBIdHRwUHJvdG9jb2woKS5nZXQodXJsRmlsZSwgdG9GaWxlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvSHR0cFByb3RvY29sRmFjdG9yeS5qYXZhIGIvMC4xMC9wcm90b2NvbC9odHRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL0h0dHBQcm90b2NvbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI1YmIzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9odHRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL0h0dHBQcm90b2NvbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5odHRwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBIdHRwUHJvdG9jb2x9cworICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEh0dHBQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBQcm90b2NvbEZhY3RvcnkgeworCisJcHVibGljIEh0dHBQcm90b2NvbCBuZXdJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG5ldyBIdHRwUHJvdG9jb2woKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuICJodHRwIjsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvdXRpbC9IdHRwVXRpbHMuamF2YSBiLzAuMTAvcHJvdG9jb2wvaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cC91dGlsL0h0dHBVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDY1OTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvdXRpbC9IdHRwVXRpbHMuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLk1pbWVUeXBlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5odHRwLkh0dHBGaWxlOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgSFRUUCBQcm90b2NvbCByZWxhdGVkIHRhc2tzLgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgSHR0cFV0aWxzIHsKKworICBzdGF0aWMgZmluYWwgTWltZVR5cGVVdGlscyBNSU1FX1RZUEVTID0gbmV3IE1pbWVUeXBlVXRpbHMoKTsKKyAgCisJLy8gUGF0dGVybiBsb29raW5nIGZvciA8YSBocmVmPSIoZ3JvdXAtMikiLz4oZ3JvdXAtMyk8L2E+IC4gLiAuIGdyb3VwLTEgaXMgZm9yIGVpdGhlciAiIG9yICcKKwlzdGF0aWMgZmluYWwgUGF0dGVybiBYSFRNTF9MSU5LX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIjxcXHMqYVxccytocmVmXFxzKj1cXHMqKFsnXCJdKSguKz8pXFwxXFxzKj4oLis/KTxcXHMqL1xccyphXFxzKj4iKTsgCisJc3RhdGljIGZpbmFsIFBhdHRlcm4gTEFaWV9MSU5LX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIjxcXHMqYVxccytocmVmXFxzKj1cXHMqKFsnXCJdKSguKz8pXFwxXFxzKi9cXHMqPiIpOyAKKworCXByaXZhdGUgSHR0cFV0aWxzKCkge30KKwkKKwkvKioKKwkgKiBSZXNvbHZlcyBhIHBhdGggYWdhaW5zdCBnaXZlbiB7QGxpbmsgVVJJfSBhbmQgY3JlYXRlcyB0aGUgcmVzb2x2ZWQge0BsaW5rIFVSSX0uCisJICogKGkuZS4gYmFzZSA9ICJodHRwOi8vbG9jYWxob3N0IiA7IHBhdGggPSAiL3BhdGgvdG8vZmlsZSIgOyByZXNvbHZlZCA9ICJodHRwOi8vbG9jYWxob3N0L3BhdGgvdG8vZmlsZSIpCisJICogSGFuZGxlcyBhbGwgY2FzZXM6IGlmIGJhc2UgYWxyZWFkeSBoYXMgYSBwYXRoLCBpZiBwYXRoIGlzIHJlbGF0aXZlLCBpZiBwYXRoIGlzIGFic29sdXRlLgorCSAqIAorCSAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIHtAbGluayBVUkl9IHdoaWNoIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgcmVzb2x2ZWQgYWdhaW5zdC4KKwkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbiB7QGxpbmsgVVJJfQorCSAqIEByZXR1cm4gcmVzb2x2ZWQge0BsaW5rIFVSSX0uIAorCSAqIEB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBVUkkgcmVzb2x2ZVVyaShVUkkgYmFzZSwgU3RyaW5nIHBhdGgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworCQlWYWxpZGF0ZS5ub3ROdWxsKGJhc2UsICJiYXNlIFVSSSBtdXN0IG5vdCBiZSBOVUxMIik7CisJCVZhbGlkYXRlLm5vdE51bGwocGF0aCwgInJlc29sdmUgcGF0aCBtdXN0IG5vdCBiZSBOVUxMIik7CisJCWlmIChwYXRoLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgeworCQkJcmV0dXJuIG5ldyBVUkkocGF0aCk7CisJCX0gZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKwkJCXJldHVybiBuZXcgVVJJKGJhc2UuZ2V0U2NoZW1lKCkgKyAiOi8vIiArIGJhc2UuZ2V0SG9zdCgpICsgcGF0aCk7CisJCX0gZWxzZSB7CisJCQlpZiAoYmFzZS50b1N0cmluZygpLmVuZHNXaXRoKCIvIikpIHsKKwkJCQlyZXR1cm4gbmV3IFVSSShiYXNlLnRvU3RyaW5nKCkgKyBwYXRoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG5ldyBVUkkoYmFzZS50b1N0cmluZygpICsgIi8iICsgcGF0aCk7CQkJCQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0KFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworCQljb25uLmNvbm5lY3QoKTsKKwkJY29ubi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKwkJcmV0dXJuIGNvbm47CisJfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0ZvclJlZGlyZWN0aW9uKFVSTCBiZWZvcmVDb25uVXJsLCBVUkwgYWZ0ZXJDb25uVXJsKSB7CisgICAgcmV0dXJuICFiZWZvcmVDb25uVXJsLnRvU3RyaW5nKCkuZXF1YWxzKGFmdGVyQ29ublVybC50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRVcmwoSHR0cFVSTENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBjcmVhdGUgVVJMIHNvdXJjZSByZWFkZXIKKyAgICBTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihjb25uLmdldElucHV0U3RyZWFtKCkpOworCisgICAgLy8gUmVhZCBpbiBsaW5rCisgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgd2hpbGUgKHNjYW5uZXIuaGFzTmV4dCgpKQorICAgICAgc2IuYXBwZW5kKHNjYW5uZXIubmV4dExpbmUoKSk7CisgICAgCisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxIdHRwRmlsZT4gZmluZExpbmtzKEh0dHBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKwkJTWF0Y2hlciBtYXRjaGVyID0gWEhUTUxfTElOS19QQVRURVJOLm1hdGNoZXIoSHR0cFV0aWxzLnJlYWRVcmwoY29ubmVjdChmaWxlLmdldExpbmsoKSkpKTsKKwkJTGlzdDxIdHRwRmlsZT4gaHR0cEZpbGVzID0gbmV3IEFycmF5TGlzdDxIdHRwRmlsZT4oKTsKKwkJd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7CisJCQlTdHJpbmcgbGluayA9IG1hdGNoZXIuZ3JvdXAoMikudHJpbSgpOworCQkJU3RyaW5nIHZpcnR1YWxQYXRoID0gbWF0Y2hlci5ncm91cCgzKS50cmltKCk7CisJCQlVUkwgdXJsID0gcmVzb2x2ZVVyaShmaWxlLmdldExpbmsoKS50b1VSSSgpLCBsaW5rKS50b1VSTCgpOworCQkJaHR0cEZpbGVzLmFkZChuZXcgSHR0cEZpbGUoZmlsZSwgbGluaywgaXNEaXJlY3RvcnkodXJsLCB2aXJ0dWFsUGF0aCksIHVybCkpOworCQl9CisJCW1hdGNoZXIgPSBMQVpZX0xJTktfUEFUVEVSTi5tYXRjaGVyKEh0dHBVdGlscy5yZWFkVXJsKGNvbm5lY3QoZmlsZS5nZXRMaW5rKCkpKSk7CisJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgeworCQkJU3RyaW5nIGxpbmsgPSBtYXRjaGVyLmdyb3VwKDIpLnRyaW0oKTsKKwkJCVVSTCB1cmwgPSByZXNvbHZlVXJpKGZpbGUuZ2V0TGluaygpLnRvVVJJKCksIGxpbmspLnRvVVJMKCk7CisJCQlodHRwRmlsZXMuYWRkKG5ldyBIdHRwRmlsZShmaWxlLCBsaW5rLCBpc0RpcmVjdG9yeSh1cmwsIGxpbmspLCB1cmwpKTsKKwkJfQorCQlyZXR1cm4gaHR0cEZpbGVzOworCX0KKwkJCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0b3J5KFVSTCB1cmwsIFN0cmluZyB2aXJ0dWFsUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBtaW1lID0gTUlNRV9UWVBFUy5hdXRvUmVzb2x2ZUNvbnRlbnRUeXBlKHVybC50b1N0cmluZygpLAorCQkJCQlNaW1lVHlwZVV0aWxzLnJlYWRNYWdpY0hlYWRlcih1cmwub3BlblN0cmVhbSgpKSk7CisJCQlyZXR1cm4gKG1pbWUuZXF1YWxzKCJ0ZXh0L2h0bWwiKSAmJiAhdmlydHVhbFBhdGguZW5kc1dpdGgoIi5odG1sIikpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVUkwgZG9lcyBub3QgZXhpc3QgJyIgKyB1cmwgKyAiJyIsIGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9odHRwL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvaHR0cC1wcm90b2NvbC1jb25maWcueG1sIGIvMC4xMC9wcm90b2NvbC9odHRwL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvaHR0cC1wcm90b2NvbC1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTZlNTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9odHRwLXByb3RvY29sLWNvbmZpZy54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gCisJCisJQXV0aG9yOiBiZm9zdGVyCisJRGVzY3JpcHRpb246IFByb3RvY29sTWFuYWdlciBDb25maWd1cmF0aW9uCisJCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC5IdHRwUHJvdG9jb2xGYWN0b3J5Ii8+CisJCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL1Rlc3RIdHRwRmlsZS5qYXZhIGIvMC4xMC9wcm90b2NvbC9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL1Rlc3RIdHRwRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjQ1MWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvVGVzdEh0dHBGaWxlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cDsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgSHR0cEZpbGV9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RIdHRwRmlsZSBleHRlbmRzIFRlc3RDYXNlIHsKKworCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsU3RhdGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJSHR0cEZpbGUgcGFyZW50ID0gbmV3IEh0dHBGaWxlKCIvcGF0aC90byIsIGZhbHNlLCBuZXcgVVJMKCJodHRwOi8vc29tZS1zaXRlIikpOworCQlIdHRwRmlsZSBmaWxlID0gbmV3IEh0dHBGaWxlKHBhcmVudCwgIi9wYXRoL3RvL2ZpbGUiLCBmYWxzZSwgbmV3IFVSTCgiaHR0cDovL3NvbWUtc2l0ZSIpKTsKKwkJYXNzZXJ0Tm90TnVsbChmaWxlLmdldExpbmsoKSk7CisJCWFzc2VydEVxdWFscygiaHR0cDovL3NvbWUtc2l0ZSIsIGZpbGUuZ2V0TGluaygpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRGYWxzZShmaWxlLmlzRGlyKCkpOworCQlhc3NlcnRGYWxzZShmaWxlLmlzUmVsYXRpdmUoKSk7CisJCWFzc2VydE5vdE51bGwoZmlsZS5nZXRQYXJlbnQoKSk7CisJCWFzc2VydEVxdWFscyhwYXJlbnQsIGZpbGUuZ2V0UGFyZW50KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbENhc2UoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCSBuZXcgSHR0cEZpbGUobnVsbCwgZmFsc2UsIG5ldyBVUkwoImh0dHA6Ly9zb21lLXNpdGUiKSk7CisJCQlmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQorCQl0cnkgeworCQkJIG5ldyBIdHRwRmlsZSgiL3BhdGgvdG8vZmlsZSIsIGZhbHNlLCBudWxsKTsKKwkJCWZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL1Rlc3RIdHRwUHJvdG9jb2wuamF2YSBiLzAuMTAvcHJvdG9jb2wvaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cC9UZXN0SHR0cFByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhN2M0ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cC9UZXN0SHR0cFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmh0dHA7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoLk5vQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC51dGlsLkh0dHBVdGlsczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgSHR0cFByb3RvY29sfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0SHR0cFByb3RvY29sIGV4dGVuZHMgVGVzdENhc2UgeworCQorCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJSHR0cFByb3RvY29sIGh0dHBQcm90b2NvbCA9IG5ldyBIdHRwUHJvdG9jb2woKTsKKwkJYXNzZXJ0RmFsc2UoaHR0cFByb3RvY29sLmNvbm5lY3RlZCgpKTsKKwkJaHR0cFByb3RvY29sLmNvbm5lY3QoInN2bi5hcGFjaGUub3JnIiwgbmV3IE5vQXV0aGVudGljYXRpb24oKSk7CisJCWFzc2VydFRydWUoaHR0cFByb3RvY29sLmNvbm5lY3RlZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdExTYW5kQ0QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworCQlIdHRwUHJvdG9jb2wgaHR0cFByb3RvY29sID0gbmV3IEh0dHBQcm90b2NvbCgpOworCQlodHRwUHJvdG9jb2wuY29ubmVjdCgic3ZuLmFwYWNoZS5vcmciLCBuZXcgTm9BdXRoZW50aWNhdGlvbigpKTsKKwkJYXNzZXJ0VHJ1ZShodHRwUHJvdG9jb2wuY29ubmVjdGVkKCkpOworCQlodHRwUHJvdG9jb2wuY2QobmV3IFByb3RvY29sRmlsZSgicmVwb3MvYXNmL29vZHQvdHJ1bmsvcHJvdG9jb2wvaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cCIsIHRydWUpKTsKKwkJTGlzdDxQcm90b2NvbEZpbGU+IGZpbGVzID0gaHR0cFByb3RvY29sLmxzKCk7CisJCWJvb2xlYW4gZm91bmRGaWxlID0gZmFsc2U7CisJCWZvciAoUHJvdG9jb2xGaWxlIGZpbGUgOiBmaWxlcykgeworCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscygiSHR0cFByb3RvY29sLmphdmEiKSkgeworCQkJCWZvdW5kRmlsZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShmb3VuZEZpbGUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UFdEKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJSHR0cFByb3RvY29sIGh0dHBQcm90b2NvbCA9IG5ldyBIdHRwUHJvdG9jb2woKTsKKwkJaHR0cFByb3RvY29sLmNvbm5lY3QoInN2bi5hcGFjaGUub3JnIiwgbmV3IE5vQXV0aGVudGljYXRpb24oKSk7CisJCWFzc2VydFRydWUoaHR0cFByb3RvY29sLmNvbm5lY3RlZCgpKTsKKwkJUHJvdG9jb2xGaWxlIGdvdG9EaXIgPSBuZXcgUHJvdG9jb2xGaWxlKGh0dHBQcm90b2NvbC5wd2QoKSwKKwkJCSJyZXBvcy9hc2Yvb29kdC90cnVuay9wcm90b2NvbC9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwIiwgdHJ1ZSk7CisJCWh0dHBQcm90b2NvbC5jZChnb3RvRGlyKTsKKwkJUHJvdG9jb2xGaWxlIGN1cnJlbnREaXIgPSBodHRwUHJvdG9jb2wucHdkKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihnb3RvRGlyLmdldEFic29sdXRlRmlsZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGN1cnJlbnREaXIuZ2V0QWJzb2x1dGVGaWxlKCkpOworCQlhc3NlcnRFcXVhbHMoZ290b0RpciwgY3VycmVudERpcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHRVQoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJSHR0cFByb3RvY29sIGh0dHBQcm90b2NvbCA9IG5ldyBIdHRwUHJvdG9jb2woKTsKKwkJaHR0cFByb3RvY29sLmNvbm5lY3QoInN2bi5hcGFjaGUub3JnIiwgbmV3IE5vQXV0aGVudGljYXRpb24oKSk7CisJCWFzc2VydFRydWUoaHR0cFByb3RvY29sLmNvbm5lY3RlZCgpKTsKKwkJaHR0cFByb3RvY29sLmNkKG5ldyBQcm90b2NvbEZpbGUoInJlcG9zL2FzZi9vb2R0L3RydW5rL3Byb3RvY29sL2h0dHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzIgorCQkJCQkJCQkJCSArICIvcHJvdG9jb2wvaHR0cCIsIHRydWUpKTsKKwkJRmlsZSBib2d1cyA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJvZ3VzIiwgImJvZ3VzIik7CisJCUZpbGUgdG1wRGlyID0gbmV3IEZpbGUoYm9ndXMuZ2V0UGFyZW50RmlsZSgpLCAiVGVzdEh0dHBQcm90b2NvbCIpOworCQlib2d1cy5kZWxldGUoKTsKKwkJdG1wRGlyLm1rZGlycygpOworCQlGaWxlIHRvRmlsZSA9IG5ldyBGaWxlKHRtcERpciwgIlRlc3RIdHRwUHJvdG9jb2wuamF2YSIpOworCQlodHRwUHJvdG9jb2wuZ2V0KG5ldyBQcm90b2NvbEZpbGUoIlRlc3RIdHRwUHJvdG9jb2wuamF2YSIsIGZhbHNlKSwgdG9GaWxlKTsKKwkJYXNzZXJ0VHJ1ZSh0b0ZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnROb3RTYW1lKDAsIHRvRmlsZS5sZW5ndGgoKSk7CisJCQorCQlTdHJpbmcgZmlsZUNvbnRlbnQgPSAiIjsKKwkJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIodG9GaWxlKTsKKwkJd2hpbGUoc2Nhbm5lci5oYXNOZXh0TGluZSgpKSB7CisJCQlmaWxlQ29udGVudCArPSBzY2FubmVyLm5leHRMaW5lKCk7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKGZpbGVDb250ZW50LCBIdHRwVXRpbHMucmVhZFVybChIdHRwVXRpbHMuY29ubmVjdChuZXcgVVJMKCJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvIgorCQkJCQkJCQkJCQkJCQkJCQkJCSAgKyAidHJ1bmsvcHJvdG9jb2wvaHR0cC9zcmMvdGVzdC9qYXZhL29yZy8iCisJCQkJCQkJCQkJCQkJCQkJCQkJICArICJhcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cC8iCisJCQkJCQkJCQkJCQkJCQkJCQkJICArICJUZXN0SHR0cFByb3RvY29sLmphdmEiKSkpKTsKKwkJRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRtcERpcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL3V0aWwvVGVzdEh0dHBVdGlscy5qYXZhIGIvMC4xMC9wcm90b2NvbC9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9odHRwL3V0aWwvVGVzdEh0dHBVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTAzZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2h0dHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2h0dHAvdXRpbC9UZXN0SHR0cFV0aWxzLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmh0dHAudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC5IdHRwRmlsZTsKKworLy9KVW5pdHMgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgSHR0cFV0aWxzfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RIdHRwVXRpbHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQQUNIRV9TVk5fU0lURSA9ICJodHRwOi8vc3ZuLmFwYWNoZS5vcmciOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9IVFRQX1NWTl9MT0MgPSAiL3JlcG9zL2FzZi9vb2R0L3RydW5rL3Byb3RvY29sL2h0dHAiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfVVJMX09GX1RISVNfVEVTVCA9IFBST1RPQ09MX0hUVFBfU1ZOX0xPQyArCisJCQkJCQkJCQkJCQkJCSAgIi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaHR0cC91dGlsIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09GX1RISVNfVEVTVCA9IFBBUkVOVF9VUkxfT0ZfVEhJU19URVNUICsgIi9UZXN0SHR0cFV0aWxzLmphdmEiOworCQorCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVXJpKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisJCVVSSSBiYXNlVXJpID0gbmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdC9iYXNlL2RpcmVjdG9yeS8iKTsKKwkJCisJCS8vIFRlc3QgYWJzb2x1dGUgcmVzb2x2ZS4KKwkJVVJJIHJlc29sdmVkQWJzb2x1dGVVcmkgPSBIdHRwVXRpbHMucmVzb2x2ZVVyaShiYXNlVXJpLCAiL3BhdGgvdG8vZmlsZSIpOworCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QvcGF0aC90by9maWxlIiwgcmVzb2x2ZWRBYnNvbHV0ZVVyaS50b1N0cmluZygpKTsKKwkJCisJCS8vIFRlc3QgcmVsYXRpdmUgcmVzb2x2ZS4KKwkJVVJJIHJlc29sdmVkUmVsYXRpdmVVcmkgPSBIdHRwVXRpbHMucmVzb2x2ZVVyaShiYXNlVXJpLCAicGF0aC90by9maWxlIik7CisJCWFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdC9iYXNlL2RpcmVjdG9yeS9wYXRoL3RvL2ZpbGUiLCByZXNvbHZlZFJlbGF0aXZlVXJpLnRvU3RyaW5nKCkpOworCisJCS8vIFRlc3QgcmVsYXRpdmUgd2l0aCBiYXNlIG5vdCBlbmRpbmcgaW4gLworCQliYXNlVXJpID0gbmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdC9iYXNlL2RpcmVjdG9yeSIpOworCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QvYmFzZS9kaXJlY3RvcnkvcGF0aC90by9maWxlIiwgcmVzb2x2ZWRSZWxhdGl2ZVVyaS50b1N0cmluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdENvbm5lY3RVcmwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSBIdHRwVXRpbHMuY29ubmVjdChuZXcgVVJMKEFQQUNIRV9TVk5fU0lURSArIFVSTF9PRl9USElTX1RFU1QpKTsKKwkJYXNzZXJ0Tm90U2FtZSgwLCBjb25uLmdldERhdGUoKSk7CisJCVN0cmluZyB1cmxUZXh0ID0gSHR0cFV0aWxzLnJlYWRVcmwoY29ubik7CisJCWFzc2VydFRydWUodXJsVGV4dC5jb250YWlucygicHVibGljIGNsYXNzIFRlc3RIdHRwVXRpbHMgZXh0ZW5kcyBUZXN0Q2FzZSB7IikpOworCQljb25uLmRpc2Nvbm5lY3QoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0b3IoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJVVJMIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODAiKTsKKwkJVVJMIHJlZGlyZWN0ZWRVUkwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKTsKKwkJYXNzZXJ0RmFsc2UoSHR0cFV0aWxzLmNoZWNrRm9yUmVkaXJlY3Rpb24odXJsLCB1cmwpKTsKKwkJYXNzZXJ0VHJ1ZShIdHRwVXRpbHMuY2hlY2tGb3JSZWRpcmVjdGlvbih1cmwsIHJlZGlyZWN0ZWRVUkwpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0WGh0bWxMaW5rUGF0dGVybigpIHsKKwkJLy8gU1VDQ0VTUyBjYXNlcworCQlNYXRjaGVyIG1hdGNoZXIgPSBIdHRwVXRpbHMuWEhUTUxfTElOS19QQVRURVJOLm1hdGNoZXIoIjxhIGhyZWY9XCJodHRwOi8vbG9jYWxob3N0XCI+bG9jYWxob3N0PC9hPiIpOworCQlhc3NlcnRUcnVlKG1hdGNoZXIuZmluZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJcIiIsIG1hdGNoZXIuZ3JvdXAoMSkudHJpbSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0IiwgbWF0Y2hlci5ncm91cCgyKS50cmltKCkpOworCQlhc3NlcnRFcXVhbHMoImxvY2FsaG9zdCIsIG1hdGNoZXIuZ3JvdXAoMykudHJpbSgpKTsKKwkJCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuWEhUTUxfTElOS19QQVRURVJOLm1hdGNoZXIoIjxhIGhyZWY9J2h0dHA6Ly9sb2NhbGhvc3QnPmxvY2FsaG9zdDwvYT4iKTsKKwkJYXNzZXJ0VHJ1ZShtYXRjaGVyLmZpbmQoKSk7CisJCWFzc2VydEVxdWFscygiJyIsIG1hdGNoZXIuZ3JvdXAoMSkudHJpbSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0IiwgbWF0Y2hlci5ncm91cCgyKS50cmltKCkpOworCQlhc3NlcnRFcXVhbHMoImxvY2FsaG9zdCIsIG1hdGNoZXIuZ3JvdXAoMykudHJpbSgpKTsKKwkJCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuWEhUTUxfTElOS19QQVRURVJOLm1hdGNoZXIoIjwgYSBocmVmID0gXCIgaHR0cDovL2xvY2FsaG9zdCBcIiA+ICBsb2NhbGhvc3QgPCAvIGEgPiIpOworCQlhc3NlcnRUcnVlKG1hdGNoZXIuZmluZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJcIiIsIG1hdGNoZXIuZ3JvdXAoMSkudHJpbSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0IiwgbWF0Y2hlci5ncm91cCgyKS50cmltKCkpOworCQlhc3NlcnRFcXVhbHMoImxvY2FsaG9zdCIsIG1hdGNoZXIuZ3JvdXAoMykudHJpbSgpKTsKKwkJCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuWEhUTUxfTElOS19QQVRURVJOLm1hdGNoZXIoIjwgYSBocmVmID0gJyBodHRwOi8vbG9jYWxob3N0ICcgPiAgbG9jYWxob3N0IDwgLyBhID4iKTsKKwkJYXNzZXJ0VHJ1ZShtYXRjaGVyLmZpbmQoKSk7CisJCWFzc2VydEVxdWFscygiJyIsIG1hdGNoZXIuZ3JvdXAoMSkudHJpbSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0IiwgbWF0Y2hlci5ncm91cCgyKS50cmltKCkpOworCQlhc3NlcnRFcXVhbHMoImxvY2FsaG9zdCIsIG1hdGNoZXIuZ3JvdXAoMykudHJpbSgpKTsKKwkJCisJCS8vU2hvdWxkIG5vdCBmaW5kIGNhc2U6IG9wZW4gd2l0aCAiIGVuZCB3aXRoICcKKwkJbWF0Y2hlciA9IEh0dHBVdGlscy5YSFRNTF9MSU5LX1BBVFRFUk4ubWF0Y2hlcigiPGEgaHJlZj1cImh0dHA6Ly9sb2NhbGhvc3RcJz5sb2NhbGhvc3Q8L2E+Iik7CisJCWFzc2VydEZhbHNlKG1hdGNoZXIuZmluZCgpKTsKKwkJCisJCS8vU2hvdWxkIG5vdCBmaW5kIGNhc2U6IG9wZW4gd2l0aCAnIGVuZCB3aXRoICIKKwkJbWF0Y2hlciA9IEh0dHBVdGlscy5YSFRNTF9MSU5LX1BBVFRFUk4ubWF0Y2hlcigiPGEgaHJlZj1cJ2h0dHA6Ly9sb2NhbGhvc3RcIj5sb2NhbGhvc3Q8L2E+Iik7CisJCWFzc2VydEZhbHNlKG1hdGNoZXIuZmluZCgpKTsKKwkJCisJCS8vU2hvdWxkIG5vdCBmaW5kIGNhc2U6IGxhenkgbGluayBwYXR0ZXJuCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuWEhUTUxfTElOS19QQVRURVJOLm1hdGNoZXIoIjxhIGhyZWY9XCJodHRwOi8vbG9jYWxob3N0XCIvPiIpOworCQlhc3NlcnRGYWxzZShtYXRjaGVyLmZpbmQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlua1BhdHRlcm4oKSB7CisJCU1hdGNoZXIgbWF0Y2hlciA9IEh0dHBVdGlscy5MQVpZX0xJTktfUEFUVEVSTi5tYXRjaGVyKCI8YSBocmVmPVwiaHR0cDovL2xvY2FsaG9zdFwiLz4iKTsKKwkJYXNzZXJ0VHJ1ZShtYXRjaGVyLmZpbmQoKSk7CisJCWFzc2VydEVxdWFscygiXCIiLCBtYXRjaGVyLmdyb3VwKDEpLnRyaW0oKSk7CisJCWFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdCIsIG1hdGNoZXIuZ3JvdXAoMikudHJpbSgpKTsKKwkJCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuTEFaWV9MSU5LX1BBVFRFUk4ubWF0Y2hlcigiPGEgaHJlZj0naHR0cDovL2xvY2FsaG9zdCcvPiIpOworCQlhc3NlcnRUcnVlKG1hdGNoZXIuZmluZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCInIiwgbWF0Y2hlci5ncm91cCgxKS50cmltKCkpOworCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QiLCBtYXRjaGVyLmdyb3VwKDIpLnRyaW0oKSk7CisJCQorCQltYXRjaGVyID0gSHR0cFV0aWxzLkxBWllfTElOS19QQVRURVJOLm1hdGNoZXIoIjwgYSBocmVmID0gXCIgaHR0cDovL2xvY2FsaG9zdCBcIiAvID4iKTsKKwkJYXNzZXJ0VHJ1ZShtYXRjaGVyLmZpbmQoKSk7CisJCWFzc2VydEVxdWFscygiXCIiLCBtYXRjaGVyLmdyb3VwKDEpLnRyaW0oKSk7CisJCWFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdCIsIG1hdGNoZXIuZ3JvdXAoMikudHJpbSgpKTsKKwkJCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuTEFaWV9MSU5LX1BBVFRFUk4ubWF0Y2hlcigiPCBhIGhyZWYgPSAnIGh0dHA6Ly9sb2NhbGhvc3QgJyAvID4iKTsKKwkJYXNzZXJ0VHJ1ZShtYXRjaGVyLmZpbmQoKSk7CisJCWFzc2VydEVxdWFscygiJyIsIG1hdGNoZXIuZ3JvdXAoMSkudHJpbSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0IiwgbWF0Y2hlci5ncm91cCgyKS50cmltKCkpOworCQkKKwkJLy9TaG91bGQgbm90IGZpbmQgY2FzZTogb3BlbiB3aXRoICIgZW5kIHdpdGggJworCQltYXRjaGVyID0gSHR0cFV0aWxzLkxBWllfTElOS19QQVRURVJOLm1hdGNoZXIoIjxhIGhyZWY9XCJodHRwOi8vbG9jYWxob3N0XCcvPiIpOworCQlhc3NlcnRGYWxzZShtYXRjaGVyLmZpbmQoKSk7CisJCQorCQkvL1Nob3VsZCBub3QgZmluZCBjYXNlOiBvcGVuIHdpdGggJyBlbmQgd2l0aCAiCisJCW1hdGNoZXIgPSBIdHRwVXRpbHMuTEFaWV9MSU5LX1BBVFRFUk4ubWF0Y2hlcigiPGEgaHJlZj1cJ2h0dHA6Ly9sb2NhbGhvc3RcIi8+Iik7CisJCWFzc2VydEZhbHNlKG1hdGNoZXIuZmluZCgpKTsKKwkJCisJCS8vU2hvdWxkIG5vdCBmaW5kIGNhc2U6IHhodG1sIGxpbmsgcGF0dGVybgorCQltYXRjaGVyID0gSHR0cFV0aWxzLkxBWllfTElOS19QQVRURVJOLm1hdGNoZXIoIjxhIGhyZWY9J2h0dHA6Ly9sb2NhbGhvc3QnPmxvY2FsaG9zdDwvYT4iKTsKKwkJYXNzZXJ0RmFsc2UobWF0Y2hlci5maW5kKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RmluZExpbmtzKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisJCVVSTCB1cmwgPSBuZXcgVVJMKEFQQUNIRV9TVk5fU0lURSArIFBBUkVOVF9VUkxfT0ZfVEhJU19URVNUKTsKKwkJSHR0cEZpbGUgcGFyZW50ID0gbmV3IEh0dHBGaWxlKFBBUkVOVF9VUkxfT0ZfVEhJU19URVNULCB0cnVlLCB1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb25uID0gSHR0cFV0aWxzLmNvbm5lY3QodXJsKTsKKwkJTGlzdDxIdHRwRmlsZT4gaHR0cEZpbGVzID0gSHR0cFV0aWxzLmZpbmRMaW5rcyhwYXJlbnQpOworCQlib29sZWFuIGZvdW5kVGhpc1Rlc3QgPSBmYWxzZTsKKwkJZm9yIChIdHRwRmlsZSBodHRwRmlsZSA6IGh0dHBGaWxlcykgeworCQkJaWYgKGh0dHBGaWxlLmdldE5hbWUoKS5lcXVhbHMoIlRlc3RIdHRwVXRpbHMuamF2YSIpKSB7CisJCQkJZm91bmRUaGlzVGVzdCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShmb3VuZFRoaXNUZXN0KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGlyZWN0b3J5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnRUcnVlKEh0dHBVdGlscy5pc0RpcmVjdG9yeShuZXcgVVJMKEFQQUNIRV9TVk5fU0lURSArIFBBUkVOVF9VUkxfT0ZfVEhJU19URVNUKSwgIiIpKTsKKwkJYXNzZXJ0RmFsc2UoSHR0cFV0aWxzLmlzRGlyZWN0b3J5KG5ldyBVUkwoQVBBQ0hFX1NWTl9TSVRFICsgVVJMX09GX1RISVNfVEVTVCksICIiKSk7CisJCWFzc2VydFRydWUoSHR0cFV0aWxzLmlzRGlyZWN0b3J5KG5ldyBVUkwoQVBBQ0hFX1NWTl9TSVRFKSwgIiIpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2ltYXBzL3BvbS54bWwgYi8wLjEwL3Byb3RvY29sL2ltYXBzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkNzJiNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvaW1hcHMvcG9tLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yIAorCWxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCAKKwlpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gCisJWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgCisJdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiAKKwl0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIAorCWJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgCisJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyAKKwlPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgCisJbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwkJPHJlbGF0aXZlUGF0aD4uLi8uLi9jb3JlL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKwk8L3BhcmVudD4KKwk8YXJ0aWZhY3RJZD5jYXMtcHJvdG9jb2wtaW1hcHM8L2FydGlmYWN0SWQ+CisJPG5hbWU+Q0FTIFByb3RvY29sIElNQVBTIEltcGxlbWVudGF0aW9uPC9uYW1lPgorCTxwcm9maWxlcz4KKwkJPHByb2ZpbGU+CisJCQk8aWQ+YXVkaXQ8L2lkPgorCQkJPGFjdGl2YXRpb24+CisJCQkJPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorCQkJPC9hY3RpdmF0aW9uPgorCQkJPGJ1aWxkPgorCQkJCTxwbHVnaW5zPgorCQkJCQk8cGx1Z2luPgorCQkJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisJCQkJCQk8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGV4Y2x1ZGVzPgorCQkJCQkJCQk8ZXhjbHVkZT4qKi9yZXNvdXJjZXMvZXhhbXBsZXMvKiovKjwvZXhjbHVkZT4KKwkJCQkJCQk8L2V4Y2x1ZGVzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCQkJPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisJCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJCTxnb2FsPmNoZWNrPC9nb2FsPgorCQkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQkJPC9leGVjdXRpb25zPgorCQkJCQk8L3BsdWdpbj4KKwkJCQk8L3BsdWdpbnM+CisJCQk8L2J1aWxkPgorCQk8L3Byb2ZpbGU+CisJPC9wcm9maWxlcz4KKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaW1hcHM8L3RhcmdldFBhdGg+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5pbWFwcy1wcm90b2NvbC1jb25maWcueG1sPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgPC9idWlsZD4KKwk8ZGVwZW5kZW5jaWVzPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhcy1wcm90b2NvbC1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9tYWlsPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS44LjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUudGlrYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRpa2EtcGFyc2VyczwvYXJ0aWZhY3RJZD4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5pY2VncmVlbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmdyZWVubWFpbDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMy4xYjwvdmVyc2lvbj4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLXNpbXBsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4xPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2ltYXBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9pbWFwcy9JbWFwc1Byb3RvY29sLmphdmEgYi8wLjEwL3Byb3RvY29sL2ltYXBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9pbWFwcy9JbWFwc1Byb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzZDJhZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvaW1hcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2ltYXBzL0ltYXBzUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaW1hcHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vSmF2YW1haWwgaW1wb3J0cworaW1wb3J0IGphdmF4Lm1haWwuQWRkcmVzczsKK2ltcG9ydCBqYXZheC5tYWlsLkZsYWdzOworaW1wb3J0IGphdmF4Lm1haWwuRm9sZGVyOworaW1wb3J0IGphdmF4Lm1haWwuSGVhZGVyOworaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnZTsKK2ltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYWlsLk11bHRpcGFydDsKK2ltcG9ydCBqYXZheC5tYWlsLlBhcnQ7CitpbXBvcnQgamF2YXgubWFpbC5TZXNzaW9uOworaW1wb3J0IGphdmF4Lm1haWwuU3RvcmU7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXJFeGNlcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudXRpbC5Qcm90b2NvbEZpbGVGaWx0ZXI7CisKKy8vVElLQSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS50aWthLmV4Y2VwdGlvbi5UaWthRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EucGFyc2VyLmh0bWwuSHRtbFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2Euc2F4LkJvZHlDb250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2Euc2F4LlRleHRDb250ZW50SGFuZGxlcjsKKworLyoqCisgKiBJTUFQIFNlY3VyZSB7QGxpbmsgUHJvdG9jb2x9IGltcGxlbWVudGF0aW9uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW1hcHNQcm90b2NvbCBpbXBsZW1lbnRzIFByb3RvY29sIHsKKworICBzdGF0aWMgU3RvcmUgc3RvcmU7CisKKyAgc3RhdGljIEZvbGRlciBjdXJyZW50Rm9sZGVyOworICAKKyAgc3RhdGljIEZvbGRlciBob21lRm9sZGVyOworICAKKyAgc3RhdGljIGludCBwb3J0ID0gOTkzOworCisgIHN0YXRpYyBTZXNzaW9uIHNlc3Npb247CisKKyAgc3RhdGljIGludCBvcGVuQ2FsbHMgPSAwOworCisgIHN0YXRpYyBpbnQgY29ubmVjdENhbGxzID0gMDsKKyAgCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjZChQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgU3RyaW5nIHJlbW90ZVBhdGggPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGguc3Vic3RyaW5nKDEpOworICAgICAgaWYgKHJlbW90ZVBhdGgudHJpbSgpLmVxdWFscygiIikpCisgICAgICAgIGhvbWVGb2xkZXIgPSBjdXJyZW50Rm9sZGVyID0gc3RvcmUuZ2V0RGVmYXVsdEZvbGRlcigpOworICAgICAgZWxzZSB7CisgICAgICAgIGhvbWVGb2xkZXIgPSBjdXJyZW50Rm9sZGVyID0gc3RvcmUuZ2V0Rm9sZGVyKHJlbW90ZVBhdGgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBjaGFuZ2UgZGlyZWN0b3J5IHRvICciIAorICAgICAgCQkrIGZpbGUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNkUm9vdCgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGNkKG5ldyBQcm90b2NvbEZpbGUoIi8iLCB0cnVlKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNkIHRvIHJvb3QgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKyAgfQorICAKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNkSG9tZSgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGNkKG5ldyBQcm90b2NvbEZpbGUoIiIsIHRydWUpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY2QgdG8gaG9tZSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29ubmVjdChTdHJpbmcgaG9zdCwgQXV0aGVudGljYXRpb24gYXV0aCkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChzdG9yZSA9PSBudWxsKSB7CisgICAgICAgIHN0b3JlID0gKHNlc3Npb24gPSBTZXNzaW9uLmdldEluc3RhbmNlKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpKQorICAgICAgICAgICAgLmdldFN0b3JlKCJpbWFwcyIpOworICAgICAgICBzdG9yZS5jb25uZWN0KGhvc3QsIHBvcnQsIGF1dGguZ2V0VXNlcigpLCBhdXRoLmdldFBhc3MoKSk7CisgICAgICAgIGN1cnJlbnRGb2xkZXIgPSBzdG9yZS5nZXREZWZhdWx0Rm9sZGVyKCk7CisgICAgICB9CisgICAgICB0aGlzLmluY3JlbWVudENvbm5lY3Rpb25zKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNvbm5lY3RlZCB0byBJTUFQUyBzZXJ2ZXIgIiArIGhvc3QKKyAgICAgICAgICArICIgd2l0aCB1c2VybmFtZSAiICsgYXV0aC5nZXRVc2VyKCkgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgIGRlY3JlbWVudENvbm5lY3Rpb25zKCk7CisgICAgaWYgKGNvbm5lY3RDYWxscyA8PSAwKSB7CisgICAgICB0cnkgeworLy8gICAgICAgIGlmICghY3VycmVudEZvbGRlci5pc09wZW4oKSkgeworLy8gICAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgY3VycmVudEZvbGRlci5vcGVuKEZvbGRlci5SRUFEX1dSSVRFKTsKKy8vICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgICAgIHRyeSB7CisvLyAgICAgICAgICAgICAgY3VycmVudEZvbGRlci5vcGVuKEZvbGRlci5SRUFEX09OTFkpOworLy8gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vICAgICAgICBjdXJyZW50Rm9sZGVyLmNsb3NlKHRydWUpOworICAgICAgICBzdG9yZS5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY2xvc2UgY29ubmVjdGlvbiA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBzdG9yZSA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbmNyZW1lbnRDb25uZWN0aW9ucygpIHsKKyAgICBjb25uZWN0Q2FsbHMrKzsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZGVjcmVtZW50Q29ubmVjdGlvbnMoKSB7CisgICAgaWYgKGNvbm5lY3RDYWxscyA+IDApCisgICAgICBjb25uZWN0Q2FsbHMtLTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBnZXQoUHJvdG9jb2xGaWxlIGZyb21GaWxlLCBGaWxlIHRvRmlsZSkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIG9wZW5Gb2xkZXIoY3VycmVudEZvbGRlcik7CisgICAgICBNZXNzYWdlW10gbWVzc2FnZXMgPSBjdXJyZW50Rm9sZGVyLmdldE1lc3NhZ2VzKCk7CisgICAgICBmb3IgKE1lc3NhZ2UgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7CisgICAgICAgIGlmICh0aGlzLmdldE1lc3NhZ2VOYW1lKG1lc3NhZ2UpLmVxdWFscyhmcm9tRmlsZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgd3JpdGVNZXNzYWdlVG9Mb2NhbEZpbGUobWVzc2FnZSwgdG9GaWxlKTsKKyAgICAgICAgICAvLyBtZXNzYWdlLnNldEZsYWcoRmxhZ3MuRmxhZy5ERUxFVEVELCB0cnVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBkb3dubG9hZCAiICsgZnJvbUZpbGUgKyAiIHRvICIKKyAgICAgICAgICArIHRvRmlsZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICB0cnkgeworICAgICAgICBjbG9zZUZvbGRlcihjdXJyZW50Rm9sZGVyKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dChGaWxlIGZyb21GaWxlLCBQcm90b2NvbEZpbGUgdG9GaWxlKSB7CisJICAvL2RvIG5vdGhpbmc7CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCB3cml0ZU1lc3NhZ2VUb0xvY2FsRmlsZShNZXNzYWdlIG1lc3NhZ2UsIEZpbGUgdG9Mb2NhbEZpbGUpCisgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRGVjb2RlckV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAorICAgICAgVGlrYUV4Y2VwdGlvbiB7CisgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odG9Mb2NhbEZpbGUpKTsKKworICAgIHBzLnByaW50KCJGcm9tOiIpOworICAgIEFkZHJlc3NbXSBzZW5kZXJzID0gbWVzc2FnZS5nZXRGcm9tKCk7CisgICAgZm9yIChBZGRyZXNzIGFkZHJlc3MgOiBzZW5kZXJzKQorICAgICAgcHMucHJpbnQoIiAiICsgYWRkcmVzcy50b1N0cmluZygpKTsKKworICAgIHBzLnByaW50KCJcblRvOiIpOworCQlTZXQ8QWRkcmVzcz4gcmVjaXBpZW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0PEFkZHJlc3M+KEFycmF5cy5hc0xpc3QobWVzc2FnZQorCQkJCS5nZXRBbGxSZWNpcGllbnRzKCkpKTsKKyAgICBmb3IgKEFkZHJlc3MgYWRkcmVzcyA6IHJlY2lwaWVudHMpCisgICAgICBwcy5wcmludCgiICIgKyBhZGRyZXNzLnRvU3RyaW5nKCkpOworCisgICAgcHMucHJpbnRsbigiXG5TdWJqZWN0OiAiICsgbWVzc2FnZS5nZXRTdWJqZWN0KCkpOworCisgICAgcHMucHJpbnRsbigiLS0tLS0gfiBNZXNzYWdlIH4gLS0tLS0iKTsKKyAgICBTdHJpbmcgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudEZyb21IVE1MKG1lc3NhZ2UpOworICAgIGlmIChjb250ZW50LmVxdWFscygiIikpCisgICAgICBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50RnJvbVBsYWluVGV4dChtZXNzYWdlKTsKKyAgICBwcy5wcmludGxuKGNvbnRlbnQpOworCisgICAgcHMuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0ZWQoKSB7CisgICAgcmV0dXJuIHN0b3JlLmlzQ29ubmVjdGVkKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAvLyBpZiAoY2hhbmdlZERpcikgeworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaGVkIExTIik7CisgICAgLy8gY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlciA9IG5ldyBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgICBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlciA9IG5ldyBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgICB0cnkgeworICAgICAgb3BlbkZvbGRlcihjdXJyZW50Rm9sZGVyKTsKKyAgICAgIGlmICghY3VycmVudEZvbGRlci5nZXRGdWxsTmFtZSgpLmVxdWFscygKKyAgICAgICAgICBzdG9yZS5nZXREZWZhdWx0Rm9sZGVyKCkuZ2V0RnVsbE5hbWUoKSkpIHsKKyAgICAgICAgTWVzc2FnZVtdIG1lc3NhZ2VzID0gY3VycmVudEZvbGRlci5nZXRNZXNzYWdlcygpOworICAgICAgICBmb3IgKE1lc3NhZ2UgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7CisgICAgICAgICAgY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlci5hZGQobmV3IFByb3RvY29sRmlsZSh0aGlzLnB3ZCgpLmdldFBhdGgoKQorICAgICAgICAgICAgICArICIvIiArIHRoaXMuZ2V0TWVzc2FnZU5hbWUobWVzc2FnZSksIGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIGNoYW5nZWREaXIgPSBmYWxzZTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgaWYgKCFjdXJyZW50Rm9sZGVyLmdldEZ1bGxOYW1lKCkuZXF1YWxzKCIiKSkKKyAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gbHMgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICB0cnkgeworICAgICAgICBjbG9zZUZvbGRlcihjdXJyZW50Rm9sZGVyKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB9CisgICAgfQorICAgIC8vIH0KKyAgICByZXR1cm4gY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlcjsKKyAgfQorCisJcHVibGljIExpc3Q8UHJvdG9jb2xGaWxlPiBscyhQcm90b2NvbEZpbGVGaWx0ZXIgZmlsdGVyKQorCQkJdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlciA9IG5ldyBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgICB0cnkgeworICAgICAgb3BlbkZvbGRlcihjdXJyZW50Rm9sZGVyKTsKKyAgICAgIGlmICghY3VycmVudEZvbGRlci5nZXRGdWxsTmFtZSgpLmVxdWFscygKKyAgICAgICAgICBzdG9yZS5nZXREZWZhdWx0Rm9sZGVyKCkuZ2V0RnVsbE5hbWUoKSkpIHsKKyAgICAgICAgTWVzc2FnZVtdIG1lc3NhZ2VzID0gY3VycmVudEZvbGRlci5nZXRNZXNzYWdlcygpOworICAgICAgICBmb3IgKE1lc3NhZ2UgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7CisgICAgICAgIAlQcm90b2NvbEZpbGUgcEZpbGUgPSBuZXcgUHJvdG9jb2xGaWxlKHRoaXMucHdkKCkuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICsgIi8iICsgdGhpcy5nZXRNZXNzYWdlTmFtZShtZXNzYWdlKSwgZmFsc2UpOworICAgICAgICAJaWYgKGZpbHRlci5hY2NlcHQocEZpbGUpKSB7CisgICAgICAgIAkJY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlci5hZGQocEZpbGUpOworICAgICAgICAJfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlmICghY3VycmVudEZvbGRlci5nZXRGdWxsTmFtZSgpLmVxdWFscygiIikpCisgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxzIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xvc2VGb2xkZXIoY3VycmVudEZvbGRlcik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3VycmVudEZpbGVzRm9yQ3VycmVudEZvbGRlcjsKKwl9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBQcm90b2NvbEZpbGUgcHdkKCkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBwd2QgPSBjdXJyZW50Rm9sZGVyLmdldEZ1bGxOYW1lKCk7CisgICAgICBpZiAoIXB3ZC5lcXVhbHMoIiIpICYmICFwd2Quc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICBwd2QgPSAiLyIgKyBwd2Q7CisgICAgICByZXR1cm4gbmV3IFByb3RvY29sRmlsZShwd2QsIHRydWUpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBwd2QgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2VOYW1lKE1lc3NhZ2UgbXNnKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKKyAgICBFbnVtZXJhdGlvbiBoZWFkZXJzID0gbXNnLmdldEFsbEhlYWRlcnMoKTsKKyAgICB3aGlsZSAoaGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgSGVhZGVyIGhlYWRlciA9IChIZWFkZXIpIGhlYWRlcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgIGlmIChoZWFkZXIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJtZXNzYWdlLWlkIikpIHsKKyAgICAgICAgU3RyaW5nIHN0cmluZ0hlYWRlciA9IGhlYWRlci5nZXRWYWx1ZSgpOworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nSGVhZGVyKTsKKyAgICAgICAgc3RyaW5nSGVhZGVyID0gc3RyaW5nSGVhZGVyLnJlcGxhY2UoIjwiLCAiIik7CisgICAgICAgIHJldHVybiBzdHJpbmdIZWFkZXIuc3Vic3RyaW5nKDAsIHN0cmluZ0hlYWRlci5pbmRleE9mKCJAIikpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRGcm9tUGxhaW5UZXh0KFBhcnQgcCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiwKKyAgICAgIElPRXhjZXB0aW9uLCBEZWNvZGVyRXhjZXB0aW9uIHsKKyAgICBTdHJpbmdCdWZmZXIgY29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgIGlmIChwLmlzTWltZVR5cGUoInRleHQvcGxhaW4iKSkgeworICAgICAgY29udGVudC5hcHBlbmQoKFN0cmluZykgcC5nZXRDb250ZW50KCkpOworICAgIH0gZWxzZSBpZiAocC5pc01pbWVUeXBlKCJtdWx0aXBhcnQvKiIpKSB7CisgICAgICBNdWx0aXBhcnQgbXAgPSAoTXVsdGlwYXJ0KSBwLmdldENvbnRlbnQoKTsKKyAgICAgIGludCBjb3VudCA9IG1wLmdldENvdW50KCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIGNvbnRlbnQuYXBwZW5kKGdldENvbnRlbnRGcm9tUGxhaW5UZXh0KG1wLmdldEJvZHlQYXJ0KGkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE9iamVjdCBvYmogPSBwLmdldENvbnRlbnQoKTsKKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQYXJ0KQorICAgICAgICBjb250ZW50LmFwcGVuZChnZXRDb250ZW50RnJvbVBsYWluVGV4dCgoUGFydCkgcC5nZXRDb250ZW50KCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCIgXFxyXFxuIiwgIiIpLnJlcGxhY2VBbGwoIiBcXG4iLCAiIik7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50RnJvbUhUTUwoUGFydCBwKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLAorICAgICAgSU9FeGNlcHRpb24sIERlY29kZXJFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgVGlrYUV4Y2VwdGlvbiB7CisgICAgU3RyaW5nQnVmZmVyIGNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICBpZiAocC5pc01pbWVUeXBlKCJtdWx0aXBhcnQvKiIpKSB7CisgICAgICBNdWx0aXBhcnQgbXAgPSAoTXVsdGlwYXJ0KSBwLmdldENvbnRlbnQoKTsKKyAgICAgIGludCBjb3VudCA9IG1wLmdldENvdW50KCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIGNvbnRlbnQuYXBwZW5kKGdldENvbnRlbnRGcm9tSFRNTChtcC5nZXRCb2R5UGFydChpKSkpOworICAgIH0gZWxzZSBpZiAocC5pc01pbWVUeXBlKCJ0ZXh0L2h0bWwiKSkgeworICAgICAgSHRtbFBhcnNlciBwYXJzZXIgPSBuZXcgSHRtbFBhcnNlcigpOworICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBUZXh0Q29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXh0Q29udGVudEhhbmRsZXIoCisgICAgICAgICAgbmV3IEJvZHlDb250ZW50SGFuZGxlcigpKTsKKyAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKChTdHJpbmcpIHAuZ2V0Q29udGVudCgpKQorICAgICAgICAgIC5nZXRCeXRlcygpKSwgaGFuZGxlciwgbWV0KTsKKyAgICAgIGNvbnRlbnQuYXBwZW5kKGhhbmRsZXIudG9TdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE9iamVjdCBvYmogPSBwLmdldENvbnRlbnQoKTsKKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQYXJ0KQorICAgICAgICBjb250ZW50LmFwcGVuZChnZXRDb250ZW50RnJvbUhUTUwoKFBhcnQpIHAuZ2V0Q29udGVudCgpKSk7CisgICAgfQorICAgIHJldHVybiBjb250ZW50LnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9wZW5Gb2xkZXIoRm9sZGVyIGZvbGRlcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAoIWZvbGRlci5pc09wZW4oKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZm9sZGVyLm9wZW4oRm9sZGVyLlJFQURfV1JJVEUpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb2xkZXIub3BlbihGb2xkZXIuUkVBRF9PTkxZKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gb3BlbiBmb2xkZXIgOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgb3BlbkNhbGxzKys7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlRm9sZGVyKEZvbGRlciBmb2xkZXIpIHsKKyAgICBpZiAob3BlbkNhbGxzID4gMCkKKyAgICAgIG9wZW5DYWxscy0tOworCisgICAgaWYgKG9wZW5DYWxscyA8PSAwKSB7CisgICAgICB0cnkgeworICAgICAgICBmb2xkZXIuY2xvc2UodHJ1ZSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGUoUHJvdG9jb2xGaWxlIGZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIG9wZW5Gb2xkZXIoY3VycmVudEZvbGRlcik7CisgICAgICBNZXNzYWdlW10gbWVzc2FnZXMgPSBjdXJyZW50Rm9sZGVyLmdldE1lc3NhZ2VzKCk7CisgICAgICBmb3IgKE1lc3NhZ2UgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7CisgICAgICAgIGlmICh0aGlzLmdldE1lc3NhZ2VOYW1lKG1lc3NhZ2UpLmVxdWFscyhmaWxlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICBtZXNzYWdlLnNldEZsYWcoRmxhZ3MuRmxhZy5ERUxFVEVELCB0cnVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlICciICsgZmlsZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgY2xvc2VGb2xkZXIoY3VycmVudEZvbGRlcik7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvaW1hcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL2ltYXBzL0ltYXBzUHJvdG9jb2xGYWN0b3J5LmphdmEgYi8wLjEwL3Byb3RvY29sL2ltYXBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9pbWFwcy9JbWFwc1Byb3RvY29sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL2ltYXBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9pbWFwcy9JbWFwc1Byb3RvY29sRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmltYXBzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBJbWFwc1Byb3RvY29sfXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW1hcHNQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBJbWFwc1Byb3RvY29sIGltYXBzQ2xpZW50OworCisgICAgcHVibGljIEltYXBzUHJvdG9jb2wgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgIGlmICh0aGlzLmltYXBzQ2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB0aGlzLmltYXBzQ2xpZW50ID0gbmV3IEltYXBzUHJvdG9jb2woKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW1hcHNDbGllbnQ7CisgICAgfQorCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiAiaW1hcHMiOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9pbWFwcy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2ltYXBzLXByb3RvY29sLWNvbmZpZy54bWwgYi8wLjEwL3Byb3RvY29sL2ltYXBzL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvaW1hcHMtcHJvdG9jb2wtY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTIwNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9pbWFwcy9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L2ltYXBzLXByb3RvY29sLWNvbmZpZy54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gCisJCisJQXV0aG9yOiBiZm9zdGVyCisJRGVzY3JpcHRpb246IFByb3RvY29sTWFuYWdlciBDb25maWd1cmF0aW9uCisJCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKyAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaW1hcHMuSW1hcHNQcm90b2NvbEZhY3RvcnkiLz4KKwkKKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL2ltYXBzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9pbWFwcy9UZXN0SW1hcHNQcm90b2NvbC5qYXZhIGIvMC4xMC9wcm90b2NvbC9pbWFwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaW1hcHMvVGVzdEltYXBzUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzc1MDFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9pbWFwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvaW1hcHMvVGVzdEltYXBzUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaW1hcHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5hdXRoLkJhc2ljQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworCisvL0dyZWVuTWFpbCBpbXBvcnRzCitpbXBvcnQgY29tLmljZWdyZWVuLmdyZWVubWFpbC51dGlsLkR1bW15U1NMU29ja2V0RmFjdG9yeTsKK2ltcG9ydCBjb20uaWNlZ3JlZW4uZ3JlZW5tYWlsLnV0aWwuR3JlZW5NYWlsOworaW1wb3J0IGNvbS5pY2VncmVlbi5ncmVlbm1haWwudXRpbC5HcmVlbk1haWxVdGlsOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEltYXBzUHJvdG9jb2x9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RJbWFwc1Byb3RvY29sIGV4dGVuZHMgVGVzdENhc2UgeworCisJcHJpdmF0ZSBHcmVlbk1haWwgZ01haWw7CisJcHJpdmF0ZSBJbWFwc1Byb3RvY29sIGltYXBzUHJvdG9jb2w7CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VXAoKSB7CisgIAlTeXN0ZW0uc2V0UHJvcGVydHkoIm1haWwuaW1hcHMuc29ja2V0RmFjdG9yeS5jbGFzcyIsIER1bW15U1NMU29ja2V0RmFjdG9yeS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm1haWwuaW1hcHMuc29ja2V0RmFjdG9yeS5mYWxsYmFjayIsICJmYWxzZSIpOworCQlnTWFpbCA9IG5ldyBHcmVlbk1haWwoKTsKKwkJZ01haWwuc2V0VXNlcigiYmZvc3RlckBnb29nbGUuY29tIiwgInBhc3N3b3JkIik7CisJCWdNYWlsLnN0YXJ0KCk7CisJCUltYXBzUHJvdG9jb2wucG9ydCA9IGdNYWlsLmdldEltYXBzKCkuZ2V0UG9ydCgpOworCQlpbWFwc1Byb3RvY29sID0gbmV3IEltYXBzUHJvdG9jb2woKTsKKwkJdHJ5IHsKKwkJCWltYXBzUHJvdG9jb2wuY29ubmVjdCgibG9jYWxob3N0IiwgbmV3IEJhc2ljQXV0aGVudGljYXRpb24oImJmb3N0ZXJAZ29vZ2xlLmNvbSIsICJwYXNzd29yZCIpKTsKKwkJfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gZSkgeworCQkJZmFpbCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gR3JlZW5NYWlsIElNQVBTIHNlcnZlciA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKDEsIEltYXBzUHJvdG9jb2wuY29ubmVjdENhbGxzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisJCWdNYWlsLnN0b3AoKTsKKwkJdHJ5IHsKKwkJCWltYXBzUHJvdG9jb2wuY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCWFzc2VydEVxdWFscygwLCBJbWFwc1Byb3RvY29sLmNvbm5lY3RDYWxscyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RDREFuZFBXRCgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygiIiwgaW1hcHNQcm90b2NvbC5wd2QoKS5nZXRQYXRoKCkpOworCQlpbWFwc1Byb3RvY29sLmNkKG5ldyBQcm90b2NvbEZpbGUoIklOQk9YIiwgdHJ1ZSkpOworCQlhc3NlcnRFcXVhbHMoIi9JTkJPWCIsIGltYXBzUHJvdG9jb2wucHdkKCkuZ2V0UGF0aCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdExTYW5kR0VUKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUdyZWVuTWFpbFV0aWwuc2VuZFRleHRFbWFpbFNlY3VyZVRlc3QoImJmb3N0ZXJAZ29vZ2xlLmNvbSIsICJ0b21AYnVtc3Rlci5vcmciLCAiVGVzdCBTdWJqZWN0IiwgIlRlc3QgQm9keSIpOworCQlpbWFwc1Byb3RvY29sLmNkKG5ldyBQcm90b2NvbEZpbGUoIklOQk9YIiwgdHJ1ZSkpOworCQlMaXN0PFByb3RvY29sRmlsZT4gZW1haWxzID0gaW1hcHNQcm90b2NvbC5scygpOworCQlhc3NlcnRFcXVhbHMoMSwgZW1haWxzLnNpemUoKSk7CisJCUZpbGUgYm9ndXNGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYm9ndXMiLCAiYm9ndXMiKTsKKwkJRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShib2d1c0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCAiVGVzdEltYXBzUHJvdG9jb2wiKTsKKwkJYm9ndXNGaWxlLmRlbGV0ZSgpOworCQl0bXBEaXIubWtkaXJzKCk7CisJCQorCQlGaWxlIGVtYWlsID0gbmV3IEZpbGUodG1wRGlyLCAidGVzdC1lbWFpbCIpOworCQlpbWFwc1Byb3RvY29sLmdldChlbWFpbHMuZ2V0KDApLCBlbWFpbCk7CisJCVN0cmluZ1tdIHNwbGl0RW1haWwgPSBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyhlbWFpbCwgIlVURi04Iikuc3BsaXQoIlxuIik7CisJCWFzc2VydEVxdWFscygiRnJvbTogdG9tQGJ1bXN0ZXIub3JnIiwgc3BsaXRFbWFpbFswXSk7CisJCWFzc2VydEVxdWFscygiVG86IGJmb3N0ZXJAZ29vZ2xlLmNvbSIsIHNwbGl0RW1haWxbMV0pOworCQlhc3NlcnRFcXVhbHMoIlN1YmplY3Q6IFRlc3QgU3ViamVjdCIsIHNwbGl0RW1haWxbMl0pOworCQkvLyAzIGlzIGRpdmlkZXIgdGV4dCAoaS5lLiAtLS0tLSB+IE1lc3NhZ2UgfiAtLS0tLSkKKwkJYXNzZXJ0RXF1YWxzKCJUZXN0IEJvZHkiLCBzcGxpdEVtYWlsWzRdKTsKKwkJdG1wRGlyLmRlbGV0ZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkJR3JlZW5NYWlsVXRpbC5zZW5kVGV4dEVtYWlsU2VjdXJlVGVzdCgiYmZvc3RlckBnb29nbGUuY29tIiwgInRvbUBidW1zdGVyLm9yZyIsICJUZXN0IFN1YmplY3QiLCAiVGVzdCBCb2R5Iik7CisJCWltYXBzUHJvdG9jb2wuY2QobmV3IFByb3RvY29sRmlsZSgiSU5CT1giLCB0cnVlKSk7CisJCUxpc3Q8UHJvdG9jb2xGaWxlPiBlbWFpbHMgPSBpbWFwc1Byb3RvY29sLmxzKCk7CisJCWFzc2VydEVxdWFscygxLCBlbWFpbHMuc2l6ZSgpKTsKKwkJaW1hcHNQcm90b2NvbC5kZWxldGUoZW1haWxzLmdldCgwKSk7CisJCWVtYWlscyA9IGltYXBzUHJvdG9jb2wubHMoKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVtYWlscy5zaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9wb20ueG1sIGIvMC4xMC9wcm90b2NvbC9zZnRwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxNTkyNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9wb20ueG1sCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IgCisJbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIAorCWluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byAKKwlZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSAKKwl0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIAorCXRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgCisJYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSAKKwlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIAorCU9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyAKKwlsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoPi4uLy4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorCTwvcGFyZW50PgorCTxhcnRpZmFjdElkPmNhcy1wcm90b2NvbC1zZnRwPC9hcnRpZmFjdElkPgorCTxuYW1lPkNBUyBQcm90b2NvbCBTRlRQIEltcGxlbWVudGF0aW9uPC9uYW1lPgorCTxwcm9maWxlcz4KKwkJPHByb2ZpbGU+CisJCQk8aWQ+YXVkaXQ8L2lkPgorCQkJPGFjdGl2YXRpb24+CisJCQkJPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorCQkJPC9hY3RpdmF0aW9uPgorCQkJPGJ1aWxkPgorCQkJCTxwbHVnaW5zPgorCQkJCQk8cGx1Z2luPgorCQkJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisJCQkJCQk8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGV4Y2x1ZGVzPgorCQkJCQkJCQk8ZXhjbHVkZT4qKi9yZXNvdXJjZXMvZXhhbXBsZXMvKiovKjwvZXhjbHVkZT4KKwkJCQkJCQk8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtVW5hcHByb3ZlZExpY2Vuc2VzPjM8L251bVVuYXBwcm92ZWRMaWNlbnNlcz4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJCTxleGVjdXRpb25zPgorCQkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJCTxwaGFzZT52ZXJpZnk8L3BoYXNlPgorCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQk8Z29hbD5jaGVjazwvZ29hbD4KKwkJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQkJCTwvZXhlY3V0aW9ucz4KKwkJCQkJPC9wbHVnaW4+CisJCQkJPC9wbHVnaW5zPgorCQkJPC9idWlsZD4KKwkJPC9wcm9maWxlPgorCTwvcHJvZmlsZXM+CisgICAgICAgIDxidWlsZD4KKwkgICAgPHJlc291cmNlcz4KKwkgICAgICA8cmVzb3VyY2U+CisJCTx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cDwvdGFyZ2V0UGF0aD4KKwkJPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3k8L2RpcmVjdG9yeT4KKwkJPGluY2x1ZGVzPgorCQkgIDxpbmNsdWRlPnNmdHAtcHJvdG9jb2wtY29uZmlnLnhtbDwvaW5jbHVkZT4KKwkJPC9pbmNsdWRlcz4KKwkgICAgICA8L3Jlc291cmNlPgorCSAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPC9idWlsZD4KKwk8ZGVwZW5kZW5jaWVzPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhcy1wcm90b2NvbC1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmpjcmFmdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpzY2g8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4wLjEuNDI8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPnNzaHRvb2xzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ajJzc2gtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjAuMi45PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCSAgPGdyb3VwSWQ+c3NodG9vbHM8L2dyb3VwSWQ+CisJCSAgPGFydGlmYWN0SWQ+ajJzc2gtZGFlbW9uPC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPjAuMi45PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wLjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5taW5hPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWluYS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuOS41PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworCisJPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3NmdHAvSnNjaFNmdHBQcm90b2NvbC5qYXZhIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zZnRwL0pzY2hTZnRwUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgyNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zZnRwL0pzY2hTZnRwUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc2Z0cDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc2Z0cC5hdXRoLkhvc3RLZXlBdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnV0aWwuUHJvdG9jb2xGaWxlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CisKKy8vSlNDSCBpbXBvcnRzCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNoYW5uZWxTZnRwOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZXNzaW9uOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Vc2VySW5mbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIAorICogQW4gaW1wbGVtZW50IG9mIGFuIFNGVFAgcHJvdmlkZXIgYmFzZWQgb24gPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuamNyYWZ0Lm9yZyI+SmNyYWZ0J3M8L2E+IDxhCisgKiBocmVmPSJodHRwOi8vd3d3LmpjcmFmdC5vcmcvanNjaC8iPkpTQ0g8L2E+IGxpYnJhcnkuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSnNjaFNmdHBQcm90b2NvbCBpbXBsZW1lbnRzIFByb3RvY29sIHsKKworICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKKworICBwcml2YXRlIENoYW5uZWxTZnRwIHNmdHBDaGFubmVsOworCisgIHByaXZhdGUgUHJvdG9jb2xGaWxlIGhvbWVEaXI7CisKKyAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CisKKyAgcHVibGljIEpzY2hTZnRwUHJvdG9jb2woKSB7CisgIAl0aGlzKDIyKTsKKyAgfQorIAorICBwdWJsaWMgSnNjaFNmdHBQcm90b2NvbChpbnQgcG9ydCkgeworICAgIHNlc3Npb24gPSBudWxsOworICAgIHNmdHBDaGFubmVsID0gbnVsbDsKKyAgICB0aGlzLnBvcnQgPSBwb3J0OworICB9CisgIAorICBwdWJsaWMgdm9pZCBjZChQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgc2Z0cENoYW5uZWwuY2QoZmlsZS5nZXRQYXRoKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBjZCB0byAiICsgZmlsZSArICIgOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBjZFJvb3QoKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAJY2QobmV3IFByb3RvY29sRmlsZShQcm90b2NvbEZpbGUuU0VQQVJBVE9SLCB0cnVlKSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNkSG9tZSgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgIAljZChob21lRGlyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNvbm5lY3QoU3RyaW5nIGhvc3QsIGZpbmFsIEF1dGhlbnRpY2F0aW9uIGF1dGgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAJaWYgKGF1dGggaW5zdGFuY2VvZiBIb3N0S2V5QXV0aGVudGljYXRpb24pIHsKKyAgICAJCWpzY2guc2V0S25vd25Ib3N0cygoKEhvc3RLZXlBdXRoZW50aWNhdGlvbikgYXV0aCkuZ2V0SG9zdEtleUZpbGUoKSk7ICAgIAkJCisgICAgCX0gZWxzZSB7CisgICAgCQlqc2NoLnNldEtub3duSG9zdHMoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArICIvLnNzaC9rbm93bl9ob3N0cyIpOworICAgIAl9CisgICAgICBzZXNzaW9uID0ganNjaC5nZXRTZXNzaW9uKGF1dGguZ2V0VXNlcigpLCBob3N0LCB0aGlzLnBvcnQpOworICAgICAgc2Vzc2lvbi5zZXRVc2VySW5mbyhuZXcgVXNlckluZm8oKSB7CisJCQkJcHVibGljIFN0cmluZyBnZXRQYXNzcGhyYXNlKCkgeworCQkJCQlyZXR1cm4gKGF1dGggaW5zdGFuY2VvZiBIb3N0S2V5QXV0aGVudGljYXRpb24pID8gKChIb3N0S2V5QXV0aGVudGljYXRpb24pIGF1dGgpCisJCQkJCQkJLmdldFBhc3NwaHJhc2UoKSA6IG51bGw7CisJCQkJfQorCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCQkJCXJldHVybiBhdXRoLmdldFBhc3MoKTsKKwkJCQl9CisJCQkJcHVibGljIGJvb2xlYW4gcHJvbXB0UGFzc3BocmFzZShTdHJpbmcgYXJnMCkgeworCQkJCQlyZXR1cm4gKGF1dGggaW5zdGFuY2VvZiBIb3N0S2V5QXV0aGVudGljYXRpb24gJiYgKChIb3N0S2V5QXV0aGVudGljYXRpb24pIGF1dGgpCisJCQkJCQkJLmdldFBhc3NwaHJhc2UoKSAhPSBudWxsKTsKKwkJCQl9CisJCQkJcHVibGljIGJvb2xlYW4gcHJvbXB0UGFzc3dvcmQoU3RyaW5nIGFyZzApIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXB1YmxpYyBib29sZWFuIHByb21wdFllc05vKFN0cmluZyBhcmcwKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgc2hvd01lc3NhZ2UoU3RyaW5nIGFyZzApIHt9CisgICAgICB9KTsKKyAgICAgIHNlc3Npb24uY29ubmVjdCgpOworICAgICAgc2Z0cENoYW5uZWwgPSAoQ2hhbm5lbFNmdHApIHNlc3Npb24ub3BlbkNoYW5uZWwoInNmdHAiKTsKKyAgICAgIHNmdHBDaGFubmVsLmNvbm5lY3QoKTsKKyAgICAgIGhvbWVEaXIgPSBwd2QoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY29ubmVjdCB0byBob3N0ICIgKyBob3N0ICsgIiA6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgc2Vzc2lvbi5kaXNjb25uZWN0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBnZXQoUHJvdG9jb2xGaWxlIGZyb21GaWxlLCBGaWxlIHRvRmlsZSkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHNmdHBDaGFubmVsLmdldChmcm9tRmlsZS5nZXRQYXRoKCksIHRvRmlsZQorICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRvd25sb2FkICIgKyBmcm9tRmlsZSArICIgOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBwdXQoRmlsZSBmcm9tRmlsZSwgUHJvdG9jb2xGaWxlIHRvRmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKwkgIHRyeSB7CisJCSAgc2Z0cENoYW5uZWwucHV0KGZyb21GaWxlLmdldEFic29sdXRlUGF0aCgpLCB0b0ZpbGUuZ2V0UGF0aCgpKTsKKwkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCSAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gcHV0IGZpbGUgJyIgKyBmcm9tRmlsZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkgIH0KKyAgfQorICAKKyAgcHVibGljIExpc3Q8UHJvdG9jb2xGaWxlPiBscygpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFZlY3RvcjxDaGFubmVsU2Z0cC5Mc0VudHJ5PiBzZnRwRmlsZXMgPSAoVmVjdG9yPENoYW5uZWxTZnRwLkxzRW50cnk+KSBzZnRwQ2hhbm5lbAorICAgICAgICAgIC5scyhzZnRwQ2hhbm5lbC5wd2QoKSk7CisgICAgICBWZWN0b3I8UHJvdG9jb2xGaWxlPiByZXR1cm5GaWxlcyA9IG5ldyBWZWN0b3I8UHJvdG9jb2xGaWxlPigpOworICAgICAgZm9yIChDaGFubmVsU2Z0cC5Mc0VudHJ5IHNmdHBGaWxlIDogc2Z0cEZpbGVzKSB7CisgICAgICAgIFN0cmluZyBwYXRoID0gdGhpcy5wd2QoKS5nZXRQYXRoKCk7CisgICAgICAgIHJldHVybkZpbGVzLmFkZChuZXcgUHJvdG9jb2xGaWxlKHBhdGggKyAiLyIgKyBzZnRwRmlsZS5nZXRGaWxlbmFtZSgpLCBzZnRwRmlsZQorICAgICAgICAgICAgICAgIC5nZXRBdHRycygpLmlzRGlyKCkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR1cm5GaWxlczsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGZpbGUgbGlzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKwlwdWJsaWMgTGlzdDxQcm90b2NvbEZpbGU+IGxzKFByb3RvY29sRmlsZUZpbHRlciBmaWx0ZXIpCisJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBWZWN0b3I8Q2hhbm5lbFNmdHAuTHNFbnRyeT4gc2Z0cEZpbGVzID0gKFZlY3RvcjxDaGFubmVsU2Z0cC5Mc0VudHJ5Pikgc2Z0cENoYW5uZWwKKyAgICAgICAgICAubHMoc2Z0cENoYW5uZWwucHdkKCkpOworICAgICAgVmVjdG9yPFByb3RvY29sRmlsZT4gcmV0dXJuRmlsZXMgPSBuZXcgVmVjdG9yPFByb3RvY29sRmlsZT4oKTsKKyAgICAgIGZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBzZnRwRmlsZSA6IHNmdHBGaWxlcykgeworICAgICAgICBTdHJpbmcgcGF0aCA9IHRoaXMucHdkKCkuZ2V0UGF0aCgpOworICAgICAgICBQcm90b2NvbEZpbGUgcEZpbGUgPSBuZXcgUHJvdG9jb2xGaWxlKHBhdGggKyAiLyIgKyBzZnRwRmlsZS5nZXRGaWxlbmFtZSgpLCBzZnRwRmlsZQorICAgICAgICAgICAgLmdldEF0dHJzKCkuaXNEaXIoKSk7CisgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBGaWxlKSkgeworICAgICAgICAJcmV0dXJuRmlsZXMuYWRkKHBGaWxlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJldHVybkZpbGVzOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZmlsZSBsaXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisJfQorCQorICBwdWJsaWMgUHJvdG9jb2xGaWxlIHB3ZCgpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xGaWxlKHNmdHBDaGFubmVsLnB3ZCgpLCB0cnVlKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gcHdkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ZWQoKSB7CisgICAgcmV0dXJuIHNlc3Npb24uaXNDb25uZWN0ZWQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRlbGV0ZShQcm90b2NvbEZpbGUgZmlsZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgaWYgKGZpbGUuaXNEaXIoKSkgeworICAgICAgICBzZnRwQ2hhbm5lbC5ybWRpcihmaWxlLmdldFBhdGgoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZnRwQ2hhbm5lbC5ybShmaWxlLmdldFBhdGgoKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRvd25sb2FkIGZpbGUgJyIgKyBmaWxlICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKyAgfQorCisgcHVibGljIEpzY2hTZnRwUHJvdG9jb2wgY3JlYXRlSnNjaFNmdHBQcm90b2NvbChpbnQgcG9ydCl7CisgICAgICAgIHJldHVybiBuZXcgSnNjaFNmdHBQcm90b2NvbChwb3J0KTsKKyB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3NmdHAvSnNjaFNmdHBQcm90b2NvbEZhY3RvcnkuamF2YSBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9Kc2NoU2Z0cFByb3RvY29sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3NmdHAvSnNjaFNmdHBQcm90b2NvbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5zZnRwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGYWN0b3J5OworCisvKioKKyAqIENyZWF0ZXMgbmV3IHtAbGluayBKc2NoU2Z0cFByb3RvY29sfXMuCisgKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBKc2NoU2Z0cFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFByb3RvY29sRmFjdG9yeSB7CisKKwlwcml2YXRlIGludCBwb3J0ID0gLTE7CisJCisgIHB1YmxpYyBKc2NoU2Z0cFByb3RvY29sIG5ld0luc3RhbmNlKCkgeworICAJaWYgKHBvcnQgPiAwKSB7CisgIAkJcmV0dXJuIG5ldyBKc2NoU2Z0cFByb3RvY29sKHBvcnQpOworICAJfSBlbHNlIHsKKyAgCQlyZXR1cm4gbmV3IEpzY2hTZnRwUHJvdG9jb2woKTsKKyAgCX0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworICAJcmV0dXJuICJzZnRwIjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgCXRoaXMucG9ydCA9IHBvcnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9hdXRoL0hvc3RLZXlBdXRoZW50aWNhdGlvbi5qYXZhIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zZnRwL2F1dGgvSG9zdEtleUF1dGhlbnRpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NDczNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9hdXRoL0hvc3RLZXlBdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnNmdHAuYXV0aDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQmFzaWNBdXRoZW50aWNhdGlvbjsKKworLyoqCisgKiB7QGxpbmsgQXV0aGVudGljYXRpb259IGltcGxlbWVudGF0aW9uIGFsbG93aW5nIGEgU1NIIGhvc3Qga2V5IGZpbGUgdG8gYmUgc3BlY2lmaWVkLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIEhvc3RLZXlBdXRoZW50aWNhdGlvbiBleHRlbmRzIEJhc2ljQXV0aGVudGljYXRpb24geworCisJcHJpdmF0ZSBTdHJpbmcgaG9zdEtleUZpbGU7CisJcHJpdmF0ZSBTdHJpbmcgcGFzc3BocmFzZTsKKwkKKwlwdWJsaWMgSG9zdEtleUF1dGhlbnRpY2F0aW9uKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcywgU3RyaW5nIGhvc3RLZXlGaWxlKSB7CisJCXRoaXModXNlciwgcGFzcywgaG9zdEtleUZpbGUsIG51bGwpOworCX0KKwkKKwlwdWJsaWMgSG9zdEtleUF1dGhlbnRpY2F0aW9uKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcywgU3RyaW5nIGhvc3RLZXlGaWxlLCBTdHJpbmcgcGFzc3BocmFzZSkgeworCQlzdXBlcih1c2VyLCBwYXNzKTsKKwkJdGhpcy5ob3N0S2V5RmlsZSA9IGhvc3RLZXlGaWxlOworCQl0aGlzLnBhc3NwaHJhc2UgPSBwYXNzcGhyYXNlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdEtleUZpbGUoKSB7CisJCXJldHVybiBob3N0S2V5RmlsZTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRQYXNzcGhyYXNlKCkgeworCQlyZXR1cm4gcGFzc3BocmFzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9zZnRwLXByb3RvY29sLWNvbmZpZy54bWwgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9zZnRwLXByb3RvY29sLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0NGEzZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L3NmdHAtcHJvdG9jb2wtY29uZmlnLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QiPgorCisgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnNmdHAuSnNjaFNmdHBQcm90b2NvbEZhY3RvcnkiLz4KKwkKKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3NmdHAvRHVtbXlBdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb3RvY29sL3NmdHAvRHVtbXlBdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkYThlYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9EdW1teUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5zZnRwOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLy9Tc2hUb29scyBpbXBvcnRzCitpbXBvcnQgY29tLnNzaHRvb2xzLmRhZW1vbi5wbGF0Zm9ybS5OYXRpdmVBdXRoZW50aWNhdGlvblByb3ZpZGVyOworaW1wb3J0IGNvbS5zc2h0b29scy5kYWVtb24ucGxhdGZvcm0uUGFzc3dvcmRDaGFuZ2VFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBwcm92aWRlcyBubyBhdXRoZW50aWNhdGlvbiBhdCBhbGwsIGFuZCBqdXN0IGxldHMKKyAqIGFueWJvZHkgaW4gc28geW91IHNob3VsZCBuZXZlciB1c2UgaXQhCisgKiAKKyAqIEl0IGlzIHJlYWxseSBqdXN0IGZvciB0ZXN0aW5nLgorICovCitwdWJsaWMgY2xhc3MgRHVtbXlBdXRoZW50aWNhdGlvblByb3ZpZGVyIGV4dGVuZHMgTmF0aXZlQXV0aGVudGljYXRpb25Qcm92aWRlciB7CisKKwlMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRHVtbXlBdXRoZW50aWNhdGlvblByb3ZpZGVyLmNsYXNzKTsKKworCXB1YmxpYyBEdW1teUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKSB7CisJCWxvZy5lcnJvcigiRHVtbXlBdXRoZW50aWNhdGlvblByb3ZpZGVyIGlzIGluIHVzZS4gVGhpcyBpcyBvbmx5IGZvciB0ZXN0aW5nLiIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNoYW5nZVBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIG9sZHBhc3N3b3JkLAorCQkJU3RyaW5nIG5ld3Bhc3N3b3JkKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEhvbWVEaXJlY3RvcnkoU3RyaW5nIHVzZXJuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcyIpLmdldEFic29sdXRlUGF0aCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGxvZ29mZlVzZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gbG9nb25Vc2VyKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKQorCQkJdGhyb3dzIFBhc3N3b3JkQ2hhbmdlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGxvZ29uVXNlcihTdHJpbmcgdXNlcm5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9UZXN0SnNjaFNmdHBQcm90b2NvbC5qYXZhIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zZnRwL1Rlc3RKc2NoU2Z0cFByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwN2NlMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9UZXN0SnNjaFNmdHBQcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5zZnRwOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vSkFWQVggaW1wb3J0cworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm1pbmEudXRpbC5BdmFpbGFibGVQb3J0RmluZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuZXhjZXB0aW9ucy5Qcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnNmdHAuYXV0aC5Ib3N0S2V5QXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC51dGlsLlByb3RvY29sRmlsZUZpbHRlcjsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLy9Tc2hUb29scyBpbXBvcnRzCitpbXBvcnQgY29tLnNzaHRvb2xzLmRhZW1vbi5Tc2hEYWVtb247CitpbXBvcnQgY29tLnNzaHRvb2xzLmRhZW1vbi5jb25maWd1cmF0aW9uLlBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uc3NodG9vbHMuZGFlbW9uLmNvbmZpZ3VyYXRpb24uU2VydmVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uc3NodG9vbHMuZGFlbW9uLmNvbmZpZ3VyYXRpb24uWG1sU2VydmVyQ29uZmlndXJhdGlvbkNvbnRleHQ7CitpbXBvcnQgY29tLnNzaHRvb2xzLmoyc3NoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3NodG9vbHMuajJzc2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTG9hZGVyOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLm1vY2tpdG8uKjsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBKc2NoU2Z0cFByb3RvY29sfS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0SnNjaFNmdHBQcm90b2NvbCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXN0YXRpYyBUZXN0WG1sU2VydmVyQ29uZmlndXJhdGlvbkNvbnRleHQgY29udGV4dDsKKyAgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3RKc2NoU2Z0cFByb3RvY29sLmNsYXNzLmdldE5hbWUoKSk7CisgIHN0YXRpYyBUaHJlYWQgdGhyZWFkOworICBGaWxlIHB1YmxpY0tleXNEaXI7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIHRyeSB7CisJICAJcHVibGljS2V5c0RpciA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvcHVibGljS2V5cyIpOworCQkJcHVibGljS2V5c0Rpci5ta2RpcnMoKTsKKwkJCUZpbGVVdGlscy5mb3JjZURlbGV0ZU9uRXhpdChwdWJsaWNLZXlzRGlyKTsKKwkJCUZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2F1dGhvcml6YXRpb24ueG1sIiksIG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvcHVibGljS2V5cy9hdXRob3JpemF0aW9uLnhtbCIpKTsKKwkJCUZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci54bWwiKSwgbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9wdWJsaWNLZXlzL3NlcnZlci54bWwiKSk7CisJCQlGaWxlVXRpbHMuY29weUZpbGUobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9wbGF0Zm9ybS54bWwiKSwgbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9wdWJsaWNLZXlzL3BsYXRmb3JtLnhtbCIpKTsKKwkJCUNvbmZpZ3VyYXRpb25Mb2FkZXIuaW5pdGlhbGl6ZSh0cnVlLCBjb250ZXh0ID0gbmV3IFRlc3RYbWxTZXJ2ZXJDb25maWd1cmF0aW9uQ29udGV4dCgpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoIkZhaWxlZCB0byBpbml0aWFsaXplIHNlcnZlciBjb25maWd1cmF0aW9uIik7CisJCX0KKyAgICAKKwkJKHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCVNzaERhZW1vbi5zdGFydCgpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorICAgIAkKKwkJfSkpLnN0YXJ0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIAlGaWxlVXRpbHMuZm9yY2VEZWxldGUocHVibGljS2V5c0Rpcik7CisJCVNzaERhZW1vbi5zdG9wKCIiKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0Q0RhbmRQV0RhbmRMUygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUHJvdG9jb2xFeGNlcHRpb24geworCQlpbnQgcG9ydCA9IGNvbnRleHQuZ2V0UG9ydCgpOworCQlGaWxlIHB1YktleUZpbGUgPSBjcmVhdGVQdWJLZXlGb3JQb3J0KHBvcnQpOworCQlKc2NoU2Z0cFByb3RvY29sIHNmdHBQcm90b2NvbCA9IHNweShuZXcgSnNjaFNmdHBQcm90b2NvbChwb3J0KSk7CisgICAgICAgIE1vY2tpdG8uZG9BbnN3ZXIobmV3IEFuc3dlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfX0pLndoZW4oc2Z0cFByb3RvY29sKS5jb25uZWN0KCJsb2NhbGhvc3QiLCBuZXcgSG9zdEtleUF1dGhlbnRpY2F0aW9uKCJiZm9zdGVyIiwgIiIsCisgICAgICAgICAgICAgICAgcHViS2V5RmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIHNmdHBQcm90b2NvbC5jb25uZWN0KCJsb2NhbGhvc3QiLCBuZXcgSG9zdEtleUF1dGhlbnRpY2F0aW9uKCJiZm9zdGVyIiwgIiIsCisgICAgICAgICAgICAgICAgcHViS2V5RmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCQlQcm90b2NvbEZpbGUgaG9tZURpciA9IHNmdHBQcm90b2NvbC5wd2QoKTsKKwkJUHJvdG9jb2xGaWxlIHRlc3REaXIgPSBuZXcgUHJvdG9jb2xGaWxlKGhvbWVEaXIsICJzc2hUZXN0RGlyIiwgdHJ1ZSk7CisJCXNmdHBQcm90b2NvbC5jZCh0ZXN0RGlyKTsKKworICAgICAgICBNb2NraXRvLndoZW4oc2Z0cFByb3RvY29sLnB3ZCgpKS50aGVuUmV0dXJuKG5ldyBQcm90b2NvbEZpbGUoaG9tZURpciwgInNzaFRlc3REaXIiLCB0cnVlKSk7CisKKworCQlhc3NlcnRFcXVhbHModGVzdERpciwgc2Z0cFByb3RvY29sLnB3ZCgpKTsKKwkJTGlzdDxQcm90b2NvbEZpbGU+IGxzUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xGaWxlPigKKwkJCQlzZnRwUHJvdG9jb2wubHMobmV3IFByb3RvY29sRmlsZUZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFByb3RvY29sRmlsZSBmaWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJzc2hUZXN0RmlsZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkpOworCQlhc3NlcnRFcXVhbHMoMSwgbHNSZXN1bHRzLnNpemUoKSk7CisJCVByb3RvY29sRmlsZSB0ZXN0RmlsZSA9IGxzUmVzdWx0cy5nZXQoMCk7CisgICAgICAgIFByb3RvY29sRmlsZSB0ZXN0bmV3ID0gbmV3IFByb3RvY29sRmlsZSh0ZXN0RGlyLCAic3NoVGVzdEZpbGUiLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscyhuZXcgUHJvdG9jb2xGaWxlKG51bGwsIHRlc3REaXIuZ2V0UGF0aCgpKyIvc3NoVGVzdEZpbGUiLCBmYWxzZSksIHRlc3RGaWxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R0VUKCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWludCBwb3J0ID0gY29udGV4dC5nZXRQb3J0KCk7CisJCUZpbGUgcHViS2V5RmlsZSA9IGNyZWF0ZVB1YktleUZvclBvcnQocG9ydCk7CisJCS8vSnNjaFNmdHBQcm90b2NvbCBzZnRwUHJvdG9jb2wgPSBuZXcgSnNjaFNmdHBQcm90b2NvbChwb3J0KTsKKyAgICAgICAgSnNjaFNmdHBQcm90b2NvbCBtb2NrYyA9IG1vY2soSnNjaFNmdHBQcm90b2NvbC5jbGFzcyk7CisKKyAgICAgICAgTW9ja2l0by5kb0Fuc3dlcihuZXcgQW5zd2VyKCkgeworICAgICAgICAgICAgCSAgICBwdWJsaWMgT2JqZWN0IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICAJICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAJICAgIH19KS53aGVuKG1vY2tjKS5jb25uZWN0KCJsb2NhbGhvc3QiLCBuZXcgSG9zdEtleUF1dGhlbnRpY2F0aW9uKCJiZm9zdGVyIiwgIiIsCisgICAgICAgICAgICAgICAgcHViS2V5RmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICBtb2NrYy5jb25uZWN0KCJsb2NhbGhvc3QiLCBuZXcgSG9zdEtleUF1dGhlbnRpY2F0aW9uKCJiZm9zdGVyIiwgIiIsCisJCQkJcHViS2V5RmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisKKwkJRmlsZSBib2d1c0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJib2d1cyIsICJib2d1cyIpOworCQlmaW5hbCBGaWxlIHRtcEZpbGUgPSBuZXcgRmlsZShib2d1c0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCAiVGVzdEpzY2hTZnRwUHJvdG9jb2wiKTsKKwkJYm9ndXNGaWxlLmRlbGV0ZSgpOworCQl0bXBGaWxlLm1rZGlycygpOworICAgICAgICBtb2NrYy5jZChuZXcgUHJvdG9jb2xGaWxlKCJzc2hUZXN0RGlyIiwgdHJ1ZSkpOworCQlGaWxlIHRlc3REb3dubG9hZEZpbGUgPSBuZXcgRmlsZSh0bXBGaWxlLCAidGVzdERvd25sb2FkRmlsZSIpOworCisgICAgICAgIE1vY2tpdG8uZG9BbnN3ZXIobmV3IEFuc3dlcigpeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uT25Nb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHRtcEZpbGUrIi90ZXN0RG93bmxvYWRGaWxlIiwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHJlYWRGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvc3NoVGVzdERpci9zc2hUZXN0RmlsZSIpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KS53aGVuKG1vY2tjKS5nZXQobmV3IFByb3RvY29sRmlsZSgic3NoVGVzdEZpbGUiLCBmYWxzZSksIHRlc3REb3dubG9hZEZpbGUpOworCisKKyAgICAgICAgbW9ja2MuZ2V0KG5ldyBQcm90b2NvbEZpbGUoInNzaFRlc3RGaWxlIiwgZmFsc2UpLCB0ZXN0RG93bmxvYWRGaWxlKTsKKworCQlhc3NlcnRUcnVlKEZpbGVVdGlscy5jb250ZW50RXF1YWxzKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvc3NoVGVzdERpci9zc2hUZXN0RmlsZSIpLCB0ZXN0RG93bmxvYWRGaWxlKSk7CisKKwkJRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRtcEZpbGUpOworCX0KKworICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZpbGUoU3RyaW5nIHBhdGgpeworICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmUmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgYnVmZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlciAobmV3IEZpbGVSZWFkZXIocGF0aCkpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHdoaWxlKGxpbmUgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgYnVpbGQuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgIGJ1aWxkLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7CisgICAgICAgICAgICAgICAgbGluZSA9IGJ1ZmZSZWFkZXIucmVhZExpbmUoKTsKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gYnVpbGQudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH1jYXRjaChJT0V4Y2VwdGlvbiBpb2UpeworICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9ZmluYWxseXsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBidWZmUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9Y2F0Y2goSU9FeGNlcHRpb24gaW9lMSl7CisgICAgICAgICAgICAgICAgLy9MZWF2ZSBJdAorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFNlcnZlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBTZXJ2ZXJDb25maWd1cmF0aW9uIHsKKwkJCisJCWludCBjb21tYW5kUG9ydCA9IEF2YWlsYWJsZVBvcnRGaW5kZXIuZ2V0TmV4dEF2YWlsYWJsZSgxMjIyMik7CisJCWludCBwb3J0ID0gQXZhaWxhYmxlUG9ydEZpbmRlci5nZXROZXh0QXZhaWxhYmxlKDIwMjIpOworCisJCXB1YmxpYyBUZXN0U2VydmVyQ29uZmlndXJhdGlvbihJbnB1dFN0cmVhbSBpcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiwKKwkJCQlQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCQlzdXBlcihpcyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBnZXRDb21tYW5kUG9ydCgpIHsKKwkJCXJldHVybiBjb21tYW5kUG9ydDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGdldFBvcnQoKSB7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RYbWxTZXJ2ZXJDb25maWd1cmF0aW9uQ29udGV4dCBleHRlbmRzIFhtbFNlcnZlckNvbmZpZ3VyYXRpb25Db250ZXh0IHsKKworCQlwcml2YXRlIFRlc3RTZXJ2ZXJDb25maWd1cmF0aW9uIHNlcnZlckNvbmZpZzsKKwkJcHJpdmF0ZSBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWc7CisKKwkJcHVibGljIFRlc3RYbWxTZXJ2ZXJDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKKwkJCXN1cGVyKCk7CisJCX0KKworICAJQE92ZXJyaWRlCisgIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAJCXRyeSB7CisgIAkJCXNlcnZlckNvbmZpZyA9IG5ldyBUZXN0U2VydmVyQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uTG9hZGVyLmxvYWRGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvcHVibGljS2V5cy9zZXJ2ZXIueG1sIikpOworICAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgIAkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgCQl9CisgIAkJdHJ5IHsKKyAgICAgICAgcGxhdGZvcm1Db25maWcgPSBuZXcgUGxhdGZvcm1Db25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb25Mb2FkZXIubG9hZEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9wdWJsaWNLZXlzL3BsYXRmb3JtLnhtbCIpKSB7fTsKKyAgCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAJCQl0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgIAkJfQorICAJfQorCisgIAlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyYXRpb25BdmFpbGFibGUoQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikgQ2xhc3MgY2xzKSB7CisgICAgICB0cnkgeworICAgICAgCWdldENvbmZpZ3VyYXRpb24oY2xzKTsKKyAgICAgIAlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAJcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworCQlAT3ZlcnJpZGUKKyAgCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlndXJhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKSBDbGFzcyBjbHMpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgCQlpZiAoU2VydmVyQ29uZmlndXJhdGlvbi5jbGFzcy5lcXVhbHMoY2xzKSkgeworICAJCQlyZXR1cm4gc2VydmVyQ29uZmlnOworICAJCX0gZWxzZSBpZiAoUGxhdGZvcm1Db25maWd1cmF0aW9uLmNsYXNzLmVxdWFscyhjbHMpKSB7CisgIAkJCXJldHVybiBwbGF0Zm9ybUNvbmZpZzsKKyAgCQl9IGVsc2UgeworICAJCQl0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihjbHMuZ2V0TmFtZSgpCisgIAkJCQkJKyAiIGNvbmZpZ3VyYXRpb24gbm90IGF2YWlsYWJsZSIpOworICAJCX0KKyAgCX0KKworCQlwdWJsaWMgaW50IGdldFBvcnQoKSB7CisJCQlyZXR1cm4gc2VydmVyQ29uZmlnLmdldFBvcnQoKTsKKwkJfQorCX0KKworCXByaXZhdGUgRmlsZSBjcmVhdGVQdWJLZXlGb3JQb3J0KGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlQcmludFN0cmVhbSBwcyA9IG51bGw7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUZpbGUgcHVibGljS2V5RmlsZSA9IG5ldyBGaWxlKHB1YmxpY0tleXNEaXIsICJzYW1wbGUtZHNhLnB1YiIpOworCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGUtZHNhLnB1YiIpLmdldEFic29sdXRlRmlsZSgpKSk7CisJCQlwcyA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwdWJsaWNLZXlGaWxlKSk7CisJCQlTdHJpbmcgbmV4dExpbmUgPSBudWxsOworCQkJd2hpbGUgKChuZXh0TGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlwcy5wcmludGxuKG5leHRMaW5lLnJlcGxhY2UoIjIwMjIiLCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpKSk7CisJCQl9CisJCQlyZXR1cm4gcHVibGljS2V5RmlsZTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7IHBzLmNsb3NlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBpbmdvcmUpIHt9CisJCQl0cnkgeyBici5jbG9zZSgpOyB9IGNhdGNoIChFeGNlcHRpb24gaW5nb3JlKSB7fQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zZnRwL1Vuc3VwcG9ydGVkU2hlbGxQcm9jZXNzUHJvdmlkZXIuamF2YSBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9VbnN1cHBvcnRlZFNoZWxsUHJvY2Vzc1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2ZWE0NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9VbnN1cHBvcnRlZFNoZWxsUHJvY2Vzc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnNmdHA7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLy9Tc2hUb29scyBpbXBvcnRzCitpbXBvcnQgY29tLnNzaHRvb2xzLmRhZW1vbi5wbGF0Zm9ybS5OYXRpdmVQcm9jZXNzUHJvdmlkZXI7CitpbXBvcnQgY29tLnNzaHRvb2xzLmoyc3NoLmlvLkR5bmFtaWNCdWZmZXI7CisKKy8qKgorICogVGhpcyBpcyBhIHNoZWxsIHByb3ZpZGVyIHRoYXQgcHJpbnRzIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCB3ZSBkb24ndCBzdXBwb3J0CisgKiBzaGVsbCBhY2Nlc3MsIGFuZCB0aGVuIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVuc3VwcG9ydGVkU2hlbGxQcm9jZXNzUHJvdmlkZXIgZXh0ZW5kcworCQlOYXRpdmVQcm9jZXNzUHJvdmlkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiVGhpcyBzZXJ2ZXIgZG9lcyBub3QgcHJvdmlkZSBzaGVsbCBhY2Nlc3MsIG9ubHkgU0ZUUC4gR29vZGJ5ZS5cbiI7CisKKwlwcml2YXRlIER5bmFtaWNCdWZmZXIgc3RkaW4gPSBuZXcgRHluYW1pY0J1ZmZlcigpOworCXByaXZhdGUgRHluYW1pY0J1ZmZlciBzdGRlcnIgPSBuZXcgRHluYW1pY0J1ZmZlcigpOworCXByaXZhdGUgRHluYW1pY0J1ZmZlciBzdGRvdXQgPSBuZXcgRHluYW1pY0J1ZmZlcigpOworCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gY3JlYXRlUHJvY2VzcyhmaW5hbCBTdHJpbmcgY29tbWFuZCwgZmluYWwgTWFwIGVudmlyb25tZW50KQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGVybWluYWxQcm92aWRlcigpIHsKKwkJcmV0dXJuICJVbnN1cHBvcnRlZFNoZWxsIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBraWxsKCkgeworCQl0cnkgeworCQkJc3RkaW4uZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOworCQkJc3RkaW4uZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCX0KKwkJdHJ5IHsKKwkJCXN0ZG91dC5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CisJCQlzdGRvdXQuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MSkgeworCQl9CisJCXRyeSB7CisJCQlzdGRlcnIuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOworCQkJc3RkZXJyLmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJc3RkaW4uZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoTUVTU0FHRS5nZXRCeXRlcygpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzdGlsbEFjdGl2ZSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBzdGRpbi5nZXRJbnB1dFN0cmVhbSgpLmF2YWlsYWJsZSgpID4gMDsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUHNldWRvVGVybWluYWwoZmluYWwgU3RyaW5nIHRlcm0pIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gYWxsb2NhdGVQc2V1ZG9UZXJtaW5hbChmaW5hbCBTdHJpbmcgdGVybSwgZmluYWwgaW50IGNvbHMsCisJCQlmaW5hbCBpbnQgcm93cywgZmluYWwgaW50IHdpZHRoLCBmaW5hbCBpbnQgaGVpZ2h0LCBmaW5hbCBTdHJpbmcgbW9kZXMpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCB3YWl0Rm9yRXhpdENvZGUoKSB7CisJCXJldHVybiAwOworCX0KKworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBzdGRpbi5nZXRJbnB1dFN0cmVhbSgpOworCX0KKworCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHN0ZG91dC5nZXRPdXRwdXRTdHJlYW0oKTsKKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RkZXJySW5wdXRTdHJlYW0oKSB7CisJCXJldHVybiBzdGRlcnIuZ2V0SW5wdXRTdHJlYW0oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9hdXRoL1Rlc3RIb3N0S2V5QXV0aGVudGljYXRpb24uamF2YSBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvdG9jb2wvc2Z0cC9hdXRoL1Rlc3RIb3N0S2V5QXV0aGVudGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGJiNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm90b2NvbC9zZnRwL2F1dGgvVGVzdEhvc3RLZXlBdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnNmdHAuYXV0aDsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBIb3N0S2V5QXV0aGVudGljYXRpb259LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RIb3N0S2V5QXV0aGVudGljYXRpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFN0YXRlKCkgeworCQlIb3N0S2V5QXV0aGVudGljYXRpb24gYXV0aCA9IG5ldyBIb3N0S2V5QXV0aGVudGljYXRpb24oInVzZXIiLCAicGFzcyIsICJmaWxlIik7CisJCWFzc2VydEVxdWFscygidXNlciIsIGF1dGguZ2V0VXNlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJwYXNzIiwgYXV0aC5nZXRQYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZpbGUiLCBhdXRoLmdldEhvc3RLZXlGaWxlKCkpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9yZXNvdXJjZXMvYXV0aG9yaXphdGlvbi54bWwgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL2F1dGhvcml6YXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDBlNjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL2F1dGhvcml6YXRpb24ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gU3NodG9vbHMgVXNlciBBdXRob3JpemF0aW9uIEZpbGUgLS0+Cis8QXV0aG9yaXplZEtleXM+CisgIDwhLS0gRW50ZXIgYXV0aG9yaXplZCBwdWJsaWMga2V5IGVsZW1lbnRzIGhlcmUgLS0+CisgIDxLZXk+c2FtcGxlLWRzYS5wdWI8L0tleT4KKworPC9BdXRob3JpemVkS2V5cz4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9yZXNvdXJjZXMvcGxhdGZvcm0ueG1sIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9wbGF0Zm9ybS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmOTNhZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9yZXNvdXJjZXMvcGxhdGZvcm0ueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIAorUGxhdGZvcm0gY29uZmlndXJhdGlvbiBmaWxlIC0gRGV0ZXJtaW5lcyB0aGUgYmVoYXZpb3VyIG9mIHBsYXRmb3JtIHNwZWNpZmljIHNlcnZpY2VzCistLT4KKzxQbGF0Zm9ybUNvbmZpZ3VyYXRpb24+CisgICA8IS0tIFRoZSBwcm9jZXNzIHByb3ZpZGVyIGZvciBleGVjdXRpbmcgYW5kIHJlZGlyZWN0aW5nIGEgcHJvY2VzcyAtLT4KKyAgIDxOYXRpdmVQcm9jZXNzUHJvdmlkZXI+b3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5zZnRwLlVuc3VwcG9ydGVkU2hlbGxQcm9jZXNzUHJvdmlkZXI8L05hdGl2ZVByb2Nlc3NQcm92aWRlcj4KKyAgIDwhLS0gVGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGZvciBhdXRoZW50aWNhdGluZyB1c2VycyBhbmQgb2J0YWluaW5nIHVzZXIgaW5mb3JtYXRpb24gLS0+CisgICA8IS0tIAorICAgICAgICAgICAgICAgIFdBUk5JTkc6IHRoZSBkdW1teSBwcm92aWRlciBoZXJlIGRvZXNuJ3QgYXNrIGZvciBhbnkgcGFzc3dvcmRzIHNvIG9idmlvdXNseSBpdCdzCisgICAgICAgICAgICAgICAgZXh0cmVtZWx5IGluc2VjdXJlLiBZb3Ugc2hvdWxkIG9ubHkgdXNlIGl0IGZvciB0ZXN0aW5nLiAKKyAgICAgICAgLS0+CisgICA8TmF0aXZlQXV0aGVudGljYXRpb25Qcm92aWRlcj5vcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLnNmdHAuRHVtbXlBdXRoZW50aWNhdGlvblByb3ZpZGVyPC9OYXRpdmVBdXRoZW50aWNhdGlvblByb3ZpZGVyPgorICAgPCEtLSBUaGUgZmlsZSBzeXN0ZW0gcHJvdmlkZXIgZm9yIFNGVFAgLS0+CisgICA8TmF0aXZlRmlsZVN5c3RlbVByb3ZpZGVyPmNvbS5zc2h0b29scy5kYWVtb24udmZzLlZpcnR1YWxGaWxlU3lzdGVtPC9OYXRpdmVGaWxlU3lzdGVtUHJvdmlkZXI+CisgICA8IS0tIE5hdGl2ZSBzZXR0aW5ncyB3aGljaCBtYXkgYmUgdXNlZCBieSB0aGUgcHJvY2VzcyBvciBhdXRoZW50aWNhdGlvbiBwcm92aWRlciAtLT4KKyAgIDwhLS0gQWRkIG5hdGl2ZSBzZXR0aW5ncyBoZXJlIC0tPgorICAgPCEtLSA8TmF0aXZlU2V0dGluZyBOYW1lPSJBdXRoZW50aWNhdGVPbkRvbWFpbiIgVmFsdWU9Ii4iLz4gLS0+Cis8L1BsYXRmb3JtQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzAuMTAvcHJvdG9jb2wvc2Z0cC9zcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlLWRzYS5rZXkgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZS1kc2Eua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTQ4NTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZS1kc2Eua2V5CkBAIC0wLDAgKzEsMTIgQEAKKy0tLS0tQkVHSU4gRFNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUJ2QUlCQUFLQmdRRC9kdk53R2ZMVXg4aFJYbUpSTi96RXZsclVWZ09QdVlhbzBKUWZjZHd6NFpxaS9rRHEKKys0SS9Hc0dwaHc4di9wSTBnME41akhpaUdRK2FwVm9TT1hvWWdyVzZZTktISXBtQnZNMXpWUVdBMzNiQXFxLysKKytrKzlCdWdwOHh2QUE1QVhVclBkUktRaUtZQzVFQ1lYL2xJRFpDU2d0eTZRclFTbmhtQUVDZG02bVFJVkFPLzEKK1g0bmtMaEw0andoT0dNVW11VFZPUXh3SkFvR0JBTWkvMm1rWmMxQWo3RlFDSnN2L2ovVGg5ZVlMWUoxSmFlRm0KK2lZaGZrZ2dNZm9LeWZXbEVFamxsNTZVVGhaTCtaeUMyV1ZVVVdEdVRydDc3elZQVUd4RUZNMmd3TDlqdWRMYXEKK2xWK3JPRnJ3ZjVMY2FRblNvTkhXcmtmMk1VeStqdWluWkZITi8yZUkrbVFYdjAvMDdJUWpiQ0RBSDBVMXJyOTcKK1F4dzlTYWEzQW9HQVZNT0gxYTZtZVFqNHB6Wlo5QkVrRlZWUUF1QytEQnF4Wk5EMmZseElNbk8vWjlzaTFabncKKzB6MENsWFhZNXZwazFEUUoyRkk2MGF1ZnFZZ2cvMlVoUU5qVHAzN0RLTDZzazRhSzI1d3dYTFdidWFmNmI5QWgKK0lGd1UrZzV4U20wajEyUDQwQXFhTkloTG9DdjJGUFhTSHZuSkRzWnczcjcwM0lUVUIraHdsRXdDRlFDaklyREkKK1lPemdSRmtYSndmWkNLVnBvM0wxSkE9PQorLS0tLS1FTkQgRFNBIFBSSVZBVEUgS0VZLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZS1kc2EucHViIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGUtZHNhLnB1YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTFjOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGUtZHNhLnB1YgpAQCAtMCwwICsxIEBACitbbG9jYWxob3N0XToyMDIyIHNzaC1kc3MgQUFBQUIzTnphQzFrYzNNQUFBQ0JBUDkyODNBWjh0VEh5RkZlWWxFMy9NUytXdFJXQTQrNWhxalFsQjl4M0RQaG1xTCtRT3I3Z2o4YXdhbUhEeS8ra2pTRFEzbU1lS0laRDVxbFdoSTVlaGlDdGJwZzBvY2ltWUc4elhOVkJZRGZkc0Nxci83NlQ3MEc2Q256RzhBRGtCZFNzOTFFcENJcGdMa1FKaGYrVWdOa0pLQzNMcEN0QktlR1lBUUoyYnFaQUFBQUZRRHY5VitKNUM0UytJOElUaGpGSnJrMVRrTWNDUUFBQUlFQXlML2FhUmx6VUNQc1ZBSW15LytQOU9IMTVndGduVWxwNFdhSmlGK1NDQXgrZ3JKOWFVUVNPV1hucFJPRmt2NW5JTFpaVlJSWU81T3UzdnZOVTlRYkVRVXphREF2Mk81MHRxcVZYNnM0V3ZCL2t0eHBDZEtnMGRhdVIvWXhUTDZPNktka1VjMy9aNGo2WkJlL1QvVHNoQ05zSU1BZlJUV3V2M3RESEQxSnByY0FBQUNBVk1PSDFhNm1lUWo0cHpaWjlCRWtGVlZRQXVDK0RCcXhaTkQyZmx4SU1uTy9aOXNpMVpudzB6MENsWFhZNXZwazFEUUoyRkk2MGF1ZnFZZ2cvMlVoUU5qVHAzN0RLTDZzazRhSzI1d3dYTFdidWFmNmI5QWhJRndVK2c1eFNtMGoxMlA0MEFxYU5JaExvQ3YyRlBYU0h2bkpEc1p3M3I3MDNJVFVCK2h3bEV3PQpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9zZXJ2ZXIueG1sIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9zZXJ2ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTA3NjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8U2VydmVyQ29uZmlndXJhdGlvbj4KKyAgICAgICAgPCEtLSB0aGlzIGtleSBuZWVkcyBnZW5lcmF0aW5nIGJ5IHRoZSBwcm92aWRlZCBrZXlnZW4gdG9vbCAtLT4KKyAgICAgICAgPFNlcnZlckhvc3RLZXkgUHJpdmF0ZUtleUZpbGU9InNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGUtZHNhLmtleSIvPgorICAgICAgICA8IS0tICBQb3J0PjIwMjM8L1BvcnQgLS0+CisgICAgICAgIDwhLS0gIFVzZXJDb25maWdEaXJlY3Rvcnk+c3JjL3Rlc3QvcmVzb3VyY2VzPC9Vc2VyQ29uZmlnRGlyZWN0b3J5IC0tPgorICAgICAgICA8IS0tIGFkZCBvdGhlciBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGFzIGRlc2lyZWQgLS0+CisgICAgICAgIDxBbGxvd2VkQXV0aGVudGljYXRpb24+cGFzc3dvcmQ8L0FsbG93ZWRBdXRoZW50aWNhdGlvbj4KKyAgICAgICAgPEFsbG93ZWRBdXRoZW50aWNhdGlvbj5rZXlib2FyZC1pbnRlcmFjdGl2ZTwvQWxsb3dlZEF1dGhlbnRpY2F0aW9uPgorICAgICAgICA8IS0tIFlvdSBjYW4gc3BlY2lmeSBtb3JlIHN1YnN5c3RlbXMsIG9yIGV2ZW4gYSByZXBsYWNlbWVudCBTRlRQIHN1YnN5c3RlbSAtLT4KKyAgICAgICAgPFN1YnN5c3RlbSBOYW1lPSJzZnRwIiBUeXBlPSJjbGFzcyIgUHJvdmlkZXI9ImNvbS5zc2h0b29scy5kYWVtb24uc2Z0cC5TZnRwU3Vic3lzdGVtU2VydmVyIiAvPgorPC9TZXJ2ZXJDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9zc2hUZXN0RGlyL3NzaFRlc3RGaWxlIGIvMC4xMC9wcm90b2NvbC9zZnRwL3NyYy90ZXN0L3Jlc291cmNlcy9zc2hUZXN0RGlyL3NzaFRlc3RGaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTZkNTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Byb3RvY29sL3NmdHAvc3JjL3Rlc3QvcmVzb3VyY2VzL3NzaFRlc3REaXIvc3NoVGVzdEZpbGUKQEAgLTAsMCArMSwxOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGlzIGlzIGEKK3Rlc3QKK0ZpbGUgCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3BvbS54bWwgYi8wLjEwL3B1c2hwdWxsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmZTlkNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvcG9tLnhtbApAQCAtMCwwICsxLDE2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4gCisgIDxhcnRpZmFjdElkPmNhcy1wdXNocHVsbDwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+Q0FTIFB1c2gtUHVsbC1GcmFtZXdvcms8L25hbWU+CisgIDxzY20+CisgICAJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvcHVzaHB1bGw8L2Nvbm5lY3Rpb24+CisgICAJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvcHVzaHB1bGw8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAJPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjEwLXJjMi9wdXNocHVsbDwvdXJsPgorICA8L3NjbT4KKworIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhZW1vbi5EYWVtb25MYXVuY2hlcjwvbWFpbkNsYXNzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+IAorICAgIDwvcGx1Z2lucz4KKyA8L2J1aWxkPgorICA8cHJvZmlsZXM+CisgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+YXVkaXQ8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovcmVzb3VyY2VzL2V4YW1wbGVzLyoqLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcHJvdG9jb2wtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcHJvdG9jb2wtZnRwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcHJvdG9jb2wtaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLXByb3RvY29sLWltYXBzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcHJvdG9jb2wtc2Z0cDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgICAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+eG1scnBjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eG1scnBjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JvPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjg8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MTAuMC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisJPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS45LjU8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisJPC9kZXBlbmRlbmN5PgorCTxkZXBlbmRlbmN5PgorCSAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorCSAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtYWxsPC9hcnRpZmFjdElkPgorCSAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWMxNjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApAQCAtMCwwICsxLDg1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmRpc3Q8L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT4ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9iYXNlRGlyZWN0b3J5PgorICA8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5PgorICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Q0hBTkdFUy50eHQ8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+Ki5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5qc3NlY2FjZXJ0czwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGMvZXhhbXBsZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFTU9WRS5sb2c8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5PC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qLnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc2l0ZS9hcGlkb2NzPC9kaXJlY3Rvcnk+CisgICAgICA8ZmlsdGVyZWQ+ZmFsc2U8L2ZpbHRlcmVkPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxleGNsdWRlcy8+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorICA8ZGVwZW5kZW5jeVNldHM+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgorICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgPHVucGFja09wdGlvbnMvPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgPC9kZXBlbmRlbmN5U2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2Jpbi9wdXNocHVsbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vYmluL3B1c2hwdWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDMyZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2Jpbi9wdXNocHVsbApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vY3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisKK3NldCBMSUJfREVQUworZm9yZWFjaCBmaWxlIChgZmluZCAuLi9saWIvKi5qYXJgKQorICAgICBzZXQgTElCX0RFUFMgPSAiJHtmaWxlfToke0xJQl9ERVBTfSIKK2VuZAorCitzZXRlbnYgUEFUSCAke0pBVkFfSE9NRX0vYmluOiR7Q0FTX1BQX0hPTUV9L2JpbjovdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiAKKworI2V4ZWN1dGlvbiAtLSBkbyBub3Qgc2V0ICJqYXZhLmV4dC5kaXJzIiBiZWNhdXNlIGl0IG1lc3NlcyB1cCBzZWFyY2ggcGF0aCBmb3IgYSBzZnRwIGxpYnJhcnkgCiske0pBVkFfSE9NRX0vYmluL2phdmEgXAorICAgICAtY3AgJHtMSUJfREVQU30gLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlIFwKKyAgICAgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9JHtDQVNfUFBfUkVTT1VSQ0VTfS9qc3NlY2FjZXJ0cyBcCisgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZGFlbW9uLkRhZW1vbkxhdW5jaGVyIFwKKyAgICAgLS1ybWlSZWdpc3RyeVBvcnQgJHtEQUVNT05MQVVOQ0hFUl9QT1JUfSBcCisgICAgIC0tcHJvcGVydGllc0ZpbGUgJHtDQVNfUFBfUkVTT1VSQ0VTfS9wdXNoX3B1bGxfZnJhbWV3b3JrLnByb3BlcnRpZXMgXAorICAgICAtLXJlbW90ZVNwZWNzRmlsZSAke0NBU19QUF9SRVNPVVJDRVN9L2V4YW1wbGVzL1JlbW90ZVNwZWNzRmlsZXMvUmVtb3RlU3BlY3MueG1sIApkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9iaW4vdXJsLWRvd25sb2FkZXIgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2Jpbi91cmwtZG93bmxvYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzcxNzEzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9iaW4vdXJsLWRvd25sb2FkZXIKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisKKyRKQVZBX0hPTUUvYmluL2phdmEgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBcCisgICAgICAgIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9Li4vZXRjL2xvZ2dpbmcucHJvcGVydGllcyBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC5IdHRwUHJvdG9jb2wgXAorICAgICAgICAtLXVybCAkMSBcCisgICAgICAgIC0tZG93bmxvYWRUb0RpciAkMgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0NvbmZpZy5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0NvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjE4MDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvQ29uZmlnLmphdmEKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLkNvbmZpZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLm9iamVjdGZhY3RvcnkuUHVzaFB1bGxPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtLlJlbW90ZUZpbGVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuSW5nZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlByb3BlcnRpZXNVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd2lsbCBwYXJzZSBhIGphdmEgLnByb3BlcnRpZXMgZmlsZSBmb3IgRmlsZVJldHJpZXZhbFN5c3RlbSBzbyB0aGF0CisgKiBpbmZvcm1hdGlvbiBjYW4gYmUgZWFzaWx5IGFjY2Vzc2VkIHRocm91Z2ggZ2V0dGVyIG1ldGhvZHMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWcgaW1wbGVtZW50cyBDb25maWdNZXRLZXlzIHsKKworICAgIHByaXZhdGUgUHJvdG9jb2xJbmZvIHBpOworCisgICAgcHJpdmF0ZSBQYXJzZXJJbmZvIHBhcnNlckluZm87CisKKyAgICBwcml2YXRlIEluZ2VzdGVyIGluZ2VzdGVyOworCisgICAgcHJpdmF0ZSBVUkwgZm1Vcmw7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9kdWN0VHlwZURldGVjdGlvbkZpbGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlVHJhY2tlcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBvbmx5RGVmaW5lZFR5cGVzOworCisgICAgcHJpdmF0ZSBpbnQgcmVjb21tZW5kZWRUaHJlYWRDb3VudDsKKworICAgIHByaXZhdGUgaW50IG1heEZhaWxlZERvd25sb2FkczsKKworICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZU1ldEZpbGU7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0RmlsZUV4dGVuc2lvbjsKKworICAgIHByaXZhdGUgU3RyaW5nW10gbGlzdE9mTWV0YWRhdGFUb091dHB1dDsKKworICAgIHByaXZhdGUgRmlsZSBiYXNlU3RhZ2luZ0FyZWE7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUKKyAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBwYXJzZQorICAgICAqLworICAgIHB1YmxpYyBDb25maWcoKSB7CisgICAgICAgIHBpID0gbmV3IFByb3RvY29sSW5mbygpOworICAgICAgICBwYXJzZXJJbmZvID0gbmV3IFBhcnNlckluZm8oKTsKKyAgICAgICAgdGhpcy5tYXhGYWlsZWREb3dubG9hZHMgPSAxMDsKKyAgICAgICAgdGhpcy5yZWNvbW1lbmRlZFRocmVhZENvdW50ID0gODsKKyAgICAgICAgbGlzdE9mTWV0YWRhdGFUb091dHB1dCA9IG5ldyBTdHJpbmdbXSB7IFJlbW90ZUZpbGVNZXRLZXlzLlBST0RVQ1RfTkFNRSwKKyAgICAgICAgICAgICAgICBSZW1vdGVGaWxlTWV0S2V5cy5SRVRSSUVWRURfRlJPTV9MT0MsCisgICAgICAgICAgICAgICAgUmVtb3RlRmlsZU1ldEtleXMuREFUQV9QUk9WSURFUiwgUmVtb3RlRmlsZU1ldEtleXMuRklMRV9TSVpFLAorICAgICAgICAgICAgICAgIFJlbW90ZUZpbGVNZXRLZXlzLlBST0RVQ1RfVFlQRSB9OworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZVN0YWdpbmdBcmVhID0gbmV3IEZpbGUoIi4vIiArIFNUQUdJTkdfQVJFQV9QUkVGSVggKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyBpKyspOworICAgICAgICB9IHdoaWxlICh0aGlzLmJhc2VTdGFnaW5nQXJlYS5leGlzdHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgYWRkcyBpdHMgcHJvcGVydGllcyB0byBTeXN0ZW0gcHJvcGVydGllcworICAgICAqIAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkQ29uZmlnRmlsZShGaWxlIGNvbmZpZ0ZpbGUpIHRocm93cyBDb25maWdFeGNlcHRpb24geworCisgICAgICAgIC8vIGxvYWQgcHJvcGVydGllcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oY29uZmlnRmlsZSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgcHJvcGVydGllcyBmaWxlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnNlIHByb3BlcnRpZXMgYW5kIHhtbCBmaWxlIHNwZWNpZmllZCBpbiBjb25maWcgZmlsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9hZFByb3BlcnRpZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgZnJvbSBwcm9wZXJ0aWVzIGZpbGUgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbEluZm8oUHJvdG9jb2xJbmZvIHBpKSB7CisgICAgICAgIHRoaXMucGkgPSBwaTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VUcmFja2VyKGJvb2xlYW4gdXNlVHJhY2tlcikgeworICAgICAgICB0aGlzLnVzZVRyYWNrZXIgPSB1c2VUcmFja2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluZ2VzdGVyKEluZ2VzdGVyIGluZ2VzdGVyKSB7CisgICAgICAgIHRoaXMuaW5nZXN0ZXIgPSBpbmdlc3RlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Rm1VcmwoVVJMIGZtVXJsKXsKKyAgICAgICAgdGhpcy5mbVVybCA9IGZtVXJsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlbXBJbmZvRmlsZUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7CisgICAgICAgIHRoaXMubWV0RmlsZUV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWNvbW1lbmRlZFRocmVhZENvdW50KGludCBjb3VudCkgeworICAgICAgICB0aGlzLnJlY29tbWVuZGVkVGhyZWFkQ291bnQgPSBjb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBbGxvd2VkRmFpbGVkRG93bmxvYWRzKGludCBtYXgpIHsKKyAgICAgICAgdGhpcy5tYXhGYWlsZWREb3dubG9hZHMgPSBtYXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T25seURvd25sb2FkRGVmaW5lZFR5cGVzKGJvb2xlYW4gb25seURlZmluZWRUeXBlcykgeworICAgICAgICB0aGlzLm9ubHlEZWZpbmVkVHlwZXMgPSBvbmx5RGVmaW5lZFR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VTdGFnaW5nQXJlYShGaWxlIGJhc2VTdGFnaW5nQXJlYSkgeworICAgICAgICB0aGlzLmJhc2VTdGFnaW5nQXJlYSA9IGJhc2VTdGFnaW5nQXJlYTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VHlwZURldGVjdGlvbkZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgICAgIHRoaXMucHJvZHVjdFR5cGVEZXRlY3Rpb25GaWxlID0gZmlsZVBhdGg7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFdyaXRlTWV0RmlsZShib29sZWFuIHdyaXRlTWV0RmlsZSkgeworICAgIAl0aGlzLndyaXRlTWV0RmlsZSA9IHdyaXRlTWV0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHByb3BlcnRpZXMgd2hpY2ggd2VyZSBhZGRlZCB0byBTeXN0ZW0gcHJvcGVydGllcyBieQorICAgICAqIGxvYWRDb25maWdGaWxlKCkuIFN0b3JlcyBpbmZvIGZvciBhY2Nlc3MgYnkgZ2V0dGVyIG1ldGhvZHMKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIHZvaWQgbG9hZFByb3BlcnRpZXMoKSB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubG9hZEV4dGVybmFsQ29uZmlnRmlsZXMoKTsKKyAgICAgICAgdGhpcy5sb2FkUHJvdG9jb2xUeXBlcygpOworICAgICAgICB0aGlzLmxvYWRQYXJzZXJJbmZvKCk7CisgICAgICAgIHRoaXMubG9hZEluZ2VzdGVyKCk7CisgICAgICAgIHRoaXMubG9hZE1pc2NWYXJpYWJsZXMoKTsKKyAgICAgICAgdGhpcy5sb2FkUHJvZHVjdFR5cGVEZXRlY3Rpb24oKTsKKyAgICAgICAgdGhpcy5sb2FkTWV0YWRhdGFMaXN0VG9PdXRwdXQoKTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRFeHRlcm5hbENvbmZpZ0ZpbGVzKCkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGV4dGVybmFsQ29uZmlncyA9IFByb3BlcnRpZXNVdGlscworICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0aWVzKEVYVEVSTkFMX1BST1BFUlRJRVNfRklMRVMpOworICAgICAgICBmb3IgKFN0cmluZyBleHRlcm5hbENvbmZpZyA6IGV4dGVybmFsQ29uZmlncykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGV4dGVybmFsQ29uZmlnKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBkZWZhdWx0IGNvbmZpZyBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0ZXJuYWxDb25maWcgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbG9hZFByb3RvY29sVHlwZXMoKSB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICJBc3NvY2lhdGluZyBwcm90b2NvbCB0eXBlcyB3aXRoIFByb3RvY29sRmFjdG9yaWVzIC4gLiAuIik7CisgICAgICAgIFN0cmluZ1tdIHByb3RvY29sRmFjdG9yeUluZm9GaWxlcyA9IFByb3BlcnRpZXNVdGlscworICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0aWVzKFBST1RPQ09MX0ZBQ1RPUllfSU5GT19GSUxFUyk7CisgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBwcm90b2NvbEZhY3RvcnlJbmZvRmlsZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGkubG9hZFByb3RvY29sRmFjdG9yeUluZm9Gcm9tRmlsZShuZXcgRmlsZShmaWxlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgUHJvdG9jb2xGYWN0b3J5IGNvbmZpZyBmaWxlICIgKyBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvYWRQYXJzZXJJbmZvKCkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkFzc29jaWF0aW5nIHBhcnNlcnMgd2l0aCBSZXRyaWV2YWxNZXRob2RzIC4gLiAuIik7CisgICAgICAgIFN0cmluZ1tdIHBhcnNlckluZm9GaWxlcyA9IFByb3BlcnRpZXNVdGlscworICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0aWVzKFBBUlNFUl9JTkZPX0ZJTEVTKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IHBhcnNlckluZm9GaWxlcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwYXJzZXJJbmZvLmxvYWRQYXJzZXJJbmZvKG5ldyBGaWxlKGZpbGUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgcGFyc2VyIGluZm8gZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbG9hZEluZ2VzdGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIENvbmZpZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgZm1VcmxTdHIgPSBQcm9wZXJ0aWVzVXRpbHMuZ2V0UHJvcGVydGllcyhJTkdFU1RFUl9GTV9VUkwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE5PX0ZNX1NQRUNJRklFRCB9KVswXTsKKworICAgICAgICAgICAgaWYgKGZtVXJsU3RyLmVxdWFscyhOT19GTV9TUEVDSUZJRUQpKSB7CisgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBmaWxlIG1hbmFnZXIgdXJsIHNwZWNpZmllZDogbm8gaW5nZXN0ZXIgd2lsbCBiZSB1c2VkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBpbmdlc3RlckNsYXNzID0gUHJvcGVydGllc1V0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydGllcyhJTkdFU1RFUl9DTEFTUylbMF07CisgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFUcmFuc2ZlckNsYXNzID0gUHJvcGVydGllc1V0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydGllcyhJTkdFU1RFUl9EQVRBX1RSQU5TRkVSKVswXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2FjaGVGYWN0b3J5Q2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ0FDSEVfRkFDVE9SWV9DTEFTUyk7CisKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDb25maWd1cmluZyBhbmQgYnVpbGRpbmcgaW5nZXN0ZXI6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGluZ2VzdGVyQ2xhc3MgKyAiXTogZGF0YSB0cmFuc2ZlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRyYW5zZmVyQ2xhc3MgKyAiXTogdG8gaW5nZXN0IHRvIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZm1VcmxTdHIgKyAiXSIpOworCisgICAgICAgICAgICAgICAgaWYgKGNhY2hlRmFjdG9yeUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ29uZmlndXJpbmcgSW5nZXN0ZXIgY2FjaGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWNoZUZhY3RvcnlDbGFzcyArICJdIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5pbmdlc3RlciA9IFB1c2hQdWxsT2JqZWN0RmFjdG9yeS5jcmVhdGVJbmdlc3RlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZ2VzdGVyQ2xhc3MsIGNhY2hlRmFjdG9yeUNsYXNzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0aGlzLmZtVXJsID0gc2FmZUdldFVybEZyb21TdHJpbmcoZm1VcmxTdHIpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBJbmdlc3RlciA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvYWRQcm9kdWN0VHlwZURldGVjdGlvbigpIHRocm93cyBDb25maWdFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5wcm9kdWN0VHlwZURldGVjdGlvbkZpbGUgPSBQcm9wZXJ0aWVzVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnRpZXMoVFlQRV9ERVRFQ1RJT05fRklMRSlbMF07CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJMb2FkaW5nIHByb2R1Y3QgdHlwZSBkZXRlY3Rpb24gZmlsZTogIgorICAgICAgICAgICAgICAgICAgICArIHByb2R1Y3RUeXBlRGV0ZWN0aW9uRmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgUHJvZHVjdFR5cGVEZXRlY3Rpb24gZmlsZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVEZXRlY3Rpb25GaWxlICsgIicgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvYWRNZXRhZGF0YUxpc3RUb091dHB1dCgpIHsKKyAgICAgICAgbGlzdE9mTWV0YWRhdGFUb091dHB1dCA9IFByb3BlcnRpZXNVdGlscy5nZXRQcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIE1FVF9MSVNUX1RPX1BSSU5ULCBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlRmlsZU1ldEtleXMuUFJPRFVDVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlRmlsZU1ldEtleXMuUkVUUklFVkVEX0ZST01fTE9DLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlRmlsZU1ldEtleXMuREFUQV9QUk9WSURFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZUZpbGVNZXRLZXlzLkZJTEVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZUZpbGVNZXRLZXlzLlBST0RVQ1RfVFlQRSB9KTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRNaXNjVmFyaWFibGVzKCkgeworICAgICAgICBvbmx5RGVmaW5lZFR5cGVzID0gKFByb3BlcnRpZXNVdGlscy5nZXRQcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIEFMTE9XX09OTFlfREVGSU5FRF9UWVBFUywgbmV3IFN0cmluZ1tdIHsgImZhbHNlIiB9KVswXQorICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpLmVxdWFscygidHJ1ZSIpKTsKKyAgICAgICAgdXNlVHJhY2tlciA9IChQcm9wZXJ0aWVzVXRpbHMuZ2V0UHJvcGVydGllcyhVU0VfVFJBQ0tFUiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiZmFsc2UiIH0pWzBdLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0cnVlIikpOworICAgICAgICB0aGlzLnJlY29tbWVuZGVkVGhyZWFkQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KFByb3BlcnRpZXNVdGlscworICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0aWVzKEZJTEVfUkVUX1NZU1RFTV9SRUNfVEhSRUFEX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIjgiIH0pWzBdKTsKKyAgICAgICAgdGhpcy5tYXhGYWlsZWREb3dubG9hZHMgPSBJbnRlZ2VyLnBhcnNlSW50KFByb3BlcnRpZXNVdGlscworICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0aWVzKEZJTEVfUkVUX1NZU1RFTV9NQVhfQUxMT1dFRF9GQUlMX0RPV05MT0FEUywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICIxMCIgfSlbMF0pOworICAgICAgICBtZXRGaWxlRXh0ZW5zaW9uID0gUHJvcGVydGllc1V0aWxzLmdldFByb3BlcnRpZXMoTUVUX0ZJTEVfRVhULAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJpbmZvLnRtcCIgfSlbMF07CisgICAgICAgIHRoaXMud3JpdGVNZXRGaWxlID0gQm9vbGVhbi5nZXRCb29sZWFuKFdSSVRFX01FVF9GSUxFKTsKKyAgICAgICAgU3RyaW5nIHRpbWVvdXRTdHJpbmcgPSBQcm9wZXJ0aWVzVXRpbHMuZ2V0UHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBQUk9UT0NPTF9USU1FT1VUX01TLCBuZXcgU3RyaW5nW10geyAiNjAwMDAwIiB9KVswXTsKKyAgICAgICAgaWYgKHRpbWVvdXRTdHJpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHRpbWVvdXRTdHJpbmcgPSAiMCI7CisgICAgICAgIHBpLnNldERvd25sb2FkVGltZW91dChMb25nLnBhcnNlTG9uZyh0aW1lb3V0U3RyaW5nKSk7CisgICAgICAgIHBpLnNldFBhZ2VTaXplKEludGVnZXIucGFyc2VJbnQoUHJvcGVydGllc1V0aWxzLmdldFByb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgUFJPVE9DT0xfUEFHRV9TSVpFLCBuZXcgU3RyaW5nW10geyAiOCIgfSlbMF0pKTsKKyAgICAgICAgdGhpcy5iYXNlU3RhZ2luZ0FyZWEgPSBuZXcgRmlsZShQcm9wZXJ0aWVzVXRpbHMuZ2V0UHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBEQVRBX0ZJTEVfQkFTRV9TVEFHSU5HX0FSRUEsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgdGhpcy5iYXNlU3RhZ2luZ0FyZWEuZ2V0UGF0aCgpIH0pWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvdG9jb2xJbmZvIGdldFByb3RvY29sSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGk7CisgICAgfQorCisgICAgcHVibGljIEluZ2VzdGVyIGdldEluZ2VzdGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbmdlc3RlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFVSTCBnZXRGbVVybCgpeworICAgICAgICByZXR1cm4gdGhpcy5mbVVybDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB1c2VUcmFja2VyKCkgeworICAgICAgICByZXR1cm4gdXNlVHJhY2tlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldEZpbGVFeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1ldEZpbGVFeHRlbnNpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0VHlwZURldGVjdGlvbkZpbGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3RUeXBlRGV0ZWN0aW9uRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlY29tbWVuZGVkVGhyZWFkQ291bnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlY29tbWVuZGVkVGhyZWFkQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhGYWlsZWREb3dubG9hZHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1heEZhaWxlZERvd25sb2FkczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbmx5RG93bmxvYWREZWZpbmVkVHlwZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9ubHlEZWZpbmVkVHlwZXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldExpc3RPZk1ldGFkYXRhVG9PdXRwdXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxpc3RPZk1ldGFkYXRhVG9PdXRwdXQ7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlckluZm8gZ2V0UGFyc2VySW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VySW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRCYXNlU3RhZ2luZ0FyZWEoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJhc2VTdGFnaW5nQXJlYTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZ2V0V3JpdGVNZXRGaWxlKCkgeworICAgIAlyZXR1cm4gdGhpcy53cml0ZU1ldEZpbGU7CisgICAgfQorCisgICAgcHVibGljIENvbmZpZyBjbG9uZSgpIHsKKyAgICAgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcoKTsKKyAgICAgICAgY29uZmlnLmJhc2VTdGFnaW5nQXJlYSA9IHRoaXMuYmFzZVN0YWdpbmdBcmVhOworICAgICAgICBjb25maWcuaW5nZXN0ZXIgPSB0aGlzLmluZ2VzdGVyOworICAgICAgICBjb25maWcuZm1VcmwgPSB0aGlzLmZtVXJsOworICAgICAgICBjb25maWcubGlzdE9mTWV0YWRhdGFUb091dHB1dCA9IHRoaXMubGlzdE9mTWV0YWRhdGFUb091dHB1dDsKKyAgICAgICAgY29uZmlnLm1heEZhaWxlZERvd25sb2FkcyA9IHRoaXMubWF4RmFpbGVkRG93bmxvYWRzOworICAgICAgICBjb25maWcubWV0RmlsZUV4dGVuc2lvbiA9IHRoaXMubWV0RmlsZUV4dGVuc2lvbjsKKyAgICAgICAgY29uZmlnLm9ubHlEZWZpbmVkVHlwZXMgPSB0aGlzLm9ubHlEZWZpbmVkVHlwZXM7CisgICAgICAgIGNvbmZpZy5wYXJzZXJJbmZvID0gdGhpcy5wYXJzZXJJbmZvOworICAgICAgICBjb25maWcucGkgPSB0aGlzLnBpOworICAgICAgICBjb25maWcucHJvZHVjdFR5cGVEZXRlY3Rpb25GaWxlID0gdGhpcy5wcm9kdWN0VHlwZURldGVjdGlvbkZpbGU7CisgICAgICAgIGNvbmZpZy5yZWNvbW1lbmRlZFRocmVhZENvdW50ID0gdGhpcy5yZWNvbW1lbmRlZFRocmVhZENvdW50OworICAgICAgICBjb25maWcudXNlVHJhY2tlciA9IHRoaXMudXNlVHJhY2tlcjsKKyAgICAgICAgY29uZmlnLndyaXRlTWV0RmlsZSA9IHRoaXMud3JpdGVNZXRGaWxlOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFVSTCBzYWZlR2V0VXJsRnJvbVN0cmluZyhTdHJpbmcgdXJsU3RyKSB7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cik7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZ2VuZXJhdGUgdXJsIGZyb20gdXJsIHN0cmluZzogWyIKKyAgICAgICAgICAgICAgICAgICAgKyB1cmxTdHIgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1cmw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvQ29uZmlnTWV0S2V5cy5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0NvbmZpZ01ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmUzYTcyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0NvbmZpZ01ldEtleXMuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBNZXQga2V5cyBmb3IgdGhlIFB1c2hQdWxsRnJhbWV3b3JrIHtAbGluayBDb25maWd9CisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ01ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBR0lOR19BUkVBX1BSRUZJWCA9ICJTdGFnaW5nX0FyZWEiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfUFJPUEVSVElFU19GSUxFUyA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5leHRlcm5hbC5wcm9wZXJ0aWVzLmZpbGVzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX0ZBQ1RPUllfSU5GT19GSUxFUyA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5wcm90b2NvbGZhY3RvcnkuaW5mby5maWxlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfSU5GT19GSUxFUyA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5wYXJzZXIuaW5mby5maWxlcyI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5HRVNURVJfQ0xBU1MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdGVyIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkdFU1RFUl9EQVRBX1RSQU5TRkVSID0gIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuZmFjdG9yeSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5HRVNURVJfRk1fVVJMID0gIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51cmwiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0ZNX1NQRUNJRklFRCA9ICJOL0EiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0ZBQ1RPUllfQ0xBU1MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5mYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVURUNUSU9OX0ZJTEUgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcudHlwZS5kZXRlY3Rpb24uZmlsZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRfTElTVF9UT19QUklOVCA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLm1ldGFkYXRhLmxpc3QudG8ucHJpbnQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfT05MWV9ERUZJTkVEX1RZUEVTID0gIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuYWxsb3cub25seS5kZWZpbmVkLnR5cGVzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9UUkFDS0VSID0gIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY3Jhd2xlci51c2UudHJhY2tlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1JFVF9TWVNURU1fUkVDX1RIUkVBRF9DT1VOVCA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGUucmV0cmlldmFsLnN5c3RlbS5yZWNvbW1lbmRlZC50aHJlYWQuY291bnQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9SRVRfU1lTVEVNX01BWF9BTExPV0VEX0ZBSUxfRE9XTkxPQURTID0gIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZS5yZXRyaWV2YWwuc3lzdGVtLm1heC5udW1iZXIuYWxsb3dlZC5mYWlsZWQuZG93bmxvYWRzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVF9GSUxFX0VYVCA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLm1ldC5maWxlLmV4dGVuc2lvbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9USU1FT1VUX01TID0gIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2wudGltZW91dC5taWxsaXNlY29uZHMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfUEFHRV9TSVpFID0gIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2wucGFnZV9zaXplIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfRklMRV9CQVNFX1NUQUdJTkdfQVJFQSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhdGEuZmlsZXMuYmFzZS5zdGFnaW5nLmFyZWEiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfTUVUX0ZJTEUgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC53cml0ZS5tZXQuZmlsZSI7CisgICAgCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvQ29uZmlnUGFyc2VyTWV0S2V5cy5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0NvbmZpZ1BhcnNlck1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODc2ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0NvbmZpZ1BhcnNlck1ldEtleXMuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogTWV0IEtleXMgdXNlZCB3aGVuIHBhcnNpbmcge0BsaW5rIENvbmZpZ30geG1sIGZpbGVzCisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ1BhcnNlck1ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUUklFVkFMX01FVEhPRF9UQUcgPSAicnR2bE1ldGhvZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSID0gImNsYXNzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9UQUcgPSAicGFyc2VyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX1RBRyA9ICJwcm90b2NvbCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFIgPSAidHlwZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9GQUNUT1JZX1RBRyA9ICJwcm90b2NvbEZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfU1BFQ19UQUcgPSAiYWxpYXNTcGVjIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfQVRUUiA9ICJmaWxlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBRU1PTl9UQUcgPSAiZGFlbW9uIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9BVFRSID0gImFjdGl2ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19BVFRSID0gImFsaWFzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9JTkZPX1RBRyA9ICJydW5JbmZvIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUUlVOX0RBVEVUSU1FX0FUVFIgPSAiZmlyc3RSdW5EYXRlVGltZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJJT0RfQVRUUiA9ICJwZXJpb2QiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOT05SRUJPT1RfQVRUUiA9ICJydW5PblJlYm9vdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFNJTE9OX0FUVFIgPSAiZXBzaWxvbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lORk9fVEFHID0gInByb3BJbmZvIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9BVFRSID0gImRpciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZJTEVTX1RBRyA9ICJwcm9wRmlsZXMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHX0VYUF9BVFRSID0gInJlZ0V4cCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfQVRUUiA9ICJwYXJzZXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfSU5GT19UQUcgPSAiZG93bmxvYWRJbmZvIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNSU5HX0NPTlZfQVRUUiA9ICJyZW5hbWluZ0NvbnYiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfQUxJQVNfT1ZFUlJJREVfQVRUUiA9ICJhbGxvd0FsaWFzT3ZlcnJpZGUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fU0VSVkVSX0FUVFIgPSAiZGVsZXRlRnJvbVNlcnZlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZJTEVfVEFHID0gInByb3BGaWxlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQVRUUiA9ICJwYXRoIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX1VTRV9UQUcgPSAiYWZ0ZXJVc2UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX09OX1NVQ0NFU1NfQVRUUiA9ICJkZWxldGVPblN1Y2Nlc3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRU9OX1RPX1NVQ0NFU1NfQVRUUiA9ICJtb3ZlVG9PblN1Y2Nlc3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRU9OX1RPX0ZBSUxfQVRUUiA9ICJtb3ZlVG9PbkZhaWwiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JTkZPX1RBRyA9ICJkYXRhSW5mbyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9FTEVNX0FUVFIgPSAicXVlcnlFbGVtZW50IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUdJTkdfQVJFQV9BVFRSID0gInN0YWdpbmdBcmVhIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9UQUcgPSAic291cmNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1RfQVRUUiA9ICJob3N0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX0FUVFIgPSAibG9naW4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUVfVEFHID0gInVzZXJuYW1lIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RBRyA9ICJwYXNzd29yZCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RfVEVTVF9ESVJfVEFHID0gImNkVGVzdERpciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfQ09OTl9UQUcgPSAibWF4Q29ubiI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9EYWVtb25JbmZvLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvRGFlbW9uSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTIxYTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvRGFlbW9uSW5mby5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGNsYXNzIERhZW1vbkluZm8geworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCB1dGNGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICAgICAgICJ5eXl5LU1NLWRkJ1QnaGg6bW06c3MnWiciKTsKKworICAgIHByaXZhdGUgRGF0ZSBmaXJzdFJ1bkRhdGVUaW1lOworCisgICAgcHJpdmF0ZSBsb25nIHRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzOworCisgICAgcHJpdmF0ZSBsb25nIGVwc2lsb25Jbk1pbGxpc2Vjb25kczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBydW5PblJlYm9vdDsKKworICAgIHByaXZhdGUgUHJvcEZpbGVzSW5mbyBwZmk7CisKKyAgICBwcml2YXRlIERhdGFGaWxlc0luZm8gZGZpOworCisgICAgcHVibGljIERhZW1vbkluZm8oU3RyaW5nIGZpcnN0UnVuRGF0ZVRpbWVTdHJpbmcsIFN0cmluZyBwZXJpb2QsCisgICAgICAgICAgICBTdHJpbmcgZXBzaWxvbiwgYm9vbGVhbiBydW5PblJlYm9vdCwgUHJvcEZpbGVzSW5mbyBwZmksCisgICAgICAgICAgICBEYXRhRmlsZXNJbmZvIGRmaSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5ydW5PblJlYm9vdCA9IHJ1bk9uUmVib290OworICAgICAgICBpZiAoZmlyc3RSdW5EYXRlVGltZVN0cmluZyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgIWZpcnN0UnVuRGF0ZVRpbWVTdHJpbmcuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHRoaXMuZmlyc3RSdW5EYXRlVGltZSA9IHV0Y0Zvcm1hdC5wYXJzZShmaXJzdFJ1bkRhdGVUaW1lU3RyaW5nKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5maXJzdFJ1bkRhdGVUaW1lID0gbmV3IERhdGUoKTsKKyAgICAgICAgaWYgKHBlcmlvZCAhPSBudWxsICYmICFwZXJpb2QuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHRoaXMudGltZUludGVydmFsSW5NaWxsaXNlY29uZHMgPSBMb25nLnBhcnNlTG9uZyhwZXJpb2Quc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAwLCBwZXJpb2QubGVuZ3RoKCkgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgKiB0aGlzLmdldE1pbGxpc2Vjb25kc0luTWV0cmljKChwZXJpb2QuY2hhckF0KHBlcmlvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSAtIDEpICsgIiIpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLnRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gLTE7CisgICAgICAgIGlmIChlcHNpbG9uICE9IG51bGwgJiYgIWVwc2lsb24uZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHRoaXMuZXBzaWxvbkluTWlsbGlzZWNvbmRzID0gTG9uZy5wYXJzZUxvbmcoZXBzaWxvbi5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgZXBzaWxvbi5sZW5ndGgoKSAtIDEpKQorICAgICAgICAgICAgICAgICAgICAqIHRoaXMuZ2V0TWlsbGlzZWNvbmRzSW5NZXRyaWMoKGVwc2lsb24uY2hhckF0KGVwc2lsb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkgLSAxKSArICIiKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5lcHNpbG9uSW5NaWxsaXNlY29uZHMgPSAtMTsKKyAgICAgICAgdGhpcy5wZmkgPSBwZmk7CisgICAgICAgIHRoaXMuZGZpID0gZGZpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZXRNaWxsaXNlY29uZHNJbk1ldHJpYyhTdHJpbmcgc3RyaW5nTWV0cmljKSB7CisgICAgICAgIHN3aXRjaCAoc3RyaW5nTWV0cmljLmNoYXJBdCgwKSkgeworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIHJldHVybiA2MDQ4MDAwMDA7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgcmV0dXJuIDg2NDAwMDAwOworICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIHJldHVybiAzNjAwMDAwOworICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIHJldHVybiA2MDAwMDsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICByZXR1cm4gMTAwMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQcm9wRmlsZXNJbmZvIGdldFByb3BGaWxlc0luZm8oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBmaTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUZpbGVzSW5mbyBnZXREYXRhRmlsZXNJbmZvKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kZmk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZUludGVydmFsSW5NaWxsaXNlY29uZHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEVwc2lsb25Jbk1pbGxpc2Vjb25kcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXBzaWxvbkluTWlsbGlzZWNvbmRzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJ1bk9uUmVib290KCkgeworICAgICAgICByZXR1cm4gdGhpcy5ydW5PblJlYm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRGaXJzdFJ1bkRhdGVUaW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5maXJzdFJ1bkRhdGVUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiLS0tLS0tLS1EYWVtb25JbmZvLS0tLS0tLS1cbiIgKyAiICAgIiArICJGaXJzdCBydW4gZGF0ZS90aW1lOiAiCisgICAgICAgICAgICAgICAgKyB0aGlzLmZpcnN0UnVuRGF0ZVRpbWUgKyAiXG4iICsgIiAgICIKKyAgICAgICAgICAgICAgICArICJQZXJpb2QgaW4gbWlsbGlzZWNvbmRzOiAiICsgdGhpcy50aW1lSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcworICAgICAgICAgICAgICAgICsgIlxuIiArICIgICAiICsgIkVwc2lsb24gaW4gbWlsbGlzZW9uY3M6ICIKKyAgICAgICAgICAgICAgICArIHRoaXMuZXBzaWxvbkluTWlsbGlzZWNvbmRzICsgIlxuIiArICIgICAiICsgIlJ1biBvbiByZWJvb3Q6ICIKKyAgICAgICAgICAgICAgICArIHRoaXMucnVuT25SZWJvb3QgKyAiXG4iICsgdGhpcy5kZmkgKyB0aGlzLnBmaSArICJcbiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL0RhdGFGaWxlc0luZm8uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9EYXRhRmlsZXNJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZmZiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9EYXRhRmlsZXNJbmZvLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZzsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhRmlsZXNJbmZvIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5TWV0YWRhdGFFbGVtZW50TmFtZTsKKworICAgIHByaXZhdGUgRG93bmxvYWRJbmZvIGRpOworCisgICAgcHVibGljIERhdGFGaWxlc0luZm8oU3RyaW5nIHF1ZXJ5TWV0YWRhdGFFbGVtZW50TmFtZSwgRG93bmxvYWRJbmZvIGRpKSB7CisgICAgICAgIHRoaXMucXVlcnlNZXRhZGF0YUVsZW1lbnROYW1lID0gcXVlcnlNZXRhZGF0YUVsZW1lbnROYW1lOworICAgICAgICB0aGlzLmRpID0gZGk7CisgICAgfQorCisgICAgcHVibGljIERvd25sb2FkSW5mbyBnZXREb3dubG9hZEluZm8oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlNZXRhZGF0YUVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5xdWVyeU1ldGFkYXRhRWxlbWVudE5hbWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvRG93bmxvYWRJbmZvLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvRG93bmxvYWRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwODkyNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9Eb3dubG9hZEluZm8uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2wuUmVtb3RlU2l0ZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIERvd25sb2FkSW5mbyB7CisKKyAgICBwcml2YXRlIFJlbW90ZVNpdGUgcmVtb3RlU2l0ZTsKKworICAgIHByaXZhdGUgU3RyaW5nIHJlbmFtaW5nQ29udjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVGcm9tU2VydmVyOworCisgICAgcHJpdmF0ZSBGaWxlIHN0YWdpbmdBcmVhOworCisgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93QWxpYXNPdmVycmlkZTsKKworICAgIHB1YmxpYyBEb3dubG9hZEluZm8oUmVtb3RlU2l0ZSByZW1vdGVTaXRlLCBTdHJpbmcgcmVuYW1pbmdDb252LAorICAgICAgICAgICAgYm9vbGVhbiBkZWxldGVGcm9tU2VydmVyLCBGaWxlIHN0YWdpbmdBcmVhLAorICAgICAgICAgICAgYm9vbGVhbiBhbGxvd0FsaWFzT3ZlcnJpZGUpIHsKKyAgICAgICAgdGhpcy5yZW1vdGVTaXRlID0gcmVtb3RlU2l0ZTsKKyAgICAgICAgdGhpcy5yZW5hbWluZ0NvbnYgPSByZW5hbWluZ0NvbnY7CisgICAgICAgIHRoaXMuZGVsZXRlRnJvbVNlcnZlciA9IGRlbGV0ZUZyb21TZXJ2ZXI7CisgICAgICAgIHRoaXMuc3RhZ2luZ0FyZWEgPSBzdGFnaW5nQXJlYTsKKyAgICAgICAgdGhpcy5hbGxvd0FsaWFzT3ZlcnJpZGUgPSBhbGxvd0FsaWFzT3ZlcnJpZGU7CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVNpdGUgZ2V0UmVtb3RlU2l0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlU2l0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbmFtaW5nQ29udigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVuYW1pbmdDb252OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZUZyb21TZXJ2ZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUZyb21TZXJ2ZXI7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0U3RhZ2luZ0FyZWEoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YWdpbmdBcmVhOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dBbGlhc092ZXJyaWRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hbGxvd0FsaWFzT3ZlcnJpZGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJEYXRhRmlsZUluZm86XG4iICsgIiAgIiArIHRoaXMucmVtb3RlU2l0ZSArICJcbiIgKyAiICAiCisgICAgICAgICAgICAgICAgKyAiUmVuYW1pbmdDb252ZW5zaW9uOiAiICsgdGhpcy5yZW5hbWluZ0NvbnYgKyAiXG4iICsgIiAgIgorICAgICAgICAgICAgICAgICsgIlN0YWdpbmdBcmVhOiAiICsgdGhpcy5nZXRTdGFnaW5nQXJlYSgpLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgKyAiXG4iICsgIiAgIiArICJEZWxldGUgZmlsZXMgZnJvbSBzZXJ2ZXI6ICIKKyAgICAgICAgICAgICAgICArIHRoaXMuZGVsZXRlRnJvbVNlcnZlciArICJcbiIgKyAiICAiCisgICAgICAgICAgICAgICAgKyAiQWxsb3cgYWxpYXMgb3ZlcnJpZGU6ICIgKyB0aGlzLmFsbG93QWxpYXNPdmVycmlkZSArICJcbiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL1BhcnNlckluZm8uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9QYXJzZXJJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwNmJlNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9QYXJzZXJJbmZvLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWc7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuQ29uZmlnRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxtZXRob2QuUmV0cmlldmFsTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VySW5mbyBpbXBsZW1lbnRzIENvbmZpZ1BhcnNlck1ldEtleXN7CisKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcnNlclRvUmV0cmlldmFsTWV0aG9kTWFwOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQYXJzZXJJbmZvLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBQYXJzZXJJbmZvKCkgeworICAgICAgICBwYXJzZXJUb1JldHJpZXZhbE1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRQYXJzZXJJbmZvKEZpbGUgeG1sRmlsZSkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOb2RlTGlzdCBybUxpc3QgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbSh4bWxGaWxlKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKFJFVFJJRVZBTF9NRVRIT0RfVEFHKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm1MaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKworICAgICAgICAgICAgICAgIC8vIGdldCBybSBlbGVtZW50CisgICAgICAgICAgICAgICAgTm9kZSBybU5vZGUgPSBybUxpc3QuaXRlbShpKTsKKworICAgICAgICAgICAgICAgIC8vIGdldCBjbGFzc3BhdGggZm9yIHRoaXMgcm0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcm1DbGFzc3BhdGggPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoRWxlbWVudCkgcm1Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFIpKTsKKworICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgbG9naW4gaW5mbyBmb3IgdGhpcyBzb3VyY2UKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBwYXJzZXJMaXN0ID0gKChFbGVtZW50KSBybU5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoUEFSU0VSX1RBRyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJzZXJMaXN0LmdldExlbmd0aCgpOyBqKyspIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYSBzaW5nbGUgbG9naW4gaW5mbworICAgICAgICAgICAgICAgICAgICBOb2RlIHBhcnNlck5vZGUgPSBwYXJzZXJMaXN0Lml0ZW0oaik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJzZXJDbGFzc3BhdGggPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcygoKEVsZW1lbnQpIHBhcnNlck5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFIpKTsKKworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJBc3NpZ2luZyBwYXJzZXIgJyIgKyBwYXJzZXJDbGFzc3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHdpdGggcmV0cmlldmFsbWV0aG9kICciICsgcm1DbGFzc3BhdGggKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlclRvUmV0cmlldmFsTWV0aG9kTWFwLnB1dChwYXJzZXJDbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1DbGFzc3BhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIFBhcnNlciBpbmZvIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzczxSZXRyaWV2YWxNZXRob2Q+IGdldFJldHJpZXZhbE1ldGhvZChQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIChDbGFzczxSZXRyaWV2YWxNZXRob2Q+KSBDbGFzcworICAgICAgICAgICAgICAgIC5mb3JOYW1lKHRoaXMucGFyc2VyVG9SZXRyaWV2YWxNZXRob2RNYXAuZ2V0KHBhcnNlci5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvUHJvcEZpbGVzSW5mby5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL1Byb3BGaWxlc0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdhYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL1Byb3BGaWxlc0luZm8uamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuUGFyc2VyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5EZXNjcmliZSB5b3VyIGNsYXNzIGhlcmU8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUHJvcEZpbGVzSW5mbyB7CisKKyAgICBwcml2YXRlIEZpbGUgbG9jYWxEaXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlT25TdWNjZXNzOworCisgICAgcHJpdmF0ZSBGaWxlIHN1Y2Nlc3NMb2M7CisKKyAgICBwcml2YXRlIEZpbGUgZmFpbExvYzsKKworICAgIHByaXZhdGUgTGlua2VkTGlzdDxSZWdFeHBBbmRQYXJzZXI+IHBhdHRlcm5zOworCisgICAgcHJpdmF0ZSBIYXNoTWFwPEZpbGUsIFBhcnNlcj4gZmlsZVRvUGFyc2VyTWFwOworCisgICAgcHJpdmF0ZSBEb3dubG9hZEluZm8gZGk7CisKKyAgICBwdWJsaWMgUHJvcEZpbGVzSW5mbyhGaWxlIGxvY2FsRGlyKSB7CisgICAgICAgIHRoaXMubG9jYWxEaXIgPSBsb2NhbERpcjsKKyAgICAgICAgcGF0dGVybnMgPSBuZXcgTGlua2VkTGlzdDxSZWdFeHBBbmRQYXJzZXI+KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG93bmxvYWRJbmZvKERvd25sb2FkSW5mbyBkaSwKKyAgICAgICAgICAgIEhhc2hNYXA8RmlsZSwgUGFyc2VyPiBmaWxlVG9QYXJzZXJNYXApIHsKKyAgICAgICAgdGhpcy5kaSA9IGRpOworICAgICAgICB0aGlzLmZpbGVUb1BhcnNlck1hcCA9IGZpbGVUb1BhcnNlck1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlua2VkTGlzdDxGaWxlPiBnZXREb3dubG9hZEluZm9Qcm9wRmlsZXMoKSB7CisgICAgICAgIExpbmtlZExpc3Q8RmlsZT4gcmV0dXJuTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZpbGU+KCk7CisgICAgICAgIGZvciAoRW50cnk8RmlsZSwgUGFyc2VyPiBlbnRyeSA6IHRoaXMuZmlsZVRvUGFyc2VyTWFwLmVudHJ5U2V0KCkpCisgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIHJldHVybiByZXR1cm5MaXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyVXNlRWZmZWN0cyhGaWxlIHN1Y2Nlc3NMb2MsIEZpbGUgZmFpbExvYykgeworICAgICAgICB0aGlzLnN1Y2Nlc3NMb2MgPSBzdWNjZXNzTG9jOworICAgICAgICB0aGlzLmZhaWxMb2MgPSBmYWlsTG9jOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BGaWxlcyhTdHJpbmcgcmVnRXhwLCBQYXJzZXIgcGFyc2VyKSB7CisgICAgICAgIHBhdHRlcm5zLmFkZChuZXcgUmVnRXhwQW5kUGFyc2VyKHJlZ0V4cCwgcGFyc2VyKSk7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlciBnZXRQYXJzZXJGb3JGaWxlKEZpbGUgcHJvcEZpbGUpIHsKKyAgICAgICAgUGFyc2VyIHBhcnNlciA9IHRoaXMuZmlsZVRvUGFyc2VyTWFwID09IG51bGwgPyBudWxsCisgICAgICAgICAgICAgICAgOiB0aGlzLmZpbGVUb1BhcnNlck1hcC5nZXQocHJvcEZpbGUpOworICAgICAgICBpZiAocGFyc2VyID09IG51bGwpCisgICAgICAgICAgICBwYXJzZXIgPSB0aGlzLmdldFBhcnNlckZvckZpbGVuYW1lKHByb3BGaWxlLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlciBnZXRQYXJzZXJGb3JGaWxlbmFtZShTdHJpbmcgcHJvcEZpbGVuYW1lKSB7CisgICAgICAgIGZvciAoUmVnRXhwQW5kUGFyc2VyIHBhdHRlcm4gOiBwYXR0ZXJucykgeworICAgICAgICAgICAgaWYgKHBhdHRlcm4uaXNBY2NlcHRlZEJ5UGF0dGVybihwcm9wRmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLmdldFBhcnNlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5lZWRzVG9CZURvd25sb2FkZWQoKSB7CisgICAgICAgIHJldHVybiBkaSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBEb3dubG9hZEluZm8gZ2V0RG93bmxvYWRJbmZvKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kaTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRGaW5hbERlc3RpbmF0aW9uKGJvb2xlYW4gc3VjY2VzcykgeworICAgICAgICByZXR1cm4gc3VjY2VzcyA/IHRoaXMuZ2V0T25TdWNjZXNzRGlyKCkgOiB0aGlzLmdldE9uRmFpbERpcigpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldE9uU3VjY2Vzc0RpcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnN1Y2Nlc3NMb2MgPT0gbnVsbCkgPyB0aGlzLmxvY2FsRGlyIDogdGhpcy5zdWNjZXNzTG9jOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldE9uRmFpbERpcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmZhaWxMb2MgPT0gbnVsbCkgPyB0aGlzLmxvY2FsRGlyIDogdGhpcy5mYWlsTG9jOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldExvY2FsRGlyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5sb2NhbERpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxldGVPblN1Y2Nlc3MoYm9vbGVhbiBkZWxldGVPblN1Y2Nlc3MpIHsKKyAgICAgICAgdGhpcy5kZWxldGVPblN1Y2Nlc3MgPSBkZWxldGVPblN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVsZXRlT25TdWNjZXNzKCkgeworICAgICAgcmV0dXJuIGRlbGV0ZU9uU3VjY2VzczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlByb3BGaWxlc0luZm9cbiIgKyAiICAgIiArICJMb2NhbCBkaXJlY3Rvcnk6ICIgKyB0aGlzLmxvY2FsRGlyCisgICAgICAgICAgICAgICAgKyAiXG4iICsgIiAgICIgKyAiUGF0dGVybnM6ICIgKyB0aGlzLnBhdHRlcm5zICsgIlxuIiArICIgICAiCisgICAgICAgICAgICAgICAgKyAiRGVsZXRlIG9uIHN1Y2Nlc3M6ICIgKyB0aGlzLmRlbGV0ZU9uU3VjY2VzcyArICJcbiIgKyAiICAgIgorICAgICAgICAgICAgICAgICsgIk1vdmUgdG8gZGlyZWN0b3J5IG9uIHN1Y2Nlc3M6ICIgKyB0aGlzLnN1Y2Nlc3NMb2MgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiICAgIiArICJNb3ZlIHRvIGRpcmVjdG9yeSBvbiBmYWlsOiAiICsgdGhpcy5mYWlsTG9jICsgIlxuIgorICAgICAgICAgICAgICAgICsgIiAgICIgKyB0aGlzLmRpICsgIlxuIjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJlZ0V4cEFuZFBhcnNlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisKKyAgICAgICAgcHJpdmF0ZSBQYXJzZXIgcGFyc2VyOworCisgICAgICAgIHB1YmxpYyBSZWdFeHBBbmRQYXJzZXIoU3RyaW5nIHBhdHRlcm4sIFBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CisgICAgICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWNjZXB0ZWRCeVBhdHRlcm4oU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gUGF0dGVybi5tYXRjaGVzKHBhdHRlcm4sIGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJzZXIgZ2V0UGFyc2VyKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL1Byb3RvY29sSW5mby5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL1Byb3RvY29sSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NzJkMGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvUHJvdG9jb2xJbmZvLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWc7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLkNvbmZpZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUHJvdG9jb2xJbmZvIGltcGxlbWVudHMgQ29uZmlnUGFyc2VyTWV0S2V5cyB7CisKKyAgICBwcml2YXRlIGxvbmcgdGltZW91dDsKKworICAgIHByaXZhdGUgaW50IHBnU2l6ZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BHX1NJWkUgPSA4OworCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgTGlua2VkTGlzdDxDbGFzczxQcm90b2NvbEZhY3Rvcnk+Pj4gcHJvdG9jb2xDbGFzc1JlZmVyZW5jZTsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUHJvdG9jb2xJbmZvLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBQcm90b2NvbEluZm8oKSB7CisgICAgICAgIHRpbWVvdXQgPSAwOworICAgICAgICBwZ1NpemUgPSBERUZBVUxUX1BHX1NJWkU7CisgICAgICAgIHByb3RvY29sQ2xhc3NSZWZlcmVuY2UgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpbmtlZExpc3Q8Q2xhc3M8UHJvdG9jb2xGYWN0b3J5Pj4+KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFByb3RvY29sRmFjdG9yeUluZm9Gcm9tRmlsZShGaWxlIHByb3RvY29sRmFjdG9yeUluZm8pCisgICAgICAgICAgICB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5vZGVMaXN0IHNvdXJjZUxpc3QgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbShwcm90b2NvbEZhY3RvcnlJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKFBST1RPQ09MX1RBRyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCisgICAgICAgICAgICAgICAgLy8gZ2V0IHNvdXJjZSBlbGVtZW50CisgICAgICAgICAgICAgICAgTm9kZSBzb3VyY2VOb2RlID0gc291cmNlTGlzdC5pdGVtKGkpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IGhvc3Qgb2YgdGhpcyBzb3VyY2UKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoKChFbGVtZW50KSBzb3VyY2VOb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFRZUEVfQVRUUikpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IGFsbCBsb2dpbiBpbmZvIGZvciB0aGlzIHNvdXJjZQorICAgICAgICAgICAgICAgIE5vZGVMaXN0IGxvZ2luTGlzdCA9ICgoRWxlbWVudCkgc291cmNlTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShQUk9UT0NPTF9GQUNUT1JZX1RBRyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2dpbkxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBhIHNpbmdsZSBsb2dpbiBpbmZvCisgICAgICAgICAgICAgICAgICAgIE5vZGUgbG9naW5Ob2RlID0gbG9naW5MaXN0Lml0ZW0oaik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbEZhY3RvcnlDbGFzcyA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoRWxlbWVudCkgbG9naW5Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDbGFzc0ZvclR5cGUodHlwZSwgcHJvdG9jb2xGYWN0b3J5Q2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9hZCBQcm90b2NvbEZhY3RvcnkgaW5mbyBmb3IgcHJvdG9jb2wgdHlwZXMgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0ZvclR5cGUoU3RyaW5nIHR5cGUsCisgICAgICAgICAgICBDbGFzczxQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeUNsYXNzKSB7CisgICAgICAgIExpbmtlZExpc3Q8Q2xhc3M8UHJvdG9jb2xGYWN0b3J5Pj4gcHJvdG9jb2xDbGFzc2VzOworICAgICAgICBpZiAoKHByb3RvY29sQ2xhc3NlcyA9IHByb3RvY29sQ2xhc3NSZWZlcmVuY2UuZ2V0KHR5cGUpKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm90b2NvbENsYXNzZXMgPSBuZXcgTGlua2VkTGlzdDxDbGFzczxQcm90b2NvbEZhY3Rvcnk+PigpOworICAgICAgICAgICAgcHJvdG9jb2xDbGFzc1JlZmVyZW5jZS5wdXQodHlwZS50b0xvd2VyQ2FzZSgpLCBwcm90b2NvbENsYXNzZXMpOworICAgICAgICB9CisgICAgICAgIHByb3RvY29sQ2xhc3Nlcy5hZGQocHJvdG9jb2xGYWN0b3J5Q2xhc3MpOworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJBc3NpZ2luZyBwcm90b2NvbCAnIiArIHR5cGUudG9Mb3dlckNhc2UoKQorICAgICAgICAgICAgICAgICsgIicgd2l0aCBjbGFzcyAnIiArIHByb3RvY29sRmFjdG9yeUNsYXNzICsgIiciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0ZvclR5cGUoU3RyaW5nIHR5cGUsIFN0cmluZyBwcm90b2NvbEZhY3RvcnlDbGFzcykKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5hZGRDbGFzc0ZvclR5cGUodHlwZSwgKENsYXNzPFByb3RvY29sRmFjdG9yeT4pIENsYXNzCisgICAgICAgICAgICAgICAgLmZvck5hbWUocHJvdG9jb2xGYWN0b3J5Q2xhc3MpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0ZvclR5cGUoU3RyaW5nIHR5cGUsCisgICAgICAgICAgICBDbGFzczxQcm90b2NvbEZhY3Rvcnk+W10gcHJvdG9jb2xGYWN0b3J5Q2xhc3NlcykgeworICAgICAgICBmb3IgKENsYXNzPFByb3RvY29sRmFjdG9yeT4gY2xhenogOiBwcm90b2NvbEZhY3RvcnlDbGFzc2VzKSB7CisgICAgICAgICAgICB0aGlzLmFkZENsYXNzRm9yVHlwZSh0eXBlLCBjbGF6eik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0ZvclR5cGUoU3RyaW5nIHR5cGUsIFN0cmluZ1tdIHByb3RvY29sRmFjdG9yeUNsYXNzZXMpCisgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGNsYXp6IDogcHJvdG9jb2xGYWN0b3J5Q2xhc3NlcykgeworICAgICAgICAgICAgdGhpcy5hZGRDbGFzc0ZvclR5cGUodHlwZSwgKENsYXNzPFByb3RvY29sRmFjdG9yeT4pIENsYXNzCisgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKGNsYXp6KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFnZVNpemUoaW50IHBnU2l6ZSkgeworICAgICAgICBpZiAocGdTaXplICE9IC0xKQorICAgICAgICAgICAgdGhpcy5wZ1NpemUgPSBwZ1NpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMucGdTaXplID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgfQorCisgICAgcHVibGljIExpbmtlZExpc3Q8Q2xhc3M8UHJvdG9jb2xGYWN0b3J5Pj4gZ2V0UHJvdG9jb2xDbGFzc2VzRm9yUHJvdG9jb2xUeXBlKAorICAgICAgICAgICAgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHByb3RvY29sQ2xhc3NSZWZlcmVuY2UuZ2V0KHR5cGUudG9Mb3dlckNhc2UoKSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RG93bmxvYWRUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gdGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhZ2VTaXplKCkgeworICAgICAgICByZXR1cm4gcGdTaXplOworICAgIH0KKworICAgIHB1YmxpYyBQcm90b2NvbEluZm8gY2xvbmUoKSB7CisgICAgICAgIFByb3RvY29sSW5mbyBwaSA9IG5ldyBQcm90b2NvbEluZm8oKTsKKyAgICAgICAgcGkucHJvdG9jb2xDbGFzc1JlZmVyZW5jZSA9IHRoaXMucHJvdG9jb2xDbGFzc1JlZmVyZW5jZTsKKyAgICAgICAgcGkudGltZW91dCA9IHRoaXMudGltZW91dDsKKyAgICAgICAgcGkucGdTaXplID0gdGhpcy5wZ1NpemU7CisgICAgICAgIHJldHVybiBwaTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvUmVtb3RlU3BlY3MuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9SZW1vdGVTcGVjcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDVmMGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9jb25maWcvUmVtb3RlU3BlY3MuamF2YQpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5Db25maWdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucmVuYW1pbmdjb252ZW50aW9ucy5SZW5hbWluZ0NvbnZlbnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5vYmplY3RmYWN0b3J5LlB1c2hQdWxsT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvL0RPTSBpbXBvcnRzCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworCisvKioKKyAqIFJlbW90ZSBTaXRlIENyYXdsaW5nIHNwZWNpZmljYXRpb25zLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlU3BlY3MgaW1wbGVtZW50cyBDb25maWdQYXJzZXJNZXRLZXlzIHsKKworICAgIExpbmtlZExpc3Q8UGFyc2VyPiBwYXJzZXJzOworCisgICAgTGlua2VkTGlzdDxSZW5hbWluZ0NvbnZlbnRpb24+IHJlbmFtaW5nQ29udnM7CisKKyAgICBMaW5rZWRMaXN0PERhZW1vbkluZm8+IGRhZW1vbkluZm9MaXN0OworCisgICAgU2l0ZUluZm8gc2l0ZUluZm87CisKKyAgICBwdWJsaWMgUmVtb3RlU3BlY3MoKSB7CisgICAgICAgIHRoaXMucGFyc2VycyA9IG5ldyBMaW5rZWRMaXN0PFBhcnNlcj4oKTsKKyAgICAgICAgdGhpcy5yZW5hbWluZ0NvbnZzID0gbmV3IExpbmtlZExpc3Q8UmVuYW1pbmdDb252ZW50aW9uPigpOworICAgICAgICBkYWVtb25JbmZvTGlzdCA9IG5ldyBMaW5rZWRMaXN0PERhZW1vbkluZm8+KCk7CisgICAgICAgIHNpdGVJbmZvID0gbmV3IFNpdGVJbmZvKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFJlbW90ZVNwZWNzKEZpbGUgcmVtb3RlU3BlY3NGaWxlKSB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgRWxlbWVudCByb290ID0gWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKHJlbW90ZVNwZWNzRmlsZSkpLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICAgICAgTm9kZUxpc3QgYWxpYXNTcGVjTGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQUxJQVNfU1BFQ19UQUcpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc1NwZWNMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLnBhcnNlQW5kU3RvcmVMb2dpbkluZm8obmV3IEZpbGUoUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcygoKEVsZW1lbnQpIGFsaWFzU3BlY0xpc3QuaXRlbShpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShGSUxFX0FUVFIpKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgREFFTU9OIGVsZW1lbnRzCisgICAgICAgICAgICBOb2RlTGlzdCBkYWVtb25MaXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShEQUVNT05fVEFHKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGFlbW9uTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBkYWVtb25Ob2RlID0gZGFlbW9uTGlzdC5pdGVtKGkpOworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgc2V0IHRvIGFjdGl2ZSAoc2tpcCBvdGhlcndpc2UpCisgICAgICAgICAgICAgICAgaWYgKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgKChFbGVtZW50KSBkYWVtb25Ob2RlKS5nZXRBdHRyaWJ1dGUoQUNUSVZFX0FUVFIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygibm8iKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBEYWVtb25JbmZvIGRpID0gbnVsbDsKKworICAgICAgICAgICAgICAgIC8vIGdldCBzaXRlIGFsaWFzCisgICAgICAgICAgICAgICAgU3RyaW5nIHNpdGVBbGlhcyA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoKChFbGVtZW50KSBkYWVtb25Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKEFMSUFTX0FUVFIpKTsKKyAgICAgICAgICAgICAgICBSZW1vdGVTaXRlIGRhdGFGaWxlc1JlbW90ZVNpdGUgPSB0aGlzLnNpdGVJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2l0ZUJ5QWxpYXMoc2l0ZUFsaWFzKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUZpbGVzUmVtb3RlU2l0ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJBbGlhcyAnIiArIHNpdGVBbGlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaW4gU2l0ZUluZm8gZmlsZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlU3BlY3NGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBoYXMgbm90IGJlZW4gZGVmaW5lZCIpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IFJVTklORk8gZWxlbWVudAorICAgICAgICAgICAgICAgIE5vZGVMaXN0IHJ1bkluZm9MaXN0ID0gKChFbGVtZW50KSBkYWVtb25Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKFJVTl9JTkZPX1RBRyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpcnN0UnVuRGF0ZVRpbWVTdHJpbmcgPSBudWxsLCBwZXJpb2QgPSBudWxsLCBlcHNpbG9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJ1bk9uUmVib290ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHJ1bkluZm9MaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJ1bkluZm8gPSAoRWxlbWVudCkgcnVuSW5mb0xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RSdW5EYXRlVGltZVN0cmluZyA9IHJ1bkluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKEZJUlNUUlVOX0RBVEVUSU1FX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPSBydW5JbmZvLmdldEF0dHJpYnV0ZShQRVJJT0RfQVRUUik7CisgICAgICAgICAgICAgICAgICAgIHJ1bk9uUmVib290ID0gKHJ1bkluZm8uZ2V0QXR0cmlidXRlKFJVTk9OUkVCT09UX0FUVFIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ5ZXMiKSkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVwc2lsb24gPSBydW5JbmZvLmdldEF0dHJpYnV0ZShFUFNJTE9OX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXBzaWxvbi5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXBzaWxvbiA9ICIwcyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZ2V0IFBST1BJTkZPIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgTm9kZUxpc3QgcHJvcEluZm9MaXN0ID0gKChFbGVtZW50KSBkYWVtb25Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKFBST1BfSU5GT19UQUcpOworICAgICAgICAgICAgICAgIExpbmtlZExpc3Q8UHJvcEZpbGVzSW5mbz4gcGZpTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFByb3BGaWxlc0luZm8+KCk7CisgICAgICAgICAgICAgICAgUHJvcEZpbGVzSW5mbyBwZmkgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChwcm9wSW5mb0xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgcHJvcEluZm9Ob2RlID0gcHJvcEluZm9MaXN0Lml0ZW0oMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvcGVydHkgZmlsZXMgYXJlCisgICAgICAgICAgICAgICAgICAgIEZpbGUgcHJvcGVydHlGaWxlc0RpciA9IG5ldyBGaWxlKFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoRWxlbWVudCkgcHJvcEluZm9Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShESVJfQVRUUikpKTsKKworICAgICAgICAgICAgICAgICAgICBwZmkgPSBuZXcgUHJvcEZpbGVzSW5mbyhwcm9wZXJ0eUZpbGVzRGlyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgUFJPUEZJTEVTIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IHByb3BGaWxlc0xpc3QgPSAoKEVsZW1lbnQpIHByb3BJbmZvTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoUFJPUF9GSUxFU19UQUcpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcEZpbGVzUmVnRXhwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BGaWxlc0xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHByb3BGaWxlc0xpc3QuZ2V0TGVuZ3RoKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgcHJvcEZpbGVzTm9kZSA9IHByb3BGaWxlc0xpc3QuaXRlbShrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wRmlsZXNSZWdFeHAgPSAoKEVsZW1lbnQpIHByb3BGaWxlc05vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFJFR19FWFBfQVRUUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJvcEZpbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wRmlsZXNSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1c2hQdWxsT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVOZXdJbnN0YW5jZSgoQ2xhc3M8UGFyc2VyPikgQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcygoKEVsZW1lbnQpIHByb3BGaWxlc05vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShQQVJTRVJfQVRUUikpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBwcm9wRmlsZXMgZWxlbWVudCBzcGVjaWZpZWQgZm9yIGRlYW1vbiB3aXRoIGFsaWFzICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXRlQWxpYXMgKyAiJyBpbiBSZW1vdGVTcGVjcyBmaWxlICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGVTcGVjc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IERPV05MT0FESU5GTyBlbGVtZW50IGlmIGdpdmVuCisgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IGRvd25sb2FkSW5mb0xpc3QgPSAoKEVsZW1lbnQpIHByb3BJbmZvTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoRE9XTkxPQURfSU5GT19UQUcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRJbmZvTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgZG93bmxvYWRJbmZvID0gZG93bmxvYWRJbmZvTGlzdC5pdGVtKDApOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BGaWxlc0FsaWFzID0gUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoRWxlbWVudCkgZG93bmxvYWRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoQUxJQVNfQVRUUikpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BGaWxlc1JlbmFtaW5nQ29udiA9ICgoRWxlbWVudCkgZG93bmxvYWRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFJFTkFNSU5HX0NPTlZfQVRUUik7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93QWxpYXNPdmVycmlkZSA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVsZW1lbnQpIGRvd25sb2FkSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoQUxMT1dfQUxJQVNfT1ZFUlJJREVfQVRUUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoInllcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWxldGVGcm9tU2VydmVyID0gUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWxlbWVudCkgZG93bmxvYWRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShERUxFVEVfRlJPTV9TRVJWRVJfQVRUUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoInllcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlU2l0ZSBwcm9wRmlsZXNSZW1vdGVTaXRlID0gdGhpcy5zaXRlSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2l0ZUJ5QWxpYXMocHJvcEZpbGVzQWxpYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BGaWxlc1JlbW90ZVNpdGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJBbGlhcyAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wRmlsZXNBbGlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBpbiBSZW1vdGVTcGVjcyBmaWxlICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZVNwZWNzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBoYXMgbm90IGJlZW4gZGVmaW5lZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZ0V4cCA9ICgoRWxlbWVudCkgZG93bmxvYWRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFJFR19FWFBfQVRUUik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnRXhwLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnRXhwID0gcHJvcEZpbGVzUmVnRXhwOworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgcHJvcHNMaXN0ID0gKChFbGVtZW50KSBwcm9wSW5mb05vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShQUk9QX0ZJTEVfVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8RmlsZSwgUGFyc2VyPiBwcm9wRmlsZVRvUGFyc2VyTWFwID0gbmV3IEhhc2hNYXA8RmlsZSwgUGFyc2VyPigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwcm9wc0xpc3QuZ2V0TGVuZ3RoKCk7IHArKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcEVsZW0gPSAoRWxlbWVudCkgcHJvcHNMaXN0Lml0ZW0ocCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEZpbGVUb1BhcnNlck1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhwcm9wRWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFBBVEhfQVRUUikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVzaFB1bGxPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZU5ld0luc3RhbmNlKChDbGFzczxQYXJzZXI+KSBDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvck5hbWUoUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKHByb3BFbGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShQQVJTRVJfQVRUUikpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGZpLnNldERvd25sb2FkSW5mbyhuZXcgRG93bmxvYWRJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wRmlsZXNSZW1vdGVTaXRlLCBwcm9wRmlsZXNSZW5hbWluZ0NvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZyb21TZXJ2ZXIsIHByb3BlcnR5RmlsZXNEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QWxpYXNPdmVycmlkZSksIHByb3BGaWxlVG9QYXJzZXJNYXApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IEFGVEVSVVNFIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgYWZ0ZXJVc2VMaXN0ID0gKChFbGVtZW50KSBwcm9wSW5mb05vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKEFGVEVSX1VTRV9UQUcpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJVc2VMaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBhZnRlclVzZSA9IChFbGVtZW50KSBhZnRlclVzZUxpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb25TdWNjZXNzRGlyID0gbmV3IEZpbGUoUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKGFmdGVyVXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShNT1ZFT05fVE9fU1VDQ0VTU19BVFRSKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvbkZhaWxEaXIgPSBuZXcgRmlsZShQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoYWZ0ZXJVc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKE1PVkVPTl9UT19GQUlMX0FUVFIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZmkuc2V0QWZ0ZXJVc2VFZmZlY3RzKG9uU3VjY2Vzc0Rpciwgb25GYWlsRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRlT25TdWNjZXNzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oUGF0aFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoYWZ0ZXJVc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoREVMRVRFX09OX1NVQ0NFU1NfQVRUUikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBmaS5zZXREZWxldGVPblN1Y2Nlc3MoZGVsZXRlT25TdWNjZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHByb3BJbmZvIGVsZW1lbnQgc3BlY2lmaWVkIGZvciBkZWFtb24gd2l0aCBhbGlhcyAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXRlQWxpYXMgKyAiJyBpbiBSZW1vdGVTcGVjcyBmaWxlICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZVNwZWNzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICInIik7CisKKyAgICAgICAgICAgICAgICAvLyBnZXQgREFUQUlORk8gZWxlbWVudHMKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBkYXRhSW5mb0xpc3QgPSAoKEVsZW1lbnQpIGRhZW1vbk5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoREFUQV9JTkZPX1RBRyk7CisgICAgICAgICAgICAgICAgRGF0YUZpbGVzSW5mbyBkZmkgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChkYXRhSW5mb0xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgZGF0YUluZm8gPSBkYXRhSW5mb0xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5RWxlbWVudCA9ICgoRWxlbWVudCkgZGF0YUluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFFVRVJZX0VMRU1fQVRUUik7CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkocXVlcnlFbGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUVsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUVsZW1lbnQgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhxdWVyeUVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW5hbWluZ0NvbnYgPSAoKEVsZW1lbnQpIGRhdGFJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoUkVOQU1JTkdfQ09OVl9BVFRSKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShyZW5hbWluZ0NvbnYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtaW5nQ29udiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd0FsaWFzT3ZlcnJpZGUgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVsZW1lbnQpIGRhdGFJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShBTExPV19BTElBU19PVkVSUklERV9BVFRSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKCJ5ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBzdGFnaW5nQXJlYSA9IG5ldyBGaWxlKFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoRWxlbWVudCkgZGF0YUluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFNUQUdJTkdfQVJFQV9BVFRSKSkpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlbGV0ZUZyb21TZXJ2ZXIgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVsZW1lbnQpIGRhdGFJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShERUxFVEVfRlJPTV9TRVJWRVJfQVRUUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygieWVzIik7CisgICAgICAgICAgICAgICAgICAgIGRmaSA9IG5ldyBEYXRhRmlsZXNJbmZvKHF1ZXJ5RWxlbWVudCwgbmV3IERvd25sb2FkSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZXNSZW1vdGVTaXRlLCByZW5hbWluZ0NvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRnJvbVNlcnZlciwgc3RhZ2luZ0FyZWEsIGFsbG93QWxpYXNPdmVycmlkZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBkYXRhSW5mbyBlbGVtZW50IHNwZWNpZmllZCBmb3IgZGVhbW9uIHdpdGggYWxpYXMgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l0ZUFsaWFzICsgIicgaW4gUmVtb3RlU3BlY3MgZmlsZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGVTcGVjc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyIpOworCisgICAgICAgICAgICAgICAgZGFlbW9uSW5mb0xpc3QuYWRkKG5ldyBEYWVtb25JbmZvKGZpcnN0UnVuRGF0ZVRpbWVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QsIGVwc2lsb24sIHJ1bk9uUmVib290LCBwZmksIGRmaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGNyYXdsIGVsZW1lbnRzIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGFyc2VBbmRTdG9yZUxvZ2luSW5mbyhGaWxlIGxvZ2luSW5mb0ZpbGUpIHRocm93cyBDb25maWdFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTm9kZUxpc3Qgc291cmNlTGlzdCA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ2luSW5mb0ZpbGUpKQorICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoU09VUkNFX1RBRyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCisgICAgICAgICAgICAgICAgLy8gZ2V0IHNvdXJjZSBlbGVtZW50CisgICAgICAgICAgICAgICAgTm9kZSBzb3VyY2VOb2RlID0gc291cmNlTGlzdC5pdGVtKGkpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IGhvc3Qgb2YgdGhpcyBzb3VyY2UKKyAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoKChFbGVtZW50KSBzb3VyY2VOb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKEhPU1RfQVRUUikpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IGFsbCBsb2dpbiBpbmZvIGZvciB0aGlzIHNvdXJjZQorICAgICAgICAgICAgICAgIE5vZGVMaXN0IGxvZ2luTGlzdCA9ICgoRWxlbWVudCkgc291cmNlTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShMT0dJTl9BVFRSKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxvZ2luTGlzdC5nZXRMZW5ndGgoKTsgaisrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGEgc2luZ2xlIGxvZ2luIGluZm8KKyAgICAgICAgICAgICAgICAgICAgTm9kZSBsb2dpbk5vZGUgPSBsb2dpbkxpc3QuaXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcygoKEVsZW1lbnQpIGxvZ2luTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoVFlQRV9BVFRSKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbGlhcyA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKCgoRWxlbWVudCkgbG9naW5Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShBTElBU19BVFRSKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IG51bGwsIHBhc3N3b3JkID0gbnVsbCwgY2RUZXN0RGlyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heENvbm5lY3Rpb25zID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhpcyBsb2dpbiBpbmZvCisgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IGxvZ2luSW5mbyA9IGxvZ2luTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbG9naW5JbmZvLmdldExlbmd0aCgpOyBrKyspIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGEgc2luZ2xlIGxvZ2luIGluZm8gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gbG9naW5JbmZvLml0ZW0oayk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGF0IGVsZW1lbnQgdHlwZSBpdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoVVNFUk5BTUVfVEFHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5nZXRTaW1wbGVFbGVtZW50VGV4dCgoRWxlbWVudCkgbm9kZSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKFBBU1NXT1JEX1RBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuZ2V0U2ltcGxlRWxlbWVudFRleHQoKEVsZW1lbnQpIG5vZGUsIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhDRF9URVNUX0RJUl9UQUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RUZXN0RGlyID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5nZXRTaW1wbGVFbGVtZW50VGV4dCgoRWxlbWVudCkgbm9kZSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKE1BWF9DT05OX1RBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb25uZWN0aW9ucyA9IEludGVnZXIucGFyc2VJbnQoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5nZXRTaW1wbGVFbGVtZW50VGV4dCgoRWxlbWVudCkgbm9kZSwgdHJ1ZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2l0ZUluZm8uYWRkU2l0ZShuZXcgUmVtb3RlU2l0ZShhbGlhcywgbmV3IFVSTCh0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOi8vIiArIGhvc3QpLCB1c2VybmFtZSwgcGFzc3dvcmQsIGNkVGVzdERpciwgbWF4Q29ubmVjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBleHRlcm5hbCBzb3VyY2UgaW5mbyA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlua2VkTGlzdDxEYWVtb25JbmZvPiBnZXREYWVtb25JbmZvTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mb0xpc3Q7CisgICAgfQorCisgICAgcHVibGljIFNpdGVJbmZvIGdldFNpdGVJbmZvKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zaXRlSW5mbzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9TaXRlSW5mby5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvY29uZmlnL1NpdGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3Mjg0YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2NvbmZpZy9TaXRlSW5mby5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGU7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBTaXRlSW5mbyB7CisKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBSZW1vdGVTaXRlPiBhbGlhc0FuZFJlbW90ZVNpdGU7CisKKyAgICBwdWJsaWMgU2l0ZUluZm8oKSB7CisgICAgICAgIGFsaWFzQW5kUmVtb3RlU2l0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVtb3RlU2l0ZT4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTaXRlKFJlbW90ZVNpdGUgcnMpIHsKKyAgICAgICAgdGhpcy5hbGlhc0FuZFJlbW90ZVNpdGUucHV0KHJzLmdldEFsaWFzKCksIHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlU2l0ZSBnZXRTaXRlQnlBbGlhcyhTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWxpYXNBbmRSZW1vdGVTaXRlLmdldChhbGlhcyk7CisgICAgfQorCisgICAgcHVibGljIExpbmtlZExpc3Q8UmVtb3RlU2l0ZT4gZ2V0UG9zc2libGVSZW1vdGVTaXRlcyhTdHJpbmcgYWxpYXMsIFVSTCB1cmwsCisgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBMaW5rZWRMaXN0PFJlbW90ZVNpdGU+IHJlbW90ZVNpdGVzID0gbmV3IExpbmtlZExpc3Q8UmVtb3RlU2l0ZT4oKTsKKyAgICAgICAgaWYgKGFsaWFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlbW90ZVNpdGUgcnMgPSB0aGlzLmFsaWFzQW5kUmVtb3RlU2l0ZS5nZXQoYWxpYXMpOworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVtb3RlU2l0ZXMuYWRkKHJzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHVybCAhPSBudWxsICYmIHVzZXJuYW1lICE9IG51bGwgJiBwYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlbW90ZVNpdGVzLmFkZChuZXcgUmVtb3RlU2l0ZShhbGlhcywgdXJsLCB1c2VybmFtZSwgcGFzc3dvcmQpKTsKKyAgICAgICAgfSBlbHNlIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgUmVtb3RlU2l0ZT4+IHNldCA9IHRoaXMuYWxpYXNBbmRSZW1vdGVTaXRlCisgICAgICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpOworICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFJlbW90ZVNpdGU+IGVudHJ5IDogc2V0KSB7CisgICAgICAgICAgICAgICAgUmVtb3RlU2l0ZSBycyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJzLmdldFVSTCgpLmVxdWFscyh1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAodXNlcm5hbWUgPT0gbnVsbCB8fCBycy5nZXRVc2VybmFtZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhc3N3b3JkID09IG51bGwgfHwgcnMuZ2V0UGFzc3dvcmQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKSkpCisgICAgICAgICAgICAgICAgICAgIHJlbW90ZVNpdGVzLmFkZChycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVtb3RlU2l0ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZW1vdGVTaXRlcy5hZGQobmV3IFJlbW90ZVNpdGUodXJsLnRvU3RyaW5nKCksIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh1c2VybmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBSZW1vdGVTaXRlPj4gc2V0ID0gdGhpcy5hbGlhc0FuZFJlbW90ZVNpdGUKKyAgICAgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCk7CisgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgUmVtb3RlU2l0ZT4gZW50cnkgOiBzZXQpIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVTaXRlIHJzID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocnMuZ2V0VXNlcm5hbWUoKS5lcXVhbHModXNlcm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAocGFzc3dvcmQgPT0gbnVsbCB8fCBycy5nZXRQYXNzd29yZCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpKSkKKyAgICAgICAgICAgICAgICAgICAgcmVtb3RlU2l0ZXMuYWRkKHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXNzd29yZCAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBSZW1vdGVTaXRlPj4gc2V0ID0gdGhpcy5hbGlhc0FuZFJlbW90ZVNpdGUKKyAgICAgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCk7CisgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgUmVtb3RlU2l0ZT4gZW50cnkgOiBzZXQpIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVTaXRlIHJzID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocnMuZ2V0UGFzc3dvcmQoKS5lcXVhbHMocGFzc3dvcmQpKQorICAgICAgICAgICAgICAgICAgICByZW1vdGVTaXRlcy5hZGQocnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdGVTaXRlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9kYWVtb24vRGFlbW9uLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9kYWVtb24vRGFlbW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmOGYzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb24uamF2YQpAQCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhZW1vbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuRGFlbW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5TaXRlSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhZW1vbi5EYWVtb25NQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhZW1vbi5EYWVtb25SbWlJbnRlcmZhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5wcm90b2NvbC5SZW1vdGVTaXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtLlJldHJpZXZhbFNldHVwOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5ybWkuQWxyZWFkeUJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEucm1pLk5hbWluZzsKK2ltcG9ydCBqYXZhLnJtaS5Ob3RCb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5ybWkucmVnaXN0cnkuTG9jYXRlUmVnaXN0cnk7CitpbXBvcnQgamF2YS5ybWkuc2VydmVyLlVuaWNhc3RSZW1vdGVPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9KTVggaW1wb3J0cworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCisvKioKKyAqIENvbnRyb2xzIHRoZSBleGVjdXRpb24gdGltZXMgb2YgdGhlIENyYXdsZXIgaXQgaXMgZ2l2ZW4uIFRoZSBDcmF3bGVyIGlzCisgKiBzcGVjaWZpZWQgYnkgdGhlIHByb3BlcnRpZXMgZmlsZSBwYXNzZWQgaW4uIEEgQ3Jhd2xlciB3aWxsIGJlIGNyZWF0ZWQgcGVyIHRoZQorICogcHJvcGVydGllcyBmaWxlIGFuZCBleGVjdXRlZCBhdCBzaXggaG91ciBpbnRlcnZhbHMuIFRoaXMgY2xhc3MgY2FuIGJlCisgKiBjb250cm9sbGVkIGJ5IENyYXdsRGFlbW9uQ29udHJvbGxlciBhZnRlciBpcyBoYXMgYmVlbiBzdGFydGVkIHVwLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIERhZW1vbiBleHRlbmRzIFVuaWNhc3RSZW1vdGVPYmplY3QgaW1wbGVtZW50cyBEYWVtb25SbWlJbnRlcmZhY2UsCisgICAgICAgIERhZW1vbk1CZWFuIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc2NjA5NzI5Mzk3MjMxNDI4MDJMOworCisgICAgcHJpdmF0ZSBEYWVtb25MaXN0ZW5lciBkYWVtb25MaXN0ZW5lcjsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRGFlbW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSBDcmF3bGVyIGlzIHJ1bm5pbmcgb3Igbm90CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUnVubmluZzsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byBmYWxzZSB0aGUgQ3Jhd2xEYWVtb24gd2lsbCB0ZXJtaW5hdGUgYWZ0ZXIgdGhlIENyYXdsZXIgZmluaXNoZXMKKyAgICAgKiBjcmF3bGluZyBpdHMgY3VycmVudCBzaXRlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwUnVubmluZzsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBDb25zdHJ1Y3RvciBpcyBjYWxsZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZGFlbW9uQ3JlYXRpb25UaW1lOworCisgICAgLyoqCisgICAgICogVGhlIHRvdGFsIHRpbWUgZHVyaW5nIHdoaWNoIHRoZSBDcmF3bCBpcyBhY3R1YWxseSBydW5uaW5nIC0tIHdhaXQoKSB0aW1lCisgICAgICogaXMgbm90IGluY2x1ZGVkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBkYWVtb25Ub3RhbFJ1bnRpbWU7CisKKyAgICAvKioKKyAgICAgKiBUb3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIENyYXdsZXIgaGFzIGJlZW4gcnVuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZDcmF3bHM7CisKKyAgICBwcml2YXRlIEZpbGUgcHJvcEZpbGVzRGlyOworCisgICAgcHJpdmF0ZSBpbnQgZGFlbW9uSUQ7CisKKyAgICBwcml2YXRlIFJldHJpZXZhbFNldHVwIHJzOworCisgICAgcHJpdmF0ZSBDb25maWcgY29uZmlnOworCisgICAgcHJpdmF0ZSBEYWVtb25JbmZvIGRhZW1vbkluZm87CisKKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1iczsKKworICAgIHByaXZhdGUgaW50IHJtaVJlZ1BvcnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIAorICAgICAqIEB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBSZW1vdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBEYWVtb24oaW50IHJtaVJlZ1BvcnQsIGludCBkYWVtb25JRCwgQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgIERhZW1vbkluZm8gZGFlbW9uSW5mbywgU2l0ZUluZm8gc2l0ZUluZm8pIHRocm93cyBSZW1vdGVFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKworICAgICAgICB0aGlzLnJtaVJlZ1BvcnQgPSBybWlSZWdQb3J0OworICAgICAgICB0aGlzLmRhZW1vbklEID0gZGFlbW9uSUQ7CisgICAgICAgIHJzID0gbmV3IFJldHJpZXZhbFNldHVwKGNvbmZpZywgc2l0ZUluZm8pOworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgdGhpcy5kYWVtb25JbmZvID0gZGFlbW9uSW5mbzsKKworICAgICAgICBkYWVtb25DcmVhdGlvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZGFlbW9uVG90YWxSdW50aW1lID0gMDsKKyAgICAgICAgbnVtYmVyT2ZDcmF3bHMgPSAwOworICAgICAgICBpc1J1bm5pbmcgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVnaXN0ZXJSTUlTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGJpbmQgdG8gUk1JIHNlcnZlciA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcmVnaXN0cnkgQ3Jhd2xEYWVtb24gYXMgTUJlYW4gc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBqY29uc29sZQorICAgICAgICAgICAgbWJzID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhZW1vbjp0eXBlPURhZW1vbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuZ2V0RGFlbW9uSUQoKSk7CisgICAgICAgICAgICBtYnMucmVnaXN0ZXJNQmVhbih0aGlzLCBuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIENyYXdsRGFlbW9uIGFzIGEgTUJlYW4gT2JqZWN0IDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gIkRhZW1vbiIgKyB0aGlzLmdldERhZW1vbklEKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUk1JU2VydmVyKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgTm90Qm91bmRFeGNlcHRpb24sIEFscmVhZHlCb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYW1pbmcuYmluZCgiLy9sb2NhbGhvc3Q6IiArIHRoaXMucm1pUmVnUG9ydCArICIvZGFlbW9uIgorICAgICAgICAgICAgICAgICAgICArIHRoaXMuZ2V0RGFlbW9uSUQoKSwgdGhpcyk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDcmVhdGVkIERhZW1vbiBJRCA9ICIgKyB0aGlzLmdldERhZW1vbklEKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uIFJNSSByZWdpc3RyeSBwb3J0ICIgKyB0aGlzLnJtaVJlZ1BvcnQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oIkZhaWxlZCB0byBiaW5kIERhZW1vbiB3aXRoIElEID0gIgorICAgICAgICAgICAgICAgICAgICArIHRoaXMuZ2V0RGFlbW9uSUQoKSArICIgdG8gUk1JIHJlZ2lzdHJ5IGF0IHBvcnQgIgorICAgICAgICAgICAgICAgICAgICArIHRoaXMucm1pUmVnUG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhZW1vbkxpc3RlbmVyKERhZW1vbkxpc3RlbmVyIGRhZW1vbkxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMuZGFlbW9uTGlzdGVuZXIgPSBkYWVtb25MaXN0ZW5lcjsKKyAgICAgICAgdGhpcy5kYWVtb25MaXN0ZW5lci53YXNSZWdpc3RlcmVkV2l0aCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbmQgZXhlY3V0ZXMgdGhlIENyYXdsZXIgc3BlY2lmaWVkIGJ5IHRoZSBwcm9wZXJ0aWVzIGZpbGUuIEl0IHdpbGwKKyAgICAgKiBjcmF3bCB0aGUgVVJMcyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUgc2VxdWVuY2UKKyAgICAgKiBnaXZlbi0tb25lIGF0IGEgdGltZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgIFRoZSBzeXN0ZW0gcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgdGhlIHBhdGggdG8gYSBqYXZhCisgICAgICogICAgICAgICAgICAucHJvcGVydGllcyBmaWxlIHRoYXQgaXMgYmUgdXNlZCB0byBjcmVhdGUgdGhlIENyYXdsZXIKKyAgICAgKiBAdGhyb3dzIERpclN0cnVjdEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RGFlbW9uKCkgeworICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgRGFlbW9uIHNob3VsZCBzbGVlcCBmaXJzdAorICAgICAgICAgICAgICAgIGxvbmcgdGltZVRpbE5leHRSdW47CisgICAgICAgICAgICAgICAgaWYgKCh0aW1lVGlsTmV4dFJ1biA9IERhZW1vbi50aGlzLmNhbGN1bGF0ZVRpbWVUaWxOZXh0UnVuKCkpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEoRGFlbW9uLnRoaXMuYmVmb3JlVG9kYXkoZGFlbW9uSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RSdW5EYXRlVGltZSgpKSAmJiBkYWVtb25JbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydW5PblJlYm9vdCgpKSkKKyAgICAgICAgICAgICAgICAgICAgc2xlZXAodGltZVRpbE5leHRSdW4pOworCisgICAgICAgICAgICAgICAgZm9yIChrZWVwUnVubmluZyA9IHRydWU7IGtlZXBSdW5uaW5nOykgeworICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBwZXJtaXNzaW9uIHRvIHJ1bgorICAgICAgICAgICAgICAgICAgICBEYWVtb24udGhpcy5ub3RpZnlEYWVtb25MaXN0ZW5lck9mU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFrZWVwUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgRGFlbW9uLnRoaXMubm90aWZ5RGFlbW9uTGlzdGVuZXJPZkZpbmlzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCUkVBS0lORyBPVVQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVuCisgICAgICAgICAgICAgICAgICAgIERhZW1vbi50aGlzLmlzUnVubmluZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJzLnJldHJpZXZlRmlsZXMoZGFlbW9uSW5mby5nZXRQcm9wRmlsZXNJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhZW1vbkluZm8uZ2V0RGF0YUZpbGVzSW5mbygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkNyYXdscysrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgRGFlbW9uLnRoaXMuaXNSdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHBlcmZvcm1hbmNlIGFuZCBzbGVlcAorICAgICAgICAgICAgICAgICAgICBEYWVtb24udGhpcy5ub3RpZnlEYWVtb25MaXN0ZW5lck9mRmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIERhZW1vbi50aGlzLmNhbGN1bGF0ZUFuZFN0b3JlRWxhcHNlZFRpbWUoc3RhcnRUaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERhZW1vbi50aGlzLmtlZXBSdW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGFlbW9uSW5mby5nZXRUaW1lSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcygpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKERhZW1vbi50aGlzLmNhbGN1bGF0ZVRpbWVUaWxOZXh0UnVuKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGFlbW9uIHdpdGggSUQgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIERhZW1vbi50aGlzLmdldERhZW1vbklEKCkgKyAiIG9uIFJNSSByZWdpc3RyeSBwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRGFlbW9uLnRoaXMucm1pUmVnUG9ydCArICIgaXMgc2h1dHRpbmcgZG93biIpOworICAgICAgICAgICAgICAgIERhZW1vbi50aGlzLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgQ3Jhd2xEYWVtb24gZnJvbSBSTUkgcmVnaXN0cnkKKyAgICAgICAgICAgIE5hbWluZy51bmJpbmQoIi8vbG9jYWxob3N0OiIgKyB0aGlzLnJtaVJlZ1BvcnQgKyAiL2RhZW1vbiIKKyAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmdldERhZW1vbklEKCkpOworICAgICAgICAgICAgdGhpcy5tYnMudW5yZWdpc3Rlck1CZWFuKG5ldyBPYmplY3ROYW1lKAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5kYWVtb246dHlwZT1EYWVtb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmdldERhZW1vbklEKCkpKTsKKyAgICAgICAgICAgIFVuaWNhc3RSZW1vdGVPYmplY3QudW5leHBvcnRPYmplY3QodGhpcywgdHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmRhZW1vbkxpc3RlbmVyLndhc1VucmVnaXN0ZXJlZFdpdGgodGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYWVtb25JRCgpIHsKKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGhpcy5ybWlSZWdQb3J0ICsgIiIgKyB0aGlzLmRhZW1vbklEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY2FsY3VsYXRlVGltZVRpbE5leHRSdW4oKSB7CisgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIG5vdyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnY1N0YXJ0RGF0ZVRpbWUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgZ2NTdGFydERhdGVUaW1lLnNldFRpbWUoZGFlbW9uSW5mby5nZXRGaXJzdFJ1bkRhdGVUaW1lKCkpOworICAgICAgICBsb25nIGRpZmYgPSBub3cuZ2V0VGltZUluTWlsbGlzKCkgLSBnY1N0YXJ0RGF0ZVRpbWUuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgICAgIGlmIChNYXRoLmFicyhkaWZmKSA8PSBkYWVtb25JbmZvLmdldEVwc2lsb25Jbk1pbGxpc2Vjb25kcygpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKGRpZmYgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGdjU3RhcnREYXRlVGltZS5nZXRUaW1lSW5NaWxsaXMoKSAtIG5vdy5nZXRUaW1lSW5NaWxsaXMoKTsKKyAgICAgICAgZWxzZSBpZiAoZGFlbW9uSW5mby5nZXRUaW1lSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcygpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG51bU9mUGVyaW9kcyA9IChpbnQpIChkaWZmIC8gZGFlbW9uSW5mbworICAgICAgICAgICAgICAgICAgICAuZ2V0VGltZUludGVydmFsSW5NaWxsaXNlY29uZHMoKSk7CisgICAgICAgICAgICBsb25nIG5leHRSdW5UaW1lID0gZ2NTdGFydERhdGVUaW1lLmdldFRpbWVJbk1pbGxpcygpCisgICAgICAgICAgICAgICAgICAgICsgKChudW1PZlBlcmlvZHMgKyAxKSAqIGRhZW1vbkluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGltZUludGVydmFsSW5NaWxsaXNlY29uZHMoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV4dFJ1blRpbWUgLSBub3cuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYmVmb3JlVG9kYXkoRGF0ZSBkYXRlKSB7CisgICAgICAgIHJldHVybiBkYXRlLmJlZm9yZShuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlEYWVtb25MaXN0ZW5lck9mU3RhcnQoKSB7CisgICAgICAgIGlmICh0aGlzLmRhZW1vbkxpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmRhZW1vbkxpc3RlbmVyLmRhZW1vblN0YXJ0aW5nKHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlEYWVtb25MaXN0ZW5lck9mRmluaXNoKCkgeworICAgICAgICBpZiAodGhpcy5kYWVtb25MaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5kYWVtb25MaXN0ZW5lci5kYWVtb25GaW5pc2hlZCh0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2xlZXAobG9uZyBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkRhZW1vbiB3aXRoIElEID0gIiArIHRoaXMuZ2V0RGFlbW9uSUQoKQorICAgICAgICAgICAgICAgICAgICArICIgb24gUk1JIHJlZ2lzdHJ5IHBvcnQgIiArIHRoaXMucm1pUmVnUG9ydAorICAgICAgICAgICAgICAgICAgICArICIgaXMgZ29pbmcgdG8gc2xlZXAgdW50aWwgIgorICAgICAgICAgICAgICAgICAgICArIG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbGVuZ3RoKSk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YWl0KGxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBjYWxjdWxhdGVBbmRTdG9yZUVsYXBzZWRUaW1lKGxvbmcgc3RhcnRUaW1lKSB7CisgICAgICAgIGxvbmcgZWxhcHNlZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgZGFlbW9uVG90YWxSdW50aW1lICs9IGVsYXBzZWRUaW1lOworICAgICAgICByZXR1cm4gZWxhcHNlZFRpbWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBhdXNlRGFlbW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGFlbW9uIHdpdGggSUQgPSAiICsgdGhpcy5nZXREYWVtb25JRCgpCisgICAgICAgICAgICAgICAgICAgICsgIiBvbiBSTUkgcmVnaXN0cnkgcG9ydCAiICsgdGhpcy5ybWlSZWdQb3J0CisgICAgICAgICAgICAgICAgICAgICsgIiBoYXMgYmVlbiBzdG9wcGVkIik7CisgICAgICAgICAgICB0aGlzLndhaXQoMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGFlbW9uIHdpdGggSUQgPSAiICsgdGhpcy5nZXREYWVtb25JRCgpCisgICAgICAgICAgICAgICAgKyAiIG9uIFJNSSByZWdpc3RyeSBwb3J0ICIgKyB0aGlzLnJtaVJlZ1BvcnQgKyAiIGhhcyByZXN1bWVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FrZXMgdXAgdGhlIENyYXdsRGFlbW9uIGlmIGl0IGlzIHNsZWVwaW5nCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc3VtZSgpIHsKKyAgICAgICAgbm90aWZ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2lsbCB0ZXJtaW5hdGUgdGhlIENyYXdsRGFlbW9uLiBJZiBpdHMgQ3Jhd2xlciBpcyBjcmF3bGluZyBhIHNpdGUgd2hlbgorICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHRlcm1pbmF0ZSB3b24ndCB0YWtlIHBsYWNlIHVudGlsIGFmdGVyIHRoZQorICAgICAqIENyYXdsZXIgaGFzIGNvbXBsZXRlIGNyYXdsaW5nIHRoYXQgc2l0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcXVpdCgpIHsKKyAgICAgICAga2VlcFJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgcmVzdW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIENyYXdsZXIgaXMgcHJlc2VudGx5IHJ1bm5pbmcKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgQ3Jhd2xlciBpcyBydW5ubmluZworICAgICAqIEB1bWwucHJvcGVydHkgbmFtZT0iaXNSdW5uaW5nIgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgcmV0dXJuIGlzUnVubmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdmVyYWdlIHJ1bnRpbWUgZm9yIHRoZSBDcmF3bGVyCisgICAgICogCisgICAgICogQHJldHVybiBhdmVyYWdlIHJ1bnRpbWUgZm9yIHRoZSBDcmF3bGVyCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QXZlcmFnZVJ1blRpbWUoKSB7CisgICAgICAgIHJldHVybiBkYWVtb25Ub3RhbFJ1bnRpbWUgLyBudW1iZXJPZkNyYXdsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0b3RhbCBjcmF3bGluZyB0aW1lIG9mIHRoZSBDcmF3bGVyCisgICAgICogCisgICAgICogQHJldHVybiBUb3RhbCBjcmF3bGluZyB0aW1lIG9mIENyYXdsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXNDcmF3bGluZygpIHsKKyAgICAgICAgcmV0dXJuIGRhZW1vblRvdGFsUnVudGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGJldHdlZW4gdGhlIHN0YXJ0IG9mIENyYXdsZXIgZXhlY3V0aW9ucworICAgICAqIAorICAgICAqIEByZXR1cm4gVGltZSBpbnRlcnZhbCBiZXR3ZWVuIENyYXdsZXIgc3RhcnQgdGltZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lSW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiBkYWVtb25JbmZvLmdldFRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBDcmF3bGVyIGhhcyBiZWVuIHJ1bgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBDcmF3bGVyIGhhcyBydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUNyYXdscygpIHsKKyAgICAgICAgcmV0dXJuIG51bWJlck9mQ3Jhd2xzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBkb3dubG9hZGVkRmlsZXNJblN0YWdpbmdBcmVhKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLmdldERhdGFGaWxlc0luZm8oKS5nZXREb3dubG9hZEluZm8oKQorICAgICAgICAgICAgICAgIC5nZXRTdGFnaW5nQXJlYSgpLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW5hbWUuc3RhcnRzV2l0aCgiRG93bmxvYWRpbmdfIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShuYW1lLmVuZHNXaXRoKCJpbmZvLnRtcCIpIHx8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5kc1dpdGgoImNhcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBkb3dubG9hZGluZ0ZpbGVzSW5TdGFnaW5nQXJlYSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mby5nZXREYXRhRmlsZXNJbmZvKCkuZ2V0RG93bmxvYWRJbmZvKCkKKyAgICAgICAgICAgICAgICAuZ2V0U3RhZ2luZ0FyZWEoKS5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aCgiRG93bmxvYWRpbmdfIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShuYW1lLmVuZHNXaXRoKCJpbmZvLnRtcCIpIHx8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5kc1dpdGgoImNhcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgbnVtYmVyT2ZGaWxlc0Rvd25sb2FkaW5nSW5TdGFnaW5nQXJlYSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRpbmdGaWxlc0luU3RhZ2luZ0FyZWEoKS5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIGludCBudW1iZXJPZkZpbGVzRG93bmxvYWRlZEluU3RhZ2luZ0FyZWEoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkZWRGaWxlc0luU3RhZ2luZ0FyZWEoKS5sZW5ndGg7CisgICAgfQorCisgICAgLy8gKioqKioqKioqKioqKioqRGFlbW9uSW5mbyoqKioqKioqKioqKioqKioqKgorICAgIHB1YmxpYyBsb25nIGdldFRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLmdldFRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RXBzaWxvbkluTWlsbGlzZWNvbmRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLmdldEVwc2lsb25Jbk1pbGxpc2Vjb25kcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFJ1bk9uUmVib290KCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLnJ1bk9uUmVib290KCk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0Rmlyc3RSdW5EYXRlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mby5nZXRGaXJzdFJ1bkRhdGVUaW1lKCk7CisgICAgfQorCisgICAgLy8gKioqKioqKioqKioqKioqRGFlbW9uSW5mbyoqKioqKioqKioqKioqKioqKgorCisgICAgLy8gKioqKioqKioqKioqKioqRGF0YUZpbGVzSW5mbyoqKioqKioqKioqKioqKioqKioKKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFGaWxlc1JlbW90ZVNpdGUoKSB7CisgICAgICAgIFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSA9IHRoaXMuZGFlbW9uSW5mby5nZXREYXRhRmlsZXNJbmZvKCkKKyAgICAgICAgICAgICAgICAuZ2V0RG93bmxvYWRJbmZvKCkuZ2V0UmVtb3RlU2l0ZSgpOworICAgICAgICByZXR1cm4gKHJlbW90ZVNpdGUgPT0gbnVsbCkgPyAiIiA6IHJlbW90ZVNpdGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFGaWxlc1JlbmFtaW5nQ29udigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mby5nZXREYXRhRmlsZXNJbmZvKCkuZ2V0RG93bmxvYWRJbmZvKCkKKyAgICAgICAgICAgICAgICAuZ2V0UmVuYW1pbmdDb252KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVsZXRlRGF0YUZpbGVzRnJvbVNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mby5nZXREYXRhRmlsZXNJbmZvKCkuZ2V0RG93bmxvYWRJbmZvKCkKKyAgICAgICAgICAgICAgICAuZGVsZXRlRnJvbVNlcnZlcigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlNZXRhZGF0YUVsZW1lbnROYW1lKCkgeworICAgICAgICBTdHJpbmcgZWxlbWVudCA9IHRoaXMuZGFlbW9uSW5mby5nZXREYXRhRmlsZXNJbmZvKCkKKyAgICAgICAgICAgICAgICAuZ2V0UXVlcnlNZXRhZGF0YUVsZW1lbnROYW1lKCk7CisgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5lcXVhbHMoIiIpKQorICAgICAgICAgICAgZWxlbWVudCA9ICJGaWxlbmFtZSI7CisgICAgICAgIHJldHVybiB0aGlzLmRhZW1vbkluZm8uZ2V0RGF0YUZpbGVzSW5mbygpLmdldFF1ZXJ5TWV0YWRhdGFFbGVtZW50TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldERhdGFGaWxlc1N0YWdpbmdBcmVhKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLmdldERhdGFGaWxlc0luZm8oKS5nZXREb3dubG9hZEluZm8oKQorICAgICAgICAgICAgICAgIC5nZXRTdGFnaW5nQXJlYSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEFsbG93QWxpYXNPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mby5nZXREYXRhRmlsZXNJbmZvKCkuZ2V0RG93bmxvYWRJbmZvKCkKKyAgICAgICAgICAgICAgICAuaXNBbGxvd0FsaWFzT3ZlcnJpZGUoKTsKKyAgICB9CisKKyAgICAvLyAqKioqKioqKioqKioqKkRhdGFGaWxlc0luZm8qKioqKioqKioqKioqKioqKioqKgorCisgICAgLy8gKioqKioqKioqKioqKipQcm9wRmlsZXNJbmZvKioqKioqKioqKioqKioqKioqKioKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RmlsZXNSZW1vdGVTaXRlKCkgeworICAgICAgICBSZW1vdGVTaXRlIHJlbW90ZVNpdGUgPSB0aGlzLmRhZW1vbkluZm8uZ2V0UHJvcEZpbGVzSW5mbygpCisgICAgICAgICAgICAgICAgLmdldERvd25sb2FkSW5mbygpLmdldFJlbW90ZVNpdGUoKTsKKyAgICAgICAgcmV0dXJuIChyZW1vdGVTaXRlID09IG51bGwpID8gIiIgOiByZW1vdGVTaXRlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUZpbGVzUmVuYW1pbmdDb252KCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLmdldFByb3BGaWxlc0luZm8oKS5nZXREb3dubG9hZEluZm8oKQorICAgICAgICAgICAgICAgIC5nZXRSZW5hbWluZ0NvbnYoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxldGVQcm9wZXJ0eUZpbGVzRnJvbVNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGFlbW9uSW5mby5nZXRQcm9wRmlsZXNJbmZvKCkuZ2V0RG93bmxvYWRJbmZvKCkKKyAgICAgICAgICAgICAgICAuZGVsZXRlRnJvbVNlcnZlcigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlGaWxlc09uU3VjY2Vzc0RpcigpIHsKKyAgICAgICAgRmlsZSBzdWNjZXNzRGlyID0gdGhpcy5kYWVtb25JbmZvLmdldFByb3BGaWxlc0luZm8oKS5nZXRPblN1Y2Nlc3NEaXIoKTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3NEaXIgPT0gbnVsbCA/ICIiIDogc3VjY2Vzc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RmlsZXNPbkZhaWxEaXIoKSB7CisgICAgICAgIEZpbGUgZmFpbERpciA9IHRoaXMuZGFlbW9uSW5mby5nZXRQcm9wRmlsZXNJbmZvKCkuZ2V0T25GYWlsRGlyKCk7CisgICAgICAgIHJldHVybiBmYWlsRGlyID09IG51bGwgPyAiIiA6IGZhaWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0UHJvcGVydHlGaWxlc0xvY2FsRGlyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYWVtb25JbmZvLmdldFByb3BGaWxlc0luZm8oKS5nZXRMb2NhbERpcigpOworICAgIH0KKworICAgIC8vICoqKioqKioqKioqKioqUHJvcEZpbGVzSW5mbyoqKioqKioqKioqKioqKioqKioqCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3Igd2hlbiB0aGUgQ3Jhd2xEYWVtb24gY29uc3RydWN0b3Igd2FzCisgICAgICogaW52b2tlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHVtbC5wcm9wZXJ0eSBuYW1lPSJkYWVtb25DcmVhdGlvblRpbWUiCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGFlbW9uQ3JlYXRpb25UaW1lKCkgeworICAgICAgICByZXR1cm4gZGFlbW9uQ3JlYXRpb25UaW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEhhc0JlZW5Ub2xkVG9RdWl0KCkgeworICAgICAgICByZXR1cm4gIXRoaXMua2VlcFJ1bm5pbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgcHJvZ3JhbQorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICAgICAgICBOb3QgVXNlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBpbnQgcm1pUG9ydCA9IC0xOworICAgICAgICAgICAgYm9vbGVhbiB3YWl0Rm9yQ3Jhd2xOb3RpZmljYXRpb24gPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXJtaVBvcnQiKSkKKyAgICAgICAgICAgICAgICAgICAgcm1pUG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS13YWl0Rm9yTm90aWZpY2F0aW9uIikpCisgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JDcmF3bE5vdGlmaWNhdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvY2F0ZVJlZ2lzdHJ5LmNyZWF0ZVJlZ2lzdHJ5KHJtaVBvcnQpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHJlZ2lzdHJ5IENyYXdsRGFlbW9uIGFzIE1CZWFuIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggamNvbnNvbGUKKyAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtYnMgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5kYWVtb246dHlwZT1EYWVtb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIENyYXdsRGFlbW9uIGFzIGEgTUJlYW4gT2JqZWN0IDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gY3JlYXRlIENyYXdsRGFlbW9uIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHRlcm1pbmF0ZSB0aGUgQ3Jhd2xEYWVtb24KKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlRlcm1pbmF0aW5nIENyYXdsRGFlbW9uIik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbkNvbnRyb2xsZXIuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25Db250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiZmNiYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25Db250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5kYWVtb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnJtaS5OYW1pbmc7CitpbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogCisgKiA8cD4KKyAqIEFmdGVyIHRoZSBDcmF3bERhZW1vbiBoYXMgYmVlbiBzdGFydGVkLCB0aGlzIGNsYXNzIGNhbiBjb250cm9sIHRoZQorICogQ3Jhd2xEYWVtb24gdGhyb3VnaCB3ZWJzZXJ2ZXIgY29tbXVuaWNhdGlvbiwgdGh1cyBpdCBjYW4gYmUgY29udHJvbCBmcm9tCisgKiBjb21wdXRlcnMgb3RoZXIgdGhhbiB0aGUgb25lIGl0IGlzIGV4ZWN1dGluZyBvbi4gVGhpcyBjbGFzcyBoYXMgY29udHJvbCBvdmVyCisgKiBwYXVzaW5nLCByZXN1bWluZywgYW5kIGtpbGxpbmcgdGhlIENyYXdsRGFlbW9uIHByb2Nlc3MuIEl0IGFsc28gaGFzIHRoZQorICogYWJpbGl0eSBvZiBnZXR0aW5nIHRoZSBzdGF0dXMgb24gc2V2ZXJhbCB2YXJpYWJsZXMgd2l0aGluIHRoZSBDcmF3bERhZW1vbgorICogY2xhc3MuIFNlZSBDcmF3bERhZW1vbiBmb3IgbW9yZSBpbmZvLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIERhZW1vbkNvbnRyb2xsZXIgeworCisgICAgcHJpdmF0ZSBEYWVtb25SbWlJbnRlcmZhY2UgZGFlbW9uOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgLS0gaW5pdGlhbGl6ZXMgdGhlIFhtbFJwY0NsaWVudAorICAgICAqIAorICAgICAqIEBwYXJhbSBjcmF3bFVybFN0cgorICAgICAqICAgICAgICAgICAgVGhlIFVSTCBsb2NhdGlvbiB3aGVyZSB0aGUgQ3Jhd2xEYWVtb24gc2VydmVyIGlzIHJ1bm5pbmcKKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRGFlbW9uQ29udHJvbGxlcihTdHJpbmcgcm1pVXJsKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRhZW1vbiA9IChEYWVtb25SbWlJbnRlcmZhY2UpIE5hbWluZy5sb29rdXAocm1pVXJsKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbighZGFlbW9uLmdldEhhc0JlZW5Ub2xkVG9RdWl0KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXZlcmFnZSB0aW1lIGZvciBlYWNoIHJ1biBvZiB0aGUgQ3Jhd2xlciBjb250cm9sbGVkIGJ5IHRoZQorICAgICAqIENyYXdsRGFlbW9ucworICAgICAqIAorICAgICAqIEByZXR1cm4gQXZlcmFnZSBydW50aW1lIG9mIENyYXdsZXIKKyAgICAgKiBAdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgWG1sUnBjQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIEVycm9yIGNvbW11bmljYXRpbmcgd2l0aCBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBdmVyYWdlUnVuVGltZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGFlbW9uLmdldEF2ZXJhZ2VSdW5UaW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdG90YWwgbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0aGUgQ3Jhd2xlciBpbiBDcmF3bERhZW1vbiBoYXMgYmVlbgorICAgICAqIGNyYXdsaW5nIHNpbmNlIHRoZSBDcmF3bERhZW1vbiB3YXMgY3JlYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0b3RhbCBtaWxsaXNlY29uZHMgd2hpY2ggdGhlIENyYXdsZXIgaGFzIGJlZW4gY3Jhd2xpbmcKKyAgICAgKiBAdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgWG1sUnBjQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIEVycm9yIGNvbW11bmljYXRpbmcgd2l0aCBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXNDcmF3bGluZygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGFlbW9uLmdldE1pbGxpc0NyYXdsaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHNjaGVkdWxlZCBydW4uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgdGltZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIGV4ZWN1dGlvbiBvZiB0aGUgQ3Jhd2xlcgorICAgICAqICAgICAgICAgY29udHJvbGxlZCBieSB0aGUgQ3Jhd2xEYWVtb24KKyAgICAgKiBAdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgWG1sUnBjQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIEVycm9yIGNvbW11bmljYXRpbmcgd2l0aCBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRXYWl0SW50ZXJ2YWwoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRhZW1vbi5nZXRUaW1lSW50ZXJ2YWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXJzIG9mIHRpbWVzIHRoZSBDcmF3bGVyIGhhcyBiZWVuIHJ1biBieSB0aGUgQ3Jhd2xEYWVtb24KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBvZiB0aW1lcyBDcmF3bGVyIGhhcyBleGVjdXRlZAorICAgICAqIEB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBYbWxScGNDb21tdW5pY2F0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtQ3Jhd2xzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkYWVtb24uZ2V0TnVtQ3Jhd2xzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIENyYXdsZXIgaW4gdGhlIENyYXdsRGFlbW9uIGlzIHJ1bm5pbmcKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaXMgQ3Jhd2xlciBpcyBydW5uaW5nCisgICAgICogQHRocm93cyBSZW1vdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFhtbFJwY0NvbW11bmljYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggc2VydmVyCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkYWVtb24uaXNSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FrZXMgdGhlIENyYXdsRGFlbW9uIHVwIGFuZCB0ZWxscyBpdCB0byBzdGFydCBjcmF3bGluZyBhZ2Fpbi4gSWYgc3RvcCgpCisgICAgICogd2FzIGNhbGxlZCwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIHRoZSBDcmF3bERhZW1vbiBjb250aW51ZSBmcm9tIHdoZXJlIGl0CisgICAgICogbGVmdCBvZmYuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyB3YWtlIHVwIHRoZSBDcmF3bERhZW1vbiBmcm9tIGl0cyBzbGVlcAorICAgICAqIGJldHdlZW4gc2NoZWR1bGVkIHJ1bnMuCisgICAgICogCisgICAgICogQHRocm93cyBSZW1vdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFhtbFJwY0NvbW11bmljYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggc2VydmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGRhZW1vbi5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBxdWl0KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGRhZW1vbi5xdWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgb2Ygd2hlbiB0aGUgQ3Jhd2xEYWVtb24gd2FzIGNyZWF0ZWQKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lIHRoZSBDcmF3bERhZW1vbiB3YXMgY3JlYXRlZAorICAgICAqIEB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBYbWxScGNDb21tdW5pY2F0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldERhZW1vbkNyZWF0aW9uVGltZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGFlbW9uLmdldERhZW1vbkNyZWF0aW9uVGltZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyaXZlciBtZXRob2QgLS0gc3RhcnRzIHRoZSBDcmF3bERhZW1vbkNvbnRyb2xsZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqICAgICAgICAgICAgU2VlIGRvY3VtZW50YXRpb24KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIE9uIGVycm9yISA6KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXZnQ3Jhd2xPcGVyYXRpb24gPSAiLS1nZXRBdmVyYWdlUnVuVGltZVxuIjsKKyAgICAgICAgU3RyaW5nIGdldE1pbGlzQ3Jhd2xPcGVyYXRpb24gPSAiLS1nZXRNaWxpc0NyYXdsaW5nXG4iOworICAgICAgICBTdHJpbmcgZ2V0TnVtQ3Jhd2xzT3BlcmF0aW9uID0gIi0tZ2V0TnVtQ3Jhd2xzXG4iOworICAgICAgICBTdHJpbmcgZ2V0V2FpdEludGVydmFsT3BlcmF0aW9uID0gIi0tZ2V0V2FpdEludGVydmFsXG4iOworICAgICAgICBTdHJpbmcgaXNSdW5uaW5nT3BlcmF0aW9uID0gIi0taXNSdW5uaW5nXG4iOworICAgICAgICBTdHJpbmcgc3RvcE9wZXJhdGlvbiA9ICItLXN0b3BcbiI7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJDcmF3bENvbnRyb2xsZXIgLS11cmwgPHVybCB0byB4bWwgcnBjIHNlcnZpY2U+ICIKKyAgICAgICAgICAgICAgICArICItLW9wZXJhdGlvbiBbPG9wZXJhdGlvbj4gW3BhcmFtc11dXG4iICsgIm9wZXJhdGlvbnM6XG4iCisgICAgICAgICAgICAgICAgKyBhdmdDcmF3bE9wZXJhdGlvbiArIGdldE1pbGlzQ3Jhd2xPcGVyYXRpb24KKyAgICAgICAgICAgICAgICArIGdldE51bUNyYXdsc09wZXJhdGlvbiArIGdldFdhaXRJbnRlcnZhbE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICsgaXNSdW5uaW5nT3BlcmF0aW9uICsgc3RvcE9wZXJhdGlvbjsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGwsIHVybCA9IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tb3BlcmF0aW9uIikpIHsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXVybCIpKSB7CisgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBjb250cm9sbGVyCisgICAgICAgIERhZW1vbkNvbnRyb2xsZXIgY29udHJvbGxlciA9IG5ldyBEYWVtb25Db250cm9sbGVyKHVybCk7CisgICAgICAgIGlmIChvcGVyYXRpb24uZXF1YWxzKCItLWdldEF2ZXJhZ2VSdW5UaW1lIikpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhdmdDcmF3bFRpbWUgPSBjb250cm9sbGVyLmdldEF2ZXJhZ2VSdW5UaW1lKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF2ZXJhZ2UgQ3Jhd2wgVGltZTogWyIgKyBhdmdDcmF3bFRpbWUgKyAiXSIpOworICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi0tZ2V0TWlsaXNDcmF3bGluZyIpKSB7CisgICAgICAgICAgICBsb25nIGNyYXdsVGltZSA9IGNvbnRyb2xsZXIuZ2V0TWlsbGlzQ3Jhd2xpbmcoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgQ3Jhd2wgVGltZTogWyIgKyBjcmF3bFRpbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiXSBtaWxpc2Vjb25kcyIpOworICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi0tZ2V0TnVtQ3Jhd2xzIikpIHsKKyAgICAgICAgICAgIGludCBudW1DcmF3bHMgPSBjb250cm9sbGVyLmdldE51bUNyYXdscygpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW0gQ3Jhd2xzOiBbIiArIG51bUNyYXdscyArICJdIik7CisgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmVxdWFscygiLS1nZXRXYWl0SW50ZXJ2YWwiKSkgeworICAgICAgICAgICAgbG9uZyB3YWl0SW50ZXJ2YWwgPSBjb250cm9sbGVyLmdldFdhaXRJbnRlcnZhbCgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXYWl0IEludGVydmFsOiBbIiArIHdhaXRJbnRlcnZhbCArICJdIik7CisgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmVxdWFscygiLS1pc1J1bm5pbmciKSkgeworICAgICAgICAgICAgYm9vbGVhbiBydW5uaW5nID0gY29udHJvbGxlci5pc1J1bm5pbmcoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihydW5uaW5nID8gIlllcyIgOiAiTm8iKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIE9wZXJhdGlvbiEiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25MYXVuY2hlci5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbkxhdW5jaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxNWJhNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25MYXVuY2hlci5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZGFlbW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5EYWVtb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLlJlbW90ZVNwZWNzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OworaW1wb3J0IGphdmEucm1pLnJlZ2lzdHJ5LkxvY2F0ZVJlZ2lzdHJ5OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9KTVggaW1wb3J0cworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGNsYXNzIERhZW1vbkxhdW5jaGVyIGltcGxlbWVudHMgRGFlbW9uTGF1bmNoZXJNQmVhbiB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERhZW1vbkxhdW5jaGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgQ29uZmlnIGNvbmZpZzsKKworICAgIHByaXZhdGUgUmVtb3RlU3BlY3MgcnM7CisKKyAgICBwcml2YXRlIGludCBybWlSZWdpc3RyeVBvcnQ7CisKKyAgICBwcml2YXRlIGludCBuZXh0RGFlbW9uSWQ7CisKKyAgICBwcml2YXRlIERhZW1vbk1hbmFnZXIgZG07CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8RGFlbW9uPiBhY3RpdmVEYWVtb25MaXN0OworCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PEZpbGU+IHNpdGVzRmlsZXM7CisKKyAgICBwcml2YXRlIEZpbGUgcHJvcGVydGllc0ZpbGU7CisKKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1iczsKKworICAgIHB1YmxpYyBEYWVtb25MYXVuY2hlcihpbnQgcm1pUmVnaXN0cnlQb3J0LCBGaWxlIHByb3BlcnRpZXNGaWxlLAorICAgICAgICAgICAgTGlua2VkTGlzdDxGaWxlPiBzaXRlc0ZpbGVzKSB7CisgICAgICAgIHRoaXMucm1pUmVnaXN0cnlQb3J0ID0gcm1pUmVnaXN0cnlQb3J0OworICAgICAgICBuZXh0RGFlbW9uSWQgPSAwOworICAgICAgICBkbSA9IG5ldyBEYWVtb25NYW5hZ2VyKCk7CisgICAgICAgIGFjdGl2ZURhZW1vbkxpc3QgPSBuZXcgTGlua2VkTGlzdDxEYWVtb24+KCk7CisgICAgICAgIHRoaXMuc2l0ZXNGaWxlcyA9IHNpdGVzRmlsZXM7CisgICAgICAgIHRoaXMucHJvcGVydGllc0ZpbGUgPSBwcm9wZXJ0aWVzRmlsZTsKKyAgICAgICAgcmVnaXN0ZXJKTVgoKTsKKyAgICAgICAgdGhpcy5jb25maWd1cmUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJKTVgoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2NhdGVSZWdpc3RyeS5jcmVhdGVSZWdpc3RyeSh0aGlzLnJtaVJlZ2lzdHJ5UG9ydCk7CisgICAgICAgICAgICBtYnMgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBuZXcgT2JqZWN0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZGFlbW9uOnR5cGU9RGFlbW9uTGF1bmNoZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnJtaVJlZ2lzdHJ5UG9ydCk7CisgICAgICAgICAgICBtYnMucmVnaXN0ZXJNQmVhbih0aGlzLCBuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIERhZW1vbkxhdW5jaGVyIGFzIGEgTUJlYW4gT2JqZWN0IDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDb25maWd1cmluZyBEYWVtb25MYXVuY2hlci4gLiAuIik7CisgICAgICAgICAgICBjb25maWcgPSBuZXcgQ29uZmlnKCk7CisgICAgICAgICAgICBjb25maWcubG9hZENvbmZpZ0ZpbGUocHJvcGVydGllc0ZpbGUpOworICAgICAgICAgICAgcnMgPSBuZXcgUmVtb3RlU3BlY3MoKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBzaXRlc0ZpbGUgOiBzaXRlc0ZpbGVzKSB7CisgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLklORk8sICJMb2FkaW5nIFNpdGVJbmZvIGZpbGUgJyIgKyBzaXRlc0ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyIpOworICAgICAgICAgICAgICAgIHJzLmxvYWRSZW1vdGVTcGVjcyhzaXRlc0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gY29uZmlndXJlIERhZW1vbkxhdW5jaGVyIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsYXVuY2hEYWVtb25zKCkgeworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJMYXVuY2hpbmcgRGFlbW9ucyAuIC4gLiIpOworICAgICAgICBmb3IgKERhZW1vbkluZm8gZGFlbW9uSW5mbyA6IHJzLmdldERhZW1vbkluZm9MaXN0KCkpIHsKKyAgICAgICAgICAgIGludCBjdXJEYWVtb25JRCA9IHRoaXMuZ2V0TmV4dERhZW1vbklkKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERhZW1vbiBkYWVtb24gPSBuZXcgRGFlbW9uKHRoaXMucm1pUmVnaXN0cnlQb3J0LCBjdXJEYWVtb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLCBkYWVtb25JbmZvLCBycy5nZXRTaXRlSW5mbygpKTsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDcmVhdGluZyBEYWVtb24gd2l0aCBJRCA9ICIgKyBjdXJEYWVtb25JRCk7CisgICAgICAgICAgICAgICAgZGFlbW9uLnJlZ2lzdGVyRGFlbW9uTGlzdGVuZXIoZG0pOworICAgICAgICAgICAgICAgIGRhZW1vbi5zdGFydERhZW1vbigpOworICAgICAgICAgICAgICAgIGFjdGl2ZURhZW1vbkxpc3QuYWRkKGRhZW1vbik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGNyZWF0ZSBEYWVtb24gd2l0aCBJRCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY3VyRGFlbW9uSUQgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXROZXh0RGFlbW9uSWQoKSB7CisgICAgICAgIHdoaWxlICh0aGlzLmRtLmdldFVzZWRJRHMoKS5jb250YWlucygrK3RoaXMubmV4dERhZW1vbklkKSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgcmV0dXJuIHRoaXMubmV4dERhZW1vbklkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hEYWVtb25zKCkgeworICAgICAgICB0aGlzLmtpbGxBbGxEYWVtb25zKCk7CisKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUmVmcmVzaGluZyBEYWVtb25zIC4gLiAuIik7CisgICAgICAgIHRoaXMuY29uZmlndXJlKCk7CisgICAgICAgIGxhdW5jaERhZW1vbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQga2lsbEFsbERhZW1vbnMoKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIktpbGxpbmcgY3VycmVudCBEYWVtb25zIC4gLiAuIik7CisgICAgICAgIHRoaXMubmV4dERhZW1vbklkID0gMDsKKyAgICAgICAgZm9yIChEYWVtb24gZGFlbW9uIDogdGhpcy5hY3RpdmVEYWVtb25MaXN0KSB7CisgICAgICAgICAgICBpZiAoIWRhZW1vbi5nZXRIYXNCZWVuVG9sZFRvUXVpdCgpKQorICAgICAgICAgICAgICAgIGRhZW1vbi5xdWl0KCk7CisgICAgICAgIH0KKyAgICAgICAgYWN0aXZlRGFlbW9uTGlzdC5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSB2aWV3RGFlbW9uV2FpdGluZ0xpc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRtLmdldFF1ZXVlTGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBxdWl0KCkgeworICAgICAgICB0aGlzLmtpbGxBbGxEYWVtb25zKCk7CisgICAgICAgIHRoaXMubm90aWZ5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisgICAgICAgIGludCBybWlSZWdQb3J0ID0gLTE7CisgICAgICAgIEZpbGUgcHJvcGVydGllc0ZpbGUgPSBudWxsOworICAgICAgICBMaW5rZWRMaXN0PEZpbGU+IHNpdGVzRmlsZXMgPSBuZXcgTGlua2VkTGlzdDxGaWxlPigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXJtaVJlZ2lzdHJ5UG9ydCIpKQorICAgICAgICAgICAgICAgIHJtaVJlZ1BvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1wcm9wZXJ0aWVzRmlsZSIpKQorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNGaWxlID0gbmV3IEZpbGUoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXJlbW90ZVNwZWNzRmlsZSIpKQorICAgICAgICAgICAgICAgIHNpdGVzRmlsZXMuYWRkKG5ldyBGaWxlKGFyZ3NbKytpXSkpOworICAgICAgICB9CisKKyAgICAgICAgRGFlbW9uTGF1bmNoZXIgZGFlbW9uTGF1bmNoZXIgPSBuZXcgRGFlbW9uTGF1bmNoZXIocm1pUmVnUG9ydCwKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzRmlsZSwgc2l0ZXNGaWxlcyk7CisKKyAgICAgICAgZGFlbW9uTGF1bmNoZXIubGF1bmNoRGFlbW9ucygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGRhZW1vbkxhdW5jaGVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhZW1vbkxhdW5jaGVyLndhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9kYWVtb24vRGFlbW9uTGF1bmNoZXJNQmVhbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbkxhdW5jaGVyTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmI2MzdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbkxhdW5jaGVyTUJlYW4uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZGFlbW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBEYWVtb25MYXVuY2hlck1CZWFuIHsKKworICAgIHB1YmxpYyB2b2lkIGtpbGxBbGxEYWVtb25zKCk7CisKKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoRGFlbW9ucygpOworCisgICAgcHVibGljIHZvaWQgcXVpdCgpOworCisgICAgcHVibGljIFN0cmluZ1tdIHZpZXdEYWVtb25XYWl0aW5nTGlzdCgpOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9kYWVtb24vRGFlbW9uTGlzdGVuZXIuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MGRmZDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9kYWVtb24vRGFlbW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZGFlbW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIERhZW1vbkxpc3RlbmVyIHsKKworICAgIHB1YmxpYyB2b2lkIHdhc1JlZ2lzdGVyZWRXaXRoKERhZW1vbiBkYWVtb24pOworCisgICAgcHVibGljIHZvaWQgd2FzVW5yZWdpc3RlcmVkV2l0aChEYWVtb24gZGFlbW9uKTsKKworICAgIHB1YmxpYyB2b2lkIGRhZW1vblN0YXJ0aW5nKERhZW1vbiBkYWVtb24pOworCisgICAgcHVibGljIHZvaWQgZGFlbW9uRmluaXNoZWQoRGFlbW9uIGRhZW1vbik7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25NQmVhbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbk1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2ZTZjYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25NQmVhbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5kYWVtb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGFlbW9uTUJlYW4geworCisgICAgLyoqCisgICAgICogV2lsbCB0ZXJtaW5hdGUgdGhlIENyYXdsRGFlbW9uLiBJZiBpdHMgQ3Jhd2xlciBpcyBjcmF3bGluZyBhIHNpdGUgd2hlbgorICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHRlcm1pbmF0ZSB3b24ndCB0YWtlIHBsYWNlIHVudGlsIGFmdGVyIHRoZQorICAgICAqIENyYXdsZXIgaGFzIGNvbXBsZXRlIGNyYXdsaW5nIHRoYXQgc2l0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcXVpdCgpOworCisgICAgLyoqCisgICAgICogQ2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIENyYXdsZXIgaXMgcHJlc2VudGx5IHJ1bm5pbmcKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgQ3Jhd2xlciBpcyBydW5ubmluZworICAgICAqIEB1bWwucHJvcGVydHkgbmFtZT0iaXNSdW5uaW5nIgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SGFzQmVlblRvbGRUb1F1aXQoKTsKKworICAgIHB1YmxpYyBsb25nIGdldFRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCk7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRFcHNpbG9uSW5NaWxsaXNlY29uZHMoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldFJ1bk9uUmVib290KCk7CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRGaXJzdFJ1bkRhdGVUaW1lKCk7CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZG93bmxvYWRlZEZpbGVzSW5TdGFnaW5nQXJlYSgpOworCisgICAgcHVibGljIFN0cmluZ1tdIGRvd25sb2FkaW5nRmlsZXNJblN0YWdpbmdBcmVhKCk7CisKKyAgICBwdWJsaWMgaW50IG51bWJlck9mRmlsZXNEb3dubG9hZGVkSW5TdGFnaW5nQXJlYSgpOworCisgICAgcHVibGljIGludCBudW1iZXJPZkZpbGVzRG93bmxvYWRpbmdJblN0YWdpbmdBcmVhKCk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFGaWxlc1JlbW90ZVNpdGUoKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YUZpbGVzUmVuYW1pbmdDb252KCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxldGVEYXRhRmlsZXNGcm9tU2VydmVyKCk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5TWV0YWRhdGFFbGVtZW50TmFtZSgpOworCisgICAgcHVibGljIEZpbGUgZ2V0RGF0YUZpbGVzU3RhZ2luZ0FyZWEoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldEFsbG93QWxpYXNPdmVycmlkZSgpOworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUZpbGVzUmVtb3RlU2l0ZSgpOworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUZpbGVzUmVuYW1pbmdDb252KCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxldGVQcm9wZXJ0eUZpbGVzRnJvbVNlcnZlcigpOworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUZpbGVzT25TdWNjZXNzRGlyKCk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RmlsZXNPbkZhaWxEaXIoKTsKKworICAgIHB1YmxpYyBGaWxlIGdldFByb3BlcnR5RmlsZXNMb2NhbERpcigpOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9kYWVtb24vRGFlbW9uTWFuYWdlci5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Q5YWNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhZW1vbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIERhZW1vbk1hbmFnZXIgaW1wbGVtZW50cyBEYWVtb25MaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8RGFlbW9uPiB3YWl0aW5nTGlzdDsKKworICAgIHByaXZhdGUgSGFzaFNldDxJbnRlZ2VyPiB1c2VkSURzOworCisgICAgcHJpdmF0ZSBEYWVtb24gcnVubmluZ0RhZW1vbjsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRGFlbW9uTWFuYWdlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgRGFlbW9uTWFuYWdlcigpIHsKKyAgICAgICAgd2FpdGluZ0xpc3QgPSBuZXcgTGlua2VkTGlzdDxEYWVtb24+KCk7CisgICAgICAgIHVzZWRJRHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworICAgICAgICBydW5uaW5nRGFlbW9uID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzUnVubmluZ0RhZW1vbnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLndhaXRpbmdMaXN0LnNpemUoKSA+IDAgfHwgdGhpcy5ydW5uaW5nRGFlbW9uICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyV2FpdGluZ0xpc3QoKSB7CisgICAgICAgIHRoaXMud2FpdGluZ0xpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd2FzUmVnaXN0ZXJlZFdpdGgoRGFlbW9uIGRhZW1vbikgeworICAgICAgICB0aGlzLnVzZWRJRHMuYWRkKG5ldyBJbnRlZ2VyKGRhZW1vbi5nZXREYWVtb25JRCgpKSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdhc1VucmVnaXN0ZXJlZFdpdGgoRGFlbW9uIGRhZW1vbikgeworICAgICAgICB0aGlzLnVzZWRJRHMucmVtb3ZlKG5ldyBJbnRlZ2VyKGRhZW1vbi5nZXREYWVtb25JRCgpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGFlbW9uU3RhcnRpbmcoRGFlbW9uIGRhZW1vbikgeworICAgICAgICBpZiAoIXRoaXMuc2V0QXNSdW5uaW5nKGRhZW1vbikpIHsKKyAgICAgICAgICAgIGRhZW1vbi5wYXVzZURhZW1vbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGFlbW9uRmluaXNoZWQoRGFlbW9uIGRhZW1vbikgeworICAgICAgICBpZiAoZGFlbW9uLmVxdWFscyh0aGlzLnJ1bm5pbmdEYWVtb24pKQorICAgICAgICAgICAgdGhpcy5zdGFydE5leHRPbldhaXRpbmdMaXN0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMud2FpdGluZ0xpc3QucmVtb3ZlKGRhZW1vbik7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBIYXNoU2V0PEludGVnZXI+IGdldFVzZWRJRHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVzZWRJRHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRBc1J1bm5pbmcoRGFlbW9uIGRhZW1vbikgeworICAgICAgICBpZiAocnVubmluZ0RhZW1vbiA9PSBudWxsKSB7CisgICAgICAgICAgICBydW5uaW5nRGFlbW9uID0gZGFlbW9uOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGFlbW9uIHdpdGggSUQgPSAiICsgZGFlbW9uLmdldERhZW1vbklEKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBnaXZlbiBwZXJtaXNzaW9uIHRvIHJ1biIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJEYWVtb24gd2l0aCBJRCA9ICIgKyBkYWVtb24uZ2V0RGFlbW9uSUQoKQorICAgICAgICAgICAgICAgICAgICArICIgd2FzIGFkZGVkIHRvIHRoZSBEYWVtb25NYW5hZ2VyJ3Mgd2FpdGluZyBsaXN0Iik7CisgICAgICAgICAgICB3YWl0aW5nTGlzdC5hZGQoZGFlbW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RhcnROZXh0T25XYWl0aW5nTGlzdCgpIHsKKyAgICAgICAgaWYgKHdhaXRpbmdMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJ1bm5pbmdEYWVtb24gPSB3YWl0aW5nTGlzdC5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRGFlbW9uIHdpdGggSUQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgcnVubmluZ0RhZW1vbi5nZXREYWVtb25JRCgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3YXMgZ2l2ZW4gcGVybWlzc2lvbiB0byBydW4iKTsKKyAgICAgICAgICAgIHJ1bm5pbmdEYWVtb24ucmVzdW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW5uaW5nRGFlbW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0UXVldWVMaXN0KCkgeworICAgICAgICBTdHJpbmdbXSBxdWV1ZSA9IG5ldyBTdHJpbmdbdGhpcy53YWl0aW5nTGlzdC5zaXplKCldOworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIGZvciAoRGFlbW9uIGRhZW1vbiA6IHRoaXMud2FpdGluZ0xpc3QpIHsKKyAgICAgICAgICAgIHF1ZXVlW2NvdW50ZXIrK10gPSBkYWVtb24uZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxdWV1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25SbWlJbnRlcmZhY2UuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2RhZW1vbi9EYWVtb25SbWlJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWE1NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZGFlbW9uL0RhZW1vblJtaUludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5kYWVtb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGU7CitpbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBEYWVtb25SbWlJbnRlcmZhY2UgZXh0ZW5kcyBSZW1vdGUgeworCisgICAgLyoqCisgICAgICogV2FrZXMgdXAgdGhlIENyYXdsRGFlbW9uIGlmIGl0IGlzIHNsZWVwaW5nCisgICAgICogCisgICAgICogQHJldHVybiBBbHdheXMgdHJ1ZSAtLSBkb25lIGJlY2F1c2Ugb2YgWG1sUnBjIGNvbW11bmljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV2lsbCB0ZXJtaW5hdGUgdGhlIENyYXdsRGFlbW9uLiBJZiBpdHMgQ3Jhd2xlciBpcyBjcmF3bGluZyBhIHNpdGUgd2hlbgorICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHRlcm1pbmF0ZSB3b24ndCB0YWtlIHBsYWNlIHVudGlsIGFmdGVyIHRoZQorICAgICAqIENyYXdsZXIgaGFzIGNvbXBsZXRlIGNyYXdsaW5nIHRoYXQgc2l0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcXVpdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgQ3Jhd2xlciBpcyBwcmVzZW50bHkgcnVubmluZworICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBDcmF3bGVyIGlzIHJ1bm5uaW5nCisgICAgICogQHVtbC5wcm9wZXJ0eSBuYW1lPSJpc1J1bm5pbmciCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEF2ZXJhZ2UgcnVudGltZSBmb3IgdGhlIENyYXdsZXIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGF2ZXJhZ2UgcnVudGltZSBmb3IgdGhlIENyYXdsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBdmVyYWdlUnVuVGltZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0b3RhbCBjcmF3bGluZyB0aW1lIG9mIHRoZSBDcmF3bGVyCisgICAgICogCisgICAgICogQHJldHVybiBUb3RhbCBjcmF3bGluZyB0aW1lIG9mIENyYXdsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXNDcmF3bGluZygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGJldHdlZW4gdGhlIHN0YXJ0IG9mIENyYXdsZXIgZXhlY3V0aW9ucworICAgICAqIAorICAgICAqIEByZXR1cm4gVGltZSBpbnRlcnZhbCBiZXR3ZWVuIENyYXdsZXIgc3RhcnQgdGltZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lSW50ZXJ2YWwoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBDcmF3bGVyIGhhcyBiZWVuIHJ1bgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBDcmF3bGVyIGhhcyBydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUNyYXdscygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3Igd2hlbiB0aGUgQ3Jhd2xEYWVtb24gY29uc3RydWN0b3Igd2FzCisgICAgICogaW52b2tlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHVtbC5wcm9wZXJ0eSBuYW1lPSJkYWVtb25DcmVhdGlvblRpbWUiCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGFlbW9uQ3JlYXRpb25UaW1lKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBib29sZWFuIGdldEhhc0JlZW5Ub2xkVG9RdWl0KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9BbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9BbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGEyZjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL0FscmVhZHlJbkRhdGFiYXNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBBbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbiBleHRlbmRzIFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNjgzMjI2NjMwNTM3NTg2NzVMOworCisgICAgcHVibGljIEFscmVhZHlJbkRhdGFiYXNlRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBBbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9Db25maWdFeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvQ29uZmlnRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4NDQ0YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvQ29uZmlnRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWdFeGNlcHRpb24gZXh0ZW5kcyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNzU2NzIxOTU4MDY4MjE3NzUyTDsKKworICAgIHB1YmxpYyBDb25maWdFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uZmlnRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobWVzc2FnZSwgdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvQ3Jhd2xEYWVtb25FeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvQ3Jhd2xEYWVtb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVmODFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9DcmF3bERhZW1vbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ3Jhd2xEYWVtb25FeGNlcHRpb24gZXh0ZW5kcyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0ODEzMTM0MDc5MzcxNDAyMjE4TDsKKworICAgIHB1YmxpYyBDcmF3bERhZW1vbkV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3Jhd2xEYWVtb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9DcmF3bGVyRXhjZXB0aW9uLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL0NyYXdsZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQzNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9DcmF3bGVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBDcmF3bGVyRXhjZXB0aW9uIGV4dGVuZHMgUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjgxMjI2MzY4NzgzMDAzMTM5MEw7CisKKyAgICBwdWJsaWMgQ3Jhd2xlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3Jhd2xlckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIENyYXdsZXJFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHQpIHsKKyAgICAgIHN1cGVyKG1zZywgdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9GaWxlUmVzdHJpY3Rpb25zRXhjZXB0aW9uLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL0ZpbGVSZXN0cmljdGlvbnNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJlZmZhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9GaWxlUmVzdHJpY3Rpb25zRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlUmVzdHJpY3Rpb25zRXhjZXB0aW9uIGV4dGVuZHMgUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjQyOTgwNzc0MzYyNDE1NDQ0MUw7CisKKyAgICBwdWJsaWMgRmlsZVJlc3RyaWN0aW9uc0V4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZVJlc3RyaWN0aW9uc0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9NZXRFeHRyYWN0b3JFeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvTWV0RXh0cmFjdG9yRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1ZDQ4ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvTWV0RXh0cmFjdG9yRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRFeHRyYWN0b3JFeGNlcHRpb24gZXh0ZW5kcyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTA3NTg2OTA5MDA5ODU3MDA5MUw7CisKKyAgICBwdWJsaWMgTWV0RXh0cmFjdG9yRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRFeHRyYWN0b3JFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvTWV0aG9kRXhjZXB0aW9uLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL01ldGhvZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjN2Q5MzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL01ldGhvZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kRXhjZXB0aW9uIGV4dGVuZHMgUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg3MTcxMTQ5Mjk4NTE4OTE4MTJMOworCisgICAgcHVibGljIE1ldGhvZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1BhcnNlckV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9QYXJzZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRmNDRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9QYXJzZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlckV4Y2VwdGlvbiBleHRlbmRzIFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ2NTQ5NzE4MzcyNDY3MzEwNTdMOworCisgICAgcHVibGljIFBhcnNlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyc2VyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFBhcnNlckV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgc3VwZXIobXNnLCB0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1Byb3RvY29sRGVsZXRpb25FcnJvci5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9Qcm90b2NvbERlbGV0aW9uRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVkYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9Qcm90b2NvbERlbGV0aW9uRXJyb3IuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFByb3RvY29sRGVsZXRpb25FcnJvciBleHRlbmRzIFByb3RvY29sRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIyMDk2MDExODczOTcyNzM0MTRMOworCisgICAgcHVibGljIFByb3RvY29sRGVsZXRpb25FcnJvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvdG9jb2xEZWxldGlvbkVycm9yKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1Byb3RvY29sRXhjZXB0aW9uLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1Byb3RvY29sRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyM2ZiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvUHJvdG9jb2xFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU1ODUyNjM5MjQ5MjUyMzA3MTFMOworCisgICAgcHVibGljIFByb3RvY29sRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1Byb3RvY29sRmlsZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9Qcm90b2NvbEZpbGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzJiOWFjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9Qcm90b2NvbEZpbGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFByb3RvY29sRmlsZUV4Y2VwdGlvbiBleHRlbmRzIFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU1MTgwNzUyNjU5NzI3MTA2NzlMOworCisgICAgcHVibGljIFByb3RvY29sRmlsZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvdG9jb2xGaWxlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFiZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9QdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zOworCisvKioKKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE1MDAzNTg2NjYyNDMzODM1NjdMOworCisgICAgcHVibGljIFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uLmFkZENhbGxpbmdDbGFzc1RvTXNnKG1zZykpOworICAgIH0KKworICAgIHB1YmxpYyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgIHN1cGVyKFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uLmFkZENhbGxpbmdDbGFzc1RvTXNnKG1zZyksIHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRDYWxsaW5nQ2xhc3NUb01zZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJvd2FibGUgc3RhY2sgPSBuZXcgVGhyb3dhYmxlKCk7CisgICAgICAgICAgICBzdGFjay5maWxsSW5TdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBzcGxpdE5hbWUgPSBzdGFjay5nZXRTdGFja1RyYWNlKClbM10uZ2V0Q2xhc3NOYW1lKCkuc3BsaXQoCisgICAgICAgICAgICAgICAgICAgICJcXC4iKTsKKyAgICAgICAgICAgIHJldHVybiAiWyIgKyBzcGxpdE5hbWVbc3BsaXROYW1lLmxlbmd0aCAtIDFdICsgIl0gIiArIG1zZzsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiW1Vua25vd25dICIgKyBtc2c7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1JlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDVjNWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1JlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9uczsKKworLyoqCisgKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg2OTQ5MDc4MTcyMDExNjE1MDJMOworCisgICAgcHVibGljIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0KSB7CisgICAgICAgc3VwZXIobXNnLCB0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvUmV0cmlldmFsTWV0aG9kRXhjZXB0aW9uLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1JldHJpZXZhbE1ldGhvZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNGVlMTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leGNlcHRpb25zL1JldHJpZXZhbE1ldGhvZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUmV0cmlldmFsTWV0aG9kRXhjZXB0aW9uIGV4dGVuZHMgUHVzaFB1bGxGcmFtZXdvcmtFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzEwNDg0MTc2MTk5NTIyTDsKKworICAgIHB1YmxpYyBSZXRyaWV2YWxNZXRob2RFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFJldHJpZXZhbE1ldGhvZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9UaHJlYWRFdmFsdWF0b3JFeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvVGhyZWFkRXZhbHVhdG9yRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0MjMwZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvVGhyZWFkRXZhbHVhdG9yRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRFdmFsdWF0b3JFeGNlcHRpb24gZXh0ZW5kcyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOTc0MjE1MTIxNDIwMjY0MTYyTDsKKworICAgIHB1YmxpYyBUaHJlYWRFdmFsdWF0b3JFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFRocmVhZEV2YWx1YXRvckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9Ub01hbnlGYWlsZWREb3dubG9hZHNFeGNlcHRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvVG9NYW55RmFpbGVkRG93bmxvYWRzRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxY2I0YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvVG9NYW55RmFpbGVkRG93bmxvYWRzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUb01hbnlGYWlsZWREb3dubG9hZHNFeGNlcHRpb24gZXh0ZW5kcyBQdXNoUHVsbEZyYW1ld29ya0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTYwMzcwMDE5MjU0MzQ5NjUwNUw7CisKKyAgICBwdWJsaWMgVG9NYW55RmFpbGVkRG93bmxvYWRzRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBUb01hbnlGYWlsZWREb3dubG9hZHNFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhjZXB0aW9ucy9VbmRlZmluZWRUeXBlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1M2VlOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4Y2VwdGlvbnMvVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbiBleHRlbmRzIFB1c2hQdWxsRnJhbWV3b3JrRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MjE3NTE4ODYwOTY3ODc4NTk4TDsKKworICAgIHB1YmxpYyBVbmRlZmluZWRUeXBlRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBVbmRlZmluZWRUeXBlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9HbG9iYWxWYXJpYWJsZXMuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL0dsb2JhbFZhcmlhYmxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTA1NTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9HbG9iYWxWYXJpYWJsZXMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIEdsb2JhbFZhcmlhYmxlcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBWYXJpYWJsZT4gaGFzaE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFyaWFibGU+KCk7CisKKyAgICBwcml2YXRlIEdsb2JhbFZhcmlhYmxlcygpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL01ldGhvZC5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhwcmVzc2lvbnMvTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzNmRjMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL01ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLk1ldGhvZEV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE1ldGhvZCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5maXg7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8VmFyaWFibGU+IGFyZ3M7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8U3RyaW5nPiBhcmdOYW1lczsKKworICAgIHByaXZhdGUgTGlua2VkTGlzdDxJbnRlZ2VyPiBhcmdUeXBlczsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgSU5UID0gMDsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgU1RSSU5HID0gMTsKKworICAgIHB1YmxpYyBNZXRob2QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgYXJncyA9IG5ldyBMaW5rZWRMaXN0PFZhcmlhYmxlPigpOworICAgICAgICBhcmdOYW1lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgYXJnVHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFyZ1NpZ25hdHVyZShTdHJpbmcgbmFtZSwgaW50IHR5cGUpIHsKKyAgICAgICAgYXJnTmFtZXMuYWRkKG5hbWUpOworICAgICAgICBhcmdUeXBlcy5hZGQobmV3IEludGVnZXIodHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFyZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGludCBuZXh0TG9jID0gYXJncy5zaXplKCk7CisgICAgICAgIGlmIChuZXh0TG9jID49IDApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYXJnVHlwZXMuZ2V0KG5leHRMb2MpLmludFZhbHVlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIGFkZEFyZyhuZXcgVmFyaWFibGUobnVsbCwgbmV3IEludGVnZXIodmFsdWUpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICAgICAgICBhZGRBcmcobmV3IFZhcmlhYmxlKG51bGwsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBcmcoVmFyaWFibGUgdikgeworICAgICAgICBhcmdzLmFkZExhc3Qodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmVoYXZvaXIoU3RyaW5nIGluZml4KSB7CisgICAgICAgIHRoaXMuaW5maXggPSBpbmZpeDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8VmFsaWRJbnB1dD4gY29udmVydChTdHJpbmcgaW5maXgpIHRocm93cyBNZXRob2RFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlua2VkTGlzdDxWYWxpZElucHV0PiBvdXRwdXQgPSBuZXcgTGlua2VkTGlzdDxWYWxpZElucHV0PigpOworICAgICAgICAgICAgU3RhY2s8VmFsaWRJbnB1dD4gc3RhY2sgPSBuZXcgU3RhY2s8VmFsaWRJbnB1dD4oKTsKKyAgICAgICAgICAgIGNoYXJbXSBpbmZpeEFycmF5ID0gaW5maXgudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5maXhBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGluZml4QXJyYXlbaV07CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJOZXh0IEMgPSAiICsgYyk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB2YXJpYWJsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdsb2JhbFZhciA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgJCBieSBpbmNyIGkgYW5kIGlmIHRydWUgdGhlbiB2YXJpYWJsZSBpcyBhIGdsb2JhbAorICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSBhbmQgc2tpcCAneycgYnkgaW5jciBpIGFnYWluCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZpeEFycmF5WysraV0gPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBpbmZpeEFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gaW5maXhBcnJheVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2ggPSAiICsgY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA8PSAnWicgJiYgY2ggPj0gJ0EnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPD0gJ3onICYmIGNoID49ICdhJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoIDw9ICc5JyAmJiBjaCA+PSAnMCcpIHx8IGNoID09ICdfJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkTGFzdChHbG9iYWxWYXJpYWJsZXMuaGFzaE1hcC5nZXQodmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkTGFzdChhcmdzLmdldChhcmdOYW1lcy5pbmRleE9mKHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHZhcmlhYmxlSW50U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgICAgICAgICAgICAgIGludCBrID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBrIDwgaW5maXhBcnJheS5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IGluZml4QXJyYXlba107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUludFN0cmluZy5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGRMYXN0KG5ldyBWYXJpYWJsZShudWxsLCBuZXcgSW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUludFN0cmluZy50b1N0cmluZygpKSkpOworICAgICAgICAgICAgICAgICAgICBpID0gayAtIDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgdmFyaWFibGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGwgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGwgPCBpbmZpeEFycmF5Lmxlbmd0aDsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gaW5maXhBcnJheVtsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnIicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVTdHJpbmcuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkTGFzdChuZXcgVmFyaWFibGUobnVsbCwgdmFyaWFibGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJvcGVyYXRvcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdGFjay5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGFzSGlnaGVyUHJlY2VkZW5jZShzdGFjay5wZWVrKCkudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoYXJBdCgwKSwgYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGRMYXN0KHN0YWNrLnBvcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ldyBPcGVyYXRvcihjICsgIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGFjazogIiArIHN0YWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RhY2suZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRJbnB1dCB2aSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpLnRvU3RyaW5nKCkuY2hhckF0KDApID09ICcoJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGRMYXN0KHZpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXcgUHVuY3R1YXRpb24oYyArICIiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCFzdGFjay5lbXB0eSgpKQorICAgICAgICAgICAgICAgIG91dHB1dC5hZGRMYXN0KHN0YWNrLnBvcCgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRob2RFeGNlcHRpb24oIkZhaWxlZCB0byBjb252ZXJ0IGluZml4IHRvIHBvc3RmaXggOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBleGVjdXRlKCkgdGhyb3dzIE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdGFjazxWYWxpZElucHV0PiBzdGFjayA9IG5ldyBTdGFjazxWYWxpZElucHV0PigpOworICAgICAgICAgICAgTGlua2VkTGlzdDxWYWxpZElucHV0PiBwb3N0Zml4ID0gY29udmVydChpbmZpeCk7CisgICAgICAgICAgICBmb3IgKFZhbGlkSW5wdXQgdmkgOiBwb3N0Zml4KSB7CisgICAgICAgICAgICAgICAgaWYgKHZpIGluc3RhbmNlb2YgVmFyaWFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh2aSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aSBpbnN0YW5jZW9mIE9wZXJhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIFZhbGlkSW5wdXQgZmlyc3QgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgVmFsaWRJbnB1dCBzZWNvbmQgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh2aS50b1N0cmluZygpLmNoYXJBdCgwKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKFZhcmlhYmxlKSBmaXJzdCkuaXNTdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKFZhcmlhYmxlKSBzZWNvbmQpLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZWNvbmQudG9TdHJpbmcoKSArIGZpcnN0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXcgVmFyaWFibGUobnVsbCwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChWYXJpYWJsZSkgZmlyc3QpLmlzSW50ZWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoVmFyaWFibGUpIHNlY29uZCkuaXNJbnRlZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gbmV3IEludGVnZXIoKChJbnRlZ2VyKSBzZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoSW50ZWdlcikgZmlyc3QuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXcgVmFyaWFibGUobnVsbCwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGhvZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIENvbmNhdGluYXRpb24vQWRkaXRpb24gdHlwZXMuIC4gLm11c3QgYmUgU3RyaW5nIG9yIEludGVnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKFZhcmlhYmxlKSBmaXJzdCkuaXNJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChWYXJpYWJsZSkgc2Vjb25kKS5pc0ludGVnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBuZXcgSW50ZWdlcigoKEludGVnZXIpIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkpLmludFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChJbnRlZ2VyKSBmaXJzdC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ldyBWYXJpYWJsZShudWxsLCB2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0aG9kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgU3VidHJhY3Rpb24gdHlwZXMuIC4gLm11c3QgYmUgSW50ZWdlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoVmFyaWFibGUpIGZpcnN0KS5pc0ludGVnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKFZhcmlhYmxlKSBzZWNvbmQpLmlzSW50ZWdlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IG5ldyBJbnRlZ2VyKCgoSW50ZWdlcikgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoKEludGVnZXIpIGZpcnN0LmdldFZhbHVlKCkpLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobmV3IFZhcmlhYmxlKG51bGwsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRob2RFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBNdWx0aXBsaWNhdGlvbiB0eXBlcy4gLiAubXVzdCBiZSBJbnRlZ2VyIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChWYXJpYWJsZSkgZmlyc3QpLmlzSW50ZWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoVmFyaWFibGUpIHNlY29uZCkuaXNJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChJbnRlZ2VyKSAoKFZhcmlhYmxlKSBmaXJzdCkuZ2V0VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50VmFsdWUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gbmV3IEludGVnZXIoKChJbnRlZ2VyKSBzZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICgoSW50ZWdlcikgZmlyc3QuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXcgVmFyaWFibGUobnVsbCwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGhvZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIERpdmlzaW9uIHR5cGVzLiAuIC5tdXN0IGJlIEludGVnZXIgYW5kIGRlbm9taW5hdG9yIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpLmdldFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0aG9kRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSBtZXRob2QgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRvZXMgZmlyc3QgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHNlY29uZAorICAgIHByaXZhdGUgYm9vbGVhbiBoYXNIaWdoZXJQcmVjZWRlbmNlKGNoYXIgZmlyc3QsIGNoYXIgc2Vjb25kKSB7CisgICAgICAgIHN3aXRjaCAoZmlyc3QpIHsKKyAgICAgICAgY2FzZSAnKyc6CisgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgc3dpdGNoIChzZWNvbmQpIHsKKyAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgJyonOgorICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL09wZXJhdG9yLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9PcGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZjE2YTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9PcGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leHByZXNzaW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIE9wZXJhdG9yIGltcGxlbWVudHMgVmFsaWRJbnB1dCB7CisKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBPcGVyYXRvcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZXhwcmVzc2lvbnMvUHVuY3R1YXRpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL1B1bmN0dWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxMDhhZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL1B1bmN0dWF0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4cHJlc3Npb25zOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUHVuY3R1YXRpb24gaW1wbGVtZW50cyBWYWxpZElucHV0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFB1bmN0dWF0aW9uKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9WYWxpZElucHV0LmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9WYWxpZElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2NTdmYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL1ZhbGlkSW5wdXQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsaWRJbnB1dCB7CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2V4cHJlc3Npb25zL1ZhcmlhYmxlLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9WYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9leHByZXNzaW9ucy9WYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYWJsZSBpbXBsZW1lbnRzIFZhbGlkSW5wdXQgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworCisgICAgcHJpdmF0ZSBpbnQgZmlsbFNpZGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWxsU3RyaW5nOworCisgICAgcHJpdmF0ZSBpbnQgcHJlY2lzaW9uOworCisgICAgcHJpdmF0ZSBpbnQgdHlwZTsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgRklMTF9GUk9OVCA9IDA7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IEZJTExfQkFDSyA9IDE7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IFRZUEVfU1RSSU5HID0gMjsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFlQRV9JTlRFR0VSID0gMzsKKworICAgIHB1YmxpYyBWYXJpYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG5hbWUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgZmlsbFNpZGUgPSBGSUxMX0ZST05UOworICAgICAgICBmaWxsU3RyaW5nID0gIiAiOworICAgICAgICBwcmVjaXNpb24gPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmluZygpIHsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVnZXIoKSB7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgdHlwZSA9IFRZUEVfU1RSSU5HOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgdHlwZSA9IFRZUEVfSU5URUdFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihpbnQgcHJlY2lzaW9uKSB7CisgICAgICAgIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbGxTdHJpbmcoU3RyaW5nIGZpbGxTdHJpbmcpIHsKKyAgICAgICAgdGhpcy5maWxsU3RyaW5nID0gZmlsbFN0cmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxsU2lkZShpbnQgZmlsbFNpZGUpIHsKKyAgICAgICAgdGhpcy5maWxsU2lkZSA9IGZpbGxTaWRlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHByZWNpc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGxTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBmaWxsU3RyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RmlsbFNpZGUoKSB7CisgICAgICAgIHJldHVybiBmaWxsU2lkZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBzdHJWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChzdHJWYWx1ZS5sZW5ndGgoKSA8IHRoaXMucHJlY2lzaW9uKSB7CisgICAgICAgICAgICB3aGlsZSAoc3RyVmFsdWUubGVuZ3RoKCkgPCB0aGlzLnByZWNpc2lvbikgeworICAgICAgICAgICAgICAgIGlmIChmaWxsU2lkZSA9PSBGSUxMX0ZST05UKSB7CisgICAgICAgICAgICAgICAgICAgIHN0clZhbHVlID0gZmlsbFN0cmluZyArIHN0clZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0clZhbHVlID0gc3RyVmFsdWUgKyBmaWxsU3RyaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyVmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9GaWxlUmVzdHJpY3Rpb25zLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL0ZpbGVSZXN0cmljdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjg0OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9GaWxlUmVzdHJpY3Rpb25zLmphdmEKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2wuUHJvdG9jb2xQYXRoOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiByZXN0cmljdGlvbnMgZm9yIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBjcmVhdGVkIGJlbG93IGFuIGFjdHVhbCBkaXJlY3Rvcnkgd2hpY2ggaXMgcGFzc2VkCisgKiBpbnRvIHRoZSBjb25zdHJ1Y3Rvci4gIFRoZXNlIHJlc3RyaWN0aW9uIGFyZSBsb2FkZWQgYnkgcGFzc2luZyBhIEZpbGVJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyBhIFhNTCBGaWxlCisgKiBpbnRvIHRoZSB7QGxpbmsgI2xvYWRSZXN0cmljdGlvbnMoSW5wdXRTdHJlYW0pfSBtZXRob2QgYW5kIGNhbiBiZSB0ZXN0ZWQgYWdhaW5zdCBieSB1c2luZyB0aGUge0BsaW5rICNpc0FsbG93ZWQoVmlydHVhbEZpbGUpfSBtZXRob2QuCisgKiAKKyAqIDxwcmU+CisgKiBUaGUgWE1MIGZpbGUgc2NoZW1hIGlzOgorICoJe0BsaXRlcmFsIDxyb290PgorICoJICAgPHZhcmlhYmxlcz4KKyAqCSAgICAgIDx2YXJpYWJsZSBuYW1lPSJ2YXJpYWJsZS1uYW1lIj4KKyAqCSAgICAgICAgIDx0eXBlPklOVC1vci1TVFJJTkc8L3R5cGU+CisgKgkgICAgICAgICA8dmFsdWU+dmFyaWFibGUtdmFsdWU8L3ZhbHVlPgorICoJICAgICAgICAgPHByZWNpc2lvbj4KKyAqCSAgICAgICAgICAgIDxsb2NhdGlvbnM+bnVtYmVyLW9mLWZpbGwtbG9jYXRpb25zPC9sb2NhdGlvbnM+CisgKgkgICAgICAgICAgICA8ZmlsbD5maWxsLXZhbHVlPC9maWxsPgorICoJICAgICAgICAgICAgPHNpZGU+ZnJvbnQtb3ItYmFjazwvc2lkZT4KKyAqCSAgICAgICAgIDwvcHJlY2lzaW9uPgorICoJICAgICAgPC92YXJpYWJsZT4KKyAqCSAgICAgIC4uLgorICoJICAgICAgLi4uCisgKgkgICA8L3ZhcmlhYmxlcz4KKyAqCisgKgkgICA8bWV0aG9kcz4KKyAqCSAgICAgIDxtZXRob2QgbmFtZT0ibWV0aG9kLW5hbWUiPgorICoJICAgICAgICAgPGFyZ3M+CisgKgkgICAgICAgICAgICA8YXJnIG5hbWU9ImFyZ3VtZW50LW5hbWUiPgorICoJICAgICAgICAgICAgICAgPHR5cGU+SU5ULW9yLVNUUklORzwvdHlwZT4KKyAqCSAgICAgICAgICAgIDwvYXJnPgorICoJICAgICAgICAgICAgLi4uCisgKgkgICAgICAgICAgICAuLi4KKyAqCSAgICAgICAgIDwvYXJncz4KKyAqCSAgICAgICAgIDxhY3Rpb24+bWV0aG9kLWJlaGF2aW9yPC9hY3Rpb24+CisgKgkgICAgICA8L21ldGhvZD4KKyAqCSAgICAgIC4uLgorICoJICAgICAgLi4uCisgKgkgICA8L21ldGhvZHM+CisgKiAgIAorICoJICAgPGRpcnN0cnVjdCBuYW1lPSJyb290LWRpcmVjdG9yeS1uYW1lIj4KKyAqCSAgICAgIDxub2RpcnMvPgorICoJICAgICAgPG5vZmlsZXMvPgorICoJICAgICAgPGZpbGUgbmFtZT0iZmlsZS1uYW1lIi8+CisgKgkgICAgICA8ZGlyIG5hbWU9ImRpcmVjdG9yeS1uYW1lIj4KKyAqCSAgICAgICAgIDxub2RpcnMvPgorICoJICAgICAgICAgPG5vZmlsZXMvPgorICoJICAgICAgICAgPGZpbGUgbmFtZT0iZmlsZS1uYW1lIi8+CisgKgkgICAgICAgICA8ZGlyIG5hbWU9ImRpcmVjdG9yeS1uYW1lIj4KKyAqCSAgICAgICAgICAgIC4uLgorICoJICAgICAgICAgICAgLi4uCisgKgkgICAgICAgICA8L2Rpcj4KKyAqCSAgICAgIDwvZGlyPgorICoJICAgICAgLi4uCisgKgkgICAgICAuLi4KKyAqCSAgIDwvZGlyc3RydWN0PgorICoJPC9yb290Pn0KKyAqIDwvcHJlPgorICoKKyAqIDxpPntAbGl0ZXJhbCA8dmFyaWFibGVzPn08L2k+IGFuZCA8aT57QGxpdGVyYWwgPG1ldGhvZHM+fTwvaT4gY2FuIGJlIGNyZWF0ZWQgaW4gdGhpcyBYTUwgZmlsZSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIDxpPntAbGl0ZXJhbCA8ZGlyc3RydWN0Pn08L2k+CisgKiBwb3J0aW9uIG9mIHRoZSBYTUwgZmlsZS4gIFRoZXNlIDxpPntAbGl0ZXJhbCA8dmFyaWFibGVzPn08L2k+IGFuZCA8aT57QGxpdGVyYWwgPG1ldGhvZHM+fTwvaT4gY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSA8aT57QGxpdGVyYWwgPGRpcj59PC9pPiBhbmQKKyAqIDxpPntAbGl0ZXJhbCA8ZmlsZT59PC9pPiBlbGVtZW50cyB3aXRoaW4gdGhlIDxpPntAbGl0ZXJhbCA8ZGlyc3RydWN0Pn08L2k+IGVsZW1lbnQgdG8gYWxsb3cgZm9yIHZhcnJ5aW5nIGRpcmVjdG9yeSBhbmQgZmlsZSBuYW1lcyBiZXlvbmQgdGhlIGNhcGFiaWxpdHkKKyAqIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKHdoaWNoIGFyZSBhbHNvIGFsbG93ZWQpLiAgCisgKiAKKyAqIDxoMj5WQVJJQUJMRVMgKE9QVElPTkFMKTo8L2gyPgorICogTGV0J3Mgc3RhcnQgd2l0aCBkZXNjcmliaW5nIHRoZSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlcz59PC9pPiBwb3J0aW9uIG9mIHRoZSBYTUwgZmlsZS4gIEFzIG1hbnkgPGk+e0BsaXRlcmFsIDx2YXJpYWJsZT59PC9pPiBlbGVtZW50cyBhcyB5b3Ugd291bGQgbGlrZQorICogY2FuIGJlIHNwZWNpZmllZCBpbnNpZGUgdGhlIDxpPntAbGl0ZXJhbCA8dmFyaWFibGVzPn08L2k+IHRhZy4gIFRoZSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGVsZW1lbnQgbXVzdCBoYXZlIGEgcGFyYW1ldGVyLCAnbmFtZScsIHdoaWNoIGlzIHRoZSBuYW1lCisgKiBvZiB0aGlzIDxpPntAbGl0ZXJhbCA8dmFyaWFibGU+fTwvaT4uICBFdmVyeSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGlzIGEgZ2xvYmFsIHZhcmlhYmxlICh0aGF0IGlzLCBnbG9iYWwgaW4gdGhlIHNjb3BlIG9mIHRoZSBYTUwgZmlsZSBpdCBpcyBkZWNsYXJlZAorICogaW4gLS0gaXQgaXMgbm90IHVzYWJsZSBpbiBvdGhlciBYTUwgZmlsZSwgdW5sZXNzIHJlZGVjbGFyZWQpIHNvIHZhcmlhYmxlIG5hbWVzIGFyZSB1bmlxdWUgKGhvd2V2ZXIsIGFyZSBjYXNlIHNlbnNpdGl2ZSkgc28gdGh1cyBhIG5hbWUgY2FuIG9ubHkKKyAqIGJlIGFwcGxpZWQgdG8gb25lIDxpPntAbGl0ZXJhbCA8dmFyaWFibGU+fTwvaT4uICBXaXRoaW4gdGhlIDxpPntAbGl0ZXJhbCA8dmFyaWFibGU+fTwvaT4gZWxlbWVudCB0aGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3ViLWVsZW1lbnRzIHRoYXQgY2FuIGJlIGluY2x1ZGVkLgorICogPGk+e0BsaXRlcmFsIDx0eXBlPn08L2k+IGFuZCA8aT57QGxpdGVyYWwgPHZhbHVlPn08L2k+IGFyZSByZXF1aXJlZCBhbmQgPGk+e0BsaXRlcmFsIDxwcmVjaXNpb24+fTwvaT4gaXMgb3B0aW9uYWwuICA8aT57QGxpdGVyYWwgPHR5cGU+fTwvaT4gY2FuIGJlIGVpdGhlciAoYW5kIGl0IG11c3QgYmUKKyAqIGluIGFsbCBVUFBFUkNBU0UpIElOVCBvciBTVFJJTkcgKHNvcnJ5LCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGFzIG9mIHlldCkuICBUaGlzIHNwZWNpZmllcyB3aGF0IHR5cGUgb2YgdmFsdWUgd2lsbCBiZSBnaXZlbiBpbiAKKyAqIDxpPntAbGl0ZXJhbCA8dmFsdWU+fTwvaT4uICBUaGlzIGFsbG93cyB5b3UgdG8gYm90aCB1c2UgbnVtZXJpY2FsIHZhbHVlcyBhcyBlaXRoZXIgYW4gaW50ZWdlciBvciBhIHN0cmluZy4gIDxpPntAbGl0ZXJhbCA8cHJlY2lzaW9uPn08L2k+IGNhbiBhbHNvIGJlIHNwZWNpZmllZAorICogZm9yIGVhY2ggPGk+e0BsaXRlcmFsIDx2YXJpYWJsZT59PC9pPi4gIFRoaXMgYWxsb3dzIHlvdSB0byBpbnN1cmUgdGhhdCBhbiBpbnRlZ2VyIG9yIHN0cmluZyB3aWxsIHRha2UgdXAgYSBjZXJ0YWluIGFtb3VudCBvZiBzcGFjZS4gIFRoaXMgaXMgZXNwZWNpYWxseQorICogdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIGRhdGVzLiAgRm9yIGluc3RhbmNlLCBzYXkgeW91IGhhZCB0aGUgZm9sbG93aW5nIGluIHlvdXIgWE1MIGZpbGU6IAorICogCisgKiA8cHJlPgorICoJe0BsaXRlcmFsIDx2YXJpYWJsZSBuYW1lPSJteVZhcmlhYmxlIj4KKyAqCSAgIDx0eXBlPklOVDwvdHlwZT4KKyAqCSAgIDx2YWx1ZT4zPC92YWx1ZT4KKyAqCTwvdmFyaWFibGU+fQorICogPC9wcmU+CisgKgorICogV2hlbiBteVZhcmlhYmxlIHdhcyBmaW5hbGx5IHJldHVybmVkIGl0IHdvdWxkIGxvb2sgbGlrZSAzLCBob3dldmVyIG1hbnkgdGltZXMgZm9yIGRhdGVzIHlvdSB3b3VsZCBsaWtlIDAzIHJldHVybmVkLiAgWW91IGNhbiBzcGVjaWZ5IHRoaXMgYnkgYWRkaW5nCisgKiBwcmVjaXNpb24gdG8gdGhlIGZvbGxvd2luZyBYTUw6CisgKgorICogPHByZT4KKyAqCXtAbGl0ZXJhbCA8dmFyaWFibGUgbmFtZT0ibXlWYXJpYWJsZSI+CisgKgkgICA8dHlwZT5JTlQ8L3R5cGU+CisgKgkgICA8dmFsdWU+MzwvdmFsdWU+CisgKgkgICA8cHJlY2lzaW9uPgorICoJICAgICAgPGxvY2F0aW9ucz4yPC9sb2NhdGlvbnM+CisgKgkgICAgICA8ZmlsbD4wPC9maWxsPgorICoJICAgICAgPHNpZGU+ZnJvbnQ8L3NpZGU+CisgKgkgICA8L3ByZWNpc2lvbj4KKyAqCTwvdmFyaWFibGU+fQorICogPC9wcmU+CisgKgorICogVGhpcyBpbnN1cmVzIHRoYXQgdGhlIG51bWJlciBpcyBhbHdheXMgcHJpbnRlZCB3aXRoIDIgZGlnaXRzIGFuZCBpZiB0aGUgbnVtYmVyIGRvZXMgbm90IHRha2UgdXAgMiBkaWdpdHMgd29ydGggb2Ygc3BhY2UgYSBmaWxsIHZhbHVlIDAgd2lsbCBiZSBhZGRlZAorICogdG8gdGhlIGZyb250IHNpZGUgb2YgdGhlIGludGVnZXIsIHRodXMsIGluIHRoaXMgZXhhbXBsZSB3b3VsZCBnaXZlIHVzIDAzLiAgTm90ZTogPGk+e0BsaXRlcmFsIDx2YWx1ZT4wMzwvdmFsdWU+fTwvaT4gd291bGQgTk9UIGFjY29tcGxpc2ggdGhlIHNhbWUhISEhCisgKiAKKyAqIDxoMj5NRVRIT0RTIChPUFRJT05BTCk6PC9oMj4KKyAqIE5leHQgbGV0J3MgbG9vayBhdCB0aGUgPGk+e0BsaXRlcmFsIDxtZXRob2RzPn08L2k+IHBvcnRpb24gb2YgdGhlIFhNTCBmaWxlLiAgPGk+e0BsaXRlcmFsIDxtZXRob2Q+fTwvaT4gZWxlbWVudHMgbXVzdCBoYXZlIGEgJ25hbWUnIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlCisgKiA8aT57QGxpdGVyYWwgPG1ldGhvZD59PC9pPi4gIEV2ZXJ5IDxpPntAbGl0ZXJhbCA8bWV0aG9kPn08L2k+IGlzIGFsc28gZ2xvYmFsIGluIHRoZSBzYW1lIHdheSBhcyBpcyBldmVyeSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGFuZCBhcmUgYWxzbyBjYXNlLXNlbnNpdGl2ZSwgdGh1cyBtZXRob2QgCisgKiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS4gIEEgPGk+e0BsaXRlcmFsIDxtZXRob2Q+fTwvaT4gZWxlbWVudCBtYXkgY29udGFpbiBhbiA8aT57QGxpdGVyYWwgPGFyZ3M+fTwvaT4gc3ViLWVsZW1lbnQsIGhvd2V2ZXIgdGhpcyBpcyBvcHRpb25hbCBhbmQgb25seSBuZWVkZWQgaWYgdGhlIG1ldGhvZAorICogaXMgdG8gdGFrZSBhbnkgYXJndW1lbnRzLiAgSWYgYW4gPGk+e0BsaXRlcmFsIDxhcmdzPn08L2k+IGVsZW1lbnQgaXMgZ2l2ZW4sIHRoZW4gaXQgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIDxpPntAbGl0ZXJhbCA8YXJnPn08L2k+IGVsZW1lbnQuICBBIDxpPntAbGl0ZXJhbCA8bWV0aG9kPn08L2k+CisgKiBtYXkgY29udGFpbiBhcyBtYW55IDxpPntAbGl0ZXJhbCA8YXJnPn08L2k+IGVsZW1lbnRzIGFzIGl0IG5lZWRzLiAgV2hhdCBpcyBiZWluZyBzcGVjaWZpZWQgYnkgYSA8aT57QGxpdGVyYWwgPG1ldGhvZD59PC9pPiBlbGVtZW50IGlzIHdoYXQgd291bGQgYmUga25vd24gaW4gamF2YSBjb2RlIAorICogYXMgdGhlIG1ldGhvZCBzaWduYXR1cmUuICBUaHVzIGFsbCB3ZSBhcmUgZ29pbmcgdG8gc3BlY2lmeSBpcyBlYWNoIGFyZ3VtZW50J3MgbmFtZSBhbmQgdHlwZS4gIFRodXMgZWFjaCA8aT57QGxpdGVyYWwgPGFyZz59PC9pPiBlbGVtZW50IG11c3QgY29udGFpbgorICogYSAnbmFtZScgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYW5kIG11c3QgY29udGFpbiBhIDxpPntAbGl0ZXJhbCA8dHlwZT59PC9pPiBzdWItZWxlbWVudCwgc28gaXQgaXMga25vd24gaG93IHRvIHRyZWF0IHRoZSBhcmd1bWVudHMgd2hlbiAKKyAqIHRoZSBtZXRob2QgaXMgdXNlZCB3aXRoaW4gdGhlIDxpPntAbGl0ZXJhbCA8ZGlyc3RydWN0Pn08L2k+IHNlY3Rpb24gb2YgdGhlIFhNTCBmaWxlLiAgQW5vdGhlciBzdWItZWxlbWVudCwgd2hpY2ggaXMgcmVxdWlyZWQsIGZvciB0aGUgPGk+e0BsaXRlcmFsIDxtZXRob2Q+fTwvaT4KKyAqIGVsZW1lbnQgaXMgdGhlIDxpPntAbGl0ZXJhbCA8YWN0aW9uPn08L2k+IGVsZW1lbnQuICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGJlaGF2aW9yIG9mIHRoZSA8aT57QGxpdGVyYWwgPG1ldGhvZD59PC9pPi4gIEJlZm9yZSBnb2luZyBpbnRvIGRldGFpbCBhYm91dCB3aGF0IGNhbiBiZQorICogcGxhY2VkIHdpdGhpbiB0aGUgPGk+e0BsaXRlcmFsIDxhY3Rpb24+fTwvaT4gZWxlbWVudCBsZXQncyBmaXJzdCBjb3ZlciBzb21lIHN5bnRheCByZXF1aXJlbWVudHMgZm9yIHRoZSBYTUwgZmlsZS4KKyAqIAorICogPGgyPlNZTlRBWCBSRVFVSVJFTUVOVFM6PC9oMj4KKyAqIFdoZW4gYSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGlzIHVzZWQgaXQgbXVzdCBiZSBwcmVjZWRlZCBieSAkIGFuZCBpbmNsb3NlZCBpbiB7fSAoZS5nLiAke215VmFyaWFibGV9KS48YnI+CisgKiBXaGVuIGEgPGk+e0BsaXRlcmFsIDxtZXRob2Q+fTwvaT4gaXMgdXNlZCBpdCBtdXN0IGJlIHByZWNlZGVkIGJ5ICUgYW5kIGVuZCB3aXRoICgpIChlLmcuICVteU1ldGhvZCgpLCBob3dldmVyIGlmIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gdGhlbiAlbXlNZXRob2QoMTIsOSkpLjxicj4KKyAqIFdoZW4gYSA8aT57QGxpdGVyYWwgPG1ldGhvZD59PC9pPiBhcmd1bWVudCAoPGk+e0BsaXRlcmFsIDxhcmc+fTwvaT4gZWxlbWVudCkgaXMgdXNlZCBpcyBtdXN0IGJlIHByZWNlZGVkIGJ5ICQgKGUuZy4gJG15QXJnKS48YnI+CisgKiBXaGVuIGEgbGl0ZXJhbCBpbnRlZ2VyIGlzIHVzZWQgaXQgbXVzdCBiZSBwcmVjZWRlZCBieSAjIChlLmcuICMyMzQpLjxicj4KKyAqIFdoZW4gYSBsaXRlcmFsIHN0cmluZyBpcyB1c2VkIGl0IG11c3QgYmUgaW5jbG9zZWQgaW4gIiAoZS5nLiAibXkgYWdlIGlzIDU2IC0tIG5vIG5vdCByZWFsbHkiKS48YnI+CisgKgkKKyAqCTxwPk5PVEU6IFdoZW4gcGFzc2luZyBhcmd1bWVudHMgaW50byBtZXRob2RzIHRoZSBzdHJpbmcgYW5kIGludGVnZXIgbGl0ZXJhbCBydWxlcyBkbyBub3QgbmVlZCB0byBiZSBmb2xsb3dlZCBiZWNhdXNlIHlvdSBoYXZlIGFscmVhZHkgZGVmaW5lZCB3aGF0IGVhY2gKKyAqCSAgIGFyZ3VtZW50IHR5cGUgc2hvdWxkIGJlIGFuZCB0aGV5IHdpbGwgYmUgZXZhbHVhdGVkIGFzIHN1Y2guPC9wPgorICoJPHA+Tk9URSo6IEFsc28gbm90ZSB0aGF0IGF0IHByZXNlbnQgYSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGNhbm5vdCBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIG1ldGhvZHMuICBKdXN0IHVzZSB0aGUgPGk+e0BsaXRlcmFsIDx2YXJpYWJsZT59PC9pPiB3aGVyZSBuZWVkZWQKKyAqCSAgIGluc2lkZSB0aGUgPGk+e0BsaXRlcmFsIDxhY3Rpb24+fTwvaT4gZWxlbWVudC4gIFRoaXMgZmVhdHVyZSBzaG91bGQgaG9wZWZ1bGx5IGJlIGFkZGVkIGluIGEgbGF0ZXIgcmVsZWFzZS48L3A+CisgKgorICogPGgyPk1FVEhPRCdTIEFDVElPTiBFTEVNRU5UIFVTQUdFOjwvaDI+CisgKiBUaGUgPGk+e0BsaXRlcmFsIDxhY3Rpb24+fTwvaT4gZWxlbWVudCB3aWxsIGV2YWx1YXRlIGV4cHJlc3Npb25zIHRoYXQgY29udGFpbiBib3RoIGludGVnZXJzIGFuZCBzdHJpbmdzLiAgSXQgb2JleXMgdGhlIHJ1bGVzIG9mIG1hdGhlbWF0aWNhbCBwcmVjZWRlbmNlIGFuZCB3aWxsCisgKiBhbHNvIGhhbmRsZSBwYXJlbnRoZXNlcy4gIEl0IGFsc28sIGxpa2UgSmF2YSwgc3RpbGwgZm9sbG93cyB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSB3aGVuIHN0cmluZ3MgYXJlIHByZXNlbnQuICBUaGF0IGlzLCBpZiB5b3UgaGF2ZSB0aGUgZXhwcmVzc2lvbjo8YnI+CisgKiAmbmJzcCZuYnNwCTxpPiMyKyM0KyIgeWVhcnMgb2xkLCBnb2luZyBvbiAiKyMyKyM0PC9pPjxicj4KKyAqIEl0IHdvdWxkIGV2YWx1YXRlIHRvOjxicj4KKyAqICZuYnNwJm5ic3AJPGk+NiB5ZWFycyBvbGQsIGdvaW5nIG9uIDI0PC9pPjxicj4KKyAqIFlvdSBtYXkgdXNlIGFueSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGRlY2xhcmVkIHdpdGhpbiB0aGUgc2FtZSBYTUwgZmlsZSBhbmQgbWF5IGFsc28gdXNlIGFueSBhcmd1bWVudCAoPGk+e0BsaXRlcmFsIDxhcmc+fTwvaT4gZWxlbWVudCkgZGVjbGFyZWQgd2l0aGluIHRoYXQgCisgKiA8aT57QGxpdGVyYWwgPG1ldGhvZD59PC9pPi4gIEFsc28gc3RyaW5nIGFuZCBpbnRlZ2VyIGxpdGVyYWxzIG1heSBiZSB1c2VkLiAgQ3VycmVudGx5IHRoZSBvbmx5IG9wZXJhdG9ycyBzdXBwb3J0ZWQgYXJlICssLSwqLC8gKHdoaWNoIGFyZSByZXNwZWN0aXZlbHk6CisgKiBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIG11bHRpcGxpY2F0aW9uLCBhbmQgZGl2aXNpb24pLiAgUGFyZW50aGVzZXMsICgpLCBhbmQgZW1iZWRkZWQgcGFyZW50aGVzZXMsICgoKSgpKSwgYXJlIGFsc28gYWxsIGFsbG93ZWQuCisgKiAKKyAqIDxoMj5ESVJTVFJVQ1Q6PC9oMj4KKyAqIFRoZSBmaW5hbCBzZWN0aW9uIG9mIHRoZSBYTUwgZmlsZSBpcyB0aGUgYWN0dWFsIG1haW4gcHVycG9zZSBvZiB0aGUgWE1MIGZpbGUuICBUaGlzIGlzIHRoZSBYTUwgdGhhdCBjb250cm9scyB3aGljaCBkaXJlY3RvcmllcyB0aGUgY3Jhd2xlciB3aWxsIGJlIGFsbG93ZWQKKyAqIHRvIGNyYXdsIGFuZCB3aGljaCBmaWxlcyB3aWxsIGJlIGFsbG93ZWQuICBUaGUgPGk+e0BsaXRlcmFsIDxkaXJzdHJ1Y3Q+fTwvaT4gZWxlbWVudCByZXF1aXJlcyBhICduYW1lJyBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIHBhdGggdG8gdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSB0aGF0IGlzIHRvIGJlIGNvbnNpZGVyZWQgKHRoYXQgaXMsIGFsbCBvdGhlciBkaXJlY3RvcmllcyBiZWxvdyB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFyZSB1bmltcG9ydGFudCBhbmQgd2lsbCBub3QgYmUgY3Jhd2xlZCkuICBZb3Ugd2FudCB5b3VyIHJvb3QKKyAqIGRpcmVjdG9yeSBwYXRoIHRvIHN0b3AgYXQgdGhlIGZpcnN0IGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbW9yZSB0aGFuIG9uZSBvZiBpdHMgc3ViLWRpcmVjdG9yaWVzIG9yIHdhbnQgZmlsZShzKSBpbnNpZGUgaXQuCisgKiBGb3IgZXhhbXBsZSwgbGV0IHNheSB3ZSB3YW50IHRvIGNyYXdsIGEgcmVtb3RlIHNpdGUgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlOgorICogCisgKiA8cHJlPgorICoJLXBhcmVudAorICoJICAgLWNoaWxkMQorICoJICAgICAgLWdyYW5kQ2hpbGQxCisgKgkgICAgICAgICAtZ3JlYXRHcmFuZENoaWxkMQorICogICAgICAgICAgICAgIC1maWxlMQorICoJICAgICAgICAgLWdyZWF0R3JhbmRDaGlsZDIKKyAqCSAgICAgIC1ncmFuZENoaWxkMgorICoJICAgICAgLWZpbGUxCisgKgkgICAtY2hpbGQyIAorICoJICAgICAgLWZpbGUxCisgKiAJICAgLWNoaWxkMworICogCSAgICAgIC1maWxlMQorICoJICAgICAgLWZpbGUyCisgKiAJICAgICAgLWdyYW5kQ2hpbGQxCisgKiAJICAgICAgICAgLWZpbGUxCisgKgkgICAgICAgICAtZmlsZTIKKyAqIAkgICAtY2hpbGQ0CisgKiA8L3ByZT4KKyAqIAorICogTm93LCBzYXksIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGJlbG93IHRoZSB0d28gc2hvd24gJ2dyYW5kQ2hpbGQxJyBkaXJlY3Rvcmllcy4gIFRoaXMgd291bGQgbWVhbiB0aGF0IGZvciBvdXIgPGk+e0BsaXRlcmFsIDxkaXJzdHJ1Y3Q+fTwvaT4KKyAqICduYW1lJyBwYXJhbWV0ZXIgd2Ugd291bGQgcHV0IG5hbWU9InBhcmVudCIuICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gYm90aCAnY2hpbGQxJyBhbmQgJ2NoaWxkMycgc3ViZGlyZWN0b3JpZXMuICBOb3cgaW4gb3JkZXIgdG8gYXZvaWQgY3Jhd2xpbmcKKyAqICdjaGlsZDInIGFuZCAnY2hpbGQ0JyBkaXJlY3RvcmllcyB3ZSBoYXZlIHRvIHNwZWNpZnkgPGk+e0BsaXRlcmFsIDxkaXI+fTwvaT4gZWxlbWVudHMuICBUaGlzIHdvdWxkIGdpdmUgdXMgdGhlIGZvbGxvd2luZyBYTUw6CisgKiAKKyAqIDxwcmU+CisgKiAJe0BsaXRlcmFsIDxkaXJzdHJ1Y3QgbmFtZT0iL3BhcmVudCI+CisgKgkgICA8ZGlyIG5hbWU9ImNoaWxkMSIvPgorICoJICAgPGRpciBuYW1lPSJjaGlsZDMiLz4KKyAqCTwvZGlyc3RydWN0Pn0KKyAqIDwvcHJlPgorICoKKyAqIFRoaXMgd291bGQgcmVzdHJpY3QgdGhlIGRpcmVjdG9yaWVzIGFsbG93ZWQgdW5kZXIgJ3BhcmVudCcgdG8gb25seSBiZSBkaXJlY3RvcmllcyB3aXRoIG5hbWVzIGVpdGhlciAnY2hpbGQxJyBvciAnY2hpbGQzJywgYWxsIG90aGVyIGRpcmVjdG9yeSBuYW1lcyB3aWxsCisgKiBiZSByZWplY3RlZC4gIEhvd2V2ZXIsIG1vcmUgbXVzdCBiZSBhZGRlZCB0byB0aGlzIGV4YW1wbGUgYmVjYXVzZSB3ZSBoYXZlIG5vdCB5ZXQgc3BlY2lmaWVkIGFueSByZXN0cmljdGlvbnMgb24gZmlsZXMgYWxsb3dlZCBiZW5lYXRoICdwYXJlbnQnLAorICogd2UgaGF2ZSB0byBhZGQgdGhlIDxpPntAbGl0ZXJhbCA8bm9maWxlcy8+fTwvaT4gZWxlbWVudDoKKyAqIAorICogPHByZT4KKyAqCXtAbGl0ZXJhbCA8ZGlyc3RydWN0IG5hbWU9Ii9wYXJlbnQiPn0KKyAqCSAgIDxpPjxiPntAbGl0ZXJhbCA8bm9maWxlcy8+fTwvYj48L2k+CisgKgkgICB7QGxpdGVyYWwgPGRpciBuYW1lPSJjaGlsZDEiLz4KKyAqCSAgIDxkaXIgbmFtZT0iY2hpbGQzIi8+CisgKgk8L2RpcnN0cnVjdD59IAorICogPC9wcmU+CisgKgorICogTm93IHRoZSBvbmx5IHRoaW5nIGFjY2VwdGFibGUgYmVsb3cgcGFyZW50IGlzICdjaGlsZDEnIGFuZCAnY2hpbGQzJy4gIFdlIGhhdmUgdG8gc3RpbGwgZnVydGhlciBvdXIgcmVzdHJpY3Rpb25zIHVuZGVyICdjaGlsZDEnIGFuZCAnY2hpbGQzJy4gIFNpbmNlIHVuZGVyIAorICogJ2NoaWxkMScgd2Ugb25seSB3YW50ICdncmFuZENoaWxkMScgd2Ugd291bGQgaGF2ZSB0byBtYWtlIGFub3RoZXIgPGk+e0BsaXRlcmFsIDxkaXI+fTwvaT4gZWxlbWVudCBhbmQgYWxzbyBhZGQgYSA8aT57QGxpdGVyYWwgPG5vZmlsZXMvPn08L2k+IGVsZW1lbnQ6CisgKiAKKyAqIDxwcmU+CisgKgl7QGxpdGVyYWwgPGRpcnN0cnVjdCBuYW1lPSIvcGFyZW50Ij4KKyAqCSAgIDxub2ZpbGVzLz4KKyAqCSAgIDxkaXIgbmFtZT0iY2hpbGQxIj59CisgKgkgICAgICA8aT48Yj57QGxpdGVyYWwgPG5vZmlsZXMvPgorICoJICAgICAgPGRpciBuYW1lPSJncmFuZENoaWxkMSIvPn08L2I+PC9pPgorICoJICAge0BsaXRlcmFsIDwvZGlyPgorICoJICAgPGRpciBuYW1lPSJjaGlsZDMiLz4KKyAqCTwvZGlyc3RydWN0Pn0gIAorICogPC9wcmU+CisgKiAKKyAqIFdlIGhhdmUgdG8gZG8gdGhlIHNhbWUgYWxzbyBmb3IgJ2NoaWxkMycsIGdpdmluZyB1czoKKyAqIAorICogPHByZT4KKyAqCXtAbGl0ZXJhbCA8ZGlyc3RydWN0IG5hbWU9Ii9wYXJlbnQiPgorICoJICAgPG5vZmlsZXMvPgorICoJICAgPGRpciBuYW1lPSJjaGlsZDEiPgorICoJICAgICAgPG5vZmlsZXMvPgorICoJICAgICAgPGRpciBuYW1lPSJncmFuZENoaWxkMSIvPgorICoJICAgPC9kaXI+CisgKgkgICA8ZGlyIG5hbWU9ImNoaWxkMyI+fQorICoJICAgICAgPGk+PGI+e0BsaXRlcmFsIDxub2ZpbGVzLz4KKyAqCSAgICAgIDxkaXIgbmFtZT0iZ3JhbmRDaGlsZDEiLz59PC9iPjwvaT4KKyAqCSAgIHtAbGl0ZXJhbCA8L2Rpcj4KKyAqCTwvZGlyc3RydWN0Pn0gIAorICogPC9wcmU+CisgKgorICogRnJvbSB0aGUgZXhhbXBsZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGFib3ZlLCB3aXRoIHRoaXMgWE1MIGZpbGUgc3BlY2lmaWVkLCB0aGF0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd291bGQgYmUgbGltaXRlZCB0bzoKKyAqIAorICogPHByZT4KKyAqCS1wYXJlbnQKKyAqCSAgIC1jaGlsZDEKKyAqCSAgICAgIC1ncmFuZENoaWxkMQorICoJICAgICAgICAgLWdyZWF0R3JhbmRDaGlsZDEKKyAqICAgICAgICAgICAgICAtZmlsZTEKKyAqCSAgICAgICAgIC1ncmVhdEdyYW5kQ2hpbGQyCisgKiAJICAgLWNoaWxkMworICogCSAgICAgIC1ncmFuZENoaWxkMQorICogCSAgICAgICAgIC1maWxlMQorICoJICAgICAgICAgLWZpbGUyCisgKiA8L3ByZT4KKyAqIAorICogU2F5IHdlIG5vdyBkZWNpZGUgdGhhdCB3ZSBvbmx5IHdhbnQgZmlsZXMgYmVsb3cgdGhlIHR3byAnZ3JhbmRDaGlsZDEnIGRpcmVjdG9yaWVzIC0tIHRoYXQgaXMsIG5vIGRpcmVjdG9yaWVzLiAgU28gd2Ugd291bGQgY2hhbmdlIG9yIFhNTCBieSBhZGRpbmcgCisgKiBpbiB0aGUgPGk+e0BsaXRlcmFsIDxub2Rpci8+fTwvaT4gZWxlbWVudDoKKyAqIAorICogPHByZT4KKyAqCXtAbGl0ZXJhbCA8ZGlyc3RydWN0IG5hbWU9Ii9wYXJlbnQiPgorICoJICAgPG5vZmlsZXMvPgorICoJICAgPGRpciBuYW1lPSJjaGlsZDEiPgorICoJICAgICAgPG5vZmlsZXMvPgorICoJICAgICAgPGRpciBuYW1lPSJncmFuZENoaWxkMSI+fQorICoJICAgICAgICAgIDxpPjxiPntAbGl0ZXJhbCA8bm9kaXJzLz59PC9iPjwvaT4KKyAqCSAgICAgIHtAbGl0ZXJhbCA8L2Rpcj4KKyAqCSAgIDwvZGlyPgorICoJICAgPGRpciBuYW1lPSJjaGlsZDMiPgorICoJICAgICAgPG5vZmlsZXMvPgorICoJICAgICAgPGRpciBuYW1lPSJncmFuZENoaWxkMSI+fQorICoJICAgICAgICAgPGk+PGI+e0BsaXRlcmFsIDxub2RpcnMvPn08L2I+PC9pPgorICoJICAgICAge0BsaXRlcmFsIDwvZGlyPgorICoJICAgPC9kaXI+CisgKgk8L2RpcnN0cnVjdD59ICAgCisgKiA8L3ByZT4KKyAqCisgKiBXaGljaCBub3cgcmVzdHJpY3RzIG91ciBkaXJlY3Rvcnkgc3RydWN0dXJlIHRvOgorICogCisgKiA8cHJlPgorICoJLXBhcmVudAorICoJICAgLWNoaWxkMQorICoJICAgICAgLWdyYW5kQ2hpbGQxCisgKiAJICAgLWNoaWxkMworICogCSAgICAgIC1ncmFuZENoaWxkMQorICogCSAgICAgICAgIC1maWxlMQorICoJICAgICAgICAgLWZpbGUyCisgKiA8L3ByZT4KKyAqIAorICogTGV0J3MgZnVydGhlciBzcGVjaWZ5IG5vdyB0aGF0IHdlIG9ubHkgd2FudCAnZmlsZTEnIGluIHRoZSAnL3BhcmVudC9jaGlsZDMvZ3JhbmRDaGlsZDEnIGRpcmVjdG9yeS4gIFRoaXMgd291bGQgY2hhbmdlIHRoZSBYTUwgdG86CisgKiAKKyAqIDxwcmU+CisgKgl7QGxpdGVyYWwgPGRpcnN0cnVjdCBuYW1lPSIvcGFyZW50Ij4KKyAqCSAgIDxub2ZpbGVzLz4KKyAqCSAgIDxkaXIgbmFtZT0iY2hpbGQxIj4KKyAqCSAgICAgIDxub2ZpbGVzLz4KKyAqCSAgICAgIDxkaXIgbmFtZT0iZ3JhbmRDaGlsZDEiPgorICoJICAgICAgICAgIDxub2RpcnMvPgorICoJICAgICAgPC9kaXI+CisgKgkgICA8L2Rpcj4KKyAqCSAgIDxkaXIgbmFtZT0iY2hpbGQzIj4KKyAqCSAgICAgIDxub2ZpbGVzLz4KKyAqCSAgICAgIDxkaXIgbmFtZT0iZ3JhbmRDaGlsZDEiPgorICoJICAgICAgICAgPG5vZGlycy8+fQorICoJICAgICAgICAgPGk+PGI+e0BsaXRlcmFsIDxmaWxlIG5hbWU9ImZpbGUxIi8+fTwvYj48L2k+CisgKgkgICAgICB7QGxpdGVyYWwgPC9kaXI+CisgKgkgICA8L2Rpcj4KKyAqCTwvZGlyc3RydWN0Pn0KKyAqIDwvcHJlPgorICoKKyAqIE91ciBuZXcgYWxsb3dlZCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdvdWxkIG5vdyBiZToKKyAqIAorICogPHByZT4KKyAqCS1wYXJlbnQKKyAqCSAgIC1jaGlsZDEKKyAqCSAgICAgIC1ncmFuZENoaWxkMQorICogCSAgIC1jaGlsZDMKKyAqIAkgICAgICAtZ3JhbmRDaGlsZDEKKyAqIAkgICAgICAgICAtZmlsZTEKKyAqIDwvcHJlPgorICogCisgKglOT1RFUzoKKyAqIAktWW91IHdvdWxkIG5vdCB3YW50IHRvIHVzZSB0aGUgPGk+e0BsaXRlcmFsIDxub2ZpbGVzLz59PC9pPiBhbmQgPGk+e0BsaXRlcmFsIDxmaWxlPn08L2k+IGVsZW1lbnRzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSAoc2FtZSBnb2VzIGZvciB0aGUKKyAqIAkgICA8aT57QGxpdGVyYWwgPG5vZGlycy8+fTwvaT4gYW5kIDxpPntAbGl0ZXJhbCA8ZGlyPn08L2k+IGVsZW1lbnRzKSBiZWNhdXNlIHlvdSB3b3VsZCBiZSBzcGVjaWZ5aW5nIHRoYXQgeW91IGRvbid0IHdhbnQgYW55IGZpbGVzIGluIHRoYXQKKyAqIAkgICBkaXJlY3RvcnksIGFuZCB0aGVuIGNvbnRyYWRpY3QgeW91cnNlbGYgYnkgc3BlY2lmeWluZyBhIDxpPntAbGl0ZXJhbCA8ZmlsZT59PC9pPiBlbGVtZW50IHRoYXQgaXMgb2theSB0byBoYXZlLiAgVGhlIDxpPntAbGl0ZXJhbCA8ZmlsZT59PC9pPiAKKyAqCSAgIGVsZW1lbnQgc3RhdGVzIHRoYXQgbm8gb3RoZXIgZmlsZSBidXQgdGhlIGZpbGUgSSBzcGVjaWZpZWQgaXMgYWxsb3dlZC4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBpZiB5b3UgaGF2ZSB0d28gb3IgbW9yZSA8aT57QGxpdGVyYWwgPGZpbGU+fTwvaT4gCisgKgkgICBlbGVtZW50cyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgLS0gdGhpcyBpcyBhbGxvd2VkLiAgSXQgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyB0aGUgPGk+e0BsaXRlcmFsIDxkaXI+fTwvaT4gZWxlbWVudCBpbiB0aGUgZXhhbXBsZSAKKyAqCSAgIGdpdmVuIGFib3ZlIHdoZXJlIG9ubHkgJ2NoaWxkMScgYW5kICdjaGlsZDMnIHdlcmUgYWxsb3cuICBUaGUgdHdvIGRvbid0IGNhbmNlbCBlYWNoIG90aGVyIG91dC4gCisgKiAKKyAqIDxoMj5BRFZBTkNFRCBVU0FHRVMgT0YgRElSU1RSVUNUOjwvaDI+CisgKiBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkIGluIHRoZSAnbmFtZScgcGFyYW1ldGVyIG9mIGJvdGggPGk+e0BsaXRlcmFsIDxkaXI+fTwvaT4gYW5kIDxpPntAbGl0ZXJhbCA8ZmlsZT59PC9pPiBlbGVtZW50cy4gIEFsc28gYW55IAorICogPGk+e0BsaXRlcmFsIDxtZXRob2Q+fTwvaT4gb3IgPGk+e0BsaXRlcmFsIDx2YXJpYWJsZT59PC9pPiBlbGVtZW50IGRlY2xhcmVkIGNhbiBiZSB1c2VkIHdpdGhpbiB0aGUgJ25hbWUnIHBhcmFtZXRlciBvZiBib3RoIDxpPntAbGl0ZXJhbCA8ZGlyPn08L2k+IAorICogYW5kIDxpPntAbGl0ZXJhbCA8ZmlsZT59PC9pPiBlbGVtZW50cy4gIFRoZXJlIGFyZSBhbHNvIHNldmVyYWwgcHJlZGVmaW5lZCB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXNlZC4KKyAqIAorICogPGg0PlJFR1VMQVIgRVhQUkVTU0lPTlM6PC9oND4KKyAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBwYXJzZWQgYnkgdGhlIDxhIGhyZWY9aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuLmh0bWw+UGF0dGVybjwvYT4gY2xhc3MgCisgKiAoU2VlIGl0cyBkb2N1bWVudGF0aW9uIG9uIHJ1bGUgZm9yIHNwZWNpZnlpbmcgcmVndWxhciBleHByZXNzaW9ucykuICBIZXJlIGlzIGFuIGV4YW1wbGUgdXNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uOgorICogCisgKiA8cHJlPgorICoJe0BsaXRlcmFsIDxkaXJzdHJ1Y3QgbmFtZT0iLy4uLi90ZW1wL3Rlc3QiPgorICoJICAgPG5vZmlsZXMvPgorICoJICAgPGRpciBuYW1lPSJcZHs0fS1cZHsyfS1cZHsyfSI+CisgKgkgICAgICA8bm9kaXJzLz4KKyAqCSAgIDwvZGlyPgorICoJPC9kaXJzdHJ1Y3Q+fQorICogPC9wcmU+CisgKgorICogVGhpcyB3b3VsZCByZXN0cmljdCB0aGUgZGlyZWN0b3J5IGZpbGVzIGluIGRpcmVjdG9yaWVzIGJlbG93IC8uLi4vdGVtcC90ZXN0IHRvIG9ubHkgZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMgYXJlIGRhdGVzIG9mIHRoZQorICogZm9ybWF0OiBZWVlZLU1NLURELgorICogCisgKiA8aDQ+UFJFREVGSU5FRCBEQVRFIFZBUklBQkxFUzo8L2g0PgorICogVGhlcmUgYXJlIHNldmVyYWwgcHJlZGVmaW5lZCBkYXRlIHZhcmlhYmxlcyB0aGFuIGNhbiBiZSBwdXQgYXMgdGhlIDxpPntAbGl0ZXJhbCA8dmFsdWU+fTwvaT4gb2YgYSA8aT57QGxpdGVyYWwgPHZhcmlhYmxlPn08L2k+IGFuZCB0aGVuIHVzZWQuCisgKiAKKyAqIFRoZXNlIHZhcmlhYmxlcyBhcmU6CisgKiA8cHJlPgorICogCVtEQVRFLkRBWV0JLSBkYXkgb2YgdG9kYXkncyBkYXRlCisgKiAJW0RBVEUuTU9OVEhdCS0gbW9udGggb2YgdG9kYXkncyBkYXRlCisgKiAJW0RBVEUuWUVBUl0JLSB5ZWFyIG9mIHRvZGF5J3MgZGF0ZQorICogCVtEQVRFLU4uREFZXQktIHRoZSBkYXkgb2YgdGhlIGRhdGUgTiBkYXlzIGFnbworICogCVtEQVRFLU4uTU9OVEhdCS0gdGhlIG1vbnRoIG9mIHRoZSBkYXRlIE4gZGF5cyBhZ28KKyAqIAlbREFURS1OLllFQVJdCS0gdGhlIHllYXIgb2YgdGhlIGRhdGUgTiBkYXlzIGFnbworICogCVtEQVRFK04uREFZXQktIHRoZSBkYXkgb2YgdGhlIGRhdGUgTiBkYXlzIGZyb20gbm93CisgKiAJW0RBVEUrTi5NT05USF0JLSB0aGUgbW9udGggb2YgdGhlIGRhdGUgTiBkYXlzIGZyb20gbm93CisgKiAJW0RBVEUrTi5ZRUFSXQktIHRoZSB5ZWFyIG9mIHRoZSBkYXRlIE4gZGF5cyBmcm9tIG5vdworICogCisgKiAJLXNvcnJ5LCBubyBEYXlPZlllYXIgaW1wbGVtZW50ZWQgeWV0IC0tIGhvcGVmdWxseSBpbiBhIGxhdGVyIHJlbGVhc2UKKyAqIDwvcHJlPgorICogCisgKiBVc2FnZToKKyAqIDxwcmU+CisgKiAJe0BsaXRlcmFsIDxyb290PgorICogCSAgIDx2YXJpYWJsZXM+CisgKiAJICAgICAgPHZhcmlhYmxlIG5hbWU9InRvZGF5c0RheSI+CisgKiAJICAgICAgICAgPHR5cGU+SU5UPC90eXBlPgorICogCSAgICAgICAgIDx2YWx1ZT5bREFURS5EQVldPC92YWx1ZT4KKyAqCSAgICAgICAgIDxwcmVjaXNpb24+CisgKgkgICAgICAgICAgICA8bG9jYXRpb25zPjI8L2xvY2F0aW9ucz4KKyAqCSAgICAgICAgICAgIDxmaWxsPjA8L2ZpbGw+CisgKgkgICAgICAgICAgICA8c2lkZT5mcm9udDwvc2lkZT4KKyAqCSAgICAgICAgIDwvcHJlY2lzaW9uPgorICoJICAgICAgPC92YXJpYWJsZT4KKyAqCSAgIDwvdmFyaWFibHM+CisgKgkgICA8ZGlyc3RydWN0IG5hbWU9Ii9wYXRoL3RvL3BhcmVudC9kaXIiPgorICoJICAgICAgPG5vZmlsZXMvPgorICoJICAgICAgPGRpciBuYW1lPSJNeUZpbGVzIj4KKyAqCSAgICAgICAgIDxub2RpcnMvPgorICoJICAgICAgICAgPGZpbGUgbmFtZT0iTXlQYXBlcl8ke3RvZGF5c0RheX0iLz4KKyAqCSAgICAgIDwvZGlyPgorICoJICAgPC9kaXJzdHJ1Y3Q+CisgKgk8L3Jvb3Q+fQorICogIDwvcHJlPgorICogIAorICogIFRoaXMgd291bGQgYWxsb3cgb25seSBhIGZpbGUgaW4gL3BhdGgvdG8vcGFyZW50L2Rpci9NeUZpbGVzIHdoaWNoIGhhZCB0aGUgbmFtZSB3aGljaCBzdGFydGVkIHdpdGggTXlQYXBlcl8gYW5kIGVuZGVkIHdpdGggdGhlCisgKiAgZGF5IG9mIHRoZSBjdXJyZW50IGRheSBvZiB0aGUgbW9udGguICBGb3IgZXhhbXBsZSwgaWYgdG8gZGF5cyBkYXRlIHdhcyAwMy8yMy8yMDA1LCB0aGVuIHRoZSBmaWxlIG5hbWUgYWxsb3dlZCB3b3VsZCBiZQorICogIE15UGFwZXJfMjMuCisgKiAKKyAqIDxoND5NRVRIT0QgQU5EIFZBUklBQkxFIFVTQUdFIElOIERJUlNUUlVDVDo8L2g0PgorICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIDxpPntAbGl0ZXJhbCA8dmFyaWFibGVzPn08L2k+IGFuZCA8aT57QGxpdGVyYWwgPG1ldGhvZHM+fTwvaT46CisgKiAKKyAqIDxwcmU+CisgKgl7QGxpdGVyYWwgPHJvb3Q+CisgKgkgICA8dmFyaWFibGVzPgorICoJICAgICAgPHZhcmlhYmxlIG5hbWU9IkRBWSI+CisgKgkgICAgICAgICA8dHlwZT5JTlQ8L3R5cGU+CisgKgkgICAgICAgICA8dmFsdWU+W0RBVEUuREFZXTwvdmFsdWU+CisgKgkgICAgICAgICA8cHJlY2lzaW9uPgorICoJICAgICAgICAgICAgPGxvY2F0aW9ucz4yPC9sb2NhdGlvbnM+CisgKgkgICAgICAgICAgICA8ZmlsbD4wPC9maWxsPgorICoJICAgICAgICAgICAgPHNpZGU+ZnJvbnQ8L3NpZGU+CisgKgkgICAgICAgICA8L3ByZWNpc2lvbj4KKyAqCSAgICAgIDwvdmFyaWFibGU+CisgKgkgICAgICA8dmFyaWFibGUgbmFtZT0iTU9OVEgiPgorICoJICAgICAgICAgPHR5cGU+SU5UPC90eXBlPgorICoJICAgICAgICAgPHZhbHVlPltEQVRFLk1PTlRIXTwvdmFsdWU+CisgKgkgICAgICAgICA8cHJlY2lzaW9uPgorICoJICAgICAgICAgICAgPGxvY2F0aW9ucz4yPC9sb2NhdGlvbnM+CisgKgkgICAgICAgICAgICA8ZmlsbD4wPC9maWxsPgorICoJICAgICAgICAgICAgPHNpZGU+ZnJvbnQ8L3NpZGU+CisgKgkgICAgICAgICA8L3ByZWNpc2lvbj4KKyAqCSAgICAgIDwvdmFyaWFibGU+CisgKgkgICAgICA8dmFyaWFibGUgbmFtZT0iWUVBUiI+CisgKgkgICAgICAgICA8dHlwZT5JTlQ8L3R5cGU+CisgKgkgICAgICAgICA8dmFsdWU+W0RBVEUuWUVBUl08L3ZhbHVlPgorICoJICAgICAgPC92YXJpYWJsZT4KKyAqCSAgIDwvdmFyaWFibGVzPgorICogICAKKyAqCSAgIDxtZXRob2RzPgorICoJICAgICAgPG1ldGhvZCBuYW1lPSJBREQiPgorICoJICAgICAgICAgPGFyZ3M+CisgKgkgICAgICAgICAgICA8YXJnIG5hbWU9IjEiPgorICoJICAgICAgICAgICAgICAgPHR5cGU+SU5UPC90eXBlPgorICoJICAgICAgICAgICAgPC9hcmc+CisgKgkgICAgICAgICA8L2FyZ3M+CisgKgkgICAgICAgICA8YWN0aW9uPiJUSEVfWUVBUl9QTFVTXyIrJDErIjogIisoJHtZRUFSfSskMSk8L2FjdGlvbj4KKyAqCSAgICAgIDwvbWV0aG9kPgorICoJICAgICAgPG1ldGhvZCBuYW1lPSJIT1dfT0xEX0FNX0kiPgorICoJICAgICAgICAgPGFjdGlvbj4ke1lFQVJ9LSMxOTg0PC9hY3Rpb24+CisgKgkgICAgICA8L21ldGhvZD4KKyAqCSAgICAgIDxtZXRob2QgbmFtZT0iREFURSI+CisgKgkgICAgICAgICA8YWN0aW9uPiR7WUVBUn0rIi0iKyR7TU9OVEh9KyItIiske0RBWX08L2FjdGlvbj4KKyAqCSAgICAgIDwvbWV0aG9kPgorICoJICAgPC9tZXRob2RzPgorICoKKyAqCSAgIDxkaXJzdHJ1Y3QgbmFtZT0iL3BhdGgvdG8vcGFyZW50L2RpciI+CisgKgkgICAgICA8bm9maWxlcy8+CisgKgkgICAgICA8ZGlyIG5hbWU9IkFHRV8lSE9XX09MRF9BTV9JKCkiLz4KKyAqCSAgICAgIDxkaXIgbmFtZT0iREFURSI+CisgKgkgICAgICAgICA8bm9kaXJzLz4KKyAqCSAgICAgICAgIDxmaWxlIG5hbWU9IiVBREQoNSkiLz4KKyAqCSAgICAgIDwvZGlyPgorICoJICAgPC9kaXJzdHJ1Y3Q+CisgKgk8L3Jvb3Q+fQorICogPC9wcmU+CisgKgorICogVGhpcyB3b3VsZCBhY2NlcHQgb25seSB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgL3BhdGgvdG8vcGFyZW50L2RpciB3aGljaCBoYWQgdGhlIG5hbWUgKGdpdmVuIHRvZGF5IGlzIDkvNy8yMDA3KSAnQUdFXzIzJyBvciAnMjAwNy0wOS0wNycuCisgKiBUaGlzIHdvdWxkIGFsbG93IGFueSBmaWxlIG9yIGRpcmVjdG9yeSBpbiB1bmRlciAnQUdFXzIzJywgYnV0IHdvdWxkIG9ubHkgYWxsb3cgYSBmaWxlIHdpdGggdGhlIG5hbWUgJ1RIRV9ZRUFSX1BMVVNfNTogMjAxMicgaW4gdGhlIAorICogZGlyZWN0b3J5ICcyMDA3LTA5LTA3Jy4KKyAqICAKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKgorICovCitwdWJsaWMgY2xhc3MgRmlsZVJlc3RyaWN0aW9ucyB7CisKKyAgICBwcml2YXRlIEZpbGVSZXN0cmljdGlvbnMoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbnsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCBGaWxlUmVzdHJpY3Rpb25zISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogQHJldHVybiBUaGUgaW5pdGlhbCBjZCBkaXJlY3Rvcnkgd2hpY2ggbmVlZHMgdG8gYmUgY2hhbmdlZCB0byAoaW4gb3JkZXIKKyAgICAgKiAgICAgICAgIHRvIHRha2UgY2FyZSBvZiBwb3NzaWJsZSBhdXRvLW1vdW50ZWQgZGlyZWN0b3JpZXMpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxsb3dlZChQcm90b2NvbFBhdGggcGF0aCwgVmlydHVhbEZpbGUgcm9vdCkgeworICAgICAgICByZXR1cm4gKGlzVmFsaWRQYXRoKHBhdGgpICYmIGlzQWxsb3dlZChuZXcgVmlydHVhbEZpbGUocGF0aAorICAgICAgICAgICAgICAgIC5nZXRQYXRoU3RyaW5nKCksIHBhdGguaXNEaXJlY3RvcnkoKSksIHJvb3QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbGxvd2VkKFZpcnR1YWxGaWxlIGZpbGUsIFZpcnR1YWxGaWxlIHJvb3QpIHsKKyAgICAgICAgYm9vbGVhbiB2ZkRvZXNOb3RFeGlzdCA9IGZhbHNlLCBsYXN0RmlsZUlzRGlyID0gZmlsZS5pc0RpcigpOworICAgICAgICBWaXJ0dWFsRmlsZSB2ZiA9IG51bGw7CisgICAgICAgIHdoaWxlICgodmYgPSByb290LmdldENoaWxkUmVjdXJzaXZlKGZpbGUpKSA9PSBudWxsKSB7CisgICAgICAgICAgICB2ZkRvZXNOb3RFeGlzdCA9IHRydWU7CisgICAgICAgICAgICBsYXN0RmlsZUlzRGlyID0gZmlsZS5pc0RpcigpOworICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIShmaWxlID09IG51bGwgfHwgKHZmRG9lc05vdEV4aXN0ICYmICgobGFzdEZpbGVJc0RpciAmJiAhdmYKKyAgICAgICAgICAgICAgICAuYWxsb3dOZXdEaXJzKCkpIHx8ICghbGFzdEZpbGVJc0RpciAmJiAhdmYuYWxsb3dOZXdGaWxlcygpKSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQYXRoKFByb3RvY29sUGF0aCBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgIXBhdGguZ2V0RmlsZU5hbWUoKS5lcXVhbHMoIi4iKQorICAgICAgICAgICAgICAgICYmICFwYXRoLmdldEZpbGVOYW1lKCkuZXF1YWxzKCIuLiIpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxTdHJpbmc+IHRvU3RyaW5nTGlzdChWaXJ0dWFsRmlsZSByb290KSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBzdHJpbmdMaXN0LmFkZEFsbCh0b1N0cmluZ0xpc3Qocm9vdC5nZXRDaGlsZHJlbigpLCAiIikpOworICAgICAgICByZXR1cm4gc3RyaW5nTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaW5rZWRMaXN0PFN0cmluZz4gdG9TdHJpbmdMaXN0KAorICAgICAgICAgICAgTGlua2VkTGlzdDxWaXJ0dWFsRmlsZT4gY2hpbGRyZW4sIFN0cmluZyBjdXJQYXRoKSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBmb3IgKFZpcnR1YWxGaWxlIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50UGF0aCA9IGN1clBhdGggKyAiLyIgKyBjaGlsZC5nZXRSZWdFeHAoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGQuaXNEaXIoKSkKKyAgICAgICAgICAgICAgICBzdHJpbmdMaXN0LmFkZChjdXJyZW50UGF0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RyaW5nTGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEFsbCh0b1N0cmluZ0xpc3QoY2hpbGQuZ2V0Q2hpbGRyZW4oKSwgY3VycmVudFBhdGgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nTGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL1BhcnNlci5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9QYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGE4YjlhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9QYXJzZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9uczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUGFyc2VyRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIFBhcnNlciB7CisKKyAgICBwdWJsaWMgVmlydHVhbEZpbGVTdHJ1Y3R1cmUgcGFyc2UoRmlsZUlucHV0U3RyZWFtIGlucHV0RmlsZSwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL1ZpcnR1YWxGaWxlLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL1ZpcnR1YWxGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4NDllNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2ZpbGVyZXN0cmljdGlvbnMvVmlydHVhbEZpbGUuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEZpbGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVnRXhwOworCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PFZpcnR1YWxGaWxlPiBjaGlsZHJlbjsKKworICAgIHByaXZhdGUgVmlydHVhbEZpbGUgcGFyZW50OworCisgICAgcHJpdmF0ZSBib29sZWFuIG5vRGlyczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBub0ZpbGVzOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRGlyOworCisgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93TmV3RmlsZXM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3dOZXdEaXJzOworCisgICAgcHJpdmF0ZSBWaXJ0dWFsRmlsZShib29sZWFuIGlzRGlyKSB7CisgICAgICAgIHRoaXMuaXNEaXIgPSBpc0RpcjsKKyAgICAgICAgY2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaXJ0dWFsRmlsZT4oKTsKKyAgICAgICAgbm9EaXJzID0gbm9GaWxlcyA9ICFpc0RpcjsKKyAgICAgICAgYWxsb3dOZXdGaWxlcyA9IGFsbG93TmV3RGlycyA9IGlzRGlyOworICAgIH0KKworICAgIHB1YmxpYyBWaXJ0dWFsRmlsZShTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0RpcikgeworICAgICAgICB0aGlzKGlzRGlyKTsKKworICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsICIvIik7CisKKyAgICAgICAgICAgIGlmIChzdC5jb3VudFRva2VucygpID4gMSkgeworICAgICAgICAgICAgICAgIFZpcnR1YWxGaWxlIHZmID0gcGF0aC5zdGFydHNXaXRoKCIvIikgPyBWaXJ0dWFsRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVJvb3REaXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVmlydHVhbEZpbGUoc3QubmV4dFRva2VuKCksIHRydWUpOworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJSZWdFeHAgPSBzdC5uZXh0VG9rZW4oKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlydHVhbEZpbGUgdGVtcCA9IG5ldyBWaXJ0dWFsRmlsZShjdXJSZWdFeHAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB2Zi5hZGRDaGlsZCh0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgdmYgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICBjdXJSZWdFeHAgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWdFeHAgPSBjdXJSZWdFeHA7CisgICAgICAgICAgICAgICAgdmYuYWRkQ2hpbGQodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LmNvdW50VG9rZW5zKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5yZWdFeHAgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxGaWxlLmNyZWF0ZVJvb3REaXIoKS5hZGRDaGlsZCh0aGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb3B5KFZpcnR1YWxGaWxlLmNyZWF0ZVJvb3REaXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhpcy5jb3B5KFZpcnR1YWxGaWxlLmNyZWF0ZVJvb3REaXIoKSk7CisgICAgfQorCisgICAgcHVibGljIFZpcnR1YWxGaWxlKFZpcnR1YWxGaWxlIHJvb3QsIFN0cmluZyBwYXRoLCBib29sZWFuIGlzRGlyKSB7CisgICAgICAgIHRoaXMoaXNEaXIpOworCisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aCwgIi8iKTsKKworICAgICAgICAgICAgaWYgKHN0LmNvdW50VG9rZW5zKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVmlydHVhbEZpbGUgdmYgPSByb290OworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJSZWdFeHAgPSBzdC5uZXh0VG9rZW4oKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlydHVhbEZpbGUgdGVtcCA9IG5ldyBWaXJ0dWFsRmlsZShjdXJSZWdFeHAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB2Zi5hZGRDaGlsZCh0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgdmYgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICBjdXJSZWdFeHAgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWdFeHAgPSBjdXJSZWdFeHA7CisgICAgICAgICAgICAgICAgdmYuYWRkQ2hpbGQodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0aGlzLmNvcHkocm9vdCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhpcy5jb3B5KHJvb3QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVmlydHVhbEZpbGUgY3JlYXRlUm9vdERpcigpIHsKKyAgICAgICAgVmlydHVhbEZpbGUgcm9vdCA9IG5ldyBWaXJ0dWFsRmlsZSh0cnVlKTsKKyAgICAgICAgcm9vdC5yZWdFeHAgPSAiLyI7CisgICAgICAgIHJldHVybiByb290OworICAgIH0KKworICAgIHB1YmxpYyBWaXJ0dWFsRmlsZSBnZXRSb290RGlyKCkgeworICAgICAgICBWaXJ0dWFsRmlsZSB2ZiA9IHRoaXM7CisgICAgICAgIHdoaWxlICh2Zi5nZXRQYXJlbnRGaWxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHZmID0gdmYuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICByZXR1cm4gdmY7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWaXJ0dWFsRmlsZSBtZXJnZVR3b0ZpbGVzKFZpcnR1YWxGaWxlIHZmMSwgVmlydHVhbEZpbGUgdmYyKSB7CisgICAgICAgIGlmICh2ZjEuaXNEaXIgJiYgdmYxLmlzRGlyKSB7CisgICAgICAgICAgICBWaXJ0dWFsRmlsZSBuZXdGaWxlID0gVmlydHVhbEZpbGUuY3JlYXRlUm9vdERpcigpOworICAgICAgICAgICAgbmV3RmlsZS5jaGlsZHJlbi5hZGRBbGwodmYxLmNoaWxkcmVuKTsKKyAgICAgICAgICAgIG5ld0ZpbGUuY2hpbGRyZW4uYWRkQWxsKHZmMi5jaGlsZHJlbik7CisgICAgICAgICAgICByZXR1cm4gbmV3RmlsZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChWaXJ0dWFsRmlsZSB2ZikgeworICAgICAgICBpZiAodGhpcy5pc0RpcikgeworICAgICAgICAgICAgVmlydHVhbEZpbGUgZXhpc3RpbmdDaGlsZFdpdGhTYW1lTmFtZSA9IHRoaXMuZ2V0Q2hpbGQodmYucmVnRXhwLAorICAgICAgICAgICAgICAgICAgICB2Zi5pc0Rpcik7CisgICAgICAgICAgICBpZiAoZXhpc3RpbmdDaGlsZFdpdGhTYW1lTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHZmKTsKKyAgICAgICAgICAgICAgICBpZiAodmYuaXNEaXIoKSkKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dOZXdEaXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhbGxvd05ld0ZpbGVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdmYucGFyZW50ID0gdGhpczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmYuY29weShleGlzdGluZ0NoaWxkV2l0aFNhbWVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaW5rZWRMaXN0PFZpcnR1YWxGaWxlPiBnZXRDaGlsZHJlbigpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgIH0KKworICAgIHB1YmxpYyBWaXJ0dWFsRmlsZSBnZXRDaGlsZChTdHJpbmcgcmVnRXhwLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgIGZvciAoVmlydHVhbEZpbGUgdmYgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHRVRDSElMRDogIiArIHJlZ0V4cCArICIgIiArIHZmLnJlZ0V4cCk7CisgICAgICAgICAgICBpZiAoKHJlZ0V4cC5lcXVhbHModmYucmVnRXhwKSB8fCBQYXR0ZXJuLm1hdGNoZXModmYucmVnRXhwLCByZWdFeHApKQorICAgICAgICAgICAgICAgICAgICAmJiB2Zi5pc0RpciA9PSBpc0RpcmVjdG9yeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFZpcnR1YWxGaWxlIGdldENoaWxkUmVjdXJzaXZlKFZpcnR1YWxGaWxlIHZmKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkUmVjdXJzaXZlKHZmLmdldEFic29sdXRlUGF0aCgpLCB2Zi5pc0Rpcik7CisgICAgfQorCisgICAgcHVibGljIFZpcnR1YWxGaWxlIGdldENoaWxkUmVjdXJzaXZlKFN0cmluZyBwYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aCwgIi8iKTsKKyAgICAgICAgVmlydHVhbEZpbGUgdmYgPSB0aGlzOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgY3VyUmVnRXhwID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh2ZiA9IHZmLmdldENoaWxkKGN1clJlZ0V4cCwgdHJ1ZSkpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmYuZ2V0Q2hpbGQoY3VyUmVnRXhwLCBpc0RpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGQoVmlydHVhbEZpbGUgdmYpIHsKKyAgICAgICAgaWYgKGNoaWxkcmVuLmNvbnRhaW5zKHZmKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7CisgICAgICAgIGlmIChyZWdFeHAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5yZWdFeHApOworICAgICAgICBWaXJ0dWFsRmlsZSBwYXJlbnQgPSB0aGlzLnBhcmVudDsKKyAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRoLmluc2VydCgwLCAocGFyZW50LnJlZ0V4cCAhPSAiLyIgPyBwYXJlbnQucmVnRXhwIDogIiIpICsgIi8iKTsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlydHVhbEZpbGUgZ2V0UGFyZW50RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ0V4cCgpIHsKKyAgICAgICAgcmV0dXJuIHJlZ0V4cDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb0RpcnMoYm9vbGVhbiBub0RpcnMpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNEaXIpIHsKKyAgICAgICAgICAgIGlmIChub0RpcnMpCisgICAgICAgICAgICAgICAgYWxsb3dOZXdEaXJzID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLm5vRGlycyA9IG5vRGlyczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vRmlsZXMoYm9vbGVhbiBub0ZpbGVzKSB7CisgICAgICAgIGlmICh0aGlzLmlzRGlyKSB7CisgICAgICAgICAgICBpZiAobm9GaWxlcykKKyAgICAgICAgICAgICAgICBhbGxvd05ld0ZpbGVzID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLm5vRmlsZXMgPSBub0ZpbGVzOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWxsb3dOZXdEaXJzKCkgeworICAgICAgICByZXR1cm4gYWxsb3dOZXdEaXJzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFsbG93TmV3RmlsZXMoKSB7CisgICAgICAgIHJldHVybiBhbGxvd05ld0ZpbGVzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFsbG93Tm9EaXJzKCkgeworICAgICAgICByZXR1cm4gbm9EaXJzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFsbG93Tm9GaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIG5vRmlsZXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXIoKSB7CisgICAgICAgIHJldHVybiBpc0RpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5KFZpcnR1YWxGaWxlIHZmKSB7CisgICAgICAgIHRoaXMuYWxsb3dOZXdEaXJzID0gdmYuYWxsb3dOZXdEaXJzOworICAgICAgICB0aGlzLmFsbG93TmV3RmlsZXMgPSB2Zi5hbGxvd05ld0ZpbGVzOworICAgICAgICB0aGlzLmNoaWxkcmVuID0gdmYuY2hpbGRyZW47CisgICAgICAgIHRoaXMuaXNEaXIgPSB2Zi5pc0RpcjsKKyAgICAgICAgdGhpcy5ub0RpcnMgPSB2Zi5ub0RpcnM7CisgICAgICAgIHRoaXMubm9GaWxlcyA9IHZmLm5vRmlsZXM7CisgICAgICAgIHRoaXMucGFyZW50ID0gdmYucGFyZW50OworICAgICAgICB0aGlzLnJlZ0V4cCA9IHZmLnJlZ0V4cDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBtYWtlIGl0IGNvbXBhcmUgYWdhaW5zdCBhbGwgdmFyaWFibGVzCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFZpcnR1YWxGaWxlKSB7CisgICAgICAgICAgICBWaXJ0dWFsRmlsZSBjb21wYXJlRmlsZSA9IChWaXJ0dWFsRmlsZSkgb2JqOworICAgICAgICAgICAgaWYgKGNvbXBhcmVGaWxlLmdldFJlZ0V4cCgpLmVxdWFscyhyZWdFeHApCisgICAgICAgICAgICAgICAgICAgICYmIGNvbXBhcmVGaWxlLmlzRGlyKCkgPT0gdGhpcy5pc0RpcikKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgICAgICAgICAiLTxWaXJ0dWFsRmlsZT5cdCA6IGFsbG93TmV3RGlycy9ub0RpcnNcdCA6IGFsbG93TmV3RmlsZXMvbm9GaWxlc1xuLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgTGlua2VkTGlzdDxWaXJ0dWFsRmlsZT4gcHJpbnRGaWxlcyA9IG5ldyBMaW5rZWRMaXN0PFZpcnR1YWxGaWxlPigpOworICAgICAgICBwcmludEZpbGVzLmFkZCh0aGlzKTsKKyAgICAgICAgc2IuYXBwZW5kKHByaW50VmlydHVhbEZpbGVzKHByaW50RmlsZXMsICItIikpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBwcmludFZpcnR1YWxGaWxlcyhMaW5rZWRMaXN0PFZpcnR1YWxGaWxlPiBsaXN0LAorICAgICAgICAgICAgU3RyaW5nIHNwYWNlcikgeworICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgIGZvciAoVmlydHVhbEZpbGUgdmYgOiBsaXN0KSB7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHNwYWNlcik7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHZmLmdldFJlZ0V4cCgpCisgICAgICAgICAgICAgICAgICAgICsgKHZmLmlzRGlyICYmICF2Zi5yZWdFeHAuZXF1YWxzKCIvIikgPyAiLyIgOiAiIikgKyAiXHQgOiAiCisgICAgICAgICAgICAgICAgICAgICsgdmYuYWxsb3dOZXdEaXJzICsgIi8iICsgdmYubm9EaXJzICsgIlx0XHQgOiAiCisgICAgICAgICAgICAgICAgICAgICsgdmYuYWxsb3dOZXdGaWxlcyArICIvIiArIHZmLm5vRmlsZXMgKyAiXG4iKTsKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQocHJpbnRWaXJ0dWFsRmlsZXModmYuZ2V0Q2hpbGRyZW4oKSwgIiAiICsgc3BhY2VyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2ZpbGVyZXN0cmljdGlvbnMvVmlydHVhbEZpbGVTdHJ1Y3R1cmUuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2ZpbGVyZXN0cmljdGlvbnMvVmlydHVhbEZpbGVTdHJ1Y3R1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E0OTgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9WaXJ0dWFsRmlsZVN0cnVjdHVyZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2wuUmVtb3RlU2l0ZTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRmlsZVN0cnVjdHVyZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXRoVG9Sb290OworCisgICAgcHJpdmF0ZSBWaXJ0dWFsRmlsZSByb290OworCisgICAgcHJpdmF0ZSBSZW1vdGVTaXRlIHJlbW90ZVNpdGU7CisKKyAgICBwdWJsaWMgVmlydHVhbEZpbGVTdHJ1Y3R1cmUoU3RyaW5nIHBhdGhUb1Jvb3QsIFZpcnR1YWxGaWxlIHJvb3QpIHsKKyAgICAgICAgdGhpcy5wYXRoVG9Sb290ID0gcGF0aFRvUm9vdDsKKyAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlydHVhbEZpbGVTdHJ1Y3R1cmUoUmVtb3RlU2l0ZSByZW1vdGVTaXRlLCBTdHJpbmcgcGF0aFRvUm9vdCwKKyAgICAgICAgICAgIFZpcnR1YWxGaWxlIHJvb3QpIHsKKyAgICAgICAgdGhpcyhwYXRoVG9Sb290LCByb290KTsKKyAgICAgICAgdGhpcy5yZW1vdGVTaXRlID0gcmVtb3RlU2l0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhUb1Jvb3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdGhUb1Jvb3Q7CisgICAgfQorCisgICAgcHVibGljIFZpcnR1YWxGaWxlIGdldFJvb3RWaXJ0dWFsRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlU2l0ZSBnZXRSZW1vdGVTaXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGVTaXRlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdEJhc2VkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXRoVG9Sb290LnN0YXJ0c1dpdGgoIi8iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2ZpbGVyZXN0cmljdGlvbnMvcGFyc2Vycy9DbGFzc05vYWFFbWFpbFBhcnNlci5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0NsYXNzTm9hYUVtYWlsUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4Y2QyNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2ZpbGVyZXN0cmljdGlvbnMvcGFyc2Vycy9DbGFzc05vYWFFbWFpbFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuVmlydHVhbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlZpcnR1YWxGaWxlU3RydWN0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2wuUmVtb3RlU2l0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUGFyc2VyRXhjZXB0aW9uOworCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5EZXNjcmliZSB5b3VyIGNsYXNzIGhlcmU8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NOb2FhRW1haWxQYXJzZXIgaW1wbGVtZW50cyBQYXJzZXIgeworCisgICAgcHVibGljIENsYXNzTm9hYUVtYWlsUGFyc2VyKCkge30KKworICAgIHB1YmxpYyBWaXJ0dWFsRmlsZVN0cnVjdHVyZSBwYXJzZShGaWxlSW5wdXRTdHJlYW0gZW1haWxGaWxlLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgICAgIHRocm93cyBQYXJzZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmlydHVhbEZpbGUgcm9vdCA9IFZpcnR1YWxGaWxlLmNyZWF0ZVJvb3REaXIoKTsKKyAgICAgICAgICAgIFNjYW5uZXIgcyA9IG5ldyBTY2FubmVyKGVtYWlsRmlsZSk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgICAgIHdoaWxlIChzLmhhc05leHRMaW5lKCkpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMubmV4dExpbmUoKSArICJcbiIpOworCisgICAgICAgICAgICBpZiAoIXZhbGlkRW1haWwoc2IudG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbWFpbCBub3QgYSBJQVNJIGRhdGEgcHJvY2Vzc2VkIG5vdGlmaWNhdGlvbiBlbWFpbCIpOworCisgICAgICAgICAgICBQYXR0ZXJuIGNkUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKmNkXFxzezEsfS57MSx9Pyg/Olxcc3wkKSIpOworICAgICAgICAgICAgTWF0Y2hlciBjZE1hdGNoZXIgPSBjZFBhdHRlcm4ubWF0Y2hlcihzYik7CisgICAgICAgICAgICBQYXR0ZXJuIGdldFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxccypnZXRcXHN7MSx9LnsxLH0/KD86XFxzfCQpIik7CisgICAgICAgICAgICBNYXRjaGVyIGdldE1hdGNoZXIgPSBnZXRQYXR0ZXJuLm1hdGNoZXIoc2IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBWaXJ0dWFsRmlsZSB2ZiA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoY2RNYXRjaGVyLmZpbmQoKSAmJiBnZXRNYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjZENvbW1hbmQgPSBzYi5zdWJzdHJpbmcoY2RNYXRjaGVyLnN0YXJ0KCksIGNkTWF0Y2hlci5lbmQoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeSA9IGNkQ29tbWFuZC50cmltKCkuc3BsaXQoIiAiKVsxXTsKKworICAgICAgICAgICAgICAgIHZmID0gbmV3IFZpcnR1YWxGaWxlKHJvb3QsIGRpcmVjdG9yeSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgdmYuc2V0Tm9EaXJzKHRydWUpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGdldENvbW1hbmQgPSBzYi5zdWJzdHJpbmcoZ2V0TWF0Y2hlci5zdGFydCgpLCBnZXRNYXRjaGVyLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGdldENvbW1hbmQudHJpbSgpLnNwbGl0KCIgIilbMV07CisKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHZmLmFkZENoaWxkKG5ldyBWaXJ0dWFsRmlsZShmaWxlLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUubGVuZ3RoKCkgLSAxKSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgdmYuYWRkQ2hpbGQobmV3IFZpcnR1YWxGaWxlKGZpbGUuc3Vic3RyaW5nKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5sZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnNpZyIsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmYuYWRkQ2hpbGQobmV3IFZpcnR1YWxGaWxlKGZpbGUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQYXR0ZXJuIGZ0cFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcc2Z0cFxcLi4qP1xccyIpOworICAgICAgICAgICAgTWF0Y2hlciBmdHBNYXRjaGVyID0gZnRwUGF0dGVybi5tYXRjaGVyKHNiKTsKKyAgICAgICAgICAgIFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoZnRwTWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnRwU2l0ZSA9IHNiLnN1YnN0cmluZyhmdHBNYXRjaGVyLnN0YXJ0KCksIGZ0cE1hdGNoZXIuZW5kKCkpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICByZW1vdGVTaXRlID0gbmV3IFJlbW90ZVNpdGUobnVsbCwgbmV3IFVSTCgiZnRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHBTaXRlKSwgImFub255bW91cyIsIFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldGVudigidXNlci5uYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkBqcGwubmFzYS5nb3YiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaXJ0dWFsRmlsZVN0cnVjdHVyZShyZW1vdGVTaXRlLCAiLyIsIHJvb3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZXJFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBJQVNJIGVtYWlsIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZEVtYWlsKFN0cmluZyBlbWFpbCkgeworICAgICAgICBTdHJpbmdbXSBjb250YWluc1N0cmluZ3MgPSAoU3lzdGVtLmdldFByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuY2xhc3Mubm9hYS5lbWFpbC5wYXJzZXIuY29udGFpbnMuZXhwcnMiKQorICAgICAgICAgICAgICAgICsgIiwiKS5zcGxpdCgiLCIpOworICAgICAgICBmb3IgKFN0cmluZyBjb250YWluc1N0cmluZyA6IGNvbnRhaW5zU3RyaW5ncykKKyAgICAgICAgICAgIGlmICghZW1haWwuY29udGFpbnMoY29udGFpbnNTdHJpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0RpclN0cnVjdFhtbFBhcnNlci5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0RpclN0cnVjdFhtbFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTVhNmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL3BhcnNlcnMvRGlyU3RydWN0WG1sUGFyc2VyLmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlZpcnR1YWxGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5WaXJ0dWFsRmlsZVN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnMuR2xvYmFsVmFyaWFibGVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnMuTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhwcmVzc2lvbnMuVmFyaWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRGlyU3RydWN0WG1sUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERpclN0cnVjdFhtbFBhcnNlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4gbWV0aG9kUmVwbyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOworCisgICAgcHVibGljIERpclN0cnVjdFhtbFBhcnNlcigpIHt9CisKKyAgICBwdWJsaWMgVmlydHVhbEZpbGVTdHJ1Y3R1cmUgcGFyc2UoRmlsZUlucHV0U3RyZWFtIHhtbEZpbGUsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgICAgICAgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgaW5pdGlhbENkRGlyID0gIi8iOworICAgICAgICAgICAgVmlydHVhbEZpbGUgcm9vdCA9IG51bGw7CisgICAgICAgICAgICBOb2RlTGlzdCBsaXN0ID0gKERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICAgICAubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKHhtbEZpbGUpKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgIFZpcnR1YWxGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJkaXJzdHJ1Y3QiKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIG91dCBzdGFydGluZyBwYXRoCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydGluZ1BhdGggPSAoKEVsZW1lbnQpIG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgic3RhcnRpbmdfcGF0aCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmdQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSAoY3VycmVudEZpbGUgPSBuZXcgVmlydHVhbEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDZERpciA9IHN0YXJ0aW5nUGF0aCwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSb290RGlyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsRmlsZSB0ZW1wID0gY3VycmVudEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0Tm9EaXJzKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0Tm9GaWxlcyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IHJvb3QgPSBWaXJ0dWFsRmlsZS5jcmVhdGVSb290RGlyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgICBwYXJzZURpcnN0cnVjdFhNTChub2RlLmdldENoaWxkTm9kZXMoKSwgY3VycmVudEZpbGUpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ2YXJpYWJsZXMiKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVZhcmlhYmxlc1hNTChub2RlLmdldENoaWxkTm9kZXMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJtZXRob2RzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VNZXRob2RzWE1MKG5vZGUuZ2V0Q2hpbGROb2RlcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpcnR1YWxGaWxlU3RydWN0dXJlKGluaXRpYWxDZERpciwgcm9vdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIFhNTCBmaWxlIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZURpcnN0cnVjdFhNTChOb2RlTGlzdCBsaXN0LCBWaXJ0dWFsRmlsZSBjdXJyZW50TG9hZEZpbGUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgZGlyID0gbGlzdC5pdGVtKGkpOworICAgICAgICAgICAgaWYgKGRpci5nZXROb2RlTmFtZSgpLmVxdWFscygiZGlyIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGlyTmFtZSA9IHJlcGxhY2VWYXJpYWJsZXNBbmRNZXRob2RzKCgoRWxlbWVudCkgZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50TG9hZEZpbGUuYWRkQ2hpbGQobmV3IFZpcnR1YWxGaWxlKGRpck5hbWUsIHRydWUpKTsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBpZiAoKGNoaWxkcmVuID0gZGlyLmdldENoaWxkTm9kZXMoKSkuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlRGlyc3RydWN0WE1MKGNoaWxkcmVuLCBjdXJyZW50TG9hZEZpbGUuZ2V0Q2hpbGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyTmFtZSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJub2RpcnMiKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRMb2FkRmlsZS5zZXROb0RpcnModHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRpci5nZXROb2RlTmFtZSgpLmVxdWFscygibm9maWxlcyIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudExvYWRGaWxlLnNldE5vRmlsZXModHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRpci5nZXROb2RlTmFtZSgpLmVxdWFscygiZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgVmlydHVhbEZpbGUgdmYgPSBuZXcgVmlydHVhbEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlVmFyaWFibGVzQW5kTWV0aG9kcygoKEVsZW1lbnQpIGRpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgibmFtZSIpKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHZmLnNldE5vRGlycyh0cnVlKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50TG9hZEZpbGUuYWRkQ2hpbGQodmYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVZhcmlhYmxlc0FuZE1ldGhvZHMoU3RyaW5nIGlucHV0KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gaW5wdXQuY2hhckF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckF0KGkgKyAxKSA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB2YXJpYWJsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAyOyBqIDwgaW5wdXQubGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBpbnB1dC5jaGFyQXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA8PSAnWicgJiYgY2ggPj0gJ0EnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoIDw9ICd6JyAmJiBjaCA+PSAnYScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPD0gJzknICYmIGNoID49ICcwJykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaCA9PSAnXycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlIHYgPSBHbG9iYWxWYXJpYWJsZXMuaGFzaE1hcC5nZXQodmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAl0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyB2YXJpYWJsZSBkZWZpbmVkIHdpdGggbmFtZSAnIiArIHZhcmlhYmxlLnRvU3RyaW5nKCkgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlRmlyc3QoIlxcJFxceyIgKyB2YXJpYWJsZSArICJcXH0iLCB2LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyB2LnRvU3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIAlMT0cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gcmVwbGFjZSB2YXJpYWJsZSBpbiAnIiArIGlucHV0ICsgIiBmb3IgaSA9ICciICsgaSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgbWV0aG9kID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgaW5wdXQubGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IGlucHV0LnN1YnN0cmluZyhqLCBqICsgMSkuY2hhckF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA8PSAnWicgJiYgY2ggPj0gJ0EnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPD0gJ3onICYmIGNoID49ICdhJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoIDw9ICc5JyAmJiBjaCA+PSAnMCcpIHx8IGNoID09ICdfJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHJpbmcoaiwgaiArIDEpLmNoYXJBdCgwKSA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gbWV0aG9kUmVwby5nZXQobWV0aG9kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGosIGlucHV0LnN1YnN0cmluZyhqKS5pbmRleE9mKCIpIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGopLCAiI1wiLCAoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmFkZEFyZyhudWxsLCBhcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldHVyblZhbHVlID0gbS5leGVjdXRlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDAsIGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmV0dXJuVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dC5zdWJzdHJpbmcoaW5wdXQuc3Vic3RyaW5nKGkpLmluZGV4T2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSArIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyByZXR1cm5WYWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiSW52YWxpZCBtZXRob2Qgc2lnbmF0dXJlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dCArICIgbmVhciAiICsgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZVZhcmlhYmxlc1hNTChOb2RlTGlzdCBsaXN0KSB0aHJvd3MgRE9NRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgdmFyaWFibGUgZWxlbWVudHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKKworICAgICAgICAgICAgLy8gcGFyc2UgdmFyaWFibGUgZWxlbWVudAorICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInZhcmlhYmxlIikpIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIFZhcmlhYmxlIE9iamVjdAorICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgICAgIFZhcmlhYmxlIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdG8gZmlsbCBWYXJpYWJsZQorICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbnVsbCwgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShqKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIFZhcmlhYmxlJ3MgbmFtZQorICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInR5cGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFhNTFV0aWxzLmdldFNpbXBsZUVsZW1lbnRUZXh0KChFbGVtZW50KSBjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkudG9Mb3dlckNhc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBWYXJpYWJsZSdzIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInZhbHVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUGF0aFV0aWxzLmRvRHluYW1pY1JlcGxhY2VtZW50KFhNTFV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVFbGVtZW50VGV4dCgoRWxlbWVudCkgY2hpbGQsIGZhbHNlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgVmFyaWFibGUncyB2YWx1ZSdzIHByZWNpc2lvbiBpbmZvbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInByZWNpc2lvbiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBncmFuZENoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBncmFuZENoaWxkcmVuLmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGdyYW5kQ2hpbGQgPSBncmFuZENoaWxkcmVuLml0ZW0oayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygibG9jYXRpb25zIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2V0UHJlY2lzaW9uKEludGVnZXIucGFyc2VJbnQoWE1MVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2ltcGxlRWxlbWVudFRleHQoKEVsZW1lbnQpIGdyYW5kQ2hpbGQsIHRydWUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZmlsbCBjaGFyYWN0ZXIgdG8gbWVldCB0aGUgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtvcHRpb25hbF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyYW5kQ2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImZpbGwiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZXRGaWxsU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuZ2V0U2ltcGxlRWxlbWVudFRleHQoKEVsZW1lbnQpIGdyYW5kQ2hpbGQsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2lkZSBmb3Igd2hpY2ggdGhlIGZpbGwgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCBbb3B0aW9uYWxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChncmFuZENoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJzaWRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2V0RmlsbFNpZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTFV0aWxzLmdldFNpbXBsZUVsZW1lbnRUZXh0KChFbGVtZW50KSBncmFuZENoaWxkLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKS5lcXVhbHMoImZyb250IikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB2YXJpYWJsZS5GSUxMX0ZST05UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhcmlhYmxlLkZJTExfQkFDSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiB2YXJpYWJsZSBpcyBhbiBJbnRlZ2VyIG9yIGEgU3RyaW5nCisgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJpbnQiKSkgeworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZXRWYWx1ZShuZXcgSW50ZWdlcih2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZXRWYWx1ZSh2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBzdG9yZSBWYXJpYWJsZSBpbiBsaXN0IG9mIFZhcmlhYmxlcworICAgICAgICAgICAgICAgIEdsb2JhbFZhcmlhYmxlcy5oYXNoTWFwLnB1dCh2YXJpYWJsZS5nZXROYW1lKCksIHZhcmlhYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZU1ldGhvZHNYTUwoTm9kZUxpc3QgbGlzdCkgeworCisgICAgICAgIC8vIGxvb3AgdGhvdWdoIGFsbCBtZXRob2QgZWxlbWVudHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKKyAgICAgICAgICAgIC8vIHBhcnNlIG1ldGhvZCBlbGVtZW50CisgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygibWV0aG9kIikpIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIE1ldGhvZCBPYmplY3QKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG5ldyBNZXRob2QobWV0aG9kTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdG8gZmlsbCBNZXRob2QgT2JqZWN0CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGopOworCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgTWV0aG9kJ3MgYmVoYXZvaXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJhY3Rpb24iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnNldEJlaGF2b2lyKFhNTFV0aWxzLmdldFNpbXBsZUVsZW1lbnRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudCkgY2hpbGQsIGZhbHNlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgTWV0aG9kJ3MgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImFyZ3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGFyZ1R5cGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgZ3JhbmRDaGlsZHJlbiA9IGNoaWxkLmdldENoaWxkTm9kZXMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCBmb3IgZXZlcnkgYXJnIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZ3JhbmRDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBncmFuZENoaWxkID0gZ3JhbmRDaGlsZHJlbi5pdGVtKGspOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgYXJnIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygiYXJnIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICgoRWxlbWVudCkgZ3JhbmRDaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGFyZyBlbGVtZW50IHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgZ3JlYXRHcmFuZENoaWxkcmVuID0gZ3JhbmRDaGlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZ3JlYXRHcmFuZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExlbmd0aCgpOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgZ3JlYXRHcmFuZENoaWxkID0gZ3JlYXRHcmFuZENoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtKGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyZWF0R3JhbmRDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1R5cGUgPSBYTUxVdGlscy5nZXRTaW1wbGVFbGVtZW50VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBncmVhdEdyYW5kQ2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhcmd1bWVudCBzaWduYXR1cmUgaW4gTWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRBcmdTaWduYXR1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhcmdUeXBlLnRvTG93ZXJDYXNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygiaW50IikpID8gbWV0aG9kLklOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGhvZC5TVFJJTkcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdG9yZSBNZXRob2QgaW4gbGlzdCBvZiBNZXRob2RzCisgICAgICAgICAgICAgICAgbWV0aG9kUmVwby5wdXQobWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0ZpbGVMaXN0UGFyc2VyLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL3BhcnNlcnMvRmlsZUxpc3RQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQwY2YwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0ZpbGVMaXN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2VyczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlZpcnR1YWxGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5WaXJ0dWFsRmlsZVN0cnVjdHVyZTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTGlzdFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlciB7CisKKwlwdWJsaWMgRmlsZUxpc3RQYXJzZXIoKSB7fQorCQorICAgIHB1YmxpYyBWaXJ0dWFsRmlsZVN0cnVjdHVyZSBwYXJzZShGaWxlSW5wdXRTdHJlYW0gaW5wdXRGaWxlLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgICAgIHRocm93cyBQYXJzZXJFeGNlcHRpb24geworICAgICAgICBTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihpbnB1dEZpbGUpOworICAgICAgICBWaXJ0dWFsRmlsZSByb290ID0gVmlydHVhbEZpbGUuY3JlYXRlUm9vdERpcigpOworICAgICAgICBTdHJpbmcgaW5pdGlhbENkRGlyID0gIi8iOworICAgICAgICBpZiAoc2Nhbm5lci5oYXNOZXh0TGluZSgpKSB7CisgICAgICAgICAgICBpbml0aWFsQ2REaXIgPSBzY2FubmVyLm5leHRMaW5lKCk7CisgICAgICAgICAgICB3aGlsZSAoc2Nhbm5lci5oYXNOZXh0TGluZSgpKSB7CisgICAgICAgICAgICAgICAgbmV3IFZpcnR1YWxGaWxlKHJvb3QsIGluaXRpYWxDZERpciArICIvIiArIHNjYW5uZXIubmV4dExpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFZpcnR1YWxGaWxlU3RydWN0dXJlKGluaXRpYWxDZERpciwgcm9vdCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL3BhcnNlcnMvR2VuZXJpY0VtYWlsUGFyc2VyLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL3BhcnNlcnMvR2VuZXJpY0VtYWlsUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljNjMxOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL2ZpbGVyZXN0cmljdGlvbnMvcGFyc2Vycy9HZW5lcmljRW1haWxQYXJzZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuVmlydHVhbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLlZpcnR1YWxGaWxlU3RydWN0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5QYXJzZXJFeGNlcHRpb247CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgZ2VuZXJpYyBlbWFpbCBwYXJzZXIgd2hpY2ggZ2VuZXJhdGVzIGZpbGUgcGF0aHMgdG8gYmUgZG93bmxvYWRlZCBieSB1c2luZyBhIGRlZmluZWQgamF2YQorICogUGF0dGVybi4gVGhlIHBhdHRlcm4gc2hvdWxkIHNwZWNpZnkgcGF0dGVybiBncm91cHMgZm9yIGZpbGUgcGF0aHMgaW4gdGhlIG1hdGNoaW5nIHBhdHRlcm4uCisgKiBUaGVzZSBncm91cHMgd2lsbCB0aGVuIGJlIGV4dHJhY3RlZCBhbmQgYWRkZWQgdG8gdGhlIGZpbGUgc3RydWN0dXJlLgorICoKKyAqIEBhdXRob3IgYmZvc3RlckBhcGFjaGUub3JnIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljRW1haWxQYXJzZXIgaW1wbGVtZW50cyBQYXJzZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEdlbmVyaWNFbWFpbFBhcnNlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUEFUVEVSTlNfUFJPUEVSVFlfTkFNRSA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5nZW5lcmljLmVtYWlsLnBhcnNlci5maWxlLnBhdHRlcm4iOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19GT1JfUEFUVEVSTl9QUk9QRVJUWV9OQU1FID0KKyAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmdlbmVyaWMuZW1haWwucGFyc2VyLmNoZWNrLmZvci5wYXR0ZXJuIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9UT19ST09UX1BST1BFUlRZX05BTUUgPQorICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZ2VuZXJpYy5lbWFpbC5wYXJzZXIucGF0aC50by5yb290IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZUyA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5nZW5lcmljLmVtYWlsLnBhcnNlci5tZXRhZGF0YS5rZXlzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX1BSRUZJWCA9CisgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5nZW5lcmljLmVtYWlsLnBhcnNlci5tZXRhZGF0YS4iOyAgICAgIAorICAKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZVBhdHRlcm47CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNoZWNrRm9yUGF0dGVybjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aFRvUm9vdDsKKworICBwdWJsaWMgR2VuZXJpY0VtYWlsUGFyc2VyKCkgeworICAgIGZpbGVQYXR0ZXJuID0gbG9hZEZpbGVQYXR0ZXJuKCk7CisgICAgY2hlY2tGb3JQYXR0ZXJuID0gbG9hZENoZWNrRm9yUGF0dGVybigpOworICAgIHBhdGhUb1Jvb3QgPSBsb2FkUGF0aFRvUm9vdCgpOworICB9CisgCisgIHB1YmxpYyBHZW5lcmljRW1haWxQYXJzZXIoU3RyaW5nIGZpbGVQYXR0ZXJuLCBTdHJpbmcgY2hlY2tGb3JQYXR0ZXJuLCBTdHJpbmcgcGF0aFRvUm9vdCkgeworICAgIHRoaXMuZmlsZVBhdHRlcm4gPSBmaWxlUGF0dGVybjsKKyAgICB0aGlzLmNoZWNrRm9yUGF0dGVybiA9IGNoZWNrRm9yUGF0dGVybjsKKyAgICB0aGlzLnBhdGhUb1Jvb3QgPSBTdHJpbmdzLm51bGxUb0VtcHR5KHBhdGhUb1Jvb3QpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBWaXJ0dWFsRmlsZVN0cnVjdHVyZSBwYXJzZShGaWxlSW5wdXRTdHJlYW0gZW1haWxGaWxlLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgIHRocm93cyBQYXJzZXJFeGNlcHRpb24geworICAgIGxvZy5pbmZvKCJHZW5lcmljRW1haWxQYXJzZXIgaXMgcGFyc2luZyBlbWFpbDogIiArIGVtYWlsRmlsZSk7CisKKyAgICBWaXJ0dWFsRmlsZSByb290ID0gVmlydHVhbEZpbGUuY3JlYXRlUm9vdERpcigpOworCisgICAgU3RyaW5nIGVtYWlsVGV4dCA9IHJlYWRFbWFpbChlbWFpbEZpbGUpOworICAgIGlmICghaXNWYWxpZEVtYWlsKGVtYWlsVGV4dCkpIHsKKyAgICAgIHRocm93IG5ldyBQYXJzZXJFeGNlcHRpb24oIkZhaWxlZCB0byBmaW5kIGNoZWNrIGZvciBwYXR0ZXJuIGluIGVtYWlsOiAiICsgY2hlY2tGb3JQYXR0ZXJuKTsKKyAgICB9CisgICAgTGlzdDxTdHJpbmc+IGZpbGVQYXRocyA9IGdlbmVyYXRlRmlsZVBhdGhzKGVtYWlsVGV4dCk7CisgICAgcmVhZE1ldGFkYXRhKGVtYWlsVGV4dCwgbWV0YWRhdGEpOworCisgICAgZm9yIChTdHJpbmcgZmlsZVBhdGggOiBmaWxlUGF0aHMpIHsKKyAgICAgIG5ldyBWaXJ0dWFsRmlsZShyb290LCBwYXRoVG9Sb290ICsgZmlsZVBhdGgsIGZhbHNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFZpcnR1YWxGaWxlU3RydWN0dXJlKCIvIiwgcm9vdCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyByZWFkRW1haWwoRmlsZUlucHV0U3RyZWFtIGVtYWlsRmlsZSkgeworICAgIFN0cmluZ0J1aWxkZXIgZW1haWxUZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoIiIpOworICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGVtYWlsRmlsZSk7CisgICAgd2hpbGUgKHNjYW5uZXIuaGFzTmV4dExpbmUoKSkgeworICAgICAgZW1haWxUZXh0LmFwcGVuZChzY2FubmVyLm5leHRMaW5lKCkpLmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgc2Nhbm5lci5jbG9zZSgpOworICAgIHJldHVybiBlbWFpbFRleHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdlbmVyYXRlRmlsZVBhdGhzKFN0cmluZyBlbWFpbFRleHQpIHRocm93cyBQYXJzZXJFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiBmaWxlUGF0aHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoZmlsZVBhdHRlcm4pOworICAgIE1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihlbWFpbFRleHQpOworICAgIGlmIChtLmZpbmQoKSkgeworICAgICAgLy8gSWdub3JlIGluZGV4IDAsIGFzIHRoYXQgaXMgdGhlIG1hdGNoaW5nIHN0cmluZyBmb3IgcGF0dGVybi4KKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG0uZ3JvdXBDb3VudCgpOyBpKyspIHsKKyAgICAgICAgZmlsZVBhdGhzLmFkZChtLmdyb3VwKGkpKTsgICAgICAgICAgCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaWxlUGF0aHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE1ldGFkYXRhKFN0cmluZyBlbWFpbFRleHQsIE1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgU2V0PFN0cmluZz4gbWV0YWRhdGFLZXlzID0gbG9hZE1ldGFkYXRhS2V5cygpOworICAgIGZvciAoU3RyaW5nIG1ldGFkYXRhS2V5IDogbWV0YWRhdGFLZXlzKSB7CisgICAgICBTdHJpbmcgbWV0YWRhdGFQYXR0ZXJuID0gbG9hZE1ldGFkYXRhS2V5KG1ldGFkYXRhS2V5KTsKKyAgICAgIGlmIChtZXRhZGF0YVBhdHRlcm4gPT0gbnVsbCkgeworICAgICAgICBsb2cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBsb2FkIG1ldGFkYXRhIHBhdHRlcm4gZm9yIGtleTogIiArIG1ldGFkYXRhS2V5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShtZXRhZGF0YVBhdHRlcm4pOworICAgICAgICBNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoZW1haWxUZXh0KTsKKyAgICAgICAgaWYgKG0uZmluZCgpKSB7CisgICAgICAgICAgLy8gSWdub3JlIGluZGV4IDAsIGFzIHRoYXQgaXMgdGhlIG1hdGNoaW5nIHN0cmluZyBmb3IgcGF0dGVybi4KKyAgICAgICAgICBTdHJpbmcgbWV0YWRhdFZhbHVlID0gbS5ncm91cCgxKTsKKyAgICAgICAgICBtZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEVtYWlsKFN0cmluZyBlbWFpbFRleHQpIHsKKyAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoY2hlY2tGb3JQYXR0ZXJuKTsKKyAgICBNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoZW1haWxUZXh0LnJlcGxhY2VBbGwoIlxuIiwgIiAiKSk7CisgICAgcmV0dXJuIG0uZmluZCgpOworICB9CisgIAorICBwcml2YXRlIFN0cmluZyBsb2FkRmlsZVBhdHRlcm4oKSB7CisgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShGSUxFX1BBVFRFUk5TX1BST1BFUlRZX05BTUUpOworICB9CisgIAorICBwcml2YXRlIFN0cmluZyBsb2FkQ2hlY2tGb3JQYXR0ZXJuKCkgeworICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoQ0hFQ0tfRk9SX1BBVFRFUk5fUFJPUEVSVFlfTkFNRSk7ICAgIAorICB9CisgIAorICBwcml2YXRlIFN0cmluZyBsb2FkUGF0aFRvUm9vdCgpIHsKKyAgICByZXR1cm4gU3RyaW5ncy5udWxsVG9FbXB0eShTeXN0ZW0uZ2V0UHJvcGVydHkoUEFUSF9UT19ST09UX1BST1BFUlRZX05BTUUpKTsKKyAgfQorCisgIHByaXZhdGUgU2V0PFN0cmluZz4gbG9hZE1ldGFkYXRhS2V5cygpIHsKKyAgICByZXR1cm4gU2V0cy5uZXdIYXNoU2V0KFNwbGl0dGVyLm9uKCIsIikub21pdEVtcHR5U3RyaW5ncygpLnNwbGl0KAorICAgICAgICBTdHJpbmdzLm51bGxUb0VtcHR5KFN5c3RlbS5nZXRQcm9wZXJ0eShNRVRBREFUQV9LRVlTKSkpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGxvYWRNZXRhZGF0YUtleShTdHJpbmcga2V5KSB7CisgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShNRVRBREFUQV9LRVlfUFJFRklYICsga2V5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9yZW5hbWluZ2NvbnZlbnRpb25zL1JlbmFtaW5nQ29udmVudGlvbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9yZW5hbWluZ2NvbnZlbnRpb25zL1JlbmFtaW5nQ29udmVudGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTA5MzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL3JlbmFtaW5nY29udmVudGlvbnMvUmVuYW1pbmdDb252ZW50aW9uLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5yZW5hbWluZ2NvbnZlbnRpb25zOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW0uUmVtb3RlRmlsZTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFJlbmFtaW5nQ29udmVudGlvbiB7CisJCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUmVuYW1pbmdDb252ZW50aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIFJlbmFtaW5nQ29udmVudGlvbigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCBSZW5hbWluZ0NvbnZlbnRpb25zISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBmaWxlIG5hbWUgZm9yIHRoZSBnaXZlbiBQcm90b2NvbEZpbGUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZVRvR2VuTmV3TmFtZUZvcgorICAgICAqICAgICAgICAgICAgVGhlIGZpbGUgZm9yIHdoaWNoIGEgdW5pcXVlIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB1bmlxdWUgZmlsZSBuYW1lIChqdXN0IHRoZSBuYW1lKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWUoUmVtb3RlRmlsZSBmaWxlVG9HZW5OZXdOYW1lRm9yLAorICAgICAgICAgICAgU3RyaW5nIHJlbmFtaW5nU3RyaW5nKSB7CisgICAgCXRyeSB7CisgICAgCSAgICByZW5hbWluZ1N0cmluZyA9IGdyZXBSZXBsYWNlKHJlbmFtaW5nU3RyaW5nLCBmaWxlVG9HZW5OZXdOYW1lRm9yKTsKKyAgICAJICAgIHJlbmFtaW5nU3RyaW5nID0gZ3JlcFJlbW92ZVJlcGxhY2UocmVuYW1pbmdTdHJpbmcsIGZpbGVUb0dlbk5ld05hbWVGb3IpOworCSAgICAgICAgcmVuYW1pbmdTdHJpbmcgPSByZXBsYWNlKHJlbmFtaW5nU3RyaW5nLCAiW0ZJTEVOQU1FXSIsCisJICAgICAgICAgICAgICAgIGZpbGVUb0dlbk5ld05hbWVGb3IuZ2V0UHJvdG9jb2xGaWxlKCkuZ2V0TmFtZSgpKTsKKwkgICAgICAgIHJlbmFtaW5nU3RyaW5nID0gcmVwbGFjZShyZW5hbWluZ1N0cmluZywgIltQQVRIX05PX0ZJTEVOQU1FXSIsCisJICAgICAgICAgICAgICAgIGdldFBhcmVudFBhdGgoZmlsZVRvR2VuTmV3TmFtZUZvcikpOworCSAgICAgICAgcmVuYW1pbmdTdHJpbmcgPSByZXBsYWNlKHJlbmFtaW5nU3RyaW5nLCAiW0hPU1RdIiwgZmlsZVRvR2VuTmV3TmFtZUZvcgorCSAgICAgICAgICAgICAgICAuZ2V0UHJvdG9jb2xGaWxlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEhvc3QoKSk7CisJICAgICAgICByZW5hbWluZ1N0cmluZyA9IHJlcGxhY2UocmVuYW1pbmdTdHJpbmcsICJbUEFSRU5UX0ZJTEVOQU1FXSIsCisJICAgICAgICAgICAgICAgIGdldFBhcmVudEZpbGVOYW1lKGZpbGVUb0dlbk5ld05hbWVGb3IpKTsKKwkgICAgICAgIHJlbmFtaW5nU3RyaW5nID0gcmVwbGFjZShyZW5hbWluZ1N0cmluZywgIltQQVJFTlRfUEFUSF9OT19GSUxFTkFNRV0iLAorCSAgICAgICAgICAgICAgICBnZXRHcmFuZFBhcmVudFBhdGgoZmlsZVRvR2VuTmV3TmFtZUZvcikpOworCSAgICAgICAgcmVuYW1pbmdTdHJpbmcgPSByZXBsYWNlKHJlbmFtaW5nU3RyaW5nLCAiW1VSTF0iLCBmaWxlVG9HZW5OZXdOYW1lRm9yCisJICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisJICAgICAgICByZW5hbWluZ1N0cmluZyA9IHJlcGxhY2UocmVuYW1pbmdTdHJpbmcsICJbSVNfRElSXSIsIFN0cmluZworCSAgICAgICAgICAgICAgICAudmFsdWVPZihmaWxlVG9HZW5OZXdOYW1lRm9yLmdldFByb3RvY29sRmlsZSgpLmlzRGlyKCkpKTsKKwkgICAgICAgIHJlbmFtaW5nU3RyaW5nID0gUGF0aFV0aWxzLmRvRHluYW1pY1JlcGxhY2VtZW50KAorCSAgICAgICAgICAgIHJlbmFtaW5nU3RyaW5nLCBmaWxlVG9HZW5OZXdOYW1lRm9yLmdldEFsbE1ldGFkYXRhKCkpOworICAgIAl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gcmVuYW1lICIgKyBmaWxlVG9HZW5OZXdOYW1lRm9yIAorICAgIAkJCQkrICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIAl9CisgICAgICAgIHJldHVybiByZW5hbWluZ1N0cmluZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JlcFJlcGxhY2UoU3RyaW5nIHRoZVN0cmluZywgUmVtb3RlRmlsZSBmaWxlVG9HZW5OZXdOYW1lRm9yKSB7CisgICAgICAgIFBhdHRlcm4gZ3JlcFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcW0dSRVBcXCguKlxcLC4qXFwpXFxdIik7CisgICAgICAgIE1hdGNoZXIgZ3JlcE1hdGNoZXIgPSBncmVwUGF0dGVybi5tYXRjaGVyKHRoZVN0cmluZyk7CisgICAgICAgIHdoaWxlIChncmVwTWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBvcmlnR3JlcFN0cmluZyA9IHRoZVN0cmluZy5zdWJzdHJpbmcoZ3JlcE1hdGNoZXIuc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JlcE1hdGNoZXIuZW5kKCkpLnRyaW0oKTsKKyAgICAgICAgICAgIFN0cmluZyBncmVwU3RyaW5nID0gb3JpZ0dyZXBTdHJpbmcucmVwbGFjZSgiW0dSRVAoJyIsICIiKS5yZXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAiJyldIiwgIiIpLnRyaW0oKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGdyZXBTdHJpbmdTcGxpdCA9IGdyZXBTdHJpbmcuc3BsaXQoIicsJyIpOworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBncmVwU3RyaW5nU3BsaXRbMF07CisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gcmVuYW1lKGZpbGVUb0dlbk5ld05hbWVGb3IsIGdyZXBTdHJpbmdTcGxpdFsxXSk7CisgICAgICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybik7CisgICAgICAgICAgICBNYXRjaGVyIG0gPSBwLm1hdGNoZXIoc3RyaW5nKTsKKyAgICAgICAgICAgIGlmIChtLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIHRoZVN0cmluZyA9IHRoZVN0cmluZy5yZXBsYWNlKG9yaWdHcmVwU3RyaW5nLCBzdHJpbmcuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgbS5zdGFydCgpLCBtLmVuZCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoZVN0cmluZyA9IHRoZVN0cmluZy5yZXBsYWNlKG9yaWdHcmVwU3RyaW5nLCAibnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGVTdHJpbmc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdyZXBSZW1vdmVSZXBsYWNlKFN0cmluZyB0aGVTdHJpbmcsIFJlbW90ZUZpbGUgZmlsZVRvR2VuTmV3TmFtZUZvcikgeworICAgICAgICBQYXR0ZXJuIGdyZXBQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXFtHUkVQX1JNXFwoLiosLipcXClcXF0iKTsKKyAgICAgICAgTWF0Y2hlciBncmVwTWF0Y2hlciA9IGdyZXBQYXR0ZXJuLm1hdGNoZXIodGhlU3RyaW5nKTsKKyAgICAgICAgd2hpbGUgKGdyZXBNYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIG9yaWdHcmVwU3RyaW5nID0gdGhlU3RyaW5nLnN1YnN0cmluZyhncmVwTWF0Y2hlci5zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICBncmVwTWF0Y2hlci5lbmQoKSkudHJpbSgpOworICAgICAgICAgICAgU3RyaW5nIGdyZXBTdHJpbmcgPSBvcmlnR3JlcFN0cmluZy5yZXBsYWNlKCJbR1JFUF9STSgnIiwgIiIpCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCInKV0iLCAiIikudHJpbSgpOworICAgICAgICAgICAgU3RyaW5nW10gZ3JlcFN0cmluZ1NwbGl0ID0gZ3JlcFN0cmluZy5zcGxpdCgiJywnIik7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGdyZXBTdHJpbmdTcGxpdFswXTsKKyAgICAgICAgICAgIFN0cmluZyBzdHJpbmcgPSByZW5hbWUoZmlsZVRvR2VuTmV3TmFtZUZvciwgZ3JlcFN0cmluZ1NwbGl0WzFdKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUEFUX1NUUjogIiArIHBhdHRlcm4gKyAiICIgKyBzdHJpbmcpOworICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pOworICAgICAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKHN0cmluZyk7CisgICAgICAgICAgICBpZiAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICB0aGVTdHJpbmcgPSB0aGVTdHJpbmcucmVwbGFjZShvcmlnR3JlcFN0cmluZywgc3RyaW5nLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbS5lbmQoKSksICIiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoZVN0cmluZyA9IHRoZVN0cmluZy5yZXBsYWNlKG9yaWdHcmVwU3RyaW5nLCAibnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGVTdHJpbmc7CisgICAgfQorICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGhlU3RyaW5nLAorICAgICAgICAgICAgU3RyaW5nIHRoZVZhbHVlVG9CZVJlcGxhY2VkLCBTdHJpbmcgd2hhdFRvUmVwbGFjZVdpdGgpIHsKKyAgICAgICAgaWYgKHRoZVZhbHVlVG9CZVJlcGxhY2VkID09IG51bGwgfHwgdGhlVmFsdWVUb0JlUmVwbGFjZWQuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHJldHVybiB0aGVTdHJpbmc7CisgICAgICAgIGlmICh3aGF0VG9SZXBsYWNlV2l0aCA9PSBudWxsKQorICAgICAgICAgICAgd2hhdFRvUmVwbGFjZVdpdGggPSAiIjsKKyAgICAgICAgcmV0dXJuIHRoZVN0cmluZy5yZXBsYWNlKHRoZVZhbHVlVG9CZVJlcGxhY2VkLCB3aGF0VG9SZXBsYWNlV2l0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhcmVudFBhdGgoUmVtb3RlRmlsZSBmaWxlVG9HZW5OZXdOYW1lRm9yKSB7CisgICAgICAgIFN0cmluZyBwYXJlbnRQYXRoID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJlbnRQYXRoID0gZmlsZVRvR2VuTmV3TmFtZUZvci5nZXRQcm90b2NvbEZpbGUoKS5nZXRQYXJlbnQoKS5nZXRQYXRoKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmVudFBhdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhcmVudEZpbGVOYW1lKFJlbW90ZUZpbGUgZmlsZVRvR2VuTmV3TmFtZUZvcikgeworICAgICAgICBTdHJpbmcgcGFyZW50RmlsZU5hbWUgPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcmVudEZpbGVOYW1lID0gZmlsZVRvR2VuTmV3TmFtZUZvci5nZXRQcm90b2NvbEZpbGUoKS5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmVudEZpbGVOYW1lOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRHcmFuZFBhcmVudFBhdGgoUmVtb3RlRmlsZSBmaWxlVG9HZW5OZXdOYW1lRm9yKSB7CisgICAgICAgIFN0cmluZyBncmFuZFBhcmVudFBhdGggPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdyYW5kUGFyZW50UGF0aCA9IGZpbGVUb0dlbk5ld05hbWVGb3IuZ2V0UHJvdG9jb2xGaWxlKCkuZ2V0UGFyZW50KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFBhcmVudCgpLmdldFBhdGgoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ3JhbmRQYXJlbnRQYXRoOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvb2JqZWN0ZmFjdG9yeS9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL29iamVjdGZhY3RvcnkvUHVzaFB1bGxPYmplY3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5ZDlhZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL29iamVjdGZhY3RvcnkvUHVzaFB1bGxPYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLm9iamVjdGZhY3Rvcnk7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkNhY2hlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkluZ2VzdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFB1c2hQdWxsT2JqZWN0RmFjdG9yeSB7CisKKyAgICBwcml2YXRlIFB1c2hQdWxsT2JqZWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCBmYWN0b3J5IGNsYXNzZXMhIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBjcmVhdGVOZXdJbnN0YW5jZShDbGFzczxUPiBjbGF6eikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIAl0cnkgeworCQkJcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgbmV3IG9iamVjdCA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIEluZ2VzdGVyIGNyZWF0ZUluZ2VzdGVyKFN0cmluZyBpbmdlc3RlckNsYXNzLAorICAgICAgICAgICAgU3RyaW5nIGNhY2hlRmFjdG9yeUNsYXNzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uLAorICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGRhdGFUcmFuc2ZlckZhY3RvcnkgPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuZmFjdG9yeSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRSQU5TRkVSOiAiICsgZGF0YVRyYW5zZmVyRmFjdG9yeSk7CisgICAgICAgIGlmIChjYWNoZUZhY3RvcnlDbGFzcyA9PSBudWxsIHx8IGNhY2hlRmFjdG9yeUNsYXNzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAoSW5nZXN0ZXIpIENsYXNzLmZvck5hbWUoaW5nZXN0ZXJDbGFzcykuZ2V0Q29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlckZhY3RvcnkuZ2V0Q2xhc3MoKSkubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlckZhY3RvcnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3M8Q2FjaGVGYWN0b3J5PiBjYWNoZUZhY3RvcnkgPSAoQ2xhc3M8Q2FjaGVGYWN0b3J5PikgQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgLmZvck5hbWUoY2FjaGVGYWN0b3J5Q2xhc3MpOworICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBjYWNoZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDYWNoZSgpOworICAgICAgICAgICAgcmV0dXJuIChJbmdlc3RlcikgQ2xhc3MuZm9yTmFtZShpbmdlc3RlckNsYXNzKS5nZXRDb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyRmFjdG9yeS5nZXRDbGFzcygpLCBjYWNoZS5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoZGF0YVRyYW5zZmVyRmFjdG9yeSwgY2FjaGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9Qcm90b2NvbEhhbmRsZXIuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3Byb3RvY29sL1Byb3RvY29sSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZmNiODMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9Qcm90b2NvbEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDU4OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucHJvdG9jb2w7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGVGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLlByb3RvY29sSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmF1dGguQmFzaWNBdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmV4Y2VwdGlvbnMuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC51dGlsLlByb3RvY29sRmlsZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGFwcHJvcHJpYXRlIFByb3RvY29sIGZvciB0aGUgZ2l2ZW4KKyAqIFJlbW90ZVNpdGVzLiBUaGUgYm9vbGVhbiBhcmd1bWVudCAnYWxsb3dSZXVzZScgYWxsb3dzIGZvciBvbmUgdW5pcXVlIHByb3RvY29sCisgKiBmb3IgZWFjaCBVUkwuIFRoYXQgaXMsIGlmIGFsbG93UmV1c2UgaXMgc2V0IHRvIHRydWUsIHRoZW4gaWYgbm8gUHJvdG9jb2wgaGFzCisgKiBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBjdXJyZW50IHNpdGUsIHRoZSBQcm90b2NvbCBjcmVhdGVkIHdpbGwgYmUgc2F2ZWQgYW5kCisgKiB0aGVuIHJldHVybmVkIGZvciBhbnkgbGF0ZXIgY2FsbGVkIHdpdGggYWxsb3dSZXVzZSBlcXVhbHMgdHJ1ZS4gVGhpcyBpcyB0bworICogYWxsb3cgZm9yIHRoZSBzYW1lIFByb3RvY29sIG9iamVjdCB0byBiZSB1c2VkIGJ5IHNldmVyYWwgY2xhc3Nlcy4gVGhlCisgKiBQcm90b2NvbCBjbGFzcyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgc28gdGhpcyBpcyB0aHJlYWQtc2FmZS4gSWYgeW91IHNldAorICogJ2FsbG93UmV1c2UnIHRvIGZhbHNlIHRoZW4gYSBuZXcgUHJvdG9jb2wgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBhbmQKKyAqIHJldHVybmVkLjxicj4KKyAqIDxicj4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFByb3RvY29sSGFuZGxlciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFVSTCwgUHJvdG9jb2xGYWN0b3J5PiB1cmxBbmRQcm90b2NvbEZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFVSTCwgUHJvdG9jb2w+IHJldXNlUHJvdG9jb2xzOworCisgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxSZW1vdGVTaXRlRmlsZSwgUGFnaW5nSW5mbz4gcGFnZUluZm9zOworCisgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxSZW1vdGVTaXRlRmlsZSwgTGlzdDxSZW1vdGVTaXRlRmlsZT4+IHBhdGhBbmRGaWxlTGlzdE1hcDsKKworICBwcml2YXRlIGZpbmFsIFByb3RvY29sSW5mbyBwaTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihQcm90b2NvbEhhbmRsZXIuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFByb3RvY29sSGFuZGxlciBmb3IgdGhlIGdpdmVuIENvbmZpZyBvYmplY3QKKyAgICoKKyAgICogQHBhcmFtIGNvbmZpZworICAgKiAgICAgICAgICBUaGUgQ29uZmlnIG9iamVjdCB0aGF0IGd1aWRlcyB0aGlzIFByb3RvY29sSGFuZGxlciBpbiBtYWtpbmcgY2xhc3MKKyAgICogICAgICAgICAgaW5zdGFuY2lhdGlvbnMKKyAgICovCisgIHB1YmxpYyBQcm90b2NvbEhhbmRsZXIoUHJvdG9jb2xJbmZvIHBpKSB7CisgICAgdGhpcy5waSA9IHBpOworICAgIHVybEFuZFByb3RvY29sRmFjdG9yeSA9IG5ldyBIYXNoTWFwPFVSTCwgUHJvdG9jb2xGYWN0b3J5PigpOworICAgIHJldXNlUHJvdG9jb2xzID0gbmV3IEhhc2hNYXA8VVJMLCBQcm90b2NvbD4oKTsKKyAgICBwYWdlSW5mb3MgPSBuZXcgSGFzaE1hcDxSZW1vdGVTaXRlRmlsZSwgUGFnaW5nSW5mbz4oKTsKKyAgICBwYXRoQW5kRmlsZUxpc3RNYXAgPSBuZXcgSGFzaE1hcDxSZW1vdGVTaXRlRmlsZSwgTGlzdDxSZW1vdGVTaXRlRmlsZT4+KCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgcHJvdG9jb2wgZm9yIHRoZSBnaXZlbiBQYXRoCisgICAqCisgICAqIEBwYXJhbSBQcm90b2NvbFBhdGgKKyAgICogICAgICAgICAgVXNlZCB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIFByb3RvY29sIHRvIGJlIHJldHVybmVkIGFuZCB0aGUKKyAgICogICAgICAgICAgcGF0aCB0byBuYXZpZ2F0ZSBvbiBpZiBuYXZpZ2F0ZVRvUGF0aExvYyBpcyBzZXQgdG8gdHJ1ZS4KKyAgICogQHBhcmFtIGFsbG93UmV1c2UKKyAgICogICAgICAgICAgU2V0IHRvIHRydWUgaWYgeW91IHdvdWxkIGxpa2UgUHJvdG9jb2xIYW5kbGVyIHRvIHRha2UgY2FyZSBvZiB0aGUKKyAgICogICAgICAgICAgcHJvdG9jb2wgcmV0dXJuZWQgKGkuZS4gcmV1c2VhYmxlIHByb3RvY29scyBtYXkgYmUgcmV0dXJuZWQgYnkKKyAgICogICAgICAgICAgdGhpcyBtZXRob2QgYWdhaW4sIGlmIGl0IGlzIHRoZSBhcHByb3ByaWF0ZSBwcm90b2NvbCB0eXBlIGZvciBhCisgICAqICAgICAgICAgIGdpdmVuIFBhdGguIEFsc28gUHJvdG9jb2xIYW5kbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGRpc2Nvbm5lY3RpbmcKKyAgICogICAgICAgICAgdGhlIHJldXNlYWJsZSBwcm90b2NvbHMpCisgICAqIEBwYXJhbSBuYXZpZ2F0ZVRvUGF0aExvYworICAgKiAgICAgICAgICBJZiB0cnVlLCB3aWxsIG5hdmlnYXRlIHRoZSB0byB0aGUgZW5kIG9mIHRoZSBQYXRoIGxvY2F0aW9uCisgICAqICAgICAgICAgIHNwZWNpZmllZAorICAgKiBAcmV0dXJuIFByb3RvY29sIGZvciB0aGUgZ2l2ZW4gUGF0aAorICAgKiBAdGhyb3dzIFJlbW90ZUNvbW11bmljYXRpb25FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIFByb3RvY29sIGdldEFwcHJvcHJpYXRlUHJvdG9jb2woUmVtb3RlU2l0ZUZpbGUgcEZpbGUsCisgICAgICBib29sZWFuIGFsbG93UmV1c2UsIGJvb2xlYW4gbmF2aWdhdGVUb1BhdGhMb2MpCisgICAgICB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFByb3RvY29sIHByb3RvY29sID0gZ2V0QXBwcm9wcmlhdGVQcm90b2NvbChwRmlsZSwgYWxsb3dSZXVzZSk7CisgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBuYXZpZ2F0ZVRvUGF0aExvYykgeworICAgICAgICBpZiAocEZpbGUuaXNEaXIoKSkKKyAgICAgICAgICB0aGlzLmNkKHByb3RvY29sLCBwRmlsZSk7CisgICAgICAgIGVsc2UgaWYgKHBGaWxlLmdldFBhcmVudCgpICE9IG51bGwpCisgICAgICAgICAgdGhpcy5jZChwcm90b2NvbCwgbmV3IFJlbW90ZVNpdGVGaWxlKHBGaWxlLmdldFBhcmVudCgpLCBwRmlsZS5nZXRTaXRlKCkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwcm90b2NvbDsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgIkZhaWxlZCB0byBnZXQgYXBwcm9wcmlhdGUgcHJvdG9jb2wgZm9yICIgKyBwRmlsZSArICIgOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgUHJvdG9jb2wgZ2V0QXBwcm9wcmlhdGVQcm90b2NvbChSZW1vdGVTaXRlRmlsZSBwRmlsZSwKKyAgICAgIGJvb2xlYW4gYWxsb3dSZXVzZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgIHJldHVybiB0aGlzLmdldEFwcHJvcHJpYXRlUHJvdG9jb2xCeVNpdGUocEZpbGUuZ2V0U2l0ZSgpLCBhbGxvd1JldXNlKTsKKyAgfQorCisgIHB1YmxpYyBQcm90b2NvbCBnZXRBcHByb3ByaWF0ZVByb3RvY29sQnlTaXRlKFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSwKKyAgICAgIGJvb2xlYW4gYWxsb3dSZXVzZSkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBQcm90b2NvbCBwcm90b2NvbCA9IG51bGw7CisgICAgaWYgKChhbGxvd1JldXNlICYmICgocHJvdG9jb2wgPSByZXVzZVByb3RvY29scy5nZXQocmVtb3RlU2l0ZS5nZXRVUkwoKSkpID09IG51bGwpKQorICAgICAgICB8fCAhYWxsb3dSZXVzZSkgeworICAgICAgUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSA9IHRoaXMudXJsQW5kUHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgLmdldChyZW1vdGVTaXRlLmdldFVSTCgpKTsKKyAgICAgIGlmIChwcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICBMaW5rZWRMaXN0PENsYXNzPFByb3RvY29sRmFjdG9yeT4+IHByb3RvY29sQ2xhc3NlcyA9IHBpCisgICAgICAgICAgICAuZ2V0UHJvdG9jb2xDbGFzc2VzRm9yUHJvdG9jb2xUeXBlKHJlbW90ZVNpdGUuZ2V0VVJMKCkKKyAgICAgICAgICAgICAgICAuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgIGZvciAoQ2xhc3M8UHJvdG9jb2xGYWN0b3J5PiBjbGF6eiA6IHByb3RvY29sQ2xhc3NlcykgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoKHByb3RvY29sID0gKHByb3RvY29sRmFjdG9yeSA9IGNsYXp6Lm5ld0luc3RhbmNlKCkpCisgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgaWYgKCFjb25uZWN0KHByb3RvY29sLCByZW1vdGVTaXRlLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coCisgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJQcm90b2NvbEZhY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm90b2NvbEZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHNlcnZlciBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZVNpdGUuZ2V0VVJMKCkpOworICAgICAgICAgICAgICAgIHByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLnVybEFuZFByb3RvY29sRmFjdG9yeS5wdXQocmVtb3RlU2l0ZS5nZXRVUkwoKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gaW5zdGFuY2lhdGUgcHJvdG9jb2wgIiArIGNsYXp6CisgICAgICAgICAgICAgICAgKyAiIGZvciAiICsgcmVtb3RlU2l0ZS5nZXRVUkwoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKQorICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBhcHByb3ByaWF0ZSBwcm90b2NvbCBmb3IgIgorICAgICAgICAgICAgICArIHJlbW90ZVNpdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdChwcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5uZXdJbnN0YW5jZSgpLCByZW1vdGVTaXRlLCBmYWxzZSk7CisgICAgICB9CisgICAgICBpZiAoYWxsb3dSZXVzZSkKKyAgICAgICAgdGhpcy5yZXVzZVByb3RvY29scy5wdXQocmVtb3RlU2l0ZS5nZXRVUkwoKSwgcHJvdG9jb2wpOworICAgIH0KKyAgICByZXR1cm4gcHJvdG9jb2w7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IG5leHRQYWdlKFJlbW90ZVNpdGUgc2l0ZSwgUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUHJvdG9jb2xFeGNlcHRpb24geworICAgIHJldHVybiBuZXh0UGFnZShzaXRlLCBwcm90b2NvbCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHByb3RvY29sCisgICAqIEByZXR1cm4KKyAgICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCisgICAqIEB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxSZW1vdGVTaXRlRmlsZT4gbmV4dFBhZ2UoUmVtb3RlU2l0ZSBzaXRlLCBQcm90b2NvbCBwcm90b2NvbCwKKyAgICAgIFByb3RvY29sRmlsZUZpbHRlciBmaWx0ZXIpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLAorICAgICAgUHJvdG9jb2xFeGNlcHRpb24geworCisgICAgUGFnaW5nSW5mbyBwZ0luZm8gPSB0aGlzLmdldFBhZ2luZ0luZm8odGhpcy5wd2Qoc2l0ZSwgcHJvdG9jb2wpKTsKKyAgICB0cnkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYWdlU2l6ZTogIiArIHBpLmdldFBhZ2VTaXplKCkgKyAiIFBhZ2VMb2M6ICIKKyAgICAgICAgICArIHBnSW5mby5nZXRQYWdlTG9jKCkpOworICAgICAgTGlzdDxSZW1vdGVTaXRlRmlsZT4gZmlsZUxpc3QgPSB0aGlzLmxzKHNpdGUsIHByb3RvY29sKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZUxpc3Qgc2l6ZTogIiArIGZpbGVMaXN0LnNpemUoKSk7CisKKyAgICAgIGlmICh0aGlzLmdldER5bmFtaWNGaWxlTGlzdChzaXRlLCBwcm90b2NvbCkgPT0gbnVsbAorICAgICAgICAgICYmICF0aGlzLnBhc3Nlc0R5bmFtaWNEZXRlY3Rpb24ocGdJbmZvLCBmaWxlTGlzdCkpIHsKKyAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJSZW1vdGUgZGlyZWN0b3J5ICciCisgICAgICAgICAgICAgICAgKyB0aGlzLnB3ZChzaXRlLCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICArICInIGZpbGUgbGlzdCBzaXplIGhhcyBjaGFuZ2VkIC0tIHNldHRpbmcgZGlyZWN0b3J5IGFzIGR5bmFtaWMgYW5kIHJlc2V0dGluZyBwYWdlIGxvY2F0aW9uIik7CisgICAgICAgIHRoaXMucHV0RHluYW1pY0ZpbGVMaXN0KHNpdGUsIHByb3RvY29sLCBmaWxlTGlzdCk7CisgICAgICAgIHBnSW5mby51cGRhdGVQYWdlSW5mbygwLCBmaWxlTGlzdCk7CisgICAgICB9CisKKyAgICAgIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IHBhZ2UgPSBuZXcgTGlua2VkTGlzdDxSZW1vdGVTaXRlRmlsZT4oKTsKKyAgICAgIGludCBjdXJMb2MgPSBwZ0luZm8uZ2V0UGFnZUxvYygpOworICAgICAgZm9yICg7IHBhZ2Uuc2l6ZSgpIDwgcGkuZ2V0UGFnZVNpemUoKSAmJiBjdXJMb2MgPCBmaWxlTGlzdC5zaXplKCk7IGN1ckxvYysrKSB7CisgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGZpbGVMaXN0LmdldChjdXJMb2MpKSkKKyAgICAgICAgICBwYWdlLmFkZChmaWxlTGlzdC5nZXQoY3VyTG9jKSk7CisgICAgICB9CisgICAgICBwZ0luZm8udXBkYXRlUGFnZUluZm8oY3VyTG9jLCBmaWxlTGlzdCk7CisKKyAgICAgIHJldHVybiBwYWdlOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgIkZhaWxlZCBnZXR0aW5nIG5leHQgcGFnZSBmb3IgcHJvdG9jb2wgIiArIHByb3RvY29sICsgIi0tIHBnU3RhcnQgPSAiCisgICAgICAgICAgICAgICsgcGdJbmZvLmdldFBhZ2VMb2MoKSArICIgcGdTaXplID0gIiArIHBpLmdldFBhZ2VTaXplKCkgKyAiIDogIgorICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBwYXNzZXNEeW5hbWljRGV0ZWN0aW9uKFBhZ2luZ0luZm8gcGdJbmZvLAorICAgICAgTGlzdDxSZW1vdGVTaXRlRmlsZT4gbmV3TFMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgaWYgKHBnSW5mby5nZXRTaXplT2ZMYXN0TFMoKSAhPSAtMQorICAgICAgICAmJiAocGdJbmZvLmdldFNpemVPZkxhc3RMUygpICE9IG5ld0xTLnNpemUoKSB8fCAobmV3TFMuc2l6ZSgpICE9IDAKKyAgICAgICAgICAgICYmIHBnSW5mby5nZXRQYWdlTG9jKCkgPCBuZXdMUy5zaXplKCkgJiYgKG5ld0xTLmdldChwZ0luZm8KKyAgICAgICAgICAgIC5nZXRQYWdlTG9jKCkpID09IG51bGwgfHwgIW5ld0xTLmdldChwZ0luZm8uZ2V0UGFnZUxvYygpKS5lcXVhbHMoCisgICAgICAgICAgICBwZ0luZm8uZ2V0UmVtb3RlU2l0ZUZpbGVBdFBhZ2VMb2MoKSkpKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgZG93bmxvYWQoUHJvdG9jb2wgcHJvdG9jb2wsIFJlbW90ZVNpdGVGaWxlIGZyb21GaWxlLCBGaWxlIHRvRmlsZSwKKyAgICAgIGJvb2xlYW4gZGVsZXRlKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAvLyByZW5hbWUgZmlsZSBmb3IgZG93bmxvYWQKKyAgICBGaWxlIGRvd25sb2FkRmlsZSA9IG5ldyBGaWxlKAorICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcy9Eb3dubG9hZGluZ18lcyIsIHRvRmlsZS5nZXRQYXJlbnQoKSwgdG9GaWxlLmdldE5hbWUoKSkpOworICAgIHRvRmlsZS5yZW5hbWVUbyhkb3dubG9hZEZpbGUpOworCisgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU3RhcnRpbmcgdG8gZG93bmxvYWQgIiArIGZyb21GaWxlKTsKKyAgICB0cnkgeworICAgICAgLy8gdHJ5IHRvIGRvd25sb2FkIHRoZSBmaWxlCisgICAgICBwcm90b2NvbC5nZXQoZnJvbUZpbGUsIGRvd25sb2FkRmlsZSk7CisKKyAgICAgIC8vIHJlbmFtZSBmaWxlIGJhY2sgdG8gb3JpZ2luYWwgbmFtZQorICAgICAgaWYgKCFkb3dubG9hZEZpbGUucmVuYW1lVG8odG9GaWxlKSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gcmVuYW1lIGZpbGUgJXMgdG8gJXMiLCBkb3dubG9hZEZpbGUsIHRvRmlsZSkpOworICAgICAgfQorCisgICAgICAvLyBkZWxldGUgZmlsZSBpcyBzcGVjaWZpZWQKKyAgICAgIGlmIChkZWxldGUpIHsKKyAgICAgICAgaWYgKCF0aGlzLmRlbGV0ZShwcm90b2NvbCwgZnJvbUZpbGUpKQorICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkZhaWxlZCB0byBkZWxldGUgZmlsZSAnIiArIGZyb21GaWxlCisgICAgICAgICAgICAgICsgIicgZnJvbSBzZXJ2ZXIgJyIgKyBmcm9tRmlsZS5nZXRTaXRlKCkgKyAiJyIpOworICAgICAgICBlbHNlCisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZmlsZSAnIiArIGZyb21GaWxlCisgICAgICAgICAgICAgICsgIicgZnJvbSBzZXJ2ZXIgJyIgKyBmcm9tRmlsZS5nZXRTaXRlKCkgKyAiJyIpOworICAgICAgfQorCisgICAgICBMT0cubG9nKExldmVsLklORk8sICJGaW5pc2hlZCBkb3dubG9hZGluZyAiICsgZnJvbUZpbGUgKyAiIHRvICIgKyB0b0ZpbGUpOworCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGRvd25sb2FkRmlsZS5kZWxldGUoKTsKKyAgICAgIHRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZG93bmxvYWQgZmlsZSAiICsgZnJvbUZpbGUKKyAgICAgICAgICArICIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb25uZWN0cyB0aGUgZ2l2ZW4gUHJvdG9jb2wgdG8gdGhlIGdpdmVuIFVSTAorICAgKgorICAgKiBAcGFyYW0gcHJvdG9jb2wKKyAgICogICAgICAgICAgVGhlIFByb3RvY29sIHRoYXQgd2lsbCBiZSBjb25uZWN0ZWQKKyAgICogQHBhcmFtIHVybAorICAgKiAgICAgICAgICBUaGUgc2VydmVyIHRvIHdoaWNoIHRoZSBQcm90b2NvbCB3aWxsIGNvbm5lY3QKKyAgICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBjb25uZWN0aW9uIGZhaWxzCisgICAqIEB0aHJvd3MgUmVtb3RlTG9naW5FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGxvZ2luIGZhaWxzCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KFByb3RvY29sIHByb3RvY29sLCBSZW1vdGVTaXRlIHJlbW90ZVNpdGUsIGJvb2xlYW4gdGVzdCkgeworICAgIGZvciAoaW50IHRyaWVzID0gMDsgdHJpZXMgPCAzOyB0cmllcysrKSB7CisKKyAgICAgIC8vIHdhaXQgZm9yIDUgc2VjcyBiZWZvcmUgbmV4dCByZXRyeQorICAgICAgaWYgKHRyaWVzID4gMCkgeworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJXaWxsIHJldHJ5IGNvbm5lY3RpbmcgdG8gIiArIHJlbW90ZVNpdGUKKyAgICAgICAgICAgICsgIiBpbiA1IHNlY29uZHMiKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIldhaXRpbmciKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAuIik7CisgICAgICAgICAgICAgIHdhaXQoMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICAvLyBtYWtlIHN1cmUgcHJvdG9jb2wgaXMgZGlzY29ubmVjdGVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgcHJvdG9jb2wuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSBjb25uZWN0aW5nIFByb3RvY29sCisgICAgICAgIHByb3RvY29sLmNvbm5lY3QoCisgICAgICAgICAgICByZW1vdGVTaXRlLmdldFVSTCgpLmdldEhvc3QoKSwKKyAgICAgICAgICAgIG5ldyBCYXNpY0F1dGhlbnRpY2F0aW9uKHJlbW90ZVNpdGUuZ2V0VXNlcm5hbWUoKSwgcmVtb3RlU2l0ZQorICAgICAgICAgICAgICAgIC5nZXRQYXNzd29yZCgpKSk7CisKKyAgICAgICAgLy8gY2hlY2sgY29ubmVjdGlvbgorICAgICAgICBpZiAocHJvdG9jb2wuY29ubmVjdGVkKCkKKyAgICAgICAgICAgICYmICghdGVzdCB8fCBpc09rUHJvdG9jb2wocHJvdG9jb2wsIHJlbW90ZVNpdGUpKSkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gIiArIHJlbW90ZVNpdGUuZ2V0VVJMKCkKKyAgICAgICAgICAgICAgICAgICsgIiB3aXRoIHByb3RvY29sICciICsgcHJvdG9jb2wuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICsgIicgYW5kIHVzZXJuYW1lICciICsgcmVtb3RlU2l0ZS5nZXRVc2VybmFtZSgpICsgIiciKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvICIKKyAgICAgICAgICAgICsgcmVtb3RlU2l0ZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc09rUHJvdG9jb2woUHJvdG9jb2wgcHJvdG9jb2wsIFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSkgeworICAgIHRyeSB7CisgICAgICBMT0cubG9nKExldmVsLklORk8sICJUZXN0aW5nIHByb3RvY29sICIKKyAgICAgICAgICArIHByb3RvY29sLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpCisgICAgICAgICAgKyAiIC4gLiAuIHRoaXMgbWF5IHRha2UgYSBmZXcgbWludXRlcyAuIC4gLiIpOworICAgICAgLy8gdGVzdCBscywgY2QsIGFuZCBwd2QKKyAgICAgIHRoaXMuY2RUb0hPTUUocHJvdG9jb2wpOworICAgICAgUmVtb3RlU2l0ZUZpbGUgaG9tZSA9IHRoaXMucHdkKHJlbW90ZVNpdGUsIHByb3RvY29sKTsKKyAgICAgIHRoaXMubHMocmVtb3RlU2l0ZSwgcHJvdG9jb2wpOworICAgICAgaWYgKHJlbW90ZVNpdGUuZ2V0Q2RUZXN0RGlyKCkgIT0gbnVsbCkKKyAgICAgICAgdGhpcy5jZChwcm90b2NvbCwgbmV3IFJlbW90ZVNpdGVGaWxlKGhvbWUsIHJlbW90ZVNpdGUuZ2V0Q2RUZXN0RGlyKCksCisgICAgICAgICAgICB0cnVlLCByZW1vdGVTaXRlKSk7CisgICAgICBlbHNlCisgICAgICAgIHRoaXMuY2RUb1JPT1QocHJvdG9jb2wpOworICAgICAgdGhpcy5jZFRvSE9NRShwcm90b2NvbCk7CisgICAgICBpZiAoaG9tZSA9PSBudWxsIHx8ICFob21lLmVxdWFscyh0aGlzLnB3ZChyZW1vdGVTaXRlLCBwcm90b2NvbCkpKQorICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkhvbWUgZGlyZWN0b3J5IG5vdCB0aGUgc2FtZSBhZnRlciBjZCIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIlByb3RvY29sICIKKyAgICAgICAgICArIHByb3RvY29sLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpCisgICAgICAgICAgKyAiIGZhaWxlZCBjb21wYXRpYmlsaXR5IHRlc3QgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNkVG9ST09UKFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgIHByb3RvY29sLmNkUm9vdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgY2RUb0hPTUUoUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgcHJvdG9jb2wuY2RIb21lKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1Byb3RvY29sQ29ubmVjdGVkKFByb3RvY29sIHByb3RvY29sKQorICAgICAgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcHJvdG9jb2wuY29ubmVjdGVkKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjZChQcm90b2NvbCBwcm90b2NvbCwgUmVtb3RlU2l0ZUZpbGUgZmlsZSkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgcHJvdG9jb2wuY2QoZmlsZSk7CisgIH0KKworICBwdWJsaWMgUmVtb3RlU2l0ZUZpbGUgZ2V0UHJvdG9jb2xGaWxlRm9yKFJlbW90ZVNpdGUgc2l0ZSwgUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBmaWxlLAorICAgICAgYm9vbGVhbiBpc0RpcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdGhpcy5nZXRQcm90b2NvbEZpbGVCeVByb3RvY29sKHNpdGUsIHByb3RvY29sLCBmaWxlLCBpc0Rpcik7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGVsZXRlKFByb3RvY29sIHByb3RvY29sLCBSZW1vdGVTaXRlRmlsZSBmaWxlKQorICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdG9jb2xFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBQYWdpbmdJbmZvIHBnSW5mbyA9IHRoaXMuZ2V0UGFnaW5nSW5mbyhmaWxlLmdldFJlbW90ZVBhcmVudCgpKTsKKyAgICAgIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IGZpbGVMaXN0ID0gdGhpcy5scyhwcm90b2NvbCwgZmlsZS5nZXRSZW1vdGVQYXJlbnQoKSk7CisgICAgICBpbnQgaW5kZXhPZkZpbGUgPSBmaWxlTGlzdC5pbmRleE9mKGZpbGUpOworICAgICAgaWYgKGluZGV4T2ZGaWxlICE9IC0xKSB7CisgICAgICAgIHByb3RvY29sLmRlbGV0ZShmaWxlKTsKKyAgICAgICAgZmlsZUxpc3QucmVtb3ZlKGluZGV4T2ZGaWxlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbmRleE9mRmlsZTogIiArIGluZGV4T2ZGaWxlICsgIiBQYWdlSW5kZXg6ICIKKyAgICAgICAgICAgICsgcGdJbmZvLmdldFBhZ2VMb2MoKSk7CisgICAgICAgIGlmIChpbmRleE9mRmlsZSA8IHBnSW5mby5nZXRQYWdlTG9jKCkKKyAgICAgICAgICAgIHx8IGluZGV4T2ZGaWxlID09IGZpbGVMaXN0LnNpemUoKSAtIDEpCisgICAgICAgICAgcGdJbmZvLnVwZGF0ZVBhZ2VJbmZvKHBnSW5mby5nZXRQYWdlTG9jKCkgLSAxLCBmaWxlTGlzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwZ0luZm8udXBkYXRlUGFnZUluZm8ocGdJbmZvLmdldFBhZ2VMb2MoKSwgZmlsZUxpc3QpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gZGVsZXRlIGZpbGUiLCBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHB1dFBnSW5mbyhQYWdpbmdJbmZvIHBnSW5mbywgUmVtb3RlU2l0ZUZpbGUgcEZpbGUpIHsKKyAgICB0aGlzLnBhZ2VJbmZvcy5wdXQocEZpbGUsIHBnSW5mbyk7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCBQYWdpbmdJbmZvIGdldFBhZ2luZ0luZm8oUmVtb3RlU2l0ZUZpbGUgcEZpbGUpIHsKKyAgICBQYWdpbmdJbmZvIHBnSW5mbyA9IHRoaXMucGFnZUluZm9zLmdldChwRmlsZSk7CisgICAgaWYgKHBnSW5mbyA9PSBudWxsKQorICAgICAgdGhpcy5wdXRQZ0luZm8ocGdJbmZvID0gbmV3IFBhZ2luZ0luZm8oKSwgcEZpbGUpOworICAgIHJldHVybiBwZ0luZm87CisgIH0KKworICBwdWJsaWMgUmVtb3RlU2l0ZUZpbGUgcHdkKFJlbW90ZVNpdGUgc2l0ZSwgUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBSZW1vdGVTaXRlRmlsZShwcm90b2NvbC5wd2QoKSwgc2l0ZSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxSZW1vdGVTaXRlRmlsZT4gbHMoUHJvdG9jb2wgcHJvdG9jb2wsIFJlbW90ZVNpdGVGaWxlIGRpcikKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZW1vdGVTaXRlRmlsZT4gZmlsZUxpc3QgPSB0aGlzLmdldER5bmFtaWNGaWxlTGlzdChkaXIuZ2V0U2l0ZSgpLCBwcm90b2NvbCk7CisgICAgaWYgKGZpbGVMaXN0ID09IG51bGwpIHsKKyAgICAgIHByb3RvY29sLmNkKGRpcik7CisgICAgICBmaWxlTGlzdCA9IHRvUmVtb3RlU2l0ZUZpbGVzKHByb3RvY29sLmxzKCksIGRpci5nZXRTaXRlKCkpOworICAgIH0KKyAgICByZXR1cm4gZmlsZUxpc3Q7CisgIH0KKworICBwdWJsaWMgTGlzdDxSZW1vdGVTaXRlRmlsZT4gbHMoUmVtb3RlU2l0ZSBzaXRlLCBQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJlbW90ZVNpdGVGaWxlPiBmaWxlTGlzdCA9IHRoaXMuZ2V0RHluYW1pY0ZpbGVMaXN0KHNpdGUsIHByb3RvY29sKTsKKyAgICBpZiAoZmlsZUxpc3QgPT0gbnVsbCkKKyAgICAgIGZpbGVMaXN0ID0gdG9SZW1vdGVTaXRlRmlsZXMocHJvdG9jb2wubHMoKSwgc2l0ZSk7CisgICAgcmV0dXJuIGZpbGVMaXN0OworICB9CisKKyAgcHVibGljIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IGxzKFJlbW90ZVNpdGUgc2l0ZSwgUHJvdG9jb2wgcHJvdG9jb2wsIFByb3RvY29sRmlsZUZpbHRlciBmaWx0ZXIpCisgICAgICB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IGZpbGVMaXN0ID0gdGhpcy5nZXREeW5hbWljRmlsZUxpc3Qoc2l0ZSwgcHJvdG9jb2wpOworICAgIGlmIChmaWxlTGlzdCA9PSBudWxsKQorICAgICAgZmlsZUxpc3QgPSB0b1JlbW90ZVNpdGVGaWxlcyhwcm90b2NvbC5scyhmaWx0ZXIpLCBzaXRlKTsKKyAgICByZXR1cm4gZmlsZUxpc3Q7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCBMaXN0PFJlbW90ZVNpdGVGaWxlPiBnZXREeW5hbWljRmlsZUxpc3QoUmVtb3RlU2l0ZSBzaXRlLCBQcm90b2NvbCBwcm90b2NvbCkKKyAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChMaXN0PFJlbW90ZVNpdGVGaWxlPikgKExpc3Q8Pz4pIHRoaXMucGF0aEFuZEZpbGVMaXN0TWFwLmdldCh0aGlzCisgICAgICAgIC5wd2Qoc2l0ZSwgcHJvdG9jb2wpKTsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcHV0RHluYW1pY0ZpbGVMaXN0KFJlbW90ZVNpdGUgc2l0ZSwgUHJvdG9jb2wgcHJvdG9jb2wsCisgICAgICBMaXN0PFJlbW90ZVNpdGVGaWxlPiBmaWxlTGlzdCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0aGlzLnBhdGhBbmRGaWxlTGlzdE1hcC5wdXQodGhpcy5wd2Qoc2l0ZSwgcHJvdG9jb2wpLCBmaWxlTGlzdCk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIFJlbW90ZVNpdGVGaWxlIGdldEhvbWVEaXIoUmVtb3RlU2l0ZSBzaXRlLCBQcm90b2NvbCBwcm90b2NvbCkgeworICAgIHRyeSB7CisgICAgICBwcm90b2NvbC5jZEhvbWUoKTsKKyAgICAgIHJldHVybiBuZXcgUmVtb3RlU2l0ZUZpbGUocHJvdG9jb2wucHdkKCksIHNpdGUpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRBYnNQYXRoRm9yKFByb3RvY29sIHByb3RvY29sLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0RpcikgeworICAgIHRyeSB7CisgICAgICBwcm90b2NvbC5jZChuZXcgUHJvdG9jb2xGaWxlKHBhdGgsIGlzRGlyKSk7CisgICAgICByZXR1cm4gcHJvdG9jb2wucHdkKCkuZ2V0QWJzb2x1dGVGaWxlKCkuZ2V0UGF0aCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERpc2Nvbm5lY3RzIGFuZCBsb2dzIG91dCB0aGUgZ2l2ZW4gUHJvdG9jb2wKKyAgICoKKyAgICogQHBhcmFtIHByb3RvY29sCisgICAqICAgICAgICAgIFRoZSBQcm90b2NvbCB0byBiZSBsb2dvdXQgb3V0IGFuZCBkaXNjb25uZWN0ZWQKKyAgICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkRpc2Nvbm5lY3RpbmcgcHJvdG9jb2wgIiArIHByb3RvY29sLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgIHByb3RvY29sLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKCJFcnJvciBkaXNjb25uZWN0aW5nICIgKyBwcm90b2NvbC5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERpc2Nvbm5lY3RzIGFsbCB3YWl0aW5nIFByb3RvY29scyBhbmQgY2xlYXJzIHRoZSB3YWl0aW5nIGxpc3RzLiBBbHNvIGNsZWFycworICAgKiB0aGUgY3VycmVudCBQcm90b2NvbAorICAgKgorICAgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24geworICAgIFNldDxFbnRyeTxVUkwsIFByb3RvY29sPj4gZW50cmllcyA9IHJldXNlUHJvdG9jb2xzLmVudHJ5U2V0KCk7CisgICAgZm9yIChFbnRyeTxVUkwsIFByb3RvY29sPiBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgIGRpc2Nvbm5lY3QoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIHRoaXMucmV1c2VQcm90b2NvbHMuY2xlYXIoKTsKKyAgICB0aGlzLnVybEFuZFByb3RvY29sRmFjdG9yeS5jbGVhcigpOworICAgIHRoaXMucGFnZUluZm9zLmNsZWFyKCk7CisgICAgdGhpcy5wYXRoQW5kRmlsZUxpc3RNYXAuY2xlYXIoKTsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIFJlbW90ZVNpdGVGaWxlIGdldFByb3RvY29sRmlsZUJ5UHJvdG9jb2woCisgICAgICBSZW1vdGVTaXRlIHNpdGUsIFByb3RvY29sIHByb3RvY29sLCBTdHJpbmcgZmlsZSwgYm9vbGVhbiBpc0RpcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgaWYgKCFmaWxlLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICBwcm90b2NvbC5jZEhvbWUoKTsKKyAgICAgICAgZmlsZSA9IHByb3RvY29sLnB3ZCgpLmdldFBhdGgoKSArICIvIiArIGZpbGU7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IFJlbW90ZVNpdGVGaWxlKGZpbGUsIGlzRGlyLCBzaXRlKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHByb3RvY29sIGZvciAiICsgZmlsZQorICAgICAgICAgICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBMaXN0PFJlbW90ZVNpdGVGaWxlPiB0b1JlbW90ZVNpdGVGaWxlcyhMaXN0PFByb3RvY29sRmlsZT4gZmlsZXMsIFJlbW90ZVNpdGUgc2l0ZSkgeworICAgIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IG5ld0ZpbGVzID0gbmV3IFZlY3RvcjxSZW1vdGVTaXRlRmlsZT4oKTsKKyAgICBpZiAoZmlsZXMgIT0gbnVsbCkgeworICAgICAgZm9yIChQcm90b2NvbEZpbGUgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgIG5ld0ZpbGVzLmFkZChuZXcgUmVtb3RlU2l0ZUZpbGUoZmlsZSwgc2l0ZSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3RmlsZXM7CisgIH0KKworICBjbGFzcyBQYWdpbmdJbmZvIHsKKworICAgIHByaXZhdGUgaW50IHBhZ2VMb2M7CisKKyAgICBwcml2YXRlIGludCBzaXplT2ZMYXN0TFM7CisKKyAgICBwcml2YXRlIFJlbW90ZVNpdGVGaWxlIHBGaWxlQXRQYWdlTG9jOworCisgICAgUGFnaW5nSW5mbygpIHsKKyAgICAgIHRoaXMucGFnZUxvYyA9IDA7CisgICAgICB0aGlzLnNpemVPZkxhc3RMUyA9IC0xOworICAgICAgdGhpcy5wRmlsZUF0UGFnZUxvYyA9IG51bGw7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlUGFnZUluZm8oaW50IG5ld1BhZ2VMb2MsIExpc3Q8UmVtb3RlU2l0ZUZpbGU+IGxzKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgICB0aGlzLnNpemVPZkxhc3RMUyA9IGxzLnNpemUoKTsKKyAgICAgIHRoaXMucGFnZUxvYyA9IG5ld1BhZ2VMb2MgPCAwID8gMCA6IG5ld1BhZ2VMb2M7CisgICAgICB0aGlzLnBGaWxlQXRQYWdlTG9jID0gKHRoaXMuc2l6ZU9mTGFzdExTID4gMCAmJiBuZXdQYWdlTG9jIDwgbHMuc2l6ZSgpKSA/IGxzCisgICAgICAgICAgLmdldChuZXdQYWdlTG9jKSA6IG51bGw7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIGludCBnZXRQYWdlTG9jKCkgeworICAgICAgcmV0dXJuIHRoaXMucGFnZUxvYzsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgaW50IGdldFNpemVPZkxhc3RMUygpIHsKKyAgICAgIHJldHVybiB0aGlzLnNpemVPZkxhc3RMUzsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgUmVtb3RlU2l0ZUZpbGUgZ2V0UmVtb3RlU2l0ZUZpbGVBdFBhZ2VMb2MoKSB7CisgICAgICByZXR1cm4gdGhpcy5wRmlsZUF0UGFnZUxvYzsKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9Qcm90b2NvbFBhdGguamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3Byb3RvY29sL1Byb3RvY29sUGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYWFmOGUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9Qcm90b2NvbFBhdGguamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd3JhcHMgdXAgYSBVUkwgZm9yIGEgZ2l2ZW4gcGF0aCwgYW5kIHdoZXRoZXIgdGhlIHBhdGggc3BlY2lmaWVkIGJ5CisgKiB0aGUgVVJMIGlzIGEgZGlyY3Rvcnkgb3Igbm90CisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgUHJvdG9jb2xQYXRoIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwNzI3NTI0ODgxMTk0OTEyMEw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHZlcmlvbiBvZiB0aGUgcGF0aCBpbiB0aGUgVVJMCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoOworCisgICAgcHJvdGVjdGVkIFN0cmluZyByZW1vdGVQYXRoOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVsYXRpdmVUb0hPTUU7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBhdGggaXMgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IG9yIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcjsKKworICAgIHB1YmxpYyBQcm90b2NvbFBhdGgoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFByb3RvY29sUGF0aChTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0RpcikgeworICAgICAgICB0aGlzLmlzRGlyID0gaXNEaXI7CisgICAgICAgIHRoaXMucGF0aCA9IHRoaXMuY2hlY2tGb3JEZWxpbWl0ZXJzKHBhdGgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgY2hlY2tGb3JEZWxpbWl0ZXJzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvIikgJiYgcGF0aC5sZW5ndGgoKSA+IDEpCisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOworICAgICAgICByZWxhdGl2ZVRvSE9NRSA9ICFwYXRoLnN0YXJ0c1dpdGgoIi8iKTsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZVRvSE9NRSgpIHsKKyAgICAgICAgcmV0dXJuIHJlbGF0aXZlVG9IT01FOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGZvciB3aGljaCB0aGlzIHBhdGggYmVsb25ncworICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIFBhdGggZmlsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgaXMgdXNlZCB3aGVuIGRvd25sb2FkaW5nIHRoZSBmaWxlCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgZG93bmxvYWRpbmcgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG93bmxvYWRQYXRoKCkgeworICAgICAgICByZXR1cm4gKGlzRGlyZWN0b3J5KCkpID8gcGF0aCA6IHBhdGgKKyAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoIi8iKSkKKyAgICAgICAgICAgICAgICArICIvIiArIGdldERvd25sb2FkRmlsZU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgdGhhdCBpcyB1c2VkIHdoZW4gZG93bmxvYWRpbmcgdGhlIGZpbGUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIHVzZWQgZHVyaW5nIGRvd25sb2FkaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG93bmxvYWRGaWxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJEb3dubG9hZGluZ18iICsgZ2V0RmlsZU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgcGF0aCBpcyBhIHBhdGggdG8gYSBkaXJlY3Rvcnkgb3Igbm90CisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgUGF0aCBpcyBhIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gaXNEaXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoIGluc3RhbmNlb2YgUHJvdG9jb2xQYXRoKSB7CisgICAgICAgICAgICBQcm90b2NvbFBhdGggcCA9IChQcm90b2NvbFBhdGgpIHBhdGg7CisgICAgICAgICAgICByZXR1cm4gKHAuZ2V0UGF0aFN0cmluZygpLmVxdWFscyh0aGlzLmdldFBhdGhTdHJpbmcoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudERpclBhdGgoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPD0gMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZigiLyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKHBhdGggKyAiIGlzRGlyPSIgKyB0aGlzLmlzRGlyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvdG9jb2xQYXRoIGdldFBhcmVudFBhdGgoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm90b2NvbFBhdGgocGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZigiLyIpKSwgdHJ1ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9SZW1vdGVTaXRlLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9SZW1vdGVTaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkZWUyMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3Byb3RvY29sL1JlbW90ZVNpdGUuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlU2l0ZSB7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxpYXMsIHVzZXJuYW1lLCBwYXNzd29yZCwgY2RUZXN0RGlyOworICAgIHByaXZhdGUgaW50IG1heENvbm5lY3Rpb25zOworICAgIHByaXZhdGUgVVJMIHVybDsKKworICAgIHB1YmxpYyBSZW1vdGVTaXRlKFN0cmluZyBhbGlhcywgVVJMIHVybCwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5hbGlhcyA9IGFsaWFzOworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgICAgIHRoaXMubWF4Q29ubmVjdGlvbnMgPSAtMTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFJlbW90ZVNpdGUoU3RyaW5nIGFsaWFzLCBVUkwgdXJsLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGNkVGVzdERpcikgeworICAgICAgICB0aGlzKGFsaWFzLCB1cmwsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgIHRoaXMuY2RUZXN0RGlyID0gY2RUZXN0RGlyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUmVtb3RlU2l0ZShTdHJpbmcgYWxpYXMsIFVSTCB1cmwsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgY2RUZXN0RGlyLCBpbnQgbWF4Q29ubmVjdGlvbnMpIHsKKyAgICAgICAgdGhpcyhhbGlhcywgdXJsLCB1c2VybmFtZSwgcGFzc3dvcmQsIGNkVGVzdERpcik7CisgICAgICAgIHRoaXMubWF4Q29ubmVjdGlvbnMgPSBtYXhDb25uZWN0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hbGlhczsKKyAgICB9CisKKyAgICBwdWJsaWMgVVJMIGdldFVSTCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXJsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVzZXJuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhc3N3b3JkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENkVGVzdERpcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2RUZXN0RGlyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29ubmVjdGlvbnMoKSB7CisgICAgCXJldHVybiB0aGlzLm1heENvbm5lY3Rpb25zOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb3B5KFJlbW90ZVNpdGUgcnMpIHsKKyAgICAgICAgdGhpcy5hbGlhcyA9IHJzLmFsaWFzOworICAgICAgICB0aGlzLnVybCA9IHJzLnVybDsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHJzLnVzZXJuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcnMucGFzc3dvcmQ7CisgICAgICAgIHRoaXMuY2RUZXN0RGlyID0gcnMuY2RUZXN0RGlyOworICAgICAgICB0aGlzLm1heENvbm5lY3Rpb25zID0gcnMubWF4Q29ubmVjdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlbW90ZVNpdGUpIHsKKyAgICAgICAgICAgIFJlbW90ZVNpdGUgcnMgPSAoUmVtb3RlU2l0ZSkgb2JqOworICAgICAgICAgICAgcmV0dXJuIChycy5hbGlhcy5lcXVhbHModGhpcy5hbGlhcykgJiYgcnMudXJsLmVxdWFscyh0aGlzLnVybCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcnMudXNlcm5hbWUuZXF1YWxzKHRoaXMudXNlcm5hbWUpICYmIHJzLnBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModGhpcy5wYXNzd29yZCkgJiYgcnMubWF4Q29ubmVjdGlvbnMgPT0gdGhpcy5tYXhDb25uZWN0aW9ucyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiUmVtb3RlU2l0ZTogYWxpYXMgPSAnIiArIHRoaXMuYWxpYXMgKyAiJyAgdXJsID0gJyIgKyB0aGlzLnVybAorICAgICAgICAgICAgICAgICsgIicgIHVzZXJuYW1lID0gJyIgKyB0aGlzLnVzZXJuYW1lICsgIicgY2RUZXN0RGlyID0gJyIgCisgICAgICAgICAgICAgICAgKyB0aGlzLmNkVGVzdERpciArICInIG1heENvbm5lY3Rpb25zID0gJyIgKyB0aGlzLm1heENvbm5lY3Rpb25zICsgIiciOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3Byb3RvY29sL1JlbW90ZVNpdGVGaWxlLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9SZW1vdGVTaXRlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmZkYmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9wcm90b2NvbC9SZW1vdGVTaXRlRmlsZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworCisvKioKKyAqCisgKiBFeHRlbmRzIHtAbGluayBQcm90b2NvbEZpbGV9IGFuZCBsaW5rcyBpdCB0byBhIHtAbGluayBSZW1vdGVTaXRlfS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlU2l0ZUZpbGUgZXh0ZW5kcyBQcm90b2NvbEZpbGUgeworCisgIHByaXZhdGUgUmVtb3RlU2l0ZSBzaXRlOworCisgIHB1YmxpYyBSZW1vdGVTaXRlRmlsZShQcm90b2NvbEZpbGUgZmlsZSwgUmVtb3RlU2l0ZSBzaXRlKXsKKyAgICAgdGhpcyhmaWxlLmdldFBhdGgoKSwgZmlsZS5pc0RpcigpLCBzaXRlKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcGFyZW50CisgICAqIEBwYXJhbSBwYXRoCisgICAqIEBwYXJhbSBpc0RpcgorICAgKiBAcGFyYW0gc2l0ZQorICAgKi8KKyAgcHVibGljIFJlbW90ZVNpdGVGaWxlKFByb3RvY29sRmlsZSBwYXJlbnQsIFN0cmluZyBwYXRoLCBib29sZWFuIGlzRGlyLAorICAgICAgUmVtb3RlU2l0ZSBzaXRlKSB7CisgICAgc3VwZXIocGFyZW50LCBwYXRoLCBpc0Rpcik7CisgICAgdGhpcy5zaXRlID0gc2l0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcGF0aAorICAgKiBAcGFyYW0gaXNEaXIKKyAgICogQHBhcmFtIHNpdGUKKyAgICovCisgIHB1YmxpYyBSZW1vdGVTaXRlRmlsZShTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0RpciwgUmVtb3RlU2l0ZSBzaXRlKSB7CisgICAgc3VwZXIocGF0aCwgaXNEaXIpOworICAgIHRoaXMuc2l0ZSA9IHNpdGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgc2l0ZQorICAgKi8KKyAgcHVibGljIFJlbW90ZVNpdGUgZ2V0U2l0ZSgpIHsKKyAgICByZXR1cm4gc2l0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gc2l0ZQorICAgKiAgICAgICAgICB0aGUgc2l0ZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFNpdGUoUmVtb3RlU2l0ZSBzaXRlKSB7CisgICAgdGhpcy5zaXRlID0gc2l0ZTsKKyAgfQorCisgIHB1YmxpYyBSZW1vdGVTaXRlRmlsZSBnZXRSZW1vdGVQYXJlbnQoKSB7CisgICAgUHJvdG9jb2xGaWxlIHBhcmVudCA9IHN1cGVyLmdldFBhcmVudCgpOworICAgIHJldHVybiBuZXcgUmVtb3RlU2l0ZUZpbGUocGFyZW50LmdldFBhdGgoKSwgcGFyZW50LmlzRGlyKCksIHRoaXMuc2l0ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKK3B1YmxpYyBSZW1vdGVTaXRlRmlsZSBnZXRBYnNvbHV0ZUZpbGUoKSB7CisgICAgUHJvdG9jb2xGaWxlIHBhcmVudCA9IHN1cGVyLmdldEFic29sdXRlRmlsZSgpOworICAgIHJldHVybiBuZXcgUmVtb3RlU2l0ZUZpbGUocGFyZW50LmdldFBhdGgoKSwgcGFyZW50LmlzRGlyKCksIHRoaXMuc2l0ZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsbWV0aG9kL0xpc3RSZXRyaWV2ZXIuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbG1ldGhvZC9MaXN0UmV0cmlldmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiNGU3OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbG1ldGhvZC9MaXN0UmV0cmlldmVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxtZXRob2Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuRGF0YUZpbGVzSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5Eb3dubG9hZEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLkFscmVhZHlJbkRhdGFiYXNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5SZXRyaWV2YWxNZXRob2RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLlRvTWFueUZhaWxlZERvd25sb2Fkc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuRmlsZVJlc3RyaWN0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5WaXJ0dWFsRmlsZVN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW0uRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtLkZpbGVSZXRyaWV2YWxTeXN0ZW07CisKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0UmV0cmlldmVyIGltcGxlbWVudHMgUmV0cmlldmFsTWV0aG9kIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTGlzdFJldHJpZXZlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzUHJvcEZpbGUoRmlsZVJldHJpZXZhbFN5c3RlbSBmcnMsIFBhcnNlciBwcm9wRmlsZVBhcnNlciwKKyAgICAgICAgICAgIEZpbGUgcHJvcEZpbGUsIERhdGFGaWxlc0luZm8gZGZpLCBEYXRhRmlsZVRvUHJvcEZpbGVMaW5rZXIgbGlua2VyKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSA9IG51bGw7CisKKyAgICAgICAgLy8gcGFyc2UgcHJvcGVydHkgZmlsZQorICAgICAgICBNZXRhZGF0YSBmaWxlTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgVmlydHVhbEZpbGVTdHJ1Y3R1cmUgdmZzID0gcHJvcEZpbGVQYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBwcm9wRmlsZSksIGZpbGVNZXRhZGF0YSk7CisgICAgICAgIERvd25sb2FkSW5mbyBkaSA9IGRmaS5nZXREb3dubG9hZEluZm8oKTsKKyAgICAgICAgaWYgKCFkaS5pc0FsbG93QWxpYXNPdmVycmlkZSgpCisgICAgICAgICAgICAgICAgfHwgKHJlbW90ZVNpdGUgPSB2ZnMuZ2V0UmVtb3RlU2l0ZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgcmVtb3RlU2l0ZSA9IGRpLmdldFJlbW90ZVNpdGUoKTsKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGZpbGVMaXN0ID0gRmlsZVJlc3RyaWN0aW9ucy50b1N0cmluZ0xpc3QodmZzCisgICAgICAgICAgICAgICAgLmdldFJvb3RWaXJ0dWFsRmlsZSgpKTsKKworICAgICAgICAvLyBkb3dubG9hZCBkYXRhIGZpbGVzIHNwZWNpZmllZCBpbiBwcm9wZXJ0eSBmaWxlCisgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlTGlzdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsaW5rZXIuYWRkUHJvcEZpbGVUb0RhdGFGaWxlTGluayhwcm9wRmlsZSwgZmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmcnMuYWRkVG9Eb3dubG9hZFF1ZXVlKHJlbW90ZVNpdGUsIGZpbGUsIGRpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVuYW1pbmdDb252KCksIGRpLmdldFN0YWdpbmdBcmVhKCksIGRmaQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFF1ZXJ5TWV0YWRhdGFFbGVtZW50TmFtZSgpLCBkaS5kZWxldGVGcm9tU2VydmVyKCksIGZpbGVNZXRhZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIGxpbmtlci5lcmFzZUxpbmtzKHByb3BGaWxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRvTWFueUZhaWxlZERvd25sb2Fkc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJldHJpZXZhbE1ldGhvZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIGFwcGVhcnMgdG8gYmUgZG93bi4gLiAudW51c3VhbCBudW1iZXIgb2YgZG93bmxvYWQgZmFpbHVyZXMuIC4gLnN0b3BwaW5nIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXRyaWV2YWxNZXRob2RFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbW11bmljYXRlIHdpdGggZGF0YWJhc2UgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoQWxyZWFkeUluRGF0YWJhc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlNraXBwaW5nIGZpbGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiU2tpcHBpbmcgZmlsZSA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgbGlua2VyLm1hcmtBc0ZhaWxlZChwcm9wRmlsZSwgIkZhaWxlZCB0byBkb3dubG9hZCAiICsgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIHJlbW90ZVNpdGUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVa25vd24gZXJyb3IgYWNjdXJlZCB3aGlsZSBkb3dubG9hZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGUgKyAiIGZyb20gIiArIHJlbW90ZVNpdGUgKyAiIC0tIGJhaWxpbmcgb3V0IDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbG1ldGhvZC9SZW1vdGVDcmF3bGVyLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxtZXRob2QvUmVtb3RlQ3Jhd2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2E1MzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxtZXRob2QvUmVtb3RlQ3Jhd2xlci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsbWV0aG9kOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLkRhdGFGaWxlc0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuRG93bmxvYWRJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5BbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUHJvdG9jb2xGaWxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5SZXRyaWV2YWxNZXRob2RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLlRvTWFueUZhaWxlZERvd25sb2Fkc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuRmlsZVJlc3RyaWN0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5WaXJ0dWFsRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMuVmlydHVhbEZpbGVTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC51dGlsLlByb3RvY29sRmlsZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlByb3RvY29sUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5wcm90b2NvbC5SZW1vdGVTaXRlRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnJldHJpZXZhbHN5c3RlbS5EYXRhRmlsZVRvUHJvcEZpbGVMaW5rZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW0uRmlsZVJldHJpZXZhbFN5c3RlbTsKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFJlbW90ZUNyYXdsZXIgaW1wbGVtZW50cyBSZXRyaWV2YWxNZXRob2QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUmVtb3RlQ3Jhd2xlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIGNyYXdsZXIgYW5kIGNyZWF0ZXMgYSBkZWZhdWx0IERpclN0cnVjdCBpZiBudWxsIHdhcyBzdXBwbGllZAorICAgICAqIGluIGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFByb3RvY29sRmlsZUV4Y2VwdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgcHJvY2Vzc1Byb3BGaWxlKEZpbGVSZXRyaWV2YWxTeXN0ZW0gZnJzLCBQYXJzZXIgcHJvcEZpbGVQYXJzZXIsCisgICAgICAgICAgICBGaWxlIHByb3BGaWxlLCBEYXRhRmlsZXNJbmZvIGRmaSwgRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyIGxpbmtlcikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZW1vdGVTaXRlIHJlbW90ZVNpdGU7CisKKyAgICAgICAgLy8gcGFyc2UgcHJvcGVydHkgZmlsZQorICAgICAgICBNZXRhZGF0YSBmaWxlTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgVmlydHVhbEZpbGVTdHJ1Y3R1cmUgdmZzID0gcHJvcEZpbGVQYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBwcm9wRmlsZSksIGZpbGVNZXRhZGF0YSk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIFJlbW90ZVNpdGUKKyAgICAgICAgRG93bmxvYWRJbmZvIGRpID0gZGZpLmdldERvd25sb2FkSW5mbygpOworICAgICAgICBpZiAoIWRpLmlzQWxsb3dBbGlhc092ZXJyaWRlKCkKKyAgICAgICAgICAgICAgICB8fCAocmVtb3RlU2l0ZSA9IHZmcy5nZXRSZW1vdGVTaXRlKCkpID09IG51bGwpCisgICAgICAgICAgICByZW1vdGVTaXRlID0gZGkuZ2V0UmVtb3RlU2l0ZSgpOworCisgICAgICAgIC8vIG1vZGlmeSB2ZnMgdG8gYmUgcm9vdCBiYXNlZCBpZiBIT01FIGRpcmVjdG9yeSBiYXNlZAorICAgICAgICBpZiAoIXZmcy5pc1Jvb3RCYXNlZCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgaG9tZURpclBhdGggPSBmcnMuZ2V0SG9tZURpcihyZW1vdGVTaXRlKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBWaXJ0dWFsRmlsZSByb290ID0gbmV3IFZpcnR1YWxGaWxlKGhvbWVEaXJQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIHJvb3QuYWRkQ2hpbGQodmZzLmdldFJvb3RWaXJ0dWFsRmlsZSgpKTsKKyAgICAgICAgICAgIHZmcyA9IG5ldyBWaXJ0dWFsRmlsZVN0cnVjdHVyZShob21lRGlyUGF0aCArICIvIgorICAgICAgICAgICAgICAgICAgICArIHZmcy5nZXRQYXRoVG9Sb290KCksIHJvb3QuZ2V0Um9vdERpcigpKTsKKyAgICAgICAgICAgIGZycy5jaGFuZ2VUb0hPTUUocmVtb3RlU2l0ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsaXplIHZhcmlhYmxlcworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdGlhbENkUGF0aCA9IHZmcy5nZXRQYXRoVG9Sb290KCk7CisgICAgICAgIGZpbmFsIFZpcnR1YWxGaWxlIHZmID0gdmZzLmdldFJvb3RWaXJ0dWFsRmlsZSgpOworCisgICAgICAgIC8vIGNoYW5nZSB0byBpbml0aWFsIGRpcmVjdG9yeSAodGFrZXMgY2FyZSBvZiBMaW51eCBhdXRvLW1vdW50aW5nKQorICAgICAgICBmcnMuY2hhbmdlVG9EaXIoaW5pdGlhbENkUGF0aCwgcmVtb3RlU2l0ZSk7CisKKyAgICAgICAgLy8gYWRkIHN0YXJ0aW5nIGRpcmVjdG9yeSB0byBzdGFjaworICAgICAgICBTdGFjazxSZW1vdGVTaXRlRmlsZT4gZmlsZXMgPSBuZXcgU3RhY2s8UmVtb3RlU2l0ZUZpbGU+KCk7CisgICAgICAgIGZpbGVzLmFkZChuZXcgUmVtb3RlU2l0ZUZpbGUoZnJzLmdldEN1cnJlbnRGaWxlKHJlbW90ZVNpdGUpLCByZW1vdGVTaXRlKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY3Jhd2xpbmcKKyAgICAgICAgd2hpbGUgKCFmaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFJlbW90ZVNpdGVGaWxlIGZpbGUgPSBmaWxlcy5wZWVrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGlmIGRpcmVjdG9yeSwgdGhlbiBhZGQgaXRzIGNoaWxkcmVuIHRvIHRoZSBjcmF3bCBsaXN0CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXIoKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBuZXh0IHBhZ2Ugd29ydGggb2YgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgTGlzdDxSZW1vdGVTaXRlRmlsZT4gY2hpbGRyZW4gPSBmcnMuZ2V0TmV4dFBhZ2UoZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvdG9jb2xGaWxlRmlsdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChQcm90b2NvbEZpbGUgcEZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlUmVzdHJpY3Rpb25zLmlzQWxsb3dlZChuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFBhdGgocEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhdGgoKSwgcEZpbGUuaXNEaXIoKSksIHZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGRpcmVjdG9yeSBoYWQgbW9yZSBjaGlsZHJlbiB0aGVuIGFkZCB0aGVtCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5zaXplKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkQWxsKGNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHJlbW92ZSB0aGUgZGlyZWN0b3J5IGZyb20gdGhlIGNyYXdsIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucG9wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgZmlsZSwgdGhlbiBkb3dubG9hZCBpdAorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmtlci5hZGRQcm9wRmlsZVRvRGF0YUZpbGVMaW5rKHByb3BGaWxlLCBmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmcnMuYWRkVG9Eb3dubG9hZFF1ZXVlKGZpbGVzLnBvcCgpLCBkaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZW5hbWluZ0NvbnYoKSwgZGkuZ2V0U3RhZ2luZ0FyZWEoKSwgZGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFF1ZXJ5TWV0YWRhdGFFbGVtZW50TmFtZSgpLCBkaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWxldGVGcm9tU2VydmVyKCksIGZpbGVNZXRhZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZXIuZXJhc2VMaW5rcyhwcm9wRmlsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChUb01hbnlGYWlsZWREb3dubG9hZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXRyaWV2YWxNZXRob2RFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBhcHBlYXJzIHRvIGJlIGRvd24uIC4gLnVudXN1YWwgbnVtYmVyIG9mIGRvd25sb2FkIGZhaWx1cmVzLiAuIC5zdG9wcGluZyA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV0cmlldmFsTWV0aG9kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGRhdGFiYXNlIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFscmVhZHlJbkRhdGFiYXNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJTa2lwcGluZyBmaWxlIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuZGVmaW5lZFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlNraXBwaW5nIGZpbGUgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsaW5rZXIubWFya0FzRmFpbGVkKHByb3BGaWxlLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVWtub3duIGVycm9yIGFjY3VyZWQgd2hpbGUgZG93bmxvYWRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlICsgIiBmcm9tICIgKyByZW1vdGVTaXRlICsgIiAtLSBiYWlsaW5nIG91dCA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsbWV0aG9kL1JldHJpZXZhbE1ldGhvZC5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsbWV0aG9kL1JldHJpZXZhbE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTI0YTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxtZXRob2QvUmV0cmlldmFsTWV0aG9kLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnJldHJpZXZhbG1ldGhvZDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5EYXRhRmlsZXNJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW0uRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtLkZpbGVSZXRyaWV2YWxTeXN0ZW07CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmV0cmlldmFsTWV0aG9kIHsKKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NQcm9wRmlsZShGaWxlUmV0cmlldmFsU3lzdGVtIGZycywKKyAgICAgICAgICAgIFBhcnNlciBwcm9wRmlsZVBhcnNlciwgRmlsZSBwcm9wRmlsZSwgRGF0YUZpbGVzSW5mbyBkZmksCisgICAgICAgICAgICBEYXRhRmlsZVRvUHJvcEZpbGVMaW5rZXIgbGlua2VyKSB0aHJvd3MgRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiODdiZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9EYXRhRmlsZVRvUHJvcEZpbGVMaW5rZXIuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnJldHJpZXZhbHN5c3RlbTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuUHJvdG9jb2xGaWxlOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyIGltcGxlbWVudHMgRG93bmxvYWRMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBGaWxlPiBwcm90b2NvbEZpbGVQYXRoQW5kUHJvcEZpbGVNYXA7CisKKyAgICBwcml2YXRlIEhhc2hNYXA8RmlsZSwgU3RyaW5nPiBwcm9wRmlsZVRvRXJyb3JzTWFwOworCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gZG93bmxvYWRpbmdEYXRhRmlsZXM7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPiBmYWlsZWREYXRhRmlsZXM7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPiBzdWNjZXNzRGF0YUZpbGVzOworCisgICAgcHVibGljIERhdGFGaWxlVG9Qcm9wRmlsZUxpbmtlcigpIHsKKyAgICAgICAgdGhpcy5wcm90b2NvbEZpbGVQYXRoQW5kUHJvcEZpbGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpbGU+KCk7CisgICAgICAgIHRoaXMucHJvcEZpbGVUb0Vycm9yc01hcCA9IG5ldyBIYXNoTWFwPEZpbGUsIFN0cmluZz4oKTsKKyAgICAgICAgZG93bmxvYWRpbmdEYXRhRmlsZXMgPSBuZXcgTGlua2VkTGlzdDxQcm90b2NvbEZpbGU+KCk7CisgICAgICAgIGZhaWxlZERhdGFGaWxlcyA9IG5ldyBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgICAgICAgc3VjY2Vzc0RhdGFGaWxlcyA9IG5ldyBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcEZpbGVUb0RhdGFGaWxlTGluayhGaWxlIHByb3BGaWxlLAorICAgICAgICAgICAgUHJvdG9jb2xGaWxlIHBGaWxlKSB7CisgICAgICAgIHRoaXMuYWRkUHJvcEZpbGVUb0RhdGFGaWxlTGluayhwcm9wRmlsZSwgcEZpbGUuZ2V0UGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcEZpbGVUb0RhdGFGaWxlTGluayhGaWxlIHByb3BGaWxlLAorICAgICAgICAgICAgU3RyaW5nIHJlbW90ZURhdGFGaWxlUGF0aCkgeworICAgICAgICB0aGlzLnByb3RvY29sRmlsZVBhdGhBbmRQcm9wRmlsZU1hcC5wdXQocmVtb3RlRGF0YUZpbGVQYXRoLCBwcm9wRmlsZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmtBc0ZhaWxlZChGaWxlIHByb3BGaWxlLCBTdHJpbmcgZXJyb3JNc2cpIHsKKyAgICAgICAgU3RyaW5nIGVycm9ycyA9IHRoaXMucHJvcEZpbGVUb0Vycm9yc01hcC5nZXQocHJvcEZpbGUpOworICAgICAgICBpZiAoZXJyb3JzID09IG51bGwpCisgICAgICAgICAgICB0aGlzLnByb3BGaWxlVG9FcnJvcnNNYXAucHV0KHByb3BGaWxlLCBlcnJvck1zZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMucHJvcEZpbGVUb0Vycm9yc01hcC5wdXQocHJvcEZpbGUsIGVycm9ycyArICIsIiArIGVycm9yTXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFya0FzRmFpbGVkKFByb3RvY29sRmlsZSBwRmlsZSwgU3RyaW5nIGVycm9yTXNnKSB7CisgICAgICAgIHRoaXMubWFya0FzRmFpbGVkKHBGaWxlLmdldFBhdGgoKSwgZXJyb3JNc2cpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrQXNGYWlsZWQoU3RyaW5nIHBGaWxlUGF0aCwgU3RyaW5nIGVycm9yTXNnKSB7CisgICAgICAgIEZpbGUgcHJvcEZpbGUgPSB0aGlzLnByb3RvY29sRmlsZVBhdGhBbmRQcm9wRmlsZU1hcC5nZXQocEZpbGVQYXRoKTsKKyAgICAgICAgaWYgKHByb3BGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvcnMgPSB0aGlzLnByb3BGaWxlVG9FcnJvcnNNYXAuZ2V0KHByb3BGaWxlKTsKKyAgICAgICAgICAgIGlmIChlcnJvcnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGlzLnByb3BGaWxlVG9FcnJvcnNNYXAucHV0KHByb3BGaWxlLCBlcnJvck1zZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpcy5wcm9wRmlsZVRvRXJyb3JzTWFwLnB1dChwcm9wRmlsZSwgZXJyb3JzICsgIiwiICsgZXJyb3JNc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RXJyb3JzQW5kRXJhc2VMaW5rcyhGaWxlIHByb3BGaWxlKSB7CisgICAgICAgIHRoaXMuZXJhc2VMaW5rcyhwcm9wRmlsZSk7CisgICAgICAgIHJldHVybiB0aGlzLmdldEVycm9ycyhwcm9wRmlsZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVyYXNlTGlua3MoRmlsZSBwcm9wRmlsZSkgeworICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4ga2V5c1RvUmVtb3ZlID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgRmlsZT4gZW50cnkgOiB0aGlzLnByb3RvY29sRmlsZVBhdGhBbmRQcm9wRmlsZU1hcAorICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpKQorICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkuZXF1YWxzKHByb3BGaWxlKSkKKyAgICAgICAgICAgICAgICBrZXlzVG9SZW1vdmUuYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDoga2V5c1RvUmVtb3ZlKQorICAgICAgICAgICAgdGhpcy5wcm90b2NvbEZpbGVQYXRoQW5kUHJvcEZpbGVNYXAucmVtb3ZlKGtleSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RXJyb3JzKEZpbGUgcHJvcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvcEZpbGVUb0Vycm9yc01hcC5yZW1vdmUocHJvcEZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFN0YXR1c09mKEZpbGUgcHJvcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuICJTdGF0dXMgZm9yICIgKyBwcm9wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICI6IiArICIgRXJyb3JzOiBcbiIKKyAgICAgICAgICAgICAgICArICIgICAiICsgdGhpcy5wcm9wRmlsZVRvRXJyb3JzTWFwLmdldChwcm9wRmlsZSkgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiIERhdGEgZmlsZXMgc3BlY2lmaWVkIHdoaWNoIGFyZSBjdXJyZW50bHkgZG93bmxvYWRpbmc6XG4iCisgICAgICAgICAgICAgICAgKyAiICAgIiArIHRoaXMuZ2V0RG93bmxvYWRpbmdGaWxlc0xpbmtlZFRvUHJvcEZpbGUocHJvcEZpbGUpCisgICAgICAgICAgICAgICAgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiIERhdGEgZmlsZXMgc3BlY2lmaWVkIHdoaWNoIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkOlxuIgorICAgICAgICAgICAgICAgICsgIiAgICIKKyAgICAgICAgICAgICAgICArIHRoaXMuZ2V0U3VjY2Vzc2Z1bGx5RG93bmxvYWRlZEZpbGVzTGlua2VkVG9Qcm9wRmlsZShwcm9wRmlsZSkKKyAgICAgICAgICAgICAgICArICJcbiIgKyAiIERhdGEgZmlsZXMgc3BlY2lmaWVkIHdoaWNoIGZhaWxlZCB0byBkb3dubG9hZDpcbiIKKyAgICAgICAgICAgICAgICArICIgICAiCisgICAgICAgICAgICAgICAgKyB0aGlzLmdldEZhaWxlZFRvRG93bmxvYWRGaWxlc0xpbmtlZFRvUHJvcEZpbGUocHJvcEZpbGUpCisgICAgICAgICAgICAgICAgKyAiXG4iOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlua2VkTGlzdDxQcm90b2NvbEZpbGU+IGdldERvd25sb2FkaW5nRmlsZXNMaW5rZWRUb1Byb3BGaWxlKAorICAgICAgICAgICAgRmlsZSBwcm9wRmlsZSkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWxlc0xpbmtlZFRvUHJvcEZpbGVJbkxpc3QocHJvcEZpbGUsCisgICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZGluZ0RhdGFGaWxlcyk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gZ2V0U3VjY2Vzc2Z1bGx5RG93bmxvYWRlZEZpbGVzTGlua2VkVG9Qcm9wRmlsZSgKKyAgICAgICAgICAgIEZpbGUgcHJvcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsZXNMaW5rZWRUb1Byb3BGaWxlSW5MaXN0KHByb3BGaWxlLAorICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0RhdGFGaWxlcyk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gZ2V0RmFpbGVkVG9Eb3dubG9hZEZpbGVzTGlua2VkVG9Qcm9wRmlsZSgKKyAgICAgICAgICAgIEZpbGUgcHJvcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsZXNMaW5rZWRUb1Byb3BGaWxlSW5MaXN0KHByb3BGaWxlLAorICAgICAgICAgICAgICAgIHRoaXMuZmFpbGVkRGF0YUZpbGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPiBnZXRGaWxlc0xpbmtlZFRvUHJvcEZpbGVJbkxpc3QoCisgICAgICAgICAgICBGaWxlIHByb3BGaWxlLCBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gbGlzdCkgeworICAgICAgICBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4gcmV0dXJuTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFByb3RvY29sRmlsZT4oKTsKKyAgICAgICAgZm9yIChQcm90b2NvbEZpbGUgcEZpbGUgOiBsaXN0KSB7CisgICAgICAgICAgICBpZiAodGhpcy5wcm90b2NvbEZpbGVQYXRoQW5kUHJvcEZpbGVNYXAuZ2V0KHBGaWxlLmdldFBhdGgoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChwRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRvd25sb2FkRmFpbGVkKFByb3RvY29sRmlsZSBmaWxlLCBTdHJpbmcgZXJyb3JNc2cpIHsKKyAgICAgICAgdGhpcy5tYXJrQXNGYWlsZWQoZmlsZSwgIkZhaWxlZCB0byBkb3dubG9hZCAnIiArIGZpbGUKKyAgICAgICAgICAgICAgICArICInIC0tIExvZ2dlZCBFcnJvciBtc2c6ICIgKyBlcnJvck1zZyk7CisgICAgICAgIHRoaXMuZmFpbGVkRGF0YUZpbGVzLmFkZChmaWxlKTsKKyAgICAgICAgdGhpcy5kb3dubG9hZGluZ0RhdGFGaWxlcy5yZW1vdmUoZmlsZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRvd25sb2FkRmluaXNoZWQoUHJvdG9jb2xGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5zdWNjZXNzRGF0YUZpbGVzLmFkZChmaWxlKTsKKyAgICAgICAgdGhpcy5kb3dubG9hZGluZ0RhdGFGaWxlcy5yZW1vdmUoZmlsZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRvd25sb2FkU3RhcnRlZChQcm90b2NvbEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmRvd25sb2FkaW5nRGF0YUZpbGVzLmFkZChmaWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHRoaXMucHJvcEZpbGVUb0Vycm9yc01hcC5jbGVhcigpOworICAgICAgICB0aGlzLnByb3RvY29sRmlsZVBhdGhBbmRQcm9wRmlsZU1hcC5jbGVhcigpOworICAgICAgICB0aGlzLmRvd25sb2FkaW5nRGF0YUZpbGVzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuZmFpbGVkRGF0YUZpbGVzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuc3VjY2Vzc0RhdGFGaWxlcy5jbGVhcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9Eb3dubG9hZExpc3RlbmVyLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vRG93bmxvYWRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWMyMmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vRG93bmxvYWRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbEZpbGU7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRG93bmxvYWRMaXN0ZW5lciB7CisKKyAgICBwdWJsaWMgdm9pZCBkb3dubG9hZFN0YXJ0ZWQoUHJvdG9jb2xGaWxlIHBGaWxlKTsKKworICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkRmluaXNoZWQoUHJvdG9jb2xGaWxlIHBGaWxlKTsKKworICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkRmFpbGVkKFByb3RvY29sRmlsZSBwRmlsZSwgU3RyaW5nIGVycm9yTXNnKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL0Rvd25sb2FkVGhyZWFkRXZhbHVhdG9yLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vRG93bmxvYWRUaHJlYWRFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQwOTNhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL0Rvd25sb2FkVGhyZWFkRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLlRocmVhZEV2YWx1YXRvckV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBEb3dubG9hZFRocmVhZEV2YWx1YXRvciB7CisKKyAgICBwcml2YXRlIEhhc2hNYXA8RmlsZSwgRG93bmxvYWRpbmdGaWxlSW5mbz4gZmlsZUFuZERvd25sb2FkaW5nRmlsZUluZm87CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBNQVhfVEhSRUFEUzsKKworICAgIHByaXZhdGUgaW50IGN1cnJlbnRUaHJlYWRDb3VudDsKKworICAgIHByaXZhdGUgZG91YmxlW10gZG93bmxvYWRTcGVlZHNGb3JFYWNoVGhyZWFkOworCisgICAgcHVibGljIERvd25sb2FkVGhyZWFkRXZhbHVhdG9yKGludCBtYXhUaHJlYWRzKSB7CisgICAgICAgIHRoaXMuTUFYX1RIUkVBRFMgPSBtYXhUaHJlYWRzOworICAgICAgICBkb3dubG9hZFNwZWVkc0ZvckVhY2hUaHJlYWQgPSBuZXcgZG91YmxlW21heFRocmVhZHMgKyAxXTsKKyAgICAgICAgZmlsZUFuZERvd25sb2FkaW5nRmlsZUluZm8gPSBuZXcgSGFzaE1hcDxGaWxlLCBEb3dubG9hZGluZ0ZpbGVJbmZvPigpOworICAgICAgICBjdXJyZW50VGhyZWFkQ291bnQgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydFRyYWNraW5nRG93bmxvYWRSdW50aW1lRm9yRmlsZShGaWxlIGZpbGUpCisgICAgICAgICAgICB0aHJvd3MgVGhyZWFkRXZhbHVhdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBjdXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmICgrK3RoaXMuY3VycmVudFRocmVhZENvdW50ID4gdGhpcy5NQVhfVEhSRUFEUykKKyAgICAgICAgICAgIHRocm93IG5ldyBUaHJlYWRFdmFsdWF0b3JFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgdGhyZWFkcyBleGNlZWRzIG1heCBhbGxvd3MgdGhyZWFkcyIpOworICAgICAgICB1cGRhdGVUaHJlYWRDb3VudHMoY3VyVGltZSk7CisgICAgICAgIGZpbGVBbmREb3dubG9hZGluZ0ZpbGVJbmZvLnB1dChmaWxlLCBuZXcgRG93bmxvYWRpbmdGaWxlSW5mbyhmaWxlLAorICAgICAgICAgICAgICAgIGN1clRpbWUsIHRoaXMuY3VycmVudFRocmVhZENvdW50KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRocmVhZENvdW50cyhsb25nIGN1clRpbWUpIHsKKyAgICAgICAgU2V0PEVudHJ5PEZpbGUsIERvd25sb2FkaW5nRmlsZUluZm8+PiBlbnRyeVNldCA9IGZpbGVBbmREb3dubG9hZGluZ0ZpbGVJbmZvCisgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCk7CisgICAgICAgIGZvciAoRW50cnk8RmlsZSwgRG93bmxvYWRpbmdGaWxlSW5mbz4gZW50cnkgOiBlbnRyeVNldCkgeworICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKQorICAgICAgICAgICAgICAgICAgICAudXBkYXRlVGhyZWFkQ291bnQoY3VyVGltZSwgdGhpcy5jdXJyZW50VGhyZWFkQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbFJ1bnRpbWVUcmFja2luZyhGaWxlIGZpbGUpIHsKKyAgICAgICAgZmlsZUFuZERvd25sb2FkaW5nRmlsZUluZm8ucmVtb3ZlKGZpbGUpOworICAgICAgICBjdXJyZW50VGhyZWFkQ291bnQtLTsKKyAgICAgICAgdXBkYXRlVGhyZWFkQ291bnRzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmlsZURvd25sb2FkQ29tcGxldGUoRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIFRocmVhZEV2YWx1YXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIGZpbmlzaFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIERvd25sb2FkaW5nRmlsZUluZm8gZGZpID0gZmlsZUFuZERvd25sb2FkaW5nRmlsZUluZm8ucmVtb3ZlKGZpbGUpOworICAgICAgICAgICAgdXBkYXRlVGhyZWFkQ291bnRzKGZpbmlzaFRpbWUpOworICAgICAgICAgICAgTGlua2VkTGlzdDxUaW1lQW5kVGhyZWFkQ291bnQ+IHRhdGNMaXN0ID0gZGZpCisgICAgICAgICAgICAgICAgICAgIC5nZXRUaW1lQW5kVGhyZWFkSW5mbygpOworICAgICAgICAgICAgbG9uZyBydW50aW1lID0gZmluaXNoVGltZSAtIGRmaS5nZXRTdGFydFRpbWVJbk1pbGxpcygpOworICAgICAgICAgICAgZG91YmxlIHRvdGFsID0gMDsKKyAgICAgICAgICAgIGxvbmcgbmV4dFRpbWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhdGNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgVGltZUFuZFRocmVhZENvdW50IHRhdGMgPSB0YXRjTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGkgKyAxID49IHRhdGNMaXN0LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgPSBmaW5pc2hUaW1lOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgPSB0YXRjTGlzdC5nZXQoaSArIDEpLmdldFN0YXJ0VGltZUluTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyB0aHJlYWRDb3VudFRpbWUgPSBuZXh0VGltZSAtIHRhdGMuZ2V0U3RhcnRUaW1lSW5NaWxsaXMoKTsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSAoKGRvdWJsZSkgKHRhdGMuZ2V0VGhyZWFkQ291bnQoKSAqIHRocmVhZENvdW50VGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAvIChkb3VibGUpIHJ1bnRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgYXZnVGhyZWFkQ291bnRGb3JGaWxlID0gKGludCkgTWF0aC5yaW50KHRvdGFsKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjb3JkZWQgYXZnOiAiICsgYXZnVGhyZWFkQ291bnRGb3JGaWxlKTsKKworICAgICAgICAgICAgZG91YmxlIGRvd25sb2FkU3BlZWQgPSAoZmlsZS5sZW5ndGgoKSAqIGF2Z1RocmVhZENvdW50Rm9yRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgLyBjYWxjdWxhdGVSdW50aW1lKGRmaS5nZXRTdGFydFRpbWVJbk1pbGxpcygpKTsKKyAgICAgICAgICAgIGRvdWJsZSBjdXJyZW50QXZnU3BlZWQgPSB0aGlzLmRvd25sb2FkU3BlZWRzRm9yRWFjaFRocmVhZFthdmdUaHJlYWRDb3VudEZvckZpbGVdOworICAgICAgICAgICAgaWYgKGN1cnJlbnRBdmdTcGVlZCA9PSAwKQorICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRTcGVlZHNGb3JFYWNoVGhyZWFkW2F2Z1RocmVhZENvdW50Rm9yRmlsZV0gPSBkb3dubG9hZFNwZWVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRTcGVlZHNGb3JFYWNoVGhyZWFkW2F2Z1RocmVhZENvdW50Rm9yRmlsZV0gPSAoY3VycmVudEF2Z1NwZWVkICsgZG93bmxvYWRTcGVlZCkgLyAyOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBUaHJlYWRFdmFsdWF0b3JFeGNlcHRpb24oIkZhaWxlZCB0byByZWdpc3RlciBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlICsgIiBhcyBkb3dubG9hZGVkIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnJlbnRUaHJlYWRDb3VudC0tOworICAgICAgICB9CisgICAgfQorCisgICAgbG9uZyBjYWxjdWxhdGVSdW50aW1lKGZpbmFsIGxvbmcgc3RhcnRUaW1lKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWNvbW1lbmRlZFRocmVhZENvdW50KCkgeworCisgICAgICAgIGludCBjdXJSZWNUaHJlYWRDb3VudCA9IDE7CisgICAgICAgIGRvdWJsZSBjdXJNYXhTcGVlZCA9IHRoaXMuZG93bmxvYWRTcGVlZHNGb3JFYWNoVGhyZWFkW2N1clJlY1RocmVhZENvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0aGlzLmRvd25sb2FkU3BlZWRzRm9yRWFjaFRocmVhZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGN1clNwZWVkID0gdGhpcy5kb3dubG9hZFNwZWVkc0ZvckVhY2hUaHJlYWRbaV07CisgICAgICAgICAgICBpZiAoY3VyU3BlZWQgPiBjdXJNYXhTcGVlZCkgeworICAgICAgICAgICAgICAgIGN1ck1heFNwZWVkID0gY3VyU3BlZWQ7CisgICAgICAgICAgICAgICAgY3VyUmVjVGhyZWFkQ291bnQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1clJlY1RocmVhZENvdW50ICE9IHRoaXMuTUFYX1RIUkVBRFMKKyAgICAgICAgICAgICAgICAmJiB0aGlzLmRvd25sb2FkU3BlZWRzRm9yRWFjaFRocmVhZFtjdXJSZWNUaHJlYWRDb3VudCArIDFdID09IDApCisgICAgICAgICAgICBjdXJSZWNUaHJlYWRDb3VudCsrOworICAgICAgICBlbHNlIGlmICh0aGlzLmRvd25sb2FkU3BlZWRzRm9yRWFjaFRocmVhZFtjdXJSZWNUaHJlYWRDb3VudCAtIDFdID09IDApCisgICAgICAgICAgICBjdXJSZWNUaHJlYWRDb3VudC0tOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlsgIik7CisgICAgICAgIGZvciAoZG91YmxlIHRpbWUgOiBkb3dubG9hZFNwZWVkc0ZvckVhY2hUaHJlYWQpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHRpbWUgKyAiICIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29tbWVuZGVkIFRocmVhZHM6ICIgKyBjdXJSZWNUaHJlYWRDb3VudCk7CisKKyAgICAgICAgcmV0dXJuIGN1clJlY1RocmVhZENvdW50OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL0Rvd25sb2FkaW5nRmlsZUluZm8uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9Eb3dubG9hZGluZ0ZpbGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ZGJlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9Eb3dubG9hZGluZ0ZpbGVJbmZvLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnJldHJpZXZhbHN5c3RlbTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBEb3dubG9hZGluZ0ZpbGVJbmZvIHsKKworICAgIHByaXZhdGUgRmlsZSBkb3dubG9hZGluZ0ZpbGU7CisKKyAgICBwcml2YXRlIGxvbmcgc3RhcnRUaW1lSW5NaWxsaXM7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8VGltZUFuZFRocmVhZENvdW50PiB0aW1lQW5kVGhyZWFkQ291bnRMaXN0OworCisgICAgcHVibGljIERvd25sb2FkaW5nRmlsZUluZm8oRmlsZSBkb3dubG9hZGluZ0ZpbGUsIGxvbmcgc3RhcnRUaW1lSW5NaWxsaXMsCisgICAgICAgICAgICBpbnQgY3VycmVudFRocmVhZENvdW50KSB7CisgICAgICAgIHRpbWVBbmRUaHJlYWRDb3VudExpc3QgPSBuZXcgTGlua2VkTGlzdDxUaW1lQW5kVGhyZWFkQ291bnQ+KCk7CisgICAgICAgIHRoaXMuZG93bmxvYWRpbmdGaWxlID0gZG93bmxvYWRpbmdGaWxlOworICAgICAgICB0aGlzLnN0YXJ0VGltZUluTWlsbGlzID0gc3RhcnRUaW1lSW5NaWxsaXM7CisgICAgICAgIHRoaXMudGltZUFuZFRocmVhZENvdW50TGlzdC5hZGQobmV3IFRpbWVBbmRUaHJlYWRDb3VudCgKKyAgICAgICAgICAgICAgICBzdGFydFRpbWVJbk1pbGxpcywgY3VycmVudFRocmVhZENvdW50KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlVGhyZWFkQ291bnQobG9uZyB0aW1lSW5NaWxsaXMsIGludCB0aHJlYWRDb3VudCkgeworICAgICAgICB0aGlzLnRpbWVBbmRUaHJlYWRDb3VudExpc3QuYWRkKG5ldyBUaW1lQW5kVGhyZWFkQ291bnQodGltZUluTWlsbGlzLAorICAgICAgICAgICAgICAgIHRocmVhZENvdW50KSk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0RG93bmxvYWRpbmdGaWxlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZGluZ0ZpbGU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lSW5NaWxsaXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VGltZUluTWlsbGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaW5rZWRMaXN0PFRpbWVBbmRUaHJlYWRDb3VudD4gZ2V0VGltZUFuZFRocmVhZEluZm8oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRpbWVBbmRUaHJlYWRDb3VudExpc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL0ZpbGVSZXRyaWV2YWxTeXN0ZW0uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9GaWxlUmV0cmlldmFsU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiN2ZjYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9GaWxlUmV0cmlldmFsU3lzdGVtLmphdmEKQEAgLTAsMCArMSw5NTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLlNpdGVJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5BbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuQ3Jhd2xlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUHJvdG9jb2xGaWxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZXhjZXB0aW9ucy5UaHJlYWRFdmFsdWF0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLlRvTWFueUZhaWxlZERvd25sb2Fkc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucmVuYW1pbmdjb252ZW50aW9ucy5SZW5hbWluZ0NvbnZlbnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wudXRpbC5Qcm90b2NvbEZpbGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLlByb3RvY29sRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlByb3RvY29sSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5wcm90b2NvbC5SZW1vdGVTaXRlRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuTWltZVR5cGVVdGlsczsKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKKy8qKgorICogPHByZT4KKyAqICAgIFdpbGwgY3Jhd2wgZXh0ZXJuYWwgZGlyZWN0b3J5IHN0cnVjdHVyZXMgYW5kIHdpbGwgZG93bmxvYWQgdGhlIGZpbGVzIHdpdGhpbiB0aGVzZSBzdHJ1Y3R1cmVzLgorICoKKyAqICAgIFRoaXMgY2xhc3MncyBzZXR0aW5ncyBhcmUgc2V0IHVzaW5nIGEgamF2YSAucHJvcGVydGllcyBmaWxlIHdoaWNoIGNhbiBiZSByZWFkIGluIGFuZCBwYXJzZWQgYnkgQ29uZmlnLmphdmEuCisgKiAgICBUaGlzIC5wcm9wZXJ0aWVzIGZpbGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHNldDoKKyAqCisgKiAgIAl7QGxpdGVyYWwgI2xpc3Qgb2Ygc2l0ZXMgdG8gY3Jhd2wKKyAqICAgCXByb3RvY29sLmV4dGVybmFsLnNvdXJjZXM9Jmx0O3BhdGgtdG8teG1sLWZpbGUmZ3Q7CisgKgorICogICAJI3Byb3RvY29sIHR5cGVzCisgKiAgIAlwcm90b2NvbGZhY3RvcnkudHlwZXM9Jmx0O2xpc3Qtb2YtcHJvdG9jb2xzLXNlcGFyYXRlZC1ieS1jb21tYXMmZ3Q7IChlLmcuIGZ0cCxodHRwLGh0dHBzLHNmdHApCisgKgorICogICAJI1Byb3RvY29sIGZhY3RvcmllcyBwZXIgdHlwZXMgKG11c3QgaGF2ZSBvbmUgZm9yIGVhY2ggcHJvdG9jb2wgbWVudGlvbiBpbiBwcm90b2NvbGZhY3RvcnkudHlwZXMgLS0gdGhlIHByb3BlcnR5IG11c3QgYmUgbmFtZQorICogICAgCSMgYXMgc3VjaDogcHJvdG9jb2xmYWN0b3J5LiZsdDtuYW1lLW9mLXByb3RvY29sLXR5cGUmZ3Q7CisgKiAgIAlwcm90b2NvbGZhY3RvcnkuZnRwPSZsdDtwYXRoLXRvLWphdmEtcHJvdG9jb2xmYWN0b3J5LWNsYXNzJmd0OyAoZS5nLiBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cC5GdHBDbGllbnRGYWN0b3J5KQorICogICAJcHJvdG9jb2xmYWN0b3J5Lmh0dHA9Jmx0O3BhdGgtdG8tamF2YS1wcm90b2NvbGZhY3RvcnktY2xhc3MmZ3Q7CisgKiAgIAlwcm90b2NvbGZhY3RvcnkuaHR0cHM9Jmx0O3BhdGgtdG8tamF2YS1wcm90b2NvbGZhY3RvcnktY2xhc3MmZ3Q7CisgKiAgIAlwcm90b2NvbGZhY3Rvcnkuc2Z0cD0mbHQ7cGF0aC10by1qYXZhLXByb3RvY29sZmFjdG9yeS1jbGFzcyZndDsKKyAqCisgKiAgIAkjY29uZmlndXJhdGlvbiB0byBtYWtlIGphdmEubmV0LlVSTCBhY2NlcHQgdW5zdXBwb3J0ZWQgcHJvdG9jb2xzIC0tIG11c3QgZXhpc3QganVzdCBhcyBzaG93bgorICogICAJamF2YS5wcm90b2NvbC5oYW5kbGVyLnBrZ3M9b3JnLmFwYWNoZS5vb2R0LmNhcy51cmwuaGFuZGxlcnMKKyAqICAgIH0KKyAqCisgKiAgICBJbiBvcmRlciB0byBzcGVjaWZ5IHdoaWNoIGV4dGVybmFsIHNpdGVzIHRvIGNyYXdsIHlvdSBtdXN0IGNyZWF0ZSBhIFhNTCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZQorICogICAgdGhlIHNpdGUgYW5kIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY3Jhd2wgdGhlIHNpdGUsIHN1Y2ggYXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgorICogICAgcHJvdG9jb2wuZXh0ZXJuYWwuc291cmNlcyBtdXN0IGNvbnRhaW4gdGhlIHBhdGggdG8gdGhpcyBmaWxlIHNvIHRoZSBjcmF3bCBrbm93cyB3aGVyZSB0byBmaW5kIGl0LgorICogICAgWW91IGNhbiBhbHNvIHRyYWluIHRoaXMgY2xhc3Mgb24gaG93IHRvIGNyYXdsIGVhY2ggZ2l2ZW4gc2l0ZS4gIFRoaXMgaXMgYWxzbyBzcGVjaWZpZWQgaW4gYW4gWE1MCisgKiAgICBmaWxlLCB3aG9zZSBwYXRoIG11c3QgYmUgZ2l2ZW4gaW4gdGhlIGZpcnN0IG1lbnRpb25lZCBYTUwgZmlsZSB3aGljaCBjb250aWFucyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgorICoKKyAqICAgIFRoZW4gc2NoZW1hIGZvciB0aGUgZXh0ZXJuYWwgc2l0ZXMgWE1MIGZpbGUgaXMgYXMgc3VjaDoKKyAqCisgKiAgICAJe0BsaXRlcmFsICZsdDtzb3VyY2VzJmd0OworICogICAgCSAgICZsdDtzb3VyY2UgdXJsPSZxdW90O3VybC1vZi1zZXJ2ZXImcXVvdDsmZ3Q7CisgKiAgICAJICAgICAgJmx0O3VzZXJuYW1lJmd0O3VzZXJuYW1lJmx0Oy91c2VybmFtZSZndDsKKyAqICAgIAkgICAgICAmbHQ7cGFzc3dvcmQmZ3Q7cGFzc3dvcmQmbHQ7L3Bhc3N3b3JkJmd0OworICogICAgCSAgICAgICZsdDtkaXJzdHJ1Y3QmZ3Q7cGF0aC10by14bWwtZmlsZSZsdDsvZGlyc3RydWN0Jmd0OworICogICAgCSAgICAgICZsdDtjcmF3bCZndDt5ZXMtb3Itbm8mbHQ7L2NyYXdsJmd0OworICogICAgCSAgICZsdDsvc291cmNlJmd0OworICogICAgCSAgIC4uLgorICogICAgCSAgIC4uLgorICogICAgCSAgIC4uLgorICogICAgCSZsdDsvc291cmNlc1wmZ3Q7fQorICoKKyAqICAgIFlvdSBtYXkgc3BlY2lmeSBhcyBtYW55IHNvdXJjZXMgYXMgeW91IHdvdWxkIGxpa2UgYnkgc3BlY2lmeWluZyBtdWx0aXBsZSB7QGxpdGVyYWwgJmx0O3NvdXJjZSZndDt9IHRhZ3MuCisgKiAgICBJbiB0aGUge0BsaXRlcmFsICZsdDtzb3VyY2UmZ3Q7fSB0YWcsIHRoZSBwYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBzcGVjaWZpZWQuICBUaGlzIGlzIHRoZSB1cmwgb2YgdGhlIHNlcnZlcgorICogICAgeW91IHdhbnQgdGhlIGNyYXdsZXIgdG8gY29ubmVjdCB0by4gIEl0IHNob3VsZCBiZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqICAgIHtAbGl0ZXJhbCAmbHQ7cHJvdG9jb2wmZ3Q7Oi8vJmx0O2hvc3QmZ3Q7fSAoZS5nLiBzZnRwOi8vcmVtb3RlLmNvbXB1dGVyLmdvdikKKyAqICAgIElmIG5vIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBleGlzdCwgdGhlbiB0aGVzZSBlbGVtZW50cyBjYW4gYmUgb21pdHRlZCAodGhleSBhcmUgb3B0aW9uYWwpLgorICogICAgRm9yIHtAbGl0ZXJhbCAmbHQ7Y3Jhd2wmZ3Q7fSBwbGFjZSB5ZXMgb3Igbm8gaGVyZS4gIFRoaXMgaXMgZm9yIGNvbnZlbmllbmNlIG9mIGJlaW5nIGFibGUgdG8ga2VlcCByZWNvcmQgb2YgdGhlCisgKiAgICBzaXRlcyBhbmQgdGhlaXIgaW5mb3JtYXRpb24gaW4gdGhpcyBYTUwgZmlsZSBldmVuIGlmIHlvdSBkZWNpZGUgdGhhdCB5b3Ugbm8gbG9uZ2VyIG5lZWQgdG8gY3Jhd2wgaXQKKyAqICAgIGFueW1vcmUgKGp1c3QgcHV0IHtAbGl0ZXJhbCAmbHQ7Y3Jhd2wmZ3Q7bm8mbHQ7L2NyYXdsJmd0O30gYW5kIHRoZSBjcmF3bCB3aWxsIG5vdCBjcmF3bCB0aGF0IHNpdGUpLgorICogICAge0BsaXRlcmFsICZsdDtkaXJTdHJ1Y3QmZ3Q7fSBjb250YWlucyBhIHBhdGggdG8gYW5vdGhlciBYTUwgZmlsZSB3aGljaCBpcyBkb2N1bWVudGVkIGluIERpclN0cnVjdC5qYXZhIGphdmFkb2MuICBUaGlzCisgKiAgICBlbGVtZW50IGlzIG9wdGlvbmFsLiAgSWYgbm8ge0BsaXRlcmFsICZsdDtkaXJTdHJ1Y3QmZ3Q7fSBpcyBnaXZlbiwgdGhlbiBldmVyeSBkaXJlY3Rvcnkgd2lsbCBiZSBjcmF3bGVkIG9uIHRoZSBzaXRlCisgKiAgICBhbmQgZXZlcnkgZW5jb3VudGVyZWQgZmlsZSB3aWxsIGJlIGRvd25sb2FkZWQuCisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEZpbGVSZXRyaWV2YWxTeXN0ZW0geworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKEZpbGVSZXRyaWV2YWxTeXN0ZW0uY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfUkVUUklFUyA9IDM7CisKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPiBmYWlsZWREb3dubG9hZExpc3Q7CisKKyAgICBwcml2YXRlIEhhc2hTZXQ8UHJvdG9jb2xGaWxlPiBjdXJyZW50bHlEb3dubG9hZGluZzsKKworICAgIHByaXZhdGUgaW50IG1heF9hbGxvd2VkX2ZhaWxlZF9kb3dubG9hZHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4IG51bWJlciBvZiB0aHJlYWRzIGFibGUgdG8gcnVuIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhfc2Vzc2lvbnM7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBhYnNNYXhBbGxvd2VkU2Vzc2lvbnMgPSA1MDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMganVzdCBmb3IgY2xhcml0eSBwdXJwb3Nlcy4gLiAuSSBvbmx5IGNyZWF0ZSB0aGUgYW1vdW50IG9mIHRocmVhZHMKKyAgICAgKiB0aGF0IEkgd2lsbCBhbGxvdyB0byBiZSB1c2VkIGF0IGFueSBnaXZlbiBtb21lbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRVhUUkFfTEFaWV9TRVNTSU9OU19USU1FT1VUID0gMTA7CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgY3JlYXRlZCBwcm90b2NvbCBzZXNzaW9ucyAoZGV2b3RlZCB0byBncmFiYmluZyBmaWxlcyBmcm9tIHRoZQorICAgICAqIGNyYXdsaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUpIHRoYXQgYXJlIG5vdCBwcmVzZW50bHkgaW4gdXNlLgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yPFByb3RvY29sPiBhdmFsaWFibGVTZXNzaW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCAoc2hvdWxkIGFsd2F5cyBiZSBsZXNzIHRoYW4KKyAgICAgKiBvciBlcXVhbCB0byBNQVhfU0VTU0lPTlMpLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG51bWJlck9mU2Vzc2lvbnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZWFkIHBvb2wgdGhhdCBpcyBpbiBjaGFyZ2Ugb2YgdGhlIHNlc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkUG9vbEV4ZWN1dG9yIHRocmVhZENvbnRyb2xsZXI7CisKKyAgICAvKioKKyAgICAgKiBNYW5hZ2VzIHRoZSBQcm90b2NvbHMgYW5kIGFsd2F5cyBlbnN1cmVzIHRoYXQgdGhlIENyYXdsZXIgaXMgdXNpbmcgdGhlCisgICAgICogYXBwcm9wcmlhdGUgcHJvdG9jb2wgZm9yIGFueSBnaXZlbiBzZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm90b2NvbEhhbmRsZXIgcHJvdG9jb2xIYW5kbGVyOworCisgICAgLyoqCisgICAgICogbWF4X3Nlc3Npb25zIHRyYWNrZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIERvd25sb2FkVGhyZWFkRXZhbHVhdG9yIGR0RXZhbDsKKworICAgIHByaXZhdGUgRG93bmxvYWRMaXN0ZW5lciBkTGlzdGVuZXI7CisKKyAgICBwcml2YXRlIENvbmZpZyBjb25maWc7CisKKyAgICBwcml2YXRlIFNpdGVJbmZvIHNpdGVJbmZvOworCisgICAgcHJpdmF0ZSBIYXNoU2V0PEZpbGU+IHN0YWdpbmdBcmVhczsKKworICAgIHByaXZhdGUgTWltZVR5cGVVdGlscyBtaW1lVHlwZURldGVjdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBDcmF3bGVyIGJhc2VkIG9uIHRoZSBVUkwsIERpclN0cnVjdCwgYW5kIENvbmZpZyBvYmplY3RzIHBhc3NlZAorICAgICAqIGluLiBJZiBubyBEaXJTdHJ1Y3QgaXMgbmVlZGVkIHRoZW4gc2V0IGl0IHRvIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogICAgICAgICAgICBUaGUgVVJMIGZvciB3aGljaCB5b3Ugd2FudCB0aGlzIENyYXdsZXIgdG8gY3Jhd2wKKyAgICAgKiBAcGFyYW0gZGlyU3RydWN0CisgICAgICogICAgICAgICAgICBUaGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgbG9jYXRlZCBhdCB0aGUgaG9zdCAtLSB1c2UKKyAgICAgKiAgICAgICAgICAgIHRvIHRyYWluIGNyYXdsZXIgKHNlZSBEaXJTdHJ1Y3QpLgorICAgICAqIEBwYXJhbSBjb25maWcKKyAgICAgKiAgICAgICAgICAgIFRoZSBDb25maWd1cmF0aW9uIGZpbGUgdGhhdCBpcyBwYXNzZWQgdG8gdGhpcyBvYmplY3RzCisgICAgICogICAgICAgICAgICBQcm90b2NvbEhhbmRsZXIuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBEYXRhYmFzZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBGaWxlUmV0cmlldmFsU3lzdGVtKENvbmZpZyBjb25maWcsIFNpdGVJbmZvIHNpdGVJbmZvKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyID0gbmV3IFByb3RvY29sSGFuZGxlcihjb25maWcuZ2V0UHJvdG9jb2xJbmZvKCkpOworICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgICAgICB0aGlzLnNpdGVJbmZvID0gc2l0ZUluZm87CisgICAgICAgICAgICBtaW1lVHlwZURldGVjdGlvbiA9IG5ldyBNaW1lVHlwZVV0aWxzKGNvbmZpZworICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVEZXRlY3Rpb25GaWxlKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBGaWxlUmV0cmlldmFsU3lzdGVtIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRG93bmxvYWRMaXN0ZW5lcihEb3dubG9hZExpc3RlbmVyIGRMaXN0ZW5lcikgeworICAgICAgICB0aGlzLmRMaXN0ZW5lciA9IGRMaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc2V0VmFyaWFibGVzKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBpbml0aWFsaXplIEZpbGVSZXRyaWV2YWxTeXN0ZW0gOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdmFyaWFibGVzIHRoYXQgbXVzdCBiZSByZXNldCB3aGVuIG1vcmUgdGhhbiBvbmUgY3Jhd2wgaXMgZG9uZQorICAgICAqCisgICAgICogQHRocm93cyBUaHJlYWRFdmFsdWF0b3JFeGNlcHRpb24KKyAgICAgKi8KKyAgICB2b2lkIHJlc2V0VmFyaWFibGVzKCkgdGhyb3dzIFRocmVhZEV2YWx1YXRvckV4Y2VwdGlvbiB7CisgICAgICAgIG51bWJlck9mU2Vzc2lvbnMgPSAwOworICAgICAgICBzdGFnaW5nQXJlYXMgPSBuZXcgSGFzaFNldDxGaWxlPigpOworICAgICAgICBhdmFsaWFibGVTZXNzaW9ucyA9IG5ldyBWZWN0b3I8UHJvdG9jb2w+KCk7CisgICAgICAgIGN1cnJlbnRseURvd25sb2FkaW5nID0gbmV3IEhhc2hTZXQ8UHJvdG9jb2xGaWxlPigpOworICAgICAgICBmYWlsZWREb3dubG9hZExpc3QgPSBuZXcgTGlua2VkTGlzdDxQcm90b2NvbEZpbGU+KCk7CisgICAgICAgIG1heF9hbGxvd2VkX2ZhaWxlZF9kb3dubG9hZHMgPSBjb25maWcuZ2V0TWF4RmFpbGVkRG93bmxvYWRzKCk7CisgICAgICAgIG1heF9zZXNzaW9ucyA9IGNvbmZpZy5nZXRSZWNvbW1lbmRlZFRocmVhZENvdW50KCk7CisgICAgICAgIHRocmVhZENvbnRyb2xsZXIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKHRoaXMubWF4X3Nlc3Npb25zLAorICAgICAgICAgICAgICAgIHRoaXMubWF4X3Nlc3Npb25zLCBFWFRSQV9MQVpZX1NFU1NJT05TX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCkpOworICAgICAgICBpZiAoY29uZmlnLnVzZVRyYWNrZXIoKSkKKyAgICAgICAgICAgIGR0RXZhbCA9IG5ldyBEb3dubG9hZFRocmVhZEV2YWx1YXRvcih0aGlzLmFic01heEFsbG93ZWRTZXNzaW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVzZXQgZXJyb3IgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyRXJyb3JGbGFnKCkgeworICAgICAgICBtYXhfYWxsb3dlZF9mYWlsZWRfZG93bmxvYWRzICs9IGNvbmZpZy5nZXRNYXhGYWlsZWREb3dubG9hZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FscmVhZHlJbkRhdGFiYXNlKFJlbW90ZUZpbGUgcmYpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbmdlc3RlcigpICE9IG51bGwgPyBjb25maWcuZ2V0SW5nZXN0ZXIoKS5oYXNQcm9kdWN0KAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRGbVVybCgpLCByZi5nZXRNZXRhZGF0YShSZW1vdGVGaWxlLlBST0RVQ1RfTkFNRSkpCisgICAgICAgICAgICAgICAgOiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZW1vdGVTaXRlRmlsZT4gZ2V0TmV4dFBhZ2UoZmluYWwgUmVtb3RlU2l0ZUZpbGUgZGlyLAorICAgICAgICAgICAgZmluYWwgUHJvdG9jb2xGaWxlRmlsdGVyIGZpbHRlcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xIYW5kbGVyLm5leHRQYWdlKGRpci5nZXRTaXRlKCksIHByb3RvY29sSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFwcHJvcHJpYXRlUHJvdG9jb2woZGlyLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm90b2NvbEZpbGVGaWx0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUHJvdG9jb2xGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5hY2NlcHQoZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhRmlsZVJldHJpZXZhbFN5c3RlbS50aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNEb3dubG9hZGluZyhmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiUmV0cnlpbmcgdG8gZ2V0IG5leHQgcGFnZSBmb3IgIiArIGRpcgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2Ugb3BlcmF0aW9uIGZhaWxlZCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbmV4dCBwYWdlIGZvciAiCisgICAgICAgICAgICAgICAgKyBkaXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoYW5nZVRvUm9vdChSZW1vdGVTaXRlIHJlbW90ZVNpdGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5leGNlcHRpb25zLlByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbGlkYXRlKHJlbW90ZVNpdGUpKQorICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLmNkVG9ST09UKHByb3RvY29sSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbEJ5U2l0ZShyZW1vdGVTaXRlLCB0cnVlKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiTm90IGEgdmFsaWQgcmVtb3RlIHNpdGUgIiArIHJlbW90ZVNpdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoYW5nZVRvSE9NRShSZW1vdGVTaXRlIHJlbW90ZVNpdGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWxpZGF0ZShyZW1vdGVTaXRlKSkKKyAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5jZFRvSE9NRShwcm90b2NvbEhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldEFwcHJvcHJpYXRlUHJvdG9jb2xCeVNpdGUocmVtb3RlU2l0ZSwgdHJ1ZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIk5vdCBhIHZhbGlkIHJlbW90ZSBzaXRlICIgKyByZW1vdGVTaXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VUb0RpcihTdHJpbmcgZGlyLCBSZW1vdGVTaXRlIHJlbW90ZVNpdGUpCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWxpZGF0ZShyZW1vdGVTaXRlKSkKKyAgICAgICAgICAgIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLmNoYW5nZVRvRGlyKHByb3RvY29sSGFuZGxlci5nZXRQcm90b2NvbEZpbGVGb3IocmVtb3RlU2l0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbEJ5U2l0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVNpdGUsIHRydWUpLCBkaXIsIHRydWUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJOb3QgYSB2YWxpZCByZW1vdGUgc2l0ZSAiICsgcmVtb3RlU2l0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hhbmdlVG9EaXIoUmVtb3RlU2l0ZUZpbGUgcEZpbGUpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSA9IHBGaWxlLmdldFNpdGUoKTsKKyAgICAgICAgaWYgKHZhbGlkYXRlKHJlbW90ZVNpdGUpKQorICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLmNkKHByb3RvY29sSGFuZGxlci5nZXRBcHByb3ByaWF0ZVByb3RvY29sQnlTaXRlKAorICAgICAgICAgICAgICAgICAgICByZW1vdGVTaXRlLCB0cnVlKSwgcEZpbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIk5vdCBhIHZhbGlkIHJlbW90ZSBzaXRlICIgKyByZW1vdGVTaXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvdG9jb2xGaWxlIGdldEhvbWVEaXIoUmVtb3RlU2l0ZSByZW1vdGVTaXRlKQorICAgICAgICAgICAgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbGlkYXRlKHJlbW90ZVNpdGUpKQorICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sSGFuZGxlci5nZXRIb21lRGlyKHJlbW90ZVNpdGUsIHByb3RvY29sSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbEJ5U2l0ZShyZW1vdGVTaXRlLCB0cnVlKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiTm90IGEgdmFsaWQgcmVtb3RlIHNpdGUgIiArIHJlbW90ZVNpdGUpOworICAgIH0KKworICAgIHB1YmxpYyBQcm90b2NvbEZpbGUgZ2V0UHJvdG9jb2xGaWxlKFJlbW90ZVNpdGUgcmVtb3RlU2l0ZSwgU3RyaW5nIGZpbGUsCisgICAgICAgICAgICBib29sZWFuIGlzRGlyKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24geworICAgICAgICBpZiAodmFsaWRhdGUocmVtb3RlU2l0ZSkpCisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xIYW5kbGVyLmdldFByb3RvY29sRmlsZUZvcihyZW1vdGVTaXRlLCBwcm90b2NvbEhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldEFwcHJvcHJpYXRlUHJvdG9jb2xCeVNpdGUocmVtb3RlU2l0ZSwgdHJ1ZSksIGZpbGUsCisgICAgICAgICAgICAgICAgICAgIGlzRGlyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJOb3QgYSB2YWxpZCByZW1vdGUgc2l0ZSAiICsgcmVtb3RlU2l0ZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3RvY29sRmlsZSBnZXRDdXJyZW50RmlsZShSZW1vdGVTaXRlIHJlbW90ZVNpdGUpCisgICAgICAgICAgICB0aHJvd3MgUHJvdG9jb2xGaWxlRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWxpZGF0ZShyZW1vdGVTaXRlKSkKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbEhhbmRsZXIucHdkKHJlbW90ZVNpdGUsIHByb3RvY29sSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbEJ5U2l0ZShyZW1vdGVTaXRlLCB0cnVlKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiTm90IGEgdmFsaWQgcmVtb3RlIHNpdGUgIiArIHJlbW90ZVNpdGUpOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBkb3dubG9hZCB3YXMgYWRkZWQgdG8gcXVldWUuIC4gLmZhbHNlIG90aGVyd2lzZQorICAgIHB1YmxpYyBib29sZWFuIGFkZFRvRG93bmxvYWRRdWV1ZShSZW1vdGVTaXRlIHJlbW90ZVNpdGUsIFN0cmluZyBmaWxlLAorICAgICAgICAgICAgU3RyaW5nIHJlbmFtaW5nU3RyaW5nLCBGaWxlIGRvd25sb2FkVG9EaXIsCisgICAgICAgICAgICBTdHJpbmcgdW5pcXVlTWV0YWRhdGFFbGVtZW50LCBib29sZWFuIGRlbGV0ZUFmdGVyRG93bmxvYWQsIE1ldGFkYXRhIGZpbGVNZXRhZGF0YSkKKyAgICAgICAgICAgIHRocm93cyBUb01hbnlGYWlsZWREb3dubG9hZHNFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sCisgICAgICAgICAgICBQcm90b2NvbEZpbGVFeGNlcHRpb24sIFByb3RvY29sRXhjZXB0aW9uLAorICAgICAgICAgICAgQWxyZWFkeUluRGF0YWJhc2VFeGNlcHRpb24sIFVuZGVmaW5lZFR5cGVFeGNlcHRpb24sCisgICAgICAgICAgICBDYXRhbG9nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWxpZGF0ZShyZW1vdGVTaXRlKSkgeworICAgICAgICAgICAgaWYgKCFmaWxlLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBmaWxlID0gIi8iICsgZmlsZTsKKyAgICAgICAgICAgIHJldHVybiBhZGRUb0Rvd25sb2FkUXVldWUocHJvdG9jb2xIYW5kbGVyLmdldFByb3RvY29sRmlsZUZvcihyZW1vdGVTaXRlLAorICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbEJ5U2l0ZShyZW1vdGVTaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLCBmaWxlLCBmYWxzZSksIHJlbmFtaW5nU3RyaW5nLCBkb3dubG9hZFRvRGlyLAorICAgICAgICAgICAgICAgICAgICB1bmlxdWVNZXRhZGF0YUVsZW1lbnQsIGRlbGV0ZUFmdGVyRG93bmxvYWQsIGZpbGVNZXRhZGF0YSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJOb3QgYSB2YWxpZCByZW1vdGUgc2l0ZSAiICsgcmVtb3RlU2l0ZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoUmVtb3RlU2l0ZSByZW1vdGVTaXRlKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHJlbW90ZVNpdGUpOworICAgICAgICBMaW5rZWRMaXN0PFJlbW90ZVNpdGU+IHJlbW90ZVNpdGVzID0gdGhpcy5zaXRlSW5mbworICAgICAgICAgICAgICAgIC5nZXRQb3NzaWJsZVJlbW90ZVNpdGVzKHJlbW90ZVNpdGUuZ2V0QWxpYXMoKSwgcmVtb3RlU2l0ZQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFVSTCgpLCByZW1vdGVTaXRlLmdldFVzZXJuYW1lKCksIHJlbW90ZVNpdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgaWYgKHJlbW90ZVNpdGVzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICBSZW1vdGVTaXRlIHJzID0gcmVtb3RlU2l0ZXMuZ2V0KDApOworICAgICAgICAgICAgcmVtb3RlU2l0ZS5jb3B5KHJzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxBbGxDdXJyZW50RG93bmxvYWRzQXJlQ29tcGxldGUoKQorICAgICAgICAgICAgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE4MDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXZhbGlhYmxlU2Vzc2lvbnMuc2l6ZSgpID09IHRoaXMubnVtYmVyT2ZTZXNzaW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KDUwMDApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRG93bmxvYWRzIGFwcGVhciB0byBiZSBoYW5naW5nIC4gLiAuIGFib3J0aW5nIHdhaXQgLiAuIC4gd2FpdGVkIGZvciAxNSBtaW51dGVzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHVibGljIGJvb2xlYW4gYWRkVG9Eb3dubG9hZFF1ZXVlKFJlbW90ZVNpdGVGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVuYW1pbmdTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRvd25sb2FkVG9EaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlTWV0YWRhdGFFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWxldGVBZnRlckRvd25sb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgZmlsZU1ldGFkYXRhKSB0aHJvd3MgVG9NYW55RmFpbGVkRG93bmxvYWRzRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscmVhZHlJbkRhdGFiYXNlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZpbmVkVHlwZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGFsb2dFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLmZhaWxlZERvd25sb2FkTGlzdC5zaXplKCkgPiBtYXhfYWxsb3dlZF9mYWlsZWRfZG93bmxvYWRzKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRvTWFueUZhaWxlZERvd25sb2Fkc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBmYWlsZWQgZG93bmxvYWRzIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWF4X2FsbG93ZWRfZmFpbGVkX2Rvd25sb2FkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAuIC4gLiBibG9ja2luZyBhbGwgZG93bmxvYWRzIGZyb20gYmVpbmcgYWRkZWQgdG8gcXVldWUgLiAuIC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlc2V0IGVycm9yIGZsYWcgaW4gb3JkZXIgdG8gZm9yY2UgYWxsb3cgZG93bmxvYWRzIGludG8gcXVldWUiKTsKKyAgICAgICAgaWYgKHRoaXMuaXNEb3dubG9hZGluZyhmaWxlKSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiU2tpcHBpbmcgZmlsZSAnIiArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgKyAiJyBiZWNhdXNlIGl0IGlzIGFscmVhZHkgb24gdGhlIGRvd25sb2FkIHF1ZXVlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBSZW1vdGVGaWxlIHJlbW90ZUZpbGUgPSBuZXcgUmVtb3RlRmlsZShmaWxlKTsKKyAgICAgICAgcmVtb3RlRmlsZS5hZGRNZXRhZGF0YShmaWxlTWV0YWRhdGEpOworICAgICAgICByZW1vdGVGaWxlLmFkZE1ldGFkYXRhKFJlbW90ZUZpbGUuUkVOQU1JTkdfU1RSSU5HLCByZW5hbWluZ1N0cmluZyk7CisgICAgICAgIHJlbW90ZUZpbGUuYWRkTWV0YWRhdGEoUmVtb3RlRmlsZS5ERUxFVEVfQUZURVJfRE9XTkxPQUQsCisgICAgICAgICAgICAgICAgZGVsZXRlQWZ0ZXJEb3dubG9hZCArICIiKTsKKworICAgICAgICBpZiAoY29uZmlnLm9ubHlEb3dubG9hZERlZmluZWRUeXBlcygpKSB7CisgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHRoaXMubWltZVR5cGVEZXRlY3Rpb24uZ2V0TWltZVR5cGUoZmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICYmICFtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICByZW1vdGVGaWxlLmFkZE1ldGFkYXRhKFJlbW90ZUZpbGUuTUlNRV9UWVBFLCBtaW1lVHlwZSk7CisgICAgICAgICAgICAgICByZW1vdGVGaWxlLmFkZE1ldGFkYXRhKFJlbW90ZUZpbGUuU1VQRVJfVFlQRSwgdGhpcy5taW1lVHlwZURldGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3VwZXJUeXBlRm9yTWltZVR5cGUobWltZVR5cGUpKTsKKyAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHRoaXMubWltZVR5cGVEZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgLmdldERlc2NyaXB0aW9uRm9yTWltZVR5cGUobWltZVR5cGUpOworICAgICAgICAgICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZGVzY3JpcHRpb24pKSB7CisgICAgICAgICAgICAgICAgIGlmKGRlc2NyaXB0aW9uLmluZGV4T2YoIiYiKSAhPSAtMSl7CisgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmllbGQgOiBkZXNjcmlwdGlvbi5zcGxpdCgiXFwmXFwmIikpIHsKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleXZhbCA9IGZpZWxkLnNwbGl0KCJcXD0iKTsKKyAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGUuYWRkTWV0YWRhdGEoa2V5dmFsWzBdLnRyaW0oKSwga2V5dmFsWzFdLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgLy8gaXQncyB0aGUgUHJvZHVjdFR5cGUKKyAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlLmFkZE1ldGFkYXRhKFJlbW90ZUZpbGUuUFJPRFVDVF9UWVBFLCBkZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZUZpbGUuZ2V0TWV0YWRhdGEoUmVtb3RlRmlsZS5VTklRVUVfRUxFTUVOVCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB1bmlxdWVNZXRhZGF0YUVsZW1lbnQgPSByZW1vdGVGaWxlLmdldE1ldGFkYXRhKFJlbW90ZUZpbGUuVU5JUVVFX0VMRU1FTlQpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBVbmRlZmluZWRUeXBlRXhjZXB0aW9uKCJGaWxlICciICsgZmlsZQorICAgICAgICAgICAgICAgICAgICArICInIGlzIG5vdCBhIGRlZmluZWQgdHlwZSIpOworICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkb3dubG9hZFRvRGlyID0gbmV3IEZpbGUoZG93bmxvYWRUb0Rpci5pc0Fic29sdXRlKCkgPyBkb3dubG9hZFRvRGlyCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpIDogdGhpcy5jb25maWcuZ2V0QmFzZVN0YWdpbmdBcmVhKCkgKyAiLyIKKyAgICAgICAgICAgICAgICArIGRvd25sb2FkVG9EaXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgaWYgKCF0aGlzLmlzU3RhZ2luZ0FyZWFJbml0aWFsaXplZChkb3dubG9hZFRvRGlyKSkKKyAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0YWdpbmdBcmVhKGRvd25sb2FkVG9EaXIpOworCisgICAgICAgIHJlbW90ZUZpbGUuYWRkTWV0YWRhdGEoUmVtb3RlRmlsZS5ET1dOTE9BRF9UT19ESVIsIGRvd25sb2FkVG9EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgCWlmIChyZW1vdGVGaWxlLmdldE1ldGFkYXRhKFJlbW90ZUZpbGUuUFJPRFVDVF9OQU1FX0dFTkVSQVRPUikgIT0gbnVsbCkgeworICAgIAkJcmVtb3RlRmlsZS5hZGRNZXRhZGF0YShSZW1vdGVGaWxlLlBST0RVQ1RfTkFNRSwgUmVuYW1pbmdDb252ZW50aW9uLnJlbmFtZShyZW1vdGVGaWxlLCByZW1vdGVGaWxlLmdldE1ldGFkYXRhKFJlbW90ZUZpbGUuUFJPRFVDVF9OQU1FX0dFTkVSQVRPUikpKTsKKyAgICAJfWVsc2UgeworICAgIAkJcmVtb3RlRmlsZS5zZXRVbmlxdWVNZXRhZGF0YUVsZW1lbnQodW5pcXVlTWV0YWRhdGFFbGVtZW50ID09IG51bGwgPyBSZW1vdGVGaWxlLkZJTEVOQU1FIDogdW5pcXVlTWV0YWRhdGFFbGVtZW50KTsKKyAgICAJfQorCisgICAgICAgIGlmICghaXNBbHJlYWR5SW5EYXRhYmFzZShyZW1vdGVGaWxlKSkgeworCisgICAgICAgICAgICAvLyBnZXQgZG93bmxvYWQgbG9jYXRpb24KKyAgICAgICAgICAgIEZpbGUgbmV3RmlsZSA9IGdldFNhdmVUb0xvYyhyZW1vdGVGaWxlKTsKKworICAgICAgICAgICAgLy8gYWRkIHNlc3Npb24gdG8gdGhyZWFkIHBvb2wKKyAgICAgICAgICAgIGlmICghdGhpcy5pc0luU3RhZ2luZ0FyZWEobmV3RmlsZSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByZXRyaWVzID0gMDs7IHJldHJpZXMrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Vzc2lvblRvVGhyZWFkUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV4dEF2YWxpYWJsZVNlc3Npb24ocmVtb3RlRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKSksIHJlbW90ZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IE1BWF9SRVRSSUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRmFpbGVkIHRvIGdldCBzZXNzaW9uIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGUgKyAiIC4gLiAuIHJldHJ5aW5nIGluIDUgc2VjcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCg1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbGVkRG93bmxvYWRMaXN0LmFkZChmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHNlc3Npb24gdG8gZG93bmxvYWQgIiArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZUFmdGVyRG93bmxvYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKHByb3RvY29sSGFuZGxlci5nZXRBcHByb3ByaWF0ZVByb3RvY29sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIHRydWUsIHRydWUpLCBmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlIGZyb20gc2VydmVyIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlNraXBwaW5nIGZpbGUgIiArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGl0IGlzIGFscmVhZHkgaW4gc3RhZ2luZyBhcmVhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBBbHJlYWR5SW5EYXRhYmFzZUV4Y2VwdGlvbigiRmlsZSAiICsgZmlsZQorICAgICAgICAgICAgICAgICAgICArICIgaXMgYWxyZWFkeSB0aGUgZGF0YWJhc2UiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGFnaW5nQXJlYUluaXRpYWxpemVkKEZpbGUgc3RhZ2luZ0FyZWEpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RhZ2luZ0FyZWFzLmNvbnRhaW5zKHN0YWdpbmdBcmVhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJblN0YWdpbmdBcmVhKGZpbmFsIEZpbGUgZmluZEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIChmaW5kRmlsZS5leGlzdHMoKSB8fCBuZXcgRmlsZShmaW5kRmlsZS5nZXRQYXJlbnRGaWxlKCksCisgICAgICAgICAgICAgICAgIkRvd25sb2FkaW5nXyIgKyBmaW5kRmlsZS5nZXROYW1lKCkpLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YWdpbmdBcmVhKEZpbGUgc3RhZ2luZ0FyZWEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlByZXBhcmluZyBzdGFnaW5nIGFyZWEgIiArIHN0YWdpbmdBcmVhKTsKKyAgICAgICAgaWYgKHN0YWdpbmdBcmVhLmV4aXN0cygpKSB7CisgICAgICAgICAgICBGaWxlW10gZmFpbGVkRG93bmxvYWRzID0gc3RhZ2luZ0FyZWEubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLmdldE5hbWUoKS5zdGFydHNXaXRoKCJEb3dubG9hZGluZ18iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmFpbGVkRG93bmxvYWRzKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiUmVtb3ZpbmcgZmFpbGVkIGRvd25sb2FkIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU3RhZ2luZyBhcmVhICIgKyBzdGFnaW5nQXJlYS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QhIC0tIHRyeWluZyB0byBjcmVhdGUgaXQgIik7CisgICAgICAgICAgICBpZiAoIXN0YWdpbmdBcmVhLm1rZGlycygpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBzdGFnaW5nIGFyZWEgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFnaW5nQXJlYS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdGFnaW5nQXJlYXMuYWRkKHN0YWdpbmdBcmVhKTsKKyAgICB9CisKKyAgICBGaWxlIGdldFNhdmVUb0xvYyhSZW1vdGVGaWxlIHJlbW90ZUZpbGUpIHsKKyAgICAgICAgU3RyaW5nIHJlbmFtaW5nU3RyaW5nID0gcmVtb3RlRmlsZQorICAgICAgICAgICAgICAgIC5nZXRNZXRhZGF0YShSZW1vdGVGaWxlLlJFTkFNSU5HX1NUUklORyk7CisgICAgICAgIGlmIChyZW5hbWluZ1N0cmluZyA9PSBudWxsIHx8IHJlbmFtaW5nU3RyaW5nLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShyZW1vdGVGaWxlLmdldE1ldGFkYXRhKFJlbW90ZUZpbGUuRE9XTkxPQURfVE9fRElSKQorICAgICAgICAgICAgICAgICAgICArICIvIiArIHJlbW90ZUZpbGUuZ2V0TWV0YWRhdGEoUmVtb3RlRmlsZS5GSUxFTkFNRSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUocmVtb3RlRmlsZQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoUmVtb3RlRmlsZS5ET1dOTE9BRF9UT19ESVIpCisgICAgICAgICAgICAgICAgICAgICsgIi8iCisgICAgICAgICAgICAgICAgICAgICsgUmVuYW1pbmdDb252ZW50aW9uLnJlbmFtZShyZW1vdGVGaWxlLCByZW5hbWluZ1N0cmluZykpOworICAgICAgICAgICAgaWYgKCFuZXdGaWxlLmdldFBhcmVudEZpbGUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGUuZ2V0TWV0YWRhdGEoUmVtb3RlRmlsZS5ET1dOTE9BRF9UT19ESVIpKSkKKyAgICAgICAgICAgICAgICBuZXdGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdGaWxlOworICAgICAgICB9CisgICAgfQorCisgICAgUHJvdG9jb2wgZ2V0TmV4dEF2YWxpYWJsZVNlc3Npb24oUmVtb3RlU2l0ZUZpbGUgZmlsZSkgdGhyb3dzIENyYXdsZXJFeGNlcHRpb24geworICAgICAgICAvLyB3YWl0IGZvciBhdmFpbGFibGUgc2Vzc2lvbiwgdGhlbiBsb2FkIGl0CisgICAgICAgIFByb3RvY29sIHNlc3Npb247CisgICAgICAgIHdoaWxlICgoc2Vzc2lvbiA9IGdldFNlc3Npb24oZmlsZSkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2FpdE1haW5UaHJlYWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2xlZXBzIHRoZSBjcmF3bGluZyB0aHJlYWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCB3YWl0TWFpblRocmVhZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWtlcyB1cCB0aGUgY3Jhd2xpbmcgdGhyZWFkCisgICAgICovCisgICAgc3luY2hyb25pemVkIHZvaWQgd2FrZVVwTWFpblRocmVhZCgpIHsKKyAgICAgICAgbm90aWZ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGRvd25sb2FkaW5nIHNlc3Npb24KKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBpbmNyZW1lbnRTZXNzaW9ucygpIHsKKyAgICAgICAgbnVtYmVyT2ZTZXNzaW9ucysrOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIGRlY3JlbWVudFNlc3Npb25zKCkgeworICAgICAgICB0aGlzLm51bWJlck9mU2Vzc2lvbnMtLTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGF2YWlsYWJsZSBkb3dubG9hZGluZyBzZXNzaW9uIFByb3RvY29sLiBSZXR1cm5zIG51bGwgaWYgbm9uZSBhcmUKKyAgICAgKiBhdmFpbGFibGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICBUaGUgc2Vzc2lvbiByZXR1cm5lZCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgUGF0aCBwYXNzZWQKKyAgICAgKiAgICAgICAgICAgIGluIGFuZCBpZiBub3QgcHJlc2VudGx5IGNvbm5lY3RlZCB0byB0aGUgUGF0aCdzIFVSTCwgaXQgd2lsbAorICAgICAqICAgICAgICAgICAgYmUgZGlzY29ubmVjdGVkIGZyb20gaXQncyBjdXJyZW50IHNlcnZlciBhbmQgY29ubmVjdGVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgc2VydmVyIHNwZWNpZmllZCBieSB0aGUgUGF0aC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmb3VuZCBkb3dubG9hZGluZyBzZXNzaW9uIFByb3RvY29sCisgICAgICogQHRocm93cyBSZW1vdGVDb21tdW5pY2F0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgZG93bmxvYWRpbmcgc2Vzc2lvbiBQcm90b2NvbCBoYXMgdG8gYmUgcmVjb25uZWN0ZWQgYW5kCisgICAgICogICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgUHJvdG9jb2wgZ2V0U2Vzc2lvbihSZW1vdGVTaXRlRmlsZSBmaWxlKSB0aHJvd3MgQ3Jhd2xlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm90b2NvbCBzZXNzaW9uID0gbnVsbDsKKwkJCWlmIChmaWxlLmdldFNpdGUoKS5nZXRNYXhDb25uZWN0aW9ucygpIDwgMAorCQkJCQl8fCBmaWxlLmdldFNpdGUoKS5nZXRNYXhDb25uZWN0aW9ucygpID4gdGhpcy5nZXRDdXJyZW50bHlEb3dubG9hZGluZ0ZpbGVzKCkuc2l6ZSgpKSB7CisJICAgICAgICAgICAgaWYgKGF2YWxpYWJsZVNlc3Npb25zLnNpemUoKSA+IDApIHsKKwkgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG1vZGlmeUF2YWlsYWJsZVNlc3Npb25Gb3JQYXRoKGZpbGUpOworCSAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZTZXNzaW9ucyA8IG1heF9zZXNzaW9ucykgeworCSAgICAgICAgICAgICAgICBzZXNzaW9uID0gY3JlYXRlTmV3U2Vzc2lvbkZvclBhdGgoZmlsZSk7CisJICAgICAgICAgICAgICAgIGluY3JlbWVudFNlc3Npb25zKCk7CisJICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ3Jhd2xlckV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBuZXcgc2Vzc2lvbiA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQcm90b2NvbCBjcmVhdGVOZXdTZXNzaW9uRm9yUGF0aChSZW1vdGVTaXRlRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJvdG9jb2xIYW5kbGVyLmdldEFwcHJvcHJpYXRlUHJvdG9jb2woZmlsZSwgLyogcmV1c2UgKi9mYWxzZSwgLyogbmF2aWdhdGUgKi8KKyAgICAgICAgdHJ1ZSk7CisgICAgfQorCisgICAgUHJvdG9jb2wgbW9kaWZ5QXZhaWxhYmxlU2Vzc2lvbkZvclBhdGgoUmVtb3RlU2l0ZUZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFByb3RvY29sIHNlc3Npb24gPSBnZXRBdmFpbGFibGVTZXNzaW9uKCk7CisgICAgICAgIGlmICghZmlsZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0SG9zdCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICBmaWxlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRIb3N0KCkpCisgICAgICAgICAgICAgICAgfHwgIXByb3RvY29sSGFuZGxlci5pc1Byb3RvY29sQ29ubmVjdGVkKHNlc3Npb24pKSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZGlzY29ubmVjdChzZXNzaW9uKTsKKyAgICAgICAgICAgIHNlc3Npb24gPSBwcm90b2NvbEhhbmRsZXIuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbChmaWxlLCAvKiByZXVzZSAqLworICAgICAgICAgICAgZmFsc2UsIC8qIG5hdmlnYXRlICovdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyKCkpCisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5jZChzZXNzaW9uLCBmaWxlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5jZChzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVtb3RlU2l0ZUZpbGUoZmlsZS5nZXRQYXJlbnQoKSwgZmlsZS5nZXRTaXRlKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZGlzY29ubmVjdChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlc3Npb24gPSBwcm90b2NvbEhhbmRsZXIuZ2V0QXBwcm9wcmlhdGVQcm90b2NvbChmaWxlLCAvKiByZXVzZSAqLworICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBuYXZpZ2F0ZSAqL3RydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYSBzZXNzaW9uIGluIHRoZSBhdmFpbGFibGUgc2Vzc2lvbiBsaXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbgorICAgICAqICAgICAgICAgICAgVGhlIFByb3RvY29sIHNlc3Npb24gdG8gYmUgYWRkZWQgdG8gdGhlIGF2YWlsYWJsZSBsaXN0CisgICAgICovCisgICAgc3luY2hyb25pemVkIHZvaWQgYWRkQXZhaWxhYmxlU2Vzc2lvbihQcm90b2NvbCBzZXNzaW9uKSB7CisgICAgICAgIGF2YWxpYWJsZVNlc3Npb25zLmFkZChzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgc2Vzc2lvbiBmcm9tIHRoZSBhdmFpbGFibGUgbGlzdCBhbmQgcmV0dXJucyBpdAorICAgICAqCisgICAgICogQHJldHVybiBBbiBhdmFpbGFibGUgZG93bmxvYWRpbmcgUHJvdG9jb2wgc2Vzc2lvbgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBQcm90b2NvbCBnZXRBdmFpbGFibGVTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gYXZhbGlhYmxlU2Vzc2lvbnMucmVtb3ZlKDApOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtYmVyT2ZVc2VkU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBudW1iZXJPZlNlc3Npb25zIC0gYXZhbGlhYmxlU2Vzc2lvbnMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGRvd25sb2FkaW5nIHNlc3Npb24gd2l0aCB0aGUgdGhyZWFkcG9vbGV4ZWN1dG9yIHRvIGJlZ2luCisgICAgICogZG93bmxvYWRpbmcgdGhlIHNwZWNpZmllZCBQcm90b2NvbEZpbGUgdG8gdGhlIGxvY2FsIEZpbGUgbG9jYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uCisgICAgICogICAgICAgICAgICBUaGUgZG93bmxvYWRpbmcgUHJvdG9jb2wgc2Vzc2lvbiB0byBiZSB1c2VkIHRvIGRvd25sb2FkIHRoZQorICAgICAqICAgICAgICAgICAgUHJvdG9jb2xGaWxlCisgICAgICogQHBhcmFtIHByb3RvY29sRmlsZQorICAgICAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZAorICAgICAqIEBwYXJhbSBuZXdGaWxlCisgICAgICogICAgICAgICAgICBUaGUgbG9jYXRpb24gd2hpY2ggdGhlIGRvd25sb2FkZWQgZmlsZSB3aWxsIGJlIHN0b3JlZAorICAgICAqLworICAgIHZvaWQgYWRkU2Vzc2lvblRvVGhyZWFkUG9vbChmaW5hbCBQcm90b2NvbCBzZXNzaW9uLAorICAgICAgICAgICAgZmluYWwgUmVtb3RlRmlsZSByZW1vdGVGaWxlLCBmaW5hbCBGaWxlIG5ld0ZpbGUpIHsKKyAgICAgICAgdGhpcy5hZGRUb0Rvd25sb2FkaW5nTGlzdChyZW1vdGVGaWxlLmdldFByb3RvY29sRmlsZSgpKTsKKyAgICAgICAgdGhyZWFkQ29udHJvbGxlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludCByZXRyaWVzID0gMDsKKyAgICAgICAgICAgICAgICBQcm90b2NvbCBjdXJTZXNzaW9uID0gc2Vzc2lvbjsKKworICAgICAgICAgICAgICAgIGlmIChGaWxlUmV0cmlldmFsU3lzdGVtLnRoaXMuZExpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIEZpbGVSZXRyaWV2YWxTeXN0ZW0udGhpcy5kTGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG93bmxvYWRTdGFydGVkKHJlbW90ZUZpbGUuZ2V0UHJvdG9jb2xGaWxlKCkpOworCisgICAgICAgICAgICAgICAgLy8gdHJ5IHVudGlsIHN1Y2Nlc3NmdWwgb3IgYWxsIHJldHJpZXMgaGF2ZSBiZWVuIHVzZWQKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aHJlYWQgdHJhY2tlciBpcyB0byBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVzZVRyYWNrZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0RXZhbC5zdGFydFRyYWNraW5nRG93bmxvYWRSdW50aW1lRm9yRmlsZShuZXdGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZG93bmxvYWQoY3VyU2Vzc2lvbiwgcmVtb3RlRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3RvY29sRmlsZSgpLCBuZXdGaWxlLCByZW1vdGVGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZUZpbGUuREVMRVRFX0FGVEVSX0RPV05MT0FEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygidHJ1ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdEV2YWwuZmlsZURvd25sb2FkQ29tcGxldGUobmV3RmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvcmVQb29sU2l6ZShtYXhfc2Vzc2lvbnMgPSBkdEV2YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlY29tbWVuZGVkVGhyZWFkQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQ29udHJvbGxlci5zZXRNYXhpbXVtUG9vbFNpemUobWF4X3Nlc3Npb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdGF0aWMgbnVtYmVyIG9mIHRocmVhZHMgYXJlIHRvIGJlIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLmRvd25sb2FkKGN1clNlc3Npb24sIHJlbW90ZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKSwgbmV3RmlsZSwgcmVtb3RlRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVGaWxlLkRFTEVURV9BRlRFUl9ET1dOTE9BRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoInRydWUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGVSZXRyaWV2YWxTeXN0ZW0udGhpcy5kTGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUmV0cmlldmFsU3lzdGVtLnRoaXMuZExpc3RlbmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG93bmxvYWRGaW5pc2hlZChyZW1vdGVGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGUuYWRkTWV0YWRhdGEoUmVtb3RlRmlsZS5GSUxFX1NJWkUsIG5ld0ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY3JlYXRlIHRoZSBtZXRhZGF0YSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldFdyaXRlTWV0RmlsZSgpKSB7CisJICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAJTE9HLmxvZyhMZXZlbC5JTkZPLCAiV3JpdGluZyBtZXRhZGF0YSBmaWxlIGZvciAnIiArIG5ld0ZpbGUgKyAiJyIpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlLmFkZE1ldGFkYXRhKFJlbW90ZUZpbGUuRklMRV9TSVpFLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZpbGUubGVuZ3RoKCkgKyAiIik7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGUud3JpdGVUb1Byb3BFcVZhbEZpbGUobmV3RmlsZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4iICsgY29uZmlnLmdldE1ldEZpbGVFeHRlbnNpb24oKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0TGlzdE9mTWV0YWRhdGFUb091dHB1dCgpKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhZGF0YSBmaWxlIGZvciAiCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZUZpbGUuZ2V0UHJvdG9jb2xGaWxlKCkpOworCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0cmFja2VyIGlzIGJlaW5nIHVzZWQgY2FuY2VsIHRyYWNraW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVzZVRyYWNrZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdEV2YWwuY2FuY2VsUnVudGltZVRyYWNraW5nKG5ld0ZpbGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgYW55IGNyZWF0ZWQgZmlsZSBmcm9tIHN0YWdpbmcgYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWcuZ2V0TWV0RmlsZUV4dGVuc2lvbigpKS5kZWxldGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYSByZXRyeSBpcyBzdGlsbCBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytyZXRyaWVzID4gTUFYX1JFVFJJRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUmV0cmlldmFsU3lzdGVtLnRoaXMuZmFpbGVkRG93bmxvYWRMaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHJlbW90ZUZpbGUuZ2V0UHJvdG9jb2xGaWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGRvd25sb2FkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlRmlsZS5nZXRQcm90b2NvbEZpbGUoKSArICIgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZVJldHJpZXZhbFN5c3RlbS50aGlzLmRMaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUmV0cmlldmFsU3lzdGVtLnRoaXMuZExpc3RlbmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvd25sb2FkRmFpbGVkKHJlbW90ZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKSwgZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZpbGVSZXRyaWV2YWxTeXN0ZW0udGhpcy5mYWlsZWREb3dubG9hZExpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSA8IG1heF9hbGxvd2VkX2ZhaWxlZF9kb3dubG9hZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGN1cnJlbnQgc2Vzc2lvbiBhbmQgcmVjcmVhdGUgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIHRvIHRyeSB0byBkb3dubG9hZCBmaWxlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJSZXRyeWluZyB0byBkb3dubG9hZCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlRmlsZS5nZXRQcm90b2NvbEZpbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgZG93bmxvYWQgZmFpbGVkIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLmRpc2Nvbm5lY3QoY3VyU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJTZXNzaW9uID0gcHJvdG9jb2xIYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFwcHJvcHJpYXRlUHJvdG9jb2wocmVtb3RlRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3RvY29sRmlsZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlY29ubmVjdCBwcm90b2NvbCB0byByZXRyeSBkb3dubG9hZCBvZiBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlRmlsZS5nZXRQcm90b2NvbEZpbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0tIGFib3J0aW5nIHJldHJ5IDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcm1pbmF0aW5nIGRvd25sb2FkIHRyaWVzIGZvciBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkbyB0byB0b28gbWFueSBwcmV2aW91cyBkb3dubG9hZCBmYWlsdXJlcyA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZVJldHJpZXZhbFN5c3RlbS50aGlzLmRMaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUmV0cmlldmFsU3lzdGVtLnRoaXMuZExpc3RlbmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvd25sb2FkRmFpbGVkKHJlbW90ZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKSwgZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFzdWNjZXNzZnVsKTsKKworICAgICAgICAgICAgICAgIEZpbGVSZXRyaWV2YWxTeXN0ZW0udGhpcy5yZW1vdmVGcm9tRG93bmxvYWRpbmdMaXN0KHJlbW90ZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEZpbGUoKSk7CisgICAgICAgICAgICAgICAgZGV0ZXJtaW5lU2Vzc2lvbkZhdGUoY3VyU2Vzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkVG9Eb3dubG9hZGluZ0xpc3QoUHJvdG9jb2xGaWxlIHBGaWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RG93bmxvYWRpbmcuYWRkKHBGaWxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUZyb21Eb3dubG9hZGluZ0xpc3QoUHJvdG9jb2xGaWxlIHBGaWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RG93bmxvYWRpbmcucmVtb3ZlKHBGaWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEb3dubG9hZGluZyhQcm90b2NvbEZpbGUgcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudGx5RG93bmxvYWRpbmcuY29udGFpbnMocEZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlua2VkTGlzdDxQcm90b2NvbEZpbGU+IGdldEN1cnJlbnRseURvd25sb2FkaW5nRmlsZXMoKSB7CisgICAgICAgIExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPigpOworICAgICAgICBsaXN0LmFkZEFsbCh0aGlzLmN1cnJlbnRseURvd25sb2FkaW5nKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHVibGljIExpbmtlZExpc3Q8UHJvdG9jb2xGaWxlPiBnZXRMaXN0T2ZGYWlsZWREb3dubG9hZHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZhaWxlZERvd25sb2FkTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckZhaWxlZERvd25sb2Fkc0xpc3QoKSB7CisgICAgICAgIHRoaXMuZmFpbGVkRG93bmxvYWRMaXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgZGV0ZXJtaW5lU2Vzc2lvbkZhdGUoUHJvdG9jb2wgc2Vzc2lvbikgeworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0aHJlYWQgc2hvdWxkIGJlIGtlZXAgb3Igc2hvdWxkIGJlIHRocm93biBhd2F5CisgICAgICAgIGlmIChudW1iZXJPZlNlc3Npb25zIDw9IG1heF9zZXNzaW9ucykgeworICAgICAgICAgICAgZ2l2ZUJhY2tTZXNzaW9uKHNlc3Npb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlzcG9zZU9mU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZ2l2ZUJhY2tTZXNzaW9uKFByb3RvY29sIHNlc3Npb24pIHsKKyAgICAgICAgYWRkQXZhaWxhYmxlU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgd2FrZVVwTWFpblRocmVhZCgpOworICAgIH0KKworICAgIHZvaWQgZGlzcG9zZU9mU2Vzc2lvbihQcm90b2NvbCBzZXNzaW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZGlzY29ubmVjdChzZXNzaW9uKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGxvZyBmYWlsdXJlCisgICAgICAgIH0KKyAgICAgICAgbnVtYmVyT2ZTZXNzaW9ucy0tOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRocmVhZHBvb2wKKyAgICAgICAgICAgIHRocmVhZENvbnRyb2xsZXIuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIC8vIGdpdmUgYSBtYXggb2YgMTAgbWludXRlcyB0byBmaW5pc2ggZG93bmxvYWRpbmcgYW55IGZpbGVzCisgICAgICAgICAgICB0aHJlYWRDb250cm9sbGVyLmF3YWl0VGVybWluYXRpb24oNjAwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGxvZyBmYWlsdXJlCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5yZXNldFZhcmlhYmxlcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xvc2VTZXNzaW9ucygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbG9nIGZhaWx1cmUhISEKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGxvZyBmYWlsdXJlISEhCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3RzIGFsbCBkb3dubG9hZGluZyBQcm90b2NvbCBzZXNzaW9ucyBpbiB0aGUgYXZhaWFibGVTZXNzaW9ucworICAgICAqIGxpc3QuIFRoZSBUaHJlYWRQb29sRXhlY3V0b3IgbmVlZHMgdG8gYmUgY29tcGxldGVseSBzaHV0ZG93biBiZWZvcmUgdGhpcworICAgICAqIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLiBPdGhlcndpc2Ugc29tZSBQcm90b2NvbHMgbWlnaHQgbm90IGJlCisgICAgICogZGlzY29ubmVjdGVkIG9yIGxlZnQgZG93bmxvYWRpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2xvc2VTZXNzaW9ucygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChQcm90b2NvbCBzZXNzaW9uIDogYXZhbGlhYmxlU2Vzc2lvbnMpIHsKKyAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5kaXNjb25uZWN0KHNlc3Npb24pOworICAgICAgICB9CisgICAgICAgIC8vIHNlc3Npb25zLmNsZWFyKCk7CisgICAgICAgIGF2YWxpYWJsZVNlc3Npb25zLmNsZWFyKCk7CisgICAgICAgIG51bWJlck9mU2Vzc2lvbnMgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vUmVtb3RlRmlsZS5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL1JlbW90ZUZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ3YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL1JlbW90ZUZpbGUuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnByb3RvY29sLlJlbW90ZVNpdGVGaWxlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlRmlsZSBpbXBsZW1lbnRzIFJlbW90ZUZpbGVNZXRLZXlzIHsKKworICAgIHByaXZhdGUgTWV0YWRhdGEgbWV0YWRhdGE7CisKKyAgICBwcml2YXRlIFJlbW90ZVNpdGVGaWxlIHBGaWxlOworCisgICAgcHVibGljIFJlbW90ZUZpbGUoUmVtb3RlU2l0ZUZpbGUgcEZpbGUpIHsKKyAgICAgICAgdGhpcy5wRmlsZSA9IHBGaWxlOworICAgICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIHRoaXMubWV0YWRhdGEuYWRkTWV0YWRhdGEoUkVUUklFVkVEX0ZST01fTE9DLCBwRmlsZS5nZXRQYXRoKCkpOworICAgICAgICB0aGlzLm1ldGFkYXRhLmFkZE1ldGFkYXRhKEZJTEVOQU1FLCBwRmlsZS5nZXROYW1lKCkpOworICAgICAgICB0aGlzLm1ldGFkYXRhLmFkZE1ldGFkYXRhKERBVEFfUFJPVklERVIsIHBGaWxlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRIb3N0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU1ldGFkYXRhRWxlbWVudChTdHJpbmcgdW5pcXVlTWV0YWRhdGFFbGVtZW50KSB7CisgICAgICAgIHRoaXMubWV0YWRhdGEuYWRkTWV0YWRhdGEoUFJPRFVDVF9OQU1FLCB0aGlzCisgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKHVuaXF1ZU1ldGFkYXRhRWxlbWVudCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm1ldGFkYXRhLmFkZE1ldGFkYXRhKGtleSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKE1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIHRoaXMubWV0YWRhdGEuYWRkTWV0YWRhdGEobWV0YWRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YWRhdGEoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5nZXRNZXRhZGF0YShrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRBbGxNZXRhZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGE7CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVNpdGVGaWxlIGdldFByb3RvY29sRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucEZpbGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1Byb3BFcVZhbEZpbGUoU3RyaW5nIGZpbGVQYXRoLAorICAgICAgICAgICAgU3RyaW5nW10gbWV0YWRhdGFUb1dyaXRlT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2VyaWFsaXphYmxlTWV0YWRhdGEgc01ldGFkYXRhID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKCJVVEYtOCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG1ldGFkYXRhS2V5IDogbWV0YWRhdGFUb1dyaXRlT3V0KQorICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLmdldE1ldGFkYXRhKG1ldGFkYXRhS2V5KSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdGhpcy5tZXRhZGF0YS5nZXRNZXRhZGF0YShtZXRhZGF0YUtleSkuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICAgICAgc01ldGFkYXRhLmFkZE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0aGlzLm1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKG1ldGFkYXRhS2V5KSk7CisgICAgICAgICAgICBzTWV0YWRhdGEud3JpdGVNZXRhZGF0YVRvWG1sU3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVQYXRoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byB3cml0ZSBtZXRhZGF0YSBmaWxlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgdGhpcy5wRmlsZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vUmVtb3RlRmlsZU1ldEtleXMuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9SZW1vdGVGaWxlTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzEwN2QKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9yZXRyaWV2YWxzeXN0ZW0vUmVtb3RlRmlsZU1ldEtleXMuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBNZXQga2V5cyBuZWVkZWQgYnkgdGhlIHtAbGluayBSZW1vdGVGaWxlfQorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBSZW1vdGVGaWxlTWV0S2V5cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX05BTUUgPSAiUHJvZHVjdE5hbWUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUUklFVkVEX0ZST01fTE9DID0gIlJldHJpZXZlZEZyb21Mb2MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSAiRmlsZW5hbWUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QUk9WSURFUiA9ICJEYXRhUHJvdmlkZXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TSVpFID0gIkZpbGVTaXplIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNSU5HX1NUUklORyA9ICJSZW5hbWluZ1N0cmluZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9UT19ESVIgPSAiRG93bmxvYWRUb0RpciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1RZUEUgPSAiUHJvZHVjdFR5cGUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFID0gIk1pbWVUeXBlIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFID0gIlN1cGVyVHlwZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQUZURVJfRE9XTkxPQUQgPSAiRGVsZXRlQWZ0ZXJEb3dubG9hZCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9OQU1FX0dFTkVSQVRPUiA9ICJQcm9kdWN0TmFtZUdlbmVyYXRvciI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JUVVFX0VMRU1FTlQgPSAiVW5pcXVlRWxlbWVudCI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9SZXRyaWV2YWxTZXR1cC5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL1JldHJpZXZhbFNldHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1OTUwNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9SZXRyaWV2YWxTZXR1cC5qYXZhCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwucmV0cmlldmFsc3lzdGVtOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLkRhdGFGaWxlc0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuU2l0ZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jb25maWcuUHJvcEZpbGVzSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5Qcm90b2NvbEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5leGNlcHRpb25zLlBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUmV0cmlldmFsTWV0aG9kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5vYmplY3RmYWN0b3J5LlB1c2hQdWxsT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnJldHJpZXZhbG1ldGhvZC5SZXRyaWV2YWxNZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW0uRmlsZVJldHJpZXZhbFN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5leGVjLkV4ZWNVdGlsczsKKworLyoqCisgKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBSZXRyaWV2YWxTZXR1cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZyBjb25maWc7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hTZXQ8RmlsZT4gYWxyZWFkeVByb2Nlc3NlZFByb3BGaWxlczsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxDbGFzczxSZXRyaWV2YWxNZXRob2Q+LCBSZXRyaWV2YWxNZXRob2Q+IGNsYXNzVG9SbU1hcDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBkb3dubG9hZGluZ1Byb3BzOworCisgICAgcHJpdmF0ZSBmaW5hbCBTaXRlSW5mbyBzaXRlSW5mbzsKKworICAgIHByaXZhdGUgZmluYWwgRGF0YUZpbGVUb1Byb3BGaWxlTGlua2VyIGxpbmtlcjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJldHJpZXZhbFNldHVwLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBSZXRyaWV2YWxTZXR1cChDb25maWcgY29uZmlnLCBTaXRlSW5mbyBzaXRlSW5mbykgeworICAgICAgICB0aGlzLmRvd25sb2FkaW5nUHJvcHMgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgIHRoaXMuc2l0ZUluZm8gPSBzaXRlSW5mbzsKKyAgICAgICAgYWxyZWFkeVByb2Nlc3NlZFByb3BGaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KCk7CisgICAgICAgIGNsYXNzVG9SbU1hcCA9IG5ldyBIYXNoTWFwPENsYXNzPFJldHJpZXZhbE1ldGhvZD4sIFJldHJpZXZhbE1ldGhvZD4oKTsKKyAgICAgICAgbGlua2VyID0gbmV3IERhdGFGaWxlVG9Qcm9wRmlsZUxpbmtlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlRmlsZXMoUHJvcEZpbGVzSW5mbyBwZmksIGZpbmFsIERhdGFGaWxlc0luZm8gZGZpKQorICAgICAgICAgICAgdGhyb3dzIFJldHJpZXZhbE1ldGhvZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZVJldHJpZXZhbFN5c3RlbSBkYXRhRmlsZXNGUlMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5zdGFydFByb3BGaWxlRG93bmxvYWQocGZpKTsKKworICAgICAgICAgICAgKGRhdGFGaWxlc0ZSUyA9IG5ldyBGaWxlUmV0cmlldmFsU3lzdGVtKGNvbmZpZywgc2l0ZUluZm8pKQorICAgICAgICAgICAgICAgICAgICAuaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgZGF0YUZpbGVzRlJTLnJlZ2lzdGVyRG93bmxvYWRMaXN0ZW5lcihsaW5rZXIpOworCisgICAgICAgICAgICBGaWxlW10gcHJvcEZpbGVzID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICgocHJvcEZpbGVzID0gZ2V0Q3VycmVudGx5RG93bmxvYWRlZFByb3BGaWxlcyhwZmkpKS5sZW5ndGggPiAwCisgICAgICAgICAgICAgICAgICAgIHx8IGRvd25sb2FkaW5nUHJvcHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEZpbGUgcHJvcEZpbGUgOiBwcm9wRmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlciBwYXJzZXIgPSBwZmkuZ2V0UGFyc2VyRm9yRmlsZShwcm9wRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczxSZXRyaWV2YWxNZXRob2Q+IHJtQ2xhc3MgPSBjb25maWcuZ2V0UGFyc2VySW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXRyaWV2YWxNZXRob2QocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHJpZXZhbE1ldGhvZCBybSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJtID0gdGhpcy5jbGFzc1RvUm1NYXAuZ2V0KHJtQ2xhc3MpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQ3JlYXRpbmcgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm1DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgdG8gZG93bmxvYWQgZGF0YSBmaWxlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtID0gUHVzaFB1bGxPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlTmV3SW5zdGFuY2Uocm1DbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc1RvUm1NYXAucHV0KHJtQ2xhc3MsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJtLnByb2Nlc3NQcm9wRmlsZShkYXRhRmlsZXNGUlMsIHBhcnNlciwgcHJvcEZpbGUsIGRmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIHBhcnNlIHByb3BlcnR5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BGaWxlICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZXIubWFya0FzRmFpbGVkKHByb3BGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3BlcnR5IGZpbGUgIiArIHByb3BGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmlzaCBkb3dubG9hZGluZyBwZXIgcHJvcGVydHkgZmlsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyLm1hcmtBc0ZhaWxlZChwcm9wRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGRvd25sb2FkaW5nIHBlciBwcm9wZXJ0eSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGFGaWxlc0ZSUy53YWl0VW50aWxBbGxDdXJyZW50RG93bmxvYWRzQXJlQ29tcGxldGUoKTsKKworICAgICAgICAgICAgICAgIGZvciAoRmlsZSBwcm9wRmlsZSA6IHByb3BGaWxlcykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBmaS5nZXRMb2NhbERpcigpLmVxdWFscyhwZmkuZ2V0T25TdWNjZXNzRGlyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBmaS5nZXRMb2NhbERpcigpLmVxdWFscyhwZmkuZ2V0T25GYWlsRGlyKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcm9jZXNzZWRQcm9wRmlsZXMuYWRkKHByb3BGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVByb3BzRmlsZVRvRmluYWxEZXN0aW5hdGlvbihwZmksIHByb3BGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZXIuZ2V0RXJyb3JzQW5kRXJhc2VMaW5rcyhwcm9wRmlsZSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyBlcnJvcnMgdG8gZXJyb3IgZGlyIGZvciBmaWxlICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wRmlsZSArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChkYXRhRmlsZXNGUlMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYXRhRmlsZXNGUlMuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIGFscmVhZHlQcm9jZXNzZWRQcm9wRmlsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGxpbmtlci5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UHJvcEZpbGVEb3dubG9hZChmaW5hbCBQcm9wRmlsZXNJbmZvIHBmaSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwZmkubmVlZHNUb0JlRG93bmxvYWRlZCgpKSB7CisgICAgICAgICAgICB0aGlzLmRvd25sb2FkaW5nUHJvcHMgPSB0cnVlOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVJldHJpZXZhbFN5c3RlbSBmcnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgKGZycyA9IG5ldyBGaWxlUmV0cmlldmFsU3lzdGVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRyaWV2YWxTZXR1cC50aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BGaWxlc0NvbmZpZyhjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm90b2NvbEluZm8oKSksIHNpdGVJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYWxpemUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTGlua2VkTGlzdDxGaWxlPiBwcm9wRGlyU3RydWN0RmlsZXMgPSBwZmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvd25sb2FkSW5mb1Byb3BGaWxlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGaWxlIGRpclN0cnVjdEZpbGUgOiBwcm9wRGlyU3RydWN0RmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXIgcGFyc2VyID0gcGZpLmdldFBhcnNlckZvckZpbGUoZGlyU3RydWN0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8UmV0cmlldmFsTWV0aG9kPiBybUNsYXNzID0gY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyc2VySW5mbygpLmdldFJldHJpZXZhbE1ldGhvZChwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHJpZXZhbE1ldGhvZCBybSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChybSA9IFJldHJpZXZhbFNldHVwLnRoaXMuY2xhc3NUb1JtTWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHJtQ2xhc3MpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNyZWF0aW5nICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBybUNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgdG8gZG93bmxvYWQgcHJvcGVydHkgZmlsZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm0gPSBQdXNoUHVsbE9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlTmV3SW5zdGFuY2Uocm1DbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHJpZXZhbFNldHVwLnRoaXMuY2xhc3NUb1JtTWFwLnB1dChybUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm0ucHJvY2Vzc1Byb3BGaWxlKGZycywgcGFyc2VyLCBkaXJTdHJ1Y3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFGaWxlc0luZm8obnVsbCwgcGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb3dubG9hZEluZm8oKSksIGxpbmtlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZycyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZycy5zaHV0ZG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0cmlldmFsU2V0dXAudGhpcy5kb3dubG9hZGluZ1Byb3BzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIGdpdmUgcHJvcGVydHkgZmlsZSBkb3dubG9hZCBhIDUgc2VjIGhlYWQgc3RhcnQKKyAgICAgICAgICAgIExPRworICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhaXRpbmcgZGF0YSBkb3dubG9hZCB0aHJlYWQgZm9yIDUgc2VjcyB0byBnaXZlIHRoZSBwcm9wZXJ0eSBmaWxlcyBkb3dubG9hZCB0aHJlYWQgYSBoZWFkIHN0YXJ0Iik7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXQoNTAwMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGVbXSBnZXRDdXJyZW50bHlEb3dubG9hZGVkUHJvcEZpbGVzKGZpbmFsIFByb3BGaWxlc0luZm8gcGZpKSB7CisgICAgICAgIEZpbGVbXSBmaWxlcyA9IHBmaS5nZXRMb2NhbERpcigpLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGZpLmdldFBhcnNlckZvckZpbGUocGF0aG5hbWUpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEocGF0aG5hbWUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIkRvd25sb2FkaW5nXyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRyaWV2YWxTZXR1cC50aGlzLmNvbmZpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldEZpbGVFeHRlbnNpb24oKSkgfHwgYWxyZWFkeVByb2Nlc3NlZFByb3BGaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMocGF0aG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBmaWxlcyA9PSBudWxsID8gbmV3IEZpbGVbMF0gOiBmaWxlczsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbmZpZyBjcmVhdGVQcm9wRmlsZXNDb25maWcoUHJvdG9jb2xJbmZvIHBpKSB7CisgICAgICAgIENvbmZpZyBwcm9wQ29uZmlnID0gdGhpcy5jb25maWcuY2xvbmUoKTsKKyAgICAgICAgUHJvdG9jb2xJbmZvIHByb3BQSSA9IHBpLmNsb25lKCk7CisgICAgICAgIHByb3BQSS5zZXRQYWdlU2l6ZSgtMSk7CisgICAgICAgIHByb3BDb25maWcuc2V0UHJvdG9jb2xJbmZvKHByb3BQSSk7CisgICAgICAgIHByb3BDb25maWcuc2V0VXNlVHJhY2tlcihmYWxzZSk7CisgICAgICAgIHByb3BDb25maWcuc2V0SW5nZXN0ZXIobnVsbCk7CisgICAgICAgIHByb3BDb25maWcuc2V0T25seURvd25sb2FkRGVmaW5lZFR5cGVzKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHByb3BDb25maWc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1vdmVQcm9wc0ZpbGVUb0ZpbmFsRGVzdGluYXRpb24oUHJvcEZpbGVzSW5mbyBwZmksCisgICAgICAgICAgICBGaWxlIGRpcnN0cnVjdEZpbGUsIFN0cmluZyBlcnJvck1zZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgbWV0RmlsZSA9IG5ldyBGaWxlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMuJXMiLCBkaXJzdHJ1Y3RGaWxlLmdldEFic29sdXRlUGF0aCgpLCBjb25maWcuZ2V0TWV0RmlsZUV4dGVuc2lvbigpKSk7CisgICAgICAgIGlmIChwZmkuZ2V0RGVsZXRlT25TdWNjZXNzKCkgJiYgZXJyb3JNc2dzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRpcnN0cnVjdEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICBtZXRGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEZpbGUgbW92ZVRvRGlyID0gcGZpLmdldEZpbmFsRGVzdGluYXRpb24oZXJyb3JNc2dzID09IG51bGwpOworICAgICAgICBtb3ZlVG9EaXIubWtkaXJzKCk7CisgICAgICAgIEZpbGUgbmV3TG9jID0gbmV3IEZpbGUobW92ZVRvRGlyLCBkaXJzdHJ1Y3RGaWxlLmdldE5hbWUoKSk7CisgICAgICAgIGRpcnN0cnVjdEZpbGUucmVuYW1lVG8obmV3TG9jKTsKKyAgICAgICAgbWV0RmlsZS5yZW5hbWVUbyhuZXcgRmlsZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgbmV3TG9jLmdldEFic29sdXRlUGF0aCgpLCBjb25maWcuZ2V0TWV0RmlsZUV4dGVuc2lvbigpKSkpOworICAgICAgICBpZiAoZXJyb3JNc2dzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgZXJyb3JGaWxlID0gbmV3IEZpbGUobmV3TG9jLmdldFBhcmVudEZpbGUoKSwgZGlyc3RydWN0RmlsZQorICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIi5lcnJvcnMiKTsKKyAgICAgICAgICAgIGVycm9yRmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGVycm9yRmlsZSkpOworICAgICAgICAgICAgcHMucHJpbnQoZXJyb3JNc2dzKTsKKyAgICAgICAgICAgIHBzLnByaW50bG4oKTsKKyAgICAgICAgICAgIHBzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9UaW1lQW5kVGhyZWFkQ291bnQuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3JldHJpZXZhbHN5c3RlbS9UaW1lQW5kVGhyZWFkQ291bnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGYzOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvcmV0cmlldmFsc3lzdGVtL1RpbWVBbmRUaHJlYWRDb3VudC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxzeXN0ZW07CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGltZUFuZFRocmVhZENvdW50IHsKKworICAgIHByaXZhdGUgbG9uZyBzdGFydFRpbWVJbk1pbGxpczsKKworICAgIHByaXZhdGUgaW50IHRocmVhZENvdW50OworCisgICAgcHVibGljIFRpbWVBbmRUaHJlYWRDb3VudChsb25nIHN0YXJ0VGltZUluTWlsbGlzLCBpbnQgdGhyZWFkQ291bnQpIHsKKyAgICAgICAgdGhpcy5zdGFydFRpbWVJbk1pbGxpcyA9IHN0YXJ0VGltZUluTWlsbGlzOworICAgICAgICB0aGlzLnRocmVhZENvdW50ID0gdGhyZWFkQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lSW5NaWxsaXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VGltZUluTWlsbGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGhyZWFkQ291bnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRocmVhZENvdW50OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvdXJsL2hhbmRsZXJzL2ltYXBzL0hhbmRsZXIuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3VybC9oYW5kbGVycy9pbWFwcy9IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlZDhjMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3VybC9oYW5kbGVycy9pbWFwcy9IYW5kbGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnVybC5oYW5kbGVycy5pbWFwczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBIYW5kbGVyIGV4dGVuZHMgVVJMU3RyZWFtSGFuZGxlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEltYXBzVVJMQ29ubmVjdGlvbih1cmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvdXJsL2hhbmRsZXJzL2ltYXBzL0ltYXBzVVJMQ29ubmVjdGlvbi5qYXZhIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvdXJsL2hhbmRsZXJzL2ltYXBzL0ltYXBzVVJMQ29ubmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWQ3OTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC91cmwvaGFuZGxlcnMvaW1hcHMvSW1hcHNVUkxDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnVybC5oYW5kbGVycy5pbWFwczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBJbWFwc1VSTENvbm5lY3Rpb24gZXh0ZW5kcyBVUkxDb25uZWN0aW9uIHsKKworICAgIHByb3RlY3RlZCBJbWFwc1VSTENvbm5lY3Rpb24oVVJMIHVybCkgeworICAgICAgICBzdXBlcih1cmwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC91cmwvaGFuZGxlcnMvc2Z0cC9IYW5kbGVyLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC91cmwvaGFuZGxlcnMvc2Z0cC9IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwYTAzMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3VybC9oYW5kbGVycy9zZnRwL0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwudXJsLmhhbmRsZXJzLnNmdHA7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5EZXNjcmliZSB5b3VyIGNsYXNzIGhlcmU8L3A+LgorICovCitwdWJsaWMgY2xhc3MgSGFuZGxlciBleHRlbmRzIFVSTFN0cmVhbUhhbmRsZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZnRwVVJMQ29ubmVjdGlvbih1cmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvdXJsL2hhbmRsZXJzL3NmdHAvU2Z0cFVSTENvbm5lY3Rpb24uamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3VybC9oYW5kbGVycy9zZnRwL1NmdHBVUkxDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2M2NkYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3B1c2hwdWxsL3VybC9oYW5kbGVycy9zZnRwL1NmdHBVUkxDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLnVybC5oYW5kbGVycy5zZnRwOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkRlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBTZnRwVVJMQ29ubmVjdGlvbiBleHRlbmRzIFVSTENvbm5lY3Rpb24geworCisgICAgcHJvdGVjdGVkIFNmdHBVUkxDb25uZWN0aW9uKFVSTCB1cmwpIHsKKyAgICAgICAgc3VwZXIodXJsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZG8gbm90aGluZyEhIQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvdXRpbC9FeHByZXNzaW9uVmFsaWRhdG9yLmphdmEgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC91dGlsL0V4cHJlc3Npb25WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNmNDlmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvdXRpbC9FeHByZXNzaW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC51dGlsOworCisvL0FXVCBJbXBvcnRzCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CisKKy8vU3dpbmcgSW1wb3J0cworaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRm9ybWF0dGVkVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+VXNlIHRvIGV2YWx1YXRlIHdoZXRoZXIgeW91ciByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSAKKyAqIGFjY2VwdGluZyB0aGUgY29ycmVjdCBzdHJpbmdzCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvblZhbGlkYXRvciBleHRlbmRzIEpQYW5lbCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjg0MDU4OTk0MDMwNDI5ODU0N0w7CisKKwlwcml2YXRlIEpMYWJlbCBleHByTGFiZWw7CisJcHJpdmF0ZSBKTGFiZWwgdmFsaWRhdGVMYWJlbDsKKwlwcml2YXRlIEpMYWJlbCByZXN1bHRMYWJlbDsKKwkKKwlwcml2YXRlIEpGb3JtYXR0ZWRUZXh0RmllbGQgZXhwckZpZWxkOworCXByaXZhdGUgSkZvcm1hdHRlZFRleHRGaWVsZCB2YWxpZGF0ZUZpZWxkOworCXByaXZhdGUgSkZvcm1hdHRlZFRleHRGaWVsZCByZXN1bHRGaWVsZDsKKworCXB1YmxpYyBFeHByZXNzaW9uVmFsaWRhdG9yKCkgeworCQlzdXBlcihuZXcgQm9yZGVyTGF5b3V0KCkpOworCisJCWV4cHJMYWJlbCA9IG5ldyBKTGFiZWwoIlJlZ3VsYXIgRXhwcmVzc2lvbjogIik7CisJCXZhbGlkYXRlTGFiZWwgPSBuZXcgSkxhYmVsKCJWYWxpZGF0ZSBTdHJpbmc6ICIpOworCQlyZXN1bHRMYWJlbCA9IG5ldyBKTGFiZWwoIlJlc3VsdDogIik7CisKKwkJZXhwckZpZWxkID0gbmV3IEpGb3JtYXR0ZWRUZXh0RmllbGQoKTsKKwkJZXhwckZpZWxkLnNldENvbHVtbnMoNjApOworCisJCXZhbGlkYXRlRmllbGQgPSBuZXcgSkZvcm1hdHRlZFRleHRGaWVsZCgpOworCQl2YWxpZGF0ZUZpZWxkLnNldENvbHVtbnMoNjApOworCisJCXJlc3VsdEZpZWxkID0gbmV3IEpGb3JtYXR0ZWRUZXh0RmllbGQoKTsKKwkJcmVzdWx0RmllbGQuc2V0Q29sdW1ucyg2MCk7CisJCXJlc3VsdEZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJcmVzdWx0RmllbGQuc2V0Rm9yZWdyb3VuZChDb2xvci5yZWQpOworCisJCWV4cHJMYWJlbC5zZXRMYWJlbEZvcihleHByRmllbGQpOworCQl2YWxpZGF0ZUxhYmVsLnNldExhYmVsRm9yKHZhbGlkYXRlRmllbGQpOworCQlyZXN1bHRMYWJlbC5zZXRMYWJlbEZvcihyZXN1bHRGaWVsZCk7CisKKwkJSlBhbmVsIGxhYmVsUGFuZSA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOworCQlsYWJlbFBhbmUuYWRkKGV4cHJMYWJlbCk7CisJCWxhYmVsUGFuZS5hZGQodmFsaWRhdGVMYWJlbCk7CisJCWxhYmVsUGFuZS5hZGQocmVzdWx0TGFiZWwpOworCisJCUpQYW5lbCBmaWVsZFBhbmUgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEpKTsKKwkJZmllbGRQYW5lLmFkZChleHByRmllbGQpOworCQlmaWVsZFBhbmUuYWRkKHZhbGlkYXRlRmllbGQpOworCQlmaWVsZFBhbmUuYWRkKHJlc3VsdEZpZWxkKTsKKworCQlKUGFuZWwgYnV0dG9uUGFuZSA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKwkJSkJ1dHRvbiB2YWxpZGF0ZSA9IG5ldyBKQnV0dG9uKCJWYWxpZGF0ZSIpOworCQl2YWxpZGF0ZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQl0cnkgeworCQkJCQlib29sZWFuIHZhbHVlID0gKChTdHJpbmcpIHZhbGlkYXRlRmllbGQuZ2V0VGV4dCgpKS5tYXRjaGVzKChTdHJpbmcpIGV4cHJGaWVsZC5nZXRUZXh0KCkpOworCQkJCQlyZXN1bHRGaWVsZC5zZXRUZXh0KHZhbHVlICsgIiIpOworCQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlidXR0b25QYW5lLmFkZCh2YWxpZGF0ZSwgQm9yZGVyTGF5b3V0LkVBU1QpOworCQkKKwkJc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMjAsIDIwLCAyMCwgMjApKTsKKwkJYWRkKGxhYmVsUGFuZSwgQm9yZGVyTGF5b3V0LldFU1QpOworCQlhZGQoZmllbGRQYW5lLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJYWRkKGJ1dHRvblBhbmUsIEJvcmRlckxheW91dC5FQVNUKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCSAgICBEaW1lbnNpb24gZGltID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKTsKKwkJCQlKRnJhbWUgZnJhbWUgPSBuZXcgSkZyYW1lKCJSZWd1bGFyIEV4cHJlc3Npb24gRXZhbHVhdG9yIik7CisJCQkJZnJhbWUuc2V0U2l6ZShkaW0ud2lkdGggLyAyLCBkaW0uaGVpZ2h0IC8gMik7CisJCQkgICAgZnJhbWUuc2V0TG9jYXRpb24oZGltLndpZHRoIC8gMywgZGltLmhlaWdodCAvIDMpOworCQkJCWZyYW1lLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRVhJVF9PTl9DTE9TRSk7CisJCQkJZnJhbWUuYWRkKG5ldyBFeHByZXNzaW9uVmFsaWRhdG9yKCkpOworCQkJCWZyYW1lLnBhY2soKTsKKwkJCQlmcmFtZS5zZXRWaXNpYmxlKHRydWUpOworCQkJfQorCQl9KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjdkMTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nCkBAIC0wLDAgKzEsMTggQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworWW91IGNhbiByZW1vdmUgdGhpcyBmaWxlLiBJdCB3YXMgb25seSBpbmNsdWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgbG9nIGRpcmVjdG9yeSBmb3IgdGhpcworZGlzdHJpYnV0aW9uIHdhcyBjcmVhdGVkIG9uIGFzc2VtYmx5LgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC5wcm9wZXJ0aWVzIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDY2NGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMtLS0tLS0tLS0tLS0tLS0tLVByb3RvY29sIERlZmF1bHRzLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKKyNjb25maWd1cmF0aW9uIHRvIG1ha2UgamF2YS5uZXQuVVJMIGFjY2VwdCB1bnN1cHBvcnRlZCBwcm90b2NvbHMKK2phdmEucHJvdG9jb2wuaGFuZGxlci5wa2dzPW9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwudXJsLmhhbmRsZXJzCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9kb2N1bWVudGF0aW9uL1B1c2gtUHVsbC1Vc2VyLU1hbnVhbF8yMDA4LTAyLTEyLmRvYyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2RvY3VtZW50YXRpb24vUHVzaC1QdWxsLVVzZXItTWFudWFsXzIwMDgtMDItMTIuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmYjVlMjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9kb2N1bWVudGF0aW9uL1B1c2gtUHVsbC1Vc2VyLU1hbnVhbF8yMDA4LTAyLTEyLmRvYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DbGFzc05vYWFFbWFpbFBhcnNlckZpbGVzL0lhc2lFbWFpbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0NsYXNzTm9hYUVtYWlsUGFyc2VyRmlsZXMvSWFzaUVtYWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNDEzNDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9DbGFzc05vYWFFbWFpbFBhcnNlckZpbGVzL0lhc2lFbWFpbApAQCAtMCwwICsxLDEyOSBAQAorCisKKyAgICAgICAgICAgICBOT0FBICBDT01QUkVIRU5TSVZFIExBUkdFIEFSUkFZLURBVEEgU1RFV0FSRFNISVAgU1lTVEVNCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQSBTRVJWSUNFIE9GOgorICAgICAgICAgICAgICAgICAgIE5PQUEgTkFUSU9OQUwgREFUQSBDRU5URVJTCisKKworVGhlIENMQVNTIGhhcyBwcm9jZXNzZWQgeW91ciBvcmRlciBudW1iZXIgQTEwNDA2NjMuICBUaGUgdG90YWwgc2l6ZSBvZiAKK3RoaXMgb3JkZXIgaXMgMTI0NjAwMjYxOCBieXRlcy4KKworCitJdGVtcyBhcmUgYXZhaWxhYmxlIGZvciB5b3UgaW4gdGhlIGFub255bW91cyBGVFAgYXJlYS4gCitZb3UgbWF5IG9idGFpbiB0aGVtIGFzIGZvbGxvd3M6CisKKyAgIGZ0cCBmdHAuY2xhc3Mubm9hYS5nb3YgICAtIExvZ29uIHRvIENMQVNTIHN5c3RlbQorICAgYW5vbnltb3VzICAgICAgICAgIC0gbG9naW4gdXNlcmlkCisgICB1c2VyQGludGVybmV0ICAgICAgLSBlbnRlciB5b3VyIGludGVybmV0IGFkZHJlc3MgYXMgYSBwYXNzd29yZAorICAgYmluYXJ5ICAgICAgICAgICAgIC0gY2hhbmdlcyB0cmFuc2ZlciBtb2RlIHRvIGJpbmFyeQorICAgY2QgQTEwNDA2NjMgICAgICAgIC0gY2hhbmdlcyB0byBjb3JyZWN0IGRpcmVjdG9yeQorICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDAwMjU3Wl8yMDA3MDgwMzAwMDU1M1pfTl9PXzIwMDcwODAzMDEzODI2Wl9fMjAwNzA4MDMwMTQKKzM0NgorICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgNjAyNDI3MTQgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMjIzNTk1M1pfMjAwNzA4MDMwMDAyNTdaX05fT18yMDA3MDgwMzAxMzU1NVpfXzIwMDcwODAzMDE0CiswNDEKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDYyOTcwNDgyIGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDA1NTNaXzIwMDcwODAzMDAwODU3Wl9OX09fMjAwNzA4MDMwMTQwNThaX18yMDA3MDgwMzAxNAorNjE2CisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2Mjk3MDQ4MiBieXRlcworICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDAwODU3Wl8yMDA3MDgwMzAwMDk1M1pfTl9PXzIwMDcwODAzMDE0MzMyWl9fMjAwNzA4MDMwMTQKKzY0NgorICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgMTkzMjYxOTQgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMzAwMTIxOFpfMjAwNzA4MDMwMDE0NTdaX05fT18yMDA3MDgwMzAxNDQzOFpfXzIwMDcwODAzMDE0Cis5NTcKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDU0Nzg3MTc4IGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDE0NThaXzIwMDcwODAzMDAxNzUzWl9OX09fMjAwNzA4MDMwMTQ2MTlaX18yMDA3MDgwMzAxNQorMjIyCisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2MDI0MjcxNCBieXRlcworICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDAxNzU0Wl8yMDA3MDgwMzAwMjA1N1pfTl9PXzIwMDcwODAzMDE0ODI1Wl9fMjAwNzA4MDMwMTUKKzUwNworICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgNjI5NzA0ODIgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMzAwMjA1OFpfMjAwNzA4MDMwMDIzNTNaX05fT18yMDA3MDgwMzAxNTExMFpfXzIwMDcwODAzMDE1Cis3NDIKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDYwMjQyNzE0IGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDIzNTRaXzIwMDcwODAzMDAyNjU3Wl9OX09fMjAwNzA4MDMwMTUzMzdaX18yMDA3MDgwMzAyMAorMDQyCisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2Mjk3MDQ4MiBieXRlcworICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDAyNjU4Wl8yMDA3MDgwMzAwMjk1M1pfTl9PXzIwMDcwODAzMDE1NjA1Wl9fMjAwNzA4MDMwMjAKKzIwMgorICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgNjAyNDI3MTQgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMzAwMjk1NFpfMjAwNzA4MDMwMDMyNTdaX05fT18yMDA3MDgwMzAyMTcwOVpfXzIwMDcwODAzMDIyCisyMDcKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDYyOTcwNDgyIGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDQ0NThaXzIwMDcwODAzMDA0NzUzWl9OX09fMjAwNzA4MDMwMjI5NDdaX18yMDA3MDgwMzAyMworNDM3CisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2MDI0MjcxNCBieXRlcworICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDAzNTU0Wl8yMDA3MDgwMzAwMzg1N1pfTl9PXzIwMDcwODAzMDIyMjUyWl9fMjAwNzA4MDMwMjIKKzgwMgorICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgNjI5NzA0ODIgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMzAwMzg1OFpfMjAwNzA4MDMwMDQxNTNaX05fT18yMDA3MDgwMzAyMjUxNVpfXzIwMDcwODAzMDIzCisxMDIKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDYwMjQyNzE0IGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDQxNTRaXzIwMDcwODAzMDA0NDU3Wl9OX09fMjAwNzA4MDMwMjI3NDZaX18yMDA3MDgwMzAyMworMzUyCisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2Mjk3MDQ4MiBieXRlcworICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDAzMjU4Wl8yMDA3MDgwMzAwMzU1M1pfTl9PXzIwMDcwODAzMDIxOTQzWl9fMjAwNzA4MDMwMjIKKzUwNworICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgNjAyNDI3MTQgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMzAwNTA1OFpfMjAwNzA4MDMwMDUzNTNaX05fT18yMDA3MDgwMzAyMzQzNlpfXzIwMDcwODAzMDI0CiswMTcKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDYwMjQyNzE0IGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDUzNTRaXzIwMDcwODAzMDA1NjU3Wl9OX09fMjAwNzA4MDMwMjM3MDBaX18yMDA3MDgwMzAyNAorMTMyCisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2Mjk3MDQ4MiBieXRlcworICAgZ2V0IAorSUFTSV94eHhfMUNfTTAyXzIwMDcwODAzMDA1NjU4Wl8yMDA3MDgwMzAwNTk1M1pfTl9PXzIwMDcwODAzMDIzOTM2Wl9fMjAwNzA4MDMwMjQKKzM1NworICAgICAgICAgICAgICAgICAgICAgIC0gY29waWVzIGRhdGE7IHNpemUgaXMgNjAyNDI3MTQgYnl0ZXMKKyAgIGdldCAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDgwMzAwNTk1NFpfMjAwNzA4MDMwMTAyNTdaX05fT18yMDA3MDgwMzAyNDE1OVpfXzIwMDcwODAzMDI0Cis2NTcKKyAgICAgICAgICAgICAgICAgICAgICAtIGNvcGllcyBkYXRhOyBzaXplIGlzIDYyOTcwNDgyIGJ5dGVzCisgICBnZXQgCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA4MDMwMDQ3NTRaXzIwMDcwODAzMDA1MDU3Wl9OX09fMjAwNzA4MDMwMjMyMTJaX18yMDA3MDgwMzAyMworNzM3CisgICAgICAgICAgICAgICAgICAgICAgLSBjb3BpZXMgZGF0YTsgc2l6ZSBpcyA2Mjk3MDQ4MiBieXRlcworICAgYnllICAob3IgcXVpdCkgICAgIC0gdG8gZW5kIGZ0cCBzZXNzaW9uLgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gcGljayB1cCB5b3VyIGRhdGEgc2V0IHZpYSAKK2Z0cDovL2Z0cC5jbGFzcy5ub2FhLmdvdi9BMTA0MDY2My8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIAoraHR0cDovL3d3dy5jbGFzcy5ub2FhLmdvdi9kb3dubG9hZC9BMTA0MDY2MworCitOT1RFOiBZb3UgbXVzdCBwaWNrIHVwIHlvdXIgZGF0YSB3aXRoaW4gMTIwIGhvdXJzIG9mIHRoaXMgbm90aWNlLgorCisKKworCitUaGFuayB5b3UuCisKKworPDwgRE8gTk9UIHJlcGx5IHRvIHRoaXMgZS1tYWlsIGFzIGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiA+PgorPDwgUGxlYXNlIGRpcmVjdCBxdWVzdGlvbnMgdG8gdGhlIEhlbHAgRGVzazogPj4KKworCisgICAgICAgICAgICAgICAgICAgTk9BQS9DTEFTUyBVc2VyIEFzc2lzdGFuY2UKKyAgICAgICAgICAgICAgICAgICBOYXRpb25hbCBDbGltYXRpYyBEYXRhIENlbnRlcgorICAgICAgICAgICAgICAgICAgIDE1MSBQYXR0b24gQXZlbnVlCisgICAgICAgICAgICAgICAgICAgQXNoZXZpbGxlLCBOQyAyODgwMS01MDAxCisKKyAgICAgICAgICAgICAgICAgICBJbnRlcm5ldDogaW5mb0BjbGFzcy5ub2FhLmdvdgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQUlSQUJSQUQueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQUlSQUJSQUQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjA0OTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9BSVJBQlJBRC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyb290PgorICAgIDxkaXJzdHJ1Y3Qgc3RhcnRpbmdfcGF0aD0iL2Z0cC9kYXRhL3M0cGEvQXF1YV9BSVJTX0xldmVsMS9BSVJBQlJBRC4wMDUvMjAwNiI+CisgICAgICAgIDxub2ZpbGVzLz4KKyAgICAgICAgPGRpciBuYW1lPSJcZHszfSI+CisgICAgICAgICAgICA8bm9kaXJzLz4KKyAgICAgICAgICAgIDxmaWxlIG5hbWU9IkFJUlNcLjIwMDZcLlxkezJ9XC5cZHsyfVwuXGR7M30uTDFCLkFNU1VfUmFkXC52NVwuMFwuMFwuMFwuR1xkezExfVwuaGRmKFwueG1sKXswLDF9Ii8+CisgICAgICAgIDwvZGlyPgorICAgIDwvZGlyc3RydWN0PgorPC9yb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0FJUlMzU1Q4LnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0FJUlMzU1Q4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU4Y2VhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQUlSUzNTVDgueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgICA8ZGlyc3RydWN0IHN0YXJ0aW5nX3BhdGg9Ii9kYXRhL3M0cGEvQXF1YV9BSVJTX0xldmVsMy9BSVJTM1NUOC4wMDUvMjAwNyI+CisgICAgICAgIDxub2RpcnMvPgorICAgICAgICA8ZmlsZSBuYW1lPSJBSVJTXC4yMDA3LlxkezJ9LlxkezJ9LkwzLlJldFN0ZF9JUjAwOFwudjVcLjBcLjE0XC4wXC5HXGR7MTF9XC5oZGYoXC54bWwpezAsMX0iLz4KKyAgICA8L2RpcnN0cnVjdD4KKzwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9BSVJTM1NURC54bWwgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9BSVJTM1NURC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NWEzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0FJUlMzU1RELnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJvb3Q+CisgICAgPGRpcnN0cnVjdCBzdGFydGluZ19wYXRoPSIvZGF0YS9zNHBhL0FxdWFfQUlSU19MZXZlbDMvQUlSUzNTVEQuMDA1LzIwMDciPgorICAgICAgICA8bm9kaXJzLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iQUlSU1wuMjAwNy5cZHsyfS5cZHsyfS5MMy5SZXRTdGRfSVIwMDFcLnY1XC4wXC4xNFwuMFwuR1xkezExfVwuaGRmKFwueG1sKXswLDF9Ii8+CisgICAgPC9kaXJzdHJ1Y3Q+Cis8L3Jvb3Q+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9DTEFTU19FbWFpbC54bWwgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9DTEFTU19FbWFpbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NWFmMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0NMQVNTX0VtYWlsLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJvb3Q+CisgICAgPGRpcnN0cnVjdCBzdGFydGluZ19wYXRoPSJJTkJPWCI+CisgICAgICAgIDxub2RpcnMvPgorICAgIDwvZGlyc3RydWN0PgorPC9yb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0NMQVNTX1RleHRfRW1haWwueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQ0xBU1NfVGV4dF9FbWFpbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzOTljNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0NMQVNTX1RleHRfRW1haWwueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgICA8ZGlyc3RydWN0IHN0YXJ0aW5nX3BhdGg9Ii9ob21lL2NsYXNzL1RleHRNYWlsIj4KKyAgICAgICAgPGRpciBuYW1lPSJcZHs0fS1cZHsyfS1cZHsyfV9cZHsyfSI+CisgICAgICAgICAgICA8ZGlyIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICA8bm9kaXJzLz4KKyAgICAgICAgICAgIDwvZGlyPiAgICAgICAgICAgICAgICAKKyAgICAgICAgPC9kaXI+CisgICAgPC9kaXJzdHJ1Y3Q+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQ2xvdWRTQVQueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQ2xvdWRTQVQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDc3YWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9DbG91ZFNBVC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyb290PgorICAgIDxkaXJzdHJ1Y3Qgc3RhcnRpbmdfcGF0aD0iMkItQ1dDLVJPLlIwNC8yMDA3LzMwNCIvPgorPC9yb290PgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvR0ZTLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0dGUy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlZWExMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0dGUy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyb290PgorICAgIDxkaXJzdHJ1Y3Qgc3RhcnRpbmdfcGF0aD0iL3B1Yi9kYXRhL25jY2YvY29tL2dmcy9wcm9kIj4KKyAgICAgICAgPG5vZmlsZXMvPgorICAgICAgICA8ZGlyIG5hbWU9Imdmc1wuXGR7OH0oKDEyKXwoMDApKSI+CisgICAgICAgICAgICA8bm9kaXJzLz4KKyAgICAgICAgICAgIDxmaWxlIG5hbWU9Imdmc1wudCgoMDApfCgxMikpelwucGdyYjJmKCgwMyl8KDA2KXwoMDkpfCgxMikpIi8+CisgICAgICAgIDwvZGlyPgorICAgIDwvZGlyc3RydWN0PgorPC9yb290PgorICAgIAorICAgIAorCisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0lBU0kueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvSUFTSS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzZTg3MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0lBU0kueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgICA8ZGlyc3RydWN0IHN0YXJ0aW5nX3BhdGg9Ii9taXNjL3JhaWQyL0lBU0kvTDFDLzIwMDciPgorICAgICAgICA8bm9maWxlcy8+CisgICAgPC9kaXJzdHJ1Y3Q+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvSUFTSV8yLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0lBU0lfMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiZGJkOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0lBU0lfMi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyb290PgorICAgIDxkaXJzdHJ1Y3Qgcm9vdF9iYXNlZD0idHJ1ZSIgc3RhcnRpbmdfcGF0aD0iL0E2NzE5MTgzIj4KKyAgICAgICAgPG5vZGlycy8+CisgICAgPC9kaXJzdHJ1Y3Q+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvSUJJQkxJTy54bWwgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcy9JQklCTElPLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDllMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvSUJJQkxJTy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyb290PgorICAgIDxkaXJzdHJ1Y3Qgc3RhcnRpbmdfcGF0aD0iL21pcnJvcnMvYXBhY2hlLyI+CisgICAgICAgIDxub2ZpbGVzLz4KKyAgICAgICAgPGRpciBuYW1lPSJhbnQiPgorICAgICAgICAgICAgPG5vZGlycy8+CisgICAgICAgIDwvZGlyPgorICAgIDwvZGlyc3RydWN0PgorPC9yb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL01PRElTLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL01PRElTLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNmMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvTU9ESVMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgICA8ZGlyc3RydWN0IHN0YXJ0aW5nX3BhdGg9Ii9NT1RBL01DRDQzQjEuMDA1LzIwMDcuMDIuMDIiPgorICAgICAgICA8bm9kaXJzLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iTUNENDNCMVwuQTIwMDcwMzNcLmhcZHsyfXZcZHsyfVwuMDA1XC5cZHsxM31cLmhkZihcLnhtbCl7MCwxfSIvPgorICAgIDwvZGlyc3RydWN0PgorPC9yb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL1JUR19TU1QueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvUlRHX1NTVC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYmM1ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL1JUR19TU1QueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgICA8ZGlyc3RydWN0IHN0YXJ0aW5nX3BhdGg9Ii9wdWIvaGlzdG9yeS9zc3QiPgorICAgICAgICA8bm9kaXJzLz4KKyAgICAgICAgPGZpbGUgbmFtZT0icnRnX3NzdF9ncmJfMFwuNVwuXGR7OH0iLz4KKyAgICA8L2RpcnN0cnVjdD4KKzwvcm9vdD4KKyAgICAgICAgCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9FeHRlcm5hbFNvdXJjZXNGaWxlcy9FeHRlcm5hbFNvdXJjZXMueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRXh0ZXJuYWxTb3VyY2VzRmlsZXMvRXh0ZXJuYWxTb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDJiODgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvRXh0ZXJuYWxTb3VyY2VzRmlsZXMvRXh0ZXJuYWxTb3VyY2VzLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNvdXJjZXM+CisgICAgPHNvdXJjZSBob3N0PSJwb2xhci5uY2VwLm5vYWEuZ292Ij4KKyAgICAgICAgPGxvZ2luIHR5cGU9ImZ0cCIgYWxpYXM9IlBvbGFyTmNlcE5vYWFGdHAiPgorICAgICAgICAgICAgPHVzZXJuYW1lPmFub255bW91czwvdXNlcm5hbWU+CisgICAgICAgICAgICA8cGFzc3dvcmQ+dXNlckBob3N0LmNvbTwvcGFzc3dvcmQ+CisgICAgICAgIDwvbG9naW4+CisgICAgPC9zb3VyY2U+ICAgIAorICAgIDxzb3VyY2UgaG9zdD0iZnRwMS5jbG91ZHNhdC5jaXJhLmNvbG9zdGF0ZS5lZHUiPgorICAgICAgICA8bG9naW4gdHlwZT0iZnRwIiBhbGlhcz0iQ2xvdWRTQVRGdHAiPgorICAgICAgICAgICAgPHVzZXJuYW1lPjwvdXNlcm5hbWU+CisgICAgICAgICAgICA8cGFzc3dvcmQ+PC9wYXNzd29yZD4KKyAgICAgICAgICAgIDxjZFRlc3REaXI+MkItQ1dDLVJPLlIwNC8yMDA3LzMwNDwvY2RUZXN0RGlyPgorICAgICAgICAgICAgPG1heENvbm4+NTwvbWF4Q29ubj4KKyAgICAgICAgPC9sb2dpbj4KKyAgICA8L3NvdXJjZT4KKyAgICA8c291cmNlIGhvc3Q9ImZ0cC5jbGFzcy5ub2FhLmdvdiI+CisgICAgICAgIDxsb2dpbiB0eXBlPSJmdHAiIGFsaWFzPSJDbGFzc0Z0cCI+CisgICAgICAgICAgICA8dXNlcm5hbWU+YW5vbnltb3VzPC91c2VybmFtZT4KKyAgICAgICAgICAgIDxwYXNzd29yZD51c2VyQGhvc3QuY29tPC9wYXNzd29yZD4KKyAgICAgICAgPC9sb2dpbj4KKyAgICA8L3NvdXJjZT4KKyAgICA8c291cmNlIGhvc3Q9ImxvY2FsaG9zdCI+CisgICAgICAgIDxsb2dpbiB0eXBlPSJmaWxlIiBhbGlhcz0ibG9jYWxob3N0Ij4KKyAgICAgICAgICAgIDx1c2VybmFtZT5ub25lPC91c2VybmFtZT4KKyAgICAgICAgICAgIDxwYXNzd29yZD5ub25lPC9wYXNzd29yZD4KKyAgICAgICAgPC9sb2dpbj4KKyAgICA8L3NvdXJjZT4KKyAgICA8c291cmNlIGhvc3Q9ImZ0cHByZC5uY2VwLm5vYWEuZ292Ij4KKyAgICAgICAgPGxvZ2luIHR5cGU9ImZ0cCIgYWxpYXM9Ikdmc0Z0cCI+CisgICAgICAgICAgICA8dXNlcm5hbWU+YW5vbnltb3VzPC91c2VybmFtZT4KKyAgICAgICAgICAgIDxwYXNzd29yZD51c2VyQGhvc3QuY29tPC9wYXNzd29yZD4KKyAgICAgICAgPC9sb2dpbj4KKyAgICA8L3NvdXJjZT4KKyAgICA8c291cmNlIGhvc3Q9ImU0ZnRsMDF1LmVjcy5uYXNhLmdvdiI+CisgICAgICAgIDxsb2dpbiB0eXBlPSJmdHAiIGFsaWFzPSJNb2Rpc0Z0cCI+CisgICAgICAgICAgICA8dXNlcm5hbWU+YW5vbnltb3VzPC91c2VybmFtZT4KKyAgICAgICAgICAgIDxwYXNzd29yZD51c2VyQGhvc3QuY29tPC9wYXNzd29yZD4KKyAgICAgICAgPC9sb2dpbj4KKyAgICA8L3NvdXJjZT4KKyAgICA8c291cmNlIGhvc3Q9ImFpcnNjYWwydS5lY3MubmFzYS5nb3YiPgorICAgICAgICA8bG9naW4gdHlwZT0iZnRwIiBhbGlhcz0iR2RhYWNGdHAiPgorICAgICAgICAgICAgPHVzZXJuYW1lPmFub255bW91czwvdXNlcm5hbWU+CisgICAgICAgICAgICA8cGFzc3dvcmQ+dXNlckBob3N0LmNvbTwvcGFzc3dvcmQ+CisgICAgICAgIDwvbG9naW4+CisgICAgPC9zb3VyY2U+CisgICAgPHNvdXJjZSBob3N0PSJhY2Rpc2MuZ3NmYy5uYXNhLmdvdiI+CisgICAgICAgIDxsb2dpbiB0eXBlPSJmdHAiIGFsaWFzPSJBY2Rpc2NHc2ZjRnRwIj4KKyAgICAgICAgICAgIDx1c2VybmFtZT5hbm9ueW1vdXM8L3VzZXJuYW1lPgorICAgICAgICAgICAgPHBhc3N3b3JkPnVzZXJAaG9zdC5jb208L3Bhc3N3b3JkPgorICAgICAgICA8L2xvZ2luPgorICAgIDwvc291cmNlPgorICAgIDxzb3VyY2UgaG9zdD0id3d3LnNpZ25hbDQyLmNvbSI+CisgICAgICAgIDxsb2dpbiB0eXBlPSJodHRwIiBhbGlhcz0iU2lnbmFsNDJBcGFjaGVNaXJyb3JIdHRwIj4KKyAgICAgICAgICAgIDx1c2VybmFtZT5ub25lPC91c2VybmFtZT4KKyAgICAgICAgICAgIDxwYXNzd29yZD5ub25lPC9wYXNzd29yZD4KKyAgICAgICAgPC9sb2dpbj4KKyAgICA8L3NvdXJjZT4KKzwvc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9GaWxlTGlzdFBhcnNlckZpbGVzL0Rvd25sb2FkTGlzdC50eHQgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9GaWxlTGlzdFBhcnNlckZpbGVzL0Rvd25sb2FkTGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4MDkzMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL0ZpbGVMaXN0UGFyc2VyRmlsZXMvRG93bmxvYWRMaXN0LnR4dApAQCAtMCwwICsxLDcgQEAKKy9taXNjL3JhaWQyL0lBU0kvTDFDLzIwMDcvMDYvMzAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDYyOTIzNTk1M1pfMjAwNzA2MzAwMDAyNTZaX05fT18yMDA3MDYzMDAxMzcyM1pfXzIwMDcwNjMwMDE0MzMwCitJQVNJX3h4eF8xQ19NMDJfMjAwNzA2MzAwMDAyNTdaXzIwMDcwNjMwMDAwNTUyWl9OX09fMjAwNzA2MzAwMTM5NTJaX18yMDA3MDYzMDAxNDY0MAorSUFTSV94eHhfMUNfTTAyXzIwMDcwNjMwMDAwNTUzWl8yMDA3MDYzMDAwMDg1NlpfTl9PXzIwMDcwNjMwMDE0MjIwWl9fMjAwNzA2MzAwMTQ3NDAKK0lBU0lfeHh4XzFDX00wMl8yMDA3MDYzMDAwMDg1N1pfMjAwNzA2MzAwMDExNTJaX05fT18yMDA3MDYzMDAxNDQ1MlpfXzIwMDcwNjMwMDE0OTQ0CitJQVNJX3h4eF8xQ19NMDJfMjAwNzA2MzAwMDExNTNaXzIwMDcwNjMwMDAxNDU2Wl9OX09fMjAwNzA2MzAwMTQ3MThaX18yMDA3MDYzMDAxNTIzNAorSUFTSV94eHhfMUNfTTAyXzIwMDcwNjMwMDAxNzUzWl8yMDA3MDYzMDAwMjA1NlpfTl9PXzIwMDcwNjMwMDE1MjI4Wl9fMjAwNzA2MzAwMTU5MDkKZGlmZiAtLWdpdCAiYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9Qcm9jbWFpbEZvcndhcmRpbmcvXDEzM2RvdFwxMzVmb3J3YXJkIiAiYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9Qcm9jbWFpbEZvcndhcmRpbmcvXDEzM2RvdFwxMzVmb3J3YXJkIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkNWJjCi0tLSAvZGV2L251bGwKKysrICJiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1Byb2NtYWlsRm9yd2FyZGluZy9cMTMzZG90XDEzNWZvcndhcmQiCkBAIC0wLDAgKzEgQEAKKyJ8SUZTPScgJyYmcD0vdXNyL2xvY2FsL2Jpbi9wcm9jbWFpbCYmdGVzdCAtZiAkcCYmZXhlYyAkcCAtZi18fGV4aXQgNzUjY2xhc3MiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1Byb2NtYWlsRm9yd2FyZGluZy9cMTMzZG90XDEzNXByb2NtYWlsL2dlbmVyYWwucmMiICJiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1Byb2NtYWlsRm9yd2FyZGluZy9cMTMzZG90XDEzNXByb2NtYWlsL2dlbmVyYWwucmMiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWNmZDcKLS0tIC9kZXYvbnVsbAorKysgImIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvUHJvY21haWxGb3J3YXJkaW5nL1wxMzNkb3RcMTM1cHJvY21haWwvZ2VuZXJhbC5yYyIKQEAgLTAsMCArMSwyNSBAQAorTU9OVEhGT0xERVI9IGBkYXRlICslWS0lbS0lZF8lSCBgCitEVU1NWT0gYHRlc3QgLWQgJE1PTlRIRk9MREVSIHx8IG1rZGlyIC1tIGc9cnd4ICRNT05USEZPTERFUiBgCisKK0NMQVNTX0ZPTERFUj0gJHtNT05USEZPTERFUn0vY2xhc3MKK1VOS05PV05fRk9MREVSPSAke01PTlRIRk9MREVSfS91bmtub3duCitKUExfRk9MREVSPSAke01PTlRIRk9MREVSfS9qcGwKK0RVTU1ZPSBgdGVzdCAtZCAkQ0xBU1NfRk9MREVSIHx8IG1rZGlyIC1tIGc9cnd4ICRDTEFTU19GT0xERVIgYAorRFVNTVk9IGB0ZXN0IC1kICRVTktOT1dOX0ZPTERFUiB8fCBta2RpciAtbSBnPXJ3eCAkVU5LTk9XTl9GT0xERVIgYAorRFVNTVk9IGB0ZXN0IC1kICRKUExfRk9MREVSIHx8IG1rZGlyIC1tIGc9cnd4ICRKUExfRk9MREVSIGAKKworOjAgZncKKyogCit8IGZvcm1haWwgLWsgLVggRnJvbTogLVggU3ViamVjdDogCisKKzowIDoKKyogXkZyb20uKmNsYXNzXC5ub2FhXC5nb3YgCiske0NMQVNTX0ZPTERFUn0KKworOjAgOgorKiBeRnJvbS4qanBsXC5uYXNhXC5nb3YKKyR7SlBMX0ZPTERFUn0KKworOjAgOgorKiAKKyR7VU5LTk9XTl9GT0xERVJ9IApkaWZmIC0tZ2l0ICJhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1Byb2NtYWlsRm9yd2FyZGluZy9cMTMzZG90XDEzNXByb2NtYWlscmMiICJiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1Byb2NtYWlsRm9yd2FyZGluZy9cMTMzZG90XDEzNXByb2NtYWlscmMiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTI0YTEKLS0tIC9kZXYvbnVsbAorKysgImIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvUHJvY21haWxGb3J3YXJkaW5nL1wxMzNkb3RcMTM1cHJvY21haWxyYyIKQEAgLTAsMCArMSw3IEBACitWRVJCT1NFPW9mZgorVU1BU0s9MDA3CitNQUlMRElSPSRIT01FL1RleHRNYWlsCitQTURJUj0kSE9NRS8ucHJvY21haWwKK0RFRkFVTFQ9JE1BSUxESVIKK0xPR0ZJTEU9JFBNRElSL2xvZworSU5DTFVERVJDPSRQTURJUi9nZW5lcmFsLnJjCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9SZW1vdGVTcGVjc0ZpbGVzL1JlbW90ZVNwZWNzLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL1JlbW90ZVNwZWNzRmlsZXMvUmVtb3RlU3BlY3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGVkMjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9SZW1vdGVTcGVjc0ZpbGVzL1JlbW90ZVNwZWNzLnhtbApAQCAtMCwwICsxLDE4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyZW1vdGVTcGVjcz4KKyAgICAKKyAgICA8YWxpYXNTcGVjcz4KKyAgICAgICAgPGFsaWFzU3BlYyBmaWxlPSJbQ0FTX1BQX1JFU09VUkNFU10vZXhhbXBsZXMvRXh0ZXJuYWxTb3VyY2VzRmlsZXMvRXh0ZXJuYWxTb3VyY2VzLnhtbCIvPgorICAgIDwvYWxpYXNTcGVjcz4KKworICAgIDxkYWVtb25zPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iRGV3RnRwIiBhY3RpdmU9Im5vIj4KKyAgICAgICAgICAgIDxydW5JbmZvIGZpcnN0UnVuRGF0ZVRpbWU9IjIwMDctMTItMDFUMDA6MDA6MDBaIiBwZXJpb2Q9IjNtIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1JFU09VUkNFU10vZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMiPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSJJQVNJXC54bWwiIHBhcnNlcj0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuRGlyU3RydWN0WG1sUGFyc2VyIi8+CisgICAgICAgICAgICA8L3Byb3BJbmZvPgorICAgICAgICAgICAgPGRhdGFJbmZvIHN0YWdpbmdBcmVhPSJEZXdGdHAiIGRlbGV0ZUZyb21TZXJ2ZXI9Im5vIi8+ICAgICAgICAgICAgICAgCisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iRGV3RnRwIiBhY3RpdmU9Im5vIj4KKyAgICAgICAgICAgIDxydW5JbmZvIGZpcnN0UnVuRGF0ZVRpbWU9IjIwMDctMTItMDFUMDA6MDA6MDBaIiBwZXJpb2Q9IjNtIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1RFTVBfUFJPUFNdL1dlYXRoZXJTZnRwIj4KKyAgICAgICAgICAgICAgICA8ZG93bmxvYWRJbmZvIGFsaWFzPSJXZWF0aGVyU2Z0cCIgcmVtb3RlRGlyPSJqdW5rVGVzdCIvPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSJJQVNJXC54bWwiIHBhcnNlcj0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuRGlyU3RydWN0WG1sUGFyc2VyIi8+CisgICAgICAgICAgICA8L3Byb3BJbmZvPgorICAgICAgICAgICAgPGRhdGFJbmZvIHN0YWdpbmdBcmVhPSJEZXdGdHAiIGRlbGV0ZUZyb21TZXJ2ZXI9Im5vIi8+CisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iQ2FsUG9seVNmdHAiIGFjdGl2ZT0ibm8iPgorICAgICAgICAgICAgPHJ1bkluZm8gZmlyc3RSdW5EYXRlVGltZT0iMjAwNy0xMi0wMVQwMDowMDowMFoiIHBlcmlvZD0iM20iIHJ1bk9uUmVib290PSJ5ZXMiLz4KKyAgICAgICAgICAgIDxwcm9wSW5mbyBkaXI9IltDQVNfUFBfUkVTT1VSQ0VTXS9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcyI+CisgICAgICAgICAgICAgICAgPHByb3BGaWxlcyByZWdFeHA9IkNhbFBvbHlcLnhtbCIgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IkNhbFBvbHlTZnRwIiBkZWxldGVGcm9tU2VydmVyPSJubyIvPgorICAgICAgICA8L2RhZW1vbj4KKyAgICAgICAgCisgICAgICAgIDxkYWVtb24gYWxpYXM9IldlYXRoZXJTZnRwIiBhY3RpdmU9Im5vIj4KKyAgICAgICAgICAgIDxydW5JbmZvIGZpcnN0UnVuRGF0ZVRpbWU9IjIwMDctMTItMDFUMDA6MDA6MDBaIiBwZXJpb2Q9IjNtIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1JFU09VUkNFU10vZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMiPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSJJQVNJXC54bWwiIHBhcnNlcj0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuRGlyU3RydWN0WG1sUGFyc2VyIi8+CisgICAgICAgICAgICA8L3Byb3BJbmZvPgorICAgICAgICAgICAgPGRhdGFJbmZvIHN0YWdpbmdBcmVhPSJXZWF0aGVyU2Z0cCIgZGVsZXRlRnJvbVNlcnZlcj0ibm8iLz4gICAgICAgICAgICAKKyAgICAgICAgPC9kYWVtb24+CisgICAgICAgIAorICAgICAgICA8ZGFlbW9uIGFsaWFzPSJXZWF0aGVyU2Z0cCIgYWN0aXZlPSJubyI+CisgICAgICAgICAgICA8cnVuSW5mbyBmaXJzdFJ1bkRhdGVUaW1lPSIyMDA3LTEyLTAxVDAwOjAwOjAwWiIgcGVyaW9kPSIzbSIgcnVuT25SZWJvb3Q9InllcyIvPgorICAgICAgICAgICAgPHByb3BJbmZvIGRpcj0iW0NBU19QUF9URU1QX1BST1BTXS9XZWF0aGVyU2Z0cCI+CisgICAgICAgICAgICAgICAgPGRvd25sb2FkSW5mbyBhbGlhcz0iV2VhdGhlclNmdHAiIHJlbW90ZURpcj0ianVua1Rlc3QiLz4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iSUFTSVwueG1sIiBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkRpclN0cnVjdFhtbFBhcnNlciIvPgorICAgICAgICAgICAgPC9wcm9wSW5mbz4KKyAgICAgICAgICAgIDxkYXRhSW5mbyBzdGFnaW5nQXJlYT0iV2VhdGhlclNmdHAiIGRlbGV0ZUZyb21TZXJ2ZXI9Im5vIiBxdWVyeUVsZW1lbnQ9IlJldHJpZXZlZEZyb21Mb2MiLz4gICAgICAgICAgICAgICAgCisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iV2VhdGhlclNmdHAiIGFjdGl2ZT0ibm8iPgorICAgICAgICAgICAgPHJ1bkluZm8gZmlyc3RSdW5EYXRlVGltZT0iMjAwNy0xMi0yNFQwMDoxMDowMFoiIHBlcmlvZD0iM20iIHJ1bk9uUmVib290PSJ5ZXMiLz4KKyAgICAgICAgICAgIDxwcm9wSW5mbyBkaXI9IltDQVNfUFBfUkVTT1VSQ0VTXS9leGFtcGxlcy9GaWxlTGlzdFBhcnNlckZpbGVzIj4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iRG93bmxvYWRMaXN0XC50eHQiIHBhcnNlcj0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuRmlsZUxpc3RQYXJzZXIiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IldlYXRoZXJTZnRwIiBkZWxldGVGcm9tU2VydmVyPSJubyIgcXVlcnlFbGVtZW50PSJSZXRyaWV2ZWRGcm9tTG9jIi8+CisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iQ2xhc3NGdHAiIGFjdGl2ZT0ibm8iPgorICAgICAgICAgICAgPHJ1bkluZm8gZmlyc3RSdW5EYXRlVGltZT0iMjAwNy0xMi0wMVQwMDowMDowMFoiIHBlcmlvZD0iM20iIHJ1bk9uUmVib290PSJ5ZXMiLz4KKyAgICAgICAgICAgIDxwcm9wSW5mbyBkaXI9IltDQVNfUFBfUkVTT1VSQ0VTXS9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcyI+CisgICAgICAgICAgICAgICAgPHByb3BGaWxlcyByZWdFeHA9IklBU0lfMi54bWwiIHBhcnNlcj0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuRGlyU3RydWN0WG1sUGFyc2VyIi8+CisgICAgICAgICAgICA8L3Byb3BJbmZvPgorICAgICAgICAgICAgPGRhdGFJbmZvIHN0YWdpbmdBcmVhPSJDbGFzc0Z0cCIgZGVsZXRlRnJvbVNlcnZlcj0ibm8iIHF1ZXJ5RWxlbWVudD0iRmlsZW5hbWUiLz4KKyAgICAgICAgPC9kYWVtb24+CisgICAgICAgIAorICAgICAgICA8ZGFlbW9uIGFsaWFzPSJDbGFzc0Z0cCIgYWN0aXZlPSJubyI+CisgICAgICAgICAgICA8cnVuSW5mbyBmaXJzdFJ1bkRhdGVUaW1lPSIyMDA3LTEyLTAxVDAwOjAwOjAwWiIgcGVyaW9kPSIzbSIgcnVuT25SZWJvb3Q9InllcyIvPgorICAgICAgICAgICAgPHByb3BJbmZvIGRpcj0iW0NBU19QUF9SRVNPVVJDRVNdL2V4YW1wbGVzL0NsYXNzTm9hYUVtYWlsUGFyc2VyRmlsZXMiPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSJbXlwuXS4qIiBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkNsYXNzTm9hYUVtYWlsUGFyc2VyIi8+CisgICAgICAgICAgICA8L3Byb3BJbmZvPgorICAgICAgICAgICAgPGRhdGFJbmZvIHN0YWdpbmdBcmVhPSJDbGFzc0Z0cCIgZGVsZXRlRnJvbVNlcnZlcj0ibm8iIHF1ZXJ5RWxlbWVudD0iRmlsZW5hbWUiLz4KKyAgICAgICAgPC9kYWVtb24+CisgICAgICAgIAorICAgICAgICA8ZGFlbW9uIGFsaWFzPSJDbGFzc0Z0cCIgYWN0aXZlPSJubyI+CisgICAgICAgICAgICA8cnVuSW5mbyBmaXJzdFJ1bkRhdGVUaW1lPSIyMDA3LTEyLTE0VDAwOjAwOjAwWiIgcGVyaW9kPSIzbSIgZXBzaWxvbj0iMjBzIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1RFTVBfUFJPUFNdL0NsYXNzRnRwL0VtYWlscyI+CisgICAgICAgICAgICAgICAgPGRvd25sb2FkSW5mbyBhbGlhcz0iUGVhdGVJbWFwcyIgZGVsZXRlRnJvbVNlcnZlcj0ieWVzIiByZW5hbWluZ0NvbnY9IkNMQVNTX1tIT1NUXV9bREFURS5VVENdX1tGSUxFTkFNRV0uZW1haWwiPgorICAgICAgICAgICAgICAgICAgICA8cHJvcEZpbGUgcGF0aD0iW0NBU19QUF9SRVNPVVJDRVNdL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzL0NMQVNTX0VtYWlsLnhtbCIgCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkRpclN0cnVjdFhtbFBhcnNlciIvPgorICAgICAgICAgICAgICAgIDwvZG93bmxvYWRJbmZvPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSIuKlwuZW1haWwiIHBhcnNlcj0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnMuQ2xhc3NOb2FhRW1haWxQYXJzZXIiLz4KKyAgICAgICAgICAgICAgICA8YWZ0ZXJVc2UgbW92ZVRvT25TdWNjZXNzPSJbQ0FTX1BQX1RFTVBfUFJPUFNdL0NsYXNzRnRwL1Byb2Nlc3NlZEVtYWlscyIgCisgICAgICAgICAgICAgICAgICAgIG1vdmVUb09uRmFpbD0iW0NBU19QUF9URU1QX1BST1BTXS9DbGFzc0Z0cC9GYWlsZWRFbWFpbHMiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IkNsYXNzRnRwIiBkZWxldGVGcm9tU2VydmVyPSJubyIgYWxsb3dBbGlhc092ZXJyaWRlPSJ5ZXMiIAorICAgICAgICAgICAgICAgIHF1ZXJ5RWxlbWVudD0iRmlsZW5hbWUiIHJlbmFtaW5nQ29udj0iW0dSRVBfUk0oJ15MXGR7MSx9P1wuJywnW0ZJTEVOQU1FXScpXSIvPgorICAgICAgICA8L2RhZW1vbj4KKyAgICAgICAgCisgICAgICAgIDxkYWVtb24gYWxpYXM9IkNsYXNzRnRwIiBhY3RpdmU9InllcyI+CisgICAgICAgICAgICA8cnVuSW5mbyBmaXJzdFJ1bkRhdGVUaW1lPSIyMDA3LTEyLTE0VDAwOjAwOjAwWiIgcGVyaW9kPSIzbSIgZXBzaWxvbj0iMjBzIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1RFTVBfUFJPUFNdL0NsYXNzRnRwL0VtYWlscyI+CisgICAgICAgICAgICAgICAgPGRvd25sb2FkSW5mbyBhbGlhcz0ibG9jYWxob3N0IiBkZWxldGVGcm9tU2VydmVyPSJ5ZXMiIHJlbmFtaW5nQ29udj0iQ0xBU1NfW0hPU1RdX1tEQVRFLlVUQ11fW0ZJTEVOQU1FXS5lbWFpbCI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wRmlsZSBwYXRoPSJbQ0FTX1BQX1JFU09VUkNFU10vZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMvQ0xBU1NfVGV4dF9FbWFpbC54bWwiIAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgICAgICA8L2Rvd25sb2FkSW5mbz4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iLipcLmVtYWlsIiBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkNsYXNzTm9hYUVtYWlsUGFyc2VyIi8+CisgICAgICAgICAgICAgICAgPGFmdGVyVXNlIG1vdmVUb09uU3VjY2Vzcz0iW0NBU19QUF9URU1QX1BST1BTXS9DbGFzc0Z0cC9Qcm9jZXNzZWRFbWFpbHMiIAorICAgICAgICAgICAgICAgICAgICBtb3ZlVG9PbkZhaWw9IltDQVNfUFBfVEVNUF9QUk9QU10vQ2xhc3NGdHAvRmFpbGVkRW1haWxzIi8+CisgICAgICAgICAgICA8L3Byb3BJbmZvPgorICAgICAgICAgICAgPGRhdGFJbmZvIHN0YWdpbmdBcmVhPSJDbGFzc0Z0cCIgZGVsZXRlRnJvbVNlcnZlcj0ibm8iIGFsbG93QWxpYXNPdmVycmlkZT0ieWVzIiAKKyAgICAgICAgICAgICAgICBxdWVyeUVsZW1lbnQ9IkZpbGVuYW1lIi8+CisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iR2ZzRnRwIiBhY3RpdmU9Im5vIj4KKyAgICAgICAgICAgIDxydW5JbmZvIGZpcnN0UnVuRGF0ZVRpbWU9IjIwMDctMTEtMjdUMDA6MDA6MDBaIiBwZXJpb2Q9IjNtIiBlcHNpbG9uPSIyMHMiIHJ1bk9uUmVib290PSJ5ZXMiLz4KKyAgICAgICAgICAgIDxwcm9wSW5mbyBkaXI9IltDQVNfUFBfUkVTT1VSQ0VTXS9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcyI+CisgICAgICAgICAgICAgICAgPHByb3BGaWxlcyByZWdFeHA9IkdGU1wueG1sIiBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkRpclN0cnVjdFhtbFBhcnNlciIvPgorICAgICAgICAgICAgPC9wcm9wSW5mbz4KKyAgICAgICAgICAgIDxkYXRhSW5mbyBzdGFnaW5nQXJlYT0iR2ZzRnRwIiByZW5hbWluZ0NvbnY9IltQQVJFTlRfRklMRU5BTUVdX1tGSUxFTkFNRV0iIHF1ZXJ5RWxlbWVudD0iUmV0cmlldmVkRnJvbUxvYyIvPgorICAgICAgICA8L2RhZW1vbj4KKyAgICAgICAgCisgICAgICAgIDxkYWVtb24gYWxpYXM9IlBvbGFyTmNlcE5vYWFGdHAiIGFjdGl2ZT0ibm8iPgorICAgICAgICAgICAgPHJ1bkluZm8gZmlyc3RSdW5EYXRlVGltZT0iMjAwNy0xMS0yN1QwMDowMDowMFoiIHBlcmlvZD0iM20iIGVwc2lsb249IjIwcyIgcnVuT25SZWJvb3Q9InllcyIvPgorICAgICAgICAgICAgPHByb3BJbmZvIGRpcj0iW0NBU19QUF9SRVNPVVJDRVNdL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzIj4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iUlRHX1NTVFwueG1sIiBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkRpclN0cnVjdFhtbFBhcnNlciIvPgorICAgICAgICAgICAgPC9wcm9wSW5mbz4KKyAgICAgICAgICAgIDxkYXRhSW5mbyBzdGFnaW5nQXJlYT0iUnRnU3N0RnRwIiBxdWVyeUVsZW1lbnQ9IkZpbGVuYW1lIi8+CisgICAgICAgIDwvZGFlbW9uPgorCisgICAgICAgIDxkYWVtb24gYWxpYXM9Ik1vZGlzRnRwIiBhY3RpdmU9Im5vIj4KKyAgICAgICAgICAgIDxydW5JbmZvIGZpcnN0UnVuRGF0ZVRpbWU9IjIwMDctMTItMDFUMDA6MDA6MDBaIiBwZXJpb2Q9IjNtIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1JFU09VUkNFU10vZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMiPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSJNT0RJU1wueG1sIiBwYXJzZXI9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkRpclN0cnVjdFhtbFBhcnNlciIvPgorICAgICAgICAgICAgPC9wcm9wSW5mbz4KKyAgICAgICAgICAgIDxkYXRhSW5mbyBzdGFnaW5nQXJlYT0iTW9kaXNGdHAiIGRlbGV0ZUZyb21TZXJ2ZXI9Im5vIiBxdWVyeUVsZW1lbnQ9IlJldHJpZXZlZEZyb21Mb2MiLz4KKyAgICAgICAgPC9kYWVtb24+CisgICAgICAgIAorICAgICAgICA8ZGFlbW9uIGFsaWFzPSJHZGFhY0Z0cCIgYWN0aXZlPSJubyI+CisgICAgICAgICAgICA8cnVuSW5mbyBmaXJzdFJ1bkRhdGVUaW1lPSIyMDA3LTEyLTAxVDAwOjAwOjAwWiIgcGVyaW9kPSIzbSIgcnVuT25SZWJvb3Q9InllcyIvPgorICAgICAgICAgICAgPHByb3BJbmZvIGRpcj0iW0NBU19QUF9SRVNPVVJDRVNdL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzIj4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iQUlSQUJSQURcLnhtbCIgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IkdkYWNjRnRwIiBkZWxldGVGcm9tU2VydmVyPSJubyIgcXVlcnlFbGVtZW50PSJSZXRyaWV2ZWRGcm9tTG9jIi8+CisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICAgICAgPGRhZW1vbiBhbGlhcz0iQWNkaXNjR3NmY0Z0cCIgYWN0aXZlPSJubyI+CisgICAgICAgICAgICA8cnVuSW5mbyBmaXJzdFJ1bkRhdGVUaW1lPSIyMDA3LTEyLTAxVDAwOjAwOjAwWiIgcGVyaW9kPSIzbSIgcnVuT25SZWJvb3Q9InllcyIvPgorICAgICAgICAgICAgPHByb3BJbmZvIGRpcj0iW0NBU19QUF9SRVNPVVJDRVNdL2V4YW1wbGVzL0RpclN0cnVjdFhtbFBhcnNlckZpbGVzIj4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iQUlSUzNTVERcLnhtbCIgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgICAgICA8cHJvcEZpbGVzIHJlZ0V4cD0iQUlSUzNTVDhcLnhtbCIgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IkFjZGlzY0dzZmNGdHAiIGRlbGV0ZUZyb21TZXJ2ZXI9Im5vIiBxdWVyeUVsZW1lbnQ9IlJldHJpZXZlZEZyb21Mb2MiLz4KKyAgICAgICAgPC9kYWVtb24+CisgICAgICAgIAorICAgICAgICA8ZGFlbW9uIGFsaWFzPSJTaWduYWw0MkFwYWNoZU1pcnJvckh0dHAiIGFjdGl2ZT0ibm8iPgorICAgICAgICAgICAgPHJ1bkluZm8gZmlyc3RSdW5EYXRlVGltZT0iMjAwNy0xMi0wMVQwMDowMDowMFoiIHBlcmlvZD0iM20iIHJ1bk9uUmVib290PSJ5ZXMiLz4KKyAgICAgICAgICAgIDxwcm9wSW5mbyBkaXI9IltDQVNfUFBfUkVTT1VSQ0VTXS9leGFtcGxlcy9EaXJTdHJ1Y3RYbWxQYXJzZXJGaWxlcyI+CisgICAgICAgICAgICAgICAgPHByb3BGaWxlcyByZWdFeHA9IklCSUJMSU9cLnhtbCIgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IlNpZ25hbDQyQXBhY2hlTWlycm9ySHR0cCIgZGVsZXRlRnJvbVNlcnZlcj0ibm8iIHF1ZXJ5RWxlbWVudD0iUmV0cmlldmVkRnJvbUxvYyIvPgorICAgICAgICA8L2RhZW1vbj4KKyAgICAgICAgCisgICAgICAgIDxkYWVtb24gYWxpYXM9IlJpbWVTZnRwIiBhY3RpdmU9Im5vIj4KKyAgICAgICAgICAgIDxydW5JbmZvIGZpcnN0UnVuRGF0ZVRpbWU9IjIwMDgtMDItMTlUMDA6MDA6MDBaIiBwZXJpb2Q9IjNtIiBydW5PblJlYm9vdD0ieWVzIi8+CisgICAgICAgICAgICA8cHJvcEluZm8gZGlyPSJbQ0FTX1BQX1JFU09VUkNFU10vZXhhbXBsZXMvRGlyU3RydWN0WG1sUGFyc2VyRmlsZXMiPgorICAgICAgICAgICAgICAgIDxwcm9wRmlsZXMgcmVnRXhwPSJSaW1lRElSU1RSVUNULnhtbCIgcGFyc2VyPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5EaXJTdHJ1Y3RYbWxQYXJzZXIiLz4KKyAgICAgICAgICAgIDwvcHJvcEluZm8+CisgICAgICAgICAgICA8ZGF0YUluZm8gc3RhZ2luZ0FyZWE9IlJpbWVTZnRwIiByZW5hbWluZ0NvbnY9IltQQVRIX05PX0ZJTEVOQU1FXS9bRklMRU5BTUVdIiBkZWxldGVGcm9tU2VydmVyPSJubyIgcXVlcnlFbGVtZW50PSJSZXRyaWV2ZWRGcm9tTG9jIi8+CisgICAgICAgIDwvZGFlbW9uPgorICAgICAgICAKKyAgICA8L2RhZW1vbnM+CisgICAgCis8L3JlbW90ZVNwZWNzPgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvanNzZWNhY2VydHMgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9qc3NlY2FjZXJ0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhmNjIxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvanNzZWNhY2VydHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjEyM2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgZGVmYXVsdCBmaWxlIG91dHB1dCBpcyBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuID0gLi4vbG9ncy9jYXMtcHVzaHB1bGwlZy5sb2cKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0ID0gNTAwMDAKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmNvdW50ID0gNQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuYXBwZW5kID0gdHJ1ZQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKK2phdmEubGFuZy5tYW5hZ2VtZW50LmxldmVsID0gT0ZGCitqYXZhLnJtaS5yZWdpc3RyeS5sZXZlbCA9IE9GRgoramF2YXgubWFuYWdlbWVudC5sZXZlbCA9IE9GRgoramF2YXgubWFuYWdlbWVudC5sZXZlbCA9IE9GRgorc3VuLnJtaS5sZXZlbCA9IE9GRgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L1BhcnNlclRvUmV0cmlldmFsTWV0aG9kTWFwLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9QYXJzZXJUb1JldHJpZXZhbE1ldGhvZE1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3NjI0YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9QYXJzZXJUb1JldHJpZXZhbE1ldGhvZE1hcC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxydHZsTWV0aG9kcz4KKyAgICAKKyAgICA8cnR2bE1ldGhvZCBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxtZXRob2QuUmVtb3RlQ3Jhd2xlciI+CisgICAgICAgIDxwYXJzZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkRpclN0cnVjdFhtbFBhcnNlciIvPgorICAgIDwvcnR2bE1ldGhvZD4KKyAgICAKKyAgICA8cnR2bE1ldGhvZCBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5yZXRyaWV2YWxtZXRob2QuTGlzdFJldHJpZXZlciI+CisgICAgICAgIDxwYXJzZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkZpbGVMaXN0UGFyc2VyIi8+CisgICAgICAgIDxwYXJzZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkNsYXNzTm9hYUVtYWlsUGFyc2VyIi8+CisgICAgICAgIDxwYXJzZXIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5wYXJzZXJzLkdlbmVyaWNFbWFpbFBhcnNlciIvPgorICAgIDwvcnR2bE1ldGhvZD4KKyAgICAKKzwvcnR2bE1ldGhvZHM+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvUHJvdG9jb2xGYWN0b3J5SW5mby54bWwgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvUHJvdG9jb2xGYWN0b3J5SW5mby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjOGM0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL3BvbGljeS9Qcm90b2NvbEZhY3RvcnlJbmZvLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb3RvY29scz4KKyAgICAKKyAgICA8cHJvdG9jb2wgdHlwZT0iZnRwIj4KKyAgICAgICAgPHByb3RvY29sRmFjdG9yeSBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5mdHAuQ29nSkdsb2J1c0Z0cFByb3RvY29sRmFjdG9yeSIvPgorICAgICAgICA8cHJvdG9jb2xGYWN0b3J5IGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnByb3RvY29sLmZ0cC5Db21tb25zTmV0RnRwUHJvdG9jb2xGYWN0b3J5Ii8+CisgICAgPC9wcm90b2NvbD4KKyAgICAKKyAgICA8cHJvdG9jb2wgdHlwZT0iaHR0cCI+CisgICAgICAgIDxwcm90b2NvbEZhY3RvcnkgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuaHR0cC5IdHRwUHJvdG9jb2xGYWN0b3J5Ii8+CisgICAgPC9wcm90b2NvbD4KKyAgICAKKyAgICA8cHJvdG9jb2wgdHlwZT0ic2Z0cCI+CisgICAgICAgIDxwcm90b2NvbEZhY3RvcnkgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wuc2Z0cC5Kc2NoU2Z0cFByb3RvY29sRmFjdG9yeSIvPgorICAgIDwvcHJvdG9jb2w+CisgICAgCisgICAgPHByb3RvY29sIHR5cGU9ImltYXBzIj4KKyAgICAgICAgPHByb3RvY29sRmFjdG9yeSBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wcm90b2NvbC5pbWFwcy5JbWFwc1Byb3RvY29sRmFjdG9yeSIvPgorICAgIDwvcHJvdG9jb2w+CisgICAgCisgICAgPCEtLQorICAgIE5vdGU6IGhhc24ndCBiZWVuIGltcGxlbWVudGVkIHlldCwgc2VlIE9PRFQtNTM3IAorICAgICAKKyAgICA8cHJvdG9jb2wgdHlwZT0iZmlsZSI+CisgICAgICAgIDxwcm90b2NvbEZhY3RvcnkgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucHJvdG9jb2wubG9jYWwuTG9jYWxQcm90b2NvbEZhY3RvcnkiLz4gICAgCisgICAgPC9wcm90b2NvbD4KKyAgICAtLT4KKyAgICAKKzwvcHJvdG9jb2xzPgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L21pbWV0eXBlcy54bWwgYi8wLjEwL3B1c2hwdWxsL3NyYy9tYWluL3Jlc291cmNlcy9wb2xpY3kvbWltZXR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmE1Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvcG9saWN5L21pbWV0eXBlcy54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtaW1lLWluZm8+CisJCisJPG1pbWUtdHlwZSB0eXBlPSJwcm9kdWN0L3BncF9zaWduYXR1cmUiPgorCQk8X2NvbW1lbnQ+PCFbQ0RBVEFbUHJvZHVjdE5hbWVHZW5lcmF0b3I9W0dSRVBfUk0oJ1wuc2lnJCcsJ1tGSUxFTkFNRV0nKV1dXT48L19jb21tZW50PgorCQk8Z2xvYiBwYXR0ZXJuPSIqLnNpZyIvPgorCTwvbWltZS10eXBlPgorCQorCTxtaW1lLXR5cGUgdHlwZT0ibWV0YWRhdGEvY2FzX3B1c2hwdWxsIj4KKwkJPGdsb2IgcGF0dGVybj0iKi5pbmZvLnRtcCIvPgorCTwvbWltZS10eXBlPgorCQorCTxtaW1lLXR5cGUgdHlwZT0ibWV0YWRhdGEvY2FzX21ldGFkYXRhIj4KKwkJPGdsb2IgcGF0dGVybj0iKi5jYXMiLz4KKwkJPGdsb2IgcGF0dGVybj0iKi5tZXQiLz4KKwk8L21pbWUtdHlwZT4KKwkKKwk8bWltZS10eXBlIHR5cGU9InByb2R1Y3QvaWFzaV94eHhfMWMiPgorCQk8c3ViLWNsYXNzLW9mIHR5cGU9Im1ldG9wX2Evbm9hYSIvPgorCQk8X2NvbW1lbnQ+UHJvZHVjdFR5cGU9TU9BX0lBU0lfTDFDPC9fY29tbWVudD4KKwkJPGdsb2IgcGF0dGVybj0iKD86TFxkezEsfVwuKXswLDF9SUFTSV94eHhfMUNfXHd7M31fXHd7MTV9X1x3ezE1fV9cd19cd19cd3sxNX1fX1x3ezE0fSIgaXNyZWdleD0idHJ1ZSIvPgorCTwvbWltZS10eXBlPgorCQorCTxtaW1lLXR5cGUgdHlwZT0icHJvZHVjdC9taHN4Ij4KKwkJPHN1Yi1jbGFzcy1vZiB0eXBlPSJtZXRvcF9hL25vYWEiLz4KKwkJPF9jb21tZW50PlByb2R1Y3RUeXBlPU1PQV9NSFNfTDFCPC9fY29tbWVudD4KKwkJPGdsb2IgcGF0dGVybj0iKD86TFxkezEsfVwuKXswLDF9TlNTXC5NSFNYXC5cd3syfVwuRFxkezV9XC5TXGR7NH1cLkVcZHs0fVwuQlxkezd9XC5cd3syfSIgaXNyZWdleD0idHJ1ZSIvPgorCTwvbWltZS10eXBlPgorCQorCTxtaW1lLXR5cGUgdHlwZT0icHJvZHVjdC9hbXN1X2EiPgorCQk8c3ViLWNsYXNzLW9mIHR5cGU9Im1ldG9wX2Evbm9hYSIvPgorCQk8X2NvbW1lbnQ+UHJvZHVjdFR5cGU9TU9BX0FNU1VBX0wxQjwvX2NvbW1lbnQ+CisJCTxnbG9iIHBhdHRlcm49Iig/OkxcZHsxLH1cLil7MCwxfU5TU1wuQU1BWFwuXHd7Mn1cLkRcZHs1fVwuU1xkezR9XC5FXGR7NH1cLkJcZHs3fVwuXHd7Mn0iIGlzcmVnZXg9InRydWUiLz4KKwk8L21pbWUtdHlwZT4KKwkKKwk8bWltZS10eXBlIHR5cGU9InByb2R1Y3QvcnRnX3NzdCI+CisJCTxzdWItY2xhc3Mtb2YgdHlwZT0ibmNlcC9tb2RlbCIvPgorCQk8X2NvbW1lbnQ+PCFbQ0RBVEFbUHJvZHVjdFR5cGU9UlRHX1NTVCAmJiBVbmlxdWVFbGVtZW50PVJldHJpZXZlZEZyb21Mb2NdXT48L19jb21tZW50PgorCQk8Z2xvYiBwYXR0ZXJuPSJydGdfc3N0X2dyYl8wXC41XC5cZHs4fSIgaXNyZWdleD0idHJ1ZSIvPgorICAgICAgICA8Z2xvYiBwYXR0ZXJuPSJzc3RcLlxkezh9X3J0Z3NzdGhyX2dyYl8wXC41XC5ncmliMiIgaXNyZWdleD0idHJ1ZSIvPgorCTwvbWltZS10eXBlPgorCQorPC9taW1lLWluZm8+CisKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL3B1c2hfcHVsbF9mcmFtZXdvcmsucHJvcGVydGllcyBiLzAuMTAvcHVzaHB1bGwvc3JjL21haW4vcmVzb3VyY2VzL3B1c2hfcHVsbF9mcmFtZXdvcmsucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTcyNmJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvbWFpbi9yZXNvdXJjZXMvcHVzaF9wdWxsX2ZyYW1ld29yay5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTA2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjICRJZDogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgQ0FTIFB1c2gtUHVsbC1GcmFtZXdvcmskCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVmYXVsdCBDb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworI2V4dGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMKK29yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLmV4dGVybmFsLnByb3BlcnRpZXMuZmlsZXM9W0NBU19QUF9IT01FXS9ldGMvZGVmYXVsdC5wcm9wZXJ0aWVzCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZhdWx0IEluZ2VzdGVyIFByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0jCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCisjaW5nZXN0ZXIgY2xhc3NwYXRoCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0ZXI9b3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlcgorCisjaW5nZXN0ZXIgdHJhbnNmZXJlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5mYWN0b3J5PW9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5CisKKyMgaW5nZXN0ZXIgZmlsZW1nciB1cmwKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci51cmw9W0ZJTEVNR1JfTE9DXQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tIENhY2hlZCBJbmdlc3RlciBQcm9wZXJ0aWVzICAtLS0tLS0tLS0tLS0tLSMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLmZhY3Rvcnk9CisKK29yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuY2FjaGUucmFuZ2VRdWVyeUVsZW1lbnROYW1lPQorCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLnJhbmdlLnN0YXJ0PQorCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLnJhbmdlLmVuZD0KKworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS51bmlxdWVFbGVtZW50TmFtZT0KKworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5jYWNoZS5wcm9kdWN0VHlwZT0KKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMtLS0tLS0tLS0tLS0tLS0tIFByb3RvY29sIENvbmZpZ3VyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKKyNzZXQgdGhlIHBhZ2luZyBzaXplICh1c2UgLTEgdG8gdHVybiBwYWdpbmcgb2ZmKQorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5wcm90b2NvbC5wYWdlX3NpemU9OAorCisjcHJvdG9jb2xmYWN0b3J5IHNwZWNpZmljYXRpb24gZm9yIHByb3RvY29sIHR5cGVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5wcm90b2NvbGZhY3RvcnkuaW5mby5maWxlcz1bQ0FTX1BQX0hPTUVdL3BvbGljeS9Qcm90b2NvbEZhY3RvcnlJbmZvLnhtbAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIy0tLS0tLS0tLS0tLSBGaWxlUmV0cmlldmFsU3lzdGVtIENvbmZpZ3VyYXRpb25zIC0tLS0tLS0tLS0tLS0jCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworI3BhcnNlciB0byByZXRyaWV2YWxtZXRob2QgbWFwCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmNvbmZpZy5wYXJzZXIuaW5mby5maWxlcz1bQ0FTX1BQX0hPTUVdL3BvbGljeS9QYXJzZXJUb1JldHJpZXZhbE1ldGhvZE1hcC54bWwKKworI3VuaXF1ZSBtZXRhZGF0YSBlbGVtZW50IGluZm8KK29yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuY29uZmlnLnR5cGUuZGV0ZWN0aW9uLmZpbGU9W0NBU19QUF9IT01FXS9wb2xpY3kvbWltZXR5cGVzLnhtbAorCisjZGlyZWN0b3J5IGJlbG93IHdoaWNoIGFsbCBkYXRhIGZpbGUgd2lsbCBiZSBkb3dubG9hZGVkIHRvCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmRhdGEuZmlsZXMuYmFzZS5zdGFnaW5nLmFyZWE9W0NBU19QUF9TVEFHSU5HX0FSRUFdCisKKyNsaXN0IG9mIG1ldGFkYXRhIHZhbHVlcyB0byBwcmludCB0byBtZXRhZGF0YSBmaWxlCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLm1ldGFkYXRhLmxpc3QudG8ucHJpbnQ9UHJvZHVjdE5hbWUsUmV0cmlldmVkRnJvbUxvYyxEYXRhUHJvdmlkZXIsRmlsZVNpemUsUmVuYW1pbmdTdHJpbmcsUHJvZHVjdFR5cGUsRG93bmxvYWRUb0RpcixEZWxldGVBZnRlckRvd25sb2FkLFN1cGVyVHlwZQorCisjZXh0ZW5zaW9uIGZvciB0ZW1wb3JhcnkgbWV0YWRhdGEgZmlsZQorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC53cml0ZS5tZXQuZmlsZT10cnVlCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLm1ldC5maWxlLmV4dGVuc2lvbj1pbmZvLnRtcAorCisjdHJhY2tlciB2YXJyaWVzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB1c2VkIHRvIGRvd25sb2FkIGZpbGVzIHRvIGZpbmQgdGhlIG9wdGltaXplZAorIyBudW1iZXIgb2YgdGhyZWFkcyBpbiBvcmRlciB0byBnZXQgdGhlIGJlc3QgZG93bmxvYWQgdGltZQorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5jcmF3bGVyLnVzZS50cmFja2VyPWZhbHNlCisKKyN0aGUgcmVjb21tZW5kZWQgbnVtYmVyIG9mIHRocmVhZHMgKHdpbGwgYmUgdGhlIHN0YXRpYyBudW1iZXIgb2YgCisjIHRocmVhZHMgdXNlZCBpZiB0aGUgdHJhY2tlciBpcyB0dXJuZWQgb2ZmKQorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlLnJldHJpZXZhbC5zeXN0ZW0ucmVjb21tZW5kZWQudGhyZWFkLmNvdW50PTMwCisKKyN0aGUgRmlsZVJldHJpZXZhbFN5c3RlbSB3aWxsIHN0b3AgYWNjZXB0aW5nIGZpbGVzIGZvciBkb3dubG9hZCBvbmNlIHRoaXMgbnVtYmVyCisjIG9mIGZhaWxlZCBkb3dubG9hZHMgaXMgcmVhY2hlZAorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlLnJldHJpZXZhbC5zeXN0ZW0ubWF4Lm51bWJlci5hbGxvd2VkLmZhaWxlZC5kb3dubG9hZHM9MTAKKworI2lmIHRydWUsIGFueSBmaWxlIG5vdCBkZWZpbmVkIGluIHRoZSBmaWxlIHR5cGUgZGV0ZWN0aW9uIGZpbGUgd2lsbCBub3QgYmUgZG93bmxvYWRlZAorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5hbGxvdy5vbmx5LmRlZmluZWQudHlwZXM9dHJ1ZQorCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmZpbGVyZXN0cmljdGlvbnMucGFyc2Vycy5jbGFzcy5ub2FhLmVtYWlsLnBhcnNlci5jb250YWlucy5leHBycz1DTEFTU1wgaGFzXCBwcm9jZXNzZWQsYW5vbnltb3VzCisKK29yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZ2VuZXJpYy5lbWFpbC5wYXJzZXIuZmlsZS5wYXR0ZXJuPVdhdiBGaWxlOiAoW15cXHNdKykKK29yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZ2VuZXJpYy5lbWFpbC5wYXJzZXIuY2hlY2suZm9yLnBhdHRlcm49UGF0dGVybiB0byB2YWxpZCBlbWFpbCBoYXMgZXhwZWN0ZWQgdGV4dAorb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5nZW5lcmljLmVtYWlsLnBhcnNlci5wYXRoLnRvLnJvb3Q9L3NvbWUvcm9vdC9wYXRoCitvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmdlbmVyaWMuZW1haWwucGFyc2VyLm1ldGFkYXRhLmtleXM9TWFzdGVySW5Db250YWN0SWQKK29yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZ2VuZXJpYy5lbWFpbC5wYXJzZXIubWV0YWRhdGEuTWFzdGVySW5Db250YWN0SWQ9TWFzdGVyIENvbnRhY3RJRCAoXGQrPylcbgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wdXNocHVsbC5qcGcgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLXB1c2hwdWxsLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmU0MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wdXNocHVsbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wdXNocHVsbC5wc2QgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLXB1c2hwdWxsLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVkYmIzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1wdXNocHVsbC5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3BwX2V4dGVuc2lvbl9wb2ludHMucG5nIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3BwX2V4dGVuc2lvbl9wb2ludHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTZiODQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcHBfZXh0ZW5zaW9uX3BvaW50cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3BwX29iamVjdF9tb2RlbC5wbmcgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcHBfb2JqZWN0X21vZGVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI1Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3BwX29iamVjdF9tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1YWYxZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJjYXMtcHVzaHB1bGwiPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICA8L2xpbmtzPgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJib3R0b20iLz4KKyAgICA8bWVudSBuYW1lPSJTb2Z0d2FyZSBEb2N1bWVudGF0aW9uIj4KKyAgICAgIDxpdGVtIG5hbWU9IkRldmVsb3BlciBHdWlkZSIgaHJlZj0iZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IkJhc2ljIFVzZXIgR3VpZGUiIGhyZWY9InVzZXIvYmFzaWMuaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iQWR2YW5jZWQgVXNlciBHdWlkZSIgaHJlZj0idXNlci9hZHZhbmNlZC5odG1sIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9kZXZlbG9wZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjUyMmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLnhtbApAQCAtMCwwICsxLDI4NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgICA8cHJvcGVydGllcz4KKyAgICAgIDx0aXRsZT5DQVMgUHVzaCBQdWxsIEZyYW1ld29yayBEZXZlbG9wZXIgR3VpZGU8L3RpdGxlPgorICAgICAgPGF1dGhvciBlbWFpbD0iQnJpYW4uRm9zdGVyQGpwbC5uYXNhLmdvdiI+QnJpYW4gRm9zdGVyPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICA8L3Byb3BlcnRpZXM+CisKKyAgIDxib2R5PgorICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgICA8cD4KKyAgICAgICAgICBUaGlzIGlzIHRoZSBkZXZlbG9wZXIgZ3VpZGUgZm9yIHRoZSBBcGFjaGUgT09EVCBDYXRhbG9nIGFuZCBBcmNoaXZlIFNlcnZpY2UgKENBUykgCisgICAgICAgICAgUHVzaCBQdWxsIGZyYW1ld29yaywgb3IgUHVzaCBQdWxsIGZvciBzaG9ydC4gUHJpbWFyaWx5LCB0aGlzIGd1aWRlIAorICAgICAgICAgIHdpbGwgZXhwbGFpbiB0aGUgUHVzaCBQdWxsIGFyY2hpdGVjdHVyZSBhbmQgaW50ZXJmYWNlcywgaW5jbHVkaW5nIGl0cyAKKyAgICAgICAgICB0YWlsb3JhYmxlIGV4dGVuc2lvbiBwb2ludHMuIEZvciBpbmZvcm1hdGlvbiBvbiBpbnN0YWxsYXRpb24sIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgYW5kIGV4YW1wbGVzLCBwbGVhc2Ugc2VlIG91ciA8YSBocmVmPSIuLi91c2VyL2Jhc2ljLmh0bWwiPlVzZXIgR3VpZGVzLjwvYT4KKyAgICAgICAgICAKKyAgICAgICAgICA8cD5UaGUgcmVtYWluZGVyIG9mIHRoaXMgZ3VpZGUgaXMgc2VwYXJhdGVkIGludG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8L3A+CisgICAgICA8dWw+CisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjEiPlByb2plY3QgRGVzY3JpcHRpb248L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMiI+QXJjaGl0ZWN0dXJlPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjMiPkV4dGVuc2lvbiBQb2ludHM8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uNCI+Q3VycmVudCBFeHRlbnNpb24gUG9pbnQgSW1wbGVtZW50YXRpb25zPC9hPjwvbGk+CisgICAgICA8L3VsPgorICAgICAgICAgIAorICAgICAgICA8L3A+ICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjEiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlByb2plY3QgRGVzY3JpcHRpb24iPgorICAgICAgICA8cD5UaGUgUHVzaCBQdWxsIGZyYW1ld29yayBpcyByZXNwb25zaWJsZSBmb3IgZG93bmxvYWRpbmcgcmVtb3RlIGNvbnRlbnQgKHB1bGwpLAorICAgICAgICBvciBhY2NlcHRpbmcgdGhlIGRlbGl2ZXJ5IG9mIHJlbW90ZSBjb250ZW50IChwdXNoKSB0byBhIGxvY2FsIHN5c3RlbSBzdGFnaW5nIGFyZWEgCisgICAgICAgIGZvciB1c2UgYnkgdGhlIDxhIGhyZWY9Ii4uLy4uL2NyYXdsZXIiPkNBUyBDcmF3bGVyIEZyYW1ld29yazwvYT4gdG8gaW5nZXN0IGludG8gCisgICAgICAgIHRoZSA8YSBocmVmPSIuLi8uLi9maWxlbWdyIj5DQVMgRmlsZSBNYW5hZ2VyPC9hPi4gVGhlIFB1c2ggUHVsbCBmcmFtZXdvcmsgaXMgZXh0ZW5zaWJsZSAKKyAgICAgICAgYW5kIHByb3ZpZGVzIGEgZnVsbHkgdGFpbG9yYWJsZSBKYXZhLWJhc2VkIEFQSSBmb3IgdGhlIGFjcXVpc2l0aW9uIG9mIHJlbW90ZSBjb250ZW50LjwvcD4gCisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgICAgIDxhIG5hbWU9InNlY3Rpb24yIi8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJBcmNoaXRlY3R1cmUiPgorICAgICAgCisgICAgICAgIDxwPkluIHRoaXMgc2VjdGlvbiwgd2Ugd2lsbCBkZXNjcmliZSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBQdXNoIFB1bGwgZnJhbWV3b3JrLAorICAgICAgICBpbmNsdWRpbmcgaXRzIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMsIG9iamVjdCBtb2RlbCwgYW5kIGtleSBjYXBhYmlsaXRpZXMuPC9wPgorICAgICAgCisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbXBvbmVudHMiPgorICAgICAgICAKKyAgICAgICAgPHA+VGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsgYXJlIHRoZSBEYWVtb24gTGF1bmNoZXIsIHRoZSBEYWVtb24sIAorICAgICAgICB0aGUgUHJvdG9jb2wgTGF5ZXIsIGFuZCB0aGUgRmlsZSBSZXRyaWV2YWwgU3lzdGVtLCB0byBuYW1lIGEgZmV3LiAgVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIAorICAgICAgICBhbGwgb2YgdGhlc2UgY29tcG9uZW50cyBhcmUgc2hvd24gaW4gdGhlIGRpYWdyYW0gYmVsb3c6CisgICAgICAgIDwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvcHBfZXh0ZW5zaW9uX3BvaW50cy5wbmciIGFsdD0iUHVzaCBQdWxsIEZyYW1ld29yayBBcmNoaXRlY3R1cmUiLz48L3A+CisgICAgICAgIAorICAgICAgICA8cD5UaGUgUHVzaCBQdWxsIEZyYW1ld29yayBwcm92aWRlcyBhIERhZW1vbiBMYXVuY2hlciwgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIG5ldyAKKyAgICAgICAgRGFlbW9uIGluc3RhbmNlcy4gRWFjaCBEYWVtb24gaGFzIGFuIGFzc29jaWF0ZWQgRGFlbW9uIENvbmZpZ3VyYXRpb24sIGFuZCBoYXMgdGhlIAorICAgICAgICBhYmlsaXR5IHRvIHVzZSBhIEZpbGUgUmV0cmlldmFsIFNldHVwIGV4dGVuc2lvbiBwb2ludC4gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgCisgICAgICAgIGxldmVyYWdpbmcgYm90aCBhIFByb3RvY29sIGFuZCBhIEZpbGUgUmV0cmlldmFsIFN5c3RlbSB0byBvYnRhaW4gUHJvdG9jb2xGaWxlcywgYmFzZWQgb24gCisgICAgICAgIGEgRmlsZSBSZXN0cmljdGlvbnMgUGFyc2VyLCB0aGF0IHlpZWxkcyBldmVudHVhbGx5IGEgVmlydHVhbEZpbGVTdHJ1Y3R1cmUgKFZGUykgbW9kZWwuIFRoZSAKKyAgICAgICAgVkZTIGRlZmluZXMgd2hhdCBmaWxlcyB0byBhY2NlcHQgYW5kIHB1bGwgZG93biBmcm9tIGEgcmVtb3RlIHNpdGUuCisgICAgICAgIDwvcD4gCisgICAgICAgIAorICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik9iamVjdCBNb2RlbCI+CisgICAgICAgIDxwPlRoZSBjcml0aWNhbCBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsgaW5jbHVkZTo8L3A+CisgICAgICAgIAorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPjxzdHJvbmc+UHJvdG9jb2w8L3N0cm9uZz4gLSBBIHBsdWdnYWJsZSBtZWFucyBvZiBvYnRhaW5pbmcgY29udGVudCBvdmVyIAorICAgICAgICAgIHNvbWUgZmlsZSBhY3F1aXNpdGlvbiBtZXRob2QsIGUuZy4sIEZUUCwgU0NQLCBIVFRQLCBldGMuPC9saT4KKyAgICAgICAgICAKKyAgICAgICAgICA8bGk+PHN0cm9uZz5Qcm90b2NvbCBGaWxlPC9zdHJvbmc+IC0gTWV0YWRhdGEgaW5mb3JtYXRpb24gYWJvdXQgYSByZW1vdGUgZmlsZSwgCisgICAgICAgICAgaW5jbHVkaW5nIGl0cyBQcm90b2NvbFBhdGguPC9saT4KKyAgICAgICAgICAKKyAgICAgICAgICA8bGk+PHN0cm9uZz5Qcm90b2NvbCBQYXRoPC9zdHJvbmc+IC0gQSBwb2ludGVyIHRvIGEgcmVtb3RlIFByb2R1Y3QgZmlsZSdzIChvciBmaWxlcycpIAorICAgICAgICAgIGxvY2F0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCB0byBkZXJpdmUgbWV0YWRhdGEgYW5kIGRldGVybWluZSB3aGVyZSB0byBwbGFjZSB0aGUgZmlsZQorICAgICAgICAgIGluIHRoZSBsb2NhbCBzdGFnaW5nIGFyZWEgYnVpbHQgYnkgdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsuPC9saT4KKyAgICAgICAgICAKKyAgICAgICAgICA8bGk+PHN0cm9uZz5SZW1vdGUgU2l0ZTwvc3Ryb25nPiAtIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVtb3RlIHNpdGUsIGluY2x1ZGluZyAKKyAgICAgICAgICB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24sIGFzIHdlbGwgYXMgYSBvcmlnaW4gZGlyZWN0b3J5IHRvIHN0YXJ0IGludGVycm9nYXRpbmcuPC9saT4KKyAgICAgICAgPC91bD4KKworICAgICAgICA8cD5FYWNoIFByb3RvY29sIGRlbGl2ZXJzIG9uZSBvciBtb3JlIFByb3RvY29sIEZpbGVzLiBFYWNoIFByb3RvY29GaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIAorICAgICAgICBzaW5nbGUgUmVtb3RlU2l0ZSwgYW5kIGVhY2ggUHJvdG9jb2xGaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBQcm90b2NvbFBhdGguIFRoZXNlIAorICAgICAgICByZWxhdGlvbnNoaXBzIGFyZSBzaG93biBpbiB0aGUgYmVsb3cgZmlndXJlLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcHBfb2JqZWN0X21vZGVsLnBuZyIgYWx0PSJQdXNoIFB1bGwgRnJhbWV3b3JrIE9iamVjdCBNb2RlbCIvPiAKKyAgICAgICAgPC9zdWJzZWN0aW9uPiAKKyAgICAgIAorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJLZXkgQ2FwYWJpbGl0aWVzIj4KKyAgICAgICAgPHA+VGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsgaGFzIGJlZW4gZGVzaWduZWQgd2l0aCBhIG5ldyBvZiBrZXkgY2FwYWJpbGl0aWVzIGluIG1pbmQuCisgICAgICAgIFRoZXNlIGNhcGFiaWxpdGllcyBpbmNsdWRlOjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+RmxleGliaWxpdHk8L3N0cm9uZz4gLSBhYmlsaXR5IHRvIHBsdWcgaW4gZGlmZmVyZW50IE1ldGFkYXRhIEV4dHJhY3RvcnMsIAorICAgICAgICBEYXRhIFByb3RvY29scywgQ29udGVudCBUeXBlcywgZXRjLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+U3VwcG9ydCBQdXNoL1B1bGw8L3N0cm9uZz4gLSBTdXBwb3J0IG9mIGJvdGggJnF1b3Q7UHVzaCZxdW90OyBhbmQgJnF1b3Q7UHVsbCZxdW90OyAKKyAgICAgICAgc3R5bGUgZGF0YSB0cmFuc2ZlcnMuPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5FeHRlbnNpYmlsaXR5PC9zdHJvbmc+IC0gYWJpbGl0eSB0byBhZGQgbmV3LCBwcmV2aW91c2x5IHVuZGlzY292ZXJlZCBEYXRhIFByb3RvY29scywgCisgICAgICAgIGFuZCAmcXVvdDtwbHVnJnF1b3Q7IHRoZW0gaW50byB0aGUgZnJhbWV3b3JrLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+SmF2YS1iYXNlZDwvc3Ryb25nPiAtIFVzZSBvZiBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBkZXZlbG9wbWVudCBraXQgZm9yIE11bHRpLVBsYXRmb3JtIAorICAgICAgICBkZXBsb3ltZW50ICh1c2luZyB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUpLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+RmFzdCBEYXRhLXRyYW5zZmVyPC9zdHJvbmc+IC0gU3VwcG9ydCBvZiBQYXJhbGxlbCBGaWxlIFRyYW5zZmVycyBhbmQgRGF0YSBEb3dubG9hZHMuPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5FbWFpbC1iYXNlZCBQdXNoPC9zdHJvbmc+IC0gU3VwcG9ydCBmb3IgRW1haWwtYmFzZWQgUHVzaCBEYXRhIEFjY2VwdGFuY2UgdXNpbmcgSU1BUCwgU01UUCBwcm90b2NvbHMuPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5Nb2RlbGluZyBvZiByZW1vdGUgZGF0YSBzaXRlczwvc3Ryb25nPiAtIEFiaWxpdHkgdG8gY29uZmlndXJlIOKAnFZpcnR1YWzigJ0gcmVtb3RlIGRpcmVjdG9yaWVzIChiYXNlZCBvbiBNZXRhZGF0YSAKKyAgICAgICAgc3VjaCBhcyBEYXRlL1RpbWUpIHRvIGRvd25sb2FkIGZpbGVzIGZyb20uPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5JbnRlZ3JhdGlvbiB3aXRoIG90aGVyIENBUyBjb21wb25lbnRzPC9zdHJvbmc+IC0gQWJpbGl0eSB0byAmcXVvdDtwbHVnLWluJnF1b3Q7IHRvIHRoZSBDQVMgRmlsZSBNYW5hZ2VtZW50IAorICAgICAgICBhbmQgQ0FTIENyYXdsIEZyYW1ld29yayBjb21wb25lbnRzIGZvciBEYXRhIEluZ2VzdGlvbi48L3A+ICAgICAgICAgCisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjMiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkV4dGVuc2lvbiBQb2ludHMiPgorICAgICAgICAgIDxwPldlIGhhdmUgY29uc3RydWN0ZWQgdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsgbWFraW5nIHVzZSBvZiB0aGUgPGk+ZmFjdG9yeSAKKyAgICAgICAgICBtZXRob2QgcGF0dGVybjwvaT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBleHRlbnNpb24gcG9pbnRzIGZvciB0aGUgUHVzaCBQdWxsIEZyYW1ld29yay4gQW4gCisgICAgICAgICAgZXh0ZW5zaW9uIHBvaW50IGlzIGFuIGludGVyZmFjZSB3aXRoaW4gdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsgdGhhdCBjYW4gaGF2ZSBtYW55IAorICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gaXQgY29tZXMgdG8gc29mdHdhcmUgCisgICAgICAgICAgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBpdCBhbGxvd3MgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiAKKyAgICAgICAgICBhbiBleGlzdGluZyBpbnRlcmZhY2UgdG8gYmUgc2VsZWN0ZWQgYXQgZGVwbG95bWVudCB0aW1lLjwvcD4gCisgICAgICAgICAgCisgICAgICAgICAgPGRpdiBjbGFzcz0iaW5mbyI+VGhlIGZhY3RvcnkgbWV0aG9kIHBhdHRlcm4gaXMgYSBjcmVhdGlvbmFsIHBhdHRlcm4gY29tbW9uIHRvCisgICAgICAgICAgb2JqZWN0IG9yaWVudGVkIGRlc2lnbi4gRWFjaCBQdXNoIFB1bGwgRnJhbWV3b3JrIGV4dGVuc2lvbiBwb2ludCBpbnZvbHZlcyB0aGUgCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdHdvIGludGVyZmFjZXM6IGFuIDxpPmV4dGVuc2lvbiBmYWN0b3J5PC9pPiBhbmQgYW4gCisgICAgICAgICAgPGk+ZXh0ZW5zaW9uPC9pPiBpbXBsZW1lbnRhdGlvbi4gQXQgcnVuLXRpbWUsIHRoZSBQdXNoIFB1bGwgRnJhbWV3b3JrIGxvYWRzIGEgCisgICAgICAgICAgcHJvcGVydGllcyBmaWxlIHNwZWNpZmllcyBhIGZhY3RvcnkgY2xhc3MgdG8gdXNlIGR1cmluZyBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICBpbnN0YW50aWF0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsgbWF5IGNvbW11bmljYXRlIHdpdGggYSAKKyAgICAgICAgICByZW1vdGUgRlRQIHNpdGUgdG8gb2J0YWluIGNvbnRlbnQsIG9yIGl0IG1heSB1c2UgYW4gSU1BUFMgcHJvdG9jb2wgcGx1Z2luIHRvIAorICAgICAgICAgIGFjY2VwdCBlbWFpbC1wdXNoIG5vdGlmaWNhdGlvbnMgb2YgYXZhaWxhYmxlIGZpbGVzLgorICAgICAgICAgIDwvZGl2PiAKKyAgICAgICAgICAKKyAgICAgICAgICA8cD5Vc2luZyBleHRlbnNpb24gcG9pbnRzLCBpdCBpcyBmYWlybHkgc2ltcGxlIHRvIHN1cHBvcnQgbWFueSBkaWZmZXJlbnQgdHlwZXMgCisgICAgICAgICAgb2Ygd2hhdCBhcmUgdHlwaWNhbGx5IHJlZmVycmVkIHRvIGFzICZxdW90O3BsdWctaW4gYXJjaGl0ZWN0dXJlcyZxdW90Oy4gRWFjaCBvZiB0aGUgY29yZSAKKyAgICAgICAgICBleHRlbnNpb24gcG9pbnRzIGZvciB0aGUgUHVzaCBQdWxsIEZyYW1ld29yayBpcyBkZXNjcmliZWQgYmVsb3c6PC9wPgorICAgICAgICAgIAorICAgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPlByb3RvY29sPC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBQcm90b2NvbCBleHRlbnNpb24gcG9pbnQgaXMgdGhlIGhlYXJ0IG9mIHRoZSBQdXNoIFB1bGwgZnJhbWV3b3JrLCAKKyAgICAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIG1vZGVsaW5nIHJlbW90ZSBzaXRlcywgYW5kIGZvciBvYnRhaW5pbmcgdGhlaXIgY29udGVudCB2aWEgCisgICAgICAgICAgICAgIGRpZmZlcmVudCBSZXRyaWV2YWwgTWV0aG9kcywgdXNpbmcgZGlmZmVyZW50IEZpbGUgUmVzdHJpY3Rpb25zIFBhcnNlcnMuCisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+UmV0cmlldmFsIE1ldGhvZDwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgUmV0cmlldmFsIE1ldGhvZCBleHRlbnNpb24gcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgCisgICAgICAgICAgICAgIGRvd25sb2FkIChwdWxsKSBhbmQgYWNjZXB0YW5jZSAocHVzaCkgb2YgcmVtb3RlIGNvbnRlbnQuCisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+RmlsZSBSZXN0cmljdGlvbnMgUGFyc2VyPC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBGaWxlIFJlc3RyaWN0aW9ucyBQYXJzZXIgZXh0ZW5zaW9uIHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBkZWZpbmluZyAKKyAgICAgICAgICAgICAgaG93IHRvIGFjY2VwdCBvciBkZWNsaW5lIGZpbGVzIGVuY291bnRlcmVkIGJ5IGEgUmV0cmlldmFsIE1ldGhvZCwgaW4gZXNzZW5jZSAKKyAgICAgICAgICAgICAgbW9kZWxpbmcgcmVtb3RlIGZpbGUgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzLgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5TeXN0ZW08L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIGV4dGVuc2lvbiBwb2ludCB0aGF0IHByb3ZpZGVzIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIAorICAgICAgICAgICAgICBQdXNoIFB1bGwgRnJhbWV3b3JrIHNlcnZpY2VzLiBUaGlzIGluY2x1ZGVzIHRoZSBEYWVtb24gTGF1bmNoZXIgaW50ZXJmYWNlLCAKKyAgICAgICAgICAgICAgYXMgd2VsbCBhcyB0aGUgYXNzb2NpYXRlZCBEYWVtb24gaW50ZXJmYWNlLCB0aGF0IAorICAgICAgICAgICAgICBpcyBtYW5hZ2VkIGJ5IHdpdGggdGhlIERhZW1vbiBMYXVuY2hlci4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+ICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgPC9zZWN0aW9uPgorICAgICAgIAorICAgICAgIDxhIG5hbWU9InNlY3Rpb240Ii8+ICAgCisgICAgICAgPHNlY3Rpb24gbmFtZT0iQ3VycmVudCBFeHRlbnNpb24gUG9pbnQgSW1wbGVtZW50YXRpb25zIj4KKyAgICAgICAgCisgICAgICAgICA8cD5UaGVyZSBhcmUgYXQgbGVhc3QgdHdvIGltcGxlbWVudGF0aW9ucyBvZiBhbGwgb2YgdGhlIGFmb3JlbWVudGlvbmVkIAorICAgICAgICAgZXh0ZW5zaW9uIHBvaW50cyBmb3IgdGhlIFB1c2ggUHVsbCBGcmFtZXdvcmsuIEVhY2ggZXh0ZW5zaW9uIHBvaW50IGltcGxlbWVudGF0aW9uIAorICAgICAgICAgaXMgZGV0YWlsZWQgaW4gdGhpcyBzZWN0aW9uLjwvcD4KKworICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUHJvdG9jb2wiPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT48c3Ryb25nPkNvZyBKR2xvYnVzIEZUUC48L3N0cm9uZz4gQW4gaW1wbGVtZW50YXRpb24gb2YgCisgICAgICAgICAgICAgdGhlIFByb3RvY29sIGV4dGVuc2lvbiBwb2ludCBmb3IgRlRQIHVzaW5nIAorICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZ2xvYnVzLm9yZy93aWtpL0NvR19qZ2xvYnVzIj5Db0cgamdsb2J1czwvYT4uCisgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICA8bGk+PHN0cm9uZz5Db21tb25zIE5ldCBGVFAuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSAKKyAgICAgICAgICAgICBvZiB0aGUgUHJvdG9jb2wgZXh0ZW5zaW9uIHBvaW50IGZvciBGVFAgdXNpbmcgCisgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9uZXQvIj5Db21tb25zIE5ldDwvYT4gRlRQIGNsaWVudC4KKyAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIDxsaT48c3Ryb25nPkhUVFAuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIAorICAgICAgICAgICAgIHRoZSBQcm90b2NvbCBleHRlbnNpb24gcG9pbnQgdXNpbmcgSmF2YSdzIFVSTCBjbGFzcywgYXMgd2VsbCBhcyAKKyAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlrYS5hcGNoZS5vcmcvIj5BcGFjaGUgVGlrYTwvYT4ncyBIVE1MUGFyc2VyLjwvbGk+CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+SU1BUFMuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSAKKyAgICAgICAgICAgICBQcm90b2NvbCBleHRlbnNpb24gcG9pbnQgdXNpbmcgSU1BUFMgamF2YXgubWFpbCBjbGFzc2VzIGZyb20gCisgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dlcm9uaW1vLmFwYWNoZS5vcmciPkFwYWNoZSBHZXJvbmltbzwvYT4gYW5kIAorICAgICAgICAgICAgIEhUTUwgcGFyc2luZyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly90aWthLmFwYWNoZS5vcmcvIj5BcGFjaGUgVGlrYTwvYT4uPC9saT4KKworICAgICAgICAgICAgIDxsaT48c3Ryb25nPkxvY2FsLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiAKKyAgICAgICAgICAgICB0aGUgUHJvdG9jb2wgZXh0ZW5zaW9uIHBvaW50IHVzaW5nIEphdmEgTklPIGZvciBsb2NhbCAKKyAgICAgICAgICAgICBkYXRhIGFjcXVpc2l0aW9uLjwvbGk+CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+U0ZUUC48L3N0cm9uZz4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIAorICAgICAgICAgICAgIFByb3RvY29sIGV4dGVuc2lvbiBwb2ludCB1c2luZyA8YSBocmVmPSJodHRwOi8vd3d3LmpjcmFmdC5vcmciPkpDcmFmdDwvYT4ncyAKKyAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmpjcmFmdC5vcmcvanNjaCI+SlNjaDwvYT4gbGlicmFyeS48L2xpPgorICAgICAgICAgICA8L3VsPgorICAgICAgICAgPC9zdWJzZWN0aW9uPiAKKworICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUmV0cmlldmFsIE1ldGhvZCI+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+UmVtb3RlIENyYXdsZXIuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIAorICAgICAgICAgICAgIHRoZSBSZXRyaWV2YWwgTWV0aG9kIGludGVyZmFjZSB0aGF0IHVzZXMgYW4gWE1MIGJhc2VkIHNldCBvZiAKKyAgICAgICAgICAgICBwb2xpY3kgZmlsZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlbW90ZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgCisgICAgICAgICAgICAgdG8gY3Jhd2wgYW5kIG9idGFpbi48L2xpPgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIDxsaT48c3Ryb25nPkxpc3QgUmV0cmlldmVyLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCisgICAgICAgICAgICAgUmV0cmlldmFsIE1ldGhvZCBpbnRlcmZhY2UgdGhhdCBhY2NlcHRzIGEgbGlzdCBvZiBVUkxzIHRoYXQgcG9pbnQgCisgICAgICAgICAgICAgdG8gY29udGVudCB0byBvYnRhaW4uPC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgICAgIDwvc3Vic2VjdGlvbj4gCisKKyAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkZpbGUgUmVzdHJpY3Rpb25zIFBhcnNlciI+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+RGlyU3RydWN0WG1sIFBhcnNlci48L3N0cm9uZz4gQW4gaW1wbGVtZW50YXRpb24gb2YgCisgICAgICAgICAgICAgdGhlIEZpbGUgUmVzdHJpY3Rpb25zIFBhcnNlciBpbnRlcmZhY2UgdGhhdCBpbnRlcnByZXRzIGFuIFhNTCBmaWxlIAorICAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlIHJlbW90ZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgdG8gb2J0YWluLjwvbGk+CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+RmlsZUxpc3QgUGFyc2VyLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCisgICAgICAgICAgICAgRmlsZSBSZXN0cmljdGlvbnMgUGFyc2VyIGludGVyZmFjZSB0aGF0IHNwZWNpZmllcyBhbiBBU0NJSSBuZXdsaW5lIHNlcGFyYXRlZCAKKyAgICAgICAgICAgICBsaXN0IG9mIFVSTHMgcG9pbnRpbmcgdG8gcmVtb3RlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0byBvYnRhaW4uPC9saT4KKworICAgICAgICAgICAgIDxsaT48c3Ryb25nPkNsYXNzIE5PQUEgRW1haWwgUGFyc2VyLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCisgICAgICAgICAgICAgRmlsZSBSZXN0cmljdGlvbnMgUGFyc2VyIGludGVyZmFjZSB0aGF0IHJlYWRzIGVtYWlsIGZpbGVzIGZyb20gTk9BQSdzIENMQVNTIAorICAgICAgICAgICAgIGFyY2hpdmUgd2hpY2ggc3BlY2lmeSBsaXN0cyBvZiBkaXJlY3RvcnkgYW5kIGZpbGUgVVJMcyB0byBvYnRhaW4uPC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgICAgIDwvc3Vic2VjdGlvbj4gICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRGFlbW9uIExhdW5jaGVyIChEYWVtb24gY2xpZW50IGFuZCBEYWVtb24gc2VydmVyKSI+ICAgICAgICAKKyAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5KYXZhIFJNSSBiYXNlZCBzZXJ2ZXIuPC9zdHJvbmc+IEFuIAorICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNlcnZlciBpbnRlcmZhY2UgZm9yIHRoZSBQdXNoIFB1bGwgRnJhbWV3b3JrIHRoYXQgCisgICAgICAgICAgICAgICB1c2VzIFJNSSBhcyB0aGUgdHJhbnNwb3J0YXRpb24gbWVkaXVtIHRvIGxhdW5jaCBQdXNoIFB1bGwgRGFlbW9ucy48L2xpPgorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5QdXNoIFB1bGwgRGFlbW9uLjwvc3Ryb25nPiBBbiAKKyAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgaW50ZXJmYWNlIGZvciB0aGUgSmF2YSBSTUktYmFzZWQgIAorICAgICAgICAgICAgICAgc2VydmVyIHRoYXQgdXNlcyBSTUkgYXMgdGhlIHRyYW5zcG9ydGF0aW9uIG1lZGl1bSB0byBtYW5hZ2UgYW5kIGNvbnRyb2wgdGhlIAorICAgICAgICAgICAgICAgUHVzaCBQdWxsIHNlcnZpY2VzLjwvbGk+CisgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgIDwvc3Vic2VjdGlvbj4gCisgICAgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPHNlY3Rpb24gbmFtZT0iQ29uY2x1c2lvbiI+CisgICAgICA8cD5UaGUgYWltIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiByZWxldmFudCB0byBkZXZlbG9wZXJzCisgICAgICBhYm91dCB0aGUgQ0FTIFB1c2ggUHVsbCBGcmFtZXdvcmsuIFNwZWNpZmljYWxseSwgdGhpcyBkb2N1bWVudCBoYXMgZGVzY3JpYmVkIHRoZSAKKyAgICAgIFB1c2ggUHVsbCBGcmFtZXdvcmsncyBhcmNoaXRlY3R1cmUsIGluY2x1ZGluZyBpdHMgY29uc3RpdHVlbnQgY29tcG9uZW50cywgb2JqZWN0IG1vZGVsIGFuZAorICAgICAga2V5IGNhcGFiaWxpdGllcy4gQWRkaXRpb25hbGx5LCB0aGUgdGhpcyBkb2N1bWVudCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgCisgICAgICBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgUHVzaCBQdWxsIEZyYW1ld29yaydzIGV4dGVuc2lvbiBwb2ludHMuPC9wPiAKKyAgICAgIAorICAgICAgPHA+SW4gdGhlIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+QmFzaWMgVXNlciBHdWlkZTwvYT4gYW5kIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBVc2VyIEd1aWRlPC9hPiwgd2Ugd2lsbCBjb3ZlciB0b3BpY3MKKyAgICAgIGxpa2UgaW5zdGFsbGF0aW9uLCBjb25maWd1cmF0aW9uLCBhbmQgZXhhbXBsZSB1c2VzIGFzIHdlbGwgYXMgYWR2YW5jZWQgdG9waWNzCisgICAgICBsaWtlIHNjYWxpbmcgYW5kIG90aGVyIHRpcHMgYW5kIHRyaWNrcy48L3A+IAorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisKKyAgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvbWF2ZW4ueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L21hdmVuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzlmMzQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L21hdmVuLnhtbApAQCAtMCwwICsxLDE3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5Vc2luZyBNYXZlbjwvdGl0bGU+CisgICAgPGF1dGhvciBlbWFpbD0id29vbGxhcmRAanBsLm5hc2EuZ292Ij5EYXZpZCBXb29sbGFyZDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InNlYW4uaGFyZG1hbkBqcGwubmFzYS5nb3YiPlNlYW4gSGFyZG1hbjwvYXV0aG9yPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iVXNpbmcgTWF2ZW4iPgorICAgICAgPHA+T09EVCB1c2VzIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+TWF2ZW48L2E+IGZvciAKKyAgICAgIG1hbmFnaW5nIG91ciBidWlsZCBlbnZpcm9ubWVudC4gTWF2ZW4gaXMgYW4gb3BlbiBzb3VyY2UgcHJvZHVjdCBmcm9tIHRoZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPiB0aGF0IGltcHJvdmVzIAorICAgICAgb24gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiBpbiB0aGUgYXJlYSBvZiBidWlsZCBtYW5hZ2VtZW50LCAKKyAgICAgIHdoaWNoIGl0IHR1cm4gd2FzIGFuIGltcHJvdmVtZW50IG9uIE1ha2UuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgCisgICAgICBNYXZlbiBmb3IgQXBhY2hlIE9PRFQgYnVpbGQgbWFuYWdlbWVudC48L3A+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9IlNldHVwIj4KKyAgICAgIDxwPk1hdmVuIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlIAorICAgICAgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCI+TWF2ZW4gRG93bmxvYWQ8L2E+IAorICAgICAgcGFnZS4gT09EVCBpcyB1c2luZyB2ZXJzaW9uIDIuMCBhbmQgYWJvdmUuIE1hdmVuIHdhcyBkZXZlbG9wZWQgaW4gSmF2YSBzbyBpdCAKKyAgICAgIHdpbGwgcnVuIG9uIHRoZSBwb3B1bGFyIHBsYXRmb3JtcyAoZS5nLiwgV2luZG93cywgTWFjIE9TWCwgZXRjLikuIEJleW9uZCAKKyAgICAgIG1ha2luZyBzdXJlIHRoZSA8aT5tdm48L2k+IGV4ZWN1dGFibGUgaXMgaW4geW91ciBwYXRoLCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSAKKyAgICAgIHNldHVwIHJlcXVpcmVkLjwvcD4KKworICAgICAgPHA+TWF2ZW4gaXMgYmFzZWQgb24gdGhlIGNvbmNlcHQgb2YgYSBQcm9qZWN0IE9iamVjdCBNb2RlbCAoUE9NKSB3aGljaCBpcyAKKyAgICAgIGNvbnRhaW5lZCBpbiB0aGUgPGk+cG9tLnhtbDwvaT4gZmlsZSBmb3VuZCBhdCB0aGUgcm9vdCBvZiBlYWNoIHByb2plY3QuIAorICAgICAgVGhlIFBPTSBhbGxvd3MgTWF2ZW4gdG8gbWFuYWdlIGEgcHJvamVjdCdzIGJ1aWxkLCByZXBvcnRpbmcgYW5kIGRvY3VtZW50YXRpb24uIAorICAgICAgRm9yIE9PRFQsIG11Y2ggb2YgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIG1hbmFnaW5nIHRoZSBwcm9qZWN0cyBpcyAKKyAgICAgIGNvbnRhaW5lZCBpbiBhIHBhcmVudCBQT00sIHdoaWNoIGlzIGxvY2F0ZWQgaW4gdGhlIDxpPm9vZHQtY29yZTwvaT4gcHJvamVjdC4gU28sIAorICAgICAgaW4gb3JkZXIgdG8gYnVpbGQgYW55IG9mIHRoZSBvdGhlciBwcm9qZWN0cyAoZS5nLiwgY2FzLWN1cmF0b3IsIGNhcy1maWxlbWdyLCAKKyAgICAgIGV0Yy4pIHRoZSBwYXJlbnQgUE9NIG11c3QgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBPT0RUIE1hdmVuIHJlcG9zaXRvcnkuIFRoZSAKKyAgICAgIGxvY2FsIDxpPnBvbS54bWw8L2k+IGZpbGVzIGZvciBlYWNoIG9mIHRoZSBwcm9qZWN0cyBoYXZlIGJlZW4gY29uZmlndXJlZCB0byAKKyAgICAgIHJldHJpZXZlIHRoZSBwYXJlbnQgUE9NIGF1dG9tYXRpY2FsbHkuPC9wPgorICAgICAgCisgICAgICA8cD5PbmNlIE1hdmVuIGhhcyBiZWVuIHNldHVwLCB0aGUgZmlyc3Qgc3RlcCB0byBidWlsZGluZyBhIHByb2plY3Qgd2l0aCBNYXZlbiAKKyAgICAgIGlzIHRvIGNoZWNrb3V0IGEgcHJvamVjdCdzIHNvdXJjZSBjb2RlIGludG8gdGhlIGRldmVsb3BlcidzIHdvcmsgYXJlYS4gU2VlIHRoZSAKKyAgICAgIDxhIGhyZWY9Ii4uL2RldmVsb3BtZW50L3N1YnZlcnNpb24uaHRtbCI+VXNpbmcgU3VidmVyc2lvbjwvYT4gZG9jdW1lbnQgZm9yIGhvdyB0byAKKyAgICAgIGNoZWNrIG91dCBwcm9qZWN0cyBmcm9tIHRoZSBDTSByZXBvc2l0b3J5LjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iUHJvamVjdCBTdHJ1Y3R1cmUiPgorICAgICAgPHA+SW4gb3JkZXIgZm9yIGRlZmF1bHQgTWF2ZW4gZnVuY3Rpb25zIHRvIG9wZXJhdGUgcHJvcGVybHksIHRoZXJlIGlzIGEgCisgICAgICBzdWdnZXN0ZWQgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6PC9wPgorICAgICAgCisgICAgICA8c291cmNlPgorLworICBzcmMvICAgICAgICAgICAgIFNvdXJjZSBDb2RlIChldmVyeXRoaW5nKQorICAgIG1haW4vICAgICAgICAgICAgUHJvZ3JhbSBTb3VyY2UKKyAgICAgIGFzc2VtYmx5LyAgICAgICAgUGFja2FnZSBEZXNjcmlwdG9yCisgICAgICBqYXZhLyAgICAgICAgICAgIEphdmEgU291cmNlCisgICAgICByZXNvdXJjZXMvICAgICAgIFNjcmlwdHMsIENvbmZpZyBGaWxlLCBldGMuCisgICAgICAgIC4uLgorICAgIHRlc3QvICAgICAgICAgICAgVGVzdCBTb3VyY2UKKyAgICAgIGphdmEvCisgICAgICByZXNvdXJjZXMvCisgICAgICAgIC4uLgorICAgIHNpdGUvICAgICAgICAgICAgU2l0ZSBEb2N1bWVudGF0aW9uCisgICAgICBhcHQvICAgICAgICAgICAgIERvY3MgaW4gQVBUIEZvcm1hdAorICAgICAgICBpbmRleC5hcHQKKyAgICAgICAgLi4uCisgICAgICB4ZG9jLyAgICAgICAgICAgIERvY3MgaW4gWERPQyBGb3JtYXQKKyAgICAgICAgaW5kZXgueG1sCisgICAgICAgIC4uLgorICAgICAgcmVzb3VyY2VzLworICAgICAgICBpbWFnZXMvCisgICAgICBzaXRlLnhtbCAgICAgICAgIE1lbnUgU3RydWN0dXJlCisKKyAgdGFyZ2V0LyAgICAgICAgICBCdWlsZCBSZXN1bHRzIChiaW5hcmllcywgZG9jcyBhbmQgcGFja2FnZXMpCisgICAgLi4uCisKKyAgTElDRU5TRS50eHQKKyAgUkVBRE1FLnR4dAorICBwb20ueG1sICAgICAgICAgIFByb2plY3QgT2JqZWN0IE1vZGVsIChQT00pCisgICAgICA8L3NvdXJjZT4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgQ29tbWFuZHMiPgorICAgIDxwPlRoZXJlIGFyZSBmZXcgc3RhbmRhcmQgY29tbWFuZHMgdGhhdCBkZXZlbG9wZXJzIHdpbGwgdXNlIG9uIGEgZGFpbHkgYmFzaXMgCisgICAgYW5kIHRoZXkgYXJlIHJlbGF0ZWQgdG8gYnVpbGRpbmcgYW5kIGNsZWFuaW5nIGEgcHJvamVjdC48L3A+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGQgYSBQcm9qZWN0Ij4KKyAgICAgIDxwPkJ1aWxkIHRoZSBwcm9qZWN0J3MgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgCisgICAgICBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gY29tcGlsZQorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCB3aWxsIGdlbmVyYXRlIHRoZSBhcnRpZmFjdHMgaW4gdGhlIDxpPnRhcmdldC88L2k+IAorICAgICAgZGlyZWN0b3J5LjwvcD4gICAgICAKKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iSW5zdGFsbCBhIFByb2plY3QiPgorICAgICAgPHA+SW5zdGFsbCB0aGUgcHJvamVjdCdzIGFydGlmYWN0cyBsb2NhbGx5IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gaW5zdGFsbAorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5QcmlvciB0byBpbnN0YWxsYXRpb24sIHRoZSBhYm92ZSBjb21tYW5kIHdpbGwgY29tcGlsZSB0aGUgc291cmNlIGNvZGUsIAorICAgICAgaWYgbmVjZXNzYXJ5LCBhbmQgZXhlY3V0ZSB0aGUgdW5pdCB0ZXN0cy4gVGhlIHJlc3VsdCBvZiB0aGUgYWJvdmUgY29tbWFuZCAKKyAgICAgIGlzIHRvIGluc3RhbGwgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHMgKGUuZy4gcG9tLCBqYXIsIGV0Yy4pIGluIHRoZSB1c2VyJ3MgCisgICAgICBsb2NhbCBNYXZlbiByZXBvc2l0b3J5ICgkSE9NRS8ubTIvcmVwb3NpdG9yeS8pLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSAKKyAgICAgIGFydGlmYWN0IGlzIGEgZGVwZW5kZW5jeSBmb3IgYW5vdGhlciBwcm9qZWN0IGJ1dCBoYXMgeWV0IHRvIGJlIGRlcGxveWVkIAorICAgICAgdG8gdGhlIE1hdmVuIHJlcG9zaXRvcnkuPC9wPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJQYWNrYWdlIGEgUHJvamVjdCI+CisgICAgICA8cD5DcmVhdGUgdGhlIHByb2plY3QncyBkaXN0cmlidXRpb24gcGFja2FnZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIHBhY2thZ2UKKyAgICAgIDwvc291cmNlPgorICAgICAgPHA+UHJpb3IgdG8gcGFja2FnZSBjcmVhdGlvbiwgdGhlIGFib3ZlIGNvbW1hbmQgd2lsbCBjb21waWxlIHRoZSBzb3VyY2UgCisgICAgICBjb2RlLCBpZiBuZWNlc3NhcnksIGFuZCBleGVjdXRlIHRoZSB1bml0IHRlc3RzLiBUaGUgYWJvdmUgY29tbWFuZCB3aWxsIAorICAgICAgY3JlYXRlIHRoZSBwYWNrYWdlKHMpIGluIHRoZSB0YXJnZXQvIGRpcmVjdG9yeS48L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkJ1aWxkIGEgUHJvamVjdCdzIFdlYiBTaXRlIj4KKyAgICAgIDxwPkJ1aWxkIHRoZSBwcm9qZWN0J3Mgd2ViIHNpdGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBzaXRlCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlRoZSBhYm92ZSBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIHdlYiBzaXRlIGluIHRoZSA8aT50YXJnZXQvc2l0ZS88L2k+CisgICAgICBkaXJlY3RvcnkuIFZpZXcgdGhlIHNpdGUgYnkgcG9pbnRpbmcgeW91ciB3ZWIgYnJvd3NlciBhdCB0aGUgCisgICAgICA8aT5pbmRleC5odG1sPC9pPiBmaWxlIHdpdGhpbiB0aGF0IGRpcmVjdG9yeS48L3A+CisgICAgPC9zdWJzZWN0aW9uPiAKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJDbGVhbiBhIFByb2plY3QiPgorICAgICAgPHA+Q2xlYW4gb3V0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBvZiBnZW5lcmF0ZWQgYXJ0aWZhY3RzIHdpdGggdGhlIAorICAgICAgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBjbGVhbgorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCB3aWxsIHJlbW92ZSB0aGUgPGk+dGFyZ2V0LzwvaT4gZGlyZWN0b3J5IGFuZCBpdHMgCisgICAgICBjb250ZW50cy48L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IlVzZWZ1bCBDb21tYW5kIEFyZ3VtZW50cyI+CisgICAgICA8cD5UaGVyZSBhIGNvdXBsZSBvZiB1c2VmdWwgYXJndW1lbnRzIHdoaWNoIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgCisgICAgICBjb21tYW5kcyBhYm92ZSB0byBsaW1pdCB0aGUgc2NvcGUgb2YgdGhlIGNvbW1hbmQuPC9wPgorICAgICAgPHA+SW4gb3JkZXIgdG8gc2tpcCB1bml0IHRlc3QgZXhlY3V0aW9uLCBhZGQgdGhlIGZvbGxvd2luZyBhcmd1bWVudDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIFtjb21tYW5kXSAtRG1hdmVuLnRlc3Quc2tpcD10cnVlCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlRoZSBhYm92ZSBjb21tYW5kIGlzIG1vc3QgdXNlZnVsIHdpdGggdGhlIDxpPmluc3RhbGw8L2k+LCAKKyAgICAgIDxpPnBhY2thZ2U8L2k+IGFuZCA8aT5zaXRlPC9pPiBjb21tYW5kcy48L3A+CisgICAgICA8cD5XaGVuIGEgcHJvamVjdCBoYXMgbW9kdWxlcyBkZWZpbmVkIGluIHRoZSBQT00sIHRoZSBjb21tYW5kIGNhbiBiZSAKKyAgICAgIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgbW9kdWxlcyBieSAKKyAgICAgIGFkZGluZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50OjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gW2NvbW1hbmRdIC0tbm9uLXJlY3Vyc2l2ZQorICAgICAgPC9zb3VyY2U+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBuYW1lPSJBY2tub3dsZWRnbWVudHMiPgorICAgICAgPHA+TXVjaCBvZiB0aGUgbWF0ZXJpYWwgaW4gdGhpcyBNYXZlbiBndWlkZSB3YXMgb3JpZ2luYWxseSBhdXRob3JlZCAKKyAgICAgIGJ5IFNlYW4gSGFyZG1hbiB1bmRlciB0aGUgc3BvbnNvcnNoaXAgb2YgTkFTQSBKZXQgUHJvcHVsc2lvbiAKKyAgICAgIExhYm9yYXRvcnkncyBQbGFuZXRhcnkgRGF0YSBTeXN0ZW0uIDwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iUmVmZXJlbmNlcyI+CisgICAgICA8cD5IZXJlIGlzIGEgbGlzdCBvZiBNYXZlbiByZXNvdXJjZXM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL2luZGV4Lmh0bWwiPk9ubGluZSAKKyAgICAgICAgRG9jdW1lbnRhdGlvbiBJbmRleDwvYT48L2xpPgorICAgICAgPC91bD4KKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3hkb2MvdXNlci9hZHZhbmNlZC54bWwgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3hkb2MvdXNlci9hZHZhbmNlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkM2FkNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcHVzaHB1bGwvc3JjL3NpdGUveGRvYy91c2VyL2FkdmFuY2VkLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgIDxwcm9wZXJ0aWVzPgorICAgICAgPHRpdGxlPkNBUyBQdXNoIFB1bGwgVXNlciBHdWlkZTwvdGl0bGU+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmUgV29vbGxhcmQ8L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj5UaGlzIGRvY3VtZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlb3JnYW5pemVkIGFzCisgICAgICBwYXJ0IG9mIG91ciBvbmdvaW5nIGRvY3VtZW50YXRpb24gZWZmb3J0LiBQbGVhc2UgY2hlY2sgYmFjayBmb3IgdXBkYXRlcy48L2Rpdj4gIAorICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgCisgICAgICA8cD5JbiB0aGUgQ0FTIFB1c2ggUHVsbCBGcmFtZXdvcmsgQWR2YW5jZWQgVXNlciBHdWlkZSwgd2Ugd2lsbCBjb3ZlciBhIG51bWJlciBvZiAKKyAgICAgIGFkdmFuY2VkIHRvcGljcyByZWxhdGVkIHRvIHVzaW5nIHRoZSBzeXN0ZW0sIGluY2x1ZGluZyBzaXR1YXRpb25zCisgICAgICB0aGF0IGhhdmUgYXJpc2VuIGluIHRoZSBhdXRob3JzJyBleHBlcmllbmNlcy4gQmFzaWMKKyAgICAgIGNvbmNlcHRzLCBzdWNoIGFzIGluc3RhbGxhdGlvbiBhbmQgY29uZmlndXJhdGlvbiwgY2FuIGJlIGZvdW5kIGluIHRoZSAKKyAgICAgIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+QmFzaWMgVXNlciBHdWlkZTwvYT4uPC9wPgorICAgICAgCisgICAgICA8cD5UaGUgcmVtYWluZGVyIG9mIHRoaXMgZ3VpZGUgaXMgc2VwYXJhdGVkIGludG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8L3A+CisgICAgICA8dWw+CisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjEiPlRCRDwvYT48L2xpPgorICAgICAgPC91bD4KKyAgICAgIAorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMSIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iVEJEIj4KKyAgICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICA8L2JvZHk+Cis8L2RvY3VtZW50PiAKZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL3NpdGUveGRvYy91c2VyL2Jhc2ljLnhtbCBiLzAuMTAvcHVzaHB1bGwvc3JjL3NpdGUveGRvYy91c2VyL2Jhc2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVlM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS94ZG9jL3VzZXIvYmFzaWMueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAgPHByb3BlcnRpZXM+CisgICAgICA8dGl0bGU+Q0FTIFB1c2ggUHVsbCBVc2VyIEd1aWRlPC90aXRsZT4KKyAgICAgIDxhdXRob3IgZW1haWw9IkNocmlzLk1hdHRtYW5uQGpwbC5uYXNhLmdvdiI+Q2hyaXMgTWF0dG1hbm48L2F1dGhvcj4KKyAgICAgIDxhdXRob3IgZW1haWw9Indvb2xsYXJkQGpwbC5uYXNhLmdvdiI+RGF2ZSBXb29sbGFyZDwvYXV0aG9yPgorICAgPC9wcm9wZXJ0aWVzPgorCisgICA8Ym9keT4KKyAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPlRoaXMgZG9jdW1lbnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVvcmdhbml6ZWQgYXMKKyAgICAgIHBhcnQgb2Ygb3VyIG9uZ29pbmcgZG9jdW1lbnRhdGlvbiBlZmZvcnQuIFBsZWFzZSBjaGVjayBiYWNrIGZvciB1cGRhdGVzLjwvZGl2PgorICAgICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgCisgICAgICA8cD5UaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhIGJhc2ljIHVzZXIncyBndWlkZSBmb3IgdGhlIENBUyBQdXNoIFB1bGwgRnJhbWV3b3JrCisgICAgICBwcm9qZWN0LiBUaGUgZ29hbCBvZiB0aGUgZG9jdW1lbnQgaXMgdG8gYWxsb3cgdXNlcnMgdG8gY2hlY2sgb3V0LCBidWlsZCwgYW5kIAorICAgICAgaW5zdGFsbCBhIGJhc2UgdmVyc2lvbiBvZiB0aGUgQ0FTIFB1c2ggUHVsbCBGcmFtZXdvcmsgYXMgd2VsbCBhcyBwZXJmb3JtIGJhc2ljIAorICAgICAgY29uZmlndXJhdGlvbiB0YXNrcy4gRm9yIGFkdmFuY2VkIHRvcGljcywgcGxlYXNlIHNlZSBvdXIgCisgICAgICA8YSBocmVmPSIuLi91c2VyL2FkdmFuY2VkLmh0bWwiPkFkdmFuY2VkIEd1aWRlLjwvYT48L3A+CisgICAgICAKKyAgICAgIDxwPlRoZSByZW1haW5kZXIgb2YgdGhpcyBndWlkZSBpcyBzZXBhcmF0ZWQgaW50byB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjwvcD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMSI+VEJEPC9hPjwvbGk+CisgICAgICA8L3VsPgorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgICAgIDxhIG5hbWU9InNlY3Rpb24xIi8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJUQkQiPgorICAgICAgPHA+Q29taW5nIFNvb24uLi48L3A+CisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgIDwvYm9keT4KKzwvZG9jdW1lbnQ+IApkaWZmIC0tZ2l0IGEvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS94ZG9jL3VzZXIvaW5kZXgueG1sIGIvMC4xMC9wdXNocHVsbC9zcmMvc2l0ZS94ZG9jL3VzZXIvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2M5MTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy9zaXRlL3hkb2MvdXNlci9pbmRleC54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgICA8cHJvcGVydGllcz4KKyAgICAgIDx0aXRsZT5DQVMgUHVzaCBQdWxsIEZyYW1ld29yayBVc2VyIEd1aWRlPC90aXRsZT4KKyAgICAgIDxhdXRob3IgZW1haWw9IkNocmlzLk1hdHRtYW5uQGpwbC5uYXNhLmdvdiI+Q2hyaXMgTWF0dG1hbm48L2F1dGhvcj4KKyAgICAgIDxhdXRob3IgZW1haWw9Indvb2xsYXJkQGpwbC5uYXNhLmdvdiI+RGF2ZSBXb29sbGFyZDwvYXV0aG9yPgorICAgPC9wcm9wZXJ0aWVzPgorCisgICA8Ym9keT4KKyAgCisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj5UaGlzIGRvY3VtZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlb3JnYW5pemVkIGFzCisgICAgICBwYXJ0IG9mIG91ciBvbmdvaW5nIGRvY3VtZW50YXRpb24gZWZmb3J0LiBQbGVhc2UgZm9sbG93IHRoZSBsaW5rcyBiZWxvdyB0byBmaW5kCisgICAgICBpbmZvcm1hdGlvbiB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gaG9zdGVkIG9uIHRoaXMgcGFnZS48L2Rpdj4KKyAKKworICAgICAgPHA+V2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHVwZ3JhZGluZyBPT0RUIGRvY3VtZW50YXRpb24uIEluIHRoZSBuZWFyCisgICAgICBmdXR1cmUsIHdlIGhvcGUgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgZGV2ZWxvcGVycyByZWdhcmRpbmcgZWFjaCAKKyAgICAgIGNvbXBvbmVudCwgaW5jbHVkaW5nIGl0cyBwdXJwb3NlLCBzdHJ1Y3R1cmUsIGludGVyZmFjZXMsIGFuZCAKKyAgICAgIGNvbmZpZ3VyYXRpb24gcG9pbnRzIGluIGEgPGEgaHJlZj0iLi4vZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLmh0bWwiPkRldmVsb3BlcgorICAgICAgR3VpZGUuPC9hPjwvcD4KKyAgICAgIAorICAgICAgPHA+SW5mb3JtYXRpb24gZm9yIHVzZXJzLCBpbmNsdWRpbmcgaW5zdGFsbGF0aW9uIGFuZCBiYXNpYyBjb25maWd1cmF0aW9uLAorICAgICAgYXMgd2VsbCBhcyBleGFtcGxlIHVzYWdlIGFyZSBwcm92aWRlZCBpbiBhIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9iYXNpYy5odG1sIj5CYXNpYyBVc2VyIEd1aWRlLjwvYT4gQWR2YW5jZWQgdG9waWNzLCBsaWtlCisgICAgICBsb29rIGFuZCBmZWVsLCBsZXNzb25zLWxlYXJuZWQsIGFuZCBiZXN0IHByYWN0aWNlcyBhcmUgcHJvdmlkZWQgaW4gYW4KKyAgICAgIDxhIGhyZWY9Ii4uL3VzZXIvYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgVXNlciBHdWlkZS48L2E+PC9wPgorICAgICAgCisgICAgICA8cD5GaW5hbGx5LCB3ZSBhcmUgcGxhbm5pbmcgdG8gcHJvdmlkZSBhIG51bWJlciBvZiBjYXNlIHN0dWRpZXMgaW4gdGhlIAorICAgICAgZnV0dXJlLCBpbiB3aGljaCBtdWx0aS1jb21wb25lbnQgZGVwbG95bWVudHMgYXJlIGNvbmZpZ3VyZWQgdG8gaGFuZGxlCisgICAgICBjb21tb24gZGF0YSBhbmQgY29tcHV0YXRpb24gbWFuYWdlbWVudCBzY2VuYXJpb3MuPC9wPiAKKworICAgPC9ib2R5PgorPC9kb2N1bWVudD4gCmRpZmYgLS1naXQgYS8wLjEwL3B1c2hwdWxsL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0dlbmVyaWNFbWFpbFBhcnNlclRlc3QuamF2YSBiLzAuMTAvcHVzaHB1bGwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wdXNocHVsbC9maWxlcmVzdHJpY3Rpb25zL3BhcnNlcnMvR2VuZXJpY0VtYWlsUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOThjODcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy90ZXN0L29yZy9hcGFjaGUvb29kdC9jYXMvcHVzaHB1bGwvZmlsZXJlc3RyaWN0aW9ucy9wYXJzZXJzL0dlbmVyaWNFbWFpbFBhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wdXNocHVsbC5maWxlcmVzdHJpY3Rpb25zLnBhcnNlcnM7CisKKy8vIEpVbml0IHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworCisvLyBKREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisvLyBPT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnB1c2hwdWxsLmV4Y2VwdGlvbnMuUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5GaWxlUmVzdHJpY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHVzaHB1bGwuZmlsZXJlc3RyaWN0aW9ucy5WaXJ0dWFsRmlsZVN0cnVjdHVyZTsKKworLy8gSlVuaXQgaW1wb3J0cworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIEdlbmVyaWNFbWFpbFBhcnNlcn0uCisgKgorICogQGF1dGhvciBiZm9zdGVyQGFwYWNoZS5vcmcgKEJyaWFuIEZvc3RlcikKKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEdlbmVyaWNFbWFpbFBhcnNlclRlc3QgeworCisgIHByaXZhdGUgRmlsZSBlbWFpbEZpbGU7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgIGVtYWlsRmlsZSA9IG5ldyBGaWxlKENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKCJUZXN0RW1haWwudHh0IikudG9VUkkoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0VtYWlsUGFyc2VyKCkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBHZW5lcmljRW1haWxQYXJzZXIgcGFyc2VyID0gbmV3IEdlbmVyaWNFbWFpbFBhcnNlcigKKyAgICAgICAgIldhdiBGaWxlOiAoW15cXHNdKykiLCAiRGVhciBMb3VzeSBDdXN0b21lciwiLCBudWxsKTsKKyAgICBWaXJ0dWFsRmlsZVN0cnVjdHVyZSB2ZnMgPSBwYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShlbWFpbEZpbGUpLCBuZXcgTWV0YWRhdGEoKSk7CisgICAgTGlzdDxTdHJpbmc+IGZpbGVQYXRocyA9IEZpbGVSZXN0cmljdGlvbnMudG9TdHJpbmdMaXN0KHZmcy5nZXRSb290VmlydHVhbEZpbGUoKSk7CisgICAgYXNzZXJ0VGhhdChmaWxlUGF0aHMuc2l6ZSgpLCBNYXRjaGVycy5pcygxKSk7CisgICAgYXNzZXJ0VGhhdChmaWxlUGF0aHMuZ2V0KDApLCBNYXRjaGVycy5pcygiL3NvbWUvcGF0aC90by9hL3dhdi9maWxlLndhdiIpKTsKKyAgfQorCisgIEBUZXN0IChleHBlY3RlZCA9IFBhcnNlckV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEZhaWxlZFZhbGlkRW1haWxDaGVjaygpIHRocm93cyBQYXJzZXJFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgR2VuZXJpY0VtYWlsUGFyc2VyIHBhcnNlciA9IG5ldyBHZW5lcmljRW1haWxQYXJzZXIoCisgICAgICAgICJXYXYgRmlsZTogKFteXFxzXSspIiwgIlBocmFzZSBOb3QgRm91bmQiLCBudWxsKTsKKyAgICBwYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShlbWFpbEZpbGUpLCBuZXcgTWV0YWRhdGEoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcHVzaHB1bGwvc3JjL3Rlc3QvcmVzb3VyY2VzL1Rlc3RFbWFpbC50eHQgYi8wLjEwL3B1c2hwdWxsL3NyYy90ZXN0L3Jlc291cmNlcy9UZXN0RW1haWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWE3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3B1c2hwdWxsL3NyYy90ZXN0L3Jlc291cmNlcy9UZXN0RW1haWwudHh0CkBAIC0wLDAgKzEsMTYgQEAKKworRGVhciBMb3VzeSBDdXN0b21lciwKKworWW91ciBmaWxlIGlzIHJlYWR5IHRvIGRvd25sb2FkLgorCitGaWxlIHNpemU6IDEyMzQ1CisKK1dhdiBGaWxlOiAvc29tZS9wYXRoL3RvL2Evd2F2L2ZpbGUud2F2CisKK01EQiBIYXNoIEZpbGU6IC9zb21lL3BhdGgvdG8vYS9tZDUvZmlsZS5tZDUKKworVGhhbmtzIQorRmlsZXMtUi1VcworCitQUworWW91IG9ubHkgZ2V0IHRoaXMgbm90aWZpY2F0aW9uIG9uY2Ugc28gZG93bmxvYWQgbm93ISEhISEKZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2UvcG9tLnhtbCBiLzAuMTAvcmVzb3VyY2UvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTE1YTVmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9wb20ueG1sCkBAIC0wLDAgKzEsMTY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5jYXMtcmVzb3VyY2U8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkNhdGFsb2cgYW5kIEFyY2hpdmUgUmVzb3VyY2UgTWFuYWdlbWVudCBDb21wb25lbnQ8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UaGUgcmVzb3VyY2UgbWFuYWdlbWVudCBjb21wb25lbnQgb2YgYSBDYXRhbG9nIGFuZCBBcmNoaXZlIFNlcnZpY2UuIFRoaXMgY29tcG9uZW50CisgICAgIHByb3ZpZGVzIGpvYiBtYW5hZ2VtZW50LCBhbmQgbWFuYWdlbWVudCBvZiB0aGUgdW5kZXJseWluZyBzb2Z0d2FyZSBzeXN0ZW0gaGFyZHdhcmUKKyAgICAgYW5kIHJlc291cmNlcywgc3VjaCBhcyBkaXNrIHNwYWNlLCBjb21wdXRhdGlvbmFsIHJlc291cmNlcywgYW5kIHNoYXJlZCBpZGVudGl0eS48L2Rlc2NyaXB0aW9uPgorICA8c2NtPgorICAgCTxjb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL3Jlc291cmNlPC9jb25uZWN0aW9uPgorICAgCTxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL3Jlc291cmNlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgCTx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9vb2R0L3RhZ3MvMC4xMC1yYzIvcmVzb3VyY2U8L3VybD4KKyAgPC9zY20+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Zm9ya01vZGU+cGVydGVzdDwvZm9ya01vZGU+CisgICAgICAgICAgPHVzZVN5c3RlbUNsYXNzTG9hZGVyPmZhbHNlPC91c2VTeXN0ZW1DbGFzc0xvYWRlcj4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICA8bmFtZT5qYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZTwvbmFtZT4KKyAgICAgICAgICAgICAgIDx2YWx1ZT4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmxvZ2dpbmcucHJvcGVydGllczwvdmFsdWU+CisgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgPGZvcmtlZFByb2Nlc3NUaW1lb3V0SW5TZWNvbmRzPjA8L2ZvcmtlZFByb2Nlc3NUaW1lb3V0SW5TZWNvbmRzPgorICAgICAgICAgICA8cmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPnRydWU8L3JlZGlyZWN0VGVzdE91dHB1dFRvRmlsZT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QqLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5YbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQ8L21haW5DbGFzcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1tZXRhZGF0YTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wLjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtZGJjcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGJjcDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1wb29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1wb29sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5sdWNlbmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sdWNlbmUtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMC4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zYWZlaGF1cy5qdWc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdWc8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjAuMDwvdmVyc2lvbj4KKyAgICAgIDxjbGFzc2lmaWVyPmFzbDwvY2xhc3NpZmllcj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD54bWxycGM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54bWxycGM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20udGhvdWdodHdvcmtzLnhzdHJlYW08L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54c3RyZWFtPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4zLjE8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8IS0tIHhvbSBpcyBhbiBvcHRpb25hbCBkZXBlbmRlbmN5IG9mIHhzdHJlYW0uIEl0cyBhbHNvIGFuIEFwYWNoZSBpbmNvbXBhdGlibGUgbGljZW5zZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD54b208L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+eG9tPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4gCisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTM3MjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApAQCAtMCwwICsxLDg2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxhc3NlbWJseT4KKyAgPGlkPmRpc3Q8L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICA8YmFzZURpcmVjdG9yeT4ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9iYXNlRGlyZWN0b3J5PgorICA8aW5jbHVkZVNpdGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVTaXRlRGlyZWN0b3J5PgorICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Q0hBTkdFUy50eHQ8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9iaW48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXMvPgorICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5sb2dzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFTU9WRS5sb2c8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXRjPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPnJlc291cmNlLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPmxvZ2dpbmcucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5wb2xpY3k8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+Y21kLWxpbmUtYWN0aW9ucy54bWw8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPmNtZC1saW5lLW9wdGlvbnMueG1sPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zaXRlL2FwaWRvY3M8L2RpcmVjdG9yeT4KKyAgICAgIDxmaWx0ZXJlZD5mYWxzZTwvZmlsdGVyZWQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGV4Y2x1ZGVzLz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+CisgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+CisgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPnRydWU8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+CisgICAgICA8dW5wYWNrT3B0aW9ucy8+CisgICAgPC9kZXBlbmRlbmN5U2V0PgorICA8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vYmluL2JhdGNoX3N0dWIgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2Jpbi9iYXRjaF9zdHViCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDc3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2Jpbi9iYXRjaF9zdHViCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi90Y3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisjICRJZCQgCisjCisKK3NldCBESVIgPSBgZGlybmFtZSAkMGAKK2NkICRESVIKK3NldCBESVJfUEFUSCA9IGBwd2RgCisKK2lmICggJCNhcmd2ICE9IDEgKSB0aGVuCisgICAgICAgIGVjaG8gIlVzYWdlOiAkMCA8cG9ydD4iCisgICAgICAgIGV4aXQgMQorZWxzZQorICAgICAgICBqYXZhIC1EamF2YS5leHQuZGlycz0uLi9saWIgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnRhc2subWV0a2V5cy5sZWdhY3lNb2RlPSJ0cnVlIiBcCisJLURvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS50YXNrLnN0YXR1cy5sZWdhY3lNb2RlPSJ0cnVlIiBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLmV4dGVybi5YbWxScGNCYXRjaFN0dWIgXAorICAgICAgICAtLXBvcnROdW0gJDEmCitlbmRpZgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9iaW4vcmVtb3RlIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9iaW4vcmVtb3RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDYzNTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2Jpbi9yZW1vdGUKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgU2NyaXB0IHRvIHJ1biBhIGNvbW1hbmQgb24gYWxsIG5vZGVzIHNwZWNpZmllZCBpbiBhIG5vZGVzLnhtbCBjb25maWcgZmlsZQorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorIworIyAkSWQkCisKK0VfTk9fQVJHUz02NQorCitpZiBbICQjIC1lcSAwIF0KK3RoZW4KKyAgZWNobyAiVXNhZ2U6IHJlbW90ZSAvcGF0aC90by9ub2Rlcy54bWwgY29tbWFuZC4uLiIKKyAgZXhpdCAkRV9OT19BUkdTCitmaSAKKworTk9ERVM9JChhd2sgJy88bm9kZS8ge3ByaW50IHN1YnN0cigkMywgMTIsbGVuZ3RoKCQzKS0xMil9JyAkMSkKK3NoaWZ0IAorZm9yIE5PREUgaW4gJE5PREVTCitkbworICBzc2ggJE5PREUgJCIke0AvLyAvXFwgfSIgMj4mMSB8IHNlZCAicy9eLyROT0RFOiAvIiAmCitkb25lCisKK2V4aXQgMCAKZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vYmluL3Jlc21nciBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vYmluL3Jlc21ncgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIyNjEzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9iaW4vcmVzbWdyCkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9zaAorIworIyBpbml0IHNjcmlwdCBmb3IgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyCisjCisjIGNoa2NvbmZpZzogMzQ1IDg4IDIyCisjIGRlc2NyaXB0aW9uOiBDQVMgUmVzb3VyY2UgTWFuYWdlcgorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorIworIyAkSWQkCisKK1sgLWYgL2V0Yy9zeXNjb25maWcvamF2YSBdICYmIC4gL2V0Yy9zeXNjb25maWcvamF2YQorI1sgLWYgL2V0Yy9zeXNjb25maWcvY2FzLWZpbGVtZ3JdICYmIC4gL2V0Yy9zeXNjb25maWcvY2FzLWZpbGVtZ3IKKworU0VSVkVSX1BPUlQ9OTAwMgorZXhwb3J0IFNFUlZFUl9QT1JUCitpZiBbIC16ICRKQVZBX0hPTUUgXSA7IHRoZW4KKwlKQVZBX0hPTUU9L3BhdGgvdG8vamF2YS9ob21lCitlbHNlCisJSkFWQV9IT01FPSR7SkFWQV9IT01FfQorZmkKKworZXhwb3J0IEpBVkFfSE9NRQorQ0FTX1JFU01HUl9IT01FPS4uCitleHBvcnQgQ0FTX1JFU01HUl9IT01FCitSVU5fSE9NRT0ke0NBU19SRVNNR1JfSE9NRX0vLi4vcnVuCitleHBvcnQgUlVOX0hPTUUKK0NBU19SRVNNR1JfUFJPUFM9Li4vZXRjL3Jlc291cmNlLnByb3BlcnRpZXMKK2V4cG9ydCBDQVNfUkVTTUdSX1BST1BTCisKK1BBVEg9JHtKQVZBX0hPTUV9L2Jpbjoke0NBU19SRVNNR1JfSE9NRX0vYmluOi91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluCitleHBvcnQgUEFUSAorCisjIFNlZSBob3cgd2Ugd2VyZSBjYWxsZWQuCitjYXNlICIkMSIgaW4KKyAgc3RhcnQpCisgICAgICAgIGVjaG8gLW4gIlN0YXJ0aW5nIGNhcyByZXNvdXJjZSBtYW5hZ2VyOiAiCisgICAgICAgICRKQVZBX0hPTUUvYmluL2phdmEgLURqYXZhLmV4dC5kaXJzPSR7Q0FTX1JFU01HUl9IT01FfS9saWIgXAorICAgICAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSR7Q0FTX1JFU01HUl9IT01FfS9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnByb3BlcnRpZXM9JHtDQVNfUkVTTUdSX1BST1BTfSBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLlhtbFJwY1Jlc291cmNlTWFuYWdlciAtLXBvcnROdW0gJFNFUlZFUl9QT1JUICYgICAgICAgCisgICAgICAgIGVjaG8gJCEgPiR7UlVOX0hPTUV9L2Nhcy5yZXNtZ3IucGlkIAorICAgICAgICBlY2hvICJPSyIKKyAgICAgICAgc2xlZXAgNQorICAgICAgICA7OworICBzdG9wKQorICAgICAgICBlY2hvIC1uICJTaHV0dGluZyBkb3duIGNhcyByZXNvdXJjZSBtYW5hZ2VyOiAiCisgICAgICAgIGtpbGwgYGNhdCAke1JVTl9IT01FfS9jYXMucmVzbWdyLnBpZGAKKyAgICAgICAgZWNobyAiT0siCisgICAgICAgIDs7CisgIHJlc3RhcnQpCisgICAgICAgICQwIHN0b3AKKyAgICAgICAgJDAgc3RhcnQKKyAgICAgICAgOzsKKyAgKikKKyAgICAgICAgZWNobyAiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHJlc3RhcnR9IgorICAgICAgICBleGl0IDEKK2VzYWMKKworZXhpdCAwCmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2Jpbi9yZXNtZ3ItY2xpZW50IGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9iaW4vcmVzbWdyLWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RiZDNkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9iaW4vcmVzbWdyLWNsaWVudApAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyMKKyMgJElkJAorCisKK2lmIFsgLXogJEpBVkFfSE9NRSBdIDsgdGhlbgorCUpBVkFfSE9NRT0vcGF0aC90by9qYXZhL2hvbWUKK2Vsc2UKKwlKQVZBX0hPTUU9JHtKQVZBX0hPTUV9CitmaQorCitleHBvcnQgSkFWQV9IT01FCisKKyRKQVZBX0hPTUUvYmluL2phdmEgXAorICAgICAgICAtRGphdmEuZXh0LmRpcnM9Li4vbGliIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnByb3BlcnRpZXM9Li4vZXRjL3Jlc291cmNlLnByb3BlcnRpZXMgXAorICAgICAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPS4uL2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnPS4uL3BvbGljeS9jbWQtbGluZS1hY3Rpb25zLnhtbCBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnNwcmluZy5jb25maWc9Li4vcG9saWN5L2NtZC1saW5lLW9wdGlvbnMueG1sIFwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0uWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50ICQqCmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9CYXRjaG1nci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvQmF0Y2htZ3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIzOTljCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvQmF0Y2htZ3IuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLkpvYlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CisKKy8vamF2YSBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGJhdGNobWdyIGludGVyZmFjZS4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhdGNobWdyIHsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgam9iIHJlbW90ZWx5IG9uIHRoZSBzcGVjaWZpZWQgPGNvZGU+cmVtb3RlSG9zdDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGpvYgorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBKb2JTcGVjfSB0byBleGVjdXRlLgorICAgICAqIEBwYXJhbSByZW1vdGVIb3N0CisgICAgICogICAgICAgICAgICBBIHtAbGluayBVUkx9IHBvaW50ZXIgdG8gdGhlIHJlbW90ZSBob3N0IHRvIGV4ZWN1dGUgdGhlIGpvYgorICAgICAqICAgICAgICAgICAgb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBqb2IgZXhlY3V0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gZXhlY3V0aW5nIHRoZSBqb2Igb24gdGhlIHJlbW90ZQorICAgICAqICAgICAgICAgICAgIGhvc3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVJlbW90ZWx5KEpvYlNwZWMgam9iLCBSZXNvdXJjZU5vZGUgcmVzTm9kZSkKKyAgICAgICAgICAgIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB7QGxpbmsgTW9uaXRvcn0gdG8gYmUgdXNlZCBieSB0aGlzIEJhdGNobWdyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtb25pdG9yCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIE1vbml0b3J9IHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9uaXRvcihNb25pdG9yIG1vbml0b3IpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIEpvYlJlcG9zaXRvcnl9IHRoYXQgdGhpcyBCYXRjaG1nciB3aWxsIHVzZSB0byBwZXJzaXN0CisgICAgICoge0BsaW5rIEpvYn0gaW5mb3JtYXRpb24gd2hpbGUge0BsaW5rIEpvYn1zIGFyZSBleGVjdXRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcG9zaXRvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JSZXBvc2l0b3J5KEpvYlJlcG9zaXRvcnkgcmVwb3NpdG9yeSk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGpvYklkCisgICAgICogQHBhcmFtIG5vZGUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4ga2lsbEpvYihTdHJpbmcgam9iSWQsIFJlc291cmNlTm9kZSBub2RlKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iSWQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRpb25Ob2RlKFN0cmluZyBqb2JJZCk7CisgICAgCisgICAgLyoqCisgICAgICogR2V0IGEgbGlzdCBvZiB0aGUgaWRzIG9mIGFsbCBqb2JzIHRoYXQgYXJlIGV4ZWN1dGluZyBvbiB0aGUgZ2l2ZW4gbm9kZS4gCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgaWRzIG9mIGpvYnMgb24gdGhlIGdpdmVuIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRKb2JzT25Ob2RlKFN0cmluZyBub2RlSWQpOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9CYXRjaG1nckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL0JhdGNobWdyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWExZjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9CYXRjaG1nckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTaW1wbGVCYXRjaG1nci4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhdGNobWdyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBAcmV0dXJuIEEgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQmF0Y2htZ3J9IGludGVyZmFjZS4KKwkgKi8KKwlwdWJsaWMgQmF0Y2htZ3IgY3JlYXRlQmF0Y2htZ3IoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL1htbFJwY0JhdGNoTWdyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9YbWxScGNCYXRjaE1nci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2NjOTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9YbWxScGNCYXRjaE1nci5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLkpvYlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYlJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuTW9uaXRvckV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBYTUwtUlBDIGludGVyZmFjZSB0byB0aGUgYmF0Y2ggbWFuYWdlci4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIFhtbFJwY0JhdGNoTWdyIGltcGxlbWVudHMgQmF0Y2htZ3IgeworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoWG1sUnBjQmF0Y2hNZ3IuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBNb25pdG9yIG1vbjsKKworICAgIHByaXZhdGUgSm9iUmVwb3NpdG9yeSByZXBvOworCisgICAgcHJpdmF0ZSBNYXAgbm9kZVRvSm9iTWFwOworCisgICAgcHJpdmF0ZSBNYXAgc3BlY1RvUHJveHlNYXA7CisKKyAgICBwdWJsaWMgWG1sUnBjQmF0Y2hNZ3IoKSB7CisgICAgICAgIG5vZGVUb0pvYk1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHNwZWNUb1Byb3h5TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3IjZXhlY3V0ZVJlbW90ZWx5KG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjLAorICAgICAqICAgICAgamF2YS5uZXQuVVJMKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVSZW1vdGVseShKb2JTcGVjIGpvYlNwZWMsIFJlc291cmNlTm9kZSByZXNOb2RlKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgWG1sUnBjQmF0Y2hNZ3JQcm94eSBwcm94eSA9IG5ldyBYbWxScGNCYXRjaE1nclByb3h5KGpvYlNwZWMsIHJlc05vZGUsCisgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIGlmICghcHJveHkubm9kZUFsaXZlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKb2JFeGVjdXRpb25FeGNlcHRpb24oIk5vZGU6IFsiICsgcmVzTm9kZS5nZXROb2RlSWQoKQorICAgICAgICAgICAgICAgICAgICArICJdIGlzIGRvd246IFVuYWJsZSB0byBleGVjdXRlIGpvYiEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5zcGVjVG9Qcm94eU1hcCkgeworICAgICAgICAgICAgc3BlY1RvUHJveHlNYXAucHV0KGpvYlNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSwgcHJveHkpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzLm5vZGVUb0pvYk1hcCkgeworICAgICAgICAgICAgdGhpcy5ub2RlVG9Kb2JNYXAKKyAgICAgICAgICAgICAgICAgICAgLnB1dChqb2JTcGVjLmdldEpvYigpLmdldElkKCksIHJlc05vZGUuZ2V0Tm9kZUlkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJveHkuc3RhcnQoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3Ijc2V0TW9uaXRvcihvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yKE1vbml0b3IgbW9uaXRvcikgeworICAgICAgICB0aGlzLm1vbiA9IG1vbml0b3I7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3Ijc2V0Sm9iUmVwb3NpdG9yeShvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JSZXBvc2l0b3J5KEpvYlJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgeworICAgICAgICB0aGlzLnJlcG8gPSByZXBvc2l0b3J5OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1nciNnZXRFeGVjdXRpb25Ob2RlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRpb25Ob2RlKFN0cmluZyBqb2JJZCkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgbm9kZVRvSm9iTWFwLmdldChqb2JJZCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyI2tpbGxKb2IoamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGUpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4ga2lsbEpvYihTdHJpbmcgam9iSWQsIFJlc291cmNlTm9kZSBub2RlKSB7CisgICAgICAgIEpvYlNwZWMgc3BlYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzcGVjID0gcmVwby5nZXRKb2JCeUlkKGpvYklkKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBnZXQgam9iIGJ5IGlkOiBbIiArIGpvYklkCisgICAgICAgICAgICAgICAgICAgICsgIl0gdG8ga2lsbCBpdDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFJwY0JhdGNoTWdyUHJveHkgcHJveHkgPSBuZXcgWG1sUnBjQmF0Y2hNZ3JQcm94eShzcGVjLCBub2RlLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHByb3h5LmtpbGxKb2IoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3QgZ2V0Sm9ic09uTm9kZShTdHJpbmcgbm9kZUlkKXsKKyAgICAJVmVjdG9yPFN0cmluZz4gam9iSWRzID0gbmV3IFZlY3RvcigpOworICAgIAkKKyAgICAJaWYodGhpcy5ub2RlVG9Kb2JNYXAuc2l6ZSgpID4gMCl7CisgICAgCQlmb3IoSXRlcmF0b3IgaSA9IHRoaXMubm9kZVRvSm9iTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgIAkJCVN0cmluZyBqb2JJZCA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgCQkJaWYobm9kZUlkLmVxdWFscyh0aGlzLm5vZGVUb0pvYk1hcC5nZXQoam9iSWQpKSl7CisgICAgCQkJCWpvYklkcy5hZGQoam9iSWQpOworICAgIAkJCX0KKyAgICAJCX0KKyAgICAJfQorICAgIAkKKyAgICAJQ29sbGVjdGlvbnMuc29ydChqb2JJZHMpOyAvLyBzb3J0IHRoZSBsaXN0IHRvIHJldHVybiBhcyBhIGNvdXJ0ZXN5IHRvIHRoZSB1c2VyCisgICAgCQorICAgIAlyZXR1cm4gam9iSWRzOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeU1vbml0b3IoUmVzb3VyY2VOb2RlIG5vZGUsIEpvYlNwZWMgam9iU3BlYykgeworICAgICAgICBKb2Igam9iID0gam9iU3BlYy5nZXRKb2IoKTsKKyAgICAgICAgaW50IHJlZHVjZWRMb2FkID0gam9iLmdldExvYWRWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtb24ucmVkdWNlTG9hZChub2RlLCByZWR1Y2VkTG9hZCk7CisgICAgICAgIH0gY2F0Y2ggKE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgam9iU3VjY2VzcyhKb2JTcGVjIHNwZWMpIHsKKyAgICAgICAgc3BlYy5nZXRKb2IoKS5zZXRTdGF0dXMoSm9iU3RhdHVzLlNVQ0NFU1MpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMubm9kZVRvSm9iTWFwKSB7CisgICAgICAgICAgICB0aGlzLm5vZGVUb0pvYk1hcC5yZW1vdmUoc3BlYy5nZXRKb2IoKS5nZXRJZCgpKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuc3BlY1RvUHJveHlNYXApIHsKKyAgICAgICAgICAgIFhtbFJwY0JhdGNoTWdyUHJveHkgcHJveHkgPSAoWG1sUnBjQmF0Y2hNZ3JQcm94eSkgdGhpcy5zcGVjVG9Qcm94eU1hcAorICAgICAgICAgICAgICAgICAgICAucmVtb3ZlKHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3h5ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvLnVwZGF0ZUpvYihzcGVjKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBzZXQgam9iIGNvbXBsZXRpb24gc3RhdHVzIGZvciBqb2I6IFsiCisgICAgICAgICAgICAgICAgICAgICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgam9iRmFpbHVyZShKb2JTcGVjIHNwZWMpIHsKKyAgICAgICAgc3BlYy5nZXRKb2IoKS5zZXRTdGF0dXMoSm9iU3RhdHVzLkZBSUxVUkUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMubm9kZVRvSm9iTWFwKSB7CisgICAgICAgICAgICB0aGlzLm5vZGVUb0pvYk1hcC5yZW1vdmUoc3BlYy5nZXRKb2IoKS5nZXRJZCgpKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuc3BlY1RvUHJveHlNYXApIHsKKyAgICAgICAgICAgIFhtbFJwY0JhdGNoTWdyUHJveHkgcHJveHkgPSAoWG1sUnBjQmF0Y2hNZ3JQcm94eSkgdGhpcy5zcGVjVG9Qcm94eU1hcAorICAgICAgICAgICAgICAgICAgICAucmVtb3ZlKHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3h5ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvLnVwZGF0ZUpvYihzcGVjKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBzZXQgam9iIGNvbXBsZXRpb24gc3RhdHVzIGZvciBqb2I6IFsiCisgICAgICAgICAgICAgICAgICAgICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBqb2JLaWxsZWQoSm9iU3BlYyBzcGVjKSB7CisgICAgICAgIHNwZWMuZ2V0Sm9iKCkuc2V0U3RhdHVzKEpvYlN0YXR1cy5LSUxMRUQpOworICAgICAgICBub2RlVG9Kb2JNYXAucmVtb3ZlKHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvLnVwZGF0ZUpvYihzcGVjKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBzZXR0aW5nIGpvYiBraWxsZWQgc3RhdHVzIGZvciBqb2I6IFsiCisgICAgICAgICAgICAgICAgICAgICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBqb2JFeGVjdXRpbmcoSm9iU3BlYyBzcGVjKSB7CisgICAgICAgIHNwZWMuZ2V0Sm9iKCkuc2V0U3RhdHVzKEpvYlN0YXR1cy5FWEVDVVRFRCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvLnVwZGF0ZUpvYihzcGVjKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBzZXR0aW5nIGpvYiBleGVjdXRpb24gc3RhdHVzIGZvciBqb2I6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcGVjLmdldEpvYigpLmdldElkKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9YbWxScGNCYXRjaE1nckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL1htbFJwY0JhdGNoTWdyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzQ0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9YbWxScGNCYXRjaE1nckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgYmF0Y2htZ3IgZmFjdG9yeS4KKyAqIDwvcD4KKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBYbWxScGNCYXRjaE1nckZhY3RvcnkgaW1wbGVtZW50cyBCYXRjaG1nckZhY3RvcnkgeworCisJcHJpdmF0ZSBNb25pdG9yIG1vbiA9IG51bGw7CisJCisJcHVibGljIFhtbFJwY0JhdGNoTWdyRmFjdG9yeSgpeworCX0KKwkKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3JGYWN0b3J5I2NyZWF0ZUJhdGNobWdyKCkKKwkgKi8KKwlwdWJsaWMgQmF0Y2htZ3IgY3JlYXRlQmF0Y2htZ3IoKSB7CisJCXJldHVybiBuZXcgWG1sUnBjQmF0Y2hNZ3IoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL1htbFJwY0JhdGNoTWdyUHJveHkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL1htbFJwY0JhdGNoTWdyUHJveHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRmMmIyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvWG1sUnBjQmF0Y2hNZ3JQcm94eS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLlhtbFJwY1N0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY0NsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgUnVubmFibGV9IHByb3h5IHRvIGFuIFhtbFJwY0JhdGNoU3R1YiB0aGF0IGFsbG93cyB0aGUgY2FsbCB0byB0aGUKKyAqIFhtbFJwY0JhdGNoU3R1YiB0byBiZSBhc3luY2hyb25vdXMgcmF0aGVyIHRoYW4gc3luY2hyb25vdXMuIFRoaXMgYWxsb3dzIGEKKyAqIHtAbGluayBTY2hlZHVsZXJ9IHRoYXQgY2FsbHMgdGhlIHtAbGluayBYbWxScGNCYXRjaE1ncn0gdG8gbm90IGJlIHN0dWNrCisgKiB3YWl0aW5nIGZvciBlYWNoIGpvYiB0byBjb21wbGV0ZSBiZWZvcmUgc2NoZWR1bGluZyB0aGUgbmV4dCB7QGxpbmsgSm9ifQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFhtbFJwY0JhdGNoTWdyUHJveHkgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihYbWxScGNCYXRjaE1nclByb3h5LmNsYXNzLmdldE5hbWUoKSk7CisJCisgICAgcHJpdmF0ZSBKb2JTcGVjIGpvYlNwZWM7CisKKyAgICBwcml2YXRlIFJlc291cmNlTm9kZSByZW1vdGVIb3N0OworCisgICAgcHJpdmF0ZSBYbWxScGNDbGllbnQgY2xpZW50OworCisgICAgcHJpdmF0ZSBYbWxScGNCYXRjaE1nciBwYXJlbnQ7CisKKyAgICBwdWJsaWMgWG1sUnBjQmF0Y2hNZ3JQcm94eShKb2JTcGVjIGpvYlNwZWMsIFJlc291cmNlTm9kZSByZW1vdGVIb3N0LAorICAgICAgICAgICAgWG1sUnBjQmF0Y2hNZ3IgcGFyKSB7CisgICAgICAgIHRoaXMuam9iU3BlYyA9IGpvYlNwZWM7CisgICAgICAgIHRoaXMucmVtb3RlSG9zdCA9IHJlbW90ZUhvc3Q7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5vZGVBbGl2ZSgpIHsKKyAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0NsaWVudChyZW1vdGVIb3N0LmdldElwQWRkcigpKTsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGl2ZSA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGl2ZSA9ICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoImJhdGNoc3R1Yi5pc0FsaXZlIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFsaXZlID0gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFsaXZlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWxpdmU7CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBraWxsSm9iKCkgeworICAgICAgICBjbGllbnQgPSBuZXcgWG1sUnBjQ2xpZW50KHJlbW90ZUhvc3QuZ2V0SXBBZGRyKCkpOworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNKb2Ioam9iU3BlYy5nZXRKb2IoKSkpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKCJiYXRjaHN0dWIua2lsbEpvYiIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIHBhcmVudC5qb2JLaWxsZWQoam9iU3BlYyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0NsaWVudChyZW1vdGVIb3N0LmdldElwQWRkcigpKTsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjSm9iKGpvYlNwZWMuZ2V0Sm9iKCkpKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoam9iU3BlYy5nZXRJbigpLndyaXRlKCkpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJlbnQuam9iRXhlY3V0aW5nKGpvYlNwZWMpOworICAgICAgICAgICAgcmVzdWx0ID0gKChCb29sZWFuKSBjbGllbnQKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoImJhdGNoc3R1Yi5leGVjdXRlSm9iIiwgYXJnTGlzdCkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIAlwYXJlbnQuam9iU3VjY2Vzcyhqb2JTcGVjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIAl0aHJvdyBuZXcgRXhjZXB0aW9uKCJiYXRjaHN0dWIuZXhlY3V0ZUpvYiByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJKb2IgZXhlY3V0aW9uIGZhaWxlZCBmb3Igam9iSWQgJyIgKyBqb2JTcGVjLmdldEpvYigpLmdldElkKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICBwYXJlbnQuam9iRmFpbHVyZShqb2JTcGVjKTsKKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgcGFyZW50Lm5vdGlmeU1vbml0b3IocmVtb3RlSG9zdCwgam9iU3BlYyk7CisgICAgICAgIH0KKworICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0FkZE5vZGVDbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vQWRkTm9kZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZjNjM2UKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0FkZE5vZGVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBhZGRzIGEgUmVzb3VyY2VOb2RlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEFkZE5vZGVDbGlBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZUNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIG5vZGVJZDsKKyAgIHByaXZhdGUgVVJMIG5vZGVVcmw7CisgICBwcml2YXRlIGludCBjYXBhY2l0eTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChub2RlSWQsICJNdXN0IHNwZWNpZnkgbm9kZUlkIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG5vZGVVcmwsICJNdXN0IHNwZWNpZnkgbm9kZVVybCIpOworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChjYXBhY2l0eSwgIk11c3Qgc3BlY2lmeSBjYXBhY2l0eSIpOworCisgICAgICAgICBnZXRDbGllbnQoKS5hZGROb2RlKG5ldyBSZXNvdXJjZU5vZGUobm9kZUlkLCBub2RlVXJsLCBjYXBhY2l0eSkpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJTdWNjZXNzZnVsbHkgYWRkZWQgbm9kZSEiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGFkZCBub2RlIHdpdGggbm9kZUlkICciCisgICAgICAgICAgICAgICArIG5vZGVJZCArICInLCBub2RlVXJsICciICsgbm9kZVVybCArICInLCBhbmQgY2FwYWNpdHkgJyIKKyAgICAgICAgICAgICAgICsgY2FwYWNpdHkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE5vZGVJZChTdHJpbmcgbm9kZUlkKSB7CisgICAgICB0aGlzLm5vZGVJZCA9IG5vZGVJZDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Tm9kZVVybChVUkwgbm9kZVVybCkgeworICAgICAgdGhpcy5ub2RlVXJsID0gbm9kZVVybDsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Q2FwYWNpdHkoaW50IGNhcGFjaXR5KSB7CisgICAgICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0FkZE5vZGVUb1F1ZXVlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0FkZE5vZGVUb1F1ZXVlQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2MWRkYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vQWRkTm9kZVRvUXVldWVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjaW9ufSB3aGljaCBhZGRzIGEgTm9kZSB0byBhIFF1ZXVlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEFkZE5vZGVUb1F1ZXVlQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBxdWV1ZU5hbWU7CisgICBwcml2YXRlIFN0cmluZyBub2RlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocXVldWVOYW1lLCAiTXVzdCBzcGVjaWZ5IHF1ZXVlTmFtZSIpOworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChub2RlSWQsICJNdXN0IHNwZWNpZnkgbm9kZUlkIik7CisKKyAgICAgICAgIGdldENsaWVudCgpLmFkZE5vZGVUb1F1ZXVlKG5vZGVJZCwgcXVldWVOYW1lKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3VjY2Vzc2Z1bGx5IGFkZGVkIG5vZGUgdG8gcXVldWUhIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgYWRkIG5vZGUgJyIgKyBub2RlSWQKKyAgICAgICAgICAgICAgICsgIicgdG8gcXVldWUgJyIgKyBxdWV1ZU5hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlTmFtZShTdHJpbmcgcXVldWVOYW1lKSB7CisgICAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Tm9kZUlkKFN0cmluZyBub2RlSWQpIHsKKyAgICAgIHRoaXMubm9kZUlkID0gbm9kZUlkOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9BZGRRdWV1ZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9BZGRRdWV1ZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWQ4MjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0FkZFF1ZXVlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGFkZHMgYSBxdWV1ZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRRdWV1ZUNsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgcXVldWVOYW1lOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHF1ZXVlTmFtZSwgIk11c3Qgc3BlY2lmeSBxdWV1ZU5hbWUiKTsKKworICAgICAgICAgZ2V0Q2xpZW50KCkuYWRkUXVldWUocXVldWVOYW1lKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3VjY2Vzc2Z1bGx5IGFkZGVkIHF1ZXVlISIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gYWRkIHF1ZXVlIHdpdGggbmFtZSAnIgorICAgICAgICAgICAgICAgKyBxdWV1ZU5hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlTmFtZShTdHJpbmcgcXVldWVOYW1lKSB7CisgICAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0RXhlY05vZGVDbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0RXhlY05vZGVDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRiZmUyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXRFeGVjTm9kZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgZXhlY3V0aW9uIG5vZGUgZm9yIGEgam9iLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldEV4ZWNOb2RlQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBqb2JJZDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChqb2JJZCwgIk11c3Qgc3BlY2lmeSBqb2JJZCIpOworCisgICAgICAgICBTdHJpbmcgZXhlY05vZGUgPSBnZXRDbGllbnQoKS5nZXRFeGVjdXRpb25Ob2RlKGpvYklkKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiRXhlY3V0aW5nIG5vZGU6ICIgKyBleGVjTm9kZSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZXhlY3V0aW9uIG5vZGUgZm9yIgorICAgICAgICAgICAgICAgKyAiIGpvYiAnIiArIGpvYklkICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRKb2JJZChTdHJpbmcgam9iSWQpIHsKKyAgICAgIHRoaXMuam9iSWQgPSBqb2JJZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0RXhlY1JlcG9ydENsaUFjdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXRFeGVjUmVwb3J0Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkZGQ2MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0RXhlY1JlcG9ydENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBsaXN0IGFsbCBqb2JzIGV4ZWN1dGluZyBhbmQgc2hvd3MgCisgKiB3aGF0IG5vZGVzIGFyZSBleGVjdXRpbmcgdGhvc2Ugam9icyBpbiBhZGRpdGlvbiB0byBxdWV1ZSBuYW1lIGFuZAorICogbG9hZCB2YWx1ZS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2V0RXhlY1JlcG9ydENsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworCSAgU3RyaW5nIHJlcG9ydCA9IGdldENsaWVudCgpLmdldEV4ZWNSZXBvcnQoKTsKKwkgIHByaW50ZXIucHJpbnRsbigiRXhlYyBSZXBvcnQ6ICIpOworCSAgcHJpbnRlci5wcmludGxuKHJlcG9ydCk7CisJICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBleGVjIHJlcG9ydDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldEpvYkluZm9DbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0Sm9iSW5mb0NsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2I0ODAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldEpvYkluZm9DbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3RhdHVzOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldHMgam9iIGluZm8uCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0Sm9iSW5mb0NsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgam9iSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwoam9iSWQsICJNdXN0IHNwZWNpZnkgam9iSWQiKTsKKworICAgICAgICAgSm9iIGpvYkluZm8gPSBnZXRDbGllbnQoKS5nZXRKb2JJbmZvKGpvYklkKTsKKworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJKb2I6IFtpZD0iICsgam9iSWQgKyAiLCBzdGF0dXM9IgorICAgICAgICAgICAgICAgKyBnZXRSZWFkYWJsZUpvYlN0YXR1cyhqb2JJbmZvLmdldFN0YXR1cygpKSArICIsbmFtZT0iCisgICAgICAgICAgICAgICArIGpvYkluZm8uZ2V0TmFtZSgpICsgIixxdWV1ZT0iICsgam9iSW5mby5nZXRRdWV1ZU5hbWUoKQorICAgICAgICAgICAgICAgKyAiLGxvYWQ9IiArIGpvYkluZm8uZ2V0TG9hZFZhbHVlKCkgKyAiLGlucHV0Q2xhc3M9IgorICAgICAgICAgICAgICAgKyBqb2JJbmZvLmdldEpvYklucHV0Q2xhc3NOYW1lKCkgKyAiLGluc3RDbGFzcz0iCisgICAgICAgICAgICAgICArIGpvYkluZm8uZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKSArICJdIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgam9iIGluZm8gZm9yIGpvYiAnIgorICAgICAgICAgICAgICAgKyBqb2JJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Sm9iSWQoU3RyaW5nIGpvYklkKSB7CisgICAgICB0aGlzLmpvYklkID0gam9iSWQ7CisgICB9CisKKyAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWFkYWJsZUpvYlN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgICBpZiAoc3RhdHVzLmVxdWFscyhKb2JTdGF0dXMuU1VDQ0VTUykpIHsKKyAgICAgICAgIHJldHVybiAiU1VDQ0VTUyI7CisgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5lcXVhbHMoSm9iU3RhdHVzLkZBSUxVUkUpKSB7CisgICAgICAgICByZXR1cm4gIkZBSUxVUkUiOworICAgICAgfSBlbHNlIGlmIChzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5FWEVDVVRFRCkpIHsKKyAgICAgICAgIHJldHVybiAiRVhFQ1VURUQiOworICAgICAgfSBlbHNlIGlmIChzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5RVUVVRUQpKSB7CisgICAgICAgICByZXR1cm4gIlFVRVVFRCI7CisgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5lcXVhbHMoSm9iU3RhdHVzLlNDSEVEVUxFRCkpIHsKKyAgICAgICAgIHJldHVybiAiU0NIRURVTEVEIjsKKyAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLmVxdWFscyhKb2JTdGF0dXMuS0lMTEVEKSkgeworICAgICAgICAgcmV0dXJuICJLSUxMRUQiOworICAgICAgfSBlbHNlCisgICAgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0Tm9kZUJ5SWRDbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0Tm9kZUJ5SWRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFlM2EzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXROb2RlQnlJZENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldHMgYSBSZXNvdXJjZU5vZGUgYnkgSUQuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0Tm9kZUJ5SWRDbGlBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZUNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIG5vZGVJZDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChub2RlSWQsICJNdXN0IHNwZWNpZnkgbm9kZUlkIik7CisKKyAgICAgICAgIFJlc291cmNlTm9kZSBub2RlID0gZ2V0Q2xpZW50KCkuZ2V0Tm9kZUJ5SWQobm9kZUlkKTsKKworICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVzb3VyY2VNYW5hZ2VyIHJldHVybmVkIG51bGwgUmVzb3VyY2VOb2RlIgorICAgICAgICAgICAgICAgICAgKyAiIGZvciBub2RlSWQgJyIgKyBub2RlSWQgKyAiJyIpOworICAgICAgICAgfQorICAgICAgICAgcHJpbnRlci5wcmludGxuKCJub2RlOiBbaWQ9IiArIG5vZGUuZ2V0Tm9kZUlkKCkgKyAiLGNhcGFjaXR5PSIKKyAgICAgICAgICAgICAgICsgbm9kZS5nZXRDYXBhY2l0eSgpICsgIix1cmw9IiArIG5vZGUuZ2V0SXBBZGRyKCkgKyAiXSIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IG5vZGUgYnkgaWQgJyIgKyBub2RlSWQKKyAgICAgICAgICAgICAgICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXROb2RlSWQoU3RyaW5nIG5vZGVJZCkgeworICAgICAgdGhpcy5ub2RlSWQgPSBub2RlSWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVMb2FkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVMb2FkQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZjRjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0Tm9kZUxvYWRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0IGxvYWQgb2YgZ2l2ZW4gbm9kZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXROb2RlTG9hZENsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUlkOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG5vZGVJZCwgIk11c3Qgc3BlY2lmeSBub2RlSWQiKTsKKworICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGdldENsaWVudCgpLmdldE5vZGVMb2FkKG5vZGVJZCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIkxvYWQgZm9yIG5vZGUgJyIgKyBub2RlSWQgKyAiJzogIiArIHJlc3VsdCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbm9kZSBsb2FkIGZvciBub2RlICciCisgICAgICAgICAgICAgICArIG5vZGVJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Tm9kZUlkKFN0cmluZyBub2RlSWQpIHsKKyAgICAgIHRoaXMubm9kZUlkID0gbm9kZUlkOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXROb2RlUmVwb3J0Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVSZXBvcnRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJlOTcxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXROb2RlUmVwb3J0Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHJldHVybnMgbmFtZSAoYWxsIG5vZGVzIHdpbGwgYmUgZGlzcGxheWVkIGluIGFscGhhYmV0aWNhbCBvcmRlciksIAorICogbG9hZCBhbmQgY2FwYWNpdHkgb2YgYWxsIG5vZGVzLCBpbiBhZGRpdGlvbiB0byB3aGF0IHF1ZXVlcyB0aGF0IG5vZGUgZHJhd3MgZnJvbS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2V0Tm9kZVJlcG9ydENsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworCSAgU3RyaW5nIHJlcG9ydCA9IGdldENsaWVudCgpLmdldE5vZGVSZXBvcnQoKTsKKwkgIHByaW50ZXIucHJpbnRsbigiTm9kZSBSZXBvcnQ6ICIpOworCSAgcHJpbnRlci5wcmludGxuKHJlcG9ydCk7CisJICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBub2RlIHJlcG9ydDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVzQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZTA5ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0Tm9kZXNDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgbGlzdCBvZiBSZXNvdXJjZU5vZGVzLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldE5vZGVzQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgIExpc3Q8UmVzb3VyY2VOb2RlPiBub2RlcyA9IGdldENsaWVudCgpLmdldE5vZGVzKCk7CisKKyAgICAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJSZXNvdXJjZU1hbmFnZXIgcmV0dXJuZWQgbnVsbCBub2RlcyIpOworICAgICAgICAgfQorICAgICAgICAgZm9yIChSZXNvdXJjZU5vZGUgbm9kZSA6IG5vZGVzKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIm5vZGU6IFtpZD0iICsgbm9kZS5nZXROb2RlSWQoKSArICIsY2FwYWNpdHk9IgorICAgICAgICAgICAgICAgICAgKyBub2RlLmdldENhcGFjaXR5KCkgKyAiLHVybD0iICsgbm9kZS5nZXRJcEFkZHIoKSArICJdIik7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbm9kZXMgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0Tm9kZXNJblF1ZXVlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVzSW5RdWV1ZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmEwYTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldE5vZGVzSW5RdWV1ZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldHMgdGhlIG5vZGVzIGluIGEgcXVldWUuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0Tm9kZXNJblF1ZXVlQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBxdWV1ZU5hbWU7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwocXVldWVOYW1lLCAiTXVzdCBzcGVjaWZ5IHF1ZXVlTmFtZSIpOworCisgICAgICAgICBMaXN0PFN0cmluZz4gbm9kZUlkcyA9IGdldENsaWVudCgpLmdldE5vZGVzSW5RdWV1ZShxdWV1ZU5hbWUpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJOb2RlcyBpbiBRdWV1ZSAnIiArIHF1ZXVlTmFtZSArICInOiIpOworICAgICAgICAgZm9yIChTdHJpbmcgbm9kZUlkIDogbm9kZUlkcykKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiIC0gIiArIG5vZGVJZCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBub2RlcyBpbiBxdWV1ZSAnIgorICAgICAgICAgICAgICAgKyBxdWV1ZU5hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlTmFtZShTdHJpbmcgcXVldWVOYW1lKSB7CisgICAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0UXVldWVkSm9ic0NsaUFjdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXRRdWV1ZWRKb2JzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MTZlNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0UXVldWVkSm9ic0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5YbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQuZ2V0UmVhZGFibGVKb2JTdGF0dXM7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggcmV0dXJucyBKb2JzIHRoYXQgYXJlIGN1cnJlbnRseSBxdWV1ZWQuCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdldFF1ZXVlZEpvYnNDbGlBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZUNsaUFjdGlvbiB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKwkgIExpc3Q8Sm9iPiBxdWV1ZWRKb2JzID0gZ2V0Q2xpZW50KCkuZ2V0UXVldWVkSm9icygpOworICAgICAgICAgIGlmIChxdWV1ZWRKb2JzICE9IG51bGwgJiYgcXVldWVkSm9icy5zaXplKCkgPiAwKXsKKwkgICAgICBwcmludGVyLnByaW50bG4oIkpvYnM6ICIpOworCSAgICAgIGZvcihKb2Igam9iOiBxdWV1ZWRKb2JzKXsKKwkJIHByaW50ZXIucHJpbnRsbigiSm9iOiBbaWQ9IiArIGpvYi5nZXRJZCgpICsgIiwgc3RhdHVzPSIKKwkJICAgKyBnZXRSZWFkYWJsZUpvYlN0YXR1cyhqb2IuZ2V0U3RhdHVzKCkpICsgIixuYW1lPSIKKwkJICAgKyBqb2IuZ2V0TmFtZSgpICsgIixxdWV1ZT0iICsgam9iLmdldFF1ZXVlTmFtZSgpCisJCSAgICsgIixsb2FkPSIgKyBqb2IuZ2V0TG9hZFZhbHVlKCkgKyAiLGlucHV0Q2xhc3M9IgorCQkgICArIGpvYi5nZXRKb2JJbnB1dENsYXNzTmFtZSgpICsgIixpbnN0Q2xhc3M9IgorCQkgICArIGpvYi5nZXRKb2JJbnN0YW5jZUNsYXNzTmFtZSgpICsgIl0iKTsKKwkgICAgICB9CisJICAgICAgcHJpbnRlci5wcmludGxuKCk7CisJICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgcXVldWVkIGpvYnMgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vR2V0UXVldWVzQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldFF1ZXVlc0NsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2IyYmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldFF1ZXVlc0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIGxpc3Qgb2YgTm9kZSBxdWV1ZXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0UXVldWVzQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBMaXN0PFN0cmluZz4gcXVldWVOYW1lcyA9IGdldENsaWVudCgpLmdldFF1ZXVlcygpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJRdWV1ZXM6Iik7CisgICAgICAgICBmb3IgKFN0cmluZyBxdWV1ZU5hbWUgOiBxdWV1ZU5hbWVzKQorICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIgLSAiICsgcXVldWVOYW1lKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHF1ZXVlcyA6ICIKKyAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXRRdWV1ZXNXaXRoTm9kZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9HZXRRdWV1ZXNXaXRoTm9kZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjU5YTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL0dldFF1ZXVlc1dpdGhOb2RlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0cyBxdWV1ZXMgd2l0aCBnaXZlbiBub2RlIGlkLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldFF1ZXVlc1dpdGhOb2RlQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBub2RlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwobm9kZUlkLCAiTXVzdCBzcGVjaWZ5IG5vZGVJZCIpOworCisgICAgICAgICBMaXN0PFN0cmluZz4gcXVldWVOYW1lcyA9IGdldENsaWVudCgpLmdldFF1ZXVlc1dpdGhOb2RlKG5vZGVJZCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlF1ZXVlcyB3aXRoIG5vZGUgJyIgKyBub2RlSWQgKyAiJzoiKTsKKyAgICAgICAgIGZvciAoU3RyaW5nIHF1ZXVlTmFtZSA6IHF1ZXVlTmFtZXMpCisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiAtICIgKyBxdWV1ZU5hbWUpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgcXVldWVzIHdpdGggbm9kZSAnIgorICAgICAgICAgICAgICAgKyBub2RlSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldE5vZGVJZChTdHJpbmcgbm9kZUlkKSB7CisgICAgICB0aGlzLm5vZGVJZCA9IG5vZGVJZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vS2lsbENsaUFjdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9LaWxsQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjZTk0YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vS2lsbENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBraWxscyBhIGpvYi4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBLaWxsQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBqb2JJZDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChqb2JJZCwgIk11c3Qgc3BlY2lmeSBqb2JJZCIpOworCisgICAgICAgICBpZiAoZ2V0Q2xpZW50KCkua2lsbEpvYihqb2JJZCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiSm9iOiBbIiArIGpvYklkICsgIl0gc3VjY2Vzc2Z1bGx5IGtpbGxlZC4iKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJLaWxsIGpvYiByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgfQorCisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBraWxsIGpvYiAnIiArIGpvYklkCisgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Sm9iSWQoU3RyaW5nIGpvYklkKSB7CisgICAgICB0aGlzLmpvYklkID0gam9iSWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1JlbW92ZU5vZGVDbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vUmVtb3ZlTm9kZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDZlZWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1JlbW92ZU5vZGVDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggcmVtb3ZlcyBhIG5vZGUgYnkgaWQuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdmVOb2RlQ2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBub2RlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIFZhbGlkYXRlLm5vdE51bGwobm9kZUlkLCAiTXVzdCBzcGVjaWZ5IG5vZGVJZCIpOworCisgICAgICAgICBnZXRDbGllbnQoKS5yZW1vdmVOb2RlKG5vZGVJZCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlN1Y2Nlc3NmdWxseSByZW1vdmVkIG5vZGUhIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byByZW1vdmUgbm9kZSB3aXRoIGlkICciCisgICAgICAgICAgICAgICArIG5vZGVJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Tm9kZUlkKFN0cmluZyBub2RlSWQpIHsKKyAgICAgIHRoaXMubm9kZUlkID0gbm9kZUlkOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9SZW1vdmVOb2RlRnJvbVF1ZXVlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1JlbW92ZU5vZGVGcm9tUXVldWVDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Q1NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9SZW1vdmVOb2RlRnJvbVF1ZXVlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbjsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHJlbW92ZXMgYSBub2RlIGZyb20gYSBxdWV1ZS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFJlbW92ZU5vZGVGcm9tUXVldWVDbGlBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZUNsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIG5vZGVJZDsKKyAgIHByaXZhdGUgU3RyaW5nIHF1ZXVlTmFtZTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChub2RlSWQsICJNdXN0IHNwZWNpZnkgbm9kZUlkIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHF1ZXVlTmFtZSwgIk11c3Qgc3BlY2lmeSBxdWV1ZU5hbWUiKTsKKworICAgICAgICAgZ2V0Q2xpZW50KCkucmVtb3ZlTm9kZUZyb21RdWV1ZShub2RlSWQsIHF1ZXVlTmFtZSk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlN1Y2Nlc3NmdWxseSByZW1vdmVkIG5vZGUgZnJvbSBxdWV1ZSEiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlbW92ZSBub2RlICciCisgICAgICAgICAgICAgICArIG5vZGVJZCArICInIGZyb20gcXVldWUgJyIgKyBxdWV1ZU5hbWUgKyAiJyA6ICIKKyAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXROb2RlSWQoU3RyaW5nIG5vZGVJZCkgeworICAgICAgdGhpcy5ub2RlSWQgPSBub2RlSWQ7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlTmFtZShTdHJpbmcgcXVldWVOYW1lKSB7CisgICAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vUmVtb3ZlUXVldWVDbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vUmVtb3ZlUXVldWVDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM2M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9SZW1vdmVRdWV1ZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCByZW1vdmVzIGEgcXVldWUuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdmVRdWV1ZUNsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgcXVldWVOYW1lOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKCJNdXN0IHNwZWNpZnkgcXVldWVOYW1lIik7CisKKyAgICAgICAgIGdldENsaWVudCgpLnJlbW92ZVF1ZXVlKHF1ZXVlTmFtZSk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIlN1Y2Nlc3NmdWxseSByZW1vdmVkIHF1ZXVlISIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVtb3ZlIHF1ZXVlIHdpdGggbmFtZSAnIgorICAgICAgICAgICAgICAgKyBxdWV1ZU5hbWUgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlTmFtZShTdHJpbmcgcXVldWVOYW1lKSB7CisgICAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vUmVzb3VyY2VDbGlBY3Rpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vUmVzb3VyY2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JiMzYwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL2FjdGlvbi9SZXNvdXJjZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLkNtZExpbmVBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0uWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEJhc2Uge0BsaW5rIENtZExpbmVBY3Rpb259IGZvciBXb3JrZmxvdyBNYW5hZ2VyLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VDbGlBY3Rpb24gZXh0ZW5kcyBDbWRMaW5lQWN0aW9uIHsKKworICAgcHJpdmF0ZSBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgY2xpZW50OworCisgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXJsIik7CisgICB9CisKKyAgIHByb3RlY3RlZCBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkKKyAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgVmFsaWRhdGUubm90TnVsbChnZXRVcmwoKSk7CisKKyAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXR1cm4gbmV3IFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudChuZXcgVVJMKGdldFVybCgpKSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldENsaWVudChYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgY2xpZW50KSB7CisgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vU2V0Tm9kZUNhcGFjaXR5Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1NldE5vZGVDYXBhY2l0eUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OGM3YzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1NldE5vZGVDYXBhY2l0eUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBjaGFuZ2VzIGEgbm9kZSdzIGNhcGFjaXR5LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgU2V0Tm9kZUNhcGFjaXR5Q2xpQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBub2RlSWQ7CisgICBwcml2YXRlIGludCBjYXBhY2l0eTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgVmFsaWRhdGUubm90TnVsbChub2RlSWQsICJNdXN0IHNwZWNpZnkgbm9kZUlkIik7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGNhcGFjaXR5LCAiTXVzdCBzcGVjaWZ5IGNhcGFjaXR5Iik7CisKKyAgICAgICAgIGdldENsaWVudCgpLnNldE5vZGVDYXBhY2l0eShub2RlSWQsIGNhcGFjaXR5KTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3VjY2Vzc2Z1bGx5IHNldCBub2RlIGNhcGFjaXR5ISIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCIiLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Tm9kZUlkKFN0cmluZyBub2RlSWQpIHsKKyAgICAgIHRoaXMubm9kZUlkID0gbm9kZUlkOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDYXBhY2l0eShpbnQgY2FwYWNpdHkpIHsKKyAgICAgIHRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9hY3Rpb24vU3VibWl0Sm9iQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1N1Ym1pdEpvYkNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWUyZDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvYWN0aW9uL1N1Ym1pdEpvYkNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuSm9iQnVpbGRlcjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBzdWJtaXRzIGEgam9iLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFN1Ym1pdEpvYkNsaUFjdGlvbiBleHRlbmRzIFJlc291cmNlQ2xpQWN0aW9uIHsKKworICAgcHVibGljIFN0cmluZyBqb2JEZWZpbml0aW9uRmlsZTsKKyAgIHB1YmxpYyBVUkwgdXJsOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGpvYkRlZmluaXRpb25GaWxlLCAiTXVzdCBzcGVjaWZ5IGpvYkRlZmluaXRpb25GaWxlIik7CisKKyAgICAgICAgIEpvYlNwZWMgc3BlYyA9IEpvYkJ1aWxkZXIuYnVpbGRKb2JTcGVjKGpvYkRlZmluaXRpb25GaWxlKTsKKyAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJTdWNjZXNzZnVsIHN1Ym1pdCBqb2Igd2l0aCBqb2JJZCAnIgorICAgICAgICAgICAgICAgICAgKyBnZXRDbGllbnQoKS5zdWJtaXRKb2Ioc3BlYy5nZXRKb2IoKSwgc3BlYy5nZXRJbigpKSArICInIik7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGdldENsaWVudCgpLnN1Ym1pdEpvYihzcGVjLmdldEpvYigpLCBzcGVjLmdldEluKCksIHVybCkpIHsKKyAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiU3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCBqb2IgdG8gdXJsICciCisgICAgICAgICAgICAgICAgICAgICArIHVybCArICInIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSm9iIHN1Ym1pdCByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gc3VibWl0IGpvYiBmb3Igam9iIgorICAgICAgICAgICAgICAgKyAiIGRlZmluaXRpb24gZmlsZSAnIiArIGpvYkRlZmluaXRpb25GaWxlICsgIicgOiAiCisgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Sm9iRGVmaW5pdGlvbkZpbGUoU3RyaW5nIGpvYkRlZmluaXRpb25GaWxlKSB7CisgICAgICB0aGlzLmpvYkRlZmluaXRpb25GaWxlID0gam9iRGVmaW5pdGlvbkZpbGU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFVybChVUkwgdXJsKSB7CisgICAgICB0aGlzLnVybCA9IHVybDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL0hlbGxvV29ybGRKb2IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL0hlbGxvV29ybGRKb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2IyMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvSGVsbG9Xb3JsZEpvYi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5leGFtcGxlczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1ldGFkYXRhLkpvYk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLk5hbWVWYWx1ZUpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYklucHV0RXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciB3b29sbGFyZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBjbGFzc2ljIHByb2dyYW1taW5nIGV4YW1wbGU6IHRoZSBoZWxsbyB3b3JsZCBqb2IuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkSm9iIGltcGxlbWVudHMgSm9iSW5zdGFuY2UsIEpvYk1ldGFkYXRhIHsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnN0YW5jZSNleGVjdXRlKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dCkKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSm9iSW5wdXQgaW4pIHRocm93cyBKb2JJbnB1dEV4Y2VwdGlvbiB7CisgICAgaWYgKCEoaW4gaW5zdGFuY2VvZiBOYW1lVmFsdWVKb2JJbnB1dCkpIHsKKyAgICAgIHRocm93IG5ldyBKb2JJbnB1dEV4Y2VwdGlvbigKKyAgICAgICAgICAiT25seSBrbm93IGhvdyB0byBoYW5kbGUgTmFtZVZhbHVlSW5wdXQ6IHVua25vd24gaW5wdXQgdHlwZTogWyIKKyAgICAgICAgICAgICAgKyBpbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIik7CisgICAgfQorCisgICAgTmFtZVZhbHVlSm9iSW5wdXQgaW5wdXQgPSAoTmFtZVZhbHVlSm9iSW5wdXQpIGluOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB3b3JsZCEgSG93IGFyZSB5b3UgIgorICAgICAgICArIGlucHV0LmdldFZhbHVlKCJ1c2VyLm5hbWUiKSArICIhIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvTG9uZ0pvYi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvTG9uZ0pvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYmM2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9Mb25nSm9iLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubWV0YWRhdGEuSm9iTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iSW5wdXRFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBKb2IgdGhhdCB3aWxsIHRha2UgYSB2YXJpYWJsZSBhbW91bnQgb2YgdGltZSB0byBmaW5pc2guCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBMb25nSm9iIGltcGxlbWVudHMgSm9iSW5zdGFuY2UsIEpvYk1ldGFkYXRhIHsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYkluc3RhbmNlI2V4ZWN1dGUob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSm9iSW5wdXQgaW4pIHRocm93cyBKb2JJbnB1dEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKGluIGluc3RhbmNlb2YgTmFtZVZhbHVlSm9iSW5wdXQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSm9iSW5wdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJPbmx5IGtub3cgaG93IHRvIGhhbmRsZSBOYW1lVmFsdWVJbnB1dDogdW5rbm93biBpbnB1dCB0eXBlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSIpOworICAgICAgICB9CisKKyAgICAgICAgTmFtZVZhbHVlSm9iSW5wdXQgaW5wdXQgPSAoTmFtZVZhbHVlSm9iSW5wdXQpIGluOworCisgICAgICAgIGludCB3YWl0VGltZSA9IDA7CisgICAgICAgIHdhaXRUaW1lID0gbmV3IEludGVnZXIoaW5wdXQuZ2V0VmFsdWUoIndhaXQiKSkuaW50VmFsdWUoKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvbmdKb2IgcnVubmluZyBmb3IgIiArIHdhaXRUaW1lICsgIiBzZWMiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lICogMTAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvbmdKb2IgZmluaXNoZWQuIik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9UZXN0UmVzbWdyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9UZXN0UmVzbWdyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1ZmYwNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL1Rlc3RSZXNtZ3IuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuZXhhbXBsZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0uWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIAorICogQGF1dGhvciB3b29sbGFyZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3RzIHRoZSBKb2IgU3VibWlzc2lvbiBjYXBhYmlsaXR5IG9mIHRoZSBSZXNvdXJjZSBNYW5hZ2VyCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdFJlc21nciB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gQXJncykgeworCisgICAgaWYgKEFyZ3MubGVuZ3RoICE9IDEpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3BlY2lmeSBhIFhtbFJwY1Jlc291cmNlTWFuYWdlciBIb3N0Iik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVVJMIG1hbmFnZXJVcmwgPSBuZXcgVVJMKEFyZ3NbMF0pOworICAgICAgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IG5ldyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQoCisgICAgICAgICAgbWFuYWdlclVybCk7CisKKyAgICAgIEpvYiBodzEgPSBuZXcgSm9iKCJKb2JPbmUiLCAiSGVsbG9Xb3JsZEpvYiIsCisgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuZXhhbXBsZXMuSGVsbG9Xb3JsZEpvYiIsCisgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5OYW1lVmFsdWVKb2JJbnB1dCIsICJxdWljayIsCisgICAgICAgICAgbmV3IEludGVnZXIoMSkpOworICAgICAgTmFtZVZhbHVlSm9iSW5wdXQgaHcxSW5wdXQgPSBuZXcgTmFtZVZhbHVlSm9iSW5wdXQoKTsKKyAgICAgIGh3MUlucHV0LnNldE5hbWVWYWx1ZVBhaXIoInVzZXIubmFtZSIsICJEYXZlIik7CisKKyAgICAgIGNsaWVudC5zdWJtaXRKb2IoaHcxLCBodzFJbnB1dCk7CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icXVldWUvSm9iUXVldWUuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnF1ZXVlL0pvYlF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwNDY3YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnF1ZXVlL0pvYlF1ZXVlLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5Kb2JSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYlF1ZXVlRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBpbnRlcmZhY2UgZm9yIHBlcnNpc3Rpbmcge0BsaW5rIEpvYlNwZWN9cyB1c2VkIGJ5IGEKKyAqIHtAbGluayBKb2JRdWV1ZUNvbnRyb2xsZXJ9LgorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBKb2JRdWV1ZSB7CisKKyAgLyoqCisgICAqIFBlcnNpc3RzIGEge0BsaW5rIEpvYlNwZWN9IHRvIHRoZSBxdWV1ZS4KKyAgICogCisgICAqIEBwYXJhbSBzcGVjCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgSm9iU3BlY30gdG8gcGVyc2lzdC4KKyAgICogQHJldHVybiBUaGUgSUQgb2YgdGhlIEpvYlNwZWMgaW4gdGhlIHF1ZXVlLgorICAgKiBAdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgcXVldWVpbmcgdGhlIHtAbGluayBKb2JTcGVjfS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgYWRkSm9iKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9uOworICAKKyAgLyoqCisgICAqIFJlLWFkZHMgYSB7QGxpbmsgSm9iU3BlY30gdG8gdGhlIGJhY2sgb2YgdGhlIHF1ZXVlLgorICAgKiAKKyAgICogQHBhcmFtIHNwZWMKKyAgICogICAgICAgICAgVGhlIHtAbGluayBKb2JTcGVjfSB0byByZS1hZGQuCisgICAqIEB0aHJvd3MgSm9iUXVldWVFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciByZXF1ZXVlaW5nIHRoZSB7QGxpbmsgSm9iU3BlY30uCisgICAqLworICBwdWJsaWMgU3RyaW5nIHJlcXVldWVKb2IoSm9iU3BlYyBzcGVjKSB0aHJvd3MgSm9iUXVldWVFeGNlcHRpb247CisgIAorICAvKioKKyAgICogR2V0cyBhbiBvcmRlcmVkIHtAbGluayBMaXN0fSBvZiBxdWV1ZWQge0BsaW5rIEpvYlNwZWN9cy4KKyAgICogCisgICAqIEByZXR1cm4gQW4gb3JkZXJlZCB7QGxpbmsgTGlzdH0gb2YgcXVldWVkIHtAbGluayBKb2JTcGVjfXMuCisgICAqIEB0aHJvd3MgSm9iUXVldWVFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciBvYnRhaW5pbmcgdGhlIHF1ZXVlZCBqb2JzLgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0UXVldWVkSm9icygpIHRocm93cyBKb2JRdWV1ZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUHVyZ2VzIGFsbCB7QGxpbmsgSm9iU3BlY31zIGZyb20gdGhlIHF1ZXVlLgorICAgKiAKKyAgICogQHRocm93cyBKb2JRdWV1ZUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgdGhlcmUgaXMgYW55IGVycm9yIHB1cmdpbmcgYWxsIHRoZSB7QGxpbmsgSm9iU3BlY31zLgorICAgKi8KKyAgcHVibGljIHZvaWQgcHVyZ2UoKSB0aHJvd3MgSm9iUXVldWVFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVldWUgaXMgZW1wdHkuCisgICAqIAorICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBuZXh0IHtAbGluayBKb2JTcGVjfSBmcm9tIHRoZSBxdWV1ZSwgYW5kIGNvcnJlc3BvbmRpbmdseSByZW1vdmVzCisgICAqIGl0IGZyb20gcGVyc2l0YW5jZS4KKyAgICogCisgICAqIEByZXR1cm4gVGhlIG5leHQge0BsaW5rIEpvYlNwZWN9IGZyb20gdGhlIHF1ZXVlLgorICAgKiBAdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGVyZSBpcyBhbnkgZXJyb3IgZ2V0dGluZyB0aGUgbmV4dCB7QGxpbmsgSm9iU3BlY30uCisgICAqLworICBwdWJsaWMgSm9iU3BlYyBnZXROZXh0Sm9iKCkgdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9uOworICAKKyAgCisgIC8qKgorICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBKb2JTcGVjfSBwZXJzaXN0YW5jZSBsYXllcgorICAgKiB1c2VkIGJ5IHRoaXMge0BsaW5rIEpvYlF1ZXVlfS4KKyAgICogQHJldHVybiBUaGUgdW5kZXJseWluZyB7QGxpbmsgSm9iUmVwb3NpdG9yeX0uCisgICAqLworICBwdWJsaWMgSm9iUmVwb3NpdG9yeSBnZXRKb2JSZXBvc2l0b3J5KCk7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG51bWJlciBvZiBqb2JzIGluIHF1ZXVlCisgICAqIEByZXR1cm4gTnVtYmVyIG9mIGpvYnMgaW4gcXVldWUKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpOworICAKKyAgLyoqCisgICAqIEdldHMgdGhlIG1heCBudW1iZXIgb2Ygam9icyBhbGxvd2VkIGluCisgICAqIHF1ZXVlIGF0IGFueSBnaXZlbiB0aW1lCisgICAqIEByZXR1cm4gTWF4IG51bWJlciBvZiBqb2JzCisgICAqLworICBwdWJsaWMgaW50IGdldENhcGFjaXR5KCk7CisgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icXVldWUvSm9iUXVldWVGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JxdWV1ZS9Kb2JRdWV1ZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzkxZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icXVldWUvSm9iUXVldWVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBKb2JRdWV1ZX0gc2VydmljZXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9iUXVldWVGYWN0b3J5IHsKKworICAvKioKKyAgICogQ3JlYXRlcyBuZXcge0BsaW5rIEpvYlF1ZXVlfSBpbXBsZW1lbnRhdGlvbnMuCisgICAqIAorICAgKiBAcmV0dXJuIE5ldyB7QGxpbmsgSm9iUXVldWV9IGltcGxlbWVudGF0aW9ucy4KKyAgICovCisgIHB1YmxpYyBKb2JRdWV1ZSBjcmVhdGVRdWV1ZSgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icXVldWUvSm9iU3RhY2suamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnF1ZXVlL0pvYlN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5NWMyMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnF1ZXVlL0pvYlN0YWNrLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYlF1ZXVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYlJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8vSkFWQSBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGhlIEpvYiBTdGFjayBmb3IgdW5hbGxvY2F0YWJsZSBKb2JzLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgSm9iU3RhY2sgaW1wbGVtZW50cyBKb2JRdWV1ZSB7CisgIAorICAvKiBvdXIgcXVldWUgKi8KKyAgcHJpdmF0ZSBWZWN0b3IgcXVldWU7CisKKyAgLyogbWF4IHF1ZXVlIHNpemUgKi8KKyAgcHJpdmF0ZSBpbnQgbWF4UXVldWVTaXplOworICAKKyAgLyogb3VyIGpvYiBwZXJzaXN0YW5jZSBsYXllciAqLworICBwcml2YXRlIEpvYlJlcG9zaXRvcnkgcmVwbzsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihKb2JTdGFjay5jbGFzcy5nZXROYW1lKCkpOworCisgIHB1YmxpYyBKb2JTdGFjayhpbnQgbWF4U2l6ZSwgSm9iUmVwb3NpdG9yeSByZXBvKSB7CisgICAgcXVldWUgPSBuZXcgVmVjdG9yKCk7CisgICAgbWF4UXVldWVTaXplID0gbWF4U2l6ZTsKKyAgICB0aGlzLnJlcG8gPSByZXBvOworICB9CisgIAorICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iUXVldWUjYWRkSm9iKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjKQorICAgKi8KKyAgcHVibGljIFN0cmluZyBhZGRKb2IoSm9iU3BlYyBzcGVjKSB0aHJvd3MgSm9iUXVldWVFeGNlcHRpb24geworICAgIFN0cmluZyBqb2JJZCA9IHNhZmVBZGRKb2Ioc3BlYyk7CisgICAgaWYgKHF1ZXVlLnNpemUoKSAhPSBtYXhRdWV1ZVNpemUpIHsKKyAgICAgIExPRworICAgICAgICAgIC5sb2coTGV2ZWwuSU5GTywgIkFkZGVkIEpvYjogWyIgKyBzcGVjLmdldEpvYigpLmdldElkKCkKKyAgICAgICAgICAgICAgKyAiXSB0byBxdWV1ZSIpOworICAgICAgcXVldWUuYWRkKHNwZWMpOworICAgICAgc3BlYy5nZXRKb2IoKS5zZXRTdGF0dXMoSm9iU3RhdHVzLlFVRVVFRCk7CisgICAgICBzYWZlVXBkYXRlSm9iKHNwZWMpOworICAgICAgcmV0dXJuIGpvYklkOworICAgIH0gZWxzZQorICAgICAgdGhyb3cgbmV3IEpvYlF1ZXVlRXhjZXB0aW9uKCJSZWFjaGVkIG1heCBxdWV1ZSBzaXplOiBbIiArIG1heFF1ZXVlU2l6ZQorICAgICAgICAgICsgIl06IFVuYWJsZSB0byBhZGQgam9iOiBbIiArIHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSArICJdIik7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlI3JlcXVldWVKb2IoZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYykKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgcmVxdWV1ZUpvYihKb2JTcGVjIHNwZWMpIHRocm93cyBKb2JRdWV1ZUV4Y2VwdGlvbiB7CisJICB0cnkgeworCSAgICAgIHF1ZXVlLmFkZChzcGVjKTsKKwkgICAgICBzcGVjLmdldEpvYigpLnNldFN0YXR1cyhKb2JTdGF0dXMuUVVFVUVEKTsKKwkgICAgICBzYWZlVXBkYXRlSm9iKHNwZWMpOworCSAgICAgIHJldHVybiBzcGVjLmdldEpvYigpLmdldElkKCk7CisJICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCSAgdGhyb3cgbmV3IEpvYlF1ZXVlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmUtcXVldWUgam9iICciCisgICAgICAgICAgICAgICAgICAgICsgKHNwZWMgIT0gbnVsbCA/IHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSA6ICJudWxsIikgKyAiJyA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJICB9CisgIH0KKyAgCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JRdWV1ZSNnZXRRdWV1ZWRKb2JzKCkKKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFF1ZXVlZEpvYnMoKSB0aHJvd3MgSm9iUXVldWVFeGNlcHRpb24geworICAgIHJldHVybiBxdWV1ZTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JRdWV1ZSNwdXJnZSgpCisgICAqLworICBwdWJsaWMgdm9pZCBwdXJnZSgpIHRocm93cyBKb2JRdWV1ZUV4Y2VwdGlvbiB7CisgICAgcXVldWUucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAvL1RPRE86IHRoaW5rIGFib3V0IHdoZXRoZXIgb3Igbm90IGl0IG1ha2VzCisgICAgLy9zZW5zZSB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGUgSm9iUmVwb3NpdG9yeQorICAgIC8vaGVyZSB0b28KKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlI2lzRW1wdHkoKQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICByZXR1cm4gcXVldWUuaXNFbXB0eSgpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iUXVldWUjZ2V0TmV4dEpvYigpCisgICAqLworICBwdWJsaWMgSm9iU3BlYyBnZXROZXh0Sm9iKCkgdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9uIHsKKyAgICBKb2JTcGVjIHNwZWMgPSAoSm9iU3BlYylxdWV1ZS5yZW1vdmUoMCk7CisgICAgLy8gdXBkYXRlIGl0cyBzdGF0dXMgc2luY2UgZ2V0TmV4dEpvYiBpcworICAgIC8vIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHdoZW4gaXQgaXMgZ29pbmcKKyAgICAvLyB0byBleGVjdXRlIGEgam9iCisgICAgc3BlYy5nZXRKb2IoKS5zZXRTdGF0dXMoSm9iU3RhdHVzLlNDSEVEVUxFRCk7CisgICAgc2FmZVVwZGF0ZUpvYihzcGVjKTsKKyAgICByZXR1cm4gc3BlYzsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlI2dldEpvYlJlcG9zaXRvcnkoKQorICAgKi8KKyAgcHVibGljIEpvYlJlcG9zaXRvcnkgZ2V0Sm9iUmVwb3NpdG9yeSgpIHsKKyAgICByZXR1cm4gcmVwbzsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIHNhZmVVcGRhdGVKb2IoSm9iU3BlYyBzcGVjKSB7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMucmVwby51cGRhdGVKb2Ioc3BlYyk7CisgICAgfSBjYXRjaCAoSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gdXBkYXRpbmcgam9iOiBbIgorICAgICAgICAgICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIFN0cmluZyBzYWZlQWRkSm9iKEpvYlNwZWMgc3BlYykgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy5yZXBvLmFkZEpvYihzcGVjKTsKKyAgICB9IGNhdGNoIChKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRworICAgICAgICAgIC5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBhZGRpbmcgam9iOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKwlwdWJsaWMgaW50IGdldENhcGFjaXR5KCkgeworCQlyZXR1cm4gdGhpcy5tYXhRdWV1ZVNpemU7CisJfQorCisJcHVibGljIGludCBnZXRTaXplKCkgeworCQlyZXR1cm4gdGhpcy5xdWV1ZS5zaXplKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JxdWV1ZS9Kb2JTdGFja0pvYlF1ZXVlRmFjdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icXVldWUvSm9iU3RhY2tKb2JRdWV1ZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwNWQzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icXVldWUvSm9iU3RhY2tKb2JRdWV1ZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEpvYlN0YWNrfSB7QGxpbmsgSm9iUXVldWV9cy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBKb2JTdGFja0pvYlF1ZXVlRmFjdG9yeSBpbXBsZW1lbnRzIEpvYlF1ZXVlRmFjdG9yeSB7CisKKyAgLyogdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgam9icXVldWUgKi8KKyAgcHJpdmF0ZSBpbnQgc3RhY2tTaXplID0gLTE7CisgIAorICAvKiBvdXIgam9iIHJlcG9zaXRvcnkgZm9yIHBlcnNpc3Rpbmcgam9icyAqLworICBwcml2YXRlIEpvYlJlcG9zaXRvcnkgcmVwbzsKKworICBwdWJsaWMgSm9iU3RhY2tKb2JRdWV1ZUZhY3RvcnkoKSB7CisgICAgU3RyaW5nIHN0YWNrU2l6ZVN0ciA9IFN5c3RlbQorICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuam9ic3RhY2subWF4c3RhY2tzaXplIik7CisKKyAgICBpZiAoc3RhY2tTaXplU3RyICE9IG51bGwpIHsKKyAgICAgIHN0YWNrU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoc3RhY2tTaXplU3RyKTsKKyAgICB9CisgICAgCisgICAgU3RyaW5nIGpvYlJlcG9GYWN0b3J5Q2xhc3NTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoCisgICAgICAgICJyZXNvdXJjZS5qb2JyZXBvLmZhY3RvcnkiLAorICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLk1lbW9yeUpvYlJlcG9zaXRvcnlGYWN0b3J5Iik7CisgICAgdGhpcy5yZXBvID0gR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgLmdldEpvYlJlcG9zaXRvcnlGcm9tU2VydmljZUZhY3Rvcnkoam9iUmVwb0ZhY3RvcnlDbGFzc1N0cik7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iUXVldWVGYWN0b3J5I2NyZWF0ZVF1ZXVlKCkKKyAgICovCisgIHB1YmxpYyBKb2JRdWV1ZSBjcmVhdGVRdWV1ZSgpIHsKKyAgICByZXR1cm4gbmV3IEpvYlN0YWNrKHN0YWNrU2l6ZSwgcmVwbyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9Kb2JSZXBvc2l0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JyZXBvL0pvYlJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDhkMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9Kb2JSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG87CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gaW50ZXJmYWNlIGZvciBwZXJzaXN0aW5nIHtAbGluayBKb2JTcGVjfXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9iUmVwb3NpdG9yeSB7CisKKyAgcHVibGljIFN0cmluZyBhZGRKb2IoSm9iU3BlYyBzcGVjKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCB1cGRhdGVKb2IoSm9iU3BlYyBzcGVjKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCByZW1vdmVKb2IoSm9iU3BlYyBzcGVjKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKyAgCisgIHB1YmxpYyBKb2JTcGVjIGdldEpvYkJ5SWQoU3RyaW5nIGpvYklkKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cyhKb2JTcGVjIHNwZWMpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIHB1YmxpYyBib29sZWFuIGpvYkZpbmlzaGVkKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vSm9iUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vSm9iUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzY3MTRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9Kb2JSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBKb2JSZXBvc2l0b3J5fXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9iUmVwb3NpdG9yeUZhY3RvcnkgeworCisgIC8qKgorICAgKiBDcmVhdGVzIG5ldyB7QGxpbmsgSm9iUmVwb3NpdG9yeX0gaW1wbGVtZW50YXRpb25zLgorICAgKiAKKyAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgSm9iUmVwb3NpdG9yeX0gaW1wbGVtZW50YXRpb24uCisgICAqLworICBwdWJsaWMgSm9iUmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vTWVtb3J5Sm9iUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9NZW1vcnlKb2JSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyODNlNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vTWVtb3J5Sm9iUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRGF0ZUNvbnZlcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgSm9iUmVwb3NpdG9yeX0gdGhhdCB1c2VzIGFuIGludGVybmFsCisgKiB7QGxpbmsgSGFzaE1hcH0gZm9yIHBlcnNpc3RpbmcgaXRzIHtAbGluayBKb2JTcGVjfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlKb2JSZXBvc2l0b3J5IGltcGxlbWVudHMgSm9iUmVwb3NpdG9yeSB7CisKKyAgLyoKKyAgICogb3VyIHN0b3JhZ2UgZm9yIHtAbGluayBKb2JTcGVjfXMuIEEgbWFwIG9mIGpvYiBpZCB0byB7QGxpbmsgSm9iU3BlY30uCisgICAqLworICBwcml2YXRlIEhhc2hNYXAgam9iTWFwID0gbnVsbDsKKworICBwdWJsaWMgTWVtb3J5Sm9iUmVwb3NpdG9yeSgpIHsKKyAgICBqb2JNYXAgPSBuZXcgSGFzaE1hcCgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeSNhZGRKb2Iob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWMpCisgICAqLworICBwdWJsaWMgU3RyaW5nIGFkZEpvYihKb2JTcGVjIHNwZWMpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAvLyBuZWVkIHRvIGdlbmVyYXRlIGEgSm9iSWQgZm9yIHRoaXMgam9iCisgICAgU3RyaW5nIGpvYklkID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KG5ldyBEYXRlKCkpOworCisgICAgaWYgKHNwZWMuZ2V0Sm9iKCkgIT0gbnVsbCkgeworICAgICAgc3BlYy5nZXRKb2IoKS5zZXRJZChqb2JJZCk7CisgICAgICBqb2JNYXAucHV0KGpvYklkLCBzcGVjKTsKKyAgICAgIHJldHVybiBqb2JJZDsKKyAgICB9IGVsc2UKKyAgICAgIHRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKCJFeGNlcHRpb24gcGVyc2lzdGluZyBqb2I6IGpvYiBpcyBudWxsISIpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeSNnZXRTdGF0dXMob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWMpCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cyhKb2JTcGVjIHNwZWMpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBKb2JTcGVjIHBlcnNpc3RlZFNwZWMgPSAoSm9iU3BlYykgam9iTWFwLmdldChzcGVjLmdldEpvYigpLmdldElkKCkpOworICAgIHJldHVybiBwZXJzaXN0ZWRTcGVjLmdldEpvYigpLmdldFN0YXR1cygpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeSNqb2JGaW5pc2hlZChvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYykKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGpvYkZpbmlzaGVkKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIEpvYlNwZWMgcGVyc2lzdGVkU3BlYyA9IChKb2JTcGVjKSBqb2JNYXAuZ2V0KHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgcmV0dXJuIHBlcnNpc3RlZFNwZWMuZ2V0Sm9iKCkuZ2V0U3RhdHVzKCkuZXF1YWxzKEpvYlN0YXR1cy5TVUNDRVNTKSAKKyAgICAJfHwgIHBlcnNpc3RlZFNwZWMuZ2V0Sm9iKCkuZ2V0U3RhdHVzKCkuZXF1YWxzKEpvYlN0YXR1cy5GQUlMVVJFKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLkpvYlJlcG9zaXRvcnkjcmVtb3ZlSm9iKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjKQorICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlSm9iKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIGlmIChqb2JNYXAucmVtb3ZlKHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oIkF0dGVtcHQgdG8gcmVtb3ZlIGEgam9iOiBbIgorICAgICAgICAgICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIl0gdGhhdCBpcyBub3QgY3VycmVudGx5IHBlcnNpc3RlZCIpOworICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeSN1cGRhdGVKb2Iob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWMpCisgICAqLworICBwdWJsaWMgdm9pZCB1cGRhdGVKb2IoSm9iU3BlYyBzcGVjKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgam9iTWFwLnB1dChzcGVjLmdldEpvYigpLmdldElkKCksIHNwZWMpOworCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5Kb2JSZXBvc2l0b3J5I2dldEpvYkJ5SWQoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBKb2JTcGVjIGdldEpvYkJ5SWQoU3RyaW5nIGpvYklkKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChKb2JTcGVjKSBqb2JNYXAuZ2V0KGpvYklkKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JyZXBvL01lbW9yeUpvYlJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JyZXBvL01lbW9yeUpvYlJlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4YjQyZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vTWVtb3J5Sm9iUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwbzsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPkNyZWF0ZXMgbmV3IHtAbGluayBNZW1vcnlKb2JSZXBvc2l0b3J5fXMucyAKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlKb2JSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIEpvYlJlcG9zaXRvcnlGYWN0b3J5IHsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5Kb2JSZXBvc2l0b3J5RmFjdG9yeSNjcmVhdGVSZXBvc2l0b3J5KCkKKyAgICovCisgIHB1YmxpYyBKb2JSZXBvc2l0b3J5IGNyZWF0ZVJlcG9zaXRvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBNZW1vcnlKb2JSZXBvc2l0b3J5KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9YU3RyZWFtSm9iUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9YU3RyZWFtSm9iUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzFiY2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JyZXBvL1hTdHJlYW1Kb2JSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9Db21tb25zSU8gaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vWFN0cmVhbSBpbXBvcnRzCitpbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLlhTdHJlYW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiBYU3RyZWFtIGJhc2VkIEpvYlJlcG9zaXRvcnkKKyAqLworcHVibGljIGNsYXNzIFhTdHJlYW1Kb2JSZXBvc2l0b3J5IGltcGxlbWVudHMgSm9iUmVwb3NpdG9yeSB7CisKKwlwcml2YXRlIEZpbGUgd29ya2luZ0RpcjsKKwlwcml2YXRlIGZpbmFsIGludCBtYXhIaXN0b3J5OworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBqb2JNYXA7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gam9iUHJlY2VkZW5jZTsKKwkKKwlwdWJsaWMgWFN0cmVhbUpvYlJlcG9zaXRvcnkoRmlsZSB3b3JraW5nRGlyLCBpbnQgbWF4SGlzdG9yeSkgeworCQl0aGlzLndvcmtpbmdEaXIgPSB3b3JraW5nRGlyOworCQl0aGlzLm1heEhpc3RvcnkgPSBNYXRoLm1heChtYXhIaXN0b3J5ID09IC0xID8gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhIaXN0b3J5LCAxKTsKKwkJdGhpcy5qb2JNYXAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworCQl0aGlzLmpvYlByZWNlZGVuY2UgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKwl9CisJCisJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgYWRkSm9iKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24geworCSAgICBYU3RyZWFtIHhzdHJlYW0gPSBuZXcgWFN0cmVhbSgpOworCSAgICBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmICh0aGlzLmpvYk1hcC5zaXplKCkgPj0gdGhpcy5tYXhIaXN0b3J5KQorCQkJCUZpbGVVdGlscy5mb3JjZURlbGV0ZShuZXcgRmlsZShqb2JNYXAucmVtb3ZlKGpvYlByZWNlZGVuY2UucmVtb3ZlKDApKSkpOworCQkJCisJCQlpZiAoc3BlYy5nZXRKb2IoKS5nZXRJZCgpID09IG51bGwpCisJCQkgICAgc3BlYy5nZXRKb2IoKS5zZXRJZChVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsKKwkJCWVsc2UgaWYgKHRoaXMuam9iTWFwLmNvbnRhaW5zS2V5KHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSkpCisJCQkJdGhyb3cgbmV3IEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oIkpvYklkICciICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIicgYWxyZWFkeSBpbiB1c2UgLS0gbXVzdCBwaWNrIHVuaXF1ZSBKb2JJZCIpOworCQkJCisJCQlGaWxlIGZpbGUgPSB0aGlzLmdlbmVyYXRlRmlsZVBhdGgoc3BlYy5nZXRKb2IoKS5nZXRJZCgpKTsKKwkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisJCSAgICB4c3RyZWFtLnRvWE1MKHNwZWMsIG9zKTsKKwkJICAgIGpvYk1hcC5wdXQoc3BlYy5nZXRKb2IoKS5nZXRJZCgpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJICAgIGpvYlByZWNlZGVuY2UuYWRkKHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisJCQlyZXR1cm4gc3BlYy5nZXRKb2IoKS5nZXRJZCgpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbigiRmFpbGVkIHRvIGFkZCBqb2Igc3BlYyB0byByZXBvIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfWZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlvcy5jbG9zZSgpOworCQkJfWNhdGNoIChFeGNlcHRpb24gZSkge30KKwkJfQorCX0KKworCXB1YmxpYyBKb2JTcGVjIGdldEpvYkJ5SWQoU3RyaW5nIGpvYklkKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisJICAgIFhTdHJlYW0geHN0cmVhbSA9IG5ldyBYU3RyZWFtKCk7CisJICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisJCXRyeSB7CisJCQlpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUodGhpcy5qb2JNYXAuZ2V0KGpvYklkKSkpOworCQkgICAgcmV0dXJuIChKb2JTcGVjKSB4c3RyZWFtLmZyb21YTUwoaXMpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgam9iIHNwZWMgZnJvbSByZXBvIGJ5IGlkICciICsgam9iSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaXMuY2xvc2UoKTsKKwkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cyhKb2JTcGVjIHNwZWMpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Sm9iQnlJZChzcGVjLmdldEpvYigpLmdldElkKCkpLmdldEpvYigpLmdldFN0YXR1cygpOworCX0KKworCXB1YmxpYyBib29sZWFuIGpvYkZpbmlzaGVkKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24geworCQlTdHJpbmcgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXMoc3BlYyk7CisJICAgIHJldHVybiBzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5TVUNDRVNTKTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSm9iKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24geworCQl0cnkgeworCQkJRmlsZVV0aWxzLmZvcmNlRGVsZXRlKG5ldyBGaWxlKHRoaXMuam9iTWFwLmdldChzcGVjLmdldEpvYigpLmdldElkKCkpKSk7CisJCSAgICBqb2JNYXAucmVtb3ZlKHNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisJCSAgICBqb2JQcmVjZWRlbmNlLnJlbW92ZShzcGVjLmdldEpvYigpLmdldElkKCkpOworCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSBqb2IgJyIgKyBzcGVjLmdldEpvYigpLmdldElkKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlSm9iKEpvYlNwZWMgc3BlYykgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24geworCSAgICBYU3RyZWFtIHhzdHJlYW0gPSBuZXcgWFN0cmVhbSgpOworCSAgICBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUZpbGVVdGlscy5mb3JjZURlbGV0ZShuZXcgRmlsZSh0aGlzLmpvYk1hcC5nZXQoc3BlYy5nZXRKb2IoKS5nZXRJZCgpKSkpOworCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZSh0aGlzLmpvYk1hcC5nZXQoc3BlYy5nZXRKb2IoKS5nZXRJZCgpKSkpOworCQkgICAgeHN0cmVhbS50b1hNTChzcGVjLCBvcyk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKCJGYWlsZWQgdG8gYWRkIGpvYiBzcGVjIHRvIHJlcG8gOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9ZmluYWxseSB7CisJCQl0cnkgeworCQkJCW9zLmNsb3NlKCk7CisJCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQl9CisJfQorCQorCXByb3RlY3RlZCBGaWxlIGdlbmVyYXRlRmlsZVBhdGgoU3RyaW5nIGpvYklkKSB7CisJCXJldHVybiBuZXcgRmlsZSh3b3JraW5nRGlyLCBqb2JJZCArICIueHN0cmVhbSIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvam9icmVwby9YU3RyZWFtSm9iUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vWFN0cmVhbUpvYlJlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMjg4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnJlcG8vWFN0cmVhbUpvYlJlcG9zaXRvcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiBGYWN0b3J5IGZvciBjcmVhdGluZyBYU3RyZWFtIGJhc2VkIEpvYlJlcG9zaXRvcnkKKyAqLworcHVibGljIGNsYXNzIFhTdHJlYW1Kb2JSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIEpvYlJlcG9zaXRvcnlGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhTdHJlYW1Kb2JSZXBvc2l0b3J5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCQorCXB1YmxpYyBYU3RyZWFtSm9iUmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KCkgeworCQl0cnkgeworCQkJU3RyaW5nIHdvcmtpbmdEaXJQcm9wVmFsID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8ueHN0cmVhbS53b3JraW5nLmRpciIpOworCQkJaWYgKHdvcmtpbmdEaXJQcm9wVmFsID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQllbHNlCisJCQkJd29ya2luZ0RpclByb3BWYWwgPSBQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQod29ya2luZ0RpclByb3BWYWwpOworCQkJRmlsZSB3b3JraW5nID0gbmV3IEZpbGUod29ya2luZ0RpclByb3BWYWwpOworCQkJaWYgKCF3b3JraW5nLmV4aXN0cygpKQorCQkJCXdvcmtpbmcubWtkaXJzKCk7CisJCQlpbnQgbWF4SGlzdG9yeSA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8ueHN0cmVhbS5tYXguaGlzdG9yeSIsICItMSIpKTsKKwkJCXJldHVybiBuZXcgWFN0cmVhbUpvYlJlcG9zaXRvcnkod29ya2luZywgbWF4SGlzdG9yeSk7CisJCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGxvYWRlZCBYU3RyZWFtSm9iUmVwb3NpdG9yeSA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbWV0YWRhdGEvSm9iTWV0YWRhdGEuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21ldGFkYXRhL0pvYk1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmN2IzNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21ldGFkYXRhL0pvYk1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHNldCBvZiBtZXRhZGF0YSBjb25zdGFudHMgdXNlZCBieSB7QGxpbmsgSm9ifXMgaW4gdGhlIHJlc291cmNlIG1hbmFnZXIuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9iTWV0YWRhdGEgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFVUVfTkFNRSA9ICJRVUVVRV9OQU1FIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQUQgPSAiTE9BRCI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvQXNzaWdubWVudE1vbml0b3IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvQXNzaWdubWVudE1vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRhNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9Bc3NpZ25tZW50TW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1vbml0b3J9IGludGVyZmFjZSB0aGF0IGxvYWRzIGl0cyBpbmZvcm1hdGlvbgorICogYWJvdXQgdGhlIHVuZGVybHlpbmcgbm9kZXMgZnJvbSBhbiBYTUwgZmlsZSBjYWxsZWQgPGNvZGU+bm9kZXMueG1sPC9jb2RlPi4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkaXRpb25hbGx5IHVzZXMgYW4gaW4tbWVtb3J5IGhhc2ggbWFwIHRvIG1vbml0b3IgdGhlCisgKiBsb2FkIG9uIGEgZ2l2ZW4gc2V0IG9mIHtAbGluayBSZXNvdXJjZU5vZGV9cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIEFzc2lnbm1lbnRNb25pdG9yIGltcGxlbWVudHMgTW9uaXRvciB7CisJCisgICAgLyogb3VyIG5vZGVzIG1hcCAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZU5vZGU+IG5vZGVzTWFwOworCisgICAgLyogb3VyIGxvYWQgbWFwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGxvYWRNYXA7CisKKyAgICBwdWJsaWMgQXNzaWdubWVudE1vbml0b3IoTGlzdDxSZXNvdXJjZU5vZGU+IG5vZGVzKSB7CisgICAgICAgIG5vZGVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZU5vZGU+KCk7CisgICAgICAgIGxvYWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKFJlc291cmNlTm9kZSBub2RlIDogbm9kZXMpIHsKKyAgICAgICAgICAgIG5vZGVzTWFwLnB1dChub2RlLmdldE5vZGVJZCgpLCBub2RlKTsKKyAgICAgICAgICAgIGxvYWRNYXAucHV0KG5vZGUuZ2V0Tm9kZUlkKCksIG5ldyBJbnRlZ2VyKDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNhc3NpZ25Mb2FkKAorICAgICAqICAgICAgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlLCBpbnQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduTG9hZChSZXNvdXJjZU5vZGUgbm9kZSwgaW50IGxvYWRWYWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxvYWRDYXAgPSBub2RlLmdldENhcGFjaXR5KCk7CisgICAgICAgIGludCBjdXJMb2FkID0gbG9hZE1hcC5nZXQobm9kZS5nZXROb2RlSWQoKSk7CisKKyAgICAgICAgaWYgKGxvYWRWYWx1ZSA8PSAobG9hZENhcCAtIGN1ckxvYWQpKSB7CisgICAgICAgICAgICBsb2FkTWFwLnJlbW92ZShub2RlLmdldE5vZGVJZCgpKTsKKyAgICAgICAgICAgIGxvYWRNYXAucHV0KG5vZGUuZ2V0Tm9kZUlkKCksIG5ldyBJbnRlZ2VyKGN1ckxvYWQgKyBsb2FkVmFsdWUpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVkdWNlTG9hZChSZXNvdXJjZU5vZGUgbm9kZSwgaW50IGxvYWRWYWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxvYWQgPSBsb2FkTWFwLmdldChub2RlLmdldE5vZGVJZCgpKTsKKyAgICAgICAgaW50IG5ld1ZhbCA9IGxvYWQgLSBsb2FkVmFsdWU7CisgICAgICAgIGlmIChuZXdWYWwgPCAwKQorICAgICAgICAgICAgbmV3VmFsID0gMDsgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZQorICAgICAgICBsb2FkTWFwLnJlbW92ZShub2RlLmdldE5vZGVJZCgpKTsKKyAgICAgICAgbG9hZE1hcC5wdXQobm9kZS5nZXROb2RlSWQoKSwgbmV3IEludGVnZXIobmV3VmFsKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNnZXRMb2FkKGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvYWQoUmVzb3VyY2VOb2RlIG5vZGUpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VOb2RlIHJlc291cmNlID0gKFJlc291cmNlTm9kZSkgbm9kZXNNYXAuZ2V0KG5vZGUuZ2V0Tm9kZUlkKCkpOworICAgICAgICBpbnQgaSA9IGxvYWRNYXAuZ2V0KG5vZGUuZ2V0Tm9kZUlkKCkpOworICAgICAgICByZXR1cm4gKHJlc291cmNlLmdldENhcGFjaXR5KCkgLSBpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3IjZ2V0Tm9kZXMoKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlc291cmNlTm9kZT4gZ2V0Tm9kZXMoKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yPFJlc291cmNlTm9kZT4obm9kZXNNYXAudmFsdWVzKCkpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNnZXROb2RlQnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU5vZGUgZ2V0Tm9kZUJ5SWQoU3RyaW5nIG5vZGVJZCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFJlc291cmNlTm9kZSkgbm9kZXNNYXAuZ2V0KG5vZGVJZCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBnb3YubmFzYS5qcGwub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI2dldE5vZGVCeVVSTChqYXZhLm5ldC5VUkwpCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlVUkwoVVJMIGlwQWRkcikgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBSZXNvdXJjZU5vZGUgdGFyZ2V0UmVzb3VyY2UgPSBudWxsOworICAgICAgICBMaXN0PFJlc291cmNlTm9kZT4gbm9kZXMgPSB0aGlzLmdldE5vZGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKFJlc291cmNlTm9kZSkgbm9kZXMuZ2V0KGkpKS5nZXRJcEFkZHIoKSA9PSBpcEFkZHIpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRSZXNvdXJjZSA9IChSZXNvdXJjZU5vZGUpIG5vZGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFyZ2V0UmVzb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTm9kZShSZXNvdXJjZU5vZGUgbm9kZSkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBub2Rlc01hcC5wdXQobm9kZS5nZXROb2RlSWQoKSwgbm9kZSk7CisgICAgICAgIGlmICghbG9hZE1hcC5jb250YWluc0tleShub2RlLmdldE5vZGVJZCgpKSkKKyAgICAgICAgICAgIGxvYWRNYXAucHV0KG5vZGUuZ2V0Tm9kZUlkKCksIG5ldyBJbnRlZ2VyKDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIG5vZGVzTWFwLnJlbW92ZShub2RlSWQpOyAgICAKKyAgICAgICAgbG9hZE1hcC5yZW1vdmUobm9kZUlkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL0Fzc2lnbm1lbnRNb25pdG9yRmFjdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9Bc3NpZ25tZW50TW9uaXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDg3Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9Bc3NpZ25tZW50TW9uaXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVyZXBvLlhtbE5vZGVSZXBvc2l0b3J5RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3Rvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQ3JlYXRlcyBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIEFzc2lnbm1lbnRNb25pdG9yfXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIEFzc2lnbm1lbnRNb25pdG9yRmFjdG9yeSBpbXBsZW1lbnRzIE1vbml0b3JGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoQXNzaWdubWVudE1vbml0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlCisgICAgICogZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvckZhY3RvcnkjY3JlYXRlTW9uaXRvcigpCisgICAgICovCisgICAgcHVibGljIEFzc2lnbm1lbnRNb25pdG9yIGNyZWF0ZU1vbml0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgbm9kZVJlcG9GYWN0b3J5U3RyID0gU3lzdGVtLmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAiZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLnJlcG8uZmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgIFhtbE5vZGVSZXBvc2l0b3J5RmFjdG9yeS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NpZ25tZW50TW9uaXRvcihHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0Tm9kZVJlcG9zaXRvcnlGcm9tRmFjdG9yeShub2RlUmVwb0ZhY3RvcnlTdHIpCisgICAgICAgICAgICAgICAgICAgIC5sb2FkTm9kZXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBjcmVhdGUgQXNzaWdubWVudCBNb25pdG9yIDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL01vbml0b3IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvTW9uaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWZlZjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL01vbml0b3IuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciB3b29sbGFyZAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGhlIEpvYiBNb25pdG9yIGludGVyZmFjZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBNb25pdG9yIHsKKworIC8qKgorICAgKiBHZXRzIHRoZSBsb2FkIG9uIGEgcmVzb3VyY2Ugbm9kZSBhdmFpbGFibGUgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIuCisgICAqIAorICAgKiBAcGFyYW0gbm9kZQorICAgKiAgICAgICAgICBUaGUge0BsaW5rIFJlc291cmNlTm9kZX0gdG8gb2J0YWluIHRoZSBsb2FkIGZvci4KKyAgICogQHJldHVybiBBbiBpbnRlZ2VyIHJlc3ByZXNlbnRhdGlvbiBvZiB0aGUgbG9hZCBvbiBhIHtAbGluayBSZXNvdXJjZU5vZGV9LgorICAgKiBAdGhyb3dzIE1vbml0b3JFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciBvYnRhaW5pbmcgdGhlIGxvYWQuCisgICAqLworICBwdWJsaWMgaW50IGdldExvYWQoUmVzb3VyY2VOb2RlIG5vZGUpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uOworCisgIC8qKgorICAgKiAKKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB0aGUge0BsaW5rIFJlc291cmNlTm9kZX1zIGtub3duIHRvIHRoZSByZXNvdXJjZQorICAgKiAgICAgICAgIG1hbmFnZXIuCisgICAqIEB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3VycyBnZXR0aW5nIHRoZSB7QGxpbmsgTGlzdH0gb2YKKyAgICogICAgICAgICAgIHtAbGluayBSZXNvdXJjZU5vZGV9cy4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldE5vZGVzKCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb247CisgIAorICAKKyAgLyoqCisgICAqIEdldHMgdGhlIHtAbGluayBSZXNvdXJjZU5vZGV9IHdpdGggdGhlIGdpdmVuIDxjb2RlPm5vZGVJZDwvY29kZT4uCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUmVzb3VyY2VOb2RlfSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+bm9kZUlkPC9jb2RlPi4KKyAgICogQHRocm93cyBNb25pdG9yRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbjsKKworICAKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHtAbGluayBSZXNvdXJjZU5vZGV9IHdpdGggdGhlIGdpdmVuIDxjb2RlPmlwQWRkcjwvY29kZT4uCisgICAqIEBwYXJhbSBpcEFkZHIgVGhlIFVSTCBvZiB0aGUgUmVzb3VyY2VOb2RlIHRvIHJldHVybi4KKyAgICogQHJldHVybiBUaGUge0BsaW5rIFJlc291cmNlTm9kZX0gd2l0aCB0aGUgZ2l2ZW4gaXBBZGRyLgorICAgKiBAdGhyb3dzIE1vbml0b3JFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBSZXNvdXJjZU5vZGUgZ2V0Tm9kZUJ5VVJMKFVSTCBpcEFkZHIpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uOworICAKKyAgLyoqCisgICAqIFJlZHVjZXMgdGhlIGxvYWQgb24gYSBwYXJ0aWN1bGFyIHtAbGluayBSZXNvdXJjZU5vZGV9IGJ5IHRoZSBnaXZlbgorICAgKiA8Y29kZT5sb2FkVmFsdWU8L2NvZGU+LgorICAgKiAKKyAgICogQHBhcmFtIG5vZGUgVGhlIHtAbGluayBSZXNvdXJjZU5vZGV9IHRvIHJlZHVjZSB0aGUgbG9hZCBvbi4KKyAgICogQHBhcmFtIGxvYWRWYWx1ZSBUaGUgYW1vdW50IG9mIHJlZHVjdGlvbi4KKyAgICogQHJldHVybiBUcnVlIGlmIHN1Y2Nlc3NmdWxseSByZWR1Y2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqIEB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gcmVkdWNlTG9hZChSZXNvdXJjZU5vZGUgbm9kZSwgaW50IGxvYWRWYWx1ZSkKKyAgdGhyb3dzIE1vbml0b3JFeGNlcHRpb247CisgIAorICAKKyAgLyoqCisgICAqIAorICAgKiBAcGFyYW0gbm9kZQorICAgKiAgICAgICAgICBUaGUge0BsaW5rIFJlc291cmNlTm9kZX0gdG8gYXNzaWduIGxvYWQgdG8uCisgICAqIEBwYXJhbSBsb2FkVmFsdWUKKyAgICogICAgICAgICAgVGhlIGludGVnZXIgbG9hZCB0byBhc3NpZ24gdG8gdGhlIGdpdmVuIHtAbGluayBSZXNvdXJjZU5vZGV9LgorICAgKiAgICAgICAgICAKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBNb25pdG9yIHdhcyBhYmxlIHRvIGFzc2lnbiB0aGUgbG9hZCwgZmFsc2UKKyAgICogb3RoZXJ3aXNlLgorICAgKiBAdGhyb3dzIE1vbml0b3JFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMgYXNzaWduaW5nIHRoZSBsb2FkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYXNzaWduTG9hZChSZXNvdXJjZU5vZGUgbm9kZSwgaW50IGxvYWRWYWx1ZSkKKyAgICAgIHRocm93cyBNb25pdG9yRXhjZXB0aW9uOworICAKKwkvKioKKyAgICAgKiBBZGRzIGEgbmV3IHtAbGluayBSZXNvdXJjZU5vZGV9IGZvciB0aGlzIHtAbGluayBNb25pdG9yfSB0byBtYW5hZ2UgKGlmCisgICAgICogbm9kZSBhbHJlYWR5IGV4aXN0LCB0aGVuIHNob3VsZCBwZXJmb3JtIHVwZGF0ZSkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm9kZQorICAgICAqICAgICAgICAgICAgVGhlIG5ldyB7QGxpbmsgUmVzb3VyY2VOb2RlfSB0byBtYW5hZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb2RlKFJlc291cmNlTm9kZSBub2RlKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB7QGxpbmsgUmVzb3VyY2VOb2RlfSBmcm9tIHRoaXMge0BsaW5rIE1vbml0b3J9CisgICAgICogCisgICAgICogQHBhcmFtIG5vZGVJZAorICAgICAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSB7QGxpbmsgUmVzb3VyY2VOb2RlfSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbjsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvTW9uaXRvckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvTW9uaXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY5NzkyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9Nb25pdG9yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBDcmVhdGVzIG5ldyB7QGxpbmsgTW9uaXRvcn0gaW1wbGVtZW50YXRpb25zLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTW9uaXRvckZhY3RvcnkgeworCisJLyoqCisJICogQHJldHVybiBBIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1vbml0b3J9IGludGVyZmFjZS4KKwkgKi8KKwlwdWJsaWMgTW9uaXRvciBjcmVhdGVNb25pdG9yKCk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYUFkYXB0ZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9HYW5nbGlhQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWEwYjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuY29uZmlndXJhdGlvbi5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmNvbmZpZ3VyYXRpb24uSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5jb25maWd1cmF0aW9uLk1ldHJpYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR2FuZ2xpYUFkYXB0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HID0gIklTTy04ODU5LTEiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdDsKKyAgICAKKyAgICBwcml2YXRlIGludCBwb3J0OworICAgIAorICAgIAorICAgIHB1YmxpYyBHYW5nbGlhQWRhcHRlcihTdHJpbmcgaG9zdCwgaW50IHBvcnQpeworICAgICAgIAl0aGlzLmhvc3QgPSBob3N0OworICAgICAgIAl0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHByb3RlY3RlZCBHYW5nbGlhQWRhcHRlcigpeworICAgIAl0aGlzKG51bGwsIC05OTk5KTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHJlc291cmNlIG5vZGVzJyBzdGF0dXMuCisgICAgICogQHJldHVybiBNYXAgdGhhdCBjb250YWlucyBzdGF0dXMgb2YgcmVzb3VyY2Ugbm9kZXMKKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4gZ2V0UmVzb3VyY2VOb2RlU3RhdHVzKCkKKyAgICAgICAgICAgIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxDbHVzdGVyPiBncmlkU3RhdHVzID0gcGFyc2VDb25maWd1cmF0aW9uKHJlYWRYTUxEdW1wKHRoaXMuaG9zdCwgdGhpcy5wb3J0KSk7CisgICAgICAgIHJldHVybiBmaWx0ZXJOb2RlcyhncmlkU3RhdHVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rICNob3N0fTp7QGxpbmsgI3BvcnR9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVcmxTdHJpbmcoKXsKKyAgICAJcmV0dXJuIHRoaXMuaG9zdCsiOiIrdGhpcy5wb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBvdXQgdGhlIG5vZGVzIGZyb20gdGhlIGdyaWQgc3RhdGUgZ2FuZ2xpYSBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIGdyaWRTdGF0dXMgR2FuZ2xpYSBtZXRhIGRhZW1vbiBwYXJzZWQgZ3JpZCBzdGF0dXMKKyAgICAgKiBAcmV0dXJuIHJlc291cmNlIG5vZGUgTWFwCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFN0cmluZz4+IGZpbHRlck5vZGVzIChMaXN0PENsdXN0ZXI+IGdyaWRTdGF0dXMpeworCisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4gbm9kZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4oKTsKKyAgICAgICAgZm9yIChDbHVzdGVyIGNsdXN0ZXIgOiBncmlkU3RhdHVzKSB7CisgICAgICAgICAgICBmb3IgKEhvc3QgaG9zdCA6IGNsdXN0ZXIuZ2V0SG9zdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldHJpY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRyaWMgbWV0cmljIDogaG9zdC5nZXRNZXRyaWNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MucHV0KG1ldHJpYy5nZXROYW1lKCksIG1ldHJpYy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLnB1dChHYW5nbGlhTWV0S2V5cy5UTixob3N0LmdldFRuKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLnB1dChHYW5nbGlhTWV0S2V5cy5UTUFYLCBob3N0LmdldFRtYXgoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MucHV0KEdhbmdsaWFNZXRLZXlzLklQLCBob3N0LmdldElwKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLnB1dChHYW5nbGlhTWV0S2V5cy5OQU1FLCBob3N0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1dChob3N0LmdldE5hbWUoKSwgbWV0cmljcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIFhNTCBkdW1wIGZyb20gYSBnYW5nbGlhIG1ldGEgZGFlbW9uLgorICAgICAqIEByZXR1cm4gQSBTdHJpbmcgdGhhdCBjb250YWlucyBhbGwgdGhlIGR1bXAKKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb24ge0BsaW5rIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb259CisgICAgICogaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSByZWFkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRYTUxEdW1wKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvY2tldCBzID0gbmV3IFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocy5nZXRJbnB1dFN0cmVhbSgpLCBFTkNPRElORykpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIlVua25vd24gaG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIi0iICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIlVuYWJsZSB0byBnZXQgdGhlIG1vbml0b3JpbmcgcmVwb3J0IGZyb20gdGhlIEdNZXRhIGRhZW1vbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKS50cmltKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBjb25maWd1cmF0aW9uIGZyb20gYSBYTUwgb3V0cHV0IG9mIGEgR2FuZ2xpYSBtZXRhIGRhZW1vbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBYTUwgYnVmZmVyCisgICAgICogQHJldHVybiBhIENvbmZpZ3VyYXRpb24KKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb24ge0BsaW5rIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb259IGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PENsdXN0ZXI+IHBhcnNlQ29uZmlndXJhdGlvbihTdHJpbmcgYnVmZmVyKQorICAgICAgICAgICAgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciBwYXJzZXI7CisgICAgICAgIEdhbmdsaWFYTUxQYXJzZXIgZ2FuZ2xpYVhNTFBhcnNlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisgICAgICAgICAgICBnYW5nbGlhWE1MUGFyc2VyID0gbmV3IEdhbmdsaWFYTUxQYXJzZXIoKTsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihidWZmZXIpKSwgZ2FuZ2xpYVhNTFBhcnNlcik7CisKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgcGFyc2luZzogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBYTUw6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKCJJL08gZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdhbmdsaWFYTUxQYXJzZXIuZ2V0R3JpZENvbmZpZ3VyYXRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYU1ldEtleXMuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9HYW5nbGlhTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYU1ldEtleXMuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYTsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgaW50ZXJmYWNlIEdhbmdsaWFNZXRLZXlzIHsKKworCS8qIFhNTCBzcGVjaWZpYyBrZXlzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xVU1RFUiA9ICJDTFVTVEVSIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gIkhPU1QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVFJJQyA9ICJNRVRSSUMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJOQU1FIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUwgPSAiVkFMIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUTiA9ICJUTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE1BWCA9ICJUTUFYIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETUFYID0gIkRNQVgiOworCisgICAgLypNZXRyaWMgc3BlY2lmaWMga2V5cyovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJUWVBFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklUUyA9ICJVTklUUyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xPUEUgPSAiU0xPUEUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRSA9ICJTT1VSQ0UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VMRU1FTlQgPSAiRVhUUkFfRUxFTUVOVCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVAgPSAiR1JPVVAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0MgPSAiREVTQyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVElUTEUiOworCisgICAgLypIb3N0IHNwZWNpZmljIGtleXMqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElQID0gIklQIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRFRCA9ICJSRVBPUlRFRCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAiTE9DQVRJT04iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdNT05EX1NUQVJURUQgPSAiR01PTkRfU1RBUlRFRCI7CisKKyAgICAvKkNsdXN0ZXIgc3BlY2lmaWMga2V5cyovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxUSU1FID0gIkxPQ0FMVElNRSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dORVIgPSAiT1dORVIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBVExPTkcgPSAiTEFUTE9ORyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gIlVSTCI7CisgICAgCisgICAgLypHYW5nbGlhIG1ldHJpYyBrZXlzKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMT0FEX09ORSA9ICJsb2FkX29uZSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9BRF9GSVZFID0gImxvYWRfZml2ZSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9BRF9GSUZURUVOID0gImxvYWRfZmlmdGVlbiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1BVX05VTSA9ICJjcHVfbnVtIjsKKworICAgIC8qIFZhcmlvdXMgbmVlZGVkIGtleXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBNQVhJTVVNX0ZSQUNUSU9OX0RJR0lUUyA9IDM7CisKKworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYVJlc291cmNlTW9uaXRvci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL0dhbmdsaWFSZXNvdXJjZU1vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTgzZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL0dhbmdsaWFSZXNvdXJjZU1vbml0b3IuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEubG9hZGNhbGMuTG9hZENhbGN1bGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5HYW5nbGlhTWV0S2V5cy5OQU1FOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgcmFqaXRoCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHYW5nbGlhUmVzb3VyY2VNb25pdG9yIGltcGxlbWVudHMgTW9uaXRvciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisJCQkuZ2V0TG9nZ2VyKEdhbmdsaWFSZXNvdXJjZU1vbml0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIExvYWRDYWxjdWxhdG9yIGxvYWRDYWxjdWxhdG9yOworCXByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gbG9hZE1hcDsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGdtZXRhTm9kZXM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBHYW5nbGlhQWRhcHRlcj4gZ21ldGFBZGFwdGVyczsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1JUID0gODY0OTsKKworCS8qKgorCSAqIE1ha2UgYSBuZXcgR2FuZ2xpYVJlc291cmNlTW9uaXRvciB0aGF0IHJlYWRzIGluZm9ybWF0aW9uIGZyb20gYSBnYW5nbGlhCisJICogbWV0YSBkYWVtb24uCisJICogCisJICogQHBhcmFtIGxvYWRDYWxjdWxhdG9yCisJICogICAgICAgICAgICBMb2FkQ2FsY3VsYXRvcgorCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmxvYWRjYWxjLkxvYWRDYWxjdWxhdG9yfQorCSAqICAgICAgICAgICAgdG8gY2FsY3VsYXRlIGxvYWQKKwkgKiBAcGFyYW0gbm9kZXMKKwkgKiAgICAgICAgICAgIHJlc291cmNlIG5vZGVzCisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZX0gdG8KKwkgKiAgICAgICAgICAgIGJlIG1vbml0b3JlZC4KKwkgKi8KKwlwdWJsaWMgR2FuZ2xpYVJlc291cmNlTW9uaXRvcihMb2FkQ2FsY3VsYXRvciBsb2FkQ2FsY3VsYXRvciwKKwkJCVN0cmluZyBnbWV0YWRIb3N0LCBpbnQgZ21ldGFkUG9ydCkgeworCQl0aGlzLmxvYWRDYWxjdWxhdG9yID0gbG9hZENhbGN1bGF0b3I7CisJCXRoaXMubG9hZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKwkJdGhpcy5nbWV0YU5vZGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PigpOworCQl0aGlzLmdtZXRhQWRhcHRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEdhbmdsaWFBZGFwdGVyPigpOworCQl0cnkgeworCQkJdGhpcy5pbml0R21ldGFOb2RlcyhnbWV0YWRIb3N0LCBnbWV0YWRQb3J0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlMT0cubG9nKExldmVsLldBUk5JTkcsCisJCQkJCSJVUkwgZXhjZXB0aW9uIGluaXRpYWxpemluZyBnbWV0YWQgbm9kZXM6IFsiICsgZ21ldGFkSG9zdAorCQkJCQkJCSsgIjoiICsgZ21ldGFkUG9ydCArICJdOiBNZXNzYWdlOiAiCisJCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0TG9hZChSZXNvdXJjZU5vZGUgbm9kZSkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG5vZGVQcm9wZXJ0aWVzID0gbnVsbDsKKwkJU3RyaW5nIG5vZGVJZCA9IG5vZGUuZ2V0Tm9kZUlkKCk7CisJCW5vZGVQcm9wZXJ0aWVzID0gdGhpcy5sb2NhdGVOb2RlKG5vZGVJZCk7CisJCWlmIChub2RlUHJvcGVydGllcyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbigKKwkJCQkJIkdhbmdsaWFNb25pdG9yOiBub3QgdHJhY2tpbmcgcmVxdWVzdGVkIG5vZGU6IFsiICsgbm9kZUlkCisJCQkJCQkJKyAiXSIpOworCQl9CisKKwkJLy8gY2FsY3VsYXRlIGxvYWQKKwkJZG91YmxlIGNhbGNMb2FkID0gdGhpcy5sb2FkQ2FsY3VsYXRvci5jYWxjdWxhdGVMb2FkKG5vZGVQcm9wZXJ0aWVzKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGNMb2FkKTsKKwkJaW50IGxvYWQgPSBuZXcgTG9uZyhNYXRoLnJvdW5kKGNhbGNMb2FkKSkuaW50VmFsdWUoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJMT0FEIGlzOiAiK2xvYWQpOworCQlyZXR1cm4gbG9hZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBhc3NpZ25Mb2FkKFJlc291cmNlTm9kZSBub2RlLCBpbnQgbG9hZFZhbHVlKQorCQkJdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworCQkvLyB0ZWNobmljYWxseSB0aGlzIG1ldGhvZCBzaG91bGQgc2ltcGx5IGRvIG5vdGhpbmcsIHNpbmNlCisJCS8vIHB1dHRpbmcgYSBqb2Igb250byBhIG5vZGUgc2hvdWxkIGNhdXNlIEdhbmdsaWEgdG8gZGV0ZWN0CisJCS8vIGZvciBub3cgd2UnbGwgc2ltcGx5IHRyYWNrIHdoYXQgdGhlIGN1cnJlbnQgcGVyY2VpdmVkIGxvYWQKKwkJLy8gb24gYSBub2RlIGlzIC0gd2UgbWF5IHdhbnQgdG8gZmFjdG9yIHRoaXMgaW50byB0aGUgd2VpZ2h0aW5nCisJCS8vIGluIGxvYWQgY2FsY3VsYXRvciBsYXRlcgorCQlTdHJpbmcgbm9kZUlkID0gbm9kZS5nZXROb2RlSWQoKTsKKwkJaWYgKGxvYWRNYXAuY29udGFpbnNLZXkobm9kZUlkKSkgeworCQkJaW50IGN1cnJMb2FkID0gbG9hZE1hcC5nZXQobm9kZUlkKTsKKwkJCWN1cnJMb2FkICs9IGxvYWRWYWx1ZTsKKwkJCWxvYWRNYXAucHV0KG5vZGVJZCwgY3VyckxvYWQpOworCQl9IGVsc2UgeworCQkJbG9hZE1hcC5wdXQobm9kZUlkLCBsb2FkVmFsdWUpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZE5vZGUoUmVzb3VyY2VOb2RlIG5vZGUpIHsKKwkJdGhpcy5hZGRHbWV0YWROb2RlKG5vZGUuZ2V0SXBBZGRyKCkuZ2V0SG9zdCgpLCBub2RlLmdldElwQWRkcigpCisJCQkJLmdldFBvcnQoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGVCeUlkKFN0cmluZyBub2RlSWQpIHsKKwkJdGhpcy5yZW1vdmVHbWV0YWROb2RlKG5vZGVJZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisJCUxpc3Q8UmVzb3VyY2VOb2RlPiBub2RlcyA9IG5ldyBWZWN0b3I8UmVzb3VyY2VOb2RlPigpOworCQlpZiAodGhpcy5nbWV0YUFkYXB0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoR2FuZ2xpYUFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ21ldGFBZGFwdGVycy52YWx1ZXMoKSkgeworCQkJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGFOb2RlcyA9IGFkYXB0ZXIKKwkJCQkJCS5nZXRSZXNvdXJjZU5vZGVTdGF0dXMoKTsKKwkJCQlmb3IgKE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwIDogYU5vZGVzLnZhbHVlcygpKSB7CisJCQkJCXRyeSB7CisJCQkJCQlub2Rlcy5hZGQodGhpcy5ub2RlRnJvbU1hcChtYXApKTsKKwkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQl0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gbm9kZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5ub2RlRnJvbU1hcCh0aGlzLmxvY2F0ZU5vZGUobm9kZUlkKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlVUkwoVVJMIGlwQWRkcikgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworCQlpZiAodGhpcy5nbWV0YUFkYXB0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoR2FuZ2xpYUFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ21ldGFBZGFwdGVycy52YWx1ZXMoKSkgeworCQkJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGFOb2RlcyA9IGFkYXB0ZXIKKwkJCQkJCS5nZXRSZXNvdXJjZU5vZGVTdGF0dXMoKTsKKwkJCQlmb3IgKFN0cmluZyBhTm9kZUlkIDogYU5vZGVzLmtleVNldCgpKSB7CisJCQkJCVN0cmluZyBob3N0ID0gaXBBZGRyLmdldEhvc3QoKTsKKwkJCQkJaW50IHBvcnQgPSBpcEFkZHIuZ2V0UG9ydCgpOworCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG5vZGVQcm9wcyA9IGFOb2Rlcy5nZXQoYU5vZGVJZCk7CisJCQkJCWlmIChhTm9kZUlkLmVxdWFscyhob3N0KQorCQkJCQkJCSYmIG5vZGVQcm9wcy5nZXQoREVGQVVMVF9QT1JUKS5lcXVhbHMoCisJCQkJCQkJCQlTdHJpbmcudmFsdWVPZihwb3J0KSkpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJcmV0dXJuIHRoaXMubm9kZUZyb21NYXAoYU5vZGVzLmdldChhTm9kZUlkKSk7CisJCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcmVkdWNlTG9hZChSZXNvdXJjZU5vZGUgbm9kZSwgaW50IGxvYWRWYWx1ZSkKKwkJCXRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5vZGVJZCA9IG5vZGUuZ2V0Tm9kZUlkKCk7CisJCWlmICh0aGlzLmxvYWRNYXAuY29udGFpbnNLZXkobm9kZUlkKSkgeworCQkJaW50IGN1cnJMb2FkID0gbG9hZE1hcC5nZXQobm9kZUlkKTsKKwkJCWN1cnJMb2FkID0gTWF0aC5taW4oMCwgY3VyckxvYWQgLSBsb2FkVmFsdWUpOworCQkJdGhpcy5sb2FkTWFwLnB1dChub2RlSWQsIGN1cnJMb2FkKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMubG9hZE1hcC5wdXQobm9kZUlkLCAwKTsKKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2F0ZU5vZGUoU3RyaW5nIG5vZGVJZCkgeworCQlpZiAodGhpcy5nbWV0YUFkYXB0ZXJzICE9IG51bGwgJiYgdGhpcy5nbWV0YUFkYXB0ZXJzLnNpemUoKSA+IDApIHsKKwkJCWZvciAoU3RyaW5nIG5JZCA6IHRoaXMuZ21ldGFBZGFwdGVycy5rZXlTZXQoKSkgeworCQkJCUdhbmdsaWFBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmdtZXRhQWRhcHRlcnMuZ2V0KG5JZCk7CisJCQkJdHJ5IHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJRdWVyeWluZyBnbWV0YWQ6IFsiK2FkYXB0ZXIuZ2V0VXJsU3RyaW5nKCkrIl0iKTsKKwkJCQkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbm9kZVN0YXR1cyA9IGFkYXB0ZXIKKwkJCQkJCQkuZ2V0UmVzb3VyY2VOb2RlU3RhdHVzKCk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9va2luZyBmb3Igbm9kZWlkOiBbIitub2RlSWQrIl0iKTsKKwkJCQkJaWYgKG5vZGVTdGF0dXMuY29udGFpbnNLZXkobm9kZUlkKSkgeworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOT0RFIG1ldDogIitub2RlU3RhdHVzLmdldChub2RlSWQpKTsKKwkJCQkJCXJldHVybiBub2RlU3RhdHVzLmdldChub2RlSWQpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkJCQkiTW9uaXRvckV4Y2VwdGlvbiBjb250YWN0aW5nIEdhbmdsaWE6IFsiCisJCQkJCQkJCQkrIGFkYXB0ZXIuZ2V0VXJsU3RyaW5nKCkgKyAiXSIpOworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZU5vZGUgbm9kZUZyb21NYXAoTWFwPFN0cmluZywgU3RyaW5nPiBtYXApCisJCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJaWYgKG1hcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJUmVzb3VyY2VOb2RlIG5vZGUgPSBuZXcgUmVzb3VyY2VOb2RlKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiTUFQIElTICIrbWFwKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIGhvc3RuYW1lIHRvICIrbWFwLmdldChOQU1FKSk7CisJCW5vZGUuc2V0SWQobWFwLmdldChOQU1FKSk7CisJCW5vZGUuc2V0SXBBZGRyKG5ldyBVUkwoImh0dHA6Ly8iICsgbWFwLmdldChOQU1FKSArICI6IiArIERFRkFVTFRfUE9SVCkpOworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdEdtZXRhTm9kZXMoU3RyaW5nIGhvc3QsIGludCBwb3J0KQorCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCXRoaXMuYWRkR21ldGFkTm9kZShob3N0LCBwb3J0KTsKKwl9CisKKwlwcml2YXRlIEdhbmdsaWFBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTWFwPFN0cmluZywgU3RyaW5nPiBub2RlKSB7CisJCXJldHVybiBuZXcgR2FuZ2xpYUFkYXB0ZXIobm9kZS5nZXQoImhvc3QiKSwgSW50ZWdlci52YWx1ZU9mKG5vZGUKKwkJCQkuZ2V0KCJwb3J0IikpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkR21ldGFkTm9kZShTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiByb290Tm9kZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlyb290Tm9kZS5wdXQoImhvc3QiLCBob3N0KTsKKwkJcm9vdE5vZGUucHV0KCJwb3J0IiwgU3RyaW5nLnZhbHVlT2YocG9ydCkpOworCQl0aGlzLmdtZXRhTm9kZXMucHV0KGhvc3QsIHJvb3ROb2RlKTsKKwkJdGhpcy5nbWV0YUFkYXB0ZXJzLnB1dChob3N0LCB0aGlzLmNyZWF0ZUFkYXB0ZXIocm9vdE5vZGUpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlR21ldGFkTm9kZShTdHJpbmcgaG9zdCkgeworCQlpZiAodGhpcy5nbWV0YU5vZGVzLmNvbnRhaW5zS2V5KGhvc3QpCisJCQkJJiYgdGhpcy5nbWV0YUFkYXB0ZXJzLmNvbnRhaW5zS2V5KGhvc3QpKSB7CisJCQlMT0cubG9nKExldmVsLkZJTkUsCisJCQkJCSJSZW1vdmluZyBnbWV0YWQgbm9kZTogWyIKKwkJCQkJCQkrIGdtZXRhQWRhcHRlcnMuZ2V0KGhvc3QpLmdldFVybFN0cmluZygpICsgIl0iKTsKKwkJCXRoaXMuZ21ldGFBZGFwdGVycy5yZW1vdmUoaG9zdCk7CisJCQl0aGlzLmdtZXRhTm9kZXMucmVtb3ZlKGhvc3QpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYVJlc291cmNlTW9uaXRvckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9HYW5nbGlhUmVzb3VyY2VNb25pdG9yRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzQwNWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYVJlc291cmNlTW9uaXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworCisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3JGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmxvYWRjYWxjLkxvYWRDYWxjdWxhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLkdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgcmFqaXRoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHYW5nbGlhUmVzb3VyY2VNb25pdG9yRmFjdG9yeSBpbXBsZW1lbnRzIE1vbml0b3JGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKwkJCS5nZXRMb2dnZXIoR2FuZ2xpYVJlc291cmNlTW9uaXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBNb25pdG9yIGNyZWF0ZU1vbml0b3IoKSB7CisJCXRyeSB7CisJCQlTdHJpbmcgbG9hZENhbGN1bGF0b3JGYWN0b3J5U3RyID0gU3lzdGVtCisJCQkJCS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmxvYWRjYWxjLmZhY3RvcnkiKTsKKwkJCVN0cmluZyBub2RlUmVwb0ZhY3RvcnlTdHIgPSBTeXN0ZW0KKwkJCQkJLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLnJlcG8uZmFjdG9yeSIpOworCQkJCisJCQlTdHJpbmcgZ21ldGFkSG9zdCA9IFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5nZW10YWQuaG9zdC5hZGRyZXNzIik7CisJCQkKKwkJCWludCBnbWV0YWRQb3J0ID0gSW50ZWdlci52YWx1ZU9mKFN5c3RlbQorCQkgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5nZW10YWQuaG9zdC5wb3J0IikpOworCisJCQlMb2FkQ2FsY3VsYXRvciBsb2FkQ2FsY3VsYXRvciA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5CisJCQkJCS5nZXRMb2FkQ2FsY3VsYXRvckZyb21TZXJ2aWNlRmFjdG9yeShsb2FkQ2FsY3VsYXRvckZhY3RvcnlTdHIpOworCisJCQlyZXR1cm4gbmV3IEdhbmdsaWFSZXNvdXJjZU1vbml0b3IobG9hZENhbGN1bGF0b3IsIGdtZXRhZEhvc3QsIGdtZXRhZFBvcnQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisJCQkJCSJGYWlsZWQgdG8gY3JlYXRlIFJlc291cmNlIE1vbml0b3IgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9HYW5nbGlhWE1MUGFyc2VyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYVhNTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGU0N2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvR2FuZ2xpYVhNTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmNvbmZpZ3VyYXRpb24uQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5jb25maWd1cmF0aW9uLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuY29uZmlndXJhdGlvbi5NZXRyaWM7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciByYWppdGgKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiBTQVggcGFyc2VyIHRvIGNyZWF0ZSBhIGdyaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgWE1MIHN0cmVhbS4KKyAqIFhNTCBzY2hlbWEgY29ycmVzcG9uZHMgdG8gYSBHTWV0YWQgWE1MIG91dHB1dC4KKyAqLworcHVibGljIGNsYXNzIEdhbmdsaWFYTUxQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIEdhbmdsaWFNZXRLZXlzIHsKKworICAgIHByaXZhdGUgTGlzdDxDbHVzdGVyPiBncmlkOworICAgIHByaXZhdGUgQ2x1c3RlciBjdXJyZW50Q2x1c3RlcjsKKyAgICBwcml2YXRlIExpc3Q8SG9zdD4gY3VycmVudENsdXN0ZXJIb3N0czsKKyAgICBwcml2YXRlIEhvc3QgY3VycmVudEhvc3Q7CisgICAgcHJpdmF0ZSBMaXN0PE1ldHJpYz4gY3VycmVudEhvc3RNZXRyaWNzOworICAgIHByaXZhdGUgTWV0cmljIGN1cnJlbnRNZXRyaWM7CisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBleHRyYURhdGE7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lLmVxdWFscyhNRVRSSUMpKSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRNZXRyaWMuc2V0RXh0cmFEYXRhKGV4dHJhRGF0YSk7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0TWV0cmljcy5hZGQoY3VycmVudE1ldHJpYyk7CisKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhIT1NUKSkgeworICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdC5zZXRNZXRyaWNzKGN1cnJlbnRIb3N0TWV0cmljcyk7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRDbHVzdGVySG9zdHMuYWRkKGN1cnJlbnRIb3N0KTsKKworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENMVVNURVIpKSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRDbHVzdGVyLnNldEhvc3RzKGN1cnJlbnRDbHVzdGVySG9zdHMpOworICAgICAgICAgICAgdGhpcy5ncmlkLmFkZChjdXJyZW50Q2x1c3Rlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB0aGlzLmdyaWQgPSBuZXcgQXJyYXlMaXN0PENsdXN0ZXI+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKE1FVFJJQykpIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudE1ldHJpYyA9IG5ldyBNZXRyaWMoYXR0cy5nZXRWYWx1ZShOQU1FKSwgYXR0cy5nZXRWYWx1ZShWQUwpLCBhdHRzLmdldFZhbHVlKFRZUEUpLAorICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKFVOSVRTKSwgYXR0cy5nZXRWYWx1ZShUTiksIGF0dHMuZ2V0VmFsdWUoVE1BWCksIGF0dHMuZ2V0VmFsdWUoRE1BWCksCisgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0VmFsdWUoU0xPUEUpLCBhdHRzLmdldFZhbHVlKFNPVVJDRSkpOworICAgICAgICAgICAgdGhpcy5leHRyYURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEVYVFJBX0VMRU1FTlQpKSB7CisgICAgICAgICAgICB0aGlzLmV4dHJhRGF0YS5wdXQoYXR0cy5nZXRWYWx1ZShOQU1FKSwgYXR0cy5nZXRWYWx1ZShWQUwpKTsKKworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEhPU1QpKSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ID0gbmV3IEhvc3QoYXR0cy5nZXRWYWx1ZShOQU1FKSwgYXR0cy5nZXRWYWx1ZShJUCksIGF0dHMuZ2V0VmFsdWUoUkVQT1JURUQpLAorICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKFROKSwgYXR0cy5nZXRWYWx1ZShUTUFYKSwgYXR0cy5nZXRWYWx1ZShETUFYKSwgYXR0cy5nZXRWYWx1ZShMT0NBVElPTiksCisgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0VmFsdWUoR01PTkRfU1RBUlRFRCkpOworICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdE1ldHJpY3MgPSBuZXcgQXJyYXlMaXN0PE1ldHJpYz4oKTsKKworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENMVVNURVIpKSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRDbHVzdGVyID0gbmV3IENsdXN0ZXIoYXR0cy5nZXRWYWx1ZShOQU1FKSwgYXR0cy5nZXRWYWx1ZShMT0NBTFRJTUUpLCBhdHRzLmdldFZhbHVlKE9XTkVSKSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cy5nZXRWYWx1ZShMQVRMT05HKSwgYXR0cy5nZXRWYWx1ZShVUkwpKTsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudENsdXN0ZXJIb3N0cyA9IG5ldyBBcnJheUxpc3Q8SG9zdD4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29uZmlndXJhdGlvbiBhZnRlciBwYXJzaW5nIHRoZSBYTUwgU3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiBhIGdyaWQgY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENsdXN0ZXI+IGdldEdyaWRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ncmlkOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9jb25maWd1cmF0aW9uL0NsdXN0ZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9jb25maWd1cmF0aW9uL0NsdXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUwMzkyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2NvbmZpZ3VyYXRpb24vQ2x1c3Rlci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIENvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgdGhlIEdhbmdsaWEgY2x1c3RlciBtYXBwaW5nLiBDb250YWlucyBob3N0cycgc3RhdHVzIGluZm9ybWF0aW9uCisgKiBvZiBhIHBhcnRpY3VsYXIgY2x1c3Rlci4KKyAqCisgKiAgPENMVVNURVIgTkFNRT0iIiBMT0NBTFRJTUU9IiIgT1dORVI9IiIgTEFUTE9ORz0iIiBVUkw9IiI+CisgKiAgICAgIDxIT1NUIE5BTUU9Li4uLgorICogICAgICAuLi4KKyAqICAgICAgPEhPU1QgTkFNRT0uLgorICogIDwvQ0xVU1RFUj4KKyAqLworcHVibGljIGNsYXNzIENsdXN0ZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbHRpbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgb3duZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGF0TG9uZzsKKyAgICBwcml2YXRlIFN0cmluZyB1cmw7CisgICAgcHJpdmF0ZSBMaXN0PEhvc3Q+IGhvc3RzOworCisgICAgcHVibGljIENsdXN0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhbHRpbWUsIFN0cmluZyBvd25lciwgU3RyaW5nIGxhdExvbmcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5sb2NhbHRpbWUgPSBsb2NhbHRpbWU7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy5sYXRMb25nID0gbGF0TG9uZzsKKyAgICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gb3duZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbHRpbWUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbHRpbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYXRMb25nKCkgeworICAgICAgICByZXR1cm4gbGF0TG9uZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxIb3N0PiBnZXRIb3N0cygpIHsKKyAgICAgICAgcmV0dXJuIGhvc3RzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvc3RzKExpc3Q8SG9zdD4gaG9zdHMpIHsKKyAgICAgICAgdGhpcy5ob3N0cyA9IGhvc3RzOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9jb25maWd1cmF0aW9uL0hvc3QuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9jb25maWd1cmF0aW9uL0hvc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlmMjAyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2NvbmZpZ3VyYXRpb24vSG9zdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIENvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgdGhlIEdhbmdsaWEgaG9zdCBtYXBwaW5nLiBDb25zaXN0cyB3aXRoIE1ldHJpY3MgaW5mb3JtYXRpb24KKyAqIG9mIGEgcGFydGljdWxhciBob3N0CisgKgorICogIDxIT1NUIE5BTUU9IiIgSVA9IiIgUkVQT1JURUQ9IiIgVE49IiIgVE1BWD0iIiBETUFYPSIiIExPQ0FUSU9OPSIiIEdNT05EX1NUQVJURUQ9IiI+CisgKiAgICAgIDxNRVRSSUMgTkFNRT0iIiBWQUw9IiIgVFlQRT0iIiBVTklUUz0iIiBUTj0iIiBUTUFYPSIiIERNQVg9IiIgU0xPUEU9IiIgU09VUkNFPSIiPgorICogICAgICAuLi4uLi4uLi4uLi4KKyAqICAgICAgPE1FVFJJQyBOQU1FPS4uLi4KKyAqICA8L0hPU1Q+CisgKi8KK3B1YmxpYyBjbGFzcyBIb3N0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgaXA7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwb3J0ZWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG47CisgICAgcHJpdmF0ZSBTdHJpbmcgdG1heDsKKyAgICBwcml2YXRlIFN0cmluZyBkbWF4OworICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOworICAgIHByaXZhdGUgU3RyaW5nIGdtb25kc3RhcnRlZDsKKyAgICBwcml2YXRlIExpc3Q8TWV0cmljPiBtZXRyaWNzOworCisgICAgcHVibGljIEhvc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBpcCwgU3RyaW5nIHJlcG9ydGVkLCBTdHJpbmcgdG4sIFN0cmluZyB0bWF4LAorICAgICAgICAgICAgICAgIFN0cmluZyBkbWF4LCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBnbW9uZHN0YXJ0ZWQpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5pcCA9IGlwOworICAgICAgICB0aGlzLnJlcG9ydGVkID0gcmVwb3J0ZWQ7CisgICAgICAgIHRoaXMudG4gPSB0bjsKKyAgICAgICAgdGhpcy50bWF4ID0gdG1heDsKKyAgICAgICAgdGhpcy5kbWF4ID0gZG1heDsKKyAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgICAgICB0aGlzLmdtb25kc3RhcnRlZCA9IGdtb25kc3RhcnRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXAoKSB7CisgICAgICAgIHJldHVybiBpcDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gcmVwb3J0ZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUbigpIHsKKyAgICAgICAgcmV0dXJuIHRuOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG1heCgpIHsKKyAgICAgICAgcmV0dXJuIHRtYXg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREbWF4KCkgeworICAgICAgICByZXR1cm4gZG1heDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHbW9uZHN0YXJ0ZWQoKSB7CisgICAgICAgIHJldHVybiBnbW9uZHN0YXJ0ZWQ7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8TWV0cmljPiBnZXRNZXRyaWNzKCkgeworICAgICAgICByZXR1cm4gbWV0cmljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRyaWNzKExpc3Q8TWV0cmljPiBtZXRyaWNzKSB7CisgICAgICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2NvbmZpZ3VyYXRpb24vTWV0cmljLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvY29uZmlndXJhdGlvbi9NZXRyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmNiY2VlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2NvbmZpZ3VyYXRpb24vTWV0cmljLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIENvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgdGhlIEdhbmdsaWEgTWV0cmljIG1hcHBpbmcuCisgKgorICogIDxNRVRSSUMgTkFNRT0iIiBWQUw9IiIgVFlQRT0iIiBVTklUUz0iIiBUTj0iIiBUTUFYPSIiIERNQVg9IiIgU0xPUEU9IiIgU09VUkNFPSIiPgorICogICAgICA8RVhUUkFfREFUQT4KKyAqICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IiIgVkFMPSIiLz4KKyAqICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IiIgVkFMPSIiLz4KKyAqICAgICAgICAgIC4uLi4uLi4uCisgKiAgICAgIDwvRVhUUkFfREFUQT4KKyAqICA8L01FVFJJQz4KKyAqLworcHVibGljIGNsYXNzIE1ldHJpYyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdW5pdHM7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG47CisgICAgcHJpdmF0ZSBTdHJpbmcgdG1heDsKKyAgICBwcml2YXRlIFN0cmluZyBkbWF4OworICAgIHByaXZhdGUgU3RyaW5nIHNsb3BlOworICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZTsKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGV4dHJhRGF0YTsKKworICAgIHB1YmxpYyBNZXRyaWMoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHZhbHVlVHlwZSwgU3RyaW5nIHVuaXRzLAorICAgICAgICAgICAgICAgICAgU3RyaW5nIHRuLCBTdHJpbmcgdG1heCwgU3RyaW5nIGRtYXgsIFN0cmluZyBzbG9wZSwgU3RyaW5nIHNvdXJjZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHRoaXMudHlwZSA9IHZhbHVlVHlwZTsKKyAgICAgICAgdGhpcy51bml0cyA9IHVuaXRzOworICAgICAgICB0aGlzLnRuID0gdG47CisgICAgICAgIHRoaXMudG1heCA9IHRtYXg7CisgICAgICAgIHRoaXMuZG1heCA9IGRtYXg7CisgICAgICAgIHRoaXMuc2xvcGUgPSBzbG9wZTsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pdHMoKSB7CisgICAgICAgIHJldHVybiB1bml0czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRuKCkgeworICAgICAgICByZXR1cm4gdG47CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUbWF4KCkgeworICAgICAgICByZXR1cm4gdG1heDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERtYXgoKSB7CisgICAgICAgIHJldHVybiBkbWF4OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2xvcGUoKSB7CisgICAgICAgIHJldHVybiBzbG9wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RXh0cmFEYXRhKCkgeworICAgICAgICByZXR1cm4gZXh0cmFEYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhRGF0YShIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBleHRyYURhdGEpIHsKKyAgICAgICAgdGhpcy5leHRyYURhdGEgPSBleHRyYURhdGE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2xvYWRjYWxjL0xvYWRDYWxjdWxhdG9yLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvbG9hZGNhbGMvTG9hZENhbGN1bGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA3NTdhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2xvYWRjYWxjL0xvYWRDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEubG9hZGNhbGM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEBhdXRob3IgcmFqaXRoCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZENhbGN1bGF0b3IgeworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBsb2FkIGFuZCBub3JtYWxpemUgaXQgd2l0aGluIHRoZSBnaXZlbiBub2RlJ3MgY2FwYWNpdHkKKyAgICAgKiBAcGFyYW0gbWV0cmljcyBzdGF0dXMgbWV0cmljcyBvZiB0aGUgcmVzb3VyY2Ugbm9kZQorICAgICAqIEByZXR1cm4gQW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgbG9hZCB3aXRoaW4gMCBhbmQgbm9kZSdzIGNhcGFjaXR5CisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBjYWxjdWxhdGVMb2FkKE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0cmljcyk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9sb2FkY2FsYy9Mb2FkQ2FsY3VsYXRvckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9sb2FkY2FsYy9Mb2FkQ2FsY3VsYXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmU4MTZhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2xvYWRjYWxjL0xvYWRDYWxjdWxhdG9yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmxvYWRjYWxjOworCisvKioKKyAqIEBhdXRob3IgcmFqaXRoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZENhbGN1bGF0b3JGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSBuZXcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBMb2FkQ2FsY3VsYXRvcn0gaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkQ2FsY3VsYXRvciBjcmVhdGVMb2FkQ2FsY3VsYXRvcigpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2xvYWRjYWxjL1dlaWdodGVkQXZlcmFnZUxvYWRDYWxjLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvbG9hZGNhbGMvV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWUyNjRmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9nYW5nbGlhL2xvYWRjYWxjL1dlaWdodGVkQXZlcmFnZUxvYWRDYWxjLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEubG9hZGNhbGM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLkdhbmdsaWFNZXRLZXlzLk1BWElNVU1fRlJBQ1RJT05fRElHSVRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5HYW5nbGlhTWV0S2V5cy5UTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuR2FuZ2xpYU1ldEtleXMuVE1BWDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuR2FuZ2xpYU1ldEtleXMuQ1BVX05VTTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuR2FuZ2xpYU1ldEtleXMuTE9BRF9PTkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLkdhbmdsaWFNZXRLZXlzLkxPQURfRklWRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuR2FuZ2xpYU1ldEtleXMuTE9BRF9GSUZURUVOOworCisvKioKKyAqIEBhdXRob3IgcmFqaXRoCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBXZWlnaHRlZEF2ZXJhZ2VMb2FkQ2FsYyBpbXBsZW1lbnRzIExvYWRDYWxjdWxhdG9yIHsKKworICAgIHByaXZhdGUgZG91YmxlIGxvYWRPbmVXZWlnaHQ7CisgICAgcHJpdmF0ZSBkb3VibGUgbG9hZEZpdmVXZWlnaHQ7CisgICAgcHJpdmF0ZSBkb3VibGUgbG9hZEZpZnRlZW5XZWlnaHQ7CisKKyAgICAvKiB0byBmb3JtYXQgdGhlIGxvYWQgdmFsdWUqLworICAgIHByaXZhdGUgTnVtYmVyRm9ybWF0IG51bWJlckZvcm1hdDsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGMge0BsaW5rIExvYWRDYWxjdWxhdG9yfQorICAgICAqIEBwYXJhbSBsb2FkT25lV2VpZ2h0IHdlaWdodCBmb3IgdGhlIGxvYWRfb25lCisgICAgICogQHBhcmFtIGxvYWRGaXZlV2VpZ2h0IHdlaWdodCBmb3IgdGhlIGxvYWRfZml2ZQorICAgICAqIEBwYXJhbSBsb2FkRmlmdGVlbldlaWdodCB3ZWlnaHQgZm9yIHRoZSBsb2FkX2ZpZnRlZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGMgKGRvdWJsZSBsb2FkT25lV2VpZ2h0LCBkb3VibGUgbG9hZEZpdmVXZWlnaHQsIGRvdWJsZSBsb2FkRmlmdGVlbldlaWdodCl7CisgICAgICAgIHRoaXMubG9hZE9uZVdlaWdodCA9IGxvYWRPbmVXZWlnaHQ7CisgICAgICAgIHRoaXMubG9hZEZpdmVXZWlnaHQgPSBsb2FkRml2ZVdlaWdodDsKKyAgICAgICAgdGhpcy5sb2FkRmlmdGVlbldlaWdodCA9IGxvYWRGaWZ0ZWVuV2VpZ2h0OworCisgICAgICAgIG51bWJlckZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOworICAgICAgICBudW1iZXJGb3JtYXQuc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKE1BWElNVU1fRlJBQ1RJT05fRElHSVRTKTsKKyAgICB9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogbG9hZCBpcyBjYWxjdWxhdGVkIGFzIGZvbGxvd3MKKyAgICAgKiB3ZWlnaHRlZExvYWRPbmUgPSBsb2FkT25lV2VpZ2h0ICogbWluaW11bSBvZiAobnVtT2ZDUFVzLCAoKGxvYWRPbmUvbnVtT2ZDUFVzKSAqIG51bU9mQ1BVcykpCisgICAgICoKKyAgICAgKiBsb2FkID0gKHdlaWdodGVkTG9hZE9uZSArIHdlaWdodGVkTG9hZEZpdmUgKyB3ZWlnaHRlZExvYWRGaWZ0ZWVuKSAvCisgICAgICogICAgICAgICAgIChsb2FkT25lV2VpZ2h0ICsgbG9hZEZpdmVXZWlnaHQgKyBsb2FkRmlmdGVlbldlaWdodCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZG91YmxlIGNhbGN1bGF0ZUxvYWQoTWFwPFN0cmluZywgU3RyaW5nPiBub2RlTWV0cmljcykgeworICAgICAgICBkb3VibGUgdG4gPSBEb3VibGUudmFsdWVPZihub2RlTWV0cmljcy5nZXQoVE4pKTsKKyAgICAgICAgZG91YmxlIHRtYXggPSBEb3VibGUudmFsdWVPZihub2RlTWV0cmljcy5nZXQoVE1BWCkpOworICAgICAgICBkb3VibGUgbnVtQ3B1cyA9IERvdWJsZS52YWx1ZU9mKG5vZGVNZXRyaWNzLmdldChDUFVfTlVNKSk7CisKKyAgICAgICAgaWYodG4gPiAoNCAqIHRtYXgpKXsKKyAgICAgICAgICAgcmV0dXJuIG51bUNwdXM7IC8vaWYgdGhlIG5vZGUgaXMgb2ZmbGluZSBhc3NpZ24gdGhlIG5vZGUncyBjYXBhY2l0eSBhcyB0aGUgbG9hZAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG91YmxlIHdlaWdodGVkTG9hZE9uZSA9IGxvYWRPbmVXZWlnaHQgKiBNYXRoLm1pbihudW1DcHVzLAorICAgICAgICAgICAgICAgICAgICAoKERvdWJsZS52YWx1ZU9mKG5vZGVNZXRyaWNzLmdldChMT0FEX09ORSkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUudmFsdWVPZihub2RlTWV0cmljcy5nZXQoQ1BVX05VTSkpKSAqIG51bUNwdXMpKTsKKyAgICAgICAgICAgIGRvdWJsZSB3ZWlnaHRlZExvYWRGaXZlID0gbG9hZEZpdmVXZWlnaHQgKiBNYXRoLm1pbihudW1DcHVzLAorICAgICAgICAgICAgICAgICAgICAoKERvdWJsZS52YWx1ZU9mKG5vZGVNZXRyaWNzLmdldChMT0FEX0ZJVkUpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnZhbHVlT2Yobm9kZU1ldHJpY3MuZ2V0KENQVV9OVU0pKSkqIG51bUNwdXMpKTsKKyAgICAgICAgICAgIGRvdWJsZSB3ZWlnaHRlZExvYWRGaWZ0ZWVuID0gbG9hZEZpZnRlZW5XZWlnaHQgKiBNYXRoLm1pbihudW1DcHVzLAorICAgICAgICAgICAgICAgICAgICAoKERvdWJsZS52YWx1ZU9mKG5vZGVNZXRyaWNzLmdldChMT0FEX0ZJRlRFRU4pKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnZhbHVlT2Yobm9kZU1ldHJpY3MuZ2V0KENQVV9OVU0pKSkqIG51bUNwdXMpKTsKKworICAgICAgICAgICAgZG91YmxlIHdlaWdodGVkTG9hZEF2ZXJhZ2UgPSAod2VpZ2h0ZWRMb2FkT25lICsgd2VpZ2h0ZWRMb2FkRml2ZSArIHdlaWdodGVkTG9hZEZpZnRlZW4pIC8KKyAgICAgICAgICAgICAgICAgICAgKGxvYWRPbmVXZWlnaHQgKyBsb2FkRml2ZVdlaWdodCArIGxvYWRGaWZ0ZWVuV2VpZ2h0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXZWlnaHRlZCBsb2FkIG9uZTogWyIrd2VpZ2h0ZWRMb2FkT25lKyJdOiB3ZWlnaHRlZCBsb2FkIGZpdmU6IFsiK3dlaWdodGVkTG9hZEZpdmUrIl0gd2VpZ2h0ZWQgbG9hZCBmaWZ0ZWVuOiBbIit3ZWlnaHRlZExvYWRGaWZ0ZWVuKyJdIik7CisgICAgICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2YobnVtYmVyRm9ybWF0LmZvcm1hdCh3ZWlnaHRlZExvYWRBdmVyYWdlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvbG9hZGNhbGMvV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGNGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL2dhbmdsaWEvbG9hZGNhbGMvV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxMzgyYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvZ2FuZ2xpYS9sb2FkY2FsYy9XZWlnaHRlZEF2ZXJhZ2VMb2FkQ2FsY0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5sb2FkY2FsYzsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGNGYWN0b3J5IGltcGxlbWVudHMgTG9hZENhbGN1bGF0b3JGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdlaWdodGVkQXZlcmFnZUxvYWRDYWxjRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExvYWRDYWxjdWxhdG9yIGNyZWF0ZUxvYWRDYWxjdWxhdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGxvYWRPbmVXZWlnaHQgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQubG9hZG9uZSIpKTsKKyAgICAgICAgICAgIGludCBsb2FkRml2ZVdlaWdodCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmxvYWRjYWxjLndlaWdodC5sb2FkZml2ZSIpKTsKKyAgICAgICAgICAgIGludCBsb2FkRmlmdGVlbldlaWdodCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmxvYWRjYWxjLndlaWdodC5sb2FkZmlmdGVlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGMobG9hZE9uZVdlaWdodCwgbG9hZEZpdmVXZWlnaHQsIGxvYWRGaWZ0ZWVuV2VpZ2h0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGNyZWF0ZSBMb2FkIENhbGN1bGF0b3IgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL3V0aWxzL01vY2tHbWV0YWQuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvdXRpbHMvTW9ja0dtZXRhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjU1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL3V0aWxzL01vY2tHbWV0YWQuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLnV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIEdhbmdsaWEgbWV0YSBkYWVtb24gbW9jayBzZXJ2ZXIKKyAqLworcHVibGljIGNsYXNzIE1vY2tHbWV0YWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICBwcml2YXRlIGludCBzb2NrZXQ7CisgICAgcHJpdmF0ZSBGaWxlIGZha2VYTUxEdW1wOworICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0RmluaXNoZWQ7CisKKyAgICBwdWJsaWMgTW9ja0dtZXRhZChpbnQgc29ja2V0LCBTdHJpbmcgZmlsZVBhdGgpeworICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDsKKyAgICAgICAgdGhpcy5mYWtlWE1MRHVtcCA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKyAgICAgICAgdGhpcy50ZXN0RmluaXNoZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCl7CisgICAgICAgIHRlc3RGaW5pc2hlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoc29ja2V0KTsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKworCisgICAgICAgICAgICB3aGlsZSAoIXRlc3RGaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB4bWxCeXRlQXJyYXkgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmYWtlWE1MRHVtcCk7CisgICAgICAgICAgICAgICAgICAgIG9zID0gc29jay5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBmaXMucmVhZCh4bWxCeXRlQXJyYXkpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZSh4bWxCeXRlQXJyYXksIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmaXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBvcyAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgLy9FeGNlcHRpb24gaWdub3JlZAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAvL0V4Y2VwdGlvbiBpZ25vcmVkCisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAJU3RyaW5nIHhtbFBhdGggPSBudWxsOworICAgIAlpbnQgc2VydmVyUG9ydCA9IC0xOworICAgIAlmaW5hbCBTdHJpbmcgdXNhZ2UgPSAiamF2YSBNb2NrR21ldGFkIDx4bWwgcGF0aD4gPHBvcnQ+XG4iOworICAgIAkKKyAgICAJaWYgKGFyZ3MubGVuZ3RoICE9IDIpeworICAgIAkJU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAJCVN5c3RlbS5leGl0KDEpOworICAgIAl9CisgICAgCQorICAgIAl4bWxQYXRoID0gYXJnc1swXTsKKyAgICAJc2VydmVyUG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzWzFdKTsKKyAgICAJCisgICAgCU1vY2tHbWV0YWQgZ21ldGFkID0gbmV3IE1vY2tHbWV0YWQoc2VydmVyUG9ydCwgeG1sUGF0aCk7CisgICAgCVRocmVhZExvY2FsPE1vY2tHbWV0YWQ+IG1vY2tHbWV0YWQgPSBuZXcgVGhyZWFkTG9jYWw8TW9ja0dtZXRhZD4oKTsKKyAgICAJbW9ja0dtZXRhZC5zZXQoZ21ldGFkKTsKKyAgICAJVGhyZWFkIG1vY2tHbWV0YWRTZXJ2ZXIgPSBuZXcgVGhyZWFkKG1vY2tHbWV0YWQuZ2V0KCkpOworICAgICAgICBtb2NrR21ldGFkU2VydmVyLnN0YXJ0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L0JhY2tlbmRNYW5hZ2VyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvQmFja2VuZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdkMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L0JhY2tlbmRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5RdWV1ZU1hbmFnZXJFeGNlcHRpb247CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB0aGUgYmFja2VuZCBtYW5hZ2VyCisgKgorICogQGF1dGhvciBzdGFyY2htZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhY2tlbmRNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIEFkZCBpbiBhIGJhY2tlbmQgc2V0IHRvIHRoaXMgbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSB0aGF0IG1hcHMgdG8gdGhlIGdpdmVuIG1vbml0b3IsIGJhdGNobWdyLCBhbmQgc2NoZWR1bGVyCisgICAgICogQHBhcmFtIG1vbml0b3IgLSBtb25pdG9yIHVzZWQgZm9yIHRoaXMgc2V0CisgICAgICogQHBhcmFtIGJhdGNobWdyIC0gYmF0Y2ggbWFuYWdlciBmb3IgdGhpcyBzZXQKKyAgICAgKiBAcGFyYW0gc2NoZWR1bGVyIC0gc2NoZWR1bGVyIGZvciB0aGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNldChTdHJpbmcgcXVldWUsTW9uaXRvciBtb25pdG9yLCBCYXRjaG1nciBiYXRjaG1nciwgU2NoZWR1bGVyIHNjaGVkdWxlcik7CisgICAgLyoqCisgICAgICogUmV0dXJuIG1vbml0b3IgZm9yIHRoZSBnaXZlbiBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gbW9udGlvcgorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHdoZW4gcXVldWUgZG9lcyBub3QgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgTW9uaXRvciBnZXRNb25pdG9yKFN0cmluZyBxdWV1ZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYmF0Y2ggbWFuYWdlciBmb3IgdGhlIGdpdmVuIHF1ZXVlLgorICAgICAqIEBwYXJhbSBxdWV1ZSAtIHF1ZXVlIHRvIGNoZWNrCisgICAgICogQHJldHVybiBiYXRjaG1ncgorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHdoZW4gcXVldWUgZG9lcyBub3QgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgQmF0Y2htZ3IgZ2V0QmF0Y2htZ3IoU3RyaW5nIHF1ZXVlKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uOworICAgIC8qKgorICAgICAqIFJldHVybiBzY2hlZHVsZXIgZm9yIHRoZSBnaXZlbiBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gc2NoZWR1bGVyCisgICAgICogQHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24gd2hlbiBxdWV1ZSBkb2VzIG5vdCBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBTY2hlZHVsZXIgZ2V0U2NoZWR1bGVyKFN0cmluZyBxdWV1ZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBtb25pdG9ycy4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgYWxsIG1vbml0b3JzCisgICAgICovCisgICAgcHVibGljIExpc3Q8TW9uaXRvcj4gZ2V0TW9uaXRvcnMoKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9CYWNrZW5kUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L0JhY2tlbmRSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1OTcxMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9CYWNrZW5kUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGhhbmRsZSBsb2FkaW5nIG9mIHRoZSBjb25maWd1cmF0aW9uIGZvciB3aGljaCBxdWV1ZXMgYXJlIGFzc29jaWF0ZWQgCisgKiB3aXRoIHdoaWNoIGJhY2tlbmQuIGkuZS4gcmVhZCBCYWNrZW5kTWFuYWdlciBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqLworcHVibGljIGludGVyZmFjZSBCYWNrZW5kUmVwb3NpdG9yeSB7CisgICAgLyoqCisgICAgICogTG9hZCB0aGUgYmFja2VuZC4KKyAgICAgKiBAcmV0dXJuIEJhY2tlbmRNYW5hZ2VyIGFsbCBzZXQgdXAgYW5kIHJlYWR5IHRvIGdvLgorICAgICAqLworICAgIHB1YmxpYyBCYWNrZW5kTWFuYWdlciBsb2FkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvQmFja2VuZFJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvQmFja2VuZFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MDY4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9CYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworLyoqCisgKgorICogQGF1dGhvciBzdGFyY2htZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogVGhlIEJhY2tlbmQgTWFuYWdlciBSZXBvc2l0b3J5IEZhY3RvcnkgaW50ZXJmYWNlLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBiYWNrZW5kIHJlcG9zaXRvcnkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBtaW50ZWQgYmFja2VuZCByZXBvc2l0b3J5CisgICAgICovCisJcHVibGljIEJhY2tlbmRSZXBvc2l0b3J5IGNyZWF0ZUJhY2tlbmRSZXBvc2l0b3J5KCk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvUXVldWVNdXhCYXRjaE1hbmFnZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9RdWV1ZU11eEJhdGNoTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTdhOTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvUXVldWVNdXhCYXRjaE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tdXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLkpvYlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5RdWV1ZU1hbmFnZXJFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBzdGFyY2htZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIEEgYmF0Y2gtbWFuYWdlciB1c2VkIHRvIGV4ZWN1dGUgYW5kIGNvbnRyb2wgam9icyBpbiBhIG1lc29zLWNsdXN0ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBRdWV1ZU11eEJhdGNoTWFuYWdlciBpbXBsZW1lbnRzIEJhdGNobWdyIHsKKworICAgIHByaXZhdGUgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUXVldWVNdXhCYXRjaE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEJhY2tlbmRNYW5hZ2VyIGJhY2tlbmQ7CisgICAgTWFwPFN0cmluZyxTdHJpbmc+IGpvYklkVG9RdWV1ZSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgSm9iUmVwb3NpdG9yeSByZXBvOworCisgICAgLyoqCisgICAgICogY3RvcgorICAgICAqIEBwYXJhbSBibSAtIGJhY2tlbmQgbWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyBRdWV1ZU11eEJhdGNoTWFuYWdlcihCYWNrZW5kTWFuYWdlciBibSkgeworICAgICAgICBzZXRCYWNrZW5kTWFuYWdlcihibSk7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFja2VuZCBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBiYWNrZW5kIC0gYmFja2VuZCBtYW5hZ2VyIGVmZmVjdGl2ZWx5IG1hcHBpbmcgcXVldWUncyB0byBzZXRzIG9mIGJhY2tlbmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tlbmRNYW5hZ2VyKEJhY2tlbmRNYW5hZ2VyIGJhY2tlbmQpIHsKKyAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyI2V4ZWN1dGVSZW1vdGVseShvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYywgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlUmVtb3RlbHkoSm9iU3BlYyBqb2IsIFJlc291cmNlTm9kZSByZXNOb2RlKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqb2JJZFRvUXVldWUucHV0KGpvYi5nZXRKb2IoKS5nZXRJZCgpLGpvYi5nZXRKb2IoKS5nZXRRdWV1ZU5hbWUoKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0TWFuYWdlckJ5UXVldWUoam9iLmdldEpvYigpLmdldFF1ZXVlTmFtZSgpKS5leGVjdXRlUmVtb3RlbHkoam9iLCByZXNOb2RlKTsKKyAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGpvYklkVG9RdWV1ZS5yZW1vdmUoam9iLmdldEpvYigpLmdldFF1ZXVlTmFtZSgpKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiByZWNpZXZlZCB3aGlsZSBleGVjdXRpbmcgam9iOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKyIuIEpvYiB3aWxsIG5vdCBleGVjdXRlLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1nciNzZXRNb25pdG9yKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1vbml0b3IoTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHNldCB0aGUgbW9uaXRvciB3aGVuIHVzaW5nIHRoZSBxdWV1ZS1tdXggYmF0Y2ggbWFuYWdlci4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxKb2I+IGdldEpvYnNPbk5vZGUoU3RyaW5nIG5vZGVJZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkOiBnZXQgSm9icyBvbiBOb2RlLiIpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3Ijc2V0Sm9iUmVwb3NpdG9yeShvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JSZXBvc2l0b3J5KEpvYlJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgeworICAgICAgICB0aGlzLnJlcG8gPSByZXBvc2l0b3J5OworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3Ija2lsbEpvYihqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGtpbGxKb2IoU3RyaW5nIGpvYklkLCBSZXNvdXJjZU5vZGUgbm9kZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldE1hbmFnZXJCeUpvYihqb2JJZCkua2lsbEpvYihqb2JJZCxub2RlKTsKKyAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiQ2Fubm90IGtpbGwgam9iOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1nciNnZXRFeGVjdXRpb25Ob2RlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRpb25Ob2RlKFN0cmluZyBqb2JJZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldE1hbmFnZXJCeUpvYihqb2JJZCkuZ2V0RXhlY3V0aW9uTm9kZShqb2JJZCk7CisgICAgICAgIH0gY2F0Y2ggKFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkNhbm5vdCBnZXQgZXhlY3R1aW9uIG5vZGUgZm9yIGpvYjogIitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBCYXRjaG1nciBnZXRNYW5hZ2VyQnlKb2IoU3RyaW5nIGpvYklkKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldE1hbmFnZXJCeVF1ZXVlKGpvYklkVG9RdWV1ZS5nZXQoam9iSWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJhdGNobWdyIGdldE1hbmFnZXJCeVF1ZXVlKFN0cmluZyBxdWV1ZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmQuZ2V0QmF0Y2htZ3IocXVldWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L1F1ZXVlTXV4TW9uaXRvci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L1F1ZXVlTXV4TW9uaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjNiMjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvUXVldWVNdXhNb25pdG9yLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5RdWV1ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogQSBtb25pdG9yIHRvIG1vbml0b3IgdGhlIG11bHRpcGxlIG1vbml0b3JzLgorICovCitwdWJsaWMgY2xhc3MgUXVldWVNdXhNb25pdG9yIGltcGxlbWVudHMgTW9uaXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUXVldWVNdXhNb25pdG9yLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBCYWNrZW5kTWFuYWdlciBiYWNrZW5kOworICAgIHByaXZhdGUgUXVldWVNYW5hZ2VyIHFNYW5hZ2VyOworICAgIC8qKgorICAgICAqIGN0b3IKKyAgICAgKiBAcGFyYW0gYmFja2VuZCAtIGJhY2tlbmQgbWFuYWdlcgorICAgICAqIEBwYXJhbSBxTWFuYWdlciAtIHF1ZXVlIG1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUXVldWVNdXhNb25pdG9yKEJhY2tlbmRNYW5hZ2VyIGJhY2tlbmQsIFF1ZXVlTWFuYWdlciBxTWFuYWdlcikgeworICAgICAgICBzZXRCYWNrZW5kTWFuYWdlcihiYWNrZW5kLHFNYW5hZ2VyKTsKKyAgICB9CisgICAgLyoqCisgICAgICogU2V0IHRoZSBiYWNrZW5kIG1hbmFnZXIuCisgICAgICogQHBhcmFtIGJhY2tlbmQgLSBiYWNrZW5kIG1hbmFnZXIgZWZmZWN0aXZlbHkgbWFwcGluZyBxdWV1ZSdzIHRvIHNldHMgb2YgYmFja2VuZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFja2VuZE1hbmFnZXIoQmFja2VuZE1hbmFnZXIgYmFja2VuZCwgUXVldWVNYW5hZ2VyIHFNYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7CisgICAgICAgIHRoaXMucU1hbmFnZXIgPSBxTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNnZXRMb2FkKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRMb2FkKFJlc291cmNlTm9kZSBub2RlKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIC8vVW5jbGVhciB3aGF0IHRvIGRvIGhlcmUuCisgICAgICAgIC8vQXNzdW1pbmcgd2Ugc2hvdWxkIG5ldmVyIGJlIG1vcmUgdGhhbiAiTWF4IgorICAgICAgICBMaXN0PFN0cmluZz4gcXVldWVzID0gcXVldWVzRm9yTm9kZShub2RlKTsKKyAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXVlIDogcXVldWVzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCxiYWNrZW5kLmdldE1vbml0b3IocXVldWUpLmdldExvYWQobm9kZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsIlF1ZXVlICciK3F1ZXVlKyInIGhhcyBkaXNzYXBwZWFyZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1heDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNnZXROb2RlcygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2VOb2RlPiBnZXROb2RlcygpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFJlc291cmNlTm9kZT4gc2V0ID0gbmV3IExpbmtlZEhhc2hTZXQ8UmVzb3VyY2VOb2RlPigpOworICAgICAgICBmb3IgKE1vbml0b3IgbW9uOnRoaXMuYmFja2VuZC5nZXRNb25pdG9ycygpKSB7CisgICAgICAgICAgICBmb3IgKE9iamVjdCByZXM6bW9uLmdldE5vZGVzKCkpIHsKKyAgICAgICAgICAgICAgICBzZXQuYWRkKChSZXNvdXJjZU5vZGUpcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExpbmtlZExpc3Q8UmVzb3VyY2VOb2RlPihzZXQpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI2dldE5vZGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIFJlc291cmNlTm9kZSBub2RlID0gbnVsbDsKKyAgICAgICAgSXRlcmF0b3I8TW9uaXRvcj4gaW1vbiA9IHRoaXMuYmFja2VuZC5nZXRNb25pdG9ycygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKGltb24uaGFzTmV4dCgpICYmIChub2RlID0gaW1vbi5uZXh0KCkuZ2V0Tm9kZUJ5SWQobm9kZUlkKSkgPT0gbnVsbCkge30gCisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI2dldE5vZGVCeVVSTChqYXZhLm5ldC5VUkwpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlVUkwoVVJMIGlwQWRkcikgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZSA9IG51bGw7CisgICAgICAgIEl0ZXJhdG9yPE1vbml0b3I+IGltb24gPSB0aGlzLmJhY2tlbmQuZ2V0TW9uaXRvcnMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZShpbW9uLmhhc05leHQoKSAmJiAobm9kZSA9IGltb24ubmV4dCgpLmdldE5vZGVCeVVSTChpcEFkZHIpKSA9PSBudWxsKSB7fSAKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3IjcmVkdWNlTG9hZChvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlLCBpbnQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVkdWNlTG9hZChSZXNvdXJjZU5vZGUgbm9kZSwgaW50IGxvYWRWYWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHF1ZXVlcyA9IHF1ZXVlc0Zvck5vZGUobm9kZSk7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChTdHJpbmcgcXVldWU6cXVldWVzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldCAmPSBiYWNrZW5kLmdldE1vbml0b3IocXVldWUpLnJlZHVjZUxvYWQobm9kZSwgbG9hZFZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsIlF1ZXVlICciK3F1ZXVlKyInIGhhcyBkaXNzYXBwZWFyZWQuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNhc3NpZ25Mb2FkKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGUsIGludCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25Mb2FkKFJlc291cmNlTm9kZSBub2RlLCBpbnQgbG9hZFZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBMaXN0PFN0cmluZz4gcXVldWVzID0gcXVldWVzRm9yTm9kZShub2RlKTsKKyAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOworICAgICAgICBmb3IgKFN0cmluZyBxdWV1ZTpxdWV1ZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0ICY9IGJhY2tlbmQuZ2V0TW9uaXRvcihxdWV1ZSkuYXNzaWduTG9hZChub2RlLCBsb2FkVmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwiUXVldWUgJyIrcXVldWUrIicgaGFzIGRpc3NhcHBlYXJlZC4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI2FkZE5vZGUob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGROb2RlKFJlc291cmNlTm9kZSBub2RlKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBxdWV1ZXMgPSBxdWV1ZXNGb3JOb2RlKG5vZGUpOworICAgICAgICBmb3IgKFN0cmluZyBxdWV1ZTpxdWV1ZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmFja2VuZC5nZXRNb25pdG9yKHF1ZXVlKS5hZGROb2RlKG5vZGUpOworICAgICAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwiUXVldWUgJyIrcXVldWUrIicgaGFzIGRpc3NhcHBlYXJlZC4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI3JlbW92ZU5vZGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm9kZUJ5SWQoU3RyaW5nIG5vZGVJZCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBmb3IgKE1vbml0b3IgbW9uOnRoaXMuYmFja2VuZC5nZXRNb25pdG9ycygpKSB7CisgICAgICAgICAgICBtb24ucmVtb3ZlTm9kZUJ5SWQobm9kZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBxdWV1ZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBub2RlLgorICAgICAqIEBwYXJhbSBub2RlIC0gbm9kZSB3aGljaCBxdWV1ZXMgYXJlIG5lZWRlZCBmb3IKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcXVldWUgbmFtZXMgb24gdGhhdCBub2RlCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcXVldWVzRm9yTm9kZShSZXNvdXJjZU5vZGUgbm9kZSkgeworICAgICAgICBMaXN0PFN0cmluZz4gcmV0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICAvL0dldCBsaXN0IG9mIHF1ZXVlcworICAgICAgICBMaXN0PFN0cmluZz4gcXVldWVzID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHF1ZXVlcyA9IHFNYW5hZ2VyLmdldFF1ZXVlcygpOworICAgICAgICB9IGNhdGNoIChRdWV1ZU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJDYW5ub3QgbGlzdCBxdWV1ZXMuIik7CisgICAgICAgIH0KKyAgICAgICAgLy9TZWFyY2ggZWFjaCBxdWV1IHRvIHNlZSBpZiBpdCBjb250YWlucyBnaXZlbiBub2RlCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXVlIDogcXVldWVzKSB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocU1hbmFnZXIuZ2V0Tm9kZXMocXVldWUpLmNvbnRhaW5zKG5vZGUuZ2V0Tm9kZUlkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldC5hZGQocXVldWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIlF1ZXVlICciK3F1ZXVlKyInIGhhcyBkaXNzYXBwZWFyZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvUXVldWVNdXhTY2hlZHVsZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9RdWV1ZU11eFNjaGVkdWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWE3YWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvUXVldWVNdXhTY2hlZHVsZXIuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworLy9KREtpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisKKworCisKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuUXVldWVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYlF1ZXVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5TY2hlZHVsZXJFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBzY2hlZHVsZXIgbXVsdGlwbGV4ZXMgYmV0d2VlbiBtdWx0aXBsZSBzY2hlZHVsZXJzIGJhc2VkIG9uIHRoZSAicXVldWUiIC4KKyAqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBRdWV1ZU11eFNjaGVkdWxlciBpbXBsZW1lbnRzIFNjaGVkdWxlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihRdWV1ZU11eFNjaGVkdWxlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBCYWNrZW5kTWFuYWdlciBiYWNrZW5kOworICAgIHByaXZhdGUgSm9iUXVldWUgcXVldWU7CisgICAgcHJpdmF0ZSBmbG9hdCB3YWl0VGltZSA9IC0xOworCisgICAgLy9NYW5hZ2VzIG90aGVyIHF1ZXVlLW11eGluZyBjb21wb25lbnRzCisgICAgcHJpdmF0ZSBRdWV1ZU11eEJhdGNoTWFuYWdlciBiYXRjaDsKKyAgICBwcml2YXRlIFF1ZXVlTXV4TW9uaXRvciBtb247CisgICAgcHJpdmF0ZSBRdWV1ZU1hbmFnZXIgcU1hbmFnZXI7CisKKyAgICAvKioKKyAgICAgKiBjdG9yCisgICAgICogQHBhcmFtIGJhY2tlbmQgLSBCYWNrZW5kIG1hbmFnZXIgdG8gaGFuZGxlIHRoZSBtYW55IGRpZmZlcmVudCBiYWNrZW5kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVldWVNdXhTY2hlZHVsZXIoQmFja2VuZE1hbmFnZXIgYmFja2VuZCwgUXVldWVNYW5hZ2VyIHFtLCBKb2JRdWV1ZSBqcSkgeworICAgICAgICBTdHJpbmcgd2FpdFN0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIud2FpdC5zZWNvbmRzIiwgIjIwIik7CisgICAgICAgIHdhaXRUaW1lID0gRmxvYXQucGFyc2VGbG9hdCh3YWl0U3RyKTsKKyAgICAgICAgdGhpcy5xdWV1ZSA9IGpxOworICAgICAgICB0aGlzLnFNYW5hZ2VyID0gcW07CisgICAgICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7CisgICAgICAgIC8vUmVxdWlyZWQsIHNvIG1ha2UgdGhlbSBoZXJlCisgICAgICAgIGJhdGNoID0gbmV3IFF1ZXVlTXV4QmF0Y2hNYW5hZ2VyKGJhY2tlbmQpOworICAgICAgICBtb24gPSBuZXcgUXVldWVNdXhNb25pdG9yKGJhY2tlbmQscW0pOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8vTG9vcCBmb3JldmVyCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgobG9uZykgKHdhaXRUaW1lICogMTAwMC4wKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy9JZiB0aGUgdGhyZWFkIHdpbGwgY29udGludWUsIHJlaW50ZXJydXB0IHRocmVhZAorICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1lvdSBoYXZlIGpvYnMKKyAgICAgICAgICAgIGlmICghcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgSm9iU3BlYyBqb2IgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGpvYiA9IHF1ZXVlLmdldE5leHRKb2IoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiU2NoZWR1bGluZyBqb2I6IFsiKyBqb2IuZ2V0Sm9iKCkuZ2V0SWQoKSsgIl0gZm9yIGV4ZWN1dGlvbiIpOworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZShqb2IpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpvYlF1ZXVlRXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywiRXJyb3IgZ2V0dGluZyBqb2IgZnJvbSBxdWV1ZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBqZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNjaGVkdWxlckV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsIkVycm9yIG9jY3VyZWQgc2NoZWR1bGluZyBqb2I6ICIrc2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnJlcXVldWVKb2Ioam9iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSm9iUXVldWVFeGNlcHRpb24gamUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywiRXJyb3IgcmVxdWV1ZWluZyBqb2I6ICIramUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywiUHJldmlvdXMgZXJyb3IgY2F1c2VkIGJ5OiAiK3NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5TY2hlZHVsZXIjc2NoZWR1bGUoZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2NoZWR1bGUoSm9iU3BlYyBzcGVjKQorICAgICAgICAgICAgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3BlYzogIitzcGVjKyIgSm9iOiAiK3NwZWMuZ2V0Sm9iKCkrIiBCYWNrZW5kOiIrYmFja2VuZCk7CisgICAgICAgIFN0cmluZyBxdWV1ZSA9IHNwZWMuZ2V0Sm9iKCkuZ2V0UXVldWVOYW1lKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gYmFja2VuZC5nZXRTY2hlZHVsZXIocXVldWUpLnNjaGVkdWxlKHNwZWMpOworICAgICAgICB9IGNhdGNoIChRdWV1ZU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJFeGNlcHRpb24gb2NjdWVyZWQ6ICIrZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBnb3YubmFzYS5qcGwub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlciNnZXRCYXRjaG1ncigpCisgICAgICovCisgICAgcHVibGljIEJhdGNobWdyIGdldEJhdGNobWdyKCkgeworICAgICAgICByZXR1cm4gYmF0Y2g7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI2dldE1vbml0b3IoKQorICAgICAqLworICAgIHB1YmxpYyBNb25pdG9yIGdldE1vbml0b3IoKSB7CisgICAgICAgIHJldHVybiBtb247CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI2dldEpvYlF1ZXVlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSm9iUXVldWUgZ2V0Sm9iUXVldWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBnb3YubmFzYS5qcGwub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlciNnZXRRdWV1ZU1hbmFnZXIoKQorICAgICAqLworICAgIHB1YmxpYyBRdWV1ZU1hbmFnZXIgZ2V0UXVldWVNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gcU1hbmFnZXI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI25vZGVBdmFpbGFibGUoZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlTm9kZSBub2RlQXZhaWxhYmxlKEpvYlNwZWMgc3BlYykKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcXVldWUgPSBzcGVjLmdldEpvYigpLmdldFF1ZXVlTmFtZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGJhY2tlbmQuZ2V0U2NoZWR1bGVyKHF1ZXVlKS5ub2RlQXZhaWxhYmxlKHNwZWMpOworICAgICAgICB9IGNhdGNoIChRdWV1ZU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJFeGNlcHRpb24gb2NjdWVyZWQ6ICIrZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9RdWV1ZU11eFNjaGVkdWxlckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9RdWV1ZU11eFNjaGVkdWxlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThkNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L1F1ZXVlTXV4U2NoZWR1bGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4OworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JRdWV1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlN0YWNrSm9iUXVldWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UucXVldWVyZXBvLlhtbFF1ZXVlUmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuUXVldWVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5TY2hlZHVsZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLkdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgYWN0cyBhcyBhIGZhY3RvcnkgZm9yIHRoZSB3aG9sZSBxdWV1ZS1tdXgKKyAqIHNldCBvZiBjbGFzc2VzLgorICoKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqLworcHVibGljIGNsYXNzIFF1ZXVlTXV4U2NoZWR1bGVyRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVkdWxlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUXVldWVNdXhTY2hlZHVsZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBCYWNrZW5kTWFuYWdlciBiYWNrZW5kOworICAgIFF1ZXVlTWFuYWdlciBxTWFuYWdlcjsKKyAgICBKb2JRdWV1ZSBqb2JRdWV1ZTsKKyAgICAvKioKKyAgICAgKiBjdG9yCisgICAgICovCisgICAgcHVibGljIFF1ZXVlTXV4U2NoZWR1bGVyRmFjdG9yeSgpIHsKKyAgICAgICAgLy9Mb2FkIGJhY2tlbmQgbWFuYWdlcgorICAgICAgICBTdHJpbmcgIGJhY2tSZXBvID0gU3lzdGVtLmdldFByb3BlcnR5KCJyZXNvdXJjZS5iYWNrZW5kLm11eC5yZXBvc2l0b3J5IiwKKyAgICAgICAgICAgICAgICBYbWxCYWNrZW5kUmVwb3NpdG9yeS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYmFja2VuZCA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldEJhY2tlbmRSZXBvc2l0b3J5RnJvbUZhY3RvcnkoYmFja1JlcG8pLmxvYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwiRXJyb3IgbG9hZGluZyBiYWNrZW5kIHJlcG9zaXRvcnk6ICIrZS5nZXRNZXNzYWdlKCksZSk7CisgICAgICAgICAgICBiYWNrZW5kID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvL0xvYWQgdXNlci1zcGVjaWZpZWQgcXVldWUgZmFjdG9yeQorICAgICAgICBTdHJpbmcgcUZhY3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UucXVldWVzLnJlcG8uZmFjdG9yeSIsCisgICAgICAgICAgICAgICAgWG1sUXVldWVSZXBvc2l0b3J5RmFjdG9yeS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICBxTWFuYWdlciA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldFF1ZXVlUmVwb3NpdG9yeUZyb21GYWN0b3J5KAorICAgICAgICAgICAgICAgIHFGYWN0KS5sb2FkUXVldWVzKCk7CisgICAgICAgIC8vTG9hZCBqb2IgcXVldWUKKyAgICAgICAgU3RyaW5nIGpvYkZhY3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInJlc291cmNlLmpvYnF1ZXVlLmZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgSm9iU3RhY2tKb2JRdWV1ZUZhY3RvcnkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgam9iUXVldWUgPSBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRKb2JRdWV1ZVNlcnZpY2VGcm9tRmFjdG9yeShqb2JGYWN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2NoZWR1bGVyIGNyZWF0ZVNjaGVkdWxlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBRdWV1ZU11eFNjaGVkdWxlcih0aGlzLmJhY2tlbmQsIHRoaXMucU1hbmFnZXIsIHRoaXMuam9iUXVldWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9TdGFuZGFyZEJhY2tlbmRNYW5hZ2VyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvU3RhbmRhcmRCYWNrZW5kTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2RiMTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvU3RhbmRhcmRCYWNrZW5kTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tdXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1ncjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5TY2hlZHVsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUXVldWVNYW5hZ2VyRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgbWFuYWdlciBrZWVwcyB0cmFjayBvZiB0aGUgbXV4LWFibGUgYmFja2VuZHMgZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyLgorICogSXQgZWZmZWN0aXZlbHkgbWFwcyBhIHF1ZXVlIHRvIHRoZSBiYWNrZW5kIHRoYXQgdGhpcyBxdWV1ZSBmZWVkcy4KKyAqCisgKiBJdCB1c2VzIGEgcHJpdmF0ZSBCYWNrZW5kU2V0IHRvIGtlZXAgdHJhY2sgb2YgZXZlcnl0aGluZy4KKyAqCisgKiBGb3IgcmVmZXJlbmNlLCBhIGJhY2tlbmQgaXMgYSBzZXQgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgIDEuIEJhdGNoIG1hbmdlciwgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmcgam9icworICogICAgMi4gU2NoZWR1bGVyLCByZXNwb25zaWJsZSBmb3Igc2NoZWR1bGluZyBhIGpvYiB0byBydW4KKyAqICAgIDMuIE1vbml0b3IsIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBub2RlcworICoKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkQmFja2VuZE1hbmFnZXIgaW1wbGVtZW50cyBCYWNrZW5kTWFuYWdlciB7CisgICAgTWFwPFN0cmluZyxCYWNrZW5kU2V0PiBxdWV1ZVRvQmFja2VuZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxCYWNrZW5kU2V0PigpOworCisgICAgLyoqCisgICAgICogQWRkIGluIGEgYmFja2VuZCBzZXQgdG8gdGhpcyBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBxdWV1ZSAtIHF1ZXVlIHRoYXQgbWFwcyB0byB0aGUgZ2l2ZW4gbW9uaXRvciwgYmF0Y2htZ3IsIGFuZCBzY2hlZHVsZXIKKyAgICAgKiBAcGFyYW0gbW9uaXRvciAtIG1vbml0b3IgdXNlZCBmb3IgdGhpcyBzZXQKKyAgICAgKiBAcGFyYW0gYmF0Y2htZ3IgLSBiYXRjaCBtYW5hZ2VyIGZvciB0aGlzIHNldAorICAgICAqIEBwYXJhbSBzY2hlZHVsZXIgLSBzY2hlZHVsZXIgZm9yIHRoaXMgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2V0KFN0cmluZyBxdWV1ZSxNb25pdG9yIG1vbml0b3IsIEJhdGNobWdyIGJhdGNobWdyLCBTY2hlZHVsZXIgc2NoZWR1bGVyKSB7CisgICAgICAgIHF1ZXVlVG9CYWNrZW5kLnB1dChxdWV1ZSwgbmV3IEJhY2tlbmRTZXQobW9uaXRvcixiYXRjaG1ncixzY2hlZHVsZXIpKTsKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIG1vbml0b3IgZm9yIHRoZSBnaXZlbiBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gbW9udGlvcgorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHdoZW4gcXVldWUgZG9lcyBub3QgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgTW9uaXRvciBnZXRNb25pdG9yKFN0cmluZyBxdWV1ZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIEJhY2tlbmRTZXQgc2V0ID0gcXVldWVUb0JhY2tlbmQuZ2V0KHF1ZXVlKTsKKyAgICAgICAgaWYgKHNldCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXVlTWFuYWdlckV4Y2VwdGlvbigiUXVldWUgJyIgKyBxdWV1ZSArICInIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIHJldHVybiBzZXQubW9uaXRvcjsKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIGJhdGNoIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gYmF0Y2htZ3IKKyAgICAgKiBAdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB3aGVuIHF1ZXVlIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIEJhdGNobWdyIGdldEJhdGNobWdyKFN0cmluZyBxdWV1ZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIEJhY2tlbmRTZXQgc2V0ID0gcXVldWVUb0JhY2tlbmQuZ2V0KHF1ZXVlKTsKKyAgICAgICAgaWYgKHNldCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXVlTWFuYWdlckV4Y2VwdGlvbigiUXVldWUgJyIgKyBxdWV1ZSArICInIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIHJldHVybiBzZXQuYmF0Y2htZ3I7CisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybiBzY2hlZHVsZXIgZm9yIHRoZSBnaXZlbiBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gc2NoZWR1bGVyCisgICAgICogQHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24gd2hlbiBxdWV1ZSBkb2VzIG5vdCBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBTY2hlZHVsZXIgZ2V0U2NoZWR1bGVyKFN0cmluZyBxdWV1ZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIEJhY2tlbmRTZXQgc2V0ID0gcXVldWVUb0JhY2tlbmQuZ2V0KHF1ZXVlKTsKKyAgICAgICAgaWYgKHNldCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXVlTWFuYWdlckV4Y2VwdGlvbigiUXVldWUgJyIgKyBxdWV1ZSArICInIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIHJldHVybiBzZXQuc2NoZWR1bGVyOworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBtb25pdG9ycy4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgYWxsIG1vbml0b3JzCisgICAgICovCisgICAgcHVibGljIExpc3Q8TW9uaXRvcj4gZ2V0TW9uaXRvcnMoKSB7CisgICAgICAgIExpc3Q8TW9uaXRvcj4gbW9uaXRvcnMgPSBuZXcgTGlua2VkTGlzdDxNb25pdG9yPigpOworICAgICAgICBmb3IgKEJhY2tlbmRTZXQgc2V0IDogcXVldWVUb0JhY2tlbmQudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIG1vbml0b3JzLmFkZChzZXQubW9uaXRvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vbml0b3JzOworICAgIH0KKyAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IGhvbGRzIGEgc2V0IG9mIHRoZSB0aHJlZSBiYWNrZW5kIHBpZWNlcy4KKyAgICAgKiBQcml2YXRlIGNsYXNzLCBiZWNhdXNlIG5vIGFjY2Vzc29yL21vZGlmaWVycyBoYXZlIGJlZW4KKyAgICAgKiBjcmVhdGVkKHB1YmxpYyBtZW1iZXJzKS4gQWN0cyBsaWtlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQGF1dGhvciBzdGFyY2htZAorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQmFja2VuZFNldCB7CisgICAgICAgIHB1YmxpYyBNb25pdG9yIG1vbml0b3IgPSBudWxsOworICAgICAgICBwdWJsaWMgQmF0Y2htZ3IgYmF0Y2htZ3IgPSBudWxsOworICAgICAgICBwdWJsaWMgU2NoZWR1bGVyIHNjaGVkdWxlciA9IG51bGw7CisKKyAgICAgICAgcHVibGljIEJhY2tlbmRTZXQoTW9uaXRvciBtb25pdG9yLCBCYXRjaG1nciBiYXRjaG1nciwgU2NoZWR1bGVyIHNjaGVkdWxlcikgeworICAgICAgICAgICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKKyAgICAgICAgICAgIHRoaXMuYmF0Y2htZ3IgPSBiYXRjaG1ncjsKKyAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L1htbEJhY2tlbmRSZXBvc2l0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvWG1sQmFja2VuZFJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNhODAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L1htbEJhY2tlbmRSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiBDbGFzcyB0byBsb2FkIEJhY2tlbmRNYW5hZ2VyIGZyb20gWE1MIGZpbGUuCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxCYWNrZW5kUmVwb3NpdG9yeSBpbXBsZW1lbnRzIEJhY2tlbmRSZXBvc2l0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhtbEJhY2tlbmRSZXBvc2l0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOworCisgICAgLy9Db25zdGFudHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRURVTEVSID0gInNjaGVkdWxlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENITUdSID0gImJhdGNobWdyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUiA9ICJtb25pdG9yIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT05JVE9SX1BST1BFUlRZID0gInJlc291cmNlLm1vbml0b3IuZmFjdG9yeSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENITUdSX1BST1BFUlRZID0gInJlc291cmNlLmJhdGNobWdyLmZhY3RvcnkiOworCisgICAgLyoqCisgICAgICogQ3RvcgorICAgICAqIEBwYXJhbSB1cmkgLSB1cmkgb2YgWE1MIGZpbGUgY29udGFpbmluZyBtYXBwaW5nCisgICAgICovCisgICAgcHVibGljIFhtbEJhY2tlbmRSZXBvc2l0b3J5KFN0cmluZyB1cmkpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJVUkkgZm9yIHF1ZXVlLXRvLWJhY2tlbmQgeG1sIGZpbGUgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4LkJhY2tlbmRSZXBvc2l0b3J5I2xvYWQoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYWNrZW5kTWFuYWdlciBsb2FkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBMT0cubG9nKExldmVsLklORk8sIlJlYWRpbmcgYmFja2VuZCBzZXQgbWFuYWdlciBmcm9tOiAiK3RoaXMudXJpKTsKKyAgICAgICAgQmFja2VuZE1hbmFnZXIgYm0gPSBuZXcgU3RhbmRhcmRCYWNrZW5kTWFuYWdlcigpOworICAgICAgICBTdHJpbmcgb3JpZ01vbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNT05JVE9SX1BST1BFUlRZKTsKKyAgICAgICAgU3RyaW5nIG9yaWdCYXQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQkFUQ0hNR1JfUFJPUEVSVFkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUobmV3IFVSSSh0aGlzLnVyaSkpOworICAgICAgICAgICAgRG9jdW1lbnQgcm9vdCA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIE5vZGVMaXN0IGxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJxdWV1ZSIpOworICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbGlzdC5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IChFbGVtZW50KWxpc3QuaXRlbShrKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgLy9TZXQgcHJvcGVydGllcyBmb3IgYmF0Y2ggYW5kIG1vbml0b3IgZmFjdG9yaWVzCisgICAgICAgICAgICAgICAgICAgIC8vU28gc2NoZWR1bGVyIGJ1aWxkcyBhcyByZXBvc2l0b3J5IHNwZWNpZmllcworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1mYWN0ID0gZ2V0TW9uaXRvcihxdWV1ZSxub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiU2V0dGluZyBtb25pdG9yIGZhY3RvcnkgcHJvcGVydHkgdG86ICIrbWZhY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KE1PTklUT1JfUFJPUEVSVFksIG1mYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJObyBtb25pdG9yIGZhY3RvcnkgZm9yIHF1ZXVlICIrcXVldWUrIiwgdXNpbmcgc3lzdGVtIHByb3BlcnR5LiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmZhY3QgPSBnZXRCYXRjaG1ncihxdWV1ZSxub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiU2V0dGluZyBiYXRjaG1nciBmYWN0b3J5IHByb3BlcnR5IHRvOiAiK2JmYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShCQVRDSE1HUl9QUk9QRVJUWSwgYmZhY3QpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIk5vIGJhdGNobWdyIGZhY3RvcnkgZm9yIHF1ZXVlICIrcXVldWUrIiwgdXNpbmcgc3lzdGVtIHByb3BlcnR5LiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vQnVpbGQgc2NoZWR1bGVyCisgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlciBzY2ggPSBnZXRTY2hlZHVsZXIocXVldWUsbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJtLmFkZFNldChxdWV1ZSwgc2NoLmdldE1vbml0b3IoKSwgc2NoLmdldEJhdGNobWdyKCksIHNjaCk7CisgICAgICAgICAgICAgICAgICAgIC8vUmVzZXQgUHJvcGVydGllcyBmb3IgbmV4dCBpdGVtCisgICAgICAgICAgICAgICAgICAgIHJlc2V0QWx0ZXJlZFByb3BlcnR5KE1PTklUT1JfUFJPUEVSVFksb3JpZ01vbik7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0QWx0ZXJlZFByb3BlcnR5KEJBVENITUdSX1BST1BFUlRZLG9yaWdCYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCJNYWxmb3JtZWQgVVJJOiAiK3RoaXMudXJpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwiRmlsZSBub3QgZm91bmQ6ICIrdGhpcy51cmkrIiBmcm9tIHdvcmtpbmcgZGlyOiAiK25ldyBGaWxlKCIuIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwiUXVldWUgdGFnIG11c3QgcmVwcmVzZW50IFhNTCBlbGVtZW50LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXNldEFsdGVyZWRQcm9wZXJ0eShNT05JVE9SX1BST1BFUlRZLG9yaWdNb24pOworICAgICAgICAgICAgcmVzZXRBbHRlcmVkUHJvcGVydHkoQkFUQ0hNR1JfUFJPUEVSVFksb3JpZ0JhdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYm07CisgICAgfQorICAgIC8qKgorICAgICAqIFJlc2V0cyBhIHByb3BlcnR5LiBBbGxvd3MgbnVsbHMKKyAgICAgKiBAcGFyYW0gcHJvcCAtIHByb3BlcnR5IG5hbWUgdG8gcmVzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byByZXNldCB0bywgY2FuIGJlIG51bGwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlc2V0QWx0ZXJlZFByb3BlcnR5KFN0cmluZyBwcm9wLFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkocHJvcCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHByb3AsdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtb25pdG9yIGZhY3RvcnkgZnJvbSBYTUwKKyAgICAgKiBAcGFyYW0gcXVldWUgLSBjdXJyZW50IHF1ZXVlLCBmb3IgZXJyb3IgcmVwb3J0aW5nCisgICAgICogQHBhcmFtIG5vZGUgLSBub2RlIHRoYXQgaXMgYmVpbmcgcmVhZAorICAgICAqIEByZXR1cm4gbW9uaXRvciBmYWN0b3J5IHN0cmluZworICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNb25pdG9yKFN0cmluZyBxdWV1ZSxFbGVtZW50IG5vZGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEZhY3RvcnlBdHRyaWJ1dGUocXVldWUsIG5vZGUsIE1PTklUT1IpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgc2NoZWR1bGVyIGZyb20gWE1MCisgICAgICogQHBhcmFtIHF1ZXVlIC0gY3VycmVudCBxdWV1ZSwgZm9yIGVycm9yIHJlcG9ydGluZworICAgICAqIEBwYXJhbSBub2RlIC0gbm9kZSB0aGF0IGlzIGJlaW5nIHJlYWQKKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNvbnN0cnVjdGVkIFNjaGVkdWxlcgorICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNjaGVkdWxlciBnZXRTY2hlZHVsZXIoU3RyaW5nIHF1ZXVlLEVsZW1lbnQgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IGdldEZhY3RvcnlBdHRyaWJ1dGUocXVldWUsIG5vZGUsIFNDSEVEVUxFUik7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiTG9hZGluZyBtb25pdG9yIGZyb206ICIrZmFjdG9yeSk7CisgICAgICAgIFNjaGVkdWxlciBzY2ggPSBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeS5nZXRTY2hlZHVsZXJTZXJ2aWNlRnJvbUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGlmIChzY2ggIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBzY2g7CisgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJDb3VsZCBpbnN0YW50aWF0ZSBmcm9tOiAiK2ZhY3RvcnkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgYmF0Y2htZ3IgZmFjdG9yeSBmcm9tIFhNTAorICAgICAqIEBwYXJhbSBxdWV1ZSAtIGN1cnJlbnQgcXVldWUsIGZvciBlcnJvciByZXBvcnRpbmcKKyAgICAgKiBAcGFyYW0gbm9kZSAtIG5vZGUgdGhhdCBpcyBiZWluZyByZWFkCisgICAgICogQHJldHVybiBiYXRjaCBtYW5hZ2VyIGZhY3RvcnkgbmFtZQorICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCYXRjaG1ncihTdHJpbmcgcXVldWUsRWxlbWVudCBub2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRGYWN0b3J5QXR0cmlidXRlKHF1ZXVlLCBub2RlLCBCQVRDSE1HUik7CisgICAgfQorICAgIC8qKgorICAgICAqIFB1bGwgb3V0IHRoZSBmYWN0b3J5IGF0dHJpYnV0ZSBmcm9tIHRhZyB3aXRoIGdpdmVuIG5hbWUuCisgICAgICogQHBhcmFtIHF1ZXVlIC0gY3VycmVudCBxdWV1ZSwgZm9yIGVycm9yIHJlcG9ydGluZworICAgICAqIEBwYXJhbSBlbGVtIC0gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRhZ3MgYXMgY2hpbGRyZW4KKyAgICAgKiBAcGFyYW0gdGFnIC0gc3RyaW5nIG5hbWUgb2YgdGFnIGxvb2tlZCBmb3IuIGkuZS4gIm1vbml0b3IiCisgICAgICogQHJldHVybiBuYW1lIG9mIGZhY3RvcnkgY2xhc3MKKyAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gLSB0aHJvd24gaWYgbW9yZSB0aGFuIG9uZSBjaGlsZCBtYXRjaGVzLCBubyBjaGlsZHJlbiBtYXRjaCwgb3Igb3RoZXIgZXJyb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmFjdG9yeUF0dHJpYnV0ZShTdHJpbmcgcXVldWUsRWxlbWVudCBlbGVtLCBTdHJpbmcgdGFnKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAiIjsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAxIHx8IChhdHRyID0gKChFbGVtZW50KWNoaWxkcmVuLml0ZW0oMCkpLmdldEF0dHJpYnV0ZSgiZmFjdG9yeSIpKSA9PSAiIikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBleGFjdGx5IG9uZSAiK3RhZysiLCB3aXRoIGZhY3Rvcnkgc2V0LCBpbiBxdWV1ZTogIitxdWV1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYXR0cjsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJUYWcgIit0YWcrIiBkb2VzIG5vdCByZXByZXNlbnQgWE1MIGVsZW1lbnQgaW4gcXVldWU6ICIrcXVldWUsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvWG1sQmFja2VuZFJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvWG1sQmFja2VuZFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmNzg1NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9YbWxCYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBUaGUgWE1MIEJhY2tlbmQgUmVwb3NpdG9yeSBGYWN0b3J5IGludGVyZmFjZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIFhtbEJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIEJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihYbWxCYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGJhY2tlbmQgcmVwb3NpdG9yeSAoeG1sKQorCSAqIEByZXR1cm4gdGhlIG5ld2x5IG1pbnRlZCBiYWNrZW5kIHJlcG9zaXRvcnkKKwkgKi8KKwlwdWJsaWMgWG1sQmFja2VuZFJlcG9zaXRvcnkgY3JlYXRlQmFja2VuZFJlcG9zaXRvcnkoKSB7CisJCXRyeSB7CisJCQlTdHJpbmcgdXJpID0gU3lzdGVtLmdldFByb3BlcnR5KCJyZXNvdXJjZS5iYWNrZW5kLm11eC54bWxyZXBvc2l0b3J5LnF1ZXVldG9iYWNrZW5kIik7CisJCQkvKiBkbyBlbnYgdmFyIHJlcGxhY2VtZW50ICovCisJCQl1cmkgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyh1cmkpOworCQkJcmV0dXJuIG5ldyBYbWxCYWNrZW5kUmVwb3NpdG9yeSh1cmkpOworCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisJCQlMT0cubG9nKAlMZXZlbC5TRVZFUkUsIkZhaWxlZCB0byBjcmVhdGUgWG1sQmFja2VuZFJlcG9zaXRvcnk6ICIrIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9ub2RlcmVwby9Ob2RlUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvbm9kZXJlcG8vTm9kZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQzMTllCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvbm9kZXJlcG8vTm9kZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVyZXBvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBOb2RlIFJlcG9zaXRvcnkgaW50ZXJmYWNlLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVSZXBvc2l0b3J5IHsKKworCXB1YmxpYyBMaXN0PFJlc291cmNlTm9kZT4gbG9hZE5vZGVzKCk7CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9ub2RlcmVwby9Ob2RlUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL25vZGVyZXBvL05vZGVSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWJmODEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9ub2RlcmVwby9Ob2RlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVyZXBvOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGhlIE5vZGUgUmVwb3NpdG9yeSBGYWN0b3J5IGludGVyZmFjZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlUmVwb3NpdG9yeUZhY3RvcnkgeworCisJLyoqCisJICogQ3JlYXRlcyB7QGxpbmsgTm9kZVJlcG9zaXRvcnl9CisJICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgTm9kZVJlcG9zaXRvcnl9CisJICovCisJcHVibGljIE5vZGVSZXBvc2l0b3J5IGNyZWF0ZU5vZGVSZXBvc2l0b3J5KCk7CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9ub2RlcmVwby9YbWxOb2RlUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvbm9kZXJlcG8vWG1sTm9kZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBjYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvbm9kZXJlcG8vWG1sTm9kZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5ub2RlcmVwbzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuWG1sU3RydWN0RmFjdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9ET00gaW1wb3J0cworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgWE1MIE5vZGUgUmVwb3NpdG9yeSBpbnRlcmZhY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxOb2RlUmVwb3NpdG9yeSBpbXBsZW1lbnRzIE5vZGVSZXBvc2l0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhtbE5vZGVSZXBvc2l0b3J5LmNsYXNzCisJCQkuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgc3RhdGljIEZpbGVGaWx0ZXIgbm9kZXNYbWxGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKwkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKwkJCXJldHVybiBwYXRobmFtZS5pc0ZpbGUoKQorCQkJCQkmJiBwYXRobmFtZS50b1N0cmluZygpLmVuZHNXaXRoKCJub2Rlcy54bWwiKTsKKwkJfQorCX07CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBub2Rlc0hvbWVVcmlzID0gbnVsbDsKKworCXB1YmxpYyBYbWxOb2RlUmVwb3NpdG9yeShMaXN0PFN0cmluZz4gdXJpcykgeworCQl0aGlzLm5vZGVzSG9tZVVyaXMgPSB1cmlzOworCX0KKworCXB1YmxpYyBMaXN0PFJlc291cmNlTm9kZT4gbG9hZE5vZGVzKCkgeworCQlWZWN0b3I8UmVzb3VyY2VOb2RlPiBub2RlcyA9IG5ldyBWZWN0b3I8UmVzb3VyY2VOb2RlPigpOworCQlmb3IgKFN0cmluZyBkaXJVcmkgOiB0aGlzLm5vZGVzSG9tZVVyaXMpIHsKKwkJCXRyeSB7CisJCQkJRmlsZSBub2Rlc0RpciA9IG5ldyBGaWxlKG5ldyBVUkkoZGlyVXJpKSk7CisJCQkJaWYgKG5vZGVzRGlyLmlzRGlyZWN0b3J5KCkpIHsKKworCQkJCQlTdHJpbmcgbm9kZXNEaXJTdHIgPSBub2Rlc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKworCQkJCQlpZiAoIW5vZGVzRGlyU3RyLmVuZHNXaXRoKCIvIikpIHsKKwkJCQkJCW5vZGVzRGlyU3RyICs9ICIvIjsKKwkJCQkJfQorCisJCQkJCS8vIGdldCBhbGwgdGhlIHdvcmtmbG93IHhtbCBmaWxlcworCQkJCQlGaWxlW10gbm9kZXNGaWxlcyA9IG5vZGVzRGlyLmxpc3RGaWxlcyhub2Rlc1htbEZpbHRlcik7CisKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub2Rlc0ZpbGVzLmxlbmd0aDsgaisrKSB7CisKKwkJCQkJCVN0cmluZyBub2Rlc1htbEZpbGUgPSBub2Rlc0ZpbGVzW2pdLmdldEFic29sdXRlUGF0aCgpOworCQkJCQkJRG9jdW1lbnQgbm9kZXNSb290ID0gbnVsbDsKKwkJCQkJCXRyeSB7CisJCQkJCQkJbm9kZXNSb290ID0gWE1MVXRpbHMKKwkJCQkJCQkJCS5nZXREb2N1bWVudFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCQkJbm9kZXNGaWxlc1tqXSkpOworCQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCisJCQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGVzUm9vdAorCQkJCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm5vZGUiKTsKKwkJCQkJCWlmIChub2RlTGlzdCAhPSBudWxsKQorCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGsrKykKKwkJCQkJCQkJbm9kZXMuYWRkKFhtbFN0cnVjdEZhY3RvcnkKKwkJCQkJCQkJCQkuZ2V0Tm9kZXMoKEVsZW1lbnQpIG5vZGVMaXN0Lml0ZW0oaykpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRGlyVXJpOiAiICsgZGlyVXJpCisJCQkJCQkrICIgaXMgbm90IGEgZGlyZWN0b3J5OiBza2lwcGluZyBub2RlIGxvYWRpbmcgZm9yIGl0LiIsCisJCQkJCQllKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbm9kZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9ub2RlcmVwby9YbWxOb2RlUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL25vZGVyZXBvL1htbE5vZGVSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmYzZDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9ub2RlcmVwby9YbWxOb2RlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVyZXBvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIAorICogQGF1dGhvciB3b29sbGFyZAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGhlIFhNTCBOb2RlIFJlcG9zaXRvcnkgRmFjdG9yeSBpbnRlcmZhY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxOb2RlUmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cyBOb2RlUmVwb3NpdG9yeUZhY3RvcnkgeworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBnb3YubmFzYS5qcGwub29kdC5jYXMucmVzb3VyY2Uubm9kZXMuTm9kZVJlcG9zaXRvcnlGYWN0b3J5I2NyZWF0ZU5vZGVSZXBvc2l0b3J5KCkKKwkgKi8KKwlwdWJsaWMgWG1sTm9kZVJlcG9zaXRvcnkgY3JlYXRlTm9kZVJlcG9zaXRvcnkoKSB7CisJCVN0cmluZyBub2Rlc0RpclVyaXMgPSBTeXN0ZW0KKwkJCQkuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXMuZGlycyIpOworCisJCWlmIChub2Rlc0RpclVyaXMgIT0gbnVsbCkgeworCQkJLyogZG8gZW52IHZhciByZXBsYWNlbWVudCAqLworCQkJbm9kZXNEaXJVcmlzID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMobm9kZXNEaXJVcmlzKTsKKwkJCVN0cmluZ1tdIGRpclVyaXMgPSBub2Rlc0RpclVyaXMuc3BsaXQoIiwiKTsKKwkJCXJldHVybiBuZXcgWG1sTm9kZVJlcG9zaXRvcnkoQXJyYXlzLmFzTGlzdChkaXJVcmlzKSk7CisJCX1lbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9xdWV1ZXJlcG8vUXVldWVSZXBvc2l0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9xdWV1ZXJlcG8vUXVldWVSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZjNjMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3F1ZXVlcmVwby9RdWV1ZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwbzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5RdWV1ZU1hbmFnZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgUXVldWUgUmVwb3NpdG9yeSBpbnRlcmZhY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVldWVSZXBvc2l0b3J5IHsKKworCXB1YmxpYyBRdWV1ZU1hbmFnZXIgbG9hZFF1ZXVlcygpOworCQkJCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9xdWV1ZXJlcG8vUXVldWVSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1F1ZXVlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTcyMGUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1F1ZXVlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwbzsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBRdWV1ZSBSZXBvc2l0b3J5IEZhY3RvcnkgaW50ZXJmYWNlLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXVlUmVwb3NpdG9yeUZhY3RvcnkgeworCisJcHVibGljIFF1ZXVlUmVwb3NpdG9yeSBjcmVhdGVRdWV1ZVJlcG9zaXRvcnkoKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3F1ZXVlcmVwby9YbWxRdWV1ZVJlcG9zaXRvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3F1ZXVlcmVwby9YbWxRdWV1ZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFjMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1htbFF1ZXVlUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwbzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuUXVldWVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5YbWxTdHJ1Y3RGYWN0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9ET00gaW1wb3J0cworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgWE1MIFF1ZXVlIFJlcG9zaXRvcnkgaW50ZXJmYWNlLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgWG1sUXVldWVSZXBvc2l0b3J5IGltcGxlbWVudHMgUXVldWVSZXBvc2l0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIEZpbGVGaWx0ZXIgcXVldWVzWG1sRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7CisJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7CisJCQlyZXR1cm4gcGF0aG5hbWUuaXNGaWxlKCkKKwkJCQkJJiYgcGF0aG5hbWUudG9TdHJpbmcoKQorCQkJCQkJCS5lbmRzV2l0aCgibm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbCIpOworCQl9CisJfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhtbFF1ZXVlUmVwb3NpdG9yeS5jbGFzcworCQkJLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBkaXJVcmlzOworCisJcHVibGljIFhtbFF1ZXVlUmVwb3NpdG9yeShMaXN0PFN0cmluZz4gZGlyVXJpcykgeworCQl0aGlzLmRpclVyaXMgPSBkaXJVcmlzOworCX0KKworCXB1YmxpYyBRdWV1ZU1hbmFnZXIgbG9hZFF1ZXVlcygpIHsKKworCQlRdWV1ZU1hbmFnZXIgcXVldWVNYW5hZ2VyID0gbmV3IFF1ZXVlTWFuYWdlcigpOworCisJCWlmIChkaXJVcmlzICE9IG51bGwgJiYgZGlyVXJpcy5zaXplKCkgPiAwKSB7CisJCQlmb3IgKEl0ZXJhdG9yIGkgPSBkaXJVcmlzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCVN0cmluZyBkaXJVcmkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKworCQkJCXRyeSB7CisJCQkJCUZpbGUgbm9kZXNEaXIgPSBuZXcgRmlsZShuZXcgVVJJKGRpclVyaSkpOworCQkJCQlpZiAobm9kZXNEaXIuaXNEaXJlY3RvcnkoKSkgeworCisJCQkJCQlTdHJpbmcgbm9kZXNEaXJTdHIgPSBub2Rlc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKworCQkJCQkJaWYgKCFub2Rlc0RpclN0ci5lbmRzV2l0aCgiLyIpKSB7CisJCQkJCQkJbm9kZXNEaXJTdHIgKz0gIi8iOworCQkJCQkJfQorCisJCQkJCQkvLyBnZXQgYWxsIHRoZSB3b3JrZmxvdyB4bWwgZmlsZXMKKwkJCQkJCUZpbGVbXSBub2Rlc0ZpbGVzID0gbm9kZXNEaXIubGlzdEZpbGVzKHF1ZXVlc1htbEZpbHRlcik7CisKKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZXNGaWxlcy5sZW5ndGg7IGorKykgeworCisJCQkJCQkJU3RyaW5nIG5vZGVzWG1sRmlsZSA9IG5vZGVzRmlsZXNbal0KKwkJCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCQkJCQlEb2N1bWVudCBub2Rlc1Jvb3QgPSBudWxsOworCQkJCQkJCXRyeSB7CisJCQkJCQkJCW5vZGVzUm9vdCA9IFhNTFV0aWxzCisJCQkJCQkJCQkJLmdldERvY3VtZW50Um9vdChuZXcgRmlsZUlucHV0U3RyZWFtKAorCQkJCQkJCQkJCQkJbm9kZXNGaWxlc1tqXSkpOworCQkJCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJCX0KKworCQkJCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gbm9kZXNSb290CisJCQkJCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm5vZGUiKTsKKworCQkJCQkJCWlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgeworCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBrKyspIHsKKworCQkJCQkJCQkJU3RyaW5nIG5vZGVJZCA9ICgoRWxlbWVudCkgbm9kZUxpc3QuaXRlbShrKSkKKwkJCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiaWQiKTsKKwkJCQkJCQkJCVZlY3RvciBhc3NpZ25tZW50cyA9IChWZWN0b3IpIFhtbFN0cnVjdEZhY3RvcnkKKwkJCQkJCQkJCQkJLmdldFF1ZXVlQXNzaWdubWVudCgoRWxlbWVudCkgbm9kZUxpc3QKKwkJCQkJCQkJCQkJCQkuaXRlbShrKSk7CisJCQkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IGFzc2lnbm1lbnRzLnNpemUoKTsgbCsrKSB7CisJCQkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCQkJLy8gbWFrZSBzdXJlIHF1ZXVlIGV4aXN0cworCQkJCQkJCQkJCQlxdWV1ZU1hbmFnZXIKKwkJCQkJCQkJCQkJCQkuYWRkUXVldWUoKFN0cmluZykgYXNzaWdubWVudHMKKwkJCQkJCQkJCQkJCQkJCS5nZXQobCkpOworCQkJCQkJCQkJCQkvLyBhZGQgbm9kZSB0byBxdWV1ZQorCQkJCQkJCQkJCQlxdWV1ZU1hbmFnZXIKKwkJCQkJCQkJCQkJCQkuYWRkTm9kZVRvUXVldWUobm9kZUlkLAorCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgYXNzaWdubWVudHMKKwkJCQkJCQkJCQkJCQkJCQkJLmdldChsKSk7CisJCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQkJTE9HCisJCQkJCQkJCQkJCQkJLmxvZygKKwkJCQkJCQkJCQkJCQkJCUxldmVsLldBUk5JTkcsCisJCQkJCQkJCQkJCQkJCQkiRmFpbGVkIHRvIGFkZCBub2RlICciCisJCQkJCQkJCQkJCQkJCQkJCSsgbm9kZUlkCisJCQkJCQkJCQkJCQkJCQkJCSsgIicgdG8gcXVldWUgJyIKKwkJCQkJCQkJCQkJCQkJCQkJKyAoU3RyaW5nKSBhc3NpZ25tZW50cworCQkJCQkJCQkJCQkJCQkJCQkJCS5nZXQobCkKKwkJCQkJCQkJCQkJCQkJCQkJKyAiJyA6ICIKKwkJCQkJCQkJCQkJCQkJCQkJKyBlCisJCQkJCQkJCQkJCQkJCQkJCQkJLmdldE1lc3NhZ2UoKSwKKwkJCQkJCQkJCQkJCQkJCWUpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCUxPRworCQkJCQkJCS5sb2coCisJCQkJCQkJCQlMZXZlbC5XQVJOSU5HLAorCQkJCQkJCQkJIkRpclVyaTogIgorCQkJCQkJCQkJCQkrIGRpclVyaQorCQkJCQkJCQkJCQkrICIgaXMgbm90IGEgZGlyZWN0b3J5OiBza2lwcGluZyBub2RlIGxvYWRpbmcgZm9yIGl0LiIpOworCQkJCX0KKwkJCX0KKworCQl9CisJCXJldHVybiBxdWV1ZU1hbmFnZXI7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9xdWV1ZXJlcG8vWG1sUXVldWVSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1htbFF1ZXVlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQ2NzEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1htbFF1ZXVlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwbzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgWE1MIFF1ZXVlIFJlcG9zaXRvcnkgRmFjdG9yeSBpbnRlcmZhY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxRdWV1ZVJlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMgUXVldWVSZXBvc2l0b3J5RmFjdG9yeSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisJCQkuZ2V0TG9nZ2VyKFhtbFF1ZXVlUmVwb3NpdG9yeUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBYbWxRdWV1ZVJlcG9zaXRvcnkgY3JlYXRlUXVldWVSZXBvc2l0b3J5KCkgeworCQl0cnkgeworCQkJU3RyaW5nIHF1ZXVlc0RpclVyaXMgPSBTeXN0ZW0KKwkJCQkJLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGV0b3F1ZXVlcy5kaXJzIik7CisKKwkJCS8qIGRvIGVudiB2YXIgcmVwbGFjZW1lbnQgKi8KKwkJCXF1ZXVlc0RpclVyaXMgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhxdWV1ZXNEaXJVcmlzKTsKKwkJCVN0cmluZ1tdIGRpclVyaXMgPSBxdWV1ZXNEaXJVcmlzLnNwbGl0KCIsIik7CisJCQlyZXR1cm4gbmV3IFhtbFF1ZXVlUmVwb3NpdG9yeShBcnJheXMuYXNMaXN0KGRpclVyaXMpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRworCQkJCQkubG9nKAorCQkJCQkJCUxldmVsLlNFVkVSRSwKKwkJCQkJCQkiRmFpbGVkIHRvIGNyZWF0ZSBYTUwgUXVldWUgUmVwb3NpdG9yeSAobWFrZSBzdXJlIHlvdSBzcGVjaWZ5IG5vZGUtdG8tcXVldWUgbWFwcGluZyBqYXZhIHByb3BlcnR5ICdvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5ub2RldG9xdWV1ZXMuZGlycycpIDogIgorCQkJCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL0xSVVF1ZXVlTWFuYWdlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL0xSVVF1ZXVlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmJlNTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvTFJVUXVldWVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBMUlVzIFF1ZXVlIHRvIE5vZGUgTWFwcGluZyBNYW5hZ2VyCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBMUlVRdWV1ZU1hbmFnZXIgZXh0ZW5kcyBRdWV1ZU1hbmFnZXIgeworICAgIAorCXB1YmxpYyBMUlVRdWV1ZU1hbmFnZXIoUXVldWVNYW5hZ2VyIHF1ZXVlTWFuYWdlcikgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisJCWZvciAoU3RyaW5nIHF1ZXVlIDogcXVldWVNYW5hZ2VyLmdldFF1ZXVlcygpKSB7CisJCQlMaW5rZWRIYXNoU2V0PFN0cmluZz4gbm9kZXMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7CisJCQlub2Rlcy5hZGRBbGwocXVldWVNYW5hZ2VyLmdldE5vZGVzKHF1ZXVlKSk7CisJCQl0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcucHV0KHF1ZXVlLCBub2Rlcyk7CisJCX0KKwl9CisJCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVzZWROb2RlKFN0cmluZyBxdWV1ZU5hbWUsIFN0cmluZyBub2RlSWQpIHsKKyAgICAJVmVjdG9yPFN0cmluZz4gbm9kZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4odGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLmdldChxdWV1ZU5hbWUpKTsKKwkJbm9kZXMucmVtb3ZlKG5vZGVJZCk7CisJCW5vZGVzLmFkZChub2RlSWQpOworCQlMaW5rZWRIYXNoU2V0PFN0cmluZz4gbm9kZVNldCA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKKwkJbm9kZVNldC5hZGRBbGwobm9kZXMpOworCQl0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcucHV0KHF1ZXVlTmFtZSwgbm9kZVNldCk7CisgICAgfQorICAgIAorfQorCmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvTFJVU2NoZWR1bGVyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvTFJVU2NoZWR1bGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzN2RhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9MUlVTY2hlZHVsZXIuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlcjsKKworLy9KREtpbXBvcnRzCitpbXBvcnQgamF2YS5sYW5nLkRvdWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JRdWV1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuU2NoZWR1bGVyRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciB3b29sbGFyZAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgU2NoZWR1bGVyfSB0aGF0IHVzZXMgYSA8YQorICogaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYWNoZV9hbGdvcml0aG1zIj5sZWFzdC1yZWNlbnRseS11c2VkPC9hPgorICogYWxnb3JpdGhtIGZvciBzY2hlZHVsaW5nIHtAbGluayBKb2J9cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIExSVVNjaGVkdWxlciBpbXBsZW1lbnRzIFNjaGVkdWxlciB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKExSVVNjaGVkdWxlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIExSVVF1ZXVlTWFuYWdlciBxdWV1ZU1hbmFnZXI7CisgICAgCisgICAgLyogdGhlIG1vbml0b3Igd2UnbGwgdXNlIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHJlc291cmNlcyAqLworICAgIHByaXZhdGUgTW9uaXRvciBteU1vbml0b3I7CisKKyAgICAvKiB0aGUgYmF0Y2ggbWdyIHdlJ2xsIHVzZSB0byBleGVjdXRlIGpvYnMgKi8KKyAgICBwcml2YXRlIEJhdGNobWdyIG15QmF0Y2htZ3I7CisKKyAgICAvKiBvdXIgam9iIHF1ZXVlICovCisgICAgcHJpdmF0ZSBKb2JRdWV1ZSBteUpvYlF1ZXVlOworCisgICAgLyogb3VyIHdhaXQgdGltZSBiZXR3ZWVuIGNoZWNraW5nIHRoZSBxdWV1ZSAqLworICAgIHByaXZhdGUgZG91YmxlIHdhaXRUaW1lID0gLTE7CisKKyAgICBwdWJsaWMgTFJVU2NoZWR1bGVyKE1vbml0b3IgbSwgQmF0Y2htZ3IgYiwgSm9iUXVldWUgcSwgTFJVUXVldWVNYW5hZ2VyIHFtKSB7CisKKyAgICAJcXVldWVNYW5hZ2VyID0gcW07CisgICAgICAgIG15TW9uaXRvciA9IG07CisgICAgICAgIG15QmF0Y2htZ3IgPSBiOworICAgICAgICBteUpvYlF1ZXVlID0gcTsKKworICAgICAgICBTdHJpbmcgd2FpdFN0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIud2FpdC5zZWNvbmRzIiwgIjIwIik7CisgICAgICAgIHdhaXRUaW1lID0gRG91YmxlLnBhcnNlRG91YmxlKHdhaXRTdHIpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBmb3IgKDs7KSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAJbG9uZyBzbGVlcFRpbWUgPSAobG9uZykod2FpdFRpbWUgKiAxMDAwLjApOworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoc2xlZXBUaW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisKKyAgICAgICAgICAgIGlmICghbXlKb2JRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBKb2JTcGVjIGV4ZWMgPSBudWxsOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZXhlYyA9IG15Sm9iUXVldWUuZ2V0TmV4dEpvYigpOworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJPYnRhaW5lZCBKb2I6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleGVjLmdldEpvYigpLmdldElkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGZyb20gUXVldWU6IFNjaGVkdWxpbmcgZm9yIGV4ZWN1dGlvbiIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBuZXh0IGpvYiBmcm9tIEpvYlF1ZXVlOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUoZXhlYyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3Igc2NoZWR1bGluZyBqb2I6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleGVjLmdldEpvYigpLmdldElkKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZSB0aGUgam9iIHNwZWMgYmFjayBvbiB0aGUgcXVldWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15Sm9iUXVldWUucmVxdWV1ZUpvYihleGVjKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI3NjaGVkdWxlKGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWMpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNjaGVkdWxlKEpvYlNwZWMgc3BlYykKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcXVldWVOYW1lID0gc3BlYy5nZXRKb2IoKS5nZXRRdWV1ZU5hbWUoKTsKKyAgICAgICAgaW50IGxvYWQgPSBzcGVjLmdldEpvYigpLmdldExvYWRWYWx1ZSgpLmludFZhbHVlKCk7CisKKyAgICAgICAgUmVzb3VyY2VOb2RlIG5vZGUgPSBub2RlQXZhaWxhYmxlKHNwZWMpOworCisgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbXlNb25pdG9yLmFzc2lnbkxvYWQobm9kZSwgbG9hZCk7CisgICAgICAgICAgICAgICAgcXVldWVNYW5hZ2VyLnVzZWROb2RlKHF1ZXVlTmFtZSwgbm9kZS5nZXROb2RlSWQoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gYXNzaWduIHZpYSBiYXRjaCBzeXN0ZW0KKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJBc3NpZ25pbmcgam9iOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzcGVjLmdldEpvYigpLmdldE5hbWUoKSArICJdIHRvIG5vZGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGUuZ2V0Tm9kZUlkKCkgKyAiXSIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG15QmF0Y2htZ3IuZXhlY3V0ZVJlbW90ZWx5KHNwZWMsIG5vZGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBleGVjdXRpbmcgam9iOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3BlYy5nZXRKb2IoKS5nZXRJZCgpICsgIl0gdG8gbm9kZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGUuZ2V0SXBBZGRyKCkgKyAiXTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGpvYiBiYWNrIHVwCisgICAgICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJSZXF1ZXVlaW5nIGpvYjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcGVjLmdldEpvYigpLmdldElkKCkgKyAiXSIpOworICAgICAgICAgICAgICAgICAgICAgICAgbXlKb2JRdWV1ZS5yZXF1ZXVlSm9iKHNwZWMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gZGVjcmVtZW50IHRoZSBsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICBteU1vbml0b3IucmVkdWNlTG9hZChub2RlLCBsb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGFzc2lnbmluZyBsb2FkIHRvIHJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vZGU6IFsiICsgbm9kZS5nZXROb2RlSWQoKSArICJdOiBsb2FkOiBbIiArIGxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb3VsZCBub3QgZmluZCByZXNvdXJjZSwgcHVzaCBvbnRvIEpvYlF1ZXVlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG15Sm9iUXVldWUucmVxdWV1ZUpvYihzcGVjKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI2dldEJhdGNobWdyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQmF0Y2htZ3IgZ2V0QmF0Y2htZ3IoKSB7CisgICAgICAgIHJldHVybiBteUJhdGNobWdyOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5TY2hlZHVsZXIjZ2V0TW9uaXRvcigpCisgICAgICovCisgICAgcHVibGljIE1vbml0b3IgZ2V0TW9uaXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG15TW9uaXRvcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI2dldEpvYlF1ZXVlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSm9iUXVldWUgZ2V0Sm9iUXVldWUoKSB7CisgICAgICAgIHJldHVybiBteUpvYlF1ZXVlOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI2dldFF1ZXVlTWFuYWdlcigpCisgICAgICovCisgICAgcHVibGljIFF1ZXVlTWFuYWdlciBnZXRRdWV1ZU1hbmFnZXIoKSB7CisgICAgCXJldHVybiB0aGlzLnF1ZXVlTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGdvdi5uYXNhLmpwbC5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI25vZGVBdmFpbGFibGUoZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlTm9kZSBub2RlQXZhaWxhYmxlKEpvYlNwZWMgc3BlYykKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworCSAgICAJU3RyaW5nIHF1ZXVlTmFtZSA9IHNwZWMuZ2V0Sm9iKCkuZ2V0UXVldWVOYW1lKCk7CisJICAgICAgICBpbnQgbG9hZCA9IHNwZWMuZ2V0Sm9iKCkuZ2V0TG9hZFZhbHVlKCkuaW50VmFsdWUoKTsKKwkKKwkgICAgICAgIGZvciAoU3RyaW5nIG5vZGVJZCA6IHF1ZXVlTWFuYWdlci5nZXROb2RlcyhxdWV1ZU5hbWUpKSB7CisJICAgICAgICAgICAgaW50IG5vZGVMb2FkID0gLTE7CisJICAgICAgICAgICAgUmVzb3VyY2VOb2RlIHJlc05vZGUgPSBudWxsOworCQorCSAgICAgICAgICAgIHRyeSB7CisJICAgICAgICAgICAgICAgIHJlc05vZGUgPSBteU1vbml0b3IuZ2V0Tm9kZUJ5SWQobm9kZUlkKTsKKwkgICAgICAgICAgICAgICAgbm9kZUxvYWQgPSBteU1vbml0b3IuZ2V0TG9hZChyZXNOb2RlKTsKKwkgICAgICAgICAgICB9IGNhdGNoIChNb25pdG9yRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgICAgICAgTE9HCisJICAgICAgICAgICAgICAgICAgICAgICAgLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgbG9hZCBvbiAiCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub2RlOiBbIiArIHJlc05vZGUuZ2V0Tm9kZUlkKCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCSAgICAgICAgICAgIH0KKwkKKwkgICAgICAgICAgICBpZiAobG9hZCA8PSBub2RlTG9hZCkgeworCSAgICAgICAgICAgICAgICByZXR1cm4gcmVzTm9kZTsKKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJCisJICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAJdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbmQgYXZhaWxhYmxlIG5vZGUgZm9yIGpvYiBzcGVjIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL0xSVVNjaGVkdWxlckZhY3RvcnkuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9MUlVTY2hlZHVsZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExYzcxMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9MUlVTY2hlZHVsZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXI7CisKKy8vSkFWQSBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UucXVldWVyZXBvLlhtbFF1ZXVlUmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLkdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iUXVldWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1ncjsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIExlYXN0IHJlY2VudGx5IHVzZWQgc2NoZWR1bGVyIGZhY3RvcnkgaW50ZXJmYWNlLgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBMUlVTY2hlZHVsZXJGYWN0b3J5IGltcGxlbWVudHMgU2NoZWR1bGVyRmFjdG9yeSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisJCQkuZ2V0TG9nZ2VyKExSVVNjaGVkdWxlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qCisJICogYSBsaXN0IG9mIFVSSXMgcG9pbnRpbmcgdG8gZGlyZWN0b3JpZXMgdGhhdCBoYXZlIHRoZQorCSAqIG5vZGUtdG8tcXVldWUtbWFwcGluZy54bWwgZmlsZXMKKwkgKi8KKwlwcml2YXRlIExSVVF1ZXVlTWFuYWdlciBxdWV1ZU1hbmFnZXI7CisKKwkvKiBvdXIgbW9uaXRvciAqLworCXByaXZhdGUgTW9uaXRvciBtb24gPSBudWxsOworCisJLyogb3VyIGJhdGNobWdyICovCisJcHJpdmF0ZSBCYXRjaG1nciBiYXRjaGVyID0gbnVsbDsKKworCS8qIG91ciBqb2IgcXVldWUgKi8KKwlwcml2YXRlIEpvYlF1ZXVlIHF1ZXVlID0gbnVsbDsKKworCXB1YmxpYyBMUlVTY2hlZHVsZXJGYWN0b3J5KCkgeworCQlTdHJpbmcgcXVldWVSZXBvRmFjdG9yeUNsYXNzU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KAorCQkJCSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcy5yZXBvLmZhY3RvcnkiLAorCQkJCVhtbFF1ZXVlUmVwb3NpdG9yeUZhY3RvcnkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKwkJU3RyaW5nIGJhdGNobWdyQ2xhc3NTdHIgPSBTeXN0ZW0KKwkJCQkuZ2V0UHJvcGVydHkoInJlc291cmNlLmJhdGNobWdyLmZhY3RvcnkiLAorCQkJCQkJIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuWG1sUnBjQmF0Y2htZ3JGYWN0b3J5Iik7CisJCVN0cmluZyBtb25pdG9yQ2xhc3NTdHIgPSBTeXN0ZW0KKwkJCQkuZ2V0UHJvcGVydHkoInJlc291cmNlLm1vbml0b3IuZmFjdG9yeSIsCisJCQkJCQkib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLkFzc2lnbm1lbnRNb25pdG9yRmFjdG9yeSIpOworCisJCVN0cmluZyBqb2JRdWV1ZUNsYXNzU3RyID0gU3lzdGVtCisJCQkJLmdldFByb3BlcnR5KCJyZXNvdXJjZS5qb2JxdWV1ZS5mYWN0b3J5IiwKKwkJCQkJCSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlN0YWNrSm9iUXVldWVGYWN0b3J5Iik7CisKKwkJdHJ5IHsKKwkJCXF1ZXVlTWFuYWdlciA9IG5ldyBMUlVRdWV1ZU1hbmFnZXIoCisJCQkJCUdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5CisJCQkJCQkJLmdldFF1ZXVlUmVwb3NpdG9yeUZyb21GYWN0b3J5KAorCQkJCQkJCQkJcXVldWVSZXBvRmFjdG9yeUNsYXNzU3RyKS5sb2FkUXVldWVzKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gY3JlYXRlIHF1ZXVlIG1hbmFnZXIgOiAiCisJCQkJCSsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcXVldWVNYW5hZ2VyID0gbnVsbDsKKwkJfQorCQliYXRjaGVyID0gR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3RvcnkKKwkJCQkuZ2V0QmF0Y2htZ3JTZXJ2aWNlRnJvbUZhY3RvcnkoYmF0Y2htZ3JDbGFzc1N0cik7CisJCW1vbiA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5CisJCQkJLmdldE1vbml0b3JTZXJ2aWNlRnJvbUZhY3RvcnkobW9uaXRvckNsYXNzU3RyKTsKKworCQlxdWV1ZSA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5CisJCQkJLmdldEpvYlF1ZXVlU2VydmljZUZyb21GYWN0b3J5KGpvYlF1ZXVlQ2xhc3NTdHIpOworCisJCS8vIHNldCB0aGUgbW9uaXRvciBmb3IgdGhpcyBiYXRjaGVyCisJCWJhdGNoZXIuc2V0TW9uaXRvcihtb24pOworCisJCS8vIHNldCB0aGUgam9iIHJlcG8gZm9yIHRoaXMgYmF0Y2hlcgorCQliYXRjaGVyLnNldEpvYlJlcG9zaXRvcnkocXVldWUuZ2V0Sm9iUmVwb3NpdG9yeSgpKTsKKworCX0KKworCXB1YmxpYyBTY2hlZHVsZXIgY3JlYXRlU2NoZWR1bGVyKCkgeworCQlyZXR1cm4gbmV3IExSVVNjaGVkdWxlcihtb24sIGJhdGNoZXIsIHF1ZXVlLCBxdWV1ZU1hbmFnZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1F1ZXVlTWFuYWdlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1F1ZXVlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTQzMGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvUXVldWVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBRdWV1ZSB0byBOb2RlIE1hcHBpbmcgTWFuYWdlcgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgUXVldWVNYW5hZ2VyIHsKKworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBMaW5rZWRIYXNoU2V0PFN0cmluZz4+IHF1ZXVlVG9Ob2Rlc01hcHBpbmc7CisJCisJcHVibGljIFF1ZXVlTWFuYWdlcigpIHsKKwkJdGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBMaW5rZWRIYXNoU2V0PFN0cmluZz4+KCk7CisJfQorCQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWluc1F1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpIHsKKwkJcmV0dXJuIHRoaXMucXVldWVUb05vZGVzTWFwcGluZy5jb250YWluc0tleShxdWV1ZU5hbWUpOworCX0KKwkKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTm9kZVRvUXVldWUoU3RyaW5nIG5vZGVJZCwgU3RyaW5nIHF1ZXVlTmFtZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisJCWlmIChxdWV1ZU5hbWUgPT0gbnVsbCB8fCAhdGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLmNvbnRhaW5zS2V5KHF1ZXVlTmFtZSkpIAorCQkJdGhyb3cgbmV3IFF1ZXVlTWFuYWdlckV4Y2VwdGlvbigiUXVldWUgJyIgKyBxdWV1ZU5hbWUgKyAiJyBkb2VzIG5vdCBleGlzdCIpOworCQkKKwkJLy8gYWRkIG5vZGUgdG8gcXVldWUKKwkJTGlua2VkSGFzaFNldDxTdHJpbmc+IG5vZGVzID0gdGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLmdldChxdWV1ZU5hbWUpOworCQlpZiAobm9kZXMgPT0gbnVsbCkKKwkJCW5vZGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworCQlub2Rlcy5hZGQobm9kZUlkKTsKKwkJCisJCS8vIHB1dCBub2RlIGxpc3QgYmFjayBpbnRvIG1hcAorCQl0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcucHV0KHF1ZXVlTmFtZSwgbm9kZXMpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRRdWV1ZShTdHJpbmcgcXVldWVOYW1lKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKwkJaWYgKHF1ZXVlTmFtZSAhPSBudWxsICYmICF0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcuY29udGFpbnNLZXkocXVldWVOYW1lKSkgCisJCQl0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcucHV0KHF1ZXVlTmFtZSwgbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpKTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U3RyaW5nPiBnZXROb2RlcyhTdHJpbmcgcXVldWVOYW1lKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKwkJaWYgKHF1ZXVlTmFtZSAhPSBudWxsICYmIHRoaXMucXVldWVUb05vZGVzTWFwcGluZy5jb250YWluc0tleShxdWV1ZU5hbWUpKSAKKwkJCXJldHVybiBuZXcgVmVjdG9yPFN0cmluZz4odGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLmdldChxdWV1ZU5hbWUpKTsKKwkJZWxzZQorCQkJdGhyb3cgbmV3IFF1ZXVlTWFuYWdlckV4Y2VwdGlvbigiUXVldWUgJyIgKyBxdWV1ZU5hbWUgKyAiJyBkb2VzIG5vdCBleGlzdCIpOworCX0KKwkKKwlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U3RyaW5nPiBnZXRRdWV1ZXMoKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBWZWN0b3I8U3RyaW5nPih0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcua2V5U2V0KCkpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTdHJpbmc+IGdldFF1ZXVlcyhTdHJpbmcgbm9kZUlkKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKwkJVmVjdG9yPFN0cmluZz4gcXVldWVOYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCQlmb3IgKFN0cmluZyBxdWV1ZU5hbWUgOiB0aGlzLnF1ZXVlVG9Ob2Rlc01hcHBpbmcua2V5U2V0KCkpIAorCQkJaWYgKHRoaXMucXVldWVUb05vZGVzTWFwcGluZy5nZXQocXVldWVOYW1lKS5jb250YWlucyhub2RlSWQpKQorCQkJCXF1ZXVlTmFtZXMuYWRkKHF1ZXVlTmFtZSk7CisJCXJldHVybiBxdWV1ZU5hbWVzOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVOb2RlRnJvbVF1ZXVlKFN0cmluZyBub2RlSWQsIFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworCQlpZiAocXVldWVOYW1lICE9IG51bGwgJiYgdGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLmNvbnRhaW5zS2V5KHF1ZXVlTmFtZSkpIAorCQkJdGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLmdldChxdWV1ZU5hbWUpLnJlbW92ZShub2RlSWQpOworCQllbHNlCisJCQl0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKCJRdWV1ZSAnIiArIHF1ZXVlTmFtZSArICInIGRvZXMgbm90IGV4aXN0Iik7CisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworCQlpZiAocXVldWVOYW1lICE9IG51bGwpIAorCQkJdGhpcy5xdWV1ZVRvTm9kZXNNYXBwaW5nLnJlbW92ZShxdWV1ZU5hbWUpOworCX0KKwkKK30KKwpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1NjaGVkdWxlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1NjaGVkdWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDlkOWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU2NoZWR1bGVyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iUXVldWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuUXVldWVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuU2NoZWR1bGVyRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgc2NoZWR1bGVyIGludGVyZmFjZS4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVkdWxlciBleHRlbmRzIFJ1bm5hYmxleworCisJLyoqCisJICogU2NoZWR1bGVzIGEgam9iIHRvIGJlIGV4ZWN1dGVkIGJ5IGEgcGFydGljdWxhciBiYXRjaCBtYW5hZ2VyLgorCSAqIAorCSAqIEBwYXJhbSBzcGVjCisJICogICAgICAgICAgICBUaGUge0BsaW5rIEpvYlNwZWN9IHRvIHNjaGVkdWxlIGZvciBleGVjdXRpb24uCisJICogQHJldHVybiBXaGV0aGVyIHRoZSBqb2Igd2FzIHN1Y2Nlc3NmdWxseSBzY2hlZHVsZWQgb3Igbm90LgorICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhbnkgZXJyb3Igc2NoZWR1bGluZworICAqIHRoZSBnaXZlbiB7QGxpbmsgSm9iU3BlY30uCisJICovCisJcHVibGljIGJvb2xlYW4gc2NoZWR1bGUoSm9iU3BlYyBzcGVjKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uOworCisKKyAvKioKKyAgKiBSZXR1cm5zIHRoZSBSZXNvdXJjZU5vZGUgdGhhdCBpcyBjb25zaWRlcmVkIHRvIGJlIDxxdW90ZT5tb3N0IGF2YWlsYWJsZTwvcXVvdGU+CisgICogd2l0aGluIG91ciB1bmRlcmx5aW5nIHNldCBvZiByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiBKb2JTcGVjLgorICAqIEBwYXJhbSBzcGVjIFRoZSBKb2JTcGVjIHRvIGZpbmQgYW4gYXZhaWxhYmxlIG5vZGUgZm9yLgorICAqIEByZXR1cm4gVGhlIHtAbGluayBSZXNvdXJjZU5vZGV9IGJlc3Qgc3VpdGVkIHRvIGhhbmRsZSB0aGlzIHtAbGluayBKb2JTcGVjfQorICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICovCisgcHVibGljIFJlc291cmNlTm9kZSBub2RlQXZhaWxhYmxlKEpvYlNwZWMgc3BlYykgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbjsKKworIC8qKgorICAqIAorICAqIEByZXR1cm4gVGhlIHVuZGVybHlpbmcge0BsaW5rIE1vbml0b3J9IHVzZWQgYnkgdGhpcworICAqIFNjaGVkdWxlci4KKyAgKi8KKyBwdWJsaWMgTW9uaXRvciBnZXRNb25pdG9yKCk7CisgCisgLyoqCisgICogCisgICogQHJldHVybiBUaGUgdW5kZXJseWluZyB7QGxpbmsgQmF0Y2htZ3J9IHVzZWQgYnkgdGhpcworICAqIFNjaGVkdWxlci4KKyAgKi8KKyBwdWJsaWMgQmF0Y2htZ3IgZ2V0QmF0Y2htZ3IoKTsKKyAKKyAKKyAvKioKKyAgKiAKKyAgKiBAcmV0dXJuIFRoZSB1bmRlcmx5aW5nIHtAbGluayBKb2JRdWV1ZX0gdXNlZCBieSB0aGlzCisgICogU2NoZWR1bGVyLgorICAqLworIHB1YmxpYyBKb2JRdWV1ZSBnZXRKb2JRdWV1ZSgpOworCisgLyoqCisgICogCisgICogQHJldHVybiBUaGUgdW5kZXJseWluZyB7QGxpbmsgUXVldWVNYW5hZ2VyfSB1c2VkIGJ5IHRoaXMKKyAgKiBTY2hlZHVsZXIuCisgICovCisgcHVibGljIFF1ZXVlTWFuYWdlciBnZXRRdWV1ZU1hbmFnZXIoKTsKKyAKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9TY2hlZHVsZXJGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU2NoZWR1bGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODMxMTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU2NoZWR1bGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXI7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgU2NoZWR1bGVyfXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBTY2hlZHVsZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEByZXR1cm4gQSBuZXcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTY2hlZHVsZXJ9IGludGVyZmFjZS4KKwkgKi8KKwlwdWJsaWMgU2NoZWR1bGVyIGNyZWF0ZVNjaGVkdWxlcigpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9Kb2IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkODU3YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgdW5pdCBvZiBjb21wdXRhdGlvbiBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlci4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgSm9iIHsKKworICAgIC8qIG91ciBqb2IgaWQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7CisKKyAgICAvKiBqb2IgbmFtZSAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgLyogdGhlIGluc3RhbmNlIGNsYXNzICovCisgICAgcHJpdmF0ZSBTdHJpbmcgam9iSW5zdGFuY2VDbGFzc05hbWUgPSBudWxsOworCisgICAgLyogdGhlIGpvYiBpbnB1dCBjbGFzcyAqLworICAgIHByaXZhdGUgU3RyaW5nIGpvYklucHV0Q2xhc3NOYW1lID0gbnVsbDsKKworICAgIC8qIHRoZSBxdWV1ZSB0aGF0IHRoaXMgam9iIGJlbG9uZ3MgdG8gKi8KKyAgICBwcml2YXRlIFN0cmluZyBxdWV1ZU5hbWUgPSBudWxsOworCisgICAgLyogdGhlIGxvYWQgdmFsdWUgZm9yIHRoaXMgam9iICovCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGxvYWRWYWx1ZSA9IG51bGw7CisKKyAgICAvKiB0aGUgc3RhdHVzIG9mIHRoaXMgam9iICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICogCisgICAgICovCisgICAgcHVibGljIEpvYigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBqb2IuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIGZvciB0aGlzIGpvYi4KKyAgICAgKiBAcGFyYW0gam9iSW5zdGFuY2VDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSB7QGxpbmsgSm9iSW5zdGFuY2V9IGNsYXNzIHRoYXQgdGhpcyBKb2IKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBydW4uCisgICAgICogQHBhcmFtIGpvYklucHV0Q2xhc3NOYW1lCisgICAgICogICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUge0BsaW5rIEpvYklucHV0fSBjbGFzcyB0aGF0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgZmVkIGFzIGlucHV0IHRvIHRoZSBydW5uaW5nIHtAbGluayBKb2JJbnN0YW5jZX0uCisgICAgICovCisgICAgcHVibGljIEpvYihTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgam9iSW5zdGFuY2VDbGFzc05hbWUsCisgICAgICAgICAgICBTdHJpbmcgam9iSW5wdXRDbGFzc05hbWUsIFN0cmluZyBxdWV1ZU5hbWUsIEludGVnZXIgbG9hZFZhbHVlKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5qb2JJbnN0YW5jZUNsYXNzTmFtZSA9IGpvYkluc3RhbmNlQ2xhc3NOYW1lOworICAgICAgICB0aGlzLmpvYklucHV0Q2xhc3NOYW1lID0gam9iSW5wdXRDbGFzc05hbWU7CisgICAgICAgIHRoaXMubG9hZFZhbHVlID0gbG9hZFZhbHVlOworICAgICAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBpZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpZCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGpvYklucHV0Q2xhc3NOYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKb2JJbnB1dENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGpvYklucHV0Q2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBqb2JJbnB1dENsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGpvYklucHV0Q2xhc3NOYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvYklucHV0Q2xhc3NOYW1lKFN0cmluZyBqb2JJbnB1dENsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmpvYklucHV0Q2xhc3NOYW1lID0gam9iSW5wdXRDbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgam9iSW5zdGFuY2VDbGFzc05hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEpvYkluc3RhbmNlQ2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gam9iSW5zdGFuY2VDbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGpvYkluc3RhbmNlQ2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgam9iSW5zdGFuY2VDbGFzc05hbWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoU3RyaW5nIGpvYkluc3RhbmNlQ2xhc3NOYW1lKSB7CisgICAgICAgIHRoaXMuam9iSW5zdGFuY2VDbGFzc05hbWUgPSBqb2JJbnN0YW5jZUNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldExvYWRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkVmFsdWUoSW50ZWdlciBsb2FkVmFsdWUpIHsKKyAgICAgICAgdGhpcy5sb2FkVmFsdWUgPSBsb2FkVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRRdWV1ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBxdWV1ZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVldWVOYW1lKFN0cmluZyBxdWV1ZU5hbWUpIHsKKyAgICAgICAgdGhpcy5xdWV1ZU5hbWUgPSBxdWV1ZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHN0YXR1cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXR1cyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iSW5wdXQuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iSW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE0ZWExCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9Kb2JJbnB1dC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLlhtbFJwY1dyaXRlYWJsZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogSW5wdXQgdG8gYSBqb2IgdGhhdCBzaG91bGQgYmUgd3JpdGVhYmxlIG92ZXIgdGhlIFhNTC1SUEMgd2lyZS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9iSW5wdXQgZXh0ZW5kcyBYbWxScGNXcml0ZWFibGUsIENvbmZpZ3VyYWJsZSB7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIElEIG9mIHRoaXMgSm9iSW5wdXQKKyAgICogCisgICAqIEByZXR1cm4gVGhlIHN0cmluZyBpZGVudGlmaWVyIG9mIHRoaXMgSm9iSW5wdXQgb2JqZWN0LgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRJZCgpOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL0pvYkluc3RhbmNlLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL0pvYkluc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxY2UwYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iSW5zdGFuY2UuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JJbnB1dEV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBqb2IgaW50ZXJmYWNlOiB0aGUgdGhpbmcgdGhhdCBhY3R1YWxseSBwZXJmb3JtcyB0aGUgd29yay4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBKb2JJbnN0YW5jZSB7CisKKyAgLyoqCisgICAqIEV4ZWN1dGVzIHRoZSB1bmRlcmx5aW5nIGNvZGUgZm9yIHRoaXMgam9iLgorICAgKiAKKyAgICogQHBhcmFtIGluCisgICAqICAgICAgICAgIFRoZSBKb2IncyBpbnB1dC4KKyAgICogCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgam9iIGV4ZWN1dGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAdGhyb3dzIEpvYklucHV0RXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaGFuZGxpbmcgdGhlIHtAbGluayBKb2JJbnB1dH0uCisgICAqLworICBib29sZWFuIGV4ZWN1dGUoSm9iSW5wdXQgaW4pIHRocm93cyBKb2JJbnB1dEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iU3BlYy5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9Kb2JTcGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhMjFiNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iU3BlYy5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogQSBjbGFzcyB0aGF0IGhvbGRzIHRoZSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIGZvciBob3cgdG8gcnVuIGEge0BsaW5rIEpvYn0uCisgKiBUaGlzIGluY2x1ZGVzIHRoZSB7QGxpbmsgSm9ifSBkZWZpbml0aW9uIGl0c2VsZiwgYWxvbmcgd2l0aCBpdHMKKyAqIHtAbGluayBKb2JJbnB1dH0uCisgKi8KK3B1YmxpYyBjbGFzcyBKb2JTcGVjIHsKKworICBwcml2YXRlIEpvYklucHV0IGluID0gbnVsbDsKKworICBwcml2YXRlIEpvYiBqb2IgPSBudWxsOworCisgIC8qKgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKiAKKyAgICovCisgIHB1YmxpYyBKb2JTcGVjKCkgeworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgSm9iU3BlYyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgSm9iSW5wdXR9IGFuZCB7QGxpbmsgSm9ifS4KKyAgICogCisgICAqIEBwYXJhbSBpbgorICAgKiAgICAgICAgICBUaGUge0BsaW5rIEpvYn0ncyBpbnB1dC4KKyAgICogQHBhcmFtIGpvYgorICAgKiAgICAgICAgICBUaGUge0BsaW5rIEpvYn0ncyBkZWZpbml0aW9uLgorICAgKi8KKyAgcHVibGljIEpvYlNwZWMoSm9iSW5wdXQgaW4sIEpvYiBqb2IpIHsKKyAgICB0aGlzLmluID0gaW47CisgICAgdGhpcy5qb2IgPSBqb2I7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgaW4KKyAgICovCisgIHB1YmxpYyBKb2JJbnB1dCBnZXRJbigpIHsKKyAgICByZXR1cm4gaW47CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGluCisgICAqICAgICAgICAgIHRoZSBpbiB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEluKEpvYklucHV0IGluKSB7CisgICAgdGhpcy5pbiA9IGluOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGpvYgorICAgKi8KKyAgcHVibGljIEpvYiBnZXRKb2IoKSB7CisgICAgcmV0dXJuIGpvYjsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gam9iCisgICAqICAgICAgICAgIHRoZSBqb2IgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRKb2IoSm9iIGpvYikgeworICAgIHRoaXMuam9iID0gam9iOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iU3BlY1NlcmlhbGl6ZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iU3BlY1NlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY4ODkwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9Kb2JTcGVjU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBBIGNsYXNzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZS1zZXJpYWxpemUgYSBqb2Igc3BlYworICogQGF1dGhvciBzdGFyY2htZAorICovCitwdWJsaWMgY2xhc3MgSm9iU3BlY1NlcmlhbGl6ZXIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgyNDYxOTkwNDI4NjM5MzI2NjdMOworICAgIC8vVmFyaWFibGVzIG5lZWRlZCB0byBzZXJpYWxpemUKKyAgICBTdHJpbmcgaWQ7CisgICAgU3RyaW5nIGpvYklucHV0Q2xhc3NOYW1lOworICAgIFN0cmluZyBqb2JJbnN0YW5jZUNsYXNzTmFtZTsKKyAgICBJbnRlZ2VyIGxvYWRWYWx1ZTsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBTdHJpbmcgcXVldWVOYW1lOworICAgIFN0cmluZyBzdGF0dXM7CisgICAgU3RyaW5nIGpvYklucHV0SWQ7CisgICAgU2VyaWFsaXphYmxlIGpvYklucHV0OworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFyaWFibGVzIHRvIHNlcmlhbGl6ZSB0aGVtLgorICAgICAqIEBwYXJhbSBzcGVjIC0gam9iIHNwZWMgdG8gc2VyaWFsaXplCisgICAgICovCisgICAgcHVibGljIEpvYlNwZWNTZXJpYWxpemVyKEpvYlNwZWMgc3BlYykgeworICAgICAgICAvL0pvYgorICAgICAgICBKb2IgdG1wID0gc3BlYy5nZXRKb2IoKTsKKyAgICAgICAgaWQgPSB0bXAuZ2V0SWQoKTsKKyAgICAgICAgam9iSW5wdXRDbGFzc05hbWUgPSB0bXAuZ2V0Sm9iSW5wdXRDbGFzc05hbWUoKTsKKyAgICAgICAgam9iSW5zdGFuY2VDbGFzc05hbWUgPSB0bXAuZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKTsKKyAgICAgICAgbG9hZFZhbHVlID0gdG1wLmdldExvYWRWYWx1ZSgpOworICAgICAgICBuYW1lID0gdG1wLmdldE5hbWUoKTsKKyAgICAgICAgcXVldWVOYW1lID0gdG1wLmdldFF1ZXVlTmFtZSgpOworICAgICAgICBzdGF0dXMgPSB0bXAuZ2V0U3RhdHVzKCk7CisgICAgICAgIC8vSW5wdXQgb2Ygc3BlYworICAgICAgICBKb2JJbnB1dCBpbnB1dCA9IHNwZWMuZ2V0SW4oKTsKKyAgICAgICAgam9iSW5wdXRJZCA9IGlucHV0LmdldElkKCk7CisgICAgICAgIGpvYklucHV0ID0gKFNlcmlhbGl6YWJsZSlpbnB1dC53cml0ZSgpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEpvYlNwZWMgYmFjay4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNvbnN0cnVjdGVkIGpvYiBzcGVjCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIEpvYlNwZWMgZ2V0Sm9iU3BlYygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgSm9iIHRtcCA9IG5ldyBKb2IoKTsKKyAgICAgICAgdG1wLnNldElkKGlkKTsKKyAgICAgICAgdG1wLnNldEpvYklucHV0Q2xhc3NOYW1lKGpvYklucHV0Q2xhc3NOYW1lKTsKKyAgICAgICAgdG1wLnNldEpvYkluc3RhbmNlQ2xhc3NOYW1lKGpvYkluc3RhbmNlQ2xhc3NOYW1lKTsKKyAgICAgICAgdG1wLnNldExvYWRWYWx1ZShsb2FkVmFsdWUpOworICAgICAgICB0bXAuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgdG1wLnNldFF1ZXVlTmFtZShxdWV1ZU5hbWUpOworICAgICAgICB0bXAuc2V0U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIC8vUmVhZCBpbiBqb2IgaW5wdXQsIHVzaW5nIHByb3BlciBjbGFzcworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IENsYXNzLmZvck5hbWUoam9iSW5wdXRDbGFzc05hbWUpOworICAgICAgICBKb2JJbnB1dCBpbnB1dCA9ICgoSm9iSW5wdXQpY2xhenoubmV3SW5zdGFuY2UoKSk7CisgICAgICAgIGlucHV0LnJlYWQoam9iSW5wdXQpOworICAgICAgICBKb2JTcGVjIHNwZWMgPSBuZXcgSm9iU3BlYygpOworICAgICAgICBzcGVjLnNldEluKGlucHV0KTsKKyAgICAgICAgc3BlYy5zZXRKb2IodG1wKTsKKyAgICAgICAgcmV0dXJuIHNwZWM7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvSm9iU3RhdHVzLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL0pvYlN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmNmOTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL0pvYlN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5EZXNjcmliZSB5b3VyIGNsYXNzIGhlcmU8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEpvYlN0YXR1cyB7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVVRUQgPSAiX19RdWV1ZWRfXyI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVDVVRFRCA9ICJfX0V4ZWN1dGVkX18iOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRURVTEVEID0gIl9fU2NoZWR1bGVkX18iOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTUyA9ICJfX1N1Y2Nlc3NfXyI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFID0gIl9fRmFpbHVyZV9fIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtJTExFRCA9ICJfX0tpbGxlZF9fIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9OYW1lVmFsdWVKb2JJbnB1dC5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9OYW1lVmFsdWVKb2JJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmNiN2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL05hbWVWYWx1ZUpvYklucHV0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEge0BsaW5rIEpvYklucHV0fSBiYWNrZWQgYnkgYSB7QGxpbmsgUHJvcGVydGllc30gb2JqZWN0IG9mIE5hbWVWYWx1ZSBwYWlycy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lVmFsdWVKb2JJbnB1dCBpbXBsZW1lbnRzIEpvYklucHV0IHsKKworICAvKiBvdXIgcHJvcGVydGllcyBvYmplY3QgKi8KKyAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKworICAvKiBpbnB1dCBpZCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfSUQgPSAiTmFtZVZhbElucHV0IjsKKworICAvKioKKyAgICogRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBOYW1lVmFsdWVKb2JJbnB1dCgpIHsKKyAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXROYW1lVmFsdWVQYWlyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICBwcm9wcy5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KG5hbWUpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQjZ2V0SWQoKQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gSU5QVVRfSUQ7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5YbWxScGNXcml0ZWFibGUjcmVhZChqYXZhLmxhbmcuT2JqZWN0KQorICAgKi8KKyAgcHVibGljIHZvaWQgcmVhZChPYmplY3QgaW4pIHsKKyAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHJlYWRpbmcgaW4KKyAgICAvLyBhIGphdmEudXRpbC5IYXNodGFibGUKKyAgICAvLyBpZiBub3QgdGhlbiBqdXN0IHJldHVybgorICAgIGlmICghKGluIGluc3RhbmNlb2YgSGFzaHRhYmxlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhhc2h0YWJsZSByZWFkYWJsZSA9IChIYXNodGFibGUpIGluOworICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlYWRhYmxlLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcmVhZGFibGUuZ2V0KGtleSk7CisgICAgICB0aGlzLnByb3BzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuWG1sUnBjV3JpdGVhYmxlI3dyaXRlKCkKKyAgICovCisgIHB1YmxpYyBPYmplY3Qgd3JpdGUoKSB7CisgICAgSGFzaHRhYmxlIHdyaXRlYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICBTdHJpbmcgdmFsID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgd3JpdGVhYmxlLnB1dChrZXksIHZhbCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdyaXRlYWJsZTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUoamF2YS51dGlsLlByb3BlcnRpZXMpCisgICAqLworICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUHJvcGVydGllcyBwcm9wcykgeworICAgIGlmIChwcm9wcyAhPSBudWxsKSB7CisgICAgICB0aGlzLnByb3BzID0gcHJvcHM7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvUmVzb3VyY2VOb2RlLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL1Jlc291cmNlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzM1ODYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL1Jlc291cmNlTm9kZS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzOworCisvL0pBVkEgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBub2RlIHN0cnVjdCB0byBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVzb3VyY2UuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTm9kZSB7CisJCisJcHJpdmF0ZSBTdHJpbmcgbm9kZUlkID0gbnVsbDsKKwlwcml2YXRlIFVSTCBpcEFkZHIgPSBudWxsOworCXByaXZhdGUgaW50IGNhcGFjaXR5ID0gMDsKKwkKKwlwdWJsaWMgUmVzb3VyY2VOb2RlKCl7fQorCQorCXB1YmxpYyBSZXNvdXJjZU5vZGUoU3RyaW5nIG5vZGVJZCwgVVJMIGlwQWRkciwgaW50IGNhcGFjaXR5KXsKKwkJdGhpcy5ub2RlSWQ9bm9kZUlkOworCQl0aGlzLmlwQWRkcj1pcEFkZHI7CisJCXRoaXMuY2FwYWNpdHk9Y2FwYWNpdHk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUlkKCl7CisJCXJldHVybiBub2RlSWQ7CisJfQorCQorCXB1YmxpYyBVUkwgZ2V0SXBBZGRyKCl7CisJCXJldHVybiBpcEFkZHI7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0Q2FwYWNpdHkoKXsKKwkJcmV0dXJuIGNhcGFjaXR5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbm9kZUlkKXsKKwkJdGhpcy5ub2RlSWQgPSBub2RlSWQ7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldElwQWRkcihVUkwgaXBBZGRyKXsKKwkJdGhpcy5pcEFkZHIgPSBpcEFkZHI7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldENhcGFjaXR5KGludCBjYXBhY2l0eSl7CisJCXRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvSm9iRXhjZXB0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvSm9iRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1M2MxNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUaGUgYmFzZSBjbGFzcyBmb3IgSm9iIEV4Y2VwdGlvbnMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBKb2JFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJLyogc2VyaWFsIHZlcnNpb24gVUlEICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDgwMjM1MzU3NDU0NTIzMDE4Mkw7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgSm9iRXhjZXB0aW9uKCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYXJnMAorCSAqLworCXB1YmxpYyBKb2JFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIEpvYkV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyoqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiBAcGFyYW0gY2F1c2UKKwkgKi8KKwlwdWJsaWMgSm9iRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JFeGVjdXRpb25FeGNlcHRpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JFeGVjdXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZmMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9leGNlcHRpb25zL0pvYkV4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD5FeGNlcHRpb24gdGhyb3duIHdoZW4gZXhlY3V0aW5nIGEge0BsaW5rIEpvYn0uPC9wPgorICovCitwdWJsaWMgY2xhc3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIGV4dGVuZHMgSm9iRXhjZXB0aW9uIHsKKworCS8qIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQxMTQxNTY1NjQxMjE3MzQ5MEw7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgSm9iRXhlY3V0aW9uRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqIEBwYXJhbSBjYXVzZQorCSAqLworCXB1YmxpYyBKb2JFeGVjdXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyoqCisJICogQHBhcmFtIGFyZzAKKwkgKi8KKwlwdWJsaWMgSm9iRXhlY3V0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JJbnB1dEV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9leGNlcHRpb25zL0pvYklucHV0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1NjY0NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JJbnB1dEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB7QGxpbmsgSm9iSW5zdGFuY2V9CisgKiB3aGVuIHRoZSBnaXZlbiB7QGxpbmsgSm9iSW5wdXR9IGlzIG5vdCB3aGF0IGl0CisgKiBleHBlY3RlZDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBKb2JJbnB1dEV4Y2VwdGlvbiBleHRlbmRzIEpvYkV4Y2VwdGlvbiB7CisKKyAgLyogdGhlIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjczMjExMDk2MzI0ODk5MTQ4TDsKKworICAvKioKKyAgICogCisgICAqLworICBwdWJsaWMgSm9iSW5wdXRFeGNlcHRpb24oKSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGFyZzAKKyAgICovCisgIHB1YmxpYyBKb2JJbnB1dEV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgeworICAgIHN1cGVyKGFyZzApOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBhcmcwCisgICAqLworICBwdWJsaWMgSm9iSW5wdXRFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKKyAgICBzdXBlcihhcmcwKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbWVzc2FnZQorICAgKiBAcGFyYW0gY2F1c2UKKyAgICovCisgIHB1YmxpYyBKb2JJbnB1dEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JRdWV1ZUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9leGNlcHRpb25zL0pvYlF1ZXVlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjNmE0YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Kb2JRdWV1ZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSAKKyAqIHtAbGluayBKb2JRdWV1ZX1pbmcgc3Vic3lzdGVtLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIEpvYlF1ZXVlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAvKiBzZXJpYWwgdmVyc2lvbiBVSUQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI5NzE1MzM4MjMwNDUyMjkyNEw7CisKKyAgLyoqCisgICAqIAorICAgKi8KKyAgcHVibGljIEpvYlF1ZXVlRXhjZXB0aW9uKCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBhcmcwCisgICAqLworICBwdWJsaWMgSm9iUXVldWVFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKyAgICBzdXBlcihhcmcwKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXJnMAorICAgKi8KKyAgcHVibGljIEpvYlF1ZXVlRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7CisgICAgc3VwZXIoYXJnMCk7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGFyZzAKKyAgICogQHBhcmFtIGFyZzEKKyAgICovCisgIHB1YmxpYyBKb2JRdWV1ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKKyAgICBzdXBlcihhcmcwLCBhcmcxKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9leGNlcHRpb25zL0pvYlJlcG9zaXRvcnlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y0NGNjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9leGNlcHRpb25zL0pvYlJlcG9zaXRvcnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBleGNlcHRpb24gdGhyb3duIHdoZW4gcGVyc2lzdGluZyBhIHtAbGluayBKb2J9IHRvIGEge0BsaW5rIEpvYlJlcG9zaXRvcnl9LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgIC8qIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NDMxMzM4MTI1NjU5NzA0NjgwTDsKKworICAvKioKKyAgICogCisgICAqLworICBwdWJsaWMgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbigpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXJnMAorICAgKi8KKyAgcHVibGljIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKyAgICBzdXBlcihhcmcwKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXJnMAorICAgKi8KKyAgcHVibGljIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKKyAgICBzdXBlcihhcmcwKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXJnMAorICAgKiBAcGFyYW0gYXJnMQorICAgKi8KKyAgcHVibGljIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7CisgICAgc3VwZXIoYXJnMCwgYXJnMSk7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9leGNlcHRpb25zL01vbml0b3JFeGNlcHRpb24uamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Nb25pdG9yRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0YTE2ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9Nb25pdG9yRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+QW4gRXhjZXB0aW9uIHRocm93biBieSB0aGUge0BsaW5rIE1vbml0b3J9aW5nCisgKiBmcmFtZXdvcms8L3A+LgorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgLyogdGhlIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MjY5OTM4Nzk2NDU0OTczMjBMOworCisgIC8qKgorICAgKiAKKyAgICovCisgIHB1YmxpYyBNb25pdG9yRXhjZXB0aW9uKCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBhcmcwCisgICAqLworICBwdWJsaWMgTW9uaXRvckV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgeworICAgIHN1cGVyKGFyZzApOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBhcmcwCisgICAqLworICBwdWJsaWMgTW9uaXRvckV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgeworICAgIHN1cGVyKGFyZzApOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBhcmcwCisgICAqIEBwYXJhbSBhcmcxCisgICAqLworICBwdWJsaWMgTW9uaXRvckV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKKyAgICBzdXBlcihhcmcwLCBhcmcxKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUXVldWVNYW5hZ2VyRXhjZXB0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUXVldWVNYW5hZ2VyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2YmQ4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9RdWV1ZU1hbmFnZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkFuIEV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHtAbGluayBRdWV1ZU1hbmFnZXJ9PC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzAyOTkxOTQ5OTU3ODQxNjE0N0w7CisKKwlwdWJsaWMgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24oU3RyaW5nIG1zZykgeworCQlzdXBlcihtc2cpOworCX0KKworCXB1YmxpYyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworCQlzdXBlcih0aHJvd2FibGUpOworCX0KKworCXB1YmxpYyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCQlzdXBlcihtc2csIHRocm93YWJsZSk7CisJfQorCit9CisKZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9SZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyY2U4MjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHtAbGluayBCYWNrZW5kUmVwb3NpdG9yeX0gd2hlbiBhbiBlcnJvciBvY2N1cnMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvc2l0b3J5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAvKiBzZXJpYWwgdmVyc2lvbiBVSUQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDU2ODI2MTEyNjI5MDU4OTI2OUw7CisKKyAgLyoqCisgICAqCisgICAqLworICBwdWJsaWMgUmVwb3NpdG9yeUV4Y2VwdGlvbigpIHt9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtZXNzYWdlCisgICAqLworICBwdWJsaWMgUmVwb3NpdG9yeUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjYXVzZQorICAgKi8KKyAgcHVibGljIFJlcG9zaXRvcnlFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtZXNzYWdlCisgICAqIEBwYXJhbSBjYXVzZQorICAgKi8KKyAgcHVibGljIFJlcG9zaXRvcnlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvU2NoZWR1bGVyRXhjZXB0aW9uLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvU2NoZWR1bGVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzYTg5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9TY2hlZHVsZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBbiBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB7QGxpbmsgU2NoZWR1bGVyfSB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIFNjaGVkdWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgLyogc2VyaWFsIHZlcnNpb24gVUlEICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ1NjgyNjExMjYyOTA1ODkyNjlMOworCisgIC8qKgorICAgKiAKKyAgICovCisgIHB1YmxpYyBTY2hlZHVsZXJFeGNlcHRpb24oKSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICovCisgIHB1YmxpYyBTY2hlZHVsZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY2F1c2UKKyAgICovCisgIHB1YmxpYyBTY2hlZHVsZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtZXNzYWdlCisgICAqIEBwYXJhbSBjYXVzZQorICAgKi8KKyAgcHVibGljIFNjaGVkdWxlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N5c3RlbS9YbWxScGNSZXNvdXJjZU1hbmFnZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N5c3RlbS9YbWxScGNSZXNvdXJjZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDM0ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3lzdGVtL1htbFJwY1Jlc291cmNlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JRdWV1ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUXVldWVNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlNjaGVkdWxlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLlJlc291cmNlTm9kZUNvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLlhtbFJwY1N0cnVjdEZhY3Rvcnk7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5XZWJTZXJ2ZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQGF1dGhvciB3b29sbGFyZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIFhNTCBSUEMtYmFzZWQgUmVzb3VyY2UgbWFuYWdlci4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyIHsKKworICAgIC8qIHRoZSBwb3J0IHRvIHJ1biB0aGUgWE1MIFJQQyB3ZWIgc2VydmVyIG9uLCBkZWZhdWx0IGlzIDIwMDAgKi8KKyAgICBwcml2YXRlIGludCB3ZWJTZXJ2ZXJQb3J0ID0gMjAwMDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKFhtbFJwY1Jlc291cmNlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyogb3VyIHhtbCBycGMgd2ViIHNlcnZlciAqLworICAgIHByaXZhdGUgV2ViU2VydmVyIHdlYlNlcnZlciA9IG51bGw7CisKKyAgICAvKiBvdXIgc2NoZWR1bGVyICovCisgICAgcHJpdmF0ZSBTY2hlZHVsZXIgc2NoZWR1bGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBYbWxScGNSZXNvdXJjZU1hbmFnZXIoaW50IHBvcnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBsb2FkIHByb3BlcnRpZXMgZnJvbSB3b3JrZmxvdyBtYW5hZ2VyIHByb3BlcnRpZXMgZmlsZSwgaWYgc3BlY2lmaWVkCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UucHJvcGVydGllcyIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gU3lzdGVtCisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICJMb2FkaW5nIFJlc291cmNlIE1hbmFnZXIgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIGZyb206IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlICsgIl0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShjb25maWdGaWxlKSkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHNjaGVkdWxlckNsYXNzU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJyZXNvdXJjZS5zY2hlZHVsZXIuZmFjdG9yeSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLkxSVVNjaGVkdWxlckZhY3RvcnkiKTsKKworICAgICAgICBzY2hlZHVsZXIgPSBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRTY2hlZHVsZXJTZXJ2aWNlRnJvbUZhY3Rvcnkoc2NoZWR1bGVyQ2xhc3NTdHIpOworCisgICAgICAgIC8vIHN0YXJ0IHVwIHRoZSBzY2hlZHVsZXIKKyAgICAgICAgbmV3IFRocmVhZChzY2hlZHVsZXIpLnN0YXJ0KCk7CisKKyAgICAgICAgd2ViU2VydmVyUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgLy8gc3RhcnQgdXAgdGhlIHdlYiBzZXJ2ZXIKKyAgICAgICAgd2ViU2VydmVyID0gbmV3IFdlYlNlcnZlcih3ZWJTZXJ2ZXJQb3J0KTsKKyAgICAgICAgd2ViU2VydmVyLmFkZEhhbmRsZXIoInJlc291cmNlbWdyIiwgdGhpcyk7CisgICAgICAgIHdlYlNlcnZlci5zdGFydCgpOworCisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlJlc291cmNlIE1hbmFnZXIgc3RhcnRlZCBieSAiCisgICAgICAgICAgICAgICAgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIsICJ1bmtub3duIikpOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBKb2JzIGluIEpvYlF1ZXVlCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgSm9icyBpbiBKb2JRdWV1ZQorICAgICAqIEB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiBPbiBBbnkgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKb2JRdWV1ZVNpemUoKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgCXRyeSB7CisgICAgCQlyZXR1cm4gdGhpcy5zY2hlZHVsZXIuZ2V0Sm9iUXVldWUoKS5nZXRTaXplKCk7CisgICAgCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAJCXRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHNpemUgb2YgSm9iUXVldWUgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgIAl9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1heCBudW1iZXIgb2YgSm9icyBhbGxvd2VkIGluIEpvYlF1ZXVlCisgICAgICogQHJldHVybiBNYXggbnVtYmVyIG9mIEpvYnMKKyAgICAgKiBAdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb24gT24gQW55IEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Sm9iUXVldWVDYXBhY2l0eSgpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAJdHJ5IHsKKyAgICAJCXJldHVybiB0aGlzLnNjaGVkdWxlci5nZXRKb2JRdWV1ZSgpLmdldENhcGFjaXR5KCk7CisgICAgCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAJCXRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGNhcGFjaXR5IG9mIEpvYlF1ZXVlIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAJfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSm9iQ29tcGxldGUoU3RyaW5nIGpvYklkKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIEpvYlNwZWMgc3BlYyA9IHNjaGVkdWxlci5nZXRKb2JRdWV1ZSgpLmdldEpvYlJlcG9zaXRvcnkoKS5nZXRKb2JCeUlkKAorICAgICAgICAgICAgICAgIGpvYklkKTsKKyAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5nZXRKb2JRdWV1ZSgpLmdldEpvYlJlcG9zaXRvcnkoKS5qb2JGaW5pc2hlZChzcGVjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEpvYkluZm8oU3RyaW5nIGpvYklkKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIEpvYlNwZWMgc3BlYyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNwZWMgPSBzY2hlZHVsZXIuZ2V0Sm9iUXVldWUoKS5nZXRKb2JSZXBvc2l0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEpvYkJ5SWQoam9iSWQpOworICAgICAgICB9IGNhdGNoIChKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBjb21tdW5pY2F0aW5nIHdpdGggam9iIHJlcG9zaXRvcnkgZm9yIGpvYjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGpvYklkICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCBqb2I6IFsiICsgam9iSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiXSBmcm9tIHJlcG9zaXRvcnkhIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNKb2Ioc3BlYy5nZXRKb2IoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIEhhc2h0YWJsZSBqb2JJbikKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBqb2JJbik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIGludCBqb2JJbikKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBuZXcgSW50ZWdlcihqb2JJbikpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlSm9iKEhhc2h0YWJsZSBqb2JIYXNoLCBib29sZWFuIGpvYkluKQorICAgICAgICAgICAgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljSGFuZGxlSm9iKGpvYkhhc2gsIG5ldyBCb29sZWFuKGpvYkluKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIFN0cmluZyBqb2JJbikKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBqb2JJbik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIGRvdWJsZSBqb2JJbikKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBuZXcgRG91YmxlKGpvYkluKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIERhdGUgam9iSW4pCisgICAgICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNIYW5kbGVKb2Ioam9iSGFzaCwgam9iSW4pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlSm9iKEhhc2h0YWJsZSBqb2JIYXNoLCBWZWN0b3Igam9iSW4pCisgICAgICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNIYW5kbGVKb2Ioam9iSGFzaCwgam9iSW4pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlSm9iKEhhc2h0YWJsZSBqb2JIYXNoLCBieXRlW10gam9iSW4pCisgICAgICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNIYW5kbGVKb2Ioam9iSGFzaCwgam9iSW4pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUpvYihIYXNodGFibGUgam9iSGFzaCwgSGFzaHRhYmxlIGpvYkluLCBTdHJpbmcgdXJsU3RyKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljSGFuZGxlSm9iKGpvYkhhc2gsIGpvYkluLCB1cmxTdHIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUpvYihIYXNodGFibGUgam9iSGFzaCwgaW50IGpvYkluLCBTdHJpbmcgdXJsU3RyKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljSGFuZGxlSm9iKGpvYkhhc2gsIG5ldyBJbnRlZ2VyKGpvYkluKSwgdXJsU3RyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIGJvb2xlYW4gam9iSW4sIFN0cmluZyB1cmxTdHIpCisgICAgICAgICAgICB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNIYW5kbGVKb2Ioam9iSGFzaCwgbmV3IEJvb2xlYW4oam9iSW4pLCB1cmxTdHIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUpvYihIYXNodGFibGUgam9iSGFzaCwgU3RyaW5nIGpvYkluLCBTdHJpbmcgdXJsU3RyKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljSGFuZGxlSm9iKGpvYkhhc2gsIGpvYkluLCB1cmxTdHIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUpvYihIYXNodGFibGUgam9iSGFzaCwgZG91YmxlIGpvYkluLCBTdHJpbmcgdXJsU3RyKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljSGFuZGxlSm9iKGpvYkhhc2gsIG5ldyBEb3VibGUoam9iSW4pLCB1cmxTdHIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUpvYihIYXNodGFibGUgam9iSGFzaCwgRGF0ZSBqb2JJbiwgU3RyaW5nIHVybFN0cikKKyAgICAgICAgICAgIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBqb2JJbiwgdXJsU3RyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIFZlY3RvciBqb2JJbiwgU3RyaW5nIHVybFN0cikKKyAgICAgICAgICAgIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBqb2JJbiwgdXJsU3RyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIGJ5dGVbXSBqb2JJbiwgU3RyaW5nIHVybFN0cikKKyAgICAgICAgICAgIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2VuZXJpY0hhbmRsZUpvYihqb2JIYXNoLCBqb2JJbiwgdXJsU3RyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXROb2RlcygpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCByZXNOb2RlcyA9IHNjaGVkdWxlci5nZXRNb25pdG9yKCkuZ2V0Tm9kZXMoKTsKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUmVzb3VyY2VOb2RlTGlzdChyZXNOb2Rlcyk7CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXROb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIFJlc291cmNlTm9kZSBub2RlID0gc2NoZWR1bGVyLmdldE1vbml0b3IoKS5nZXROb2RlQnlJZChub2RlSWQpOworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNSZXNvdXJjZU5vZGUobm9kZSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBraWxsSm9iKFN0cmluZyBqb2JJZCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzTm9kZUlkID0gc2NoZWR1bGVyLmdldEJhdGNobWdyKCkuZ2V0RXhlY3V0aW9uTm9kZShqb2JJZCk7CisgICAgICAgIGlmIChyZXNOb2RlSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQXR0ZW1wdCB0byBraWxsIGpvYjogWyIgKyBqb2JJZAorICAgICAgICAgICAgICAgICAgICArICJdOiBjYW5ub3QgZmluZCBleGVjdXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIChoYXMgdGhlIGpvYiBhbHJlYWR5IGZpbmlzaGVkPykiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZSA9IHNjaGVkdWxlci5nZXRNb25pdG9yKCkuZ2V0Tm9kZUJ5SWQocmVzTm9kZUlkKTsKKyAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5nZXRCYXRjaG1ncigpLmtpbGxKb2Ioam9iSWQsIG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0aW9uTm9kZShTdHJpbmcgam9iSWQpIHsKKyAgICAgICAgU3RyaW5nIGV4ZWNOb2RlID0gc2NoZWR1bGVyLmdldEJhdGNobWdyKCkuZ2V0RXhlY3V0aW9uTm9kZShqb2JJZCk7CisgICAgICAgIGlmIChleGVjTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJKb2I6IFsiICsgam9iSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiXSBub3QgY3VycmVudGx5IGV4ZWN1dGluZyBvbiBhbnkga25vd24gbm9kZSIpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBleGVjTm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFF1ZXVlcygpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgIAlyZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KHRoaXMuc2NoZWR1bGVyLmdldFF1ZXVlTWFuYWdlcigpLmdldFF1ZXVlcygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gYWRkUXVldWUoU3RyaW5nIHF1ZXVlTmFtZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgCXRoaXMuc2NoZWR1bGVyLmdldFF1ZXVlTWFuYWdlcigpLmFkZFF1ZXVlKHF1ZXVlTmFtZSk7CisgICAgCXJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVRdWV1ZShTdHJpbmcgcXVldWVOYW1lKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAJdGhpcy5zY2hlZHVsZXIuZ2V0UXVldWVNYW5hZ2VyKCkucmVtb3ZlUXVldWUocXVldWVOYW1lKTsKKyAgICAJcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFkZE5vZGUoSGFzaHRhYmxlIGhhc2hOb2RlKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgCXRoaXMuc2NoZWR1bGVyLmdldE1vbml0b3IoKS5hZGROb2RlKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UmVzb3VyY2VOb2RlRnJvbVhtbFJwYyhoYXNoTm9kZSkpOworICAgIAlyZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTm9kZShTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgCXRyeXsKKwkgICAgCWZvcihTdHJpbmcgcXVldWVOYW1lOiB0aGlzLmdldFF1ZXVlc1dpdGhOb2RlKG5vZGVJZCkpeworCSAgICAJCXRoaXMucmVtb3ZlTm9kZUZyb21RdWV1ZShub2RlSWQsIHF1ZXVlTmFtZSk7CisJICAgIAl9CisJICAgIAl0aGlzLnNjaGVkdWxlci5nZXRNb25pdG9yKCkucmVtb3ZlTm9kZUJ5SWQobm9kZUlkKTsKKyAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAJCXRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAJfQorICAgIAkKKyAgICAJcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFkZE5vZGVUb1F1ZXVlKFN0cmluZyBub2RlSWQsIFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgIAl0aGlzLnNjaGVkdWxlci5nZXRRdWV1ZU1hbmFnZXIoKS5hZGROb2RlVG9RdWV1ZShub2RlSWQsIHF1ZXVlTmFtZSk7CisgICAgCXJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOb2RlRnJvbVF1ZXVlKFN0cmluZyBub2RlSWQsIFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgIAl0aGlzLnNjaGVkdWxlci5nZXRRdWV1ZU1hbmFnZXIoKS5yZW1vdmVOb2RlRnJvbVF1ZXVlKG5vZGVJZCwgcXVldWVOYW1lKTsKKyAgICAJcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Tm9kZXNJblF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgIAlyZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KHRoaXMuc2NoZWR1bGVyLmdldFF1ZXVlTWFuYWdlcigpLmdldE5vZGVzKHF1ZXVlTmFtZSkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFF1ZXVlc1dpdGhOb2RlKFN0cmluZyBub2RlSWQpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgIAlyZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KHRoaXMuc2NoZWR1bGVyLmdldFF1ZXVlTWFuYWdlcigpLmdldFF1ZXVlcyhub2RlSWQpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gc2h1dGRvd24oKXsKKyAgICAgIGlmICh0aGlzLndlYlNlcnZlciAhPSBudWxsKSB7CisgICAgICAgIHRoaXMud2ViU2VydmVyLnNodXRkb3duKCk7CisgICAgICAgIHRoaXMud2ViU2VydmVyID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlTG9hZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbnsKKyAgICAJUmVzb3VyY2VOb2RlIG5vZGUgPSB0aGlzLnNjaGVkdWxlci5nZXRNb25pdG9yKCkuZ2V0Tm9kZUJ5SWQobm9kZUlkKTsKKyAgICAJaW50IGNhcGFjaXR5ID0gbm9kZS5nZXRDYXBhY2l0eSgpOworICAgIAlpbnQgbG9hZCA9ICh0aGlzLnNjaGVkdWxlci5nZXRNb25pdG9yKCkuZ2V0TG9hZChub2RlKSkgKiAtMSArIGNhcGFjaXR5OworICAgIAlyZXR1cm4gbG9hZCArICIvIiArIGNhcGFjaXR5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdCBnZXRRdWV1ZWRKb2JzKCkgdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9ueworICAgIAlWZWN0b3Igam9icyA9IG5ldyBWZWN0b3IoKTsKKyAgICAJTGlzdCBqb2JTcGVjcyA9IHRoaXMuc2NoZWR1bGVyLmdldEpvYlF1ZXVlKCkuZ2V0UXVldWVkSm9icygpOworICAgIAkKKyAgICAJaWYoam9iU3BlY3MgIT0gbnVsbCAmJiBqb2JTcGVjcy5zaXplKCkgPiAwKXsKKyAgICAJCWZvcihJdGVyYXRvciBpID0gam9iU3BlY3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKKyAgICAJCQlKb2Igam9iID0gKChKb2JTcGVjKWkubmV4dCgpKS5nZXRKb2IoKTsKKyAgICAJCQlqb2JzLmFkZChqb2IpOworICAgIAkJfQorICAgIAl9CisgICAgCQorICAgIAlyZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNKb2JMaXN0KGpvYnMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVSZXBvcnQoKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbnsKKyAgICAJU3RyaW5nIHJlcG9ydCA9IG5ldyBTdHJpbmcoKTsKKyAgICAJCisgICAgCXRyeXsKKyAgICAJCQorICAgIAkJLy8gZ2V0IGEgc29ydGVkIGxpc3Qgb2Ygbm9kZXMKKyAgICAJCUxpc3Qgbm9kZXMgPSBzY2hlZHVsZXIuZ2V0TW9uaXRvcigpLmdldE5vZGVzKCk7CisgICAgCQlDb2xsZWN0aW9ucy5zb3J0KG5vZGVzLCBuZXcgUmVzb3VyY2VOb2RlQ29tcGFyYXRvcigpKTsKKyAgICAJCQorICAgIAkJLy8gZm9ybXVsYXRlIHRoZSByZXBvcnQgc3RyaW5nCisgICAgCQlmb3IoSXRlcmF0b3IgaSA9IG5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgIAkJCVJlc291cmNlTm9kZSBub2RlID0gKFJlc291cmNlTm9kZSlpLm5leHQoKTsKKyAgICAJCQlTdHJpbmcgbm9kZUlkID0gbm9kZS5nZXROb2RlSWQoKTsKKyAgICAJCQlyZXBvcnQgKz0gbm9kZUlkOworICAgIAkJCXJlcG9ydCArPSAiICgiICsgZ2V0Tm9kZUxvYWQobm9kZUlkKSArICIvIiArIG5vZGUuZ2V0Q2FwYWNpdHkoKSArICIpIjsKKyAgICAJCQlMaXN0PFN0cmluZz4gbm9kZVF1ZXVlcyA9IGdldFF1ZXVlc1dpdGhOb2RlKG5vZGVJZCk7CisgICAgCQkJaWYobm9kZVF1ZXVlcyAhPSBudWxsICYmIG5vZGVRdWV1ZXMuc2l6ZSgpID4gMCl7CisgICAgCQkJCXJlcG9ydCArPSAiIC0tICIgKyBub2RlUXVldWVzLmdldCgwKTsKKyAgICAJCQkJZm9yKGludCBqID0gMTsgaiA8IG5vZGVRdWV1ZXMuc2l6ZSgpOyBqKyspeworICAgIAkJCQkJcmVwb3J0ICs9ICIsICIgKyBub2RlUXVldWVzLmdldChqKTsKKyAgICAJCQkJfQorICAgIAkJCX0KKyAgICAJCQlyZXBvcnQgKz0gIlxuIjsKKyAgICAJCX0KKyAgICAJCisgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7CisgICAgCQl0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgCX0KKyAgICAJCisgICAgCXJldHVybiByZXBvcnQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0aW9uUmVwb3J0KCkgdGhyb3dzIEpvYlJlcG9zaXRvcnlFeGNlcHRpb257CisgICAgCVN0cmluZyByZXBvcnQgPSBuZXcgU3RyaW5nKCk7CisgICAgCQorICAgIAl0cnl7CisgICAgCQorCSAgICAJLy8gZ2V0IGEgc29ydGVkIGxpc3Qgb2YgYWxsIG5vZGVzLCBzaW5jZSB0aGUgcmVwb3J0IHNob3VsZCBiZQorCSAgICAJLy8gYWxwaGFiZXRpY2FsbHkgc29ydGVkIGJ5IG5vZGUKKwkgICAgCUxpc3QgcmVzTm9kZXMgPSBzY2hlZHVsZXIuZ2V0TW9uaXRvcigpLmdldE5vZGVzKCk7CisJICAgIAlpZihyZXNOb2Rlcy5zaXplKCkgPT0gMCl7CisJICAgIAkJdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oCisJICAgIAkJCQkiTm8gam9icyBjYW4gYmUgZXhlY3V0aW5nLCBhcyB0aGVyZSBhcmUgbm8gbm9kZXMgaW4gdGhlIE1vbml0b3IiKTsKKwkgICAgCX0KKwkgICAgCVZlY3RvcjxTdHJpbmc+IG5vZGVJZHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKwkgICAgCWZvcihJdGVyYXRvciBpID0gcmVzTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJICAgIAkJbm9kZUlkcy5hZGQoKChSZXNvdXJjZU5vZGUpaS5uZXh0KCkpLmdldE5vZGVJZCgpKTsKKwkgICAgCX0KKwkgICAgCUNvbGxlY3Rpb25zLnNvcnQobm9kZUlkcyk7CisJICAgIAkKKwkgICAgCS8vIGdlbmVyYXRlIHRoZSByZXBvcnQgc3RyaW5nCisJICAgIAlmb3IoU3RyaW5nIG5vZGVJZDogbm9kZUlkcyl7CisJICAgIAkJTGlzdCBleGVjSm9iSWRzID0gdGhpcy5zY2hlZHVsZXIuZ2V0QmF0Y2htZ3IoKS5nZXRKb2JzT25Ob2RlKG5vZGVJZCk7CisJICAgIAkJaWYoZXhlY0pvYklkcyAhPSBudWxsICYmIGV4ZWNKb2JJZHMuc2l6ZSgpID4gMCl7CisJICAgIAkJCWZvcihJdGVyYXRvciBpID0gZXhlY0pvYklkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkgICAgCQkJCVN0cmluZyBqb2JJZCA9IChTdHJpbmcpaS5uZXh0KCk7CisJICAgIAkJCQlKb2Igam9iID0gc2NoZWR1bGVyLmdldEpvYlF1ZXVlKCkuZ2V0Sm9iUmVwb3NpdG9yeSgpCisJICAgIAkJCQkJCS5nZXRKb2JCeUlkKGpvYklkKS5nZXRKb2IoKTsKKwkgICAgCQkJCXJlcG9ydCArPSAiam9iIGlkPSIgKyBqb2JJZDsKKwkgICAgCQkJCXJlcG9ydCArPSAiLCBsb2FkPSIgKyBqb2IuZ2V0TG9hZFZhbHVlKCk7CisJICAgIAkJCQlyZXBvcnQgKz0gIiwgbm9kZT0iICsgbm9kZUlkOworCSAgICAJCQkJcmVwb3J0ICs9ICIsIHF1ZXVlPSIgKyBqb2IuZ2V0UXVldWVOYW1lKCkgKyAiXG4iOworCSAgICAJCQl9CisJICAgIAkJfQorCSAgICAJfQorICAgIAkKKyAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAJCXRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAJfQorICAgIAkKKyAgICAJcmV0dXJuIHJlcG9ydDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBwb3J0TnVtID0gLTE7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJYbWxScGNSZXNvdXJjZU1hbmFnZXIgLS1wb3J0TnVtIDxwb3J0IG51bWJlciBmb3IgeG1sIHJwYyBzZXJ2aWNlPlxuIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLS1wb3J0TnVtIikpIHsKKyAgICAgICAgICAgICAgICBwb3J0TnVtID0gSW50ZWdlci5wYXJzZUludChhcmdzWysraV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnROdW0gPT0gLTEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFJwY1Jlc291cmNlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFhtbFJwY1Jlc291cmNlTWFuYWdlcihwb3J0TnVtKTsKKworICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXROb2RlQ2FwYWNpdHkoU3RyaW5nIG5vZGVJZCwgaW50IGNhcGFjaXR5KXsKKyAgICAJdHJ5eworICAgIAkJdGhpcy5zY2hlZHVsZXIuZ2V0TW9uaXRvcigpLmdldE5vZGVCeUlkKG5vZGVJZCkuc2V0Q2FwYWNpdHkoY2FwYWNpdHkpOworICAgIAl9Y2F0Y2ggKE1vbml0b3JFeGNlcHRpb24gZSl7CisgICAgCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gc2V0dGluZyBjYXBhY2l0eSBvbiBub2RlICIKKyAgICAJCQkJKyBub2RlSWQgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIAkJcmV0dXJuIGZhbHNlOworICAgIAl9CisgICAgCXJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyaWNIYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIE9iamVjdCBqb2JJbikKKyAgICAgICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworCisgICAgICAgIEpvYiBleGVjID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRKb2JGcm9tWG1sUnBjKGpvYkhhc2gpOworICAgICAgICBKb2JJbnB1dCBpbiA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldEpvYklucHV0RnJvbUNsYXNzTmFtZShleGVjLmdldEpvYklucHV0Q2xhc3NOYW1lKCkpOworICAgICAgICBpbi5yZWFkKGpvYkluKTsKKworICAgICAgICBKb2JTcGVjIHNwZWMgPSBuZXcgSm9iU3BlYyhpbiwgZXhlYyk7CisKKyAgICAgICAgLy8gcXVldWUgdGhlIGpvYiB1cAorICAgICAgICBTdHJpbmcgam9iSWQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqb2JJZCA9IHNjaGVkdWxlci5nZXRKb2JRdWV1ZSgpLmFkZEpvYihzcGVjKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iUXVldWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiSm9iUXVldWUgZXhjZXB0aW9uIGFkZGluZyBqb2I6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZWR1bGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam9iSWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyaWNIYW5kbGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIE9iamVjdCBqb2JJbiwKKyAgICAgICAgICAgIFN0cmluZyB1cmxTdHIpIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBKb2IgZXhlYyA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0Sm9iRnJvbVhtbFJwYyhqb2JIYXNoKTsKKyAgICAgICAgSm9iSW5wdXQgaW4gPSBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRKb2JJbnB1dEZyb21DbGFzc05hbWUoZXhlYy5nZXRKb2JJbnB1dENsYXNzTmFtZSgpKTsKKyAgICAgICAgaW4ucmVhZChqb2JJbik7CisKKyAgICAgICAgSm9iU3BlYyBzcGVjID0gbmV3IEpvYlNwZWMoaW4sIGV4ZWMpOworCisgICAgICAgIFVSTCByZW1vdGVVcmwgPSBzYWZlR2V0VXJsRnJvbVN0cmluZyh1cmxTdHIpOworICAgICAgICBSZXNvdXJjZU5vZGUgcmVtb3RlTm9kZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlbW90ZU5vZGUgPSBzY2hlZHVsZXIuZ2V0TW9uaXRvcigpLmdldE5vZGVCeVVSTChyZW1vdGVVcmwpOworICAgICAgICB9IGNhdGNoIChNb25pdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdGVOb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuZ2V0QmF0Y2htZ3IoKS5leGVjdXRlUmVtb3RlbHkoc3BlYywgcmVtb3RlTm9kZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgVVJMIHNhZmVHZXRVcmxGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHIpIHsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGNvbnZlcnRpbmcgc3RyaW5nOiBbIiArIHVybFN0cgorICAgICAgICAgICAgICAgICAgICArICJdIHRvIFVSTCBvYmplY3Q6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdXJsOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N5c3RlbS9YbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N5c3RlbS9YbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzJmYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3lzdGVtL1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuQ29tbW9uc1htbFJwY1RyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxycGMuWG1sUnBjQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY0V4Y2VwdGlvbjsKKworLy9PT0RUaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLkNtZExpbmVVdGlsaXR5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iUXVldWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuWG1sUnBjU3RydWN0RmFjdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGhlIFhNTCBSUEMgYmFzZWQgcmVzb3VyY2UgbWFuYWdlciBjbGllbnQuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCB7CisKKyAgICAvKiBvdXIgeG1sIHJwYyBjbGllbnQgKi8KKyAgICBwcml2YXRlIFhtbFJwY0NsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAgICAgICAuZ2V0TG9nZ2VyKFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyogcmVzb3VyY2UgbWFuYWdlciB1cmwgKi8KKyAgICBwcml2YXRlIFVSTCByZXNNZ3JVcmwgPSBudWxsOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ29uc3RydWN0cyBhIG5ldyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiA8Y29kZT51cmw8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogICAgICAgICAgICBUaGUgdXJsIHBvaW50ZXIgdG8gdGhlIHhtbCBycGMgcmVzb3VyY2UgbWFuYWdlciBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQoVVJMIHVybCkgeworICAgICAgICAvLyBzZXQgdXAgdGhlIGNvbmZpZ3VyYXRpb24sIGlmIHRoZXJlIGlzIGFueQorICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnByb3BlcnRpZXMiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UucHJvcGVydGllcyIpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgICAiTG9hZGluZyBSZXNvdXJjZSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyBmcm9tOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnRmlsZSArICJdIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoY29uZmlnRmlsZSkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGxvYWRpbmcgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZyb206IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnRmlsZSArICJdIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIENvbW1vbnNYbWxScGNUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgQ29tbW9uc1htbFJwY1RyYW5zcG9ydEZhY3RvcnkoCisgICAgICAgICAgICAgICAgdXJsKTsKKyAgICAgICAgaW50IGNvbm5lY3Rpb25UaW1lb3V0TWlucyA9IEludGVnZXIKKyAgICAgICAgICAgICAgICAuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAyMCkuaW50VmFsdWUoKTsKKyAgICAgICAgaW50IGNvbm5lY3Rpb25UaW1lb3V0ID0gY29ubmVjdGlvblRpbWVvdXRNaW5zICogNjAgKiAxMDAwOworICAgICAgICBpbnQgcmVxdWVzdFRpbWVvdXRNaW5zID0gSW50ZWdlcgorICAgICAgICAgICAgICAgIC5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLnhtbHJwYy5yZXF1ZXN0VGltZW91dC5taW51dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDYwKS5pbnRWYWx1ZSgpOworICAgICAgICBpbnQgcmVxdWVzdFRpbWVvdXQgPSByZXF1ZXN0VGltZW91dE1pbnMgKiA2MCAqIDEwMDA7CisgICAgICAgIHRyYW5zcG9ydEZhY3Rvcnkuc2V0Q29ubmVjdGlvblRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpOworICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LnNldFRpbWVvdXQocmVxdWVzdFRpbWVvdXQpOworICAgICAgICBjbGllbnQgPSBuZXcgWG1sUnBjQ2xpZW50KHVybCwgdHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgIHJlc01nclVybCA9IHVybDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgQ21kTGluZVV0aWxpdHkgY21kTGluZVV0aWxpdHkgPSBuZXcgQ21kTGluZVV0aWxpdHkoKTsKKyAgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oYXJncyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNKb2JDb21wbGV0ZShTdHJpbmcgam9iSWQpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGpvYklkKTsKKworICAgICAgICBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbXBsZXRlID0gKChCb29sZWFuKSBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuaXNKb2JDb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbXBsZXRlOworICAgIH0KKworICAgIHB1YmxpYyBKb2IgZ2V0Sm9iSW5mbyhTdHJpbmcgam9iSWQpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGpvYklkKTsKKworICAgICAgICBIYXNodGFibGUgam9iSGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpvYkhhc2ggPSAoSGFzaHRhYmxlKSBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuZ2V0Sm9iSW5mbyIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRKb2JGcm9tWG1sUnBjKGpvYkhhc2gpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWxpdmUoKSB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuaXNBbGl2ZSIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIEpvYnMgaW4gSm9iUXVldWUKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBKb2JzIGluIEpvYlF1ZXVlCisgICAgICogQHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIE9uIEFueSBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpvYlF1ZXVlU2l6ZSgpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLmdldEpvYlF1ZXVlU2l6ZSIsIGFyZ0xpc3QpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IEpvYlF1ZXVlIGZyb20gc2VydmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtYXggbnVtYmVyIG9mIEpvYnMgYWxsb3dlZCBpbiBKb2JRdWV1ZQorICAgICAqIEByZXR1cm4gTWF4IG51bWJlciBvZiBKb2JzCisgICAgICogQHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIE9uIEFueSBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpvYlF1ZXVlQ2FwYWNpdHkoKSB0aHJvd3MgSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5nZXRKb2JRdWV1ZUNhcGFjaXR5IiwgYXJnTGlzdCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYlJlcG9zaXRvcnlFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgSm9iUXVldWUgY2FwYWNpdHkgZnJvbSBzZXJ2ZXIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGtpbGxKb2IoU3RyaW5nIGpvYklkKSB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZChqb2JJZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5raWxsSm9iIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRpb25Ob2RlKFN0cmluZyBqb2JJZCkgeworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoam9iSWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLmdldEV4ZWN1dGlvbk5vZGUiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgc3VibWl0Sm9iKEpvYiBleGVjLCBKb2JJbnB1dCBpbikgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY0pvYihleGVjKSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGluLndyaXRlKCkpOworCisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCBhcmdMaXN0LnRvU3RyaW5nKCkpOworCisgICAgICAgIFN0cmluZyBqb2JJZCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpvYklkID0gKFN0cmluZykgY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLmhhbmRsZUpvYiIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKb2JFeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGpvYklkOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VibWl0Sm9iKEpvYiBleGVjLCBKb2JJbnB1dCBpbiwgVVJMIGhvc3RVcmwpCisgICAgICAgICAgICB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjSm9iKGV4ZWMpKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoaW4ud3JpdGUoKSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGhvc3RVcmwudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5oYW5kbGVKb2IiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSm9iRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzczsKKworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldE5vZGVzKCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBWZWN0b3Igbm9kZVZlY3RvciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5vZGVWZWN0b3IgPSAoVmVjdG9yKSBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuZ2V0Tm9kZXMiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UmVzb3VyY2VOb2RlTGlzdEZyb21YbWxScGMobm9kZVZlY3Rvcik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb3VyY2VOb2RlIGdldE5vZGVCeUlkKFN0cmluZyBub2RlSWQpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKG5vZGVJZCk7CisKKyAgICAgICAgSGFzaHRhYmxlIHJlc05vZGVIYXNoID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzTm9kZUhhc2ggPSAoSGFzaHRhYmxlKSBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuZ2V0Tm9kZUJ5SWQiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0UmVzb3VyY2VOb2RlRnJvbVhtbFJwYyhyZXNOb2RlSGFzaCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNNZ3JVcmwKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFJlc01nclVybCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc01nclVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzTWdyVXJsCisgICAgICogICAgICAgICAgICB0aGUgcmVzTWdyVXJsIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc01nclVybChVUkwgcmVzTWdyVXJsKSB7CisgICAgICAgIHRoaXMucmVzTWdyVXJsID0gcmVzTWdyVXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBxdWV1ZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUgdG8gYmUgY3JlYXRlZAorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIG9uIGFueSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICAgICAgYXJnTGlzdC5hZGQocXVldWVOYW1lKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5hZGRRdWV1ZSIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBxdWV1ZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUgdG8gYmUgcmVtb3ZlZAorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIG9uIGFueSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICAgICAgYXJnTGlzdC5hZGQocXVldWVOYW1lKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5yZW1vdmVRdWV1ZSIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbm9kZQorICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGJlIGFkZGVkCisgICAgICogQHRocm93cyBNb25pdG9yRXhjZXB0aW9uIG9uIGFueSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5vZGUoUmVzb3VyY2VOb2RlIG5vZGUpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjUmVzb3VyY2VOb2RlKG5vZGUpKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5hZGROb2RlIiwgYXJnTGlzdCk7CisgICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBub2RlIHdpdGggdGhlIGdpdmVuIGlkCisgICAgICogQHBhcmFtIG5vZGVJZCBUaGUgaWQgb2YgdGhlIG5vZGUgdG8gYmUgcmVtb3ZlZAorICAgICAqIEB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiBvbiBhbnkgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlKFN0cmluZyBub2RlSWQpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKG5vZGVJZCk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IucmVtb3ZlTm9kZSIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZUNhcGFjaXR5KFN0cmluZyBub2RlSWQsIGludCBjYXBhY2l0eSkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb257CisgICAgCXRyeXsKKyAgICAJCVZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKG5vZGVJZCk7CisgICAgICAgICAgICBhcmdMaXN0LmFkZChuZXcgSW50ZWdlcihjYXBhY2l0eSkpOworICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLnNldE5vZGVDYXBhY2l0eSIsIGFyZ0xpc3QpOworICAgIAl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXsKKyAgICAJCXRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRlcyB0aGUgbm9kZSB3aXRoIGdpdmVuIGlkIHRvIHRoZSBxdWV1ZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgICAgICogQHBhcmFtIG5vZGVJZCBUaGUgaWQgb2YgdGhlIG5vZGUgdG8gYmUgYWRkZWQgdG8gdGhlIGdpdmVuIHF1ZXVlTmFtZQorICAgICAqIEBwYXJhbSBxdWV1ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIGFkZCB0aGUgZ2l2ZW4gbm9kZQorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIG9uIGFueSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5vZGVUb1F1ZXVlKFN0cmluZyBub2RlSWQsIFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICAgICAgYXJnTGlzdC5hZGQobm9kZUlkKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKHF1ZXVlTmFtZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuYWRkTm9kZVRvUXVldWUiLCBhcmdMaXN0KTsKKyAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXVlTWFuYWdlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBub2RlIHdpdGggdGhlIGdpdmVuIGlkIGZyb20gdGhlIHF1ZXVlIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAgICAgKiBAcGFyYW0gbm9kZUlkIFRoZSBpZCBvZiB0aGUgbm9kZSB0byBiZSByZW1vdmUgZnJvbSB0aGUgZ2l2ZW4gcXVldWVOYW1lCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUgZnJvbSB3aGljaCB0byByZW1vdmUgdGhlIGdpdmVuIG5vZGUKKyAgICAgKiBAdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiBvbiBhbnkgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlRnJvbVF1ZXVlKFN0cmluZyBub2RlSWQsIFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgICAgICAgICAgYXJnTGlzdC5hZGQobm9kZUlkKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKHF1ZXVlTmFtZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IucmVtb3ZlTm9kZUZyb21RdWV1ZSIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbGlzdCBvZiBjdXJyZW50bHkgc3VwcG9ydGVkIHF1ZXVlIG5hbWVzCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgY3VycmVudGx5IHN1cHBvcnRlZCBxdWV1ZSBuYW1lcworICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIG9uIGFueSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UXVldWVzKCkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgICAgICByZXR1cm4gKExpc3Q8U3RyaW5nPikgY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLmdldFF1ZXVlcyIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbGlzdCBvZiBpZHMgb2YgdGhlIG5vZGVzIGluIHRoZSBnaXZlbiBxdWV1ZQorICAgICAqIEBwYXJhbSBxdWV1ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIGdldCBub2RlIGlkcyBmcm9tCisgICAgICogQHJldHVybiBMaXN0IG9mIG5vZGUgaWRzIGluIHRoZSBnaXZlbiBxdWV1ZU5hbWUKKyAgICAgKiBAdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiBvbiBhbnkgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5vZGVzSW5RdWV1ZShTdHJpbmcgcXVldWVOYW1lKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZlY3RvcjxPYmplY3Q+IGFyZ0xpc3QgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKKyAgICAgICAgICAgIGFyZ0xpc3QuYWRkKHF1ZXVlTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gKExpc3Q8U3RyaW5nPikgY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLmdldE5vZGVzSW5RdWV1ZSIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbGlzdCBvZiBxdWV1ZXMgd2hpY2ggY29udGFpbiB0aGUgbm9kZSB3aXRoIHRoZSBnaXZlbiBub2RlSWQKKyAgICAgKiBAcGFyYW0gbm9kZUlkIFRoZSBpZCBvZiB0aGUgbm9kZSB0byBnZXQgcXVldWVzIGl0IGJlbG9uZ3MgdG8KKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgcXVldWVzIHdoaWNoIGNvbnRhaW4gdGhlIGdpdmUgbm9kZQorICAgICAqIEB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIG9uIGFueSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UXVldWVzV2l0aE5vZGUoU3RyaW5nIG5vZGVJZCkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWZWN0b3I8T2JqZWN0PiBhcmdMaXN0ID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgICAgICAgICBhcmdMaXN0LmFkZChub2RlSWQpOworICAgICAgICAgICAgcmV0dXJuIChMaXN0PFN0cmluZz4pIGNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5nZXRRdWV1ZXNXaXRoTm9kZSIsIGFyZ0xpc3QpOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUXVldWVNYW5hZ2VyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXBvcnQgb24gdGhlIGxvYWQgb2YgdGhlIHJlcXVlc3RlZCBub2RlCisgICAgICogQHBhcmFtIG5vZGVJZCBUaGUgaWQgb2YgdGhlIG5vZGUgdG8gYmUgcG9sbGVkCisgICAgICogQHJldHVybiBBIFN0cmluZyBzaG93aW5nIGEgZnJhY3Rpb24gb2YgdGhlIGxvYWRzIG5vZGUgb3ZlciBpdHMgY2FwYWNpdHkKKyAgICAgKiBAdGhyb3dzIE1vbml0b3JFeGNlcHRpb24gb24gYW55IGVycm9yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlTG9hZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbnsKKyAgICAJdHJ5eworCSAgICAJVmVjdG9yPE9iamVjdD4gYXJnTGlzdCA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCSAgICAJYXJnTGlzdC5hZGQobm9kZUlkKTsKKwkgICAgCXJldHVybiAoU3RyaW5nKWNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5nZXROb2RlTG9hZCIsIGFyZ0xpc3QpOworICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpeworICAgIAkJdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgIAl9CisgICAgfQorCisgICBwdWJsaWMgTGlzdCBnZXRRdWV1ZWRKb2JzKCkgdGhyb3dzIEpvYlF1ZXVlRXhjZXB0aW9ueworICAgICAgICBWZWN0b3IgcXVldWVkSm9icyA9IG51bGw7CisgICAgICAgICAgIAorICAgICAgICB0cnl7CisJICAgcXVldWVkSm9icyA9IChWZWN0b3IpY2xpZW50LmV4ZWN1dGUoInJlc291cmNlbWdyLmdldFF1ZXVlZEpvYnMiLCBuZXcgVmVjdG9yPE9iamVjdD4oKSk7CisgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7CisJICAgICAgdGhyb3cgbmV3IEpvYlF1ZXVlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgfQorCSAgICAKKyAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0Sm9iTGlzdEZyb21YbWxScGMocXVldWVkSm9icyk7CisgIH0gIAorCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlUmVwb3J0KCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb257CisJU3RyaW5nIHJlcG9ydCA9IG51bGw7CisJCisJdHJ5eworCSAgICByZXBvcnQgPSAoU3RyaW5nKWNsaWVudC5leGVjdXRlKCJyZXNvdXJjZW1nci5nZXROb2RlUmVwb3J0IiwgbmV3IFZlY3RvcjxPYmplY3Q+KCkpOworCX1jYXRjaChFeGNlcHRpb24gZSl7CisJICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorCQorICAgICAgIHJldHVybiByZXBvcnQ7CisgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY1JlcG9ydCgpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9ueworCVN0cmluZyByZXBvcnQgPSBudWxsOworCQorCXRyeXsKKwkgICAgcmVwb3J0ID0gKFN0cmluZyljbGllbnQuZXhlY3V0ZSgicmVzb3VyY2VtZ3IuZ2V0RXhlY3V0aW9uUmVwb3J0IiwgbmV3IFZlY3RvcjxPYmplY3Q+KCkpOworCX1jYXRjaChFeGNlcHRpb24gZSl7CisJICAgIHRocm93IG5ldyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwl9CisJCisJcmV0dXJuIHJlcG9ydDsKKyAgfSAgIAorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlYWRhYmxlSm9iU3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzLmVxdWFscyhKb2JTdGF0dXMuU1VDQ0VTUykpIHsKKyAgICAgIHJldHVybiAiU1VDQ0VTUyI7CisgICAgfSBlbHNlIGlmIChzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5GQUlMVVJFKSkgeworICAgICAgcmV0dXJuICJGQUlMVVJFIjsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cy5lcXVhbHMoSm9iU3RhdHVzLkVYRUNVVEVEKSkgeworICAgICAgcmV0dXJuICJFWEVDVVRFRCI7CisgICAgfSBlbHNlIGlmIChzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5RVUVVRUQpKSB7CisgICAgICByZXR1cm4gIlFVRVVFRCI7CisgICAgfSBlbHNlIGlmIChzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5TQ0hFRFVMRUQpKSB7CisgICAgICByZXR1cm4gIlNDSEVEVUxFRCI7CisgICAgfSBlbHNlIGlmIChzdGF0dXMuZXF1YWxzKEpvYlN0YXR1cy5LSUxMRUQpKSB7CisgICAgICByZXR1cm4gIktJTExFRCI7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N5c3RlbS9leHRlcm4vWG1sUnBjQmF0Y2hTdHViLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zeXN0ZW0vZXh0ZXJuL1htbFJwY0JhdGNoU3R1Yi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDM5NTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zeXN0ZW0vZXh0ZXJuL1htbFJwY0JhdGNoU3R1Yi5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLmV4dGVybjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYklucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuWG1sUnBjU3RydWN0RmFjdG9yeTsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLldlYlNlcnZlcjsKKworLyoqCisgKiBAYXV0aG9yIHdvb2xsYXJkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gWE1MIFJQQy1iYXNlZCBCYXRjaCBTdWJtaXNzaW9uIFN5c3RlbS4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgWG1sUnBjQmF0Y2hTdHViIHsKKworICAgIC8qIHRoZSBwb3J0IHRvIHJ1biB0aGUgWE1MIFJQQyB3ZWIgc2VydmVyIG9uLCBkZWZhdWx0IGlzIDIwMDAgKi8KKyAgICBwcml2YXRlIGludCB3ZWJTZXJ2ZXJQb3J0ID0gMjAwMDsKKworICAgIC8qIG91ciB4bWwgcnBjIHdlYiBzZXJ2ZXIgKi8KKyAgICBwcml2YXRlIFdlYlNlcnZlciB3ZWJTZXJ2ZXIgPSBudWxsOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihYbWxScGNCYXRjaFN0dWIuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGpvYlRocmVhZE1hcCA9IG51bGw7CisKKyAgICBwdWJsaWMgWG1sUnBjQmF0Y2hTdHViKGludCBwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2ViU2VydmVyUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgLy8gc3RhcnQgdXAgdGhlIHdlYiBzZXJ2ZXIKKyAgICAgICAgd2ViU2VydmVyID0gbmV3IFdlYlNlcnZlcih3ZWJTZXJ2ZXJQb3J0KTsKKyAgICAgICAgd2ViU2VydmVyLmFkZEhhbmRsZXIoImJhdGNoc3R1YiIsIHRoaXMpOworICAgICAgICB3ZWJTZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBqb2JUaHJlYWRNYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlhtbFJwYyBCYXRjaCBTdHViIHN0YXJ0ZWQgYnkgIgorICAgICAgICAgICAgICAgICsgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiLCAidW5rbm93biIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlSm9iKEhhc2h0YWJsZSBqb2JIYXNoLCBIYXNodGFibGUgam9iSW5wdXQpCisgICAgICAgICAgICB0aHJvd3MgSm9iRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNFeGVjdXRlSm9iKGpvYkhhc2gsIGpvYklucHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlSm9iKEhhc2h0YWJsZSBqb2JIYXNoLCBEYXRlIGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljRXhlY3V0ZUpvYihqb2JIYXNoLCBqb2JJbnB1dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZUpvYihIYXNodGFibGUgam9iSGFzaCwgZG91YmxlIGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljRXhlY3V0ZUpvYihqb2JIYXNoLCBuZXcgRG91YmxlKGpvYklucHV0KSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZUpvYihIYXNodGFibGUgam9iSGFzaCwgaW50IGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljRXhlY3V0ZUpvYihqb2JIYXNoLCBuZXcgSW50ZWdlcihqb2JJbnB1dCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVKb2IoSGFzaHRhYmxlIGpvYkhhc2gsIGJvb2xlYW4gam9iSW5wdXQpCisgICAgICAgICAgICB0aHJvd3MgSm9iRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNFeGVjdXRlSm9iKGpvYkhhc2gsIG5ldyBCb29sZWFuKGpvYklucHV0KSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZUpvYihIYXNodGFibGUgam9iSGFzaCwgVmVjdG9yIGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljRXhlY3V0ZUpvYihqb2JIYXNoLCBqb2JJbnB1dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZUpvYihIYXNodGFibGUgam9iSGFzaCwgYnl0ZVtdIGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZW5lcmljRXhlY3V0ZUpvYihqb2JIYXNoLCBqb2JJbnB1dCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGtpbGxKb2IoSGFzaHRhYmxlIGpvYkhhc2gpIHsKKyAgICAgICAgSm9iIGpvYiA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0Sm9iRnJvbVhtbFJwYyhqb2JIYXNoKTsKKyAgICAgICAgVGhyZWFkIGpvYlRocmVhZCA9IChUaHJlYWQpIGpvYlRocmVhZE1hcC5nZXQoam9iLmdldElkKCkpOworICAgICAgICBpZiAoam9iVGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkpvYjogWyIgKyBqb2IuZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICArICJdIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgYmF0Y2ggc3R1YiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gb2theSwgc28gaW50ZXJydXB0IGl0LCB3aGljaCBzaG91bGQgY2F1c2UgaXQgdG8gc3RvcAorICAgICAgICBqb2JUaHJlYWQuaW50ZXJydXB0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmljRXhlY3V0ZUpvYihIYXNodGFibGUgam9iSGFzaCwgT2JqZWN0IGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4Y2VwdGlvbiB7CisgICAgICAgIEpvYkluc3RhbmNlIGV4ZWMgPSBudWxsOworICAgICAgICBKb2JJbnB1dCBpbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKb2Igam9iID0gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRKb2JGcm9tWG1sUnBjKGpvYkhhc2gpOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJzdHViIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSBjbGFzczogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBqb2IuZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKSArICJdIik7CisKKyAgICAgICAgICAgIGV4ZWMgPSBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0Sm9iSW5zdGFuY2VGcm9tQ2xhc3NOYW1lKGpvYi5nZXRKb2JJbnN0YW5jZUNsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIGluID0gR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldEpvYklucHV0RnJvbUNsYXNzTmFtZShqb2IuZ2V0Sm9iSW5wdXRDbGFzc05hbWUoKSk7CisKKyAgICAgICAgICAgIC8vIGxvYWQgdGhlIGlucHV0IG9iagorICAgICAgICAgICAgaW4ucmVhZChqb2JJbnB1dCk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aHJlYWRlZCBqb2IKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGludGVycnVwdGVkCisgICAgICAgICAgICBSdW5uYWJsZUpvYiBydW5uZXIgPSBuZXcgUnVubmFibGVKb2IoZXhlYywgaW4pOworICAgICAgICAgICAgVGhyZWFkIHRocmVhZFJ1bm5lciA9IG5ldyBUaHJlYWQocnVubmVyKTsKKyAgICAgICAgICAgIC8qIHNhdmUgdGhpcyBqb2IgdGhyZWFkIGluIGEgbWFwIHNvIHdlIGNhbiBraWxsIGl0IGxhdGVyICovCisgICAgICAgICAgICBqb2JUaHJlYWRNYXAucHV0KGpvYi5nZXRJZCgpLCB0aHJlYWRSdW5uZXIpOworICAgICAgICAgICAgdGhyZWFkUnVubmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhyZWFkUnVubmVyLmpvaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDdXJyZW50IGpvYjogWyIgKyBqb2IuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBraWxsZWQ6IGV4aXRpbmcgZ3JhY2VmdWxseSIpOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoam9iVGhyZWFkTWFwKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZCBlbmRUaHJlYWQgPSAoVGhyZWFkKSBqb2JUaHJlYWRNYXAuZ2V0KGpvYi5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFRocmVhZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGpvYlRocmVhZE1hcCkgeworICAgICAgICAgICAgICAgIFRocmVhZCBlbmRUaHJlYWQgPSAoVGhyZWFkKSBqb2JUaHJlYWRNYXAuZ2V0KGpvYi5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kVGhyZWFkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVuZFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBydW5uZXIud2FzU3VjY2Vzc2Z1bCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgcG9ydE51bSA9IC0xOworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiWG1sUnBjQmF0Y2hTdHViIC0tcG9ydE51bSA8cG9ydCBudW1iZXIgZm9yIHhtbCBycGMgc2VydmljZT5cbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tcG9ydE51bSIpKSB7CisgICAgICAgICAgICAgICAgcG9ydE51bSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3J0TnVtID09IC0xKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBYbWxScGNCYXRjaFN0dWIgc3R1YiA9IG5ldyBYbWxScGNCYXRjaFN0dWIocG9ydE51bSk7CisKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJ1bm5hYmxlSm9iIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgICAgIHByaXZhdGUgSm9iSW5wdXQgaW47CisKKyAgICAgICAgcHJpdmF0ZSBKb2JJbnN0YW5jZSBqb2I7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHN1Y2Nlc3NmdWw7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgUnVubmFibGVKb2IoSm9iSW5zdGFuY2Ugam9iLCBKb2JJbnB1dCBpbikgeworICAgICAgICAgICAgdGhpcy5qb2IgPSBqb2I7CisgICAgICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgICAgICB0aGlzLnN1Y2Nlc3NmdWwgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc2Z1bCA9IGpvYi5leGVjdXRlKGluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEpvYklucHV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNTdWNjZXNzZnVsKCkgeworICAgICAgICAJcmV0dXJuIHRoaXMuc3VjY2Vzc2Z1bDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3Rvb2xzL0pvYlN1Ym1pdHRlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdG9vbHMvSm9iU3VibWl0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNjllMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3Rvb2xzL0pvYlN1Ym1pdHRlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudG9vbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLlhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuSm9iQnVpbGRlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB0b29sIHRvIHN1Ym1pdCB7QGxpbmsgSm9ifSBmaWxlcyBnZW5lcmF0ZWQgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSB0byB0aGUKKyAqIFJlc291cmNlIE1hbmFnZXIuCisgKiA8L3A+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSm9iU3VibWl0dGVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoSm9iU3VibWl0dGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciByZXMgbWdyIGNsaWVudCAqLworICAgIHByaXZhdGUgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICAvKiBvdXIgam9iIGZpbGUgZmlsdGVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZUZpbHRlciBKT0JfRklMRV9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhtbCIpOworICAgICAgICB9CisKKyAgICB9OworCisgICAgcHVibGljIEpvYlN1Ym1pdHRlcihVUkwgclVybCkgeworICAgICAgICBjbGllbnQgPSBuZXcgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KHJVcmwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1Ym1pdEpvYkZpbGVzKEZpbGUgam9iRmlsZURpcikgeworICAgICAgICBGaWxlW10gam9iRmlsZXMgPSBqb2JGaWxlRGlyLmxpc3RGaWxlcyhKT0JfRklMRV9GSUxURVIpOworCisgICAgICAgIGlmIChqb2JGaWxlcyAhPSBudWxsICYmIGpvYkZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9iRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBzdWJtaXRKb2JGaWxlKGpvYkZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiSm9iIFN1Ym1pdHRlZDogaWQ6IFsiICsgaWQgKyAiXSIpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIHN1Ym1pdHRpbmcgam9iIGZpbGU6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBqb2JGaWxlc1tpXSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VibWl0Sm9iRmlsZXMoU3RyaW5nIGpvYkZpbGVEaXJQYXRoKSB7CisgICAgICAgIHN1Ym1pdEpvYkZpbGVzKG5ldyBGaWxlKGpvYkZpbGVEaXJQYXRoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBzdWJtaXRKb2JGaWxlKEZpbGUgam9iRmlsZSkgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzdWJtaXRKb2JGaWxlKGpvYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgc3VibWl0Sm9iRmlsZShTdHJpbmcgam9iRmlsZVBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgSm9iU3BlYyBzcGVjID0gSm9iQnVpbGRlci5idWlsZEpvYlNwZWMoam9iRmlsZVBhdGgpOworICAgICAgICByZXR1cm4gc3VibWl0Sm9iKHNwZWMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzTWdyVXJsU3RyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGpvYkZpbGVQYXRoID0gbnVsbCwgam9iRmlsZURpclBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiSm9iU3VibWl0dGVyIC0tclVybCA8cmVzb3VyY2UgbWdyIHVybD4gW29wdGlvbnNdXG4iCisgICAgICAgICAgICAgICAgKyAiLS1maWxlIDxqb2IgZmlsZSBwYXRoPlxuIiArICJbLS1kaXIgPGpvYiBmaWxlIGRpciBwYXRoPl1cbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tclVybCIpKSB7CisgICAgICAgICAgICAgICAgcmVzTWdyVXJsU3RyID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1maWxlIikpIHsKKyAgICAgICAgICAgICAgICBqb2JGaWxlUGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tZGlyIikpIHsKKyAgICAgICAgICAgICAgICBqb2JGaWxlRGlyUGF0aCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNNZ3JVcmxTdHIgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IChqb2JGaWxlUGF0aCA9PSBudWxsICYmIGpvYkZpbGVEaXJQYXRoID09IG51bGwpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBKb2JTdWJtaXR0ZXIgc3VibWl0dGVyID0gbmV3IEpvYlN1Ym1pdHRlcihuZXcgVVJMKHJlc01nclVybFN0cikpOworCisgICAgICAgIC8vIGlmIHRoZXkgc3BlY2lmaWVkIC0tZGlyIGl0IHRha2VzIHByZWNlZGVuY2UKKyAgICAgICAgaWYgKGpvYkZpbGVEaXJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1Ym1pdHRlci5zdWJtaXRKb2JGaWxlcyhqb2JGaWxlRGlyUGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgam9iSWQgPSBzdWJtaXR0ZXIuc3VibWl0Sm9iRmlsZShqb2JGaWxlUGF0aCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJKb2IgU3VibWl0dGVkOiBpZDogWyIgKyBqb2JJZCArICJdIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHN1Ym1pdEpvYihKb2JTcGVjIHNwZWMpIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xpZW50LnN1Ym1pdEpvYihzcGVjLmdldEpvYigpLCBzcGVjLmdldEluKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdG9vbHMvUnVuRGlySm9iU3VibWl0dGVyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS90b29scy9SdW5EaXJKb2JTdWJtaXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ3NDFiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdG9vbHMvUnVuRGlySm9iU3VibWl0dGVyLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS50b29sczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLk5hbWVWYWx1ZUpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5YbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLkpvYkJ1aWxkZXI7CisKKy8qKgorICogQGF1dGhvciBjZWNpbGlhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB0b29sIHRoYXQgY3JlYXRlcyBhIGpvYiBhbmQgc2VuZCBpdCB0byB0aGUgUmVzb3VyY2UgTWFuYWdlci4gVGhlIGxpc3Qgb2YKKyAqIGpvYnMgY3JlYXRlZCBoYXMgYSAxLXRvLTEgY29ycmVzcG9uZGVuY2UgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3J5IG5hbWVzCisgKiA8L3A+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUnVuRGlySm9iU3VibWl0dGVyIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUnVuRGlySm9iU3VibWl0dGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIC8qIG91ciByZXMgbWdyIGNsaWVudCAqLworICAgIHByaXZhdGUgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICBwdWJsaWMgUnVuRGlySm9iU3VibWl0dGVyKFVSTCByVXJsKSB7CisgICAgICAgIGNsaWVudCA9IG5ldyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQoclVybCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VibWl0UnVuRGlySm9iRmlsZShTdHJpbmcgam9iRm5hbWUsIFN0cmluZyBpbnB1dEZuYW1lKQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBjaGVjayB2YWxpZGl0eSBvZiBnaXZlbiBqb2IgZmlsZW5hbWUgYW5kIGlucHV0IGZpbGVuYW1lCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBGaWxlIGpvYkZpbGUgPSBuZXcgRmlsZShqb2JGbmFtZSk7CisgICAgICAgIGlmICgham9iRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgLy8gZmlsZSBkb2Vzbid0IGV4aXN0CisgICAgICAgICAgICB0aHJvdyBuZXcgSm9iRXhlY3V0aW9uRXhjZXB0aW9uKCJSdW5EaXJKb2JTdWJtaXR0ZXI6IGlucHV0IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICArIGpvYkZuYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICAgICAgfSBlbHNlIGlmICgham9iRmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgLy8gZmlsZSBpcyBhIGRpcmVjdG9yeQorICAgICAgICAgICAgdGhyb3cgbmV3IEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbigiUnVuRGlySm9iU3VibWl0dGVyOiBpbnB1dCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBqb2JGbmFtZSArICIgaXMgbm90IGEgZmlsZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGlucHV0Rm5hbWUpOworICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vIGZpbGUgZG9lc24ndCBleGlzdAorICAgICAgICAgICAgdGhyb3cgbmV3IEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbigiUnVuRGlySm9iU3VibWl0dGVyOiBpbnB1dCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBpbnB1dEZuYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICAgICAgfSBlbHNlIGlmICghZi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgLy8gZmlsZSBpcyBhIGRpcmVjdG9yeQorICAgICAgICAgICAgdGhyb3cgbmV3IEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbigiUnVuRGlySm9iU3VibWl0dGVyOiBpbnB1dCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBpbnB1dEZuYW1lICsgIiBpcyBub3QgYSBmaWxlLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IEpvYlNwZWMKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBKb2JTcGVjIHNwZWMgPSBKb2JCdWlsZGVyLmJ1aWxkSm9iU3BlYyhqb2JGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgSm9iIGpvYiA9IHNwZWMuZ2V0Sm9iKCk7CisgICAgICAgIE5hbWVWYWx1ZUpvYklucHV0IGpvYklucHV0ID0gKE5hbWVWYWx1ZUpvYklucHV0KSBzcGVjLmdldEluKCk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBvcGVuIHRoZSBmaWxlIHRvIHJlYWQuIHRyYXZlcnNlIHRocm91Z2ggdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMKKyAgICAgICAgLy8gbmFtZSBnaXZlbiAmIG92ZXJyaWRlIHRoZSBkZWZhdWx0IEpvYidzIHJ1bkRpck5hbWUgdmFsdWUgd2l0aCB0aGUKKyAgICAgICAgLy8gZGlyZWN0b3J5IG5hbWUuIHRoZW4gc3VibWl0IHRoZSBKb2IuCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaW5wdXRGbmFtZSkpOworICAgICAgICAgICAgaWYgKCFpbi5yZWFkeSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgam9iSWQgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBydW5EaXJOYW1lCisgICAgICAgICAgICAgICAgam9iSW5wdXQuc2V0TmFtZVZhbHVlUGFpcigicnVuRGlyTmFtZSIsIGxpbmUpOworCisgICAgICAgICAgICAgICAgam9iSWQgPSBzdWJtaXRKb2Ioam9iLCBqb2JJbnB1dCk7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiSm9iIFN1Ym1pdHRlZDogaWQ6IFsiICsgam9iSWQgKyAiXSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSm9iRXhlY3V0aW9uRXhjZXB0aW9uKCJSdW5EaXJKb2JTdWJtaXR0ZXI6ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXNNZ3JVcmxTdHIgPSBudWxsOworICAgICAgICBTdHJpbmcgam9iRmlsZU5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcnVuRGlyRmlsZU5hbWUgPSBudWxsOworCisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJSdW5EaXJKb2JTdWJtaXR0ZXIgLS1yVXJsIDxyZXNvdXJjZSBtZ3IgdXJsPiAiCisgICAgICAgICAgICAgICAgKyAiLS1qb2JGaWxlIDxpbnB1dCBqb2IgZmlsZT4gIgorICAgICAgICAgICAgICAgICsgIi0tcnVuRGlyRmlsZSA8aW5wdXQgcnVubmluZyBkaXJlY3RvcmllcyBmaWxlPiBcbiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tclVybCIpKSB7CisgICAgICAgICAgICAgICAgcmVzTWdyVXJsU3RyID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1qb2JGaWxlIikpIHsKKyAgICAgICAgICAgICAgICBqb2JGaWxlTmFtZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tcnVuRGlyRmlsZSIpKSB7CisgICAgICAgICAgICAgICAgcnVuRGlyRmlsZU5hbWUgPSBhcmdzWysraV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzTWdyVXJsU3RyID09IG51bGwgfHwgam9iRmlsZU5hbWUgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IHJ1bkRpckZpbGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFJ1bkRpckpvYlN1Ym1pdHRlciBzdWJtaXR0ZXIgPSBuZXcgUnVuRGlySm9iU3VibWl0dGVyKG5ldyBVUkwoCisgICAgICAgICAgICAgICAgcmVzTWdyVXJsU3RyKSk7CisgICAgICAgIHN1Ym1pdHRlci5zdWJtaXRSdW5EaXJKb2JGaWxlKGpvYkZpbGVOYW1lLCBydW5EaXJGaWxlTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc3VibWl0Sm9iKEpvYiBqb2IsIEpvYklucHV0IGpvYklucHV0KQorICAgICAgICAgICAgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjbGllbnQuc3VibWl0Sm9iKGpvYiwgam9iSW5wdXQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9Db25maWd1cmFibGUuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvQ29uZmlndXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwZDNjNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvQ29uZmlndXJhYmxlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQ2xhc3NlcyBkZWZpbmluZyB0aGlzIGludGVyZmFjZSBkZWZpbmUgaG93IHRvIGNvbmZpZ3VyZSB0aGVtc2VsdmVzIGJ5CisgKiBhY2NlcHRpbmcgYSB7QGxpbmsgUHJvcGVydGllc30gb2JqZWN0CisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYWJsZSB7CisKKyAgLyoqCisgICAqIENvbmZpZ3VyZSB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHtAbGluayBQcm9wZXJ0aWVzfS4KKyAgICogCisgICAqIEBwYXJhbSBwcm9wcworICAgKiAgICAgICAgICBQcm9wZXJ0aWVzIHRvIHVzZSB0byBjb25maWd1cmUgdGhlIE9iamVjdC4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShQcm9wZXJ0aWVzIHByb3BzKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTllNTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL0dlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1nckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JRdWV1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3JGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmxvYWRjYWxjLkxvYWRDYWxjdWxhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmxvYWRjYWxjLkxvYWRDYWxjdWxhdG9yRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eC5CYWNrZW5kUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eC5CYWNrZW5kUmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5ub2RlcmVwby5Ob2RlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVyZXBvLk5vZGVSZXBvc2l0b3J5RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwby5RdWV1ZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5xdWV1ZXJlcG8uUXVldWVSZXBvc2l0b3J5RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5TY2hlZHVsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYkluc3RhbmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogR2VuZXJpYyBvYmplY3QgY3JlYXRpb24gZmFjaWxpdGllcyBmb3IgdGhlIFJlc291cmNlIE1hbmFnZXIuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeSB7CisKKyAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgIHByaXZhdGUgR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCBmYWN0b3J5IGNsYXNzZXMhIik7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSm9iSW5wdXR9IGltcGxlbWVudGF0aW9uIGZyb20gdGhlIGdpdmVuCisgICAqIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICogICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUge0BsaW5rIEpvYklucHV0fQorICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBKb2JJbnB1dH0gaW1wbGVtZW50YXRpb24uCisgICAqLworICBwdWJsaWMgc3RhdGljIEpvYklucHV0IGdldEpvYklucHV0RnJvbUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgdHJ5IHsKKyAgICAgIENsYXNzIGlucHV0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICByZXR1cm4gKEpvYklucHV0KSBpbnB1dENsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBqb2IgaW5wdXQgY2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIGpvYiBpbnB1dCBjbGFzcyAiICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgam9iIGlucHV0IGNsYXNzICIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSm9iSW5zdGFuY2V9IGltcGxlbWVudGF0aW9uIGZyb20gdGhlIGdpdmVuCisgICAqIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSBjbGFzc05hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUge0BsaW5rIEpvYkluc3RhbmNlfQorICAgKiAgICAgICAgICB0byBjb25zdHJ1Y3QuCisgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIEpvYkluc3RhbmNlfSBpbXBsZW1lbnRhdGlvbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSm9iSW5zdGFuY2UgZ2V0Sm9iSW5zdGFuY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICB0cnkgeworICAgICAgQ2xhc3MgaW5zdENsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgcmV0dXJuIChKb2JJbnN0YW5jZSkgaW5zdENsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBqb2IgaW5zdGFuY2UgY2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIGpvYiBpbnN0YW5jZSBjbGFzcyAiICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgam9iIGluc3RhbmNlIGNsYXNzICIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUXVldWVSZXBvc2l0b3J5fSBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBnaXZlbgorICAgKiB7QGxpbmsgUXVldWVSZXBvc2l0b3J5RmFjdG9yeX0gY2xhc3MgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIHNlcnZpY2VGYWN0b3J5CisgICAqICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSB7QGxpbmsgUXVldWVSZXBvc2l0b3J5RmFjdG9yeX0gdG8gdXNlIHRvIGNyZWF0ZSBuZXcKKyAgICogICAgICAgICAge0BsaW5rIFF1ZXVlUmVwb3NpdG9yeX1zLgorICAgKiBAcmV0dXJuIEEgbmV3IGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIFF1ZXVlUmVwb3NpdG9yeX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIFF1ZXVlUmVwb3NpdG9yeSBnZXRRdWV1ZVJlcG9zaXRvcnlGcm9tRmFjdG9yeShTdHJpbmcgcXVldWVSZXBvc2l0b3J5RmFjdG9yeSkgeworICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICBRdWV1ZVJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShxdWV1ZVJlcG9zaXRvcnlGYWN0b3J5KTsKKyAgICAgIGZhY3RvcnkgPSAoUXVldWVSZXBvc2l0b3J5RmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZVF1ZXVlUmVwb3NpdG9yeSgpOworICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgcXVldWUgcmVwb3NpdG9yeSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBxdWV1ZVJlcG9zaXRvcnlGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgcXVldWUgcmVwb3NpdG9yeSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBxdWV1ZVJlcG9zaXRvcnlGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgcXVldWUgcmVwb3NpdG9yeSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBxdWV1ZVJlcG9zaXRvcnlGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBCYWNrZW5kUmVwb3NpdG9yeX0gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgZ2l2ZW4KKyAgICoge0BsaW5rIEJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeX0gY2xhc3MgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIGJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeQorICAgKiAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUge0BsaW5rIEJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeX0gdG8gdXNlIHRvIGNyZWF0ZSBuZXcKKyAgICogICAgICAgICAge0BsaW5rIEJhY2tlbmRSZXBvc2l0b3J5fXMuCisgICAqIEByZXR1cm4gQSBuZXcgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgQmFja2VuZFJlcG9zaXRvcnl9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCYWNrZW5kUmVwb3NpdG9yeSBnZXRCYWNrZW5kUmVwb3NpdG9yeUZyb21GYWN0b3J5KFN0cmluZyBiYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkpIHsKKyAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgQmFja2VuZFJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShiYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkpOworICAgICAgZmFjdG9yeSA9IChCYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVCYWNrZW5kUmVwb3NpdG9yeSgpOworICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgYmFja2VuZCByZXBvc2l0b3J5IGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIGJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiBsb2FkaW5nIGJhY2tlbmQgcmVwb3NpdG9yeSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBiYWNrZW5kUmVwb3NpdG9yeUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBiYWNrZW5kIHJlcG9zaXRvcnkgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgYmFja2VuZFJlcG9zaXRvcnlGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBOb2RlUmVwb3NpdG9yeX0gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgZ2l2ZW4KKyAgICoge0BsaW5rIFF1ZXVlUmVwb3NpdG9yeUZhY3Rvcnl9IGNsYXNzIG5hbWUuCisgICAqCisgICAqIEBwYXJhbSBzZXJ2aWNlRmFjdG9yeQorICAgKiAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUge0BsaW5rIE5vZGVSZXBvc2l0b3J5RmFjdG9yeX0gdG8gdXNlIHRvIGNyZWF0ZSBuZXcKKyAgICogICAgICAgICAge0BsaW5rIFF1ZXVlUmVwb3NpdG9yeX1zLgorICAgKiBAcmV0dXJuIEEgbmV3IGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIE5vZGVSZXBvc2l0b3J5fS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgTm9kZVJlcG9zaXRvcnkgZ2V0Tm9kZVJlcG9zaXRvcnlGcm9tRmFjdG9yeShTdHJpbmcgbm9kZVJlcG9zaXRvcnlGYWN0b3J5KSB7CisgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgIE5vZGVSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUobm9kZVJlcG9zaXRvcnlGYWN0b3J5KTsKKyAgICAgIGZhY3RvcnkgPSAoTm9kZVJlcG9zaXRvcnlGYWN0b3J5KSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlTm9kZVJlcG9zaXRvcnkoKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG5vZGUgcmVwb3NpdG9yeSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBub2RlUmVwb3NpdG9yeUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBub2RlIHJlcG9zaXRvcnkgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgbm9kZVJlcG9zaXRvcnlGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgbm9kZSByZXBvc2l0b3J5IGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIG5vZGVSZXBvc2l0b3J5RmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBKb2JRdWV1ZX0gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgZ2l2ZW4KKyAgICoge0BsaW5rIEpvYlF1ZXVlRmFjdG9yeX0gY2xhc3MgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIHNlcnZpY2VGYWN0b3J5CisgICAqICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSB7QGxpbmsgSm9iUXVldWVGYWN0b3J5fSB0byB1c2UgdG8gY3JlYXRlIG5ldworICAgKiAgICAgICAgICB7QGxpbmsgSm9iUXVldWV9cy4KKyAgICogQHJldHVybiBBIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBKb2JRdWV1ZX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIEpvYlF1ZXVlIGdldEpvYlF1ZXVlU2VydmljZUZyb21GYWN0b3J5KFN0cmluZyBzZXJ2aWNlRmFjdG9yeSkgeworICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICBKb2JRdWV1ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKHNlcnZpY2VGYWN0b3J5KTsKKyAgICAgIGZhY3RvcnkgPSAoSm9iUXVldWVGYWN0b3J5KSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlUXVldWUoKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGpvYnF1ZXVlIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgam9icXVldWUgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBqb2JxdWV1ZSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IEJhdGNobWdyIGltcGxlbWVudGF0aW9uIGZyb20gYSBnaXZlbiBTdHJpbmcgbmFtZSBvZiB0aGUKKyAgICogY29ycmVzcG9uZGluZyB7QGxpbmsgQmF0Y2htZ3JGYWN0b3J5fS4KKyAgICoKKyAgICogQHBhcmFtIHNlcnZpY2VGYWN0b3J5CisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgQmF0Y2htZ3JGYWN0b3J5fSBjbGFzcyB0byB1c2UgdG8gY3JlYXRlCisgICAqICAgICAgICAgIHtAbGluayBCYXRjaG1ncn1zLgorICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBCYXRjaG1ncn0gaW1wbGVtZW50YXRpb24uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJhdGNobWdyIGdldEJhdGNobWdyU2VydmljZUZyb21GYWN0b3J5KFN0cmluZyBzZXJ2aWNlRmFjdG9yeSkgeworICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICBCYXRjaG1nckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKHNlcnZpY2VGYWN0b3J5KTsKKyAgICAgIGZhY3RvcnkgPSAoQmF0Y2htZ3JGYWN0b3J5KSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlQmF0Y2htZ3IoKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGJhdGNobWdyIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgYmF0Y2htZ3IgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBiYXRjaG1nciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNb25pdG9yfSBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBnaXZlbiBTdHJpbmcgbmFtZSBvZgorICAgKiB0aGUge0BsaW5rIE1vbml0b3JGYWN0b3J5fS4KKyAgICoKKyAgICogQHBhcmFtIHNlcnZpY2VGYWN0b3J5CisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgTW9uaXRvckZhY3Rvcnl9IGNsYXNzIHRvIHVzZSB0byBjcmVhdGUKKyAgICogICAgICAgICAge0BsaW5rIE1vbml0b3J9cy4KKyAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgTW9uaXRvcn0gaW1wbGVtZW50YXRpb24uCisgICAqLworICBwdWJsaWMgc3RhdGljIE1vbml0b3IgZ2V0TW9uaXRvclNlcnZpY2VGcm9tRmFjdG9yeShTdHJpbmcgc2VydmljZUZhY3RvcnkpIHsKKyAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgTW9uaXRvckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKHNlcnZpY2VGYWN0b3J5KTsKKyAgICAgIGZhY3RvcnkgPSAoTW9uaXRvckZhY3RvcnkpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVNb25pdG9yKCk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBtb25pdG9yIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgbW9uaXRvciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG1vbml0b3IgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTY2hlZHVsZXJ9IGZyb20gdGhlIGdpdmVuIFN0cmluZyBuYW1lIG9mIHRoZQorICAgKiB7QGxpbmsgU2NoZWR1bGVyRmFjdG9yeX0uCisgICAqCisgICAqIEBwYXJhbSBzZXJ2aWNlRmFjdG9yeQorICAgKiAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUge0BsaW5rIFNjaGVkdWxlckZhY3Rvcnl9IHRvIHVzZSB0byBjcmVhdGUKKyAgICogICAgICAgICAgdGhlIG5ldyB7QGxpbmsgU2NoZWR1bGVyfS4KKyAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgU2NoZWR1bGVyfSBpbXBsZW1lbnRhdGlvbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU2NoZWR1bGVyIGdldFNjaGVkdWxlclNlcnZpY2VGcm9tRmFjdG9yeShTdHJpbmcgc2VydmljZUZhY3RvcnkpIHsKKyAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgU2NoZWR1bGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoc2VydmljZUZhY3RvcnkpOworICAgICAgZmFjdG9yeSA9IChTY2hlZHVsZXJGYWN0b3J5KSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlU2NoZWR1bGVyKCk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBzY2hlZHVsZXIgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBzY2hlZHVsZXIgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBzY2hlZHVsZXIgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm9iUmVwb3NpdG9yeX0gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgZ2l2ZW4KKyAgICogbmFtZSBvZiB0aGUge0BsaW5rIEpvYlJlcG9zaXRvcnlGYWN0b3J5fS4KKyAgICogQHBhcmFtIHNlcnZpY2VGYWN0b3J5IFRoZSBjbGFzcyBuYW1lIG9mIHRoZSB7QGxpbmsgSm9iUmVwb3NpdG9yeUZhY3Rvcnl9CisgICAqIHRvIHVzZSB0byBjcmVhdGUgYSB7QGxpbmsgSm9iUmVwb3NpdG9yeX0uCisgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIEpvYlJlcG9zaXRvcnl9IGZyb20gdGhlIGdpdmVuIHNlcnZpY2UgZmFjdG9yeS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSm9iUmVwb3NpdG9yeSBnZXRKb2JSZXBvc2l0b3J5RnJvbVNlcnZpY2VGYWN0b3J5KFN0cmluZyBzZXJ2aWNlRmFjdG9yeSkgeworICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICBKb2JSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoc2VydmljZUZhY3RvcnkpOworICAgICAgZmFjdG9yeSA9IChKb2JSZXBvc2l0b3J5RmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZVJlcG9zaXRvcnkoKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGpvYiByZXBvIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgam9iIHJlcCBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGpvYiByZXBvIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5sb2FkY2FsYy5Mb2FkQ2FsY3VsYXRvcn0gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgZ2l2ZW4gU3RyaW5nIG5hbWUgb2YKKyAgICAgKiB0aGUge0BsaW5rIFJlc291cmNlTW9uaXRvckZhY3Rvcnl9LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VGYWN0b3J5CisgICAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5sb2FkY2FsYy5Mb2FkQ2FsY3VsYXRvckZhY3Rvcnl9IGNsYXNzIHRvIHVzZSB0byBjcmVhdGUKKyAgICAgKiAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEubG9hZGNhbGMuTG9hZENhbGN1bGF0b3J9cy4KKyAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5sb2FkY2FsYy5Mb2FkQ2FsY3VsYXRvcn0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMb2FkQ2FsY3VsYXRvciBnZXRMb2FkQ2FsY3VsYXRvckZyb21TZXJ2aWNlRmFjdG9yeShTdHJpbmcgc2VydmljZUZhY3RvcnkpeworICAgICAgICBDbGFzcyBjbGF6ejsKKyAgICAgICAgTG9hZENhbGN1bGF0b3JGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShzZXJ2aWNlRmFjdG9yeSk7CisgICAgICAgICAgICBmYWN0b3J5ID0gKExvYWRDYWxjdWxhdG9yRmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUxvYWRDYWxjdWxhdG9yKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIGxvYWQgY2FsY3VsYXRvciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBsb2FkIGNhbGN1bGF0b3IgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgbG9hZCBjYWxjdWxhdG9yIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvSm9iQnVpbGRlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9Kb2JCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjOGQ2NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvSm9iQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKb2JCdWlsZGVyIHsKKworICAgIHByaXZhdGUgSm9iQnVpbGRlcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCB1dGlsaXR5IGNsYXNzZXMhIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBKb2JTcGVjIGJ1aWxkSm9iU3BlYyhGaWxlIGpvYkZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkSm9iU3BlYyhqb2JGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEpvYlNwZWMgYnVpbGRKb2JTcGVjKFN0cmluZyBqb2JGaWxlUGF0aCkgeworICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9jID0gWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgIGpvYkZpbGVQYXRoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBYbWxTdHJ1Y3RGYWN0b3J5LmdldEpvYlNwZWMoZG9jLmdldERvY3VtZW50RWxlbWVudCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvUmVzb3VyY2VOb2RlQ29tcGFyYXRvci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9SZXNvdXJjZU5vZGVDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjOTIyMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvUmVzb3VyY2VOb2RlQ29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsOworCisvLyBPT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworCisvLyBKREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VOb2RlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8UmVzb3VyY2VOb2RlPnsKKwkKKwlwdWJsaWMgaW50IGNvbXBhcmUoUmVzb3VyY2VOb2RlIHJuMSwgUmVzb3VyY2VOb2RlIHJuMil7CisJCVN0cmluZyBub2RlSWQxID0gcm4xLmdldE5vZGVJZCgpOworCQlTdHJpbmcgbm9kZUlkMiA9IHJuMi5nZXROb2RlSWQoKTsKKwkJCisJCXJldHVybiBub2RlSWQxLmNvbXBhcmVUbyhub2RlSWQyKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL1VsaW1pdC5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9VbGltaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk4MmRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9VbGltaXQuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgc3RhdGljIEFQSSB0byBkZXRlY3QgdWxpbWl0IHByb3BlcnRpZXMgb24gYW4gdW5kZXJseWluZworICogKi1uaXggc3lzdGVtLgorICogPC9wPi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVsaW1pdCBpbXBsZW1lbnRzIFVsaW1pdE1ldEtleXMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzaGVsbCA9ICIvYmluL2Jhc2giOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJ1blNoZWxsQ21kT3B0aW9uID0gIi1jIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1bGltaXRDb21tYW5kID0gInVsaW1pdCAtYSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9WQUxVRSA9ICJOL0EiOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29yZUZpbGVTaXplKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoVWxpbWl0UHJvcGVydHkpIGdldFVsaW1pdFByb3BlcnRpZXNNYXAoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgIENPUkVfRklMRV9TSVpFKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YVNlZ21lbnRTaXplKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoVWxpbWl0UHJvcGVydHkpIGdldFVsaW1pdFByb3BlcnRpZXNNYXAoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgIERBVEFfU0VHTUVOVF9TSVpFKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVNpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChVbGltaXRQcm9wZXJ0eSkgZ2V0VWxpbWl0UHJvcGVydGllc01hcCgpLmdldChGSUxFX1NJWkUpKQorICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWF4TG9ja2VkTWVtb3J5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoVWxpbWl0UHJvcGVydHkpIGdldFVsaW1pdFByb3BlcnRpZXNNYXAoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgIE1BWF9MT0NLRURfTUVNT1JZKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWF4TWVtb3J5U2l6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKFVsaW1pdFByb3BlcnR5KSBnZXRVbGltaXRQcm9wZXJ0aWVzTWFwKCkuZ2V0KAorICAgICAgICAgICAgICAgICAgICBNQVhfTUVNT1JZX1NJWkUpKS5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1ZBTFVFOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYXhPcGVuRmlsZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChVbGltaXRQcm9wZXJ0eSkgZ2V0VWxpbWl0UHJvcGVydGllc01hcCgpLmdldCgKKyAgICAgICAgICAgICAgICAgICAgTUFYX09QRU5fRklMRVMpKS5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1ZBTFVFOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYXhQaXBlU2l6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKFVsaW1pdFByb3BlcnR5KSBnZXRVbGltaXRQcm9wZXJ0aWVzTWFwKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldChNQVhfUElQRV9TSVpFKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWF4U3RhY2tTaXplKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoVWxpbWl0UHJvcGVydHkpIGdldFVsaW1pdFByb3BlcnRpZXNNYXAoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgIE1BWF9TVEFDS19TSVpFKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWF4Q3B1VGltZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKFVsaW1pdFByb3BlcnR5KSBnZXRVbGltaXRQcm9wZXJ0aWVzTWFwKCkuZ2V0KE1BWF9DUFVfVElNRSkpCisgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1ZBTFVFOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYXhVc2VyUHJvY2Vzc2VzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoVWxpbWl0UHJvcGVydHkpIGdldFVsaW1pdFByb3BlcnRpZXNNYXAoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgIE1BWF9VU0VSX1BST0NFU1NFUykpLmdldFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fVkFMVUU7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1heFZpcnR1YWxNZW1vcnkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChVbGltaXRQcm9wZXJ0eSkgZ2V0VWxpbWl0UHJvcGVydGllc01hcCgpLmdldCgKKyAgICAgICAgICAgICAgICAgICAgTUFYX1ZJUlRVQUxfTUVNT1JZKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WQUxVRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNYXAgZ2V0VWxpbWl0UHJvcGVydGllc01hcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9jZXNzIHAgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNoZWxsLCBydW5TaGVsbENtZE9wdGlvbiwgdWxpbWl0Q29tbWFuZCB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBleGVjdXRpbmcgdWxpbWl0IGNvbW1hbmQ6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocAorICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbSgpKSk7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICBNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgVWxpbWl0UHJvcGVydHkgcHJvcGVydHkgPSBwYXJzZVByb3BlcnR5KGxpbmUpOworICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIHAud2FpdEZvcigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmUpe30KKworCisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVbGltaXRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb2Nlc3MgcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgc2hlbGwsIHJ1blNoZWxsQ21kT3B0aW9uLCB1bGltaXRDb21tYW5kIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGV4ZWN1dGluZyB1bGltaXQgY29tbWFuZDogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwCisgICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKCkpKTsKKworICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgIExpc3QgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBVbGltaXRQcm9wZXJ0eSBwcm9wZXJ0eSA9IHBhcnNlUHJvcGVydHkobGluZSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIHAud2FpdEZvcigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmUpe30KKworICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVbGltaXRQcm9wZXJ0eSBwYXJzZVByb3BlcnR5KFN0cmluZyBsaW5lKSB7CisgICAgICAgIC8vIGxpbmUgbG9va3MgbGlrZTogY3B1IHRpbWUgKHNlY29uZHMsIC10KSB1bmxpbWl0ZWQKKyAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKCcoJykpLnRyaW0oKTsKKyAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZignKScpICsgMSkudHJpbSgpOworICAgICAgICByZXR1cm4gbmV3IFVsaW1pdFByb3BlcnR5KHByb3BOYW1lLCBwcm9wVmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9VbGltaXRNZXRLZXlzLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL1VsaW1pdE1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM3MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9VbGltaXRNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWw7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIE1ldGFkYXRhIGtleXMgdG8gZGVzY3JpYmUgdGhlIG91dHB1dAorICogb2YgdGhlIHVsaW1pdCBjYWxsLgorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBVbGltaXRNZXRLZXlzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfRklMRV9TSVpFID0gImNvcmUgZmlsZSBzaXplIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU0VHTUVOVF9TSVpFID0gImRhdGEgc2VnIHNpemUiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0laRSA9ICJmaWxlIHNpemUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xPQ0tFRF9NRU1PUlkgPSAibWF4IGxvY2tlZCBtZW1vcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX01FTU9SWV9TSVpFID0gIm1heCBtZW1vcnkgc2l6ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfT1BFTl9GSUxFUyA9ICJvcGVuIGZpbGVzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9QSVBFX1NJWkUgPSAicGlwZSBzaXplIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9TVEFDS19TSVpFID0gInN0YWNrIHNpemUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0NQVV9USU1FID0gImNwdSB0aW1lIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9VU0VSX1BST0NFU1NFUyA9ICJtYXggdXNlciBwcm9jZXNzZXMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1ZJUlRVQUxfTUVNT1JZID0gInZpcnR1YWwgbWVtb3J5IjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9VbGltaXRQcm9wZXJ0eS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9VbGltaXRQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWE1NzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL1VsaW1pdFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIFVsaW1pdCByZXR1cm5lZCBwcm9wZXJ0eSwgbWFwcGluZyBhIG5hbWUgdG8gYSBwYXJ0aWN1bGFyCisgKiB2YWx1ZS4gVGhlIHZhbHVlIG1heSBiZSAidW5saW1pdGVkIiwgaW5kaWNhdGluZyB0aGVyZSBpcyBubworICogbGltaXQgb24gdGhlIHByb3BlcnRpZXMgdmFsdWUuIEluIHRoaXMgY2FzZSwgYSBjYWxsIHRvCisgKiB7QGxpbmsgI2lzVW5saW1pdGVkKCl9IGNhbiBiZSB1c2VkIHRvIGRldGVjdCB0aGlzLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFVsaW1pdFByb3BlcnR5IHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxJTUlURURfVkFMID0gInVubGltaXRlZCI7CisKKyAgICBwdWJsaWMgVWxpbWl0UHJvcGVydHkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgVWxpbWl0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVW5saW1pdGVkKCkgeworICAgICAgICBpZiAodGhpcy52YWx1ZS5lcXVhbHMoVU5MSU1JVEVEX1ZBTCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHRoaXMudmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgYSBudW1iZXIsIHNvIHVubGltaXRlZAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkgeworICAgICAgICBpZiAoaXNVbmxpbWl0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHRoaXMudmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9YbWxScGNTdHJ1Y3RGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL1htbFJwY1N0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQ2N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9YbWxScGNTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBmb3Igc2VyaWFsaXppbmcgYW5kIHJlYWRpbmcgUmVzb3VyY2UgTWFuYWdlciBvYmplY3RzIHRvIGFuZCBmcm9tCisgKiB0aGUgWE1MLVJQQyB3aXJlLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWG1sUnBjU3RydWN0RmFjdG9yeSB7CisKKwlwcml2YXRlIFhtbFJwY1N0cnVjdEZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJEb24ndCBjb25zdHJ1Y3QgZmFjdG9yeSBjbGFzc2VzISIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFhtbFJwY0pvYihKb2Igam9iKSB7CisJCUhhc2h0YWJsZSBqb2JIYXNoID0gbmV3IEhhc2h0YWJsZSgpOworCQlqb2JIYXNoLnB1dCgiam9iLmlkIiwgam9iLmdldElkKCkgIT0gbnVsbCA/IGpvYi5nZXRJZCgpOiIiKTsKKwkJam9iSGFzaC5wdXQoImpvYi5uYW1lIiwgam9iLmdldE5hbWUoKSk7CisJCWpvYkhhc2gucHV0KCJqb2IuaW5zdGFuY2VDbGFzc05hbWUiLCBqb2IuZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKSk7CisJCWpvYkhhc2gucHV0KCJqb2IuaW5wdXRDbGFzc05hbWUiLCBqb2IuZ2V0Sm9iSW5wdXRDbGFzc05hbWUoKSk7CisJCWpvYkhhc2gucHV0KCJqb2IucXVldWVOYW1lIiwgam9iLmdldFF1ZXVlTmFtZSgpKTsKKwkJam9iSGFzaC5wdXQoImpvYi5sb2FkIixqb2IuZ2V0TG9hZFZhbHVlKCkpOworICBqb2JIYXNoLnB1dCgiam9iLnN0YXR1cyIsIGpvYi5nZXRTdGF0dXMoKSAhPSBudWxsID8gam9iLmdldFN0YXR1cygpIDogIiIpOworICAgIHJldHVybiBqb2JIYXNoOworCX0KKworCXB1YmxpYyBzdGF0aWMgSm9iIGdldEpvYkZyb21YbWxScGMoSGFzaHRhYmxlIGpvYkhhc2gpIHsKKwkJSm9iIGpvYiA9IG5ldyBKb2IoKTsKKwkJam9iLnNldElkKChTdHJpbmcpIGpvYkhhc2guZ2V0KCJqb2IuaWQiKSk7CisJCWpvYi5zZXROYW1lKChTdHJpbmcpIGpvYkhhc2guZ2V0KCJqb2IubmFtZSIpKTsKKwkJam9iLnNldEpvYklucHV0Q2xhc3NOYW1lKChTdHJpbmcpIGpvYkhhc2guZ2V0KCJqb2IuaW5wdXRDbGFzc05hbWUiKSk7CisJCWpvYi5zZXRKb2JJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBqb2JIYXNoCisJCQkJLmdldCgiam9iLmluc3RhbmNlQ2xhc3NOYW1lIikpOworCQlqb2Iuc2V0UXVldWVOYW1lKChTdHJpbmcpam9iSGFzaC5nZXQoImpvYi5xdWV1ZU5hbWUiKSk7CisJCWpvYi5zZXRMb2FkVmFsdWUoKEludGVnZXIpam9iSGFzaC5nZXQoImpvYi5sb2FkIikpOworICBqb2Iuc2V0U3RhdHVzKChTdHJpbmcpam9iSGFzaC5nZXQoImpvYi5zdGF0dXMiKSk7CisJCXJldHVybiBqb2I7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldFhtbFJwY0pvYkxpc3QoTGlzdCBqb2JzKXsKKwkJVmVjdG9yIGpvYlZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKwkJCisJCWlmKGpvYnMgIT0gbnVsbCAmJiBqb2JzLnNpemUoKSA+IDApeworCQkJZm9yKEl0ZXJhdG9yIGkgPSBqb2JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7CisJCQkJSm9iIGpvYiA9IChKb2IpaS5uZXh0KCk7CisJCQkJam9iVmVjdG9yLmFkZChnZXRYbWxScGNKb2Ioam9iKSk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBqb2JWZWN0b3I7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRKb2JMaXN0RnJvbVhtbFJwYyhWZWN0b3Igam9iVmVjdG9yKXsKKwkJTGlzdCBqb2JzID0gbmV3IFZlY3RvcigpOworCQkKKwkJaWYoam9iVmVjdG9yICE9IG51bGwgJiYgam9iVmVjdG9yLnNpemUoKSA+IDApeworCQkJZm9yKEl0ZXJhdG9yIGkgPSBqb2JWZWN0b3IuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisJCQkJSGFzaHRhYmxlIGpvYkhhc2ggPSAoSGFzaHRhYmxlKWkubmV4dCgpOworCQkJCWpvYnMuYWRkKGdldEpvYkZyb21YbWxScGMoam9iSGFzaCkpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gam9iczsKKwl9CisKKyBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRYbWxScGNSZXNvdXJjZU5vZGVMaXN0KExpc3QgcmVzTm9kZXMpIHsKKyAgICBWZWN0b3IgcmVzTm9kZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKworICAgIGlmIChyZXNOb2RlcyAhPSBudWxsICYmIHJlc05vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc05vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZSA9IChSZXNvdXJjZU5vZGUpIGkubmV4dCgpOworICAgICAgICByZXNOb2RlVmVjdG9yLmFkZChnZXRYbWxScGNSZXNvdXJjZU5vZGUobm9kZSkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXNOb2RlVmVjdG9yOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc291cmNlTm9kZUxpc3RGcm9tWG1sUnBjKFZlY3RvciByZXNOb2RlVmVjdG9yKSB7CisgICAgTGlzdCByZXNOb2RlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIGlmIChyZXNOb2RlVmVjdG9yICE9IG51bGwgJiYgcmVzTm9kZVZlY3Rvci5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNOb2RlVmVjdG9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICBIYXNodGFibGUgcmVzTm9kZUhhc2ggPSAoSGFzaHRhYmxlKSBpLm5leHQoKTsKKyAgICAgICAgcmVzTm9kZXMuYWRkKGdldFJlc291cmNlTm9kZUZyb21YbWxScGMocmVzTm9kZUhhc2gpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzTm9kZXM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXRYbWxScGNSZXNvdXJjZU5vZGUoUmVzb3VyY2VOb2RlIG5vZGUpIHsKKyAgICBIYXNodGFibGUgcmVzTm9kZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcmVzTm9kZUhhc2gucHV0KCJub2RlLmlkIiwgbm9kZS5nZXROb2RlSWQoKSk7CisgICAgcmVzTm9kZUhhc2gucHV0KCJub2RlLmNhcGFjaXR5IiwgU3RyaW5nLnZhbHVlT2Yobm9kZS5nZXRDYXBhY2l0eSgpKSk7CisgICAgcmVzTm9kZUhhc2gucHV0KCJub2RlLnVybCIsIG5vZGUuZ2V0SXBBZGRyKCkudG9FeHRlcm5hbEZvcm0oKSk7CisKKyAgICByZXR1cm4gcmVzTm9kZUhhc2g7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJlc291cmNlTm9kZSBnZXRSZXNvdXJjZU5vZGVGcm9tWG1sUnBjKEhhc2h0YWJsZSByZXNOb2RlSGFzaCkgeworICAgIFJlc291cmNlTm9kZSBub2RlID0gbmV3IFJlc291cmNlTm9kZSgpOworICAgIG5vZGUuc2V0SWQoKFN0cmluZykgcmVzTm9kZUhhc2guZ2V0KCJub2RlLmlkIikpOworICAgIG5vZGUuc2V0Q2FwYWNpdHkoSW50ZWdlcgorICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgcmVzTm9kZUhhc2guZ2V0KCJub2RlLmNhcGFjaXR5IikpKTsKKyAgICB0cnkgeworICAgICAgbm9kZS5zZXRJcEFkZHIobmV3IFVSTCgoU3RyaW5nKSByZXNOb2RlSGFzaC5nZXQoIm5vZGUudXJsIikpKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgfQorCisgICAgcmV0dXJuIG5vZGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9YbWxScGNXcml0ZWFibGUuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvWG1sUnBjV3JpdGVhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNzcxMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvWG1sUnBjV3JpdGVhYmxlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWw7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEFuIGludGVyZmFjZSByZXF1aXJpbmcgaW1wbGVtZW50aW5nIGNsYXNzZXMgdG8gZGVmaW5lIGhvdyB0aGF0IGNhbiBiZQorICogc2VyaWFsaXplZCB0byBhbmQgZnJvbSB0aGUgWE1MLVJQQyB3aXJlLgorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBYbWxScGNXcml0ZWFibGUgeworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgZGVmaW5lIGhvdyB0byB0YWtlIGFuIFhNTC1SUEMgc2VyaWFsaXphYmxlCisgICAqIHtAbGluayBPYmplY3R9IGFuZCBsb2FkIHRoZSBpbnRlcm5hbCBkYXRhIG1lbWJlcnMgb2YgdGhlIGltcGxlbWVudGluZyBjbGFzcworICAgKiBmcm9tIHRoZSBnaXZlbiBpbnB1dCB7QGxpbmsgT2JqZWN0fS4KKyAgICogCisgICAqIEBwYXJhbSBpbgorICAgKiAgICAgICAgICBUaGUge0BsaW5rIE9iamVjdH0gdG8gcmVhZCBpbiBhbmQgaW5zdGFudGlhdGUgdGhlIGltcGxlbWVudGF0aW9uCisgICAqICAgICAgICAgIG9mIHRoaXMgY2xhc3Mgd2l0aC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHJlYWQoT2JqZWN0IGluKTsKKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gQW4gWE1MLVJQQyBzYWZlIHNlcmlhbGl6YXRpb24ge0BsaW5rIE9iamVjdH0gb2YgdGhlIGltcGxlbWVudGluZworICAgKiAgICAgICAgIGNsYXNzIGZvciB0aGlzIGludGVyZmFjZS4KKyAgICovCisgIHB1YmxpYyBPYmplY3Qgd3JpdGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9YbWxTdHJ1Y3RGYWN0b3J5LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL1htbFN0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDhjODNiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9YbWxTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworCisvKioKKyAqIEBhdXRob3Igd29vbGxhcmQKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldnNpb24kCisgKiAKKyAqIDxwPgorICogQSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIFJlc291cmNlIE1hbmFnZXIgb2JqZWN0cyBmcm9tIFhNTCB7QGxpbmsgTm9kZX1zIGFuZAorICoge0BsaW5rIEVsZW1lbnR9cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFhtbFN0cnVjdEZhY3RvcnkgeworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhtbFN0cnVjdEZhY3RvcnkuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBYbWxTdHJ1Y3RGYWN0b3J5KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9uJ3QgaW5zdGFudGlhdGUgWE1MIFN0cnVjdCBGYWN0b3JpZXMhIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZU5vZGUgZ2V0Tm9kZXMoTm9kZSBub2RlKSB7CisgICAgICAgIEVsZW1lbnQgcmVzb3VyY2VOb2RlUm9vdCA9IChFbGVtZW50KSBub2RlOworCisgICAgICAgIFN0cmluZyBpZCA9IG51bGw7CisgICAgICAgIFVSTCBpcCA9IG51bGw7CisgICAgICAgIGludCBjYXBhY2l0eSA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlkID0gcmVzb3VyY2VOb2RlUm9vdC5nZXRBdHRyaWJ1dGUoIm5vZGVJZCIpOworICAgICAgICAgICAgaXAgPSBuZXcgVVJMKEJvb2xlYW4ucGFyc2VCb29sZWFuKHJlc291cmNlTm9kZVJvb3QKKwkJCQkJLmdldEF0dHJpYnV0ZSgiZW52UmVwbGFjZSIpKSA/IFBhdGhVdGlscworCQkJCQkuZG9EeW5hbWljUmVwbGFjZW1lbnQocmVzb3VyY2VOb2RlUm9vdC5nZXRBdHRyaWJ1dGUoImlwIikpCisJCQkJCTogcmVzb3VyY2VOb2RlUm9vdC5nZXRBdHRyaWJ1dGUoImlwIikpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBuZXcgSW50ZWdlcihyZXNvdXJjZU5vZGVSb290LmdldEF0dHJpYnV0ZSgiY2FwYWNpdHkiKSkKKyAgICAgICAgICAgICAgICAgICAgLmludFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VOb2RlIHJlc291cmNlID0gbmV3IFJlc291cmNlTm9kZShpZCwgaXAsIGNhcGFjaXR5KTsKKworICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFF1ZXVlQXNzaWdubWVudChOb2RlIG5vZGUpIHsKKyAgICAgICAgVmVjdG9yIHF1ZXVlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBFbGVtZW50IHJlc291cmNlTm9kZVJvb3QgPSAoRWxlbWVudCkgbm9kZTsKKyAgICAgICAgRWxlbWVudCBxdWV1ZUVsZW0gPSBYTUxVdGlscworICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoInF1ZXVlcyIsIHJlc291cmNlTm9kZVJvb3QpOworICAgICAgICBOb2RlTGlzdCBxdWV1ZUxpc3QgPSBxdWV1ZUVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInF1ZXVlIik7CisKKyAgICAgICAgaWYgKHF1ZXVlTGlzdCAhPSBudWxsICYmIHF1ZXVlTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcXVldWVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHF1ZXVlRWxlbWVudCA9IChFbGVtZW50KSBxdWV1ZUxpc3QuaXRlbShpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBxdWV1ZUlkID0gcXVldWVFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgICAgIHF1ZXVlcy5hZGQocXVldWVJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcXVldWVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSm9iU3BlYyBnZXRKb2JTcGVjKE5vZGUgbm9kZSkgeworICAgICAgICBFbGVtZW50IGpvYk5vZGVFbGVtID0gKEVsZW1lbnQpIG5vZGU7CisKKyAgICAgICAgU3RyaW5nIGpvYklkID0gam9iTm9kZUVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpOworICAgICAgICBTdHJpbmcgam9iTmFtZSA9IGpvYk5vZGVFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICBFbGVtZW50IGluc3RDbGFzc0VsZW0gPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQoImluc3RhbmNlQ2xhc3MiLAorICAgICAgICAgICAgICAgIGpvYk5vZGVFbGVtKTsKKyAgICAgICAgU3RyaW5nIGluc3RDbGFzcyA9IGluc3RDbGFzc0VsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgIFN0cmluZyBxdWV1ZSA9IFhNTFV0aWxzLmdldEVsZW1lbnRUZXh0KCJxdWV1ZSIsIGpvYk5vZGVFbGVtKTsKKyAgICAgICAgSW50ZWdlciBsb2FkID0gbmV3IEludGVnZXIoSW50ZWdlci5wYXJzZUludChYTUxVdGlscy5nZXRFbGVtZW50VGV4dCgKKyAgICAgICAgICAgICAgICAibG9hZCIsIGpvYk5vZGVFbGVtKSkpOworCisgICAgICAgIEVsZW1lbnQgaW5wdXRDbGFzcyA9IFhNTFV0aWxzCisgICAgICAgICAgICAgICAgLmdldEZpcnN0RWxlbWVudCgiaW5wdXRDbGFzcyIsIGpvYk5vZGVFbGVtKTsKKyAgICAgICAgU3RyaW5nIGlucHV0Q2xhc3NOYW1lID0gaW5wdXRDbGFzcy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKworICAgICAgICAvLyBub3cgcmVhZCB0aGUgcHJvcGVydGllcyBkZWZpbmVkLCBpZiBhbnkKKyAgICAgICAgRWxlbWVudCBwcm9wZXJ0aWVzT3V0ZXJSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KCJwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAgICAgICBpbnB1dENsYXNzKTsKKyAgICAgICAgUHJvcGVydGllcyBpbnB1dENvbmZpZ1Byb3BzID0gbnVsbDsKKworICAgICAgICBpZiAocHJvcGVydGllc091dGVyUm9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnB1dENvbmZpZ1Byb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIE5vZGVMaXN0IHByb3BOb2RlTGlzdCA9IHByb3BlcnRpZXNPdXRlclJvb3QKKyAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcm9wZXJ0eSIpOworCisgICAgICAgICAgICBpZiAocHJvcE5vZGVMaXN0ICE9IG51bGwgJiYgcHJvcE5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcE5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wRWxlbSA9IChFbGVtZW50KSBwcm9wTm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcEVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWUgPSBwcm9wRWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwgJiYgcHJvcFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q29uZmlnUHJvcHMuc2V0UHJvcGVydHkocHJvcE5hbWUsIHByb3BWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBKb2Igam9iID0gbmV3IEpvYigpOworICAgICAgICBqb2Iuc2V0SWQoam9iSWQpOworICAgICAgICBqb2Iuc2V0TmFtZShqb2JOYW1lKTsKKyAgICAgICAgam9iLnNldEpvYkluc3RhbmNlQ2xhc3NOYW1lKGluc3RDbGFzcyk7CisgICAgICAgIGpvYi5zZXRKb2JJbnB1dENsYXNzTmFtZShpbnB1dENsYXNzTmFtZSk7CisgICAgICAgIGpvYi5zZXRRdWV1ZU5hbWUocXVldWUpOworICAgICAgICBqb2Iuc2V0TG9hZFZhbHVlKGxvYWQpOworCisgICAgICAgIEpvYklucHV0IGluID0gR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0Sm9iSW5wdXRGcm9tQ2xhc3NOYW1lKGlucHV0Q2xhc3NOYW1lKTsKKyAgICAgICAgaWYgKGlucHV0Q29uZmlnUHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW4uY29uZmlndXJlKGlucHV0Q29uZmlnUHJvcHMpOworICAgICAgICB9CisKKyAgICAgICAgSm9iU3BlYyBzcGVjID0gbmV3IEpvYlNwZWMoaW4sIGpvYik7CisKKyAgICAgICAgcmV0dXJuIHNwZWM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvUkVNT1ZFLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvUkVNT1ZFLmxvZwpAQCAtMCwwICsxLDE4IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK1lvdSBjYW4gcmVtb3ZlIHRoaXMgZmlsZS4gSXQgd2FzIG9ubHkgaW5jbHVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZyBkaXJlY3RvcnkgZm9yIHRoaXMKK2Rpc3RyaWJ1dGlvbiB3YXMgY3JlYXRlZCBvbiBhc3NlbWJseS4KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLWFjdGlvbnMueG1sIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNDVhOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLWFjdGlvbnMueG1sCkBAIC0wLDAgKzEsMTA0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorLS0+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisJeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6cD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9wIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjAueHNkIj4KKworCTxiZWFuIGlkPSJhZGROb2RlIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkFkZE5vZGVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJBZGRzIGEgUmVzb3VyY2VOb2RlIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iYWRkTm9kZVRvUXVldWUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uQWRkTm9kZVRvUXVldWVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJBZGRzIGEgUmVzb3VyY2VOb2RlIHRvIGEgUXVldWUiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJhZGRRdWV1ZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5BZGRRdWV1ZUNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkFkZHMgYSBxdWV1ZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldEV4ZWNOb2RlIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkdldEV4ZWNOb2RlQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0IGV4ZWN1dGlvbiBub2RlIGZvciBhIGpvYiIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldEpvYkluZm8iCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0Sm9iSW5mb0NsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBqb2IiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJnZXROb2RlQnlJZCIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXROb2RlQnlJZENsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBub2RlIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iZ2V0Tm9kZUxvYWQiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0Tm9kZUxvYWRDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRoZSBjdXJyZW50IGpvYiBsb2FkIG9mIGEgbm9kZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldE5vZGVzIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkdldE5vZGVzQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBhIGxpc3Qgb2YgbWFuYWdlZCBub2RlcyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldE5vZGVzSW5RdWV1ZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXROb2Rlc0luUXVldWVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iCisJCQl2YWx1ZT0iR2V0cyBsaXN0IG9mIG5vZGVzIHdoaWNoIGJlbG9uZyB0byBnaXZlbiBxdWV1ZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImdldFF1ZXVlcyIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXRRdWV1ZXNDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGxpc3Qgb2YgcXVldWVzIiAvPgorCTwvYmVhbj4KKyAgICAgICAgPGJlYW4gaWQ9ImdldFF1ZXVlZEpvYnMiCisgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5HZXRRdWV1ZWRKb2JzQ2xpQWN0aW9uIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGxpc3Qgb2Ygam9icyBjdXJyZW50bHkgaW4gdGhlIHF1ZXVlIiAvPgorICAgICAgICA8L2JlYW4+CisgICAgICAgIDxiZWFuIGlkPSJnZXRFeGVjUmVwb3J0IgorICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0RXhlY1JlcG9ydENsaUFjdGlvbiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBsaXN0IG9mIGpvYnMgY3VycmVudGx5IGluIHRoZSBxdWV1ZSIgLz4KKyAgICAgICAgPC9iZWFuPgorICAgICAgICA8YmVhbiBpZD0iZ2V0Tm9kZVJlcG9ydCIKKyAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLkdldE5vZGVSZXBvcnRDbGlBY3Rpb24iPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgbmFtZSAoYWxsIG5vZGVzIHdpbGwgYmUgZGlzcGxheWVkIGluIGFscGhhYmV0aWNhbCBvcmRlciksIGxvYWQgYW5kIGNhcGFjaXR5IG9mIGFsbCBub2RlcywgYW5kIHRoZWlyIHF1ZXVlcy4iIC8+CisgICAgICAgIDwvYmVhbj4KKwk8YmVhbiBpZD0iZ2V0UXVldWVzV2l0aE5vZGUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uR2V0UXVldWVzV2l0aE5vZGVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGxpc3Qgb2YgcXVldWVzIHdoaWNoIGNvbnRhaW4gZ2l2ZW4gbm9kZSIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9ImtpbGwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uS2lsbENsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IktpbGxzIGEgam9iIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0icmVtb3ZlTm9kZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5SZW1vdmVOb2RlQ2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUmVtb3ZlcyBnaXZlbiBub2RlIGZyb20gbWFuYWdlZCBub2RlcyIgLz4KKwk8L2JlYW4+CisJPGJlYW4gaWQ9InJlbW92ZU5vZGVGcm9tUXVldWUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uUmVtb3ZlTm9kZUZyb21RdWV1ZUNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlJlbW92ZXMgZ2l2ZW4gbm9kZSBmcm9tIGdpdmVuIHF1ZXVlIiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0icmVtb3ZlUXVldWUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uUmVtb3ZlUXVldWVDbGlBY3Rpb24iPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSZW1vdmVzIGEgcXVldWUiIC8+CisJPC9iZWFuPgorCTxiZWFuIGlkPSJzZXROb2RlQ2FwYWNpdHkiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaS5hY3Rpb24uU2V0Tm9kZUNhcGFjaXR5Q2xpQWN0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iQ2hhbmdlcyBhIG5vZGVzIGNhcGFjaXR5IiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0ic3VibWl0Sm9iIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5jbGkuYWN0aW9uLlN1Ym1pdEpvYkNsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlN1Ym1pdHMgYSBqb2IgZm9yIGV4ZWN1dGlvbiIgLz4KKwk8L2JlYW4+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtb3B0aW9ucy54bWwgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM4YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtb3B0aW9ucy54bWwKQEAgLTAsMCArMSw2NjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgQXV0aG9yOiBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCistLT4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpwPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3AiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuMC54c2QiPgorCisJPGJlYW4gaWQ9InVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ1IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iUmVzb3VyY2UgTWFuYWdlciBVUkwiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InVybCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4KKwkJCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuU2V0SmF2YVByb3BlcnRpZXNIYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0icHJvcGVydHlOYW1lcyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPHZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXJsPC92YWx1ZT4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im9wZXJhdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJvcCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJvcGVyYXRpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJCXZhbHVlPSJEZWNsYXJlIHRoYXQgeW91IHdpc2ggdG8gcHJlc2VudCBhbiBvcGVyYXRpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlZCIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdWJPcHRpb25zIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Tm9kZUJ5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Tm9kZXMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0UXVldWVzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOm9wdGlvbi1yZWY9ImdldFF1ZXVlZEpvYnMiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJICAgICAgICBwOm9wdGlvbi1yZWY9ImdldE5vZGVSZXBvcnQiIHA6cmVxdWlyZWQ9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRFeGVjUmVwb3J0IiBwOnJlcXVpcmVkPSJmYWxzZSIvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iYWRkTm9kZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJyZW1vdmVOb2RlIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9InNldE5vZGVDYXBhY2l0eSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpvcHRpb24tcmVmPSJnZXRFeGVjTm9kZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJhZGRRdWV1ZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJyZW1vdmVRdWV1ZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJhZGROb2RlVG9RdWV1ZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXROb2Rlc0luUXVldWUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0UXVldWVzV2l0aE5vZGUiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0icmVtb3ZlTm9kZUZyb21RdWV1ZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXROb2RlTG9hZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJzdWJtaXRKb2IiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Sm9iSW5mbyIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJraWxsIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldE5vZGVCeUlkIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldE5vZGVCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuYnlpZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXROb2RlQnlJZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Tm9kZUJ5SWQgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0Tm9kZUJ5SWQ8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Tm9kZUJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0Tm9kZXMgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0Tm9kZXMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im5vZGVzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldE5vZGVzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXROb2RlcyBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXROb2RlczwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROb2RlcyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRRdWV1ZXMgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0UXVldWVzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJxdWV1ZXMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UXVldWVzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRRdWV1ZXMgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0UXVldWVzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFF1ZXVlcyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBBZGROb2RlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImFkZE5vZGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImFuIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImFkZE5vZGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGFkZE5vZGUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+YWRkTm9kZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGROb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0iaXBBZGRyIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImFkZHIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iaXBBZGRyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJOb2RlIElQIEFkZHJlc3MiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS5uZXQuVVJMIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJpcC1hZGRyIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkTm9kZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKwkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisJCQkJPHByb3BlcnR5IG5hbWU9ImFwcGx5VG9BY3Rpb25zIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKwkJCQkJCQlwOmFjdGlvbk5hbWU9ImFkZE5vZGUiIHA6bWV0aG9kTmFtZT0ic2V0Tm9kZVVybCIgLz4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBSZW1vdmVOb2RlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9InJlbW92ZU5vZGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InJuIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlbW92ZU5vZGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHJlbW92ZU5vZGUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+cmVtb3ZlTm9kZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZW1vdmVOb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIFNldE5vZGVDYXBhY2l0eSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJzZXROb2RlQ2FwYWNpdHkiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InNuY2FwIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InNldE5vZGVDYXBhY2l0eSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgc2V0Tm9kZUNhcGFjaXR5IEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnNldE5vZGVDYXBhY2l0eTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJzZXROb2RlQ2FwYWNpdHkiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworICA8IS0tIFNldE5vZGVDYXBhY2l0eSBPcHRpb25zIC0tPgorICA8YmVhbiBpZD0iZ2V0RXhlY05vZGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKyAgICBwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJleGVOb2RlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0RXhlY05vZGUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0RXhlY05vZGUgQWN0aW9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDx2YWx1ZT5nZXRFeGVjTm9kZTwvdmFsdWU+CisgICAgICA8L2xpc3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0RXhlY05vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworCTwhLS0gQWRkUXVldWUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iYWRkUXVldWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImFxIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImFkZFF1ZXVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBhZGRRdWV1ZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5hZGRRdWV1ZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGRRdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBSZW1vdmVRdWV1ZSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJyZW1vdmVRdWV1ZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icnEiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVtb3ZlUXVldWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHJlbW92ZVF1ZXVlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPnJlbW92ZVF1ZXVlPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InJlbW92ZVF1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEFkZE5vZGVUb1F1ZXVlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImFkZE5vZGVUb1F1ZXVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJhbnRxIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImFkZE5vZGVUb1F1ZXVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBhZGROb2RlVG9RdWV1ZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5hZGROb2RlVG9RdWV1ZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGROb2RlVG9RdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXROb2Rlc0luUXVldWUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0Tm9kZXNJblF1ZXVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuaW5xIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldE5vZGVzSW5RdWV1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Tm9kZXNJblF1ZXVlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldE5vZGVzSW5RdWV1ZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROb2Rlc0luUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0UXVldWVzV2l0aE5vZGUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0UXVldWVzV2l0aE5vZGUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InF3biIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRRdWV1ZXNXaXRoTm9kZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UXVldWVzV2l0aE5vZGUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0UXVldWVzV2l0aE5vZGU8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0UXVldWVzV2l0aE5vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gUmVtb3ZlTm9kZUZyb21RdWV1ZSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJyZW1vdmVOb2RlRnJvbVF1ZXVlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJybmZxIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InJlbW92ZU5vZGVGcm9tUXVldWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIHJlbW92ZU5vZGVGcm9tUXVldWUgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+cmVtb3ZlTm9kZUZyb21RdWV1ZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZW1vdmVOb2RlRnJvbVF1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldE5vZGVMb2FkIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldE5vZGVMb2FkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJsb2FkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldE5vZGVMb2FkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXROb2RlTG9hZCBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXROb2RlTG9hZDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROb2RlTG9hZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBTdWJtaXRKb2IgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0ic3VibWl0Sm9iIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzdWJtaXQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic3VibWl0Sm9iIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBzdWJtaXRKb2IgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+c3VibWl0Sm9iPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InN1Ym1pdEpvYiIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImRlZiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImRlZiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iSm9iIERlZmluaXRpb24gRmlsZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ieG1sLWZpbGUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJzdWJtaXRKb2IiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJzdWJtaXRKb2IiIHA6bWV0aG9kTmFtZT0ic2V0Sm9iRGVmaW5pdGlvbkZpbGUiIC8+CisJCQkJCTwvbGlzdD4KKwkJCQk8L3Byb3BlcnR5PgorCQkJPC9iZWFuPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworICA8YmVhbiBpZD0ibm9kZVVybCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im51IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibm9kZVVybCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJOb2RlIFVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImphdmEubmV0LlVSTCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InVybCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorICAgICAgICAgIHA6YWN0aW9uTmFtZT0ic3VibWl0Sm9iIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKyAgICAgIDwvbGlzdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVyIj4KKyAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uSGFuZGxlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKyAgICAgICAgICAgICAgcDphY3Rpb25OYW1lPSJzdWJtaXRKb2IiIHA6bWV0aG9kTmFtZT0ic2V0VXJsIiAvPgorICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYmVhbj4KKyAgICA8L3Byb3BlcnR5PgorICA8L2JlYW4+CisKKwk8IS0tIEdldEpvYkluZm8gT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0Sm9iSW5mbyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iaW5mbyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRKb2JJbmZvIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRKb2JJbmZvIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldEpvYkluZm88L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Sm9iSW5mbyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBLaWxsIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImtpbGwiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImsiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ia2lsbCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMga2lsbCBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5raWxsPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImtpbGwiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gT3B0aW9ucyB1c2VkIGZvciBtdWx0aXBsZSBBY3Rpb25zIC0tPgorCTxiZWFuIGlkPSJub2RlSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibmlkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im5vZGVJZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTm9kZSBJRCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0ibm9kZS1pZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldE5vZGVCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkTm9kZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InJlbW92ZU5vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJzZXROb2RlQ2FwYWNpdHkiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGROb2RlVG9RdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFF1ZXVlc1dpdGhOb2RlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0icmVtb3ZlTm9kZUZyb21RdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldE5vZGVMb2FkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTxiZWFuIGlkPSJjYXBhY2l0eSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJjYXAiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iY2FwYWNpdHkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ik5vZGUgQ2FwYWNpdHkiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iaW50IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJjYXBhY2l0eSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImFkZE5vZGUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJzZXROb2RlQ2FwYWNpdHkiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InF1ZXVlTmFtZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJxbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJxdWV1ZU5hbWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlF1ZXVlIG5hbWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InF1ZXVlLW5hbWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJhZGRRdWV1ZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InJlbW92ZVF1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iYWRkTm9kZVRvUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROb2Rlc0luUXVldWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZW1vdmVOb2RlRnJvbVF1ZXVlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworICA8YmVhbiBpZD0iam9iSWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJqaWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJqb2JJZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJKb2IgSUQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJqb2ItaWQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorICAgICAgPGxpc3Q+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImdldEpvYkluZm8iIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgcDphY3Rpb25OYW1lPSJnZXRFeGVjTm9kZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgIDxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKyAgICAgICAgICBwOmFjdGlvbk5hbWU9ImtpbGwiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorICAgIDwvcHJvcGVydHk+CisgIDwvYmVhbj4KKworICAgICAgICA8YmVhbiBpZD0iZ2V0UXVldWVkSm9icyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICAgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InFqb2JzIiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0UXVldWVkSm9icyIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRRdWV1ZWRKb2JzIEFjdGlvbiIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+Z2V0UXVldWVkSm9iczwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCSAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0UXVldWVkSm9icyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPC9iZWFuPgorCisgICAgICAgIDxiZWFuIGlkPSJnZXROb2RlUmVwb3J0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisgICAgICAgICAgICAgICAgcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ibnJlcG9ydCIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldE5vZGVSZXBvcnQiIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0Tm9kZVJlcG9ydCBBY3Rpb24iIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXROb2RlUmVwb3J0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0Tm9kZVJlcG9ydCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPC9iZWFuPgorICAgICAgICA8YmVhbiBpZD0iZ2V0RXhlY1JlcG9ydCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorICAgICAgICAgICAgICAgIHA6aXNTdWJPcHRpb249InRydWUiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImVyZXBvcnQiIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRFeGVjUmVwb3J0IiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldEV4ZWNSZXBvcnQgQWN0aW9uIiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5nZXRFeGVjUmVwb3J0PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdD4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6YWN0aW9uTmFtZT0iZ2V0RXhlY1JlcG9ydCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3Q+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2pvYnMvZXhKb2IueG1sIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leEpvYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMGRlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2pvYnMvZXhKb2IueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczpqb2IgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIgaWQ9ImFiY2QiCisJbmFtZT0iVGVzdEpvYiI+CisJPGluc3RhbmNlQ2xhc3MKKwkJbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5leGFtcGxlcy5IZWxsb1dvcmxkSm9iIiAvPgorCTxpbnB1dENsYXNzCisJCW5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5OYW1lVmFsdWVKb2JJbnB1dCI+CisJCTxwcm9wZXJ0aWVzPgorCQkJPHByb3BlcnR5IG5hbWU9InVzZXIubmFtZSIgdmFsdWU9IkhvbWVyISIgLz4KKwkJPC9wcm9wZXJ0aWVzPgorCTwvaW5wdXRDbGFzcz4KKwk8cXVldWU+cXVpY2s8L3F1ZXVlPgorCTxsb2FkPjE8L2xvYWQ+Cis8L2Nhczpqb2I+CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9qb2JzL2V4TG9uZ0pvYi54bWwgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9qb2JzL2V4TG9uZ0pvYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiZWIyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2pvYnMvZXhMb25nSm9iLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6am9iIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiIGlkPSJhYmNkIgorCW5hbWU9IlRlc3RKb2IiPgorCTxpbnN0YW5jZUNsYXNzCisJCW5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuZXhhbXBsZXMuTG9uZ0pvYiIgLz4KKwk8aW5wdXRDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQiPgorCQk8cHJvcGVydGllcz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJ3YWl0IiB2YWx1ZT0iNjAiIC8+CisJCTwvcHJvcGVydGllcz4KKwk8L2lucHV0Q2xhc3M+CisJPHF1ZXVlPnF1aWNrPC9xdWV1ZT4KKwk8bG9hZD4xPC9sb2FkPgorPC9jYXM6am9iPgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leFBhbGluZHJvbWUueG1sIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leFBhbGluZHJvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzQwZjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9qb2JzL2V4UGFsaW5kcm9tZS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmpvYiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBpZD0ibm8tc3BhcmstMSIKKwluYW1lPSJObyBTcGFyayBKb2IiPgorCTxpbnN0YW5jZUNsYXNzCisJCW5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3BhcmsuZXhhbXBsZXMuTm9TcGFya0ZpbGVQYWxpbmRyb21lRXhhbXBsZSIgLz4KKwk8aW5wdXRDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQiPgorCQk8cHJvcGVydGllcz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0iJmx0O2lucHV0LWZpbGUmZ3Q7IiAvPgorCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dCIgdmFsdWU9IiZsdDtvdXRwdXQtZmlsZSZndDsiIC8+CisJCTwvcHJvcGVydGllcz4KKwk8L2lucHV0Q2xhc3M+CisJPHF1ZXVlPnF1aWNrPC9xdWV1ZT4KKwk8bG9hZD4xPC9sb2FkPgorPC9jYXM6am9iPgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leFNwYXJrSm9iLnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2pvYnMvZXhTcGFya0pvYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjMDJiOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2pvYnMvZXhTcGFya0pvYi54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmpvYiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBpZD0ic2NhbGEtMTIzNDUiCisJbmFtZT0iVGVzdFNwYXJrSm9iIj4KKwk8aW5zdGFuY2VDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzLlNjYWxhSGVsbG9Xb3JsZCIgLz4KKwk8aW5wdXRDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQiPgorCQk8cHJvcGVydGllcz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0iL1VzZXJzL21zdGFyY2gvZGVwbG95L3Rlc3QuZmlsZSIgLz4KKwkJPC9wcm9wZXJ0aWVzPgorCTwvaW5wdXRDbGFzcz4KKwk8cXVldWU+cXVpY2s8L3F1ZXVlPgorCTxsb2FkPjE8L2xvYWQ+Cis8L2Nhczpqb2I+CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9qb2JzL2V4U3BhcmtQYWxpbmRyb21lLnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2pvYnMvZXhTcGFya1BhbGluZHJvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NGY0OWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9qb2JzL2V4U3BhcmtQYWxpbmRyb21lLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6am9iIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiIGlkPSJzcGFyay0xIgorCW5hbWU9IlNwYXJrIEpvYiI+CisJPGluc3RhbmNlQ2xhc3MKKwkJbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zcGFyay5leGFtcGxlcy5TcGFya0ZpbGVQYWxpbmRyb21lRXhhbXBsZSIgLz4KKwk8aW5wdXRDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQiPgorCQk8cHJvcGVydGllcz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0iaGRmczovLyZsdDtob3N0Jmd0OzombHQ7cG9ydCZndDsvJmx0O2lucHV0LWZpbGUmZ3Q7IiAvPgorCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dCIgdmFsdWU9IiZsdDtvdXRwdXQtZmlsZSZndDsiIC8+CisJCTwvcHJvcGVydGllcz4KKwk8L2lucHV0Q2xhc3M+CisJPHF1ZXVlPnF1aWNrPC9xdWV1ZT4KKwk8bG9hZD4xPC9sb2FkPgorPC9jYXM6am9iPgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leFN0cmVhbWluZ1BhbGluZHJvbWUueG1sIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leFN0cmVhbWluZ1BhbGluZHJvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzY5NWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9qb2JzL2V4U3RyZWFtaW5nUGFsaW5kcm9tZS54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOmpvYiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBpZD0ic3RyZWFtaW5nLTEiCisJbmFtZT0iU3RyZWFtaW5nIEpvYiI+CisJPGluc3RhbmNlQ2xhc3MKKwkJbmFtZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zcGFyay5leGFtcGxlcy5TdHJlYW1pbmdQYWxpbmRyb21lRXhhbXBsZSIgLz4KKwk8aW5wdXRDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQiPgorCQk8cHJvcGVydGllcz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJob3N0IiB2YWx1ZT0iJmx0O2hvc3QmZ3Q7IiAvPgorCQkJPHByb3BlcnR5IG5hbWU9InBvcnQiIHZhbHVlPSImbHQ7cG9ydCZndDsiIC8+CisJCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0IiB2YWx1ZT0iJmx0O291dHB1dC1maWxlJmd0OyIgLz4KKwkJPC9wcm9wZXJ0aWVzPgorCTwvaW5wdXRDbGFzcz4KKwk8cXVldWU+cXVpY2s8L3F1ZXVlPgorCTxsb2FkPjE8L2xvYWQ+Cis8L2Nhczpqb2I+CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9ub2RlLXRvLXF1ZXVlLW1hcHBpbmcueG1sIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IwZWJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxjYXM6bm9kZS10by1xdWV1ZS1tYXBwaW5nIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxub2RlIGlkPSJsb2NhbGhvc3QiPgorCQk8cXVldWVzPgorCQkJPHF1ZXVlIG5hbWU9ImhpZ2giLz4KKwkJCTxxdWV1ZSBuYW1lPSJxdWljayIvPgorCQkJPHF1ZXVlIG5hbWU9ImxvbmciLz4KKwkJPC9xdWV1ZXM+CisJPC9ub2RlPgkKKzwvY2FzOm5vZGUtdG8tcXVldWUtbWFwcGluZz4KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL25vZGVzLnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL25vZGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Q0MTVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbm9kZXMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGNhczpyZXNvdXJjZW5vZGVzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxub2RlIG5vZGVJZD0ibG9jYWxob3N0IiBpcD0iaHR0cDovL2xvY2FsaG9zdDoyMDAxIiBjYXBhY2l0eT0iOCIvPgorCTwhLS0gRW52UmVwbGFjZSBFeGFtcGxlIAorCTxub2RlIG5vZGVJZD0ic29tZWhvc3QiIGlwPSJodHRwOi8vc29tZWhvc3Q6W0JBVENIX1NUVUJfUE9SVF0iIGNhcGFjaXR5PSI4IiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisJLS0+Cis8L2NhczpyZXNvdXJjZW5vZGVzPgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvcXVldWUtdG8tYmFja2VuZC1tYXBwaW5nLnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3F1ZXVlLXRvLWJhY2tlbmQtbWFwcGluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MDI1NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3F1ZXVlLXRvLWJhY2tlbmQtbWFwcGluZy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnF1ZXVlLXRvLWJhY2tlbmQtbWFwcGluZyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKwk8cXVldWUgbmFtZT0iZXhhbXBsZSI+CisJCTxzY2hlZHVsZXIgZmFjdG9yeT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuTFJVU2NoZWR1bGVyRmFjdG9yeSIvPgorCQk8bW9uaXRvciBmYWN0b3J5PSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuQXNzaWdubWVudE1vbml0b3JGYWN0b3J5Ii8+CisJCTxiYXRjaG1nciBmYWN0b3J5PSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLlhtbFJwY0JhdGNoTWdyRmFjdG9yeSIvPgorCTwvcXVldWU+Cis8L2NhczpxdWV1ZS10by1iYWNrZW5kLW1hcHBpbmc+CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkNjBjMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpAQCAtMCwwICsxLDY5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisKKyMgU3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgVGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlciwgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgZGVmYXVsdCBmaWxlIG91dHB1dCBpcyBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuID0gLi4vbG9ncy9jYXNfcmVzb3VyY2UlZy5sb2cKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxpbWl0ID0gNTAwMDAKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmNvdW50ID0gNQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuYXBwZW5kID0gdHJ1ZQoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgc3Vic3lzdGVtcworCisjIGJhdGNobWdyIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5sZXZlbCA9IElORk8KKworIyBtb25pdG9yIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmxldmVsID0gSU5GTworCisjIGpvYnF1ZXVlIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5sZXZlbCA9IElORk8KKworIyBzY2hlZHVsZXIgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5sZXZlbCA9IElORk8KKworIyBzeXN0ZW0gc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5sZXZlbCA9IEZJTkUKKworIyBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGNvbW1vbnMtaHR0cGNsaWVudCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHhtbHJwYyAKK29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmhlYWRlci5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5sZXZlbCA9IElORk8KKworIyBzcHJpbmcgZnJhbWV3b3JrIGxvZ2dpbmcKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLlByb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gU0VWRVJFCitvcmcuYXBhY2hlLm9vZHQuY2FzLmNyYXdsLnV0aWwuQ2FzUHJvcGVydHlQbGFjZWhvbGRlckNvbmZpZ3VyZXIubGV2ZWwgPSBTRVZFUkUKK3N1bi5uZXQubGV2ZWwgPSBTRVZFUkUKZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL21haW4vcmVzb3VyY2VzL3Jlc291cmNlLnByb3BlcnRpZXMgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9yZXNvdXJjZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Njc5NDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9tYWluL3Jlc291cmNlcy9yZXNvdXJjZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsODQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyMKKyMKKyMgUHJvcGVydGllcyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIFJlc291cmNlIE1hbmFnZXIKKworIyByZXNvdXJjZSBzcGFyayBtYXN0ZXIKK3Jlc291cmNlLnJ1bm5lci5zcGFyay5ob3N0ID0gbWVzb3M6Ly88aXA+OjUwNTAKKworIyByZXNvdXJjZSBiYXRjaG1nciBmYWN0b3J5CityZXNvdXJjZS5iYXRjaG1nci5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5YbWxScGNCYXRjaE1nckZhY3RvcnkKKworIyByZXNvdXJjZSBtb25pdG9yIGZhY3RvcnkKK3Jlc291cmNlLm1vbml0b3IuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Bc3NpZ25tZW50TW9uaXRvckZhY3RvcnkKKworIyByZXNvdXJjZSBzY2hlZHVsZXIgZmFjdG9yeQorcmVzb3VyY2Uuc2NoZWR1bGVyLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5MUlVTY2hlZHVsZXJGYWN0b3J5CisKKyMgcmVzb3VyY2Ugam9icXVldWUgZmFjdG9yeQorcmVzb3VyY2Uuam9icXVldWUuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iU3RhY2tKb2JRdWV1ZUZhY3RvcnkKKworIyByZXNvdXJjZSBqb2IgcmVwb3NpdG9yeSBmYWN0b3J5CityZXNvdXJjZS5qb2JyZXBvLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uTWVtb3J5Sm9iUmVwb3NpdG9yeUZhY3RvcnkKKworIyBGb3IgcXVldWUtbXVsdGlwbGV4aW5nIHNjaGVkdWxlcgorcmVzb3VyY2UuYmFja2VuZC5tdXgucmVwb3NpdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4LlhtbEJhY2tlbmRSZXBvc2l0b3J5RmFjdG9yeQorcmVzb3VyY2UuYmFja2VuZC5tdXgueG1scmVwb3NpdG9yeS5xdWV1ZXRvYmFja2VuZCA9IGZpbGU6Ly9bSE9NRV0vcXVldWUtdG8tYmFja2VuZC54bWwKKworCisjIG5vZGUgcmVwb3NpdG9yeSBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLnJlcG8uZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXJlcG8uWG1sTm9kZVJlcG9zaXRvcnlGYWN0b3J5CisKKyMgcXVldWUgcmVwb3NpdG9yeSBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcy5yZXBvLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwby5YbWxRdWV1ZVJlcG9zaXRvcnlGYWN0b3J5CisKKyMgcmVzb3VyY2Ugbm9kZXMgbW9uaXRvciBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLkdhbmdsaWFSZXNvdXJjZU1vbml0b3JGYWN0b3J5CisKKyMgZ2FuZ2xpYSByZXNvdXJjZSBtb25pdG9yJ3MgbG9hZCBjYWxjdWxhdG9yIGZhY3RvcnkKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEubG9hZGNhbGMuV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGNGYWN0b3J5CisKKyMgSm9iU3RhY2sgSm9iUXVldWUgY29uZmlnIHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuam9ic3RhY2subWF4c3RhY2tzaXplPTEwMDAKKworIyBYTUwgTFJVU2NoZWR1bGVyIGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci53YWl0LnNlY29uZHM9MjAKKworIyBYTUwtUlBDIGNvbmZpZ3VyYXRpb24gcHJvcHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLnhtbHJwYy5yZXF1ZXN0VGltZW91dC5taW51dGVzPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcz02MAorCisjIFhTdHJlYW0gSm9iUmVwbyBjb25maWd1cmF0aW9uIHByb3BzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8ueHN0cmVhbS53b3JraW5nLmRpcj1bSE9NRV0vam9iLXJlcG8KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby54c3RyZWFtLm1heC5oaXN0b3J5PTQwMDAKKworIyBYTUwgTm9kZSBSZXBvc2l0b3J5IGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLmRpcnM9ZmlsZTovL1tIT01FXS9ub2RlcyxmaWxlOi8vW0hPTUVdL25vZGVzMgorCisjIFhNTCBRdWV1ZSBSZXBvc2l0b3J5IGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGV0b3F1ZXVlcy5kaXJzPWZpbGU6Ly9bSE9NRV0vbm9kZXMsZmlsZTovL1tIT01FXS9ub2RlczIKKworIyBMb2FkIGNhbGN1bGF0aW9uIHdlaWdodHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQubG9hZG9uZT0xCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IubG9hZGNhbGMud2VpZ2h0LmxvYWRmaXZlPTUKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQubG9hZGZpZnRlZW49NQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmxvYWRjYWxjLndlaWdodC5tZW1mcmVlPTIKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQuc3dhcGZyZWU9MQorCisjZ2FuZ2xpYSBtZXRhIGRhZW1vbiAoZ21ldGFkKSBob3N0IGRldGFpbHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmdlbXRhZC5ob3N0LmFkZHJlc3M9bG9jYWxob3N0CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5nZW10YWQuaG9zdC5wb3J0PTg2NTEKKwpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1yZXNvdXJjZS5qcGcgYi8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLXJlc291cmNlLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFlZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1yZXNvdXJjZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1yZXNvdXJjZS5wc2QgYi8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvY2FzLXJlc291cmNlLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQzMjBiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy1yZXNvdXJjZS5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3JtX2V4dGVuc2lvbl9wb2ludHMucG5nIGIvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3JtX2V4dGVuc2lvbl9wb2ludHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzU0MmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcm1fZXh0ZW5zaW9uX3BvaW50cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3JtX29iamVjdF9tb2RlbC5wbmcgYi8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcm1fb2JqZWN0X21vZGVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg2MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3JtX29iamVjdF9tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3JtX3VzZV9jYXNlMS5qcGcgYi8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcm1fdXNlX2Nhc2UxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY1NWMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3JtX3VzZV9jYXNlMS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3ZWQ3ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJjYXMtcmVzb3VyY2UiPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICA8L2xpbmtzPgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJib3R0b20iLz4KKyAgICA8bWVudSBuYW1lPSJTb2Z0d2FyZSBEb2N1bWVudGF0aW9uIj4KKyAgICAgIDxpdGVtIG5hbWU9IlVzZXIgR3VpZGUiIGhyZWY9InVzZXIvIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3hkb2MvdXNlci9pbmRleC54bWwgYi8wLjEwL3Jlc291cmNlL3NyYy9zaXRlL3hkb2MvdXNlci9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZDhjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL3NpdGUveGRvYy91c2VyL2luZGV4LnhtbApAQCAtMCwwICsxLDQ5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisgICA8cHJvcGVydGllcz4KKyAgICAgIDx0aXRsZT5DQVMgUmVzb3VyY2UgTWFuYWdlciBVc2VyIEd1aWRlPC90aXRsZT4KKyAgICAgIDxhdXRob3IgZW1haWw9IkNocmlzLk1hdHRtYW5uQGpwbC5uYXNhLmdvdiI+Q2hyaXMgTWF0dG1hbm48L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAgICA8c2VjdGlvbiBuYW1lPSJVc2VyIEd1aWRlIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgVGhpcyBpcyB0aGUgdXNlciBndWlkZSBmb3IgdGhlIE9PRFQgQ2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2aWNlIChDQVMpIFJlc291cmNlIE1hbmFnZXIgCisgICAgICAgICAgY29tcG9uZW50LCBvciBSZXNvdXJjZSBNYW5hZ2VyIGZvciBzaG9ydC4gVGhpcyBndWlkZSBleHBsYWlucyB0aGUgUmVzb3VyY2UgTWFuYWdlciBhcmNoaXRlY3R1cmUgCisgICAgICAgICAgaW5jbHVkaW5nIGl0cyBleHRlbnNpb24gcG9pbnRzLiBUaGUgZ3VpZGUgYWxzbyBkaXNjdXNzZXMgYXZhaWxhYmxlIHNlcnZpY2VzIHByb3ZpZGVkIAorICAgICAgICAgIGJ5IHRoZSBSZXNvdXJjZSBNYW5hZ2VyLCBob3cgdG8gdXRpbGl6ZSB0aGVtLCBhbmQgdGhlIGRpZmZlcmVudCBBUElzIHRoYXQgZXhpc3QuIFRoZSBndWlkZSAKKyAgICAgICAgICBjb25jbHVkZXMgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIFJlc291cmNlIE1hbmFnZXIgdXNlIGNhc2VzLgorICAgICAgICA8L3A+ICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkFyY2hpdGVjdHVyZSI+CisgICAgICAgIDxwPlRoZSBSZXNvdXJjZSBNYW5hZ2VyIGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW9uLCBtb25pdG9yaW5nIGFuZCB0cmFja2luZyBvZiBqb2JzLAorICAgICAgICBzdG9yYWdlIGFuZCBuZXR3b3JraW5nIHJlc291cmNlcyBmb3IgYW4gdW5kZXJseWluZyBzZXQgb2YgaGFyZHdhcmUgcmVzb3VyY2VzLiBUaGUgUmVzb3VyY2UgTWFuYWdlciBpcyBhbiAKKyAgICAgICAgZXh0ZW5zaWJsZSBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhbiBYTUwtUlBDIGV4dGVybmFsIGludGVyZmFjZSwgYW5kIGEgZnVsbHkgCisgICAgICAgIHRhaWxvcmFibGUgSmF2YS1iYXNlZCBBUEkgZm9yIHJlc291cmNlIG1hbmFnZW1lbnQuIFRoZSBjcml0aWNhbCBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIFJlc291cmNlIAorICAgICAgICBNYW5hZ2VyIGluY2x1ZGU6PC9wPgorICAgICAgICAKKyAgICAgICAgPHVsPgorICAgICAgICAgPGxpPkpvYiAtIGFuIGFic3RyYWN0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGV4ZWN1dGlvbiB1bml0LCB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhbiAKKyAgICAgICAgIHVuZGVybHlpbmcgcHJvZ3JhbSwgb3IgZXhlY3V0aW9uIHRoYXQgbXVzdCBiZSBydW4gb24gc29tZSBoYXJkd2FyZSBub2RlLCBpbmNsdWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIAorICAgICAgICAgSm9iIElucHV0IHRoYXQgdGhlIEpvYiByZXF1aXJlcywgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGpvYiBsb2FkLCBhbmQgdGhlIHF1ZXVlIHRoYXQgdGhlIGpvYiBzaG91bGQKKyAgICAgICAgIGJlIHN1Ym1pdHRlZCB0by48L2xpPgorICAgICAgICAgPGxpPkpvYiBJbnB1dCAtIGFuIGFic3RyYWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCB0aGF0IGEgSm9iIHJlcXVpcmVzLjwvbGk+CisgICAgICAgICA8bGk+Sm9iIFNwZWMgLSBhIGNvbXBsZXRlIHNwZWNpZmljYXRpb24gb2YgYSBKb2IsIGluY2x1ZGluZyBpdHMgSm9iIElucHV0LCBhbmQgdGhlIEpvYiBkZWZpbml0aW9uCisgICAgICAgICBpdHNlbGYuPC9saT4KKyAgICAgICAgIDxsaT5Kb2IgSW5zdGFuY2UgLSB0aGUgcGh5c2ljYWwgY29kZSB0aGF0IHBlcmZvcm1zIHRoZSB1bmRlcmx5aW5nIGpvYiBleGVjdXRpb24uPC9saT4KKyAgICAgICAgIDxsaT5SZXNvdXJjZSBOb2RlIC0gYW4gYXZhaWxhYmxlIGV4ZWN1dGlvbiBub2RlIHRoYXQgYSBKb2IgaXMgc2VudCB0byBieSB0aGUgUmVzb3VyY2UgTWFuYWdlci48L2xpPgorICAgICAgICA8L3VsPgorCisgICAgICAgIDxwPkVhY2ggSm9iIFNwZWMgY29udGFpbnMgZXhhY3RseSAxIEpvYiwgYW5kIEpvYiBJbnB1dC4gRWFjaCBKb2IgSW5wdXQgaXMgcHJvdmlkZWQgdG8gYSBzaW5nbGUgSm9iLgorICAgICAgICBFYWNoIEpvYiBkZXNjcmliZXMgYSBzaW5nbGUgSm9iIEluc3RhbmNlLiBBbmQgZmluYWxseSwgZWFjaCBKb2IgaXMgc2VudCB0byBleGFjdGx5IG9uZSBSZXNvdXJjZSBOb2RlLgorICAgICAgICBUaGVzZSByZWxhdGlvbnNoaXBzIGFyZSBzaG93biBpbiB0aGUgYmVsb3cgZmlndXJlLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcm1fb2JqZWN0X21vZGVsLnBuZyIgYWx0PSJSZXNvdXJjZSBNYW5hZ2VyIE9iamVjdCBNb2RlbCIvPiAKKyAgICAgIAorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJFeHRlbnNpb24gUG9pbnRzIj4KKyAgICAgICAgICA8cD4KKyAgICAgICAgICBUaGVyZSBhcmUgc2V2ZXJhbCBleHRlbnNpb24gcG9pbnRzIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdlci4gQW4gZXh0ZW5zaW9uIHBvaW50IGlzIGFuIGludGVyZmFjZSAKKyAgICAgICAgICB3aXRoaW4gdGhlIFJlc291cmNlIE1hbmFnZXIgdGhhdCBjYW4gaGF2ZSBtYW55IGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gCisgICAgICAgICAgaXQgY29tZXMgdG8gc29mdHdhcmUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBpdCBhbGxvd3MgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBhbiAKKyAgICAgICAgICBleGlzdGluZyBpbnRlcmZhY2UgdG8gYmUgc2VsZWN0ZWQgYXQgZGVwbG95bWVudCB0aW1lLiBTbywgdGhlIFJlc291cmNlIE1hbmFnZXIgY29tcG9uZW50IG1heSAKKyAgICAgICAgICBzdWJtaXQgSm9icyB0byBhIGN1c3RvbSBYTUwtUlBDIGJhdGNoIHN1Ym1pc3Npb24gc3lzdGVtLCBvciBpdCBtYXkgdXNlIGFuIGF2YWlsYWJsZSBvZmYtdGhlLXNoZWxmIAorICAgICAgICAgIGJhdGNoIHN1Ym1pc3Npb24gc3lzdGVtLCBzdWNoIGFzIExTRiBvciBMb2FkLVNoYXJlLiBUaGUgc2VsZWN0aW9uICBvZiB0aGUgYWN0dWFsIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMgCisgICAgICAgICAgaXMgaGFuZGxlZCBlbnRpcmVseSBieSB0aGUgZXh0ZW5zaW9uIHBvaW50IG1lY2hhbmlzbS4gVXNpbmcgZXh0ZW5zaW9uIHBvaW50cywgaXQgaXMgZmFpcmx5IHNpbXBsZSB0byBzdXBwb3J0IAorICAgICAgICAgIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHdoYXQgYXJlIHR5cGljYWxseSByZWZlcnJlZCB0byBhcyAicGx1Zy1pbiBhcmNoaXRlY3R1cmVzIiBFYWNoIG9mIHRoZSBjb3JlIGV4dGVuc2lvbiAKKyAgICAgICAgICBwb2ludHMgZm9yIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIGlzIGRlc2NyaWJlZCBiZWxvdzo8L3A+CisgICAgICAgICAgCisgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+QmF0Y2ggTWFuYWdlcjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD5UaGUgQmF0Y2ggTWFuYWdlciBleHRlbnNpb24gcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgSm9icyB0byB0aGUgYWN0dWFsIG5vZGVzCisgICAgICAgICAgICAgIHRoYXQgdGhlIFJlc291cmNlIE1hbmFnZXIgZGV0ZXJtaW5lcyB0aGF0IGl0IGlzIGFwcHJvcHJpYXRlIHRoYXQgdGhleSBleGVjdXRlIG9uLiBBIEJhdGNoIE1hbmFnZXIKKyAgICAgICAgICAgICAgdHlwaWNhbGx5IGluY2x1ZGVzIGEgY2xpZW50IHNlcnZpY2UsIHRvIGNvbW11bmljYXRlIHdpdGggcmVtb3RlICJzdHVicyIsIHdoaWNoIHJ1biBvbiB0aGUgbG9jYWwKKyAgICAgICAgICAgICAgY29tcHV0ZSBub2RlcywgYW5kIGFjdHVhbCBoYW5kbGUgdGhlIHBoeXNpY2FsIGV4ZWN1dGlvbiBvZiB0aGUgcHJvdmlkZWQgSm9icy4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5Kb2IgUXVldWU8L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIEpvYiBRdWV1ZSBleHRlbnNpb24gcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIHF1ZXVlaW5nIHVwIEpvYnMgd2hlbiB0aGUgUmVzb3VyY2UgTWFuYWdlcgorICAgICAgICAgICAgICBkZXRlcm1pbmVzIHRoYXQgdGhlcmUgYXJlIG5vIFJlc291cmNlIE5vZGVzIGF2YWlsYWJsZSB0byBleGVjdXRlIHRoZSBKb2Igb24uIENhcGFiaWxpdGllcyBzdWNoIGFzCisgICAgICAgICAgICAgIHBlcnNpc3RlbmNlLCBhbmQgcXVldWVpbmcgcG9saWN5IChlLmcuLCBMUlUsIEZJRk8pIGFyZSBhbGwgZGVhbHQgd2l0aCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludC48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPkpvYiBSZXBvc2l0b3J5PC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBKb2IgUmVwb3NpdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgYWN0dWFsIHBlcnNpc3RhbmNlIG9mIGEgSm9iLCB0aHJvdWdob3V0IGl0cyBsaWZlY3ljbGUgaW4KKyAgICAgICAgICAgICAgdGhlIFJlc291cmNlIE1hbmFnZXIuIEEgSm9iIFJlcG9zaXRvcnkgd291bGQgaGFuZGxlIHRoZSBhYmlsaXR5IHRvIHJldHJpZXZlIEpvYiBhbmQgSm9iIFNwZWMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgd2hldGhlciB0aGUgSm9iIGlzIHF1ZXVlZCwgb3IgZXhlY3V0aW5nLCBvciBmaW5pc2hlZC48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPk1vbml0b3I8L3RkPgorICAgICAgICAgICAgICA8dGQ+VGhlIE1vbml0b3IgZXh0ZW5zaW9uIHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBtb25pdG9yaW5nIHRoZSBleGVjdXRpb24gb2YgYSBKb2Igb25jZSBpdCBoYXMgYmVlbiBzZW50IHRvIGEKKyAgICAgICAgICAgICAgUmVzb3VyY2UgTm9kZSBieSB0aGUgQmF0Y2ggTWFuYWdlciBleHRlbnNpb24gcG9pbnQuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD5Kb2IgU2NoZWR1bGVyPC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBKb2IgU2NoZWR1bGVyIGV4dGVuc2lvbiBwb2ludCBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGF2YWlsYWJpbGl0eSBvZiB1bmRlcmx5aW5nIFJlc291cmNlIE5vZGVzCisgICAgICAgICAgICAgIG1hbmFnZWQgYnkgdGhlIFJlc291cmNlIE1hbmFnZXIsIGFuZCBkZXRlcm1pbmluZyB0aGUgcG9saWN5IGZvciBwdWxsaW5nIEpvYnMgb2ZmIG9mIHRoZSBKb2IgUXVldWUgdG8gc2NoZWR1bGUKKyAgICAgICAgICAgICAgZm9yIGV4ZWN1dGlvbiwgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgSm9iIFJlcG9zaXRvcnksIHRoZSBCYXRjaCBNYW5hZ2VyLCB0aGUgTW9uaXRvciwgYW5kIG5lYXJseSBhbGwgb2YgdGhlCisgICAgICAgICAgICAgIHVuZGVybHlpbmcgZXh0ZW5zaW9uIHBvaW50cyBpbiB0aGUgUmVzb3VyY2UgTWFuYWdlci4gPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+U3lzdGVtPC90ZD4KKyAgICAgICAgICAgICAgPHRkPlRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCBwcm92aWRlcyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIAorICAgICAgICAgICAgICBzZXJ2aWNlcy4gVGhpcyBpbmNsdWRlcyB0aGUgUmVzb3VyY2UgTWFuYWdlciBzZXJ2ZXIgaW50ZXJmYWNlLCBhcyB3ZWxsIGFzIHRoZSBhc3NvY2lhdGVkIAorICAgICAgICAgICAgICBSZXNvdXJjZSBNYW5hZ2VyIGNsaWVudCBpbnRlcmZhY2UsIHRoYXQgY29tbXVuaWNhdGVzIHdpdGggdGhlIHNlcnZlci4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+ICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgCisgICAgICAgICAgPHA+VGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgZXh0ZW5zaW9uIHBvaW50cyBmb3IgdGhlIFJlc291cmNlIE1hbmFnZXIgYXJlIHNob3duIGluIHRoZSBiZWxvdworICAgICAgICAgIEZpZ3VyZS4KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgCisgICAgICAgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9ybV9leHRlbnNpb25fcG9pbnRzLnBuZyIgYWx0PSJSZXNvdXJjZSBNYW5hZ2VyIEV4dGVuc2lvbiBQb2ludHMiLz4KKyAgICAgICAgCisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iS2V5IENhcGFiaWxpdGllcyI+CisgICAgICAgIDxwPlRoZSBSZXNvdXJjZSBNYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgdGhlIG5lY2Vzc2FyeSBrZXkgY2FwYWJpbGl0aWVzIGZvciBtYW5hZ2luZyAKKyAgICAgICAgam9iIGV4ZWN1dGlvbiBhbmQgdW5kZXJseWluZyBoYXJkd2FyZSByZXNvdXJjZXMuIEVhY2ggaGlnaCBsZXZlbCBjYXBhYmlsaXR5IHByb3ZpZGVkIGJ5IHRoZSBSZXNvdXJjZSAKKyAgICAgICAgTWFuYWdlciBpcyBkZXRhaWxlZCBiZWxvdzo8L3A+CisgICAgICAgIAorICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPkVhc3kgZXhlY3V0aW9uIC0gb2YgY29tcHV0ZSBqb2JzIHRvIGhldGVyb2dlbmVvdXMgY29tcHV0aW5nIHJlc291cmNlcywgd2l0aCB2ZXJ5IGRpZmZlcmVudCB1bmRlcmx5aW5nCisgICAgICAgICAgc3BlY2lmaWNhdGlvbnM6IGxhcmdlIGFuZCBzbWFsbCBkaXNrcywgbmV0d29yayBmaWxlIHN0b3JhZ2UsIHN0b3JhZ2UgYXJlYSBuZXR3b3JrcywgYW5kIGV4b3RpYyBwcm9jZXNzb3IKKyAgICAgICAgICBhcmNoaXRlY3R1cmVzLjwvbGk+CisgICAgICAgICAgPGxpPkNsdXN0ZXIgTWFuYWdlbWVudCBQbHVnZ2FiaWxpdHkgLSB0aGUgYWJpbGl0eSB0byBwbHVnIGludG8gZXhpc3RpbmcgYmF0Y2ggc3VibWlzc2lvbiBzeXN0ZW1zIChlLmcuLCBUb3JxdWUsIExTRiksIGFuZCAKKyAgICAgICAgICByZXNvdXJjZSBtb25pdG9yaW5nIChlLmcuLCBHYW5nbGlhKS48L2xpPgorICAgICAgICAgIDxsaT5TY2FsYWJpbGl0eSDigJMgVGhlIFJlc291cmNlIE1hbmFnZXIgdXNlcyB0aGUgcG9wdWxhciBjbGllbnQtc2VydmVyIHBhcmFkaWdtLCBhbGxvd2luZyBuZXcgUmVzb3VyY2UgTWFuYWdlciAKKyAgICAgICAgICBzZXJ2ZXJzIHRvIGJlIGluc3RhbnRpYXRlZCwgYXMgbmVlZGVkLCB3aXRob3V0IGFmZmVjdGluZyB0aGUgUmVzb3VyY2UgTWFuYWdlciBjbGllbnRzLCBhbmQgdmljZS12ZXJzYS4gPC9saT4KKyAgICAgICAgICA8bGk+Q29tbXVuaWNhdGlvbiBvdmVyIGxpZ2h0d2VpZ2h0LCBzdGFuZGFyZCBwcm90b2NvbHMg4oCTIFRoZSBSZXNvdXJjZSBNYW5hZ2VyIHVzZXMgWE1MLVJQQywgYXMgaXRzIG1haW4gCisgICAgICAgICAgZXh0ZXJuYWwgaW50ZXJmYWNlLCBiZXR3ZWVuIFJlc291cmNlIE1hbmFnZXIgY2xpZW50IGFuZCBzZXJ2ZXIuIFhNTC1SUEMsIHRoZSBsaXR0bGUgYnJvdGhlciBvZiBTT0FQLCBpcyAKKyAgICAgICAgICBmYXN0LCBleHRlbnNpYmxlLCBhbmQgdXNlcyB0aGUgdW5kZXJseWluZyBIVFRQIHByb3RvY29sIGZvciBkYXRhIHRyYW5zZmVyLjwvbGk+CisgICAgICAgICAgPGxpPldyYXBwaW5nIC0gdGhlIHVzZSBvZiB3cmFwcGVycyB0byBpbnN1bGF0ZSB0aGUgaW50ZXJuYWwgY29kZSBvZiBKb2IgSW5zdGFuY2VzIGZyb20gdGhlaXIgZXh0ZXJuYWwgaW50ZXJmYWNlcworICAgICAgICAgIGFsbG93cyBhIHZhcmlldHkgb2YgZGlmZmVyZW50IHBvcHVsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIChlLmcuLCBzaGVsbCBzY3JpcHRpbmcsIEphdmEsIFB5dGhvbiwgUGVybCwgUnVieSkgdG8gYmUKKyAgICAgICAgICB1c2VkIHRvIGltcGxlbWVudCB0aGUgYWN0dWFsIGpvYi48L2xpPgorICAgICAgICAgIDxsaT5TY2hlZHVsZXIgUGx1Z2dhYmlsaXR5IC0gdGhlIGFiaWxpdHkgdG8gZGVmaW5lIHRoZSB1bmRlcmx5aW5nIGpvYiBzY2hlZHVsaW5nIHBvbGljeS48L2xpPgorICAgICAgICAgIDxsaT5YTUwtYmFzZWQgam9iIGRlc2NyaXB0aW9uIC0gYWxsb3dzIGZvciBleGlzdGluZyBYTUwtYmFzZWQgZWRpdGluZyB0b29scyB0byB2aXN1YWxpemUgdGhlIGRpZmZlcmVudCBqb2IKKyAgICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZm9yIHN0YW5kYXJkIGpvYiBkZWZpbml0aW9ucywgYW5kIGludGVyY2hhbmdlLjwvbGk+CisgICAgICAgICA8L29sPgorICAgICAgICAgIAorICAgICAgICAgIDxwPlRoaXMgY2FwYWJpbGl0eSBzZXQgaXMgbm90IGV4aGF1c3RpdmUsIGFuZCBpcyBtZWFudCB0byBnaXZlIHRoZSB1c2VyIGEgImZlZWwiIGZvciB3aGF0IAorICAgICAgICAgIGdlbmVyYWwgZmVhdHVyZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBSZXNvdXJjZSBNYW5hZ2VyLiBNb3N0IGxpa2VseSB0aGUgdXNlciB3aWxsIGZpbmQgdGhhdCB0aGUgCisgICAgICAgICAgUmVzb3VyY2UgTWFuYWdlciBwcm92aWRlcyBtYW55IG90aGVyIGNhcGFiaWxpdGllcyBiZXNpZGVzIHRob3NlIGRlc2NyaWJlZCBoZXJlLjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDdXJyZW50IEV4dGVuc2lvbiBQb2ludCBJbXBsZW1lbnRhdGlvbnMiPgorICAgICAgICAKKyAgICAgICAgIDxwPlRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgb2YgdGhlIGFmb3JlbWVudGlvbmVkIGV4dGVuc2lvbiBwb2ludHMgZm9yIAorICAgICAgICAgdGhlIFJlc291cmNlIE1hbmFnZXIuIEVhY2ggZXh0ZW5zaW9uIHBvaW50IGltcGxlbWVudGF0aW9uIGlzIGRldGFpbGVkIGJlbG93OjwvcD4KKyAgICAgICAgICAgIAorICAgICAgICAgPHVsPgorICAgICAgICAgICA8bGk+PGI+QmF0Y2ggTWFuYWdlcjwvYj48YnIvPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgIDxsaT5YTUwtUlBDIGJhc2VkIEJhdGNoIE1hbmFnZXIg4oCTIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBCYXRjaCBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludCB0aGF0IHVzZXMKKyAgICAgICAgICAgICBhIGN1c3RvbSwgbGlnaHQtd2VpZ2h0IFhNTC1SUEMgQmF0Y2ggU3VibWlzc2lvbiBzeXN0ZW0sIGFuZCBiYXRjaCBzdHVicyBkZXBsb3llZCBvbiBlYWNoIG9mIHRoZSBSZXNvdXJjZQorICAgICAgICAgICAgIE5vZGVzLjwvbGk+CisgICAgICAgICAgIDwvb2w+CisgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgIDxsaT48Yj5Kb2IgUXVldWU8L2I+PGJyLz4KKyAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICA8bGk+U3RhY2sgYmFzZWQgSm9iIFF1ZXVlIC0gYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEpvYiBRdWV1ZSBleHRlbnNpb24gcG9pbnQgdGhhdCB1c2VzIGEgY29tbW9uCisgICAgICAgICAgICAgICBTdGFjayBkYXRhIHN0cnVjdHVyZSB0byBxdWV1ZSB1cCBKb2JzIGluIG1lbW9yeS4KKyAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgPGxpPjxiPkpvYiBSZXBvc2l0b3J5PC9iPjxici8+CisgICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgPGxpPk1lbW9yeSBiYXNlZCBKb2IgUmVwb3NpdG9yeSAtIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKb2IgUmVwb3NpdG9yeSBleHRlbnNpb24gcG9pbnQgdGhhdCB1c2VzCisgICAgICAgICAgICAgICBhbiBpbiBtZW1vcnkgcGVyc2lzdGFuY2UgbGF5ZXIgdG8gcmVjb3JkIEpvYiBhbmQgSm9iIFNwZWMgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgIDwvb2w+CisgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgIDxsaT48Yj5Nb25pdG9yPC9iPjxici8+CisgICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgPGxpPkFzc2lnbm1lbnQgSm9iIE1vbml0b3IgLSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTW9uaXRvciBleHRlbnNpb24gcG9pbnQgdGhhdCB1c2VzIGludGVybmFsIHByb2ZpbGluZworICAgICAgICAgICAgICAgdG8ga2VlcCB0cmFjayBvZiBKb2Igc3RhdHVzLCBhbmQgUmVzb3VyY2UgTm9kZSBsb2FkLgorICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICA8L2xpPiAgICAgICAgICAgCisgICAgICAgICAgIDxsaT48Yj5Kb2IgU2NoZWR1bGVyPC9iPjxici8+CisgICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgPGxpPkxSVSBiYXNlZCBTY2hlZHVsZXIgLSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2NoZWR1bGVyIGV4dGVuc2lvbiBwb2ludCB0aGF0IHVzZXMgYSAKKyAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FjaGVfYWxnb3JpdGhtcyI+TGVhc3QgUmVjZW50bHkgVXNlZCAoTFJVKTwvYT4gYXBwcm9hY2gKKyAgICAgICAgICAgICAgIHRvIHNlbGVjdGluZyBKb2JzIGZvciBzdWJtaXNzaW9uIHRvIHRoZSBCYXRjaCBNYW5hZ2VyLgorICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICA8L2xpPiAKKyAgICAgICAgICAgPGxpPjxiPlN5c3RlbSAoUmVzb3VyY2UgTWFuYWdlciBjbGllbnQgYW5kIFJlc291cmNlIE1hbmFnZXIgc2VydmVyKTwvYj48YnIvPgorICAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgIDxsaT5YTUwtUlBDIGJhc2VkIFJlc291cmNlIE1hbmFnZXIgc2VydmVyIOKAkyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgc2VydmVyIGludGVyZmFjZQorICAgICAgICAgICAgICAgZm9yIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIHRoYXQgdXNlcyBYTUwtUlBDIGFzIHRoZSB0cmFuc3BvcnRhdGlvbiBtZWRpdW0uCisgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgPGxpPlhNTC1SUEMgYmFzZWQgUmVzb3VyY2UgTWFuYWdlciBjbGllbnQg4oCTIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgaW50ZXJmYWNlIGZvciB0aGUgCisgICAgICAgICAgICAgICBYTUwtUlBDIFJlc291cmNlIE1hbmFnZXIgc2VydmVyIHRoYXQgdXNlcyBYTUwtUlBDIGFzIHRoZSB0cmFuc3BvcnRhdGlvbiBtZWRpdW0uCisgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgIDwvb2w+CisgICAgICAgICAgIDwvbGk+ICAgICAgICAgICAgCQorICAgICAgICAgICA8L3VsPiAgCisgICAgICAgIAorICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyYXRpb24gYW5kIEluc3RhbGxhdGlvbiI+CisgICAgICAgPHA+CisgICAgICAgVG8gaW5zdGFsbCB0aGUgUmVzb3VyY2UgTWFuYWdlciwgeW91IG5lZWQgdG8gZG93bmxvYWQgYSA8YSBocmVmPSIuLi8uLi8iPnJlbGVhc2U8L2E+CisgICAgICAgb2YgdGhlIFJlc291cmNlIE1hbmFnZXIsIGF2YWlsYWJsZSBmcm9tIGl0cyBob21lIHdlYiBzaXRlLiBGb3IgYmxlZWRpbmctZWRnZSBmZWF0dXJlcywgeW91IGNhbgorICAgICAgIGFsc28gY2hlY2sgb3V0IHRoZSByZXNvdXJjZSB0cnVuayBwcm9qZWN0IGZyb20gdGhlIE9PRFQgc3VidmVyc2lvbiByZXBvc2l0b3J5LiBZb3UgY2FuIGJyb3dzZSAKKyAgICAgICB0aGUgcmVwb3NpdG9yeSB1c2luZyBWaWV3Q1ZTLCBsb2NhdGVkIGF0OjwvcD4KKyAgICAgICAKKyAgICAgICA8c2NyZWVuPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC88L3NjcmVlbj4KKyAgICAgICAKKyAgICAgICA8cD5UaGUgYWN0dWFsIHdlYiB1cmwgZm9yIHRoZSByZXBvc2l0b3J5IGlzIGxvY2F0ZWQgYXQ6PC9wPgorICAgICAgIAorICAgICAgIDxzY3JlZW4+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90cnVuay9yZXNvdXJjZTwvc2NyZWVuPgorCisgICAgICAgPHA+VG8gY2hlY2sgb3V0IHRoZSBSZXNvdXJjZSBNYW5hZ2VyLCB1c2UgeW91ciBmYXZvcml0ZSBTdWJ2ZXJzaW9uIGNsaWVudC48L3A+ICAgCisgICAgICAKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlByb2plY3QgT3JnYW5pemF0aW9uIj4KKyAgICAgICAgPHA+CisgICAgICAgVGhlIGNhcy1yZXNvdXJjZSBwcm9qZWN0IGZvbGxvd3MgdGhlIHRyYWRpdGlvbmFsIFN1YnZlcnNpb24tc3R5bGUgPGNvZGU+dHJ1bms8L2NvZGU+LCA8Y29kZT50YWc8L2NvZGU+CisgICAgICAgYW5kIDxjb2RlPmJyYW5jaGVzPC9jb2RlPiBmb3JtYXQuIFRydW5rIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXRlc3QgYW5kIGdyZWF0ZXN0IGRldmVsb3BtZW50IG9uIHRoZQorICAgICAgIGNhcy1yZXNvdXJjZS4gVGFncyBhcmUgb2ZmaWNpYWwgcmVsZWFzZSB2ZXJzaW9ucyBvZiB0aGUgcHJvamVjdC4gQnJhbmNoZXMgY29ycmVzcG9uZCB0byBkZXZpYXRpb25zIAorICAgICAgIGZyb20gdGhlIHRydW5rIGxhcmdlIGVub3VnaCB0byB3YXJyYW50IGEgc2VwYXJhdGUgZGV2ZWxvcG1lbnQgdHJlZS4gPC9wPgorCisgICAgICAgPHA+Rm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHRoZSBVc2VyIEd1aWRlLCB3ZSdsbCBhc3N1bWUgeW91IGFscmVhZHkgaGF2ZSBkb3dubG9hZGVkIGEgYnVpbHQgcmVsZWFzZQorICAgICAgIG9mIHRoZSBSZXNvdXJjZSBNYW5hZ2VyLCBmcm9tIGl0cyB3ZWIgc2l0ZS4gSWYgeW91IHdlcmUgYnVpbGRpbmcgY2FzLXJlc291cmNlIGZyb20gdGhlIHRydW5rLCBhIHRhZ2dlZCByZWxlYXNlIAorICAgICAgIChvciBicmFuY2gpIHRoZSBwcm9jZXNzIHdvdWxkIGJlIHF1aXRlIHNpbWlsYXIuIFRvIGJ1aWxkIGNhcy1yZXNvdXJjZSwgeW91IHdvdWxkIG5lZWQgdGhlIEFwYWNoZSBNYXZlbiAKKyAgICAgICBzb2Z0d2FyZS4gTWF2ZW4gaXMgYW4gWE1MLWJhc2VkLCBwcm9qZWN0IG1hbmFnZW1lbnQgc3lzdGVtIHNpbWlsYXIgdG8gQXBhY2hlIEFudCwgYnV0IHdpdGggbWFueSBleHRyYSAKKyAgICAgICBiZWxscyBhbmQgd2hpc3RsZXMuIE1hdmVuIG1ha2VzIGNyb3NzLXBsYXRmb3JtIHByb2plY3QgZGV2ZWxvcG1lbnQgYSBzbmFwLiBZb3UgY2FuIGRvd25sb2FkIE1hdmVuIGZyb206CisKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnIj5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvYT4KKworICAgICAgIEFsbCBjYXMtcmVzb3VyY2UgcmVsZWFzZXMgcG9zdCAxLjAuMSBhcmUgbm93IDxiPk1hdmVuIDIgY29tcGF0aWJsZTwvYj4uIFRoaXMgaXMgPGI+dmVyeTwvYj4gaW1wb3J0YW50LiAKKyAgICAgICBUaGF0IG1lYW5zIHRoYXQgaWYgeW91IGhhdmUgYW55IGNhcy1yZXNvdXJjZSByZWxlYXNlID4gMS4wLjEsIHlvdSB3aWxsIG5lZWQgTWF2ZW4gMiB0byBjb21waWxlIHRoZSBzb2Z0d2FyZSwgCisgICAgICAgYW5kIE1hdmVuIDEgd2lsbCBubyBsb25nZXIgd29yay48L3A+CisgICAgICAgCisgICAgICAgPHA+Rm9sbG93IHRoZSBwcm9jZWR1cmVzIGluIHRoZSBiZWxvdyBTZWN0aW9ucyB0byBidWlsZCBhIGZyZXNoIGNvcHkgb2YgdGhlIFJlc291cmNlIE1hbmFnZXIuIFRoZXNlIHByb2NlZHVyZXMKKyAgICAgICBhcmUgc3BlY2lmaWNhbGx5IHRhcmdldGVkIG9uIHVzaW5nIE1hdmVuIDIgdG8gYnVpbGQgdGhlIHNvZnR3YXJlOiAKKyAgICAgICAgPC9wPiAgICAgICAgCisgICAgIAorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJCdWlsZGluZyB0aGUgUmVzb3VyY2UgTWFuYWdlciI+CisgICAgICAgIDxwPgorICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgIDxsaT5jZCB0byBjYXMtcmVzb3VyY2UsIGFuZCB0aGVuIHR5cGU6CisgICAgICAgICAgIDxzb3VyY2U+IyBtdm4gcGFja2FnZTwvc291cmNlPgorICAgICAgICAgICBUaGlzIHdpbGwgcGVyZm9ybSBzZXZlcmFsIHRhc2tzLCBpbmNsdWRpbmcgY29tcGlsaW5nIHRoZSBzb3VyY2UgY29kZSwgZG93bmxvYWRpbmcgCisgICAgICAgICAgIHJlcXVpcmVkIGphciBmaWxlcywgcnVubmluZyB1bml0IHRlc3RzLCBhbmQgc28gb24uIFdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLCBjZCAKKyAgICAgICAgICAgdG8gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gZGlyZWN0b3J5IHdpdGhpbiBjYXMtcmVzb3VyY2UuIFRoaXMgd2lsbCAKKyAgICAgICAgICAgY29udGFpbiB0aGUgYnVpbGQgb2YgdGhlIFJlc291cmNlIE1hbmFnZXIgY29tcG9uZW50LCBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisgICAgICAgICAgIAorICAgICAgICAgICA8c291cmNlPgorICAgICAgICAgICAgY2FzLXJlc291cmNlLSR7dmVyc2lvbn0tZGlzdC50YXIuZ3oKKyAgICAgICAgICAgPC9zb3VyY2U+CisgICAgICAgICAgIAorICAgICAgICAgICBUaGlzIGlzIGEgZGlzdHJpYnV0aW9uIHRhciBiYWxsLCB0aGF0IHlvdSB3b3VsZCBjb3B5IHRvIGEgZGVwbG95bWVudCBkaXJlY3RvcnksIHN1Y2ggYXMKKyAgICAgICAgICAgPGNvZGU+L3Vzci9sb2NhbC88L2NvZGU+LCBhbmQgdGhlbiB1bnBhY2sgdXNpbmcgPGNvZGU+IyB0YXIgeHZ6ZiA8L2NvZGU+LiBUaGUgcmVzdWx0YW50IGRpcmVjdG9yeSAKKyAgICAgICAgICAgbGF5b3V0IGZyb20gdGhlIHVucGFja2VkIHRhcmJhbGwgaXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgCisgICAgICAgICAgIDxzb3VyY2U+CisgICAgICAgICAgICBiaW4vIGV0Yy8gbG9ncy8gZG9jLyBsaWIvIHBvbGljeS8gTElDRU5TRS50eHQgQ0hBTkdFUy50eHQKKyAgICAgICAgICAgPC9zb3VyY2U+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaT5iaW4gLSBjb250YWlucyB0aGUgInJlc21nciIgc2VydmVyIHNjcmlwdCwgYW5kIHRoZSAicmVzbWdyLWNsaWVudCIgY2xpZW50IHNjcmlwdC48L2xpPgorICAgICAgICAgICAgICA8bGk+ZXRjIC0gY29udGFpbnMgdGhlIGxvZ2dpbmcucHJvcGVydGllcyBmaWxlIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdlciwgYW5kIHRoZSByZXNvdXJjZS5wcm9wZXJ0aWVzIAorICAgICAgICAgICAgICBmaWxlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBzZXJ2ZXIgb3B0aW9ucy48L2xpPgorICAgICAgICAgICAgICA8bGk+bG9ncyAtIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgbG9nIGZpbGVzIHRvIGJlIHdyaXR0ZW4gdG8uPC9saT4KKyAgICAgICAgICAgICAgPGxpPmRvYyAtIGNvbnRhaW5zIEphdmFkb2MgZG9jdW1lbnRhdGlvbiwgYW5kIHVzZXIgZ3VpZGVzIGZvciB1c2luZyB0aGUgcGFydGljdWxhciBDQVMgY29tcG9uZW50LjwvbGk+CisgICAgICAgICAgICAgIDxsaT5saWIgLSB0aGUgcmVxdWlyZWQgSmF2YSBqYXIgZmlsZXMgdG8gcnVuIHRoZSBSZXNvdXJjZSBNYW5hZ2VyLjwvbGk+CisgICAgICAgICAgICAgIDxsaT5wb2xpY3kg4oCTIHRoZSBkZWZhdWx0IFhNTC1iYXNlZCBlbGVtZW50IGFuZCBwcm9kdWN0IHR5cGUgcG9saWN5IGluIAorICAgICAgICAgICAgICBjYXNlIHRoZSB1c2VyIGlzIHVzaW5nIHRoZSBYTUwgUmVwb3NpdG9yeSBNYW5hZ2VyIGFuZC9vciB0aGUgWE1MIFZhbGlkYXRpb24gCisgICAgICAgICAgICAgIExheWVyLjwvbGk+CisgICAgICAgICAgICAgIDxsaT5DSEFOR0VTLnR4dCAtIGNvbnRhaW5zIHRoZSBDSEFOR0VTIHByZXNlbnQgaW4gdGhpcyByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBDQVMgY29tcG9uZW50LjwvbGk+CisgICAgICAgICAgICAgIDxsaT5MSUNFTlNFLnR4dCAtIHRoZSBMSUNFTlNFIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdlciBwcm9qZWN0LjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvbGk+CisgICAgICAgICA8L29sPiAgICAgICAgCisgICAgICAgIDwvcD4KKyAgICAgIAorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRGVwbG95aW5nIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIj4KKyAgICAgIDxwPlRvIGRlcGxveSB0aGUgUmVzb3VyY2UgTWFuYWdlciwgeW91J2xsIG5lZWQgdG8gY3JlYXRlIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIFR5cGljYWxseSB0aGlzIAorICAgICAgd291bGQgYmUgc29tZXdoZXJlIGluIC91c3IvbG9jYWwgKG9uICpuaXggc3R5bGUgc3lzdGVtcyksIG9yIEM6XFByb2dyYW0gRmlsZXNcIChvbiB3aW5kb3dzIAorICAgICAgc3R5bGUgc3lzdGVtcykuIFdlJ2xsIGFzc3VtZSB0aGF0IHlvdSdyZSBpbnN0YWxsaW5nIG9uIGEgKm5peCBzdHlsZSBzeXN0ZW0gdGhvdWdoIHRoZSBXaW5kb3dzIAorICAgICAgaW5zdHJ1Y3Rpb25zIGFyZSBxdWl0ZSBzaW1pbGFyLjwvcD4KKworICAgICAgPHA+Rm9sbG93IHRoZSBwcm9jZXNzIGJlbG93IHRvIGRlcGxveSB0aGUgUmVzb3VyY2UgTWFuYWdlcjo8L3A+CisKKyAgICAgICAgPG9sPgorICAgICAgICAgPGxpPkNvcHkgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gdG8gdGhlIGRlcGxveW1lbnQgZGlyZWN0b3J5CisgICAgICAgICA8c291cmNlPiMgY3AgLVIgY2FzLXJlc291cmNlL3RydW5rL3RhcmdldC9jYXMtcmVzb3VyY2UtJHt2ZXJzaW9ufS1kaXN0LnRhci5neiAvdXNyL2xvY2FsLzwvc291cmNlPgorICAgICAgICAgPC9saT4KKyAgICAgICAgIDxsaT5VbnRhciB0aGUgZGlzdHJpYnV0aW9uCisgICAgICAgICA8c291cmNlPiMgY2QgL3Vzci9sb2NhbCA7IHRhciB4dnpmIGNhcy1yZXNvdXJjZS0ke3ZlcnNpb259LWRpc3QudGFyLmd6PC9zb3VyY2U+CisgICAgICAgICA8L2xpPgorICAgICAgICAgPGxpPlNldCB1cCBhIHN5bWxpbmsKKyAgICAgICAgIDxzb3VyY2U+IyBsbiAtcyAvdXNyL2xvY2FsL2Nhcy1yZXNvdXJjZS0ke3ZlcnNpb259IC91c3IvbG9jYWwvcmVzbWdyPC9zb3VyY2U+CisgICAgICAgICA8L2xpPgorICAgICAgICAgPGxpPmVkaXQgL3Vzci9sb2NhbC9yZXNtZ3IvYmluL3Jlc21ncgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgPGxpPlNldCB0aGUgPGNvZGU+U0VSVkVSX1BPUlQ8L2NvZGU+IHZhcmlhYmxlIHRvIHRoZSBkZXNpcmVkIHBvcnQgeW91J2QgbGlrZSB0byBydW4gdGhlIAorICAgICAgICAgICBSZXNvdXJjZSBNYW5hZ2VyIHNlcnZlciBvbi4KKyAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgPGxpPlNldCB0aGUgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gb2YgeW91ciBpbnN0YWxsZWQgCisgICAgICAgICAgIEpSRSBydW50aW1lLgorICAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8bGk+U2V0IHRoZSA8Y29kZT5SVU5fSE9NRTwvY29kZT4gdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIHlvdSdkIGxpa2UgdGhlIFJlc291cmNlIAorICAgICAgICAgICBNYW5hZ2VyIFBJRCBmaWxlIHdyaXR0ZW4gdG8uIFR5cGljYWxseSB0aGlzIHNob3VsZCBkZWZhdWx0IHRvIDxjb2RlPi92YXIvcnVuPC9jb2RlPiwgYnV0IG5vdCBhbGwgCisgICAgICAgICAgIHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBhbGxvdyB1c2VycyB0byB3cml0ZSB0byA8Y29kZT4vdmFyL3J1bjwvY29kZT4uCisgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8bGk+ZWRpdCA8Y29kZT4vdXNyL2xvY2FsL3Jlc21nci9iaW4vcmVzbWdyLWNsaWVudDwvY29kZT4KKyAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICA8bGk+U2V0IHRoZSA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IHZhcmlhYmxlIHRvIHBvaW50IHRvIHRoZSBsb2NhdGlvbiBvZiB5b3VyIGluc3RhbGxlZCBKUkUgcnVudGltZS4KKyAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgPGxpPihvcHRpb25hbCkgZWRpdCA8Y29kZT4vdXNyL2xvY2FsL3Jlc21nci9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzPC9jb2RlPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT5TZXQgdGhlIGxvZ2dpbmcgbGV2ZWxzIGZvciBlYWNoIHN1YnN5c3RlbSB0byB0aGUgZGVzaXJlZCBsZXZlbC4gVGhlIHN5c3RlbSAKKyAgICAgICAgICAgICBkZWZhdWx0cyBhcmUgZmFpcmx5IGNvbnNpZGVyYXRlIGFuZCBwcmV2ZW50IG11Y2ggb2YgdGhlIGxvZ2dpbmcgYXQgbGV2ZWxzIGJlbG93IDxjb2RlPklORk88L2NvZGU+CisgICAgICAgICAgICAgdG8gdGhlIGNvbnNvbGUuIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8bGk+ZWRpdCA8Y29kZT4vdXNyL2xvY2FsL3Jlc21nci9ldGMvcmVzb3VyY2UucHJvcGVydGllczwvY29kZT4KKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICA8bGk+VGhpcyBqYXZhIHByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gcHJvcGVydGllcyB0byAKKyAgICAgICAgICAgICBjb25maWd1cmUgdGhlIFJlc291cmNlIE1hbmFnZXIuIEJ5IGRlZmF1bHQsIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIGlzIGJ1aWx0IHRvIHVzZSB0aGUgWE1MLWJhc2VkIAorICAgICAgICAgICAgIEFzc2lnbm1lbnQgTW9uaXRvciwgdGhlIE1lbW9yeUpvYlJlcG9zaXRvcnksIHRoZSBMUlVTY2hlZHVsZXIsIGFuZCB0aGUgSm9iU3RhY2tKb2JRdWV1ZQorICAgICAgICAgICAgIGV4dGVuc2lvbiBwb2ludHMuLiBUaGVzZSBkZWZhdWx0cyBjYW4gYmUgY2hhbmdlZCBxdWl0ZSBlYXNpbHkgYnkgY2hhbmdpbmcgdGhlIGZhY3RvcnkgY2xhc3NlcyAKKyAgICAgICAgICAgICB0aGF0IGFyZSBwb2ludGVkIHRvIGZvciBlYWNoIGV4dGVuc2lvbiBwb2ludC4gRm9yIGV4YW1wbGUsIHRvIHVzZSB5b3VyIG93biBvd24gaG9tZSBTY2hlZHVsZXIgCisgICAgICAgICAgICAgZXh0ZW5zaW9uIHBvaW50LCB5b3Ugd291bGQgY2hhbmdlIHRoZSBmb2xsb3dpbmcgcHJvcGVydHksIDxjb2RlPnJlc21nci5zY2hlZHVsZXIuZmFjdG9yeTwvY29kZT4gdG8gCisgICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNtZ3Iuc2NoZWR1bGVyLllvdXJOZXdTY2hlZHVsZXJGYWN0b3J5PC9jb2RlPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT5Zb3UgbmVlZCB0byBjb25maWd1cmUgdGhlIHByb3BlcnRpZXMgZm9yIGVhY2ggb2YgdGhlIGV4dGVuc2lvbiBwb2ludHMgdGhhdCB5b3UgYXJlIAorICAgICAgICAgICAgdXNpbmcuIEJ5IGRlZmF1bHQsIHlvdSB3b3VsZCBhdCBsZWFzdCBuZWVkIHRvIGNvbmZpZ3VyZToKKyAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5UaGUgcGF0aHMgdG8gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHRoZSBYTUwgcG9saWN5IGZpbGVzIGFyZSBzdG9yZWQgZm9yIHRoZSAKKyAgICAgICAgICAgICAgICBYTUwgQXNzaWdubWVudCBNb25pdG9yLiBBIGdvb2QgZGVmYXVsdCBsb2NhdGlvbiBpcyB0byAKKyAgICAgICAgICAgICAgICBwbGFjZSB0aGVzZSBmaWxlcyB3aXRoaW4gL3Vzci9sb2NhbC9yZXNtZ3IvcG9saWN5LjwvbGk+CisgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPk1ha2Ugc3VyZSB0aGF0ICA8Y29kZT4vdXNyL2xvY2FsL3Jlc21nci9wb2xpY3kvbm9kZXMueG1sPC9jb2RlPiBhbmQgPGNvZGU+bm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbDwvY29kZT4gIAorICAgICAgICAgIGNvcnJlY3RseSBwb2ludCBhdCB0aGUgYmF0Y2ggc3R1YiBjb25zaWRlcmVkIHRvIHN0YXJ0IGZvciBleGVjdXRpb24gKGJ5IGRlZmF1bHQsIGxvY2FsaG9zdDoyMDAxKS4gCisgICAgICAgICAgPC9saT4KKyAgICAgICA8L29sPgorICAgCisgICAgIDxwPk90aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcG9zc2libGU6IGNoZWNrIHRoZSA8YSBocmVmPSIuLi8uLi9hcGlkb2NzL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UiPkFQSSBkb2N1bWVudGF0aW9uPC9hPiwgCisgICAgIGFzIHdlbGwgYXMgdGhlIGNvbW1lbnRzIHdpdGhpbiB0aGUgcmVzb3VyY2UucHJvcGVydGllcyBmaWxlIHRvIGZpbmQgb3V0IHRoZSByZXN0IG9mIHRoZSBjb25maWd1cmFibGUgCisgICAgIHByb3BlcnRpZXMgZm9yIHRoZSBleHRlbnNpb24gcG9pbnRzIHlvdSBjaG9vc2UuIEEgZnVsbCBsaXN0aW5nIG9mIGFsbCB0aGUgZXh0ZW5zaW9uIHBvaW50IGZhY3RvcnkgCisgICAgIGNsYXNzIG5hbWVzIGFyZSBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXguIEFmdGVyIHN0ZXAgNywgeW91IGFyZSBvZmZpY2lhbGx5IGRvbmUgY29uZmlndXJpbmcgdGhlIFJlc291cmNlIAorICAgICBNYW5hZ2VyIGZvciBkZXBsb3ltZW50LjwvcD4gICAKKyAgICAgIAorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUnVubmluZyB0aGUgUmVzb3VyY2UgTWFuYWdlciI+CisgICAgICA8cD5UbyBydW4gdGhlIHJlc21nciwgY2QgdG8gPGNvZGU+L3Vzci9sb2NhbC9yZXNtZ3IvYmluPC9jb2RlPiBhbmQgdHlwZTo8L3A+CisKKyAgICAgIDxzb3VyY2U+IyAuL3Jlc21nciBzdGFydDwvc291cmNlPgorCisgICAgICA8cD5UaGlzIHdpbGwgc3RhcnR1cCB0aGUgUmVzb3VyY2UgTWFuYWdlciBYTUwtUlBDIHNlcnZlciBpbnRlcmZhY2UuIFlvdXIgUmVzb3VyY2UgTWFuYWdlciAKKyAgICAgIGlzIG5vdyByZWFkeSB0byBydW4hIFlvdSBjYW4gdGVzdCBvdXQgdGhlIFJlc291cmNlIE1hbmFnZXIgYnkgc3VibWl0dGluZyB0aGUgZm9sbG93aW5nIGV4YW1wbGUKKyAgICAgIEpvYiwgZGVmaW5lZCBpbiB0aGUgWE1MIGZpbGUgYmVsb3cgKHNhdmUgdGhlIGZpbGUgdG8gYSBsb2NhdGlvbiBvbiB5b3VyIHN5c3RlbSwgc3VjaCBhcworICAgICAgPGNvZGU+L3Vzci9sb2NhbC9yZXNtZ3IvZXhhbXBsZXMvZXhKb2IueG1sPC9jb2RlPik6PC9wPgorICAgICAgCisgICAgICA8IS0tIEZJWE1FOiBDaGFuZ2UgbmFtZXNwYWNlIFVSST8gLS0+CisgICAgICA8c291cmNlPgorICAgICAgJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8mZ3Q7CisgICAgICAmbHQ7Y2FzOmpvYiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBpZD0iYWJjZCIKKwkgICAgICBuYW1lPSJUZXN0Sm9iIiZndDsKKwkgICAgICAmbHQ7aW5zdGFuY2VDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzLkhlbGxvV29ybGRKb2IiIC8mZ3Q7CisJICAmbHQ7aW5wdXRDbGFzcworCQluYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQiJmd0OworCQkmbHQ7cHJvcGVydGllcyZndDsKKwkJCSZsdDtwcm9wZXJ0eSBuYW1lPSJ1c2VyLm5hbWUiIHZhbHVlPSJIb21lciEiIC8mZ3Q7CisJCSZsdDsvcHJvcGVydGllcyZndDsKKwkgICAgJmx0Oy9pbnB1dENsYXNzJmd0OworCSAgJmx0O3F1ZXVlJmd0O3F1aWNrJmx0Oy9xdWV1ZSZndDsKKwkgICZsdDtsb2FkJmd0OzEmbHQ7L2xvYWQmZ3Q7CisgICAgICZsdDsvY2FzOmpvYiZndDsKKyAgICA8L3NvdXJjZT4KKyAgICAKKyAgICAgIDxwPlRoZSBhYm92ZSBqb2IgZGVmaW5pdGlvbiB0ZWxscyB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byBleGVjdXRlIHRoZSA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzLkhlbGxvV29ybGRKb2I8L2NvZGU+LAorICAgICAgd2hpY2ggaXMgb25lIG9mIHRoZSBleGFtcGxlIEpvYnMgdGhhdCBpcyBzaGlwcGVkIHdpdGggdGhlIFJlc291cmNlIE1hbmFnZXIuIFRoZSBqb2Igc2ltcGx5IGVjaG9lcyB0aGUgbmFtZSBwcm92aWRlZCBpbiB0aGUgPGNvZGU+dXNlci5uYW1lPC9jb2RlPgorICAgICAgcHJvcGVydHkgYmFjayB0byB0aGUgc2NyZWVuLCBzYXlpbmcgPGNvZGU+SGVsbG8gJHt1c2VyLm5hbWV9ITwvY29kZT4uCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRvIHJ1biB0aGUgam9iLCBmaXJzdCB5b3UgbXVzdCBzdGFydCBhbiBYTUwtUlBDIGJhdGNoIHN0dWIsIHRvIGV4ZWN1dGUgdGhlIGpvYiBvbiB0aGUgbG9jYWwgbm9kZS4gTGV0J3MgYXNzdW1lIGEgZGVmYXVsdCBwb3J0IG9mIHBvcnQgPGNvZGU+MjAwMTwvY29kZT46PC9wPgorCisgICAgICA8c291cmNlPiMgLi9iYXRjaF9zdHViIDIwMDEKKyAgICAgIDwvc291cmNlPgorICAgICAgCisgICAgICA8cD5UaGUgY29tbWFuZCB0byBydW4gdGhlIGpvYiwgYXNzdW1pbmcgdGhhdCB5b3Ugc3RhcnRlZCB0aGUgUmVzb3VyY2UgTWFuYWdlciBvbiB0aGUgZGVmYXVsdCBwb3J0IG9mIDxjb2RlPjkwMDI8L2NvZGU+OjwvcD4KKworICAgICAgPHNvdXJjZT4KKyAgICAgIGphdmEgLURqYXZhLmV4dC5kaXJzPS4uL2xpYiBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnRvb2xzLkpvYlN1Ym1pdHRlciBcCisgICAgICAgICAgICAgICAgICAgICAgIC0tclVybCBodHRwOi8vbG9jYWxob3N0OjkwMDIgXAorICAgICAgICAgICAgICAgICAgICAgICAtLWZpbGUgL3Vzci9sb2NhbC9yZXNtZ3IvZXhhbXBsZXMvZXhKb2IueG1sCisgICAgICA8L3NvdXJjZT4KKworICAgICAgPHA+WW91IHNob3VsZCBzZWUgYSByZXNwb25zZSBtZXNzYWdlIGF0IHRoZSBlbmQgc2ltaWxhciB0bzo8L3A+CisKKyAgICAgIDxzb3VyY2U+CisgICAgICBNYXIgNSwgMjAwOCAxMDo0NToyNiBBTSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlN0YWNrIGFkZEpvYjxici8+CisgICAgICBJTkZPOiBBZGRlZCBKb2I6IFsyMDA4LTAzLTA1VDEwOjQ1OjI2LjE0OC0wODowMF0gdG8gcXVldWU8YnIvPgorICAgICAgTWFyIDUsIDIwMDggMTA6NDU6MjYgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS50b29scy5Kb2JTdWJtaXR0ZXIgbWFpbjxici8+CisgICAgICBJTkZPOiBKb2IgU3VibWl0dGVkOiBpZDogWzIwMDgtMDMtMDVUMTA6NDU6MjYuMTQ4LTA4OjAwXTxici8+CisgICAgICBNYXIgNSwgMjAwOCAxMDo0NToyNyBBTSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5MUlVTY2hlZHVsZXIgcnVuPGJyLz4KKyAgICAgIElORk86IE9idGFpbmVkIEpvYjogWzIwMDgtMDMtMDVUMTA6NDU6MjYuMTQ4LTA4OjAwXSBmcm9tIFF1ZXVlOiBTY2hlZHVsaW5nIGZvciBleGVjdXRpb248YnIvPgorICAgICAgTWFyIDUsIDIwMDggMTA6NDU6MjcgQU0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuTFJVU2NoZWR1bGVyIHNjaGVkdWxlPGJyLz4KKyAgICAgIElORk86IEFzc2lnbmluZyBqb2I6IFtUZXN0Sm9iXSB0byBub2RlOiBbbm9kZTAwMV0gPGJyLz4KKyAgICAgIE1hciA1LCAyMDA4IDEwOjQ1OjI3IEFNIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLmV4dGVybi5YbWxScGNCYXRjaFN0dWIgZ2VuZXJpY0V4ZWN1dGVKb2I8YnIvPgorICAgICAgSU5GTzogc3R1YiBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgY2xhc3M6IFtvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzLkhlbGxvV29ybGRKb2JdPGJyLz4KKyAgICAgIEhlbGxvIHdvcmxkISBIb3cgYXJlIHlvdSBIb21lciEhCisgICAgICA8L3NvdXJjZT4KKworICAgIDxwPndoaWNoIG1lYW5zIHRoYXQgZXZlcnl0aGluZyBpbnN0YWxsZWQgb2theSE8L3A+CisgICAgCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlVzZSBDYXNlcyI+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoZSBSZXNvdXJjZSBNYW5hZ2VyIHdhcyBidWlsdCB0byBzdXBwb3J0IHNldmVyYWwgb2YgdGhlIGFib3ZlIGNhcGFiaWxpdGllcyBvdXRsaW5lZCBhYm92ZS4gCisgICAgICAgICAgSW4gcGFydGljdWxhciB0aGVyZSB3ZXJlIHNldmVyYWwgdXNlIGNhc2VzIHRoYXQgd2Ugd2FudGVkIHRvIHN1cHBvcnQsIHNvbWUgCisgICAgICAgICAgb2Ygd2hpY2ggYXJlIGRlc2NyaWJlZCBiZWxvdy4gICAgICAgIAorICAgICAgICA8L3A+CisgICAgICAKKyAgICAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcm1fdXNlX2Nhc2UxLmpwZyIgYWx0PSJSZXNvdXJjZSBNYW5hZ2VyIEpvYiBFeGVjdXRpb24gVXNlIENhc2UiLz4KKyAgICAgICAgIAorICAgICAgICAgIDxwPlRoZSBibGFjayBudW1iZXJzIGluIHRoZSBhYm92ZSBGaWd1cmUgY29ycmVzcG9uZCB0byBhIHNlcXVlbmNlIG9mIHN0ZXBzIHRoYXQgb2NjdXJzIGFuZCBhIAorICAgICAgICAgc2VyaWVzIG9mIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgUmVzb3VyY2UgTWFuYWdlciBleHRlbnNpb24gcG9pbnRzIGluIG9yZGVyIHRvIAorICAgICAgICAgcGVyZm9ybSB0aGUgam9iIGV4ZWN1dGlvbiBhY3Rpdml0eS4gVGhlIEpvYiBwcm92aWRlZCB0byB0aGUgUmVzb3VyY2UgTWFuYWdlciAobGFiZWxlZCA8Y29kZT5Qcm9jZXNzIE1hbmFnZXI8L2NvZGU+CisgICAgICAgICBpbiB0aGUgYWJvdmUgZGlhZ3JhbSkgaXMgc2VudCBieSB0aGUgV29ya2Zsb3cgTWFuYWdlciwgYW5vdGhlciBDQVMgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBtb2RlbGluZyB0YXNrCisgICAgICAgICBjb250cm9sIGZsb3cgYW5kIGRhdGEgZmxvdy4gSW4gU3RlcCA3LCB0aGUgam9iIGlzIHByb3ZpZGVkIHRvIHRoZSBSZXNvdXJjZSBNYW5hZ2VyLCB3aGljaCB1c2VzIGl0cworICAgICAgICAgU2NoZWR1bGVyIGV4dGVuc2lvbiBwb2ludCBpbiBTdGVwIDgsIGFsb25nIHdpdGggdGhlIE1vbml0b3IgZXh0ZW5zaW9uIHBvaW50LCB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICBSZXNvdXJjZSBOb2RlIHRvIGV4ZWN1dGUgdGhlIHByb3ZpZGVkIEpvYiBvbiAoaW4gc3RlcHMgOS0xMSkuIFRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBpbiBTdGVwIDExIHRvIHRoZQorICAgICAgICAgU2NoZWR1bGVyIGlzIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgSm9iIGV4ZWN1dGlvbiBhYmlsaXR5LiBPbmNlIHRoZSBKb2IgaXMgZGV0ZXJtaW5lZCAicmVhZHkgdG8gcnVuIiwgaW4gCisgICAgICAgICBTdGVwIDEyLCB0aGUgU2NoZWR1bGVyIGV4dGVuc2lvbiBwb2ludCB1c2VzIHRoZSBCYXRjaCBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludCAobm90IHNob3duKSB0byBzdWJtaXQgdGhlCisgICAgICAgICBKb2IgdG8gdGhlIHVuZGVybHlpbmcgY29tcHV0ZSBjbHVzdGVyIG5vZGVzLCBtb25pdG9yaW5nIHRoZSBKb2IgZXhlY3V0aW9uIHVzaW5nIHRoZSBNb25pdG9yIGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgc2hvd24gaW4gU3RlcCAxMy48L3A+CisgICAgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkFwcGVuZGl4Ij4KKyAgICAgICA8cD4KKyAgICAgICAgIEZ1bGwgbGlzdCBvZiBSZXNvdXJjZSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludCBjbGFzc2VzIGFuZCB0aGVpciBhc3NvY2lhdGVkIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIAorICAgICAgICAgcmVzb3VyY2UucHJvcGVydGllcyBmaWxlOiAgICAgICAKKyAgICAgICA8L3A+CisgICAgICAgPHRhYmxlPgorICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0aD5Qcm9wZXJ0eSBOYW1lPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+RXh0ZW5zaW9uIFBvaW50IENsYXNzPC90aD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgPHRib2R5PgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+cmVzb3VyY2UuYmF0Y2htZ3IuZmFjdG9yeTwvdGQ+CisgICAgICAgICAgIDx0ZD5vcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLlhtbFJwY0JhdGNoTWdyRmFjdG9yeQorICAgICAgICAgICA8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnJlc291cmNlLm1vbml0b3IuZmFjdG9yeTwvdGQ+CisgICAgICAgICAgIDx0ZD5vcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuWE1MQXNzaWdubWVudE1vbml0b3JGYWN0b3J5CisgICAgICAgICAgIDwvdGQ+CisgICAgICAgICA8L3RyPgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+cmVzb3VyY2Uuc2NoZWR1bGVyLmZhY3Rvcnk8L3RkPgorICAgICAgICAgICA8dGQ+b3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuTFJVU2NoZWR1bGVyRmFjdG9yeQorICAgICAgICAgICA8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnJlc291cmNlLmpvYnF1ZXVlLmZhY3Rvcnk8L3RkPgorICAgICAgICAgICA8dGQ+b3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JTdGFja0pvYlF1ZXVlRmFjdG9yeQorICAgICAgICAgICA8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnJlc291cmNlLmpvYnJlcG8uZmFjdG9yeTwvdGQ+CisgICAgICAgICAgIDx0ZD5vcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uTWVtb3J5Sm9iUmVwb3NpdG9yeUZhY3Rvcnk8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDwvdGJvZHk+CisgICAgICAgPC90YWJsZT4KKyAgICAgIAorICAgICAgPC9zZWN0aW9uPgorICAgPC9ib2R5PgorICAgCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL1Rlc3RSZXNvdXJjZUNsaS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL1Rlc3RSZXNvdXJjZUNsaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDA3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9jbGkvVGVzdFJlc291cmNlQ2xpLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmNsaTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuQ21kTGluZVV0aWxpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkudXRpbC5PcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0uTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5Nb2NrWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lk1ldGhvZENhbGxEZXRhaWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5Kb2JCdWlsZGVyOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3IgY2FzLWNsaSBjb21tYW5kIGxpbmUgZm9yIHJlc291cmNlIG1hbmFnZXIuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2VDbGkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHN0YXRpYyB7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmRlYnVnIiwgInRydWUiKTsKKyAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnNwcmluZy5jb25maWciLCAic3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLWFjdGlvbnMueG1sIik7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnIiwgInNyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbCIpOworICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJyZXNvdXJjZS5zY2hlZHVsZXIuZmFjdG9yeSIsICJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLk1vY2tTY2hlZHVsZXIiKTsKKyAgIH0KKworICAgcHJpdmF0ZSBDbWRMaW5lVXRpbGl0eSBjbWRMaW5lVXRpbGl0eTsKKyAgIHByaXZhdGUgTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGNtZExpbmVVdGlsaXR5ID0gbmV3IENtZExpbmVVdGlsaXR5KCk7CisgICAgICBVc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlIGFjdGlvblN0b3JlID0gbmV3IFVzZU1vY2tDbGllbnRDbWRMaW5lQWN0aW9uU3RvcmUoKTsKKyAgICAgIGNsaWVudCA9IGFjdGlvblN0b3JlLmdldENsaWVudCgpOworICAgICAgY21kTGluZVV0aWxpdHkuc2V0QWN0aW9uU3RvcmUoYWN0aW9uU3RvcmUpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBPcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyLmNsZWFyUmVnaXN0ZXIoKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEFkZE5vZGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgIGludCBjYXBhY2l0eSA9IDEwOworICAgICAgU3RyaW5nIG5vZGVJZCA9ICJUZXN0Tm9kZUlkIjsKKyAgICAgIFN0cmluZyBpcEFkZHIgPSAiaHR0cDovL2xvY2FsaG9zdDo5OTk5IjsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWFkZE5vZGUgLS1jYXBhY2l0eSAiICsgY2FwYWNpdHkgKyAiIC0tbm9kZUlkICIKKyAgICAgICAgICAgICsgbm9kZUlkICsgIiAtLWlwQWRkciAiICsgaXBBZGRyKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJhZGROb2RlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIFJlc291cmNlTm9kZSBhY3R1YWxOb2RlID0gKFJlc291cmNlTm9kZSkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKTsKKyAgICAgIFJlc291cmNlTm9kZSBleHBlY3RlZE5vZGUgPSBuZXcgUmVzb3VyY2VOb2RlKG5vZGVJZCwgbmV3IFVSTChpcEFkZHIpLCBjYXBhY2l0eSk7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWROb2RlLmdldElwQWRkcigpLCBhY3R1YWxOb2RlLmdldElwQWRkcigpKTsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE5vZGUuZ2V0Q2FwYWNpdHkoKSwgYWN0dWFsTm9kZS5nZXRDYXBhY2l0eSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIGFjdHVhbE5vZGUuZ2V0Tm9kZUlkKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTm9kZVRvUXVldWUoKSB7CisgICAgICBTdHJpbmcgcXVldWVOYW1lID0gIlRlc3RRdWV1ZU5hbWUiOworICAgICAgU3RyaW5nIG5vZGVJZCA9ICJUZXN0Tm9kZUlkIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWFkZE5vZGVUb1F1ZXVlIC0tcXVldWVOYW1lICIgKyBxdWV1ZU5hbWUgKyAiIC0tbm9kZUlkICIKKyAgICAgICAgICAgICsgbm9kZUlkKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJhZGROb2RlVG9RdWV1ZSIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobm9kZUlkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscyhxdWV1ZU5hbWUsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUXVldWUoKSB7CisgICAgICBTdHJpbmcgcXVldWVOYW1lID0gIlRlc3RRdWV1ZU5hbWUiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tYWRkUXVldWUgLS1xdWV1ZU5hbWUgIiArIHF1ZXVlTmFtZSkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiYWRkUXVldWUiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXVlTmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGVjTm9kZSgpIHsKKyAgICAgIFN0cmluZyBqb2JJZCA9ICJUZXN0Sm9iSWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0RXhlY05vZGUgLS1qb2JJZCAiICsgam9iSWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldEV4ZWN1dGlvbk5vZGUiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGpvYklkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldEpvYkluZm8oKSB7CisgICAgICBTdHJpbmcgam9iSWQgPSJUZXN0Sm9iSWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0Sm9iSW5mbyAtLWpvYklkICIgKyBqb2JJZCkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0Sm9iSW5mbyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoam9iSWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZUJ5SWQoKSB7CisgICAgICBTdHJpbmcgbm9kZUlkID0gIlRlc3ROb2RlSWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0Tm9kZUJ5SWQgLS1ub2RlSWQgIiArIG5vZGVJZCkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0Tm9kZUJ5SWQiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKG5vZGVJZCwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb2RlTG9hZCgpIHsKKyAgICAgIFN0cmluZyBub2RlSWQgPSAiVGVzdE5vZGVJZCI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXROb2RlTG9hZCAtLW5vZGVJZCAiICsgbm9kZUlkKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXROb2RlTG9hZCIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobm9kZUlkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldE5vZGVzKCkgeworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0Tm9kZXMiKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXROb2RlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLnNpemUoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb2Rlc0luUXVldWUoKSB7CisgICAgICBTdHJpbmcgcXVldWVOYW1lID0gIlRlc3RRdWV1ZU5hbWUiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0Tm9kZXNJblF1ZXVlIC0tcXVldWVOYW1lICIKKyAgICAgICAgICAgICsgcXVldWVOYW1lKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXROb2Rlc0luUXVldWUiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXVlTmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWV1ZXMoKSB7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRRdWV1ZXMiKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRRdWV1ZXMiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5zaXplKCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVldWVzV2l0aE5vZGUoKSB7CisgICAgICBTdHJpbmcgbm9kZUlkID0gIlRlc3ROb2RlSWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0UXVldWVzV2l0aE5vZGUgLS1ub2RlSWQgIgorICAgICAgICAgICAgKyBub2RlSWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFF1ZXVlc1dpdGhOb2RlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhub2RlSWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0S2lsbCgpIHsKKyAgICAgIFN0cmluZyBqb2JJZCA9ICJUZXN0Sm9iSWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0ta2lsbCAtLWpvYklkICIKKyAgICAgICAgICAgICsgam9iSWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImtpbGxKb2IiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGpvYklkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB7CisgICAgICBTdHJpbmcgbm9kZUlkID0gIlRlc3ROb2RlSWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tcmVtb3ZlTm9kZSAtLW5vZGVJZCAiCisgICAgICAgICAgICArIG5vZGVJZCkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygicmVtb3ZlTm9kZSIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobm9kZUlkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGVGcm9tUXVldWUoKSB7CisgICAgICBTdHJpbmcgbm9kZUlkID0gIlRlc3ROb2RlSWQiOworICAgICAgU3RyaW5nIHF1ZXVlTmFtZSA9ICJUZXN0UXVldWVOYW1lcyI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1yZW1vdmVOb2RlRnJvbVF1ZXVlIC0tbm9kZUlkICIKKyAgICAgICAgICAgICsgbm9kZUlkICsgIiAtLXF1ZXVlTmFtZSAiICsgcXVldWVOYW1lKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJyZW1vdmVOb2RlRnJvbVF1ZXVlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhub2RlSWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXVlTmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVRdWV1ZSgpIHsKKyAgICAgIFN0cmluZyBxdWV1ZU5hbWUgPSAiVGVzdFF1ZXVlTmFtZSI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1yZW1vdmVRdWV1ZSAtLXF1ZXVlTmFtZSAiCisgICAgICAgICAgICArIHF1ZXVlTmFtZSkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygicmVtb3ZlUXVldWUiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXVlTmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RTZXROb2RlQ2FwYWNpdHkoKSB7CisgICAgICBpbnQgY2FwYWNpdHkgPSA0OworICAgICAgU3RyaW5nIG5vZGVJZCA9ICJUZXN0Tm9kZUlkIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLXNldE5vZGVDYXBhY2l0eSAtLWNhcGFjaXR5ICIKKyAgICAgICAgICAgICsgY2FwYWNpdHkgKyAiIC0tbm9kZUlkICIgKyBub2RlSWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInNldE5vZGVDYXBhY2l0eSIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobm9kZUlkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscyhjYXBhY2l0eSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRKb2IoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgIFN0cmluZyBqb2JEZWZpbml0aW9uRmlsZSA9ICJzcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvam9icy9leEpvYi54bWwiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tc3VibWl0Sm9iIC0tZGVmICIKKyAgICAgICAgICAgICsgam9iRGVmaW5pdGlvbkZpbGUpLnNwbGl0KCIgIikpOworICAgICAgSm9iU3BlYyBzcGVjID0gSm9iQnVpbGRlci5idWlsZEpvYlNwZWMoam9iRGVmaW5pdGlvbkZpbGUpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInN1Ym1pdEpvYiIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBKb2IgYWN0dWFsSm9iID0gKEpvYikgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKTsKKyAgICAgIGFzc2VydEVxdWFscyhzcGVjLmdldEpvYigpLmdldEpvYkluc3RhbmNlQ2xhc3NOYW1lKCksIGFjdHVhbEpvYi5nZXRKb2JJbnN0YW5jZUNsYXNzTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhzcGVjLmdldEpvYigpLmdldEpvYklucHV0Q2xhc3NOYW1lKCksIGFjdHVhbEpvYi5nZXRKb2JJbnB1dENsYXNzTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhzcGVjLmdldEpvYigpLmdldFF1ZXVlTmFtZSgpLCBhY3R1YWxKb2IuZ2V0UXVldWVOYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMuZ2V0Sm9iKCkuZ2V0TG9hZFZhbHVlKCksIGFjdHVhbEpvYi5nZXRMb2FkVmFsdWUoKSk7CisgICAgICBKb2JJbnB1dCBhY3R1YWxKb2JJbnB1dCA9IChKb2JJbnB1dCkgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgxKTsKKyAgICAgIGFzc2VydEVxdWFscyhzcGVjLmdldEluKCkuZ2V0Q2xhc3MoKSwgYWN0dWFsSm9iSW5wdXQuZ2V0Q2xhc3MoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLnNpemUoKSk7CisKKyAgICAgIE9wdGlvblByb3BlcnR5UmVnaXN0ZXIuY2xlYXJSZWdpc3RlcigpOworCisgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1zdWJtaXRKb2IgLS1kZWYgIgorICAgICAgICAgICAgKyBqb2JEZWZpbml0aW9uRmlsZSArICIgLS1ub2RlVXJsICIgKyB1cmwpLnNwbGl0KCIgIikpOworICAgICAgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInN1Ym1pdEpvYiIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhY3R1YWxKb2IgPSAoSm9iKSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApOworICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMuZ2V0Sm9iKCkuZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKSwgYWN0dWFsSm9iLmdldEpvYkluc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMuZ2V0Sm9iKCkuZ2V0Sm9iSW5wdXRDbGFzc05hbWUoKSwgYWN0dWFsSm9iLmdldEpvYklucHV0Q2xhc3NOYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMuZ2V0Sm9iKCkuZ2V0UXVldWVOYW1lKCksIGFjdHVhbEpvYi5nZXRRdWV1ZU5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoc3BlYy5nZXRKb2IoKS5nZXRMb2FkVmFsdWUoKSwgYWN0dWFsSm9iLmdldExvYWRWYWx1ZSgpKTsKKyAgICAgIGFjdHVhbEpvYklucHV0ID0gKEpvYklucHV0KSBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDEpOworICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMuZ2V0SW4oKS5nZXRDbGFzcygpLCBhY3R1YWxKb2JJbnB1dC5nZXRDbGFzcygpKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgVVJMKHVybCksIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMikpOworICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5zaXplKCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvY2xpL1VzZU1vY2tDbGllbnRDbWRMaW5lQWN0aW9uU3RvcmUuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9Vc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkNjhhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2NsaS9Vc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nLlNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuY2xpLmFjdGlvbi5SZXNvdXJjZUNsaUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS5Nb2NrWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEge0BsaW5rIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZX0gd2hpY2ggc2V0cyB7QGxpbmsgV29ya2Zsb3dDbGlBY3Rpb259cworICogdG8gdXNlIGEge0BsaW5rIE1vY2tYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnR9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVXNlTW9ja0NsaWVudENtZExpbmVBY3Rpb25TdG9yZSBleHRlbmRzIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSB7CisKKyAgIHByaXZhdGUgTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgIHB1YmxpYyBVc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlKCkgeworICAgICAgc3VwZXIoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZyIpKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGllbnQgPSBuZXcgTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgU2V0PENtZExpbmVBY3Rpb24+IGxvYWRTdXBwb3J0ZWRBY3Rpb25zKCkgdGhyb3dzIENtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbiB7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IHN1cGVyLmxvYWRTdXBwb3J0ZWRBY3Rpb25zKCk7CisgICAgICBmb3IgKENtZExpbmVBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlQ2xpQWN0aW9uKSB7CisgICAgICAgICAgICAoKFJlc291cmNlQ2xpQWN0aW9uKSBhY3Rpb24pLnNldENsaWVudChjbGllbnQpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBNb2NrWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgIHJldHVybiBjbGllbnQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JxdWV1ZS9UZXN0Sm9iU3RhY2suamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2pvYnF1ZXVlL1Rlc3RKb2JTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzQxYzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9qb2JxdWV1ZS9UZXN0Sm9iU3RhY2suamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLkpvYlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JyZXBvLk1lbW9yeUpvYlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBTdWl0ZSBmb3IgdGhlIHtAbGluayBKb2JTdGFja30gY2xhc3MuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdEpvYlN0YWNrIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBKb2JTcGVjIGpvYjEgPSBudWxsOworCisgICAgcHJpdmF0ZSBKb2JTcGVjIGpvYjIgPSBudWxsOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IHdhaXRUaW1lID0gMjA7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBKb2JSZXBvc2l0b3J5IHJlcG8gPSBuZXcgTWVtb3J5Sm9iUmVwb3NpdG9yeSgpOworCisgICAgcHVibGljIFRlc3RKb2JTdGFjaygpIHsKKyAgICAgICAgSm9iIGoxID0gbmV3IEpvYigpOworICAgICAgICBqMS5zZXRJZCgiYm9vZ2VyIik7CisgICAgICAgIGoxLnNldE5hbWUoInBpY2sgaXQiKTsKKworICAgICAgICBKb2JJbnB1dCBpbiA9IG51bGw7CisKKyAgICAgICAgam9iMSA9IG5ldyBKb2JTcGVjKGluLCBqMSk7CisKKyAgICAgICAgSm9iIGoyID0gbmV3IEpvYigpOworICAgICAgICBqMi5zZXRJZCgiYm9vZ2VyMiIpOworICAgICAgICBqMi5zZXROYW1lKCJwaWNrIHNvbWUgbW9yZSIpOworICAgICAgICBqb2IyID0gbmV3IEpvYlNwZWMoaW4sIGoyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRKb2IoKSB7CisgICAgICAgIEpvYlN0YWNrIHN0YWNrID0gbmV3IEpvYlN0YWNrKHdhaXRUaW1lLCByZXBvKTsKKworICAgICAgICBMaXN0IHF1ZXVlZEpvYnMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBxdWV1ZWRKb2JzID0gc3RhY2suZ2V0UXVldWVkSm9icygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXVlZEpvYnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcXVldWVkSm9icy5zaXplKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGFjay5hZGRKb2Ioam9iMSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygxLCBxdWV1ZWRKb2JzLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7CisgICAgICAgIEpvYlN0YWNrIHN0YWNrID0gbmV3IEpvYlN0YWNrKHdhaXRUaW1lLCByZXBvKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGFjay5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQdXJnZSgpIHsKKyAgICAgICAgSm9iU3RhY2sgc3RhY2sgPSBuZXcgSm9iU3RhY2sod2FpdFRpbWUsIHJlcG8pOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YWNrKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RhY2suYWRkSm9iKGpvYjEpOworICAgICAgICAgICAgc3RhY2suYWRkSm9iKGpvYjIpOworICAgICAgICAgICAgc3RhY2suYWRkSm9iKGpvYjIpOworCisgICAgICAgICAgICBMaXN0IHF1ZXVlZEpvYnMgPSBzdGFjay5nZXRRdWV1ZWRKb2JzKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXVlZEpvYnMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHF1ZXVlZEpvYnMuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0YWNrLnB1cmdlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoc3RhY2suaXNFbXB0eSgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RRdWV1ZWRKb2JzKCkgeworICAgICAgICBKb2JTdGFjayBzdGFjayA9IG5ldyBKb2JTdGFjayh3YWl0VGltZSwgcmVwbyk7CisgICAgICAgIExpc3QgcXVldWVkSm9icyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0YWNrLmFkZEpvYihqb2IxKTsKKyAgICAgICAgICAgIHF1ZXVlZEpvYnMgPSBzdGFjay5nZXRRdWV1ZWRKb2JzKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwocXVldWVkSm9icyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBxdWV1ZWRKb2JzLnNpemUoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dEpvYigpIHsKKyAgICAgICAgSm9iU3RhY2sgc3RhY2sgPSBuZXcgSm9iU3RhY2sod2FpdFRpbWUsIHJlcG8pOworICAgICAgICBKb2JTcGVjIG5leHRKb2IgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGFjay5hZGRKb2Ioam9iMSk7CisgICAgICAgICAgICBzdGFjay5hZGRKb2Ioam9iMik7CisgICAgICAgICAgICBzdGFjay5hZGRKb2Ioam9iMik7CisKKyAgICAgICAgICAgIExpc3QgcXVldWVkSm9icyA9IHN0YWNrLmdldFF1ZXVlZEpvYnMoKTsKKworICAgICAgICAgICAgbmV4dEpvYiA9IHN0YWNrLmdldE5leHRKb2IoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXh0Sm9iLmdldEpvYigpLmdldElkKCksIGpvYjEuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocXVldWVkSm9icy5zaXplKCksIDIpOworICAgICAgICAgICAgbmV4dEpvYiA9IHN0YWNrLmdldE5leHRKb2IoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXh0Sm9iLmdldEpvYigpLmdldElkKCksIGpvYjIuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocXVldWVkSm9icy5zaXplKCksIDEpOworICAgICAgICAgICAgbmV4dEpvYiA9IHN0YWNrLmdldE5leHRKb2IoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXh0Sm9iLmdldEpvYigpLmdldElkKCksIGpvYjIuZ2V0Sm9iKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocXVldWVkSm9icy5zaXplKCksIDApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvVGVzdEFzc2lnbm1lbnRNb25pdG9yLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL1Rlc3RBc3NpZ25tZW50TW9uaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjhlNzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL1Rlc3RBc3NpZ25tZW50TW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3QgU3VpdGUgZm9yIHRoZSB7QGxpbmsgQXNzaWdubWVudE1vbml0b3J9IHNlcnZpY2UKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXNzaWdubWVudE1vbml0b3IgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIEFzc2lnbm1lbnRNb25pdG9yIGFzc2duTW9uID0gbnVsbDsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZ2VuZXJhdGVUZXN0Q29uZmlnKCk7CisgICAgICAgIGFzc2duTW9uID0gbmV3IEFzc2lnbm1lbnRNb25pdG9yRmFjdG9yeSgpLmNyZWF0ZU1vbml0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZXMoKSB7CisgICAgICAgIExpc3QgcmVzTm9kZXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNOb2RlcyA9IGFzc2duTW9uLmdldE5vZGVzKCk7CisgICAgICAgIH0gY2F0Y2ggKE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc05vZGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc05vZGVzLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE5vZGVCeUlkKCkgeworICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5vZGUgPSBhc3Nnbk1vbi5nZXROb2RlQnlJZCgibG9jYWxob3N0Iik7CisgICAgICAgIH0gY2F0Y2ggKE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxvY2FsaG9zdCIsIG5vZGUuZ2V0Tm9kZUlkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb2RlSW5mbygpIHsKKyAgICAgICAgTGlzdCByZXNOb2RlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc05vZGVzID0gYXNzZ25Nb24uZ2V0Tm9kZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwocmVzTm9kZXMpOworCisgICAgICAgIGJvb2xlYW4gaGFzTm9kZTEgPSBmYWxzZTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNOb2Rlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlID0gKFJlc291cmNlTm9kZSkgaS5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZUlkKCkuZXF1YWxzKCJsb2NhbGhvc3QiKSkgeworICAgICAgICAgICAgICAgIGhhc05vZGUxID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobm9kZS5nZXRJcEFkZHIoKS50b0V4dGVybmFsRm9ybSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6MjAwMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5vZGUuZ2V0Q2FwYWNpdHkoKSwgOCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGhhc05vZGUxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZU1vZGlmaWNhdGlvbigpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uLAorICAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU5vZGU+IG5vZGVzID0gbmV3IFZlY3RvcjxSZXNvdXJjZU5vZGU+KHRoaXMuYXNzZ25Nb24KKyAgICAgICAgICAgICAgICAuZ2V0Tm9kZXMoKSk7CisgICAgICAgIFJlc291cmNlTm9kZSB0ZXN0MSA9IG5ldyBSZXNvdXJjZU5vZGUoIlRlc3QxIiwgbmV3IFVSTCgKKyAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDoxMTExIiksIDkpOworICAgICAgICBSZXNvdXJjZU5vZGUgdGVzdDIgPSBuZXcgUmVzb3VyY2VOb2RlKCJUZXN0MiIsIG5ldyBVUkwoCisgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6MjIyMiIpLCA5KTsKKyAgICAgICAgUmVzb3VyY2VOb2RlIHRlc3QzID0gbmV3IFJlc291cmNlTm9kZSgiVGVzdDMiLCBuZXcgVVJMKAorICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjMzMzMiKSwgOSk7CisgICAgICAgIHRoaXMuYXNzZ25Nb24uYWRkTm9kZSh0ZXN0MSk7CisgICAgICAgIG5vZGVzLmFkZCh0ZXN0MSk7CisgICAgICAgIHRoaXMuYXNzZ25Nb24uYWRkTm9kZSh0ZXN0Mik7CisgICAgICAgIG5vZGVzLmFkZCh0ZXN0Mik7CisgICAgICAgIHRoaXMuYXNzZ25Nb24uYWRkTm9kZSh0ZXN0Myk7CisgICAgICAgIG5vZGVzLmFkZCh0ZXN0Myk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2Rlcy5jb250YWluc0FsbCh0aGlzLmFzc2duTW9uLmdldE5vZGVzKCkpCisgICAgICAgICAgICAgICAgJiYgdGhpcy5hc3Nnbk1vbi5nZXROb2RlcygpLmNvbnRhaW5zQWxsKG5vZGVzKSk7CisgICAgICAgIAorICAgICAgICB0aGlzLmFzc2duTW9uLnJlbW92ZU5vZGVCeUlkKHRlc3QxLmdldE5vZGVJZCgpKTsKKyAgICAgICAgbm9kZXMucmVtb3ZlKHRlc3QxKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydFRydWUobm9kZXMuY29udGFpbnNBbGwodGhpcy5hc3Nnbk1vbi5nZXROb2RlcygpKQorICAgICAgICAgICAgICAgICYmIHRoaXMuYXNzZ25Nb24uZ2V0Tm9kZXMoKS5jb250YWluc0FsbChub2RlcykpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGVzdENvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSA9ICIuIiArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgInRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QucmVzb3VyY2UucHJvcGVydGllcyI7CisKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUocHJvcGVydGllc0ZpbGUpKSk7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLmRpcnMiLAorICAgICAgICAgICAgICAgICJmaWxlOiIgKyBuZXcgRmlsZSgiLiIgKyBGaWxlLnNlcGFyYXRvciArICJzcmMiICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1haW4iICsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlcyIpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvVGVzdEdhbmdsaWFSZXNvdXJjZU1vbml0b3IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvVGVzdEdhbmdsaWFSZXNvdXJjZU1vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTlhNWUwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbW9uaXRvci9UZXN0R2FuZ2xpYVJlc291cmNlTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3I7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLkdhbmdsaWFSZXNvdXJjZU1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuR2FuZ2xpYVJlc291cmNlTW9uaXRvckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLnV0aWxzLk1vY2tHbWV0YWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKKworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciByYWppdGgKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiBUZXN0IFN1aXRlIGZvciB0aGUge0BsaW5rIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLkdhbmdsaWFSZXNvdXJjZU1vbml0b3J9CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2FuZ2xpYVJlc291cmNlTW9uaXRvciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgR2FuZ2xpYVJlc291cmNlTW9uaXRvciBnYW5nbGlhUmVzb3VyY2VNb25pdG9yOworICAgIHByaXZhdGUgVGhyZWFkTG9jYWw8TW9ja0dtZXRhZD4gbW9ja0dtZXRhZCA9IG5ldyBUaHJlYWRMb2NhbDxNb2NrR21ldGFkPigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBnZW5lcmF0ZVRlc3RDb25maWcoKTsKKyAgICAgICAgcnVuTW9ja0dtZXRhZCgpOworCisgICAgICAgIGdhbmdsaWFSZXNvdXJjZU1vbml0b3IgPSAoR2FuZ2xpYVJlc291cmNlTW9uaXRvcikKKyAgICAgICAgICAgICAgICBuZXcgR2FuZ2xpYVJlc291cmNlTW9uaXRvckZhY3RvcnkoKS5jcmVhdGVNb25pdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKXsKKyAgICAgICAgbW9ja0dtZXRhZC5yZW1vdmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9hZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSByZXNvdXJjZU5vZGUgPSBuZXcgUmVzb3VyY2VOb2RlKCk7CisgICAgICAgICAgICByZXNvdXJjZU5vZGUuc2V0SWQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdhbmdsaWFSZXNvdXJjZU1vbml0b3IuZ2V0TG9hZChyZXNvdXJjZU5vZGUpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlQnlJZCgpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2FuZ2xpYVJlc291cmNlTW9uaXRvci5yZW1vdmVOb2RlQnlJZCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBhc3NlcnROdWxsKGdhbmdsaWFSZXNvdXJjZU1vbml0b3IuZ2V0Tm9kZUJ5SWQoInJlbW90ZW5vZGUiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEdldE5vZGVzKCl7CisgICAgCXRyeXsKKyAgICAJCUxpc3Q8UmVzb3VyY2VOb2RlPiBub2RlcyA9IGdhbmdsaWFSZXNvdXJjZU1vbml0b3IuZ2V0Tm9kZXMoKTsKKyAgICAJCWFzc2VydE5vdE51bGwobm9kZXMpOworICAgIAkJYXNzZXJ0RXF1YWxzKDMsIG5vZGVzLnNpemUoKSk7CisgICAgCQlib29sZWFuIGhhc0xvY2FsID0gZmFsc2U7CisgICAgCQlib29sZWFuIGhhc0xvY2FsMiA9IGZhbHNlOworICAgIAkJYm9vbGVhbiBoYXNSZW1vdGUgPSBmYWxzZTsKKyAgICAJCQorICAgIAkJZm9yKFJlc291cmNlTm9kZSBub2RlOiBub2Rlcyl7CisgICAgCQkJaWYobm9kZS5nZXROb2RlSWQoKS5lcXVhbHMoImxvY2FsaG9zdCIpKXsKKyAgICAJCQkJaGFzTG9jYWwgPSB0cnVlOworICAgIAkJCX0KKyAgICAJCQllbHNlIGlmKG5vZGUuZ2V0Tm9kZUlkKCkuZXF1YWxzKCJsb2NhbGhvc3QyIikpeworICAgIAkJCQloYXNMb2NhbDIgPSB0cnVlOworICAgIAkJCX0KKyAgICAJCQllbHNlIGlmKG5vZGUuZ2V0Tm9kZUlkKCkuZXF1YWxzKCJyZW1vdGVub2RlIikpeworICAgIAkJCQloYXNSZW1vdGUgPSB0cnVlOworICAgIAkJCX0KKyAgICAJCQkKKyAgICAJCX0KKyAgICAJCWFzc2VydFRydWUoaGFzTG9jYWwmJmhhc0xvY2FsMiYmaGFzUmVtb3RlKTsKKyAgICAJfQorICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpeworICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIAl9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb2RlQnlJZCgpeworICAgIAl0cnl7CisgICAgCQlSZXNvdXJjZU5vZGUgbm9kZSA9IGdhbmdsaWFSZXNvdXJjZU1vbml0b3IuZ2V0Tm9kZUJ5SWQoImxvY2FsaG9zdCIpOworICAgIAkJYXNzZXJ0Tm90TnVsbChub2RlKTsKKyAgICAJCWFzc2VydEVxdWFscygibG9jYWxob3N0Iiwgbm9kZS5nZXROb2RlSWQoKSk7CisgICAgCQlub2RlID0gZ2FuZ2xpYVJlc291cmNlTW9uaXRvci5nZXROb2RlQnlJZCgibG9jYWxob3N0MiIpOworICAgIAkJYXNzZXJ0Tm90TnVsbChub2RlKTsKKyAgICAJCWFzc2VydEVxdWFscygibG9jYWxob3N0MiIsIG5vZGUuZ2V0Tm9kZUlkKCkpOworICAgIAkJbm9kZSA9IGdhbmdsaWFSZXNvdXJjZU1vbml0b3IuZ2V0Tm9kZUJ5SWQoInJlbW90ZW5vZGUiKTsKKyAgICAJCWFzc2VydE5vdE51bGwobm9kZSk7CisgICAgCQlhc3NlcnRFcXVhbHMoInJlbW90ZW5vZGUiLCBub2RlLmdldE5vZGVJZCgpKTsKKyAgICAJfQorICAgIAljYXRjaChFeGNlcHRpb24gZSl7CisgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOworICAgIAkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgCX0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuTW9ja0dtZXRhZCgpIHsKKyAgICAgICAgaW50IHBvcnQgPSBJbnRlZ2VyLnZhbHVlT2YoU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5nZW10YWQuaG9zdC5wb3J0IikpOworICAgICAgICBTdHJpbmcgc2FtcGxlWE1MZmlsZVBhdGggPSAiLiIgKyBGaWxlLnNlcGFyYXRvciArICJzcmMiICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJyZXNvdXJjZW1vbiIgKyBGaWxlLnNlcGFyYXRvciArICJnYW5nbGlhWE1MZHVtcC54bWwiOworICAgICAgICBtb2NrR21ldGFkLnNldChuZXcgTW9ja0dtZXRhZChwb3J0LCBzYW1wbGVYTUxmaWxlUGF0aCkpOworICAgICAgICBUaHJlYWQgbW9ja0dtZXRhZFNlcnZlciA9IG5ldyBUaHJlYWQobW9ja0dtZXRhZC5nZXQoKSk7CisgICAgICAgIG1vY2tHbWV0YWRTZXJ2ZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUZXN0Q29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHByb3BlcnRpZXNGaWxlID0gIi4iICsgRmlsZS5zZXBhcmF0b3IgKyAic3JjIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJyZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdC5yZXNvdXJjZS5wcm9wZXJ0aWVzIjsKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUocHJvcGVydGllc0ZpbGUpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL1Rlc3RHYW5nbGlhWE1MUGFyc2VyLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL1Rlc3RHYW5nbGlhWE1MUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyMTJjZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvVGVzdEdhbmdsaWFYTUxQYXJzZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuTW9uaXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5HYW5nbGlhTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5HYW5nbGlhWE1MUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmNvbmZpZ3VyYXRpb24uQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5jb25maWd1cmF0aW9uLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEuY29uZmlndXJhdGlvbi5NZXRyaWM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIHJhaml0aAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIFRlc3QgU3VpdGUgZm9yIHRoZSB7QGxpbmsgR2FuZ2xpYVhNTFBhcnNlcn0KKyAqLworcHVibGljIGNsYXNzIFRlc3RHYW5nbGlhWE1MUGFyc2VyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBMaXN0PENsdXN0ZXI+IGdyaWRDb25maWd1cmF0aW9uOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIFJlYWQgZ2FuZ2xpYVhNTGR1bXAueG1sIGFuZCBidWlsZCB0aGUgZ3JpZCBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigiLiIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICJzcmMiICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJyZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2Vtb24iCisgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiZ2FuZ2xpYVhNTGR1bXAueG1sIikpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHRoZSBzYW1wbGUgbW9uaXRvcmluZyByZXBvcnQgZnJvbSB0aGUgZmlsZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBidWZmZXIgPSBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKS50cmltKCk7CisgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIHBhcnNlcjsKKyAgICAgICAgR2FuZ2xpYVhNTFBhcnNlciBnYW5nbGlhWE1MUGFyc2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgICAgIGdhbmdsaWFYTUxQYXJzZXIgPSBuZXcgR2FuZ2xpYVhNTFBhcnNlcigpOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGJ1ZmZlcikpLCBnYW5nbGlhWE1MUGFyc2VyKTsKKyAgICAgICAgICAgIGdyaWRDb25maWd1cmF0aW9uID0gZ2FuZ2xpYVhNTFBhcnNlci5nZXRHcmlkQ29uZmlndXJhdGlvbigpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb25pdG9yRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBwYXJzaW5nOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oIkVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIFhNTDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vbml0b3JFeGNlcHRpb24oIkkvTyBlcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlICI8Q0xVU1RFUj4iIHRhZyBkYXRhCisgICAgICogPENMVVNURVIgTkFNRT0iIiBMT0NBTFRJTUU9IiIgT1dORVI9IiIgTEFUTE9ORz0iIiBVUkw9IiI+CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXJUYWcoKSB7CisgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGdyaWRDb25maWd1cmF0aW9uLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsb2NhbGNsdXN0ZXIiLCBjbHVzdGVyLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTM3MDE4NzY0NSIsIGNsdXN0ZXIuZ2V0TG9jYWx0aW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9vZHQiLCBjbHVzdGVyLmdldE93bmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk4zMi44NyBXMTE3LjIyIiwgY2x1c3Rlci5nZXRMYXRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cubXljbHVzdGVyLm9yZy8iLCBjbHVzdGVyLmdldFVybCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSAiPEhPU1Q+IiB0YWcgZGF0YQorICAgICAqIDxIT1NUIE5BTUU9IiIgSVA9IiIgUkVQT1JURUQ9IiIgVE49IiIgVE1BWD0iIiBETUFYPSIiIExPQ0FUSU9OPSIiIEdNT05EX1NUQVJURUQ9IiI+CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhvc3RUYWcoKSB7CisgICAgICAgIEhvc3QgaG9zdCA9ICgoZ3JpZENvbmZpZ3VyYXRpb24uZ2V0KDApKS5nZXRIb3N0cygpKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygibG9jYWxob3N0IiwgaG9zdC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyNy4wLjAuMSIsIGhvc3QuZ2V0SXAoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTM3MDE4NzYzNyIsIGhvc3QuZ2V0UmVwb3J0ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTAiLCBob3N0LmdldFRuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIwIiwgaG9zdC5nZXRUbWF4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLCBob3N0LmdldERtYXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMCwwLDAiLCBob3N0LmdldExvY2F0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEzNzAxODYyMzciLCBob3N0LmdldEdtb25kc3RhcnRlZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSAiPE1FVFJJQz4iIHRhZyBkYXRhCisgICAgICogPE1FVFJJQyBOQU1FPSIiIFZBTD0iIiBUWVBFPSIiIFVOSVRTPSIiIFROPSIiIFRNQVg9IiIgRE1BWD0iIiBTTE9QRT0iIiBTT1VSQ0U9IiI+CisgICAgICogPEVYVFJBX0RBVEE+CisgICAgICogPEVYVFJBX0VMRU1FTlQgTkFNRT0iIiBWQUw9IiIvPgorICAgICAqIDxFWFRSQV9FTEVNRU5UIE5BTUU9IiIgVkFMPSIiLz4KKyAgICAgKiAuLi4uLi4uLgorICAgICAqIDwvRVhUUkFfREFUQT4KKyAgICAgKiA8L01FVFJJQz4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0cmljVGFnKCkgeworICAgICAgICBNZXRyaWMgbWV0cmljID0gKCgoKGdyaWRDb25maWd1cmF0aW9uLmdldCgwKSkuZ2V0SG9zdHMoKSkuZ2V0KDApKS5nZXRNZXRyaWNzKCkpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXNrX2ZyZWUiLCBtZXRyaWMuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMDcuNzkwIiwgbWV0cmljLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRvdWJsZSIsIG1ldHJpYy5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdCIiwgbWV0cmljLmdldFVuaXRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MyIsIG1ldHJpYy5nZXRUbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAiLCBtZXRyaWMuZ2V0VG1heCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgbWV0cmljLmdldERtYXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm90aCIsIG1ldHJpYy5nZXRTbG9wZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnbW9uZCIsIG1ldHJpYy5nZXRTb3VyY2UoKSk7CisKKyAgICAgICAgLy9leHRyYSBkYXRhIG9mIHRoZSBtZXRyaWMKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0cmFEYXRhID0gbWV0cmljLmdldEV4dHJhRGF0YSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpc2siLCBleHRyYURhdGEuZ2V0KEdhbmdsaWFNZXRLZXlzLkdST1VQKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVG90YWwgZnJlZSBkaXNrIHNwYWNlIiwgZXh0cmFEYXRhLmdldChHYW5nbGlhTWV0S2V5cy5ERVNDKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGlzayBTcGFjZSBBdmFpbGFibGUiLCBleHRyYURhdGEuZ2V0KEdhbmdsaWFNZXRLZXlzLlRJVExFKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgY2x1c3RlcnMgaW4gdGhlIGdyaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JpZENsdXN0ZXJzKCl7CisgICAgICAgIENsdXN0ZXIgbG9jYWxDbHVzdGVyID0gZ3JpZENvbmZpZ3VyYXRpb24uZ2V0KDApOworICAgICAgICBDbHVzdGVyIHJlbW90ZUNsdXN0ZXIgPSBncmlkQ29uZmlndXJhdGlvbi5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygibG9jYWxjbHVzdGVyIiwgbG9jYWxDbHVzdGVyLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVtb3RlY2x1c3RlciIsIHJlbW90ZUNsdXN0ZXIuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvVGVzdFF1ZXVlTXV4QmF0Y2htZ3IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9UZXN0UXVldWVNdXhCYXRjaG1nci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDFjODEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvVGVzdFF1ZXVlTXV4QmF0Y2htZ3IuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm11eC5tb2Nrcy5Nb2NrQmF0Y2hNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JFeGVjdXRpb25FeGNlcHRpb247CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBUZXN0IFN1aXRlIGZvciB0aGUge0BsaW5rIFF1ZXVlQmF0Y2hNb25pdG9yfSBzZXJ2aWNlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdFF1ZXVlTXV4QmF0Y2htZ3IgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFF1ZXVlTXV4QmF0Y2hNYW5hZ2VyIHF1ZXVlOworICAgIHByaXZhdGUgTW9ja0JhdGNoTWFuYWdlciBtb2NrMTsKKyAgICBwcml2YXRlIE1vY2tCYXRjaE1hbmFnZXIgbW9jazI7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgQmFja2VuZE1hbmFnZXIgYmFjayA9IG5ldyBTdGFuZGFyZEJhY2tlbmRNYW5hZ2VyKCk7CisgICAgICAgIGJhY2suYWRkU2V0KCJxdWV1ZS0xIiwgbnVsbCwobW9jazEgPSBuZXcgTW9ja0JhdGNoTWFuYWdlcigpKSwgbnVsbCk7CisgICAgICAgIGJhY2suYWRkU2V0KCJxdWV1ZS0yIiwgbnVsbCwobW9jazIgPSBuZXcgTW9ja0JhdGNoTWFuYWdlcigpKSwgbnVsbCk7CisgICAgICAgIHF1ZXVlID0gbmV3IFF1ZXVlTXV4QmF0Y2hNYW5hZ2VyKGJhY2spOyAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVJlbW90ZWx5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvL1Rlc3QgdGhhdCB0aGUgam9icyBhcmUgcHV0IGluIHNlcGVyYXRlIG1vY2stYmFja2VuZHMgYmFzZWQgb24gcXVldWVzCisgICAgICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZTEgPSBuZXcgUmVzb3VyY2VOb2RlKCk7CisgICAgICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZTIgPSBuZXcgUmVzb3VyY2VOb2RlKCk7CisgICAgCisgICAgICAgICAgICBKb2JTcGVjIHNwZWMxID0gdGhpcy5nZXRTcGVjRnJvbVF1ZXVlKCJxdWV1ZS0xIik7CisgICAgICAgICAgICBxdWV1ZS5leGVjdXRlUmVtb3RlbHkoc3BlYzEsIG5vZGUxKTsKKyAgICAKKyAgICAgICAgICAgIEpvYlNwZWMgc3BlYzIgPSB0aGlzLmdldFNwZWNGcm9tUXVldWUoInF1ZXVlLTIiKTsKKyAgICAgICAgICAgIHF1ZXVlLmV4ZWN1dGVSZW1vdGVseShzcGVjMiwgbm9kZTIpOworICAgICAgICAgICAgLy9ZZXMuLi51c2UgcmVmZXJlbmNlIGVxdWFsaXR5LCBhcyB0aGVzZSBtdXN0IGJlIHRoZSBleGFjdCBzYW1lIG9iamVjdAorICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHNwZWMxLG1vY2sxLmdldEN1cnJlbnRKb2JTcGVjKCkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHNwZWMyLG1vY2syLmdldEN1cnJlbnRKb2JTcGVjKCkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG5vZGUxLG1vY2sxLmdldEN1cnJlbnRSZXNvdXJjZU5vZGUoKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobm9kZTIsbW9jazIuZ2V0Q3VycmVudFJlc291cmNlTm9kZSgpKTsKKyAgICAgICAgICAgIC8vVGhyb3dzIGV4Y2VwdGlvbiBvbiBiYWQgcXVldWUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcXVldWUuZXhlY3V0ZVJlbW90ZWx5KHRoaXMuZ2V0U3BlY0Zyb21RdWV1ZSgicXVldWUtMyIpLG5vZGUxKTsKKyAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJGYWlsZWQgdG8gdGhyb3cgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIG9uIHVua25vd24gcXVldWUuIik7CisgICAgICAgICAgICB9IGNhdGNoKEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9IGNhdGNoIChKb2JFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjogIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2lsbEpvYigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlMSA9IG5ldyBSZXNvdXJjZU5vZGUoKTsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlMiA9IG5ldyBSZXNvdXJjZU5vZGUoKTsKKyAgICAKKyAgICAgICAgICAgIEpvYlNwZWMgc3BlYzEgPSB0aGlzLmdldFNwZWNGcm9tUXVldWUoInF1ZXVlLTEiKTsKKyAgICAgICAgICAgIHF1ZXVlLmV4ZWN1dGVSZW1vdGVseShzcGVjMSwgbm9kZTEpOworICAgIAorICAgICAgICAgICAgSm9iU3BlYyBzcGVjMiA9IHRoaXMuZ2V0U3BlY0Zyb21RdWV1ZSgicXVldWUtMiIpOworICAgICAgICAgICAgcXVldWUuZXhlY3V0ZVJlbW90ZWx5KHNwZWMyLCBub2RlMik7CisgICAgICAgICAgICAvL01ha2Ugc3VyZSB0aGF0IG9uZSBjYW4ga2lsbCBhIGpvYiwgYW5kIHRoZSBvdGhlciBqb2IgaXMgcnVubmluZworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShxdWV1ZS5raWxsSm9iKHNwZWMxLmdldEpvYigpLmdldElkKCksIG5vZGUxKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobW9jazEuZ2V0Q3VycmVudEpvYlNwZWMoKSxudWxsKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtb2NrMi5nZXRDdXJyZW50Sm9iU3BlYygpLHNwZWMyKTsKKyAgICAgICAgICAgIC8vTWFrZSBzdXJlIGtpbGwgZmFpbHMgd2l0aCBiYWQgcXVldWUKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEZhbHNlKHF1ZXVlLmtpbGxKb2IodGhpcy5nZXRTcGVjRnJvbVF1ZXVlKCJxdWV1ZS0zIikuZ2V0Sm9iKCkuZ2V0SWQoKSwgbm9kZTEpKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGVjTm9kZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlMSA9IG5ldyBSZXNvdXJjZU5vZGUoKTsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlMiA9IG5ldyBSZXNvdXJjZU5vZGUoKTsKKyAgICAgICAgICAgIG5vZGUxLnNldElkKCJOb2RlMS1JRCIpOworICAgICAgICAgICAgbm9kZTIuc2V0SWQoIk5vZGUyLUlEIik7ICAgICAgICAgICAKKyAgICAgICAgICAgIEpvYlNwZWMgc3BlYzEgPSB0aGlzLmdldFNwZWNGcm9tUXVldWUoInF1ZXVlLTEiKTsKKyAgICAgICAgICAgIHF1ZXVlLmV4ZWN1dGVSZW1vdGVseShzcGVjMSwgbm9kZTEpOworICAgIAorICAgICAgICAgICAgSm9iU3BlYyBzcGVjMiA9IHRoaXMuZ2V0U3BlY0Zyb21RdWV1ZSgicXVldWUtMiIpOworICAgICAgICAgICAgcXVldWUuZXhlY3V0ZVJlbW90ZWx5KHNwZWMyLCBub2RlMik7CisgICAgICAgICAgICAvL01ha2UgdGhhdCB0aGUgZXhlY3V0aW9uIG5vZGUgaXMgc2FtZQorICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG5vZGUxLmdldE5vZGVJZCgpLHF1ZXVlLmdldEV4ZWN1dGlvbk5vZGUoc3BlYzEuZ2V0Sm9iKCkuZ2V0SWQoKSkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG5vZGUyLmdldE5vZGVJZCgpLHF1ZXVlLmdldEV4ZWN1dGlvbk5vZGUoc3BlYzIuZ2V0Sm9iKCkuZ2V0SWQoKSkpOworICAgICAgICAgICAgLy9SZXR1cm5zIG51bGwsIGlmIGJhZC1xdWV1ZQorICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChxdWV1ZS5nZXRFeGVjdXRpb25Ob2RlKHRoaXMuZ2V0U3BlY0Zyb21RdWV1ZSgicXVldWUtMyIpLmdldEpvYigpLmdldElkKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSm9iRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSm9iU3BlYyBnZXRTcGVjRnJvbVF1ZXVlKFN0cmluZyBxdWV1ZSkgeworICAgICAgICBKb2JTcGVjIHNwZWMxID0gbmV3IEpvYlNwZWMoKTsKKyAgICAgICAgSm9iIGpvYjEgPSBuZXcgSm9iKCk7CisgICAgICAgIGpvYjEuc2V0SWQoIjAwMDAwMDEwMDAwMDAxMS0iK3F1ZXVlKTsKKyAgICAgICAgam9iMS5zZXRRdWV1ZU5hbWUocXVldWUpOworICAgICAgICBzcGVjMS5zZXRKb2Ioam9iMSk7ICAgICAgIAorICAgICAgICByZXR1cm4gc3BlYzE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L1Rlc3RRdWV1ZU11eE1vbml0b3IuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9UZXN0UXVldWVNdXhNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MWQ1YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL211eC9UZXN0UXVldWVNdXhNb25pdG9yLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4Lm1vY2tzLk1vY2tNb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlF1ZXVlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLk1vbml0b3JFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5RdWV1ZU1hbmFnZXJFeGNlcHRpb247CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBUZXN0IFN1aXRlIGZvciB0aGUge0BsaW5rIFF1ZXVlQmF0Y2hNb25pdG9yfSBzZXJ2aWNlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdFF1ZXVlTXV4TW9uaXRvciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUXVldWVNdXhNb25pdG9yIG1vbml0b3I7CisgICAgcHJpdmF0ZSBNb2NrTW9uaXRvciBtb2NrMTsKKyAgICBwcml2YXRlIE1vY2tNb25pdG9yIG1vY2syOworICAgIHByaXZhdGUgUmVzb3VyY2VOb2RlIHN1cGVyZmx1b3VzOworICAgIHByaXZhdGUgUXVldWVNYW5hZ2VyIHFtOworICAgIE1hcDxNb2NrTW9uaXRvcixMaXN0PFJlc291cmNlTm9kZT4+IG1hcDsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9NYXAgbW9uaXRvciB0byBub2RlcyBsaXN0CisgICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxNb2NrTW9uaXRvcixMaXN0PFJlc291cmNlTm9kZT4+KCk7CisgICAgICAgICAgICBMaXN0PFJlc291cmNlTm9kZT4gbm9kZXMxID0gZ2V0Tm9kZXNMaXN0KCJtb2NrLTEiKTsKKyAgICAgICAgICAgIExpc3Q8UmVzb3VyY2VOb2RlPiBub2RlczIgPSBnZXROb2Rlc0xpc3QoIm1vY2stMiIpOworICAgICAgICAgICAgLy9CYWNrZW5kIE1hbmFnZXIgc2V0dXAKKyAgICAgICAgICAgIEJhY2tlbmRNYW5hZ2VyIGJhY2sgPSBuZXcgU3RhbmRhcmRCYWNrZW5kTWFuYWdlcigpOworICAgICAgICAgICAgYmFjay5hZGRTZXQoInF1ZXVlLTEiLChtb2NrMSA9IGFkZE1vbml0b3IoMCxtYXAsbm9kZXMxKSksIG51bGwsIG51bGwpOworICAgICAgICAgICAgYmFjay5hZGRTZXQoInF1ZXVlLTIiLChtb2NrMiA9IGFkZE1vbml0b3IoNSxtYXAsbm9kZXMyKSksIG51bGwsIG51bGwpOworICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhlIHF1ZXVlIG1hbmFnZXIgaXMgc2V0dXAKKyAgICAgICAgICAgIHFtID0gbmV3IFF1ZXVlTWFuYWdlcigpOworICAgICAgICAgICAgcW0uYWRkUXVldWUoInF1ZXVlLTEiKTsKKyAgICAgICAgICAgIHFtLmFkZFF1ZXVlKCJxdWV1ZS0yIik7CisgICAgICAgICAgICBxbS5hZGRRdWV1ZSgicXVldWUtMyIpOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZU5vZGUgcm4gOiBub2RlczEpCisgICAgICAgICAgICAgICAgcW0uYWRkTm9kZVRvUXVldWUocm4uZ2V0Tm9kZUlkKCksICJxdWV1ZS0xIik7CisgICAgICAgICAgICBmb3IgKFJlc291cmNlTm9kZSBybiA6IG5vZGVzMikKKyAgICAgICAgICAgICAgICBxbS5hZGROb2RlVG9RdWV1ZShybi5nZXROb2RlSWQoKSwgInF1ZXVlLTIiKTsKKyAgICAgICAgICAgIC8vQWRkIGFuIGV4dHJhIG5vZGUgdG8gdGVzdCAidW5rbm93biBxdWV1ZSIKKyAgICAgICAgICAgIHFtLmFkZE5vZGVUb1F1ZXVlKChzdXBlcmZsdW91cyA9IG5ldyBSZXNvdXJjZU5vZGUoInN1cGVyZmx1b3VzLTEiLG5ldyBVUkwoImh0dHA6Ly9zdXBlcmZsdW91cy0xIiksLTIpKS5nZXROb2RlSWQoKSwgInF1ZXVlLTMiKTsKKyAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgUXVldWVNdXhNb25pdG9yKGJhY2ssIHFtKTsKKyAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgcXVldWUgbWFuYWdlciBleGNlcHRpb24gY2F1Z2h0OiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgVVJMIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldExvYWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobW9jazEubG9hZCxtb25pdG9yLmdldExvYWQobWFwLmdldChtb2NrMSkuZ2V0KDApKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobW9jazIubG9hZCxtb25pdG9yLmdldExvYWQobWFwLmdldChtb2NrMikuZ2V0KDApKSk7CisKKyAgICAgICAgICAgIC8qdHJ5IHsKKyAgICAgICAgICAgICAgICBtb25pdG9yLmdldExvYWQoc3VwZXJmbHVvdXMpOworICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciB1bmtub3duIHF1ZXVlLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgfSBjYXRjaChNb25pdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgbW9uaXRvciBleGNlcHRpb24gY2F1Z2h0OiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb2RlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8UmVzb3VyY2VOb2RlPiBub2RlcyA9IG1vbml0b3IuZ2V0Tm9kZXMoKTsKKyAgICAgICAgICAgIGZvciAoUmVzb3VyY2VOb2RlIHJuIDptYXAuZ2V0KG1vY2sxKSkKKyAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCJOb2RlOiAiK3JuLmdldE5vZGVJZCgpKyAiIG5vdCBmb3VuZC4iLCBub2Rlcy5jb250YWlucyhybikpOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZU5vZGUgcm4gOm1hcC5nZXQobW9jazIpKQorICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoIk5vZGU6ICIrcm4uZ2V0Tm9kZUlkKCkrICIgbm90IGZvdW5kLiIsIG5vZGVzLmNvbnRhaW5zKHJuKSk7CisgICAgICAgIH0gY2F0Y2goTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJVbmFudGljaXBhdGVkIG1vbml0b3IgZXhjZXB0aW9uIGNhdWdodDogIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZUJ5SWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWFwLmdldChtb2NrMSkuZ2V0KDApLG1vbml0b3IuZ2V0Tm9kZUJ5SWQoIm1vY2stMS0xIikpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1hcC5nZXQobW9jazIpLmdldCgwKSxtb25pdG9yLmdldE5vZGVCeUlkKCJtb2NrLTItMSIpKTsKKyAgICAgICAgfSBjYXRjaChNb25pdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgbW9uaXRvciBleGNlcHRpb24gY2F1Z2h0OiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZUJ5VVJMKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1hcC5nZXQobW9jazEpLmdldCgxKSxtb25pdG9yLmdldE5vZGVCeVVSTChuZXcgVVJMKCJodHRwOi8vbW9jay0xLTIiKSkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1hcC5nZXQobW9jazIpLmdldCgxKSxtb25pdG9yLmdldE5vZGVCeVVSTChuZXcgVVJMKCJodHRwOi8vbW9jay0yLTIiKSkpOworICAgICAgICB9IGNhdGNoKE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5hbnRpY2lwYXRlZCBtb25pdG9yIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgVVJMIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWR1Y2VMb2FkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShtb25pdG9yLnJlZHVjZUxvYWQobWFwLmdldChtb2NrMSkuZ2V0KDIpLCA1KSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKG1vbml0b3IucmVkdWNlTG9hZChtYXAuZ2V0KG1vY2syKS5nZXQoMiksIDMpKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtYXAuZ2V0KG1vY2sxKS5nZXQoMikuZ2V0Q2FwYWNpdHkoKSwyNSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWFwLmdldChtb2NrMikuZ2V0KDIpLmdldENhcGFjaXR5KCksMjcpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtb25pdG9yLnJlZHVjZUxvYWQoc3VwZXJmbHVvdXMsIDIpOworICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciB1bmtub3duIHF1ZXVlLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9IGNhdGNoKE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5hbnRpY2lwYXRlZCBtb25pdG9yIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFzc2lnbkxvYWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKG1vbml0b3IuYXNzaWduTG9hZChtYXAuZ2V0KG1vY2sxKS5nZXQoMiksIDUpKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUobW9uaXRvci5hc3NpZ25Mb2FkKG1hcC5nZXQobW9jazIpLmdldCgyKSwgMykpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1hcC5nZXQobW9jazEpLmdldCgyKS5nZXRDYXBhY2l0eSgpLDUpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1hcC5nZXQobW9jazIpLmdldCgyKS5nZXRDYXBhY2l0eSgpLDMpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtb25pdG9yLmFzc2lnbkxvYWQoc3VwZXJmbHVvdXMsIDIpOworICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciB1bmtub3duIHF1ZXVlLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9IGNhdGNoKE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5hbnRpY2lwYXRlZCBtb25pdG9yIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZE5vZGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNvdXJjZU5vZGUgbm9kZSA9IG5ldyBSZXNvdXJjZU5vZGUoImEtbmV3LW5vZGUiLG51bGwsMik7CisgICAgICAgICAgICBxbS5hZGROb2RlVG9RdWV1ZShub2RlLmdldE5vZGVJZCgpLCAicXVldWUtMSIpOworICAgICAgICAgICAgbW9uaXRvci5hZGROb2RlKG5vZGUpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG5vZGUsbW9jazEuZ2V0QWRkZWQoKSk7CisgICAgICAgIH0gY2F0Y2goTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJVbmFudGljaXBhdGVkIG1vbml0b3IgZXhjZXB0aW9uIGNhdWdodDogIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5hbnRpY2lwYXRlZCBxdWV1ZSBtYW5hZ2VyIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlQnlJZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlTm9kZSBub2RlID0gbmV3IFJlc291cmNlTm9kZSgiYS1uZXctbm9kZSIsbnVsbCwyKTsKKyAgICAgICAgICAgIHFtLmFkZE5vZGVUb1F1ZXVlKG5vZGUuZ2V0Tm9kZUlkKCksICJxdWV1ZS0xIik7CisgICAgICAgICAgICBtb25pdG9yLmFkZE5vZGUobm9kZSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobm9kZSxtb2NrMS5nZXRBZGRlZCgpKTsKKyAgICAgICAgICAgIG1vbml0b3IucmVtb3ZlTm9kZUJ5SWQobm9kZS5nZXROb2RlSWQoKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobnVsbCxtb2NrMS5nZXRBZGRlZCgpKTsKKyAgICAgICAgfSBjYXRjaChNb25pdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgbW9uaXRvciBleGNlcHRpb24gY2F1Z2h0OiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoUXVldWVNYW5hZ2VyRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJVbmFudGljaXBhdGVkIHF1ZXVlIG1hbmFnZXIgZXhjZXB0aW9uIGNhdWdodDogIitlMS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNb2NrTW9uaXRvciBhZGRNb25pdG9yKGludCBsb2FkLE1hcDxNb2NrTW9uaXRvciwgTGlzdDxSZXNvdXJjZU5vZGU+PiBtYXAsIExpc3Q8UmVzb3VyY2VOb2RlPiBsaXN0KSB7CisgICAgICAgIE1vY2tNb25pdG9yIG1vbiA9IG5ldyBNb2NrTW9uaXRvcihsb2FkLCBsaXN0LCBsaXN0LmdldCgwKSwgbGlzdC5nZXQoMSksIGxpc3QuZ2V0KDIpKTsKKyAgICAgICAgbWFwLnB1dChtb24sIGxpc3QpOworICAgICAgICByZXR1cm4gbW9uOworICAgIH0KKyAgICBwcml2YXRlIExpc3Q8UmVzb3VyY2VOb2RlPiBnZXROb2Rlc0xpc3QoU3RyaW5nIHByZWZpeCkgeworICAgICAgICBMaXN0PFJlc291cmNlTm9kZT4gbm9kZXMgPSBuZXcgTGlua2VkTGlzdDxSZXNvdXJjZU5vZGU+KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBub2Rlcy5hZGQobmV3IFJlc291cmNlTm9kZShwcmVmaXgrIi0xIixuZXcgVVJMKCJodHRwOi8vIitwcmVmaXgrIi0xIiksMTApKTsKKyAgICAgICAgICAgIG5vZGVzLmFkZChuZXcgUmVzb3VyY2VOb2RlKHByZWZpeCsiLTIiLG5ldyBVUkwoImh0dHA6Ly8iK3ByZWZpeCsiLTIiKSwyMCkpOworICAgICAgICAgICAgbm9kZXMuYWRkKG5ldyBSZXNvdXJjZU5vZGUocHJlZml4KyItMyIsbmV3IFVSTCgiaHR0cDovLyIrcHJlZml4KyItMyIpLDMwKSk7CisgICAgICAgICAgICBub2Rlcy5hZGQobmV3IFJlc291cmNlTm9kZShwcmVmaXgrIi00IixuZXcgVVJMKCJodHRwOi8vIitwcmVmaXgrIi00IiksNDApKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuYW50aWNpcGF0ZWQgVVJMIGV4Y2VwdGlvbiBjYXVnaHQ6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvbW9ja3MvTW9ja0JhdGNoTWFuYWdlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L21vY2tzL01vY2tCYXRjaE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBmYjkzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L21vY2tzL01vY2tCYXRjaE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tdXgubW9ja3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5Kb2JSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JFeGVjdXRpb25FeGNlcHRpb247CisvKioKKyAqIFRoaXMgaXMgYSBtb2NrIHZlcnNpb24gb2YgdGhlIGJhdGNoIG1hbmFnZXIuIEl0IFNIT1VMRCBOT1QsIGFuZCAKKyAqIENBTiBOT1QgYmUgdXNlZCBhcyBhIG5vcm1hbCBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrQmF0Y2hNYW5hZ2VyIGltcGxlbWVudHMgQmF0Y2htZ3IgeworCisgICAgcHJpdmF0ZSBKb2JTcGVjIGV4ZWNKb2JTcGVjOworICAgIHByaXZhdGUgUmVzb3VyY2VOb2RlIGV4ZWNSZXNOb2RlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVJlbW90ZWx5KEpvYlNwZWMgam9iLCBSZXNvdXJjZU5vZGUgcmVzTm9kZSkKKyAgICAgICAgICAgIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLmV4ZWNKb2JTcGVjID0gam9iOworICAgICAgICB0aGlzLmV4ZWNSZXNOb2RlID0gcmVzTm9kZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TW9uaXRvcihNb25pdG9yIG1vbml0b3IpIHt9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JSZXBvc2l0b3J5KEpvYlJlcG9zaXRvcnkgcmVwb3NpdG9yeSkge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PEpvYj4gZ2V0Sm9ic09uTm9kZShTdHJpbmcgbm9kZUlkKXsKKwl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIm1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIGdldEpvYnNPbk5vZGUiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBraWxsSm9iKFN0cmluZyBqb2JJZCwgUmVzb3VyY2VOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKHRoaXMuZXhlY0pvYlNwZWMuZ2V0Sm9iKCkuZ2V0SWQoKS5lcXVhbHMoam9iSWQpKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmV4ZWNKb2JTcGVjID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuZXhlY1Jlc05vZGUgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0aW9uTm9kZShTdHJpbmcgam9iSWQpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWNSZXNOb2RlLmdldE5vZGVJZCgpOworICAgIH0KKworICAgIC8qKioqKgorICAgICAqIFRoZSBmb2xsb3dpbmcgYXJlIHRlc3QgbWV0aG9kcyB0byByZXBvcnQgd2hhdCBqb2JzIGFyZSBoZXJlLgorICAgICAqKioqKi8KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgam9ic3BlYywgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIEpvYlNwZWMgZ2V0Q3VycmVudEpvYlNwZWMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmV4ZWNKb2JTcGVjOworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugbm9kZSwgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTm9kZSBnZXRDdXJyZW50UmVzb3VyY2VOb2RlKCkgeworICAgICAgICByZXR1cm4gZXhlY1Jlc05vZGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L21vY2tzL01vY2tNb25pdG9yLmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tdXgvbW9ja3MvTW9ja01vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmZhMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvbXV4L21vY2tzL01vY2tNb25pdG9yLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubXV4Lm1vY2tzOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgTW9ja01vbml0b3IgaW1wbGVtZW50cyBNb25pdG9yIHsKKworICAgIHB1YmxpYyBpbnQgbG9hZCA9IC0xOworICAgIExpc3Q8UmVzb3VyY2VOb2RlPiBub2RlczsKKyAgICBSZXNvdXJjZU5vZGUgaWQ7CisgICAgUmVzb3VyY2VOb2RlIHVybDsKKyAgICBSZXNvdXJjZU5vZGUgYWRkOworICAgIFJlc291cmNlTm9kZSByZWR1Y2U7CisKKyAgICBwdWJsaWMgTW9ja01vbml0b3IoaW50IGxvYWQsTGlzdDxSZXNvdXJjZU5vZGU+IG5vZGVzLCBSZXNvdXJjZU5vZGUgaWQsIFJlc291cmNlTm9kZSB1cmwsIFJlc291cmNlTm9kZSByZWR1Y2UpIHsKKyAgICAgICAgdGhpcy5sb2FkID0gbG9hZDsKKyAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzOworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgICB0aGlzLnJlZHVjZSA9IHJlZHVjZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldExvYWQoUmVzb3VyY2VOb2RlIG5vZGUpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsgICAgIAorICAgICAgICByZXR1cm4gbG9hZDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBub2RlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VOb2RlIGdldE5vZGVCeUlkKFN0cmluZyBub2RlSWQpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGlkLmdldE5vZGVJZCgpLmVxdWFscyhub2RlSWQpP2lkOm51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlVUkwoVVJMIGlwQWRkcikgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdXJsLmdldElwQWRkcigpLmVxdWFscyhpcEFkZHIpP3VybDpudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlZHVjZUxvYWQoUmVzb3VyY2VOb2RlIG5vZGUsIGludCBsb2FkVmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJlZHVjZS5zZXRDYXBhY2l0eShyZWR1Y2UuZ2V0Q2FwYWNpdHkoKSAtIGxvYWRWYWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFzc2lnbkxvYWQoUmVzb3VyY2VOb2RlIG5vZGUsIGludCBsb2FkVmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJlZHVjZS5zZXRDYXBhY2l0eShsb2FkVmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGROb2RlKFJlc291cmNlTm9kZSBub2RlKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuYWRkID0gbm9kZTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vZGVCeUlkKFN0cmluZyBub2RlSWQpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMuYWRkLmdldE5vZGVJZCgpLmVxdWFscyhub2RlSWQpKQorICAgICAgICAgICAgdGhpcy5hZGQgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvdXJjZU5vZGUgZ2V0QWRkZWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9xdWV1ZXJlcG8vVGVzdFhtbFF1ZXVlUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1Rlc3RYbWxRdWV1ZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYxNDRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvcXVldWVyZXBvL1Rlc3RYbWxRdWV1ZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlF1ZXVlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5RdWV1ZU1hbmFnZXJFeGNlcHRpb247CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUZXN0IFN1aXRlIGZvciB0aGUge0BsaW5rIFhtbFF1ZXVlUmVwb3NpdG9yeX0gc2VydmljZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RYbWxRdWV1ZVJlcG9zaXRvcnkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwcml2YXRlIFF1ZXVlTWFuYWdlciBxdWV1ZU1hbmFnZXI7CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisJCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5ub2RldG9xdWV1ZXMuZGlycyIsCisJCQkJImZpbGU6IgorCQkJCQkJKyBuZXcgRmlsZSgiLi9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMiKQorCQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQl0aGlzLnF1ZXVlTWFuYWdlciA9IG5ldyBYbWxRdWV1ZVJlcG9zaXRvcnlGYWN0b3J5KCkuY3JlYXRlUXVldWVSZXBvc2l0b3J5KCkubG9hZFF1ZXVlcygpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZygpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworCSAgYXNzZXJ0VHJ1ZSh0aGlzLnF1ZXVlTWFuYWdlci5nZXRRdWV1ZXMoKS5jb250YWluc0FsbChBcnJheXMuYXNMaXN0KCJxdWljayIsICJoaWdoIiwgImxvbmciKSkpOworCQlhc3NlcnRFcXVhbHModGhpcy5xdWV1ZU1hbmFnZXIuZ2V0Tm9kZXMoInF1aWNrIiksIEFycmF5cy5hc0xpc3QoImxvY2FsaG9zdCIpKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMucXVldWVNYW5hZ2VyLmdldE5vZGVzKCJoaWdoIiksIEFycmF5cy5hc0xpc3QoImxvY2FsaG9zdCIpKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMucXVldWVNYW5hZ2VyLmdldE5vZGVzKCJsb25nIiksIEFycmF5cy5hc0xpc3QoImxvY2FsaG9zdCIpKTsKKwkJYXNzZXJ0VHJ1ZSh0aGlzLnF1ZXVlTWFuYWdlci5nZXRRdWV1ZXMoImxvY2FsaG9zdCIpLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QoInF1aWNrIiwgImhpZ2giLCAibG9uZyIpKSk7CisJCQorCQl0aGlzLnF1ZXVlTWFuYWdlci5hZGRRdWV1ZSgidGVzdC1xdWV1ZS0xIik7CisJCXRoaXMucXVldWVNYW5hZ2VyLmFkZE5vZGVUb1F1ZXVlKCJ0ZXN0LW5vZGUtMSIsICJ0ZXN0LXF1ZXVlLTEiKTsKKwkJCisJCWFzc2VydEVxdWFscyh0aGlzLnF1ZXVlTWFuYWdlci5nZXRRdWV1ZXMoInRlc3Qtbm9kZS0xIiksIEFycmF5cy5hc0xpc3QoInRlc3QtcXVldWUtMSIpKTsKKworCQl0aGlzLnF1ZXVlTWFuYWdlci5hZGROb2RlVG9RdWV1ZSgidGVzdC1ub2RlLTEiLCJxdWljayIpOworCQlhc3NlcnRFcXVhbHModGhpcy5xdWV1ZU1hbmFnZXIuZ2V0UXVldWVzKCJ0ZXN0LW5vZGUtMSIpLCBBcnJheXMuYXNMaXN0KCJxdWljayIsICJ0ZXN0LXF1ZXVlLTEiKSk7CisJCQorCQl0aGlzLnF1ZXVlTWFuYWdlci5yZW1vdmVRdWV1ZSgicXVpY2siKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMucXVldWVNYW5hZ2VyLmdldFF1ZXVlcygidGVzdC1ub2RlLTEiKSwgQXJyYXlzLmFzTGlzdCgidGVzdC1xdWV1ZS0xIikpOworCQlhc3NlcnRFcXVhbHModGhpcy5xdWV1ZU1hbmFnZXIuZ2V0UXVldWVzKCJsb2NhbGhvc3QiKSwgQXJyYXlzLmFzTGlzdCgiaGlnaCIsICJsb25nIikpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlL01vY2tTY2hlZHVsZXIuamF2YSBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlL01vY2tTY2hlZHVsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWJkNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGUvTW9ja1NjaGVkdWxlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JRdWV1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5RdWV1ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuU2NoZWR1bGVyRXhjZXB0aW9uOworCisvKioKKyAqIEEgTW9jayB7QGxpbmsgU2NoZWR1bGVyfS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIE1vY2tTY2hlZHVsZXIgaW1wbGVtZW50cyBTY2hlZHVsZXIgeworCisgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAvLyBEbyBub3RoaW5nLgorICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBzY2hlZHVsZShKb2JTcGVjIHNwZWMpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBwdWJsaWMgUmVzb3VyY2VOb2RlIG5vZGVBdmFpbGFibGUoSm9iU3BlYyBzcGVjKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBwdWJsaWMgTW9uaXRvciBnZXRNb25pdG9yKCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKyAgIHB1YmxpYyBCYXRjaG1nciBnZXRCYXRjaG1ncigpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBwdWJsaWMgSm9iUXVldWUgZ2V0Sm9iUXVldWUoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgcHVibGljIFF1ZXVlTWFuYWdlciBnZXRRdWV1ZU1hbmFnZXIoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N5c3RlbS9Nb2NrWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zeXN0ZW0vTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDkxMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zeXN0ZW0vTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW07CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuZXhhbXBsZXMuSGVsbG9Xb3JsZEpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuTmFtZVZhbHVlSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLlF1ZXVlTWFuYWdlckV4Y2VwdGlvbjsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKKy8qKgorICogTW9jayBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50fS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGV4dGVuZHMKKyAgICAgIFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCB7CisKKyAgIHByaXZhdGUgTWV0aG9kQ2FsbERldGFpbHMgbGFzdE1ldGhvZENhbGxEZXRhaWxzOworCisgICBwdWJsaWMgTW9ja1htbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgc3VwZXIobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIikpOworICAgfQorCisgICBwdWJsaWMgTWV0aG9kQ2FsbERldGFpbHMgZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCkgeworICAgICAgcmV0dXJuIGxhc3RNZXRob2RDYWxsRGV0YWlsczsKKyAgIH0KKworICAgcHVibGljIHZvaWQgYWRkTm9kZShSZXNvdXJjZU5vZGUgbm9kZSkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJhZGROb2RlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBub2RlKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIGFkZE5vZGVUb1F1ZXVlKFN0cmluZyBub2RlSWQsIFN0cmluZyBxdWV1ZU5hbWUpCisgICAgICAgICB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiYWRkTm9kZVRvUXVldWUiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIG5vZGVJZCwgcXVldWVOYW1lKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIGFkZFF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpIHRocm93cyBRdWV1ZU1hbmFnZXJFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJhZGRRdWV1ZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgcXVldWVOYW1lKSk7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0aW9uTm9kZShTdHJpbmcgam9iSWQpIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0RXhlY3V0aW9uTm9kZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgam9iSWQpKTsKKyAgICAgIHJldHVybiAiVGVzdE5vZGVJZCI7CisgICB9CisKKyAgIHB1YmxpYyBKb2IgZ2V0Sm9iSW5mbyhTdHJpbmcgam9iSWQpIHRocm93cyBKb2JSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0Sm9iSW5mbyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgam9iSWQpKTsKKyAgICAgIEpvYiBqb2IgPSBuZXcgSm9iKCk7CisgICAgICBqb2Iuc2V0SWQoam9iSWQpOworICAgICAgam9iLnNldE5hbWUoIlRlc3RKb2JOYW1lIik7CisgICAgICBqb2Iuc2V0Sm9iSW5wdXRDbGFzc05hbWUoTmFtZVZhbHVlSm9iSW5wdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgIGpvYi5zZXRKb2JJbnN0YW5jZUNsYXNzTmFtZShIZWxsb1dvcmxkSm9iLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICBqb2Iuc2V0TG9hZFZhbHVlKDQpOworICAgICAgam9iLnNldFF1ZXVlTmFtZSgiVGVzdFF1ZXVlTmFtZSIpOworICAgICAgam9iLnNldFN0YXR1cygiRE9ORSIpOworICAgICAgcmV0dXJuIGpvYjsKKyAgIH0KKworICAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldE5vZGVCeUlkIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBub2RlSWQpKTsKKyAgICAgIHRyeSB7CisgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTm9kZShub2RlSWQsIG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OSIpLCA1KTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgTW9uaXRvckV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXROb2RlTG9hZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldE5vZGVMb2FkIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBub2RlSWQpKTsKKyAgICAgIHJldHVybiAiMTAiOworICAgfQorCisgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU5vZGU+IGdldE5vZGVzKCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXROb2RlcyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Tm9kZXNJblF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUpCisgICAgICAgICB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0Tm9kZXNJblF1ZXVlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBxdWV1ZU5hbWUpKTsKKyAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgIH0KKworICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRRdWV1ZXMoKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0UXVldWVzIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgIH0KKworICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRRdWV1ZXNXaXRoTm9kZShTdHJpbmcgbm9kZUlkKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0UXVldWVzV2l0aE5vZGUiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIG5vZGVJZCkpOworICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBraWxsSm9iKFN0cmluZyBqb2JJZCkgeworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJraWxsSm9iIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBqb2JJZCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoU3RyaW5nIG5vZGVJZCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJyZW1vdmVOb2RlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBub2RlSWQpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgcmVtb3ZlTm9kZUZyb21RdWV1ZShTdHJpbmcgbm9kZUlkLCBTdHJpbmcgcXVldWVOYW1lKSB0aHJvd3MgUXVldWVNYW5hZ2VyRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygicmVtb3ZlTm9kZUZyb21RdWV1ZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgbm9kZUlkLCBxdWV1ZU5hbWUpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgcmVtb3ZlUXVldWUoU3RyaW5nIHF1ZXVlTmFtZSkgdGhyb3dzIFF1ZXVlTWFuYWdlckV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoInJlbW92ZVF1ZXVlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSBxdWV1ZU5hbWUpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Tm9kZUNhcGFjaXR5KFN0cmluZyBub2RlSWQsIGludCBjYXBhY2l0eSkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb257CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoInNldE5vZGVDYXBhY2l0eSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgbm9kZUlkLCBjYXBhY2l0eSkpOworICAgfQorCisgICBwdWJsaWMgU3RyaW5nIHN1Ym1pdEpvYihKb2IgZXhlYywgSm9iSW5wdXQgaW4pIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJzdWJtaXRKb2IiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGV4ZWMsIGluKSk7CisgICAgICByZXR1cm4gIlRlc3RKb2JJZCI7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHN1Ym1pdEpvYihKb2IgZXhlYywgSm9iSW5wdXQgaW4sIFVSTCB1cmwpIHRocm93cyBKb2JFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJzdWJtaXRKb2IiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGV4ZWMsIGluLCB1cmwpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBwdWJsaWMgY2xhc3MgTWV0aG9kQ2FsbERldGFpbHMgeworICAgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGFyZ3M7CisKKyAgICAgIHB1YmxpYyBNZXRob2RDYWxsRGV0YWlscyhTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdDxPYmplY3Q+IGFyZ3MpIHsKKyAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisgICAgICAgICByZXR1cm4gbWV0aG9kTmFtZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBcmdzKCkgeworICAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zeXN0ZW0vVGVzdFhtbFJwY1Jlc291cmNlTWFuYWdlci5qYXZhIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3lzdGVtL1Rlc3RYbWxScGNSZXNvdXJjZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmMwMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3lzdGVtL1Rlc3RYbWxScGNSZXNvdXJjZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuTW9uaXRvckV4Y2VwdGlvbjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqCisgKiBUZXN0IGhhcm5lc3MgZm9yIHRoZSB7QGxpbmsgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyfS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIHJhaml0aAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RYbWxScGNSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBGaWxlIHRtcFBvbGljeURpcjsKKworICBwcml2YXRlIFhtbFJwY1Jlc291cmNlTWFuYWdlciBybTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk1fUE9SVCA9IDUwMDAxOworCisgIC8qKgorICAgKiBAc2luY2UgT09EVC0xODIKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3REeW5TZXROb2RlQ2FwYWNpdHkoKSB7CisgICAgWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHJtYyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHJtYyA9IG5ldyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiCisgICAgICAgICAgKyBSTV9QT1JUKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwocm1jKTsKKyAgICB0cnkgeworICAgICAgcm1jLnNldE5vZGVDYXBhY2l0eSgibG9jYWxob3N0IiwgOCk7CisgICAgfSBjYXRjaCAoTW9uaXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBpbnQgc2V0Q2FwYWNpdHkgPSAtMTsKKyAgICB0cnkgeworICAgICAgc2V0Q2FwYWNpdHkgPSBybWMuZ2V0Tm9kZUJ5SWQoImxvY2FsaG9zdCIpLmdldENhcGFjaXR5KCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoOCwgc2V0Q2FwYWNpdHkpOworCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqCisgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGdlbmVyYXRlVGVzdENvbmZpZ3VyYXRpb24oKTsKKyAgICB0aGlzLnJtID0gbmV3IFhtbFJwY1Jlc291cmNlTWFuYWdlcihSTV9QT1JUKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICoKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGhpcy5ybS5zaHV0ZG93bigpOworICAgIGRlbGV0ZUFsbEZpbGVzKHRoaXMudG1wUG9saWN5RGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkZWxldGVBbGxGaWxlcyhTdHJpbmcgc3RhcnREaXIpIHsKKyAgICBGaWxlIHN0YXJ0RGlyRmlsZSA9IG5ldyBGaWxlKHN0YXJ0RGlyKTsKKyAgICBGaWxlW10gZGVsRmlsZXMgPSBzdGFydERpckZpbGUubGlzdEZpbGVzKCk7CisKKyAgICBpZiAoZGVsRmlsZXMgIT0gbnVsbCAmJiBkZWxGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGRlbEZpbGVzW2ldLmRlbGV0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHN0YXJ0RGlyRmlsZS5kZWxldGUoKTsKKworICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUZXN0Q29uZmlndXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUHJvcGVydGllcyBjb25maWcgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgU3RyaW5nIHByb3BlcnRpZXNGaWxlID0gIi4iICsgRmlsZS5zZXBhcmF0b3IgKyAic3JjIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0LnJlc291cmNlLnByb3BlcnRpZXMiOworICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHByb3BlcnRpZXNGaWxlKSkpOworCisgICAgLy8gc3RhZ2UgcG9saWN5CisgICAgRmlsZSB0bXBQb2xpY3lEaXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICB0bXBQb2xpY3lEaXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgImlnbm9yZSIpLmdldFBhcmVudEZpbGUoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIGZvciAoRmlsZSBwb2xpY3lGaWxlIDogbmV3IEZpbGUoIi4vc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbGljeSIpCisgICAgICAgIC5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhtbCIpOworICAgICAgICAgIH0KKyAgICAgICAgfSkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KHBvbGljeUZpbGUsIHRtcFBvbGljeURpcik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25maWcuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXMuZGlycyIsIHRtcFBvbGljeURpcgorICAgICAgICAudG9VUkkoKS50b1N0cmluZygpKTsKKyAgICBjb25maWcuc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXRvcXVldWVzLmRpcnMiLAorICAgICAgICB0bXBQb2xpY3lEaXIudG9VUkkoKS50b1N0cmluZygpKTsKKworICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0QWxsKGNvbmZpZyk7CisgICAgdGhpcy50bXBQb2xpY3lEaXIgPSB0bXBQb2xpY3lEaXI7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9UZXN0VWxpbWl0LmphdmEgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS91dGlsL1Rlc3RVbGltaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTA4ODdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9UZXN0VWxpbWl0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRlc3QgY2FzZSBmb3IgdGhlIFVsaW1pdCBtb25pdG9yaW5nIEFQSS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VWxpbWl0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1heE9wZW5GaWxlcygpIHsKKyAgICAgICAgU3RyaW5nIG1heE9wZW5GaWxlcyA9IFVsaW1pdC5nZXRNYXhPcGVuRmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXhPcGVuRmlsZXMpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBVbGltaXRQcm9wZXJ0eSgiZm9vIiwgbWF4T3BlbkZpbGVzKS5pc1VubGltaXRlZCgpCisgICAgICAgICAgICAgICAgfHwgIW5ldyBVbGltaXRQcm9wZXJ0eSgiZm9vIiwgbWF4T3BlbkZpbGVzKS5pc1VubGltaXRlZCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbGltaXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgU3RyaW5nIG1heFN0YWNrU2l6ZSA9IFVsaW1pdC5nZXRNYXhTdGFja1NpemUoKTsKKyAgICAgICAgaWYgKG5ldyBVbGltaXRQcm9wZXJ0eSgiZm9vIiwgbWF4U3RhY2tTaXplKS5pc1VubGltaXRlZCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBVbGltaXRQcm9wZXJ0eSgiZm9vIiwgbWF4U3RhY2tTaXplKS5nZXRJbnRWYWx1ZSgpID09IC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmV3IFVsaW1pdFByb3BlcnR5KCJmb28iLCBtYXhTdGFja1NpemUpLmdldEludFZhbHVlKCkgIT0gLTEpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L3Jlc291cmNlcy9wb2xpY3kvbm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbCBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbGljeS9ub2RlLXRvLXF1ZXVlLW1hcHBpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjBlYmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L3Jlc291cmNlcy9wb2xpY3kvbm9kZS10by1xdWV1ZS1tYXBwaW5nLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxjYXM6bm9kZS10by1xdWV1ZS1tYXBwaW5nIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxub2RlIGlkPSJsb2NhbGhvc3QiPgorCQk8cXVldWVzPgorCQkJPHF1ZXVlIG5hbWU9ImhpZ2giLz4KKwkJCTxxdWV1ZSBuYW1lPSJxdWljayIvPgorCQkJPHF1ZXVlIG5hbWU9ImxvbmciLz4KKwkJPC9xdWV1ZXM+CisJPC9ub2RlPgkKKzwvY2FzOm5vZGUtdG8tcXVldWUtbWFwcGluZz4KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbGljeS9ub2Rlcy54bWwgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L3Jlc291cmNlcy9wb2xpY3kvbm9kZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDQxNWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L3Jlc291cmNlcy9wb2xpY3kvbm9kZXMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGNhczpyZXNvdXJjZW5vZGVzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTxub2RlIG5vZGVJZD0ibG9jYWxob3N0IiBpcD0iaHR0cDovL2xvY2FsaG9zdDoyMDAxIiBjYXBhY2l0eT0iOCIvPgorCTwhLS0gRW52UmVwbGFjZSBFeGFtcGxlIAorCTxub2RlIG5vZGVJZD0ic29tZWhvc3QiIGlwPSJodHRwOi8vc29tZWhvc3Q6W0JBVENIX1NUVUJfUE9SVF0iIGNhcGFjaXR5PSI4IiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisJLS0+Cis8L2NhczpyZXNvdXJjZW5vZGVzPgpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9yZXNvdXJjZXMvcmVzb3VyY2Vtb24vZ2FuZ2xpYVhNTGR1bXAueG1sIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9yZXNvdXJjZXMvcmVzb3VyY2Vtb24vZ2FuZ2xpYVhNTGR1bXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMDYyODcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L3Jlc291cmNlcy9yZXNvdXJjZW1vbi9nYW5nbGlhWE1MZHVtcC54bWwKQEAgLTAsMCArMSw4NjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIEdBTkdMSUFfWE1MIFsKKyAgICAgICAgPCFFTEVNRU5UIEdBTkdMSUFfWE1MIChHUklEfENMVVNURVJ8SE9TVCkqPgorICAgICAgICA8IUFUVExJU1QgR0FOR0xJQV9YTUwgVkVSU0lPTiBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhQVRUTElTVCBHQU5HTElBX1hNTCBTT1VSQ0UgQ0RBVEEgI1JFUVVJUkVEPgorICAgICAgICA8IUVMRU1FTlQgR1JJRCAoQ0xVU1RFUiB8IEdSSUQgfCBIT1NUUyB8IE1FVFJJQ1MpKj4KKyAgICAgICAgPCFBVFRMSVNUIEdSSUQgTkFNRSBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhQVRUTElTVCBHUklEIEFVVEhPUklUWSBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhQVRUTElTVCBHUklEIExPQ0FMVElNRSBDREFUQSAjSU1QTElFRD4KKyAgICAgICAgPCFFTEVNRU5UIENMVVNURVIgKEhPU1QgfCBIT1NUUyB8IE1FVFJJQ1MpKj4KKyAgICAgICAgPCFBVFRMSVNUIENMVVNURVIgTkFNRSBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhQVRUTElTVCBDTFVTVEVSIE9XTkVSIENEQVRBICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgQ0xVU1RFUiBMQVRMT05HIENEQVRBICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgQ0xVU1RFUiBVUkwgQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBDTFVTVEVSIExPQ0FMVElNRSBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhRUxFTUVOVCBIT1NUIChNRVRSSUMpKj4KKyAgICAgICAgPCFBVFRMSVNUIEhPU1QgTkFNRSBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhQVRUTElTVCBIT1NUIElQIENEQVRBICNSRVFVSVJFRD4KKyAgICAgICAgPCFBVFRMSVNUIEhPU1QgTE9DQVRJT04gQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBIT1NUIFJFUE9SVEVEIENEQVRBICNSRVFVSVJFRD4KKyAgICAgICAgPCFBVFRMSVNUIEhPU1QgVE4gQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBIT1NUIFRNQVggQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBIT1NUIERNQVggQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBIT1NUIEdNT05EX1NUQVJURUQgQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhRUxFTUVOVCBNRVRSSUMgKEVYVFJBX0RBVEEqKT4KKyAgICAgICAgPCFBVFRMSVNUIE1FVFJJQyBOQU1FIENEQVRBICNSRVFVSVJFRD4KKyAgICAgICAgPCFBVFRMSVNUIE1FVFJJQyBWQUwgQ0RBVEEgI1JFUVVJUkVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDIFRZUEUgKHN0cmluZyB8IGludDggfCB1aW50OCB8IGludDE2IHwgdWludDE2IHwgaW50MzIgfCB1aW50MzIgfCBmbG9hdCB8IGRvdWJsZSB8IHRpbWVzdGFtcCkgI1JFUVVJUkVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDIFVOSVRTIENEQVRBICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDIFROIENEQVRBICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDIFRNQVggQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBNRVRSSUMgRE1BWCBDREFUQSAjSU1QTElFRD4KKyAgICAgICAgPCFBVFRMSVNUIE1FVFJJQyBTTE9QRSAoemVybyB8IHBvc2l0aXZlIHwgbmVnYXRpdmUgfCBib3RoIHwgdW5zcGVjaWZpZWQpICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDIFNPVVJDRSAoZ21vbmQpICdnbW9uZCc+CisgICAgICAgIDwhRUxFTUVOVCBFWFRSQV9EQVRBIChFWFRSQV9FTEVNRU5UKik+CisgICAgICAgIDwhRUxFTUVOVCBFWFRSQV9FTEVNRU5UIEVNUFRZPgorICAgICAgICA8IUFUVExJU1QgRVhUUkFfRUxFTUVOVCBOQU1FIENEQVRBICNSRVFVSVJFRD4KKyAgICAgICAgPCFBVFRMSVNUIEVYVFJBX0VMRU1FTlQgVkFMIENEQVRBICNSRVFVSVJFRD4KKyAgICAgICAgPCFFTEVNRU5UIEhPU1RTIEVNUFRZPgorICAgICAgICA8IUFUVExJU1QgSE9TVFMgVVAgQ0RBVEEgI1JFUVVJUkVEPgorICAgICAgICA8IUFUVExJU1QgSE9TVFMgRE9XTiBDREFUQSAjUkVRVUlSRUQ+CisgICAgICAgIDwhQVRUTElTVCBIT1NUUyBTT1VSQ0UgKGdtb25kIHwgZ21ldGFkKSAjUkVRVUlSRUQ+CisgICAgICAgIDwhRUxFTUVOVCBNRVRSSUNTIChFWFRSQV9EQVRBKik+CisgICAgICAgIDwhQVRUTElTVCBNRVRSSUNTIE5BTUUgQ0RBVEEgI1JFUVVJUkVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDUyBTVU0gQ0RBVEEgI1JFUVVJUkVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDUyBOVU0gQ0RBVEEgI1JFUVVJUkVEPgorICAgICAgICA8IUFUVExJU1QgTUVUUklDUyBUWVBFIChzdHJpbmcgfCBpbnQ4IHwgdWludDggfCBpbnQxNiB8IHVpbnQxNiB8IGludDMyIHwgdWludDMyIHwgZmxvYXQgfCBkb3VibGUgfCB0aW1lc3RhbXApICNSRVFVSVJFRD4KKyAgICAgICAgPCFBVFRMSVNUIE1FVFJJQ1MgVU5JVFMgQ0RBVEEgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBNRVRSSUNTIFNMT1BFICh6ZXJvIHwgcG9zaXRpdmUgfCBuZWdhdGl2ZSB8IGJvdGggfCB1bnNwZWNpZmllZCkgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCBNRVRSSUNTIFNPVVJDRSAoZ21vbmQpICdnbW9uZCc+CisgICAgICAgIF0+Cis8R0FOR0xJQV9YTUwgVkVSU0lPTj0iMy4xLjciIFNPVVJDRT0iZ21ldGFkIj4KKyAgICA8R1JJRCBOQU1FPSJ1bnNwZWNpZmllZCIgQVVUSE9SSVRZPSJodHRwOi8vdWJ1bnR1L2dhbmdsaWEvIiBMT0NBTFRJTUU9IjEzNzAxODc2NDgiPgorICAgICAgICA8Q0xVU1RFUiBOQU1FPSJsb2NhbGNsdXN0ZXIiIExPQ0FMVElNRT0iMTM3MDE4NzY0NSIgT1dORVI9Im9vZHQiIExBVExPTkc9Ik4zMi44NyBXMTE3LjIyIgorICAgICAgICAgICAgICAgICBVUkw9Imh0dHA6Ly93d3cubXljbHVzdGVyLm9yZy8iPgorICAgICAgICAgICAgPEhPU1QgTkFNRT0ibG9jYWxob3N0IiBJUD0iMTI3LjAuMC4xIiBSRVBPUlRFRD0iMTM3MDE4NzYzNyIgVE49IjEwIiBUTUFYPSIyMCIgRE1BWD0iMCIgTE9DQVRJT049IjAsMCwwIgorICAgICAgICAgICAgICAgICAgR01PTkRfU1RBUlRFRD0iMTM3MDE4NjIzNyI+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJkaXNrX2ZyZWUiIFZBTD0iMzA3Ljc5MCIgVFlQRT0iZG91YmxlIiBVTklUUz0iR0IiIFROPSIxNDMiIFRNQVg9IjE4MCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJkaXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIGZyZWUgZGlzayBzcGFjZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRGlzayBTcGFjZSBBdmFpbGFibGUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWFjaGluZV90eXBlIiBWQUw9Ing4Nl82NCIgVFlQRT0ic3RyaW5nIiBVTklUUz0iIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9Inplcm8iIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJTeXN0ZW0gYXJjaGl0ZWN0dXJlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNYWNoaW5lIFR5cGUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iYnl0ZXNfb3V0IiBWQUw9IjEwMjIuNTkiIFRZUEU9ImZsb2F0IiBVTklUUz0iYnl0ZXMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9Ik51bWJlciBvZiBieXRlcyBvdXQgcGVyIHNlY29uZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQnl0ZXMgU2VudCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJnZXhlYyIgVkFMPSJPRkYiIFRZUEU9InN0cmluZyIgVU5JVFM9IiIgVE49IjIwMyIgVE1BWD0iMzAwIiBETUFYPSIwIiBTTE9QRT0iemVybyIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNvcmUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iZ2V4ZWMgYXZhaWxhYmxlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJHZXhlYyBTdGF0dXMiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0icHJvY190b3RhbCIgVkFMPSI1ODAiIFRZUEU9InVpbnQzMiIgVU5JVFM9IiAiIFROPSI0MyIgVE1BWD0iOTUwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InByb2Nlc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgbnVtYmVyIG9mIHByb2Nlc3NlcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iVG90YWwgUHJvY2Vzc2VzIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9uaWNlIiBWQUw9IjAuMCIgVFlQRT0iZmxvYXQiIFVOSVRTPSIlIiBUTj0iMjIiIFRNQVg9IjkwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTD0iUGVyY2VudGFnZSBvZiBDUFUgdXRpbGl6YXRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgYXQgdGhlIHVzZXIgbGV2ZWwgd2l0aCBuaWNlIHByaW9yaXR5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgTmljZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwa3RzX2luIiBWQUw9IjQuODUiIFRZUEU9ImZsb2F0IiBVTklUUz0icGFja2V0cy9zZWMiIFROPSI4MyIgVE1BWD0iMzAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9ImJvdGgiIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im5ldHdvcmsiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iUGFja2V0cyBpbiBwZXIgc2Vjb25kIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJQYWNrZXRzIFJlY2VpdmVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9zcGVlZCIgVkFMPSIyMjY3IiBUWVBFPSJ1aW50MzIiIFVOSVRTPSJNSHoiIFROPSIyMDMiIFRNQVg9IjEyMDAiIERNQVg9IjAiIFNMT1BFPSJ6ZXJvIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkNQVSBTcGVlZCBpbiB0ZXJtcyBvZiBNSHoiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBTcGVlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJib290dGltZSIgVkFMPSIxMzcwMTcyMzY0IiBUWVBFPSJ1aW50MzIiIFVOSVRTPSJzIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9Inplcm8iIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJUaGUgbGFzdCB0aW1lIHRoYXQgdGhlIHN5c3RlbSB3YXMgc3RhcnRlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iTGFzdCBCb290IFRpbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iY3B1X3dpbyIgVkFMPSIxLjkiIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSI5MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUw9IlBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBDUFUgb3IgQ1BVcyB3ZXJlIGlkbGUgZHVyaW5nIHdoaWNoIHRoZSBzeXN0ZW0gaGFkIGFuIG91dHN0YW5kaW5nIGRpc2sgSS9PIHJlcXVlc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSB3aW8iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ib3NfbmFtZSIgVkFMPSJMaW51eCIgVFlQRT0ic3RyaW5nIiBVTklUUz0iIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIiBTTE9QRT0iemVybyIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJPcGVyYXRpbmcgc3lzdGVtIG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9Ik9wZXJhdGluZyBTeXN0ZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibG9hZF9vbmUiIFZBTD0iMS4wNiIgVFlQRT0iZmxvYXQiIFVOSVRTPSIgIiBUTj0iNTMiIFRNQVg9IjcwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImxvYWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iT25lIG1pbnV0ZSBsb2FkIGF2ZXJhZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9Ik9uZSBNaW51dGUgTG9hZCBBdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im9zX3JlbGVhc2UiIFZBTD0iMy4yLjAtNDUtZ2VuZXJpYyIgVFlQRT0ic3RyaW5nIiBVTklUUz0iIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9Inplcm8iIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJPcGVyYXRpbmcgc3lzdGVtIHJlbGVhc2UgZGF0ZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iT3BlcmF0aW5nIFN5c3RlbSBSZWxlYXNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImRpc2tfdG90YWwiIFZBTD0iMTA0Mi4yMjIiIFRZUEU9ImRvdWJsZSIgVU5JVFM9IkdCIiBUTj0iMTQwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJkaXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIGF2YWlsYWJsZSBkaXNrIHNwYWNlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJUb3RhbCBEaXNrIFNwYWNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV91c2VyIiBWQUw9IjguMCIgVFlQRT0iZmxvYXQiIFVOSVRTPSIlIiBUTj0iMjIiIFRNQVg9IjkwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTD0iUGVyY2VudGFnZSBvZiBDUFUgdXRpbGl6YXRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgYXQgdGhlIHVzZXIgbGV2ZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBVc2VyIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9pZGxlIiBWQUw9Ijg4LjciIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSI5MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUw9IlBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBDUFUgb3IgQ1BVcyB3ZXJlIGlkbGUgYW5kIHRoZSBzeXN0ZW0gZGlkIG5vdCBoYXZlIGFuIG91dHN0YW5kaW5nIGRpc2sgSS9PIHJlcXVlc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBJZGxlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InN3YXBfZnJlZSIgVkFMPSIyMDk3MTQ4IiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2YgYXZhaWxhYmxlIHN3YXAgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJGcmVlIFN3YXAgU3BhY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWVtX2NhY2hlZCIgVkFMPSIzMTAwMTAwIiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2YgY2FjaGVkIG1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQ2FjaGVkIE1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwa3RzX291dCIgVkFMPSI0LjgwIiBUWVBFPSJmbG9hdCIgVU5JVFM9InBhY2tldHMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlBhY2tldHMgb3V0IHBlciBzZWNvbmQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IlBhY2tldHMgU2VudCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJsb2FkX2ZpdmUiIFZBTD0iMC44MiIgVFlQRT0iZmxvYXQiIFVOSVRTPSIgIiBUTj0iNTMiIFRNQVg9IjMyNSIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJsb2FkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkZpdmUgbWludXRlIGxvYWQgYXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRml2ZSBNaW51dGUgTG9hZCBBdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9udW0iIFZBTD0iNCIgVFlQRT0idWludDE2IiBVTklUUz0iQ1BVcyIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIgU0xPUEU9Inplcm8iCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgbnVtYmVyIG9mIENQVXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBDb3VudCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJsb2FkX2ZpZnRlZW4iIFZBTD0iMC42OCIgVFlQRT0iZmxvYXQiIFVOSVRTPSIgIiBUTj0iNTMiIFRNQVg9Ijk1MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJsb2FkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkZpZnRlZW4gbWludXRlIGxvYWQgYXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRmlmdGVlbiBNaW51dGUgTG9hZCBBdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im1lbV9mcmVlIiBWQUw9IjIyODEwOCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjMiIFRNQVg9IjE4MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iQW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkZyZWUgTWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9zeXN0ZW0iIFZBTD0iMS4yIiBUWVBFPSJmbG9hdCIgVU5JVFM9IiUiIFROPSIyMiIgVE1BWD0iOTAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMPSJQZXJjZW50YWdlIG9mIENQVSB1dGlsaXphdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyBhdCB0aGUgc3lzdGVtIGxldmVsIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgU3lzdGVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InByb2NfcnVuIiBWQUw9IjEiIFRZUEU9InVpbnQzMiIgVU5JVFM9IiAiIFROPSI0MyIgVE1BWD0iOTUwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InByb2Nlc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgbnVtYmVyIG9mIHJ1bm5pbmcgcHJvY2Vzc2VzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJUb3RhbCBSdW5uaW5nIFByb2Nlc3NlcyIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fdG90YWwiIFZBTD0iODE2OTAzMiIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgYW1vdW50IG9mIG1lbW9yeSBkaXNwbGF5ZWQgaW4gS0JzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNZW1vcnkgVG90YWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iY3B1X2FpZGxlIiBWQUw9Ijg3LjEiIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSIzODAwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJQZXJjZW50IG9mIHRpbWUgc2luY2UgYm9vdCBpZGxlIENQVSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQ1BVIGFpZGxlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImJ5dGVzX2luIiBWQUw9IjE0MTcuNDMiIFRZUEU9ImZsb2F0IiBVTklUUz0iYnl0ZXMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9Ik51bWJlciBvZiBieXRlcyBpbiBwZXIgc2Vjb25kIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJCeXRlcyBSZWNlaXZlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fYnVmZmVycyIgVkFMPSIyNDM2NjIwIiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2YgYnVmZmVyZWQgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNZW1vcnkgQnVmZmVycyIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fc2hhcmVkIiBWQUw9IjAiIFRZUEU9ImZsb2F0IiBVTklUUz0iS0IiIFROPSIzIiBUTUFYPSIxODAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkFtb3VudCBvZiBzaGFyZWQgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJTaGFyZWQgTWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InN3YXBfdG90YWwiIFZBTD0iMjA5NzE0OCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgYW1vdW50IG9mIHN3YXAgc3BhY2UgZGlzcGxheWVkIGluIEtCcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iU3dhcCBTcGFjZSBUb3RhbCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwYXJ0X21heF91c2VkIiBWQUw9Ijc3LjciIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjE0MyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImRpc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iTWF4aW11bSBwZXJjZW50IHVzZWQgZm9yIGFsbCBwYXJ0aXRpb25zIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNYXhpbXVtIERpc2sgU3BhY2UgVXNlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICA8L0hPU1Q+CisgICAgICAgICAgICA8SE9TVCBOQU1FPSJsb2NhbGhvc3QyIiBJUD0iMTI3LjAuMC4xIiBSRVBPUlRFRD0iMTM3MDE4NzYzNyIgVE49IjEwIiBUTUFYPSIyMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgIExPQ0FUSU9OPSJ1bnNwZWNpZmllZCIgR01PTkRfU1RBUlRFRD0iMTM3MDE4NjIzNyI+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJkaXNrX2ZyZWUiIFZBTD0iMzA3Ljc5MCIgVFlQRT0iZG91YmxlIiBVTklUUz0iR0IiIFROPSIxNDMiIFRNQVg9IjE4MCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJkaXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIGZyZWUgZGlzayBzcGFjZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRGlzayBTcGFjZSBBdmFpbGFibGUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWFjaGluZV90eXBlIiBWQUw9Ing4Nl82NCIgVFlQRT0ic3RyaW5nIiBVTklUUz0iIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9Inplcm8iIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJTeXN0ZW0gYXJjaGl0ZWN0dXJlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNYWNoaW5lIFR5cGUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iYnl0ZXNfb3V0IiBWQUw9IjEwMjIuNTkiIFRZUEU9ImZsb2F0IiBVTklUUz0iYnl0ZXMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9Ik51bWJlciBvZiBieXRlcyBvdXQgcGVyIHNlY29uZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQnl0ZXMgU2VudCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJnZXhlYyIgVkFMPSJPRkYiIFRZUEU9InN0cmluZyIgVU5JVFM9IiIgVE49IjIwMyIgVE1BWD0iMzAwIiBETUFYPSIwIiBTTE9QRT0iemVybyIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNvcmUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iZ2V4ZWMgYXZhaWxhYmxlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJHZXhlYyBTdGF0dXMiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0icHJvY190b3RhbCIgVkFMPSI1ODAiIFRZUEU9InVpbnQzMiIgVU5JVFM9IiAiIFROPSI0MyIgVE1BWD0iOTUwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InByb2Nlc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgbnVtYmVyIG9mIHByb2Nlc3NlcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iVG90YWwgUHJvY2Vzc2VzIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9uaWNlIiBWQUw9IjAuMCIgVFlQRT0iZmxvYXQiIFVOSVRTPSIlIiBUTj0iMjIiIFRNQVg9IjkwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTD0iUGVyY2VudGFnZSBvZiBDUFUgdXRpbGl6YXRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgYXQgdGhlIHVzZXIgbGV2ZWwgd2l0aCBuaWNlIHByaW9yaXR5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgTmljZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwa3RzX2luIiBWQUw9IjQuODUiIFRZUEU9ImZsb2F0IiBVTklUUz0icGFja2V0cy9zZWMiIFROPSI4MyIgVE1BWD0iMzAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9ImJvdGgiIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im5ldHdvcmsiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iUGFja2V0cyBpbiBwZXIgc2Vjb25kIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJQYWNrZXRzIFJlY2VpdmVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9zcGVlZCIgVkFMPSIyMjY3IiBUWVBFPSJ1aW50MzIiIFVOSVRTPSJNSHoiIFROPSIyMDMiIFRNQVg9IjEyMDAiIERNQVg9IjAiIFNMT1BFPSJ6ZXJvIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkNQVSBTcGVlZCBpbiB0ZXJtcyBvZiBNSHoiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBTcGVlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJib290dGltZSIgVkFMPSIxMzcwMTcyMzY0IiBUWVBFPSJ1aW50MzIiIFVOSVRTPSJzIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9Inplcm8iIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJUaGUgbGFzdCB0aW1lIHRoYXQgdGhlIHN5c3RlbSB3YXMgc3RhcnRlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iTGFzdCBCb290IFRpbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iY3B1X3dpbyIgVkFMPSIxLjkiIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSI5MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUw9IlBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBDUFUgb3IgQ1BVcyB3ZXJlIGlkbGUgZHVyaW5nIHdoaWNoIHRoZSBzeXN0ZW0gaGFkIGFuIG91dHN0YW5kaW5nIGRpc2sgSS9PIHJlcXVlc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSB3aW8iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ib3NfbmFtZSIgVkFMPSJMaW51eCIgVFlQRT0ic3RyaW5nIiBVTklUUz0iIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIiBTTE9QRT0iemVybyIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJPcGVyYXRpbmcgc3lzdGVtIG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9Ik9wZXJhdGluZyBTeXN0ZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibG9hZF9vbmUiIFZBTD0iMS4wNiIgVFlQRT0iZmxvYXQiIFVOSVRTPSIgIiBUTj0iNTMiIFRNQVg9IjcwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImxvYWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iT25lIG1pbnV0ZSBsb2FkIGF2ZXJhZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9Ik9uZSBNaW51dGUgTG9hZCBBdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im9zX3JlbGVhc2UiIFZBTD0iMy4yLjAtNDUtZ2VuZXJpYyIgVFlQRT0ic3RyaW5nIiBVTklUUz0iIiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgU0xPUEU9Inplcm8iIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJPcGVyYXRpbmcgc3lzdGVtIHJlbGVhc2UgZGF0ZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iT3BlcmF0aW5nIFN5c3RlbSBSZWxlYXNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImRpc2tfdG90YWwiIFZBTD0iMTA0Mi4yMjIiIFRZUEU9ImRvdWJsZSIgVU5JVFM9IkdCIiBUTj0iMTQwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJkaXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIGF2YWlsYWJsZSBkaXNrIHNwYWNlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJUb3RhbCBEaXNrIFNwYWNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV91c2VyIiBWQUw9IjguMCIgVFlQRT0iZmxvYXQiIFVOSVRTPSIlIiBUTj0iMjIiIFRNQVg9IjkwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTD0iUGVyY2VudGFnZSBvZiBDUFUgdXRpbGl6YXRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgYXQgdGhlIHVzZXIgbGV2ZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBVc2VyIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9pZGxlIiBWQUw9Ijg4LjciIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSI5MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUw9IlBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBDUFUgb3IgQ1BVcyB3ZXJlIGlkbGUgYW5kIHRoZSBzeXN0ZW0gZGlkIG5vdCBoYXZlIGFuIG91dHN0YW5kaW5nIGRpc2sgSS9PIHJlcXVlc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBJZGxlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InN3YXBfZnJlZSIgVkFMPSIyMDk3MTQ4IiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2YgYXZhaWxhYmxlIHN3YXAgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJGcmVlIFN3YXAgU3BhY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWVtX2NhY2hlZCIgVkFMPSIzMTAwMTAwIiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2YgY2FjaGVkIG1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQ2FjaGVkIE1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwa3RzX291dCIgVkFMPSI0LjgwIiBUWVBFPSJmbG9hdCIgVU5JVFM9InBhY2tldHMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlBhY2tldHMgb3V0IHBlciBzZWNvbmQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IlBhY2tldHMgU2VudCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJsb2FkX2ZpdmUiIFZBTD0iMC44MiIgVFlQRT0iZmxvYXQiIFVOSVRTPSIgIiBUTj0iNTMiIFRNQVg9IjMyNSIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJsb2FkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkZpdmUgbWludXRlIGxvYWQgYXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRml2ZSBNaW51dGUgTG9hZCBBdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9udW0iIFZBTD0iNCIgVFlQRT0idWludDE2IiBVTklUUz0iQ1BVcyIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIgU0xPUEU9Inplcm8iCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgbnVtYmVyIG9mIENQVXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBDb3VudCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJsb2FkX2ZpZnRlZW4iIFZBTD0iMC42OCIgVFlQRT0iZmxvYXQiIFVOSVRTPSIgIiBUTj0iNTMiIFRNQVg9Ijk1MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJsb2FkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkZpZnRlZW4gbWludXRlIGxvYWQgYXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRmlmdGVlbiBNaW51dGUgTG9hZCBBdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im1lbV9mcmVlIiBWQUw9IjIyODEwOCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjMiIFRNQVg9IjE4MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iQW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkZyZWUgTWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9zeXN0ZW0iIFZBTD0iMS4yIiBUWVBFPSJmbG9hdCIgVU5JVFM9IiUiIFROPSIyMiIgVE1BWD0iOTAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMPSJQZXJjZW50YWdlIG9mIENQVSB1dGlsaXphdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyBhdCB0aGUgc3lzdGVtIGxldmVsIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgU3lzdGVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InByb2NfcnVuIiBWQUw9IjEiIFRZUEU9InVpbnQzMiIgVU5JVFM9IiAiIFROPSI0MyIgVE1BWD0iOTUwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9InByb2Nlc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgbnVtYmVyIG9mIHJ1bm5pbmcgcHJvY2Vzc2VzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJUb3RhbCBSdW5uaW5nIFByb2Nlc3NlcyIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fdG90YWwiIFZBTD0iODE2OTAzMiIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgYW1vdW50IG9mIG1lbW9yeSBkaXNwbGF5ZWQgaW4gS0JzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNZW1vcnkgVG90YWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iY3B1X2FpZGxlIiBWQUw9Ijg3LjEiIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSIzODAwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJQZXJjZW50IG9mIHRpbWUgc2luY2UgYm9vdCBpZGxlIENQVSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQ1BVIGFpZGxlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImJ5dGVzX2luIiBWQUw9IjE0MTcuNDMiIFRZUEU9ImZsb2F0IiBVTklUUz0iYnl0ZXMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9Ik51bWJlciBvZiBieXRlcyBpbiBwZXIgc2Vjb25kIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJCeXRlcyBSZWNlaXZlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fYnVmZmVycyIgVkFMPSIyNDM2NjIwIiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2YgYnVmZmVyZWQgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNZW1vcnkgQnVmZmVycyIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fc2hhcmVkIiBWQUw9IjAiIFRZUEU9ImZsb2F0IiBVTklUUz0iS0IiIFROPSIzIiBUTUFYPSIxODAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkFtb3VudCBvZiBzaGFyZWQgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJTaGFyZWQgTWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InN3YXBfdG90YWwiIFZBTD0iMjA5NzE0OCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVG90YWwgYW1vdW50IG9mIHN3YXAgc3BhY2UgZGlzcGxheWVkIGluIEtCcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iU3dhcCBTcGFjZSBUb3RhbCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwYXJ0X21heF91c2VkIiBWQUw9Ijc3LjciIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjE0MyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImRpc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iTWF4aW11bSBwZXJjZW50IHVzZWQgZm9yIGFsbCBwYXJ0aXRpb25zIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJNYXhpbXVtIERpc2sgU3BhY2UgVXNlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICA8L0hPU1Q+CisgICAgICAgIDwvQ0xVU1RFUj4KKyAgICAgICAgPENMVVNURVIgTkFNRT0icmVtb3RlY2x1c3RlciIgTE9DQUxUSU1FPSIxMzcwMTgzNjQ1IiBPV05FUj0ib29kdCIgTEFUTE9ORz0iTjQyLjg3IFcxMTcuMzIiCisgICAgICAgICAgICAgICAgIFVSTD0iaHR0cDovL3d3dy5teTJjbHVzdGVyLm9yZy8iPgorICAgICAgICAgICAgPEhPU1QgTkFNRT0icmVtb3Rlbm9kZSIgSVA9IjEyNy4wLjAuMSIgUkVQT1JURUQ9IjEzNzAxODc2MzciIFROPSIxMCIgVE1BWD0iMjAiIERNQVg9IjAiIExPQ0FUSU9OPSIwLDAsMCIKKyAgICAgICAgICAgICAgICAgIEdNT05EX1NUQVJURUQ9IjEzNzAxODYyMzciPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iZGlza19mcmVlIiBWQUw9IjMwNy43OTAiIFRZUEU9ImRvdWJsZSIgVU5JVFM9IkdCIiBUTj0iMTQzIiBUTUFYPSIxODAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iYm90aCIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iZGlzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJUb3RhbCBmcmVlIGRpc2sgc3BhY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkRpc2sgU3BhY2UgQXZhaWxhYmxlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im1hY2hpbmVfdHlwZSIgVkFMPSJ4ODZfNjQiIFRZUEU9InN0cmluZyIgVU5JVFM9IiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJzeXN0ZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iU3lzdGVtIGFyY2hpdGVjdHVyZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iTWFjaGluZSBUeXBlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImJ5dGVzX291dCIgVkFMPSIxMDIyLjU5IiBUWVBFPSJmbG9hdCIgVU5JVFM9ImJ5dGVzL3NlYyIgVE49IjgzIiBUTUFYPSIzMDAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iYm90aCIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibmV0d29yayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJOdW1iZXIgb2YgYnl0ZXMgb3V0IHBlciBzZWNvbmQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkJ5dGVzIFNlbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iZ2V4ZWMiIFZBTD0iT0ZGIiBUWVBFPSJzdHJpbmciIFVOSVRTPSIiIFROPSIyMDMiIFRNQVg9IjMwMCIgRE1BWD0iMCIgU0xPUEU9Inplcm8iCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjb3JlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9ImdleGVjIGF2YWlsYWJsZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iR2V4ZWMgU3RhdHVzIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9InByb2NfdG90YWwiIFZBTD0iNTgwIiBUWVBFPSJ1aW50MzIiIFVOSVRTPSIgIiBUTj0iNDMiIFRNQVg9Ijk1MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJwcm9jZXNzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IlRvdGFsIFByb2Nlc3NlcyIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJjcHVfbmljZSIgVkFMPSIwLjAiIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSI5MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUw9IlBlcmNlbnRhZ2Ugb2YgQ1BVIHV0aWxpemF0aW9uIHRoYXQgb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIGF0IHRoZSB1c2VyIGxldmVsIHdpdGggbmljZSBwcmlvcml0eSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQ1BVIE5pY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0icGt0c19pbiIgVkFMPSI0Ljg1IiBUWVBFPSJmbG9hdCIgVU5JVFM9InBhY2tldHMvc2VjIiBUTj0iODMiIFRNQVg9IjMwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJib3RoIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJuZXR3b3JrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlBhY2tldHMgaW4gcGVyIHNlY29uZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iUGFja2V0cyBSZWNlaXZlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJjcHVfc3BlZWQiIFZBTD0iMjI2NyIgVFlQRT0idWludDMyIiBVTklUUz0iTUh6IiBUTj0iMjAzIiBUTUFYPSIxMjAwIiBETUFYPSIwIiBTTE9QRT0iemVybyIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJDUFUgU3BlZWQgaW4gdGVybXMgb2YgTUh6Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgU3BlZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0iYm9vdHRpbWUiIFZBTD0iMTM3MDE3MjM2NCIgVFlQRT0idWludDMyIiBVTklUUz0icyIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJzeXN0ZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iVGhlIGxhc3QgdGltZSB0aGF0IHRoZSBzeXN0ZW0gd2FzIHN0YXJ0ZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9Ikxhc3QgQm9vdCBUaW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV93aW8iIFZBTD0iMS45IiBUWVBFPSJmbG9hdCIgVU5JVFM9IiUiIFROPSIyMiIgVE1BWD0iOTAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMPSJQZXJjZW50YWdlIG9mIHRpbWUgdGhhdCB0aGUgQ1BVIG9yIENQVXMgd2VyZSBpZGxlIGR1cmluZyB3aGljaCB0aGUgc3lzdGVtIGhhZCBhbiBvdXRzdGFuZGluZyBkaXNrIEkvTyByZXF1ZXN0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgd2lvIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im9zX25hbWUiIFZBTD0iTGludXgiIFRZUEU9InN0cmluZyIgVU5JVFM9IiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIgU0xPUEU9Inplcm8iCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJzeXN0ZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iT3BlcmF0aW5nIHN5c3RlbSBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJPcGVyYXRpbmcgU3lzdGVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImxvYWRfb25lIiBWQUw9IjEuMDYiIFRZUEU9ImZsb2F0IiBVTklUUz0iICIgVE49IjUzIiBUTUFYPSI3MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJsb2FkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9Ik9uZSBtaW51dGUgbG9hZCBhdmVyYWdlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJPbmUgTWludXRlIExvYWQgQXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJvc19yZWxlYXNlIiBWQUw9IjMuMi4wLTQ1LWdlbmVyaWMiIFRZUEU9InN0cmluZyIgVU5JVFM9IiIgVE49IjIwMyIgVE1BWD0iMTIwMCIgRE1BWD0iMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNMT1BFPSJ6ZXJvIiBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJzeXN0ZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iT3BlcmF0aW5nIHN5c3RlbSByZWxlYXNlIGRhdGUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9Ik9wZXJhdGluZyBTeXN0ZW0gUmVsZWFzZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJkaXNrX3RvdGFsIiBWQUw9IjEwNDIuMjIyIiBUWVBFPSJkb3VibGUiIFVOSVRTPSJHQiIgVE49IjE0MDMiIFRNQVg9IjEyMDAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iYm90aCIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iZGlzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJUb3RhbCBhdmFpbGFibGUgZGlzayBzcGFjZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iVG90YWwgRGlzayBTcGFjZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJjcHVfdXNlciIgVkFMPSI4LjAiIFRZUEU9ImZsb2F0IiBVTklUUz0iJSIgVE49IjIyIiBUTUFYPSI5MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUw9IlBlcmNlbnRhZ2Ugb2YgQ1BVIHV0aWxpemF0aW9uIHRoYXQgb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIGF0IHRoZSB1c2VyIGxldmVsIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgVXNlciIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJjcHVfaWRsZSIgVkFMPSI4OC43IiBUWVBFPSJmbG9hdCIgVU5JVFM9IiUiIFROPSIyMiIgVE1BWD0iOTAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMPSJQZXJjZW50YWdlIG9mIHRpbWUgdGhhdCB0aGUgQ1BVIG9yIENQVXMgd2VyZSBpZGxlIGFuZCB0aGUgc3lzdGVtIGRpZCBub3QgaGF2ZSBhbiBvdXRzdGFuZGluZyBkaXNrIEkvTyByZXF1ZXN0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgSWRsZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJzd2FwX2ZyZWUiIFZBTD0iMjA5NzE0OCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjMiIFRNQVg9IjE4MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iQW1vdW50IG9mIGF2YWlsYWJsZSBzd2FwIG1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iRnJlZSBTd2FwIFNwYWNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9Im1lbV9jYWNoZWQiIFZBTD0iMzEwMDEwMCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjMiIFRNQVg9IjE4MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iQW1vdW50IG9mIGNhY2hlZCBtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNhY2hlZCBNZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0icGt0c19vdXQiIFZBTD0iNC44MCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJwYWNrZXRzL3NlYyIgVE49IjgzIiBUTUFYPSIzMDAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iYm90aCIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibmV0d29yayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJQYWNrZXRzIG91dCBwZXIgc2Vjb25kIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJQYWNrZXRzIFNlbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibG9hZF9maXZlIiBWQUw9IjAuODIiIFRZUEU9ImZsb2F0IiBVTklUUz0iICIgVE49IjUzIiBUTUFYPSIzMjUiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibG9hZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJGaXZlIG1pbnV0ZSBsb2FkIGF2ZXJhZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkZpdmUgTWludXRlIExvYWQgQXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJjcHVfbnVtIiBWQUw9IjQiIFRZUEU9InVpbnQxNiIgVU5JVFM9IkNQVXMiIFROPSIyMDMiIFRNQVg9IjEyMDAiIERNQVg9IjAiIFNMT1BFPSJ6ZXJvIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0iY3B1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIG51bWJlciBvZiBDUFVzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJDUFUgQ291bnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibG9hZF9maWZ0ZWVuIiBWQUw9IjAuNjgiIFRZUEU9ImZsb2F0IiBVTklUUz0iICIgVE49IjUzIiBUTUFYPSI5NTAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibG9hZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJGaWZ0ZWVuIG1pbnV0ZSBsb2FkIGF2ZXJhZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkZpZnRlZW4gTWludXRlIExvYWQgQXZlcmFnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJtZW1fZnJlZSIgVkFMPSIyMjgxMDgiIFRZUEU9ImZsb2F0IiBVTklUUz0iS0IiIFROPSIzIiBUTUFYPSIxODAiIERNQVg9IjAiIFNMT1BFPSJib3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IkFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJUSVRMRSIgVkFMPSJGcmVlIE1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJjcHVfc3lzdGVtIiBWQUw9IjEuMiIgVFlQRT0iZmxvYXQiIFVOSVRTPSIlIiBUTj0iMjIiIFRNQVg9IjkwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9ImNwdSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTD0iUGVyY2VudGFnZSBvZiBDUFUgdXRpbGl6YXRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgYXQgdGhlIHN5c3RlbSBsZXZlbCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQ1BVIFN5c3RlbSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJwcm9jX3J1biIgVkFMPSIxIiBUWVBFPSJ1aW50MzIiIFVOSVRTPSIgIiBUTj0iNDMiIFRNQVg9Ijk1MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJwcm9jZXNzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIG51bWJlciBvZiBydW5uaW5nIHByb2Nlc3NlcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iVG90YWwgUnVubmluZyBQcm9jZXNzZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWVtX3RvdGFsIiBWQUw9IjgxNjkwMzIiIFRZUEU9ImZsb2F0IiBVTklUUz0iS0IiIFROPSIyMDMiIFRNQVg9IjEyMDAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iemVybyIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIGFtb3VudCBvZiBtZW1vcnkgZGlzcGxheWVkIGluIEtCcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iTWVtb3J5IFRvdGFsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvRVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICA8L01FVFJJQz4KKyAgICAgICAgICAgICAgICA8TUVUUklDIE5BTUU9ImNwdV9haWRsZSIgVkFMPSI4Ny4xIiBUWVBFPSJmbG9hdCIgVU5JVFM9IiUiIFROPSIyMiIgVE1BWD0iMzgwMCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJjcHUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iUGVyY2VudCBvZiB0aW1lIHNpbmNlIGJvb3QgaWRsZSBDUFUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IkNQVSBhaWRsZSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJieXRlc19pbiIgVkFMPSIxNDE3LjQzIiBUWVBFPSJmbG9hdCIgVU5JVFM9ImJ5dGVzL3NlYyIgVE49IjgzIiBUTUFYPSIzMDAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iYm90aCIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibmV0d29yayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJOdW1iZXIgb2YgYnl0ZXMgaW4gcGVyIHNlY29uZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iQnl0ZXMgUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWVtX2J1ZmZlcnMiIFZBTD0iMjQzNjYyMCIgVFlQRT0iZmxvYXQiIFVOSVRTPSJLQiIgVE49IjMiIFRNQVg9IjE4MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJtZW1vcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkRFU0MiIFZBTD0iQW1vdW50IG9mIGJ1ZmZlcmVkIG1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iTWVtb3J5IEJ1ZmZlcnMiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0ibWVtX3NoYXJlZCIgVkFMPSIwIiBUWVBFPSJmbG9hdCIgVU5JVFM9IktCIiBUTj0iMyIgVE1BWD0iMTgwIiBETUFYPSIwIiBTTE9QRT0iYm90aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPVVJDRT0iZ21vbmQiPgorICAgICAgICAgICAgICAgICAgICA8RVhUUkFfREFUQT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IkdST1VQIiBWQUw9Im1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iREVTQyIgVkFMPSJBbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iU2hhcmVkIE1lbW9yeSIvPgorICAgICAgICAgICAgICAgICAgICA8L0VYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgPC9NRVRSSUM+CisgICAgICAgICAgICAgICAgPE1FVFJJQyBOQU1FPSJzd2FwX3RvdGFsIiBWQUw9IjIwOTcxNDgiIFRZUEU9ImZsb2F0IiBVTklUUz0iS0IiIFROPSIyMDMiIFRNQVg9IjEyMDAiIERNQVg9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICBTTE9QRT0iemVybyIgU09VUkNFPSJnbW9uZCI+CisgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iR1JPVVAiIFZBTD0ibWVtb3J5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9IlRvdGFsIGFtb3VudCBvZiBzd2FwIHNwYWNlIGRpc3BsYXllZCBpbiBLQnMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFWFRSQV9FTEVNRU5UIE5BTUU9IlRJVExFIiBWQUw9IlN3YXAgU3BhY2UgVG90YWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgICAgIDxNRVRSSUMgTkFNRT0icGFydF9tYXhfdXNlZCIgVkFMPSI3Ny43IiBUWVBFPSJmbG9hdCIgVU5JVFM9IiUiIFROPSIxNDMiIFRNQVg9IjE4MCIgRE1BWD0iMCIgU0xPUEU9ImJvdGgiCisgICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U9Imdtb25kIj4KKyAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0RBVEE+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJHUk9VUCIgVkFMPSJkaXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8RVhUUkFfRUxFTUVOVCBOQU1FPSJERVNDIiBWQUw9Ik1heGltdW0gcGVyY2VudCB1c2VkIGZvciBhbGwgcGFydGl0aW9ucyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVYVFJBX0VMRU1FTlQgTkFNRT0iVElUTEUiIFZBTD0iTWF4aW11bSBEaXNrIFNwYWNlIFVzZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9FWFRSQV9EQVRBPgorICAgICAgICAgICAgICAgIDwvTUVUUklDPgorICAgICAgICAgICAgPC9IT1NUPgorICAgICAgICA8L0NMVVNURVI+CisgICAgPC9HUklEPgorPC9HQU5HTElBX1hNTD4KZGlmZiAtLWdpdCBhLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwMmNlNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvcmVzb3VyY2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTEgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyMKKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgdHdvIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSByb290IGxvZ2dlcgorLmxldmVsID0gQUxMCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBzdWJzeXN0ZW1zCisKKyMgYmF0Y2htZ3Igc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLmxldmVsID0gSU5GTworCisjIG1vbml0b3Igc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IubGV2ZWwgPSBJTkZPCisKKyMgam9icXVldWUgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLmxldmVsID0gSU5GTworCisjIHNjaGVkdWxlciBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLmxldmVsID0gSU5GTworCisjIHN5c3RlbSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLmxldmVsID0gRklORQorCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjIAorb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmxldmVsID0gSU5GTwpkaWZmIC0tZ2l0IGEvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5yZXNvdXJjZS5wcm9wZXJ0aWVzIGIvMC4xMC9yZXNvdXJjZS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5yZXNvdXJjZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Jlc291cmNlL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LnJlc291cmNlLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3NiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorIworIworIyBQcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgUmVzb3VyY2UgTWFuYWdlcgorCisjIHJlc291cmNlIGJhdGNobWdyIGZhY3RvcnkKK3Jlc291cmNlLmJhdGNobWdyLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLlhtbFJwY0JhdGNoTWdyRmFjdG9yeQorCisjIHJlc291cmNlIG1vbml0b3IgZmFjdG9yeQorcmVzb3VyY2UubW9uaXRvci5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLkFzc2lnbm1lbnRNb25pdG9yRmFjdG9yeQorCisjIHJlc291cmNlIHNjaGVkdWxlciBmYWN0b3J5CityZXNvdXJjZS5zY2hlZHVsZXIuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLkxSVVNjaGVkdWxlckZhY3RvcnkKKworIyByZXNvdXJjZSBqb2JxdWV1ZSBmYWN0b3J5CityZXNvdXJjZS5qb2JxdWV1ZS5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5qb2JxdWV1ZS5Kb2JTdGFja0pvYlF1ZXVlRmFjdG9yeQorCisjIHJlc291cmNlIGpvYiByZXBvc2l0b3J5IGZhY3RvcnkKK3Jlc291cmNlLmpvYnJlcG8uZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5NZW1vcnlKb2JSZXBvc2l0b3J5RmFjdG9yeQorCisjIG5vZGUgcmVwb3NpdG9yeSBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLnJlcG8uZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uubm9kZXJlcG8uWG1sTm9kZVJlcG9zaXRvcnlGYWN0b3J5CisKKyMgcXVldWUgcmVwb3NpdG9yeSBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcy5yZXBvLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnF1ZXVlcmVwby5YbWxRdWV1ZVJlcG9zaXRvcnlGYWN0b3J5CisKKyMgcmVzb3VyY2Ugbm9kZXMgbW9uaXRvciBmYWN0b3J5CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLkdhbmdsaWFSZXNvdXJjZU1vbml0b3JGYWN0b3J5CisKKyMgZ2FuZ2xpYSByZXNvdXJjZSBtb25pdG9yJ3MgbG9hZCBjYWxjdWxhdG9yIGZhY3RvcnkKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmdhbmdsaWEubG9hZGNhbGMuV2VpZ2h0ZWRBdmVyYWdlTG9hZENhbGNGYWN0b3J5CisKKyMgSm9iU3RhY2sgSm9iUXVldWUgY29uZmlnIHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuam9ic3RhY2subWF4c3RhY2tzaXplPTEwMDAKKworIyBYTUwgTFJVU2NoZWR1bGVyIGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci53YWl0LnNlY29uZHM9MjAKKworIyBYTUwtUlBDIGNvbmZpZ3VyYXRpb24gcHJvcHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLnhtbHJwYy5yZXF1ZXN0VGltZW91dC5taW51dGVzPTIwCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN5c3RlbS54bWxycGMuY29ubmVjdGlvblRpbWVvdXQubWludXRlcz02MAorCisjIFhTdHJlYW0gSm9iUmVwbyBjb25maWd1cmF0aW9uIHByb3BzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8ueHN0cmVhbS53b3JraW5nLmRpcj1bSE9NRV0vam9iLXJlcG8KK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby54c3RyZWFtLm1heC5oaXN0b3J5PTQwMDAKKworIyBYTUwgTm9kZSBSZXBvc2l0b3J5IGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGVzLmRpcnM9ZmlsZTovL1tIT01FXS9ub2RlcyxmaWxlOi8vW0hPTUVdL25vZGVzMgorCisjIFhNTCBRdWV1ZSBSZXBvc2l0b3J5IGNvbmZpZyBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm5vZGV0b3F1ZXVlcy5kaXJzPWZpbGU6Ly9bSE9NRV0vbm9kZXMsZmlsZTovL1tIT01FXS9ub2RlczIKKworIyBMb2FkIGNhbGN1bGF0aW9uIHdlaWdodHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQubG9hZG9uZT0xCitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IubG9hZGNhbGMud2VpZ2h0LmxvYWRmaXZlPTUKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQubG9hZGZpZnRlZW49NQorb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLmxvYWRjYWxjLndlaWdodC5tZW1mcmVlPTIKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5sb2FkY2FsYy53ZWlnaHQuc3dhcGZyZWU9MQorCisjZ2FuZ2xpYSBtZXRhIGRhZW1vbiAoZ21ldGFkKSBob3N0IGRldGFpbHMKK29yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5nYW5nbGlhLmdlbXRhZC5ob3N0LmFkZHJlc3M9bG9jYWxob3N0CitvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuZ2FuZ2xpYS5nZW10YWQuaG9zdC5wb3J0PTg2NTkKKwpkaWZmIC0tZ2l0IGEvMC4xMC9zc28vcG9tLnhtbCBiLzAuMTAvc3NvL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjZmQ3NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3NvL3BvbS54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGFydGlmYWN0SWQ+b29kdC1zc288L2FydGlmYWN0SWQ+CisgIDxuYW1lPk9PRFQgU2luZ2xlIFNpZ24gT24gU2VjdXJpdHkgUGFja2FnZTwvbmFtZT4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPHByb3BlcnRpZXMgLz4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zIC8+CisgIDwvYnVpbGQ+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtbWV0YWRhdGE8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+ICAgICAgCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PiAgICAKKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50IC8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vQWJzdHJhY3RXZWJCYXNlZFNpbmdsZVNpZ25Pbi5qYXZhIGIvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL0Fic3RyYWN0V2ViQmFzZWRTaW5nbGVTaWduT24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQ1N2NiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL0Fic3RyYWN0V2ViQmFzZWRTaW5nbGVTaWduT24uamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5zZWN1cml0eS5zc287CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIAorICogQWJzdHJhY3QgY2xhc3MgcHJvdmlkaW5nIGFuIEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaW50ZXJmYWNlIHBhaXIgdG8gYWxsb3cKKyAqIGZvciBwZXJzaXN0ZW5jZSBhbmQgbWFuYWdlbWVudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFNpbmdsZVNpZ25Pbi4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYkJhc2VkU2luZ2xlU2lnbk9uIGltcGxlbWVudHMgU2luZ2xlU2lnbk9uIHsKKworICBwcm90ZWN0ZWQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXM7CisKKyAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7CisKKyAgcHVibGljIEFic3RyYWN0V2ViQmFzZWRTaW5nbGVTaWduT24oKSB7CisgICAgdGhpcy5yZXEgPSBudWxsOworICAgIHRoaXMucmVzID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBBYnN0cmFjdFdlYkJhc2VkU2luZ2xlU2lnbk9ufSB3aXRoIHRoZSBnaXZlbiBIVFRQCisgICAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlLgorICAgKiAKKyAgICogQHBhcmFtIHJlcworICAgKiAgICAgICAgICBUaGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0uCisgICAqIEBwYXJhbSByZXEKKyAgICogICAgICAgICAgVGhlIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfS4KKyAgICovCisgIHB1YmxpYyBBYnN0cmFjdFdlYkJhc2VkU2luZ2xlU2lnbk9uKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHRoaXMucmVzID0gcmVzOworICAgIHRoaXMucmVxID0gcmVxOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHJlcworICAgKi8KKyAgcHVibGljIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzKCkgeworICAgIHJldHVybiByZXM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHJlcworICAgKiAgICAgICAgICB0aGUgcmVzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UmVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgdGhpcy5yZXMgPSByZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcmVxCisgICAqLworICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldFJlcSgpIHsKKyAgICByZXR1cm4gcmVxOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSByZXEKKyAgICogICAgICAgICAgdGhlIHJlcSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFJlcShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgdGhpcy5yZXEgPSByZXE7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL0R1bW15SW1wbC5qYXZhIGIvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL0R1bW15SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmE1YTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vRHVtbXlJbXBsLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiAKKyAqIER1bW15IGltcGxlbWVudGF0aW9uIG9mIFNTTyBhdXRoIC0tIGlmIHlvdSdyZSBsb2dnZWQgaW4sIGl0IGxvZ3MgeW91IG91dC4gSWYKKyAqIHlvdSdyZSBsb2dnZWQgb3V0LCBpdCBsb2dzIHlvdSBpbi4gQm90aCBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdHVhbAorICogdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24geW91IGVudGVyLiBPbiB0b3Agb2YgdGhhdCwgeW91ciB1c2VybmFtZSB3aWxsCisgKiBhbHdheXMgYmUgPGNvZGU+Z3Vlc3Q8L2NvZGU+LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIER1bW15SW1wbCBleHRlbmRzIEFic3RyYWN0V2ViQmFzZWRTaW5nbGVTaWduT24geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1VTRVJOQU1FID0gImd1ZXN0IjsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0dST1VQID0gImd1ZXN0IjsKKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5zZWN1cml0eS5zc28uU2luZ2xlU2lnbk9uI2dldEN1cnJlbnRVc2VybmFtZSgpCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRVc2VybmFtZSgpIHsKKyAgICByZXR1cm4gREVGQVVMVF9VU0VSTkFNRTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy5zZWN1cml0eS5zc28uU2luZ2xlU2lnbk9uI2dldExhc3RDb25uZWN0aW9uU3RhdHVzKCkKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGdldExhc3RDb25uZWN0aW9uU3RhdHVzKCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICByZXR1cm4gRHVtbXlJbXBsLmNvbm5lY3RlZDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5zZWN1cml0eS5zc28uU2luZ2xlU2lnbk9uI2lzTG9nZ2VkSW4oKQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNMb2dnZWRJbigpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgcmV0dXJuIER1bW15SW1wbC5jb25uZWN0ZWQ7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMuc2VjdXJpdHkuc3NvLlNpbmdsZVNpZ25PbiNsb2dpbihqYXZhLmxhbmcuU3RyaW5nLAorICAgKiBqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gbG9naW4oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICBEdW1teUltcGwuY29ubmVjdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gRHVtbXlJbXBsLmNvbm5lY3RlZDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5zZWN1cml0eS5zc28uU2luZ2xlU2lnbk9uI2xvZ291dCgpCisgICAqLworICBwdWJsaWMgdm9pZCBsb2dvdXQoKSB7CisgICAgRHVtbXlJbXBsLmNvbm5lY3RlZCA9IGZhbHNlOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMuc2VjdXJpdHkuc3NvLlNpbmdsZVNpZ25PbiNyZXRyaWV2ZUdyb3Vwc0ZvclVzZXIoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gcmV0cmlldmVHcm91cHNGb3JVc2VyKFN0cmluZyB1c2VybmFtZSkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KERFRkFVTFRfR1JPVVApOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9PcGVuU1NPSW1wbC5qYXZhIGIvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL09wZW5TU09JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjUwYzZjMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9PcGVuU1NPSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CisKKy8vTE1NUCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5vcGVuc3NvLlNTT01ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5vcGVuc3NvLlNTT1Byb3h5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5zZWN1cml0eS5zc28ub3BlbnNzby5Vc2VyRGV0YWlsczsKKworLyoqCisgKiAKKyAqIENvbm5lY3RzIHRvIE9wZW5TU08ncyBhdXRob3JpemF0aW9uIGVuZHBvaW50IGFuZCBhdXRoZW50aWNhdGVzIGEgdXNlciwKKyAqIGltcGxlbWVudGluZyB0aGUgQ0FTIHtAbGluayBBYnN0cmFjdFdlYkJhc2VkU2luZ2xlU2lnbk9ufSBpbnRlcmZhY2UuIFRoaXMKKyAqIGNsYXNzIGNhbiBiZSB1c2VkIGluIGUuZy4sIENBUyBjdXJhdG9yIHRvIGxpbmsgaW50byBPcGVuIFNTTy4KKyAqLworcHVibGljIGNsYXNzIE9wZW5TU09JbXBsIGV4dGVuZHMgQWJzdHJhY3RXZWJCYXNlZFNpbmdsZVNpZ25PbiBpbXBsZW1lbnRzCisgICAgU1NPTWV0S2V5cyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoT3BlblNTT0ltcGwuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgU1NPUHJveHkgc3NvUHJveHk7CisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAqLworICBwdWJsaWMgT3BlblNTT0ltcGwoKSB7CisgICAgdGhpcy5zc29Qcm94eSA9IG5ldyBTU09Qcm94eSgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50VXNlcm5hbWUoKSB7CisgICAgU3RyaW5nIGNvb2tpZVZhbCA9IHRoaXMuZ2V0Q29va2llVmFsKFVTRVJfQ09PS0lFX0tFWSk7CisgICAgaWYgKGNvb2tpZVZhbCA9PSBudWxsKSB7CisgICAgICAvLyBsZXQncyB0cnkgYW5kIGdldCB0aGUgU1NPIHRva2VuCisgICAgICAvLyBhbmQgcHVsbCB0aGUgdXNlcm5hbWUgZnJvbSB0aGVyZQorICAgICAgU3RyaW5nIHNzb1Rva2VuID0gdGhpcy5nZXRTU09Ub2tlbigpOworICAgICAgaWYgKHNzb1Rva2VuICE9IG51bGwpIHsKKyAgICAgICAgVXNlckRldGFpbHMgZGV0YWlscyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZGV0YWlscyA9IHRoaXMuc3NvUHJveHkuZ2V0VXNlckF0dHJpYnV0ZXMoc3NvVG9rZW4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgcmV0dXJuIFVOS05PV05fVVNFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGV0YWlscy5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWV0YWRhdGEoVUlEX0FUVFJJQlVURV9OQU1FKSAhPSBudWxsID8gZGV0YWlscworICAgICAgICAgICAgLmdldEF0dHJpYnV0ZXMoKS5nZXRNZXRhZGF0YShVSURfQVRUUklCVVRFX05BTUUpIDogVU5LTk9XTl9VU0VSOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBVTktOT1dOX1VTRVI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGVCYXNlNjQoY29va2llVmFsLmdldEJ5dGVzKCkpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBnZXRMYXN0Q29ubmVjdGlvblN0YXR1cygpIHsKKyAgICByZXR1cm4gdGhpcy5pc0xvZ2dlZEluKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2dlZEluKCkgeworICAgIC8vIFRPRE86IG1ha2Ugc3VyZSB0aGUgdG9rZW4gaXMgdmFsaWQ/CisgICAgcmV0dXJuICh0aGlzLmdldFNTT1Rva2VuKCkgPT0gbnVsbCkgPyBmYWxzZSA6IHRydWU7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBsb2dpbihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgU3RyaW5nIHNzb1Rva2VuID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgc3NvVG9rZW4gPSB0aGlzLnNzb1Byb3h5LmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRoaXMuYWRkQ29va2llKFNTT19DT09LSUVfS0VZLCAiXCIiICsgbmV3IFN0cmluZyhzc29Ub2tlbikgKyAiXCIiKTsKKworICAgIHRoaXMuYWRkQ29va2llKFVTRVJfQ09PS0lFX0tFWSwKKyAgICAgICAgIlwiIiArIG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZUJhc2U2NCh1c2VybmFtZS5nZXRCeXRlcygpKSkgKyAiXCIiKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgbG9nb3V0KCkgeworICAgIHRoaXMuc3NvUHJveHkubG9nb3V0KHRoaXMuZ2V0U1NPVG9rZW4oKSk7CisgICAgdGhpcy5jbGVhckNvb2tpZShTU09fQ09PS0lFX0tFWSk7CisgICAgdGhpcy5jbGVhckNvb2tpZShVU0VSX0NPT0tJRV9LRVkpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIFNTTyBncm91cHMgZm9yIHRoZSBMTU1QIHVzZXIsIGlkZW50aWZpZWQgYnkgaGVyCisgICAqIDxjb2RlPnNzb0F1dGg8L2NvZGU+LCB3aGVyZSBoZXIgVXNlciBJRCBpcyBwcm92aWRlZCBieQorICAgKiB7QGxpbmsgT3BlblNTT0ltcGwjZ2V0Q3VycmVudFVzZXJuYW1lKCl9IGFuZCBoZXIgVG9rZW4gaXMgcHJvdmlkZWQgYnkKKyAgICoge0BsaW5rIE9wZW5TU09JbXBsI2dldFNTT1Rva2VuKCl9LgorICAgKiAKKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiBTdHJpbmcgTE1NUCBncm91cHMgZm9yIHRoZSBVc2VyLgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIChlLmcuLCBIVFRQIFJFU1QgZXJyb3IpIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBzRm9yVXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyB0b2tlbiA9IHRoaXMuZ2V0U1NPVG9rZW4oKTsKKyAgICBpZiAodG9rZW4gPT0gbnVsbCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgfSBlbHNlIHsKKyAgICAgIFVzZXJEZXRhaWxzIGRldGFpbHMgPSB0aGlzLnNzb1Byb3h5LmdldFVzZXJBdHRyaWJ1dGVzKHRva2VuKTsKKyAgICAgIC8vIGdyb3VwcyBhcmUgZm9ybWF0dGVkIGluIHRoaXMgcmVzcG9uc2UgdG8gaW5jbHVkZSB3aG9sZQorICAgICAgLy8gcHJpbmNpcGFscywgbGlrZSBsbW1wLWluZnJhLC4uLnByaW5jaXBhbAorICAgICAgLy8gc28gc3BsaXQgb24gIiwiIGFuZCB0YWtlIHRoZSBmaXJzdCB0b2tlbiB0byBnZXQgdGhlIGdyb3VwIG5hbWUKKyAgICAgIExpc3Q8U3RyaW5nPiBncm91cHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgIGZvciAoU3RyaW5nIHJhd0dyb3VwIDogZGV0YWlscy5nZXRSb2xlcygpKSB7CisgICAgICAgIGdyb3Vwcy5hZGQocmF3R3JvdXAuc3BsaXQoIiwiKVswXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBncm91cHM7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuc2VjdXJpdHkuc3NvLlNpbmdsZVNpZ25PbiNyZXRyaWV2ZUdyb3Vwc0ZvclVzZXIoamF2YS5sYW5nCisgICAqIC5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8U3RyaW5nPiByZXRyaWV2ZUdyb3Vwc0ZvclVzZXIoU3RyaW5nIHVzZXJuYW1lKSB7CisgICAgLy8gRklYTUU6IG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKyAgfQorCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U1NPVG9rZW4oKSB7CisgICAgU3RyaW5nIGNvb2tpZVZhbCA9IHRoaXMuZ2V0Q29va2llVmFsKFNTT19DT09LSUVfS0VZKTsKKyAgICBpZiAoY29va2llVmFsICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNvb2tpZVZhbCk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldENvb2tpZVZhbChTdHJpbmcgbmFtZSkgeworICAgIENvb2tpZVtdIGNvb2tpZXMgPSB0aGlzLnJlcS5nZXRDb29raWVzKCk7CisgICAgZm9yIChDb29raWUgY29va2llIDogY29va2llcykgeworICAgICAgaWYgKGNvb2tpZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgIFN0cmluZyBjb29raWVWYWwgPSBjb29raWUuZ2V0VmFsdWUoKS5zdGFydHNXaXRoKCJcIiIpCisgICAgICAgICAgICAmJiBjb29raWUuZ2V0VmFsdWUoKS5lbmRzV2l0aCgiXCIiKSA/IGNvb2tpZS5nZXRWYWx1ZSgpLnN1YnN0cmluZygKKyAgICAgICAgICAgIDEsIGNvb2tpZS5nZXRWYWx1ZSgpLmxlbmd0aCgpIC0gMSkgOiBjb29raWUuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGNvb2tpZVZhbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWwpIHsKKyAgICBDb29raWUgdXNlckNvb2tpZSA9IG5ldyBDb29raWUobmFtZSwgdmFsKTsKKyAgICB1c2VyQ29va2llLnNldFBhdGgoIi8iKTsKKyAgICB1c2VyQ29va2llLnNldE1heEFnZSgoaW50KSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoNjAgKiAxNSkpKTsKKyAgICB0aGlzLnJlcy5hZGRDb29raWUodXNlckNvb2tpZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2xlYXJDb29raWUoU3RyaW5nIG5hbWUpIHsKKyAgICBDb29raWUgdXNlckNvb2tpZSA9IG5ldyBDb29raWUobmFtZSwgImJsYW5rIik7CisgICAgdXNlckNvb2tpZS5zZXRQYXRoKCIvIik7CisgICAgdXNlckNvb2tpZS5zZXRNYXhBZ2UoMCk7CisgICAgdGhpcy5yZXMuYWRkQ29va2llKHVzZXJDb29raWUpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9TaW5nbGVTaWduT24uamF2YSBiLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9TaW5nbGVTaWduT24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGYyZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL1NpbmdsZVNpZ25Pbi5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIAorICogVGhlIENBUyBqYXZhLWJhc2VkIHNpbmdsZSBzaWduIG9uIEFQSS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2luZ2xlU2lnbk9uIHsKKworICAvKioKKyAgICogU2hvdWxkIHJldHVybiB0aGUgY3VycmVudCBsb2dnZWQgaW4gU2luZ2xlIFNpZ24gT24gdXNlcm5hbWUgcmV0dXJuZWQgZnJvbQorICAgKiB0aGUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXV0aGVudGljYXRpb24gQVBJLgorICAgKiAKKyAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBTU08gdXNlcm5hbWUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRVc2VybmFtZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHVzZXIgaXMgbG9nZ2VkIGluLCBvciBmYWxzZSBvdGhlcndpc2UuCisgICAqIAorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2dlZEluKCk7CisKKyAgLyoqCisgICAqIExvZ3MgdGhlIHVzZXIgd2l0aCB0aGUgcHJvdmlkZWQgPGNvZGU+dXNlcm5hbWU8L2NvZGU+IGFuZAorICAgKiA8Y29kZT5wYXNzd29yZDwvY29kZT4gaW4gdG8gdGhlIFNTTyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCisgICAqIAorICAgKiBAcGFyYW0gdXNlcm5hbWUKKyAgICogICAgICAgICAgVGhlIHVzZXJuYW1lIGNyZWRlbnRpYWxzLgorICAgKiBAcGFyYW0gcGFzc3dvcmQKKyAgICogICAgICAgICAgVGhlIHBhc3N3b3JkIGNyZWRlbnRpYWxzLgorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxvZ2luIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBsb2dpbihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCk7CisKKyAgLyoqCisgICAqIExvZ3MgdGhlIGN1cnJlbnQgU1NPIHVzZXIgb3V0IG9mIGhlciBzZXNzaW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgbG9nb3V0KCk7CisKKyAgLyoqCisgICAqIFNob3VsZCBwcm92aWRlIGluZm9ybWF0aW9uICh0cnVlIG9yIGZhbHNlKSBhcyB0byB3aGV0aGVyIHRoZSBsYXN0CisgICAqIGNvbm5lY3Rpb24gdG8gdGhlIFNTTyBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlIHdhcyBzdWNjZXNzZnVsLgorICAgKiAKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXN0IGF1dGhlbnRpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRMYXN0Q29ubmVjdGlvblN0YXR1cygpOworCisgIC8qKgorICAgKiBPYnRhaW5zIGEgdXNlcidzIGdyb3VwcyBmcm9tIHRoZSBzZWN1cml0eSBwcmluY2lwYWwgdGhhdCB0aGlzIFNTTyBvYmplY3QKKyAgICogdGFsa3MgdG8uCisgICAqIAorICAgKiBAcGFyYW0gdXNlcm5hbWUKKyAgICogICAgICAgICAgVGhlIHVzZXJuYW1lIHRvIG9idGFpbiB0aGUgZ3JvdXBzIGZvci4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiBzdHJpbmcgZ3JvdXAgbmFtZXMgb2J0YWluZWQgZnJvbSB0aGUgc2VjdXJpdHkKKyAgICogICAgICAgICBwcmluY2lwYWwuCisgICAqKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiByZXRyaWV2ZUdyb3Vwc0ZvclVzZXIoU3RyaW5nIHVzZXJuYW1lKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL1NpbmdsZVNpZ25PbkZhY3RvcnkuamF2YSBiLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9TaW5nbGVTaWduT25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMmFhZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9TaW5nbGVTaWduT25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuc2VjdXJpdHkuc3NvOworCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFNpbmdsZVNpZ25Pbn1zIGZyb20gY2xhc3MgbmFtZSBTdHJpbmdzLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNpbmdsZVNpZ25PbkZhY3RvcnkgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNpbmdsZVNpZ25PbkZhY3RvcnkuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIEFic3RyYWN0V2ViQmFzZWRTaW5nbGVTaWduT24gZ2V0V2ViQmFzZWRTaW5nbGVTaWduT24oU3RyaW5nIGNsYXNzTmFtZSkgeworICAgIEFic3RyYWN0V2ViQmFzZWRTaW5nbGVTaWduT24gc3NvID0gbnVsbDsKKyAgICBDbGFzczxBYnN0cmFjdFdlYkJhc2VkU2luZ2xlU2lnbk9uPiBjbGF6eiA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY2xhenogPSAoQ2xhc3M8QWJzdHJhY3RXZWJCYXNlZFNpbmdsZVNpZ25Pbj4pIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgIHNzbyA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICByZXR1cm4gc3NvOworICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgd2ViIGJhc2VkIHNzbyBjbGFzcyAiCisgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgd2ViIGJhc2VkIHNzbyBjbGFzcyAiCisgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgd2ViIGJhc2VkIHNzbyBjbGFzcyAiCisgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9vcGVuc3NvL0lkZW50aXR5RGV0YWlscy5qYXZhIGIvMC4xMC9zc28vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvc2VjdXJpdHkvc3NvL29wZW5zc28vSWRlbnRpdHlEZXRhaWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE3Yjc1MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9vcGVuc3NvL0lkZW50aXR5RGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5vcGVuc3NvOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIAorICogVGhlIHJlc3BvbnNlIGZyb20gYSBjYWxsIHRvIHtAbGluayBTU09NZXRLZXlzI0lERU5USVRZX1JFQURfRU5EUE9JTlR9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIElkZW50aXR5RGV0YWlscyB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgIHByaXZhdGUgU3RyaW5nIHJlYWxtOworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdyb3VwczsKKworICBwcml2YXRlIE1ldGFkYXRhIGF0dHJpYnV0ZXM7CisKKyAgcHVibGljIElkZW50aXR5RGV0YWlscygpIHsKKyAgICB0aGlzLm5hbWUgPSBudWxsOworICAgIHRoaXMudHlwZSA9IG51bGw7CisgICAgdGhpcy5yZWFsbSA9IG51bGw7CisgICAgdGhpcy5ncm91cHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICB0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgTWV0YWRhdGEoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgdGhlIG5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0eXBlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHR5cGUKKyAgICogICAgICAgICAgdGhlIHR5cGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSByZWFsbQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRSZWFsbSgpIHsKKyAgICByZXR1cm4gcmVhbG07CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHJlYWxtCisgICAqICAgICAgICAgIHRoZSByZWFsbSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFJlYWxtKFN0cmluZyByZWFsbSkgeworICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBncm91cHMKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBzKCkgeworICAgIHJldHVybiBncm91cHM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGdyb3VwcworICAgKiAgICAgICAgICB0aGUgZ3JvdXBzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0R3JvdXBzKExpc3Q8U3RyaW5nPiBncm91cHMpIHsKKyAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGVzCisgICAqLworICBwdWJsaWMgTWV0YWRhdGEgZ2V0QXR0cmlidXRlcygpIHsKKyAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgKiAgICAgICAgICB0aGUgYXR0cmlidXRlcyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTWV0YWRhdGEgYXR0cmlidXRlcykgeworICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBzYi5hcHBlbmQoIltuYW1lPSIpOworICAgIHNiLmFwcGVuZCh0aGlzLm5hbWUpOworICAgIHNiLmFwcGVuZCgiLHR5cGU9Iik7CisgICAgc2IuYXBwZW5kKHRoaXMudHlwZSk7CisgICAgc2IuYXBwZW5kKCIscmVhbG09Iik7CisgICAgc2IuYXBwZW5kKHRoaXMucmVhbG0pOworICAgIHNiLmFwcGVuZCgiLHJvbGVzPSIpOworICAgIHNiLmFwcGVuZCh0aGlzLmdyb3Vwcyk7CisgICAgc2IuYXBwZW5kKCIsYXR0cmlidXRlcz0iKTsKKyAgICBzYi5hcHBlbmQodGhpcy5hdHRyaWJ1dGVzLmdldEhhc2h0YWJsZSgpKTsKKyAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vb3BlbnNzby9TU09NZXRLZXlzLmphdmEgYi8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vb3BlbnNzby9TU09NZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Q4NjZmNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9vcGVuc3NvL1NTT01ldEtleXMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5vcGVuc3NvOworCisvKioKKyAqIAorICogTWV0IGtleXMgZm9yIGRlYWxpbmcgd2l0aCB7QGxpbmsgU1NPUHJveHl9LgorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU1NPTWV0S2V5cyB7CisKKyAgLyogc2VydmljZSBlbmRwb2ludHMgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSEVOVElDQVRFX0VORFBPSU5UID0gImh0dHBzOi8vaG9zdC9vcGVuc3NvL2lkZW50aXR5L2F1dGhlbnRpY2F0ZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFlfUkVBRF9FTkRQT0lOVCA9ICJodHRwczovL2hvc3Qvb3BlbnNzby9pZGVudGl0eS9yZWFkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9BVFRSSUJVVEVTX0VORFBPSU5UID0gImh0dHBzOi8vaG9zdC9vcGVuc3NvL2lkZW50aXR5L2F0dHJpYnV0ZXMiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR09VVF9FTkRQT0lOVCA9ICJodHRwczovL2hvc3Qvb3BlbnNzby9pZGVudGl0eS9sb2dvdXQiOworCisgIC8qIGNvb2tpZSBuYW1lcyAqLworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTT19DT09LSUVfS0VZID0gImlQbGFuZXREaXJlY3RvcnlQcm8iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ09PS0lFX0tFWSA9ICJjdXJhdGlvbldlYmFwcCI7CisKKyAgLyogSWRlbnRpdHkgRGV0YWlscyByZXNwb25zZSBvYmplY3QgKi8KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9ERVRBSUxTX05BTUUgPSAiaWRlbnRpdHlkZXRhaWxzLm5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0RFVEFJTFNfVFlQRSA9ICJpZGVudGl0eWRldGFpbHMudHlwZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFlfREVUQUlMU19SRUFMTSA9ICJpZGVudGl0eWRldGFpbHMucmVhbG0iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0RFVEFJTFNfR1JPVVAgPSAiaWRlbnRpdHlkZXRhaWxzLmdyb3VwIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9ERVRBSUxTX0FUVFJfTkFNRSA9ICJpZGVudGl0eWRldGFpbHMuYXR0cmlidXRlLm5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0RFVEFJTFNfQVRUUl9WQUxVRSA9ICJpZGVudGl0eWRldGFpbHMuYXR0cmlidXRlLnZhbHVlIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0RFVEFJTFNfQVRUUl9TS0lQX0xJTkUgPSAiaWRlbnRpdHlkZXRhaWxzLmF0dHJpYnV0ZT0iOworCisgIC8qIFVzZXIgRGV0YWlscyByZXNwb25zZSBvYmplY3QgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ERVRBSUxTX1RPS0VOID0gInVzZXJkZXRhaWxzLnRva2VuLmlkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFVEFJTFNfUk9MRSA9ICJ1c2VyZGV0YWlscy5yb2xlPWlkIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFVEFJTFNfQVRUUl9OQU1FID0gInVzZXJkZXRhaWxzLmF0dHJpYnV0ZS5uYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFVEFJTFNfQVRUUl9WQUxVRSA9ICJ1c2VyZGV0YWlscy5hdHRyaWJ1dGUudmFsdWUiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlEX0FUVFJJQlVURV9OQU1FID0gInVpZCI7CisKKyAgLyogY29tbWFuZHMgYXZhaWxhYmxlIGZyb20gU1NPUHJveHkgY29tbWFuZCBsaW5lICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfQ09NTUFORCA9ICJhdXRoZW50aWNhdGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0NPTU1BTkQgPSAiaWRlbnRpdHkiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURVNfQ09NTUFORCA9ICJhdHRyaWJ1dGVzIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR09VVF9DT01NQU5EID0gImxvZ291dCI7CisKKyAgLyogZ2VuZXJhbCBzdHVmZiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX1VTRVIgPSAiVW5rbm93biI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9vcGVuc3NvL1NTT1Byb3h5LmphdmEgYi8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vb3BlbnNzby9TU09Qcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0ZTBkZTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vb3BlbnNzby9TU09Qcm94eS5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5vcGVuc3NvOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5OYW1lVmFsdWVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUG9zdE1ldGhvZDsKKworLyoqCisgKiAKKyAqIEEgY2xpZW50IGNsYXNzIHRvIHRoZSBzZXJ2aWNlcyBwcm92aWRlZCBieSB0aGUgPGEKKyAqIGhyZWY9Imh0dHBzOi8vb3BlbnNzby5kZXYuamF2YS5uZXQvIj5PcGVuU1NPPC9hPiBwcm9qZWN0LiBUaGUgZGVzY3JpcHRpb25zIG9mCisgKiB0aGVzZSBzZXJ2aWNlcyBhcmUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXJzLnN1bi5jb20vaWRlbnRpdHkvcmVmZXJlbmNlL3RlY2hhcnQvaWQtc3Zjcy5odG1sIgorICogPmhlcmU8L2E+LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNTT1Byb3h5IGltcGxlbWVudHMgU1NPTWV0S2V5cyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoU1NPUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfRU5EUE9JTlQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX0VORFBPSU5UX0tFWSA9ICJBVVRIX0VORFBPSU5UIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5UX1JFQURfRU5EUE9JTlQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVF9SRUFEX0VORFBPSU5UX0tFWSA9ICJJREVOVF9SRUFEX0VORFBPSU5UIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5UX0FUVFJfRU5EUE9JTlQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVF9BVFRSX0VORFBPSU5UX0tFWSA9ICJJREVOVF9BVFRSX0VORFBPSU5UIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19FTkRQT0lOVDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19FTkRQT0lOVF9LRVkgPSAiTE9HX0VORFBPSU5UIjsKKyAgCisgIHN0YXRpYyB7CisJICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KEFVVEhfRU5EUE9JTlRfS0VZKSAhPSBudWxsKSB7CisJCSAgQVVUSF9FTkRQT0lOVCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShBVVRIX0VORFBPSU5UX0tFWSk7CisJICB9IGVsc2UgeworCQkgIEFVVEhfRU5EUE9JTlQgPSBBVVRIRU5USUNBVEVfRU5EUE9JTlQ7CisJICB9CisJICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KElERU5UX1JFQURfRU5EUE9JTlRfS0VZKSAhPSBudWxsKSB7CisJCSAgSURFTlRfUkVBRF9FTkRQT0lOVCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShJREVOVF9SRUFEX0VORFBPSU5UX0tFWSk7CisJICB9IGVsc2UgeworCQkgIElERU5UX1JFQURfRU5EUE9JTlQgPSBJREVOVElUWV9SRUFEX0VORFBPSU5UOworCSAgfQorCSAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShJREVOVF9BVFRSX0VORFBPSU5UX0tFWSkgIT0gbnVsbCkgeworCQkgIElERU5UX0FUVFJfRU5EUE9JTlQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSURFTlRfQVRUUl9FTkRQT0lOVF9LRVkpOworCSAgfSBlbHNlIHsKKwkJICBJREVOVF9BVFRSX0VORFBPSU5UID0gSURFTlRJVFlfQVRUUklCVVRFU19FTkRQT0lOVDsKKwkgIH0KKwkgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoTE9HX0VORFBPSU5UX0tFWSkgIT0gbnVsbCkgeworCQkgIExPR19FTkRQT0lOVCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShMT0dfRU5EUE9JTlRfS0VZKTsKKwkgIH0gZWxzZSB7CisJCSAgTE9HX0VORFBPSU5UID0gTE9HT1VUX0VORFBPSU5UOworCSAgfQorCisJICBMT0cubG9nKExldmVsLklORk8sIEFVVEhfRU5EUE9JTlRfS0VZICsgIiBzZXQgdG8gIiArIEFVVEhfRU5EUE9JTlQpOworCSAgTE9HLmxvZyhMZXZlbC5JTkZPLCBJREVOVF9SRUFEX0VORFBPSU5UX0tFWSArICIgc2V0IHRvICIgKyBJREVOVF9SRUFEX0VORFBPSU5UKTsKKwkgIExPRy5sb2coTGV2ZWwuSU5GTywgSURFTlRfQVRUUl9FTkRQT0lOVF9LRVkgKyAiIHNldCB0byAiICsgSURFTlRfQVRUUl9FTkRQT0lOVCk7CisJICBMT0cubG9nKExldmVsLklORk8sIExPR19FTkRQT0lOVF9LRVkgKyAiIHNldCB0byAiICsgTE9HX0VORFBPSU5UKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgSHR0cENsaWVudCBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKKyAgICBQb3N0TWV0aG9kIHBvc3QgPSBuZXcgUG9zdE1ldGhvZChBVVRIX0VORFBPSU5UKTsKKyAgICBTdHJpbmcgcmVzcG9uc2UgPSBudWxsOworICAgIFN0cmluZyBzc29Ub2tlbiA9IG51bGw7CisKKyAgICBOYW1lVmFsdWVQYWlyW10gZGF0YSA9IHsgbmV3IE5hbWVWYWx1ZVBhaXIoInVzZXJuYW1lIiwgdXNlcm5hbWUpLAorICAgICAgICBuZXcgTmFtZVZhbHVlUGFpcigicGFzc3dvcmQiLCBwYXNzd29yZCksCisgICAgICAgIG5ldyBOYW1lVmFsdWVQYWlyKCJ1cmkiLCAicmVhbG0vbG1tcCIpIH07CisKKyAgICBwb3N0LnNldFJlcXVlc3RCb2R5KGRhdGEpOworCisgICAgdHJ5IHsKKyAgICAgIGh0dHBDbGllbnQuZXhlY3V0ZU1ldGhvZChwb3N0KTsKKyAgICAgIGlmIChwb3N0LmdldFN0YXR1c0NvZGUoKSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKHBvc3QuZ2V0U3RhdHVzTGluZSgpLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgICAgcmVzcG9uc2UgPSBwb3N0LmdldFJlc3BvbnNlQm9keUFzU3RyaW5nKCkudHJpbSgpOworICAgICAgc3NvVG9rZW4gPSByZXNwb25zZS5zdWJzdHJpbmcoOSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHBvc3QucmVsZWFzZUNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3NvVG9rZW47CisgIH0KKworICBwdWJsaWMgSWRlbnRpdHlEZXRhaWxzIHJlYWRJZGVudGl0eShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyB0b2tlbikKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CisgICAgUG9zdE1ldGhvZCBwb3N0ID0gbmV3IFBvc3RNZXRob2QoSURFTlRfUkVBRF9FTkRQT0lOVCk7CisgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiT2J0YWluaW5nIGlkZW50aXR5OiB1c2VybmFtZTogWyIgKyB1c2VybmFtZQorICAgICAgICArICJdOiB0b2tlbjogWyIgKyB0b2tlbiArICJdOiBSRVNUIHVybDogWyIgKyBJREVOVF9SRUFEX0VORFBPSU5UCisgICAgICAgICsgIl0iKTsKKyAgICBOYW1lVmFsdWVQYWlyW10gZGF0YSA9IHsgbmV3IE5hbWVWYWx1ZVBhaXIoIm5hbWUiLCB1c2VybmFtZSksCisgICAgICAgIG5ldyBOYW1lVmFsdWVQYWlyKCJhZG1pbiIsIHRva2VuKSB9OworCisgICAgcG9zdC5zZXRSZXF1ZXN0Qm9keShkYXRhKTsKKworICAgIGh0dHBDbGllbnQuZXhlY3V0ZU1ldGhvZChwb3N0KTsKKyAgICBpZiAocG9zdC5nZXRTdGF0dXNDb2RlKCkgIT0gSHR0cFN0YXR1cy5TQ19PSykgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihwb3N0LmdldFN0YXR1c0xpbmUoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFyc2VJZGVudGl0eURldGFpbHMocG9zdC5nZXRSZXNwb25zZUJvZHlBc1N0cmluZygpLnRyaW0oKSk7CisKKyAgfQorCisgIHB1YmxpYyBVc2VyRGV0YWlscyBnZXRVc2VyQXR0cmlidXRlcyhTdHJpbmcgdG9rZW4pIHRocm93cyBFeGNlcHRpb24geworICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CisgICAgUG9zdE1ldGhvZCBwb3N0ID0gbmV3IFBvc3RNZXRob2QoSURFTlRfQVRUUl9FTkRQT0lOVCk7CisgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiT2J0YWluaW5nIHVzZXIgYXR0cmlidXRlczogdG9rZW46IFsiICsgdG9rZW4KKyAgICAgICAgKyAiXTogUkVTVCB1cmw6IFsiICsgSURFTlRfQVRUUl9FTkRQT0lOVCArICJdIik7CisgICAgTmFtZVZhbHVlUGFpcltdIGRhdGEgPSB7IG5ldyBOYW1lVmFsdWVQYWlyKCJzdWJqZWN0aWQiLCB0b2tlbikgfTsKKworICAgIHBvc3Quc2V0UmVxdWVzdEJvZHkoZGF0YSk7CisKKyAgICBodHRwQ2xpZW50LmV4ZWN1dGVNZXRob2QocG9zdCk7CisgICAgaWYgKHBvc3QuZ2V0U3RhdHVzQ29kZSgpICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24ocG9zdC5nZXRTdGF0dXNMaW5lKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBhcnNlVXNlckRldGFpbHMocG9zdC5nZXRSZXNwb25zZUJvZHlBc1N0cmluZygpLnRyaW0oKSk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGxvZ291dChTdHJpbmcgdG9rZW4pIHsKKyAgICBIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOworICAgIFBvc3RNZXRob2QgcG9zdCA9IG5ldyBQb3N0TWV0aG9kKExPR19FTkRQT0lOVCk7CisgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiTG9nZ2luZyBvdXQ6IHRva2VuOiBbIiArIHRva2VuICsgIl06IFJFU1QgdXJsOiBbIgorICAgICAgICArIExPR19FTkRQT0lOVCArICJdIik7CisgICAgTmFtZVZhbHVlUGFpcltdIGRhdGEgPSB7IG5ldyBOYW1lVmFsdWVQYWlyKCJzdWJqZWN0aWQiLCB0b2tlbikgfTsKKyAgICBwb3N0LnNldFJlcXVlc3RCb2R5KGRhdGEpOworCisgICAgdHJ5IHsKKyAgICAgIGh0dHBDbGllbnQuZXhlY3V0ZU1ldGhvZChwb3N0KTsKKyAgICAgIGlmIChwb3N0LmdldFN0YXR1c0NvZGUoKSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKHBvc3QuZ2V0U3RhdHVzTGluZSgpLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gZSkgeworICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBJZGVudGl0eURldGFpbHMgcGFyc2VJZGVudGl0eURldGFpbHMoU3RyaW5nIHNlcnZpY2VSZXNwb25zZSkgeworICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcnZpY2VSZXNwb25zZQorICAgICAgICAuZ2V0Qnl0ZXMoKSk7CisgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CisgICAgSWRlbnRpdHlEZXRhaWxzIGRldGFpbHMgPSBuZXcgSWRlbnRpdHlEZXRhaWxzKCk7CisgICAgU3RyaW5nIGxpbmUgPSBudWxsLCBsYXN0QXR0cktleVJlYWQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGxpbmUuZXF1YWxzKElERU5USVRZX0RFVEFJTFNfQVRUUl9TS0lQX0xJTkUpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBTdHJpbmcga2V5ID0gbnVsbCwgdmFsID0gbnVsbDsKKyAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChJREVOVElUWV9ERVRBSUxTX1JFQUxNKSkgeworICAgICAgICAgIC8vIGNhbid0IHBhcnNlIGl0IHRoZSBzYW1lIHdheQorICAgICAgICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIElERU5USVRZX0RFVEFJTFNfUkVBTE0ubGVuZ3RoKCkpOworICAgICAgICAgIHZhbCA9IGxpbmUuc3Vic3RyaW5nKElERU5USVRZX0RFVEFJTFNfUkVBTE0ubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTdHJpbmdbXSBsaW5lVG9rcyA9IGxpbmUuc3BsaXQoIj0iKTsKKyAgICAgICAgICBrZXkgPSBsaW5lVG9rc1swXTsKKyAgICAgICAgICB2YWwgPSBsaW5lVG9rc1sxXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChrZXkuZXF1YWxzKElERU5USVRZX0RFVEFJTFNfTkFNRSkpIHsKKyAgICAgICAgICBkZXRhaWxzLnNldE5hbWUodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKElERU5USVRZX0RFVEFJTFNfVFlQRSkpIHsKKyAgICAgICAgICBkZXRhaWxzLnNldFR5cGUodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKElERU5USVRZX0RFVEFJTFNfUkVBTE0pKSB7CisgICAgICAgICAgZGV0YWlscy5zZXRSZWFsbSh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoSURFTlRJVFlfREVUQUlMU19HUk9VUCkpIHsKKyAgICAgICAgICBkZXRhaWxzLmdldEdyb3VwcygpLmFkZCh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoSURFTlRJVFlfREVUQUlMU19BVFRSX05BTUUpKSB7CisgICAgICAgICAgbGFzdEF0dHJLZXlSZWFkID0gdmFsOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoSURFTlRJVFlfREVUQUlMU19BVFRSX1ZBTFVFKSkgeworICAgICAgICAgIGRldGFpbHMuZ2V0QXR0cmlidXRlcygpLmFkZE1ldGFkYXRhKGxhc3RBdHRyS2V5UmVhZCwgdmFsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciByZWFkaW5nIHNlcnZpY2UgcmVzcG9uc2UgbGluZTogWyIgKyBsaW5lCisgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBpcyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChiciAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgYnIgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkZXRhaWxzOworICB9CisKKyAgcHJpdmF0ZSBVc2VyRGV0YWlscyBwYXJzZVVzZXJEZXRhaWxzKFN0cmluZyBzZXJ2aWNlUmVzcG9uc2UpIHsKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJ2aWNlUmVzcG9uc2UKKyAgICAgICAgLmdldEJ5dGVzKCkpOworICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworICAgIFVzZXJEZXRhaWxzIGRldGFpbHMgPSBuZXcgVXNlckRldGFpbHMoKTsKKyAgICBTdHJpbmcgbGluZSA9IG51bGwsIGxhc3RBdHRyS2V5UmVhZCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICBTdHJpbmcga2V5ID0gbnVsbCwgdmFsID0gbnVsbDsKKyAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChVU0VSX0RFVEFJTFNfUk9MRSkpIHsKKyAgICAgICAgICAvLyBjYW4ndCBwYXJzZSBieSBzcGxpdHRpbmcsIHBhcnNlIGJ5IHVzaW5nIHN1YnN0cmluZworICAgICAgICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIFVTRVJfREVUQUlMU19ST0xFLmxlbmd0aCgpKTsKKyAgICAgICAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhVU0VSX0RFVEFJTFNfUk9MRS5sZW5ndGgoKSArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN0cmluZ1tdIGxpbmVUb2tzID0gbGluZS5zcGxpdCgiPSIpOworICAgICAgICAgIGtleSA9IGxpbmVUb2tzWzBdOworICAgICAgICAgIHZhbCA9IGxpbmVUb2tzWzFdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleS5lcXVhbHMoVVNFUl9ERVRBSUxTX1RPS0VOKSkgeworICAgICAgICAgIGRldGFpbHMuc2V0VG9rZW4odmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKFVTRVJfREVUQUlMU19ST0xFKSkgeworICAgICAgICAgIGRldGFpbHMuZ2V0Um9sZXMoKS5hZGQodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKFVTRVJfREVUQUlMU19BVFRSX05BTUUpKSB7CisgICAgICAgICAgbGFzdEF0dHJLZXlSZWFkID0gdmFsOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoVVNFUl9ERVRBSUxTX0FUVFJfVkFMVUUpKSB7CisgICAgICAgICAgZGV0YWlscy5nZXRBdHRyaWJ1dGVzKCkuYWRkTWV0YWRhdGEobGFzdEF0dHJLZXlSZWFkLCB2YWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIHJlYWRpbmcgc2VydmljZSByZXNwb25zZSBsaW5lOiBbIiArIGxpbmUKKyAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGlzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGJyICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBici5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBiciA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRldGFpbHM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdXNhZ2UgPSAiU1NPUHJveHkgPGNtZD4gW2FyZ3NdXG5cbiIgKyAiV2hlcmUgY21kIGlzIG9uZSBvZjpcbiIKKyAgICAgICAgKyAiYXV0aGVudGljYXRlIDx1c2VyPiA8cGFzcz5cbiIgKyAiaWRlbnRpdHkgPHVzZXI+IDx0b2tlbj5cbiIKKyAgICAgICAgKyAiYXR0cmlidXRlcyA8dG9rZW4+XG5sb2dvdXQgPHRva2VuPlxuIjsKKworICAgIGlmIChhcmdzLmxlbmd0aCA8IDIgfHwgYXJncy5sZW5ndGggPiAzKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgU3RyaW5nIGNtZCA9IGFyZ3NbMF07CisgICAgU1NPUHJveHkgc3NvID0gbmV3IFNTT1Byb3h5KCk7CisgICAgaWYgKGNtZC5lcXVhbHMoQVVUSF9DT01NQU5EKSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNzby5hdXRoZW50aWNhdGUoYXJnc1sxXSwgYXJnc1syXSkpOworICAgIH0gZWxzZSBpZiAoY21kLmVxdWFscyhJREVOVElUWV9DT01NQU5EKSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNzby5yZWFkSWRlbnRpdHkoYXJnc1sxXSwgYXJnc1syXSkpOworICAgIH0gZWxzZSBpZiAoY21kLmVxdWFscyhBVFRSSUJVVEVTX0NPTU1BTkQpKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3NvLmdldFVzZXJBdHRyaWJ1dGVzKGFyZ3NbMV0pKTsKKyAgICB9IGVsc2UgaWYgKGNtZC5lcXVhbHMoTE9HT1VUX0NPTU1BTkQpKSB7CisgICAgICBzc28ubG9nb3V0KGFyZ3NbMV0pOworICAgIH0KKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3NvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3NlY3VyaXR5L3Nzby9vcGVuc3NvL1VzZXJEZXRhaWxzLmphdmEgYi8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vb3BlbnNzby9Vc2VyRGV0YWlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlNzk4OGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Nzby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9zZWN1cml0eS9zc28vb3BlbnNzby9Vc2VyRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnNlY3VyaXR5LnNzby5vcGVuc3NvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIAorICogVGhlIHJlc3BvbnNlIGZyb20gYSBxdWVyeSB0byB7QGxpbmsgU1NPTWV0S2V5cyNJREVOVElUWV9BVFRSSUJVVEVTX0VORFBPSU5UfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyRGV0YWlscyB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47CisKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcm9sZXM7CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBhdHRyaWJ1dGVzOworCisgIHB1YmxpYyBVc2VyRGV0YWlscygpIHsKKyAgICB0aGlzLnRva2VuID0gbnVsbDsKKyAgICB0aGlzLnJvbGVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IE1ldGFkYXRhKCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgdG9rZW4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisgICAgcmV0dXJuIHRva2VuOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0b2tlbgorICAgKiAgICAgICAgICB0aGUgdG9rZW4gdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKKyAgICB0aGlzLnRva2VuID0gdG9rZW47CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcm9sZXMKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Um9sZXMoKSB7CisgICAgcmV0dXJuIHJvbGVzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSByb2xlcworICAgKiAgICAgICAgICB0aGUgcm9sZXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSb2xlcyhMaXN0PFN0cmluZz4gcm9sZXMpIHsKKyAgICB0aGlzLnJvbGVzID0gcm9sZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgYXR0cmlidXRlcworICAgKi8KKyAgcHVibGljIE1ldGFkYXRhIGdldEF0dHJpYnV0ZXMoKSB7CisgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICogICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1ldGFkYXRhIGF0dHJpYnV0ZXMpIHsKKyAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgc2IuYXBwZW5kKCJbdG9rZW49Iik7CisgICAgc2IuYXBwZW5kKHRoaXMudG9rZW4pOworICAgIHNiLmFwcGVuZCgiLHJvbGVzPSIpOworICAgIHNiLmFwcGVuZCh0aGlzLnJvbGVzKTsKKyAgICBzYi5hcHBlbmQoIixhdHRyaWJ1dGVzPSIpOworICAgIHNiLmFwcGVuZCh0aGlzLmF0dHJpYnV0ZXMuZ2V0SGFzaHRhYmxlKCkpOworICAgIHNiLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Nzby9zcmMvbWFpbi9waHAvcGVhci9Db25maWcucGhwIGIvMC4xMC9zc28vc3JjL21haW4vcGhwL3BlYXIvQ29uZmlnLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNjZWMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zc28vc3JjL21haW4vcGhwL3BlYXIvQ29uZmlnLnBocApAQCAtMCwwICsxLDY1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogCisgKiAgQHBhY2thZ2UgT3JnX0FwYWNoZV9Pb2R0X1NlY3VyaXR5CisgKiAgQGF1dGhvciAgQW5kcmV3IEYuIEhhcnQKKyAqICBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqICBQSFAgU2luZ2xlIFNpZ24gT24gQXV0aGVudGljYXRpb24gTGlicmFyeSBhbmQgVXRpbGl0aWVzCisgKiAKKyAqLworCisvKioKKyAqIExEQVAgSG9zdCBVUkkKKyAqIAorICogVGhlIHBhdGggdG8gdGhlIGhvc3Qgd2hlcmUgdGhlIExEQVAgZGlyZWN0b3J5IHNlcnZlciBpcyBydW5uaW5nCisgKiBAdmFyIHN0cmluZworICovCitkZWZpbmUoIlNTT19MREFQX0hPU1QiLCAibGRhcHM6Ly9ob3N0LmRvbWFpbiIpOworCisvKioKKyAqIExEQVAgUG9ydAorICogCisgKiBUaGUgcG9ydCBvbiBAbGlua3tTU09fTERBUF9IT1NUfSB3aGVyZSB0aGUgTERBUCBkaXJlY3Rvcnkgc2VydmVyCisgKiBpcyBsaXN0ZW5pbmcuCisgKiAKKyAqIERlZmF1bHQgcG9ydHM6CisgKiAgIDM4OTogU3RhbmRhcmQgKG5vbi1zc2wpIExEQVAgKGxkYXA6Ly8uLi4pCisgKiAgIDYzNjogU2VjdXJlIExEQVAgKGxkYXBzOi8vLi4uKQorICogQHZhciBzdHJpbmcKKyAqLworZGVmaW5lKCJTU09fTERBUF9QT1JUIiwgNjM2KTsKKworLyoqCisgKiBCYXNlIEROCisgKiAKKyAqIFRoZSBiYXNlIGRvbWFpbiBuYW1lIHRvIHVzZSB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIExEQVAgc2VydmVyCisgKgorICogQHZhciBzdHJpbmcKKyAqLworZGVmaW5lKCJTU09fQkFTRV9ETiIsICJkYz1zYW1wbGUsIGRjPWpwbCwgZGM9bmFzYSwgZGM9Z292Iik7CisKKy8qKgorICogQ29va2llIEtleQorICogCisgKiBUaGUgdW5pcXVlIHN0cmluZyB0byB1c2UgaW4gaWRlbnRpZnlpbmcgdGhlIHNlY3VyaXR5IGNvb2tpZQorICogCisgKi8KK2RlZmluZSgiU1NPX0NPT0tJRV9LRVkiLCAiX19hY19fc2NfXyIpOwpkaWZmIC0tZ2l0IGEvMC4xMC9zc28vc3JjL21haW4vcGhwL3BlYXIvU2luZ2xlU2lnbk9uLnBocCBiLzAuMTAvc3NvL3NyYy9tYWluL3BocC9wZWFyL1NpbmdsZVNpZ25Pbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyZGZmYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3NvL3NyYy9tYWluL3BocC9wZWFyL1NpbmdsZVNpZ25Pbi5waHAKQEAgLTAsMCArMSwyMDIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogCisgKiAgQHBhY2thZ2UgT3JnX0FwYWNoZV9Pb2R0X1NlY3VyaXR5CisgKiAgQGF1dGhvciBDaHJpcyBBLiBNYXR0bWFubgorICogIEBhdXRob3IgQW5kcmV3IEYuIEhhcnQKKyAqICBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqICBQSFAgU2luZ2xlIFNpZ24gT24gTGlicmFyeSBmb3IgRURSTiBQSFAtYmFzZWQgcHJvZHVjdHMuCisgKiAKKyAqLworCitjbGFzcyBPcmdfQXBhY2hlX09vZHRfU2VjdXJpdHlfU2luZ2xlU2lnbk9uIHsKKworCXByaXZhdGUgJGNvbm5lY3Rpb25TdGF0dXM7CisJCisJcHJpdmF0ZSAkY29ubjsKKworCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKKwkJJHRoaXMtPmNvbm5lY3Rpb25TdGF0dXMgPSAxOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50VXNlcm5hbWUoKSB7CisJCXJldHVybiAkdGhpcy0+Z2V0U2luZ2xlU2lnbk9uVXNlcm5hbWUoKTsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gaXNMb2dnZWRJbigpIHsKKwkJcmV0dXJuICgkdGhpcy0+Z2V0U2luZ2xlU2lnbk9uVXNlcm5hbWUoKSAhPSBudWxsKTsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gbG9naW4oJHVzZXJuYW1lLCAkcGFzc3dvcmQpIHsKKwkJLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBhbHJlYWR5IHNpZ25lZCBpbgorCQlpZiAoJHRoaXMtPmdldFNpbmdsZVNpZ25PblVzZXJuYW1lKCkgPD4gIiIgCisJCQkmJiBzdHJjbXAoJHRoaXMtPmdldFNpbmdsZVNpZ25PblVzZXJuYW1lKCksICR1c2VybmFtZSkgPT0gMCkgeworCQkJLy8gd2UncmUgbG9nZ2VkIGluIGFscmVhZHkKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJLy8gbG9nIGluIHZpYSBMREFQCisJCQkkbGRhcHJkbiA9ICJ1aWQ9IiAuICR1c2VybmFtZSAuICcsJyAuIFNTT19CQVNFX0ROOworCQkJJGxkYXBwYXNzID0gJHBhc3N3b3JkOworCQkJCisJCQkvLyBjb25uZWN0IHRvIGxkYXAgc2VydmVyIAorCQkJJGxkYXBjb25uID0gJHRoaXMtPmNvbm5lY3QoU1NPX0xEQVBfSE9TVCwgU1NPX0xEQVBfUE9SVCk7CisJCQlpZiAoJGxkYXBjb25uKSB7CisJCQkJCisJCQkJLy8gYmluZGluZyB0byBsZGFwIHNlcnZlciAKKwkJCQkkbGRhcGJpbmQgPSBAIGxkYXBfYmluZCgkbGRhcGNvbm4sICRsZGFwcmRuLCAkbGRhcHBhc3MpOworCisJCQkJLy8gdmVyaWZ5IGJpbmRpbmcgCisJCQkJaWYgKCRsZGFwYmluZCkgeworCQkJCQkkdGhpcy0+Y3JlYXRlU2luZ2xlU2lnbk9uQ29va2llKCR1c2VybmFtZSwgJHBhc3N3b3JkKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkkdGhpcy0+Y29ubmVjdGlvblN0YXR1cyA9IDA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gbG9nb3V0KCkgeworCQkkdGhpcy0+Y2xlYXJTaW5nbGVTaWduT25JbmZvKCk7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldExhc3RDb25uZWN0aW9uU3RhdHVzKCkgeworCQlyZXR1cm4gKCR0aGlzLT5jb25uZWN0aW9uU3RhdHVzID09IDEpOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmVHcm91cHNGb3JVc2VyKCR1c2VybmFtZSwkc2VhcmNoRGlyZWN0b3J5ID0gU1NPX0JBU0VfRE4pIHsKKwkJLy8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGxkYXAgc2VydmVyIAorCQkkbGRhcGNvbm4gPSAkdGhpcy0+Y29ubmVjdChTU09fTERBUF9IT1NULFNTT19MREFQX1BPUlQpOworCQkkZ3JvdXBzICAgPSBhcnJheSgpOworCQlpZiAoJGxkYXBjb25uKSB7CisJCQkkZmlsdGVyID0gIigmKG9iamVjdENsYXNzPWdyb3VwT2ZVbmlxdWVOYW1lcykiCisJCQkJLiIodW5pcXVlTWVtYmVyPXVpZD17JHVzZXJuYW1lfSwiIC4gU1NPX0JBU0VfRE4gLiAiKSkiOworCQkJJHJlc3VsdCA9IGxkYXBfc2VhcmNoKCRsZGFwY29ubiwkc2VhcmNoRGlyZWN0b3J5LCRmaWx0ZXIsYXJyYXkoJ2NuJykpOworCQkJIAorCQkJaWYgKCRyZXN1bHQpIHsKKwkJCQkkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJGxkYXBjb25uLCRyZXN1bHQpOworCQkJCWZvcmVhY2ggKCRlbnRyaWVzIGFzICRyYXdHcm91cCkgeworCQkJCQlpZiAoaXNzZXQoJHJhd0dyb3VwWydjbiddWzBdKSAKKwkJCQkJJiYgJHJhd0dyb3VwWydjbiddWzBdICE9ICcnKSB7CisJCQkJCQkkZ3JvdXBzW10gPSAkcmF3R3JvdXBbJ2NuJ11bMF07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gCisJCQorCQlyZXR1cm4gJGdyb3VwczsKKwl9CisJCisJLyoqCisJICogCisJICogcmV0cmlldmVzIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBmcm9tIHRoZSB1c2VycyBsZGFwIGVudHJ5IAorCSAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIHVzZXIgZm9yIHdoaWNoIGF0dHJpYnV0ZXMgd2lsbCBiZSByZXR1cm5lZAorCSAqIEBwYXJhbSBhcnJheSAkYXR0cmlidXRlcyBsZGFwIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUKKwkgKiBAcGFyYW0gc3RyaW5nICRzZWFyY2hEaXJlY3Rvcnkgb3B0aW9uYWwgcGF0aCB0byB1c2VycyBsZGFwIGVudHJ5IAorCSAqLworCXB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZVVzZXJBdHRyaWJ1dGVzKCR1c2VybmFtZSwkYXR0cmlidXRlcywkc2VhcmNoRGlyZWN0b3J5ID0gU1NPX0JBU0VfRE4pIHsKKwkJLy8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGxkYXAgc2VydmVyIAorCQkkbGRhcGNvbm4gPSAkdGhpcy0+Y29ubmVjdChTU09fTERBUF9IT1NULFNTT19MREFQX1BPUlQpOworCQkkYXR0ciA9IGFycmF5KCk7CisJCQorCQlpZiAoJGxkYXBjb25uKSB7CisJCQkvLyBnZXQgdXNlciBhdHRyaWJ1dGVzCisJCQkkZmlsdGVyID0gInVpZD0iLiR1c2VybmFtZTsKKwkJCSRyZXN1bHQgPSBsZGFwX3NlYXJjaCgkbGRhcGNvbm4sJHNlYXJjaERpcmVjdG9yeSwkZmlsdGVyLCRhdHRyaWJ1dGVzKTsKKwkJCWlmICgkcmVzdWx0KSB7CisJCQkJJGVudHJpZXMgPSBsZGFwX2dldF9lbnRyaWVzKCRsZGFwY29ubiwkcmVzdWx0KTsKKwkJCQlyZXR1cm4gJGVudHJpZXM7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBhcnJheSgpOworCQkJfQorCQl9CisJfQorCQorCQorCXB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VQYXNzd29yZCgkbmV3UGFzcywkZW5jcnlwdGlvbk1ldGhvZCA9ICJTSEEiKSB7CisJCWlmICgkdGhpcy0+aXNMb2dnZWRJbigpKSB7CisJCQkkdXNlciAgPSAidWlkPXskdGhpcy0+Z2V0U2luZ2xlU2lnbk9uVXNlcm5hbWUoKX0sIiAuIFNTT19CQVNFX0ROIDsKKwkJCSRlbnRyeSA9IGFycmF5KCk7CisJCQkKKwkJCXN3aXRjaCAoc3RydG91cHBlcigkZW5jcnlwdGlvbk1ldGhvZCkpIHsKKwkJCQljYXNlICJTSEEiOiAKKwkJCQkJJGVudHJ5Wyd1c2VyUGFzc3dvcmQnXSA9ICJ7U0hBfSAiIC4gYmFzZTY0X2VuY29kZShwYWNrKCJIKiIsc2hhMSgkbmV3UGFzcykpKTsgCisJCQkJCWJyZWFrOworCQkJCWNhc2UgIk1ENSI6IAorCQkJCQkkZW50cnlbJ3VzZXJQYXNzd29yZCddID0gIntNRDV9ICIgLiBiYXNlNjRfZW5jb2RlKHBhY2soIkgqIixtZDUoJG5ld1Bhc3MpKSk7ICAKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBtZXRob2QgcmVxdWVzdGVkIik7CisJCQl9CisJCQkKKwkJCWlmIChsZGFwX21vZF9yZXBsYWNlKCR0aGlzLT5jb25uLCR1c2VyLCRlbnRyeSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBjb25uZWN0KCRzZXJ2ZXIsJHBvcnQpIHsKKwkJaWYgKCRjb25uID0gbGRhcF9jb25uZWN0KCRzZXJ2ZXIsJHBvcnQpKSB7CisJCQkvLyBDb25uZWN0aW9uIGVzdGFibGlzaGVkCisJCQkkdGhpcy0+Y29ubmVjdGlvblN0YXR1cyA9IDE7CisJCQlsZGFwX3NldF9vcHRpb24oJGNvbm4sIExEQVBfT1BUX1BST1RPQ09MX1ZFUlNJT04sIDMpOworCQkJbGRhcF9zZXRfb3B0aW9uKCRjb25uLCBMREFQX09QVF9ERUJVR19MRVZFTCwgNyk7CisJCQlsZGFwX3NldF9vcHRpb24oJGNvbm4sIExEQVBfT1BUX1JFRkVSUkFMUywgMCk7CQorCQkJJHRoaXMtPmNvbm4gPSAkY29ubjsKKwkJCXJldHVybiAkY29ubjsKKwkJfSBlbHNlIHsKKwkJCS8vIENvbm5lY3Rpb24gZmFpbGVkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcml2YXRlIGZ1bmN0aW9uIGNsZWFyU2luZ2xlU2lnbk9uSW5mbygpIHsKKwkJJG9sZENvb2tpZSA9ICRfQ09PS0lFW1NTT19DT09LSUVfS0VZXTsKKwkJc2V0Y29va2llKFNTT19DT09LSUVfS0VZLCAkb2xkQ29va2llLCAxLCAiLyIpOworCX0KKworCXByaXZhdGUgZnVuY3Rpb24gZ2V0U2luZ2xlU2lnbk9uVXNlcm5hbWUoKSB7CisJCSR0aGVDb29raWUgPSAkX0NPT0tJRVtTU09fQ09PS0lFX0tFWV07CisJCWlmICgkdGhlQ29va2llIDw+ICIiKSB7CisJCQkkdXNlcnBhc3MgPSBiYXNlNjRfZGVjb2RlKHVybGRlY29kZSgkdGhlQ29va2llKSk7CisJCQkkdXNlcnBhc3NBcnIgPSBleHBsb2RlKCI6IiwgJHVzZXJwYXNzKTsKKwkJCXJldHVybiAkdXNlcnBhc3NBcnJbMF07CisJCX0gZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVTaW5nbGVTaWduT25Db29raWUoJHVzZXJuYW1lLCAkcGFzc3dvcmQpIHsKKwkJaWYgKCFpc3NldCAoJF9DT09LSUVbU1NPX0NPT0tJRV9LRVldKSkgeworCQkJJHRoZUNvb2tpZVN0clVuZW5jb2RlZCA9ICR1c2VybmFtZSAuICI6IiAuICRwYXNzd29yZDsKKwkJCSR0aGVDb29raWVTdHJFbmNvZGVkID0gIlwiIi5iYXNlNjRfZW5jb2RlKCR0aGVDb29raWVTdHJVbmVuY29kZWQpLiJcIiI7CisJCQlzZXRjb29raWUoU1NPX0NPT0tJRV9LRVksICR0aGVDb29raWVTdHJFbmNvZGVkLCB0aW1lKCkgKyAoODY0MDAgKiA3KSwgIi8iKTsgLy8gZXhwaXJlIGluIDEgZGF5CisJCX0KKwl9Cit9Cis/PgpkaWZmIC0tZ2l0IGEvMC4xMC9zc28vc3JjL21haW4vcGhwL3BlYXIvcGFja2FnZS54bWwgYi8wLjEwL3Nzby9zcmMvbWFpbi9waHAvcGVhci9wYWNrYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZhYmNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zc28vc3JjL21haW4vcGhwL3BlYXIvcGFja2FnZS54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAKKyAgIEBwYWNrYWdlIE9yZ19BcGFjaGVfT29kdF9TZWN1cml0eQorICAgQGF1dGhvciBDaHJpcyBBLiBNYXR0bWFubgorICAgQGF1dGhvciBBbmRyZXcgRi4gSGFydAorICAgQHZlcnNpb24gJFJldmlzaW9uJAorLS0+Cis8cGFja2FnZSB2ZXJzaW9uPSIyLjAiIHhtbG5zPSJodHRwOi8vcGVhci5waHAubmV0L2R0ZC9wYWNrYWdlLTIuMCIKKyAgeG1sbnM6dGFza3M9Imh0dHA6Ly9wZWFyLnBocC5uZXQvZHRkL3Rhc2tzLTEuMCIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vcGVhci5waHAubmV0L2R0ZC90YXNrcy0xLjAueHNkCisgICAgICAgICBodHRwOi8vcGVhci5waHAubmV0L2R0ZC9wYWNrYWdlLTIuMAorICAgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvcGFja2FnZS0yLjAueHNkIj4KKyAgPG5hbWU+QXBhY2hlX09PRFRfU2VjdXJpdHk8L25hbWU+CisgIDxjaGFubmVsPnBlYXIuYXBhY2hlLm9yZy9vb2R0PC9jaGFubmVsPgorICA8c3VtbWFyeT5PT0RUIFNpbmdsZSBTaWduIE9uIFBhY2thZ2U8L3N1bW1hcnk+CisgIDxkZXNjcmlwdGlvbj4KKyAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBQSFAgbGlicmFyeSBmb3Igc2luZ2xlIHNpZ24tb24gZm9yIAorICAgIE9PRFQgYXBwbGljYXRpb25zIHdoaWNoIGF1dGhlbnRpY2F0ZSBhbmQgYXV0aG9yaXplIGFnYWluc3QgYW4KKyAgICBMREFQIHNlcnZlci4KKyAgPC9kZXNjcmlwdGlvbj4KKyAgPGxlYWQ+CisgICAgPG5hbWU+QW5kcmV3IEhhcnQ8L25hbWU+CisgICAgPHVzZXI+YWhhcnQ8L3VzZXI+CisgICAgPGVtYWlsPmFuZHJldy5mLmhhcnRAanBsLm5hc2EuZ292PC9lbWFpbD4KKyAgICA8YWN0aXZlPnllczwvYWN0aXZlPgorICA8L2xlYWQ+CisgIDxkYXRlPjIwMTMtMDYtMjk8L2RhdGU+CisgIDx2ZXJzaW9uPgorICAgIDxyZWxlYXNlPjAuNi4wPC9yZWxlYXNlPgorICAgIDxhcGk+MC42LjA8L2FwaT4KKyAgPC92ZXJzaW9uPgorICA8c3RhYmlsaXR5PgorICAgIDxyZWxlYXNlPnN0YWJsZTwvcmVsZWFzZT4KKyAgICA8YXBpPnN0YWJsZTwvYXBpPgorICA8L3N0YWJpbGl0eT4KKyAgPGxpY2Vuc2UgdXJpPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCI+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wPC9saWNlbnNlPgorICA8bm90ZXM+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgUEhQIGxpYnJhcnkgZm9yIHNpbmdsZSBzaWduLW9uIGZvciAKKyAgICBPT0RUIGFwcGxpY2F0aW9ucyB3aGljaCBhdXRoZW50aWNhdGUgYW5kIGF1dGhvcml6ZSBhZ2FpbnN0IGFuCisgICAgTERBUCBzZXJ2ZXIuCisgIDwvbm90ZXM+CisgIDxjb250ZW50cz4KKyAgICA8ZGlyIG5hbWU9Ii8iIGJhc2VpbnN0YWxsZGlyPSJPcmcvQXBhY2hlL09vZHQvU2VjdXJpdHkiPgorICAgICAgPGZpbGUgbmFtZT0iQ29uZmlnLnBocCIgcm9sZT0icGhwIi8+CisgICAgICA8ZmlsZSBuYW1lPSJTaW5nbGVTaWduT24ucGhwIiByb2xlPSJwaHAiLz4KKyAgICA8L2Rpcj48IS0tIC8gLS0+CisgIDwvY29udGVudHM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPHJlcXVpcmVkPgorICAgICAgPHBocD4KKyAgICAgICAgPG1pbj41LjEuNjwvbWluPgorICAgICAgPC9waHA+CisgICAgICA8cGVhcmluc3RhbGxlcj4KKyAgICAgICAgPG1pbj4xLjYuMTwvbWluPgorICAgICAgPC9wZWFyaW5zdGFsbGVyPgorICAgIDwvcmVxdWlyZWQ+CisgIDwvZGVwZW5kZW5jaWVzPgorICA8cGhwcmVsZWFzZSAvPgorICA8Y2hhbmdlbG9nPgorICAgIDxyZWxlYXNlPgorICAgICAgPHZlcnNpb24+CisgICAgICAgIDxyZWxlYXNlPjAuMS4wPC9yZWxlYXNlPgorICAgICAgICA8YXBpPjAuMS4wPC9hcGk+CisgICAgICA8L3ZlcnNpb24+CisgICAgICA8c3RhYmlsaXR5PgorICAgICAgICA8cmVsZWFzZT5zdGFibGU8L3JlbGVhc2U+CisgICAgICAgIDxhcGk+c3RhYmxlPC9hcGk+CisgICAgICA8L3N0YWJpbGl0eT4KKyAgICAgIDxkYXRlPjIwMDktMDMtMDQ8L2RhdGU+CisgICAgICA8bGljZW5zZSB1cmk9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdiI+T09EVCBMaWNlbnNlPC9saWNlbnNlPgorICAgICAgPG5vdGVzPgorICAgICAgVGhpcyBpcyB0aGUgaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBPT0RUIENBUyBTZWN1cml0eSB1dGlsaXR5IGFzIGEgUEVBUiBwYWNrYWdlLgorICAgICAgPC9ub3Rlcz4gICAgIAorICAgIDwvcmVsZWFzZT4KKyAgPC9jaGFuZ2Vsb2c+Cis8L3BhY2thZ2U+CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NjcmlwdHMvc2h1dGRvd24uc2ggYi8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NjcmlwdHMvc2h1dGRvd24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWY4NjZjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy9zaHV0ZG93bi5zaApAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworI1NvdXJjZSBlbnZpcm9ubWVudCBhbmQgdXRpbGl0ZXMKK0VOVlM9JChkaXJuYW1lICQocmVhZGxpbmsgLWYgJHtCQVNIX1NPVVJDRVswXX0pKS8uLi9zZXR1cC9lbnYtdmFycy5zaAorLiAke0VOVlN9CitpZiAhIGlzU2NyaXB0Cit0aGVuCisgICAgcHJpbnRFcnJvciAiQ2Fubm90IHNvdXJjZSB0aGlzIGZpbGUuIgorICAgIHJldHVybiAyNTUKK2ZpCisjTm93IHJ1biBjb21tYW5kcworZWNobyAiQXR0ZW1wdGluZyB0byBraWxsIE1lc29zIG1hc3RlciBvbjogJHtNRVNPU19NQVNURVJfSVB9Igorc3NoYyAke01FU09TX01BU1RFUl9JUH0gInBraWxsIC11ICQod2hvYW1pKSBtZXNvcy1tYXN0ZXIiIGZhbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJpbnRFcnJvciAiQ291bGQgbm90IHRlcm1pbmF0ZSBtZXNvcyBtYXN0ZXIiCisjTG9vcCB0aHJvdWdoIGhvc3RzIGFuZCBzdGFydCBzbGF2ZXMgKGV4Y2VwdCB0aGUgZmlyc3QsIHdoaWNoIGlzIG1hc3RlcikKK2ZvciBob3N0IGluICQoY2F0ICR7SE9TVFNfRklMRX0gfCBncmVwIC12ICJeIyIgfCB0YWlsIC1uICsyICkKK2RvCisgICAgZWNobyAiQXR0ZW1wdGluZyB0byBraWxsIE1lc29zIHNsYXZlIG9uOiAke2hvc3R9IgorICAgIHNzaGMgJHtob3N0fSAicGtpbGwgLXUgJCh3aG9hbWkpIG1lc29zLXNsYXZlIiBmYWxzZSBcCisgICAgICAgICAgICAgICAgICAgICAgfHwgcHJpbnRFcnJvciAiQ291bGQgbm90IHRlcm1pbmF0ZSBtZXNvcyBzbGF2ZSBvbiAke2hvc3R9IgorZG9uZQorc3NoYyAke1JFU09VUkNFX0hPU1R9IFwKKyAgICAicGtpbGwgLXUgJCh3aG9hbWkpIC1mIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLlhtbFJwY1Jlc291cmNlTWFuYWdlciIgZmFsc2UgXAorICAgIHx8IHByaW50RXJyb3IgIkNvdWxkIG5vdCB0ZXJtaW5hdGUgcmVzb3VyY2UgbWFuYWdlciBvbiBob3N0OiAke1JFU09VUkNFX0hPU1R9IgorI1NodXQgZG93biBzY3JlZW4gaWYgdXNpbmcgc2NyZWVuCitpZiBbWyAiJHtTQ1JFRU59IiAhPSAiIiBdXQordGhlbgorICAgIHNjcmVlbiAtWCAtUyAke1NDUkVFTn0gcXVpdAorZmkKKyNTaHV0ZG93biBIYWRvb3AgSERGUworJHtIQURPT1BfSE9NRX0vc2Jpbi9zdG9wLWRmcy5zaApkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zY3JpcHRzL3N0YXJ0LXVwLnNoIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zY3JpcHRzL3N0YXJ0LXVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjZjczNmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NjcmlwdHMvc3RhcnQtdXAuc2gKQEAgLTAsMCArMSw2NSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyNTb3VyY2UgZW52aXJvbm1lbnQgYW5kIHV0aWxpdGVzCitFTlZTPSQoZGlybmFtZSAkKHJlYWRsaW5rIC1mICR7QkFTSF9TT1VSQ0VbMF19KSkvLi4vc2V0dXAvZW52LXZhcnMuc2gKKy4gJHtFTlZTfQoraWYgISBpc1NjcmlwdAordGhlbgorICAgIHByaW50RXJyb3IgIkNhbm5vdCBzb3VyY2UgdGhpcyBmaWxlLiIKKyAgICByZXR1cm4gMjU1CitmaQorCisjU2V0dXAgaG9zdCB0byBjb21tYW5kIG1hcAorc3RhcnRzPSgpCitzdGFydHMrPSgibW0gJHtNRVNPU19NQVNURVJfSVB9ICckKHByaW50U2NyaXB0TG9jYXRpb24pL3N0YXJ0LXVwL21lc29zLW1hc3Rlci5iYXNoJyIpCitzdGFydHMrPSgicm0gJHtSRVNPVVJDRV9IT1NUfSAgICckKHByaW50U2NyaXB0TG9jYXRpb24pL3N0YXJ0LXVwL3Jlc291cmNlLmJhc2gnIikKKyNTbGF2ZXMKK2xldCBuPTAKK2ZvciBob3N0IGluICQoY2F0ICR7SE9TVFNfRklMRX0gfCBncmVwIC12ICJeIyIgfCB0YWlsIC1uICsyICkKK2RvCisgICAgc3RhcnRzKz0oInMke259ICR7aG9zdH0gJyQocHJpbnRTY3JpcHRMb2NhdGlvbikvc3RhcnQtdXAvbWVzb3Mtc2xhdmUuYmFzaCciKQorICAgIGxldCBuPW4rMQorZG9uZQorCisjU2V0dXAgc2NyZWVuIGlmIGV4aXN0aW5nCitpZiBbWyAiJHtTQ1JFRU59IiAhPSAiIiBdXQordGhlbgorICAgIGluaXRTY3JlZW4gIiR7U0NSRUVOfSIKK2ZpCisjU3RhcnQgSGFkb29wIEhERlMgCiske0hBRE9PUF9IT01FfS9zYmluL3N0YXJ0LWRmcy5zaAorCisjUnVuIGFsbCBzdGFydC11cCBjb21tYW5kcworZm9yIGVsZW0gaW4gIiR7c3RhcnRzW0BdfSIKK2RvCisgICAgc2V0IC0tICR7ZWxlbX0KKyAgICB0YWI9JHsxfQorICAgIGhvc3Q9JHsyfQorICAgIGNtZD0kezN9CisgICAgZWNobyAiUnVubmluZzogJHtjbWR9IG9uICR7aG9zdH0gdmlhICR7U0NSRUVOOi1zc2h9ICgke3RhYn0pIgorICAgICNSdW4gaW4gc2NyZWVuIGlmIHNldCwgb3Igc3NoIGlmIG5vdCBzZXQKKyAgICBpZiBbWyAiJHtTQ1JFRU59IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgc2NyZWVuciAke3RhYn0gJHtob3N0fSAiJHtjbWR9IiB8fCBlcnJvckFuZEV4aXQgIkNvdWxkIG5vdCBydW4gJHtjbWR9IG9uICR7aG9zdH0gdmlhICR7U0NSRUVOfSIKKyAgICBlbHNlCisgICAgICAgIHNzaGMgJHtob3N0fSAiJHtjbWR9IiB0cnVlIHx8IGVycm9yQW5kRXhpdCAiQ291bGQgbm90IHJ1biAke2NtZH0gb24gJHtob3N0fSB2aWEgc3NoIgorICAgIGZpCisgICAgc2xlZXAgMQorZG9uZQorCisKZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy9zdGFydC11cC9tZXNvcy1tYXN0ZXIuYmFzaCBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy9zdGFydC11cC9tZXNvcy1tYXN0ZXIuYmFzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YWJlM2NmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zY3JpcHRzL3N0YXJ0LXVwL21lc29zLW1hc3Rlci5iYXNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjV3JhcHBlciB0byBzdGFydC11cCBtZXNvcy1tYXN0ZXIuCitFTlZTPSQoZGlybmFtZSAkKHJlYWRsaW5rIC1mICR7QkFTSF9TT1VSQ0VbMF19KSkvLi4vLi4vc2V0dXAvZW52LXZhcnMuc2gKKy4gJHtFTlZTfQorI0Rvbid0IHNvdXJjZSB0aGlzCitpZiAhIGlzU2NyaXB0Cit0aGVuCisgICAgcHJpbnRFcnJvciAiQ2Fubm90IHNvdXJjZSB0aGlzIGZpbGUuIgorICAgIHJldHVybiAyNTUKK2ZpCitta2RpciAtcCAke1JVTl9ESVJ9L3dvcmsvbWVzb3MKKyR7TUVTT1NfQlVJTER9L2Jpbi9tZXNvcy1tYXN0ZXIuc2ggLS1pcD0ke01FU09TX01BU1RFUl9JUH0KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy9zdGFydC11cC9tZXNvcy1zbGF2ZS5iYXNoIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zY3JpcHRzL3N0YXJ0LXVwL21lc29zLXNsYXZlLmJhc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjAzNmU4MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy9zdGFydC11cC9tZXNvcy1zbGF2ZS5iYXNoCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjV3JhcHBlciB0byBzdGFydC11cCBtZXNvcy1zbGF2ZS4KK0VOVlM9JChkaXJuYW1lICQocmVhZGxpbmsgLWYgJHtCQVNIX1NPVVJDRVswXX0pKS8uLi8uLi9zZXR1cC9lbnYtdmFycy5zaAorLiAke0VOVlN9CisjRG9uJ3Qgc291cmNlIHRoaXMKK2lmICEgaXNTY3JpcHQKK3RoZW4KKyAgICBwcmludEVycm9yICJDYW5ub3Qgc291cmNlIHRoaXMgZmlsZS4iCisgICAgcmV0dXJuIDI1NQorZmkKKyR7TUVTT1NfQlVJTER9L2Jpbi9tZXNvcy1zbGF2ZS5zaCAtLW1hc3Rlcj0ke01FU09TX01BU1RFUl9JUH06NTA1MCAtLW5vLXN3aXRjaF91c2VyCmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NjcmlwdHMvc3RhcnQtdXAvcmVzb3VyY2UuYmFzaCBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy9zdGFydC11cC9yZXNvdXJjZS5iYXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQzZTljNDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NjcmlwdHMvc3RhcnQtdXAvcmVzb3VyY2UuYmFzaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworI1dyYXBwZXIgdG8gc3RhcnQtdXAgcmVzb3VyY2UuCitFTlZTPSQoZGlybmFtZSAkKHJlYWRsaW5rIC1mICR7QkFTSF9TT1VSQ0VbMF19KSkvLi4vLi4vc2V0dXAvZW52LXZhcnMuc2gKKy4gJHtFTlZTfQorI1N0YXJ0LXVwIHNjcmlwdAoraWYgISBpc1NjcmlwdAordGhlbgorICAgIHByaW50RXJyb3IgIkNhbm5vdCBzb3VyY2UgdGhpcyBmaWxlLiIKKyAgICByZXR1cm4gMjU1CitmaQorbG9jPSR7UkVTT1VSQ0VfSE9NRX0vYmluLworKAorICAgIGNkICR7bG9jfQorICAgIC4vcmVzbWdyIHN0YXJ0CisgICAgI1dhaXQgcmVxdWlyZWQgZm9yIGNhdGNoaW5nIG91dHB1dAorICAgIHdhaXQKKykKZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy91dGlsaXRlcy5zaCBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2NyaXB0cy91dGlsaXRlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZWEyMzNiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zY3JpcHRzL3V0aWxpdGVzLnNoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvZGVwbG95LnNoIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zZXR1cC9kZXBsb3kuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjRiMTUxZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvZGVwbG95LnNoCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjVmFyaWFibGVzIGFyZSBpbiB0aGUgZW52X3ZhcnMuc2ggZmlsZQorRU5WUz0kKGRpcm5hbWUgJChyZWFkbGluayAtZiAke0JBU0hfU09VUkNFWzBdfSkpL2Vudi12YXJzLnNoCitpZiBbICEgLWYgLi9lbnYtdmFycy5zaCBdCit0aGVuCisgICAgZWNobyAiJHtFTlZTfSBub3QgZm91bmQuIFBsZWFzZSB1c2UgJHtFTlZTfS50bXBsIGFzIGEgdGVtcGxhdGUgdG8gY3JlYXRlIGl0LiIKKyAgICBleGl0IDEKK2ZpCisuICR7RU5WU30KKworI1RlbGwgdXMgd2hhdCB5YSBnb2luZyB0byBkbworZWNobyAiRGVwbG95aW5nIHRoZSBjbHVzdGVyIGNvbXBvbmVudHM6IgorZWNobyAiICBIb3N0IGZpbGU6ICR7SE9TVFNfRklMRTotRVJST1I6IEhvc3QgZmlsZSBub3Qgc2V0fSIKK2VjaG8gIiAgVGVtcG9yYXJ5IGRpcmVjdG9yeTogJHtUTVBfRElSOi1FUlJPUjogVGVtcCBkaXIgbm90IHNldH0iCitlY2hvICIgIEluc3RhbGwgZGlyZWN0b3J5OiAgICR7SU5TVEFMTF9ESVI6LUVSUk9SOiBJbnN0YWxsIGRpciBub3Qgc2V0fSIKKworI0NoZWNraW5nIHZlcnNpb25zCitpZiBbIC16ICR7SU5TVEFMTF9ESVJ9IF0gfHwgWyAteiAke1RNUF9ESVJ9IF0gfHwgWyAteiAke0hPU1RTX0ZJTEV9IF0KK3RoZW4KKyAgICBlY2hvICJFUlJPUjogTmVlZGVkIHZhcmlhYmxlcyBub3Qgc2V0LiBEaWQgeW91IHNldCB0aGUgZW52aXJvbm1lbnQgZmlsZXM/IgorICAgIGV4aXQgMQorZmkKKyNDaGVjayBkaXJlY3RvcmllcyBleGl0CitpZiBbICEgLWQgJHtJTlNUQUxMX0RJUn0gXSB8fCBbICEgLWQgJHtUTVBfRElSfSBdIHx8IFsgISAtZiAke0hPU1RTX0ZJTEV9IF0KK3RoZW4KKyAgICBlY2hvICJFUlJPUjogTmVlZGVkIGRpcmVjdG9yaWVzIG9yIGZpbGVzIGRvbid0IGV4aXN0IgorICAgIGV4aXQgMQorZmkKKyNDYW5ub3QgZmluZCBzY3JpcHRzCitpZiBbICEgLWQgLi4vc2NyaXB0cyBdCit0aGVuCisgICAgZWNobyAiRVJST1I6IENhbm5vdCBmaW5kIHNjcmlwdHMgZGlyZWN0b3J5OiAuLi9zY3JpcHRzIgorICAgIGV4aXQgMQorZmkKKyNDaGVjayBzcGFjZQoraWYgWyAtZSAke0lOU1RBTExfRElSfSBdICYmICgoICQoZGYgLWsgJHtJTlNUQUxMX0RJUn0gfCBhd2sgJ05SPT0zIHtwcmludCAkM30nKSA8IDUwMDAwMDAgKSkKK3RoZW4KKyAgICBlY2hvICJFUlJPUjogTm90IGVub3VnaCBzcGFjZSAoNUdCKSB0byBpbnN0YWxsIGluOiAke0lOU1RBTExfRElSfS4iCisgICAgZXhpdCAxIAorZmkKKyNDaGVjayBzcGFjZQoraWYgKCggJChkZiAtayAke1RNUF9ESVJ9IHwgYXdrICdOUj09MyB7cHJpbnQgJDN9JykgPCAzMDAwMDAwICkpCit0aGVuCisgICAgZWNobyAiRVJST1I6IE5vdCBlbm91Z2ggdG1wIHNwYWNlICgzR0IpOiAke1RNUF9ESVJ9LiIKKyAgICBleGl0IDEKK2ZpCisKK3doaWxlIHRydWU7IGRvCisgICAgcmVhZCAtcCAiQ29udGludWUgaW5zdGFsbGluZyh5L24pPyAiIHluCisgICAgY2FzZSAkeW4gaW4KKyAgICAgICAgW1l5XSogKSBicmVhazs7CisgICAgICAgIFtObl0qICkgZXhpdDs7CisgICAgICAgICogKSBlY2hvICJQbGVhc2UgYW5zd2VyIHkgb3Igbi4iOzsKKyAgICBlc2FjCitkb25lCisjUHV0IG9uIGFsbCBob3N0cworZm9yIGhvc3QgaW4gJChjYXQgJHtIT1NUU19GSUxFfSB8IGdyZXAgLXYgIl4jIiB8IHRhaWwgLW4gKzIgKQorZG8KKyAgICBlY2hvICJEZXBsb3lpbmcgdG86ICR7aG9zdH0iCisgICAgc3NoICR7aG9zdH0gIm1rZGlyIC1wICR7SU5TVEFMTF9ESVJ9OyIgXAorICAgIHx8eyBcCisgICAgICAgICBlY2hvICJXQVJOSU5HOiBDYW5ub3QgY3JlYXRlICR7SU5TVEFMTF9ESVJ9IG9uICR7aG9zdH0gRGVwbG95IG1hbnVhbGx5LiI7IFwKKyAgICAgICAgIGNvbnRpbnVlO1wKKyAgICAgIH0KKyAgICByc3luYyAtYXZ6ICR7SU5TVEFMTF9ESVJ9LyogIiR7aG9zdH06JHtJTlNUQUxMX0RJUn0iCitkb25lCmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NldHVwL2Vudi12YXJzLnNoLnRtcGwgYi8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NldHVwL2Vudi12YXJzLnNoLnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc4ZmQwYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvZW52LXZhcnMuc2gudG1wbApAQCAtMCwwICsxLDEwOSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIEluc3RydWN0aW9uczoKKyMgICAxLiBDb3B5IHRoaXMgZmlsZSB0byAuL2Vudi12YXJzLnNoCisjICAgMi4gQWRkIGV4ZWN1dGUgcGVybWlzc2lvbnMgdG8gLi9lbnYtdmFycy5zaAorIyAgIDMuIENoYW5nZSBuZXh0IHRocmVlIHNlY3Rpb25zIHRvIGNvbmZpZ3VyZSBpbnN0YWxsYXRpb24KKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFNldCB0aGVzZSBkaXJlY3RvcmllczoKKyMgIElOU1RBTExfRElSIC0gRGlyZWN0b3J5IHVzZWQgdG8gaW5zdGFsbCBhbmQgcnVuIHNvZnR3YXJlLgorIyAgVE1QX0RJUiAtIFRlbXBvcmFyeSBkaXJlY3RvcnkgdXNlZCBhcyBzY3JhdGNoIHNwYWNlLgorIyAgUlVOX0RJUiAtIERpcmVjdG9yeSB0aGF0IHdpbGwgaG9sZCBydW4tdGltZSBhcnRpZmFjdHMgZnJvbSBzb2Z0d2FyZS4KKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitleHBvcnQgUlVOX0RJUj0veW91ci9ydW50aW1lL2Rpci9nb2VzL2hlcmUKK2V4cG9ydCBJTlNUQUxMX0RJUj0veW91ci9pbnN0YWxsL2Rpci9nb2VzL2hlcmUKK2V4cG9ydCBUTVBfRElSPS95b3VyL3RtcC9kaXIvZ29lcy9oZXJlCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFNldCBTQ1JFRU4gaWYgdXNlIG9mIEdOVSBTY3JlZW4gaXMgZGVzaXJlZAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNleHBvcnQgU0NSRUVOPSJzb29kdC1zY3JlZW4iCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFNldCBQb3J0cworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2V4cG9ydCBIQURPT1BfTkFNRU5PREVfUE9SVD04MDkwCitleHBvcnQgTUVTT1NfTUFTVEVSX1BPUlQ9NTA1MAorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBTZXQgdGhlc2UgdmVyc2lvbnMgb2Ygc29mdHdhcmUgCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZXhwb3J0IEFQQUNIRV9NRVNPU19WRVJTSU9OPTAuMTkuMAorZXhwb3J0IFNDQUxBX1ZFUlNJT049Mi4xMC40CitleHBvcnQgS0FGS0FfVkVSU0lPTj0yLjEwLTAuOC4xLjEKK2V4cG9ydCBTUEFSS19WRVJTSU9OPTEuMS4wCitleHBvcnQgVEFDSFlPTl9WRVJTSU9OPTAuNS4wCitleHBvcnQgSEFET09QX1ZFUlNJT049Mi40LjAKK2V4cG9ydCBDTFVTVEVSX1RPT0xTX1ZFUlNJT049dHJ1bmsKKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgU2V0IEpBVkFfSE9NRSAod2lsbCB1c2UgZnJvbSBlbnZpcm9ubWVudCBpZiBzZXQpCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZXhwb3J0IEpBVkFfSE9NRT0ke0pBVkFfSE9NRTotL3BhdGgvdG8vamF2YS9ob21lL30KKworIyMjCisjQmV5b25kIFRoaXMgTGluZTogQWR2YW5jZWQgVXNlcnMgT25seQorIyhGb2xsb3dpbmcgbGluZXMgc2hvdWxkIGJlIHNldHVwIHByb3Blcmx5KQorIyMjCisjIEhvc3RzIGZpbGUKK2V4cG9ydCBIT1NUU19GSUxFPSIke0lOU1RBTExfRElSfS9jbHVzdGVyLXRvb2xzL3NldHVwL2hvc3RzIgorZXhwb3J0IEVOVl9WQVJTPSIke0lOU1RBTExfRElSfS9jbHVzdGVyLXRvb2xzL3NldHVwL2Vudi12YXJzLnNoIiAKKyMgSG9zdHMKK2lmIFsgLWYgJHtIT1NUU19GSUxFfSBdCit0aGVuCisgICAgZXhwb3J0IE1FU09TX0hPU1Q9IiQoY2F0ICR7SE9TVFNfRklMRX0gfCBncmVwIC12ICJeIyIgfCBoZWFkIC0xKSIKKyAgICBleHBvcnQgSEFET09QX05BTUVOT0RFPSIke01FU09TX0hPU1R9IgorZmkKK2V4cG9ydCBSRVNPVVJDRU1HUl9IT1NUPSR7TUVTT1NfSE9TVH0KKyMgSEFET09QIGVudnMKK2V4cG9ydCBIQURPT1BfSE9NRT0iJHtJTlNUQUxMX0RJUn0vaGFkb29wLSR7SEFET09QX1ZFUlNJT059IgorZXhwb3J0IEhBRE9PUF9PUFRTPSItWFg6LVByaW50V2FybmluZ3MiCisKKyMgU291cmNlIHV0aWxpdHkgZnVuY3Rpb24KK2lmIFsgLWYgJChkaXJuYW1lICR7RU5WX1ZBUlN9KS8uLi9zY3JpcHRzL3V0aWxpdGVzLnNoIF0KK3RoZW4KKyAgICAuICQoZGlybmFtZSAke0VOVl9WQVJTfSkvLi4vc2NyaXB0cy91dGlsaXRlcy5zaAorZmkKKworIyBNZXNvcyB2YXJpYWJsZXMKK2V4cG9ydCBNRVNPU19CVUlMRD0iJHtJTlNUQUxMX0RJUn0vbWVzb3MtJHtBUEFDSEVfTUVTT1NfVkVSU0lPTn0vYnVpbGQvIgorZXhwb3J0IE1FU09TX0hPTUU9IiR7TUVTT1NfQlVJTER9IgorZXhwb3J0IE1FU09TX0xPR19ESVI9IiR7UlVOX0RJUn0vbG9nL21lc29zLyIKK2V4cG9ydCBNRVNPU19XT1JLX0RJUj0iJHtSVU5fRElSfS93b3JrL21lc29zLyIKK2V4cG9ydCBNRVNPU19OQVRJVkVfTElCUkFSWT0iJHtNRVNPU19CVUlMRH0vc3JjLy5saWJzL2xpYm1lc29zLnNvIgorIyBHZXQgbWVzb3MgbWFzdGVyIGlwCitpZiBbIC1uICIke01FU09TX0hPU1R9IiBdCit0aGVuCisgICAgZXhwb3J0IE1FU09TX01BU1RFUl9JUD0iJChob3N0ICR7TUVTT1NfSE9TVH0gfCBhd2sgJ3twcmludCAkTkZ9JykiCitmaQorIyBGb3IgU3BhcmsKK2V4cG9ydCBNQVNURVI9Im1lc29zOi8vJHtNRVNPU19NQVNURVJfSVB9OiR7TUVTT1NfTUFTVEVSX1BPUlR9IgorZXhwb3J0IFNQQVJLX0hPTUU9IiR7SU5TVEFMTF9ESVJ9L3NwYXJrLSR7U1BBUktfVkVSU0lPTn0tYmluLWhhZG9vcDIuNCIKK2ZvciBsaWIgaW4gIiR7U1BBUktfSE9NRX0vcHl0aG9uLyIgIiR7U1BBUktfSE9NRX0vcHl0aG9uL2J1aWxkLyIKK2RvCisgICAgaWYgW1sgJHtQWVRIT05QQVRIfSAhPSAqJHtsaWJ9KiBdXQorICAgIHRoZW4KKyAgICAgICAgZXhwb3J0IFBZVEhPTlBBVEg9JHtQWVRIT05QQVRIfToke2xpYn0KKyAgICBmaQorZG9uZQorIyBSZXNvdXJjZSBtYW5hZ2VyCitleHBvcnQgUkVTT1VSQ0VfSE9TVD0iJHtSRVNPVVJDRU1HUl9IT1NUfSIKK2V4cG9ydCBSRVNPVVJDRV9IT01FPSIke0lOU1RBTExfRElSfS9vb2R0L3Jlc291cmNlIiAKZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvaGRmcy1jb25maWcvY29yZS1zaXRlLnhtbCBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvaGRmcy1jb25maWcvY29yZS1zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzc1MTdlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zZXR1cC9oZGZzLWNvbmZpZy9jb3JlLXNpdGUueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSJjb25maWd1cmF0aW9uLnhzbCI/PgorPCEtLQorICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIFNlZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlLgorLS0+CisKKzwhLS0gUHV0IHNpdGUtc3BlY2lmaWMgcHJvcGVydHkgb3ZlcnJpZGVzIGluIHRoaXMgZmlsZS4gLS0+CisKKzxjb25maWd1cmF0aW9uPgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+ZnMuZGVmYXVsdEZTPC9uYW1lPgorICAgIDx2YWx1ZT5oZGZzOi8vW0hERlNfSE9TVF06W0hERlNfUE9SVF08L3ZhbHVlPgorICAgIDxkZXNjcmlwdGlvbj5GaWxlc3lzdGVtIG5hbWUgbm9kZSBzZXR1cDwvZGVzY3JpcHRpb24+CisgIDwvcHJvcGVydHk+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NldHVwL2hkZnMtY29uZmlnL2hkZnMtc2l0ZS54bWwgYi8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NldHVwL2hkZnMtY29uZmlnL2hkZnMtc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4Zjg1MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvaGRmcy1jb25maWcvaGRmcy1zaXRlLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iY29uZmlndXJhdGlvbi54c2wiPz4KKzwhLS0KKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiBTZWUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZS4KKy0tPgorCis8IS0tIFB1dCBzaXRlLXNwZWNpZmljIHByb3BlcnR5IG92ZXJyaWRlcyBpbiB0aGlzIGZpbGUuIC0tPgorCis8Y29uZmlndXJhdGlvbj4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPmRmcy5uYW1lbm9kZS5uYW1lLmRpcjwvbmFtZT4KKyAgICA8dmFsdWU+ZmlsZTovL1tJTlNUQUxMX0RJUl0vaGFkb29wL25hbWUtbm9kZS88L3ZhbHVlPgorICAgIDxkZXNjcmlwdGlvbj5GaWxlc3lzdGVtIG5hbWUgbm9kZSBsb2dnaW5nIGRpcjwvZGVzY3JpcHRpb24+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5kZnMuZGF0YW5vZGUuZGF0YS5kaXI8L25hbWU+CisgICAgPHZhbHVlPmZpbGU6Ly9bSU5TVEFMTF9ESVJdL2hhZG9vcC9kYXRhLW5vZGUvPC92YWx1ZT4KKyAgICA8ZGVzY3JpcHRpb24+RmlsZXN5c3RlbSBkYXRhIG5vZGUgc2V0dXA8L2Rlc2NyaXB0aW9uPgorICA8L3Byb3BlcnR5PgorCis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9jbHVzdGVyLXRvb2xzL3NldHVwL2hvc3RzIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zZXR1cC9ob3N0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmMyMDMxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zZXR1cC9ob3N0cwpAQCAtMCwwICsxLDI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjSG9zdHMgZmlsZToKKyMgTGlzdCBvZiBob3N0cywgbGluZXMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuCisjIEZpcnN0IGxpc3RlZCBob3N0IGlzIHVzZWQgYXMgdGhlIE1FU09TIG1hc3Rlci4KK2hvc3QwLmV4YW1wbGUuY29tCitob3N0MS5leGFtcGxlLmNvbQoraG9zdDIuZXhhbXBsZS5jb20KK2hvc3QzLmV4YW1wbGUuY29tCitob3N0NC5leGFtcGxlLmNvbQoraG9zdDUuZXhhbXBsZS5jb20KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvaW5zdGFsbC5zaCBiLzAuMTAvc3RyZWFtaW5nL2NsdXN0ZXItdG9vbHMvc2V0dXAvaW5zdGFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTc0YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvY2x1c3Rlci10b29scy9zZXR1cC9pbnN0YWxsLnNoCkBAIC0wLDAgKzEsMTk3IEBACisjIS9iaW4vYmFzaAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjVmFyaWFibGVzIGFyZSBpbiB0aGUgZW52X3ZhcnMuc2ggZmlsZQorRU5WUz0kKGRpcm5hbWUgJChyZWFkbGluayAtZiAke0JBU0hfU09VUkNFWzBdfSkpL2Vudi12YXJzLnNoCitIT1NUUz0kKGRpcm5hbWUgJChyZWFkbGluayAtZiAke0JBU0hfU09VUkNFWzBdfSkpL2hvc3RzCitpZiBbICEgLWYgJHtFTlZTfSBdCit0aGVuCisgICAgZWNobyAiJHtFTlZTfSBub3QgZm91bmQuIFBsZWFzZSB1c2UgJHtFTlZTfS50bXBsIGFzIGEgdGVtcGxhdGUgdG8gY3JlYXRlIGl0LiIKKyAgICBleGl0IDEKK2VsaWYgWyAhIC1mICR7SE9TVFN9IF0KK3RoZW4KKyAgICBlY2hvICIke0hPU1RTfSBub3QgZm91bmQuIFBsZWFzZSB1c2UgY3JlYXRlIGEgaG9zdHMgZmlsZS4iCisgICAgZXhpdCAxCitmaQorLiAke0VOVlN9CisjU2V0dXAgaG9zdHMgZnJvbSBib290c3RyYXBlZCBob3N0IGZpbGUKK01FU09TX0hPU1Q9IiQoY2F0ICR7SE9TVFN9IHwgZ3JlcCAtdiAiXiMiIHwgaGVhZCAtMSkiCitIQURPT1BfTkFNRU5PREU9IiR7TUVTT1NfSE9TVH0iCisKKyNUZWxsIHVzIHdoYXQgeWEgZ29pbmcgdG8gZG8KK2VjaG8gIkluc3RhbGxpbmcgdGhlIEJEQVMgY29tcG9uZW50czoiCitlY2hvICIgLS0tLS0tLS0tLS0gU29mdHdhcmUgVmVyc2lvbnMgLS0tLS0tLS0tLS0iCitlY2hvICIgIE1lc29zIHZlcnNpb246ICAgJHtBUEFDSEVfTUVTT1NfVkVSU0lPTjotRVJST1I6IFZlcnNpb24gbm90IHNldH0iCitlY2hvICIgIFNjYWxhIHZlcnNpb246ICAgJHtTQ0FMQV9WRVJTSU9OOi1FUlJPUjogVmVyc2lvbiBub3Qgc2V0fSIKK2VjaG8gIiAgS2Fma2EgdmVyc2lvbjogICAke0tBRktBX1ZFUlNJT046LUVSUk9SOiBWZXJzaW9uIG5vdCBzZXR9IgorZWNobyAiICBTcGFyayB2ZXJzaW9uOiAgICR7U1BBUktfVkVSU0lPTjotRVJST1I6IFZlcnNpb24gbm90IHNldH0iCitlY2hvICIgIFRhY2h5b24gdmVyc2lvbjogJHtUQUNIWU9OX1ZFUlNJT046LUVSUk9SOiBWZXJzaW9uIG5vdCBzZXR9IgorZWNobyAiICBIYWRvb3AgdmVyc2lvbjogICR7SEFET09QX1ZFUlNJT046LUVSUk9SOiBWZXJzaW9uIG5vdCBzZXR9IgorZWNobyAiICBDbHVzdGVyIFRvb2xzIHZlcnNpb246ICAke0NMVVNURVJfVE9PTFNfVkVSU0lPTjotRVJST1I6IFZlcnNpb24gbm90IHNldH0iCitlY2hvICIgLS0tLS0tLS0tIEVudmlyb25tZW50IFZhcmlhYmxlcyAtLS0tLS0tLS0iCitlY2hvICIgIEhvc3RzIGZpbGUgaW5zdGFsbDogICAke0hPU1RTX0ZJTEU6LUVSUk9SOiBObyBob3N0cyBmaWxlIGluc3RhbGwgbG9jYXRpb24gc2V0fSIgCitlY2hvICIgIEVudmlyb25tZW50IGluc3RhbGw6ICAke0VOVl9WQVJTOi1FUlJPUjogTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZpbGUgaW5zdGFsbCBsb2NhdGlvbiBzZXR9IiAKK2VjaG8gIiAgSGFkb29wIG5hbWVub2RlOiAgICAgICR7SEFET09QX05BTUVOT0RFOi1FUlJPUjogTm8gSGFkb29wIG5hbWVub2RlIHNldH0iIAorZWNobyAiICBIYWRvb3AgbmFtZW5vZGUgcG9ydDogJHtIQURPT1BfTkFNRU5PREVfUE9SVDotRVJST1I6IE5vIEhhZG9vcCBuYW1lbm9kZSBwb3J0IHNldH0iIAorZWNobyAiIC0tLS0tLS0tLS0tLSBTdXBwb3J0IFNvZnR3YXJlIC0tLS0tLS0tLS0tIgorZWNobyAiICBNYXZlbiBob21lOiAke00yX0hPTUU6LUVSUk9SOiBObyBtYXZlbiBob21lIHNldH0iIAorZWNobyAiICBKYXZhIGhvbWU6ICAke0pBVkFfSE9NRTotRVJST1I6IE5vIG1hdmVuIGhvbWUgc2V0fSIgCitlY2hvICIgLS0tLS0tLS0tLSBTdXBwb3J0IERpcmVjdG9yaWVzIC0tLS0tLS0tLS0iCitlY2hvICIgIFRlbXBvcmFyeSBkaXJlY3Rvcnk6ICR7VE1QX0RJUjotRVJST1I6IFRlbXAgZGlyIG5vdCBzZXR9IgorZWNobyAiICBSdW5uaW5nIGRpcmVjdG9yeTogICAke1JVTl9ESVI6LUVSUk9SOiBSdW5uaW5nIGRpciBub3Qgc2V0fSIKK2VjaG8gIiAtLS0tLS0tLS0tLSBJbnN0YWxsIERpcmVjdG9yeSAtLS0tLS0tLS0tLSIKK2VjaG8gIiAgSW5zdGFsbCBkaXJlY3Rvcnk6ICAgJHtJTlNUQUxMX0RJUjotRVJST1I6IEluc3RhbGwgZGlyIG5vdCBzZXR9IgorI0NoZWNraW5nIGluc3RhbGxlZCBzb2Z0d2FyZQoraWYgWyAteiAke00yX0hPTUV9IF0gfHwgWyAteiAke0pBVkFfSE9NRX0gXSB8fCBbICEgLWYgJHtNMl9IT01FfS9iaW4vbXZuIF0gfHwgXAorICAgWyAhIC1mICR7SkFWQV9IT01FfS9iaW4vamF2YSBdCit0aGVuCisgICAgZWNobyAiRVJST1I6IE5lZWRlZCBzb2Z0d2FyZSBub3QgZm91bmQuIgorICAgIGV4aXQgMQorZmkKKworI0NoZWNraW5nIHZlcnNpb25zCitpZiBbIC16ICR7QVBBQ0hFX01FU09TX1ZFUlNJT059IF0gfHwgWyAteiAke1NDQUxBX1ZFUlNJT059IF0gfHwgWyAteiAke0tBRktBX1ZFUlNJT059IF0gfHwgXAorICAgWyAteiAke1NQQVJLX1ZFUlNJT059IF0gfHwgWyAteiAke1RBQ0hZT05fVkVSU0lPTn0gXSB8fCBbIC16ICR7SEFET09QX1ZFUlNJT059IF0gfHwgXAorICAgWyAteiAke0NMVVNURVJfVE9PTFNfVkVSU0lPTn0gXSB8fCBbIC16ICR7SU5TVEFMTF9ESVJ9IF0gfHwgWyAteiAke1RNUF9ESVJ9IF0gfHwgXAorICAgWyAteiAke0hBRE9PUF9OQU1FTk9ERX0gXSB8fCBbIC16ICR7SEFET09QX05BTUVOT0RFX1BPUlR9IF0gfHwgWyAteiAke0VOVl9WQVJTfSBdIHx8IFsgLXogJHtIT1NUU19GSUxFfSBdCit0aGVuCisgICAgZWNobyAiRVJST1I6IE5lZWRlZCB2YXJpYWJsZXMgbm90IHNldC4gRGlkIHlvdSBzb3VyY2UgdGhlIGVudmlyb25tZW50IGZpbGVzPyIKKyAgICBleGl0IDEKK2ZpCisjQ2hlY2sgZGlyZWN0b3JpZXMgZXhpdAoraWYgWyAhIC1kICR7SU5TVEFMTF9ESVJ9IF0gfHwgWyAhIC1kICR7UlVOX0RJUn0gXSB8fCBbICEgLWQgJHtUTVBfRElSfSBdCit0aGVuCisgICAgZWNobyAiRVJST1I6IE5lZWRlZCBkaXJlY3RvcmllcyBkb24ndCBleGlzdCIKKyAgICBleGl0IDEKK2ZpCisjQ2hlY2sgc3BhY2UKK2lmIFsgLWUgJHtJTlNUQUxMX0RJUn0gXSAmJiAoKCAkKGRmIC1rICR7SU5TVEFMTF9ESVJ9IHwgYXdrICdOUj09MyB7cHJpbnQgJDN9JykgPCA1MDAwMDAwICkpCit0aGVuCisgICAgZWNobyAiRVJST1I6IE5vdCBlbm91Z2ggc3BhY2UgKDVHQikgdG8gaW5zdGFsbCBpbjogJHtJTlNUQUxMX0RJUn0uIgorICAgIGV4aXQgMSAKK2ZpCisjQ2hlY2sgc3BhY2UKK2lmICgoICQoZGYgLWsgJHtUTVBfRElSfSB8IGF3ayAnTlI9PTMge3ByaW50ICQzfScpIDwgMzAwMDAwMCApKQordGhlbgorICAgIGVjaG8gIkVSUk9SOiBOb3QgZW5vdWdoIHRtcCBzcGFjZSAoM0dCKTogJHtUTVBfRElSfS4iCisgICAgZXhpdCAxCitmaQorCit3aGlsZSB0cnVlOyBkbworICAgIHJlYWQgLXAgIkNvbnRpbnVlIGluc3RhbGxpbmcoeS9uKT8gIiB5bgorICAgIGNhc2UgJHluIGluCisgICAgICAgIFtZeV0qICkgYnJlYWs7OworICAgICAgICBbTm5dKiApIGV4aXQ7OworICAgICAgICAqICkgZWNobyAiUGxlYXNlIGFuc3dlciB5IG9yIG4uIjs7CisgICAgZXNhYworZG9uZQorCisjU3RhcnQgb2YgaW5zdGFsbGF0aW9uCitJTlNUQUxMX0xPRz1kZXBlbmRhbmN5LWluc3RhbGxhdGlvbi0kKGRhdGUgKyIlWS0lbS0lZFQlSDolTTolUyIpLmxvZworZWNobyAiSW5zdGFsbGluZyBkZXBlbmRhbmNpZXMgYXQgJChkYXRlICsiJVktJW0tJWRUJUg6JU06JVMiKSIgfCB0ZWUgJHtJTlNUQUxMX0xPR30gCisKKyNEb3dubG9hZHM6IHdnZXQgYW5kIHVudGFyIHRoZXNlIAorQVBBQ0hFX01JUlJPUj1odHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvCitfS0FGS0FfVlI9JChlY2hvICR7S0FGS0FfVkVSU0lPTn0gfCBzZWQgJ3MvXlteLV0qLS8vJykKK0RPV05MT0FEU1swXT1odHRwOi8vd3d3LnNjYWxhLWxhbmcub3JnL2ZpbGVzL2FyY2hpdmUvc2NhbGEtJHtTQ0FMQV9WRVJTSU9OfS50Z3oKK0RPV05MT0FEU1sxXT0ke0FQQUNIRV9NSVJST1J9L2hhZG9vcC9jb21tb24vaGFkb29wLSR7SEFET09QX1ZFUlNJT059L2hhZG9vcC0ke0hBRE9PUF9WRVJTSU9OfS50YXIuZ3oKK0RPV05MT0FEU1syXT0ke0FQQUNIRV9NSVJST1J9L21lc29zLyR7QVBBQ0hFX01FU09TX1ZFUlNJT059L21lc29zLSR7QVBBQ0hFX01FU09TX1ZFUlNJT059LnRhci5negorRE9XTkxPQURTWzNdPSR7QVBBQ0hFX01JUlJPUn0vc3Bhcmsvc3BhcmstJHtTUEFSS19WRVJTSU9OfS9zcGFyay0ke1NQQVJLX1ZFUlNJT059LWJpbi1oYWRvb3AyLjQudGd6CitET1dOTE9BRFNbNF09JHtBUEFDSEVfTUlSUk9SfS9rYWZrYS8ke19LQUZLQV9WUn0va2Fma2FfJHtLQUZLQV9WRVJTSU9OfS50Z3oKK0RPV05MT0FEU1s1XT1odHRwczovL2dpdGh1Yi5jb20vYW1wbGFiL3RhY2h5b24vcmVsZWFzZXMvZG93bmxvYWQvdiR7VEFDSFlPTl9WRVJTSU9OfS90YWNoeW9uLSR7VEFDSFlPTl9WRVJTSU9OfS1iaW4udGFyLmd6CisKK21rZGlyIC1wICR7VE1QX0RJUn0vZG93bmxvYWQKK21rZGlyIC1wICR7SU5TVEFMTF9ESVJ9CisjR3JhYiBhbGwgdGhlIGRvd25sb2FkcworZm9yIHVybCBpbiAiJHtET1dOTE9BRFNbQF19IgorZG8KKyAgICB0YXJiYWxsPSQoYmFzZW5hbWUgJHt1cmx9KQorICAgICNHZXQgZGlyZWN0b3J5IG5hbWUgd2l0aG91dCAudGFyLmd6IGFuZCAudGd6IAorICAgIGRpcj0ke3RhcmJhbGwlJS50YXIuZ3p9CisgICAgZGlyPSR7ZGlyJSUudGd6fQorICAgICNSZW1vdmUgLWJpbiBmb3IgVGFjaHllb24KKyAgICBkaXI9JHtkaXIlJS1iaW59CisgICAgZWNobyAiQXR0ZW1wdGluZyB0byBpbnN0YWxsOiAke2Rpcn0iIHwgdGVlIC1hICR7SU5TVEFMTF9MT0d9IAorICAgICNJZiBzb21ldGhpbmcKKyAgICBpZiBbIC1lICR7SU5TVEFMTF9ESVJ9LyR7ZGlyfSBdCisgICAgdGhlbgorICAgICAgICBlY2hvICIke2Rpcn0gaW5zdGFsbGF0aW9uIGRldGVjdGVkLiIKKyAgICBlbHNlCisgICAgICAgIHJtIC1mICR7VE1QX0RJUn0vZG93bmxvYWQvJHt0YXJiYWxsfQorICAgICAgICAjd2dldCBvciBmYWlsIGFuZCBjb250aW51ZQorICAgICAgICB3Z2V0IC1uYyAtUCAke1RNUF9ESVJ9L2Rvd25sb2FkICR7dXJsfSAmPj4gJHtJTlNUQUxMX0xPR30gXAorICAgICAgICB8fHsgXAorICAgICAgICAgICAgZWNobyAiV0FSTklORzogRmFpbGVkIHRvIHdnZXQ6ICR7dXJsfSBJbnN0YWxsIG1hbnVhbGx5LiIgfCB0ZWUgLWEgJHtJTlNUQUxMX0xPR307XAorICAgICAgICAgICAgY29udGludWU7XAorICAgICAgICAgIH0KKyAgICAgICAgI3VudGFyIG9yIGZhaWwgYW5kIGNvbnRpbnVlCisgICAgICAgIHRhciAteHpmICR7VE1QX0RJUn0vZG93bmxvYWQvJHt0YXJiYWxsfSAtQyAke1RNUF9ESVJ9L2Rvd25sb2FkIFwKKyAgICAgICAgfHx7IFwKKyAgICAgICAgICAgIGVjaG8gIldBUk5JTkc6IEZhaWxlZCB0byB1bnRhcjogJHt0YXJiYWxsfSBJbnN0YWxsIG1hbnVhbGx5LiIgfCB0ZWUgLWEgJHtJTlNUQUxMX0xPR307XAorICAgICAgICAgICAgY29udGludWU7XAorICAgICAgICAgIH0KKyAgICAgICAgI01vdmUgdG8gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvciBmYWlsIGFuZCBjb250aW51ZQorICAgICAgICBtdiAke1RNUF9ESVJ9L2Rvd25sb2FkLyR7ZGlyfSAke0lOU1RBTExfRElSfSBcCisgICAgICAgIHx8eyBcCisgICAgICAgICAgICBlY2hvICJXQVJOSU5HOiBGYWlsZWQgdG8gbW92ZTogJHtkaXJ9IHRvICR7SU5TVEFMTF9ESVJ9IEluc3RhbGwgbWFudWFsbHkuIiB8IHRlZSAtYSAke0lOU1RBTExfTE9HfTtcCisgICAgICAgICAgICBjb250aW51ZTtcCisgICAgICAgICAgfQorICAgICAgICAjTW92ZSB0byBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9yIGZhaWwgYW5kIGNvbnRpbnVlCisgICAgICAgIG12ICR7VE1QX0RJUn0vZG93bmxvYWQvJHt0YXJiYWxsfSAke0lOU1RBTExfRElSfS8ke2Rpcn0gXAorICAgICAgICB8fHsgXAorICAgICAgICAgICAgZWNobyAiV0FSTklORzogRmFpbGVkIHRvIG1vdmU6ICR7dGFyYmFsbH0gdG8gJHtJTlNUQUxMX0RJUn0gSW5zdGFsbCBtYW51YWxseS4iIHwgdGVlIC1hICR7SU5TVEFMTF9MT0d9O1wKKyAgICAgICAgICAgIGNvbnRpbnVlO1wKKyAgICAgICAgICB9CisgICAgZmkKK2RvbmUKKyNJbnN0YWxsIHNjcmlwdHMKK2lmIFsgLWUgJHtJTlNUQUxMX0RJUn0vY2x1c3Rlci10b29scy9zY3JpcHRzIF0KK3RoZW4KKyAgICBlY2hvICJDbHVzdGVyIHRvb2xzIGFscmVhZHkgaW5zdGFsbGVkIgorZWxzZQorICAgIGVjaG8gIkV4cG9ydGluZyBPT0RULWNsdXN0ZXIgdG9vbHMiIHwgdGVlIC1hICR7SU5TVEFMTF9MT0d9CisgICAgc3ZuIGV4cG9ydCBodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0LyR7Q0xVU1RFUl9UT09MU19WRVJTSU9OfS9jbHVzdGVyLXRvb2xzLyAke0lOU1RBTExfRElSfS9jbHVzdGVyLXRvb2xzLyBcCisgICAgfHx7IFwKKyAgICAgICAgIGVjaG8gIldBUk5JTkc6IEZhaWxlZCB0byBleHBvcnQgY2x1c3Rlci10b29sczogJHtDTFVTVEVSX1RPT0xTX1ZFUlNJT059IEluc3RhbGwgbWFudWFsbHkuIiB8IHRlZSAtYSAke0lOU1RBTExfTE9HfTtcCisgICAgICB9CisgICAgY3AgJHtFTlZTfSAke0VOVl9WQVJTfSAKKyAgICBjcCAke0hPU1RTfSAke0hPU1RTX0ZJTEV9CitmaQorZWNobyAiQnVpbGRpbmcgbWVzc29zLiBUaGlzIG1heSB0YWtlIGF3aGlsZSIgfCB0ZWUgLWEgJHtJTlNUQUxMX0xPR30KKyNNZXNvcyBwb3N0IHByb2Nlc3NpbmcKK2lmIFsgLWUgJHtJTlNUQUxMX0RJUn0vbWVzb3MtJHtBUEFDSEVfTUVTT1NfVkVSU0lPTn0vYnVpbGQgXQordGhlbgorICAgIGVjaG8gIk1lc29zIGFscmVhZHkgYnVpbHQgYXQ6ICR7SU5TVEFMTF9ESVJ9L21lc29zLSR7QVBBQ0hFX01FU09TX1ZFUlNJT059L2J1aWxkIgorZWxzZQorICAgIF9NRVNPU19CVUlMRD0ke0lOU1RBTExfRElSfS9tZXNvcy0ke0FQQUNIRV9NRVNPU19WRVJTSU9OfS9idWlsZAorICAgIG1rZGlyICR7X01FU09TX0JVSUxEfQorICAgIGNkICR7X01FU09TX0JVSUxEfQorICAgIC4uL2NvbmZpZ3VyZSAmPj4gJHtJTlNUQUxMX0xPR30KKyAgICBtYWtlICY+PiAke0lOU1RBTExfTE9HfSAKK2ZpCisKKyNIYWRvb3AgbmFtZW5vZGUgYW5kIGNvbmZpZ3VyYXRpb24KK2VjaG8gIlJlcGxhY2luZyBob3N0IGFuZCBwb3J0IGluZm9ybWF0aW9uIGluIEhhZG9vcCBJbmZvcm1hdGlvbiIgfCB0ZWUgLWEgJHtJTlNUQUxMX0xPR30KK3NlZCAtaSAtZSAicy9bSU5TVEFMTF9ESVJdLyR7SU5TVEFMTF9ESVJ9L2ciICR7SU5TVEFMTF9ESVJ9L2NsdXN0ZXItdG9vbHMvc2V0dXAvaGRmcy1jb25maWcvKi54bWwKK3NlZCAtaSAtZSAicy9bSERGU19IT1NUXS8ke0hBRE9PUF9OQU1FTk9ERX0vZyIgJHtJTlNUQUxMX0RJUn0vY2x1c3Rlci10b29scy9zZXR1cC9oZGZzLWNvbmZpZy8qLnhtbAorc2VkIC1pIC1lICJzL1tIREZTX1BPUlRdLyR7SEFET09QX05BTUVOT0RFX1BPUlR9L2ciICR7SU5TVEFMTF9ESVJ9L2NsdXN0ZXItdG9vbHMvc2V0dXAvaGRmcy1jb25maWcvKi54bWwKK3RhaWwgLW4gKzIgJHtIT1NUU30gPiAke0lOU1RBTExfRElSfS9jbHVzdGVyLXRvb2xzL3NldHVwL2hkZnMtY29uZmlnL3NsYXZlcworZWNobyAiTW92aW5nICR7SU5TVEFMTF9ESVJ9L2NsdXN0ZXItdG9vbHMvc2V0dXAvaGRmcy1jb25maWcvIHRvICR7SEFET09QX0hPTUV9L2V0Yy9oYWRvb3AvIiB8IHRlZSAtYSAke0lOU1RBTExfTE9HfQorbXYgLS1iYWNrdXA9bnVtYmVyZWQgLS1zdWZmaXg9LmJhayAke0lOU1RBTExfRElSfS9jbHVzdGVyLXRvb2xzL3NldHVwL2hkZnMtY29uZmlnLyogJHtIQURPT1BfSE9NRX0vZXRjL2hhZG9vcAorZWNobyAiRm9ybWF0aW5nIEhERlMgbmFtZW5vZGUiIHwgdGVlIC1hICR7SU5TVEFMTF9MT0d9Ciske0hBRE9PUF9IT01FfS9iaW4vaGRmcyBuYW1lbm9kZSAtZm9ybWF0CisKK2VjaG8gIkFsbCBkb25lIGF0ICQoZGF0ZSArIiVZLSVtLSVkVCVIOiVNOiVTIikiIHwgdGVlIC1hICR7SU5TVEFMTF9MT0d9CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9wb20ueG1sIGIvMC4xMC9zdHJlYW1pbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM4MjgyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcG9tLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtc3RyZWFtaW5nPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPkFwYWNoZSBPT0RUIFN0cmVhbWluZzwvbmFtZT4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgQXBhY2hlIE9PRFQgU3RyZWFtaW5nIGNvbXBvbmVudHMKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHNjbT4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC45LVNOQVBTSE9UL3N0cmVhbWluZzwvY29ubmVjdGlvbj4KKyAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC45LVNOQVBTSE9UL3N0cmVhbWluZzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjktU05BUFNIT1Qvc3RyZWFtaW5nPC91cmw+CisgICAgPC9zY20+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5yZXNvdXJjZTwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3BvbS54bWwgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZmI2YjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9wb20ueG1sCkBAIC0wLDAgKzEsMTYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtc3RyZWFtaW5nPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjAuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxhcnRpZmFjdElkPmNhcy1zdHJlYW1pbmctcmVzb3VyY2U8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkNhdGFsb2cgYW5kIEFyY2hpdmUgUmVzb3VyY2UgTWFuYWdlbWVudCBDb21wb25lbnQgU3RyZWFtaW5nIHBhY2thZ2U8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UaGlzIHByb2plY3Qgc3VwcGxpZXMgdGhlIG5lZWRlZCBhZGRpdGlvbnMgdG8gYWxsb3cgdGhlIHJlc291cmNlIG1hbmFnZXIgdG8gaGFuZGxlIHN0cmVhbWluZyBkYXRhLjwvZGVzY3JpcHRpb24+CisgIDxzY20+CisgICAJPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC45LVNOQVBTSE9UL3N0cmVhbWluZy9yZXNvdXJjZTwvY29ubmVjdGlvbj4KKyAgIAk8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjktU05BUFNIT1Qvc3RyZWFtaW5nL3Jlc291cmNlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgCTx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9vb2R0L3RhZ3MvMC45LVNOQVBTSE9UL3N0cmVhbWluZy9yZXNvdXJjZTwvdXJsPgorICA8L3NjbT4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KKyAgICAgICAgICA8dXNlU3lzdGVtQ2xhc3NMb2FkZXI+ZmFsc2U8L3VzZVN5c3RlbUNsYXNzTG9hZGVyPgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDxuYW1lPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPC9uYW1lPgorICAgICAgICAgICAgICAgPHZhbHVlPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzPC92YWx1ZT4KKyAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICA8Zm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+MDwvZm9ya2VkUHJvY2Vzc1RpbWVvdXRJblNlY29uZHM+CisgICAgICAgICAgIDxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdCouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5uZXQuYWxjaGltMzEubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPGlkPmNvbXBpbGU8L2lkPgorICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgIDxpZD50ZXN0LWNvbXBpbGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdENvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXJlc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1yZXNvdXJjZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xMC4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3Bhcms8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcGFyay1jb3JlXzIuMTA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNwYXJrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3Bhcmstc3RyZWFtaW5nXzIuMTA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhhZG9vcC1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjQuMDwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXkuY29udHJpYnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWd1aWNlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjE0PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjE0PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMTQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMTQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXkuY29udHJpYnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3VpY2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjE0PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWVzb3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tZXNvczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjAuMjEuMDwvdmVyc2lvbj4KKyAgICAgIDxjbGFzc2lmaWVyPnNoYWRlZC1wcm90b2J1ZjwvY2xhc3NpZmllcj4KKyAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvTWVzb3NCYXRjaE1hbmFnZXIuamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9iYXRjaG1nci9NZXNvc0JhdGNoTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjdmMzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvTWVzb3NCYXRjaE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlRhc2tJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlNjaGVkdWxlckRyaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnJlcG8uSm9iUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5NZXNvc0ZyYW1ld29ya0V4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogQSBiYXRjaC1tYW5hZ2VyIHVzZWQgdG8gZXhlY3V0ZSBhbmQgY29udHJvbCBqb2JzIGluIGEgbWVzb3MtY2x1c3Rlci4KKyAqLworcHVibGljIGNsYXNzIE1lc29zQmF0Y2hNYW5hZ2VyIGltcGxlbWVudHMgQmF0Y2htZ3IgeworCisgICAgTWFwPFN0cmluZyxUYXNrSUQ+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxUYXNrSUQ+KCk7CisgICAgU2NoZWR1bGVyRHJpdmVyIGRyaXZlcjsKKyAgICBKb2JSZXBvc2l0b3J5IHJlcG87CisgICAgTW9uaXRvciBtb247CisKKyAgICBwdWJsaWMgTWVzb3NCYXRjaE1hbmFnZXIoKSB7CisgICAgfQorICAgIC8qKgorICAgICAqIFJlcXVpcmVkIHRvIHNldCB0aGUgZHJpdmVyIHVzZWQgdG8gcnVuIHRoZSBqb2IsIHNvICJraWxsIgorICAgICAqIHJlcXVlc3RzIGFyZSBtYXBwZWQgcHJvcGVybHkuCisgICAgICogQHBhcmFtIGRyaXZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlcihTY2hlZHVsZXJEcml2ZXIgZHJpdmVyKQorICAgIHsKKyAgICAgICAgdGhpcy5kcml2ZXIgPSBkcml2ZXI7CisgICAgfQorICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbmV3IGpvYiB3aXRoIGEgYmF0Y2ggbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gam9iSWQgLSBqb2JJZCBpbiAicmVzb3VyY2UiIG1hbmFnZXIuCisgICAgICogQHBhcmFtIHRhc2sgLSBtZXNvcyB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRXhlY3V0ZWRKb2IoU3RyaW5nIGpvYklkLFRhc2tJRCB0YXNrKSB7CisgICAgICAgIG1hcC5wdXQoam9iSWQsIHRhc2spOworICAgIH07CisKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3IjZXhlY3V0ZVJlbW90ZWx5KG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjLCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVSZW1vdGVseShKb2JTcGVjIGpvYiwgUmVzb3VyY2VOb2RlIHJlc05vZGUpCisgICAgICAgICAgICB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJFeGVjdXRlIHJlbW90ZWx5IGlzIG5vdCBjYWxsZWQgd2hlbiB1c2luZyBtZXNvcy4iKTsKKyAgICB9CisKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3Ijc2V0TW9uaXRvcihvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvcikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yKE1vbml0b3IgbW9uaXRvcikgeworICAgICAgICB0aGlzLm1vbiA9IG1vbml0b3I7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1nciNzZXRKb2JSZXBvc2l0b3J5KG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icmVwby5Kb2JSZXBvc2l0b3J5KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEpvYlJlcG9zaXRvcnkoSm9iUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7CisgICAgICAgIHRoaXMucmVwbyA9IHJlcG9zaXRvcnk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1nciNraWxsSm9iKGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4ga2lsbEpvYihTdHJpbmcgam9iSWQsIFJlc291cmNlTm9kZSBub2RlKSB7CisgICAgICAgIFRhc2tJRCBpZCA9IChUYXNrSUQpbWFwLmdldChqb2JJZCk7CisgICAgICAgIGRyaXZlci5raWxsVGFzayhpZCk7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBkcml2ZXIua2lsbFRhc2soaWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1cy5EUklWRVJfUlVOTklORykKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXNvc0ZyYW1ld29ya0V4Y2VwdGlvbigiTWVzb3MgU2NoZWR1bGUgRHJpdmVyIGlzIGRlYWQ6ICIrc3RhdHVzLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyI2dldEV4ZWN1dGlvbk5vZGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGlvbk5vZGUoU3RyaW5nIGpvYklkKSB7CisgICAgICAgIC8vIFRPRE8gTWFrZSB0aGlzIG1vcmUgbWVhbmluZ2Z1bC4KKyAgICAgICAgcmV0dXJuICJBbGwgWW91ciBKb2JzIGFyZSBiZWxvbmcgdG8gTWVzb3MiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL01lc29zQmF0Y2hNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL01lc29zQmF0Y2hNYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWIyMjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvTWVzb3NCYXRjaE1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyOworCisKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIGJhdGNobWdyIGZhY3RvcnkuCisgKiA8L3A+CisgKgorICovCisKK3B1YmxpYyBjbGFzcyBNZXNvc0JhdGNoTWFuYWdlckZhY3RvcnkgaW1wbGVtZW50cyBCYXRjaG1nckZhY3RvcnkgeworCisgICAgcHVibGljIE1lc29zQmF0Y2hNYW5hZ2VyRmFjdG9yeSgpeworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmJhdGNobWdyLkJhdGNobWdyRmFjdG9yeSNjcmVhdGVCYXRjaG1ncigpCisgICAgICovCisgICAgcHVibGljIEJhdGNobWdyIGNyZWF0ZUJhdGNobWdyKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lc29zQmF0Y2hNYW5hZ2VyKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvYmF0Y2htZ3IvUmVzb3VyY2VFeGVjdXRvci5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL1Jlc291cmNlRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU5ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2JhdGNobWdyL1Jlc291cmNlRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3I7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLkV4ZWN1dG9yRHJpdmVyOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuTWVzb3NFeGVjdXRvckRyaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5FeGVjdXRvckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRnJhbWV3b3JrSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5TbGF2ZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlRhc2tJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5UYXNrSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5UYXNrU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuVGFza1N0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5leGNlcHRpb25zLkpvYklucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuTWVzb3NVdGlsaXRpZXM7CisKKy8qKgorICogQGF1dGhvciBzdGFyY2htZAorICoKKyAqIFRoaXMgIkV4ZWN1dG9yIiBpcyBydW4gYnkgbWVzb3MgdG8gYWN0dWFsbHkgcnVuIHRoZSBqb2IuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUV4ZWN1dG9yIGltcGxlbWVudHMgRXhlY3V0b3IgeworCisgICAgUHJpbnRTdHJlYW0gc3RyID0gbnVsbDsKKyAgICBTdHJpbmcgaWQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MiKS5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpKyIgIjsKKyAgICBwdWJsaWMgUmVzb3VyY2VFeGVjdXRvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgdG1wID0gbmV3IEZpbGUoIi4vZXhlY3V0b3ItbG9nLm5vdGFsb2ciKTsKKyAgICAgICAgICAgIC8vdG1wLmRlbGV0ZSgpOyAvL1dpdGggTklPIHRoZW4gc29tZXRoaW5nIG11c3QgYmUgY2F1Z2h0CisgICAgICAgICAgICBzdHIgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKSk7CisgICAgICAgICAgICBzdHIucHJpbnRsbihpZCsiU3RhcnRpbmcgdXAgbmV3PDw8PDwiKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvciNkaXNjb25uZWN0ZWQob3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvckRyaXZlcikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0ZWQoRXhlY3V0b3JEcml2ZXIgZHJpdmVyKSB7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJEaXNjb25uZWN0ZWQhIik7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvciNlcnJvcihvcmcuYXBhY2hlLm1lc29zLkV4ZWN1dG9yRHJpdmVyLCBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVycm9yKEV4ZWN1dG9yRHJpdmVyIGRyaXZlciwgU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJFcnJvcjogIitlcnJvcik7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvciNmcmFtZXdvcmtNZXNzYWdlKG9yZy5hcGFjaGUubWVzb3MuRXhlY3V0b3JEcml2ZXIsIGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmcmFtZXdvcmtNZXNzYWdlKEV4ZWN1dG9yRHJpdmVyIGFyZzAsIGJ5dGVbXSBhcmcxKSB7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJNZXNzYWdlOiAiK25ldyBTdHJpbmcoYXJnMSkpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUubWVzb3MuRXhlY3V0b3Ija2lsbFRhc2sob3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvckRyaXZlciwgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuVGFza0lEKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGtpbGxUYXNrKEV4ZWN1dG9yRHJpdmVyIGFyZzAsIFRhc2tJRCBhcmcxKSB7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJLaWxsIik7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvciNsYXVuY2hUYXNrKG9yZy5hcGFjaGUubWVzb3MuRXhlY3V0b3JEcml2ZXIsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlRhc2tJbmZvKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGxhdW5jaFRhc2soZmluYWwgRXhlY3V0b3JEcml2ZXIgZHJpdmVyLCBmaW5hbCBUYXNrSW5mbyBpbmZvKSB7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJMYXVuY2ggdGFzayEiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpvYlNwZWMgc3BlYyA9IE1lc29zVXRpbGl0aWVzLmJ5dGVTdHJpbmdUb0pvYlNwZWMoaW5mby5nZXREYXRhKCkpOworICAgICAgICAgICAgZmluYWwgSm9iSW5zdGFuY2UgZXhlYyA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRKb2JJbnN0YW5jZUZyb21DbGFzc05hbWUoc3BlYy5nZXRKb2IoKS5nZXRKb2JJbnN0YW5jZUNsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIEpvYklucHV0IGluID0gc3BlYy5nZXRJbigpOworICAgICAgICAgICAgVGhyZWFkIHRtcCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCl7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tTdGF0dXMgc3RhdHVzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy5leGVjdXRlKGluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBUYXNrU3RhdHVzLm5ld0J1aWxkZXIoKS5zZXRUYXNrSWQoaW5mby5nZXRUYXNrSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0ZShUYXNrU3RhdGUuVEFTS19GSU5JU0hFRCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpvYklucHV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFRhc2tTdGF0dXMubmV3QnVpbGRlcigpLnNldFRhc2tJZChpbmZvLmdldFRhc2tJZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRlKFRhc2tTdGF0ZS5UQVNLX0ZBSUxFRCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci5zZW5kU3RhdHVzVXBkYXRlKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZHJpdmVyLnNlbmRTdGF0dXNVcGRhdGUoVGFza1N0YXR1cy5uZXdCdWlsZGVyKCkuc2V0VGFza0lkKGluZm8uZ2V0VGFza0lkKCkpCisgICAgICAgICAgICAgICAgICAuc2V0U3RhdGUoVGFza1N0YXRlLlRBU0tfU1RBUlRJTkcpLmJ1aWxkKCkpOworICAgICAgICAgICAgdG1wLnN0YXJ0KCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQkFEIERBVEE6ICIpOworICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBkcml2ZXIuc2VuZFN0YXR1c1VwZGF0ZShUYXNrU3RhdHVzLm5ld0J1aWxkZXIoKS5zZXRUYXNrSWQoaW5mby5nZXRUYXNrSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRlKFRhc2tTdGF0ZS5UQVNLX0ZBSUxFRCkuYnVpbGQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQkFEIERBVEE6ICIpOworICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBkcml2ZXIuc2VuZFN0YXR1c1VwZGF0ZShUYXNrU3RhdHVzLm5ld0J1aWxkZXIoKS5zZXRUYXNrSWQoaW5mby5nZXRUYXNrSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRlKFRhc2tTdGF0ZS5UQVNLX0ZBSUxFRCkuYnVpbGQoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTMpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQkFEIERBVEE6ICIpOworICAgICAgICAgICAgZTMucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBkcml2ZXIuc2VuZFN0YXR1c1VwZGF0ZShUYXNrU3RhdHVzLm5ld0J1aWxkZXIoKS5zZXRUYXNrSWQoaW5mby5nZXRUYXNrSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRlKFRhc2tTdGF0ZS5UQVNLX0ZBSUxFRCkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm1lc29zLkV4ZWN1dG9yI3JlZ2lzdGVyZWQob3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvckRyaXZlciwgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRXhlY3V0b3JJbmZvLCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5GcmFtZXdvcmtJbmZvLCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5TbGF2ZUluZm8pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJlZChFeGVjdXRvckRyaXZlciBhcmcwLCBFeGVjdXRvckluZm8gYXJnMSwKKyAgICAgICAgICAgIEZyYW1ld29ya0luZm8gYXJnMiwgU2xhdmVJbmZvIGFyZzMpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEby1XYWgtRG8tV2FoIik7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJSZWdpc3RlcmVkLCBIdXp6YWghIik7CisKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm1lc29zLkV4ZWN1dG9yI3JlcmVnaXN0ZXJlZChvcmcuYXBhY2hlLm1lc29zLkV4ZWN1dG9yRHJpdmVyLCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5TbGF2ZUluZm8pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVyZWdpc3RlcmVkKEV4ZWN1dG9yRHJpdmVyIGFyZzAsIFNsYXZlSW5mbyBhcmcxKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG8tV2FoLURvLVdhaCBHTyBHTyBHTyEhISEiKTsKKyAgICAgICAgc3RyLnByaW50bG4oaWQrIlJlLXJlZ2dlZCIpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUubWVzb3MuRXhlY3V0b3Ijc2h1dGRvd24ob3JnLmFwYWNoZS5tZXNvcy5FeGVjdXRvckRyaXZlcikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bihFeGVjdXRvckRyaXZlciBhcmcwKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG93biBkb3duIGRvd24uIik7CisgICAgICAgIHN0ci5wcmludGxuKGlkKyJTaHV0ZG93biIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNvc0V4ZWN1dG9yRHJpdmVyIGRyaXZlciA9IG5ldyBNZXNvc0V4ZWN1dG9yRHJpdmVyKG5ldyBSZXNvdXJjZUV4ZWN1dG9yKCkpOworICAgICAgICBTeXN0ZW0uZXhpdChkcml2ZXIucnVuKCkgPT0gU3RhdHVzLkRSSVZFUl9TVE9QUEVEID8gMCA6IDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9Ob1NwYXJrRmlsZVBhbGluZHJvbWVFeGFtcGxlLmphdmEgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvTm9TcGFya0ZpbGVQYWxpbmRyb21lRXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTEwZmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvTm9TcGFya0ZpbGVQYWxpbmRyb21lRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5leGFtcGxlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tZXRhZGF0YS5Kb2JNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5OYW1lVmFsdWVKb2JJbnB1dDsKKworLyoqCisgKgorICogQGF1dGhvciBzdGFyY2htZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBqb2IgdGhhdCBzZWFyY2hlcyB0aGUgc3VwcGxpZWQgZmlsZSBmb3IgcGFsaW5kcm9tZXMuICBPdXRwdXRzIHRpbWluZyBpbmZvcm1hdGlvbgorICogdG8gYW5vdGhlciBmaWxlIGZvciBiZW5jaG1hcmtpbmcgcHVycG9zZXMuIFJlZmVyZW5jZXMgc3RhbmRhcmQgcGFsaW5kcm9tIGNhbGN1bGF0aW9uLgorICoKKyAqIFVzZXMgbm9uLXNwYXJrIHByb2Nlc3NpbmcgZm9yIHRoZSBjb21wdXRhdGlvbnMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBOb1NwYXJrRmlsZVBhbGluZHJvbWVFeGFtcGxlIGltcGxlbWVudHMgSm9iSW5zdGFuY2UsIEpvYk1ldGFkYXRhIHsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5zdGFuY2UjZXhlY3V0ZShvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShKb2JJbnB1dCBpbikgeworICAgICAgICBOYW1lVmFsdWVKb2JJbnB1dCBpbnB1dCA9IChOYW1lVmFsdWVKb2JJbnB1dCkgaW47CisgICAgICAgIFByaW50U3RyZWFtIG91dHB1dCA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vU2V0dXAgb3V0cHV0IGFuZCB0aW1pbmcKKyAgICAgICAgICAgIG91dHB1dCA9IFBhbGluZHJvbWVVdGlscy5nZXRQcmludFN0cmVhbShpbnB1dC5nZXRWYWx1ZSgib3V0cHV0IikpOworICAgICAgICAgICAgbG9uZyBjb3VudCA9IDA7CisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAvL1JlYWQgZmlsZSBhbmQgcHJvY2VzcworICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBpbnB1dC5nZXRWYWx1ZSgiZmlsZSIpOworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOworICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKFBhbGluZHJvbWVVdGlscy5pc1BhbGluZHJvbWUobGluZSkpCisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL091dHB1dCB0aW1pbmcgYW5kIHJlc3VsdHMKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBkb3VibGUgdGltaW5nID0gKChkb3VibGUpKGVuZCAtIHN0YXJ0KSkvMTAwMC4wOworICAgICAgICAgICAgb3V0cHV0LnByaW50bG4oIkZvdW5kICIrIGNvdW50KyIgcGFsaW5kcm9tZXMgaW4gIit0aW1pbmcrIiBzZWNvbmRzLiIpOworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBici5jbG9zZSgpOworICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvUGFsaW5kcm9tZVV0aWxzLmphdmEgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvUGFsaW5kcm9tZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3Y2Y5NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9QYWxpbmRyb21lVXRpbHMuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5leGFtcGxlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5mdW5jdGlvbi5GdW5jdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKgorICogVGVzdHMgaWYgYSBsaW5lIGlzIGEgcGFsaW5kcm9tZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYWxpbmRyb21lVXRpbHMgeworICAgIC8qKgorICAgICAqIFN1cGVyIHNpbXBsZSBwYWxpbmRyb21lIHRlc3QuCisgICAgICogQHBhcmFtIGxpbmUgLSBsaW5lIHRvIHRlc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgYSBwYWxpbmRyb21lLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFsaW5kcm9tZShTdHJpbmcgbGluZSkgeworICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlQWxsKCJcXHMiLCIiKS50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gbGluZS5lcXVhbHMobmV3IFN0cmluZ0J1aWxkZXIobGluZSkucmV2ZXJzZSgpLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgYSBQcmludFN0cmVhbSBmb3IgcHJpbnRpbmcgdG8gZ2l2ZSBmaWxlCisgICAgICogQHBhcmFtIGZpbGUgLSBmaWxlIHRvIG9wZW4gYXMgUHJpbnRTdHJlYW0KKyAgICAgKiBAcmV0dXJuIHN0cmVhbSBmb3IgZmlsZSB0byBwcmludCB0by4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpbnRTdHJlYW0gZ2V0UHJpbnRTdHJlYW0oU3RyaW5nIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlKGZpbGUpKTsKKyAgICB9CisgICAgLyoqCisgICAgICogRnVuY3RvciBjbGFzcyBmb3Igc3BhcmsuICBSZWFsbHkgc2hvdWxkIGRvIHRoaXMgaW4gU2NhbGEuLi4uCisgICAgICogTm90ZTogc2VyaWFsIGlkIGlzIGRpc2FibGVkIGJlY2F1c2UgdGhpcyBjbGFzcyBoYXMgbm8gaW5zdGFuY2UgdmFyaWFibGVzLgorICAgICAqIEBhdXRob3Igc3RhcmNobWQKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgY2xhc3MgRmlsdGVyUGFsaW5kcm9tZSBpbXBsZW1lbnRzIEZ1bmN0aW9uPFN0cmluZywgQm9vbGVhbj4geworICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYWxsKFN0cmluZyBzKSB7IHJldHVybiBpc1BhbGluZHJvbWUocyk7IH0KKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9TcGFya0ZpbGVQYWxpbmRyb21lRXhhbXBsZS5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL1NwYXJrRmlsZVBhbGluZHJvbWVFeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZGNiNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9TcGFya0ZpbGVQYWxpbmRyb21lRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5OYW1lVmFsdWVKb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuU3BhcmtJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLlNwYXJrQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLmFwaS5qYXZhLkphdmFSREQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OworCisvKioKKyAqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBBIGpvYiB0aGF0IHNlYXJjaGVzIHRoZSBzdXBwbGllZCBmaWxlIGZvciBwYWxpbmRyb21lcy4gIE91dHB1dHMgdGltaW5nIGluZm9ybWF0aW9uCisgKiB0byBhbm90aGVyIGZpbGUgZm9yIGJlbmNobWFya2luZyBwdXJwb3Nlcy4gUmVmZXJlbmNlcyBzdGFuZGFyZCBwYWxpbmRyb20gY2FsY3VsYXRpb24uCisgKgorICogVXNlcyBzcGFyayBwcm9jZXNzaW5nIGZvciB0aGUgY29tcHV0YXRpb25zLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgU3BhcmtGaWxlUGFsaW5kcm9tZUV4YW1wbGUgaW1wbGVtZW50cyBTcGFya0luc3RhbmNlIHsKKworICAgIEphdmFTcGFya0NvbnRleHQgc2M7CisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnN0YW5jZSNleGVjdXRlKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKEpvYklucHV0IGluKSB0aHJvd3MgSm9iSW5wdXRFeGNlcHRpb24geworICAgICAgICBOYW1lVmFsdWVKb2JJbnB1dCBpbnB1dCA9IChOYW1lVmFsdWVKb2JJbnB1dCkgaW47CisgICAgICAgIFByaW50U3RyZWFtIG91dHB1dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL1NldHVwIG91dHB1dCBhbmQgdGltaW5nCisgICAgICAgICAgICBvdXRwdXQgPSBQYWxpbmRyb21lVXRpbHMuZ2V0UHJpbnRTdHJlYW0oaW5wdXQuZ2V0VmFsdWUoIm91dHB1dCIpKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIC8vUmVhZCBmaWxlIGFuZCBwcm9jZXNzCisgICAgICAgICAgICBKYXZhUkREPFN0cmluZz4gcmRkID0gc2MudGV4dEZpbGUoIGlucHV0LmdldFZhbHVlKCJmaWxlIikpOworICAgICAgICAgICAgSmF2YVJERDxTdHJpbmc+IGZpbHRlcmVkID0gcmRkLmZpbHRlcihuZXcgUGFsaW5kcm9tZVV0aWxzLkZpbHRlclBhbGluZHJvbWUoKSk7CisgICAgICAgICAgICBsb25nIGNvdW50ID0gZmlsdGVyZWQuY291bnQoKTsKKyAgICAgICAgICAgIC8vT3V0cHV0IHRpbWluZyBhbmQgcmVzdWx0cworICAgICAgICAgICAgZmluYWwgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGRvdWJsZSB0aW1pbmcgPSAoKGRvdWJsZSkoZW5kIC0gc3RhcnQpKS8xMDAwLjA7CisgICAgICAgICAgICBvdXRwdXQucHJpbnRsbigiRm91bmQgIisgY291bnQrIiBwYWxpbmRyb21lcyBpbiAiK3RpbWluZysiIHNlY29uZHMuIik7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTcGFya0NvbnRleHQoU3BhcmtDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5zYyA9IG5ldyBKYXZhU3BhcmtDb250ZXh0KGNvbnRleHQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL1N0cmVhbWluZ1BhbGluZHJvbWVFeGFtcGxlLmphdmEgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvZXhhbXBsZXMvU3RyZWFtaW5nUGFsaW5kcm9tZUV4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA5Njk3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL1N0cmVhbWluZ1BhbGluZHJvbWVFeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzOworCisvL0pESyBpbXBvcnRzCisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLk5hbWVWYWx1ZUpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5TdHJlYW1pbmdJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLlNwYXJrQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLmFwaS5qYXZhLkphdmFSREQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5zdHJlYW1pbmcuU3RyZWFtaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnN0cmVhbWluZy5hcGkuamF2YS5KYXZhRFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnN0cmVhbWluZy5hcGkuamF2YS5KYXZhUmVjZWl2ZXJJbnB1dERTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5zdHJlYW1pbmcuYXBpLmphdmEuSmF2YVN0cmVhbWluZ0NvbnRleHQ7CisKKy8qKgorICoKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD4KKyAqIEEgam9iIHRoYXQgc2VhcmNoZXMgdGhlIHN1cHBsaWVkIGZpbGUgZm9yIHBhbGluZHJvbWVzLiAgT3V0cHV0cyB0aW1pbmcgaW5mb3JtYXRpb24KKyAqIHRvIGFub3RoZXIgZmlsZSBmb3IgYmVuY2htYXJraW5nIHB1cnBvc2VzLiBSZWZlcmVuY2VzIHN0YW5kYXJkIHBhbGluZHJvbSBjYWxjdWxhdGlvbi4KKyAqCisgKiBVc2VzIHNwYXJrIHByb2Nlc3NpbmcgZm9yIHRoZSBjb21wdXRhdGlvbnMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBTdHJlYW1pbmdQYWxpbmRyb21lRXhhbXBsZSBpbXBsZW1lbnRzIFN0cmVhbWluZ0luc3RhbmNlIHsKKworICAgIEphdmFTcGFya0NvbnRleHQgc2M7CisgICAgSmF2YVN0cmVhbWluZ0NvbnRleHQgc3NjOworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5zdGFuY2UjZXhlY3V0ZShvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQpCisgICAgICovCisgICAgLy9XaWxsIG5vdCBzZXJpYWxpemUgYSBjbGFzcyB0aGF0IGhhcyBubyBtZW1iZXJzCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShKb2JJbnB1dCBpbikgdGhyb3dzIEpvYklucHV0RXhjZXB0aW9uIHsKKyAgICAgICAgTmFtZVZhbHVlSm9iSW5wdXQgaW5wdXQgPSAoTmFtZVZhbHVlSm9iSW5wdXQpIGluOworICAgICAgICAvL0dldCB0aW1lIGZvciB3YXRjaGRvZworICAgICAgICBmaW5hbCBpbnQgdGltZSA9IEludGVnZXIucGFyc2VJbnQoaW5wdXQuZ2V0VmFsdWUoInRpbWUiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL091dHB1dCB0byBwdXQgZGF0YSBpbnRvCisgICAgICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBvdXRwdXQgPSBQYWxpbmRyb21lVXRpbHMuZ2V0UHJpbnRTdHJlYW0oaW5wdXQuZ2V0VmFsdWUoIm91dHB1dCIpKTsKKyAgICAgICAgICAgIC8vRmlsdGVyIHN0cmVhbSBhbmQgY291bnQKKyAgICAgICAgICAgIEphdmFSZWNlaXZlcklucHV0RFN0cmVhbTxTdHJpbmc+IHN0cmVhbSA9IHNzYy5zb2NrZXRUZXh0U3RyZWFtKGlucHV0LmdldFZhbHVlKCJob3N0IiksSW50ZWdlci5wYXJzZUludChpbnB1dC5nZXRWYWx1ZSgicG9ydCIpKSk7CisgICAgICAgICAgICBKYXZhRFN0cmVhbTxTdHJpbmc+IGZpbHRlcmVkID0gc3RyZWFtLmZpbHRlcihuZXcgUGFsaW5kcm9tZVV0aWxzLkZpbHRlclBhbGluZHJvbWUoKSk7CisgICAgICAgICAgICBmaW5hbCBKYXZhRFN0cmVhbTxMb25nPiBjb3VudCA9IGZpbHRlcmVkLmNvdW50KCk7CisgICAgICAgICAgICAvL0ZvciBlYWNoIHBhY2tldC1pemVkIGNvdW50OiBvdXRwdXQKKyAgICAgICAgICAgIGNvdW50LmZvcmVhY2hSREQobmV3IEZ1bmN0aW9uPEphdmFSREQ8TG9uZz4sVm9pZD4oKXsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKEphdmFSREQ8TG9uZz4ganJkZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvbmdbXSBjb2xsZWN0ZWQgPSAoTG9uZ1tdKWpyZGQucmRkKCkuY29sbGVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChMb25nIGl0ZW0gOiBjb2xsZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHJpbnRsbigiRm91bmQgIitpdGVtLmxvbmdWYWx1ZSgpKyAiIHBhbGluZHJvbWVzLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgICAgIHNzYy5zdGFydCgpOworICAgICAgICAgICAgLy9TdG9wIGluIDx0aW1lPiBzZWNvbmRzCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAodGltZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRG9uJ3QgY2FzdCB0aGlzIGV4Y2VwdGlvbiBpbnRvIHRoZSB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3NjLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCJTdG9wcGluZyBhZnRlciAiK3RpbWUvMTAwMCsiIHNlY29uZHMuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICAgICAgLy9XYWl0IGZvciBzdHJlYW1pbmcgdG8gdGVybWluYXRlCisgICAgICAgICAgICBzc2MuYXdhaXRUZXJtaW5hdGlvbigpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW1pbmdDb250ZXh0KFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzLnNzYyA9IG5ldyBKYXZhU3RyZWFtaW5nQ29udGV4dChjb250ZXh0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3BhcmtDb250ZXh0KFNwYXJrQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMuc2MgPSBuZXcgSmF2YVNwYXJrQ29udGV4dChjb250ZXh0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL01lc29zTW9uaXRvci5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvTWVzb3NNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4YjM3NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL01lc29zTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Nb25pdG9yRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiBBIG1vbml0b3IgdG8gbW9uaXRvciB0aGUgbWVzb3MtY2x1c3RlciBqb2JzLgorICovCitwdWJsaWMgY2xhc3MgTWVzb3NNb25pdG9yIGltcGxlbWVudHMgTW9uaXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VOb2RlPiBub2Rlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VOb2RlPigpOworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI2dldExvYWQob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldExvYWQoUmVzb3VyY2VOb2RlIG5vZGUpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNnZXROb2RlcygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2VOb2RlPiBnZXROb2RlcygpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRMaXN0PFJlc291cmNlTm9kZT4obm9kZXNNYXAudmFsdWVzKCkpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI2dldE5vZGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTm9kZSBnZXROb2RlQnlJZChTdHJpbmcgbm9kZUlkKSB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBub2Rlc01hcC5nZXQobm9kZUlkKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNnZXROb2RlQnlVUkwoamF2YS5uZXQuVVJMKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZU5vZGUgZ2V0Tm9kZUJ5VVJMKFVSTCBpcEFkZHIpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChSZXNvdXJjZU5vZGUgbm9kZSA6IG5vZGVzTWFwLnZhbHVlcygpKQorICAgICAgICAgICAgaWYgKG5vZGUuZ2V0SXBBZGRyKCkuZXF1YWxzKGlwQWRkcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI3JlZHVjZUxvYWQob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlJlc291cmNlTm9kZSwgaW50KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlZHVjZUxvYWQoUmVzb3VyY2VOb2RlIG5vZGUsIGludCBsb2FkVmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgTW9uaXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvciNhc3NpZ25Mb2FkKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGUsIGludCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25Mb2FkKFJlc291cmNlTm9kZSBub2RlLCBpbnQgbG9hZFZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5tb25pdG9yLk1vbml0b3IjYWRkTm9kZShvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZE5vZGUoUmVzb3VyY2VOb2RlIG5vZGUpIHRocm93cyBNb25pdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgbm9kZXNNYXAucHV0KG5vZGUuZ2V0Tm9kZUlkKCksIG5vZGUpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yI3JlbW92ZU5vZGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm9kZUJ5SWQoU3RyaW5nIG5vZGVJZCkgdGhyb3dzIE1vbml0b3JFeGNlcHRpb24geworICAgICAgICBub2Rlc01hcC5yZW1vdmUobm9kZUlkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL01lc29zTW9uaXRvckZhY3RvcnkuamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9tb25pdG9yL01lc29zTW9uaXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdhZDhhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL21vbml0b3IvTWVzb3NNb25pdG9yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBDcmVhdGVzIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgTWVzb3NNb25pdG9yfXMuCisgKiA8L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgTWVzb3NNb25pdG9yRmFjdG9yeSBpbXBsZW1lbnRzIE1vbml0b3JGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoTWVzb3NNb25pdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlCisgICAgICogZ292Lm5hc2EuanBsLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTW9uaXRvckZhY3RvcnkjY3JlYXRlTW9uaXRvcigpCisgICAgICovCisgICAgcHVibGljIE1lc29zTW9uaXRvciBjcmVhdGVNb25pdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNvc01vbml0b3IoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGNyZWF0ZSBNZXNvcyBNb25pdG9yIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1Jlc291cmNlTWVzb3NTY2hlZHVsZXIuamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvUmVzb3VyY2VNZXNvc1NjaGVkdWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGE4NjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1Jlc291cmNlTWVzb3NTY2hlZHVsZXIuamF2YQpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRXhlY3V0b3JJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5FeGVjdXRvckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRnJhbWV3b3JrSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuTWFzdGVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5PZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5PZmZlcklEOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlNsYXZlSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlRhc2tJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5UYXNrSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5UYXNrU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuU2NoZWR1bGVyOworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuU2NoZWR1bGVyRHJpdmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UuYmF0Y2htZ3IuQmF0Y2htZ3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5NZXNvc0JhdGNoTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5SZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iUXVldWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuTWVzb3NGcmFtZXdvcmtFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuTW9uaXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5TY2hlZHVsZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLk1lc29zVXRpbGl0aWVzOworCisvKioKKyAqIEBhdXRob3Igc3RhcmNobWQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiBBIHNjaGVkdWxlciBmb3IgcGFydCBvZiB0aGUgbWVzb3MgZnJhbWUgd29yay4KKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTWVzb3NTY2hlZHVsZXIgaW1wbGVtZW50cyBTY2hlZHVsZXIsIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlciB7CisgICAgU2NoZWR1bGVyRHJpdmVyIGRyaXZlcjsKKyAgICBNZXNvc0JhdGNoTWFuYWdlciBiYXRjaDsKKyAgICBFeGVjdXRvckluZm8gZXhlY3V0b3I7CisgICAgSm9iUXVldWUgcXVldWU7CisgICAgTW9uaXRvciBtb247CisKKyAgICAvL0xvZ2dlcgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlc291cmNlTWVzb3NTY2hlZHVsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIHNjaGVkdWxlcgorICAgICAqIEBwYXJhbSBiYXRjaCAtIGJhdGNoIG1hbmFnZXIgKG11c3QgYmUgTWVzb3NCYXRjaE1hbmFnZXIpCisgICAgICogQHBhcmFtIGV4ZWN1dG9yIC0gTWVzb3MgRXhlY3V0b3JJbmZvCisgICAgICogQHBhcmFtIHF1ZXVlIEpvYiBRdWV1ZSB1c2VkCisgICAgICogQHBhcmFtIG1vbiAtIG1vbml0b3IgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VNZXNvc1NjaGVkdWxlcihNZXNvc0JhdGNoTWFuYWdlciBiYXRjaCxFeGVjdXRvckluZm8gZXhlY3V0b3IsIEpvYlF1ZXVlIHF1ZXVlLCBNb25pdG9yIG1vbikgeworICAgICAgICB0aGlzLmJhdGNoID0gYmF0Y2g7CisgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKKyAgICAgICAgdGhpcy5xdWV1ZSA9IHF1ZXVlOworICAgICAgICB0aGlzLm1vbiA9IG1vbjsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCJDcmVhdGluZyB0aGUgcmVzb3VyY2UtbWVzb3Mgc2NoZWR1bGVyLiIpOworICAgIH0KKworCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXIjZGlzY29ubmVjdGVkKG9yZy5hcGFjaGUubWVzb3MuU2NoZWR1bGVyRHJpdmVyKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RlZChTY2hlZHVsZXJEcml2ZXIgc2NoZWREcml2ZXIpIHsKKyAgICAgICAgLy9UT0RPOiBQYXVzZSBzY2hlZHVsZXIgdW50aWwgbWFzdGVyIGNvbWVzIGJhY2sgb25saW5lLgorCisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXIjZXJyb3Iob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXJyb3IoU2NoZWR1bGVyRHJpdmVyIHNjaGVkRHJpdmVyLCBTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsIk1lc29zIGlzc3VlZCBhbiBlcnJvcjogIitlcnJvcik7CisgICAgICAgIC8vVE9ETzoga2lsbCBzb21ldGhpbmcgaGVyZS4KKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm1lc29zLlNjaGVkdWxlciNleGVjdXRvckxvc3Qob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLkV4ZWN1dG9ySUQsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlNsYXZlSUQsIGludCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRvckxvc3QoU2NoZWR1bGVyRHJpdmVyIHNjaGVkRHJpdmVyLCBFeGVjdXRvcklEIGV4ZWN1dG9yLFNsYXZlSUQgc2xhdmUsIGludCBzdGF0dXMpIHsKKyAgICAgICAgLy9UYXNrcyB3aWxsIGhhdmUgYSAidGFzayBsb3N0IiBtZXNzYWdlIGF1dG9tYXRpY2FsbHkgcS5lLmQgbm8gYWN0aW9uIG5lY2Vzc2FyeS4KKyAgICAgICAgLy9UT0RPOiBkbyB3ZSBuZWVkIHRvIHJlc3RhcnQ/CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCJNZXNvcyBleGVjdXRvciAiK2V4ZWN1dG9yKyIgb24gc2xhdmUgIitzbGF2ZSsiIGRpZWQgd2l0aCBzdGF0dXMgIitzdGF0dXMpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUubWVzb3MuU2NoZWR1bGVyI2ZyYW1ld29ya01lc3NhZ2Uob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLkV4ZWN1dG9ySUQsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlNsYXZlSUQsIGJ5dGVbXSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmcmFtZXdvcmtNZXNzYWdlKFNjaGVkdWxlckRyaXZlciBzY2hlZERyaXZlciwgRXhlY3V0b3JJRCBleGVjdXRvciwKKyAgICAgICAgICAgIFNsYXZlSUQgc2xhdmUsIGJ5dGVbXSBieXRlcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCJNZXNvcyBmcmFtZXdvcmsgZXhlY3V0b3IiK2V4ZWN1dG9yKyIgb24gc2xhdmUgIitzbGF2ZSsiIGlzc3VlZCBtZXNzYWdlOiAiKworICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnl0ZXMsImFzY2lpIikpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywiTWVzb3MgZnJhbWV3b3JrIG1lc3NhZ2UgbWlzc2VkIGR1ZSB0byBiYWQgZW5jb2Rpbmc6IGFzY2lpLiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUubWVzb3MuU2NoZWR1bGVyI29mZmVyUmVzY2luZGVkKG9yZy5hcGFjaGUubWVzb3MuU2NoZWR1bGVyRHJpdmVyLCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5PZmZlcklEKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9mZmVyUmVzY2luZGVkKFNjaGVkdWxlckRyaXZlciBzY2hlZERyaXZlciwgT2ZmZXJJRCBvZmZlcikgeworICAgICAgICAvL1RPRE86IHRha2UgYXdheSByZXNvdXJjZXMgZnJvbSBiYXRjaCBtYW5hZ2VyLi4ub3Igc3RhbmQgaW4uCisgICAgICAgIC8vVW5uZWVkZWQ/CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXIjcmVnaXN0ZXJlZChvcmcuYXBhY2hlLm1lc29zLlNjaGVkdWxlckRyaXZlciwgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRnJhbWV3b3JrSUQsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLk1hc3RlckluZm8pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJlZChTY2hlZHVsZXJEcml2ZXIgc2NoZWREcml2ZXIsIEZyYW1ld29ya0lEIGZyYW1ld29yaywKKyAgICAgICAgICAgIE1hc3RlckluZm8gbWFzdGVySW5mbykgeworICAgICAgICBMT0cubG9nKExldmVsLklORk8sIk1lc29zIGZyYW1ld29yayByZWdpc3RlcmVkOiAiK2ZyYW1ld29yay5nZXRWYWx1ZSgpKyIgd2l0aCBtYXN0ZXI6ICIrbWFzdGVySW5mby5nZXRJZCgpKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm1lc29zLlNjaGVkdWxlciNyZXJlZ2lzdGVyZWQob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLk1hc3RlckluZm8pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVyZWdpc3RlcmVkKFNjaGVkdWxlckRyaXZlciBzY2hlZERyaXZlciwgTWFzdGVySW5mbyBtYXN0ZXJJbmZvKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiTWVzb3MgZnJhbWV3b3JrIHJlLXJlZ2lzdGVyZWQgd2l0aDogIittYXN0ZXJJbmZvLmdldElkKCkpOworICAgICAgICAvL1RPRE86IGNhbGwgc3RhcnQsIHdlIGFyZSByZWdpc3RlcmVkLgorCisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXIjcmVzb3VyY2VPZmZlcnMob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIGphdmEudXRpbC5MaXN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc291cmNlT2ZmZXJzKFNjaGVkdWxlckRyaXZlciBkcml2ZXIsIExpc3Q8T2ZmZXI+IG9mZmVycykgeworICAgICAgICBMT0cubG9nKExldmVsLklORk8sIk9mZmVyZWQgbWVzb3MgcmVzb3VyY2VzOiAiK29mZmVycy5zaXplKCkrIiBvZmZlcnMuIik7CisgICAgICAgIC8vTG9nLCBpZiBwb3NzaWJsZSB0aGUgb2ZmZXJzCisgICAgICAgIGlmIChMT0cuaXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHsKKyAgICAgICAgICAgIGZvciAoT2ZmZXIgb2ZmZXIgOiBvZmZlcnMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbi5hZGROb2RlKG5ldyBSZXNvdXJjZU5vZGUob2ZmZXIuZ2V0U2xhdmVJZCgpLmdldFZhbHVlKCksbmV3IFVSTCgiaHR0cDovLyIrb2ZmZXIuZ2V0SG9zdG5hbWUoKSksLTEpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsIkNhbm5vdCBhZGQgbm9kZSB0byBtb25pdG9yIChiYWQgdXJsKS4gIEdpdmluZyB1cDogIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIE1vbml0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsIkNhbm5vdCBhZGQgbm9kZSB0byBtb25pdG9yICh1bmtuKS4gIEdpdmluZyB1cDogIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsIk9mZmVyICgiK29mZmVyLmdldElkKCkuZ2V0VmFsdWUoKSsiKTogIitvZmZlci5nZXRIb3N0bmFtZSgpKyAiKFNsYXZlOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgb2ZmZXIuZ2V0U2xhdmVJZCgpLmdldFZhbHVlKCkrIikgIitNZXNvc1V0aWxpdGllcy5nZXRSZXNvdXJjZU1lc3NhZ2Uob2ZmZXIuZ2V0UmVzb3VyY2VzTGlzdCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxKb2JTZXQ+IGFzc2lnbm1lbnRzID0gdGhpcy5nZXRKb2JBc3NpZ25tZW50c0pvYnMob2ZmZXJzKTsKKyAgICAgICAgTGlzdDxPZmZlcklEPiB1c2VkID0gbmV3IExpbmtlZExpc3Q8T2ZmZXJJRD4oKTsKKyAgICAgICAgZm9yIChKb2JTZXQgYXNzaWdubWVudCA6IGFzc2lnbm1lbnRzKSB7CisgICAgICAgICAgICAvL0xhdW5jaCB0YXNrcyByZXF1aXJlcyBsaXN0cworICAgICAgICAgICAgTGlzdDxPZmZlcklEPiBpZHMgPSBuZXcgTGlua2VkTGlzdDxPZmZlcklEPigpOworICAgICAgICAgICAgTGlzdDxUYXNrSW5mbz4gdGFza3MgPSBuZXcgTGlua2VkTGlzdDxUYXNrSW5mbz4oKTsKKyAgICAgICAgICAgIHRhc2tzLmFkZChhc3NpZ25tZW50LnRhc2spOworICAgICAgICAgICAgdXNlZC5hZGQoYXNzaWdubWVudC5vZmZlci5nZXRJZCgpKTsKKyAgICAgICAgICAgIGlkcy5hZGQoYXNzaWdubWVudC5vZmZlci5nZXRJZCgpKTsKKyAgICAgICAgICAgIC8vUmVnaXN0ZXIgbG9jYWxseSBhbmQgbGF1bmNoIG9uIG1lc29zCisgICAgICAgICAgICBiYXRjaC5yZWdpc3RlckV4ZWN1dGVkSm9iKGFzc2lnbm1lbnQuam9iLmdldEpvYigpLmdldElkKCksIGFzc2lnbm1lbnQudGFzay5nZXRUYXNrSWQoKSk7CisgICAgICAgICAgICBTdGF0dXMgc3RhdHVzID0gZHJpdmVyLmxhdW5jaFRhc2tzKGlkcyx0YXNrcyk7IC8vQXNzdW1lZCBvbmUgdG8gb25lIG1hcHBpbmcKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzLkRSSVZFUl9SVU5OSU5HKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXNvc0ZyYW1ld29ya0V4Y2VwdGlvbigiRHJpdmVyIHN0b3BwZWQ6ICIrc3RhdHVzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoT2ZmZXIgb2ZmZXIgOiBvZmZlcnMpIHsKKyAgICAgICAgICAgIGlmICghdXNlZC5jb250YWlucyhvZmZlci5nZXRJZCgpKSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiUmVqZWN0aW5nIE9mZmVyOiAiK29mZmVyLmdldElkKCkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgZHJpdmVyLmRlY2xpbmVPZmZlcihvZmZlci5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBUYXNrSW5mbyBmcm9tIHRoZSBnaXZlbiBqb2JzcGVjCisgICAgICogQHBhcmFtIGpvYiAtIEpvYlNwZWMgdG8gVGFza0luZm8taWZ5CisgICAgICogQHBhcmFtIG9mZmVyIC0gb2ZmZXIgYWRkIGV4dHJhIGRhdGEgKFNsYXZlSWQpCisgICAgICogQHJldHVybiBUYXNrSW5mbyBmdWxseSBmb3JtZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFRhc2tJbmZvIGdldFRhc2tJbmZvKEpvYlNwZWMgam9iLE9mZmVyIG9mZmVyKSB7CisgICAgICAgIFRhc2tJRCB0YXNrSWQgPSBUYXNrSUQubmV3QnVpbGRlcigpLnNldFZhbHVlKGpvYi5nZXRKb2IoKS5nZXRJZCgpKS5idWlsZCgpOworICAgICAgICBUYXNrSW5mbyBpbmZvID0gVGFza0luZm8ubmV3QnVpbGRlcigpLnNldE5hbWUoInRhc2sgIiArIHRhc2tJZC5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgICAgICAuc2V0VGFza0lkKHRhc2tJZCkKKyAgICAgICAgICAgICAgICAgLnNldFNsYXZlSWQob2ZmZXIuZ2V0U2xhdmVJZCgpKQorICAgICAgICAgICAgICAgICAuYWRkUmVzb3VyY2VzKFJlc291cmNlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKCJjcHVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHlwZShWYWx1ZS5UeXBlLlNDQUxBUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2NhbGFyKFZhbHVlLlNjYWxhci5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoam9iLmdldEpvYigpLmdldExvYWRWYWx1ZSgpKjEuMCkpKQorICAgICAgICAgICAgICAgICAuYWRkUmVzb3VyY2VzKFJlc291cmNlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKCJtZW0iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUeXBlKFZhbHVlLlR5cGUuU0NBTEFSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTY2FsYXIoVmFsdWUuU2NhbGFyLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZShqb2IuZ2V0Sm9iKCkuZ2V0TG9hZFZhbHVlKCkqMTAyNC4wKSkpCisgICAgICAgICAgICAgICAgIC5zZXRFeGVjdXRvcihFeGVjdXRvckluZm8ubmV3QnVpbGRlcihleGVjdXRvcikpLnNldERhdGEoTWVzb3NVdGlsaXRpZXMuam9iU3BlY1RvQnl0ZVN0cmluZyhqb2IpKS5idWlsZCgpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2hlY2tzIGFsbCBvZmZlcnMgYWdhaW5zdCBqb2JzIGluIG9yZGVyLCBhc3NpZ25pbmcgam9icyB0byBvZmZlcnMgdW50aWwgZWFjaCBvZmZlciBpcyBmdWxsLAorICAgICAqIG9yIGFsbCBqb2JzIGFyZSBnb25lLgorICAgICAqIEBwYXJhbSBvZmZlcnMgLSBvZmZlcnMgdG8gYXNzaWduIGpvYnMgdG8uCisgICAgICogQHJldHVybiBMaXN0IG9mIDxKb2JTcGVjLFRhc2tJbmZvLE9mZmVyPiB0dXBsZXMgKGFzc2lnbmVkIHRvIGVhY2ggb3RoZXIpLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdDxKb2JTZXQ+IGdldEpvYkFzc2lnbm1lbnRzSm9icyhMaXN0PE9mZmVyPiBvZmZlcnMpIHsKKyAgICAgICAgTGlzdDxKb2JTZXQ+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxKb2JTZXQ+KCk7CisgICAgICAgIGZvciAoT2ZmZXIgb2ZmZXIgOiBvZmZlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBjcHVzID0gMC4wLCBtZW0gPSAwLjA7CisgICAgICAgICAgICAvL0dldCB0aGUgcmVzb3VyY2VzIG9mZmVyZWQgZnJvbSB0aGlzIG9mZmVyCisgICAgICAgICAgICBmb3IgKFJlc291cmNlIHJlc2MgOiBvZmZlci5nZXRSZXNvdXJjZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzYy5nZXROYW1lKCkuZXF1YWxzKCJjcHVzIikpCisgICAgICAgICAgICAgICAgICAgIGNwdXMgKz0gcmVzYy5nZXRTY2FsYXIoKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChyZXNjLmdldE5hbWUoKS5lcXVhbHMoIm1lbSIpKQorICAgICAgICAgICAgICAgICAgICBtZW0gKz0gcmVzYy5nZXRTY2FsYXIoKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TZWFyY2ggZm9yIGVub3VnaCBqb2JzIHRvIGZpbGwgdGhlIG9mZmVyCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpIDwgcXVldWUuZ2V0U2l6ZSgpO2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBKb2JTcGVjIGpvYiA9IHF1ZXVlLmdldE5leHRKb2IoKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxvYWQgPSBqb2IuZ2V0Sm9iKCkuZ2V0TG9hZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgZW5vdWdoIHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICBpZiAoY3B1cyA8IGxvYWQgfHwgbWVtIDwgbG9hZCoxMDI0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5yZXF1ZXVlSm9iKGpvYik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjcHVzIC09IGxvYWQ7CisgICAgICAgICAgICAgICAgICAgIG1lbSAtPSAxMDI0KmxvYWQ7CisgICAgICAgICAgICAgICAgICAgIEpvYlNldCB0bXAgPSBuZXcgSm9iU2V0KGpvYixnZXRUYXNrSW5mbyhqb2Isb2ZmZXIpLG9mZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgLy9Ob3QgZW5vdWdoIGxlZnQsIG9wdGltaXNlIGFuZCBzdG9wIGxvb2tpbmcgZm9yIGpvYnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwdXMgPCAwLjUgfHwgbWVtIDw9IDUxMi4wKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSm9iUXVldWVFeGNlcHRpb24gZSkge3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpO30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vT3B0aW1pemF0aW9uOiBicmVhayB3aGVuIG5vIGpvYnMKKyAgICAgICAgICAgIGlmIChxdWV1ZS5nZXRTaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm1lc29zLlNjaGVkdWxlciNzbGF2ZUxvc3Qob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlNsYXZlSUQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2xhdmVMb3N0KFNjaGVkdWxlckRyaXZlciBzY2hlZERyaXZlciwgU2xhdmVJRCBzbGF2ZSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsIk1lc29zIHNsYXZlICIrc2xhdmUrIiBsb3N0LCByZWlzc3Vpbmcgam9icy4iKTsKKyAgICAgICAgLy9UT0RPOiByZXJlZ2lzdGVyIGpvYnMKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm1lc29zLlNjaGVkdWxlciNzdGF0dXNVcGRhdGUob3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXIsIG9yZy5hcGFjaGUubWVzb3MuUHJvdG9zLlRhc2tTdGF0dXMpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhdHVzVXBkYXRlKFNjaGVkdWxlckRyaXZlciBzY2hlZERyaXZlciwgVGFza1N0YXR1cyB0YXNrU3RhdHVzKSB7CisgICAgICAgIC8vVE9ETzogZGVsaXZlciBtZXNzYWdlcywgc29tZSByZXJ1biwgc29tZSBmaW5pc2guCisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiU3RhdHVzIHVwZGF0ZTogIit0YXNrU3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCJBdHRlbXB0aW5nIHRvIHJ1biBmcmFtZXdvcmsuIE5vdGhpbmcgdG8gZG8uIik7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiUGFyYWRpZ20gc2hpZnQgZW5hYmxlZC4iKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FU1QsICJTcGluIGFuZCBwb2xsIHN1cnBsYW50ZWQgYnkgZXZlbnQgYmFzZWQgZXhlY3V0aW9uLiIpOworICAgICAgICBMT0cubG9nKExldmVsLkZJTkVTVCwgIk1lc29zLU9PRFQgRnVzaW9uIGNvbXBsZXRlLiIpOworICAgICAgICAvL0Rvbid0IHJ1biBhbnl0aGluZworICAgICAgICByZXR1cm47CisgICAgfQorCisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNjaGVkdWxlKEpvYlNwZWMgc3BlYykgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiU2NoZWR1bGUgaXMgbm90IGNhbGxlZCB3aGVuIHVzaW5nIG1lc29zLiIpOworICAgIH0KKworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VOb2RlIG5vZGVBdmFpbGFibGUoSm9iU3BlYyBzcGVjKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNb25pdG9yIGdldE1vbml0b3IoKSB7CisgICAgICAgIHJldHVybiBtb247CisgICAgfQorCisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXRjaG1nciBnZXRCYXRjaG1ncigpIHsKKyAgICAgICAgcmV0dXJuIGJhdGNoOworICAgIH0KKworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSm9iUXVldWUgZ2V0Sm9iUXVldWUoKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIHF1ZXVlOworICAgIH0KKworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUXVldWVNYW5hZ2VyIGdldFF1ZXVlTWFuYWdlcigpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgLy9Kb2Igc2V0IHVzZWQgaW50ZXJuYWxseSB0byBzaW1wbGlmeSBkYXRhIHRyYW5zbWlzc2lvbgorICAgIHByaXZhdGUgY2xhc3MgSm9iU2V0IHsKKyAgICAgICAgcHVibGljIEpvYlNwZWMgam9iOworICAgICAgICBwdWJsaWMgVGFza0luZm8gdGFzazsKKyAgICAgICAgcHVibGljIE9mZmVyIG9mZmVyOworICAgICAgICAvL0J1aWxkIGEgam9iIHNldAorICAgICAgICBwdWJsaWMgSm9iU2V0KEpvYlNwZWMgam9iLCBUYXNrSW5mbyB0YXNrLCBPZmZlciBvZmZlcikgeworICAgICAgICAgICAgdGhpcy5qb2IgPSBqb2I7CisgICAgICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgICAgICAgICAgdGhpcy5vZmZlciA9IG9mZmVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9SZXNvdXJjZU1lc29zU2NoZWR1bGVyRmFjdG9yeS5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9SZXNvdXJjZU1lc29zU2NoZWR1bGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWUyZTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc2NoZWR1bGVyL1Jlc291cmNlTWVzb3NTY2hlZHVsZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUubWVzb3MuTWVzb3NTY2hlZHVsZXJEcml2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuQ29tbWFuZEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRXhlY3V0b3JJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5FeGVjdXRvckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRnJhbWV3b3JrSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5Qcm90b3MuRnJhbWV3b3JrSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5TdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5TY2hlZHVsZXJEcml2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5NZXNvc0JhdGNoTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKKworLyoqCisgKiBBIGNsYXNzIHRvIHNldHVwIHRoZSByZXNvdXJjZSBtYW5hZ2VyJ3MgbWVzb3MgZnJhbWV3b3JrLgorICogQGF1dGhvciBzdGFyY2htZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTWVzb3NTY2hlZHVsZXJGYWN0b3J5IGltcGxlbWVudHMgU2NoZWR1bGVyRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihSZXNvdXJjZU1lc29zU2NoZWR1bGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBNb25pdG9yIG1vbiA9IG51bGw7CisgICAgcHJpdmF0ZSBNZXNvc0JhdGNoTWFuYWdlciBiYXRjaCA9IG51bGw7CisgICAgcHJpdmF0ZSBKb2JRdWV1ZSBxdWV1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgUmVzb3VyY2VNZXNvc1NjaGVkdWxlckZhY3RvcnkoKSB7fQorCisgICAgcHVibGljIFNjaGVkdWxlciBjb25zdHJ1Y3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1lc29zLmV4ZWN1dG9yLnVyaSIsIi4vb29kdC1leGVjdXRvci5pbiIpOworICAgICAgICAgICAgLy9GcmFtZXdvcmsgaW5mbworICAgICAgICAgICAgRnJhbWV3b3JrSW5mby5CdWlsZGVyIGZyYW1ld29ya0J1aWxkZXIgPSBGcmFtZXdvcmtJbmZvLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoIk9PRFQgUmVzb3VyY2UgTWFuYWdlciBNZXNvcyBGcmFtZXdvcmsiKS5zZXRVc2VyKCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKEZyYW1ld29ya0lELm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgiT09EVC1SZXNvdXJjZSBGcmFtZXdvcmsiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIEZyYW1ld29ya0luZm8gZnJhbWV3b3JrID0gZnJhbWV3b3JrQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgRXhlY3V0b3JJbmZvIGV4ZWN1dG9yID0gRXhlY3V0b3JJbmZvLm5ld0J1aWxkZXIoKS5zZXRFeGVjdXRvcklkKEV4ZWN1dG9ySUQubmV3QnVpbGRlcigpLnNldFZhbHVlKCJPT0RULVJlc291cmNlIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbW1hbmQoQ29tbWFuZEluZm8ubmV3QnVpbGRlcigpLnNldFZhbHVlKG5ldyBGaWxlKHVyaSkuZ2V0Q2Fub25pY2FsUGF0aCgpKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZSgiT09EVCBSZXNvdXJjZSBNYW5hZ2VyIEV4ZWN1dG9yIikuYnVpbGQoKTsKKyAgICAgICAgICAgIFNjaGVkdWxlckRyaXZlciBkcml2ZXIgPSBudWxsOworCisgICAgICAgICAgICAvL1Jlc291cmNlIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICAgICAgU3RyaW5nIGJhdGNobWdyQ2xhc3NTdHIgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5NZXNvc0JhdGNoTWFuYWdlckZhY3RvcnkiOworICAgICAgICAgICAgU3RyaW5nIG1vbml0b3JDbGFzc1N0ciA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLm1vbml0b3IuTWVzb3NNb25pdG9yRmFjdG9yeSI7CisgICAgICAgICAgICBTdHJpbmcgam9iUXVldWVDbGFzc1N0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicmVzb3VyY2Uuam9icXVldWUuZmFjdG9yeSIsIm9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iU3RhY2tKb2JRdWV1ZUZhY3RvcnkiKTsKKyAgICAgICAgICAgIFN0cmluZyBpcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicmVzb3VyY2UubWVzb3MubWFzdGVyLmlwIiwiMTI3LjAuMC4xOjUwNTAiKTsKKworICAgICAgICAgICAgYmF0Y2ggPSAoTWVzb3NCYXRjaE1hbmFnZXIpR2VuZXJpY1Jlc291cmNlTWFuYWdlck9iamVjdEZhY3RvcnkuZ2V0QmF0Y2htZ3JTZXJ2aWNlRnJvbUZhY3RvcnkoYmF0Y2htZ3JDbGFzc1N0cik7CisgICAgICAgICAgICBtb24gPSBHZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeS5nZXRNb25pdG9yU2VydmljZUZyb21GYWN0b3J5KG1vbml0b3JDbGFzc1N0cik7CisgICAgICAgICAgICBxdWV1ZSA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldEpvYlF1ZXVlU2VydmljZUZyb21GYWN0b3J5KGpvYlF1ZXVlQ2xhc3NTdHIpOworICAgICAgICAgICAgYmF0Y2guc2V0TW9uaXRvcihtb24pOworICAgICAgICAgICAgYmF0Y2guc2V0RHJpdmVyKGRyaXZlcik7CisgICAgICAgICAgICBiYXRjaC5zZXRKb2JSZXBvc2l0b3J5KHF1ZXVlLmdldEpvYlJlcG9zaXRvcnkoKSk7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiQ29ubmVjdGluZyB0byBNZXNvcyBNYXN0ZXIgYXQ6ICIraXApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0aW5nIHRvIE1lc29zIE1hc3RlciBhdDogIitpcCk7CisgICAgICAgICAgICBSZXNvdXJjZU1lc29zU2NoZWR1bGVyIHNjaGVkdWxlciA9IG5ldyBSZXNvdXJjZU1lc29zU2NoZWR1bGVyKGJhdGNoLCBleGVjdXRvciwgcXVldWUsIG1vbik7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc29zU2NoZWR1bGVyRHJpdmVyIG1lc29zID0gbmV3IE1lc29zU2NoZWR1bGVyRHJpdmVyKHNjaGVkdWxlciwgZnJhbWV3b3JrLCBpcCk7CisgICAgICAgICAgICAvL0Fub255bW91cyB0aHJlYWQgdG8gcnVuCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBtZXNvcy5ydW4oKSA9PSBTdGF0dXMuRFJJVkVSX1NUT1BQRUQgPyAwIDogMTsKKyAgICAgICAgICAgICAgICAgICAgbWVzb3Muc3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyOworICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsIkV4Y2VwdGlvbiBkZXRlY3RlZDogIitpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2NoZWR1bGVyIGNyZWF0ZVNjaGVkdWxlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU3BhcmtTY2hlZHVsZXIuamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU3BhcmtTY2hlZHVsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQwYmViCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9TcGFya1NjaGVkdWxlci5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5iYXRjaG1nci5CYXRjaG1ncjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UubW9uaXRvci5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5TcGFya0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5TdHJlYW1pbmdJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JRdWV1ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5TY2hlZHVsZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLkdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb25mOworaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuSmF2YVNwYXJrQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnN0cmVhbWluZy5EdXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnN0cmVhbWluZy5TdHJlYW1pbmdDb250ZXh0OworCisvKioKKyAqIEEgc2NoZWR1bGVyIHRoYXQgcnVucyBzcGFyayBqb2JzIG9uIGEgc3BhcmsgY2x1c3Rlci4KKyAqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKgorICovCitwdWJsaWMgY2xhc3MgU3BhcmtTY2hlZHVsZXIgaW1wbGVtZW50cyBTY2hlZHVsZXIgeworCisgICAgU3BhcmtDb250ZXh0IHNjOworICAgIFN0cmVhbWluZ0NvbnRleHQgc3NjOworICAgIEpvYlF1ZXVlIHF1ZXVlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoU3BhcmtTY2hlZHVsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBTcGFya1NjaGVkdWxlcihKb2JRdWV1ZSBxdWV1ZSkgeworICAgICAgICBTcGFya0NvbmYgY29uZiA9IG5ldyBTcGFya0NvbmYoKTsKKyAgICAgICAgY29uZi5zZXRNYXN0ZXIoU3lzdGVtLmdldFByb3BlcnR5KCJyZXNvdXJjZS5ydW5uZXIuc3BhcmsuaG9zdCIsImxvY2FsIikpOworICAgICAgICBjb25mLnNldEFwcE5hbWUoIk9PRFQgU3BhcmsgSm9iIik7CisKKyAgICAgICAgVVJMIGxvY2F0aW9uID0gU3BhcmtTY2hlZHVsZXIuY2xhc3MuZ2V0UmVzb3VyY2UoJy8nK1NwYXJrU2NoZWR1bGVyLmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSsiLmNsYXNzIik7CisgICAgICAgIGNvbmYuc2V0SmFycyhuZXcgU3RyaW5nW117Ii4uL2xpYi9jYXMtcmVzb3VyY2UtMC44LVNOQVBTSE9ULmphciJ9KTsKKyAgICAgICAgc2MgPSBuZXcgU3BhcmtDb250ZXh0KGNvbmYpOworICAgICAgICBzc2MgPSBuZXcgU3RyZWFtaW5nQ29udGV4dChzYyxuZXcgRHVyYXRpb24oMTAwMDApKTsKKyAgICAgICAgdGhpcy5xdWV1ZSA9IHF1ZXVlOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgSm9iU3BlYyBzcGVjID0gcXVldWUuZ2V0TmV4dEpvYigpOworCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKHNwZWMuZ2V0Sm9iKCkuZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKCEoY2xhenoubmV3SW5zdGFuY2UoKSBpbnN0YW5jZW9mIFNwYXJrSW5zdGFuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywiTm9uLVNwYXJrIGpvYiBmb3VuZCAoIitzcGVjLmdldEpvYigpLmdldElkKCkrIikgaWdub3JpbmcuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlKHNwZWMpOworICAgICAgICAgICAgfSBjYXRjaChTY2hlZHVsZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywiU2NoZWR1bGVyIGV4Y2VwdGlvbiBkZXRlY3RlZDogIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChKb2JRdWV1ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJDb3VsZCBub3QgZ2V0IG5leHQgam9iIGZyb20gam9iLXF1ZXVlLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJDbGFzcyBub3QgZm91bmQ6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJDb3VsZCBub3QgaW5zdGFudGlhdGU6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJDb3VsZCBub3QgYWNjZXNzOiAiK2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI3NjaGVkdWxlKG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JTcGVjKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNjaGVkdWxlKEpvYlNwZWMgc3BlYykgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKb2JJbnN0YW5jZSBpbnN0YW5jZSA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldEpvYkluc3RhbmNlRnJvbUNsYXNzTmFtZShzcGVjLmdldEpvYigpLmdldEpvYkluc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgICAgICAgICAgLy9zcGVjLmdldEluKCkuCisgICAgICAgICAgICBTcGFya0luc3RhbmNlIHNwYXJrSW5zdGFuY2UgPSAoU3BhcmtJbnN0YW5jZSkgaW5zdGFuY2U7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sIlNldHRpbmcgU3BhcmtDb250ZXh0Iik7CisgICAgICAgICAgICBzcGFya0luc3RhbmNlLnNldFNwYXJrQ29udGV4dCh0aGlzLnNjKTsKKyAgICAgICAgICAgIC8vSGFuZGxlIHNwYXJrIHN0cmVhbWluZworICAgICAgICAgICAgaWYgKHNwYXJrSW5zdGFuY2UgaW5zdGFuY2VvZiBTdHJlYW1pbmdJbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywiRm91bmQgc3RyZWFtaW5nIGluc3RhbmNlLCBzZXR0aW5nIFN0cmVhbWluZ0NvbnRleHQiKTsKKyAgICAgICAgICAgICAgICAoKFN0cmVhbWluZ0luc3RhbmNlKXNwYXJrSW5zdGFuY2UpLnNldFN0cmVhbWluZ0NvbnRleHQodGhpcy5zc2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3BhcmtJbnN0YW5jZS5leGVjdXRlKHNwZWMuZ2V0SW4oKSk7CisKKyAgICAgICAgfSBjYXRjaCAoSm9iSW5wdXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCJKb2IgaW5wdXQgZXhjZXB0aW9uIGRldGVjdGVkLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI25vZGVBdmFpbGFibGUob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWMpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTm9kZSBub2RlQXZhaWxhYmxlKEpvYlNwZWMgc3BlYykgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zY2hlZHVsZXIuU2NoZWR1bGVyI2dldE1vbml0b3IoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNb25pdG9yIGdldE1vbml0b3IoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlciNnZXRCYXRjaG1ncigpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhdGNobWdyIGdldEJhdGNobWdyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlci5TY2hlZHVsZXIjZ2V0Sm9iUXVldWUoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKb2JRdWV1ZSBnZXRKb2JRdWV1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc2NoZWR1bGVyLlNjaGVkdWxlciNnZXRRdWV1ZU1hbmFnZXIoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBRdWV1ZU1hbmFnZXIgZ2V0UXVldWVNYW5hZ2VyKCkgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3NjaGVkdWxlci9TcGFya1NjaGVkdWxlckZhY3RvcnkuamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU3BhcmtTY2hlZHVsZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiNzMyYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zY2hlZHVsZXIvU3BhcmtTY2hlZHVsZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnNjaGVkdWxlcjsKKworLy9KQVZBIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKworLy9PT0RUIGltcG9ydHMKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5HZW5lcmljUmVzb3VyY2VNYW5hZ2VyT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmpvYnF1ZXVlLkpvYlF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuam9icXVldWUuSm9iU3RhY2tKb2JRdWV1ZUZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBzdGFyY2htZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPgorICogQSBmYWN0b3J5IGZvciB0aGUgU3BhcmtTY2hlZHVsZXIKKyAqIDwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTcGFya1NjaGVkdWxlckZhY3RvcnkgaW1wbGVtZW50cyBTY2hlZHVsZXJGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNwYXJrU2NoZWR1bGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisKKwlwcml2YXRlIEpvYlF1ZXVlIHF1ZXVlID0gbnVsbDsKKwkvKioKKwkgKiBTZXR1cCBmYWN0b3J5CisJICovCisJcHVibGljIFNwYXJrU2NoZWR1bGVyRmFjdG9yeSgpIHsKKwkJU3RyaW5nIGpvYlF1ZXVlQ2xhc3NTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInJlc291cmNlLmpvYnF1ZXVlLmZhY3RvcnkiLAorCQkgICAgICAgIEpvYlN0YWNrSm9iUXVldWVGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisJCUxPRy5sb2coTGV2ZWwuSU5GTywiVXNpbmcgam9iLXF1ZXVlOiAiK2pvYlF1ZXVlQ2xhc3NTdHIrICIgd2l0aDogIitTcGFya1NjaGVkdWxlci5jbGFzcy5nZXROYW1lKCkpOworCQlxdWV1ZSA9IEdlbmVyaWNSZXNvdXJjZU1hbmFnZXJPYmplY3RGYWN0b3J5LmdldEpvYlF1ZXVlU2VydmljZUZyb21GYWN0b3J5KGpvYlF1ZXVlQ2xhc3NTdHIpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHNjaGVkdWxlcgorCSAqLworCXB1YmxpYyBTY2hlZHVsZXIgY3JlYXRlU2NoZWR1bGVyKCkgeworCQlyZXR1cm4gbmV3IFNwYXJrU2NoZWR1bGVyKHF1ZXVlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvU3BhcmtJbnN0YW5jZS5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvU3BhcmtJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTdkOWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2Uvc3RydWN0cy9TcGFya0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb250ZXh0OworCitwdWJsaWMgaW50ZXJmYWNlIFNwYXJrSW5zdGFuY2UgZXh0ZW5kcyBKb2JJbnN0YW5jZSB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRleHQgdG8gcnVuIGJ5LgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3BhcmtDb250ZXh0KFNwYXJrQ29udGV4dCBjb250ZXh0KTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvU3RyZWFtaW5nSW5zdGFuY2UuamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL1N0cmVhbWluZ0luc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwODljMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL1N0cmVhbWluZ0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3Bhcmsuc3RyZWFtaW5nLlN0cmVhbWluZ0NvbnRleHQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgU3RyZWFtaW5nSW5zdGFuY2UgZXh0ZW5kcyBTcGFya0luc3RhbmNlIHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dCB0byBydW4gYnkuCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW1pbmdDb250ZXh0KFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCk7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvTWVzb3NGcmFtZXdvcmtFeGNlcHRpb24uamF2YSBiLzAuMTAvc3RyZWFtaW5nL3Jlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9zdHJ1Y3RzL2V4Y2VwdGlvbnMvTWVzb3NGcmFtZXdvcmtFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ViODNjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3N0cnVjdHMvZXhjZXB0aW9ucy9NZXNvc0ZyYW1ld29ya0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9uczsKKy8qKgorICogQGF1dGhvciBzdGFyY2htZAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIEFuIGV4Y2VwdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1lc29zRnJhbWV3b3JrRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgTWVzb3NGcmFtZXdvcmtFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9NZXNvc1V0aWxpdGllcy5qYXZhIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvTWVzb3NVdGlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjZmYzgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvTWVzb3NVdGlsaXRpZXMuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5WYWx1ZS5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1lc29zLlByb3Rvcy5WYWx1ZS5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlNlcmlhbGl6YXRpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iU3BlY1NlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5tZXNvcy5wcm90b2J1Zi5CeXRlU3RyaW5nOworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNvc1V0aWxpdGllcyB7CisgICAgLyoqCisgICAgICogR2V0IGEgQnl0ZVN0cmluZyBzZXJpYWxpemF0aW9uIG9mIGEgSm9iU3BlYyB0byBzZW5kIG92ZXIgdGhlIHdpcmUgdG8gdGhlIG1lc29zLWJhY2tlbmQuCisgICAgICogQHBhcmFtIGpvYlNwZWMgLSBKb2JTcGVjIHRvIHNlcmlhbGl6ZQorICAgICAqIEByZXR1cm4gYnl0ZXN0cmluZyBjb250YWluaW5nIGJ5dGVbXSBvZiBqb2JzcGVjCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGpvYlNwZWNUb0J5dGVTdHJpbmcoSm9iU3BlYyBqb2JTcGVjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oU2VyaWFsaXphdGlvblV0aWxzLnNlcmlhbGl6ZShuZXcgSm9iU3BlY1NlcmlhbGl6ZXIoam9iU3BlYykpKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQnVpbGQgYSBKb2JTcGVjIGZyb20gYSBCeXRlU3RyaW5nIG9mZiB0aGUgd2lyZQorICAgICAqIEBwYXJhbSBkYXRhIC0gQnl0ZVN0cmluZyB0byBkZXNlcmlhbGl6ZQorICAgICAqIEByZXR1cm4gbmV3bHkgbWludGVkIEpvYlNwZWMKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEpvYlNwZWMgYnl0ZVN0cmluZ1RvSm9iU3BlYyhCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gKChKb2JTcGVjU2VyaWFsaXplcilTZXJpYWxpemF0aW9uVXRpbHMuZGVzZXJpYWxpemUoZGF0YS50b0J5dGVBcnJheSgpKSkuZ2V0Sm9iU3BlYygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSByZXNvdXJjZXMgbGlzdC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIC0gcmVzb3VyY2UgbGlzdCB0byBtYWtlIGludG8gc3RyaW5nLgorICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2UgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZU1lc3NhZ2UoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7CisgICAgICAgIFN0cmluZyByZXQgPSAiIjsKKyAgICAgICAgZm9yIChSZXNvdXJjZSByZXMgOiByZXNvdXJjZXMpCisgICAgICAgICAgICByZXQgKz0gIlxuXHQiK2dldFJlc291cmNlTWVzc2FnZShyZXMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgc3RyaW5nIG91dCBhbiBvZmZlciBpbiBhIG5pY2UgZm9ybWF0LgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAtIG1lc29zIHJlc291cmNlIHRvIG1ha2UgaW50byBzdHJpbmcuCisgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VNZXNzYWdlKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIFR5cGUgdHlwZSA9IHJlc291cmNlLmdldFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIHJldCA9IHJlc291cmNlLmdldE5hbWUoKSArIiAiK3Jlc291cmNlLmdldFJvbGUoKSsgIjogIjsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNDQUxBUjoKKyAgICAgICAgICAgICAgICByZXQgKz0gcmVzb3VyY2UuZ2V0U2NhbGFyKCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFOR0VTOgorICAgICAgICAgICAgICAgIGZvciAoUmFuZ2UgcmFuZ2UgOiByZXNvdXJjZS5nZXRSYW5nZXMoKS5nZXRSYW5nZUxpc3QoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHJhbmdlLmdldEJlZ2luKCkgKyAiIC0gIityYW5nZS5nZXRFbmQoKSsiLCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgcmV0ICs9ICIgVEVYVCB0eXBlLi4uY2Fubm90IGZpbmQuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VUOgorICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0cmluZyA6IHJlc291cmNlLmdldFNldCgpLmdldEl0ZW1MaXN0KCkpCisgICAgICAgICAgICAgICAgICAgIHJldCArPSBzdHJpbmcgKyAiLCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vc2NhbGEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9TY2FsYUhlbGxvV29ybGQuc2NhbGEgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvbWFpbi9zY2FsYS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL2V4YW1wbGVzL1NjYWxhSGVsbG9Xb3JsZC5zY2FsYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2IxYjlhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL21haW4vc2NhbGEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9yZXNvdXJjZS9leGFtcGxlcy9TY2FsYUhlbGxvV29ybGQuc2NhbGEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLmV4YW1wbGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLlNwYXJrSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5OYW1lVmFsdWVKb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLlNwYXJrQ29udGV4dDsKKy8qKgorKiBAYXV0aG9yIHN0YXJjaG1kCisqCisqIEFuIGV4YW1wbGUgY2xhc3MgZm9yIHVzZSB3aXRoIHRoZSBTcGFyayBiYWNrZW5kIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLgorKi8KK2NsYXNzIFNjYWxhSGVsbG9Xb3JsZCBleHRlbmRzIFNwYXJrSW5zdGFuY2UgeworICAgIHZhciBzYyA6IFNwYXJrQ29udGV4dCA9IG51bGw7CisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIGpvYi4KKyAgICAgKi8KKyAgICBkZWYgZXhlY3V0ZShpbnB1dDogSm9iSW5wdXQpIDogQm9vbGVhbiA9IHsKKyAgICAgICAgdmFsIG5hbWUgPSBpbnB1dC5hc0luc3RhbmNlT2ZbTmFtZVZhbHVlSm9iSW5wdXRdLmdldFZhbHVlKCJmaWxlIik7CisgICAgICAgIHZhbCB0ZXh0RmlsZSA9IHNjLnRleHRGaWxlKG5hbWUpOworICAgICAgICB2YWwgbGluZXNXaXRoU3BhcmsgPSB0ZXh0RmlsZS5maWx0ZXIobGluZSA9PiBsaW5lLmNvbnRhaW5zKCJmYW50YXN0aWMiKSk7CisgICAgICAgIHZhciBsbiA9IGxpbmVzV2l0aFNwYXJrLmNvdW50KCk7CisgICAgICAgIHByaW50bG4oIkxpbmUgY291bnQ6ICIrbG4pOworICAgICAgICB0ZXh0RmlsZS5mb3JlYWNoKGxpbmUgPT4gcHJpbnRsbihsaW5lKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwYXJrIGNvbnRleHQuCisgICAgICovCisgICAgZGVmIHNldFNwYXJrQ29udGV4dChjb250ZXh0OiBTcGFya0NvbnRleHQpIHsKKyAgICAgICAgdGhpcy5zYyA9IGNvbnRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvVGVzdE1lc29zVXRpbGl0aWVzLmphdmEgYi8wLjEwL3N0cmVhbWluZy9yZXNvdXJjZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcmVzb3VyY2UvdXRpbC9UZXN0TWVzb3NVdGlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjJkZGEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC9zdHJlYW1pbmcvcmVzb3VyY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Jlc291cmNlL3V0aWwvVGVzdE1lc29zVXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYlNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLk5hbWVWYWx1ZUpvYklucHV0OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnV0aWwuTWVzb3NVdGlsaXRpZXM7CisKKy8vSlVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIHN0YXJjaG1kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBUZXN0IFN1aXRlIGZvciB0aGUge0BsaW5rIE1lc29zVXRpbGl0aWVzfSBjbGFzcworICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXNvc1V0aWxpdGllcyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgeworICAgICAgICBKb2JTcGVjIGpzID0gbmV3IEpvYlNwZWMoKTsKKworICAgICAgICBKb2Igam9iID0gbmV3IEpvYigpOworICAgICAgICBqb2Iuc2V0SWQoImNyYXp5LWlkIik7CisgICAgICAgIGpvYi5zZXRKb2JJbnB1dENsYXNzTmFtZShOYW1lVmFsdWVKb2JJbnB1dC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICBqb2Iuc2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoIkluc3RhbmNlIENsYXNzIik7CisgICAgICAgIGpvYi5zZXRMb2FkVmFsdWUobmV3IEludGVnZXIoMzUyKSk7CisgICAgICAgIGpvYi5zZXROYW1lKCJBIE5hbWUiKTsKKyAgICAgICAgam9iLnNldFF1ZXVlTmFtZSgiUXVldWUiKTsKKyAgICAgICAgam9iLnNldFN0YXR1cygiU3RhdHVzIik7CisKKyAgICAgICAgU3RyaW5nW10gcHJvcHMgPSB7InByb3AtMSIsInByb3AtMiIsInByb3AtMyJ9OworICAgICAgICBOYW1lVmFsdWVKb2JJbnB1dCBudmppID0gbmV3IE5hbWVWYWx1ZUpvYklucHV0KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHN0ciA6IHByb3BzKQorICAgICAgICAgICAgbnZqaS5zZXROYW1lVmFsdWVQYWlyKHN0ciwgc3RyKyJ2YWwiKTsKKworICAgICAgICBqcy5zZXRJbihudmppKTsKKyAgICAgICAganMuc2V0Sm9iKGpvYik7CisKKyAgICAgICAgSm9iU3BlYyBuczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5zID0gTWVzb3NVdGlsaXRpZXMuYnl0ZVN0cmluZ1RvSm9iU3BlYyhNZXNvc1V0aWxpdGllcy5qb2JTcGVjVG9CeXRlU3RyaW5nKGpzKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoanMuZ2V0Sm9iKCkuZ2V0SWQoKSxucy5nZXRKb2IoKS5nZXRJZCgpKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhqcy5nZXRKb2IoKS5nZXRKb2JJbnB1dENsYXNzTmFtZSgpLG5zLmdldEpvYigpLmdldEpvYklucHV0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGpzLmdldEpvYigpLmdldEpvYkluc3RhbmNlQ2xhc3NOYW1lKCksbnMuZ2V0Sm9iKCkuZ2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoanMuZ2V0Sm9iKCkuZ2V0TG9hZFZhbHVlKCksbnMuZ2V0Sm9iKCkuZ2V0TG9hZFZhbHVlKCkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGpzLmdldEpvYigpLmdldE5hbWUoKSxucy5nZXRKb2IoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGpzLmdldEpvYigpLmdldFF1ZXVlTmFtZSgpLG5zLmdldEpvYigpLmdldFF1ZXVlTmFtZSgpKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhqcy5nZXRKb2IoKS5nZXRTdGF0dXMoKSxucy5nZXRKb2IoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoanMuZ2V0SW4oKS5nZXRJZCgpLG5zLmdldEluKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzdHIgOiBwcm9wcykKKyAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobnZqaS5nZXRWYWx1ZShzdHIpLCgoTmFtZVZhbHVlSm9iSW5wdXQpbnMuZ2V0SW4oKSkuZ2V0VmFsdWUoc3RyKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246IitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246IitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb246IitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL2J1aWxkLXJlcy9zdWJmbG9vci1wa2cueG1sIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2J1aWxkLXJlcy9zdWJmbG9vci1wa2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmY5YmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vYnVpbGQtcmVzL3N1YmZsb29yLXBrZy54bWwKQEAgLTAsMCArMSwzNjcgQEAKKzwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NvcHlyaWdodCAoYykgMjAwOSwgUGVudGFobyBFbmdpbmVlcmluZyBUZWFtCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUGVudGFobyBDb3Jwb3JhdGlvbiBub3IgdGhlCisgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUGVudGFobyBFbmdpbmVlcmluZyBUZWFtICcnQVMgSVMnJyBBTkQgQU5ZCitFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Y29weXJpZ2h0IGhvbGRlcj4gQkUgTElBQkxFIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKK09OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgPT0gU1VCRkxPT1ItUEtHID09CisgICAgJFJldjogMTAwICQKKyAgICAkRGF0ZTogMjAwOS0xMi0wOSAxMTo0MzoyNiAtMDUwMCAoV2VkLCAwOSBEZWMgMjAwOSkgJAorICAgIFByb2plY3QgSG9tZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3N1YmZsb29yLworICAgIFByb3ZpZGVzIGRlZmF1bHQgdGFyZ2V0cyBmb3IgY3JlYXRpbmcgYXBwbGljYXRpb24gYXJjaGl2ZXMgc3VjaCBhcyB6aXAgYW5kIHRhci5nemlwCisgICAgZmlsZXMuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8cHJvamVjdCBuYW1lPSJzdWJmbG9vci1wa2ciIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImRlZmF1bHQiIHhtbG5zOml2eT0iYW50bGliOm9yZy5hcGFjaGUuaXZ5LmFudCI+CisKKyAgPCEtLSBEZWZpbmUgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGNvbW1vbiBidWlsZCBmaWxlIC0tPgorICA8cHJvcGVydHkgbmFtZT0ic3ViZmxvb3IuZmlsZSIKKyAgICAgICAgICAgIHZhbHVlPSIuL3N1YmZsb29yLnhtbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhbmRhcmRpemVkIHN1YmZsb29yLnhtbCBmaWxlIiAvPgorCisgIDwhLS0gSW1wb3J0IHRoZSBjb21tb25fYnVpbGQueG1sIGZpbGUgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBkZWZhdWx0IHRhc2tzIC0tPgorICA8aW1wb3J0IGZpbGU9IiR7c3ViZmxvb3IuZmlsZX0iIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9InN0YWdlLmRpciIgdmFsdWU9IiR7YmluLmRpcn0vc3RhZ2UiIGRlc2NyaXB0aW9uPSJQYWNrYWdlIHN0YWdpbmciIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlLnJvb3QuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7aXZ5LmFydGlmYWN0LmlkfSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb290IGRpcmVjdG9yeSBvZiBmaW5hbCB6aXAgb3IgdGFyIHBhY2thZ2UiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJhcHByb290LnN0YWdlLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke3N0YWdlLmRpcn0vJHtwYWNrYWdlLnJvb3QuZGlyfSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFnZSBhcHBsaWNhdGlvbiByb290IGRpciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InBhY2thZ2UuaWQiIHZhbHVlPSIke2l2eS5hcnRpZmFjdC5pZH0iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlLmJhc2VuYW1lIiB2YWx1ZT0iJHtwYWNrYWdlLmlkfS0ke3Byb2plY3QucmV2aXNpb259IiAvPgorICA8cHJvcGVydHkgbmFtZT0icGFja2FnZS5yZXNkaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3BhY2thZ2UtcmVzIiAvPgorICA8cHJvcGVydHkgbmFtZT0icGFja2FnZS5hcnRpZmFjdC5pdnlmaWxlIgorICAgICAgICAgICAgdmFsdWU9InBhY2thZ2UtaXZ5LnhtbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgaXZ5IGZpbGUgZGVmaW5pbmcgZGVwZW5kZW5jaWVzIG9mIHRoZSBwYWNrYWdlIiAvPgorICA8cHJvcGVydHkgbmFtZT0icGFja2FnZS5hcnRpZmFjdC5wb21maWxlIgorICAgICAgICAgICAgdmFsdWU9InBhY2thZ2UtcG9tLnhtbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgTWF2ZW4gcG9tIGZpbGUgZGVmaW5pbmcgZGVwZW5kZW5jaWVzIG9mIHRoZSBwYWNrYWdlIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iamFyLHBhY2thZ2UiIGRlc2NyaXB0aW9uPSJCdWlsZHMgYW5kIHBhY2thZ2VzIHRoZSBhcHBsaWNhdGlvbiIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWRpc3QiPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3QuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtzdGFnZS5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8IS0tIG92ZXJyaWRlIG9mIGphciB0YXJnZXQuLiB0aGlzIGRlZmluaXRlbHkgc2hvdWxkIGJlIG1vdmVkIGludG8gY29tbW9uIGJ1aWxkIC0tPgorICA8dGFyZ2V0IG5hbWU9ImphciIKKyAgICAgICAgICBkZXBlbmRzPSJjb21waWxlLHNldC1idWlsZC5pZCxjcmVhdGUtdmVyc2lvbi1maWxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJKYXJzIHVwIHRoZSBiaW4gZGlyZWN0b3J5IGFmdGVyIGEgY29tcGlsZSI+CisgICAgPGphciBkZXN0ZmlsZT0iJHtkaXN0LmRpcn0vJHtpdnkuYXJ0aWZhY3QuaWR9LSR7cHJvamVjdC5yZXZpc2lvbn0uamFyIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1UaXRsZSIgdmFsdWU9IiR7aW1wbC50aXRsZX0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7cHJvamVjdC5yZXZpc2lvbn0uJHtidWlsZC5pZH0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVuZG9yIiB2YWx1ZT0iJHtpbXBsLnZlbmRvcn0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tUHJvZHVjdElEIiB2YWx1ZT0iJHtpbXBsLnByb2R1Y3RJRH0iIC8+CisgICAgICA8L21hbmlmZXN0PgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSIgLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjcmVhdGUtdmVyc2lvbi1maWxlIj4KKyAgICA8cHJvcGVydHlmaWxlIGZpbGU9IiR7Y2xhc3Nlcy5kaXJ9L3ZlcnNpb24ucHJvcGVydGllcyIgY29tbWVudD0iJHtpbXBsLnRpdGxlfSBidWlsZCBpbmZvcm1hdGlvbiI+CisgICAgICA8ZW50cnkga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHtwcm9qZWN0LnJldmlzaW9ufS4ke2J1aWxkLmlkfSIgLz4KKyAgICAgIDxlbnRyeSBrZXk9ImJ1aWxkZGF0ZSIgdHlwZT0iZGF0ZSIgdmFsdWU9Im5vdyIgLz4KKyAgICA8L3Byb3BlcnR5ZmlsZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5pbml0Ij4KKyAgICA8bWtkaXIgZGlyPSIke2FwcHJvb3Quc3RhZ2UuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhc3NlbWJsZSIgZGVwZW5kcz0iYXNzZW1ibGUuaW5pdCxhc3NlbWJsZS5jb3B5LWxpYnMiPgorICAgIDxjb3B5IHRvZGlyPSIke2FwcHJvb3Quc3RhZ2UuZGlyfSIgb3ZlcndyaXRlPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtwYWNrYWdlLnJlc2Rpcn0iIC8+CisgICAgPC9jb3B5PgorICAgIDxjaG1vZCBwZXJtPSJhK3giIGRpcj0iJHtzdGFnZS5kaXJ9IiBpbmNsdWRlcz0iKiovKi5zaCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5jb3B5LWxpYnMiPgorICAgIDxjb3B5IHRvZGlyPSIke2FwcHJvb3Quc3RhZ2UuZGlyfS9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9IiAvPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHtkaXN0LmRpcn0vJHtpdnkuYXJ0aWZhY3QuaWR9LSR7cHJvamVjdC5yZXZpc2lvbn0uamFyIiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwYWNrYWdlIgorICAgICAgICAgIGRlcGVuZHM9ImFzc2VtYmxlLHBhY2thZ2UtemlwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGVzIHBhY2thZ2VkIGRpc3RyaWJ1dGFibGUgYXJ0aWZhY3RzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0icGFja2FnZS16aXAiPgorICAgIDx6aXAgZGVzdGZpbGU9IiR7ZGlzdC5kaXJ9LyR7cGFja2FnZS5iYXNlbmFtZX0uemlwIj4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtzdGFnZS5kaXJ9IiBmaWxlbW9kZT0iNzU1Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5zaCIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovSmF2YUFwcGxpY2F0aW9uU3R1YiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jb21tYW5kIiAvPgorICAgICAgPC96aXBmaWxlc2V0PgorICAgICAgPHppcGZpbGVzZXQgZGlyPSIke3N0YWdlLmRpcn0iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLnNoIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KYXZhQXBwbGljYXRpb25TdHViIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmNvbW1hbmQiIC8+CisgICAgICA8L3ppcGZpbGVzZXQ+CisgICAgPC96aXA+CisgIDwvdGFyZ2V0PgorICAKKworICAKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PWxpbnV4UGFja2FnZT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJsaW51eFBhY2thZ2UubmFtZSIgdmFsdWU9InBlbnRhaG8tJHtwYWNrYWdlLmlkfSIgLz4KKworICA8cHJvcGVydHkgbmFtZT0ibGludXhQYWNrYWdlLmxvbmdOYW1lIiB2YWx1ZT0iJHtpbXBsLnRpdGxlfSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImxpbnV4UGFja2FnZS5kZXNjcmlwdGlvbiIgdmFsdWU9IiR7aW1wbC50aXRsZX0iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaW51eFBhY2thZ2UucmVsZWFzZSIgdmFsdWU9IjEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaW51eFBhY2thZ2UuaW5pdGQuc3RhcnRDb21tYW5kRGVsZWdhdGVlIiB2YWx1ZT0ic3RhcnQucGVudGFoby5zaCIgCisgICAgZGVzY3JpcHRpb249ImluaXQuZCBzY3JpcHQgd2lsbCBkZWxlZ2F0ZSB0byB0aGlzIHNjcmlwdCBsb2NhdGVkIGluIC9vcHQvcGVudGFoby8ke2xpbnV4UGFja2FnZS5uYW1lfSIgLz4KKworICA8cHJvcGVydHkgbmFtZT0ibGludXhQYWNrYWdlLmluaXRkLnN0b3BDb21tYW5kRGVsZWdhdGVlIiB2YWx1ZT0ic3RvcC5wZW50YWhvLnNoIiAKKyAgICBkZXNjcmlwdGlvbj0iaW5pdC5kIHNjcmlwdCB3aWxsIGRlbGVnYXRlIHRvIHRoaXMgc2NyaXB0IGxvY2F0ZWQgaW4gL29wdC9wZW50YWhvLyR7bGludXhQYWNrYWdlLm5hbWV9IiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJsaW51eFBhY2thZ2UuaW5pdGQucHJvY2Vzc05hbWUiIHZhbHVlPSJjYXRhbGluYSIgCisgICAgZGVzY3JpcHRpb249InN0cmluZyB0aGF0IG11c3QgYmUgcHJlc2VudCB0byBwcm92ZSBwaWQgaXMgbm90IHN0YWxlOyBzZWUgaW5pdC5kIHNjcmlwdCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImxpbnV4UGFja2FnZS5yZXMuZGlyIiB2YWx1ZT0ibGludXgtcmVzIiBkZXNjcmlwdGlvbj0iRGlyZWN0b3J5IHdpdGggTGludXggcGFja2FnZSByZXNvdXJjZXMuIiAvPgorICA8ZmlsdGVyc2V0IGJlZ2ludG9rZW49IltbWyIgZW5kdG9rZW49Il1dXSIgaWQ9ImxpbnV4UGFja2FnZS5maWx0ZXJzZXQiPgorICAgIDxmaWx0ZXIgdG9rZW49ImxpbnV4UGFja2FnZS5pbml0ZC5zdGFydENvbW1hbmREZWxlZ2F0ZWUiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5pbml0ZC5zdGFydENvbW1hbmREZWxlZ2F0ZWV9IiAvPgorICAgIDxmaWx0ZXIgdG9rZW49ImxpbnV4UGFja2FnZS5pbml0ZC5zdG9wQ29tbWFuZERlbGVnYXRlZSIgdmFsdWU9IiR7bGludXhQYWNrYWdlLmluaXRkLnN0b3BDb21tYW5kRGVsZWdhdGVlfSIgLz4KKyAgICA8ZmlsdGVyIHRva2VuPSJsaW51eFBhY2thZ2UuaW5pdGQucHJvY2Vzc05hbWUiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5pbml0ZC5wcm9jZXNzTmFtZX0iIC8+CisgICAgPGZpbHRlciB0b2tlbj0ibGludXhQYWNrYWdlLm5hbWUiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5uYW1lfSIgLz4KKyAgICA8ZmlsdGVyIHRva2VuPSJsaW51eFBhY2thZ2UubG9uZ05hbWUiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5sb25nTmFtZX0iIC8+CisgIDwvZmlsdGVyc2V0PgorICA8IS0tIHByZXBhcmVzIERlYmlhbiBjb250cm9sIGZpbGUgYW5kIHNjcmlwdHMgc2hhcmVkIGJ5IERFQiBhbmQgUlBNIC0tPgorICA8dGFyZ2V0IG5hbWU9ImxpbnV4UGFja2FnZS1wcmVwYXJlLWNvbnRyb2wiPgorICAgIDxjb3B5IHRvZGlyPSIke2xpbnV4UGFja2FnZS5zdGFnZS5kaXJ9L2NvbnRyb2wiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7bGludXhQYWNrYWdlLnJlcy5kaXJ9L2NvbnRyb2wiIC8+CisgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSJsaW51eFBhY2thZ2UuZmlsdGVyc2V0IiAvPgorICAgICAgPGZpbHRlcnNldCByZWZpZD0iJHtsaW51eFBhY2thZ2UuZXh0cmFGaWx0ZXJzZXR9IiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisgIDwhLS0gcHJlcGFyZXMgYWN0dWFsIGZpbGVzIHRvIGJlIGluc3RhbGxlZCBzaGFyZWQgYnkgREVCIGFuZCBSUE0gLS0+CisgIDx0YXJnZXQgbmFtZT0ibGludXhQYWNrYWdlLXByZXBhcmUtZGF0YSI+CisgICAgPG1rZGlyIGRpcj0iJHtsaW51eFBhY2thZ2Uuc3RhZ2UuZGlyfS9kYXRhL29wdC9wZW50YWhvLyR7bGludXhQYWNrYWdlLm5hbWV9IiAvPgorCisgICAgPGFudGNhbGwgdGFyZ2V0PSJsaW51eFBhY2thZ2UtY29weS1maWxlcyI+CisgICAgICA8cGFyYW0gbmFtZT0ibGludXhQYWNrYWdlLmRhdGFEaXIiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5zdGFnZS5kaXJ9L2RhdGEiIC8+CisgICAgICA8cGFyYW0gbmFtZT0ibGludXhQYWNrYWdlLnBhY2thZ2VGb3JtYXQiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5wYWNrYWdlRm9ybWF0fSIgLz4KKyAgICA8L2FudGNhbGw+CisgICAgPGNvcHkgdG9kaXI9IiR7bGludXhQYWNrYWdlLnN0YWdlLmRpcn0vZGF0YSIgb3ZlcndyaXRlPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaW51eFBhY2thZ2UucmVzLmRpcn0vZGF0YSIgLz4KKyAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9ImxpbnV4UGFja2FnZS5maWx0ZXJzZXQiIC8+CisgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSIke2xpbnV4UGFja2FnZS5leHRyYUZpbHRlcnNldH0iIC8+CisgICAgPC9jb3B5PgorICAgIDwhLS0gaWYgYW55IGZpbGVzIG5hbWVkIF9fcGFja2FnZS5uYW1lX18sIHJlbmFtZSB0aGVtLS0+CisKKyAgICA8aWY+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7bGludXhQYWNrYWdlLnN0YWdlLmRpcn0vZGF0YS9ldGMvaW5pdC5kL19fcGFja2FnZS5uYW1lX18iIHR5cGU9ImZpbGUiIC8+CisgICAgICA8dGhlbj4KKyAgICAgICAgPG1vdmUgZmlsZT0iJHtsaW51eFBhY2thZ2Uuc3RhZ2UuZGlyfS9kYXRhL2V0Yy9pbml0LmQvX19wYWNrYWdlLm5hbWVfXyIgdG9maWxlPSIke2xpbnV4UGFja2FnZS5zdGFnZS5kaXJ9L2RhdGEvZXRjL2luaXQuZC8ke2xpbnV4UGFja2FnZS5uYW1lfSIgLz4KKyAgICAgIDwvdGhlbj4KKyAgICA8L2lmPgorICAgIDxpZj4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtsaW51eFBhY2thZ2Uuc3RhZ2UuZGlyfS9kYXRhL29wdC9wZW50YWhvL19fcGFja2FnZS5uYW1lX18iIHR5cGU9ImRpciIgLz4KKyAgICAgIDx0aGVuPgorICAgICAgICA8bW92ZSBmaWxlPSIke2xpbnV4UGFja2FnZS5zdGFnZS5kaXJ9L2RhdGEvb3B0L3BlbnRhaG8vX19wYWNrYWdlLm5hbWVfXyIgdG9maWxlPSIke2xpbnV4UGFja2FnZS5zdGFnZS5kaXJ9L2RhdGEvb3B0L3BlbnRhaG8vJHtsaW51eFBhY2thZ2UubmFtZX0iIC8+CisgICAgICA8L3RoZW4+CisgICAgPC9pZj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBvdmVycmlkZSBpZiBuZWNlc3NhcnkgLS0+CisgIDx0YXJnZXQgbmFtZT0ibGludXhQYWNrYWdlLWNvcHktZmlsZXMiPgorICAgIDxlY2hvPkNvcHlpbmcgZmlsZXMgZm9yIExpbnV4IHBhY2thZ2UgZm9ybWF0OiAke2xpbnV4UGFja2FnZS5wYWNrYWdlRm9ybWF0fTwvZWNobz4KKyAgICA8Y29weSB0b2Rpcj0iJHtsaW51eFBhY2thZ2UuZGF0YURpcn0vb3B0L3BlbnRhaG8vJHtsaW51eFBhY2thZ2UubmFtZX0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3N0YWdlLmRpcn0vJHtwYWNrYWdlLmlkfSIgLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ZGViPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHByb3BlcnR5IG5hbWU9ImRlYi5sb25nTmFtZSIgdmFsdWU9IiR7bGludXhQYWNrYWdlLmxvbmdOYW1lfSIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iZGViLm5hbWUiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5uYW1lfSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRlYi5hcmNoIgorICAgICAgICAgICAgdmFsdWU9ImFsbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPbmUgb2YgaTM4NiwgYW1kNjQsIG9yIGFsbC4iIC8+CisKKyA8cHJvcGVydHkgbmFtZT0iZGViLm1haW50YWluZXIiIHZhbHVlPSJidWlsZGd1eSAmbHQ7YnVpbGRndXlAcGVudGFoby5jb20mZ3Q7IiAvPgorICA8cHJvcGVydHkgbmFtZT0iZGViLmRlc2MiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5kZXNjcmlwdGlvbn0iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWIucmVsZWFzZSIgdmFsdWU9IiR7bGludXhQYWNrYWdlLnJlbGVhc2V9IiAvPgorICA8cHJvcGVydHkgbmFtZT0iZGViLnN0YWdlLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2Jpbi5kaXJ9L2RlYi1zdGFnZSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFnaW5nIGRpcmVjdG9yeSBmb3IgRGViaWFuIHBhY2thZ2UgY3JlYXRpb24uIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJkZWIucmVzLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2xpbnV4UGFja2FnZS5yZXMuZGlyfSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWJpYW4gcGFja2FnZSByZXNvdXJjZXMuIiAvPgorICA8ZmlsdGVyc2V0IGJlZ2ludG9rZW49IltbWyIgZW5kdG9rZW49Il1dXSIgaWQ9ImRlYi5maWx0ZXJzZXQiPgorICAgIDxmaWx0ZXIgdG9rZW49ImRlYi5uYW1lIiB2YWx1ZT0iJHtkZWIubmFtZX0iIC8+CisgICAgPGZpbHRlciB0b2tlbj0iZGViLnZlcnNpb24iIHZhbHVlPSIke3Byb2plY3QucmV2aXNpb259LSR7ZGViLnJlbGVhc2V9IiAvPgorICAgIDxmaWx0ZXIgdG9rZW49ImRlYi5sb25nTmFtZSIgdmFsdWU9IiR7ZGViLmxvbmdOYW1lfSIgLz4KKyAgICA8ZmlsdGVyIHRva2VuPSJkZWIuYXJjaCIgdmFsdWU9IiR7ZGViLmFyY2h9IiAvPgorICAgIDxmaWx0ZXIgdG9rZW49ImRlYi5kZXNjIiB2YWx1ZT0iJHtkZWIuZGVzY30iIC8+CisgICAgPGZpbHRlciB0b2tlbj0iZGViLm1haW50YWluZXIiIHZhbHVlPSIke2RlYi5tYWludGFpbmVyfSIgLz4KKyAgPC9maWx0ZXJzZXQ+CisgIDwhLS0gamRlYiBpcyBjcm9zcy1wbGF0Zm9ybSBEZWJpYW4gcGFja2FnZSB0b29sIC0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtamRlYiIgZGVwZW5kcz0iaW5zdGFsbC1pdnkiPgorICAgIDx0YXNrZGVmLXdpdGgtaXZ5IHRhc2stbmFtZT0iamRlYiIgY2xhc3NuYW1lPSJvcmcudmFmZXIuamRlYi5hbnQuRGViQW50VGFzayIgb3JnYW5pc2F0aW9uPSJvcmcudmFmZXIiIG1vZHVsZT0iamRlYiIgCisgICAgICByZXZpc2lvbj0iMC44IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InBhY2thZ2UtZGViIiBkZXBlbmRzPSJpbnN0YWxsLWpkZWIiIGRlc2NyaXB0aW9uPSJDcmVhdGVzIERlYmlhbiBwYWNrYWdlLiI+CisKKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImxpbnV4UGFja2FnZS1wcmVwYXJlLWNvbnRyb2wiPgorICAgICAgPHBhcmFtIG5hbWU9ImxpbnV4UGFja2FnZS5zdGFnZS5kaXIiIHZhbHVlPSIke2RlYi5zdGFnZS5kaXJ9IiAvPgorICAgICAgPHBhcmFtIG5hbWU9ImxpbnV4UGFja2FnZS5yZXMuZGlyIiB2YWx1ZT0iJHtkZWIucmVzLmRpcn0iIC8+CisgICAgICA8cGFyYW0gbmFtZT0ibGludXhQYWNrYWdlLmV4dHJhRmlsdGVyc2V0IiB2YWx1ZT0iZGViLmZpbHRlcnNldCIgLz4KKyAgICA8L2FudGNhbGw+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJsaW51eFBhY2thZ2UtcHJlcGFyZS1kYXRhIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJsaW51eFBhY2thZ2Uuc3RhZ2UuZGlyIiB2YWx1ZT0iJHtkZWIuc3RhZ2UuZGlyfSIgLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJsaW51eFBhY2thZ2UucmVzLmRpciIgdmFsdWU9IiR7ZGViLnJlcy5kaXJ9IiAvPgorICAgICAgPHBhcmFtIG5hbWU9ImxpbnV4UGFja2FnZS5leHRyYUZpbHRlcnNldCIgdmFsdWU9ImRlYi5maWx0ZXJzZXQiIC8+CisgICAgICA8cGFyYW0gbmFtZT0ibGludXhQYWNrYWdlLnBhY2thZ2VGb3JtYXQiIHZhbHVlPSJkZWIiIC8+CisgICAgPC9hbnRjYWxsPgorICAgIDwhLS0gdGFyIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGNyZWF0aW5nIGV4ZWN1dGUgYml0IC0tPgorICAgIDx0YXIgZGVzdGZpbGU9IiR7ZGViLnN0YWdlLmRpcn0vZGF0YS50YXIuZ3oiIGxvbmdmaWxlPSJnbnUiIGNvbXByZXNzaW9uPSJnemlwIj4KKyAgICAgIDx0YXJmaWxlc2V0IGRpcj0iJHtkZWIuc3RhZ2UuZGlyfS9kYXRhIiBtb2RlPSI3NTUiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnNoIiAvPgorICAgICAgPC90YXJmaWxlc2V0PgorICAgICAgPHRhcmZpbGVzZXQgZGlyPSIke2RlYi5zdGFnZS5kaXJ9L2RhdGEiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLnNoIiAvPgorICAgICAgPC90YXJmaWxlc2V0PgorICAgIDwvdGFyPgorICAgIDwhLS0gZG8gbm90IGNoYW5nZSB0aGlzIHBhY2thZ2UgbmFtZTsgaXQgaXMgY29uc2lzdGVudCB3aXRoIERlYmlhbiBwYWNrYWdlIG5hbWluZyBjb252ZW50aW9ucyAtLT4KKyAgICA8IS0tIHRoZSAxIGJlbG93IGlzIHRoZSBEZWJpYW4gcmV2aXNpb24gbnVtYmVyLCB3aGljaCBtYXkgY2hhbmdlIGlmIG9ubHkgdGhlIGNvbnRyb2wgZmlsZXMgYXJlIGNoYW5nZWQgLS0+CisgICAgPCEtLSBodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL21hbnVhbHMvZGViaWFuLWZhcS9jaC1wa2dfYmFzaWNzLmh0bWwgLS0+CisgICAgPGpkZWIgZGVzdGZpbGU9IiR7ZGlzdC5kaXJ9LyR7ZGViLm5hbWV9XyR7cHJvamVjdC5yZXZpc2lvbn0tJHtkZWIucmVsZWFzZX1fJHtkZWIuYXJjaH0uZGViIgorICAgICAgICBjb250cm9sPSIke2RlYi5zdGFnZS5kaXJ9L2NvbnRyb2wiPgorICAgICAgPGRhdGEgc3JjPSIke2RlYi5zdGFnZS5kaXJ9L2RhdGEudGFyLmd6IiB0eXBlPSJhcmNoaXZlIiAvPgorICAgIDwvamRlYj4KKyAgPC90YXJnZXQ+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09cnBtPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8cHJvcGVydHkgbmFtZT0icnBtLm5hbWUiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5uYW1lfSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InJwbS5hcmNoIgorICAgICAgICAgICAgdmFsdWU9Ik5PQVJDSCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPbmUgb2YgSTM4NiwgWDg2XzY0LCBvciBOT0FSQ0guIENhc2UgbWF0dGVycy4iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJycG0uZ3JvdXAiIHZhbHVlPSJTeXN0ZW0gRW52aXJvbm1lbnQvRGFlbW9ucyIgZGVzY3JpcHRpb249Ikdyb3VwIGZvciBSUE0gc3BlYyBmaWxlLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InJwbS5zdW1tYXJ5IiB2YWx1ZT0iJHtsaW51eFBhY2thZ2UuZGVzY3JpcHRpb259IiBkZXNjcmlwdGlvbj0iU3VtbWFyeSBmb3IgUlBNIHNwZWMgZmlsZS4iIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9InJwbS5zdGFnZS5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtiaW4uZGlyfS9ycG0tc3RhZ2UiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhZ2luZyBkaXJlY3RvcnkgZm9yIFJQTSBwYWNrYWdlIGNyZWF0aW9uLiIgLz4KKworICA8cHJvcGVydHkgbmFtZT0icnBtLnJlcy5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtsaW51eFBhY2thZ2UucmVzLmRpcn0iCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUlBNIHBhY2thZ2UgcmVzb3VyY2VzLiIgLz4KKyAgPGZpbHRlcnNldCBiZWdpbnRva2VuPSJbW1siIGVuZHRva2VuPSJdXV0iIGlkPSJycG0uZmlsdGVyc2V0Ij4KKyAgPC9maWx0ZXJzZXQ+CisgIDwhLS0gcmVkbGluZSBpcyBjcm9zcy1wbGF0Zm9ybSBSUE0gcGFja2FnZSB0b29sIC0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtcmVkbGluZSIgZGVwZW5kcz0iaW5zdGFsbC1pdnkiPgorICAgIDx0YXNrZGVmLXdpdGgtaXZ5IHRhc2stbmFtZT0icmVkbGluZSIgY2xhc3NuYW1lPSJvcmcuZnJlZWNvbXBhbnkucmVkbGluZS5hbnQuUmVkbGluZVRhc2siIG9yZ2FuaXNhdGlvbj0ib3JnLnJlZGxpbmUtcnBtIiBtb2R1bGU9InJlZGxpbmUiIAorICAgICAgcmV2aXNpb249IjEuMS45IiAvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJwYWNrYWdlLXJwbSIgZGVwZW5kcz0iaW5zdGFsbC1yZWRsaW5lIj4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImxpbnV4UGFja2FnZS1wcmVwYXJlLWNvbnRyb2wiPgorICAgICAgPHBhcmFtIG5hbWU9ImxpbnV4UGFja2FnZS5zdGFnZS5kaXIiIHZhbHVlPSIke3JwbS5zdGFnZS5kaXJ9IiAvPgorICAgICAgPHBhcmFtIG5hbWU9ImxpbnV4UGFja2FnZS5yZXMuZGlyIiB2YWx1ZT0iJHtycG0ucmVzLmRpcn0iIC8+CisgICAgICA8cGFyYW0gbmFtZT0ibGludXhQYWNrYWdlLmV4dHJhRmlsdGVyc2V0IiB2YWx1ZT0icnBtLmZpbHRlcnNldCIgLz4KKyAgICA8L2FudGNhbGw+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJsaW51eFBhY2thZ2UtcHJlcGFyZS1kYXRhIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJsaW51eFBhY2thZ2Uuc3RhZ2UuZGlyIiB2YWx1ZT0iJHtycG0uc3RhZ2UuZGlyfSIgLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJsaW51eFBhY2thZ2UucmVzLmRpciIgdmFsdWU9IiR7cnBtLnJlcy5kaXJ9IiAvPgorICAgICAgPHBhcmFtIG5hbWU9ImxpbnV4UGFja2FnZS5leHRyYUZpbHRlcnNldCIgdmFsdWU9InJwbS5maWx0ZXJzZXQiIC8+CisgICAgICA8cGFyYW0gbmFtZT0ibGludXhQYWNrYWdlLnBhY2thZ2VGb3JtYXQiIHZhbHVlPSJycG0iIC8+CisgICAgPC9hbnRjYWxsPgorICAgIDwhLS0gdG8gYWRoZXJlIHRvIG5hbWluZyBjb252ZW50aW9ucywgdmVyc2lvbiBudW1iZXIgY2Fubm90IGNvbnRhaW4gZGFzaCAtLT4KKyAgICA8IS0tIGh0dHA6Ly93d3cucnBtLm9yZy9tYXgtcnBtL2NoLXJwbS1maWxlLWZvcm1hdC5odG1sIC0tPgorICAgIDxwcm9wZXJ0eXJlZ2V4IHByb3BlcnR5PSJycG0udmVyc2lvbiIgaW5wdXQ9IiR7cHJvamVjdC5yZXZpc2lvbn0iIHJlZ2V4cD0iLSIgcmVwbGFjZT0iXyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icnBtLnJlbGVhc2UiIHZhbHVlPSIke2xpbnV4UGFja2FnZS5yZWxlYXNlfSIgLz4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZS1ycG0iPjwvYW50Y2FsbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjcmVhdGUtcnBtIj4KKyAgICA8IS0tIHRoZXNlIHRhcmZpbGVzZXRzIGNhbiBiZSBvdmVycmlkZGVuIC0tPgorICAgIDwhLS0geW91IGNhbid0IGp1c3QgaW5jbHVkZSBldmVyeXRoaW5nIGluICR7cnBtLnN0YWdlLmRpcn0vZGF0YSB3aXRob3V0IGEgcHJlZml4OyBycG0gd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBwYXRoIAorICAgICAgICAgYWxyZWFkeSBleGlzdHM7IHRoZSBwcmVmaXhlcyBoZXJlIGFyZSBwYXRocyB0aGF0IGFyZSBleHBlY3RlZCB0byBhbHJlYWR5IGV4aXN0IGFuZCB0aHVzIHNob3VsZCBub3QgYmUgY3JlYXRlZAorICAgICAgICAgYnkgdGhpcyBwYWNrYWdlIC0tPgorICAgIDx0YXJmaWxlc2V0IGVycm9yb25taXNzaW5nZGlyPSJmYWxzZSIgcHJlZml4PSIvZXRjL2luaXQuZCIgZGlyPSIke3JwbS5zdGFnZS5kaXJ9L2RhdGEvZXRjL2luaXQuZCIgaWQ9InJwbS50YXJmaWxlc2V0MSIgLz4KKyAgICA8dGFyZmlsZXNldCBlcnJvcm9ubWlzc2luZ2Rpcj0iZmFsc2UiIHByZWZpeD0iL29wdCIgZGlyPSIke3JwbS5zdGFnZS5kaXJ9L2RhdGEvb3B0IiBpZD0icnBtLnRhcmZpbGVzZXQyIiAvPgorICAgIDx0YXJmaWxlc2V0IGVycm9yb25taXNzaW5nZGlyPSJmYWxzZSIgcHJlZml4PSIvdmFyL3J1biIgZGlyPSIke3JwbS5zdGFnZS5kaXJ9L2RhdGEvdmFyL3J1biIgaWQ9InJwbS50YXJmaWxlc2V0MyIgLz4KKyAgICA8dGFyZmlsZXNldCBlcnJvcm9ubWlzc2luZ2Rpcj0iZmFsc2UiIGRpcj0iJHtycG0uc3RhZ2UuZGlyfS9kYXRhIiBpbmNsdWRlcz0iZG9lc25vdGV4aXN0IiBpZD0icnBtLnRhcmZpbGVzZXQ0IiAvPgorICAgIDx0YXJmaWxlc2V0IGVycm9yb25taXNzaW5nZGlyPSJmYWxzZSIgZGlyPSIke3JwbS5zdGFnZS5kaXJ9L2RhdGEiIGluY2x1ZGVzPSJkb2Vzbm90ZXhpc3QiIGlkPSJycG0udGFyZmlsZXNldDUiIC8+CisgICAgPHJlZGxpbmUgYXJjaGl0ZWN0dXJlPSIke3JwbS5hcmNofSIgZ3JvdXA9IiR7cnBtLmdyb3VwfSIgbmFtZT0iJHtycG0ubmFtZX0iIHZlcnNpb249IiR7cnBtLnZlcnNpb259IiAKKyAgICAgIHBvc3RJbnN0YWxsU2NyaXB0PSIke3JwbS5zdGFnZS5kaXJ9L2NvbnRyb2wvcG9zdGluc3QiIHByZVVuaW5zdGFsbFNjcmlwdD0iJHtycG0uc3RhZ2UuZGlyfS9jb250cm9sL3ByZXJtIiAKKyAgICAgIGRlc3RpbmF0aW9uPSIke2Rpc3QuZGlyfSIgc3VtbWFyeT0iJHtycG0uc3VtbWFyeX0iIHJlbGVhc2U9IiR7cnBtLnJlbGVhc2V9Ij4KKyAgICAgIDx0YXJmaWxlc2V0IHJlZmlkPSJycG0udGFyZmlsZXNldDEiIC8+CisgICAgICA8dGFyZmlsZXNldCByZWZpZD0icnBtLnRhcmZpbGVzZXQyIiAvPgorICAgICAgPHRhcmZpbGVzZXQgcmVmaWQ9InJwbS50YXJmaWxlc2V0MyIgLz4KKyAgICAgIDx0YXJmaWxlc2V0IHJlZmlkPSJycG0udGFyZmlsZXNldDQiIC8+CisgICAgICA8dGFyZmlsZXNldCByZWZpZD0icnBtLnRhcmZpbGVzZXQ1IiAvPgorICAgIDwvcmVkbGluZT4KKyAgPC90YXJnZXQ+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjcmVhdGUtcG9tIChvdmVycmlkZSkKKyAgICAgIENyZWF0ZXMgdGhlIFBPTSBmaWxlcyBmb3IgcHVibGlzaGluZyB0aGUgamFyIGFuZCBnd3QgemlwIHBhY2thZ2UgdG8gdGhlIE1hdmVuIHJlcG9zaXRvcnkKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY3JlYXRlLXBvbSIKKyAgICAgICAgICBkZXBlbmRzPSJpbnN0YWxsLWl2eSxzdWJmbG9vci5jcmVhdGUtcG9tLGNyZWF0ZS1wYWNrYWdlLXBvbSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlcyBhIFBPTSBmaWxlIGJhc2VkIG9uIHRoZSBpdnkgZGVwZW5kZW5jaWVzIiAvPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY3JlYXRlLXBhY2thZ2UtcG9tIAorICAgICAgQ3JlYXRlcyBhIFBPTSBmaWxlIGZvciB0aGUgcGFja2FnZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjcmVhdGUtcGFja2FnZS1wb20iCisgICAgICAgICAgZGVwZW5kcz0iaW5zdGFsbC1pdnkiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZXMgYSBQT00gZmlsZSBiYXNlZCBvbiB0aGUgaXZ5IGRlcGVuZGVuY2llcyBmb3IgYSBzZXBhcmF0ZSBwYWNrYWdlIj4KKyAgICA8aXZ5Om1ha2Vwb20gaXZ5ZmlsZT0iJHtwYWNrYWdlLmFydGlmYWN0Lml2eWZpbGV9IiBwb21maWxlPSIke3BhY2thZ2UuYXJ0aWZhY3QucG9tZmlsZX0iIC8+CisgICAgPHJlcGxhY2UgZmlsZT0iJHtwYWNrYWdlLmFydGlmYWN0LnBvbWZpbGV9IiB0b2tlbj0iamFyIiB2YWx1ZT0iemlwIiAvPgorICA8L3RhcmdldD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIHB1Ymxpc2gtbm9qYXIgKG92ZXJyaWRlKQorICAgICAgUHVibGlzaGVzIHRoZSBqYXIgYW5kIHppcCBwYWNrYWdlIHRvIHRoZSBNYXZlbiByZXBvc2l0b3J5CisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9InB1Ymxpc2gtbm9qYXIiIGRlcGVuZHM9Imluc3RhbGwtYW50Y29udHJpYixjcmVhdGUtcG9tLGl2eS5kZWxpdmVyLHN1YmZsb29yLnB1Ymxpc2gtbm9qYXIiPgorCisgICAgPGFudGNhbGwgdGFyZ2V0PSJtYXZlbi1wdWJsaXNoLWFydGlmYWN0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJwdWJsaXNoLnBvbUZpbGUiIHZhbHVlPSIke3BhY2thZ2UuYXJ0aWZhY3QucG9tZmlsZX0iIC8+CisgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5maWxlIiB2YWx1ZT0iJHtkaXN0LmRpcn0vJHtwYWNrYWdlLmJhc2VuYW1lfS56aXAiIC8+CisgICAgPC9hbnRjYWxsPgorICA8L3RhcmdldD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIHB1Ymxpc2gtbG9jYWwtbm9qYXIgKG92ZXJyaWRlKQorICAgICAgUHVibGlzaGVzIGphciBhbmQgemlwIHBhY2thZ2UgbG9jYWxseQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJwdWJsaXNoLWxvY2FsLW5vamFyIiBkZXBlbmRzPSJpbnN0YWxsLWl2eSxzdWJmbG9vci5wdWJsaXNoLWxvY2FsLW5vamFyIj4KKyAgICA8aXZ5OnJlc29sdmUgZmlsZT0iJHtwYWNrYWdlLmFydGlmYWN0Lml2eWZpbGV9IiAvPgorICAgIDxpdnk6cHVibGlzaCByZXNvbHZlcj0ibG9jYWwiIHB1YnJldmlzaW9uPSIke3Byb2plY3QucmV2aXNpb259IiBvdmVyd3JpdGU9InRydWUiIGZvcmNlZGVsaXZlcj0idHJ1ZSI+CisgICAgICA8YXJ0aWZhY3RzIHBhdHRlcm49IiR7ZGlzdC5kaXJ9L1thcnRpZmFjdF0tW3JldmlzaW9uXS5bZXh0XSIgLz4KKyAgICA8L2l2eTpwdWJsaXNoPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9idWlsZC1yZXMvc3ViZmxvb3IueG1sIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2J1aWxkLXJlcy9zdWJmbG9vci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3Njg4NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9idWlsZC1yZXMvc3ViZmxvb3IueG1sCkBAIC0wLDAgKzEsMjAyNiBAQAorPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFBlbnRhaG8gRW5naW5lZXJpbmcgVGVhbQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFBlbnRhaG8gQ29ycG9yYXRpb24gbm9yIHRoZQorICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFBlbnRhaG8gRW5naW5lZXJpbmcgVGVhbSAnJ0FTIElTJycgQU5EIEFOWQorRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPGNvcHlyaWdodCBob2xkZXI+IEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECitPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgID09IFNVQkZMT09SID09CisgICAgCisgICAgJERhdGU6IFdlZCBOb3YgIDYgMTY6MTM6NTcgVVRDIDIwMTMgJAorICAgIFByb2plY3QgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL3BlbnRhaG8vc3ViZmxvb3IvCisgICAgCisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBhbnQgdGFza3MgdG8gCisgICAgcGVyZm9ybSBhIGJ1aWxkLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSBidWlsZC54bWwgZmlsZSAKKyAgICBmb3IgeW91ciBwYXJ0aWN1bGFyIHByb2plY3QuIFRoYXQgYnVpbGQgZmlsZSBzaG91bGQgcmVkZWZpbmUgYW55IHRhc2sgCisgICAgdGhhdCBpcyBkZWZpbmVkIGluIHN1YmZsb29yLnhtbCBJRiBBTkQgT05MWSBJRiB0aGUgZnVuY3Rpb24gb2YgdGhlIAorICAgIHRhc2sgbmVlZHMgdG8gYmUgY3VzdG9taXplZC4KKyAgICAKKyAgICBGT1JNQVRUSU5HOiAKKyAgICAgIEFMSUdOTUVOVDogaW5kZW50PTIgc3BhY2VzIGFuZCB3cmFwIGxpbmVzIGxvbmdlciB0aGFuIDEyMCBjaGFycworICAgICAgTkFNSU5HOiB0YXJnZXRzIGludGVuZGVkIGZvciBleGVjdXRpb24gYnkgYSB1c2VyIGFyZSBuYW1lZCBzaW5nbGUtd29yZAorICAgICAgICAgICAgICBvciBoeXBoZW5hdGVkLiAgSW50ZXJuYWwgdGFyZ2V0cyB1c2UgJy4nIG5vdGF0aW9uLgorICAgIAorICAgIFRPIEdFVCBTVEFSVEVEIHdpdGggeW91ciBwcm9qZWN0LCB5b3Ugd2lsbCBuZWVkIHRoaXMgZmlsZSBpbiAKKyAgICAgICAgICB5b3VyIHByb2plY3QncyByb290IGRpcmVjdG9yeSBhbG9uZyB3aXRoIHRocmVlIGFkZGl0aW9uYWwgZmlsZXM6CisgICAgICAgICAgMS4gYnVpbGQueG1sIAorICAgICAgICAgIDIuIGJ1aWxkLnByb3BlcnRpZXMKKyAgICAgICAgICAzLiBpdnlfc2V0dGluZ3MueG1sCisgICAgICAgICAgNC4gaXZ5LnhtbAorICAgICAgICAgIAorICAgICAgICAgIEJlbG93IGFyZSBzb21lIHRlbXBsYXRlczoKKyAgICAgICAgICAKKyAgICAgID09PSBidWlsZC54bWwKKyAgICA8cHJvamVjdCBuYW1lPSJNeVByb2plY3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciIgeG1sbnM6aXZ5PSJhbnRsaWI6b3JnLmFwYWNoZS5pdnkuYW50IiA+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoaXMgYnVpbGQgZmlsZSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgTXlQcm9qZWN0IHByb2plY3QgYW5kIHdvcmtzIHdpdGggdGhlIHN1YmZsb29yLnhtbCBmaWxlLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKworICAgICAgPGltcG9ydCBmaWxlPSJzdWJmbG9vci54bWwiLz4KKyAgICA8L3Byb2plY3Q+CisgIAorICAgID09PSBidWlsZC5wcm9wZXJ0aWVzCisgICAgcHJvamVjdC5yZXZpc2lvbj0xLjAtU05BUFNIT1QgICN0aGUgdmVyc2lvbiBvZiB5b3VyIHByb2plY3QuICBUaGlzIHdpbGwgYXBwZWFyIGluIGphciBNRVRBLUlORiwgZGlzdCBhcnRpZmFjdCBmaWxlbmFtZXMgYW5kIElWWSByZXZpc2lvbiBtZXRhZGF0YS4gCisgICAgaXZ5LmFydGlmYWN0LmlkPW15LXByb2plY3QgICAjSVZZIG1ldGFkYXRhIGRlc2NyaWJpbmcgdGhlIG5hbWUgb2YgdGhlIGFydGlmYWN0CisgICAgaW1wbC50aXRsZT1NeSBQcm9qZWN0ICNFbmdsaXNoIGxhbmd1YWdlIHZlcnNpb24gb2YgeW91ciBwcm9qZWN0IG5hbWUKKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworCis8cHJvamVjdCBuYW1lPSJzdWJmbG9vciIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZGVmYXVsdCIgeG1sbnM6aXZ5PSJhbnRsaWI6b3JnLmFwYWNoZS5pdnkuYW50Ij4KKyAgPGRlc2NyaXB0aW9uPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBzdWJmbG9vci54bWwgcHJvdmlkZXMgdGFza3MgbmVlZGVkIHRvIHBlcmZvcm0gYSBwcm9qZWN0IGJ1aWxkLiAKKyAgICAgSXQgaXMgdHlwaWNhbGx5IG5vdCB1c2VkIGRpcmVjdGx5IGJ1dCBpbXBvcnRlZCBieSBlYWNoIHByb2plY3QncyBidWlsZC54bWwKKyAgICAgZmlsZS4gIFRoZSBidWlsZC54bWwgZmlsZSBjYW4gb3ZlcnJpZGUgdGFza3Mgd2hlbiBjdXN0b21pemF0aW9uIGlzIHJlcXVpcmVkLiAKKyAgICAgIAorTUFJTiBUQVJHRVRTCis9PT09PT09PT09PT0KKyAgKiBjbGVhbiAvIGNsZWFuLWFsbCA6IAorICAgIHJlbW92ZSBhbGwgYXJ0aWZhY3RzIG9mIHRoZSBidWlsZCwgY2xlYW4tYWxsIGFkZHMgdGhlIHJlbW92YWwKKyAgICBvZiBhbnkgbGlicmFyeSBvciBqYXIgZGVwZW5kZW5jaWVzIGRvd25sb2FkZWQgYXMgcGFydCBvZiB0aGUgYnVpbGQKKyAgICAKKyAgKiByZXNvbHZlIDoKKyAgICBkb3dubG9hZC9yZWZyZXNoIGxpYnJhcnkgb3IgamFyIGRlcGVuZGVuY2llcyBuZWVkZWQgZm9yIHRoZSBidWlsZCAodXNlcyBBcGFjaGUgSVZZKQorICAgIAorICAqIGNvbXBpbGUgOgorICAgIHJ1biBqYXZhYyBvbiB0aGUgcHJvamVjdCdzIHNvdXJjZQorICAgIAorICAqIGphciA6CisgICAgY3JlYXRlcyBhIGphciBmaWxlCisgICAgCisgICogZGlzdCA6CisgICAgY3JlYXRlcyBhbGwgcHJvamVjdCBkaXN0cmlidXRhYmxlcworICAgIAorICAqIHRlc3QgOgorICAgIHJ1bnMgSlVuaXQgdGVzdHMgZnJvbSB5b3VyIHByb2plY3QncyB0ZXN0IHNvdXJjZQorICAgIAorU1BFQ0lBTCBUQVJHRVRTCis9PT09PT09PT09PT0KKyAgKiBwdWJsaXNoLWxvY2FsIDoKKyAgICBidWlsZHMgYSBqYXIgZm9yIHlvdXIgcHJvamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggdGhlIGxvY2FsIGFydGlmYWN0IHJlcG9zaXRvcnkgaXNvbGF0ZWQgCisgICAgdG8geW91ciBtYWNoaW5lIGF0ICRIT01FLy5pdnkyL2xvY2FsLiAgRnVydGhlciBleGVjdXRpb25zIG9mIHRoZSB0aGUgcmVzb2x2ZSB0YXJnZXQgYnkgdGhpcworICAgIG9yIG90aGVyIHByb2plY3RzIHdpbGwgZmluZCB5b3VyIHB1Ymxpc2hlZCBqYXIuCisgICAgCisgICogaXZ5LWNsZWFuKiA6CisgICAgdGhpcyBmYW1pbHkgb2YgdGFyZ2V0cyBoZWxwcyByZXNldCB5b3VyIElWWSBlbnZpcm9ubWVudCBpbiB0aGUgZXZlbnQgdGhhdCB5b3UgYXJlIGhhdmluZworICAgIGRpZmZpY3VsdHkgcmVzb2x2aW5nIGRlcGVuZGVuY2llcworICAgIAorVFlQSUNBTCBUQVJHRVQgU0VRVUVOQ0UKKz09PT09PT09PT09PSAgICAKKyAgKiBjbGVhbi1hbGwgcmVzb2x2ZSBkaXN0IDoKKyAgICBhIGdvb2Qgc3RhcnQgdG8gYnVpbGQgYWxsIHByb2plY3QgZGlzdHJpYnV0YWJsZXMgZnJvbSBzY3JhdGNoLiAgTm90ZSB0aGF0IGphciBkZXBlbmRlbmNpZXMKKyAgICB3aWxsIG5vdCBiZSBkb3dubG9hZGVkIHVubGVzcyB5b3UgZXhwbGljaXRseSBydW4gdGhlIHJlc29sdmUgdGFyZ2V0LiAgV2UgbWFkZSB0aGUgcmVzb2x1dGlvbgorICAgIGFuZCByZXRyaWV2YWwgY29tcGxldGVseSBkaXNjcmV0aW9uYXJ5IHNpbmNlIHRoZXJlIGFyZSBtYW55IHNpdHVhdGlvbnMgaW4gd2hpY2gKKyAgICB5b3Ugd2lsbCBub3Qgd2FudCB0byBnZXQgb3IgcmVmcmVzaCBkZXBlbmRlbmNpZXMsIGUuZy4gaWYgeW91IGFyZSBvZmZsaW5lIHdpdGggbm8gSW50ZXJuZXQKKyAgICBhY2Nlc3MuICBJbiBzdWNoIGNhc2UsIHlvdSBjb3VsZCBqdXN0IHJ1biAiZGlzdCIgaWYgdGhlIHNldCBvZiBqYXJzIHlvdSBhbHJlYWR5IGhhdmUgYXJlIAorICAgIHN1ZmZpY2llbnQuCisgICAgCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPCEtLSBMb2FkIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGluIHRoZSBwcm9wZXIgb3JkZXIgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJvdmVycmlkZS5wcm9wZXJ0aWVzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlByb3BlcnRpZXMgY3VzdG9taXplZCBmb3IgeW91ciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBiZWxvbmcgaW4gdGhpcyBmaWxlLiAgVGhpcyBmaWxlIHdpbGwgbmV2ZXIgYmUgY2hlY2tlZCBpbnRvIHRoZSBTQ00uIiAvPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQcm9wZXJ0aWVzIGN1c3RvbWl6ZWQgZm9yIHlvdXIgcGFydGljdWxhciBwcm9qZWN0IGJlbG9uZyBpbiB0aGlzIGZpbGUuIiAvPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgUHJvcGVydHkgRGVmYXVsdHMKKyAgICAgICBBbnkgb2YgdGhlc2UgcHJvcGVydGllcyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBlaXRoZXIgYnVpbGQucHJvcGVydGllcyBvciBvdmVycmlkZS5wcm9wZXJ0aWVzCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPCEtLSBQcm9qZWN0IG1ldGEgcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImltcGwudmVuZG9yIiB2YWx1ZT0iUGVudGFobyBDb3Jwb3JhdGlvbiIgZGVzY3JpcHRpb249IkphciBmaWxlIG1ldGFkYXRhIGRlc2NyaWJpbmcgdGhlIGphcidzIHZlbmRvciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImltcGwucHJvZHVjdElEIgorICAgICAgICAgICAgdmFsdWU9IiIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJKYXIgZmlsZSBtZXRhZGF0YSBpbmRpY2F0aW5nIHRoZSBwcm9kdWN0IElEICh0aGlzIGlzIG5vdCB0aGUgcmV2aXNpb24pIiAvPgorCisgIDwhLS0gQ29tcGlsZSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIiBkZXNjcmlwdGlvbj0iUHJvamVjdCBzb3VyY2UgY29kZSBkaXJlY3RvcnkiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJiaW4uZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9iaW4iIGRlc2NyaXB0aW9uPSJCYXNlIGRpcmVjdG9yeSBmb3IgYWxsIG5vbi1kaXN0IGJ1aWxkIG91dHB1dCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7YmluLmRpcn0vY2xhc3NlcyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzc2VzIGNvbXBpbGVkIGZyb20gcHJvamVjdCBzb3VyY2UgY29kZSBhcmUgcGxhY2VkIGhlcmUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vbGliIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkRpcmVjdG9yeSB0aGF0IGhvc3RzIEphciBmaWxlcyByZXF1aXJlZCB0byBjb21waWxlIHByb2plY3Qgc291cmNlLiAgKElWWSB3aWxsIHBvcHVsYXRlIHRoaXMgZGlyZWN0b3J5IHdpdGggcmVxdWlyZWQgamFycykiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZXZsaWIuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vZGV2LWxpYiIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaXJlY3RvcnkgZm9yIGRldmVsb3BlciB0byBwbGFjZSBkZXZlbG9wbWVudCBKYXIgZmlsZXMgKG5vdCBhZmZlY3RlZCBieSBjbGVhbiB0YXJnZXRzKSIgLz4KKworICA8IS0tIENvbXBpbGVyIHByb3BlcnRpZXMgKHBhc3NlZCBkaXJlY3RseSB0byBqYXZhYyBhbnQgdGFyZ2V0KSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLmRlYnVnIgorICAgICAgICAgICAgdmFsdWU9InRydWUiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIChwYXNzZWQgdG8gamF2YWMgYW50IHRhc2spLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLmRlcHJlY2F0aW9uIgorICAgICAgICAgICAgdmFsdWU9InRydWUiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIGRlcHJlY2F0aW9uIGluZm9ybWF0aW9uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YWMuc291cmNlIiB2YWx1ZT0iNiIgZGVzY3JpcHRpb249IlByb3ZpZGUgc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBzcGVjaWZpZWQgcmVsZWFzZSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLnRhcmdldCIgdmFsdWU9IjYiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBjbGFzcyBmaWxlcyBmb3Igc3BlY2lmaWMgVk0gdmVyc2lvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLm1heG1lbW9yeSIgdmFsdWU9IjI1Nk0iIGRlc2NyaXB0aW9uPSJNYXggbWVtb3J5IGFsbG90ZWQgdG8gamF2YSBjb21waWxlIiAvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YWMueGxpbnQiIHZhbHVlPSItWGxpbnQ6YWxsIiAvPgorCisgIDwhLS0gVGhpcmQgcGFydHkgQW50IHRhc2tzIGFuZCB0b29scyBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ic3ViZmxvb3IucmVzb3VyY2VzLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke3VzZXIuaG9tZX0vLnN1YmZsb29yIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkJhc2UgZGlyIGZvciBydW50aW1lIGphcnMgdGhhdCBhcmUgcmVxdWlyZWQgZXhjbHVzaXZlbHkgYnkgdGhlIGJ1aWxkIHByb2Nlc3MiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzdWJmbG9vci50bXAuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7c3ViZmxvb3IucmVzb3VyY2VzLmRpcn0vdG1wIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRlbXBvcmFyeSBzcGFjZSB3aGVyZSBmaWxlcyBhcmUgcHJlcGFyZWQgZm9yIGluc3RhbGxhdGlvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFudGNvbnRyaWIuYnVpbGQuY2FjaGUuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7c3ViZmxvb3IucmVzb3VyY2VzLmRpcn0vYW50LWNvbnRyaWIiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGlyZWN0b3J5IHdoZXJlIHRoZSBBbnQtQ29udHJpYiBqYXIgKGFuZCBkZXBlbmRlbmNpZXMpIGlzIHBsYWNlZCBhZnRlciBpdCBpcyBhdXRvLWRvd25sb2FkZWQgYnkgdGhlIGJ1aWxkIiAvPgorICA8cHJvcGVydHkgbmFtZT0ic3ZuYW50LnVzZS1qYXZhaGwiCisgICAgICAgICAgICB2YWx1ZT0iZmFsc2UiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUHJlZmVyIEpOSSBKYXZhSEwgYmluZGluZyBvdmVyIHRoZSBjb21tYW5kIGxpbmUgY2xpZW50IGZvciBuYXRpdmUgc3ZuIHN1cHBvcnQiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzdm5hbnQudXNlLXN2bmtpdCIKKyAgICAgICAgICAgIHZhbHVlPSJ0cnVlIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlByZWZlciBTVk5LaXQgYmluZGluZyBvdmVyIHRoZSBjb21tYW5kIGxpbmUgY2xpZW50IGZvciBuYXRpdmUgc3ZuIHN1cHBvcnQgKGRlZmF1bHRzIHRvIHRydWUpIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5LnVybCIKKyAgICAgICAgICAgIHZhbHVlPSJodHRwOi8vcmVwbzIubWF2ZW4ub3JnL21hdmVuMi9vcmcvYXBhY2hlL2l2eS9pdnkvMi4yLjAvaXZ5LTIuMi4wLmphciIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgVVJMIHRvIHRoZSBjdXJyZW50IHJlbGVhc2Ugb2YgQXBhY2hlIElWWSIgLz4KKwkKKyAgPCEtLSBFbnVuY2lhdGUgcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImVudW5jaWF0ZS5ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS9lbnVuY2lhdGUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJlbnVuY2lhdGUuYmluLmRpciIgdmFsdWU9IiR7YmluLmRpcn0vZW51bmNpYXRlIiAvPgorCisKKyAgPCEtLSBUZXN0IHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5iYXNlLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0iIGRlc2NyaXB0aW9uPSJEaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGp1bml0IHRlc3QgVk0gd2lsbCBiZSBpbnZva2VkIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdHNyYy5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3Rlc3Qtc3JjIiBkZXNjcmlwdGlvbj0iRGlyZWN0b3J5IHRoYXQgaG9zdHMgdGhlIHRlc3Qgc291cmNlIGZpbGVzIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdGxpYi5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS90ZXN0LWxpYiIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaXJlY3RvcnkgZm9yIGphciBmaWxlcyBuZWVkZWQgZHVyaW5nIHVuaXQgdGVzdGluZyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RiaW4uZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7YmluLmRpcn0vdGVzdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJCYXNlIGRpcmVjdG9yeSBmb3IgYWxsIGNvbXBpbGVyIGdlbmVyYXRlZCB0ZXN0IG91dHB1dCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke3Rlc3RiaW4uZGlyfS9jbGFzc2VzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzZXMgY29tcGlsZWQgZnJvbSBwcm9qZWN0IHRlc3QgY29kZSBhcmUgcGxhY2VkIGhlcmUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cmVwb3J0cy5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtiaW4uZGlyfS9yZXBvcnRzL3Rlc3QiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQmFzZSBkaXJlY3RvcnkgdGhhdCBob2xkcyBhbGwgdW5pdCB0ZXN0IHJlcG9ydCBmaWxlcyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RyZXBvcnRzLnhtbC5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0cmVwb3J0cy5kaXJ9L3htbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbml0IHRlc3QgeG1sIHJlcG9ydHMgYXJlIHBsYWNlZCBoZXJlIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdHJlcG9ydHMuaHRtbC5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0cmVwb3J0cy5kaXJ9L2h0bWwiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pdCB0ZXN0IGh0bWwgcmVwb3J0cyBhcmUgcGxhY2VkIGhlcmUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5oYWx0b25mYWlsdXJlIiB2YWx1ZT0ibm8iIGRlc2NyaXB0aW9uPSJGYWlsIHRoZSBidWlsZCBpZiBhIHRlc3QgZmFpbHMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5oYWx0b25lcnJvciIgdmFsdWU9Im5vIiBkZXNjcmlwdGlvbj0iRmFpbCB0aGUgYnVpbGQgaWYgYSBlcnJvciBvY2N1cnMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5tYXhtZW1vcnkiIHZhbHVlPSIyNTZNIiBkZXNjcmlwdGlvbj0iSGVhcCBzaXplIHdoZW4gSnVuaXQgaXMgcnVuIGluIGZvcmsgbW9kZSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmZvcmttb2RlIiAKKyAgICAgICAgICAgIHZhbHVlPSJwZXJUZXN0IiAKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWZpbmVzIHdoZXRoZXIgSlVuaXQgZm9ya3MgYSBuZXcgSlZNIGZvciBlYWNoIHRlc3QuIFVzZSAnb25jZScgZm9yIGZhc3RlciB0ZXN0IHJ1bnMsIGFuZCAncGVyVGVzdCcgZm9yIGNvbXBsZXRlIHRlc3RzLiIvPgorICA8cHJvcGVydHkgbmFtZT0iaGVhZGxlc3MudW5pdHRlc3QiIHZhbHVlPSJ0cnVlIiBkZXNjcmlwdGlvbj0iUnVucyB0aGUgdW5pdCB0ZXN0cyBpbiBoZWFkbGVzcyBtb2RlIiAvPgorCisgIDwhLS0gQ29kZSBDb3ZlcmFnZSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iaW5zdHJ1bWVudGVkLmNsYXNzZXMuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7dGVzdGJpbi5kaXJ9L2luc3RydW1lbnRlZC1jbGFzc2VzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkRpcmVjdG9yeSB3aGVyZSBpbnN0cnVtZW50ZWQgcHJvamVjdCBjbGFzc2VzIGFyZSBwbGFjZWQgZm9yIHVzZSBieSBjb2RlIGNvdmVyYWdlIHV0aWxpdHkiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb2JlcnR1cmEudmVyc2lvbiIKKyAgICAgICAgICAgIHZhbHVlPSIxLjkuNC4xIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSB2ZXJzaW9uIG9mIGNvYmVydHVyYSB0byB1c2UgZm9yIGNvZGUgY292ZXJhZ2UiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb2JlcnR1cmEuZGF0YS5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0YmluLmRpcn0vY29iZXJ0dXJhLWJpbiIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUZW1wb3JhcnkgZGF0YSBkaXJlY3RvcnkgdXNlZCBieSBDb2JlcnR1cmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb2JlcnR1cmFyZXBvcnRzLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2Jpbi5kaXJ9L3JlcG9ydHMvY29iZXJ0dXJhIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkJhc2UgZGlyZWN0b3J5IGZvciBhbGwgZ2VuZXJhdGVkIENvYmVydHVyYSBjb2RlIGNvdmVyYWdlIHJlcG9ydHMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb2JlcnR1cmFyZXBvcnRzLnhtbC5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtjb2JlcnR1cmFyZXBvcnRzLmRpcn0veG1sIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvYmVydHVyYSB4bWwgcmVwb3J0cyBhcmUgcGxhY2VkIGhlcmUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb2JlcnR1cmFyZXBvcnRzLmh0bWwuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7Y29iZXJ0dXJhcmVwb3J0cy5kaXJ9L2h0bWwiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29iZXJ0dXJhIGh0bWwgcmVwb3J0cyBhcmUgcGxhY2VkIGhlcmUiIC8+CisKKyAgPCEtLSBKYXZhZG9jIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2Jpbi5kaXJ9L2phdmFkb2MiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGlyZWN0b3J5IHdoZXJlIGdlbmVyYXRlZCBqYXZhZG9jIHdpbGwgYmUgcGxhY2VkIiAvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5wYWNrYWdlbmFtZXMiCisgICAgICAgICAgICB2YWx1ZT0ib3JnLm15cGFja2FnZW5hbWUuKiIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGlzIHByb3BlcnR5IGlzIHBhc3NlZCB0byB0aGUgcGFja2FnZW5hbWVzIHByb3BlcnR5IG9mIHRoZSBqYXZhZG9jIGFudCB0YXNrLiAgWW91IHNob3VsZCBjdXN0b21pemUgdGhpcyBmb3IgeW91ciBwcm9qZWN0LiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuemlwLmZpbGVuYW1lIiB2YWx1ZT0iJHtpdnkuYXJ0aWZhY3QuaWR9LSR7cHJvamVjdC5yZXZpc2lvbn0tamF2YWRvYy56aXAiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLnRhci5maWxlbmFtZSIgdmFsdWU9IiR7aXZ5LmFydGlmYWN0LmlkfS0ke3Byb2plY3QucmV2aXNpb259LWphdmFkb2MudGFyLmd6IiAvPgorCisgIDwhLS0gRGlzdHJpYnV0aW9uIGFuZCBBc3NlbWJseSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iZGlzdC5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9kaXN0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkJhc2UgZGlyZWN0b3J5IGZvciBhbGwgcHJvamVjdCBhcnRpZmFjdHMgKGphciwgemlwLCB0YXIuZ3osIGV0Yy4uLikiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaWNlbnNlLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2Jhc2VkaXJ9IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkJhc2UgZGlyZWN0b3J5IHdoZXJlIHRoaXMgcHJvamVjdCdzIGxpY2Vuc2UgZmlsZXMgcmVzaWRlIiAvPgorICA8cHJvcGVydHkgbmFtZT0icmVzLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2Jhc2VkaXJ9L3JlcyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaXJlY3RvcnkgdGhhdCBob2xkcyByZXNvdXJjZXMgbm90IGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgdHJlZSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS56aXAuZmlsZW5hbWUiIHZhbHVlPSIke2l2eS5hcnRpZmFjdC5pZH0tJHtwcm9qZWN0LnJldmlzaW9ufS1zb3VyY2VzLnppcCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS50YXIuZmlsZW5hbWUiIHZhbHVlPSIke2l2eS5hcnRpZmFjdC5pZH0tJHtwcm9qZWN0LnJldmlzaW9ufS1zb3VyY2VzLnRhci5neiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5wdWJsaXNoIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgCisgIDwhLS0gSXZ5IHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuc2V0dGluZ3N1cmwiCisgICAgICAgICAgICB2YWx1ZT0iZmlsZToke2Jhc2VkaXJ9L2l2eXNldHRpbmdzLnhtbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVUkwgdG8gdGhlIChjb21tb24pIGl2eXNldHRpbmdzLnhtbC4gIFRoaXMgZmlsZSBpcyByZXF1aXJlZCBieSB0aGUgYnVpbGQgdG8gY29uZmlndXJlIElWWS4gIE5vdGUgeW91IG11c3QgZXNjYXBlIHRoZSAnOicgaWYgdGhpcyBwcm9wZXJ0eSBleGlzdHMgaW4gYSAucHJvcGVydGllcyBmaWxlIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5ZmlsZSIKKyAgICAgICAgICAgIHZhbHVlPSJpdnkueG1sIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoZSBJVlkgeG1sIGZpbGUgZGVmaW5pbmcgeW91ciBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5LmFydGlmYWN0Lmdyb3VwIgorICAgICAgICAgICAgdmFsdWU9Im15Y29tcGFueW5hbWUiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSVZZIG1ldGFkYXRhIGRlc2NyaWJpbmcgdGhlIG9yaWdpbmF0aW5nIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5LmFydGlmYWN0LnBvbWZpbGUiCisgICAgICAgICAgICB2YWx1ZT0iJHtkaXN0LmRpcn0vcG9tLnhtbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcGF0aCB0byB0aGUgTWF2ZW4gcG9tIGZpbGUgdG8gZGVwbG95IHdpdGggdGhlIGFydGlmYWN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5LmFydGlmYWN0Lml2eWZpbGVuYW1lIgorICAgICAgICAgICAgdmFsdWU9Iml2eS54bWwiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG5hbWUgb2YgdGhlIElWWSB4bWwgZmlsZSB0byBkZXBsb3kgd2l0aCB0aGUgYXJ0aWZhY3QiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuYXJ0aWZhY3QuaXZ5cGF0aG5hbWUiCisgICAgICAgICAgICB2YWx1ZT0iJHtkaXN0LmRpcn0vaXZ5LnhtbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZnVsbCBwYXRoIHRvIHRoZSBJVlkgeG1sIGZpbGUgdG8gZGVwbG95IHdpdGggdGhlIGFydGlmYWN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5LnJlcG9ydHMuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7YmluLmRpcn0vcmVwb3J0cy9pdnkiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQmFzZSBkaXJlY3RvcnkgdGhhdCBob2xkcyBhbGwgSVZZIGRlcGVuZGVuY3kgcmVwb3J0IGZpbGVzIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaXZ5LmNvbmZpZ3MiIHZhbHVlPSIqIiBkZXNjcmlwdGlvbj0iU2V0IG9mIGNvbmZpZ3MgdXNlZCBmb3IgSVZZIHJlcG9ydGluZyBhbmQgY2hlY2tpbmcgb3BlcmF0aW9ucyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Iml2eS51c2Uuc3ltbGlua3MiIHZhbHVlPSJ0cnVlIiBkZXNjcmlwdGlvbj0iRmxhZyBpbmRpY2F0aW5nIGlmIEl2eSBzaG91bGQgY3JlYXRlIHN5bWxpbmtzIHdoZW4gcmV0cmlldmluZyBhcnRpZmFjdHMuIi8+CisKKyAgPCEtLSBUYXR0bGV0YWxlIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0YXR0bGV0YWxlLnVybCIKKyAgICAgICAgICAgIHZhbHVlPSJodHRwOi8vcmVwby5wZW50YWhvLm9yZy9hcnRpZmFjdG9yeS9yZXBvL2pib3NzL3RhdHRsZXRhbGUvMS4xLjIuRmluYWwvdGF0dGxldGFsZS0xLjEuMi5GaW5hbC56aXAiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIFVSTCBmcm9tIHdoaWNoIHRvIGRvd25sb2FkIHRhdHRsZXRhbGUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0YXR0bGV0YWxlLmNsYXNzbmFtZSIKKyAgICAgICAgICAgIHZhbHVlPSJvcmcuamJvc3MudGF0dGxldGFsZS5hbnQuUmVwb3J0VGFzayIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBydW4gdGhlIHRhdHRsZXRhbGUgcmVwb3J0cyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRhdHRsZXRhbGUucmVwb3J0cy5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtiaW4uZGlyfS9yZXBvcnRzL3RhdHRsZXRhbGUiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQmFzZSBkaXJlY3RvcnkgdGhhdCBob2xkcyB0aGUgb3V0cHV0IG9mIHRoZSB0YXR0bGV0YWxlIHJlcG9ydHMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0YXR0bGV0YWxlLmNvbmZpZ2ZpbGUiCisgICAgICAgICAgICB2YWx1ZT0iIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSB0YXR0bGV0YWxlIHJlcG9ydCIgLz4KKworICA8IS0tIFNvbmFyIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci51cmwiCisgICAgICAgICAgICB2YWx1ZT0iaHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvb3JnL2NvZGVoYXVzL3NvbmFyLXBsdWdpbnMvc29uYXItYW50LXRhc2svMS4yL3NvbmFyLWFudC10YXNrLTEuMi5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNvbmFyLmNsYXNzbmFtZSIKKyAgICAgICAgICB2YWx1ZT0ib3JnLnNvbmFyLmFudC5Tb25hclRhc2siLz4KKworICA8IS0tIExvYWQgdGhlIG1hbmlmZXN0IGZpbGUgKGlmIGFueSkgYXMgYSBwcm9wZXJ0aWVzIGZpbGUgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0Lm1hbmlmZXN0LmZpbGUiCisgICAgICAgICAgICB2YWx1ZT0iJHtkaXN0LmRpcn0vTUFOSUZFU1QuTUYiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1hbmlmZXN0IGZpbGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSBidWlsZCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LmZpbGUiCisgICAgICAgICAgICB2YWx1ZT0iJHtyZXMuZGlyfS9NRVRBLUlORi9NQU5JRkVTVC5NRiIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbG9jYXRpb24gb2YgdGhlIE1BTklGRVNULk1GIGZpbGUgZm9yIHRoaXMgYXBwbGljYXRpb24uIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHttYW5pZmVzdC5maWxlfSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJMb2FkcyB0aGUgbWFuaWZlc3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWFuaWZlc3QgZmlsZSBhcyBhIHByb3BlcnRpZXMgZmlsZS4iIC8+CisKKyAgPCEtLSBTZXQgdGhlIHByb2plY3QgcmV2aXNpb24gbnVtYmVyIHRvIHRoZSB2YWx1ZSBpbiB0aGUgbWFuaWZlc3QgZmlsZSAoaWYgaXQgaGFzIG5vdAorICAgICAgIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LnJldmlzaW9uIgorICAgICAgICAgICAgdmFsdWU9IiR7SW1wbGVtZW50YXRpb24tVmVyc2lvbn0iCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2V0cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHByb2plY3QgYmFzZWQgb24gdGhlIEltcGxlbWVudGF0aW9uLVZlcnNpb24gZm91bmQgaW4gdGhlIG1hbmlmZXN0IGZpbGUgKGlmIG9uZSBpcyBzdXBwbGllZCBhbmQgbm90aGluZyBpcyBzcGVjaWZpZWQgaW4gdGhlIGJ1aWxkLnByb3BlcnRpZXMpIiAvPgorICA8ZmFpbCBtZXNzYWdlPSJBIHByb2plY3QgcmV2aXNpb24gbnVtYmVyIGhhcyBub3QgYmVlbiBkZXRlcm1pbmVkISI+CisgICAgPGNvbmRpdGlvbj4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iJHtwcm9qZWN0LnJldmlzaW9ufSIgcGF0dGVybj0iXCRcey4qXH0iIC8+CisgICAgPC9jb25kaXRpb24+CisgIDwvZmFpbD4KKworICA8IS0tIFNldCB0aGUgcHJvamVjdCB0aXRsZSB0byB0aGUgdmFsdWUgaW4gdGhlIG1hbmlmZXN0IGZpbGUgKGlmIGl0IGhhcyBub3QKKyAgICAgICBiZWVuIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydGllcyBmaWxlIC0tPgorICA8cHJvcGVydHkgbmFtZT0iaW1wbC50aXRsZSIKKyAgICAgICAgICAgIHZhbHVlPSIke0ltcGxlbWVudGF0aW9uLVRpdGxlfSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZXRzIHRoZSB0aXRsZSBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgSW1wbGVtZW50YXRpb24tVGl0bGUgZm91bmQgaW4gdGhlIG1hbmlmZXN0IGZpbGUgKGlmIG9uZSBpcyBzdXBwbGllZCBhbmQgbm90aGluZyBpcyBzcGVjaWZpZWQgaW4gdGhlIGJ1aWxkLnByb3BlcnRpZXMpIiAvPgorICA8ZmFpbCBtZXNzYWdlPSJBIHByb2plY3QgdGl0bGUgaGFzIG5vdCBiZWVuIGRldGVybWluZWQhIj4KKyAgICA8Y29uZGl0aW9uPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSIke2ltcGwudGl0bGV9IiBwYXR0ZXJuPSJcJFx7LipcfSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC9mYWlsPgorCisgIDwhLS0gQnVpbGQgTW9kZSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0icmVsZWFzZSIgdmFsdWU9ImZhbHNlIiBkZXNjcmlwdGlvbj0iU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSBhIHJlbGVhc2UgYXJ0aWZhY3QiIC8+CisKKyAgPCEtLSBJdnkgc2hvdWxkIG9ubHkgdXNlIHN5bWxpbmtzIGlmIHdlJ3JlIG5vdCBpbiByZWxlYXNlIG1vZGUgLS0+CisgIDxjb25kaXRpb24gcHJvcGVydHk9Iml2eS51c2Uuc3ltbGlua3MuaW50ZXJuYWwiPgorICAgIDxhbmQ+CisgICAgICA8aXNmYWxzZSB2YWx1ZT0iJHtyZWxlYXNlfSIvPgorICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtpdnkudXNlLnN5bWxpbmtzfSIvPgorICAgIDwvYW5kPgorICA8L2NvbmRpdGlvbj4KKworICA8IS0tIFNldCB0aGUgb3MgcHJvcGVydHkgLS0+CisgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzTGludXgiPgorICAgIDxvcyBmYW1pbHk9InVuaXgiIC8+CisgIDwvY29uZGl0aW9uPgorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpc1dpbmRvd3MiPgorICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiIC8+CisgIDwvY29uZGl0aW9uPgorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpc01hYyI+CisgICAgPG9zIGZhbWlseT0ibWFjIiAvPgorICA8L2NvbmRpdGlvbj4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJvcy5jbGFzc2lmaWVyIiB2YWx1ZT0id2luIj4KKyAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgorICA8L2NvbmRpdGlvbj4KKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib3MuY2xhc3NpZmllciIgdmFsdWU9Im1hYyI+CisgICAgPG9zIGZhbWlseT0ibWFjIiAvPgorICA8L2NvbmRpdGlvbj4KKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib3MuY2xhc3NpZmllciIgdmFsdWU9ImxpbnV4Ij4KKyAgICA8b3MgZmFtaWx5PSJ1bml4IiAvPgorICA8L2NvbmRpdGlvbj4KKyAgPHByb3BlcnR5IG5hbWU9Im9zLmNsYXNzaWZpZXIiIHZhbHVlPSJ1bnN1cHBvcnRlZCIgLz4KKworICA8IS0tIFNldHVwIHRoZSBjb21waWxlIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIke2RldmxpYi5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICA8L3BhdGg+CisKKyAgPCEtLSBTZXR1cCB0aGUgY2xhc3NwYXRoIHVzZWQgZm9yIHRlc3RpbmcgLS0+CisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdGNsYXNzZXMuZGlyfSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjbGFzc2VzLmRpcn0iIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke2RldmxpYi5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGxpYi5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICA8L3BhdGg+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGRlZmF1bHQKKyAgICAgIAorICAgICAgVGhlIHRhcmdldCB0aGF0IGlzIHJ1biBpZiBubyB0YXJnZXQgaXMgZ2l2ZW4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgZGVwZW5kcz0iYnVpbGQiIC8+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGJ1aWxkCisgICAgICAKKyAgICAgIFJ1bnMgYSB0eXBpY2FsIGJ1aWxkIHByb2Nlc3MgdG8gY3JlYXRlIHRoZSBwcm9qZWN0IGxvY2FsbHkKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImNsZWFuLWFsbCxyZXNvbHZlLGNvYmVydHVyYSxkaXN0LXNvdXJjZSxkaXN0IiAvPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBidWlsZC10ZXN0bGVzcworICAgICAgCisgICAgICBSdW5zIGEgdHlwaWNhbCBidWlsZCBwcm9jZXNzIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCBsb2NhbGx5IChubyB0ZXN0aW5nKQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10ZXN0bGVzcyIgZGVwZW5kcz0iY2xlYW4tYWxsLHJlc29sdmUsZGlzdC1zb3VyY2UsZGlzdCIgLz4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY29udGludW91cworICAgICAgCisgICAgICBSdW5zIGEgdHlwaWNhbCBjb250aW51b3VzIGludGVncmF0aW9uIGJ1aWxkIGluY2x1ZGluZyBwcm9qZWN0IGRpc3QsCisgICAgICB0ZXN0LCBhbmQgY292ZXJhZ2UgYXJ0aWZhY3RzCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNvbnRpbnVvdXMiIGRlcGVuZHM9ImJ1aWxkLHB1Ymxpc2giIC8+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvbnRpbnVvdXMtdGVzdGxlc3MKKyAgICAgIAorICAgICAgUnVucyBhIHR5cGljYWwgY29udGludW91cyBpbnRlZ3JhdGlvbiBidWlsZCBpbmNsdWRpbmcgcHJvamVjdCBkaXN0LAorICAgICAgYW5kIGNvdmVyYWdlIGFydGlmYWN0cworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb250aW51b3VzLXRlc3RsZXNzIiBkZXBlbmRzPSJidWlsZC10ZXN0bGVzcyxwdWJsaXNoIiAvPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBpbnN0YWxsLWFudGNvbnRyaWIKKyAgICAgIAorICAgICAgKEZldGNoZXMgYW5kKSBpbnN0YWxscyBhbnQtY29udHJpYiB0YXNrcy4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1hbnRjb250cmliIiBkZXBlbmRzPSJhbnRjb250cmliLmRvd25sb2FkLWNoZWNrIj4KKyAgICA8dGFza2RlZiByZXNvdXJjZT0ibmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50Y29udHJpYi5idWlsZC5jYWNoZS5kaXJ9Ij4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC90YXNrZGVmPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgYW50Y29udHJpYi5kb3dubG9hZC1jaGVjaworICAgICAgCisgICAgICBGZXRjaGVzIGFudC1jb250cmliIGZyb20gc291cmNlZm9yZ2UgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudAorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJhbnRjb250cmliLmRvd25sb2FkLWNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJhbnRjb250cmliLmF2YWlsYWJsZSI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YW50Y29udHJpYi5idWlsZC5jYWNoZS5kaXJ9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ibmV0LnNmLmFudGNvbnRyaWIubG9naWMuSWZUYXNrIj4KKyAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2FudGNvbnRyaWIuYnVpbGQuY2FjaGUuZGlyfSI+CisgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2F2YWlsYWJsZT4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhbnRjYWxsIHRhcmdldD0iYW50Y29udHJpYi5kb3dubG9hZCIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGFudGNvbnRyaWIuZG93bmxvYWQKKyAgICAgIAorICAgICAgRmV0Y2hlcyBhbnQtY29udHJpYiBmcm9tIHNvdXJjZWZvcmdlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImFudGNvbnRyaWIuZG93bmxvYWQiIHVubGVzcz0iYW50Y29udHJpYi5hdmFpbGFibGUiPgorICAgIDxta2RpciBkaXI9IiR7c3ViZmxvb3IudG1wLmRpcn0iIC8+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9kb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L2FudC1jb250cmliL2FudC1jb250cmliLTEuMGIzLWJpbi56aXAiCisgICAgICAgICBkZXN0PSIke3N1YmZsb29yLnRtcC5kaXJ9L2FudGNvbnRyaWIuemlwIgorICAgICAgICAgdXNldGltZXN0YW1wPSJ0cnVlIiAvPgorICAgIDx1bnppcCBzcmM9IiR7c3ViZmxvb3IudG1wLmRpcn0vYW50Y29udHJpYi56aXAiIGRlc3Q9IiR7c3ViZmxvb3IudG1wLmRpcn0iPgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgIDwvdW56aXA+CisgICAgPGNvcHkgdG9kaXI9IiR7YW50Y29udHJpYi5idWlsZC5jYWNoZS5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzdWJmbG9vci50bXAuZGlyfS9hbnQtY29udHJpYiI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGluaXQKKyAgICAgIAorICAgICAgRW5zdXJlcyB0aGF0IGFsbCB0aGUgcmVxdWlyZWQgZGlyZWN0b3JpZXMgZXhpc3QgYmVmb3JlIHByb2Nlc3NpbmcKKyAgICAgIGEgYnVpbGQuCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7bGliLmRpcn0iIC8+CisgICAgPG1rZGlyIGRpcj0iJHtkZXZsaWIuZGlyfSIgLz4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3RsaWIuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBpbnN0YWxsLXN2bmFudAorICAgIAorICAgIChGZXRjaGVzIGFuZCkgaW5zdGFsbHMgdGhlIFNWTiBBTlQgZm9yIHVzZSBieSB0aGlzIGFudCBzY3JpcHQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtc3ZuYW50IiBkZXBlbmRzPSJpbnN0YWxsLWl2eSI+CisgICAgPGlmPgorICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtzdm5hbnQuaXNpbnN0YWxsZWR9IiAvPgorICAgICAgPHRoZW4+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlNraXBwaW5nIFNWTiBBTlQgaW5zdGFsbC4gIFNWTiBBTlQgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkIGJ5IHRoZSBidWlsZCIgLz4KKyAgICAgIDwvdGhlbj4KKyAgICAgIDxlbHNlPgorICAgICAgICA8dGFza2RlZi13aXRoLWl2eSBvcmdhbmlzYXRpb249InRpZ3JpcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlPSJzdm5hbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uPSIxLjMuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U9Im9yZy90aWdyaXMvc3VidmVyc2lvbi9zdm5hbnQvc3ZuYW50bGliLnhtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcudGlncmlzLnN1YnZlcnNpb24uc3ZuYW50LlN2blRhc2siIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdm5hbnQuaXNpbnN0YWxsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgPC9lbHNlPgorICAgIDwvaWY+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIHRlc3Qtc3ZuYW50CisgICAgCisgICAgICAgIFRlc3RzIFNWTiBieSBwcmludGluZyBvdXQgdGhlIHJlcG9zaXRvcnkKKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXN2bmFudCIgZGVwZW5kcz0iaW5zdGFsbC1zdm5hbnQiPgorICAgIDxzdm4gamF2YWhsPSIke3N2bmFudC51c2UtamF2YWhsfSIgc3Zua2l0PSIke3N2bmFudC51c2Utc3Zua2l0fSI+CisgICAgICA8d2NWZXJzaW9uIHBhdGg9Ii4iIC8+CisgICAgPC9zdm4+CisgICAgPGVjaG8gbWVzc2FnZT0iU3VidmVyc2lvbiByZXBvc2l0b3J5IHVybDogJHtyZXBvc2l0b3J5LnVybH0iIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIHN2bi1yZXZpc2lvbgorICAgIAorICAgICAgICBQcmludHMgYW5kIHNldHMgdGhlIFNWTiByZXZpc2lvbiBmb3IgdGhlIHJlcG9zaXRvcnkgYXQgdGhlIGN1cnJlbnQgZGlyIChpZiBzdm4ucmV2aXNpb24gaXMgbm90IHNldCkKKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJzdm4tcmV2aXNpb24iIGRlcGVuZHM9Imluc3RhbGwtc3ZuYW50Ij4KKworICAgIDxzdm4gamF2YWhsPSIke3N2bmFudC51c2UtamF2YWhsfSIgc3Zua2l0PSIke3N2bmFudC51c2Utc3Zua2l0fSI+CisgICAgICA8c3RhdHVzIHBhdGg9Ii4iIHJldmlzaW9uUHJvcGVydHk9InN2bi5yZXZpc2lvbiIgLz4KKyAgICA8L3N2bj4KKyAgICA8ZWNobyBtZXNzYWdlPSJTdWJ2ZXJzaW9uIHJlcG9zaXRvcnkgcmV2aXNpb246ICR7c3ZuLnJldmlzaW9ufSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgc2V0LWJ1aWxkLmlkCisgICAgCisgICAgICAgIFNldHMgYSBwcm9wZXJ0eSBidWlsZC5pZCB0byB0aGUgZWl0aGVyICJkZXZlbG9wbWVudCIgb3IgdGhlIHN2biByZXZpc2lvbgorICAgICAgICBpZiBpbiByZWxlYXNlIG1vZGUKKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJzZXQtYnVpbGQuaWQiIHVubGVzcz0iYnVpbGQuaWQiIGRlcGVuZHM9Imluc3RhbGwtYW50Y29udHJpYiI+CisgICAgPGlmPgorICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtyZWxlYXNlfSIgLz4KKyAgICAgIDx0aGVuPgorICAgICAgICA8YW50Y2FsbGJhY2sgdGFyZ2V0PSJzdm4tcmV2aXNpb24iIHJldHVybj0ic3ZuLnJldmlzaW9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuaWQiIHZhbHVlPSIke3N2bi5yZXZpc2lvbn0iIC8+CisgICAgICA8L3RoZW4+CisgICAgICA8ZWxzZT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmlkIiB2YWx1ZT0iZGV2ZWxvcG1lbnQiIC8+CisgICAgICA8L2Vsc2U+CisgICAgPC9pZj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgIHZlcnNpb24tcHJvcGVydGllczogY29tbW9uIEFudCBkcml2ZW4gdmVyc2lvbiBmaWxlIGdlbmVyYXRpb24uICBQcm9qZWN0cyB0aGF0IHByb2R1Y2UKKyAgICAgICBhIHBhY2thZ2Ugb3IgcGFja2FnZXMgc2hvdWxkIHJ1biB0aGlzIHRhcmdldC4gIFByb2plY3RzIHRoYXQgcHJvZHVjZQorICAgICAgIGphcnMgb25seSBzaG91bGQgTk9ULgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJ2ZXJzaW9uLXByb3BlcnRpZXMiIGRlcGVuZHM9InNldC1idWlsZC5pZCI+CisgICAgPHRzdGFtcD4KKyAgICAgIDxmb3JtYXQgcHJvcGVydHk9ImJ1aWxkLnRpbWUiIHBhdHRlcm49Inl5eXkvTU0vZGQgaGg6bW0gYWEiIC8+CisgICAgPC90c3RhbXA+CisgICAgPHByb3BlcnR5ZmlsZSBmaWxlPSJ2ZXJzaW9uLnByb3BlcnRpZXMiIGNvbW1lbnQ9IlJlbGVhc2UgQnVpbGQgdmVyc2lvbiBpbmZvIj4KKyAgICAgIDxlbnRyeSBrZXk9InJlbGVhc2UubWFqb3IubnVtYmVyIiB2YWx1ZT0iJHtyZWxlYXNlLm1ham9yLm51bWJlcn0iIC8+CisgICAgICA8ZW50cnkga2V5PSJyZWxlYXNlLm1pbm9yLm51bWJlciIgdmFsdWU9IiR7cmVsZWFzZS5taW5vci5udW1iZXJ9IiAvPgorICAgICAgPGVudHJ5IGtleT0icmVsZWFzZS5taWxlc3RvbmUubnVtYmVyIiB2YWx1ZT0iJHtyZWxlYXNlLm1pbGVzdG9uZS5udW1iZXJ9IiAvPgorICAgICAgPGVudHJ5IGtleT0icmVsZWFzZS5jYW5kaWRhdGUudG9rZW4iIHZhbHVlPSIke3JlbGVhc2UuY2FuZGlkYXRlLnRva2VufSIgLz4KKyAgICAgIDxlbnRyeSBrZXk9ImltcGwudmVuZG9yIiB2YWx1ZT0iJHtpbXBsLnZlbmRvcn0iIC8+CisgICAgICA8ZW50cnkga2V5PSJpbXBsLnZlcnNpb24iCisgICAgICAgICAgICAgdmFsdWU9IiR7cmVsZWFzZS5tYWpvci5udW1iZXJ9LiR7cmVsZWFzZS5taW5vci5udW1iZXJ9LiR7cmVsZWFzZS5taWxlc3RvbmUubnVtYmVyfS4ke2J1aWxkLmlkfSIgLz4KKyAgICAgIDxlbnRyeSBrZXk9ImltcGwudGl0bGUiIHZhbHVlPSIke2ltcGwudGl0bGV9IiAvPgorICAgICAgPGVudHJ5IGtleT0iYnVpbGREYXRlIiB2YWx1ZT0iJHtidWlsZC50aW1lfSIgLz4KKyAgICAgIDxlbnRyeSBrZXk9InN2bi5yZXZpc2lvbiIgdmFsdWU9IiR7YnVpbGQuaWR9IiAvPgorICAgICAgPGVudHJ5IGtleT0icmVsZWFzZS5idWlsZC5udW1iZXIiIGRlZmF1bHQ9IjAiIHR5cGU9ImludCIgb3BlcmF0aW9uPSIrIiB2YWx1ZT0iMSIgcGF0dGVybj0iMDAwMCIgLz4KKyAgICA8L3Byb3BlcnR5ZmlsZT4KKyAgICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS92ZXJzaW9uLnByb3BlcnRpZXMiIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBpbnN0YWxsLWl2eSAKKyAgICAgIAorICAgICAgRmV0Y2hlcyBhbmQgaW5zdGFsbHMgSVZZIGFudCB0YXNrcyBpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQgCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtaXZ5IiBkZXBlbmRzPSJpbnN0YWxsLWFudGNvbnRyaWIiPgorICAgIDxpZj4KKyAgICAgIDxpc3RydWUgdmFsdWU9IiR7aXZ5LmlzaW5zdGFsbGVkfSIgLz4KKyAgICAgIDx0aGVuPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJTa2lwcGluZyBJVlkgaW5zdGFsbC4gIElWWSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQgYnkgdGhlIGJ1aWxkIiAvPgorICAgICAgPC90aGVuPgorICAgICAgPGVsc2U+CisgICAgICAgIDxkb3dubG9hZC1hbnRsaWIgbmFtZT0iaXZ5IiB1cmw9IiR7aXZ5LnVybH0iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5pdnkuYW50Lkl2eVRhc2siIGV4dGVuc2lvbj0iamFyIiAvPgorICAgICAgICA8dGFza2RlZiByZXNvdXJjZT0ib3JnL2FwYWNoZS9pdnkvYW50L2FudGxpYi54bWwiIHVyaT0iYW50bGliOm9yZy5hcGFjaGUuaXZ5LmFudCI+CisgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9pdnkiPgorICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC90YXNrZGVmPgorICAgICAgICA8aXZ5OnNldHRpbmdzIHVybD0iJHtpdnkuc2V0dGluZ3N1cmx9IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaXZ5LmlzaW5zdGFsbGVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgIDwvZWxzZT4KKyAgICA8L2lmPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgaXZ5LmNoZWNrLXJlbGVhc2FibGUKKyAgICAgIAorICAgICAgVmVyaWZpZXMgdGhhdCB0aGVyZSBhcmUgbm8gU05BUFNIT1QgZGVwZW5kZW5jaWVzIGRlZmluZWQgaW4gdGhlIGl2eSB4bWwuCisgICAgICBJZiB0aGVyZSBhcmUgU05BUFNIT1RTLCBmYWlsIHRoZSByZWxlYXNlIGJ1aWxkLgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJpdnkuY2hlY2stcmVsZWFzYWJsZSIgZGVwZW5kcz0iaW5zdGFsbC1pdnksIGluc3RhbGwtYW50Y29udHJpYiI+CisgICAgPGlmPgorICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtyZWxlYXNlfSIgLz4KKyAgICAgIDx0aGVuPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICA8aXZ5OmFydGlmYWN0cHJvcGVydHkgY29uZj0iJHtpdnkuY29uZmlnc30iIG5hbWU9ImRlcC5bbW9kdWxlXS9bYXJ0aWZhY3RdLVtyZXZpc2lvbl0iIHZhbHVlPSJbcmV2aXNpb25dIiAvPgorCisgICAgICAgICAgPHByb3BlcnR5c2VsZWN0b3IgcHJvcGVydHk9InZpb2xhdG9ycyIgbWF0Y2g9ImRlcFwuLipTTkFQU0hPVC4qIiBzZWxlY3Q9IlwwIiBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIgLz4KKworICAgICAgICAgIDxmYWlsIGlmPSJ2aW9sYXRvcnMiCisgICAgICAgICAgICAgICAgbWVzc2FnZT0iUmVsZWFzZSBub3QgcG9zc2libGUsIHlvdSBoYXZlIGRlcGVuZGVuY2llcyBvbiBub24tcmVsZWFzZWQgYXJ0aWZhY3RzOiAke3Zpb2xhdG9yc30iIC8+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgIDwvdGhlbj4KKyAgICA8L2lmPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgcmVzb2x2ZQorICAgICAgCisgICAgICBVc2luZyBpdnkgYW5kIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9qZWN0IChkZWZpbmVkIGluIHRoZSBpdnkueG1sCisgICAgICBmaWxlKSwgdGhpcyB0YXNrIHdpbGwgcmV0cmlldmUgdGhlIG5lZWRlZCBmaWxlcyBhbmQgcGxhY2UgdGhlbSBpbnRvIAorICAgICAgdGhlIGRlZmluZWQgZGlyZWN0b3JpZXMuCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiCisgICAgICAgICAgZGVwZW5kcz0icmVzb2x2ZS1kZWZhdWx0LCByZXNvbHZlLXRlc3QsIGl2eS5jaGVjay1yZWxlYXNhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXRyaWV2ZXMgYWxsIHRoZSBkZXBlbmRlbnQgbGlicmFyaWVzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZS1pbml0IiB1bmxlc3M9InJlc29sdmUtaW5pdC5za2lwIiBkZXBlbmRzPSJpbnN0YWxsLWl2eSI+CisgICAgPCEtLSBJZiB0aGlzIGlzIHRoZSAxc3QgdGltZSB0aHJvdWdoIHJlc29sdmUtaW5pdCwgdGhlbiB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBqYXJzCistLT4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuLWphcnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlc29sdmUtaW5pdC5za2lwIiB2YWx1ZT0iIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc29sdmUtZGVmYXVsdCIgZGVwZW5kcz0icmVzb2x2ZS1kZWZhdWx0LmRlZmF1bHQscmVzb2x2ZS1kZWZhdWx0LmNvbXBvc2l0ZSIvPgorCisgIDwhLS0gCisgIFRoaXMgdGFyZ2V0IHJlc29sdmVzIHRoZSBkZWZhdWx0IElWWSBjb25maWd1cmF0aW9uIGFzIGEgY29tcG9zaXRlIG9mIGNoaWxkIGNvbmZpZ3VyYXRpb25zLgorICBZb3Ugc2hvdWxkIHNldCBpdnkuZGVmYXVsdC5zdWItY29uZmlncyBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMgb25seSBpZiB5b3Ugd2FudCB5b3VyIGRlZmF1bHQKKyAgY29uZmlndXJhdGlvbiB0byBiZSB0cmVhdGVkIGFzIGEgY29tcG9zaXRlIG9mIHR3byBvciBtb3JlIGNoaWxkIGNvbmZpZ3VyYXRpb25zLgorICBUbyB0dXJuIHRoaXMgb24sIHNldCBpdnkuZGVmYXVsdC5zdWItY29uZmlncyBwcm9wZXJ0eSBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMsIGUuZy4KKyAgaXZ5LmRlZmF1bHQuc3ViLWNvbmZpZ3M9ZXh0ZXJuYWwsaW50ZXJuYWwKKyAgTm90ZTogdGhlIHBhcmVudCBjb25maWcgImRlZmF1bHQiIHByb3BlciB3aWxsIG5vdCBiZSByZXNvbHZlZAorICAtLT4KKyAgPHRhcmdldCBuYW1lPSJyZXNvbHZlLWRlZmF1bHQuY29tcG9zaXRlIiBkZXBlbmRzPSJpbnN0YWxsLWFudGNvbnRyaWIscmVzb2x2ZS1pbml0IiBpZj0iaXZ5LmRlZmF1bHQuc3ViLWNvbmZpZ3MiPgorICAgIDxmb3IgbGlzdD0iJHtpdnkuZGVmYXVsdC5zdWItY29uZmlnc30iIHBhcmFtPSJjb25mIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8aXZ5OnJlc29sdmUgZmlsZT0iJHtpdnlmaWxlfSIgY29uZj0iZGVmYXVsdF9Ae2NvbmZ9IiAvPgorICAgICAgICA8aXZ5OnJldHJpZXZlIGNvbmY9ImRlZmF1bHRfQHtjb25mfSIgcGF0dGVybj0iJHtsaWIuZGlyfS9Ae2NvbmZ9L1ttb2R1bGVdLVtyZXZpc2lvbl0oLVtjbGFzc2lmaWVyXSkuW2V4dF0iIHN5bWxpbms9IiR7aXZ5LnVzZS5zeW1saW5rcy5pbnRlcm5hbH0iIC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9mb3I+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZS1kZWZhdWx0LmRlZmF1bHQiIGRlcGVuZHM9InJlc29sdmUtaW5pdCIgdW5sZXNzPSJpdnkuZGVmYXVsdC5zdWItY29uZmlncyI+CisgICAgPGl2eTpyZXNvbHZlIGZpbGU9IiR7aXZ5ZmlsZX0iIGNvbmY9ImRlZmF1bHQiIC8+CisgICAgPGl2eTpyZXRyaWV2ZSBjb25mPSJkZWZhdWx0IiBwYXR0ZXJuPSIke2xpYi5kaXJ9L1ttb2R1bGVdLVtyZXZpc2lvbl0oLVtjbGFzc2lmaWVyXSkuW2V4dF0iIHN5bWxpbms9IiR7aXZ5LnVzZS5zeW1saW5rcy5pbnRlcm5hbH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZS10ZXN0IiBkZXBlbmRzPSJyZXNvbHZlLWluaXQiPgorICAgIDxpdnk6cmVzb2x2ZSBmaWxlPSIke2l2eWZpbGV9IiBjb25mPSJ0ZXN0IiAvPgorICAgIDxpdnk6cmV0cmlldmUgY29uZj0idGVzdCIgcGF0dGVybj0iJHt0ZXN0bGliLmRpcn0vW21vZHVsZV0tW3JldmlzaW9uXSgtW2NsYXNzaWZpZXJdKS5bZXh0XSIgc3ltbGluaz0iJHtpdnkudXNlLnN5bWxpbmtzLmludGVybmFsfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvbHZlLWVudW5jaWF0ZSIgZGVwZW5kcz0icmVzb2x2ZS1pbml0Ij4KKyAgICA8aXZ5OnJlc29sdmUgZmlsZT0iJHtpdnlmaWxlfSIgY29uZj0iZW51bmNpYXRlIiAvPgorICAgIDxpdnk6cmV0cmlldmUgY29uZj0iZW51bmNpYXRlIiBwYXR0ZXJuPSIke2Jhc2VkaXJ9L2VudW5jaWF0ZS9saWIvW21vZHVsZV0tW3JldmlzaW9uXSgtW2NsYXNzaWZpZXJdKS5bZXh0XSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvbHZlLWNvZGVnZW4iIGRlcGVuZHM9InJlc29sdmUtaW5pdCI+CisgICAgPGl2eTpyZXNvbHZlIGZpbGU9IiR7aXZ5ZmlsZX0iIGNvbmY9ImNvZGVnZW4iIC8+CisgICAgPGl2eTpyZXRyaWV2ZSBjb25mPSJjb2RlZ2VuIiBwYXR0ZXJuPSIke2xpYi5kaXJ9L1ttb2R1bGVdLVtyZXZpc2lvbl0oLVtjbGFzc2lmaWVyXSkuW2V4dF0iIHN5bWxpbms9IiR7aXZ5LnVzZS5zeW1saW5rcy5pbnRlcm5hbH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZS1ydW50aW1lIiBkZXBlbmRzPSJyZXNvbHZlLWluaXQiPgorICAgIDxpdnk6cmVzb2x2ZSBmaWxlPSIke2l2eWZpbGV9IiBjb25mPSJydW50aW1lIiAvPgorICAgIDxpdnk6cmV0cmlldmUgY29uZj0icnVudGltZSIgcGF0dGVybj0iJHtsaWIuZGlyfS9bbW9kdWxlXS1bcmV2aXNpb25dKC1bY2xhc3NpZmllcl0pLltleHRdIiBzeW1saW5rPSIke2l2eS51c2Uuc3ltbGlua3MuaW50ZXJuYWx9IiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgaXZ5LWNsZWFuLWNhY2hlCisgICAgICAKKyAgICAgIENsZWFucyB0aGUgSVZZIGNhY2hlLiAgWW91IGFyZSBlcmFzaW5nIElWWSdzIG1lbW9yeS4gIFJ1biB0aGlzIGlmIHlvdSAKKyAgICAgIHdhbnQgdG8gZm9yY2UgSVZZIHRvIGdvIGZldGNoIGFsbCB5b3VyIHByb2plY3QgZGVwZW5kZW5jaWVzIGZyb20gc2NyYXRjaC4KKyAgICAgIFdBUk5JTkc6IHRoaXMgd2lsbCBhZmZlY3QgYWxsIElWWSBwcm9qZWN0cywgbm90IGp1c3QgdGhlIGN1cnJlbnQgd29ya3NwYWNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Iml2eS1jbGVhbi1jYWNoZSIgZGVwZW5kcz0iaW5zdGFsbC1pdnkiPgorICAgIDxpdnk6Y2xlYW5jYWNoZSAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgaXZ5LWNsZWFuLWxvY2FsCisgICAgICAKKyAgICAgIENvbXBsZXRlbHkgY2xlYW5zIHlvdXIgbG9jYWwgcmVwb3NpdG9yeSBvZiBhbnkgZmlsZXMgcHVibGlzaGVkIGxvY2FsbHkKKyAgICAgIGJ5IHdheSBvZiBwdWJsaXNoLWxvY2FsLgorICAgICAgV0FSTklORzogdGhpcyBpcyBhIGdsb2JhbCBhY3Rpb24gYW5kIHdpbGwgYWZmZWN0IG90aGVyIElWWSBwcm9qZWN0cworICAgICAgY3VycmVudGx5IHJlZmVyZW5jaW5nIGEgbG9jYWxseSBwdWJsaXNoZWQgZGVwZW5kZW5jeQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJpdnktY2xlYW4tbG9jYWwiIGRlcGVuZHM9Imluc3RhbGwtaXZ5Ij4KKyAgICA8ZGVsZXRlIGRpcj0iJHtpdnkubG9jYWwuZGVmYXVsdC5yb290fS8iIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBpdnktY2xlYW4tYnktbmFtZQorICAgICAgCisgICAgICBDbGVhbnMgeW91ciBJVlkgY2FjaGUgYW5kIGxvY2FsIHJlcG9zaXRvcnkgb2Ygc3BlY2lmaWMgZmlsZXMuCisgICAgICBXQVJOSU5HOiB0aGlzIGlzIGEgZ2xvYmFsIGFjdGlvbiBhbmQgd2lsbCBhZmZlY3Qgb3RoZXIgSVZZIHByb2plY3RzCisgICAgICBjdXJyZW50bHkgcmVmZXJlbmNpbmcgYSBsb2NhbGx5IHB1Ymxpc2hlZCBkZXBlbmRlbmN5CisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Iml2eS1jbGVhbi1wZW50YWhvIiBkZXBlbmRzPSJpbnN0YWxsLWl2eSI+CisgICAgPG1rZGlyIGRpcj0iJHtpdnkubG9jYWwuZGVmYXVsdC5yb290fSIgLz4KKyAgICA8IS0tIGp1c3QgaW4gY2FzZSBpdCBkb2Vzbid0IGV4aXN0IC0tPgorICAgIDxmb3IgcGFyYW09ImRpciI+CisgICAgICA8cGF0aD4KKyAgICAgICAgPGRpcnNldCBkaXI9IiR7aXZ5LmxvY2FsLmRlZmF1bHQucm9vdH0iIGluY2x1ZGVzPSIqJHtpdnkuY2xlYW4ucGF0dGVybn0qIiAvPgorICAgICAgICA8ZGlyc2V0IGRpcj0iJHtpdnkuZGVmYXVsdC5pdnkudXNlci5kaXJ9L2NhY2hlIiBpbmNsdWRlcz0iKiR7aXZ5LmNsZWFuLnBhdHRlcm59KiIgLz4KKyAgICAgIDwvcGF0aD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZGVsZXRlIGRpcj0iQHtkaXJ9IiBpbmNsdWRlZW1wdHlkaXJzPSJ0cnVlIiAvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvZm9yPgorICAgIDxmb3IgcGFyYW09ImZpbGUiPgorICAgICAgPHBhdGg+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtpdnkubG9jYWwuZGVmYXVsdC5yb290fSIgaW5jbHVkZXM9Iioke2l2eS5jbGVhbi5wYXR0ZXJufSoiIC8+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtpdnkuZGVmYXVsdC5pdnkudXNlci5kaXJ9L2NhY2hlIiBpbmNsdWRlcz0iKiR7aXZ5LmNsZWFuLnBhdHRlcm59KiIgLz4KKyAgICAgIDwvcGF0aD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZGVsZXRlIGZpbGU9IkB7ZmlsZX0iIC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9mb3I+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBpdnktcmVwb3J0CisgICAgICAKKyAgICAgIEdlbmVyYXRlcyBhbiBJVlkgZGVwZW5kZW5jeSByZXBvcnQgZm9yIHRoaXMgcHJvamVjdC4gCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Iml2eS1yZXBvcnQiIGRlcGVuZHM9Imluc3RhbGwtaXZ5Ij4KKyAgICA8aXZ5OnJlc29sdmUgZmlsZT0iJHtpdnlmaWxlfSIgY29uZj0iJHtpdnkuY29uZmlnc30iIC8+CisgICAgPGl2eTpyZXBvcnQgeG1sPSJ0cnVlIiB0b2Rpcj0iJHtpdnkucmVwb3J0cy5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgcHVibGlzaC1sb2NhbC1ub2phcgorICAgICAgCisgICAgICBQdWJsaXNoZXMgdGhlIGphciBmaWxlIGZvciB0aGlzIHByb2plY3QgdG8gdGhlIHVzZXIncyBsb2NhbCByZXBvc2l0b3J5CisgICAgICBmb3IgZG93bmxvYWQgYnkgb3RoZXIgcHJvamVjdHMgY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSB1c2VyJ3MKKyAgICAgIHN5c3RlbS4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0icHVibGlzaC1sb2NhbC1ub2phciIgZGVwZW5kcz0iaW5zdGFsbC1pdnkscHVibGlzaC1sb2NhbC1ub2phci5pbnRlcm5hbCI+CisgICAgPGlmPgorICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3RzLnB1Ymxpc2h9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPHRoZW4+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0icHVibGlzaC1sb2NhbC1ub2phci5pbnRlcm5hbCI+CisgICAgICAgICAgPHBhcmFtIG5hbWU9Iml2eS5hcnRpZmFjdC5pZCIgdmFsdWU9IiR7aXZ5LmFydGlmYWN0LmlkfS10ZXN0Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICAgIDwvdGhlbj4KKyAgICA8L2lmPgorICAgIDxhbnRjYWxsIHRhcmdldD0icHVibGlzaC1sb2NhbC1ub2phci5wb3N0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgcHVibGlzaC1sb2NhbC1ub2phci5wb3N0IHRoaXMgdGFyZ2V0IGlzIGludm9rZWQgYWZ0ZXIgdGhlIG5vcm1hbCBzZXQgb2YgcHVibGlzaC1sb2NhbC1ub2phcgorICAgICAgaXMgY29tcGxldGVkLCBvdmVycmlkZSB0aGlzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBwdWJsaXNoaW5nIGluIGV4dGVuc2lvbnMgb2Ygc3ViZmxvb3IsIGV0YworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJwdWJsaXNoLWxvY2FsLW5vamFyLnBvc3QiPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0icHVibGlzaC1sb2NhbC1ub2phci5pbnRlcm5hbCIgZGVwZW5kcz0iaW5zdGFsbC1pdnkiPgorICAgIDxpdnk6cmVzb2x2ZSBmaWxlPSIke2l2eS5hcnRpZmFjdC5pdnlmaWxlbmFtZX0iIC8+CisgICAgPGl2eTpwdWJsaXNoIHJlc29sdmVyPSJsb2NhbCIgcHVicmV2aXNpb249IiR7cHJvamVjdC5yZXZpc2lvbn0iIG92ZXJ3cml0ZT0idHJ1ZSIgZm9yY2VkZWxpdmVyPSJ0cnVlIiB3YXJub25taXNzaW5nPSJ5ZXMiIGhhbHRvbm1pc3Npbmc9Im5vIj4KKyAgICAgIDxhcnRpZmFjdHMgcGF0dGVybj0iJHtkaXN0LmRpcn0vW2FydGlmYWN0XS1bcmV2aXNpb25dKC1bY2xhc3NpZmllcl0pLltleHRdIiAvPgorICAgIDwvaXZ5OnB1Ymxpc2g+CisgIDwvdGFyZ2V0PgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgcHVibGlzaC1sb2NhbAorICAgICAgCisgICAgICBCdWlsZHMgYW5kIHB1Ymxpc2hlcyB0aGUgamFyIGZpbGUgZm9yIHRoaXMgcHJvamVjdCB0byB0aGUgdXNlcidzIAorICAgICAgbG9jYWwgcmVwb3NpdG9yeSBmb3IgZG93bmxvYWQgYnkgb3RoZXIgcHJvamVjdHMgY3VycmVudGx5IGJlaW5nIAorICAgICAgZXhlY3V0ZWQgb24gdGhlIHVzZXIncyBzeXN0ZW0uCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9InB1Ymxpc2gtbG9jYWwiCisgICAgICAgICAgZGVwZW5kcz0iZGlzdCwgZGlzdC1zb3VyY2UsIHB1Ymxpc2gtbG9jYWwtbm9qYXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkJ1aWxkcyBhbmQgcHVibGlzaGVzIHRoZSBqYXIgZmlsZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeSIgLz4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBwdWJsaXNoCisgICAgCisgICAgICAgIENyZWF0ZXMgYW5kIHB1Ymxpc2hlcyB0aGUgamFyIGZpbGUgZm9yIHRoaXMgcHJvamVjdCB0byBhIE1hdmVuMiAKKyAgICAgICAgcmVwb3NpdG9yeS4gCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0icHVibGlzaCIgZGVwZW5kcz0iZGlzdCwgZGlzdC1zb3VyY2UsIHB1Ymxpc2gtbm9qYXIiPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgcHVibGlzaC1ub2phcgorICAgICAgCisgICAgICBQdWJsaXNoZXMgdGhlIGphciBmaWxlIGZvciB0aGlzIHByb2plY3QgdG8gYSBNYXZlbjIgcmVwb3NpdG9yeS4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0icHVibGlzaC1ub2phciIgZGVwZW5kcz0iaW5zdGFsbC1hbnRjb250cmliLGNyZWF0ZS1wb20saXZ5LmRlbGl2ZXIscHVibGlzaC1ub2phci5pbnRlcm5hbCI+CisgICAgPGlmPgorICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3RzLnB1Ymxpc2h9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPHRoZW4+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0icHVibGlzaC1ub2phci5pbnRlcm5hbCI+CisgICAgICAgICAgPHBhcmFtIG5hbWU9Iml2eS5hcnRpZmFjdC5pZCIgdmFsdWU9IiR7aXZ5LmFydGlmYWN0LmlkfS10ZXN0Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICAgIDwvdGhlbj4KKyAgICA8L2lmPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InB1Ymxpc2gtbm9qYXIuaW50ZXJuYWwiIGRlcGVuZHM9Imluc3RhbGwtYW50Y29udHJpYixjcmVhdGUtcG9tLGl2eS5kZWxpdmVyIj4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9Im1hdmVuLXB1Ymxpc2gtZGVwZW5kZW5jaWVzIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJwdWJsaXNoLmdyb3VwSWQiIHZhbHVlPSIke2l2eS5hcnRpZmFjdC5ncm91cH0iIC8+CisgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5hcnRpZmFjdElkIiB2YWx1ZT0iJHtpdnkuYXJ0aWZhY3QuaWR9IiAvPgorICAgICAgPHBhcmFtIG5hbWU9InB1Ymxpc2gudmVyc2lvbiIgdmFsdWU9IiR7cHJvamVjdC5yZXZpc2lvbn0iIC8+CisgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5maWxlIiB2YWx1ZT0iJHtpdnkuYXJ0aWZhY3QuaXZ5cGF0aG5hbWV9IiAvPgorICAgIDwvYW50Y2FsbD4KKworICAgIDxpZj4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3VyY2UucHVibGlzaH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgIDx0aGVuPgorICAgICAgICAgIDxhbnRjYWxsIHRhcmdldD0ibWF2ZW4tcHVibGlzaC1zb3VyY2VzIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwdWJsaXNoLmdyb3VwSWQiIHZhbHVlPSIke2l2eS5hcnRpZmFjdC5ncm91cH0iIC8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5hcnRpZmFjdElkIiB2YWx1ZT0iJHtpdnkuYXJ0aWZhY3QuaWR9IiAvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InB1Ymxpc2gudmVyc2lvbiIgdmFsdWU9IiR7cHJvamVjdC5yZXZpc2lvbn0iIC8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5maWxlIiB2YWx1ZT0iJHtkaXN0LmRpcn0vJHtpdnkuYXJ0aWZhY3QuaWR9LSR7cHJvamVjdC5yZXZpc2lvbn0tc291cmNlcy5qYXIiIC8+CisgICAgICAgICAgPC9hbnRjYWxsPgorICAgICAgICA8L3RoZW4+CisgICAgPC9pZj4KKworICAgIDxhbnRjYWxsIHRhcmdldD0ibWF2ZW4tcHVibGlzaC1hcnRpZmFjdCI+CisgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5wb21GaWxlIiB2YWx1ZT0iJHtpdnkuYXJ0aWZhY3QucG9tZmlsZX0iIC8+CisgICAgICA8cGFyYW0gbmFtZT0icHVibGlzaC5maWxlIiB2YWx1ZT0iJHtkaXN0LmRpcn0vJHtpdnkuYXJ0aWZhY3QuaWR9LSR7cHJvamVjdC5yZXZpc2lvbn0uamFyIiAvPgorICAgIDwvYW50Y2FsbD4KKworICAgIDxhbnRjYWxsIHRhcmdldD0ibWF2ZW4tcHVibGlzaC5wb3N0Ii8+CisgICAgCisgIDwvdGFyZ2V0PgorCisgIDwhLS0gT3ZlcnJpZGUgdGhpcyBpZiBhbnl0aGluZyBpcyBuZWVkZWQgdG8gYmUgZG9uZSBhZnRlciB0aGUgc3RhbmRhcmQgcGFydHMgb2YgcHVibGlzaCBhcmUgY29tcGxldGVkIC0tPgorICA8IS0tIFN1Y2ggYXM6ICBwdWJsaXNoaW5nIG5vbi1zdGFuZGFyZC9leHRlbmRlZCBhcnRpZmFjdHMsIGV0YyAtLT4KKyAgPHRhcmdldCBuYW1lPSJtYXZlbi1wdWJsaXNoLnBvc3QiLz4KKyAgCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpdnkuZGVsaXZlcgorICAgIAorICAgICAgICBDcmVhdGVzIGEgcHVibGlzaGFibGUgdmVyc2lvbiBvZiB0aGUgaXZ5IGRlcGVuZGVuY2llcyBmaWxlLCBpdnkueG1sCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iaXZ5LmRlbGl2ZXIiIGRlcGVuZHM9InJlc29sdmUiPgorICAgIDxpdnk6ZGVsaXZlciBjb25mPSIqKHB1YmxpYykiIGRlbGl2ZXJwYXR0ZXJuPSIke2Rpc3QuZGlyfS9pdnkueG1sIiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgbWF2ZW4tcHVibGlzaC1kZXBlbmRlbmNpZXMKKyAgICAgIAorICAgICAgQSBmdW5jdGlvbiB0aGF0IGRlcGxveXMgYW4gaXZ5LnhtbCBmaWxlIHRvIGEgbWF2ZW4gcmVwb3NpdG9yeQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJtYXZlbi1wdWJsaXNoLWRlcGVuZGVuY2llcyIgZGVwZW5kcz0iaW5zdGFsbC1hbnRjb250cmliIj4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxmYWlsIG1lc3NhZ2U9Ik5vIGZpbGUgZm91bmQgYXQ6ICR7cHVibGlzaC5maWxlfSI+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtwdWJsaXNoLmZpbGV9IiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIDwvZmFpbD4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IlB1Ymxpc2hpbmcgJHtwdWJsaXNoLmZpbGV9IHRvICR7aXZ5LnJlcG9zaXRvcnkucHVibGlzaH0uLi4iIC8+CisgICAgICA8aWY+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iaXNXaW5kb3dzIiAvPgorICAgICAgICA8dGhlbj4KKyAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJjbWQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii9jIiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0ibXZuLmJhdCIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9ImRlcGxveTpkZXBsb3ktZmlsZSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EcmVwb3NpdG9yeUlkPSR7aXZ5LnJlcG9zaXRvcnkuaWR9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLUR1cmw9JHtpdnkucmVwb3NpdG9yeS5wdWJsaXNofSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EZ3JvdXBJZD0ke3B1Ymxpc2guZ3JvdXBJZH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGFydGlmYWN0SWQ9JHtwdWJsaXNoLmFydGlmYWN0SWR9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLUR2ZXJzaW9uPSR7cHVibGlzaC52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EcGFja2FnaW5nPWl2eS54bWwiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGZpbGU9JHtwdWJsaXNoLmZpbGV9IiAvPgorICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPC90aGVuPgorICAgICAgICA8ZWxzZT4KKyAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJtdm4iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9ImRlcGxveTpkZXBsb3ktZmlsZSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EcmVwb3NpdG9yeUlkPSR7aXZ5LnJlcG9zaXRvcnkuaWR9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLUR1cmw9JHtpdnkucmVwb3NpdG9yeS5wdWJsaXNofSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EZ3JvdXBJZD0ke3B1Ymxpc2guZ3JvdXBJZH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGFydGlmYWN0SWQ9JHtwdWJsaXNoLmFydGlmYWN0SWR9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLUR2ZXJzaW9uPSR7cHVibGlzaC52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EcGFja2FnaW5nPWl2eS54bWwiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGZpbGU9JHtwdWJsaXNoLmZpbGV9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLWUiIC8+CisgICAgICAgICAgPC9leGVjPgorICAgICAgICA8L2Vsc2U+CisgICAgICA8L2lmPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIG1hdmVuLXB1Ymxpc2gtYXJ0aWZhY3QKKyAgICAgIAorICAgICAgQSBmdW5jdGlvbiB0aGF0IGRlcGxveXMgYW4gYXJ0aWZhY3QgdG8gYSBtYXZlbiByZXBvc2l0b3J5CisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Im1hdmVuLXB1Ymxpc2gtYXJ0aWZhY3QiIGRlcGVuZHM9Imluc3RhbGwtYW50Y29udHJpYiI+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJObyBmaWxlIGZvdW5kIGF0OiAke3B1Ymxpc2guZmlsZX0iPgorICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7cHVibGlzaC5maWxlfSIgLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICA8L2ZhaWw+CisgICAgICA8ZWNobyBtZXNzYWdlPSJQdWJsaXNoaW5nICR7cHVibGlzaC5maWxlfSB0byAke2l2eS5yZXBvc2l0b3J5LnB1Ymxpc2h9Li4uIiAvPgorICAgICAgPGlmPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImlzV2luZG93cyIgLz4KKyAgICAgICAgPHRoZW4+CisgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY21kIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIvYyIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Im12bi5iYXQiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJkZXBsb3k6ZGVwbG95LWZpbGUiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke2l2eS5yZXBvc2l0b3J5LmlkfSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7aXZ5LnJlcG9zaXRvcnkucHVibGlzaH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9JHtwdWJsaXNoLnBvbUZpbGV9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPSR7cHVibGlzaC5maWxlfSIgLz4KKyAgICAgICAgICA8L2V4ZWM+CisgICAgICAgIDwvdGhlbj4KKyAgICAgICAgPGVsc2U+CisgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ibXZuIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJkZXBsb3k6ZGVwbG95LWZpbGUiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke2l2eS5yZXBvc2l0b3J5LmlkfSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7aXZ5LnJlcG9zaXRvcnkucHVibGlzaH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9JHtwdWJsaXNoLnBvbUZpbGV9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPSR7cHVibGlzaC5maWxlfSIgLz4KKyAgICAgICAgICA8L2V4ZWM+CisgICAgICAgIDwvZWxzZT4KKyAgICAgIDwvaWY+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgbWF2ZW4tcHVibGlzaC1zb3VyY2VzCisgICAgICAKKyAgICAgIEEgZnVuY3Rpb24gdGhhdCBkZXBsb3lzIGEgamF2YS1zb3VyY2VzIGFydGlmYWN0IHRvIGEgbWF2ZW4gcmVwb3NpdG9yeQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJtYXZlbi1wdWJsaXNoLXNvdXJjZXMiIGRlcGVuZHM9Imluc3RhbGwtYW50Y29udHJpYiI+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJObyBmaWxlIGZvdW5kIGF0OiAke3B1Ymxpc2guZmlsZX0iPgorICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7cHVibGlzaC5maWxlfSIgLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICA8L2ZhaWw+CisgICAgICA8ZWNobyBtZXNzYWdlPSJQdWJsaXNoaW5nICR7cHVibGlzaC5maWxlfSB0byAke2l2eS5yZXBvc2l0b3J5LnB1Ymxpc2h9Li4uIiAvPgorICAgICAgPGlmPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImlzV2luZG93cyIgLz4KKyAgICAgICAgPHRoZW4+CisgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY21kIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIvYyIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Im12bi5iYXQiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJkZXBsb3k6ZGVwbG95LWZpbGUiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke2l2eS5yZXBvc2l0b3J5LmlkfSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7aXZ5LnJlcG9zaXRvcnkucHVibGlzaH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGdyb3VwSWQ9JHtwdWJsaXNoLmdyb3VwSWR9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURhcnRpZmFjdElkPSR7cHVibGlzaC5hcnRpZmFjdElkfSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EdmVyc2lvbj0ke3B1Ymxpc2gudmVyc2lvbn0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGdlbmVyYXRlUG9tPXRydWUiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHBhY2thZ2luZz1qYXZhLXNvdXJjZSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EZmlsZT0ke3B1Ymxpc2guZmlsZX0iIC8+CisgICAgICAgICAgPC9leGVjPgorICAgICAgICA8L3RoZW4+CisgICAgICAgIDxlbHNlPgorICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9Im12biIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iZGVwbG95OmRlcGxveS1maWxlIiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURyZXBvc2l0b3J5SWQ9JHtpdnkucmVwb3NpdG9yeS5pZH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHVybD0ke2l2eS5yZXBvc2l0b3J5LnB1Ymxpc2h9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURncm91cElkPSR7cHVibGlzaC5ncm91cElkfSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1EYXJ0aWZhY3RJZD0ke3B1Ymxpc2guYXJ0aWZhY3RJZH0iIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRHZlcnNpb249JHtwdWJsaXNoLnZlcnNpb259IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURnZW5lcmF0ZVBvbT10cnVlIiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9amF2YS1zb3VyY2UiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItRGZpbGU9JHtwdWJsaXNoLmZpbGV9IiAvPgorICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPC9lbHNlPgorICAgICAgPC9pZj4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjcmVhdGUtcG9tCisgICAgICAKKyAgICAgIENyZWF0ZXMgdGhlIFBPTSBmaWxlIGZvciBwdWJsaXNoaW5nIHRoZSBqYXIgZmlsZSB0byBhIE1hdmVuMiByZXBvc2l0b3J5LgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjcmVhdGUtcG9tIiBkZXBlbmRzPSJpbnN0YWxsLWl2eSI+CisgICAgPGl2eTptYWtlcG9tIGl2eWZpbGU9IiR7aXZ5ZmlsZX0iIHBvbWZpbGU9IiR7ZGlzdC5kaXJ9L3BvbS54bWwiPgorICAgICAgPG1hcHBpbmcgY29uZj0iZGVmYXVsdCIgc2NvcGU9ImNvbXBpbGUiIC8+CisgICAgICA8bWFwcGluZyBjb25mPSJydW50aW1lIiBzY29wZT0icnVudGltZSIgLz4KKyAgICA8L2l2eTptYWtlcG9tPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY2xlYW4tamFycworICAgICAgCisgICAgICBSZW1vdmVzIGFsbCB0aGUgbGlicmFyaWVzIHRoYXQgaGF2ZSBiZWVuIGRvd25sb2FkZWQgZm9yIHRoaXMgcHJvamVjdAorICAgICAgdXNpbmcgdGhlIGl2eSBkZXBlbmRlbmNpZXMuCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWphcnMiPgorICAgIDxkZWxldGUgZGlyPSIke2xpYi5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3RsaWIuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNsZWFuCisgICAgICAKKyAgICAgIFJlbW92ZXMgYWxsIHRoZSBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnVpbGQgcHJvY2Vzcy4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsZWFucyBhbGwgdGhlIGZpbGVzIGdlbmVyYXRlZCBmcm9tIGEgYnVpbGQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIElWWS1kb3dubG9hZGVkIGphcnMgKHNlZSBjbGVhbi1hbGwpIgorICAgICAgICAgIGRlcGVuZHM9ImNsZWFuLXRlc3RzLCBjbGVhbi1jb2JlcnR1cmEsIGNsZWFuLXNvbmFyLCBjbGVhbi1qYXZhZG9jLCBjbGVhbi1kaXN0Ij4KKyAgICA8ZGVsZXRlIGRpcj0iJHtjbGFzc2VzLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7YmluLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjbGVhbi1kaXN0CisgICAgICAKKyAgICAgIFJlbW92ZXMgYWxsIGRpc3QgYXJ0aWZhY3RzCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWRpc3QiPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3QuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNsZWFuLWFsbAorICAgICAgCisgICAgICBSZW1vdmVzIGFsbCB0aGUgbGlicmFyaWVzIHRoYXQgaGF2ZSBiZWVuIGRvd25sb2FkZWQgZm9yIHRoaXMgcHJvamVjdAorICAgICAgaW4gdGhlIHdvcmtzcGFjZSdzIGxpYiBkaXJzIGFzIHdlbGwgYXMgYWxsIHRoZSBmaWxlcyAKKyAgICAgIGdlbmVyYXRlZCBmcm9tIHRoZSBidWlsZCBwcm9jZXNzLgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbi1hbGwiIGRlcGVuZHM9ImNsZWFuLGNsZWFuLWphcnMiIGRlc2NyaXB0aW9uPSJDbGVhbnMgYWxsIHRoZSBnZW5lcmF0ZWQgYW5kIGRlcGVuZGVuY3kgZmlsZXMiIC8+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvcHktbGljZW5zZS1sZ3BsCisgICAgICAKKyAgICAgIENvcGllcyB0aGUgTEdQTCBsaWNlbnNlIGZpbGUgaW50byB0aGUgYmluYXJ5IGRpcmVjdG9yeS4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY29weS1saWNlbnNlLWxncGwiIGlmPSJsZ3BsLWxpY2Vuc2UtYXZhaWwiPgorICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXMuZGlyfS9NRVRBLUlORiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7bGljZW5zZS5kaXJ9IiBpbmNsdWRlcz0ibGdwbC0yLjEudHh0IiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvcHktbGljZW5zZS1ncGwtcGFyZW50CisgICAgICAKKyAgICAgIENvcGllcyB0aGUgR1BMIGxpY2Vuc2UgZmlsZSBmcm9tIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGludG8gdGhlIAorICAgICAgYmluYXJ5IGRpcmVjdG9yeS4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY29weS1saWNlbnNlLWdwbCIgaWY9ImdwbC1saWNlbnNlLWF2YWlsIj4KKyAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0vTUVUQS1JTkYiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2xpY2Vuc2UuZGlyfSIgaW5jbHVkZXM9ImdwbC0yLjAudHh0IiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvbXBpbGUKKyAgICAgIAorICAgICAgQ29tcGlsZXMgdGhlIHNvdXJjZSBjb2RlICh1c2luZyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMpIGludG8gdGhlIAorICAgICAgYmluYXJ5IGRpcmVjdG9yeS4KKyAgICAgIAorICAgICAgTk9URTogVGhpcyBjb250YWlucyBtdWx0aXBsZSBzdWItdGFza3Mgd2hpY2ggd2lsbCBvY2N1ciBpbiB0aGUgCisgICAgICAgICAgICBmb2xsb3dpbmcgb3JkZXIgKHRoaXMgaXMgcHJvdmlkZWQgZm9yIGVhc2llciBvdmVycmlkaW5nIGJ5CisgICAgICAgICAgICB0aGUgYnVpbGQueG1sIHdoaWNoIHdpbGwgaW5jbHVkZSB0aGlzIGZpbGUpLi4uCisgICAgICAgIC0gY29tcGlsZS5wcmUgICAgICA6IGFueXRoaW5nIG5lZWRlZCB0byBwcmVwIGZvciBjb21waWxlCisgICAgICAgIC0gY29tcGlsZS5jb21waWxlICA6IHRoZSBhY3R1YWwgY29tcGlsYXRpb24gc3RlcAorICAgICAgICAtIGNvbXBpbGUuc3JjX2NvcHkgOiBjb3B5aW5nIHRoZSBzb3VyY2UgaW50byB0aGUgYmluIGRpcmVjdG9yeQorICAgICAgICAtIGNvbXBpbGUucmVzX2NvcHkgOiBjb3B5aW5nIHRoZSByZXNvdXJjZXMgaW50byB0aGUgYmluIGRpcmVjdG9yeQorICAgICAgICAtIGNvbXBpbGUubGljX2NvcHkgOiBjb3B5aW5nIHRoZSBsaWNlbnNlIGluZm9ybWF0aW9uIGludG8gdGhlIGJpbiBkaXJlY3RvcnkKKyAgICAgICAgLSBjb21waWxlLnBvc3QgICAgIDogYW55dGhpbmcgbmVlZGVkIGFmdGVyIHRoZSBjb21waWxlIGlzIGRvbmUgCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiCisgICAgICAgICAgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5wcmUsIGNvbXBpbGUuY29tcGlsZSwgY29tcGlsZS5zcmNfY29weSwgY29tcGlsZS5yZXNfY29weSwgY29tcGlsZS5saWNfY29weSwgY29tcGlsZS5wb3N0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJQZXJmb3JtcyBhbGwgdGhlIHN0ZXBzIHRvIHByZXBhcmUgdGhlIGJpbiBkaXJlY3Rvcnkgd2l0aCBhIGNvbXBsZXRlIGNvbXBpbGF0aW9uIiAvPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb21waWxlLnByZQorICAgICAgCisgICAgICBQcmVwYXJlcyB0byBwZXJmb3JtIHRoZSBjb21waWxlLgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlLnByZSIgLz4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY29tcGlsZS5jb21waWxlCisgICAgICAKKyAgICAgIFBlcmZvcm1zIHRoZSBhY3R1YWwgY29tcGlsZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlLmNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgZGVidWc9IiR7amF2YWMuZGVidWd9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtqYXZhYy5kZXByZWNhdGlvbn0iCisgICAgICAgICAgIGZvcms9InRydWUiCisgICAgICAgICAgIG1lbW9yeW1heGltdW1zaXplPSIke2phdmFjLm1heG1lbW9yeX0iCisgICAgICAgICAgIHNvdXJjZT0iJHtqYXZhYy5zb3VyY2V9IgorICAgICAgICAgICB0YXJnZXQ9IiR7amF2YWMudGFyZ2V0fSI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoIiAvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgICA8c3JjIHBhdGg9IiR7c3JjLmRpcn0iIC8+CisgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9IiR7amF2YWMueGxpbnR9IiAvPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb21waWxlLnJlc19jb3B5CisgICAgICAKKyAgICAgIENvcGllcyBhbnkgbmVlZGVkIHJlc291cmNlcyBpbnRvIHRoZSBjbGFzc2VzIGRpcmVjdG9yeS4gIFdpbGwgbm90CisgICAgICBkdXBsaWNhdGUgY29weWluZyBvZiByZXNvdXJjZXMgZnJvbSBzcmMgdHJlZSAoaGFuZGxlZCBieSBjb21waWxlLnNyY19jb3B5CisgICAgICBpZiBqYXIuaW5jbHVkZS5zb3VyY2UgaXMgc2V0LgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlLnJlc19jb3B5IiBkZXBlbmRzPSJpbnN0YWxsLWFudGNvbnRyaWIiPgorICAgIDxpZj4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtyZXMuZGlyfSIgLz4KKyAgICAgIDx0aGVuPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyZXMuZGlyfSIgLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgPC90aGVuPgorICAgIDwvaWY+CisKKyAgICA8aWY+CisgICAgICA8bm90PgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9Imphci5pbmNsdWRlLnNvdXJjZSIgLz4KKyAgICAgIDwvbm90PgorICAgICAgPHRoZW4+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXMuZGlyfSIgZmxhdHRlbj0iZmFsc2UiPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZXhjbHVkZXM9IioqLyouamF2YSIgLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgPC90aGVuPgorICAgIDwvaWY+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb21waWxlLnNyY19jb3B5CisgICAgICAKKyAgICAgIENvcGllcyB0aGUgc291cmNlIGZpbGVzIHRvIHRoZSBiaW4gZGlyZWN0b3J5CisgICAgICBOT1RFOiBpZiB0aGUgZG9udC5jb3B5LnNvdXJjZSB2YXJpYWJsZSBleGlzdHMsIHRoaXMgc3RlcCB3aWxsIGJlCisgICAgICAgICAgICBza2lwcGVkIQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlLnNyY19jb3B5IiBkZXBlbmRzPSJpbml0IiBpZj0iamFyLmluY2x1ZGUuc291cmNlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iIGZsYXR0ZW49ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb21waWxlLmxpY19jb3B5CisgICAgICAKKyAgICAgIENvcGllcyB0aGUgbGljZW5zZSBmaWxlKHMpIGludG8gdGhlIGJpbiBkaXJlY3RvcnkKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5saWNfY29weSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibGdwbC1saWNlbnNlLWF2YWlsIj4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtsaWNlbnNlLmRpcn0vbGdwbC0yLjEudHh0IiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhbnRjYWxsIHRhcmdldD0iY29weS1saWNlbnNlLWxncGwiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZ3BsLWxpY2Vuc2UtYXZhaWwiPgorICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2xpY2Vuc2UuZGlyfS9ncGwtMi4wLnR4dCIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvcHktbGljZW5zZS1ncGwiIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb21waWxlLnBvc3QKKyAgICAgIAorICAgICAgUGVyZm9ybXMgYW55IG5lZWRlZCBwb3N0LWNvbXBpbGUgdGFza3MKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5wb3N0IiAvPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBqYXIKKyAgICAgIAorICAgICAgQ3JlYXRlcyBhIGphciBmaWxlIGZyb20gdGhlIGJpbiBkaXJlY3RvcnkKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iamFyIgorICAgICAgICAgIGRlcGVuZHM9Imphci5tYWluLGphci50ZXN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJKYXJzIHVwIHRoZSBiaW4gZGlyZWN0b3J5IGFmdGVyIGEgY29tcGlsZSI+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gamFyIHRoZSB0ZXN0cyBPTkxZIElGIHRlc3RzLnB1Ymxpc2ggaXQgdHJ1ZSAtLT4KKyAgPCEtLSBpZiB0aGUgY29tcGlsZS10ZXN0cyB0YXJnZXQgaXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdCBmb3IgdGhpcyB0YXJnZXQsIC0tPgorICA8IS0tIGl0IHdpbGwgZ2V0IGV4ZWN1dGVkIG5vIG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBvZiB0ZXN0cy5wdWJsaXNoIGlzICAgICAgLS0+CisgIDx0YXJnZXQgbmFtZT0iamFyLnRlc3QiCisgICAgICAgICAgaWY9InRlc3RzLnB1Ymxpc2giPgorICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcGlsZS10ZXN0cyIgLz4KKyAgICA8amFyIGRlc3RmaWxlPSIke2Rpc3QuZGlyfS8ke2l2eS5hcnRpZmFjdC5pZH0tdGVzdC0ke3Byb2plY3QucmV2aXNpb259LmphciIgbWFuaWZlc3Q9IiR7ZGlzdC5tYW5pZmVzdC5maWxlfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGNsYXNzZXMuZGlyfSIvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imphci5tYWluIgorICAgICAgICAgIGRlcGVuZHM9ImNvbXBpbGUsc2V0LWJ1aWxkLmlkLGdlbmVyYXRlLm1hbmlmZXN0Ij4KKyAgICA8amFyIGRlc3RmaWxlPSIke2Rpc3QuZGlyfS8ke2l2eS5hcnRpZmFjdC5pZH0tJHtwcm9qZWN0LnJldmlzaW9ufS5qYXIiIG1hbmlmZXN0PSIke2Rpc3QubWFuaWZlc3QuZmlsZX0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSIgLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBnZW5lcmF0ZS5tYW5pZmVzdAorICAgICAgCisgICAgICBDcmVhdGVzIGEgbmV3IG1hbmlmZXN0IGZpbGUgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQsIG9yIHVwZGF0ZXMKKyAgICAgIGFuIGV4aXN0aW5nIG1hbmlmZXN0IGZpbGUgaWYgb25lIGlzIHNwZWNpZmllZC4KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUubWFuaWZlc3QiIGRlcGVuZHM9ImluaXQsc2V0LWJ1aWxkLmlkIj4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7ZGlzdC5tYW5pZmVzdC5maWxlfSIgLz4KKyAgICA8dG91Y2ggZmlsZT0iJHtkaXN0Lm1hbmlmZXN0LmZpbGV9IiAvPgorICAgIDxjb3B5IGZpbGU9IiR7bWFuaWZlc3QuZmlsZX0iIHRvZmlsZT0iJHtkaXN0Lm1hbmlmZXN0LmZpbGV9IiBvdmVyd3JpdGU9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KKworICAgIDxtYW5pZmVzdCBmaWxlPSIke2Rpc3QubWFuaWZlc3QuZmlsZX0iIG1vZGU9InVwZGF0ZSI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVRpdGxlIiB2YWx1ZT0iJHtpbXBsLnRpdGxlfSIgLz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7cHJvamVjdC5yZXZpc2lvbn0uJHtidWlsZC5pZH0iIC8+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlbmRvciIgdmFsdWU9IiR7aW1wbC52ZW5kb3J9IiAvPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1Qcm9kdWN0SUQiIHZhbHVlPSIke2ltcGwucHJvZHVjdElEfSIgLz4KKyAgICA8L21hbmlmZXN0PgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgZGlzdC1zb3VyY2UKKyAgICAgIAorICAgICAgR2VuZXJhdGVzIHppcCBhbmQgdGFyZ3ogZGlzdHJpYnV0aW9ucyBvZiB0aGUgamF2YWRvYworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LXNvdXJjZSIgZGVwZW5kcz0ic291cmNlLmphciwgc291cmNlLnppcCwgc291cmNlLnRhcmd6IiAvPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBzb3VyY2UuamFyCisgICAgICAKKyAgICAgIENyZWF0ZXMgYSBqYXIgb2YgdGhlIHByb2plY3Qgc291cmNlIGZvciBkaXN0cmlidXRpb24KKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0ic291cmNlLmphciIgZGVwZW5kcz0iaW5pdCxpbnN0YWxsLWFudGNvbnRyaWIiPgorICAgIDxqYXIgamFyZmlsZT0iJHtkaXN0LmRpcn0vJHtpdnkuYXJ0aWZhY3QuaWR9LSR7cHJvamVjdC5yZXZpc2lvbn0tc291cmNlcy5qYXIiIGJhc2VkaXI9IiR7c3JjLmRpcn0iIC8+CisgICAgPGlmPgorICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3RzLnB1Ymxpc2h9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPHRoZW4+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHtkaXN0LmRpcn0vJHtpdnkuYXJ0aWZhY3QuaWR9LXRlc3QtJHtwcm9qZWN0LnJldmlzaW9ufS1zb3VyY2VzLmphciIgYmFzZWRpcj0iJHtzcmMuZGlyfSIgLz4KKyAgICAgIDwvdGhlbj4KKyAgICA8L2lmPgorICA8L3RhcmdldD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIHNvdXJjZS56aXAKKyAgICAgIAorICAgICAgQ3JlYXRlcyBhIHppcCBvZiB0aGUgcHJvamVjdCBzb3VyY2UgZm9yIGRpc3RyaWJ1dGlvbgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJzb3VyY2UuemlwIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8amFyIGphcmZpbGU9IiR7ZGlzdC5kaXJ9LyR7c291cmNlLnppcC5maWxlbmFtZX0iIGJhc2VkaXI9IiR7c3JjLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgc291cmNlLnRhcmd6CisgICAgICAKKyAgICAgIENyZWF0ZXMgYSBnemlwcGVkIHRhciBvZiB0aGUgcHJvamVjdCBzb3VyY2UgZm9yIGRpc3RyaWJ1dGlvbgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJzb3VyY2UudGFyZ3oiIGRlcGVuZHM9ImluaXQiPgorICAgIDx0YXIgY29tcHJlc3Npb249Imd6aXAiIGRlc3RmaWxlPSIke2Rpc3QuZGlyfS8ke3NvdXJjZS50YXIuZmlsZW5hbWV9IiBiYXNlZGlyPSIke3NyYy5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY2xlYW4tdGVzdHMKKyAgICAgIAorICAgICAgUmVtb3ZlcyBhbGwgZmlsZXMgcmVsYXRlZCB0byB0ZXN0cworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbi10ZXN0cyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdGJpbi5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgaW5pdC10ZXN0cworICAgICAgCisgICAgICBDb21waWxlcyBwcm9qZWN0IHRlc3Qgc291cmNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImluaXQtdGVzdHMiIGRlcGVuZHM9ImNsZWFuLXRlc3RzIj4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3RjbGFzc2VzLmRpcn0iIC8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0c3JjLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb21waWxlLXRlc3RzCisgICAgICAKKyAgICAgIENvbXBpbGVzIHByb2plY3QgdGVzdCBzb3VyY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iaW5pdC10ZXN0cyI+CisgICAgPGphdmFjIGRlc3RkaXI9IiR7dGVzdGNsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgZGVidWc9InRydWUiCisgICAgICAgICAgIG9wdGltaXplPSJmYWxzZSIKKyAgICAgICAgICAgc291cmNlPSIke2phdmFjLnNvdXJjZX0iCisgICAgICAgICAgIHRhcmdldD0iJHtqYXZhYy50YXJnZXR9IgorICAgICAgICAgICBmb3JrPSJ0cnVlIj4KKyAgICAgIDxzcmMgcGF0aD0iJHt0ZXN0c3JjLmRpcn0iIC8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgICAgPCEtLSBDb3B5IHRoZSBub24tamF2YSBmaWxlcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRvIHRoZSB0ZXN0IGNsYXNzZXMgZGlyZWN0b3J5CistLT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0c3JjLmRpcn0iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgdGVzdAorICAgICAgCisgICAgICBDb21waWxlcyBhbmQgcnVucyBhbGwgdGhlIHRlc3RzIGZvciB0aGUgcHJvamVjdAorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJjb21waWxlLGNvbXBpbGUtdGVzdHMsIGluaXQtdGVzdC1yZXBvcnRzIiBkZXNjcmlwdGlvbj0iQ29tcGlsZXMgYW5kIHJ1bnMgdW5pdCB0ZXN0cyI+CisgICAgPGp1bml0IG1heG1lbW9yeT0iJHtqdW5pdC5tYXhtZW1vcnl9IgorICAgICAgICAgICBkaXI9IiR7anVuaXQuYmFzZS5kaXJ9IgorICAgICAgICAgICBmb3JrPSJ5ZXMiCisgICAgICAgICAgIGZvcmttb2RlPSIke2p1bml0LmZvcmttb2RlfSIKKyAgICAgICAgICAgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0LmZhaWxlZCIKKyAgICAgICAgICAgaGFsdG9uZmFpbHVyZT0iJHtqdW5pdC5oYWx0b25mYWlsdXJlfSIKKyAgICAgICAgICAgaGFsdG9uZXJyb3I9IiR7anVuaXQuaGFsdG9uZXJyb3J9IgorICAgICAgICAgICBwcmludHN1bW1hcnk9InllcyI+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZhLmF3dC5oZWFkbGVzcyIgdmFsdWU9IiR7aGVhZGxlc3MudW5pdHRlc3R9IiAvPgorICAgICAgCisgICAgICA8c3lzcHJvcGVydHlzZXQ+CisgICAgICAgIDxwcm9wZXJ0eXJlZiBwcmVmaXg9Imp1bml0LnN5c3Byb3AuIiAvPgorICAgICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209Imp1bml0LnN5c3Byb3AuKiIgdG89IioiLz4KKyAgICAgIDwvc3lzcHJvcGVydHlzZXQ+CisgICAgICAKKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIiAvPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIC8+CisgICAgICA8dGVzdCBuYW1lPSIke3Rlc3RjYXNlfSIgdG9kaXI9IiR7dGVzdHJlcG9ydHMueG1sLmRpcn0iIGlmPSJ0ZXN0Y2FzZSIgLz4KKyAgICAgIDxiYXRjaHRlc3QgZm9yaz0ieWVzIiB0b2Rpcj0iJHt0ZXN0cmVwb3J0cy54bWwuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0c3JjLmRpcn0iIGNhc2VzZW5zaXRpdmU9InllcyI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKlRlc3QuamF2YSIgLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9iYXRjaHRlc3Q+CisgICAgPC9qdW5pdD4KKworICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHt0ZXN0cmVwb3J0cy5odG1sLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3RyZXBvcnRzLnhtbC5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke3Rlc3RyZXBvcnRzLmh0bWwuZGlyfSIgLz4KKyAgICA8L2p1bml0cmVwb3J0PgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGNsZWFuLXRlc3QtcmVwb3J0cworCisgICAgUmVtb3ZlIGFsbCB4bWwgYW5kIGh0bWwgSlVuaXQgdGVzdCByZXBvcnRzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbi10ZXN0LXJlcG9ydHMiPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3RyZXBvcnRzLnhtbC5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3RyZXBvcnRzLmh0bWwuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBpbml0LXRlc3QtcmVwb3J0cworCisgICAgUHJlcGFyZSBkaXJlY3RvcmllcyBmb3IgSlVuaXQgdGVzdCByZXBvcnRzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJpbml0LXRlc3QtcmVwb3J0cyIgZGVwZW5kcz0iY2xlYW4tdGVzdC1yZXBvcnRzIj4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3RyZXBvcnRzLnhtbC5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdHJlcG9ydHMuaHRtbC5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGRpc3QKKyAgICAgIAorICAgICAgQ3JlYXRlcyBhIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIHByb2plY3QKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iamFyIiBkZXNjcmlwdGlvbj0iQ3JlYXRlcyBhIGRpc3RyaWJ1dGlvbiIgLz4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgZGlzdC1mdWxsCisgICAgICAKKyAgICAgIENyZWF0ZXMgYSBkaXN0cmlidXRpb24gb2YgdGhpcyBwcm9qZWN0IGluY2x1ZGluZyBhbGwgc291cmNlcyBuZWVkZWQKKyAgICAgIHRvIGJ1aWxkIGFzIHdlbGwgYXMgdGhlIHJlc3VsdGFudCBqYXIKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1mdWxsIiBkZXBlbmRzPSJqYXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZXMgYWxsIHRoZSBkaXN0cmlidXRhYmxlIGl0ZW1zIGZvciB0aGlzIHByb2plY3QiPgorICAgIDwhLS0gQ3JlYXRlIHRoZSByZXF1aXJlZCB6aXAgZGlzdHJpYnV0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBlbnRpcmUgcHJvamVjdCAtLT4KKyAgICA8emlwIGRlc3RmaWxlPSIke2Rpc3QuZGlyfS8ke2l2eS5hcnRpZmFjdC5pZH0tJHtwcm9qZWN0LnJldmlzaW9ufS56aXAiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYmluLyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJkaXN0LyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJlY2xpcHNlLWJpbi8iLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtkaXN0LmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgIDwvemlwPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgamF2YWRvYworICAgICAgCisgICAgICBHZW5lcmF0ZXMgamF2YWRvYyBzb3VyY2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBwcm9qZWN0CisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9ImphdmFkb2MuaW5pdCwgY29tcGlsZSI+CisgICAgPGphdmFkb2MgZGVzdGRpcj0iJHtqYXZhZG9jLmRpcn0vZG9jcy9hcGkiCisgICAgICAgICAgICAgYWNjZXNzPSJwdWJsaWMiCisgICAgICAgICAgICAgc291cmNlPSI2IgorICAgICAgICAgICAgIHVzZT0idHJ1ZSIKKyAgICAgICAgICAgICBub3RyZWU9ImZhbHNlIgorICAgICAgICAgICAgIG5vbmF2YmFyPSJmYWxzZSIKKyAgICAgICAgICAgICBub2luZGV4PSJmYWxzZSIKKyAgICAgICAgICAgICBzcGxpdGluZGV4PSJ0cnVlIgorICAgICAgICAgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgICAgICAgICB2ZXJzaW9uPSJ0cnVlIgorICAgICAgICAgICAgIG1heG1lbW9yeT0iMjU2TSIKKyAgICAgICAgICAgICBub2RlcHJlY2F0ZWRsaXN0PSJmYWxzZSIKKyAgICAgICAgICAgICBub2RlcHJlY2F0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgIHBhY2thZ2VuYW1lcz0iJHtqYXZhZG9jLnBhY2thZ2VuYW1lc30iCisgICAgICAgICAgICAgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIKKyAgICAgICAgICAgICBkb2N0aXRsZT0iJHtpbXBsLnRpdGxlfSBkb2N1bWVudGF0aW9uIj4KKyAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzYvZG9jcy9hcGkvIiAvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIiAvPgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgCQorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwllbnVuY2lhdGUKKyAgICAgICAgCisJR2VuZXJhdGVzIGVudW5jaWF0ZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcmVzb3J1Y2UgCisJY2xhc3NlcyBjb21wcmlzaW5nIHRoZSBCSVNlcnZlciBSRVNUIGFwaQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImVudW5jaWF0ZSIgZGVwZW5kcz0icmVzb2x2ZS1lbnVuY2lhdGUiPgorICAgIDxwYXRoIGlkPSJlbnVuY2lhdGUuY2xhc3NwYXRoIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgICAgCTxleGNsdWRlIG5hbWU9InNheG9uKi5qYXIiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZGlyc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iIC8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZW51bmNpYXRlLmhvbWV9L2xpYiI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvcGF0aD4KKworICAgIDx0YXNrZGVmIG5hbWU9ImVudW5jaWF0ZSIgY2xhc3NuYW1lPSJvcmcuY29kZWhhdXMuZW51bmNpYXRlLm1haW4uRW51bmNpYXRlVGFzayI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJlbnVuY2lhdGUuY2xhc3NwYXRoIiAvPgorICAgIDwvdGFza2RlZj4KKworICAgIDxlbnVuY2lhdGUgZGlyPSIke2Jhc2VkaXJ9L3NyYyIgCisgICAgICAgICAgICAgICBjb25maWdGaWxlPSIke2Jhc2VkaXJ9L2VudW5jaWF0ZS54bWwiIAorICAgICAgICAgICAgICAgZ2VuZXJhdGVEaXI9IiR7ZW51bmNpYXRlLmJpbi5kaXJ9L2dlbmVyYXRlIiAKKyAgICAgICAgICAgICAgIGNvbXBpbGVEaXI9IiR7ZW51bmNpYXRlLmJpbi5kaXJ9L2NvbXBpbGUiIAorICAgICAgICAgICAgICAgYnVpbGREaXI9IiR7ZW51bmNpYXRlLmJpbi5kaXJ9L2J1aWxkIiAKKyAgICAgICAgICAgICAgIHBhY2thZ2VEaXI9IiR7ZW51bmNpYXRlLmJpbi5kaXJ9L3BhY2thZ2UiIAorICAgICAgICAgICAgICAgdmVyYm9zZT0idHJ1ZSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICA8IS0tIGhhdmUgdG8gZXhjbHVkZSBjbGFzcyB0aGF0IGNvbnRhaW5zIGplcnNleSBtdWx0aXBhcnQgZW5kcG9pbnQgdW50aWwgaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9FTlVOQ0lBVEUtNTM3IGlzIGZpeGVkIC0tPgorICAgICAgCisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJlbnVuY2lhdGUuY2xhc3NwYXRoIiAvPgorICAgICAgPGV4cG9ydCBhcnRpZmFjdElkPSJkb2NzIiBkZXN0aW5hdGlvbj0iJHtkaXN0LmRpcn0vJHtlbnVuY2lhdGUucGFja2FnZW5hbWV9LnppcCIgLz4KKyAgICA8L2VudW5jaWF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBkaXN0LWphdmFkb2MKKyAgICAgIAorICAgICAgR2VuZXJhdGVzIHppcCBhbmQgdGFyZ3ogZGlzdHJpYnV0aW9ucyBvZiB0aGUgamF2YWRvYworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWphdmFkb2MiIGRlcGVuZHM9ImphdmFkb2MuemlwLCBqYXZhZG9jLnRhcmd6IiAvPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjbGVhbi1qYXZhZG9jCisgICAgICAKKyAgICAgIFJlbW92ZXMgZ2VuZXJhdGVkIGphdmFkb2MgZmlsZXMgKG5vdGUsIHRoaXMgZG9lcyBub3QgcmVtb3ZlIGphdmFkb2MgZGlzdHJpYnV0aW9ucy4KKyAgICAgIFVzZSBjbGVhbi1kaXN0IHRvIHJlbW92ZSBhcnRpZmFjdHMgZnJvbSB0aGUgZGlzdC5kaXIuCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWphdmFkb2MiPgorICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2MuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGphdmFkb2MuaW5pdAorICAgICAgCisgICAgICBDcmVhdGVzIGRpcmVjdG9yaWVzIGZvciBqYXZhZG9jIHByb2Nlc3MKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYy5pbml0IiBkZXBlbmRzPSJjbGVhbi1qYXZhZG9jIj4KKyAgICA8bWtkaXIgZGlyPSIke2phdmFkb2MuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGphdmFkb2MuemlwCisgICAgICAKKyAgICAgIENyZWF0ZXMgYSB6aXAgb2YgdGhlIGphdmFkb2MgZm9yIGRpc3RyaWJ1dGlvbgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jLnppcCIgZGVwZW5kcz0iamF2YWRvYyI+CisgICAgPGphciBqYXJmaWxlPSIke2Rpc3QuZGlyfS8ke2phdmFkb2MuemlwLmZpbGVuYW1lfSIKKyAgICAgICAgIGJhc2VkaXI9IiR7amF2YWRvYy5kaXJ9IgorICAgICAgICAgaW5jbHVkZXM9IioqLyoiCisgICAgICAgICBleGNsdWRlcz0iKiovVGh1bWJzLmRiIiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgamF2YWRvYy50YXJnegorICAgICAgCisgICAgICBDcmVhdGVzIGEgZ3ppcHBlZCB0YXIgb2YgdGhlIGphdmFkb2MgZm9yIGRpc3RyaWJ1dGlvbgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jLnRhcmd6IiBkZXBlbmRzPSJqYXZhZG9jIj4KKyAgICA8dGFyIGNvbXByZXNzaW9uPSJnemlwIgorICAgICAgICAgZGVzdGZpbGU9IiR7ZGlzdC5kaXJ9LyR7amF2YWRvYy50YXIuZmlsZW5hbWV9IgorICAgICAgICAgYmFzZWRpcj0iJHtqYXZhZG9jLmRpcn0iCisgICAgICAgICBpbmNsdWRlcz0iKiovKiIKKyAgICAgICAgIGV4Y2x1ZGVzPSIqKi9UaHVtYnMuZGIiIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjb2JlcnR1cmEKKyAgICAgIAorICAgICAgUnVucyB0ZXN0cyBpbiBhbiBpbnN0cnVtZW50ZWQgZW52aXJvbm1lbnQgYW5kIHByb2R1Y2VzIENvYmVydHVyYSB0ZXN0IGNvdmVyYWdlIHJlcG9ydHMKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY29iZXJ0dXJhIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHRlc3RzIGluIGFuIGluc3RydW1lbnRlZCBlbnZpcm9ubWVudCBhbmQgcHJvZHVjZXMgQ29iZXJ0dXJhIHRlc3QgY292ZXJhZ2UgcmVwb3J0cyIKKyAgICAgICAgICBkZXBlbmRzPSJjbGVhbi1jb2JlcnR1cmEsaW5zdGFsbC1jb2JlcnR1cmEsY29tcGlsZSxjb21waWxlLXRlc3RzLGNvYmVydHVyYS5pbnN0cnVtZW50LWNsYXNzZXMsY29iZXJ0dXJhLnRlc3QtaW5zdHJ1bWVudGVkLGNvYmVydHVyYS54bWwtcmVwb3J0LGNvYmVydHVyYS5odG1sLXJlcG9ydCIgLz4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY29iZXJ0dXJhLmluc3RydW1lbnQtY2xhc3NlcworICAgICAgCisgICAgICBJbnN0cnVtZW50cyB0aGUgYXBwbGljYXRpb24gY2xhc3NlcyB1c2VkIGJ5IENvYmVydHVyYSBkdXJpbmcgY29iZXJ0dXJhLnRlc3QtaW5zdHJ1bWVudGVkCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNvYmVydHVyYS5pbnN0cnVtZW50LWNsYXNzZXMiIGRlcGVuZHM9ImNvYmVydHVyYS5jbGVhbi1pbnN0cnVtZW50ZWQtY2xhc3NlcyxpbnN0YWxsLWNvYmVydHVyYSxjb21waWxlIj4KKyAgICA8Y29iZXJ0dXJhLWluc3RydW1lbnQgdG9kaXI9IiR7aW5zdHJ1bWVudGVkLmNsYXNzZXMuZGlyfSIgZGF0YWZpbGU9IiR7Y29iZXJ0dXJhLmRhdGEuZGlyfS9jb2JlcnR1cmEuc2VyIj4KKyAgICAgIDxpZ25vcmUgcmVnZXg9Im9yZy5hcGFjaGUubG9nNGouKiIgLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICA8IS0tCisgICAgICAgICAgSW5zdHJ1bWVudCBhbGwgdGhlIGFwcGxpY2F0aW9uIGNsYXNzZXMsIGJ1dAorICAgICAgICAgIGRvbid0IGluc3RydW1lbnQgdGhlIHRlc3QgY2xhc3Nlcy4KKyAgICAgICAgLS0+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLypUZXN0LmNsYXNzIiAvPgorICAgICAgPC9maWxlc2V0PgorCisgICAgPC9jb2JlcnR1cmEtaW5zdHJ1bWVudD4KKyAgPC90YXJnZXQ+CisKKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgaW5zdGFsbC1jb2JlcnR1cmEKKyAgICAgIAorICAgICAgRG93bmxvYWRzIGFuZCBpbnN0YWxscyBDb2JlcnR1cmEgYW50IHRhc2tzCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtY29iZXJ0dXJhIiBkZXBlbmRzPSJpbnN0YWxsLWl2eSI+CisgICAgPHRhc2tkZWYtd2l0aC1pdnkgb3JnYW5pc2F0aW9uPSJuZXQuc291cmNlZm9yZ2UuY29iZXJ0dXJhIiBtb2R1bGU9ImNvYmVydHVyYSIgcmV2aXNpb249IiR7Y29iZXJ0dXJhLnZlcnNpb259IiByZXNvdXJjZT0idGFza3MucHJvcGVydGllcyIgY2xhc3NuYW1lPSJuZXQuc291cmNlZm9yZ2UuY29iZXJ0dXJhLmFudC5JbnN0cnVtZW50VGFzayIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgY2xlYW4tY29iZXJ0dXJhCisgICAgICAKKyAgICAgIFJlbW92ZXMgYWxsIGZpbGVzIGNyZWF0ZWQgYnkgQ29iZXJ0dXJhIGNvZGUgY292ZXJhZ2UgdXRpbGl0eQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbi1jb2JlcnR1cmEiIGRlcGVuZHM9ImNvYmVydHVyYS5jbGVhbi1pbnN0cnVtZW50ZWQtY2xhc3Nlcyxjb2JlcnR1cmEuY2xlYW4tY292ZXJhZ2UtcmVwb3J0cyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y29iZXJ0dXJhLmRhdGEuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBjbGVhbi1zb25hcgorICAgICAgCisgICAgICBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbiBmb3Igc29uYXIgZmlsZXMKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4tc29uYXIiPgorICAgIDxkZWxldGUgZGlyPSIke2Jhc2VkaXJ9Ly5zb25hciIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBjb2JlcnR1cmEuY2xlYW4taW5zdHJ1bWVudGVkLWNsYXNzZXMKKworICAgIFJlbW92ZSB0aGUgaW5zdHJ1bWVudGVkIGNsYXNzZXMgdXNlZCBieSBDb2JlcnR1cmEKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNvYmVydHVyYS5jbGVhbi1pbnN0cnVtZW50ZWQtY2xhc3NlcyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7aW5zdHJ1bWVudGVkLmNsYXNzZXMuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBjb2JlcnR1cmEuY2xlYW4tY292ZXJhZ2UtcmVwb3J0cworCisgICAgUmVtb3ZlIGFsbCB4bWwgYW5kIGh0bWwgQ29iZXJ0dXJhIGNvdmVyYWdlIHJlcG9ydHMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNvYmVydHVyYS5jbGVhbi1jb3ZlcmFnZS1yZXBvcnRzIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtjb2JlcnR1cmFyZXBvcnRzLnhtbC5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2NvYmVydHVyYXJlcG9ydHMuaHRtbC5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2NvYmVydHVyYXJlcG9ydHMuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvYmVydHVyYS50ZXN0LWluc3RydW1lbnRlZAorICAgICAgCisgICAgICBSdW5zIHRlc3RzIGFnYWluc3QgaW5zdHJ1bWVudGVkIGNsYXNzZXMgYW5kIGdlbmVyYXRlcyB4bWwgYW5kIGh0bWwgSlVuaXQgdGVzdCByZXBvcnRzCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNvYmVydHVyYS50ZXN0LWluc3RydW1lbnRlZCIKKyAgICAgICAgICBkZXBlbmRzPSJpbml0LXRlc3QtcmVwb3J0cyxpbnN0YWxsLWNvYmVydHVyYSxjb21waWxlLGNvbXBpbGUtdGVzdHMsY29iZXJ0dXJhLmluc3RydW1lbnQtY2xhc3NlcyI+CisgICAgPG1rZGlyIGRpcj0iJHtpbnN0cnVtZW50ZWQuY2xhc3Nlcy5kaXJ9IiAvPgorICAgIDxwYXRoIGlkPSJjb2JlcnR1cmEuY2xhc3NwYXRoIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9jb2JlcnR1cmEtJHtjb2JlcnR1cmEudmVyc2lvbn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3BhdGg+CisgICAgPGp1bml0IGZvcms9InllcyIKKyAgICAgICAgICAgZm9ya21vZGU9IiR7anVuaXQuZm9ya21vZGV9IgorICAgICAgICAgICBkaXI9IiR7anVuaXQuYmFzZS5kaXJ9IgorICAgICAgICAgICBtYXhtZW1vcnk9IiR7anVuaXQubWF4bWVtb3J5fSIKKyAgICAgICAgICAgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0LmZhaWxlZCIKKyAgICAgICAgICAgaGFsdG9uZXJyb3I9IiR7anVuaXQuaGFsdG9uZXJyb3J9IgorICAgICAgICAgICBoYWx0b25mYWlsdXJlPSIke2p1bml0LmhhbHRvbmZhaWx1cmV9Ij4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmEuYXd0LmhlYWRsZXNzIiB2YWx1ZT0iJHtoZWFkbGVzcy51bml0dGVzdH0iIC8+CisKKyAgICAgIDwhLS0gU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgY292ZXJhZ2UgZGF0YSBmaWxlIHRvIHVzZS4gLS0+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJuZXQuc291cmNlZm9yZ2UuY29iZXJ0dXJhLmRhdGFmaWxlIiBmaWxlPSIke2NvYmVydHVyYS5kYXRhLmRpcn0vY29iZXJ0dXJhLnNlciIgLz4KKworICAgICAgPHN5c3Byb3BlcnR5c2V0PgorICAgICAgICA8cHJvcGVydHlyZWYgcHJlZml4PSJqdW5pdC5zeXNwcm9wLiIgLz4KKyAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJqdW5pdC5zeXNwcm9wLioiIHRvPSIqIi8+CisgICAgICA8L3N5c3Byb3BlcnR5c2V0PgorICAgICAgCisgICAgICA8IS0tCisgICAgICAgIE5vdGUgdGhlIGNsYXNzcGF0aCBvcmRlcjogaW5zdHJ1bWVudGVkIGNsYXNzZXMgYXJlIGJlZm9yZSB0aGUKKyAgICAgICAgb3JpZ2luYWwgKHVuaW5zdHJ1bWVudGVkKSBjbGFzc2VzLiAgVGhpcyBpcyBpbXBvcnRhbnQuCisgICAgICAtLT4KKyAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7aW5zdHJ1bWVudGVkLmNsYXNzZXMuZGlyfSIgLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIiAvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY29iZXJ0dXJhLmNsYXNzcGF0aCIgLz4KKworICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIC8+CisgICAgICA8dGVzdCBuYW1lPSIke3Rlc3RjYXNlfSIgdG9kaXI9IiR7dGVzdHJlcG9ydHMueG1sLmRpcn0iIGlmPSJ0ZXN0Y2FzZSIgLz4KKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdHJlcG9ydHMueG1sLmRpcn0iIHVubGVzcz0idGVzdGNhc2UiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdHNyYy5kaXJ9IiBjYXNlc2Vuc2l0aXZlPSJ5ZXMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmphdmEiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvYmF0Y2h0ZXN0PgorICAgIDwvanVuaXQ+CisKKyAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7dGVzdHJlcG9ydHMuaHRtbC5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0cmVwb3J0cy54bWwuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHt0ZXN0cmVwb3J0cy5odG1sLmRpcn0iIC8+CisgICAgPC9qdW5pdHJlcG9ydD4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvYmVydHVyYS54bWwtcmVwb3J0CisgICAgICAKKyAgICAgIFByb2R1Y2VzIG1hY2hpbmUtcmVhZGFibGUgeG1sIENvYmVydHVyYSBjb3ZlcmFnZSByZXBvcnQgZnJvbSByZXN1bHRzIG9mIGluc3RydW1lbnRlZCB0ZXN0cworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb2JlcnR1cmEueG1sLXJlcG9ydCIgZGVwZW5kcz0iY29iZXJ0dXJhLnRlc3QtaW5zdHJ1bWVudGVkIj4KKyAgICA8Y29iZXJ0dXJhLXJlcG9ydCBkZXN0ZGlyPSIke2NvYmVydHVyYXJlcG9ydHMueG1sLmRpcn0iIGRhdGFmaWxlPSIke2NvYmVydHVyYS5kYXRhLmRpcn0vY29iZXJ0dXJhLnNlciIgZm9ybWF0PSJ4bWwiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29iZXJ0dXJhLXJlcG9ydD4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIGNvYmVydHVyYS5odG1sLXJlcG9ydAorICAgICAgCisgICAgICBQcm9kdWNlcyBodW1hbi1yZWFkYWJsZSBodG1sIENvYmVydHVyYSBjb3ZlcmFnZSByZXBvcnQgZnJvbSByZXN1bHRzIG9mIGluc3RydW1lbnRlZCB0ZXN0cworICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJjb2JlcnR1cmEuaHRtbC1yZXBvcnQiIGRlcGVuZHM9ImNvYmVydHVyYS50ZXN0LWluc3RydW1lbnRlZCI+CisgICAgPGNvYmVydHVyYS1yZXBvcnQgZGVzdGRpcj0iJHtjb2JlcnR1cmFyZXBvcnRzLmh0bWwuZGlyfSIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhZmlsZT0iJHtjb2JlcnR1cmEuZGF0YS5kaXJ9L2NvYmVydHVyYS5zZXIiCisgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSJodG1sIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvYmVydHVyYS1yZXBvcnQ+CisgIDwvdGFyZ2V0PgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpbnN0YWxsLXBlbnRhaG8tYW50LXRhc2tzCisgCisgICAgICAgIEZldGNoZXMgYW5kIGluc3RhbGxzIFBlbnRhaG8gQW50IHRhc2tzCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtcGVudGFoby1hbnQtdGFza3MiIGRlcGVuZHM9Imluc3RhbGwtaXZ5Ij4KKyAgICA8dGFza2RlZi13aXRoLWl2eSB0YXNrLW5hbWU9ImRvdC1jbGFzc3BhdGgiIGNsYXNzbmFtZT0ib3JnLnBlbnRhaG8uYW50dGFza3MuRG90Q2xhc3NwYXRoIiBvcmdhbmlzYXRpb249InBlbnRhaG8iIG1vZHVsZT0icGVudGFoby1hbnQtdGFza3MiIHJldmlzaW9uPSIxLjEiIC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBjcmVhdGUtZG90LWNsYXNzcGF0aAorIAorICAgICAgICBDcmVhdGVzIHRoZSBFY2xpcHNlIC5jbGFzc3BhdGggZmlsZSBmcm9tIHRoZSByZXNvbHZlZAorICAgICAgICBjbGFzc3BhdGggZnJvbSBBbnQuCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZS1kb3QtY2xhc3NwYXRoIiBkZXBlbmRzPSJpbnN0YWxsLXBlbnRhaG8tYW50LXRhc2tzLGluaXQiPgorICAgIDxkb3QtY2xhc3NwYXRoPgorICAgICAgPCEtLSBJbmNsdWRlIGFsbCBsaWIgZGlycyAtLT4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZXZsaWIuZGlyfSI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3RsaWIuZGlyfSI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC9kb3QtY2xhc3NwYXRoPgorICA8L3RhcmdldD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBNQUNSTzogdGFza2RlZi13aXRoLWl2eQorICAgICAgICBEb3dubG9hZHMgKHVzaW5nIElWWSkgYW5kIGRlZmluZXMgbmV3IEFudCB0YXNrcworICAgICAgCisgICAgICBOT1RFOiBhbnkgdGFzayB1c2luZyB0aGlzIG1hY3JvIG11c3QgZGVwZW5kIG9uICJpbnN0YWxsLWFudGNvbnRyaWIiCisgICAgICAKKyAgICAgIHBhcmFtZXRlcnM6CisgICAgICB0YXNrLW5hbWUgICAgLSBOYW1lIHRvIGdpdmUgdGhlIG5ldyBBbnQgdGFzayAob25seSB1c2VkIGlmIHJlc291cmNlIGlzIG5vdCBzZXQpCisgICAgICBvcmdhbmlzYXRpb24gLSBBcnRpZmFjdCBvcmdhbml6YXRpb24gKGZvciBhcnRpZmFjdCByZXNvbHV0aW9uIHdpdGggSVZZKQorICAgICAgbW9kdWxlICAgICAgIC0gQXJ0aWZhY3QgbW9kdWxlIChmb3IgYXJ0aWZhY3QgcmVzb2x1dGlvbiB3aXRoIElWWSkKKyAgICAgIHJldmlzaW9uICAgICAtIEFydGlmYWN0IHJldmlzaW9uIChmb3IgYXJ0aWZhY3QgcmVzb2x1dGlvbiB3aXRoIElWWSkKKyAgICAgIGNsYXNzbmFtZSAgICAtIENsYXNzbmFtZSBmb3IgdGhlIEFudCB0YXNrLiAgVXNlZCBkdXJpbmcgdGFza2RlZiBhbmQgdG8gY2hlY2sgCisgICAgICAgICAgICAgICAgICAgICBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGxpYnJhcmllcworICAgICAgcmVzb3VyY2UgICAgIC0gKG9wdGlvbmFsKSBSZXNvdXJjZSBkZWZpbmluZyB0aGUgQW50IHRhc2suICBVc2VkIGR1cmluZyB0YXNrZGVmCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8bWFjcm9kZWYgbmFtZT0idGFza2RlZi13aXRoLWl2eSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXNrLW5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSB0byBnaXZlIHRoZSBuZXcgQW50IHRhc2sgKG9ubHkgdXNlZCBpZiByZXNvdXJjZSBpcyBub3Qgc2V0KSIKKyAgICAgICAgICAgICAgIGRlZmF1bHQ9InVuc2V0IiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JnYW5pc2F0aW9uIiBkZXNjcmlwdGlvbj0iQXJ0aWZhY3Qgb3JnYW5pemF0aW9uIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlIiBkZXNjcmlwdGlvbj0iQXJ0aWZhY3QgbW9kdWxlIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icmV2aXNpb24iIGRlc2NyaXB0aW9uPSJBcnRpZmFjdCByZXZpc2lvbiIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzbmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzc25hbWUgZm9yIHRoZSBBbnQgdGFzay4gIFVzZWQgZHVyaW5nIHRhc2tkZWYgYW5kIHRvIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUgbGlicmFyaWVzLiIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IihvcHRpb25hbCkgUmVzb3VyY2UgZGVmaW5pbmcgdGhlIEFudCB0YXNrLiAgVXNlZCBkdXJpbmcgdGFza2RlZiIKKyAgICAgICAgICAgICAgIGRlZmF1bHQ9InVuc2V0IiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPG1rZGlyIGRpcj0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9Ae21vZHVsZX0tQHtyZXZpc2lvbn0vIiAvPgorICAgICAgPCEtLSBpZiB0aGUgbGlicmFyeSBkb2VzIG5vdCBleGlzdCwgd2UgbXVzdCBkb3dubG9hZCBpdCAtLT4KKyAgICAgIDxpZj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke3N1YmZsb29yLnJlc291cmNlcy5kaXJ9L0B7bW9kdWxlfS1Ae3JldmlzaW9ufSIgLz4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJAe2NsYXNzbmFtZX0iPgorICAgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9Ae21vZHVsZX0tQHtyZXZpc2lvbn0iPgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvYXZhaWxhYmxlPgorICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L25vdD4KKyAgICAgICAgPHRoZW4+CisgICAgICAgICAgPGl2eTpyZXRyaWV2ZSBpbmxpbmU9InRydWUiCisgICAgICAgICAgICAgIGNvbmY9ImRlZmF1bHQiCisgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb249IkB7b3JnYW5pc2F0aW9ufSIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZT0iQHttb2R1bGV9IgorICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb249IkB7cmV2aXNpb259IgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9Ae21vZHVsZX0tQHtyZXZpc2lvbn0vW21vZHVsZV0tX18tW3JldmlzaW9uXSgtW2NsYXNzaWZpZXJdKS5bZXh0XSIgLz4KKyAgICAgICAgICA8IS0tIGluIGNhc2UgdGhlIGFydGlmYWN0IHB1bGxzIGluIGFuIGFudCBqYXIsIHJlbW92ZSBpdC4gdGhleSBjYXVzZSBydW50aW1lIGNvbmZsaWN0cyAtLT4KKyAgICAgICAgICA8ZGVsZXRlPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3N1YmZsb29yLnJlc291cmNlcy5kaXJ9L0B7bW9kdWxlfS1Ae3JldmlzaW9ufSI+CisgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImFudC1fXy0qLmphciIgLz4KKyAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYW50LWxhdW5jaGVyLV9fLSouamFyIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgIDwvZGVsZXRlPgorICAgICAgICA8L3RoZW4+CisgICAgICA8L2lmPgorICAgICAgPHBhdGggaWQ9InRhc2tkZWYuY2xhc3NwYXRoIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3N1YmZsb29yLnJlc291cmNlcy5kaXJ9L0B7bW9kdWxlfS1Ae3JldmlzaW9ufSI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvcGF0aD4KKyAgICAgIDxpZj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJAe3Jlc291cmNlfSIgYXJnMj0idW5zZXQiIC8+CisgICAgICAgIDx0aGVuPgorICAgICAgICAgIDx0YXNrZGVmIGNsYXNzcGF0aHJlZj0idGFza2RlZi5jbGFzc3BhdGgiIG5hbWU9IkB7dGFzay1uYW1lfSIgY2xhc3NuYW1lPSJAe2NsYXNzbmFtZX0iIC8+CisgICAgICAgIDwvdGhlbj4KKyAgICAgICAgPGVsc2U+CisgICAgICAgICAgPHRhc2tkZWYgY2xhc3NwYXRocmVmPSJ0YXNrZGVmLmNsYXNzcGF0aCIgcmVzb3VyY2U9IkB7cmVzb3VyY2V9IiAvPgorICAgICAgICA8L2Vsc2U+CisgICAgICA8L2lmPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgTWFjcm8gd2hpY2ggd2lsbCBkb3dubG9hZCB0aGUgc3BlY2lmaWVkIGxpYnJhcnkuIAorICAgICAgCisgICAgICBOT1RFOiBhbnkgdGFzayB1c2luZyB0aGlzIG1hY3JvIG11c3QgZGVwZW5kIG9uICJpbnN0YWxsLWFudGNvbnRyaWIiCisgICAgICAKKyAgICAgIHBhcmFtZXRlcnM6CisgICAgICBuYW1lICAgICAgLSBUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSAodGhlIGZpbGVuYW1lIHcvbyBleHRlbnNpb24pCisgICAgICB1cmwgICAgICAgLSBUaGUgVVJMIGZyb20gd2hpY2ggdGhlIGxpYnJhcnkgd2lsbCBiZSBkb3dubG9hZGVkCisgICAgICByZXNvdXJjZSAgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2hpY2ggc2hvdWxkIGJlIGxvYWRlZAorICAgICAgICAgICAgICAgICAgYXMgYSB0YXNrIGRlZmluaXRpb24gCisgICAgICBjbGFzc25hbWUgLSBBIGNsYXNzIGZpbGUgbmFtZSB3aGljaCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgaWYgdGhlCisgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBsaWJyYXJ5IGV4aXN0cworICAgICAgZXh0ZW5zaW9uIC0gVGhlIGV4dGVuc2lvbiBvZiB0aGUgbGlicmFyeSBiZWluZyBkb3dubG9hZGVkIAorICAgICAgICAgICAgICAgICAgKGRlZmF1bHRzIHRvIHppcCkKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxtYWNyb2RlZiBuYW1lPSJkb3dubG9hZC1hbnRsaWIiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InVybCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzbmFtZSIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbiIgZGVmYXVsdD0iemlwIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPG1rZGlyIGRpcj0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9Ae25hbWV9LyIgLz4KKyAgICAgIDwhLS0gaWYgdGhlIGxpYnJhcnkgZG9lcyBub3QgZXhpc3QsIHdlIG11c3QgZG93bmxvYWQgaXQgLS0+CisgICAgICA8aWY+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtzdWJmbG9vci5yZXNvdXJjZXMuZGlyfS9Ae25hbWV9IiAvPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9IkB7Y2xhc3NuYW1lfSI+CisgICAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3N1YmZsb29yLnJlc291cmNlcy5kaXJ9L0B7bmFtZX0iPgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvYXZhaWxhYmxlPgorICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L25vdD4KKyAgICAgICAgPHRoZW4+CisgICAgICAgICAgPCEtLSBpZiBpdCBpcyBhIHppcCBmaWxlLCB1bnppcCBpdCAuLi4gb3RoZXJ3aXNlIGlmIGEgamFyLCBqdXN0IGRvd25sb2FkIGl0IC0tPgorICAgICAgICAgIDxpZj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iemlwIiBhcmcyPSJAe2V4dGVuc2lvbn0iIC8+CisgICAgICAgICAgICA8dGhlbj4KKyAgICAgICAgICAgICAgPCEtLSBkb3dubG9hZCB0aGUgc291cmNlIGZpbGUgdG8gYSB0ZW1wIGRpcmVjdG9yeSAtLT4KKyAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iZG93bmxvYWRpbmcgbGlicmFyeSBAe25hbWV9IFtAe25hbWV9LkB7ZXh0ZW5zaW9ufSBmcm9tIEB7dXJsfV0iIC8+CisgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c3ViZmxvb3IudG1wLmRpcn0iIC8+CisgICAgICAgICAgICAgIDxnZXQgc3JjPSJAe3VybH0iIGRlc3Q9IiR7c3ViZmxvb3IudG1wLmRpcn0vQHtuYW1lfS5Ae2V4dGVuc2lvbn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgPHVuemlwIHNyYz0iJHtzdWJmbG9vci50bXAuZGlyfS9Ae25hbWV9LkB7ZXh0ZW5zaW9ufSIKKyAgICAgICAgICAgICAgICAgICAgIGRlc3Q9IiR7c3ViZmxvb3IucmVzb3VyY2VzLmRpcn0vQHtuYW1lfSIKKyAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDwvdGhlbj4KKyAgICAgICAgICAgIDxlbHNlPgorICAgICAgICAgICAgICA8Z2V0IHNyYz0iQHt1cmx9IiBkZXN0PSIke3N1YmZsb29yLnJlc291cmNlcy5kaXJ9L0B7bmFtZX0vQHtuYW1lfS5Ae2V4dGVuc2lvbn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDwvZWxzZT4KKyAgICAgICAgICA8L2lmPgorICAgICAgICA8L3RoZW4+CisgICAgICA8L2lmPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBpbnN0YWxsLXRhdHRsZXRhbGUKKyAgICAKKyAgICAoRmV0Y2hlcyBhbmQpIGluc3RhbGxzIFRBVFRMRVRBTEUgZm9yIHVzZSBieSB0aGlzIGFudCBzY3JpcHQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtdGF0dGxldGFsZSIgZGVwZW5kcz0iaW5zdGFsbC1hbnRjb250cmliIj4KKyAgICA8aWY+CisgICAgICA8aXN0cnVlIHZhbHVlPSIke3RhdHRsZXRhbGUuaXNpbnN0YWxsZWR9IiAvPgorICAgICAgPHRoZW4+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlNraXBwaW5nIFRBVFRMRVRBTEUgaW5zdGFsbC4gIFRBVFRMRVRBTEUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkIGJ5IHRoZSBidWlsZCIgLz4KKyAgICAgIDwvdGhlbj4KKyAgICAgIDxlbHNlPgorICAgICAgICA8ZG93bmxvYWQtYW50bGliIG5hbWU9InRhdHRsZXRhbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsPSIke3RhdHRsZXRhbGUudXJsfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7dGF0dGxldGFsZS5jbGFzc25hbWV9IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb249InppcCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgPHRhc2tkZWYgbmFtZT0idGF0dGxldGFsZS5yZXBvcnQiIGNsYXNzbmFtZT0iJHt0YXR0bGV0YWxlLmNsYXNzbmFtZX0iPgorICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3ViZmxvb3IucmVzb3VyY2VzLmRpcn0vdGF0dGxldGFsZSI+CisgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L3Rhc2tkZWY+CisKKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhdHRsZXRhbGUuaXNpbnN0YWxsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgPC9lbHNlPgorICAgIDwvaWY+CisgIDwvdGFyZ2V0PgorICAKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgdGF0dGxldGFsZS1yZXBvcnQKKyAgICAKKyAgICBHZW5lcmF0ZXMgYSB0YXR0bGV0YWxlIHJlcG9ydCBmb3IgdGhpcyBwcm9qZWN0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPHRhcmdldCBuYW1lPSJ0YXR0bGV0YWxlLXJlcG9ydCIgZGVwZW5kcz0iaW5zdGFsbC10YXR0bGV0YWxlLGphciI+CisgICAgPHRhdHRsZXRhbGUucmVwb3J0IHNvdXJjZT0iJHtiYXNlZGlyfSIgZGVzdGluYXRpb249IiR7dGF0dGxldGFsZS5yZXBvcnRzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgaW5zdGFsbC1zb25hcgorICAgIAorICAgIChGZXRjaGVzIGFuZCkgaW5zdGFsbHMgU09OQVIgYW50IHBsdWdpbiBmb3IgdXNlIGJ5IHRoaXMgYW50IHNjcmlwdAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0iaW5zdGFsbC1zb25hciIgZGVwZW5kcz0iaW5zdGFsbC1hbnRjb250cmliIj4KKyAgICA8aWY+CisgICAgICA8aXN0cnVlIHZhbHVlPSIke3NvbmFyLmlzaW5zdGFsbGVkfSIgLz4KKyAgICAgIDx0aGVuPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJTa2lwcGluZyBTT05BUiBpbnN0YWxsLiAgU09OQVIgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkIGJ5IHRoZSBidWlsZCIgLz4KKyAgICAgIDwvdGhlbj4KKyAgICAgIDxlbHNlPgorICAgICAgICA8ZG93bmxvYWQtYW50bGliIG5hbWU9InNvbmFyIgorICAgICAgICAgICAgICAgICAgICAgICAgIHVybD0iJHtzb25hci51cmx9IgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtzb25hci5jbGFzc25hbWV9IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb249ImphciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgPHRhc2tkZWYgdXJpPSJhbnRsaWI6b3JnLnNvbmFyLmFudCIgcmVzb3VyY2U9Im9yZy9zb25hci9hbnQvYW50bGliLnhtbCI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3ViZmxvb3IucmVzb3VyY2VzLmRpcn0vc29uYXIiPgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPiAKKyAgICAgICAgPC90YXNrZGVmPgorCisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci5pc2luc3RhbGxlZCIgdmFsdWU9InRydWUiIC8+CisgICAgICA8L2Vsc2U+CisgICAgPC9pZj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgc29uYXIKKyAgICAgIAorICAgIEV4ZWN1dGUgdGhlIHNvbmFyIGFuYWx5c2lzIGFuZCBwdWJsaXNoIHRvIGEgc29uYXIgc2VydmVyIHNwZWNpZmllZCBieToKKyAgICBzb25hci5qZGJjLnVybAorICAgIHNvbmFyLmpkYmMuZHJpdmVyQ2xhc3NOYW1lCisgICAgc29uYXIuamRiYy51c2VybmFtZQorICAgIHNvbmFyLmpkYmMucGFzc3dvcmQKKyAgICBzb25hci5ob3N0LnVybAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDx0YXJnZXQgbmFtZT0ic29uYXIiIGRlcGVuZHM9Imluc3RhbGwtc29uYXIsIGNvbXBpbGUsIHRlc3QsIGNvYmVydHVyYSI+CisgICAgPHByb3BlcnR5IG5hbWU9InNvbmFyLnNvdXJjZXMiIHZhbHVlPSIke3NyYy5kaXJ9IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci5iaW5hcmllcyIgdmFsdWU9IiR7Y2xhc3Nlcy5kaXJ9IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci50ZXN0cyIgdmFsdWU9IiR7dGVzdHNyYy5kaXJ9IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci5saWJyYXJpZXMiIHZhbHVlPSIke2xpYi5kaXJ9IiAvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNvbmFyLmR5bmFtaWNBbmFseXNpcyIgdmFsdWU9InJldXNlUmVwb3J0cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic29uYXIuY29iZXJ0dXJhLnJlcG9ydFBhdGgiIHZhbHVlPSIke2NvYmVydHVyYXJlcG9ydHMueG1sLmRpcn0vY292ZXJhZ2UueG1sIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci5zdXJlZmlyZS5yZXBvcnRzUGF0aCIgdmFsdWU9IiR7dGVzdHJlcG9ydHMueG1sLmRpcn0iIC8+CisgICAgCisgICAgPHNvbmFyOnNvbmFyIGtleT0iJHtpdnkuYXJ0aWZhY3QuZ3JvdXB9OiR7aXZ5LmFydGlmYWN0LmlkfSIgdmVyc2lvbj0iJHtwcm9qZWN0LnJldmlzaW9ufSIgeG1sbnM6c29uYXI9ImFudGxpYjpvcmcuc29uYXIuYW50Ii8+CisgIDwvdGFyZ2V0PgorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmYTU5MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKK2ltcGwudGl0bGU9QXBhY2hlIE9PRFQgZmlsZW1nciBmaWxlIGdldAoraW1wbC5wcm9kdWN0SUQ9T09EVF9GSUxFTUdSX0dFVAoraW1wbC52ZW5kb3I9QXBhY2hlIEZvdW5kYXRpb24KKworaXZ5LmFydGlmYWN0Lmdyb3VwPW9vZHQtZmlsZW1ncgoraXZ5LmFydGlmYWN0LmlkPWZpbGVtZ3ItZmlsZWdldC1wbHVnaW4KKworcHJvamVjdC5yZXZpc2lvbj1UUlVOSy1TTkFQU0hPVAorZGVwZW5kZW5jeS5wZW50YWhvLW1ldGFkYXRhLnJldmlzaW9uPVRSVU5LLVNOQVBTSE9UCitzcmMuZGlyPSR7YmFzZWRpcn0vc3JjCit0ZXN0c3JjLmRpcj0ke2Jhc2VkaXJ9L3Rlc3Qtc3JjCitwcm9qZWN0LnVzZS1mdWxsLWRpc3Q9dHJ1ZQoramF2YWRvYy5wYWNrYWdlbmFtZXM9b3JnLmFwYWNoZS5vb2R0LioKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9idWlsZC54bWwgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWU1MjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vYnVpbGQueG1sCkBAIC0wLDAgKzEsNjggQEAKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUaGlzIGlzIHRoZSBidWlsZCBmaWxlIGZvciB0aGUgUERJIFNESyBTdGVwIFBsdWdpbgorICAKKyAgVGhpcyBidWlsZCBmaWxlIHdpbGwgdXNlIHRoZSBzdWJmbG9vci54bWwgZmlsZSBhcyB0aGUgZGVmYXVsdCBidWlsZAorICBwcm9jZXNzIGFuZCBzaG91bGQgb25seSBvdmVycmlkZSB0aGUgdGFza3MgdGhhdCBuZWVkIHRvIGRpZmZlciBmcm9tCisgIHRoZSBjb21tb24gYnVpbGQgZmlsZS4gIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPHByb2plY3QgbmFtZT0ia2V0dGxlLXNkay1zdGVwLXBsdWdpbiIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZGVmYXVsdCI+CisKKwk8ZGVzY3JpcHRpb24+CisJICBUaGlzIGJ1aWxkIGZpbGUgd29ya3Mgd2l0aCB0aGUgc3ViZmxvb3IueG1sIGZpbGUuCisJPC9kZXNjcmlwdGlvbj4KKworCTwhLS0gSW1wb3J0IHRoZSBzdWJmbG9vci1wa2cueG1sIGZpbGUgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBkZWZhdWx0IHRhc2tzIC0tPgorCTxpbXBvcnQgZmlsZT0iYnVpbGQtcmVzL3N1YmZsb29yLXBrZy54bWwiIC8+CisKKwk8IS0tCisgICAgICBBUyBTVEFURUQgQUJPVkUsIFRIRSBPTkxZIFRBU0tTIFRIQVQgU0hPVUxEIEVYSVNUIElOIFRISVMgQlVJTEQgRklMRSBBUkUKKyAgICAgIFRIRSBUQVNLUyBUSEFUIE5FRUQgVE8gRElGRkVSIEZST00gVEhFIERFRkFVTFQgSU1QTEVNRU5UQVRJT04gT0YgVEhFIFRBU0tTCisgICAgICBGT1VORCBJTiBjb21tb25fYnVpbGQueG1sLgorICAgIC0tPgorCisJPCEtLSAKKwkJb3ZlcnJpZGUgdG86CisJCQktIGluY2x1ZGUgdGhlIHNvdXJjZSBkaXJlY3RseSAodGhpcyBpcyBTREsgZGVtbyBjb2RlKQorCQkJLSBpbmNsdWRlIGtldHRsZSBkZXBlbmRlbmN5IGphcnMKKwkJCS0gaW5jbHVkZSB0aGUgYnVpbGQgZm9sZGVyICh1c2VkIGJ5IHRoZSBTREsgdXNlciB0byBidWlsZCB0aGUgcGx1Z2luKQorCQkJLSBpbmNsdWRlIGVjbGlwc2UgcHJvamVjdCBmaWxlcyBmb3IgY29udmVuaWVuY2UKKwktLT4KKwk8dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLmNvcHktbGlicyI+CisJCQorCQk8Y29weSB0b2Rpcj0iJHthcHByb290LnN0YWdlLmRpcn0vbGliIj4KKwkJCTxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIvPgorCQk8L2NvcHk+CisKKwkJPGNvcHkgdG9kaXI9IiR7YXBwcm9vdC5zdGFnZS5kaXJ9L3NyYyI+CisJCQk8ZmlsZXNldCBkaXI9InNyYyIgZXhjbHVkZXM9IioqLy5EU19TdG9yZSIgLz4KKwkJPC9jb3B5PgorCisJCTxjb3B5IHRvZGlyPSIke2FwcHJvb3Quc3RhZ2UuZGlyfS9idWlsZCI+CisJCQk8ZmlsZXNldCBkaXI9ImJ1aWxkIiAvPgorCQk8L2NvcHk+CisJCQorCQk8IS0tPGNvcHkgZmlsZT0iZWNsaXBzZS9jbGFzc3BhdGgueG1sIiB0b2ZpbGU9IiR7YXBwcm9vdC5zdGFnZS5kaXJ9Ly5jbGFzc3BhdGgiPgorCQkgICAgPGZpbHRlcnNldD4KKwkJICAgICAgPGZpbHRlciB0b2tlbj0iUFJPSkVDVC1SRVZJU0lPTiIgdmFsdWU9IiR7cHJvamVjdC5yZXZpc2lvbn0iLz4KKwkJICAgICAgPGZpbHRlciB0b2tlbj0iTUVUQVNUT1JFLVJFVklTSU9OIiB2YWx1ZT0iJHtkZXBlbmRlbmN5LnBlbnRhaG8tbWV0YWRhdGEucmV2aXNpb259Ii8+CisJCSAgICA8L2ZpbHRlcnNldD4JCQkKKwkJPC9jb3B5Pi0tPgorCQk8IS0tPGNvcHkgZmlsZT0iZWNsaXBzZS9wcm9qZWN0LnhtbCIgdG9maWxlPSIke2FwcHJvb3Quc3RhZ2UuZGlyfS8ucHJvamVjdCIgLz4tLT4KKwkJCQorCTwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vYnVpbGQvYnVpbGQucHJvcGVydGllcyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9idWlsZC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGEyNmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vYnVpbGQvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKKyMgUGxlYXNlIGFkanVzdCB0byBwb2ludCB0byB5b3VyIGRhdGEtaW50ZWdyYXRpb24gZm9sZGVyIGlmIHlvdSdkIGxpa2UgdGhlIAorIyBhbnQgc2NyaXB0IHRvIGJlIGFibGUgdG8gaW5zdGFsbCB0aGUgY29tcGlsZWQgcGx1Z2luIGF1dG9tYXRpY2FsbHkKK2tldHRsZS1kaXI9L0FwcGxpY2F0aW9ucy9wZW50YWhvL2Rlc2lnbi10b29scy9kYXRhLWludGVncmF0aW9uCmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vYnVpbGQvYnVpbGQueG1sIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2J1aWxkL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAwNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2J1aWxkL2J1aWxkLnhtbApAQCAtMCwwICsxLDgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxwcm9qZWN0IG5hbWU9IlBkaVNka0RlbW9TdGVwUGx1Z2luIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuLiI+CisJPGRlc2NyaXB0aW9uPgorICAgICAgICBCdWlsZCBmaWxlIGZvciBhIFBESSBzdGVwIHBsdWdpbgorICAgIDwvZGVzY3JpcHRpb24+CisKKwk8IS0tIHlvdSBjYW4gdXNlIHRoaXMgZmlsZSB0byBzZXQgdGhlIGtldHRsZS1kaXIgcHJvcGVydHkgb3IgY2hhbmdlIGl0IGRpcmVjdGx5IGJlbG93IC0tPgorCTxwcm9wZXJ0eSBmaWxlPSJidWlsZC9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCisJPCEtLSBzZXQgZ2xvYmFsIHByb3BlcnRpZXMgZm9yIHRoaXMgYnVpbGQgLS0+CisJPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgbG9jYXRpb249ImNsYXNzZXMiIC8+CisJPHByb3BlcnR5IG5hbWU9ImRpc3QiIGxvY2F0aW9uPSJkaXN0IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJkaXN0c3RlcCIgbG9jYXRpb249IiR7ZGlzdH0vc3RlcHMvRGVtbyIgLz4KKwk8cHJvcGVydHkgbmFtZT0icGx1Z2lubmFtZSIgdmFsdWU9IkRlbW8iIC8+CisJPHByb3BlcnR5IG5hbWU9ImphcmZpbGVuYW1lIiB2YWx1ZT0iZGVtby1zdGVwLmphciIgLz4KKworCTwhLS0gdXNlZCB0byBjb21waWxlIGNvZGUgLS0+CisJPHBhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KKwkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2xpYiI+CisJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KKwkJPC9maWxlc2V0PgorCTwvcGF0aD4KKworCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTx0c3RhbXAgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGhlIHNvdXJjZSAiPgorCQk8bWtkaXIgZGlyPSIke2NsYXNzZXN9IiAvPgorCQk8amF2YWMgc291cmNlPSIxLjYiIHRhcmdldD0iMS42IiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtjbGFzc2VzfSIgZGVidWdsZXZlbD0ibGluZXMsdmFycyxzb3VyY2UiIGRlYnVnPSJ0cnVlIj4KKwkJCTxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiAvPgorCisJCTwvamF2YWM+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJnZW5lcmF0ZSB0aGUgZGlzdHJpYnV0aW9uIj4KKworCQk8bWtkaXIgZGlyPSIke2Rpc3RzdGVwfSIgLz4KKworCQk8IS0tIGphciB0aGluZ3MgdXAsIGFsc28gYWRkIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIChtZXNzYWdlcykgYW5kIHRoZSBpY29uIC0tPgorCQk8Y29weSB0b2Rpcj0iJHtjbGFzc2VzfSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7c3JjfSIgaW5jbHVkZXM9IioqLyoucHJvcGVydGllcyIgLz4KKwkJCTxmaWxlc2V0IGRpcj0iJHtzcmN9IiBpbmNsdWRlcz0iKiovKi5wbmciIC8+CisJCTwvY29weT4KKworCQk8IS0tIGphciBjbGFzcyB1cCAtLT4KKwkJPGphciBqYXJmaWxlPSIke2Rpc3RzdGVwfS8ke2phcmZpbGVuYW1lfSIgYmFzZWRpcj0iJHtjbGFzc2VzfSIvPgorCisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJkaXN0IiBkZXNjcmlwdGlvbj0iY29tcGlsZSBhbmQgaW5zdGFsbCBpbnRvIGxvY2FsIFBESSBpbnN0YWxsYXRpb24iPgorCQkKKwkJPGVjaG8gbWVzc2FnZT0iTG9va2luZyBmb3IgbG9jYWwgUERJIGluc3RhbGxhdGlvbiBpbiAke2tldHRsZS1kaXJ9Ii8+CisJCQorCQk8IS0tIGNoYW5nZSB0aGVzZSB0byBhZGFwdCB0byB5b3VyIGVudmlyb25tZW50IC0tPgorCQk8cHJvcGVydHkgbmFtZT0ia2V0dGxlLWRpciIgbG9jYXRpb249InlvdXJfa2V0dGxlXzUueF9kaXJfaGVyZSIgLz4KKwkJPGF2YWlsYWJsZSBmaWxlPSIke2tldHRsZS1kaXJ9IiB0eXBlPSJkaXIiIHByb3BlcnR5PSJrZXR0bGUtZGlyLnByZXNlbnQiIC8+CisKKwkJPGZhaWwgdW5sZXNzPSJrZXR0bGUtZGlyLnByZXNlbnQiIG1lc3NhZ2U9IlBESSBpbnN0YWxsYXRpb24gbm90IGZvdW5kLiBQbGVhc2Ugc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIFBESSBpbnN0YWxsYXRpb24gaW4gYnVpbGQvYnVpbGQucHJvcGVydGllcyIgLz4KKwkJCisJCTwhLS0gcmVtb3ZlIHByZXZpb3VzIGluc3RhbGxhdGlvbnMgLS0+CisJCTxkZWxldGUgZGlyPSIke2tldHRsZS1kaXJ9L3BsdWdpbnMvc3RlcHMvJHtwbHVnaW5uYW1lfSIgLz4KKworCQk8IS0tIHB1dCBmcmVzaCBmaWxlcyBpbiBwbGFjZSAtLT4KKwkJPG1rZGlyIGRpcj0iJHtrZXR0bGUtZGlyfS9wbHVnaW5zL3N0ZXBzLyR7cGx1Z2lubmFtZX0iIC8+CisKKwkJPGNvcHkgdG9kaXI9IiR7a2V0dGxlLWRpcn0vcGx1Z2lucy9zdGVwcy8ke3BsdWdpbm5hbWV9Ij4KKwkJCTxmaWxlc2V0IGRpcj0iJHtkaXN0c3RlcH0iIGluY2x1ZGVzPSIqKi8qLioiIC8+CisJCQk8ZmlsZXNldCBkaXI9IiR7ZGlzdHN0ZXB9IiBpbmNsdWRlcz0iKioiIC8+CisJCTwvY29weT4KKwkJCisJCQorCQk8ZWNobyBtZXNzYWdlPSJJbnN0YWxsZWQgdGhlIHBsdWdpbiBpbiBQREkuIFRvIHRlc3QsIHBsZWFzZSByZXN0YXJ0IFNwb29uLiIvPgorCQkKKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJjbGVhbiB1cCI+CisJCTxkZWxldGUgZGlyPSIke2NsYXNzZXN9IiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtkaXN0fSIgLz4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL2l2eS54bWwgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vaXZ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTUyYmFlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2l2eS54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxpdnktbW9kdWxlIHZlcnNpb249IjIuMCIgeG1sbnM6bT0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9tYXZlbiI+CisgIDxpbmZvIG9yZ2FuaXNhdGlvbj0iJHtpdnkuYXJ0aWZhY3QuZ3JvdXB9IiBtb2R1bGU9IiR7aXZ5LmFydGlmYWN0LmlkfSIgcmV2aXNpb249IiR7cHJvamVjdC5yZXZpc2lvbn0iLz4KKworICA8Y29uZmlndXJhdGlvbnM+CisgICAgPGNvbmYgbmFtZT0iZGVmYXVsdCIvPgorICAgIDxjb25mIG5hbWU9InRlc3QiIHZpc2liaWxpdHk9InByaXZhdGUiLz4KKyAgICA8Y29uZiBuYW1lPSJzb3VyY2UiLz4KKyAgPC9jb25maWd1cmF0aW9ucz4KKworICA8ZGVwZW5kZW5jaWVzIGRlZmF1bHRjb25mPSJkZWZhdWx0Ij4KKworICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLm9vZHQiIG5hbWU9ImNhcy1maWxlbWdyIiByZXY9IjAuNyIgdHJhbnNpdGl2ZT0iZmFsc2UiIGNoYW5naW5nPSJ0cnVlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUub29kdCIgbmFtZT0iY2FzLW1ldGFkYXRhIiByZXY9IjAuNyIgdHJhbnNpdGl2ZT0iZmFsc2UiIGNoYW5naW5nPSJ0cnVlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUud3MueG1scnBjIiBuYW1lPSJ4bWxycGMiIHJldj0iMi4wLjEiPgorICAgICAgICAgIDxleGNsdWRlIG9yZz0ieG1sLWFwaXMiIG1vZHVsZT0ieG1sLWFwaXMiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBvcmc9Imp1bml0IiBtb2R1bGU9Imp1bml0Ii8+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmpzb24iIG5hbWU9Impzb24iIHJldj0iMjAxNDAxMDciLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0iY29tLmdvb2dsZS5jb2RlLmdzb24iIG5hbWU9Imdzb24iIHJldj0iMi4yLjQiLz4KKworCisgICAgICA8IS0tIGtldHRsZSBkZXBlbmRlbmNpZXMgLS0+CisgICAgPGRlcGVuZGVuY3kgb3JnPSJwZW50YWhvLWtldHRsZSIgbmFtZT0ia2V0dGxlLWNvcmUiIHJldj0iVFJVTkstU05BUFNIT1QiIGNoYW5naW5nPSJ0cnVlIi8+CisJPGRlcGVuZGVuY3kgb3JnPSJwZW50YWhvLWtldHRsZSIgbmFtZT0ia2V0dGxlLWVuZ2luZSIgcmV2PSJUUlVOSy1TTkFQU0hPVCIgY2hhbmdpbmc9InRydWUiLz4KKwk8ZGVwZW5kZW5jeSBvcmc9InBlbnRhaG8ta2V0dGxlIiBuYW1lPSJrZXR0bGUtdWktc3d0IiByZXY9IlRSVU5LLVNOQVBTSE9UIiBjaGFuZ2luZz0idHJ1ZSIvPgorCTxkZXBlbmRlbmN5IG9yZz0icGVudGFobyIgbmFtZT0icGVudGFoby1tZXRhZGF0YSIgcmV2PSJUUlVOSy1TTkFQU0hPVCIgY2hhbmdpbmc9InRydWUiIHRyYW5zaXRpdmU9InRydWUiLz4KKworCTwhLS0gc3d0IGRlcGVuZGVuY2llcyAtLT4KKwk8ZGVwZW5kZW5jeSBvcmc9Im9yZy5lY2xpcHNlLnN3dCIgbmFtZT0ic3d0LXdpbjMyIiByZXY9IjMuMy4wLjMzNDYiIHRyYW5zaXRpdmU9ImZhbHNlIiBjaGFuZ2luZz0iZmFsc2UiLz4KKwkKKyAgICA8IS0tIHRlc3RpbmcgZGVwZW5kZW5jaWVzIC0tPgorICAgIDxkZXBlbmRlbmN5IG9yZz0ianVuaXQiIG5hbWU9Imp1bml0IiByZXY9IjMuOC4xIiB0cmFuc2l0aXZlPSJmYWxzZSIgY29uZj0idGVzdC0+ZGVmYXVsdCIvPgorICAgIDxkZXBlbmRlbmN5IG9yZz0ibG9nNGoiIG5hbWU9ImxvZzRqIiByZXY9IjEuMi4xNiIgdHJhbnNpdGl2ZT0iZmFsc2UiIGNvbmY9InRlc3QtPmRlZmF1bHQiLz4KKyAgICAKKyAgPC9kZXBlbmRlbmNpZXM+Cis8L2l2eS1tb2R1bGU+CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vaXZ5c2V0dGluZ3MueG1sIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2l2eXNldHRpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk3YzVjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL2l2eXNldHRpbmdzLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxpdnlzZXR0aW5ncz4NCisgIDxwcm9wZXJ0aWVzIGVudmlyb25tZW50PSJlbnYiIC8+DQorICA8cHJvcGVydHkgbmFtZT0iaXZ5LmxvY2FsLmRlZmF1bHQucm9vdCIgdmFsdWU9IiR7aXZ5LmRlZmF1bHQuaXZ5LnVzZXIuZGlyfS9sb2NhbCIgb3ZlcnJpZGU9InRydWUiIC8+DQorICA8cHJvcGVydHkgbmFtZT0iaXZ5LmxvY2FsLmRlZmF1bHQuYXJ0aWZhY3QucGF0dGVybiIgdmFsdWU9IltvcmdhbmlzYXRpb25dL1ttb2R1bGVdL1tyZXZpc2lvbl0vW3R5cGVdcy9bYXJ0aWZhY3RdLVtyZXZpc2lvbl0uW2V4dF0iDQorICAgIG92ZXJyaWRlPSJmYWxzZSIgLz4NCisNCisNCisgIDwhLS0gUmVwb3NpdG9yeSBmb3IgUGVudGFoby1ob3N0ZWQgYXJ0aWZhY3RzIC0tPg0KKyAgPHByb3BlcnR5IG5hbWU9InBlbnRhaG8ucmVzb2x2ZS5yZXBvIiB2YWx1ZT0iaHR0cDovL2l2eS1uZXh1cy5wZW50YWhvLm9yZy9jb250ZW50L2dyb3Vwcy9vbW5pIiBvdmVycmlkZT0iZmFsc2UiIC8+DQorICA8IS0tIFJlcG9zaXRvcnkgZm9yIEV4dGVybmFsLWhvc3RlZCBhcnRpZmFjdHMgKE9wdGlvbmFsLiBEZWZhdWx0cyB0byBQZW50YWhvLWhvc3RlZC4pIC0tPg0KKyAgPHByb3BlcnR5IG5hbWU9InB1YmxpYy5yZXNvbHZlLnJlcG8iIHZhbHVlPSIke3BlbnRhaG8ucmVzb2x2ZS5yZXBvfSIgb3ZlcnJpZGU9ImZhbHNlIiAvPg0KKw0KKw0KKyAgPHNldHRpbmdzIGRlZmF1bHRSZXNvbHZlcj0icGVudGFoby1jaGFpbmVkLXJlc29sdmVyIiAvPg0KKyAgPGluY2x1ZGUgdXJsPSIke2l2eS5kZWZhdWx0LnNldHRpbmdzLmRpcn0vaXZ5c2V0dGluZ3MtcHVibGljLnhtbCIgLz4NCisgIDxpbmNsdWRlIHVybD0iJHtpdnkuZGVmYXVsdC5zZXR0aW5ncy5kaXJ9L2l2eXNldHRpbmdzLWxvY2FsLnhtbCIgLz4NCisgIDxyZXNvbHZlcnM+DQorICAgIDxjaGFpbiBuYW1lPSJwZW50YWhvLWNoYWluZWQtcmVzb2x2ZXIiPg0KKyAgICAgIDxyZXNvbHZlciByZWY9ImxvY2FsIiAvPg0KKyAgICAgIDxkdWFsIG5hbWU9InBlbnRhaG8iPg0KKyAgICAgICAgPHVybCBuYW1lPSJwZW50YWhvLWl2eSIgY2hlY2ttb2RpZmllZD0idHJ1ZSIgY2hhbmdpbmdQYXR0ZXJuPSIqLVNOQVBTSE9UIj4NCisgICAgICAgICAgPGl2eSBwYXR0ZXJuPSIke3BlbnRhaG8ucmVzb2x2ZS5yZXBvfS9bb3JnYW5pc2F0aW9uXS9bbW9kdWxlXS9bcmV2aXNpb25dL1ttb2R1bGVdLVtyZXZpc2lvbl0uaXZ5LnhtbCIgLz4NCisgICAgICAgIDwvdXJsPg0KKyAgICAgICAgPGliaWJsaW8gbmFtZT0icGVudGFoby1tdm4iIG0yY29tcGF0aWJsZT0idHJ1ZSIgcm9vdD0iJHtwZW50YWhvLnJlc29sdmUucmVwb30iIC8+DQorICAgICAgPC9kdWFsPg0KKyAgICAgIDxpYmlibGlvIG5hbWU9InB1YmxpYy1tYXZlbiIgcm9vdD0iJHtwdWJsaWMucmVzb2x2ZS5yZXBvfSIgbTJjb21wYXRpYmxlPSJ0cnVlIiAvPg0KKyAgICAgIDxyZXNvbHZlciByZWY9InB1YmxpYyIgLz4NCisgICAgPC9jaGFpbj4NCisgIDwvcmVzb2x2ZXJzPg0KKyAgPGNhY2hlcyBsb2NrU3RyYXRlZ3k9ImFydGlmYWN0LWxvY2siIHJlc29sdXRpb25DYWNoZURpcj0iJHtpdnkuZGVmYXVsdC5pdnkudXNlci5kaXJ9L3Jlc29sLWNhY2hlJHtlbnYuRVhFQ1VUT1JfTlVNQkVSfSIgLz4NCis8L2l2eXNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9wYWNrYWdlLWl2eS54bWwgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vcGFja2FnZS1pdnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2MyYjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vcGFja2FnZS1pdnkueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8aXZ5LW1vZHVsZSB2ZXJzaW9uPSIyLjAiIHhtbG5zOm09Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvbWF2ZW4iPgorICA8aW5mbyBvcmdhbmlzYXRpb249IiR7aXZ5LmFydGlmYWN0Lmdyb3VwfSIgbW9kdWxlPSIke2l2eS5hcnRpZmFjdC5pZH0iIHJldmlzaW9uPSIke3Byb2plY3QucmV2aXNpb259IiAvPgorICA8Y29uZmlndXJhdGlvbnM+CisgICAgPGNvbmYgbmFtZT0iZGVmYXVsdCIgLz4KKyAgICA8Y29uZiBuYW1lPSJ0ZXN0IiB2aXNpYmlsaXR5PSJwcml2YXRlIiAvPgorICA8L2NvbmZpZ3VyYXRpb25zPgorICAKKyAgPHB1YmxpY2F0aW9ucz4KKyAgICA8YXJ0aWZhY3QgbmFtZT0iJHtpdnkuYXJ0aWZhY3QuaWR9IiB0eXBlPSJ6aXAiIC8+CisgIDwvcHVibGljYXRpb25zPgorICAKKyAgPGRlcGVuZGVuY2llcyBkZWZhdWx0Y29uZj0iZGVmYXVsdC0+ZGVmYXVsdCI+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9pdnktbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9wbHVnaW5zIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3BsdWdpbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyOTFhMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9wbHVnaW5zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9GaWxlbWdyQ2hlY2tTdGVwLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svRmlsZW1nckNoZWNrU3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGU1YTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svRmlsZW1nckNoZWNrU3RlcC5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmNoZWNrOworCitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5leGNlcHRpb24uS2V0dGxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUucm93LlJvd0RhdGFVdGlsOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUucm93LlJvd01ldGFJbnRlcmZhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuVHJhbnM7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuVHJhbnNNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuKjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBJbnRlcmZhY2UuCisgKiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBuZWVkIHRvOgorICogCisgKiAtIGluaXRpYWxpemUgdGhlIHN0ZXAKKyAqIC0gZXhlY3V0ZSB0aGUgcm93IHByb2Nlc3NpbmcgbG9naWMKKyAqIC0gZGlzcG9zZSBvZiB0aGUgc3RlcCAKKyAqIAorICogUGxlYXNlIGRvIG5vdCBjcmVhdGUgYW55IGxvY2FsIGZpZWxkcyBpbiBhIFN0ZXBJbnRlcmZhY2UgY2xhc3MuIFN0b3JlIGFueQorICogaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgcHJvY2Vzc2luZyBsb2dpYyBpbiB0aGUgc3VwcGxpZWQgc3RlcCBkYXRhIGludGVyZmFjZQorICogaW5zdGVhZC4gIAorICogCisgKi8KKworcHVibGljIGNsYXNzIEZpbGVtZ3JDaGVja1N0ZXAgZXh0ZW5kcyBCYXNlU3RlcCBpbXBsZW1lbnRzIFN0ZXBJbnRlcmZhY2UgeworCisgICAgcHJpdmF0ZSBPT0RUQ29uZmlnIG9vZHQgPSBuZXcgT09EVENvbmZpZygpOworICAgIHByaXZhdGUgT09EVFByb2Nlc3NlcyBvb2R0cHJvYyA9IG5ldyBPT0RUUHJvY2Vzc2VzKCk7CisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBzaW1wbHkgcGFzcyBvbiBpdHMgYXJndW1lbnRzIHRvIHRoZSBwYXJlbnQgY2xhc3MuCisJICogCisJICogQHBhcmFtIHMgCQkJCXN0ZXAgZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gc3RlcERhdGFJbnRlcmZhY2UJc3RlcCBkYXRhIGNsYXNzCisJICogQHBhcmFtIGMJCQkJCXN0ZXAgY29weQorCSAqIEBwYXJhbSB0CQkJCQl0cmFuc2Zvcm1hdGlvbiBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBkaXMJCQkJdHJhbnNmb3JtYXRpb24gZXhlY3V0aW5nCisJICovCisJcHVibGljIEZpbGVtZ3JDaGVja1N0ZXAoU3RlcE1ldGEgcywgU3RlcERhdGFJbnRlcmZhY2Ugc3RlcERhdGFJbnRlcmZhY2UsIGludCBjLCBUcmFuc01ldGEgdCwgVHJhbnMgZGlzKSB7CisJCXN1cGVyKHMsIHN0ZXBEYXRhSW50ZXJmYWNlLCBjLCB0LCBkaXMpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIGR1cmluZyB0cmFuc2Zvcm1hdGlvbiBzdGFydHVwLiAKKwkgKiAKKwkgKiBJdCBzaG91bGQgaW5pdGlhbGl6ZSByZXF1aXJlZCBmb3Igc3RlcCBleGVjdXRpb24uIAorCSAqIAorCSAqIFRoZSBtZXRhIGFuZCBkYXRhIGltcGxlbWVudGF0aW9ucyBwYXNzZWQgaW4gY2FuIHNhZmVseSBiZSBjYXN0CisJICogdG8gdGhlIHN0ZXAncyByZXNwZWN0aXZlIGltcGxlbWVudGF0aW9ucy4gCisJICogCisJICogSXQgaXMgbWFuZGF0b3J5IHRoYXQgc3VwZXIuaW5pdCgpIGlzIGNhbGxlZCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvci4KKwkgKiAKKwkgKiBUeXBpY2FsIHRhc2tzIGV4ZWN1dGVkIGhlcmUgYXJlIGVzdGFibGlzaGluZyB0aGUgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlLAorCSAqIGFzIHdhbGwgYXMgb2J0YWluaW5nIHJlc291cmNlcywgbGlrZSBmaWxlIGhhbmRsZXMuCisJICogCisJICogQHBhcmFtIHNtaSAJc3RlcCBtZXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgY29udGFpbmluZyB0aGUgc3RlcCBzZXR0aW5ncworCSAqIEBwYXJhbSBzZGkJc3RlcCBkYXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgdXNlZCB0byBzdG9yZSBydW50aW1lIGluZm9ybWF0aW9uCisJICogCisJICogQHJldHVybiB0cnVlIGlmIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBwcmV2ZW50aW5nIHRoZSBzdGVwIGZyb20gd29ya2luZy4gCisJICogIAorCSAqLworCXB1YmxpYyBib29sZWFuIGluaXQoU3RlcE1ldGFJbnRlcmZhY2Ugc21pLCBTdGVwRGF0YUludGVyZmFjZSBzZGkpIHsKKwkJLy8gQ2FzdGluZyB0byBzdGVwLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgaXMgc2FmZQorCQlGaWxlbWdyQ2hlY2tTdGVwTWV0YSBtZXRhID0gKEZpbGVtZ3JDaGVja1N0ZXBNZXRhKSBzbWk7CisJCUZpbGVtZ3JDaGVja1N0ZXBEYXRhIGRhdGEgPSAoRmlsZW1nckNoZWNrU3RlcERhdGEpIHNkaTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nRXJyb3IoImxvYWRpbmcgaW5nZXN0ZXIiKTsKKyAgICAgICAgICAgIG9vZHQubG9hZEluZ2VzdGVyKG1ldGEuZ2V0U2VydmVyVVJMRmllbGQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5pbml0KG1ldGEsIGRhdGEpOworCX0KKworCS8qKgorCSAqIE9uY2UgdGhlIHRyYW5zZm9ybWF0aW9uIHN0YXJ0cyBleGVjdXRpbmcsIHRoZSBwcm9jZXNzUm93KCkgbWV0aG9kIGlzIGNhbGxlZCByZXBlYXRlZGx5CisJICogYnkgUERJIGZvciBhcyBsb25nIGFzIGl0IHJldHVybnMgdHJ1ZS4gVG8gaW5kaWNhdGUgdGhhdCBhIHN0ZXAgaGFzIGZpbmlzaGVkIHByb2Nlc3Npbmcgcm93cworCSAqIHRoaXMgbWV0aG9kIG11c3QgY2FsbCBzZXRPdXRwdXREb25lKCkgYW5kIHJldHVybiBmYWxzZTsKKwkgKgorCSAqIFN0ZXBzIHdoaWNoIHByb2Nlc3MgaW5jb21pbmcgcm93cyB0eXBpY2FsbHkgY2FsbCBnZXRSb3coKSB0byByZWFkIGEgc2luZ2xlIHJvdyBmcm9tIHRoZQorCSAqIGlucHV0IHN0cmVhbSwgY2hhbmdlIG9yIGFkZCByb3cgY29udGVudCwgY2FsbCBwdXRSb3coKSB0byBwYXNzIHRoZSBjaGFuZ2VkIHJvdyBvbgorCSAqIGFuZCByZXR1cm4gdHJ1ZS4gSWYgZ2V0Um93KCkgcmV0dXJucyBudWxsLCBubyBtb3JlIHJvd3MgYXJlIGV4cGVjdGVkIHRvIGNvbWUgaW4sCisJICogYW5kIHRoZSBwcm9jZXNzUm93KCkgaW1wbGVtZW50YXRpb24gY2FsbHMgc2V0T3V0cHV0RG9uZSgpIGFuZCByZXR1cm5zIGZhbHNlIHRvCisJICogaW5kaWNhdGUgdGhhdCBpdCBpcyBkb25lIHRvby4KKwkgKgorCSAqIFN0ZXBzIHdoaWNoIGdlbmVyYXRlIHJvd3MgdHlwaWNhbGx5IGNvbnN0cnVjdCBhIG5ldyByb3cgT2JqZWN0W10gdXNpbmcgYSBjYWxsIHRvCisJICogUm93RGF0YVV0aWwuYWxsb2NhdGVSb3dEYXRhKG51bWJlck9mRmllbGRzKSwgYWRkIHJvdyBjb250ZW50LCBhbmQgY2FsbCBwdXRSb3coKSB0bworCSAqIHBhc3MgdGhlIG5ldyByb3cgb24uIEFib3ZlIHByb2Nlc3MgbWF5IGhhcHBlbiBpbiBhIGxvb3AgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgcm93cywKKwkgKiBhdCB0aGUgZW5kIG9mIHdoaWNoIHByb2Nlc3NSb3coKSB3b3VsZCBjYWxsIHNldE91dHB1dERvbmUoKSBhbmQgcmV0dXJuIGZhbHNlOworCSAqCisJICogQHBhcmFtIHNtaSB0aGUgc3RlcCBtZXRhIGludGVyZmFjZSBjb250YWluaW5nIHRoZSBzdGVwIHNldHRpbmdzCisJICogQHBhcmFtIHNkaSB0aGUgc3RlcCBkYXRhIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlCisJICoKKwkgKiBAcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiwgZmFsc2UgaWYgdGhlIHN0ZXAgaXMgZG9uZQorCSAqLworCXB1YmxpYyBib29sZWFuIHByb2Nlc3NSb3coU3RlcE1ldGFJbnRlcmZhY2Ugc21pLCBTdGVwRGF0YUludGVyZmFjZSBzZGkpIHRocm93cyBLZXR0bGVFeGNlcHRpb24geworCisJCS8vIHNhZmVseSBjYXN0IHRoZSBzdGVwIHNldHRpbmdzIChtZXRhKSBhbmQgcnVudGltZSBpbmZvIChkYXRhKSB0byBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMKKwkJRmlsZW1nckNoZWNrU3RlcE1ldGEgbWV0YSA9IChGaWxlbWdyQ2hlY2tTdGVwTWV0YSkgc21pOworCQlGaWxlbWdyQ2hlY2tTdGVwRGF0YSBkYXRhID0gKEZpbGVtZ3JDaGVja1N0ZXBEYXRhKSBzZGk7CisKKwkJLy8gZ2V0IGluY29taW5nIHJvdywgZ2V0Um93KCkgcG90ZW50aWFsbHkgYmxvY2tzIHdhaXRpbmcgZm9yIG1vcmUgcm93cywgcmV0dXJucyBudWxsIGlmIG5vIG1vcmUgcm93cyBleHBlY3RlZAorCQlPYmplY3RbXSByID0gZ2V0Um93KCk7CisKKwkJLy8gaWYgbm8gbW9yZSByb3dzIGFyZSBleHBlY3RlZCwgaW5kaWNhdGUgc3RlcCBpcyBmaW5pc2hlZCBhbmQgcHJvY2Vzc1JvdygpIHNob3VsZCBub3QgYmUgY2FsbGVkIGFnYWluCisJCWlmIChyID09IG51bGwpeworCQkJc2V0T3V0cHV0RG9uZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gdGhlICJmaXJzdCIgZmxhZyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBzdGVwIGltcGxlbWVudGF0aW9uCisJCS8vIGl0IGlzIHVzZWQgdG8gZ3VhcmQgc29tZSBwcm9jZXNzaW5nIHRhc2tzLCBsaWtlIGZpZ3VyaW5nIG91dCBmaWVsZCBpbmRleGVzCisJCS8vIGluIHRoZSByb3cgc3RydWN0dXJlIHRoYXQgb25seSBuZWVkIHRvIGJlIGRvbmUgb25jZQorCQlpZiAoZmlyc3QpIHsKKwkJCWZpcnN0ID0gZmFsc2U7CisJCQkvLyBjbG9uZSB0aGUgaW5wdXQgcm93IHN0cnVjdHVyZSBhbmQgcGxhY2UgaXQgaW4gb3VyIGRhdGEgb2JqZWN0CisJCQlkYXRhLm91dHB1dFJvd01ldGEgPSAoUm93TWV0YUludGVyZmFjZSkgZ2V0SW5wdXRSb3dNZXRhKCkuY2xvbmUoKTsKKwkJCS8vIHVzZSBtZXRhLmdldEZpZWxkcygpIHRvIGNoYW5nZSBpdCwgc28gaXQgcmVmbGVjdHMgdGhlIG91dHB1dCByb3cgc3RydWN0dXJlCisJCQltZXRhLmdldEZpZWxkcyhkYXRhLm91dHB1dFJvd01ldGEsIGdldFN0ZXBuYW1lKCksIG51bGwsIG51bGwsIHRoaXMsIG51bGwsIG51bGwpOworCQl9CisKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBnZXRJbnB1dFJvd01ldGEoKS5nZXRGaWVsZE5hbWVzKCk7CisKKyAgICAgICAgbG9nRXJyb3IoImZpZWxkbmFtZSA9ICIrbWV0YS5nZXRGaWxlbmFtZUZpZWxkKCkpOworICAgICAgICBpbnQgaWR4ID0gQXJyYXlzLmFzTGlzdChuYW1lcykuaW5kZXhPZihtZXRhLmdldEZpbGVuYW1lRmllbGQoKSk7CisKKyAgICAgICAgbG9nRXJyb3IoIklEWD0iICtJbnRlZ2VyLnRvU3RyaW5nKGlkeCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dFcnJvcigiZG9lcyBmaWxlIGV4aXN0PyIrb29kdHByb2MuaXNBbHJlYWR5SW5EYXRhYmFzZShvb2R0LCAoU3RyaW5nKXJbaWR4XSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhZmVseSBhZGQgdGhlIHN0cmluZyAiSGVsbG8gV29ybGQhIiBhdCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgcm93CisJCS8vIHRoZSByb3cgYXJyYXkgd2lsbCBiZSByZXNpemVkIGlmIG5lY2Vzc2FyeQorCQlPYmplY3RbXSBvdXRwdXRSb3cgPSBSb3dEYXRhVXRpbC5hZGRWYWx1ZURhdGEociwgZGF0YS5vdXRwdXRSb3dNZXRhLnNpemUoKSAtIDEsICJIZWxsbyBXb3JsZCEiKTsKKworCQkvLyBwdXQgdGhlIHJvdyB0byB0aGUgb3V0cHV0IHJvdyBzdHJlYW0KKwkJcHV0Um93KGRhdGEub3V0cHV0Um93TWV0YSwgb3V0cHV0Um93KTsKKworCQkvLyBsb2cgcHJvZ3Jlc3MgaWYgaXQgaXMgdGltZSB0byB0byBzbworCQlpZiAoY2hlY2tGZWVkYmFjayhnZXRMaW5lc1JlYWQoKSkpIHsKKwkJCWxvZ0Jhc2ljKCJMaW5lbnIgIiArIGdldExpbmVzUmVhZCgpKTsgLy8gU29tZSBiYXNpYyBsb2dnaW5nCisJCX0KKworCQkvLyBpbmRpY2F0ZSB0aGF0IHByb2Nlc3NSb3coKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQREkgb25jZSB0aGUgc3RlcCBpcyBkb25lIHByb2Nlc3NpbmcuCisJICoKKwkgKiBUaGUgZGlzcG9zZSgpIG1ldGhvZCBpcyB0aGUgY291bnRlcnBhcnQgdG8gaW5pdCgpIGFuZCBzaG91bGQgcmVsZWFzZSBhbnkgcmVzb3VyY2VzCisJICogYWNxdWlyZWQgZm9yIHN0ZXAgZXhlY3V0aW9uIGxpa2UgZmlsZSBoYW5kbGVzIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLgorCSAqCisJICogVGhlIG1ldGEgYW5kIGRhdGEgaW1wbGVtZW50YXRpb25zIHBhc3NlZCBpbiBjYW4gc2FmZWx5IGJlIGNhc3QKKwkgKiB0byB0aGUgc3RlcCdzIHJlc3BlY3RpdmUgaW1wbGVtZW50YXRpb25zLgorCSAqCisJICogSXQgaXMgbWFuZGF0b3J5IHRoYXQgc3VwZXIuZGlzcG9zZSgpIGlzIGNhbGxlZCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvci4KKwkgKgorCSAqIEBwYXJhbSBzbWkgCXN0ZXAgbWV0YSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24sIGNvbnRhaW5pbmcgdGhlIHN0ZXAgc2V0dGluZ3MKKwkgKiBAcGFyYW0gc2RpCXN0ZXAgZGF0YSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24sIHVzZWQgdG8gc3RvcmUgcnVudGltZSBpbmZvcm1hdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoU3RlcE1ldGFJbnRlcmZhY2Ugc21pLCBTdGVwRGF0YUludGVyZmFjZSBzZGkpIHsKKworCQkvLyBDYXN0aW5nIHRvIHN0ZXAtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBpcyBzYWZlCisJCUZpbGVtZ3JDaGVja1N0ZXBNZXRhIG1ldGEgPSAoRmlsZW1nckNoZWNrU3RlcE1ldGEpIHNtaTsKKwkJRmlsZW1nckNoZWNrU3RlcERhdGEgZGF0YSA9IChGaWxlbWdyQ2hlY2tTdGVwRGF0YSkgc2RpOworCQkKKwkJc3VwZXIuZGlzcG9zZShtZXRhLCBkYXRhKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9GaWxlbWdyQ2hlY2tTdGVwRGF0YS5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL0ZpbGVtZ3JDaGVja1N0ZXBEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjNWYzMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9GaWxlbWdyQ2hlY2tTdGVwRGF0YS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyY2hlY2s7CisKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5Sb3dNZXRhSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBEYXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuU3RlcERhdGFJbnRlcmZhY2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBEYXRhSW50ZXJmYWNlLgorICogICAKKyAqIEltcGxlbWVudGluZyBjbGFzc2VzIGluaGVyaXQgZnJvbSBCYXNlU3RlcERhdGEsIHdoaWNoIGltcGxlbWVudHMgdGhlIGVudGlyZQorICogaW50ZXJmYWNlIGNvbXBsZXRlbHkuIAorICogCisgKiBJbiBhZGRpdGlvbiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSB1c3VhbGx5IGtlZXAgdHJhY2sgb2YKKyAqIHBlci10aHJlYWQgcmVzb3VyY2VzIGR1cmluZyBzdGVwIGV4ZWN1dGlvbi4gVHlwaWNhbCBleGFtcGxlcyBhcmU6CisgKiByZXN1bHQgc2V0cywgdGVtcG9yYXJ5IGRhdGEsIGNhY2hpbmcgaW5kZXhlcywgZXRjLgorICogICAKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGRlbW8gc3RlcCBzdG9yZXMgdGhlIG91dHB1dCByb3cgc3RydWN0dXJlIGluIAorICogdGhlIGRhdGEgY2xhc3MuIAorICogICAKKyAqLworcHVibGljIGNsYXNzIEZpbGVtZ3JDaGVja1N0ZXBEYXRhIGV4dGVuZHMgQmFzZVN0ZXBEYXRhIGltcGxlbWVudHMgU3RlcERhdGFJbnRlcmZhY2UgeworCisJcHVibGljIFJvd01ldGFJbnRlcmZhY2Ugb3V0cHV0Um93TWV0YTsKKworICAgIHB1YmxpYyBTdHJpbmcgZmllbGRuYW1lOworCisgICAgcHVibGljIEZpbGVtZ3JDaGVja1N0ZXBEYXRhKCkKKwl7CisJCXN1cGVyKCk7CisJfQorfQorCQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL0ZpbGVtZ3JDaGVja1N0ZXBEaWFsb2cuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9GaWxlbWdyQ2hlY2tTdGVwRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlZjY3YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9GaWxlbWdyQ2hlY2tTdGVwRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyY2hlY2s7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5Db25zdDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5pMThuLkJhc2VNZXNzYWdlczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuc01ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcC5CYXNlU3RlcE1ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcC5TdGVwRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnVpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBEaWFsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBEaWFsb2dJbnRlcmZhY2UuCisgKiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBuZWVkIHRvOgorICogCisgKiAtIGJ1aWxkIGFuZCBvcGVuIGEgU1dUIGRpYWxvZyBkaXNwbGF5aW5nIHRoZSBzdGVwJ3Mgc2V0dGluZ3MgKHN0b3JlZCBpbiB0aGUgc3RlcCdzIG1ldGEgb2JqZWN0KQorICogLSB3cml0ZSBiYWNrIGFueSBjaGFuZ2VzIHRoZSB1c2VyIG1ha2VzIHRvIHRoZSBzdGVwJ3MgbWV0YSBvYmplY3QKKyAqIC0gcmVwb3J0IHdoZXRoZXIgdGhlIHVzZXIgY2hhbmdlZCBhbnkgc2V0dGluZ3Mgd2hlbiBjb25maXJtaW5nIHRoZSBkaWFsb2cgCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbGVtZ3JDaGVja1N0ZXBEaWFsb2cgZXh0ZW5kcyBCYXNlU3RlcERpYWxvZyBpbXBsZW1lbnRzIFN0ZXBEaWFsb2dJbnRlcmZhY2UgeworCisJLyoqCisJICoJVGhlIFBLRyBtZW1iZXIgaXMgdXNlZCB3aGVuIGxvb2tpbmcgdXAgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KKwkgKglUaGUgcHJvcGVydGllcyBmaWxlIHdpdGggbG9jYWxpemVkIGtleXMgaXMgZXhwZWN0ZWQgdG8gcmVzaWRlIGluIAorCSAqCXt0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkfS9tZXNzYWdlcy9tZXNzYWdlc197bG9jYWxlfS5wcm9wZXJ0aWVzICAgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gUEtHID0gRmlsZW1nckNoZWNrU3RlcE1ldGEuY2xhc3M7IC8vIGZvciBpMThuIHB1cnBvc2VzCisKKwkvLyB0aGlzIGlzIHRoZSBvYmplY3QgdGhlIHN0b3JlcyB0aGUgc3RlcCdzIHNldHRpbmdzCisJLy8gdGhlIGRpYWxvZyByZWFkcyB0aGUgc2V0dGluZ3MgZnJvbSBpdCB3aGVuIG9wZW5pbmcKKwkvLyB0aGUgZGlhbG9nIHdyaXRlcyB0aGUgc2V0dGluZ3MgdG8gaXQgd2hlbiBjb25maXJtZWQgCisJcHJpdmF0ZSBGaWxlbWdyQ2hlY2tTdGVwTWV0YSBtZXRhOworCisJLy8gdGV4dCBmaWVsZCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBhZGQgdG8gdGhlIHJvdyBzdHJlYW0KKwkvL3ByaXZhdGUgVGV4dCB3SGVsbG9GaWVsZE5hbWU7CisKKyAgICAvLyB0ZXh0IGZpZWxkIGhvbGRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIHRoZSBmaWxlbmFtZSBhZ2FpbnN0CisgICAgcHJpdmF0ZSBUZXh0IHdGaWxlbmFtZUZpZWxkOworICAgIHByaXZhdGUgVGV4dCB3U2VydmVyVVJMRmllbGQ7CisgICAgcHJpdmF0ZSBUZXh0IHdSZXN1bHRGaWVsZDsKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIHNpbXBseSBpbnZva2Ugc3VwZXIoKSBhbmQgc2F2ZSB0aGUgaW5jb21pbmcgbWV0YQorCSAqIG9iamVjdCB0byBhIGxvY2FsIHZhcmlhYmxlLCBzbyBpdCBjYW4gY29udmVuaWVudGx5IHJlYWQgYW5kIHdyaXRlIHNldHRpbmdzCisJICogZnJvbS90byBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IAl0aGUgU1dUIHNoZWxsIHRvIG9wZW4gdGhlIGRpYWxvZyBpbgorCSAqIEBwYXJhbSBpbgkJdGhlIG1ldGEgb2JqZWN0IGhvbGRpbmcgdGhlIHN0ZXAncyBzZXR0aW5ncworCSAqIEBwYXJhbSB0cmFuc01ldGEJdHJhbnNmb3JtYXRpb24gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gc25hbWUJCXRoZSBzdGVwIG5hbWUKKwkgKi8KKwlwdWJsaWMgRmlsZW1nckNoZWNrU3RlcERpYWxvZyhTaGVsbCBwYXJlbnQsIE9iamVjdCBpbiwgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RyaW5nIHNuYW1lKSB7CisJCXN1cGVyKHBhcmVudCwgKEJhc2VTdGVwTWV0YSkgaW4sIHRyYW5zTWV0YSwgc25hbWUpOworCQltZXRhID0gKEZpbGVtZ3JDaGVja1N0ZXBNZXRhKSBpbjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgU3Bvb24gd2hlbiB0aGUgdXNlciBvcGVucyB0aGUgc2V0dGluZ3MgZGlhbG9nIG9mIHRoZSBzdGVwLgorCSAqIEl0IHNob3VsZCBvcGVuIHRoZSBkaWFsb2cgYW5kIHJldHVybiBvbmx5IG9uY2UgdGhlIGRpYWxvZyBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIHVzZXIuCisJICogCisJICogSWYgdGhlIHVzZXIgY29uZmlybXMgdGhlIGRpYWxvZywgdGhlIG1ldGEgb2JqZWN0IChwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yKSBtdXN0CisJICogYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgc3RlcCBzZXR0aW5ncy4gVGhlIGNoYW5nZWQgZmxhZyBvZiB0aGUgbWV0YSBvYmplY3QgbXVzdCAKKwkgKiByZWZsZWN0IHdoZXRoZXIgdGhlIHN0ZXAgY29uZmlndXJhdGlvbiB3YXMgY2hhbmdlZCBieSB0aGUgZGlhbG9nLgorCSAqIAorCSAqIElmIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGRpYWxvZywgdGhlIG1ldGEgb2JqZWN0IG11c3Qgbm90IGJlIHVwZGF0ZWQsIGFuZCBpdHMgY2hhbmdlZCBmbGFnCisJICogbXVzdCByZW1haW4gdW5hbHRlcmVkLgorCSAqIAorCSAqIFRoZSBvcGVuKCkgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdGVwIGFmdGVyIHRoZSB1c2VyIGhhcyBjb25maXJtZWQgdGhlIGRpYWxvZywKKwkgKiBvciBudWxsIGlmIHRoZSB1c2VyIGNhbmNlbGxlZCB0aGUgZGlhbG9nLgorCSAqLworCXB1YmxpYyBTdHJpbmcgb3BlbigpIHsKKworCQkvLyBzdG9yZSBzb21lIGNvbnZlbmllbnQgU1dUIHZhcmlhYmxlcyAKKwkJU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisJCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7CisKKwkJLy8gU1dUIGNvZGUgZm9yIHByZXBhcmluZyB0aGUgZGlhbG9nCisJCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5NSU4gfCBTV1QuTUFYKTsKKwkJcHJvcHMuc2V0TG9vayhzaGVsbCk7CisJCXNldFNoZWxsSW1hZ2Uoc2hlbGwsIG1ldGEpOworCQkKKwkJLy8gU2F2ZSB0aGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgZmxhZyBvbiB0aGUgbWV0YSBvYmplY3QuIElmIHRoZSB1c2VyIGNhbmNlbHMKKwkJLy8gdGhlIGRpYWxvZywgaXQgd2lsbCBiZSByZXN0b3JlZCB0byB0aGlzIHNhdmVkIHZhbHVlLgorCQkvLyBUaGUgImNoYW5nZWQiIHZhcmlhYmxlIGlzIGluaGVyaXRlZCBmcm9tIEJhc2VTdGVwRGlhbG9nCisJCWNoYW5nZWQgPSBtZXRhLmhhc0NoYW5nZWQoKTsKKwkJCisJCS8vIFRoZSBNb2RpZnlMaXN0ZW5lciB1c2VkIG9uIGFsbCBjb250cm9scy4gSXQgd2lsbCB1cGRhdGUgdGhlIG1ldGEgb2JqZWN0IHRvIAorCQkvLyBpbmRpY2F0ZSB0aGF0IGNoYW5nZXMgYXJlIGJlaW5nIG1hZGUuCisJCU1vZGlmeUxpc3RlbmVyIGxzTW9kID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJbWV0YS5zZXRDaGFuZ2VkKCk7CisJCQl9CisJCX07CisJCQorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisJCS8vIFNXVCBjb2RlIGZvciBidWlsZGluZyB0aGUgYWN0dWFsIHNldHRpbmdzIGRpYWxvZyAgICAgICAgLy8KKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworCQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gQ29uc3QuRk9STV9NQVJHSU47CisJCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gQ29uc3QuRk9STV9NQVJHSU47CisKKwkJc2hlbGwuc2V0TGF5b3V0KGZvcm1MYXlvdXQpOworCQlzaGVsbC5zZXRUZXh0KEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRGVtby5TaGVsbC5UaXRsZSIpKTsgCisKKwkJaW50IG1pZGRsZSA9IHByb3BzLmdldE1pZGRsZVBjdCgpOworCQlpbnQgbWFyZ2luID0gQ29uc3QuTUFSR0lOOworCisJCS8vIFN0ZXBuYW1lIGxpbmUKKwkJd2xTdGVwbmFtZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlJJR0hUKTsKKwkJd2xTdGVwbmFtZS5zZXRUZXh0KEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiU3lzdGVtLkxhYmVsLlN0ZXBOYW1lIikpOyAKKwkJcHJvcHMuc2V0TG9vayh3bFN0ZXBuYW1lKTsKKwkJZmRsU3RlcG5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRsU3RlcG5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZmRsU3RlcG5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAtbWFyZ2luKTsKKwkJZmRsU3RlcG5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIG1hcmdpbik7CisJCXdsU3RlcG5hbWUuc2V0TGF5b3V0RGF0YShmZGxTdGVwbmFtZSk7CisJCQorCQl3U3RlcG5hbWUgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisJCXdTdGVwbmFtZS5zZXRUZXh0KHN0ZXBuYW1lKTsKKwkJcHJvcHMuc2V0TG9vayh3U3RlcG5hbWUpOworCQl3U3RlcG5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobHNNb2QpOworCQlmZFN0ZXBuYW1lID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkU3RlcG5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworCQlmZFN0ZXBuYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBtYXJnaW4pOworCQlmZFN0ZXBuYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXdTdGVwbmFtZS5zZXRMYXlvdXREYXRhKGZkU3RlcG5hbWUpOworCisJCS8vIG91dHB1dCBmaWVsZCB2YWx1ZQorCQlMYWJlbCB3bFZhbE5hbWUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5SSUdIVCk7CisJCXdsVmFsTmFtZS5zZXRUZXh0KEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRmlsZW1nckNoZWNrLkZpZWxkTmFtZS5MYWJlbCIpKTsKKwkJcHJvcHMuc2V0TG9vayh3bFZhbE5hbWUpOworCQlGb3JtRGF0YSBmZGxWYWxOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkbFZhbE5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZmRsVmFsTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIC1tYXJnaW4pOworCQlmZGxWYWxOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3U3RlcG5hbWUsIG1hcmdpbik7CisJCXdsVmFsTmFtZS5zZXRMYXlvdXREYXRhKGZkbFZhbE5hbWUpOworCisJCXdGaWxlbmFtZUZpZWxkID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworCQlwcm9wcy5zZXRMb29rKHdGaWxlbmFtZUZpZWxkKTsKKwkJd0ZpbGVuYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobHNNb2QpOworCQlGb3JtRGF0YSBmZFZhbE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRWYWxOYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAwKTsKKwkJZmRWYWxOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWZkVmFsTmFtZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQod1N0ZXBuYW1lLCBtYXJnaW4pOworCQl3RmlsZW5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGZkVmFsTmFtZSk7CisKKworICAgICAgICAvLyBzZXJ2ZXJuYW1lIGZpZWxkIHZhbHVlCisgICAgICAgIExhYmVsIHdsU2VydmVyTmFtZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlJJR0hUKTsKKyAgICAgICAgd2xTZXJ2ZXJOYW1lLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJGaWxlbWdyQ2hlY2suU2VydmVyVVJMLkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsU2VydmVyTmFtZSk7CisgICAgICAgIEZvcm1EYXRhIGZkbFNlcnZlck5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKyAgICAgICAgZmRsU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxTZXJ2ZXJOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisgICAgICAgIGZkbFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdGaWxlbmFtZUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3bFNlcnZlck5hbWUuc2V0TGF5b3V0RGF0YShmZGxTZXJ2ZXJOYW1lKTsKKworICAgICAgICB3U2VydmVyVVJMRmllbGQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisgICAgICAgIHByb3BzLnNldExvb2sod1NlcnZlclVSTEZpZWxkKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKyAgICAgICAgRm9ybURhdGEgZmRTZXJ2ZXJOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisgICAgICAgIGZkU2VydmVyTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworICAgICAgICBmZFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdGaWxlbmFtZUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3U2VydmVyVVJMRmllbGQuc2V0TGF5b3V0RGF0YShmZFNlcnZlck5hbWUpOworCisgICAgICAgIC8vIHNlcnZlcm5hbWUgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xSZXN1bHROYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFJlc3VsdE5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JDaGVjay5SZXN1bHQuTGFiZWwiKSk7CisgICAgICAgIHByb3BzLnNldExvb2sod2xSZXN1bHROYW1lKTsKKyAgICAgICAgRm9ybURhdGEgZmRsUmVzdWx0TmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZGxSZXN1bHROYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisgICAgICAgIGZkbFJlc3VsdE5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAtbWFyZ2luKTsKKyAgICAgICAgZmRsUmVzdWx0TmFtZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQod1NlcnZlclVSTEZpZWxkLCBtYXJnaW4pOworICAgICAgICB3bFJlc3VsdE5hbWUuc2V0TGF5b3V0RGF0YShmZGxSZXN1bHROYW1lKTsKKworICAgICAgICB3UmVzdWx0RmllbGQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisgICAgICAgIHByb3BzLnNldExvb2sod1Jlc3VsdEZpZWxkKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKyAgICAgICAgRm9ybURhdGEgZmRSZXN1bHROYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkUmVzdWx0TmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisgICAgICAgIGZkUmVzdWx0TmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworICAgICAgICBmZFJlc3VsdE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTZXJ2ZXJVUkxGaWVsZCwgbWFyZ2luKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLnNldExheW91dERhdGEoZmRSZXN1bHROYW1lKTsKKworCisgICAgICAgIC8vIE9LIGFuZCBjYW5jZWwgYnV0dG9ucworCQl3T0sgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7CisJCXdPSy5zZXRUZXh0KEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiU3lzdGVtLkJ1dHRvbi5PSyIpKTsgCisJCXdDYW5jZWwgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7CisJCXdDYW5jZWwuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIlN5c3RlbS5CdXR0b24uQ2FuY2VsIikpOyAKKworCQlCYXNlU3RlcERpYWxvZy5wb3NpdGlvbkJvdHRvbUJ1dHRvbnMoc2hlbGwsIG5ldyBCdXR0b25bXSB7IHdPSywgd0NhbmNlbCB9LCBtYXJnaW4sIHdSZXN1bHRGaWVsZCk7CisKKwkJLy8gQWRkIGxpc3RlbmVycyBmb3IgY2FuY2VsIGFuZCBPSworCQlsc0NhbmNlbCA9IG5ldyBMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHtjYW5jZWwoKTt9CisJCX07CisJCWxzT0sgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7b2soKTt9CisJCX07CisKKwkJd0NhbmNlbC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsc0NhbmNlbCk7CisJCXdPSy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsc09LKTsKKworCQkvLyBkZWZhdWx0IGxpc3RlbmVyIChmb3IgaGl0dGluZyAiZW50ZXIiKQorCQlsc0RlZiA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHtvaygpO30KKwkJfTsKKwkJd1N0ZXBuYW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKwkJd0ZpbGVuYW1lRmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobHNEZWYpOworICAgICAgICB3U2VydmVyVVJMRmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobHNEZWYpOworICAgICAgICB3UmVzdWx0RmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobHNEZWYpOworCQkvLyBEZXRlY3QgWCBvciBBTFQtRjQgb3Igc29tZXRoaW5nIHRoYXQga2lsbHMgdGhpcyB3aW5kb3cgYW5kIGNhbmNlbCB0aGUgZGlhbG9nIHByb3Blcmx5CisJCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobmV3IFNoZWxsQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkge2NhbmNlbCgpO30KKwkJfSk7CisJCQorCQkvLyBTZXQvUmVzdG9yZSB0aGUgZGlhbG9nIHNpemUgYmFzZWQgb24gbGFzdCBwb3NpdGlvbiBvbiBzY3JlZW4KKwkJLy8gVGhlIHNldFNpemUoKSBtZXRob2QgaXMgaW5oZXJpdGVkIGZyb20gQmFzZVN0ZXBEaWFsb2cKKwkJc2V0U2l6ZSgpOworCisJCS8vIHBvcHVsYXRlIHRoZSBkaWFsb2cgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG1ldGEgb2JqZWN0CisJCXBvcHVsYXRlRGlhbG9nKCk7CisJCQorCQkvLyByZXN0b3JlIHRoZSBjaGFuZ2VkIGZsYWcgdG8gb3JpZ2luYWwgdmFsdWUsIGFzIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGZpcmUgZHVyaW5nIGRpYWxvZyBwb3B1bGF0aW9uIAorCQltZXRhLnNldENoYW5nZWQoY2hhbmdlZCk7CisKKwkJLy8gb3BlbiBkaWFsb2cgYW5kIGVudGVyIGV2ZW50IGxvb3AgCisJCXNoZWxsLm9wZW4oKTsKKwkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKKwkJCQlkaXNwbGF5LnNsZWVwKCk7CisJCX0KKworCQkvLyBhdCB0aGlzIHBvaW50IHRoZSBkaWFsb2cgaGFzIGNsb3NlZCwgc28gZWl0aGVyIG9rKCkgb3IgY2FuY2VsKCkgaGF2ZSBiZWVuIGV4ZWN1dGVkCisJCS8vIFRoZSAic3RlcG5hbWUiIHZhcmlhYmxlIGlzIGluaGVyaXRlZCBmcm9tIEJhc2VTdGVwRGlhbG9nCisJCXJldHVybiBzdGVwbmFtZTsKKwl9CisJCisJLyoqCisJICogVGhpcyBoZWxwZXIgbWV0aG9kIHB1dHMgdGhlIHN0ZXAgY29uZmlndXJhdGlvbiBzdG9yZWQgaW4gdGhlIG1ldGEgb2JqZWN0CisJICogYW5kIHB1dHMgaXQgaW50byB0aGUgZGlhbG9nIGNvbnRyb2xzLgorCSAqLworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURpYWxvZygpIHsKKwkJd1N0ZXBuYW1lLnNlbGVjdEFsbCgpOworCQl3RmlsZW5hbWVGaWVsZC5zZXRUZXh0KG1ldGEuZ2V0RmlsZW5hbWVGaWVsZCgpKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLnNldFRleHQobWV0YS5nZXRTZXJ2ZXJVUkxGaWVsZCgpKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLnNldFRleHQobWV0YS5nZXRSZXN1bHRGaWVsZCgpKTsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBkaWFsb2cuICAKKwkgKi8KKwlwcml2YXRlIHZvaWQgY2FuY2VsKCkgeworCQkvLyBUaGUgInN0ZXBuYW1lIiB2YXJpYWJsZSB3aWxsIGJlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBvcGVuKCkgbWV0aG9kLiAKKwkJLy8gU2V0dGluZyB0byBudWxsIHRvIGluZGljYXRlIHRoYXQgZGlhbG9nIHdhcyBjYW5jZWxsZWQuCisJCXN0ZXBuYW1lID0gbnVsbDsKKwkJLy8gUmVzdG9yaW5nIG9yaWdpbmFsICJjaGFuZ2VkIiBmbGFnIG9uIHRoZSBtZXQgYW9iamVjdAorCQltZXRhLnNldENoYW5nZWQoY2hhbmdlZCk7CisJCS8vIGNsb3NlIHRoZSBTV1QgZGlhbG9nIHdpbmRvdworCQlkaXNwb3NlKCk7CisJfQorCQorCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNvbmZpcm1zIHRoZSBkaWFsb2cKKwkgKi8KKwlwcml2YXRlIHZvaWQgb2soKSB7CisJCS8vIFRoZSAic3RlcG5hbWUiIHZhcmlhYmxlIHdpbGwgYmUgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIG9wZW4oKSBtZXRob2QuIAorCQkvLyBTZXR0aW5nIHRvIHN0ZXAgbmFtZSBmcm9tIHRoZSBkaWFsb2cgY29udHJvbAorCQlzdGVwbmFtZSA9IHdTdGVwbmFtZS5nZXRUZXh0KCk7IAorCQkvLyBTZXR0aW5nIHRoZSAgc2V0dGluZ3MgdG8gdGhlIG1ldGEgb2JqZWN0CisJCS8vbWV0YS5zZXRPdXRwdXRGaWVsZCh3RmlsZW5hbWVGaWVsZC5nZXRUZXh0KCkpOworICAgICAgICBtZXRhLnNldEZpbGVuYW1lRmllbGQod0ZpbGVuYW1lRmllbGQuZ2V0VGV4dCgpKTsKKyAgICAgICAgbWV0YS5zZXRTZXJ2ZXJVUkxGaWVsZCh3U2VydmVyVVJMRmllbGQuZ2V0VGV4dCgpKTsKKyAgICAgICAgbWV0YS5zZXRSZXN1bHRGaWVsZCh3UmVzdWx0RmllbGQuZ2V0VGV4dCgpKTsKKwkJLy8gY2xvc2UgdGhlIFNXVCBkaWFsb2cgd2luZG93CisJCWRpc3Bvc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svRmlsZW1nckNoZWNrU3RlcE1ldGEuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9GaWxlbWdyQ2hlY2tTdGVwTWV0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjViOTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svRmlsZW1nckNoZWNrU3RlcE1ldGEuamF2YQpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JjaGVjazsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuQ2hlY2tSZXN1bHQ7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5DaGVja1Jlc3VsdEludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmFubm90YXRpb25zLlN0ZXA7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5kYXRhYmFzZS5EYXRhYmFzZU1ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5leGNlcHRpb24uS2V0dGxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZXhjZXB0aW9uLktldHRsZVN0ZXBFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5leGNlcHRpb24uS2V0dGxlVmFsdWVFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5leGNlcHRpb24uS2V0dGxlWE1MRXhjZXB0aW9uOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUucm93LlJvd01ldGFJbnRlcmZhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuVmFsdWVNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUucm93LlZhbHVlTWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZVNwYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUueG1sLlhNTEhhbmRsZXI7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuaTE4bi5CYXNlTWVzc2FnZXM7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkucmVwb3NpdG9yeS5PYmplY3RJZDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5yZXBvc2l0b3J5LlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuVHJhbnM7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuVHJhbnNNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuKjsKK2ltcG9ydCBvcmcucGVudGFoby5tZXRhc3RvcmUuYXBpLklNZXRhU3RvcmU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgZGVtbyBzdGVwIHBsdWctaW4gaW1wbGVtZW50YXRpb24uCisgKiBJdCBkZW1vbnN0cmF0ZXMgdGhlIGJhc2ljcyBvZiBkZXZlbG9waW5nIGEgcGx1Zy1pbiBzdGVwIGZvciBQREkuIAorICogCisgKiBUaGUgZGVtbyBzdGVwIGFkZHMgYSBuZXcgc3RyaW5nIGZpZWxkIHRvIHRoZSByb3cgc3RyZWFtIGFuZCBzZXRzIGl0cworICogdmFsdWUgdG8gIkhlbGxvIFdvcmxkISIuIFRoZSB1c2VyIG1heSBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIG5ldyBmaWVsZC4KKyAqICAgCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTdGVwTWV0YUludGVyZmFjZS4KKyAqIENsYXNzZXMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIG5lZWQgdG86CisgKiAKKyAqIC0ga2VlcCB0cmFjayBvZiB0aGUgc3RlcCBzZXR0aW5ncworICogLSBzZXJpYWxpemUgc3RlcCBzZXR0aW5ncyBib3RoIHRvIHhtbCBhbmQgYSByZXBvc2l0b3J5CisgKiAtIHByb3ZpZGUgbmV3IGluc3RhbmNlcyBvZiBvYmplY3RzIGltcGxlbWVudGluZyBTdGVwRGlhbG9nSW50ZXJmYWNlLCBTdGVwSW50ZXJmYWNlIGFuZCBTdGVwRGF0YUludGVyZmFjZQorICogLSByZXBvcnQgb24gaG93IHRoZSBzdGVwIG1vZGlmaWVzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIHJvdy1zdHJlYW0gKHJvdyBzdHJ1Y3R1cmUgYW5kIGZpZWxkIHR5cGVzKQorICogLSBwZXJmb3JtIGEgc2FuaXR5LWNoZWNrIG9uIHRoZSBzZXR0aW5ncyBwcm92aWRlZCBieSB0aGUgdXNlciAKKyAqIAorICovCisKK0BTdGVwKAkKKwkJaWQgPSAiRmlsZW1nckNoZWNrIiwKKwkJaW1hZ2UgPSAib3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9yZXNvdXJjZXMvY2hlY2svb29kdC5qcGciLAorCQlpMThuUGFja2FnZU5hbWU9ImJpLm1ldGVvcml0ZS5maWxlbWdyY2hlY2siLAorCQluYW1lPSJGaWxlbWdyQ2hlY2tTdGVwLk5hbWUiLAorCQlkZXNjcmlwdGlvbiA9ICJGaWxlbWdyQ2hlY2tTdGVwLlRvb2x0aXBEZXNjIiwKKwkJY2F0ZWdvcnlEZXNjcmlwdGlvbj0iaTE4bjpvcmcucGVudGFoby5kaS50cmFucy5zdGVwOkJhc2VTdGVwLkNhdGVnb3J5LkJpZ0RhdGEiCispCitwdWJsaWMgY2xhc3MgRmlsZW1nckNoZWNrU3RlcE1ldGEgZXh0ZW5kcyBCYXNlU3RlcE1ldGEgaW1wbGVtZW50cyBTdGVwTWV0YUludGVyZmFjZSB7CisJLyoqCisJICoJVGhlIFBLRyBtZW1iZXIgaXMgdXNlZCB3aGVuIGxvb2tpbmcgdXAgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KKwkgKglUaGUgcHJvcGVydGllcyBmaWxlIHdpdGggbG9jYWxpemVkIGtleXMgaXMgZXhwZWN0ZWQgdG8gcmVzaWRlIGluIAorCSAqCXt0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkfS9tZXNzYWdlcy9tZXNzYWdlc197bG9jYWxlfS5wcm9wZXJ0aWVzICAgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gUEtHID0gRmlsZW1nckNoZWNrU3RlcE1ldGEuY2xhc3M7IC8vIGZvciBpMThuIHB1cnBvc2VzCisJCisJLyoqCisJICogU3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCB0byB0aGUgcm93LXN0cmVhbS4gCisJICovCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWVGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJVUkxGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyByZXN1bHRGaWVsZDsKKworICAgIC8qKgorCSAqIENvbnN0cnVjdG9yIHNob3VsZCBjYWxsIHN1cGVyKCkgdG8gbWFrZSBzdXJlIHRoZSBiYXNlIGNsYXNzIGhhcyBhIGNoYW5jZSB0byBpbml0aWFsaXplIHByb3Blcmx5LgorCSAqLworCXB1YmxpYyBGaWxlbWdyQ2hlY2tTdGVwTWV0YSgpIHsKKwkJc3VwZXIoKTsgCisJfQorCQorCS8qKgorCSAqIENhbGxlZCBieSBTcG9vbiB0byBnZXQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNXVCBkaWFsb2cgZm9yIHRoZSBzdGVwLgorCSAqIEEgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gcGFzc2luZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3RlcCBkaWFsb2cgaXMgcmVjb21tZW5kZWQuCisJICogCisJICogQHBhcmFtIHNoZWxsCQlhbiBTV1QgU2hlbGwKKwkgKiBAcGFyYW0gbWV0YSAJCWRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwIAorCSAqIEBwYXJhbSB0cmFuc01ldGEJZGVzY3JpcHRpb24gb2YgdGhlIHRoZSB0cmFuc2Zvcm1hdGlvbiAKKwkgKiBAcGFyYW0gbmFtZQkJdGhlIG5hbWUgb2YgdGhlIHN0ZXAKKwkgKiBAcmV0dXJuIAkJCW5ldyBpbnN0YW5jZSBvZiBhIGRpYWxvZyBmb3IgdGhpcyBzdGVwIAorCSAqLworCXB1YmxpYyBTdGVwRGlhbG9nSW50ZXJmYWNlIGdldERpYWxvZyhTaGVsbCBzaGVsbCwgU3RlcE1ldGFJbnRlcmZhY2UgbWV0YSwgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyQ2hlY2tTdGVwRGlhbG9nKHNoZWxsLCBtZXRhLCB0cmFuc01ldGEsIG5hbWUpOworCX0KKworCS8qKgorCSAqIENhbGxlZCBieSBQREkgdG8gZ2V0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzdGVwIGltcGxlbWVudGF0aW9uLiAKKwkgKiBBIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHBhc3NpbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN0ZXAgY2xhc3MgaXMgcmVjb21tZW5kZWQuCisJICogCisJICogQHBhcmFtIHN0ZXBNZXRhCQkJCWRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwCisJICogQHBhcmFtIHN0ZXBEYXRhSW50ZXJmYWNlCQlpbnN0YW5jZSBvZiBhIHN0ZXAgZGF0YSBjbGFzcworCSAqIEBwYXJhbSBjbnIJCQkJCWNvcHkgbnVtYmVyCisJICogQHBhcmFtIHRyYW5zTWV0YQkJCQlkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcGFyYW0gZGlzcAkJCQkJcnVudGltZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcmV0dXJuCQkJCQkJdGhlIG5ldyBpbnN0YW5jZSBvZiBhIHN0ZXAgaW1wbGVtZW50YXRpb24gCisJICovCisJcHVibGljIFN0ZXBJbnRlcmZhY2UgZ2V0U3RlcChTdGVwTWV0YSBzdGVwTWV0YSwgU3RlcERhdGFJbnRlcmZhY2Ugc3RlcERhdGFJbnRlcmZhY2UsIGludCBjbnIsIFRyYW5zTWV0YSB0cmFuc01ldGEsIFRyYW5zIGRpc3ApIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyQ2hlY2tTdGVwKHN0ZXBNZXRhLCBzdGVwRGF0YUludGVyZmFjZSwgY25yLCB0cmFuc01ldGEsIGRpc3ApOworCX0KKworCS8qKgorCSAqIENhbGxlZCBieSBQREkgdG8gZ2V0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzdGVwIGRhdGEgY2xhc3MuCisJICovCisJcHVibGljIFN0ZXBEYXRhSW50ZXJmYWNlIGdldFN0ZXBEYXRhKCkgeworCQlyZXR1cm4gbmV3IEZpbGVtZ3JDaGVja1N0ZXBEYXRhKCk7CisJfQkKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgbmV3IHN0ZXAgaXMgY3JlYXRlZCBhbmQgc2hvdWxkIGFsbG9jYXRlL3NldCB0aGUgc3RlcCBjb25maWd1cmF0aW9uCisJICogdG8gc2Vuc2libGUgZGVmYXVsdHMuIFRoZSB2YWx1ZXMgc2V0IGhlcmUgd2lsbCBiZSB1c2VkIGJ5IFNwb29uIHdoZW4gYSBuZXcgc3RlcCBpcyBjcmVhdGVkLiAgICAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KCkgeworCQlvdXRwdXRGaWVsZCA9ICJkZW1vX2ZpZWxkIjsKKyAgICAgICAgZmlsZW5hbWVGaWVsZCA9ICJmaWVsZG5hbWUiOworICAgICAgICBzZXJ2ZXJVUkxGaWVsZCA9ICJodHRwOi8vbG9jYWxob3N0OjkwMDAiOworICAgICAgICByZXN1bHRGaWVsZCA9ICJyZXN1bHQiOworCX0KKwkKKwkvKioKKwkgKiBHZXR0ZXIgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCBieSB0aGlzIHN0ZXAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RmllbGQoKSB7CisJCXJldHVybiBvdXRwdXRGaWVsZDsKKwl9CisKKwkvKioKKwkgKiBTZXR0ZXIgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCBieSB0aGlzIHN0ZXAKKwkgKiBAcGFyYW0gb3V0cHV0RmllbGQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFkZGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3V0cHV0RmllbGQoU3RyaW5nIG91dHB1dEZpZWxkKSB7CisJCXRoaXMub3V0cHV0RmllbGQgPSBvdXRwdXRGaWVsZDsKKwl9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWVGaWVsZCgpeworICAgICAgICByZXR1cm4gZmlsZW5hbWVGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZUZpZWxkKFN0cmluZyBmaWxlbmFtZUZpZWxkKXsKKyAgICAgICAgdGhpcy5maWxlbmFtZUZpZWxkID0gZmlsZW5hbWVGaWVsZDsKKyAgICB9CisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIGEgc3RlcCBpcyBkdXBsaWNhdGVkIGluIFNwb29uLiBJdCBuZWVkcyB0byByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcworCSAqIHN0ZXAgbWV0YSBvYmplY3QuIEJlIHN1cmUgdG8gY3JlYXRlIHByb3BlciBkZWVwIGNvcGllcyBpZiB0aGUgc3RlcCBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbgorCSAqIG1vZGlmaWFibGUgb2JqZWN0cy4KKwkgKiAKKwkgKiBTZWUgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcHMucm93Z2VuZXJhdG9yLlJvd0dlbmVyYXRvck1ldGEuY2xvbmUoKSBmb3IgYW4gZXhhbXBsZSBvbiBjcmVhdGluZworCSAqIGEgZGVlcCBjb3B5LgorCSAqIAorCSAqIEByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcworCSAqLworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisJCU9iamVjdCByZXR2YWwgPSBzdXBlci5jbG9uZSgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgU3Bvb24gd2hlbiBhIHN0ZXAgbmVlZHMgdG8gc2VyaWFsaXplIGl0cyBjb25maWd1cmF0aW9uIHRvIFhNTC4gVGhlIGV4cGVjdGVkCisJICogcmV0dXJuIHZhbHVlIGlzIGFuIFhNTCBmcmFnbWVudCBjb25zaXN0aW5nIG9mIG9uZSBvciBtb3JlIFhNTCB0YWdzLiAgCisJICogCisJICogUGxlYXNlIHVzZSBvcmcucGVudGFoby5kaS5jb3JlLnhtbC5YTUxIYW5kbGVyIHRvIGNvbnZlbmllbnRseSBnZW5lcmF0ZSB0aGUgWE1MLgorCSAqIAorCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgWE1MIHNlcmlhbGl6YXRpb24gb2YgdGhpcyBzdGVwCisJICovCisJcHVibGljIFN0cmluZyBnZXRYTUwoKSB0aHJvd3MgS2V0dGxlVmFsdWVFeGNlcHRpb24geworCQkKKwkJLy8gb25seSBvbmUgZmllbGQgdG8gc2VyaWFsaXplCisJCVN0cmluZyB4bWwgPSAgIiAiOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJvdXRwdXRmaWVsZCIsIG91dHB1dEZpZWxkKTsKKyAgICAgICAgeG1sICs9ICIgICAgIiArWE1MSGFuZGxlci5hZGRUYWdWYWx1ZSgiZmlsZW5hbWVmaWVsZCIsIGZpbGVuYW1lRmllbGQpOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJzZXJ2ZXJ1cmxmaWVsZCIsIHNlcnZlclVSTEZpZWxkKTsKKyAgICAgICAgeG1sICs9ICIgICAgIiArWE1MSGFuZGxlci5hZGRUYWdWYWx1ZSgicmVzdWx0ZmllbGQiLCByZXN1bHRGaWVsZCk7CisJCXJldHVybiB4bWw7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBESSB3aGVuIGEgc3RlcCBuZWVkcyB0byBsb2FkIGl0cyBjb25maWd1cmF0aW9uIGZyb20gWE1MLgorCSAqIAorCSAqIFBsZWFzZSB1c2Ugb3JnLnBlbnRhaG8uZGkuY29yZS54bWwuWE1MSGFuZGxlciB0byBjb252ZW5pZW50bHkgcmVhZCBmcm9tIHRoZQorCSAqIFhNTCBub2RlIHBhc3NlZCBpbi4KKwkgKiAKKwkgKiBAcGFyYW0gc3RlcG5vZGUJdGhlIFhNTCBub2RlIGNvbnRhaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb24KKwkgKiBAcGFyYW0gZGF0YWJhc2VzCXRoZSBkYXRhYmFzZXMgYXZhaWxhYmxlIGluIHRoZSB0cmFuc2Zvcm1hdGlvbgorCSAqIEBwYXJhbSBtZXRhU3RvcmUgdGhlIG1ldGFTdG9yZSB0byBvcHRpb25hbGx5IHJlYWQgZnJvbQorCSAqLworCXB1YmxpYyB2b2lkIGxvYWRYTUwoTm9kZSBzdGVwbm9kZSwgTGlzdDxEYXRhYmFzZU1ldGE+IGRhdGFiYXNlcywgSU1ldGFTdG9yZSBtZXRhU3RvcmUpIHRocm93cyBLZXR0bGVYTUxFeGNlcHRpb24geworCisJCXRyeSB7CisJCQlzZXRPdXRwdXRGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJvdXRwdXRmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRGaWxlbmFtZUZpZWxkKFhNTEhhbmRsZXIuZ2V0Tm9kZVZhbHVlKFhNTEhhbmRsZXIuZ2V0U3ViTm9kZShzdGVwbm9kZSwgImZpbGVuYW1lZmllbGQiKSkpOworICAgICAgICAgICAgc2V0U2VydmVyVVJMRmllbGQoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAic2VydmVydXJsZmllbGQiKSkpOworICAgICAgICAgICAgc2V0UmVzdWx0RmllbGQoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAicmVzdWx0ZmllbGQiKSkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEtldHRsZVhNTEV4Y2VwdGlvbigiRGVtbyBwbHVnaW4gdW5hYmxlIHRvIHJlYWQgc3RlcCBpbmZvIGZyb20gWE1MIG5vZGUiLCBlKTsKKwkJfQorCisJfQkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgU3Bvb24gd2hlbiBhIHN0ZXAgbmVlZHMgdG8gc2VyaWFsaXplIGl0cyBjb25maWd1cmF0aW9uIHRvIGEgcmVwb3NpdG9yeS4KKwkgKiBUaGUgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMgdG8gc2F2ZSB0aGUgc3RlcCBhdHRyaWJ1dGVzLgorCSAqCisJICogQHBhcmFtIHJlcAkJCQkJdGhlIHJlcG9zaXRvcnkgdG8gc2F2ZSB0bworCSAqIEBwYXJhbSBtZXRhU3RvcmUJCQkJdGhlIG1ldGFTdG9yZSB0byBvcHRpb25hbGx5IHdyaXRlIHRvCisJICogQHBhcmFtIGlkX3RyYW5zZm9ybWF0aW9uCQl0aGUgaWQgdG8gdXNlIGZvciB0aGUgdHJhbnNmb3JtYXRpb24gd2hlbiBzYXZpbmcKKwkgKiBAcGFyYW0gaWRfc3RlcAkJCQl0aGUgaWQgdG8gdXNlIGZvciB0aGUgc3RlcCAgd2hlbiBzYXZpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzYXZlUmVwKFJlcG9zaXRvcnkgcmVwLCBJTWV0YVN0b3JlIG1ldGFTdG9yZSwgT2JqZWN0SWQgaWRfdHJhbnNmb3JtYXRpb24sIE9iamVjdElkIGlkX3N0ZXApIHRocm93cyBLZXR0bGVFeGNlcHRpb24KKwl7CisJCXRyeXsKKwkJCXJlcC5zYXZlU3RlcEF0dHJpYnV0ZShpZF90cmFuc2Zvcm1hdGlvbiwgaWRfc3RlcCwgIm91dHB1dGZpZWxkIiwgb3V0cHV0RmllbGQpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJY2F0Y2goRXhjZXB0aW9uIGUpeworCQkJdGhyb3cgbmV3IEtldHRsZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHNhdmUgc3RlcCBpbnRvIHJlcG9zaXRvcnk6ICIraWRfc3RlcCwgZSk7IAorCQl9CisJfQkJCisJCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBESSB3aGVuIGEgc3RlcCBuZWVkcyB0byByZWFkIGl0cyBjb25maWd1cmF0aW9uIGZyb20gYSByZXBvc2l0b3J5LgorCSAqIFRoZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyB0byByZWFkIHRoZSBzdGVwIGF0dHJpYnV0ZXMuCisJICogCisJICogQHBhcmFtIHJlcAkJdGhlIHJlcG9zaXRvcnkgdG8gcmVhZCBmcm9tCisJICogQHBhcmFtIG1ldGFTdG9yZQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICogQHBhcmFtIGlkX3N0ZXAJdGhlIGlkIG9mIHRoZSBzdGVwIGJlaW5nIHJlYWQKKwkgKiBAcGFyYW0gZGF0YWJhc2VzCXRoZSBkYXRhYmFzZXMgYXZhaWxhYmxlIGluIHRoZSB0cmFuc2Zvcm1hdGlvbgorCSAqIEBwYXJhbSBjb3VudGVycwl0aGUgY291bnRlcnMgYXZhaWxhYmxlIGluIHRoZSB0cmFuc2Zvcm1hdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHJlYWRSZXAoUmVwb3NpdG9yeSByZXAsIElNZXRhU3RvcmUgbWV0YVN0b3JlLCBPYmplY3RJZCBpZF9zdGVwLCBMaXN0PERhdGFiYXNlTWV0YT4gZGF0YWJhc2VzKSB0aHJvd3MgS2V0dGxlRXhjZXB0aW9uICB7CisJCXRyeXsKKwkJCW91dHB1dEZpZWxkICA9IHJlcC5nZXRTdGVwQXR0cmlidXRlU3RyaW5nKGlkX3N0ZXAsICJvdXRwdXRmaWVsZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJY2F0Y2goRXhjZXB0aW9uIGUpeworCQkJdGhyb3cgbmV3IEtldHRsZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgc3RlcCBmcm9tIHJlcG9zaXRvcnkiLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGNoYW5nZXMgdGhlIHN0ZXAgaXMgbWFraW5nIHRvIHRoZSByb3ctc3RyZWFtLgorCSAqIFRvIHRoYXQgZW5kIGEgUm93TWV0YUludGVyZmFjZSBvYmplY3QgaXMgcGFzc2VkIGluLCBjb250YWluaW5nIHRoZSByb3ctc3RyZWFtIHN0cnVjdHVyZSBhcyBpdCBpcyB3aGVuIGVudGVyaW5nCisJICogdGhlIHN0ZXAuIFRoaXMgbWV0aG9kIG11c3QgYXBwbHkgYW55IGNoYW5nZXMgdGhlIHN0ZXAgbWFrZXMgdG8gdGhlIHJvdyBzdHJlYW0uIFVzdWFsbHkgYSBzdGVwIGFkZHMgZmllbGRzIHRvIHRoZQorCSAqIHJvdy1zdHJlYW0uCisJICogCisJICogQHBhcmFtIGlucHV0Um93TWV0YQkJdGhlIHJvdyBzdHJ1Y3R1cmUgY29taW5nIGluIHRvIHRoZSBzdGVwCisJICogQHBhcmFtIG5hbWUgCQkJCXRoZSBuYW1lIG9mIHRoZSBzdGVwIG1ha2luZyB0aGUgY2hhbmdlcworCSAqIEBwYXJhbSBpbmZvCQkJCXJvdyBzdHJ1Y3R1cmVzIG9mIGFueSBpbmZvIHN0ZXBzIGNvbWluZyBpbgorCSAqIEBwYXJhbSBuZXh0U3RlcAkJCXRoZSBkZXNjcmlwdGlvbiBvZiBhIHN0ZXAgdGhpcyBzdGVwIGlzIHBhc3Npbmcgcm93cyB0bworCSAqIEBwYXJhbSBzcGFjZQkJCQl0aGUgdmFyaWFibGUgc3BhY2UgZm9yIHJlc29sdmluZyB2YXJpYWJsZXMKKwkgKiBAcGFyYW0gcmVwb3NpdG9yeQkJdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2Ugb3B0aW9uYWxseSByZWFkIGZyb20KKwkgKiBAcGFyYW0gbWV0YVN0b3JlCQkJdGhlIG1ldGFTdG9yZSB0byBvcHRpb25hbGx5IHJlYWQgZnJvbQorCSAqLworCXB1YmxpYyB2b2lkIGdldEZpZWxkcyhSb3dNZXRhSW50ZXJmYWNlIGlucHV0Um93TWV0YSwgU3RyaW5nIG5hbWUsIFJvd01ldGFJbnRlcmZhY2VbXSBpbmZvLCBTdGVwTWV0YSBuZXh0U3RlcCwgVmFyaWFibGVTcGFjZSBzcGFjZSwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBJTWV0YVN0b3JlIG1ldGFTdG9yZSkgdGhyb3dzIEtldHRsZVN0ZXBFeGNlcHRpb257CisKKwkJLyoKKwkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhcHBlbmRzIHRoZSBvdXRwdXRGaWVsZCB0byB0aGUgcm93LXN0cmVhbQorCQkgKi8KKworCQkvLyBhIHZhbHVlIG1ldGEgb2JqZWN0IGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgZm9yIGEgZmllbGQKKwkJVmFsdWVNZXRhSW50ZXJmYWNlIHYgPSBuZXcgVmFsdWVNZXRhKG91dHB1dEZpZWxkLCBWYWx1ZU1ldGEuVFlQRV9TVFJJTkcpOworCQkKKwkJLy8gc2V0dGluZyB0cmltIHR5cGUgdG8gImJvdGgiCisJCXYuc2V0VHJpbVR5cGUoVmFsdWVNZXRhLlRSSU1fVFlQRV9CT1RIKTsKKworCQkvLyB0aGUgbmFtZSBvZiB0aGUgc3RlcCB0aGF0IGFkZHMgdGhpcyBmaWVsZAorCQl2LnNldE9yaWdpbihuYW1lKTsKKwkJCisJCS8vIG1vZGlmeSB0aGUgcm93IHN0cnVjdHVyZSBhbmQgYWRkIHRoZSBmaWVsZCB0aGlzIHN0ZXAgZ2VuZXJhdGVzICAKKwkJaW5wdXRSb3dNZXRhLmFkZFZhbHVlTWV0YSh2KTsKKwkJCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgIlZlcmlmeSBUcmFuc2Zvcm1hdGlvbiIgb3B0aW9uIGluIFNwb29uLiAKKwkgKiBBIGxpc3Qgb2YgcmVtYXJrcyBpcyBwYXNzZWQgaW4gdGhhdCB0aGlzIG1ldGhvZCBzaG91bGQgYWRkIHRvLiBFYWNoIHJlbWFyayBpcyBhIGNvbW1lbnQsIHdhcm5pbmcsIGVycm9yLCBvciBvay4KKwkgKiBUaGUgbWV0aG9kIHNob3VsZCBwZXJmb3JtIGFzIG1hbnkgY2hlY2tzIGFzIG5lY2Vzc2FyeSB0byBjYXRjaCBkZXNpZ24tdGltZSBlcnJvcnMuCisJICogCisJICogVHlwaWNhbCBjaGVja3MgaW5jbHVkZToKKwkgKiAtIHZlcmlmeSB0aGF0IGFsbCBtYW5kYXRvcnkgY29uZmlndXJhdGlvbiBpcyBnaXZlbgorCSAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0ZXAgcmVjZWl2ZXMgYW55IGlucHV0LCB1bmxlc3MgaXQncyBhIHJvdyBnZW5lcmF0aW5nIHN0ZXAKKwkgKiAtIHZlcmlmeSB0aGF0IHRoZSBzdGVwIGRvZXMgbm90IHJlY2VpdmUgYW55IGlucHV0IGlmIGl0IGRvZXMgbm90IHRha2UgdGhlbSBpbnRvIGFjY291bnQKKwkgKiAtIHZlcmlmeSB0aGF0IHRoZSBzdGVwIGZpbmRzIGZpZWxkcyBpdCByZWxpZXMgb24gaW4gdGhlIHJvdy1zdHJlYW0KKwkgKiAKKwkgKiAgIEBwYXJhbSByZW1hcmtzCQl0aGUgbGlzdCBvZiByZW1hcmtzIHRvIGFwcGVuZCB0bworCSAqICAgQHBhcmFtIHRyYW5zbWV0YQl0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uCisJICogICBAcGFyYW0gc3RlcE1ldGEJdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwCisJICogICBAcGFyYW0gcHJldgkJdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5jb21pbmcgcm93LXN0cmVhbQorCSAqICAgQHBhcmFtIGlucHV0CQluYW1lcyBvZiBzdGVwcyBzZW5kaW5nIGlucHV0IHRvIHRoZSBzdGVwCisJICogICBAcGFyYW0gb3V0cHV0CQluYW1lcyBvZiBzdGVwcyB0aGlzIHN0ZXAgaXMgc2VuZGluZyBvdXRwdXQgdG8KKwkgKiAgIEBwYXJhbSBpbmZvCQlmaWVsZHMgY29taW5nIGluIGZyb20gaW5mbyBzdGVwcyAKKwkgKiAgIEBwYXJhbSBtZXRhU3RvcmUJbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgY2hlY2soTGlzdDxDaGVja1Jlc3VsdEludGVyZmFjZT4gcmVtYXJrcywgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RlcE1ldGEgc3RlcE1ldGEsIFJvd01ldGFJbnRlcmZhY2UgcHJldiwgU3RyaW5nIGlucHV0W10sIFN0cmluZyBvdXRwdXRbXSwgUm93TWV0YUludGVyZmFjZSBpbmZvLCBWYXJpYWJsZVNwYWNlIHNwYWNlLCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIElNZXRhU3RvcmUgbWV0YVN0b3JlKSAgeworCQkKKwkJQ2hlY2tSZXN1bHQgY3I7CisKKwkJLy8gU2VlIGlmIHRoZXJlIGFyZSBpbnB1dCBzdHJlYW1zIGxlYWRpbmcgdG8gdGhpcyBzdGVwIQorCQlpZiAoaW5wdXQubGVuZ3RoID4gMCkgeworCQkJY3IgPSBuZXcgQ2hlY2tSZXN1bHQoQ2hlY2tSZXN1bHQuVFlQRV9SRVNVTFRfT0ssIEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRGVtby5DaGVja1Jlc3VsdC5SZWNlaXZpbmdSb3dzLk9LIiksIHN0ZXBNZXRhKTsKKwkJCXJlbWFya3MuYWRkKGNyKTsKKwkJfSBlbHNlIHsKKwkJCWNyID0gbmV3IENoZWNrUmVzdWx0KENoZWNrUmVzdWx0LlRZUEVfUkVTVUxUX0VSUk9SLCBCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkRlbW8uQ2hlY2tSZXN1bHQuUmVjZWl2aW5nUm93cy5FUlJPUiIpLCBzdGVwTWV0YSk7CisJCQlyZW1hcmtzLmFkZChjcik7CisJCX0JCisgICAgCQorCX0KKworCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyVVJMRmllbGQoU3RyaW5nIHNlcnZlclVSTEZpZWxkKSB7CisgICAgICAgIHRoaXMuc2VydmVyVVJMRmllbGQgPSBzZXJ2ZXJVUkxGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclVSTEZpZWxkKCkgeworICAgICAgICByZXR1cm4gc2VydmVyVVJMRmllbGQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHRGaWVsZChTdHJpbmcgcmVzdWx0RmllbGQpIHsKKyAgICAgICAgdGhpcy5yZXN1bHRGaWVsZCA9IHJlc3VsdEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0RmllbGQoKSB7CisgICAgICAgIHJldHVybiByZXN1bHRGaWVsZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svT09EVENvbmZpZy5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL09PRFRDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTdlNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL09PRFRDb25maWcuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmNoZWNrOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5Jbmdlc3RlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQ3JlYXRlZCBieSBidWdnIG9uIDA3LzAzLzE0LgorICovCitwdWJsaWMgY2xhc3MgT09EVENvbmZpZyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihPT0RUQ29uZmlnLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIFVSTCBmbVVybDsKKworICAgIHByaXZhdGUgSW5nZXN0ZXIgaW5nZXN0ZXI7CisKKyAgICBwdWJsaWMgSW5nZXN0ZXIgZ2V0SW5nZXN0ZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmluZ2VzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBVUkwgZ2V0Rm1VcmwoKXsKKyAgICAgICAgcmV0dXJuIHRoaXMuZm1Vcmw7CisgICAgfQorCisKKyAgICB2b2lkIGxvYWRJbmdlc3RlcihTdHJpbmcgZm1VcmxTdHIpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgU3RyaW5nIGluZ2VzdGVyQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlciI7CisKKyAgICAgICAgICAgIFN0cmluZyBkYXRhVHJhbnNmZXJDbGFzcyA9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKworICAgICAgICAgICAgU3RyaW5nIGNhY2hlRmFjdG9yeUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAvLyJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLmZhY3RvcnkiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDb25maWd1cmluZyBhbmQgYnVpbGRpbmcgaW5nZXN0ZXI6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGluZ2VzdGVyQ2xhc3MgKyAiXTogZGF0YSB0cmFuc2ZlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRyYW5zZmVyQ2xhc3MgKyAiXTogdG8gaW5nZXN0IHRvIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZm1VcmxTdHIgKyAiXSIpOworCisgICAgICAgICAgIGlmIChjYWNoZUZhY3RvcnlDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNvbmZpZ3VyaW5nIEluZ2VzdGVyIGNhY2hlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2FjaGVGYWN0b3J5Q2xhc3MgKyAiXSIpOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgdGhpcy5pbmdlc3RlciA9IFB1c2hQdWxsT2JqZWN0RmFjdG9yeS5jcmVhdGVJbmdlc3RlcigKKyAgICAgICAgICAgICAgICAgIGluZ2VzdGVyQ2xhc3MsIGNhY2hlRmFjdG9yeUNsYXNzKTsKKworICAgICAgICAgICB0aGlzLmZtVXJsID0gc2FmZUdldFVybEZyb21TdHJpbmcoZm1VcmxTdHIpOworCisgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJMIHNhZmVHZXRVcmxGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHIpIHsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBnZW5lcmF0ZSB1cmwgZnJvbSB1cmwgc3RyaW5nOiBbIgorICAgICAgICAgICAgICAgICAgICArIHVybFN0ciArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svT09EVFByb2Nlc3Nlcy5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL09PRFRQcm9jZXNzZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc3YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL09PRFRQcm9jZXNzZXMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmNoZWNrOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworCisvKioKKyAqIENyZWF0ZWQgYnkgYnVnZyBvbiAwNy8wMy8xNC4KKyAqLworcHVibGljIGNsYXNzIE9PRFRQcm9jZXNzZXMgeworCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FscmVhZHlJbkRhdGFiYXNlKE9PRFRDb25maWcgY29uZmlnLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbmdlc3RlcigpICE9IG51bGwgPyBjb25maWcuZ2V0SW5nZXN0ZXIoKS5oYXNQcm9kdWN0KAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRGbVVybCgpLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICA6IGZhbHNlOworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTk0MzcyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL1B1c2hQdWxsT2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyY2hlY2s7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkNhY2hlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkluZ2VzdGVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFB1c2hQdWxsT2JqZWN0RmFjdG9yeSB7CisKKyAgICBwcml2YXRlIFB1c2hQdWxsT2JqZWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCBmYWN0b3J5IGNsYXNzZXMhIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBjcmVhdGVOZXdJbnN0YW5jZShDbGFzczxUPiBjbGF6eikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIAl0cnkgeworCQkJcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgbmV3IG9iamVjdCA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIEluZ2VzdGVyIGNyZWF0ZUluZ2VzdGVyKFN0cmluZyBpbmdlc3RlckNsYXNzLAorICAgICAgICAgICAgU3RyaW5nIGNhY2hlRmFjdG9yeUNsYXNzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uLAorICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGRhdGFUcmFuc2ZlckZhY3RvcnkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRSQU5TRkVSOiAiICsgZGF0YVRyYW5zZmVyRmFjdG9yeSk7CisgICAgICAgIGlmIChjYWNoZUZhY3RvcnlDbGFzcyA9PSBudWxsIHx8IGNhY2hlRmFjdG9yeUNsYXNzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAoSW5nZXN0ZXIpIENsYXNzLmZvck5hbWUoaW5nZXN0ZXJDbGFzcykuZ2V0Q29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlckZhY3RvcnkuZ2V0Q2xhc3MoKSkubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlckZhY3RvcnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3M8Q2FjaGVGYWN0b3J5PiBjYWNoZUZhY3RvcnkgPSAoQ2xhc3M8Q2FjaGVGYWN0b3J5PikgQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgLmZvck5hbWUoY2FjaGVGYWN0b3J5Q2xhc3MpOworICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBjYWNoZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDYWNoZSgpOworICAgICAgICAgICAgcmV0dXJuIChJbmdlc3RlcikgQ2xhc3MuZm9yTmFtZShpbmdlc3RlckNsYXNzKS5nZXRDb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyRmFjdG9yeS5nZXRDbGFzcygpLCBjYWNoZS5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoZGF0YVRyYW5zZmVyRmFjdG9yeSwgY2FjaGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svbWVzc2FnZXMvbWVzc2FnZXNfZW5fVVMucHJvcGVydGllcyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9tZXNzYWdlcy9tZXNzYWdlc19lbl9VUy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWYwMzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svbWVzc2FnZXMvbWVzc2FnZXNfZW5fVVMucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKK0ZpbGVtZ3JDaGVja1N0ZXAuTmFtZT1PT0RUIEZpbGVtZ3IgRmlsZSBDaGVjaworRmlsZW1nckNoZWNrU3RlcC5Ub29sdGlwRGVzYz1DaGVjayBpZiB0aGUgT09EVCBGaWxlbWdyIGhhcyBhIGZpbGUgaW4gaXRzIHJlcG9zaXRvcnkKKworRmlsZW1nckNoZWNrLkZpZWxkTmFtZS5MYWJlbD1TdHJlYW0gRmllbGQgTmFtZQorRmlsZW1nckNoZWNrLlNlcnZlclVSTC5MYWJlbD1GaWxlbWdyIFVSTAorRmlsZW1nckNoZWNrLlJlc3VsdC5MYWJlbD1SZXN1bHQgRmllbGQKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9yZXNvdXJjZXMvY2hlY2svb29kdC5qcGcgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svcmVzb3VyY2VzL2NoZWNrL29vZHQuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTA0MDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svcmVzb3VyY2VzL2NoZWNrL29vZHQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9yZXNvdXJjZXMvY2hlY2svb29kdC5wbmcgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svcmVzb3VyY2VzL2NoZWNrL29vZHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svcmVzb3VyY2VzL2NoZWNrL29vZHQucG5nCmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL0ZpbGVtZ3JEZWxldGVTdGVwLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL0ZpbGVtZ3JEZWxldGVTdGVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhNDhkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvRmlsZW1nckRlbGV0ZVN0ZXAuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmRlbGV0ZTsKKworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZXhjZXB0aW9uLktldHRsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5Sb3dEYXRhVXRpbDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5Sb3dNZXRhSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLlRyYW5zOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLlRyYW5zTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgZGVtbyBzdGVwIHBsdWctaW4gaW1wbGVtZW50YXRpb24uCisgKiBJdCBkZW1vbnN0cmF0ZXMgdGhlIGJhc2ljcyBvZiBkZXZlbG9waW5nIGEgcGx1Zy1pbiBzdGVwIGZvciBQREkuIAorICogCisgKiBUaGUgZGVtbyBzdGVwIGFkZHMgYSBuZXcgc3RyaW5nIGZpZWxkIHRvIHRoZSByb3cgc3RyZWFtIGFuZCBzZXRzIGl0cworICogdmFsdWUgdG8gIkhlbGxvIFdvcmxkISIuIFRoZSB1c2VyIG1heSBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIG5ldyBmaWVsZC4KKyAqICAgCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTdGVwSW50ZXJmYWNlLgorICogQ2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgbmVlZCB0bzoKKyAqIAorICogLSBpbml0aWFsaXplIHRoZSBzdGVwCisgKiAtIGV4ZWN1dGUgdGhlIHJvdyBwcm9jZXNzaW5nIGxvZ2ljCisgKiAtIGRpc3Bvc2Ugb2YgdGhlIHN0ZXAgCisgKiAKKyAqIFBsZWFzZSBkbyBub3QgY3JlYXRlIGFueSBsb2NhbCBmaWVsZHMgaW4gYSBTdGVwSW50ZXJmYWNlIGNsYXNzLiBTdG9yZSBhbnkKKyAqIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHByb2Nlc3NpbmcgbG9naWMgaW4gdGhlIHN1cHBsaWVkIHN0ZXAgZGF0YSBpbnRlcmZhY2UKKyAqIGluc3RlYWQuICAKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBGaWxlbWdyRGVsZXRlU3RlcCBleHRlbmRzIEJhc2VTdGVwIGltcGxlbWVudHMgU3RlcEludGVyZmFjZSB7CisKKyAgICBwcml2YXRlIE9PRFRDb25maWcgb29kdCA9IG5ldyBPT0RUQ29uZmlnKCk7CisgICAgcHJpdmF0ZSBPT0RUUHJvY2Vzc2VzIG9vZHRwcm9jID0gbmV3IE9PRFRQcm9jZXNzZXMoKTsKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIHNpbXBseSBwYXNzIG9uIGl0cyBhcmd1bWVudHMgdG8gdGhlIHBhcmVudCBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gcyAJCQkJc3RlcCBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBzdGVwRGF0YUludGVyZmFjZQlzdGVwIGRhdGEgY2xhc3MKKwkgKiBAcGFyYW0gYwkJCQkJc3RlcCBjb3B5CisJICogQHBhcmFtIHQJCQkJCXRyYW5zZm9ybWF0aW9uIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGRpcwkJCQl0cmFuc2Zvcm1hdGlvbiBleGVjdXRpbmcKKwkgKi8KKwlwdWJsaWMgRmlsZW1nckRlbGV0ZVN0ZXAoU3RlcE1ldGEgcywgU3RlcERhdGFJbnRlcmZhY2Ugc3RlcERhdGFJbnRlcmZhY2UsIGludCBjLCBUcmFuc01ldGEgdCwgVHJhbnMgZGlzKSB7CisJCXN1cGVyKHMsIHN0ZXBEYXRhSW50ZXJmYWNlLCBjLCB0LCBkaXMpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIGR1cmluZyB0cmFuc2Zvcm1hdGlvbiBzdGFydHVwLiAKKwkgKiAKKwkgKiBJdCBzaG91bGQgaW5pdGlhbGl6ZSByZXF1aXJlZCBmb3Igc3RlcCBleGVjdXRpb24uIAorCSAqIAorCSAqIFRoZSBtZXRhIGFuZCBkYXRhIGltcGxlbWVudGF0aW9ucyBwYXNzZWQgaW4gY2FuIHNhZmVseSBiZSBjYXN0CisJICogdG8gdGhlIHN0ZXAncyByZXNwZWN0aXZlIGltcGxlbWVudGF0aW9ucy4gCisJICogCisJICogSXQgaXMgbWFuZGF0b3J5IHRoYXQgc3VwZXIuaW5pdCgpIGlzIGNhbGxlZCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvci4KKwkgKiAKKwkgKiBUeXBpY2FsIHRhc2tzIGV4ZWN1dGVkIGhlcmUgYXJlIGVzdGFibGlzaGluZyB0aGUgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlLAorCSAqIGFzIHdhbGwgYXMgb2J0YWluaW5nIHJlc291cmNlcywgbGlrZSBmaWxlIGhhbmRsZXMuCisJICogCisJICogQHBhcmFtIHNtaSAJc3RlcCBtZXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgY29udGFpbmluZyB0aGUgc3RlcCBzZXR0aW5ncworCSAqIEBwYXJhbSBzZGkJc3RlcCBkYXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgdXNlZCB0byBzdG9yZSBydW50aW1lIGluZm9ybWF0aW9uCisJICogCisJICogQHJldHVybiB0cnVlIGlmIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBwcmV2ZW50aW5nIHRoZSBzdGVwIGZyb20gd29ya2luZy4gCisJICogIAorCSAqLworCXB1YmxpYyBib29sZWFuIGluaXQoU3RlcE1ldGFJbnRlcmZhY2Ugc21pLCBTdGVwRGF0YUludGVyZmFjZSBzZGkpIHsKKwkJLy8gQ2FzdGluZyB0byBzdGVwLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgaXMgc2FmZQorCQlGaWxlbWdyRGVsZXRlU3RlcE1ldGEgbWV0YSA9IChGaWxlbWdyRGVsZXRlU3RlcE1ldGEpIHNtaTsKKwkJRmlsZW1nckRlbGV0ZVN0ZXBEYXRhIGRhdGEgPSAoRmlsZW1nckRlbGV0ZVN0ZXBEYXRhKSBzZGk7CisKKworICAgICAgICAgICAgbG9nRGV0YWlsZWQoImxvYWRpbmcgaW5nZXN0ZXIiKTsKKyAgICAgICAgICAgIG9vZHQubG9hZFhNTFJwY0NsaWVudChtZXRhLmdldFNlcnZlclVSTEZpZWxkKCkpOworICAgICAgICAgICAgbG9nRGV0YWlsZWQoImZpbmlzaGVkIGxvYWRpbmcgaW5nZXN0ZXIiKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmluaXQobWV0YSwgZGF0YSk7CisJfQorCisJLyoqCisJICogT25jZSB0aGUgdHJhbnNmb3JtYXRpb24gc3RhcnRzIGV4ZWN1dGluZywgdGhlIHByb2Nlc3NSb3coKSBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkKKwkgKiBieSBQREkgZm9yIGFzIGxvbmcgYXMgaXQgcmV0dXJucyB0cnVlLiBUbyBpbmRpY2F0ZSB0aGF0IGEgc3RlcCBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZyByb3dzCisJICogdGhpcyBtZXRob2QgbXVzdCBjYWxsIHNldE91dHB1dERvbmUoKSBhbmQgcmV0dXJuIGZhbHNlOworCSAqCisJICogU3RlcHMgd2hpY2ggcHJvY2VzcyBpbmNvbWluZyByb3dzIHR5cGljYWxseSBjYWxsIGdldFJvdygpIHRvIHJlYWQgYSBzaW5nbGUgcm93IGZyb20gdGhlCisJICogaW5wdXQgc3RyZWFtLCBjaGFuZ2Ugb3IgYWRkIHJvdyBjb250ZW50LCBjYWxsIHB1dFJvdygpIHRvIHBhc3MgdGhlIGNoYW5nZWQgcm93IG9uCisJICogYW5kIHJldHVybiB0cnVlLiBJZiBnZXRSb3coKSByZXR1cm5zIG51bGwsIG5vIG1vcmUgcm93cyBhcmUgZXhwZWN0ZWQgdG8gY29tZSBpbiwKKwkgKiBhbmQgdGhlIHByb2Nlc3NSb3coKSBpbXBsZW1lbnRhdGlvbiBjYWxscyBzZXRPdXRwdXREb25lKCkgYW5kIHJldHVybnMgZmFsc2UgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IGl0IGlzIGRvbmUgdG9vLgorCSAqCisJICogU3RlcHMgd2hpY2ggZ2VuZXJhdGUgcm93cyB0eXBpY2FsbHkgY29uc3RydWN0IGEgbmV3IHJvdyBPYmplY3RbXSB1c2luZyBhIGNhbGwgdG8KKwkgKiBSb3dEYXRhVXRpbC5hbGxvY2F0ZVJvd0RhdGEobnVtYmVyT2ZGaWVsZHMpLCBhZGQgcm93IGNvbnRlbnQsIGFuZCBjYWxsIHB1dFJvdygpIHRvCisJICogcGFzcyB0aGUgbmV3IHJvdyBvbi4gQWJvdmUgcHJvY2VzcyBtYXkgaGFwcGVuIGluIGEgbG9vcCB0byBnZW5lcmF0ZSBtdWx0aXBsZSByb3dzLAorCSAqIGF0IHRoZSBlbmQgb2Ygd2hpY2ggcHJvY2Vzc1JvdygpIHdvdWxkIGNhbGwgc2V0T3V0cHV0RG9uZSgpIGFuZCByZXR1cm4gZmFsc2U7CisJICoKKwkgKiBAcGFyYW0gc21pIHRoZSBzdGVwIG1ldGEgaW50ZXJmYWNlIGNvbnRhaW5pbmcgdGhlIHN0ZXAgc2V0dGluZ3MKKwkgKiBAcGFyYW0gc2RpIHRoZSBzdGVwIGRhdGEgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gc3RvcmUKKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFnYWluLCBmYWxzZSBpZiB0aGUgc3RlcCBpcyBkb25lCisJICovCisJcHVibGljIGJvb2xlYW4gcHJvY2Vzc1JvdyhTdGVwTWV0YUludGVyZmFjZSBzbWksIFN0ZXBEYXRhSW50ZXJmYWNlIHNkaSkgdGhyb3dzIEtldHRsZUV4Y2VwdGlvbiB7CisKKwkJLy8gc2FmZWx5IGNhc3QgdGhlIHN0ZXAgc2V0dGluZ3MgKG1ldGEpIGFuZCBydW50aW1lIGluZm8gKGRhdGEpIHRvIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucworCQlGaWxlbWdyRGVsZXRlU3RlcE1ldGEgbWV0YSA9IChGaWxlbWdyRGVsZXRlU3RlcE1ldGEpIHNtaTsKKwkJRmlsZW1nckRlbGV0ZVN0ZXBEYXRhIGRhdGEgPSAoRmlsZW1nckRlbGV0ZVN0ZXBEYXRhKSBzZGk7CisKKwkJLy8gZ2V0IGluY29taW5nIHJvdywgZ2V0Um93KCkgcG90ZW50aWFsbHkgYmxvY2tzIHdhaXRpbmcgZm9yIG1vcmUgcm93cywgcmV0dXJucyBudWxsIGlmIG5vIG1vcmUgcm93cyBleHBlY3RlZAorCQlPYmplY3RbXSByID0gZ2V0Um93KCk7CisKKwkJLy8gaWYgbm8gbW9yZSByb3dzIGFyZSBleHBlY3RlZCwgaW5kaWNhdGUgc3RlcCBpcyBmaW5pc2hlZCBhbmQgcHJvY2Vzc1JvdygpIHNob3VsZCBub3QgYmUgY2FsbGVkIGFnYWluCisJCWlmIChyID09IG51bGwpeworCQkJc2V0T3V0cHV0RG9uZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gdGhlICJmaXJzdCIgZmxhZyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBzdGVwIGltcGxlbWVudGF0aW9uCisJCS8vIGl0IGlzIHVzZWQgdG8gZ3VhcmQgc29tZSBwcm9jZXNzaW5nIHRhc2tzLCBsaWtlIGZpZ3VyaW5nIG91dCBmaWVsZCBpbmRleGVzCisJCS8vIGluIHRoZSByb3cgc3RydWN0dXJlIHRoYXQgb25seSBuZWVkIHRvIGJlIGRvbmUgb25jZQorCQlpZiAoZmlyc3QpIHsKKwkJCWZpcnN0ID0gZmFsc2U7CisJCQkvLyBjbG9uZSB0aGUgaW5wdXQgcm93IHN0cnVjdHVyZSBhbmQgcGxhY2UgaXQgaW4gb3VyIGRhdGEgb2JqZWN0CisJCQlkYXRhLm91dHB1dFJvd01ldGEgPSAoUm93TWV0YUludGVyZmFjZSkgZ2V0SW5wdXRSb3dNZXRhKCkuY2xvbmUoKTsKKwkJCS8vIHVzZSBtZXRhLmdldEZpZWxkcygpIHRvIGNoYW5nZSBpdCwgc28gaXQgcmVmbGVjdHMgdGhlIG91dHB1dCByb3cgc3RydWN0dXJlCisJCQltZXRhLmdldEZpZWxkcyhkYXRhLm91dHB1dFJvd01ldGEsIGdldFN0ZXBuYW1lKCksIG51bGwsIG51bGwsIHRoaXMsIG51bGwsIG51bGwpOworCQl9CisKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBnZXRJbnB1dFJvd01ldGEoKS5nZXRGaWVsZE5hbWVzKCk7CisgICAgICAgIGludCBpZHggPSBBcnJheXMuYXNMaXN0KG5hbWVzKS5pbmRleE9mKG1ldGEuZ2V0RmlsZW5hbWVGaWVsZCgpKTsKKworICAgICAgICBib29sZWFuIHdvcmtlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nRGV0YWlsZWQoIkRlbGV0aW5nIFByb2R1Y3Q6ICIrKFN0cmluZylyW2lkeF0pOworICAgICAgICAgICAgd29ya2VkID0gb29kdHByb2MuZGVsZXRlUHJvZHVjdEJ5TmFtZShvb2R0LCAoU3RyaW5nKXJbaWR4XSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2FmZWx5IGFkZCB0aGUgc3RyaW5nICJIZWxsbyBXb3JsZCEiIGF0IHRoZSBlbmQgb2YgdGhlIG91dHB1dCByb3cKKwkJLy8gdGhlIHJvdyBhcnJheSB3aWxsIGJlIHJlc2l6ZWQgaWYgbmVjZXNzYXJ5CisJCU9iamVjdFtdIG91dHB1dFJvdyA9IFJvd0RhdGFVdGlsLmFkZFZhbHVlRGF0YShyLCBkYXRhLm91dHB1dFJvd01ldGEuc2l6ZSgpIC0gMSwgd29ya2VkKTsKKworCQkvLyBwdXQgdGhlIHJvdyB0byB0aGUgb3V0cHV0IHJvdyBzdHJlYW0KKwkJcHV0Um93KGRhdGEub3V0cHV0Um93TWV0YSwgb3V0cHV0Um93KTsKKworCQkvLyBsb2cgcHJvZ3Jlc3MgaWYgaXQgaXMgdGltZSB0byB0byBzbworCQlpZiAoY2hlY2tGZWVkYmFjayhnZXRMaW5lc1JlYWQoKSkpIHsKKwkJCWxvZ0Jhc2ljKCJMaW5lbnIgIiArIGdldExpbmVzUmVhZCgpKTsgLy8gU29tZSBiYXNpYyBsb2dnaW5nCisJCX0KKworCQkvLyBpbmRpY2F0ZSB0aGF0IHByb2Nlc3NSb3coKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQREkgb25jZSB0aGUgc3RlcCBpcyBkb25lIHByb2Nlc3NpbmcuCisJICoKKwkgKiBUaGUgZGlzcG9zZSgpIG1ldGhvZCBpcyB0aGUgY291bnRlcnBhcnQgdG8gaW5pdCgpIGFuZCBzaG91bGQgcmVsZWFzZSBhbnkgcmVzb3VyY2VzCisJICogYWNxdWlyZWQgZm9yIHN0ZXAgZXhlY3V0aW9uIGxpa2UgZmlsZSBoYW5kbGVzIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLgorCSAqCisJICogVGhlIG1ldGEgYW5kIGRhdGEgaW1wbGVtZW50YXRpb25zIHBhc3NlZCBpbiBjYW4gc2FmZWx5IGJlIGNhc3QKKwkgKiB0byB0aGUgc3RlcCdzIHJlc3BlY3RpdmUgaW1wbGVtZW50YXRpb25zLgorCSAqCisJICogSXQgaXMgbWFuZGF0b3J5IHRoYXQgc3VwZXIuZGlzcG9zZSgpIGlzIGNhbGxlZCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvci4KKwkgKgorCSAqIEBwYXJhbSBzbWkgCXN0ZXAgbWV0YSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24sIGNvbnRhaW5pbmcgdGhlIHN0ZXAgc2V0dGluZ3MKKwkgKiBAcGFyYW0gc2RpCXN0ZXAgZGF0YSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24sIHVzZWQgdG8gc3RvcmUgcnVudGltZSBpbmZvcm1hdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoU3RlcE1ldGFJbnRlcmZhY2Ugc21pLCBTdGVwRGF0YUludGVyZmFjZSBzZGkpIHsKKworCQkvLyBDYXN0aW5nIHRvIHN0ZXAtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBpcyBzYWZlCisJCUZpbGVtZ3JEZWxldGVTdGVwTWV0YSBtZXRhID0gKEZpbGVtZ3JEZWxldGVTdGVwTWV0YSkgc21pOworCQlGaWxlbWdyRGVsZXRlU3RlcERhdGEgZGF0YSA9IChGaWxlbWdyRGVsZXRlU3RlcERhdGEpIHNkaTsKKwkJCisJCXN1cGVyLmRpc3Bvc2UobWV0YSwgZGF0YSk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL0ZpbGVtZ3JEZWxldGVTdGVwRGF0YS5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9GaWxlbWdyRGVsZXRlU3RlcERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTlkOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9GaWxlbWdyRGVsZXRlU3RlcERhdGEuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyZGVsZXRlOworCitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLkJhc2VTdGVwRGF0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLlN0ZXBEYXRhSW50ZXJmYWNlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgZGVtbyBzdGVwIHBsdWctaW4gaW1wbGVtZW50YXRpb24uCisgKiBJdCBkZW1vbnN0cmF0ZXMgdGhlIGJhc2ljcyBvZiBkZXZlbG9waW5nIGEgcGx1Zy1pbiBzdGVwIGZvciBQREkuIAorICogCisgKiBUaGUgZGVtbyBzdGVwIGFkZHMgYSBuZXcgc3RyaW5nIGZpZWxkIHRvIHRoZSByb3cgc3RyZWFtIGFuZCBzZXRzIGl0cworICogdmFsdWUgdG8gIkhlbGxvIFdvcmxkISIuIFRoZSB1c2VyIG1heSBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIG5ldyBmaWVsZC4KKyAqICAgCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTdGVwRGF0YUludGVyZmFjZS4KKyAqICAgCisgKiBJbXBsZW1lbnRpbmcgY2xhc3NlcyBpbmhlcml0IGZyb20gQmFzZVN0ZXBEYXRhLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBlbnRpcmUKKyAqIGludGVyZmFjZSBjb21wbGV0ZWx5LiAKKyAqIAorICogSW4gYWRkaXRpb24gY2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgdXN1YWxseSBrZWVwIHRyYWNrIG9mCisgKiBwZXItdGhyZWFkIHJlc291cmNlcyBkdXJpbmcgc3RlcCBleGVjdXRpb24uIFR5cGljYWwgZXhhbXBsZXMgYXJlOgorICogcmVzdWx0IHNldHMsIHRlbXBvcmFyeSBkYXRhLCBjYWNoaW5nIGluZGV4ZXMsIGV0Yy4KKyAqICAgCisgKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBkZW1vIHN0ZXAgc3RvcmVzIHRoZSBvdXRwdXQgcm93IHN0cnVjdHVyZSBpbiAKKyAqIHRoZSBkYXRhIGNsYXNzLiAKKyAqICAgCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlbWdyRGVsZXRlU3RlcERhdGEgZXh0ZW5kcyBCYXNlU3RlcERhdGEgaW1wbGVtZW50cyBTdGVwRGF0YUludGVyZmFjZSB7CisKKwlwdWJsaWMgUm93TWV0YUludGVyZmFjZSBvdXRwdXRSb3dNZXRhOworCisgICAgcHVibGljIFN0cmluZyBmaWVsZG5hbWU7CisKKyAgICBwdWJsaWMgRmlsZW1nckRlbGV0ZVN0ZXBEYXRhKCkKKwl7CisJCXN1cGVyKCk7CisJfQorfQorCQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9GaWxlbWdyRGVsZXRlU3RlcERpYWxvZy5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9GaWxlbWdyRGVsZXRlU3RlcERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTkwMDgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL0ZpbGVtZ3JEZWxldGVTdGVwRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JkZWxldGU7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLkNvbnN0OworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmkxOG4uQmFzZU1lc3NhZ2VzOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLlRyYW5zTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLkJhc2VTdGVwTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLlN0ZXBEaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudWkudHJhbnMuc3RlcC5CYXNlU3RlcERpYWxvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIGRlbW8gc3RlcCBwbHVnLWluIGltcGxlbWVudGF0aW9uLgorICogSXQgZGVtb25zdHJhdGVzIHRoZSBiYXNpY3Mgb2YgZGV2ZWxvcGluZyBhIHBsdWctaW4gc3RlcCBmb3IgUERJLiAKKyAqIAorICogVGhlIGRlbW8gc3RlcCBhZGRzIGEgbmV3IHN0cmluZyBmaWVsZCB0byB0aGUgcm93IHN0cmVhbSBhbmQgc2V0cyBpdHMKKyAqIHZhbHVlIHRvICJIZWxsbyBXb3JsZCEiLiBUaGUgdXNlciBtYXkgc2VsZWN0IHRoZSBuYW1lIG9mIHRoZSBuZXcgZmllbGQuCisgKiAgIAorICogVGhpcyBjbGFzcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU3RlcERpYWxvZ0ludGVyZmFjZS4KKyAqIENsYXNzZXMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIG5lZWQgdG86CisgKiAKKyAqIC0gYnVpbGQgYW5kIG9wZW4gYSBTV1QgZGlhbG9nIGRpc3BsYXlpbmcgdGhlIHN0ZXAncyBzZXR0aW5ncyAoc3RvcmVkIGluIHRoZSBzdGVwJ3MgbWV0YSBvYmplY3QpCisgKiAtIHdyaXRlIGJhY2sgYW55IGNoYW5nZXMgdGhlIHVzZXIgbWFrZXMgdG8gdGhlIHN0ZXAncyBtZXRhIG9iamVjdAorICogLSByZXBvcnQgd2hldGhlciB0aGUgdXNlciBjaGFuZ2VkIGFueSBzZXR0aW5ncyB3aGVuIGNvbmZpcm1pbmcgdGhlIGRpYWxvZyAKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRmlsZW1nckRlbGV0ZVN0ZXBEaWFsb2cgZXh0ZW5kcyBCYXNlU3RlcERpYWxvZyBpbXBsZW1lbnRzIFN0ZXBEaWFsb2dJbnRlcmZhY2UgeworCisJLyoqCisJICoJVGhlIFBLRyBtZW1iZXIgaXMgdXNlZCB3aGVuIGxvb2tpbmcgdXAgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KKwkgKglUaGUgcHJvcGVydGllcyBmaWxlIHdpdGggbG9jYWxpemVkIGtleXMgaXMgZXhwZWN0ZWQgdG8gcmVzaWRlIGluIAorCSAqCXt0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkfS9tZXNzYWdlcy9tZXNzYWdlc197bG9jYWxlfS5wcm9wZXJ0aWVzICAgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gUEtHID0gRmlsZW1nckRlbGV0ZVN0ZXBNZXRhLmNsYXNzOyAvLyBmb3IgaTE4biBwdXJwb3NlcworCisJLy8gdGhpcyBpcyB0aGUgb2JqZWN0IHRoZSBzdG9yZXMgdGhlIHN0ZXAncyBzZXR0aW5ncworCS8vIHRoZSBkaWFsb2cgcmVhZHMgdGhlIHNldHRpbmdzIGZyb20gaXQgd2hlbiBvcGVuaW5nCisJLy8gdGhlIGRpYWxvZyB3cml0ZXMgdGhlIHNldHRpbmdzIHRvIGl0IHdoZW4gY29uZmlybWVkIAorCXByaXZhdGUgRmlsZW1nckRlbGV0ZVN0ZXBNZXRhIG1ldGE7CisKKwkvLyB0ZXh0IGZpZWxkIGhvbGRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGFkZCB0byB0aGUgcm93IHN0cmVhbQorCS8vcHJpdmF0ZSBUZXh0IHdIZWxsb0ZpZWxkTmFtZTsKKworICAgIC8vIHRleHQgZmllbGQgaG9sZGluZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gY2hlY2sgdGhlIGZpbGVuYW1lIGFnYWluc3QKKyAgICBwcml2YXRlIFRleHQgd0ZpbGVuYW1lRmllbGQ7CisgICAgcHJpdmF0ZSBUZXh0IHdTZXJ2ZXJVUkxGaWVsZDsKKyAgICBwcml2YXRlIFRleHQgd1Jlc3VsdEZpZWxkOworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgc2ltcGx5IGludm9rZSBzdXBlcigpIGFuZCBzYXZlIHRoZSBpbmNvbWluZyBtZXRhCisJICogb2JqZWN0IHRvIGEgbG9jYWwgdmFyaWFibGUsIHNvIGl0IGNhbiBjb252ZW5pZW50bHkgcmVhZCBhbmQgd3JpdGUgc2V0dGluZ3MKKwkgKiBmcm9tL3RvIGl0LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgCXRoZSBTV1Qgc2hlbGwgdG8gb3BlbiB0aGUgZGlhbG9nIGluCisJICogQHBhcmFtIGluCQl0aGUgbWV0YSBvYmplY3QgaG9sZGluZyB0aGUgc3RlcCdzIHNldHRpbmdzCisJICogQHBhcmFtIHRyYW5zTWV0YQl0cmFuc2Zvcm1hdGlvbiBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBzbmFtZQkJdGhlIHN0ZXAgbmFtZQorCSAqLworCXB1YmxpYyBGaWxlbWdyRGVsZXRlU3RlcERpYWxvZyhTaGVsbCBwYXJlbnQsIE9iamVjdCBpbiwgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RyaW5nIHNuYW1lKSB7CisJCXN1cGVyKHBhcmVudCwgKEJhc2VTdGVwTWV0YSkgaW4sIHRyYW5zTWV0YSwgc25hbWUpOworCQltZXRhID0gKEZpbGVtZ3JEZWxldGVTdGVwTWV0YSkgaW47CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFNwb29uIHdoZW4gdGhlIHVzZXIgb3BlbnMgdGhlIHNldHRpbmdzIGRpYWxvZyBvZiB0aGUgc3RlcC4KKwkgKiBJdCBzaG91bGQgb3BlbiB0aGUgZGlhbG9nIGFuZCByZXR1cm4gb25seSBvbmNlIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSB1c2VyLgorCSAqIAorCSAqIElmIHRoZSB1c2VyIGNvbmZpcm1zIHRoZSBkaWFsb2csIHRoZSBtZXRhIG9iamVjdCAocGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvcikgbXVzdAorCSAqIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHN0ZXAgc2V0dGluZ3MuIFRoZSBjaGFuZ2VkIGZsYWcgb2YgdGhlIG1ldGEgb2JqZWN0IG11c3QgCisJICogcmVmbGVjdCB3aGV0aGVyIHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24gd2FzIGNoYW5nZWQgYnkgdGhlIGRpYWxvZy4KKwkgKiAKKwkgKiBJZiB0aGUgdXNlciBjYW5jZWxzIHRoZSBkaWFsb2csIHRoZSBtZXRhIG9iamVjdCBtdXN0IG5vdCBiZSB1cGRhdGVkLCBhbmQgaXRzIGNoYW5nZWQgZmxhZworCSAqIG11c3QgcmVtYWluIHVuYWx0ZXJlZC4KKwkgKiAKKwkgKiBUaGUgb3BlbigpIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RlcCBhZnRlciB0aGUgdXNlciBoYXMgY29uZmlybWVkIHRoZSBkaWFsb2csCisJICogb3IgbnVsbCBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG9wZW4oKSB7CisKKwkJLy8gc3RvcmUgc29tZSBjb252ZW5pZW50IFNXVCB2YXJpYWJsZXMgCisJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOworCisJCS8vIFNXVCBjb2RlIGZvciBwcmVwYXJpbmcgdGhlIGRpYWxvZworCQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuTUlOIHwgU1dULk1BWCk7CisJCXByb3BzLnNldExvb2soc2hlbGwpOworCQlzZXRTaGVsbEltYWdlKHNoZWxsLCBtZXRhKTsKKwkJCisJCS8vIFNhdmUgdGhlIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIGZsYWcgb24gdGhlIG1ldGEgb2JqZWN0LiBJZiB0aGUgdXNlciBjYW5jZWxzCisJCS8vIHRoZSBkaWFsb2csIGl0IHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhpcyBzYXZlZCB2YWx1ZS4KKwkJLy8gVGhlICJjaGFuZ2VkIiB2YXJpYWJsZSBpcyBpbmhlcml0ZWQgZnJvbSBCYXNlU3RlcERpYWxvZworCQljaGFuZ2VkID0gbWV0YS5oYXNDaGFuZ2VkKCk7CisJCQorCQkvLyBUaGUgTW9kaWZ5TGlzdGVuZXIgdXNlZCBvbiBhbGwgY29udHJvbHMuIEl0IHdpbGwgdXBkYXRlIHRoZSBtZXRhIG9iamVjdCB0byAKKwkJLy8gaW5kaWNhdGUgdGhhdCBjaGFuZ2VzIGFyZSBiZWluZyBtYWRlLgorCQlNb2RpZnlMaXN0ZW5lciBsc01vZCA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCW1ldGEuc2V0Q2hhbmdlZCgpOworCQkJfQorCQl9OworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworCQkvLyBTV1QgY29kZSBmb3IgYnVpbGRpbmcgdGhlIGFjdHVhbCBzZXR0aW5ncyBkaWFsb2cgICAgICAgIC8vCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKwkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IENvbnN0LkZPUk1fTUFSR0lOOworCQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IENvbnN0LkZPUk1fTUFSR0lOOworCisJCXNoZWxsLnNldExheW91dChmb3JtTGF5b3V0KTsKKwkJc2hlbGwuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkRlbW8uU2hlbGwuVGl0bGUiKSk7IAorCisJCWludCBtaWRkbGUgPSBwcm9wcy5nZXRNaWRkbGVQY3QoKTsKKwkJaW50IG1hcmdpbiA9IENvbnN0Lk1BUkdJTjsKKworCQkvLyBTdGVwbmFtZSBsaW5lCisJCXdsU3RlcG5hbWUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5SSUdIVCk7CisJCXdsU3RlcG5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIlN5c3RlbS5MYWJlbC5TdGVwTmFtZSIpKTsgCisJCXByb3BzLnNldExvb2sod2xTdGVwbmFtZSk7CisJCWZkbFN0ZXBuYW1lID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkbFN0ZXBuYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkbFN0ZXBuYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisJCWZkbFN0ZXBuYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBtYXJnaW4pOworCQl3bFN0ZXBuYW1lLnNldExheW91dERhdGEoZmRsU3RlcG5hbWUpOworCQkKKwkJd1N0ZXBuYW1lID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworCQl3U3RlcG5hbWUuc2V0VGV4dChzdGVwbmFtZSk7CisJCXByb3BzLnNldExvb2sod1N0ZXBuYW1lKTsKKwkJd1N0ZXBuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKwkJZmRTdGVwbmFtZSA9IG5ldyBGb3JtRGF0YSgpOworCQlmZFN0ZXBuYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAwKTsKKwkJZmRTdGVwbmFtZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgbWFyZ2luKTsKKwkJZmRTdGVwbmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQl3U3RlcG5hbWUuc2V0TGF5b3V0RGF0YShmZFN0ZXBuYW1lKTsKKworCQkvLyBvdXRwdXQgZmllbGQgdmFsdWUKKwkJTGFiZWwgd2xWYWxOYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworCQl3bFZhbE5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JEZWxldGUuRmllbGROYW1lLkxhYmVsIikpOworCQlwcm9wcy5zZXRMb29rKHdsVmFsTmFtZSk7CisJCUZvcm1EYXRhIGZkbFZhbE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRsVmFsTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZGxWYWxOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisJCWZkbFZhbE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTdGVwbmFtZSwgbWFyZ2luKTsKKwkJd2xWYWxOYW1lLnNldExheW91dERhdGEoZmRsVmFsTmFtZSk7CisKKwkJd0ZpbGVuYW1lRmllbGQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisJCXByb3BzLnNldExvb2sod0ZpbGVuYW1lRmllbGQpOworCQl3RmlsZW5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihsc01vZCk7CisJCUZvcm1EYXRhIGZkVmFsTmFtZSA9IG5ldyBGb3JtRGF0YSgpOworCQlmZFZhbE5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworCQlmZFZhbE5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJZmRWYWxOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3U3RlcG5hbWUsIG1hcmdpbik7CisJCXdGaWxlbmFtZUZpZWxkLnNldExheW91dERhdGEoZmRWYWxOYW1lKTsKKworCisgICAgICAgIC8vIHNlcnZlcm5hbWUgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xTZXJ2ZXJOYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFNlcnZlck5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JEZWxldGUuU2VydmVyVVJMLkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsU2VydmVyTmFtZSk7CisgICAgICAgIEZvcm1EYXRhIGZkbFNlcnZlck5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKyAgICAgICAgZmRsU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxTZXJ2ZXJOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisgICAgICAgIGZkbFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdGaWxlbmFtZUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3bFNlcnZlck5hbWUuc2V0TGF5b3V0RGF0YShmZGxTZXJ2ZXJOYW1lKTsKKworICAgICAgICB3U2VydmVyVVJMRmllbGQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisgICAgICAgIHByb3BzLnNldExvb2sod1NlcnZlclVSTEZpZWxkKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKyAgICAgICAgRm9ybURhdGEgZmRTZXJ2ZXJOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisgICAgICAgIGZkU2VydmVyTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworICAgICAgICBmZFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdGaWxlbmFtZUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3U2VydmVyVVJMRmllbGQuc2V0TGF5b3V0RGF0YShmZFNlcnZlck5hbWUpOworCisgICAgICAgIC8vIHNlcnZlcm5hbWUgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xSZXN1bHROYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFJlc3VsdE5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JEZWxldGUuUmVzdWx0LkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsUmVzdWx0TmFtZSk7CisgICAgICAgIEZvcm1EYXRhIGZkbFJlc3VsdE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKyAgICAgICAgZmRsUmVzdWx0TmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxSZXN1bHROYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisgICAgICAgIGZkbFJlc3VsdE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTZXJ2ZXJVUkxGaWVsZCwgbWFyZ2luKTsKKyAgICAgICAgd2xSZXN1bHROYW1lLnNldExheW91dERhdGEoZmRsUmVzdWx0TmFtZSk7CisKKyAgICAgICAgd1Jlc3VsdEZpZWxkID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdSZXN1bHRGaWVsZCk7CisgICAgICAgIHdSZXN1bHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihsc01vZCk7CisgICAgICAgIEZvcm1EYXRhIGZkUmVzdWx0TmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZFJlc3VsdE5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworICAgICAgICBmZFJlc3VsdE5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKyAgICAgICAgZmRSZXN1bHROYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3U2VydmVyVVJMRmllbGQsIG1hcmdpbik7CisgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkUmVzdWx0TmFtZSk7CisKKworICAgICAgICAvLyBPSyBhbmQgY2FuY2VsIGJ1dHRvbnMKKwkJd09LID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOworCQl3T0suc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIlN5c3RlbS5CdXR0b24uT0siKSk7IAorCQl3Q2FuY2VsID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOworCQl3Q2FuY2VsLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJTeXN0ZW0uQnV0dG9uLkNhbmNlbCIpKTsgCisKKwkJQmFzZVN0ZXBEaWFsb2cucG9zaXRpb25Cb3R0b21CdXR0b25zKHNoZWxsLCBuZXcgQnV0dG9uW10geyB3T0ssIHdDYW5jZWwgfSwgbWFyZ2luLCB3UmVzdWx0RmllbGQpOworCisJCS8vIEFkZCBsaXN0ZW5lcnMgZm9yIGNhbmNlbCBhbmQgT0sKKwkJbHNDYW5jZWwgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Y2FuY2VsKCk7fQorCQl9OworCQlsc09LID0gbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkge29rKCk7fQorCQl9OworCisJCXdDYW5jZWwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbHNDYW5jZWwpOworCQl3T0suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbHNPSyk7CisKKwkJLy8gZGVmYXVsdCBsaXN0ZW5lciAoZm9yIGhpdHRpbmcgImVudGVyIikKKwkJbHNEZWYgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7b2soKTt9CisJCX07CisJCXdTdGVwbmFtZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsc0RlZik7CisJCXdGaWxlbmFtZUZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKwkJLy8gRGV0ZWN0IFggb3IgQUxULUY0IG9yIHNvbWV0aGluZyB0aGF0IGtpbGxzIHRoaXMgd2luZG93IGFuZCBjYW5jZWwgdGhlIGRpYWxvZyBwcm9wZXJseQorCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHtjYW5jZWwoKTt9CisJCX0pOworCQkKKwkJLy8gU2V0L1Jlc3RvcmUgdGhlIGRpYWxvZyBzaXplIGJhc2VkIG9uIGxhc3QgcG9zaXRpb24gb24gc2NyZWVuCisJCS8vIFRoZSBzZXRTaXplKCkgbWV0aG9kIGlzIGluaGVyaXRlZCBmcm9tIEJhc2VTdGVwRGlhbG9nCisJCXNldFNpemUoKTsKKworCQkvLyBwb3B1bGF0ZSB0aGUgZGlhbG9nIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBtZXRhIG9iamVjdAorCQlwb3B1bGF0ZURpYWxvZygpOworCQkKKwkJLy8gcmVzdG9yZSB0aGUgY2hhbmdlZCBmbGFnIHRvIG9yaWdpbmFsIHZhbHVlLCBhcyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBmaXJlIGR1cmluZyBkaWFsb2cgcG9wdWxhdGlvbiAKKwkJbWV0YS5zZXRDaGFuZ2VkKGNoYW5nZWQpOworCisJCS8vIG9wZW4gZGlhbG9nIGFuZCBlbnRlciBldmVudCBsb29wIAorCQlzaGVsbC5vcGVuKCk7CisJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7CisJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCisJCQkJZGlzcGxheS5zbGVlcCgpOworCQl9CisKKwkJLy8gYXQgdGhpcyBwb2ludCB0aGUgZGlhbG9nIGhhcyBjbG9zZWQsIHNvIGVpdGhlciBvaygpIG9yIGNhbmNlbCgpIGhhdmUgYmVlbiBleGVjdXRlZAorCQkvLyBUaGUgInN0ZXBuYW1lIiB2YXJpYWJsZSBpcyBpbmhlcml0ZWQgZnJvbSBCYXNlU3RlcERpYWxvZworCQlyZXR1cm4gc3RlcG5hbWU7CisJfQorCQorCS8qKgorCSAqIFRoaXMgaGVscGVyIG1ldGhvZCBwdXRzIHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIHRoZSBtZXRhIG9iamVjdAorCSAqIGFuZCBwdXRzIGl0IGludG8gdGhlIGRpYWxvZyBjb250cm9scy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVEaWFsb2coKSB7CisJCXdTdGVwbmFtZS5zZWxlY3RBbGwoKTsKKwkJd0ZpbGVuYW1lRmllbGQuc2V0VGV4dChtZXRhLmdldEZpbGVuYW1lRmllbGQoKSk7CisgICAgICAgIHdTZXJ2ZXJVUkxGaWVsZC5zZXRUZXh0KG1ldGEuZ2V0U2VydmVyVVJMRmllbGQoKSk7CisgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRUZXh0KG1ldGEuZ2V0UmVzdWx0RmllbGQoKSk7CisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgZGlhbG9nLiAgCisJICovCisJcHJpdmF0ZSB2b2lkIGNhbmNlbCgpIHsKKwkJLy8gVGhlICJzdGVwbmFtZSIgdmFyaWFibGUgd2lsbCBiZSB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgb3BlbigpIG1ldGhvZC4gCisJCS8vIFNldHRpbmcgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGF0IGRpYWxvZyB3YXMgY2FuY2VsbGVkLgorCQlzdGVwbmFtZSA9IG51bGw7CisJCS8vIFJlc3RvcmluZyBvcmlnaW5hbCAiY2hhbmdlZCIgZmxhZyBvbiB0aGUgbWV0IGFvYmplY3QKKwkJbWV0YS5zZXRDaGFuZ2VkKGNoYW5nZWQpOworCQkvLyBjbG9zZSB0aGUgU1dUIGRpYWxvZyB3aW5kb3cKKwkJZGlzcG9zZSgpOworCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjb25maXJtcyB0aGUgZGlhbG9nCisJICovCisJcHJpdmF0ZSB2b2lkIG9rKCkgeworCQkvLyBUaGUgInN0ZXBuYW1lIiB2YXJpYWJsZSB3aWxsIGJlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBvcGVuKCkgbWV0aG9kLiAKKwkJLy8gU2V0dGluZyB0byBzdGVwIG5hbWUgZnJvbSB0aGUgZGlhbG9nIGNvbnRyb2wKKwkJc3RlcG5hbWUgPSB3U3RlcG5hbWUuZ2V0VGV4dCgpOyAKKwkJLy8gU2V0dGluZyB0aGUgIHNldHRpbmdzIHRvIHRoZSBtZXRhIG9iamVjdAorCQkvL21ldGEuc2V0T3V0cHV0RmllbGQod0ZpbGVuYW1lRmllbGQuZ2V0VGV4dCgpKTsKKyAgICAgICAgbWV0YS5zZXRGaWxlbmFtZUZpZWxkKHdGaWxlbmFtZUZpZWxkLmdldFRleHQoKSk7CisgICAgICAgIG1ldGEuc2V0U2VydmVyVVJMRmllbGQod1NlcnZlclVSTEZpZWxkLmdldFRleHQoKSk7CisgICAgICAgIG1ldGEuc2V0UmVzdWx0RmllbGQod1Jlc3VsdEZpZWxkLmdldFRleHQoKSk7CisJCS8vIGNsb3NlIHRoZSBTV1QgZGlhbG9nIHdpbmRvdworCQlkaXNwb3NlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9GaWxlbWdyRGVsZXRlU3RlcE1ldGEuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvRmlsZW1nckRlbGV0ZVN0ZXBNZXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5NDg0YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvRmlsZW1nckRlbGV0ZVN0ZXBNZXRhLmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JkZWxldGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLkNoZWNrUmVzdWx0OworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuQ2hlY2tSZXN1bHRJbnRlcmZhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5hbm5vdGF0aW9ucy5TdGVwOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZGF0YWJhc2UuRGF0YWJhc2VNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZXhjZXB0aW9uLktldHRsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVTdGVwRXhjZXB0aW9uOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZXhjZXB0aW9uLktldHRsZVZhbHVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZXhjZXB0aW9uLktldHRsZVhNTEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5Sb3dNZXRhSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUucm93LlZhbHVlTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5WYWx1ZU1ldGFJbnRlcmZhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS52YXJpYWJsZXMuVmFyaWFibGVTcGFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnhtbC5YTUxIYW5kbGVyOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmkxOG4uQmFzZU1lc3NhZ2VzOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnJlcG9zaXRvcnkuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkucmVwb3NpdG9yeS5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLlRyYW5zOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLlRyYW5zTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLio7CitpbXBvcnQgb3JnLnBlbnRhaG8ubWV0YXN0b3JlLmFwaS5JTWV0YVN0b3JlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIGRlbW8gc3RlcCBwbHVnLWluIGltcGxlbWVudGF0aW9uLgorICogSXQgZGVtb25zdHJhdGVzIHRoZSBiYXNpY3Mgb2YgZGV2ZWxvcGluZyBhIHBsdWctaW4gc3RlcCBmb3IgUERJLiAKKyAqIAorICogVGhlIGRlbW8gc3RlcCBhZGRzIGEgbmV3IHN0cmluZyBmaWVsZCB0byB0aGUgcm93IHN0cmVhbSBhbmQgc2V0cyBpdHMKKyAqIHZhbHVlIHRvICJIZWxsbyBXb3JsZCEiLiBUaGUgdXNlciBtYXkgc2VsZWN0IHRoZSBuYW1lIG9mIHRoZSBuZXcgZmllbGQuCisgKiAgIAorICogVGhpcyBjbGFzcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU3RlcE1ldGFJbnRlcmZhY2UuCisgKiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBuZWVkIHRvOgorICogCisgKiAtIGtlZXAgdHJhY2sgb2YgdGhlIHN0ZXAgc2V0dGluZ3MKKyAqIC0gc2VyaWFsaXplIHN0ZXAgc2V0dGluZ3MgYm90aCB0byB4bWwgYW5kIGEgcmVwb3NpdG9yeQorICogLSBwcm92aWRlIG5ldyBpbnN0YW5jZXMgb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgU3RlcERpYWxvZ0ludGVyZmFjZSwgU3RlcEludGVyZmFjZSBhbmQgU3RlcERhdGFJbnRlcmZhY2UKKyAqIC0gcmVwb3J0IG9uIGhvdyB0aGUgc3RlcCBtb2RpZmllcyB0aGUgbWV0YS1kYXRhIG9mIHRoZSByb3ctc3RyZWFtIChyb3cgc3RydWN0dXJlIGFuZCBmaWVsZCB0eXBlcykKKyAqIC0gcGVyZm9ybSBhIHNhbml0eS1jaGVjayBvbiB0aGUgc2V0dGluZ3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIgCisgKiAKKyAqLworCitAU3RlcCgJCisJCWlkID0gIkZpbGVtZ3JDaGVjayIsCisJCWltYWdlID0gIm9yZy9hcGFjaGUvb29kdC9maWxlbWdyY2hlY2svcmVzb3VyY2VzL2NoZWNrL29vZHQuanBnIiwKKwkJaTE4blBhY2thZ2VOYW1lPSJiaS5tZXRlb3JpdGUuZmlsZW1ncmNoZWNrIiwKKwkJbmFtZT0iRmlsZW1nckNoZWNrU3RlcC5OYW1lIiwKKwkJZGVzY3JpcHRpb24gPSAiRmlsZW1nckNoZWNrU3RlcC5Ub29sdGlwRGVzYyIsCisJCWNhdGVnb3J5RGVzY3JpcHRpb249ImkxOG46b3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcDpCYXNlU3RlcC5DYXRlZ29yeS5UcmFuc2Zvcm0iCispCitwdWJsaWMgY2xhc3MgRmlsZW1nckRlbGV0ZVN0ZXBNZXRhIGV4dGVuZHMgQmFzZVN0ZXBNZXRhIGltcGxlbWVudHMgU3RlcE1ldGFJbnRlcmZhY2UgeworCisJLyoqCisJICoJVGhlIFBLRyBtZW1iZXIgaXMgdXNlZCB3aGVuIGxvb2tpbmcgdXAgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KKwkgKglUaGUgcHJvcGVydGllcyBmaWxlIHdpdGggbG9jYWxpemVkIGtleXMgaXMgZXhwZWN0ZWQgdG8gcmVzaWRlIGluIAorCSAqCXt0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkfS9tZXNzYWdlcy9tZXNzYWdlc197bG9jYWxlfS5wcm9wZXJ0aWVzICAgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gUEtHID0gRmlsZW1nckRlbGV0ZVN0ZXBNZXRhLmNsYXNzOyAvLyBmb3IgaTE4biBwdXJwb3NlcworCQorCS8qKgorCSAqIFN0b3JlcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWRkZWQgdG8gdGhlIHJvdy1zdHJlYW0uIAorCSAqLworCXByaXZhdGUgU3RyaW5nIG91dHB1dEZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyVVJMRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0RmllbGQ7CisKKyAgICAvKioKKwkgKiBDb25zdHJ1Y3RvciBzaG91bGQgY2FsbCBzdXBlcigpIHRvIG1ha2Ugc3VyZSB0aGUgYmFzZSBjbGFzcyBoYXMgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBwcm9wZXJseS4KKwkgKi8KKwlwdWJsaWMgRmlsZW1nckRlbGV0ZVN0ZXBNZXRhKCkgeworCQlzdXBlcigpOyAKKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGJ5IFNwb29uIHRvIGdldCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU1dUIGRpYWxvZyBmb3IgdGhlIHN0ZXAuCisJICogQSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBwYXNzaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdGVwIGRpYWxvZyBpcyByZWNvbW1lbmRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gc2hlbGwJCWFuIFNXVCBTaGVsbAorCSAqIEBwYXJhbSBtZXRhIAkJZGVzY3JpcHRpb24gb2YgdGhlIHN0ZXAgCisJICogQHBhcmFtIHRyYW5zTWV0YQlkZXNjcmlwdGlvbiBvZiB0aGUgdGhlIHRyYW5zZm9ybWF0aW9uIAorCSAqIEBwYXJhbSBuYW1lCQl0aGUgbmFtZSBvZiB0aGUgc3RlcAorCSAqIEByZXR1cm4gCQkJbmV3IGluc3RhbmNlIG9mIGEgZGlhbG9nIGZvciB0aGlzIHN0ZXAgCisJICovCisJcHVibGljIFN0ZXBEaWFsb2dJbnRlcmZhY2UgZ2V0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdGVwTWV0YUludGVyZmFjZSBtZXRhLCBUcmFuc01ldGEgdHJhbnNNZXRhLCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmV3IEZpbGVtZ3JEZWxldGVTdGVwRGlhbG9nKHNoZWxsLCBtZXRhLCB0cmFuc01ldGEsIG5hbWUpOworCX0KKworCS8qKgorCSAqIENhbGxlZCBieSBQREkgdG8gZ2V0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzdGVwIGltcGxlbWVudGF0aW9uLiAKKwkgKiBBIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHBhc3NpbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN0ZXAgY2xhc3MgaXMgcmVjb21tZW5kZWQuCisJICogCisJICogQHBhcmFtIHN0ZXBNZXRhCQkJCWRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwCisJICogQHBhcmFtIHN0ZXBEYXRhSW50ZXJmYWNlCQlpbnN0YW5jZSBvZiBhIHN0ZXAgZGF0YSBjbGFzcworCSAqIEBwYXJhbSBjbnIJCQkJCWNvcHkgbnVtYmVyCisJICogQHBhcmFtIHRyYW5zTWV0YQkJCQlkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcGFyYW0gZGlzcAkJCQkJcnVudGltZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcmV0dXJuCQkJCQkJdGhlIG5ldyBpbnN0YW5jZSBvZiBhIHN0ZXAgaW1wbGVtZW50YXRpb24gCisJICovCisJcHVibGljIFN0ZXBJbnRlcmZhY2UgZ2V0U3RlcChTdGVwTWV0YSBzdGVwTWV0YSwgU3RlcERhdGFJbnRlcmZhY2Ugc3RlcERhdGFJbnRlcmZhY2UsIGludCBjbnIsIFRyYW5zTWV0YSB0cmFuc01ldGEsIFRyYW5zIGRpc3ApIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyRGVsZXRlU3RlcChzdGVwTWV0YSwgc3RlcERhdGFJbnRlcmZhY2UsIGNuciwgdHJhbnNNZXRhLCBkaXNwKTsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgYnkgUERJIHRvIGdldCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3RlcCBkYXRhIGNsYXNzLgorCSAqLworCXB1YmxpYyBTdGVwRGF0YUludGVyZmFjZSBnZXRTdGVwRGF0YSgpIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyRGVsZXRlU3RlcERhdGEoKTsKKwl9CQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuZXcgc3RlcCBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYWxsb2NhdGUvc2V0IHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24KKwkgKiB0byBzZW5zaWJsZSBkZWZhdWx0cy4gVGhlIHZhbHVlcyBzZXQgaGVyZSB3aWxsIGJlIHVzZWQgYnkgU3Bvb24gd2hlbiBhIG5ldyBzdGVwIGlzIGNyZWF0ZWQuICAgIAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoKSB7CisJCW91dHB1dEZpZWxkID0gImRlbW9fZmllbGQiOworICAgICAgICBmaWxlbmFtZUZpZWxkID0gImZpZWxkbmFtZSI7CisgICAgICAgIHNlcnZlclVSTEZpZWxkID0gImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCI7CisgICAgICAgIHJlc3VsdEZpZWxkID0gInJlc3VsdCI7CisJfQorCQorCS8qKgorCSAqIEdldHRlciBmb3IgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFkZGVkIGJ5IHRoaXMgc3RlcAorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFkZGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRPdXRwdXRGaWVsZCgpIHsKKwkJcmV0dXJuIG91dHB1dEZpZWxkOworCX0KKworCS8qKgorCSAqIFNldHRlciBmb3IgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFkZGVkIGJ5IHRoaXMgc3RlcAorCSAqIEBwYXJhbSBvdXRwdXRGaWVsZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWRkZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWVsZChTdHJpbmcgb3V0cHV0RmllbGQpIHsKKwkJdGhpcy5vdXRwdXRGaWVsZCA9IG91dHB1dEZpZWxkOworCX0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZUZpZWxkKCl7CisgICAgICAgIHJldHVybiBmaWxlbmFtZUZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lRmllbGQoU3RyaW5nIGZpbGVuYW1lRmllbGQpeworICAgICAgICB0aGlzLmZpbGVuYW1lRmllbGQgPSBmaWxlbmFtZUZpZWxkOworICAgIH0KKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gYSBzdGVwIGlzIGR1cGxpY2F0ZWQgaW4gU3Bvb24uIEl0IG5lZWRzIHRvIHJldHVybiBhIGRlZXAgY29weSBvZiB0aGlzCisJICogc3RlcCBtZXRhIG9iamVjdC4gQmUgc3VyZSB0byBjcmVhdGUgcHJvcGVyIGRlZXAgY29waWVzIGlmIHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24gaXMgc3RvcmVkIGluCisJICogbW9kaWZpYWJsZSBvYmplY3RzLgorCSAqIAorCSAqIFNlZSBvcmcucGVudGFoby5kaS50cmFucy5zdGVwcy5yb3dnZW5lcmF0b3IuUm93R2VuZXJhdG9yTWV0YS5jbG9uZSgpIGZvciBhbiBleGFtcGxlIG9uIGNyZWF0aW5nCisJICogYSBkZWVwIGNvcHkuCisJICogCisJICogQHJldHVybiBhIGRlZXAgY29weSBvZiB0aGlzCisJICovCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IHJldHZhbCA9IHN1cGVyLmNsb25lKCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBTcG9vbiB3aGVuIGEgc3RlcCBuZWVkcyB0byBzZXJpYWxpemUgaXRzIGNvbmZpZ3VyYXRpb24gdG8gWE1MLiBUaGUgZXhwZWN0ZWQKKwkgKiByZXR1cm4gdmFsdWUgaXMgYW4gWE1MIGZyYWdtZW50IGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUgWE1MIHRhZ3MuICAKKwkgKiAKKwkgKiBQbGVhc2UgdXNlIG9yZy5wZW50YWhvLmRpLmNvcmUueG1sLlhNTEhhbmRsZXIgdG8gY29udmVuaWVudGx5IGdlbmVyYXRlIHRoZSBYTUwuCisJICogCisJICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBYTUwgc2VyaWFsaXphdGlvbiBvZiB0aGlzIHN0ZXAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFhNTCgpIHRocm93cyBLZXR0bGVWYWx1ZUV4Y2VwdGlvbiB7CisJCQorCQkvLyBvbmx5IG9uZSBmaWVsZCB0byBzZXJpYWxpemUKKwkJU3RyaW5nIHhtbCA9ICAiICI7CisgICAgICAgIHhtbCArPSAiICAgICIgK1hNTEhhbmRsZXIuYWRkVGFnVmFsdWUoIm91dHB1dGZpZWxkIiwgb3V0cHV0RmllbGQpOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJmaWxlbmFtZWZpZWxkIiwgZmlsZW5hbWVGaWVsZCk7CisgICAgICAgIHhtbCArPSAiICAgICIgK1hNTEhhbmRsZXIuYWRkVGFnVmFsdWUoInNlcnZlcnVybGZpZWxkIiwgc2VydmVyVVJMRmllbGQpOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJyZXN1bHRmaWVsZCIsIHJlc3VsdEZpZWxkKTsKKwkJcmV0dXJuIHhtbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIHdoZW4gYSBzdGVwIG5lZWRzIHRvIGxvYWQgaXRzIGNvbmZpZ3VyYXRpb24gZnJvbSBYTUwuCisJICogCisJICogUGxlYXNlIHVzZSBvcmcucGVudGFoby5kaS5jb3JlLnhtbC5YTUxIYW5kbGVyIHRvIGNvbnZlbmllbnRseSByZWFkIGZyb20gdGhlCisJICogWE1MIG5vZGUgcGFzc2VkIGluLgorCSAqIAorCSAqIEBwYXJhbSBzdGVwbm9kZQl0aGUgWE1MIG5vZGUgY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbgorCSAqIEBwYXJhbSBkYXRhYmFzZXMJdGhlIGRhdGFiYXNlcyBhdmFpbGFibGUgaW4gdGhlIHRyYW5zZm9ybWF0aW9uCisJICogQHBhcmFtIG1ldGFTdG9yZSB0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgbG9hZFhNTChOb2RlIHN0ZXBub2RlLCBMaXN0PERhdGFiYXNlTWV0YT4gZGF0YWJhc2VzLCBJTWV0YVN0b3JlIG1ldGFTdG9yZSkgdGhyb3dzIEtldHRsZVhNTEV4Y2VwdGlvbiB7CisKKwkJdHJ5IHsKKwkJCXNldE91dHB1dEZpZWxkKFhNTEhhbmRsZXIuZ2V0Tm9kZVZhbHVlKFhNTEhhbmRsZXIuZ2V0U3ViTm9kZShzdGVwbm9kZSwgIm91dHB1dGZpZWxkIikpKTsKKyAgICAgICAgICAgIHNldEZpbGVuYW1lRmllbGQoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAiZmlsZW5hbWVmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRTZXJ2ZXJVUkxGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJzZXJ2ZXJ1cmxmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRSZXN1bHRGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJyZXN1bHRmaWVsZCIpKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgS2V0dGxlWE1MRXhjZXB0aW9uKCJEZW1vIHBsdWdpbiB1bmFibGUgdG8gcmVhZCBzdGVwIGluZm8gZnJvbSBYTUwgbm9kZSIsIGUpOworCQl9CisKKwl9CQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBTcG9vbiB3aGVuIGEgc3RlcCBuZWVkcyB0byBzZXJpYWxpemUgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYSByZXBvc2l0b3J5LgorCSAqIFRoZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyB0byBzYXZlIHRoZSBzdGVwIGF0dHJpYnV0ZXMuCisJICoKKwkgKiBAcGFyYW0gcmVwCQkJCQl0aGUgcmVwb3NpdG9yeSB0byBzYXZlIHRvCisJICogQHBhcmFtIG1ldGFTdG9yZQkJCQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgd3JpdGUgdG8KKwkgKiBAcGFyYW0gaWRfdHJhbnNmb3JtYXRpb24JCXRoZSBpZCB0byB1c2UgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiB3aGVuIHNhdmluZworCSAqIEBwYXJhbSBpZF9zdGVwCQkJCXRoZSBpZCB0byB1c2UgZm9yIHRoZSBzdGVwICB3aGVuIHNhdmluZworCSAqLworCXB1YmxpYyB2b2lkIHNhdmVSZXAoUmVwb3NpdG9yeSByZXAsIElNZXRhU3RvcmUgbWV0YVN0b3JlLCBPYmplY3RJZCBpZF90cmFuc2Zvcm1hdGlvbiwgT2JqZWN0SWQgaWRfc3RlcCkgdGhyb3dzIEtldHRsZUV4Y2VwdGlvbgorCXsKKwkJdHJ5eworCQkJcmVwLnNhdmVTdGVwQXR0cmlidXRlKGlkX3RyYW5zZm9ybWF0aW9uLCBpZF9zdGVwLCAib3V0cHV0ZmllbGQiLCBvdXRwdXRGaWVsZCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgS2V0dGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gc2F2ZSBzdGVwIGludG8gcmVwb3NpdG9yeTogIitpZF9zdGVwLCBlKTsgCisJCX0KKwl9CQkKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIHdoZW4gYSBzdGVwIG5lZWRzIHRvIHJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIHJlcG9zaXRvcnkuCisJICogVGhlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBtZXRob2RzIHRvIHJlYWQgdGhlIHN0ZXAgYXR0cmlidXRlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVwCQl0aGUgcmVwb3NpdG9yeSB0byByZWFkIGZyb20KKwkgKiBAcGFyYW0gbWV0YVN0b3JlCXRoZSBtZXRhU3RvcmUgdG8gb3B0aW9uYWxseSByZWFkIGZyb20KKwkgKiBAcGFyYW0gaWRfc3RlcAl0aGUgaWQgb2YgdGhlIHN0ZXAgYmVpbmcgcmVhZAorCSAqIEBwYXJhbSBkYXRhYmFzZXMJdGhlIGRhdGFiYXNlcyBhdmFpbGFibGUgaW4gdGhlIHRyYW5zZm9ybWF0aW9uCisJICovCisJcHVibGljIHZvaWQgcmVhZFJlcChSZXBvc2l0b3J5IHJlcCwgSU1ldGFTdG9yZSBtZXRhU3RvcmUsIE9iamVjdElkIGlkX3N0ZXAsIExpc3Q8RGF0YWJhc2VNZXRhPiBkYXRhYmFzZXMpIHRocm93cyBLZXR0bGVFeGNlcHRpb24gIHsKKwkJdHJ5eworCQkJb3V0cHV0RmllbGQgID0gcmVwLmdldFN0ZXBBdHRyaWJ1dGVTdHJpbmcoaWRfc3RlcCwgIm91dHB1dGZpZWxkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgS2V0dGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBzdGVwIGZyb20gcmVwb3NpdG9yeSIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgY2hhbmdlcyB0aGUgc3RlcCBpcyBtYWtpbmcgdG8gdGhlIHJvdy1zdHJlYW0uCisJICogVG8gdGhhdCBlbmQgYSBSb3dNZXRhSW50ZXJmYWNlIG9iamVjdCBpcyBwYXNzZWQgaW4sIGNvbnRhaW5pbmcgdGhlIHJvdy1zdHJlYW0gc3RydWN0dXJlIGFzIGl0IGlzIHdoZW4gZW50ZXJpbmcKKwkgKiB0aGUgc3RlcC4gVGhpcyBtZXRob2QgbXVzdCBhcHBseSBhbnkgY2hhbmdlcyB0aGUgc3RlcCBtYWtlcyB0byB0aGUgcm93IHN0cmVhbS4gVXN1YWxseSBhIHN0ZXAgYWRkcyBmaWVsZHMgdG8gdGhlCisJICogcm93LXN0cmVhbS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRSb3dNZXRhCQl0aGUgcm93IHN0cnVjdHVyZSBjb21pbmcgaW4gdG8gdGhlIHN0ZXAKKwkgKiBAcGFyYW0gbmFtZSAJCQkJdGhlIG5hbWUgb2YgdGhlIHN0ZXAgbWFraW5nIHRoZSBjaGFuZ2VzCisJICogQHBhcmFtIGluZm8JCQkJcm93IHN0cnVjdHVyZXMgb2YgYW55IGluZm8gc3RlcHMgY29taW5nIGluCisJICogQHBhcmFtIG5leHRTdGVwCQkJdGhlIGRlc2NyaXB0aW9uIG9mIGEgc3RlcCB0aGlzIHN0ZXAgaXMgcGFzc2luZyByb3dzIHRvCisJICogQHBhcmFtIHNwYWNlCQkJCXRoZSB2YXJpYWJsZSBzcGFjZSBmb3IgcmVzb2x2aW5nIHZhcmlhYmxlcworCSAqIEBwYXJhbSByZXBvc2l0b3J5CQl0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZSBvcHRpb25hbGx5IHJlYWQgZnJvbQorCSAqIEBwYXJhbSBtZXRhU3RvcmUJCQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgZ2V0RmllbGRzKFJvd01ldGFJbnRlcmZhY2UgaW5wdXRSb3dNZXRhLCBTdHJpbmcgbmFtZSwgUm93TWV0YUludGVyZmFjZVtdIGluZm8sIFN0ZXBNZXRhIG5leHRTdGVwLCBWYXJpYWJsZVNwYWNlIHNwYWNlLCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIElNZXRhU3RvcmUgbWV0YVN0b3JlKSB0aHJvd3MgS2V0dGxlU3RlcEV4Y2VwdGlvbnsKKworCQkvKgorCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMgdGhlIG91dHB1dEZpZWxkIHRvIHRoZSByb3ctc3RyZWFtCisJCSAqLworCisJCS8vIGEgdmFsdWUgbWV0YSBvYmplY3QgY29udGFpbnMgdGhlIG1ldGEgZGF0YSBmb3IgYSBmaWVsZAorCQlWYWx1ZU1ldGFJbnRlcmZhY2UgdiA9IG5ldyBWYWx1ZU1ldGEob3V0cHV0RmllbGQsIFZhbHVlTWV0YS5UWVBFX1NUUklORyk7CisJCQorCQkvLyBzZXR0aW5nIHRyaW0gdHlwZSB0byAiYm90aCIKKwkJdi5zZXRUcmltVHlwZShWYWx1ZU1ldGEuVFJJTV9UWVBFX0JPVEgpOworCisJCS8vIHRoZSBuYW1lIG9mIHRoZSBzdGVwIHRoYXQgYWRkcyB0aGlzIGZpZWxkCisJCXYuc2V0T3JpZ2luKG5hbWUpOworCQkKKwkJLy8gbW9kaWZ5IHRoZSByb3cgc3RydWN0dXJlIGFuZCBhZGQgdGhlIGZpZWxkIHRoaXMgc3RlcCBnZW5lcmF0ZXMgIAorCQlpbnB1dFJvd01ldGEuYWRkVmFsdWVNZXRhKHYpOworCQkKKwl9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlICJWZXJpZnkgVHJhbnNmb3JtYXRpb24iIG9wdGlvbiBpbiBTcG9vbi4KKyAgICAgKiBBIGxpc3Qgb2YgcmVtYXJrcyBpcyBwYXNzZWQgaW4gdGhhdCB0aGlzIG1ldGhvZCBzaG91bGQgYWRkIHRvLiBFYWNoIHJlbWFyayBpcyBhIGNvbW1lbnQsIHdhcm5pbmcsIGVycm9yLCBvciBvay4KKyAgICAgKiBUaGUgbWV0aG9kIHNob3VsZCBwZXJmb3JtIGFzIG1hbnkgY2hlY2tzIGFzIG5lY2Vzc2FyeSB0byBjYXRjaCBkZXNpZ24tdGltZSBlcnJvcnMuCisgICAgICoKKyAgICAgKiBUeXBpY2FsIGNoZWNrcyBpbmNsdWRlOgorICAgICAqIC0gdmVyaWZ5IHRoYXQgYWxsIG1hbmRhdG9yeSBjb25maWd1cmF0aW9uIGlzIGdpdmVuCisgICAgICogLSB2ZXJpZnkgdGhhdCB0aGUgc3RlcCByZWNlaXZlcyBhbnkgaW5wdXQsIHVubGVzcyBpdCdzIGEgcm93IGdlbmVyYXRpbmcgc3RlcAorICAgICAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0ZXAgZG9lcyBub3QgcmVjZWl2ZSBhbnkgaW5wdXQgaWYgaXQgZG9lcyBub3QgdGFrZSB0aGVtIGludG8gYWNjb3VudAorICAgICAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0ZXAgZmluZHMgZmllbGRzIGl0IHJlbGllcyBvbiBpbiB0aGUgcm93LXN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIHJlbWFya3MKKyAgICAgKiBAcGFyYW0gdHJhbnNNZXRhCisgICAgICogQHBhcmFtIHN0ZXBNZXRhCisgICAgICogQHBhcmFtIHByZXYKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogQHBhcmFtIGluZm8KKyAgICAgKiBAcGFyYW0gc3BhY2UKKyAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeQorICAgICAqIEBwYXJhbSBtZXRhU3RvcmUKKyAgICAgKi8KKwlwdWJsaWMgdm9pZCBjaGVjayhMaXN0PENoZWNrUmVzdWx0SW50ZXJmYWNlPiByZW1hcmtzLCBUcmFuc01ldGEgdHJhbnNNZXRhLCBTdGVwTWV0YSBzdGVwTWV0YSwgUm93TWV0YUludGVyZmFjZSBwcmV2LCBTdHJpbmcgaW5wdXRbXSwgU3RyaW5nIG91dHB1dFtdLCBSb3dNZXRhSW50ZXJmYWNlIGluZm8sIFZhcmlhYmxlU3BhY2Ugc3BhY2UsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgSU1ldGFTdG9yZSBtZXRhU3RvcmUpICB7CisJCQorCQlDaGVja1Jlc3VsdCBjcjsKKworCQkvLyBTZWUgaWYgdGhlcmUgYXJlIGlucHV0IHN0cmVhbXMgbGVhZGluZyB0byB0aGlzIHN0ZXAhCisJCWlmIChpbnB1dC5sZW5ndGggPiAwKSB7CisJCQljciA9IG5ldyBDaGVja1Jlc3VsdChDaGVja1Jlc3VsdC5UWVBFX1JFU1VMVF9PSywgQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJEZW1vLkNoZWNrUmVzdWx0LlJlY2VpdmluZ1Jvd3MuT0siKSwgc3RlcE1ldGEpOworCQkJcmVtYXJrcy5hZGQoY3IpOworCQl9IGVsc2UgeworCQkJY3IgPSBuZXcgQ2hlY2tSZXN1bHQoQ2hlY2tSZXN1bHQuVFlQRV9SRVNVTFRfRVJST1IsIEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRGVtby5DaGVja1Jlc3VsdC5SZWNlaXZpbmdSb3dzLkVSUk9SIiksIHN0ZXBNZXRhKTsKKwkJCXJlbWFya3MuYWRkKGNyKTsKKwkJfQkKKyAgICAJCisJfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJVUkxGaWVsZChTdHJpbmcgc2VydmVyVVJMRmllbGQpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJVUkxGaWVsZCA9IHNlcnZlclVSTEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyVVJMRmllbGQoKSB7CisgICAgICAgIHJldHVybiBzZXJ2ZXJVUkxGaWVsZDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdEZpZWxkKFN0cmluZyByZXN1bHRGaWVsZCkgeworICAgICAgICB0aGlzLnJlc3VsdEZpZWxkID0gcmVzdWx0RmllbGQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdEZpZWxkOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvT09EVENvbmZpZy5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9PT0RUQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZTMxOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvT09EVENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JkZWxldGU7CisKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIENyZWF0ZWQgYnkgYnVnZyBvbiAwNy8wMy8xNC4KKyAqLworcHVibGljIGNsYXNzIE9PRFRDb25maWcgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoT09EVENvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBVUkwgZm1Vcmw7CisKKyAgICBwdWJsaWMgVVJMIGdldEZtVXJsKCl7CisgICAgICAgIHJldHVybiB0aGlzLmZtVXJsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBsb2FkWE1MUnBjQ2xpZW50KFN0cmluZyBmbVVybFN0cil7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTChmbVVybFN0cikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGZpbGUgbWFuYWdlciBjbGllbnQ6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpICsgIjogZXJyb3JzIHRvIGZvbGxvdyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRYTUxScGNDbGllbnQoKXsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL09PRFRQcm9jZXNzZXMuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvT09EVFByb2Nlc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2JjYjcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL09PRFRQcm9jZXNzZXMuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmRlbGV0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIENyZWF0ZWQgYnkgYnVnZyBvbiAwNy8wMy8xNC4KKyAqLworcHVibGljIGNsYXNzIE9PRFRQcm9jZXNzZXMgeworCisgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUHJvZHVjdEJ5TmFtZShPT0RUQ29uZmlnIGNvbmZpZywgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gY29uZmlnLmdldFhNTFJwY0NsaWVudCgpOworICAgICAgICBQcm9kdWN0IHAgPSBjbGllbnQuZ2V0UHJvZHVjdEJ5TmFtZShmaWxlbmFtZSk7CisgICAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZzID0gY2xpZW50LmdldFByb2R1Y3RSZWZlcmVuY2VzKHApOworICAgICAgICBpZiAocmVmcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlTWFuYWdlciByZXR1cm5lZCBudWxsIFJlZmVyZW5jZXMiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFJlZmVyZW5jZSByZWYgOiByZWZzKSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudC5yZW1vdmVGaWxlKG5ldyBGaWxlKG5ldyBVUkkocmVmLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBkZWxldGUgZmlsZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyByZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkgKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQucmVtb3ZlUHJvZHVjdChwKSkgeworICAgICAgICAgIC8vICBwcmludGVyLnByaW50bG4oIlN1Y2Nlc3NmdWxseSBkZWxldGVkIHByb2R1Y3QgJyIKKyAgICAgICAgICAgLy8gICAgICAgICsgcC5nZXRQcm9kdWN0TmFtZSgpICsgIiciKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRGVsZXRlIHByb2R1Y3QgcmV0dXJuZWQgZmFsc2UiKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZGVsZXRlL1B1c2hQdWxsT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzEwZTFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmRlbGV0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LkNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuSW5nZXN0ZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgUHVzaFB1bGxPYmplY3RGYWN0b3J5IHsKKworICAgIHByaXZhdGUgUHVzaFB1bGxPYmplY3RGYWN0b3J5KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiRG9uJ3QgY29uc3RydWN0IGZhY3RvcnkgY2xhc3NlcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGNyZWF0ZU5ld0luc3RhbmNlKENsYXNzPFQ+IGNsYXp6KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgCXRyeSB7CisJCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgb2JqZWN0IDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgSW5nZXN0ZXIgY3JlYXRlSW5nZXN0ZXIoU3RyaW5nIGluZ2VzdGVyQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgY2FjaGVGYWN0b3J5Q2xhc3MpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZGF0YVRyYW5zZmVyRmFjdG9yeSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSI7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFJBTlNGRVI6ICIgKyBkYXRhVHJhbnNmZXJGYWN0b3J5KTsKKyAgICAgICAgaWYgKGNhY2hlRmFjdG9yeUNsYXNzID09IG51bGwgfHwgY2FjaGVGYWN0b3J5Q2xhc3MuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgcmV0dXJuIChJbmdlc3RlcikgQ2xhc3MuZm9yTmFtZShpbmdlc3RlckNsYXNzKS5nZXRDb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyRmFjdG9yeS5nZXRDbGFzcygpKS5uZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyRmFjdG9yeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDbGFzczxDYWNoZUZhY3Rvcnk+IGNhY2hlRmFjdG9yeSA9IChDbGFzczxDYWNoZUZhY3Rvcnk+KSBDbGFzcworICAgICAgICAgICAgICAgICAgICAuZm9yTmFtZShjYWNoZUZhY3RvcnlDbGFzcyk7CisgICAgICAgICAgICBDYWNoZSBjYWNoZSA9IGNhY2hlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZUNhY2hlKCk7CisgICAgICAgICAgICByZXR1cm4gKEluZ2VzdGVyKSBDbGFzcy5mb3JOYW1lKGluZ2VzdGVyQ2xhc3MpLmdldENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXJGYWN0b3J5LmdldENsYXNzKCksIGNhY2hlLmdldENsYXNzKCkpCisgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZShkYXRhVHJhbnNmZXJGYWN0b3J5LCBjYWNoZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvbWVzc2FnZXMvbWVzc2FnZXNfZW5fVVMucHJvcGVydGllcyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JkZWxldGUvbWVzc2FnZXMvbWVzc2FnZXNfZW5fVVMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjk1NTk5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmRlbGV0ZS9tZXNzYWdlcy9tZXNzYWdlc19lbl9VUy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTEgQEAKK0RlbW8uU2hlbGwuVGl0bGU9RGVtbyBzdGVwCitEZW1vLkZpZWxkTmFtZS5MYWJlbD1PdXRwdXQgZmllbGQgbmFtZQorRGVtby5DaGVja1Jlc3VsdC5SZWNlaXZpbmdSb3dzLk9LPVN0ZXAgaXMgcmVjZWl2aW5nIGlucHV0IGZyb20gb3RoZXIgc3RlcHMuCitEZW1vLkNoZWNrUmVzdWx0LlJlY2VpdmluZ1Jvd3MuRVJST1I9Tm8gaW5wdXQgcmVjZWl2ZWQgZnJvbSBvdGhlciBzdGVwcyEKKworRmlsZW1nckRlbGV0ZVN0ZXAuTmFtZT1PT0RUIEZpbGVtZ3IgRmlsZSBEZWxldGUKK0ZpbGVtZ3JEZWxldGVTdGVwLlRvb2x0aXBEZXNjPVJlbW92ZSBhIGZpbGUgZnJvbSB0aGUgZmlsZSBtYW5hZ2VyCisKK0ZpbGVtZ3JEZWxldGUuRmllbGROYW1lLkxhYmVsPVN0cmVhbSBGaWVsZCBOYW1lCitGaWxlbWdyRGVsZXRlLlNlcnZlclVSTC5MYWJlbD1GaWxlbWdyIFVSTAorRmlsZW1nckRlbGV0ZS5SZXN1bHQuTGFiZWw9UmVzdWx0IEZpZWxkCmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L0ZpbGVtZ3JHZXRTdGVwLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L0ZpbGVtZ3JHZXRTdGVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5Y2M2MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvRmlsZW1nckdldFN0ZXAuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmdldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5Db25zdDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuc01ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcC4qOworaW1wb3J0IHN1bi51dGlsLmxvZ2dpbmcucmVzb3VyY2VzLmxvZ2dpbmdfZGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIG9yZy5wZW50YWhvLmRpLmNvcmUucm93LlJvd0RhdGFVdGlsLmFsbG9jYXRlUm93RGF0YTsKKworLyoqCisqIENvcHlyaWdodCAyMDE0IE9TQkkgTHRkCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgRmlsZW1nckdldFN0ZXAgZXh0ZW5kcyBCYXNlU3RlcCBpbXBsZW1lbnRzIFN0ZXBJbnRlcmZhY2UgeworCisgICAgcHJpdmF0ZSBPT0RUQ29uZmlnIG9vZHQgPSBuZXcgT09EVENvbmZpZygpOworICAgIHByaXZhdGUgT09EVFByb2Nlc3NlcyBvb2R0cHJvYyA9IG5ldyBPT0RUUHJvY2Vzc2VzKCk7CisgICAgcHJpdmF0ZSBGaWxlbWdyR2V0U3RlcERhdGEgZGF0YTsKKyAgICBwcml2YXRlIEZpbGVtZ3JHZXRTdGVwTWV0YSBtZXRhOworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgc2ltcGx5IHBhc3Mgb24gaXRzIGFyZ3VtZW50cyB0byB0aGUgcGFyZW50IGNsYXNzLgorCSAqIAorCSAqIEBwYXJhbSBzIAkJCQlzdGVwIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIHN0ZXBEYXRhSW50ZXJmYWNlCXN0ZXAgZGF0YSBjbGFzcworCSAqIEBwYXJhbSBjCQkJCQlzdGVwIGNvcHkKKwkgKiBAcGFyYW0gdAkJCQkJdHJhbnNmb3JtYXRpb24gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZGlzCQkJCXRyYW5zZm9ybWF0aW9uIGV4ZWN1dGluZworCSAqLworCXB1YmxpYyBGaWxlbWdyR2V0U3RlcChTdGVwTWV0YSBzLCBTdGVwRGF0YUludGVyZmFjZSBzdGVwRGF0YUludGVyZmFjZSwgaW50IGMsIFRyYW5zTWV0YSB0LCBUcmFucyBkaXMpIHsKKwkJc3VwZXIocywgc3RlcERhdGFJbnRlcmZhY2UsIGMsIHQsIGRpcyk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQREkgZHVyaW5nIHRyYW5zZm9ybWF0aW9uIHN0YXJ0dXAuIAorCSAqIAorCSAqIEl0IHNob3VsZCBpbml0aWFsaXplIHJlcXVpcmVkIGZvciBzdGVwIGV4ZWN1dGlvbi4gCisJICogCisJICogVGhlIG1ldGEgYW5kIGRhdGEgaW1wbGVtZW50YXRpb25zIHBhc3NlZCBpbiBjYW4gc2FmZWx5IGJlIGNhc3QKKwkgKiB0byB0aGUgc3RlcCdzIHJlc3BlY3RpdmUgaW1wbGVtZW50YXRpb25zLiAKKwkgKiAKKwkgKiBJdCBpcyBtYW5kYXRvcnkgdGhhdCBzdXBlci5pbml0KCkgaXMgY2FsbGVkIHRvIGVuc3VyZSBjb3JyZWN0IGJlaGF2aW9yLgorCSAqIAorCSAqIFR5cGljYWwgdGFza3MgZXhlY3V0ZWQgaGVyZSBhcmUgZXN0YWJsaXNoaW5nIHRoZSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UsCisJICogYXMgd2FsbCBhcyBvYnRhaW5pbmcgcmVzb3VyY2VzLCBsaWtlIGZpbGUgaGFuZGxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gc21pIAlzdGVwIG1ldGEgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCBjb250YWluaW5nIHRoZSBzdGVwIHNldHRpbmdzCisJICogQHBhcmFtIHNkaQlzdGVwIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCB1c2VkIHRvIHN0b3JlIHJ1bnRpbWUgaW5mb3JtYXRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHByZXZlbnRpbmcgdGhlIHN0ZXAgZnJvbSB3b3JraW5nLiAKKwkgKiAgCisJICovCisJcHVibGljIGJvb2xlYW4gaW5pdChTdGVwTWV0YUludGVyZmFjZSBzbWksIFN0ZXBEYXRhSW50ZXJmYWNlIHNkaSkgeworCQkvLyBDYXN0aW5nIHRvIHN0ZXAtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBpcyBzYWZlCisJCW1ldGEgPSAoRmlsZW1nckdldFN0ZXBNZXRhKSBzbWk7CisJCWRhdGEgPSAoRmlsZW1nckdldFN0ZXBEYXRhKSBzZGk7CisKKworICAgICAgICAgICAgbG9nRGV0YWlsZWQoImxvYWRpbmcgeG1scnBjY2xpZW50Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvb2R0LmxvYWRYTUxScGNDbGllbnQobWV0YS5nZXRTZXJ2ZXJVUkxGaWVsZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJJbmNvcnJlY3QgVVJMIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIlRoZXJlIHdhcyBhIHByb2JsZW0gY29ubmVjdGluZyIsIGUpOworICAgICAgICB9CisgICAgICAgIGxvZ0RldGFpbGVkKCJmaW5pc2hlZCBsb2FkaW5nIHhtbHJwY2NsaWVudCIpOworCisKKyAgICAgICAgcmV0dXJuIHN1cGVyLmluaXQobWV0YSwgZGF0YSk7CisJfQorCisKKyAgICBwcml2YXRlIE9iamVjdFtdIGJ1aWxkRW1wdHlSb3coKSB7CisKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRlUm93RGF0YShkYXRhLm91dHB1dFJvd01ldGEuc2l6ZSgpKTsKKyAgICB9CisKKwkvKioKKwkgKiBPbmNlIHRoZSB0cmFuc2Zvcm1hdGlvbiBzdGFydHMgZXhlY3V0aW5nLCB0aGUgcHJvY2Vzc1JvdygpIG1ldGhvZCBpcyBjYWxsZWQgcmVwZWF0ZWRseQorCSAqIGJ5IFBESSBmb3IgYXMgbG9uZyBhcyBpdCByZXR1cm5zIHRydWUuIFRvIGluZGljYXRlIHRoYXQgYSBzdGVwIGhhcyBmaW5pc2hlZCBwcm9jZXNzaW5nIHJvd3MKKwkgKiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgc2V0T3V0cHV0RG9uZSgpIGFuZCByZXR1cm4gZmFsc2U7CisJICoKKwkgKiBTdGVwcyB3aGljaCBwcm9jZXNzIGluY29taW5nIHJvd3MgdHlwaWNhbGx5IGNhbGwgZ2V0Um93KCkgdG8gcmVhZCBhIHNpbmdsZSByb3cgZnJvbSB0aGUKKwkgKiBpbnB1dCBzdHJlYW0sIGNoYW5nZSBvciBhZGQgcm93IGNvbnRlbnQsIGNhbGwgcHV0Um93KCkgdG8gcGFzcyB0aGUgY2hhbmdlZCByb3cgb24KKwkgKiBhbmQgcmV0dXJuIHRydWUuIElmIGdldFJvdygpIHJldHVybnMgbnVsbCwgbm8gbW9yZSByb3dzIGFyZSBleHBlY3RlZCB0byBjb21lIGluLAorCSAqIGFuZCB0aGUgcHJvY2Vzc1JvdygpIGltcGxlbWVudGF0aW9uIGNhbGxzIHNldE91dHB1dERvbmUoKSBhbmQgcmV0dXJucyBmYWxzZSB0bworCSAqIGluZGljYXRlIHRoYXQgaXQgaXMgZG9uZSB0b28uCisJICoKKwkgKiBTdGVwcyB3aGljaCBnZW5lcmF0ZSByb3dzIHR5cGljYWxseSBjb25zdHJ1Y3QgYSBuZXcgcm93IE9iamVjdFtdIHVzaW5nIGEgY2FsbCB0bworCSAqIFJvd0RhdGFVdGlsLmFsbG9jYXRlUm93RGF0YShudW1iZXJPZkZpZWxkcyksIGFkZCByb3cgY29udGVudCwgYW5kIGNhbGwgcHV0Um93KCkgdG8KKwkgKiBwYXNzIHRoZSBuZXcgcm93IG9uLiBBYm92ZSBwcm9jZXNzIG1heSBoYXBwZW4gaW4gYSBsb29wIHRvIGdlbmVyYXRlIG11bHRpcGxlIHJvd3MsCisJICogYXQgdGhlIGVuZCBvZiB3aGljaCBwcm9jZXNzUm93KCkgd291bGQgY2FsbCBzZXRPdXRwdXREb25lKCkgYW5kIHJldHVybiBmYWxzZTsKKwkgKgorCSAqIEBwYXJhbSBzbWkgdGhlIHN0ZXAgbWV0YSBpbnRlcmZhY2UgY29udGFpbmluZyB0aGUgc3RlcCBzZXR0aW5ncworCSAqIEBwYXJhbSBzZGkgdGhlIHN0ZXAgZGF0YSBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzdG9yZQorCSAqCisJICogQHJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4sIGZhbHNlIGlmIHRoZSBzdGVwIGlzIGRvbmUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUm93KFN0ZXBNZXRhSW50ZXJmYWNlIHNtaSwgU3RlcERhdGFJbnRlcmZhY2Ugc2RpKSB0aHJvd3MgS2V0dGxlRXhjZXB0aW9uIHsKKworCisgICAgICAgIGlmICggZmlyc3QgKSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgZGF0YS5vdXRwdXRSb3dNZXRhID0gbmV3IFJvd01ldGEoKTsKKyAgICAgICAgICAgIG1ldGEuZ2V0RmllbGRzKCBkYXRhLm91dHB1dFJvd01ldGEsIGdldFN0ZXBuYW1lKCksIG51bGwsIG51bGwsIHRoaXMsIHJlcG9zaXRvcnksIG1ldGFTdG9yZSApOworICAgICAgICB9CisKKyAgICAgICAgaWYobWV0YS5nZXRQcm9jZXNzVHlwZSgpID09IFByb2Nlc3MuTElTVCl7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHByb2R1Y3RzID0gb29kdHByb2MuZ2V0QWxsUHJvZHVjdHMob29kdCwgZW52aXJvbm1lbnRTdWJzdGl0dXRlKG1ldGEuZ2V0UHJvZHVjdFR5cGVGaWVsZCgpKSk7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLFN0cmluZz4+IGVudHJ5IDogcHJvZHVjdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJvdyA9IGJ1aWxkRW1wdHlSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRMaW5lc1JlYWQoKTsKKworICAgICAgICAgICAgICAgICAgICByb3dbMF0gPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAxOworICAgICAgICAgICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxTdHJpbmc+IGlubmVyZW50cnkgOiBlbnRyeS5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpeworICAgICAgICAgICAgICAgICAgICAgICAgcm93W2ldID0gaW5uZXJlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHV0Um93KGRhdGEub3V0cHV0Um93TWV0YSwgcm93KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nRXJyb3IoIkNvdWxkIG5vdCBnZXQgZGF0YSIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihtZXRhLmdldFByb2Nlc3NUeXBlKCkgPT0gUHJvY2Vzcy5HRVQgJiYgbWV0YS5nZXRTZWFyY2hUeXBlKCkgPT0gU2VhcmNoLklEKXsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwID0gbWV0YS5nZXRMb29rdXAoKTsKKyAgICAgICAgICAgICAgICBpZighQ29uc3QuaXNFbXB0eShsb29rdXApKXsKKyAgICAgICAgICAgICAgICAgICAgbG9va3VwID0gZW52aXJvbm1lbnRTdWJzdGl0dXRlKGxvb2t1cCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgT2JqZWN0W10gcm93ID0gYnVpbGRFbXB0eVJvdygpOworICAgICAgICAgICAgICAgIHJvd1swXSA9IG9vZHRwcm9jLmdldFByb2R1Y3RCeUlEKG9vZHQsIGxvb2t1cCk7CisgICAgICAgICAgICAgICAgcHV0Um93KGRhdGEub3V0cHV0Um93TWV0YSwgcm93KTsKKworICAgICAgICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nRXJyb3IoIkNhdGFsb2cgRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChEYXRhVHJhbnNmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCJEYXRhIFRyYW5zZmVyIEV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCJJTyBFeGNlcHRpb24iLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYobWV0YS5nZXRQcm9jZXNzVHlwZSgpID09IFByb2Nlc3MuR0VUICYmIG1ldGEuZ2V0U2VhcmNoVHlwZSgpID09IFNlYXJjaC5OQU1FKXsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvb2t1cCA9IG1ldGEuZ2V0TG9va3VwKCk7CisgICAgICAgICAgICAgICAgaWYoIUNvbnN0LmlzRW1wdHkobG9va3VwKSl7CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cCA9IGVudmlyb25tZW50U3Vic3RpdHV0ZShsb29rdXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE9iamVjdFtdIHJvdyA9IGJ1aWxkRW1wdHlSb3coKTsKKyAgICAgICAgICAgICAgICByb3dbMF0gPSBvb2R0cHJvYy5nZXRQcm9kdWN0QnlOYW1lKG9vZHQsIGxvb2t1cCk7CisgICAgICAgICAgICAgICAgcHV0Um93KGRhdGEub3V0cHV0Um93TWV0YSwgcm93KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCJDYXRhbG9nIEV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoRGF0YVRyYW5zZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dFcnJvcigiRGF0YSBUcmFuc2ZlciBFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dFcnJvcigiSU8gRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisJCS8vIGxvZyBwcm9ncmVzcyBpZiBpdCBpcyB0aW1lIHRvIHRvIHNvCisJCWlmIChjaGVja0ZlZWRiYWNrKGdldExpbmVzUmVhZCgpKSkgeworCQkJbG9nQmFzaWMoIkxpbmVuciAiICsgZ2V0TGluZXNSZWFkKCkpOyAvLyBTb21lIGJhc2ljIGxvZ2dpbmcKKwkJfQorCisJCS8vIGluZGljYXRlIHRoYXQgcHJvY2Vzc1JvdygpIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4KKyAgICAgICAgc2V0T3V0cHV0RG9uZSgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBESSBvbmNlIHRoZSBzdGVwIGlzIGRvbmUgcHJvY2Vzc2luZy4KKwkgKgorCSAqIFRoZSBkaXNwb3NlKCkgbWV0aG9kIGlzIHRoZSBjb3VudGVycGFydCB0byBpbml0KCkgYW5kIHNob3VsZCByZWxlYXNlIGFueSByZXNvdXJjZXMKKwkgKiBhY3F1aXJlZCBmb3Igc3RlcCBleGVjdXRpb24gbGlrZSBmaWxlIGhhbmRsZXMgb3IgZGF0YWJhc2UgY29ubmVjdGlvbnMuCisJICoKKwkgKiBUaGUgbWV0YSBhbmQgZGF0YSBpbXBsZW1lbnRhdGlvbnMgcGFzc2VkIGluIGNhbiBzYWZlbHkgYmUgY2FzdAorCSAqIHRvIHRoZSBzdGVwJ3MgcmVzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbnMuCisJICoKKwkgKiBJdCBpcyBtYW5kYXRvcnkgdGhhdCBzdXBlci5kaXNwb3NlKCkgaXMgY2FsbGVkIHRvIGVuc3VyZSBjb3JyZWN0IGJlaGF2aW9yLgorCSAqCisJICogQHBhcmFtIHNtaSAJc3RlcCBtZXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgY29udGFpbmluZyB0aGUgc3RlcCBzZXR0aW5ncworCSAqIEBwYXJhbSBzZGkJc3RlcCBkYXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgdXNlZCB0byBzdG9yZSBydW50aW1lIGluZm9ybWF0aW9uCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZShTdGVwTWV0YUludGVyZmFjZSBzbWksIFN0ZXBEYXRhSW50ZXJmYWNlIHNkaSkgeworCisJCS8vIENhc3RpbmcgdG8gc3RlcC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGlzIHNhZmUKKwkJRmlsZW1nckdldFN0ZXBNZXRhIG1ldGEgPSAoRmlsZW1nckdldFN0ZXBNZXRhKSBzbWk7CisJCUZpbGVtZ3JHZXRTdGVwRGF0YSBkYXRhID0gKEZpbGVtZ3JHZXRTdGVwRGF0YSkgc2RpOworCQkKKwkJc3VwZXIuZGlzcG9zZShtZXRhLCBkYXRhKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvRmlsZW1nckdldFN0ZXBEYXRhLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L0ZpbGVtZ3JHZXRTdGVwRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTIzOTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L0ZpbGVtZ3JHZXRTdGVwRGF0YS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyZ2V0OworCitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLkJhc2VTdGVwRGF0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLlN0ZXBEYXRhSW50ZXJmYWNlOworCisvKioKKyogQ29weXJpZ2h0IDIwMTQgT1NCSSBMdGQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBGaWxlbWdyR2V0U3RlcERhdGEgZXh0ZW5kcyBCYXNlU3RlcERhdGEgaW1wbGVtZW50cyBTdGVwRGF0YUludGVyZmFjZSB7CisKKwlwdWJsaWMgUm93TWV0YUludGVyZmFjZSBvdXRwdXRSb3dNZXRhOworCisgICAgcHVibGljIFN0cmluZyBmaWVsZG5hbWU7CisKKyAgICBwdWJsaWMgRmlsZW1nckdldFN0ZXBEYXRhKCkKKwl7CisJCXN1cGVyKCk7CisJfQorfQorCQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmdldC9GaWxlbWdyR2V0U3RlcERpYWxvZy5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmdldC9GaWxlbWdyR2V0U3RlcERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWFmMGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L0ZpbGVtZ3JHZXRTdGVwRGlhbG9nLmphdmEKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyZ2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuQ29uc3Q7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuaTE4bi5CYXNlTWVzc2FnZXM7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuVHJhbnNNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuU3RlcERpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS51aS5jb3JlLndpZGdldC5UZXh0VmFyOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnVpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBEaWFsb2c7CisKKy8qKgorKiBDb3B5cmlnaHQgMjAxNCBPU0JJIEx0ZAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcHVibGljIGNsYXNzIEZpbGVtZ3JHZXRTdGVwRGlhbG9nIGV4dGVuZHMgQmFzZVN0ZXBEaWFsb2cgaW1wbGVtZW50cyBTdGVwRGlhbG9nSW50ZXJmYWNlIHsKKworCS8qKgorCSAqCVRoZSBQS0cgbWVtYmVyIGlzIHVzZWQgd2hlbiBsb29raW5nIHVwIGludGVybmF0aW9uYWxpemVkIHN0cmluZ3MuCisJICoJVGhlIHByb3BlcnRpZXMgZmlsZSB3aXRoIGxvY2FsaXplZCBrZXlzIGlzIGV4cGVjdGVkIHRvIHJlc2lkZSBpbiAKKwkgKgl7dGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzIHNwZWNpZmllZH0vbWVzc2FnZXMvbWVzc2FnZXNfe2xvY2FsZX0ucHJvcGVydGllcyAgIAorCSAqLworCXByaXZhdGUgc3RhdGljIENsYXNzPD8+IFBLRyA9IEZpbGVtZ3JHZXRTdGVwTWV0YS5jbGFzczsgLy8gZm9yIGkxOG4gcHVycG9zZXMKKworCS8vIHRoaXMgaXMgdGhlIG9iamVjdCB0aGUgc3RvcmVzIHRoZSBzdGVwJ3Mgc2V0dGluZ3MKKwkvLyB0aGUgZGlhbG9nIHJlYWRzIHRoZSBzZXR0aW5ncyBmcm9tIGl0IHdoZW4gb3BlbmluZworCS8vIHRoZSBkaWFsb2cgd3JpdGVzIHRoZSBzZXR0aW5ncyB0byBpdCB3aGVuIGNvbmZpcm1lZCAKKwlwcml2YXRlIEZpbGVtZ3JHZXRTdGVwTWV0YSBtZXRhOworCisJLy8gdGV4dCBmaWVsZCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBhZGQgdG8gdGhlIHJvdyBzdHJlYW0KKwkvL3ByaXZhdGUgVGV4dCB3SGVsbG9GaWVsZE5hbWU7CisKKyAgICAvLyB0ZXh0IGZpZWxkIGhvbGRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIHRoZSBmaWxlbmFtZSBhZ2FpbnN0CisgICAgcHJpdmF0ZSBUZXh0VmFyIHdGaWxlbmFtZUZpZWxkOworICAgIHByaXZhdGUgVGV4dCB3U2VydmVyVVJMRmllbGQ7CisgICAgcHJpdmF0ZSBUZXh0VmFyIHdSZXN1bHRGaWVsZDsKKyAgICBwcml2YXRlIEJ1dHRvbltdIHJhZGlvQnV0dG9uczIgPSBuZXcgQnV0dG9uWzJdOworICAgIHByaXZhdGUgQnV0dG9uW10gcmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvblsyXTsKKyAgICBwcml2YXRlIFNlYXJjaCBzZWxlY3RlZHNlYXJjaDsKKyAgICBwcml2YXRlIFByb2Nlc3Mgc2VsZWN0ZWRwcm9jZXNzOworICAgIC8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgc2ltcGx5IGludm9rZSBzdXBlcigpIGFuZCBzYXZlIHRoZSBpbmNvbWluZyBtZXRhCisJICogb2JqZWN0IHRvIGEgbG9jYWwgdmFyaWFibGUsIHNvIGl0IGNhbiBjb252ZW5pZW50bHkgcmVhZCBhbmQgd3JpdGUgc2V0dGluZ3MKKwkgKiBmcm9tL3RvIGl0LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgCXRoZSBTV1Qgc2hlbGwgdG8gb3BlbiB0aGUgZGlhbG9nIGluCisJICogQHBhcmFtIGluCQl0aGUgbWV0YSBvYmplY3QgaG9sZGluZyB0aGUgc3RlcCdzIHNldHRpbmdzCisJICogQHBhcmFtIHRyYW5zTWV0YQl0cmFuc2Zvcm1hdGlvbiBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBzbmFtZQkJdGhlIHN0ZXAgbmFtZQorCSAqLworCXB1YmxpYyBGaWxlbWdyR2V0U3RlcERpYWxvZyhTaGVsbCBwYXJlbnQsIE9iamVjdCBpbiwgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RyaW5nIHNuYW1lKSB7CisJCXN1cGVyKHBhcmVudCwgKEJhc2VTdGVwTWV0YSkgaW4sIHRyYW5zTWV0YSwgc25hbWUpOworCQltZXRhID0gKEZpbGVtZ3JHZXRTdGVwTWV0YSkgaW47CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFNwb29uIHdoZW4gdGhlIHVzZXIgb3BlbnMgdGhlIHNldHRpbmdzIGRpYWxvZyBvZiB0aGUgc3RlcC4KKwkgKiBJdCBzaG91bGQgb3BlbiB0aGUgZGlhbG9nIGFuZCByZXR1cm4gb25seSBvbmNlIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSB1c2VyLgorCSAqIAorCSAqIElmIHRoZSB1c2VyIGNvbmZpcm1zIHRoZSBkaWFsb2csIHRoZSBtZXRhIG9iamVjdCAocGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvcikgbXVzdAorCSAqIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHN0ZXAgc2V0dGluZ3MuIFRoZSBjaGFuZ2VkIGZsYWcgb2YgdGhlIG1ldGEgb2JqZWN0IG11c3QgCisJICogcmVmbGVjdCB3aGV0aGVyIHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24gd2FzIGNoYW5nZWQgYnkgdGhlIGRpYWxvZy4KKwkgKiAKKwkgKiBJZiB0aGUgdXNlciBjYW5jZWxzIHRoZSBkaWFsb2csIHRoZSBtZXRhIG9iamVjdCBtdXN0IG5vdCBiZSB1cGRhdGVkLCBhbmQgaXRzIGNoYW5nZWQgZmxhZworCSAqIG11c3QgcmVtYWluIHVuYWx0ZXJlZC4KKwkgKiAKKwkgKiBUaGUgb3BlbigpIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RlcCBhZnRlciB0aGUgdXNlciBoYXMgY29uZmlybWVkIHRoZSBkaWFsb2csCisJICogb3IgbnVsbCBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG9wZW4oKSB7CisKKwkJLy8gc3RvcmUgc29tZSBjb252ZW5pZW50IFNXVCB2YXJpYWJsZXMgCisJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOworCisJCS8vIFNXVCBjb2RlIGZvciBwcmVwYXJpbmcgdGhlIGRpYWxvZworCQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuTUlOIHwgU1dULk1BWCk7CisJCXByb3BzLnNldExvb2soc2hlbGwpOworCQlzZXRTaGVsbEltYWdlKHNoZWxsLCBtZXRhKTsKKwkJCisJCS8vIFNhdmUgdGhlIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIGZsYWcgb24gdGhlIG1ldGEgb2JqZWN0LiBJZiB0aGUgdXNlciBjYW5jZWxzCisJCS8vIHRoZSBkaWFsb2csIGl0IHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhpcyBzYXZlZCB2YWx1ZS4KKwkJLy8gVGhlICJjaGFuZ2VkIiB2YXJpYWJsZSBpcyBpbmhlcml0ZWQgZnJvbSBCYXNlU3RlcERpYWxvZworCQljaGFuZ2VkID0gbWV0YS5oYXNDaGFuZ2VkKCk7CisJCQorCQkvLyBUaGUgTW9kaWZ5TGlzdGVuZXIgdXNlZCBvbiBhbGwgY29udHJvbHMuIEl0IHdpbGwgdXBkYXRlIHRoZSBtZXRhIG9iamVjdCB0byAKKwkJLy8gaW5kaWNhdGUgdGhhdCBjaGFuZ2VzIGFyZSBiZWluZyBtYWRlLgorCQlNb2RpZnlMaXN0ZW5lciBsc01vZCA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCW1ldGEuc2V0Q2hhbmdlZCgpOworCQkJfQorCQl9OworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworCQkvLyBTV1QgY29kZSBmb3IgYnVpbGRpbmcgdGhlIGFjdHVhbCBzZXR0aW5ncyBkaWFsb2cgICAgICAgIC8vCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKwkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IENvbnN0LkZPUk1fTUFSR0lOOworCQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IENvbnN0LkZPUk1fTUFSR0lOOworCisJCXNoZWxsLnNldExheW91dChmb3JtTGF5b3V0KTsKKwkJc2hlbGwuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JHZXRTdGVwLk5hbWUiKSk7CisKKwkJaW50IG1pZGRsZSA9IHByb3BzLmdldE1pZGRsZVBjdCgpOworCQlpbnQgbWFyZ2luID0gQ29uc3QuTUFSR0lOOworCisJCS8vIFN0ZXBuYW1lIGxpbmUKKwkJd2xTdGVwbmFtZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlJJR0hUKTsKKwkJd2xTdGVwbmFtZS5zZXRUZXh0KEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiU3lzdGVtLkxhYmVsLlN0ZXBOYW1lIikpOyAKKwkJcHJvcHMuc2V0TG9vayh3bFN0ZXBuYW1lKTsKKwkJZmRsU3RlcG5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRsU3RlcG5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZmRsU3RlcG5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAtbWFyZ2luKTsKKwkJZmRsU3RlcG5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIG1hcmdpbik7CisJCXdsU3RlcG5hbWUuc2V0TGF5b3V0RGF0YShmZGxTdGVwbmFtZSk7CisJCQorCQl3U3RlcG5hbWUgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisJCXdTdGVwbmFtZS5zZXRUZXh0KHN0ZXBuYW1lKTsKKwkJcHJvcHMuc2V0TG9vayh3U3RlcG5hbWUpOworCQl3U3RlcG5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobHNNb2QpOworCQlmZFN0ZXBuYW1lID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkU3RlcG5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworCQlmZFN0ZXBuYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBtYXJnaW4pOworCQlmZFN0ZXBuYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXdTdGVwbmFtZS5zZXRMYXlvdXREYXRhKGZkU3RlcG5hbWUpOworCisgICAgICAgIC8vIHNlcnZlcm5hbWUgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xTZXJ2ZXJOYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFNlcnZlck5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JHZXQuU2VydmVyVVJMLkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsU2VydmVyTmFtZSk7CisgICAgICAgIEZvcm1EYXRhIGZkbFNlcnZlck5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKyAgICAgICAgZmRsU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxTZXJ2ZXJOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisgICAgICAgIGZkbFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTdGVwbmFtZSwgbWFyZ2luKTsKKyAgICAgICAgd2xTZXJ2ZXJOYW1lLnNldExheW91dERhdGEoZmRsU2VydmVyTmFtZSk7CisKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdTZXJ2ZXJVUkxGaWVsZCk7CisgICAgICAgIHdTZXJ2ZXJVUkxGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihsc01vZCk7CisgICAgICAgIEZvcm1EYXRhIGZkU2VydmVyTmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZFNlcnZlck5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworICAgICAgICBmZFNlcnZlck5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKyAgICAgICAgZmRTZXJ2ZXJOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3U3RlcG5hbWUsIG1hcmdpbik7CisgICAgICAgIHdTZXJ2ZXJVUkxGaWVsZC5zZXRMYXlvdXREYXRhKGZkU2VydmVyTmFtZSk7CisKKwkJLy8gcHJvZHVjdCB0eXBlCisJCUxhYmVsIHdsVmFsTmFtZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlJJR0hUKTsKKwkJd2xWYWxOYW1lLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJGaWxlbWdyR2V0LlByb2R1Y3RUeXBlLkxhYmVsIikpOworCQlwcm9wcy5zZXRMb29rKHdsVmFsTmFtZSk7CisJCUZvcm1EYXRhIGZkbFZhbE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRsVmFsTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZGxWYWxOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisJCWZkbFZhbE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTZXJ2ZXJVUkxGaWVsZCwgbWFyZ2luKTsKKwkJd2xWYWxOYW1lLnNldExheW91dERhdGEoZmRsVmFsTmFtZSk7CisKKwkJd0ZpbGVuYW1lRmllbGQgPSBuZXcgVGV4dFZhcih0cmFuc01ldGEsIHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkxFRlQgfCBTV1QuQk9SREVSKTsKKwkJcHJvcHMuc2V0TG9vayh3RmlsZW5hbWVGaWVsZCk7CisJCXdGaWxlbmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKwkJRm9ybURhdGEgZmRWYWxOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkVmFsTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisJCWZkVmFsTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlmZFZhbE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTZXJ2ZXJVUkxGaWVsZCwgbWFyZ2luKTsKKwkJd0ZpbGVuYW1lRmllbGQuc2V0TGF5b3V0RGF0YShmZFZhbE5hbWUpOworCisKKyAgICAgICAgLy8gcHJvY2Vzc3R5cGUgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xQcm9jZXNzVHlwZU5hbWUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5SSUdIVCk7CisgICAgICAgIHdsUHJvY2Vzc1R5cGVOYW1lLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJGaWxlbWdyR2V0LlByb2Nlc3NUeXBlLkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsUHJvY2Vzc1R5cGVOYW1lKTsKKyAgICAgICAgRm9ybURhdGEgZmRsUHJvY2Vzc1R5cGVOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkbFByb2Nlc3NUeXBlTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxQcm9jZXNzVHlwZU5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAtbWFyZ2luKTsKKyAgICAgICAgZmRsUHJvY2Vzc1R5cGVOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3RmlsZW5hbWVGaWVsZCwgbWFyZ2luKTsKKyAgICAgICAgd2xQcm9jZXNzVHlwZU5hbWUuc2V0TGF5b3V0RGF0YShmZGxQcm9jZXNzVHlwZU5hbWUpOworCisgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTlVMTCk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKyAgICAgICAgcmFkaW9CdXR0b25zMlswXSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOworICAgICAgICByYWRpb0J1dHRvbnMyWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgcmFkaW9CdXR0b25zMlswXS5zZXRUZXh0KCJMaXN0IFByb2R1Y3RzIik7CisgICAgICAgIHJhZGlvQnV0dG9uczJbMF0ucGFjaygpOworICAgICAgICByYWRpb0J1dHRvbnMyWzFdID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7CisgICAgICAgIHJhZGlvQnV0dG9uczJbMV0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKyAgICAgICAgcmFkaW9CdXR0b25zMlsxXS5zZXRUZXh0KCJHZXQgUHJvZHVjdCIpOworICAgICAgICByYWRpb0J1dHRvbnMyWzFdLnBhY2soKTsKKyAgICAgICAgcHJvcHMuc2V0TG9vayhyYWRpb0J1dHRvbnMyWzBdKTsKKyAgICAgICAgcHJvcHMuc2V0TG9vayhyYWRpb0J1dHRvbnMyWzFdKTsKKworCisgICAgICAgIC8vd0ZpbGVuYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobHNNb2QpOworICAgICAgICBGb3JtRGF0YSBmZFByb2Nlc3NUeXBlTmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZFByb2Nlc3NUeXBlTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisgICAgICAgIGZkUHJvY2Vzc1R5cGVOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisgICAgICAgIGZkUHJvY2Vzc1R5cGVOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3RmlsZW5hbWVGaWVsZCwgbWFyZ2luKTsKKyAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZmRQcm9jZXNzVHlwZU5hbWUpOworCisKKyAgICAgICAgLy8gc2VhcmNoIHR5cGUgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xTZWFyY2hOYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFNlYXJjaE5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JHZXQuU2VhcmNoVHlwZS5MYWJlbCIpKTsKKyAgICAgICAgcHJvcHMuc2V0TG9vayh3bFNlYXJjaE5hbWUpOworICAgICAgICBGb3JtRGF0YSBmZGxTZWFyY2hOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkbFNlYXJjaE5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKyAgICAgICAgZmRsU2VhcmNoTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIC1tYXJnaW4pOworICAgICAgICBmZGxTZWFyY2hOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21wb3NpdGUsIG1hcmdpbik7CisgICAgICAgIHdsU2VhcmNoTmFtZS5zZXRMYXlvdXREYXRhKGZkbFNlYXJjaE5hbWUpOworCisgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUxID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5VTEwpOworICAgICAgICBjb21wb3NpdGUxLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOworICAgICAgICByYWRpb0J1dHRvbnNbMF0gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZTEsIFNXVC5SQURJTyk7CisgICAgICAgIHJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisgICAgICAgIHJhZGlvQnV0dG9uc1swXS5zZXRUZXh0KCJOYW1lIik7CisgICAgICAgIHJhZGlvQnV0dG9uc1swXS5wYWNrKCk7CisgICAgICAgIHJhZGlvQnV0dG9uc1sxXSA9IG5ldyBCdXR0b24oY29tcG9zaXRlMSwgU1dULlJBRElPKTsKKyAgICAgICAgcmFkaW9CdXR0b25zWzFdLnNldFNlbGVjdGlvbihmYWxzZSk7CisgICAgICAgIHJhZGlvQnV0dG9uc1sxXS5zZXRUZXh0KCJJRCIpOworICAgICAgICByYWRpb0J1dHRvbnNbMV0ucGFjaygpOworICAgICAgICBwcm9wcy5zZXRMb29rKHJhZGlvQnV0dG9uc1swXSk7CisgICAgICAgIHByb3BzLnNldExvb2socmFkaW9CdXR0b25zWzFdKTsKKyAgICAgICAgcmFkaW9CdXR0b25zWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkc2VhcmNoID0gU2VhcmNoLk5BTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByYWRpb0J1dHRvbnNbMV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRzZWFyY2ggPSBTZWFyY2guSUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEZvcm1EYXRhIGZkU2VhcmNoTmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZFNlYXJjaE5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworICAgICAgICBmZFNlYXJjaE5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKyAgICAgICAgZmRTZWFyY2hOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21wb3NpdGUsIG1hcmdpbik7CisgICAgICAgIGNvbXBvc2l0ZTEuc2V0TGF5b3V0RGF0YShmZFNlYXJjaE5hbWUpOworCisgICAgICAgIGlmKG1ldGEuZ2V0UHJvY2Vzc1R5cGUoKT09UHJvY2Vzcy5MSVNUKXsKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uc1swXS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uc1sxXS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gc2VydmVybmFtZSBmaWVsZCB2YWx1ZQorICAgICAgICBMYWJlbCB3bFJlc3VsdE5hbWUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5SSUdIVCk7CisgICAgICAgIHdsUmVzdWx0TmFtZS5zZXRUZXh0KEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRmlsZW1nckdldC5SZXN1bHQuTGFiZWwiKSk7CisgICAgICAgIHByb3BzLnNldExvb2sod2xSZXN1bHROYW1lKTsKKyAgICAgICAgRm9ybURhdGEgZmRsUmVzdWx0TmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZGxSZXN1bHROYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisgICAgICAgIGZkbFJlc3VsdE5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAtbWFyZ2luKTsKKyAgICAgICAgZmRsUmVzdWx0TmFtZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9zaXRlMSwgbWFyZ2luKTsKKyAgICAgICAgd2xSZXN1bHROYW1lLnNldExheW91dERhdGEoZmRsUmVzdWx0TmFtZSk7CisKKyAgICAgICAgd1Jlc3VsdEZpZWxkID0gbmV3IFRleHRWYXIodHJhbnNNZXRhLCBzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisgICAgICAgIHByb3BzLnNldExvb2sod1Jlc3VsdEZpZWxkKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKyAgICAgICAgRm9ybURhdGEgZmRSZXN1bHROYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkUmVzdWx0TmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisgICAgICAgIGZkUmVzdWx0TmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworICAgICAgICBmZFJlc3VsdE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvc2l0ZTEsIG1hcmdpbik7CisgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkUmVzdWx0TmFtZSk7CisgICAgICAgIHdSZXN1bHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICB3UmVzdWx0RmllbGQuc2V0VG9vbFRpcFRleHQodHJhbnNNZXRhLmVudmlyb25tZW50U3Vic3RpdHV0ZSh3UmVzdWx0RmllbGQuZ2V0VGV4dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmKG1ldGEuZ2V0UHJvY2Vzc1R5cGUoKT09UHJvY2Vzcy5MSVNUKXsKKyAgICAgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBPSyBhbmQgY2FuY2VsIGJ1dHRvbnMKKwkJd09LID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOworCQl3T0suc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIlN5c3RlbS5CdXR0b24uT0siKSk7IAorCQl3Q2FuY2VsID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOworCQl3Q2FuY2VsLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJTeXN0ZW0uQnV0dG9uLkNhbmNlbCIpKTsgCisKKwkJQmFzZVN0ZXBEaWFsb2cucG9zaXRpb25Cb3R0b21CdXR0b25zKHNoZWxsLCBuZXcgQnV0dG9uW10geyB3T0ssIHdDYW5jZWwgfSwgbWFyZ2luLCB3UmVzdWx0RmllbGQpOworCisJCS8vIEFkZCBsaXN0ZW5lcnMgZm9yIGNhbmNlbCBhbmQgT0sKKwkJbHNDYW5jZWwgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Y2FuY2VsKCk7fQorCQl9OworCQlsc09LID0gbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkge29rKCk7fQorCQl9OworCisJCXdDYW5jZWwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbHNDYW5jZWwpOworCQl3T0suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbHNPSyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJhZGlvIGJ1dHRvbiBsaXN0ZW5lcnMKKyAgICAgICAgICovCisgICAgICAgIHJhZGlvQnV0dG9uczJbMF0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRwcm9jZXNzID0gUHJvY2Vzcy5MSVNUOworICAgICAgICAgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICByYWRpb0J1dHRvbnNbMF0uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgcmFkaW9CdXR0b25zWzFdLnNldEVuYWJsZWQoZmFsc2UpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByYWRpb0J1dHRvbnMyWzFdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkcHJvY2VzcyA9IFByb2Nlc3MuR0VUOworICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uc1swXS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uc1sxXS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworCQkvLyBkZWZhdWx0IGxpc3RlbmVyIChmb3IgaGl0dGluZyAiZW50ZXIiKQorCQlsc0RlZiA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHtvaygpO30KKwkJfTsKKwkJd1N0ZXBuYW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKwkJd0ZpbGVuYW1lRmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobHNEZWYpOworICAgICAgICB3U2VydmVyVVJMRmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobHNEZWYpOworICAgICAgICB3UmVzdWx0RmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobHNEZWYpOworCQkvLyBEZXRlY3QgWCBvciBBTFQtRjQgb3Igc29tZXRoaW5nIHRoYXQga2lsbHMgdGhpcyB3aW5kb3cgYW5kIGNhbmNlbCB0aGUgZGlhbG9nIHByb3Blcmx5CisJCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobmV3IFNoZWxsQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkge2NhbmNlbCgpO30KKwkJfSk7CisJCQorCQkvLyBTZXQvUmVzdG9yZSB0aGUgZGlhbG9nIHNpemUgYmFzZWQgb24gbGFzdCBwb3NpdGlvbiBvbiBzY3JlZW4KKwkJLy8gVGhlIHNldFNpemUoKSBtZXRob2QgaXMgaW5oZXJpdGVkIGZyb20gQmFzZVN0ZXBEaWFsb2cKKwkJc2V0U2l6ZSgpOworCisJCS8vIHBvcHVsYXRlIHRoZSBkaWFsb2cgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG1ldGEgb2JqZWN0CisJCXBvcHVsYXRlRGlhbG9nKCk7CisJCQorCQkvLyByZXN0b3JlIHRoZSBjaGFuZ2VkIGZsYWcgdG8gb3JpZ2luYWwgdmFsdWUsIGFzIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGZpcmUgZHVyaW5nIGRpYWxvZyBwb3B1bGF0aW9uIAorCQltZXRhLnNldENoYW5nZWQoY2hhbmdlZCk7CisKKwkJLy8gb3BlbiBkaWFsb2cgYW5kIGVudGVyIGV2ZW50IGxvb3AgCisJCXNoZWxsLm9wZW4oKTsKKwkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKKwkJCQlkaXNwbGF5LnNsZWVwKCk7CisJCX0KKworCQkvLyBhdCB0aGlzIHBvaW50IHRoZSBkaWFsb2cgaGFzIGNsb3NlZCwgc28gZWl0aGVyIG9rKCkgb3IgY2FuY2VsKCkgaGF2ZSBiZWVuIGV4ZWN1dGVkCisJCS8vIFRoZSAic3RlcG5hbWUiIHZhcmlhYmxlIGlzIGluaGVyaXRlZCBmcm9tIEJhc2VTdGVwRGlhbG9nCisJCXJldHVybiBzdGVwbmFtZTsKKwl9CisJCisJLyoqCisJICogVGhpcyBoZWxwZXIgbWV0aG9kIHB1dHMgdGhlIHN0ZXAgY29uZmlndXJhdGlvbiBzdG9yZWQgaW4gdGhlIG1ldGEgb2JqZWN0CisJICogYW5kIHB1dHMgaXQgaW50byB0aGUgZGlhbG9nIGNvbnRyb2xzLgorCSAqLworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURpYWxvZygpIHsKKwkJd1N0ZXBuYW1lLnNlbGVjdEFsbCgpOworCQl3RmlsZW5hbWVGaWVsZC5zZXRUZXh0KG1ldGEuZ2V0UHJvZHVjdFR5cGVGaWVsZCgpKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLnNldFRleHQobWV0YS5nZXRTZXJ2ZXJVUkxGaWVsZCgpKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLnNldFRleHQobWV0YS5nZXRSZXN1bHRGaWVsZCgpKTsKKyAgICAgICAgaWYobWV0YS5nZXRTZWFyY2hUeXBlKCkgPT0gU2VhcmNoLk5BTUUpeworICAgICAgICAgICAgcmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgc2VsZWN0ZWRzZWFyY2ggPSBTZWFyY2guTkFNRTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgcmFkaW9CdXR0b25zWzFdLnNldFNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgc2VsZWN0ZWRzZWFyY2ggPSBTZWFyY2guSUQ7CisgICAgICAgIH0KKworICAgICAgICBpZihtZXRhLmdldFByb2Nlc3NUeXBlKCkgPT0gUHJvY2Vzcy5MSVNUKXsKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uczJbMF0uc2V0U2VsZWN0aW9uKHRydWUpOworICAgICAgICAgICAgcmFkaW9CdXR0b25zMlsxXS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgc2VsZWN0ZWRwcm9jZXNzPSBQcm9jZXNzLkxJU1Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uczJbMV0uc2V0U2VsZWN0aW9uKHRydWUpOworICAgICAgICAgICAgcmFkaW9CdXR0b25zMlswXS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgc2VsZWN0ZWRwcm9jZXNzID0gUHJvY2Vzcy5HRVQ7CisgICAgICAgIH0KKworCX0KKworCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGRpYWxvZy4gIAorCSAqLworCXByaXZhdGUgdm9pZCBjYW5jZWwoKSB7CisJCS8vIFRoZSAic3RlcG5hbWUiIHZhcmlhYmxlIHdpbGwgYmUgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIG9wZW4oKSBtZXRob2QuIAorCQkvLyBTZXR0aW5nIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhhdCBkaWFsb2cgd2FzIGNhbmNlbGxlZC4KKwkJc3RlcG5hbWUgPSBudWxsOworCQkvLyBSZXN0b3Jpbmcgb3JpZ2luYWwgImNoYW5nZWQiIGZsYWcgb24gdGhlIG1ldCBhb2JqZWN0CisJCW1ldGEuc2V0Q2hhbmdlZChjaGFuZ2VkKTsKKwkJLy8gY2xvc2UgdGhlIFNXVCBkaWFsb2cgd2luZG93CisJCWRpc3Bvc2UoKTsKKwl9CisJCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY29uZmlybXMgdGhlIGRpYWxvZworCSAqLworCXByaXZhdGUgdm9pZCBvaygpIHsKKwkJc3RlcG5hbWUgPSB3U3RlcG5hbWUuZ2V0VGV4dCgpOyAKKyAgICAgICAgbWV0YS5zZXRQcm9kdWN0TmFtZSh3RmlsZW5hbWVGaWVsZC5nZXRUZXh0KCkpOworICAgICAgICBtZXRhLnNldFNlcnZlclVSTEZpZWxkKHdTZXJ2ZXJVUkxGaWVsZC5nZXRUZXh0KCkpOworICAgICAgICBtZXRhLnNldFJlc3VsdEZpZWxkKHdSZXN1bHRGaWVsZC5nZXRUZXh0KCkpOworICAgICAgICBtZXRhLnNldFByb2Nlc3NUeXBlKHNlbGVjdGVkcHJvY2Vzcyk7CisgICAgICAgIG1ldGEuc2V0U2VhcmNoVHlwZShzZWxlY3RlZHNlYXJjaCk7CisJCS8vIGNsb3NlIHRoZSBTV1QgZGlhbG9nIHdpbmRvdworCQlkaXNwb3NlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmdldC9GaWxlbWdyR2V0U3RlcE1ldGEuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvRmlsZW1nckdldFN0ZXBNZXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyOTVmYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvRmlsZW1nckdldFN0ZXBNZXRhLmphdmEKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyZ2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5DaGVja1Jlc3VsdDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLkNoZWNrUmVzdWx0SW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuYW5ub3RhdGlvbnMuU3RlcDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmRhdGFiYXNlLkRhdGFiYXNlTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5leGNlcHRpb24uS2V0dGxlU3RlcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVWYWx1ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVYTUxFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5WYWx1ZU1ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuVmFsdWVNZXRhSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlU3BhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS54bWwuWE1MSGFuZGxlcjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5pMThuLkJhc2VNZXNzYWdlczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5yZXBvc2l0b3J5Lk9iamVjdElkOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnJlcG9zaXRvcnkuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuc01ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcC4qOworaW1wb3J0IG9yZy5wZW50YWhvLm1ldGFzdG9yZS5hcGkuSU1ldGFTdG9yZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorKiBDb3B5cmlnaHQgMjAxNCBPU0JJIEx0ZAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitAU3RlcCgJCisJCWlkID0gIkZpbGVtZ3JHZXQiLAorICAgICAgICBpbWFnZSA9ICJvcmcvYXBhY2hlL29vZHQvZmlsZW1ncmNoZWNrL3Jlc291cmNlcy9jaGVjay9vb2R0LmpwZyIsCisJCWkxOG5QYWNrYWdlTmFtZT0iYmkubWV0ZW9yaXRlLmZpbGVtZ3JnZXQiLAorCQluYW1lPSJGaWxlbWdyR2V0U3RlcC5OYW1lIiwKKwkJZGVzY3JpcHRpb24gPSAiRmlsZW1nckdldFN0ZXAuVG9vbHRpcERlc2MiLAorCQljYXRlZ29yeURlc2NyaXB0aW9uPSJpMThuOm9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXA6QmFzZVN0ZXAuQ2F0ZWdvcnkuQmlnRGF0YSIKKykKK3B1YmxpYyBjbGFzcyBGaWxlbWdyR2V0U3RlcE1ldGEgZXh0ZW5kcyBCYXNlU3RlcE1ldGEgaW1wbGVtZW50cyBTdGVwTWV0YUludGVyZmFjZSB7CisKKwkvKioKKwkgKglUaGUgUEtHIG1lbWJlciBpcyB1c2VkIHdoZW4gbG9va2luZyB1cCBpbnRlcm5hdGlvbmFsaXplZCBzdHJpbmdzLgorCSAqCVRoZSBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBsb2NhbGl6ZWQga2V5cyBpcyBleHBlY3RlZCB0byByZXNpZGUgaW4gCisJICoJe3RoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcyBzcGVjaWZpZWR9L21lc3NhZ2VzL21lc3NhZ2VzX3tsb2NhbGV9LnByb3BlcnRpZXMgICAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBQS0cgPSBGaWxlbWdyR2V0U3RlcE1ldGEuY2xhc3M7IC8vIGZvciBpMThuIHB1cnBvc2VzCisJCisJLyoqCisJICogU3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCB0byB0aGUgcm93LXN0cmVhbS4gCisJICovCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyVVJMRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0RmllbGQ7CisgICAgcHJpdmF0ZSBTZWFyY2ggc2VhcmNodHlwZUZpZWxkOworICAgIHByaXZhdGUgUHJvY2VzcyBwcm9jZXNzdHlwZUZpZWxkOworCisgICAgLyoqCisJICogQ29uc3RydWN0b3Igc2hvdWxkIGNhbGwgc3VwZXIoKSB0byBtYWtlIHN1cmUgdGhlIGJhc2UgY2xhc3MgaGFzIGEgY2hhbmNlIHRvIGluaXRpYWxpemUgcHJvcGVybHkuCisJICovCisJcHVibGljIEZpbGVtZ3JHZXRTdGVwTWV0YSgpIHsKKwkJc3VwZXIoKTsgCisJfQorCQorCS8qKgorCSAqIENhbGxlZCBieSBTcG9vbiB0byBnZXQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNXVCBkaWFsb2cgZm9yIHRoZSBzdGVwLgorCSAqIEEgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gcGFzc2luZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3RlcCBkaWFsb2cgaXMgcmVjb21tZW5kZWQuCisJICogCisJICogQHBhcmFtIHNoZWxsCQlhbiBTV1QgU2hlbGwKKwkgKiBAcGFyYW0gbWV0YSAJCWRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwIAorCSAqIEBwYXJhbSB0cmFuc01ldGEJZGVzY3JpcHRpb24gb2YgdGhlIHRoZSB0cmFuc2Zvcm1hdGlvbiAKKwkgKiBAcGFyYW0gbmFtZQkJdGhlIG5hbWUgb2YgdGhlIHN0ZXAKKwkgKiBAcmV0dXJuIAkJCW5ldyBpbnN0YW5jZSBvZiBhIGRpYWxvZyBmb3IgdGhpcyBzdGVwIAorCSAqLworCXB1YmxpYyBTdGVwRGlhbG9nSW50ZXJmYWNlIGdldERpYWxvZyhTaGVsbCBzaGVsbCwgU3RlcE1ldGFJbnRlcmZhY2UgbWV0YSwgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyR2V0U3RlcERpYWxvZyhzaGVsbCwgbWV0YSwgdHJhbnNNZXRhLCBuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgYnkgUERJIHRvIGdldCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3RlcCBpbXBsZW1lbnRhdGlvbi4gCisJICogQSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBwYXNzaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdGVwIGNsYXNzIGlzIHJlY29tbWVuZGVkLgorCSAqIAorZ2YJICogQHBhcmFtIHN0ZXBNZXRhCQkJCWRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwCisJICogQHBhcmFtIHN0ZXBEYXRhSW50ZXJmYWNlCQlpbnN0YW5jZSBvZiBhIHN0ZXAgZGF0YSBjbGFzcworCSAqIEBwYXJhbSBjbnIJCQkJCWNvcHkgbnVtYmVyCisJICogQHBhcmFtIHRyYW5zTWV0YQkJCQlkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcGFyYW0gZGlzcAkJCQkJcnVudGltZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcmV0dXJuCQkJCQkJdGhlIG5ldyBpbnN0YW5jZSBvZiBhIHN0ZXAgaW1wbGVtZW50YXRpb24gCisJICovCisJcHVibGljIFN0ZXBJbnRlcmZhY2UgZ2V0U3RlcChTdGVwTWV0YSBzdGVwTWV0YSwgU3RlcERhdGFJbnRlcmZhY2Ugc3RlcERhdGFJbnRlcmZhY2UsIGludCBjbnIsIFRyYW5zTWV0YSB0cmFuc01ldGEsIFRyYW5zIGRpc3ApIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyR2V0U3RlcChzdGVwTWV0YSwgc3RlcERhdGFJbnRlcmZhY2UsIGNuciwgdHJhbnNNZXRhLCBkaXNwKTsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgYnkgUERJIHRvIGdldCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3RlcCBkYXRhIGNsYXNzLgorCSAqLworCXB1YmxpYyBTdGVwRGF0YUludGVyZmFjZSBnZXRTdGVwRGF0YSgpIHsKKwkJcmV0dXJuIG5ldyBGaWxlbWdyR2V0U3RlcERhdGEoKTsKKwl9CQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuZXcgc3RlcCBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYWxsb2NhdGUvc2V0IHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24KKwkgKiB0byBzZW5zaWJsZSBkZWZhdWx0cy4gVGhlIHZhbHVlcyBzZXQgaGVyZSB3aWxsIGJlIHVzZWQgYnkgU3Bvb24gd2hlbiBhIG5ldyBzdGVwIGlzIGNyZWF0ZWQuICAgIAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoKSB7CisJCW91dHB1dEZpZWxkID0gImRlbW9fZmllbGQiOworICAgICAgICBzZXJ2ZXJVUkxGaWVsZCA9ICJodHRwOi8vbG9jYWxob3N0OjkwMDAiOworICAgICAgICByZXN1bHRGaWVsZCA9ICJyZXN1bHQiOworICAgICAgICBwcm9kdWN0TmFtZSA9ICJHZW5lcmljRmlsZSI7CisgICAgICAgIHNlYXJjaHR5cGVGaWVsZCA9IFNlYXJjaC5OQU1FOworICAgICAgICBwcm9jZXNzdHlwZUZpZWxkID0gUHJvY2Vzcy5MSVNUOworCX0KKwkKKwkvKioKKwkgKiBHZXR0ZXIgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCBieSB0aGlzIHN0ZXAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZAorCSAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpZWxkKCkgeworCQlyZXR1cm4gb3V0cHV0RmllbGQ7CisJfQorCisJLyoqCisJICogU2V0dGVyIGZvciB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWRkZWQgYnkgdGhpcyBzdGVwCisJICogQHBhcmFtIG91dHB1dEZpZWxkIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE91dHB1dEZpZWxkKFN0cmluZyBvdXRwdXRGaWVsZCkgeworCQl0aGlzLm91dHB1dEZpZWxkID0gb3V0cHV0RmllbGQ7CisJfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RUeXBlRmllbGQoKXsKKyAgICAgICAgcmV0dXJuIHByb2R1Y3ROYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3ROYW1lKFN0cmluZyBwcm9kdWN0TmFtZSl7CisgICAgICAgIHRoaXMucHJvZHVjdE5hbWUgPSBwcm9kdWN0TmFtZTsKKyAgICB9CisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIGEgc3RlcCBpcyBkdXBsaWNhdGVkIGluIFNwb29uLiBJdCBuZWVkcyB0byByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcworCSAqIHN0ZXAgbWV0YSBvYmplY3QuIEJlIHN1cmUgdG8gY3JlYXRlIHByb3BlciBkZWVwIGNvcGllcyBpZiB0aGUgc3RlcCBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbgorCSAqIG1vZGlmaWFibGUgb2JqZWN0cy4KKwkgKiAKKwkgKiBTZWUgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcHMucm93Z2VuZXJhdG9yLlJvd0dlbmVyYXRvck1ldGEuY2xvbmUoKSBmb3IgYW4gZXhhbXBsZSBvbiBjcmVhdGluZworCSAqIGEgZGVlcCBjb3B5LgorCSAqIAorCSAqIEByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcworCSAqLworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgU3Bvb24gd2hlbiBhIHN0ZXAgbmVlZHMgdG8gc2VyaWFsaXplIGl0cyBjb25maWd1cmF0aW9uIHRvIFhNTC4gVGhlIGV4cGVjdGVkCisJICogcmV0dXJuIHZhbHVlIGlzIGFuIFhNTCBmcmFnbWVudCBjb25zaXN0aW5nIG9mIG9uZSBvciBtb3JlIFhNTCB0YWdzLiAgCisJICogCisJICogUGxlYXNlIHVzZSBvcmcucGVudGFoby5kaS5jb3JlLnhtbC5YTUxIYW5kbGVyIHRvIGNvbnZlbmllbnRseSBnZW5lcmF0ZSB0aGUgWE1MLgorCSAqIAorCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgWE1MIHNlcmlhbGl6YXRpb24gb2YgdGhpcyBzdGVwCisJICovCisJcHVibGljIFN0cmluZyBnZXRYTUwoKSB0aHJvd3MgS2V0dGxlVmFsdWVFeGNlcHRpb24geworCQkKKwkJLy8gb25seSBvbmUgZmllbGQgdG8gc2VyaWFsaXplCisJCVN0cmluZyB4bWwgPSAgIiAiOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJvdXRwdXRmaWVsZCIsIG91dHB1dEZpZWxkKTsKKyAgICAgICAgeG1sICs9ICIgICAgIiArWE1MSGFuZGxlci5hZGRUYWdWYWx1ZSgiZmlsZW5hbWVmaWVsZCIsIHByb2R1Y3ROYW1lKTsKKyAgICAgICAgeG1sICs9ICIgICAgIiArWE1MSGFuZGxlci5hZGRUYWdWYWx1ZSgic2VydmVydXJsZmllbGQiLCBzZXJ2ZXJVUkxGaWVsZCk7CisgICAgICAgIHhtbCArPSAiICAgICIgK1hNTEhhbmRsZXIuYWRkVGFnVmFsdWUoInJlc3VsdGZpZWxkIiwgcmVzdWx0RmllbGQpOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJwcm9kdWN0dHlwZWZpZWxkIiwgcHJvZHVjdE5hbWUpOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJzZWFyY2h0eXBlZmllbGQiLCBzZWFyY2h0eXBlRmllbGQudG9TdHJpbmcoKSk7CisgICAgICAgIHhtbCArPSAiICAgICIgK1hNTEhhbmRsZXIuYWRkVGFnVmFsdWUoInByb2Nlc3N0eXBlZmllbGQiLCBwcm9jZXNzdHlwZUZpZWxkLnRvU3RyaW5nKCkpOworCQlyZXR1cm4geG1sOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQREkgd2hlbiBhIHN0ZXAgbmVlZHMgdG8gbG9hZCBpdHMgY29uZmlndXJhdGlvbiBmcm9tIFhNTC4KKwkgKiAKKwkgKiBQbGVhc2UgdXNlIG9yZy5wZW50YWhvLmRpLmNvcmUueG1sLlhNTEhhbmRsZXIgdG8gY29udmVuaWVudGx5IHJlYWQgZnJvbSB0aGUKKwkgKiBYTUwgbm9kZSBwYXNzZWQgaW4uCisJICogCisJICogQHBhcmFtIHN0ZXBub2RlCXRoZSBYTUwgbm9kZSBjb250YWluaW5nIHRoZSBjb25maWd1cmF0aW9uCisJICogQHBhcmFtIGRhdGFiYXNlcwl0aGUgZGF0YWJhc2VzIGF2YWlsYWJsZSBpbiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiBAcGFyYW0gbWV0YVN0b3JlIHRoZSBtZXRhU3RvcmUgdG8gb3B0aW9uYWxseSByZWFkIGZyb20KKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2FkWE1MKE5vZGUgc3RlcG5vZGUsIExpc3Q8RGF0YWJhc2VNZXRhPiBkYXRhYmFzZXMsIElNZXRhU3RvcmUgbWV0YVN0b3JlKSB0aHJvd3MgS2V0dGxlWE1MRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJc2V0T3V0cHV0RmllbGQoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAib3V0cHV0ZmllbGQiKSkpOworICAgICAgICAgICAgc2V0UHJvZHVjdE5hbWUoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAiZmlsZW5hbWVmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRTZXJ2ZXJVUkxGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJzZXJ2ZXJ1cmxmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRSZXN1bHRGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJyZXN1bHRmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRQcm9kdWN0TmFtZShYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJwcm9kdWN0dHlwZWZpZWxkIikpKTsKKyAgICAgICAgICAgIHNldFNlYXJjaFR5cGUoU2VhcmNoLnZhbHVlT2YoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAic2VhcmNodHlwZWZpZWxkIikpKSk7CisgICAgICAgICAgICBzZXRQcm9jZXNzVHlwZShQcm9jZXNzLnZhbHVlT2YoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAicHJvY2Vzc3R5cGVmaWVsZCIpKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgS2V0dGxlWE1MRXhjZXB0aW9uKCJEZW1vIHBsdWdpbiB1bmFibGUgdG8gcmVhZCBzdGVwIGluZm8gZnJvbSBYTUwgbm9kZSIsIGUpOworCQl9CisKKwl9CQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBTcG9vbiB3aGVuIGEgc3RlcCBuZWVkcyB0byBzZXJpYWxpemUgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYSByZXBvc2l0b3J5LgorCSAqIFRoZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyB0byBzYXZlIHRoZSBzdGVwIGF0dHJpYnV0ZXMuCisJICoKKwkgKiBAcGFyYW0gcmVwCQkJCQl0aGUgcmVwb3NpdG9yeSB0byBzYXZlIHRvCisJICogQHBhcmFtIG1ldGFTdG9yZQkJCQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgd3JpdGUgdG8KKwkgKiBAcGFyYW0gaWRfdHJhbnNmb3JtYXRpb24JCXRoZSBpZCB0byB1c2UgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiB3aGVuIHNhdmluZworCSAqIEBwYXJhbSBpZF9zdGVwCQkJCXRoZSBpZCB0byB1c2UgZm9yIHRoZSBzdGVwICB3aGVuIHNhdmluZworCSAqLworCXB1YmxpYyB2b2lkIHNhdmVSZXAoUmVwb3NpdG9yeSByZXAsIElNZXRhU3RvcmUgbWV0YVN0b3JlLCBPYmplY3RJZCBpZF90cmFuc2Zvcm1hdGlvbiwgT2JqZWN0SWQgaWRfc3RlcCkgdGhyb3dzIEtldHRsZUV4Y2VwdGlvbgorCXsKKwkJdHJ5eworCQkJcmVwLnNhdmVTdGVwQXR0cmlidXRlKGlkX3RyYW5zZm9ybWF0aW9uLCBpZF9zdGVwLCAib3V0cHV0ZmllbGQiLCBvdXRwdXRGaWVsZCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgS2V0dGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gc2F2ZSBzdGVwIGludG8gcmVwb3NpdG9yeTogIitpZF9zdGVwLCBlKTsgCisJCX0KKwl9CQkKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIHdoZW4gYSBzdGVwIG5lZWRzIHRvIHJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIHJlcG9zaXRvcnkuCisJICogVGhlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBtZXRob2RzIHRvIHJlYWQgdGhlIHN0ZXAgYXR0cmlidXRlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVwCQl0aGUgcmVwb3NpdG9yeSB0byByZWFkIGZyb20KKwkgKiBAcGFyYW0gbWV0YVN0b3JlCXRoZSBtZXRhU3RvcmUgdG8gb3B0aW9uYWxseSByZWFkIGZyb20KKwkgKiBAcGFyYW0gaWRfc3RlcAl0aGUgaWQgb2YgdGhlIHN0ZXAgYmVpbmcgcmVhZAorCSAqIEBwYXJhbSBkYXRhYmFzZXMJdGhlIGRhdGFiYXNlcyBhdmFpbGFibGUgaW4gdGhlIHRyYW5zZm9ybWF0aW9uCisJICovCisJcHVibGljIHZvaWQgcmVhZFJlcChSZXBvc2l0b3J5IHJlcCwgSU1ldGFTdG9yZSBtZXRhU3RvcmUsIE9iamVjdElkIGlkX3N0ZXAsIExpc3Q8RGF0YWJhc2VNZXRhPiBkYXRhYmFzZXMpIHRocm93cyBLZXR0bGVFeGNlcHRpb24gIHsKKwkJdHJ5eworCQkJb3V0cHV0RmllbGQgID0gcmVwLmdldFN0ZXBBdHRyaWJ1dGVTdHJpbmcoaWRfc3RlcCwgIm91dHB1dGZpZWxkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgS2V0dGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBzdGVwIGZyb20gcmVwb3NpdG9yeSIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgY2hhbmdlcyB0aGUgc3RlcCBpcyBtYWtpbmcgdG8gdGhlIHJvdy1zdHJlYW0uCisJICogVG8gdGhhdCBlbmQgYSBSb3dNZXRhSW50ZXJmYWNlIG9iamVjdCBpcyBwYXNzZWQgaW4sIGNvbnRhaW5pbmcgdGhlIHJvdy1zdHJlYW0gc3RydWN0dXJlIGFzIGl0IGlzIHdoZW4gZW50ZXJpbmcKKwkgKiB0aGUgc3RlcC4gVGhpcyBtZXRob2QgbXVzdCBhcHBseSBhbnkgY2hhbmdlcyB0aGUgc3RlcCBtYWtlcyB0byB0aGUgcm93IHN0cmVhbS4gVXN1YWxseSBhIHN0ZXAgYWRkcyBmaWVsZHMgdG8gdGhlCisJICogcm93LXN0cmVhbS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRSb3dNZXRhCQl0aGUgcm93IHN0cnVjdHVyZSBjb21pbmcgaW4gdG8gdGhlIHN0ZXAKKwkgKiBAcGFyYW0gbmFtZSAJCQkJdGhlIG5hbWUgb2YgdGhlIHN0ZXAgbWFraW5nIHRoZSBjaGFuZ2VzCisJICogQHBhcmFtIGluZm8JCQkJcm93IHN0cnVjdHVyZXMgb2YgYW55IGluZm8gc3RlcHMgY29taW5nIGluCisJICogQHBhcmFtIG5leHRTdGVwCQkJdGhlIGRlc2NyaXB0aW9uIG9mIGEgc3RlcCB0aGlzIHN0ZXAgaXMgcGFzc2luZyByb3dzIHRvCisJICogQHBhcmFtIHNwYWNlCQkJCXRoZSB2YXJpYWJsZSBzcGFjZSBmb3IgcmVzb2x2aW5nIHZhcmlhYmxlcworCSAqIEBwYXJhbSByZXBvc2l0b3J5CQl0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZSBvcHRpb25hbGx5IHJlYWQgZnJvbQorCSAqIEBwYXJhbSBtZXRhU3RvcmUJCQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgZ2V0RmllbGRzKFJvd01ldGFJbnRlcmZhY2UgaW5wdXRSb3dNZXRhLCBTdHJpbmcgbmFtZSwgUm93TWV0YUludGVyZmFjZVtdIGluZm8sIFN0ZXBNZXRhIG5leHRTdGVwLCBWYXJpYWJsZVNwYWNlIHNwYWNlLCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIElNZXRhU3RvcmUgbWV0YVN0b3JlKSB0aHJvd3MgS2V0dGxlU3RlcEV4Y2VwdGlvbnsKKworCQkvKgorCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMgdGhlIG91dHB1dEZpZWxkIHRvIHRoZSByb3ctc3RyZWFtCisJCSAqLworICAgICAgICBpZihnZXRQcm9jZXNzVHlwZSgpID09IFByb2Nlc3MuTElTVCl7CisJCS8vIGEgdmFsdWUgbWV0YSBvYmplY3QgY29udGFpbnMgdGhlIG1ldGEgZGF0YSBmb3IgYSBmaWVsZAorCQlWYWx1ZU1ldGFJbnRlcmZhY2UgdiA9IG5ldyBWYWx1ZU1ldGEoImlkIiwgVmFsdWVNZXRhLlRZUEVfU1RSSU5HKTsKKwkJCisJCS8vIHNldHRpbmcgdHJpbSB0eXBlIHRvICJib3RoIgorCQl2LnNldFRyaW1UeXBlKFZhbHVlTWV0YS5UUklNX1RZUEVfQk9USCk7CisKKwkJLy8gdGhlIG5hbWUgb2YgdGhlIHN0ZXAgdGhhdCBhZGRzIHRoaXMgZmllbGQKKwkJdi5zZXRPcmlnaW4obmFtZSk7CisJCQorCQkvLyBtb2RpZnkgdGhlIHJvdyBzdHJ1Y3R1cmUgYW5kIGFkZCB0aGUgZmllbGQgdGhpcyBzdGVwIGdlbmVyYXRlcyAgCisJCWlucHV0Um93TWV0YS5hZGRWYWx1ZU1ldGEodik7CisKKyAgICAgICAgVmFsdWVNZXRhSW50ZXJmYWNlIHYyID0gbmV3IFZhbHVlTWV0YSgidHlwZSIsIFZhbHVlTWV0YS5UWVBFX1NUUklORyk7CisgICAgICAgIHYyLnNldFRyaW1UeXBlKFZhbHVlTWV0YS5UUklNX1RZUEVfQk9USCk7CisgICAgICAgIHYyLnNldE9yaWdpbihuYW1lKTsKKyAgICAgICAgaW5wdXRSb3dNZXRhLmFkZFZhbHVlTWV0YSh2Mik7CisKKyAgICAgICAgVmFsdWVNZXRhSW50ZXJmYWNlIHYzID0gbmV3IFZhbHVlTWV0YSgibmFtZSIsIFZhbHVlTWV0YS5UWVBFX1NUUklORyk7CisgICAgICAgIHYzLnNldFRyaW1UeXBlKFZhbHVlTWV0YS5UUklNX1RZUEVfQk9USCk7CisgICAgICAgIHYzLnNldE9yaWdpbihuYW1lKTsKKyAgICAgICAgaW5wdXRSb3dNZXRhLmFkZFZhbHVlTWV0YSh2Myk7CisKKyAgICAgICAgVmFsdWVNZXRhSW50ZXJmYWNlIHY0ID0gbmV3IFZhbHVlTWV0YSgic3RydWN0dXJlIiwgVmFsdWVNZXRhLlRZUEVfU1RSSU5HKTsKKyAgICAgICAgdjQuc2V0VHJpbVR5cGUoVmFsdWVNZXRhLlRSSU1fVFlQRV9CT1RIKTsKKyAgICAgICAgdjQuc2V0T3JpZ2luKG5hbWUpOworICAgICAgICBpbnB1dFJvd01ldGEuYWRkVmFsdWVNZXRhKHY0KTsKKworICAgICAgICBWYWx1ZU1ldGFJbnRlcmZhY2UgdjUgPSBuZXcgVmFsdWVNZXRhKCJ0cmFuc2ZlcnN0YXR1cyIsIFZhbHVlTWV0YS5UWVBFX1NUUklORyk7CisgICAgICAgIHY1LnNldFRyaW1UeXBlKFZhbHVlTWV0YS5UUklNX1RZUEVfQk9USCk7CisgICAgICAgIHY1LnNldE9yaWdpbihuYW1lKTsKKyAgICAgICAgaW5wdXRSb3dNZXRhLmFkZFZhbHVlTWV0YSh2NSk7CisKKyAgICAgICAgVmFsdWVNZXRhSW50ZXJmYWNlIHY2ID0gbmV3IFZhbHVlTWV0YSgibWV0YWRhdGEiLCBWYWx1ZU1ldGEuVFlQRV9TVFJJTkcpOworICAgICAgICB2Ni5zZXRUcmltVHlwZShWYWx1ZU1ldGEuVFJJTV9UWVBFX0JPVEgpOworICAgICAgICB2Ni5zZXRPcmlnaW4obmFtZSk7CisgICAgICAgIGlucHV0Um93TWV0YS5hZGRWYWx1ZU1ldGEodjYpOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBWYWx1ZU1ldGFJbnRlcmZhY2UgdjYgPSBuZXcgVmFsdWVNZXRhKCJleHBvcnQiLCBWYWx1ZU1ldGEuVFlQRV9TVFJJTkcpOworICAgICAgICAgICAgdjYuc2V0VHJpbVR5cGUoVmFsdWVNZXRhLlRSSU1fVFlQRV9CT1RIKTsKKyAgICAgICAgICAgIHY2LnNldE9yaWdpbihuYW1lKTsKKyAgICAgICAgICAgIGlucHV0Um93TWV0YS5hZGRWYWx1ZU1ldGEodjYpOworICAgICAgICB9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgIlZlcmlmeSBUcmFuc2Zvcm1hdGlvbiIgb3B0aW9uIGluIFNwb29uLiAKKwkgKiBBIGxpc3Qgb2YgcmVtYXJrcyBpcyBwYXNzZWQgaW4gdGhhdCB0aGlzIG1ldGhvZCBzaG91bGQgYWRkIHRvLiBFYWNoIHJlbWFyayBpcyBhIGNvbW1lbnQsIHdhcm5pbmcsIGVycm9yLCBvciBvay4KKwkgKiBUaGUgbWV0aG9kIHNob3VsZCBwZXJmb3JtIGFzIG1hbnkgY2hlY2tzIGFzIG5lY2Vzc2FyeSB0byBjYXRjaCBkZXNpZ24tdGltZSBlcnJvcnMuCisJICogCisJICogVHlwaWNhbCBjaGVja3MgaW5jbHVkZToKKwkgKiAtIHZlcmlmeSB0aGF0IGFsbCBtYW5kYXRvcnkgY29uZmlndXJhdGlvbiBpcyBnaXZlbgorCSAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0ZXAgcmVjZWl2ZXMgYW55IGlucHV0LCB1bmxlc3MgaXQncyBhIHJvdyBnZW5lcmF0aW5nIHN0ZXAKKwkgKiAtIHZlcmlmeSB0aGF0IHRoZSBzdGVwIGRvZXMgbm90IHJlY2VpdmUgYW55IGlucHV0IGlmIGl0IGRvZXMgbm90IHRha2UgdGhlbSBpbnRvIGFjY291bnQKKwkgKiAtIHZlcmlmeSB0aGF0IHRoZSBzdGVwIGZpbmRzIGZpZWxkcyBpdCByZWxpZXMgb24gaW4gdGhlIHJvdy1zdHJlYW0KKwkgKiAKKwkgKiAgIEBwYXJhbSByZW1hcmtzCQl0aGUgbGlzdCBvZiByZW1hcmtzIHRvIGFwcGVuZCB0bworCSAqICAgQHBhcmFtIHRyYW5zTWV0YQl0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uCisJICogICBAcGFyYW0gc3RlcE1ldGEJdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwCisJICogICBAcGFyYW0gcHJldgkJdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5jb21pbmcgcm93LXN0cmVhbQorCSAqICAgQHBhcmFtIGlucHV0CQluYW1lcyBvZiBzdGVwcyBzZW5kaW5nIGlucHV0IHRvIHRoZSBzdGVwCisJICogICBAcGFyYW0gb3V0cHV0CQluYW1lcyBvZiBzdGVwcyB0aGlzIHN0ZXAgaXMgc2VuZGluZyBvdXRwdXQgdG8KKwkgKiAgIEBwYXJhbSBpbmZvCQlmaWVsZHMgY29taW5nIGluIGZyb20gaW5mbyBzdGVwcyAKKwkgKiAgIEBwYXJhbSBtZXRhU3RvcmUJbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgY2hlY2soTGlzdDxDaGVja1Jlc3VsdEludGVyZmFjZT4gcmVtYXJrcywgVHJhbnNNZXRhIHRyYW5zTWV0YSwgU3RlcE1ldGEgc3RlcE1ldGEsIFJvd01ldGFJbnRlcmZhY2UgcHJldiwgU3RyaW5nIGlucHV0W10sIFN0cmluZyBvdXRwdXRbXSwgUm93TWV0YUludGVyZmFjZSBpbmZvLCBWYXJpYWJsZVNwYWNlIHNwYWNlLCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIElNZXRhU3RvcmUgbWV0YVN0b3JlKSAgeworCQkKKwkJQ2hlY2tSZXN1bHQgY3I7CisKKwkJLy8gU2VlIGlmIHRoZXJlIGFyZSBpbnB1dCBzdHJlYW1zIGxlYWRpbmcgdG8gdGhpcyBzdGVwIQorCQlpZiAoaW5wdXQubGVuZ3RoID4gMCkgeworCQkJY3IgPSBuZXcgQ2hlY2tSZXN1bHQoQ2hlY2tSZXN1bHQuVFlQRV9SRVNVTFRfT0ssIEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRGVtby5DaGVja1Jlc3VsdC5SZWNlaXZpbmdSb3dzLk9LIiksIHN0ZXBNZXRhKTsKKwkJCXJlbWFya3MuYWRkKGNyKTsKKwkJfSBlbHNlIHsKKwkJCWNyID0gbmV3IENoZWNrUmVzdWx0KENoZWNrUmVzdWx0LlRZUEVfUkVTVUxUX0VSUk9SLCBCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkRlbW8uQ2hlY2tSZXN1bHQuUmVjZWl2aW5nUm93cy5FUlJPUiIpLCBzdGVwTWV0YSk7CisJCQlyZW1hcmtzLmFkZChjcik7CisJCX0JCisgICAgCQorCX0KKworCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyVVJMRmllbGQoU3RyaW5nIHNlcnZlclVSTEZpZWxkKSB7CisgICAgICAgIHRoaXMuc2VydmVyVVJMRmllbGQgPSBzZXJ2ZXJVUkxGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclVSTEZpZWxkKCkgeworICAgICAgICByZXR1cm4gc2VydmVyVVJMRmllbGQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHRGaWVsZChTdHJpbmcgcmVzdWx0RmllbGQpIHsKKyAgICAgICAgdGhpcy5yZXN1bHRGaWVsZCA9IHJlc3VsdEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0RmllbGQoKSB7CisgICAgICAgIHJldHVybiByZXN1bHRGaWVsZDsKKyAgICB9CisKKworICAgIHB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3NUeXBlKCkgeworCisgICAgICAgIHJldHVybiBwcm9jZXNzdHlwZUZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NUeXBlKFByb2Nlc3MgcHJvY2Vzc3R5cGVGaWVsZCl7CisgICAgICAgIHRoaXMucHJvY2Vzc3R5cGVGaWVsZCA9IHByb2Nlc3N0eXBlRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIFNlYXJjaCBnZXRTZWFyY2hUeXBlKCkgeworICAgICAgICByZXR1cm4gc2VhcmNodHlwZUZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlYXJjaFR5cGUoU2VhcmNoIHNlYXJjaFR5cGUpeworICAgICAgICB0aGlzLnNlYXJjaHR5cGVGaWVsZCA9IHNlYXJjaFR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb29rdXAoKSB7CisgICAgICAgIHJldHVybiByZXN1bHRGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb29rdXAoU3RyaW5nIGxvb2t1cCl7CisgICAgICAgIHRoaXMucmVzdWx0RmllbGQgPSBsb29rdXA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmdldC9PT0RUQ29uZmlnLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L09PRFRDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzI5NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmdldC9PT0RUQ29uZmlnLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JnZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyogQ29weXJpZ2h0IDIwMTQgT1NCSSBMdGQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBPT0RUQ29uZmlnIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoT09EVENvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gbnVsbDsKKworICAgIHB1YmxpYyBib29sZWFuIGxvYWRYTUxScGNDbGllbnQoU3RyaW5nIGZtVXJsU3RyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZm1VcmxTdHIpLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0WE1MUnBjQ2xpZW50KCl7CisgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L09PRFRQcm9jZXNzZXMuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvT09EVFByb2Nlc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjQ3YWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L09PRFRQcm9jZXNzZXMuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JnZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuZGF0YXRyYW5zZmVyLkxvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkRhdGFUcmFuc2ZlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBDb3B5cmlnaHQgMjAxNCBPU0JJIEx0ZAorICogPHAvPgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwLz4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHAvPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBPT0RUUHJvY2Vzc2VzIHsKKworCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGdldEFsbFByb2R1Y3RzKE9PRFRDb25maWcgY29uZmlnLCBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gY29uZmlnLmdldFhNTFJwY0NsaWVudCgpOworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gY2xpZW50LmdldFByb2R1Y3RUeXBlQnlOYW1lKHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgUHJvZHVjdFR5cGUiKTsKKyAgICAgICAgfQorICAgICAgICBQcm9kdWN0UGFnZSBmaXJzdFBhZ2UgPSBjbGllbnQuZ2V0Rmlyc3RQYWdlKHR5cGUpOworICAgICAgICBpZiAoZmlyc3RQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZpbGVNYW5hZ2VyIHJldHVybmVkIG51bGwgcHJvZHVjdCBwYWdlIik7CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiBvID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PigpOworCisgICAgICAgIGZvciAoaW50IHBpZCA9IDA7IHBpZCA8IGZpcnN0UGFnZS5nZXRUb3RhbFBhZ2VzKCk7IHBpZCsrKSB7CisgICAgICAgICAgICBpZiAocGlkID4gMCkgeworICAgICAgICAgICAgICAgIGZpcnN0UGFnZSA9IGNsaWVudC5nZXROZXh0UGFnZSh0eXBlLCBmaXJzdFBhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChQcm9kdWN0IHAgOiBmaXJzdFBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkpIHsKKyAgICAgICAgICAgICAgICBNZXRhZGF0YSBtZXQgPSBjbGllbnQuZ2V0TWV0YWRhdGEocCk7CisKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBoLnB1dCgibmFtZSIsIHAuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaC5wdXQoInR5cGUiLCBwLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBoLnB1dCgic3RydWN0dXJlIiwgcC5nZXRQcm9kdWN0U3RydWN0dXJlKCkpOworICAgICAgICAgICAgICAgIGgucHV0KCJ0cmFuc2ZlcnN0YXR1cyIsIHAuZ2V0VHJhbnNmZXJTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgR3NvbiBnID0gbmV3IEdzb24oKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcganNvbiA9IGcudG9Kc29uKG1ldC5nZXRIYXNodGFibGUoKSk7CisgICAgICAgICAgICAgICAgaC5wdXQoIm1ldGFkYXRhIiwganNvbik7CisgICAgICAgICAgICAgICAgby5wdXQocC5nZXRQcm9kdWN0SWQoKSwgaCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHJldHVybiBvOworCisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RCeUlEKE9PRFRDb25maWcgY29uZmlnLCBTdHJpbmcgaWQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRGF0YVRyYW5zZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gY29uZmlnLmdldFhNTFJwY0NsaWVudCgpLmdldFByb2R1Y3RCeUlkKGlkKTsKKyAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhjb25maWcuZ2V0WE1MUnBjQ2xpZW50KCkuZ2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCkpOworICAgICAgICBMb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkgbGR0ZiA9IG5ldyBMb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkoKTsKKyAgICAgICAgRGF0YVRyYW5zZmVyIGR0ID0gbGR0Zi5jcmVhdGVEYXRhVHJhbnNmZXIoKTsKKyAgICAgICAgU3RyaW5nIHJhbmQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgICAgICBGaWxlIHRoZURpciA9IG5ldyBGaWxlKCIvdG1wL29vZHQvIiArIHJhbmQpOworICAgICAgICBib29sZWFuIG1rZGlyID0gZmFsc2U7CisgICAgICAgIGlmICghdGhlRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBta2RpciA9IHRoZURpci5ta2RpcigpOworICAgICAgICB9CisgICAgICAgIGlmIChta2RpcikgeworICAgICAgICAgICAgZHQucmV0cmlldmVQcm9kdWN0KHByb2R1Y3QsIG5ldyBGaWxlKCIvdG1wL29vZHQvIiArIHJhbmQpKTsKKyAgICAgICAgICAgIHJldHVybiAiL3RtcC9vb2R0LyIgKyByYW5kICsgIi8iICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RCeU5hbWUoT09EVENvbmZpZyBjb25maWcsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIERhdGFUcmFuc2ZlckV4Y2VwdGlvbiB7CisgICAgICAgIFByb2R1Y3QgcHJvZHVjdCA9IGNvbmZpZy5nZXRYTUxScGNDbGllbnQoKS5nZXRQcm9kdWN0QnlOYW1lKG5hbWUpOworICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKGNvbmZpZy5nZXRYTUxScGNDbGllbnQoKS5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KSk7CisgICAgICAgIExvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSBsZHRmID0gbmV3IExvY2FsRGF0YVRyYW5zZmVyRmFjdG9yeSgpOworICAgICAgICBEYXRhVHJhbnNmZXIgZHQgPSBsZHRmLmNyZWF0ZURhdGFUcmFuc2ZlcigpOworICAgICAgICBTdHJpbmcgcmFuZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgICAgIEZpbGUgdGhlRGlyID0gbmV3IEZpbGUoIi90bXAvb29kdC8iICsgcmFuZCk7CisgICAgICAgIGJvb2xlYW4gbWtkaXIgPSBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGVEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1rZGlyID0gdGhlRGlyLm1rZGlyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1rZGlyKSB7CisgICAgICAgICAgICBkdC5yZXRyaWV2ZVByb2R1Y3QocHJvZHVjdCwgbmV3IEZpbGUoIi90bXAvb29kdC8iICsgcmFuZCkpOworICAgICAgICAgICAgcmV0dXJuICIvdG1wL29vZHQvIiArIHJhbmQgKyAiLyIgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L1Byb2Nlc3MuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvUHJvY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODBlMGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L1Byb2Nlc3MuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmdldDsKKworLyoqCisqIENvcHlyaWdodCAyMDE0IE9TQkkgTHRkCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwdWJsaWMgZW51bSBQcm9jZXNzIHsKKyAgICBMSVNULEdFVAorfQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmdldC9TZWFyY2guamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvU2VhcmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZDVhZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvU2VhcmNoLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3JnZXQ7CisKKy8qKgorKiBDb3B5cmlnaHQgMjAxNCBPU0JJIEx0ZAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcHVibGljIGVudW0gU2VhcmNoIHsKKyAgICBOQU1FLElECit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L21lc3NhZ2VzL21lc3NhZ2VzX2VuX1VTLnByb3BlcnRpZXMgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L21lc3NhZ2VzL21lc3NhZ2VzX2VuX1VTLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMTU1YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvbWVzc2FnZXMvbWVzc2FnZXNfZW5fVVMucHJvcGVydGllcwpAQCAtMCwwICsxLDkgQEAKK0ZpbGVtZ3JHZXRTdGVwLk5hbWU9T09EVCBGaWxlbWdyIEZpbGUgR2V0CitGaWxlbWdyR2V0U3RlcC5Ub29sdGlwRGVzYz1HZXQgdGhlIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQorCitGaWxlbWdyR2V0LlByb2R1Y3RUeXBlLkxhYmVsPVByb2R1Y3QgVHlwZSBGaWVsZAorRmlsZW1nckdldC5Qcm9jZXNzVHlwZS5MYWJlbD1Qcm9jZXNzIFR5cGUKK0ZpbGVtZ3JHZXQuU2VhcmNoVHlwZS5MYWJlbD1TZWFyY2ggVHlwZQorRmlsZW1nckdldC5GaWVsZE5hbWUuTGFiZWw9UHJvZHVjdCBUeXBlCitGaWxlbWdyR2V0LlNlcnZlclVSTC5MYWJlbD1GaWxlbWdyIFVSTAorRmlsZW1nckdldC5SZXN1bHQuTGFiZWw9UHJvZHVjdCBOYW1lL0lECmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L3Jlc291cmNlcy9nZXQvb29kdC5qcGcgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L3Jlc291cmNlcy9nZXQvb29kdC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxMDQwOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvcmVzb3VyY2VzL2dldC9vb2R0LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L3Jlc291cmNlcy9nZXQvb29kdC5wbmcgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyZ2V0L3Jlc291cmNlcy9nZXQvb29kdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JnZXQvcmVzb3VyY2VzL2dldC9vb2R0LnBuZwpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9GaWxlbWdySW5nZXN0U3RlcC5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9GaWxlbWdySW5nZXN0U3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTEwNTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3Jpbmdlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb24uRXhjZXB0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93RGF0YVV0aWw7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuc01ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcC4qOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBJbnRlcmZhY2UuCisgKiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBuZWVkIHRvOgorICogCisgKiAtIGluaXRpYWxpemUgdGhlIHN0ZXAKKyAqIC0gZXhlY3V0ZSB0aGUgcm93IHByb2Nlc3NpbmcgbG9naWMKKyAqIC0gZGlzcG9zZSBvZiB0aGUgc3RlcCAKKyAqIAorICogUGxlYXNlIGRvIG5vdCBjcmVhdGUgYW55IGxvY2FsIGZpZWxkcyBpbiBhIFN0ZXBJbnRlcmZhY2UgY2xhc3MuIFN0b3JlIGFueQorICogaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgcHJvY2Vzc2luZyBsb2dpYyBpbiB0aGUgc3VwcGxpZWQgc3RlcCBkYXRhIGludGVyZmFjZQorICogaW5zdGVhZC4gIAorICogCisgKi8KKworcHVibGljIGNsYXNzIEZpbGVtZ3JJbmdlc3RTdGVwIGV4dGVuZHMgQmFzZVN0ZXAgaW1wbGVtZW50cyBTdGVwSW50ZXJmYWNlIHsKKworICAgIHByaXZhdGUgT09EVENvbmZpZyBvb2R0ID0gbmV3IE9PRFRDb25maWcoKTsKKyAgICBwcml2YXRlIE9PRFRQcm9jZXNzZXMgb29kdHByb2MgPSBuZXcgT09EVFByb2Nlc3NlcygpOworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgc2ltcGx5IHBhc3Mgb24gaXRzIGFyZ3VtZW50cyB0byB0aGUgcGFyZW50IGNsYXNzLgorCSAqIAorCSAqIEBwYXJhbSBzIAkJCQlzdGVwIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIHN0ZXBEYXRhSW50ZXJmYWNlCXN0ZXAgZGF0YSBjbGFzcworCSAqIEBwYXJhbSBjCQkJCQlzdGVwIGNvcHkKKwkgKiBAcGFyYW0gdAkJCQkJdHJhbnNmb3JtYXRpb24gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gdAkJCQkJdHJhbnNmb3JtYXRpb24gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZGlzCQkJCXRyYW5zZm9ybWF0aW9uIGV4ZWN1dGluZworCSAqLworCXB1YmxpYyBGaWxlbWdySW5nZXN0U3RlcChTdGVwTWV0YSBzLCBTdGVwRGF0YUludGVyZmFjZSBzdGVwRGF0YUludGVyZmFjZSwgaW50IGMsIFRyYW5zTWV0YSB0LCBUcmFucyBkaXMpIHsKKwkJc3VwZXIocywgc3RlcERhdGFJbnRlcmZhY2UsIGMsIHQsIGRpcyk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQREkgZHVyaW5nIHRyYW5zZm9ybWF0aW9uIHN0YXJ0dXAuIAorCSAqIAorCSAqIEl0IHNob3VsZCBpbml0aWFsaXplIHJlcXVpcmVkIGZvciBzdGVwIGV4ZWN1dGlvbi4gCisJICogCisJICogVGhlIG1ldGEgYW5kIGRhdGEgaW1wbGVtZW50YXRpb25zIHBhc3NlZCBpbiBjYW4gc2FmZWx5IGJlIGNhc3QKKwkgKiB0byB0aGUgc3RlcCdzIHJlc3BlY3RpdmUgaW1wbGVtZW50YXRpb25zLiAKKwkgKiAKKwkgKiBJdCBpcyBtYW5kYXRvcnkgdGhhdCBzdXBlci5pbml0KCkgaXMgY2FsbGVkIHRvIGVuc3VyZSBjb3JyZWN0IGJlaGF2aW9yLgorCSAqIAorCSAqIFR5cGljYWwgdGFza3MgZXhlY3V0ZWQgaGVyZSBhcmUgZXN0YWJsaXNoaW5nIHRoZSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UsCisJICogYXMgd2FsbCBhcyBvYnRhaW5pbmcgcmVzb3VyY2VzLCBsaWtlIGZpbGUgaGFuZGxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gc21pIAlzdGVwIG1ldGEgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCBjb250YWluaW5nIHRoZSBzdGVwIHNldHRpbmdzCisJICogQHBhcmFtIHNkaQlzdGVwIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCB1c2VkIHRvIHN0b3JlIHJ1bnRpbWUgaW5mb3JtYXRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHByZXZlbnRpbmcgdGhlIHN0ZXAgZnJvbSB3b3JraW5nLiAKKwkgKiAgCisJICovCisJcHVibGljIGJvb2xlYW4gaW5pdChTdGVwTWV0YUludGVyZmFjZSBzbWksIFN0ZXBEYXRhSW50ZXJmYWNlIHNkaSkgeworCQkvLyBDYXN0aW5nIHRvIHN0ZXAtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBpcyBzYWZlCisJCUZpbGVtZ3JJbmdlc3RTdGVwTWV0YSBtZXRhID0gKEZpbGVtZ3JJbmdlc3RTdGVwTWV0YSkgc21pOworCQlGaWxlbWdySW5nZXN0U3RlcERhdGEgZGF0YSA9IChGaWxlbWdySW5nZXN0U3RlcERhdGEpIHNkaTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb29kdC5sb2FkSW5nZXN0ZXIobWV0YS5nZXRTZXJ2ZXJVUkxGaWVsZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dFcnJvcihlLmdldE1lc3NhZ2UoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5pbml0KG1ldGEsIGRhdGEpOworCX0KKworCS8qKgorCSAqIE9uY2UgdGhlIHRyYW5zZm9ybWF0aW9uIHN0YXJ0cyBleGVjdXRpbmcsIHRoZSBwcm9jZXNzUm93KCkgbWV0aG9kIGlzIGNhbGxlZCByZXBlYXRlZGx5CisJICogYnkgUERJIGZvciBhcyBsb25nIGFzIGl0IHJldHVybnMgdHJ1ZS4gVG8gaW5kaWNhdGUgdGhhdCBhIHN0ZXAgaGFzIGZpbmlzaGVkIHByb2Nlc3Npbmcgcm93cworCSAqIHRoaXMgbWV0aG9kIG11c3QgY2FsbCBzZXRPdXRwdXREb25lKCkgYW5kIHJldHVybiBmYWxzZTsKKwkgKgorCSAqIFN0ZXBzIHdoaWNoIHByb2Nlc3MgaW5jb21pbmcgcm93cyB0eXBpY2FsbHkgY2FsbCBnZXRSb3coKSB0byByZWFkIGEgc2luZ2xlIHJvdyBmcm9tIHRoZQorCSAqIGlucHV0IHN0cmVhbSwgY2hhbmdlIG9yIGFkZCByb3cgY29udGVudCwgY2FsbCBwdXRSb3coKSB0byBwYXNzIHRoZSBjaGFuZ2VkIHJvdyBvbgorCSAqIGFuZCByZXR1cm4gdHJ1ZS4gSWYgZ2V0Um93KCkgcmV0dXJucyBudWxsLCBubyBtb3JlIHJvd3MgYXJlIGV4cGVjdGVkIHRvIGNvbWUgaW4sCisJICogYW5kIHRoZSBwcm9jZXNzUm93KCkgaW1wbGVtZW50YXRpb24gY2FsbHMgc2V0T3V0cHV0RG9uZSgpIGFuZCByZXR1cm5zIGZhbHNlIHRvCisJICogaW5kaWNhdGUgdGhhdCBpdCBpcyBkb25lIHRvby4KKwkgKgorCSAqIFN0ZXBzIHdoaWNoIGdlbmVyYXRlIHJvd3MgdHlwaWNhbGx5IGNvbnN0cnVjdCBhIG5ldyByb3cgT2JqZWN0W10gdXNpbmcgYSBjYWxsIHRvCisJICogUm93RGF0YVV0aWwuYWxsb2NhdGVSb3dEYXRhKG51bWJlck9mRmllbGRzKSwgYWRkIHJvdyBjb250ZW50LCBhbmQgY2FsbCBwdXRSb3coKSB0bworCSAqIHBhc3MgdGhlIG5ldyByb3cgb24uIEFib3ZlIHByb2Nlc3MgbWF5IGhhcHBlbiBpbiBhIGxvb3AgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgcm93cywKKwkgKiBhdCB0aGUgZW5kIG9mIHdoaWNoIHByb2Nlc3NSb3coKSB3b3VsZCBjYWxsIHNldE91dHB1dERvbmUoKSBhbmQgcmV0dXJuIGZhbHNlOworCSAqCisJICogQHBhcmFtIHNtaSB0aGUgc3RlcCBtZXRhIGludGVyZmFjZSBjb250YWluaW5nIHRoZSBzdGVwIHNldHRpbmdzCisJICogQHBhcmFtIHNkaSB0aGUgc3RlcCBkYXRhIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlCisJICoKKwkgKiBAcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiwgZmFsc2UgaWYgdGhlIHN0ZXAgaXMgZG9uZQorCSAqLworCXB1YmxpYyBib29sZWFuIHByb2Nlc3NSb3coU3RlcE1ldGFJbnRlcmZhY2Ugc21pLCBTdGVwRGF0YUludGVyZmFjZSBzZGkpIHRocm93cyBLZXR0bGVFeGNlcHRpb24geworCisJCS8vIHNhZmVseSBjYXN0IHRoZSBzdGVwIHNldHRpbmdzIChtZXRhKSBhbmQgcnVudGltZSBpbmZvIChkYXRhKSB0byBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMKKwkJRmlsZW1nckluZ2VzdFN0ZXBNZXRhIG1ldGEgPSAoRmlsZW1nckluZ2VzdFN0ZXBNZXRhKSBzbWk7CisgICAgICAgIEZpbGVtZ3JJbmdlc3RTdGVwRGF0YSBkYXRhID0gKEZpbGVtZ3JJbmdlc3RTdGVwRGF0YSkgc2RpOworCisJCS8vIGdldCBpbmNvbWluZyByb3csIGdldFJvdygpIHBvdGVudGlhbGx5IGJsb2NrcyB3YWl0aW5nIGZvciBtb3JlIHJvd3MsIHJldHVybnMgbnVsbCBpZiBubyBtb3JlIHJvd3MgZXhwZWN0ZWQKKwkJT2JqZWN0W10gciA9IGdldFJvdygpOworCisJCS8vIGlmIG5vIG1vcmUgcm93cyBhcmUgZXhwZWN0ZWQsIGluZGljYXRlIHN0ZXAgaXMgZmluaXNoZWQgYW5kIHByb2Nlc3NSb3coKSBzaG91bGQgbm90IGJlIGNhbGxlZCBhZ2FpbgorCQlpZiAociA9PSBudWxsKXsKKwkJCXNldE91dHB1dERvbmUoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIHRoZSAiZmlyc3QiIGZsYWcgaXMgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2Ugc3RlcCBpbXBsZW1lbnRhdGlvbgorCQkvLyBpdCBpcyB1c2VkIHRvIGd1YXJkIHNvbWUgcHJvY2Vzc2luZyB0YXNrcywgbGlrZSBmaWd1cmluZyBvdXQgZmllbGQgaW5kZXhlcworCQkvLyBpbiB0aGUgcm93IHN0cnVjdHVyZSB0aGF0IG9ubHkgbmVlZCB0byBiZSBkb25lIG9uY2UKKwkJaWYgKGZpcnN0KSB7CisJCQlmaXJzdCA9IGZhbHNlOworCQkJLy8gY2xvbmUgdGhlIGlucHV0IHJvdyBzdHJ1Y3R1cmUgYW5kIHBsYWNlIGl0IGluIG91ciBkYXRhIG9iamVjdAorCQkJZGF0YS5vdXRwdXRSb3dNZXRhID0gKFJvd01ldGFJbnRlcmZhY2UpIGdldElucHV0Um93TWV0YSgpLmNsb25lKCk7CisJCQkvLyB1c2UgbWV0YS5nZXRGaWVsZHMoKSB0byBjaGFuZ2UgaXQsIHNvIGl0IHJlZmxlY3RzIHRoZSBvdXRwdXQgcm93IHN0cnVjdHVyZQorCQkJbWV0YS5nZXRGaWVsZHMoZGF0YS5vdXRwdXRSb3dNZXRhLCBnZXRTdGVwbmFtZSgpLCBudWxsLCBudWxsLCB0aGlzLCBudWxsLCBudWxsKTsKKwkJfQorCisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gZ2V0SW5wdXRSb3dNZXRhKCkuZ2V0RmllbGROYW1lcygpOworICAgICAgICBpbnQgaWR4ID0gQXJyYXlzLmFzTGlzdChuYW1lcykuaW5kZXhPZihtZXRhLmdldEZpbGVuYW1lRmllbGQoKSk7CisgICAgICAgIGludCBpZHgyID0gQXJyYXlzLmFzTGlzdChuYW1lcykuaW5kZXhPZihtZXRhLmdldE1ldGFkYXRhRmllbGQoKSk7CisKKworCisgICAgICAgIC8qdHJ5IHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJkb2VzIGZpbGUgZXhpc3Q/Iitvb2R0cHJvYy5pc0FscmVhZHlJbkRhdGFiYXNlKG9vZHQsIChTdHJpbmcpcltpZHhdKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9Ki8KKworICAgICAgICB0cnkgeworCisJCSAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWltZS50eXBlLnJlcG9zaXRvcnkiLCAiL3RtcC9taW1lLXR5cGVzLnhtbCIpOworCQkgIE1ldGFkYXRhIG0gPSBvb2R0cHJvYy5nZXRNZXRhZGF0YSgoU3RyaW5nKXJbaWR4Ml0pOworICAgICAgICAgIFN0cmluZyBwcm9kdWN0aWQgPSBvb2R0cHJvYy5pbmdlc3Qob29kdCwgbmV3IEZpbGUoKFN0cmluZylyW2lkeF0pLCBtKTsKKworCisgICAgICAgIC8vIHNhZmVseSBhZGQgdGhlIHN0cmluZyAiSGVsbG8gV29ybGQhIiBhdCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgcm93CisJCS8vIHRoZSByb3cgYXJyYXkgd2lsbCBiZSByZXNpemVkIGlmIG5lY2Vzc2FyeQorCQkgICAgT2JqZWN0W10gb3V0cHV0Um93ID0gUm93RGF0YVV0aWwuYWRkVmFsdWVEYXRhKHIsIGRhdGEub3V0cHV0Um93TWV0YS5zaXplKCkgLSAxLCBwcm9kdWN0aWQpOworCisJCS8vIHB1dCB0aGUgcm93IHRvIHRoZSBvdXRwdXQgcm93IHN0cmVhbQorCQlwdXRSb3coZGF0YS5vdXRwdXRSb3dNZXRhLCBvdXRwdXRSb3cpOworCisJCS8vIGxvZyBwcm9ncmVzcyBpZiBpdCBpcyB0aW1lIHRvIHRvIHNvCisJCWlmIChjaGVja0ZlZWRiYWNrKGdldExpbmVzUmVhZCgpKSkgeworCQkJbG9nQmFzaWMoIkxpbmVuciAiICsgZ2V0TGluZXNSZWFkKCkpOyAvLyBTb21lIGJhc2ljIGxvZ2dpbmcKKwkJfQorCisJCS8vIGluZGljYXRlIHRoYXQgcHJvY2Vzc1JvdygpIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkgIGxvZ0Vycm9yKEV4Y2VwdGlvblV0aWxzLmdldFN0YWNrVHJhY2UoZSkpOworCQkgIHB1dEVycm9yKGdldElucHV0Um93TWV0YSgpLCByLCAxTCwgZS5nZXRNZXNzYWdlKCksIG51bGwsCisJCQkgICJFUlJfT09EVElOR0VTVF9PVVRQVVRfMDEiKTsKKwkJfQorCSAgcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBESSBvbmNlIHRoZSBzdGVwIGlzIGRvbmUgcHJvY2Vzc2luZy4KKwkgKgorCSAqIFRoZSBkaXNwb3NlKCkgbWV0aG9kIGlzIHRoZSBjb3VudGVycGFydCB0byBpbml0KCkgYW5kIHNob3VsZCByZWxlYXNlIGFueSByZXNvdXJjZXMKKwkgKiBhY3F1aXJlZCBmb3Igc3RlcCBleGVjdXRpb24gbGlrZSBmaWxlIGhhbmRsZXMgb3IgZGF0YWJhc2UgY29ubmVjdGlvbnMuCisJICoKKwkgKiBUaGUgbWV0YSBhbmQgZGF0YSBpbXBsZW1lbnRhdGlvbnMgcGFzc2VkIGluIGNhbiBzYWZlbHkgYmUgY2FzdAorCSAqIHRvIHRoZSBzdGVwJ3MgcmVzcGVjdGl2ZSBpbXBsZW1lbnRhdGlvbnMuCisJICoKKwkgKiBJdCBpcyBtYW5kYXRvcnkgdGhhdCBzdXBlci5kaXNwb3NlKCkgaXMgY2FsbGVkIHRvIGVuc3VyZSBjb3JyZWN0IGJlaGF2aW9yLgorCSAqCisJICogQHBhcmFtIHNtaSAJc3RlcCBtZXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgY29udGFpbmluZyB0aGUgc3RlcCBzZXR0aW5ncworCSAqIEBwYXJhbSBzZGkJc3RlcCBkYXRhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgdXNlZCB0byBzdG9yZSBydW50aW1lIGluZm9ybWF0aW9uCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZShTdGVwTWV0YUludGVyZmFjZSBzbWksIFN0ZXBEYXRhSW50ZXJmYWNlIHNkaSkgeworCisJCS8vIENhc3RpbmcgdG8gc3RlcC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGlzIHNhZmUKKwkJRmlsZW1nckluZ2VzdFN0ZXBNZXRhIG1ldGEgPSAoRmlsZW1nckluZ2VzdFN0ZXBNZXRhKSBzbWk7CisgICAgICAgIEZpbGVtZ3JJbmdlc3RTdGVwRGF0YSBkYXRhID0gKEZpbGVtZ3JJbmdlc3RTdGVwRGF0YSkgc2RpOworCQkKKwkJc3VwZXIuZGlzcG9zZShtZXRhLCBkYXRhKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3Jpbmdlc3QvRmlsZW1nckluZ2VzdFN0ZXBEYXRhLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmJhNGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwRGF0YS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmZpbGVtZ3Jpbmdlc3Q7CisKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5Sb3dNZXRhSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBEYXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuU3RlcERhdGFJbnRlcmZhY2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBEYXRhSW50ZXJmYWNlLgorICogICAKKyAqIEltcGxlbWVudGluZyBjbGFzc2VzIGluaGVyaXQgZnJvbSBCYXNlU3RlcERhdGEsIHdoaWNoIGltcGxlbWVudHMgdGhlIGVudGlyZQorICogaW50ZXJmYWNlIGNvbXBsZXRlbHkuIAorICogCisgKiBJbiBhZGRpdGlvbiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSB1c3VhbGx5IGtlZXAgdHJhY2sgb2YKKyAqIHBlci10aHJlYWQgcmVzb3VyY2VzIGR1cmluZyBzdGVwIGV4ZWN1dGlvbi4gVHlwaWNhbCBleGFtcGxlcyBhcmU6CisgKiByZXN1bHQgc2V0cywgdGVtcG9yYXJ5IGRhdGEsIGNhY2hpbmcgaW5kZXhlcywgZXRjLgorICogICAKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGRlbW8gc3RlcCBzdG9yZXMgdGhlIG91dHB1dCByb3cgc3RydWN0dXJlIGluIAorICogdGhlIGRhdGEgY2xhc3MuIAorICogICAKKyAqLworcHVibGljIGNsYXNzIEZpbGVtZ3JJbmdlc3RTdGVwRGF0YSBleHRlbmRzIEJhc2VTdGVwRGF0YSBpbXBsZW1lbnRzIFN0ZXBEYXRhSW50ZXJmYWNlIHsKKworCXB1YmxpYyBSb3dNZXRhSW50ZXJmYWNlIG91dHB1dFJvd01ldGE7CisKKyAgICBwdWJsaWMgU3RyaW5nIGZpZWxkbmFtZTsKKworICAgIHB1YmxpYyBGaWxlbWdySW5nZXN0U3RlcERhdGEoKQorCXsKKwkJc3VwZXIoKTsKKwl9Cit9CisJCmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwRGlhbG9nLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4ZDZkMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3Jpbmdlc3QvRmlsZW1nckluZ2VzdFN0ZXBEaWFsb2cuamF2YQpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmluZ2VzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLkNvbnN0OworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuZXhjZXB0aW9uLktldHRsZVN0ZXBFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5WYWx1ZU1ldGFJbnRlcmZhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuaTE4bi5CYXNlTWVzc2FnZXM7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuVHJhbnNNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnRyYW5zLnN0ZXAuU3RlcERpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5zdGVwLlN0ZXBNZXRhOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnVpLnRyYW5zLnN0ZXAuQmFzZVN0ZXBEaWFsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBEaWFsb2dJbnRlcmZhY2UuCisgKiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBuZWVkIHRvOgorICogCisgKiAtIGJ1aWxkIGFuZCBvcGVuIGEgU1dUIGRpYWxvZyBkaXNwbGF5aW5nIHRoZSBzdGVwJ3Mgc2V0dGluZ3MgKHN0b3JlZCBpbiB0aGUgc3RlcCdzIG1ldGEgb2JqZWN0KQorICogLSB3cml0ZSBiYWNrIGFueSBjaGFuZ2VzIHRoZSB1c2VyIG1ha2VzIHRvIHRoZSBzdGVwJ3MgbWV0YSBvYmplY3QKKyAqIC0gcmVwb3J0IHdoZXRoZXIgdGhlIHVzZXIgY2hhbmdlZCBhbnkgc2V0dGluZ3Mgd2hlbiBjb25maXJtaW5nIHRoZSBkaWFsb2cgCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbGVtZ3JJbmdlc3RTdGVwRGlhbG9nIGV4dGVuZHMgQmFzZVN0ZXBEaWFsb2cgaW1wbGVtZW50cyBTdGVwRGlhbG9nSW50ZXJmYWNlIHsKKworCS8qKgorCSAqCVRoZSBQS0cgbWVtYmVyIGlzIHVzZWQgd2hlbiBsb29raW5nIHVwIGludGVybmF0aW9uYWxpemVkIHN0cmluZ3MuCisJICoJVGhlIHByb3BlcnRpZXMgZmlsZSB3aXRoIGxvY2FsaXplZCBrZXlzIGlzIGV4cGVjdGVkIHRvIHJlc2lkZSBpbiAKKwkgKgl7dGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzIHNwZWNpZmllZH0vbWVzc2FnZXMvbWVzc2FnZXNfe2xvY2FsZX0ucHJvcGVydGllcyAgIAorCSAqLworCXByaXZhdGUgc3RhdGljIENsYXNzPD8+IFBLRyA9IEZpbGVtZ3JJbmdlc3RTdGVwTWV0YS5jbGFzczsgLy8gZm9yIGkxOG4gcHVycG9zZXMKKworCS8vIHRoaXMgaXMgdGhlIG9iamVjdCB0aGUgc3RvcmVzIHRoZSBzdGVwJ3Mgc2V0dGluZ3MKKwkvLyB0aGUgZGlhbG9nIHJlYWRzIHRoZSBzZXR0aW5ncyBmcm9tIGl0IHdoZW4gb3BlbmluZworCS8vIHRoZSBkaWFsb2cgd3JpdGVzIHRoZSBzZXR0aW5ncyB0byBpdCB3aGVuIGNvbmZpcm1lZCAKKwlwcml2YXRlIEZpbGVtZ3JJbmdlc3RTdGVwTWV0YSBtZXRhOworCisJLy8gdGV4dCBmaWVsZCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBhZGQgdG8gdGhlIHJvdyBzdHJlYW0KKwkvL3ByaXZhdGUgVGV4dCB3SGVsbG9GaWVsZE5hbWU7CisKKyAgICAvLyB0ZXh0IGZpZWxkIGhvbGRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIHRoZSBmaWxlbmFtZSBhZ2FpbnN0CisgICAgcHJpdmF0ZSBDQ29tYm8gd0ZpbGVuYW1lRmllbGQ7CisgICAgcHJpdmF0ZSBUZXh0IHdTZXJ2ZXJVUkxGaWVsZDsKKyAgICBwcml2YXRlIFRleHQgd1Jlc3VsdEZpZWxkOworICAgIHByaXZhdGUgQ0NvbWJvIHdNZXRhZGF0YUZpZWxkOworICBwcml2YXRlIEJ1dHRvbiBtX2dldEZpZWxkc0J1dDsKKworICAvKioKKwkgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIHNpbXBseSBpbnZva2Ugc3VwZXIoKSBhbmQgc2F2ZSB0aGUgaW5jb21pbmcgbWV0YQorCSAqIG9iamVjdCB0byBhIGxvY2FsIHZhcmlhYmxlLCBzbyBpdCBjYW4gY29udmVuaWVudGx5IHJlYWQgYW5kIHdyaXRlIHNldHRpbmdzCisJICogZnJvbS90byBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IAl0aGUgU1dUIHNoZWxsIHRvIG9wZW4gdGhlIGRpYWxvZyBpbgorCSAqIEBwYXJhbSBpbgkJdGhlIG1ldGEgb2JqZWN0IGhvbGRpbmcgdGhlIHN0ZXAncyBzZXR0aW5ncworCSAqIEBwYXJhbSB0cmFuc01ldGEJdHJhbnNmb3JtYXRpb24gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gc25hbWUJCXRoZSBzdGVwIG5hbWUKKwkgKi8KKwlwdWJsaWMgRmlsZW1nckluZ2VzdFN0ZXBEaWFsb2coU2hlbGwgcGFyZW50LCBPYmplY3QgaW4sIFRyYW5zTWV0YSB0cmFuc01ldGEsIFN0cmluZyBzbmFtZSkgeworCQlzdXBlcihwYXJlbnQsIChCYXNlU3RlcE1ldGEpIGluLCB0cmFuc01ldGEsIHNuYW1lKTsKKwkJbWV0YSA9IChGaWxlbWdySW5nZXN0U3RlcE1ldGEpIGluOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBTcG9vbiB3aGVuIHRoZSB1c2VyIG9wZW5zIHRoZSBzZXR0aW5ncyBkaWFsb2cgb2YgdGhlIHN0ZXAuCisJICogSXQgc2hvdWxkIG9wZW4gdGhlIGRpYWxvZyBhbmQgcmV0dXJuIG9ubHkgb25jZSB0aGUgZGlhbG9nIGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgdXNlci4KKwkgKiAKKwkgKiBJZiB0aGUgdXNlciBjb25maXJtcyB0aGUgZGlhbG9nLCB0aGUgbWV0YSBvYmplY3QgKHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IpIG11c3QKKwkgKiBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIG5ldyBzdGVwIHNldHRpbmdzLiBUaGUgY2hhbmdlZCBmbGFnIG9mIHRoZSBtZXRhIG9iamVjdCBtdXN0IAorCSAqIHJlZmxlY3Qgd2hldGhlciB0aGUgc3RlcCBjb25maWd1cmF0aW9uIHdhcyBjaGFuZ2VkIGJ5IHRoZSBkaWFsb2cuCisJICogCisJICogSWYgdGhlIHVzZXIgY2FuY2VscyB0aGUgZGlhbG9nLCB0aGUgbWV0YSBvYmplY3QgbXVzdCBub3QgYmUgdXBkYXRlZCwgYW5kIGl0cyBjaGFuZ2VkIGZsYWcKKwkgKiBtdXN0IHJlbWFpbiB1bmFsdGVyZWQuCisJICogCisJICogVGhlIG9wZW4oKSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN0ZXAgYWZ0ZXIgdGhlIHVzZXIgaGFzIGNvbmZpcm1lZCB0aGUgZGlhbG9nLAorCSAqIG9yIG51bGwgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBkaWFsb2cuCisJICovCisJcHVibGljIFN0cmluZyBvcGVuKCkgeworCisJCS8vIHN0b3JlIHNvbWUgY29udmVuaWVudCBTV1QgdmFyaWFibGVzIAorCQlTaGVsbCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKwkJRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKKworCQkvLyBTV1QgY29kZSBmb3IgcHJlcGFyaW5nIHRoZSBkaWFsb2cKKwkJc2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULk1JTiB8IFNXVC5NQVgpOworCQlwcm9wcy5zZXRMb29rKHNoZWxsKTsKKwkJc2V0U2hlbGxJbWFnZShzaGVsbCwgbWV0YSk7CisJCQorCQkvLyBTYXZlIHRoZSB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBmbGFnIG9uIHRoZSBtZXRhIG9iamVjdC4gSWYgdGhlIHVzZXIgY2FuY2VscworCQkvLyB0aGUgZGlhbG9nLCBpdCB3aWxsIGJlIHJlc3RvcmVkIHRvIHRoaXMgc2F2ZWQgdmFsdWUuCisJCS8vIFRoZSAiY2hhbmdlZCIgdmFyaWFibGUgaXMgaW5oZXJpdGVkIGZyb20gQmFzZVN0ZXBEaWFsb2cKKwkJY2hhbmdlZCA9IG1ldGEuaGFzQ2hhbmdlZCgpOworCQkKKwkJLy8gVGhlIE1vZGlmeUxpc3RlbmVyIHVzZWQgb24gYWxsIGNvbnRyb2xzLiBJdCB3aWxsIHVwZGF0ZSB0aGUgbWV0YSBvYmplY3QgdG8gCisJCS8vIGluZGljYXRlIHRoYXQgY2hhbmdlcyBhcmUgYmVpbmcgbWFkZS4KKwkJTW9kaWZ5TGlzdGVuZXIgbHNNb2QgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQltZXRhLnNldENoYW5nZWQoKTsKKwkJCX0KKwkJfTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKwkJLy8gU1dUIGNvZGUgZm9yIGJ1aWxkaW5nIHRoZSBhY3R1YWwgc2V0dGluZ3MgZGlhbG9nICAgICAgICAvLworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisJCUZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7CisJCWZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSBDb25zdC5GT1JNX01BUkdJTjsKKwkJZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSBDb25zdC5GT1JNX01BUkdJTjsKKworCQlzaGVsbC5zZXRMYXlvdXQoZm9ybUxheW91dCk7CisJCXNoZWxsLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJGaWxlbWdySW5nZXN0U3RlcC5OYW1lIikpOworCisJCWludCBtaWRkbGUgPSBwcm9wcy5nZXRNaWRkbGVQY3QoKTsKKwkJaW50IG1hcmdpbiA9IENvbnN0Lk1BUkdJTjsKKworCQkvLyBTdGVwbmFtZSBsaW5lCisJCXdsU3RlcG5hbWUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5SSUdIVCk7CisJCXdsU3RlcG5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIlN5c3RlbS5MYWJlbC5TdGVwTmFtZSIpKTsgCisJCXByb3BzLnNldExvb2sod2xTdGVwbmFtZSk7CisJCWZkbFN0ZXBuYW1lID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkbFN0ZXBuYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkbFN0ZXBuYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisJCWZkbFN0ZXBuYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBtYXJnaW4pOworCQl3bFN0ZXBuYW1lLnNldExheW91dERhdGEoZmRsU3RlcG5hbWUpOworCQkKKwkJd1N0ZXBuYW1lID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworCQl3U3RlcG5hbWUuc2V0VGV4dChzdGVwbmFtZSk7CisJCXByb3BzLnNldExvb2sod1N0ZXBuYW1lKTsKKwkJd1N0ZXBuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKwkJZmRTdGVwbmFtZSA9IG5ldyBGb3JtRGF0YSgpOworCQlmZFN0ZXBuYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAwKTsKKwkJZmRTdGVwbmFtZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgbWFyZ2luKTsKKwkJZmRTdGVwbmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQl3U3RlcG5hbWUuc2V0TGF5b3V0RGF0YShmZFN0ZXBuYW1lKTsKKworCQkvLyBvdXRwdXQgZmllbGQgdmFsdWUKKwkJTGFiZWwgd2xWYWxOYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworCQl3bFZhbE5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JJbmdlc3QuRmllbGROYW1lLkxhYmVsIikpOworCQlwcm9wcy5zZXRMb29rKHdsVmFsTmFtZSk7CisJCUZvcm1EYXRhIGZkbFZhbE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRsVmFsTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZGxWYWxOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisJCWZkbFZhbE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTdGVwbmFtZSwgbWFyZ2luKTsKKwkJd2xWYWxOYW1lLnNldExheW91dERhdGEoZmRsVmFsTmFtZSk7CisKKworCQl3RmlsZW5hbWVGaWVsZCA9IG5ldyBDQ29tYm8oc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworCQlwcm9wcy5zZXRMb29rKHdGaWxlbmFtZUZpZWxkKTsKKwkJd0ZpbGVuYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobHNNb2QpOworCQlGb3JtRGF0YSBmZFZhbE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRWYWxOYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAwKTsKKwkJLy8vZmRWYWxOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1fZ2V0RmllbGRzQnV0LCAtbWFyZ2luKTsKKwkgIGZkVmFsTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsMCk7CisJCWZkVmFsTmFtZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQod1N0ZXBuYW1lLCBtYXJnaW4pOworCQl3RmlsZW5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGZkVmFsTmFtZSk7CisKKworLyoKKwkgIG1fZ2V0RmllbGRzQnV0ID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0ggfCBTV1QuQ0VOVEVSKTsKKwkgIHByb3BzLnNldExvb2sobV9nZXRGaWVsZHNCdXQpOworCSAgbV9nZXRGaWVsZHNCdXQuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywKKwkJICAiU1NUYWJsZU91dHB1dERpYWxvZy5HZXRGaWVsZHMuQnV0dG9uIikpOworCSAgRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKKwkgIGZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJICBmZFZhbE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTdGVwbmFtZSwgbWFyZ2luKTsKKwkgIG1fZ2V0RmllbGRzQnV0LnNldExheW91dERhdGEoZmQpOworCSAgbV9nZXRGaWVsZHNCdXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCSAgc2V0dXBGaWVsZHNDb21ibygpOworCQl9CisJICB9KTsqLworICAgICAgICAvLyBvdXRwdXQgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xNZXRhZGF0YU5hbWUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5SSUdIVCk7CisgICAgICAgIHdsTWV0YWRhdGFOYW1lLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJGaWxlbWdySW5nZXN0Lk1ldGFkYXRhRmllbGROYW1lLkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsTWV0YWRhdGFOYW1lKTsKKyAgICAgICAgRm9ybURhdGEgZmRsTWV0YWRhdGFOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkbE1ldGFkYXRhTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxNZXRhZGF0YU5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAtbWFyZ2luKTsKKyAgICAgICAgZmRsTWV0YWRhdGFOYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3RmlsZW5hbWVGaWVsZCwgbWFyZ2luKTsKKyAgICAgICAgd2xNZXRhZGF0YU5hbWUuc2V0TGF5b3V0RGF0YShmZGxNZXRhZGF0YU5hbWUpOworCisgICAgICAgIHdNZXRhZGF0YUZpZWxkID0gbmV3IENDb21ibyhzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisgICAgICAgIHByb3BzLnNldExvb2sod01ldGFkYXRhRmllbGQpOworICAgICAgICB3TWV0YWRhdGFGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihsc01vZCk7CisgICAgICAgIEZvcm1EYXRhIGZkTWV0YWRhdGFOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkTWV0YWRhdGFOYW1lLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWlkZGxlLCAwKTsKKyAgICAgICAgZmRNZXRhZGF0YU5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKyAgICAgICAgZmRNZXRhZGF0YU5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdGaWxlbmFtZUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3TWV0YWRhdGFGaWVsZC5zZXRMYXlvdXREYXRhKGZkTWV0YWRhdGFOYW1lKTsKKworCisgICAgICAgIC8vIHNlcnZlcm5hbWUgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xTZXJ2ZXJOYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFNlcnZlck5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JJbmdlc3QuU2VydmVyVVJMLkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsU2VydmVyTmFtZSk7CisgICAgICAgIEZvcm1EYXRhIGZkbFNlcnZlck5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKyAgICAgICAgZmRsU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxTZXJ2ZXJOYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisgICAgICAgIGZkbFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdNZXRhZGF0YUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3bFNlcnZlck5hbWUuc2V0TGF5b3V0RGF0YShmZGxTZXJ2ZXJOYW1lKTsKKworICAgICAgICB3U2VydmVyVVJMRmllbGQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUik7CisgICAgICAgIHByb3BzLnNldExvb2sod1NlcnZlclVSTEZpZWxkKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxzTW9kKTsKKyAgICAgICAgRm9ybURhdGEgZmRTZXJ2ZXJOYW1lID0gbmV3IEZvcm1EYXRhKCk7CisgICAgICAgIGZkU2VydmVyTmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgMCk7CisgICAgICAgIGZkU2VydmVyTmFtZS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworICAgICAgICBmZFNlcnZlck5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdNZXRhZGF0YUZpZWxkLCBtYXJnaW4pOworICAgICAgICB3U2VydmVyVVJMRmllbGQuc2V0TGF5b3V0RGF0YShmZFNlcnZlck5hbWUpOworCisgICAgICAgIC8vIHNlcnZlcm5hbWUgZmllbGQgdmFsdWUKKyAgICAgICAgTGFiZWwgd2xSZXN1bHROYW1lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuUklHSFQpOworICAgICAgICB3bFJlc3VsdE5hbWUuc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIkZpbGVtZ3JJbmdlc3QuUmVzdWx0LkxhYmVsIikpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdsUmVzdWx0TmFtZSk7CisgICAgICAgIEZvcm1EYXRhIGZkbFJlc3VsdE5hbWUgPSBuZXcgRm9ybURhdGEoKTsKKyAgICAgICAgZmRsUmVzdWx0TmFtZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworICAgICAgICBmZGxSZXN1bHROYW1lLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1pZGRsZSwgLW1hcmdpbik7CisgICAgICAgIGZkbFJlc3VsdE5hbWUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdTZXJ2ZXJVUkxGaWVsZCwgbWFyZ2luKTsKKyAgICAgICAgd2xSZXN1bHROYW1lLnNldExheW91dERhdGEoZmRsUmVzdWx0TmFtZSk7CisKKyAgICAgICAgd1Jlc3VsdEZpZWxkID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOworICAgICAgICBwcm9wcy5zZXRMb29rKHdSZXN1bHRGaWVsZCk7CisgICAgICAgIHdSZXN1bHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihsc01vZCk7CisgICAgICAgIEZvcm1EYXRhIGZkUmVzdWx0TmFtZSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZFJlc3VsdE5hbWUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChtaWRkbGUsIDApOworICAgICAgICBmZFJlc3VsdE5hbWUucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKyAgICAgICAgZmRSZXN1bHROYW1lLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3U2VydmVyVVJMRmllbGQsIG1hcmdpbik7CisgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkUmVzdWx0TmFtZSk7CisKKworICAgICAgICAvLyBPSyBhbmQgY2FuY2VsIGJ1dHRvbnMKKwkJd09LID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOworCQl3T0suc2V0VGV4dChCYXNlTWVzc2FnZXMuZ2V0U3RyaW5nKFBLRywgIlN5c3RlbS5CdXR0b24uT0siKSk7IAorCQl3Q2FuY2VsID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOworCQl3Q2FuY2VsLnNldFRleHQoQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJTeXN0ZW0uQnV0dG9uLkNhbmNlbCIpKTsgCisKKwkJQmFzZVN0ZXBEaWFsb2cucG9zaXRpb25Cb3R0b21CdXR0b25zKHNoZWxsLCBuZXcgQnV0dG9uW10geyB3T0ssIHdDYW5jZWwgfSwgbWFyZ2luLCB3UmVzdWx0RmllbGQpOworCisJCS8vIEFkZCBsaXN0ZW5lcnMgZm9yIGNhbmNlbCBhbmQgT0sKKwkJbHNDYW5jZWwgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Y2FuY2VsKCk7fQorCQl9OworCQlsc09LID0gbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkge29rKCk7fQorCQl9OworCisJCXdDYW5jZWwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbHNDYW5jZWwpOworCQl3T0suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbHNPSyk7CisKKwkJLy8gZGVmYXVsdCBsaXN0ZW5lciAoZm9yIGhpdHRpbmcgImVudGVyIikKKwkJbHNEZWYgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7b2soKTt9CisJCX07CisJCXdTdGVwbmFtZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsc0RlZik7CisJCXdGaWxlbmFtZUZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKyAgICAgICAgd1NlcnZlclVSTEZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKyAgICAgICAgd1Jlc3VsdEZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxzRGVmKTsKKwkJLy8gRGV0ZWN0IFggb3IgQUxULUY0IG9yIHNvbWV0aGluZyB0aGF0IGtpbGxzIHRoaXMgd2luZG93IGFuZCBjYW5jZWwgdGhlIGRpYWxvZyBwcm9wZXJseQorCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHtjYW5jZWwoKTt9CisJCX0pOworCQkKKwkJLy8gU2V0L1Jlc3RvcmUgdGhlIGRpYWxvZyBzaXplIGJhc2VkIG9uIGxhc3QgcG9zaXRpb24gb24gc2NyZWVuCisJCS8vIFRoZSBzZXRTaXplKCkgbWV0aG9kIGlzIGluaGVyaXRlZCBmcm9tIEJhc2VTdGVwRGlhbG9nCisJCXNldFNpemUoKTsKKworCQkvLyBwb3B1bGF0ZSB0aGUgZGlhbG9nIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBtZXRhIG9iamVjdAorCQlwb3B1bGF0ZURpYWxvZygpOworCQkKKwkJLy8gcmVzdG9yZSB0aGUgY2hhbmdlZCBmbGFnIHRvIG9yaWdpbmFsIHZhbHVlLCBhcyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBmaXJlIGR1cmluZyBkaWFsb2cgcG9wdWxhdGlvbiAKKwkJbWV0YS5zZXRDaGFuZ2VkKGNoYW5nZWQpOworCisJCS8vIG9wZW4gZGlhbG9nIGFuZCBlbnRlciBldmVudCBsb29wIAorCQlzaGVsbC5vcGVuKCk7CisJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7CisJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCisJCQkJZGlzcGxheS5zbGVlcCgpOworCQl9CisKKwkJLy8gYXQgdGhpcyBwb2ludCB0aGUgZGlhbG9nIGhhcyBjbG9zZWQsIHNvIGVpdGhlciBvaygpIG9yIGNhbmNlbCgpIGhhdmUgYmVlbiBleGVjdXRlZAorCQkvLyBUaGUgInN0ZXBuYW1lIiB2YXJpYWJsZSBpcyBpbmhlcml0ZWQgZnJvbSBCYXNlU3RlcERpYWxvZworCQlyZXR1cm4gc3RlcG5hbWU7CisJfQorCQorCS8qKgorCSAqIFRoaXMgaGVscGVyIG1ldGhvZCBwdXRzIHRoZSBzdGVwIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIHRoZSBtZXRhIG9iamVjdAorCSAqIGFuZCBwdXRzIGl0IGludG8gdGhlIGRpYWxvZyBjb250cm9scy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVEaWFsb2coKSB7CisJICBzZXR1cEZpZWxkc0NvbWJvKCk7CisJCXdTdGVwbmFtZS5zZWxlY3RBbGwoKTsKKwkJd0ZpbGVuYW1lRmllbGQuc2V0VGV4dChtZXRhLmdldEZpbGVuYW1lRmllbGQoKSk7CisgICAgICAgIHdTZXJ2ZXJVUkxGaWVsZC5zZXRUZXh0KG1ldGEuZ2V0U2VydmVyVVJMRmllbGQoKSk7CisgICAgICAgIHdSZXN1bHRGaWVsZC5zZXRUZXh0KG1ldGEuZ2V0UmVzdWx0RmllbGQoKSk7CisgICAgICAgIHdNZXRhZGF0YUZpZWxkLnNldFRleHQobWV0YS5nZXRNZXRhZGF0YUZpZWxkKCkpOworCisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgZGlhbG9nLiAgCisJICovCisJcHJpdmF0ZSB2b2lkIGNhbmNlbCgpIHsKKwkJLy8gVGhlICJzdGVwbmFtZSIgdmFyaWFibGUgd2lsbCBiZSB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgb3BlbigpIG1ldGhvZC4gCisJCS8vIFNldHRpbmcgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGF0IGRpYWxvZyB3YXMgY2FuY2VsbGVkLgorCQlzdGVwbmFtZSA9IG51bGw7CisJCS8vIFJlc3RvcmluZyBvcmlnaW5hbCAiY2hhbmdlZCIgZmxhZyBvbiB0aGUgbWV0IGFvYmplY3QKKwkJbWV0YS5zZXRDaGFuZ2VkKGNoYW5nZWQpOworCQkvLyBjbG9zZSB0aGUgU1dUIGRpYWxvZyB3aW5kb3cKKwkJZGlzcG9zZSgpOworCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjb25maXJtcyB0aGUgZGlhbG9nCisJICovCisJcHJpdmF0ZSB2b2lkIG9rKCkgeworCQkvLyBUaGUgInN0ZXBuYW1lIiB2YXJpYWJsZSB3aWxsIGJlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBvcGVuKCkgbWV0aG9kLiAKKwkJLy8gU2V0dGluZyB0byBzdGVwIG5hbWUgZnJvbSB0aGUgZGlhbG9nIGNvbnRyb2wKKwkJc3RlcG5hbWUgPSB3U3RlcG5hbWUuZ2V0VGV4dCgpOyAKKwkJLy8gU2V0dGluZyB0aGUgIHNldHRpbmdzIHRvIHRoZSBtZXRhIG9iamVjdAorCQkvL21ldGEuc2V0T3V0cHV0RmllbGQod0ZpbGVuYW1lRmllbGQuZ2V0VGV4dCgpKTsKKyAgICAgICAgbWV0YS5zZXRGaWxlbmFtZUZpZWxkKHdGaWxlbmFtZUZpZWxkLmdldFRleHQoKSk7CisgICAgICAgIG1ldGEuc2V0U2VydmVyVVJMRmllbGQod1NlcnZlclVSTEZpZWxkLmdldFRleHQoKSk7CisgICAgICAgIG1ldGEuc2V0UmVzdWx0RmllbGQod1Jlc3VsdEZpZWxkLmdldFRleHQoKSk7CisgICAgICAgIG1ldGEuc2V0TWV0YWRhdGFGaWVsZCh3TWV0YWRhdGFGaWVsZC5nZXRUZXh0KCkpOworCQkvLyBjbG9zZSB0aGUgU1dUIGRpYWxvZyB3aW5kb3cKKwkJZGlzcG9zZSgpOworCX0KKworICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZpZWxkc0NvbWJvKCkgeworCisJU3RlcE1ldGEgc3RlcE1ldGEgPSB0cmFuc01ldGEuZmluZFN0ZXAoc3RlcG5hbWUpOworCWlmIChzdGVwTWV0YSAhPSBudWxsKSB7CisJICB0cnkgeworCQlSb3dNZXRhSW50ZXJmYWNlIHJvdyA9IHRyYW5zTWV0YS5nZXRQcmV2U3RlcEZpZWxkcyhzdGVwTWV0YSk7CisKKwkJaWYgKHJvdy5zaXplKCkgPT0gMCkgeworCQkgIC8qTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLAorCQkJICAiU1NUYWJsZU91dHB1dERhdGEuTWVzc2FnZS5Ob0luY29taW5nRmllbGRzLlRpdGxlIiksIEJhc2VNZXNzYWdlcworCQkJICAuZ2V0U3RyaW5nKFBLRywgIlNTVGFibGVPdXRwdXREYXRhLk1lc3NhZ2UuTm9JbmNvbWluZ0ZpZWxkcyIpKTsqLworCQkgIHJldHVybjsKKwkJfQorCQl3RmlsZW5hbWVGaWVsZC5yZW1vdmVBbGwoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByb3cuc2l6ZSgpOyBpKyspIHsKKwkJICBWYWx1ZU1ldGFJbnRlcmZhY2Ugdm0gPSByb3cuZ2V0VmFsdWVNZXRhKGkpOworCQkgIHdGaWxlbmFtZUZpZWxkLmFkZCh2bS5nZXROYW1lKCkpOworCQl9CisKKwkJd01ldGFkYXRhRmllbGQucmVtb3ZlQWxsKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcm93LnNpemUoKTsgaSsrKSB7CisJCSAgVmFsdWVNZXRhSW50ZXJmYWNlIHZtID0gcm93LmdldFZhbHVlTWV0YShpKTsKKwkJICB3TWV0YWRhdGFGaWVsZC5hZGQodm0uZ2V0TmFtZSgpKTsKKwkJfQorCisJICB9IGNhdGNoIChLZXR0bGVTdGVwRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkgIH0KKwl9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3Jpbmdlc3QvRmlsZW1nckluZ2VzdFN0ZXBNZXRhLmphdmEgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwTWV0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDliOGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L0ZpbGVtZ3JJbmdlc3RTdGVwTWV0YS5qYXZhCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyaW5nZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5DaGVja1Jlc3VsdDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLkNoZWNrUmVzdWx0SW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUuYW5ub3RhdGlvbnMuU3RlcDsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmRhdGFiYXNlLkRhdGFiYXNlTWV0YTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5leGNlcHRpb24uS2V0dGxlU3RlcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVWYWx1ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLmV4Y2VwdGlvbi5LZXR0bGVYTUxFeGNlcHRpb247CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuUm93TWV0YUludGVyZmFjZTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5jb3JlLnJvdy5WYWx1ZU1ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS5yb3cuVmFsdWVNZXRhSW50ZXJmYWNlOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlU3BhY2U7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkuY29yZS54bWwuWE1MSGFuZGxlcjsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5pMThuLkJhc2VNZXNzYWdlczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS5yZXBvc2l0b3J5Lk9iamVjdElkOworaW1wb3J0IG9yZy5wZW50YWhvLmRpLnJlcG9zaXRvcnkuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuczsKK2ltcG9ydCBvcmcucGVudGFoby5kaS50cmFucy5UcmFuc01ldGE7CitpbXBvcnQgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcC4qOworaW1wb3J0IG9yZy5wZW50YWhvLm1ldGFzdG9yZS5hcGkuSU1ldGFTdG9yZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSBkZW1vIHN0ZXAgcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbi4KKyAqIEl0IGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYSBwbHVnLWluIHN0ZXAgZm9yIFBESS4gCisgKiAKKyAqIFRoZSBkZW1vIHN0ZXAgYWRkcyBhIG5ldyBzdHJpbmcgZmllbGQgdG8gdGhlIHJvdyBzdHJlYW0gYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byAiSGVsbG8gV29ybGQhIi4gVGhlIHVzZXIgbWF5IHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgbmV3IGZpZWxkLgorICogICAKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFN0ZXBNZXRhSW50ZXJmYWNlLgorICogQ2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgbmVlZCB0bzoKKyAqIAorICogLSBrZWVwIHRyYWNrIG9mIHRoZSBzdGVwIHNldHRpbmdzCisgKiAtIHNlcmlhbGl6ZSBzdGVwIHNldHRpbmdzIGJvdGggdG8geG1sIGFuZCBhIHJlcG9zaXRvcnkKKyAqIC0gcHJvdmlkZSBuZXcgaW5zdGFuY2VzIG9mIG9iamVjdHMgaW1wbGVtZW50aW5nIFN0ZXBEaWFsb2dJbnRlcmZhY2UsIFN0ZXBJbnRlcmZhY2UgYW5kIFN0ZXBEYXRhSW50ZXJmYWNlCisgKiAtIHJlcG9ydCBvbiBob3cgdGhlIHN0ZXAgbW9kaWZpZXMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgcm93LXN0cmVhbSAocm93IHN0cnVjdHVyZSBhbmQgZmllbGQgdHlwZXMpCisgKiAtIHBlcmZvcm0gYSBzYW5pdHktY2hlY2sgb24gdGhlIHNldHRpbmdzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIAorICogCisgKi8KKworQFN0ZXAoCQorCQlpZCA9ICJGaWxlbWdySW5nZXN0IiwKKwkJaW1hZ2UgPSAib3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3JjaGVjay9yZXNvdXJjZXMvY2hlY2svb29kdC5qcGciLAorCQlpMThuUGFja2FnZU5hbWU9ImJpLm1ldGVvcml0ZS5maWxlbWdyaW5nZXN0IiwKKwkJbmFtZT0iRmlsZW1nckluZ2VzdFN0ZXAuTmFtZSIsCisJCWRlc2NyaXB0aW9uID0gIkZpbGVtZ3JJbmdlc3RTdGVwLlRvb2x0aXBEZXNjIiwKKwkJY2F0ZWdvcnlEZXNjcmlwdGlvbj0iaTE4bjpvcmcucGVudGFoby5kaS50cmFucy5zdGVwOkJhc2VTdGVwLkNhdGVnb3J5LkJpZ0RhdGEiCispCitwdWJsaWMgY2xhc3MgRmlsZW1nckluZ2VzdFN0ZXBNZXRhIGV4dGVuZHMgQmFzZVN0ZXBNZXRhIGltcGxlbWVudHMgU3RlcE1ldGFJbnRlcmZhY2UgeworCisJLyoqCisJICoJVGhlIFBLRyBtZW1iZXIgaXMgdXNlZCB3aGVuIGxvb2tpbmcgdXAgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KKwkgKglUaGUgcHJvcGVydGllcyBmaWxlIHdpdGggbG9jYWxpemVkIGtleXMgaXMgZXhwZWN0ZWQgdG8gcmVzaWRlIGluIAorCSAqCXt0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkfS9tZXNzYWdlcy9tZXNzYWdlc197bG9jYWxlfS5wcm9wZXJ0aWVzICAgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gUEtHID0gRmlsZW1nckluZ2VzdFN0ZXBNZXRhLmNsYXNzOyAvLyBmb3IgaTE4biBwdXJwb3NlcworCQorCS8qKgorCSAqIFN0b3JlcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWRkZWQgdG8gdGhlIHJvdy1zdHJlYW0uIAorCSAqLworCXByaXZhdGUgU3RyaW5nIG91dHB1dEZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyVVJMRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0RmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0YWRhdGFGaWVsZDsKKworICAgIC8qKgorCSAqIENvbnN0cnVjdG9yIHNob3VsZCBjYWxsIHN1cGVyKCkgdG8gbWFrZSBzdXJlIHRoZSBiYXNlIGNsYXNzIGhhcyBhIGNoYW5jZSB0byBpbml0aWFsaXplIHByb3Blcmx5LgorCSAqLworCXB1YmxpYyBGaWxlbWdySW5nZXN0U3RlcE1ldGEoKSB7CisJCXN1cGVyKCk7IAorCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgYnkgU3Bvb24gdG8gZ2V0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTV1QgZGlhbG9nIGZvciB0aGUgc3RlcC4KKwkgKiBBIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHBhc3NpbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN0ZXAgZGlhbG9nIGlzIHJlY29tbWVuZGVkLgorCSAqIAorCSAqIEBwYXJhbSBzaGVsbAkJYW4gU1dUIFNoZWxsCisJICogQHBhcmFtIG1ldGEgCQlkZXNjcmlwdGlvbiBvZiB0aGUgc3RlcCAKKwkgKiBAcGFyYW0gdHJhbnNNZXRhCWRlc2NyaXB0aW9uIG9mIHRoZSB0aGUgdHJhbnNmb3JtYXRpb24gCisJICogQHBhcmFtIG5hbWUJCXRoZSBuYW1lIG9mIHRoZSBzdGVwCisJICogQHJldHVybiAJCQluZXcgaW5zdGFuY2Ugb2YgYSBkaWFsb2cgZm9yIHRoaXMgc3RlcCAKKwkgKi8KKwlwdWJsaWMgU3RlcERpYWxvZ0ludGVyZmFjZSBnZXREaWFsb2coU2hlbGwgc2hlbGwsIFN0ZXBNZXRhSW50ZXJmYWNlIG1ldGEsIFRyYW5zTWV0YSB0cmFuc01ldGEsIFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuZXcgRmlsZW1nckluZ2VzdFN0ZXBEaWFsb2coc2hlbGwsIG1ldGEsIHRyYW5zTWV0YSwgbmFtZSk7CisJfQorCisJLyoqCisJICogQ2FsbGVkIGJ5IFBESSB0byBnZXQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHN0ZXAgaW1wbGVtZW50YXRpb24uIAorCSAqIEEgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gcGFzc2luZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3RlcCBjbGFzcyBpcyByZWNvbW1lbmRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gc3RlcE1ldGEJCQkJZGVzY3JpcHRpb24gb2YgdGhlIHN0ZXAKKwkgKiBAcGFyYW0gc3RlcERhdGFJbnRlcmZhY2UJCWluc3RhbmNlIG9mIGEgc3RlcCBkYXRhIGNsYXNzCisJICogQHBhcmFtIGNucgkJCQkJY29weSBudW1iZXIKKwkgKiBAcGFyYW0gdHJhbnNNZXRhCQkJCWRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbgorCSAqIEBwYXJhbSBkaXNwCQkJCQlydW50aW1lIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbgorCSAqIEByZXR1cm4JCQkJCQl0aGUgbmV3IGluc3RhbmNlIG9mIGEgc3RlcCBpbXBsZW1lbnRhdGlvbiAKKwkgKi8KKwlwdWJsaWMgU3RlcEludGVyZmFjZSBnZXRTdGVwKFN0ZXBNZXRhIHN0ZXBNZXRhLCBTdGVwRGF0YUludGVyZmFjZSBzdGVwRGF0YUludGVyZmFjZSwgaW50IGNuciwgVHJhbnNNZXRhIHRyYW5zTWV0YSwgVHJhbnMgZGlzcCkgeworCQlyZXR1cm4gbmV3IEZpbGVtZ3JJbmdlc3RTdGVwKHN0ZXBNZXRhLCBzdGVwRGF0YUludGVyZmFjZSwgY25yLCB0cmFuc01ldGEsIGRpc3ApOworCX0KKworCS8qKgorCSAqIENhbGxlZCBieSBQREkgdG8gZ2V0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzdGVwIGRhdGEgY2xhc3MuCisJICovCisJcHVibGljIFN0ZXBEYXRhSW50ZXJmYWNlIGdldFN0ZXBEYXRhKCkgeworCQlyZXR1cm4gbmV3IEZpbGVtZ3JJbmdlc3RTdGVwRGF0YSgpOworCX0JCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZXZlcnkgdGltZSBhIG5ldyBzdGVwIGlzIGNyZWF0ZWQgYW5kIHNob3VsZCBhbGxvY2F0ZS9zZXQgdGhlIHN0ZXAgY29uZmlndXJhdGlvbgorCSAqIHRvIHNlbnNpYmxlIGRlZmF1bHRzLiBUaGUgdmFsdWVzIHNldCBoZXJlIHdpbGwgYmUgdXNlZCBieSBTcG9vbiB3aGVuIGEgbmV3IHN0ZXAgaXMgY3JlYXRlZC4gICAgCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdCgpIHsKKwkJb3V0cHV0RmllbGQgPSAiZGVtb19maWVsZCI7CisgICAgICAgIGZpbGVuYW1lRmllbGQgPSAiIjsKKyAgICAgICAgc2VydmVyVVJMRmllbGQgPSAiaHR0cDovL2xvY2FsaG9zdDo5MDAwIjsKKyAgICAgICAgcmVzdWx0RmllbGQgPSAicmVzdWx0IjsKKyAgICAgICAgbWV0YWRhdGFGaWVsZCA9ICIiOworCX0KKwkKKwkvKioKKwkgKiBHZXR0ZXIgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCBieSB0aGlzIHN0ZXAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RmllbGQoKSB7CisJCXJldHVybiBvdXRwdXRGaWVsZDsKKwl9CisKKwkvKioKKwkgKiBTZXR0ZXIgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhZGRlZCBieSB0aGlzIHN0ZXAKKwkgKiBAcGFyYW0gb3V0cHV0RmllbGQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFkZGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3V0cHV0RmllbGQoU3RyaW5nIG91dHB1dEZpZWxkKSB7CisJCXRoaXMub3V0cHV0RmllbGQgPSBvdXRwdXRGaWVsZDsKKwl9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWVGaWVsZCgpeworICAgICAgICByZXR1cm4gZmlsZW5hbWVGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZUZpZWxkKFN0cmluZyBmaWxlbmFtZUZpZWxkKXsKKyAgICAgICAgdGhpcy5maWxlbmFtZUZpZWxkID0gZmlsZW5hbWVGaWVsZDsKKyAgICB9CisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIGEgc3RlcCBpcyBkdXBsaWNhdGVkIGluIFNwb29uLiBJdCBuZWVkcyB0byByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcworCSAqIHN0ZXAgbWV0YSBvYmplY3QuIEJlIHN1cmUgdG8gY3JlYXRlIHByb3BlciBkZWVwIGNvcGllcyBpZiB0aGUgc3RlcCBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbgorCSAqIG1vZGlmaWFibGUgb2JqZWN0cy4KKwkgKiAKKwkgKiBTZWUgb3JnLnBlbnRhaG8uZGkudHJhbnMuc3RlcHMucm93Z2VuZXJhdG9yLlJvd0dlbmVyYXRvck1ldGEuY2xvbmUoKSBmb3IgYW4gZXhhbXBsZSBvbiBjcmVhdGluZworCSAqIGEgZGVlcCBjb3B5LgorCSAqIAorCSAqIEByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcworCSAqLworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisJCU9iamVjdCByZXR2YWwgPSBzdXBlci5jbG9uZSgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgU3Bvb24gd2hlbiBhIHN0ZXAgbmVlZHMgdG8gc2VyaWFsaXplIGl0cyBjb25maWd1cmF0aW9uIHRvIFhNTC4gVGhlIGV4cGVjdGVkCisJICogcmV0dXJuIHZhbHVlIGlzIGFuIFhNTCBmcmFnbWVudCBjb25zaXN0aW5nIG9mIG9uZSBvciBtb3JlIFhNTCB0YWdzLiAgCisJICogCisJICogUGxlYXNlIHVzZSBvcmcucGVudGFoby5kaS5jb3JlLnhtbC5YTUxIYW5kbGVyIHRvIGNvbnZlbmllbnRseSBnZW5lcmF0ZSB0aGUgWE1MLgorCSAqIAorCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgWE1MIHNlcmlhbGl6YXRpb24gb2YgdGhpcyBzdGVwCisJICovCisJcHVibGljIFN0cmluZyBnZXRYTUwoKSB0aHJvd3MgS2V0dGxlVmFsdWVFeGNlcHRpb24geworCQkKKwkJLy8gb25seSBvbmUgZmllbGQgdG8gc2VyaWFsaXplCisJCVN0cmluZyB4bWwgPSAgIiAiOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJvdXRwdXRmaWVsZCIsIG91dHB1dEZpZWxkKTsKKyAgICAgICAgeG1sICs9ICIgICAgIiArWE1MSGFuZGxlci5hZGRUYWdWYWx1ZSgiZmlsZW5hbWVmaWVsZCIsIGZpbGVuYW1lRmllbGQpOworICAgICAgICB4bWwgKz0gIiAgICAiICtYTUxIYW5kbGVyLmFkZFRhZ1ZhbHVlKCJzZXJ2ZXJ1cmxmaWVsZCIsIHNlcnZlclVSTEZpZWxkKTsKKyAgICAgICAgeG1sICs9ICIgICAgIiArWE1MSGFuZGxlci5hZGRUYWdWYWx1ZSgicmVzdWx0ZmllbGQiLCByZXN1bHRGaWVsZCk7CisgICAgICAgIHhtbCArPSAiICAgICIgK1hNTEhhbmRsZXIuYWRkVGFnVmFsdWUoIm1ldGFkYXRhZmllbGQiLCBtZXRhZGF0YUZpZWxkKTsKKwkJcmV0dXJuIHhtbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIHdoZW4gYSBzdGVwIG5lZWRzIHRvIGxvYWQgaXRzIGNvbmZpZ3VyYXRpb24gZnJvbSBYTUwuCisJICogCisJICogUGxlYXNlIHVzZSBvcmcucGVudGFoby5kaS5jb3JlLnhtbC5YTUxIYW5kbGVyIHRvIGNvbnZlbmllbnRseSByZWFkIGZyb20gdGhlCisJICogWE1MIG5vZGUgcGFzc2VkIGluLgorCSAqIAorCSAqIEBwYXJhbSBzdGVwbm9kZQl0aGUgWE1MIG5vZGUgY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbgorCSAqIEBwYXJhbSBkYXRhYmFzZXMJdGhlIGRhdGFiYXNlcyBhdmFpbGFibGUgaW4gdGhlIHRyYW5zZm9ybWF0aW9uCisJICogQHBhcmFtIG1ldGFTdG9yZSB0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgbG9hZFhNTChOb2RlIHN0ZXBub2RlLCBMaXN0PERhdGFiYXNlTWV0YT4gZGF0YWJhc2VzLCBJTWV0YVN0b3JlIG1ldGFTdG9yZSkgdGhyb3dzIEtldHRsZVhNTEV4Y2VwdGlvbiB7CisKKwkJdHJ5IHsKKwkJCXNldE91dHB1dEZpZWxkKFhNTEhhbmRsZXIuZ2V0Tm9kZVZhbHVlKFhNTEhhbmRsZXIuZ2V0U3ViTm9kZShzdGVwbm9kZSwgIm91dHB1dGZpZWxkIikpKTsKKyAgICAgICAgICAgIHNldEZpbGVuYW1lRmllbGQoWE1MSGFuZGxlci5nZXROb2RlVmFsdWUoWE1MSGFuZGxlci5nZXRTdWJOb2RlKHN0ZXBub2RlLCAiZmlsZW5hbWVmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRTZXJ2ZXJVUkxGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJzZXJ2ZXJ1cmxmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRSZXN1bHRGaWVsZChYTUxIYW5kbGVyLmdldE5vZGVWYWx1ZShYTUxIYW5kbGVyLmdldFN1Yk5vZGUoc3RlcG5vZGUsICJyZXN1bHRmaWVsZCIpKSk7CisgICAgICAgICAgICBzZXRNZXRhZGF0YUZpZWxkKFhNTEhhbmRsZXIuZ2V0Tm9kZVZhbHVlKFhNTEhhbmRsZXIuZ2V0U3ViTm9kZShzdGVwbm9kZSwibWV0YWRhdGFmaWVsZCIpKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgS2V0dGxlWE1MRXhjZXB0aW9uKCJEZW1vIHBsdWdpbiB1bmFibGUgdG8gcmVhZCBzdGVwIGluZm8gZnJvbSBYTUwgbm9kZSIsIGUpOworCQl9CisKKwl9CQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBTcG9vbiB3aGVuIGEgc3RlcCBuZWVkcyB0byBzZXJpYWxpemUgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYSByZXBvc2l0b3J5LgorCSAqIFRoZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyB0byBzYXZlIHRoZSBzdGVwIGF0dHJpYnV0ZXMuCisJICoKKwkgKiBAcGFyYW0gcmVwCQkJCQl0aGUgcmVwb3NpdG9yeSB0byBzYXZlIHRvCisJICogQHBhcmFtIG1ldGFTdG9yZQkJCQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgd3JpdGUgdG8KKwkgKiBAcGFyYW0gaWRfdHJhbnNmb3JtYXRpb24JCXRoZSBpZCB0byB1c2UgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiB3aGVuIHNhdmluZworCSAqIEBwYXJhbSBpZF9zdGVwCQkJCXRoZSBpZCB0byB1c2UgZm9yIHRoZSBzdGVwICB3aGVuIHNhdmluZworCSAqLworCXB1YmxpYyB2b2lkIHNhdmVSZXAoUmVwb3NpdG9yeSByZXAsIElNZXRhU3RvcmUgbWV0YVN0b3JlLCBPYmplY3RJZCBpZF90cmFuc2Zvcm1hdGlvbiwgT2JqZWN0SWQgaWRfc3RlcCkgdGhyb3dzIEtldHRsZUV4Y2VwdGlvbgorCXsKKwkJdHJ5eworCQkJcmVwLnNhdmVTdGVwQXR0cmlidXRlKGlkX3RyYW5zZm9ybWF0aW9uLCBpZF9zdGVwLCAib3V0cHV0ZmllbGQiLCBvdXRwdXRGaWVsZCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgS2V0dGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gc2F2ZSBzdGVwIGludG8gcmVwb3NpdG9yeTogIitpZF9zdGVwLCBlKTsgCisJCX0KKwl9CQkKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUERJIHdoZW4gYSBzdGVwIG5lZWRzIHRvIHJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIHJlcG9zaXRvcnkuCisJICogVGhlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBtZXRob2RzIHRvIHJlYWQgdGhlIHN0ZXAgYXR0cmlidXRlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVwCQl0aGUgcmVwb3NpdG9yeSB0byByZWFkIGZyb20KKwkgKiBAcGFyYW0gbWV0YVN0b3JlCXRoZSBtZXRhU3RvcmUgdG8gb3B0aW9uYWxseSByZWFkIGZyb20KKwkgKiBAcGFyYW0gaWRfc3RlcAl0aGUgaWQgb2YgdGhlIHN0ZXAgYmVpbmcgcmVhZAorCSAqIEBwYXJhbSBkYXRhYmFzZXMJdGhlIGRhdGFiYXNlcyBhdmFpbGFibGUgaW4gdGhlIHRyYW5zZm9ybWF0aW9uCisJICovCisJcHVibGljIHZvaWQgcmVhZFJlcChSZXBvc2l0b3J5IHJlcCwgSU1ldGFTdG9yZSBtZXRhU3RvcmUsIE9iamVjdElkIGlkX3N0ZXAsIExpc3Q8RGF0YWJhc2VNZXRhPiBkYXRhYmFzZXMpIHRocm93cyBLZXR0bGVFeGNlcHRpb24gIHsKKwkJdHJ5eworCQkJb3V0cHV0RmllbGQgID0gcmVwLmdldFN0ZXBBdHRyaWJ1dGVTdHJpbmcoaWRfc3RlcCwgIm91dHB1dGZpZWxkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgS2V0dGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBzdGVwIGZyb20gcmVwb3NpdG9yeSIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgY2hhbmdlcyB0aGUgc3RlcCBpcyBtYWtpbmcgdG8gdGhlIHJvdy1zdHJlYW0uCisJICogVG8gdGhhdCBlbmQgYSBSb3dNZXRhSW50ZXJmYWNlIG9iamVjdCBpcyBwYXNzZWQgaW4sIGNvbnRhaW5pbmcgdGhlIHJvdy1zdHJlYW0gc3RydWN0dXJlIGFzIGl0IGlzIHdoZW4gZW50ZXJpbmcKKwkgKiB0aGUgc3RlcC4gVGhpcyBtZXRob2QgbXVzdCBhcHBseSBhbnkgY2hhbmdlcyB0aGUgc3RlcCBtYWtlcyB0byB0aGUgcm93IHN0cmVhbS4gVXN1YWxseSBhIHN0ZXAgYWRkcyBmaWVsZHMgdG8gdGhlCisJICogcm93LXN0cmVhbS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRSb3dNZXRhCQl0aGUgcm93IHN0cnVjdHVyZSBjb21pbmcgaW4gdG8gdGhlIHN0ZXAKKwkgKiBAcGFyYW0gbmFtZSAJCQkJdGhlIG5hbWUgb2YgdGhlIHN0ZXAgbWFraW5nIHRoZSBjaGFuZ2VzCisJICogQHBhcmFtIGluZm8JCQkJcm93IHN0cnVjdHVyZXMgb2YgYW55IGluZm8gc3RlcHMgY29taW5nIGluCisJICogQHBhcmFtIG5leHRTdGVwCQkJdGhlIGRlc2NyaXB0aW9uIG9mIGEgc3RlcCB0aGlzIHN0ZXAgaXMgcGFzc2luZyByb3dzIHRvCisJICogQHBhcmFtIHNwYWNlCQkJCXRoZSB2YXJpYWJsZSBzcGFjZSBmb3IgcmVzb2x2aW5nIHZhcmlhYmxlcworCSAqIEBwYXJhbSByZXBvc2l0b3J5CQl0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZSBvcHRpb25hbGx5IHJlYWQgZnJvbQorCSAqIEBwYXJhbSBtZXRhU3RvcmUJCQl0aGUgbWV0YVN0b3JlIHRvIG9wdGlvbmFsbHkgcmVhZCBmcm9tCisJICovCisJcHVibGljIHZvaWQgZ2V0RmllbGRzKFJvd01ldGFJbnRlcmZhY2UgaW5wdXRSb3dNZXRhLCBTdHJpbmcgbmFtZSwgUm93TWV0YUludGVyZmFjZVtdIGluZm8sIFN0ZXBNZXRhIG5leHRTdGVwLCBWYXJpYWJsZVNwYWNlIHNwYWNlLCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIElNZXRhU3RvcmUgbWV0YVN0b3JlKSB0aHJvd3MgS2V0dGxlU3RlcEV4Y2VwdGlvbnsKKworCQkvKgorCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMgdGhlIG91dHB1dEZpZWxkIHRvIHRoZSByb3ctc3RyZWFtCisJCSAqLworCisJCS8vIGEgdmFsdWUgbWV0YSBvYmplY3QgY29udGFpbnMgdGhlIG1ldGEgZGF0YSBmb3IgYSBmaWVsZAorCQlWYWx1ZU1ldGFJbnRlcmZhY2UgdiA9IG5ldyBWYWx1ZU1ldGEob3V0cHV0RmllbGQsIFZhbHVlTWV0YS5UWVBFX1NUUklORyk7CisJCQorCQkvLyBzZXR0aW5nIHRyaW0gdHlwZSB0byAiYm90aCIKKwkJdi5zZXRUcmltVHlwZShWYWx1ZU1ldGEuVFJJTV9UWVBFX0JPVEgpOworCisJCS8vIHRoZSBuYW1lIG9mIHRoZSBzdGVwIHRoYXQgYWRkcyB0aGlzIGZpZWxkCisJCXYuc2V0T3JpZ2luKG5hbWUpOworCQkKKwkJLy8gbW9kaWZ5IHRoZSByb3cgc3RydWN0dXJlIGFuZCBhZGQgdGhlIGZpZWxkIHRoaXMgc3RlcCBnZW5lcmF0ZXMgIAorCQlpbnB1dFJvd01ldGEuYWRkVmFsdWVNZXRhKHYpOworCQkKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSAiVmVyaWZ5IFRyYW5zZm9ybWF0aW9uIiBvcHRpb24gaW4gU3Bvb24uIAorCSAqIEEgbGlzdCBvZiByZW1hcmtzIGlzIHBhc3NlZCBpbiB0aGF0IHRoaXMgbWV0aG9kIHNob3VsZCBhZGQgdG8uIEVhY2ggcmVtYXJrIGlzIGEgY29tbWVudCwgd2FybmluZywgZXJyb3IsIG9yIG9rLgorCSAqIFRoZSBtZXRob2Qgc2hvdWxkIHBlcmZvcm0gYXMgbWFueSBjaGVja3MgYXMgbmVjZXNzYXJ5IHRvIGNhdGNoIGRlc2lnbi10aW1lIGVycm9ycy4KKwkgKiAKKwkgKiBUeXBpY2FsIGNoZWNrcyBpbmNsdWRlOgorCSAqIC0gdmVyaWZ5IHRoYXQgYWxsIG1hbmRhdG9yeSBjb25maWd1cmF0aW9uIGlzIGdpdmVuCisJICogLSB2ZXJpZnkgdGhhdCB0aGUgc3RlcCByZWNlaXZlcyBhbnkgaW5wdXQsIHVubGVzcyBpdCdzIGEgcm93IGdlbmVyYXRpbmcgc3RlcAorCSAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0ZXAgZG9lcyBub3QgcmVjZWl2ZSBhbnkgaW5wdXQgaWYgaXQgZG9lcyBub3QgdGFrZSB0aGVtIGludG8gYWNjb3VudAorCSAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0ZXAgZmluZHMgZmllbGRzIGl0IHJlbGllcyBvbiBpbiB0aGUgcm93LXN0cmVhbQorCSAqIAorCSAqICAgQHBhcmFtIHJlbWFya3MJCXRoZSBsaXN0IG9mIHJlbWFya3MgdG8gYXBwZW5kIHRvCisJICogICBAcGFyYW0gdHJhbnNNZXRhCXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKwkgKiAgIEBwYXJhbSBzdGVwTWV0YQl0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHN0ZXAKKwkgKiAgIEBwYXJhbSBwcmV2CQl0aGUgc3RydWN0dXJlIG9mIHRoZSBpbmNvbWluZyByb3ctc3RyZWFtCisJICogICBAcGFyYW0gaW5wdXQJCW5hbWVzIG9mIHN0ZXBzIHNlbmRpbmcgaW5wdXQgdG8gdGhlIHN0ZXAKKwkgKiAgIEBwYXJhbSBvdXRwdXQJCW5hbWVzIG9mIHN0ZXBzIHRoaXMgc3RlcCBpcyBzZW5kaW5nIG91dHB1dCB0bworCSAqICAgQHBhcmFtIGluZm8JCWZpZWxkcyBjb21pbmcgaW4gZnJvbSBpbmZvIHN0ZXBzIAorCSAqICAgQHBhcmFtIG1ldGFTdG9yZQltZXRhU3RvcmUgdG8gb3B0aW9uYWxseSByZWFkIGZyb20KKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVjayhMaXN0PENoZWNrUmVzdWx0SW50ZXJmYWNlPiByZW1hcmtzLCBUcmFuc01ldGEgdHJhbnNNZXRhLCBTdGVwTWV0YSBzdGVwTWV0YSwgUm93TWV0YUludGVyZmFjZSBwcmV2LCBTdHJpbmcgaW5wdXRbXSwgU3RyaW5nIG91dHB1dFtdLCBSb3dNZXRhSW50ZXJmYWNlIGluZm8sIFZhcmlhYmxlU3BhY2Ugc3BhY2UsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgSU1ldGFTdG9yZSBtZXRhU3RvcmUpICB7CisJCQorCQlDaGVja1Jlc3VsdCBjcjsKKworCQkvLyBTZWUgaWYgdGhlcmUgYXJlIGlucHV0IHN0cmVhbXMgbGVhZGluZyB0byB0aGlzIHN0ZXAhCisJCWlmIChpbnB1dC5sZW5ndGggPiAwKSB7CisJCQljciA9IG5ldyBDaGVja1Jlc3VsdChDaGVja1Jlc3VsdC5UWVBFX1JFU1VMVF9PSywgQmFzZU1lc3NhZ2VzLmdldFN0cmluZyhQS0csICJEZW1vLkNoZWNrUmVzdWx0LlJlY2VpdmluZ1Jvd3MuT0siKSwgc3RlcE1ldGEpOworCQkJcmVtYXJrcy5hZGQoY3IpOworCQl9IGVsc2UgeworCQkJY3IgPSBuZXcgQ2hlY2tSZXN1bHQoQ2hlY2tSZXN1bHQuVFlQRV9SRVNVTFRfRVJST1IsIEJhc2VNZXNzYWdlcy5nZXRTdHJpbmcoUEtHLCAiRGVtby5DaGVja1Jlc3VsdC5SZWNlaXZpbmdSb3dzLkVSUk9SIiksIHN0ZXBNZXRhKTsKKwkJCXJlbWFya3MuYWRkKGNyKTsKKwkJfQkKKyAgICAJCisJfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJVUkxGaWVsZChTdHJpbmcgc2VydmVyVVJMRmllbGQpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJVUkxGaWVsZCA9IHNlcnZlclVSTEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyVVJMRmllbGQoKSB7CisgICAgICAgIHJldHVybiBzZXJ2ZXJVUkxGaWVsZDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdEZpZWxkKFN0cmluZyByZXN1bHRGaWVsZCkgeworICAgICAgICB0aGlzLnJlc3VsdEZpZWxkID0gcmVzdWx0RmllbGQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhRmllbGQoU3RyaW5nIG1ldGFkYXRhRmllbGQpIHsKKyAgICAgICAgdGhpcy5tZXRhZGF0YUZpZWxkID0gbWV0YWRhdGFGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFkYXRhRmllbGQoKSB7CisgICAgICAgIHJldHVybiBtZXRhZGF0YUZpZWxkOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3Jpbmdlc3QvT09EVENvbmZpZy5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9PT0RUQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2YjY0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3Jpbmdlc3QvT09EVENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyaW5nZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5Jbmdlc3RlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQ3JlYXRlZCBieSBidWdnIG9uIDA3LzAzLzE0LgorICovCitwdWJsaWMgY2xhc3MgT09EVENvbmZpZyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihPT0RUQ29uZmlnLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIFVSTCBmbVVybDsKKworICAgIHByaXZhdGUgSW5nZXN0ZXIgaW5nZXN0ZXI7CisKKyAgICBwdWJsaWMgSW5nZXN0ZXIgZ2V0SW5nZXN0ZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmluZ2VzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBVUkwgZ2V0Rm1VcmwoKXsKKyAgICAgICAgcmV0dXJuIHRoaXMuZm1Vcmw7CisgICAgfQorCisKKyAgICB2b2lkIGxvYWRJbmdlc3RlcihTdHJpbmcgZm1VcmxTdHIpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgU3RyaW5nIGluZ2VzdGVyQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5TdGRJbmdlc3RlciI7CisKKyAgICAgICAgICAgIFN0cmluZyBkYXRhVHJhbnNmZXJDbGFzcyA9Im9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKworICAgICAgICAgICAgU3RyaW5nIGNhY2hlRmFjdG9yeUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAvLyJvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IuaW5nZXN0LmNhY2hlLmZhY3RvcnkiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJDb25maWd1cmluZyBhbmQgYnVpbGRpbmcgaW5nZXN0ZXI6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGluZ2VzdGVyQ2xhc3MgKyAiXTogZGF0YSB0cmFuc2ZlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRyYW5zZmVyQ2xhc3MgKyAiXTogdG8gaW5nZXN0IHRvIGZpbGUgbWFuYWdlcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZm1VcmxTdHIgKyAiXSIpOworCisgICAgICAgICAgIGlmIChjYWNoZUZhY3RvcnlDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNvbmZpZ3VyaW5nIEluZ2VzdGVyIGNhY2hlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2FjaGVGYWN0b3J5Q2xhc3MgKyAiXSIpOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgdGhpcy5pbmdlc3RlciA9IFB1c2hQdWxsT2JqZWN0RmFjdG9yeS5jcmVhdGVJbmdlc3RlcigKKyAgICAgICAgICAgICAgICAgIGluZ2VzdGVyQ2xhc3MsIGNhY2hlRmFjdG9yeUNsYXNzKTsKKworICAgICAgICAgICB0aGlzLmZtVXJsID0gc2FmZUdldFVybEZyb21TdHJpbmcoZm1VcmxTdHIpOworCisgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJMIHNhZmVHZXRVcmxGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHIpIHsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBnZW5lcmF0ZSB1cmwgZnJvbSB1cmwgc3RyaW5nOiBbIgorICAgICAgICAgICAgICAgICAgICArIHVybFN0ciArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L09PRFRQcm9jZXNzZXMuamF2YSBiLzAuMTAvdG9vbHMvcGRpX3BsdWdpbi9zcmMvb3JnL2FwYWNoZS9vb2R0L2ZpbGVtZ3Jpbmdlc3QvT09EVFByb2Nlc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMjRkNGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L09PRFRQcm9jZXNzZXMuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuZmlsZW1ncmluZ2VzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5pbnRlcm5hbC5MaW5rZWRUcmVlTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5nZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBDcmVhdGVkIGJ5IGJ1Z2cgb24gMDcvMDMvMTQuCisgKi8KK3B1YmxpYyBjbGFzcyBPT0RUUHJvY2Vzc2VzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKE9PRFRQcm9jZXNzZXMuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVtZ3JVcmw7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FscmVhZHlJbkRhdGFiYXNlKE9PRFRDb25maWcgY29uZmlnLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbmdlc3RlcigpICE9IG51bGwgJiYgY29uZmlnLmdldEluZ2VzdGVyKCkuaGFzUHJvZHVjdCgKKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0Rm1VcmwoKSwgZmlsZW5hbWUpOworICAgIH0KKworICAgIE1ldGFkYXRhIGdldE1ldGFkYXRhKFN0cmluZyBqc29uKSB7CisgICAgICAgIEdzb24gZ3Nvbj1uZXcgR3NvbigpOworICAgICAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICB0YWJsZSA9IChIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KSBnc29uLmZyb21Kc29uKGpzb24sIHRhYmxlLmdldENsYXNzKCkpOworICAgICAgSGFzaHRhYmxlPFN0cmluZyxPYmplY3Q+IGh0ID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsT2JqZWN0PigpOworCisgICAgICAgIEFycmF5TGlzdCBsID0gKEFycmF5TGlzdCkgdGFibGUuZ2V0KCJkYXRhIik7CisgICAgICBpZihsIT1udWxsKSB7CisgICAgICAgIExpbmtlZFRyZWVNYXAgZCA9IChMaW5rZWRUcmVlTWFwKSBsLmdldCgwKTsKKyAgICAgICAgaHQucHV0QWxsKGQpOworCisgICAgICB9CisgICAgICBlbHNleworICAgICAgICBodC5wdXRBbGwodGFibGUpOworICAgICAgfQorCisgICAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKworICAgICAgICBtLmFkZE1ldGFkYXRhKGh0KTsKKyAgICAgICAgcmV0dXJuIG07CisKKyAgICB9CisKKyAgICBTdHJpbmcgaW5nZXN0KE9PRFRDb25maWcgY29uZmlnLCBGaWxlIHByb2R1Y3QsIE1ldGFkYXRhIHByb2R1Y3RNZXRkYXRhKSB0aHJvd3MgSW5nZXN0RXhjZXB0aW9uIHsKKyAgICAgICAvLyB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IGNvbmZpZy5nZXRJbmdlc3RlcigpLmluZ2VzdChjb25maWcuZ2V0Rm1VcmwoKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgcHJvZHVjdE1ldGRhdGEpOworLyogICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJTdWNjZXNzZnVsbHkgaW5nZXN0ZWQgcHJvZHVjdDogWyIgKyBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICsgIl06IHByb2R1Y3QgaWQ6ICIgKyBwcm9kdWN0SWQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiUHJvZHVjdENyYXdsZXI6IEV4Y2VwdGlvbiBpbmdlc3RpbmcgcHJvZHVjdDogWyIgKyBwcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBhdHRlbXB0aW5nIHRvIGNvbnRpbnVlIGNyYXdsaW5nIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0qLworICAgICAgICByZXR1cm4gcHJvZHVjdElkOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L1B1c2hQdWxsT2JqZWN0RmFjdG9yeS5qYXZhIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjgxMTgyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9QdXNoUHVsbE9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5maWxlbWdyaW5nZXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5pbmdlc3QuQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5DYWNoZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmluZ2VzdC5Jbmdlc3RlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBQdXNoUHVsbE9iamVjdEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBQdXNoUHVsbE9iamVjdEZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJEb24ndCBjb25zdHJ1Y3QgZmFjdG9yeSBjbGFzc2VzISIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgY3JlYXRlTmV3SW5zdGFuY2UoQ2xhc3M8VD4gY2xhenopIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAJdHJ5IHsKKwkJCXJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIG5ldyBvYmplY3QgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBJbmdlc3RlciBjcmVhdGVJbmdlc3RlcihTdHJpbmcgaW5nZXN0ZXJDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBjYWNoZUZhY3RvcnlDbGFzcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBkYXRhVHJhbnNmZXJGYWN0b3J5ID0gIm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5kYXRhdHJhbnNmZXIuTG9jYWxEYXRhVHJhbnNmZXJGYWN0b3J5IjsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUUkFOU0ZFUjogIiArIGRhdGFUcmFuc2ZlckZhY3RvcnkpOworICAgICAgICBpZiAoY2FjaGVGYWN0b3J5Q2xhc3MgPT0gbnVsbCB8fCBjYWNoZUZhY3RvcnlDbGFzcy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICByZXR1cm4gKEluZ2VzdGVyKSBDbGFzcy5mb3JOYW1lKGluZ2VzdGVyQ2xhc3MpLmdldENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXJGYWN0b3J5LmdldENsYXNzKCkpLm5ld0luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXJGYWN0b3J5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENsYXNzPENhY2hlRmFjdG9yeT4gY2FjaGVGYWN0b3J5ID0gKENsYXNzPENhY2hlRmFjdG9yeT4pIENsYXNzCisgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKGNhY2hlRmFjdG9yeUNsYXNzKTsKKyAgICAgICAgICAgIENhY2hlIGNhY2hlID0gY2FjaGVGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlQ2FjaGUoKTsKKyAgICAgICAgICAgIHJldHVybiAoSW5nZXN0ZXIpIENsYXNzLmZvck5hbWUoaW5nZXN0ZXJDbGFzcykuZ2V0Q29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlckZhY3RvcnkuZ2V0Q2xhc3MoKSwgY2FjaGUuZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKGRhdGFUcmFuc2ZlckZhY3RvcnksIGNhY2hlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9tZXNzYWdlcy9tZXNzYWdlc19lbl9VUy5wcm9wZXJ0aWVzIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9tZXNzYWdlcy9tZXNzYWdlc19lbl9VUy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjAwOGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L21lc3NhZ2VzL21lc3NhZ2VzX2VuX1VTLnByb3BlcnRpZXMKQEAgLTAsMCArMSw5IEBACitGaWxlbWdySW5nZXN0U3RlcC5OYW1lPU9PRFQgRmlsZW1nciBGaWxlIEluZ2VzdAorRmlsZW1nckluZ2VzdFN0ZXAuVG9vbHRpcERlc2M9Q2hlY2sgaWYgdGhlIE9PRFQgRmlsZW1nciBoYXMgYSBmaWxlIGluIGl0cyByZXBvc2l0b3J5CisKK0ZpbGVtZ3JJbmdlc3QuRmllbGROYW1lLkxhYmVsPUZpbGVuYW1lIEZpZWxkCisKK0ZpbGVtZ3JJbmdlc3QuTWV0YWRhdGFGaWVsZE5hbWUuTGFiZWw9TWV0YWRhdGEgRmllbGQKKworRmlsZW1nckluZ2VzdC5TZXJ2ZXJVUkwuTGFiZWw9RmlsZW1nciBVUkwKK0ZpbGVtZ3JJbmdlc3QuUmVzdWx0LkxhYmVsPVJlc3VsdCBGaWVsZApkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9yZXNvdXJjZXMvb29kdC5qcGcgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L3Jlc291cmNlcy9vb2R0LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODEwNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9yZXNvdXJjZXMvb29kdC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9yZXNvdXJjZXMvb29kdC5wbmcgYi8wLjEwL3Rvb2xzL3BkaV9wbHVnaW4vc3JjL29yZy9hcGFjaGUvb29kdC9maWxlbWdyaW5nZXN0L3Jlc291cmNlcy9vb2R0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC90b29scy9wZGlfcGx1Z2luL3NyYy9vcmcvYXBhY2hlL29vZHQvZmlsZW1ncmluZ2VzdC9yZXNvdXJjZXMvb29kdC5wbmcKZGlmZiAtLWdpdCBhLzAuMTAvdmFncmFudC9yYWRpeC9SRUFETUUudHh0IGIvMC4xMC92YWdyYW50L3JhZGl4L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyZWRkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvdmFncmFudC9yYWRpeC9SRUFETUUudHh0CkBAIC0wLDAgKzEsNTEgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBSRUFETUUudHh0CisjCisjIEBhdXRob3Igcml2ZXJtYUBhcGFjaGUub3JnCisjCisjIEBkZXNjcmlwdGlvbiBUaGlzIFJFQURNRSBkZXNjcmliZXMgaG93IHRvIHNldHVwLCBpbnN0YWxsLCBhbmQgcnVuIHJhZGl4LXZhZ3JhbnQuIAorIyBBZnRlciBjb21wbGV0aW5nIHRoZXNlIHN0ZXBzLCB5b3Ugd2lsbCBoYXZlIGEgZnVsbHkgY29uZmlndXJlZCBVYnVudHUgVmlydHVhbCAKKyMgTWFjaGluZSogcnVubmluZyBhIGZyZXNoIHZlcnNpb24gb2YgT09EVCBSQURpWC4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitSZXF1aXJlbWVudHM6CisxLiA1R0Igb2Ygc3BhY2UgdG8gaW5zdGFsbCBWTSBvbgorMi4gVmFncmFudDogc2VlIGh0dHA6Ly93d3cudmFncmFudHVwLmNvbS8KKzMuIFZpcnR1YWxCb3g6IHNlZSBodHRwczovL3d3dy52aXJ0dWFsYm94Lm9yZy93aWtpL0Rvd25sb2FkcworCitTZXR1cDoKKzEuIE1vZGlmeSB0aGUgY29udGVudHMgb2YgdmFncmFudC9lbnYuc2ggdG8gcmVmbGVjdCB5b3VyIGRlc2lyZWQgY29uZmlndXJhdGlvbgorICAgLSBhZGQgeW91ciBwcm9qZWN0IG5hbWUgZXRjIGhlcmUKKyAgIC0gY29uZmlndXJlIHdoaWNoIHR5cGUgb2YgUkFEaVggYnVpbGQgeW91IHdhbnQgaGVyZSAoZS5nLiBzb2xyLWVuYWJsZWQpCisyLiBNb2RpZnkgdGhlIFZhZ3JhbnRmaWxlIFZNX05BTUUgdG8gbmFtZSB5b3VyIFZNIChWTSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSkKKzMuIHZhZ3JhbnQgdXAKK05PVEU6IFRoZSBhYm92ZSBjb21tYW5kIHdpbGwgdGFrZSB1cCB0byAxNSBtaW51dGVzIHRoZSBmaXJzdCB0aW1lIHlvdSBydW4gaXQuCitOT1RFOiBBbGwgc291cmNlIGZpbGVzIHdpbGwgYmUgcGxhY2VkIHdpdGhpbiAvdXNyL2xvY2FsL3NyYyB3aXRoaW4gdGhlIFZNLgorCitTdGFydDoKKyogTk9URTogVGhlIHByb3Zpc2lvbmluZyBzY3JpcHQgYXV0byBzdGFydHMgT09EVCwgc28geW91IG1heSBza2lwIHRvIHN0ZXAgMgorMS4gKG9wdGlvbmFsKSBMYXVuY2ggT09EVCBpZiBub3QgYWxyZWFkeSBydW5uaW5nIGJlbG93CisgICA+IGNkICRPT0RUX0hPTUUvYmluCisgICA+IC4vb29kdCBzdGFydAorMi4gTmF2aWdhdGUgdG86IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9vcHN1aQorCistLS0tLQorKiBZb3UgY2FuIGxlYXJuIG1vcmUgYWJvdXQgaG93IHRvIHVzZSB5b3VyIG5ld2x5IGNyZWF0ZWQgdmlydHVhbCBtYWNoaW5lIGF0OiAKK2h0dHA6Ly93d3cudmFncmFudHVwLmNvbS8KZGlmZiAtLWdpdCBhLzAuMTAvdmFncmFudC9yYWRpeC9WYWdyYW50ZmlsZSBiLzAuMTAvdmFncmFudC9yYWRpeC9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDY3Mjk1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC92YWdyYW50L3JhZGl4L1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsMTI5IEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorCisjIFZpcnR1YWwgbWFjaGluZSBuYW1lCitWTV9OQU1FID0gIm9vZHRfcmFkaXhfdm0iCisKKyMgVmFncmFudGZpbGUgQVBJL3N5bnRheCB2ZXJzaW9uLiBEb24ndCB0b3VjaCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmchCitWQUdSQU5URklMRV9BUElfVkVSU0lPTiA9ICIyIgorCitWYWdyYW50LmNvbmZpZ3VyZShWQUdSQU5URklMRV9BUElfVkVSU0lPTikgZG8gfGNvbmZpZ3wKKyAgIyBBbGwgVmFncmFudCBjb25maWd1cmF0aW9uIGlzIGRvbmUgaGVyZS4gVGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24KKyAgIyBvcHRpb25zIGFyZSBkb2N1bWVudGVkIGFuZCBjb21tZW50ZWQgYmVsb3cuIEZvciBhIGNvbXBsZXRlIHJlZmVyZW5jZSwKKyAgIyBwbGVhc2Ugc2VlIHRoZSBvbmxpbmUgZG9jdW1lbnRhdGlvbiBhdCB2YWdyYW50dXAuY29tLgorCisgICMgRXZlcnkgVmFncmFudCB2aXJ0dWFsIGVudmlyb25tZW50IHJlcXVpcmVzIGEgYm94IHRvIGJ1aWxkIG9mZiBvZi4KKyAgY29uZmlnLnZtLmJveCA9ICJjaGVmL3VidW50dS0xMy4xMCIKKworICBjb25maWcudm0uZGVmaW5lIFZNX05BTUUgZG8gfG9vZHRfcmFkaXh8CisgIGVuZAorICBjb25maWcudm0ucHJvdmlkZXIgOnZpcnR1YWxib3ggZG8gfHZifAorICAgICAgdmIubmFtZSA9IFZNX05BTUUKKyAgZW5kCisKKyAgIyBUaGUgdXJsIGZyb20gd2hlcmUgdGhlICdjb25maWcudm0uYm94JyBib3ggd2lsbCBiZSBmZXRjaGVkIGlmIGl0CisgICMgZG9lc24ndCBhbHJlYWR5IGV4aXN0IG9uIHRoZSB1c2VyJ3Mgc3lzdGVtLgorICAjIGNvbmZpZy52bS5ib3hfdXJsID0gImh0dHA6Ly9kb21haW4uY29tL3BhdGgvdG8vYWJvdmUuYm94IgorCisgICMgQ3JlYXRlIGEgZm9yd2FyZGVkIHBvcnQgbWFwcGluZyB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIGEgc3BlY2lmaWMgcG9ydAorICAjIHdpdGhpbiB0aGUgbWFjaGluZSBmcm9tIGEgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywKKyAgIyBhY2Nlc3NpbmcgImxvY2FsaG9zdDo4MDgwIiB3aWxsIGFjY2VzcyBwb3J0IDgwIG9uIHRoZSBndWVzdCBtYWNoaW5lLgorICBjb25maWcudm0ubmV0d29yayAiZm9yd2FyZGVkX3BvcnQiLCBndWVzdDogODA4MCwgaG9zdDogODA4MAorCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6cGF0aCA9PiAidmFncmFudC9wcm92aXNpb24uc2giLCA6cHJpdmlsZWdlZCA9PiBmYWxzZQorCisgICMgQ3JlYXRlIGEgcHJpdmF0ZSBuZXR3b3JrLCB3aGljaCBhbGxvd3MgaG9zdC1vbmx5IGFjY2VzcyB0byB0aGUgbWFjaGluZQorICAjIHVzaW5nIGEgc3BlY2lmaWMgSVAuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgInByaXZhdGVfbmV0d29yayIsIGlwOiAiMTkyLjE2OC4zMy4xMCIKKworICAjIENyZWF0ZSBhIHB1YmxpYyBuZXR3b3JrLCB3aGljaCBnZW5lcmFsbHkgbWF0Y2hlZCB0byBicmlkZ2VkIG5ldHdvcmsuCisgICMgQnJpZGdlZCBuZXR3b3JrcyBtYWtlIHRoZSBtYWNoaW5lIGFwcGVhciBhcyBhbm90aGVyIHBoeXNpY2FsIGRldmljZSBvbgorICAjIHlvdXIgbmV0d29yay4KKyAgIyBjb25maWcudm0ubmV0d29yayAicHVibGljX25ldHdvcmsiCisKKyAgIyBJZiB0cnVlLCB0aGVuIGFueSBTU0ggY29ubmVjdGlvbnMgbWFkZSB3aWxsIGVuYWJsZSBhZ2VudCBmb3J3YXJkaW5nLgorICAjIERlZmF1bHQgdmFsdWU6IGZhbHNlCisgICMgY29uZmlnLnNzaC5mb3J3YXJkX2FnZW50ID0gdHJ1ZQorCisgICMgU2hhcmUgYW4gYWRkaXRpb25hbCBmb2xkZXIgdG8gdGhlIGd1ZXN0IFZNLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMKKyAgIyB0aGUgcGF0aCBvbiB0aGUgaG9zdCB0byB0aGUgYWN0dWFsIGZvbGRlci4gVGhlIHNlY29uZCBhcmd1bWVudCBpcworICAjIHRoZSBwYXRoIG9uIHRoZSBndWVzdCB0byBtb3VudCB0aGUgZm9sZGVyLiBBbmQgdGhlIG9wdGlvbmFsIHRoaXJkCisgICMgYXJndW1lbnQgaXMgYSBzZXQgb2Ygbm9uLXJlcXVpcmVkIG9wdGlvbnMuCisgICMgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uL2RhdGEiLCAiL3ZhZ3JhbnRfZGF0YSIKKworICAjIFByb3ZpZGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc28geW91IGNhbiBmaW5lLXR1bmUgdmFyaW91cworICAjIGJhY2tpbmcgcHJvdmlkZXJzIGZvciBWYWdyYW50LiBUaGVzZSBleHBvc2UgcHJvdmlkZXItc3BlY2lmaWMgb3B0aW9ucy4KKyAgIyBFeGFtcGxlIGZvciBWaXJ0dWFsQm94OgorICAjCisgICMgY29uZmlnLnZtLnByb3ZpZGVyICJ2aXJ0dWFsYm94IiBkbyB8dmJ8CisgICMgICAjIERvbid0IGJvb3Qgd2l0aCBoZWFkbGVzcyBtb2RlCisgICMgICB2Yi5ndWkgPSB0cnVlCisgICMKKyAgIyAgICMgVXNlIFZCb3hNYW5hZ2UgdG8gY3VzdG9taXplIHRoZSBWTS4gRm9yIGV4YW1wbGUgdG8gY2hhbmdlIG1lbW9yeToKKyAgIyAgIHZiLmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICMgZW5kCisgICMKKyAgIyBWaWV3IHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvdmlkZXIgeW91J3JlIHVzaW5nIGZvciBtb3JlCisgICMgaW5mb3JtYXRpb24gb24gYXZhaWxhYmxlIG9wdGlvbnMuCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggUHVwcGV0IHN0YW5kIGFsb25lLiAgUHVwcGV0IG1hbmlmZXN0cworICAjIGFyZSBjb250YWluZWQgaW4gYSBkaXJlY3RvcnkgcGF0aCByZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlLgorICAjIFlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBtYW5pZmVzdHMgZGlyZWN0b3J5IGFuZCBhIG1hbmlmZXN0IGluCisgICMgdGhlIGZpbGUgYmFzZS5wcCBpbiB0aGUgbWFuaWZlc3RzX3BhdGggZGlyZWN0b3J5LgorICAjCisgICMgQW4gZXhhbXBsZSBQdXBwZXQgbWFuaWZlc3QgdG8gcHJvdmlzaW9uIHRoZSBtZXNzYWdlIG9mIHRoZSBkYXk6CisgICMKKyAgIyAjIGdyb3VwIHsgInB1cHBldCI6CisgICMgIyAgIGVuc3VyZSA9PiAicHJlc2VudCIsCisgICMgIyB9CisgICMgIworICAjICMgRmlsZSB7IG93bmVyID0+IDAsIGdyb3VwID0+IDAsIG1vZGUgPT4gMDY0NCB9CisgICMgIworICAjICMgZmlsZSB7ICcvZXRjL21vdGQnOgorICAjICMgICBjb250ZW50ID0+ICJXZWxjb21lIHRvIEFwYWNoZSBPT0RUIFJBRGlYISBCdWlsdCBieSBWYWdyYW50LiAKKyAgIyAjICAgICAgICAgICAgICAgTWFuYWdlZCBieSBQdXBwZXQuXG4iCisgICMgIyB9CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJwdXBwZXQiIGRvIHxwdXBwZXR8CisgICMgICBwdXBwZXQubWFuaWZlc3RzX3BhdGggPSAibWFuaWZlc3RzIgorICAjICAgcHVwcGV0Lm1hbmlmZXN0X2ZpbGUgID0gInNpdGUucHAiCisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzb2xvLCBzcGVjaWZ5aW5nIGEgY29va2Jvb2tzIHBhdGgsIHJvbGVzCisgICMgcGF0aCwgYW5kIGRhdGFfYmFncyBwYXRoIChhbGwgcmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZSksIGFuZCBhZGRpbmcKKyAgIyBzb21lIHJlY2lwZXMgYW5kL29yIHJvbGVzLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9zb2xvIiBkbyB8Y2hlZnwKKyAgIyAgIGNoZWYuY29va2Jvb2tzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9jb29rYm9va3MiCisgICMgICBjaGVmLnJvbGVzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9yb2xlcyIKKyAgIyAgIGNoZWYuZGF0YV9iYWdzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9kYXRhX2JhZ3MiCisgICMgICBjaGVmLmFkZF9yZWNpcGUgIm15c3FsIgorICAjICAgY2hlZi5hZGRfcm9sZSAid2ViIgorICAjCisgICMgICAjIFlvdSBtYXkgYWxzbyBzcGVjaWZ5IGN1c3RvbSBKU09OIGF0dHJpYnV0ZXM6CisgICMgICBjaGVmLmpzb24gPSB7IDpteXNxbF9wYXNzd29yZCA9PiAiZm9vIiB9CisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzZXJ2ZXIsIHNwZWNpZnlpbmcgdGhlIGNoZWYgc2VydmVyIFVSTCwKKyAgIyBhbmQgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24ga2V5IChyZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlKS4KKyAgIworICAjIFRoZSBPcHNjb2RlIFBsYXRmb3JtIHVzZXMgSFRUUFMuIFN1YnN0aXR1dGUgeW91ciBvcmdhbml6YXRpb24gZm9yCisgICMgT1JHTkFNRSBpbiB0aGUgVVJMIGFuZCB2YWxpZGF0aW9uIGtleS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB1c2UgdGhlIGFwcHJvcHJpYXRlIFVSTCwgd2hpY2ggbWF5IGJlCisgICMgSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIGRlcGVuZGluZyBvbiB5b3VyIGNvbmZpZ3VyYXRpb24uIEFsc28gY2hhbmdlIHRoZQorICAjIHZhbGlkYXRpb24ga2V5IHRvIHZhbGlkYXRpb24ucGVtLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9jbGllbnQiIGRvIHxjaGVmfAorICAjICAgY2hlZi5jaGVmX3NlcnZlcl91cmwgPSAiaHR0cHM6Ly9hcGkub3BzY29kZS5jb20vb3JnYW5pemF0aW9ucy9PUkdOQU1FIgorICAjICAgY2hlZi52YWxpZGF0aW9uX2tleV9wYXRoID0gIk9SR05BTUUtdmFsaWRhdG9yLnBlbSIKKyAgIyBlbmQKKyAgIworICAjIElmIHlvdSdyZSB1c2luZyB0aGUgT3BzY29kZSBwbGF0Zm9ybSwgeW91ciB2YWxpZGF0b3IgY2xpZW50IGlzCisgICMgT1JHTkFNRS12YWxpZGF0b3IsIHJlcGxhY2luZyBPUkdOQU1FIHdpdGggeW91ciBvcmdhbml6YXRpb24gbmFtZS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIGNsaWVudCBuYW1lIGlzCisgICMgY2hlZi12YWxpZGF0b3IsIHVubGVzcyB5b3UgY2hhbmdlZCB0aGUgY29uZmlndXJhdGlvbi4KKyAgIworICAjICAgY2hlZi52YWxpZGF0aW9uX2NsaWVudF9uYW1lID0gIk9SR05BTUUtdmFsaWRhdG9yIgorZW5kCmRpZmYgLS1naXQgYS8wLjEwL3ZhZ3JhbnQvcmFkaXgvdmFncmFudC9jb25mL3Rlcm1pbmFsL2Jhc2hyYyBiLzAuMTAvdmFncmFudC9yYWRpeC92YWdyYW50L2NvbmYvdGVybWluYWwvYmFzaHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjE4NjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3ZhZ3JhbnQvcmFkaXgvdmFncmFudC9jb25mL3Rlcm1pbmFsL2Jhc2hyYwpAQCAtMCwwICsxLDExMCBAQAorIyB+Ly5iYXNocmM6IGV4ZWN1dGVkIGJ5IGJhc2goMSkgZm9yIG5vbi1sb2dpbiBzaGVsbHMuCisjIHNlZSAvdXNyL3NoYXJlL2RvYy9iYXNoL2V4YW1wbGVzL3N0YXJ0dXAtZmlsZXMgKGluIHRoZSBwYWNrYWdlIGJhc2gtZG9jKQorIyBmb3IgZXhhbXBsZXMKKworIyBJZiBub3QgcnVubmluZyBpbnRlcmFjdGl2ZWx5LCBkb24ndCBkbyBhbnl0aGluZworWyAteiAiJFBTMSIgXSAmJiByZXR1cm4KKworIyBkb24ndCBwdXQgZHVwbGljYXRlIGxpbmVzIG9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggc3BhY2UgaW4gdGhlIGhpc3RvcnkuCisjIFNlZSBiYXNoKDEpIGZvciBtb3JlIG9wdGlvbnMKK0hJU1RDT05UUk9MPWlnbm9yZWJvdGgKKworIyBhcHBlbmQgdG8gdGhlIGhpc3RvcnkgZmlsZSwgZG9uJ3Qgb3ZlcndyaXRlIGl0CitzaG9wdCAtcyBoaXN0YXBwZW5kCisKKyMgZm9yIHNldHRpbmcgaGlzdG9yeSBsZW5ndGggc2VlIEhJU1RTSVpFIGFuZCBISVNURklMRVNJWkUgaW4gYmFzaCgxKQorSElTVFNJWkU9MTAwMAorSElTVEZJTEVTSVpFPTIwMDAKKworIyBjaGVjayB0aGUgd2luZG93IHNpemUgYWZ0ZXIgZWFjaCBjb21tYW5kIGFuZCwgaWYgbmVjZXNzYXJ5LAorIyB1cGRhdGUgdGhlIHZhbHVlcyBvZiBMSU5FUyBhbmQgQ09MVU1OUy4KK3Nob3B0IC1zIGNoZWNrd2luc2l6ZQorCisjIElmIHNldCwgdGhlIHBhdHRlcm4gIioqIiB1c2VkIGluIGEgcGF0aG5hbWUgZXhwYW5zaW9uIGNvbnRleHQgd2lsbAorIyBtYXRjaCBhbGwgZmlsZXMgYW5kIHplcm8gb3IgbW9yZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMuCisjc2hvcHQgLXMgZ2xvYnN0YXIKKworIyBtYWtlIGxlc3MgbW9yZSBmcmllbmRseSBmb3Igbm9uLXRleHQgaW5wdXQgZmlsZXMsIHNlZSBsZXNzcGlwZSgxKQorWyAteCAvdXNyL2Jpbi9sZXNzcGlwZSBdICYmIGV2YWwgIiQoU0hFTEw9L2Jpbi9zaCBsZXNzcGlwZSkiCisKKyMgc2V0IHZhcmlhYmxlIGlkZW50aWZ5aW5nIHRoZSBjaHJvb3QgeW91IHdvcmsgaW4gKHVzZWQgaW4gdGhlIHByb21wdCBiZWxvdykKK2lmIFsgLXogIiRkZWJpYW5fY2hyb290IiBdICYmIFsgLXIgL2V0Yy9kZWJpYW5fY2hyb290IF07IHRoZW4KKyAgICBkZWJpYW5fY2hyb290PSQoY2F0IC9ldGMvZGViaWFuX2Nocm9vdCkKK2ZpCisKKyMgc2V0IGEgZmFuY3kgcHJvbXB0IChub24tY29sb3IsIHVubGVzcyB3ZSBrbm93IHdlICJ3YW50IiBjb2xvcikKK2Nhc2UgIiRURVJNIiBpbgorICAgIHh0ZXJtLWNvbG9yKSBjb2xvcl9wcm9tcHQ9eWVzOzsKK2VzYWMKKworIyB1bmNvbW1lbnQgZm9yIGEgY29sb3JlZCBwcm9tcHQsIGlmIHRoZSB0ZXJtaW5hbCBoYXMgdGhlIGNhcGFiaWxpdHk7IHR1cm5lZAorIyBvZmYgYnkgZGVmYXVsdCB0byBub3QgZGlzdHJhY3QgdGhlIHVzZXI6IHRoZSBmb2N1cyBpbiBhIHRlcm1pbmFsIHdpbmRvdworIyBzaG91bGQgYmUgb24gdGhlIG91dHB1dCBvZiBjb21tYW5kcywgbm90IG9uIHRoZSBwcm9tcHQKKyNmb3JjZV9jb2xvcl9wcm9tcHQ9eWVzCisKK2lmIFsgLW4gIiRmb3JjZV9jb2xvcl9wcm9tcHQiIF07IHRoZW4KKyAgICBpZiBbIC14IC91c3IvYmluL3RwdXQgXSAmJiB0cHV0IHNldGFmIDEgPiYvZGV2L251bGw7IHRoZW4KKwkjIFdlIGhhdmUgY29sb3Igc3VwcG9ydDsgYXNzdW1lIGl0J3MgY29tcGxpYW50IHdpdGggRWNtYS00OAorCSMgKElTTy9JRUMtNjQyOSkuIChMYWNrIG9mIHN1Y2ggc3VwcG9ydCBpcyBleHRyZW1lbHkgcmFyZSwgYW5kIHN1Y2gKKwkjIGEgY2FzZSB3b3VsZCB0ZW5kIHRvIHN1cHBvcnQgc2V0ZiByYXRoZXIgdGhhbiBzZXRhZi4pCisJY29sb3JfcHJvbXB0PXllcworICAgIGVsc2UKKwljb2xvcl9wcm9tcHQ9CisgICAgZmkKK2ZpCisKK2lmIFsgIiRjb2xvcl9wcm9tcHQiID0geWVzIF07IHRoZW4KKyAgICBQUzE9JyR7ZGViaWFuX2Nocm9vdDorKCRkZWJpYW5fY2hyb290KX1cW1wwMzNbMDE7MzJtXF1cdUBcaFxbXDAzM1swMG1cXTpcW1wwMzNbMDE7MzRtXF1cd1xbXDAzM1swMG1cXVwkICcKK2Vsc2UKKyAgICBQUzE9JyR7ZGViaWFuX2Nocm9vdDorKCRkZWJpYW5fY2hyb290KX1cdUBcaDpcd1wkICcKK2ZpCit1bnNldCBjb2xvcl9wcm9tcHQgZm9yY2VfY29sb3JfcHJvbXB0CisKKyMgSWYgdGhpcyBpcyBhbiB4dGVybSBzZXQgdGhlIHRpdGxlIHRvIHVzZXJAaG9zdDpkaXIKK2Nhc2UgIiRURVJNIiBpbgoreHRlcm0qfHJ4dnQqKQorICAgIFBTMT0iXFtcZV0wOyR7ZGViaWFuX2Nocm9vdDorKCRkZWJpYW5fY2hyb290KX1cdUBcaDogXHdcYVxdJFBTMSIKKyAgICA7OworKikKKyAgICA7OworZXNhYworCisjIGVuYWJsZSBjb2xvciBzdXBwb3J0IG9mIGxzIGFuZCBhbHNvIGFkZCBoYW5keSBhbGlhc2VzCitpZiBbIC14IC91c3IvYmluL2RpcmNvbG9ycyBdOyB0aGVuCisgICAgdGVzdCAtciB+Ly5kaXJjb2xvcnMgJiYgZXZhbCAiJChkaXJjb2xvcnMgLWIgfi8uZGlyY29sb3JzKSIgfHwgZXZhbCAiJChkaXJjb2xvcnMgLWIpIgorICAgIGFsaWFzIGxzPSdscyAtLWNvbG9yPWF1dG8nCisgICAgI2FsaWFzIGRpcj0nZGlyIC0tY29sb3I9YXV0bycKKyAgICAjYWxpYXMgdmRpcj0ndmRpciAtLWNvbG9yPWF1dG8nCisKKyAgICBhbGlhcyBncmVwPSdncmVwIC0tY29sb3I9YXV0bycKKyAgICBhbGlhcyBmZ3JlcD0nZmdyZXAgLS1jb2xvcj1hdXRvJworICAgIGFsaWFzIGVncmVwPSdlZ3JlcCAtLWNvbG9yPWF1dG8nCitmaQorCisjIHNvbWUgbW9yZSBscyBhbGlhc2VzCithbGlhcyBsbD0nbHMgLWFsRicKK2FsaWFzIGxhPSdscyAtQScKK2FsaWFzIGw9J2xzIC1DRicKKworIyBBZGQgYW4gImFsZXJ0IiBhbGlhcyBmb3IgbG9uZyBydW5uaW5nIGNvbW1hbmRzLiAgVXNlIGxpa2Ugc286CisjICAgc2xlZXAgMTA7IGFsZXJ0CithbGlhcyBhbGVydD0nbm90aWZ5LXNlbmQgLS11cmdlbmN5PWxvdyAtaSAiJChbICQ/ID0gMCBdICYmIGVjaG8gdGVybWluYWwgfHwgZWNobyBlcnJvcikiICIkKGhpc3Rvcnl8dGFpbCAtbjF8c2VkIC1lICdcJydzL15ccypbMC05XVwrXHMqLy87cy9bOyZ8XVxzKmFsZXJ0JC8vJ1wnJykiJworCisjIEFsaWFzIGRlZmluaXRpb25zLgorIyBZb3UgbWF5IHdhbnQgdG8gcHV0IGFsbCB5b3VyIGFkZGl0aW9ucyBpbnRvIGEgc2VwYXJhdGUgZmlsZSBsaWtlCisjIH4vLmJhc2hfYWxpYXNlcywgaW5zdGVhZCBvZiBhZGRpbmcgdGhlbSBoZXJlIGRpcmVjdGx5LgorIyBTZWUgL3Vzci9zaGFyZS9kb2MvYmFzaC1kb2MvZXhhbXBsZXMgaW4gdGhlIGJhc2gtZG9jIHBhY2thZ2UuCisKK2lmIFsgLWYgfi8uYmFzaF9hbGlhc2VzIF07IHRoZW4KKyAgICAuIH4vLmJhc2hfYWxpYXNlcworZmkKKworIyBlbmFibGUgcHJvZ3JhbW1hYmxlIGNvbXBsZXRpb24gZmVhdHVyZXMgKHlvdSBkb24ndCBuZWVkIHRvIGVuYWJsZQorIyB0aGlzLCBpZiBpdCdzIGFscmVhZHkgZW5hYmxlZCBpbiAvZXRjL2Jhc2guYmFzaHJjIGFuZCAvZXRjL3Byb2ZpbGUKKyMgc291cmNlcyAvZXRjL2Jhc2guYmFzaHJjKS4KK2lmIFsgLWYgL2V0Yy9iYXNoX2NvbXBsZXRpb24gXSAmJiAhIHNob3B0IC1vcSBwb3NpeDsgdGhlbgorICAgIC4gL2V0Yy9iYXNoX2NvbXBsZXRpb24KK2ZpCisKKyMgRXhwb3J0IGVudi5zaAorc291cmNlIC92YWdyYW50L3ZhZ3JhbnQvZW52LnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC92YWdyYW50L3JhZGl4L3ZhZ3JhbnQvZW52LnNoIGIvMC4xMC92YWdyYW50L3JhZGl4L3ZhZ3JhbnQvZW52LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMmFjMjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3ZhZ3JhbnQvcmFkaXgvdmFncmFudC9lbnYuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL2Jhc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIENIQU5HRSBCRUxPVyBGT1IgWU9VUiBQUk9KRUNUIE5FRURTIQorZXhwb3J0IFBST0pFQ1RfR1JPVVBfSUQ9Y29tLm15Y29tcGFueS5teWRtcworZXhwb3J0IFBST0pFQ1RfQVJUSUZBQ1RfSUQ9bXljb21wYW55LW15b29kdAorZXhwb3J0IEJVSUxEX0ZMQUdTPS1QZm0tc29sci1jYXRhbG9nICMgTk9URTogbW9yZSBmbGFnIG9wdGlvbnMgYXQgaHR0cDovL3MuYXBhY2hlLm9yZy9DSkwKK2V4cG9ydCBPT0RUX0RFUExPWU1FTlRfSE9NRT0vdXNyL2xvY2FsL29vZHQKKworIyBHZW5lcmFsIGNvbmZpZ3VyYXRpb24gKHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbW9kaWZ5KQorZXhwb3J0IE9PRFRfU1JDX1JFUE89aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90cnVuayAjIE5PVEU6IFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBiZWxvdyBPT0RUIHZlcnNpb24KK2V4cG9ydCBPT0RUX1ZFUlNJT049MC43LVNOQVBTSE9UCitleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9kZWZhdWx0LWphdmEKKwpkaWZmIC0tZ2l0IGEvMC4xMC92YWdyYW50L3JhZGl4L3ZhZ3JhbnQvcHJvdmlzaW9uLnNoIGIvMC4xMC92YWdyYW50L3JhZGl4L3ZhZ3JhbnQvcHJvdmlzaW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTA5NTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3ZhZ3JhbnQvcmFkaXgvdmFncmFudC9wcm92aXNpb24uc2gKQEAgLTAsMCArMSw3MCBAQAorIyEvYmluL2Jhc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgT09EVCBSQURpWCBWYWdyYW50IFByb3Zpc2lvbiBTY3JpcHQgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIExvYWQgY29uZmlnIGZpbGUKK3NvdXJjZSAvdmFncmFudC92YWdyYW50L2Vudi5zaAorCitlY2hvICJVcGRhdGUgVWJ1bnR14oCZcyBwYWNrYWdlIGluZGV4Igorc3VkbyBhcHQtZ2V0IHVwZGF0ZQorCisjIC0tLS0tLS0tLSBHRU5FUkFMIElOU1RBTEwvQ09ORklHIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgdmltIAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgc3VidmVyc2lvbgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgZ2l0CitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSB0cmVlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBjdXJsCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBtYXZlbjIKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGRlZmF1bHQtamRrCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBhY2sKKworIyAtLS0tLS0tLS0gR2VuZXJhbCBjb25maWcvaW5zdGFsbCAtLS0tLS0tLS0tCitzdWRvIGNwIC92YWdyYW50L3ZhZ3JhbnQvY29uZi90ZXJtaW5hbC9iYXNocmMgL2hvbWUvdmFncmFudC8uYmFzaHJjCitzb3VyY2UgL2hvbWUvdmFncmFudC8uYmFzaHJjCitzdWRvIG1rZGlyICR7T09EVF9ERVBMT1lNRU5UX0hPTUV9CitzdWRvIGNob3duIC1SIHZhZ3JhbnQ6dmFncmFudCAke09PRFRfREVQTE9ZTUVOVF9IT01FfQorCisKKyMgLS0tLS0tLS0tLSBPT0RUIEluc3RhbGxhdGlvbiAtLS0tLS0tLS0tLS0tLQorIyBOT1RFOiBDaGVja2luZyBvdXQgYW5kIGluc3RhbGxpbmcgT09EVCBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgdGhlIFNOQVBTSE9UIHZlcnNpb25zIG9mIE9PRFQKKyMgVE8gRE86IFNldCB1cCBzb21lIGxvZ2ljIGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBTTkFQU0hPVCAodHJ1bmspIGFuZCB0YWdnZWQgcmVsZWFzZXMKK2VjaG8gIkNoZWNraW5nIG91dCBsYXRlc3QgKHRydW5rKSBPT0RUIGZyb20gU1ZOIgorY2QgL3Vzci9sb2NhbC9zcmMKK3N1ZG8gc3ZuIGV4cG9ydCAke09PRFRfU1JDX1JFUE99IG9vZHQtJHtPT0RUX1ZFUlNJT059CitzdWRvIGNob3duIC1SIHZhZ3JhbnQ6dmFncmFudCBvb2R0LSR7T09EVF9WRVJTSU9OfQorZWNobyAiQnVpbGQgT09EVCBhbmQgUkFEaVggYXJjaGV0eXBlIgorY2Qgb29kdC0ke09PRFRfVkVSU0lPTn0KK212biAtRG1hdmVuLnRlc3Quc2tpcD10cnVlIGNsZWFuIGluc3RhbGwKK2NkIG12bi9hcmNoZXR5cGVzL3JhZGl4CitzdWRvIG12biBpbnN0YWxsCisKKyMgLS0tLS0tLS0tLSBTZXR1cCBuZXcgUkFEaVggcHJvamVjdCAtLS0tLS0tLQorY2QgL3Vzci9sb2NhbC9zcmMKK3N1ZG8gbXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGludGVyYWN0aXZlTW9kZT1mYWxzZSAtRGFyY2hldHlwZUdyb3VwSWQ9b3JnLmFwYWNoZS5vb2R0IC1EYXJjaGV0eXBlQXJ0aWZhY3RJZD1yYWRpeC1hcmNoZXR5cGUgLURhcmNoZXR5cGVWZXJzaW9uPSR7T09EVF9WRVJTSU9OfSAtRG9vZHQ9JHtPT0RUX1ZFUlNJT059IC1EZ3JvdXBJZD0ke1BST0pFQ1RfR1JPVVBfSUR9IC1EYXJ0aWZhY3RJZD0ke1BST0pFQ1RfQVJUSUZBQ1RfSUR9IC1EdmVyc2lvbj0wLjEtU05BUFNIT1QKK2NkICR7UFJPSkVDVF9BUlRJRkFDVF9JRH0KK3N1ZG8gbXZuIHBhY2thZ2UgJHtCVUlMRF9GTEFHU30KK3RhciB6eGYgZGlzdHJpYnV0aW9uL3RhcmdldC8ke1BST0pFQ1RfQVJUSUZBQ1RfSUR9LWRpc3RyaWJ1dGlvbi0qLWJpbi50YXIuZ3ogLUMgJHtPT0RUX0RFUExPWU1FTlRfSE9NRX0KKworIyAtLS0tLS0tLS0tIFN0YXJ0IE9PRFQgLS0tLS0tLS0tLQorY2QgJHtPT0RUX0RFUExPWU1FTlRfSE9NRX0vYmluCisuL29vZHQgc3RhcnQKK2VjaG8gIiIKK2VjaG8gIk9PRFQgc3RhcnRlZCwgcGxlYXNlIG5hdmlnYXRlIHRvOiBodHRwOi8vbG9jYWxob3N0OjgwODAvb3BzdWkiCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3BvbS54bWwgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjNzE5YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvcG9tLnhtbApAQCAtMCwwICsxLDE2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKwkKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisJPGFydGlmYWN0SWQ+b29kdC13ZWJhcHAtY29tcG9uZW50czwvYXJ0aWZhY3RJZD4KKwk8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCTxuYW1lPk9PRFQgV2lja2V0IFdlYiBDb21wb25lbnRzPC9uYW1lPgorCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS53aWNrZXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD53aWNrZXQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjQuMTY8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgIDxhcnRpZmFjdElkPmNhcy13b3JrZmxvdzwvYXJ0aWZhY3RJZD4KKwkJICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgkKKwkJICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCSAgPGFydGlmYWN0SWQ+cGNzLWNvcmU8L2FydGlmYWN0SWQ+CisJCSAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgkJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjUuODwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmxvZzRqPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjIuMTQ8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCSAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorCQkgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisJCSAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisJCSAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJICAgPGRlcGVuZGVuY3k+CisJICAgICAgPGdyb3VwSWQ+b3JnLnJlZmxlY3Rpb25zPC9ncm91cElkPgorCSAgICAgIDxhcnRpZmFjdElkPnJlZmxlY3Rpb25zPC9hcnRpZmFjdElkPgorCSAgICAgIDx2ZXJzaW9uPjAuOS45LVJDMTwvdmVyc2lvbj4KKwkgICA8L2RlcGVuZGVuY3k+CQkKKwk8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgPHByb2ZpbGVzPgorICAgICAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1VbmFwcHJvdmVkTGljZW5zZXM+MjwvbnVtVW5hcHByb3ZlZExpY2Vuc2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT53ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9wcm90b3R5cGUuanM8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT53ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9wcm9ncmVzcy5qczwvZXhjbHVkZT4KKwkJCQkJICAgICAgICAgICAgICAgIDxleGNsdWRlPndlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uLyoqL2pxdWVyeSo8L2V4Y2x1ZGU+CisJCQkJCSAgICAgICAgICAgICAgICA8ZXhjbHVkZT53ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi8qKi9qcXVlcnkvKjwvZXhjbHVkZT4KKwkJCQkJICAgICAgICAgICAgICAgIDxleGNsdWRlPndlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uLyoqL3NyYy9qcXVlcnkqPC9leGNsdWRlPgorCQkJCQkgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+d2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vKiovanF1ZXJ5LXRyZWV2aWV3Lyo8L2V4Y2x1ZGU+CisJCQkJCSAgICAgICAgICAgICAgICA8ZXhjbHVkZT53ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi8qKi9qcXVlcnktdHJlZXZpZXcvZGVtby8qPC9leGNsdWRlPgorCQkJCQkgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+d2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vKiovanF1ZXJ5LXRyZWV2aWV3L2xpYi8qPC9leGNsdWRlPgorCQkJCQkgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+d2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vKiovanF1ZXJ5LXVpLyo8L2V4Y2x1ZGU+CisJCQkJCSAgICAgICAgICAgICAgICA8ZXhjbHVkZT53ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi8qKi9qcXVlcnktdWkvY3NzL3Ntb290aG5lc3MvanF1ZXJ5LXVpLTEuNy4yLmN1c3RvbS5jc3M8L2V4Y2x1ZGU+CisJCQkJCSAgICAgICAgICAgICAgICA8ZXhjbHVkZT53ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi8qKi9zcmMvTUlULUxpY2Vuc2UudHh0PC9leGNsdWRlPgorCQkJCQkgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+d2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vKiovbWVkaWEvQmFjaC1TdWl0ZU5vMi5tcDM8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICAgICAgPC9wcm9maWxlPgorICAgICAgIDwvcHJvZmlsZXM+CisJPGJ1aWxkPgorCQk8cmVzb3VyY2VzPgorCQkJPHJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJPC9yZXNvdXJjZT4KKwkJCTxyZXNvdXJjZT4KKwkJCQk8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisJCQkJPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisJCQkJPGluY2x1ZGVzPgorCQkJCQk8aW5jbHVkZT4qKjwvaW5jbHVkZT4KKwkJCQk8L2luY2x1ZGVzPgorCQkJCTxleGNsdWRlcz4KKwkJCQkJPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorCQkJCTwvZXhjbHVkZXM+CisJCQk8L3Jlc291cmNlPgorCQk8L3Jlc291cmNlcz4KKwkJPHRlc3RSZXNvdXJjZXM+CisJCQk8dGVzdFJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy90ZXN0L2phdmE8L2RpcmVjdG9yeT4KKwkJCQk8aW5jbHVkZXM+CisJCQkJCTxpbmNsdWRlPioqPC9pbmNsdWRlPgorCQkJCTwvaW5jbHVkZXM+CisJCQkJPGV4Y2x1ZGVzPgorCQkJCQk8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisJCQkJPC9leGNsdWRlcz4KKwkJCTwvdGVzdFJlc291cmNlPgorCQk8L3Rlc3RSZXNvdXJjZXM+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c291cmNlPjEuNTwvc291cmNlPgorCQkJCQk8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorCQkJCQk8b3B0aW1pemU+dHJ1ZTwvb3B0aW1pemU+CisJCQkJCTxkZWJ1Zz50cnVlPC9kZWJ1Zz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+CisJPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmNzcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL1dvcmtiZW5jaC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMmJhOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL1dvcmtiZW5jaC5jc3MKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworVUwuZmlsZVRyZWUgeworICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBwYWRkaW5nOiAwcHg7CisgICAgbWFyZ2luOiAwcHg7Cit9CisKK0xJLmhlbHBlciB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOjExcHg7CisgICAgbGluZS1oZWlnaHQ6MThweDsKK30KKworVUwuZmlsZVRyZWUgTEksIExJLmhlbHBlciB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nOiAwcHg7CisgICAgcGFkZGluZy1sZWZ0OiAyMHB4OworICAgIG1hcmdpbjogMHB4OworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK1VMLmZpbGVUcmVlIEEsIExJLmhlbHBlciBBIHsKKyAgICBjb2xvcjogIzMzMzsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgcGFkZGluZzogMHB4IDJweDsKK30KKworVUwuZmlsZVRyZWUgQTpob3ZlciwgTEkuaGVscGVyIEEgeworICAgIGJhY2tncm91bmQ6ICNCREY7Cit9CisKKy8qIENvcmUgU3R5bGVzICovCisuZmlsZVRyZWUgTEkuZGlyZWN0b3J5LCBMSS5oZWxwZXIuZGlyZWN0b3J5IHsgYmFja2dyb3VuZDogdXJsKGRpcmVjdG9yeS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4cGFuZGVkLCBMSS5oZWxwZXIuZXhwYW5kZWQgICB7IGJhY2tncm91bmQ6IHVybChmb2xkZXJfb3Blbi5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmZpbGUsIExJLmhlbHBlci5maWxlICAgICAgICAgICB7IGJhY2tncm91bmQ6IHVybChmaWxlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkud2FpdCwgTEkuaGVscGVyLndhaXQgICAgICAgICAgIHsgYmFja2dyb3VuZDogdXJsKHNwaW5uZXIuZ2lmKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy8qIEZpbGUgRXh0ZW5zaW9ucyovCisuZmlsZVRyZWUgTEkuZXh0XzNncCwgTEkuaGVscGVyLmV4dF8zZ3AgeyBiYWNrZ3JvdW5kOiB1cmwoZmlsbS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9hZnAsIExJLmhlbHBlci5leHRfYWZwIHsgYmFja2dyb3VuZDogdXJsKGNvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfYWZwYSwgTEkuaGVscGVyLmV4dF9hZnBhIHsgYmFja2dyb3VuZDogdXJsKGNvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfYXNwLCBMSS5oZWxwZXIuZXh0X2FzcCB7IGJhY2tncm91bmQ6IHVybChjb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2FzcHgsIExJLmhlbHBlci5leHRfYXNweCB7IGJhY2tncm91bmQ6IHVybChjb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2F2aSwgTEkuaGVscGVyLmV4dF9hdmkgeyBiYWNrZ3JvdW5kOiB1cmwoZmlsbS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9iYXQsIExJLmhlbHBlci5leHRfYmF0IHsgYmFja2dyb3VuZDogdXJsKGFwcGxpY2F0aW9uLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2JtcCwgTEkuaGVscGVyLmV4dF9ibXAgeyBiYWNrZ3JvdW5kOiB1cmwocGljdHVyZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9jLCBMSS5oZWxwZXIuZXh0X2MgeyBiYWNrZ3JvdW5kOiB1cmwoY29kZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9jZm0sIExJLmhlbHBlci5leHRfY2ZtIHsgYmFja2dyb3VuZDogdXJsKGNvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfY2dpLCBMSS5oZWxwZXIuZXh0X2NnaSB7IGJhY2tncm91bmQ6IHVybChjb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2NvbSwgTEkuaGVscGVyLmV4dF9jb20geyBiYWNrZ3JvdW5kOiB1cmwoYXBwbGljYXRpb24ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfY3BwLCBMSS5oZWxwZXIuZXh0X2NwcCB7IGJhY2tncm91bmQ6IHVybChjb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2NzcywgTEkuaGVscGVyLmV4dF9jc3MgeyBiYWNrZ3JvdW5kOiB1cmwoY3NzLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2RvYywgTEkuaGVscGVyLmV4dF9kb2MgeyBiYWNrZ3JvdW5kOiB1cmwoZG9jLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2V4ZSwgTEkuaGVscGVyLmV4dF9leGUgeyBiYWNrZ3JvdW5kOiB1cmwoYXBwbGljYXRpb24ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfZ2lmLCBMSS5oZWxwZXIuZXh0X2dpZiB7IGJhY2tncm91bmQ6IHVybChwaWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2ZsYSwgTEkuaGVscGVyLmV4dF9mbGEgeyBiYWNrZ3JvdW5kOiB1cmwoZmxhc2gucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfaCwgTEkuaGVscGVyLmV4dF9oIHsgYmFja2dyb3VuZDogdXJsKGNvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfaHRtLCBMSS5oZWxwZXIuZXh0X2h0bSB7IGJhY2tncm91bmQ6IHVybChodG1sLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2h0bWwsIExJLmhlbHBlci5leHRfaHRtbCB7IGJhY2tncm91bmQ6IHVybChodG1sLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2phciwgTEkuaGVscGVyLmV4dF9qYXIgeyBiYWNrZ3JvdW5kOiB1cmwoamF2YS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9qcGcsIExJLmhlbHBlci5leHRfanBnIHsgYmFja2dyb3VuZDogdXJsKHBpY3R1cmUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfanBlZywgTEkuaGVscGVyLmV4dF9qcGVnIHsgYmFja2dyb3VuZDogdXJsKHBpY3R1cmUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfanMsIExJLmhlbHBlci5leHRfanMgeyBiYWNrZ3JvdW5kOiB1cmwoc2NyaXB0LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2xhc3NvLCBMSS5oZWxwZXIuZXh0X2xhc3NvIHsgYmFja2dyb3VuZDogdXJsKGNvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbG9nLCBMSS5oZWxwZXIuZXh0X2xvZyB7IGJhY2tncm91bmQ6IHVybCh0eHQucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbTRwLCBMSS5oZWxwZXIuZXh0X200cCB7IGJhY2tncm91bmQ6IHVybChtdXNpYy5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9tb3YsIExJLmhlbHBlci5leHRfbW92IHsgYmFja2dyb3VuZDogdXJsKGZpbG0ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbXAzLCBMSS5oZWxwZXIuZXh0X21wMyB7IGJhY2tncm91bmQ6IHVybChtdXNpYy5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9tcDQsIExJLmhlbHBlci5leHRfbXA0IHsgYmFja2dyb3VuZDogdXJsKGZpbG0ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbXBnLCBMSS5oZWxwZXIuZXh0X21wZyB7IGJhY2tncm91bmQ6IHVybChmaWxtLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X21wZWcsIExJLmhlbHBlci5leHRfbXBlZyB7IGJhY2tncm91bmQ6IHVybChmaWxtLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X29nZywgTEkuaGVscGVyLmV4dF9vZ2cgeyBiYWNrZ3JvdW5kOiB1cmwobXVzaWMucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcGN4LCBMSS5oZWxwZXIuZXh0X3BjeCB7IGJhY2tncm91bmQ6IHVybChwaWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3BkZiwgTEkuaGVscGVyLmV4dF9wZGYgeyBiYWNrZ3JvdW5kOiB1cmwocGRmLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3BocCwgTEkuaGVscGVyLmV4dF9waHAgeyBiYWNrZ3JvdW5kOiB1cmwocGhwLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3BuZywgTEkuaGVscGVyLmV4dF9wbmcgeyBiYWNrZ3JvdW5kOiB1cmwocGljdHVyZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9wcHQsIExJLmhlbHBlci5leHRfcHB0IHsgYmFja2dyb3VuZDogdXJsKHBwdC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9wc2QsIExJLmhlbHBlci5leHRfcHNkIHsgYmFja2dyb3VuZDogdXJsKHBzZC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9wbCwgTEkuaGVscGVyLmV4dF9wbCB7IGJhY2tncm91bmQ6IHVybChzY3JpcHQucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcHksIExJLmhlbHBlci5leHRfcHkgeyBiYWNrZ3JvdW5kOiB1cmwoc2NyaXB0LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3JiLCBMSS5oZWxwZXIuZXh0X3JiIHsgYmFja2dyb3VuZDogdXJsKHJ1YnkucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcmJ4LCBMSS5oZWxwZXIuZXh0X3JieCB7IGJhY2tncm91bmQ6IHVybChydWJ5LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3JodG1sLCBMSS5oZWxwZXIuZXh0X3JodG1sIHsgYmFja2dyb3VuZDogdXJsKHJ1YnkucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcnBtLCBMSS5oZWxwZXIuZXh0X3JwbSB7IGJhY2tncm91bmQ6IHVybChsaW51eC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9ydWJ5LCBMSS5oZWxwZXIuZXh0X3J1YnkgeyBiYWNrZ3JvdW5kOiB1cmwocnVieS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9zcWwsIExJLmhlbHBlci5leHRfc3FsIHsgYmFja2dyb3VuZDogdXJsKGRiLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3N3ZiwgTEkuaGVscGVyLmV4dF9zd2YgeyBiYWNrZ3JvdW5kOiB1cmwoZmxhc2gucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfdGlmLCBMSS5oZWxwZXIuZXh0X3RpZiB7IGJhY2tncm91bmQ6IHVybChwaWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3RpZmYsIExJLmhlbHBlci5leHRfdGlmZiB7IGJhY2tncm91bmQ6IHVybChwaWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3R4dCwgTEkuaGVscGVyLmV4dF90eHQgeyBiYWNrZ3JvdW5kOiB1cmwodHh0LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3ZiLCBMSS5oZWxwZXIuZXh0X3ZiIHsgYmFja2dyb3VuZDogdXJsKGNvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfd2F2LCBMSS5oZWxwZXIuZXh0X3dhdiB7IGJhY2tncm91bmQ6IHVybChtdXNpYy5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF93bXYsIExJLmhlbHBlci5leHRfd212IHsgYmFja2dyb3VuZDogdXJsKGZpbG0ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfeGxzLCBMSS5oZWxwZXIuZXh0X3hscyB7IGJhY2tncm91bmQ6IHVybCh4bHMucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfeG1sLCBMSS5oZWxwZXIuZXh0X3htbCB7IGJhY2tncm91bmQ6IHVybChjb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3ppcCwgTEkuaGVscGVyLmV4dF96aXAgeyBiYWNrZ3JvdW5kOiB1cmwoemlwLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisKKy8qKgorICogLkNMUgorICogVGhpcyBpcyBhIHV0aWxpdHkgd2hpY2ggc2VydmVzIHRvIHJlc2V0IHRoaW5ncyBhZnRlciBhIAorICogc2VyaWVzIG9mIGZsb2F0ZWQgZWxlbWVudHMKKyAqLworLmNsciB7CisgICAgY2xlYXI6Ym90aDsKK30KKworCisvKiBVSS5UQUJTICovCisudWktdGFicyB7IHBhZGRpbmc6IDBlbTsgem9vbTogMTsgZm9udC1zaXplOjExcHg7IH0KKy51aS10YWJzIC51aS10YWJzLW5hdiB7IGxpc3Qtc3R5bGU6IG5vbmU7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMHB4OyB9CisudWktdGFicyAudWktdGFicy1uYXYgbGkgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGZsb2F0OiBsZWZ0OyBib3JkZXItYm90dG9tLXdpZHRoOiAwOyBtYXJnaW46IDAgLjJlbTsgcGFkZGluZzogMDsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgeyBmbG9hdDogbGVmdDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBwYWRkaW5nOiAuNWVtIDFlbTsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgeyBwYWRkaW5nLWJvdHRvbTogMXB4OyBib3JkZXItYm90dG9tLXdpZHRoOiAzcHg7IGJvcmRlci1ib3R0b20tY29sb3I6I2ZmZjsgbWFyZ2luLWJvdHRvbTotMnB4OyBvdmVyZmxvdzpub25lOyB9CisudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCBhLCAudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgYSwgLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLXByb2Nlc3NpbmcgYSB7IGN1cnNvcjogdGV4dDsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIC51aS10YWJzLnVpLXRhYnMtY29sbGFwc2libGUgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSB7IGN1cnNvcjogcG9pbnRlcjsgfSAvKiBmaXJzdCBzZWxlY3RvciBpbiBncm91cCBzZWVtcyBvYnNvbGV0ZSwgYnV0IHJlcXVpcmVkIHRvIG92ZXJjb21lIGJ1ZyBpbiBPcGVyYSBhcHBseWluZyBjdXJzb3I6IHRleHQgb3ZlcmFsbCBpZiBkZWZpbmVkIGVsc2V3aGVyZS4uLiAqLworLnVpLXRhYnMgLnVpLXRhYnMtcGFuZWwgeyBwYWRkaW5nOiAxZW0gMGVtOyBkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogbm9uZTsgfQorLnVpLXRhYnMgLnVpLXRhYnMtaGlkZSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorCisKKworLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIHsgYm9yZGVyOiBzb2xpZCAxcHggI2NjYzsgYmFja2dyb3VuZC1jb2xvcjogI2JiYjsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgeyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgY29sb3I6ICM1NTU7IH0KKy51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhIHsgY29sb3I6ICNmZmY7IH0KKy51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLXNlbGVjdGVkIGEgeyBjb2xvcjogICM1NTU7IH0KKy51aS10YWJzIC51aS10YWJzLW5hdiB7ICB9CisudWktdGFicyAudWktdGFicy1wYW5lbCB7IHBhZGRpbmc6IDFlbSAwZW07IG1hcmdpbjogMGVtOyBib3JkZXItdG9wOiBzb2xpZCAxcHggI2NjYzt9CisKKworCisKKy8qIE1BSU4gSU5URVJGQUNFIFNUUlVDVFVSRVMgKi8KK2Rpdi5jb250YWluZXIgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGJvcmRlcjpzb2xpZCAxcHggZ3JleTsKKyAgICBwYWRkaW5nOjVweDsKK30KKworZGl2I2Jyb3dzZVN0YWdpbmdDb250YWluZXIsIGRpdiNicm93c2VDYXRhbG9nQ29udGFpbmVyIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICB3aWR0aDo0NyU7CisgICAgYm9yZGVyOnNvbGlkIDJweCAjY2NjOworICAgIHBhZGRpbmc6MnB4OworfQorZGl2I2Jyb3dzZVN0YWdpbmdDb250YWluZXIgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGZsb2F0OmxlZnQ7Cit9CisKK2RpdiNicm93c2VDYXRhbG9nQ29udGFpbmVyIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBmbG9hdDpyaWdodDsKK30KKworZGl2I2Jyb3dzZVN0YWdpbmcgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGZsb2F0OmxlZnQ7CisgICAgd2lkdGg6MzMlOworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKyAgICBvdmVyZmxvdzpzY3JvbGw7ICAgIAorfQorZGl2I2Jyb3dzZUNhdGFsb2cgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGZsb2F0OmxlZnQ7CisgICAgd2lkdGg6MzMlOworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKyAgICBvdmVyZmxvdzpzY3JvbGw7ICAgIAorfQorZGl2I3N0YWdpbmdNZXRDb250YWluZXIgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGZsb2F0OnJpZ2h0OworICAgIHdpZHRoOjYwJTsKKyAgICBoZWlnaHQ6MzUwcHg7CisgICAgZm9udC1zaXplOjEycHg7Cit9CitkaXYjc3RhZ2luZ01ldEV4dHJhY3RvclNlbGVjdGlvbiB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgbWFyZ2luLWJvdHRvbTozcHg7CisgICAgZGlzcGxheTpub25lOworfQorCitkaXYjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50IHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBoZWlnaHQ6MzIzcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmOworICAgIG92ZXJmbG93OnNjcm9sbDsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7ICAKK30KK2RpdiNjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50IHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBmbG9hdDpyaWdodDsKKyAgICB3aWR0aDo2MCU7CisgICAgaGVpZ2h0OjM1MHB4OworICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKKyAgICBvdmVyZmxvdzpzY3JvbGw7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOyAgCit9CisKKy5icm93c2VyIHsKKyAgICBiYWNrZ3JvdW5kOiNGRkZGRkYgbm9uZSByZXBlYXQgc2Nyb2xsIDAgMDsKKyAgICBib3JkZXItY29sb3I6I0JCQkJCQiAjRkZGRkZGICNGRkZGRkYgI0JCQkJCQjsKKyAgICBib3JkZXItc3R5bGU6c29saWQ7CisgICAgYm9yZGVyLXdpZHRoOjFweDsKKyAgICBoZWlnaHQ6MzUwcHg7CisgICAgcGFkZGluZzo1cHg7CisgICAgd2lkdGg6MjAwcHg7Cit9CisuY29udGFpbmVyLmJyb3dzZXJzLCAuY29udGFpbmVyLnRhc2tzIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNFRUVFRUU7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIHBhZGRpbmctdG9wOjE4cHg7CisgICAgbWFyZ2luOjVweCAwcHg7Cit9CisuY29udGFpbmVyIGg1IHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBtYXJnaW46LTIwcHggLTRweCA1cHg7CisgICAgcGFkZGluZzowcHg7CisgICAgZm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjsKKyAgICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7CisgICAgY29sb3I6Izk5OTsgCit9CisKKy5wYXRoYmFyIHsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZjRmNGY0OworICAgIGNvbG9yOiMyMjI7CisgICAgcGFkZGluZzozcHg7CisgICAgbWFyZ2luLWJvdHRvbToycHg7ICAKKyAgICBmb250LWZhbWlseTpjb3VyaWVyLHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOjExcHg7Cit9CisKKworLyogTUVUQURBVEEgRURJVE9SICovCitkaXYuZWRpdG9yIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBwYWRkaW5nOjBweDsgICAgCit9CisKK2Rpdi5lZGl0b3IuaW5mbyB7CisgICAgcGFkZGluZzo1cHg7ICAgIAorfQorCitkaXYuZWRpdG9yIHRhYmxlIHsKKyAgICBmb250LXNpemU6MTFweDsKKyAgICB3aWR0aDoxMDAlOworfQorCitkaXYuZWRpdG9yIHRhYmxlIHRyIHsKKyAgICAKK30KKworZGl2LmVkaXRvciB0YWJsZSB0ciB0aCB7CisgICAgYm9yZGVyLXJpZ2h0OnNvbGlkIDFweCAjY2NjOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7CisgICAgcGFkZGluZzo1cHg7CisgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgIGJhY2tncm91bmQtY29sb3I6I2Y2ZjZmNjsKKyAgICBjb2xvcjojNTU1OworfQorCitkaXYuZWRpdG9yIHRhYmxlIHRyIHRkIHsKKyAgICBib3JkZXItcmlnaHQ6c29saWQgMXB4ICNjY2M7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggI2NjYzsKKyAgICBwYWRkaW5nOjVweDsKK30KKworLyogCisgKiBJTkdFU1RJT04gVEFTSyBMSVNUIAorICovCisKKworLmNvbnRhaW5lci50YXNrcyB7CisgICAgcGFkZGluZzo1cHg7CisgICAgcGFkZGluZy10b3A6MjBweDsKK30KKy5jb250YWluZXIudGFza3MgaDUgeworICAgIG1hcmdpbjotMThweCAwcHggMnB4OworfQorZGl2I2luZ2VzdGlvblRhc2tMaXN0IHsKKyAgICAKK30KK2RpdiNpbmdlc3Rpb25UYXNrTGlzdENvbnRlbnQgeworICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKKyAgICBtaW4taGVpZ2h0OjEwMHB4OworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsgIAorfQorCitkaXYjaW5nZXN0aW9uVGFza0xpc3RDb250ZW50IHRhYmxlIHsKKyAgICBmb250LXNpemU6MTFweDsKKyAgICB3aWR0aDoxMDAlOworfQorCitkaXYjaW5nZXN0aW9uVGFza0xpc3RDb250ZW50IHRhYmxlIHRyeworCit9CitkaXYjaW5nZXN0aW9uVGFza0xpc3RDb250ZW50IHRhYmxlIHRyIHRoeworICAgIHBhZGRpbmc6NHB4OworICAgIGJvcmRlci1yaWdodDpzb2xpZCAxcHggI2NjYzsKKyAgICBib3JkZXItYm90dG9tOnNvbGlkIDFweCAjY2NjOworICAgIGJhY2tncm91bmQtY29sb3I6I2Y2ZjZmNjsKK30KK2RpdiNpbmdlc3Rpb25UYXNrTGlzdENvbnRlbnQgdGFibGUgdHIgdGR7CisgICAgcGFkZGluZzo0cHg7CisgICAgYm9yZGVyLXJpZ2h0OnNvbGlkIDFweCAjY2NjOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7Cit9CisKKworLyogUFJPRFVDVFRZUEUgV09SS0JFTkNIICovCisKK2RpdiNwcm9kdWN0VHlwZVdvcmtiZW5jaExhYmVsIHsKKyAgICBmb250LXNpemU6MTJweDsKKyAgICBmb250LWZhbWlseTphcmlhbCxzYW5zLXNlcmlmOworICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKKyAgICBjb2xvcjojNTU1OworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICBwYWRkaW5nOjFweCAxcHggMXB4IDRweDsgICAgCit9CisKK2RpdiNwdHdiQWRkUHJvZHVjdHMgeworICAgIHBhZGRpbmc6NXB4OyAgICAKK30KKworZGl2I3Byb2R1Y3RUeXBlV29ya2JlbmNoQ29udGVudHMgLmluc3RydWN0aW9ucyB7CisgICAgZm9udC1zaXplOjkwJTsKKyAgICBjb2xvcjojNDQ0OyAKK30KKworZGl2I3B0d2JNZXRhZGF0YUxpc3QgdGFibGUgeworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsgIAorfQorCitkaXYjZHJvcHBlZEZpbGVMaXN0IHsKKworICAgIG92ZXJmbG93OnNjcm9sbDsKKyAgICBtaW4taGVpZ2h0OjUwcHg7CisgICAgICAgIAorfQorCitkaXYucHR3YlNlY3Rpb25Cb3ggeworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKyAgICBwYWRkaW5nOjJweDsKKyAgICBtYXJnaW46NXB4IDBweCAycHggMHB4OyAKK30KKworZGl2LnB0d2JTZWN0aW9uQm94IGg1IHsKKyAgICBtYXJnaW46MCAwIDRweDsKKyAgICBwYWRkaW5nOjBweDsgICAgCit9CisKK2RpdiNkcm9wcGVkRmlsZVRhcmdldCB7CisgICAgaGVpZ2h0OjMwcHg7CisgICAgYm9yZGVyLWNvbG9yOiNiZGI7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZGZkOyAgCit9CisKK2RpdiNpdE1ldEV4dHJhY3RvclNlbGVjdG9yIHsKKyAgICAKK30KKworZGl2I2l0Q3JlYXRlSW5nZXN0aW9uVGFza0J1dHRvbiB7CisgICAgbWFyZ2luLXRvcDo1cHg7IAorfQorCitkaXYuZWRpdG9yIHRhYmxlIHRyIHRkIHsKKyAgICAKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBwYWRkaW5nLWxlZnQ6NXB4OworICAgIGN1cnNvcjpwb2ludGVyOworICAgIF9jdXJzb3I6aGFuZDsKKyAgICAKK30KKworZGl2LmVkaXRvciB0YWJsZSB0ciB0ZCBpbWcucGVuY2lsIHsKKyAgICAKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBsZWZ0OjBweDsKKyAgICBjdXJzb3I6cG9pbnRlcjsKKyAgICBfY3Vyc29yOmhhbmQ7CisgICAgCit9CisKKworLnB0d2JNZXRhZGF0YUxpc3QgdGFibGUgeworICAgIGJvcmRlci10b3A6c29saWQgMXB4ICNjY2M7Cit9CisKKwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmh0bWwgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2guaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc5NmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmh0bWwKQEAgLTAsMCArMSwxNTMgQEAKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OnBhbmVsPgorPHdpY2tldDpsaW5rPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJXb3JrYmVuY2hfd2lja2V0LmNzcyIvPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJqcXVlcnkuYWxlcnRzX3dpY2tldC5jc3MiLz4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianF1ZXJ5LTEuMy4yLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianF1ZXJ5LXVpLTEuNy4yLmZ1bGwubWluLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianF1ZXJ5LnBlcmlvZGljYWx1cGRhdGVyLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianF1ZXJ5LmFsZXJ0cy5qcyI+PC9zY3JpcHQ+ICAgIAorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJXb3JrYmVuY2guanMiPjwvc2NyaXB0PgorPC93aWNrZXQ6bGluaz4KKworPHdpY2tldDpyZW1vdmU+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9IldvcmtiZW5jaC5jc3MiLz4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ianF1ZXJ5LmFsZXJ0cy5jc3MiLz4gIAorPC93aWNrZXQ6cmVtb3ZlPgorCis8ZGl2IGNsYXNzPSJwYWdlIj4KKyAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgYnJvd3NlcnMiPgorICAgICAgICA8ZGl2IGlkPSJicm93c2VTdGFnaW5nQ29udGFpbmVyIj4KKyAgICAgICAgPGg1PlN0YWdpbmcgQXJlYTwvaDU+CisgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VTdGFnaW5nUGF0aCIgY2xhc3M9InBhdGhiYXIiPmluaXRpYWxpemluZy4uLjwvZGl2PgorICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlU3RhZ2luZyIgY2xhc3M9ImJyb3dzZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZVN0YWdpbmdOYXYiPgorICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImZpbGVUcmVlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5IG5hdiI+PGEgaWQ9InN0YWdpbmdOYXZVcFJvb3QiIGhyZWY9IiMiIHJlbD0iLiI+LjwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXJlY3RvcnkgbmF2Ij48YSBpZD0ic3RhZ2luZ05hdlVwT25lIiAgaHJlZj0iIyIgcmVsPSIuLiI+Li48L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VTdGFnaW5nQ29udGVudHMiPjwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGlkPSJzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaCIgICBjbGFzcz0iZWRpdG9yIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJpbmZvTm9NZXRhZGF0YUV4dHJhY3RvckRlZmluZWQiIGNsYXNzPSJpbmZvIG92ZXJsYXkiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvQ29udGVudCI+CisgICAgICAgICAgICAgICAgICAgICAgICBObyBNZXRhZGF0YSBEZXRlY3RlZC4uLjxici8+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YWdpbmdNZXRDb250YWluZXIiPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YWdpbmdNZXRFeHRyYWN0b3JTZWxlY3Rpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0xpc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii0xIj5Jbml0aWFsaXppbmcuLi48L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzdGFnaW5nTWV0RXh0cmFjdG9yUmVmcmVzaEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iUmVmcmVzaCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YWdlZE1ldGFkYXRhV29ya2JlbmNoQ29udGVudCI+PC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgaWQ9ImJyb3dzZUNhdGFsb2dDb250YWluZXIiPgorICAgICAgICA8aDU+RmlsZSBNYW5hZ2VyIENhdGFsb2c8L2g1PgorICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlQ2F0YWxvZ1BhdGgiIGNsYXNzPSJwYXRoYmFyIj5pbml0aWFsaXppbmcuLi48L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgaWQ9ImJyb3dzZUNhdGFsb2ciIGNsYXNzPSJicm93c2VyIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJicm93c2VDYXRhbG9nTmF2Ij4KKyAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJmaWxlVHJlZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpcmVjdG9yeSBuYXYiPjxhIGlkPSJjYXRhbG9nTmF2VXBSb290IiBocmVmPSIjIiByZWw9Ii4iPi48L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5IG5hdiI+PGEgaWQ9ImNhdGFsb2dOYXZVcE9uZSIgIGhyZWY9IiMiIHJlbD0iLi4iPi4uPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBpZD0iYnJvd3NlQ2F0YWxvZ0NvbnRlbnRzIj48L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBpZD0iY2F0YWxvZ01ldGFkYXRhV29ya2JlbmNoIiBjbGFzcz0iZWRpdG9yIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50Ij48L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGJyIGNsYXNzPSJjbHIiLz4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgdGFza3MiPgorICAgICAgICA8ZGl2IGlkPSJpbmdlc3Rpb25UYXNrTGlzdCI+CisgICAgICAgICAgICA8aDU+RmlsZSBNYW5hZ2VyIEluZ2VzdGlvbiBUYXNrIExpc3Q8L2g1PgorICAgICAgICAgICAgPGRpdiBpZD0iaW5nZXN0aW9uVGFza0xpc3RDb250ZW50Ij4KKyAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGlkPSJpbmdlc3Rpb25UYXNrTGlzdEl0ZW1zIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDo1MHB4OyI+VGFza0lkPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+CisgICAgICAgICAgICAgICAgPHRoPkZpbGVzPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+UG9saWN5PC90aD4KKyAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdFR5cGU8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5NZXRFeHRyYWN0b3I8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5NZXRFeHQgQ29uZmlnPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+U3RhdHVzPC90aD4KKyAgICAgICAgICAgICAgICA8dGggc3R5bGU9ImJvcmRlci1yaWdodC13aWR0aDowcHg7Ij5BY3Rpb248L3RoPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KKworPCEtLSBwcm9kdWN0IHR5cGUgd29ya2JlbmNoIC0tPgorPGRpdiBpZD0icHJvZHVjdFR5cGVXb3JrYmVuY2hDb250ZW50cyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0nI3B0d2JBZGRQcm9kdWN0cyc+QWRkIFByb2R1Y3RzPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPScjcHR3Yk1ldGFkYXRhJz5WaWV3IE1ldGFkYXRhPC9hPjwvbGk+CisgICAgPC91bD48YnIgY2xhc3M9ImNsciIvPgorICAgIDxkaXYgaWQ9InB0d2JBZGRQcm9kdWN0cyI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJpbnN0cnVjdGlvbnMiPgorICAgICAgICBBZGQgZmlsZXMgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGJ5IGRyYWdnaW5nIHRoZW0gaW50byB0aGUgdGFyZ2V0IGJveCBiZWxvdy4gT25jZSB5b3UgaGF2ZSAKKyAgICAgICAgRmluaXNoZWQsIGNsaWNrICdTYXZlIGFzIEluZ2VzdGlvbiBUYXNrJyB0byBmaW5hbGl6ZS4KKyAgICAgICAgPC9zcGFuPgorICAgICAgICA8ZGl2IGlkPSJkcm9wcGVkRmlsZVRhcmdldCIgY2xhc3M9InB0d2JTZWN0aW9uQm94Ij4KKyAgICAgICAgICAgIDxoNT5GaWxlIERyb3AgVGFyZ2V0Li4uPC9oNT4KKyAgICAgICAgCisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJkcm9wcGVkRmlsZUxpc3QiIGNsYXNzPSJwdHdiU2VjdGlvbkJveCI+CisgICAgICAgICAgICA8aDU+RmlsZXMgdG8gYmUgaW5nZXN0ZWQuLi48L2g1PgorICAgICAgICAgICAgPHVsPjwvdWw+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJpdE1ldEV4dHJhY3RvclNlbGVjdG9yIiBjbGFzcz0icHR3YlNlY3Rpb25Cb3giPgorICAgICAgICAgICAgPGg1Pk1ldGFkYXRhIEV4dHJhY3Rpb24gQ29uZmlndXJhdGlvbi4uLjwvaDU+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj5DaG9vc2UgYSBtZXRhZGF0YSBleHRyYWN0b3IgY29uZmlndXJhdGlvbiBmcm9tCisgICAgICAgICAgICAgICAgdGhlIGxpc3QgYmVsb3c6CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Iml0TWV0RXh0cmFjdG9yQ29uZmlnSWQiIGlkPSJpdE1ldEV4dHJhY3RvckNvbmZpZ0lkIj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPkluaXRpYWxpemluZy4uLjwvb3B0aW9uPgorICAgICAgICAgICAgPC9zZWxlY3Q+PGJyLz48YnIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBpZD0iaXRDcmVhdGVJbmdlc3Rpb25UYXNrQnV0dG9uIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnN0cnVjdGlvbnMiPkNsaWNrIGhlcmUgdG8gY3JlYXRlIGFuIGluZ2VzdGlvbiB0YXNrIGZvciB0aGVzZSBmaWxlczwvc3Bhbj4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJTYXZlIGFzIEluZ2VzdGlvbiBUYXNrIiBvbmNsaWNrPSJjcmVhdGVJbmdlc3Rpb25UYXNrKCk7Ii8+CisgICAgICAgIDwvZGl2PgorICAgIAorICAgIDwvZGl2PgorICAgIDxkaXYgaWQ9InB0d2JNZXRhZGF0YSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJpbnN0cnVjdGlvbnMiPgorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtZXRhZGF0YSBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGlzIHByb2R1Y3QgdHlwZS4KKyAgICAgICAgPC9zcGFuPgorICAgICAgICA8ZGl2IGNsYXNzPSJwdHdiTWV0YWRhdGFMaXN0Ij48L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorPC93aWNrZXQ6cGFuZWw+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2guamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL1dvcmtiZW5jaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjJhMDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2guamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmN1cmF0aW9uLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LnV0aWwuZmlsZS5GaWxlOworaW1wb3J0IG9yZy5yZWZsZWN0aW9ucy5SZWZsZWN0aW9uczsKK2ltcG9ydCBvcmcucmVmbGVjdGlvbnMuc2Nhbm5lcnMuUmVzb3VyY2VzU2Nhbm5lcjsKKworcHVibGljIGNsYXNzIFdvcmtiZW5jaCBleHRlbmRzIFBhbmVsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTExMTc5NDU1MjA4MDUwMjYxTDsKKworICBwdWJsaWMgV29ya2JlbmNoKFN0cmluZyBpZCkgeworICAgIHN1cGVyKGlkKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0SW1hZ2VGaWxlcygpIHsKKyAgICByZXR1cm4gZ2V0SW1hZ2VGaWxlcyhXb3JrYmVuY2guY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEltYWdlRmlsZXMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIuKlxcLihwbmd8Z2lmfGpwZ3xqcGVnfGpwMikiKTsKKyAgICBTZXQ8U3RyaW5nPiByZXNvdXJjZXMgPSBuZXcgUmVmbGVjdGlvbnMocGFja2FnZU5hbWUsIG5ldyBSZXNvdXJjZXNTY2FubmVyKCkpCisgICAgICAgIC5nZXRSZXNvdXJjZXMocGF0dGVybik7CisgICAgU2V0PFN0cmluZz4gZmlsdGVyZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gcmVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOworICAgIGZvciAoU3RyaW5nIHJlcyA6IHJlc291cmNlcykgeworICAgICAgU3RyaW5nIHJlc05hbWUgPSBuZXcgRmlsZShyZXMpLmdldE5hbWUoKTsKKyAgICAgIGlmICghcmVzTWFwLmNvbnRhaW5zS2V5KHJlc05hbWUpKSB7CisgICAgICAgIHJlc01hcC5wdXQocmVzTmFtZSwgdHJ1ZSk7CisgICAgICAgIGZpbHRlcmVkUmVzb3VyY2VzLmFkZChyZXNOYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmlsdGVyZWRSZXNvdXJjZXM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmpzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDYwMWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2guanMKQEAgLTAsMCArMSw2MzkgQEAKKy8qCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gRmlsZSBUcmVlCisKK3ZhciBfc3RhZ2luZyA9ICcvJzsJLy8gY3VycmVudCByb290IHBhdGggaW4gc3RhZ2luZyBhcmVhIGJyb3dzZXIKK3ZhciBfY2F0YWxvZyA9ICcvJzsJLy8gY3VycmVudCByb290IHBhdGggaW4gY2F0YWxvZyBicm93c2VyCit2YXIgX3BhdGhzICAgPSB7ICJzdGFnaW5nIiA6ICAnLycsIAorICAgICAgICAgICAgICAgICAiY2F0YWxvZyIgOiAgJy8nLAorICAgICAgICAgICAgICAgICAiY3VycmVudFN0YWdlZEZpbGUiIDogJycsCisgICAgICAgICAgICAgICAgICJjdXJyZW50Q2F0YWxvZ2VkRmlsZSIgOiAnJywKKyAgICAgICAgICAgICAgICAgImN1cnJlbnRQcm9kdWN0VHlwZSIgOiAnJ30KKworaWYoalF1ZXJ5KSAoZnVuY3Rpb24oJCl7CisJCisJJC5leHRlbmQoJC5mbiwgeworCQlmaWxlVHJlZTogZnVuY3Rpb24obywgaCwgaSkgeworCQkJLy8gRGVmYXVsdHMKKwkJCWlmKCAhbyApIHZhciBvID0ge307CisJCQlpZiggby5yb290ID09IHVuZGVmaW5lZCApIG8ucm9vdCA9ICcvJzsKKwkJCWlmKCBvLmZvbGRlckV2ZW50ID09IHVuZGVmaW5lZCApIG8uZm9sZGVyRXZlbnQgPSAnZGJsY2xpY2snOworCQkJaWYoIG8uZXhwYW5kU3BlZWQgPT0gdW5kZWZpbmVkICkgby5leHBhbmRTcGVlZD0gNTAwOworCQkJaWYoIG8uY29sbGFwc2VTcGVlZCA9PSB1bmRlZmluZWQgKSBvLmNvbGxhcHNlU3BlZWQ9IDUwMDsKKwkJCWlmKCBvLmV4cGFuZEVhc2luZyA9PSB1bmRlZmluZWQgKSBvLmV4cGFuZEVhc2luZyA9IG51bGw7CisJCQlpZiggby5jb2xsYXBzZUVhc2luZyA9PSB1bmRlZmluZWQgKSBvLmNvbGxhcHNlRWFzaW5nID0gbnVsbDsKKwkJCWlmKCBvLm11bHRpRm9sZGVyID09IHVuZGVmaW5lZCApIG8ubXVsdGlGb2xkZXIgPSB0cnVlOworCQkJaWYoIG8ubG9hZE1lc3NhZ2UgPT0gdW5kZWZpbmVkICkgby5sb2FkTWVzc2FnZSA9ICdMb2FkaW5nLi4uJzsKKwkJCQorCQkJLy8gVW5kZXJzdGFuZCB3aGljaCBvZiB0aGUgdHdvIGJyb3dzZXJzIHRvIGFwcGx5IG5hdiBhY3Rpb25zIHRvCisJCQlpZiAoby53aGljaCA9PSB1bmRlZmluZWQpIHsgYWxlcnQoJ3BsZWFzZSBzcGVjaWZ5IFwnd2hpY2hcJyAob3B0aW9ucyBhcmU6ICJzdGFnaW5nInwiY2F0YWxvZyIpICcpOyBvLndoaWNoID0gInN0YWdpbmciO30KKwkJCQorCQkJLy8gRW5zdXJlIGEgc2NyaXB0IGhhcyBiZWVuIHByb3ZpZGVkCisJCQlpZiAoby5zY3JpcHQgPT0gdW5kZWZpbmVkKSB7IGFsZXJ0KCdwbGVhc2Ugc3BlY2lmeSBhIHRhcmdldCBzY3JpcHQgXCdzY3JpcHRcJyBpbiBmaWxlVHJlZSBvcHRpb25zJyk7IH0KKwkJCQorCQkJLy8gR2V0IGEgaGFuZGxlIHRvIHRoZSBvdXRlciBVTAorCQkJby5vdXRlckNvbnRhaW5lciA9ICcjJyArICQodGhpcykuYXR0cignaWQnKTsKKwkJCWlmIChvLm91dGVyQ29udGFpbmVyID09IHVuZGVmaW5lZCkgeyBhbGVydCgnY29udGFpbmVyIG11c3QgaGF2ZSB1bmlxdWUgaWQnKSB9OworCQkJCisJCQkkKHRoaXMpLmVhY2goIGZ1bmN0aW9uKCkgeworCQkJCQorCQkJCWZ1bmN0aW9uIHNob3dUcmVlKGMsIHQpIHsKKwkJCQkJJChjKS5hZGRDbGFzcygnd2FpdCcpOworCQkJCQkkKCIuZmlsZVRyZWUuc3RhcnQiKS5yZW1vdmUoKTsKKwkJCQkJJC5nZXQoby5zY3JpcHQsIHsgcGF0aDogdCB9LCBmdW5jdGlvbihkYXRhKSB7CisJCQkJCQkkKGMpLmZpbmQoJy5zdGFydCcpLmh0bWwoJycpOworCQkJCQkJJChjKS5yZW1vdmVDbGFzcygnd2FpdCcpLmh0bWwoZGF0YSk7CisJCQkJCQlpZiAoby53aGljaCA9PSAic3RhZ2luZyIpCisJCQkJCQkJX3BhdGhzLnN0YWdpbmcgPSBlc2NhcGUodCk7CisJCQkJCQllbHNlCisJCQkJCQkJX3BhdGhzLmNhdGFsb2cgPSBlc2NhcGUodCk7CisJCQkJCQliaW5kVHJlZShjKTsKKwkJCQkJCXVwZGF0ZU5hdihvLndoaWNoKTsKKwkJCQkJCWNsZWFyTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50KG8ud2hpY2gpOworCQkJCQkJaW5pdERyYWdnYWJsZXMoKTsKKwkJCQkJfSk7CisJCQkJfQorCQkJCQorCQkJCWZ1bmN0aW9uIGJpbmRUcmVlKHQpIHsKKwkJCQkJJChvLm91dGVyQ29udGFpbmVyKS5maW5kKCdVTCBMSSBBJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsKKwkJCQkJCWlmICgkKHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCdwcm9kdWN0VHlwZScpKSB7CisJCQkJCQkJaSgkKHRoaXMpLmF0dHIoJ3JlbCcpKTsKKwkJCQkJCX0gZWxzZSBpZiAoJCh0aGlzKS5wYXJlbnQoKS5oYXNDbGFzcygnZmlsZScpKSB7CisJCQkJCQkJaCgkKHRoaXMpLmF0dHIoJ3JlbCcpKTsKKwkJCQkJCX0KKwkJCQkJfSkuYmluZCgnZGJsY2xpY2snLCBmdW5jdGlvbigpIHsKKwkJCQkJCWlmICgkKHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCdkaXJlY3RvcnknKSApIHsKKwkJCQkJCQkkKHRoaXMpLnBhcmVudCgpLmZpbmQoJ1VMJykucmVtb3ZlKCk7IC8vIGNsZWFudXAKKwkJCQkJCQlzaG93VHJlZSggJChvLm91dGVyQ29udGFpbmVyKSwgZXNjYXBlKCQodGhpcykuYXR0cigncmVsJykpICk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCQkKKwkJCQkJLy8gUHJldmVudCBBIGZyb20gdHJpZ2dlcmluZyB0aGUgIyBvbiBub24tY2xpY2sgZXZlbnRzCisJCQkJCWlmKCBvLmZvbGRlckV2ZW50LnRvTG93ZXJDYXNlICE9ICdjbGljaycgKSAkKHQpLmZpbmQoJ0xJIEEnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0pOworCQkJCX0KKwkJCQkKKwkJCQkvLyBMb2FkaW5nIG1lc3NhZ2UKKwkJCQkkKHRoaXMpLmh0bWwoJzx1bCBjbGFzcz0iZmlsZVRyZWUgc3RhcnQiPjxsaSBjbGFzcz0id2FpdCI+JyArIG8ubG9hZE1lc3NhZ2UgKyAnPGxpPjwvdWw+Jyk7CisJCQkJCisJCQkJLy8gR2V0IHRoZSBpbml0aWFsIGZpbGUgbGlzdAorCQkJCXNob3dUcmVlKCAkKHRoaXMpLCBlc2NhcGUoKG8ud2hpY2ggPT0gInN0YWdpbmciICkgPyBfcGF0aHMuc3RhZ2luZyA6IF9wYXRocy5jYXRhbG9nKSApOworCQkJfSk7CisJCX0KKwl9KTsKK30pKGpRdWVyeSk7CisKKy8vIE1ldGFkYXRhIGVkaXRvcnMKK2Z1bmN0aW9uIG1ha2VTdGFnZWRNZXRhZGF0YUVkaXRhYmxlKCkgeworCW1ha2VNZXRhZGF0YUVkaXRhYmxlKAorCQkkKCIjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50ID4gdGFibGUgPiB0Ym9keSA+IHRyID4gIHRkIiksCisJCXVwZGF0ZVN0YWdlZE1ldGFkYXRhKTsKK30KKworZnVuY3Rpb24gbWFrZVByb2R1Y3RNZXRhZGF0YUVkaXRhYmxlKCkgeworCW1ha2VNZXRhZGF0YUVkaXRhYmxlKAorCQkkKCIjY2F0YWxvZ01ldGFkYXRhV29ya2JlbmNoQ29udGVudCA+IHRhYmxlID4gdGJvZHkgPiB0ciA+IHRkIiksCisJCXVwZGF0ZVByb2R1Y3RNZXRhZGF0YSk7CQkKK30KKworZnVuY3Rpb24gbWFrZVByb2R1Y3RUeXBlTWV0YWRhdGFFZGl0YWJsZSgpIHsKKwltYWtlTWV0YWRhdGFFZGl0YWJsZSgKKwkJJCgiI2xpdmVQcm9kdWN0VHlwZVdvcmtiZW5jaENvbnRlbnRzIGRpdi5wdHdiTWV0YWRhdGFMaXN0ID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGQiKSwKKwkJdXBkYXRlUHJvZHVjdFR5cGVNZXRhZGF0YSk7Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVN0YWdlZE1ldGFkYXRhKCkgeworCS8vIERhdGEgaXMgdGhlIGNvbGxlY3Rpb24gb2YgPHRyLz4gZWxlbWVudHMgdGhhdCBjb250YWluIG1ldGFkYXRhIGtleS92YWx1ZSBwYWlycworCXZhciBkYXRhID0gZ2V0TWV0YWRhdGFGcm9tU291cmNlKCQoJyNzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQgPiB0YWJsZSA+IHRib2R5ID4gdHInKSk7CisJdmFyIHFzdHIgPSBnZXRRdWVyeVN0cmluZ0Zyb21NZXRhZGF0YShfcGF0aHMuY3VycmVudFN0YWdlZEZpbGUsIGRhdGEpOworCQorCSQucG9zdCgnLi9zZXJ2aWNlcy9tZXRhZGF0YS9zdGFnaW5nJywKKwkJcXN0ciwKKwkJZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cykgeworCQkJLy8gYWxlcnQoZGF0YSk7CisJCX0KKwkpOworfQorCitmdW5jdGlvbiB1cGRhdGVQcm9kdWN0TWV0YWRhdGEoKSB7CisJLy8gRGF0YSBpcyB0aGUgY29sbGVjdGlvbiBvZiA8dHIvPiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEga2V5L3ZhbHVlIHBhaXJzCisJdmFyIGRhdGEgPSBnZXRNZXRhZGF0YUZyb21Tb3VyY2UoJCgnI2NhdGFsb2dNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQgPiB0YWJsZSA+IHRib2R5ID4gdHInKSk7CisJdmFyIHFzdHIgPSBnZXRRdWVyeVN0cmluZ0Zyb21NZXRhZGF0YShfcGF0aHMuY3VycmVudENhdGFsb2dlZEZpbGUsIGRhdGEpOworCisJJC5wb3N0KCcuL3NlcnZpY2VzL21ldGFkYXRhL2NhdGFsb2cnLAorCQlxc3RyLAorCQlmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzKSB7CisJCQkvLyBhbGVydChkYXRhKTsKKwkJfQorCSk7Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVByb2R1Y3RUeXBlTWV0YWRhdGEoKSB7CisJLy8gRGF0YSBpcyB0aGUgY29sbGVjdGlvbiBvZiA8dHIvPiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEga2V5L3ZhbHVlIHBhaXJzCisJdmFyIGRhdGEgPSBnZXRNZXRhZGF0YUZyb21Tb3VyY2UoJCgnI2xpdmVQcm9kdWN0VHlwZVdvcmtiZW5jaENvbnRlbnRzIGRpdi5wdHdiTWV0YWRhdGFMaXN0ID4gdGFibGUgPiB0Ym9keSA+IHRyJykpOworCXZhciBxc3RyID0gZ2V0UXVlcnlTdHJpbmdGcm9tTWV0YWRhdGEoX3BhdGhzLmN1cnJlbnRQcm9kdWN0VHlwZSwgZGF0YSk7CisKKwkkLnBvc3QoJy4vc2VydmljZXMvbWV0YWRhdGEvcHJvZHVjdFR5cGUnLAorCQlxc3RyLAorCQlmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzKSB7CisJCQkvLyBhbGVydChkYXRhKTsKKwkJfQorCSk7Cit9CisKKworCisvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGVuY2Fwc3VsYXRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5CisgKgorICovCisKKy8vIHNvdXJjZTogICB0aGUgY29sbGVjdGlvbiBvZiA8dGQvPiBvYmplY3RzIGNvbnRhaW5pbmcgbWV0YWRhdGEgdmFsdWVzCisvLyBjYWxsYmFjazogdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBwZXJzaXN0IHRoZSBlZGl0cworZnVuY3Rpb24gbWFrZU1ldGFkYXRhRWRpdGFibGUoc291cmNlLCBjYWxsYmFjaykgeworCS8vIFNldCB1cCB0aGUgaS9mIHRvIGRpc3BsYXkgdGhlIGljb24gb25seSB3aGVuIHRoZSB1c2VyIGlzIGhvdmVyaW5nIG92ZXIKKwkvLyB0aGUgZmllbGQKKwlzb3VyY2UuY2xpY2soZnVuY3Rpb24oKSB7CisJCXZhciAkbWV0ID0gJCh0aGlzKTsKKwkJdmFyIG1ldFZhbHVlID0gJG1ldDsgLy8gdGhlIDx0ZD4gaXRzZWxmCisJCQl2YXIgbWV0S2V5ID0gJCh0aGlzKS5wcmV2KCkudGV4dCgpOworCQkJalByb21wdE11bHRpKAorCQkJCQltZXRLZXksCisJCQkJCW1ldFZhbHVlLAorCQkJCQknVXBkYXRlIE1ldGFkYXRhJywKKwkJCQkJZnVuY3Rpb24ocikgeworCisJCQkJCQlpZiAocikgeworCQkJCQkJCS8vIHR1cm4gciBpbnRvIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBvZiB2YWx1ZXMKKwkJCQkJCQlodG1sUmVzdWx0ID0gJzxzcGFuPicgKyByLmpvaW4oJzwvc3Bhbj4sIDxzcGFuPicpICsgJzwvc3Bhbj4nOworCQkJCQkJCS8vIGFsZXJ0KCAnWW91IGVudGVyZWQgJyArIGh0bWxSZXN1bHQgKQorCQkJCQkJCSRtZXQuaHRtbChodG1sUmVzdWx0KTsKKwkJCQkJCQljYWxsYmFjaygpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJfSk7Cit9CisKK2Z1bmN0aW9uIGdldE1ldGFkYXRhRnJvbVNvdXJjZSggc291cmNlICkgeworCQorCS8vIEtleXMgYXJlIDEgcGVyIHJvdyBpbiA8dGgvPiBlbGVtZW50cworCS8vIFZhbHVlcyBhcmUgMSBwZXIgcm93IGluIDx0ZC8+IGVsZW1lbnRzCisJCisJdmFyICR0YWJsZSA9IHNvdXJjZTsKKwl2YXIgZGF0YSAgID0gQXJyYXkoKTsKKwkkdGFibGUuZWFjaCggZnVuY3Rpb24gKCkgeworCQkvLyBDcmVhdGUgYSBrZXkvdmFsdWUgbWFwcGluZyBvZiB0aGUgc3RhZ2VkIG1ldGFkYXRhCisJCXZhciAkdmFsdWVFbG10ID0gJCh0aGlzKS5jaGlsZHJlbigndGQnKTsKKwkJLy8gQWxsIHZhbHVlcyBhcmUgd3JhcHBlZCBpbiA8c3Bhbi8+IGVsZW1lbnRzIGFuZCB0aGVyZSBjYW4gYmUKKwkJLy8gYW4gdW5saW1pdGVkIG51bWJlciBvZiB0aGVtLCBzbyBidWlsZCBhbiBhcnJheS4KKwkJdmFyICR2YWx1ZXMgICAgPSAkdmFsdWVFbG10LmNoaWxkcmVuKCdzcGFuJyk7CisJCXZhciB2YWx1ZURhdGEgID0gQXJyYXkoKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCAkdmFsdWVzLmxlbmd0aDsgaSArKyApIHsKKwkJCXZhbHVlRGF0YS5wdXNoKCR2YWx1ZXNbaV0udGV4dENvbnRlbnQpOworCQl9CisJCS8vIEFzc2lnbiB0aGUgdmFsdWUgZGF0YSB0byB0aGUgY29ycmVjdCBlbGVtZW50CisJCWRhdGEucHVzaCggeyAna2V5JyA6ICQodGhpcykuY2hpbGRyZW4oJ3RoJykudGV4dCgpLCAndmFsdWUnIDogdmFsdWVEYXRhIH0gKTsKKwl9KTsKKwkKKwlyZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gZ2V0UXVlcnlTdHJpbmdGcm9tTWV0YWRhdGEoaWQsZGF0YSkgeworCS8vIEJ1aWxkIHRoZSBxdWVyeSBzdHJpbmcgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlcgorCXZhciBxc3RyICAgICAgPSAnJzsKKwlxc3RyICAgICAgICAgKz0gJ2lkPScgKyBpZDsKKwlmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrICkgeworCQlmb3IgKCB2YXIgaiA9IDA7IGogPCBkYXRhW2ldLnZhbHVlLmxlbmd0aDsgaisrICkgeworCQkJcXN0ciArPSAnJm1ldGFkYXRhLicgKyBkYXRhW2ldLmtleSArICc9JyArIGRhdGFbaV0udmFsdWVbal07CisJCX0KKwl9CisJCisJcmV0dXJuIHFzdHI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTkdFU1RJT04gVEFTSyBTRVRVUAorICovCisKKworLy8gS2VlcCB0cmFjayBvZiBkcm9wcGVkIGZpbGVzLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlcyAKKy8vIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiBhbiBpbmdlc3Rpb24gdGFzawordmFyIGRyb3BwZWRGaWxlcyA9IEFycmF5KCk7CisKKy8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcG9saWN5LiBUaGlzIGlzIHRoZSBwb2xpY3kgdGhhdCB3aWxsCisvLyBiZSB1c2VkIGluIHRoZSBpbmdlc3Rpb24gdGFzay4KK3ZhciBpdFBvbGljeTsKKworLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9kdWN0IHR5cGUuIFRoaXMgaXMgdGhlIHByb2R1Y3QgdHlwdGUgdGhhdAorLy8gd2lsbCBiZSB1c2VkIGluIHRoZSBpbmdlc3Rpb24gdGFzawordmFyIGl0UHJvZHVjdFR5cGU7CisKKworLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNZXRhZGF0YSBFeHRyYWN0b3IgQ29uZmlndXJhdGlvbiBJZAorLy8gVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdpbGwgYmUgc2VudCB3aXRoIHRoZSBpbmdlc3Rpb24gdGFzawordmFyIGl0TWV0RXh0cmFjdG9yQ29uZmlnSWQgPSAnZGVmYXVsdCc7CisKKworCitmdW5jdGlvbiB1cGRhdGVJbmdlc3Rpb25UYXNrTWV0RXh0cmFjdG9yQ29uZmlnSWRzKCkgeworCSQuZ2V0KCcuL3NlcnZpY2VzL21ldGFkYXRhL2V4dHJhY3Rvci9jb25maWcnLAorCQkJe30sCisJCQlmdW5jdGlvbihkYXRhLHRleHRTdGF0ZSkgeworCQkJCSQoJyNpdE1ldEV4dHJhY3RvckNvbmZpZ0lkJykuaHRtbChkYXRhKTsKKwkJCQlpdE1ldEV4dHJhY3RvckNvbmZpZ0lkID0gJCgnI2l0TWV0RXh0cmFjdG9yQ29uZmlnSWQnKS52YWwoKTsKKwkJCX0pOworfQorCitmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZE1ldEV4dHJhY3RvckNvbmZpZ0lkKCkgeworCWl0TWV0RXh0cmFjdG9yQ29uZmlnSWQgPSAkKCcjaXRNZXRFeHRyYWN0b3JDb25maWdJZCcpLnZhbCgpOworfQorCitmdW5jdGlvbiBjcmVhdGVJbmdlc3Rpb25UYXNrKCkgeworCS8vIFRoZSBmaWxlcyB0byBpbmNsdWRlIGFyZSBpbiBkcm9wcGVkRmlsZXMKKwl2YXIgZmlsZXMgICAgICAgPSBkcm9wcGVkRmlsZXM7CisJLy8gVGhlIG1ldCBleHRyYWN0b3IgY29uZmlnIGlkIGlzIGluIGl0TWV0RXh0cmFjdG9yQ29uZmlnSWQKKwl2YXIgbWV0RXh0Q2ZnSWQgPSBpdE1ldEV4dHJhY3RvckNvbmZpZ0lkOworCS8vIFRoZSBwb2xpY3kgYW5kIHByb2R1Y3QgdHlwZSBhcmUgaW4gaXRQb2xpY3kgYW5kIGl0UHJvZHVjdFR5cGUKKwl2YXIgcG9saWN5ICAgICAgPSBpdFBvbGljeTsKKwl2YXIgcHJvZHVjdFR5cGUgPSBpdFByb2R1Y3RUeXBlOworCS8vIE90aGVyIHZhcmlhYmxlcyB3ZSdsbCBuZWVkCisJdmFyIG51bUZpbGVzID0gZHJvcHBlZEZpbGVzLmxlbmd0aDsKKwkKKwkvLyBTZW5kIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgY3JlYXRlIGluZ2VzdGlvbiB0YXNrIHNlcnZsZXQKKwkkLmdldCgnLi9zZXJ2aWNlcy9pbmdlc3QvY3JlYXRlJywKKwkJCXsKKwkJCQknZmlsZXMnICAgICAgOiBmaWxlcy5qb2luKCcsJyksCisJCQkJJ251bWZpbGVzJyAgIDogbnVtRmlsZXMsCisJCQkJJ21ldEV4dENmZ0lkJzogbWV0RXh0Q2ZnSWQsCisJCQkJJ3BvbGljeScgICAgIDogcG9saWN5LAorCQkJCSdwdHlwZScgICAgICA6IHByb2R1Y3RUeXBlCisJCQl9LAorCQkJZnVuY3Rpb24gKGRhdGEsdGV4dFN0YXRlKSB7CisJCQkgICByZWZyZXNoSW5nZXN0VGFza0xpc3QoKTsJCQorCQkJfSk7IAorCQorICAgCit9CisKK2Z1bmN0aW9uIHJlZnJlc2hJbmdlc3RUYXNrTGlzdCgpeworICAgICQuZ2V0KCcuL3NlcnZpY2VzL2luZ2VzdC9saXN0JywKKyAgICAgICAgICAgIHsgJ2Zvcm1hdCc6ICdodG1sJworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLHRleHRTdGF0ZSkgeworICAgICAgICAgICAgICAgIHNob3dJbmdlc3Rpb25UYXNrTGlzdChkYXRhKTsKKyAgICAgICAgICAgIH0pOyAgICAgICAgIAorfQorCitmdW5jdGlvbiBzaG93SW5nZXN0aW9uVGFza0xpc3QoZGF0YSl7CisgICAgJCgnI2luZ2VzdGlvblRhc2tMaXN0SXRlbXMgPiB0Ym9keScpLmh0bWwoZGF0YSk7Cit9CisKK2Z1bmN0aW9uIHJlZ2lzdGVySW5nZXN0aW9uVGFza0xpc3RlbmVyKCl7CisgICAgJC5QZXJpb2RpY2FsVXBkYXRlcignLi9zZXJ2aWNlcy9pbmdlc3QvbGlzdCcsIHsKKyAgICAgICAgbWV0aG9kOiAnZ2V0JywgICAgICAgICAKKyAgICAgICAgZGF0YTogeyAnZm9ybWF0Oic6ICdodG1sJ30sICAgICAgICAgIAorICAgICAgICBtaW5UaW1lb3V0OiAxMDAwLAorICAgICAgICBtYXhUaW1lb3V0OiA2MDAwMCwKKyAgICAgICAgbXVsdGlwbGllcjogMgorICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICBzaG93SW5nZXN0aW9uVGFza0xpc3QoZGF0YSk7CisgICAgICAgICB9KTsKKworfQorCitmdW5jdGlvbiBjcmVhdGVJbmdlc3Rpb25UYXNrUm93KGRhdGEpIHsgICAgCisgICAgJCgnI2luZ2VzdGlvblRhc2tMaXN0SXRlbXMgPiB0Ym9keScpLnJlcGxhY2UoZGF0YSk7Cit9CisKK2Z1bmN0aW9uIHJlbW92ZUluZ2VzdGlvblRhc2soaWQpIHsKKwkkLmdldCgnLi9zZXJ2aWNlcy9pbmdlc3QvcmVtb3ZlJywKKwkJCXsgJ3Rhc2tJZCcgOiBpZCB9LAorCQkJcmVmcmVzaEluZ2VzdFRhc2tMaXN0KCkKKwkJCSk7Cit9CisKK2Z1bmN0aW9uIHN0YXJ0SW5nZXN0aW9uVGFzayhpZCkgeworCSQuZ2V0KCcuL3NlcnZpY2VzL2luZ2VzdC9zdGFydCcsCisJCQl7ICd0YXNrSWQnIDogaWQgfSwKKwkJCWZ1bmN0aW9uKGRhdGEsdGV4dFN0YXRlKSB7CisJCQkJJCgnIycraWQrJ19TdGF0dXMnKS5odG1sKGRhdGEpOwkvLyAnc3RhcnRlZCcgb3IgJ2Vycm9yJworCQkJCXJlZnJlc2hJbmdlc3RUYXNrTGlzdCgpOworCQkJfSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRFJBRyBBTkQgRFJPUCBJTklUSUFMSVpBVElPTiBBTkQgQ09ORklHVVJBVElPTgorICogCisgKi8KK2Z1bmN0aW9uIGluaXREcmFnZ2FibGVzKCkgeworCSQoJy5kcmFnZ3knKS5kcmFnZ2FibGUoeworCQlyZXZlcnQ6dHJ1ZSwgCisJCXpJbmRleDonNTAwMCcsIAorCQlhcHBlbmRUbzonYm9keScKKwkJLCAKKwkJaGVscGVyOiBmdW5jdGlvbigpIHsgCisJCQlyZXR1cm4gJCgnPGxpPicpCisJCQkJLmFkZENsYXNzKCdoZWxwZXInKQorCQkJCS5hZGRDbGFzcygnZmlsZScpLmFkZENsYXNzKCdleHRfdGlmZicpCisJCQkJLmh0bWwoJCh0aGlzKS5jaGlsZHJlbigpLmNsb25lKCkpOworCQl9CisJfSk7Cit9CitmdW5jdGlvbiBpbml0RHJhZ0FuZERyb3BUYXJnZXQoKSB7CisJJCgnI2Ryb3BwZWRGaWxlVGFyZ2V0JykuZHJvcHBhYmxlKCB7CisJCWRyb3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgeworCQkJZHJvcHBlZEZpbGVzLnB1c2godWkuZHJhZ2dhYmxlLmNoaWxkcmVuKCdhJylbMF0ucmVsKTsKKwkJCXVwZGF0ZURyb3BwZWRGaWxlc0xpc3QoKTsKKwkJfQorCX0pOworfQorZnVuY3Rpb24gdXBkYXRlRHJvcHBlZEZpbGVzTGlzdCgpIHsKKwl2YXIgaSA9IGRyb3BwZWRGaWxlcy5sZW5ndGggLTE7CisJJCgnI2Ryb3BwZWRGaWxlTGlzdCA+IHVsJykuYXBwZW5kKAorCQknPGxpIHJlbD0iJytkcm9wcGVkRmlsZXNbaV0rJyI+Jytkcm9wcGVkRmlsZXNbaV0rJzwvbGk+JworCSk7Cit9CitmdW5jdGlvbiBjbGVhckRyb3BwZWRGaWxlc0xpc3QoKSB7CisJZHJvcHBlZEZpbGVzID0gQXJyYXkoKTsJCQkJLy8gY2xlYXIgdGhlIGpzIGFycmF5CisJJCgnI2Ryb3BwZWRGaWxlTGlzdCB1bCcpLmh0bWwoJycpOwkvLyBjbGVhciB0aGUgaW50ZXJmYWNlIGRpc3BsYXkKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1BSU4gSU5JVElBTElaQVRJT04gRlVOQ1RJT04gKE9OIERPTSBSRUFEWSkKKyAqLworJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgeworCisJLy8gSW5pdGlhbGl6ZSB0aGUgc3RhZ2luZyBhcmVhIGJyb3dzZXIKKwlpbml0U3RhZ2luZ0FyZWFCcm93c2VyKCk7CisJCisJLy8gSW5pdGlhbGl6ZSB0aGUgc3RhZ2luZyBhcmVhIG5hdmlnYXRpb24gYnV0dG9ucworCSQoJyNzdGFnaW5nTmF2VXBPbmUnKQorICAgIAkuZGJsY2xpY2soc3RhZ2luZ05hdmlnYXRlVXBPbmUpCisgICAgCS5jbGljayggZnVuY3Rpb24oZXZlbnQpIHtldmVudC5wcmV2ZW50RGVmYXVsdCgpO30pOworICAgICQoJyNzdGFnaW5nTmF2VXBSb290JykKKyAgICAJLmRibGNsaWNrKHN0YWdpbmdOYXZpZ2F0ZVVwUm9vdCkKKyAgICAJLmNsaWNrKCBmdW5jdGlvbihldmVudCkge2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fSk7CisKKworCS8vIEluaXRpYWxpemUgdGhlIEZpbGUgTWFuYWdlciBicm93c2VyCisJaW5pdEZpbGVNYW5hZ2VyQnJvd3NlcigpOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgY2F0YWxvZyBuYXZpZ2F0aW9uIGJ1dHRvbnMKKwkkKCcjY2F0YWxvZ05hdlVwT25lJykKKwkJLmRibGNsaWNrKGNhdGFsb2dOYXZpZ2F0ZVVwT25lKQorICAgIAkuY2xpY2soIGZ1bmN0aW9uKGV2ZW50KSB7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9KTsKKwkkKCcjY2F0YWxvZ05hdlVwUm9vdCcpCisJCS5kYmxjbGljayhjYXRhbG9nTmF2aWdhdGVVcFJvb3QpCisgICAgCS5jbGljayggZnVuY3Rpb24oZXZlbnQpIHtldmVudC5wcmV2ZW50RGVmYXVsdCgpO30pOworCisKKwkvLyBNYWtlIG92ZXJsYWlkIGluZm8gbWVzc2FnZXMgc2VtaS10cmFuc3BhcmVudAorCSQoJy5pbmZvLm92ZXJsYXknKS5mYWRlVG8oMCwwLjgpOworCQorCS8vIENvbm5lY3Qgc3RhZ2luZyBtZXQgZXh0cmFjdG9yIHJlZnJlc2ggYnV0dG9uCisJJCgnI3N0YWdpbmdNZXRFeHRyYWN0b3JSZWZyZXNoQnV0dG9uJykuY2xpY2socmVmcmVzaFN0YWdlZE1ldGFkYXRhKTsKKwkKK30pOworCitmdW5jdGlvbiB1cGRhdGVOYXYod2hpY2gpIHsKKwlpZiAod2hpY2ggPT0gJ3N0YWdpbmcnKSAKKwkJJCgnI2Jyb3dzZVN0YWdpbmdQYXRoJykuaHRtbCgnUGF0aDogJyArIF9wYXRocy5zdGFnaW5nKTsKKwkJaWYgKCcvJyA9PSBfcGF0aHMuc3RhZ2luZykgeworCQkJLy8gV2UgYXJlIGF0IHRoZSByb290LCBkb24ndCBzaG93IC4gYW5kIC4uCisJCQkkKCcjYnJvd3NlU3RhZ2luZ05hdicpLmhpZGUoKTsKKwkJfSBlbHNlIHsKKwkJCSQoJyNicm93c2VTdGFnaW5nTmF2Jykuc2hvdygpOworCQl9CisJaWYgKHdoaWNoID09ICdjYXRhbG9nJykgeworCQkvLyBDYXRhbG9nIG5hdmlnYXRpb24gaXMgYSBsaXR0bGUgbW9yZSBjb21wbGV4CisJCSQoJyNicm93c2VDYXRhbG9nUGF0aCcpLmh0bWwoJ1BhdGg6ICcgKyBfcGF0aHMuY2F0YWxvZyk7CisJCWlmICgnLycgPT0gX3BhdGhzLmNhdGFsb2cpIHsKKwkJCS8vIFdlIGFyZSBsaXN0aW5nIHBvbGljaWVzLCBkb24ndCBzaG93IC4gYW5kIC4uCisJCQkkKCcjYnJvd3NlQ2F0YWxvZ05hdicpLmhpZGUoKTsKKwkJfSBlbHNlIHsKKwkJCSQoJyNicm93c2VDYXRhbG9nTmF2Jykuc2hvdygpOworCQl9CisKKwl9Cit9CisKK2Z1bmN0aW9uIGNsZWFyTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50KHdoaWNoKSB7CisJaWYgKHdoaWNoID09ICdzdGFnaW5nJykgeworCQkkKCcjaW5mb05vTWV0YWRhdGFFeHRyYWN0b3JEZWZpbmVkJykuaGlkZSgpOworCQkkKCcjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbCgnJyk7CisJCWhpZGVTdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uKCk7CisJCV9wYXRocy5jdXJyZW50U3RhZ2VkRmlsZSA9ICcnOworCX0gZWxzZSBpZiAod2hpY2ggPT0gJ2NhdGFsb2cnKSB7CisJCSQoJyNjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbCgnJyk7CisJCV9wYXRocy5jdXJyZW50Q2F0YWxvZ2VkRmlsZSA9ICcnOworCQlfcGF0aHMuY3VycmVudFByb2R1Y3RUeXBlICAgPSAnJzsKKwl9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNUQUdJTkcgQVJFQSBCUk9XU0VSIEZVTkNUSU9OUworICovCisKK3ZhciBzdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnSWQgPSAnJzsKKworIAorZnVuY3Rpb24gaW5pdFN0YWdpbmdBcmVhQnJvd3NlcigpIHsKKwkgJCgnI2Jyb3dzZVN0YWdpbmdDb250ZW50cycpLmZpbGVUcmVlKAorICAgIAl7IHJvb3Q6ICAgJy8nLAorICAgICAgICAgIHdoaWNoOiAgJ3N0YWdpbmcnLAorICAgICAgICAgIHNjcmlwdDogJy4vc2VydmljZXMvZGlyZWN0b3J5L3N0YWdpbmcnIAorICAgICAgICB9LCBmdW5jdGlvbihmaWxlKSB7CisgICAgICAgIAlnZXRNZXRhZGF0YUZvclN0YWdlZEZpbGUoZmlsZSwgZmFsc2UpOworICAgICAgfSk7CisgICAgIHVwZGF0ZU5hdignc3RhZ2luZycpOworfQorCitmdW5jdGlvbiBzdGFnaW5nTmF2aWdhdGVVcE9uZSgpIHsKKwl2YXIgcGllY2VzID0gX3BhdGhzLnN0YWdpbmcuc3BsaXQoJy8nKTsKKwl2YXIgbmV3cGF0aCA9ICcnOworCWZvciAodmFyIGk9MDsgaSA8IChwaWVjZXMubGVuZ3RoLTIpOyBpKyspIHsKKwkJbmV3cGF0aCArPSAocGllY2VzW2ldICsgJy8nKTsKKwl9CisJaWYgKCcnID09IG5ld3BhdGgpIHsKKwkJbmV3cGF0aCA9ICcvJzsKKwl9CisJX3BhdGhzLnN0YWdpbmcgPSBuZXdwYXRoOworCWluaXRTdGFnaW5nQXJlYUJyb3dzZXIoKTsKKwljbGVhck1ldGFkYXRhV29ya2JlbmNoQ29udGVudCgnc3RhZ2luZycpOworCXJldHVybiBmYWxzZTsKK30KKworZnVuY3Rpb24gc3RhZ2luZ05hdmlnYXRlVXBSb290KCkgeworCS8vIFJlLUluaXRpYWxpemUgdGhlIHN0YWdpbmcgYXJlYSBicm93c2VyCisJX3BhdGhzLnN0YWdpbmcgPSAnLyc7CisJaW5pdFN0YWdpbmdBcmVhQnJvd3NlcigpOworCWNsZWFyTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50KCdzdGFnaW5nJyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitmdW5jdGlvbiBnZXRNZXRhZGF0YUZvclN0YWdlZEZpbGUoZmlsZSwgb3ZlcndyaXRlKSB7CisJJC5nZXQoJy4vc2VydmljZXMvbWV0YWRhdGEvc3RhZ2luZycsCisJCQl7ICdpZCcgOiBmaWxlLAorCQkgICAgICAnY29uZmlnSWQnIDogc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0lkLAorCQkgICAgICAnb3ZlcndyaXRlJyA6IG92ZXJ3cml0ZQorCQkJfSwKKwkJCWZ1bmN0aW9uKGRhdGEsdGV4dFN0YXR1cykgeworCQkJCWRpc3BsYXlTdGFnZWRGaWxlTWV0YWRhdGEoZmlsZSxkYXRhKTsKKwkJCX0sICJodG1sIik7Cit9CisKK2Z1bmN0aW9uIGRpc3BsYXlTdGFnZWRGaWxlTWV0YWRhdGEoZmlsZSxkYXRhKSB7CisJc2hvd1N0YWdpbmdNZXRFeHRyYWN0b3JTZWxlY3Rpb24oKTsKKwlfcGF0aHMuY3VycmVudFN0YWdlZEZpbGUgPSBmaWxlOworCWlmICghIGRhdGEubWF0Y2goJ3RyJykpIHsKKwkJaWYgKHN0YWdpbmdNZXRFeHRyYWN0b3JDb25maWdJZCA9PSAnJykgeworCQkJJCgnI2luZm9Ob01ldGFkYXRhRXh0cmFjdG9yRGVmaW5lZCcpLnNob3coKTsKKwkJfQorCX0gZWxzZSB7IAorCQkkKCcjc3RhZ2VkTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbChkYXRhKTsKKwkJbWFrZVN0YWdlZE1ldGFkYXRhRWRpdGFibGUoKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHVwZGF0ZVN0YWdpbmdNZXRFeHRyYWN0b3JDb25maWdJZHMoKSB7CisJJC5nZXQoJy4vc2VydmljZXMvbWV0YWRhdGEvZXh0cmFjdG9yL2NvbmZpZycsCisJCXsnY3VycmVudCcgOiBzdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnSWQgfSwKKwkJZnVuY3Rpb24oZGF0YSx0ZXh0U3RhdGUpIHsKKwkJCSQoJyNzdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnTGlzdCcpLmh0bWwoZGF0YSk7CisJCQlzdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnSWQgPSAkKCcjc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0xpc3QnKS52YWwoKTsKKwkJfSk7Cit9CisKK2Z1bmN0aW9uIHNob3dTdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uKCkgeworCSQoJyNzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQnKS5jc3MoJ2hlaWdodCcsJzMyM3B4Jyk7CisJJCgnI3N0YWdpbmdNZXRFeHRyYWN0b3JTZWxlY3Rpb24nKS5mYWRlSW4oJ2Zhc3QnKTsKKwl1cGRhdGVTdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnSWRzKCk7Cit9CisKK2Z1bmN0aW9uIGhpZGVTdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uKCkgeworCSQoJyNzdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uJykuZmFkZU91dCgnZmFzdCcpOworCSQoJyNzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQnKS5jc3MoJ2hlaWdodCcsJzM1MHB4Jyk7Cit9CisKK2Z1bmN0aW9uIHJlZnJlc2hTdGFnZWRNZXRhZGF0YSgpIHsKKwlzdGFnaW5nTWV0RXh0cmFjdG9yQ29uZmlnSWQgPSAkKCcjc3RhZ2luZ01ldEV4dHJhY3RvckNvbmZpZ0xpc3QnKS52YWwoKTsKKwlnZXRNZXRhZGF0YUZvclN0YWdlZEZpbGUoX3BhdGhzLmN1cnJlbnRTdGFnZWRGaWxlLCB0cnVlKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRklMRSBNQU5BR0VSIEJST1dTRVIgRlVOQ1RJT05TCisgKi8KKworLy8KKy8vIHBhdGhzIGluIHRoaXMgYXJlYSBhcmUgInZpcnR1YWwiLCB0aGF0IGlzLCB0aGV5IHJlZmxlY3QgdGhlIGxvZ2ljYWwKKy8vIG9yZ2FuaXphdGlvbiBvZiB0aGUgZmlsZSBtYW5hZ2VyIGNhdGFsb2cgcmF0aGVyIHRoYW4gdGhlIHBoeXNpY2FsCisvLyBvcmdhbml6YXRpb24gb2YgdGhlIHByb2R1Y3RzIGluIHRoZSByZXBvc2l0b3J5LiBBcyBzdWNoLCB0aGUgdmlydHVhbAorLy8gcGF0aCB0byBhIHByb2R1Y3QgaXMgb2J0YWluZWQgYnkgc3BlY2lmeWluZyBib3RoIHRoZSAncG9saWN5JyBhbmQgCisvLyAncHJvZHVjdFR5cGUnOgorLy8KKy8vIGRlbTAwMDAxLnRpZmYgZXhpc3RzIGF0ICJ2aXJ0dWFsIiBwYXRoOiAvTG1tcC9ERU0gd2hlcmUKKy8vIExNTVAgaXMgdGhlIHBvbGljeQorLy8gYW5kIERFTSBpcyBhIHByb2R1Y3QgdHlwZSBkZWZpbmVkIHdpdGhpbiB0aGF0IHBvbGljeQorLy8KKworIAorZnVuY3Rpb24gaW5pdEZpbGVNYW5hZ2VyQnJvd3NlcigpIHsKKwkgJCgnI2Jyb3dzZUNhdGFsb2dDb250ZW50cycpLmZpbGVUcmVlKAorICAgIAl7IHJvb3Q6ICAgJy8nLAorICAgICAgICAgIHdoaWNoOiAgJ2NhdGFsb2cnLAorICAgICAgICAgIHNjcmlwdDogJy4vc2VydmljZXMvcG9saWN5L2Jyb3dzZScKKyAgICAgICAgfSwgZnVuY3Rpb24oZmlsZSkgeworICAgICAgICAJZ2V0TWV0YWRhdGFGb3JDYXRhbG9nZWRGaWxlKGZpbGUpOworICAgICAgICB9LCBmdW5jdGlvbihwcm9kdWN0VHlwZSkgeworICAgICAgICAgIGdldFByb2R1Y3RUeXBlV29ya2JlbmNoKHByb2R1Y3RUeXBlKTsKKyAgICAgfSk7CisgICAgIHVwZGF0ZU5hdignY2F0YWxvZycpOworICAgICAKK30KKworZnVuY3Rpb24gY2F0YWxvZ05hdmlnYXRlVXBPbmUoKSB7CisJCisJdmFyIHBpZWNlcyA9IF9wYXRocy5jYXRhbG9nLnNwbGl0KCcvJyk7CisJdmFyIG5ld3BhdGggPSAnJzsKKwlmb3IgKHZhciBpPTA7IGkgPCAocGllY2VzLmxlbmd0aC0yKTsgaSsrKSB7CisJCW5ld3BhdGggKz0gKHBpZWNlc1tpXSArICcvJyk7CisJfQorCWlmICgnJyA9PSBuZXdwYXRoKSB7CisJCW5ld3BhdGggPSAnLyc7CisJfQorCV9wYXRocy5jYXRhbG9nID0gbmV3cGF0aDsKKwlpbml0RmlsZU1hbmFnZXJCcm93c2VyKCk7CisJY2xlYXJNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQoJ2NhdGFsb2cnKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIGNhdGFsb2dOYXZpZ2F0ZVVwUm9vdCgpIHsKKwkvLyBSZS1Jbml0aWFsaXplIHRoZSBjYXRhbG9nIGJyb3dzZXIKKwlfcGF0aHMuY2F0YWxvZyA9ICcvJzsKKwlpbml0RmlsZU1hbmFnZXJCcm93c2VyKCk7CisJY2xlYXJNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQoJ2NhdGFsb2cnKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisgCitmdW5jdGlvbiBnZXRNZXRhZGF0YUZvckNhdGFsb2dlZEZpbGUoZmlsZSkgeworCSQuZ2V0KCcuL3NlcnZpY2VzL21ldGFkYXRhL2NhdGFsb2cnLAorCQkJeyAnaWQnIDogZmlsZSB9LAorCQkJZnVuY3Rpb24oZGF0YSx0ZXh0U3RhdHVzKSB7CisJCQkJZGlzcGxheUNhdGFsb2dlZEZpbGVNZXRhZGF0YShmaWxlLGRhdGEpOworCQkJCX0sICJodG1sIik7Cit9CisgCitmdW5jdGlvbiBkaXNwbGF5Q2F0YWxvZ2VkRmlsZU1ldGFkYXRhKGZpbGUsZGF0YSkgeworCSQoJyNjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbChkYXRhKTsKKwlfcGF0aHMuY3VycmVudENhdGFsb2dlZEZpbGUgPSBmaWxlOworCW1ha2VQcm9kdWN0TWV0YWRhdGFFZGl0YWJsZSgpOworfQorCitmdW5jdGlvbiBnZXRQcm9kdWN0VHlwZVdvcmtiZW5jaChwcm9kdWN0VHlwZSkgeworCXZhciBwaWVjZXMgPSBwcm9kdWN0VHlwZS5zcGxpdCgnLycpOworCXZhciBwb2xpY3kgPSBwaWVjZXNbMV07CisJdmFyIHB0eXBlICA9IHBpZWNlc1syXTsKKwkkLmdldCgnLi9zZXJ2aWNlcy9tZXRhZGF0YS9wcm9kdWN0VHlwZScsCisJCQl7ICdwb2xpY3knIDogcG9saWN5LCAncHJvZHVjdFR5cGUnIDogcHR5cGUsICdpZCcgOiBwcm9kdWN0VHlwZSB9LAorCQkJZnVuY3Rpb24oZGF0YSx0ZXh0U3RhdHVzKSB7CisJCQkJZGlzcGxheVByb2R1Y3RUeXBlV29ya2JlbmNoKHByb2R1Y3RUeXBlLGRhdGEpOworCQkJfSwiaHRtbCIpOworCWl0UG9saWN5ICAgICAgPSBwb2xpY3k7CisJaXRQcm9kdWN0VHlwZSA9IHB0eXBlOworfQorCitmdW5jdGlvbiBkaXNwbGF5UHJvZHVjdFR5cGVXb3JrYmVuY2gocHJvZHVjdFR5cGUsZGF0YSkgeworCSQoJyNjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykuaHRtbCgnJyk7CS8vIGNsZWFyIHRoZSBvbGQgY29udGVudHMKKwkkKCcucHR3Yk1ldGFkYXRhTGlzdCcpLmh0bWwoZGF0YSk7CQkJCS8vIGFkZCBtZXRhZGF0YSBmcm9tIHNlcnZpY2UJCQorCQorCSQoJyNwcm9kdWN0VHlwZVdvcmtiZW5jaENvbnRlbnRzJykJCQkJLy8gZGlzcGxheSBwdCB3b3JrYmVuY2gKKwkJLmNsb25lKCkKKwkJLmF0dHIoJ2lkJywnbGl2ZVByb2R1Y3RUeXBlV29ya2JlbmNoQ29udGVudHMnKQorCQkuYXBwZW5kVG8oJyNjYXRhbG9nTWV0YWRhdGFXb3JrYmVuY2hDb250ZW50JykKKwkJLnNob3coKQorCQkudGFicygpOworCWNsZWFyRHJvcHBlZEZpbGVzTGlzdCgpOwkJCQkJCS8vIGNsZWFyIGRyb3BwZWQgZmlsZXMgbGlzdAorCWluaXREcmFnQW5kRHJvcFRhcmdldCgpOwkJCQkJCS8vIHNldCB1cCB0aGUgZCZkIHRhcmdldCBib3gKKwlfcGF0aHMuY3VycmVudFByb2R1Y3RUeXBlID0gcHJvZHVjdFR5cGU7CQkvLyBzZXQgdGhlIHBhdGggZm9yIHRoZSBwdHlwZQorCW1ha2VQcm9kdWN0VHlwZU1ldGFkYXRhRWRpdGFibGUoKTsJCQkJLy8gYWxsb3cgcHR5cGUgbWV0IGVkaXRpbmcKKwl1cGRhdGVJbmdlc3Rpb25UYXNrTWV0RXh0cmFjdG9yQ29uZmlnSWRzKCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoX3dpY2tldC5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9Xb3JrYmVuY2hfd2lja2V0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzgzMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvV29ya2JlbmNoX3dpY2tldC5jc3MKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworVUwuZmlsZVRyZWUgeworICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBwYWRkaW5nOiAwcHg7CisgICAgbWFyZ2luOiAwcHg7Cit9CisKK0xJLmhlbHBlciB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOjExcHg7CisgICAgbGluZS1oZWlnaHQ6MThweDsKK30KKworVUwuZmlsZVRyZWUgTEksIExJLmhlbHBlciB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nOiAwcHg7CisgICAgcGFkZGluZy1sZWZ0OiAyMHB4OworICAgIG1hcmdpbjogMHB4OworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK1VMLmZpbGVUcmVlIEEsIExJLmhlbHBlciBBIHsKKyAgICBjb2xvcjogIzMzMzsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgcGFkZGluZzogMHB4IDJweDsKK30KKworVUwuZmlsZVRyZWUgQTpob3ZlciwgTEkuaGVscGVyIEEgeworICAgIGJhY2tncm91bmQ6ICNCREY7Cit9CisKKy8qIENvcmUgU3R5bGVzICovCisuZmlsZVRyZWUgTEkuZGlyZWN0b3J5LCBMSS5oZWxwZXIuZGlyZWN0b3J5IHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9kaXJlY3RvcnkucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHBhbmRlZCwgTEkuaGVscGVyLmV4cGFuZGVkICAgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2ZvbGRlcl9vcGVuLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZmlsZSwgTEkuaGVscGVyLmZpbGUgICAgICAgICAgIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9maWxlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkud2FpdCwgTEkuaGVscGVyLndhaXQgICAgICAgICAgIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9zcGlubmVyLmdpZikgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisvKiBGaWxlIEV4dGVuc2lvbnMqLworLmZpbGVUcmVlIExJLmV4dF8zZ3AsIExJLmhlbHBlci5leHRfM2dwIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9maWxtLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2FmcCwgTEkuaGVscGVyLmV4dF9hZnAgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2NvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfYWZwYSwgTEkuaGVscGVyLmV4dF9hZnBhIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9jb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2FzcCwgTEkuaGVscGVyLmV4dF9hc3AgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2NvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfYXNweCwgTEkuaGVscGVyLmV4dF9hc3B4IHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9jb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2F2aSwgTEkuaGVscGVyLmV4dF9hdmkgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2ZpbG0ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfYmF0LCBMSS5oZWxwZXIuZXh0X2JhdCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvYXBwbGljYXRpb24ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfYm1wLCBMSS5oZWxwZXIuZXh0X2JtcCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcGljdHVyZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9jLCBMSS5oZWxwZXIuZXh0X2MgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2NvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfY2ZtLCBMSS5oZWxwZXIuZXh0X2NmbSB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvY29kZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9jZ2ksIExJLmhlbHBlci5leHRfY2dpIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9jb2RlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2NvbSwgTEkuaGVscGVyLmV4dF9jb20geyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2FwcGxpY2F0aW9uLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2NwcCwgTEkuaGVscGVyLmV4dF9jcHAgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2NvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfY3NzLCBMSS5oZWxwZXIuZXh0X2NzcyB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvY3NzLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2RvYywgTEkuaGVscGVyLmV4dF9kb2MgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2RvYy5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9leGUsIExJLmhlbHBlci5leHRfZXhlIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9hcHBsaWNhdGlvbi5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9naWYsIExJLmhlbHBlci5leHRfZ2lmIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9waWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2ZsYSwgTEkuaGVscGVyLmV4dF9mbGEgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2ZsYXNoLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2gsIExJLmhlbHBlci5leHRfaCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvY29kZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9odG0sIExJLmhlbHBlci5leHRfaHRtIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9odG1sLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2h0bWwsIExJLmhlbHBlci5leHRfaHRtbCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvaHRtbC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9qYXIsIExJLmhlbHBlci5leHRfamFyIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9qYXZhLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2pwZywgTEkuaGVscGVyLmV4dF9qcGcgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL3BpY3R1cmUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfanBlZywgTEkuaGVscGVyLmV4dF9qcGVnIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9waWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X2pzLCBMSS5oZWxwZXIuZXh0X2pzIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9zY3JpcHQucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbGFzc28sIExJLmhlbHBlci5leHRfbGFzc28geyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2NvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbG9nLCBMSS5oZWxwZXIuZXh0X2xvZyB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvdHh0LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X200cCwgTEkuaGVscGVyLmV4dF9tNHAgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL211c2ljLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X21vdiwgTEkuaGVscGVyLmV4dF9tb3YgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2ZpbG0ucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbXAzLCBMSS5oZWxwZXIuZXh0X21wMyB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvbXVzaWMucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfbXA0LCBMSS5oZWxwZXIuZXh0X21wNCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvZmlsbS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9tcGcsIExJLmhlbHBlci5leHRfbXBnIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9maWxtLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X21wZWcsIExJLmhlbHBlci5leHRfbXBlZyB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvZmlsbS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9vZ2csIExJLmhlbHBlci5leHRfb2dnIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9tdXNpYy5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9wY3gsIExJLmhlbHBlci5leHRfcGN4IHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9waWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3BkZiwgTEkuaGVscGVyLmV4dF9wZGYgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL3BkZi5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9waHAsIExJLmhlbHBlci5leHRfcGhwIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9waHAucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcG5nLCBMSS5oZWxwZXIuZXh0X3BuZyB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcGljdHVyZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9wcHQsIExJLmhlbHBlci5leHRfcHB0IHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9wcHQucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcHNkLCBMSS5oZWxwZXIuZXh0X3BzZCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcHNkLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3BsLCBMSS5oZWxwZXIuZXh0X3BsIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9zY3JpcHQucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfcHksIExJLmhlbHBlci5leHRfcHkgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL3NjcmlwdC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9yYiwgTEkuaGVscGVyLmV4dF9yYiB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcnVieS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9yYngsIExJLmhlbHBlci5leHRfcmJ4IHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9ydWJ5LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3JodG1sLCBMSS5oZWxwZXIuZXh0X3JodG1sIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9ydWJ5LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3JwbSwgTEkuaGVscGVyLmV4dF9ycG0geyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2xpbnV4LnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3J1YnksIExJLmhlbHBlci5leHRfcnVieSB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcnVieS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9zcWwsIExJLmhlbHBlci5leHRfc3FsIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9kYi5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF9zd2YsIExJLmhlbHBlci5leHRfc3dmIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9mbGFzaC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF90aWYsIExJLmhlbHBlci5leHRfdGlmIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9waWN0dXJlLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0OyB9CisuZmlsZVRyZWUgTEkuZXh0X3RpZmYsIExJLmhlbHBlci5leHRfdGlmZiB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcGljdHVyZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF90eHQsIExJLmhlbHBlci5leHRfdHh0IHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy90eHQucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfdmIsIExJLmhlbHBlci5leHRfdmIgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vLi4vaW1hZ2VzL2NvZGUucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfd2F2LCBMSS5oZWxwZXIuZXh0X3dhdiB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvbXVzaWMucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfd212LCBMSS5oZWxwZXIuZXh0X3dtdiB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvZmlsbS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF94bHMsIExJLmhlbHBlci5leHRfeGxzIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy94bHMucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKy5maWxlVHJlZSBMSS5leHRfeG1sLCBMSS5oZWxwZXIuZXh0X3htbCB7IGJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvY29kZS5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsgfQorLmZpbGVUcmVlIExJLmV4dF96aXAsIExJLmhlbHBlci5leHRfemlwIHsgYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy96aXAucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7IH0KKworLyoqCisgKiAuQ0xSCisgKiBUaGlzIGlzIGEgdXRpbGl0eSB3aGljaCBzZXJ2ZXMgdG8gcmVzZXQgdGhpbmdzIGFmdGVyIGEgCisgKiBzZXJpZXMgb2YgZmxvYXRlZCBlbGVtZW50cworICovCisuY2xyIHsKKyAgICBjbGVhcjpib3RoOworfQorCisKKy8qIFVJLlRBQlMgKi8KKy51aS10YWJzIHsgcGFkZGluZzogMGVtOyB6b29tOiAxOyBmb250LXNpemU6MTFweDsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IHsgbGlzdC1zdHlsZTogbm9uZTsgcG9zaXRpb246IHJlbGF0aXZlOyBwYWRkaW5nOiAwcHg7IH0KKy51aS10YWJzIC51aS10YWJzLW5hdiBsaSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgZmxvYXQ6IGxlZnQ7IGJvcmRlci1ib3R0b20td2lkdGg6IDA7IG1hcmdpbjogMCAuMmVtOyBwYWRkaW5nOiAwOyB9CisudWktdGFicyAudWktdGFicy1uYXYgbGkgYSB7IGZsb2F0OiBsZWZ0OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHBhZGRpbmc6IC41ZW0gMWVtOyB9CisudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCB7IHBhZGRpbmctYm90dG9tOiAxcHg7IGJvcmRlci1ib3R0b20td2lkdGg6IDNweDsgYm9yZGVyLWJvdHRvbS1jb2xvcjojZmZmOyBtYXJnaW4tYm90dG9tOi0ycHg7IG92ZXJmbG93Om5vbmU7IH0KKy51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLXNlbGVjdGVkIGEsIC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1kaXNhYmxlZCBhLCAudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtcHJvY2Vzc2luZyBhIHsgY3Vyc29yOiB0ZXh0OyB9CisudWktdGFicyAudWktdGFicy1uYXYgbGkgYSwgLnVpLXRhYnMudWktdGFicy1jb2xsYXBzaWJsZSAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCBhIHsgY3Vyc29yOiBwb2ludGVyOyB9IC8qIGZpcnN0IHNlbGVjdG9yIGluIGdyb3VwIHNlZW1zIG9ic29sZXRlLCBidXQgcmVxdWlyZWQgdG8gb3ZlcmNvbWUgYnVnIGluIE9wZXJhIGFwcGx5aW5nIGN1cnNvcjogdGV4dCBvdmVyYWxsIGlmIGRlZmluZWQgZWxzZXdoZXJlLi4uICovCisudWktdGFicyAudWktdGFicy1wYW5lbCB7IHBhZGRpbmc6IDFlbSAwZW07IGRpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiBub25lOyB9CisudWktdGFicyAudWktdGFicy1oaWRlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CisKKworCisudWktdGFicyAudWktdGFicy1uYXYgbGkgeyBib3JkZXI6IHNvbGlkIDFweCAjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOyB9CisudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBjb2xvcjogIzU1NTsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgeyBjb2xvcjogI2ZmZjsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSB7IGNvbG9yOiAgIzU1NTsgfQorLnVpLXRhYnMgLnVpLXRhYnMtbmF2IHsgIH0KKy51aS10YWJzIC51aS10YWJzLXBhbmVsIHsgcGFkZGluZzogMWVtIDBlbTsgbWFyZ2luOiAwZW07IGJvcmRlci10b3A6IHNvbGlkIDFweCAjY2NjO30KKworCisKKworLyogTUFJTiBJTlRFUkZBQ0UgU1RSVUNUVVJFUyAqLworZGl2LmNvbnRhaW5lciB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgYm9yZGVyOnNvbGlkIDFweCBncmV5OworICAgIHBhZGRpbmc6NXB4OworfQorCitkaXYjYnJvd3NlU3RhZ2luZ0NvbnRhaW5lciwgZGl2I2Jyb3dzZUNhdGFsb2dDb250YWluZXIgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIHdpZHRoOjQ3JTsKKyAgICBib3JkZXI6c29saWQgMnB4ICNjY2M7CisgICAgcGFkZGluZzoycHg7Cit9CitkaXYjYnJvd3NlU3RhZ2luZ0NvbnRhaW5lciB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgZmxvYXQ6bGVmdDsKK30KKworZGl2I2Jyb3dzZUNhdGFsb2dDb250YWluZXIgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGZsb2F0OnJpZ2h0OworfQorCitkaXYjYnJvd3NlU3RhZ2luZyB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgZmxvYXQ6bGVmdDsKKyAgICB3aWR0aDozMyU7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIG92ZXJmbG93OnNjcm9sbDsgICAgCit9CitkaXYjYnJvd3NlQ2F0YWxvZyB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgZmxvYXQ6bGVmdDsKKyAgICB3aWR0aDozMyU7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIG92ZXJmbG93OnNjcm9sbDsgICAgCit9CitkaXYjc3RhZ2luZ01ldENvbnRhaW5lciB7CisgICAgcG9zaXRpb246cmVsYXRpdmU7CisgICAgZmxvYXQ6cmlnaHQ7CisgICAgd2lkdGg6NjAlOworICAgIGhlaWdodDozNTBweDsKKyAgICBmb250LXNpemU6MTJweDsKK30KK2RpdiNzdGFnaW5nTWV0RXh0cmFjdG9yU2VsZWN0aW9uIHsKKyAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICBtYXJnaW4tYm90dG9tOjNweDsKKyAgICBkaXNwbGF5Om5vbmU7Cit9CisKK2RpdiNzdGFnZWRNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGhlaWdodDozMjNweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7CisgICAgb3ZlcmZsb3c6c2Nyb2xsOworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsgIAorfQorZGl2I2NhdGFsb2dNZXRhZGF0YVdvcmtiZW5jaENvbnRlbnQgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGZsb2F0OnJpZ2h0OworICAgIHdpZHRoOjYwJTsKKyAgICBoZWlnaHQ6MzUwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmOworICAgIG92ZXJmbG93OnNjcm9sbDsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7ICAKK30KKworLmJyb3dzZXIgeworICAgIGJhY2tncm91bmQ6I0ZGRkZGRiBub25lIHJlcGVhdCBzY3JvbGwgMCAwOworICAgIGJvcmRlci1jb2xvcjojQkJCQkJCICNGRkZGRkYgI0ZGRkZGRiAjQkJCQkJCOworICAgIGJvcmRlci1zdHlsZTpzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6MXB4OworICAgIGhlaWdodDozNTBweDsKKyAgICBwYWRkaW5nOjVweDsKKyAgICB3aWR0aDoyMDBweDsKK30KKy5jb250YWluZXIuYnJvd3NlcnMsIC5jb250YWluZXIudGFza3MgeworICAgIGJhY2tncm91bmQtY29sb3I6I0VFRUVFRTsKKyAgICBib3JkZXI6c29saWQgMXB4ICNjY2M7CisgICAgcGFkZGluZy10b3A6MThweDsKKyAgICBtYXJnaW46NXB4IDBweDsKK30KKy5jb250YWluZXIgaDUgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIG1hcmdpbjotMjBweCAtNHB4IDVweDsKKyAgICBwYWRkaW5nOjBweDsKKyAgICBmb250LWZhbWlseTphcmlhbCxzYW5zLXNlcmlmOworICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKKyAgICBjb2xvcjojOTk5OyAKK30KKworLnBhdGhiYXIgeworICAgIGJvcmRlcjpzb2xpZCAxcHggI2NjYzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7CisgICAgY29sb3I6IzIyMjsKKyAgICBwYWRkaW5nOjNweDsKKyAgICBtYXJnaW4tYm90dG9tOjJweDsgIAorICAgIGZvbnQtZmFtaWx5OmNvdXJpZXIsc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemU6MTFweDsKK30KKworCisvKiBNRVRBREFUQSBFRElUT1IgKi8KK2Rpdi5lZGl0b3IgeworICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIHBhZGRpbmc6MHB4OyAgICAKK30KKworZGl2LmVkaXRvci5pbmZvIHsKKyAgICBwYWRkaW5nOjVweDsgICAgCit9CisKK2Rpdi5lZGl0b3IgdGFibGUgeworICAgIGZvbnQtc2l6ZToxMXB4OworICAgIHdpZHRoOjEwMCU7Cit9CisKK2Rpdi5lZGl0b3IgdGFibGUgdHIgeworICAgIAorfQorCitkaXYuZWRpdG9yIHRhYmxlIHRyIHRoIHsKKyAgICBib3JkZXItcmlnaHQ6c29saWQgMXB4ICNjY2M7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggI2NjYzsKKyAgICBwYWRkaW5nOjVweDsKKyAgICB0ZXh0LWFsaWduOmxlZnQ7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZjZmNmY2OworICAgIGNvbG9yOiM1NTU7Cit9CisKK2Rpdi5lZGl0b3IgdGFibGUgdHIgdGQgeworICAgIGJvcmRlci1yaWdodDpzb2xpZCAxcHggI2NjYzsKKyAgICBib3JkZXItYm90dG9tOnNvbGlkIDFweCAjY2NjOworICAgIHBhZGRpbmc6NXB4OworfQorCisvKiAKKyAqIElOR0VTVElPTiBUQVNLIExJU1QgCisgKi8KKworCisuY29udGFpbmVyLnRhc2tzIHsKKyAgICBwYWRkaW5nOjVweDsKKyAgICBwYWRkaW5nLXRvcDoyMHB4OworfQorLmNvbnRhaW5lci50YXNrcyBoNSB7CisgICAgbWFyZ2luOi0xOHB4IDBweCAycHg7Cit9CitkaXYjaW5nZXN0aW9uVGFza0xpc3QgeworICAgIAorfQorZGl2I2luZ2VzdGlvblRhc2tMaXN0Q29udGVudCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmOworICAgIG1pbi1oZWlnaHQ6MTAwcHg7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOyAgCit9CisKK2RpdiNpbmdlc3Rpb25UYXNrTGlzdENvbnRlbnQgdGFibGUgeworICAgIGZvbnQtc2l6ZToxMXB4OworICAgIHdpZHRoOjEwMCU7Cit9CisKK2RpdiNpbmdlc3Rpb25UYXNrTGlzdENvbnRlbnQgdGFibGUgdHJ7CisKK30KK2RpdiNpbmdlc3Rpb25UYXNrTGlzdENvbnRlbnQgdGFibGUgdHIgdGh7CisgICAgcGFkZGluZzo0cHg7CisgICAgYm9yZGVyLXJpZ2h0OnNvbGlkIDFweCAjY2NjOworICAgIGJvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7CisgICAgYmFja2dyb3VuZC1jb2xvcjojZjZmNmY2OworfQorZGl2I2luZ2VzdGlvblRhc2tMaXN0Q29udGVudCB0YWJsZSB0ciB0ZHsKKyAgICBwYWRkaW5nOjRweDsKKyAgICBib3JkZXItcmlnaHQ6c29saWQgMXB4ICNjY2M7CisgICAgYm9yZGVyLWJvdHRvbTpzb2xpZCAxcHggI2NjYzsKK30KKworCisvKiBQUk9EVUNUVFlQRSBXT1JLQkVOQ0ggKi8KKworZGl2I3Byb2R1Y3RUeXBlV29ya2JlbmNoTGFiZWwgeworICAgIGZvbnQtc2l6ZToxMnB4OworICAgIGZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7CisgICAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOworICAgIGNvbG9yOiM1NTU7CisgICAgZm9udC13ZWlnaHQ6bm9ybWFsOworICAgIHBhZGRpbmc6MXB4IDFweCAxcHggNHB4OyAgICAKK30KKworZGl2I3B0d2JBZGRQcm9kdWN0cyB7CisgICAgcGFkZGluZzo1cHg7ICAgIAorfQorCitkaXYjcHJvZHVjdFR5cGVXb3JrYmVuY2hDb250ZW50cyAuaW5zdHJ1Y3Rpb25zIHsKKyAgICBmb250LXNpemU6OTAlOworICAgIGNvbG9yOiM0NDQ7IAorfQorCitkaXYjcHR3Yk1ldGFkYXRhTGlzdCB0YWJsZSB7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOyAgCit9CisKK2RpdiNkcm9wcGVkRmlsZUxpc3QgeworCisgICAgb3ZlcmZsb3c6c2Nyb2xsOworICAgIG1pbi1oZWlnaHQ6NTBweDsKKyAgICAgICAgCit9CisKK2Rpdi5wdHdiU2VjdGlvbkJveCB7CisgICAgYm9yZGVyOnNvbGlkIDFweCAjY2NjOworICAgIHBhZGRpbmc6MnB4OworICAgIG1hcmdpbjo1cHggMHB4IDJweCAwcHg7IAorfQorCitkaXYucHR3YlNlY3Rpb25Cb3ggaDUgeworICAgIG1hcmdpbjowIDAgNHB4OworICAgIHBhZGRpbmc6MHB4OyAgICAKK30KKworZGl2I2Ryb3BwZWRGaWxlVGFyZ2V0IHsKKyAgICBoZWlnaHQ6MzBweDsKKyAgICBib3JkZXItY29sb3I6I2JkYjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiNkZmQ7ICAKK30KKworZGl2I2l0TWV0RXh0cmFjdG9yU2VsZWN0b3IgeworICAgIAorfQorCitkaXYjaXRDcmVhdGVJbmdlc3Rpb25UYXNrQnV0dG9uIHsKKyAgICBtYXJnaW4tdG9wOjVweDsgCit9CisKK2Rpdi5lZGl0b3IgdGFibGUgdHIgdGQgeworICAgIAorICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIHBhZGRpbmctbGVmdDo1cHg7CisgICAgY3Vyc29yOnBvaW50ZXI7CisgICAgX2N1cnNvcjpoYW5kOworICAgIAorfQorCitkaXYuZWRpdG9yIHRhYmxlIHRyIHRkIGltZy5wZW5jaWwgeworICAgIAorICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgIGxlZnQ6MHB4OworICAgIGN1cnNvcjpwb2ludGVyOworICAgIF9jdXJzb3I6aGFuZDsKKyAgICAKK30KKworCisucHR3Yk1ldGFkYXRhTGlzdCB0YWJsZSB7CisgICAgYm9yZGVyLXRvcDpzb2xpZCAxcHggI2NjYzsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2FwcGxpY2F0aW9uLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2FwcGxpY2F0aW9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdjMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvYXBwbGljYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2NvZGUucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvY29kZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3Y2IzZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2NvZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2Nzcy5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9jc3MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzdmNjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9jc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2RiLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2RiLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJhZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvZGIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2RpcmVjdG9yeS5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9kaXJlY3RvcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzFkNjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9kaXJlY3RvcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2RvYy5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9kb2MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjE3MDEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9kb2MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZpbGUucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvZmlsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwNzUyMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZpbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZpbG0ucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvZmlsbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNTFiZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZpbG0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZsYXNoLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZsYXNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWYwYjcyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvZmxhc2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZvbGRlcl9vcGVuLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ZvbGRlcl9vcGVuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYwMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvZm9sZGVyX29wZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2hlbHAuZ2lmIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvaGVscC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZDYzNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2hlbHAuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2h0bWwucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvaHRtbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxYWEzYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2h0bWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2ltcG9ydGFudC5naWYgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9pbXBvcnRhbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OWVhOWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9pbXBvcnRhbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2luZm8uZ2lmIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvaW5mby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiOTkyYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2luZm8uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2phdmEucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvamF2YS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3YjYyZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2phdmEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2pxdWVyeS0xLjMuMi5qcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2pxdWVyeS0xLjMuMi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYzNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvanF1ZXJ5LTEuMy4yLmpzCkBAIC0wLDAgKzEsNDM3NiBAQAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjMuMgorICogaHR0cDovL2pxdWVyeS5jb20vCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvaG4gUmVzaWcKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCisgKgorICogRGF0ZTogMjAwOS0wMi0xOSAxNzozNDoyMSAtMDUwMCAoVGh1LCAxOSBGZWIgMjAwOSkKKyAqIFJldmlzaW9uOiA2MjQ2CisgKi8KKyhmdW5jdGlvbigpeworCit2YXIgCisJLy8gV2lsbCBzcGVlZCB1cCByZWZlcmVuY2VzIHRvIHdpbmRvdywgYW5kIGFsbG93cyBtdW5naW5nIGl0cyBuYW1lLgorCXdpbmRvdyA9IHRoaXMsCisJLy8gV2lsbCBzcGVlZCB1cCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCwgYW5kIGFsbG93cyBtdW5naW5nIGl0cyBuYW1lLgorCXVuZGVmaW5lZCwKKwkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKwlfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKKwkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorCV8kID0gd2luZG93LiQsCisKKwlqUXVlcnkgPSB3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJworCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOworCX0sCisKKwkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncyBvciBJRCBzdHJpbmdzCisJLy8gKGJvdGggb2Ygd2hpY2ggd2Ugb3B0aW1pemUgZm9yKQorCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCisJLy8gSXMgaXQgYSBzaW1wbGUgc2VsZWN0b3IKKwlpc1NpbXBsZSA9IC9eLlteOiNcW1wuLF0qJC87CisKK2pRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7CisJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQKKwkJc2VsZWN0b3IgPSBzZWxlY3RvciB8fCBkb2N1bWVudDsKKworCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQorCQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgeworCQkJdGhpc1swXSA9IHNlbGVjdG9yOworCQkJdGhpcy5sZW5ndGggPSAxOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3I7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQkvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKwkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CisJCQl2YXIgbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKKworCQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmllZCBmb3IgI2lkCisJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CisKKwkJCQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKKwkJCQlpZiAoIG1hdGNoWzFdICkKKwkJCQkJc2VsZWN0b3IgPSBqUXVlcnkuY2xlYW4oIFsgbWF0Y2hbMV0gXSwgY29udGV4dCApOworCisJCQkJLy8gSEFORExFOiAkKCIjaWQiKQorCQkJCWVsc2UgeworCQkJCQl2YXIgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFszXSApOworCisJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCisJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAorCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5pZCAhPSBtYXRjaFszXSApCisJCQkJCQlyZXR1cm4galF1ZXJ5KCkuZmluZCggc2VsZWN0b3IgKTsKKworCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJCQkJCXZhciByZXQgPSBqUXVlcnkoIGVsZW0gfHwgW10gKTsKKwkJCQkJcmV0LmNvbnRleHQgPSBkb2N1bWVudDsKKwkJCQkJcmV0LnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCisJCQkvLyBIQU5ETEU6ICQoZXhwciwgW2NvbnRleHRdKQorCQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIpCisJCQl9IGVsc2UKKwkJCQlyZXR1cm4galF1ZXJ5KCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKworCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCisJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCisJCQlyZXR1cm4galF1ZXJ5KCBkb2N1bWVudCApLnJlYWR5KCBzZWxlY3RvciApOworCisJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKKwkJaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAmJiBzZWxlY3Rvci5jb250ZXh0ICkgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKwkJfQorCisJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KKwkJCXNlbGVjdG9yIDoKKwkJCWpRdWVyeS5tYWtlQXJyYXkoc2VsZWN0b3IpKTsKKwl9LAorCisJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorCXNlbGVjdG9yOiAiIiwKKworCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKKwlqcXVlcnk6ICIxLjMuMiIsCisKKwkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAorCXNpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfSwKKworCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKwkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorCWdldDogZnVuY3Rpb24oIG51bSApIHsKKwkJcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkID8KKworCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQorCQkJQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHRoaXMgKSA6CisKKwkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKKwkJCXRoaXNbIG51bSBdOworCX0sCisKKwkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCisJLy8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCisJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgeworCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAorCQl2YXIgcmV0ID0galF1ZXJ5KCBlbGVtcyApOworCisJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCisJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKKworCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKKworCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApCisJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsKKwkJZWxzZSBpZiAoIG5hbWUgKQorCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIuIiArIG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKKworCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAorCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKKwkvLyB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGVsZW1lbnRzIChkZXN0cm95aW5nIHRoZSBzdGFjayBpbiB0aGUgcHJvY2VzcykKKwkvLyBZb3Ugc2hvdWxkIHVzZSBwdXNoU3RhY2soKSBpbiBvcmRlciB0byBkbyB0aGlzLCBidXQgbWFpbnRhaW4gdGhlIHN0YWNrCisJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwkJLy8gUmVzZXR0aW5nIHRoZSBsZW5ndGggdG8gMCwgdGhlbiB1c2luZyB0aGUgbmF0aXZlIEFycmF5IHB1c2gKKwkJLy8gaXMgYSBzdXBlci1mYXN0IHdheSB0byBwb3B1bGF0ZSBhbiBvYmplY3Qgd2l0aCBhcnJheS1saWtlIHByb3BlcnRpZXMKKwkJdGhpcy5sZW5ndGggPSAwOworCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggdGhpcywgZWxlbXMgKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KKwkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcworCS8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LikKKwllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbgorCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cworCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisJCXJldHVybiBqUXVlcnkuaW5BcnJheSgKKwkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorCQkJZWxlbSAmJiBlbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtCisJCSwgdGhpcyApOworCX0sCisKKwlhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUsIHR5cGUgKSB7CisJCXZhciBvcHRpb25zID0gbmFtZTsKKworCQkvLyBMb29rIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBhY2Nlc3NpbmcgYSBzdHlsZSB2YWx1ZQorCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApCisJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKQorCQkJCXJldHVybiB0aGlzWzBdICYmIGpRdWVyeVsgdHlwZSB8fCAiYXR0ciIgXSggdGhpc1swXSwgbmFtZSApOworCisJCQllbHNlIHsKKwkJCQlvcHRpb25zID0ge307CisJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CisJCQl9CisKKwkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHNldHRpbmcgc3R5bGUgdmFsdWVzCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7CisJCQkvLyBTZXQgYWxsIHRoZSBzdHlsZXMKKwkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApCisJCQkJalF1ZXJ5LmF0dHIoCisJCQkJCXR5cGUgPworCQkJCQkJdGhpcy5zdHlsZSA6CisJCQkJCQl0aGlzLAorCQkJCQluYW1lLCBqUXVlcnkucHJvcCggdGhpcywgb3B0aW9uc1sgbmFtZSBdLCB0eXBlLCBpLCBuYW1lICkKKwkJCQkpOworCQl9KTsKKwl9LAorCisJY3NzOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKKwkJLy8gaWdub3JlIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCisJCWlmICggKGtleSA9PSAnd2lkdGgnIHx8IGtleSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKKwkJCXZhbHVlID0gdW5kZWZpbmVkOworCQlyZXR1cm4gdGhpcy5hdHRyKCBrZXksIHZhbHVlLCAiY3VyQ1NTIiApOworCX0sCisKKwl0ZXh0OiBmdW5jdGlvbiggdGV4dCApIHsKKwkJaWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKKwkJCXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICkgKTsKKworCQl2YXIgcmV0ID0gIiI7CisKKwkJalF1ZXJ5LmVhY2goIHRleHQgfHwgdGhpcywgZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5lYWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CisJCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9IDggKQorCQkJCQlyZXQgKz0gdGhpcy5ub2RlVHlwZSAhPSAxID8KKwkJCQkJCXRoaXMubm9kZVZhbHVlIDoKKwkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOworCQkJfSk7CisJCX0pOworCisJCXJldHVybiByZXQ7CisJfSwKKworCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgeworCQlpZiAoIHRoaXNbMF0gKSB7CisJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAorCQkJdmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVudCApLmNsb25lKCk7CisKKwkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkKKwkJCQl3cmFwLmluc2VydEJlZm9yZSggdGhpc1swXSApOworCisJCQl3cmFwLm1hcChmdW5jdGlvbigpeworCQkJCXZhciBlbGVtID0gdGhpczsKKworCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkKKwkJCQkJZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsKKworCQkJCXJldHVybiBlbGVtOworCQkJfSkuYXBwZW5kKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeSggdGhpcyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCApOworCQl9KTsKKwl9LAorCisJd3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKKwkJfSk7CisJfSwKKworCWFwcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJCXRoaXMuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKKwkJfSk7CisJfSwKKworCXByZXBlbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0peworCQkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKKwkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CisJCX0pOworCX0sCisKKwliZWZvcmU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKKwkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKKwkJfSk7CisJfSwKKworCWFmdGVyOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oZWxlbSl7CisJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CisJCX0pOworCX0sCisKKwllbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IGpRdWVyeSggW10gKTsKKwl9LAorCisJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgorCXB1c2g6IFtdLnB1c2gsCisJc29ydDogW10uc29ydCwKKwlzcGxpY2U6IFtdLnNwbGljZSwKKworCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJaWYgKCB0aGlzLmxlbmd0aCA9PT0gMSApIHsKKwkJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggW10sICJmaW5kIiwgc2VsZWN0b3IgKTsKKwkJCXJldC5sZW5ndGggPSAwOworCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzWzBdLCByZXQgKTsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKKwkJCQlyZXR1cm4galF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBlbGVtICk7CisJCQl9KSksICJmaW5kIiwgc2VsZWN0b3IgKTsKKwkJfQorCX0sCisKKwljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKKwkJLy8gRG8gdGhlIGNsb25lCisJCXZhciByZXQgPSB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CisJCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbgorCQkJCS8vIHVzaW5nIGNsb25lTm9kZS4gQ2FsbGluZyBkZXRhY2hFdmVudCBvbiB0aGUKKwkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAorCQkJCS8vIEluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhpcywgd2UgdXNlIGlubmVySFRNTC4KKwkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHNvbWUgbW9kaWZpY2F0aW9ucyB0bworCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKKwkJCQkvLyBhcyBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGNvcGllZCAoc3VjaCBhcyB0aGUKKwkJCQkvLyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24gYW4gaW5wdXQpLgorCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUw7CisJCQkJaWYgKCAhaHRtbCApIHsKKwkJCQkJdmFyIGRpdiA9IHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQkJZGl2LmFwcGVuZENoaWxkKCB0aGlzLmNsb25lTm9kZSh0cnVlKSApOworCQkJCQlodG1sID0gZGl2LmlubmVySFRNTDsKKwkJCQl9CisKKwkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpLnJlcGxhY2UoL15ccyovLCAiIildKVswXTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKKwkJfSk7CisKKwkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQorCQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKKwkJCXZhciBvcmlnID0gdGhpcy5maW5kKCIqIikuYW5kU2VsZigpLCBpID0gMDsKKworCQkJcmV0LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpeworCQkJCWlmICggdGhpcy5ub2RlTmFtZSAhPT0gb3JpZ1tpXS5ub2RlTmFtZSApCisJCQkJCXJldHVybjsKKworCQkJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YSggb3JpZ1tpXSwgImV2ZW50cyIgKTsKKworCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQkJZm9yICggdmFyIGhhbmRsZXIgaW4gZXZlbnRzWyB0eXBlIF0gKSB7CisJCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLmRhdGEgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWkrKzsKKwkJCX0pOworCQl9CisKKwkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soCisJCQlqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAmJgorCQkJalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSwgaSl7CisJCQkJcmV0dXJuIHNlbGVjdG9yLmNhbGwoIGVsZW0sIGkgKTsKKwkJCX0pIHx8CisKKwkJCWpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIGpRdWVyeS5ncmVwKHRoaXMsIGZ1bmN0aW9uKGVsZW0peworCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOworCQkJfSkgKSwgImZpbHRlciIsIHNlbGVjdG9yICk7CisJfSwKKworCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIHBvcyA9IGpRdWVyeS5leHByLm1hdGNoLlBPUy50ZXN0KCBzZWxlY3RvciApID8galF1ZXJ5KHNlbGVjdG9yKSA6IG51bGwsCisJCQljbG9zZXIgPSAwOworCisJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJdmFyIGN1ciA9IHRoaXM7CisJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCApIHsKKwkJCQlpZiAoIHBvcyA/IHBvcy5pbmRleChjdXIpID4gLTEgOiBqUXVlcnkoY3VyKS5pcyhzZWxlY3RvcikgKSB7CisJCQkJCWpRdWVyeS5kYXRhKGN1ciwgImNsb3Nlc3QiLCBjbG9zZXIpOworCQkJCQlyZXR1cm4gY3VyOworCQkJCX0KKwkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJCQljbG9zZXIrKzsKKwkJCX0KKwkJfSk7CisJfSwKKworCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKQorCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2Ugd2hlcmUganVzdCBvbmUgc2VsZWN0b3IgaXMgcGFzc2VkIGluCisJCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQorCQkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcywgdHJ1ZSApLCAibm90Iiwgc2VsZWN0b3IgKTsKKwkJCWVsc2UKKwkJCQlzZWxlY3RvciA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKTsKKworCQl2YXIgaXNBcnJheUxpa2UgPSBzZWxlY3Rvci5sZW5ndGggJiYgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gIT09IHVuZGVmaW5lZCAmJiAhc2VsZWN0b3Iubm9kZVR5cGU7CisJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlzLCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CisJCX0pOworCX0sCisKKwlhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCBqUXVlcnkubWVyZ2UoCisJCQl0aGlzLmdldCgpLAorCQkJdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/CisJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKKwkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciApCisJCSkpKTsKKwl9LAorCisJaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApLmxlbmd0aCA+IDA7CisJfSwKKworCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiAhIXNlbGVjdG9yICYmIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7CisJfSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CQkJCisJCQl2YXIgZWxlbSA9IHRoaXNbMF07CisKKwkJCWlmICggZWxlbSApIHsKKwkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAnb3B0aW9uJyApICkKKwkJCQkJcmV0dXJuIChlbGVtLmF0dHJpYnV0ZXMudmFsdWUgfHwge30pLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CisJCQkJCisJCQkJLy8gV2UgbmVlZCB0byBoYW5kbGUgc2VsZWN0IGJveGVzIHNwZWNpYWwKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKKwkJCQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorCQkJCQkJdmFsdWVzID0gW10sCisJCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQkJb25lID0gZWxlbS50eXBlID09ICJzZWxlY3Qtb25lIjsKKworCQkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAorCQkJCQlpZiAoIGluZGV4IDwgMCApCisJCQkJCQlyZXR1cm4gbnVsbDsKKworCQkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCisJCQkJCWZvciAoIHZhciBpID0gb25lID8gaW5kZXggOiAwLCBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrICkgeworCQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKKworCQkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgKSB7CisJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZjIHZhbHVlIGZvciB0aGUgb3B0aW9uCisJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKKworCQkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisJCQkJCQkJaWYgKCBvbmUgKQorCQkJCQkJCQlyZXR1cm4gdmFsdWU7CisKKwkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQorCQkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcmV0dXJuIHZhbHVlczsJCQkJCisJCQkJfQorCisJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCisJCQkJcmV0dXJuIChlbGVtLnZhbHVlIHx8ICIiKS5yZXBsYWNlKC9cci9nLCAiIik7CisKKwkJCX0KKworCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCWlmICggdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiApCisJCQl2YWx1ZSArPSAnJzsKKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCisJCQkJcmV0dXJuOworCisJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKKwkJCQl0aGlzLmNoZWNrZWQgPSAoalF1ZXJ5LmluQXJyYXkodGhpcy52YWx1ZSwgdmFsdWUpID49IDAgfHwKKwkJCQkJalF1ZXJ5LmluQXJyYXkodGhpcy5uYW1lLCB2YWx1ZSkgPj0gMCk7CisKKwkJCWVsc2UgaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJzZWxlY3QiICkgKSB7CisJCQkJdmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkodmFsdWUpOworCisJCQkJalF1ZXJ5KCAib3B0aW9uIiwgdGhpcyApLmVhY2goZnVuY3Rpb24oKXsKKwkJCQkJdGhpcy5zZWxlY3RlZCA9IChqUXVlcnkuaW5BcnJheSggdGhpcy52YWx1ZSwgdmFsdWVzICkgPj0gMCB8fAorCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CisJCQkJfSk7CisKKwkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKKwkJCQkJdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7CisKKwkJCX0gZWxzZQorCQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfSk7CisJfSwKKworCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPworCQkJKHRoaXNbMF0gPworCQkJCXRoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpIDoKKwkJCQludWxsKSA6CisJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCX0sCisKKwlyZXBsYWNlV2l0aDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4gdGhpcy5hZnRlciggdmFsdWUgKS5yZW1vdmUoKTsKKwl9LAorCisJZXE6IGZ1bmN0aW9uKCBpICkgeworCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7CisJfSwKKworCXNsaWNlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLAorCQkJInNsaWNlIiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsKKwl9LAorCisJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCX0pKTsKKwl9LAorCisJYW5kU2VsZjogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7CisJfSwKKworCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgeworCQlpZiAoIHRoaXNbMF0gKSB7CisJCQl2YXIgZnJhZ21lbnQgPSAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKwkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAorCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKKworCQkJaWYgKCBmaXJzdCApCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKQorCQkJCQljYWxsYmFjay5jYWxsKCByb290KHRoaXNbaV0sIGZpcnN0KSwgdGhpcy5sZW5ndGggPiAxIHx8IGkgPiAwID8KKwkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOworCQkKKwkJCWlmICggc2NyaXB0cyApCisJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCQkKKwkJZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgeworCQkJcmV0dXJuIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSAmJiBqUXVlcnkubm9kZU5hbWUoY3VyLCAidHIiKSA/CisJCQkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKKwkJCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgorCQkJCWVsZW07CisJCX0KKwl9Cit9OworCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CisKK2Z1bmN0aW9uIGV2YWxTY3JpcHQoIGksIGVsZW0gKSB7CisJaWYgKCBlbGVtLnNyYyApCisJCWpRdWVyeS5hamF4KHsKKwkJCXVybDogZWxlbS5zcmMsCisJCQlhc3luYzogZmFsc2UsCisJCQlkYXRhVHlwZTogInNjcmlwdCIKKwkJfSk7CisKKwllbHNlCisJCWpRdWVyeS5nbG9iYWxFdmFsKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApOworCisJaWYgKCBlbGVtLnBhcmVudE5vZGUgKQorCQllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKTsKK30KKworZnVuY3Rpb24gbm93KCl7CisJcmV0dXJuICtuZXcgRGF0ZTsKK30KKworalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKKwkvLyBjb3B5IHJlZmVyZW5jZSB0byB0YXJnZXQgb2JqZWN0CisJdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwgaSA9IDEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsIGRlZXAgPSBmYWxzZSwgb3B0aW9uczsKKworCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKwlpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKKwkJZGVlcCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OworCQkvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CisJCWkgPSAyOworCX0KKworCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQorCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKQorCQl0YXJnZXQgPSB7fTsKKworCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZAorCWlmICggbGVuZ3RoID09IGkgKSB7CisJCXRhcmdldCA9IHRoaXM7CisJCS0taTsKKwl9CisKKwlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApCisJCS8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkKKwkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKwkJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMgKSB7CisJCQkJdmFyIHNyYyA9IHRhcmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOworCisJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAorCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcworCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmIHR5cGVvZiBjb3B5ID09PSAib2JqZWN0IiAmJiAhY29weS5ub2RlVHlwZSApCisJCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgCisJCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KKwkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51bGwgPyBbIF0gOiB7IH0gKQorCQkJCQksIGNvcHkgKTsKKworCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKKwkJCQllbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkKKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OworCisJCQl9CisKKwkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAorCXJldHVybiB0YXJnZXQ7Cit9OworCisvLyBleGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cit2YXIJZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAorCS8vIGNhY2hlIGRlZmF1bHRWaWV3CisJZGVmYXVsdFZpZXcgPSBkb2N1bWVudC5kZWZhdWx0VmlldyB8fCB7fSwKKwl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKK2pRdWVyeS5leHRlbmQoeworCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgeworCQl3aW5kb3cuJCA9IF8kOworCisJCWlmICggZGVlcCApCisJCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKKworCQlyZXR1cm4galF1ZXJ5OworCX0sCisKKwkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgorCS8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKKwkvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgorCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSI7CisJfSwKKworCWlzQXJyYXk6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEFycmF5XSI7CisJfSwKKworCS8vIGNoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSAob3IgaXMgYW4pIFhNTCBkb2N1bWVudAorCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiB8fAorCQkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgalF1ZXJ5LmlzWE1MRG9jKCBlbGVtLm93bmVyRG9jdW1lbnQgKTsKKwl9LAorCisJLy8gRXZhbHVsYXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CisJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisJCWlmICggZGF0YSAmJiAvXFMvLnRlc3QoZGF0YSkgKSB7CisJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5IEFuZHJlYSBHaWFtbWFyY2hpCisJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKKwkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisKKwkJCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJCQlpZiAoIGpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKQorCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIGRhdGEgKSApOworCQkJZWxzZQorCQkJCXNjcmlwdC50ZXh0ID0gZGF0YTsKKworCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCisJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5KS4KKwkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOworCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCX0KKwl9LAorCisJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1VwcGVyQ2FzZSgpOworCX0sCisKKwkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJZWFjaDogZnVuY3Rpb24oIG9iamVjdCwgY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXZhciBuYW1lLCBpID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsKKworCQlpZiAoIGFyZ3MgKSB7CisJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKKwkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQorCQkJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkKKwkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApCisJCQkJCQlicmVhazsKKworCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAorCQl9IGVsc2UgeworCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKKwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApCisJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKKwkJCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOworCQkJCQlpIDwgbGVuZ3RoICYmIGNhbGxiYWNrLmNhbGwoIHZhbHVlLCBpLCB2YWx1ZSApICE9PSBmYWxzZTsgdmFsdWUgPSBvYmplY3RbKytpXSApe30KKwkJfQorCisJCXJldHVybiBvYmplY3Q7CisJfSwKKworCXByb3A6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgdHlwZSwgaSwgbmFtZSApIHsKKwkJLy8gSGFuZGxlIGV4ZWN1dGFibGUgZnVuY3Rpb25zCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKQorCQkJdmFsdWUgPSB2YWx1ZS5jYWxsKCBlbGVtLCBpICk7CisKKwkJLy8gSGFuZGxlIHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKKwkJcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgJiYgdHlwZSA9PSAiY3VyQ1NTIiAmJiAhZXhjbHVkZS50ZXN0KCBuYW1lICkgPworCQkJdmFsdWUgKyAicHgiIDoKKwkJCXZhbHVlOworCX0sCisKKwljbGFzc05hbWU6IHsKKwkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGFkZENsYXNzKCJjbGFzcyIpCisJCWFkZDogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CisJCQlqUXVlcnkuZWFjaCgoY2xhc3NOYW1lcyB8fCAiIikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFzc05hbWUpeworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAxICYmICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggZWxlbS5jbGFzc05hbWUsIGNsYXNzTmFtZSApICkKKwkJCQkJZWxlbS5jbGFzc05hbWUgKz0gKGVsZW0uY2xhc3NOYW1lID8gIiAiIDogIiIpICsgY2xhc3NOYW1lOworCQkJfSk7CisJCX0sCisKKwkJLy8gaW50ZXJuYWwgb25seSwgdXNlIHJlbW92ZUNsYXNzKCJjbGFzcyIpCisJCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CisJCQlpZiAoZWxlbS5ub2RlVHlwZSA9PSAxKQorCQkJCWVsZW0uY2xhc3NOYW1lID0gY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkID8KKwkJCQkJalF1ZXJ5LmdyZXAoZWxlbS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpeworCQkJCQkJcmV0dXJuICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggY2xhc3NOYW1lcywgY2xhc3NOYW1lICk7CisJCQkJCX0pLmpvaW4oIiAiKSA6CisJCQkJCSIiOworCQl9LAorCisJCS8vIGludGVybmFsIG9ubHksIHVzZSBoYXNDbGFzcygiY2xhc3MiKQorCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWUgKSB7CisJCQlyZXR1cm4gZWxlbSAmJiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOworCQl9CisJfSwKKworCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKKwlzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CisJCXZhciBvbGQgPSB7fTsKKwkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCisJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMgKSB7CisJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKKwkJfQorCisJCWNhbGxiYWNrLmNhbGwoIGVsZW0gKTsKKworCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKKwkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApCisJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKKwl9LAorCisJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZm9yY2UsIGV4dHJhICkgeworCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgeworCQkJdmFyIHZhbCwgcHJvcHMgPSB7IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxheToiYmxvY2siIH0sIHdoaWNoID0gbmFtZSA9PSAid2lkdGgiID8gWyAiTGVmdCIsICJSaWdodCIgXSA6IFsgIlRvcCIsICJCb3R0b20iIF07CisKKwkJCWZ1bmN0aW9uIGdldFdIKCkgeworCQkJCXZhbCA9IG5hbWUgPT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodDsKKworCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKKwkJCQkJcmV0dXJuOworCisJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCAhZXh0cmEgKQorCQkJCQkJdmFsIC09IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgInBhZGRpbmciICsgdGhpcywgdHJ1ZSkpIHx8IDA7CisJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKKwkJCQkJCXZhbCArPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJtYXJnaW4iICsgdGhpcywgdHJ1ZSkpIHx8IDA7CisJCQkJCWVsc2UKKwkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOworCQkJCX0pOworCQkJfQorCisJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKQorCQkJCWdldFdIKCk7CisJCQllbHNlCisJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHByb3BzLCBnZXRXSCApOworCisJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOworCX0sCisKKwljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKKwkJdmFyIHJldCwgc3R5bGUgPSBlbGVtLnN0eWxlOworCisJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQorCQlpZiAoIG5hbWUgPT0gIm9wYWNpdHkiICYmICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICkgeworCQkJcmV0ID0galF1ZXJ5LmF0dHIoIHN0eWxlLCAib3BhY2l0eSIgKTsKKworCQkJcmV0dXJuIHJldCA9PSAiIiA/CisJCQkJIjEiIDoKKwkJCQlyZXQ7CisJCX0KKworCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCisJCWlmICggbmFtZS5tYXRjaCggL2Zsb2F0L2kgKSApCisJCQluYW1lID0gc3R5bGVGbG9hdDsKKworCQlpZiAoICFmb3JjZSAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkKKwkJCXJldCA9IHN0eWxlWyBuYW1lIF07CisKKwkJZWxzZSBpZiAoIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUgKSB7CisKKwkJCS8vIE9ubHkgImZsb2F0IiBpcyBuZWVkZWQgaGVyZQorCQkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJCQluYW1lID0gImZsb2F0IjsKKworCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOworCisJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKKworCQkJaWYgKCBjb21wdXRlZFN0eWxlICkKKwkJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKKworCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKKwkJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKKwkJCQlyZXQgPSAiMSI7CisKKwkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7CisJCQl2YXIgY2FtZWxDYXNlID0gbmFtZS5yZXBsYWNlKC9cLShcdykvZywgZnVuY3Rpb24oYWxsLCBsZXR0ZXIpeworCQkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwkJCX0pOworCisJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdIHx8IGVsZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKKworCQkJLy8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcworCQkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQorCisJCQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIKKwkJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscworCQkJaWYgKCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAmJiAvXlxkLy50ZXN0KCByZXQgKSApIHsKKwkJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCisJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0OworCisJCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAorCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OworCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsKKwkJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOworCisJCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworCQkJCXN0eWxlLmxlZnQgPSBsZWZ0OworCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmNyZWF0ZUVsZW1lbnQgPT09ICJ1bmRlZmluZWQiICkKKwkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CisKKwkJLy8gSWYgYSBzaW5nbGUgc3RyaW5nIGlzIHBhc3NlZCBpbiBhbmQgaXQncyBhIHNpbmdsZSB0YWcKKwkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKKwkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CisJCQl2YXIgbWF0Y2ggPSAvXjwoXHcrKVxzKlwvPz4kLy5leGVjKGVsZW1zWzBdKTsKKwkJCWlmICggbWF0Y2ggKQorCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOworCQl9CisKKwkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisKKwkJalF1ZXJ5LmVhY2goZWxlbXMsIGZ1bmN0aW9uKGksIGVsZW0peworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQorCQkJCWVsZW0gKz0gJyc7CisKKwkJCWlmICggIWVsZW0gKQorCQkJCXJldHVybjsKKworCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisJCQkJLy8gRml4ICJYSFRNTCItc3R5bGUgdGFncyBpbiBhbGwgYnJvd3NlcnMKKwkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpeworCQkJCQlyZXR1cm4gdGFnLm1hdGNoKC9eKGFiYnJ8YnJ8Y29sfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW18aHJ8YXJlYXxlbWJlZCkkL2kpID8KKwkJCQkJCWFsbCA6CisJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOworCQkJCX0pOworCisJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCisJCQkJdmFyIHRhZ3MgPSBlbGVtLnJlcGxhY2UoL15ccysvLCAiIikuc3Vic3RyaW5nKDAsIDEwKS50b0xvd2VyQ2FzZSgpOworCisJCQkJdmFyIHdyYXAgPQorCQkJCQkvLyBvcHRpb24gb3Igb3B0Z3JvdXAKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPG9wdCIpICYmCisJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CisKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPGxlZyIpICYmCisJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKKworCQkJCQl0YWdzLm1hdGNoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdHxjb2xnfGNhcCkvKSAmJgorCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CisKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPHRyIikgJiYKKwkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAorCisJCQkJIAkvLyA8dGhlYWQ+IG1hdGNoZWQgYWJvdmUKKwkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgorCQkJCQlbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdIHx8CisKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCisJCQkJCVsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0gfHwKKworCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CisJCQkJCSFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplICYmCisJCQkJCVsgMSwgImRpdjxkaXY+IiwgIjwvZGl2PiIgXSB8fAorCisJCQkJCVsgMCwgIiIsICIiIF07CisKKwkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCisJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKKworCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCisJCQkJd2hpbGUgKCB3cmFwWzBdLS0gKQorCQkJCQlkaXYgPSBkaXYubGFzdENoaWxkOworCisJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKKwkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsKKworCQkJCQkvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+CisJCQkJCXZhciBoYXNCb2R5ID0gLzx0Ym9keS9pLnRlc3QoZWxlbSksCisJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KKwkJCQkJCQlkaXYuZmlyc3RDaGlsZCAmJiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoKKworCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CisJCQkJCQl3cmFwWzFdID09ICI8dGFibGU+IiAmJiAhaGFzQm9keSA/CisJCQkJCQkJZGl2LmNoaWxkTm9kZXMgOgorCQkJCQkJCVtdOworCisJCQkJCWZvciAoIHZhciBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkKKwkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQorCQkJCQkJCXRib2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGJvZHlbIGogXSApOworCisJCQkJCX0KKworCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKKwkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQorCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtLm1hdGNoKC9eXHMqLylbMF0gKSwgZGl2LmZpcnN0Q2hpbGQgKTsKKwkJCQkKKwkJCQllbGVtID0galF1ZXJ5Lm1ha2VBcnJheSggZGl2LmNoaWxkTm9kZXMgKTsKKwkJCX0KKworCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkKKwkJCQlyZXQucHVzaCggZWxlbSApOworCQkJZWxzZQorCQkJCXJldCA9IGpRdWVyeS5tZXJnZSggcmV0LCBlbGVtICk7CisKKwkJfSk7CisKKwkJaWYgKCBmcmFnbWVudCApIHsKKwkJCWZvciAoIHZhciBpID0gMDsgcmV0W2ldOyBpKysgKSB7CisJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHJldFtpXSwgInNjcmlwdCIgKSAmJiAoIXJldFtpXS50eXBlIHx8IHJldFtpXS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKSApIHsKKwkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJldFtpXSApOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICggcmV0W2ldLm5vZGVUeXBlID09PSAxICkKKwkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoalF1ZXJ5Lm1ha2VBcnJheShyZXRbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkgKTsKKwkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcmV0dXJuIHNjcmlwdHM7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCS8vIGRvbid0IHNldCBhdHRyaWJ1dGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDgpCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCisJCXZhciBub3R4bWwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICksCisJCQkvLyBXaGV0aGVyIHdlIGFyZSBzZXR0aW5nIChvciBnZXR0aW5nKQorCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKKworCQkvLyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQorCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5wcm9wc1sgbmFtZSBdIHx8IG5hbWU7CisKKwkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBpZiB0aGlzIGlzIGEgbm9kZSAoZmFzdGVyIGZvciBzdHlsZSkKKwkJLy8gSUUgZWxlbS5nZXRBdHRyaWJ1dGUgcGFzc2VzIGV2ZW4gZm9yIHN0eWxlCisJCWlmICggZWxlbS50YWdOYW1lICkgeworCisJCQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKKwkJCXZhciBzcGVjaWFsID0gL2hyZWZ8c3JjfHN0eWxlLy50ZXN0KCBuYW1lICk7CisKKwkJCS8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBvcHRpb24KKwkJCS8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAorCQkJaWYgKCBuYW1lID09ICJzZWxlY3RlZCIgJiYgZWxlbS5wYXJlbnROb2RlICkKKwkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKworCQkJLy8gSWYgYXBwbGljYWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKKwkJCWlmICggbmFtZSBpbiBlbGVtICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKKwkJCQlpZiAoIHNldCApeworCQkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCisJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgJiYgZWxlbS5wYXJlbnROb2RlICkKKwkJCQkJCXRocm93ICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiOworCisJCQkJCWVsZW1bIG5hbWUgXSA9IHZhbHVlOworCQkJCX0KKworCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRzIGJ5IGlkL25hbWUgb24gZm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KKwkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiZm9ybSIgKSAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkgKQorCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOworCisJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAorCQkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCisJCQkJaWYgKCBuYW1lID09ICJ0YWJJbmRleCIgKSB7CisJCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCAidGFiSW5kZXgiICk7CisJCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkCisJCQkJCQk/IGF0dHJpYnV0ZU5vZGUudmFsdWUKKwkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvKGJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKS9pKQorCQkJCQkJCT8gMAorCQkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihhfGFyZWEpJC9pKSAmJiBlbGVtLmhyZWYKKwkJCQkJCQkJPyAwCisJCQkJCQkJCTogdW5kZWZpbmVkOworCQkJCX0KKworCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CisJCQl9CisKKwkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKKwkJCQlyZXR1cm4galF1ZXJ5LmF0dHIoIGVsZW0uc3R5bGUsICJjc3NUZXh0IiwgdmFsdWUgKTsKKworCQkJaWYgKCBzZXQgKQorCQkJCS8vIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgc3RyaW5nIChhbGwgYnJvd3NlcnMgZG8gdGhpcyBidXQgSUUpIHNlZSAjMTA3MAorCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiIiArIHZhbHVlICk7CisKKwkJCXZhciBhdHRyID0gIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICYmIG5vdHhtbCAmJiBzcGVjaWFsCisJCQkJCS8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCisJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQorCQkJCQk6IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisJCQlyZXR1cm4gYXR0ciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGF0dHI7CisJCX0KKworCQkvLyBlbGVtIGlzIGFjdHVhbGx5IGVsZW0uc3R5bGUgLi4uIHNldCB0aGUgc3R5bGUKKworCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKKwkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09ICJvcGFjaXR5IiApIHsKKwkJCWlmICggc2V0ICkgeworCQkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAorCQkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKKwkJCQllbGVtLnpvb20gPSAxOworCisJCQkJLy8gU2V0IHRoZSBhbHBoYSBmaWx0ZXIgdG8gc2V0IHRoZSBvcGFjaXR5CisJCQkJZWxlbS5maWx0ZXIgPSAoZWxlbS5maWx0ZXIgfHwgIiIpLnJlcGxhY2UoIC9hbHBoYVwoW14pXSpcKS8sICIiICkgKworCQkJCQkocGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiKTsKKwkJCX0KKworCQkJcmV0dXJuIGVsZW0uZmlsdGVyICYmIGVsZW0uZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CisJCQkJKHBhcnNlRmxvYXQoIGVsZW0uZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAwKSArICcnOgorCQkJCSIiOworCQl9CisKKwkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16XSkvaWcsIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKKwkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwkJfSk7CisKKwkJaWYgKCBzZXQgKQorCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisKKwkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKKwl9LAorCisJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CisJCXJldHVybiAodGV4dCB8fCAiIikucmVwbGFjZSggL15ccyt8XHMrJC9nLCAiIiApOworCX0sCisKKwltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSApIHsKKwkJdmFyIHJldCA9IFtdOworCisJCWlmKCBhcnJheSAhPSBudWxsICl7CisJCQl2YXIgaSA9IGFycmF5Lmxlbmd0aDsKKwkJCS8vIFRoZSB3aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJworCQkJaWYoIGkgPT0gbnVsbCB8fCB0eXBlb2YgYXJyYXkgPT09ICJzdHJpbmciIHx8IGpRdWVyeS5pc0Z1bmN0aW9uKGFycmF5KSB8fCBhcnJheS5zZXRJbnRlcnZhbCApCisJCQkJcmV0WzBdID0gYXJyYXk7CisJCQllbHNlCisJCQkJd2hpbGUoIGkgKQorCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFycmF5ICkgeworCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJLy8gVXNlID09PSBiZWNhdXNlIG9uIElFLCB3aW5kb3cgPT0gZG9jdW1lbnQKKwkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApCisJCQkJcmV0dXJuIGk7CisKKwkJcmV0dXJuIC0xOworCX0sCisKKwltZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7CisJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKKwkJLy8gZXhwYW5kbyBvZiBnZXRFbGVtZW50c0J5VGFnTmFtZQorCQl2YXIgaSA9IDAsIGVsZW0sIHBvcyA9IGZpcnN0Lmxlbmd0aDsKKwkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ycmVjdCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKKwkJLy8gKElFIHJldHVybnMgY29tbWVudCBub2RlcyBpbiBhICcqJyBxdWVyeSkKKwkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZ2V0QWxsICkgeworCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51bGwgKQorCQkJCWlmICggZWxlbS5ub2RlVHlwZSAhPSA4ICkKKwkJCQkJZmlyc3RbIHBvcysrIF0gPSBlbGVtOworCisJCX0gZWxzZQorCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51bGwgKQorCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKKworCQlyZXR1cm4gZmlyc3Q7CisJfSwKKworCXVuaXF1ZTogZnVuY3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fTsKKworCQl0cnkgeworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCXZhciBpZCA9IGpRdWVyeS5kYXRhKCBhcnJheVsgaSBdICk7CisKKwkJCQlpZiAoICFkb25lWyBpZCBdICkgeworCQkJCQlkb25lWyBpZCBdID0gdHJ1ZTsKKwkJCQkJcmV0LnB1c2goIGFycmF5WyBpIF0gKTsKKwkJCQl9CisJCQl9CisKKwkJfSBjYXRjaCggZSApIHsKKwkJCXJldCA9IGFycmF5OworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworCQl2YXIgcmV0ID0gW107CisKKwkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcworCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgorCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJCWlmICggIWludiAhPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKSApCisJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKKworCQlyZXR1cm4gcmV0OworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2sgKSB7CisJCXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKwkJLy8gbmV3IHZhbHVlIChvciB2YWx1ZXMpLgorCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJdmFyIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKKworCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkKKwkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOworCQl9CisKKwkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9Cit9KTsKKworLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQuCisvLyBJdCdzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgcGx1Z2lucywKKy8vIGFsdGhvdWdoIHRoZXkgc2hvdWxkIHdvcmsgdG8gbWlncmF0ZSBhd2F5LgorCit2YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOworCisvLyBGaWd1cmUgb3V0IHdoYXQgYnJvd3NlciBpcyBiZWluZyB1c2VkCitqUXVlcnkuYnJvd3NlciA9IHsKKwl2ZXJzaW9uOiAodXNlckFnZW50Lm1hdGNoKCAvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8gKSB8fCBbMCwnMCddKVsxXSwKKwlzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAorCW9wZXJhOiAvb3BlcmEvLnRlc3QoIHVzZXJBZ2VudCApLAorCW1zaWU6IC9tc2llLy50ZXN0KCB1c2VyQWdlbnQgKSAmJiAhL29wZXJhLy50ZXN0KCB1c2VyQWdlbnQgKSwKKwltb3ppbGxhOiAvbW96aWxsYS8udGVzdCggdXNlckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQorfTsKKworalF1ZXJ5LmVhY2goeworCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0ucGFyZW50Tm9kZTt9LAorCXBhcmVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVsZW0sInBhcmVudE5vZGUiKTt9LAorCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAorCXByZXY6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwicHJldmlvdXNTaWJsaW5nIik7fSwKKwluZXh0QWxsOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJuZXh0U2libGluZyIpO30sCisJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKKwlzaWJsaW5nczogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0ucGFyZW50Tm9kZS5maXJzdENoaWxkLGVsZW0pO30sCisJY2hpbGRyZW46IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuc2libGluZyhlbGVtLmZpcnN0Q2hpbGQpO30sCisJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQorfSwgZnVuY3Rpb24obmFtZSwgZm4peworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKKworCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PSAic3RyaW5nIiApCisJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoIHJldCApLCBuYW1lLCBzZWxlY3RvciApOworCX07Cit9KTsKKworalF1ZXJ5LmVhY2goeworCWFwcGVuZFRvOiAiYXBwZW5kIiwKKwlwcmVwZW5kVG86ICJwcmVwZW5kIiwKKwlpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAorCWluc2VydEFmdGVyOiAiYWZ0ZXIiLAorCXJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIHJldCA9IFtdLCBpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICk7CisKKwkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKKwkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CisJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOworCQl9CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIHNlbGVjdG9yICk7CisJfTsKK30pOworCitqUXVlcnkuZWFjaCh7CisJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CisJCWpRdWVyeS5hdHRyKCB0aGlzLCBuYW1lLCAiIiApOworCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKKwl9LAorCisJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgeworCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1lcyApOworCX0sCisKKwlyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVyeS5jbGFzc05hbWUucmVtb3ZlKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcywgc3RhdGUgKSB7CisJCWlmKCB0eXBlb2Ygc3RhdGUgIT09ICJib29sZWFuIiApCisJCQlzdGF0ZSA9ICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggdGhpcywgY2xhc3NOYW1lcyApOworCQlqUXVlcnkuY2xhc3NOYW1lWyBzdGF0ZSA/ICJhZGQiIDogInJlbW92ZSIgXSggdGhpcywgY2xhc3NOYW1lcyApOworCX0sCisKKwlyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhpcyBdICkubGVuZ3RoICkgeworCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKKwkJCWpRdWVyeSggIioiLCB0aGlzICkuYWRkKFt0aGlzXSkuZWFjaChmdW5jdGlvbigpeworCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUodGhpcyk7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEodGhpcyk7CisJCQl9KTsKKwkJCWlmICh0aGlzLnBhcmVudE5vZGUpCisJCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzICk7CisJCX0KKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKwkJalF1ZXJ5KHRoaXMpLmNoaWxkcmVuKCkucmVtb3ZlKCk7CisKKwkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKKwkJd2hpbGUgKCB0aGlzLmZpcnN0Q2hpbGQgKQorCQkJdGhpcy5yZW1vdmVDaGlsZCggdGhpcy5maXJzdENoaWxkICk7CisJfQorfSwgZnVuY3Rpb24obmFtZSwgZm4peworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50cyApOworCX07Cit9KTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRpbWVuc2lvbnMgYW5kIG9mZnNldCBtb2R1bGVzCitmdW5jdGlvbiBudW0oZWxlbSwgcHJvcCkgeworCXJldHVybiBlbGVtWzBdICYmIHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUpLCAxMCApIHx8IDA7Cit9Cit2YXIgZXhwYW5kbyA9ICJqUXVlcnkiICsgbm93KCksIHV1aWQgPSAwLCB3aW5kb3dEYXRhID0ge307DQorDQoralF1ZXJ5LmV4dGVuZCh7DQorCWNhY2hlOiB7fSwNCisNCisJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7DQorCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPw0KKwkJCXdpbmRvd0RhdGEgOg0KKwkJCWVsZW07DQorDQorCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRvIF07DQorDQorCQkvLyBDb21wdXRlIGEgdW5pcXVlIElEIGZvciB0aGUgZWxlbWVudA0KKwkJaWYgKCAhaWQgKQ0KKwkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOw0KKw0KKwkJLy8gT25seSBnZW5lcmF0ZSB0aGUgZGF0YSBjYWNoZSBpZiB3ZSdyZQ0KKwkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0DQorCQlpZiAoIG5hbWUgJiYgIWpRdWVyeS5jYWNoZVsgaWQgXSApDQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBdID0ge307DQorDQorCQkvLyBQcmV2ZW50IG92ZXJyaWRpbmcgdGhlIG5hbWVkIGNhY2hlIHdpdGggdW5kZWZpbmVkIHZhbHVlcw0KKwkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKQ0KKwkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsNCisNCisJCS8vIFJldHVybiB0aGUgbmFtZWQgY2FjaGUgZGF0YSwgb3IgdGhlIElEIGZvciB0aGUgZWxlbWVudA0KKwkJcmV0dXJuIG5hbWUgPw0KKwkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdIDoNCisJCQlpZDsNCisJfSwNCisNCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7DQorCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPw0KKwkJCXdpbmRvd0RhdGEgOg0KKwkJCWVsZW07DQorDQorCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRvIF07DQorDQorCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhDQorCQlpZiAoIG5hbWUgKSB7DQorCQkJaWYgKCBqUXVlcnkuY2FjaGVbIGlkIF0gKSB7DQorCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhDQorCQkJCWRlbGV0ZSBqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXTsNCisNCisJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlDQorCQkJCW5hbWUgPSAiIjsNCisNCisJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQ0KKwkJCQkJYnJlYWs7DQorDQorCQkJCWlmICggIW5hbWUgKQ0KKwkJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0gKTsNCisJCQl9DQorDQorCQkvLyBPdGhlcndpc2UsIHdlIHdhbnQgdG8gcmVtb3ZlIGFsbCBvZiB0aGUgZWxlbWVudCdzIGRhdGENCisJCX0gZWxzZSB7DQorCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbw0KKwkJCXRyeSB7DQorCQkJCWRlbGV0ZSBlbGVtWyBleHBhbmRvIF07DQorCQkJfSBjYXRjaChlKXsNCisJCQkJLy8gSUUgaGFzIHRyb3VibGUgZGlyZWN0bHkgcmVtb3ZpbmcgdGhlIGV4cGFuZG8NCisJCQkJLy8gYnV0IGl0J3Mgb2sgd2l0aCB1c2luZyByZW1vdmVBdHRyaWJ1dGUNCisJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApDQorCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggZXhwYW5kbyApOw0KKwkJCX0NCisNCisJCQkvLyBDb21wbGV0ZWx5IHJlbW92ZSB0aGUgZGF0YSBjYWNoZQ0KKwkJCWRlbGV0ZSBqUXVlcnkuY2FjaGVbIGlkIF07DQorCQl9DQorCX0sDQorCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsNCisJCWlmICggZWxlbSApew0KKwkNCisJCQl0eXBlID0gKHR5cGUgfHwgImZ4IikgKyAicXVldWUiOw0KKwkNCisJCQl2YXIgcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlICk7DQorCQ0KKwkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQ0KKwkJCQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsNCisJCQllbHNlIGlmKCBkYXRhICkNCisJCQkJcS5wdXNoKCBkYXRhICk7DQorCQ0KKwkJfQ0KKwkJcmV0dXJuIHE7DQorCX0sDQorDQorCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICl7DQorCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwNCisJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7DQorCQkNCisJCWlmKCAhdHlwZSB8fCB0eXBlID09PSAiZngiICkNCisJCQlmbiA9IHF1ZXVlWzBdOw0KKwkJCQ0KKwkJaWYoIGZuICE9PSB1bmRlZmluZWQgKQ0KKwkJCWZuLmNhbGwoZWxlbSk7DQorCX0NCit9KTsNCisNCitqUXVlcnkuZm4uZXh0ZW5kKHsNCisJZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKXsNCisJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOw0KKwkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7DQorDQorCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7DQorCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsNCisNCisJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApDQorCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7DQorDQorCQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBwYXJ0c1sxXSA/DQorCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6DQorCQkJCWRhdGE7DQorCQl9IGVsc2UNCisJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpew0KKwkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOw0KKwkJCX0pOw0KKwl9LA0KKw0KKwlyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICl7DQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJalF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMsIGtleSApOw0KKwkJfSk7DQorCX0sDQorCXF1ZXVlOiBmdW5jdGlvbih0eXBlLCBkYXRhKXsNCisJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgew0KKwkJCWRhdGEgPSB0eXBlOw0KKwkJCXR5cGUgPSAiZngiOw0KKwkJfQ0KKw0KKwkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgKQ0KKwkJCXJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTsNCisNCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsNCisJCQkNCisJCQkgaWYoIHR5cGUgPT0gImZ4IiAmJiBxdWV1ZS5sZW5ndGggPT0gMSApDQorCQkJCXF1ZXVlWzBdLmNhbGwodGhpcyk7DQorCQl9KTsNCisJfSwNCisJZGVxdWV1ZTogZnVuY3Rpb24odHlwZSl7DQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsNCisJCX0pOw0KKwl9DQorfSk7LyohCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYwLjkuMworICogIENvcHlyaWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisgKiAgUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgorICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCisgKi8KKyhmdW5jdGlvbigpeworCit2YXIgY2h1bmtlciA9IC8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8vZywKKwlkb25lID0gMCwKKwl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKK3ZhciBTaXp6bGUgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCkgeworCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOworCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCisJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKQorCQlyZXR1cm4gW107CisJCisJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJdmFyIHBhcnRzID0gW10sIG0sIHNldCwgY2hlY2tTZXQsIGNoZWNrLCBtb2RlLCBleHRyYSwgcHJ1bmUgPSB0cnVlOworCQorCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20gaGVhZCkKKwljaHVua2VyLmxhc3RJbmRleCA9IDA7CisJCisJd2hpbGUgKCAobSA9IGNodW5rZXIuZXhlYyhzZWxlY3RvcikpICE9PSBudWxsICkgeworCQlwYXJ0cy5wdXNoKCBtWzFdICk7CisJCQorCQlpZiAoIG1bMl0gKSB7CisJCQlleHRyYSA9IFJlZ0V4cC5yaWdodENvbnRleHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7CisJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gKSB7CisJCQlzZXQgPSBwb3NQcm9jZXNzKCBwYXJ0c1swXSArIHBhcnRzWzFdLCBjb250ZXh0ICk7CisJCX0gZWxzZSB7CisJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KKwkJCQlbIGNvbnRleHQgXSA6CisJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7CisKKwkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsKKworCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApCisJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CisKKwkJCQlzZXQgPSBwb3NQcm9jZXNzKCBzZWxlY3Rvciwgc2V0ICk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl2YXIgcmV0ID0gc2VlZCA/CisJCQl7IGV4cHI6IHBhcnRzLnBvcCgpLCBzZXQ6IG1ha2VBcnJheShzZWVkKSB9IDoKKwkJCVNpenpsZS5maW5kKCBwYXJ0cy5wb3AoKSwgcGFydHMubGVuZ3RoID09PSAxICYmIGNvbnRleHQucGFyZW50Tm9kZSA/IGNvbnRleHQucGFyZW50Tm9kZSA6IGNvbnRleHQsIGlzWE1MKGNvbnRleHQpICk7CisJCXNldCA9IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICk7CisKKwkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgeworCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKKwkJfSBlbHNlIHsKKwkJCXBydW5lID0gZmFsc2U7CisJCX0KKworCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsKKwkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOworCisJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKKwkJCQljdXIgPSAiIjsKKwkJCX0gZWxzZSB7CisJCQkJcG9wID0gcGFydHMucG9wKCk7CisJCQl9CisKKwkJCWlmICggcG9wID09IG51bGwgKSB7CisJCQkJcG9wID0gY29udGV4dDsKKwkJCX0KKworCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3AsIGlzWE1MKGNvbnRleHQpICk7CisJCX0KKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJY2hlY2tTZXQgPSBzZXQ7CisJfQorCisJaWYgKCAhY2hlY2tTZXQgKSB7CisJCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgKGN1ciB8fCBzZWxlY3Rvcik7CisJfQorCisJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKKwkJaWYgKCAhcHJ1bmUgKSB7CisJCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGNoZWNrU2V0ICk7CisJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CisJCQlmb3IgKCB2YXIgaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIChjaGVja1NldFtpXSA9PT0gdHJ1ZSB8fCBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSAmJiBjb250YWlucyhjb250ZXh0LCBjaGVja1NldFtpXSkpICkgeworCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOworCX0KKworCWlmICggZXh0cmEgKSB7CisJCVNpenpsZSggZXh0cmEsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKKworCQlpZiAoIHNvcnRPcmRlciApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IGZhbHNlOworCQkJcmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7CisKKwkJCWlmICggaGFzRHVwbGljYXRlICkgeworCQkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1tpLTFdICkgeworCQkJCQkJcmVzdWx0cy5zcGxpY2UoaS0tLCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXN1bHRzOworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpeworCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgc2V0KTsKK307CisKK1NpenpsZS5maW5kID0gZnVuY3Rpb24oZXhwciwgY29udGV4dCwgaXNYTUwpeworCXZhciBzZXQsIG1hdGNoOworCisJaWYgKCAhZXhwciApIHsKKwkJcmV0dXJuIFtdOworCX0KKworCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIgdHlwZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOworCQkKKwkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKKwkJCXZhciBsZWZ0ID0gUmVnRXhwLmxlZnRDb250ZXh0OworCisJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiApIHsKKwkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOworCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKKwkJCQlpZiAoIHNldCAhPSBudWxsICkgeworCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICggIXNldCApIHsKKwkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworCX0KKworCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9OworfTsKKworU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsKKwl2YXIgb2xkID0gZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKKwkJaXNYTUxGaWx0ZXIgPSBzZXQgJiYgc2V0WzBdICYmIGlzWE1MKHNldFswXSk7CisKKwl3aGlsZSAoIGV4cHIgJiYgc2V0Lmxlbmd0aCApIHsKKwkJZm9yICggdmFyIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7CisJCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgKSB7CisJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtOworCQkJCWFueUZvdW5kID0gZmFsc2U7CisKKwkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkgeworCQkJCQlyZXN1bHQgPSBbXTsKKwkJCQl9CisKKwkJCQlpZiAoIEV4cHIucHJlRmlsdGVyWyB0eXBlIF0gKSB7CisJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOworCisJCQkJCWlmICggIW1hdGNoICkgeworCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CisJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIG1hdGNoICkgeworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCQkJaWYgKCBpdGVtICkgeworCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOworCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKKworCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgeworCQkJCQkJCQlpZiAoIHBhc3MgKSB7CisJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgeworCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOworCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgeworCQkJCQlpZiAoICFpbnBsYWNlICkgeworCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKKworCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKKwkJCQkJCXJldHVybiBbXTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KKwkJaWYgKCBleHByID09IG9sZCApIHsKKwkJCWlmICggYW55Rm91bmQgPT0gbnVsbCApIHsKKwkJCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGV4cHI7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJb2xkID0gZXhwcjsKKwl9CisKKwlyZXR1cm4gY3VyTG9vcDsKK307CisKK3ZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKwlvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCisJbWF0Y2g6IHsKKwkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKKwkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCisJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylbJyJdKlxdLywKKwkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKKwkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpfLV18XFwuKSspLywKKwkJQ0hJTEQ6IC86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sCisJCVBPUzogLzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLywKKwkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKSg/OlwoKFsnIl0qKSgoPzpcKFteXCldK1wpfFteXDJcKFwpXSopKylcMlwpKT8vCisJfSwKKwlhdHRyTWFwOiB7CisJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCQkiZm9yIjogImh0bWxGb3IiCisJfSwKKwlhdHRySGFuZGxlOiB7CisJCWhyZWY6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7CisJCX0KKwl9LAorCXJlbGF0aXZlOiB7CisJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKKwkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCisJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKKwkJCQlpc1BhcnRTdHJOb3RUYWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOworCisJCQlpZiAoIGlzVGFnICYmICFpc1hNTCApIHsKKwkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CisJCQkJaWYgKCAoZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsKKwkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KKworCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUgPT09IHBhcnQgPworCQkJCQkJZWxlbSB8fCBmYWxzZSA6CisJCQkJCQllbGVtID09PSBwYXJ0OworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7CisJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJCX0KKwkJfSwKKwkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIjsKKworCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKKwkJCQlwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ciA/CisJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKKwkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGlzUGFydFN0ciApIHsKKwkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJCQl9CisJCQl9CisJCX0sCisJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggIXBhcnQubWF0Y2goL1xXLykgKSB7CisJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKKwkJCX0KKworCQkJY2hlY2tGbigicGFyZW50Tm9kZSIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CisJCX0sCisJCSJ+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKKwkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOworCisJCQlpZiAoIHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiAmJiAhcGFydC5tYXRjaCgvXFcvKSApIHsKKwkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKKwkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVja0ZuKCJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOworCQl9CisJfSwKKwlmaW5kOiB7CisJCUlEOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7CisJCQkJcmV0dXJuIG0gPyBbbV0gOiBbXTsKKwkJCX0KKwkJfSwKKwkJTkFNRTogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgeworCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CisJCQkJCQlyZXQucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OworCQkJfQorCQl9LAorCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsKKwkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsKKwkJfQorCX0sCisJcHJlRmlsdGVyOiB7CisJCUNMQVNTOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKKwkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOworCisJCQlpZiAoIGlzWE1MICkgeworCQkJCXJldHVybiBtYXRjaDsKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikuaW5kZXhPZihtYXRjaCkgPj0gMCkgKSB7CisJCQkJCQlpZiAoICFpbnBsYWNlICkKKwkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOworCQkJCQl9IGVsc2UgaWYgKCBpbnBsYWNlICkgeworCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZmFsc2U7CisJCX0sCisJCUlEOiBmdW5jdGlvbihtYXRjaCl7CisJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOworCQl9LAorCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wKXsKKwkJCWZvciAoIHZhciBpID0gMDsgY3VyTG9vcFtpXSA9PT0gZmFsc2U7IGkrKyApe30KKwkJCXJldHVybiBjdXJMb29wW2ldICYmIGlzWE1MKGN1ckxvb3BbaV0pID8gbWF0Y2hbMV0gOiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpOworCQl9LAorCQlDSElMRDogZnVuY3Rpb24obWF0Y2gpeworCQkJaWYgKCBtYXRjaFsxXSA9PSAibnRoIiApIHsKKwkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicKKwkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoCisJCQkJCW1hdGNoWzJdID09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09ICJvZGQiICYmICIybisxIiB8fAorCQkJCQkhL1xELy50ZXN0KCBtYXRjaFsyXSApICYmICIwbisiICsgbWF0Y2hbMl0gfHwgbWF0Y2hbMl0pOworCisJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKKwkJCQltYXRjaFsyXSA9ICh0ZXN0WzFdICsgKHRlc3RbMl0gfHwgMSkpIC0gMDsKKwkJCQltYXRjaFszXSA9IHRlc3RbM10gLSAwOworCQkJfQorCisJCQkvLyBUT0RPOiBNb3ZlIHRvIG5vcm1hbCBjYWNoaW5nIHN5c3RlbQorCQkJbWF0Y2hbMF0gPSBkb25lKys7CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJQVRUUjogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKKwkJCQorCQkJaWYgKCAhaXNYTUwgJiYgRXhwci5hdHRyTWFwW25hbWVdICkgeworCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOworCQkJfQorCisJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworCQkJCW1hdGNoWzRdID0gIiAiICsgbWF0Y2hbNF0gKyAiICI7CisJCQl9CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJUFNFVURPOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QpeworCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CisJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKKwkJCQlpZiAoIG1hdGNoWzNdLm1hdGNoKGNodW5rZXIpLmxlbmd0aCA+IDEgfHwgL15cdy8udGVzdChtYXRjaFszXSkgKSB7CisJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgcmV0ID0gU2l6emxlLmZpbHRlcihtYXRjaFszXSwgY3VyTG9vcCwgaW5wbGFjZSwgdHJ1ZSBeIG5vdCk7CisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQlyZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIGlmICggRXhwci5tYXRjaC5QT1MudGVzdCggbWF0Y2hbMF0gKSB8fCBFeHByLm1hdGNoLkNISUxELnRlc3QoIG1hdGNoWzBdICkgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQkKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJUE9TOiBmdW5jdGlvbihtYXRjaCl7CisJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9LAorCWZpbHRlcnM6IHsKKwkJZW5hYmxlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKKwkJfSwKKwkJZGlzYWJsZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CisJCX0sCisJCWNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAorCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQorCQkJZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJcGFyZW50OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKKwkJfSwKKwkJZW1wdHk6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7CisJCX0sCisJCWhhczogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKKwkJfSwKKwkJaGVhZGVyOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAvaFxkL2kudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9LAorCQl0ZXh0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcmFkaW86IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJyYWRpbyIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJY2hlY2tib3g6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJjaGVja2JveCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJZmlsZTogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gImZpbGUiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXBhc3N3b3JkOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXN1Ym1pdDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJaW1hZ2U6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJpbWFnZSIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcmVzZXQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJyZXNldCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJYnV0dG9uOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkJVVFRPTiI7CisJCX0sCisJCWlucHV0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7CisJCX0KKwl9LAorCXNldEZpbHRlcnM6IHsKKwkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpeworCQkJcmV0dXJuIGkgPT09IDA7CisJCX0sCisJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7CisJCQlyZXR1cm4gaSA9PT0gYXJyYXkubGVuZ3RoIC0gMTsKKwkJfSwKKwkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSAlIDIgPT09IDA7CisJCX0sCisJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSAlIDIgPT09IDE7CisJCX0sCisJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CisJCQlyZXR1cm4gaSA8IG1hdGNoWzNdIC0gMDsKKwkJfSwKKwkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBpID4gbWF0Y2hbM10gLSAwOworCQl9LAorCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT0gaTsKKwkJfSwKKwkJZXE6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT0gaTsKKwkJfQorCX0sCisJZmlsdGVyOiB7CisJCVBTRVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0sIGZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0gZWxzZSBpZiAoIG5hbWUgPT09ICJjb250YWlucyIgKSB7CisJCQkJcmV0dXJuIChlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CisJCQkJdmFyIG5vdCA9IG1hdGNoWzNdOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbm90Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJaWYgKCBub3RbaV0gPT09IGVsZW0gKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSwKKwkJQ0hJTEQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXZhciB0eXBlID0gbWF0Y2hbMV0sIG5vZGUgPSBlbGVtOworCQkJc3dpdGNoICh0eXBlKSB7CisJCQkJY2FzZSAnb25seSc6CisJCQkJY2FzZSAnZmlyc3QnOgorCQkJCQl3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSAgeworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWlmICggdHlwZSA9PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsKKwkJCQkJbm9kZSA9IGVsZW07CisJCQkJY2FzZSAnbGFzdCc6CisJCQkJCXdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykgIHsKKwkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQljYXNlICdudGgnOgorCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwgbGFzdCA9IG1hdGNoWzNdOworCisJCQkJCWlmICggZmlyc3QgPT0gMSAmJiBsYXN0ID09IDAgKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCisJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCisJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CisJCQkJCQl2YXIgY291bnQgPSAwOworCQkJCQkJZm9yICggbm9kZSA9IHBhcmVudC5maXJzdENoaWxkOyBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZyApIHsKKwkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKKwkJCQkJCQl9CisJCQkJCQl9IAorCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OworCQkJCQlpZiAoIGZpcnN0ID09IDAgKSB7CisJCQkJCQlyZXR1cm4gZGlmZiA9PSAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuICggZGlmZiAlIGZpcnN0ID09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsKKwkJCQkJfQorCQkJfQorCQl9LAorCQlJRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IG1hdGNoOworCQl9LAorCQlUQUc6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXJldHVybiAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lID09PSBtYXRjaDsKKwkJfSwKKwkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikKKwkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOworCQl9LAorCQlBVFRSOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAorCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KKwkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6CisJCQkJCWVsZW1bIG5hbWUgXSAhPSBudWxsID8KKwkJCQkJCWVsZW1bIG5hbWUgXSA6CisJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorCQkJCXZhbHVlID0gcmVzdWx0ICsgIiIsCisJCQkJdHlwZSA9IG1hdGNoWzJdLAorCQkJCWNoZWNrID0gbWF0Y2hbNF07CisKKwkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CisJCQkJdHlwZSA9PT0gIiE9IiA6CisJCQkJdHlwZSA9PT0gIj0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgOgorCQkJCXR5cGUgPT09ICIqPSIgPworCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID49IDAgOgorCQkJCXR5cGUgPT09ICJ+PSIgPworCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJIWNoZWNrID8KKwkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKKwkJCQl0eXBlID09PSAiIT0iID8KKwkJCQl2YWx1ZSAhPSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIl49IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgorCQkJCXR5cGUgPT09ICIkPSIgPworCQkJCXZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gInw9IiA/CisJCQkJdmFsdWUgPT09IGNoZWNrIHx8IHZhbHVlLnN1YnN0cigwLCBjaGVjay5sZW5ndGggKyAxKSA9PT0gY2hlY2sgKyAiLSIgOgorCQkJCWZhbHNlOworCQl9LAorCQlQT1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoLCBpLCBhcnJheSl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLCBmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKKworCQkJaWYgKCBmaWx0ZXIgKSB7CisJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CisJCQl9CisJCX0KKwl9Cit9OworCit2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TOworCitmb3IgKCB2YXIgdHlwZSBpbiBFeHByLm1hdGNoICkgeworCUV4cHIubWF0Y2hbIHR5cGUgXSA9IFJlZ0V4cCggRXhwci5tYXRjaFsgdHlwZSBdLnNvdXJjZSArIC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSApOworfQorCit2YXIgbWFrZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsKKwlhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOworCisJaWYgKCByZXN1bHRzICkgeworCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CisJCXJldHVybiByZXN1bHRzOworCX0KKwkKKwlyZXR1cm4gYXJyYXk7Cit9OworCisvLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mCisvLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgordHJ5IHsKKwlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMgKTsKKworLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCit9IGNhdGNoKGUpeworCW1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CisJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOworCisJCWlmICggdG9TdHJpbmcuY2FsbChhcnJheSkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CisJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOworCQl9IGVsc2UgeworCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggdmFyIGkgPSAwOyBhcnJheVtpXTsgaSsrICkgeworCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9CisKK3ZhciBzb3J0T3JkZXI7CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKKwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQl9CisJCXJldHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQl2YXIgcmV0ID0gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CisJCWlmICggcmV0ID09PSAwICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07Cit9IGVsc2UgaWYgKCBkb2N1bWVudC5jcmVhdGVSYW5nZSApIHsKKwlzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJdmFyIGFSYW5nZSA9IGEub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpLCBiUmFuZ2UgPSBiLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKwkJYVJhbmdlLnNlbGVjdE5vZGUoYSk7CisJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJYlJhbmdlLnNlbGVjdE5vZGUoYik7CisJCWJSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOworCQlpZiAoIHJldCA9PT0gMCApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9OworfQorCisvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lIHdoZW4KKy8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCisoZnVuY3Rpb24oKXsKKwkvLyBXZSdyZSBnb2luZyB0byBpbmplY3QgYSBmYWtlIGlucHV0IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCBuYW1lCisJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksCisJCWlkID0gInNjcmlwdCIgKyAobmV3IERhdGUpLmdldFRpbWUoKTsKKwlmb3JtLmlubmVySFRNTCA9ICI8aW5wdXQgbmFtZT0nIiArIGlkICsgIicvPiI7CisKKwkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKKwl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKwlyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxkICk7CisKKwkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAorCS8vIFdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIGZvciBvdGhlciBicm93c2VycyAoaGVuY2UgdGhlIGJyYW5jaGluZykKKwlpZiAoICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7CisJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKKwkJCQlyZXR1cm4gbSA/IG0uaWQgPT09IG1hdGNoWzFdIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWUgPT09IG1hdGNoWzFdID8gW21dIDogdW5kZWZpbmVkIDogW107CisJCQl9CisJCX07CisKKwkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CisJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOworCQl9OworCX0KKworCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKK30pKCk7CisKKyhmdW5jdGlvbigpeworCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIG9ubHkgZWxlbWVudHMKKwkvLyB3aGVuIGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKKworCS8vIENyZWF0ZSBhIGZha2UgZWxlbWVudAorCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CisKKwkvLyBNYWtlIHN1cmUgbm8gY29tbWVudHMgYXJlIGZvdW5kCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGggPiAwICkgeworCQlFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpeworCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCBtYXRjaFsxXSA9PT0gIioiICkgeworCQkJCXZhciB0bXAgPSBbXTsKKworCQkJCWZvciAoIHZhciBpID0gMDsgcmVzdWx0c1tpXTsgaSsrICkgeworCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmVzdWx0cyA9IHRtcDsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdHM7CisJCX07CisJfQorCisJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCisJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKKwlpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCisJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0gIiMiICkgeworCQlFeHByLmF0dHJIYW5kbGUuaHJlZiA9IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIiwgMik7CisJCX07CisJfQorfSkoKTsKKworaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgKGZ1bmN0aW9uKCl7CisJdmFyIG9sZFNpenpsZSA9IFNpenpsZSwgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CisKKwkvLyBTYWZhcmkgY2FuJ3QgaGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgorCS8vIGluIHF1aXJrcyBtb2RlLgorCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwgJiYgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoID09PSAwICkgeworCQlyZXR1cm47CisJfQorCQorCVNpenpsZSA9IGZ1bmN0aW9uKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCl7CisJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCisJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKKwkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKKwkJaWYgKCAhc2VlZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFpc1hNTChjb250ZXh0KSApIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKKwkJCX0gY2F0Y2goZSl7fQorCQl9CisJCQorCQlyZXR1cm4gb2xkU2l6emxlKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCk7CisJfTsKKworCVNpenpsZS5maW5kID0gb2xkU2l6emxlLmZpbmQ7CisJU2l6emxlLmZpbHRlciA9IG9sZFNpenpsZS5maWx0ZXI7CisJU2l6emxlLnNlbGVjdG9ycyA9IG9sZFNpenpsZS5zZWxlY3RvcnM7CisJU2l6emxlLm1hdGNoZXMgPSBvbGRTaXp6bGUubWF0Y2hlczsKK30pKCk7CisKK2lmICggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIChmdW5jdGlvbigpeworCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKKworCS8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApCisJCXJldHVybjsKKworCS8vIFNhZmFyaSBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCisJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CisKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkKKwkJcmV0dXJuOworCisJRXhwci5vcmRlci5zcGxpY2UoMSwgMCwgIkNMQVNTIik7CisJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKSB7CisJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CisJCX0KKwl9OworfSkoKTsKKworZnVuY3Rpb24gZGlyTm9kZUNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgeworCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKwkJaWYgKCBlbGVtICkgeworCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApeworCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQllbGVtLnNpenNldCA9IGk7CisJCQl9CisJCQllbGVtID0gZWxlbVtkaXJdOworCQkJdmFyIG1hdGNoID0gZmFsc2U7CisKKwkJCXdoaWxlICggZWxlbSApIHsKKwkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgeworCQkJCQltYXRjaCA9IGNoZWNrU2V0W2VsZW0uc2l6c2V0XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFpc1hNTCApeworCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZU5hbWUgPT09IGN1ciApIHsKKwkJCQkJbWF0Y2ggPSBlbGVtOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQllbGVtID0gZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQorfQorCitmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKKwl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCWlmICggZWxlbSApIHsKKwkJCWlmICggc2liRGlyICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCWlmICggIWlzWE1MICkgeworCQkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCQl9CisJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CisJCQkJCQlpZiAoIGVsZW0gPT09IGN1ciApIHsKKwkJCQkJCQltYXRjaCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgeworCQkJCQkJbWF0Y2ggPSBlbGVtOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQllbGVtID0gZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQorfQorCit2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKKwlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2OworfSA6IGZ1bmN0aW9uKGEsIGIpeworCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOworfTsKKwordmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiB8fAorCQkhIWVsZW0ub3duZXJEb2N1bWVudCAmJiBpc1hNTCggZWxlbS5vd25lckRvY3VtZW50ICk7Cit9OworCit2YXIgcG9zUHJvY2VzcyA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0KXsKKwl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAorCQlyb290ID0gY29udGV4dC5ub2RlVHlwZSA/IFtjb250ZXh0XSA6IGNvbnRleHQ7CisKKwkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKKwkvLyBBbmQgc28gbXVzdCA6bm90KHBvc2l0aW9uYWwpIHNvIHdlIG1vdmUgYWxsIFBTRVVET3MgdG8gdGhlIGVuZAorCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CisJCWxhdGVyICs9IG1hdGNoWzBdOworCQlzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoIEV4cHIubWF0Y2guUFNFVURPLCAiIiApOworCX0KKworCXNlbGVjdG9yID0gRXhwci5yZWxhdGl2ZVtzZWxlY3Rvcl0gPyBzZWxlY3RvciArICIqIiA6IHNlbGVjdG9yOworCisJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCVNpenpsZSggc2VsZWN0b3IsIHJvb3RbaV0sIHRtcFNldCApOworCX0KKworCXJldHVybiBTaXp6bGUuZmlsdGVyKCBsYXRlciwgdG1wU2V0ICk7Cit9OworCisvLyBFWFBPU0UKK2pRdWVyeS5maW5kID0gU2l6emxlOworalF1ZXJ5LmZpbHRlciA9IFNpenpsZS5maWx0ZXI7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKKworU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKGVsZW0peworCXJldHVybiBlbGVtLm9mZnNldFdpZHRoID09PSAwIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0ID09PSAwOworfTsKKworU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwOworfTsKKworU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKGZuKXsKKwkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07CisJfSkubGVuZ3RoOworfTsKKworalF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CisJaWYgKCBub3QgKSB7CisJCWV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKKwl9CisKKwlyZXR1cm4gU2l6emxlLm1hdGNoZXMoZXhwciwgZWxlbXMpOworfTsKKworalF1ZXJ5LmRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIgKXsKKwl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07CisJd2hpbGUgKCBjdXIgJiYgY3VyICE9IGRvY3VtZW50ICkgeworCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICkKKwkJCW1hdGNoZWQucHVzaCggY3VyICk7CisJCWN1ciA9IGN1cltkaXJdOworCX0KKwlyZXR1cm4gbWF0Y2hlZDsKK307CisKK2pRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKKwlyZXN1bHQgPSByZXN1bHQgfHwgMTsKKwl2YXIgbnVtID0gMDsKKworCWZvciAoIDsgY3VyOyBjdXIgPSBjdXJbZGlyXSApCisJCWlmICggY3VyLm5vZGVUeXBlID09IDEgJiYgKytudW0gPT0gcmVzdWx0ICkKKwkJCWJyZWFrOworCisJcmV0dXJuIGN1cjsKK307CisKK2pRdWVyeS5zaWJsaW5nID0gZnVuY3Rpb24obiwgZWxlbSl7CisJdmFyIHIgPSBbXTsKKworCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CisJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCisJCQlyLnB1c2goIG4gKTsKKwl9CisKKwlyZXR1cm4gcjsKK307CisKK3JldHVybjsKKword2luZG93LlNpenpsZSA9IFNpenpsZTsKKworfSkoKTsKKy8qCisgKiBBIG51bWJlciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2ZW50cy4KKyAqIE1hbnkgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGlzIGNvZGUgb3JpZ2luYXRlZCBmcm9tCisgKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCisgKi8KK2pRdWVyeS5ldmVudCA9IHsKKworCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAorCS8vIE9yaWdpbmFsIGJ5IERlYW4gRWR3YXJkcworCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEpIHsKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCXJldHVybjsKKworCQkvLyBGb3Igd2hhdGV2ZXIgcmVhc29uLCBJRSBoYXMgdHJvdWJsZSBwYXNzaW5nIHRoZSB3aW5kb3cgb2JqZWN0CisJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9uZWQgaW4gdGhlIHByb2Nlc3MKKwkJaWYgKCBlbGVtLnNldEludGVydmFsICYmIGVsZW0gIT0gd2luZG93ICkKKwkJCWVsZW0gPSB3aW5kb3c7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAorCQlpZiAoICFoYW5kbGVyLmd1aWQgKQorCQkJaGFuZGxlci5ndWlkID0gdGhpcy5ndWlkKys7CisKKwkJLy8gaWYgZGF0YSBpcyBwYXNzZWQsIGJpbmQgdG8gaGFuZGxlcgorCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKKwkJCS8vIENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5kbGVyCisJCQl2YXIgZm4gPSBoYW5kbGVyOworCisJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIgZnVuY3Rpb24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKKwkJCWhhbmRsZXIgPSB0aGlzLnByb3h5KCBmbiApOworCisJCQkvLyBTdG9yZSBkYXRhIGluIHVuaXF1ZSBoYW5kbGVyCisJCQloYW5kbGVyLmRhdGEgPSBkYXRhOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZQorCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpIHx8IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiLCB7fSksCisJCQloYW5kbGUgPSBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCl7CisJCQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCisJCQkJLy8gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKKwkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPworCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUuZWxlbSwgYXJndW1lbnRzKSA6CisJCQkJCXVuZGVmaW5lZDsKKwkJCX0pOworCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KKwkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlCisJCS8vIGV2ZW50IGluIElFLgorCQloYW5kbGUuZWxlbSA9IGVsZW07CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CisJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpIHsKKwkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCXZhciBuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOworCisJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVudAorCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOworCQkJCisJCQlpZiAoIGpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdICkKKwkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpOworCisJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCisJCQlpZiAoIWhhbmRsZXJzKSB7CisJCQkJaGFuZGxlcnMgPSBldmVudHNbdHlwZV0gPSB7fTsKKworCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgorCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKKwkJCQkvLyBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0uc2V0dXAuY2FsbChlbGVtLCBkYXRhLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CisJCQkJCS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CisJCQkJCWlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpCisJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlLCBmYWxzZSk7CisJCQkJCWVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpCisJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBoYW5kbGUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAorCQkJaGFuZGxlcnNbaGFuZGxlci5ndWlkXSA9IGhhbmRsZXI7CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKKwkJCWpRdWVyeS5ldmVudC5nbG9iYWxbdHlwZV0gPSB0cnVlOworCQl9KTsKKworCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKworCWd1aWQ6IDEsCisJZ2xvYmFsOiB7fSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIpIHsKKwkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCXJldHVybjsKKworCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpLCByZXQsIGluZGV4OworCisJCWlmICggZXZlbnRzICkgeworCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CisJCQlpZiAoIHR5cGVzID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBlcyA9PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09ICIuIikgKQorCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApCisJCQkJCXRoaXMucmVtb3ZlKCBlbGVtLCB0eXBlICsgKHR5cGVzIHx8ICIiKSApOworCQkJZWxzZSB7CisJCQkJLy8gdHlwZXMgaXMgYWN0dWFsbHkgYW4gZXZlbnQgb2JqZWN0IGhlcmUKKwkJCQlpZiAoIHR5cGVzLnR5cGUgKSB7CisJCQkJCWhhbmRsZXIgPSB0eXBlcy5oYW5kbGVyOworCQkJCQl0eXBlcyA9IHR5cGVzLnR5cGU7CisJCQkJfQorCisJCQkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBlcmF0ZWQgYnkgYSBzcGFjZQorCQkJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOworCQkJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpeworCQkJCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCisJCQkJCXZhciBuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworCQkJCQl2YXIgbmFtZXNwYWNlID0gUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIik7CisKKwkJCQkJaWYgKCBldmVudHNbdHlwZV0gKSB7CisJCQkJCQkvLyByZW1vdmUgdGhlIGdpdmVuIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlCisJCQkJCQlpZiAoIGhhbmRsZXIgKQorCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlci5ndWlkXTsKKworCQkJCQkJLy8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJCWVsc2UKKwkJCQkJCQlmb3IgKCB2YXIgaGFuZGxlIGluIGV2ZW50c1t0eXBlXSApCisJCQkJCQkJCS8vIEhhbmRsZSB0aGUgcmVtb3ZhbCBvZiBuYW1lc3BhY2VkIGV2ZW50cworCQkJCQkJCQlpZiAoIG5hbWVzcGFjZS50ZXN0KGV2ZW50c1t0eXBlXVtoYW5kbGVdLnR5cGUpICkKKwkJCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlXTsKKwkJCQkJCQkJCQorCQkJCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCisJCQkJCQkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKTsKKworCQkJCQkJLy8gcmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CisJCQkJCQlmb3IgKCByZXQgaW4gZXZlbnRzW3R5cGVdICkgYnJlYWs7CisJCQkJCQlpZiAoICFyZXQgKSB7CisJCQkJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CisJCQkJCQkJCWlmIChlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIpCisJCQkJCQkJCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpLCBmYWxzZSk7CisJCQkJCQkJCWVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpCisJCQkJCQkJCQllbGVtLmRldGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikpOworCQkJCQkJCX0KKwkJCQkJCQlyZXQgPSBudWxsOworCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKworCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKKwkJCWZvciAoIHJldCBpbiBldmVudHMgKSBicmVhazsKKwkJCWlmICggIXJldCApIHsKKwkJCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICk7CisJCQkJaWYgKCBoYW5kbGUgKSBoYW5kbGUuZWxlbSA9IG51bGw7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJoYW5kbGUiICk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwKKwl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIGJ1YmJsaW5nICkgeworCQkvLyBFdmVudCBvYmplY3Qgb3IgZXZlbnQgdHlwZQorCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQ7CisKKwkJaWYoICFidWJibGluZyApeworCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KKwkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CisJCQkJZXZlbnRbZXhwYW5kb10gPyBldmVudCA6CisJCQkJLy8gT2JqZWN0IGxpdGVyYWwKKwkJCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgorCQkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKKwkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CisKKwkJCWlmICggdHlwZS5pbmRleE9mKCIhIikgPj0gMCApIHsKKwkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOworCQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CisJCQl9CisKKwkJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCisJCQlpZiAoICFlbGVtICkgeworCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0b20gZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKKwkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkvLyBPbmx5IHRyaWdnZXIgaWYgd2UndmUgZXZlciBib3VuZCBhbiBldmVudCBmb3IgaXQKKwkJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5cGVdICkKKwkJCQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKXsKKwkJCQkJCWlmICggdGhpcy5ldmVudHMgJiYgdGhpcy5ldmVudHNbdHlwZV0gKQorCQkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOworCQkJCQl9KTsKKwkJCX0KKworCQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAorCisJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCQlyZXR1cm4gdW5kZWZpbmVkOworCQkJCisJCQkvLyBDbGVhbiB1cCBpbiBjYXNlIGl0IGlzIHJldXNlZAorCQkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOworCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKKwkJCQorCQkJLy8gQ2xvbmUgdGhlIGluY29taW5nIGRhdGEsIGlmIGFueQorCQkJZGF0YSA9IGpRdWVyeS5tYWtlQXJyYXkoZGF0YSk7CisJCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7CisJCX0KKworCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbTsKKworCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KKwkJdmFyIGhhbmRsZSA9IGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKTsKKwkJaWYgKCBoYW5kbGUgKQorCQkJaGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CisKKwkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgbmF0aXZlIC5vbmZvbyBoYW5kbGVycyAoYW5kIG9uIGxpbmtzIHNpbmNlIHdlIGRvbid0IGNhbGwgLmNsaWNrKCkgZm9yIGxpbmtzKQorCQlpZiAoICghZWxlbVt0eXBlXSB8fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9PSAiY2xpY2siKSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApCisJCQlldmVudC5yZXN1bHQgPSBmYWxzZTsKKworCQkvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBvbiBsaW5rcykKKwkJaWYgKCAhYnViYmxpbmcgJiYgZWxlbVt0eXBlXSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIpICkgeworCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOworCQkJdHJ5IHsKKwkJCQllbGVtWyB0eXBlIF0oKTsKKwkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBoaWRkZW4gZWxlbWVudHMKKwkJCX0gY2F0Y2ggKGUpIHt9CisJCX0KKworCQl0aGlzLnRyaWdnZXJlZCA9IGZhbHNlOworCisJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsKKwkJCWlmICggcGFyZW50ICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcihldmVudCwgZGF0YSwgcGFyZW50LCB0cnVlKTsKKwkJfQorCX0sCisKKwloYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CisJCS8vIHJldHVybmVkIHVuZGVmaW5lZCBvciBmYWxzZQorCQl2YXIgYWxsLCBoYW5kbGVyczsKKworCQlldmVudCA9IGFyZ3VtZW50c1swXSA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOworCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKKwkJCisJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJdmFyIG5hbWVzcGFjZXMgPSBldmVudC50eXBlLnNwbGl0KCIuIik7CisJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisKKwkJLy8gQ2FjaGUgdGhpcyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5kbGVyCisJCWFsbCA9ICFuYW1lc3BhY2VzLmxlbmd0aCAmJiAhZXZlbnQuZXhjbHVzaXZlOworCQkKKwkJdmFyIG5hbWVzcGFjZSA9IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLnNsaWNlKCkuc29ydCgpLmpvaW4oIi4qXFwuIikgKyAiKFxcLnwkKSIpOworCisJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikgfHwge30gKVtldmVudC50eXBlXTsKKworCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKKwkJCXZhciBoYW5kbGVyID0gaGFuZGxlcnNbal07CisKKwkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25zIGJ5IGNsYXNzCisJCQlpZiAoIGFsbCB8fCBuYW1lc3BhY2UudGVzdChoYW5kbGVyLnR5cGUpICkgeworCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXRzZWxmCisJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CisJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZXI7CisJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKKworCQkJCXZhciByZXQgPSBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJCQlpZiggcmV0ICE9PSB1bmRlZmluZWQgKXsKKwkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OworCQkJCQlpZiAoIHJldCA9PT0gZmFsc2UgKSB7CisJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApCisJCQkJCWJyZWFrOworCisJCQl9CisJCX0KKwl9LAorCisJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKKworCWZpeDogZnVuY3Rpb24oZXZlbnQpIHsKKwkJaWYgKCBldmVudFtleHBhbmRvXSApCisJCQlyZXR1cm4gZXZlbnQ7CisKKwkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKKwkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCisJCXZhciBvcmlnaW5hbEV2ZW50ID0gZXZlbnQ7CisJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CisKKwkJZm9yICggdmFyIGkgPSB0aGlzLnByb3BzLmxlbmd0aCwgcHJvcDsgaTsgKXsKKwkJCXByb3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKKwkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07CisJCX0KKworCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3NhcnkKKwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7IC8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90IGJlIGRlZmluZWQgZWl0aGVyCisKKwkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKKwkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMyApCisJCQlldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsKKworCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CisJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZXZlbnQuZnJvbUVsZW1lbnQgKQorCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50OworCisJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKKwkJaWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbCApIHsKKwkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGJvZHkgPSBkb2N1bWVudC5ib2R5OworCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MuY2xpZW50TGVmdCB8fCAwKTsKKwkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYy5jbGllbnRUb3AgfHwgMCk7CisJCX0KKworCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKwkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkKKwkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTsKKworCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKKwkJaWYgKCAhZXZlbnQubWV0YUtleSAmJiBldmVudC5jdHJsS2V5ICkKKwkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5jdHJsS2V5OworCisJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT0gbGVmdDsgMiA9PSBtaWRkbGU7IDMgPT0gcmlnaHQKKwkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKKwkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkKKwkJCWV2ZW50LndoaWNoID0gKGV2ZW50LmJ1dHRvbiAmIDEgPyAxIDogKCBldmVudC5idXR0b24gJiAyID8gMyA6ICggZXZlbnQuYnV0dG9uICYgNCA/IDIgOiAwICkgKSk7CisKKwkJcmV0dXJuIGV2ZW50OworCX0sCisKKwlwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSApeworCQlwcm94eSA9IHByb3h5IHx8IGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9OworCQkvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKKwkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgdGhpcy5ndWlkKys7CisJCS8vIFNvIHByb3h5IGNhbiBiZSBkZWNsYXJlZCBhcyBhbiBhcmd1bWVudAorCQlyZXR1cm4gcHJveHk7CisJfSwKKworCXNwZWNpYWw6IHsKKwkJcmVhZHk6IHsKKwkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKKwkJCXNldHVwOiBiaW5kUmVhZHksCisJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7fQorCQl9CisJfSwKKwkKKwlzcGVjaWFsQWxsOiB7CisJCWxpdmU6IHsKKwkJCXNldHVwOiBmdW5jdGlvbiggc2VsZWN0b3IsIG5hbWVzcGFjZXMgKXsKKwkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBuYW1lc3BhY2VzWzBdLCBsaXZlSGFuZGxlciApOworCQkJfSwKKwkJCXRlYXJkb3duOiAgZnVuY3Rpb24oIG5hbWVzcGFjZXMgKXsKKwkJCQlpZiAoIG5hbWVzcGFjZXMubGVuZ3RoICkgeworCQkJCQl2YXIgcmVtb3ZlID0gMCwgbmFtZSA9IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzWzBdICsgIihcXC58JCkiKTsKKwkJCQkJCisJCQkJCWpRdWVyeS5lYWNoKCAoalF1ZXJ5LmRhdGEodGhpcywgImV2ZW50cyIpLmxpdmUgfHwge30pLCBmdW5jdGlvbigpeworCQkJCQkJaWYgKCBuYW1lLnRlc3QodGhpcy50eXBlKSApCisJCQkJCQkJcmVtb3ZlKys7CisJCQkJCX0pOworCQkJCQkKKwkJCQkJaWYgKCByZW1vdmUgPCAxICkKKwkJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5kbGVyICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfTsKKworalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYyApeworCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAorCWlmKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApCisJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KHNyYyk7CisJCisJLy8gRXZlbnQgb2JqZWN0CisJaWYoIHNyYyAmJiBzcmMudHlwZSApeworCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisJCXRoaXMudHlwZSA9IHNyYy50eXBlOworCS8vIEV2ZW50IHR5cGUKKwl9ZWxzZQorCQl0aGlzLnR5cGUgPSBzcmM7CisKKwkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCisJLy8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCisJdGhpcy50aW1lU3RhbXAgPSBub3coKTsKKwkKKwkvLyBNYXJrIGl0IGFzIGZpeGVkCisJdGhpc1tleHBhbmRvXSA9IHRydWU7Cit9OworCitmdW5jdGlvbiByZXR1cm5GYWxzZSgpeworCXJldHVybiBmYWxzZTsKK30KK2Z1bmN0aW9uIHJldHVyblRydWUoKXsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7CisKKwkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CisJCWlmKCAhZSApCisJCQlyZXR1cm47CisJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmIChlLnByZXZlbnREZWZhdWx0KQorCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQorCQllLnJldHVyblZhbHVlID0gZmFsc2U7CisJfSwKKwlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKwkJaWYoICFlICkKKwkJCXJldHVybjsKKwkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmIChlLnN0b3BQcm9wYWdhdGlvbikKKwkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCisJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwl9LAorCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpeworCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKwkJdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKwl9LAorCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCisJaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAorCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQorfTsKKy8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKKy8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBoYW5kbGVycwordmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbihldmVudCkgeworCS8vIENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBlbGVtZW50CisJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CisJLy8gVHJhdmVyc2UgdXAgdGhlIHRyZWUKKwl3aGlsZSAoIHBhcmVudCAmJiBwYXJlbnQgIT0gdGhpcyApCisJCXRyeSB7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CisJCWNhdGNoKGUpIHsgcGFyZW50ID0gdGhpczsgfQorCQorCWlmKCBwYXJlbnQgIT0gdGhpcyApeworCQkvLyBzZXQgdGhlIGNvcnJlY3QgZXZlbnQgdHlwZQorCQlldmVudC50eXBlID0gZXZlbnQuZGF0YTsKKwkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CisJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCX0KK307CisJCitqUXVlcnkuZWFjaCh7IAorCW1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLCAKKwltb3VzZW91dDogJ21vdXNlbGVhdmUnCit9LCBmdW5jdGlvbiggb3JpZywgZml4ICl7CisJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0geworCQlzZXR1cDogZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIG9yaWcsIHdpdGhpbkVsZW1lbnQsIGZpeCApOworCQl9LAorCQl0ZWFyZG93bjogZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIG9yaWcsIHdpdGhpbkVsZW1lbnQgKTsKKwkJfQorCX07CQkJICAgCit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJYmluZDogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgeworCQlyZXR1cm4gdHlwZSA9PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuKSA6IHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZm4gfHwgZGF0YSwgZm4gJiYgZGF0YSApOworCQl9KTsKKwl9LAorCisJb25lOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuIHx8IGRhdGEsIGZ1bmN0aW9uKGV2ZW50KSB7CisJCQlqUXVlcnkodGhpcykudW5iaW5kKGV2ZW50LCBvbmUpOworCQkJcmV0dXJuIChmbiB8fCBkYXRhKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCX0pOworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBvbmUsIGZuICYmIGRhdGEpOworCQl9KTsKKwl9LAorCisJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGUsIGZuICk7CisJCX0pOworCX0sCisKKwl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsKKwkJfSk7CisJfSwKKworCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJaWYoIHRoaXNbMF0gKXsKKwkJCXZhciBldmVudCA9IGpRdWVyeS5FdmVudCh0eXBlKTsKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpc1swXSApOworCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKKwkJfQkJCisJfSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuICkgeworCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVudHMgZm9yIGFjY2VzcyBpbiBjbG9zdXJlCisJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKKworCQkvLyBsaW5rIGFsbCB0aGUgZnVuY3Rpb25zLCBzbyBhbnkgb2YgdGhlbSBjYW4gdW5iaW5kIHRoaXMgY2xpY2sgaGFuZGxlcgorCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKKwkJCWpRdWVyeS5ldmVudC5wcm94eSggZm4sIGFyZ3NbaSsrXSApOworCisJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVudCkgeworCQkJLy8gRmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0byBleGVjdXRlCisJCQl0aGlzLmxhc3RUb2dnbGUgPSAoIHRoaXMubGFzdFRvZ2dsZSB8fCAwICkgJSBpOworCisJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAorCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCisJCQlyZXR1cm4gYXJnc1sgdGhpcy5sYXN0VG9nZ2xlKysgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CisJCX0pKTsKKwl9LAorCisJaG92ZXI6IGZ1bmN0aW9uKGZuT3ZlciwgZm5PdXQpIHsKKwkJcmV0dXJuIHRoaXMubW91c2VlbnRlcihmbk92ZXIpLm1vdXNlbGVhdmUoZm5PdXQpOworCX0sCisKKwlyZWFkeTogZnVuY3Rpb24oZm4pIHsKKwkJLy8gQXR0YWNoIHRoZSBsaXN0ZW5lcnMKKwkJYmluZFJlYWR5KCk7CisKKwkJLy8gSWYgdGhlIERPTSBpcyBhbHJlYWR5IHJlYWR5CisJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQorCQkJLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkKKwkJCWZuLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKKworCQkvLyBPdGhlcndpc2UsIHJlbWVtYmVyIHRoZSBmdW5jdGlvbiBmb3IgbGF0ZXIKKwkJZWxzZQorCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CisJCQlqUXVlcnkucmVhZHlMaXN0LnB1c2goIGZuICk7CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlsaXZlOiBmdW5jdGlvbiggdHlwZSwgZm4gKXsKKwkJdmFyIHByb3h5ID0galF1ZXJ5LmV2ZW50LnByb3h5KCBmbiApOworCQlwcm94eS5ndWlkICs9IHRoaXMuc2VsZWN0b3IgKyB0eXBlOworCisJCWpRdWVyeShkb2N1bWVudCkuYmluZCggbGl2ZUNvbnZlcnQodHlwZSwgdGhpcy5zZWxlY3RvciksIHRoaXMuc2VsZWN0b3IsIHByb3h5ICk7CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlkaWU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApeworCQlqUXVlcnkoZG9jdW1lbnQpLnVuYmluZCggbGl2ZUNvbnZlcnQodHlwZSwgdGhpcy5zZWxlY3RvciksIGZuID8geyBndWlkOiBmbi5ndWlkICsgdGhpcy5zZWxlY3RvciArIHR5cGUgfSA6IG51bGwgKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfSk7CisKK2Z1bmN0aW9uIGxpdmVIYW5kbGVyKCBldmVudCApeworCXZhciBjaGVjayA9IFJlZ0V4cCgiKF58XFwuKSIgKyBldmVudC50eXBlICsgIihcXC58JCkiKSwKKwkJc3RvcCA9IHRydWUsCisJCWVsZW1zID0gW107CisKKwlqUXVlcnkuZWFjaChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCBbXSwgZnVuY3Rpb24oaSwgZm4peworCQlpZiAoIGNoZWNrLnRlc3QoZm4udHlwZSkgKSB7CisJCQl2YXIgZWxlbSA9IGpRdWVyeShldmVudC50YXJnZXQpLmNsb3Nlc3QoZm4uZGF0YSlbMF07CisJCQlpZiAoIGVsZW0gKQorCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBmbjogZm4gfSk7CisJCX0KKwl9KTsKKworCWVsZW1zLnNvcnQoZnVuY3Rpb24oYSxiKSB7CisJCXJldHVybiBqUXVlcnkuZGF0YShhLmVsZW0sICJjbG9zZXN0IikgLSBqUXVlcnkuZGF0YShiLmVsZW0sICJjbG9zZXN0Iik7CisJfSk7CisJCisJalF1ZXJ5LmVhY2goZWxlbXMsIGZ1bmN0aW9uKCl7CisJCWlmICggdGhpcy5mbi5jYWxsKHRoaXMuZWxlbSwgZXZlbnQsIHRoaXMuZm4uZGF0YSkgPT09IGZhbHNlICkKKwkJCXJldHVybiAoc3RvcCA9IGZhbHNlKTsKKwl9KTsKKworCXJldHVybiBzdG9wOworfQorCitmdW5jdGlvbiBsaXZlQ29udmVydCh0eXBlLCBzZWxlY3Rvcil7CisJcmV0dXJuIFsibGl2ZSIsIHR5cGUsIHNlbGVjdG9yLnJlcGxhY2UoL1wuL2csICJgIikucmVwbGFjZSgvIC9nLCAifCIpXS5qb2luKCIuIik7Cit9CisKK2pRdWVyeS5leHRlbmQoeworCWlzUmVhZHk6IGZhbHNlLAorCXJlYWR5TGlzdDogW10sCisJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQorCXJlYWR5OiBmdW5jdGlvbigpIHsKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIERPTSBpcyBub3QgYWxyZWFkeSBsb2FkZWQKKwkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CisJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKwkJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKKworCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQorCQkJaWYgKCBqUXVlcnkucmVhZHlMaXN0ICkgeworCQkJCS8vIEV4ZWN1dGUgYWxsIG9mIHRoZW0KKwkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LnJlYWR5TGlzdCwgZnVuY3Rpb24oKXsKKwkJCQkJdGhpcy5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CisJCQkJfSk7CisKKwkJCQkvLyBSZXNldCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMKKwkJCQlqUXVlcnkucmVhZHlMaXN0ID0gbnVsbDsKKwkJCX0KKworCQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisJCQlqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpOworCQl9CisJfQorfSk7CisKK3ZhciByZWFkeUJvdW5kID0gZmFsc2U7CisKK2Z1bmN0aW9uIGJpbmRSZWFkeSgpeworCWlmICggcmVhZHlCb3VuZCApIHJldHVybjsKKwlyZWFkeUJvdW5kID0gdHJ1ZTsKKworCS8vIE1vemlsbGEsIE9wZXJhIGFuZCB3ZWJraXQgbmlnaHRsaWVzIGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgZXZlbnQKKwlpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKKwkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpeworCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSApOworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0sIGZhbHNlICk7CisKKwkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisJfSBlbHNlIGlmICggZG9jdW1lbnQuYXR0YWNoRXZlbnQgKSB7CisJCS8vIGVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwKKwkJLy8gbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzCisJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpeworCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJCWRvY3VtZW50LmRldGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSApOworCQkJCWpRdWVyeS5yZWFkeSgpOworCQkJfQorCQl9KTsKKworCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQorCQkvLyBjb250aW51YWxseSBjaGVjayB0byBzZWUgaWYgdGhlIGRvY3VtZW50IGlzIHJlYWR5CisJCWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHdpbmRvdyA9PSB3aW5kb3cudG9wICkgKGZ1bmN0aW9uKCl7CisJCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgcmV0dXJuOworCisJCQl0cnkgeworCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCisJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KKwkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsKKwkJCX0gY2F0Y2goIGVycm9yICkgeworCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0pKCk7CisJfQorCisJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwlqUXVlcnkuZXZlbnQuYWRkKCB3aW5kb3csICJsb2FkIiwgalF1ZXJ5LnJlYWR5ICk7Cit9CisKK2pRdWVyeS5lYWNoKCAoImJsdXIsZm9jdXMsbG9hZCxyZXNpemUsc2Nyb2xsLHVubG9hZCxjbGljayxkYmxjbGljaywiICsKKwkibW91c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxtb3VzZWVudGVyLG1vdXNlbGVhdmUsIiArCisJImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLCBuYW1lKXsKKworCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCisJalF1ZXJ5LmZuW25hbWVdID0gZnVuY3Rpb24oZm4peworCQlyZXR1cm4gZm4gPyB0aGlzLmJpbmQobmFtZSwgZm4pIDogdGhpcy50cmlnZ2VyKG5hbWUpOworCX07Cit9KTsKKworLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKy8vIEFuZCBwcmV2ZW50IGVycm9ycyBvbiByZWZyZXNoIHdpdGggZXZlbnRzIGxpa2UgbW91c2VvdmVyIGluIG90aGVyIGJyb3dzZXJzCisvLyBXaW5kb3cgaXNuJ3QgaW5jbHVkZWQgc28gYXMgbm90IHRvIHVuYmluZCBleGlzdGluZyB1bmxvYWQgZXZlbnRzCitqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpeyAKKwlmb3IgKCB2YXIgaWQgaW4galF1ZXJ5LmNhY2hlICkKKwkJLy8gU2tpcCB0aGUgd2luZG93CisJCWlmICggaWQgIT0gMSAmJiBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOworfSk7IAorKGZ1bmN0aW9uKCl7CisKKwlqUXVlcnkuc3VwcG9ydCA9IHt9OworCisJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLAorCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKKwkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOworCisJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJZGl2LmlubmVySFRNTCA9ICcgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0PjxvYmplY3Q+PHBhcmFtLz48L29iamVjdD4nOworCisJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAorCQlhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07CisKKwkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CisJaWYgKCAhYWxsIHx8ICFhbGwubGVuZ3RoIHx8ICFhICkgeworCQlyZXR1cm47CisJfQorCisJalF1ZXJ5LnN1cHBvcnQgPSB7CisJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKwkJbGVhZGluZ1doaXRlc3BhY2U6IGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09IDMsCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAorCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCisJCXRib2R5OiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCwKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHlvdSBjYW4gZ2V0IGFsbCBlbGVtZW50cyBpbiBhbiA8b2JqZWN0PiBlbGVtZW50CisJCS8vIElFIDcgYWx3YXlzIHJldHVybnMgbm8gcmVzdWx0cworCQlvYmplY3RBbGw6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXQorCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoLAorCQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCisJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUKKwkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCisJCQorCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCisJCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlZCkKKwkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZAorCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQorCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKKwkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCisJCW9wYWNpdHk6IGEuc3R5bGUub3BhY2l0eSA9PT0gIjAuNSIsCisJCQorCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCisJCS8vIChJRSB1c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKKwkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKKworCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKKwkJc2NyaXB0RXZhbDogZmFsc2UsCisJCW5vQ2xvbmVFdmVudDogdHJ1ZSwKKwkJYm94TW9kZWw6IG51bGwKKwl9OworCQorCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJdHJ5IHsKKwkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggIndpbmRvdy4iICsgaWQgKyAiPTE7IiApICk7CisJfSBjYXRjaChlKXt9CisKKwlyb290Lmluc2VydEJlZm9yZSggc2NyaXB0LCByb290LmZpcnN0Q2hpbGQgKTsKKwkKKwkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29ya3MgYnkgaW5qZWN0aW5nIGEgc2NyaXB0CisJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRlVGV4dE5vZGUKKwkvLyAoSUUgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGZhaWxzLCBhbmQgdXNlcyAudGV4dCBpbnN0ZWFkKQorCWlmICggd2luZG93WyBpZCBdICkgeworCQlqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsID0gdHJ1ZTsKKwkJZGVsZXRlIHdpbmRvd1sgaWQgXTsKKwl9CisKKwlyb290LnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKworCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CisJCWRpdi5hdHRhY2hFdmVudCgib25jbGljayIsIGZ1bmN0aW9uKCl7CisJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQorCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKKwkJCWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOworCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgYXJndW1lbnRzLmNhbGxlZSk7CisJCX0pOworCQlkaXYuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpOworCX0KKworCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKKwkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCisJalF1ZXJ5KGZ1bmN0aW9uKCl7CisJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7CisKKwkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CisJCWpRdWVyeS5ib3hNb2RlbCA9IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOworCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKCBkaXYgKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCX0pOworfSkoKTsKKwordmFyIHN0eWxlRmxvYXQgPSBqUXVlcnkuc3VwcG9ydC5jc3NGbG9hdCA/ICJjc3NGbG9hdCIgOiAic3R5bGVGbG9hdCI7CisKK2pRdWVyeS5wcm9wcyA9IHsKKwkiZm9yIjogImh0bWxGb3IiLAorCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCSJmbG9hdCI6IHN0eWxlRmxvYXQsCisJY3NzRmxvYXQ6IHN0eWxlRmxvYXQsCisJc3R5bGVGbG9hdDogc3R5bGVGbG9hdCwKKwlyZWFkb25seTogInJlYWRPbmx5IiwKKwltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAorCXJvd3NwYW46ICJyb3dTcGFuIiwKKwl0YWJpbmRleDogInRhYkluZGV4IgorfTsKK2pRdWVyeS5mbi5leHRlbmQoeworCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZAorCV9sb2FkOiBqUXVlcnkuZm4ubG9hZCwKKworCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CisJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgKQorCQkJcmV0dXJuIHRoaXMuX2xvYWQoIHVybCApOworCisJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigiICIpOworCQlpZiAoIG9mZiA+PSAwICkgeworCQkJdmFyIHNlbGVjdG9yID0gdXJsLnNsaWNlKG9mZiwgdXJsLmxlbmd0aCk7CisJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKKwkJfQorCisJCS8vIERlZmF1bHQgdG8gYSBHRVQgcmVxdWVzdAorCQl2YXIgdHlwZSA9ICJHRVQiOworCisJCS8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdhcyBwcm92aWRlZAorCQlpZiAoIHBhcmFtcyApCisJCQkvLyBJZiBpdCdzIGEgZnVuY3Rpb24KKwkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgeworCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisJCQkJY2FsbGJhY2sgPSBwYXJhbXM7CisJCQkJcGFyYW1zID0gbnVsbDsKKworCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworCQkJfSBlbHNlIGlmKCB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKKwkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcyApOworCQkJCXR5cGUgPSAiUE9TVCI7CisJCQl9CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCisJCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBkb2N1bWVudAorCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IHVybCwKKwkJCXR5cGU6IHR5cGUsCisJCQlkYXRhVHlwZTogImh0bWwiLAorCQkJZGF0YTogcGFyYW1zLAorCQkJY29tcGxldGU6IGZ1bmN0aW9uKHJlcywgc3RhdHVzKXsKKwkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhUTUwgaW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgfHwgc3RhdHVzID09ICJub3Rtb2RpZmllZCIgKQorCQkJCQkvLyBTZWUgaWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkCisJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPworCQkJCQkJLy8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKKwkJCQkJCWpRdWVyeSgiPGRpdi8+IikKKwkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwgcmVtb3ZpbmcgdGhlIHNjcmlwdHMKKwkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMgaW4gSUUKKwkJCQkJCQkuYXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVwbGFjZSgvPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+L2csICIiKSkKKworCQkJCQkJCS8vIExvY2F0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCisJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKKworCQkJCQkJLy8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKKwkJCQkJCXJlcy5yZXNwb25zZVRleHQgKTsKKworCQkJCWlmKCBjYWxsYmFjayApCisJCQkJCXNlbGYuZWFjaCggY2FsbGJhY2ssIFtyZXMucmVzcG9uc2VUZXh0LCBzdGF0dXMsIHJlc10gKTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7CisJfSwKKwlzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKKwkJfSkKKwkJLmZpbHRlcihmdW5jdGlvbigpeworCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgorCQkJCSh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3QodGhpcy5ub2RlTmFtZSkgfHwKKwkJCQkJL3RleHR8aGlkZGVufHBhc3N3b3JkfHNlYXJjaC9pLnRlc3QodGhpcy50eXBlKSk7CisJCX0pCisJCS5tYXAoZnVuY3Rpb24oaSwgZWxlbSl7CisJCQl2YXIgdmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOworCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6CisJCQkJalF1ZXJ5LmlzQXJyYXkodmFsKSA/CisJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFsLCBpKXsKKwkJCQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJCQkJfSkgOgorCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJfSkuZ2V0KCk7CisJfQorfSk7CisKKy8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCitqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLG8peworCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpeworCQlyZXR1cm4gdGhpcy5iaW5kKG8sIGYpOworCX07Cit9KTsKKwordmFyIGpzYyA9IG5vdygpOworCitqUXVlcnkuZXh0ZW5kKHsKKyAgCisJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJLy8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9tbWl0ZWQKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJY2FsbGJhY2sgPSBkYXRhOworCQkJZGF0YSA9IG51bGw7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIkdFVCIsCisJCQl1cmw6IHVybCwKKwkJCWRhdGE6IGRhdGEsCisJCQlzdWNjZXNzOiBjYWxsYmFjaywKKwkJCWRhdGFUeXBlOiB0eXBlCisJCX0pOworCX0sCisKKwlnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIG51bGwsIGNhbGxiYWNrLCAic2NyaXB0Iik7CisJfSwKKworCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOworCX0sCisKKwlwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJY2FsbGJhY2sgPSBkYXRhOworCQkJZGF0YSA9IHt9OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJCXR5cGU6ICJQT1NUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgeworCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCBzZXR0aW5ncyApOworCX0sCisKKwlhamF4U2V0dGluZ3M6IHsKKwkJdXJsOiBsb2NhdGlvbi5ocmVmLAorCQlnbG9iYWw6IHRydWUsCisJCXR5cGU6ICJHRVQiLAorCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCisJCXByb2Nlc3NEYXRhOiB0cnVlLAorCQlhc3luYzogdHJ1ZSwKKwkJLyoKKwkJdGltZW91dDogMCwKKwkJZGF0YTogbnVsbCwKKwkJdXNlcm5hbWU6IG51bGwsCisJCXBhc3N3b3JkOiBudWxsLAorCQkqLworCQkvLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0OyBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CisJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKKwkJLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNhbGxpbmcgalF1ZXJ5LmFqYXhTZXR1cAorCQl4aHI6ZnVuY3Rpb24oKXsKKwkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJCX0sCisJCWFjY2VwdHM6IHsKKwkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorCQkJaHRtbDogInRleHQvaHRtbCIsCisJCQlzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAorCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCisJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCisJCQlfZGVmYXVsdDogIiovKiIKKwkJfQorCX0sCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKworCWFqYXg6IGZ1bmN0aW9uKCBzICkgeworCQkvLyBFeHRlbmQgdGhlIHNldHRpbmdzLCBidXQgcmUtZXh0ZW5kICdzJyBzbyB0aGF0IGl0IGNhbiBiZQorCQkvLyBjaGVja2VkIGFnYWluIGxhdGVyIChpbiB0aGUgdGVzdCBzdWl0ZSwgc3BlY2lmaWNhbGx5KQorCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CisKKwkJdmFyIGpzb25wLCBqc3JlID0gLz1cPygmfCQpL2csIHN0YXR1cywgZGF0YSwKKwkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKKworCQkvLyBjb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKKwkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCisJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0ocy5kYXRhKTsKKworCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcworCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb25wIiApIHsKKwkJCWlmICggdHlwZSA9PSAiR0VUIiApIHsKKwkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCisJCQkJCXMudXJsICs9IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQl9IGVsc2UgaWYgKCAhcy5kYXRhIHx8ICFzLmRhdGEubWF0Y2goanNyZSkgKQorCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQlzLmRhdGFUeXBlID0gImpzb24iOworCQl9CisKKwkJLy8gQnVpbGQgdGVtcG9yYXJ5IEpTT05QIGZ1bmN0aW9uCisJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbiIgJiYgKHMuZGF0YSAmJiBzLmRhdGEubWF0Y2goanNyZSkgfHwgcy51cmwubWF0Y2goanNyZSkpICkgeworCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CisKKwkJCS8vIFJlcGxhY2UgdGhlID0/IHNlcXVlbmNlIGJvdGggaW4gdGhlIHF1ZXJ5IHN0cmluZyBhbmQgdGhlIGRhdGEKKwkJCWlmICggcy5kYXRhICkKKwkJCQlzLmRhdGEgPSAocy5kYXRhICsgIiIpLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKKwkJCXMudXJsID0gcy51cmwucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOworCisJCQkvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZQorCQkJLy8gdGhhdCBhIEpTT05QIHN0eWxlIHJlc3BvbnNlIGlzIGV4ZWN1dGVkIHByb3Blcmx5CisJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CisKKwkJCS8vIEhhbmRsZSBKU09OUC1zdHlsZSBsb2FkaW5nCisJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApeworCQkJCWRhdGEgPSB0bXA7CisJCQkJc3VjY2VzcygpOworCQkJCWNvbXBsZXRlKCk7CisJCQkJLy8gR2FyYmFnZSBjb2xsZWN0CisJCQkJd2luZG93WyBqc29ucCBdID0gdW5kZWZpbmVkOworCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CisJCQkJaWYgKCBoZWFkICkKKwkJCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCQl9OworCQl9CisKKwkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCisJCQlzLmNhY2hlID0gZmFsc2U7CisKKwkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgeworCQkJdmFyIHRzID0gbm93KCk7CisJCQkvLyB0cnkgcmVwbGFjaW5nIF89IGlmIGl0IGlzIHRoZXJlCisJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CisJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBsYWNlZCwgYWRkIHRpbWVzdGFtcCB0byB0aGUgZW5kCisJCQlzLnVybCA9IHJldCArICgocmV0ID09IHMudXJsKSA/IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyAiXz0iICsgdHMgOiAiIik7CisJCX0KKworCQkvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsIGZvciBnZXQgcmVxdWVzdHMKKwkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKKwkJCXMudXJsICs9IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyBzLmRhdGE7CisKKwkJCS8vIElFIGxpa2VzIHRvIHNlbmQgYm90aCBnZXQgYW5kIHBvc3QgZGF0YSwgcHJldmVudCB0aGlzCisJCQlzLmRhdGEgPSBudWxsOworCQl9CisKKwkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cworCQlpZiAoIHMuZ2xvYmFsICYmICEgalF1ZXJ5LmFjdGl2ZSsrICkKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0YXJ0IiApOworCisJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMgdGhlIGRvbWFpbgorCQl2YXIgcGFydHMgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyggcy51cmwgKTsKKworCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CisJCS8vIGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRoIGEgR0VUCisJCWlmICggcy5kYXRhVHlwZSA9PSAic2NyaXB0IiAmJiB0eXBlID09ICJHRVQiICYmIHBhcnRzCisJCQkmJiAoIHBhcnRzWzFdICYmIHBhcnRzWzFdICE9IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdICE9IGxvY2F0aW9uLmhvc3QgKSl7CisKKwkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsKKwkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKwkJCXNjcmlwdC5zcmMgPSBzLnVybDsKKwkJCWlmIChzLnNjcmlwdENoYXJzZXQpCisJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CisKKwkJCS8vIEhhbmRsZSBTY3JpcHQgbG9hZGluZworCQkJaWYgKCAhanNvbnAgKSB7CisJCQkJdmFyIGRvbmUgPSBmYWxzZTsKKworCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCisJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpeworCQkJCQlpZiAoICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CisJCQkJCQkJdGhpcy5yZWFkeVN0YXRlID09ICJsb2FkZWQiIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSApIHsKKwkJCQkJCWRvbmUgPSB0cnVlOworCQkJCQkJc3VjY2VzcygpOworCQkJCQkJY29tcGxldGUoKTsKKworCQkJCQkJLy8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFCisJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisKKwkJCWhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKKworCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBlbGVtZW50IGluamVjdGlvbgorCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciByZXF1ZXN0RG9uZSA9IGZhbHNlOworCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKKwkJdmFyIHhociA9IHMueGhyKCk7CisKKwkJLy8gT3BlbiB0aGUgc29ja2V0CisJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQorCQlpZiggcy51c2VybmFtZSApCisJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCk7CisJCWVsc2UKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jKTsKKworCQkvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGluIEZpcmVmb3ggMworCQl0cnkgeworCQkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CisJCQlpZiAoIHMuZGF0YSApCisJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOworCisJCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgorCQkJaWYgKCBzLmlmTW9kaWZpZWQgKQorCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsCisJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdIHx8ICJUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVCIgKTsKKworCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNjcmlwdCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKKwkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwgIlhNTEh0dHBSZXF1ZXN0Iik7CisKKwkJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKKwkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCBzLmRhdGFUeXBlICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZSBdID8KKwkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIsICovKiIgOgorCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOworCQl9IGNhdGNoKGUpe30KKworCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CisJCWlmICggcy5iZWZvcmVTZW5kICYmIHMuYmVmb3JlU2VuZCh4aHIsIHMpID09PSBmYWxzZSApIHsKKwkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKKwkJCS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CisJCQl4aHIuYWJvcnQoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOworCisJCS8vIFdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gY29tZSBiYWNrCisJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihpc1RpbWVvdXQpeworCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIGNsZWFyIHRoZSBpbnRlcnZhbCBhbmQgZGVjcmVtZW50IGpRdWVyeS5hY3RpdmUKKwkJCWlmICh4aHIucmVhZHlTdGF0ZSA9PSAwKSB7CisJCQkJaWYgKGl2YWwpIHsKKwkJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAorCQkJCQljbGVhckludGVydmFsKGl2YWwpOworCQkJCQlpdmFsID0gbnVsbDsKKwkJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCQkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQorCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKKwkJCQl9CisJCQkvLyBUaGUgdHJhbnNmZXIgaXMgY29tcGxldGUgYW5kIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgdGhlIHJlcXVlc3QgdGltZWQgb3V0CisJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91dCA9PSAidGltZW91dCIpICkgeworCQkJCXJlcXVlc3REb25lID0gdHJ1ZTsKKworCQkJCS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKKwkJCQlpZiAoaXZhbCkgeworCQkJCQljbGVhckludGVydmFsKGl2YWwpOworCQkJCQlpdmFsID0gbnVsbDsKKwkJCQl9CisKKwkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiID8gInRpbWVvdXQiIDoKKwkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPyAiZXJyb3IiIDoKKwkJCQkJcy5pZk1vZGlmaWVkICYmIGpRdWVyeS5odHRwTm90TW9kaWZpZWQoIHhociwgcy51cmwgKSA/ICJub3Rtb2RpZmllZCIgOgorCQkJCQkic3VjY2VzcyI7CisKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgKSB7CisJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCisJCQkJCXRyeSB7CisJCQkJCQkvLyBwcm9jZXNzIHRoZSBkYXRhIChydW5zIHRoZSB4bWwgdGhyb3VnaCBodHRwRGF0YSByZWdhcmRsZXNzIG9mIGNhbGxiYWNrKQorCQkJCQkJZGF0YSA9IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CisJCQkJCX0gY2F0Y2goZSkgeworCQkJCQkJc3RhdHVzID0gInBhcnNlcmVycm9yIjsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdG1vZGlmaWVkCisJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgeworCQkJCQkvLyBDYWNoZSBMYXN0LU1vZGlmaWVkIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgorCQkJCQl2YXIgbW9kUmVzOworCQkJCQl0cnkgeworCQkJCQkJbW9kUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CisJCQkJCX0gY2F0Y2goZSkge30gLy8gc3dhbGxvdyBleGNlcHRpb24gdGhyb3duIGJ5IEZGIGlmIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlCisKKwkJCQkJaWYgKCBzLmlmTW9kaWZpZWQgJiYgbW9kUmVzICkKKwkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdID0gbW9kUmVzOworCisJCQkJCS8vIEpTT05QIGhhbmRsZXMgaXRzIG93biBzdWNjZXNzIGNhbGxiYWNrCisJCQkJCWlmICggIWpzb25wICkKKwkJCQkJCXN1Y2Nlc3MoKTsKKwkJCQl9IGVsc2UKKwkJCQkJalF1ZXJ5LmhhbmRsZUVycm9yKHMsIHhociwgc3RhdHVzKTsKKworCQkJCS8vIEZpcmUgdGhlIGNvbXBsZXRlIGhhbmRsZXJzCisJCQkJY29tcGxldGUoKTsKKworCQkJCWlmICggaXNUaW1lb3V0ICkKKwkJCQkJeGhyLmFib3J0KCk7CisKKwkJCQkvLyBTdG9wIG1lbW9yeSBsZWFrcworCQkJCWlmICggcy5hc3luYyApCisJCQkJCXhociA9IG51bGw7CisJCQl9CisJCX07CisKKwkJaWYgKCBzLmFzeW5jICkgeworCQkJLy8gZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBvbGwgaXQgaW5zdGVhZAorCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEzKTsKKworCQkJLy8gVGltZW91dCBjaGVja2VyCisJCQlpZiAoIHMudGltZW91dCA+IDAgKQorCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKwkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGhhcHBlbmluZworCQkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKQorCQkJCQkJb25yZWFkeXN0YXRlY2hhbmdlKCAidGltZW91dCIgKTsKKwkJCQl9LCBzLnRpbWVvdXQpOworCQl9CisKKwkJLy8gU2VuZCB0aGUgZGF0YQorCQl0cnkgeworCQkJeGhyLnNlbmQocy5kYXRhKTsKKwkJfSBjYXRjaChlKSB7CisJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBudWxsLCBlKTsKKwkJfQorCisJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3luYyByZXF1ZXN0cworCQlpZiAoICFzLmFzeW5jICkKKwkJCW9ucmVhZHlzdGF0ZWNoYW5nZSgpOworCisJCWZ1bmN0aW9uIHN1Y2Nlc3MoKXsKKwkJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQorCQkJaWYgKCBzLnN1Y2Nlc3MgKQorCQkJCXMuc3VjY2VzcyggZGF0YSwgc3RhdHVzICk7CisKKwkJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjaworCQkJaWYgKCBzLmdsb2JhbCApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CisJCX0KKworCQlmdW5jdGlvbiBjb21wbGV0ZSgpeworCQkJLy8gUHJvY2VzcyByZXN1bHQKKwkJCWlmICggcy5jb21wbGV0ZSApCisJCQkJcy5jb21wbGV0ZSh4aHIsIHN0YXR1cyk7CisKKwkJCS8vIFRoZSByZXF1ZXN0IHdhcyBjb21wbGV0ZWQKKwkJCWlmICggcy5nbG9iYWwgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgW3hociwgc10gKTsKKworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQl9CisKKwkJLy8gcmV0dXJuIFhNTEh0dHBSZXF1ZXN0IHRvIGFsbG93IGFib3J0aW5nIHRoZSByZXF1ZXN0IGV0Yy4KKwkJcmV0dXJuIHhocjsKKwl9LAorCisJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZSApIHsKKwkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0CisJCWlmICggcy5lcnJvciApIHMuZXJyb3IoIHhociwgc3RhdHVzLCBlICk7CisKKwkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSApOworCX0sCisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAorCWh0dHBTdWNjZXNzOiBmdW5jdGlvbiggeGhyICkgeworCQl0cnkgeworCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywgc2VlICMxNDUwCisJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT0gImZpbGU6IiB8fAorCQkJCSggeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCApIHx8IHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoci5zdGF0dXMgPT0gMTIyMzsKKwkJfSBjYXRjaChlKXt9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCisJaHR0cE5vdE1vZGlmaWVkOiBmdW5jdGlvbiggeGhyLCB1cmwgKSB7CisJCXRyeSB7CisJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CisKKwkJCS8vIEZpcmVmb3ggYWx3YXlzIHJldHVybnMgMjAwLiBjaGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKKwkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdOworCQl9IGNhdGNoKGUpe30KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgcyApIHsKKwkJdmFyIGN0ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSwKKwkJCXhtbCA9IHR5cGUgPT0gInhtbCIgfHwgIXR5cGUgJiYgY3QgJiYgY3QuaW5kZXhPZigieG1sIikgPj0gMCwKKwkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OworCisJCWlmICggeG1sICYmIGRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgPT0gInBhcnNlcmVycm9yIiApCisJCQl0aHJvdyAicGFyc2VyZXJyb3IiOworCQkJCisJCS8vIEFsbG93IGEgcHJlLWZpbHRlcmluZyBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgcmVzcG9uc2UKKwkJLy8gcyAhPSBudWxsIGlzIGNoZWNrZWQgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCQlpZiggcyAmJiBzLmRhdGFGaWx0ZXIgKQorCQkJZGF0YSA9IHMuZGF0YUZpbHRlciggZGF0YSwgdHlwZSApOworCisJCS8vIFRoZSBmaWx0ZXIgY2FuIGFjdHVhbGx5IHBhcnNlIHRoZSByZXNwb25zZQorCQlpZiggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICl7CisKKwkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3JpcHQiLCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CisJCQlpZiAoIHR5cGUgPT0gInNjcmlwdCIgKQorCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCBkYXRhICk7CisKKwkJCS8vIEdldCB0aGUgSmF2YVNjcmlwdCBvYmplY3QsIGlmIEpTT04gaXMgdXNlZC4KKwkJCWlmICggdHlwZSA9PSAianNvbiIgKQorCQkJCWRhdGEgPSB3aW5kb3dbImV2YWwiXSgiKCIgKyBkYXRhICsgIikiKTsKKwkJfQorCQkKKwkJcmV0dXJuIGRhdGE7CisJfSwKKworCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCisJLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCisJcGFyYW06IGZ1bmN0aW9uKCBhICkgeworCQl2YXIgcyA9IFsgXTsKKworCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKKwkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisJCX07CisKKwkJLy8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkKKwkJLy8gb2YgZm9ybSBlbGVtZW50cworCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKKwkJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQkJalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCl7CisJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKKwkJCX0pOworCisJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCisJCWVsc2UKKwkJCS8vIFNlcmlhbGl6ZSB0aGUga2V5L3ZhbHVlcworCQkJZm9yICggdmFyIGogaW4gYSApCisJCQkJLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gdGhlIGtleSBuYW1lcyBuZWVkIHRvIGJlIHJlcGVhdGVkCisJCQkJaWYgKCBqUXVlcnkuaXNBcnJheShhW2pdKSApCisJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpeworCQkJCQkJYWRkKCBqLCB0aGlzICk7CisJCQkJCX0pOworCQkJCWVsc2UKKwkJCQkJYWRkKCBqLCBqUXVlcnkuaXNGdW5jdGlvbihhW2pdKSA/IGFbal0oKSA6IGFbal0gKTsKKworCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCisJCXJldHVybiBzLmpvaW4oIiYiKS5yZXBsYWNlKC8lMjAvZywgIisiKTsKKwl9CisKK30pOwordmFyIGVsZW1kaXNwbGF5ID0ge30sCisJdGltZXJJZCwKKwlmeEF0dHJzID0gWworCQkvLyBoZWlnaHQgYW5pbWF0aW9ucworCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCisJCS8vIHdpZHRoIGFuaW1hdGlvbnMKKwkJWyAid2lkdGgiLCAibWFyZ2luTGVmdCIsICJtYXJnaW5SaWdodCIsICJwYWRkaW5nTGVmdCIsICJwYWRkaW5nUmlnaHQiIF0sCisJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucworCQlbICJvcGFjaXR5IiBdCisJXTsKKworZnVuY3Rpb24gZ2VuRngoIHR5cGUsIG51bSApeworCXZhciBvYmogPSB7fTsKKwlqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKKwkJb2JqWyB0aGlzIF0gPSB0eXBlOworCX0pOworCXJldHVybiBvYmo7Cit9CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXNob3c6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKKwkJaWYgKCBzcGVlZCApIHsKKwkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CisJCX0gZWxzZSB7CisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApeworCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOworCQkJCQorCQkJCXRoaXNbaV0uc3R5bGUuZGlzcGxheSA9IG9sZCB8fCAiIjsKKwkJCQkKKwkJCQlpZiAoIGpRdWVyeS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSA9PT0gIm5vbmUiICkgeworCQkJCQl2YXIgdGFnTmFtZSA9IHRoaXNbaV0udGFnTmFtZSwgZGlzcGxheTsKKwkJCQkJCisJCQkJCWlmICggZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSApIHsKKwkJCQkJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgdGFnTmFtZSBdOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmFyIGVsZW0gPSBqUXVlcnkoIjwiICsgdGFnTmFtZSArICIgLz4iKS5hcHBlbmRUbygiYm9keSIpOworCQkJCQkJCisJCQkJCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsKKwkJCQkJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkKKwkJCQkJCQlkaXNwbGF5ID0gImJsb2NrIjsKKwkJCQkJCQorCQkJCQkJZWxlbS5yZW1vdmUoKTsKKwkJCQkJCQorCQkJCQkJZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSA9IGRpc3BsYXk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKwkJCS8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKwl9LAorCisJaGlkZTogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2speworCQlpZiAoIHNwZWVkICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoImhpZGUiLCAzKSwgc3BlZWQsIGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdmFyIG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5Iik7CisJCQkJaWYgKCAhb2xkICYmIG9sZCAhPT0gIm5vbmUiICkKKwkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOworCQkJfQorCisJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKwkJCS8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisKKwkvLyBTYXZlIHRoZSBvbGQgdG9nZ2xlIGZ1bmN0aW9uCisJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuLCBmbjIgKXsKKwkJdmFyIGJvb2wgPSB0eXBlb2YgZm4gPT09ICJib29sZWFuIjsKKworCQlyZXR1cm4galF1ZXJ5LmlzRnVuY3Rpb24oZm4pICYmIGpRdWVyeS5pc0Z1bmN0aW9uKGZuMikgPworCQkJdGhpcy5fdG9nZ2xlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CisJCQlmbiA9PSBudWxsIHx8IGJvb2wgPworCQkJCXRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJCQl2YXIgc3RhdGUgPSBib29sID8gZm4gOiBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKTsKKwkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CisJCQkJfSkgOgorCQkJCXRoaXMuYW5pbWF0ZShnZW5GeCgidG9nZ2xlIiwgMyksIGZuLCBmbjIpOworCX0sCisKKwlmYWRlVG86IGZ1bmN0aW9uKHNwZWVkLHRvLGNhbGxiYWNrKXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgY2FsbGJhY2spOworCX0sCisKKwlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOworCisJCXJldHVybiB0aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDogInF1ZXVlIiBdKGZ1bmN0aW9uKCl7CisJCQorCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30sIG9wdGFsbCksIHAsCisJCQkJaGlkZGVuID0gdGhpcy5ub2RlVHlwZSA9PSAxICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAorCQkJCXNlbGYgPSB0aGlzOworCQorCQkJZm9yICggcCBpbiBwcm9wICkgeworCQkJCWlmICggcHJvcFtwXSA9PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0gPT0gInNob3ciICYmICFoaWRkZW4gKQorCQkJCQlyZXR1cm4gb3B0LmNvbXBsZXRlLmNhbGwodGhpcyk7CisKKwkJCQlpZiAoICggcCA9PSAiaGVpZ2h0IiB8fCBwID09ICJ3aWR0aCIgKSAmJiB0aGlzLnN0eWxlICkgeworCQkJCQkvLyBTdG9yZSBkaXNwbGF5IHByb3BlcnR5CisJCQkJCW9wdC5kaXNwbGF5ID0galF1ZXJ5LmNzcyh0aGlzLCAiZGlzcGxheSIpOworCisJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAorCQkJCQlvcHQub3ZlcmZsb3cgPSB0aGlzLnN0eWxlLm92ZXJmbG93OworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApCisJCQkJdGhpcy5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCisJCQlvcHQuY3VyQW5pbSA9IGpRdWVyeS5leHRlbmQoe30sIHByb3ApOworCisJCQlqUXVlcnkuZWFjaCggcHJvcCwgZnVuY3Rpb24obmFtZSwgdmFsKXsKKwkJCQl2YXIgZSA9IG5ldyBqUXVlcnkuZngoIHNlbGYsIG9wdCwgbmFtZSApOworCisJCQkJaWYgKCAvdG9nZ2xlfHNob3d8aGlkZS8udGVzdCh2YWwpICkKKwkJCQkJZVsgdmFsID09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsKKwkJCQllbHNlIHsKKwkJCQkJdmFyIHBhcnRzID0gdmFsLnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0pPyhbXGQrLS5dKykoLiopJC8pLAorCQkJCQkJc3RhcnQgPSBlLmN1cih0cnVlKSB8fCAwOworCisJCQkJCWlmICggcGFydHMgKSB7CisJCQkJCQl2YXIgZW5kID0gcGFyc2VGbG9hdChwYXJ0c1syXSksCisJCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICJweCI7CisKKwkJCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQorCQkJCQkJaWYgKCB1bml0ICE9ICJweCIgKSB7CisJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gKGVuZCB8fCAxKSArIHVuaXQ7CisJCQkJCQkJc3RhcnQgPSAoKGVuZCB8fCAxKSAvIGUuY3VyKHRydWUpKSAqIHN0YXJ0OworCQkJCQkJCXNlbGYuc3R5bGVbIG5hbWUgXSA9IHN0YXJ0ICsgdW5pdDsKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisJCQkJCQlpZiAoIHBhcnRzWzFdICkKKwkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09ICItPSIgPyAtMSA6IDEpICogZW5kKSArIHN0YXJ0OworCisJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5pdCApOworCQkJCQl9IGVsc2UKKwkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOworCQkJCX0KKwkJCX0pOworCisJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKKwkJCXJldHVybiB0cnVlOworCQl9KTsKKwl9LAorCisJc3RvcDogZnVuY3Rpb24oY2xlYXJRdWV1ZSwgZ290b0VuZCl7CisJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCWlmIChjbGVhclF1ZXVlKQorCQkJdGhpcy5xdWV1ZShbXSk7CisKKwkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQkvLyBnbyBpbiByZXZlcnNlIG9yZGVyIHNvIGFueXRoaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSBkdXJpbmcgdGhlIGxvb3AgaXMgaWdub3JlZAorCQkJZm9yICggdmFyIGkgPSB0aW1lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKQorCQkJCWlmICggdGltZXJzW2ldLmVsZW0gPT0gdGhpcyApIHsKKwkJCQkJaWYgKGdvdG9FbmQpCisJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CisJCQkJCQl0aW1lcnNbaV0odHJ1ZSk7CisJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CisJCQkJfQorCQl9KTsKKworCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCisJCWlmICghZ290b0VuZCkKKwkJCXRoaXMuZGVxdWV1ZSgpOworCisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKy8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKK2pRdWVyeS5lYWNoKHsKKwlzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSksCisJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKKwlzbGlkZVRvZ2dsZTogZ2VuRngoInRvZ2dsZSIsIDEpLAorCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKKwlmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9Cit9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKXsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgY2FsbGJhY2sgKXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBjYWxsYmFjayApOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisKKwlzcGVlZDogZnVuY3Rpb24oc3BlZWQsIGVhc2luZywgZm4pIHsKKwkJdmFyIG9wdCA9IHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBzcGVlZCA6IHsKKwkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CisJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCisJCQlkdXJhdGlvbjogc3BlZWQsCisJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCisJCX07CisKKwkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CisJCQlqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0gfHwgalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworCQkvLyBRdWV1ZWluZworCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOworCQlvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpeworCQkJaWYgKCBvcHQucXVldWUgIT09IGZhbHNlICkKKwkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOworCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkKKwkJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKKwkJfTsKKworCQlyZXR1cm4gb3B0OworCX0sCisKKwllYXNpbmc6IHsKKwkJbGluZWFyOiBmdW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CisJCQlyZXR1cm4gZmlyc3ROdW0gKyBkaWZmICogcDsKKwkJfSwKKwkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKKwkJCXJldHVybiAoKC1NYXRoLmNvcyhwKk1hdGguUEkpLzIpICsgMC41KSAqIGRpZmYgKyBmaXJzdE51bTsKKwkJfQorCX0sCisKKwl0aW1lcnM6IFtdLAorCisJZng6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wICl7CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRoaXMuZWxlbSA9IGVsZW07CisJCXRoaXMucHJvcCA9IHByb3A7CisKKwkJaWYgKCAhb3B0aW9ucy5vcmlnICkKKwkJCW9wdGlvbnMub3JpZyA9IHt9OworCX0KKworfSk7CisKK2pRdWVyeS5meC5wcm90b3R5cGUgPSB7CisKKwkvLyBTaW1wbGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSBzdHlsZSB2YWx1ZQorCXVwZGF0ZTogZnVuY3Rpb24oKXsKKwkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApCisJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7CisKKwkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7CisKKwkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gYmxvY2sgZm9yIGhlaWdodC93aWR0aCBhbmltYXRpb25zCisJCWlmICggKCB0aGlzLnByb3AgPT0gImhlaWdodCIgfHwgdGhpcy5wcm9wID09ICJ3aWR0aCIgKSAmJiB0aGlzLmVsZW0uc3R5bGUgKQorCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCX0sCisKKwkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQorCWN1cjogZnVuY3Rpb24oZm9yY2UpeworCQlpZiAoIHRoaXMuZWxlbVt0aGlzLnByb3BdICE9IG51bGwgJiYgKCF0aGlzLmVsZW0uc3R5bGUgfHwgdGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF0gPT0gbnVsbCkgKQorCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CisKKwkJdmFyIHIgPSBwYXJzZUZsb2F0KGpRdWVyeS5jc3ModGhpcy5lbGVtLCB0aGlzLnByb3AsIGZvcmNlKSk7CisJCXJldHVybiByICYmIHIgPiAtMTAwMDAgPyByIDogcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKHRoaXMuZWxlbSwgdGhpcy5wcm9wKSkgfHwgMDsKKwl9LAorCisJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCisJY3VzdG9tOiBmdW5jdGlvbihmcm9tLCB0bywgdW5pdCl7CisJCXRoaXMuc3RhcnRUaW1lID0gbm93KCk7CisJCXRoaXMuc3RhcnQgPSBmcm9tOworCQl0aGlzLmVuZCA9IHRvOworCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAicHgiOworCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQ7CisJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCQlmdW5jdGlvbiB0KGdvdG9FbmQpeworCQkJcmV0dXJuIHNlbGYuc3RlcChnb3RvRW5kKTsKKwkJfQorCisJCXQuZWxlbSA9IHRoaXMuZWxlbTsKKworCQlpZiAoIHQoKSAmJiBqUXVlcnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKSB7CisJCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKKwkJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApCisJCQkJCWlmICggIXRpbWVyc1tpXSgpICkKKwkJCQkJCXRpbWVycy5zcGxpY2UoaS0tLCAxKTsKKworCQkJCWlmICggIXRpbWVycy5sZW5ndGggKSB7CisJCQkJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwkJCQkJdGltZXJJZCA9IHVuZGVmaW5lZDsKKwkJCQl9CisJCQl9LCAxMyk7CisJCX0KKwl9LAorCisJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgorCXNob3c6IGZ1bmN0aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRoaXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgorCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKKwkJLy8gZmxhc2ggb2YgY29udGVudAorCQl0aGlzLmN1c3RvbSh0aGlzLnByb3AgPT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT0gImhlaWdodCIgPyAxIDogMCwgdGhpcy5jdXIoKSk7CisKKwkJLy8gU3RhcnQgYnkgc2hvd2luZyB0aGUgZWxlbWVudAorCQlqUXVlcnkodGhpcy5lbGVtKS5zaG93KCk7CisJfSwKKworCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KKwloaWRlOiBmdW5jdGlvbigpeworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKKwkJdGhpcy5vcHRpb25zLmhpZGUgPSB0cnVlOworCisJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KKwkJdGhpcy5jdXN0b20odGhpcy5jdXIoKSwgMCk7CisJfSwKKworCS8vIEVhY2ggc3RlcCBvZiBhbiBhbmltYXRpb24KKwlzdGVwOiBmdW5jdGlvbihnb3RvRW5kKXsKKwkJdmFyIHQgPSBub3coKTsKKworCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGltZSApIHsKKwkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CisJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAxOworCQkJdGhpcy51cGRhdGUoKTsKKworCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRoaXMucHJvcCBdID0gdHJ1ZTsKKworCQkJdmFyIGRvbmUgPSB0cnVlOworCQkJZm9yICggdmFyIGkgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQorCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0gIT09IHRydWUgKQorCQkJCQlkb25lID0gZmFsc2U7CisKKwkJCWlmICggZG9uZSApIHsKKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNwbGF5ICE9IG51bGwgKSB7CisJCQkJCS8vIFJlc2V0IHRoZSBvdmVyZmxvdworCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMub3ZlcmZsb3c7CisKKwkJCQkJLy8gUmVzZXQgdGhlIGRpc3BsYXkKKwkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKKwkJCQkJaWYgKCBqUXVlcnkuY3NzKHRoaXMuZWxlbSwgImRpc3BsYXkiKSA9PSAibm9uZSIgKQorCQkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCQkJCX0KKworCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkKKwkJCQkJalF1ZXJ5KHRoaXMuZWxlbSkuaGlkZSgpOworCisJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgorCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgfHwgdGhpcy5vcHRpb25zLnNob3cgKQorCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCisJCQkJCQlqUXVlcnkuYXR0cih0aGlzLmVsZW0uc3R5bGUsIHAsIHRoaXMub3B0aW9ucy5vcmlnW3BdKTsKKwkJCQkJCisJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KKwkJCQl0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCggdGhpcy5lbGVtICk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOworCQkJdGhpcy5zdGF0ZSA9IG4gLyB0aGlzLm9wdGlvbnMuZHVyYXRpb247CisKKwkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKKwkJCXRoaXMucG9zID0galF1ZXJ5LmVhc2luZ1t0aGlzLm9wdGlvbnMuZWFzaW5nIHx8IChqUXVlcnkuZWFzaW5nLnN3aW5nID8gInN3aW5nIiA6ICJsaW5lYXIiKV0odGhpcy5zdGF0ZSwgbiwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsKKwkJCXRoaXMubm93ID0gdGhpcy5zdGFydCArICgodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KSAqIHRoaXMucG9zKTsKKworCQkJLy8gUGVyZm9ybSB0aGUgbmV4dCBzdGVwIG9mIHRoZSBhbmltYXRpb24KKwkJCXRoaXMudXBkYXRlKCk7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK307CisKK2pRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwgeworCXNwZWVkczp7CisJCXNsb3c6IDYwMCwKKyAJCWZhc3Q6IDIwMCwKKyAJCS8vIERlZmF1bHQgc3BlZWQKKyAJCV9kZWZhdWx0OiA0MDAKKwl9LAorCXN0ZXA6IHsKKworCQlvcGFjaXR5OiBmdW5jdGlvbihmeCl7CisJCQlqUXVlcnkuYXR0cihmeC5lbGVtLnN0eWxlLCAib3BhY2l0eSIsIGZ4Lm5vdyk7CisJCX0sCisKKwkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4KXsKKwkJCWlmICggZnguZWxlbS5zdHlsZSAmJiBmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gIT0gbnVsbCApCisJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gZngubm93ICsgZngudW5pdDsKKwkJCWVsc2UKKwkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CisJCX0KKwl9Cit9KTsKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiXSApCisJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CisJCWlmICggdGhpc1swXSA9PT0gdGhpc1swXS5vd25lckRvY3VtZW50LmJvZHkgKSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCB0aGlzWzBdICk7CisJCXZhciBib3ggID0gdGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZG9jID0gdGhpc1swXS5vd25lckRvY3VtZW50LCBib2R5ID0gZG9jLmJvZHksIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAorCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKKwkJCXRvcCAgPSBib3gudG9wICArIChzZWxmLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbFRvcCAgfHwgYm9keS5zY3JvbGxUb3AgKSAtIGNsaWVudFRvcCwKKwkJCWxlZnQgPSBib3gubGVmdCArIChzZWxmLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtIGNsaWVudExlZnQ7CisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKK2Vsc2UgCisJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CisJCWlmICggdGhpc1swXSA9PT0gdGhpc1swXS5vd25lckRvY3VtZW50LmJvZHkgKSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCB0aGlzWzBdICk7CisJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZWQgfHwgalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CisKKwkJdmFyIGVsZW0gPSB0aGlzWzBdLCBvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwgcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCisJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAorCQkJYm9keSA9IGRvYy5ib2R5LCBkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldywKKwkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSwKKwkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OworCisJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKKwkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOworCQkJdG9wIC09IGVsZW0uc2Nyb2xsVG9wLCBsZWZ0IC09IGVsZW0uc2Nyb2xsTGVmdDsKKwkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgeworCQkJCXRvcCArPSBlbGVtLm9mZnNldFRvcCwgbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CisJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzICYmIC9edChhYmxlfGR8aCkkL2kudGVzdChlbGVtLnRhZ05hbWUpKSApCisJCQkJCXRvcCAgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgsICAxMCkgfHwgMCwKKwkJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOworCQkJCXByZXZPZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQsIG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50OworCQkJfQorCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQorCQkJCXRvcCAgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgsICAxMCkgfHwgMCwKKwkJCQlsZWZ0ICs9IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGU7CisJCX0KKworCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGljIiApCisJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wLAorCQkJbGVmdCArPSBib2R5Lm9mZnNldExlZnQ7CisKKwkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApCisJCQl0b3AgICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCksCisJCQlsZWZ0ICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0KTsKKworCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OworCX07CisKK2pRdWVyeS5vZmZzZXQgPSB7CisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCWlmICggdGhpcy5pbml0aWFsaXplZCApIHJldHVybjsKKwkJdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5LCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5uZXJEaXYsIGNoZWNrRGl2LCB0YWJsZSwgdGQsIHJ1bGVzLCBwcm9wLCBib2R5TWFyZ2luVG9wID0gYm9keS5zdHlsZS5tYXJnaW5Ub3AsCisJCQlodG1sID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPic7CisKKwkJcnVsZXMgPSB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6IDAsIGxlZnQ6IDAsIG1hcmdpbjogMCwgYm9yZGVyOiAwLCB3aWR0aDogJzFweCcsIGhlaWdodDogJzFweCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH07CisJCWZvciAoIHByb3AgaW4gcnVsZXMgKSBjb250YWluZXIuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTsKKworCQljb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKKwkJYm9keS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQpOworCQlpbm5lckRpdiA9IGNvbnRhaW5lci5maXJzdENoaWxkLCBjaGVja0RpdiA9IGlubmVyRGl2LmZpcnN0Q2hpbGQsIHRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOworCisJCXRoaXMuZG9lc05vdEFkZEJvcmRlciA9IChjaGVja0Rpdi5vZmZzZXRUb3AgIT09IDUpOworCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CisKKwkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgaW5uZXJEaXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQl0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSA9IChjaGVja0Rpdi5vZmZzZXRUb3AgPT09IC01KTsKKworCQlib2R5LnN0eWxlLm1hcmdpblRvcCA9ICcxcHgnOworCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wID09PSAwKTsKKwkJYm9keS5zdHlsZS5tYXJnaW5Ub3AgPSBib2R5TWFyZ2luVG9wOworCisJCWJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTsKKwkJdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisJfSwKKworCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKGJvZHkpIHsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKKwkJdmFyIHRvcCA9IGJvZHkub2Zmc2V0VG9wLCBsZWZ0ID0gYm9keS5vZmZzZXRMZWZ0OworCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKQorCQkJdG9wICArPSBwYXJzZUludCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luVG9wJywgIHRydWUpLCAxMCApIHx8IDAsCisJCQlsZWZ0ICs9IHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGJvZHksICdtYXJnaW5MZWZ0JywgdHJ1ZSksIDEwICkgfHwgMDsKKwkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9Cit9OworCisKK2pRdWVyeS5mbi5leHRlbmQoeworCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKwkJdmFyIGxlZnQgPSAwLCB0b3AgPSAwLCByZXN1bHRzOworCisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKSwKKworCQkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cworCQkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKKwkJCXBhcmVudE9mZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKKworCQkJLy8gU3VidHJhY3QgZWxlbWVudCBtYXJnaW5zCisJCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdCAKKwkJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCisJCQlvZmZzZXQudG9wICAtPSBudW0oIHRoaXMsICdtYXJnaW5Ub3AnICApOworCQkJb2Zmc2V0LmxlZnQgLT0gbnVtKCB0aGlzLCAnbWFyZ2luTGVmdCcgKTsKKworCQkJLy8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzCisJCQlwYXJlbnRPZmZzZXQudG9wICArPSBudW0oIG9mZnNldFBhcmVudCwgJ2JvcmRlclRvcFdpZHRoJyAgKTsKKwkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyApOworCisJCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNldHMKKwkJCXJlc3VsdHMgPSB7CisJCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQudG9wLAorCQkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQKKwkJCX07CisJCX0KKworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKKwkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXNbMF0ub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CisJCXdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghL15ib2R5fGh0bWwkL2kudGVzdChvZmZzZXRQYXJlbnQudGFnTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicpID09ICdzdGF0aWMnKSApCisJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OworCQlyZXR1cm4galF1ZXJ5KG9mZnNldFBhcmVudCk7CisJfQorfSk7CisKKworLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCitqUXVlcnkuZWFjaCggWydMZWZ0JywgJ1RvcCddLCBmdW5jdGlvbihpLCBuYW1lKSB7CisJdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsgbmFtZTsKKwkKKwlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24odmFsKSB7CisJCWlmICghdGhpc1swXSkgcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KKworCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJdGhpcyA9PSB3aW5kb3cgfHwgdGhpcyA9PSBkb2N1bWVudCA/CisJCQkJCXdpbmRvdy5zY3JvbGxUbygKKwkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xsTGVmdCgpLAorCQkJCQkJIGkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoKQorCQkJCQkpIDoKKwkJCQkJdGhpc1sgbWV0aG9kIF0gPSB2YWw7CisJCQl9KSA6CisKKwkJCS8vIFJldHVybiB0aGUgc2Nyb2xsIG9mZnNldAorCQkJdGhpc1swXSA9PSB3aW5kb3cgfHwgdGhpc1swXSA9PSBkb2N1bWVudCA/CisJCQkJc2VsZlsgaSA/ICdwYWdlWU9mZnNldCcgOiAncGFnZVhPZmZzZXQnIF0gfHwKKwkJCQkJalF1ZXJ5LmJveE1vZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gfHwKKwkJCQkJZG9jdW1lbnQuYm9keVsgbWV0aG9kIF0gOgorCQkJCXRoaXNbMF1bIG1ldGhvZCBdOworCX07Cit9KTsKKy8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcworalF1ZXJ5LmVhY2goWyAiSGVpZ2h0IiwgIldpZHRoIiBdLCBmdW5jdGlvbihpLCBuYW1lKXsKKworCXZhciB0bCA9IGkgPyAiTGVmdCIgIDogIlRvcCIsICAvLyB0b3Agb3IgbGVmdAorCQliciA9IGkgPyAiUmlnaHQiIDogIkJvdHRvbSIsIC8vIGJvdHRvbSBvciByaWdodAorCQlsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKworCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCisJalF1ZXJ5LmZuWyJpbm5lciIgKyBuYW1lXSA9IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzWzBdID8KKwkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIGxvd2VyLCBmYWxzZSwgInBhZGRpbmciICkgOgorCQkJbnVsbDsKKwl9OworCisJLy8gb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGgKKwlqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CisJCXJldHVybiB0aGlzWzBdID8KKwkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIGxvd2VyLCBmYWxzZSwgbWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApIDoKKwkJCW51bGw7CisJfTsKKwkKKwl2YXIgdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKworCWpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIHNpemUgKSB7CisJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CisJCXJldHVybiB0aGlzWzBdID09IHdpbmRvdyA/CisJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCisJCQlkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CisJCQlkb2N1bWVudC5ib2R5WyAiY2xpZW50IiArIG5hbWUgXSA6CisKKwkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKKwkJCXRoaXNbMF0gPT0gZG9jdW1lbnQgPworCQkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKKwkJCQlNYXRoLm1heCgKKwkJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiICsgbmFtZV0sCisJCQkJCWRvY3VtZW50LmJvZHlbInNjcm9sbCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiICsgbmFtZV0sCisJCQkJCWRvY3VtZW50LmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KKwkJCQkpIDoKKworCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJCQkJc2l6ZSA9PT0gdW5kZWZpbmVkID8KKwkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAorCQkJCQkodGhpcy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlICkgOiBudWxsKSA6CisKKwkJCQkJLy8gU2V0IHRoZSB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQgKGRlZmF1bHQgdG8gcGl4ZWxzIGlmIHZhbHVlIGlzIHVuaXRsZXNzKQorCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7CisJfTsKKworfSk7Cit9KSgpOwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvanF1ZXJ5LXVpLTEuNy4yLmZ1bGwubWluLmpzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvanF1ZXJ5LXVpLTEuNy4yLmZ1bGwubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTdmZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9qcXVlcnktdWktMS43LjIuZnVsbC5taW4uanMKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBqUXVlcnkgVUkgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSQorICovCitqUXVlcnkudWl8fChmdW5jdGlvbihjKXt2YXIgaT1jLmZuLnJlbW92ZSxkPWMuYnJvd3Nlci5tb3ppbGxhJiYocGFyc2VGbG9hdChjLmJyb3dzZXIudmVyc2lvbik8MS45KTtjLnVpPXt2ZXJzaW9uOiIxLjcuMiIscGx1Z2luOnthZGQ6ZnVuY3Rpb24oayxsLG4pe3ZhciBtPWMudWlba10ucHJvdG90eXBlO2Zvcih2YXIgaiBpbiBuKXttLnBsdWdpbnNbal09bS5wbHVnaW5zW2pdfHxbXTttLnBsdWdpbnNbal0ucHVzaChbbCxuW2pdXSl9fSxjYWxsOmZ1bmN0aW9uKGosbCxrKXt2YXIgbj1qLnBsdWdpbnNbbF07aWYoIW58fCFqLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSl7cmV0dXJufWZvcih2YXIgbT0wO208bi5sZW5ndGg7bSsrKXtpZihqLm9wdGlvbnNbblttXVswXV0pe25bbV1bMV0uYXBwbHkoai5lbGVtZW50LGspfX19fSxjb250YWluczpmdW5jdGlvbihrLGope3JldHVybiBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9rLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGopJjE2OmshPT1qJiZrLmNvbnRhaW5zKGopfSxoYXNTY3JvbGw6ZnVuY3Rpb24obSxrKXtpZihjKG0pLmNzcygib3ZlcmZsb3ciKT09ImhpZGRlbiIpe3JldHVybiBmYWxzZX12YXIgaj0oayYmaz09ImxlZnQiKT8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsbD1mYWxzZTtpZihtW2pdPjApe3JldHVybiB0cnVlfW1bal09MTtsPShtW2pdPjApO21bal09MDtyZXR1cm4gbH0saXNPdmVyQXhpczpmdW5jdGlvbihrLGosbCl7cmV0dXJuKGs+aikmJihrPChqK2wpKX0saXNPdmVyOmZ1bmN0aW9uKG8sayxuLG0saixsKXtyZXR1cm4gYy51aS5pc092ZXJBeGlzKG8sbixqKSYmYy51aS5pc092ZXJBeGlzKGssbSxsKX0sa2V5Q29kZTp7QkFDS1NQQUNFOjgsQ0FQU19MT0NLOjIwLENPTU1BOjE4OCxDT05UUk9MOjE3LERFTEVURTo0NixET1dOOjQwLEVORDozNSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixJTlNFUlQ6NDUsTEVGVDozNyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTSElGVDoxNixTUEFDRTozMixUQUI6OSxVUDozOH19O2lmKGQpe3ZhciBmPWMuYXR0cixlPWMuZm4ucmVtb3ZlQXR0cixoPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA3L2FhYSIsYT0vXmFyaWEtLyxiPS9ed2Fpcm9sZTovO2MuYXR0cj1mdW5jdGlvbihrLGosbCl7dmFyIG09bCE9PXVuZGVmaW5lZDtyZXR1cm4oaj09InJvbGUiPyhtP2YuY2FsbCh0aGlzLGssaiwid2Fpcm9sZToiK2wpOihmLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8IiIpLnJlcGxhY2UoYiwiIikpOihhLnRlc3Qoaik/KG0/ay5zZXRBdHRyaWJ1dGVOUyhoLGoucmVwbGFjZShhLCJhYWE6IiksbCk6Zi5jYWxsKHRoaXMsayxqLnJlcGxhY2UoYSwiYWFhOiIpKSk6Zi5hcHBseSh0aGlzLGFyZ3VtZW50cykpKX07Yy5mbi5yZW1vdmVBdHRyPWZ1bmN0aW9uKGope3JldHVybihhLnRlc3Qoaik/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhoLGoucmVwbGFjZShhLCIiKSl9KTplLmNhbGwodGhpcyxqKSl9fWMuZm4uZXh0ZW5kKHtyZW1vdmU6ZnVuY3Rpb24oKXtjKCIqIix0aGlzKS5hZGQodGhpcykuZWFjaChmdW5jdGlvbigpe2ModGhpcykudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfSk7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvZmYiKS5jc3MoIk1velVzZXJTZWxlY3QiLCIiKS51bmJpbmQoInNlbGVjdHN0YXJ0LnVpIil9LGRpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmNzcygiTW96VXNlclNlbGVjdCIsIm5vbmUiKS5iaW5kKCJzZWxlY3RzdGFydC51aSIsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KX0sc2Nyb2xsUGFyZW50OmZ1bmN0aW9uKCl7dmFyIGo7aWYoKGMuYnJvd3Nlci5tc2llJiYoLyhzdGF0aWN8cmVsYXRpdmUpLykudGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSkpfHwoL2Fic29sdXRlLykudGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSkpe2o9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuKC8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLykudGVzdChjLmN1ckNTUyh0aGlzLCJwb3NpdGlvbiIsMSkpJiYoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KGMuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKX1lbHNle2o9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuKC8oYXV0b3xzY3JvbGwpLykudGVzdChjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYy5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYy5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCl9cmV0dXJuKC9maXhlZC8pLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhai5sZW5ndGg/Yyhkb2N1bWVudCk6an19KTtjLmV4dGVuZChjLmV4cHJbIjoiXSx7ZGF0YTpmdW5jdGlvbihsLGssail7cmV0dXJuICEhYy5kYXRhKGwsalszXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihrKXt2YXIgbD1rLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaj1jLmF0dHIoaywidGFiaW5kZXgiKTtyZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGwpPyFrLmRpc2FibGVkOiJhIj09bHx8ImFyZWEiPT1sP2suaHJlZnx8IWlzTmFOKGopOiFpc05hTihqKSkmJiFjKGspWyJhcmVhIj09bD8icGFyZW50cyI6ImNsb3Nlc3QiXSgiOmhpZGRlbiIpLmxlbmd0aH0sdGFiYmFibGU6ZnVuY3Rpb24oayl7dmFyIGo9Yy5hdHRyKGssInRhYmluZGV4Iik7cmV0dXJuKGlzTmFOKGopfHxqPj0wKSYmYyhrKS5pcygiOmZvY3VzYWJsZSIpfX0pO2Z1bmN0aW9uIGcobSxuLG8sbCl7ZnVuY3Rpb24gayhxKXt2YXIgcD1jW21dW25dW3FdfHxbXTtyZXR1cm4odHlwZW9mIHA9PSJzdHJpbmciP3Auc3BsaXQoLyw/XHMrLyk6cCl9dmFyIGo9aygiZ2V0dGVyIik7aWYobC5sZW5ndGg9PTEmJnR5cGVvZiBsWzBdPT0ic3RyaW5nIil7aj1qLmNvbmNhdChrKCJnZXR0ZXJTZXR0ZXIiKSl9cmV0dXJuKGMuaW5BcnJheShvLGopIT0tMSl9Yy53aWRnZXQ9ZnVuY3Rpb24oayxqKXt2YXIgbD1rLnNwbGl0KCIuIilbMF07az1rLnNwbGl0KCIuIilbMV07Yy5mbltrXT1mdW5jdGlvbihwKXt2YXIgbj0odHlwZW9mIHA9PSJzdHJpbmciKSxvPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtpZihuJiZwLnN1YnN0cmluZygwLDEpPT0iXyIpe3JldHVybiB0aGlzfWlmKG4mJmcobCxrLHAsbykpe3ZhciBtPWMuZGF0YSh0aGlzWzBdLGspO3JldHVybihtP21bcF0uYXBwbHkobSxvKTp1bmRlZmluZWQpfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcT1jLmRhdGEodGhpcyxrKTsoIXEmJiFuJiZjLmRhdGEodGhpcyxrLG5ldyBjW2xdW2tdKHRoaXMscCkpLl9pbml0KCkpOyhxJiZuJiZjLmlzRnVuY3Rpb24ocVtwXSkmJnFbcF0uYXBwbHkocSxvKSl9KX07Y1tsXT1jW2xdfHx7fTtjW2xdW2tdPWZ1bmN0aW9uKG8sbil7dmFyIG09dGhpczt0aGlzLm5hbWVzcGFjZT1sO3RoaXMud2lkZ2V0TmFtZT1rO3RoaXMud2lkZ2V0RXZlbnRQcmVmaXg9Y1tsXVtrXS5ldmVudFByZWZpeHx8azt0aGlzLndpZGdldEJhc2VDbGFzcz1sKyItIitrO3RoaXMub3B0aW9ucz1jLmV4dGVuZCh7fSxjLndpZGdldC5kZWZhdWx0cyxjW2xdW2tdLmRlZmF1bHRzLGMubWV0YWRhdGEmJmMubWV0YWRhdGEuZ2V0KG8pW2tdLG4pO3RoaXMuZWxlbWVudD1jKG8pLmJpbmQoInNldERhdGEuIitrLGZ1bmN0aW9uKHEscCxyKXtpZihxLnRhcmdldD09byl7cmV0dXJuIG0uX3NldERhdGEocCxyKX19KS5iaW5kKCJnZXREYXRhLiIrayxmdW5jdGlvbihxLHApe2lmKHEudGFyZ2V0PT1vKXtyZXR1cm4gbS5fZ2V0RGF0YShwKX19KS5iaW5kKCJyZW1vdmUiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uZGVzdHJveSgpfSl9O2NbbF1ba10ucHJvdG90eXBlPWMuZXh0ZW5kKHt9LGMud2lkZ2V0LnByb3RvdHlwZSxqKTtjW2xdW2tdLmdldHRlclNldHRlcj0ib3B0aW9uIn07Yy53aWRnZXQucHJvdG90eXBlPXtfaW5pdDpmdW5jdGlvbigpe30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQ2xhc3ModGhpcy53aWRnZXRCYXNlQ2xhc3MrIi1kaXNhYmxlZCAiK3RoaXMubmFtZXNwYWNlKyItc3RhdGUtZGlzYWJsZWQiKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIil9LG9wdGlvbjpmdW5jdGlvbihsLG0pe3ZhciBrPWwsaj10aGlzO2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7aWYobT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMuX2dldERhdGEobCl9az17fTtrW2xdPW19Yy5lYWNoKGssZnVuY3Rpb24obixvKXtqLl9zZXREYXRhKG4sbyl9KX0sX2dldERhdGE6ZnVuY3Rpb24oail7cmV0dXJuIHRoaXMub3B0aW9uc1tqXX0sX3NldERhdGE6ZnVuY3Rpb24oaixrKXt0aGlzLm9wdGlvbnNbal09aztpZihqPT0iZGlzYWJsZWQiKXt0aGlzLmVsZW1lbnRbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQgIit0aGlzLm5hbWVzcGFjZSsiLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsayl9fSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9zZXREYXRhKCJkaXNhYmxlZCIsZmFsc2UpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0RGF0YSgiZGlzYWJsZWQiLHRydWUpfSxfdHJpZ2dlcjpmdW5jdGlvbihsLG0sbil7dmFyIHA9dGhpcy5vcHRpb25zW2xdLGo9KGw9PXRoaXMud2lkZ2V0RXZlbnRQcmVmaXg/bDp0aGlzLndpZGdldEV2ZW50UHJlZml4K2wpO209Yy5FdmVudChtKTttLnR5cGU9ajtpZihtLm9yaWdpbmFsRXZlbnQpe2Zvcih2YXIgaz1jLmV2ZW50LnByb3BzLmxlbmd0aCxvO2s7KXtvPWMuZXZlbnQucHJvcHNbLS1rXTttW29dPW0ub3JpZ2luYWxFdmVudFtvXX19dGhpcy5lbGVtZW50LnRyaWdnZXIobSxuKTtyZXR1cm4gIShjLmlzRnVuY3Rpb24ocCkmJnAuY2FsbCh0aGlzLmVsZW1lbnRbMF0sbSxuKT09PWZhbHNlfHxtLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19O2Mud2lkZ2V0LmRlZmF1bHRzPXtkaXNhYmxlZDpmYWxzZX07Yy51aS5tb3VzZT17X21vdXNlSW5pdDpmdW5jdGlvbigpe3ZhciBqPXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihrKXtyZXR1cm4gai5fbW91c2VEb3duKGspfSkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oayl7aWYoai5fcHJldmVudENsaWNrRXZlbnQpe2ouX3ByZXZlbnRDbGlja0V2ZW50PWZhbHNlO2suc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7cmV0dXJuIGZhbHNlfX0pO2lmKGMuYnJvd3Nlci5tc2llKXt0aGlzLl9tb3VzZVVuc2VsZWN0YWJsZT10aGlzLmVsZW1lbnQuYXR0cigidW5zZWxlY3RhYmxlIik7dGhpcy5lbGVtZW50LmF0dHIoInVuc2VsZWN0YWJsZSIsIm9uIil9dGhpcy5zdGFydGVkPWZhbHNlfSxfbW91c2VEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKTsoYy5icm93c2VyLm1zaWUmJnRoaXMuZWxlbWVudC5hdHRyKCJ1bnNlbGVjdGFibGUiLHRoaXMuX21vdXNlVW5zZWxlY3RhYmxlKSl9LF9tb3VzZURvd246ZnVuY3Rpb24obCl7bC5vcmlnaW5hbEV2ZW50PWwub3JpZ2luYWxFdmVudHx8e307aWYobC5vcmlnaW5hbEV2ZW50Lm1vdXNlSGFuZGxlZCl7cmV0dXJufSh0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAobCkpO3RoaXMuX21vdXNlRG93bkV2ZW50PWw7dmFyIGs9dGhpcyxtPShsLndoaWNoPT0xKSxqPSh0eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyI/YyhsLnRhcmdldCkucGFyZW50cygpLmFkZChsLnRhcmdldCkuZmlsdGVyKHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDpmYWxzZSk7aWYoIW18fGp8fCF0aGlzLl9tb3VzZUNhcHR1cmUobCkpe3JldHVybiB0cnVlfXRoaXMubW91c2VEZWxheU1ldD0hdGhpcy5vcHRpb25zLmRlbGF5O2lmKCF0aGlzLm1vdXNlRGVsYXlNZXQpe3RoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ay5tb3VzZURlbGF5TWV0PXRydWV9LHRoaXMub3B0aW9ucy5kZWxheSl9aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChsKSYmdGhpcy5fbW91c2VEZWxheU1ldChsKSl7dGhpcy5fbW91c2VTdGFydGVkPSh0aGlzLl9tb3VzZVN0YXJ0KGwpIT09ZmFsc2UpO2lmKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpe2wucHJldmVudERlZmF1bHQoKTtyZXR1cm4gdHJ1ZX19dGhpcy5fbW91c2VNb3ZlRGVsZWdhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGsuX21vdXNlTW92ZShuKX07dGhpcy5fbW91c2VVcERlbGVnYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBrLl9tb3VzZVVwKG4pfTtjKGRvY3VtZW50KS5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKTsoYy5icm93c2VyLnNhZmFyaXx8bC5wcmV2ZW50RGVmYXVsdCgpKTtsLm9yaWdpbmFsRXZlbnQubW91c2VIYW5kbGVkPXRydWU7cmV0dXJuIHRydWV9LF9tb3VzZU1vdmU6ZnVuY3Rpb24oail7aWYoYy5icm93c2VyLm1zaWUmJiFqLmJ1dHRvbil7cmV0dXJuIHRoaXMuX21vdXNlVXAoail9aWYodGhpcy5fbW91c2VTdGFydGVkKXt0aGlzLl9tb3VzZURyYWcoaik7cmV0dXJuIGoucHJldmVudERlZmF1bHQoKX1pZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGopJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGopKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9KHRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsaikhPT1mYWxzZSk7KHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcoaik6dGhpcy5fbW91c2VVcChqKSl9cmV0dXJuICF0aGlzLl9tb3VzZVN0YXJ0ZWR9LF9tb3VzZVVwOmZ1bmN0aW9uKGope2MoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKTtpZih0aGlzLl9tb3VzZVN0YXJ0ZWQpe3RoaXMuX21vdXNlU3RhcnRlZD1mYWxzZTt0aGlzLl9wcmV2ZW50Q2xpY2tFdmVudD0oai50YXJnZXQ9PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCk7dGhpcy5fbW91c2VTdG9wKGopfXJldHVybiBmYWxzZX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oail7cmV0dXJuKE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWoucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWoucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlKX0sX21vdXNlRGVsYXlNZXQ6ZnVuY3Rpb24oail7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oail7fSxfbW91c2VEcmFnOmZ1bmN0aW9uKGope30sX21vdXNlU3RvcDpmdW5jdGlvbihqKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oail7cmV0dXJuIHRydWV9fTtjLnVpLm1vdXNlLmRlZmF1bHRzPXtjYW5jZWw6bnVsbCxkaXN0YW5jZToxLGRlbGF5OjB9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBEcmFnZ2FibGUgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9EcmFnZ2FibGVzCisgKgorICogRGVwZW5kczoKKyAqCXVpLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGEuZXh0ZW5kKHt9LGEudWkubW91c2Use19pbml0OmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmhlbHBlcj09Im9yaWdpbmFsIiYmISgvXig/OnJ8YXxmKS8pLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSkpe3RoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUifSh0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSk7KHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSk7dGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmRhdGEoImRyYWdnYWJsZSIpKXtyZXR1cm59dGhpcy5lbGVtZW50LnJlbW92ZURhdGEoImRyYWdnYWJsZSIpLnVuYmluZCgiLmRyYWdnYWJsZSIpLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpO3RoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucztpZih0aGlzLmhlbHBlcnx8Yy5kaXNhYmxlZHx8YShiLnRhcmdldCkuaXMoIi51aS1yZXNpemFibGUtaGFuZGxlIikpe3JldHVybiBmYWxzZX10aGlzLmhhbmRsZT10aGlzLl9nZXRIYW5kbGUoYik7aWYoIXRoaXMuaGFuZGxlKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9uczt0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoYik7dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKGEudWkuZGRtYW5hZ2VyKXthLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXN9dGhpcy5fY2FjaGVNYXJnaW5zKCk7dGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIik7dGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCk7dGhpcy5vZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpO3RoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fTthLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KTt0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKTt0aGlzLm9yaWdpbmFsUGFnZVg9Yi5wYWdlWDt0aGlzLm9yaWdpbmFsUGFnZVk9Yi5wYWdlWTtpZihjLmN1cnNvckF0KXt0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGMuY3Vyc29yQXQpfWlmKGMuY29udGFpbm1lbnQpe3RoaXMuX3NldENvbnRhaW5tZW50KCl9dGhpcy5fdHJpZ2dlcigic3RhcnQiLGIpO3RoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKTtpZihhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91cil7YS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLmhlbHBlci5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRyYWdnaW5nIik7dGhpcy5fbW91c2VEcmFnKGIsdHJ1ZSk7cmV0dXJuIHRydWV9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYixkKXt0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYik7dGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTtpZighZCl7dmFyIGM9dGhpcy5fdWlIYXNoKCk7dGhpcy5fdHJpZ2dlcigiZHJhZyIsYixjKTt0aGlzLnBvc2l0aW9uPWMucG9zaXRpb259aWYoIXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLm9wdGlvbnMuYXhpcyE9InkiKXt0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgifWlmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil7dGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCJ9aWYoYS51aS5kZG1hbmFnZXIpe2EudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyxiKX1yZXR1cm4gZmFsc2V9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYyl7dmFyIGQ9ZmFsc2U7aWYoYS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91cil7ZD1hLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYyl9aWYodGhpcy5kcm9wcGVkKXtkPXRoaXMuZHJvcHBlZDt0aGlzLmRyb3BwZWQ9ZmFsc2V9aWYoKHRoaXMub3B0aW9ucy5yZXZlcnQ9PSJpbnZhbGlkIiYmIWQpfHwodGhpcy5vcHRpb25zLnJldmVydD09InZhbGlkIiYmZCl8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PT10cnVlfHwoYS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LGQpKSl7dmFyIGI9dGhpczthKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7Yi5fdHJpZ2dlcigic3RvcCIsYyk7Yi5fY2xlYXIoKX0pfWVsc2V7dGhpcy5fdHJpZ2dlcigic3RvcCIsYyk7dGhpcy5fY2xlYXIoKX1yZXR1cm4gZmFsc2V9LF9nZXRIYW5kbGU6ZnVuY3Rpb24oYil7dmFyIGM9IXRoaXMub3B0aW9ucy5oYW5kbGV8fCFhKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5sZW5ndGg/dHJ1ZTpmYWxzZTthKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXtpZih0aGlzPT1iLnRhcmdldCl7Yz10cnVlfX0pO3JldHVybiBjfSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMub3B0aW9uczt2YXIgYj1hLmlzRnVuY3Rpb24oZC5oZWxwZXIpP2EoZC5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtjXSkpOihkLmhlbHBlcj09ImNsb25lIj90aGlzLmVsZW1lbnQuY2xvbmUoKTp0aGlzLmVsZW1lbnQpO2lmKCFiLnBhcmVudHMoImJvZHkiKS5sZW5ndGgpe2IuYXBwZW5kVG8oKGQuYXBwZW5kVG89PSJwYXJlbnQiP3RoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlOmQuYXBwZW5kVG8pKX1pZihiWzBdIT10aGlzLmVsZW1lbnRbMF0mJiEoLyhmaXhlZHxhYnNvbHV0ZSkvKS50ZXN0KGIuY3NzKCJwb3NpdGlvbiIpKSl7Yi5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKX1yZXR1cm4gYn0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24oYil7aWYoYi5sZWZ0IT11bmRlZmluZWQpe3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9Yi5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0fWlmKGIucmlnaHQhPXVuZGVmaW5lZCl7dGhpcy5vZmZzZXQuY2xpY2subGVmdD10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLWIucmlnaHQrdGhpcy5tYXJnaW5zLmxlZnR9aWYoYi50b3AhPXVuZGVmaW5lZCl7dGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3B9aWYoYi5ib3R0b20hPXVuZGVmaW5lZCl7dGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LWIuYm90dG9tK3RoaXMubWFyZ2lucy50b3B9fSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIGI9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7aWYodGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSl7Yi5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk7Yi50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpfWlmKCh0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keSl8fCh0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpKXtiPXt0b3A6MCxsZWZ0OjB9fXJldHVybnt0b3A6Yi50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6Yi5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiKXt2YXIgYj10aGlzLmVsZW1lbnQucG9zaXRpb24oKTtyZXR1cm57dG9wOmIudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDpiLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1lbHNle3JldHVybnt0b3A6MCxsZWZ0OjB9fX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDoocGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCksdG9wOihwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDApfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnM7aWYoZS5jb250YWlubWVudD09InBhcmVudCIpe2UuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZX1pZihlLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQifHxlLmNvbnRhaW5tZW50PT0id2luZG93Iil7dGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsYShlLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChhKGUuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF19aWYoISgvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvKS50ZXN0KGUuY29udGFpbm1lbnQpJiZlLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yIT1BcnJheSl7dmFyIGM9YShlLmNvbnRhaW5tZW50KVswXTtpZighYyl7cmV0dXJufXZhciBkPWEoZS5jb250YWlubWVudCkub2Zmc2V0KCk7dmFyIGI9KGEoYykuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIik7dGhpcy5jb250YWlubWVudD1bZC5sZWZ0KyhwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsZC5sZWZ0KyhiP01hdGgubWF4KGMuc2Nyb2xsV2lkdGgsYy5vZmZzZXRXaWR0aCk6Yy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGQudG9wKyhiP01hdGgubWF4KGMuc2Nyb2xsSGVpZ2h0LGMub2Zmc2V0SGVpZ2h0KTpjLm9mZnNldEhlaWdodCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXX1lbHNle2lmKGUuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5KXt0aGlzLmNvbnRhaW5tZW50PWUuY29udGFpbm1lbnR9fX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGYsaCl7aWYoIWgpe2g9dGhpcy5wb3NpdGlvbn12YXIgYz1mPT0iYWJzb2x1dGUiPzE6LTE7dmFyIGU9dGhpcy5vcHRpb25zLGI9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmISh0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPSgvKGh0bWx8Ym9keSkvaSkudGVzdChiWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6KGgudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpjK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqYy0oYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTooZz8wOmIuc2Nyb2xsVG9wKCkpKSpjKSksbGVmdDooaC5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqYyt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpjLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Yi5zY3JvbGxMZWZ0KCkpKmMpKX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUpe3ZhciBoPXRoaXMub3B0aW9ucyxiPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJiEodGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsaT0oLyhodG1sfGJvZHkpL2kpLnRlc3QoYlswXS50YWdOYW1lKTtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiJiYhKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPXRoaXMub2Zmc2V0UGFyZW50WzBdKSl7dGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX12YXIgZD1lLnBhZ2VYO3ZhciBjPWUucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXtpZih0aGlzLmNvbnRhaW5tZW50KXtpZihlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXSl7ZD10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnR9aWYoZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSl7Yz10aGlzLmNvbnRhaW5tZW50WzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcH1pZihlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSl7ZD10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnR9aWYoZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXSl7Yz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcH19aWYoaC5ncmlkKXt2YXIgZz10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoYy10aGlzLm9yaWdpbmFsUGFnZVkpL2guZ3JpZFsxXSkqaC5ncmlkWzFdO2M9dGhpcy5jb250YWlubWVudD8oIShnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdKT9nOighKGctdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0pP2ctaC5ncmlkWzFdOmcraC5ncmlkWzFdKSk6Zzt2YXIgZj10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoZC10aGlzLm9yaWdpbmFsUGFnZVgpL2guZ3JpZFswXSkqaC5ncmlkWzBdO2Q9dGhpcy5jb250YWlubWVudD8oIShmLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXXx8Zi10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0pP2Y6KCEoZi10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0pP2YtaC5ncmlkWzBdOmYraC5ncmlkWzBdKSk6Zn19cmV0dXJue3RvcDooYy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDoodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6KGk/MDpiLnNjcm9sbFRvcCgpKSkpKSxsZWZ0OihkLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aT8wOmIuc2Nyb2xsTGVmdCgpKSkpfX0sX2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpO2lmKHRoaXMuaGVscGVyWzBdIT10aGlzLmVsZW1lbnRbMF0mJiF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpe3RoaXMuaGVscGVyLnJlbW92ZSgpfXRoaXMuaGVscGVyPW51bGw7dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsPWZhbHNlfSxfdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCl7ZD1kfHx0aGlzLl91aUhhc2goKTthLnVpLnBsdWdpbi5jYWxsKHRoaXMsYixbYyxkXSk7aWYoYj09ImRyYWciKXt0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpfXJldHVybiBhLndpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGIsYyxkKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGIpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixhYnNvbHV0ZVBvc2l0aW9uOnRoaXMucG9zaXRpb25BYnMsb2Zmc2V0OnRoaXMucG9zaXRpb25BYnN9fX0pKTthLmV4dGVuZChhLnVpLmRyYWdnYWJsZSx7dmVyc2lvbjoiMS43LjIiLGV2ZW50UHJlZml4OiJkcmFnIixkZWZhdWx0czp7YWRkQ2xhc3Nlczp0cnVlLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ZmFsc2UsY2FuY2VsOiI6aW5wdXQsb3B0aW9uIixjb25uZWN0VG9Tb3J0YWJsZTpmYWxzZSxjb250YWlubWVudDpmYWxzZSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OmZhbHNlLGRlbGF5OjAsZGlzdGFuY2U6MSxncmlkOmZhbHNlLGhhbmRsZTpmYWxzZSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ZmFsc2Usb3BhY2l0eTpmYWxzZSxyZWZyZXNoUG9zaXRpb25zOmZhbHNlLHJldmVydDpmYWxzZSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDp0cnVlLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNuYXA6ZmFsc2Usc25hcE1vZGU6ImJvdGgiLHNuYXBUb2xlcmFuY2U6MjAsc3RhY2s6ZmFsc2UsekluZGV4OmZhbHNlfX0pO2EudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY29ubmVjdFRvU29ydGFibGUiLHtzdGFydDpmdW5jdGlvbihjLGUpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZj1kLm9wdGlvbnMsYj1hLmV4dGVuZCh7fSxlLHtpdGVtOmQuZWxlbWVudH0pO2Quc29ydGFibGVzPVtdO2EoZi5jb25uZWN0VG9Tb3J0YWJsZSkuZWFjaChmdW5jdGlvbigpe3ZhciBnPWEuZGF0YSh0aGlzLCJzb3J0YWJsZSIpO2lmKGcmJiFnLm9wdGlvbnMuZGlzYWJsZWQpe2Quc29ydGFibGVzLnB1c2goe2luc3RhbmNlOmcsc2hvdWxkUmV2ZXJ0Omcub3B0aW9ucy5yZXZlcnR9KTtnLl9yZWZyZXNoSXRlbXMoKTtnLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYyxiKX19KX0sc3RvcDpmdW5jdGlvbihjLGUpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksYj1hLmV4dGVuZCh7fSxlLHtpdGVtOmQuZWxlbWVudH0pO2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbigpe2lmKHRoaXMuaW5zdGFuY2UuaXNPdmVyKXt0aGlzLmluc3RhbmNlLmlzT3Zlcj0wO2QuY2FuY2VsSGVscGVyUmVtb3ZhbD10cnVlO3RoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD1mYWxzZTtpZih0aGlzLnNob3VsZFJldmVydCl7dGhpcy5pbnN0YW5jZS5vcHRpb25zLnJldmVydD10cnVlfXRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChjKTt0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyO2lmKGQub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCIpe3RoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSl9fWVsc2V7dGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPWZhbHNlO3RoaXMuaW5zdGFuY2UuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGMsYil9fSl9LGRyYWc6ZnVuY3Rpb24oYyxmKXt2YXIgZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGI9dGhpczt2YXIgZD1mdW5jdGlvbihpKXt2YXIgbj10aGlzLm9mZnNldC5jbGljay50b3AsbT10aGlzLm9mZnNldC5jbGljay5sZWZ0O3ZhciBnPXRoaXMucG9zaXRpb25BYnMudG9wLGs9dGhpcy5wb3NpdGlvbkFicy5sZWZ0O3ZhciBqPWkuaGVpZ2h0LGw9aS53aWR0aDt2YXIgcD1pLnRvcCxoPWkubGVmdDtyZXR1cm4gYS51aS5pc092ZXIoZytuLGsrbSxwLGgsaixsKX07YS5lYWNoKGUuc29ydGFibGVzLGZ1bmN0aW9uKGcpe3RoaXMuaW5zdGFuY2UucG9zaXRpb25BYnM9ZS5wb3NpdGlvbkFiczt0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zPWUuaGVscGVyUHJvcG9ydGlvbnM7dGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2s9ZS5vZmZzZXQuY2xpY2s7aWYodGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkpe2lmKCF0aGlzLmluc3RhbmNlLmlzT3Zlcil7dGhpcy5pbnN0YW5jZS5pc092ZXI9MTt0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtPWEoYikuY2xvbmUoKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLHRydWUpO3RoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI7dGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlcj1mdW5jdGlvbigpe3JldHVybiBmLmhlbHBlclswXX07Yy50YXJnZXQ9dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbVswXTt0aGlzLmluc3RhbmNlLl9tb3VzZUNhcHR1cmUoYyx0cnVlKTt0aGlzLmluc3RhbmNlLl9tb3VzZVN0YXJ0KGMsdHJ1ZSx0cnVlKTt0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay50b3A9ZS5vZmZzZXQuY2xpY2sudG9wO3RoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLmxlZnQ9ZS5vZmZzZXQuY2xpY2subGVmdDt0aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQubGVmdC09ZS5vZmZzZXQucGFyZW50LmxlZnQtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQ7dGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcC09ZS5vZmZzZXQucGFyZW50LnRvcC10aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQudG9wO2UuX3RyaWdnZXIoInRvU29ydGFibGUiLGMpO2UuZHJvcHBlZD10aGlzLmluc3RhbmNlLmVsZW1lbnQ7ZS5jdXJyZW50SXRlbT1lLmVsZW1lbnQ7dGhpcy5pbnN0YW5jZS5mcm9tT3V0c2lkZT1lfWlmKHRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0pe3RoaXMuaW5zdGFuY2UuX21vdXNlRHJhZyhjKX19ZWxzZXtpZih0aGlzLmluc3RhbmNlLmlzT3Zlcil7dGhpcy5pbnN0YW5jZS5pc092ZXI9MDt0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9dHJ1ZTt0aGlzLmluc3RhbmNlLm9wdGlvbnMucmV2ZXJ0PWZhbHNlO3RoaXMuaW5zdGFuY2UuX3RyaWdnZXIoIm91dCIsYyx0aGlzLmluc3RhbmNlLl91aUhhc2godGhpcy5pbnN0YW5jZSkpO3RoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChjLHRydWUpO3RoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXI7dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKTtpZih0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyKXt0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpfWUuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsYyk7ZS5kcm9wcGVkPWZhbHNlfX19KX19KTthLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImN1cnNvciIse3N0YXJ0OmZ1bmN0aW9uKGMsZCl7dmFyIGI9YSgiYm9keSIpLGU9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2lmKGIuY3NzKCJjdXJzb3IiKSl7ZS5fY3Vyc29yPWIuY3NzKCJjdXJzb3IiKX1iLmNzcygiY3Vyc29yIixlLmN1cnNvcil9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7aWYoZC5fY3Vyc29yKXthKCJib2R5IikuY3NzKCJjdXJzb3IiLGQuX2N1cnNvcil9fX0pO2EudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiaWZyYW1lRml4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7YShkLmlmcmFtZUZpeD09PXRydWU/ImlmcmFtZSI6ZC5pZnJhbWVGaXgpLmVhY2goZnVuY3Rpb24oKXthKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpLmNzcyh7d2lkdGg6dGhpcy5vZmZzZXRXaWR0aCsicHgiLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodCsicHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsb3BhY2l0eToiMC4wMDEiLHpJbmRleDoxMDAwfSkuY3NzKGEodGhpcykub2Zmc2V0KCkpLmFwcGVuZFRvKCJib2R5Iil9KX0sc3RvcDpmdW5jdGlvbihiLGMpe2EoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pfX0pO2EudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGMsZCl7dmFyIGI9YShkLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7aWYoYi5jc3MoIm9wYWNpdHkiKSl7ZS5fb3BhY2l0eT1iLmNzcygib3BhY2l0eSIpfWIuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2lmKGQuX29wYWNpdHkpe2EoYy5oZWxwZXIpLmNzcygib3BhY2l0eSIsZC5fb3BhY2l0eSl9fX0pO2EudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic2Nyb2xsIix7c3RhcnQ6ZnVuY3Rpb24oYyxkKXt2YXIgYj1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpO2lmKGIuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYi5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtiLm92ZXJmbG93T2Zmc2V0PWIuc2Nyb2xsUGFyZW50Lm9mZnNldCgpfX0sZHJhZzpmdW5jdGlvbihkLGUpe3ZhciBjPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZj1jLm9wdGlvbnMsYj1mYWxzZTtpZihjLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIil7aWYoIWYuYXhpc3x8Zi5heGlzIT0ieCIpe2lmKChjLm92ZXJmbG93T2Zmc2V0LnRvcCtjLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQpLWQucGFnZVk8Zi5zY3JvbGxTZW5zaXRpdml0eSl7Yy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWI9Yy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Yuc2Nyb2xsU3BlZWR9ZWxzZXtpZihkLnBhZ2VZLWMub3ZlcmZsb3dPZmZzZXQudG9wPGYuc2Nyb2xsU2Vuc2l0aXZpdHkpe2Muc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1iPWMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1mLnNjcm9sbFNwZWVkfX19aWYoIWYuYXhpc3x8Zi5heGlzIT0ieSIpe2lmKChjLm92ZXJmbG93T2Zmc2V0LmxlZnQrYy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgpLWQucGFnZVg8Zi5zY3JvbGxTZW5zaXRpdml0eSl7Yy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1iPWMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrZi5zY3JvbGxTcGVlZH1lbHNle2lmKGQucGFnZVgtYy5vdmVyZmxvd09mZnNldC5sZWZ0PGYuc2Nyb2xsU2Vuc2l0aXZpdHkpe2Muc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Yj1jLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWYuc2Nyb2xsU3BlZWR9fX19ZWxzZXtpZighZi5heGlzfHxmLmF4aXMhPSJ4Iil7aWYoZC5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxmLnNjcm9sbFNlbnNpdGl2aXR5KXtiPWEoZG9jdW1lbnQpLnNjcm9sbFRvcChhKGRvY3VtZW50KS5zY3JvbGxUb3AoKS1mLnNjcm9sbFNwZWVkKX1lbHNle2lmKGEod2luZG93KS5oZWlnaHQoKS0oZC5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8Zi5zY3JvbGxTZW5zaXRpdml0eSl7Yj1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrZi5zY3JvbGxTcGVlZCl9fX1pZighZi5heGlzfHxmLmF4aXMhPSJ5Iil7aWYoZC5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk8Zi5zY3JvbGxTZW5zaXRpdml0eSl7Yj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1mLnNjcm9sbFNwZWVkKX1lbHNle2lmKGEod2luZG93KS53aWR0aCgpLShkLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk8Zi5zY3JvbGxTZW5zaXRpdml0eSl7Yj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStmLnNjcm9sbFNwZWVkKX19fX1pZihiIT09ZmFsc2UmJmEudWkuZGRtYW5hZ2VyJiYhZi5kcm9wQmVoYXZpb3VyKXthLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhjLGQpfX19KTthLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihjLGQpe3ZhciBiPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1iLm9wdGlvbnM7Yi5zbmFwRWxlbWVudHM9W107YShlLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz8oZS5zbmFwLml0ZW1zfHwiOmRhdGEoZHJhZ2dhYmxlKSIpOmUuc25hcCkuZWFjaChmdW5jdGlvbigpe3ZhciBnPWEodGhpcyk7dmFyIGY9Zy5vZmZzZXQoKTtpZih0aGlzIT1iLmVsZW1lbnRbMF0pe2Iuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDpnLm91dGVyV2lkdGgoKSxoZWlnaHQ6Zy5vdXRlckhlaWdodCgpLHRvcDpmLnRvcCxsZWZ0OmYubGVmdH0pfX0pfSxkcmFnOmZ1bmN0aW9uKHUscCl7dmFyIGc9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxxPWcub3B0aW9uczt2YXIgeT1xLnNuYXBUb2xlcmFuY2U7dmFyIHg9cC5vZmZzZXQubGVmdCx3PXgrZy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxmPXAub2Zmc2V0LnRvcCxlPWYrZy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciB2PWcuc25hcEVsZW1lbnRzLmxlbmd0aC0xO3Y+PTA7di0tKXt2YXIgcz1nLnNuYXBFbGVtZW50c1t2XS5sZWZ0LG49cytnLnNuYXBFbGVtZW50c1t2XS53aWR0aCxtPWcuc25hcEVsZW1lbnRzW3ZdLnRvcCxBPW0rZy5zbmFwRWxlbWVudHNbdl0uaGVpZ2h0O2lmKCEoKHMteTx4JiZ4PG4reSYmbS15PGYmJmY8QSt5KXx8KHMteTx4JiZ4PG4reSYmbS15PGUmJmU8QSt5KXx8KHMteTx3JiZ3PG4reSYmbS15PGYmJmY8QSt5KXx8KHMteTx3JiZ3PG4reSYmbS15PGUmJmU8QSt5KSkpe2lmKGcuc25hcEVsZW1lbnRzW3ZdLnNuYXBwaW5nKXsoZy5vcHRpb25zLnNuYXAucmVsZWFzZSYmZy5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKGcuZWxlbWVudCx1LGEuZXh0ZW5kKGcuX3VpSGFzaCgpLHtzbmFwSXRlbTpnLnNuYXBFbGVtZW50c1t2XS5pdGVtfSkpKX1nLnNuYXBFbGVtZW50c1t2XS5zbmFwcGluZz1mYWxzZTtjb250aW51ZX1pZihxLnNuYXBNb2RlIT0iaW5uZXIiKXt2YXIgYz1NYXRoLmFicyhtLWUpPD15O3ZhciB6PU1hdGguYWJzKEEtZik8PXk7dmFyIGo9TWF0aC5hYnMocy13KTw9eTt2YXIgaz1NYXRoLmFicyhuLXgpPD15O2lmKGMpe3AucG9zaXRpb24udG9wPWcuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDptLWcuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1nLm1hcmdpbnMudG9wfWlmKHope3AucG9zaXRpb24udG9wPWcuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpBLGxlZnQ6MH0pLnRvcC1nLm1hcmdpbnMudG9wfWlmKGope3AucG9zaXRpb24ubGVmdD1nLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OnMtZy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQtZy5tYXJnaW5zLmxlZnR9aWYoayl7cC5wb3NpdGlvbi5sZWZ0PWcuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bn0pLmxlZnQtZy5tYXJnaW5zLmxlZnR9fXZhciBoPShjfHx6fHxqfHxrKTtpZihxLnNuYXBNb2RlIT0ib3V0ZXIiKXt2YXIgYz1NYXRoLmFicyhtLWYpPD15O3ZhciB6PU1hdGguYWJzKEEtZSk8PXk7dmFyIGo9TWF0aC5hYnMocy14KTw9eTt2YXIgaz1NYXRoLmFicyhuLXcpPD15O2lmKGMpe3AucG9zaXRpb24udG9wPWcuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDptLGxlZnQ6MH0pLnRvcC1nLm1hcmdpbnMudG9wfWlmKHope3AucG9zaXRpb24udG9wPWcuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpBLWcuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1nLm1hcmdpbnMudG9wfWlmKGope3AucG9zaXRpb24ubGVmdD1nLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OnN9KS5sZWZ0LWcubWFyZ2lucy5sZWZ0fWlmKGspe3AucG9zaXRpb24ubGVmdD1nLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Om4tZy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQtZy5tYXJnaW5zLmxlZnR9fWlmKCFnLnNuYXBFbGVtZW50c1t2XS5zbmFwcGluZyYmKGN8fHp8fGp8fGt8fGgpKXsoZy5vcHRpb25zLnNuYXAuc25hcCYmZy5vcHRpb25zLnNuYXAuc25hcC5jYWxsKGcuZWxlbWVudCx1LGEuZXh0ZW5kKGcuX3VpSGFzaCgpLHtzbmFwSXRlbTpnLnNuYXBFbGVtZW50c1t2XS5pdGVtfSkpKX1nLnNuYXBFbGVtZW50c1t2XS5zbmFwcGluZz0oY3x8enx8anx8a3x8aCl9fX0pO2EudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9uczt2YXIgZD1hLm1ha2VBcnJheShhKGUuc3RhY2suZ3JvdXApKS5zb3J0KGZ1bmN0aW9uKGcsZil7cmV0dXJuKHBhcnNlSW50KGEoZykuY3NzKCJ6SW5kZXgiKSwxMCl8fGUuc3RhY2subWluKS0ocGFyc2VJbnQoYShmKS5jc3MoInpJbmRleCIpLDEwKXx8ZS5zdGFjay5taW4pfSk7YShkKS5lYWNoKGZ1bmN0aW9uKGYpe3RoaXMuc3R5bGUuekluZGV4PWUuc3RhY2subWluK2Z9KTt0aGlzWzBdLnN0eWxlLnpJbmRleD1lLnN0YWNrLm1pbitkLmxlbmd0aH19KTthLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInpJbmRleCIse3N0YXJ0OmZ1bmN0aW9uKGMsZCl7dmFyIGI9YShkLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7aWYoYi5jc3MoInpJbmRleCIpKXtlLl96SW5kZXg9Yi5jc3MoInpJbmRleCIpfWIuY3NzKCJ6SW5kZXgiLGUuekluZGV4KX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztpZihkLl96SW5kZXgpe2EoYy5oZWxwZXIpLmNzcygiekluZGV4IixkLl96SW5kZXgpfX19KX0pKGpRdWVyeSk7Oy8qCisgKiBqUXVlcnkgVUkgRHJvcHBhYmxlIDEuNy4yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCisgKiBhbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorICoKKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRHJvcHBhYmxlcworICoKKyAqIERlcGVuZHM6CisgKgl1aS5jb3JlLmpzCisgKgl1aS5kcmFnZ2FibGUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS5kcm9wcGFibGUiLHtfaW5pdDpmdW5jdGlvbigpe3ZhciBjPXRoaXMub3B0aW9ucyxiPWMuYWNjZXB0O3RoaXMuaXNvdmVyPTA7dGhpcy5pc291dD0xO3RoaXMub3B0aW9ucy5hY2NlcHQ9dGhpcy5vcHRpb25zLmFjY2VwdCYmYS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5hY2NlcHQpP3RoaXMub3B0aW9ucy5hY2NlcHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMoYil9O3RoaXMucHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH07YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdPWEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXXx8W107YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdLnB1c2godGhpcyk7KHRoaXMub3B0aW9ucy5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPWEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7aWYoYltjXT09dGhpcyl7Yi5zcGxpY2UoYywxKX19dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIil9LF9zZXREYXRhOmZ1bmN0aW9uKGIsYyl7aWYoYj09ImFjY2VwdCIpe3RoaXMub3B0aW9ucy5hY2NlcHQ9YyYmYS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMoYyl9fWVsc2V7YS53aWRnZXQucHJvdG90eXBlLl9zZXREYXRhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LF9hY3RpdmF0ZTpmdW5jdGlvbihjKXt2YXIgYj1hLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyl7dGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyl9KGImJnRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixjLHRoaXMudWkoYikpKX0sX2RlYWN0aXZhdGU6ZnVuY3Rpb24oYyl7dmFyIGI9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZih0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3Mpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpfShiJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixjLHRoaXMudWkoYikpKX0sX292ZXI6ZnVuY3Rpb24oYyl7dmFyIGI9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighYnx8KGIuY3VycmVudEl0ZW18fGIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSl7cmV0dXJufWlmKHRoaXMub3B0aW9ucy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sKGIuY3VycmVudEl0ZW18fGIuZWxlbWVudCkpKXtpZih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyl7dGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKX10aGlzLl90cmlnZ2VyKCJvdmVyIixjLHRoaXMudWkoYikpfX0sX291dDpmdW5jdGlvbihjKXt2YXIgYj1hLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFifHwoYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXtyZXR1cm59aWYodGhpcy5vcHRpb25zLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwoYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSkpe2lmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpfXRoaXMuX3RyaWdnZXIoIm91dCIsYyx0aGlzLnVpKGIpKX19LF9kcm9wOmZ1bmN0aW9uKGMsZCl7dmFyIGI9ZHx8YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighYnx8KGIuY3VycmVudEl0ZW18fGIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSl7cmV0dXJuIGZhbHNlfXZhciBlPWZhbHNlO3RoaXMuZWxlbWVudC5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikubm90KCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIikuZWFjaChmdW5jdGlvbigpe3ZhciBmPWEuZGF0YSh0aGlzLCJkcm9wcGFibGUiKTtpZihmLm9wdGlvbnMuZ3JlZWR5JiZhLnVpLmludGVyc2VjdChiLGEuZXh0ZW5kKGYse29mZnNldDpmLmVsZW1lbnQub2Zmc2V0KCl9KSxmLm9wdGlvbnMudG9sZXJhbmNlKSl7ZT10cnVlO3JldHVybiBmYWxzZX19KTtpZihlKXtyZXR1cm4gZmFsc2V9aWYodGhpcy5vcHRpb25zLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwoYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSkpe2lmKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyl9aWYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3Mpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyl9dGhpcy5fdHJpZ2dlcigiZHJvcCIsYyx0aGlzLnVpKGIpKTtyZXR1cm4gdGhpcy5lbGVtZW50fXJldHVybiBmYWxzZX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJue2RyYWdnYWJsZTooYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSxoZWxwZXI6Yi5oZWxwZXIscG9zaXRpb246Yi5wb3NpdGlvbixhYnNvbHV0ZVBvc2l0aW9uOmIucG9zaXRpb25BYnMsb2Zmc2V0OmIucG9zaXRpb25BYnN9fX0pO2EuZXh0ZW5kKGEudWkuZHJvcHBhYmxlLHt2ZXJzaW9uOiIxLjcuMiIsZXZlbnRQcmVmaXg6ImRyb3AiLGRlZmF1bHRzOnthY2NlcHQ6IioiLGFjdGl2ZUNsYXNzOmZhbHNlLGFkZENsYXNzZXM6dHJ1ZSxncmVlZHk6ZmFsc2UsaG92ZXJDbGFzczpmYWxzZSxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QifX0pO2EudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKHEsaixvKXtpZighai5vZmZzZXQpe3JldHVybiBmYWxzZX12YXIgZT0ocS5wb3NpdGlvbkFic3x8cS5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCxkPWUrcS5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxuPShxLnBvc2l0aW9uQWJzfHxxLnBvc2l0aW9uLmFic29sdXRlKS50b3AsbT1uK3EuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O3ZhciBnPWoub2Zmc2V0LmxlZnQsYz1nK2oucHJvcG9ydGlvbnMud2lkdGgscD1qLm9mZnNldC50b3Asaz1wK2oucHJvcG9ydGlvbnMuaGVpZ2h0O3N3aXRjaChvKXtjYXNlImZpdCI6cmV0dXJuKGc8ZSYmZDxjJiZwPG4mJm08ayk7YnJlYWs7Y2FzZSJpbnRlcnNlY3QiOnJldHVybihnPGUrKHEuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMikmJmQtKHEuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMik8YyYmcDxuKyhxLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yKSYmbS0ocS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMik8ayk7YnJlYWs7Y2FzZSJwb2ludGVyIjp2YXIgaD0oKHEucG9zaXRpb25BYnN8fHEucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQrKHEuY2xpY2tPZmZzZXR8fHEub2Zmc2V0LmNsaWNrKS5sZWZ0KSxpPSgocS5wb3NpdGlvbkFic3x8cS5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhxLmNsaWNrT2Zmc2V0fHxxLm9mZnNldC5jbGljaykudG9wKSxmPWEudWkuaXNPdmVyKGksaCxwLGcsai5wcm9wb3J0aW9ucy5oZWlnaHQsai5wcm9wb3J0aW9ucy53aWR0aCk7cmV0dXJuIGY7YnJlYWs7Y2FzZSJ0b3VjaCI6cmV0dXJuKChuPj1wJiZuPD1rKXx8KG0+PXAmJm08PWspfHwobjxwJiZtPmspKSYmKChlPj1nJiZlPD1jKXx8KGQ+PWcmJmQ8PWMpfHwoZTxnJiZkPmMpKTticmVhaztkZWZhdWx0OnJldHVybiBmYWxzZTticmVha319O2EudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51bGwsZHJvcHBhYmxlczp7ImRlZmF1bHQiOltdfSxwcmVwYXJlT2Zmc2V0czpmdW5jdGlvbihlLGcpe3ZhciBiPWEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZS5vcHRpb25zLnNjb3BlXTt2YXIgZj1nP2cudHlwZTpudWxsO3ZhciBoPShlLmN1cnJlbnRJdGVtfHxlLmVsZW1lbnQpLmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5hbmRTZWxmKCk7ZHJvcHBhYmxlc0xvb3A6Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspe2lmKGJbZF0ub3B0aW9ucy5kaXNhYmxlZHx8KGUmJiFiW2RdLm9wdGlvbnMuYWNjZXB0LmNhbGwoYltkXS5lbGVtZW50WzBdLChlLmN1cnJlbnRJdGVtfHxlLmVsZW1lbnQpKSkpe2NvbnRpbnVlfWZvcih2YXIgYz0wO2M8aC5sZW5ndGg7YysrKXtpZihoW2NdPT1iW2RdLmVsZW1lbnRbMF0pe2JbZF0ucHJvcG9ydGlvbnMuaGVpZ2h0PTA7Y29udGludWUgZHJvcHBhYmxlc0xvb3B9fWJbZF0udmlzaWJsZT1iW2RdLmVsZW1lbnQuY3NzKCJkaXNwbGF5IikhPSJub25lIjtpZighYltkXS52aXNpYmxlKXtjb250aW51ZX1iW2RdLm9mZnNldD1iW2RdLmVsZW1lbnQub2Zmc2V0KCk7YltkXS5wcm9wb3J0aW9ucz17d2lkdGg6YltkXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDpiW2RdLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fTtpZihmPT0ibW91c2Vkb3duIil7YltkXS5fYWN0aXZhdGUuY2FsbChiW2RdLGcpfX19LGRyb3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1mYWxzZTthLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdLGZ1bmN0aW9uKCl7aWYoIXRoaXMub3B0aW9ucyl7cmV0dXJufWlmKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmYS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpKXtkPXRoaXMuX2Ryb3AuY2FsbCh0aGlzLGMpfWlmKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5vcHRpb25zLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwoYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSkpe3RoaXMuaXNvdXQ9MTt0aGlzLmlzb3Zlcj0wO3RoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLGMpfX0pO3JldHVybiBkfSxkcmFnOmZ1bmN0aW9uKGIsYyl7aWYoYi5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMpe2EudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYyl9YS5lYWNoKGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5vcHRpb25zLnNjb3BlXSxmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5ncmVlZHlDaGlsZHx8IXRoaXMudmlzaWJsZSl7cmV0dXJufXZhciBlPWEudWkuaW50ZXJzZWN0KGIsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKTt2YXIgZz0hZSYmdGhpcy5pc292ZXI9PTE/Imlzb3V0IjooZSYmdGhpcy5pc292ZXI9PTA/Imlzb3ZlciI6bnVsbCk7aWYoIWcpe3JldHVybn12YXIgZjtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIgZD10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEoZHJvcHBhYmxlKTplcSgwKSIpO2lmKGQubGVuZ3RoKXtmPWEuZGF0YShkWzBdLCJkcm9wcGFibGUiKTtmLmdyZWVkeUNoaWxkPShnPT0iaXNvdmVyIj8xOjApfX1pZihmJiZnPT0iaXNvdmVyIil7Zi5pc292ZXI9MDtmLmlzb3V0PTE7Zi5fb3V0LmNhbGwoZixjKX10aGlzW2ddPTE7dGhpc1tnPT0iaXNvdXQiPyJpc292ZXIiOiJpc291dCJdPTA7dGhpc1tnPT0iaXNvdmVyIj8iX292ZXIiOiJfb3V0Il0uY2FsbCh0aGlzLGMpO2lmKGYmJmc9PSJpc291dCIpe2YuaXNvdXQ9MDtmLmlzb3Zlcj0xO2YuX292ZXIuY2FsbChmLGMpfX0pfX19KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIFJlc2l6YWJsZSAxLjcuMgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoTUlULUxJQ0VOU0UudHh0KQorICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBsaWNlbnNlcy4KKyAqCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZXMKKyAqCisgKiBEZXBlbmRzOgorICoJdWkuY29yZS5qcworICovCisoZnVuY3Rpb24oYyl7Yy53aWRnZXQoInVpLnJlc2l6YWJsZSIsYy5leHRlbmQoe30sYy51aS5tb3VzZSx7X2luaXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGo9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcmVzaXphYmxlIik7Yy5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEhKGouYXNwZWN0UmF0aW8pLGFzcGVjdFJhdGlvOmouYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmouaGVscGVyfHxqLmdob3N0fHxqLmFuaW1hdGU/ai5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSk7aWYodGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkpe2lmKC9yZWxhdGl2ZS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmYy5icm93c2VyLm9wZXJhKXt0aGlzLmVsZW1lbnQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDoiYXV0byIsbGVmdDoiYXV0byJ9KX10aGlzLmVsZW1lbnQud3JhcChjKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSx3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSx0b3A6dGhpcy5lbGVtZW50LmNzcygidG9wIiksbGVmdDp0aGlzLmVsZW1lbnQuY3NzKCJsZWZ0Iil9KSk7dGhpcy5lbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnQoKS5kYXRhKCJyZXNpemFibGUiLHRoaXMuZWxlbWVudC5kYXRhKCJyZXNpemFibGUiKSk7dGhpcy5lbGVtZW50SXNXcmFwcGVyPXRydWU7dGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIil9KTt0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSk7dGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIik7dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCJub25lIik7dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246InN0YXRpYyIsem9vbToxLGRpc3BsYXk6ImJsb2NrIn0pKTt0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbiIpfSk7dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX10aGlzLmhhbmRsZXM9ai5oYW5kbGVzfHwoIWMoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD8iZSxzLHNlIjp7bjoiLnVpLXJlc2l6YWJsZS1uIixlOiIudWktcmVzaXphYmxlLWUiLHM6Ii51aS1yZXNpemFibGUtcyIsdzoiLnVpLXJlc2l6YWJsZS13IixzZToiLnVpLXJlc2l6YWJsZS1zZSIsc3c6Ii51aS1yZXNpemFibGUtc3ciLG5lOiIudWktcmVzaXphYmxlLW5lIixudzoiLnVpLXJlc2l6YWJsZS1udyJ9KTtpZih0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PVN0cmluZyl7aWYodGhpcy5oYW5kbGVzPT0iYWxsIil7dGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53In12YXIgaz10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKTt0aGlzLmhhbmRsZXM9e307Zm9yKHZhciBmPTA7ZjxrLmxlbmd0aDtmKyspe3ZhciBoPWMudHJpbShrW2ZdKSxkPSJ1aS1yZXNpemFibGUtIitoO3ZhciBnPWMoJzxkaXYgY2xhc3M9InVpLXJlc2l6YWJsZS1oYW5kbGUgJytkKyciPjwvZGl2PicpO2lmKC9zd3xzZXxuZXxudy8udGVzdChoKSl7Zy5jc3Moe3pJbmRleDorK2ouekluZGV4fSl9aWYoInNlIj09aCl7Zy5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZSIpfXRoaXMuaGFuZGxlc1toXT0iLnVpLXJlc2l6YWJsZS0iK2g7dGhpcy5lbGVtZW50LmFwcGVuZChnKX19dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbihwKXtwPXB8fHRoaXMuZWxlbWVudDtmb3IodmFyIG0gaW4gdGhpcy5oYW5kbGVzKXtpZih0aGlzLmhhbmRsZXNbbV0uY29uc3RydWN0b3I9PVN0cmluZyl7dGhpcy5oYW5kbGVzW21dPWModGhpcy5oYW5kbGVzW21dLHRoaXMuZWxlbWVudCkuc2hvdygpfWlmKHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL3RleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24vaSkpe3ZhciBuPWModGhpcy5oYW5kbGVzW21dLHRoaXMuZWxlbWVudCksbz0wO289L3N3fG5lfG53fHNlfG58cy8udGVzdChtKT9uLm91dGVySGVpZ2h0KCk6bi5vdXRlcldpZHRoKCk7dmFyIGw9WyJwYWRkaW5nIiwvbmV8bnd8bi8udGVzdChtKT8iVG9wIjovc2V8c3d8cy8udGVzdChtKT8iQm90dG9tIjovXmUkLy50ZXN0KG0pPyJSaWdodCI6IkxlZnQiXS5qb2luKCIiKTtwLmNzcyhsLG8pO3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCl9aWYoIWModGhpcy5oYW5kbGVzW21dKS5sZW5ndGgpe2NvbnRpbnVlfX19O3RoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KTt0aGlzLl9oYW5kbGVzPWMoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmRpc2FibGVTZWxlY3Rpb24oKTt0aGlzLl9oYW5kbGVzLm1vdXNlb3ZlcihmdW5jdGlvbigpe2lmKCFlLnJlc2l6aW5nKXtpZih0aGlzLmNsYXNzTmFtZSl7dmFyIGk9dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSl9ZS5heGlzPWkmJmlbMV0/aVsxXToic2UifX0pO2lmKGouYXV0b0hpZGUpe3RoaXMuX2hhbmRsZXMuaGlkZSgpO2ModGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikuaG92ZXIoZnVuY3Rpb24oKXtjKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKTtlLl9oYW5kbGVzLnNob3coKX0sZnVuY3Rpb24oKXtpZighZS5yZXNpemluZyl7Yyh0aGlzKS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIik7ZS5faGFuZGxlcy5oaWRlKCl9fSl9dGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgZD1mdW5jdGlvbihmKXtjKGYpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9O2lmKHRoaXMuZWxlbWVudElzV3JhcHBlcil7ZCh0aGlzLmVsZW1lbnQpO3ZhciBlPXRoaXMuZWxlbWVudDtlLnBhcmVudCgpLmFwcGVuZCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOmUuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOmUub3V0ZXJXaWR0aCgpLGhlaWdodDplLm91dGVySGVpZ2h0KCksdG9wOmUuY3NzKCJ0b3AiKSxsZWZ0OmUuY3NzKCJsZWZ0Iil9KSkuZW5kKCkucmVtb3ZlKCl9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSk7ZCh0aGlzLm9yaWdpbmFsRWxlbWVudCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oZSl7dmFyIGY9ZmFsc2U7Zm9yKHZhciBkIGluIHRoaXMuaGFuZGxlcyl7aWYoYyh0aGlzLmhhbmRsZXNbZF0pWzBdPT1lLnRhcmdldCl7Zj10cnVlfX1yZXR1cm4gdGhpcy5vcHRpb25zLmRpc2FibGVkfHwhIWZ9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGYpe3ZhciBpPXRoaXMub3B0aW9ucyxlPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpLGQ9dGhpcy5lbGVtZW50O3RoaXMucmVzaXppbmc9dHJ1ZTt0aGlzLmRvY3VtZW50U2Nyb2xsPXt0b3A6Yyhkb2N1bWVudCkuc2Nyb2xsVG9wKCksbGVmdDpjKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCl9O2lmKGQuaXMoIi51aS1kcmFnZ2FibGUiKXx8KC9hYnNvbHV0ZS8pLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpKXtkLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6ZS50b3AsbGVmdDplLmxlZnR9KX1pZihjLmJyb3dzZXIub3BlcmEmJigvcmVsYXRpdmUvKS50ZXN0KGQuY3NzKCJwb3NpdGlvbiIpKSl7ZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pfXRoaXMuX3JlbmRlclByb3h5KCk7dmFyIGo9Yih0aGlzLmhlbHBlci5jc3MoImxlZnQiKSksZz1iKHRoaXMuaGVscGVyLmNzcygidG9wIikpO2lmKGkuY29udGFpbm1lbnQpe2orPWMoaS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwO2crPWMoaS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDB9dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCk7dGhpcy5wb3NpdGlvbj17bGVmdDpqLHRvcDpnfTt0aGlzLnNpemU9dGhpcy5faGVscGVyP3t3aWR0aDpkLm91dGVyV2lkdGgoKSxoZWlnaHQ6ZC5vdXRlckhlaWdodCgpfTp7d2lkdGg6ZC53aWR0aCgpLGhlaWdodDpkLmhlaWdodCgpfTt0aGlzLm9yaWdpbmFsU2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOmQub3V0ZXJXaWR0aCgpLGhlaWdodDpkLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpkLndpZHRoKCksaGVpZ2h0OmQuaGVpZ2h0KCl9O3RoaXMub3JpZ2luYWxQb3NpdGlvbj17bGVmdDpqLHRvcDpnfTt0aGlzLnNpemVEaWZmPXt3aWR0aDpkLm91dGVyV2lkdGgoKS1kLndpZHRoKCksaGVpZ2h0OmQub3V0ZXJIZWlnaHQoKS1kLmhlaWdodCgpfTt0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbj17bGVmdDpmLnBhZ2VYLHRvcDpmLnBhZ2VZfTt0aGlzLmFzcGVjdFJhdGlvPSh0eXBlb2YgaS5hc3BlY3RSYXRpbz09Im51bWJlciIpP2kuYXNwZWN0UmF0aW86KCh0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC90aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQpfHwxKTt2YXIgaD1jKCIudWktcmVzaXphYmxlLSIrdGhpcy5heGlzKS5jc3MoImN1cnNvciIpO2MoImJvZHkiKS5jc3MoImN1cnNvciIsaD09ImF1dG8iP3RoaXMuYXhpcysiLXJlc2l6ZSI6aCk7ZC5hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIik7dGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsZik7cmV0dXJuIHRydWV9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZCl7dmFyIGc9dGhpcy5oZWxwZXIsZj10aGlzLm9wdGlvbnMsbD17fSxwPXRoaXMsaT10aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbixtPXRoaXMuYXhpczt2YXIgcT0oZC5wYWdlWC1pLmxlZnQpfHwwLG49KGQucGFnZVktaS50b3ApfHwwO3ZhciBoPXRoaXMuX2NoYW5nZVttXTtpZighaCl7cmV0dXJuIGZhbHNlfXZhciBrPWguYXBwbHkodGhpcyxbZCxxLG5dKSxqPWMuYnJvd3Nlci5tc2llJiZjLmJyb3dzZXIudmVyc2lvbjw3LGU9dGhpcy5zaXplRGlmZjtpZih0aGlzLl9hc3BlY3RSYXRpb3x8ZC5zaGlmdEtleSl7az10aGlzLl91cGRhdGVSYXRpbyhrLGQpfWs9dGhpcy5fcmVzcGVjdFNpemUoayxkKTt0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsZCk7Zy5jc3Moe3RvcDp0aGlzLnBvc2l0aW9uLnRvcCsicHgiLGxlZnQ6dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsd2lkdGg6dGhpcy5zaXplLndpZHRoKyJweCIsaGVpZ2h0OnRoaXMuc2l6ZS5oZWlnaHQrInB4In0pO2lmKCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKXt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfXRoaXMuX3VwZGF0ZUNhY2hlKGspO3RoaXMuX3RyaWdnZXIoInJlc2l6ZSIsZCx0aGlzLnVpKCkpO3JldHVybiBmYWxzZX0sX21vdXNlU3RvcDpmdW5jdGlvbihnKXt0aGlzLnJlc2l6aW5nPWZhbHNlO3ZhciBoPXRoaXMub3B0aW9ucyxsPXRoaXM7aWYodGhpcy5faGVscGVyKXt2YXIgZj10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGQ9Zi5sZW5ndGgmJigvdGV4dGFyZWEvaSkudGVzdChmWzBdLm5vZGVOYW1lKSxlPWQmJmMudWkuaGFzU2Nyb2xsKGZbMF0sImxlZnQiKT8wOmwuc2l6ZURpZmYuaGVpZ2h0LGo9ZD8wOmwuc2l6ZURpZmYud2lkdGg7dmFyIG09e3dpZHRoOihsLnNpemUud2lkdGgtaiksaGVpZ2h0OihsLnNpemUuaGVpZ2h0LWUpfSxpPShwYXJzZUludChsLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhsLnBvc2l0aW9uLmxlZnQtbC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpKXx8bnVsbCxrPShwYXJzZUludChsLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGwucG9zaXRpb24udG9wLWwub3JpZ2luYWxQb3NpdGlvbi50b3ApKXx8bnVsbDtpZighaC5hbmltYXRlKXt0aGlzLmVsZW1lbnQuY3NzKGMuZXh0ZW5kKG0se3RvcDprLGxlZnQ6aX0pKX1sLmhlbHBlci5oZWlnaHQobC5zaXplLmhlaWdodCk7bC5oZWxwZXIud2lkdGgobC5zaXplLndpZHRoKTtpZih0aGlzLl9oZWxwZXImJiFoLmFuaW1hdGUpe3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCl9fWMoImJvZHkiKS5jc3MoImN1cnNvciIsImF1dG8iKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpO3RoaXMuX3Byb3BhZ2F0ZSgic3RvcCIsZyk7aWYodGhpcy5faGVscGVyKXt0aGlzLmhlbHBlci5yZW1vdmUoKX1yZXR1cm4gZmFsc2V9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihkKXt2YXIgZT10aGlzLm9wdGlvbnM7dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCk7aWYoYShkLmxlZnQpKXt0aGlzLnBvc2l0aW9uLmxlZnQ9ZC5sZWZ0fWlmKGEoZC50b3ApKXt0aGlzLnBvc2l0aW9uLnRvcD1kLnRvcH1pZihhKGQuaGVpZ2h0KSl7dGhpcy5zaXplLmhlaWdodD1kLmhlaWdodH1pZihhKGQud2lkdGgpKXt0aGlzLnNpemUud2lkdGg9ZC53aWR0aH19LF91cGRhdGVSYXRpbzpmdW5jdGlvbihnLGYpe3ZhciBoPXRoaXMub3B0aW9ucyxpPXRoaXMucG9zaXRpb24sZT10aGlzLnNpemUsZD10aGlzLmF4aXM7aWYoZy5oZWlnaHQpe2cud2lkdGg9KGUuaGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8pfWVsc2V7aWYoZy53aWR0aCl7Zy5oZWlnaHQ9KGUud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyl9fWlmKGQ9PSJzdyIpe2cubGVmdD1pLmxlZnQrKGUud2lkdGgtZy53aWR0aCk7Zy50b3A9bnVsbH1pZihkPT0ibnciKXtnLnRvcD1pLnRvcCsoZS5oZWlnaHQtZy5oZWlnaHQpO2cubGVmdD1pLmxlZnQrKGUud2lkdGgtZy53aWR0aCl9cmV0dXJuIGd9LF9yZXNwZWN0U2l6ZTpmdW5jdGlvbihrLGYpe3ZhciBpPXRoaXMuaGVscGVyLGg9dGhpcy5vcHRpb25zLHE9dGhpcy5fYXNwZWN0UmF0aW98fGYuc2hpZnRLZXkscD10aGlzLmF4aXMscz1hKGsud2lkdGgpJiZoLm1heFdpZHRoJiYoaC5tYXhXaWR0aDxrLndpZHRoKSxsPWEoay5oZWlnaHQpJiZoLm1heEhlaWdodCYmKGgubWF4SGVpZ2h0PGsuaGVpZ2h0KSxnPWEoay53aWR0aCkmJmgubWluV2lkdGgmJihoLm1pbldpZHRoPmsud2lkdGgpLHI9YShrLmhlaWdodCkmJmgubWluSGVpZ2h0JiYoaC5taW5IZWlnaHQ+ay5oZWlnaHQpO2lmKGcpe2sud2lkdGg9aC5taW5XaWR0aH1pZihyKXtrLmhlaWdodD1oLm1pbkhlaWdodH1pZihzKXtrLndpZHRoPWgubWF4V2lkdGh9aWYobCl7ay5oZWlnaHQ9aC5tYXhIZWlnaHR9dmFyIGU9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsbj10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0O3ZhciBqPS9zd3xud3x3Ly50ZXN0KHApLGQ9L253fG5lfG4vLnRlc3QocCk7aWYoZyYmail7ay5sZWZ0PWUtaC5taW5XaWR0aH1pZihzJiZqKXtrLmxlZnQ9ZS1oLm1heFdpZHRofWlmKHImJmQpe2sudG9wPW4taC5taW5IZWlnaHR9aWYobCYmZCl7ay50b3A9bi1oLm1heEhlaWdodH12YXIgbT0hay53aWR0aCYmIWsuaGVpZ2h0O2lmKG0mJiFrLmxlZnQmJmsudG9wKXtrLnRvcD1udWxsfWVsc2V7aWYobSYmIWsudG9wJiZrLmxlZnQpe2subGVmdD1udWxsfX1yZXR1cm4ga30sX3Byb3BvcnRpb25hbGx5UmVzaXplOmZ1bmN0aW9uKCl7dmFyIGo9dGhpcy5vcHRpb25zO2lmKCF0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCl7cmV0dXJufXZhciBmPXRoaXMuaGVscGVyfHx0aGlzLmVsZW1lbnQ7Zm9yKHZhciBlPTA7ZTx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aDtlKyspe3ZhciBnPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHNbZV07aWYoIXRoaXMuYm9yZGVyRGlmKXt2YXIgZD1bZy5jc3MoImJvcmRlclRvcFdpZHRoIiksZy5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSxnLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSxnLmNzcygiYm9yZGVyTGVmdFdpZHRoIildLGg9W2cuY3NzKCJwYWRkaW5nVG9wIiksZy5jc3MoInBhZGRpbmdSaWdodCIpLGcuY3NzKCJwYWRkaW5nQm90dG9tIiksZy5jc3MoInBhZGRpbmdMZWZ0IildO3RoaXMuYm9yZGVyRGlmPWMubWFwKGQsZnVuY3Rpb24oayxtKXt2YXIgbD1wYXJzZUludChrLDEwKXx8MCxuPXBhcnNlSW50KGhbbV0sMTApfHwwO3JldHVybiBsK259KX1pZihjLmJyb3dzZXIubXNpZSYmISghKGMoZikuaXMoIjpoaWRkZW4iKXx8YyhmKS5wYXJlbnRzKCI6aGlkZGVuIikubGVuZ3RoKSkpe2NvbnRpbnVlfWcuY3NzKHtoZWlnaHQ6KGYuaGVpZ2h0KCktdGhpcy5ib3JkZXJEaWZbMF0tdGhpcy5ib3JkZXJEaWZbMl0pfHwwLHdpZHRoOihmLndpZHRoKCktdGhpcy5ib3JkZXJEaWZbMV0tdGhpcy5ib3JkZXJEaWZbM10pfHwwfSl9fSxfcmVuZGVyUHJveHk6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnQsaD10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50T2Zmc2V0PWUub2Zmc2V0KCk7aWYodGhpcy5faGVscGVyKXt0aGlzLmhlbHBlcj10aGlzLmhlbHBlcnx8YygnPGRpdiBzdHlsZT0ib3ZlcmZsb3c6aGlkZGVuOyI+PC9kaXY+Jyk7dmFyIGQ9Yy5icm93c2VyLm1zaWUmJmMuYnJvd3Nlci52ZXJzaW9uPDcsZj0oZD8xOjApLGc9KGQ/MjotMSk7dGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3Moe3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkrZyxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkrZyxwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6dGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtZisicHgiLHRvcDp0aGlzLmVsZW1lbnRPZmZzZXQudG9wLWYrInB4Iix6SW5kZXg6KytoLnpJbmRleH0pO3RoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpfWVsc2V7dGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50fX0sX2NoYW5nZTp7ZTpmdW5jdGlvbihmLGUsZCl7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK2V9fSx3OmZ1bmN0aW9uKGcsZSxkKXt2YXIgaT10aGlzLm9wdGlvbnMsZj10aGlzLm9yaWdpbmFsU2l6ZSxoPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpoLmxlZnQrZSx3aWR0aDpmLndpZHRoLWV9fSxuOmZ1bmN0aW9uKGcsZSxkKXt2YXIgaT10aGlzLm9wdGlvbnMsZj10aGlzLm9yaWdpbmFsU2l6ZSxoPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOmgudG9wK2QsaGVpZ2h0OmYuaGVpZ2h0LWR9fSxzOmZ1bmN0aW9uKGYsZSxkKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtkfX0sc2U6ZnVuY3Rpb24oZixlLGQpe3JldHVybiBjLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbZixlLGRdKSl9LHN3OmZ1bmN0aW9uKGYsZSxkKXtyZXR1cm4gYy5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW2YsZSxkXSkpfSxuZTpmdW5jdGlvbihmLGUsZCl7cmV0dXJuIGMuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtmLGUsZF0pKX0sbnc6ZnVuY3Rpb24oZixlLGQpe3JldHVybiBjLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbZixlLGRdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKGUsZCl7Yy51aS5wbHVnaW4uY2FsbCh0aGlzLGUsW2QsdGhpcy51aSgpXSk7KGUhPSJyZXNpemUiJiZ0aGlzLl90cmlnZ2VyKGUsZCx0aGlzLnVpKCkpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KSk7Yy5leHRlbmQoYy51aS5yZXNpemFibGUse3ZlcnNpb246IjEuNy4yIixldmVudFByZWZpeDoicmVzaXplIixkZWZhdWx0czp7YWxzb1Jlc2l6ZTpmYWxzZSxhbmltYXRlOmZhbHNlLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOmZhbHNlLGF1dG9IaWRlOmZhbHNlLGNhbmNlbDoiOmlucHV0LG9wdGlvbiIsY29udGFpbm1lbnQ6ZmFsc2UsZGVsYXk6MCxkaXN0YW5jZToxLGdob3N0OmZhbHNlLGdyaWQ6ZmFsc2UsaGFuZGxlczoiZSxzLHNlIixoZWxwZXI6ZmFsc2UsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjEwMDB9fSk7Yy51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbHNvUmVzaXplIix7c3RhcnQ6ZnVuY3Rpb24oZSxmKXt2YXIgZD1jKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGc9ZC5vcHRpb25zO19zdG9yZT1mdW5jdGlvbihoKXtjKGgpLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQoYyh0aGlzKS53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoYyh0aGlzKS5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludChjKHRoaXMpLmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQoYyh0aGlzKS5jc3MoInRvcCIpLDEwKX0pfSl9O2lmKHR5cGVvZihnLmFsc29SZXNpemUpPT0ib2JqZWN0IiYmIWcuYWxzb1Jlc2l6ZS5wYXJlbnROb2RlKXtpZihnLmFsc29SZXNpemUubGVuZ3RoKXtnLmFsc29SZXNpemU9Zy5hbHNvUmVzaXplWzBdO19zdG9yZShnLmFsc29SZXNpemUpfWVsc2V7Yy5lYWNoKGcuYWxzb1Jlc2l6ZSxmdW5jdGlvbihoLGkpe19zdG9yZShoKX0pfX1lbHNle19zdG9yZShnLmFsc29SZXNpemUpfX0scmVzaXplOmZ1bmN0aW9uKGYsaCl7dmFyIGU9Yyh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPWUub3B0aW9ucyxnPWUub3JpZ2luYWxTaXplLGs9ZS5vcmlnaW5hbFBvc2l0aW9uO3ZhciBqPXtoZWlnaHQ6KGUuc2l6ZS5oZWlnaHQtZy5oZWlnaHQpfHwwLHdpZHRoOihlLnNpemUud2lkdGgtZy53aWR0aCl8fDAsdG9wOihlLnBvc2l0aW9uLnRvcC1rLnRvcCl8fDAsbGVmdDooZS5wb3NpdGlvbi5sZWZ0LWsubGVmdCl8fDB9LGQ9ZnVuY3Rpb24obCxtKXtjKGwpLmVhY2goZnVuY3Rpb24oKXt2YXIgcD1jKHRoaXMpLHE9Yyh0aGlzKS5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpLG89e30sbj1tJiZtLmxlbmd0aD9tOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07Yy5lYWNoKG58fFsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24ocix0KXt2YXIgcz0ocVt0XXx8MCkrKGpbdF18fDApO2lmKHMmJnM+PTApe29bdF09c3x8bnVsbH19KTtpZigvcmVsYXRpdmUvLnRlc3QocC5jc3MoInBvc2l0aW9uIikpJiZjLmJyb3dzZXIub3BlcmEpe2UuX3JldmVydFRvUmVsYXRpdmVQb3NpdGlvbj10cnVlO3AuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiYXV0byIsbGVmdDoiYXV0byJ9KX1wLmNzcyhvKX0pfTtpZih0eXBlb2YoaS5hbHNvUmVzaXplKT09Im9iamVjdCImJiFpLmFsc29SZXNpemUubm9kZVR5cGUpe2MuZWFjaChpLmFsc29SZXNpemUsZnVuY3Rpb24obCxtKXtkKGwsbSl9KX1lbHNle2QoaS5hbHNvUmVzaXplKX19LHN0b3A6ZnVuY3Rpb24oZSxmKXt2YXIgZD1jKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpO2lmKGQuX3JldmVydFRvUmVsYXRpdmVQb3NpdGlvbiYmYy5icm93c2VyLm9wZXJhKXtkLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb249ZmFsc2U7ZWwuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSl9Yyh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZS1zdGFydCIpfX0pO2MudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24oaCxtKXt2YXIgbj1jKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGk9bi5vcHRpb25zO3ZhciBnPW4uX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZD1nLmxlbmd0aCYmKC90ZXh0YXJlYS9pKS50ZXN0KGdbMF0ubm9kZU5hbWUpLGU9ZCYmYy51aS5oYXNTY3JvbGwoZ1swXSwibGVmdCIpPzA6bi5zaXplRGlmZi5oZWlnaHQsaz1kPzA6bi5zaXplRGlmZi53aWR0aDt2YXIgZj17d2lkdGg6KG4uc2l6ZS53aWR0aC1rKSxoZWlnaHQ6KG4uc2l6ZS5oZWlnaHQtZSl9LGo9KHBhcnNlSW50KG4uZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKG4ucG9zaXRpb24ubGVmdC1uLm9yaWdpbmFsUG9zaXRpb24ubGVmdCkpfHxudWxsLGw9KHBhcnNlSW50KG4uZWxlbWVudC5jc3MoInRvcCIpLDEwKSsobi5wb3NpdGlvbi50b3Atbi5vcmlnaW5hbFBvc2l0aW9uLnRvcCkpfHxudWxsO24uZWxlbWVudC5hbmltYXRlKGMuZXh0ZW5kKGYsbCYmaj97dG9wOmwsbGVmdDpqfTp7fSkse2R1cmF0aW9uOmkuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzppLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBvPXt3aWR0aDpwYXJzZUludChuLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQobi5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChuLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChuLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtpZihnJiZnLmxlbmd0aCl7YyhnWzBdKS5jc3Moe3dpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fSl9bi5fdXBkYXRlQ2FjaGUobyk7bi5fcHJvcGFnYXRlKCJyZXNpemUiLGgpfX0pfX0pO2MudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbihlLHEpe3ZhciBzPWModGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1zLm9wdGlvbnMsaz1zLmVsZW1lbnQ7dmFyIGY9aS5jb250YWlubWVudCxqPShmIGluc3RhbmNlb2YgYyk/Zi5nZXQoMCk6KC9wYXJlbnQvLnRlc3QoZikpP2sucGFyZW50KCkuZ2V0KDApOmY7aWYoIWope3JldHVybn1zLmNvbnRhaW5lckVsZW1lbnQ9YyhqKTtpZigvZG9jdW1lbnQvLnRlc3QoZil8fGY9PWRvY3VtZW50KXtzLmNvbnRhaW5lck9mZnNldD17bGVmdDowLHRvcDowfTtzLmNvbnRhaW5lclBvc2l0aW9uPXtsZWZ0OjAsdG9wOjB9O3MucGFyZW50RGF0YT17ZWxlbWVudDpjKGRvY3VtZW50KSxsZWZ0OjAsdG9wOjAsd2lkdGg6Yyhkb2N1bWVudCkud2lkdGgoKSxoZWlnaHQ6Yyhkb2N1bWVudCkuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHR9fWVsc2V7dmFyIG09YyhqKSxoPVtdO2MoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihwLG8pe2hbcF09YihtLmNzcygicGFkZGluZyIrbykpfSk7cy5jb250YWluZXJPZmZzZXQ9bS5vZmZzZXQoKTtzLmNvbnRhaW5lclBvc2l0aW9uPW0ucG9zaXRpb24oKTtzLmNvbnRhaW5lclNpemU9e2hlaWdodDoobS5pbm5lckhlaWdodCgpLWhbM10pLHdpZHRoOihtLmlubmVyV2lkdGgoKS1oWzFdKX07dmFyIG49cy5jb250YWluZXJPZmZzZXQsZD1zLmNvbnRhaW5lclNpemUuaGVpZ2h0LGw9cy5jb250YWluZXJTaXplLndpZHRoLGc9KGMudWkuaGFzU2Nyb2xsKGosImxlZnQiKT9qLnNjcm9sbFdpZHRoOmwpLHI9KGMudWkuaGFzU2Nyb2xsKGopP2ouc2Nyb2xsSGVpZ2h0OmQpO3MucGFyZW50RGF0YT17ZWxlbWVudDpqLGxlZnQ6bi5sZWZ0LHRvcDpuLnRvcCx3aWR0aDpnLGhlaWdodDpyfX19LHJlc2l6ZTpmdW5jdGlvbihmLHApe3ZhciBzPWModGhpcykuZGF0YSgicmVzaXphYmxlIiksaD1zLm9wdGlvbnMsZT1zLmNvbnRhaW5lclNpemUsbj1zLmNvbnRhaW5lck9mZnNldCxsPXMuc2l6ZSxtPXMucG9zaXRpb24scT1zLl9hc3BlY3RSYXRpb3x8Zi5zaGlmdEtleSxkPXt0b3A6MCxsZWZ0OjB9LGc9cy5jb250YWluZXJFbGVtZW50O2lmKGdbMF0hPWRvY3VtZW50JiYoL3N0YXRpYy8pLnRlc3QoZy5jc3MoInBvc2l0aW9uIikpKXtkPW59aWYobS5sZWZ0PChzLl9oZWxwZXI/bi5sZWZ0OjApKXtzLnNpemUud2lkdGg9cy5zaXplLndpZHRoKyhzLl9oZWxwZXI/KHMucG9zaXRpb24ubGVmdC1uLmxlZnQpOihzLnBvc2l0aW9uLmxlZnQtZC5sZWZ0KSk7aWYocSl7cy5zaXplLmhlaWdodD1zLnNpemUud2lkdGgvaC5hc3BlY3RSYXRpb31zLnBvc2l0aW9uLmxlZnQ9aC5oZWxwZXI/bi5sZWZ0OjB9aWYobS50b3A8KHMuX2hlbHBlcj9uLnRvcDowKSl7cy5zaXplLmhlaWdodD1zLnNpemUuaGVpZ2h0KyhzLl9oZWxwZXI/KHMucG9zaXRpb24udG9wLW4udG9wKTpzLnBvc2l0aW9uLnRvcCk7aWYocSl7cy5zaXplLndpZHRoPXMuc2l6ZS5oZWlnaHQqaC5hc3BlY3RSYXRpb31zLnBvc2l0aW9uLnRvcD1zLl9oZWxwZXI/bi50b3A6MH1zLm9mZnNldC5sZWZ0PXMucGFyZW50RGF0YS5sZWZ0K3MucG9zaXRpb24ubGVmdDtzLm9mZnNldC50b3A9cy5wYXJlbnREYXRhLnRvcCtzLnBvc2l0aW9uLnRvcDt2YXIgaz1NYXRoLmFicygocy5faGVscGVyP3Mub2Zmc2V0LmxlZnQtZC5sZWZ0OihzLm9mZnNldC5sZWZ0LWQubGVmdCkpK3Muc2l6ZURpZmYud2lkdGgpLHI9TWF0aC5hYnMoKHMuX2hlbHBlcj9zLm9mZnNldC50b3AtZC50b3A6KHMub2Zmc2V0LnRvcC1uLnRvcCkpK3Muc2l6ZURpZmYuaGVpZ2h0KTt2YXIgaj1zLmNvbnRhaW5lckVsZW1lbnQuZ2V0KDApPT1zLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLGk9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KHMuY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpO2lmKGomJmkpe2stPXMucGFyZW50RGF0YS5sZWZ0fWlmKGsrcy5zaXplLndpZHRoPj1zLnBhcmVudERhdGEud2lkdGgpe3Muc2l6ZS53aWR0aD1zLnBhcmVudERhdGEud2lkdGgtaztpZihxKXtzLnNpemUuaGVpZ2h0PXMuc2l6ZS53aWR0aC9zLmFzcGVjdFJhdGlvfX1pZihyK3Muc2l6ZS5oZWlnaHQ+PXMucGFyZW50RGF0YS5oZWlnaHQpe3Muc2l6ZS5oZWlnaHQ9cy5wYXJlbnREYXRhLmhlaWdodC1yO2lmKHEpe3Muc2l6ZS53aWR0aD1zLnNpemUuaGVpZ2h0KnMuYXNwZWN0UmF0aW99fX0sc3RvcDpmdW5jdGlvbihlLG0pe3ZhciBwPWModGhpcykuZGF0YSgicmVzaXphYmxlIiksZj1wLm9wdGlvbnMsaz1wLnBvc2l0aW9uLGw9cC5jb250YWluZXJPZmZzZXQsZD1wLmNvbnRhaW5lclBvc2l0aW9uLGc9cC5jb250YWluZXJFbGVtZW50O3ZhciBpPWMocC5oZWxwZXIpLHE9aS5vZmZzZXQoKSxuPWkub3V0ZXJXaWR0aCgpLXAuc2l6ZURpZmYud2lkdGgsaj1pLm91dGVySGVpZ2h0KCktcC5zaXplRGlmZi5oZWlnaHQ7aWYocC5faGVscGVyJiYhZi5hbmltYXRlJiYoL3JlbGF0aXZlLykudGVzdChnLmNzcygicG9zaXRpb24iKSkpe2ModGhpcykuY3NzKHtsZWZ0OnEubGVmdC1kLmxlZnQtbC5sZWZ0LHdpZHRoOm4saGVpZ2h0Omp9KX1pZihwLl9oZWxwZXImJiFmLmFuaW1hdGUmJigvc3RhdGljLykudGVzdChnLmNzcygicG9zaXRpb24iKSkpe2ModGhpcykuY3NzKHtsZWZ0OnEubGVmdC1kLmxlZnQtbC5sZWZ0LHdpZHRoOm4saGVpZ2h0Omp9KX19fSk7Yy51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJnaG9zdCIse3N0YXJ0OmZ1bmN0aW9uKGYsZyl7dmFyIGQ9Yyh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxoPWQub3B0aW9ucyxlPWQuc2l6ZTtkLmdob3N0PWQub3JpZ2luYWxFbGVtZW50LmNsb25lKCk7ZC5naG9zdC5jc3Moe29wYWNpdHk6MC4yNSxkaXNwbGF5OiJibG9jayIscG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6ZS5oZWlnaHQsd2lkdGg6ZS53aWR0aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWdob3N0IikuYWRkQ2xhc3ModHlwZW9mIGguZ2hvc3Q9PSJzdHJpbmciP2guZ2hvc3Q6IiIpO2QuZ2hvc3QuYXBwZW5kVG8oZC5oZWxwZXIpfSxyZXNpemU6ZnVuY3Rpb24oZSxmKXt2YXIgZD1jKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGc9ZC5vcHRpb25zO2lmKGQuZ2hvc3Qpe2QuZ2hvc3QuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpkLnNpemUuaGVpZ2h0LHdpZHRoOmQuc2l6ZS53aWR0aH0pfX0sc3RvcDpmdW5jdGlvbihlLGYpe3ZhciBkPWModGhpcykuZGF0YSgicmVzaXphYmxlIiksZz1kLm9wdGlvbnM7aWYoZC5naG9zdCYmZC5oZWxwZXIpe2QuaGVscGVyLmdldCgwKS5yZW1vdmVDaGlsZChkLmdob3N0LmdldCgwKSl9fX0pO2MudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbihkLGwpe3ZhciBuPWModGhpcykuZGF0YSgicmVzaXphYmxlIiksZz1uLm9wdGlvbnMsaj1uLnNpemUsaD1uLm9yaWdpbmFsU2l6ZSxpPW4ub3JpZ2luYWxQb3NpdGlvbixtPW4uYXhpcyxrPWcuX2FzcGVjdFJhdGlvfHxkLnNoaWZ0S2V5O2cuZ3JpZD10eXBlb2YgZy5ncmlkPT0ibnVtYmVyIj9bZy5ncmlkLGcuZ3JpZF06Zy5ncmlkO3ZhciBmPU1hdGgucm91bmQoKGoud2lkdGgtaC53aWR0aCkvKGcuZ3JpZFswXXx8MSkpKihnLmdyaWRbMF18fDEpLGU9TWF0aC5yb3VuZCgoai5oZWlnaHQtaC5oZWlnaHQpLyhnLmdyaWRbMV18fDEpKSooZy5ncmlkWzFdfHwxKTtpZigvXihzZXxzfGUpJC8udGVzdChtKSl7bi5zaXplLndpZHRoPWgud2lkdGgrZjtuLnNpemUuaGVpZ2h0PWguaGVpZ2h0K2V9ZWxzZXtpZigvXihuZSkkLy50ZXN0KG0pKXtuLnNpemUud2lkdGg9aC53aWR0aCtmO24uc2l6ZS5oZWlnaHQ9aC5oZWlnaHQrZTtuLnBvc2l0aW9uLnRvcD1pLnRvcC1lfWVsc2V7aWYoL14oc3cpJC8udGVzdChtKSl7bi5zaXplLndpZHRoPWgud2lkdGgrZjtuLnNpemUuaGVpZ2h0PWguaGVpZ2h0K2U7bi5wb3NpdGlvbi5sZWZ0PWkubGVmdC1mfWVsc2V7bi5zaXplLndpZHRoPWgud2lkdGgrZjtuLnNpemUuaGVpZ2h0PWguaGVpZ2h0K2U7bi5wb3NpdGlvbi50b3A9aS50b3AtZTtuLnBvc2l0aW9uLmxlZnQ9aS5sZWZ0LWZ9fX19fSk7dmFyIGI9ZnVuY3Rpb24oZCl7cmV0dXJuIHBhcnNlSW50KGQsMTApfHwwfTt2YXIgYT1mdW5jdGlvbihkKXtyZXR1cm4gIWlzTmFOKHBhcnNlSW50KGQsMTApKX19KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIFNlbGVjdGFibGUgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9TZWxlY3RhYmxlcworICoKKyAqIERlcGVuZHM6CisgKgl1aS5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLndpZGdldCgidWkuc2VsZWN0YWJsZSIsYS5leHRlbmQoe30sYS51aS5tb3VzZSx7X2luaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpO3RoaXMuZHJhZ2dlZD1mYWxzZTt2YXIgYzt0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtjPWEoYi5vcHRpb25zLmZpbHRlcixiLmVsZW1lbnRbMF0pO2MuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyk7dmFyIGU9ZC5vZmZzZXQoKTthLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OmQsbGVmdDplLmxlZnQsdG9wOmUudG9wLHJpZ2h0OmUubGVmdCtkLm91dGVyV2lkdGgoKSxib3R0b206ZS50b3ArZC5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ZmFsc2Usc2VsZWN0ZWQ6ZC5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSxzZWxlY3Rpbmc6ZC5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksdW5zZWxlY3Rpbmc6ZC5oYXNDbGFzcygidWktdW5zZWxlY3RpbmciKX0pfSl9O3RoaXMucmVmcmVzaCgpO3RoaXMuc2VsZWN0ZWVzPWMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIik7dGhpcy5fbW91c2VJbml0KCk7dGhpcy5oZWxwZXI9YShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY3NzKHtib3JkZXI6IjFweCBkb3R0ZWQgYmxhY2sifSkuYWRkQ2xhc3MoInVpLXNlbGVjdGFibGUtaGVscGVyIil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIik7dGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGQpe3ZhciBiPXRoaXM7dGhpcy5vcG9zPVtkLnBhZ2VYLGQucGFnZVldO2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZCl7cmV0dXJufXZhciBjPXRoaXMub3B0aW9uczt0aGlzLnNlbGVjdGVlcz1hKGMuZmlsdGVyLHRoaXMuZWxlbWVudFswXSk7dGhpcy5fdHJpZ2dlcigic3RhcnQiLGQpO2EoYy5hcHBlbmRUbykuYXBwZW5kKHRoaXMuaGVscGVyKTt0aGlzLmhlbHBlci5jc3MoeyJ6LWluZGV4IjoxMDAscG9zaXRpb246ImFic29sdXRlIixsZWZ0OmQuY2xpZW50WCx0b3A6ZC5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KTtpZihjLmF1dG9SZWZyZXNoKXt0aGlzLnJlZnJlc2goKX10aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZS5zdGFydHNlbGVjdGVkPXRydWU7aWYoIWQubWV0YUtleSl7ZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTtlLnNlbGVjdGVkPWZhbHNlO2UuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7ZS51bnNlbGVjdGluZz10cnVlO2IuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixkLHt1bnNlbGVjdGluZzplLmVsZW1lbnR9KX19KTthKGQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZSl7ZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0aW5nIik7ZS51bnNlbGVjdGluZz1mYWxzZTtlLnNlbGVjdGluZz10cnVlO2Uuc2VsZWN0ZWQ9dHJ1ZTtiLl90cmlnZ2VyKCJzZWxlY3RpbmciLGQse3NlbGVjdGluZzplLmVsZW1lbnR9KTtyZXR1cm4gZmFsc2V9fSl9LF9tb3VzZURyYWc6ZnVuY3Rpb24oaSl7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9dHJ1ZTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpe3JldHVybn12YXIgZT10aGlzLm9wdGlvbnM7dmFyIGQ9dGhpcy5vcG9zWzBdLGg9dGhpcy5vcG9zWzFdLGI9aS5wYWdlWCxnPWkucGFnZVk7aWYoZD5iKXt2YXIgZj1iO2I9ZDtkPWZ9aWYoaD5nKXt2YXIgZj1nO2c9aDtoPWZ9dGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmQsdG9wOmgsd2lkdGg6Yi1kLGhlaWdodDpnLWh9KTt0aGlzLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGo9YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKCFqfHxqLmVsZW1lbnQ9PWMuZWxlbWVudFswXSl7cmV0dXJufXZhciBrPWZhbHNlO2lmKGUudG9sZXJhbmNlPT0idG91Y2giKXtrPSghKGoubGVmdD5ifHxqLnJpZ2h0PGR8fGoudG9wPmd8fGouYm90dG9tPGgpKX1lbHNle2lmKGUudG9sZXJhbmNlPT0iZml0Iil7az0oai5sZWZ0PmQmJmoucmlnaHQ8YiYmai50b3A+aCYmai5ib3R0b208Zyl9fWlmKGspe2lmKGouc2VsZWN0ZWQpe2ouJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIik7ai5zZWxlY3RlZD1mYWxzZX1pZihqLnVuc2VsZWN0aW5nKXtqLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpO2oudW5zZWxlY3Rpbmc9ZmFsc2V9aWYoIWouc2VsZWN0aW5nKXtqLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RpbmciKTtqLnNlbGVjdGluZz10cnVlO2MuX3RyaWdnZXIoInNlbGVjdGluZyIsaSx7c2VsZWN0aW5nOmouZWxlbWVudH0pfX1lbHNle2lmKGouc2VsZWN0aW5nKXtpZihpLm1ldGFLZXkmJmouc3RhcnRzZWxlY3RlZCl7ai4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIik7ai5zZWxlY3Rpbmc9ZmFsc2U7ai4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0ZWQiKTtqLnNlbGVjdGVkPXRydWV9ZWxzZXtqLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKTtqLnNlbGVjdGluZz1mYWxzZTtpZihqLnN0YXJ0c2VsZWN0ZWQpe2ouJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7ai51bnNlbGVjdGluZz10cnVlfWMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixpLHt1bnNlbGVjdGluZzpqLmVsZW1lbnR9KX19aWYoai5zZWxlY3RlZCl7aWYoIWkubWV0YUtleSYmIWouc3RhcnRzZWxlY3RlZCl7ai4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTtqLnNlbGVjdGVkPWZhbHNlO2ouJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7ai51bnNlbGVjdGluZz10cnVlO2MuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixpLHt1bnNlbGVjdGluZzpqLmVsZW1lbnR9KX19fX0pO3JldHVybiBmYWxzZX0sX21vdXNlU3RvcDpmdW5jdGlvbihkKXt2YXIgYj10aGlzO3RoaXMuZHJhZ2dlZD1mYWxzZTt2YXIgYz10aGlzLm9wdGlvbnM7YSgiLnVpLXVuc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTtlLnVuc2VsZWN0aW5nPWZhbHNlO2Uuc3RhcnRzZWxlY3RlZD1mYWxzZTtiLl90cmlnZ2VyKCJ1bnNlbGVjdGVkIixkLHt1bnNlbGVjdGVkOmUuZWxlbWVudH0pfSk7YSgiLnVpLXNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2UuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpO2Uuc2VsZWN0aW5nPWZhbHNlO2Uuc2VsZWN0ZWQ9dHJ1ZTtlLnN0YXJ0c2VsZWN0ZWQ9dHJ1ZTtiLl90cmlnZ2VyKCJzZWxlY3RlZCIsZCx7c2VsZWN0ZWQ6ZS5lbGVtZW50fSl9KTt0aGlzLl90cmlnZ2VyKCJzdG9wIixkKTt0aGlzLmhlbHBlci5yZW1vdmUoKTtyZXR1cm4gZmFsc2V9fSkpO2EuZXh0ZW5kKGEudWkuc2VsZWN0YWJsZSx7dmVyc2lvbjoiMS43LjIiLGRlZmF1bHRzOnthcHBlbmRUbzoiYm9keSIsYXV0b1JlZnJlc2g6dHJ1ZSxjYW5jZWw6IjppbnB1dCxvcHRpb24iLGRlbGF5OjAsZGlzdGFuY2U6MCxmaWx0ZXI6IioiLHRvbGVyYW5jZToidG91Y2gifX0pfSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBTb3J0YWJsZSAxLjcuMgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoTUlULUxJQ0VOU0UudHh0KQorICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBsaWNlbnNlcy4KKyAqCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1NvcnRhYmxlcworICoKKyAqIERlcGVuZHM6CisgKgl1aS5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLndpZGdldCgidWkuc29ydGFibGUiLGEuZXh0ZW5kKHt9LGEudWkubW91c2Use19pbml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO3RoaXMuY29udGFpbmVyQ2FjaGU9e307dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zb3J0YWJsZSIpO3RoaXMucmVmcmVzaCgpO3RoaXMuZmxvYXRpbmc9dGhpcy5pdGVtcy5sZW5ndGg/KC9sZWZ0fHJpZ2h0LykudGVzdCh0aGlzLml0ZW1zWzBdLml0ZW0uY3NzKCJmbG9hdCIpKTpmYWxzZTt0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCk7dGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlIHVpLXNvcnRhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgic29ydGFibGUiKS51bmJpbmQoIi5zb3J0YWJsZSIpO3RoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aC0xO2I+PTA7Yi0tKXt0aGlzLml0ZW1zW2JdLml0ZW0ucmVtb3ZlRGF0YSgic29ydGFibGUtaXRlbSIpfX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihlLGYpe2lmKHRoaXMucmV2ZXJ0aW5nKXtyZXR1cm4gZmFsc2V9aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLm9wdGlvbnMudHlwZT09InN0YXRpYyIpe3JldHVybiBmYWxzZX10aGlzLl9yZWZyZXNoSXRlbXMoZSk7dmFyIGQ9bnVsbCxjPXRoaXMsYj1hKGUudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLCJzb3J0YWJsZS1pdGVtIik9PWMpe2Q9YSh0aGlzKTtyZXR1cm4gZmFsc2V9fSk7aWYoYS5kYXRhKGUudGFyZ2V0LCJzb3J0YWJsZS1pdGVtIik9PWMpe2Q9YShlLnRhcmdldCl9aWYoIWQpe3JldHVybiBmYWxzZX1pZih0aGlzLm9wdGlvbnMuaGFuZGxlJiYhZil7dmFyIGc9ZmFsc2U7YSh0aGlzLm9wdGlvbnMuaGFuZGxlLGQpLmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpe2lmKHRoaXM9PWUudGFyZ2V0KXtnPXRydWV9fSk7aWYoIWcpe3JldHVybiBmYWxzZX19dGhpcy5jdXJyZW50SXRlbT1kO3RoaXMuX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zKCk7cmV0dXJuIHRydWV9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGUsZixiKXt2YXIgZz10aGlzLm9wdGlvbnMsYz10aGlzO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzO3RoaXMucmVmcmVzaFBvc2l0aW9ucygpO3RoaXMuaGVscGVyPXRoaXMuX2NyZWF0ZUhlbHBlcihlKTt0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7dGhpcy5fY2FjaGVNYXJnaW5zKCk7dGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCk7dGhpcy5vZmZzZXQ9dGhpcy5jdXJyZW50SXRlbS5vZmZzZXQoKTt0aGlzLm9mZnNldD17dG9wOnRoaXMub2Zmc2V0LnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5vZmZzZXQubGVmdC10aGlzLm1hcmdpbnMubGVmdH07dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIik7dGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIik7YS5leHRlbmQodGhpcy5vZmZzZXQse2NsaWNrOntsZWZ0OmUucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6ZS5wYWdlWS10aGlzLm9mZnNldC50b3B9LHBhcmVudDp0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSxyZWxhdGl2ZTp0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpfSk7dGhpcy5vcmlnaW5hbFBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oZSk7dGhpcy5vcmlnaW5hbFBhZ2VYPWUucGFnZVg7dGhpcy5vcmlnaW5hbFBhZ2VZPWUucGFnZVk7aWYoZy5jdXJzb3JBdCl7dGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihnLmN1cnNvckF0KX10aGlzLmRvbVBvc2l0aW9uPXtwcmV2OnRoaXMuY3VycmVudEl0ZW0ucHJldigpWzBdLHBhcmVudDp0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdfTtpZih0aGlzLmhlbHBlclswXSE9dGhpcy5jdXJyZW50SXRlbVswXSl7dGhpcy5jdXJyZW50SXRlbS5oaWRlKCl9dGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKTtpZihnLmNvbnRhaW5tZW50KXt0aGlzLl9zZXRDb250YWlubWVudCgpfWlmKGcuY3Vyc29yKXtpZihhKCJib2R5IikuY3NzKCJjdXJzb3IiKSl7dGhpcy5fc3RvcmVkQ3Vyc29yPWEoImJvZHkiKS5jc3MoImN1cnNvciIpfWEoImJvZHkiKS5jc3MoImN1cnNvciIsZy5jdXJzb3IpfWlmKGcub3BhY2l0eSl7aWYodGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iikpe3RoaXMuX3N0b3JlZE9wYWNpdHk9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iil9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixnLm9wYWNpdHkpfWlmKGcuekluZGV4KXtpZih0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpKXt0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKX10aGlzLmhlbHBlci5jc3MoInpJbmRleCIsZy56SW5kZXgpfWlmKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXt0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpfXRoaXMuX3RyaWdnZXIoInN0YXJ0IixlLHRoaXMuX3VpSGFzaCgpKTtpZighdGhpcy5fcHJlc2VydmVIZWxwZXJQcm9wb3J0aW9ucyl7dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpfWlmKCFiKXtmb3IodmFyIGQ9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Q+PTA7ZC0tKXt0aGlzLmNvbnRhaW5lcnNbZF0uX3RyaWdnZXIoImFjdGl2YXRlIixlLGMuX3VpSGFzaCh0aGlzKSl9fWlmKGEudWkuZGRtYW5hZ2VyKXthLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXN9aWYoYS51aS5kZG1hbmFnZXImJiFnLmRyb3BCZWhhdmlvdXIpe2EudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsZSl9dGhpcy5kcmFnZ2luZz10cnVlO3RoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTt0aGlzLl9tb3VzZURyYWcoZSk7cmV0dXJuIHRydWV9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZil7dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGYpO3RoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIXRoaXMubGFzdFBvc2l0aW9uQWJzKXt0aGlzLmxhc3RQb3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzfWlmKHRoaXMub3B0aW9ucy5zY3JvbGwpe3ZhciBnPXRoaXMub3B0aW9ucyxiPWZhbHNlO2lmKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZigodGhpcy5vdmVyZmxvd09mZnNldC50b3ArdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0KS1mLnBhZ2VZPGcuc2Nyb2xsU2Vuc2l0aXZpdHkpe3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1iPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtnLnNjcm9sbFNwZWVkfWVsc2V7aWYoZi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxnLnNjcm9sbFNlbnNpdGl2aXR5KXt0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9Yj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AtZy5zY3JvbGxTcGVlZH19aWYoKHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aCktZi5wYWdlWDxnLnNjcm9sbFNlbnNpdGl2aXR5KXt0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PWI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCtnLnNjcm9sbFNwZWVkfWVsc2V7aWYoZi5wYWdlWC10aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQ8Zy5zY3JvbGxTZW5zaXRpdml0eSl7dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1iPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtZy5zY3JvbGxTcGVlZH19fWVsc2V7aWYoZi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxnLnNjcm9sbFNlbnNpdGl2aXR5KXtiPWEoZG9jdW1lbnQpLnNjcm9sbFRvcChhKGRvY3VtZW50KS5zY3JvbGxUb3AoKS1nLnNjcm9sbFNwZWVkKX1lbHNle2lmKGEod2luZG93KS5oZWlnaHQoKS0oZi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8Zy5zY3JvbGxTZW5zaXRpdml0eSl7Yj1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrZy5zY3JvbGxTcGVlZCl9fWlmKGYucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGcuc2Nyb2xsU2Vuc2l0aXZpdHkpe2I9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktZy5zY3JvbGxTcGVlZCl9ZWxzZXtpZihhKHdpbmRvdykud2lkdGgoKS0oZi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGcuc2Nyb2xsU2Vuc2l0aXZpdHkpe2I9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkrZy5zY3JvbGxTcGVlZCl9fX1pZihiIT09ZmFsc2UmJmEudWkuZGRtYW5hZ2VyJiYhZy5kcm9wQmVoYXZpb3VyKXthLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGYpfX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil7dGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4In1pZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieCIpe3RoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgifWZvcih2YXIgZD10aGlzLml0ZW1zLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZT10aGlzLml0ZW1zW2RdLGM9ZS5pdGVtWzBdLGg9dGhpcy5faW50ZXJzZWN0c1dpdGhQb2ludGVyKGUpO2lmKCFoKXtjb250aW51ZX1pZihjIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyW2g9PTE/Im5leHQiOiJwcmV2Il0oKVswXSE9YyYmIWEudWkuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxjKSYmKHRoaXMub3B0aW9ucy50eXBlPT0ic2VtaS1keW5hbWljIj8hYS51aS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sYyk6dHJ1ZSkpe3RoaXMuZGlyZWN0aW9uPWg9PTE/ImRvd24iOiJ1cCI7aWYodGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKGUpKXt0aGlzLl9yZWFycmFuZ2UoZixlKX1lbHNle2JyZWFrfXRoaXMuX3RyaWdnZXIoImNoYW5nZSIsZix0aGlzLl91aUhhc2goKSk7YnJlYWt9fXRoaXMuX2NvbnRhY3RDb250YWluZXJzKGYpO2lmKGEudWkuZGRtYW5hZ2VyKXthLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsZil9dGhpcy5fdHJpZ2dlcigic29ydCIsZix0aGlzLl91aUhhc2goKSk7dGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicztyZXR1cm4gZmFsc2V9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYyxkKXtpZighYyl7cmV0dXJufWlmKGEudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIpe2EudWkuZGRtYW5hZ2VyLmRyb3AodGhpcyxjKX1pZih0aGlzLm9wdGlvbnMucmV2ZXJ0KXt2YXIgYj10aGlzO3ZhciBlPWIucGxhY2Vob2xkZXIub2Zmc2V0KCk7Yi5yZXZlcnRpbmc9dHJ1ZTthKHRoaXMuaGVscGVyKS5hbmltYXRlKHtsZWZ0OmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdC1iLm1hcmdpbnMubGVmdCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxMZWZ0KSx0b3A6ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcC1iLm1hcmdpbnMudG9wKyh0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbFRvcCl9LHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnQsMTApfHw1MDAsZnVuY3Rpb24oKXtiLl9jbGVhcihjKX0pfWVsc2V7dGhpcy5fY2xlYXIoYyxkKX1yZXR1cm4gZmFsc2V9LGNhbmNlbDpmdW5jdGlvbigpe3ZhciBiPXRoaXM7aWYodGhpcy5kcmFnZ2luZyl7dGhpcy5fbW91c2VVcCgpO2lmKHRoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCIpe3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpfWVsc2V7dGhpcy5jdXJyZW50SXRlbS5zaG93KCl9Zm9yKHZhciBjPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtjPj0wO2MtLSl7dGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixudWxsLGIuX3VpSGFzaCh0aGlzKSk7aWYodGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXIpe3RoaXMuY29udGFpbmVyc1tjXS5fdHJpZ2dlcigib3V0IixudWxsLGIuX3VpSGFzaCh0aGlzKSk7dGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXI9MH19fWlmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSl7dGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pfWlmKHRoaXMub3B0aW9ucy5oZWxwZXIhPSJvcmlnaW5hbCImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlKXt0aGlzLmhlbHBlci5yZW1vdmUoKX1hLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzpmYWxzZSxyZXZlcnRpbmc6ZmFsc2UsX25vRmluYWxTb3J0Om51bGx9KTtpZih0aGlzLmRvbVBvc2l0aW9uLnByZXYpe2EodGhpcy5kb21Qb3NpdGlvbi5wcmV2KS5hZnRlcih0aGlzLmN1cnJlbnRJdGVtKX1lbHNle2EodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSl9cmV0dXJuIHRydWV9LHNlcmlhbGl6ZTpmdW5jdGlvbihkKXt2YXIgYj10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KGQmJmQuY29ubmVjdGVkKTt2YXIgYz1bXTtkPWR8fHt9O2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBlPShhKGQuaXRlbXx8dGhpcykuYXR0cihkLmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaChkLmV4cHJlc3Npb258fCgvKC4rKVstPV9dKC4rKS8pKTtpZihlKXtjLnB1c2goKGQua2V5fHxlWzFdKyJbXSIpKyI9IisoZC5rZXkmJmQuZXhwcmVzc2lvbj9lWzFdOmVbMl0pKX19KTtyZXR1cm4gYy5qb2luKCImIil9LHRvQXJyYXk6ZnVuY3Rpb24oZCl7dmFyIGI9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShkJiZkLmNvbm5lY3RlZCk7dmFyIGM9W107ZD1kfHx7fTtiLmVhY2goZnVuY3Rpb24oKXtjLnB1c2goYShkLml0ZW18fHRoaXMpLmF0dHIoZC5hdHRyaWJ1dGV8fCJpZCIpfHwiIil9KTtyZXR1cm4gY30sX2ludGVyc2VjdHNXaXRoOmZ1bmN0aW9uKG0pe3ZhciBlPXRoaXMucG9zaXRpb25BYnMubGVmdCxkPWUrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxrPXRoaXMucG9zaXRpb25BYnMudG9wLGo9ayt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodDt2YXIgZj1tLmxlZnQsYz1mK20ud2lkdGgsbj1tLnRvcCxpPW4rbS5oZWlnaHQ7dmFyIG89dGhpcy5vZmZzZXQuY2xpY2sudG9wLGg9dGhpcy5vZmZzZXQuY2xpY2subGVmdDt2YXIgZz0oaytvKT5uJiYoaytvKTxpJiYoZStoKT5mJiYoZStoKTxjO2lmKHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5vcHRpb25zLmZvcmNlUG9pbnRlckZvckNvbnRhaW5lcnN8fCh0aGlzLm9wdGlvbnMudG9sZXJhbmNlIT0icG9pbnRlciImJnRoaXMuaGVscGVyUHJvcG9ydGlvbnNbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT5tW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0pKXtyZXR1cm4gZ31lbHNle3JldHVybihmPGUrKHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMikmJmQtKHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMik8YyYmbjxrKyh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yKSYmai0odGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMik8aSl9fSxfaW50ZXJzZWN0c1dpdGhQb2ludGVyOmZ1bmN0aW9uKGQpe3ZhciBlPWEudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsZC50b3AsZC5oZWlnaHQpLGM9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGQubGVmdCxkLndpZHRoKSxnPWUmJmMsYj10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxmPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7aWYoIWcpe3JldHVybiBmYWxzZX1yZXR1cm4gdGhpcy5mbG9hdGluZz8oKChmJiZmPT0icmlnaHQiKXx8Yj09ImRvd24iKT8yOjEpOihiJiYoYj09ImRvd24iPzI6MSkpfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbihlKXt2YXIgYz1hLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGUudG9wKyhlLmhlaWdodC8yKSxlLmhlaWdodCksZD1hLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZS5sZWZ0KyhlLndpZHRoLzIpLGUud2lkdGgpLGI9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksZj10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO2lmKHRoaXMuZmxvYXRpbmcmJmYpe3JldHVybigoZj09InJpZ2h0IiYmZCl8fChmPT0ibGVmdCImJiFkKSl9ZWxzZXtyZXR1cm4gYiYmKChiPT0iZG93biImJmMpfHwoYj09InVwIiYmIWMpKX19LF9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIGIhPTAmJihiPjA/ImRvd24iOiJ1cCIpfSxfZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBvc2l0aW9uQWJzLmxlZnQtdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDtyZXR1cm4gYiE9MCYmKGI+MD8icmlnaHQiOiJsZWZ0Iil9LHJlZnJlc2g6ZnVuY3Rpb24oYil7dGhpcy5fcmVmcmVzaEl0ZW1zKGIpO3RoaXMucmVmcmVzaFBvc2l0aW9ucygpfSxfY29ubmVjdFdpdGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7cmV0dXJuIGIuY29ubmVjdFdpdGguY29uc3RydWN0b3I9PVN0cmluZz9bYi5jb25uZWN0V2l0aF06Yi5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24oYil7dmFyIGw9dGhpczt2YXIgZz1bXTt2YXIgZT1bXTt2YXIgaD10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGgmJmIpe2Zvcih2YXIgZD1oLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgaz1hKGhbZF0pO2Zvcih2YXIgYz1rLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZj1hLmRhdGEoa1tjXSwic29ydGFibGUiKTtpZihmJiZmIT10aGlzJiYhZi5vcHRpb25zLmRpc2FibGVkKXtlLnB1c2goW2EuaXNGdW5jdGlvbihmLm9wdGlvbnMuaXRlbXMpP2Yub3B0aW9ucy5pdGVtcy5jYWxsKGYuZWxlbWVudCk6YShmLm9wdGlvbnMuaXRlbXMsZi5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKSxmXSl9fX19ZS5wdXNoKFthLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnQsbnVsbCx7b3B0aW9uczp0aGlzLm9wdGlvbnMsaXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKSx0aGlzXSk7Zm9yKHZhciBkPWUubGVuZ3RoLTE7ZD49MDtkLS0pe2VbZF1bMF0uZWFjaChmdW5jdGlvbigpe2cucHVzaCh0aGlzKX0pfXJldHVybiBhKGcpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKHNvcnRhYmxlLWl0ZW0pIik7Zm9yKHZhciBjPTA7Yzx0aGlzLml0ZW1zLmxlbmd0aDtjKyspe2Zvcih2YXIgYj0wO2I8ZC5sZW5ndGg7YisrKXtpZihkW2JdPT10aGlzLml0ZW1zW2NdLml0ZW1bMF0pe3RoaXMuaXRlbXMuc3BsaWNlKGMsMSl9fX19LF9yZWZyZXNoSXRlbXM6ZnVuY3Rpb24oYil7dGhpcy5pdGVtcz1bXTt0aGlzLmNvbnRhaW5lcnM9W3RoaXNdO3ZhciBoPXRoaXMuaXRlbXM7dmFyIHA9dGhpczt2YXIgZj1bW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSxiLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXTt2YXIgbD10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGwpe2Zvcih2YXIgZT1sLmxlbmd0aC0xO2U+PTA7ZS0tKXt2YXIgbT1hKGxbZV0pO2Zvcih2YXIgZD1tLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZz1hLmRhdGEobVtkXSwic29ydGFibGUiKTtpZihnJiZnIT10aGlzJiYhZy5vcHRpb25zLmRpc2FibGVkKXtmLnB1c2goW2EuaXNGdW5jdGlvbihnLm9wdGlvbnMuaXRlbXMpP2cub3B0aW9ucy5pdGVtcy5jYWxsKGcuZWxlbWVudFswXSxiLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKGcub3B0aW9ucy5pdGVtcyxnLmVsZW1lbnQpLGddKTt0aGlzLmNvbnRhaW5lcnMucHVzaChnKX19fX1mb3IodmFyIGU9Zi5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGs9ZltlXVsxXTt2YXIgYz1mW2VdWzBdO2Zvcih2YXIgZD0wLG49Yy5sZW5ndGg7ZDxuO2QrKyl7dmFyIG89YShjW2RdKTtvLmRhdGEoInNvcnRhYmxlLWl0ZW0iLGspO2gucHVzaCh7aXRlbTpvLGluc3RhbmNlOmssd2lkdGg6MCxoZWlnaHQ6MCxsZWZ0OjAsdG9wOjB9KX19fSxyZWZyZXNoUG9zaXRpb25zOmZ1bmN0aW9uKGIpe2lmKHRoaXMub2Zmc2V0UGFyZW50JiZ0aGlzLmhlbHBlcil7dGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpfWZvcih2YXIgZD10aGlzLml0ZW1zLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZT10aGlzLml0ZW1zW2RdO2lmKGUuaW5zdGFuY2UhPXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZlLml0ZW1bMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0pe2NvbnRpbnVlfXZhciBjPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2EodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQsZS5pdGVtKTplLml0ZW07aWYoIWIpe2Uud2lkdGg9Yy5vdXRlcldpZHRoKCk7ZS5oZWlnaHQ9Yy5vdXRlckhlaWdodCgpfXZhciBmPWMub2Zmc2V0KCk7ZS5sZWZ0PWYubGVmdDtlLnRvcD1mLnRvcH1pZih0aGlzLm9wdGlvbnMuY3VzdG9tJiZ0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKXt0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyl9ZWxzZXtmb3IodmFyIGQ9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZj10aGlzLmNvbnRhaW5lcnNbZF0uZWxlbWVudC5vZmZzZXQoKTt0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUubGVmdD1mLmxlZnQ7dGhpcy5jb250YWluZXJzW2RdLmNvbnRhaW5lckNhY2hlLnRvcD1mLnRvcDt0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW2RdLmVsZW1lbnQub3V0ZXJXaWR0aCgpO3RoaXMuY29udGFpbmVyc1tkXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW2RdLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX19fSxfY3JlYXRlUGxhY2Vob2xkZXI6ZnVuY3Rpb24oZCl7dmFyIGI9ZHx8dGhpcyxlPWIub3B0aW9ucztpZighZS5wbGFjZWhvbGRlcnx8ZS5wbGFjZWhvbGRlci5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt2YXIgYz1lLnBsYWNlaG9sZGVyO2UucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZj1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYi5jdXJyZW50SXRlbVswXS5ub2RlTmFtZSkpLmFkZENsYXNzKGN8fGIuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIilbMF07aWYoIWMpe2Yuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn1yZXR1cm4gZn0sdXBkYXRlOmZ1bmN0aW9uKGYsZyl7aWYoYyYmIWUuZm9yY2VQbGFjZWhvbGRlclNpemUpe3JldHVybn1pZighZy5oZWlnaHQoKSl7Zy5oZWlnaHQoYi5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KGIuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KGIuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKX1pZighZy53aWR0aCgpKXtnLndpZHRoKGIuY3VycmVudEl0ZW0uaW5uZXJXaWR0aCgpLXBhcnNlSW50KGIuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nTGVmdCIpfHwwLDEwKS1wYXJzZUludChiLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1JpZ2h0Iil8fDAsMTApKX19fX1iLnBsYWNlaG9sZGVyPWEoZS5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwoYi5lbGVtZW50LGIuY3VycmVudEl0ZW0pKTtiLmN1cnJlbnRJdGVtLmFmdGVyKGIucGxhY2Vob2xkZXIpO2UucGxhY2Vob2xkZXIudXBkYXRlKGIsYi5wbGFjZWhvbGRlcil9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbihkKXtmb3IodmFyIGM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2M+PTA7Yy0tKXtpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUpKXtpZighdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXIpe2lmKHRoaXMuY3VycmVudENvbnRhaW5lciE9dGhpcy5jb250YWluZXJzW2NdKXt2YXIgaD0xMDAwMDt2YXIgZz1udWxsO3ZhciBlPXRoaXMucG9zaXRpb25BYnNbdGhpcy5jb250YWluZXJzW2NdLmZsb2F0aW5nPyJsZWZ0IjoidG9wIl07Zm9yKHZhciBiPXRoaXMuaXRlbXMubGVuZ3RoLTE7Yj49MDtiLS0pe2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tjXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbYl0uaXRlbVswXSkpe2NvbnRpbnVlfXZhciBmPXRoaXMuaXRlbXNbYl1bdGhpcy5jb250YWluZXJzW2NdLmZsb2F0aW5nPyJsZWZ0IjoidG9wIl07aWYoTWF0aC5hYnMoZi1lKTxoKXtoPU1hdGguYWJzKGYtZSk7Zz10aGlzLml0ZW1zW2JdfX1pZighZyYmIXRoaXMub3B0aW9ucy5kcm9wT25FbXB0eSl7Y29udGludWV9dGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMuY29udGFpbmVyc1tjXTtnP3RoaXMuX3JlYXJyYW5nZShkLGcsbnVsbCx0cnVlKTp0aGlzLl9yZWFycmFuZ2UoZCxudWxsLHRoaXMuY29udGFpbmVyc1tjXS5lbGVtZW50LHRydWUpO3RoaXMuX3RyaWdnZXIoImNoYW5nZSIsZCx0aGlzLl91aUhhc2goKSk7dGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJjaGFuZ2UiLGQsdGhpcy5fdWlIYXNoKHRoaXMpKTt0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKX10aGlzLmNvbnRhaW5lcnNbY10uX3RyaWdnZXIoIm92ZXIiLGQsdGhpcy5fdWlIYXNoKHRoaXMpKTt0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUub3Zlcj0xfX1lbHNle2lmKHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyKXt0aGlzLmNvbnRhaW5lcnNbY10uX3RyaWdnZXIoIm91dCIsZCx0aGlzLl91aUhhc2godGhpcykpO3RoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyPTB9fX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYyl7dmFyIGQ9dGhpcy5vcHRpb25zO3ZhciBiPWEuaXNGdW5jdGlvbihkLmhlbHBlcik/YShkLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW2MsdGhpcy5jdXJyZW50SXRlbV0pKTooZC5oZWxwZXI9PSJjbG9uZSI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW0pO2lmKCFiLnBhcmVudHMoImJvZHkiKS5sZW5ndGgpe2EoZC5hcHBlbmRUbyE9InBhcmVudCI/ZC5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKGJbMF0pfWlmKGJbMF09PXRoaXMuY3VycmVudEl0ZW1bMF0pe3RoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9fWlmKGJbMF0uc3R5bGUud2lkdGg9PSIifHxkLmZvcmNlSGVscGVyU2l6ZSl7Yi53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpfWlmKGJbMF0uc3R5bGUuaGVpZ2h0PT0iInx8ZC5mb3JjZUhlbHBlclNpemUpe2IuaGVpZ2h0KHRoaXMuY3VycmVudEl0ZW0uaGVpZ2h0KCkpfXJldHVybiBifSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbihiKXtpZihiLmxlZnQhPXVuZGVmaW5lZCl7dGhpcy5vZmZzZXQuY2xpY2subGVmdD1iLmxlZnQrdGhpcy5tYXJnaW5zLmxlZnR9aWYoYi5yaWdodCE9dW5kZWZpbmVkKXt0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdH1pZihiLnRvcCE9dW5kZWZpbmVkKXt0aGlzLm9mZnNldC5jbGljay50b3A9Yi50b3ArdGhpcy5tYXJnaW5zLnRvcH1pZihiLmJvdHRvbSE9dW5kZWZpbmVkKXt0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtYi5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcH19LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgYj10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTtpZih0aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKXtiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTtiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCl9aWYoKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5KXx8KHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJnRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09Imh0bWwiJiZhLmJyb3dzZXIubXNpZSkpe2I9e3RvcDowLGxlZnQ6MH19cmV0dXJue3RvcDpiLnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDpiLmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKHRoaXMuY3NzUG9zaXRpb249PSJyZWxhdGl2ZSIpe3ZhciBiPXRoaXMuY3VycmVudEl0ZW0ucG9zaXRpb24oKTtyZXR1cm57dG9wOmIudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDpiLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1lbHNle3JldHVybnt0b3A6MCxsZWZ0OjB9fX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDoocGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDApLHRvcDoocGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztpZihlLmNvbnRhaW5tZW50PT0icGFyZW50Iil7ZS5jb250YWlubWVudD10aGlzLmhlbHBlclswXS5wYXJlbnROb2RlfWlmKGUuY29udGFpbm1lbnQ9PSJkb2N1bWVudCJ8fGUuY29udGFpbm1lbnQ9PSJ3aW5kb3ciKXt0aGlzLmNvbnRhaW5tZW50PVswLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsMC10aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcCxhKGUuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKGEoZS5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXX1pZighKC9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8pLnRlc3QoZS5jb250YWlubWVudCkpe3ZhciBjPWEoZS5jb250YWlubWVudClbMF07dmFyIGQ9YShlLmNvbnRhaW5tZW50KS5vZmZzZXQoKTt2YXIgYj0oYShjKS5jc3MoIm92ZXJmbG93IikhPSJoaWRkZW4iKTt0aGlzLmNvbnRhaW5tZW50PVtkLmxlZnQrKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChhKGMpLmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApLXRoaXMubWFyZ2lucy5sZWZ0LGQudG9wKyhwYXJzZUludChhKGMpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChhKGMpLmNzcygicGFkZGluZ1RvcCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLnRvcCxkLmxlZnQrKGI/TWF0aC5tYXgoYy5zY3JvbGxXaWR0aCxjLm9mZnNldFdpZHRoKTpjLm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsZC50b3ArKGI/TWF0aC5tYXgoYy5zY3JvbGxIZWlnaHQsYy5vZmZzZXRIZWlnaHQpOmMub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdfX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGYsaCl7aWYoIWgpe2g9dGhpcy5wb3NpdGlvbn12YXIgYz1mPT0iYWJzb2x1dGUiPzE6LTE7dmFyIGU9dGhpcy5vcHRpb25zLGI9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmISh0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPSgvKGh0bWx8Ym9keSkvaSkudGVzdChiWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6KGgudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpjK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqYy0oYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTooZz8wOmIuc2Nyb2xsVG9wKCkpKSpjKSksbGVmdDooaC5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqYyt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpjLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Yi5zY3JvbGxMZWZ0KCkpKmMpKX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUpe3ZhciBoPXRoaXMub3B0aW9ucyxiPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJiEodGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsaT0oLyhodG1sfGJvZHkpL2kpLnRlc3QoYlswXS50YWdOYW1lKTtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiJiYhKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPXRoaXMub2Zmc2V0UGFyZW50WzBdKSl7dGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX12YXIgZD1lLnBhZ2VYO3ZhciBjPWUucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXtpZih0aGlzLmNvbnRhaW5tZW50KXtpZihlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXSl7ZD10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnR9aWYoZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSl7Yz10aGlzLmNvbnRhaW5tZW50WzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcH1pZihlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSl7ZD10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnR9aWYoZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXSl7Yz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcH19aWYoaC5ncmlkKXt2YXIgZz10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoYy10aGlzLm9yaWdpbmFsUGFnZVkpL2guZ3JpZFsxXSkqaC5ncmlkWzFdO2M9dGhpcy5jb250YWlubWVudD8oIShnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdKT9nOighKGctdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0pP2ctaC5ncmlkWzFdOmcraC5ncmlkWzFdKSk6Zzt2YXIgZj10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoZC10aGlzLm9yaWdpbmFsUGFnZVgpL2guZ3JpZFswXSkqaC5ncmlkWzBdO2Q9dGhpcy5jb250YWlubWVudD8oIShmLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXXx8Zi10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0pP2Y6KCEoZi10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0pP2YtaC5ncmlkWzBdOmYraC5ncmlkWzBdKSk6Zn19cmV0dXJue3RvcDooYy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDoodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6KGk/MDpiLnNjcm9sbFRvcCgpKSkpKSxsZWZ0OihkLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aT8wOmIuc2Nyb2xsTGVmdCgpKSkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbihnLGYsYyxlKXtjP2NbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6Zi5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sKHRoaXMuZGlyZWN0aW9uPT0iZG93biI/Zi5pdGVtWzBdOmYuaXRlbVswXS5uZXh0U2libGluZykpO3RoaXMuY291bnRlcj10aGlzLmNvdW50ZXI/Kyt0aGlzLmNvdW50ZXI6MTt2YXIgZD10aGlzLGI9dGhpcy5jb3VudGVyO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoYj09ZC5jb3VudGVyKXtkLnJlZnJlc2hQb3NpdGlvbnMoIWUpfX0sMCl9LF9jbGVhcjpmdW5jdGlvbihkLGUpe3RoaXMucmV2ZXJ0aW5nPWZhbHNlO3ZhciBmPVtdLGI9dGhpcztpZighdGhpcy5fbm9GaW5hbFNvcnQmJnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSl7dGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSl9dGhpcy5fbm9GaW5hbFNvcnQ9bnVsbDtpZih0aGlzLmhlbHBlclswXT09dGhpcy5jdXJyZW50SXRlbVswXSl7Zm9yKHZhciBjIGluIHRoaXMuX3N0b3JlZENTUyl7aWYodGhpcy5fc3RvcmVkQ1NTW2NdPT0iYXV0byJ8fHRoaXMuX3N0b3JlZENTU1tjXT09InN0YXRpYyIpe3RoaXMuX3N0b3JlZENTU1tjXT0iIn19dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIil9ZWxzZXt0aGlzLmN1cnJlbnRJdGVtLnNob3coKX1pZih0aGlzLmZyb21PdXRzaWRlJiYhZSl7Zi5wdXNoKGZ1bmN0aW9uKGcpe3RoaXMuX3RyaWdnZXIoInJlY2VpdmUiLGcsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pfWlmKCh0aGlzLmZyb21PdXRzaWRlfHx0aGlzLmRvbVBvc2l0aW9uLnByZXYhPXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdfHx0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCE9dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkmJiFlKXtmLnB1c2goZnVuY3Rpb24oZyl7dGhpcy5fdHJpZ2dlcigidXBkYXRlIixnLHRoaXMuX3VpSGFzaCgpKX0pfWlmKCFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmN1cnJlbnRJdGVtWzBdKSl7aWYoIWUpe2YucHVzaChmdW5jdGlvbihnKXt0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLGcsdGhpcy5fdWlIYXNoKCkpfSl9Zm9yKHZhciBjPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtjPj0wO2MtLSl7aWYoYS51aS5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudFswXSx0aGlzLmN1cnJlbnRJdGVtWzBdKSYmIWUpe2YucHVzaCgoZnVuY3Rpb24oZyl7cmV0dXJuIGZ1bmN0aW9uKGgpe2cuX3RyaWdnZXIoInJlY2VpdmUiLGgsdGhpcy5fdWlIYXNoKHRoaXMpKX19KS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2NdKSk7Zi5wdXNoKChmdW5jdGlvbihnKXtyZXR1cm4gZnVuY3Rpb24oaCl7Zy5fdHJpZ2dlcigidXBkYXRlIixoLHRoaXMuX3VpSGFzaCh0aGlzKSl9fSkuY2FsbCh0aGlzLHRoaXMuY29udGFpbmVyc1tjXSkpfX19Zm9yKHZhciBjPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtjPj0wO2MtLSl7aWYoIWUpe2YucHVzaCgoZnVuY3Rpb24oZyl7cmV0dXJuIGZ1bmN0aW9uKGgpe2cuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGgsdGhpcy5fdWlIYXNoKHRoaXMpKX19KS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2NdKSl9aWYodGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXIpe2YucHVzaCgoZnVuY3Rpb24oZyl7cmV0dXJuIGZ1bmN0aW9uKGgpe2cuX3RyaWdnZXIoIm91dCIsaCx0aGlzLl91aUhhc2godGhpcykpfX0pLmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbY10pKTt0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUub3Zlcj0wfX1pZih0aGlzLl9zdG9yZWRDdXJzb3Ipe2EoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5fc3RvcmVkQ3Vyc29yKX1pZih0aGlzLl9zdG9yZWRPcGFjaXR5KXt0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpfWlmKHRoaXMuX3N0b3JlZFpJbmRleCl7dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLHRoaXMuX3N0b3JlZFpJbmRleD09ImF1dG8iPyIiOnRoaXMuX3N0b3JlZFpJbmRleCl9dGhpcy5kcmFnZ2luZz1mYWxzZTtpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpe2lmKCFlKXt0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixkLHRoaXMuX3VpSGFzaCgpKTtmb3IodmFyIGM9MDtjPGYubGVuZ3RoO2MrKyl7ZltjXS5jYWxsKHRoaXMsZCl9dGhpcy5fdHJpZ2dlcigic3RvcCIsZCx0aGlzLl91aUhhc2goKSl9cmV0dXJuIGZhbHNlfWlmKCFlKXt0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixkLHRoaXMuX3VpSGFzaCgpKX10aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk7aWYodGhpcy5oZWxwZXJbMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0pe3RoaXMuaGVscGVyLnJlbW92ZSgpfXRoaXMuaGVscGVyPW51bGw7aWYoIWUpe2Zvcih2YXIgYz0wO2M8Zi5sZW5ndGg7YysrKXtmW2NdLmNhbGwodGhpcyxkKX10aGlzLl90cmlnZ2VyKCJzdG9wIixkLHRoaXMuX3VpSGFzaCgpKX10aGlzLmZyb21PdXRzaWRlPWZhbHNlO3JldHVybiB0cnVlfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2lmKGEud2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT1mYWxzZSl7dGhpcy5jYW5jZWwoKX19LF91aUhhc2g6ZnVuY3Rpb24oYyl7dmFyIGI9Y3x8dGhpcztyZXR1cm57aGVscGVyOmIuaGVscGVyLHBsYWNlaG9sZGVyOmIucGxhY2Vob2xkZXJ8fGEoW10pLHBvc2l0aW9uOmIucG9zaXRpb24sYWJzb2x1dGVQb3NpdGlvbjpiLnBvc2l0aW9uQWJzLG9mZnNldDpiLnBvc2l0aW9uQWJzLGl0ZW06Yi5jdXJyZW50SXRlbSxzZW5kZXI6Yz9jLmVsZW1lbnQ6bnVsbH19fSkpO2EuZXh0ZW5kKGEudWkuc29ydGFibGUse2dldHRlcjoic2VyaWFsaXplIHRvQXJyYXkiLHZlcnNpb246IjEuNy4yIixldmVudFByZWZpeDoic29ydCIsZGVmYXVsdHM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ZmFsc2UsY2FuY2VsOiI6aW5wdXQsb3B0aW9uIixjb25uZWN0V2l0aDpmYWxzZSxjb250YWlubWVudDpmYWxzZSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OmZhbHNlLGRlbGF5OjAsZGlzdGFuY2U6MSxkcm9wT25FbXB0eTp0cnVlLGZvcmNlUGxhY2Vob2xkZXJTaXplOmZhbHNlLGZvcmNlSGVscGVyU2l6ZTpmYWxzZSxncmlkOmZhbHNlLGhhbmRsZTpmYWxzZSxoZWxwZXI6Im9yaWdpbmFsIixpdGVtczoiPiAqIixvcGFjaXR5OmZhbHNlLHBsYWNlaG9sZGVyOmZhbHNlLHJldmVydDpmYWxzZSxzY3JvbGw6dHJ1ZSxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QiLHpJbmRleDoxMDAwfX0pfSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBBY2NvcmRpb24gMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9BY2NvcmRpb24KKyAqCisgKiBEZXBlbmRzOgorICoJdWkuY29yZS5qcworICovCisoZnVuY3Rpb24oYSl7YS53aWRnZXQoInVpLmFjY29yZGlvbiIse19pbml0OmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vcHRpb25zLGI9dGhpczt0aGlzLnJ1bm5pbmc9MDtpZihkLmNvbGxhcHNpYmxlPT1hLnVpLmFjY29yZGlvbi5kZWZhdWx0cy5jb2xsYXBzaWJsZSYmZC5hbHdheXNPcGVuIT1hLnVpLmFjY29yZGlvbi5kZWZhdWx0cy5hbHdheXNPcGVuKXtkLmNvbGxhcHNpYmxlPSFkLmFsd2F5c09wZW59aWYoZC5uYXZpZ2F0aW9uKXt2YXIgYz10aGlzLmVsZW1lbnQuZmluZCgiYSIpLmZpbHRlcihkLm5hdmlnYXRpb25GaWx0ZXIpO2lmKGMubGVuZ3RoKXtpZihjLmZpbHRlcihkLmhlYWRlcikubGVuZ3RoKXt0aGlzLmFjdGl2ZT1jfWVsc2V7dGhpcy5hY3RpdmU9Yy5wYXJlbnQoKS5wYXJlbnQoKS5wcmV2KCk7Yy5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIil9fX10aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0Iik7aWYodGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lPT0iVUwiKXt0aGlzLmVsZW1lbnQuY2hpbGRyZW4oImxpIikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1saS1maXgiKX10aGlzLmhlYWRlcnM9dGhpcy5lbGVtZW50LmZpbmQoZC5oZWFkZXIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5iaW5kKCJtb3VzZWVudGVyLmFjY29yZGlvbiIsZnVuY3Rpb24oKXthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuYmluZCgibW91c2VsZWF2ZS5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoImZvY3VzLmFjY29yZGlvbiIsZnVuY3Rpb24oKXthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmluZCgiYmx1ci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pO3RoaXMuaGVhZGVycy5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50IHVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIik7dGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZSh0aGlzLmFjdGl2ZXx8ZC5hY3RpdmUpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IikudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItYWxsIikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci10b3AiKTt0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpO2EoIjxzcGFuLz4iKS5hZGRDbGFzcygidWktaWNvbiAiK2QuaWNvbnMuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKTt0aGlzLmFjdGl2ZS5maW5kKCIudWktaWNvbiIpLnRvZ2dsZUNsYXNzKGQuaWNvbnMuaGVhZGVyKS50b2dnbGVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKTtpZihhLmJyb3dzZXIubXNpZSl7dGhpcy5lbGVtZW50LmZpbmQoImEiKS5jc3MoInpvb20iLCIxIil9dGhpcy5yZXNpemUoKTt0aGlzLmVsZW1lbnQuYXR0cigicm9sZSIsInRhYmxpc3QiKTt0aGlzLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmJpbmQoImtleWRvd24iLGZ1bmN0aW9uKGUpe3JldHVybiBiLl9rZXlkb3duKGUpfSkubmV4dCgpLmF0dHIoInJvbGUiLCJ0YWJwYW5lbCIpO3RoaXMuaGVhZGVycy5ub3QodGhpcy5hY3RpdmV8fCIiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKS5hdHRyKCJ0YWJJbmRleCIsIi0xIikubmV4dCgpLmhpZGUoKTtpZighdGhpcy5hY3RpdmUubGVuZ3RoKXt0aGlzLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLCIwIil9ZWxzZXt0aGlzLmFjdGl2ZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLmF0dHIoInRhYkluZGV4IiwiMCIpfWlmKCFhLmJyb3dzZXIuc2FmYXJpKXt0aGlzLmhlYWRlcnMuZmluZCgiYSIpLmF0dHIoInRhYkluZGV4IiwiLTEiKX1pZihkLmV2ZW50KXt0aGlzLmhlYWRlcnMuYmluZCgoZC5ldmVudCkrIi5hY2NvcmRpb24iLGZ1bmN0aW9uKGUpe3JldHVybiBiLl9jbGlja0hhbmRsZXIuY2FsbChiLGUsdGhpcyl9KX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLnJlbW92ZUF0dHIoInJvbGUiKS51bmJpbmQoIi5hY2NvcmRpb24iKS5yZW1vdmVEYXRhKCJhY2NvcmRpb24iKTt0aGlzLmhlYWRlcnMudW5iaW5kKCIuYWNjb3JkaW9uIikucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXIgdWktaGVscGVyLXJlc2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKTt0aGlzLmhlYWRlcnMuZmluZCgiYSIpLnJlbW92ZUF0dHIoInRhYmluZGV4Iik7dGhpcy5oZWFkZXJzLmNoaWxkcmVuKCIudWktaWNvbiIpLnJlbW92ZSgpO3ZhciBiPXRoaXMuaGVhZGVycy5uZXh0KCkuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKTtpZihjLmF1dG9IZWlnaHR8fGMuZmlsbEhlaWdodCl7Yi5jc3MoImhlaWdodCIsIiIpfX0sX3NldERhdGE6ZnVuY3Rpb24oYixjKXtpZihiPT0iYWx3YXlzT3BlbiIpe2I9ImNvbGxhcHNpYmxlIjtjPSFjfWEud2lkZ2V0LnByb3RvdHlwZS5fc2V0RGF0YS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9rZXlkb3duOmZ1bmN0aW9uKGUpe3ZhciBnPXRoaXMub3B0aW9ucyxmPWEudWkua2V5Q29kZTtpZihnLmRpc2FibGVkfHxlLmFsdEtleXx8ZS5jdHJsS2V5KXtyZXR1cm59dmFyIGQ9dGhpcy5oZWFkZXJzLmxlbmd0aDt2YXIgYj10aGlzLmhlYWRlcnMuaW5kZXgoZS50YXJnZXQpO3ZhciBjPWZhbHNlO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgZi5SSUdIVDpjYXNlIGYuRE9XTjpjPXRoaXMuaGVhZGVyc1soYisxKSVkXTticmVhaztjYXNlIGYuTEVGVDpjYXNlIGYuVVA6Yz10aGlzLmhlYWRlcnNbKGItMStkKSVkXTticmVhaztjYXNlIGYuU1BBQ0U6Y2FzZSBmLkVOVEVSOnJldHVybiB0aGlzLl9jbGlja0hhbmRsZXIoe3RhcmdldDplLnRhcmdldH0sZS50YXJnZXQpfWlmKGMpe2EoZS50YXJnZXQpLmF0dHIoInRhYkluZGV4IiwiLTEiKTthKGMpLmF0dHIoInRhYkluZGV4IiwiMCIpO2MuZm9jdXMoKTtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucyxkO2lmKGUuZmlsbFNwYWNlKXtpZihhLmJyb3dzZXIubXNpZSl7dmFyIGI9dGhpcy5lbGVtZW50LnBhcmVudCgpLmNzcygib3ZlcmZsb3ciKTt0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpfWQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmhlaWdodCgpO2lmKGEuYnJvd3Nlci5tc2llKXt0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsYil9dGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKXtkLT1hKHRoaXMpLm91dGVySGVpZ2h0KCl9KTt2YXIgYz0wO3RoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2M9TWF0aC5tYXgoYyxhKHRoaXMpLmlubmVySGVpZ2h0KCktYSh0aGlzKS5oZWlnaHQoKSl9KS5oZWlnaHQoTWF0aC5tYXgoMCxkLWMpKS5jc3MoIm92ZXJmbG93IiwiYXV0byIpfWVsc2V7aWYoZS5hdXRvSGVpZ2h0KXtkPTA7dGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7ZD1NYXRoLm1heChkLGEodGhpcykub3V0ZXJIZWlnaHQoKSl9KS5oZWlnaHQoZCl9fX0sYWN0aXZhdGU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5fZmluZEFjdGl2ZShiKVswXTt0aGlzLl9jbGlja0hhbmRsZXIoe3RhcmdldDpjfSxjKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dHlwZW9mIGI9PSJudW1iZXIiP3RoaXMuaGVhZGVycy5maWx0ZXIoIjplcSgiK2IrIikiKTp0aGlzLmhlYWRlcnMubm90KHRoaXMuaGVhZGVycy5ub3QoYikpOmI9PT1mYWxzZT9hKFtdKTp0aGlzLmhlYWRlcnMuZmlsdGVyKCI6ZXEoMCkiKX0sX2NsaWNrSGFuZGxlcjpmdW5jdGlvbihiLGYpe3ZhciBkPXRoaXMub3B0aW9ucztpZihkLmRpc2FibGVkKXtyZXR1cm4gZmFsc2V9aWYoIWIudGFyZ2V0JiZkLmNvbGxhcHNpYmxlKXt0aGlzLmFjdGl2ZS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuZmluZCgiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlcik7dGhpcy5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKTt2YXIgaD10aGlzLmFjdGl2ZS5uZXh0KCksZT17b3B0aW9uczpkLG5ld0hlYWRlcjphKFtdKSxvbGRIZWFkZXI6ZC5hY3RpdmUsbmV3Q29udGVudDphKFtdKSxvbGRDb250ZW50Omh9LGM9KHRoaXMuYWN0aXZlPWEoW10pKTt0aGlzLl90b2dnbGUoYyxoLGUpO3JldHVybiBmYWxzZX12YXIgZz1hKGIuY3VycmVudFRhcmdldHx8Zik7dmFyIGk9Z1swXT09dGhpcy5hY3RpdmVbMF07aWYodGhpcy5ydW5uaW5nfHwoIWQuY29sbGFwc2libGUmJmkpKXtyZXR1cm4gZmFsc2V9dGhpcy5hY3RpdmUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCkuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXIpO3RoaXMuYWN0aXZlLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIik7aWYoIWkpe2cucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXIpLmFkZENsYXNzKGQuaWNvbnMuaGVhZGVyU2VsZWN0ZWQpO2cubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKX12YXIgYz1nLm5leHQoKSxoPXRoaXMuYWN0aXZlLm5leHQoKSxlPXtvcHRpb25zOmQsbmV3SGVhZGVyOmkmJmQuY29sbGFwc2libGU/YShbXSk6ZyxvbGRIZWFkZXI6dGhpcy5hY3RpdmUsbmV3Q29udGVudDppJiZkLmNvbGxhcHNpYmxlP2EoW10pOmMuZmluZCgiPiAqIiksb2xkQ29udGVudDpoLmZpbmQoIj4gKiIpfSxqPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZVswXSk+dGhpcy5oZWFkZXJzLmluZGV4KGdbMF0pO3RoaXMuYWN0aXZlPWk/YShbXSk6Zzt0aGlzLl90b2dnbGUoYyxoLGUsaSxqKTtyZXR1cm4gZmFsc2V9LF90b2dnbGU6ZnVuY3Rpb24oYixpLGcsaixrKXt2YXIgZD10aGlzLm9wdGlvbnMsbT10aGlzO3RoaXMudG9TaG93PWI7dGhpcy50b0hpZGU9aTt0aGlzLmRhdGE9Zzt2YXIgYz1mdW5jdGlvbigpe2lmKCFtKXtyZXR1cm59cmV0dXJuIG0uX2NvbXBsZXRlZC5hcHBseShtLGFyZ3VtZW50cyl9O3RoaXMuX3RyaWdnZXIoImNoYW5nZXN0YXJ0IixudWxsLHRoaXMuZGF0YSk7dGhpcy5ydW5uaW5nPWkuc2l6ZSgpPT09MD9iLnNpemUoKTppLnNpemUoKTtpZihkLmFuaW1hdGVkKXt2YXIgZj17fTtpZihkLmNvbGxhcHNpYmxlJiZqKXtmPXt0b1Nob3c6YShbXSksdG9IaWRlOmksY29tcGxldGU6Yyxkb3duOmssYXV0b0hlaWdodDpkLmF1dG9IZWlnaHR8fGQuZmlsbFNwYWNlfX1lbHNle2Y9e3RvU2hvdzpiLHRvSGlkZTppLGNvbXBsZXRlOmMsZG93bjprLGF1dG9IZWlnaHQ6ZC5hdXRvSGVpZ2h0fHxkLmZpbGxTcGFjZX19aWYoIWQucHJveGllZCl7ZC5wcm94aWVkPWQuYW5pbWF0ZWR9aWYoIWQucHJveGllZER1cmF0aW9uKXtkLnByb3hpZWREdXJhdGlvbj1kLmR1cmF0aW9ufWQuYW5pbWF0ZWQ9YS5pc0Z1bmN0aW9uKGQucHJveGllZCk/ZC5wcm94aWVkKGYpOmQucHJveGllZDtkLmR1cmF0aW9uPWEuaXNGdW5jdGlvbihkLnByb3hpZWREdXJhdGlvbik/ZC5wcm94aWVkRHVyYXRpb24oZik6ZC5wcm94aWVkRHVyYXRpb247dmFyIGw9YS51aS5hY2NvcmRpb24uYW5pbWF0aW9ucyxlPWQuZHVyYXRpb24saD1kLmFuaW1hdGVkO2lmKCFsW2hdKXtsW2hdPWZ1bmN0aW9uKG4pe3RoaXMuc2xpZGUobix7ZWFzaW5nOmgsZHVyYXRpb246ZXx8NzAwfSl9fWxbaF0oZil9ZWxzZXtpZihkLmNvbGxhcHNpYmxlJiZqKXtiLnRvZ2dsZSgpfWVsc2V7aS5oaWRlKCk7Yi5zaG93KCl9Yyh0cnVlKX1pLnByZXYoKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKS5hdHRyKCJ0YWJJbmRleCIsIi0xIikuYmx1cigpO2IucHJldigpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikuYXR0cigidGFiSW5kZXgiLCIwIikuZm9jdXMoKX0sX2NvbXBsZXRlZDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnM7dGhpcy5ydW5uaW5nPWI/MDotLXRoaXMucnVubmluZztpZih0aGlzLnJ1bm5pbmcpe3JldHVybn1pZihjLmNsZWFyU3R5bGUpe3RoaXMudG9TaG93LmFkZCh0aGlzLnRvSGlkZSkuY3NzKHtoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KX10aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLG51bGwsdGhpcy5kYXRhKX19KTthLmV4dGVuZChhLnVpLmFjY29yZGlvbix7dmVyc2lvbjoiMS43LjIiLGRlZmF1bHRzOnthY3RpdmU6bnVsbCxhbHdheXNPcGVuOnRydWUsYW5pbWF0ZWQ6InNsaWRlIixhdXRvSGVpZ2h0OnRydWUsY2xlYXJTdHlsZTpmYWxzZSxjb2xsYXBzaWJsZTpmYWxzZSxldmVudDoiY2xpY2siLGZpbGxTcGFjZTpmYWxzZSxoZWFkZXI6Ij4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIixpY29uczp7aGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSIsaGVhZGVyU2VsZWN0ZWQ6InVpLWljb24tdHJpYW5nbGUtMS1zIn0sbmF2aWdhdGlvbjpmYWxzZSxuYXZpZ2F0aW9uRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZi50b0xvd2VyQ2FzZSgpPT1sb2NhdGlvbi5ocmVmLnRvTG93ZXJDYXNlKCl9fSxhbmltYXRpb25zOntzbGlkZTpmdW5jdGlvbihqLGgpe2o9YS5leHRlbmQoe2Vhc2luZzoic3dpbmciLGR1cmF0aW9uOjMwMH0saixoKTtpZighai50b0hpZGUuc2l6ZSgpKXtqLnRvU2hvdy5hbmltYXRlKHtoZWlnaHQ6InNob3cifSxqKTtyZXR1cm59aWYoIWoudG9TaG93LnNpemUoKSl7ai50b0hpZGUuYW5pbWF0ZSh7aGVpZ2h0OiJoaWRlIn0saik7cmV0dXJufXZhciBjPWoudG9TaG93LmNzcygib3ZlcmZsb3ciKSxnLGQ9e30sZj17fSxlPVsiaGVpZ2h0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxiO3ZhciBpPWoudG9TaG93O2I9aVswXS5zdHlsZS53aWR0aDtpLndpZHRoKHBhcnNlSW50KGkucGFyZW50KCkud2lkdGgoKSwxMCktcGFyc2VJbnQoaS5jc3MoInBhZGRpbmdMZWZ0IiksMTApLXBhcnNlSW50KGkuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCktKHBhcnNlSW50KGkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChpLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLDEwKXx8MCkpO2EuZWFjaChlLGZ1bmN0aW9uKGssbSl7ZlttXT0iaGlkZSI7dmFyIGw9KCIiK2EuY3NzKGoudG9TaG93WzBdLG0pKS5tYXRjaCgvXihbXGQrLS5dKykoLiopJC8pO2RbbV09e3ZhbHVlOmxbMV0sdW5pdDpsWzJdfHwicHgifX0pO2oudG9TaG93LmNzcyh7aGVpZ2h0OjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KS5zaG93KCk7ai50b0hpZGUuZmlsdGVyKCI6aGlkZGVuIikuZWFjaChqLmNvbXBsZXRlKS5lbmQoKS5maWx0ZXIoIjp2aXNpYmxlIikuYW5pbWF0ZShmLHtzdGVwOmZ1bmN0aW9uKGssbCl7aWYobC5wcm9wPT0iaGVpZ2h0Iil7Zz0obC5ub3ctbC5zdGFydCkvKGwuZW5kLWwuc3RhcnQpfWoudG9TaG93WzBdLnN0eWxlW2wucHJvcF09KGcqZFtsLnByb3BdLnZhbHVlKStkW2wucHJvcF0udW5pdH0sZHVyYXRpb246ai5kdXJhdGlvbixlYXNpbmc6ai5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtpZighai5hdXRvSGVpZ2h0KXtqLnRvU2hvdy5jc3MoImhlaWdodCIsIiIpfWoudG9TaG93LmNzcygid2lkdGgiLGIpO2oudG9TaG93LmNzcyh7b3ZlcmZsb3c6Y30pO2ouY29tcGxldGUoKX19KX0sYm91bmNlc2xpZGU6ZnVuY3Rpb24oYil7dGhpcy5zbGlkZShiLHtlYXNpbmc6Yi5kb3duPyJlYXNlT3V0Qm91bmNlIjoic3dpbmciLGR1cmF0aW9uOmIuZG93bj8xMDAwOjIwMH0pfSxlYXNlc2xpZGU6ZnVuY3Rpb24oYil7dGhpcy5zbGlkZShiLHtlYXNpbmc6ImVhc2Vpbm91dCIsZHVyYXRpb246NzAwfSl9fX0pfSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBEaWFsb2cgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9EaWFsb2cKKyAqCisgKiBEZXBlbmRzOgorICoJdWkuY29yZS5qcworICoJdWkuZHJhZ2dhYmxlLmpzCisgKgl1aS5yZXNpemFibGUuanMKKyAqLworKGZ1bmN0aW9uKGMpe3ZhciBiPXtkcmFnU3RhcnQ6InN0YXJ0LmRyYWdnYWJsZSIsZHJhZzoiZHJhZy5kcmFnZ2FibGUiLGRyYWdTdG9wOiJzdG9wLmRyYWdnYWJsZSIsbWF4SGVpZ2h0OiJtYXhIZWlnaHQucmVzaXphYmxlIixtaW5IZWlnaHQ6Im1pbkhlaWdodC5yZXNpemFibGUiLG1heFdpZHRoOiJtYXhXaWR0aC5yZXNpemFibGUiLG1pbldpZHRoOiJtaW5XaWR0aC5yZXNpemFibGUiLHJlc2l6ZVN0YXJ0OiJzdGFydC5yZXNpemFibGUiLHJlc2l6ZToiZHJhZy5yZXNpemFibGUiLHJlc2l6ZVN0b3A6InN0b3AucmVzaXphYmxlIn0sYT0idWktZGlhbG9nIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsICI7Yy53aWRnZXQoInVpLmRpYWxvZyIse19pbml0OmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbFRpdGxlPXRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIpO3ZhciBsPXRoaXMsbT10aGlzLm9wdGlvbnMsaj1tLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGV8fCImbmJzcDsiLGU9Yy51aS5kaWFsb2cuZ2V0VGl0bGVJZCh0aGlzLmVsZW1lbnQpLGs9KHRoaXMudWlEaWFsb2c9YygiPGRpdi8+IikpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmhpZGUoKS5hZGRDbGFzcyhhK20uZGlhbG9nQ2xhc3MpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixvdmVyZmxvdzoiaGlkZGVuIix6SW5kZXg6bS56SW5kZXh9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLmNzcygib3V0bGluZSIsMCkua2V5ZG93bihmdW5jdGlvbihuKXsobS5jbG9zZU9uRXNjYXBlJiZuLmtleUNvZGUmJm4ua2V5Q29kZT09Yy51aS5rZXlDb2RlLkVTQ0FQRSYmbC5jbG9zZShuKSl9KS5hdHRyKHtyb2xlOiJkaWFsb2ciLCJhcmlhLWxhYmVsbGVkYnkiOmV9KS5tb3VzZWRvd24oZnVuY3Rpb24obil7bC5tb3ZlVG9Ub3AoZmFsc2Usbil9KSxnPXRoaXMuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyhrKSxmPSh0aGlzLnVpRGlhbG9nVGl0bGViYXI9YygiPGRpdj48L2Rpdj4iKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhciB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwgdWktaGVscGVyLWNsZWFyZml4IikucHJlcGVuZFRvKGspLGk9YygnPGEgaHJlZj0iIyIvPicpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UgdWktY29ybmVyLWFsbCIpLmF0dHIoInJvbGUiLCJidXR0b24iKS5ob3ZlcihmdW5jdGlvbigpe2kuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7aS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7aS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJsdXIoZnVuY3Rpb24oKXtpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkubW91c2Vkb3duKGZ1bmN0aW9uKG4pe24uc3RvcFByb3BhZ2F0aW9uKCl9KS5jbGljayhmdW5jdGlvbihuKXtsLmNsb3NlKG4pO3JldHVybiBmYWxzZX0pLmFwcGVuZFRvKGYpLGg9KHRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlVGV4dD1jKCI8c3Bhbi8+IikpLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tY2xvc2V0aGljayIpLnRleHQobS5jbG9zZVRleHQpLmFwcGVuZFRvKGkpLGQ9YygiPHNwYW4vPiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGUiKS5hdHRyKCJpZCIsZSkuaHRtbChqKS5wcmVwZW5kVG8oZik7Zi5maW5kKCIqIikuYWRkKGYpLmRpc2FibGVTZWxlY3Rpb24oKTsobS5kcmFnZ2FibGUmJmMuZm4uZHJhZ2dhYmxlJiZ0aGlzLl9tYWtlRHJhZ2dhYmxlKCkpOyhtLnJlc2l6YWJsZSYmYy5mbi5yZXNpemFibGUmJnRoaXMuX21ha2VSZXNpemFibGUoKSk7dGhpcy5fY3JlYXRlQnV0dG9ucyhtLmJ1dHRvbnMpO3RoaXMuX2lzT3Blbj1mYWxzZTsobS5iZ2lmcmFtZSYmYy5mbi5iZ2lmcmFtZSYmay5iZ2lmcmFtZSgpKTsobS5hdXRvT3BlbiYmdGhpcy5vcGVuKCkpfSxkZXN0cm95OmZ1bmN0aW9uKCl7KHRoaXMub3ZlcmxheSYmdGhpcy5vdmVybGF5LmRlc3Ryb3koKSk7dGhpcy51aURpYWxvZy5oaWRlKCk7dGhpcy5lbGVtZW50LnVuYmluZCgiLmRpYWxvZyIpLnJlbW92ZURhdGEoImRpYWxvZyIpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpO3RoaXMudWlEaWFsb2cucmVtb3ZlKCk7KHRoaXMub3JpZ2luYWxUaXRsZSYmdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIix0aGlzLm9yaWdpbmFsVGl0bGUpKX0sY2xvc2U6ZnVuY3Rpb24oZil7dmFyIGQ9dGhpcztpZihmYWxzZT09PWQuX3RyaWdnZXIoImJlZm9yZWNsb3NlIixmKSl7cmV0dXJufShkLm92ZXJsYXkmJmQub3ZlcmxheS5kZXN0cm95KCkpO2QudWlEaWFsb2cudW5iaW5kKCJrZXlwcmVzcy51aS1kaWFsb2ciKTsoZC5vcHRpb25zLmhpZGU/ZC51aURpYWxvZy5oaWRlKGQub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7ZC5fdHJpZ2dlcigiY2xvc2UiLGYpfSk6ZC51aURpYWxvZy5oaWRlKCkmJmQuX3RyaWdnZXIoImNsb3NlIixmKSk7Yy51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKTtkLl9pc09wZW49ZmFsc2U7aWYoZC5vcHRpb25zLm1vZGFsKXt2YXIgZT0wO2MoIi51aS1kaWFsb2ciKS5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcyE9ZC51aURpYWxvZ1swXSl7ZT1NYXRoLm1heChlLGModGhpcykuY3NzKCJ6LWluZGV4IikpfX0pO2MudWkuZGlhbG9nLm1heFo9ZX19LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc09wZW59LG1vdmVUb1RvcDpmdW5jdGlvbihmLGUpe2lmKCh0aGlzLm9wdGlvbnMubW9kYWwmJiFmKXx8KCF0aGlzLm9wdGlvbnMuc3RhY2smJiF0aGlzLm9wdGlvbnMubW9kYWwpKXtyZXR1cm4gdGhpcy5fdHJpZ2dlcigiZm9jdXMiLGUpfWlmKHRoaXMub3B0aW9ucy56SW5kZXg+Yy51aS5kaWFsb2cubWF4Wil7Yy51aS5kaWFsb2cubWF4Wj10aGlzLm9wdGlvbnMuekluZGV4fSh0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS4kZWwuY3NzKCJ6LWluZGV4IixjLnVpLmRpYWxvZy5vdmVybGF5Lm1heFo9KytjLnVpLmRpYWxvZy5tYXhaKSk7dmFyIGQ9e3Njcm9sbFRvcDp0aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIiksc2Nyb2xsTGVmdDp0aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsTGVmdCIpfTt0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIsKytjLnVpLmRpYWxvZy5tYXhaKTt0aGlzLmVsZW1lbnQuYXR0cihkKTt0aGlzLl90cmlnZ2VyKCJmb2N1cyIsZSl9LG9wZW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc09wZW4pe3JldHVybn12YXIgZT10aGlzLm9wdGlvbnMsZD10aGlzLnVpRGlhbG9nO3RoaXMub3ZlcmxheT1lLm1vZGFsP25ldyBjLnVpLmRpYWxvZy5vdmVybGF5KHRoaXMpOm51bGw7KGQubmV4dCgpLmxlbmd0aCYmZC5hcHBlbmRUbygiYm9keSIpKTt0aGlzLl9zaXplKCk7dGhpcy5fcG9zaXRpb24oZS5wb3NpdGlvbik7ZC5zaG93KGUuc2hvdyk7dGhpcy5tb3ZlVG9Ub3AodHJ1ZSk7KGUubW9kYWwmJmQuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIixmdW5jdGlvbihoKXtpZihoLmtleUNvZGUhPWMudWkua2V5Q29kZS5UQUIpe3JldHVybn12YXIgZz1jKCI6dGFiYmFibGUiLHRoaXMpLGk9Zy5maWx0ZXIoIjpmaXJzdCIpWzBdLGY9Zy5maWx0ZXIoIjpsYXN0IilbMF07aWYoaC50YXJnZXQ9PWYmJiFoLnNoaWZ0S2V5KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5mb2N1cygpfSwxKX1lbHNle2lmKGgudGFyZ2V0PT1pJiZoLnNoaWZ0S2V5KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5mb2N1cygpfSwxKX19fSkpO2MoW10pLmFkZChkLmZpbmQoIi51aS1kaWFsb2ctY29udGVudCA6dGFiYmFibGU6Zmlyc3QiKSkuYWRkKGQuZmluZCgiLnVpLWRpYWxvZy1idXR0b25wYW5lIDp0YWJiYWJsZTpmaXJzdCIpKS5hZGQoZCkuZmlsdGVyKCI6Zmlyc3QiKS5mb2N1cygpO3RoaXMuX3RyaWdnZXIoIm9wZW4iKTt0aGlzLl9pc09wZW49dHJ1ZX0sX2NyZWF0ZUJ1dHRvbnM6ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcyxkPWZhbHNlLGU9YygiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4Iik7dGhpcy51aURpYWxvZy5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUiKS5yZW1vdmUoKTsodHlwZW9mIGc9PSJvYmplY3QiJiZnIT09bnVsbCYmYy5lYWNoKGcsZnVuY3Rpb24oKXtyZXR1cm4gIShkPXRydWUpfSkpO2lmKGQpe2MuZWFjaChnLGZ1bmN0aW9uKGgsaSl7YygnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPicpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS50ZXh0KGgpLmNsaWNrKGZ1bmN0aW9uKCl7aS5hcHBseShmLmVsZW1lbnRbMF0sYXJndW1lbnRzKX0pLmhvdmVyKGZ1bmN0aW9uKCl7Yyh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXtjKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuZm9jdXMoZnVuY3Rpb24oKXtjKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmx1cihmdW5jdGlvbigpe2ModGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5hcHBlbmRUbyhlKX0pO2UuYXBwZW5kVG8odGhpcy51aURpYWxvZyl9fSxfbWFrZURyYWdnYWJsZTpmdW5jdGlvbigpe3ZhciBkPXRoaXMsZj10aGlzLm9wdGlvbnMsZTt0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbigpe2U9Zi5oZWlnaHQ7Yyh0aGlzKS5oZWlnaHQoYyh0aGlzKS5oZWlnaHQoKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpOyhmLmRyYWdTdGFydCYmZi5kcmFnU3RhcnQuYXBwbHkoZC5lbGVtZW50WzBdLGFyZ3VtZW50cykpfSxkcmFnOmZ1bmN0aW9uKCl7KGYuZHJhZyYmZi5kcmFnLmFwcGx5KGQuZWxlbWVudFswXSxhcmd1bWVudHMpKX0sc3RvcDpmdW5jdGlvbigpe2ModGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLmhlaWdodChlKTsoZi5kcmFnU3RvcCYmZi5kcmFnU3RvcC5hcHBseShkLmVsZW1lbnRbMF0sYXJndW1lbnRzKSk7Yy51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KX0sX21ha2VSZXNpemFibGU6ZnVuY3Rpb24oZyl7Zz0oZz09PXVuZGVmaW5lZD90aGlzLm9wdGlvbnMucmVzaXphYmxlOmcpO3ZhciBkPXRoaXMsZj10aGlzLm9wdGlvbnMsZT10eXBlb2YgZz09InN0cmluZyI/ZzoibixlLHMsdyxzZSxzdyxuZSxudyI7dGhpcy51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50IixhbHNvUmVzaXplOnRoaXMuZWxlbWVudCxtYXhXaWR0aDpmLm1heFdpZHRoLG1heEhlaWdodDpmLm1heEhlaWdodCxtaW5XaWR0aDpmLm1pbldpZHRoLG1pbkhlaWdodDpmLm1pbkhlaWdodCxzdGFydDpmdW5jdGlvbigpe2ModGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpOyhmLnJlc2l6ZVN0YXJ0JiZmLnJlc2l6ZVN0YXJ0LmFwcGx5KGQuZWxlbWVudFswXSxhcmd1bWVudHMpKX0scmVzaXplOmZ1bmN0aW9uKCl7KGYucmVzaXplJiZmLnJlc2l6ZS5hcHBseShkLmVsZW1lbnRbMF0sYXJndW1lbnRzKSl9LGhhbmRsZXM6ZSxzdG9wOmZ1bmN0aW9uKCl7Yyh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIik7Zi5oZWlnaHQ9Yyh0aGlzKS5oZWlnaHQoKTtmLndpZHRoPWModGhpcykud2lkdGgoKTsoZi5yZXNpemVTdG9wJiZmLnJlc2l6ZVN0b3AuYXBwbHkoZC5lbGVtZW50WzBdLGFyZ3VtZW50cykpO2MudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSkuZmluZCgiLnVpLXJlc2l6YWJsZS1zZSIpLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcC1kaWFnb25hbC1zZSIpfSxfcG9zaXRpb246ZnVuY3Rpb24oaSl7dmFyIGU9Yyh3aW5kb3cpLGY9Yyhkb2N1bWVudCksZz1mLnNjcm9sbFRvcCgpLGQ9Zi5zY3JvbGxMZWZ0KCksaD1nO2lmKGMuaW5BcnJheShpLFsiY2VudGVyIiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0pPj0wKXtpPVtpPT0icmlnaHQifHxpPT0ibGVmdCI/aToiY2VudGVyIixpPT0idG9wInx8aT09ImJvdHRvbSI/aToibWlkZGxlIl19aWYoaS5jb25zdHJ1Y3RvciE9QXJyYXkpe2k9WyJjZW50ZXIiLCJtaWRkbGUiXX1pZihpWzBdLmNvbnN0cnVjdG9yPT1OdW1iZXIpe2QrPWlbMF19ZWxzZXtzd2l0Y2goaVswXSl7Y2FzZSJsZWZ0IjpkKz0wO2JyZWFrO2Nhc2UicmlnaHQiOmQrPWUud2lkdGgoKS10aGlzLnVpRGlhbG9nLm91dGVyV2lkdGgoKTticmVhaztkZWZhdWx0OmNhc2UiY2VudGVyIjpkKz0oZS53aWR0aCgpLXRoaXMudWlEaWFsb2cub3V0ZXJXaWR0aCgpKS8yfX1pZihpWzFdLmNvbnN0cnVjdG9yPT1OdW1iZXIpe2crPWlbMV19ZWxzZXtzd2l0Y2goaVsxXSl7Y2FzZSJ0b3AiOmcrPTA7YnJlYWs7Y2FzZSJib3R0b20iOmcrPWUuaGVpZ2h0KCktdGhpcy51aURpYWxvZy5vdXRlckhlaWdodCgpO2JyZWFrO2RlZmF1bHQ6Y2FzZSJtaWRkbGUiOmcrPShlLmhlaWdodCgpLXRoaXMudWlEaWFsb2cub3V0ZXJIZWlnaHQoKSkvMn19Zz1NYXRoLm1heChnLGgpO3RoaXMudWlEaWFsb2cuY3NzKHt0b3A6ZyxsZWZ0OmR9KX0sX3NldERhdGE6ZnVuY3Rpb24oZSxmKXsoYltlXSYmdGhpcy51aURpYWxvZy5kYXRhKGJbZV0sZikpO3N3aXRjaChlKXtjYXNlImJ1dHRvbnMiOnRoaXMuX2NyZWF0ZUJ1dHRvbnMoZik7YnJlYWs7Y2FzZSJjbG9zZVRleHQiOnRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlVGV4dC50ZXh0KGYpO2JyZWFrO2Nhc2UiZGlhbG9nQ2xhc3MiOnRoaXMudWlEaWFsb2cucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcyhhK2YpO2JyZWFrO2Nhc2UiZHJhZ2dhYmxlIjooZj90aGlzLl9tYWtlRHJhZ2dhYmxlKCk6dGhpcy51aURpYWxvZy5kcmFnZ2FibGUoImRlc3Ryb3kiKSk7YnJlYWs7Y2FzZSJoZWlnaHQiOnRoaXMudWlEaWFsb2cuaGVpZ2h0KGYpO2JyZWFrO2Nhc2UicG9zaXRpb24iOnRoaXMuX3Bvc2l0aW9uKGYpO2JyZWFrO2Nhc2UicmVzaXphYmxlIjp2YXIgZD10aGlzLnVpRGlhbG9nLGc9dGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpOyhnJiYhZiYmZC5yZXNpemFibGUoImRlc3Ryb3kiKSk7KGcmJnR5cGVvZiBmPT0ic3RyaW5nIiYmZC5yZXNpemFibGUoIm9wdGlvbiIsImhhbmRsZXMiLGYpKTsoZ3x8dGhpcy5fbWFrZVJlc2l6YWJsZShmKSk7YnJlYWs7Y2FzZSJ0aXRsZSI6YygiLnVpLWRpYWxvZy10aXRsZSIsdGhpcy51aURpYWxvZ1RpdGxlYmFyKS5odG1sKGZ8fCImbmJzcDsiKTticmVhaztjYXNlIndpZHRoIjp0aGlzLnVpRGlhbG9nLndpZHRoKGYpO2JyZWFrfWMud2lkZ2V0LnByb3RvdHlwZS5fc2V0RGF0YS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5jc3Moe2hlaWdodDowLG1pbkhlaWdodDowLHdpZHRoOiJhdXRvIn0pO3ZhciBkPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOmUud2lkdGh9KS5oZWlnaHQoKTt0aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6TWF0aC5tYXgoZS5taW5IZWlnaHQtZCwwKSxoZWlnaHQ6ZS5oZWlnaHQ9PSJhdXRvIj8iYXV0byI6TWF0aC5tYXgoZS5oZWlnaHQtZCwwKX0pfX0pO2MuZXh0ZW5kKGMudWkuZGlhbG9nLHt2ZXJzaW9uOiIxLjcuMiIsZGVmYXVsdHM6e2F1dG9PcGVuOnRydWUsYmdpZnJhbWU6ZmFsc2UsYnV0dG9uczp7fSxjbG9zZU9uRXNjYXBlOnRydWUsY2xvc2VUZXh0OiJjbG9zZSIsZGlhbG9nQ2xhc3M6IiIsZHJhZ2dhYmxlOnRydWUsaGlkZTpudWxsLGhlaWdodDoiYXV0byIsbWF4SGVpZ2h0OmZhbHNlLG1heFdpZHRoOmZhbHNlLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOmZhbHNlLHBvc2l0aW9uOiJjZW50ZXIiLHJlc2l6YWJsZTp0cnVlLHNob3c6bnVsbCxzdGFjazp0cnVlLHRpdGxlOiIiLHdpZHRoOjMwMCx6SW5kZXg6MTAwMH0sZ2V0dGVyOiJpc09wZW4iLHV1aWQ6MCxtYXhaOjAsZ2V0VGl0bGVJZDpmdW5jdGlvbihkKXtyZXR1cm4idWktZGlhbG9nLXRpdGxlLSIrKGQuYXR0cigiaWQiKXx8Kyt0aGlzLnV1aWQpfSxvdmVybGF5OmZ1bmN0aW9uKGQpe3RoaXMuJGVsPWMudWkuZGlhbG9nLm92ZXJsYXkuY3JlYXRlKGQpfX0pO2MuZXh0ZW5kKGMudWkuZGlhbG9nLm92ZXJsYXkse2luc3RhbmNlczpbXSxtYXhaOjAsZXZlbnRzOmMubWFwKCJmb2N1cyxtb3VzZWRvd24sbW91c2V1cCxrZXlkb3duLGtleXByZXNzLGNsaWNrIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGQpe3JldHVybiBkKyIuZGlhbG9nLW92ZXJsYXkifSkuam9pbigiICIpLGNyZWF0ZTpmdW5jdGlvbihlKXtpZih0aGlzLmluc3RhbmNlcy5sZW5ndGg9PT0wKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoYy51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMubGVuZ3RoKXtjKGRvY3VtZW50KS5iaW5kKGMudWkuZGlhbG9nLm92ZXJsYXkuZXZlbnRzLGZ1bmN0aW9uKGYpe3ZhciBnPWMoZi50YXJnZXQpLnBhcmVudHMoIi51aS1kaWFsb2ciKS5jc3MoInpJbmRleCIpfHwwO3JldHVybihnPmMudWkuZGlhbG9nLm92ZXJsYXkubWF4Wil9KX19LDEpO2MoZG9jdW1lbnQpLmJpbmQoImtleWRvd24uZGlhbG9nLW92ZXJsYXkiLGZ1bmN0aW9uKGYpeyhlLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSYmZi5rZXlDb2RlJiZmLmtleUNvZGU9PWMudWkua2V5Q29kZS5FU0NBUEUmJmUuY2xvc2UoZikpfSk7Yyh3aW5kb3cpLmJpbmQoInJlc2l6ZS5kaWFsb2ctb3ZlcmxheSIsYy51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUpfXZhciBkPWMoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoInVpLXdpZGdldC1vdmVybGF5IikuY3NzKHt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KTsoZS5vcHRpb25zLmJnaWZyYW1lJiZjLmZuLmJnaWZyYW1lJiZkLmJnaWZyYW1lKCkpO3RoaXMuaW5zdGFuY2VzLnB1c2goZCk7cmV0dXJuIGR9LGRlc3Ryb3k6ZnVuY3Rpb24oZCl7dGhpcy5pbnN0YW5jZXMuc3BsaWNlKGMuaW5BcnJheSh0aGlzLmluc3RhbmNlcyxkKSwxKTtpZih0aGlzLmluc3RhbmNlcy5sZW5ndGg9PT0wKXtjKFtkb2N1bWVudCx3aW5kb3ddKS51bmJpbmQoIi5kaWFsb2ctb3ZlcmxheSIpfWQucmVtb3ZlKCk7dmFyIGU9MDtjLmVhY2godGhpcy5pbnN0YW5jZXMsZnVuY3Rpb24oKXtlPU1hdGgubWF4KGUsdGhpcy5jc3MoInotaW5kZXgiKSl9KTt0aGlzLm1heFo9ZX0saGVpZ2h0OmZ1bmN0aW9uKCl7aWYoYy5icm93c2VyLm1zaWUmJmMuYnJvd3Nlci52ZXJzaW9uPDcpe3ZhciBlPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpO3ZhciBkPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpO2lmKGU8ZCl7cmV0dXJuIGMod2luZG93KS5oZWlnaHQoKSsicHgifWVsc2V7cmV0dXJuIGUrInB4In19ZWxzZXtyZXR1cm4gYyhkb2N1bWVudCkuaGVpZ2h0KCkrInB4In19LHdpZHRoOmZ1bmN0aW9uKCl7aWYoYy5icm93c2VyLm1zaWUmJmMuYnJvd3Nlci52ZXJzaW9uPDcpe3ZhciBkPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCxkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKTt2YXIgZT1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgsZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCk7aWYoZDxlKXtyZXR1cm4gYyh3aW5kb3cpLndpZHRoKCkrInB4In1lbHNle3JldHVybiBkKyJweCJ9fWVsc2V7cmV0dXJuIGMoZG9jdW1lbnQpLndpZHRoKCkrInB4In19LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBkPWMoW10pO2MuZWFjaChjLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcyxmdW5jdGlvbigpe2Q9ZC5hZGQodGhpcyl9KTtkLmNzcyh7d2lkdGg6MCxoZWlnaHQ6MH0pLmNzcyh7d2lkdGg6Yy51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLGhlaWdodDpjLnVpLmRpYWxvZy5vdmVybGF5LmhlaWdodCgpfSl9fSk7Yy5leHRlbmQoYy51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtjLnVpLmRpYWxvZy5vdmVybGF5LmRlc3Ryb3kodGhpcy4kZWwpfX0pfSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBTbGlkZXIgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9TbGlkZXIKKyAqCisgKiBEZXBlbmRzOgorICoJdWkuY29yZS5qcworICovCisoZnVuY3Rpb24oYSl7YS53aWRnZXQoInVpLnNsaWRlciIsYS5leHRlbmQoe30sYS51aS5tb3VzZSx7X2luaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3RoaXMuX2tleVNsaWRpbmc9ZmFsc2U7dGhpcy5faGFuZGxlSW5kZXg9bnVsbDt0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpO3RoaXMuX21vdXNlSW5pdCgpO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24rIiB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpO3RoaXMucmFuZ2U9YShbXSk7aWYoYy5yYW5nZSl7aWYoYy5yYW5nZT09PXRydWUpe3RoaXMucmFuZ2U9YSgiPGRpdj48L2Rpdj4iKTtpZighYy52YWx1ZXMpe2MudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldfWlmKGMudmFsdWVzLmxlbmd0aCYmYy52YWx1ZXMubGVuZ3RoIT0yKXtjLnZhbHVlcz1bYy52YWx1ZXNbMF0sYy52YWx1ZXNbMF1dfX1lbHNle3RoaXMucmFuZ2U9YSgiPGRpdj48L2Rpdj4iKX10aGlzLnJhbmdlLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXNsaWRlci1yYW5nZSIpO2lmKGMucmFuZ2U9PSJtaW4ifHxjLnJhbmdlPT0ibWF4Iil7dGhpcy5yYW5nZS5hZGRDbGFzcygidWktc2xpZGVyLXJhbmdlLSIrYy5yYW5nZSl9dGhpcy5yYW5nZS5hZGRDbGFzcygidWktd2lkZ2V0LWhlYWRlciIpfWlmKGEoIi51aS1zbGlkZXItaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD09MCl7YSgnPGEgaHJlZj0iIyI+PC9hPicpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXNsaWRlci1oYW5kbGUiKX1pZihjLnZhbHVlcyYmYy52YWx1ZXMubGVuZ3RoKXt3aGlsZShhKCIudWktc2xpZGVyLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5sZW5ndGg8Yy52YWx1ZXMubGVuZ3RoKXthKCc8YSBocmVmPSIjIj48L2E+JykuYXBwZW5kVG8odGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktc2xpZGVyLWhhbmRsZSIpfX10aGlzLmhhbmRsZXM9YSgiLnVpLXNsaWRlci1oYW5kbGUiLHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpO3RoaXMuaGFuZGxlPXRoaXMuaGFuZGxlcy5lcSgwKTt0aGlzLmhhbmRsZXMuYWRkKHRoaXMucmFuZ2UpLmZpbHRlcigiYSIpLmNsaWNrKGZ1bmN0aW9uKGQpe2QucHJldmVudERlZmF1bHQoKX0pLmhvdmVyKGZ1bmN0aW9uKCl7aWYoIWMuZGlzYWJsZWQpe2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9fSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2lmKCFjLmRpc2FibGVkKXthKCIudWktc2xpZGVyIC51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9ZWxzZXthKHRoaXMpLmJsdXIoKX19KS5ibHVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pO3RoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGQpe2EodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIsZCl9KTt0aGlzLmhhbmRsZXMua2V5ZG93bihmdW5jdGlvbihpKXt2YXIgZj10cnVlO3ZhciBlPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpO2lmKGIub3B0aW9ucy5kaXNhYmxlZCl7cmV0dXJufXN3aXRjaChpLmtleUNvZGUpe2Nhc2UgYS51aS5rZXlDb2RlLkhPTUU6Y2FzZSBhLnVpLmtleUNvZGUuRU5EOmNhc2UgYS51aS5rZXlDb2RlLlVQOmNhc2UgYS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgYS51aS5rZXlDb2RlLkRPV046Y2FzZSBhLnVpLmtleUNvZGUuTEVGVDpmPWZhbHNlO2lmKCFiLl9rZXlTbGlkaW5nKXtiLl9rZXlTbGlkaW5nPXRydWU7YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIik7Yi5fc3RhcnQoaSxlKX1icmVha312YXIgZyxkLGg9Yi5fc3RlcCgpO2lmKGIub3B0aW9ucy52YWx1ZXMmJmIub3B0aW9ucy52YWx1ZXMubGVuZ3RoKXtnPWQ9Yi52YWx1ZXMoZSl9ZWxzZXtnPWQ9Yi52YWx1ZSgpfXN3aXRjaChpLmtleUNvZGUpe2Nhc2UgYS51aS5rZXlDb2RlLkhPTUU6ZD1iLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkVORDpkPWIuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuVVA6Y2FzZSBhLnVpLmtleUNvZGUuUklHSFQ6aWYoZz09Yi5fdmFsdWVNYXgoKSl7cmV0dXJufWQ9ZytoO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkRPV046Y2FzZSBhLnVpLmtleUNvZGUuTEVGVDppZihnPT1iLl92YWx1ZU1pbigpKXtyZXR1cm59ZD1nLWg7YnJlYWt9Yi5fc2xpZGUoaSxlLGQpO3JldHVybiBmfSkua2V5dXAoZnVuY3Rpb24oZSl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJpbmRleC51aS1zbGlkZXItaGFuZGxlIik7aWYoYi5fa2V5U2xpZGluZyl7Yi5fc3RvcChlLGQpO2IuX2NoYW5nZShlLGQpO2IuX2tleVNsaWRpbmc9ZmFsc2U7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIil9fSk7dGhpcy5fcmVmcmVzaFZhbHVlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXMucmVtb3ZlKCk7dGhpcy5yYW5nZS5yZW1vdmUoKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwgdWktc2xpZGVyLWRpc2FibGVkIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlRGF0YSgic2xpZGVyIikudW5iaW5kKCIuc2xpZGVyIik7dGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oZCl7dmFyIGU9dGhpcy5vcHRpb25zO2lmKGUuZGlzYWJsZWQpe3JldHVybiBmYWxzZX10aGlzLmVsZW1lbnRTaXplPXt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX07dGhpcy5lbGVtZW50T2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKTt2YXIgaD17eDpkLnBhZ2VYLHk6ZC5wYWdlWX07dmFyIGo9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGgpO3ZhciBjPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSsxLGY7dmFyIGs9dGhpcyxpO3RoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGwpe3ZhciBtPU1hdGguYWJzKGotay52YWx1ZXMobCkpO2lmKGM+bSl7Yz1tO2Y9YSh0aGlzKTtpPWx9fSk7aWYoZS5yYW5nZT09dHJ1ZSYmdGhpcy52YWx1ZXMoMSk9PWUubWluKXtmPWEodGhpcy5oYW5kbGVzWysraV0pfXRoaXMuX3N0YXJ0KGQsaSk7ay5faGFuZGxlSW5kZXg9aTtmLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5mb2N1cygpO3ZhciBnPWYub2Zmc2V0KCk7dmFyIGI9IWEoZC50YXJnZXQpLnBhcmVudHMoKS5hbmRTZWxmKCkuaXMoIi51aS1zbGlkZXItaGFuZGxlIik7dGhpcy5fY2xpY2tPZmZzZXQ9Yj97bGVmdDowLHRvcDowfTp7bGVmdDpkLnBhZ2VYLWcubGVmdC0oZi53aWR0aCgpLzIpLHRvcDpkLnBhZ2VZLWcudG9wLShmLmhlaWdodCgpLzIpLShwYXJzZUludChmLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChmLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChmLmNzcygibWFyZ2luVG9wIiksMTApfHwwKX07aj10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoaCk7dGhpcy5fc2xpZGUoZCxpLGopO3JldHVybiB0cnVlfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXtyZXR1cm4gdHJ1ZX0sX21vdXNlRHJhZzpmdW5jdGlvbihkKXt2YXIgYj17eDpkLnBhZ2VYLHk6ZC5wYWdlWX07dmFyIGM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGIpO3RoaXMuX3NsaWRlKGQsdGhpcy5faGFuZGxlSW5kZXgsYyk7cmV0dXJuIGZhbHNlfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGIpe3RoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIik7dGhpcy5fc3RvcChiLHRoaXMuX2hhbmRsZUluZGV4KTt0aGlzLl9jaGFuZ2UoYix0aGlzLl9oYW5kbGVJbmRleCk7dGhpcy5faGFuZGxlSW5kZXg9bnVsbDt0aGlzLl9jbGlja09mZnNldD1udWxsO3JldHVybiBmYWxzZX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj10aGlzLm9wdGlvbnMub3JpZW50YXRpb249PSJ2ZXJ0aWNhbCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oZCl7dmFyIGMsaDtpZigiaG9yaXpvbnRhbCI9PXRoaXMub3JpZW50YXRpb24pe2M9dGhpcy5lbGVtZW50U2l6ZS53aWR0aDtoPWQueC10aGlzLmVsZW1lbnRPZmZzZXQubGVmdC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQubGVmdDowKX1lbHNle2M9dGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQ7aD1kLnktdGhpcy5lbGVtZW50T2Zmc2V0LnRvcC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQudG9wOjApfXZhciBmPShoL2MpO2lmKGY+MSl7Zj0xfWlmKGY8MCl7Zj0wfWlmKCJ2ZXJ0aWNhbCI9PXRoaXMub3JpZW50YXRpb24pe2Y9MS1mfXZhciBlPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSxpPWYqZSxiPWkldGhpcy5vcHRpb25zLnN0ZXAsZz10aGlzLl92YWx1ZU1pbigpK2ktYjtpZihiPih0aGlzLm9wdGlvbnMuc3RlcC8yKSl7Zys9dGhpcy5vcHRpb25zLnN0ZXB9cmV0dXJuIHBhcnNlRmxvYXQoZy50b0ZpeGVkKDUpKX0sX3N0YXJ0OmZ1bmN0aW9uKGQsYyl7dmFyIGI9e2hhbmRsZTp0aGlzLmhhbmRsZXNbY10sdmFsdWU6dGhpcy52YWx1ZSgpfTtpZih0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCl7Yi52YWx1ZT10aGlzLnZhbHVlcyhjKTtiLnZhbHVlcz10aGlzLnZhbHVlcygpfXRoaXMuX3RyaWdnZXIoInN0YXJ0IixkLGIpfSxfc2xpZGU6ZnVuY3Rpb24oZixlLGQpe3ZhciBnPXRoaXMuaGFuZGxlc1tlXTtpZih0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCl7dmFyIGI9dGhpcy52YWx1ZXMoZT8wOjEpO2lmKCh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD09MiYmdGhpcy5vcHRpb25zLnJhbmdlPT09dHJ1ZSkmJigoZT09MCYmZD5iKXx8KGU9PTEmJmQ8YikpKXtkPWJ9aWYoZCE9dGhpcy52YWx1ZXMoZSkpe3ZhciBjPXRoaXMudmFsdWVzKCk7Y1tlXT1kO3ZhciBoPXRoaXMuX3RyaWdnZXIoInNsaWRlIixmLHtoYW5kbGU6dGhpcy5oYW5kbGVzW2VdLHZhbHVlOmQsdmFsdWVzOmN9KTt2YXIgYj10aGlzLnZhbHVlcyhlPzA6MSk7aWYoaCE9PWZhbHNlKXt0aGlzLnZhbHVlcyhlLGQsKGYudHlwZT09Im1vdXNlZG93biImJnRoaXMub3B0aW9ucy5hbmltYXRlKSx0cnVlKX19fWVsc2V7aWYoZCE9dGhpcy52YWx1ZSgpKXt2YXIgaD10aGlzLl90cmlnZ2VyKCJzbGlkZSIsZix7aGFuZGxlOnRoaXMuaGFuZGxlc1tlXSx2YWx1ZTpkfSk7aWYoaCE9PWZhbHNlKXt0aGlzLl9zZXREYXRhKCJ2YWx1ZSIsZCwoZi50eXBlPT0ibW91c2Vkb3duIiYmdGhpcy5vcHRpb25zLmFuaW1hdGUpKX19fX0sX3N0b3A6ZnVuY3Rpb24oZCxjKXt2YXIgYj17aGFuZGxlOnRoaXMuaGFuZGxlc1tjXSx2YWx1ZTp0aGlzLnZhbHVlKCl9O2lmKHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKXtiLnZhbHVlPXRoaXMudmFsdWVzKGMpO2IudmFsdWVzPXRoaXMudmFsdWVzKCl9dGhpcy5fdHJpZ2dlcigic3RvcCIsZCxiKX0sX2NoYW5nZTpmdW5jdGlvbihkLGMpe3ZhciBiPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2NdLHZhbHVlOnRoaXMudmFsdWUoKX07aWYodGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgpe2IudmFsdWU9dGhpcy52YWx1ZXMoYyk7Yi52YWx1ZXM9dGhpcy52YWx1ZXMoKX10aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGQsYil9LHZhbHVlOmZ1bmN0aW9uKGIpe2lmKGFyZ3VtZW50cy5sZW5ndGgpe3RoaXMuX3NldERhdGEoInZhbHVlIixiKTt0aGlzLl9jaGFuZ2UobnVsbCwwKX1yZXR1cm4gdGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKGIsZSxjLGQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7dGhpcy5vcHRpb25zLnZhbHVlc1tiXT1lO3RoaXMuX3JlZnJlc2hWYWx1ZShjKTtpZighZCl7dGhpcy5fY2hhbmdlKG51bGwsYil9fWlmKGFyZ3VtZW50cy5sZW5ndGgpe2lmKHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKXtyZXR1cm4gdGhpcy5fdmFsdWVzKGIpfWVsc2V7cmV0dXJuIHRoaXMudmFsdWUoKX19ZWxzZXtyZXR1cm4gdGhpcy5fdmFsdWVzKCl9fSxfc2V0RGF0YTpmdW5jdGlvbihiLGQsYyl7YS53aWRnZXQucHJvdG90eXBlLl9zZXREYXRhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtzd2l0Y2goYil7Y2FzZSJkaXNhYmxlZCI6aWYoZCl7dGhpcy5oYW5kbGVzLmZpbHRlcigiLnVpLXN0YXRlLWZvY3VzIikuYmx1cigpO3RoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKTt0aGlzLmhhbmRsZXMuYXR0cigiZGlzYWJsZWQiLCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5oYW5kbGVzLnJlbW92ZUF0dHIoImRpc2FibGVkIil9Y2FzZSJvcmllbnRhdGlvbiI6dGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIpLmFkZENsYXNzKCJ1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKTt0aGlzLl9yZWZyZXNoVmFsdWUoYyk7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fcmVmcmVzaFZhbHVlKGMpO2JyZWFrfX0sX3N0ZXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMuc3RlcDtyZXR1cm4gYn0sX3ZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLnZhbHVlO2lmKGI8dGhpcy5fdmFsdWVNaW4oKSl7Yj10aGlzLl92YWx1ZU1pbigpfWlmKGI+dGhpcy5fdmFsdWVNYXgoKSl7Yj10aGlzLl92YWx1ZU1heCgpfXJldHVybiBifSxfdmFsdWVzOmZ1bmN0aW9uKGIpe2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBjPXRoaXMub3B0aW9ucy52YWx1ZXNbYl07aWYoYzx0aGlzLl92YWx1ZU1pbigpKXtjPXRoaXMuX3ZhbHVlTWluKCl9aWYoYz50aGlzLl92YWx1ZU1heCgpKXtjPXRoaXMuX3ZhbHVlTWF4KCl9cmV0dXJuIGN9ZWxzZXtyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlc319LF92YWx1ZU1pbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucy5taW47cmV0dXJuIGJ9LF92YWx1ZU1heDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucy5tYXg7cmV0dXJuIGJ9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oYyl7dmFyIGY9dGhpcy5vcHRpb25zLnJhbmdlLGQ9dGhpcy5vcHRpb25zLGw9dGhpcztpZih0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCl7dmFyIGksaDt0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihwLG4pe3ZhciBvPShsLnZhbHVlcyhwKS1sLl92YWx1ZU1pbigpKS8obC5fdmFsdWVNYXgoKS1sLl92YWx1ZU1pbigpKSoxMDA7dmFyIG09e307bVtsLm9yaWVudGF0aW9uPT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1vKyIlIjthKHRoaXMpLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0obSxkLmFuaW1hdGUpO2lmKGwub3B0aW9ucy5yYW5nZT09PXRydWUpe2lmKGwub3JpZW50YXRpb249PSJob3Jpem9udGFsIil7KHA9PTApJiZsLnJhbmdlLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0oe2xlZnQ6bysiJSJ9LGQuYW5pbWF0ZSk7KHA9PTEpJiZsLnJhbmdlW2M/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6KG8tbGFzdFZhbFBlcmNlbnQpKyIlIn0se3F1ZXVlOmZhbHNlLGR1cmF0aW9uOmQuYW5pbWF0ZX0pfWVsc2V7KHA9PTApJiZsLnJhbmdlLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbToobykrIiUifSxkLmFuaW1hdGUpOyhwPT0xKSYmbC5yYW5nZVtjPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDooby1sYXN0VmFsUGVyY2VudCkrIiUifSx7cXVldWU6ZmFsc2UsZHVyYXRpb246ZC5hbmltYXRlfSl9fWxhc3RWYWxQZXJjZW50PW99KX1lbHNle3ZhciBqPXRoaXMudmFsdWUoKSxnPXRoaXMuX3ZhbHVlTWluKCksaz10aGlzLl92YWx1ZU1heCgpLGU9ayE9Zz8oai1nKS8oay1nKSoxMDA6MDt2YXIgYj17fTtiW2wub3JpZW50YXRpb249PSJob3Jpem9udGFsIj8ibGVmdCI6ImJvdHRvbSJdPWUrIiUiO3RoaXMuaGFuZGxlLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0oYixkLmFuaW1hdGUpOyhmPT0ibWluIikmJih0aGlzLm9yaWVudGF0aW9uPT0iaG9yaXpvbnRhbCIpJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmUrIiUifSxkLmFuaW1hdGUpOyhmPT0ibWF4IikmJih0aGlzLm9yaWVudGF0aW9uPT0iaG9yaXpvbnRhbCIpJiZ0aGlzLnJhbmdlW2M/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6KDEwMC1lKSsiJSJ9LHtxdWV1ZTpmYWxzZSxkdXJhdGlvbjpkLmFuaW1hdGV9KTsoZj09Im1pbiIpJiYodGhpcy5vcmllbnRhdGlvbj09InZlcnRpY2FsIikmJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OmUrIiUifSxkLmFuaW1hdGUpOyhmPT0ibWF4IikmJih0aGlzLm9yaWVudGF0aW9uPT0idmVydGljYWwiKSYmdGhpcy5yYW5nZVtjPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDooMTAwLWUpKyIlIn0se3F1ZXVlOmZhbHNlLGR1cmF0aW9uOmQuYW5pbWF0ZX0pfX19KSk7YS5leHRlbmQoYS51aS5zbGlkZXIse2dldHRlcjoidmFsdWUgdmFsdWVzIix2ZXJzaW9uOiIxLjcuMiIsZXZlbnRQcmVmaXg6InNsaWRlIixkZWZhdWx0czp7YW5pbWF0ZTpmYWxzZSxkZWxheTowLGRpc3RhbmNlOjAsbWF4OjEwMCxtaW46MCxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmFuZ2U6ZmFsc2Usc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGx9fSl9KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIFRhYnMgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UYWJzCisgKgorICogRGVwZW5kczoKKyAqCXVpLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS50YWJzIix7X2luaXQ6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuZGVzZWxlY3RhYmxlIT09dW5kZWZpbmVkKXt0aGlzLm9wdGlvbnMuY29sbGFwc2libGU9dGhpcy5vcHRpb25zLmRlc2VsZWN0YWJsZX10aGlzLl90YWJpZnkodHJ1ZSl9LF9zZXREYXRhOmZ1bmN0aW9uKGIsYyl7aWYoYj09InNlbGVjdGVkIil7aWYodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlJiZjPT10aGlzLm9wdGlvbnMuc2VsZWN0ZWQpe3JldHVybn10aGlzLnNlbGVjdChjKX1lbHNle3RoaXMub3B0aW9uc1tiXT1jO2lmKGI9PSJkZXNlbGVjdGFibGUiKXt0aGlzLm9wdGlvbnMuY29sbGFwc2libGU9Y310aGlzLl90YWJpZnkoKX19LF90YWJJZDpmdW5jdGlvbihiKXtyZXR1cm4gYi50aXRsZSYmYi50aXRsZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZSgvW15BLVphLXowLTlcLV86XC5dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrYS5kYXRhKGIpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrYS5kYXRhKHRoaXMubGlzdFswXSkpO3JldHVybiBhLmNvb2tpZS5hcHBseShudWxsLFtiXS5jb25jYXQoYS5tYWtlQXJyYXkoYXJndW1lbnRzKSkpfSxfdWk6ZnVuY3Rpb24oYyxiKXtyZXR1cm57dGFiOmMscGFuZWw6YixpbmRleDp0aGlzLmFuY2hvcnMuaW5kZXgoYyl9fSxfY2xlYW51cDpmdW5jdGlvbigpe3RoaXMubGlzLmZpbHRlcigiLnVpLXN0YXRlLXByb2Nlc3NpbmciKS5yZW1vdmVDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpLmZpbmQoInNwYW46ZGF0YShsYWJlbC50YWJzKSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2IuaHRtbChiLmRhdGEoImxhYmVsLnRhYnMiKSkucmVtb3ZlRGF0YSgibGFiZWwudGFicyIpfSl9LF90YWJpZnk6ZnVuY3Rpb24obil7dGhpcy5saXN0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigidWw6Zmlyc3QiKTt0aGlzLmxpcz1hKCJsaTpoYXMoYVtocmVmXSkiLHRoaXMubGlzdCk7dGhpcy5hbmNob3JzPXRoaXMubGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBhKCJhIix0aGlzKVswXX0pO3RoaXMucGFuZWxzPWEoW10pO3ZhciBwPXRoaXMsZD10aGlzLm9wdGlvbnM7dmFyIGM9L14jLisvO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKHIsbyl7dmFyIHE9YShvKS5hdHRyKCJocmVmIik7dmFyIHM9cS5zcGxpdCgiIyIpWzBdLHU7aWYocyYmKHM9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fCh1PWEoImJhc2UiKVswXSkmJnM9PT11LmhyZWYpKXtxPW8uaGFzaDtvLmhyZWY9cX1pZihjLnRlc3QocSkpe3AucGFuZWxzPXAucGFuZWxzLmFkZChwLl9zYW5pdGl6ZVNlbGVjdG9yKHEpKX1lbHNle2lmKHEhPSIjIil7YS5kYXRhKG8sImhyZWYudGFicyIscSk7YS5kYXRhKG8sImxvYWQudGFicyIscS5yZXBsYWNlKC8jLiokLywiIikpO3ZhciB3PXAuX3RhYklkKG8pO28uaHJlZj0iIyIrdzt2YXIgdj1hKCIjIit3KTtpZighdi5sZW5ndGgpe3Y9YShkLnBhbmVsVGVtcGxhdGUpLmF0dHIoImlkIix3KS5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuaW5zZXJ0QWZ0ZXIocC5wYW5lbHNbci0xXXx8cC5saXN0KTt2LmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSl9cC5wYW5lbHM9cC5wYW5lbHMuYWRkKHYpfWVsc2V7ZC5kaXNhYmxlZC5wdXNoKHIpfX19KTtpZihuKXt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKTt0aGlzLmxpc3QuYWRkQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIik7dGhpcy5saXMuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpO3RoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKTtpZihkLnNlbGVjdGVkPT09dW5kZWZpbmVkKXtpZihsb2NhdGlvbi5oYXNoKXt0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihxLG8pe2lmKG8uaGFzaD09bG9jYXRpb24uaGFzaCl7ZC5zZWxlY3RlZD1xO3JldHVybiBmYWxzZX19KX1pZih0eXBlb2YgZC5zZWxlY3RlZCE9Im51bWJlciImJmQuY29va2llKXtkLnNlbGVjdGVkPXBhcnNlSW50KHAuX2Nvb2tpZSgpLDEwKX1pZih0eXBlb2YgZC5zZWxlY3RlZCE9Im51bWJlciImJnRoaXMubGlzLmZpbHRlcigiLnVpLXRhYnMtc2VsZWN0ZWQiKS5sZW5ndGgpe2Quc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKX1kLnNlbGVjdGVkPWQuc2VsZWN0ZWR8fDB9ZWxzZXtpZihkLnNlbGVjdGVkPT09bnVsbCl7ZC5zZWxlY3RlZD0tMX19ZC5zZWxlY3RlZD0oKGQuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9yc1tkLnNlbGVjdGVkXSl8fGQuc2VsZWN0ZWQ8MCk/ZC5zZWxlY3RlZDowO2QuZGlzYWJsZWQ9YS51bmlxdWUoZC5kaXNhYmxlZC5jb25jYXQoYS5tYXAodGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihxLG8pe3JldHVybiBwLmxpcy5pbmRleChxKX0pKSkuc29ydCgpO2lmKGEuaW5BcnJheShkLnNlbGVjdGVkLGQuZGlzYWJsZWQpIT0tMSl7ZC5kaXNhYmxlZC5zcGxpY2UoYS5pbkFycmF5KGQuc2VsZWN0ZWQsZC5kaXNhYmxlZCksMSl9dGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3RoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2lmKGQuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgpe3RoaXMucGFuZWxzLmVxKGQuc2VsZWN0ZWQpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWhpZGUiKTt0aGlzLmxpcy5lcShkLnNlbGVjdGVkKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKTtwLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7cC5fdHJpZ2dlcigic2hvdyIsbnVsbCxwLl91aShwLmFuY2hvcnNbZC5zZWxlY3RlZF0scC5wYW5lbHNbZC5zZWxlY3RlZF0pKX0pO3RoaXMubG9hZChkLnNlbGVjdGVkKX1hKHdpbmRvdykuYmluZCgidW5sb2FkIixmdW5jdGlvbigpe3AubGlzLmFkZChwLmFuY2hvcnMpLnVuYmluZCgiLnRhYnMiKTtwLmxpcz1wLmFuY2hvcnM9cC5wYW5lbHM9bnVsbH0pfWVsc2V7ZC5zZWxlY3RlZD10aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpfXRoaXMuZWxlbWVudFtkLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKTtpZihkLmNvb2tpZSl7dGhpcy5fY29va2llKGQuc2VsZWN0ZWQsZC5jb29raWUpfWZvcih2YXIgZz0wLG07KG09dGhpcy5saXNbZ10pO2crKyl7YShtKVthLmluQXJyYXkoZyxkLmRpc2FibGVkKSE9LTEmJiFhKG0pLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKX1pZihkLmNhY2hlPT09ZmFsc2Upe3RoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIil9dGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGQuZXZlbnQhPSJtb3VzZW92ZXIiKXt2YXIgZj1mdW5jdGlvbihvLGkpe2lmKGkuaXMoIjpub3QoLnVpLXN0YXRlLWRpc2FibGVkKSIpKXtpLmFkZENsYXNzKCJ1aS1zdGF0ZS0iK28pfX07dmFyIGo9ZnVuY3Rpb24obyxpKXtpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS0iK28pfTt0aGlzLmxpcy5iaW5kKCJtb3VzZW92ZXIudGFicyIsZnVuY3Rpb24oKXtmKCJob3ZlciIsYSh0aGlzKSl9KTt0aGlzLmxpcy5iaW5kKCJtb3VzZW91dC50YWJzIixmdW5jdGlvbigpe2ooImhvdmVyIixhKHRoaXMpKX0pO3RoaXMuYW5jaG9ycy5iaW5kKCJmb2N1cy50YWJzIixmdW5jdGlvbigpe2YoImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSk7dGhpcy5hbmNob3JzLmJpbmQoImJsdXIudGFicyIsZnVuY3Rpb24oKXtqKCJmb2N1cyIsYSh0aGlzKS5jbG9zZXN0KCJsaSIpKX0pfXZhciBiLGg7aWYoZC5meCl7aWYoYS5pc0FycmF5KGQuZngpKXtiPWQuZnhbMF07aD1kLmZ4WzFdfWVsc2V7Yj1oPWQuZnh9fWZ1bmN0aW9uIGUoaSxvKXtpLmNzcyh7ZGlzcGxheToiIn0pO2lmKGEuYnJvd3Nlci5tc2llJiZvLm9wYWNpdHkpe2lbMF0uc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKX19dmFyIGs9aD9mdW5jdGlvbihpLG8pe2EoaSkuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGVmYXVsdCIpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO28uaGlkZSgpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWhpZGUiKS5hbmltYXRlKGgsaC5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXtlKG8saCk7cC5fdHJpZ2dlcigic2hvdyIsbnVsbCxwLl91aShpLG9bMF0pKX0pfTpmdW5jdGlvbihpLG8pe2EoaSkuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGVmYXVsdCIpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO28ucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3AuX3RyaWdnZXIoInNob3ciLG51bGwscC5fdWkoaSxvWzBdKSl9O3ZhciBsPWI/ZnVuY3Rpb24obyxpKXtpLmFuaW1hdGUoYixiLmR1cmF0aW9ufHwibm9ybWFsIixmdW5jdGlvbigpe3AubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0Iik7aS5hZGRDbGFzcygidWktdGFicy1oaWRlIik7ZShpLGIpO3AuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIil9KX06ZnVuY3Rpb24obyxpLHEpe3AubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0Iik7aS5hZGRDbGFzcygidWktdGFicy1oaWRlIik7cC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoZC5ldmVudCsiLnRhYnMiLGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxyPWEodGhpcykuY2xvc2VzdCgibGkiKSxpPXAucGFuZWxzLmZpbHRlcigiOm5vdCgudWktdGFicy1oaWRlKSIpLHE9YShwLl9zYW5pdGl6ZVNlbGVjdG9yKHRoaXMuaGFzaCkpO2lmKChyLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFkLmNvbGxhcHNpYmxlKXx8ci5oYXNDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKXx8ci5oYXNDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpfHxwLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwscC5fdWkodGhpcyxxWzBdKSk9PT1mYWxzZSl7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfWQuc2VsZWN0ZWQ9cC5hbmNob3JzLmluZGV4KHRoaXMpO3AuYWJvcnQoKTtpZihkLmNvbGxhcHNpYmxlKXtpZihyLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikpe2Quc2VsZWN0ZWQ9LTE7aWYoZC5jb29raWUpe3AuX2Nvb2tpZShkLnNlbGVjdGVkLGQuY29va2llKX1wLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7bChvLGkpfSkuZGVxdWV1ZSgidGFicyIpO3RoaXMuYmx1cigpO3JldHVybiBmYWxzZX1lbHNle2lmKCFpLmxlbmd0aCl7aWYoZC5jb29raWUpe3AuX2Nvb2tpZShkLnNlbGVjdGVkLGQuY29va2llKX1wLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7ayhvLHEpfSk7cC5sb2FkKHAuYW5jaG9ycy5pbmRleCh0aGlzKSk7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfX19aWYoZC5jb29raWUpe3AuX2Nvb2tpZShkLnNlbGVjdGVkLGQuY29va2llKX1pZihxLmxlbmd0aCl7aWYoaS5sZW5ndGgpe3AuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtsKG8saSl9KX1wLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7ayhvLHEpfSk7cC5sb2FkKHAuYW5jaG9ycy5pbmRleCh0aGlzKSl9ZWxzZXt0aHJvdyJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4ifWlmKGEuYnJvd3Nlci5tc2llKXt0aGlzLmJsdXIoKX19KTt0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmFib3J0KCk7dGhpcy5lbGVtZW50LnVuYmluZCgiLnRhYnMiKS5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIikucmVtb3ZlRGF0YSgidGFicyIpO3RoaXMubGlzdC5yZW1vdmVDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKTt0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEuZGF0YSh0aGlzLCJocmVmLnRhYnMiKTtpZihjKXt0aGlzLmhyZWY9Y312YXIgZD1hKHRoaXMpLnVuYmluZCgiLnRhYnMiKTthLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oZSxmKXtkLnJlbW92ZURhdGEoZisiLnRhYnMiKX0pfSk7dGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKSl7YSh0aGlzKS5yZW1vdmUoKX1lbHNle2EodGhpcykucmVtb3ZlQ2xhc3MoWyJ1aS1zdGF0ZS1kZWZhdWx0IiwidWktY29ybmVyLXRvcCIsInVpLXRhYnMtc2VsZWN0ZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLCJ1aS1zdGF0ZS1ob3ZlciIsInVpLXN0YXRlLWZvY3VzIiwidWktc3RhdGUtZGlzYWJsZWQiLCJ1aS10YWJzLXBhbmVsIiwidWktd2lkZ2V0LWNvbnRlbnQiLCJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy1oaWRlIl0uam9pbigiICIpKX19KTtpZihiLmNvb2tpZSl7dGhpcy5fY29va2llKG51bGwsYi5jb29raWUpfX0sYWRkOmZ1bmN0aW9uKGUsZCxjKXtpZihjPT09dW5kZWZpbmVkKXtjPXRoaXMuYW5jaG9ycy5sZW5ndGh9dmFyIGI9dGhpcyxnPXRoaXMub3B0aW9ucyxpPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxlKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGg9IWUuaW5kZXhPZigiIyIpP2UucmVwbGFjZSgiIyIsIiIpOnRoaXMuX3RhYklkKGEoImEiLGkpWzBdKTtpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKS5kYXRhKCJkZXN0cm95LnRhYnMiLHRydWUpO3ZhciBmPWEoIiMiK2gpO2lmKCFmLmxlbmd0aCl7Zj1hKGcucGFuZWxUZW1wbGF0ZSkuYXR0cigiaWQiLGgpLmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSl9Zi5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLXRhYnMtaGlkZSIpO2lmKGM+PXRoaXMubGlzLmxlbmd0aCl7aS5hcHBlbmRUbyh0aGlzLmxpc3QpO2YuYXBwZW5kVG8odGhpcy5saXN0WzBdLnBhcmVudE5vZGUpfWVsc2V7aS5pbnNlcnRCZWZvcmUodGhpcy5saXNbY10pO2YuaW5zZXJ0QmVmb3JlKHRoaXMucGFuZWxzW2NdKX1nLmRpc2FibGVkPWEubWFwKGcuZGlzYWJsZWQsZnVuY3Rpb24oayxqKXtyZXR1cm4gaz49Yz8rK2s6a30pO3RoaXMuX3RhYmlmeSgpO2lmKHRoaXMuYW5jaG9ycy5sZW5ndGg9PTEpe2kuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Zi5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIik7dGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2IuX3RyaWdnZXIoInNob3ciLG51bGwsYi5fdWkoYi5hbmNob3JzWzBdLGIucGFuZWxzWzBdKSl9KTt0aGlzLmxvYWQoMCl9dGhpcy5fdHJpZ2dlcigiYWRkIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tjXSx0aGlzLnBhbmVsc1tjXSkpfSxyZW1vdmU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5vcHRpb25zLGU9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksYz10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtpZihlLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJnRoaXMuYW5jaG9ycy5sZW5ndGg+MSl7dGhpcy5zZWxlY3QoYisoYisxPHRoaXMuYW5jaG9ycy5sZW5ndGg/MTotMSkpfWQuZGlzYWJsZWQ9YS5tYXAoYS5ncmVwKGQuZGlzYWJsZWQsZnVuY3Rpb24oZyxmKXtyZXR1cm4gZyE9Yn0pLGZ1bmN0aW9uKGcsZil7cmV0dXJuIGc+PWI/LS1nOmd9KTt0aGlzLl90YWJpZnkoKTt0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLG51bGwsdGhpcy5fdWkoZS5maW5kKCJhIilbMF0sY1swXSkpfSxlbmFibGU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO2lmKGEuaW5BcnJheShiLGMuZGlzYWJsZWQpPT0tMSl7cmV0dXJufXRoaXMubGlzLmVxKGIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2MuZGlzYWJsZWQ9YS5ncmVwKGMuZGlzYWJsZWQsZnVuY3Rpb24oZSxkKXtyZXR1cm4gZSE9Yn0pO3RoaXMuX3RyaWdnZXIoImVuYWJsZSIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYl0sdGhpcy5wYW5lbHNbYl0pKX0sZGlzYWJsZTpmdW5jdGlvbihjKXt2YXIgYj10aGlzLGQ9dGhpcy5vcHRpb25zO2lmKGMhPWQuc2VsZWN0ZWQpe3RoaXMubGlzLmVxKGMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2QuZGlzYWJsZWQucHVzaChjKTtkLmRpc2FibGVkLnNvcnQoKTt0aGlzLl90cmlnZ2VyKCJkaXNhYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tjXSx0aGlzLnBhbmVsc1tjXSkpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7Yj10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSIrYisiXSIpKX1lbHNle2lmKGI9PT1udWxsKXtiPS0xfX1pZihiPT0tMSYmdGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKXtiPXRoaXMub3B0aW9ucy5zZWxlY3RlZH10aGlzLmFuY2hvcnMuZXEoYikudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIil9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIGM9dGhpcyxnPXRoaXMub3B0aW9ucyxiPXRoaXMuYW5jaG9ycy5lcShlKVswXSxkPWEuZGF0YShiLCJsb2FkLnRhYnMiKTt0aGlzLmFib3J0KCk7aWYoIWR8fHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIpLmxlbmd0aCE9PTAmJmEuZGF0YShiLCJjYWNoZS50YWJzIikpe3RoaXMuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIik7cmV0dXJufXRoaXMubGlzLmVxKGUpLmFkZENsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIik7aWYoZy5zcGlubmVyKXt2YXIgZj1hKCJzcGFuIixiKTtmLmRhdGEoImxhYmVsLnRhYnMiLGYuaHRtbCgpKS5odG1sKGcuc3Bpbm5lcil9dGhpcy54aHI9YS5hamF4KGEuZXh0ZW5kKHt9LGcuYWpheE9wdGlvbnMse3VybDpkLHN1Y2Nlc3M6ZnVuY3Rpb24oaSxoKXthKGMuX3Nhbml0aXplU2VsZWN0b3IoYi5oYXNoKSkuaHRtbChpKTtjLl9jbGVhbnVwKCk7aWYoZy5jYWNoZSl7YS5kYXRhKGIsImNhY2hlLnRhYnMiLHRydWUpfWMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2VdLGMucGFuZWxzW2VdKSk7dHJ5e2cuYWpheE9wdGlvbnMuc3VjY2VzcyhpLGgpfWNhdGNoKGope31jLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpfX0pKX0sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucXVldWUoW10pO3RoaXMucGFuZWxzLnN0b3AoZmFsc2UsdHJ1ZSk7aWYodGhpcy54aHIpe3RoaXMueGhyLmFib3J0KCk7ZGVsZXRlIHRoaXMueGhyfXRoaXMuX2NsZWFudXAoKX0sdXJsOmZ1bmN0aW9uKGMsYil7dGhpcy5hbmNob3JzLmVxKGMpLnJlbW92ZURhdGEoImNhY2hlLnRhYnMiKS5kYXRhKCJsb2FkLnRhYnMiLGIpfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KTthLmV4dGVuZChhLnVpLnRhYnMse3ZlcnNpb246IjEuNy4yIixnZXR0ZXI6Imxlbmd0aCIsZGVmYXVsdHM6e2FqYXhPcHRpb25zOm51bGwsY2FjaGU6ZmFsc2UsY29va2llOm51bGwsY29sbGFwc2libGU6ZmFsc2UsZGlzYWJsZWQ6W10sZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIscGFuZWxUZW1wbGF0ZToiPGRpdj48L2Rpdj4iLHNwaW5uZXI6IjxlbT5Mb2FkaW5nJiM4MjMwOzwvZW0+Iix0YWJUZW1wbGF0ZTonPGxpPjxhIGhyZWY9IiN7aHJlZn0iPjxzcGFuPiN7bGFiZWx9PC9zcGFuPjwvYT48L2xpPid9fSk7YS5leHRlbmQoYS51aS50YWJzLnByb3RvdHlwZSx7cm90YXRpb246bnVsbCxyb3RhdGU6ZnVuY3Rpb24oZCxmKXt2YXIgYj10aGlzLGc9dGhpcy5vcHRpb25zO3ZhciBjPWIuX3JvdGF0ZXx8KGIuX3JvdGF0ZT1mdW5jdGlvbihoKXtjbGVhclRpbWVvdXQoYi5yb3RhdGlvbik7Yi5yb3RhdGlvbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGk9Zy5zZWxlY3RlZDtiLnNlbGVjdCgrK2k8Yi5hbmNob3JzLmxlbmd0aD9pOjApfSxkKTtpZihoKXtoLnN0b3BQcm9wYWdhdGlvbigpfX0pO3ZhciBlPWIuX3Vucm90YXRlfHwoYi5fdW5yb3RhdGU9IWY/ZnVuY3Rpb24oaCl7aWYoaC5jbGllbnRYKXtiLnJvdGF0ZShudWxsKX19OmZ1bmN0aW9uKGgpe3Q9Zy5zZWxlY3RlZDtjKCl9KTtpZihkKXt0aGlzLmVsZW1lbnQuYmluZCgidGFic3Nob3ciLGMpO3RoaXMuYW5jaG9ycy5iaW5kKGcuZXZlbnQrIi50YWJzIixlKTtjKCl9ZWxzZXtjbGVhclRpbWVvdXQoYi5yb3RhdGlvbik7dGhpcy5lbGVtZW50LnVuYmluZCgidGFic3Nob3ciLGMpO3RoaXMuYW5jaG9ycy51bmJpbmQoZy5ldmVudCsiLnRhYnMiLGUpO2RlbGV0ZSB0aGlzLl9yb3RhdGU7ZGVsZXRlIHRoaXMuX3Vucm90YXRlfX19KX0pKGpRdWVyeSk7Oy8qCisgKiBqUXVlcnkgVUkgRGF0ZXBpY2tlciAxLjcuMgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoTUlULUxJQ0VOU0UudHh0KQorICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBsaWNlbnNlcy4KKyAqCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0RhdGVwaWNrZXIKKyAqCisgKiBEZXBlbmRzOgorICoJdWkuY29yZS5qcworICovCisoZnVuY3Rpb24oJCl7JC5leHRlbmQoJC51aSx7ZGF0ZXBpY2tlcjp7dmVyc2lvbjoiMS43LjIifX0pO3ZhciBQUk9QX05BTUU9ImRhdGVwaWNrZXIiO2Z1bmN0aW9uIERhdGVwaWNrZXIoKXt0aGlzLmRlYnVnPWZhbHNlO3RoaXMuX2N1ckluc3Q9bnVsbDt0aGlzLl9rZXlFdmVudD1mYWxzZTt0aGlzLl9kaXNhYmxlZElucHV0cz1bXTt0aGlzLl9kYXRlcGlja2VyU2hvd2luZz1mYWxzZTt0aGlzLl9pbkRpYWxvZz1mYWxzZTt0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Ijt0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiO3RoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCI7dGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiO3RoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyI7dGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIjt0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiO3RoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSI7dGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIjt0aGlzLnJlZ2lvbmFsPVtdO3RoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSxkYXRlRm9ybWF0OiJtbS9kZC95eSIsZmlyc3REYXk6MCxpc1JUTDpmYWxzZX07dGhpcy5fZGVmYXVsdHM9e3Nob3dPbjoiZm9jdXMiLHNob3dBbmltOiJzaG93IixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ZmFsc2UsaGlkZUlmTm9QcmV2TmV4dDpmYWxzZSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OmZhbHNlLGdvdG9DdXJyZW50OmZhbHNlLGNoYW5nZU1vbnRoOmZhbHNlLGNoYW5nZVllYXI6ZmFsc2Usc2hvd01vbnRoQWZ0ZXJZZWFyOmZhbHNlLHllYXJSYW5nZToiLTEwOisxMCIsc2hvd090aGVyTW9udGhzOmZhbHNlLGNhbGN1bGF0ZVdlZWs6dGhpcy5pc284NjAxV2VlayxzaG9ydFllYXJDdXRvZmY6IisxMCIsbWluRGF0ZTpudWxsLG1heERhdGU6bnVsbCxkdXJhdGlvbjoibm9ybWFsIixiZWZvcmVTaG93RGF5Om51bGwsYmVmb3JlU2hvdzpudWxsLG9uU2VsZWN0Om51bGwsb25DaGFuZ2VNb250aFllYXI6bnVsbCxvbkNsb3NlOm51bGwsbnVtYmVyT2ZNb250aHM6MSxzaG93Q3VycmVudEF0UG9zOjAsc3RlcE1vbnRoczoxLHN0ZXBCaWdNb250aHM6MTIsYWx0RmllbGQ6IiIsYWx0Rm9ybWF0OiIiLGNvbnN0cmFpbklucHV0OnRydWUsc2hvd0J1dHRvblBhbmVsOmZhbHNlfTskLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSk7dGhpcy5kcERpdj0kKCc8ZGl2IGlkPSInK3RoaXMuX21haW5EaXZJZCsnIiBjbGFzcz0idWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwgdWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIj48L2Rpdj4nKX0kLmV4dGVuZChEYXRlcGlja2VyLnByb3RvdHlwZSx7bWFya2VyQ2xhc3NOYW1lOiJoYXNEYXRlcGlja2VyIixsb2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZy5hcHBseSgiIixhcmd1bWVudHMpfX0sc2V0RGVmYXVsdHM6ZnVuY3Rpb24oc2V0dGluZ3Mpe2V4dGVuZFJlbW92ZSh0aGlzLl9kZWZhdWx0cyxzZXR0aW5nc3x8e30pO3JldHVybiB0aGlzfSxfYXR0YWNoRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsc2V0dGluZ3Mpe3ZhciBpbmxpbmVTZXR0aW5ncz1udWxsO2Zvcih2YXIgYXR0ck5hbWUgaW4gdGhpcy5fZGVmYXVsdHMpe3ZhciBhdHRyVmFsdWU9dGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0ZToiK2F0dHJOYW1lKTtpZihhdHRyVmFsdWUpe2lubGluZVNldHRpbmdzPWlubGluZVNldHRpbmdzfHx7fTt0cnl7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWV2YWwoYXR0clZhbHVlKX1jYXRjaChlcnIpe2lubGluZVNldHRpbmdzW2F0dHJOYW1lXT1hdHRyVmFsdWV9fX12YXIgbm9kZU5hbWU9dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dmFyIGlubGluZT0obm9kZU5hbWU9PSJkaXYifHxub2RlTmFtZT09InNwYW4iKTtpZighdGFyZ2V0LmlkKXt0YXJnZXQuaWQ9ImRwIisoKyt0aGlzLnV1aWQpfXZhciBpbnN0PXRoaXMuX25ld0luc3QoJCh0YXJnZXQpLGlubGluZSk7aW5zdC5zZXR0aW5ncz0kLmV4dGVuZCh7fSxzZXR0aW5nc3x8e30saW5saW5lU2V0dGluZ3N8fHt9KTtpZihub2RlTmFtZT09ImlucHV0Iil7dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodGFyZ2V0LGluc3QpfWVsc2V7aWYoaW5saW5lKXt0aGlzLl9pbmxpbmVEYXRlcGlja2VyKHRhcmdldCxpbnN0KX19fSxfbmV3SW5zdDpmdW5jdGlvbih0YXJnZXQsaW5saW5lKXt2YXIgaWQ9dGFyZ2V0WzBdLmlkLnJlcGxhY2UoLyhbOlxbXF1cLl0pL2csIlxcXFwkMSIpO3JldHVybntpZDppZCxpbnB1dDp0YXJnZXQsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6aW5saW5lLGRwRGl2OighaW5saW5lP3RoaXMuZHBEaXY6JCgnPGRpdiBjbGFzcz0iJyt0aGlzLl9pbmxpbmVDbGFzcysnIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSl9fSxfY29ubmVjdERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0LGluc3Qpe3ZhciBpbnB1dD0kKHRhcmdldCk7aW5zdC5hcHBlbmQ9JChbXSk7aW5zdC50cmlnZ2VyPSQoW10pO2lmKGlucHV0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSl7cmV0dXJufXZhciBhcHBlbmRUZXh0PXRoaXMuX2dldChpbnN0LCJhcHBlbmRUZXh0Iik7dmFyIGlzUlRMPXRoaXMuX2dldChpbnN0LCJpc1JUTCIpO2lmKGFwcGVuZFRleHQpe2luc3QuYXBwZW5kPSQoJzxzcGFuIGNsYXNzPSInK3RoaXMuX2FwcGVuZENsYXNzKyciPicrYXBwZW5kVGV4dCsiPC9zcGFuPiIpO2lucHV0W2lzUlRMPyJiZWZvcmUiOiJhZnRlciJdKGluc3QuYXBwZW5kKX12YXIgc2hvd09uPXRoaXMuX2dldChpbnN0LCJzaG93T24iKTtpZihzaG93T249PSJmb2N1cyJ8fHNob3dPbj09ImJvdGgiKXtpbnB1dC5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlcil9aWYoc2hvd09uPT0iYnV0dG9uInx8c2hvd09uPT0iYm90aCIpe3ZhciBidXR0b25UZXh0PXRoaXMuX2dldChpbnN0LCJidXR0b25UZXh0Iik7dmFyIGJ1dHRvbkltYWdlPXRoaXMuX2dldChpbnN0LCJidXR0b25JbWFnZSIpO2luc3QudHJpZ2dlcj0kKHRoaXMuX2dldChpbnN0LCJidXR0b25JbWFnZU9ubHkiKT8kKCI8aW1nLz4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmF0dHIoe3NyYzpidXR0b25JbWFnZSxhbHQ6YnV0dG9uVGV4dCx0aXRsZTpidXR0b25UZXh0fSk6JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuaHRtbChidXR0b25JbWFnZT09IiI/YnV0dG9uVGV4dDokKCI8aW1nLz4iKS5hdHRyKHtzcmM6YnV0dG9uSW1hZ2UsYWx0OmJ1dHRvblRleHQsdGl0bGU6YnV0dG9uVGV4dH0pKSk7aW5wdXRbaXNSVEw/ImJlZm9yZSI6ImFmdGVyIl0oaW5zdC50cmlnZ2VyKTtpbnN0LnRyaWdnZXIuY2xpY2soZnVuY3Rpb24oKXtpZigkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD09dGFyZ2V0KXskLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9ZWxzZXskLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRhcmdldCl9cmV0dXJuIGZhbHNlfSl9aW5wdXQuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmtleWRvd24odGhpcy5fZG9LZXlEb3duKS5rZXlwcmVzcyh0aGlzLl9kb0tleVByZXNzKS5iaW5kKCJzZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGV2ZW50LGtleSx2YWx1ZSl7aW5zdC5zZXR0aW5nc1trZXldPXZhbHVlfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihldmVudCxrZXkpe3JldHVybiB0aGlzLl9nZXQoaW5zdCxrZXkpfSk7JC5kYXRhKHRhcmdldCxQUk9QX05BTUUsaW5zdCl9LF9pbmxpbmVEYXRlcGlja2VyOmZ1bmN0aW9uKHRhcmdldCxpbnN0KXt2YXIgZGl2U3Bhbj0kKHRhcmdldCk7aWYoZGl2U3Bhbi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpe3JldHVybn1kaXZTcGFuLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQoaW5zdC5kcERpdikuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihldmVudCxrZXksdmFsdWUpe2luc3Quc2V0dGluZ3Nba2V5XT12YWx1ZX0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oZXZlbnQsa2V5KXtyZXR1cm4gdGhpcy5fZ2V0KGluc3Qsa2V5KX0pOyQuZGF0YSh0YXJnZXQsUFJPUF9OQU1FLGluc3QpO3RoaXMuX3NldERhdGUoaW5zdCx0aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KSk7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTt0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCl9LF9kaWFsb2dEYXRlcGlja2VyOmZ1bmN0aW9uKGlucHV0LGRhdGVUZXh0LG9uU2VsZWN0LHNldHRpbmdzLHBvcyl7dmFyIGluc3Q9dGhpcy5fZGlhbG9nSW5zdDtpZighaW5zdCl7dmFyIGlkPSJkcCIrKCsrdGhpcy51dWlkKTt0aGlzLl9kaWFsb2dJbnB1dD0kKCc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IicraWQrJyIgc2l6ZT0iMSIgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtMTAwcHg7Ii8+Jyk7dGhpcy5fZGlhbG9nSW5wdXQua2V5ZG93bih0aGlzLl9kb0tleURvd24pOyQoImJvZHkiKS5hcHBlbmQodGhpcy5fZGlhbG9nSW5wdXQpO2luc3Q9dGhpcy5fZGlhbG9nSW5zdD10aGlzLl9uZXdJbnN0KHRoaXMuX2RpYWxvZ0lucHV0LGZhbHNlKTtpbnN0LnNldHRpbmdzPXt9OyQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSxQUk9QX05BTUUsaW5zdCl9ZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3Msc2V0dGluZ3N8fHt9KTt0aGlzLl9kaWFsb2dJbnB1dC52YWwoZGF0ZVRleHQpO3RoaXMuX3Bvcz0ocG9zPyhwb3MubGVuZ3RoP3BvczpbcG9zLnBhZ2VYLHBvcy5wYWdlWV0pOm51bGwpO2lmKCF0aGlzLl9wb3Mpe3ZhciBicm93c2VyV2lkdGg9d2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDt2YXIgYnJvd3NlckhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR8fGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O3ZhciBzY3JvbGxYPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7dmFyIHNjcm9sbFk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7dGhpcy5fcG9zPVsoYnJvd3NlcldpZHRoLzIpLTEwMCtzY3JvbGxYLChicm93c2VySGVpZ2h0LzIpLTE1MCtzY3JvbGxZXX10aGlzLl9kaWFsb2dJbnB1dC5jc3MoImxlZnQiLHRoaXMuX3Bvc1swXSsicHgiKS5jc3MoInRvcCIsdGhpcy5fcG9zWzFdKyJweCIpO2luc3Quc2V0dGluZ3Mub25TZWxlY3Q9b25TZWxlY3Q7dGhpcy5faW5EaWFsb2c9dHJ1ZTt0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKTt0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSk7aWYoJC5ibG9ja1VJKXskLmJsb2NrVUkodGhpcy5kcERpdil9JC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxpbnN0KTtyZXR1cm4gdGhpc30sX2Rlc3Ryb3lEYXRlcGlja2VyOmZ1bmN0aW9uKHRhcmdldCl7dmFyICR0YXJnZXQ9JCh0YXJnZXQpO3ZhciBpbnN0PSQuZGF0YSh0YXJnZXQsUFJPUF9OQU1FKTtpZighJHRhcmdldC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpe3JldHVybn12YXIgbm9kZU5hbWU9dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7JC5yZW1vdmVEYXRhKHRhcmdldCxQUk9QX05BTUUpO2lmKG5vZGVOYW1lPT0iaW5wdXQiKXtpbnN0LmFwcGVuZC5yZW1vdmUoKTtpbnN0LnRyaWdnZXIucmVtb3ZlKCk7JHRhcmdldC5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZCgia2V5ZG93biIsdGhpcy5fZG9LZXlEb3duKS51bmJpbmQoImtleXByZXNzIix0aGlzLl9kb0tleVByZXNzKX1lbHNle2lmKG5vZGVOYW1lPT0iZGl2Inx8bm9kZU5hbWU9PSJzcGFuIil7JHRhcmdldC5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKX19fSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQpe3ZhciAkdGFyZ2V0PSQodGFyZ2V0KTt2YXIgaW5zdD0kLmRhdGEodGFyZ2V0LFBST1BfTkFNRSk7aWYoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXtyZXR1cm59dmFyIG5vZGVOYW1lPXRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKG5vZGVOYW1lPT0iaW5wdXQiKXt0YXJnZXQuZGlzYWJsZWQ9ZmFsc2U7aW5zdC50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ZmFsc2V9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMS4wIixjdXJzb3I6IiJ9KX1lbHNle2lmKG5vZGVOYW1lPT0iZGl2Inx8bm9kZU5hbWU9PSJzcGFuIil7dmFyIGlubGluZT0kdGFyZ2V0LmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7aW5saW5lLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil9fXRoaXMuX2Rpc2FibGVkSW5wdXRzPSQubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4odmFsdWU9PXRhcmdldD9udWxsOnZhbHVlKX0pfSxfZGlzYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0KXt2YXIgJHRhcmdldD0kKHRhcmdldCk7dmFyIGluc3Q9JC5kYXRhKHRhcmdldCxQUk9QX05BTUUpO2lmKCEkdGFyZ2V0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSl7cmV0dXJufXZhciBub2RlTmFtZT10YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihub2RlTmFtZT09ImlucHV0Iil7dGFyZ2V0LmRpc2FibGVkPXRydWU7aW5zdC50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9dHJ1ZX0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIwLjUiLGN1cnNvcjoiZGVmYXVsdCJ9KX1lbHNle2lmKG5vZGVOYW1lPT0iZGl2Inx8bm9kZU5hbWU9PSJzcGFuIil7dmFyIGlubGluZT0kdGFyZ2V0LmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7aW5saW5lLmNoaWxkcmVuKCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil9fXRoaXMuX2Rpc2FibGVkSW5wdXRzPSQubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4odmFsdWU9PXRhcmdldD9udWxsOnZhbHVlKX0pO3RoaXMuX2Rpc2FibGVkSW5wdXRzW3RoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aF09dGFyZ2V0fSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0KXtpZighdGFyZ2V0KXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBpPTA7aTx0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg7aSsrKXtpZih0aGlzLl9kaXNhYmxlZElucHV0c1tpXT09dGFyZ2V0KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfSxfZ2V0SW5zdDpmdW5jdGlvbih0YXJnZXQpe3RyeXtyZXR1cm4gJC5kYXRhKHRhcmdldCxQUk9QX05BTUUpfWNhdGNoKGVycil7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0LG5hbWUsdmFsdWUpe3ZhciBpbnN0PXRoaXMuX2dldEluc3QodGFyZ2V0KTtpZihhcmd1bWVudHMubGVuZ3RoPT0yJiZ0eXBlb2YgbmFtZT09InN0cmluZyIpe3JldHVybihuYW1lPT0iZGVmYXVsdHMiPyQuZXh0ZW5kKHt9LCQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpOihpbnN0PyhuYW1lPT0iYWxsIj8kLmV4dGVuZCh7fSxpbnN0LnNldHRpbmdzKTp0aGlzLl9nZXQoaW5zdCxuYW1lKSk6bnVsbCkpfXZhciBzZXR0aW5ncz1uYW1lfHx7fTtpZih0eXBlb2YgbmFtZT09InN0cmluZyIpe3NldHRpbmdzPXt9O3NldHRpbmdzW25hbWVdPXZhbHVlfWlmKGluc3Qpe2lmKHRoaXMuX2N1ckluc3Q9PWluc3Qpe3RoaXMuX2hpZGVEYXRlcGlja2VyKG51bGwpfXZhciBkYXRlPXRoaXMuX2dldERhdGVEYXRlcGlja2VyKHRhcmdldCk7ZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3Msc2V0dGluZ3MpO3RoaXMuX3NldERhdGVEYXRlcGlja2VyKHRhcmdldCxkYXRlKTt0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpfX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0LG5hbWUsdmFsdWUpe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIodGFyZ2V0LG5hbWUsdmFsdWUpfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0KXt2YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdldCk7aWYoaW5zdCl7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KX19LF9zZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsZGF0ZSxlbmREYXRlKXt2YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdldCk7aWYoaW5zdCl7dGhpcy5fc2V0RGF0ZShpbnN0LGRhdGUsZW5kRGF0ZSk7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTt0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCl9fSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0KXt2YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdldCk7aWYoaW5zdCYmIWluc3QuaW5saW5lKXt0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGluc3QpfXJldHVybihpbnN0P3RoaXMuX2dldERhdGUoaW5zdCk6bnVsbCl9LF9kb0tleURvd246ZnVuY3Rpb24oZXZlbnQpe3ZhciBpbnN0PSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChldmVudC50YXJnZXQpO3ZhciBoYW5kbGVkPXRydWU7dmFyIGlzUlRMPWluc3QuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpO2luc3QuX2tleUV2ZW50PXRydWU7aWYoJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyl7c3dpdGNoKGV2ZW50LmtleUNvZGUpe2Nhc2UgOTokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKG51bGwsIiIpO2JyZWFrO2Nhc2UgMTM6dmFyIHNlbD0kKCJ0ZC4iKyQuZGF0ZXBpY2tlci5fZGF5T3ZlckNsYXNzKyIsIHRkLiIrJC5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MsaW5zdC5kcERpdik7aWYoc2VsWzBdKXskLmRhdGVwaWNrZXIuX3NlbGVjdERheShldmVudC50YXJnZXQsaW5zdC5zZWxlY3RlZE1vbnRoLGluc3Quc2VsZWN0ZWRZZWFyLHNlbFswXSl9ZWxzZXskLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKG51bGwsJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwiZHVyYXRpb24iKSl9cmV0dXJuIGZhbHNlO2JyZWFrO2Nhc2UgMjc6JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcihudWxsLCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsImR1cmF0aW9uIikpO2JyZWFrO2Nhc2UgMzM6JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwoZXZlbnQuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCJzdGVwTW9udGhzIikpLCJNIik7YnJlYWs7Y2FzZSAzNDokLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LChldmVudC5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChpbnN0LCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsInN0ZXBNb250aHMiKSksIk0iKTticmVhaztjYXNlIDM1OmlmKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpeyQuZGF0ZXBpY2tlci5fY2xlYXJEYXRlKGV2ZW50LnRhcmdldCl9aGFuZGxlZD1ldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzY6aWYoZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleSl7JC5kYXRlcGlja2VyLl9nb3RvVG9kYXkoZXZlbnQudGFyZ2V0KX1oYW5kbGVkPWV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzNzppZihldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KXskLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LChpc1JUTD8rMTotMSksIkQiKX1oYW5kbGVkPWV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXk7aWYoZXZlbnQub3JpZ2luYWxFdmVudC5hbHRLZXkpeyQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsKGV2ZW50LmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwic3RlcE1vbnRocyIpKSwiTSIpfWJyZWFrO2Nhc2UgMzg6aWYoZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleSl7JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwtNywiRCIpfWhhbmRsZWQ9ZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleTticmVhaztjYXNlIDM5OmlmKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpeyQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsKGlzUlRMPy0xOisxKSwiRCIpfWhhbmRsZWQ9ZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleTtpZihldmVudC5vcmlnaW5hbEV2ZW50LmFsdEtleSl7JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwoZXZlbnQuY3RybEtleT8rJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwic3RlcEJpZ01vbnRocyIpOiskLmRhdGVwaWNrZXIuX2dldChpbnN0LCJzdGVwTW9udGhzIikpLCJNIil9YnJlYWs7Y2FzZSA0MDppZihldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KXskLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCs3LCJEIil9aGFuZGxlZD1ldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5O2JyZWFrO2RlZmF1bHQ6aGFuZGxlZD1mYWxzZX19ZWxzZXtpZihldmVudC5rZXlDb2RlPT0zNiYmZXZlbnQuY3RybEtleSl7JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKX1lbHNle2hhbmRsZWQ9ZmFsc2V9fWlmKGhhbmRsZWQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9fSxfZG9LZXlQcmVzczpmdW5jdGlvbihldmVudCl7dmFyIGluc3Q9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7aWYoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwiY29uc3RyYWluSW5wdXQiKSl7dmFyIGNoYXJzPSQuZGF0ZXBpY2tlci5fcG9zc2libGVDaGFycygkLmRhdGVwaWNrZXIuX2dldChpbnN0LCJkYXRlRm9ybWF0IikpO3ZhciBjaHI9U3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZT09dW5kZWZpbmVkP2V2ZW50LmtleUNvZGU6ZXZlbnQuY2hhckNvZGUpO3JldHVybiBldmVudC5jdHJsS2V5fHwoY2hyPCIgInx8IWNoYXJzfHxjaGFycy5pbmRleE9mKGNocik+LTEpfX0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKGlucHV0KXtpbnB1dD1pbnB1dC50YXJnZXR8fGlucHV0O2lmKGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPSJpbnB1dCIpe2lucHV0PSQoImlucHV0IixpbnB1dC5wYXJlbnROb2RlKVswXX1pZigkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGlucHV0KXx8JC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWlucHV0KXtyZXR1cm59dmFyIGluc3Q9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGlucHV0KTt2YXIgYmVmb3JlU2hvdz0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCJiZWZvcmVTaG93Iik7ZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3MsKGJlZm9yZVNob3c/YmVmb3JlU2hvdy5hcHBseShpbnB1dCxbaW5wdXQsaW5zdF0pOnt9KSk7JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcihudWxsLCIiKTskLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD1pbnB1dDskLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7aWYoJC5kYXRlcGlja2VyLl9pbkRpYWxvZyl7aW5wdXQudmFsdWU9IiJ9aWYoISQuZGF0ZXBpY2tlci5fcG9zKXskLmRhdGVwaWNrZXIuX3Bvcz0kLmRhdGVwaWNrZXIuX2ZpbmRQb3MoaW5wdXQpOyQuZGF0ZXBpY2tlci5fcG9zWzFdKz1pbnB1dC5vZmZzZXRIZWlnaHR9dmFyIGlzRml4ZWQ9ZmFsc2U7JChpbnB1dCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtpc0ZpeGVkfD0kKHRoaXMpLmNzcygicG9zaXRpb24iKT09ImZpeGVkIjtyZXR1cm4gIWlzRml4ZWR9KTtpZihpc0ZpeGVkJiYkLmJyb3dzZXIub3BlcmEpeyQuZGF0ZXBpY2tlci5fcG9zWzBdLT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDskLmRhdGVwaWNrZXIuX3Bvc1sxXS09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcH12YXIgb2Zmc2V0PXtsZWZ0OiQuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDokLmRhdGVwaWNrZXIuX3Bvc1sxXX07JC5kYXRlcGlja2VyLl9wb3M9bnVsbDtpbnN0LnJhbmdlU3RhcnQ9bnVsbDtpbnN0LmRwRGl2LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJibG9jayIsdG9wOiItMTAwMHB4In0pOyQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTtvZmZzZXQ9JC5kYXRlcGlja2VyLl9jaGVja09mZnNldChpbnN0LG9mZnNldCxpc0ZpeGVkKTtpbnN0LmRwRGl2LmNzcyh7cG9zaXRpb246KCQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJiQuYmxvY2tVST8ic3RhdGljIjooaXNGaXhlZD8iZml4ZWQiOiJhYnNvbHV0ZSIpKSxkaXNwbGF5OiJub25lIixsZWZ0Om9mZnNldC5sZWZ0KyJweCIsdG9wOm9mZnNldC50b3ArInB4In0pO2lmKCFpbnN0LmlubGluZSl7dmFyIHNob3dBbmltPSQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsInNob3dBbmltIil8fCJzaG93Ijt2YXIgZHVyYXRpb249JC5kYXRlcGlja2VyLl9nZXQoaW5zdCwiZHVyYXRpb24iKTt2YXIgcG9zdFByb2Nlc3M9ZnVuY3Rpb24oKXskLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nPXRydWU7aWYoJC5icm93c2VyLm1zaWUmJnBhcnNlSW50KCQuYnJvd3Nlci52ZXJzaW9uLDEwKTw3KXskKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpLmNzcyh7d2lkdGg6aW5zdC5kcERpdi53aWR0aCgpKzQsaGVpZ2h0Omluc3QuZHBEaXYuaGVpZ2h0KCkrNH0pfX07aWYoJC5lZmZlY3RzJiYkLmVmZmVjdHNbc2hvd0FuaW1dKXtpbnN0LmRwRGl2LnNob3coc2hvd0FuaW0sJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwic2hvd09wdGlvbnMiKSxkdXJhdGlvbixwb3N0UHJvY2Vzcyl9ZWxzZXtpbnN0LmRwRGl2W3Nob3dBbmltXShkdXJhdGlvbixwb3N0UHJvY2Vzcyl9aWYoZHVyYXRpb249PSIiKXtwb3N0UHJvY2VzcygpfWlmKGluc3QuaW5wdXRbMF0udHlwZSE9ImhpZGRlbiIpe2luc3QuaW5wdXRbMF0uZm9jdXMoKX0kLmRhdGVwaWNrZXIuX2N1ckluc3Q9aW5zdH19LF91cGRhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGluc3Qpe3ZhciBkaW1zPXt3aWR0aDppbnN0LmRwRGl2LndpZHRoKCkrNCxoZWlnaHQ6aW5zdC5kcERpdi5oZWlnaHQoKSs0fTt2YXIgc2VsZj10aGlzO2luc3QuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGluc3QpKS5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpLmNzcyh7d2lkdGg6ZGltcy53aWR0aCxoZWlnaHQ6ZGltcy5oZWlnaHR9KS5lbmQoKS5maW5kKCJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiKS5iaW5kKCJtb3VzZW91dCIsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpO2lmKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItcHJldiIpIT0tMSl7JCh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIil9aWYodGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikhPS0xKXskKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX19KS5iaW5kKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7aWYoIXNlbGYuX2lzRGlzYWJsZWREYXRlcGlja2VyKGluc3QuaW5saW5lP2luc3QuZHBEaXYucGFyZW50KClbMF06aW5zdC5pbnB1dFswXSkpeyQodGhpcykucGFyZW50cygiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKS5maW5kKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIik7JCh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKTtpZih0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSE9LTEpeyQodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpfWlmKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItbmV4dCIpIT0tMSl7JCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9fX0pLmVuZCgpLmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKS50cmlnZ2VyKCJtb3VzZW92ZXIiKS5lbmQoKTt2YXIgbnVtTW9udGhzPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGluc3QpO3ZhciBjb2xzPW51bU1vbnRoc1sxXTt2YXIgd2lkdGg9MTc7aWYoY29scz4xKXtpbnN0LmRwRGl2LmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLSIrY29scykuY3NzKCJ3aWR0aCIsKHdpZHRoKmNvbHMpKyJlbSIpfWVsc2V7aW5zdC5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgiIil9aW5zdC5kcERpdlsobnVtTW9udGhzWzBdIT0xfHxudW1Nb250aHNbMV0hPTE/ImFkZCI6InJlbW92ZSIpKyJDbGFzcyJdKCJ1aS1kYXRlcGlja2VyLW11bHRpIik7aW5zdC5kcERpdlsodGhpcy5fZ2V0KGluc3QsImlzUlRMIik/ImFkZCI6InJlbW92ZSIpKyJDbGFzcyJdKCJ1aS1kYXRlcGlja2VyLXJ0bCIpO2lmKGluc3QuaW5wdXQmJmluc3QuaW5wdXRbMF0udHlwZSE9ImhpZGRlbiImJmluc3Q9PSQuZGF0ZXBpY2tlci5fY3VySW5zdCl7JChpbnN0LmlucHV0WzBdKS5mb2N1cygpfX0sX2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGluc3Qsb2Zmc2V0LGlzRml4ZWQpe3ZhciBkcFdpZHRoPWluc3QuZHBEaXYub3V0ZXJXaWR0aCgpO3ZhciBkcEhlaWdodD1pbnN0LmRwRGl2Lm91dGVySGVpZ2h0KCk7dmFyIGlucHV0V2lkdGg9aW5zdC5pbnB1dD9pbnN0LmlucHV0Lm91dGVyV2lkdGgoKTowO3ZhciBpbnB1dEhlaWdodD1pbnN0LmlucHV0P2luc3QuaW5wdXQub3V0ZXJIZWlnaHQoKTowO3ZhciB2aWV3V2lkdGg9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpKyQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTt2YXIgdmlld0hlaWdodD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkrJChkb2N1bWVudCkuc2Nyb2xsVG9wKCk7b2Zmc2V0LmxlZnQtPSh0aGlzLl9nZXQoaW5zdCwiaXNSVEwiKT8oZHBXaWR0aC1pbnB1dFdpZHRoKTowKTtvZmZzZXQubGVmdC09KGlzRml4ZWQmJm9mZnNldC5sZWZ0PT1pbnN0LmlucHV0Lm9mZnNldCgpLmxlZnQpPyQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTowO29mZnNldC50b3AtPShpc0ZpeGVkJiZvZmZzZXQudG9wPT0oaW5zdC5pbnB1dC5vZmZzZXQoKS50b3AraW5wdXRIZWlnaHQpKT8kKGRvY3VtZW50KS5zY3JvbGxUb3AoKTowO29mZnNldC5sZWZ0LT0ob2Zmc2V0LmxlZnQrZHBXaWR0aD52aWV3V2lkdGgmJnZpZXdXaWR0aD5kcFdpZHRoKT9NYXRoLmFicyhvZmZzZXQubGVmdCtkcFdpZHRoLXZpZXdXaWR0aCk6MDtvZmZzZXQudG9wLT0ob2Zmc2V0LnRvcCtkcEhlaWdodD52aWV3SGVpZ2h0JiZ2aWV3SGVpZ2h0PmRwSGVpZ2h0KT9NYXRoLmFicyhvZmZzZXQudG9wK2RwSGVpZ2h0K2lucHV0SGVpZ2h0KjItdmlld0hlaWdodCk6MDtyZXR1cm4gb2Zmc2V0fSxfZmluZFBvczpmdW5jdGlvbihvYmope3doaWxlKG9iaiYmKG9iai50eXBlPT0iaGlkZGVuInx8b2JqLm5vZGVUeXBlIT0xKSl7b2JqPW9iai5uZXh0U2libGluZ312YXIgcG9zaXRpb249JChvYmopLm9mZnNldCgpO3JldHVybltwb3NpdGlvbi5sZWZ0LHBvc2l0aW9uLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbihpbnB1dCxkdXJhdGlvbil7dmFyIGluc3Q9dGhpcy5fY3VySW5zdDtpZighaW5zdHx8KGlucHV0JiZpbnN0IT0kLmRhdGEoaW5wdXQsUFJPUF9OQU1FKSkpe3JldHVybn1pZihpbnN0LnN0YXlPcGVuKXt0aGlzLl9zZWxlY3REYXRlKCIjIitpbnN0LmlkLHRoaXMuX2Zvcm1hdERhdGUoaW5zdCxpbnN0LmN1cnJlbnREYXksaW5zdC5jdXJyZW50TW9udGgsaW5zdC5jdXJyZW50WWVhcikpfWluc3Quc3RheU9wZW49ZmFsc2U7aWYodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpe2R1cmF0aW9uPShkdXJhdGlvbiE9bnVsbD9kdXJhdGlvbjp0aGlzLl9nZXQoaW5zdCwiZHVyYXRpb24iKSk7dmFyIHNob3dBbmltPXRoaXMuX2dldChpbnN0LCJzaG93QW5pbSIpO3ZhciBwb3N0UHJvY2Vzcz1mdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhpbnN0KX07aWYoZHVyYXRpb24hPSIiJiYkLmVmZmVjdHMmJiQuZWZmZWN0c1tzaG93QW5pbV0pe2luc3QuZHBEaXYuaGlkZShzaG93QW5pbSwkLmRhdGVwaWNrZXIuX2dldChpbnN0LCJzaG93T3B0aW9ucyIpLGR1cmF0aW9uLHBvc3RQcm9jZXNzKX1lbHNle2luc3QuZHBEaXZbKGR1cmF0aW9uPT0iIj8iaGlkZSI6KHNob3dBbmltPT0ic2xpZGVEb3duIj8ic2xpZGVVcCI6KHNob3dBbmltPT0iZmFkZUluIj8iZmFkZU91dCI6ImhpZGUiKSkpXShkdXJhdGlvbixwb3N0UHJvY2Vzcyl9aWYoZHVyYXRpb249PSIiKXt0aGlzLl90aWR5RGlhbG9nKGluc3QpfXZhciBvbkNsb3NlPXRoaXMuX2dldChpbnN0LCJvbkNsb3NlIik7aWYob25DbG9zZSl7b25DbG9zZS5hcHBseSgoaW5zdC5pbnB1dD9pbnN0LmlucHV0WzBdOm51bGwpLFsoaW5zdC5pbnB1dD9pbnN0LmlucHV0LnZhbCgpOiIiKSxpbnN0XSl9dGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ZmFsc2U7dGhpcy5fbGFzdElucHV0PW51bGw7aWYodGhpcy5faW5EaWFsb2cpe3RoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KTtpZigkLmJsb2NrVUkpeyQudW5ibG9ja1VJKCk7JCgiYm9keSIpLmFwcGVuZCh0aGlzLmRwRGl2KX19dGhpcy5faW5EaWFsb2c9ZmFsc2V9dGhpcy5fY3VySW5zdD1udWxsfSxfdGlkeURpYWxvZzpmdW5jdGlvbihpbnN0KXtpbnN0LmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24oZXZlbnQpe2lmKCEkLmRhdGVwaWNrZXIuX2N1ckluc3Qpe3JldHVybn12YXIgJHRhcmdldD0kKGV2ZW50LnRhcmdldCk7aWYoKCR0YXJnZXQucGFyZW50cygiIyIrJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aD09MCkmJiEkdGFyZ2V0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhJHRhcmdldC5oYXNDbGFzcygkLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiEoJC5kYXRlcGlja2VyLl9pbkRpYWxvZyYmJC5ibG9ja1VJKSl7JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcihudWxsLCIiKX19LF9hZGp1c3REYXRlOmZ1bmN0aW9uKGlkLG9mZnNldCxwZXJpb2Qpe3ZhciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO2lmKHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpe3JldHVybn10aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0LG9mZnNldCsocGVyaW9kPT0iTSI/dGhpcy5fZ2V0KGluc3QsInNob3dDdXJyZW50QXRQb3MiKTowKSxwZXJpb2QpO3RoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24oaWQpe3ZhciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO2lmKHRoaXMuX2dldChpbnN0LCJnb3RvQ3VycmVudCIpJiZpbnN0LmN1cnJlbnREYXkpe2luc3Quc2VsZWN0ZWREYXk9aW5zdC5jdXJyZW50RGF5O2luc3QuZHJhd01vbnRoPWluc3Quc2VsZWN0ZWRNb250aD1pbnN0LmN1cnJlbnRNb250aDtpbnN0LmRyYXdZZWFyPWluc3Quc2VsZWN0ZWRZZWFyPWluc3QuY3VycmVudFllYXJ9ZWxzZXt2YXIgZGF0ZT1uZXcgRGF0ZSgpO2luc3Quc2VsZWN0ZWREYXk9ZGF0ZS5nZXREYXRlKCk7aW5zdC5kcmF3TW9udGg9aW5zdC5zZWxlY3RlZE1vbnRoPWRhdGUuZ2V0TW9udGgoKTtpbnN0LmRyYXdZZWFyPWluc3Quc2VsZWN0ZWRZZWFyPWRhdGUuZ2V0RnVsbFllYXIoKX10aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7dGhpcy5fYWRqdXN0RGF0ZSh0YXJnZXQpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKGlkLHNlbGVjdCxwZXJpb2Qpe3ZhciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO2luc3QuX3NlbGVjdGluZ01vbnRoWWVhcj1mYWxzZTtpbnN0WyJzZWxlY3RlZCIrKHBlcmlvZD09Ik0iPyJNb250aCI6IlllYXIiKV09aW5zdFsiZHJhdyIrKHBlcmlvZD09Ik0iPyJNb250aCI6IlllYXIiKV09cGFyc2VJbnQoc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKTt0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7dGhpcy5fYWRqdXN0RGF0ZSh0YXJnZXQpfSxfY2xpY2tNb250aFllYXI6ZnVuY3Rpb24oaWQpe3ZhciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO2lmKGluc3QuaW5wdXQmJmluc3QuX3NlbGVjdGluZ01vbnRoWWVhciYmISQuYnJvd3Nlci5tc2llKXtpbnN0LmlucHV0WzBdLmZvY3VzKCl9aW5zdC5fc2VsZWN0aW5nTW9udGhZZWFyPSFpbnN0Ll9zZWxlY3RpbmdNb250aFllYXJ9LF9zZWxlY3REYXk6ZnVuY3Rpb24oaWQsbW9udGgseWVhcix0ZCl7dmFyIHRhcmdldD0kKGlkKTtpZigkKHRkKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpe3JldHVybn12YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7aW5zdC5zZWxlY3RlZERheT1pbnN0LmN1cnJlbnREYXk9JCgiYSIsdGQpLmh0bWwoKTtpbnN0LnNlbGVjdGVkTW9udGg9aW5zdC5jdXJyZW50TW9udGg9bW9udGg7aW5zdC5zZWxlY3RlZFllYXI9aW5zdC5jdXJyZW50WWVhcj15ZWFyO2lmKGluc3Quc3RheU9wZW4pe2luc3QuZW5kRGF5PWluc3QuZW5kTW9udGg9aW5zdC5lbmRZZWFyPW51bGx9dGhpcy5fc2VsZWN0RGF0ZShpZCx0aGlzLl9mb3JtYXREYXRlKGluc3QsaW5zdC5jdXJyZW50RGF5LGluc3QuY3VycmVudE1vbnRoLGluc3QuY3VycmVudFllYXIpKTtpZihpbnN0LnN0YXlPcGVuKXtpbnN0LnJhbmdlU3RhcnQ9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaW5zdC5jdXJyZW50WWVhcixpbnN0LmN1cnJlbnRNb250aCxpbnN0LmN1cnJlbnREYXkpKTt0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpfX0sX2NsZWFyRGF0ZTpmdW5jdGlvbihpZCl7dmFyIHRhcmdldD0kKGlkKTt2YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7aW5zdC5zdGF5T3Blbj1mYWxzZTtpbnN0LmVuZERheT1pbnN0LmVuZE1vbnRoPWluc3QuZW5kWWVhcj1pbnN0LnJhbmdlU3RhcnQ9bnVsbDt0aGlzLl9zZWxlY3REYXRlKHRhcmdldCwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKGlkLGRhdGVTdHIpe3ZhciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO2RhdGVTdHI9KGRhdGVTdHIhPW51bGw/ZGF0ZVN0cjp0aGlzLl9mb3JtYXREYXRlKGluc3QpKTtpZihpbnN0LmlucHV0KXtpbnN0LmlucHV0LnZhbChkYXRlU3RyKX10aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7dmFyIG9uU2VsZWN0PXRoaXMuX2dldChpbnN0LCJvblNlbGVjdCIpO2lmKG9uU2VsZWN0KXtvblNlbGVjdC5hcHBseSgoaW5zdC5pbnB1dD9pbnN0LmlucHV0WzBdOm51bGwpLFtkYXRlU3RyLGluc3RdKX1lbHNle2lmKGluc3QuaW5wdXQpe2luc3QuaW5wdXQudHJpZ2dlcigiY2hhbmdlIil9fWlmKGluc3QuaW5saW5lKXt0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpfWVsc2V7aWYoIWluc3Quc3RheU9wZW4pe3RoaXMuX2hpZGVEYXRlcGlja2VyKG51bGwsdGhpcy5fZ2V0KGluc3QsImR1cmF0aW9uIikpO3RoaXMuX2xhc3RJbnB1dD1pbnN0LmlucHV0WzBdO2lmKHR5cGVvZihpbnN0LmlucHV0WzBdKSE9Im9iamVjdCIpe2luc3QuaW5wdXRbMF0uZm9jdXMoKX10aGlzLl9sYXN0SW5wdXQ9bnVsbH19fSxfdXBkYXRlQWx0ZXJuYXRlOmZ1bmN0aW9uKGluc3Qpe3ZhciBhbHRGaWVsZD10aGlzLl9nZXQoaW5zdCwiYWx0RmllbGQiKTtpZihhbHRGaWVsZCl7dmFyIGFsdEZvcm1hdD10aGlzLl9nZXQoaW5zdCwiYWx0Rm9ybWF0Iil8fHRoaXMuX2dldChpbnN0LCJkYXRlRm9ybWF0Iik7dmFyIGRhdGU9dGhpcy5fZ2V0RGF0ZShpbnN0KTtkYXRlU3RyPXRoaXMuZm9ybWF0RGF0ZShhbHRGb3JtYXQsZGF0ZSx0aGlzLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOyQoYWx0RmllbGQpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbChkYXRlU3RyKX0pfX0sbm9XZWVrZW5kczpmdW5jdGlvbihkYXRlKXt2YXIgZGF5PWRhdGUuZ2V0RGF5KCk7cmV0dXJuWyhkYXk+MCYmZGF5PDYpLCIiXX0saXNvODYwMVdlZWs6ZnVuY3Rpb24oZGF0ZSl7dmFyIGNoZWNrRGF0ZT1uZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRNb250aCgpLGRhdGUuZ2V0RGF0ZSgpKTt2YXIgZmlyc3RNb249bmV3IERhdGUoY2hlY2tEYXRlLmdldEZ1bGxZZWFyKCksMS0xLDQpO3ZhciBmaXJzdERheT1maXJzdE1vbi5nZXREYXkoKXx8NztmaXJzdE1vbi5zZXREYXRlKGZpcnN0TW9uLmdldERhdGUoKSsxLWZpcnN0RGF5KTtpZihmaXJzdERheTw0JiZjaGVja0RhdGU8Zmlyc3RNb24pe2NoZWNrRGF0ZS5zZXREYXRlKGNoZWNrRGF0ZS5nZXREYXRlKCktMyk7cmV0dXJuICQuZGF0ZXBpY2tlci5pc284NjAxV2VlayhjaGVja0RhdGUpfWVsc2V7aWYoY2hlY2tEYXRlPm5ldyBEYXRlKGNoZWNrRGF0ZS5nZXRGdWxsWWVhcigpLDEyLTEsMjgpKXtmaXJzdERheT1uZXcgRGF0ZShjaGVja0RhdGUuZ2V0RnVsbFllYXIoKSsxLDEtMSw0KS5nZXREYXkoKXx8NztpZihmaXJzdERheT40JiYoY2hlY2tEYXRlLmdldERheSgpfHw3KTxmaXJzdERheS0zKXtyZXR1cm4gMX19fXJldHVybiBNYXRoLmZsb29yKCgoY2hlY2tEYXRlLWZpcnN0TW9uKS84NjQwMDAwMCkvNykrMX0scGFyc2VEYXRlOmZ1bmN0aW9uKGZvcm1hdCx2YWx1ZSxzZXR0aW5ncyl7aWYoZm9ybWF0PT1udWxsfHx2YWx1ZT09bnVsbCl7dGhyb3ciSW52YWxpZCBhcmd1bWVudHMifXZhbHVlPSh0eXBlb2YgdmFsdWU9PSJvYmplY3QiP3ZhbHVlLnRvU3RyaW5nKCk6dmFsdWUrIiIpO2lmKHZhbHVlPT0iIil7cmV0dXJuIG51bGx9dmFyIHNob3J0WWVhckN1dG9mZj0oc2V0dGluZ3M/c2V0dGluZ3Muc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7dmFyIGRheU5hbWVzU2hvcnQ9KHNldHRpbmdzP3NldHRpbmdzLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQ7dmFyIGRheU5hbWVzPShzZXR0aW5ncz9zZXR0aW5ncy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXM7dmFyIG1vbnRoTmFtZXNTaG9ydD0oc2V0dGluZ3M/c2V0dGluZ3MubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQ7dmFyIG1vbnRoTmFtZXM9KHNldHRpbmdzP3NldHRpbmdzLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXM7dmFyIHllYXI9LTE7dmFyIG1vbnRoPS0xO3ZhciBkYXk9LTE7dmFyIGRveT0tMTt2YXIgbGl0ZXJhbD1mYWxzZTt2YXIgbG9va0FoZWFkPWZ1bmN0aW9uKG1hdGNoKXt2YXIgbWF0Y2hlcz0oaUZvcm1hdCsxPGZvcm1hdC5sZW5ndGgmJmZvcm1hdC5jaGFyQXQoaUZvcm1hdCsxKT09bWF0Y2gpO2lmKG1hdGNoZXMpe2lGb3JtYXQrK31yZXR1cm4gbWF0Y2hlc307dmFyIGdldE51bWJlcj1mdW5jdGlvbihtYXRjaCl7bG9va0FoZWFkKG1hdGNoKTt2YXIgb3JpZ1NpemU9KG1hdGNoPT0iQCI/MTQ6KG1hdGNoPT0ieSI/NDoobWF0Y2g9PSJvIj8zOjIpKSk7dmFyIHNpemU9b3JpZ1NpemU7dmFyIG51bT0wO3doaWxlKHNpemU+MCYmaVZhbHVlPHZhbHVlLmxlbmd0aCYmdmFsdWUuY2hhckF0KGlWYWx1ZSk+PSIwIiYmdmFsdWUuY2hhckF0KGlWYWx1ZSk8PSI5Iil7bnVtPW51bSoxMCtwYXJzZUludCh2YWx1ZS5jaGFyQXQoaVZhbHVlKyspLDEwKTtzaXplLS19aWYoc2l6ZT09b3JpZ1NpemUpe3Rocm93Ik1pc3NpbmcgbnVtYmVyIGF0IHBvc2l0aW9uICIraVZhbHVlfXJldHVybiBudW19O3ZhciBnZXROYW1lPWZ1bmN0aW9uKG1hdGNoLHNob3J0TmFtZXMsbG9uZ05hbWVzKXt2YXIgbmFtZXM9KGxvb2tBaGVhZChtYXRjaCk/bG9uZ05hbWVzOnNob3J0TmFtZXMpO3ZhciBzaXplPTA7Zm9yKHZhciBqPTA7ajxuYW1lcy5sZW5ndGg7aisrKXtzaXplPU1hdGgubWF4KHNpemUsbmFtZXNbal0ubGVuZ3RoKX12YXIgbmFtZT0iIjt2YXIgaUluaXQ9aVZhbHVlO3doaWxlKHNpemU+MCYmaVZhbHVlPHZhbHVlLmxlbmd0aCl7bmFtZSs9dmFsdWUuY2hhckF0KGlWYWx1ZSsrKTtmb3IodmFyIGk9MDtpPG5hbWVzLmxlbmd0aDtpKyspe2lmKG5hbWU9PW5hbWVzW2ldKXtyZXR1cm4gaSsxfX1zaXplLS19dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIraUluaXR9O3ZhciBjaGVja0xpdGVyYWw9ZnVuY3Rpb24oKXtpZih2YWx1ZS5jaGFyQXQoaVZhbHVlKSE9Zm9ybWF0LmNoYXJBdChpRm9ybWF0KSl7dGhyb3ciVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICIraVZhbHVlfWlWYWx1ZSsrfTt2YXIgaVZhbHVlPTA7Zm9yKHZhciBpRm9ybWF0PTA7aUZvcm1hdDxmb3JtYXQubGVuZ3RoO2lGb3JtYXQrKyl7aWYobGl0ZXJhbCl7aWYoZm9ybWF0LmNoYXJBdChpRm9ybWF0KT09IiciJiYhbG9va0FoZWFkKCInIikpe2xpdGVyYWw9ZmFsc2V9ZWxzZXtjaGVja0xpdGVyYWwoKX19ZWxzZXtzd2l0Y2goZm9ybWF0LmNoYXJBdChpRm9ybWF0KSl7Y2FzZSJkIjpkYXk9Z2V0TnVtYmVyKCJkIik7YnJlYWs7Y2FzZSJEIjpnZXROYW1lKCJEIixkYXlOYW1lc1Nob3J0LGRheU5hbWVzKTticmVhaztjYXNlIm8iOmRveT1nZXROdW1iZXIoIm8iKTticmVhaztjYXNlIm0iOm1vbnRoPWdldE51bWJlcigibSIpO2JyZWFrO2Nhc2UiTSI6bW9udGg9Z2V0TmFtZSgiTSIsbW9udGhOYW1lc1Nob3J0LG1vbnRoTmFtZXMpO2JyZWFrO2Nhc2UieSI6eWVhcj1nZXROdW1iZXIoInkiKTticmVhaztjYXNlIkAiOnZhciBkYXRlPW5ldyBEYXRlKGdldE51bWJlcigiQCIpKTt5ZWFyPWRhdGUuZ2V0RnVsbFllYXIoKTttb250aD1kYXRlLmdldE1vbnRoKCkrMTtkYXk9ZGF0ZS5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjppZihsb29rQWhlYWQoIiciKSl7Y2hlY2tMaXRlcmFsKCl9ZWxzZXtsaXRlcmFsPXRydWV9YnJlYWs7ZGVmYXVsdDpjaGVja0xpdGVyYWwoKX19fWlmKHllYXI9PS0xKXt5ZWFyPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKX1lbHNle2lmKHllYXI8MTAwKXt5ZWFyKz1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCktbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpJTEwMCsoeWVhcjw9c2hvcnRZZWFyQ3V0b2ZmPzA6LTEwMCl9fWlmKGRveT4tMSl7bW9udGg9MTtkYXk9ZG95O2Rve3ZhciBkaW09dGhpcy5fZ2V0RGF5c0luTW9udGgoeWVhcixtb250aC0xKTtpZihkYXk8PWRpbSl7YnJlYWt9bW9udGgrKztkYXktPWRpbX13aGlsZSh0cnVlKX12YXIgZGF0ZT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLG1vbnRoLTEsZGF5KSk7aWYoZGF0ZS5nZXRGdWxsWWVhcigpIT15ZWFyfHxkYXRlLmdldE1vbnRoKCkrMSE9bW9udGh8fGRhdGUuZ2V0RGF0ZSgpIT1kYXkpe3Rocm93IkludmFsaWQgZGF0ZSJ9cmV0dXJuIGRhdGV9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElNRVNUQU1QOiJAIixXM0M6Inl5LW1tLWRkIixmb3JtYXREYXRlOmZ1bmN0aW9uKGZvcm1hdCxkYXRlLHNldHRpbmdzKXtpZighZGF0ZSl7cmV0dXJuIiJ9dmFyIGRheU5hbWVzU2hvcnQ9KHNldHRpbmdzP3NldHRpbmdzLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQ7dmFyIGRheU5hbWVzPShzZXR0aW5ncz9zZXR0aW5ncy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXM7dmFyIG1vbnRoTmFtZXNTaG9ydD0oc2V0dGluZ3M/c2V0dGluZ3MubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQ7dmFyIG1vbnRoTmFtZXM9KHNldHRpbmdzP3NldHRpbmdzLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXM7dmFyIGxvb2tBaGVhZD1mdW5jdGlvbihtYXRjaCl7dmFyIG1hdGNoZXM9KGlGb3JtYXQrMTxmb3JtYXQubGVuZ3RoJiZmb3JtYXQuY2hhckF0KGlGb3JtYXQrMSk9PW1hdGNoKTtpZihtYXRjaGVzKXtpRm9ybWF0Kyt9cmV0dXJuIG1hdGNoZXN9O3ZhciBmb3JtYXROdW1iZXI9ZnVuY3Rpb24obWF0Y2gsdmFsdWUsbGVuKXt2YXIgbnVtPSIiK3ZhbHVlO2lmKGxvb2tBaGVhZChtYXRjaCkpe3doaWxlKG51bS5sZW5ndGg8bGVuKXtudW09IjAiK251bX19cmV0dXJuIG51bX07dmFyIGZvcm1hdE5hbWU9ZnVuY3Rpb24obWF0Y2gsdmFsdWUsc2hvcnROYW1lcyxsb25nTmFtZXMpe3JldHVybihsb29rQWhlYWQobWF0Y2gpP2xvbmdOYW1lc1t2YWx1ZV06c2hvcnROYW1lc1t2YWx1ZV0pfTt2YXIgb3V0cHV0PSIiO3ZhciBsaXRlcmFsPWZhbHNlO2lmKGRhdGUpe2Zvcih2YXIgaUZvcm1hdD0wO2lGb3JtYXQ8Zm9ybWF0Lmxlbmd0aDtpRm9ybWF0Kyspe2lmKGxpdGVyYWwpe2lmKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk9PSInIiYmIWxvb2tBaGVhZCgiJyIpKXtsaXRlcmFsPWZhbHNlfWVsc2V7b3V0cHV0Kz1mb3JtYXQuY2hhckF0KGlGb3JtYXQpfX1lbHNle3N3aXRjaChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKXtjYXNlImQiOm91dHB1dCs9Zm9ybWF0TnVtYmVyKCJkIixkYXRlLmdldERhdGUoKSwyKTticmVhaztjYXNlIkQiOm91dHB1dCs9Zm9ybWF0TmFtZSgiRCIsZGF0ZS5nZXREYXkoKSxkYXlOYW1lc1Nob3J0LGRheU5hbWVzKTticmVhaztjYXNlIm8iOnZhciBkb3k9ZGF0ZS5nZXREYXRlKCk7Zm9yKHZhciBtPWRhdGUuZ2V0TW9udGgoKS0xO20+PTA7bS0tKXtkb3krPXRoaXMuX2dldERheXNJbk1vbnRoKGRhdGUuZ2V0RnVsbFllYXIoKSxtKX1vdXRwdXQrPWZvcm1hdE51bWJlcigibyIsZG95LDMpO2JyZWFrO2Nhc2UibSI6b3V0cHV0Kz1mb3JtYXROdW1iZXIoIm0iLGRhdGUuZ2V0TW9udGgoKSsxLDIpO2JyZWFrO2Nhc2UiTSI6b3V0cHV0Kz1mb3JtYXROYW1lKCJNIixkYXRlLmdldE1vbnRoKCksbW9udGhOYW1lc1Nob3J0LG1vbnRoTmFtZXMpO2JyZWFrO2Nhc2UieSI6b3V0cHV0Kz0obG9va0FoZWFkKCJ5Iik/ZGF0ZS5nZXRGdWxsWWVhcigpOihkYXRlLmdldFllYXIoKSUxMDA8MTA/IjAiOiIiKStkYXRlLmdldFllYXIoKSUxMDApO2JyZWFrO2Nhc2UiQCI6b3V0cHV0Kz1kYXRlLmdldFRpbWUoKTticmVhaztjYXNlIiciOmlmKGxvb2tBaGVhZCgiJyIpKXtvdXRwdXQrPSInIn1lbHNle2xpdGVyYWw9dHJ1ZX1icmVhaztkZWZhdWx0Om91dHB1dCs9Zm9ybWF0LmNoYXJBdChpRm9ybWF0KX19fX1yZXR1cm4gb3V0cHV0fSxfcG9zc2libGVDaGFyczpmdW5jdGlvbihmb3JtYXQpe3ZhciBjaGFycz0iIjt2YXIgbGl0ZXJhbD1mYWxzZTtmb3IodmFyIGlGb3JtYXQ9MDtpRm9ybWF0PGZvcm1hdC5sZW5ndGg7aUZvcm1hdCsrKXtpZihsaXRlcmFsKXtpZihmb3JtYXQuY2hhckF0KGlGb3JtYXQpPT0iJyImJiFsb29rQWhlYWQoIiciKSl7bGl0ZXJhbD1mYWxzZX1lbHNle2NoYXJzKz1mb3JtYXQuY2hhckF0KGlGb3JtYXQpfX1lbHNle3N3aXRjaChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmNoYXJzKz0iMDEyMzQ1Njc4OSI7YnJlYWs7Y2FzZSJEIjpjYXNlIk0iOnJldHVybiBudWxsO2Nhc2UiJyI6aWYobG9va0FoZWFkKCInIikpe2NoYXJzKz0iJyJ9ZWxzZXtsaXRlcmFsPXRydWV9YnJlYWs7ZGVmYXVsdDpjaGFycys9Zm9ybWF0LmNoYXJBdChpRm9ybWF0KX19fXJldHVybiBjaGFyc30sX2dldDpmdW5jdGlvbihpbnN0LG5hbWUpe3JldHVybiBpbnN0LnNldHRpbmdzW25hbWVdIT09dW5kZWZpbmVkP2luc3Quc2V0dGluZ3NbbmFtZV06dGhpcy5fZGVmYXVsdHNbbmFtZV19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGluc3Qpe3ZhciBkYXRlRm9ybWF0PXRoaXMuX2dldChpbnN0LCJkYXRlRm9ybWF0Iik7dmFyIGRhdGVzPWluc3QuaW5wdXQ/aW5zdC5pbnB1dC52YWwoKTpudWxsO2luc3QuZW5kRGF5PWluc3QuZW5kTW9udGg9aW5zdC5lbmRZZWFyPW51bGw7dmFyIGRhdGU9ZGVmYXVsdERhdGU9dGhpcy5fZ2V0RGVmYXVsdERhdGUoaW5zdCk7dmFyIHNldHRpbmdzPXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KTt0cnl7ZGF0ZT10aGlzLnBhcnNlRGF0ZShkYXRlRm9ybWF0LGRhdGVzLHNldHRpbmdzKXx8ZGVmYXVsdERhdGV9Y2F0Y2goZXZlbnQpe3RoaXMubG9nKGV2ZW50KTtkYXRlPWRlZmF1bHREYXRlfWluc3Quc2VsZWN0ZWREYXk9ZGF0ZS5nZXREYXRlKCk7aW5zdC5kcmF3TW9udGg9aW5zdC5zZWxlY3RlZE1vbnRoPWRhdGUuZ2V0TW9udGgoKTtpbnN0LmRyYXdZZWFyPWluc3Quc2VsZWN0ZWRZZWFyPWRhdGUuZ2V0RnVsbFllYXIoKTtpbnN0LmN1cnJlbnREYXk9KGRhdGVzP2RhdGUuZ2V0RGF0ZSgpOjApO2luc3QuY3VycmVudE1vbnRoPShkYXRlcz9kYXRlLmdldE1vbnRoKCk6MCk7aW5zdC5jdXJyZW50WWVhcj0oZGF0ZXM/ZGF0ZS5nZXRGdWxsWWVhcigpOjApO3RoaXMuX2FkanVzdEluc3REYXRlKGluc3QpfSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oaW5zdCl7dmFyIGRhdGU9dGhpcy5fZGV0ZXJtaW5lRGF0ZSh0aGlzLl9nZXQoaW5zdCwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSgpKTt2YXIgbWluRGF0ZT10aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsIm1pbiIsdHJ1ZSk7dmFyIG1heERhdGU9dGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCJtYXgiKTtkYXRlPShtaW5EYXRlJiZkYXRlPG1pbkRhdGU/bWluRGF0ZTpkYXRlKTtkYXRlPShtYXhEYXRlJiZkYXRlPm1heERhdGU/bWF4RGF0ZTpkYXRlKTtyZXR1cm4gZGF0ZX0sX2RldGVybWluZURhdGU6ZnVuY3Rpb24oZGF0ZSxkZWZhdWx0RGF0ZSl7dmFyIG9mZnNldE51bWVyaWM9ZnVuY3Rpb24ob2Zmc2V0KXt2YXIgZGF0ZT1uZXcgRGF0ZSgpO2RhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKStvZmZzZXQpO3JldHVybiBkYXRlfTt2YXIgb2Zmc2V0U3RyaW5nPWZ1bmN0aW9uKG9mZnNldCxnZXREYXlzSW5Nb250aCl7dmFyIGRhdGU9bmV3IERhdGUoKTt2YXIgeWVhcj1kYXRlLmdldEZ1bGxZZWFyKCk7dmFyIG1vbnRoPWRhdGUuZ2V0TW9udGgoKTt2YXIgZGF5PWRhdGUuZ2V0RGF0ZSgpO3ZhciBwYXR0ZXJuPS8oWystXT9bMC05XSspXHMqKGR8RHx3fFd8bXxNfHl8WSk/L2c7dmFyIG1hdGNoZXM9cGF0dGVybi5leGVjKG9mZnNldCk7d2hpbGUobWF0Y2hlcyl7c3dpdGNoKG1hdGNoZXNbMl18fCJkIil7Y2FzZSJkIjpjYXNlIkQiOmRheSs9cGFyc2VJbnQobWF0Y2hlc1sxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOmRheSs9cGFyc2VJbnQobWF0Y2hlc1sxXSwxMCkqNzticmVhaztjYXNlIm0iOmNhc2UiTSI6bW9udGgrPXBhcnNlSW50KG1hdGNoZXNbMV0sMTApO2RheT1NYXRoLm1pbihkYXksZ2V0RGF5c0luTW9udGgoeWVhcixtb250aCkpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjp5ZWFyKz1wYXJzZUludChtYXRjaGVzWzFdLDEwKTtkYXk9TWF0aC5taW4oZGF5LGdldERheXNJbk1vbnRoKHllYXIsbW9udGgpKTticmVha31tYXRjaGVzPXBhdHRlcm4uZXhlYyhvZmZzZXQpfXJldHVybiBuZXcgRGF0ZSh5ZWFyLG1vbnRoLGRheSl9O2RhdGU9KGRhdGU9PW51bGw/ZGVmYXVsdERhdGU6KHR5cGVvZiBkYXRlPT0ic3RyaW5nIj9vZmZzZXRTdHJpbmcoZGF0ZSx0aGlzLl9nZXREYXlzSW5Nb250aCk6KHR5cGVvZiBkYXRlPT0ibnVtYmVyIj8oaXNOYU4oZGF0ZSk/ZGVmYXVsdERhdGU6b2Zmc2V0TnVtZXJpYyhkYXRlKSk6ZGF0ZSkpKTtkYXRlPShkYXRlJiZkYXRlLnRvU3RyaW5nKCk9PSJJbnZhbGlkIERhdGUiP2RlZmF1bHREYXRlOmRhdGUpO2lmKGRhdGUpe2RhdGUuc2V0SG91cnMoMCk7ZGF0ZS5zZXRNaW51dGVzKDApO2RhdGUuc2V0U2Vjb25kcygwKTtkYXRlLnNldE1pbGxpc2Vjb25kcygwKX1yZXR1cm4gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoZGF0ZSl9LF9kYXlsaWdodFNhdmluZ0FkanVzdDpmdW5jdGlvbihkYXRlKXtpZighZGF0ZSl7cmV0dXJuIG51bGx9ZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCk+MTI/ZGF0ZS5nZXRIb3VycygpKzI6MCk7cmV0dXJuIGRhdGV9LF9zZXREYXRlOmZ1bmN0aW9uKGluc3QsZGF0ZSxlbmREYXRlKXt2YXIgY2xlYXI9IShkYXRlKTt2YXIgb3JpZ01vbnRoPWluc3Quc2VsZWN0ZWRNb250aDt2YXIgb3JpZ1llYXI9aW5zdC5zZWxlY3RlZFllYXI7ZGF0ZT10aGlzLl9kZXRlcm1pbmVEYXRlKGRhdGUsbmV3IERhdGUoKSk7aW5zdC5zZWxlY3RlZERheT1pbnN0LmN1cnJlbnREYXk9ZGF0ZS5nZXREYXRlKCk7aW5zdC5kcmF3TW9udGg9aW5zdC5zZWxlY3RlZE1vbnRoPWluc3QuY3VycmVudE1vbnRoPWRhdGUuZ2V0TW9udGgoKTtpbnN0LmRyYXdZZWFyPWluc3Quc2VsZWN0ZWRZZWFyPWluc3QuY3VycmVudFllYXI9ZGF0ZS5nZXRGdWxsWWVhcigpO2lmKG9yaWdNb250aCE9aW5zdC5zZWxlY3RlZE1vbnRofHxvcmlnWWVhciE9aW5zdC5zZWxlY3RlZFllYXIpe3RoaXMuX25vdGlmeUNoYW5nZShpbnN0KX10aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0KTtpZihpbnN0LmlucHV0KXtpbnN0LmlucHV0LnZhbChjbGVhcj8iIjp0aGlzLl9mb3JtYXREYXRlKGluc3QpKX19LF9nZXREYXRlOmZ1bmN0aW9uKGluc3Qpe3ZhciBzdGFydERhdGU9KCFpbnN0LmN1cnJlbnRZZWFyfHwoaW5zdC5pbnB1dCYmaW5zdC5pbnB1dC52YWwoKT09IiIpP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaW5zdC5jdXJyZW50WWVhcixpbnN0LmN1cnJlbnRNb250aCxpbnN0LmN1cnJlbnREYXkpKSk7cmV0dXJuIHN0YXJ0RGF0ZX0sX2dlbmVyYXRlSFRNTDpmdW5jdGlvbihpbnN0KXt2YXIgdG9kYXk9bmV3IERhdGUoKTt0b2RheT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLHRvZGF5LmdldE1vbnRoKCksdG9kYXkuZ2V0RGF0ZSgpKSk7dmFyIGlzUlRMPXRoaXMuX2dldChpbnN0LCJpc1JUTCIpO3ZhciBzaG93QnV0dG9uUGFuZWw9dGhpcy5fZ2V0KGluc3QsInNob3dCdXR0b25QYW5lbCIpO3ZhciBoaWRlSWZOb1ByZXZOZXh0PXRoaXMuX2dldChpbnN0LCJoaWRlSWZOb1ByZXZOZXh0Iik7dmFyIG5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ9dGhpcy5fZ2V0KGluc3QsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKTt2YXIgbnVtTW9udGhzPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGluc3QpO3ZhciBzaG93Q3VycmVudEF0UG9zPXRoaXMuX2dldChpbnN0LCJzaG93Q3VycmVudEF0UG9zIik7dmFyIHN0ZXBNb250aHM9dGhpcy5fZ2V0KGluc3QsInN0ZXBNb250aHMiKTt2YXIgc3RlcEJpZ01vbnRocz10aGlzLl9nZXQoaW5zdCwic3RlcEJpZ01vbnRocyIpO3ZhciBpc011bHRpTW9udGg9KG51bU1vbnRoc1swXSE9MXx8bnVtTW9udGhzWzFdIT0xKTt2YXIgY3VycmVudERhdGU9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoKCFpbnN0LmN1cnJlbnREYXk/bmV3IERhdGUoOTk5OSw5LDkpOm5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsaW5zdC5jdXJyZW50TW9udGgsaW5zdC5jdXJyZW50RGF5KSkpO3ZhciBtaW5EYXRlPXRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwibWluIix0cnVlKTt2YXIgbWF4RGF0ZT10aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsIm1heCIpO3ZhciBkcmF3TW9udGg9aW5zdC5kcmF3TW9udGgtc2hvd0N1cnJlbnRBdFBvczt2YXIgZHJhd1llYXI9aW5zdC5kcmF3WWVhcjtpZihkcmF3TW9udGg8MCl7ZHJhd01vbnRoKz0xMjtkcmF3WWVhci0tfWlmKG1heERhdGUpe3ZhciBtYXhEcmF3PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG1heERhdGUuZ2V0RnVsbFllYXIoKSxtYXhEYXRlLmdldE1vbnRoKCktbnVtTW9udGhzWzFdKzEsbWF4RGF0ZS5nZXREYXRlKCkpKTttYXhEcmF3PShtaW5EYXRlJiZtYXhEcmF3PG1pbkRhdGU/bWluRGF0ZTptYXhEcmF3KTt3aGlsZSh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhcixkcmF3TW9udGgsMSkpPm1heERyYXcpe2RyYXdNb250aC0tO2lmKGRyYXdNb250aDwwKXtkcmF3TW9udGg9MTE7ZHJhd1llYXItLX19fWluc3QuZHJhd01vbnRoPWRyYXdNb250aDtpbnN0LmRyYXdZZWFyPWRyYXdZZWFyO3ZhciBwcmV2VGV4dD10aGlzLl9nZXQoaW5zdCwicHJldlRleHQiKTtwcmV2VGV4dD0oIW5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ/cHJldlRleHQ6dGhpcy5mb3JtYXREYXRlKHByZXZUZXh0LHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLGRyYXdNb250aC1zdGVwTW9udGhzLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpKTt2YXIgcHJldj0odGhpcy5fY2FuQWRqdXN0TW9udGgoaW5zdCwtMSxkcmF3WWVhcixkcmF3TW9udGgpPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwiIG9uY2xpY2s9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKFwnIycraW5zdC5pZCsiJywgLSIrc3RlcE1vbnRocysiLCAnTScpO1wiIHRpdGxlPVwiIitwcmV2VGV4dCsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhpc1JUTD8iZSI6InciKSsnIj4nK3ByZXZUZXh0KyI8L3NwYW4+PC9hPiI6KGhpZGVJZk5vUHJldk5leHQ/IiI6JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrcHJldlRleHQrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoaXNSVEw/ImUiOiJ3IikrJyI+JytwcmV2VGV4dCsiPC9zcGFuPjwvYT4iKSk7dmFyIG5leHRUZXh0PXRoaXMuX2dldChpbnN0LCJuZXh0VGV4dCIpO25leHRUZXh0PSghbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdD9uZXh0VGV4dDp0aGlzLmZvcm1hdERhdGUobmV4dFRleHQsdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsZHJhd01vbnRoK3N0ZXBNb250aHMsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpO3ZhciBuZXh0PSh0aGlzLl9jYW5BZGp1c3RNb250aChpbnN0LCsxLGRyYXdZZWFyLGRyYXdNb250aCk/JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCIgb25jbGljaz0iRFBfalF1ZXJ5LmRhdGVwaWNrZXIuX2FkanVzdERhdGUoXCcjJytpbnN0LmlkKyInLCArIitzdGVwTW9udGhzKyIsICdNJyk7XCIgdGl0bGU9XCIiK25leHRUZXh0KyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScrKGlzUlRMPyJ3IjoiZSIpKyciPicrbmV4dFRleHQrIjwvc3Bhbj48L2E+IjooaGlkZUlmTm9QcmV2TmV4dD8iIjonPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkIiB0aXRsZT0iJytuZXh0VGV4dCsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhpc1JUTD8idyI6ImUiKSsnIj4nK25leHRUZXh0KyI8L3NwYW4+PC9hPiIpKTt2YXIgY3VycmVudFRleHQ9dGhpcy5fZ2V0KGluc3QsImN1cnJlbnRUZXh0Iik7dmFyIGdvdG9EYXRlPSh0aGlzLl9nZXQoaW5zdCwiZ290b0N1cnJlbnQiKSYmaW5zdC5jdXJyZW50RGF5P2N1cnJlbnREYXRlOnRvZGF5KTtjdXJyZW50VGV4dD0oIW5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ/Y3VycmVudFRleHQ6dGhpcy5mb3JtYXREYXRlKGN1cnJlbnRUZXh0LGdvdG9EYXRlLHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpO3ZhciBjb250cm9scz0oIWluc3QuaW5saW5lPyc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIG9uY2xpY2s9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOyI+Jyt0aGlzLl9nZXQoaW5zdCwiY2xvc2VUZXh0IikrIjwvYnV0dG9uPiI6IiIpO3ZhciBidXR0b25QYW5lbD0oc2hvd0J1dHRvblBhbmVsKT8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Ij4nKyhpc1JUTD9jb250cm9sczoiIikrKHRoaXMuX2lzSW5SYW5nZShpbnN0LGdvdG9EYXRlKT8nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCIgb25jbGljaz0iRFBfalF1ZXJ5LmRhdGVwaWNrZXIuX2dvdG9Ub2RheShcJyMnK2luc3QuaWQrIicpO1wiPiIrY3VycmVudFRleHQrIjwvYnV0dG9uPiI6IiIpKyhpc1JUTD8iIjpjb250cm9scykrIjwvZGl2PiI6IiI7dmFyIGZpcnN0RGF5PXBhcnNlSW50KHRoaXMuX2dldChpbnN0LCJmaXJzdERheSIpLDEwKTtmaXJzdERheT0oaXNOYU4oZmlyc3REYXkpPzA6Zmlyc3REYXkpO3ZhciBkYXlOYW1lcz10aGlzLl9nZXQoaW5zdCwiZGF5TmFtZXMiKTt2YXIgZGF5TmFtZXNTaG9ydD10aGlzLl9nZXQoaW5zdCwiZGF5TmFtZXNTaG9ydCIpO3ZhciBkYXlOYW1lc01pbj10aGlzLl9nZXQoaW5zdCwiZGF5TmFtZXNNaW4iKTt2YXIgbW9udGhOYW1lcz10aGlzLl9nZXQoaW5zdCwibW9udGhOYW1lcyIpO3ZhciBtb250aE5hbWVzU2hvcnQ9dGhpcy5fZ2V0KGluc3QsIm1vbnRoTmFtZXNTaG9ydCIpO3ZhciBiZWZvcmVTaG93RGF5PXRoaXMuX2dldChpbnN0LCJiZWZvcmVTaG93RGF5Iik7dmFyIHNob3dPdGhlck1vbnRocz10aGlzLl9nZXQoaW5zdCwic2hvd090aGVyTW9udGhzIik7dmFyIGNhbGN1bGF0ZVdlZWs9dGhpcy5fZ2V0KGluc3QsImNhbGN1bGF0ZVdlZWsiKXx8dGhpcy5pc284NjAxV2Vlazt2YXIgZW5kRGF0ZT1pbnN0LmVuZERheT90aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpbnN0LmVuZFllYXIsaW5zdC5lbmRNb250aCxpbnN0LmVuZERheSkpOmN1cnJlbnREYXRlO3ZhciBkZWZhdWx0RGF0ZT10aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KTt2YXIgaHRtbD0iIjtmb3IodmFyIHJvdz0wO3JvdzxudW1Nb250aHNbMF07cm93Kyspe3ZhciBncm91cD0iIjtmb3IodmFyIGNvbD0wO2NvbDxudW1Nb250aHNbMV07Y29sKyspe3ZhciBzZWxlY3RlZERhdGU9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsZHJhd01vbnRoLGluc3Quc2VsZWN0ZWREYXkpKTt2YXIgY29ybmVyQ2xhc3M9IiB1aS1jb3JuZXItYWxsIjt2YXIgY2FsZW5kZXI9IiI7aWYoaXNNdWx0aU1vbnRoKXtjYWxlbmRlcis9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItZ3JvdXAgdWktZGF0ZXBpY2tlci1ncm91cC0nO3N3aXRjaChjb2wpe2Nhc2UgMDpjYWxlbmRlcis9ImZpcnN0Ijtjb3JuZXJDbGFzcz0iIHVpLWNvcm5lci0iKyhpc1JUTD8icmlnaHQiOiJsZWZ0Iik7YnJlYWs7Y2FzZSBudW1Nb250aHNbMV0tMTpjYWxlbmRlcis9Imxhc3QiO2Nvcm5lckNsYXNzPSIgdWktY29ybmVyLSIrKGlzUlRMPyJsZWZ0IjoicmlnaHQiKTticmVhaztkZWZhdWx0OmNhbGVuZGVyKz0ibWlkZGxlIjtjb3JuZXJDbGFzcz0iIjticmVha31jYWxlbmRlcis9JyI+J31jYWxlbmRlcis9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4Jytjb3JuZXJDbGFzcysnIj4nKygvYWxsfGxlZnQvLnRlc3QoY29ybmVyQ2xhc3MpJiZyb3c9PTA/KGlzUlRMP25leHQ6cHJldik6IiIpKygvYWxsfHJpZ2h0Ly50ZXN0KGNvcm5lckNsYXNzKSYmcm93PT0wPyhpc1JUTD9wcmV2Om5leHQpOiIiKSt0aGlzLl9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcihpbnN0LGRyYXdNb250aCxkcmF3WWVhcixtaW5EYXRlLG1heERhdGUsc2VsZWN0ZWREYXRlLHJvdz4wfHxjb2w+MCxtb250aE5hbWVzLG1vbnRoTmFtZXNTaG9ydCkrJzwvZGl2Pjx0YWJsZSBjbGFzcz0idWktZGF0ZXBpY2tlci1jYWxlbmRhciI+PHRoZWFkPjx0cj4nO3ZhciB0aGVhZD0iIjtmb3IodmFyIGRvdz0wO2Rvdzw3O2RvdysrKXt2YXIgZGF5PShkb3crZmlyc3REYXkpJTc7dGhlYWQrPSI8dGgiKygoZG93K2ZpcnN0RGF5KzYpJTc+PTU/JyBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWVuZCInOiIiKSsnPjxzcGFuIHRpdGxlPSInK2RheU5hbWVzW2RheV0rJyI+JytkYXlOYW1lc01pbltkYXldKyI8L3NwYW4+PC90aD4ifWNhbGVuZGVyKz10aGVhZCsiPC90cj48L3RoZWFkPjx0Ym9keT4iO3ZhciBkYXlzSW5Nb250aD10aGlzLl9nZXREYXlzSW5Nb250aChkcmF3WWVhcixkcmF3TW9udGgpO2lmKGRyYXdZZWFyPT1pbnN0LnNlbGVjdGVkWWVhciYmZHJhd01vbnRoPT1pbnN0LnNlbGVjdGVkTW9udGgpe2luc3Quc2VsZWN0ZWREYXk9TWF0aC5taW4oaW5zdC5zZWxlY3RlZERheSxkYXlzSW5Nb250aCl9dmFyIGxlYWREYXlzPSh0aGlzLl9nZXRGaXJzdERheU9mTW9udGgoZHJhd1llYXIsZHJhd01vbnRoKS1maXJzdERheSs3KSU3O3ZhciBudW1Sb3dzPShpc011bHRpTW9udGg/NjpNYXRoLmNlaWwoKGxlYWREYXlzK2RheXNJbk1vbnRoKS83KSk7dmFyIHByaW50RGF0ZT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhcixkcmF3TW9udGgsMS1sZWFkRGF5cykpO2Zvcih2YXIgZFJvdz0wO2RSb3c8bnVtUm93cztkUm93Kyspe2NhbGVuZGVyKz0iPHRyPiI7dmFyIHRib2R5PSIiO2Zvcih2YXIgZG93PTA7ZG93PDc7ZG93Kyspe3ZhciBkYXlTZXR0aW5ncz0oYmVmb3JlU2hvd0RheT9iZWZvcmVTaG93RGF5LmFwcGx5KChpbnN0LmlucHV0P2luc3QuaW5wdXRbMF06bnVsbCksW3ByaW50RGF0ZV0pOlt0cnVlLCIiXSk7dmFyIG90aGVyTW9udGg9KHByaW50RGF0ZS5nZXRNb250aCgpIT1kcmF3TW9udGgpO3ZhciB1bnNlbGVjdGFibGU9b3RoZXJNb250aHx8IWRheVNldHRpbmdzWzBdfHwobWluRGF0ZSYmcHJpbnREYXRlPG1pbkRhdGUpfHwobWF4RGF0ZSYmcHJpbnREYXRlPm1heERhdGUpO3Rib2R5Kz0nPHRkIGNsYXNzPSInKygoZG93K2ZpcnN0RGF5KzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKG90aGVyTW9udGg/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKChwcmludERhdGUuZ2V0VGltZSgpPT1zZWxlY3RlZERhdGUuZ2V0VGltZSgpJiZkcmF3TW9udGg9PWluc3Quc2VsZWN0ZWRNb250aCYmaW5zdC5fa2V5RXZlbnQpfHwoZGVmYXVsdERhdGUuZ2V0VGltZSgpPT1wcmludERhdGUuZ2V0VGltZSgpJiZkZWZhdWx0RGF0ZS5nZXRUaW1lKCk9PXNlbGVjdGVkRGF0ZS5nZXRUaW1lKCkpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyh1bnNlbGVjdGFibGU/IiAiK3RoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKyIgdWktc3RhdGUtZGlzYWJsZWQiOiIiKSsob3RoZXJNb250aCYmIXNob3dPdGhlck1vbnRocz8iIjoiICIrZGF5U2V0dGluZ3NbMV0rKHByaW50RGF0ZS5nZXRUaW1lKCk+PWN1cnJlbnREYXRlLmdldFRpbWUoKSYmcHJpbnREYXRlLmdldFRpbWUoKTw9ZW5kRGF0ZS5nZXRUaW1lKCk/IiAiK3RoaXMuX2N1cnJlbnRDbGFzczoiIikrKHByaW50RGF0ZS5nZXRUaW1lKCk9PXRvZGF5LmdldFRpbWUoKT8iIHVpLWRhdGVwaWNrZXItdG9kYXkiOiIiKSkrJyInKygoIW90aGVyTW9udGh8fHNob3dPdGhlck1vbnRocykmJmRheVNldHRpbmdzWzJdPycgdGl0bGU9IicrZGF5U2V0dGluZ3NbMl0rJyInOiIiKSsodW5zZWxlY3RhYmxlPyIiOiIgb25jbGljaz1cIkRQX2pRdWVyeS5kYXRlcGlja2VyLl9zZWxlY3REYXkoJyMiK2luc3QuaWQrIicsIitkcmF3TW9udGgrIiwiK2RyYXdZZWFyKycsIHRoaXMpO3JldHVybiBmYWxzZTsiJykrIj4iKyhvdGhlck1vbnRoPyhzaG93T3RoZXJNb250aHM/cHJpbnREYXRlLmdldERhdGUoKToiJiN4YTA7Iik6KHVuc2VsZWN0YWJsZT8nPHNwYW4gY2xhc3M9InVpLXN0YXRlLWRlZmF1bHQiPicrcHJpbnREYXRlLmdldERhdGUoKSsiPC9zcGFuPiI6JzxhIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0JysocHJpbnREYXRlLmdldFRpbWUoKT09dG9kYXkuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKHByaW50RGF0ZS5nZXRUaW1lKCk+PWN1cnJlbnREYXRlLmdldFRpbWUoKSYmcHJpbnREYXRlLmdldFRpbWUoKTw9ZW5kRGF0ZS5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1hY3RpdmUiOiIiKSsnIiBocmVmPSIjIj4nK3ByaW50RGF0ZS5nZXREYXRlKCkrIjwvYT4iKSkrIjwvdGQ+IjtwcmludERhdGUuc2V0RGF0ZShwcmludERhdGUuZ2V0RGF0ZSgpKzEpO3ByaW50RGF0ZT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChwcmludERhdGUpfWNhbGVuZGVyKz10Ym9keSsiPC90cj4ifWRyYXdNb250aCsrO2lmKGRyYXdNb250aD4xMSl7ZHJhd01vbnRoPTA7ZHJhd1llYXIrK31jYWxlbmRlcis9IjwvdGJvZHk+PC90YWJsZT4iKyhpc011bHRpTW9udGg/IjwvZGl2PiIrKChudW1Nb250aHNbMF0+MCYmY29sPT1udW1Nb250aHNbMV0tMSk/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItcm93LWJyZWFrIj48L2Rpdj4nOiIiKToiIik7Z3JvdXArPWNhbGVuZGVyfWh0bWwrPWdyb3VwfWh0bWwrPWJ1dHRvblBhbmVsKygkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24sMTApPDcmJiFpbnN0LmlubGluZT8nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBjbGFzcz0idWktZGF0ZXBpY2tlci1jb3ZlciIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPic6IiIpO2luc3QuX2tleUV2ZW50PWZhbHNlO3JldHVybiBodG1sfSxfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6ZnVuY3Rpb24oaW5zdCxkcmF3TW9udGgsZHJhd1llYXIsbWluRGF0ZSxtYXhEYXRlLHNlbGVjdGVkRGF0ZSxzZWNvbmRhcnksbW9udGhOYW1lcyxtb250aE5hbWVzU2hvcnQpe21pbkRhdGU9KGluc3QucmFuZ2VTdGFydCYmbWluRGF0ZSYmc2VsZWN0ZWREYXRlPG1pbkRhdGU/c2VsZWN0ZWREYXRlOm1pbkRhdGUpO3ZhciBjaGFuZ2VNb250aD10aGlzLl9nZXQoaW5zdCwiY2hhbmdlTW9udGgiKTt2YXIgY2hhbmdlWWVhcj10aGlzLl9nZXQoaW5zdCwiY2hhbmdlWWVhciIpO3ZhciBzaG93TW9udGhBZnRlclllYXI9dGhpcy5fZ2V0KGluc3QsInNob3dNb250aEFmdGVyWWVhciIpO3ZhciBodG1sPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXRpdGxlIj4nO3ZhciBtb250aEh0bWw9IiI7aWYoc2Vjb25kYXJ5fHwhY2hhbmdlTW9udGgpe21vbnRoSHRtbCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIj4nK21vbnRoTmFtZXNbZHJhd01vbnRoXSsiPC9zcGFuPiAifWVsc2V7dmFyIGluTWluWWVhcj0obWluRGF0ZSYmbWluRGF0ZS5nZXRGdWxsWWVhcigpPT1kcmF3WWVhcik7dmFyIGluTWF4WWVhcj0obWF4RGF0ZSYmbWF4RGF0ZS5nZXRGdWxsWWVhcigpPT1kcmF3WWVhcik7bW9udGhIdG1sKz0nPHNlbGVjdCBjbGFzcz0idWktZGF0ZXBpY2tlci1tb250aCIgb25jaGFuZ2U9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoXCcjJytpbnN0LmlkKyInLCB0aGlzLCAnTScpO1wiIG9uY2xpY2s9XCJEUF9qUXVlcnkuZGF0ZXBpY2tlci5fY2xpY2tNb250aFllYXIoJyMiK2luc3QuaWQrIicpO1wiPiI7Zm9yKHZhciBtb250aD0wO21vbnRoPDEyO21vbnRoKyspe2lmKCghaW5NaW5ZZWFyfHxtb250aD49bWluRGF0ZS5nZXRNb250aCgpKSYmKCFpbk1heFllYXJ8fG1vbnRoPD1tYXhEYXRlLmdldE1vbnRoKCkpKXttb250aEh0bWwrPSc8b3B0aW9uIHZhbHVlPSInK21vbnRoKyciJysobW9udGg9PWRyYXdNb250aD8nIHNlbGVjdGVkPSJzZWxlY3RlZCInOiIiKSsiPiIrbW9udGhOYW1lc1Nob3J0W21vbnRoXSsiPC9vcHRpb24+In19bW9udGhIdG1sKz0iPC9zZWxlY3Q+In1pZighc2hvd01vbnRoQWZ0ZXJZZWFyKXtodG1sKz1tb250aEh0bWwrKChzZWNvbmRhcnl8fGNoYW5nZU1vbnRofHxjaGFuZ2VZZWFyKSYmKCEoY2hhbmdlTW9udGgmJmNoYW5nZVllYXIpKT8iJiN4YTA7IjoiIil9aWYoc2Vjb25kYXJ5fHwhY2hhbmdlWWVhcil7aHRtbCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrZHJhd1llYXIrIjwvc3Bhbj4ifWVsc2V7dmFyIHllYXJzPXRoaXMuX2dldChpbnN0LCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpO3ZhciB5ZWFyPTA7dmFyIGVuZFllYXI9MDtpZih5ZWFycy5sZW5ndGghPTIpe3llYXI9ZHJhd1llYXItMTA7ZW5kWWVhcj1kcmF3WWVhcisxMH1lbHNle2lmKHllYXJzWzBdLmNoYXJBdCgwKT09IisifHx5ZWFyc1swXS5jaGFyQXQoMCk9PSItIil7eWVhcj1kcmF3WWVhcitwYXJzZUludCh5ZWFyc1swXSwxMCk7ZW5kWWVhcj1kcmF3WWVhcitwYXJzZUludCh5ZWFyc1sxXSwxMCl9ZWxzZXt5ZWFyPXBhcnNlSW50KHllYXJzWzBdLDEwKTtlbmRZZWFyPXBhcnNlSW50KHllYXJzWzFdLDEwKX19eWVhcj0obWluRGF0ZT9NYXRoLm1heCh5ZWFyLG1pbkRhdGUuZ2V0RnVsbFllYXIoKSk6eWVhcik7ZW5kWWVhcj0obWF4RGF0ZT9NYXRoLm1pbihlbmRZZWFyLG1heERhdGUuZ2V0RnVsbFllYXIoKSk6ZW5kWWVhcik7aHRtbCs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciIgb25jaGFuZ2U9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoXCcjJytpbnN0LmlkKyInLCB0aGlzLCAnWScpO1wiIG9uY2xpY2s9XCJEUF9qUXVlcnkuZGF0ZXBpY2tlci5fY2xpY2tNb250aFllYXIoJyMiK2luc3QuaWQrIicpO1wiPiI7Zm9yKDt5ZWFyPD1lbmRZZWFyO3llYXIrKyl7aHRtbCs9JzxvcHRpb24gdmFsdWU9IicreWVhcisnIicrKHllYXI9PWRyYXdZZWFyPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+Iit5ZWFyKyI8L29wdGlvbj4ifWh0bWwrPSI8L3NlbGVjdD4ifWlmKHNob3dNb250aEFmdGVyWWVhcil7aHRtbCs9KHNlY29uZGFyeXx8Y2hhbmdlTW9udGh8fGNoYW5nZVllYXI/IiYjeGEwOyI6IiIpK21vbnRoSHRtbH1odG1sKz0iPC9kaXY+IjtyZXR1cm4gaHRtbH0sX2FkanVzdEluc3REYXRlOmZ1bmN0aW9uKGluc3Qsb2Zmc2V0LHBlcmlvZCl7dmFyIHllYXI9aW5zdC5kcmF3WWVhcisocGVyaW9kPT0iWSI/b2Zmc2V0OjApO3ZhciBtb250aD1pbnN0LmRyYXdNb250aCsocGVyaW9kPT0iTSI/b2Zmc2V0OjApO3ZhciBkYXk9TWF0aC5taW4oaW5zdC5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aCh5ZWFyLG1vbnRoKSkrKHBlcmlvZD09IkQiP29mZnNldDowKTt2YXIgZGF0ZT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLG1vbnRoLGRheSkpO3ZhciBtaW5EYXRlPXRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwibWluIix0cnVlKTt2YXIgbWF4RGF0ZT10aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsIm1heCIpO2RhdGU9KG1pbkRhdGUmJmRhdGU8bWluRGF0ZT9taW5EYXRlOmRhdGUpO2RhdGU9KG1heERhdGUmJmRhdGU+bWF4RGF0ZT9tYXhEYXRlOmRhdGUpO2luc3Quc2VsZWN0ZWREYXk9ZGF0ZS5nZXREYXRlKCk7aW5zdC5kcmF3TW9udGg9aW5zdC5zZWxlY3RlZE1vbnRoPWRhdGUuZ2V0TW9udGgoKTtpbnN0LmRyYXdZZWFyPWluc3Quc2VsZWN0ZWRZZWFyPWRhdGUuZ2V0RnVsbFllYXIoKTtpZihwZXJpb2Q9PSJNInx8cGVyaW9kPT0iWSIpe3RoaXMuX25vdGlmeUNoYW5nZShpbnN0KX19LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oaW5zdCl7dmFyIG9uQ2hhbmdlPXRoaXMuX2dldChpbnN0LCJvbkNoYW5nZU1vbnRoWWVhciIpO2lmKG9uQ2hhbmdlKXtvbkNoYW5nZS5hcHBseSgoaW5zdC5pbnB1dD9pbnN0LmlucHV0WzBdOm51bGwpLFtpbnN0LnNlbGVjdGVkWWVhcixpbnN0LnNlbGVjdGVkTW9udGgrMSxpbnN0XSl9fSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24oaW5zdCl7dmFyIG51bU1vbnRocz10aGlzLl9nZXQoaW5zdCwibnVtYmVyT2ZNb250aHMiKTtyZXR1cm4obnVtTW9udGhzPT1udWxsP1sxLDFdOih0eXBlb2YgbnVtTW9udGhzPT0ibnVtYmVyIj9bMSxudW1Nb250aHNdOm51bU1vbnRocykpfSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihpbnN0LG1pbk1heCxjaGVja1JhbmdlKXt2YXIgZGF0ZT10aGlzLl9kZXRlcm1pbmVEYXRlKHRoaXMuX2dldChpbnN0LG1pbk1heCsiRGF0ZSIpLG51bGwpO3JldHVybighY2hlY2tSYW5nZXx8IWluc3QucmFuZ2VTdGFydD9kYXRlOighZGF0ZXx8aW5zdC5yYW5nZVN0YXJ0PmRhdGU/aW5zdC5yYW5nZVN0YXJ0OmRhdGUpKX0sX2dldERheXNJbk1vbnRoOmZ1bmN0aW9uKHllYXIsbW9udGgpe3JldHVybiAzMi1uZXcgRGF0ZSh5ZWFyLG1vbnRoLDMyKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24oeWVhcixtb250aCl7cmV0dXJuIG5ldyBEYXRlKHllYXIsbW9udGgsMSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihpbnN0LG9mZnNldCxjdXJZZWFyLGN1ck1vbnRoKXt2YXIgbnVtTW9udGhzPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGluc3QpO3ZhciBkYXRlPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGN1clllYXIsY3VyTW9udGgrKG9mZnNldDwwP29mZnNldDpudW1Nb250aHNbMV0pLDEpKTtpZihvZmZzZXQ8MCl7ZGF0ZS5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGRhdGUuZ2V0RnVsbFllYXIoKSxkYXRlLmdldE1vbnRoKCkpKX1yZXR1cm4gdGhpcy5faXNJblJhbmdlKGluc3QsZGF0ZSl9LF9pc0luUmFuZ2U6ZnVuY3Rpb24oaW5zdCxkYXRlKXt2YXIgbmV3TWluRGF0ZT0oIWluc3QucmFuZ2VTdGFydD9udWxsOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGluc3Quc2VsZWN0ZWRZZWFyLGluc3Quc2VsZWN0ZWRNb250aCxpbnN0LnNlbGVjdGVkRGF5KSkpO25ld01pbkRhdGU9KG5ld01pbkRhdGUmJmluc3QucmFuZ2VTdGFydDxuZXdNaW5EYXRlP2luc3QucmFuZ2VTdGFydDpuZXdNaW5EYXRlKTt2YXIgbWluRGF0ZT1uZXdNaW5EYXRlfHx0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsIm1pbiIpO3ZhciBtYXhEYXRlPXRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwibWF4Iik7cmV0dXJuKCghbWluRGF0ZXx8ZGF0ZT49bWluRGF0ZSkmJighbWF4RGF0ZXx8ZGF0ZTw9bWF4RGF0ZSkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGluc3Qpe3ZhciBzaG9ydFllYXJDdXRvZmY9dGhpcy5fZ2V0KGluc3QsInNob3J0WWVhckN1dG9mZiIpO3Nob3J0WWVhckN1dG9mZj0odHlwZW9mIHNob3J0WWVhckN1dG9mZiE9InN0cmluZyI/c2hvcnRZZWFyQ3V0b2ZmOm5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQoc2hvcnRZZWFyQ3V0b2ZmLDEwKSk7cmV0dXJue3Nob3J0WWVhckN1dG9mZjpzaG9ydFllYXJDdXRvZmYsZGF5TmFtZXNTaG9ydDp0aGlzLl9nZXQoaW5zdCwiZGF5TmFtZXNTaG9ydCIpLGRheU5hbWVzOnRoaXMuX2dldChpbnN0LCJkYXlOYW1lcyIpLG1vbnRoTmFtZXNTaG9ydDp0aGlzLl9nZXQoaW5zdCwibW9udGhOYW1lc1Nob3J0IiksbW9udGhOYW1lczp0aGlzLl9nZXQoaW5zdCwibW9udGhOYW1lcyIpfX0sX2Zvcm1hdERhdGU6ZnVuY3Rpb24oaW5zdCxkYXksbW9udGgseWVhcil7aWYoIWRheSl7aW5zdC5jdXJyZW50RGF5PWluc3Quc2VsZWN0ZWREYXk7aW5zdC5jdXJyZW50TW9udGg9aW5zdC5zZWxlY3RlZE1vbnRoO2luc3QuY3VycmVudFllYXI9aW5zdC5zZWxlY3RlZFllYXJ9dmFyIGRhdGU9KGRheT8odHlwZW9mIGRheT09Im9iamVjdCI/ZGF5OnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsbW9udGgsZGF5KSkpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsaW5zdC5jdXJyZW50TW9udGgsaW5zdC5jdXJyZW50RGF5KSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGluc3QsImRhdGVGb3JtYXQiKSxkYXRlLHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSl9fSk7ZnVuY3Rpb24gZXh0ZW5kUmVtb3ZlKHRhcmdldCxwcm9wcyl7JC5leHRlbmQodGFyZ2V0LHByb3BzKTtmb3IodmFyIG5hbWUgaW4gcHJvcHMpe2lmKHByb3BzW25hbWVdPT1udWxsfHxwcm9wc1tuYW1lXT09dW5kZWZpbmVkKXt0YXJnZXRbbmFtZV09cHJvcHNbbmFtZV19fXJldHVybiB0YXJnZXR9ZnVuY3Rpb24gaXNBcnJheShhKXtyZXR1cm4oYSYmKCgkLmJyb3dzZXIuc2FmYXJpJiZ0eXBlb2YgYT09Im9iamVjdCImJmEubGVuZ3RoKXx8KGEuY29uc3RydWN0b3ImJmEuY29uc3RydWN0b3IudG9TdHJpbmcoKS5tYXRjaCgvXEFycmF5XChcKS8pKSkpfSQuZm4uZGF0ZXBpY2tlcj1mdW5jdGlvbihvcHRpb25zKXtpZighJC5kYXRlcGlja2VyLmluaXRpYWxpemVkKXskKGRvY3VtZW50KS5tb3VzZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLmZpbmQoImJvZHkiKS5hcHBlbmQoJC5kYXRlcGlja2VyLmRwRGl2KTskLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9dHJ1ZX12YXIgb3RoZXJBcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtpZih0eXBlb2Ygb3B0aW9ucz09InN0cmluZyImJihvcHRpb25zPT0iaXNEaXNhYmxlZCJ8fG9wdGlvbnM9PSJnZXREYXRlIikpe3JldHVybiAkLmRhdGVwaWNrZXJbIl8iK29wdGlvbnMrIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKX1pZihvcHRpb25zPT0ib3B0aW9uIiYmYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIGFyZ3VtZW50c1sxXT09InN0cmluZyIpe3JldHVybiAkLmRhdGVwaWNrZXJbIl8iK29wdGlvbnMrIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKX1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHlwZW9mIG9wdGlvbnM9PSJzdHJpbmciPyQuZGF0ZXBpY2tlclsiXyIrb3B0aW9ucysiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc10uY29uY2F0KG90aGVyQXJncykpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLG9wdGlvbnMpfSl9OyQuZGF0ZXBpY2tlcj1uZXcgRGF0ZXBpY2tlcigpOyQuZGF0ZXBpY2tlci5pbml0aWFsaXplZD1mYWxzZTskLmRhdGVwaWNrZXIudXVpZD1uZXcgRGF0ZSgpLmdldFRpbWUoKTskLmRhdGVwaWNrZXIudmVyc2lvbj0iMS43LjIiO3dpbmRvdy5EUF9qUXVlcnk9JH0pKGpRdWVyeSk7Oy8qCisgKiBqUXVlcnkgVUkgUHJvZ3Jlc3NiYXIgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9Qcm9ncmVzc2JhcgorICoKKyAqIERlcGVuZHM6CisgKiAgIHVpLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS5wcm9ncmVzc2JhciIse19pbml0OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLmF0dHIoe3JvbGU6InByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiI6dGhpcy5fdmFsdWVNaW4oKSwiYXJpYS12YWx1ZW1heCI6dGhpcy5fdmFsdWVNYXgoKSwiYXJpYS12YWx1ZW5vdyI6dGhpcy5fdmFsdWUoKX0pO3RoaXMudmFsdWVEaXY9YSgnPGRpdiBjbGFzcz0idWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCI+PC9kaXY+JykuYXBwZW5kVG8odGhpcy5lbGVtZW50KTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IikucmVtb3ZlRGF0YSgicHJvZ3Jlc3NiYXIiKS51bmJpbmQoIi5wcm9ncmVzc2JhciIpO3RoaXMudmFsdWVEaXYucmVtb3ZlKCk7YS53aWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2YWx1ZTpmdW5jdGlvbihiKXtpZihiPT09dW5kZWZpbmVkKXtyZXR1cm4gdGhpcy5fdmFsdWUoKX10aGlzLl9zZXREYXRhKCJ2YWx1ZSIsYik7cmV0dXJuIHRoaXN9LF9zZXREYXRhOmZ1bmN0aW9uKGIsYyl7c3dpdGNoKGIpe2Nhc2UidmFsdWUiOnRoaXMub3B0aW9ucy52YWx1ZT1jO3RoaXMuX3JlZnJlc2hWYWx1ZSgpO3RoaXMuX3RyaWdnZXIoImNoYW5nZSIsbnVsbCx7fSk7YnJlYWt9YS53aWRnZXQucHJvdG90eXBlLl9zZXREYXRhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3ZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLnZhbHVlO2lmKGI8dGhpcy5fdmFsdWVNaW4oKSl7Yj10aGlzLl92YWx1ZU1pbigpfWlmKGI+dGhpcy5fdmFsdWVNYXgoKSl7Yj10aGlzLl92YWx1ZU1heCgpfXJldHVybiBifSxfdmFsdWVNaW46ZnVuY3Rpb24oKXt2YXIgYj0wO3JldHVybiBifSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXt2YXIgYj0xMDA7cmV0dXJuIGJ9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZhbHVlKCk7dGhpcy52YWx1ZURpdltiPT10aGlzLl92YWx1ZU1heCgpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLWNvcm5lci1yaWdodCIpO3RoaXMudmFsdWVEaXYud2lkdGgoYisiJSIpO3RoaXMuZWxlbWVudC5hdHRyKCJhcmlhLXZhbHVlbm93IixiKX19KTthLmV4dGVuZChhLnVpLnByb2dyZXNzYmFyLHt2ZXJzaW9uOiIxLjcuMiIsZGVmYXVsdHM6e3ZhbHVlOjB9fSl9KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIEVmZmVjdHMgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzLworICovCitqUXVlcnkuZWZmZWN0c3x8KGZ1bmN0aW9uKGQpe2QuZWZmZWN0cz17dmVyc2lvbjoiMS43LjIiLHNhdmU6ZnVuY3Rpb24oZyxoKXtmb3IodmFyIGY9MDtmPGgubGVuZ3RoO2YrKyl7aWYoaFtmXSE9PW51bGwpe2cuZGF0YSgiZWMuc3RvcmFnZS4iK2hbZl0sZ1swXS5zdHlsZVtoW2ZdXSl9fX0scmVzdG9yZTpmdW5jdGlvbihnLGgpe2Zvcih2YXIgZj0wO2Y8aC5sZW5ndGg7ZisrKXtpZihoW2ZdIT09bnVsbCl7Zy5jc3MoaFtmXSxnLmRhdGEoImVjLnN0b3JhZ2UuIitoW2ZdKSl9fX0sc2V0TW9kZTpmdW5jdGlvbihmLGcpe2lmKGc9PSJ0b2dnbGUiKXtnPWYuaXMoIjpoaWRkZW4iKT8ic2hvdyI6ImhpZGUifXJldHVybiBnfSxnZXRCYXNlbGluZTpmdW5jdGlvbihnLGgpe3ZhciBpLGY7c3dpdGNoKGdbMF0pe2Nhc2UidG9wIjppPTA7YnJlYWs7Y2FzZSJtaWRkbGUiOmk9MC41O2JyZWFrO2Nhc2UiYm90dG9tIjppPTE7YnJlYWs7ZGVmYXVsdDppPWdbMF0vaC5oZWlnaHR9c3dpdGNoKGdbMV0pe2Nhc2UibGVmdCI6Zj0wO2JyZWFrO2Nhc2UiY2VudGVyIjpmPTAuNTticmVhaztjYXNlInJpZ2h0IjpmPTE7YnJlYWs7ZGVmYXVsdDpmPWdbMV0vaC53aWR0aH1yZXR1cm57eDpmLHk6aX19LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oZil7aWYoZi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXtyZXR1cm4gZi5wYXJlbnQoKX12YXIgZz17d2lkdGg6Zi5vdXRlcldpZHRoKHRydWUpLGhlaWdodDpmLm91dGVySGVpZ2h0KHRydWUpLCJmbG9hdCI6Zi5jc3MoImZsb2F0Iil9O2Yud3JhcCgnPGRpdiBjbGFzcz0idWktZWZmZWN0cy13cmFwcGVyIiBzdHlsZT0iZm9udC1zaXplOjEwMCU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjAiPjwvZGl2PicpO3ZhciBqPWYucGFyZW50KCk7aWYoZi5jc3MoInBvc2l0aW9uIik9PSJzdGF0aWMiKXtqLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pO2YuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSl9ZWxzZXt2YXIgaT1mLmNzcygidG9wIik7aWYoaXNOYU4ocGFyc2VJbnQoaSwxMCkpKXtpPSJhdXRvIn12YXIgaD1mLmNzcygibGVmdCIpO2lmKGlzTmFOKHBhcnNlSW50KGgsMTApKSl7aD0iYXV0byJ9ai5jc3Moe3Bvc2l0aW9uOmYuY3NzKCJwb3NpdGlvbiIpLHRvcDppLGxlZnQ6aCx6SW5kZXg6Zi5jc3MoInotaW5kZXgiKX0pLnNob3coKTtmLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjB9KX1qLmNzcyhnKTtyZXR1cm4gan0scmVtb3ZlV3JhcHBlcjpmdW5jdGlvbihmKXtpZihmLnBhcmVudCgpLmlzKCIudWktZWZmZWN0cy13cmFwcGVyIikpe3JldHVybiBmLnBhcmVudCgpLnJlcGxhY2VXaXRoKGYpfXJldHVybiBmfSxzZXRUcmFuc2l0aW9uOmZ1bmN0aW9uKGcsaSxmLGgpe2g9aHx8e307ZC5lYWNoKGksZnVuY3Rpb24oayxqKXt1bml0PWcuY3NzVW5pdChqKTtpZih1bml0WzBdPjApe2hbal09dW5pdFswXSpmK3VuaXRbMV19fSk7cmV0dXJuIGh9LGFuaW1hdGVDbGFzczpmdW5jdGlvbihoLGksayxqKXt2YXIgZj0odHlwZW9mIGs9PSJmdW5jdGlvbiI/azooaj9qOm51bGwpKTt2YXIgZz0odHlwZW9mIGs9PSJzdHJpbmciP2s6bnVsbCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBxPXt9O3ZhciBvPWQodGhpcyk7dmFyIHA9by5hdHRyKCJzdHlsZSIpfHwiIjtpZih0eXBlb2YgcD09Im9iamVjdCIpe3A9cC5jc3NUZXh0fWlmKGgudG9nZ2xlKXtvLmhhc0NsYXNzKGgudG9nZ2xlKT9oLnJlbW92ZT1oLnRvZ2dsZTpoLmFkZD1oLnRvZ2dsZX12YXIgbD1kLmV4dGVuZCh7fSwoZG9jdW1lbnQuZGVmYXVsdFZpZXc/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpOnRoaXMuY3VycmVudFN0eWxlKSk7aWYoaC5hZGQpe28uYWRkQ2xhc3MoaC5hZGQpfWlmKGgucmVtb3ZlKXtvLnJlbW92ZUNsYXNzKGgucmVtb3ZlKX12YXIgbT1kLmV4dGVuZCh7fSwoZG9jdW1lbnQuZGVmYXVsdFZpZXc/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpOnRoaXMuY3VycmVudFN0eWxlKSk7aWYoaC5hZGQpe28ucmVtb3ZlQ2xhc3MoaC5hZGQpfWlmKGgucmVtb3ZlKXtvLmFkZENsYXNzKGgucmVtb3ZlKX1mb3IodmFyIHIgaW4gbSl7aWYodHlwZW9mIG1bcl0hPSJmdW5jdGlvbiImJm1bcl0mJnIuaW5kZXhPZigiTW96Iik9PS0xJiZyLmluZGV4T2YoImxlbmd0aCIpPT0tMSYmbVtyXSE9bFtyXSYmKHIubWF0Y2goL2NvbG9yL2kpfHwoIXIubWF0Y2goL2NvbG9yL2kpJiYhaXNOYU4ocGFyc2VJbnQobVtyXSwxMCkpKSkmJihsLnBvc2l0aW9uIT0ic3RhdGljInx8KGwucG9zaXRpb249PSJzdGF0aWMiJiYhci5tYXRjaCgvbGVmdHx0b3B8Ym90dG9tfHJpZ2h0LykpKSl7cVtyXT1tW3JdfX1vLmFuaW1hdGUocSxpLGcsZnVuY3Rpb24oKXtpZih0eXBlb2YgZCh0aGlzKS5hdHRyKCJzdHlsZSIpPT0ib2JqZWN0Iil7ZCh0aGlzKS5hdHRyKCJzdHlsZSIpWyJjc3NUZXh0Il09IiI7ZCh0aGlzKS5hdHRyKCJzdHlsZSIpWyJjc3NUZXh0Il09cH1lbHNle2QodGhpcykuYXR0cigic3R5bGUiLHApfWlmKGguYWRkKXtkKHRoaXMpLmFkZENsYXNzKGguYWRkKX1pZihoLnJlbW92ZSl7ZCh0aGlzKS5yZW1vdmVDbGFzcyhoLnJlbW92ZSl9aWYoZil7Zi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSl9KX19O2Z1bmN0aW9uIGMoZyxmKXt2YXIgaT1nWzFdJiZnWzFdLmNvbnN0cnVjdG9yPT1PYmplY3Q/Z1sxXTp7fTtpZihmKXtpLm1vZGU9Zn12YXIgaD1nWzFdJiZnWzFdLmNvbnN0cnVjdG9yIT1PYmplY3Q/Z1sxXTooaS5kdXJhdGlvbj9pLmR1cmF0aW9uOmdbMl0pO2g9ZC5meC5vZmY/MDp0eXBlb2YgaD09PSJudW1iZXIiP2g6ZC5meC5zcGVlZHNbaF18fGQuZnguc3BlZWRzLl9kZWZhdWx0O3ZhciBqPWkuY2FsbGJhY2t8fChkLmlzRnVuY3Rpb24oZ1sxXSkmJmdbMV0pfHwoZC5pc0Z1bmN0aW9uKGdbMl0pJiZnWzJdKXx8KGQuaXNGdW5jdGlvbihnWzNdKSYmZ1szXSk7cmV0dXJuW2dbMF0saSxoLGpdfWQuZm4uZXh0ZW5kKHtfc2hvdzpkLmZuLnNob3csX2hpZGU6ZC5mbi5oaWRlLF9fdG9nZ2xlOmQuZm4udG9nZ2xlLF9hZGRDbGFzczpkLmZuLmFkZENsYXNzLF9yZW1vdmVDbGFzczpkLmZuLnJlbW92ZUNsYXNzLF90b2dnbGVDbGFzczpkLmZuLnRvZ2dsZUNsYXNzLGVmZmVjdDpmdW5jdGlvbihnLGYsaCxpKXtyZXR1cm4gZC5lZmZlY3RzW2ddP2QuZWZmZWN0c1tnXS5jYWxsKHRoaXMse21ldGhvZDpnLG9wdGlvbnM6Znx8e30sZHVyYXRpb246aCxjYWxsYmFjazppfSk6bnVsbH0sc2hvdzpmdW5jdGlvbigpe2lmKCFhcmd1bWVudHNbMF18fChhcmd1bWVudHNbMF0uY29uc3RydWN0b3I9PU51bWJlcnx8KC8oc2xvd3xub3JtYWx8ZmFzdCkvKS50ZXN0KGFyZ3VtZW50c1swXSkpKXtyZXR1cm4gdGhpcy5fc2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZWxzZXtyZXR1cm4gdGhpcy5lZmZlY3QuYXBwbHkodGhpcyxjKGFyZ3VtZW50cywic2hvdyIpKX19LGhpZGU6ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzWzBdfHwoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yPT1OdW1iZXJ8fCgvKHNsb3d8bm9ybWFsfGZhc3QpLykudGVzdChhcmd1bWVudHNbMF0pKSl7cmV0dXJuIHRoaXMuX2hpZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWVsc2V7cmV0dXJuIHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYyhhcmd1bWVudHMsImhpZGUiKSl9fSx0b2dnbGU6ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzWzBdfHwoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yPT1OdW1iZXJ8fCgvKHNsb3d8bm9ybWFsfGZhc3QpLykudGVzdChhcmd1bWVudHNbMF0pKXx8KGQuaXNGdW5jdGlvbihhcmd1bWVudHNbMF0pfHx0eXBlb2YgYXJndW1lbnRzWzBdPT0iYm9vbGVhbiIpKXtyZXR1cm4gdGhpcy5fX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZWxzZXtyZXR1cm4gdGhpcy5lZmZlY3QuYXBwbHkodGhpcyxjKGFyZ3VtZW50cywidG9nZ2xlIikpfX0sYWRkQ2xhc3M6ZnVuY3Rpb24oZyxmLGksaCl7cmV0dXJuIGY/ZC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7YWRkOmd9LGYsaSxoXSk6dGhpcy5fYWRkQ2xhc3MoZyl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGcsZixpLGgpe3JldHVybiBmP2QuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe3JlbW92ZTpnfSxmLGksaF0pOnRoaXMuX3JlbW92ZUNsYXNzKGcpfSx0b2dnbGVDbGFzczpmdW5jdGlvbihnLGYsaSxoKXtyZXR1cm4oKHR5cGVvZiBmIT09ImJvb2xlYW4iKSYmZik/ZC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7dG9nZ2xlOmd9LGYsaSxoXSk6dGhpcy5fdG9nZ2xlQ2xhc3MoZyxmKX0sbW9ycGg6ZnVuY3Rpb24oZixoLGcsaixpKXtyZXR1cm4gZC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7YWRkOmgscmVtb3ZlOmZ9LGcsaixpXSl9LHN3aXRjaENsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9ycGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjc3NVbml0OmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMuY3NzKGYpLGg9W107ZC5lYWNoKFsiZW0iLCJweCIsIiUiLCJwdCJdLGZ1bmN0aW9uKGosayl7aWYoZy5pbmRleE9mKGspPjApe2g9W3BhcnNlRmxvYXQoZyksa119fSk7cmV0dXJuIGh9fSk7ZC5lYWNoKFsiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyVG9wQ29sb3IiLCJjb2xvciIsIm91dGxpbmVDb2xvciJdLGZ1bmN0aW9uKGcsZil7ZC5meC5zdGVwW2ZdPWZ1bmN0aW9uKGgpe2lmKGguc3RhdGU9PTApe2guc3RhcnQ9ZShoLmVsZW0sZik7aC5lbmQ9YihoLmVuZCl9aC5lbGVtLnN0eWxlW2ZdPSJyZ2IoIitbTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoKGgucG9zKihoLmVuZFswXS1oLnN0YXJ0WzBdKSkraC5zdGFydFswXSwxMCksMjU1KSwwKSxNYXRoLm1heChNYXRoLm1pbihwYXJzZUludCgoaC5wb3MqKGguZW5kWzFdLWguc3RhcnRbMV0pKStoLnN0YXJ0WzFdLDEwKSwyNTUpLDApLE1hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KChoLnBvcyooaC5lbmRbMl0taC5zdGFydFsyXSkpK2guc3RhcnRbMl0sMTApLDI1NSksMCldLmpvaW4oIiwiKSsiKSJ9fSk7ZnVuY3Rpb24gYihnKXt2YXIgZjtpZihnJiZnLmNvbnN0cnVjdG9yPT1BcnJheSYmZy5sZW5ndGg9PTMpe3JldHVybiBnfWlmKGY9L3JnYlwoXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKixccyooWzAtOV17MSwzfSlccypcKS8uZXhlYyhnKSl7cmV0dXJuW3BhcnNlSW50KGZbMV0sMTApLHBhcnNlSW50KGZbMl0sMTApLHBhcnNlSW50KGZbM10sMTApXX1pZihmPS9yZ2JcKFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqXCkvLmV4ZWMoZykpe3JldHVybltwYXJzZUZsb2F0KGZbMV0pKjIuNTUscGFyc2VGbG9hdChmWzJdKSoyLjU1LHBhcnNlRmxvYXQoZlszXSkqMi41NV19aWYoZj0vIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KS8uZXhlYyhnKSl7cmV0dXJuW3BhcnNlSW50KGZbMV0sMTYpLHBhcnNlSW50KGZbMl0sMTYpLHBhcnNlSW50KGZbM10sMTYpXX1pZihmPS8jKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pLy5leGVjKGcpKXtyZXR1cm5bcGFyc2VJbnQoZlsxXStmWzFdLDE2KSxwYXJzZUludChmWzJdK2ZbMl0sMTYpLHBhcnNlSW50KGZbM10rZlszXSwxNildfWlmKGY9L3JnYmFcKDAsIDAsIDAsIDBcKS8uZXhlYyhnKSl7cmV0dXJuIGEudHJhbnNwYXJlbnR9cmV0dXJuIGFbZC50cmltKGcpLnRvTG93ZXJDYXNlKCldfWZ1bmN0aW9uIGUoaCxmKXt2YXIgZztkb3tnPWQuY3VyQ1NTKGgsZik7aWYoZyE9IiImJmchPSJ0cmFuc3BhcmVudCJ8fGQubm9kZU5hbWUoaCwiYm9keSIpKXticmVha31mPSJiYWNrZ3JvdW5kQ29sb3IifXdoaWxlKGg9aC5wYXJlbnROb2RlKTtyZXR1cm4gYihnKX12YXIgYT17YXF1YTpbMCwyNTUsMjU1XSxhenVyZTpbMjQwLDI1NSwyNTVdLGJlaWdlOlsyNDUsMjQ1LDIyMF0sYmxhY2s6WzAsMCwwXSxibHVlOlswLDAsMjU1XSxicm93bjpbMTY1LDQyLDQyXSxjeWFuOlswLDI1NSwyNTVdLGRhcmtibHVlOlswLDAsMTM5XSxkYXJrY3lhbjpbMCwxMzksMTM5XSxkYXJrZ3JleTpbMTY5LDE2OSwxNjldLGRhcmtncmVlbjpbMCwxMDAsMF0sZGFya2toYWtpOlsxODksMTgzLDEwN10sZGFya21hZ2VudGE6WzEzOSwwLDEzOV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0N10sZGFya29yYW5nZTpbMjU1LDE0MCwwXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0XSxkYXJrcmVkOlsxMzksMCwwXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMl0sZGFya3Zpb2xldDpbMTQ4LDAsMjExXSxmdWNoc2lhOlsyNTUsMCwyNTVdLGdvbGQ6WzI1NSwyMTUsMF0sZ3JlZW46WzAsMTI4LDBdLGluZGlnbzpbNzUsMCwxMzBdLGtoYWtpOlsyNDAsMjMwLDE0MF0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMF0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDRdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTNdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNF0sbGltZTpbMCwyNTUsMF0sbWFnZW50YTpbMjU1LDAsMjU1XSxtYXJvb246WzEyOCwwLDBdLG5hdnk6WzAsMCwxMjhdLG9saXZlOlsxMjgsMTI4LDBdLG9yYW5nZTpbMjU1LDE2NSwwXSxwaW5rOlsyNTUsMTkyLDIwM10scHVycGxlOlsxMjgsMCwxMjhdLHZpb2xldDpbMTI4LDAsMTI4XSxyZWQ6WzI1NSwwLDBdLHNpbHZlcjpbMTkyLDE5MiwxOTJdLHdoaXRlOlsyNTUsMjU1LDI1NV0seWVsbG93OlsyNTUsMjU1LDBdLHRyYW5zcGFyZW50OlsyNTUsMjU1LDI1NV19O2QuZWFzaW5nLmpzd2luZz1kLmVhc2luZy5zd2luZztkLmV4dGVuZChkLmVhc2luZyx7ZGVmOiJlYXNlT3V0UXVhZCIsc3dpbmc6ZnVuY3Rpb24oZyxoLGYsaixpKXtyZXR1cm4gZC5lYXNpbmdbZC5lYXNpbmcuZGVmXShnLGgsZixqLGkpfSxlYXNlSW5RdWFkOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuIGoqKGgvPWkpKmgrZn0sZWFzZU91dFF1YWQ6ZnVuY3Rpb24oZyxoLGYsaixpKXtyZXR1cm4gLWoqKGgvPWkpKihoLTIpK2Z9LGVhc2VJbk91dFF1YWQ6ZnVuY3Rpb24oZyxoLGYsaixpKXtpZigoaC89aS8yKTwxKXtyZXR1cm4gai8yKmgqaCtmfXJldHVybiAtai8yKigoLS1oKSooaC0yKS0xKStmfSxlYXNlSW5DdWJpYzpmdW5jdGlvbihnLGgsZixqLGkpe3JldHVybiBqKihoLz1pKSpoKmgrZn0sZWFzZU91dEN1YmljOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuIGoqKChoPWgvaS0xKSpoKmgrMSkrZn0sZWFzZUluT3V0Q3ViaWM6ZnVuY3Rpb24oZyxoLGYsaixpKXtpZigoaC89aS8yKTwxKXtyZXR1cm4gai8yKmgqaCpoK2Z9cmV0dXJuIGovMiooKGgtPTIpKmgqaCsyKStmfSxlYXNlSW5RdWFydDpmdW5jdGlvbihnLGgsZixqLGkpe3JldHVybiBqKihoLz1pKSpoKmgqaCtmfSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24oZyxoLGYsaixpKXtyZXR1cm4gLWoqKChoPWgvaS0xKSpoKmgqaC0xKStmfSxlYXNlSW5PdXRRdWFydDpmdW5jdGlvbihnLGgsZixqLGkpe2lmKChoLz1pLzIpPDEpe3JldHVybiBqLzIqaCpoKmgqaCtmfXJldHVybiAtai8yKigoaC09MikqaCpoKmgtMikrZn0sZWFzZUluUXVpbnQ6ZnVuY3Rpb24oZyxoLGYsaixpKXtyZXR1cm4gaiooaC89aSkqaCpoKmgqaCtmfSxlYXNlT3V0UXVpbnQ6ZnVuY3Rpb24oZyxoLGYsaixpKXtyZXR1cm4gaiooKGg9aC9pLTEpKmgqaCpoKmgrMSkrZn0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24oZyxoLGYsaixpKXtpZigoaC89aS8yKTwxKXtyZXR1cm4gai8yKmgqaCpoKmgqaCtmfXJldHVybiBqLzIqKChoLT0yKSpoKmgqaCpoKzIpK2Z9LGVhc2VJblNpbmU6ZnVuY3Rpb24oZyxoLGYsaixpKXtyZXR1cm4gLWoqTWF0aC5jb3MoaC9pKihNYXRoLlBJLzIpKStqK2Z9LGVhc2VPdXRTaW5lOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuIGoqTWF0aC5zaW4oaC9pKihNYXRoLlBJLzIpKStmfSxlYXNlSW5PdXRTaW5lOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuIC1qLzIqKE1hdGguY29zKE1hdGguUEkqaC9pKS0xKStmfSxlYXNlSW5FeHBvOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuKGg9PTApP2Y6aipNYXRoLnBvdygyLDEwKihoL2ktMSkpK2Z9LGVhc2VPdXRFeHBvOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuKGg9PWkpP2YrajpqKigtTWF0aC5wb3coMiwtMTAqaC9pKSsxKStmfSxlYXNlSW5PdXRFeHBvOmZ1bmN0aW9uKGcsaCxmLGosaSl7aWYoaD09MCl7cmV0dXJuIGZ9aWYoaD09aSl7cmV0dXJuIGYran1pZigoaC89aS8yKTwxKXtyZXR1cm4gai8yKk1hdGgucG93KDIsMTAqKGgtMSkpK2Z9cmV0dXJuIGovMiooLU1hdGgucG93KDIsLTEwKi0taCkrMikrZn0sZWFzZUluQ2lyYzpmdW5jdGlvbihnLGgsZixqLGkpe3JldHVybiAtaiooTWF0aC5zcXJ0KDEtKGgvPWkpKmgpLTEpK2Z9LGVhc2VPdXRDaXJjOmZ1bmN0aW9uKGcsaCxmLGosaSl7cmV0dXJuIGoqTWF0aC5zcXJ0KDEtKGg9aC9pLTEpKmgpK2Z9LGVhc2VJbk91dENpcmM6ZnVuY3Rpb24oZyxoLGYsaixpKXtpZigoaC89aS8yKTwxKXtyZXR1cm4gLWovMiooTWF0aC5zcXJ0KDEtaCpoKS0xKStmfXJldHVybiBqLzIqKE1hdGguc3FydCgxLShoLT0yKSpoKSsxKStmfSxlYXNlSW5FbGFzdGljOmZ1bmN0aW9uKGcsaSxmLG0sbCl7dmFyIGo9MS43MDE1ODt2YXIgaz0wO3ZhciBoPW07aWYoaT09MCl7cmV0dXJuIGZ9aWYoKGkvPWwpPT0xKXtyZXR1cm4gZittfWlmKCFrKXtrPWwqMC4zfWlmKGg8TWF0aC5hYnMobSkpe2g9bTt2YXIgaj1rLzR9ZWxzZXt2YXIgaj1rLygyKk1hdGguUEkpKk1hdGguYXNpbihtL2gpfXJldHVybiAtKGgqTWF0aC5wb3coMiwxMCooaS09MSkpKk1hdGguc2luKChpKmwtaikqKDIqTWF0aC5QSSkvaykpK2Z9LGVhc2VPdXRFbGFzdGljOmZ1bmN0aW9uKGcsaSxmLG0sbCl7dmFyIGo9MS43MDE1ODt2YXIgaz0wO3ZhciBoPW07aWYoaT09MCl7cmV0dXJuIGZ9aWYoKGkvPWwpPT0xKXtyZXR1cm4gZittfWlmKCFrKXtrPWwqMC4zfWlmKGg8TWF0aC5hYnMobSkpe2g9bTt2YXIgaj1rLzR9ZWxzZXt2YXIgaj1rLygyKk1hdGguUEkpKk1hdGguYXNpbihtL2gpfXJldHVybiBoKk1hdGgucG93KDIsLTEwKmkpKk1hdGguc2luKChpKmwtaikqKDIqTWF0aC5QSSkvaykrbStmfSxlYXNlSW5PdXRFbGFzdGljOmZ1bmN0aW9uKGcsaSxmLG0sbCl7dmFyIGo9MS43MDE1ODt2YXIgaz0wO3ZhciBoPW07aWYoaT09MCl7cmV0dXJuIGZ9aWYoKGkvPWwvMik9PTIpe3JldHVybiBmK219aWYoIWspe2s9bCooMC4zKjEuNSl9aWYoaDxNYXRoLmFicyhtKSl7aD1tO3ZhciBqPWsvNH1lbHNle3ZhciBqPWsvKDIqTWF0aC5QSSkqTWF0aC5hc2luKG0vaCl9aWYoaTwxKXtyZXR1cm4gLTAuNSooaCpNYXRoLnBvdygyLDEwKihpLT0xKSkqTWF0aC5zaW4oKGkqbC1qKSooMipNYXRoLlBJKS9rKSkrZn1yZXR1cm4gaCpNYXRoLnBvdygyLC0xMCooaS09MSkpKk1hdGguc2luKChpKmwtaikqKDIqTWF0aC5QSSkvaykqMC41K20rZn0sZWFzZUluQmFjazpmdW5jdGlvbihnLGgsZixrLGosaSl7aWYoaT09dW5kZWZpbmVkKXtpPTEuNzAxNTh9cmV0dXJuIGsqKGgvPWopKmgqKChpKzEpKmgtaSkrZn0sZWFzZU91dEJhY2s6ZnVuY3Rpb24oZyxoLGYsayxqLGkpe2lmKGk9PXVuZGVmaW5lZCl7aT0xLjcwMTU4fXJldHVybiBrKigoaD1oL2otMSkqaCooKGkrMSkqaCtpKSsxKStmfSxlYXNlSW5PdXRCYWNrOmZ1bmN0aW9uKGcsaCxmLGssaixpKXtpZihpPT11bmRlZmluZWQpe2k9MS43MDE1OH1pZigoaC89ai8yKTwxKXtyZXR1cm4gay8yKihoKmgqKCgoaSo9KDEuNTI1KSkrMSkqaC1pKSkrZn1yZXR1cm4gay8yKigoaC09MikqaCooKChpKj0oMS41MjUpKSsxKSpoK2kpKzIpK2Z9LGVhc2VJbkJvdW5jZTpmdW5jdGlvbihnLGgsZixqLGkpe3JldHVybiBqLWQuZWFzaW5nLmVhc2VPdXRCb3VuY2UoZyxpLWgsMCxqLGkpK2Z9LGVhc2VPdXRCb3VuY2U6ZnVuY3Rpb24oZyxoLGYsaixpKXtpZigoaC89aSk8KDEvMi43NSkpe3JldHVybiBqKig3LjU2MjUqaCpoKStmfWVsc2V7aWYoaDwoMi8yLjc1KSl7cmV0dXJuIGoqKDcuNTYyNSooaC09KDEuNS8yLjc1KSkqaCswLjc1KStmfWVsc2V7aWYoaDwoMi41LzIuNzUpKXtyZXR1cm4gaiooNy41NjI1KihoLT0oMi4yNS8yLjc1KSkqaCswLjkzNzUpK2Z9ZWxzZXtyZXR1cm4gaiooNy41NjI1KihoLT0oMi42MjUvMi43NSkpKmgrMC45ODQzNzUpK2Z9fX19LGVhc2VJbk91dEJvdW5jZTpmdW5jdGlvbihnLGgsZixqLGkpe2lmKGg8aS8yKXtyZXR1cm4gZC5lYXNpbmcuZWFzZUluQm91bmNlKGcsaCoyLDAsaixpKSowLjUrZn1yZXR1cm4gZC5lYXNpbmcuZWFzZU91dEJvdW5jZShnLGgqMi1pLDAsaixpKSowLjUraiowLjUrZn19KX0pKGpRdWVyeSk7Oy8qCisgKiBqUXVlcnkgVUkgRWZmZWN0cyBCbGluZCAxLjcuMgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoTUlULUxJQ0VOU0UudHh0KQorICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBsaWNlbnNlcy4KKyAqCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0VmZmVjdHMvQmxpbmQKKyAqCisgKiBEZXBlbmRzOgorICoJZWZmZWN0cy5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLmVmZmVjdHMuYmxpbmQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGM9WyJwb3NpdGlvbiIsInRvcCIsImxlZnQiXTt2YXIgaD1hLmVmZmVjdHMuc2V0TW9kZShkLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpO3ZhciBnPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI7YS5lZmZlY3RzLnNhdmUoZCxjKTtkLnNob3coKTt2YXIgaj1hLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihkKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSk7dmFyIGU9KGc9PSJ2ZXJ0aWNhbCIpPyJoZWlnaHQiOiJ3aWR0aCI7dmFyIGk9KGc9PSJ2ZXJ0aWNhbCIpP2ouaGVpZ2h0KCk6ai53aWR0aCgpO2lmKGg9PSJzaG93Iil7ai5jc3MoZSwwKX12YXIgZj17fTtmW2VdPWg9PSJzaG93Ij9pOjA7ai5hbmltYXRlKGYsYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7aWYoaD09ImhpZGUiKXtkLmhpZGUoKX1hLmVmZmVjdHMucmVzdG9yZShkLGMpO2EuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGQpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkoZFswXSxhcmd1bWVudHMpfWQuZGVxdWV1ZSgpfSl9KX19KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIEVmZmVjdHMgQm91bmNlIDEuNy4yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCisgKiBhbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorICoKKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9Cb3VuY2UKKyAqCisgKiBEZXBlbmRzOgorICoJZWZmZWN0cy5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLmVmZmVjdHMuYm91bmNlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxsPVsicG9zaXRpb24iLCJ0b3AiLCJsZWZ0Il07dmFyIGs9YS5lZmZlY3RzLnNldE1vZGUoZSxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpO3ZhciBuPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ1cCI7dmFyIGM9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMDt2YXIgZD1iLm9wdGlvbnMudGltZXN8fDU7dmFyIGc9Yi5kdXJhdGlvbnx8MjUwO2lmKC9zaG93fGhpZGUvLnRlc3Qoaykpe2wucHVzaCgib3BhY2l0eSIpfWEuZWZmZWN0cy5zYXZlKGUsbCk7ZS5zaG93KCk7YS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoZSk7dmFyIGY9KG49PSJ1cCJ8fG49PSJkb3duIik/InRvcCI6ImxlZnQiO3ZhciBwPShuPT0idXAifHxuPT0ibGVmdCIpPyJwb3MiOiJuZWciO3ZhciBjPWIub3B0aW9ucy5kaXN0YW5jZXx8KGY9PSJ0b3AiP2Uub3V0ZXJIZWlnaHQoe21hcmdpbjp0cnVlfSkvMzplLm91dGVyV2lkdGgoe21hcmdpbjp0cnVlfSkvMyk7aWYoaz09InNob3ciKXtlLmNzcygib3BhY2l0eSIsMCkuY3NzKGYscD09InBvcyI/LWM6Yyl9aWYoaz09ImhpZGUiKXtjPWMvKGQqMil9aWYoayE9ImhpZGUiKXtkLS19aWYoaz09InNob3ciKXt2YXIgaD17b3BhY2l0eToxfTtoW2ZdPShwPT0icG9zIj8iKz0iOiItPSIpK2M7ZS5hbmltYXRlKGgsZy8yLGIub3B0aW9ucy5lYXNpbmcpO2M9Yy8yO2QtLX1mb3IodmFyIGo9MDtqPGQ7aisrKXt2YXIgbz17fSxtPXt9O29bZl09KHA9PSJwb3MiPyItPSI6Iis9IikrYzttW2ZdPShwPT0icG9zIj8iKz0iOiItPSIpK2M7ZS5hbmltYXRlKG8sZy8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUobSxnLzIsYi5vcHRpb25zLmVhc2luZyk7Yz0oaz09ImhpZGUiKT9jKjI6Yy8yfWlmKGs9PSJoaWRlIil7dmFyIGg9e29wYWNpdHk6MH07aFtmXT0ocD09InBvcyI/Ii09IjoiKz0iKStjO2UuYW5pbWF0ZShoLGcvMixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ZS5oaWRlKCk7YS5lZmZlY3RzLnJlc3RvcmUoZSxsKTthLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihlKTtpZihiLmNhbGxiYWNrKXtiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KX1lbHNle3ZhciBvPXt9LG09e307b1tmXT0ocD09InBvcyI/Ii09IjoiKz0iKStjO21bZl09KHA9PSJwb3MiPyIrPSI6Ii09IikrYztlLmFuaW1hdGUobyxnLzIsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShtLGcvMixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7YS5lZmZlY3RzLnJlc3RvcmUoZSxsKTthLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihlKTtpZihiLmNhbGxiYWNrKXtiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KX1lLnF1ZXVlKCJmeCIsZnVuY3Rpb24oKXtlLmRlcXVldWUoKX0pO2UuZGVxdWV1ZSgpfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIENsaXAgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL0NsaXAKKyAqCisgKiBEZXBlbmRzOgorICoJZWZmZWN0cy5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLmVmZmVjdHMuY2xpcD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBmPWEodGhpcyksaj1bInBvc2l0aW9uIiwidG9wIiwibGVmdCIsImhlaWdodCIsIndpZHRoIl07dmFyIGk9YS5lZmZlY3RzLnNldE1vZGUoZixiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTt2YXIgaz1iLm9wdGlvbnMuZGlyZWN0aW9ufHwidmVydGljYWwiO2EuZWZmZWN0cy5zYXZlKGYsaik7Zi5zaG93KCk7dmFyIGM9YS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoZikuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO3ZhciBlPWZbMF0udGFnTmFtZT09IklNRyI/YzpmO3ZhciBnPXtzaXplOihrPT0idmVydGljYWwiKT8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOihrPT0idmVydGljYWwiKT8idG9wIjoibGVmdCJ9O3ZhciBkPShrPT0idmVydGljYWwiKT9lLmhlaWdodCgpOmUud2lkdGgoKTtpZihpPT0ic2hvdyIpe2UuY3NzKGcuc2l6ZSwwKTtlLmNzcyhnLnBvc2l0aW9uLGQvMil9dmFyIGg9e307aFtnLnNpemVdPWk9PSJzaG93Ij9kOjA7aFtnLnBvc2l0aW9uXT1pPT0ic2hvdyI/MDpkLzI7ZS5hbmltYXRlKGgse3F1ZXVlOmZhbHNlLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtpZihpPT0iaGlkZSIpe2YuaGlkZSgpfWEuZWZmZWN0cy5yZXN0b3JlKGYsaik7YS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoZik7aWYoYi5jYWxsYmFjayl7Yi5jYWxsYmFjay5hcHBseShmWzBdLGFyZ3VtZW50cyl9Zi5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIEVmZmVjdHMgRHJvcCAxLjcuMgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoTUlULUxJQ0VOU0UudHh0KQorICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBsaWNlbnNlcy4KKyAqCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0VmZmVjdHMvRHJvcAorICoKKyAqIERlcGVuZHM6CisgKgllZmZlY3RzLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2EuZWZmZWN0cy5kcm9wPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJsZWZ0Iiwib3BhY2l0eSJdO3ZhciBpPWEuZWZmZWN0cy5zZXRNb2RlKGUsYi5vcHRpb25zLm1vZGV8fCJoaWRlIik7dmFyIGg9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiO2EuZWZmZWN0cy5zYXZlKGUsZCk7ZS5zaG93KCk7YS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoZSk7dmFyIGY9KGg9PSJ1cCJ8fGg9PSJkb3duIik/InRvcCI6ImxlZnQiO3ZhciBjPShoPT0idXAifHxoPT0ibGVmdCIpPyJwb3MiOiJuZWciO3ZhciBqPWIub3B0aW9ucy5kaXN0YW5jZXx8KGY9PSJ0b3AiP2Uub3V0ZXJIZWlnaHQoe21hcmdpbjp0cnVlfSkvMjplLm91dGVyV2lkdGgoe21hcmdpbjp0cnVlfSkvMik7aWYoaT09InNob3ciKXtlLmNzcygib3BhY2l0eSIsMCkuY3NzKGYsYz09InBvcyI/LWo6ail9dmFyIGc9e29wYWNpdHk6aT09InNob3ciPzE6MH07Z1tmXT0oaT09InNob3ciPyhjPT0icG9zIj8iKz0iOiItPSIpOihjPT0icG9zIj8iLT0iOiIrPSIpKStqO2UuYW5pbWF0ZShnLHtxdWV1ZTpmYWxzZSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7aWYoaT09ImhpZGUiKXtlLmhpZGUoKX1hLmVmZmVjdHMucmVzdG9yZShlLGQpO2EuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGUpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfWUuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIEV4cGxvZGUgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL0V4cGxvZGUKKyAqCisgKiBEZXBlbmRzOgorICoJZWZmZWN0cy5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLmVmZmVjdHMuZXhwbG9kZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBrPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjM7dmFyIGU9Yi5vcHRpb25zLnBpZWNlcz9NYXRoLnJvdW5kKE1hdGguc3FydChiLm9wdGlvbnMucGllY2VzKSk6MztiLm9wdGlvbnMubW9kZT1iLm9wdGlvbnMubW9kZT09InRvZ2dsZSI/KGEodGhpcykuaXMoIjp2aXNpYmxlIik/ImhpZGUiOiJzaG93Iik6Yi5vcHRpb25zLm1vZGU7dmFyIGg9YSh0aGlzKS5zaG93KCkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7dmFyIGw9aC5vZmZzZXQoKTtsLnRvcC09cGFyc2VJbnQoaC5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MDtsLmxlZnQtPXBhcnNlSW50KGguY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwO3ZhciBnPWgub3V0ZXJXaWR0aCh0cnVlKTt2YXIgYz1oLm91dGVySGVpZ2h0KHRydWUpO2Zvcih2YXIgZj0wO2Y8aztmKyspe2Zvcih2YXIgZD0wO2Q8ZTtkKyspe2guY2xvbmUoKS5hcHBlbmRUbygiYm9keSIpLndyYXAoIjxkaXY+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6InZpc2libGUiLGxlZnQ6LWQqKGcvZSksdG9wOi1mKihjL2spfSkucGFyZW50KCkuYWRkQ2xhc3MoInVpLWVmZmVjdHMtZXhwbG9kZSIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDpnL2UsaGVpZ2h0OmMvayxsZWZ0OmwubGVmdCtkKihnL2UpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhkLU1hdGguZmxvb3IoZS8yKSkqKGcvZSk6MCksdG9wOmwudG9wK2YqKGMvaykrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/KGYtTWF0aC5mbG9vcihrLzIpKSooYy9rKTowKSxvcGFjaXR5OmIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDoxfSkuYW5pbWF0ZSh7bGVmdDpsLmxlZnQrZCooZy9lKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihkLU1hdGguZmxvb3IoZS8yKSkqKGcvZSkpLHRvcDpsLnRvcCtmKihjL2spKyhiLm9wdGlvbnMubW9kZT09InNob3ciPzA6KGYtTWF0aC5mbG9vcihrLzIpKSooYy9rKSksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzE6MH0sYi5kdXJhdGlvbnx8NTAwKX19c2V0VGltZW91dChmdW5jdGlvbigpe2Iub3B0aW9ucy5tb2RlPT0ic2hvdyI/aC5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSk6aC5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkuaGlkZSgpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkoaFswXSl9aC5kZXF1ZXVlKCk7YSgiZGl2LnVpLWVmZmVjdHMtZXhwbG9kZSIpLnJlbW92ZSgpfSxiLmR1cmF0aW9ufHw1MDApfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIEZvbGQgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL0ZvbGQKKyAqCisgKiBEZXBlbmRzOgorICoJZWZmZWN0cy5jb3JlLmpzCisgKi8KKyhmdW5jdGlvbihhKXthLmVmZmVjdHMuZm9sZD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksaz1bInBvc2l0aW9uIiwidG9wIiwibGVmdCJdO3ZhciBoPWEuZWZmZWN0cy5zZXRNb2RlKGUsYi5vcHRpb25zLm1vZGV8fCJoaWRlIik7dmFyIG89Yi5vcHRpb25zLnNpemV8fDE1O3ZhciBuPSEoIWIub3B0aW9ucy5ob3JpekZpcnN0KTt2YXIgZz1iLmR1cmF0aW9uP2IuZHVyYXRpb24vMjphLmZ4LnNwZWVkcy5fZGVmYXVsdC8yO2EuZWZmZWN0cy5zYXZlKGUsayk7ZS5zaG93KCk7dmFyIGQ9YS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoZSkuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO3ZhciBpPSgoaD09InNob3ciKSE9bik7dmFyIGY9aT9bIndpZHRoIiwiaGVpZ2h0Il06WyJoZWlnaHQiLCJ3aWR0aCJdO3ZhciBjPWk/W2Qud2lkdGgoKSxkLmhlaWdodCgpXTpbZC5oZWlnaHQoKSxkLndpZHRoKCldO3ZhciBqPS8oWzAtOV0rKSUvLmV4ZWMobyk7aWYoail7bz1wYXJzZUludChqWzFdLDEwKS8xMDAqY1toPT0iaGlkZSI/MDoxXX1pZihoPT0ic2hvdyIpe2QuY3NzKG4/e2hlaWdodDowLHdpZHRoOm99OntoZWlnaHQ6byx3aWR0aDowfSl9dmFyIG09e30sbD17fTttW2ZbMF1dPWg9PSJzaG93Ij9jWzBdOm87bFtmWzFdXT1oPT0ic2hvdyI/Y1sxXTowO2QuYW5pbWF0ZShtLGcsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShsLGcsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2lmKGg9PSJoaWRlIil7ZS5oaWRlKCl9YS5lZmZlY3RzLnJlc3RvcmUoZSxrKTthLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihlKTtpZihiLmNhbGxiYWNrKXtiLmNhbGxiYWNrLmFwcGx5KGVbMF0sYXJndW1lbnRzKX1lLmRlcXVldWUoKX0pfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIEhpZ2hsaWdodCAxLjcuMgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoTUlULUxJQ0VOU0UudHh0KQorICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBsaWNlbnNlcy4KKyAqCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0VmZmVjdHMvSGlnaGxpZ2h0CisgKgorICogRGVwZW5kczoKKyAqCWVmZmVjdHMuY29yZS5qcworICovCisoZnVuY3Rpb24oYSl7YS5lZmZlY3RzLmhpZ2hsaWdodD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksZD1bImJhY2tncm91bmRJbWFnZSIsImJhY2tncm91bmRDb2xvciIsIm9wYWNpdHkiXTt2YXIgaD1hLmVmZmVjdHMuc2V0TW9kZShlLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpO3ZhciBjPWIub3B0aW9ucy5jb2xvcnx8IiNmZmZmOTkiO3ZhciBnPWUuY3NzKCJiYWNrZ3JvdW5kQ29sb3IiKTthLmVmZmVjdHMuc2F2ZShlLGQpO2Uuc2hvdygpO2UuY3NzKHtiYWNrZ3JvdW5kSW1hZ2U6Im5vbmUiLGJhY2tncm91bmRDb2xvcjpjfSk7dmFyIGY9e2JhY2tncm91bmRDb2xvcjpnfTtpZihoPT0iaGlkZSIpe2Yub3BhY2l0eT0wfWUuYW5pbWF0ZShmLHtxdWV1ZTpmYWxzZSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7aWYoaD09ImhpZGUiKXtlLmhpZGUoKX1hLmVmZmVjdHMucmVzdG9yZShlLGQpO2lmKGg9PSJzaG93IiYmYS5icm93c2VyLm1zaWUpe3RoaXMuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKX1pZihiLmNhbGxiYWNrKXtiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1lLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7Oy8qCisgKiBqUXVlcnkgVUkgRWZmZWN0cyBQdWxzYXRlIDEuNy4yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCisgKiBhbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorICoKKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9QdWxzYXRlCisgKgorICogRGVwZW5kczoKKyAqCWVmZmVjdHMuY29yZS5qcworICovCisoZnVuY3Rpb24oYSl7YS5lZmZlY3RzLnB1bHNhdGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpO3ZhciBnPWEuZWZmZWN0cy5zZXRNb2RlKGQsYi5vcHRpb25zLm1vZGV8fCJzaG93Iik7dmFyIGY9Yi5vcHRpb25zLnRpbWVzfHw1O3ZhciBlPWIuZHVyYXRpb24/Yi5kdXJhdGlvbi8yOmEuZnguc3BlZWRzLl9kZWZhdWx0LzI7aWYoZz09ImhpZGUiKXtmLS19aWYoZC5pcygiOmhpZGRlbiIpKXtkLmNzcygib3BhY2l0eSIsMCk7ZC5zaG93KCk7ZC5hbmltYXRlKHtvcGFjaXR5OjF9LGUsYi5vcHRpb25zLmVhc2luZyk7Zj1mLTJ9Zm9yKHZhciBjPTA7YzxmO2MrKyl7ZC5hbmltYXRlKHtvcGFjaXR5OjB9LGUsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZSh7b3BhY2l0eToxfSxlLGIub3B0aW9ucy5lYXNpbmcpfWlmKGc9PSJoaWRlIil7ZC5hbmltYXRlKHtvcGFjaXR5OjB9LGUsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2QuaGlkZSgpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pfWVsc2V7ZC5hbmltYXRlKHtvcGFjaXR5OjB9LGUsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZSh7b3BhY2l0eToxfSxlLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtpZihiLmNhbGxiYWNrKXtiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KX1kLnF1ZXVlKCJmeCIsZnVuY3Rpb24oKXtkLmRlcXVldWUoKX0pO2QuZGVxdWV1ZSgpfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIFNjYWxlIDEuNy4yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCisgKiBhbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorICoKKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9TY2FsZQorICoKKyAqIERlcGVuZHM6CisgKgllZmZlY3RzLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2EuZWZmZWN0cy5wdWZmPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGY9YSh0aGlzKTt2YXIgYz1hLmV4dGVuZCh0cnVlLHt9LGIub3B0aW9ucyk7dmFyIGg9YS5lZmZlY3RzLnNldE1vZGUoZixiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTt2YXIgZz1wYXJzZUludChiLm9wdGlvbnMucGVyY2VudCwxMCl8fDE1MDtjLmZhZGU9dHJ1ZTt2YXIgZT17aGVpZ2h0OmYuaGVpZ2h0KCksd2lkdGg6Zi53aWR0aCgpfTt2YXIgZD1nLzEwMDtmLmZyb209KGg9PSJoaWRlIik/ZTp7aGVpZ2h0OmUuaGVpZ2h0KmQsd2lkdGg6ZS53aWR0aCpkfTtjLmZyb209Zi5mcm9tO2MucGVyY2VudD0oaD09ImhpZGUiKT9nOjEwMDtjLm1vZGU9aDtmLmVmZmVjdCgic2NhbGUiLGMsYi5kdXJhdGlvbixiLmNhbGxiYWNrKTtmLmRlcXVldWUoKX0pfTthLmVmZmVjdHMuc2NhbGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgZz1hKHRoaXMpO3ZhciBkPWEuZXh0ZW5kKHRydWUse30sYi5vcHRpb25zKTt2YXIgaj1hLmVmZmVjdHMuc2V0TW9kZShnLGIub3B0aW9ucy5tb2RlfHwiZWZmZWN0Iik7dmFyIGg9cGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApfHwocGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApPT0wPzA6KGo9PSJoaWRlIj8wOjEwMCkpO3ZhciBpPWIub3B0aW9ucy5kaXJlY3Rpb258fCJib3RoIjt2YXIgYz1iLm9wdGlvbnMub3JpZ2luO2lmKGohPSJlZmZlY3QiKXtkLm9yaWdpbj1jfHxbIm1pZGRsZSIsImNlbnRlciJdO2QucmVzdG9yZT10cnVlfXZhciBmPXtoZWlnaHQ6Zy5oZWlnaHQoKSx3aWR0aDpnLndpZHRoKCl9O2cuZnJvbT1iLm9wdGlvbnMuZnJvbXx8KGo9PSJzaG93Ij97aGVpZ2h0OjAsd2lkdGg6MH06Zik7dmFyIGU9e3k6aSE9Imhvcml6b250YWwiPyhoLzEwMCk6MSx4OmkhPSJ2ZXJ0aWNhbCI/KGgvMTAwKToxfTtnLnRvPXtoZWlnaHQ6Zi5oZWlnaHQqZS55LHdpZHRoOmYud2lkdGgqZS54fTtpZihiLm9wdGlvbnMuZmFkZSl7aWYoaj09InNob3ciKXtnLmZyb20ub3BhY2l0eT0wO2cudG8ub3BhY2l0eT0xfWlmKGo9PSJoaWRlIil7Zy5mcm9tLm9wYWNpdHk9MTtnLnRvLm9wYWNpdHk9MH19ZC5mcm9tPWcuZnJvbTtkLnRvPWcudG87ZC5tb2RlPWo7Zy5lZmZlY3QoInNpemUiLGQsYi5kdXJhdGlvbixiLmNhbGxiYWNrKTtnLmRlcXVldWUoKX0pfTthLmVmZmVjdHMuc2l6ZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksbj1bInBvc2l0aW9uIiwidG9wIiwibGVmdCIsIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il07dmFyIG09WyJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXTt2YXIgaj1bIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciXTt2YXIgcD1bImZvbnRTaXplIl07dmFyIGs9WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXTt2YXIgZj1bImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdO3ZhciBnPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKTt2YXIgaT1iLm9wdGlvbnMucmVzdG9yZXx8ZmFsc2U7dmFyIGU9Yi5vcHRpb25zLnNjYWxlfHwiYm90aCI7dmFyIG89Yi5vcHRpb25zLm9yaWdpbjt2YXIgZD17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209Yi5vcHRpb25zLmZyb218fGQ7Yy50bz1iLm9wdGlvbnMudG98fGQ7aWYobyl7dmFyIGg9YS5lZmZlY3RzLmdldEJhc2VsaW5lKG8sZCk7Yy5mcm9tLnRvcD0oZC5oZWlnaHQtYy5mcm9tLmhlaWdodCkqaC55O2MuZnJvbS5sZWZ0PShkLndpZHRoLWMuZnJvbS53aWR0aCkqaC54O2MudG8udG9wPShkLmhlaWdodC1jLnRvLmhlaWdodCkqaC55O2MudG8ubGVmdD0oZC53aWR0aC1jLnRvLndpZHRoKSpoLnh9dmFyIGw9e2Zyb206e3k6Yy5mcm9tLmhlaWdodC9kLmhlaWdodCx4OmMuZnJvbS53aWR0aC9kLndpZHRofSx0bzp7eTpjLnRvLmhlaWdodC9kLmhlaWdodCx4OmMudG8ud2lkdGgvZC53aWR0aH19O2lmKGU9PSJib3gifHxlPT0iYm90aCIpe2lmKGwuZnJvbS55IT1sLnRvLnkpe249bi5jb25jYXQoayk7Yy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsayxsLmZyb20ueSxjLmZyb20pO2MudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxrLGwudG8ueSxjLnRvKX1pZihsLmZyb20ueCE9bC50by54KXtuPW4uY29uY2F0KGYpO2MuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGYsbC5mcm9tLngsYy5mcm9tKTtjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZixsLnRvLngsYy50byl9fWlmKGU9PSJjb250ZW50Inx8ZT09ImJvdGgiKXtpZihsLmZyb20ueSE9bC50by55KXtuPW4uY29uY2F0KHApO2MuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLHAsbC5mcm9tLnksYy5mcm9tKTtjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMscCxsLnRvLnksYy50byl9fWEuZWZmZWN0cy5zYXZlKGMsaT9uOm0pO2Muc2hvdygpO2EuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpO2MuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpLmNzcyhjLmZyb20pO2lmKGU9PSJjb250ZW50Inx8ZT09ImJvdGgiKXtrPWsuY29uY2F0KFsibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIl0pLmNvbmNhdChwKTtmPWYuY29uY2F0KFsibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0Il0pO2o9bi5jb25jYXQoaykuY29uY2F0KGYpO2MuZmluZCgiKlt3aWR0aF0iKS5lYWNoKGZ1bmN0aW9uKCl7Y2hpbGQ9YSh0aGlzKTtpZihpKXthLmVmZmVjdHMuc2F2ZShjaGlsZCxqKX12YXIgcT17aGVpZ2h0OmNoaWxkLmhlaWdodCgpLHdpZHRoOmNoaWxkLndpZHRoKCl9O2NoaWxkLmZyb209e2hlaWdodDpxLmhlaWdodCpsLmZyb20ueSx3aWR0aDpxLndpZHRoKmwuZnJvbS54fTtjaGlsZC50bz17aGVpZ2h0OnEuaGVpZ2h0KmwudG8ueSx3aWR0aDpxLndpZHRoKmwudG8ueH07aWYobC5mcm9tLnkhPWwudG8ueSl7Y2hpbGQuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjaGlsZCxrLGwuZnJvbS55LGNoaWxkLmZyb20pO2NoaWxkLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGNoaWxkLGssbC50by55LGNoaWxkLnRvKX1pZihsLmZyb20ueCE9bC50by54KXtjaGlsZC5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGNoaWxkLGYsbC5mcm9tLngsY2hpbGQuZnJvbSk7Y2hpbGQudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oY2hpbGQsZixsLnRvLngsY2hpbGQudG8pfWNoaWxkLmNzcyhjaGlsZC5mcm9tKTtjaGlsZC5hbmltYXRlKGNoaWxkLnRvLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2lmKGkpe2EuZWZmZWN0cy5yZXN0b3JlKGNoaWxkLGopfX0pfSl9Yy5hbmltYXRlKGMudG8se3F1ZXVlOmZhbHNlLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtpZihnPT0iaGlkZSIpe2MuaGlkZSgpfWEuZWZmZWN0cy5yZXN0b3JlKGMsaT9uOm0pO2EuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfWMuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIFNoYWtlIDEuNy4yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCisgKiBhbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorICoKKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9TaGFrZQorICoKKyAqIERlcGVuZHM6CisgKgllZmZlY3RzLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2EuZWZmZWN0cy5zaGFrZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksbD1bInBvc2l0aW9uIiwidG9wIiwibGVmdCJdO3ZhciBrPWEuZWZmZWN0cy5zZXRNb2RlKGUsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKTt2YXIgbj1iLm9wdGlvbnMuZGlyZWN0aW9ufHwibGVmdCI7dmFyIGM9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMDt2YXIgZD1iLm9wdGlvbnMudGltZXN8fDM7dmFyIGc9Yi5kdXJhdGlvbnx8Yi5vcHRpb25zLmR1cmF0aW9ufHwxNDA7YS5lZmZlY3RzLnNhdmUoZSxsKTtlLnNob3coKTthLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihlKTt2YXIgZj0obj09InVwInx8bj09ImRvd24iKT8idG9wIjoibGVmdCI7dmFyIHA9KG49PSJ1cCJ8fG49PSJsZWZ0Iik/InBvcyI6Im5lZyI7dmFyIGg9e30sbz17fSxtPXt9O2hbZl09KHA9PSJwb3MiPyItPSI6Iis9IikrYztvW2ZdPShwPT0icG9zIj8iKz0iOiItPSIpK2MqMjttW2ZdPShwPT0icG9zIj8iLT0iOiIrPSIpK2MqMjtlLmFuaW1hdGUoaCxnLGIub3B0aW9ucy5lYXNpbmcpO2Zvcih2YXIgaj0xO2o8ZDtqKyspe2UuYW5pbWF0ZShvLGcsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShtLGcsYi5vcHRpb25zLmVhc2luZyl9ZS5hbmltYXRlKG8sZyxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKGgsZy8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthLmVmZmVjdHMucmVzdG9yZShlLGwpO2EuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGUpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pO2UucXVldWUoImZ4IixmdW5jdGlvbigpe2UuZGVxdWV1ZSgpfSk7ZS5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOzsvKgorICogalF1ZXJ5IFVJIEVmZmVjdHMgU2xpZGUgMS43LjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL1NsaWRlCisgKgorICogRGVwZW5kczoKKyAqCWVmZmVjdHMuY29yZS5qcworICovCisoZnVuY3Rpb24oYSl7YS5lZmZlY3RzLnNsaWRlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJsZWZ0Il07dmFyIGk9YS5lZmZlY3RzLnNldE1vZGUoZSxiLm9wdGlvbnMubW9kZXx8InNob3ciKTt2YXIgaD1iLm9wdGlvbnMuZGlyZWN0aW9ufHwibGVmdCI7YS5lZmZlY3RzLnNhdmUoZSxkKTtlLnNob3coKTthLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihlKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSk7dmFyIGY9KGg9PSJ1cCJ8fGg9PSJkb3duIik/InRvcCI6ImxlZnQiO3ZhciBjPShoPT0idXAifHxoPT0ibGVmdCIpPyJwb3MiOiJuZWciO3ZhciBqPWIub3B0aW9ucy5kaXN0YW5jZXx8KGY9PSJ0b3AiP2Uub3V0ZXJIZWlnaHQoe21hcmdpbjp0cnVlfSk6ZS5vdXRlcldpZHRoKHttYXJnaW46dHJ1ZX0pKTtpZihpPT0ic2hvdyIpe2UuY3NzKGYsYz09InBvcyI/LWo6ail9dmFyIGc9e307Z1tmXT0oaT09InNob3ciPyhjPT0icG9zIj8iKz0iOiItPSIpOihjPT0icG9zIj8iLT0iOiIrPSIpKStqO2UuYW5pbWF0ZShnLHtxdWV1ZTpmYWxzZSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7aWYoaT09ImhpZGUiKXtlLmhpZGUoKX1hLmVmZmVjdHMucmVzdG9yZShlLGQpO2EuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGUpO2lmKGIuY2FsbGJhY2spe2IuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfWUuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyoKKyAqIGpRdWVyeSBVSSBFZmZlY3RzIFRyYW5zZmVyIDEuNy4yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCisgKiBhbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorICoKKyAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9UcmFuc2ZlcgorICoKKyAqIERlcGVuZHM6CisgKgllZmZlY3RzLmNvcmUuanMKKyAqLworKGZ1bmN0aW9uKGEpe2EuZWZmZWN0cy50cmFuc2Zlcj1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBmPWEodGhpcyksaD1hKGIub3B0aW9ucy50byksZT1oLm9mZnNldCgpLGc9e3RvcDplLnRvcCxsZWZ0OmUubGVmdCxoZWlnaHQ6aC5pbm5lckhlaWdodCgpLHdpZHRoOmguaW5uZXJXaWR0aCgpfSxkPWYub2Zmc2V0KCksYz1hKCc8ZGl2IGNsYXNzPSJ1aS1lZmZlY3RzLXRyYW5zZmVyIj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hZGRDbGFzcyhiLm9wdGlvbnMuY2xhc3NOYW1lKS5jc3Moe3RvcDpkLnRvcCxsZWZ0OmQubGVmdCxoZWlnaHQ6Zi5pbm5lckhlaWdodCgpLHdpZHRoOmYuaW5uZXJXaWR0aCgpLHBvc2l0aW9uOiJhYnNvbHV0ZSJ9KS5hbmltYXRlKGcsYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7Yy5yZW1vdmUoKTsoYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShmWzBdLGFyZ3VtZW50cykpO2YuZGVxdWV1ZSgpfSl9KX19KShqUXVlcnkpOzsKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2pxdWVyeS5hbGVydHMuY3NzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvanF1ZXJ5LmFsZXJ0cy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMTg3OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2pxdWVyeS5hbGVydHMuY3NzCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3BvcHVwX2NvbnRhaW5lciB7CisJZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOworCWZvbnQtc2l6ZTogMTJweDsKKwltaW4td2lkdGg6IDMwMHB4OyAvKiBEaWFsb2cgd2lsbCBiZSBubyBzbWFsbGVyIHRoYW4gdGhpcyAqLworCW1heC13aWR0aDogNjAwcHg7IC8qIERpYWxvZyB3aWxsIHdyYXAgYWZ0ZXIgdGhpcyB3aWR0aCAqLworCWJhY2tncm91bmQ6ICNGRkY7CisJYm9yZGVyOiBzb2xpZCA1cHggIzk5OTsKKwljb2xvcjogIzAwMDsKKwktbW96LWJvcmRlci1yYWRpdXM6IDVweDsKKwktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKKwlib3JkZXItcmFkaXVzOiA1cHg7Cit9CisKKyNwb3B1cF90aXRsZSB7CisJZm9udC1zaXplOiAxNHB4OworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwlsaW5lLWhlaWdodDogMS43NWVtOworCWNvbG9yOiAjNjY2OworCWJhY2tncm91bmQ6ICNDQ0MgdXJsKHRpdGxlLmdpZikgdG9wIHJlcGVhdC14OworCWJvcmRlcjogc29saWQgMXB4ICNGRkY7CisJYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICM5OTk7CisJY3Vyc29yOiBkZWZhdWx0OworCXBhZGRpbmc6IDBlbTsKKwltYXJnaW46IDBlbTsKK30KKworI3BvcHVwX2NvbnRlbnQgeworCWJhY2tncm91bmQ6IDE2cHggMTZweCBuby1yZXBlYXQgdXJsKGluZm8uZ2lmKTsKKwlwYWRkaW5nOiAxZW0gMS43NWVtOworCW1hcmdpbjogMGVtOworfQorCisjcG9wdXBfY29udGVudC5hbGVydCB7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKGluZm8uZ2lmKTsKK30KKworI3BvcHVwX2NvbnRlbnQuY29uZmlybSB7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKGltcG9ydGFudC5naWYpOworfQorCisjcG9wdXBfY29udGVudC5wcm9tcHQgeworCWJhY2tncm91bmQtaW1hZ2U6IHVybChoZWxwLmdpZik7Cit9CisKKyNwb3B1cF9tZXNzYWdlIHsKKwlwYWRkaW5nLWxlZnQ6IDQ4cHg7Cit9CisKKyNwb3B1cF9wYW5lbCB7CisJdGV4dC1hbGlnbjogY2VudGVyOworCW1hcmdpbjogMWVtIDBlbSAwZW0gMWVtOworfQorCisjcG9wdXBfcHJvbXB0IHsKKwltYXJnaW46IC41ZW0gMGVtOworfQorLnBvcHVwX211bHRpUHJvbXB0IHsKKwltYXJnaW46IDAuNWVtIDBlbTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2pxdWVyeS5hbGVydHMuanMgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9qcXVlcnkuYWxlcnRzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjgxMjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9qcXVlcnkuYWxlcnRzLmpzCkBAIC0wLDAgKzEsMzE1IEBACisvLyBqUXVlcnkgQWxlcnQgRGlhbG9ncyBQbHVnaW4NCisvLw0KKy8vIFZlcnNpb24gMS4xDQorLy8NCisvLyBDb3J5IFMuTi4gTGFWaXNrYQ0KKy8vIEEgQmVhdXRpZnVsIFNpdGUgKGh0dHA6Ly9hYmVhdXRpZnVsc2l0ZS5uZXQvKQ0KKy8vIDE0IE1heSAyMDA5DQorLy8NCisvLyBWaXNpdCBodHRwOi8vYWJlYXV0aWZ1bHNpdGUubmV0L25vdGVib29rLzg3IGZvciBtb3JlIGluZm9ybWF0aW9uDQorLy8NCisvLyBVc2FnZToNCisvLwkJakFsZXJ0KCBtZXNzYWdlLCBbdGl0bGUsIGNhbGxiYWNrXSApDQorLy8JCWpDb25maXJtKCBtZXNzYWdlLCBbdGl0bGUsIGNhbGxiYWNrXSApDQorLy8JCWpQcm9tcHQoIG1lc3NhZ2UsIFt2YWx1ZSwgdGl0bGUsIGNhbGxiYWNrXSApDQorLy8JCWpQcm9tcHRNdWx0aSggbWVzc2FnZSwgW3ZhbHVlLCB0aXRsZSwgY2FsbGJhY2tdICkNCisvLyANCisvLyBIaXN0b3J5Og0KKy8vDQorLy8JCTEuMDAgLSBSZWxlYXNlZCAoMjkgRGVjZW1iZXIgMjAwOCkNCisvLw0KKy8vCQkxLjAxIC0gRml4ZWQgYnVnIHdoZXJlIHVuYmluZGluZyB3b3VsZCBkZXN0cm95IGFsbCByZXNpemUgZXZlbnRzDQorLy8NCisvLyBMaWNlbnNlOg0KKy8vIA0KKy8vIFRoaXMgcGx1Z2luIGlzIGR1YWwtbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUgTUlUIExpY2Vuc2UgYW5kDQorLy8gaXMgY29weXJpZ2h0IDIwMDggQSBCZWF1dGlmdWwgU2l0ZSwgTExDLiANCisvLw0KKy8vIFVQREFURUQgYnkgQW5kcmV3IEhhcnQgKGFuZHJldy5mLmhhcnRAanBsLm5hc2EuZ292KSB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgDQorLy8gbXVsdGktdmFsdWVkIHByb21wdC4gVGhlIG11bHRpLXZhbHVlZCBwcm9tcHQgb2ZmZXJzIHRoZSB1c2VyIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkNCisvLyBtb3JlIHRoYW4gb25lIHZhbHVlIGZvciBhIGdpdmVuIGlkZW50aWZpZXIuIElmIHByb3ZpZGluZyBzZWVkIHZhbHVlcyAodmFsdWVzIHRvIA0KKy8vIHBsYWNlIGluIHRoZSBlZGl0b3Igd2hlbiBmaXJzdCBzaG93aW5nIHRoZSBwcm9tcHQsIHRoZXkgbmVlZCB0byBhZGhlcmUgdG8gdGhlIGZvbGxvd2luZw0KKy8vIHR3byBjb252ZW50aW9uczoNCisvLw0KKy8vIAkxKSBJbmRpdmlkdWFsIHZhbHVlcyBtdXN0IGJlIHdyYXBwZWQgaW4gPHNwYW4vPiB0YWdzDQorLy8gIDIpIEFsbCA8c3Bhbi8+IHRhZ3MgbXVzdCBiZSB3cmFwcGVkIGluIGEgc2luZ2xlIGNvbnRhaW5lciB0YWcgKGNhbiBiZSBhbnl0aGluZyAobGksZGl2LHRkLGV0YykpDQorLy8NCisvLyBXaGVuIGNhbGxpbmcgalByb21wdE11bHRpLCBwYXNzIGEgaGFuZGxlIHRvIHRoZSBjb250YWluZXIgdGFnIGFzIHRoZSAndmFsdWUnIHBhcmFtZXRlci4NCisvLyBFeGFtcGxlOg0KKy8vDQorLy8gICAgZ2l2ZW4gaHRtbDogPGxpIGlkPSJteVZhbHVlcyI+PHNwYW4+dmFsdWUxPC9zcGFuPiwgPHNwYW4+dmFsdWUyPC9zcGFuPjwvbGk+DQorLy8NCisvLyAgICB5b3Ugd291bGQgY2FsbCBqUHJvbXB0TXVsdGkoJ1VwZGF0ZSB2YWx1ZXMnLCQoJyNteVZhbHVlcycpLCd0aXRsZScsY2FsbGJhY2tGbik7DQorLy8NCisvLyBJZiBhIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIChhbmQgb25seSBpZiB0aGUgdXNlciBjbGlja3MgJ1NBVkUnKSwgdGhlIGNhbGxiYWNrDQorLy8gd2lsbCBiZSBleGVjdXRlZC4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgYSBzaW5nbGUgcGFyYW1ldGVyICh3aGljaCB3aWxsIGJlIA0KKy8vIHRoZSBsaXN0IG9mIHVzZXItc3BlY2lmaWVkIHZhbHVlcyByZXByZXNlbnRlZCBhcyBhIHJlZ3VsYXIgSmF2YVNjcmlwdCBhcnJheSkuDQorLy8NCisvLw0KKy8vIGpQcm9tcHRNdWx0aSgNCisoZnVuY3Rpb24oJCkgew0KKwkNCisJJC5hbGVydHMgPSB7DQorCQkNCisJCS8vIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIHJlYWQvd3JpdHRlbiBieSBhY2Nlc3NpbmcgJC5hbGVydHMucHJvcGVydHlOYW1lIGZyb20geW91ciBzY3JpcHRzIGF0IGFueSB0aW1lDQorCQkNCisJCXZlcnRpY2FsT2Zmc2V0OiAtNzUsICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgZGlhbG9nIGZyb20gY2VudGVyIHNjcmVlbiwgaW4gcGl4ZWxzDQorCQlob3Jpem9udGFsT2Zmc2V0OiAwLCAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgZGlhbG9nIGZyb20gY2VudGVyIHNjcmVlbiwgaW4gcGl4ZWxzLw0KKwkJcmVwb3NpdGlvbk9uUmVzaXplOiB0cnVlLCAgICAgICAgICAgLy8gcmUtY2VudGVycyB0aGUgZGlhbG9nIG9uIHdpbmRvdyByZXNpemUNCisJCW92ZXJsYXlPcGFjaXR5OiAuMDEsICAgICAgICAgICAgICAgIC8vIHRyYW5zcGFyZW5jeSBsZXZlbCBvZiBvdmVybGF5DQorCQlvdmVybGF5Q29sb3I6ICcjRkZGJywgICAgICAgICAgICAgICAvLyBiYXNlIGNvbG9yIG9mIG92ZXJsYXkNCisJCWRyYWdnYWJsZTogdHJ1ZSwgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIGRpYWxvZ3MgZHJhZ2dhYmxlIChyZXF1aXJlcyBVSSBEcmFnZ2FibGVzIHBsdWdpbikNCisJCW9rQnV0dG9uOiAnJm5ic3A7U0FWRSZuYnNwOycsICAgICAgICAgLy8gdGV4dCBmb3IgdGhlIE9LIGJ1dHRvbg0KKwkJY2FuY2VsQnV0dG9uOiAnJm5ic3A7Q2FuY2VsJm5ic3A7JywgLy8gdGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24NCisJCWRpYWxvZ0NsYXNzOiBudWxsLCAgICAgICAgICAgICAgICAgIC8vIGlmIHNwZWNpZmllZCwgdGhpcyBjbGFzcyB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGRpYWxvZ3MNCisJCQ0KKwkJLy8gUHVibGljIG1ldGhvZHMNCisJCQ0KKwkJYWxlcnQ6IGZ1bmN0aW9uKG1lc3NhZ2UsIHRpdGxlLCBjYWxsYmFjaykgew0KKwkJCWlmKCB0aXRsZSA9PSBudWxsICkgdGl0bGUgPSAnQWxlcnQnOw0KKwkJCSQuYWxlcnRzLl9zaG93KHRpdGxlLCBtZXNzYWdlLCBudWxsLCAnYWxlcnQnLCBmdW5jdGlvbihyZXN1bHQpIHsNCisJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2socmVzdWx0KTsNCisJCQl9KTsNCisJCX0sDQorCQkNCisJCWNvbmZpcm06IGZ1bmN0aW9uKG1lc3NhZ2UsIHRpdGxlLCBjYWxsYmFjaykgew0KKwkJCWlmKCB0aXRsZSA9PSBudWxsICkgdGl0bGUgPSAnQ29uZmlybSc7DQorCQkJJC5hbGVydHMuX3Nob3codGl0bGUsIG1lc3NhZ2UsIG51bGwsICdjb25maXJtJywgZnVuY3Rpb24ocmVzdWx0KSB7DQorCQkJCWlmKCBjYWxsYmFjayApIGNhbGxiYWNrKHJlc3VsdCk7DQorCQkJfSk7DQorCQl9LA0KKwkJCQ0KKwkJcHJvbXB0OiBmdW5jdGlvbihtZXNzYWdlLCB2YWx1ZSwgdGl0bGUsIGNhbGxiYWNrKSB7DQorCQkJaWYoIHRpdGxlID09IG51bGwgKSB0aXRsZSA9ICd0aXRsZSc7DQorCQkJJC5hbGVydHMuX3Nob3codGl0bGUsIG1lc3NhZ2UsIHZhbHVlLCAncHJvbXB0JywgZnVuY3Rpb24ocmVzdWx0KSB7DQorCQkJCWlmKCBjYWxsYmFjayApIGNhbGxiYWNrKHJlc3VsdCk7DQorCQkJfSk7DQorCQl9LA0KKwkJDQorCQlwcm9tcHRNdWx0aTogZnVuY3Rpb24obWVzc2FnZSwgdmFsdWUsIHRpdGxlLCBjYWxsYmFjaykgew0KKwkJCWlmKCB0aXRsZSA9PSBudWxsKSB0aXRsZSA9ICd0aXRsZSc7DQorCQkJJC5hbGVydHMuX3Nob3codGl0bGUsIG1lc3NhZ2UsIHZhbHVlLCAncHJvbXB0TXVsdGknLCBmdW5jdGlvbihyZXN1bHQpIHsNCisJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2socmVzdWx0KTsNCisJCQl9KTsNCisJCX0sDQorCQkNCisJCS8vIFByaXZhdGUgbWV0aG9kcw0KKwkJDQorCQlfc2hvdzogZnVuY3Rpb24odGl0bGUsIG1zZywgdmFsdWUsIHR5cGUsIGNhbGxiYWNrKSB7DQorCQkJDQorCQkJJC5hbGVydHMuX2hpZGUoKTsNCisJCQkkLmFsZXJ0cy5fb3ZlcmxheSgnc2hvdycpOw0KKwkJCQ0KKwkJCSQoIkJPRFkiKS5hcHBlbmQoDQorCQkJICAnPGRpdiBpZD0icG9wdXBfY29udGFpbmVyIj4nICsNCisJCQkgICAgJzxoMSBpZD0icG9wdXBfdGl0bGUiPjwvaDE+JyArDQorCQkJICAgICc8ZGl2IGlkPSJwb3B1cF9jb250ZW50Ij4nICsNCisJCQkgICAgICAnPGRpdiBpZD0icG9wdXBfbWVzc2FnZSI+PC9kaXY+JyArDQorCQkJCSc8L2Rpdj4nICsNCisJCQkgICc8L2Rpdj4nKTsNCisJCQkNCisJCQlpZiggJC5hbGVydHMuZGlhbG9nQ2xhc3MgKSAkKCIjcG9wdXBfY29udGFpbmVyIikuYWRkQ2xhc3MoJC5hbGVydHMuZGlhbG9nQ2xhc3MpOw0KKwkJCQ0KKwkJCS8vIElFNiBGaXgNCisJCQl2YXIgcG9zID0gKCQuYnJvd3Nlci5tc2llICYmIHBhcnNlSW50KCQuYnJvd3Nlci52ZXJzaW9uKSA8PSA2ICkgPyAnYWJzb2x1dGUnIDogJ2ZpeGVkJzsgDQorCQkJDQorCQkJJCgiI3BvcHVwX2NvbnRhaW5lciIpLmNzcyh7DQorCQkJCXBvc2l0aW9uOiBwb3MsDQorCQkJCXpJbmRleDogOTk5OTksDQorCQkJCXBhZGRpbmc6IDAsDQorCQkJCW1hcmdpbjogMA0KKwkJCX0pOw0KKwkJCQ0KKwkJCSQoIiNwb3B1cF90aXRsZSIpLnRleHQodGl0bGUpOw0KKwkJCSQoIiNwb3B1cF9jb250ZW50IikuYWRkQ2xhc3ModHlwZSk7DQorCQkJJCgiI3BvcHVwX21lc3NhZ2UiKS50ZXh0KG1zZyk7DQorCQkJJCgiI3BvcHVwX21lc3NhZ2UiKS5odG1sKCAkKCIjcG9wdXBfbWVzc2FnZSIpLnRleHQoKS5yZXBsYWNlKC9cbi9nLCAnPGJyIC8+JykgKTsNCisJCQkNCisJCQkkKCIjcG9wdXBfY29udGFpbmVyIikuY3NzKHsNCisJCQkJbWluV2lkdGg6ICQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCksDQorCQkJCW1heFdpZHRoOiAkKCIjcG9wdXBfY29udGFpbmVyIikub3V0ZXJXaWR0aCgpDQorCQkJfSk7DQorCQkJDQorCQkJJC5hbGVydHMuX3JlcG9zaXRpb24oKTsNCisJCQkkLmFsZXJ0cy5fbWFpbnRhaW5Qb3NpdGlvbih0cnVlKTsNCisJCQkNCisJCQlzd2l0Y2goIHR5cGUgKSB7DQorCQkJCWNhc2UgJ2FsZXJ0JzoNCisJCQkJCSQoIiNwb3B1cF9tZXNzYWdlIikuYWZ0ZXIoJzxkaXYgaWQ9InBvcHVwX3BhbmVsIj48aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyArICQuYWxlcnRzLm9rQnV0dG9uICsgJyIgaWQ9InBvcHVwX29rIiAvPjwvZGl2PicpOw0KKwkJCQkJJCgiI3BvcHVwX29rIikuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCQkJCSQuYWxlcnRzLl9oaWRlKCk7DQorCQkJCQkJY2FsbGJhY2sodHJ1ZSk7DQorCQkJCQl9KTsNCisJCQkJCSQoIiNwb3B1cF9vayIpLmZvY3VzKCkua2V5cHJlc3MoIGZ1bmN0aW9uKGUpIHsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSAyNyApICQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyk7DQorCQkJCQl9KTsNCisJCQkJYnJlYWs7DQorCQkJCWNhc2UgJ2NvbmZpcm0nOg0KKwkJCQkJJCgiI3BvcHVwX21lc3NhZ2UiKS5hZnRlcignPGRpdiBpZD0icG9wdXBfcGFuZWwiPjxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInICsgJC5hbGVydHMub2tCdXR0b24gKyAnIiBpZD0icG9wdXBfb2siIC8+IDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInICsgJC5hbGVydHMuY2FuY2VsQnV0dG9uICsgJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTsNCisJCQkJCSQoIiNwb3B1cF9vayIpLmNsaWNrKCBmdW5jdGlvbigpIHsNCisJCQkJCQkkLmFsZXJ0cy5faGlkZSgpOw0KKwkJCQkJCWlmKCBjYWxsYmFjayApIGNhbGxiYWNrKHRydWUpOw0KKwkJCQkJfSk7DQorCQkJCQkkKCIjcG9wdXBfY2FuY2VsIikuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCQkJCSQuYWxlcnRzLl9oaWRlKCk7DQorCQkJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2soZmFsc2UpOw0KKwkJCQkJfSk7DQorCQkJCQkkKCIjcG9wdXBfb2siKS5mb2N1cygpOw0KKwkJCQkJJCgiI3BvcHVwX29rLCAjcG9wdXBfY2FuY2VsIikua2V5cHJlc3MoIGZ1bmN0aW9uKGUpIHsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDEzICkgJCgiI3BvcHVwX29rIikudHJpZ2dlcignY2xpY2snKTsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDI3ICkgJCgiI3BvcHVwX2NhbmNlbCIpLnRyaWdnZXIoJ2NsaWNrJyk7DQorCQkJCQl9KTsNCisJCQkJYnJlYWs7DQorCQkJCWNhc2UgJ3Byb21wdCc6DQorCQkJCQkkKCIjcG9wdXBfbWVzc2FnZSIpLmFwcGVuZCgnPGJyIC8+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBpZD0icG9wdXBfcHJvbXB0IiAvPicpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicgKyAkLmFsZXJ0cy5va0J1dHRvbiArICciIGlkPSJwb3B1cF9vayIgLz4gPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicgKyAkLmFsZXJ0cy5jYW5jZWxCdXR0b24gKyAnIiBpZD0icG9wdXBfY2FuY2VsIiAvPjwvZGl2PicpOw0KKwkJCQkJJCgiI3BvcHVwX3Byb21wdCIpLndpZHRoKCAkKCIjcG9wdXBfbWVzc2FnZSIpLndpZHRoKCkgKTsNCisJCQkJCSQoIiNwb3B1cF9vayIpLmNsaWNrKCBmdW5jdGlvbigpIHsNCisJCQkJCQl2YXIgdmFsID0gJCgiI3BvcHVwX3Byb21wdCIpLnZhbCgpOw0KKwkJCQkJCSQuYWxlcnRzLl9oaWRlKCk7DQorCQkJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2soIHZhbCApOw0KKwkJCQkJfSk7DQorCQkJCQkkKCIjcG9wdXBfY2FuY2VsIikuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCQkJCSQuYWxlcnRzLl9oaWRlKCk7DQorCQkJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2soIG51bGwgKTsNCisJCQkJCX0pOw0KKwkJCQkJJCgiI3BvcHVwX3Byb21wdCwgI3BvcHVwX29rLCAjcG9wdXBfY2FuY2VsIikua2V5cHJlc3MoIGZ1bmN0aW9uKGUpIHsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDEzICkgJCgiI3BvcHVwX29rIikudHJpZ2dlcignY2xpY2snKTsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDI3ICkgJCgiI3BvcHVwX2NhbmNlbCIpLnRyaWdnZXIoJ2NsaWNrJyk7DQorCQkJCQl9KTsNCisJCQkJCWlmKCB2YWx1ZSApICQoIiNwb3B1cF9wcm9tcHQiKS52YWwodmFsdWUpOw0KKwkJCQkJJCgiI3BvcHVwX3Byb21wdCIpLmZvY3VzKCkuc2VsZWN0KCk7DQorCQkJCWJyZWFrOw0KKwkJCQljYXNlICdwcm9tcHRNdWx0aSc6DQorCQkJCQkvLyBJbiB0aGUgY2FzZSBvZiBhIG11bHRpcGxlIHZhbHVlIHByb21wdCwgJ3ZhbHVlJyBzaG91bGQgYmUgYSBqUXVlcnkgRE9NIG9iamVjdCBjb250YWluaW5nDQorCQkJCQkvLyBhIG51bWJlciBvZiBpbmRpdmlkdWFsIHZhbHVlcyB3cmFwcGVkIGluIDxzcGFuLz4gZWxlbWVudHMuIEVhY2ggPHNwYW4vPiBlbGVtZW50IGluIA0KKwkJCQkJLy8gdGhlIHByb3ZpZGVkIG1lc3NhZ2UgaXMgaW5zcGVjdGVkLCBhbmQgaXRzIHRleHQgdmFsdWUgaXMgdXNlZC4NCisJCQkJCS8vIGV4YW1wbGU6IDx0ZD48c3Bhbj52YWx1ZTE8L3NwYW4+LCA8c3Bhbj52YWx1ZTI8L3NwYW4+PC90ZD4NCisJCQkJCS8vIHdvdWxkIHRyYW5zbGF0ZSBpbnRvIDIgdmFsdWVzICh2YWx1ZTEgYW5kIHZhbHVlMikgYmVpbmcgZGlzcGxheWVkIGZvciBlZGl0aW5nLiANCisJCQkJCQ0KKwkJCQkJdmFsdWUuY2hpbGRyZW4oJ3NwYW4nKS5lYWNoKGZ1bmN0aW9uKCkgew0KKwkJCQkJCXZhciAkaW5wdXQgPSAkKCc8aW5wdXQ+JykNCisJCQkJCQkJLmF0dHIoeyd0eXBlJzondGV4dCcsJ3NpemUnOiczMCcsJ2NsYXNzJzoncG9wdXBfbXVsdGlQcm9tcHQnLCd2YWx1ZSc6JCh0aGlzKS50ZXh0KCl9KTsNCisJCQkJCQkkKCIjcG9wdXBfbWVzc2FnZSIpLmFwcGVuZCgnPGJyLz4nKS5hcHBlbmQoJGlucHV0KTsNCisJCQkJCX0pOw0KKwkJCQkJJCgiI3BvcHVwX21lc3NhZ2UiKQ0KKwkJCQkJCS5hZnRlciAoJzxici8+PGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9Im11bHRpUHJvbXB0TmV3VmFsdWUiIHZhbHVlPSIrIi8+Jm5ic3A7QWRkIGEgbmV3IHZhbHVlJyArDQorCQkJCQkJCQknPGRpdiBpZD0icG9wdXBfcGFuZWwiPjxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInICsgDQorCQkJCQkJCQkkLmFsZXJ0cy5va0J1dHRvbiArIA0KKwkJCQkJCQkJJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyArDQorCQkJCQkJCQkkLmFsZXJ0cy5jYW5jZWxCdXR0b24gKyANCisJCQkJCQkJCSciIGlkPSJwb3B1cF9jYW5jZWwiIC8+PC9kaXY+Jyk7DQorCQkJCQkNCisJCQkJCSQoIi5wb3B1cF9tdWx0aVByb21wdCIpLndpZHRoKCAkKCIjcG9wdXBfbWVzc2FnZSIpLndpZHRoKCkgKTsNCisJCQkJCSQoIiNtdWx0aVByb21wdE5ld1ZhbHVlIikuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCQkJCSQoIiNwb3B1cF9tZXNzYWdlIikNCisJCQkJCQkJLmFwcGVuZCgnPGJyIC8+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBjbGFzcz0icG9wdXBfbXVsdGlQcm9tcHQiIHZhbHVlPSIiLz4nKTsNCisJCQkJCQkkKCIucG9wdXBfbXVsdGlQcm9tcHQiKS53aWR0aCggJCgiI3BvcHVwX21lc3NhZ2UiKS53aWR0aCgpICk7DQorCQkJCQkNCisJCQkJCX0pOw0KKwkJCQkJJCgiI3BvcHVwX29rIikuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCQkJCS8vIEdhdGhlciB2YWx1ZXMNCisJCQkJCQl2YXIgdmFsdWVzID0gQXJyYXkoKTsNCisJCQkJCQkkKCIucG9wdXBfbXVsdGlQcm9tcHQiKS5lYWNoKCBmdW5jdGlvbigpIHsNCisJCQkJCQkJaWYgKCQodGhpcykudmFsKCkpIHZhbHVlcy5wdXNoKCQodGhpcykudmFsKCkpOw0KKwkJCQkJCX0pOw0KKwkJCQkJCSQuYWxlcnRzLl9oaWRlKCk7DQorCQkJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2soIHZhbHVlcyApOw0KKwkJCQkJfSk7DQorCQkJCQkkKCIjcG9wdXBfY2FuY2VsIikuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCQkJCSQuYWxlcnRzLl9oaWRlKCk7DQorCQkJCQkJaWYoIGNhbGxiYWNrICkgY2FsbGJhY2soIG51bGwgKTsNCisJCQkJCX0pOw0KKwkJCQkJJCgiI3BvcHVwX3Byb21wdCwgI3BvcHVwX29rLCAjcG9wdXBfY2FuY2VsIikua2V5cHJlc3MoIGZ1bmN0aW9uKGUpIHsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDEzICkgJCgiI3BvcHVwX29rIikudHJpZ2dlcignY2xpY2snKTsNCisJCQkJCQlpZiggZS5rZXlDb2RlID09IDI3ICkgJCgiI3BvcHVwX2NhbmNlbCIpLnRyaWdnZXIoJ2NsaWNrJyk7DQorCQkJCQl9KTsNCisJCQkJCWlmKCB2YWx1ZSApICQoIiNwb3B1cF9wcm9tcHQiKS52YWwodmFsdWUpOw0KKwkJCQkJJCgiI3BvcHVwX3Byb21wdCIpLmZvY3VzKCkuc2VsZWN0KCk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQkNCisJCQkvLyBNYWtlIGRyYWdnYWJsZQ0KKwkJCWlmKCAkLmFsZXJ0cy5kcmFnZ2FibGUgKSB7DQorCQkJCXRyeSB7DQorCQkJCQkkKCIjcG9wdXBfY29udGFpbmVyIikuZHJhZ2dhYmxlKHsgaGFuZGxlOiAkKCIjcG9wdXBfdGl0bGUiKSB9KTsNCisJCQkJCSQoIiNwb3B1cF90aXRsZSIpLmNzcyh7IGN1cnNvcjogJ21vdmUnIH0pOw0KKwkJCQl9IGNhdGNoKGUpIHsgLyogcmVxdWlyZXMgalF1ZXJ5IFVJIGRyYWdnYWJsZXMgKi8gfQ0KKwkJCX0NCisJCX0sDQorCQkNCisJCV9oaWRlOiBmdW5jdGlvbigpIHsNCisJCQkkKCIjcG9wdXBfY29udGFpbmVyIikucmVtb3ZlKCk7DQorCQkJJC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTsNCisJCQkkLmFsZXJ0cy5fbWFpbnRhaW5Qb3NpdGlvbihmYWxzZSk7DQorCQl9LA0KKwkJDQorCQlfb3ZlcmxheTogZnVuY3Rpb24oc3RhdHVzKSB7DQorCQkJc3dpdGNoKCBzdGF0dXMgKSB7DQorCQkJCWNhc2UgJ3Nob3cnOg0KKwkJCQkJJC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTsNCisJCQkJCSQoIkJPRFkiKS5hcHBlbmQoJzxkaXYgaWQ9InBvcHVwX292ZXJsYXkiPjwvZGl2PicpOw0KKwkJCQkJJCgiI3BvcHVwX292ZXJsYXkiKS5jc3Moew0KKwkJCQkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLA0KKwkJCQkJCXpJbmRleDogOTk5OTgsDQorCQkJCQkJdG9wOiAnMHB4JywNCisJCQkJCQlsZWZ0OiAnMHB4JywNCisJCQkJCQl3aWR0aDogJzEwMCUnLA0KKwkJCQkJCWhlaWdodDogJChkb2N1bWVudCkuaGVpZ2h0KCksDQorCQkJCQkJYmFja2dyb3VuZDogJC5hbGVydHMub3ZlcmxheUNvbG9yLA0KKwkJCQkJCW9wYWNpdHk6ICQuYWxlcnRzLm92ZXJsYXlPcGFjaXR5DQorCQkJCQl9KTsNCisJCQkJYnJlYWs7DQorCQkJCWNhc2UgJ2hpZGUnOg0KKwkJCQkJJCgiI3BvcHVwX292ZXJsYXkiKS5yZW1vdmUoKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfSwNCisJCQ0KKwkJX3JlcG9zaXRpb246IGZ1bmN0aW9uKCkgew0KKwkJCXZhciB0b3AgPSAoKCQod2luZG93KS5oZWlnaHQoKSAvIDIpIC0gKCQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlckhlaWdodCgpIC8gMikpICsgJC5hbGVydHMudmVydGljYWxPZmZzZXQ7DQorCQkJdmFyIGxlZnQgPSAoKCQod2luZG93KS53aWR0aCgpIC8gMikgLSAoJCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVyV2lkdGgoKSAvIDIpKSArICQuYWxlcnRzLmhvcml6b250YWxPZmZzZXQ7DQorCQkJaWYoIHRvcCA8IDAgKSB0b3AgPSAwOw0KKwkJCWlmKCBsZWZ0IDwgMCApIGxlZnQgPSAwOw0KKwkJCQ0KKwkJCS8vIElFNiBmaXgNCisJCQlpZiggJC5icm93c2VyLm1zaWUgJiYgcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24pIDw9IDYgKSB0b3AgPSB0b3AgKyAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7DQorCQkJDQorCQkJJCgiI3BvcHVwX2NvbnRhaW5lciIpLmNzcyh7DQorCQkJCXRvcDogdG9wICsgJ3B4JywNCisJCQkJbGVmdDogbGVmdCArICdweCcNCisJCQl9KTsNCisJCQkkKCIjcG9wdXBfb3ZlcmxheSIpLmhlaWdodCggJChkb2N1bWVudCkuaGVpZ2h0KCkgKTsNCisJCX0sDQorCQkNCisJCV9tYWludGFpblBvc2l0aW9uOiBmdW5jdGlvbihzdGF0dXMpIHsNCisJCQlpZiggJC5hbGVydHMucmVwb3NpdGlvbk9uUmVzaXplICkgew0KKwkJCQlzd2l0Y2goc3RhdHVzKSB7DQorCQkJCQljYXNlIHRydWU6DQorCQkJCQkJJCh3aW5kb3cpLmJpbmQoJ3Jlc2l6ZScsICQuYWxlcnRzLl9yZXBvc2l0aW9uKTsNCisJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBmYWxzZToNCisJCQkJCQkkKHdpbmRvdykudW5iaW5kKCdyZXNpemUnLCAkLmFsZXJ0cy5fcmVwb3NpdGlvbik7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCQ0KKwl9DQorCQ0KKwkvLyBTaG9ydHVjdCBmdW5jdGlvbnMNCisJakFsZXJ0ID0gZnVuY3Rpb24obWVzc2FnZSwgdGl0bGUsIGNhbGxiYWNrKSB7DQorCQkkLmFsZXJ0cy5hbGVydChtZXNzYWdlLCB0aXRsZSwgY2FsbGJhY2spOw0KKwl9DQorCQ0KKwlqQ29uZmlybSA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHRpdGxlLCBjYWxsYmFjaykgew0KKwkJJC5hbGVydHMuY29uZmlybShtZXNzYWdlLCB0aXRsZSwgY2FsbGJhY2spOw0KKwl9Ow0KKwkJDQorCWpQcm9tcHQgPSBmdW5jdGlvbihtZXNzYWdlLCB2YWx1ZSwgdGl0bGUsIGNhbGxiYWNrKSB7DQorCQkkLmFsZXJ0cy5wcm9tcHQobWVzc2FnZSwgdmFsdWUsIHRpdGxlLCBjYWxsYmFjayk7DQorCX07DQorCQ0KKwlqUHJvbXB0TXVsdGkgPSBmdW5jdGlvbihtZXNzYWdlLCB2YWx1ZSwgdGl0bGUsIGNhbGxiYWNrKSB7DQorCQkkLmFsZXJ0cy5wcm9tcHRNdWx0aShtZXNzYWdlLCB2YWx1ZSwgdGl0bGUsIGNhbGxiYWNrKTsNCisJfTsNCit9KShqUXVlcnkpOwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvanF1ZXJ5LmFsZXJ0c193aWNrZXQuY3NzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvanF1ZXJ5LmFsZXJ0c193aWNrZXQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjIwNWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9qcXVlcnkuYWxlcnRzX3dpY2tldC5jc3MKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcG9wdXBfY29udGFpbmVyIHsKKwlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxMnB4OworCW1pbi13aWR0aDogMzAwcHg7IC8qIERpYWxvZyB3aWxsIGJlIG5vIHNtYWxsZXIgdGhhbiB0aGlzICovCisJbWF4LXdpZHRoOiA2MDBweDsgLyogRGlhbG9nIHdpbGwgd3JhcCBhZnRlciB0aGlzIHdpZHRoICovCisJYmFja2dyb3VuZDogI0ZGRjsKKwlib3JkZXI6IHNvbGlkIDVweCAjOTk5OworCWNvbG9yOiAjMDAwOworCS1tb3otYm9yZGVyLXJhZGl1czogNXB4OworCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4OworCWJvcmRlci1yYWRpdXM6IDVweDsKK30KKworI3BvcHVwX3RpdGxlIHsKKwlmb250LXNpemU6IDE0cHg7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWxpbmUtaGVpZ2h0OiAxLjc1ZW07CisJY29sb3I6ICM2NjY7CisJYmFja2dyb3VuZDogI0NDQyB1cmwoLi4vLi4vaW1hZ2VzL3RpdGxlLmdpZikgdG9wIHJlcGVhdC14OworCWJvcmRlcjogc29saWQgMXB4ICNGRkY7CisJYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICM5OTk7CisJY3Vyc29yOiBkZWZhdWx0OworCXBhZGRpbmc6IDBlbTsKKwltYXJnaW46IDBlbTsKK30KKworI3BvcHVwX2NvbnRlbnQgeworCWJhY2tncm91bmQ6IDE2cHggMTZweCBuby1yZXBlYXQgdXJsKC4uLy4uL2ltYWdlcy9pbmZvLmdpZik7CisJcGFkZGluZzogMWVtIDEuNzVlbTsKKwltYXJnaW46IDBlbTsKK30KKworI3BvcHVwX2NvbnRlbnQuYWxlcnQgeworCWJhY2tncm91bmQtaW1hZ2U6IHVybCguLi8uLi9pbWFnZXMvaW5mby5naWYpOworfQorCisjcG9wdXBfY29udGVudC5jb25maXJtIHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vLi4vaW1hZ2VzL2ltcG9ydGFudC5naWYpOworfQorCisjcG9wdXBfY29udGVudC5wcm9tcHQgeworCWJhY2tncm91bmQtaW1hZ2U6IHVybCguLi8uLi9pbWFnZXMvaGVscC5naWYpOworfQorCisjcG9wdXBfbWVzc2FnZSB7CisJcGFkZGluZy1sZWZ0OiA0OHB4OworfQorCisjcG9wdXBfcGFuZWwgeworCXRleHQtYWxpZ246IGNlbnRlcjsKKwltYXJnaW46IDFlbSAwZW0gMGVtIDFlbTsKK30KKworI3BvcHVwX3Byb21wdCB7CisJbWFyZ2luOiAuNWVtIDBlbTsKK30KKy5wb3B1cF9tdWx0aVByb21wdCB7CisJbWFyZ2luOiAwLjVlbSAwZW07Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9qcXVlcnkucGVyaW9kaWNhbHVwZGF0ZXIuanMgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9qcXVlcnkucGVyaW9kaWNhbHVwZGF0ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4ODBhMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL2pxdWVyeS5wZXJpb2RpY2FsdXBkYXRlci5qcwpAQCAtMCwwICsxLDEwNSBAQAorLyoqDQorICogUGVyaW9kaWNhbFVwZGF0ZXIgLSBqUXVlcnkgcGx1Z2luIGZvciB0aW1lZCwgZGVjYXlpbmcgYWpheCBjYWxscw0KKyAqDQorICogU21va2VqdW1wZXIgVmVyc2lvbiBieSBSb2JlcnQgRmlzY2hlciwgU21va2VqdW1wZXIgSVQNCisgKiBCYXNlZCBvbiB2ZXJzaW9uIGZyb20gaHR0cDovL3d3dy4zNjBpbm5vdmF0ZS5jby51aw0KKyAqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IHRoZSBmb2xsb3dpbmc6DQorICoJICogUm9iZXJ0IEZpc2NoZXIgKGh0dHA6Ly9zbW9rZWp1bXBlcml0LmNvbSkNCisgKgkgKiAzNjBpbm5vdmF0ZSAoaHR0cDovL3d3dy4zNjBpbm5vdmF0ZS5jby51aykNCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczoNCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbA0KKyAqDQorICogVmVyc2lvbjogMi4wDQorICovDQorDQorKGZ1bmN0aW9uKCQpIHsNCisJCWZ1bmN0aW9uIHB1X2xvZyhtc2cpIHsNCisJCQl0cnkgew0KKwkJCQljb25zb2xlLmxvZyhtc2cpOw0KKwkJCX0gY2F0Y2goZXJyKSB7fQ0KKwkJfQ0KKw0KKwkJLy8gTm93IGJhY2sgdG8gb3VyIHJlZ3VsYXJseSBzY2hlZHVsZWQgd29yaw0KKwkJJC5QZXJpb2RpY2FsVXBkYXRlciA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucywgY2FsbGJhY2spew0KKw0KKwkJCQl2YXIgc2V0dGluZ3MgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHsNCisJCQkJCXVybDogdXJsLAkJCQkJCQkJLy8gVVJMIG9mIGFqYXggcmVxdWVzdA0KKwkJCQkJY2FjaGU6IGZhbHNlLAkJCQkJCS8vIEJ5IGRlZmF1bHQsIGRvbid0IGFsbG93IGNhY2hpbmcNCisJCQkJCW1ldGhvZDogJ0dFVCcsCQkJCQkvLyBtZXRob2Q7IGdldCBvciBwb3N0DQorCQkJCQlkYXRhOiAnJywJCQkJCQkJCS8vIGFycmF5IG9mIHZhbHVlcyB0byBiZSBwYXNzZWQgdG8gdGhlIHBhZ2UgLSBlLmcuIHtuYW1lOiAiSm9obiIsIGdyZWV0aW5nOiAiaGVsbG8ifQ0KKwkJCQkJbWluVGltZW91dDogMTAwMCwJCQkJLy8gc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcw0KKwkJCQkJbWF4VGltZW91dDogODAwMCwJCQkJLy8gbWF4aW11bSBsZW5ndGggb2YgdGltZSBiZXR3ZWVuIHJlcXVlc3RzDQorCQkJCQltdWx0aXBsaWVyOiAyCQkJCQkJLy8gaWYgc2V0IHRvIDIsIHRpbWVySW50ZXJ2YWwgd2lsbCBkb3VibGUgZWFjaCB0aW1lIHRoZSByZXNwb25zZSBoYXNuJ3QgY2hhbmdlZCAodXAgdG8gbWF4VGltZW91dCkNCisJCQkJfSwgb3B0aW9ucyk7DQorCQkJCQ0KKwkJCQkvLyBzZXQgc29tZSBpbml0aWFsIHZhbHVlcywgdGhlbiBiZWdpbg0KKwkJCQl2YXIgdGltZXJJbnRlcnZhbCA9IHNldHRpbmdzLm1pblRpbWVvdXQ7DQorDQorCQkJCS8vIEZ1bmN0aW9uIHRvIGJvb3N0IHRoZSB0aW1lciAobm9wIHVubGVzcyBtdWx0aXBsaWVyID4gMSkNCisJCQkJdmFyIGJvb3N0UGVyaW9kID0gZnVuY3Rpb24oKSB7IHJldHVybjsgfTsNCisJCQkJaWYoc2V0dGluZ3MubXVsdGlwbGllciA+IDEpIHsNCisJCQkJCWJvb3N0UGVyaW9kID0gZnVuY3Rpb24oKSB7IA0KKwkJCQkJCXRpbWVySW50ZXJ2YWwgPSB0aW1lckludGVydmFsICogc2V0dGluZ3MubXVsdGlwbGllcjsNCisJCQkJCQkNCisJCQkJCQlpZih0aW1lckludGVydmFsID4gc2V0dGluZ3MubWF4VGltZW91dCkgew0KKwkJCQkJCQkJdGltZXJJbnRlcnZhbCA9IHNldHRpbmdzLm1heFRpbWVvdXQ7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfSANCisNCisJCQkJLy8gQ29uc3RydWN0IHRoZSBzZXR0aW5ncyBmb3IgJC5hamF4IGJhc2VkIG9uIHNldHRpbmdzDQorCQkJCXZhciBhamF4U2V0dGluZ3MgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncyk7DQorCQkJCWlmKHNldHRpbmdzLnR5cGUgJiYgIWFqYXhTZXR0aW5ncy5kYXRhVHlwZSkgYWpheFNldHRpbmdzLmRhdGFUeXBlID0gc2V0dGluZ3MudHlwZTsNCisJCQkJaWYoc2V0dGluZ3Muc2VuZERhdGEpIGFqYXhTZXR0aW5ncy5kYXRhID0gc2V0dGluZ3Muc2VuZERhdGE7DQorCQkJCWFqYXhTZXR0aW5ncy50eXBlID0gc2V0dGluZ3MubWV0aG9kOyAvLyAndHlwZScgaXMgdXNlZCBpbnRlcm5hbGx5IGZvciBqUXVlcnkuICBXaG8ga25ldz8NCisJCQkJYWpheFNldHRpbmdzLmlmTW9kaWZpZWQgPSB0cnVlOw0KKw0KKwkJCQl2YXIgcmVtb3RlRGF0YSA9IG51bGw7DQorCQkJCXZhciBwcmV2RGF0YSA9IG51bGw7DQorCQkJCQ0KKwkJCQlhamF4U2V0dGluZ3Muc3VjY2VzcyA9IGZ1bmN0aW9uKGRhdGEpIHsNCisJCQkJCXB1X2xvZygiU3VjY2Vzc2Z1bCBydW4hIChJbiAnc3VjY2VzcycpIik7DQorCQkJCQlyZW1vdGVEYXRhID0gZGF0YTsNCisJCQkJCXRpbWVySW50ZXJ2YWwgPSBzZXR0aW5ncy5taW5UaW1lb3V0Ow0KKwkJCQl9Ow0KKwkJCQkNCisJCQkJYWpheFNldHRpbmdzLmNvbXBsZXRlID0gZnVuY3Rpb24oeGhyLCBzdWNjZXNzKSB7DQorCQkJCQlwdV9sb2coIlN0YXR1cyBvZiBjYWxsOiAiICsgc3VjY2VzcyArICIgKEluICdjb21wbGV0ZScpIik7DQorDQorCQkJCQlpZihzdWNjZXNzID09ICJzdWNjZXNzIiB8fCBzdWNjZXNzID09ICJub3Rtb2RpZmllZCIpIHsNCisJCQkJCQl2YXIgcmF3RGF0YSA9ICQudHJpbSh4aHIucmVzcG9uc2VUZXh0KTsNCisJCQkJCQlpZihwcmV2RGF0YSA9PSByYXdEYXRhKSB7DQorCQkJCQkJCWJvb3N0UGVyaW9kKCk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJdGltZXJJbnRlcnZhbCA9IHNldHRpbmdzLm1pblRpbWVvdXQ7DQorCQkJCQkJCXByZXZEYXRhID0gcmF3RGF0YTsNCisJCQkJCQkJaWYocmVtb3RlRGF0YSA9PSBudWxsKSByZW1vdGVEYXRhID0gcmF3RGF0YTsNCisJCQkJCQkJaWYoc2V0dGluZ3Muc3VjY2VzcykgeyBzZXR0aW5ncy5zdWNjZXNzKHJlbW90ZURhdGEpOyB9DQorCQkJCQkJCWlmKGNhbGxiYWNrKSBjYWxsYmFjayhyZW1vdGVEYXRhKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQkNCisJCQkJCXJlbW90ZURhdGEgPSBudWxsOw0KKwkJCQkJc2V0VGltZW91dChnZXRkYXRhLCB0aW1lckludGVydmFsKTsNCisJCQkJfQ0KKw0KKw0KKwkJCQlhamF4U2V0dGluZ3MuZXJyb3IgPSBmdW5jdGlvbiAoeGhyLCB0ZXh0U3RhdHVzKSB7IA0KKwkJCQkJcHVfbG9nKCJFcnJvciBtZXNzYWdlOiAiICsgdGV4dFN0YXR1cyArICIgKEluICdlcnJvcicpIik7DQorCQkJCQlpZih0ZXh0U3RhdHVzID09ICJub3Rtb2RpZmllZCIpIHsNCisJCQkJCQlib29zdFBlcmlvZCgpOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQlwcmV2RGF0YSA9IG51bGw7DQorCQkJCQkJdGltZXJJbnRlcnZhbCA9IHNldHRpbmdzLm1pblRpbWVvdXQ7DQorCQkJCQl9DQorCQkJCQlpZihzZXR0aW5ncy5lcnJvcikgeyBzZXR0aW5ncy5lcnJvcih4aHIsIHRleHRTdGF0dXMpOyB9DQorCQkJCX07DQorDQorCQkJCWZ1bmN0aW9uIGdldGRhdGEoKSB7ICQuYWpheChhamF4U2V0dGluZ3MpOyB9DQorDQorCQkJCS8vIE1ha2UgdGhlIGZpcnN0IGNhbGwNCisJCQkJJChmdW5jdGlvbigpIHsgZ2V0ZGF0YSgpOyB9KTsNCisJCX07CQ0KK30pKGpRdWVyeSk7DQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvbGludXgucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvbGludXgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MWJmZWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9saW51eC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvbXVzaWMucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvbXVzaWMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDI5YjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9tdXNpYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcGRmLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BkZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MzQ0ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BkZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcGhwLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BocC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczY2VlMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BocC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcGljdHVyZS5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9waWN0dXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzcwODJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcGljdHVyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcHB0LnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BwdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4M2EyNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BwdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcHNkLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BzZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlZmIyYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3BzZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcnVieS5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9ydWJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMwNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvcnVieS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvc2NyaXB0LnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3NjcmlwdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllZjFlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3NjcmlwdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvc3Bpbm5lci5naWYgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC9zcGlubmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzAwNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvc3Bpbm5lci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvdGl0bGUuZ2lmIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvdGl0bGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzhlYTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2N1cmF0aW9uL3dvcmtiZW5jaC90aXRsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvdHh0LnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3R4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZDIyYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3R4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gveGxzLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3hscy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMWNjNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3hscy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9jdXJhdGlvbi93b3JrYmVuY2gvemlwLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3ppcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlOTFhYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvY3VyYXRpb24vd29ya2JlbmNoL3ppcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL0ZNQnJvd3NlckFwcEJhc2UuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9GTUJyb3dzZXJBcHBCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3NTI1YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9GTUJyb3dzZXJBcHBCYXNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LnByb3RvY29sLmh0dHAuV2ViQXBwbGljYXRpb247CisKKy8qKgorICogCisgKiBCYXNlIEZNIGJyb3dzZXIgd2ViLWFwcGxpY2F0aW9uIGNsYXNzLiBJbmhlcml0IHRoaXMgCisgKiBpbiB5b3VyIHN1Yi1jbGFzc2VkIGJyb3dzZXJzLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZNQnJvd3NlckFwcEJhc2UgZXh0ZW5kcyBXZWJBcHBsaWNhdGlvbiB7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldlYkFwcGxpY2F0aW9uI25ld1Nlc3Npb24ob3JnLmFwYWNoZS53aWNrZXQKKyAgICogLlJlcXVlc3QsIG9yZy5hcGFjaGUud2lja2V0LlJlc3BvbnNlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXNzaW9uIG5ld1Nlc3Npb24oUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgeworICAgIHJldHVybiBuZXcgRk1Ccm93c2VyU2Vzc2lvbihyZXF1ZXN0KTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0Rm1VcmxTdHIoKSB7CisgICAgcmV0dXJuIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigiZmlsZW1nci51cmwiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvRk1Ccm93c2VyU2Vzc2lvbi5qYXZhIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL0ZNQnJvd3NlclNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTUzZTVlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL0ZNQnJvd3NlclNlc3Npb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlRlcm1RdWVyeUNyaXRlcmlhOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LnByb3RvY29sLmh0dHAuV2ViU2Vzc2lvbjsKKworLyoqCisgKgorICogQSBjdXN0b20gc2Vzc2lvbiBmb3IgdGhlIEZNQnJvd3NlckFwcCwgaG9sZHMgaXRzIAorICoge0BsaW5rIExpc3R9IG9mIHtAbGluayBUZXJtUXVlcnlDcml0ZXJpYX0uCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEZNQnJvd3NlclNlc3Npb24gZXh0ZW5kcyBXZWJTZXNzaW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDE0NDI2NTE4ODMzODAwNzk0TDsKKworICBwcml2YXRlIExpc3Q8VGVybVF1ZXJ5Q3JpdGVyaWE+IGNyaXQ7CisgIAorICAvKioKKyAgICogQHBhcmFtIHJlcXVlc3QKKyAgICovCisgIHB1YmxpYyBGTUJyb3dzZXJTZXNzaW9uKFJlcXVlc3QgcmVxdWVzdCkgeworICAgIHN1cGVyKHJlcXVlc3QpOworICAgIHRoaXMuY3JpdCA9IG5ldyBWZWN0b3I8VGVybVF1ZXJ5Q3JpdGVyaWE+KCk7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgRk1Ccm93c2VyU2Vzc2lvbiBnZXQoKXsKKyAgICByZXR1cm4gKEZNQnJvd3NlclNlc3Npb24pU2Vzc2lvbi5nZXQoKTsKKyAgfQorICAKKyAgcHVibGljIGZpbmFsIExpc3Q8VGVybVF1ZXJ5Q3JpdGVyaWE+IGdldENyaXRlcmlhKCl7CisgICAgcmV0dXJuIHRoaXMuY3JpdDsKKyAgfQorICAKKyAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q3JpdGVyaWEoTGlzdDxUZXJtUXVlcnlDcml0ZXJpYT4gY3JpdCl7CisgICAgdGhpcy5jcml0ID0gY3JpdDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvRmlsZU1hbmFnZXJDb25uLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvRmlsZU1hbmFnZXJDb25uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkM2M4ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9GaWxlTWFuYWdlckNvbm4uamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIAorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZpbGVNYW5hZ2VyQ29ubiB7CisKKyAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihGaWxlTWFuYWdlckNvbm4uY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIHB1YmxpYyBGaWxlTWFuYWdlckNvbm4oU3RyaW5nIGZtVXJsU3RyKSB7CisgICAgdGhpcy5pbml0Rm0oZm1VcmxTdHIpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kUmVjZWl2ZWRUaW1lKFByb2R1Y3QgcCkgeworICAgIE1ldGFkYXRhIG1ldCA9IGdldE1ldGFkYXRhKHApOworICAgIFN0cmluZyBwcm9kUmVjZWl2ZWRUaW1lID0gbWV0LmdldE1ldGFkYXRhKCJDQVMuIgorICAgICAgICArIENvcmVNZXRLZXlzLlBST0RVQ1RfUkVDRVZJRURfVElNRSk7CisgICAgcmV0dXJuIHByb2RSZWNlaXZlZFRpbWUgIT0gbnVsbCAmJiAhcHJvZFJlY2VpdmVkVGltZS5lcXVhbHMoIiIpID8gcHJvZFJlY2VpdmVkVGltZQorICAgICAgICA6ICJVTktOT1dOIjsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UHJvZHVjdFJlZmVyZW5jZXMoUHJvZHVjdCBwKSB7CisgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBuZXcgVmVjdG9yPFJlZmVyZW5jZT4oKTsKKyAgICB0cnkgeworICAgICAgcmVmcyA9IGZtLmdldFByb2R1Y3RSZWZlcmVuY2VzKHApOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZ2V0IHJlZmVyZW5jZXMgZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgKyBwLmdldFByb2R1Y3ROYW1lKCkgKyAiXTogUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiByZWZzOworICB9CisKKyAgcHVibGljIFByb2R1Y3RUeXBlIHNhZmVHZXRQcm9kdWN0VHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gZm0uZ2V0UHJvZHVjdFR5cGVCeU5hbWUobmFtZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBnZXQgcHJvZHVjdCB0eXBlIGJ5IG5hbWU6IFsiICsgbmFtZQorICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgUHJvZHVjdCBzYWZlR2V0UHJvZHVjdEJ5SWQoU3RyaW5nIGlkKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBmbS5nZXRQcm9kdWN0QnlJZChpZCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBnZXQgcHJvZHVjdCBieSBpZDogWyIgKyBpZAorICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoUHJvZHVjdCBwKSB7CisgICAgTWV0YWRhdGEgbWV0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgbWV0ID0gZm0uZ2V0TWV0YWRhdGEocCk7CisgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVuYWJsZSB0byBnZXQgbWV0YWRhdGEgYW5kIGRpc3BsYXkgcHJvZHVjdCByZWNlaXZlZCB0aW1lIGZvcjogWyIKKyAgICAgICAgICAgICAgKyBwLmdldFByb2R1Y3ROYW1lKCkgKyAiXTogUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiBtZXQ7CisgIH0KKworICBwdWJsaWMgTGlzdDxFbGVtZW50PiBzYWZlR2V0RWxlbWVudHNGb3JQcm9kdWN0VHlwZShQcm9kdWN0VHlwZSB0eXBlKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBmbS5nZXRFbGVtZW50c0J5UHJvZHVjdFR5cGUodHlwZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBvYnRhaW4gZWxlbWVudHMgZm9yIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICArIHR5cGUuZ2V0TmFtZSgpICsgIl06IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8UHJvZHVjdFR5cGU+IHNhZmVHZXRQcm9kdWN0VHlwZXMoKSB7CisgICAgTGlzdDxQcm9kdWN0VHlwZT4gdHlwZXMgPSBuZXcgVmVjdG9yPFByb2R1Y3RUeXBlPigpOworICAgIHRyeSB7CisgICAgICB0eXBlcyA9IHRoaXMuZm0uZ2V0UHJvZHVjdFR5cGVzKCk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCB0eXBlczogUmVhc29uOiBbIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIpOworICAgIH0KKyAgICByZXR1cm4gdHlwZXM7CisgIH0KKworICBwdWJsaWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZ2V0Rm0oKSB7CisgICAgcmV0dXJuIHRoaXMuZm07CisgIH0KKworICBwdWJsaWMgdm9pZCBpbml0Rm0oU3RyaW5nIHVybFN0cikgeworICAgIHRyeSB7CisgICAgICB0aGlzLmZtID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwodXJsU3RyKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBmaWxlIG1hbmFnZXIgYXQ6IFsiCisgICAgICAgICAgKyB1cmxTdHIgKyAiXSIpOworICAgICAgdGhpcy5mbSA9IG51bGw7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL21ldGFkYXRhL01ldGFkYXRhQnJvd3Nlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9tZXRhZGF0YS9NZXRhZGF0YUJyb3dzZXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTRmMTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9tZXRhZGF0YS9NZXRhZGF0YUJyb3dzZXIuY3NzCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjbWV0X3RhYmxleworCit9CisKKyNtZXRfZWxlbV9uYW1leworCQorfQorCisjbWV0X3ZhbHVlc190YWJsZXsKKworfQorCisubmFkYXsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL21ldGFkYXRhL01ldGFkYXRhQnJvd3Nlci5odG1sIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvbWV0YWRhdGEvTWV0YWRhdGFCcm93c2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNTYxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL21ldGFkYXRhL01ldGFkYXRhQnJvd3Nlci5odG1sCkBAIC0wLDAgKzEsMzkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0OnJlbW92ZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iTWV0YWRhdGFCcm93c2VyLmNzcyIvPgorPC93aWNrZXQ6cmVtb3ZlPgorCis8aDM+TWV0YWRhdGE8L2gzPgorICA8dGFibGUgaWQ9Im1ldF90YWJsZSI+CisgICAgPHRyIHdpY2tldDppZD0ibWV0X2VsZW0iPgorICAgICAgPHRkIHdpY2tldDppZD0ibWV0X2VsZW1fbmFtZSIgaWQ9Im1ldF9lbGVtX25hbWUiPkNBUy5Qcm9kdWN0TmFtZTwvdGQ+CisgICAgICA8dGQ+CisgICAgICAgICA8dGFibGUgaWQ9Im1ldF92YWx1ZXNfdGFibGUiPgorICAgICAgICAgIDx0ciB3aWNrZXQ6aWQ9Im1ldF92YWx1ZXNfbGlzdCI+CisgICAgICAgICAgICAgPHRkIHdpY2tldDppZD0ibWV0X3ZhbHVlIj5mb28udHh0PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgIDwvdHI+CisgICA8L3RhYmxlPgorICAgCisgICA8aDMgd2lja2V0OmlkPSJub19wcm9kX21ldF9kaXNwbGF5IiBjbGFzcz0ibmFkYSI+Tm8gUHJvZHVjdCBNZXRhZGF0YSE8L2gzPgorICAgPHA+Jm5ic3A7PC9wPgorICAgPHA+Jm5ic3A7PC9wPgorPC93aWNrZXQ6cGFuZWw+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9tZXRhZGF0YS9NZXRhZGF0YUJyb3dzZXIuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL21ldGFkYXRhL01ldGFkYXRhQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjQzYzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9tZXRhZGF0YS9NZXRhZGF0YUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyLmJyb3dzZXIubWV0YWRhdGE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5GaWxlTWFuYWdlckNvbm47CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiB7QGxpbmsgTWV0YWRhdGF9LXZpZXcgcG9wdXAuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFCcm93c2VyIGV4dGVuZHMgUGFuZWwgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNzY1NDQwNTk1ODk5Njg0MDlMOworCisgIHByaXZhdGUgRmlsZU1hbmFnZXJDb25uIGZtOworCisgIHB1YmxpYyBNZXRhZGF0YUJyb3dzZXIoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgZm1VcmxTdHIsIFN0cmluZyBwcm9kdWN0SWQpIHsKKyAgICBzdXBlcihjb21wb25lbnRJZCk7CisgICAgdGhpcy5mbSA9IG5ldyBGaWxlTWFuYWdlckNvbm4oZm1VcmxTdHIpOworICAgIGZpbmFsIFNlcmlhbGl6YWJsZU1ldGFkYXRhIG1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YSh0aGlzLmZtCisgICAgICAgIC5nZXRNZXRhZGF0YSh0aGlzLmZtLnNhZmVHZXRQcm9kdWN0QnlJZChwcm9kdWN0SWQpKSk7CisgICAgc2V0RGVmYXVsdE1vZGVsKG5ldyBNb2RlbChtZXQpKTsKKworICAgIGlmIChtZXQgIT0gbnVsbCkgeworICAgICAgYWRkKG5ldyBMYWJlbCgibm9fcHJvZF9tZXRfZGlzcGxheSIpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5Db21wb25lbnQjaXNWaXNpYmxlKCkKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgTGlzdDxTdHJpbmc+IG1ldEtleXMgPSBtZXQuZ2V0QWxsS2V5cygpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXRLZXlzKTsKKworICAgICAgYWRkKG5ldyBMaXN0VmlldzxTdHJpbmc+KCJtZXRfZWxlbSIsIG5ldyBMaXN0TW9kZWw8U3RyaW5nPihtZXRLZXlzKSkgeworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlCisgICAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAgICogLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtKQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxTdHJpbmc+IGl0ZW0pIHsKKyAgICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIm1ldF9lbGVtX25hbWUiLCBpdGVtLmdldE1vZGVsT2JqZWN0KCkpKTsKKworICAgICAgICAgIGl0ZW0KKyAgICAgICAgICAgICAgLmFkZChuZXcgTGlzdFZpZXc8U3RyaW5nPigibWV0X3ZhbHVlc19saXN0IiwKKyAgICAgICAgICAgICAgICAgIG5ldyBMaXN0TW9kZWw8U3RyaW5nPihtZXQuZ2V0QWxsTWV0YWRhdGEoaXRlbQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRNb2RlbE9iamVjdCgpKSkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgICAgICAgKiAKKyAgICAgICAgICAgICAgICAgKiBAc2VlCisgICAgICAgICAgICAgICAgICogb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0VmlldyNwb3B1bGF0ZUl0ZW0oCisgICAgICAgICAgICAgICAgICogb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08U3RyaW5nPiBpdGVtKSB7CisgICAgICAgICAgICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIm1ldF92YWx1ZSIsIGl0ZW0uZ2V0TW9kZWxPYmplY3QoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFkZChuZXcgTGFiZWwoIm5vX3Byb2RfbWV0X2Rpc3BsYXkiLCAiTm8gUHJvZHVjdCBNZXRhZGF0YSEiKSk7CisgICAgfQorCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcGFnaW5hdGlvbi9Qcm9kdWN0UGFnaW5hdG9yLmNzcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3BhZ2luYXRpb24vUHJvZHVjdFBhZ2luYXRvci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYzlhYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3BhZ2luYXRpb24vUHJvZHVjdFBhZ2luYXRvci5jc3MKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3BhZ2luYXRvci1icmVha3sKKyAgYm9yZGVyOjI7CisgIHdpZHRoOjEwMCU7Cit9CisKKyNjb250YWluZXItZGl2eworICB3aWR0aDoxMDAlOworfQorCisjcGFnaW5hdG9yLXRhYmxleworICBib3JkZXItc3BhY2luZzozOworICB3aWR0aDoxMDA7Cit9CisKKyNwYWdpbmF0b3ItdGFibGUtaGVhZGVyeworICB3aWR0aDoxMDAlOworICB3aGl0ZS1zcGFjZTpub3dyYXA7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKworI3BhZ2VfcmVwZWF0ZXJ7CisKK30KKworYSwgYTpob3ZlciwgYTpmb2N1cywgYTphY3RpdmV7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuc2VsZWN0ZWR7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgIGNvbG9yOnJlZDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3BhZ2luYXRpb24vUHJvZHVjdFBhZ2luYXRvci5odG1sIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcGFnaW5hdGlvbi9Qcm9kdWN0UGFnaW5hdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiODBmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3BhZ2luYXRpb24vUHJvZHVjdFBhZ2luYXRvci5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0OnJlbW92ZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iUHJvZHVjdFBhZ2luYXRvci5jc3MiLz4KKzwvd2lja2V0OnJlbW92ZT4KKzxociBpZD0icGFnaW5hdG9yLWJyZWFrIj4KKzxkaXYgaWQ9ImNvbnRhaW5lci1kaXYiPgorICAgIDx0YWJsZSBpZD0icGFnaW5hdG9yLXRhYmxlIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIGlkPSJwYWdpbmF0b3ItdGFibGUtaGVhZGVyIj5SZXN1bHQgUGFnZTwvdGQ+CisgICAgICAgICAgPHRkIHdpY2tldDppZD0icGFnZV9yZXBlYXRlciIgaWQ9InBhZ2VfcmVwZWF0ZXIiPjxhIHdpY2tldDppZD0icGFnZUxpbmsiIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iIyI+PHNwYW4gd2lja2V0OmlkPSJwYWdlTnVtIj4xPC9zcGFuPjwvYT48L3RkPiAgICAgICAgICAgICAgICAgICAgCSAKKyAgICAgIDwvdHI+CisgICAgIDwvdGFibGU+Cis8L2Rpdj4KKworPGgzIHdpY2tldDppZD0ibm90aGluZ19mb3VuZCI+Tm8gUHJvZHVjdHMgRm91bmQhPC9oMz4KKzwvd2lja2V0OnBhbmVsPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcGFnaW5hdGlvbi9Qcm9kdWN0UGFnaW5hdG9yLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9wYWdpbmF0aW9uL1Byb2R1Y3RQYWdpbmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJmYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcGFnaW5hdGlvbi9Qcm9kdWN0UGFnaW5hdG9yLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnBhZ2luYXRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyLmJyb3dzZXIudHlwZXMuVHlwZUJyb3dzZXI7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5iZWhhdmlvci5TaW1wbGVBdHRyaWJ1dGVNb2RpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuQm9va21hcmthYmxlUGFnZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworCisvKioKKyAqIAorICogQSBwYWdpbmF0b3IgY29tcG9uZW50IHRoYXQgZXhwYW5kcyB0byBhICsvLSA1IHBhZ2UKKyAqIHdpbmRvdyB0byBwYWdpbmF0ZSBhIHtAbGluayBQcm9kdWN0UGFnZX0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFBhZ2luYXRvciBleHRlbmRzIFBhbmVsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2Mjc3NTM2MzcxNTEzOTc0MjI1TDsKKworICBwcml2YXRlIFByb2R1Y3RQYWdlIHBhZ2U7CisKKyAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lOworCisgIC8qKgorICAgKiBAcGFyYW0gaWQKKyAgICovCisgIHB1YmxpYyBQcm9kdWN0UGFnaW5hdG9yKFN0cmluZyBpZCwgUHJvZHVjdFBhZ2UgcGFnZSwKKyAgICAgIGZpbmFsIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUsIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBXZWJQYWdlPiB0eXBlQnJvd3NlclBhZ2UpIHsKKyAgICBzdXBlcihpZCk7CisgICAgdGhpcy5wYWdlID0gcGFnZTsKKyAgICB0aGlzLnByb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3RUeXBlTmFtZTsKKworICAgIGlmICh0aGlzLnBhZ2UgIT0gbnVsbCAmJiB0aGlzLnBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkgIT0gbnVsbAorICAgICAgICAmJiB0aGlzLnBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkuc2l6ZSgpID4gMCkgeworCisgICAgICBpbnQgbnVtUGFnZXMgPSB0aGlzLnBhZ2UuZ2V0VG90YWxQYWdlcygpOworICAgICAgaW50IGN1cnJQYWdlID0gdGhpcy5wYWdlLmdldFBhZ2VOdW0oKTsKKyAgICAgIGludCB3aW5kb3dTaXplID0gMTA7CisKKyAgICAgIGludCBzdGFydFBhZ2UgPSBNYXRoLm1heCgxLCAoY3VyclBhZ2UgLSAod2luZG93U2l6ZSAvIDIpKSk7CisgICAgICBpbnQgZW5kUGFnZSA9IE1hdGgubWluKGN1cnJQYWdlICsgKHdpbmRvd1NpemUgLyAyKSwgbnVtUGFnZXMpOworICAgICAgTGlzdDxQYWdlTnVtRGlzcGxheT4gcG51bXMgPSB0aGlzLmdldFBhZ2VOdW1EaXNwbGF5KHN0YXJ0UGFnZSwgZW5kUGFnZSwKKyAgICAgICAgICBjdXJyUGFnZSk7CisKKyAgICAgIGFkZChuZXcgTGlzdFZpZXc8UGFnZU51bURpc3BsYXk+KCJwYWdlX3JlcGVhdGVyIiwgcG51bXMpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFBhZ2VOdW1EaXNwbGF5PiBpdGVtKSB7CisgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgcGFyYW1zLmFkZCgibmFtZSIsIHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgICAgcGFyYW1zLnB1dCgicGFnZU51bSIsIGl0ZW0uZ2V0TW9kZWxPYmplY3QoKS5nZXROdW0oKSk7CisgICAgICAgICAgQm9va21hcmthYmxlUGFnZUxpbmsgcGFnZUxpbmsgPSBuZXcgQm9va21hcmthYmxlUGFnZUxpbmsoInBhZ2VMaW5rIiwKKyAgICAgICAgICAgICAgdHlwZUJyb3dzZXJQYWdlLCBwYXJhbXMpOworICAgICAgICAgIHBhZ2VMaW5rLmFkZChuZXcgTGFiZWwoInBhZ2VOdW0iLCBTdHJpbmcudmFsdWVPZihpdGVtCisgICAgICAgICAgICAgIC5nZXRNb2RlbE9iamVjdCgpLmdldE51bSgpKSkpOworICAgICAgICAgIHBhZ2VMaW5rLmFkZChuZXcgU2ltcGxlQXR0cmlidXRlTW9kaWZpZXIoImNsYXNzIiwgaXRlbQorICAgICAgICAgICAgICAuZ2V0TW9kZWxPYmplY3QoKS5pc0N1cnJlbnRQYWdlKCkgPyAic2VsZWN0ZWQiIDogIiIpKTsKKyAgICAgICAgICBpdGVtLmFkZChwYWdlTGluayk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYWRkKG5ldyBMYWJlbCgibm90aGluZ19mb3VuZCIpLnNldFZpc2libGUoZmFsc2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkKG5ldyBMYWJlbCgicGFnZV9yZXBlYXRlciIpLnNldFZpc2libGUoZmFsc2UpKTsKKyAgICAgIGFkZChuZXcgTGFiZWwoInBhZ2VMaW5rIikuc2V0VmlzaWJsZShmYWxzZSkpOworICAgICAgYWRkKG5ldyBMYWJlbCgicGFnZU51bSIpLnNldFZpc2libGUoZmFsc2UpKTsKKyAgICAgIGFkZChuZXcgTGFiZWwoIm5vdGhpbmdfZm91bmQiKS5zZXRWaXNpYmxlKHRydWUpKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgTGlzdDxQYWdlTnVtRGlzcGxheT4gZ2V0UGFnZU51bURpc3BsYXkoaW50IHN0YXJ0UGFnZSwgaW50IGVuZFBhZ2UsCisgICAgICBpbnQgY3VyclBhZ2UpIHsKKyAgICBMaXN0PFBhZ2VOdW1EaXNwbGF5PiBkaXNwbGF5ID0gbmV3IFZlY3RvcjxQYWdlTnVtRGlzcGxheT4oKTsKKyAgICBmb3IgKGludCBpID0gc3RhcnRQYWdlOyBpIDw9IGVuZFBhZ2U7IGkrKykgeworICAgICAgZGlzcGxheS5hZGQobmV3IFBhZ2VOdW1EaXNwbGF5KGkgPT0gY3VyclBhZ2UsIGkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGlzcGxheTsKKyAgfQorCisgIGNsYXNzIFBhZ2VOdW1EaXNwbGF5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MzUxNDcwNzc0NzY0Mjc2NjQ0TDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjdXJyZW50UGFnZTsKKworICAgIHByaXZhdGUgaW50IG51bTsKKworICAgIHB1YmxpYyBQYWdlTnVtRGlzcGxheSgpIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBmYWxzZTsKKyAgICAgIHRoaXMubnVtID0gLTE7CisgICAgfQorCisgICAgcHVibGljIFBhZ2VOdW1EaXNwbGF5KGJvb2xlYW4gY3VycmVudFBhZ2UsIGludCBudW0pIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBjdXJyZW50UGFnZTsKKyAgICAgIHRoaXMubnVtID0gbnVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRQYWdlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDdXJyZW50UGFnZSgpIHsKKyAgICAgIHJldHVybiBjdXJyZW50UGFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY3VycmVudFBhZ2UKKyAgICAgKiAgICAgICAgICB0aGUgY3VycmVudFBhZ2UgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBhZ2UoYm9vbGVhbiBjdXJyZW50UGFnZSkgeworICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGN1cnJlbnRQYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtKCkgeworICAgICAgcmV0dXJuIG51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbnVtCisgICAgICogICAgICAgICAgdGhlIG51bSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdW0oaW50IG51bSkgeworICAgICAgdGhpcy5udW0gPSBudW07CisgICAgfQorCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcHJvZHVjdC9Qcm9kdWN0QnJvd3Nlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9wcm9kdWN0L1Byb2R1Y3RCcm93c2VyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQ2ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcHJvZHVjdC9Qcm9kdWN0QnJvd3Nlci5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNtZXRfdGFibGV7CisKK30KKworI21ldF9lbGVtX25hbWV7CisJCit9CisKKyNtZXRfdmFsdWVzX3RhYmxleworCit9CisKKy5uYWRheworCQorfQorCisjcmVmX3RhYmxleworCQorfQorCisjcmVmX3RhYmxlX2hkcnsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdEJyb3dzZXIuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdEJyb3dzZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkxMGIxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcHJvZHVjdC9Qcm9kdWN0QnJvd3Nlci5odG1sCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0OnJlbW92ZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iUHJvZHVjdEJyb3dzZXIuY3NzIi8+Cis8L3dpY2tldDpyZW1vdmU+CisKKzxoMz5Qcm9kdWN0OiA8c3BhbiB3aWNrZXQ6aWQ9InByb2R1Y3RfbmFtZSI+Zm9vLnR4dDwvc3Bhbj48L2gzPgorPHA+UGVyY2VudCBUcmFuc2ZlcnJlZDogPHNwYW4gd2lja2V0OmlkPSJwcm9kdWN0X3BjdF90cmFuc2ZlciI+MTAwJTwvc3Bhbj48L3A+Cis8YSBocmVmPSIjUmVmZXJlbmNlcyI+SnVtcCB0byBSZWZlcmVuY2VzPC9hPgorICAgICAgICAgICAgICAgIAorPGgzPk1ldGFkYXRhPC9oMz4KKyAgPHRhYmxlIGlkPSJtZXRfdGFibGUiPgorICAgIDx0ciB3aWNrZXQ6aWQ9Im1ldF9lbGVtIj4KKyAgICAgIDx0ZCB3aWNrZXQ6aWQ9Im1ldF9lbGVtX25hbWUiIGlkPSJtZXRfZWxlbV9uYW1lIj5DQVMuUHJvZHVjdE5hbWU8L3RkPgorICAgICAgPHRkPgorICAgICAgICAgPHRhYmxlIGlkPSJtZXRfdmFsdWVzX3RhYmxlIj4KKyAgICAgICAgICA8dHIgd2lja2V0OmlkPSJtZXRfdmFsdWVzX2xpc3QiPgorICAgICAgICAgICAgIDx0ZCB3aWNrZXQ6aWQ9Im1ldF92YWx1ZSI+Zm9vLnR4dDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgIDwvdGFibGU+CisgICAgICA8L3RkPgorICAgICA8L3RyPgorICAgPC90YWJsZT4KKyAgIAorICAgPGgzIHdpY2tldDppZD0ibm9fcHJvZF9tZXRfZGlzcGxheSIgY2xhc3M9Im5hZGEiPk5vIFByb2R1Y3QgTWV0YWRhdGEhPC9oMz4KKyAgIDxwPiZuYnNwOzwvcD4KKyAgIDxwPiZuYnNwOzwvcD4KKyAgIDxhIG5hbWU9IlJlZmVyZW5jZXMiPjwvYT4KKworPGgzPlJlZmVyZW5jZXM8L2gzPgorICA8dGFibGUgaWQ9InJlZl90YWJsZSI+CisgICAgPHRyIGlkPSJyZWZfdGFibGVfaGRyIj4KKyAgICAgIDx0ZD5GaWxlIExvY2F0aW9uPC90ZD4KKyAgICAgIDx0ZD5GaWxlIFNpemU8L3RkPgorICAgICAgPHRkPlBlcmNlbnQgVHJhbnNmZXJyZWQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIHdpY2tldDppZD0icmVmX2xpc3QiPgorICAgICAgPHRkIHdpY2tldDppZD0icmVmX2ZpbGVfcGF0aCI+L2hvbWUvZmlsZXMvZm9vLnR4dC9mb28udHh0PC90ZD4KKyAgICAgIDx0ZCB3aWNrZXQ6aWQ9InJlZl9maWxlX3NpemUiPjQwMjg8L3RkPgorICAgICAgPHRkIHdpY2tldDppZD0icmVmX3BjdF90cmFuc2ZlcnJlZCI+MTAwJTwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDMgd2lja2V0OmlkPSJub19wcm9kX3JlZl9kaXNwbGF5IiBjbGFzcz0ibmFkYSI+Tm8gUHJvZHVjdCBSZWZlcmVuY2VzITwvaDM+Cis8L3dpY2tldDpwYW5lbD4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdEJyb3dzZXIuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdEJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJkZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcHJvZHVjdC9Qcm9kdWN0QnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuYnJvd3Nlci5wcm9kdWN0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5GaWxlTWFuYWdlckNvbm47CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiBUaGlzIHBhZ2UgaXMgbW91bnRlZCB0bzoKKyAqIAorICogPGNvZGU+L2Jyb3dzZXIvcHJvZHVjdC9bUHJvZHVjdElkXTwvY29kZT4KKyAqIAorICogQSB7QGxpbmsgUHJvZHVjdH0gd2ViIHBhZ2UgY29tcG9uZW50IHRvIGRpc3BsYXkgCisgKiBhbGwgb2YgaXRzIG1ldGFkYXRhIGFuZCByZWZlcmVuY2UgaW5mb3JtYXRpb24uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdEJyb3dzZXIgZXh0ZW5kcyBQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEyMDQ0OTE2MDk0MjM2NzcwMzJMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb2R1Y3RCcm93c2VyLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKyAgCisgIHByaXZhdGUgRmlsZU1hbmFnZXJDb25uIGZtOworCisgIHB1YmxpYyBQcm9kdWN0QnJvd3NlcihTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyBmbVVybFN0ciwgU3RyaW5nIHByb2R1Y3RJZCkgeworICAgIHN1cGVyKGNvbXBvbmVudElkKTsKKyAgICB0aGlzLmZtID0gbmV3IEZpbGVNYW5hZ2VyQ29ubihmbVVybFN0cik7CisgICAgUHJvZHVjdCBwcm9kdWN0ID0gZm0uc2FmZUdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBwcm9kdWN0UGN0VHJhbnNmZXJyZWQgPSBOdW1iZXJGb3JtYXQuZ2V0UGVyY2VudEluc3RhbmNlKCkuZm9ybWF0KAorICAgICAgICAgIGZtLmdldEZtKCkuZ2V0UHJvZHVjdFBjdFRyYW5zZmVycmVkKAorICAgICAgICAgICAgICBwcm9kdWN0KSk7CisgICAgICBhZGQobmV3IExhYmVsKCJwcm9kdWN0X3BjdF90cmFuc2ZlciIsIHByb2R1Y3RQY3RUcmFuc2ZlcnJlZCkpOworICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZGV0ZXJtaW5lIHBjdCB0cmFuc2ZlciBmb3IgcHJvZHVjdDogWyIKKyAgICAgICAgICArIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICJdOiBSZWFzb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYWRkKG5ldyBMYWJlbCgicHJvZHVjdF9uYW1lIiwgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpKSk7CisgICAgZmluYWwgTWV0YWRhdGEgbWV0ID0gZm0uZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisgICAgaWYgKG1ldCAhPSBudWxsKSB7CisgICAgICBhZGQobmV3IExhYmVsKCJub19wcm9kX21ldF9kaXNwbGF5IikgeworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0LkNvbXBvbmVudCNpc1Zpc2libGUoKQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICBMaXN0PFN0cmluZz4gbWV0S2V5cyA9IG1ldC5nZXRBbGxLZXlzKCk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1ldEtleXMpOworCisgICAgICBhZGQobmV3IExpc3RWaWV3PFN0cmluZz4oIm1ldF9lbGVtIiwgbmV3IExpc3RNb2RlbDxTdHJpbmc+KG1ldEtleXMpKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUKKyAgICAgICAgICogb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0VmlldyNwb3B1bGF0ZUl0ZW0ob3JnLmFwYWNoZQorICAgICAgICAgKiAud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdEl0ZW0pCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFN0cmluZz4gaXRlbSkgeworICAgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgibWV0X2VsZW1fbmFtZSIsIGl0ZW0uZ2V0TW9kZWxPYmplY3QoKSkpOworCisgICAgICAgICAgaXRlbQorICAgICAgICAgICAgICAuYWRkKG5ldyBMaXN0VmlldzxTdHJpbmc+KCJtZXRfdmFsdWVzX2xpc3QiLAorICAgICAgICAgICAgICAgICAgbmV3IExpc3RNb2RlbDxTdHJpbmc+KG1ldC5nZXRBbGxNZXRhZGF0YShpdGVtCisgICAgICAgICAgICAgICAgICAgICAgLmdldE1vZGVsT2JqZWN0KCkpKSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgICAgICAqIAorICAgICAgICAgICAgICAgICAqIEBzZWUKKyAgICAgICAgICAgICAgICAgKiBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3I3BvcHVsYXRlSXRlbSgKKyAgICAgICAgICAgICAgICAgKiBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxTdHJpbmc+IGl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgibWV0X3ZhbHVlIiwgaXRlbS5nZXRNb2RlbE9iamVjdCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KTsKKworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkKG5ldyBMYWJlbCgibm9fcHJvZF9tZXRfZGlzcGxheSIsICJObyBQcm9kdWN0IE1ldGFkYXRhISIpKTsKKyAgICB9CisKKyAgICBMaXN0PFJlZmVyZW5jZT4gcmVmcyA9IGZtCisgICAgICAgIC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICBpZiAocmVmcyAhPSBudWxsICYmIHJlZnMuc2l6ZSgpID4gMCkgeworICAgICAgYWRkKG5ldyBMYWJlbCgibm9fcHJvZF9yZWZfZGlzcGxheSIpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5Db21wb25lbnQjaXNWaXNpYmxlKCkKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgYWRkKG5ldyBMaXN0VmlldzxSZWZlcmVuY2U+KCJyZWZfbGlzdCIsIG5ldyBMaXN0TW9kZWw8UmVmZXJlbmNlPihyZWZzKSkgeworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlCisgICAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAgICogLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtKQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxSZWZlcmVuY2U+IHJlZkl0ZW0pIHsKKyAgICAgICAgICBSZWZlcmVuY2UgciA9IHJlZkl0ZW0uZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBudWxsOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlUGF0aCA9IG5ldyBGaWxlKG5ldyBVUkkoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWZJdGVtLmFkZChuZXcgTGFiZWwoInJlZl9maWxlX3BhdGgiLCBmaWxlUGF0aCkpOworICAgICAgICAgIHJlZkl0ZW0uYWRkKG5ldyBMYWJlbCgicmVmX2ZpbGVfc2l6ZSIsIFN0cmluZworICAgICAgICAgICAgICAudmFsdWVPZihyLmdldEZpbGVTaXplKCkpKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZkl0ZW0uYWRkKG5ldyBMYWJlbCgicmVmX3BjdF90cmFuc2ZlcnJlZCIsIE51bWJlckZvcm1hdAorICAgICAgICAgICAgICAgIC5nZXRQZXJjZW50SW5zdGFuY2UoKS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgZm0uZ2V0Rm0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlZlBjdFRyYW5zZmVycmVkKHIpKSkpOworICAgICAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgcHJvZHVjdCByZWZlcmVuY2Ugc2l6ZTogUmVhc29uOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmVmSXRlbS5hZGQobmV3IExhYmVsKCJyZWZfcGN0X3RyYW5zZmVycmVkIiwgIk4vQSIpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFkZChuZXcgTGFiZWwoIm5vX3Byb2RfcmVmX2Rpc3BsYXkiLCAiTm8gUHJvZHVjdCBSZWZlcmVuY2VzISIpKTsKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9wcm9kdWN0L1Byb2R1Y3RSZWZzQnJvd3Nlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9wcm9kdWN0L1Byb2R1Y3RSZWZzQnJvd3Nlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTFiZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdFJlZnNCcm93c2VyLmNzcwpAQCAtMCwwICsxLDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLm5hZGF7CisJCit9CisKKyNyZWZfdGFibGV7CisJCit9CisKKyNyZWZfdGFibGVfaGRyeworCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvcHJvZHVjdC9Qcm9kdWN0UmVmc0Jyb3dzZXIuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdFJlZnNCcm93c2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1Y2QzYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdFJlZnNCcm93c2VyLmh0bWwKQEAgLTAsMCArMSwzOSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpwYW5lbD4KKzx3aWNrZXQ6cmVtb3ZlPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJQcm9kdWN0UmVmc0Jyb3dzZXIuY3NzIi8+Cis8L3dpY2tldDpyZW1vdmU+CisKKworPGEgbmFtZT0iUmVmZXJlbmNlcyI+PC9hPgorPGgzPlJlZmVyZW5jZXM8L2gzPgorICA8dGFibGUgaWQ9InJlZl90YWJsZSI+CisgICAgPHRyIGlkPSJyZWZfdGFibGVfaGRyIj4KKyAgICAgIDx0ZD5GaWxlIExvY2F0aW9uPC90ZD4KKyAgICAgIDx0ZD5GaWxlIFNpemU8L3RkPgorICAgICAgPHRkPlBlcmNlbnQgVHJhbnNmZXJyZWQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIHdpY2tldDppZD0icmVmX2xpc3QiPgorICAgICAgPHRkIHdpY2tldDppZD0icmVmX2ZpbGVfcGF0aCI+L2hvbWUvZmlsZXMvZm9vLnR4dC9mb28udHh0PC90ZD4KKyAgICAgIDx0ZCB3aWNrZXQ6aWQ9InJlZl9maWxlX3NpemUiPjQwMjg8L3RkPgorICAgICAgPHRkIHdpY2tldDppZD0icmVmX3BjdF90cmFuc2ZlcnJlZCI+MTAwJTwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDMgd2lja2V0OmlkPSJub19wcm9kX3JlZl9kaXNwbGF5IiBjbGFzcz0ibmFkYSI+Tm8gUHJvZHVjdCBSZWZlcmVuY2VzITwvaDM+Cis8L3dpY2tldDpwYW5lbD4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3Byb2R1Y3QvUHJvZHVjdFJlZnNCcm93c2VyLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9wcm9kdWN0L1Byb2R1Y3RSZWZzQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmY0NjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci9wcm9kdWN0L1Byb2R1Y3RSZWZzQnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuYnJvd3Nlci5wcm9kdWN0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuRmlsZU1hbmFnZXJDb25uOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLnV0aWwuTGlzdE1vZGVsOworCisvKioKKyAqCisgKiBDb21wb25lbnQgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgYSB7QGxpbmsgUHJvZHVjdH1zCisgKiB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFJlZmVyZW5jZX1zLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0UmVmc0Jyb3dzZXIgZXh0ZW5kcyBQYW5lbCB7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjI3ODE4ODMwOTY2OTczNzc5OEw7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUHJvZHVjdFJlZnNCcm93c2VyLmNsYXNzLmdldE5hbWUoKSk7CisgIAorICBwcml2YXRlIEZpbGVNYW5hZ2VyQ29ubiBmbTsKKyAgCisgIHB1YmxpYyBQcm9kdWN0UmVmc0Jyb3dzZXIoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgZm1VcmxTdHIsIFN0cmluZyBwcm9kdWN0SWQpeworICAgIHN1cGVyKGNvbXBvbmVudElkKTsKKyAgICB0aGlzLmZtID0gbmV3IEZpbGVNYW5hZ2VyQ29ubihmbVVybFN0cik7CisgICAgTGlzdDxSZWZlcmVuY2U+IHJlZnMgPSBudWxsOworICAgIHRyeSB7CisgICAgICByZWZzID0gZm0uZ2V0UHJvZHVjdFJlZmVyZW5jZXMoZm0uZ2V0Rm0oKS5nZXRQcm9kdWN0QnlJZChwcm9kdWN0SWQpKTsKKyAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUxKSB7CisgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKKyAgICAgIGFkZChuZXcgTGFiZWwoIm5vX3Byb2RfcmVmX2Rpc3BsYXkiKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQuQ29tcG9uZW50I2lzVmlzaWJsZSgpCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIGFkZChuZXcgTGlzdFZpZXc8UmVmZXJlbmNlPigicmVmX2xpc3QiLCBuZXcgTGlzdE1vZGVsPFJlZmVyZW5jZT4ocmVmcykpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZQorICAgICAgICAgKiBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3I3BvcHVsYXRlSXRlbShvcmcuYXBhY2hlCisgICAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08UmVmZXJlbmNlPiByZWZJdGVtKSB7CisgICAgICAgICAgUmVmZXJlbmNlIHIgPSByZWZJdGVtLmdldE1vZGVsT2JqZWN0KCk7CisgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZVBhdGggPSBuZXcgRmlsZShuZXcgVVJJKHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKQorICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVmSXRlbS5hZGQobmV3IExhYmVsKCJyZWZfZmlsZV9wYXRoIiwgZmlsZVBhdGgpKTsKKyAgICAgICAgICByZWZJdGVtLmFkZChuZXcgTGFiZWwoInJlZl9maWxlX3NpemUiLCBTdHJpbmcKKyAgICAgICAgICAgICAgLnZhbHVlT2Yoci5nZXRGaWxlU2l6ZSgpKSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWZJdGVtLmFkZChuZXcgTGFiZWwoInJlZl9wY3RfdHJhbnNmZXJyZWQiLCBOdW1iZXJGb3JtYXQKKyAgICAgICAgICAgICAgICAuZ2V0UGVyY2VudEluc3RhbmNlKCkuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBmbS5nZXRGbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVmUGN0VHJhbnNmZXJyZWQocikpKSk7CisgICAgICAgICAgfSBjYXRjaCAoRGF0YVRyYW5zZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRldGVybWluZSBwcm9kdWN0IHJlZmVyZW5jZSBzaXplOiBSZWFzb246ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZWZJdGVtLmFkZChuZXcgTGFiZWwoInJlZl9wY3RfdHJhbnNmZXJyZWQiLCAiTi9BIikpOworICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkKG5ldyBMYWJlbCgibm9fcHJvZF9yZWZfZGlzcGxheSIsICJObyBQcm9kdWN0IFJlZmVyZW5jZXMhIikpOworICAgIH0gICAgCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvdHlwZXMvVHlwZUJyb3dzZXIuY3NzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvdHlwZXMvVHlwZUJyb3dzZXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTEyNTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlQnJvd3Nlci5jc3MKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNjcml0ZXJpYV9mb3JtX2FkZF9lbGVtZW50X3ZhbHVleworCWZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKyNwcm9kdWN0X3RhYmxleworCWJvcmRlcjoxcHg7CisJYm9yZGVyLXNwYWNpbmc6MnB4OworCWJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7CisJd2lkdGg6ODAwcHg7Cit9CisKKyNwcm9kdWN0X3RhYmxlIHRkeworICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOworICBtYXJnaW46IDA7IAorICBwYWRkaW5nOiAycHg7Cit9CisKKyNwYWdpbmF0aW9uX3RhYmxleworCWJvcmRlci1zcGFjaW5nOjNweDsKKwl3aWR0aDoxMDAlOworfQorCisjcGFnaW5hdGlvbl90YWJsZV9yZXN1bHRfaGRyeworCXdpZHRoOjEwMHB4OworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJZm9udC13ZWlnaHQ6Ym9sZDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3R5cGVzL1R5cGVCcm93c2VyLmh0bWwgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlQnJvd3Nlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGQzZmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlQnJvd3Nlci5odG1sCkBAIC0wLDAgKzEsOTUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0OnJlbW92ZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iVHlwZUJyb3dzZXIuY3NzIi8+Cis8L3dpY2tldDpyZW1vdmU+CisKKzxoMyB3aWNrZXQ6aWQ9InB0eXBlX25hbWUiPkdlbmVyaWNGaWxlIFByb2R1Y3RzPC9oMz4KKyAgIAorPHA+U2hvd2luZyBwcm9kdWN0cyA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIHdpY2tldDppZD0ic3RhcnRfaWR4Ij4xPC9zcGFuPi08c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIHdpY2tldDppZD0iZW5kX2lkeCI+MjA8L3NwYW4+IAorb2YgPHNwYW4gd2lja2V0OmlkPSJudW1fcHJvZHVjdHMiPjEwMDwvc3Bhbj4gdG90YWw8L3A+CisKKzxoND5FeGlzdGluZyBGaWx0ZXIgQ3JpdGVyaWE8L2g0PgorCis8Zm9ybSB3aWNrZXQ6aWQ9ImV4aXN0aW5nX2NyaXRlcmlhX2Zvcm0iPgorPHRhYmxlPgorICA8dHIgd2lja2V0OmlkPSJjcml0ZXJpYV9zZWxlY3RlZF9yb3ciPgorICAgIDx0ZD48c3BhbiB3aWNrZXQ6aWQ9ImNyaXRlcmlhX2VsZW1fbmFtZSI+Q0FTLlByb2R1Y3ROYW1lPC9zcGFuPiA9IAorICAgICAgICA8c3BhbiB3aWNrZXQ6aWQ9ImNyaXRlcmlhX2VsZW1fdmFsdWUiPmZvby50eHQ8L3NwYW4+CisgICAgPC90ZD4KKyAgICA8dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlJlbW92ZSIgd2lja2V0OmlkPSJjcml0ZXJpYV9lbGVtX3JlbW92ZSIvPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPC9mb3JtPgorCis8aDQ+U3BlY2lmeSBOZXcgRmlsdGVyIENyaXRlcmlhPC9oND4KKzxmb3JtIHdpY2tldDppZD0ibmV3X2NyaXRlcmlhX2Zvcm0iPgorPHRhYmxlPgorICA8dHI+CisgICAgPHRkPjxzZWxlY3Qgd2lja2V0OmlkPSJjcml0ZXJpYV9saXN0Ij4KKyAgICAgICAgPHdpY2tldDpyZW1vdmU+CisgICAgICAgICAgPG9wdGlvbiBpZD0idXJuOm9vZHQ6UHJvZHVjdE5hbWUiPlByb2R1Y3ROYW1lPC9vcHRpb24+CisgICAgICAgIDwvd2lja2V0OnJlbW92ZT4KKyAgICAgICAgPC9zZWxlY3Q+CisgICAgPC90ZD4KKyAgICA8dGQ+CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMjAiIG1heGxlbmd0aD0iMjU1IiBpZD0iY3JpdGVyaWFfZm9ybV9hZGRfZWxlbWVudF92YWx1ZSIgd2lja2V0OmlkPSJjcml0ZXJpYV9mb3JtX2FkZF9lbGVtZW50X3ZhbHVlIi8+CisgICAgPC90ZD4KKyAgICA8dGQ+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQWRkIiB3aWNrZXQ6aWQ9ImNyaXRlcmlhX2VsZW1fYWRkIi8+CisgICAgPC90ZD4KKyAgPC90cj4KKyA8L3RhYmxlPgorICAgICAgICAgICAgICAgIAorPC9mb3JtPgorCis8dGFibGUgaWQ9InByb2R1Y3RfdGFibGUiPgorPHRyPgorICA8dGQ+UHJvZHVjdDwvdGQ+CisgIDx0ZD5UcmFuc2ZlciBTdGF0dXM8L3RkPgorICA8dGQ+UGVyY2VudCBDb21wbGV0ZTwvdGQ+CisgIDx0ZD5SZWNlaXZlZCBUaW1lPC90ZD4KKyAgPHRkPlJlZmVyZW5jZXM8L3RkPgorICA8dGQ+TWV0YWRhdGE8L3RkPgorPC90cj4KKzx0ciB3aWNrZXQ6aWQ9InByb2R1Y3RfbGlzdCI+CisgPHRkPjxhIGhyZWY9IiMiIHdpY2tldDppZD0icHJvZHVjdF9wYWdlX2xpbmsiPjxzcGFuIHdpY2tldDppZD0icHJvZHVjdF9uYW1lIj5UZXN0IFByb2R1Y3Q8L3NwYW4+PC9hPjwvdGQ+CisgPHRkIHdpY2tldDppZD0icHJvZHVjdF90cmFuc2Zlcl9zdGF0dXMiPlJFQ0VJVkVEPC90ZD4KKyA8dGQgd2lja2V0OmlkPSJwcm9kdWN0X3BjdF90cmFuc2ZlcnJlZCI+MTAwJTwvdGQ+CisgPHRkIHdpY2tldDppZD0icHJvZHVjdF9yZWNlaXZlZF90aW1lIj4yMDExLTAxLTExVDAwOjAwOjAxLjAwMFo8L3RkPgorIDx0ZD48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9InJlZl9wYWdlX2xpbmsiPlZpZXcgUmVmZXJlbmNlczwvYT48L3RkPgorIDx0ZD48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9Im1ldF9wYWdlX2xpbmsiPlZpZXcgTWV0YWRhdGE8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorICAgICAgICAgICAgICAgCis8cD4mbmJzcDs8L3A+Cis8cD4mbmJzcDs8L3A+Cis8c3BhbiB3aWNrZXQ6aWQ9InBhZ2luYXRvciI+PC9zcGFuPgorPHdpY2tldDpyZW1vdmU+Cis8aHIgd2lkdGg9IioiPgorPGRpdiBhbGlnbj0iY2VudGVyIj4KKzx0YWJsZSBpZD0icGFnaW5hdGlvbl90YWJsZSI+CisgIDx0cj4KKyAgICA8dGQgaWQ9InBhZ2luYXRpb25fdGFibGVfcmVzdWx0X2hkciI+UmVzdWx0IFBhZ2U8L3RkPgorICAgIAorCisgPC90cj4KKyA8L3RhYmxlPgorIDwvZGl2PgorIDwvd2lja2V0OnJlbW92ZT4KKzwvd2lja2V0OnBhbmVsPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvdHlwZXMvVHlwZUJyb3dzZXIuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3R5cGVzL1R5cGVCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5MDJlYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3R5cGVzL1R5cGVCcm93c2VyLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnR5cGVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5UZXJtUXVlcnlDcml0ZXJpYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5TZXJpYWxpemFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5GTUJyb3dzZXJTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyLkZpbGVNYW5hZ2VyQ29ubjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnBhZ2luYXRpb24uUHJvZHVjdFBhZ2luYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5tb2RlbC5Qcm9kdWN0TW9kZWw7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmZvcm0uQnV0dG9uOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmZvcm0uQ2hvaWNlUmVuZGVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuZm9ybS5Ecm9wRG93bkNob2ljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuZm9ybS5UZXh0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuUG9wdXBTZXR0aW5nczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwuQ29tcG91bmRQcm9wZXJ0eU1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLlByb3BlcnR5TW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiBUaGlzIHBhZ2UgaXMgbW91bnRlZCB0bzoKKyAqIAorICogPGNvZGU+L2Jyb3dzZXIvdHlwZS9bVHlwZU5hbWVdPC9jb2RlPi4KKyAqIAorICogQW5kIHByb3ZpZGVzIGEgcXVlcnktYmFzZWQsIHByb2R1Y3QgYnJvd3NlciwgY29tcGxldGUgd2l0aCBwYWdpbmF0aW9uCisgKiBwcm92aWRlZCBieSB0aGUgYXR0YWNoZWQge0BsaW5rIFByb2R1Y3RQYWdpbmF0b3J9IGNvbXBvbmVudC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlQnJvd3NlciBleHRlbmRzIFBhbmVsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihUeXBlQnJvd3Nlci5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHJpdmF0ZSBMaXN0PFRlcm1RdWVyeUNyaXRlcmlhPiBjcml0ZXJpYTsKKworICBwcml2YXRlIFByb2R1Y3RUeXBlIHR5cGU7CisKKyAgcHJpdmF0ZSBQcm9kdWN0UGFnZSBwcm9kdWN0UGFnZTsKKworICBwcml2YXRlIGludCBwYWdlTnVtOworCisgIHByaXZhdGUgaW50IHN0YXJ0SWR4OworCisgIHByaXZhdGUgaW50IGVuZElkeDsKKworICBwcml2YXRlIGludCB0b3RhbFByb2R1Y3RzOworCisgIHByaXZhdGUgRmlsZU1hbmFnZXJDb25uIGZtOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkUgPSAyMDsKKworICBwdWJsaWMgVHlwZUJyb3dzZXIoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgZm1VcmxTdHIsCisgICAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lLCBpbnQgcGFnZU51bSwKKyAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBXZWJQYWdlPiB0eXBlQnJvd3NlclBhZ2UsCisgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgV2ViUGFnZT4gcHJvZHVkY3RCcm93c2VyLAorICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdlYlBhZ2U+IHByb2RSZWZzQnJvd3NlciwKKyAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBXZWJQYWdlPiBwcm9kTWV0QnJvd3NlcikgeworCisgICAgc3VwZXIoY29tcG9uZW50SWQpOworICAgIHRoaXMuZm0gPSBuZXcgRmlsZU1hbmFnZXJDb25uKGZtVXJsU3RyKTsKKyAgICB0aGlzLnR5cGUgPSBmbS5zYWZlR2V0UHJvZHVjdFR5cGVCeU5hbWUocHJvZHVjdFR5cGVOYW1lKTsKKyAgICB0aGlzLnBhZ2VOdW0gPSBwYWdlTnVtOworICAgIHRoaXMuY3JpdGVyaWEgPSAoKEZNQnJvd3NlclNlc3Npb24pIGdldFNlc3Npb24oKSkuZ2V0Q3JpdGVyaWEoKTsKKyAgICB0aGlzLnJlZnJlc2hQcm9kdWN0UGFnZSgpOworICAgIHRoaXMuY29tcHV0ZVN0YXJ0RW5kSWR4KCk7CisKKyAgICBhZGQobmV3IEV4aXN0aW5nQ3JpdGVyaWFGb3JtKCJleGlzdGluZ19jcml0ZXJpYV9mb3JtIikpOworICAgIGFkZChuZXcgQWRkQ3JpdGVyaWFGb3JtKCJuZXdfY3JpdGVyaWFfZm9ybSIpKTsKKworICAgIGFkZChuZXcgTGFiZWwoInB0eXBlX25hbWUiLCB0eXBlLmdldE5hbWUoKSkpOworICAgIGFkZChuZXcgTGFiZWwoInN0YXJ0X2lkeCIsIFN0cmluZy52YWx1ZU9mKHRoaXMuc3RhcnRJZHgpKSk7CisgICAgYWRkKG5ldyBMYWJlbCgiZW5kX2lkeCIsIFN0cmluZy52YWx1ZU9mKHRoaXMuZW5kSWR4KSkpOworICAgIGFkZChuZXcgTGFiZWwoIm51bV9wcm9kdWN0cyIsIFN0cmluZy52YWx1ZU9mKHRoaXMudG90YWxQcm9kdWN0cykpKTsKKworICAgIGFkZChuZXcgTGlzdFZpZXc8UHJvZHVjdD4oInByb2R1Y3RfbGlzdCIsIHRoaXMucHJvZHVjdFBhZ2UKKyAgICAgICAgLmdldFBhZ2VQcm9kdWN0cygpKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlCisgICAgICAgKiBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3I3BvcHVsYXRlSXRlbShvcmcuYXBhY2hlCisgICAgICAgKiAud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdEl0ZW0pCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFByb2R1Y3Q+IHByb2RJdGVtKSB7CisgICAgICAgIExpbmsgcHJvZFBhZ2VMaW5rID0gbmV3IExpbms8UHJvZHVjdD4oInByb2R1Y3RfcGFnZV9saW5rIiwKKyAgICAgICAgICAgIG5ldyBQcm9kdWN0TW9kZWwocHJvZEl0ZW0uZ2V0TW9kZWxPYmplY3QoKSkpIHsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAqIAorICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rI29uQ2xpY2soKQorICAgICAgICAgICAqLworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQoImlkIiwgdGhpcy5nZXRNb2RlbE9iamVjdCgpLmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShwcm9kdWRjdEJyb3dzZXIsIHBhcmFtcyk7CisKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJvZFBhZ2VMaW5rLmFkZChuZXcgTGFiZWwoInByb2R1Y3RfbmFtZSIsIHByb2RJdGVtLmdldE1vZGVsT2JqZWN0KCkKKyAgICAgICAgICAgIC5nZXRQcm9kdWN0TmFtZSgpKSk7CisgICAgICAgIHByb2RJdGVtLmFkZChwcm9kUGFnZUxpbmspOworCisgICAgICAgIHByb2RJdGVtLmFkZChuZXcgTGFiZWwoInByb2R1Y3RfdHJhbnNmZXJfc3RhdHVzIiwgcHJvZEl0ZW0KKyAgICAgICAgICAgIC5nZXRNb2RlbE9iamVjdCgpLmdldFRyYW5zZmVyU3RhdHVzKCkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwcm9kSXRlbS5hZGQobmV3IExhYmVsKCJwcm9kdWN0X3BjdF90cmFuc2ZlcnJlZCIsIE51bWJlckZvcm1hdAorICAgICAgICAgICAgICAuZ2V0UGVyY2VudEluc3RhbmNlKCkuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgZm0uZ2V0Rm0oKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0UGN0VHJhbnNmZXJyZWQocHJvZEl0ZW0uZ2V0TW9kZWxPYmplY3QoKSkpKSk7CisgICAgICAgIH0gY2F0Y2ggKERhdGFUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIG9idGFpbiB0cmFuc2ZlciBwZXJjZW50YWdlIGZvciBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgKyBwcm9kSXRlbS5nZXRNb2RlbE9iamVjdCgpLmdldFByb2R1Y3ROYW1lKCkgKyAiXTogUmVhc29uOiAiCisgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwcm9kUmVjZWl2ZWRUaW1lID0gZm0uZ2V0UHJvZFJlY2VpdmVkVGltZShwcm9kSXRlbQorICAgICAgICAgICAgLmdldE1vZGVsT2JqZWN0KCkpOworICAgICAgICBwcm9kSXRlbS5hZGQobmV3IExhYmVsKCJwcm9kdWN0X3JlY2VpdmVkX3RpbWUiLCBwcm9kUmVjZWl2ZWRUaW1lKSk7CisgICAgICAgIFBvcHVwU2V0dGluZ3MgcmVmU2V0dGluZ3MgPSBuZXcgUG9wdXBTZXR0aW5ncygpOworICAgICAgICByZWZTZXR0aW5ncy5zZXRXaWR0aCg1MjUpLnNldEhlaWdodCg0NTApLnNldFdpbmRvd05hbWUoIl9yZWZXaW4iKTsKKyAgICAgICAgTGluazxTdHJpbmc+IHJlZkxpbmsgPSBuZXcgTGluazxTdHJpbmc+KCJyZWZfcGFnZV9saW5rIiwKKyAgICAgICAgICAgIG5ldyBNb2RlbDxTdHJpbmc+KHByb2RJdGVtLmdldE1vZGVsT2JqZWN0KCkuZ2V0UHJvZHVjdElkKCkpKSB7CisKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgKiAKKyAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBwYXJhbXMuYWRkKCJpZCIsIGdldE1vZGVsT2JqZWN0KCkpOworICAgICAgICAgICAgc2V0UmVzcG9uc2VQYWdlKHByb2RSZWZzQnJvd3NlciwgcGFyYW1zKTsKKworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmVmTGluay5zZXRQb3B1cFNldHRpbmdzKHJlZlNldHRpbmdzKTsKKyAgICAgICAgcHJvZEl0ZW0uYWRkKHJlZkxpbmspOworCisgICAgICAgIFNlcmlhbGl6YWJsZU1ldGFkYXRhIG1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShmbQorICAgICAgICAgICAgLmdldE1ldGFkYXRhKHByb2RJdGVtLmdldE1vZGVsT2JqZWN0KCkpKTsKKyAgICAgICAgTGluazxTdHJpbmc+IG1ldExpbmsgPSBuZXcgTGluazxTdHJpbmc+KCJtZXRfcGFnZV9saW5rIiwgbmV3IE1vZGVsKAorICAgICAgICAgICAgcHJvZEl0ZW0uZ2V0TW9kZWxPYmplY3QoKS5nZXRQcm9kdWN0SWQoKSkpIHsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAqIAorICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rI29uQ2xpY2soKQorICAgICAgICAgICAqLworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQoImlkIiwgZ2V0TW9kZWxPYmplY3QoKSk7CisgICAgICAgICAgICBzZXRSZXNwb25zZVBhZ2UocHJvZE1ldEJyb3dzZXIsIHBhcmFtcyk7CisKKyAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICBQb3B1cFNldHRpbmdzIG1ldFNldHRpbmdzID0gbmV3IFBvcHVwU2V0dGluZ3MoKTsKKyAgICAgICAgbWV0U2V0dGluZ3Muc2V0V2lkdGgoNTI1KS5zZXRIZWlnaHQoNDUwKS5zZXRXaW5kb3dOYW1lKCJfbWV0V2luIik7CisgICAgICAgIG1ldExpbmsuc2V0UG9wdXBTZXR0aW5ncyhtZXRTZXR0aW5ncyk7CisgICAgICAgIHByb2RJdGVtLmFkZChtZXRMaW5rKTsKKworICAgICAgfQorCisgICAgfSk7CisKKyAgICBhZGQobmV3IFByb2R1Y3RQYWdpbmF0b3IoInBhZ2luYXRvciIsIHRoaXMucHJvZHVjdFBhZ2UsCisgICAgICAgIHRoaXMudHlwZS5nZXROYW1lKCksIHR5cGVCcm93c2VyUGFnZSkpOworCisgIH0KKworICBwcml2YXRlIHZvaWQgcmVmcmVzaFByb2R1Y3RQYWdlKCkgeworICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJDQUxMSU5HIFJFRlJFU0ggUFJPRFVDVCBQQUdFLCBDUklURVJJQToiKTsKKyAgICBmb3IgKFRlcm1RdWVyeUNyaXRlcmlhIGNyaXQgOiB0aGlzLmNyaXRlcmlhKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3JpdCk7CisgICAgfQorICAgIHF1ZXJ5LmdldENyaXRlcmlhKCkuYWRkQWxsKHRoaXMuY3JpdGVyaWEpOworICAgIHRyeSB7CisgICAgICB0aGlzLnByb2R1Y3RQYWdlID0gZm0uZ2V0Rm0oKS5wYWdlZFF1ZXJ5KHF1ZXJ5LCB0eXBlLCB0aGlzLnBhZ2VOdW0pOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJVbmFibGUgdG8gb2J0YWluIHBhZ2UgcHJvZHVjdHM6IHR5cGU6IFsiCisgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICJdOiBSZWFzb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVTdGFydEVuZElkeCgpIHsKKyAgICBpZiAodGhpcy5wcm9kdWN0UGFnZS5nZXRUb3RhbFBhZ2VzKCkgPT0gMSkgeworICAgICAgdGhpcy50b3RhbFByb2R1Y3RzID0gdGhpcy5wcm9kdWN0UGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5zaXplKCk7CisgICAgICB0aGlzLnBhZ2VOdW0gPSAxOworICAgIH0gZWxzZSBpZiAocHJvZHVjdFBhZ2UuZ2V0VG90YWxQYWdlcygpID09IDApIHsKKyAgICAgIHRoaXMudG90YWxQcm9kdWN0cyA9IDA7CisgICAgICB0aGlzLnBhZ2VOdW0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnRvdGFsUHJvZHVjdHMgPSAocHJvZHVjdFBhZ2UuZ2V0VG90YWxQYWdlcygpIC0gMSkgKiBQQUdFX1NJWkU7CisgICAgICB0aGlzLnBhZ2VOdW0gPSB0aGlzLnByb2R1Y3RQYWdlLmdldFBhZ2VOdW0oKTsKKworICAgICAgLy8gZ2V0IHRoZSBsYXN0IHBhZ2UKKyAgICAgIFByb2R1Y3RQYWdlIGxhc3RQYWdlID0gbnVsbDsKKyAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCk7CisgICAgICBxdWVyeS5nZXRDcml0ZXJpYSgpLmFkZEFsbCh0aGlzLmNyaXRlcmlhKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgbGFzdFBhZ2UgPSBmbS5nZXRGbSgpLnBhZ2VkUXVlcnkocXVlcnksIHRoaXMudHlwZSwKKyAgICAgICAgICAgIHRoaXMucHJvZHVjdFBhZ2UuZ2V0VG90YWxQYWdlcygpKTsKKyAgICAgICAgdGhpcy50b3RhbFByb2R1Y3RzICs9IGxhc3RQYWdlLmdldFBhZ2VQcm9kdWN0cygpLnNpemUoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcy5lbmRJZHggPSB0aGlzLnRvdGFsUHJvZHVjdHMgIT0gMCA/IE1hdGgubWluKHRoaXMudG90YWxQcm9kdWN0cywKKyAgICAgICAgKFBBR0VfU0laRSkgKiAodGhpcy5wYWdlTnVtKSkgOiAwOworICAgIHRoaXMuc3RhcnRJZHggPSB0aGlzLnRvdGFsUHJvZHVjdHMgIT0gMCA/ICgodGhpcy5wYWdlTnVtIC0gMSkgKiBQQUdFX1NJWkUpICsgMQorICAgICAgICA6IDA7CisgIH0KKworICBwdWJsaWMgY2xhc3MgRXhpc3RpbmdDcml0ZXJpYUZvcm0gZXh0ZW5kcyBGb3JtPExpc3Q8VGVybVF1ZXJ5Q3JpdGVyaWE+PiB7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICBUaGUgd2lja2V0OmlkIGlkZW50aWZpZXIgb2YgdGhlIGNyaXRlcmlhIGZvcm0uCisgICAgICovCisgICAgcHVibGljIEV4aXN0aW5nQ3JpdGVyaWFGb3JtKFN0cmluZyBpZCkgeworICAgICAgc3VwZXIoaWQpOworICAgICAgTGlzdFZpZXc8VGVybVF1ZXJ5Q3JpdGVyaWE+IGNyaXRlcmlhVmlldyA9IG5ldyBMaXN0VmlldzxUZXJtUXVlcnlDcml0ZXJpYT4oCisgICAgICAgICAgImNyaXRlcmlhX3NlbGVjdGVkX3JvdyIsIGNyaXRlcmlhKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxUZXJtUXVlcnlDcml0ZXJpYT4gaXRlbSkgeworICAgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgiY3JpdGVyaWFfZWxlbV9uYW1lIiwgaXRlbS5nZXRNb2RlbE9iamVjdCgpCisgICAgICAgICAgICAgIC5nZXRFbGVtZW50TmFtZSgpKSk7CisgICAgICAgICAgaXRlbS5hZGQobmV3IExhYmVsKCJjcml0ZXJpYV9lbGVtX3ZhbHVlIiwgaXRlbS5nZXRNb2RlbE9iamVjdCgpCisgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgaXRlbS5hZGQobmV3IFRlcm1RdWVyeUNyaXRlcmlhUmVtb3ZlQnV0dG9uKCJjcml0ZXJpYV9lbGVtX3JlbW92ZSIsCisgICAgICAgICAgICAgIGl0ZW0uZ2V0TW9kZWxPYmplY3QoKSkpOworICAgICAgICB9CisgICAgICB9OworICAgICAgY3JpdGVyaWFWaWV3LnNldFJldXNlSXRlbXModHJ1ZSk7CisgICAgICBhZGQoY3JpdGVyaWFWaWV3KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmZvcm0uRm9ybSNvblN1Ym1pdCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdWJtaXQoKSB7CisgICAgfQorCisgIH0KKworICBjbGFzcyBBZGRDcml0ZXJpYUZvcm0gZXh0ZW5kcyBGb3JtPEVsZW1lbnRDcml0PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDU0MzM1NTE1ODI1MjEwNjEyMUw7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICBUaGUgd2lja2V0OmlkIGNvbXBvbmVudCBJRCBvZiB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIEFkZENyaXRlcmlhRm9ybShTdHJpbmcgaWQpIHsKKyAgICAgIHN1cGVyKGlkLCBuZXcgQ29tcG91bmRQcm9wZXJ0eU1vZGVsPEVsZW1lbnRDcml0PihuZXcgRWxlbWVudENyaXQoKSkpOworICAgICAgTGlzdDxFbGVtZW50PiBwdHlwZUVsZW1lbnRzID0gZm0uc2FmZUdldEVsZW1lbnRzRm9yUHJvZHVjdFR5cGUodHlwZSk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHB0eXBlRWxlbWVudHMsIG5ldyBDb21wYXJhdG9yPEVsZW1lbnQ+KCkgeworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRWxlbWVudCBlMSwgRWxlbWVudCBlMikgeworICAgICAgICAgIHJldHVybiBlMS5nZXRFbGVtZW50TmFtZSgpLmNvbXBhcmVUbyhlMi5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIGFkZChuZXcgRHJvcERvd25DaG9pY2U8RWxlbWVudD4oImNyaXRlcmlhX2xpc3QiLCBuZXcgUHJvcGVydHlNb2RlbCgKKyAgICAgICAgICBnZXREZWZhdWx0TW9kZWxPYmplY3QoKSwgImVsZW0iKSwgbmV3IExpc3RNb2RlbDxFbGVtZW50PigKKyAgICAgICAgICBwdHlwZUVsZW1lbnRzKSwgbmV3IENob2ljZVJlbmRlcmVyPEVsZW1lbnQ+KCJlbGVtZW50TmFtZSIsCisgICAgICAgICAgImVsZW1lbnRJZCIpKSk7CisgICAgICBhZGQobmV3IFRleHRGaWVsZDxUZXJtUXVlcnlDcml0ZXJpYT4oCisgICAgICAgICAgImNyaXRlcmlhX2Zvcm1fYWRkX2VsZW1lbnRfdmFsdWUiLAorICAgICAgICAgIG5ldyBQcm9wZXJ0eU1vZGVsPFRlcm1RdWVyeUNyaXRlcmlhPihnZXREZWZhdWx0TW9kZWxPYmplY3QoKSwgInZhbHVlIikpKTsKKyAgICAgIGFkZChuZXcgQnV0dG9uKCJjcml0ZXJpYV9lbGVtX2FkZCIpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmZvcm0uRm9ybSNvblN1Ym1pdCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdWJtaXQoKSB7CisgICAgICBFbGVtZW50Q3JpdCB0YyA9IChFbGVtZW50Q3JpdCkgZ2V0RGVmYXVsdE1vZGVsT2JqZWN0KCk7CisgICAgICBmb3IgKFRlcm1RdWVyeUNyaXRlcmlhIHRxYyA6IGNyaXRlcmlhKSB7CisgICAgICAgIGlmICh0cWMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGMuZ2V0RWxlbSgpLmdldEVsZW1lbnROYW1lKCkpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBjcml0ZXJpYS5hZGQobmV3IFRlcm1RdWVyeUNyaXRlcmlhKHRjLmdldEVsZW0oKS5nZXRFbGVtZW50TmFtZSgpLCB0YworICAgICAgICAgIC5nZXRWYWx1ZSgpKSk7CisgICAgICAoKEZNQnJvd3NlclNlc3Npb24pIGdldFNlc3Npb24oKSkuc2V0Q3JpdGVyaWEoY3JpdGVyaWEpOworICAgICAgcmVmcmVzaFByb2R1Y3RQYWdlKCk7CisgICAgICBjb21wdXRlU3RhcnRFbmRJZHgoKTsKKyAgICAgIFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgIHBhcmFtZXRlcnMuYWRkKCJuYW1lIiwgdHlwZS5nZXROYW1lKCkpOworICAgICAgcGFyYW1ldGVycy5hZGQoInBhZ2VOdW0iLCBTdHJpbmcudmFsdWVPZihwYWdlTnVtKSk7CisgICAgICBzZXRSZXNwb25zZVBhZ2UoZ2V0UGFnZSgpLmdldENsYXNzKCksIHBhcmFtZXRlcnMpOworICAgIH0KKyAgfQorCisgIGNsYXNzIEVsZW1lbnRDcml0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01ODY0ODYzNTY0NjI2MTE3NzYzTDsKKworICAgIHByaXZhdGUgRWxlbWVudCBlbGVtOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICBwdWJsaWMgRWxlbWVudENyaXQoKSB7CisgICAgICB0aGlzLmVsZW0gPSBudWxsOworICAgICAgdGhpcy52YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZWxlbQorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW0oKSB7CisgICAgICByZXR1cm4gZWxlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZWxlbQorICAgICAqICAgICAgICAgIHRoZSBlbGVtIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVsZW0oRWxlbWVudCBlbGVtKSB7CisgICAgICB0aGlzLmVsZW0gPSBlbGVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgY2xhc3MgVGVybVF1ZXJ5Q3JpdGVyaWFSZW1vdmVCdXR0b24gZXh0ZW5kcyBCdXR0b24geworCisgICAgcHJpdmF0ZSBUZXJtUXVlcnlDcml0ZXJpYSBjcml0OworCisgICAgcHVibGljIFRlcm1RdWVyeUNyaXRlcmlhUmVtb3ZlQnV0dG9uKFN0cmluZyBpZCwgVGVybVF1ZXJ5Q3JpdGVyaWEgY3JpdCkgeworICAgICAgc3VwZXIoaWQpOworICAgICAgdGhpcy5jcml0ID0gY3JpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmZvcm0uQnV0dG9uI29uU3VibWl0KCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1Ym1pdCgpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3JpdGVyaWEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgVGVybVF1ZXJ5Q3JpdGVyaWEgY3IgPSBjcml0ZXJpYS5nZXQoaSk7CisgICAgICAgIGlmIChjci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhjcml0LmdldEVsZW1lbnROYW1lKCkpKSB7CisgICAgICAgICAgY3JpdGVyaWEucmVtb3ZlKGkpOworICAgICAgICAgICgoRk1Ccm93c2VyU2Vzc2lvbikgZ2V0U2Vzc2lvbigpKS5zZXRDcml0ZXJpYShjcml0ZXJpYSk7CisgICAgICAgICAgcmVmcmVzaFByb2R1Y3RQYWdlKCk7CisgICAgICAgICAgY29tcHV0ZVN0YXJ0RW5kSWR4KCk7CisgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBQYWdlUGFyYW1ldGVycygpOworICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKCJuYW1lIiwgdHlwZS5nZXROYW1lKCkpOworICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKCJwYWdlTnVtIiwgU3RyaW5nLnZhbHVlT2YocGFnZU51bSkpOworICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShnZXRQYWdlKCkuZ2V0Q2xhc3MoKSwgcGFyYW1ldGVycyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlcy5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlcy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNWM3NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3R5cGVzL1R5cGVzLmNzcwpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2Nhc19mbV9icm93c2VyX3B0eXBlX3RhYmxleworICBwYWRkaW5nOjJweDsKKyAgYm9yZGVyLXNwYWNpbmc6MnB4OworICB3aWR0aDo4MDBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDsKK30KKworI2Nhc19mbV9icm93c2VyX3B0eXBlX3RhYmxlIHRkeworICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOworICBtYXJnaW46IDA7IAorICBwYWRkaW5nOiAycHg7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlcy5odG1sIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvdHlwZXMvVHlwZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQ1NjNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL2Jyb3dzZXIvdHlwZXMvVHlwZXMuaHRtbApAQCAtMCwwICsxLDMzIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OnBhbmVsPgorPHdpY2tldDpyZW1vdmU+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlR5cGVzLmNzcyIvPgorPC93aWNrZXQ6cmVtb3ZlPgorCisKKzxoMz5Qcm9kdWN0IFR5cGVzPC9oMz4KKzx0YWJsZSBpZD0iY2FzX2ZtX2Jyb3dzZXJfcHR5cGVfdGFibGUiPgorIDx0ciB3aWNrZXQ6aWQ9ImNhc19mbV9icm93c2VyX3B0eXBlX3RhYmxlX3Jvd3MiPgorICAgPHRkIHdpY2tldDppZD0idHlwZV9uYW1lIj5HZW5lcmljRmlsZTwvdGQ+CisgICA8dGQ+KDxhIGhyZWY9IiMiIHdpY2tldDppZD0idHlwZV9jb3VudF9saW5rIj48c3BhbiB3aWNrZXQ6aWQ9InR5cGVfY291bnQiPjEwMDAwMDA8L3NwYW4+PC9hPik8L3RkPgorICAgPHRkIHdpY2tldDppZD0idHlwZTJfbmFtZSI+R2VuZXJpY0ZpbGUyPC90ZD4KKyAgIDx0ZD4oPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJ0eXBlMl9jb3VudF9saW5rIj48c3BhbiB3aWNrZXQ6aWQ9InR5cGUyX2NvdW50Ij41MDwvc3Bhbj48L2E+KTwvdGQ+ICAgCisgPC90cj4KKzwvdGFibGU+Cis8L3dpY2tldDpwYW5lbD4KKyAKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9icm93c2VyL3R5cGVzL1R5cGVzLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzU4OWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL2ZpbGVtZ3IvYnJvd3Nlci90eXBlcy9UeXBlcy5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuYnJvd3Nlci50eXBlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuRmlsZU1hbmFnZXJDb25uOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLnV0aWwuR2VuZXJpY0Jhc2VNb2RlbDsKKworLyoqCisgKiAKKyAqIFRoaXMgcGFnZSBpcyBtb3VudGVkIHRvOgorICogCisgKiA8Y29kZT4vYnJvd3Nlci90eXBlczwvY29kZT4gYW5kIHNob3dzIGEgdHlwZSBwbHVzIAorICogaXRzIG51bSBwcm9kdWN0IGNvdW50LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFR5cGVzIGV4dGVuZHMgUGFuZWwgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyNjMxOTM3MTAwNjY0OTU2NTNMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFR5cGVzLmNsYXNzLmdldE5hbWUoKSk7CisgIAorICBwcml2YXRlIEZpbGVNYW5hZ2VyQ29ubiBmbTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxBTktfU1BBQ0UgPSAiICI7CisKKyAgcHVibGljIFR5cGVzKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGZtVXJsU3RyLCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgV2ViUGFnZT4gdHlwZUJyb3dzZXIpIHsKKyAgICBzdXBlcihjb21wb25lbnRJZCk7CisgICAgdGhpcy5mbSA9IG5ldyBGaWxlTWFuYWdlckNvbm4oZm1VcmxTdHIpOworICAgIExpc3Q8UHJvZHVjdFR5cGU+IHR5cGVzID0gdGhpcy5mbS5zYWZlR2V0UHJvZHVjdFR5cGVzKCk7CisgICAgQ29sbGVjdGlvbnMuc29ydCh0eXBlcywgbmV3IENvbXBhcmF0b3I8UHJvZHVjdFR5cGU+KCkgeworICAgICAgcHVibGljIGludCBjb21wYXJlKFByb2R1Y3RUeXBlIHR5cGUxLCBQcm9kdWN0VHlwZSB0eXBlMikgeworICAgICAgICAgICByZXR1cm4gdHlwZTEuZ2V0TmFtZSgpLmNvbXBhcmVUbyh0eXBlMi5nZXROYW1lKCkpOworICAgICAgfQorICAgIH0pOworICAgIExpc3Q8VHlwZUNvdW50VHVwbGU+IGNvdW50cyA9IHRoaXMudG9UeXBlQ291bnRzKHR5cGVzKTsKKyAgICBhZGQobmV3IExpc3RWaWV3PFR5cGVDb3VudFR1cGxlPigiY2FzX2ZtX2Jyb3dzZXJfcHR5cGVfdGFibGVfcm93cyIsIGNvdW50cykgeworCisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlCisgICAgICAgKiBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3I3BvcHVsYXRlSXRlbShvcmcuYXBhY2hlCisgICAgICAgKiAud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdEl0ZW0pCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFR5cGVDb3VudFR1cGxlPiB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmdldE1vZGVsT2JqZWN0KCkuZ2V0VHlwZXMoKS5zaXplKCkgPT0gMSkgeworICAgICAgICAgIHR5cGUuYWRkKG5ldyBMYWJlbCgidHlwZV9uYW1lIiwgdHlwZS5nZXRNb2RlbE9iamVjdCgpLmdldFR5cGVzKCkuZ2V0KAorICAgICAgICAgICAgICAwKS5nZXROYW1lKCkpKTsKKyAgICAgICAgICBMaW5rPFByb2R1Y3RUeXBlPiB0eXBlQ291bnRMaW5rID0gbmV3IExpbms8UHJvZHVjdFR5cGU+KAorICAgICAgICAgICAgICAidHlwZV9jb3VudF9saW5rIiwgbmV3IFByb2R1Y3RUeXBlTW9kZWwodHlwZS5nZXRNb2RlbE9iamVjdCgpCisgICAgICAgICAgICAgICAgICAuZ2V0VHlwZXMoKS5nZXQoMCkpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgICogCisgICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgcGFyYW1zLmFkZCgibmFtZSIsIHRoaXMuZ2V0TW9kZWxPYmplY3QoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICBwYXJhbXMuYWRkKCJwYWdlTnVtIiwgIjEiKTsKKyAgICAgICAgICAgICAgc2V0UmVzcG9uc2VQYWdlKHR5cGVCcm93c2VyLCBwYXJhbXMpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICB0eXBlQ291bnRMaW5rLmFkZChuZXcgTGFiZWwoInR5cGVfY291bnQiLCBTdHJpbmcudmFsdWVPZih0eXBlCisgICAgICAgICAgICAgIC5nZXRNb2RlbE9iamVjdCgpLmdldENvdW50cygpLmdldCgwKSkpKTsKKyAgICAgICAgICB0eXBlLmFkZCh0eXBlQ291bnRMaW5rKTsKKyAgICAgICAgICBMaW5rPFByb2R1Y3RUeXBlPiB0eXBlMkxpbmsgPSBuZXcgTGluazxQcm9kdWN0VHlwZT4oCisgICAgICAgICAgICAgICJ0eXBlMl9jb3VudF9saW5rIikgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgICAqIAorICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5Db21wb25lbnQjaXNWaXNpYmxlKCkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgdHlwZS5hZGQobmV3IExhYmVsKCJ0eXBlMl9uYW1lIiwgQkxBTktfU1BBQ0UpKTsKKyAgICAgICAgICB0eXBlMkxpbmsuYWRkKG5ldyBMYWJlbCgidHlwZTJfY291bnQiLCBCTEFOS19TUEFDRSkpOworICAgICAgICAgIHR5cGUuYWRkKHR5cGUyTGluayk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0eXBlLmFkZChuZXcgTGFiZWwoInR5cGVfbmFtZSIsIHR5cGUuZ2V0TW9kZWxPYmplY3QoKS5nZXRUeXBlcygpLmdldCgKKyAgICAgICAgICAgICAgMCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgTGluazxQcm9kdWN0VHlwZT4gdHlwZUNvdW50TGluayA9IG5ldyBMaW5rPFByb2R1Y3RUeXBlPigKKyAgICAgICAgICAgICAgInR5cGVfY291bnRfbGluayIsIG5ldyBQcm9kdWN0VHlwZU1vZGVsKHR5cGUuZ2V0TW9kZWxPYmplY3QoKQorICAgICAgICAgICAgICAgICAgLmdldFR5cGVzKCkuZ2V0KDApKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgICAqIAorICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgIHBhcmFtcy5hZGQoIm5hbWUiLCB0aGlzLmdldE1vZGVsT2JqZWN0KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgcGFyYW1zLmFkZCgicGFnZU51bSIsICIxIik7CisgICAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZSh0eXBlQnJvd3NlciwgcGFyYW1zKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgdHlwZUNvdW50TGluay5hZGQobmV3IExhYmVsKCJ0eXBlX2NvdW50IiwgU3RyaW5nLnZhbHVlT2YodHlwZQorICAgICAgICAgICAgICAuZ2V0TW9kZWxPYmplY3QoKS5nZXRDb3VudHMoKS5nZXQoMCkpKSk7CisgICAgICAgICAgdHlwZS5hZGQodHlwZUNvdW50TGluayk7CisgICAgICAgICAgdHlwZS5hZGQobmV3IExhYmVsKCJ0eXBlMl9uYW1lIiwgdHlwZS5nZXRNb2RlbE9iamVjdCgpLmdldFR5cGVzKCkKKyAgICAgICAgICAgICAgLmdldCgxKS5nZXROYW1lKCkpKTsKKyAgICAgICAgICBMaW5rPFByb2R1Y3RUeXBlPiB0eXBlMkxpbmsgPSBuZXcgTGluazxQcm9kdWN0VHlwZT4oCisgICAgICAgICAgICAgICJ0eXBlMl9jb3VudF9saW5rIiwgbmV3IFByb2R1Y3RUeXBlTW9kZWwodHlwZS5nZXRNb2RlbE9iamVjdCgpCisgICAgICAgICAgICAgICAgICAuZ2V0VHlwZXMoKS5nZXQoMSkpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgICogCisgICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgcGFyYW1zLmFkZCgibmFtZSIsIHRoaXMuZ2V0TW9kZWxPYmplY3QoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICBwYXJhbXMuYWRkKCJwYWdlTnVtIiwgIjEiKTsKKyAgICAgICAgICAgICAgc2V0UmVzcG9uc2VQYWdlKHR5cGVCcm93c2VyLCBwYXJhbXMpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICB0eXBlMkxpbmsuYWRkKG5ldyBMYWJlbCgidHlwZTJfY291bnQiLCBTdHJpbmcudmFsdWVPZih0eXBlCisgICAgICAgICAgICAgIC5nZXRNb2RlbE9iamVjdCgpLmdldENvdW50cygpLmdldCgxKSkpKTsKKyAgICAgICAgICB0eXBlLmFkZCh0eXBlMkxpbmspOworICAgICAgICB9CisKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxUeXBlQ291bnRUdXBsZT4gdG9UeXBlQ291bnRzKExpc3Q8UHJvZHVjdFR5cGU+IHR5cGVzKSB7CisgICAgTGlzdDxUeXBlQ291bnRUdXBsZT4gY291bnRzID0gbmV3IFZlY3RvcjxUeXBlQ291bnRUdXBsZT4oKTsKKyAgICBUeXBlQ291bnRUdXBsZSB0dXBsZSA9IG5ldyBUeXBlQ291bnRUdXBsZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIFByb2R1Y3RUeXBlIHR5cGUgPSB0eXBlcy5nZXQoaSk7CisgICAgICBpZiAodHVwbGUuZ2V0VHlwZXMoKS5zaXplKCkgPT0gMikgeworICAgICAgICBjb3VudHMuYWRkKHR1cGxlKTsKKyAgICAgICAgdHVwbGUgPSBuZXcgVHlwZUNvdW50VHVwbGUoKTsKKyAgICAgIH0KKyAgICAgIHR1cGxlLmdldFR5cGVzKCkuYWRkKHR5cGUpOworICAgICAgdHJ5IHsKKyAgICAgICAgdHVwbGUuZ2V0Q291bnRzKCkuYWRkKGZtLmdldEZtKCkuZ2V0TnVtUHJvZHVjdHModHlwZSkpOworICAgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBzZXQgY291bnQgZm9yIHByb2R1Y3QgdHlwZTogWyIKKyAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiXTogUmVhc29uOiBbIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPT0gdHlwZXMuc2l6ZSgpIC0gMSkgeworICAgICAgICBjb3VudHMuYWRkKHR1cGxlKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBjb3VudHM7CisgIH0KKworICBjbGFzcyBUeXBlQ291bnRUdXBsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3OTA4NTM2MjY2MTQyODc2NjQ2TDsKKworICAgIHByaXZhdGUgTGlzdDxQcm9kdWN0VHlwZT4gdHlwZXM7CisKKyAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gY291bnRzOworCisgICAgcHVibGljIFR5cGVDb3VudFR1cGxlKCkgeworICAgICAgdGhpcy50eXBlcyA9IG5ldyBWZWN0b3I8UHJvZHVjdFR5cGU+KCk7CisgICAgICB0aGlzLmNvdW50cyA9IG5ldyBWZWN0b3I8SW50ZWdlcj4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlcworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb2R1Y3RUeXBlPiBnZXRUeXBlcygpIHsKKyAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdHlwZXMKKyAgICAgKiAgICAgICAgICB0aGUgdHlwZXMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZXMoTGlzdDxQcm9kdWN0VHlwZT4gdHlwZXMpIHsKKyAgICAgIHRoaXMudHlwZXMgPSB0eXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRDb3VudHMoKSB7CisgICAgICByZXR1cm4gY291bnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb3VudHMKKyAgICAgKiAgICAgICAgICB0aGUgY291bnRzIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvdW50cyhMaXN0PEludGVnZXI+IGNvdW50cykgeworICAgICAgdGhpcy5jb3VudHMgPSBjb3VudHM7CisgICAgfQorCisgIH0KKworICBjbGFzcyBQcm9kdWN0VHlwZU1vZGVsIGV4dGVuZHMgR2VuZXJpY0Jhc2VNb2RlbDxQcm9kdWN0VHlwZT4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjUyODk3NjY5OTg2Njc5MTgwMEw7CisKKyAgICBwdWJsaWMgUHJvZHVjdFR5cGVNb2RlbChQcm9kdWN0VHlwZSB0eXBlKSB7CisgICAgICB0aGlzLnNldE9iamVjdCh0eXBlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlCisgICAgICogb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5HZW5lcmljQmFzZU1vZGVsI2NyZWF0ZVNlcmlhbGl6YWJsZVZlcnNpb25PZgorICAgICAqIChqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQcm9kdWN0VHlwZSBjcmVhdGVTZXJpYWxpemFibGVWZXJzaW9uT2YoUHJvZHVjdFR5cGUgdHlwZSkgeworICAgICAgU2VyaWFsaXphYmxlUHJvZHVjdFR5cGUgc3R5cGUgPSBuZXcgU2VyaWFsaXphYmxlUHJvZHVjdFR5cGUoKTsKKyAgICAgIHN0eXBlLnNldERlc2NyaXB0aW9uKHR5cGUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICBzdHlwZS5zZXRFeHRyYWN0b3JzKHR5cGUuZ2V0RXh0cmFjdG9ycygpKTsKKyAgICAgIHN0eXBlLnNldEhhbmRsZXJzKHR5cGUuZ2V0SGFuZGxlcnMoKSk7CisgICAgICBzdHlwZS5zZXROYW1lKHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgIHN0eXBlLnNldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCh0eXBlLmdldFByb2R1Y3RSZXBvc2l0b3J5UGF0aCgpKTsKKyAgICAgIHN0eXBlLnNldFByb2R1Y3RUeXBlSWQodHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkpOworICAgICAgc3R5cGUuc2V0VHlwZU1ldGFkYXRhKHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkpOworICAgICAgc3R5cGUuc2V0VmVyc2lvbmVyKHR5cGUuZ2V0VmVyc2lvbmVyKCkpOworICAgICAgcmV0dXJuIHN0eXBlOworICAgIH0KKworICB9CisgIAorICBjbGFzcyBTZXJpYWxpemFibGVQcm9kdWN0VHlwZSBleHRlbmRzIFByb2R1Y3RUeXBlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5MDA5NDgzNTU2MTk0MjA1ODJMOworICAgIAorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9tb2RlbC9Qcm9kdWN0TW9kZWwuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvZmlsZW1nci9tb2RlbC9Qcm9kdWN0TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgwOWEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy9maWxlbWdyL21vZGVsL1Byb2R1Y3RNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5tb2RlbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC51dGlsLkdlbmVyaWNCYXNlTW9kZWw7CisKKy8qKgorICogCisgKiBBIHtAbGluayBTZXJpYWxpemFibGV9IHtAbGluayBHZW5lcmljQmFzZU1vZGVsfSB2ZXJzaW9uIG9mIGEgQ0FTCisgKiB7QGxpbmsgUHJvZHVjdH0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdE1vZGVsIGV4dGVuZHMgR2VuZXJpY0Jhc2VNb2RlbDxQcm9kdWN0PiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM4OTI5MDUyMDAxMzQ5MDEwMkw7CisKKyAgcHVibGljIFByb2R1Y3RNb2RlbChQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICB0aGlzLnNldE9iamVjdChwcm9kdWN0KTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5HZW5lcmljQmFzZU1vZGVsI2NyZWF0ZVNlcmlhbGl6YWJsZVZlcnNpb25PZgorICAgKiAoamF2YS5sYW5nLk9iamVjdCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgUHJvZHVjdCBjcmVhdGVTZXJpYWxpemFibGVWZXJzaW9uT2YoUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgU2VyaWFsaXphYmxlUHJvZHVjdCBzcCA9IG5ldyBTZXJpYWxpemFibGVQcm9kdWN0KCk7CisgICAgc3Auc2V0UHJvZHVjdElkKHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkpOworICAgIHNwLnNldFByb2R1Y3ROYW1lKHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgc3Auc2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpKTsKKyAgICBzcC5zZXRQcm9kdWN0U3RydWN0dXJlKHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpKTsKKyAgICBzcC5zZXRQcm9kdWN0VHlwZShwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkpOworICAgIHNwLnNldFJvb3RSZWYocHJvZHVjdC5nZXRSb290UmVmKCkpOworICAgIHNwLnNldFRyYW5zZmVyU3RhdHVzKHByb2R1Y3QuZ2V0VHJhbnNmZXJTdGF0dXMoKSk7CisgICAgcmV0dXJuIHNwOworICB9CisKKyAgY2xhc3MgU2VyaWFsaXphYmxlUHJvZHVjdCBleHRlbmRzIFByb2R1Y3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjA1MjE0Nzg3Njg2Mzk4NDc0MEw7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L1dNTW9uaXRvckFwcEJhc2UuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvV01Nb25pdG9yQXBwQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyY2JhZmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L1dNTW9uaXRvckFwcEJhc2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XZWJBcHBsaWNhdGlvbjsKKworLyoqCisgKiAKKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXTU1vbml0b3JBcHBCYXNlIGV4dGVuZHMgV2ViQXBwbGljYXRpb24geworCisgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2Zsb3dVcmwoKSB7CisgICAgcmV0dXJuIGdldENvbnRleHRQYXJhbUVudlJlcGxhY2UoIndvcmtmbG93LnVybCIpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGVGaWxlUGF0aCgpIHsKKyAgICByZXR1cm4gZ2V0Q29udGV4dFBhcmFtRW52UmVwbGFjZSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubGlmZWN5Y2xlRmlsZVBhdGgiKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U3RhdHVzZXMoKSB7CisgICAgU3RyaW5nW10gc3RhdHVzZXMgPSBnZXRDb250ZXh0UGFyYW1FbnZSZXBsYWNlKCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3Quc3RhdHVzZXMiKS5zcGxpdCgiLCIpOworICAgIExpc3Q8U3RyaW5nPiBzdGF0dXNMaXN0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgZm9yKFN0cmluZyBzdGF0dXM6IHN0YXR1c2VzKXsKKyAgICAgIHN0YXR1c0xpc3QuYWRkKHN0YXR1cy50cmltKCkpOworICAgIH0KKyAgICBzdGF0dXNMaXN0LmFkZCgiQUxMIik7CisgICAgcmV0dXJuIHN0YXR1c0xpc3Q7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEluc3RNZXRGaWVsZHNGaWxlUGF0aCgpIHsKKyAgICByZXR1cm4gZ2V0Q29udGV4dFBhcmFtRW52UmVwbGFjZSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAuaW5zdC5tZXRGaWVsZHMuZmlsZVBhdGgiKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldENvbnRleHRQYXJhbUVudlJlcGxhY2UoU3RyaW5nIHBhcmFtTmFtZSkgeworICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyh0aGlzLmdldFNlcnZsZXRDb250ZXh0KCkKKyAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIocGFyYW1OYW1lKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9Xb3JrZmxvd01nckNvbm4uamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvV29ya2Zsb3dNZ3JDb25uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViMzEyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvV29ya2Zsb3dNZ3JDb25uLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3c7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ7CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dNZ3JDb25uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTA4MTExNzg3MTcwMjYxNDQwMkw7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoV29ya2Zsb3dNZ3JDb25uLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCB3bTsKKworICBwdWJsaWMgV29ya2Zsb3dNZ3JDb25uKFN0cmluZyB3bVVybFN0cikgeworICAgIHRyeSB7CisgICAgICB0aGlzLndtID0gbmV3IFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudChuZXcgVVJMKHdtVXJsU3RyKSk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiVW5hYmxlIHRvIGNvbnRhY3QgV29ya2Zsb3cgTWFuYWdlciBhdCBVUkw6IFsiCisgICAgICAgICAgKyB3bVVybFN0ciArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdGhpcy53bSA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFdvcmtmbG93VGFzayBzYWZlR2V0VGFza0J5SWQoU3RyaW5nIHRhc2tJZCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YWJsZVdvcmtmbG93VGFzayh0aGlzLndtLmdldFRhc2tCeUlkKHRhc2tJZCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93IHRhc2sgd2l0aCBJRDogWyIKKyAgICAgICAgICArIHRhc2tJZCArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uIHNhZmVHZXRDb25kaXRpb25CeUlkKFN0cmluZyBjb25kaXRpb25JZCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YWJsZVdvcmtmbG93Q29uZGl0aW9uKHRoaXMud20KKyAgICAgICAgICAuZ2V0Q29uZGl0aW9uQnlJZChjb25kaXRpb25JZCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93IGNvbmRpdGlvbiB3aXRoIElEOiBbIgorICAgICAgICAgICsgY29uZGl0aW9uSWQgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvdyBzYWZlR2V0V29ya2Zsb3dCeUlkKFN0cmluZyB3b3JrZmxvd0lkKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLndtLmdldFdvcmtmbG93QnlJZCh3b3JrZmxvd0lkKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIG9idGFpbiB3b3JrZmxvdyB3aXRoIElEOiBbIgorICAgICAgICAgICsgd29ya2Zsb3dJZCArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8V29ya2Zsb3c+IHNhZmVHZXRXb3JrZmxvd3NCeUV2ZW50KFN0cmluZyBldmVudE5hbWUpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMud20uZ2V0V29ya2Zsb3dzQnlFdmVudChldmVudE5hbWUpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93cyBieSBldmVudDogWyIKKyAgICAgICAgICArIGV2ZW50TmFtZSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8V29ya2Zsb3c+KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBzYWZlR2V0UmVnaXN0ZXJlZEV2ZW50cygpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMud20uZ2V0UmVnaXN0ZXJlZEV2ZW50cygpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHJlZ2lzdGVyZWQgZXZlbnRzOiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8V29ya2Zsb3c+IHNhZmVHZXRXb3JrZmxvd3MoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLndtLmdldFdvcmtmbG93cygpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93czogTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8V29ya2Zsb3c+KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8V29ya2Zsb3dJbnN0YW5jZT4gc2FmZUdldFdvcmtmbG93SW5zdHMoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLndtLmdldFdvcmtmbG93SW5zdGFuY2VzKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBvYnRhaW4gd29ya2Zsb3cgaW5zdGFuY2VzOiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbmV3IFZlY3RvcjxXb3JrZmxvd0luc3RhbmNlPigpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93SW5zdGFuY2U+IHNhZmVHZXRXb3JrZmxvd0luc3RzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy53bS5nZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHN0YXR1cyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBvYnRhaW4gd29ya2Zsb3cgaW5zdGFuY2VzIGJ5IHN0YXR1czogWyIKKyAgICAgICAgICArIHN0YXR1cyArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8V29ya2Zsb3dJbnN0YW5jZT4oKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2Ugc2FmZUdldFdvcmtmbG93SW5zdFBhZ2VCeVN0YXR1cyhpbnQgcGFnZU51bSwKKyAgICAgIFN0cmluZyBzdGF0dXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMud20ucGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhwYWdlTnVtLCBzdGF0dXMpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93IGluc3RhbmNlIHBhZ2U6IFsiCisgICAgICAgICAgKyBwYWdlTnVtICsgIl0gYnkgc3RhdHVzOiBbIiArIHN0YXR1cyArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2Ugc2FmZUdldFdvcmtmbG93SW5zdFBhZ2VCeVN0YXR1cyhpbnQgcGFnZU51bSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy53bS5wYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzKHBhZ2VOdW0pOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93IGluc3RhbmNlIHBhZ2U6IFsiCisgICAgICAgICAgKyBwYWdlTnVtICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgZG91YmxlIHNhZmVHZXRXb3JrZmxvd1dhbGxDbG9ja01pbnV0ZXMoV29ya2Zsb3dJbnN0YW5jZSBpbnN0KSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLndtLmdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyhpbnN0LmdldElkKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gd29ya2Zsb3cgd2FsbCBjbG9jayBtaW5zOiBpbnN0IGlkOiBbIgorICAgICAgICAgICAgICArIGluc3QuZ2V0SWQoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIC05OTkuMDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgZG91YmxlIHNhZmVHZXRXb3JrZmxvd0N1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhXb3JrZmxvd0luc3RhbmNlIGluc3QpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMud20uZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdC5nZXRJZCgpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJVbmFibGUgdG8gb2J0YWluIHdvcmtmbG93IGN1cnJlbnQgdGFzayB3YWxsIGNsb2NrIG1pbnM6IGluc3QgaWQ6IFsiCisgICAgICAgICAgICAgICsgaW5zdC5nZXRJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gLTk5OS4wOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgZ2V0V00oKSB7CisgICAgcmV0dXJuIHRoaXMud207CisgIH0KKworICBjbGFzcyBTZXJpYWxpemFibGVXb3JrZmxvd1Rhc2sgZXh0ZW5kcyBXb3JrZmxvd1Rhc2sgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg1OTY3ODY4MDAwODEzNzc5NUw7CisKKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlV29ya2Zsb3dUYXNrKFdvcmtmbG93VGFzayB0YXNrKSB7CisgICAgICB0aGlzLnRhc2tOYW1lID0gdGFzay5nZXRUYXNrTmFtZSgpOworICAgICAgdGhpcy50YXNrSWQgPSB0YXNrLmdldFRhc2tJZCgpOworICAgICAgdGhpcy50YXNrSW5zdGFuY2VDbGFzc05hbWUgPSB0YXNrLmdldFRhc2tJbnN0YW5jZUNsYXNzTmFtZSgpOworICAgICAgdGhpcy5wcmVDb25kaXRpb25zID0gdGFzay5nZXRQcmVDb25kaXRpb25zKCk7CisgICAgICB0aGlzLnBvc3RDb25kaXRpb25zID0gdGFzay5nZXRQb3N0Q29uZGl0aW9ucygpOworICAgICAgdGhpcy5vcmRlciA9IHRhc2suZ2V0T3JkZXIoKTsKKyAgICAgIHRoaXMucmVxdWlyZWRNZXRGaWVsZHMgPSB0YXNrLmdldFJlcXVpcmVkTWV0RmllbGRzKCk7CisgICAgICB0aGlzLnRhc2tDb25maWcgPSB0YXNrLmdldFRhc2tDb25maWcoKTsKKyAgICB9CisgIH0KKworICBjbGFzcyBTZXJpYWxpemFibGVXb3JrZmxvd0NvbmRpdGlvbiBleHRlbmRzIFdvcmtmbG93Q29uZGl0aW9uIGltcGxlbWVudHMKKyAgICAgIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5MDk4NDMzODE1Njg3NDM2MjFMOworCisgICAgcHVibGljIFNlcmlhbGl6YWJsZVdvcmtmbG93Q29uZGl0aW9uKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQpIHsKKyAgICAgIHRoaXMuc2V0Q29uZGl0aW9uTmFtZShjb25kLmdldENvbmRpdGlvbk5hbWUoKSk7CisgICAgICB0aGlzLmNvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lID0gY29uZC5nZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpOworICAgICAgdGhpcy5vcmRlciA9IGNvbmQuZ2V0T3JkZXIoKTsKKyAgICAgIHRoaXMuY29uZENvbmZpZyA9IGNvbmQuZ2V0VGFza0NvbmZpZygpOworICAgIH0KKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvY29uZGl0aW9ucy9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2NvbmRpdGlvbnMvV29ya2Zsb3dDb25kaXRpb25WaWV3ZXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzVhYjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2NvbmRpdGlvbnMvV29ya2Zsb3dDb25kaXRpb25WaWV3ZXIuY3NzCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjY29uZGl0aW9uX3RibHsKKyAgYm9yZGVyLXNwYWNpbmc6MnB4OworICBmb250LWZhbWlseTogQXJpYWwsU2Fucy1TZXJpZixzYW5zLXNlcmlmOworfQorCisuaGVhZGVyeworCit9CisKKy52YWx1ZXsKKworfQorCisjd29ya2Zsb3dfY29uZF9jb25maWdfdGJseworICBib3JkZXItc3BhY2luZzoycHg7CisgIGZvbnQtZmFtaWx5OiBBcmlhbCxTYW5zLVNlcmlmLHNhbnMtc2VyaWY7Cit9CisKKyNjb25kX2NvbmZpZ3sKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvY29uZGl0aW9ucy9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlci5odG1sIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9jb25kaXRpb25zL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2ZGQ5NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvY29uZGl0aW9ucy9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlci5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0Omxpbms+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IldvcmtmbG93Q29uZGl0aW9uVmlld2VyLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKworPHRhYmxlIGlkPSJjb25kaXRpb25fdGJsIj4KKyAgIDx0cj4KKyAgICAgPHRkIGNsYXNzPSJoZWFkZXIiPkNvbmRpdGlvbiBJRDwvdGQ+CisgICAgIDx0ZCBjbGFzcz0idmFsdWUiPjxzcGFuIHdpY2tldDppZD0iY29uZGl0aW9uX2lkIj51cm46b29kdDpUcnVlQ29uZGl0aW9uPC9zcGFuPjwvdGQ+CisgICA8L3RyPgorICAgPHRyPiAgICAgICAJICAgIAkgICAgICAgICAgCisgICAgIDx0ZCBjbGFzcz0iaGVhZGVyIj5OYW1lPC90ZD4KKyAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+PHNwYW4gd2lja2V0OmlkPSJjb25kaXRpb25fbmFtZSI+VHJ1ZSBDb25kaXRpb248L3NwYW4+PC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgIDx0ZCBjbGFzcz0iaGVhZGVyIj5JbXBsZW1lbnRhdGlvbiBDbGFzczwvdGQ+CisgICAgIDx0ZCBjbGFzcz0idmFsdWUiPjxzcGFuIHdpY2tldDppZD0iY29uZGl0aW9uX2NsYXNzIj5vcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLlRydWVDb25kaXRpb248L3NwYW4+PC90ZD4KKyAgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgY2xhc3M9ImhlYWRlciI+Q29uZmlndXJhdGlvbjwvdGQ+CisgICAgPHRkPgorICAgICAgPHRhYmxlIGlkPSJ3b3JrZmxvd19jb25kX2NvbmZpZ190YmwiPgorICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyIj4KKyAgICAgICAgIDx0ZD5Qcm9wZXJ0eTwvdGQ+CisgICAgICAgICA8dGQ+VmFsdWU8L3RkPgorICAgICAgIDwvdHI+CisgICAgICAgPHRyIHdpY2tldDppZD0iY29uZF9jb25maWciIGlkPSJjb25kX2NvbmZpZyI+CisgIAkgICAgIDx0ZD48c3BhbiB3aWNrZXQ6aWQ9ImNvbmRfcG5hbWUiPm51bVNlY29uZHM8L3NwYW4+PC90ZD4KKyAgCSAgICAgPHRkPjxzcGFuIHdpY2tldDppZD0iY29uZF9wdmFsdWUiPjYwPC9zcGFuPjwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgIDwvdGQ+CisgICAgPC90cj4gICAKKzwvdGFibGU+Cis8L3dpY2tldDpwYW5lbD4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvY29uZGl0aW9ucy9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlci5qYXZhIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9jb25kaXRpb25zL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2MTJiYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvY29uZGl0aW9ucy9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuY29uZGl0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LldvcmtmbG93TWdyQ29ubjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dDb25kaXRpb25WaWV3ZXIgZXh0ZW5kcyBQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzg2MTQ2NjM4ODk1NDc0NTEwNUw7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd01nckNvbm4gd207CisKKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uVmlld2VyKFN0cmluZyBpZCwgU3RyaW5nIHdtVXJsU3RyLCBTdHJpbmcgY29uZGl0aW9uSWQpIHsKKyAgICBzdXBlcihpZCk7CisgICAgdGhpcy53bSA9IG5ldyBXb3JrZmxvd01nckNvbm4od21VcmxTdHIpOworICAgIGZpbmFsIFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgPSB0aGlzLndtLnNhZmVHZXRDb25kaXRpb25CeUlkKGNvbmRpdGlvbklkKTsKKyAgICBhZGQobmV3IExhYmVsKCJjb25kaXRpb25faWQiLCBjb25kLmdldENvbmRpdGlvbklkKCkpKTsKKyAgICBhZGQobmV3IExhYmVsKCJjb25kaXRpb25fbmFtZSIsIGNvbmQuZ2V0Q29uZGl0aW9uTmFtZSgpKSk7CisgICAgYWRkKG5ldyBMYWJlbCgiY29uZGl0aW9uX2NsYXNzIiwgY29uZC5nZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpKSk7CisgICAgZmluYWwgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmQuZ2V0Q29uZENvbmZpZygpICE9IG51bGwgPyAKKyAgICAgICAgY29uZC5nZXRDb25kQ29uZmlnKCk6bmV3IFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbigpOworICAgIExpc3Q8U3RyaW5nPiBjb25kQ29uZmlnS2V5TmFtZXMgPSBBcnJheXMuYXNMaXN0KGNvbmZpZworICAgICAgICAuZ2V0UHJvcGVydGllcygpLmtleVNldCgpLnRvQXJyYXkoCisgICAgICAgICAgICBuZXcgU3RyaW5nW2NvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpXSkpOworICAgIENvbGxlY3Rpb25zLnNvcnQoY29uZENvbmZpZ0tleU5hbWVzKTsKKyAgICBhZGQobmV3IExpc3RWaWV3PFN0cmluZz4oImNvbmRfY29uZmlnIiwgbmV3IExpc3RNb2RlbDxTdHJpbmc+KAorICAgICAgICBjb25kQ29uZmlnS2V5TmFtZXMpKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlCisgICAgICAgKiBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3I3BvcHVsYXRlSXRlbShvcmcuYXBhY2hlCisgICAgICAgKiAud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdEl0ZW0pCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFN0cmluZz4gaXRlbSkgeworICAgICAgICBTdHJpbmcga2V5TmFtZSA9IGl0ZW0uZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgU3RyaW5nIGtleVZhbCA9IGNvbmZpZy5nZXRQcm9wZXJ0eShrZXlOYW1lKTsKKyAgICAgICAgaXRlbS5hZGQobmV3IExhYmVsKCJjb25kX3BuYW1lIiwga2V5TmFtZSkpOworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoImNvbmRfcHZhbHVlIiwga2V5VmFsKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2V2ZW50L0V2ZW50VG9Xb3JrZmxvd1ZpZXdlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2V2ZW50L0V2ZW50VG9Xb3JrZmxvd1ZpZXdlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkZDg4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvZXZlbnQvRXZlbnRUb1dvcmtmbG93Vmlld2VyLmNzcwpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2V2ZW50X2hlYWRlcl90aXRsZXsKKworfQorCisjZXZlbnRfd29ya2Zsb3dfdGJseworCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2V2ZW50L0V2ZW50VG9Xb3JrZmxvd1ZpZXdlci5odG1sIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9ldmVudC9FdmVudFRvV29ya2Zsb3dWaWV3ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVjMzcwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9ldmVudC9FdmVudFRvV29ya2Zsb3dWaWV3ZXIuaHRtbApAQCAtMCwwICsxLDU0IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OnBhbmVsPgorPHdpY2tldDpsaW5rPgorIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IkV2ZW50VG9Xb3JrZmxvd1ZpZXdlci5jc3MiLz4KKyA8L3dpY2tldDpsaW5rPgorCis8aDMgaWQ9ImV2ZW50X2hlYWRlcl90aXRsZSI+RXZlbnQgdG8gV29ya2Zsb3cgTWFwPC9oMz4KKzxwPlNlbGVjdCBhbiBldmVudCwgYW5kIHRoZW4gY2xpY2sgb24gIkdldCBXb3JrZmxvd3MiIHRvIG9idGFpbiBhIGxpc3Qgb2Ygd29ya2Zsb3dzIGFzc29jaWF0ZWQKK3dpdGggdGhlIHNlbGVjdGVkIGV2ZW50LjwvcD4KKworPGZvcm0gd2lja2V0OmlkPSJldmVudF93b3JrZmxvd19mcm0iPgorIDx0YWJsZSBpZD0iZXZlbnRfd29ya2Zsb3dfdGJsIj4KKyAgICA8dHI+CisgICAgICA8dGQ+RXZlbnQ8L3RkPgorICAgICAgPHRkPjxzZWxlY3Qgd2lja2V0OmlkPSJldmVudF9saXN0Ij4KKyAgICAgICAgPHdpY2tldDpyZW1vdmU+CisgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idGVzdCI+dGVzdDwvb3B0aW9uPgorICAgICAgICA8L3dpY2tldDpyZW1vdmU+CisgICAgICA8L3NlbGVjdD4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9ImdldF93b3JrZmxvd19idXR0b24iIHZhbHVlPSJHZXQgV29yZmtsb3dzISI+PC90ZD4KKyAgICA8L3RyPgorIDwvdGFibGU+CisgPC9mb3JtPgorCisgPGRpdiB3aWNrZXQ6aWQ9Ind0YWJsZSI+CisgIDxocj4KKyAgPGg0PldvcmtmbG93cyBmb3IgPHNwYW4gd2lja2V0OmlkPSJzZWxlY3RlZEV2ZW50Ij50ZXN0PC9zcGFuPiBldmVudDwvaDQ+CisgIAorICA8dGFibGU+CisgICAgPHRyPgorICAgICA8dGQ+V29ya2Zsb3c8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIHdpY2tldDppZD0id29ya2Zsb3dfbGlzdCI+CisgICAgICA8dGQ+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJ3b3JrZmxvd19saW5rIj48c3BhbiB3aWNrZXQ6aWQ9IndvcmtmbG93X25hbWUiPlRlc3QgV29ya2Zsb3c8L3NwYW4+PC9hPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyA8L2Rpdj4KKzwvd2lja2V0OnBhbmVsPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9ldmVudC9FdmVudFRvV29ya2Zsb3dWaWV3ZXIuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvZXZlbnQvRXZlbnRUb1dvcmtmbG93Vmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5MTdhOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvZXZlbnQvRXZlbnRUb1dvcmtmbG93Vmlld2VyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5ldmVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuV29ya2Zsb3dNZ3JDb25uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJNYXJrdXBDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5mb3JtLkRyb3BEb3duQ2hvaWNlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmZvcm0uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLklNb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC5Qcm9wZXJ0eU1vZGVsOworCisvKioKKyAqCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIEV2ZW50VG9Xb3JrZmxvd1ZpZXdlciBleHRlbmRzIFBhbmVsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTEyMDUxMTA0NTc2MzMyODIzN0w7CisKKyAgcHJpdmF0ZSBmaW5hbCBXb3JrZmxvd01nckNvbm4gd207CisgIAorICBwcml2YXRlIGZpbmFsIExpc3Q8V29ya2Zsb3c+IHdvcmtmbG93czsKKyAgCisgIHB1YmxpYyBFdmVudFRvV29ya2Zsb3dWaWV3ZXIoU3RyaW5nIGlkLCBTdHJpbmcgd29ya2Zsb3dVcmxTdHIsIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBXZWJQYWdlPiB2aWV3ZXJQYWdlKSB7CisgICAgc3VwZXIoaWQpOworICAgIHRoaXMud20gPSBuZXcgV29ya2Zsb3dNZ3JDb25uKHdvcmtmbG93VXJsU3RyKTsKKyAgICB0aGlzLndvcmtmbG93cyA9IG5ldyBWZWN0b3I8V29ya2Zsb3c+KCk7CisgICAgV2ViTWFya3VwQ29udGFpbmVyIHdUYWJsZSA9IG5ldyBXZWJNYXJrdXBDb250YWluZXIoInd0YWJsZSIpOworICAgIHdUYWJsZS5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBQcm9wZXJ0eU1vZGVsPExpc3Q8V29ya2Zsb3c+PiB3b3JrZmxvd3NNb2RlbCA9IG5ldyBQcm9wZXJ0eU1vZGVsPExpc3Q8V29ya2Zsb3c+Pih0aGlzLCAid29ya2Zsb3dzIik7CisgICAgTGlzdFZpZXc8V29ya2Zsb3c+IHdvcmtmbG93VmlldyA9IG5ldyBMaXN0VmlldzxXb3JrZmxvdz4oIndvcmtmbG93X2xpc3QiLCB3b3JrZmxvd3NNb2RlbCkgeworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTg5NDYwNDI5MDM5NTI1Nzk0MUw7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFdvcmtmbG93PiBpdGVtKSB7CisgICAgICAgIExpbms8U3RyaW5nPiB3TGluayA9IG5ldyBMaW5rPFN0cmluZz4oIndvcmtmbG93X2xpbmsiLCBuZXcgTW9kZWwoaXRlbS5nZXRNb2RlbE9iamVjdCgpLmdldElkKCkpKXsKKyAgICAgICAgICAKKyAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rI29uQ2xpY2soKQorICAgICAgICAgICAqLworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQoImlkIiwgZ2V0TW9kZWxPYmplY3QoKSk7CisgICAgICAgICAgICBzZXRSZXNwb25zZVBhZ2Uodmlld2VyUGFnZSwgcGFyYW1zKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIAorICAgICAgICB3TGluay5hZGQobmV3IExhYmVsKCJ3b3JrZmxvd19uYW1lIiwgaXRlbS5nZXRNb2RlbE9iamVjdCgpLmdldE5hbWUoKSkpOworICAgICAgICBpdGVtLmFkZCh3TGluayk7CisgICAgICB9CisgICAgfTsKKworICAgIEV2ZW50V29ya2Zsb3dGb3JtIGZvcm0gPSAKKyAgICAgIG5ldyBFdmVudFdvcmtmbG93Rm9ybSgiZXZlbnRfd29ya2Zsb3dfZnJtIiwgd29ya2Zsb3dzTW9kZWwsIHdUYWJsZSk7CisKKyAgICB3VGFibGUuYWRkKHdvcmtmbG93Vmlldyk7CisgICAgYWRkKHdUYWJsZSk7CisgICAgYWRkKGZvcm0pOworICB9CisgIAorICBjbGFzcyBFdmVudFdvcmtmbG93Rm9ybSBleHRlbmRzIEZvcm08TGlzdDxXb3JrZmxvdz4+eworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMyMDkwNzk1MTg5Nzc3ODMzNThMOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkRXZlbnQ7CisgICAgCisgICAgcHJpdmF0ZSBXZWJNYXJrdXBDb250YWluZXIgd1RhYmxlOworCisgICAgcHVibGljIEV2ZW50V29ya2Zsb3dGb3JtKFN0cmluZyBpZCwgSU1vZGVsPExpc3Q8V29ya2Zsb3c+PiBtb2RlbCwgV2ViTWFya3VwQ29udGFpbmVyIHdUYWJsZSkgeworICAgICAgc3VwZXIoaWQsIG1vZGVsKTsKKyAgICAgIGFkZChuZXcgRHJvcERvd25DaG9pY2U8U3RyaW5nPigiZXZlbnRfbGlzdCIsIG5ldyBQcm9wZXJ0eU1vZGVsKHRoaXMsICJzZWxlY3RlZEV2ZW50IiksIAorICAgICAgICAgIHdtLnNhZmVHZXRSZWdpc3RlcmVkRXZlbnRzKCkpKTsKKyAgICAgIHRoaXMud1RhYmxlID0gd1RhYmxlOworICAgICAgCisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuZm9ybS5Gb3JtI29uU3VibWl0KCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN1Ym1pdCgpIHsKKyAgICAgICBMaXN0PFdvcmtmbG93PiB3b3JrZmxvd3MgPSB3bS5zYWZlR2V0V29ya2Zsb3dzQnlFdmVudCh0aGlzLnNlbGVjdGVkRXZlbnQpOworICAgICAgIHNldERlZmF1bHRNb2RlbE9iamVjdCh3b3JrZmxvd3MpOworICAgICAgIGlmKHdvcmtmbG93cyAhPSBudWxsICYmIHdvcmtmbG93cy5zaXplKCkgPiAwKXsKKyAgICAgICAgIHRoaXMud1RhYmxlLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICB0aGlzLndUYWJsZS5hZGQobmV3IExhYmVsKCJzZWxlY3RlZEV2ZW50IiwgdGhpcy5zZWxlY3RlZEV2ZW50KSk7CisgICAgICAgfQorICAgIH0KKyAgCisgICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZEV2ZW50KCl7CisgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEV2ZW50OworICAgIH0KKyAgICAKKyAgfQorICAKKyAgCisKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9Xb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL1dvcmtmbG93SW5zdGFuY2VzVmlld2VyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTM2ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9Xb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5jc3MKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbnN0YW5jZV9maWx0ZXJfaGVhZGVyeworCit9CisKK2Eud29ya2Zsb3dfc3RhdHVzeworCit9CisKKyN3b3JrZmxvd19kaXNwbGF5eworCit9CisKKyN3b3JrZmxvd19pbnN0X3RibHsKKwlib3JkZXI6MHB4OworCWJvcmRlci1zcGFjaW5nOjNweDsKKwlib3JkZXI6IDRweCAjMDAwMDAwOworfQorCisuY2VudGVyZWR7CisgICB0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworLnNtYWxsZXJ7CisJZm9udC1zaXplOjlweDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzVmMjgzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9Xb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5odG1sCkBAIC0wLDAgKzEsODkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0Omxpbms+CisgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuY3NzIi8+CisgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0icHJvZ3Jlc3Nfd2lja2V0LmNzcyIvPgorIDx3aWNrZXQ6cmVtb3ZlPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJwcm9ncmVzcy5jc3MiLz4gCisgPC93aWNrZXQ6cmVtb3ZlPgorIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgc3JjPSJwcm90b3R5cGUuanMiPjwvc2NyaXB0PgorIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgc3JjPSJwcm9ncmVzcy5qcyI+PC9zY3JpcHQ+Cis8L3dpY2tldDpsaW5rPgorCis8ZGl2IGlkPSJpbnN0YW5jZV9maWx0ZXJfaGVhZGVyIj4KKyAgPGg0PkZpbHRlciBXb3JrZmxvd3MgYnkgU3RhdHVzOjwvaDQ+CisgIDxwPlNlbGVjdCBhbnkgb2YgdGhlIGZvbGxvd2luZyB0byBkaXNwbGF5IG9ubHkgd29ya2Zsb3cgaW5zdGFuY2VzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgc3RhdHVzOjwvcD4KKyAgPHdpY2tldDpjb250YWluZXIgd2lja2V0OmlkPSJ3b3JrZmxvd19zdGF0dXNlcyI+CisgICAgPGEgY2xhc3M9IndvcmtmbG93X3N0YXR1cyIgd2lja2V0OmlkPSJ3c3RhdHVzX2xpbmsiIGhyZWY9IiMiPjxzcGFuIHdpY2tldDppZD0id3N0YXR1cyI+U1RBUlRFRDwvc3Bhbj48L2E+CisgIDwvd2lja2V0OmNvbnRhaW5lcj4gCisgICAgPHdpY2tldDpyZW1vdmU+CisgICAgPGEgY2xhc3M9IndvcmtmbG93X3N0YXR1cyIgaHJlZj0iIyI+RklOSVNIRUQ8L2E+Jm5ic3A7fAorICAgIDxhIGNsYXNzPSJ3b3JrZmxvd19zdGF0dXMiIGhyZWY9IiMiPk1FVE1JU1M8L2E+Jm5ic3A7fCAgICAgICAgICAgIAorICAgIDxhIGNsYXNzPSJ3b3JrZmxvd19zdGF0dXMiIGhyZWY9IiMiPlBBVVNFRDwvYT4mbmJzcDt8CisgICAgPGEgY2xhc3M9IndvcmtmbG93X3N0YXR1cyIgaHJlZj0iIyI+QUxMPC9hPiZuYnNwO3wKKyAgICA8L3dpY2tldDpyZW1vdmU+Cis8L2Rpdj4KKworICAgPHA+V29ya2Zsb3dzIDxiIHdpY2tldDppZD0ic3RhcnRfaWR4Ij4xPC9iPi08YiB3aWNrZXQ6aWQ9ImVuZF9pZHgiPjIwPC9iPiBvZiA8YiB3aWNrZXQ6aWQ9Im51bV9pbnN0cyI+MjA8L2I+IHRvdGFsPC9wPgorICAgICA8dGFibGUgaWQ9IndvcmtmbG93X2luc3RfdGJsIj4KKyAgICAgICA8dGhlYWQgY2xhc3M9ImNlbnRlcmVkIj4KKyAgICAgICAgIDx0cj4KKwkgICAgICAgICA8dGg+V29ya2Zsb3c8L3RoPgorCSAgICAgICAgIDx0aD5Qcm9ncmVzczwvdGg+CisJICAgICAgICAgPHRoPlN0YXR1czwvdGg+CisJICAgICAgICAgPHRoPkV4ZWN1dGlvbiBUaW1lIChtaW4pPC90aD4KKwkgICAgICAgICA8dGg+Q3VycmVudCBUYXNrIEV4ZWN1dGlvbiBUaW1lIChtaW4pPC90aD4KKwkgICAgICAgICA8dGg+Q3VycmVudCBUYXNrPC90aD4gCisgICAgICAgICA8L3RyPgorICAgICAgIDwvdGhlYWQ+CisJCQorCQk8dGJvZHk+CisJICAgICAgIDx0ciB3aWNrZXQ6aWQ9IndvcmtmbG93X2luc3RzIj4KKwkgICAgICAgICA8dGQ+PGEgaHJlZj0iIyIgd2lja2V0OmlkPSJ3b3JrZmxvd19saW5rIj48c3BhbiB3aWNrZXQ6aWQ9IndvcmtmbG93X25hbWUiPlRlc3QgV29ya2Zsb3c8L3NwYW4+PC9hPgorCSAgICAgICAgIDxici8+CisJICAgICAgICAgPHAgY2xhc3M9InNtYWxsZXIiIHdpY2tldDppZD0iaW5zdF9tZXRfZGlzcGxheSI+UHJvY2Vzc2luZ05vZGU6bG9jYWxob3N0LFdvcmtmbG93SW5zdGFuY2VJZDoxPC9wPgorCSAgICAgICAgIDwvdGQ+CisJICAgICAgICAgPHRkIGNsYXNzPSJjZW50ZXJlZCI+PHNjcmlwdCB3aWNrZXQ6aWQ9IndpbnN0X2Rpc3BsYXkiPmRpc3BsYXkoJy4vcGVyY2VudEltYWdlLnBuZycsICd3aW5zdF8xX3Byb2dyZXNzJywgNjYsIDEpOzwvc2NyaXB0PjwvdGQ+CisJICAgICAgICAgPHRkIGNsYXNzPSJjZW50ZXJlZCIgd2lja2V0OmlkPSJ3aW5zdF9zdGF0dXMiPlJTVUJNSVQ8L3RkPgorCSAgICAgICAgIDx0ZCBjbGFzcz0iY2VudGVyZWQiIHdpY2tldDppZD0id2luc3Rfd2FsbGNsb2NrX21pbnMiPjUuMjI8L3RkPgorCSAgICAgICAgIDx0ZCBjbGFzcz0iY2VudGVyZWQiIHdpY2tldDppZD0id2luc3RfdGFza193YWxsY2xvY2tfbWlucyI+Mi41PC90ZD4KKwkgICAgICAgICA8dGQgY2xhc3M9ImNlbnRlcmVkIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9InRhc2tfbGluayI+PHNwYW4gd2lja2V0OmlkPSJ0YXNrX25hbWUiPkhlbGxvIFdvcmxkPC9zcGFuPjwvYT48L3RkPgorCSAgICAgICAgPC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorICAgIDxwPiZuYnNwOzwvcD4KKyAgICA8cD4mbmJzcDs8L3A+CisgICAgPHNwYW4gd2lja2V0OmlkPSJwYWdpbmF0b3IiLz4KKyAgICAKKyAgICA8d2lja2V0OnJlbW92ZT4KKyAgICA8aHIgd2lkdGg9IioiPgorICAgIDxkaXYgYWxpZ249ImNlbnRlciI+CisgICAgICA8dGFibGUgaWQ9InBhZ2luYXRpb25fdGFibGUiPgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQgaWQ9InBhZ2luYXRpb25fdGFibGVfcmVzdWx0X2hkciI+UmVzdWx0IFBhZ2U8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisgICAgPC93aWNrZXQ6cmVtb3ZlPgorCisgIDxwPiZuYnNwOzwvcD4KKyAgPHA+Jm5ic3A7PC9wPgorICA8cD4mbmJzcDs8L3A+CisgIDxwPiZuYnNwOzwvcD4KKzwvd2lja2V0OnBhbmVsPgorCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL1dvcmtmbG93SW5zdGFuY2VzVmlld2VyLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL1dvcmtmbG93SW5zdGFuY2VzVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3ZDE4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDI5MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5pbnN0YW5jZTsKKworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuV29ya2Zsb3dNZ3JDb25uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5wYWdpbmF0aW9uLldvcmtmbG93UGFnZVBhZ2luYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VNZXRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlTWV0YWRhdGFSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LklSZXNvdXJjZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlJlc291cmNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LmJlaGF2aW9yLlNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuUmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdEl0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0VmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5wYW5lbC5QYW5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tb2RlbC51dGlsLkxpc3RNb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC51dGlsLnZhbHVlLlZhbHVlTWFwOworCisvKioKKyAqIAorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93SW5zdGFuY2VzVmlld2VyIGV4dGVuZHMgUGFuZWwgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTEwMDQzMDM2NTg0MTIxMzdMOworCisgIHByaXZhdGUgV29ya2Zsb3dNZ3JDb25uIHdtOworCisgIHByaXZhdGUgaW50IHBhZ2VOdW07CisKKyAgcHJpdmF0ZSBpbnQgc3RhcnRJZHg7CisKKyAgcHJpdmF0ZSBpbnQgZW5kSWR4OworCisgIHByaXZhdGUgaW50IHRvdGFsV29ya2Zsb3dJbnN0czsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFID0gMjA7CisKKyAgLyoqCisgICAqIEBwYXJhbSBpZAorICAgKi8KKyAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VzVmlld2VyKFN0cmluZyBpZCwgU3RyaW5nIHdvcmtmbG93VXJsU3RyLAorICAgICAgZmluYWwgU3RyaW5nIHN0YXR1cywgaW50IHBhZ2VOdW0sIExpc3Q8U3RyaW5nPiB3U3RhdHVzZXMsCisgICAgICBmaW5hbCBTdHJpbmcgbGlmZWN5Y2xlRmlsZVBhdGgsIGZpbmFsIFN0cmluZyBtZXRJbnN0YW5jZUZpbGVQYXRoLAorICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdlYlBhZ2U+IHdvcmtmbG93Vmlld2VyLAorICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdlYlBhZ2U+IHdvcmtmbG93VGFza1ZpZXdlciwKKyAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBXZWJQYWdlPiB3b3JrZmxvd0luc3RWaWV3ZXIpIHsKKyAgICBzdXBlcihpZCk7CisgICAgdGhpcy53bSA9IG5ldyBXb3JrZmxvd01nckNvbm4od29ya2Zsb3dVcmxTdHIpOworICAgIHRoaXMucGFnZU51bSA9IHBhZ2VOdW07CisgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSA9IG51bGw7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJTVEFUVVMgSVMgIitzdGF0dXMpOworICAgIGlmIChzdGF0dXMuZXF1YWxzKCJBTEwiKSkgeworICAgICAgcGFnZSA9IHRoaXMud20uc2FmZUdldFdvcmtmbG93SW5zdFBhZ2VCeVN0YXR1cyhwYWdlTnVtKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFnZSA9IHRoaXMud20uc2FmZUdldFdvcmtmbG93SW5zdFBhZ2VCeVN0YXR1cyhwYWdlTnVtLCBzdGF0dXMpOworICAgIH0KKworICAgIHRoaXMuY29tcHV0ZVN0YXJ0RW5kSWR4KHBhZ2UpOworICAgIGFkZChuZXcgTGlzdFZpZXc8U3RyaW5nPigid29ya2Zsb3dfc3RhdHVzZXMiLCBuZXcgTGlzdE1vZGVsPFN0cmluZz4oCisgICAgICAgIHdTdGF0dXNlcykpIHsKKyAgICAgIC8qCisgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUKKyAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08U3RyaW5nPiBpdGVtKSB7CisgICAgICAgIExpbms8U3RyaW5nPiB3U3RhdHVzTGluayA9IG5ldyBMaW5rPFN0cmluZz4oIndzdGF0dXNfbGluayIsIG5ldyBNb2RlbCgKKyAgICAgICAgICAgIGl0ZW0uZ2V0TW9kZWxPYmplY3QoKSkpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgKiAKKyAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBwYXJhbXMuYWRkKCJzdGF0dXMiLCBnZXRNb2RlbE9iamVjdCgpKTsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShnZXRQYWdlKCkuZ2V0Q2xhc3MoKSwgcGFyYW1zKTsKKworICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBMYWJlbCB3U3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwoIndzdGF0dXMiLCBpdGVtLmdldE1vZGVsT2JqZWN0KCkpOworICAgICAgICBpZiAoaXRlbS5nZXRNb2RlbE9iamVjdCgpLmVxdWFscyhzdGF0dXMpKSB7CisgICAgICAgICAgd1N0YXR1c0xhYmVsLmFkZChuZXcgU2ltcGxlQXR0cmlidXRlTW9kaWZpZXIoImNsYXNzIiwgInNlbGVjdGVkIikpOworICAgICAgICB9CisgICAgICAgIHdTdGF0dXNMaW5rLmFkZCh3U3RhdHVzTGFiZWwpOworICAgICAgICBpdGVtLmFkZCh3U3RhdHVzTGluayk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBhZGQobmV3IExhYmVsKCJzdGFydF9pZHgiLCBTdHJpbmcudmFsdWVPZih0aGlzLnN0YXJ0SWR4KSkpOworICAgIGFkZChuZXcgTGFiZWwoImVuZF9pZHgiLCBTdHJpbmcudmFsdWVPZih0aGlzLmVuZElkeCkpKTsKKyAgICBhZGQobmV3IExhYmVsKCJudW1faW5zdHMiLCBTdHJpbmcudmFsdWVPZih0aGlzLnRvdGFsV29ya2Zsb3dJbnN0cykpKTsKKworICAgIGFkZChuZXcgTGlzdFZpZXc8V29ya2Zsb3dJbnN0YW5jZT4oIndvcmtmbG93X2luc3RzIiwKKyAgICAgICAgbmV3IExpc3RNb2RlbDxXb3JrZmxvd0luc3RhbmNlPihwYWdlLmdldFBhZ2VXb3JrZmxvd3MoKSkpIHsKKyAgICAgIC8qCisgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUKKyAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08V29ya2Zsb3dJbnN0YW5jZT4gaXRlbSkgeworICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBpdGVtLmdldE1vZGVsT2JqZWN0KCk7CisgICAgICAgIExpbms8U3RyaW5nPiB3b3JrZmxvd0xpbmsgPSBuZXcgTGluazxTdHJpbmc+KCJ3b3JrZmxvd19saW5rIiwgbmV3IE1vZGVsPFN0cmluZz4oaW5zdAorICAgICAgICAgICAgLmdldFdvcmtmbG93KCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgKiAKKyAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBwYXJhbXMuYWRkKCJpZCIsIGdldE1vZGVsT2JqZWN0KCkpOworICAgICAgICAgICAgc2V0UmVzcG9uc2VQYWdlKHdvcmtmbG93Vmlld2VyLCBwYXJhbXMpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgd29ya2Zsb3dMaW5rLmFkZChuZXcgTGFiZWwoIndvcmtmbG93X25hbWUiLCBpbnN0LmdldFdvcmtmbG93KCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIGl0ZW0uYWRkKHdvcmtmbG93TGluayk7CisKKyAgICAgICAgU3RyaW5nIGluc3RNZXRTdHJpbmcgPSBnZXRXb3JrZmxvd0luc3RNZXQoaW5zdCwgbWV0SW5zdGFuY2VGaWxlUGF0aCk7CisgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgiaW5zdF9tZXRfZGlzcGxheSIsIGluc3RNZXRTdHJpbmcpKTsKKworICAgICAgICBSZXNvdXJjZVJlZmVyZW5jZSBpbWdSZWYgPSBuZXcgUmVzb3VyY2VSZWZlcmVuY2UoV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuY2xhc3MsCisgICAgICAgICAgICAicGVyY2VudEltYWdlLnBuZyIpOworICAgICAgICBpbWdSZWYuYmluZChnZXRBcHBsaWNhdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHJlc1JlZlN0cmluZyA9IGdldFJlcXVlc3RDeWNsZSgpLnVybEZvcihpbWdSZWYsIG5ldyBWYWx1ZU1hcCgpKS50b1N0cmluZygpOworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIndpbnN0X2Rpc3BsYXkiLCAiZGlzcGxheSgnIiArIHJlc1JlZlN0cmluZworICAgICAgICAgICAgKyAiJywgJ3dpbnN0XyIgKyBpbnN0LmdldElkKCkgKyAiX3Byb2dyZXNzJywgIgorICAgICAgICAgICAgKyBnZXRQY3RDb21wbGV0ZShpbnN0LCBsaWZlY3ljbGVGaWxlUGF0aCkgKyAiLCAxKTsiKS5zZXRFc2NhcGVNb2RlbFN0cmluZ3MoZmFsc2UpKTsKKworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIndpbnN0X3N0YXR1cyIsIGluc3QuZ2V0U3RhdHVzKCkpKTsKKyAgICAgICAgaXRlbS5hZGQobmV3IExhYmVsKCJ3aW5zdF93YWxsY2xvY2tfbWlucyIsIGZvcm1hdFdhbGxDbG9ja01pbnMod20KKyAgICAgICAgICAgIC5zYWZlR2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKGluc3QpKSkpOworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIndpbnN0X3Rhc2tfd2FsbGNsb2NrX21pbnMiLCBmb3JtYXRXYWxsQ2xvY2tNaW5zKHdtCisgICAgICAgICAgICAuc2FmZUdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QpKSkpOworCisgICAgICAgIExpbms8U3RyaW5nPiB0YXNrTGluayA9IG5ldyBMaW5rPFN0cmluZz4oInRhc2tfbGluayIsIG5ldyBNb2RlbDxTdHJpbmc+KGluc3QKKyAgICAgICAgICAgIC5nZXRDdXJyZW50VGFza0lkKCkpKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICogCisgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgICAgICovCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICAgIFBhZ2VQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYWdlUGFyYW1ldGVycygpOworICAgICAgICAgICAgcGFyYW1zLmFkZCgiaWQiLCBnZXRNb2RlbE9iamVjdCgpKTsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZSh3b3JrZmxvd1Rhc2tWaWV3ZXIsIHBhcmFtcyk7CisKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRhc2tMaW5rLmFkZChuZXcgTGFiZWwoInRhc2tfbmFtZSIsIGdldFRhc2tOYW1lRnJvbVRhc2tJZChpbnN0LCBpbnN0LmdldEN1cnJlbnRUYXNrSWQoKSkpKTsKKyAgICAgICAgaXRlbS5hZGQodGFza0xpbmspOworCisgICAgICB9CisgICAgfSk7CisgICAgCisgICAgYWRkKG5ldyBXb3JrZmxvd1BhZ2VQYWdpbmF0b3IoInBhZ2luYXRvciIsIHBhZ2UsIHN0YXR1cywgd29ya2Zsb3dJbnN0Vmlld2VyKSk7CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjb21wdXRlU3RhcnRFbmRJZHgoV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSkgeworICAgIGlmIChwYWdlLmdldFRvdGFsUGFnZXMoKSA9PSAxKSB7CisgICAgICB0aGlzLnRvdGFsV29ya2Zsb3dJbnN0cyA9IHBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpLnNpemUoKTsKKyAgICAgIHRoaXMucGFnZU51bSA9IDE7CisgICAgfSBlbHNlIGlmIChwYWdlLmdldFRvdGFsUGFnZXMoKSA9PSAwKSB7CisgICAgICB0aGlzLnRvdGFsV29ya2Zsb3dJbnN0cyA9IDA7CisgICAgICB0aGlzLnBhZ2VOdW0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnRvdGFsV29ya2Zsb3dJbnN0cyA9IChwYWdlLmdldFRvdGFsUGFnZXMoKSAtIDEpICogUEFHRV9TSVpFOworICAgICAgdGhpcy5wYWdlTnVtID0gcGFnZS5nZXRQYWdlTnVtKCk7CisKKyAgICAgIC8vIGdldCB0aGUgbGFzdCBwYWdlCisgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBsYXN0UGFnZSA9IG51bGw7CisgICAgICBsYXN0UGFnZSA9IHdtLnNhZmVHZXRXb3JrZmxvd0luc3RQYWdlQnlTdGF0dXMocGFnZS5nZXRUb3RhbFBhZ2VzKCkpOworICAgICAgdGhpcy50b3RhbFdvcmtmbG93SW5zdHMgKz0gbGFzdFBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpLnNpemUoKTsKKworICAgIH0KKyAgICB0aGlzLmVuZElkeCA9IHRoaXMudG90YWxXb3JrZmxvd0luc3RzICE9IDAgPyBNYXRoLm1pbigKKyAgICAgICAgdGhpcy50b3RhbFdvcmtmbG93SW5zdHMsIChQQUdFX1NJWkUpICogKHRoaXMucGFnZU51bSkpIDogMDsKKyAgICB0aGlzLnN0YXJ0SWR4ID0gdGhpcy50b3RhbFdvcmtmbG93SW5zdHMgIT0gMCA/ICgodGhpcy5wYWdlTnVtIC0gMSkgKiBQQUdFX1NJWkUpICsgMQorICAgICAgICA6IDA7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRXb3JrZmxvd0luc3RNZXQoV29ya2Zsb3dJbnN0YW5jZSBpbnN0LCBTdHJpbmcgbWV0TWFwRmlsZVBhdGgpIHsKKyAgICBXb3JrZmxvd0luc3RhbmNlTWV0TWFwIHdJbnN0TWV0TWFwID0gbnVsbDsKKyAgICBTdHJpbmcgbWV0U3RyaW5nID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICB3SW5zdE1ldE1hcCA9IFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YVJlYWRlcgorICAgICAgICAgIC5wYXJzZU1ldE1hcEZpbGUobWV0TWFwRmlsZVBhdGgpOworICAgICAgTWV0YWRhdGEgaW5zdE1ldGFkYXRhID0gd20uZ2V0V00oKS5nZXRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEoCisgICAgICAgICAgaW5zdC5nZXRJZCgpKTsKKyAgICAgIExpc3Q8U3RyaW5nPiB3SW5zdEZpZWxkcyA9IHdJbnN0TWV0TWFwLmdldEZpZWxkc0ZvcldvcmtmbG93KGluc3QKKyAgICAgICAgICAuZ2V0V29ya2Zsb3coKS5nZXRJZCgpKSAhPSBudWxsID8gd0luc3RNZXRNYXAKKyAgICAgICAgICAuZ2V0RmllbGRzRm9yV29ya2Zsb3coaW5zdC5nZXRXb3JrZmxvdygpLmdldElkKCkpIDogd0luc3RNZXRNYXAKKyAgICAgICAgICAuZ2V0RGVmYXVsdEZpZWxkcygpOworICAgICAgU3RyaW5nQnVmZmVyIG1ldFN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgZm9yIChTdHJpbmcgd0luc3RGaWVsZCA6IHdJbnN0RmllbGRzKSB7CisgICAgICAgIG1ldFN0ckJ1Zi5hcHBlbmQod0luc3RGaWVsZCk7CisgICAgICAgIG1ldFN0ckJ1Zi5hcHBlbmQoIjoiKTsKKyAgICAgICAgbWV0U3RyQnVmLmFwcGVuZChpbnN0TWV0YWRhdGEuZ2V0TWV0YWRhdGEod0luc3RGaWVsZCkpOworICAgICAgICBtZXRTdHJCdWYuYXBwZW5kKCIsIik7CisgICAgICB9CisKKyAgICAgIG1ldFN0ckJ1Zi5kZWxldGVDaGFyQXQobWV0U3RyQnVmLmxlbmd0aCgpIC0gMSk7CisgICAgICBtZXRTdHJpbmcgPSBtZXRTdHJCdWYudG9TdHJpbmcoKTsKKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIHJldHVybiBtZXRTdHJpbmc7CisKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGZvcm1hdFdhbGxDbG9ja01pbnMoZG91YmxlIHdhbGxDbG9ja01pbnMpIHsKKyAgICBOdW1iZXJGb3JtYXQgZm4gPSBOdW1iZXJGb3JtYXQuZ2V0TnVtYmVySW5zdGFuY2UoKTsKKyAgICBmbi5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoMik7CisgICAgZm4uc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKDIpOworICAgIHJldHVybiBmbi5mb3JtYXQod2FsbENsb2NrTWlucyk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRQY3RDb21wbGV0ZShXb3JrZmxvd0luc3RhbmNlIGluc3QsIFN0cmluZyBsaWZlY3ljbGVGaWxlUGF0aCkgeworICAgIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNZ3IgPSBudWxsOworICAgIHRyeSB7CisgICAgICBsaWZlY3ljbGVNZ3IgPSBuZXcgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyKGxpZmVjeWNsZUZpbGVQYXRoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIGxpZmVjeWNsZU1ncgorICAgICAgICAuZm9ybWF0UGN0KGxpZmVjeWNsZU1nci5nZXRQZXJjZW50YWdlQ29tcGxldGUoaW5zdCkgKiAxMDAuMCk7CisgIH0KKyAgCisgIHByaXZhdGUgU3RyaW5nIGdldFRhc2tOYW1lRnJvbVRhc2tJZChXb3JrZmxvd0luc3RhbmNlIHcsIFN0cmluZyB0YXNrSWQpIHsKKyAgICBpZiAody5nZXRXb3JrZmxvdygpICE9IG51bGwgJiYgdy5nZXRXb3JrZmxvdygpLmdldFRhc2tzKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgdy5nZXRXb3JrZmxvdygpLmdldFRhc2tzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IoV29ya2Zsb3dUYXNrIHRhc2s6IChMaXN0PFdvcmtmbG93VGFzaz4pKExpc3Q8Pz4pdy5nZXRXb3JrZmxvdygpLmdldFRhc2tzKCkpeworICAgICAgICAgICAgaWYgKHRhc2suZ2V0VGFza0lkKCkuZXF1YWxzKHRhc2tJZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5nZXRUYXNrTmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBudWxsOworfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZS5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyOGQ2NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcGVyY2VudEltYWdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrLnBuZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcGVyY2VudEltYWdlX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZWVhNTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrMS5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNmUyZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcGVyY2VudEltYWdlX2JhY2sxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrMi5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzYWE1OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcGVyY2VudEltYWdlX2JhY2syLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrMy5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmN2ZjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcGVyY2VudEltYWdlX2JhY2szLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrNC5wbmcgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3BlcmNlbnRJbWFnZV9iYWNrNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5OWRjNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcGVyY2VudEltYWdlX2JhY2s0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3Byb2dyZXNzLmNzcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcHJvZ3Jlc3MuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiY2NmMTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3Byb2dyZXNzLmNzcwpAQCAtMCwwICsxLDQ0IEBACisvKg0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyovDQorDQoraW1nLnBlcmNlbnRJbWFnZTEgew0KKyBiYWNrZ3JvdW5kOiB3aGl0ZSB1cmwocGVyY2VudEltYWdlX2JhY2sxLnBuZykgdG9wIGxlZnQgbm8tcmVwZWF0Ow0KKyBwYWRkaW5nOiAwOw0KKyBtYXJnaW46IDVweCAwIDAgMDsNCisgYmFja2dyb3VuZC1wb3NpdGlvbjogMXB4IDA7DQorfQ0KKw0KK2ltZy5wZXJjZW50SW1hZ2UyIHsNCisgYmFja2dyb3VuZDogd2hpdGUgdXJsKHBlcmNlbnRJbWFnZV9iYWNrMi5wbmcpIHRvcCBsZWZ0IG5vLXJlcGVhdDsNCisgcGFkZGluZzogMDsNCisgbWFyZ2luOiA1cHggMCAwIDA7DQorIGJhY2tncm91bmQtcG9zaXRpb246IDFweCAwOw0KK30NCisNCitpbWcucGVyY2VudEltYWdlMyB7DQorIGJhY2tncm91bmQ6IHdoaXRlIHVybChwZXJjZW50SW1hZ2VfYmFjazMucG5nKSB0b3AgbGVmdCBuby1yZXBlYXQ7DQorIHBhZGRpbmc6IDA7DQorIG1hcmdpbjogNXB4IDAgMCAwOw0KKyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxcHggMDsNCit9DQorDQoraW1nLnBlcmNlbnRJbWFnZTQgew0KKyBiYWNrZ3JvdW5kOiB3aGl0ZSB1cmwocGVyY2VudEltYWdlX2JhY2s0LnBuZykgdG9wIGxlZnQgbm8tcmVwZWF0Ow0KKyBwYWRkaW5nOiAwOw0KKyBtYXJnaW46IDVweCAwIDAgMDsNCisgYmFja2dyb3VuZC1wb3NpdGlvbjogMXB4IDA7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcHJvZ3Jlc3MuanMgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3Byb2dyZXNzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjUyNTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L2luc3RhbmNlL3Byb2dyZXNzLmpzCkBAIC0wLDAgKzEsMTE5IEBACisvKiBXZWJBcHBlcnMgUHJvZ3Jlc3MgQmFyLCB2ZXJzaW9uIDAuMgorKiAoYykgMjAwNyBSYXkgQ2hldW5nCisqCisqIFdlYkFwcGVycyBQcm9ncmVzcyBCYXIgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZS4KKyogRm9yIGRldGFpbHMsIHNlZSB0aGUgV2ViQXBwZXJzIHdlYiBzaXRlOiBodHRwOi8vd3d3LndlYmFwcGVycy5jb20vcHJvZ3Jlc3NCYXIvCisqCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIGluaXRpYWwgPSAtMTIwOwordmFyIGltYWdlV2lkdGg9MjQwOwordmFyIGVhY2hQZXJjZW50ID0gKGltYWdlV2lkdGgvMikvMTAwOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitmdW5jdGlvbiBzZXRUZXh0IChpZCwgcGVyY2VudCkKK3sKKyAgICAkKGlkKydUZXh0JykuaW5uZXJIVE1MID0gcGVyY2VudCsiJSI7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Z1bmN0aW9uIGRpc3BsYXkgKGltZywgaWQsIHBlcmNlbnRhZ2UsY29sb3IgKQorewkKKwlpZiAodHlwZW9mIGNvbG9yID09ICJ1bmRlZmluZWQiKSB7CisgICAgY29sb3IgPSAiMSI7CisgIAl9CisgICAgdmFyIHBlcmNlbnRhZ2VXaWR0aCA9IGVhY2hQZXJjZW50ICogcGVyY2VudGFnZTsKKyAgICB2YXIgYWN0dWFsV2lkdGggPSBpbml0aWFsICsgcGVyY2VudGFnZVdpZHRoIDsKKyAgICBkb2N1bWVudC53cml0ZSgnPGltZyBpZD0iJytpZCsnIiBzcmM9IicraW1nKyciIGFsdD0iJytwZXJjZW50YWdlKyclIiBjbGFzcz0icGVyY2VudEltYWdlJytjb2xvcisnIiBzdHlsZT0iYmFja2dyb3VuZC1wb3NpdGlvbjogJythY3R1YWxXaWR0aCsncHggMHB0OyIvPiA8c3BhbiBpZD0iJytpZCsnVGV4dCI+JytwZXJjZW50YWdlKyclPC9zcGFuPicpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitmdW5jdGlvbiBlbXB0eVByb2dyZXNzKGlkKQoreworICAgIHZhciBuZXdQcm9ncmVzcyA9IGluaXRpYWwrJ3B4JzsKKyAgICAkKGlkKS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249bmV3UHJvZ3Jlc3MrJyAwJzsKKyAgICBzZXRUZXh0KGlkLCcwJyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Z1bmN0aW9uIGdldFByb2dyZXNzKGlkKQoreworICAgIHZhciBub3dXaWR0aCA9ICQoaWQpLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbi5zcGxpdCgicHgiKTsKKyAgICByZXR1cm4gKE1hdGguZmxvb3IoMTAwKyhub3dXaWR0aFswXS9lYWNoUGVyY2VudCkpKyclJyk7CisJCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Z1bmN0aW9uIHNldFByb2dyZXNzKGlkLCBwZXJjZW50YWdlKQoreworICAgIHZhciBwZXJjZW50YWdlV2lkdGggPSBlYWNoUGVyY2VudCAqIHBlcmNlbnRhZ2U7CisgICAgdmFyIG5ld1Byb2dyZXNzID0gZXZhbChpbml0aWFsKStldmFsKHBlcmNlbnRhZ2VXaWR0aCkrJ3B4JzsKKyAgICAkKGlkKS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249bmV3UHJvZ3Jlc3MrJyAwJzsKKyAgICBzZXRUZXh0KGlkLHBlcmNlbnRhZ2UpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitmdW5jdGlvbiBwbHVzICggaWQsIHBlcmNlbnRhZ2UgKQoreworICAgIHZhciBub3dXaWR0aCA9ICQoaWQpLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbi5zcGxpdCgicHgiKTsKKyAgICB2YXIgbm93UGVyY2VudCA9IE1hdGguZmxvb3IoMTAwKyhub3dXaWR0aFswXS9lYWNoUGVyY2VudCkpK2V2YWwocGVyY2VudGFnZSk7CisgICAgdmFyIHBlcmNlbnRhZ2VXaWR0aCA9IGVhY2hQZXJjZW50ICogcGVyY2VudGFnZTsKKyAgICB2YXIgYWN0dWFsV2lkdGggPSBldmFsKG5vd1dpZHRoWzBdKSArIGV2YWwocGVyY2VudGFnZVdpZHRoKTsKKyAgICB2YXIgbmV3UHJvZ3Jlc3MgPSBhY3R1YWxXaWR0aCsncHgnOworICAgIGlmKGFjdHVhbFdpZHRoPj0wICYmIHBlcmNlbnRhZ2UgPDEwMCkKKyAgICB7CisgICAgICAgIHZhciBuZXdQcm9ncmVzcyA9IDErJ3B4JzsKKyAgICAgICAgJChpZCkuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uPW5ld1Byb2dyZXNzKycgMCc7CisgICAgICAgIHNldFRleHQoaWQsMTAwKTsKKyAgICAgICAgYWxlcnQoJ2Z1bGwnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgJChpZCkuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uPW5ld1Byb2dyZXNzKycgMCc7CisgICAgICAgIHNldFRleHQoaWQsbm93UGVyY2VudCk7CisgICAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitmdW5jdGlvbiBtaW51cyAoIGlkLCBwZXJjZW50YWdlICkKK3sKKyAgICB2YXIgbm93V2lkdGggPSAkKGlkKS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24uc3BsaXQoInB4Iik7CisgICAgdmFyIG5vd1BlcmNlbnQgPSBNYXRoLmZsb29yKDEwMCsobm93V2lkdGhbMF0vZWFjaFBlcmNlbnQpKS1ldmFsKHBlcmNlbnRhZ2UpOworICAgIHZhciBwZXJjZW50YWdlV2lkdGggPSBlYWNoUGVyY2VudCAqIHBlcmNlbnRhZ2U7CisgICAgdmFyIGFjdHVhbFdpZHRoID0gZXZhbChub3dXaWR0aFswXSkgLSBldmFsKHBlcmNlbnRhZ2VXaWR0aCk7CisgICAgdmFyIG5ld1Byb2dyZXNzID0gYWN0dWFsV2lkdGgrJ3B4JzsKKyAgICBpZihhY3R1YWxXaWR0aDw9LTEyMCkKKyAgICB7CisgICAgICAgIHZhciBuZXdQcm9ncmVzcyA9IC0xMjArJ3B4JzsKKyAgICAgICAgJChpZCkuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uPW5ld1Byb2dyZXNzKycgMCc7CisgICAgICAgIHNldFRleHQoaWQsMCk7CisgICAgICAgIGFsZXJ0KCdlbXB0eScpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAkKGlkKS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249bmV3UHJvZ3Jlc3MrJyAwJzsKKyAgICAgICAgc2V0VGV4dChpZCxub3dQZXJjZW50KTsKKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Z1bmN0aW9uIGZpbGxQcm9ncmVzcyhpZCwgZW5kUGVyY2VudCkKK3sKKyAgICB2YXIgbm93V2lkdGggPSAkKGlkKS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24uc3BsaXQoInB4Iik7CisgICAgc3RhcnRQZXJjZW50ID0gTWF0aC5jZWlsKDEwMCsobm93V2lkdGhbMF0vZWFjaFBlcmNlbnQpKSsxOworICAgIHZhciBhY3R1YWxXaWR0aCA9IGluaXRpYWwgKyAoZWFjaFBlcmNlbnQgKiBlbmRQZXJjZW50KTsKKyAgICBpZiAoc3RhcnRQZXJjZW50IDw9IGVuZFBlcmNlbnQgJiYgbm93V2lkdGhbMF0gPD0gYWN0dWFsV2lkdGgpCisgICAgeworICAgICAgICBwbHVzKGlkLCcxJyk7CisgICAgICAgIHNldFRleHQoaWQsc3RhcnRQZXJjZW50KTsKKyAgICAgICAgc2V0VGltZW91dCgiZmlsbFByb2dyZXNzKCciK2lkKyInLCIrZW5kUGVyY2VudCsiKSIsMTApOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcHJvZ3Jlc3Nfd2lja2V0LmNzcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcHJvZ3Jlc3Nfd2lja2V0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc2MWRiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9wcm9ncmVzc193aWNrZXQuY3NzCkBAIC0wLDAgKzEsNDQgQEAKKy8qDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorKi8NCisNCitpbWcucGVyY2VudEltYWdlMSB7DQorIGJhY2tncm91bmQ6IHdoaXRlIHVybCguLi8uLi9pbWFnZXMvcGVyY2VudEltYWdlX2JhY2sxLnBuZykgdG9wIGxlZnQgbm8tcmVwZWF0Ow0KKyBwYWRkaW5nOiAwOw0KKyBtYXJnaW46IDVweCAwIDAgMDsNCisgYmFja2dyb3VuZC1wb3NpdGlvbjogMXB4IDA7DQorfQ0KKw0KK2ltZy5wZXJjZW50SW1hZ2UyIHsNCisgYmFja2dyb3VuZDogd2hpdGUgdXJsKC4uLy4uL2ltYWdlcy9wZXJjZW50SW1hZ2VfYmFjazIucG5nKSB0b3AgbGVmdCBuby1yZXBlYXQ7DQorIHBhZGRpbmc6IDA7DQorIG1hcmdpbjogNXB4IDAgMCAwOw0KKyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxcHggMDsNCit9DQorDQoraW1nLnBlcmNlbnRJbWFnZTMgew0KKyBiYWNrZ3JvdW5kOiB3aGl0ZSB1cmwoLi4vLi4vaW1hZ2VzL3BlcmNlbnRJbWFnZV9iYWNrMy5wbmcpIHRvcCBsZWZ0IG5vLXJlcGVhdDsNCisgcGFkZGluZzogMDsNCisgbWFyZ2luOiA1cHggMCAwIDA7DQorIGJhY2tncm91bmQtcG9zaXRpb246IDFweCAwOw0KK30NCisNCitpbWcucGVyY2VudEltYWdlNCB7DQorIGJhY2tncm91bmQ6IHdoaXRlIHVybCguLi8uLi9pbWFnZXMvcGVyY2VudEltYWdlX2JhY2s0LnBuZykgdG9wIGxlZnQgbm8tcmVwZWF0Ow0KKyBwYWRkaW5nOiAwOw0KKyBtYXJnaW46IDVweCAwIDAgMDsNCisgYmFja2dyb3VuZC1wb3NpdGlvbjogMXB4IDA7DQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcHJvdG90eXBlLmpzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9pbnN0YW5jZS9wcm90b3R5cGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlM2Q4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvaW5zdGFuY2UvcHJvdG90eXBlLmpzCkBAIC0wLDAgKzEsMjUxNSBAQAorLyogIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yaywgdmVyc2lvbiAxLjUuMAorICogIChjKSAyMDA1LTIwMDcgU2FtIFN0ZXBoZW5zb24KKyAqCisgKiAgUHJvdG90eXBlIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUgbGljZW5zZS4KKyAqICBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUgd2ViIHNpdGU6IGh0dHA6Ly9wcm90b3R5cGUuY29uaW8ubmV0LworICoKKyAqLworCit2YXIgUHJvdG90eXBlID0geworICBWZXJzaW9uOiAnMS41LjAnLAorICBCcm93c2VyRmVhdHVyZXM6IHsKKyAgICBYUGF0aDogISFkb2N1bWVudC5ldmFsdWF0ZQorICB9LAorCisgIFNjcmlwdEZyYWdtZW50OiAnKD86PHNjcmlwdC4qPz4pKChcbnxccnwuKSo/KSg/OjxcL3NjcmlwdD4pJywKKyAgZW1wdHlGdW5jdGlvbjogZnVuY3Rpb24oKSB7fSwKKyAgSzogZnVuY3Rpb24oeCkgeyByZXR1cm4geCB9Cit9CisKK3ZhciBDbGFzcyA9IHsKKyAgY3JlYXRlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgIH0KK30KKwordmFyIEFic3RyYWN0ID0gbmV3IE9iamVjdCgpOworCitPYmplY3QuZXh0ZW5kID0gZnVuY3Rpb24oZGVzdGluYXRpb24sIHNvdXJjZSkgeworICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpIHsKKyAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOworICB9CisgIHJldHVybiBkZXN0aW5hdGlvbjsKK30KKworT2JqZWN0LmV4dGVuZChPYmplY3QsIHsKKyAgaW5zcGVjdDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnOworICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsKKyAgICAgIHJldHVybiBvYmplY3QuaW5zcGVjdCA/IG9iamVjdC5pbnNwZWN0KCkgOiBvYmplY3QudG9TdHJpbmcoKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpIHJldHVybiAnLi4uJzsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9LAorCisgIGtleXM6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZhciBrZXlzID0gW107CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQorICAgICAga2V5cy5wdXNoKHByb3BlcnR5KTsKKyAgICByZXR1cm4ga2V5czsKKyAgfSwKKworICB2YWx1ZXM6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZhciB2YWx1ZXMgPSBbXTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpCisgICAgICB2YWx1ZXMucHVzaChvYmplY3RbcHJvcGVydHldKTsKKyAgICByZXR1cm4gdmFsdWVzOworICB9LAorCisgIGNsb25lOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gT2JqZWN0LmV4dGVuZCh7fSwgb2JqZWN0KTsKKyAgfQorfSk7CisKK0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpLCBvYmplY3QgPSBhcmdzLnNoaWZ0KCk7CisgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0LCBhcmdzLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CisgIH0KK30KKworRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRBc0V2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihvYmplY3QpIHsKKyAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZW50cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsKKyAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9iamVjdCwgWyggZXZlbnQgfHwgd2luZG93LmV2ZW50KV0uY29uY2F0KGFyZ3MpLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CisgIH0KK30KKworT2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLCB7CisgIHRvQ29sb3JQYXJ0OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZGlnaXRzID0gdGhpcy50b1N0cmluZygxNik7CisgICAgaWYgKHRoaXMgPCAxNikgcmV0dXJuICcwJyArIGRpZ2l0czsKKyAgICByZXR1cm4gZGlnaXRzOworICB9LAorCisgIHN1Y2M6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzICsgMTsKKyAgfSwKKworICB0aW1lczogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICAkUigwLCB0aGlzLCB0cnVlKS5lYWNoKGl0ZXJhdG9yKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfSk7CisKK3ZhciBUcnkgPSB7CisgIHRoZXNlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmV0dXJuVmFsdWU7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgbGFtYmRhID0gYXJndW1lbnRzW2ldOworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuVmFsdWUgPSBsYW1iZGEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChlKSB7fQorICAgIH0KKworICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIFBlcmlvZGljYWxFeGVjdXRlciA9IENsYXNzLmNyZWF0ZSgpOworUGVyaW9kaWNhbEV4ZWN1dGVyLnByb3RvdHlwZSA9IHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY2FsbGJhY2ssIGZyZXF1ZW5jeSkgeworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOworCisgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKCk7CisgIH0sCisKKyAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oKSB7CisgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLnRpbWVyKSByZXR1cm47CisgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKKyAgICB0aGlzLnRpbWVyID0gbnVsbDsKKyAgfSwKKworICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9CitTdHJpbmcuaW50ZXJwcmV0ID0gZnVuY3Rpb24odmFsdWUpeworICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsKK30KKworT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLCB7CisgIGdzdWI6IGZ1bmN0aW9uKHBhdHRlcm4sIHJlcGxhY2VtZW50KSB7CisgICAgdmFyIHJlc3VsdCA9ICcnLCBzb3VyY2UgPSB0aGlzLCBtYXRjaDsKKyAgICByZXBsYWNlbWVudCA9IGFyZ3VtZW50cy5jYWxsZWUucHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsKKworICAgIHdoaWxlIChzb3VyY2UubGVuZ3RoID4gMCkgeworICAgICAgaWYgKG1hdGNoID0gc291cmNlLm1hdGNoKHBhdHRlcm4pKSB7CisgICAgICAgIHJlc3VsdCArPSBzb3VyY2Uuc2xpY2UoMCwgbWF0Y2guaW5kZXgpOworICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmludGVycHJldChyZXBsYWNlbWVudChtYXRjaCkpOworICAgICAgICBzb3VyY2UgID0gc291cmNlLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBzb3VyY2UsIHNvdXJjZSA9ICcnOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIHN1YjogZnVuY3Rpb24ocGF0dGVybiwgcmVwbGFjZW1lbnQsIGNvdW50KSB7CisgICAgcmVwbGFjZW1lbnQgPSB0aGlzLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsKKyAgICBjb3VudCA9IGNvdW50ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQ7CisKKyAgICByZXR1cm4gdGhpcy5nc3ViKHBhdHRlcm4sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBpZiAoLS1jb3VudCA8IDApIHJldHVybiBtYXRjaFswXTsKKyAgICAgIHJldHVybiByZXBsYWNlbWVudChtYXRjaCk7CisgICAgfSk7CisgIH0sCisKKyAgc2NhbjogZnVuY3Rpb24ocGF0dGVybiwgaXRlcmF0b3IpIHsKKyAgICB0aGlzLmdzdWIocGF0dGVybiwgaXRlcmF0b3IpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIHRydW5jYXRlOiBmdW5jdGlvbihsZW5ndGgsIHRydW5jYXRpb24pIHsKKyAgICBsZW5ndGggPSBsZW5ndGggfHwgMzA7CisgICAgdHJ1bmNhdGlvbiA9IHRydW5jYXRpb24gPT09IHVuZGVmaW5lZCA/ICcuLi4nIDogdHJ1bmNhdGlvbjsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBsZW5ndGggPworICAgICAgdGhpcy5zbGljZSgwLCBsZW5ndGggLSB0cnVuY2F0aW9uLmxlbmd0aCkgKyB0cnVuY2F0aW9uIDogdGhpczsKKyAgfSwKKworICBzdHJpcDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzKy8sICcnKS5yZXBsYWNlKC9ccyskLywgJycpOworICB9LAorCisgIHN0cmlwVGFnczogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvPFwvP1tePl0rPi9naSwgJycpOworICB9LAorCisgIHN0cmlwU2NyaXB0czogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZShuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpLCAnJyk7CisgIH0sCisKKyAgZXh0cmFjdFNjcmlwdHM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBtYXRjaEFsbCA9IG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyk7CisgICAgdmFyIG1hdGNoT25lID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbScpOworICAgIHJldHVybiAodGhpcy5tYXRjaChtYXRjaEFsbCkgfHwgW10pLm1hcChmdW5jdGlvbihzY3JpcHRUYWcpIHsKKyAgICAgIHJldHVybiAoc2NyaXB0VGFnLm1hdGNoKG1hdGNoT25lKSB8fCBbJycsICcnXSlbMV07CisgICAgfSk7CisgIH0sCisKKyAgZXZhbFNjcmlwdHM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGZ1bmN0aW9uKHNjcmlwdCkgeyByZXR1cm4gZXZhbChzY3JpcHQpIH0pOworICB9LAorCisgIGVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICB2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMpOworICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0KTsKKyAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKKyAgfSwKKworICB1bmVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICBkaXYuaW5uZXJIVE1MID0gdGhpcy5zdHJpcFRhZ3MoKTsKKyAgICByZXR1cm4gZGl2LmNoaWxkTm9kZXNbMF0gPyAoZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/CisgICAgICAkQShkaXYuY2hpbGROb2RlcykuaW5qZWN0KCcnLGZ1bmN0aW9uKG1lbW8sbm9kZSl7IHJldHVybiBtZW1vK25vZGUubm9kZVZhbHVlIH0pIDoKKyAgICAgIGRpdi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZSkgOiAnJzsKKyAgfSwKKworICB0b1F1ZXJ5UGFyYW1zOiBmdW5jdGlvbihzZXBhcmF0b3IpIHsKKyAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmlwKCkubWF0Y2goLyhbXj8jXSopKCMuKik/JC8pOworICAgIGlmICghbWF0Y2gpIHJldHVybiB7fTsKKworICAgIHJldHVybiBtYXRjaFsxXS5zcGxpdChzZXBhcmF0b3IgfHwgJyYnKS5pbmplY3Qoe30sIGZ1bmN0aW9uKGhhc2gsIHBhaXIpIHsKKyAgICAgIGlmICgocGFpciA9IHBhaXIuc3BsaXQoJz0nKSlbMF0pIHsKKyAgICAgICAgdmFyIG5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQocGFpclswXSk7CisgICAgICAgIHZhciB2YWx1ZSA9IHBhaXJbMV0gPyBkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSkgOiB1bmRlZmluZWQ7CisKKyAgICAgICAgaWYgKGhhc2hbbmFtZV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGlmIChoYXNoW25hbWVdLmNvbnN0cnVjdG9yICE9IEFycmF5KQorICAgICAgICAgICAgaGFzaFtuYW1lXSA9IFtoYXNoW25hbWVdXTsKKyAgICAgICAgICBpZiAodmFsdWUpIGhhc2hbbmFtZV0ucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBoYXNoW25hbWVdID0gdmFsdWU7CisgICAgICB9CisgICAgICByZXR1cm4gaGFzaDsKKyAgICB9KTsKKyAgfSwKKworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zcGxpdCgnJyk7CisgIH0sCisKKyAgc3VjYzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGggLSAxKSArCisgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxlbmd0aCAtIDEpICsgMSk7CisgIH0sCisKKyAgY2FtZWxpemU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJ0cyA9IHRoaXMuc3BsaXQoJy0nKSwgbGVuID0gcGFydHMubGVuZ3RoOworICAgIGlmIChsZW4gPT0gMSkgcmV0dXJuIHBhcnRzWzBdOworCisgICAgdmFyIGNhbWVsaXplZCA9IHRoaXMuY2hhckF0KDApID09ICctJworICAgICAgPyBwYXJ0c1swXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRzWzBdLnN1YnN0cmluZygxKQorICAgICAgOiBwYXJ0c1swXTsKKworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspCisgICAgICBjYW1lbGl6ZWQgKz0gcGFydHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0c1tpXS5zdWJzdHJpbmcoMSk7CisKKyAgICByZXR1cm4gY2FtZWxpemVkOworICB9LAorCisgIGNhcGl0YWxpemU6IGZ1bmN0aW9uKCl7CisgICAgcmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpOworICB9LAorCisgIHVuZGVyc2NvcmU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmdzdWIoLzo6LywgJy8nKS5nc3ViKC8oW0EtWl0rKShbQS1aXVthLXpdKS8sJyN7MX1fI3syfScpLmdzdWIoLyhbYS16XGRdKShbQS1aXSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8tLywnXycpLnRvTG93ZXJDYXNlKCk7CisgIH0sCisKKyAgZGFzaGVyaXplOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nc3ViKC9fLywnLScpOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKHVzZURvdWJsZVF1b3RlcykgeworICAgIHZhciBlc2NhcGVkU3RyaW5nID0gdGhpcy5yZXBsYWNlKC9cXC9nLCAnXFxcXCcpOworICAgIGlmICh1c2VEb3VibGVRdW90ZXMpCisgICAgICByZXR1cm4gJyInICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8iL2csICdcXCInKSArICciJzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gIiciICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8nL2csICdcXFwnJykgKyAiJyI7CisgIH0KK30pOworCitTdHJpbmcucHJvdG90eXBlLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50ID0gZnVuY3Rpb24ocmVwbGFjZW1lbnQpIHsKKyAgaWYgKHR5cGVvZiByZXBsYWNlbWVudCA9PSAnZnVuY3Rpb24nKSByZXR1cm4gcmVwbGFjZW1lbnQ7CisgIHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyZXBsYWNlbWVudCk7CisgIHJldHVybiBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gdGVtcGxhdGUuZXZhbHVhdGUobWF0Y2gpIH07Cit9CisKK1N0cmluZy5wcm90b3R5cGUucGFyc2VRdWVyeSA9IFN0cmluZy5wcm90b3R5cGUudG9RdWVyeVBhcmFtczsKKwordmFyIFRlbXBsYXRlID0gQ2xhc3MuY3JlYXRlKCk7CitUZW1wbGF0ZS5QYXR0ZXJuID0gLyhefC58XHJ8XG4pKCNceyguKj8pXH0pLzsKK1RlbXBsYXRlLnByb3RvdHlwZSA9IHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odGVtcGxhdGUsIHBhdHRlcm4pIHsKKyAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGUudG9TdHJpbmcoKTsKKyAgICB0aGlzLnBhdHRlcm4gID0gcGF0dGVybiB8fCBUZW1wbGF0ZS5QYXR0ZXJuOworICB9LAorCisgIGV2YWx1YXRlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIHZhciBiZWZvcmUgPSBtYXRjaFsxXTsKKyAgICAgIGlmIChiZWZvcmUgPT0gJ1xcJykgcmV0dXJuIG1hdGNoWzJdOworICAgICAgcmV0dXJuIGJlZm9yZSArIFN0cmluZy5pbnRlcnByZXQob2JqZWN0W21hdGNoWzNdXSk7CisgICAgfSk7CisgIH0KK30KKwordmFyICRicmVhayAgICA9IG5ldyBPYmplY3QoKTsKK3ZhciAkY29udGludWUgPSBuZXcgT2JqZWN0KCk7CisKK3ZhciBFbnVtZXJhYmxlID0geworICBlYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHZhciBpbmRleCA9IDA7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuX2VhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpdGVyYXRvcih2YWx1ZSwgaW5kZXgrKyk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICBpZiAoZSAhPSAkY29udGludWUpIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlICE9ICRicmVhaykgdGhyb3cgZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgZWFjaFNsaWNlOiBmdW5jdGlvbihudW1iZXIsIGl0ZXJhdG9yKSB7CisgICAgdmFyIGluZGV4ID0gLW51bWJlciwgc2xpY2VzID0gW10sIGFycmF5ID0gdGhpcy50b0FycmF5KCk7CisgICAgd2hpbGUgKChpbmRleCArPSBudW1iZXIpIDwgYXJyYXkubGVuZ3RoKQorICAgICAgc2xpY2VzLnB1c2goYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4K251bWJlcikpOworICAgIHJldHVybiBzbGljZXMubWFwKGl0ZXJhdG9yKTsKKyAgfSwKKworICBhbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdmFyIHJlc3VsdCA9IHRydWU7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmICEhKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKCFyZXN1bHQpIHRocm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGFueTogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB2YXIgcmVzdWx0ID0gZmFsc2U7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKHJlc3VsdCA9ICEhKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpKQorICAgICAgICB0aHJvdyAkYnJlYWs7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICBjb2xsZWN0OiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmVzdWx0cy5wdXNoKChpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgZGV0ZWN0OiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKGl0ZXJhdG9yKHZhbHVlLCBpbmRleCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIHRocm93ICRicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGZpbmRBbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoaXRlcmF0b3IodmFsdWUsIGluZGV4KSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBncmVwOiBmdW5jdGlvbihwYXR0ZXJuLCBpdGVyYXRvcikgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgdmFyIHN0cmluZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgIGlmIChzdHJpbmdWYWx1ZS5tYXRjaChwYXR0ZXJuKSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKChpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KSk7CisgICAgfSkKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBpbmNsdWRlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIGlmICh2YWx1ZSA9PSBvYmplY3QpIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB0aHJvdyAkYnJlYWs7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGZvdW5kOworICB9LAorCisgIGluR3JvdXBzT2Y6IGZ1bmN0aW9uKG51bWJlciwgZmlsbFdpdGgpIHsKKyAgICBmaWxsV2l0aCA9IGZpbGxXaXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogZmlsbFdpdGg7CisgICAgcmV0dXJuIHRoaXMuZWFjaFNsaWNlKG51bWJlciwgZnVuY3Rpb24oc2xpY2UpIHsKKyAgICAgIHdoaWxlKHNsaWNlLmxlbmd0aCA8IG51bWJlcikgc2xpY2UucHVzaChmaWxsV2l0aCk7CisgICAgICByZXR1cm4gc2xpY2U7CisgICAgfSk7CisgIH0sCisKKyAgaW5qZWN0OiBmdW5jdGlvbihtZW1vLCBpdGVyYXRvcikgeworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB2YWx1ZSwgaW5kZXgpOworICAgIH0pOworICAgIHJldHVybiBtZW1vOworICB9LAorCisgIGludm9rZTogZnVuY3Rpb24obWV0aG9kKSB7CisgICAgdmFyIGFyZ3MgPSAkQShhcmd1bWVudHMpLnNsaWNlKDEpOworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlW21ldGhvZF0uYXBwbHkodmFsdWUsIGFyZ3MpOworICAgIH0pOworICB9LAorCisgIG1heDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB2YXIgcmVzdWx0OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHZhbHVlID0gKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKHJlc3VsdCA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPj0gcmVzdWx0KQorICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIG1pbjogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB2YXIgcmVzdWx0OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHZhbHVlID0gKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKHJlc3VsdCA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPCByZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgcGFydGl0aW9uOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHZhciB0cnVlcyA9IFtdLCBmYWxzZXMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICAoKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpID8KKyAgICAgICAgdHJ1ZXMgOiBmYWxzZXMpLnB1c2godmFsdWUpOworICAgIH0pOworICAgIHJldHVybiBbdHJ1ZXMsIGZhbHNlc107CisgIH0sCisKKyAgcGx1Y2s6IGZ1bmN0aW9uKHByb3BlcnR5KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICByZXN1bHRzLnB1c2godmFsdWVbcHJvcGVydHldKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICByZWplY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoIWl0ZXJhdG9yKHZhbHVlLCBpbmRleCkpCisgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgc29ydEJ5OiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiB7dmFsdWU6IHZhbHVlLCBjcml0ZXJpYTogaXRlcmF0b3IodmFsdWUsIGluZGV4KX07CisgICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkgeworICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CisgICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7CisgICAgfSkucGx1Y2soJ3ZhbHVlJyk7CisgIH0sCisKKyAgdG9BcnJheTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubWFwKCk7CisgIH0sCisKKyAgemlwOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgaXRlcmF0b3IgPSBQcm90b3R5cGUuSywgYXJncyA9ICRBKGFyZ3VtZW50cyk7CisgICAgaWYgKHR5cGVvZiBhcmdzLmxhc3QoKSA9PSAnZnVuY3Rpb24nKQorICAgICAgaXRlcmF0b3IgPSBhcmdzLnBvcCgpOworCisgICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEpOworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcihjb2xsZWN0aW9ucy5wbHVjayhpbmRleCkpOworICAgIH0pOworICB9LAorCisgIHNpemU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg7CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICcjPEVudW1lcmFibGU6JyArIHRoaXMudG9BcnJheSgpLmluc3BlY3QoKSArICc+JzsKKyAgfQorfQorCitPYmplY3QuZXh0ZW5kKEVudW1lcmFibGUsIHsKKyAgbWFwOiAgICAgRW51bWVyYWJsZS5jb2xsZWN0LAorICBmaW5kOiAgICBFbnVtZXJhYmxlLmRldGVjdCwKKyAgc2VsZWN0OiAgRW51bWVyYWJsZS5maW5kQWxsLAorICBtZW1iZXI6ICBFbnVtZXJhYmxlLmluY2x1ZGUsCisgIGVudHJpZXM6IEVudW1lcmFibGUudG9BcnJheQorfSk7Cit2YXIgJEEgPSBBcnJheS5mcm9tID0gZnVuY3Rpb24oaXRlcmFibGUpIHsKKyAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtdOworICBpZiAoaXRlcmFibGUudG9BcnJheSkgeworICAgIHJldHVybiBpdGVyYWJsZS50b0FycmF5KCk7CisgIH0gZWxzZSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICByZXN1bHRzLnB1c2goaXRlcmFibGVbaV0pOworICAgIHJldHVybiByZXN1bHRzOworICB9Cit9CisKK09iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsKKworaWYgKCFBcnJheS5wcm90b3R5cGUuX3JldmVyc2UpCisgIEFycmF5LnByb3RvdHlwZS5fcmV2ZXJzZSA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlOworCitPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSwgeworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIGl0ZXJhdG9yKHRoaXNbaV0pOworICB9LAorCisgIGNsZWFyOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmxlbmd0aCA9IDA7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgZmlyc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzWzBdOworICB9LAorCisgIGxhc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV07CisgIH0sCisKKyAgY29tcGFjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbDsKKyAgICB9KTsKKyAgfSwKKworICBmbGF0dGVuOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgeworICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdCh2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSA/CisgICAgICAgIHZhbHVlLmZsYXR0ZW4oKSA6IFt2YWx1ZV0pOworICAgIH0pOworICB9LAorCisgIHdpdGhvdXQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciB2YWx1ZXMgPSAkQShhcmd1bWVudHMpOworICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuICF2YWx1ZXMuaW5jbHVkZSh2YWx1ZSk7CisgICAgfSk7CisgIH0sCisKKyAgaW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBpZiAodGhpc1tpXSA9PSBvYmplY3QpIHJldHVybiBpOworICAgIHJldHVybiAtMTsKKyAgfSwKKworICByZXZlcnNlOiBmdW5jdGlvbihpbmxpbmUpIHsKKyAgICByZXR1cm4gKGlubGluZSAhPT0gZmFsc2UgPyB0aGlzIDogdGhpcy50b0FycmF5KCkpLl9yZXZlcnNlKCk7CisgIH0sCisKKyAgcmVkdWNlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAxID8gdGhpcyA6IHRoaXNbMF07CisgIH0sCisKKyAgdW5pcTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBhcnJheS5pbmNsdWRlKHZhbHVlKSA/IGFycmF5IDogYXJyYXkuY29uY2F0KFt2YWx1ZV0pOworICAgIH0pOworICB9LAorCisgIGNsb25lOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gW10uY29uY2F0KHRoaXMpOworICB9LAorCisgIHNpemU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gJ1snICsgdGhpcy5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJywgJykgKyAnXSc7CisgIH0KK30pOworCitBcnJheS5wcm90b3R5cGUudG9BcnJheSA9IEFycmF5LnByb3RvdHlwZS5jbG9uZTsKKworZnVuY3Rpb24gJHcoc3RyaW5nKXsKKyAgc3RyaW5nID0gc3RyaW5nLnN0cmlwKCk7CisgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcuc3BsaXQoL1xzKy8pIDogW107Cit9CisKK2lmKHdpbmRvdy5vcGVyYSl7CisgIEFycmF5LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbigpeworICAgIHZhciBhcnJheSA9IFtdOworICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5LnB1c2godGhpc1tpXSk7CisgICAgZm9yKHZhciBpID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBpZihhcmd1bWVudHNbaV0uY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKKyAgICAgICAgZm9yKHZhciBqID0gMCwgYXJyYXlMZW5ndGggPSBhcmd1bWVudHNbaV0ubGVuZ3RoOyBqIDwgYXJyYXlMZW5ndGg7IGorKykKKyAgICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXVtqXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBhcnJheTsKKyAgfQorfQordmFyIEhhc2ggPSBmdW5jdGlvbihvYmopIHsKKyAgT2JqZWN0LmV4dGVuZCh0aGlzLCBvYmogfHwge30pOworfTsKKworT2JqZWN0LmV4dGVuZChIYXNoLCB7CisgIHRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKG9iaikgeworICAgIHZhciBwYXJ0cyA9IFtdOworCisJICB0aGlzLnByb3RvdHlwZS5fZWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24ocGFpcikgeworICAgICAgaWYgKCFwYWlyLmtleSkgcmV0dXJuOworCisgICAgICBpZiAocGFpci52YWx1ZSAmJiBwYWlyLnZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CisgICAgICAgIHZhciB2YWx1ZXMgPSBwYWlyLnZhbHVlLmNvbXBhY3QoKTsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPCAyKSBwYWlyLnZhbHVlID0gdmFsdWVzLnJlZHVjZSgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgCWtleSA9IGVuY29kZVVSSUNvbXBvbmVudChwYWlyLmtleSk7CisgICAgICAgICAgdmFsdWVzLmVhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gdW5kZWZpbmVkID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6ICcnOworICAgICAgICAgICAgcGFydHMucHVzaChrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwYWlyLnZhbHVlID09IHVuZGVmaW5lZCkgcGFpclsxXSA9ICcnOworICAgICAgcGFydHMucHVzaChwYWlyLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJz0nKSk7CisJICB9KTsKKworICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7CisgIH0KK30pOworCitPYmplY3QuZXh0ZW5kKEhhc2gucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsKK09iamVjdC5leHRlbmQoSGFzaC5wcm90b3R5cGUsIHsKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgZm9yICh2YXIga2V5IGluIHRoaXMpIHsKKyAgICAgIHZhciB2YWx1ZSA9IHRoaXNba2V5XTsKKyAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA9PSBIYXNoLnByb3RvdHlwZVtrZXldKSBjb250aW51ZTsKKworICAgICAgdmFyIHBhaXIgPSBba2V5LCB2YWx1ZV07CisgICAgICBwYWlyLmtleSA9IGtleTsKKyAgICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGl0ZXJhdG9yKHBhaXIpOworICAgIH0KKyAgfSwKKworICBrZXlzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5wbHVjaygna2V5Jyk7CisgIH0sCisKKyAgdmFsdWVzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5wbHVjaygndmFsdWUnKTsKKyAgfSwKKworICBtZXJnZTogZnVuY3Rpb24oaGFzaCkgeworICAgIHJldHVybiAkSChoYXNoKS5pbmplY3QodGhpcywgZnVuY3Rpb24obWVyZ2VkSGFzaCwgcGFpcikgeworICAgICAgbWVyZ2VkSGFzaFtwYWlyLmtleV0gPSBwYWlyLnZhbHVlOworICAgICAgcmV0dXJuIG1lcmdlZEhhc2g7CisgICAgfSk7CisgIH0sCisKKyAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmVzdWx0OworICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgdmFyIHZhbHVlID0gdGhpc1thcmd1bWVudHNbaV1dOworICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpeworICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHJlc3VsdCA9IHZhbHVlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAocmVzdWx0LmNvbnN0cnVjdG9yICE9IEFycmF5KSByZXN1bHQgPSBbcmVzdWx0XTsKKyAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVsZXRlIHRoaXNbYXJndW1lbnRzW2ldXTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICB0b1F1ZXJ5U3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gSGFzaC50b1F1ZXJ5U3RyaW5nKHRoaXMpOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAnIzxIYXNoOnsnICsgdGhpcy5tYXAoZnVuY3Rpb24ocGFpcikgeworICAgICAgcmV0dXJuIHBhaXIubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCc6ICcpOworICAgIH0pLmpvaW4oJywgJykgKyAnfT4nOworICB9Cit9KTsKKworZnVuY3Rpb24gJEgob2JqZWN0KSB7CisgIGlmIChvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09IEhhc2gpIHJldHVybiBvYmplY3Q7CisgIHJldHVybiBuZXcgSGFzaChvYmplY3QpOworfTsKK09iamVjdFJhbmdlID0gQ2xhc3MuY3JlYXRlKCk7CitPYmplY3QuZXh0ZW5kKE9iamVjdFJhbmdlLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7CitPYmplY3QuZXh0ZW5kKE9iamVjdFJhbmdlLnByb3RvdHlwZSwgeworICBpbml0aWFsaXplOiBmdW5jdGlvbihzdGFydCwgZW5kLCBleGNsdXNpdmUpIHsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgICAgdGhpcy5leGNsdXNpdmUgPSBleGNsdXNpdmU7CisgIH0sCisKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5zdGFydDsKKyAgICB3aGlsZSAodGhpcy5pbmNsdWRlKHZhbHVlKSkgeworICAgICAgaXRlcmF0b3IodmFsdWUpOworICAgICAgdmFsdWUgPSB2YWx1ZS5zdWNjKCk7CisgICAgfQorICB9LAorCisgIGluY2x1ZGU6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgaWYgKHZhbHVlIDwgdGhpcy5zdGFydCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhpcy5leGNsdXNpdmUpCisgICAgICByZXR1cm4gdmFsdWUgPCB0aGlzLmVuZDsKKyAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy5lbmQ7CisgIH0KK30pOworCit2YXIgJFIgPSBmdW5jdGlvbihzdGFydCwgZW5kLCBleGNsdXNpdmUpIHsKKyAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShzdGFydCwgZW5kLCBleGNsdXNpdmUpOworfQorCit2YXIgQWpheCA9IHsKKyAgZ2V0VHJhbnNwb3J0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gVHJ5LnRoZXNlKAorICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfSwKKyAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKX0sCisgICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9CisgICAgKSB8fCBmYWxzZTsKKyAgfSwKKworICBhY3RpdmVSZXF1ZXN0Q291bnQ6IDAKK30KKworQWpheC5SZXNwb25kZXJzID0geworICByZXNwb25kZXJzOiBbXSwKKworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLnJlc3BvbmRlcnMuX2VhY2goaXRlcmF0b3IpOworICB9LAorCisgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAgICBpZiAoIXRoaXMuaW5jbHVkZShyZXNwb25kZXIpKQorICAgICAgdGhpcy5yZXNwb25kZXJzLnB1c2gocmVzcG9uZGVyKTsKKyAgfSwKKworICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAgICB0aGlzLnJlc3BvbmRlcnMgPSB0aGlzLnJlc3BvbmRlcnMud2l0aG91dChyZXNwb25kZXIpOworICB9LAorCisgIGRpc3BhdGNoOiBmdW5jdGlvbihjYWxsYmFjaywgcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uKSB7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAgICAgaWYgKHR5cGVvZiByZXNwb25kZXJbY2FsbGJhY2tdID09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXNwb25kZXJbY2FsbGJhY2tdLmFwcGx5KHJlc3BvbmRlciwgW3JlcXVlc3QsIHRyYW5zcG9ydCwganNvbl0pOworICAgICAgICB9IGNhdGNoIChlKSB7fQorICAgICAgfQorICAgIH0pOworICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycywgRW51bWVyYWJsZSk7CisKK0FqYXguUmVzcG9uZGVycy5yZWdpc3Rlcih7CisgIG9uQ3JlYXRlOiBmdW5jdGlvbigpIHsKKyAgICBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudCsrOworICB9LAorICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHsKKyAgICBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudC0tOworICB9Cit9KTsKKworQWpheC5CYXNlID0gZnVuY3Rpb24oKSB7fTsKK0FqYXguQmFzZS5wcm90b3R5cGUgPSB7CisgIHNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICB0aGlzLm9wdGlvbnMgPSB7CisgICAgICBtZXRob2Q6ICAgICAgICdwb3N0JywKKyAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSwKKyAgICAgIGNvbnRlbnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCisgICAgICBlbmNvZGluZzogICAgICdVVEYtOCcsCisgICAgICBwYXJhbWV0ZXJzOiAgICcnCisgICAgfQorICAgIE9iamVjdC5leHRlbmQodGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsKKworICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCk7CisgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyA9PSAnc3RyaW5nJykKKyAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9RdWVyeVBhcmFtcygpOworICB9Cit9CisKK0FqYXguUmVxdWVzdCA9IENsYXNzLmNyZWF0ZSgpOworQWpheC5SZXF1ZXN0LkV2ZW50cyA9CisgIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0ZSddOworCitBamF4LlJlcXVlc3QucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWpheC5CYXNlKCksIHsKKyAgX2NvbXBsZXRlOiBmYWxzZSwKKworICBpbml0aWFsaXplOiBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IEFqYXguZ2V0VHJhbnNwb3J0KCk7CisgICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOworICAgIHRoaXMucmVxdWVzdCh1cmwpOworICB9LAorCisgIHJlcXVlc3Q6IGZ1bmN0aW9uKHVybCkgeworICAgIHRoaXMudXJsID0gdXJsOworICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZDsKKyAgICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnM7CisKKyAgICBpZiAoIVsnZ2V0JywgJ3Bvc3QnXS5pbmNsdWRlKHRoaXMubWV0aG9kKSkgeworICAgICAgLy8gc2ltdWxhdGUgb3RoZXIgdmVyYnMgb3ZlciBwb3N0CisgICAgICBwYXJhbXNbJ19tZXRob2QnXSA9IHRoaXMubWV0aG9kOworICAgICAgdGhpcy5tZXRob2QgPSAncG9zdCc7CisgICAgfQorCisgICAgcGFyYW1zID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcyAmJiAvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgcGFyYW1zICs9ICcmXz0nCisKKyAgICAvLyB3aGVuIEdFVCwgYXBwZW5kIHBhcmFtZXRlcnMgdG8gVVJMCisgICAgaWYgKHRoaXMubWV0aG9kID09ICdnZXQnICYmIHBhcmFtcykKKyAgICAgIHRoaXMudXJsICs9ICh0aGlzLnVybC5pbmRleE9mKCc/JykgPiAtMSA/ICcmJyA6ICc/JykgKyBwYXJhbXM7CisKKyAgICB0cnkgeworICAgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkNyZWF0ZScsIHRoaXMsIHRoaXMudHJhbnNwb3J0KTsKKworICAgICAgdGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aGlzLnVybCwKKyAgICAgICAgdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyk7CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKQorICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUoMSkgfS5iaW5kKHRoaXMpLCAxMCk7CisKKyAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpOworCisgICAgICB2YXIgYm9keSA9IHRoaXMubWV0aG9kID09ICdwb3N0JyA/ICh0aGlzLm9wdGlvbnMucG9zdEJvZHkgfHwgcGFyYW1zKSA6IG51bGw7CisKKyAgICAgIHRoaXMudHJhbnNwb3J0LnNlbmQoYm9keSk7CisKKyAgICAgIC8qIEZvcmNlIEZpcmVmb3ggdG8gaGFuZGxlIHJlYWR5IHN0YXRlIDQgZm9yIHN5bmNocm9ub3VzIHJlcXVlc3RzICovCisgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMgJiYgdGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSkKKyAgICAgICAgdGhpcy5vblN0YXRlQ2hhbmdlKCk7CisKKyAgICB9CisgICAgY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9LAorCisgIG9uU3RhdGVDaGFuZ2U6IGZ1bmN0aW9uKCkgeworICAgIHZhciByZWFkeVN0YXRlID0gdGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZTsKKyAgICBpZiAocmVhZHlTdGF0ZSA+IDEgJiYgISgocmVhZHlTdGF0ZSA9PSA0KSAmJiB0aGlzLl9jb21wbGV0ZSkpCisgICAgICB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZSk7CisgIH0sCisKKyAgc2V0UmVxdWVzdEhlYWRlcnM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBoZWFkZXJzID0geworICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLAorICAgICAgJ1gtUHJvdG90eXBlLVZlcnNpb24nOiBQcm90b3R5cGUuVmVyc2lvbiwKKyAgICAgICdBY2NlcHQnOiAndGV4dC9qYXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKicKKyAgICB9OworCisgICAgaWYgKHRoaXMubWV0aG9kID09ICdwb3N0JykgeworICAgICAgaGVhZGVyc1snQ29udGVudC10eXBlJ10gPSB0aGlzLm9wdGlvbnMuY29udGVudFR5cGUgKworICAgICAgICAodGhpcy5vcHRpb25zLmVuY29kaW5nID8gJzsgY2hhcnNldD0nICsgdGhpcy5vcHRpb25zLmVuY29kaW5nIDogJycpOworCisgICAgICAvKiBGb3JjZSAiQ29ubmVjdGlvbjogY2xvc2UiIGZvciBvbGRlciBNb3ppbGxhIGJyb3dzZXJzIHRvIHdvcmsKKyAgICAgICAqIGFyb3VuZCBhIGJ1ZyB3aGVyZSBYTUxIdHRwUmVxdWVzdCBzZW5kcyBhbiBpbmNvcnJlY3QKKyAgICAgICAqIENvbnRlbnQtbGVuZ3RoIGhlYWRlci4gU2VlIE1vemlsbGEgQnVnemlsbGEgIzI0NjY1MS4KKyAgICAgICAqLworICAgICAgaWYgKHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUgJiYKKyAgICAgICAgICAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvR2Vja29cLyhcZHs0fSkvKSB8fCBbMCwyMDA1XSlbMV0gPCAyMDA1KQorICAgICAgICAgICAgaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2Nsb3NlJzsKKyAgICB9CisKKyAgICAvLyB1c2VyLWRlZmluZWQgaGVhZGVycworICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnJlcXVlc3RIZWFkZXJzID09ICdvYmplY3QnKSB7CisgICAgICB2YXIgZXh0cmFzID0gdGhpcy5vcHRpb25zLnJlcXVlc3RIZWFkZXJzOworCisgICAgICBpZiAodHlwZW9mIGV4dHJhcy5wdXNoID09ICdmdW5jdGlvbicpCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBleHRyYXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDIpCisgICAgICAgICAgaGVhZGVyc1tleHRyYXNbaV1dID0gZXh0cmFzW2krMV07CisgICAgICBlbHNlCisgICAgICAgICRIKGV4dHJhcykuZWFjaChmdW5jdGlvbihwYWlyKSB7IGhlYWRlcnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpCisgICAgICB0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pOworICB9LAorCisgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAhdGhpcy50cmFuc3BvcnQuc3RhdHVzCisgICAgICAgIHx8ICh0aGlzLnRyYW5zcG9ydC5zdGF0dXMgPj0gMjAwICYmIHRoaXMudHJhbnNwb3J0LnN0YXR1cyA8IDMwMCk7CisgIH0sCisKKyAgcmVzcG9uZFRvUmVhZHlTdGF0ZTogZnVuY3Rpb24ocmVhZHlTdGF0ZSkgeworICAgIHZhciBzdGF0ZSA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVhZHlTdGF0ZV07CisgICAgdmFyIHRyYW5zcG9ydCA9IHRoaXMudHJhbnNwb3J0LCBqc29uID0gdGhpcy5ldmFsSlNPTigpOworCisgICAgaWYgKHN0YXRlID09ICdDb21wbGV0ZScpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgdGhpcy50cmFuc3BvcnQuc3RhdHVzXQorICAgICAgICAgfHwgdGhpcy5vcHRpb25zWydvbicgKyAodGhpcy5zdWNjZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScpXQorICAgICAgICAgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHRyYW5zcG9ydCwganNvbik7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgICB9CisKKyAgICAgIGlmICgodGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpIHx8ICd0ZXh0L2phdmFzY3JpcHQnKS5zdHJpcCgpLgorICAgICAgICBtYXRjaCgvXih0ZXh0fGFwcGxpY2F0aW9uKVwvKHgtKT8oamF2YXxlY21hKXNjcmlwdCg7LiopPyQvaSkpCisgICAgICAgICAgdGhpcy5ldmFsUmVzcG9uc2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0cmFuc3BvcnQsIGpzb24pOworICAgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbicgKyBzdGF0ZSwgdGhpcywgdHJhbnNwb3J0LCBqc29uKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSAnQ29tcGxldGUnKSB7CisgICAgICAvLyBhdm9pZCBtZW1vcnkgbGVhayBpbiBNU0lFOiBjbGVhbiB1cAorICAgICAgdGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgfQorICB9LAorCisgIGdldEhlYWRlcjogZnVuY3Rpb24obmFtZSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZXZhbEpTT046IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICB2YXIganNvbiA9IHRoaXMuZ2V0SGVhZGVyKCdYLUpTT04nKTsKKyAgICAgIHJldHVybiBqc29uID8gZXZhbCgnKCcgKyBqc29uICsgJyknKSA6IG51bGw7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGV2YWwodGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwKKworICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7CisgICAgKHRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbiB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikodGhpcywgZXhjZXB0aW9uKTsKKyAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uRXhjZXB0aW9uJywgdGhpcywgZXhjZXB0aW9uKTsKKyAgfQorfSk7CisKK0FqYXguVXBkYXRlciA9IENsYXNzLmNyZWF0ZSgpOworCitPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoQWpheC5VcGRhdGVyLnByb3RvdHlwZSwgQWpheC5SZXF1ZXN0LnByb3RvdHlwZSksIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLmNvbnRhaW5lciA9IHsKKyAgICAgIHN1Y2Nlc3M6IChjb250YWluZXIuc3VjY2VzcyB8fCBjb250YWluZXIpLAorICAgICAgZmFpbHVyZTogKGNvbnRhaW5lci5mYWlsdXJlIHx8IChjb250YWluZXIuc3VjY2VzcyA/IG51bGwgOiBjb250YWluZXIpKQorICAgIH0KKworICAgIHRoaXMudHJhbnNwb3J0ID0gQWpheC5nZXRUcmFuc3BvcnQoKTsKKyAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CisKKyAgICB2YXIgb25Db21wbGV0ZSA9IHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9uKHRyYW5zcG9ydCwgcGFyYW0pIHsKKyAgICAgIHRoaXMudXBkYXRlQ29udGVudCgpOworICAgICAgb25Db21wbGV0ZSh0cmFuc3BvcnQsIHBhcmFtKTsKKyAgICB9KS5iaW5kKHRoaXMpOworCisgICAgdGhpcy5yZXF1ZXN0KHVybCk7CisgIH0sCisKKyAgdXBkYXRlQ29udGVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlY2VpdmVyID0gdGhpcy5jb250YWluZXJbdGhpcy5zdWNjZXNzKCkgPyAnc3VjY2VzcycgOiAnZmFpbHVyZSddOworICAgIHZhciByZXNwb25zZSA9IHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dDsKKworICAgIGlmICghdGhpcy5vcHRpb25zLmV2YWxTY3JpcHRzKSByZXNwb25zZSA9IHJlc3BvbnNlLnN0cmlwU2NyaXB0cygpOworCisgICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZlcikpIHsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5zZXJ0aW9uKQorICAgICAgICBuZXcgdGhpcy5vcHRpb25zLmluc2VydGlvbihyZWNlaXZlciwgcmVzcG9uc2UpOworICAgICAgZWxzZQorICAgICAgICByZWNlaXZlci51cGRhdGUocmVzcG9uc2UpOworICAgIH0KKworICAgIGlmICh0aGlzLnN1Y2Nlc3MoKSkgeworICAgICAgaWYgKHRoaXMub25Db21wbGV0ZSkKKyAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uQ29tcGxldGUuYmluZCh0aGlzKSwgMTApOworICAgIH0KKyAgfQorfSk7CisKK0FqYXguUGVyaW9kaWNhbFVwZGF0ZXIgPSBDbGFzcy5jcmVhdGUoKTsKK0FqYXguUGVyaW9kaWNhbFVwZGF0ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWpheC5CYXNlKCksIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CisgICAgdGhpcy5vbkNvbXBsZXRlID0gdGhpcy5vcHRpb25zLm9uQ29tcGxldGU7CisKKyAgICB0aGlzLmZyZXF1ZW5jeSA9ICh0aGlzLm9wdGlvbnMuZnJlcXVlbmN5IHx8IDIpOworICAgIHRoaXMuZGVjYXkgPSAodGhpcy5vcHRpb25zLmRlY2F5IHx8IDEpOworCisgICAgdGhpcy51cGRhdGVyID0ge307CisgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy51cmwgPSB1cmw7CisKKyAgICB0aGlzLnN0YXJ0KCk7CisgIH0sCisKKyAgc3RhcnQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpOworICAgIHRoaXMub25UaW1lckV2ZW50KCk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy51cGRhdGVyLm9wdGlvbnMub25Db21wbGV0ZSA9IHVuZGVmaW5lZDsKKyAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7CisgICAgKHRoaXMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfSwKKworICB1cGRhdGVDb21wbGV0ZTogZnVuY3Rpb24ocmVxdWVzdCkgeworICAgIGlmICh0aGlzLm9wdGlvbnMuZGVjYXkpIHsKKyAgICAgIHRoaXMuZGVjYXkgPSAocmVxdWVzdC5yZXNwb25zZVRleHQgPT0gdGhpcy5sYXN0VGV4dCA/CisgICAgICAgIHRoaXMuZGVjYXkgKiB0aGlzLm9wdGlvbnMuZGVjYXkgOiAxKTsKKworICAgICAgdGhpcy5sYXN0VGV4dCA9IHJlcXVlc3QucmVzcG9uc2VUZXh0OworICAgIH0KKyAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLAorICAgICAgdGhpcy5kZWNheSAqIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7CisgIH0sCisKKyAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnVwZGF0ZXIgPSBuZXcgQWpheC5VcGRhdGVyKHRoaXMuY29udGFpbmVyLCB0aGlzLnVybCwgdGhpcy5vcHRpb25zKTsKKyAgfQorfSk7CitmdW5jdGlvbiAkKGVsZW1lbnQpIHsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGVsZW1lbnRzID0gW10sIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIGVsZW1lbnRzLnB1c2goJChhcmd1bWVudHNbaV0pKTsKKyAgICByZXR1cm4gZWxlbWVudHM7CisgIH0KKyAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKQorICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsKKyAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOworfQorCitpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCkgeworICBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoID0gZnVuY3Rpb24oZXhwcmVzc2lvbiwgcGFyZW50RWxlbWVudCkgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZXZhbHVhdGUoZXhwcmVzc2lvbiwgJChwYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudCwKKyAgICAgIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcXVlcnkuc25hcHNob3RMZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIHJlc3VsdHMucHVzaChxdWVyeS5zbmFwc2hvdEl0ZW0oaSkpOworICAgIHJldHVybiByZXN1bHRzOworICB9OworfQorCitkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBwYXJlbnRFbGVtZW50KSB7CisgIGlmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoKSB7CisgICAgdmFyIHEgPSAiLi8vKltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgIiArIGNsYXNzTmFtZSArICIgJyldIjsKKyAgICByZXR1cm4gZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aChxLCBwYXJlbnRFbGVtZW50KTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgY2hpbGRyZW4gPSAoJChwYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudC5ib2R5KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOworICAgIHZhciBlbGVtZW50cyA9IFtdLCBjaGlsZDsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07CisgICAgICBpZiAoRWxlbWVudC5oYXNDbGFzc05hbWUoY2hpbGQsIGNsYXNzTmFtZSkpCisgICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaWYgKCF3aW5kb3cuRWxlbWVudCkKKyAgdmFyIEVsZW1lbnQgPSBuZXcgT2JqZWN0KCk7CisKK0VsZW1lbnQuZXh0ZW5kID0gZnVuY3Rpb24oZWxlbWVudCkgeworICBpZiAoIWVsZW1lbnQgfHwgX25hdGl2ZUV4dGVuc2lvbnMgfHwgZWxlbWVudC5ub2RlVHlwZSA9PSAzKSByZXR1cm4gZWxlbWVudDsKKworICBpZiAoIWVsZW1lbnQuX2V4dGVuZGVkICYmIGVsZW1lbnQudGFnTmFtZSAmJiBlbGVtZW50ICE9IHdpbmRvdykgeworICAgIHZhciBtZXRob2RzID0gT2JqZWN0LmNsb25lKEVsZW1lbnQuTWV0aG9kcyksIGNhY2hlID0gRWxlbWVudC5leHRlbmQuY2FjaGU7CisKKyAgICBpZiAoZWxlbWVudC50YWdOYW1lID09ICdGT1JNJykKKyAgICAgIE9iamVjdC5leHRlbmQobWV0aG9kcywgRm9ybS5NZXRob2RzKTsKKyAgICBpZiAoWydJTlBVVCcsICdURVhUQVJFQScsICdTRUxFQ1QnXS5pbmNsdWRlKGVsZW1lbnQudGFnTmFtZSkpCisgICAgICBPYmplY3QuZXh0ZW5kKG1ldGhvZHMsIEZvcm0uRWxlbWVudC5NZXRob2RzKTsKKworICAgIE9iamVjdC5leHRlbmQobWV0aG9kcywgRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCk7CisKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7CisgICAgICB2YXIgdmFsdWUgPSBtZXRob2RzW3Byb3BlcnR5XTsKKyAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiAhKHByb3BlcnR5IGluIGVsZW1lbnQpKQorICAgICAgICBlbGVtZW50W3Byb3BlcnR5XSA9IGNhY2hlLmZpbmRPclN0b3JlKHZhbHVlKTsKKyAgICB9CisgIH0KKworICBlbGVtZW50Ll9leHRlbmRlZCA9IHRydWU7CisgIHJldHVybiBlbGVtZW50OworfTsKKworRWxlbWVudC5leHRlbmQuY2FjaGUgPSB7CisgIGZpbmRPclN0b3JlOiBmdW5jdGlvbih2YWx1ZSkgeworICAgIHJldHVybiB0aGlzW3ZhbHVlXSA9IHRoaXNbdmFsdWVdIHx8IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOworICAgIH0KKyAgfQorfTsKKworRWxlbWVudC5NZXRob2RzID0geworICB2aXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuc3R5bGUuZGlzcGxheSAhPSAnbm9uZSc7CisgIH0sCisKKyAgdG9nZ2xlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgRWxlbWVudFtFbGVtZW50LnZpc2libGUoZWxlbWVudCkgPyAnaGlkZScgOiAnc2hvdyddKGVsZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGhpZGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2hvdzogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICQoZWxlbWVudCkuc3R5bGUuZGlzcGxheSA9ICcnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKKyAgICBodG1sID0gdHlwZW9mIGh0bWwgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGh0bWwudG9TdHJpbmcoKTsKKyAgICAkKGVsZW1lbnQpLmlubmVySFRNTCA9IGh0bWwuc3RyaXBTY3JpcHRzKCk7CisgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtodG1sLmV2YWxTY3JpcHRzKCl9LCAxMCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmVwbGFjZTogZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGh0bWwgPSB0eXBlb2YgaHRtbCA9PSAndW5kZWZpbmVkJyA/ICcnIDogaHRtbC50b1N0cmluZygpOworICAgIGlmIChlbGVtZW50Lm91dGVySFRNTCkgeworICAgICAgZWxlbWVudC5vdXRlckhUTUwgPSBodG1sLnN0cmlwU2NyaXB0cygpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcmFuZ2UgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKKyAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoCisgICAgICAgIHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sLnN0cmlwU2NyaXB0cygpKSwgZWxlbWVudCk7CisgICAgfQorICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7aHRtbC5ldmFsU2NyaXB0cygpfSwgMTApOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcmVzdWx0ID0gJzwnICsgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgJEgoeydpZCc6ICdpZCcsICdjbGFzc05hbWUnOiAnY2xhc3MnfSkuZWFjaChmdW5jdGlvbihwYWlyKSB7CisgICAgICB2YXIgcHJvcGVydHkgPSBwYWlyLmZpcnN0KCksIGF0dHJpYnV0ZSA9IHBhaXIubGFzdCgpOworICAgICAgdmFyIHZhbHVlID0gKGVsZW1lbnRbcHJvcGVydHldIHx8ICcnKS50b1N0cmluZygpOworICAgICAgaWYgKHZhbHVlKSByZXN1bHQgKz0gJyAnICsgYXR0cmlidXRlICsgJz0nICsgdmFsdWUuaW5zcGVjdCh0cnVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0ICsgJz4nOworICB9LAorCisgIHJlY3Vyc2l2ZWx5Q29sbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHkpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXTsKKyAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnRbcHJvcGVydHldKQorICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gMSkKKyAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9LAorCisgIGFuY2VzdG9yczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVjdCgncGFyZW50Tm9kZScpOworICB9LAorCisgIGRlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICRBKCQoZWxlbWVudCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSk7CisgIH0sCisKKyAgaW1tZWRpYXRlRGVzY2VuZGFudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KS5maXJzdENoaWxkKSkgcmV0dXJuIFtdOworICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT0gMSkgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7CisgICAgaWYgKGVsZW1lbnQpIHJldHVybiBbZWxlbWVudF0uY29uY2F0KCQoZWxlbWVudCkubmV4dFNpYmxpbmdzKCkpOworICAgIHJldHVybiBbXTsKKyAgfSwKKworICBwcmV2aW91c1NpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0KCdwcmV2aW91c1NpYmxpbmcnKTsKKyAgfSwKKworICBuZXh0U2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ25leHRTaWJsaW5nJyk7CisgIH0sCisKKyAgc2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudC5wcmV2aW91c1NpYmxpbmdzKCkucmV2ZXJzZSgpLmNvbmNhdChlbGVtZW50Lm5leHRTaWJsaW5ncygpKTsKKyAgfSwKKworICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IpIHsKKyAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09ICdzdHJpbmcnKQorICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIHJldHVybiBzZWxlY3Rvci5tYXRjaCgkKGVsZW1lbnQpKTsKKyAgfSwKKworICB1cDogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICByZXR1cm4gU2VsZWN0b3IuZmluZEVsZW1lbnQoJChlbGVtZW50KS5hbmNlc3RvcnMoKSwgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisgIGRvd246IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRFbGVtZW50KCQoZWxlbWVudCkuZGVzY2VuZGFudHMoKSwgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisgIHByZXZpb3VzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIHJldHVybiBTZWxlY3Rvci5maW5kRWxlbWVudCgkKGVsZW1lbnQpLnByZXZpb3VzU2libGluZ3MoKSwgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisgIG5leHQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRFbGVtZW50KCQoZWxlbWVudCkubmV4dFNpYmxpbmdzKCksIGV4cHJlc3Npb24sIGluZGV4KTsKKyAgfSwKKworICBnZXRFbGVtZW50c0J5U2VsZWN0b3I6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKSwgZWxlbWVudCA9ICQoYXJncy5zaGlmdCgpKTsKKyAgICByZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZWxlbWVudCwgYXJncyk7CisgIH0sCisKKyAgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lLCBlbGVtZW50KTsKKyAgfSwKKworICByZWFkQXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGRvY3VtZW50LmFsbCAmJiAhd2luZG93Lm9wZXJhKSB7CisgICAgICB2YXIgdCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9uczsKKyAgICAgIGlmICh0LnZhbHVlc1tuYW1lXSkgcmV0dXJuIHQudmFsdWVzW25hbWVdKGVsZW1lbnQsIG5hbWUpOworICAgICAgaWYgKHQubmFtZXNbbmFtZV0pICBuYW1lID0gdC5uYW1lc1tuYW1lXTsKKyAgICAgIHZhciBhdHRyaWJ1dGUgPSBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV07CisgICAgICBpZihhdHRyaWJ1dGUpIHJldHVybiBhdHRyaWJ1dGUubm9kZVZhbHVlOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgIH0sCisKKyAgZ2V0SGVpZ2h0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0RGltZW5zaW9ucygpLmhlaWdodDsKKyAgfSwKKworICBnZXRXaWR0aDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS53aWR0aDsKKyAgfSwKKworICBjbGFzc05hbWVzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIG5ldyBFbGVtZW50LkNsYXNzTmFtZXMoZWxlbWVudCk7CisgIH0sCisKKyAgaGFzQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lOworICAgIGlmIChlbGVtZW50Q2xhc3NOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnRDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8CisgICAgICAgIGVsZW1lbnRDbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBjbGFzc05hbWUgKyAiKFxcc3wkKSIpKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICBhZGRDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAgIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KS5hZGQoY2xhc3NOYW1lKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAgIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KS5yZW1vdmUoY2xhc3NOYW1lKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB0b2dnbGVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAgIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KVtlbGVtZW50Lmhhc0NsYXNzTmFtZShjbGFzc05hbWUpID8gJ3JlbW92ZScgOiAnYWRkJ10oY2xhc3NOYW1lKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBvYnNlcnZlOiBmdW5jdGlvbigpIHsKKyAgICBFdmVudC5vYnNlcnZlLmFwcGx5KEV2ZW50LCBhcmd1bWVudHMpOworICAgIHJldHVybiAkQShhcmd1bWVudHMpLmZpcnN0KCk7CisgIH0sCisKKyAgc3RvcE9ic2VydmluZzogZnVuY3Rpb24oKSB7CisgICAgRXZlbnQuc3RvcE9ic2VydmluZy5hcHBseShFdmVudCwgYXJndW1lbnRzKTsKKyAgICByZXR1cm4gJEEoYXJndW1lbnRzKS5maXJzdCgpOworICB9LAorCisgIC8vIHJlbW92ZXMgd2hpdGVzcGFjZS1vbmx5IHRleHQgbm9kZSBjaGlsZHJlbgorICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIS9cUy8udGVzdChub2RlLm5vZGVWYWx1ZSkpCisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICBub2RlID0gbmV4dE5vZGU7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuaW5uZXJIVE1MLm1hdGNoKC9eXHMqJC8pOworICB9LAorCisgIGRlc2NlbmRhbnRPZjogZnVuY3Rpb24oZWxlbWVudCwgYW5jZXN0b3IpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KSwgYW5jZXN0b3IgPSAkKGFuY2VzdG9yKTsKKyAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkKKyAgICAgIGlmIChlbGVtZW50ID09IGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgc2Nyb2xsVG86IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcG9zID0gUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKyAgICB3aW5kb3cuc2Nyb2xsVG8ocG9zWzBdLCBwb3NbMV0pOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGdldFN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChbJ2Zsb2F0JywnY3NzRmxvYXQnXS5pbmNsdWRlKHN0eWxlKSkKKyAgICAgIHN0eWxlID0gKHR5cGVvZiBlbGVtZW50LnN0eWxlLnN0eWxlRmxvYXQgIT0gJ3VuZGVmaW5lZCcgPyAnc3R5bGVGbG9hdCcgOiAnY3NzRmxvYXQnKTsKKyAgICBzdHlsZSA9IHN0eWxlLmNhbWVsaXplKCk7CisgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHsKKyAgICAgICAgdmFyIGNzcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7CisgICAgICAgIHZhbHVlID0gY3NzID8gY3NzW3N0eWxlXSA6IG51bGw7CisgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY3VycmVudFN0eWxlKSB7CisgICAgICAgIHZhbHVlID0gZWxlbWVudC5jdXJyZW50U3R5bGVbc3R5bGVdOworICAgICAgfQorICAgIH0KKworICAgIGlmKCh2YWx1ZSA9PSAnYXV0bycpICYmIFsnd2lkdGgnLCdoZWlnaHQnXS5pbmNsdWRlKHN0eWxlKSAmJiAoZWxlbWVudC5nZXRTdHlsZSgnZGlzcGxheScpICE9ICdub25lJykpCisgICAgICB2YWx1ZSA9IGVsZW1lbnRbJ29mZnNldCcrc3R5bGUuY2FwaXRhbGl6ZSgpXSArICdweCc7CisKKyAgICBpZiAod2luZG93Lm9wZXJhICYmIFsnbGVmdCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJ10uaW5jbHVkZShzdHlsZSkpCisgICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgdmFsdWUgPSAnYXV0byc7CisgICAgaWYoc3R5bGUgPT0gJ29wYWNpdHknKSB7CisgICAgICBpZih2YWx1ZSkgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpOworICAgICAgaWYodmFsdWUgPSAoZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkKKyAgICAgICAgaWYodmFsdWVbMV0pIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlWzFdKSAvIDEwMDsKKyAgICAgIHJldHVybiAxLjA7CisgICAgfQorICAgIHJldHVybiB2YWx1ZSA9PSAnYXV0bycgPyBudWxsIDogdmFsdWU7CisgIH0sCisKKyAgc2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZm9yICh2YXIgbmFtZSBpbiBzdHlsZSkgeworICAgICAgdmFyIHZhbHVlID0gc3R5bGVbbmFtZV07CisgICAgICBpZihuYW1lID09ICdvcGFjaXR5JykgeworICAgICAgICBpZiAodmFsdWUgPT0gMSkgeworICAgICAgICAgIHZhbHVlID0gKC9HZWNrby8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJgorICAgICAgICAgICAgIS9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSA/IDAuOTk5OTk5IDogMS4wOworICAgICAgICAgIGlmKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cub3BlcmEpCisgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmZpbHRlciA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRlcicpLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwnJyk7CisgICAgICAgIH0gZWxzZSBpZih2YWx1ZSA9PT0gJycpIHsKKyAgICAgICAgICBpZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lm9wZXJhKQorICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5maWx0ZXIgPSBlbGVtZW50LmdldFN0eWxlKCdmaWx0ZXInKS5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksJycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmKHZhbHVlIDwgMC4wMDAwMSkgdmFsdWUgPSAwOworICAgICAgICAgIGlmKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cub3BlcmEpCisgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmZpbHRlciA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRlcicpLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwnJykgKworICAgICAgICAgICAgICAnYWxwaGEob3BhY2l0eT0nK3ZhbHVlKjEwMCsnKSc7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZihbJ2Zsb2F0JywnY3NzRmxvYXQnXS5pbmNsdWRlKG5hbWUpKSBuYW1lID0gKHR5cGVvZiBlbGVtZW50LnN0eWxlLnN0eWxlRmxvYXQgIT0gJ3VuZGVmaW5lZCcpID8gJ3N0eWxlRmxvYXQnIDogJ2Nzc0Zsb2F0JzsKKyAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZS5jYW1lbGl6ZSgpXSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBnZXREaW1lbnNpb25zOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGRpc3BsYXkgPSAkKGVsZW1lbnQpLmdldFN0eWxlKCdkaXNwbGF5Jyk7CisgICAgaWYgKGRpc3BsYXkgIT0gJ25vbmUnICYmIGRpc3BsYXkgIT0gbnVsbCkgLy8gU2FmYXJpIGJ1ZworICAgICAgcmV0dXJuIHt3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodH07CisKKyAgICAvLyBBbGwgKldpZHRoIGFuZCAqSGVpZ2h0IHByb3BlcnRpZXMgZ2l2ZSAwIG9uIGVsZW1lbnRzIHdpdGggZGlzcGxheSBub25lLAorICAgIC8vIHNvIGVuYWJsZSB0aGUgZWxlbWVudCB0ZW1wb3JhcmlseQorICAgIHZhciBlbHMgPSBlbGVtZW50LnN0eWxlOworICAgIHZhciBvcmlnaW5hbFZpc2liaWxpdHkgPSBlbHMudmlzaWJpbGl0eTsKKyAgICB2YXIgb3JpZ2luYWxQb3NpdGlvbiA9IGVscy5wb3NpdGlvbjsKKyAgICB2YXIgb3JpZ2luYWxEaXNwbGF5ID0gZWxzLmRpc3BsYXk7CisgICAgZWxzLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKyAgICBlbHMucG9zaXRpb24gPSAnYWJzb2x1dGUnOworICAgIGVscy5kaXNwbGF5ID0gJ2Jsb2NrJzsKKyAgICB2YXIgb3JpZ2luYWxXaWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFyIG9yaWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CisgICAgZWxzLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CisgICAgZWxzLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjsKKyAgICBlbHMudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTsKKyAgICByZXR1cm4ge3dpZHRoOiBvcmlnaW5hbFdpZHRoLCBoZWlnaHQ6IG9yaWdpbmFsSGVpZ2h0fTsKKyAgfSwKKworICBtYWtlUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBwb3MgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOworICAgIGlmIChwb3MgPT0gJ3N0YXRpYycgfHwgIXBvcykgeworICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB0cnVlOworICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisgICAgICAvLyBPcGVyYSByZXR1cm5zIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uaW5nIGNvbnRleHQsIHdoZW4gYW4KKyAgICAgIC8vIGVsZW1lbnQgaXMgcG9zaXRpb24gcmVsYXRpdmUgYnV0IHRvcCBhbmQgbGVmdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQKKyAgICAgIGlmICh3aW5kb3cub3BlcmEpIHsKKyAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSAwOworICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1bmRvUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgeworICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB1bmRlZmluZWQ7CisgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0KKyAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPQorICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPQorICAgICAgICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgbWFrZUNsaXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsKKyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgfHwgJ2F1dG8nOworICAgIGlmICgoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnb3ZlcmZsb3cnKSB8fCAndmlzaWJsZScpICE9ICdoaWRkZW4nKQorICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHVuZG9DbGlwcGluZzogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmICghZWxlbWVudC5fb3ZlcmZsb3cpIHJldHVybiBlbGVtZW50OworICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBlbGVtZW50Ll9vdmVyZmxvdyA9PSAnYXV0bycgPyAnJyA6IGVsZW1lbnQuX292ZXJmbG93OworICAgIGVsZW1lbnQuX292ZXJmbG93ID0gbnVsbDsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfQorfTsKKworT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMsIHtjaGlsZE9mOiBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mfSk7CisKK0VsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucyA9IHt9OworCitFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMubmFtZXMgPSB7CisgIGNvbHNwYW46ICAgImNvbFNwYW4iLAorICByb3dzcGFuOiAgICJyb3dTcGFuIiwKKyAgdmFsaWduOiAgICAidkFsaWduIiwKKyAgZGF0ZXRpbWU6ICAiZGF0ZVRpbWUiLAorICBhY2Nlc3NrZXk6ICJhY2Nlc3NLZXkiLAorICB0YWJpbmRleDogICJ0YWJJbmRleCIsCisgIGVuY3R5cGU6ICAgImVuY1R5cGUiLAorICBtYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorICByZWFkb25seTogICJyZWFkT25seSIsCisgIGxvbmdkZXNjOiAgImxvbmdEZXNjIgorfTsKKworRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnZhbHVlcyA9IHsKKyAgX2dldEF0dHI6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIDIpOworICB9LAorCisgIF9mbGFnOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSA/IGF0dHJpYnV0ZSA6IG51bGw7CisgIH0sCisKKyAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gZWxlbWVudC5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCk7CisgIH0sCisKKyAgdGl0bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndGl0bGUnKTsKKyAgICByZXR1cm4gbm9kZS5zcGVjaWZpZWQgPyBub2RlLm5vZGVWYWx1ZSA6IG51bGw7CisgIH0KK307CisKK09iamVjdC5leHRlbmQoRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnZhbHVlcywgeworICBocmVmOiBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMudmFsdWVzLl9nZXRBdHRyLAorICBzcmM6ICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMudmFsdWVzLl9nZXRBdHRyLAorICBkaXNhYmxlZDogRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnZhbHVlcy5fZmxhZywKKyAgY2hlY2tlZDogIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy52YWx1ZXMuX2ZsYWcsCisgIHJlYWRvbmx5OiBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMudmFsdWVzLl9mbGFnLAorICBtdWx0aXBsZTogRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnZhbHVlcy5fZmxhZworfSk7CisKK0VsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQgPSB7CisgIGhhc0F0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgdmFyIHQgPSBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnM7CisgICAgYXR0cmlidXRlID0gdC5uYW1lc1thdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKKyAgICByZXR1cm4gJChlbGVtZW50KS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZSkuc3BlY2lmaWVkOworICB9Cit9OworCisvLyBJRSBpcyBtaXNzaW5nIC5pbm5lckhUTUwgc3VwcG9ydCBmb3IgVEFCTEUtcmVsYXRlZCBlbGVtZW50cworaWYgKGRvY3VtZW50LmFsbCAmJiAhd2luZG93Lm9wZXJhKXsKKyAgRWxlbWVudC5NZXRob2RzLnVwZGF0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBodG1sID0gdHlwZW9mIGh0bWwgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGh0bWwudG9TdHJpbmcoKTsKKyAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgIGlmIChbJ1RIRUFEJywnVEJPRFknLCdUUicsJ1REJ10uaW5jbHVkZSh0YWdOYW1lKSkgeworICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgc3dpdGNoICh0YWdOYW1lKSB7CisgICAgICAgIGNhc2UgJ1RIRUFEJzoKKyAgICAgICAgY2FzZSAnVEJPRFknOgorICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHRhYmxlPjx0Ym9keT4nICsgIGh0bWwuc3RyaXBTY3JpcHRzKCkgKyAnPC90Ym9keT48L3RhYmxlPic7CisgICAgICAgICAgZGVwdGggPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdUUic6CisgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8dGFibGU+PHRib2R5Pjx0cj4nICsgIGh0bWwuc3RyaXBTY3JpcHRzKCkgKyAnPC90cj48L3Rib2R5PjwvdGFibGU+JzsKKyAgICAgICAgICBkZXB0aCA9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1REJzoKKyAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gJzx0YWJsZT48dGJvZHk+PHRyPjx0ZD4nICsgIGh0bWwuc3RyaXBTY3JpcHRzKCkgKyAnPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nOworICAgICAgICAgIGRlcHRoID0gNDsKKyAgICAgIH0KKyAgICAgICRBKGVsZW1lbnQuY2hpbGROb2RlcykuZWFjaChmdW5jdGlvbihub2RlKXsKKyAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKQorICAgICAgfSk7CisgICAgICBkZXB0aC50aW1lcyhmdW5jdGlvbigpeyBkaXYgPSBkaXYuZmlyc3RDaGlsZCB9KTsKKworICAgICAgJEEoZGl2LmNoaWxkTm9kZXMpLmVhY2goCisgICAgICAgIGZ1bmN0aW9uKG5vZGUpeyBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpIH0pOworICAgIH0gZWxzZSB7CisgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGh0bWwuc3RyaXBTY3JpcHRzKCk7CisgICAgfQorICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7aHRtbC5ldmFsU2NyaXB0cygpfSwgMTApOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQsIEVsZW1lbnQuTWV0aG9kcyk7CisKK3ZhciBfbmF0aXZlRXh0ZW5zaW9ucyA9IGZhbHNlOworCitpZigvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkKKyAgWycnLCAnRm9ybScsICdJbnB1dCcsICdUZXh0QXJlYScsICdTZWxlY3QnXS5lYWNoKGZ1bmN0aW9uKHRhZykgeworICAgIHZhciBjbGFzc05hbWUgPSAnSFRNTCcgKyB0YWcgKyAnRWxlbWVudCc7CisgICAgaWYod2luZG93W2NsYXNzTmFtZV0pIHJldHVybjsKKyAgICB2YXIga2xhc3MgPSB3aW5kb3dbY2xhc3NOYW1lXSA9IHt9OworICAgIGtsYXNzLnByb3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnID8gdGFnLnRvTG93ZXJDYXNlKCkgOiAnZGl2JykuX19wcm90b19fOworICB9KTsKKworRWxlbWVudC5hZGRNZXRob2RzID0gZnVuY3Rpb24obWV0aG9kcykgeworICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgbWV0aG9kcyB8fCB7fSk7CisKKyAgZnVuY3Rpb24gY29weShtZXRob2RzLCBkZXN0aW5hdGlvbiwgb25seUlmQWJzZW50KSB7CisgICAgb25seUlmQWJzZW50ID0gb25seUlmQWJzZW50IHx8IGZhbHNlOworICAgIHZhciBjYWNoZSA9IEVsZW1lbnQuZXh0ZW5kLmNhY2hlOworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG1ldGhvZHMpIHsKKyAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVydHldOworICAgICAgaWYgKCFvbmx5SWZBYnNlbnQgfHwgIShwcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbikpCisgICAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IGNhY2hlLmZpbmRPclN0b3JlKHZhbHVlKTsKKyAgICB9CisgIH0KKworICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9ICd1bmRlZmluZWQnKSB7CisgICAgY29weShFbGVtZW50Lk1ldGhvZHMsIEhUTUxFbGVtZW50LnByb3RvdHlwZSk7CisgICAgY29weShFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLCBIVE1MRWxlbWVudC5wcm90b3R5cGUsIHRydWUpOworICAgIGNvcHkoRm9ybS5NZXRob2RzLCBIVE1MRm9ybUVsZW1lbnQucHJvdG90eXBlKTsKKyAgICBbSFRNTElucHV0RWxlbWVudCwgSFRNTFRleHRBcmVhRWxlbWVudCwgSFRNTFNlbGVjdEVsZW1lbnRdLmVhY2goZnVuY3Rpb24oa2xhc3MpIHsKKyAgICAgIGNvcHkoRm9ybS5FbGVtZW50Lk1ldGhvZHMsIGtsYXNzLnByb3RvdHlwZSk7CisgICAgfSk7CisgICAgX25hdGl2ZUV4dGVuc2lvbnMgPSB0cnVlOworICB9Cit9CisKK3ZhciBUb2dnbGUgPSBuZXcgT2JqZWN0KCk7CitUb2dnbGUuZGlzcGxheSA9IEVsZW1lbnQudG9nZ2xlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3QuSW5zZXJ0aW9uID0gZnVuY3Rpb24oYWRqYWNlbmN5KSB7CisgIHRoaXMuYWRqYWNlbmN5ID0gYWRqYWNlbmN5OworfQorCitBYnN0cmFjdC5JbnNlcnRpb24ucHJvdG90eXBlID0geworICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOworCisgICAgaWYgKHRoaXMuYWRqYWNlbmN5ICYmIHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwodGhpcy5hZGphY2VuY3ksIHRoaXMuY29udGVudCk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIHZhciB0YWdOYW1lID0gdGhpcy5lbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKFsnVEJPRFknLCAnVFInXS5pbmNsdWRlKHRhZ05hbWUpKSB7CisgICAgICAgICAgdGhpcy5pbnNlcnRDb250ZW50KHRoaXMuY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOworICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVJhbmdlKSB0aGlzLmluaXRpYWxpemVSYW5nZSgpOworICAgICAgdGhpcy5pbnNlcnRDb250ZW50KFt0aGlzLnJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0aGlzLmNvbnRlbnQpXSk7CisgICAgfQorCisgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtjb250ZW50LmV2YWxTY3JpcHRzKCl9LCAxMCk7CisgIH0sCisKKyAgY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgIGRpdi5pbm5lckhUTUwgPSAnPHRhYmxlPjx0Ym9keT4nICsgdGhpcy5jb250ZW50ICsgJzwvdGJvZHk+PC90YWJsZT4nOworICAgIHJldHVybiAkQShkaXYuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpOworICB9Cit9CisKK3ZhciBJbnNlcnRpb24gPSBuZXcgT2JqZWN0KCk7CisKK0luc2VydGlvbi5CZWZvcmUgPSBDbGFzcy5jcmVhdGUoKTsKK0luc2VydGlvbi5CZWZvcmUucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuSW5zZXJ0aW9uKCdiZWZvcmVCZWdpbicpLCB7CisgIGluaXRpYWxpemVSYW5nZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5yYW5nZS5zZXRTdGFydEJlZm9yZSh0aGlzLmVsZW1lbnQpOworICB9LAorCisgIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgeworICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgeworICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmVsZW1lbnQpOworICAgIH0pLmJpbmQodGhpcykpOworICB9Cit9KTsKKworSW5zZXJ0aW9uLlRvcCA9IENsYXNzLmNyZWF0ZSgpOworSW5zZXJ0aW9uLlRvcC5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBYnN0cmFjdC5JbnNlcnRpb24oJ2FmdGVyQmVnaW4nKSwgeworICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWxlbWVudCk7CisgICAgdGhpcy5yYW5nZS5jb2xsYXBzZSh0cnVlKTsKKyAgfSwKKworICBpbnNlcnRDb250ZW50OiBmdW5jdGlvbihmcmFnbWVudHMpIHsKKyAgICBmcmFnbWVudHMucmV2ZXJzZShmYWxzZSkuZWFjaCgoZnVuY3Rpb24oZnJhZ21lbnQpIHsKKyAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTsKKyAgICB9KS5iaW5kKHRoaXMpKTsKKyAgfQorfSk7CisKK0luc2VydGlvbi5Cb3R0b20gPSBDbGFzcy5jcmVhdGUoKTsKK0luc2VydGlvbi5Cb3R0b20ucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuSW5zZXJ0aW9uKCdiZWZvcmVFbmQnKSwgeworICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWxlbWVudCk7CisgICAgdGhpcy5yYW5nZS5jb2xsYXBzZSh0aGlzLmVsZW1lbnQpOworICB9LAorCisgIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgeworICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgeworICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTsKKyAgICB9KS5iaW5kKHRoaXMpKTsKKyAgfQorfSk7CisKK0luc2VydGlvbi5BZnRlciA9IENsYXNzLmNyZWF0ZSgpOworSW5zZXJ0aW9uLkFmdGVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0Lkluc2VydGlvbignYWZ0ZXJFbmQnKSwgeworICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucmFuZ2Uuc2V0U3RhcnRBZnRlcih0aGlzLmVsZW1lbnQpOworICB9LAorCisgIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgeworICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgeworICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LAorICAgICAgICB0aGlzLmVsZW1lbnQubmV4dFNpYmxpbmcpOworICAgIH0pLmJpbmQodGhpcykpOworICB9Cit9KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0VsZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgpOworRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSA9IHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CisgIH0sCisKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgvXHMrLykuc2VsZWN0KGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA+IDA7CisgICAgfSkuX2VhY2goaXRlcmF0b3IpOworICB9LAorCisgIHNldDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgfSwKKworICBhZGQ6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvQWRkKSB7CisgICAgaWYgKHRoaXMuaW5jbHVkZShjbGFzc05hbWVUb0FkZCkpIHJldHVybjsKKyAgICB0aGlzLnNldCgkQSh0aGlzKS5jb25jYXQoY2xhc3NOYW1lVG9BZGQpLmpvaW4oJyAnKSk7CisgIH0sCisKKyAgcmVtb3ZlOiBmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSkgeworICAgIGlmICghdGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvUmVtb3ZlKSkgcmV0dXJuOworICAgIHRoaXMuc2V0KCRBKHRoaXMpLndpdGhvdXQoY2xhc3NOYW1lVG9SZW1vdmUpLmpvaW4oJyAnKSk7CisgIH0sCisKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAkQSh0aGlzKS5qb2luKCcgJyk7CisgIH0KK307CisKK09iamVjdC5leHRlbmQoRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7Cit2YXIgU2VsZWN0b3IgPSBDbGFzcy5jcmVhdGUoKTsKK1NlbGVjdG9yLnByb3RvdHlwZSA9IHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZXhwcmVzc2lvbikgeworICAgIHRoaXMucGFyYW1zID0ge2NsYXNzTmFtZXM6IFtdfTsKKyAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uLnRvU3RyaW5nKCkuc3RyaXAoKTsKKyAgICB0aGlzLnBhcnNlRXhwcmVzc2lvbigpOworICAgIHRoaXMuY29tcGlsZU1hdGNoZXIoKTsKKyAgfSwKKworICBwYXJzZUV4cHJlc3Npb246IGZ1bmN0aW9uKCkgeworICAgIGZ1bmN0aW9uIGFib3J0KG1lc3NhZ2UpIHsgdGhyb3cgJ1BhcnNlIGVycm9yIGluIHNlbGVjdG9yOiAnICsgbWVzc2FnZTsgfQorCisgICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PSAnJykgIGFib3J0KCdlbXB0eSBleHByZXNzaW9uJyk7CisKKyAgICB2YXIgcGFyYW1zID0gdGhpcy5wYXJhbXMsIGV4cHIgPSB0aGlzLmV4cHJlc3Npb24sIG1hdGNoLCBtb2RpZmllciwgY2xhdXNlLCByZXN0OworICAgIHdoaWxlIChtYXRjaCA9IGV4cHIubWF0Y2goL14oLiopXFsoW2EtejAtOV86LV0rPykoPzooW35cfCFdPz0pKD86IihbXiJdKikifChbXlxdXHNdKikpKT9cXSQvaSkpIHsKKyAgICAgIHBhcmFtcy5hdHRyaWJ1dGVzID0gcGFyYW1zLmF0dHJpYnV0ZXMgfHwgW107CisgICAgICBwYXJhbXMuYXR0cmlidXRlcy5wdXNoKHtuYW1lOiBtYXRjaFsyXSwgb3BlcmF0b3I6IG1hdGNoWzNdLCB2YWx1ZTogbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgJyd9KTsKKyAgICAgIGV4cHIgPSBtYXRjaFsxXTsKKyAgICB9CisKKyAgICBpZiAoZXhwciA9PSAnKicpIHJldHVybiB0aGlzLnBhcmFtcy53aWxkY2FyZCA9IHRydWU7CisKKyAgICB3aGlsZSAobWF0Y2ggPSBleHByLm1hdGNoKC9eKFteYS16MC05Xy1dKT8oW2EtejAtOV8tXSspKC4qKS9pKSkgeworICAgICAgbW9kaWZpZXIgPSBtYXRjaFsxXSwgY2xhdXNlID0gbWF0Y2hbMl0sIHJlc3QgPSBtYXRjaFszXTsKKyAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHsKKyAgICAgICAgY2FzZSAnIyc6ICAgICAgIHBhcmFtcy5pZCA9IGNsYXVzZTsgYnJlYWs7CisgICAgICAgIGNhc2UgJy4nOiAgICAgICBwYXJhbXMuY2xhc3NOYW1lcy5wdXNoKGNsYXVzZSk7IGJyZWFrOworICAgICAgICBjYXNlICcnOgorICAgICAgICBjYXNlIHVuZGVmaW5lZDogcGFyYW1zLnRhZ05hbWUgPSBjbGF1c2UudG9VcHBlckNhc2UoKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICBhYm9ydChleHByLmluc3BlY3QoKSk7CisgICAgICB9CisgICAgICBleHByID0gcmVzdDsKKyAgICB9CisKKyAgICBpZiAoZXhwci5sZW5ndGggPiAwKSBhYm9ydChleHByLmluc3BlY3QoKSk7CisgIH0sCisKKyAgYnVpbGRNYXRjaEV4cHJlc3Npb246IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcywgY29uZGl0aW9ucyA9IFtdLCBjbGF1c2U7CisKKyAgICBpZiAocGFyYW1zLndpbGRjYXJkKQorICAgICAgY29uZGl0aW9ucy5wdXNoKCd0cnVlJyk7CisgICAgaWYgKGNsYXVzZSA9IHBhcmFtcy5pZCkKKyAgICAgIGNvbmRpdGlvbnMucHVzaCgnZWxlbWVudC5yZWFkQXR0cmlidXRlKCJpZCIpID09ICcgKyBjbGF1c2UuaW5zcGVjdCgpKTsKKyAgICBpZiAoY2xhdXNlID0gcGFyYW1zLnRhZ05hbWUpCisgICAgICBjb25kaXRpb25zLnB1c2goJ2VsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICcgKyBjbGF1c2UuaW5zcGVjdCgpKTsKKyAgICBpZiAoKGNsYXVzZSA9IHBhcmFtcy5jbGFzc05hbWVzKS5sZW5ndGggPiAwKQorICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGNsYXVzZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgY29uZGl0aW9ucy5wdXNoKCdlbGVtZW50Lmhhc0NsYXNzTmFtZSgnICsgY2xhdXNlW2ldLmluc3BlY3QoKSArICcpJyk7CisgICAgaWYgKGNsYXVzZSA9IHBhcmFtcy5hdHRyaWJ1dGVzKSB7CisgICAgICBjbGF1c2UuZWFjaChmdW5jdGlvbihhdHRyaWJ1dGUpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gJ2VsZW1lbnQucmVhZEF0dHJpYnV0ZSgnICsgYXR0cmlidXRlLm5hbWUuaW5zcGVjdCgpICsgJyknOworICAgICAgICB2YXIgc3BsaXRWYWx1ZUJ5ID0gZnVuY3Rpb24oZGVsaW1pdGVyKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlICsgJyAmJiAnICsgdmFsdWUgKyAnLnNwbGl0KCcgKyBkZWxpbWl0ZXIuaW5zcGVjdCgpICsgJyknOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGUub3BlcmF0b3IpIHsKKyAgICAgICAgICBjYXNlICc9JzogICAgICAgY29uZGl0aW9ucy5wdXNoKHZhbHVlICsgJyA9PSAnICsgYXR0cmlidXRlLnZhbHVlLmluc3BlY3QoKSk7IGJyZWFrOworICAgICAgICAgIGNhc2UgJ349JzogICAgICBjb25kaXRpb25zLnB1c2goc3BsaXRWYWx1ZUJ5KCcgJykgKyAnLmluY2x1ZGUoJyArIGF0dHJpYnV0ZS52YWx1ZS5pbnNwZWN0KCkgKyAnKScpOyBicmVhazsKKyAgICAgICAgICBjYXNlICd8PSc6ICAgICAgY29uZGl0aW9ucy5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0VmFsdWVCeSgnLScpICsgJy5maXJzdCgpLnRvVXBwZXJDYXNlKCkgPT0gJyArIGF0dHJpYnV0ZS52YWx1ZS50b1VwcGVyQ2FzZSgpLmluc3BlY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICApOyBicmVhazsKKyAgICAgICAgICBjYXNlICchPSc6ICAgICAgY29uZGl0aW9ucy5wdXNoKHZhbHVlICsgJyAhPSAnICsgYXR0cmlidXRlLnZhbHVlLmluc3BlY3QoKSk7IGJyZWFrOworICAgICAgICAgIGNhc2UgJyc6CisgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6IGNvbmRpdGlvbnMucHVzaCgnZWxlbWVudC5oYXNBdHRyaWJ1dGUoJyArIGF0dHJpYnV0ZS5uYW1lLmluc3BlY3QoKSArICcpJyk7IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICB0aHJvdyAnVW5rbm93biBvcGVyYXRvciAnICsgYXR0cmlidXRlLm9wZXJhdG9yICsgJyBpbiBzZWxlY3Rvcic7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiBjb25kaXRpb25zLmpvaW4oJyAmJiAnKTsKKyAgfSwKKworICBjb21waWxlTWF0Y2hlcjogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5tYXRjaCA9IG5ldyBGdW5jdGlvbignZWxlbWVudCcsICdpZiAoIWVsZW1lbnQudGFnTmFtZSkgcmV0dXJuIGZhbHNlOyBcCisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsgXAorICAgICAgcmV0dXJuICcgKyB0aGlzLmJ1aWxkTWF0Y2hFeHByZXNzaW9uKCkpOworICB9LAorCisgIGZpbmRFbGVtZW50czogZnVuY3Rpb24oc2NvcGUpIHsKKyAgICB2YXIgZWxlbWVudDsKKworICAgIGlmIChlbGVtZW50ID0gJCh0aGlzLnBhcmFtcy5pZCkpCisgICAgICBpZiAodGhpcy5tYXRjaChlbGVtZW50KSkKKyAgICAgICAgaWYgKCFzY29wZSB8fCBFbGVtZW50LmNoaWxkT2YoZWxlbWVudCwgc2NvcGUpKQorICAgICAgICAgIHJldHVybiBbZWxlbWVudF07CisKKyAgICBzY29wZSA9IChzY29wZSB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGhpcy5wYXJhbXMudGFnTmFtZSB8fCAnKicpOworCisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gc2NvcGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBpZiAodGhpcy5tYXRjaChlbGVtZW50ID0gc2NvcGVbaV0pKQorICAgICAgICByZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQoZWxlbWVudCkpOworCisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247CisgIH0KK30KKworT2JqZWN0LmV4dGVuZChTZWxlY3RvciwgeworICBtYXRjaEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbikgeworICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihleHByZXNzaW9uKTsKKyAgICByZXR1cm4gZWxlbWVudHMuc2VsZWN0KHNlbGVjdG9yLm1hdGNoLmJpbmQoc2VsZWN0b3IpKS5tYXAoRWxlbWVudC5leHRlbmQpOworICB9LAorCisgIGZpbmRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT0gJ251bWJlcicpIGluZGV4ID0gZXhwcmVzc2lvbiwgZXhwcmVzc2lvbiA9IGZhbHNlOworICAgIHJldHVybiBTZWxlY3Rvci5tYXRjaEVsZW1lbnRzKGVsZW1lbnRzLCBleHByZXNzaW9uIHx8ICcqJylbaW5kZXggfHwgMF07CisgIH0sCisKKyAgZmluZENoaWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb25zKSB7CisgICAgcmV0dXJuIGV4cHJlc3Npb25zLm1hcChmdW5jdGlvbihleHByZXNzaW9uKSB7CisgICAgICByZXR1cm4gZXhwcmVzc2lvbi5tYXRjaCgvW15ccyJdKyg/OiJbXiJdKiJbXlxzIl0rKSovZykuaW5qZWN0KFtudWxsXSwgZnVuY3Rpb24ocmVzdWx0cywgZXhwcikgeworICAgICAgICB2YXIgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IoZXhwcik7CisgICAgICAgIHJldHVybiByZXN1bHRzLmluamVjdChbXSwgZnVuY3Rpb24oZWxlbWVudHMsIHJlc3VsdCkgeworICAgICAgICAgIHJldHVybiBlbGVtZW50cy5jb25jYXQoc2VsZWN0b3IuZmluZEVsZW1lbnRzKHJlc3VsdCB8fCBlbGVtZW50KSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfSkuZmxhdHRlbigpOworICB9Cit9KTsKKworZnVuY3Rpb24gJCQoKSB7CisgIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50cyhkb2N1bWVudCwgJEEoYXJndW1lbnRzKSk7Cit9Cit2YXIgRm9ybSA9IHsKKyAgcmVzZXQ6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICAkKGZvcm0pLnJlc2V0KCk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisKKyAgc2VyaWFsaXplRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBnZXRIYXNoKSB7CisgICAgdmFyIGRhdGEgPSBlbGVtZW50cy5pbmplY3Qoe30sIGZ1bmN0aW9uKHJlc3VsdCwgZWxlbWVudCkgeworICAgICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgeworICAgICAgICB2YXIga2V5ID0gZWxlbWVudC5uYW1lLCB2YWx1ZSA9ICQoZWxlbWVudCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgeworICAgICAgICAgIGlmIChyZXN1bHRba2V5XSkgeworICAgICAgICAgICAgaWYgKHJlc3VsdFtrZXldLmNvbnN0cnVjdG9yICE9IEFycmF5KSByZXN1bHRba2V5XSA9IFtyZXN1bHRba2V5XV07CisgICAgICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSByZXN1bHRba2V5XSA9IHZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0pOworCisgICAgcmV0dXJuIGdldEhhc2ggPyBkYXRhIDogSGFzaC50b1F1ZXJ5U3RyaW5nKGRhdGEpOworICB9Cit9OworCitGb3JtLk1ldGhvZHMgPSB7CisgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZm9ybSwgZ2V0SGFzaCkgeworICAgIHJldHVybiBGb3JtLnNlcmlhbGl6ZUVsZW1lbnRzKEZvcm0uZ2V0RWxlbWVudHMoZm9ybSksIGdldEhhc2gpOworICB9LAorCisgIGdldEVsZW1lbnRzOiBmdW5jdGlvbihmb3JtKSB7CisgICAgcmV0dXJuICRBKCQoZm9ybSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSkuaW5qZWN0KFtdLAorICAgICAgZnVuY3Rpb24oZWxlbWVudHMsIGNoaWxkKSB7CisgICAgICAgIGlmIChGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKKyAgICAgICAgICBlbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICAgIH0KKyAgICApOworICB9LAorCisgIGdldElucHV0czogZnVuY3Rpb24oZm9ybSwgdHlwZU5hbWUsIG5hbWUpIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICB2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTsKKworICAgIGlmICghdHlwZU5hbWUgJiYgIW5hbWUpIHJldHVybiAkQShpbnB1dHMpLm1hcChFbGVtZW50LmV4dGVuZCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbWF0Y2hpbmdJbnB1dHMgPSBbXSwgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgaW5wdXQgPSBpbnB1dHNbaV07CisgICAgICBpZiAoKHR5cGVOYW1lICYmIGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8IChuYW1lICYmIGlucHV0Lm5hbWUgIT0gbmFtZSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbWF0Y2hpbmdJbnB1dHMucHVzaChFbGVtZW50LmV4dGVuZChpbnB1dCkpOworICAgIH0KKworICAgIHJldHVybiBtYXRjaGluZ0lucHV0czsKKyAgfSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9ybSA9ICQoZm9ybSk7CisgICAgZm9ybS5nZXRFbGVtZW50cygpLmVhY2goZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgZWxlbWVudC5ibHVyKCk7CisgICAgICBlbGVtZW50LmRpc2FibGVkID0gJ3RydWUnOworICAgIH0pOworICAgIHJldHVybiBmb3JtOworICB9LAorCisgIGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIGZvcm0uZ2V0RWxlbWVudHMoKS5lYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSAnJzsKKyAgICB9KTsKKyAgICByZXR1cm4gZm9ybTsKKyAgfSwKKworICBmaW5kRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CisgICAgcmV0dXJuICQoZm9ybSkuZ2V0RWxlbWVudHMoKS5maW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgIT0gJ2hpZGRlbicgJiYgIWVsZW1lbnQuZGlzYWJsZWQgJiYKKyAgICAgICAgWydpbnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnXS5pbmNsdWRlKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgICB9KTsKKyAgfSwKKworICBmb2N1c0ZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIGZvcm0uZmluZEZpcnN0RWxlbWVudCgpLmFjdGl2YXRlKCk7CisgICAgcmV0dXJuIGZvcm07CisgIH0KK30KKworT2JqZWN0LmV4dGVuZChGb3JtLCBGb3JtLk1ldGhvZHMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRm9ybS5FbGVtZW50ID0geworICBmb2N1czogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICQoZWxlbWVudCkuZm9jdXMoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLnNlbGVjdCgpOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9CisKK0Zvcm0uRWxlbWVudC5NZXRob2RzID0geworICBzZXJpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxlbWVudC5uYW1lKSB7CisgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50LmdldFZhbHVlKCk7CisgICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHZhciBwYWlyID0ge307CisgICAgICAgIHBhaXJbZWxlbWVudC5uYW1lXSA9IHZhbHVlOworICAgICAgICByZXR1cm4gSGFzaC50b1F1ZXJ5U3RyaW5nKHBhaXIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJyc7CisgIH0sCisKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1lbnQpOworICB9LAorCisgIGNsZWFyOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgJChlbGVtZW50KS52YWx1ZSA9ICcnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHByZXNlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS52YWx1ZSAhPSAnJzsKKyAgfSwKKworICBhY3RpdmF0ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuZm9jdXMoKTsKKyAgICBpZiAoZWxlbWVudC5zZWxlY3QgJiYgKCBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAnaW5wdXQnIHx8CisgICAgICAhWydidXR0b24nLCAncmVzZXQnLCAnc3VibWl0J10uaW5jbHVkZShlbGVtZW50LnR5cGUpICkgKQorICAgICAgZWxlbWVudC5zZWxlY3QoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9IHRydWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZW5hYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5ibHVyKCk7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9CisKK09iamVjdC5leHRlbmQoRm9ybS5FbGVtZW50LCBGb3JtLkVsZW1lbnQuTWV0aG9kcyk7Cit2YXIgRmllbGQgPSBGb3JtLkVsZW1lbnQ7Cit2YXIgJEYgPSBGb3JtLkVsZW1lbnQuZ2V0VmFsdWU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMgPSB7CisgIGlucHV0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAgY2FzZSAnY2hlY2tib3gnOgorICAgICAgY2FzZSAncmFkaW8nOgorICAgICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLmlucHV0U2VsZWN0b3IoZWxlbWVudCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLnRleHRhcmVhKGVsZW1lbnQpOworICAgIH0KKyAgfSwKKworICBpbnB1dFNlbGVjdG9yOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsOworICB9LAorCisgIHRleHRhcmVhOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7CisgIH0sCisKKyAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIHRoaXNbZWxlbWVudC50eXBlID09ICdzZWxlY3Qtb25lJyA/CisgICAgICAnc2VsZWN0T25lJyA6ICdzZWxlY3RNYW55J10oZWxlbWVudCk7CisgIH0sCisKKyAgc2VsZWN0T25lOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIGluZGV4ID0gZWxlbWVudC5zZWxlY3RlZEluZGV4OworICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5vcHRpb25WYWx1ZShlbGVtZW50Lm9wdGlvbnNbaW5kZXhdKSA6IG51bGw7CisgIH0sCisKKyAgc2VsZWN0TWFueTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZXMsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3RoOworICAgIGlmICghbGVuZ3RoKSByZXR1cm4gbnVsbDsKKworICAgIGZvciAodmFyIGkgPSAwLCB2YWx1ZXMgPSBbXTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOworICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgdmFsdWVzLnB1c2godGhpcy5vcHRpb25WYWx1ZShvcHQpKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKworICBvcHRpb25WYWx1ZTogZnVuY3Rpb24ob3B0KSB7CisgICAgLy8gZXh0ZW5kIGVsZW1lbnQgYmVjYXVzZSBoYXNBdHRyaWJ1dGUgbWF5IG5vdCBiZSBuYXRpdmUKKyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQob3B0KS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyBvcHQudmFsdWUgOiBvcHQudGV4dDsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3QuVGltZWRPYnNlcnZlciA9IGZ1bmN0aW9uKCkge30KK0Fic3RyYWN0LlRpbWVkT2JzZXJ2ZXIucHJvdG90eXBlID0geworICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBmcmVxdWVuY3ksIGNhbGxiYWNrKSB7CisgICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgdGhpcy5lbGVtZW50ICAgPSAkKGVsZW1lbnQpOworICAgIHRoaXMuY2FsbGJhY2sgID0gY2FsbGJhY2s7CisKKyAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsKKyAgfSwKKworICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbigpIHsKKyAgICBzZXRJbnRlcnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmZyZXF1ZW5jeSAqIDEwMDApOworICB9LAorCisgIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIHZhciBjaGFuZ2VkID0gKCdzdHJpbmcnID09IHR5cGVvZiB0aGlzLmxhc3RWYWx1ZSAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgdmFsdWUKKyAgICAgID8gdGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUgOiBTdHJpbmcodGhpcy5sYXN0VmFsdWUpICE9IFN0cmluZyh2YWx1ZSkpOworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOworICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIH0KK30KKworRm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7CitGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuVGltZWRPYnNlcnZlcigpLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworCitGb3JtLk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7CitGb3JtLk9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIoKSwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3QuRXZlbnRPYnNlcnZlciA9IGZ1bmN0aW9uKCkge30KK0Fic3RyYWN0LkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0geworICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykgeworICAgIHRoaXMuZWxlbWVudCAgPSAkKGVsZW1lbnQpOworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgIHRoaXMubGFzdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdmb3JtJykKKyAgICAgIHRoaXMucmVnaXN0ZXJGb3JtQ2FsbGJhY2tzKCk7CisgICAgZWxzZQorICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCk7CisgIH0sCisKKyAgb25FbGVtZW50RXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgICBpZiAodGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7CisgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOworICAgIH0KKyAgfSwKKworICByZWdpc3RlckZvcm1DYWxsYmFja3M6IGZ1bmN0aW9uKCkgeworICAgIEZvcm0uZ2V0RWxlbWVudHModGhpcy5lbGVtZW50KS5lYWNoKHRoaXMucmVnaXN0ZXJDYWxsYmFjay5iaW5kKHRoaXMpKTsKKyAgfSwKKworICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQudHlwZSkgeworICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAgICBjYXNlICdjaGVja2JveCc6CisgICAgICAgIGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjbGljaycsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXZlbnQub2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdlJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworRm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsKK0Zvcm0uRWxlbWVudC5FdmVudE9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIoKSwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpOworICB9Cit9KTsKKworRm9ybS5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7CitGb3JtLkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuRXZlbnRPYnNlcnZlcigpLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CitpZiAoIXdpbmRvdy5FdmVudCkgeworICB2YXIgRXZlbnQgPSBuZXcgT2JqZWN0KCk7Cit9CisKK09iamVjdC5leHRlbmQoRXZlbnQsIHsKKyAgS0VZX0JBQ0tTUEFDRTogOCwKKyAgS0VZX1RBQjogICAgICAgOSwKKyAgS0VZX1JFVFVSTjogICAxMywKKyAgS0VZX0VTQzogICAgICAyNywKKyAgS0VZX0xFRlQ6ICAgICAzNywKKyAgS0VZX1VQOiAgICAgICAzOCwKKyAgS0VZX1JJR0hUOiAgICAzOSwKKyAgS0VZX0RPV046ICAgICA0MCwKKyAgS0VZX0RFTEVURTogICA0NiwKKyAgS0VZX0hPTUU6ICAgICAzNiwKKyAgS0VZX0VORDogICAgICAzNSwKKyAgS0VZX1BBR0VVUDogICAzMywKKyAgS0VZX1BBR0VET1dOOiAzNCwKKworICBlbGVtZW50OiBmdW5jdGlvbihldmVudCkgeworICAgIHJldHVybiBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKKyAgfSwKKworICBpc0xlZnRDbGljazogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICByZXR1cm4gKCgoZXZlbnQud2hpY2gpICYmIChldmVudC53aGljaCA9PSAxKSkgfHwKKyAgICAgICAgICAgICgoZXZlbnQuYnV0dG9uKSAmJiAoZXZlbnQuYnV0dG9uID09IDEpKSk7CisgIH0sCisKKyAgcG9pbnRlclg6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgcmV0dXJuIGV2ZW50LnBhZ2VYIHx8IChldmVudC5jbGllbnRYICsKKyAgICAgIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKTsKKyAgfSwKKworICBwb2ludGVyWTogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICByZXR1cm4gZXZlbnQucGFnZVkgfHwgKGV2ZW50LmNsaWVudFkgKworICAgICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKTsKKyAgfSwKKworICBzdG9wOiBmdW5jdGlvbihldmVudCkgeworICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkgeworICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKyAgICB9CisgIH0sCisKKyAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiB0YWdOYW1lLCBzdGFydGluZyBmcm9tIHRoZQorICAvLyBub2RlIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIG9uOyB0cmF2ZXJzZXMgdGhlIERPTSB1cHdhcmRzCisgIGZpbmRFbGVtZW50OiBmdW5jdGlvbihldmVudCwgdGFnTmFtZSkgeworICAgIHZhciBlbGVtZW50ID0gRXZlbnQuZWxlbWVudChldmVudCk7CisgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50Tm9kZSAmJiAoIWVsZW1lbnQudGFnTmFtZSB8fAorICAgICAgICAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpKSkpCisgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIG9ic2VydmVyczogZmFsc2UsCisKKyAgX29ic2VydmVBbmRDYWNoZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsKKyAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzKSB0aGlzLm9ic2VydmVycyA9IFtdOworICAgIGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKKyAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goW2VsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlXSk7CisgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpOworICAgIH0gZWxzZSBpZiAoZWxlbWVudC5hdHRhY2hFdmVudCkgeworICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChbZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmVdKTsKKyAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uJyArIG5hbWUsIG9ic2VydmVyKTsKKyAgICB9CisgIH0sCisKKyAgdW5sb2FkQ2FjaGU6IGZ1bmN0aW9uKCkgeworICAgIGlmICghRXZlbnQub2JzZXJ2ZXJzKSByZXR1cm47CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IEV2ZW50Lm9ic2VydmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgRXZlbnQuc3RvcE9ic2VydmluZy5hcHBseSh0aGlzLCBFdmVudC5vYnNlcnZlcnNbaV0pOworICAgICAgRXZlbnQub2JzZXJ2ZXJzW2ldWzBdID0gbnVsbDsKKyAgICB9CisgICAgRXZlbnQub2JzZXJ2ZXJzID0gZmFsc2U7CisgIH0sCisKKyAgb2JzZXJ2ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB1c2VDYXB0dXJlID0gdXNlQ2FwdHVyZSB8fCBmYWxzZTsKKworICAgIGlmIChuYW1lID09ICdrZXlwcmVzcycgJiYKKyAgICAgICAgKG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLykKKyAgICAgICAgfHwgZWxlbWVudC5hdHRhY2hFdmVudCkpCisgICAgICBuYW1lID0gJ2tleWRvd24nOworCisgICAgRXZlbnQuX29ic2VydmVBbmRDYWNoZShlbGVtZW50LCBuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSk7CisgIH0sCisKKyAgc3RvcE9ic2VydmluZzogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB1c2VDYXB0dXJlID0gdXNlQ2FwdHVyZSB8fCBmYWxzZTsKKworICAgIGlmIChuYW1lID09ICdrZXlwcmVzcycgJiYKKyAgICAgICAgKG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLykKKyAgICAgICAgfHwgZWxlbWVudC5kZXRhY2hFdmVudCkpCisgICAgICBuYW1lID0gJ2tleWRvd24nOworCisgICAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikgeworICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlKTsKKyAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZGV0YWNoRXZlbnQpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoJ29uJyArIG5hbWUsIG9ic2VydmVyKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHt9CisgICAgfQorICB9Cit9KTsKKworLyogcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUgKi8KK2lmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvXGJNU0lFXGIvKSkKKyAgRXZlbnQub2JzZXJ2ZSh3aW5kb3csICd1bmxvYWQnLCBFdmVudC51bmxvYWRDYWNoZSwgZmFsc2UpOwordmFyIFBvc2l0aW9uID0geworICAvLyBzZXQgdG8gdHJ1ZSBpZiBuZWVkZWQsIHdhcm5pbmc6IGZpcmVmb3ggcGVyZm9ybWFuY2UgcHJvYmxlbXMKKyAgLy8gTk9UIG5lZWVkZWQgZm9yIHBhZ2Ugc2Nyb2xsaW5nLCBvbmx5IGlmIGRyYWdnYWJsZSBjb250YWluZWQgaW4KKyAgLy8gc2Nyb2xsYWJsZSBlbGVtZW50cworICBpbmNsdWRlU2Nyb2xsT2Zmc2V0czogZmFsc2UsCisKKyAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgd2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zmc2V0LCBldmVyeSB0aW1lIHRoZQorICAvLyBwYWdlIGlzIHNjcm9sbGVkCisgIHByZXBhcmU6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuZGVsdGFYID0gIHdpbmRvdy5wYWdlWE9mZnNldAorICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0CisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0CisgICAgICAgICAgICAgICAgfHwgMDsKKyAgICB0aGlzLmRlbHRhWSA9ICB3aW5kb3cucGFnZVlPZmZzZXQKKyAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wCisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AKKyAgICAgICAgICAgICAgICB8fCAwOworICB9LAorCisgIHJlYWxPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworICAgIH0gd2hpbGUgKGVsZW1lbnQpOworICAgIHJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOworICB9LAorCisgIGN1bXVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07CisgIH0sCisKKyAgcG9zaXRpb25lZE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGlmKGVsZW1lbnQudGFnTmFtZT09J0JPRFknKSBicmVhazsKKyAgICAgICAgdmFyIHAgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOworICAgICAgICBpZiAocCA9PSAncmVsYXRpdmUnIHx8IHAgPT0gJ2Fic29sdXRlJykgYnJlYWs7CisgICAgICB9CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07CisgIH0sCisKKyAgb2Zmc2V0UGFyZW50OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50KSByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSkgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICB3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpICYmIGVsZW1lbnQgIT0gZG9jdW1lbnQuYm9keSkKKyAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpICE9ICdzdGF0aWMnKQorICAgICAgICByZXR1cm4gZWxlbWVudDsKKworICAgIHJldHVybiBkb2N1bWVudC5ib2R5OworICB9LAorCisgIC8vIGNhY2hlcyB4L3kgY29vcmRpbmF0ZSBwYWlyIHRvIHVzZSB3aXRoIG92ZXJsYXAKKyAgd2l0aGluOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgaWYgKHRoaXMuaW5jbHVkZVNjcm9sbE9mZnNldHMpCisgICAgICByZXR1cm4gdGhpcy53aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzKGVsZW1lbnQsIHgsIHkpOworICAgIHRoaXMueGNvbXAgPSB4OworICAgIHRoaXMueWNvbXAgPSB5OworICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOworCisgICAgcmV0dXJuICh5ID49IHRoaXMub2Zmc2V0WzFdICYmCisgICAgICAgICAgICB5IDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKKyAgICAgICAgICAgIHggPj0gdGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAgIHggPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgdmFyIG9mZnNldGNhY2hlID0gdGhpcy5yZWFsT2Zmc2V0KGVsZW1lbnQpOworCisgICAgdGhpcy54Y29tcCA9IHggKyBvZmZzZXRjYWNoZVswXSAtIHRoaXMuZGVsdGFYOworICAgIHRoaXMueWNvbXAgPSB5ICsgb2Zmc2V0Y2FjaGVbMV0gLSB0aGlzLmRlbHRhWTsKKyAgICB0aGlzLm9mZnNldCA9IHRoaXMuY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKworICAgIHJldHVybiAodGhpcy55Y29tcCA+PSB0aGlzLm9mZnNldFsxXSAmJgorICAgICAgICAgICAgdGhpcy55Y29tcCA8ICB0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmCisgICAgICAgICAgICB0aGlzLnhjb21wID49IHRoaXMub2Zmc2V0WzBdICYmCisgICAgICAgICAgICB0aGlzLnhjb21wIDwgIHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCk7CisgIH0sCisKKyAgLy8gd2l0aGluIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJlZm9yZQorICBvdmVybGFwOiBmdW5jdGlvbihtb2RlLCBlbGVtZW50KSB7CisgICAgaWYgKCFtb2RlKSByZXR1cm4gMDsKKyAgICBpZiAobW9kZSA9PSAndmVydGljYWwnKQorICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCkgLSB0aGlzLnljb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OworICAgIGlmIChtb2RlID09ICdob3Jpem9udGFsJykKKyAgICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCkgLSB0aGlzLnhjb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0V2lkdGg7CisgIH0sCisKKyAgcGFnZTogZnVuY3Rpb24oZm9yRWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworCisgICAgdmFyIGVsZW1lbnQgPSBmb3JFbGVtZW50OworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKworICAgICAgLy8gU2FmYXJpIGZpeAorICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50PT1kb2N1bWVudC5ib2R5KQorICAgICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCdwb3NpdGlvbicpPT0nYWJzb2x1dGUnKSBicmVhazsKKworICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCk7CisKKyAgICBlbGVtZW50ID0gZm9yRWxlbWVudDsKKyAgICBkbyB7CisgICAgICBpZiAoIXdpbmRvdy5vcGVyYSB8fCBlbGVtZW50LnRhZ05hbWU9PSdCT0RZJykgeworICAgICAgICB2YWx1ZVQgLT0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICAgIHZhbHVlTCAtPSBlbGVtZW50LnNjcm9sbExlZnQgfHwgMDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKTsKKworICAgIHJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOworICB9LAorCisgIGNsb25lOiBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCkgeworICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CisgICAgICBzZXRMZWZ0OiAgICB0cnVlLAorICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwKKyAgICAgIHNldFdpZHRoOiAgIHRydWUsCisgICAgICBzZXRIZWlnaHQ6ICB0cnVlLAorICAgICAgb2Zmc2V0VG9wOiAgMCwKKyAgICAgIG9mZnNldExlZnQ6IDAKKyAgICB9LCBhcmd1bWVudHNbMl0gfHwge30pCisKKyAgICAvLyBmaW5kIHBhZ2UgcG9zaXRpb24gb2Ygc291cmNlCisgICAgc291cmNlID0gJChzb3VyY2UpOworICAgIHZhciBwID0gUG9zaXRpb24ucGFnZShzb3VyY2UpOworCisgICAgLy8gZmluZCBjb29yZGluYXRlIHN5c3RlbSB0byB1c2UKKyAgICB0YXJnZXQgPSAkKHRhcmdldCk7CisgICAgdmFyIGRlbHRhID0gWzAsIDBdOworICAgIHZhciBwYXJlbnQgPSBudWxsOworICAgIC8vIGRlbHRhIFswLDBdIHdpbGwgZG8gZmluZSB3aXRoIHBvc2l0aW9uOiBmaXhlZCBlbGVtZW50cywKKyAgICAvLyBwb3NpdGlvbjphYnNvbHV0ZSBuZWVkcyBvZmZzZXRQYXJlbnQgZGVsdGFzCisgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUodGFyZ2V0LCdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHsKKyAgICAgIHBhcmVudCA9IFBvc2l0aW9uLm9mZnNldFBhcmVudCh0YXJnZXQpOworICAgICAgZGVsdGEgPSBQb3NpdGlvbi5wYWdlKHBhcmVudCk7CisgICAgfQorCisgICAgLy8gY29ycmVjdCBieSBib2R5IG9mZnNldHMgKGZpeGVzIFNhZmFyaSkKKyAgICBpZiAocGFyZW50ID09IGRvY3VtZW50LmJvZHkpIHsKKyAgICAgIGRlbHRhWzBdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0TGVmdDsKKyAgICAgIGRlbHRhWzFdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0VG9wOworICAgIH0KKworICAgIC8vIHNldCBwb3NpdGlvbgorICAgIGlmKG9wdGlvbnMuc2V0TGVmdCkgICB0YXJnZXQuc3R5bGUubGVmdCAgPSAocFswXSAtIGRlbHRhWzBdICsgb3B0aW9ucy5vZmZzZXRMZWZ0KSArICdweCc7CisgICAgaWYob3B0aW9ucy5zZXRUb3ApICAgIHRhcmdldC5zdHlsZS50b3AgICA9IChwWzFdIC0gZGVsdGFbMV0gKyBvcHRpb25zLm9mZnNldFRvcCkgKyAncHgnOworICAgIGlmKG9wdGlvbnMuc2V0V2lkdGgpICB0YXJnZXQuc3R5bGUud2lkdGggPSBzb3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOworICAgIGlmKG9wdGlvbnMuc2V0SGVpZ2h0KSB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gc291cmNlLm9mZnNldEhlaWdodCArICdweCc7CisgIH0sCisKKyAgYWJzb2x1dGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50LnN0eWxlLnBvc2l0aW9uID09ICdhYnNvbHV0ZScpIHJldHVybjsKKyAgICBQb3NpdGlvbi5wcmVwYXJlKCk7CisKKyAgICB2YXIgb2Zmc2V0cyA9IFBvc2l0aW9uLnBvc2l0aW9uZWRPZmZzZXQoZWxlbWVudCk7CisgICAgdmFyIHRvcCAgICAgPSBvZmZzZXRzWzFdOworICAgIHZhciBsZWZ0ICAgID0gb2Zmc2V0c1swXTsKKyAgICB2YXIgd2lkdGggICA9IGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFyIGhlaWdodCAgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKKworICAgIGVsZW1lbnQuX29yaWdpbmFsTGVmdCAgID0gbGVmdCAtIHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0ICB8fCAwKTsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbFRvcCAgICA9IHRvcCAgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wIHx8IDApOworICAgIGVsZW1lbnQuX29yaWdpbmFsV2lkdGggID0gZWxlbWVudC5zdHlsZS53aWR0aDsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuc3R5bGUuaGVpZ2h0OworCisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgZWxlbWVudC5zdHlsZS50b3AgICAgPSB0b3AgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUubGVmdCAgID0gbGVmdCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSB3aWR0aCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworICB9LAorCisgIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9PSAncmVsYXRpdmUnKSByZXR1cm47CisgICAgUG9zaXRpb24ucHJlcGFyZSgpOworCisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisgICAgdmFyIHRvcCAgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wICB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbFRvcCB8fCAwKTsKKyAgICB2YXIgbGVmdCA9IHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0IHx8IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsTGVmdCB8fCAwKTsKKworICAgIGVsZW1lbnQuc3R5bGUudG9wICAgID0gdG9wICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQ7CisgICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSBlbGVtZW50Ll9vcmlnaW5hbFdpZHRoOworICB9Cit9CisKKy8vIFNhZmFyaSByZXR1cm5zIG1hcmdpbnMgb24gYm9keSB3aGljaCBpcyBpbmNvcnJlY3QgaWYgdGhlIGNoaWxkIGlzIGFic29sdXRlbHkKKy8vIHBvc2l0aW9uZWQuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgcmVkZWZpbmUgUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCBmb3IKKy8vIEtIVE1ML1dlYktpdCBvbmx5LgoraWYgKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CisgIFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQgPSBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50ID09IGRvY3VtZW50LmJvZHkpCisgICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOworCisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisKKyAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsKKyAgfQorfQorCitFbGVtZW50LmFkZE1ldGhvZHMoKTsKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dWaWV3ZXIuY3NzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd1ZpZXdlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzNDdmOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dWaWV3ZXIuY3NzCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjd29ya2Zsb3dfbW9kZUxfdGJseworCQorfQorCisjd29ya2Zsb3dfbW9kZWxfdGJsIHRyeworIHZlcnRpY2FsLWFsaWduOnRvcDsKK30KKworI3dvcmtmbG93X21vZGVsX3RibCB0ZC50YXNrX2J1YmJsZXsKKyAgd2lkdGg6ODI7CisgIGhlaWdodDo4MjsKKyAgLypiYWNrZ3JvdW5kOnVybCh0YXNrX2NpcmNsZS5qcGcpIG5vLXJlcGVhdDsqLworICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDOworICB0ZXh0LWFsaWduOmNlbnRlcjsKKyAgd2hpdGUtc3BhY2U6d3JhcDsKKyAgdmVydGljYWwtYWxpZ246bWlkZGxlOworICBib3JkZXItd2lkdGg6IDJweDsKKyAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7Cit9CisKKyN3b3JrZmxvd19tb2RlbF90YmwgdGQuYXJyb3d7CisgIHdpZHRoOjYwOworICBoZWlnaHQ6MTY7CisgIHRleHQtYWxpZ246Y2VudGVyOworICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7CisgIGJvcmRlci13aWR0aDogMHB4OworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd1ZpZXdlci5odG1sIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd1ZpZXdlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDEwOTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL1dvcmtmbG93Vmlld2VyLmh0bWwKQEAgLTAsMCArMSw0OCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpwYW5lbD4KKzx3aWNrZXQ6bGluaz4KKyA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJXb3JrZmxvd1ZpZXdlci5jc3MiLz4KKzwvd2lja2V0Omxpbms+Cis8dGFibGU+CisgIDx0cj4KKyAgICA8dGQ+V29ya2Zsb3cgSUQ8L3RkPgorICAgIDx0ZD48c3BhbiB3aWNrZXQ6aWQ9IndvcmtmbG93X2lkIj51cm46b29kdDpiYWNrd2FyZHNUZXN0V29ya2Zsb3c8L3NwYW4+PC90ZD4KKyAgPC90cj4KKyAgPHRyPiAgICAgICAJICAgIAkgICAgICAgICAgCisgICAgPHRkPk5hbWU8L3RkPgorICAgIDx0ZD48c3BhbiB3aWNrZXQ6aWQ9IndvcmtmbG93X25hbWUiPmJhY2t3YXJkc1Rlc3RXb3JrZmxvdzwvc3Bhbj48L3RkPgorICA8L3RyPgorICA8dHI+CisgIAkgCisJIDx0ZCBjb2xzcGFuPSIyIj4KKwkgICA8dGFibGUgaWQ9IndvcmtmbG93X21vZGVsX3RibCIgd2lja2V0OmlkPSJ3b3JrZmxvd19tb2RlbF90YmwiIHdpZHRoPSIyNzkiIGhlaWdodD0iMTAwIj4KKyAgCSAgICAgIDx0cj4KKyAgCSAgICAgICA8d2lja2V0OmNvbnRhaW5lciB3aWNrZXQ6aWQ9InRhc2tzIj4KKyAgCSAgICAJIDx0ZCBjbGFzcz0idGFza19idWJibGUiPjxhIHdpY2tldDppZD0idGFza19saW5rIiBocmVmPSIjIj48c3BhbiB3aWNrZXQ6aWQ9InRhc2tfbmFtZSI+SW50ZW5zV2FpdGU8L3NwYW4+PC9hPjwvdGQ+CisgIAkgICAgCSA8dGQgY2xhc3M9ImFycm93IiB3aWNrZXQ6aWQ9InRhc2tfYXJyb3ciPjx3aWNrZXQ6bGluaz48aW1nIHNyYz0idGFza19hcnJvdy5wbmciPjwvd2lja2V0Omxpbms+PC90ZD4KKyAgCSAgICAgICA8L3dpY2tldDpjb250YWluZXI+CisgICAgICAgICAgICAgPHdpY2tldDpyZW1vdmU+CisgIAkgICAgCSA8dGQgY2xhc3M9InRhc2tfYnViYmxlIj48YSBocmVmPSIjIj5Mb25nVGFzazE8L2E+PC90ZD4KKyAgCSAgICAJIDwvd2lja2V0OnJlbW92ZT4KKyAgCSAgICAgIDwvdHI+ICAJICAgICAgCisgICAgICAgPC90YWJsZT4gICAgICAJICAgIAkgICAgICAgICAgCisgICA8L3RkPgorICAgIAorICA8L3RyPgorPC90YWJsZT4KKzwvd2lja2V0OnBhbmVsPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd1ZpZXdlci5qYXZhIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd1ZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjliZDYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL1dvcmtmbG93Vmlld2VyLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cubW9kZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuV29ya2Zsb3dNZ3JDb25uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LmJlaGF2aW9yLlNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYk1hcmt1cENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwuSU1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLkxvYWRhYmxlRGV0YWNoYWJsZU1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLlByb3BlcnR5TW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dWaWV3ZXIgZXh0ZW5kcyBQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE1NzYwMTY1MDc4NTgyOTc5Mkw7CisKKyAgcHJpdmF0ZSBmaW5hbCBXb3JrZmxvd01nckNvbm4gd207CisKKyAgcHVibGljIFdvcmtmbG93Vmlld2VyKFN0cmluZyBpZCwgU3RyaW5nIHdtVXJsU3RyLCBmaW5hbCBTdHJpbmcgd29ya2Zsb3dJZCwKKyAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBXZWJQYWdlPiB0YXNrUGFnZSkgeworICAgIHN1cGVyKGlkKTsKKyAgICB0aGlzLndtID0gbmV3IFdvcmtmbG93TWdyQ29ubih3bVVybFN0cik7CisgICAgZmluYWwgSU1vZGVsPFdvcmtmbG93PiB3TW9kZWwgPSBuZXcgTG9hZGFibGVEZXRhY2hhYmxlTW9kZWw8V29ya2Zsb3c+KCkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBXb3JrZmxvdyBsb2FkKCkgeworICAgICAgICByZXR1cm4gd20uc2FmZUdldFdvcmtmbG93QnlJZCh3b3JrZmxvd0lkKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgYWRkKG5ldyBMYWJlbCgid29ya2Zsb3dfaWQiLCBuZXcgUHJvcGVydHlNb2RlbDxXb3JrZmxvdz4od01vZGVsLCAiaWQiKSkpOworICAgIGFkZChuZXcgTGFiZWwoIndvcmtmbG93X25hbWUiLCBuZXcgUHJvcGVydHlNb2RlbDxXb3JrZmxvdz4od01vZGVsLCAibmFtZSIpKSk7CisKKyAgICBpbnQgbnVtVGFza3MgPSB3TW9kZWwuZ2V0T2JqZWN0KCkuZ2V0VGFza3MoKS5zaXplKCk7CisgICAgU3RyaW5nIHdpZHRoID0gU3RyaW5nLnZhbHVlT2YoKDgyICogbnVtVGFza3MpICsgKDExNSAqIChudW1UYXNrcyAtIDEpKSk7CisgICAgU3RyaW5nIGhlaWdodCA9ICI4MiI7CisgICAgV2ViTWFya3VwQ29udGFpbmVyIHdUYWJsZSA9IG5ldyBXZWJNYXJrdXBDb250YWluZXIoIndvcmtmbG93X21vZGVsX3RibCIpOworICAgIHdUYWJsZS5hZGQobmV3IFNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyKCJ3aWR0aCIsIHdpZHRoKSk7CisgICAgd1RhYmxlLmFkZChuZXcgU2ltcGxlQXR0cmlidXRlTW9kaWZpZXIoImhlaWdodCIsIGhlaWdodCkpOworCisgICAgd1RhYmxlLmFkZChuZXcgTGlzdFZpZXc8V29ya2Zsb3dUYXNrPigidGFza3MiLCBuZXcgTGlzdE1vZGVsPFdvcmtmbG93VGFzaz4oCisgICAgICAgIHdNb2RlbC5nZXRPYmplY3QoKS5nZXRUYXNrcygpKSkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxXb3JrZmxvd1Rhc2s+IGl0ZW0pIHsKKyAgICAgICAgZmluYWwgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5hZGQoImlkIiwgaXRlbS5nZXRNb2RlbE9iamVjdCgpLmdldFRhc2tJZCgpKTsKKyAgICAgICAgTGluayB0YXNrTGluayA9IG5ldyBMaW5rKCJ0YXNrX2xpbmsiKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICogCisgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgICAgICovCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZSh0YXNrUGFnZSwgcGFyYW1zKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFN0cmluZyB0YXNrTmFtZSA9IHN1bW1hcml6ZVdvcmRzKGl0ZW0uZ2V0TW9kZWxPYmplY3QoKS5nZXRUYXNrTmFtZSgpLAorICAgICAgICAgICAgMTYsIDE2KTsKKyAgICAgICAgdGFza0xpbmsuYWRkKG5ldyBMYWJlbCgidGFza19uYW1lIiwgdGFza05hbWUpLnNldFJlbmRlckJvZHlPbmx5KHRydWUpKTsKKyAgICAgICAgaXRlbS5hZGQodGFza0xpbmspOworCisgICAgICAgIGlmIChpdGVtLmdldEluZGV4KCkgPT0gd01vZGVsLmdldE9iamVjdCgpLmdldFRhc2tzKCkuc2l6ZSgpIC0gMSkgeworICAgICAgICAgIGl0ZW0uYWRkKG5ldyBXZWJNYXJrdXBDb250YWluZXIoInRhc2tfYXJyb3ciKS5zZXRWaXNpYmxlKGZhbHNlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaXRlbS5hZGQobmV3IFdlYk1hcmt1cENvbnRhaW5lcigidGFza19hcnJvdyIpKTsKKyAgICAgICAgfQorCisgICAgICB9CisgICAgfSk7CisgICAgYWRkKHdUYWJsZSk7CisKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogU3VtbWFyaXplcyBhIGdpdmVuIFN0cmluZyBvZiB3b3JkcyAodGhlIDxjb2RlPm9yaWc8L2NvZGU+IHBhcmFtZXRlciksIGFuZAorICAgKiBsaW1pdHMgdGhlIHNpemUgb2YgdGhlIGluZGl2aWR1YWwgd29yZHMgaW4gdGhlIHN0cmluZyBieSB0aGUgZ2l2ZW4KKyAgICogPGNvZGU+d29yZFRocmVzaG9sZDwvY29kZT4sIGFuZCBsaW1pdHMgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGZpbmFsCisgICAqIHN1bW1hcml6ZWQgd29yZCBzdHJpbmcgYnkgdGhlIGdpdmVuIDxjb2RlPm1heExlbmd0aFRvdGFsPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIG9yaWcKKyAgICogICAgICAgICAgVGhlIG9yaWdpbmFsIFN0cmluZyB0byBzdW1tYXJpemUuCisgICAqIEBwYXJhbSB3b3JkVGhyZXNoaG9sZAorICAgKiAgICAgICAgICBUaGUgbWF4aW11bSBhbW91bnQgb2YgY2hhcmFjdGVycyBmb3IgYW55IGdpdmVuIHdvcmQgaW4gdGhlIHN0cmluZy4KKyAgICogQHBhcmFtIG1heExlbmd0aFRvdGFsCisgICAqICAgICAgICAgIFRoZSBtYXhpbXVtIGZpbmFsIHNpemUgb2YgdGhlIHN1bW1hcml6ZWQgc2V0IG9mIHdvcmRzLgorICAgKiBAcmV0dXJuIEEgc3VtbWFyaXplZCBzdHJpbmcuCisgICAqLworICBwcml2YXRlIFN0cmluZyBzdW1tYXJpemVXb3JkcyhTdHJpbmcgb3JpZywgaW50IHdvcmRUaHJlc2hob2xkLAorICAgICAgaW50IG1heExlbmd0aFRvdGFsKSB7CisgICAgU3RyaW5nW10gd29yZHMgPSBvcmlnLnNwbGl0KCIgIik7CisgICAgU3RyaW5nQnVmZmVyIHN1bW1hcml6ZWRTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBTdHJpbmcgd29yZCA9IHdvcmRzW2ldOworICAgICAgc3VtbWFyaXplZFN0cmluZy5hcHBlbmQod29yZC5zdWJzdHJpbmcoMCwgTWF0aC5taW4od29yZFRocmVzaGhvbGQsIHdvcmQKKyAgICAgICAgICAubGVuZ3RoKCkpKSk7CisgICAgICBzdW1tYXJpemVkU3RyaW5nLmFwcGVuZCgiICIpOworICAgIH0KKyAgICAKKyAgICAvLyBhZGQgJy4uLicgdG8gZW5kIG9mIHN1bW1hcml6ZWQgc3RyaW5nIGlmIGFwcGxpY2FibGUKKyAgICBpZiAoc3VtbWFyaXplZFN0cmluZy5sZW5ndGgoKSA+IG1heExlbmd0aFRvdGFsKSB7CisgICAgCXJldHVybiBzdW1tYXJpemVkU3RyaW5nLnN1YnN0cmluZygwLAorICAgIAkgICAgICAgIE1hdGgubWluKG1heExlbmd0aFRvdGFsLCBzdW1tYXJpemVkU3RyaW5nLmxlbmd0aCgpKSAtIDMpLnRvU3RyaW5nKCkgKyAiLi4uIjsKKyAgICB9IGVsc2UKKyAgICAJcmV0dXJuIHN1bW1hcml6ZWRTdHJpbmcudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL1dvcmtmbG93c1ZpZXdlci5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL1dvcmtmbG93c1ZpZXdlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiNzMxNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dzVmlld2VyLmNzcwpAQCAtMCwwICsxLDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3dvcmtmbG93c190Ymx7CisKK30KKworLmhlYWRlcnsKKworfQorCisud29ya2Zsb3dfZGF0YXsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd3NWaWV3ZXIuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dzVmlld2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkMDY3MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dzVmlld2VyLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpwYW5lbD4KKzx3aWNrZXQ6bGluaz4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iV29ya2Zsb3dzVmlld2VyLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKworPHRhYmxlIGlkPSJ3b3JrZmxvd3NfdGJsIj4KKyAgICAgPHRoZWFkPgorCSAgICAgPHRyIGNsYXNzPSJoZWFkZXIiPgorCSAgICAgICA8dGg+V29ya2Zsb3cgSUQ8L3RoPgorCSAgICAgICA8dGg+TmFtZTwvdGg+CisJICAgICAgIDx0aD5WaWV3PC90aD4KKwkgICAgIDwvdHI+CisgICAgIDwvdGhlYWQ+CisJPHRib2R5PgorCSAgICAgPHRyIHdpY2tldDppZD0id29ya2Zsb3dfbGlzdCIgY2xhc3M9IndvcmtmbG93X2RhdGEiPgorCSAgICAgICA8dGQgd2lja2V0OmlkPSJ3b3JrZmxvd19pZCI+dXJuOm9vZHQ6VGVzdFdvcmtmbG93PC90ZD4KKwkgICAgICAgPHRkIHdpY2tldDppZD0id29ya2Zsb3dfbmFtZSI+VGVzdCBXb3JrZmxvdzwvdGQ+CisJICAgICAgIDx0ZD48YSB3aWNrZXQ6aWQ9IndvcmtmbG93X2xpbmsiIGhyZWY9IiMiPkNsaWNrIGhlcmU8L2E+PC90ZD4KKwkgICAgICA8L3RyPiAKKwkgICA8d2lja2V0OnJlbW92ZT4KKwkgICAgIDx0ciBjbGFzcz0id29ya2Zsb3dfZGF0YSI+CisJICAgICAgIDx0ZD51cm46b29kdDpUZXN0V29ya2Zsb3c8L3RkPgorCSAgICAgICA8dGQ+VGVzdCBXb3JrZmxvdzwvdGQ+CisJICAgICAgIDx0ZD48YSBocmVmPSIjIj5DbGljayBoZXJlPC9hPjwvdGQ+CisJICAgICAgPC90cj4KKwkgICA8L3dpY2tldDpyZW1vdmU+CisgICA8L3Rib2R5PiAJICAgICAKKzwvdGFibGU+CisKKzwvd2lja2V0OnBhbmVsPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC9Xb3JrZmxvd3NWaWV3ZXIuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dzVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3YTA4ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvV29ya2Zsb3dzVmlld2VyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LldvcmtmbG93TWdyQ29ubjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLk1vZGVsOworCisvKioKKyAqIAorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93c1ZpZXdlciBleHRlbmRzIFBhbmVsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MDgyMjUzNDc2MTU5ODkyODNMOworCisgIHByaXZhdGUgV29ya2Zsb3dNZ3JDb25uIHdtOworCisgIC8qKgorICAgKiBAcGFyYW0gaWQKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd3NWaWV3ZXIoU3RyaW5nIGlkLCBTdHJpbmcgd29ya2Zsb3dVcmxTdHIsCisgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgV2ViUGFnZT4gd1ZpZXdlclBhZ2UpIHsKKyAgICBzdXBlcihpZCk7CisgICAgdGhpcy53bSA9IG5ldyBXb3JrZmxvd01nckNvbm4od29ya2Zsb3dVcmxTdHIpOworCisgICAgTGlzdDxXb3JrZmxvdz4gd29ya2Zsb3dzID0gdGhpcy53bS5zYWZlR2V0V29ya2Zsb3dzKCk7CisgICAgYWRkKG5ldyBMaXN0VmlldzxXb3JrZmxvdz4oIndvcmtmbG93X2xpc3QiLCB3b3JrZmxvd3MpIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08V29ya2Zsb3c+IGl0ZW0pIHsKKyAgICAgICAgV29ya2Zsb3cgdyA9IGl0ZW0uZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgaXRlbS5hZGQobmV3IExhYmVsKCJ3b3JrZmxvd19pZCIsIHcuZ2V0SWQoKSkpOworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIndvcmtmbG93X25hbWUiLCB3LmdldE5hbWUoKSkpOworICAgICAgICBpdGVtLmFkZChuZXcgTGluazxTdHJpbmc+KCJ3b3JrZmxvd19saW5rIiwgbmV3IE1vZGVsKHcuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICAgKiAKKyAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBwYXJhbXMuYWRkKCJpZCIsIGdldE1vZGVsT2JqZWN0KCkpOworICAgICAgICAgICAgc2V0UmVzcG9uc2VQYWdlKHdWaWV3ZXJQYWdlLCBwYXJhbXMpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL3Rhc2tfYXJyb3cuanBnIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC90YXNrX2Fycm93LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQwMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC90YXNrX2Fycm93LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL3Rhc2tfYXJyb3cucG5nIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC90YXNrX2Fycm93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNiMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9tb2RlbC90YXNrX2Fycm93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL3Rhc2tfY2lyY2xlLmpwZyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvbW9kZWwvdGFza19jaXJjbGUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTlkY2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L21vZGVsL3Rhc2tfY2lyY2xlLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L3BhZ2luYXRpb24vV29ya2Zsb3dQYWdlUGFnaW5hdG9yLmNzcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvcGFnaW5hdGlvbi9Xb3JrZmxvd1BhZ2VQYWdpbmF0b3IuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODBmZDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L3BhZ2luYXRpb24vV29ya2Zsb3dQYWdlUGFnaW5hdG9yLmNzcwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3BhZ2luYXRvci1icmVha3sKKyAgYm9yZGVyOjI7CisgIHdpZHRoOjEwMCU7Cit9CisKKyNjb250YWluZXItZGl2eworICB3aWR0aDoxMDAlOworfQorCisjcGFnaW5hdG9yLXRhYmxleworICBib3JkZXItc3BhY2luZzozOworICB3aWR0aDoxMDA7Cit9CisKKyNwYWdpbmF0b3ItdGFibGUtaGVhZGVyeworICB3aWR0aDoxMDAlOworICB3aGl0ZS1zcGFjZTpub3dyYXA7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7Cit9CisKKworI3BhZ2VfcmVwZWF0ZXJ7CisKK30KKworYSwgYTpob3ZlciwgYTpmb2N1cywgYTphY3RpdmV7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuc2VsZWN0ZWR7CisgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgIGNvbG9yOnJlZDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvcGFnaW5hdGlvbi9Xb3JrZmxvd1BhZ2VQYWdpbmF0b3IuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvcGFnaW5hdGlvbi9Xb3JrZmxvd1BhZ2VQYWdpbmF0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE0NzcxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9wYWdpbmF0aW9uL1dvcmtmbG93UGFnZVBhZ2luYXRvci5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+Cis8d2lja2V0Omxpbms+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IldvcmtmbG93UGFnZVBhZ2luYXRvci5jc3MiLz4KKzwvd2lja2V0Omxpbms+Cis8aHIgaWQ9InBhZ2luYXRvci1icmVhayI+Cis8ZGl2IGlkPSJjb250YWluZXItZGl2Ij4KKyAgICA8dGFibGUgaWQ9InBhZ2luYXRvci10YWJsZSI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCBpZD0icGFnaW5hdG9yLXRhYmxlLWhlYWRlciI+UmVzdWx0IFBhZ2U8L3RkPgorICAgICAgICAgIDx0ZCB3aWNrZXQ6aWQ9InBhZ2VfcmVwZWF0ZXIiIGlkPSJwYWdlX3JlcGVhdGVyIj48YSB3aWNrZXQ6aWQ9InBhZ2VMaW5rIiBjbGFzcz0ic2VsZWN0ZWQiIGhyZWY9IiMiPjxzcGFuIHdpY2tldDppZD0icGFnZU51bSI+MTwvc3Bhbj48L2E+PC90ZD4gICAgICAgICAgICAgICAgICAgIAkgCisgICAgICA8L3RyPgorICAgICA8L3RhYmxlPgorPC9kaXY+CisKKzxoMyB3aWNrZXQ6aWQ9Im5vdGhpbmdfZm91bmQiPk5vIFByb2R1Y3RzIEZvdW5kITwvaDM+Cis8L3dpY2tldDpwYW5lbD4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvcGFnaW5hdGlvbi9Xb3JrZmxvd1BhZ2VQYWdpbmF0b3IuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvcGFnaW5hdGlvbi9Xb3JrZmxvd1BhZ2VQYWdpbmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk1ZGNjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy9wYWdpbmF0aW9uL1dvcmtmbG93UGFnZVBhZ2luYXRvci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LnBhZ2luYXRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlUGFnZTsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LmJlaGF2aW9yLlNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5Cb29rbWFya2FibGVQYWdlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CisKKy8qKgorICogCisgKiBBIHBhZ2luYXRvciBjb21wb25lbnQgdGhhdCBleHBhbmRzIHRvIGEgKy8tIDUgcGFnZQorICogd2luZG93IHRvIHBhZ2luYXRlIGEge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1BhZ2VQYWdpbmF0b3IgZXh0ZW5kcyBQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjI3NzUzNjM3MTUxMzk3NDIyNUw7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlOworCisgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKyAgCisgIC8qKgorICAgKiBAcGFyYW0gaWQKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd1BhZ2VQYWdpbmF0b3IoU3RyaW5nIGlkLCBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlLAorICAgICAgZmluYWwgU3RyaW5nIHN0YXR1cywgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdlYlBhZ2U+IGluc3RQYWdlKSB7CisgICAgc3VwZXIoaWQpOworICAgIHRoaXMucGFnZSA9IHBhZ2U7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisKKyAgICBpZiAodGhpcy5wYWdlICE9IG51bGwgJiYgdGhpcy5wYWdlLmdldFBhZ2VXb3JrZmxvd3MoKSAhPSBudWxsCisgICAgICAgICYmIHRoaXMucGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkuc2l6ZSgpID4gMCkgeworCisgICAgICBpbnQgbnVtUGFnZXMgPSB0aGlzLnBhZ2UuZ2V0VG90YWxQYWdlcygpOworICAgICAgaW50IGN1cnJQYWdlID0gdGhpcy5wYWdlLmdldFBhZ2VOdW0oKTsKKyAgICAgIGludCB3aW5kb3dTaXplID0gMTA7CisKKyAgICAgIGludCBzdGFydFBhZ2UgPSBNYXRoLm1heCgxLCAoY3VyclBhZ2UgLSAod2luZG93U2l6ZSAvIDIpKSk7CisgICAgICBpbnQgZW5kUGFnZSA9IE1hdGgubWluKGN1cnJQYWdlICsgKHdpbmRvd1NpemUgLyAyKSwgbnVtUGFnZXMpOworICAgICAgTGlzdDxQYWdlTnVtRGlzcGxheT4gcG51bXMgPSB0aGlzLmdldFBhZ2VOdW1EaXNwbGF5KHN0YXJ0UGFnZSwgZW5kUGFnZSwKKyAgICAgICAgICBjdXJyUGFnZSk7CisKKyAgICAgIGFkZChuZXcgTGlzdFZpZXc8UGFnZU51bURpc3BsYXk+KCJwYWdlX3JlcGVhdGVyIiwgcG51bXMpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVJdGVtKExpc3RJdGVtPFBhZ2VOdW1EaXNwbGF5PiBpdGVtKSB7CisgICAgICAgICAgUGFnZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgcGFyYW1zLmFkZCgic3RhdHVzIiwgc3RhdHVzKTsKKyAgICAgICAgICBwYXJhbXMucHV0KCJwYWdlTnVtIiwgaXRlbS5nZXRNb2RlbE9iamVjdCgpLmdldE51bSgpKTsKKyAgICAgICAgICBCb29rbWFya2FibGVQYWdlTGluayBwYWdlTGluayA9IG5ldyBCb29rbWFya2FibGVQYWdlTGluaygicGFnZUxpbmsiLAorICAgICAgICAgICAgICBpbnN0UGFnZSwgcGFyYW1zKTsKKyAgICAgICAgICBwYWdlTGluay5hZGQobmV3IExhYmVsKCJwYWdlTnVtIiwgU3RyaW5nLnZhbHVlT2YoaXRlbQorICAgICAgICAgICAgICAuZ2V0TW9kZWxPYmplY3QoKS5nZXROdW0oKSkpKTsKKyAgICAgICAgICBwYWdlTGluay5hZGQobmV3IFNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyKCJjbGFzcyIsIGl0ZW0KKyAgICAgICAgICAgICAgLmdldE1vZGVsT2JqZWN0KCkuaXNDdXJyZW50UGFnZSgpID8gInNlbGVjdGVkIiA6ICIiKSk7CisgICAgICAgICAgaXRlbS5hZGQocGFnZUxpbmspOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGFkZChuZXcgTGFiZWwoIm5vdGhpbmdfZm91bmQiKS5zZXRWaXNpYmxlKGZhbHNlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFkZChuZXcgTGFiZWwoInBhZ2VfcmVwZWF0ZXIiKS5zZXRWaXNpYmxlKGZhbHNlKSk7CisgICAgICBhZGQobmV3IExhYmVsKCJwYWdlTGluayIpLnNldFZpc2libGUoZmFsc2UpKTsKKyAgICAgIGFkZChuZXcgTGFiZWwoInBhZ2VOdW0iKS5zZXRWaXNpYmxlKGZhbHNlKSk7CisgICAgICBhZGQobmV3IExhYmVsKCJub3RoaW5nX2ZvdW5kIikuc2V0VmlzaWJsZSh0cnVlKSk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIExpc3Q8UGFnZU51bURpc3BsYXk+IGdldFBhZ2VOdW1EaXNwbGF5KGludCBzdGFydFBhZ2UsIGludCBlbmRQYWdlLAorICAgICAgaW50IGN1cnJQYWdlKSB7CisgICAgTGlzdDxQYWdlTnVtRGlzcGxheT4gZGlzcGxheSA9IG5ldyBWZWN0b3I8UGFnZU51bURpc3BsYXk+KCk7CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0UGFnZTsgaSA8PSBlbmRQYWdlOyBpKyspIHsKKyAgICAgIGRpc3BsYXkuYWRkKG5ldyBQYWdlTnVtRGlzcGxheShpID09IGN1cnJQYWdlLCBpKSk7CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BsYXk7CisgIH0KKworICBjbGFzcyBQYWdlTnVtRGlzcGxheSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDM1MTQ3MDc3NDc2NDI3NjY0NEw7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY3VycmVudFBhZ2U7CisKKyAgICBwcml2YXRlIGludCBudW07CisKKyAgICBwdWJsaWMgUGFnZU51bURpc3BsYXkoKSB7CisgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gZmFsc2U7CisgICAgICB0aGlzLm51bSA9IC0xOworICAgIH0KKworICAgIHB1YmxpYyBQYWdlTnVtRGlzcGxheShib29sZWFuIGN1cnJlbnRQYWdlLCBpbnQgbnVtKSB7CisgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gY3VycmVudFBhZ2U7CisgICAgICB0aGlzLm51bSA9IG51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50UGFnZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ3VycmVudFBhZ2UoKSB7CisgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGN1cnJlbnRQYWdlCisgICAgICogICAgICAgICAgdGhlIGN1cnJlbnRQYWdlIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQYWdlKGJvb2xlYW4gY3VycmVudFBhZ2UpIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBjdXJyZW50UGFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bSgpIHsKKyAgICAgIHJldHVybiBudW07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG51bQorICAgICAqICAgICAgICAgIHRoZSBudW0gdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtKGludCBudW0pIHsKKyAgICAgIHRoaXMubnVtID0gbnVtOworICAgIH0KKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvdGFza3MvV29ya2Zsb3dUYXNrVmlld2VyLmNzcyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvdGFza3MvV29ya2Zsb3dUYXNrVmlld2VyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU2Y2JlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy90YXNrcy9Xb3JrZmxvd1Rhc2tWaWV3ZXIuY3NzCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjd29ya2Zsb3dfdGFza190YWJsZXsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLFNhbnMtU2VyaWYsc2Fucy1zZXJpZjsKKyAgYm9yZGVyLXNwYWNpbmc6MnB4OworfQorCisuaGVhZGVyeworCQorfQorCisudmFsdWV7CisJCit9CisKKyN3b3JrZmxvd190YXNrX2NvbmZpZ190Ymx7CisgIGJvcmRlci1zcGFjaW5nOjJweDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLFNhbnMtU2VyaWYsc2Fucy1zZXJpZjsKK30KKworI3dvcmtmbG93X2NvbmZpZ3sKKworfQorCisjd29ya2Zsb3dfY29uZGl0aW9uX3RibHsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy90YXNrcy9Xb3JrZmxvd1Rhc2tWaWV3ZXIuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvdGFza3MvV29ya2Zsb3dUYXNrVmlld2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxOTE4NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dlYmNvbXBvbmVudHMvd29ya2Zsb3cvdGFza3MvV29ya2Zsb3dUYXNrVmlld2VyLmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpwYW5lbD4KKzx3aWNrZXQ6bGluaz4KKyA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJXb3JrZmxvd1Rhc2tWaWV3ZXIuY3NzIi8+Cis8L3dpY2tldDpsaW5rPgorCisKKzx0YWJsZSBpZD0id29ya2Zsb3dfdGFza190YWJsZSI+CisgIDx0cj4KKyAgICA8dGQgY2xhc3M9ImhlYWRlciI+VGFzayBJRDwvdGQ+CisgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+PHNwYW4gd2lja2V0OmlkPSJ3b3JrZmxvd190YXNrX2lkIj51cm46b29kdDpJbnRlbnNpdmVUYXNrV2l0aFdhaXQ8L3NwYW4+PC90ZD4KKyAgPC90cj4KKyAgPHRyPiAgICAgICAJICAgIAkgICAgICAgICAgCisgICAgPHRkIGNsYXNzPSJoZWFkZXIiPk5hbWU8L3RkPgorICAgIDx0ZCBjbGFzcz0idmFsdWUiPjxzcGFuIHdpY2tldDppZD0id29ya2Zsb3dfdGFza19uYW1lIj5JbnRlbnNpdmUgV2FpdGVyPC9zcGFuPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgY2xhc3M9ImhlYWRlciI+SW1wbGVtZW50YXRpb24gQ2xhc3M8L3RkPgorICAgIDx0ZCBjbGFzcz0idmFsdWUiPjxzcGFuIHdpY2tldDppZD0id29ya2Zsb3dfdGFza19jbGFzcyI+Z292Lm5hc2EuanBsLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkxvbmdUYXNrPC9zcGFuPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgY2xhc3M9ImhlYWRlciI+Q29uZmlndXJhdGlvbjwvdGQ+CisgICAgPHRkPgorICAgICAgPHRhYmxlIGlkPSJ3b3JrZmxvd190YXNrX2NvbmZpZ190YmwiPgorICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyIj4KKyAgICAgICAgIDx0ZD5Qcm9wZXJ0eTwvdGQ+CisgICAgICAgICA8dGQ+VmFsdWU8L3RkPgorICAgICAgIDwvdHI+CisgICAgICAgPHRyIHdpY2tldDppZD0id29ya2Zsb3dfY29uZmlnIiBpZD0id29ya2Zsb3dfY29uZmlnIj4KKyAgCSAgICAgPHRkPjxzcGFuIHdpY2tldDppZD0id29ya2Zsb3dfY29uZmlnX3BuYW1lIj5udW1TZWNvbmRzPC9zcGFuPjwvdGQ+CisgIAkgICAgIDx0ZD48c3BhbiB3aWNrZXQ6aWQ9IndvcmtmbG93X2NvbmZpZ19wdmFsdWUiPjYwPC9zcGFuPjwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgY2xhc3M9ImhlYWRlciI+Q29uZGl0aW9uczwvdGQ+CisgICAgICA8dGQ+CisgICAgICAgIDx0YWJsZSBpZD0id29ya2Zsb3dfY29uZGl0aW9uX3RibCI+CisgICAgICAgCSA8dHIgd2lja2V0OmlkPSJ3b3JrZmxvd19jb25kaXRpb25zIj4KKyAgICAgICAJICAgPHRkPjxhIGhyZWY9IiMiIHdpY2tldDppZD0iY29uZGl0aW9uX3BhZ2VfbGluayI+PHNwYW4gd2lja2V0OmlkPSJjb25kaXRpb25fcGxpbmtfbmFtZSI+TG9uZyBDb25kaXRpb248L3NwYW4+PC9hPjwvdGQ+CisgICAgICAgCSA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorIDwvdGFibGU+CisgPC93aWNrZXQ6cGFuZWw+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93ZWJjb21wb25lbnRzL3dvcmtmbG93L3Rhc2tzL1dvcmtmbG93VGFza1ZpZXdlci5qYXZhIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy90YXNrcy9Xb3JrZmxvd1Rhc2tWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI1YjAwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd2ViY29tcG9uZW50cy93b3JrZmxvdy90YXNrcy9Xb3JrZmxvd1Rhc2tWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy50YXNrczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LldvcmtmbG93TWdyQ29ubjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5QYWdlUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmJhc2ljLkxhYmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dUYXNrVmlld2VyIGV4dGVuZHMgUGFuZWwgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODk1MTA5MDc2NTM3MzY0Njk3TDsKKworICBwcml2YXRlIFdvcmtmbG93TWdyQ29ubiB3bTsKKworICAvKioKKyAgICogQHBhcmFtIGlkCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dUYXNrVmlld2VyKFN0cmluZyBpZCwgU3RyaW5nIHdtVXJsU3RyLCBTdHJpbmcgdGFza0lkLCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgV2ViUGFnZT4gY29uZGl0aW9uUGFnZSkgeworICAgIHN1cGVyKGlkKTsKKyAgICB0aGlzLndtID0gbmV3IFdvcmtmbG93TWdyQ29ubih3bVVybFN0cik7CisgICAgZmluYWwgV29ya2Zsb3dUYXNrIHRhc2sgPSB0aGlzLndtLnNhZmVHZXRUYXNrQnlJZCh0YXNrSWQpOworCisgICAgYWRkKG5ldyBMYWJlbCgid29ya2Zsb3dfdGFza19pZCIsIHRhc2suZ2V0VGFza0lkKCkpKTsKKyAgICBhZGQobmV3IExhYmVsKCJ3b3JrZmxvd190YXNrX25hbWUiLCB0YXNrLmdldFRhc2tOYW1lKCkpKTsKKyAgICBhZGQobmV3IExhYmVsKCJ3b3JrZmxvd190YXNrX2NsYXNzIiwgdGFzay5nZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoKSkpOworCisgICAgTGlzdDxTdHJpbmc+IHRhc2tDb25maWdNZXRLZXlOYW1lcyA9IEFycmF5cy5hc0xpc3QodGFzay5nZXRUYXNrQ29uZmlnKCkKKyAgICAgICAgLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKS50b0FycmF5KAorICAgICAgICAgICAgbmV3IFN0cmluZ1t0YXNrLmdldFRhc2tDb25maWcoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpXSkpOworICAgIENvbGxlY3Rpb25zLnNvcnQodGFza0NvbmZpZ01ldEtleU5hbWVzKTsKKworICAgIGFkZChuZXcgTGlzdFZpZXc8U3RyaW5nPigid29ya2Zsb3dfY29uZmlnIiwgbmV3IExpc3RNb2RlbDxTdHJpbmc+KHRhc2tDb25maWdNZXRLZXlOYW1lcykpeworICAgIAorICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08U3RyaW5nPiBpdGVtKSB7CisgICAgICAgIFN0cmluZyBjb25maWdNZXRLZXlOYW1lID0gaXRlbS5nZXRNb2RlbE9iamVjdCgpOworICAgICAgICBTdHJpbmcgY29uZmlnTWV0S2V5VmFsdWUgPSB0YXNrLmdldFRhc2tDb25maWcoKS5nZXRQcm9wZXJ0eShjb25maWdNZXRLZXlOYW1lKTsKKyAgICAgICAgCisgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgid29ya2Zsb3dfY29uZmlnX3BuYW1lIiwgY29uZmlnTWV0S2V5TmFtZSkpOworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIndvcmtmbG93X2NvbmZpZ19wdmFsdWUiLCBjb25maWdNZXRLZXlWYWx1ZSkpOworICAgICAgfQorICAgIH0pOworICAgIAorICAgIGFkZChuZXcgTGlzdFZpZXc8V29ya2Zsb3dDb25kaXRpb24+KCJ3b3JrZmxvd19jb25kaXRpb25zIiwgbmV3IExpc3RNb2RlbDxXb3JrZmxvd0NvbmRpdGlvbj4odGFzay5nZXRDb25kaXRpb25zKCkpKXsKKyAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0VmlldyNwb3B1bGF0ZUl0ZW0ob3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08V29ya2Zsb3dDb25kaXRpb24+IGl0ZW0pIHsKKyAgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgPSBpdGVtLmdldE1vZGVsT2JqZWN0KCk7CisgICAgICAgICBmaW5hbCBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgIHBhcmFtcy5hZGQoImlkIiwgY29uZC5nZXRDb25kaXRpb25JZCgpKTsKKyAgICAgICAgIExpbmsgY29uZExpbmsgPSBuZXcgTGluaygiY29uZGl0aW9uX3BhZ2VfbGluayIpeworICAgICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShjb25kaXRpb25QYWdlLCBwYXJhbXMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBjb25kTGluay5hZGQobmV3IExhYmVsKCJjb25kaXRpb25fcGxpbmtfbmFtZSIsIGNvbmQuZ2V0Q29uZGl0aW9uTmFtZSgpKSk7CisgICAgICAgICAgaXRlbS5hZGQoY29uZExpbmspOworICAgICAgfQorICAgIH0pOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL0hlYWx0aE1vbml0b3IuY3NzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvSGVhbHRoTW9uaXRvci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4NmY2YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL0hlYWx0aE1vbml0b3IuY3NzCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyN3aWRlbm9ib3JkZXJ7CisgIHdpZHRoOjEwMCU7CisgIGJvcmRlcjowcHg7Cit9CisKKyNmbV9zdGF0dXN7CisKK30KKworI3dtX3N0YXR1c3sKKworfQorCisjcm1fc3RhdHVzeworCit9CisKKyNyZXBvcnRfZGF0ZXsKKworfQorCisucm91bmR0YWJsZSB0YWJsZXsKK2JvcmRlci10b3A6IDJweCBzb2xpZCAjYmJiOGE5OworYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNiYmI4YTk7Citib3JkZXItbGVmdDogMnB4IHNvbGlkICNiYmI4YTk7Citib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjYmJiOGE5OworfQorCisubm93cmFweworICB3aGl0ZS1zcGFjZTpub3dyYXA7Cit9CisKKy5oZWFkaW5neworICBmb250LXNpemU6MTRweDsKKyAgZm9udC13ZWlnaHQ6Ym9sZDsKK30KKworLmF2Z19jcmF3bF90aW1leworCit9CisKKy5udW1fY3Jhd2xzeworCit9CisKKy5jcmF3bGVyX25hbWV7CisKK30KKworLmZpbGVfaW5nZXN0X2RhdGV0aW1leworCit9CisKKy5maWxlX3BhdGh7CisKK30KKworLnN0YXR1c19uYW1leworCit9CisKKy5iYXRjaF9zdHViX3VybHsKKworfQorCisuY3Jhd2xlcl9uYW1lX2FuZF91cmx7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL0hlYWx0aE1vbml0b3IuaHRtbCBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL0hlYWx0aE1vbml0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWJiZDBjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvSGVhbHRoTW9uaXRvci5odG1sCkBAIC0wLDAgKzEsMTk0IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OnBhbmVsPgorPHdpY2tldDpyZW1vdmU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJIZWFsdGhNb25pdG9yLmNzcyIvPgorPC93aWNrZXQ6cmVtb3ZlPgorCis8dGFibGUgaWQ9IndpZGVub2JvcmRlciI+CisJPHRyPgorCQk8dGQ+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OmJvbGQ7Ij5QQ1MgU3RhdHVzPC9mb250PjwvdGQ+CisJCTx0ZD4KKwkJPHRhYmxlIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OiI+CisJCQk8dHI+CisJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OiI+Q3VycmVudCBJbmZvcm1hdGlvbiBhcyBvZjo8L3RkPgorCQkJPC90cj4KKwkJCTx0cj4KKwkJCQk8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ6IiB3aWNrZXQ6aWQ9InJlcG9ydF9kYXRlIiBpZD0icmVwb3J0X2RhdGUiPjIwMTEtMDEtMDFUMDA6MDA6MDAuMDAwWjwvdGQ+CisJCQk8L3RyPgorCQk8L3RhYmxlPgorCQk8L3RkPgorCTwvdHI+CisJPHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij4KKwkJPHRkPgorCQk8dGFibGU+CisJCQk8dHI+CisJCQkJPHRkPjxmb250IGNsYXNzPSJoZWFkaW5nIj5TZXJ2ZXIgU3RhdHVzOjwvZm9udD48L3RkPgorCQkJPC90cj4KKwkJCTx0cj4KKwkJCQk8dGQ+CisJCQkJPGRpdiBjbGFzcz0icm91bmR0YWJsZSI+CisJCQkJPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDBweDsiPgorCQkJCQk8dHI+CisJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCIgaWQ9ImZtX3N0YXR1cyI+RmlsZSBNYW5hZ2VyJm5ic3A7KDxzcGFuIHdpY2tldDppZD0iZm11cmwiPmh0dHA6Ly9sb2NhbGhvc3Q6OTAwMDwvc3Bhbj4pPC90ZD4KKwkJCQkJCTx0ZD48aW1nIHdpY2tldDppZD0iZm1zdGF0dXNfaWNvbiIgc3JjPSJpY29uX2Fycm93X3VwLmdpZiIvPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIiBpZD0id21fc3RhdHVzIj5Xb2tmbG93IE1hbmFnZXImbmJzcDsoPHNwYW4gd2lja2V0OmlkPSJ3bXVybCI+aHR0cDovL2xvY2FsaG9zdDo5MDAxPC9zcGFuPik8L3RkPgorCQkJCQkJPHRkPjxpbWcgd2lja2V0OmlkPSJ3bXN0YXR1c19pY29uIiBzcmM9Imljb25fYXJyb3dfZG93bi5naWYiPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIiBpZD0icm1fc3RhdHVzIj5SZXNvdXJjZSBNYW5hZ2VyJm5ic3A7KDxzcGFuIHdpY2tldDppZD0icm11cmwiPmh0dHA6Ly9sb2NhbGhvc3Q6OTAwMjwvc3Bhbj4pPC90ZD4KKwkJCQkJCTx0ZD48aW1nIHdpY2tldDppZD0icm1zdGF0dXNfaWNvbiIgc3JjPSJpY29uX2Fycm93X2Rvd24uZ2lmIj48L3RkPgorCQkJCQk8L3RyPgorCQkJCTwvdGFibGU+CisJCQkJPC9kaXY+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkPjxmb250IGNsYXNzPSJoZWFkaW5nIj5DcmF3bGVyIFN0YXR1czo8L2ZvbnQ+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkPgorCQkJCTxkaXYgY2xhc3M9InJvdW5kdGFibGUiPgorCQkJCTx0YWJsZT4KKwkJCQkgICA8dHIgd2lja2V0OmlkPSJjcmF3bGVyX3N0YXR1c19saXN0Ij4KKwkJCQkgICAgIDx0ZCB3aWNrZXQ6aWQ9ImNyYXdsZXJfbmFtZV9hbmRfdXJsIiBjbGFzcz0iY3Jhd2xlcl9uYW1lX2FuZF91cmwiPkxvY2FsIEZpbGUgQ3Jhd2xlciAoaHR0cDovL2xvY2FsaG9zdDo5MDkxKTwvdGQ+CisJCQkJICAgICA8dGQ+PGltZyB3aWNrZXQ6aWQ9ImNyYXdsZXJfc3RhdHVzX2ljb24iIHNyYz0iaWNvbl9hcnJvd191cC5naWYiIC8+PC90ZD4KKwkJCQkgICA8L3RyPiAJCisJCQkJICAgPHdpY2tldDpjb250YWluZXIgd2lja2V0OmlkPSJjcmF3bGVyX3RvZ2dsZXIiPgorCQkJCSAgIDx3aWNrZXQ6ZW5jbG9zdXJlIGNoaWxkPSJjcmF3bGVyX3N0YXR1c19tb3JlIj4JCQkgICAKKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWNrZXQ6aWQ9ImNyYXdsZXJfc3RhdHVzX21vcmUiIGNvbHNwYW49IjIiPi4uLiAuLi48L3RkPgorCQkJCQk8L3RyPgorCQkJCQk8L3dpY2tldDplbmNsb3N1cmU+CisJCQkJICAgIDx0ciBpZD0iY3Jhd2xlcl9zdGF0dXNfb3B0aW9ucyI+CisJCQkJCSAgIDx0ZD48YSB3aWNrZXQ6aWQ9ImNyYXdsZXJfc3RhdHVzX3Nob3dhbGwiIGhyZWY9IiMiPlNlZSBBbGw8L2E+PC90ZD4KKwkJCQkJICAgPHRkPjxhIHdpY2tldDppZD0iY3Jhd2xlcl9zdGF0dXNfaGlkZSIgImhyZWY9IiMiPkhpZGU8L2E+PC90ZD4KKwkJCQkJICAgPHRkPjxhIHdpY2tldDppZD0iY3Jhd2xlcl9zdGF0dXNfc29ydCIgaHJlZj0iIyI+U29ydGluZyBCeSBTdGF0dXM8L2E+PC90ZD4KKwkJCQkJICAgPHRkPjxhIHdpY2tldDppZD0iY3Jhd2xlcl9zdGF0dXNfdW5zb3J0IiBocmVmPSIjIj5VbnNvcnQ8L2E+PC90ZD4KKwkJCQkJPC90cj4KKwkJCQkJPC93aWNrZXQ6Y29udGFpbmVyPgorCQkJCTwvdGFibGU+CisJCQkJPC9kaXY+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkPjxmb250IGNsYXNzPSJoZWFkaW5nIj5CYXRjaCBTdHViIFN0YXR1czo8L2ZvbnQ+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkPgorCQkJCTxkaXYgY2xhc3M9InJvdW5kdGFibGUiPgorCQkJCTx0YWJsZT4KKwkJCQkJPHRyIHdpY2tldDppZD0iYmF0Y2hfc3R1Yl9saXN0Ij4KKwkJCQkJCTx0ZCBjbGFzcz0ibm93cmFwIj48c3BhbiB3aWNrZXQ6aWQ9ImJhdGNoX3N0dWJfdXJsIiBjbGFzcz0iYmF0Y2hfc3R1Yl91cmwiPmh0dHA6Ly9jb21wdXRlLTAtMToyMDAxPC9zcGFuPjwvdGQ+CisJCQkJCQk8dGQ+PGltZyB3aWNrZXQ6aWQ9ImJhdGNoX3N0dWJfc3RhdHVzX2ljb24iIHNyYz0iaWNvbl9hcnJvd19kb3duLmdpZiIgLz48L3RkPgorCQkJCSAgICA8L3RyPgorCQkJCSAgICA8d2lja2V0OmNvbnRhaW5lciB3aWNrZXQ6aWQ9ImJhdGNoX3N0dWJfdG9nZ2xlciI+CisJCQkJICAgIDx3aWNrZXQ6ZW5jbG9zdXJlIGNoaWxkPSJiYXRjaF9zdHViX21vcmUiPgorCQkJCSAgICA8dHI+CisJCQkJCQk8dGQgd2lja2V0OmlkPSJiYXRjaF9zdHViX21vcmUiIGNvbHNwYW49IjIiPi4uLiAuLi48L3RkPjwvdHI+PHRyPgkJCQkgICAgIAorCQkJCSAgICA8L3RyPgorCQkJCSAgICA8L3dpY2tldDplbmNsb3N1cmU+CisJCQkJCTx0ciBpZD0iYmF0Y2hfc3R1Yl9vcHRpb25zIj4KKwkJCQkJCTx0ZD48YSB3aWNrZXQ6aWQ9ImJhdGNoX3N0dWJfc2hvd2FsbCIgaHJlZj0iIyI+U2VlIEFsbDwvYT48L3RkPgorCQkJCQkJPHRkPjxhIHdpY2tldDppZD0iYmF0Y2hfc3R1Yl9oaWRlIiBocmVmPSIjIj5IaWRlPC9hPjwvdGQ+CisJCQkJCQk8dGQ+PGEgd2lja2V0OmlkPSJiYXRjaF9zdHViX3NvcnQiIGhyZWY9IiMiPlNvcnRpbmcgQnkgU3RhdHVzPC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgd2lja2V0OmlkPSJiYXRjaF9zdHViX3Vuc29ydCIgaHJlZj0iIyI+VW5zb3J0PC9hPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTwvd2lja2V0OmNvbnRhaW5lcj4KKwkJCQk8L3RhYmxlPgorCQkJCTwvZGl2PgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQk8L3RhYmxlPgorCQk8L3RkPgorCQk8dGQ+CisJCTx0YWJsZT4KKwkJCTx0cj4KKwkJCQk8dGQ+PGZvbnQgY2xhc3M9ImhlYWRpbmciPkpvYiBQcm9jZXNzaW5nIFN0YXR1czo8L2ZvbnQ+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkPgorCQkJCTxkaXYgY2xhc3M9InJvdW5kdGFibGUiPgorCQkJCTx0YWJsZSBzdHlsZT0id2lkdGg6MTAwcHg7Ij4KKwkJCQkJPHRyIHdpY2tldDppZD0iam9ic3RhdHVzX2xpc3QiPgorCQkJCQkgIDx0ZCBjbGFzcz0ibm93cmFwIj4KKwkJCQkJCTxzcGFuIHdpY2tldDppZD0ic3RhdHVzX25hbWUiIGNsYXNzPSJzdGF0dXNfbmFtZSI+UVVFVUVEPC9zcGFuPiBwaXBlbGluZXMKKwkJCQkgICAgICA8L3RkPgorCQkJCQkgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+CQorCQkJCQkJPGEgaHJlZj0iIyIgd2lja2V0OmlkPSJqb2JzdGF0dXNfY291bnRfbGluayI+PHNwYW4gaWQ9InN0YXR1c19udW1fam9icyIgd2lja2V0OmlkPSJzdGF0dXNfbnVtX2pvYnMiPjI1MDwvc3Bhbj48L2E+CisJCQkJCSAgPC90ZD4JCisJCQkJCTwvdHI+CisJCQkJCQk8d2lja2V0OnJlbW92ZT4KKwkJCQkJCSA8dHI+PHRkIGNsYXNzPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJzdGF0dXNfbmFtZSI+U1RBUlRFRDwvc3Bhbj4gcGlwZWxpbmVzPC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiMiPjM8L2E+PC90ZD48L3RyPgorCQkJCQkJIDx0cj48dGQgY2xhc3M9Im5vd3JhcCI+PHNwYW4gY2xhc3M9InN0YXR1c19uYW1lIj5SU1VCTUlUPC9zcGFuPiBwaXBlbGluZXM8L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGEgaHJlZj0iIyI+NDU8L2E+PC90ZD48L3RyPgorCQkJCQkJIDx0cj48dGQgY2xhc3M9Im5vd3JhcCI+PHNwYW4gY2xhc3M9InN0YXR1c19uYW1lIj5QR0VfRVhFQzwvc3Bhbj4gcGlwZWxpbmVzPC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiMiPjEwMDA8L2E+PC90ZD48L3RyPgorCQkJCQkJIDx0cj48dGQgY2xhc3M9Im5vd3JhcCI+PHNwYW4gY2xhc3M9InN0YXR1c19uYW1lIj5DUkFXTElORzwvc3Bhbj4gcGlwZWxpbmVzPC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiMiPjQ8L2E+PC90ZD48L3RyPgorCQkJCQkJIDx0cj48dGQgY2xhc3M9Im5vd3JhcCI+PHNwYW4gY2xhc3M9InN0YXR1c19uYW1lIj5GSU5JU0hFRDwvc3Bhbj4gcGlwZWxpbmVzPC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiMiPjEwMDAwPC9hPjwvdGQ+PC90cj4KKwkJCQkJCTwvd2lja2V0OnJlbW92ZT4JCQkJCQkKKwkJCQk8L3RhYmxlPgorCQkJCTwvZGl2PgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPHRyPgorCQkJCTx0ZD48Zm9udCBjbGFzcz0iaGVhZGluZyI+TGF0ZXN0IEZpbGVzIEluZ2VzdGVkOjwvZm9udD48L3RkPgorCQkJPC90cj4KKwkJCTx0cj4KKwkJCQk8dGQ+CisJCQkJPGRpdiBjbGFzcz0icm91bmR0YWJsZSI+CisJCQkJPHRhYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHRyIHdpY2tldDppZD0iZmlsZV9oZWFsdGhfbGlzdCI+CisgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKwkJCQkJCTxhIGhyZWY9IiMiIHdpY2tldDppZD0idmlld19wcm9kdWN0X2xpbmsiPjxzcGFuIHdpY2tldDppZD0iZmlsZV9wYXRoIiBjbGFzcz0iZmlsZV9wYXRoIj4vZGF0YS9hcmNoaXZlL3Byb2R1Y3RzL2ZpbGUxLnR4dDwvc3Bhbj48L2E+IGF0IDxzcGFuIHdpY2tldDppZD0iZmlsZV9pbmdlc3RfZGF0ZXRpbWUiIGNsYXNzPSJmaWxlX2luZ2VzdF9kYXRldGltZSI+MjAxMS0wMS0wMVQwMDowMTowMS4wMDFaPC9zcGFuPgorCQkJCQkgICA8L3RkPgorCQkJCQkgPC90cj4KKwkJCQk8L3RhYmxlPgorCQkJCTwvZGl2PgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPHRyPgorCQkJCTx0ZD48Zm9udCBjbGFzcz0iaGVhZGluZyI+Q3Jhd2xlciBTdGF0aXN0aWNzOjwvZm9udD48L3RkPgorCQkJPC90cj4KKwkJCTx0cj4KKwkJCQk8dGQ+CisJCQkJPGRpdiBjbGFzcz0icm91bmR0YWJsZSI+CisJCQkJPHRhYmxlPgorCQkJCQkgPHRyIHdpY2tldDppZD0iY3Jhd2xlcl9oZWFsdGhfbGlzdCI+CisJCQkJCQk8dGQgY2xhc3M9Im5vd3JhcCIgY29sc3Bhbj0iMiI+PHNwYW4gd2lja2V0OmlkPSJjcmF3bGVyX25hbWUiIGNsYXNzPSJjcmF3bGVyX25hbWUiPkxvY2FsIEZpbGUgQ3Jhd2xlcjwvc3Bhbj4gTnVtYmVyIG9mIENyYXdsczogPHNwYW4gd2lja2V0OmlkPSJudW1fY3Jhd2xzIiBjbGFzcz0ibnVtX2NyYXdscyI+MzI8L3NwYW4+IEF2ZyBUaW1lOiA8c3BhbiB3aWNrZXQ6aWQ9ImF2Z19jcmF3bF90aW1lIiBjbGFzcz0iYXZnX2NyYXdsX3RpbWUiPjU8L3NwYW4+IHNlYworCQkJCQkJPC90ZD4KKwkJCQkJICAgPC90cj4KKwkJCQkJPHdpY2tldDpjb250YWluZXIgd2lja2V0OmlkPSJjcmF3bGVyX2hlYWx0aF90b2dnbGVyIj4KKwkJCQkJPHdpY2tldDplbmNsb3N1cmUgY2hpbGQ9ImNyYXdsZXJfaGVhbHRoX21vcmUiPgorCQkJCSAgICA8dHI+CisJCQkJCQk8dGQgY29sc3Bhbj0iMiIgd2lja2V0OmlkPSJjcmF3bGVyX2hlYWx0aF9tb3JlIj4uLi4gLi4uPC90ZD4KKwkJCQkgICAgPC90cj4KKwkJCQkgICAgPC93aWNrZXQ6ZW5jbG9zdXJlPgorCQkJCSAgICA8dHI+CisJCQkJCQk8dGQ+PGEgd2lja2V0OmlkPSJjcmF3bGVyX2hlYWx0aF9zaG93YWxsIiBocmVmPSIjIj5TZWUgQWxsPC9hPjwvdGQ+CisJCQkJCQk8dGQ+PGEgd2lja2V0OmlkPSJjcmF3bGVyX2hlYWx0aF9oaWRlIiBocmVmPSIjIj5IaWRlPC9hPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTwvd2lja2V0OmNvbnRhaW5lcj4KKwkJCQk8L3RhYmxlPgorCQkJCTwvZGl2PgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQk8L3RhYmxlPgorCQk8L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPC93aWNrZXQ6cGFuZWw+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL2hlYWx0aC9IZWFsdGhNb25pdG9yLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL2hlYWx0aC9IZWFsdGhNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNTRlMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL0hlYWx0aE1vbml0b3IuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wY3Mud2ViY29tcG9uZW50cy5oZWFsdGg7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLkNyYXdsZXJIZWFsdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguQ3Jhd2xlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5Kb2JIZWFsdGhTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguUENTRGFlbW9uU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MuaGVhbHRoLlBDU0hlYWx0aE1vbml0b3JSZXBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy50b29scy5QQ1NIZWFsdGhNb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MudXRpbC5GaWxlTWFuYWdlclV0aWxzOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVzb3VyY2VSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5pbWFnZS5JbWFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLnBhbmVsLlBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLnV0aWwuTGlzdE1vZGVsOworCisvKioKKyAqIAorICogQSB3aWNrZXQgY29udHJvbGxlciBmb3IgZXhwb3NpbmcgdGhlIHN1cGVyIGF3ZXNvbWUgcG93ZXIgb2YgdGhlCisgKiB7QGxpbmsgUENTSGVhbHRoTW9uaXRvcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSGVhbHRoTW9uaXRvciBleHRlbmRzIFBhbmVsIHsKKworICAvKioKKyAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgSGVhbHRoTW9uaXRvcihTdHJpbmcgaWQsIFN0cmluZyBmbVVybFN0ciwgU3RyaW5nIHdtVXJsU3RyLAorICAgICAgU3RyaW5nIHJtVXJsU3RyLCBTdHJpbmcgY3Jhd2xlckNvbmZGaWxlUGF0aCwgU3RyaW5nIHN0YXRlc0ZpbGVQYXRoLAorICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdlYlBhZ2U+IHByb2R1Y3RCcm93c2VyLAorICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdlYlBhZ2U+IGluc3RhbmNlc1BhZ2UpCisgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgc3VwZXIoaWQpOworICAgIFBDU0hlYWx0aE1vbml0b3IgbW9uID0gbmV3IFBDU0hlYWx0aE1vbml0b3IoZm1VcmxTdHIsIHdtVXJsU3RyLCBybVVybFN0ciwKKyAgICAgICAgY3Jhd2xlckNvbmZGaWxlUGF0aCwgc3RhdGVzRmlsZVBhdGgpOworICAgIGZpbmFsIFBDU0hlYWx0aE1vbml0b3JSZXBvcnQgcmVwb3J0ID0gbW9uLmdldFJlcG9ydCgpOworCisgICAgYWRkKG5ldyBMYWJlbCgicmVwb3J0X2RhdGUiLCByZXBvcnQuZ2V0Q3JlYXRlRGF0ZUlzb0Zvcm1hdCgpKSk7CisgICAgYWRkKG5ldyBMYWJlbCgiZm11cmwiLCByZXBvcnQuZ2V0Rm1TdGF0dXMoKS5nZXRVcmxTdHIoKSkpOworICAgIGFkZChuZXcgTGFiZWwoIndtdXJsIiwgcmVwb3J0LmdldFdtU3RhdHVzKCkuZ2V0VXJsU3RyKCkpKTsKKyAgICBhZGQobmV3IExhYmVsKCJybXVybCIsIHJlcG9ydC5nZXRSbVN0YXR1cygpLmdldFVybFN0cigpKSk7CisKKyAgICBhZGQobmV3IEltYWdlKCJmbXN0YXR1c19pY29uIiwgZ2V0VXBPckRvd25BcnJvd1JlZihyZXBvcnQuZ2V0Rm1TdGF0dXMoKQorICAgICAgICAuZ2V0U3RhdHVzKCkpKSk7CisgICAgYWRkKG5ldyBJbWFnZSgid21zdGF0dXNfaWNvbiIsIGdldFVwT3JEb3duQXJyb3dSZWYocmVwb3J0LmdldFdtU3RhdHVzKCkKKyAgICAgICAgLmdldFN0YXR1cygpKSkpOworICAgIGFkZChuZXcgSW1hZ2UoInJtc3RhdHVzX2ljb24iLCBnZXRVcE9yRG93bkFycm93UmVmKHJlcG9ydC5nZXRSbVN0YXR1cygpCisgICAgICAgIC5nZXRTdGF0dXMoKSkpKTsKKworICAgIExpc3RNb2RlbCBjcmF3bGVyU3RhdHVzTGlzdE1vZGVsID0gbmV3IExpc3RNb2RlbChyZXBvcnQuZ2V0Q3Jhd2xlclN0YXR1cygpKTsKKyAgICBhZGQobmV3IFZpc2liaWxpdHlBbmRTb3J0VG9nZ2xlcigiY3Jhd2xlcl90b2dnbGVyIiwKKyAgICAgICAgImNyYXdsZXJfc3RhdHVzX3Nob3dhbGwiLCAiY3Jhd2xlcl9zdGF0dXNfaGlkZSIsICJjcmF3bGVyX3N0YXR1c19zb3J0IiwKKyAgICAgICAgImNyYXdsZXJfc3RhdHVzX3Vuc29ydCIsICJjcmF3bGVyX3N0YXR1c19tb3JlIiwgY3Jhd2xlclN0YXR1c0xpc3RNb2RlbCkpOworCisgICAgYWRkKG5ldyBMaXN0VmlldzxDcmF3bGVyU3RhdHVzPigiY3Jhd2xlcl9zdGF0dXNfbGlzdCIsCisgICAgICAgIGNyYXdsZXJTdGF0dXNMaXN0TW9kZWwpIHsKKyAgICAgIC8qCisgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUKKyAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08Q3Jhd2xlclN0YXR1cz4gc3RhdHVzSXRlbSkgeworICAgICAgICBDcmF3bGVyU3RhdHVzIHN0YXR1cyA9IHN0YXR1c0l0ZW0uZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgU3RyaW5nIHN0YXR1c1N0cmluZyA9IHN0YXR1cy5nZXRJbmZvKCkuZ2V0Q3Jhd2xlck5hbWUoKSArICIgKCIKKyAgICAgICAgICAgICsgc3RhdHVzLmdldENyYXdsSG9zdCgpICsgIjoiICsgc3RhdHVzLmdldEluZm8oKS5nZXRDcmF3bGVyUG9ydCgpCisgICAgICAgICAgICArICIpIjsKKyAgICAgICAgc3RhdHVzSXRlbS5hZGQobmV3IExhYmVsKCJjcmF3bGVyX25hbWVfYW5kX3VybCIsIHN0YXR1c1N0cmluZykpOworICAgICAgICBzdGF0dXNJdGVtLmFkZChuZXcgSW1hZ2UoImNyYXdsZXJfc3RhdHVzX2ljb24iLAorICAgICAgICAgICAgZ2V0VXBPckRvd25BcnJvd1JlZihzdGF0dXMuZ2V0U3RhdHVzKCkpKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBMaXN0TW9kZWwgYmF0Y2hTdHViU3RhdHVzTGlzdE1vZGVsID0gbmV3IExpc3RNb2RlbCgKKyAgICAgICAgcmVwb3J0LmdldEJhdGNoU3R1YlN0YXR1cygpKTsKKyAgICBhZGQobmV3IFZpc2liaWxpdHlBbmRTb3J0VG9nZ2xlcigiYmF0Y2hfc3R1Yl90b2dnbGVyIiwKKyAgICAgICAgImJhdGNoX3N0dWJfc2hvd2FsbCIsICJiYXRjaF9zdHViX2hpZGUiLCAiYmF0Y2hfc3R1Yl9zb3J0IiwKKyAgICAgICAgImJhdGNoX3N0dWJfdW5zb3J0IiwgImJhdGNoX3N0dWJfbW9yZSIsIGJhdGNoU3R1YlN0YXR1c0xpc3RNb2RlbCkpOworCisgICAgYWRkKG5ldyBMaXN0VmlldzxQQ1NEYWVtb25TdGF0dXM+KCJiYXRjaF9zdHViX2xpc3QiLAorICAgICAgICBiYXRjaFN0dWJTdGF0dXNMaXN0TW9kZWwpIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08UENTRGFlbW9uU3RhdHVzPiBpdGVtKSB7CisgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgiYmF0Y2hfc3R1Yl91cmwiLCBpdGVtLmdldE1vZGVsT2JqZWN0KCkuZ2V0VXJsU3RyKCkpKTsKKyAgICAgICAgaXRlbS5hZGQobmV3IEltYWdlKCJiYXRjaF9zdHViX3N0YXR1c19pY29uIiwgZ2V0VXBPckRvd25BcnJvd1JlZihpdGVtCisgICAgICAgICAgICAuZ2V0TW9kZWxPYmplY3QoKS5nZXRTdGF0dXMoKSkpKTsKKworICAgICAgfQorICAgIH0pOworCisgICAgTGlzdDxKb2JIZWFsdGhTdGF0dXM+IGpvYkhlYWx0aFN0YXR1c0xpc3QgPSByZXBvcnQuZ2V0Sm9iSGVhbHRoU3RhdHVzKCk7CisgICAgYWRkKG5ldyBMaXN0VmlldzxKb2JIZWFsdGhTdGF0dXM+KCJqb2JzdGF0dXNfbGlzdCIsIGpvYkhlYWx0aFN0YXR1c0xpc3QpIHsKKyAgICAgIC8qCisgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUKKyAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oZmluYWwgTGlzdEl0ZW08Sm9iSGVhbHRoU3RhdHVzPiBpdGVtKSB7CisgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgic3RhdHVzX25hbWUiLCBpdGVtLmdldE1vZGVsT2JqZWN0KCkuZ2V0U3RhdHVzKCkpKTsKKyAgICAgICAgTGluazxTdHJpbmc+IGNvdW50TGluayA9IG5ldyBMaW5rPFN0cmluZz4oImpvYnN0YXR1c19jb3VudF9saW5rIiwKKyAgICAgICAgICAgIG5ldyBNb2RlbDxTdHJpbmc+KGl0ZW0uZ2V0TW9kZWxPYmplY3QoKS5nZXRTdGF0dXMoKSkpIHsKKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQoInBhZ2VOdW0iLCAiMSIpOworICAgICAgICAgICAgcGFyYW1zLmFkZCgic3RhdHVzIiwgZ2V0TW9kZWxPYmplY3QoKSk7CisgICAgICAgICAgICBzZXRSZXNwb25zZVBhZ2UoaW5zdGFuY2VzUGFnZSwgcGFyYW1zKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGNvdW50TGluay5hZGQobmV3IExhYmVsKCJzdGF0dXNfbnVtX2pvYnMiLCBTdHJpbmcudmFsdWVPZihpdGVtCisgICAgICAgICAgICAuZ2V0TW9kZWxPYmplY3QoKS5nZXROdW1QaXBlbGluZXMoKSkpKTsKKyAgICAgICAgaXRlbS5hZGQoY291bnRMaW5rKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIExpc3Q8UHJvZHVjdD4gcHJvZExpc3QgPSByZXBvcnQuZ2V0TGF0ZXN0UHJvZHVjdHNJbmdlc3RlZCgpOworICAgIGZpbmFsIEZpbGVNYW5hZ2VyVXRpbHMgZm0gPSBuZXcgRmlsZU1hbmFnZXJVdGlscyhmbVVybFN0cik7CisKKyAgICBhZGQobmV3IExpc3RWaWV3PFByb2R1Y3Q+KCJmaWxlX2hlYWx0aF9saXN0IiwgcHJvZExpc3QpIHsKKyAgICAgIC8qCisgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUKKyAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08UHJvZHVjdD4gaXRlbSkgeworICAgICAgICBmaW5hbCBQcm9kdWN0IHByb2R1Y3QgPSBpdGVtLmdldE1vZGVsT2JqZWN0KCk7CisgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUoZm0uc2FmZUdldFByb2R1Y3RUeXBlQnlJZChwcm9kdWN0CisgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGUoKS5nZXRQcm9kdWN0VHlwZUlkKCkpKTsKKyAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhmbS5zYWZlR2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCkpOworICAgICAgICBmaW5hbCBNZXRhZGF0YSBwcm9kTWV0ID0gZm0uc2FmZUdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZVBhdGggPSBmbS5nZXRGaWxlUGF0aChwcm9kdWN0KTsKKworICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluaygidmlld19wcm9kdWN0X2xpbmsiKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICogCisgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgICAgICovCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICAgIFBhZ2VQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYWdlUGFyYW1ldGVycygpOworICAgICAgICAgICAgcGFyYW1zLmFkZCgiaWQiLCBwcm9kdWN0LmdldFByb2R1Y3RJZCgpKTsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShwcm9kdWN0QnJvd3NlciwgcGFyYW1zKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbGluay5hZGQobmV3IExhYmVsKCJmaWxlX3BhdGgiLCBmaWxlUGF0aCkpOworICAgICAgICBpdGVtLmFkZChsaW5rKTsKKyAgICAgICAgaXRlbS5hZGQobmV3IExhYmVsKCJmaWxlX2luZ2VzdF9kYXRldGltZSIsIHByb2RNZXQuZ2V0TWV0YWRhdGEoIkNBUy4iCisgICAgICAgICAgICArIENvcmVNZXRLZXlzLlBST0RVQ1RfUkVDRVZJRURfVElNRSkpKTsKKworICAgICAgfQorICAgIH0pOworCisgICAgTGlzdE1vZGVsIGNyYXdsZXJIZWFsdGhMaXN0TW9kZWwgPSBuZXcgTGlzdE1vZGVsKAorICAgICAgICByZXBvcnQuZ2V0Q3Jhd2xlckhlYWx0aFN0YXR1cygpKTsKKyAgICBhZGQobmV3IFZpc2liaWxpdHlUb2dnbGVyKCJjcmF3bGVyX2hlYWx0aF90b2dnbGVyIiwKKyAgICAgICAgImNyYXdsZXJfaGVhbHRoX3Nob3dhbGwiLCAiY3Jhd2xlcl9oZWFsdGhfaGlkZSIsICJjcmF3bGVyX2hlYWx0aF9tb3JlIiwKKyAgICAgICAgY3Jhd2xlckhlYWx0aExpc3RNb2RlbCkpOworCisgICAgYWRkKG5ldyBMaXN0VmlldzxDcmF3bGVySGVhbHRoPigiY3Jhd2xlcl9oZWFsdGhfbGlzdCIsCisgICAgICAgIGNyYXdsZXJIZWFsdGhMaXN0TW9kZWwpIHsKKyAgICAgIC8qCisgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUKKyAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAqIC53aWNrZXQubWFya3VwLmh0bWwubGlzdC5MaXN0SXRlbSkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUl0ZW0oTGlzdEl0ZW08Q3Jhd2xlckhlYWx0aD4gaXRlbSkgeworICAgICAgICBDcmF3bGVySGVhbHRoIGhlYWx0aCA9IGl0ZW0uZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgaXRlbS5hZGQobmV3IExhYmVsKCJjcmF3bGVyX25hbWUiLCBoZWFsdGguZ2V0Q3Jhd2xlck5hbWUoKSkpOworICAgICAgICBpdGVtLmFkZChuZXcgTGFiZWwoIm51bV9jcmF3bHMiLCBTdHJpbmcudmFsdWVPZihoZWFsdGguZ2V0TnVtQ3Jhd2xzKCkpKSk7CisgICAgICAgIGl0ZW0uYWRkKG5ldyBMYWJlbCgiYXZnX2NyYXdsX3RpbWUiLCBTdHJpbmcudmFsdWVPZihoZWFsdGgKKyAgICAgICAgICAgIC5nZXRBdmdDcmF3bFRpbWUoKSkpKTsKKyAgICAgIH0KKyAgICB9KTsKKworICB9CisKKyAgcHJpdmF0ZSBSZXNvdXJjZVJlZmVyZW5jZSBnZXRVcE9yRG93bkFycm93UmVmKFN0cmluZyBzdGF0dXMpIHsKKyAgICByZXR1cm4gbmV3IFJlc291cmNlUmVmZXJlbmNlKEhlYWx0aE1vbml0b3IuY2xhc3MsICJpY29uX2Fycm93XyIKKyAgICAgICAgKyBzdGF0dXMudG9Mb3dlckNhc2UoKSArICIuZ2lmIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvVmlzaWJpbGl0eUFuZFNvcnRUb2dnbGVyLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL2hlYWx0aC9WaXNpYmlsaXR5QW5kU29ydFRvZ2dsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU4OTEwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvVmlzaWJpbGl0eUFuZFNvcnRUb2dnbGVyLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLndlYmNvbXBvbmVudHMuaGVhbHRoOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5oZWFsdGguQ3Jhd2xlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucGNzLmhlYWx0aC5QQ1NEYWVtb25TdGF0dXM7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubW9kZWwudXRpbC5MaXN0TW9kZWw7CisKKy8qKgorICogCisgKiBUb2dnbGVzIGJvdGggYSBzaG93L2hpZGUgbGluayBhbmQgYSBzb3J0L3Vuc29ydCBsaW5rIGZvciBkaXNwbGF5aW5nCisgKiBQQ1NEYWVtb25TdGF0dXMgYW5kIENyYXdsZXJTdGF0dXMgaW4gdGhlIFBDUyBPUFNVSSBndWkuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitjbGFzcyBWaXNpYmlsaXR5QW5kU29ydFRvZ2dsZXIgZXh0ZW5kcyBWaXNpYmlsaXR5VG9nZ2xlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTAwMzUwMjMwMzQ3Mzc0MTkzN0w7CisKKyAgLyoqCisgICAqIEBwYXJhbSBpZAorICAgKi8KKyAgcHVibGljIFZpc2liaWxpdHlBbmRTb3J0VG9nZ2xlcihTdHJpbmcgaWQsIFN0cmluZyBzaG93TGlua0lkLAorICAgICAgU3RyaW5nIGhpZGVMaW5rSWQsIFN0cmluZyBzb3J0TGlua0lkLCBTdHJpbmcgdW5zb3J0TGlua0lkLCBTdHJpbmcgbW9yZUlkLAorICAgICAgZmluYWwgTGlzdE1vZGVsIG1vZGVsKSB7CisgICAgc3VwZXIoaWQsIHNob3dMaW5rSWQsIGhpZGVMaW5rSWQsIG1vcmVJZCwgbW9kZWwpOworCisgICAgTGluazxMaW5rPiBzb3J0TGluayA9IG51bGw7CisgICAgTGluazxMaW5rPiB1bnNvcnRMaW5rID0gbnVsbDsKKworICAgIHNvcnRMaW5rID0gbmV3IExpbms8TGluaz4oc29ydExpbmtJZCwgbmV3IE1vZGVsPExpbms+KHVuc29ydExpbmspKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBWZWN0b3Igb2JqID0gKFZlY3RvcikgbW9kZWwuZ2V0T2JqZWN0KCk7CisgICAgICAgIHNvcnRCeVN0YXR1cyhvYmopOworICAgICAgICBtb2RlbC5zZXRPYmplY3Qob2JqKTsKKyAgICAgICAgZ2V0TW9kZWxPYmplY3QoKS5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdW5zb3J0TGluayA9IG5ldyBMaW5rPExpbms+KHVuc29ydExpbmtJZCwgbmV3IE1vZGVsPExpbms+KHNvcnRMaW5rKSkgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgVmVjdG9yIG9iaiA9IChWZWN0b3IpIG1vZGVsLmdldE9iamVjdCgpOworICAgICAgICBzb3J0QnlOYW1lKG9iaik7CisgICAgICAgIG1vZGVsLnNldE9iamVjdChvYmopOworICAgICAgICBnZXRNb2RlbE9iamVjdCgpLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgIHNldFZpc2libGUoZmFsc2UpOworICAgICAgfQorICAgIH07CisKKyAgICB1bnNvcnRMaW5rLnNldFZpc2libGUoZmFsc2UpOworICAgIHNvcnRMaW5rLnNldE1vZGVsT2JqZWN0KHVuc29ydExpbmspOworICAgIHVuc29ydExpbmsuc2V0TW9kZWxPYmplY3Qoc29ydExpbmspOworCisgICAgYWRkKHNvcnRMaW5rKTsKKyAgICBhZGQodW5zb3J0TGluayk7CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgc29ydEJ5U3RhdHVzKExpc3Qgc3RhdHVzTGlzdCkgeworICAgIENvbGxlY3Rpb25zLnNvcnQoc3RhdHVzTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7CisKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAobzEgaW5zdGFuY2VvZiBDcmF3bGVyU3RhdHVzKSB7CisgICAgICAgICAgQ3Jhd2xlclN0YXR1cyBzdGF0MSA9IChDcmF3bGVyU3RhdHVzKSBvMTsKKyAgICAgICAgICBDcmF3bGVyU3RhdHVzIHN0YXQyID0gKENyYXdsZXJTdGF0dXMpIG8yOworCisgICAgICAgICAgcmV0dXJuIHN0YXQxLmdldFN0YXR1cygpLmNvbXBhcmVUbyhzdGF0Mi5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBQQ1NEYWVtb25TdGF0dXMpIHsKKyAgICAgICAgICBQQ1NEYWVtb25TdGF0dXMgc3RhdDEgPSAoUENTRGFlbW9uU3RhdHVzKSBvMTsKKyAgICAgICAgICBQQ1NEYWVtb25TdGF0dXMgc3RhdDIgPSAoUENTRGFlbW9uU3RhdHVzKSBvMjsKKworICAgICAgICAgIHJldHVybiBzdGF0MS5nZXRTdGF0dXMoKS5jb21wYXJlVG8oc3RhdDIuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgIH0pOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0QnlOYW1lKExpc3Qgc3RhdHVzTGlzdCkgeworICAgIENvbGxlY3Rpb25zLnNvcnQoc3RhdHVzTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7CisKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAobzEgaW5zdGFuY2VvZiBDcmF3bGVyU3RhdHVzKSB7CisgICAgICAgICAgQ3Jhd2xlclN0YXR1cyBzdGF0MSA9IChDcmF3bGVyU3RhdHVzKSBvMTsKKyAgICAgICAgICBDcmF3bGVyU3RhdHVzIHN0YXQyID0gKENyYXdsZXJTdGF0dXMpIG8yOworCisgICAgICAgICAgcmV0dXJuIHN0YXQxLmdldEluZm8oKS5nZXRDcmF3bGVyTmFtZSgpCisgICAgICAgICAgICAgIC5jb21wYXJlVG8oc3RhdDIuZ2V0SW5mbygpLmdldENyYXdsZXJOYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgUENTRGFlbW9uU3RhdHVzKSB7CisgICAgICAgICAgUENTRGFlbW9uU3RhdHVzIHN0YXQxID0gKFBDU0RhZW1vblN0YXR1cykgbzE7CisgICAgICAgICAgUENTRGFlbW9uU3RhdHVzIHN0YXQyID0gKFBDU0RhZW1vblN0YXR1cykgbzI7CisKKyAgICAgICAgICByZXR1cm4gc3RhdDEuZ2V0RGFlbW9uTmFtZSgpLmNvbXBhcmVUbyhzdGF0Mi5nZXREYWVtb25OYW1lKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgIH0pOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL1Zpc2liaWxpdHlUb2dnbGVyLmphdmEgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL2hlYWx0aC9WaXNpYmlsaXR5VG9nZ2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNmM5YjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL2hlYWx0aC9WaXNpYmlsaXR5VG9nZ2xlci5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnBjcy53ZWJjb21wb25lbnRzLmhlYWx0aDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJNYXJrdXBDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1vZGVsLnV0aWwuTGlzdE1vZGVsOworCisvKioKKyAqIAorICogVG9nZ2xlcyBhIHNob3cvaGlkZSBsaW5rIGZvciBkaXNwbGF5aW5nIFBDU0RhZW1vblN0YXR1cyBhbmQgQ3Jhd2xlclN0YXR1cyBpbgorICogdGhlIFBDUyBPUFNVSSBndWkuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVmlzaWJpbGl0eVRvZ2dsZXIgZXh0ZW5kcyBXZWJNYXJrdXBDb250YWluZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MzI1NDg2NTQ3MDc4MzA4NDYxTDsKKworICAvKioKKyAgICogQHBhcmFtIGlkCisgICAqLworICBwdWJsaWMgVmlzaWJpbGl0eVRvZ2dsZXIoU3RyaW5nIGlkLCBTdHJpbmcgc2hvd0xpbmtJZCwgU3RyaW5nIGhpZGVMaW5rSWQsCisgICAgICBTdHJpbmcgbW9yZUlkLCBmaW5hbCBMaXN0TW9kZWwgbW9kZWwpIHsKKyAgICBzdXBlcihpZCwgbW9kZWwpOworCisgICAgTGluazxMaW5rPiBzaG93TGluayA9IG51bGw7CisgICAgTGluazxMaW5rPiBoaWRlTGluayA9IG51bGw7CisgICAgZmluYWwgVmVjdG9yIGFsbFN0YXR1c0xpc3QgPSAoVmVjdG9yKSAoKFZlY3RvcikgbW9kZWwuZ2V0T2JqZWN0KCkpLmNsb25lKCk7CisKKyAgICAvLyBzdWJzZXQgdGhlIG1vZGVsCisgICAgbW9kZWwuc2V0T2JqZWN0KHN1YnNldE1vZGVsT2JqZWN0KG1vZGVsLmdldE9iamVjdCgpKSk7CisgICAgZmluYWwgV2ViTWFya3VwQ29udGFpbmVyIG1vcmVDb21wb25lbnQgPSBuZXcgV2ViTWFya3VwQ29udGFpbmVyKG1vcmVJZCk7CisgICAgYWRkKG1vcmVDb21wb25lbnQpOworCisgICAgc2hvd0xpbmsgPSBuZXcgTGluazxMaW5rPihzaG93TGlua0lkLCBuZXcgTW9kZWw8TGluaz4oaGlkZUxpbmspKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBWZWN0b3Igb2JqID0gKFZlY3RvcikgbW9kZWwuZ2V0T2JqZWN0KCk7CisgICAgICAgIG9iai5jbGVhcigpOworICAgICAgICBvYmouYWRkQWxsKGFsbFN0YXR1c0xpc3QpOworICAgICAgICBtb2RlbC5zZXRPYmplY3Qob2JqKTsKKyAgICAgICAgbW9yZUNvbXBvbmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZ2V0TW9kZWxPYmplY3QoKS5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgaGlkZUxpbmsgPSBuZXcgTGluazxMaW5rPihoaWRlTGlua0lkLCBuZXcgTW9kZWw8TGluaz4oc2hvd0xpbmspKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBWZWN0b3Igb2JqID0gKFZlY3RvcikgbW9kZWwuZ2V0T2JqZWN0KCk7CisgICAgICAgIG9iai5jbGVhcigpOworICAgICAgICBvYmouYWRkQWxsKGdldFRvcE4oYWxsU3RhdHVzTGlzdCwgMykpOworICAgICAgICBtb2RlbC5zZXRPYmplY3Qob2JqKTsKKyAgICAgICAgZ2V0TW9kZWxPYmplY3QoKS5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgbW9yZUNvbXBvbmVudC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgfQorICAgIH07CisKKyAgICBoaWRlTGluay5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBzaG93TGluay5zZXRNb2RlbE9iamVjdChoaWRlTGluayk7CisgICAgaGlkZUxpbmsuc2V0TW9kZWxPYmplY3Qoc2hvd0xpbmspOworCisgICAgYWRkKHNob3dMaW5rKTsKKyAgICBhZGQoaGlkZUxpbmspOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBzdWJzZXRNb2RlbE9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgTGlzdCBvYmpMaXN0ID0gKExpc3QpIG9iajsKKyAgICBMaXN0IHN1YnNldExpc3QgPSBnZXRUb3BOKG9iakxpc3QsIDMpOworICAgIHJldHVybiBzdWJzZXRMaXN0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRUb3BOKExpc3Qgc3RhdHVzZXMsIGludCB0b3BOKSB7CisgICAgTGlzdCBzdWJzZXQgPSBuZXcgVmVjdG9yKCk7CisgICAgaWYgKHN0YXR1c2VzICE9IG51bGwgJiYgc3RhdHVzZXMuc2l6ZSgpID4gMCkgeworICAgICAgaW50IG51bUdvYmJsZSA9IHRvcE4gPD0gc3RhdHVzZXMuc2l6ZSgpID8gdG9wTiA6IHN0YXR1c2VzLnNpemUoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR29iYmxlOyBpKyspIHsKKyAgICAgICAgT2JqZWN0IHN0YXR1cyA9IHN0YXR1c2VzLmdldChpKTsKKyAgICAgICAgc3Vic2V0LmFkZChzdGF0dXMpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdWJzZXQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvaWNvbl9hcnJvd19kb3duLmdpZiBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL2ljb25fYXJyb3dfZG93bi5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhkZWJkNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvaGVhbHRoL2ljb25fYXJyb3dfZG93bi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvaWNvbl9hcnJvd191cC5naWYgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL2hlYWx0aC9pY29uX2Fycm93X3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjMxMWZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy9oZWFsdGgvaWNvbl9hcnJvd191cC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy90cmFjZS9UcmFjZS5jc3MgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMDllMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy90cmFjZS9UcmFjZS5jc3MKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy50cmlnZ2VyIHsKKwljdXJzb3I6IHBvaW50ZXI7CisJY3Vyc29yOiBoYW5kOworfQorCisuYnJhbmNoIHsKKwlkaXNwbGF5OiBub25lOworCW1hcmdpbi1sZWZ0OiAxNnB4OworfQorCisjdXBzdHJlYW1fcGVkaWdyZWVfaGVhZGluZ3sKK30KKworI3Vwc3RyZWFtX3BlZGlncmVlX3RyZWV7Cit9CisKKyNkb3duc3RyZWFtX3BlZGlncmVlX2hlYWRpbmd7Cit9CisKKyNkb3duc3RyZWFtX3BlZGlncmVlX3RyZWV7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlLmh0bWwgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZGRlYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2UuaHRtbApAQCAtMCwwICsxLDgyIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0OnBhbmVsPgorPHdpY2tldDpsaW5rPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJUcmFjZS5qcyIgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJUcmFjZS5jc3MiLz4KKzwvd2lja2V0Omxpbms+CisKKzx3aWNrZXQ6cmVtb3ZlPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiPgorICA8IS0tCisgIHZhciBvcGVuSW1nID0gbmV3IEltYWdlKCk7CisgIG9wZW5JbWcuc3JjID0gIm9wZW4uZ2lmIjsKKyAgdmFyIGNsb3NlZEltZyA9IG5ldyBJbWFnZSgpOworICBjbG9zZWRJbWcuc3JjID0gImNsb3NlZC5naWYiOworCisgIGZ1bmN0aW9uIHNob3dCcmFuY2goYnJhbmNoKSB7CisgIAl2YXIgb2JqQnJhbmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnJhbmNoKS5zdHlsZTsKKyAgCWlmIChvYmpCcmFuY2guZGlzcGxheSA9PSAiYmxvY2siKQorICAJCW9iakJyYW5jaC5kaXNwbGF5ID0gIm5vbmUiOworICAJZWxzZQorICAJCW9iakJyYW5jaC5kaXNwbGF5ID0gImJsb2NrIjsKKyAgfQorCisgIGZ1bmN0aW9uIHN3YXBGb2xkZXIoaW1nKSB7CisgIAlvYmpJbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbWcpOworICAJaWYgKG9iakltZy5zcmMuaW5kZXhPZignY2xvc2VkLmdpZicpID4gLTEpCisgIAkJb2JqSW1nLnNyYyA9IG9wZW5JbWcuc3JjOworICAJZWxzZQorICAJCW9iakltZy5zcmMgPSBjbG9zZWRJbWcuc3JjOworICB9ICAKKyAgLy8tLT4gIAorICA8L3NjcmlwdD4KKzwvd2lja2V0OnJlbW92ZT4KKworCis8aDMgaWQ9InVwc3RyZWFtX3BlZGlncmVlX2hlYWRpbmciPlVwc3RyZWFtIFBlZGlncmVlPC9oMz4KKzxzcGFuIGlkPSJ1cHN0cmVhbV9wZWRpZ3JlZV90cmVlIiB3aWNrZXQ6aWQ9InVwc3RyZWFtX3BlZGlncmVlX3RyZWUiPgorPC9zcGFuPgorCis8aDMgaWQ9ImRvd25zdHJlYW1fcGVkaWdyZWVfaGVhZGluZyI+RG93bnN0cmVhbSBQZWRpZ3JlZTwvaDM+Cis8c3BhbiB3aWNrZXQ6aWQ9ImRvd25zdHJlYW1fcGVkaWdyZWVfdHJlZSIgaWQ9ImRvd25zdHJlYW1fcGVkaWdyZWVfdHJlZSI+Cis8L3NwYW4+Cis8L3dpY2tldDpwYW5lbD4KKworPHdpY2tldDpyZW1vdmU+Cis8ZGl2IGNsYXNzPSJ0cmlnZ2VyIgorCW9uQ2xpY2s9ImphdmFzY3JpcHQ6c2hvd0JyYW5jaCgnYnJhbmNoMS4xJyk7c3dhcEZvbGRlcignZm9sZGVyMS4xJyk7Ij4KKwkJPGltZyBzcmM9ImNsb3NlZC5naWYiIGJvcmRlcj0iMCIgaWQ9ImZvbGRlcjEuMSIgLz4KKwl0ZXN0ZmlsZS50eHQKKzwvZGl2PgorPHNwYW4gY2xhc3M9ImJyYW5jaCIgaWQ9ImJyYW5jaDEuMSI+CisJPGRpdiBjbGFzcz0idHJpZ2dlciIKKwkJb25DbGljaz0iamF2YXNjcmlwdDpzaG93QnJhbmNoKCdicmFuY2gyLjEnKTtzd2FwRm9sZGVyKCdmb2xkZXIyLjEnKTsiPgorCQkJPGltZyBzcmM9ImNsb3NlZC5naWYiIGJvcmRlcj0iMCIgaWQ9ImZvbGRlcjIuMSIgLz4KKwkJdGVzdGZpbGUyLnR4dAorICAgIDwvZGl2PgorCTxzcGFuIGNsYXNzPSJicmFuY2giIGlkPSJicmFuY2gyLjEiPgorCQkJPGltZyBzcmM9ImRvYy5naWYiIC8+CisJCXRlc3RmaWxlMy50eHQ8YnIgLz4KKworCQkJCTxpbWcgc3JjPSJkb2MuZ2lmIiAvPgorCQkJdGVzdGZpbGU0LnR4dDxiciAvPgorICAgPC9zcGFuPiAgIAorPC9zcGFuPgorCis8L3dpY2tldDpyZW1vdmU+CisKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2UuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZkMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy90cmFjZS9UcmFjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLndlYmNvbXBvbmVudHMudHJhY2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MucGVkaWdyZWUuUGVkaWdyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy5wZWRpZ3JlZS5QZWRpZ3JlZVRyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnBjcy51dGlsLkZpbGVNYW5hZ2VyVXRpbHM7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5wYW5lbC5QYW5lbDsKKworLyoqCisgKiAKKyAqIEEgVHJhY2Ugd2ViIHdpZGdldCB0byBleHBvc2UgdGhlIHVuZGVybHlpbmcgUENTIHtAbGluayBQZWRpZ3JlZX0KKyAqIGZ1bmN0aW9uYWxpdHkuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVHJhY2UgZXh0ZW5kcyBQYW5lbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTk2NTc5MDI2ODIwMjQ0MzE0NEw7CisKKyAgLyoqCisgICAqIEBwYXJhbSBpZAorICAgKiBAcGFyYW0gbW9kZWwKKyAgICovCisgIHB1YmxpYyBUcmFjZShTdHJpbmcgaWQsIFN0cmluZyBmbVVybFN0ciwgYm9vbGVhbiBsaXN0Tm90Q2F0LAorICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVMaXN0LCBQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICBzdXBlcihpZCk7CisgICAgUGVkaWdyZWUgcGVkaWdyZWUgPSBuZXcgUGVkaWdyZWUobmV3IEZpbGVNYW5hZ2VyVXRpbHMoZm1VcmxTdHIpLAorICAgICAgICBsaXN0Tm90Q2F0LCBleGNsdWRlTGlzdCk7CisgICAgUGVkaWdyZWVUcmVlIHVwc3RyZWFtID0gcGVkaWdyZWUuZG9QZWRpZ3JlZShwcm9kdWN0LCB0cnVlKTsKKyAgICBQZWRpZ3JlZVRyZWUgZG93bnN0cmVhbSA9IHBlZGlncmVlLmRvUGVkaWdyZWUocHJvZHVjdCwgZmFsc2UpOworCisgICAgYWRkKG5ldyBUcmFjZU5vZGUoInVwc3RyZWFtX3BlZGlncmVlX3RyZWUiLCAidXAiLCB1cHN0cmVhbS5nZXRSb290KCksIDAsIDApKTsKKyAgICBhZGQobmV3IFRyYWNlTm9kZSgiZG93bnN0cmVhbV9wZWRpZ3JlZV90cmVlIiwgImRvd24iLCBkb3duc3RyZWFtLmdldFJvb3QoKSwgMCwgMCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2UuanMgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIzMGRhNmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlLmpzCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgb3BlbkltZyA9IG5ldyBJbWFnZSgpOworb3BlbkltZy5zcmMgPSAiLi9pbWFnZXMvb3Blbi5naWYiOwordmFyIGNsb3NlZEltZyA9IG5ldyBJbWFnZSgpOworY2xvc2VkSW1nLnNyYyA9ICIuL2ltYWdlcy9jbG9zZWQuZ2lmIjsKKworZnVuY3Rpb24gc2hvd0JyYW5jaChicmFuY2gpIHsKKwl2YXIgb2JqQnJhbmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnJhbmNoKS5zdHlsZTsKKwlpZiAob2JqQnJhbmNoLmRpc3BsYXkgPT0gImJsb2NrIikKKwkJb2JqQnJhbmNoLmRpc3BsYXkgPSAibm9uZSI7CisJZWxzZQorCQlvYmpCcmFuY2guZGlzcGxheSA9ICJibG9jayI7Cit9CisKK2Z1bmN0aW9uIHN3YXBGb2xkZXIoaW1nKSB7CisJb2JqSW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW1nKTsKKwlpZiAob2JqSW1nLnNyYy5pbmRleE9mKCdjbG9zZWQnKSA+IC0xKQorCQlvYmpJbWcuc3JjID0gb3BlbkltZy5zcmM7CisJZWxzZQorCQlvYmpJbWcuc3JjID0gY2xvc2VkSW1nLnNyYzsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2VOb2RlLmh0bWwgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlTm9kZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWExNGMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL1RyYWNlTm9kZS5odG1sCkBAIC0wLDAgKzEsNDIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6cGFuZWw+CisgCis8d2lja2V0OmNvbnRhaW5lciB3aWNrZXQ6aWQ9Imhhc19jaGlsZHJlbiI+CisgPGRpdiBjbGFzcz0idHJpZ2dlciIKKwl3aWNrZXQ6aWQ9InBhcmVudF90cmlnZ2VyIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNob3dCcmFuY2goJ2JyYW5jaDEuMScpO3N3YXBGb2xkZXIoJ2ZvbGRlcjEuMScpOyI+CisJPHdpY2tldDpsaW5rPgorCQk8aW1nIHNyYz0iY2xvc2VkLmdpZiIgYm9yZGVyPSIwIiB3aWNrZXQ6aWQ9InBhcmVudF9mb2xkZXIiIGlkPSJmb2xkZXIxLjEiIC8+CisJPC93aWNrZXQ6bGluaz4KKwk8c3BhbiB3aWNrZXQ6aWQ9InBhcmVudF9wcm9kdWN0X25hbWUiPnRlc3RmaWxlLnR4dDwvc3Bhbj4KKzwvZGl2PgorCis8c3BhbiB3aWNrZXQ6aWQ9ImNoaWxkcmVuX2NvbnRhaW5lciI+Cis8c3BhbiB3aWNrZXQ6aWQ9ImNoaWxkcmVuIj4KKyAgPHNwYW4gd2lja2V0OmlkPSJjaGlsZCIvPgorPC9zcGFuPgorPC9zcGFuPgorPC93aWNrZXQ6Y29udGFpbmVyPgorCis8d2lja2V0OmNvbnRhaW5lciB3aWNrZXQ6aWQ9Im5vX2NoaWxkcmVuIj4KKzx3aWNrZXQ6bGluaz4KKwk8aW1nIHNyYz0iZG9jLmdpZiIgLz4KKzwvd2lja2V0Omxpbms+Cis8c3BhbiB3aWNrZXQ6aWQ9InByb2R1Y3RfbmFtZSI+dGVzdGZpbGUzLnR4dDwvc3Bhbj4gPGJyIC8+Cis8L3dpY2tldDpjb250YWluZXI+CisKKzwvd2lja2V0OnBhbmVsPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy90cmFjZS9UcmFjZU5vZGUuamF2YSBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2VOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljZjZlNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvVHJhY2VOb2RlLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQucGNzLndlYmNvbXBvbmVudHMudHJhY2U7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wY3MucGVkaWdyZWUuUGVkaWdyZWVUcmVlTm9kZTsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LmJlaGF2aW9yLlNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYk1hcmt1cENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5pbWFnZS5JbWFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwucGFuZWwuUGFuZWw7CisKKy8qKgorICogCisgKiBBIG5vZGUgd3JhcHBlciBhcm91bmQgYSB7QGxpbmsgUGVkaWdyZWVUcmVlTm9kZX0gdGhhdCBleHBvc2VzIHRoZSBub2RlIGluIGEKKyAqIHJlY3Vyc2l2ZSB3YXkgdmlhIFdpY2tldCBhbmQgYXMgYSBjb21wb25lbnQgb2YgYSB7QGxpbmsgVHJhY2V9IHBhbmVsLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRyYWNlTm9kZSBleHRlbmRzIFBhbmVsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjY3MjAzMjExMjEzNjQwODYyNUw7CisKKyAgLyoqCisgICAqIEBwYXJhbSBpZAorICAgKi8KKyAgcHVibGljIFRyYWNlTm9kZShTdHJpbmcgaWQsIFN0cmluZyBmb2xkZXJLZXksIFBlZGlncmVlVHJlZU5vZGUgcGFyZW50Tm9kZSwgaW50IGJyYW5jaCwgaW50IGxldmVsKSB7CisgICAgc3VwZXIoaWQpOworICAgIG5vZGVBZGQodGhpcywgZm9sZGVyS2V5LCBwYXJlbnROb2RlLCBicmFuY2gsIGxldmVsKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFBlZGlncmVlVHJlZU5vZGU+IGdldENoaWxkcmVuKFBlZGlncmVlVHJlZU5vZGUgbm9kZSkgeworICAgIExpc3Q8UGVkaWdyZWVUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgVmVjdG9yPFBlZGlncmVlVHJlZU5vZGU+KAorICAgICAgICBub2RlLmdldE51bUNoaWxkcmVuKCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldE51bUNoaWxkcmVuKCk7IGkrKykgeworICAgICAgY2hpbGRyZW4uYWRkKG5vZGUuZ2V0Q2hpbGRBdChpKSk7CisgICAgfQorCisgICAgcmV0dXJuIGNoaWxkcmVuOworICB9CisKKyAgcHVibGljIHZvaWQgbm9kZUFkZChXZWJNYXJrdXBDb250YWluZXIgY29udGFpbmVyLCBmaW5hbCBTdHJpbmcgZm9sZGVyS2V5LCAKKyAgICAgIGZpbmFsIFBlZGlncmVlVHJlZU5vZGUgbm9kZSwgZmluYWwgaW50IGJyYW5jaCwgZmluYWwgaW50IGxldmVsKSB7CisKKyAgICBpZiAobm9kZS5nZXROdW1DaGlsZHJlbigpID4gMCkgeworICAgICAgZmluYWwgU3RyaW5nIGZvbGRlcklkID0gZm9sZGVyS2V5KyJfZm9sZGVyIiArIChsZXZlbCArIDEpICsgIi4iICsgKGJyYW5jaCArIDEpOworICAgICAgZmluYWwgU3RyaW5nIGJyYW5jaElkID0gZm9sZGVyS2V5KyJfYnJhbmNoIiArIChsZXZlbCArIDEpICsgIi4iICsgKGJyYW5jaCArIDEpOworCisKKyAgICAgIC8vIGRlYWN0aXZhdGUgbm9fY2hpbGRyZW4KKyAgICAgIFdlYk1hcmt1cENvbnRhaW5lciBub0NoaWxkcmVuID0gbmV3IFdlYk1hcmt1cENvbnRhaW5lcigibm9fY2hpbGRyZW4iKTsKKyAgICAgIG5vQ2hpbGRyZW4uc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICBjb250YWluZXIuYWRkKG5vQ2hpbGRyZW4pOworCisgICAgICAvLyBhY3RpdmF0ZSBoYXNfY2hpbGRyZW4KKyAgICAgIFdlYk1hcmt1cENvbnRhaW5lciBoYXNDaGlsZHJlbiA9IG5ldyBXZWJNYXJrdXBDb250YWluZXIoImhhc19jaGlsZHJlbiIpOworICAgICAgV2ViTWFya3VwQ29udGFpbmVyIHBhcmVudFRyaWdnZXIgPSBuZXcgV2ViTWFya3VwQ29udGFpbmVyKAorICAgICAgICAgICJwYXJlbnRfdHJpZ2dlciIpOworICAgICAgcGFyZW50VHJpZ2dlci5hZGQobmV3IFNpbXBsZUF0dHJpYnV0ZU1vZGlmaWVyKCJvbmNsaWNrIiwKKyAgICAgICAgICAiamF2YXNjcmlwdDpzaG93QnJhbmNoKCciICsgYnJhbmNoSWQgKyAiJyk7c3dhcEZvbGRlcignIiArIGZvbGRlcklkCisgICAgICAgICAgICAgICsgIicpOyIpKTsKKworICAgICAgSW1hZ2UgZm9sZGVySW1hZ2UgPSBuZXcgSW1hZ2UoInBhcmVudF9mb2xkZXIiKTsKKyAgICAgIGZvbGRlckltYWdlLmFkZChuZXcgU2ltcGxlQXR0cmlidXRlTW9kaWZpZXIoImlkIiwgZm9sZGVySWQpKTsKKyAgICAgIHBhcmVudFRyaWdnZXIuYWRkKGZvbGRlckltYWdlKTsKKyAgICAgIHBhcmVudFRyaWdnZXIuYWRkKG5ldyBMYWJlbCgicGFyZW50X3Byb2R1Y3RfbmFtZSIsIG5vZGUuZ2V0Tm9kZVByb2R1Y3QoKQorICAgICAgICAgIC5nZXRQcm9kdWN0TmFtZSgpKSk7CisgICAgICBoYXNDaGlsZHJlbi5hZGQocGFyZW50VHJpZ2dlcik7CisKKyAgICAgIFdlYk1hcmt1cENvbnRhaW5lciBjaGlsZHJlbkNvbnRhaW5lciA9IG5ldyBXZWJNYXJrdXBDb250YWluZXIoImNoaWxkcmVuX2NvbnRhaW5lciIpOworICAgICAgY2hpbGRyZW5Db250YWluZXIuYWRkKG5ldyBTaW1wbGVBdHRyaWJ1dGVNb2RpZmllcigiaWQiLCBicmFuY2hJZCkpOworICAgICAgY2hpbGRyZW5Db250YWluZXIuYWRkKG5ldyBTaW1wbGVBdHRyaWJ1dGVNb2RpZmllcigiY2xhc3MiLCAiYnJhbmNoIikpOworICAgICAgCisgICAgICBMaXN0VmlldzxQZWRpZ3JlZVRyZWVOb2RlPiBjaGlsZHJlbiA9IG5ldyBMaXN0VmlldzxQZWRpZ3JlZVRyZWVOb2RlPigKKyAgICAgICAgICAiY2hpbGRyZW4iLCBnZXRDaGlsZHJlbihub2RlKSkgeworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlCisgICAgICAgICAqIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpc3QuTGlzdFZpZXcjcG9wdWxhdGVJdGVtKG9yZy5hcGFjaGUKKyAgICAgICAgICogLndpY2tldC5tYXJrdXAuaHRtbC5saXN0Lkxpc3RJdGVtKQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlSXRlbShMaXN0SXRlbTxQZWRpZ3JlZVRyZWVOb2RlPiBpdGVtKSB7CisgICAgICAgICAgVHJhY2VOb2RlIGNoaWxkQ29udGFpbmVyID0gbmV3IFRyYWNlTm9kZSgiY2hpbGQiLCBmb2xkZXJLZXksIAorICAgICAgICAgICAgICBpdGVtLmdldE1vZGVsT2JqZWN0KCksIGl0ZW0uZ2V0SW5kZXgoKSwgbGV2ZWwgKyAxKTsKKyAgICAgICAgICBpdGVtLmFkZChjaGlsZENvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGNoaWxkcmVuQ29udGFpbmVyLmFkZChjaGlsZHJlbik7CisgICAgICAKKyAgICAgIGhhc0NoaWxkcmVuLmFkZChjaGlsZHJlbkNvbnRhaW5lcik7CisgICAgICBjb250YWluZXIuYWRkKGhhc0NoaWxkcmVuKTsKKworICAgIH0gZWxzZSB7CisgICAgICAvLyBhY3RpdmUgbm9fY2hpbGRyZW4KKyAgICAgIFdlYk1hcmt1cENvbnRhaW5lciBub0NoaWxkcmVuID0gbmV3IFdlYk1hcmt1cENvbnRhaW5lcigibm9fY2hpbGRyZW4iKTsKKyAgICAgIG5vQ2hpbGRyZW4uYWRkKG5ldyBMYWJlbCgicHJvZHVjdF9uYW1lIiwgbm9kZS5nZXROb2RlUHJvZHVjdCgpCisgICAgICAgICAgLmdldFByb2R1Y3ROYW1lKCkpKTsKKyAgICAgIGNvbnRhaW5lci5hZGQobm9DaGlsZHJlbik7CisKKyAgICAgIC8vIGRlLWFjdGl2YXRlIGhhc19jaGlsZHJlbgorICAgICAgV2ViTWFya3VwQ29udGFpbmVyIGhhc0NoaWxkcmVuID0gbmV3IFdlYk1hcmt1cENvbnRhaW5lcigiaGFzX2NoaWxkcmVuIik7CisgICAgICBoYXNDaGlsZHJlbi5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIGNvbnRhaW5lci5hZGQoaGFzQ2hpbGRyZW4pOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL2Nsb3NlZC5naWYgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL2Nsb3NlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Q0NTFjMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvY2xvc2VkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL2RvYy5naWYgYi8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL2RvYy5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGFjYTU0NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2NvbXBvbmVudHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcGNzL3dlYmNvbXBvbmVudHMvdHJhY2UvZG9jLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Bjcy93ZWJjb21wb25lbnRzL3RyYWNlL29wZW4uZ2lmIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy90cmFjZS9vcGVuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWIzYzgxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wY3Mvd2ViY29tcG9uZW50cy90cmFjZS9vcGVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9jb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQzMjVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDI3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAKKworbG9nNGouYXBwZW5kZXIuU3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5TdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuU3Rkb3V0LmxheW91dC5jb252ZXJzaW9uUGF0dGVybj0lLTVwIC0gJS0yNi4yNmN7MX0gLSAlbVxuCisKK2xvZzRqLnJvb3RMb2dnZXI9SU5GTyxTdGRvdXQKKworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUud2lja2V0PUlORk8KK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLkh0dHBTZXNzaW9uU3RvcmU9SU5GTworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUud2lja2V0LnZlcnNpb249SU5GTworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUud2lja2V0LlJlcXVlc3RDeWNsZT1JTkZPCisKKwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3BvbS54bWwgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJiMDJlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3BvbS54bWwKQEAgLTAsMCArMSwxMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisJCisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxwYXJlbnQ+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgICAgIDwvcGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJPGFydGlmYWN0SWQ+Zm1icm93c2VyPC9hcnRpZmFjdElkPgorCTxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwk8bmFtZT5DQVMgRmlsZSBNYW5hZ2VyIEJyb3dzZXIgV2ViIEFwcDwvbmFtZT4KKwk8cHJvcGVydGllcz4KKwkJPHdpY2tldC52ZXJzaW9uPjEuNC4xNzwvd2lja2V0LnZlcnNpb24+CisJCTxqZXR0eS52ZXJzaW9uPjYuMS4yNTwvamV0dHkudmVyc2lvbj4KKwkJPHNsZjRqLnZlcnNpb24+MS41Ljg8L3NsZjRqLnZlcnNpb24+CisJCTxsb2c0ai52ZXJzaW9uPjEuMi4xNDwvbG9nNGoudmVyc2lvbj4KKwk8L3Byb3BlcnRpZXM+CisJPHNjbT4KKyAgIAk8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjEwLXJjMi93ZWJhcHAvZm1icm93c2VyPC9jb25uZWN0aW9uPgorICAgCTxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL3dlYmFwcC9mbWJyb3dzZXI8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAJPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL29vZHQvdGFncy8wLjEwLXJjMi93ZWJhcHAvZm1icm93c2VyPC91cmw+CisgIDwvc2NtPgorCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS53aWNrZXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD53aWNrZXQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3dpY2tldC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisJCSAgPGFydGlmYWN0SWQ+b29kdC13ZWJhcHAtY29tcG9uZW50czwvYXJ0aWZhY3RJZD4KKwkJICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBMT0dHSU5HIERFUEVOREVOQ0lFUyAtIExPRzRKIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3NsZjRqLnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMi4xNDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gIEpVTklUIERFUEVOREVOQ1kgRk9SIFRFU1RJTkcgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSAgSkVUVFkgREVQRU5ERU5DSUVTIEZPUiBURVNUSU5HICAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHR5PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amV0dHktbWFuYWdlbWVudDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisJPGJ1aWxkPgorCQk8cmVzb3VyY2VzPgorCQkJPHJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJPC9yZXNvdXJjZT4KKwkJCTxyZXNvdXJjZT4KKwkJCQk8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisJCQkJPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisJCQkJPGluY2x1ZGVzPgorCQkJCQk8aW5jbHVkZT4qKjwvaW5jbHVkZT4KKwkJCQk8L2luY2x1ZGVzPgorCQkJCTxleGNsdWRlcz4KKwkJCQkJPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorCQkJCTwvZXhjbHVkZXM+CisJCQk8L3Jlc291cmNlPgorCQk8L3Jlc291cmNlcz4KKwkJPHRlc3RSZXNvdXJjZXM+CisJCQk8dGVzdFJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy90ZXN0L2phdmE8L2RpcmVjdG9yeT4KKwkJCQk8aW5jbHVkZXM+CisJCQkJCTxpbmNsdWRlPioqPC9pbmNsdWRlPgorCQkJCTwvaW5jbHVkZXM+CisJCQkJPGV4Y2x1ZGVzPgorCQkJCQk8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisJCQkJPC9leGNsdWRlcz4KKwkJCTwvdGVzdFJlc291cmNlPgorCQk8L3Rlc3RSZXNvdXJjZXM+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c291cmNlPjEuNTwvc291cmNlPgorCQkJCQk8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorCQkJCQk8b3B0aW1pemU+dHJ1ZTwvb3B0aW1pemU+CisJCQkJCTxkZWJ1Zz50cnVlPC9kZWJ1Zz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+CisJPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL0ZNQnJvd3NlckFwcC5qYXZhIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL0ZNQnJvd3NlckFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTk4YmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvRk1Ccm93c2VyQXBwLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3NlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5GTUJyb3dzZXJBcHBCYXNlOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQucmVxdWVzdC50YXJnZXQuY29kaW5nLk1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneTsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBvYmplY3QgZm9yIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiBJZiB5b3Ugd2FudCB0byBydW4gdGhpcworICogYXBwbGljYXRpb24gd2l0aG91dCBkZXBsb3lpbmcsIHJ1biB0aGUgU3RhcnQgY2xhc3MuCisgKiAKKyAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLndlYmFwcC5icm93c2VyLlN0YXJ0I21haW4oU3RyaW5nW10pCisgKi8KK3B1YmxpYyBjbGFzcyBGTUJyb3dzZXJBcHAgZXh0ZW5kcyBGTUJyb3dzZXJBcHBCYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihGTUJyb3dzZXJBcHAuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8qKgorICAgKiAKKyAgICogQHBhcmFtIGZtVXJsU3RyCisgICAqICAgICAgICAgIFRoZSBTdHJpbmcgVVJMIG9mIHRoZSBmaWxlIG1hbmFnZXIgdG8gY29ubmVjdCB0by4KKyAgICovCisgIHB1YmxpYyBGTUJyb3dzZXJBcHAoKSB7CisgICAgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5IHR5cGVzID0gbmV3IE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSgKKyAgICAgICAgInR5cGVzIiwgVHlwZXNQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10ge30pOworICAgIG1vdW50KHR5cGVzKTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSB0eXBlQnJvd3NlciA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJ0eXBlIiwgVHlwZUJyb3dzZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAibmFtZSIsICJwYWdlTnVtIiB9KTsKKyAgICBtb3VudCh0eXBlQnJvd3Nlcik7CisKKyAgICBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3kgcHJvZEJyb3dzZXIgPSBuZXcgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5KAorICAgICAgICAicHJvZHVjdCIsIFByb2R1Y3RCcm93c2VyUGFnZS5jbGFzcywgbmV3IFN0cmluZ1tdIHsgImlkIiB9KTsKKyAgICBtb3VudChwcm9kQnJvd3Nlcik7CisKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0LkFwcGxpY2F0aW9uI2dldEhvbWVQYWdlKCkKKyAgICovCisgIHB1YmxpYyBDbGFzczxIb21lPiBnZXRIb21lUGFnZSgpIHsKKyAgICByZXR1cm4gSG9tZS5jbGFzczsKKyAgfQorCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Ib21lLmh0bWwgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvSG9tZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjQ2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvSG9tZS5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sCisJeG1sbnM6d2lja2V0PSJodHRwOi8vd2lja2V0LmFwYWNoZS5vcmcvZHRkcy5kYXRhL3dpY2tldC14aHRtbDEuNC1zdHJpY3QuZHRkIj4KKzxoZWFkPgorPHRpdGxlPk9PRFQgQ0FTIEZpbGUgTWFuYWdlciBCcm93c2VyPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDM+V2VsY29tZSB0byB0aGUgRmlsZSBNYW5hZ2VyIEJyb3dzZXIhPC9oMz4KKworPHVsPgorCTxsaT48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImZpbmRfcHJvZHVjdCI+QnJvd3NlIGZvciBhIHByb2R1Y3QgaW4gdGhlCisJZmlsZSBtYW5hZ2VyPC9hPi48L2xpPgorPC91bD4KKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvSG9tZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL0hvbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg4MDEyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL0hvbWUuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLndlYmFwcC5icm93c2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworCisvKioKKyAqIEhvbWVwYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBIb21lIGV4dGVuZHMgV2ViUGFnZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKgorCSAqIENvbnN0cnVjdG9yIHRoYXQgaXMgaW52b2tlZCB3aGVuIHBhZ2UgaXMgaW52b2tlZCB3aXRob3V0IGEgc2Vzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyYW1ldGVycworCSAqICAgICAgICAgICAgUGFnZSBwYXJhbWV0ZXJzCisJICovCisgICAgcHVibGljIEhvbWUoZmluYWwgUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworCisgICAgICAgIGFkZChuZXcgTGluazxPYmplY3Q+KCJmaW5kX3Byb2R1Y3QiKXsKKyAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgICAgICovCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShUeXBlc1BhZ2UuY2xhc3MpOyAgICAgICAgICAgIAorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Byb2R1Y3RCcm93c2VyUGFnZS5odG1sIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Byb2R1Y3RCcm93c2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YThkMWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvUHJvZHVjdEJyb3dzZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiB3aWNrZXQ6aWQ9InByb2R1Y3RfYnJvd3Nlcl9jb21wb25lbnQiIGlkPSJwcm9kdWN0X2Jyb3dzZXJfY29tcG9uZW50Ii8+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvUHJvZHVjdEJyb3dzZXJQYWdlLmphdmEgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvUHJvZHVjdEJyb3dzZXJQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlZWMwMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Qcm9kdWN0QnJvd3NlclBhZ2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLndlYmFwcC5icm93c2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy5maWxlbWdyLmJyb3dzZXIucHJvZHVjdC5Qcm9kdWN0QnJvd3NlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CisKKy8qKgorICogCisgKiBQYWdlIHRoYXQgZXhwb3NlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgUHJvZHVjdEJyb3dzZXJ9IE9PRFQgCisgKiBXaWNrZXQgY29tcG9uZW50LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFByb2R1Y3RCcm93c2VyUGFnZSBleHRlbmRzIFdlYlBhZ2UgeworCisgIHB1YmxpYyBQcm9kdWN0QnJvd3NlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgIFByb2R1Y3RCcm93c2VyIGJyb3dzZXJDb21wb25lbnQgPSBuZXcgUHJvZHVjdEJyb3dzZXIoCisgICAgICAgICJwcm9kdWN0X2Jyb3dzZXJfY29tcG9uZW50IiwgKChGTUJyb3dzZXJBcHApIGdldEFwcGxpY2F0aW9uKCkpCisgICAgICAgICAgICAuZ2V0Rm1VcmxTdHIoKSwgcGFyYW1ldGVycy5nZXRTdHJpbmcoImlkIikpOworICAgIGFkZChicm93c2VyQ29tcG9uZW50KTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmh0bWwgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmNTljZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Qcm9kdWN0TWV0QnJvd3NlclBhZ2UuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IHdpY2tldDppZD0icHJvZHVjdF9tZXRfYnJvd3Nlcl9jb21wb25lbnQiIGlkPSJwcm9kdWN0X21ldF9icm93c2VyX2NvbXBvbmVudCIvPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Byb2R1Y3RNZXRCcm93c2VyUGFnZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Byb2R1Y3RNZXRCcm93c2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGFiNDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3NlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLm1ldGFkYXRhLk1ldGFkYXRhQnJvd3NlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CisKKy8qKgorICogCisgKiBQYWdlIHRoYXQgZXhwb3NlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWV0YWRhdGFCcm93c2VyfSAKKyAqIE9PRFQgV2lja2V0IGNvbXBvbmVudC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0TWV0QnJvd3NlclBhZ2UgZXh0ZW5kcyBXZWJQYWdlIHsKKworICBwdWJsaWMgUHJvZHVjdE1ldEJyb3dzZXJQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKKyAgICBNZXRhZGF0YUJyb3dzZXIgbWV0QnJvd3NlciA9IG5ldyBNZXRhZGF0YUJyb3dzZXIoCisgICAgICAgICJwcm9kdWN0X21ldF9icm93c2VyX2NvbXBvbmVudCIsICgoRk1Ccm93c2VyQXBwKSBnZXRBcHBsaWNhdGlvbigpKQorICAgICAgICAgICAgLmdldEZtVXJsU3RyKCksIHBhcmFtZXRlcnMuZ2V0U3RyaW5nKCJpZCIpKTsKKyAgICBhZGQobWV0QnJvd3Nlcik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Byb2R1Y3RSZWZzQnJvd3NlclBhZ2UuaHRtbCBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Qcm9kdWN0UmVmc0Jyb3dzZXJQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkNWY3YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Qcm9kdWN0UmVmc0Jyb3dzZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiB3aWNrZXQ6aWQ9InByb2R1Y3RfcmVmc19icm93c2VyX2NvbXBvbmVudCIgaWQ9InByb2R1Y3RfcmVmc19icm93c2VyX2NvbXBvbmVudCIvPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Byb2R1Y3RSZWZzQnJvd3NlclBhZ2UuamF2YSBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Qcm9kdWN0UmVmc0Jyb3dzZXJQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkZDA3OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9Qcm9kdWN0UmVmc0Jyb3dzZXJQYWdlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3NlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnByb2R1Y3QuUHJvZHVjdFJlZnNCcm93c2VyOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKKworLyoqCisgKiAKKyAqIFBhZ2UgdGhhdCBleHBvc2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBQcm9kdWN0UmVmc0Jyb3dzZXJ9CisgKiBPT0RUIFdpY2tldCBjb21wb25lbnQuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFJlZnNCcm93c2VyUGFnZSBleHRlbmRzIFdlYlBhZ2UgeworCisgIHB1YmxpYyBQcm9kdWN0UmVmc0Jyb3dzZXJQYWdlKFBhZ2VQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKKyAgICBQcm9kdWN0UmVmc0Jyb3dzZXIgcmVmc0Jyb3dzZXIgPSBuZXcgUHJvZHVjdFJlZnNCcm93c2VyKAorICAgICAgICAicHJvZHVjdF9yZWZzX2Jyb3dzZXJfY29tcG9uZW50IiwgKChGTUJyb3dzZXJBcHApIGdldEFwcGxpY2F0aW9uKCkpCisgICAgICAgICAgICAuZ2V0Rm1VcmxTdHIoKSwgcGFyYW1ldGVycy5nZXRTdHJpbmcoImlkIikpOworICAgIGFkZChyZWZzQnJvd3Nlcik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVCcm93c2VyUGFnZS5odG1sIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVCcm93c2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzUwMWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvVHlwZUJyb3dzZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiB3aWNrZXQ6aWQ9InR5cGVfYnJvd3Nlcl9jb21wb25lbnQiIGlkPSJ0eXBlX2Jyb3dzZXIiLz4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9UeXBlQnJvd3NlclBhZ2UuamF2YSBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvZmlsZW1nci93ZWJhcHAvYnJvd3Nlci9UeXBlQnJvd3NlclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTM5NjkwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVCcm93c2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iud2ViYXBwLmJyb3dzZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLmZpbGVtZ3IuYnJvd3Nlci50eXBlcy5UeXBlQnJvd3NlcjsKKworLy9XaWNrZXQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CisKKy8qKgorICogCisgKiBFeHBvc2VzIHRoZSBPT0RUIFdpY2tldCB7QGxpbmsgVHlwZUJyb3dzZXJ9IGNvbXBvbmVudCAKKyAqIGluIGEgd2ViIHBhZ2UuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVHlwZUJyb3dzZXJQYWdlIGV4dGVuZHMgV2ViUGFnZSB7CisKKyAgcHVibGljIFR5cGVCcm93c2VyUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB7CisgICAgU3RyaW5nIHR5cGVOYW1lID0gcGFyYW1ldGVycy5nZXRTdHJpbmcoIm5hbWUiKTsKKyAgICBpbnQgcGFnZU51bSA9IHBhcmFtZXRlcnMuZ2V0SW50KCJwYWdlTnVtIiwgMSk7CisKKyAgICBUeXBlQnJvd3NlciBicm93c2VyID0gbmV3IFR5cGVCcm93c2VyKCJ0eXBlX2Jyb3dzZXJfY29tcG9uZW50IiwKKyAgICAgICAgKChGTUJyb3dzZXJBcHApIGdldEFwcGxpY2F0aW9uKCkpLmdldEZtVXJsU3RyKCksIHR5cGVOYW1lLCBwYWdlTnVtLAorICAgICAgICBUeXBlQnJvd3NlclBhZ2UuY2xhc3MsIFByb2R1Y3RCcm93c2VyUGFnZS5jbGFzcywgUHJvZHVjdFJlZnNCcm93c2VyUGFnZS5jbGFzcywKKyAgICAgICAgUHJvZHVjdE1ldEJyb3dzZXJQYWdlLmNsYXNzKTsKKyAgICBhZGQoYnJvd3Nlcik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVzUGFnZS5odG1sIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVzUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvVHlwZXNQYWdlLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiB3aWNrZXQ6aWQ9InR5cGVzX2NvbXBvbmVudCIgaWQ9InR5cGVzX2NvbXBvbmVudCIvPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVzUGFnZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1R5cGVzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjUwNzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvVHlwZXNQYWdlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3NlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMuZmlsZW1nci5icm93c2VyLnR5cGVzLlR5cGVzOworCisvL1dpY2tldCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKKworLyoqCisgKiAKKyAqIEV4cG9zZXMgdGhlIHVuZGVybHlpbmcgT09EVCBXaWNrZXQgCisgKiB7QGxpbmsgVHlwZXN9IGNvbXBvbmVudCBvbiBhIHdlYiBwYWdlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFR5cGVzUGFnZSBleHRlbmRzIFdlYlBhZ2UgeworCisgIHB1YmxpYyBUeXBlc1BhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgIFR5cGVzIHR5cGVzQ29tcG9uZW50ID0gbmV3IFR5cGVzKCJ0eXBlc19jb21wb25lbnQiLAorICAgICAgICAoKEZNQnJvd3NlckFwcCkgZ2V0QXBwbGljYXRpb24oKSkuZ2V0Rm1VcmxTdHIoKSwgVHlwZUJyb3dzZXJQYWdlLmNsYXNzKTsKKyAgICBhZGQodHlwZXNDb21wb25lbnQpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTc0MmMyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworbG9nNGouYXBwZW5kZXIuU3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5TdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuU3Rkb3V0LmxheW91dC5jb252ZXJzaW9uUGF0dGVybj0lLTVwIC0gJS0yNi4yNmN7MX0gLSAlbVxuCisKK2xvZzRqLnJvb3RMb2dnZXI9SU5GTyxTdGRvdXQKKworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUud2lja2V0PUlORk8KK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLkh0dHBTZXNzaW9uU3RvcmU9SU5GTworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUud2lja2V0LnZlcnNpb249SU5GTworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUud2lja2V0LlJlcXVlc3RDeWNsZT1JTkZPCisKKwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbCBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2MmVkZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8Q29udGV4dCBwYXRoPSIvYnJvd3NlciI+CisJCQorCTxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci51cmwiCisJICAgIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OjkwMDAiLz4KKwkgICAgCis8L0NvbnRleHQ+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiLzAuMTAvd2ViYXBwL2ZtYnJvd3Nlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTgzNGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKwkgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwkgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorCSB2ZXJzaW9uPSIyLjQiPgorCisJPGRpc3BsYXktbmFtZT5maWxlbWdyLWJyb3dzZXI8L2Rpc3BsYXktbmFtZT4KKworCSA8IS0tICAKKwkgICAgICBUaGVyZSBhcmUgdGhyZWUgbWVhbnMgdG8gY29uZmlndXJlIFdpY2tldHMgY29uZmlndXJhdGlvbiBtb2RlIGFuZCB0aGV5IGFyZQorCSAgICAgIHRlc3RlZCBpbiB0aGUgb3JkZXIgZ2l2ZW4uIAorCSAgICAgIDEpIEEgc3lzdGVtIHByb3BlcnR5OiAtRHdpY2tldC5jb25maWd1cmF0aW9uCisJICAgICAgMikgc2VydmxldCBzcGVjaWZpYyA8aW5pdC1wYXJhbT4KKwkgICAgICAzKSBjb250ZXh0IHNwZWNpZmljIDxjb250ZXh0LXBhcmFtPgorCSAgICAgIFRoZSB2YWx1ZSBtaWdodCBiZSBlaXRoZXIgImRldmVsb3BtZW50IiAocmVsb2FkaW5nIHdoZW4gdGVtcGxhdGVzIGNoYW5nZSkKKwkgICAgICBvciAiZGVwbG95bWVudCIuIElmIG5vIGNvbmZpZ3VyYXRpb24gaXMgZm91bmQsICJkZXZlbG9wbWVudCIgaXMgdGhlIGRlZmF1bHQuCisJLS0+CisKKwk8ZmlsdGVyPgorCQk8ZmlsdGVyLW5hbWU+d2lja2V0LmJyb3dzZXI8L2ZpbHRlci1uYW1lPgorIAkJPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldpY2tldEZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmFwcGxpY2F0aW9uQ2xhc3NOYW1lPC9wYXJhbS1uYW1lPgorCQkJPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3Nlci5GTUJyb3dzZXJBcHA8L3BhcmFtLXZhbHVlPgorIAkJPC9pbml0LXBhcmFtPgorIAk8L2ZpbHRlcj4KKworIDxmaWx0ZXItbWFwcGluZz4KKyAgPGZpbHRlci1uYW1lPndpY2tldC5icm93c2VyPC9maWx0ZXItbmFtZT4KKwk8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorIDwvZmlsdGVyLW1hcHBpbmc+CisKKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Rlc3RIb21lLmphdmEgYi8wLjEwL3dlYmFwcC9mbWJyb3dzZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL2ZpbGVtZ3Ivd2ViYXBwL2Jyb3dzZXIvVGVzdEhvbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzBjNWIyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1icm93c2VyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9maWxlbWdyL3dlYmFwcC9icm93c2VyL1Rlc3RIb21lLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3NlcjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3Nlci5Ib21lOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci53ZWJhcHAuYnJvd3Nlci5GTUJyb3dzZXJBcHA7CisKKy8vV2lja2V0IGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC51dGlsLnRlc3Rlci5XaWNrZXRUZXN0ZXI7CisKKy8qKgorICogVGVzdCBoYXJuZXNzIHRvIHNlZSBpZiB0aGUgbWFpbiAKKyAqIENBUyBicm93c2VyIGhvbWUgcGFnZSBsb2FkcyB1cC4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdEhvbWUgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXByaXZhdGUgV2lja2V0VGVzdGVyIHRlc3RlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkKKwl7CisJICBGTUJyb3dzZXJBcHAgYXBwID0gbmV3IEZNQnJvd3NlckFwcCgpOworCQl0ZXN0ZXIgPSBuZXcgV2lja2V0VGVzdGVyKGFwcCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFJlbmRlck15UGFnZSgpCisJeworCQkvL3N0YXJ0IGFuZCByZW5kZXIgdGhlIHRlc3QgcGFnZQorCQl0ZXN0ZXIuc3RhcnRQYWdlKEhvbWUuY2xhc3MpOworCisJCS8vYXNzZXJ0IHJlbmRlcmVkIHBhZ2UgY2xhc3MKKwkJdGVzdGVyLmFzc2VydFJlbmRlcmVkUGFnZShIb21lLmNsYXNzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2QvcG9tLnhtbCBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzExMTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2QvcG9tLnhtbApAQCAtMCwwICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisgIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisgIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyAgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5jYXMtcHJvZHVjdDwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+Q0FTIFByb2R1Y3QgU2VydmVyIFdlYiBBcHBsaWNhdGlvbjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIFRoaXMgcHJvamVjdCBidWlsZHMgb24gdG9wIG9mIHRoZSBDQVMgZmlsZSBtYW5hZ2VtZW50IGNvbXBvbmVudCBhbmQgZXhwb3NlcworICAgIGl0cyB1bmRlcmx5aW5nIGRhdGEgZGVsaXZlcnkgY2FwYWJpbGl0aWVzIHVzaW5nIHRoZSBPT0RUIFByb2R1Y3RTZXJ2ZXIKKyAgICBjb21wb25lbnQuIEFsbC1pbi1hbGwsIHRoaXMgcHJvamVjdCBjb250cmlidXRlcyBhbiBPT0RUIExhcmdlUHJvZHVjdEhhbmRsZXIKKyAgICBjb21wb25lbnQsIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVsaXZlciBhbmQgZm9ybWF0IGEgQ0FTIHByb2R1Y3Qgc3RydWN0dXJlCisgICAgaW50byBhbiBPT0RUIFhNTCBRdWVyeSBSZXN1bHQgU2V0LgorICA8L2Rlc2NyaXB0aW9uPgorICA8YnVpbGQ+CisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvdGVzdC9qYXZhPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDxwbHVnaW5zPgorICAgICAgPCEtLQorICAgICAgICBGb3IgcGx1Z2lucyBieSBNYXZlbiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSBncm91cElkIGJlY2F1c2UgdGhlCisgICAgICAgIGdyb3VwSWQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zIGlzIGFzc3VtZWQgYnkgZGVmYXVsdC4KKyAgICAgIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8d2ViUmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICA8IS0tIHRoaXMgaXMgcmVsYXRpdmUgdG8gdGhlIHBvbS54bWwgZGlyZWN0b3J5IC0tPgorICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORi88L3RhcmdldFBhdGg+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgIDwvd2ViUmVzb3VyY2VzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+CisgICAgICAgICAgICAgIGphci13aXRoLWRlcGVuZGVuY2llcworICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmPgorICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPG5hbWU+amF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU8L25hbWU+CisgICAgICAgICAgICAgIDx2YWx1ZT4KKyAgICAgICAgICAgICAgICAke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmxvZ2dpbmcucHJvcGVydGllcworICAgICAgICAgICAgICA8L3ZhbHVlPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGU+CisgICAgICAgICAgICAgb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3NlcnZpY2UvcmVzb3VyY2VzL1Jlc291cmNlVGVzdEJhc2UuamF2YQorICAgICAgICAgICAgPC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhcy1maWxlbWdyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtbWV0YWRhdGE8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9vZHQtY29tbW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b29kdC1wcm9kdWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vb2R0LXhtbHF1ZXJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuMi41PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlrYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnRpa2EtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0KKyAgICAgICAgWmlwNGogaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICAgICBGb3IgcmVmZXJlbmNlLCBzZWU6IGh0dHA6Ly93d3cubGluZ2FsYS5uZXQvemlwNGovYWJvdXQucGhwCisgICAgICAtLT4KKyAgICAgIDxncm91cElkPm5ldC5saW5nYWxhLnppcDRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+emlwNGo8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjMuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamV0dGlzb248L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMy40PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3hmPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y3hmLXJ0LXJzLWV4dGVuc2lvbi1wcm92aWRlcnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjYuODwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN4ZjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmN4Zi1ydC1mcm9udGVuZC1qYXhyczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuNi44PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3hmPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y3hmLXJ0LXRyYW5zcG9ydHMtbG9jYWw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjYuODwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4xMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnZlbG9jaXR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+dmVsb2NpdHk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9DQVNQcm9kdWN0SGFuZGxlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L0NBU1Byb2R1Y3RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkM2FkOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9DQVNQcm9kdWN0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmRhdGEuRGF0YVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5Qcm9kdWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkxhcmdlUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLm1ldGFkYXRhLkNvcmVNZXRLZXlzLio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5DQVNQcm9kdWN0SGFuZGxlck1ldEtleXMuKjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ0FTUHJvZHVjdEhhbmRsZXIgaW1wbGVtZW50cyBMYXJnZVByb2R1Y3RRdWVyeUhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmbTsKKworICAgIHB1YmxpYyBDQVNQcm9kdWN0SGFuZGxlcigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5mbSA9IG5ldyBYbWxScGNGaWxlTWFuYWdlckNsaWVudChuZXcgVVJMKFN5c3RlbS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAiZm0udXJsIiwgImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIpKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnByb2R1Y3QuUXVlcnlIYW5kbGVyI3F1ZXJ5KG9yZy5hcGFjaGUueG1scXVlcnkuWE1MUXVlcnkpCisgICAgICovCisgICAgcHVibGljIFhNTFF1ZXJ5IHF1ZXJ5KFhNTFF1ZXJ5IHF1ZXJ5KSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHdlJ2xsIG9ubHkgYWNjZXB0IHF1ZXJpZXMgZm9yIFByb2R1Y3RJZD1zb21lX2lkCisgICAgICAgIFN0cmluZyBrd2RRdWVyeSA9IHF1ZXJ5LmdldEt3ZFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgIFN0cmluZ1tdIGt3ZFF1ZXJ5VG9rcyA9IGt3ZFF1ZXJ5LnNwbGl0KCI9Iik7CisgICAgICAgIGlmIChrd2RRdWVyeVRva3MgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IChrd2RRdWVyeVRva3MgIT0gbnVsbCAmJiBrd2RRdWVyeVRva3MubGVuZ3RoICE9IDIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCBxdWVyeTogQ0FTUHJvZHVjdEhhbmRsZXIgb25seSBhY2NlcHRzIHF1ZXJpZXMgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3JtICIgKyBQUk9EVUNUX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiID0gPHNvbWUgcHJvZHVjdCBpZD46IHlvdXIgcXVlcnkgd2FzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrd2RRdWVyeSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcHJvZElkID0ga3dkUXVlcnlUb2tzWzFdOworICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdCA9IHRoaXMuZm0uZ2V0UHJvZHVjdEJ5SWQocHJvZElkKTsKKyAgICAgICAgICAgIHByb2R1Y3Quc2V0UHJvZHVjdFJlZmVyZW5jZXModGhpcy5mbS5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KSk7CisgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcXVlcnlpbmcgZmlsZSBtYW5hZ2VyIGZvciBwcm9kdWN0OiBbIiArIHByb2RJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRkUmVzdWx0c0Zyb21Qcm9kdWN0SWQocXVlcnksIHByb2R1Y3QpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVUkkgU3ludGF4IEV4Y2VwdGlvbiBkZWNpcGhlcmluZyBwcm9kdWN0OiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpICsgIl06IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnByb2R1Y3QuTGFyZ2VQcm9kdWN0UXVlcnlIYW5kbGVyI2Nsb3NlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoU3RyaW5nIGlkKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvZXNuJ3QgcmVhbGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgYi9jIHdlJ3JlIG5vdCBnb2luZworICAgICAgICAvLyB0byBrZWVwIGFueXRoaW5nIG9wZW4KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5wcm9kdWN0LkxhcmdlUHJvZHVjdFF1ZXJ5SGFuZGxlciNyZXRyaWV2ZUNodW5rKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBsb25nLCBpbnQpCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSByZXRyaWV2ZUNodW5rKFN0cmluZyBpZCwgbG9uZyBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICBieXRlW10gYnVmID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoaWQpOworICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBpbiA9IGMuZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGludCBudW1SZWFkOworICAgICAgICAgICAgbG9uZyBudW1Ta2lwcGVkOworICAgICAgICAgICAgbnVtU2tpcHBlZCA9IGluLnNraXAob2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChudW1Ta2lwcGVkICE9IG9mZnNldCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9kdWN0RXhjZXB0aW9uKCJXYXMgbm90IGFibGUgdG8gc2tpcDogWyIgKyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gYnl0ZXMgaW50byBwcm9kdWN0OiBudW0gYWN0dWFsbHkgc2tpcHBlZDogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtU2tpcHBlZCArICJdIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bVJlYWQgPSBpbi5yZWFkKGJ1ZiwgMCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKG51bVJlYWQgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2R1Y3RFeGNlcHRpb24oIldhcyBub3QgYWJsZSB0byByZWFkOiBbIiArIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBieXRlcyBmcm9tIHByb2R1Y3Q6IG51bSBhY3R1YWxseSByZWFkOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBudW1SZWFkICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9kdWN0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSU8gZXhjZXB0aW9uIHJldHJpZXZpbmcgY2h1bmsgb2YgcHJvZHVjdDogWyIgKyBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWY7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUmVzdWx0c0Zyb21Qcm9kdWN0SWQoWE1MUXVlcnkgcXVlcnksIFByb2R1Y3QgcHJvZHVjdCkKKyAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworCisgICAgICAgIGlmIChwcm9kdWN0ICE9IG51bGwgJiYgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxSZWZlcmVuY2U+IGkgPSBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZSByID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgcXVlcnkuZ2V0UmVzdWx0cygpLmFkZCh0b1Jlc3VsdChyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgTGFyZ2VSZXN1bHQgdG9SZXN1bHQoUmVmZXJlbmNlIHIpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSByLmdldE1pbWVUeXBlKCkgIT0gbnVsbCA/IHIuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICA6IERhdGFVdGlscy5ndWVzc1R5cGVGcm9tTmFtZShyLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpKTsKKyAgICAgICAgTGFyZ2VSZXN1bHQgcmVzdWx0ID0gbmV3IExhcmdlUmVzdWx0KHIuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCksCisgICAgICAgICAgICAgICAgbWltZVR5cGUsIENBU19QUk9GSUxFX0lELCBuZXcgRmlsZShuZXcgVVJJKHIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBIZWFkZXIoRklMRV9IRUFERVIsIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiB1bml0ICovKSksIHIuZ2V0RmlsZVNpemUoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvQ0FTUHJvZHVjdEhhbmRsZXJNZXRLZXlzLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvQ0FTUHJvZHVjdEhhbmRsZXJNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NWM3MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9DQVNQcm9kdWN0SGFuZGxlck1ldEtleXMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBDQVNQcm9kdWN0SGFuZGxlck1ldEtleXMgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfSEVBREVSID0gIkZpbGUiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU19QUk9GSUxFX0lEID0gIkNBUy5Qcm9maWxlLklkIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOID0gIlVOS05PV04iOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvZGF0YS9EYXRhRGVsaXZlcnlLZXlzLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvZGF0YS9EYXRhRGVsaXZlcnlLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ZTQxZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9kYXRhL0RhdGFEZWxpdmVyeUtleXMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5kYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5NZXQga2V5cyBmb3IgRGF0YSBEZWxpdmVyeSB1c2luZyB0aGUgZGF0YSBzZXJ2bGV0czwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YURlbGl2ZXJ5S2V5cyB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1pJUCA9ICJhcHBsaWNhdGlvbi94LXppcCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0hEUiA9ICJDb250ZW50LVR5cGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTEVOR1RIX0hEUiA9ICJDb250ZW50LUxlbmd0aCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTl9IRFIgPSAiQ29udGVudC1EaXNwb3NpdGlvbiI7CisgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvRGF0YURlbGl2ZXJ5U2VydmxldC5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvRGF0YURlbGl2ZXJ5U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmY3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvZGF0YS9EYXRhRGVsaXZlcnlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmRhdGE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5DYXRhbG9nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKKy8qKgorICogRGF0YSBEZWxpdmVyeSBTZXJ2bGV0LgorICogCisgKiBUaGUgRGF0YSBEZWxpdmVyeSBTZXJsdmV0IHJldHJpZXZlcyB0aGUgcHJvZHVjdCBkYXRhIGZyb20gdGhlIGZpbGUgbWFuYWdlci4KKyAqLworcHVibGljIGNsYXNzIERhdGFEZWxpdmVyeVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCBpbXBsZW1lbnRzCisgICAgRGF0YURlbGl2ZXJ5S2V5cyB7CisKKyAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKyAgICB0cnkgeworICAgICAgU3RyaW5nIGZpbGVNZ3JVUkwgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgZmlsZU1nclVSTCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAiZmlsZW1nci51cmwiKSApOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZmlsZW1nciB1cmwgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgICAgaWYgKGZpbGVNZ3JVUkwgPT0gbnVsbCkKKyAgICAgICAgZmlsZU1nclVSTCA9ICJodHRwOi8vbG9jYWxob3N0OjkwMDAiOworICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZmlsZU1nclVSTCkpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXgpOworICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGV4KTsKKyAgICB9CisKKyAgICB3b3JraW5nRGlyUGF0aCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICJmaWxlbWdyLndvcmtpbmcuZGlyIik7CisKKyAgICAvLyBuZWVkIHRoZSB3b3JraW5nIGRpciB0byBiZSBzcGVjaWZpZWQsIGVsc2UgdGhyb3cgZXhjZXB0aW9uCisgICAgaWYgKHdvcmtpbmdEaXJQYXRoID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJubyBzZXJ2bGV0IHdvcmtpbmcgZGlyIHBhdGggc3BlY2lmaWVkISIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBjbGVhbiBpdAorICAgICAgdGhpcy53b3JraW5nRGlyUGF0aCArPSB0aGlzLndvcmtpbmdEaXJQYXRoLmVuZHNXaXRoKCIvIikgPyAiIiA6ICIvIjsKKyAgICB9CisgIH0KKworICAvKioge0Bpbmhlcml0RG9jfSAqLworICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZG9QdXQocmVxLCByZXMpOworICB9CisKKyAgLyoqCisgICAqIEhhbmRsZSBhIHJlcXVlc3QgZm9yIHByb2R1Y3QgZGF0YS4gUmVxdWVzdCBwYXJhbWV0ZXJzIGluY2x1ZGUgYSBtYW5kYXRvcnkKKyAgICogPGNvZGU+cHJvZHVjdElEPC9jb2RlPiBpZGVudGlmeWluZyB3aGF0IHByb2R1Y3QgdG8gcmV0cmlldmUsIGFuZCBhbgorICAgKiBvcHRpb25hbCA8Y29kZT5yZWZJbmRleDwvY29kZT4gaW4gb3JkZXIgdG8gc2VsZWN0IHdoaWNoIHJlZmVyZW5jZSBmaWxlIHRvCisgICAqIHNlbmQuIEJ5IGRlZmF1bHQgaXQgc2VuZHMgdGhlIHplcm90aCByZWZlcmVuY2UuCisgICAqIAorICAgKiBJbiBhZGRpdGlvbiwgYW4gb3B0aW9uYWwgPGNvZGU+Zm9ybWF0PC9jb2RlPiBvcHRpb24gY2FuIGJlIHNwZWNpZmllZCB0bworICAgKiBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9kdWN0IGRhdGEgYmUgemlwcGVkIHVwIGFuZCBkZWxpdmVyZWQgYmFjayBhcyBhCisgICAqIHppcCBmaWxlLgorICAgKiAKKyAgICogQHBhcmFtIHJlcQorICAgKiAgICAgICAgICBTZXJ2bGV0IHJlcXVlc3QKKyAgICogQHBhcmFtIHJlcworICAgKiAgICAgICAgICBTZXJ2bGV0IHJlc3BvbnNlCisgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIHB1YmxpYyB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgU3RyaW5nIHByb2R1Y3RJRCA9IHJlcS5nZXRQYXJhbWV0ZXIoInByb2R1Y3RJRCIpOworICAgICAgaWYgKHByb2R1Y3RJRCA9PSBudWxsKQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm9kdWN0SUQgaXMgcmVxdWlyZWQiKTsKKyAgICAgIFN0cmluZyByZWZJbmRleCA9IHJlcS5nZXRQYXJhbWV0ZXIoInJlZkluZGV4Iik7CisgICAgICBpZiAocmVmSW5kZXggPT0gbnVsbCkKKyAgICAgICAgcmVmSW5kZXggPSAiMCI7CisgICAgICBpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHJlZkluZGV4KTsKKyAgICAgIFN0cmluZyBmb3JtYXQgPSByZXEuZ2V0UGFyYW1ldGVyKCJmb3JtYXQiKTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7CisgICAgICAgIC8vIHRoZW4ganVzdCBkZWxpdmVyIGJhY2sgdGhlIHBhcnRpY3VsYXIgcHJvZHVjdCBmaWxlCisgICAgICAgIGRlbGl2ZXJQcm9kdWN0RmlsZShyZXEsIHJlcywgaW5kZXgsIHByb2R1Y3RJRCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyBhcHBsaWNhdGlvbi94LXppcAorICAgICAgICBpZiAoIWZvcm1hdC5lcXVhbHMoRk9STUFUX1pJUCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHByb2R1Y3QgcmV0dXJuIGZvcm1hdDogIgorICAgICAgICAgICAgICArIGZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIGRlbGl2ZXJQcm9kdWN0QXNaaXAocmVxLCByZXMsIHByb2R1Y3RJRCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXgpOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGV4KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZGVsaXZlclByb2R1Y3RBc1ppcChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyBwcm9kdWN0SUQpIHRocm93cyBDYXRhbG9nRXhjZXB0aW9uIHsKKyAgICBQcm9kdWN0IHByb2R1Y3QgPSBjbGllbnQuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElEKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKGNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KSk7CisgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBjbGllbnQuZ2V0TWV0YWRhdGEocHJvZHVjdCk7CisKKyAgICAvLyB3ZSdsbCBiZSBkZWxpdmVyaW5nIGEgemlwCisgICAgcmVzLmFkZEhlYWRlcihDT05URU5UX1RZUEVfSERSLCBGT1JNQVRfWklQKTsKKworICAgIFN0cmluZyBwcm9kdWN0WmlwRmlsZVBhdGggPSBudWxsOworICAgIEZpbGUgcHJvZHVjdFppcEZpbGUgPSBudWxsOworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBPdXRwdXRTdHJlYW0gbzIgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHByb2R1Y3RaaXBGaWxlUGF0aCA9IERhdGFVdGlscy5jcmVhdGVQcm9kdWN0WmlwRmlsZShwcm9kdWN0LCBtZXRhZGF0YSwKKyAgICAgICAgICB3b3JraW5nRGlyUGF0aCk7CisgICAgICBwcm9kdWN0WmlwRmlsZSA9IG5ldyBGaWxlKHByb2R1Y3RaaXBGaWxlUGF0aCk7CisgICAgICBTdHJpbmcgcHJvZHVjdFppcEZpbGVOYW1lID0gcHJvZHVjdFppcEZpbGUuZ2V0TmFtZSgpOworCisgICAgICByZXMuYWRkSGVhZGVyKENPTlRFTlRfRElTUE9TSVRJT05fSERSLCAiYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiCisgICAgICAgICAgKyBwcm9kdWN0WmlwRmlsZU5hbWUgKyAiXCIiKTsKKworICAgICAgLy8gYWRkIHRoZSBjb250ZW50IGxlbmd0aCBmb3IgdGhlIHppcCBmaWxlIHNpemUKKyAgICAgIHJlcy5hZGRIZWFkZXIoQ09OVEVOVF9MRU5HVEhfSERSLCBTdHJpbmcudmFsdWVPZihuZXcgRmlsZSgKKyAgICAgICAgICBwcm9kdWN0WmlwRmlsZVBhdGgpLmxlbmd0aCgpKSk7CisKKyAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlYWQgdGhlIHppcCBmaWxlIGluLCBhbmQgd3JpdGUgaXQgdG8gdGhlIG91dHB1dAorICAgICAgLy8gc3RyZWFtCisgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvZHVjdFppcEZpbGUpOworCisgICAgICAvLyBDYWxsIGphdmEuaW8uRmlsZS5kZWxldGUoKSBvbiB0aGUgZmlsZSwgd2hpbGUgc3RpbGwgb3Blbi4KKyAgICAgIGlmICghcHJvZHVjdFppcEZpbGUuZGVsZXRlKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgc3RyZWFtaW5nIGZpbGU6IFsiCisgICAgICAgICAgICArIHByb2R1Y3RaaXBGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIl0gd2hpbGUgZGVsaXZlcmluZyEiKTsKKyAgICAgIH0KKworICAgICAgLy8gMy4gRGVsaXZlciB0aGUgZGF0YS4KKyAgICAgIG8yID0gcmVzLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUxMl07CisgICAgICBpbnQgbjsKKyAgICAgIHdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgIT0gLTEpCisgICAgICAgIG8yLndyaXRlKGJ1ZiwgMCwgbik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZGVsaXZlcmluZyBkYXRhITogTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGluID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKG8yICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBvMi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBvMiA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHByb2R1Y3RaaXBGaWxlID0gbnVsbDsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkZWxpdmVyUHJvZHVjdEZpbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBpbnQgaW5kZXgsIFN0cmluZyBwcm9kdWN0SUQpCisgICAgICB0aHJvd3MgQ2F0YWxvZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFByb2R1Y3QgcHJvZHVjdCA9IGNsaWVudC5nZXRQcm9kdWN0QnlJZChwcm9kdWN0SUQpOworICAgIExpc3QgcmVmcyA9IGNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KTsKKyAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVmcy5nZXQoaW5kZXgpOworICAgIHJlcy5hZGRIZWFkZXIoQ09OVEVOVF9MRU5HVEhfSERSLCBTdHJpbmcudmFsdWVPZihyZWYuZ2V0RmlsZVNpemUoKSkpOworICAgIFN0cmluZyBjb250ZW50VHlwZSA9IChyZWYuZ2V0TWltZVR5cGUoKSAhPSBudWxsCisgICAgICAgICYmIHJlZi5nZXRNaW1lVHlwZSgpLmdldE5hbWUoKSAhPSBudWxsICYmICFyZWYuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkKKyAgICAgICAgLmVxdWFscygiIikpID8gcmVmLmdldE1pbWVUeXBlKCkuZ2V0TmFtZSgpIDogRGF0YVV0aWxzCisgICAgICAgIC5ndWVzc1R5cGVGcm9tTmFtZShyZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgIHJlcy5hZGRIZWFkZXIoQ09OVEVOVF9UWVBFX0hEUiwgY29udGVudFR5cGUpOworICAgIHRyeSB7CisgICAgICByZXMuYWRkSGVhZGVyKENPTlRFTlRfRElTUE9TSVRJT05fSERSLCAiYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiCisgICAgICAgICAgKyBuZXcgRmlsZShuZXcgVVJJKHJlZi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpLmdldE5hbWUoKSArICJcIiIpOworICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVuYWJsZSB0byBzZW5zZSBmaWxlbmFtZSBmcm9tIGRhdGEgc3RvcmUgVVJJOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBVUkwgdXJsID0gbmV3IFVSTChyZWYuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpOworICAgIFVSTENvbm5lY3Rpb24gYyA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgIElucHV0U3RyZWFtIGluID0gYy5nZXRJbnB1dFN0cmVhbSgpOworICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUxMl07CisgICAgaW50IG47CisgICAgd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSAhPSAtMSkKKyAgICAgIG91dC53cml0ZShidWYsIDAsIG4pOworICAgIGluLmNsb3NlKCk7CisgICAgb3V0LmNsb3NlKCk7CisgIH0KKworICAvKiogQ2xpZW50IGkvZiB0byBmaWxlbWdyIHNlcnZlci4gKi8KKyAgcHJpdmF0ZSBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgLyoqIG91ciBsb2cgc3RyZWFtICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERhdGFEZWxpdmVyeVNlcnZsZXQuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8qKiBvdXIgd29ya2luZyBkaXIgcGF0aC4gKi8KKyAgcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpclBhdGg7CisKKyAgLyoqIHNlcmlhbCB2ZXJzaW9uIFVJRC4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTk1NTYxMzQwNzQ5NTA2MDg2OUw7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9kYXRhL0RhdGFVdGlscy5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvRGF0YVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyZWFkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9kYXRhL0RhdGFVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5kYXRhOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLlNlcmlhbGl6YWJsZU1ldGFkYXRhOworCisvKioKKyAqIAorICogVXRpbGl0eSBtZXRob2RzIGZvciBkZWxpdmVyaW5nIGRhdGEgdXNpbmcgdGhlIGZpbGVtZ3Igc2VydmxldCBkYXRhIEFQSS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJCAuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhVXRpbHMgaW1wbGVtZW50cyBEYXRhRGVsaXZlcnlLZXlzIHsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihEYXRhVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKiBmaWxlIGZpbHRlciB0byBsaXN0IHppcCBmaWxlcyAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlRmlsdGVyIFpJUF9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7CisgICAgICByZXR1cm4gZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnppcCIpOworICAgIH0KKworICB9OworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURhdGFzZXRaaXBGaWxlKFByb2R1Y3RUeXBlIHR5cGUsCisgICAgICBTdHJpbmcgd29ya2luZ0RpclBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBkYXRhc2V0WmlwRmlsZU5hbWUgPSB0eXBlLmdldE5hbWUoKSArICIuemlwIjsKKyAgICB3b3JraW5nRGlyUGF0aCArPSB3b3JraW5nRGlyUGF0aC5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyI7CisgICAgU3RyaW5nIGRhdGFzZXRaaXBGaWxlUGF0aCA9IHdvcmtpbmdEaXJQYXRoICsgZGF0YXNldFppcEZpbGVOYW1lOworCisgICAgLy8gdHJ5IGFuZCByZW1vdmUgaXQgZmlyc3QKKyAgICBpZiAoIW5ldyBGaWxlKGRhdGFzZXRaaXBGaWxlUGF0aCkuZGVsZXRlKCkpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkF0dGVtcHQgdG8gcmVtb3ZlIHRlbXAgZGF0YXNldCB6aXAgZmlsZTogWyIKKyAgICAgICAgICArIGRhdGFzZXRaaXBGaWxlUGF0aCArICJdIGZhaWxlZC4iKTsKKyAgICB9CisKKyAgICAvLyBnZXQgYSBsaXN0IG9mIGFsbCB0aGUgcHJvZHVjdCB6aXAgZmlsZXMgd2l0aGluIHRoZSB0ZW1wIGRpcgorICAgIC8vIGFzc3VtcHRpb246IHRoZSB0ZW1wIGRpciBwcm92aWRlZCBoYXMgYSB3aG9sZSBidW5jaCBvZiAqLnppcCBmaWxlcworICAgIC8vIHRoYXQgYXJlIHppcHMgb2YgdGhlIHByb2R1Y3RzIChhbmQgdGhlaXIgZmlsZXMgYW5kIG1ldGFkYXRhKQorICAgIC8vIGJlbG9uZ2luZworICAgIC8vIHRvIHRoaXMgZGF0YXNldAorCisgICAgLy8gTk9URTogaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBzdGVwIGJlIGRvbmUgQkVGT1JFIGNyZWF0aW5nIHRoZSB6aXAKKyAgICAvLyBvdXRwdXQgc3RyZWFtOiBlbHNlIHRoYXQgd2lsbCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGRhdHNldCB6aXAgdG8gYmUKKyAgICAvLyBpbmNsdWRlZCBhcyB3ZWxsIQorICAgIEZpbGVbXSBwcm9kdWN0WmlwRmlsZXMgPSBuZXcgRmlsZSh3b3JraW5nRGlyUGF0aCkubGlzdEZpbGVzKFpJUF9GSUxURVIpOworICAgIGlmIChwcm9kdWN0WmlwRmlsZXMgPT0gbnVsbCB8fCBwcm9kdWN0WmlwRmlsZXMubGVuZ3RoID09IDApCisgICAgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gcHJvZHVjdCB6aXAgZmlsZXMgdG8gaW5jbHVkZSBpbiBkYXRhc2V0OiBbIgorICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiXSIpOworICAgIH0KKworICAgIC8vIG5vdyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHppcCBmaWxlIHRoYXQgd2Ugd2FudCB0byB3cml0ZQorICAgIFppcE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorICAgICAgICBkYXRhc2V0WmlwRmlsZVBhdGgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvZHVjdFppcEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBwcm9kdWN0WmlwRmlsZXNbaV0uZ2V0TmFtZSgpOworICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9kdWN0WmlwRmlsZXNbaV0KKyAgICAgICAgICAuZ2V0QWJzb2x1dGVGaWxlKCkpOworICAgICAgYWRkWmlwRW50cnlGcm9tU3RyZWFtKGluLCBvdXQsIGZpbGVuYW1lKTsKKyAgICAgIGluLmNsb3NlKCk7CisgICAgICAKKyAgICAgIGlmICghcHJvZHVjdFppcEZpbGVzW2ldLmRlbGV0ZSgpKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byByZW1vdmUgdGVtcG9hcnkgcHJvZHVjdCB6aXAgZmlsZTogWyIKKyAgICAgICAgICAgICsgcHJvZHVjdFppcEZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpICsgIl0iKTsKKyAgICAgIH0KKyAgICAgIGVsc2V7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkRlbGV0aW5nIG9yaWdpbmFsIHByb2R1Y3QgemlwIGZpbGU6IFsiCisgICAgICAgICAgICArIHByb2R1Y3RaaXBGaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gYWRkIG1ldCBmaWxlCisgICAgYWRkTWV0RmlsZVRvUHJvZHVjdFppcCh0eXBlLmdldFR5cGVNZXRhZGF0YSgpLCB0eXBlLmdldE5hbWUoKSwgb3V0KTsKKworICAgIC8vIENvbXBsZXRlIHRoZSBaSVAgZmlsZQorICAgIG91dC5jbG9zZSgpOworCisgICAgLy8gcmV0dXJuIHRoZSB6aXAgZmlsZSBwYXRoCisgICAgcmV0dXJuIGRhdGFzZXRaaXBGaWxlUGF0aDsKKworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlUHJvZHVjdFppcEZpbGUoUHJvZHVjdCBwcm9kdWN0LCBNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgIFN0cmluZyB3b3JraW5nRGlyUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHByb2R1Y3RaaXBGaWxlTmFtZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSArICIuemlwIjsKKyAgICB3b3JraW5nRGlyUGF0aCArPSB3b3JraW5nRGlyUGF0aC5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyI7CisgICAgU3RyaW5nIHByb2R1Y3RaaXBGaWxlUGF0aCA9IHdvcmtpbmdEaXJQYXRoICsgcHJvZHVjdFppcEZpbGVOYW1lOworCisgICAgLy8gdHJ5IGFuZCByZW1vdmUgaXQgZmlyc3QKKyAgICBpZiAoIW5ldyBGaWxlKHByb2R1Y3RaaXBGaWxlUGF0aCkuZGVsZXRlKCkpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkF0dGVtcHQgdG8gcmVtb3ZlIHRlbXAgemlwIGZpbGU6IFsiCisgICAgICAgICAgKyBwcm9kdWN0WmlwRmlsZVBhdGggKyAiXSBmYWlsZWQuIik7CisgICAgfQorCisgICAgLy8gbm93IGdldCBhIHJlZmVyZW5jZSB0byB0aGUgemlwIGZpbGUgdGhhdCB3ZSB3YW50IHRvIHdyaXRlCisgICAgWmlwT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCisgICAgICAgIHByb2R1Y3RaaXBGaWxlUGF0aCkpOworCisgICAgZm9yIChJdGVyYXRvciBpID0gcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgUmVmZXJlbmNlIHIgPSAoUmVmZXJlbmNlKSBpLm5leHQoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgRmlsZSBwcm9kRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkkoci5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKSkpOworICAgICAgICBpZiAocHJvZEZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRGF0YSBzdG9yZSByZWZlcmVuY2UgaXMgYSBkaXJlY3RvcnkuIE5vdCBhZGRpbmcgZGlyZWN0b3J5IHRvIHRoZSB6aXAgZmlsZTogWyIKKyAgICAgICAgICAgICAgICAgICAgKyByLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpICsgIl0iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHByb2RGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9kRmlsZS5nZXRBYnNvbHV0ZUZpbGUoKSk7CisgICAgICAgIGFkZFppcEVudHJ5RnJvbVN0cmVhbShpbiwgb3V0LCBmaWxlbmFtZSk7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZ2V0IGZpbGVuYW1lIGZyb20gdXJpOiBbIgorICAgICAgICAgICAgKyByLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpICsgIl0iKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIC8vIGFkZCBtZXQgZmlsZQorICAgIGFkZE1ldEZpbGVUb1Byb2R1Y3RaaXAobWV0YWRhdGEsIHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKSwgb3V0KTsKKworICAgIC8vIENvbXBsZXRlIHRoZSBaSVAgZmlsZQorICAgIG91dC5jbG9zZSgpOworCisgICAgLy8gcmV0dXJuIHRoZSB6aXAgZmlsZSBwYXRoCisgICAgcmV0dXJuIHByb2R1Y3RaaXBGaWxlUGF0aDsKKworICB9CisKKyAgLyoqCisgICAqIEd1ZXNzIHdoYXQgdGhlIGNvbnRlbnQgdHlwZSBpcyBmcm9tIHRoZSBnaXZlbiB1cmwuCisgICAqIAorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICBVUkwgdG8gcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIEEgZ3Vlc3NlZCBjb250ZW50IHR5cGUuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc1R5cGVGcm9tTmFtZShTdHJpbmcgbmFtZSkgeworICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5qcGciKSB8fCBuYW1lLmVuZHNXaXRoKCIuanBlZyIpKQorICAgICAgcmV0dXJuICJpbWFnZS9qcGVnIjsKKyAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCIucG5nIikpCisgICAgICByZXR1cm4gImltYWdlL3BuZyI7CisgICAgZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiLmdpZiIpKQorICAgICAgcmV0dXJuICJpbWFnZS9naWYiOworICAgIGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoIi5kb2MiKSkKKyAgICAgIHJldHVybiAiYXBwbGljYXRpb24vbXN3b3JkIjsKKyAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCIucGRmIikpCisgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3BkZiI7CisgICAgZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiLnJ0ZiIpKQorICAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi9ydGYiOworICAgIGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoIi54bHMiKSkKKyAgICAgIHJldHVybiAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIjsKKyAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCIucHB0IikpCisgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IjsKKyAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCIuaHRtbCIpIHx8IG5hbWUuZW5kc1dpdGgoIi5odG0iKSkKKyAgICAgIHJldHVybiAidGV4dC9odG1sIjsKKyAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCIueG1sIikpCisgICAgICByZXR1cm4gInRleHQveG1sIjsKKyAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCIudHh0IikpCisgICAgICByZXR1cm4gInRleHQvcGxhaW4iOworICAgIHJldHVybiAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTWV0RmlsZVRvUHJvZHVjdFppcChNZXRhZGF0YSBwcm9kdWN0TWV0LAorICAgICAgU3RyaW5nIG1ldEZpbGVCYXNlTmFtZSwgWmlwT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAvLyBnZXQgdGhlIHByb2R1Y3QgbWV0YWRhdGEsIGFuZCBhZGQgaXRzIG1ldCBmaWxlIHRvIHRoZSBzdHJlYW0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbWV0T3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFNlcmlhbGl6YWJsZU1ldGFkYXRhIHNlcmlhbE1ldCA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShwcm9kdWN0TWV0KTsKKyAgICBzZXJpYWxNZXQud3JpdGVNZXRhZGF0YVRvWG1sU3RyZWFtKG1ldE91dCk7CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gbWV0SW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWV0T3V0LnRvQnl0ZUFycmF5KCkpOworICAgIFN0cmluZyBtZXRGaWxlTmFtZSA9IG1ldEZpbGVCYXNlTmFtZSArICIubWV0IjsKKyAgICBhZGRaaXBFbnRyeUZyb21TdHJlYW0obWV0SW4sIG91dCwgbWV0RmlsZU5hbWUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRaaXBFbnRyeUZyb21TdHJlYW0oSW5wdXRTdHJlYW0gaXMsIFppcE91dHB1dFN0cmVhbSBvcywKKyAgICAgIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNTEyXTsKKyAgICBvcy5wdXROZXh0RW50cnkobmV3IFppcEVudHJ5KGZpbGVuYW1lKSk7CisKKyAgICBpbnQgbGVuOworICAgIHdoaWxlICgobGVuID0gaXMucmVhZChidWYpKSA+IDApIHsKKyAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICB9CisKKyAgICAvLyBDb21wbGV0ZSB0aGUgZW50cnkKKyAgICBvcy5jbG9zZUVudHJ5KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvRGF0YXNldERlbGl2ZXJ5U2VydmxldC5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvRGF0YXNldERlbGl2ZXJ5U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzA4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvZGF0YS9EYXRhc2V0RGVsaXZlcnlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmRhdGE7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN5c3RlbS5YbWxScGNGaWxlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogRGVsaXZlcnMgYmFjayBlbnRpcmUge0BsaW5rIFByb2R1Y3RUeXBlfXMgKG9yIDxjb2RlPkRhdGFzZXQ8L2NvZGU+cykgYXMKKyAqIHppcHBlZCB1cCBwYWNrYWdlcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGF0YXNldERlbGl2ZXJ5U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMKKyAgICBEYXRhRGVsaXZlcnlLZXlzIHsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKERhdGFzZXREZWxpdmVyeVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKiBzZXJpYWwgdmVyc2lvbiBVSUQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY2OTI2NjU2OTA2NzQxODYxMDVMOworCisgIC8qIG91ciBmaWxlIG1hbmFnZXIgY2xpZW50ICovCisgIHByaXZhdGUgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50OworCisgIC8qIHRoZSB3b3JraW5nIGRpciBpbiB3aGljaCB0byBjcmVhdGUgaHVnZSB6aXAgZmlsZXMgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpclBhdGg7CisKKyAgLyogaW5kaWNhdGVzIHRoZSBwcm9kdWN0IGhhcyBiZWVuIHppcHBlZCB1cCBhbHJlYWR5ICovCisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBTFJFQURZX1pJUFBFRCA9ICIwMGdhIjsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCNkb0dldChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0LAorICAgKiBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSkKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBkb1B1dChyZXEsIHJlcyk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIE1ldGhvZCByZXF1aXJlcyBhIHNpbmdsZSBwYXJhbWV0ZXIsIDxjb2RlPnR5cGVJRDwvY29kZT4sIHNwZWNpZnlpbmcgYSB2YWxpZAorICAgKiB7QGxpbmsgUHJvZHVjdFR5cGV9IHdpdGhpbiB0aGUgZmlsZW1nci4gQWxsIHtAbGluayBQcm9kdWN0fXMgYXNzb2NpYXRlZAorICAgKiB3aXRoIHRoZSBnaXZlbiA8Y29kZT50eXBlSUQ8L2NvZGU+IGFyZSBwYWNrYWdlZCB1cCAoYXMgemlwIGZpbGVzKSwgYW5kIHRoZW4KKyAgICogYWdncmVnYXRlZCBhbmQgemlwcGVkIGFuZCBkZWxpdmVyZWQgYXMgYW4gZW50aXJlIGNvbGxlY3Rpb24gY2FsbGVkIGEKKyAgICogPGNvZGU+RGF0YXNldDwvY29kZT4uCisgICAqIAorICAgKiBAcGFyYW0gcmVxCisgICAqICAgICAgICAgIFNlcnZsZXQgcmVxdWVzdC4KKyAgICogQHBhcmFtIHJlcworICAgKiAgICAgICAgICBTZXJ2bGV0IHJlc3BvbnNlCisgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgIFN0cmluZyB0eXBlSUQgPSByZXEuZ2V0UGFyYW1ldGVyKCJ0eXBlSUQiKTsKKyAgICBQcm9kdWN0VHlwZSB0eXBlID0gbnVsbDsKKworICAgIGlmICh0eXBlSUQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdHlwZUlEIHBhcmFtZXRlciBzcGVjaWZpZWQhIik7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHR5cGUgPSBjbGllbnQuZ2V0UHJvZHVjdFR5cGVCeUlkKHR5cGVJRCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJVbmFibGUgdG8gZGVkdWNlIHByb2R1Y3QgdHlwZTogWyIgKyB0eXBlSUQKKyAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBhIHRlbXBvcmFyeSBwcm9kdWN0IGRpcjogd2UnbGwgdXNlIHdvcmtpbmcgZGlyICsgdHlwZU5hbWUKKyAgICBTdHJpbmcgcHJvZHVjdERpclBhdGggPSB3b3JraW5nRGlyUGF0aCArIHR5cGUuZ2V0TmFtZSgpOworICAgIGlmICghbmV3IEZpbGUocHJvZHVjdERpclBhdGgpLm1rZGlycygpKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIm1rZGlycyByZXR1cm5lZCBmYWxzZSBmb3IgdGVtcG9yYXJ5IGRhdGFzZXQgZGlyOiBbIiArIHByb2R1Y3REaXJQYXRoCisgICAgICAgICAgICAgICsgIl06IGVycm9ycyBtYXkgZm9sbG93Iik7CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBwYWdpbmF0aW9uIEFQSSB0byBpdGVyYXRlIG92ZXIgZWFjaCBwcm9kdWN0CisgICAgLy8gZm9yIGVhY2ggcHJvZHVjdCwgemlwIGl0IHVwCisgICAgLy8gYWZ0ZXIgeW91IHppcCB1cCBhbGwgcHJvZHVjdHMgdGhlbiBjcmVhdGUgdGhlIGRhdGFzZXQgemlwCisKKyAgICBQcm9kdWN0UGFnZSBwYWdlID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBwYWdlID0gY2xpZW50LmdldEZpcnN0UGFnZSh0eXBlKTsKKyAgICAgIGlmIChwYWdlID09IG51bGwKKyAgICAgICAgICB8fCAocGFnZSAhPSBudWxsICYmIHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkgPT0gbnVsbCkKKyAgICAgICAgICB8fCAocGFnZSAhPSBudWxsICYmIHBhZ2UuZ2V0UGFnZVByb2R1Y3RzKCkgIT0gbnVsbCAmJiBwYWdlCisgICAgICAgICAgICAgIC5nZXRQYWdlUHJvZHVjdHMoKS5zaXplKCkgPT0gMCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIk5vIHByb2R1Y3RzIGZvciBkYXRhc2V0OiBbIgorICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICJdIik7CisgICAgICB9CisKKyAgICAgIE1hcCBwcm9kdWN0SGFzaCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgIGRvIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICBQcm9kdWN0IHByb2R1Y3QgPSAoUHJvZHVjdCkgaS5uZXh0KCk7CisgICAgICAgICAgaWYgKGFscmVhZHlaaXBwZWQocHJvZHVjdCwgcHJvZHVjdEhhc2gpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG51bGw7CisgICAgICAgICAgcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhjbGllbnQuZ2V0UHJvZHVjdFJlZmVyZW5jZXMocHJvZHVjdCkpOworICAgICAgICAgIG1ldGFkYXRhID0gY2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICAgIERhdGFVdGlscy5jcmVhdGVQcm9kdWN0WmlwRmlsZShwcm9kdWN0LCBtZXRhZGF0YSwgcHJvZHVjdERpclBhdGgpOworICAgICAgICAgIHByb2R1Y3RIYXNoLnB1dChwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCksIEFMUkVBRFlfWklQUEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhZ2UgPSBjbGllbnQuZ2V0TmV4dFBhZ2UodHlwZSwgcGFnZSk7CisKKyAgICAgIH0gd2hpbGUgKChwYWdlICE9IG51bGwgJiYgIXBhZ2UuaXNMYXN0UGFnZSgpKQorICAgICAgICAgICYmIChwYWdlLmdldFBhZ2VQcm9kdWN0cygpICE9IG51bGwgJiYgcGFnZS5nZXRQYWdlUHJvZHVjdHMoKS5zaXplKCkgPiAwKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLy8gbm93IHRoYXQgYWxsIHByb2R1Y3QgemlwcyBoYXZlIGJlZW4gY3JlYXRlZCwgY3JlYXRlIHRoZSBkYXRhc2V0CisgICAgLy8gemlwCisgICAgU3RyaW5nIGRhdGFzZXRaaXBGaWxlUGF0aCA9IG51bGw7CisgICAgRmlsZSBkYXRhc2V0WmlwRmlsZSA9IG51bGw7CisgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgIE91dHB1dFN0cmVhbSBvMiA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgZGF0YXNldFppcEZpbGVQYXRoID0gRGF0YVV0aWxzLmNyZWF0ZURhdGFzZXRaaXBGaWxlKHR5cGUsIHByb2R1Y3REaXJQYXRoKTsKKworICAgICAgZGF0YXNldFppcEZpbGUgPSBuZXcgRmlsZShkYXRhc2V0WmlwRmlsZVBhdGgpOworICAgICAgU3RyaW5nIGRhdGFzZXRaaXBGaWxlTmFtZSA9IGRhdGFzZXRaaXBGaWxlLmdldE5hbWUoKTsKKworICAgICAgcmVzLmFkZEhlYWRlcihDT05URU5UX0RJU1BPU0lUSU9OX0hEUiwgImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIgorICAgICAgICAgICsgZGF0YXNldFppcEZpbGVOYW1lICsgIlwiIik7CisKKyAgICAgIC8vIGFkZCB0aGUgY29udGVudCBsZW5ndGggZm9yIHRoZSB6aXAgZmlsZSBzaXplCisgICAgICByZXMuYWRkSGVhZGVyKENPTlRFTlRfTEVOR1RIX0hEUiwgU3RyaW5nLnZhbHVlT2YobmV3IEZpbGUoCisgICAgICAgICAgZGF0YXNldFppcEZpbGVQYXRoKS5sZW5ndGgoKSkpOworCisgICAgICAvLyBub3cgd2UgbmVlZCB0byByZWFkIHRoZSB6aXAgZmlsZSBpbiwgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKKyAgICAgIC8vIHN0cmVhbQorICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRhdGFzZXRaaXBGaWxlKTsKKworICAgICAgLy8gQ2FsbCBqYXZhLmlvLkZpbGUuZGVsZXRlKCkgb24gdGhlIGZpbGUsIHdoaWxlIHN0aWxsIG9wZW4uCisgICAgICBpZiAoIWRhdGFzZXRaaXBGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIHN0cmVhbWluZyBmaWxlOiBbIgorICAgICAgICAgICAgKyBkYXRhc2V0WmlwRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIHdoaWxlIGRlbGl2ZXJpbmchIik7CisgICAgICB9CisKKyAgICAgIC8vIDMuIERlbGl2ZXIgdGhlIGRhdGEuCisgICAgICBvMiA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOworICAgICAgaW50IG47CisgICAgICB3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpICE9IC0xKQorICAgICAgICBvMi53cml0ZShidWYsIDAsIG4pOworCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZGVsaXZlcmluZyBkYXRhc2V0OiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgaW4gPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAobzIgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIG8yLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIG8yID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgLy8gbm93IHRyeSBhbmQgcmVtb3ZlIHRoZSB0bXAgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZQorICAgICAgLy8gZGF0YXNldCB6aXAKKyAgICAgIGlmIChkYXRhc2V0WmlwRmlsZSAhPSBudWxsKSB7CisgICAgICAgIGRhdGFzZXRaaXBGaWxlLmdldFBhcmVudEZpbGUoKS5kZWxldGUoKTsKKyAgICAgIH0KKyAgICAgIGRhdGFzZXRaaXBGaWxlID0gbnVsbDsKKyAgICB9CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgamF2YXguc2VydmxldC5HZW5lcmljU2VydmxldCNpbml0KGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZykKKyAgICovCisgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBzdXBlci5pbml0KGNvbmZpZyk7CisKKyAgICB0cnkgeworICAgICAgU3RyaW5nIGZpbGVNZ3JVUkwgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgZmlsZU1nclVSTCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAiZmlsZW1nci51cmwiKSApOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZmlsZW1nciB1cmwgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfSAgICAgIAorICAgICAgaWYgKGZpbGVNZ3JVUkwgPT0gbnVsbCkKKyAgICAgICAgZmlsZU1nclVSTCA9ICJodHRwOi8vbG9jYWxob3N0OjkwMDAiOworICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZmlsZU1nclVSTCkpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXgpOworICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGV4KTsKKyAgICB9CisKKyAgICB3b3JraW5nRGlyUGF0aCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICJmaWxlbWdyLndvcmtpbmcuZGlyIik7CisKKyAgICAvLyBuZWVkIHRoZSB3b3JraW5nIGRpciB0byBiZSBzcGVjaWZpZWQsIGVsc2UgdGhyb3cgZXhjZXB0aW9uCisgICAgaWYgKHdvcmtpbmdEaXJQYXRoID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJubyBzZXJ2bGV0IHdvcmtpbmcgZGlyIHBhdGggc3BlY2lmaWVkISIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBjbGVhbiBpdAorICAgICAgdGhpcy53b3JraW5nRGlyUGF0aCArPSB0aGlzLndvcmtpbmdEaXJQYXRoLmVuZHNXaXRoKCIvIikgPyAiIiA6ICIvIjsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBhbHJlYWR5WmlwcGVkKFByb2R1Y3QgcCwgTWFwIGhhc2gpIHsKKyAgICByZXR1cm4gaGFzaC5jb250YWluc0tleShwLmdldFByb2R1Y3ROYW1lKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9jb25maWd1cmF0aW9ucy9SZGZDb25maWd1cmF0aW9uLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvUmRmQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2QzNmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvUmRmQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmNvbmZpZ3VyYXRpb25zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ0VzY2FwZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLldvcmRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRpbmcgY3VzdG9tIGNvbmZpZ3VyYXRpb25zIGZvciBSREYgWE1MIG91dHB1dHMuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSZGZDb25maWd1cmF0aW9uCit7CisgIC8vIENvbnN0YW50cyB1c2VkIHRvIGlkZW50aWZ5IGl0ZW1zIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSREZfUkVTX0FUVFIgPSAicmRmOnJlc291cmNlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX09VVEVSID0gIm5hbWVzcGFjZXMiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfSU5ORVIgPSAibnMiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfS0VZID0gIm5hbWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVkFMVUUgPSAidmFsdWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9PVVRFUiA9ICJyZXdyaXRlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFV1JJVEVfSU5ORVIgPSAia2V5IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFV1JJVEVfS0VZID0gImZyb20iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9WQUxVRSA9ICJ0byI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNMSU5LX09VVEVSID0gInJlc291cmNlbGlua3MiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTElOS19JTk5FUiA9ICJrZXkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTElOS19LRVkgPSAibmFtZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNMSU5LX1ZBTFVFID0gImxpbmsiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09VVEVSID0gImtleW5zbWFwIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JTk5FUiA9ICJrZXkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0tFWSA9ICJuYW1lIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRSA9ICJucyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVGQVVMVCA9ICJkZWZhdWx0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT1VURVIgPSAidHlwZXNuc21hcCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lOTkVSID0gInR5cGUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9LRVkgPSAibmFtZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1ZBTFVFID0gIm5zIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVGQVVMVCA9ICJkZWZhdWx0IjsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJld3JpdGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc0xpbmtNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGtleU5zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlc05zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRLZXlOcyA9IG51bGw7CisgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRUeXBlTnMgPSBudWxsOworCisKKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzaW5nIHZhbHVlcyBmcm9tCisgICAqIHRoZSBzdXBwbGllZCBmaWxlLgorICAgKiBAcGFyYW0gZmlsZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWFkCisgICAqLworICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgIHsKKyAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QoZmlzKTsKKyAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBuc01hcCA9IHJlYWRDb25maWd1cmF0aW9uKHJvb3QsCisgICAgICBOU19PVVRFUiwgTlNfSU5ORVIsIE5TX0tFWSwgTlNfVkFMVUUpOworCisgICAgcmV3cml0ZU1hcCA9IHJlYWRDb25maWd1cmF0aW9uKHJvb3QsCisgICAgICBSRVdSSVRFX09VVEVSLCBSRVdSSVRFX0lOTkVSLCBSRVdSSVRFX0tFWSwgUkVXUklURV9WQUxVRSk7CisKKyAgICByZXNMaW5rTWFwID0gcmVhZENvbmZpZ3VyYXRpb24ocm9vdCwKKyAgICAgIFJFU0xJTktfT1VURVIsIFJFU0xJTktfSU5ORVIsIFJFU0xJTktfS0VZLCBSRVNMSU5LX1ZBTFVFKTsKKworICAgIGtleU5zTWFwID0gcmVhZENvbmZpZ3VyYXRpb24ocm9vdCwKKyAgICAgIEtFWV9PVVRFUiwgS0VZX0lOTkVSLCBLRVlfS0VZLCBLRVlfVkFMVUUpOworCisgICAgdHlwZXNOc01hcCA9IHJlYWRDb25maWd1cmF0aW9uKHJvb3QsCisgICAgICBUWVBFX09VVEVSLCBUWVBFX0lOTkVSLCBUWVBFX0tFWSwgVFlQRV9WQUxVRSk7CisKKyAgICBFbGVtZW50IGtleU5zUm9vdCA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudChLRVlfT1VURVIsIHJvb3QpOworICAgIGRlZmF1bHRLZXlOcyA9IGtleU5zUm9vdC5nZXRBdHRyaWJ1dGUoS0VZX0RFRkFVTFQpOworCisgICAgRWxlbWVudCB0eXBlTnNSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KFRZUEVfT1VURVIsIHJvb3QpOworICAgIGRlZmF1bHRUeXBlTnMgPSB0eXBlTnNSb290LmdldEF0dHJpYnV0ZShUWVBFX0RFRkFVTFQpOworCisgICAgZmlzLmNsb3NlKCk7CisgIH0KKworCisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlYWRDb25maWd1cmF0aW9uKEVsZW1lbnQgZWxlbWVudCwKKyAgICBTdHJpbmcgb3V0ZXJUYWcsIFN0cmluZyBpbm5lclRhZywgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQorICB7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgIEVsZW1lbnQgb3V0ZXIgPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQob3V0ZXJUYWcsIGVsZW1lbnQpOworICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gb3V0ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaW5uZXJUYWcpOworICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKKyAgICB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspCisgICAgICB7CisgICAgICAgIEVsZW1lbnQgaW5uZXIgPSAoRWxlbWVudCkgbm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgbWFwLnB1dChpbm5lci5nZXRBdHRyaWJ1dGUoa2V5KSwgaW5uZXIuZ2V0QXR0cmlidXRlKHZhbHVlKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1hcDsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbmFtZXNwYWNlIG1hcCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uCisgICAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBtYXAgZm9yIHRoZSBjb25maWd1cmF0aW9uCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXROYW1lc3BhY2VzKCkKKyAgeworICAgIHJldHVybiBuc01hcDsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgcmVxdWVzdGVkIHZhbHVlIGZyb20gdGhlIGtleSBuYW1lc3BhY2UgbWFwIGlmIGl0IGlzIGZvdW5kLAorICAgKiBvdGhlcndpc2UgZ2V0cyB0aGUgZGVmYXVsdCBrZXkgbmFtZXNwYWNlLgorICAgKiBAcGFyYW0ga2V5IHRoZSBtYXAga2V5IHRvIHVzZSBmb3IgcmV0cmlldmluZyB0aGUgbmFtZXNwYWNlCisgICAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSB2YWx1ZSBmb3IgdGhlIG1hcCBrZXkgaWYgZm91bmQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdAorICAgKiBuYW1lc3BhY2UKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5TmFtZXNwYWNlKFN0cmluZyBrZXkpCisgIHsKKyAgICByZXR1cm4ga2V5TnNNYXAuY29udGFpbnNLZXkoa2V5KSA/IGtleU5zTWFwLmdldChrZXkpIDogZGVmYXVsdEtleU5zOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSByZXF1ZXN0ZWQgdmFsdWUgZnJvbSB0aGUgdHlwZSBuYW1lc3BhY2UgbWFwIGlmIGl0IGlzIGZvdW5kLAorICAgKiBvdGhlcndpc2UgZ2V0cyB0aGUgZGVmYXVsdCB0eXBlIG5hbWVzcGFjZS4KKyAgICogQHBhcmFtIGtleSB0aGUgbWFwIGtleSB0byB1c2UgZm9yIHJldHJpZXZpbmcgdGhlIG5hbWVzcGFjZQorICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgdmFsdWUgZm9yIHRoZSBtYXAga2V5IGlmIGZvdW5kLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQKKyAgICogbmFtZXNwYWNlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lc3BhY2UoU3RyaW5nIGtleSkKKyAgeworICAgIHJldHVybiB0eXBlc05zTWFwLmNvbnRhaW5zS2V5KGtleSkgPyB0eXBlc05zTWFwLmdldChrZXkpIDogZGVmYXVsdFR5cGVOczsKKyAgfQorCisKKworICAvKioKKyAgICogQ3JlYXRlcyBhbiB7QGxpbmsgRWxlbWVudH0gZm9yIGEge0BsaW5rIERvY3VtZW50fS4KKyAgICogQHBhcmFtIGtleSBhIG1hcCBrZXkgdXNlZCB0byBzZWFyY2ggdGhpcyBjb25maWd1cmF0aW9uJ3MgbWFwcworICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGZvciB0aGUgZWxlbWVudAorICAgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IGNvbnRleHQgb2YgdGhlIGVsZW1lbnQKKyAgICogQHJldHVybiBhIG5ldyBlbGVtZW50IGNvbnN0cnVjdGVkIHdpdGhpbiB0aGUgcnVsZXMgYW5kIGNvbnN0cmFpbnRzIG9mIHRoaXMKKyAgICogY29uZmlndXJhdGlvbgorICAgKi8KKyAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIERvY3VtZW50IGRvY3VtZW50KQorICB7CisgICAgLy8gQXBwbHkgdGhlIHJld3JpdGUgcnVsZXMuCisgICAgU3RyaW5nIHRhZ05hbWUgPSByZXdyaXRlTWFwLmNvbnRhaW5zS2V5KGtleSkgPyByZXdyaXRlTWFwLmdldChrZXkpIDoga2V5OworICAgIGlmICh0YWdOYW1lLmluZGV4T2YoIiAiKSAhPSAtMSkgeworICAgICAgdGFnTmFtZSA9IFN0cmluZ1V0aWxzLmpvaW4oV29yZFV0aWxzLmNhcGl0YWxpemVGdWxseSh0YWdOYW1lKS5zcGxpdCgKKyAgICAgICAgICAiICIpKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHRhZydzIG5hbWVzcGFjZSBvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuCisgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGtleU5zTWFwLmNvbnRhaW5zS2V5KGtleSkKKyAgICAgID8ga2V5TnNNYXAuZ2V0KGtleSkgOiBkZWZhdWx0S2V5TnM7CisKKyAgICAvLyBDcmVhdGUgdGhlIGVsZW1lbnQuCisgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKKyAgICBpZiAocmVzTGlua01hcC5jb250YWluc0tleShrZXkpKQorICAgIHsKKyAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWVzcGFjZSArICI6IiArIHRhZ05hbWUpOworICAgICAgU3RyaW5nIGxpbmtCYXNlID0gcmVzTGlua01hcC5nZXQoa2V5KTsKKyAgICAgIGxpbmtCYXNlICs9IGxpbmtCYXNlLmVuZHNXaXRoKCIvIikgPyAiIiA6ICIvIjsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFJERl9SRVNfQVRUUiwgbGlua0Jhc2UgKyB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lc3BhY2UgKyAiOiIgKyB0YWdOYW1lKTsKKyAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlWG1sKHZhbHVlKSkpOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvUnNzQ29uZmlndXJhdGlvbi5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2NvbmZpZ3VyYXRpb25zL1Jzc0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc5MDQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2NvbmZpZ3VyYXRpb25zL1Jzc0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoqCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5jb25maWd1cmF0aW9uczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdFc2NhcGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Xb3JkVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIENsYXNzIHJlcHJlc2VudGluZyBjdXN0b20gY29uZmlndXJhdGlvbnMgZm9yIFJTUyBYTUwgb3V0cHV0cy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJzc0NvbmZpZ3VyYXRpb24KK3sKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5ORUxfTElOSyA9ICJjaGFubmVsTGluayI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9LRVkgPSAicHJlZml4IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9WQUxVRSA9ICJ1cmkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gInRhZyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJuYW1lIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TT1VSQ0UgPSAic291cmNlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAidmFsdWUiOworCisgIHByaXZhdGUgTGlzdDxSc3NOYW1lc3BhY2U+IG5hbWVzcGFjZUxpc3QgPSBuZXcgVmVjdG9yPFJzc05hbWVzcGFjZT4oKTsKKyAgcHJpdmF0ZSBMaXN0PFJzc1RhZz4gdGFnTGlzdCA9IG5ldyBWZWN0b3I8UnNzVGFnPigpOworICBwcml2YXRlIFN0cmluZyBjaGFubmVsTGluayA9IG51bGw7CisKKworCisgIC8qKgorICAgKiBJbml0aWFsaXplcyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgdXNpbmcgdmFsdWVzIGZyb20KKyAgICogdGhlIHN1cHBsaWVkIGZpbGUuCisgICAqIEBwYXJhbSBmaWxlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlYWQKKyAgICovCisgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgeworICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgIERvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KGZpcyk7CisgICAgRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBjaGFubmVsTGluayA9IHJvb3QuZ2V0QXR0cmlidXRlKENIQU5ORUxfTElOSyk7CisgICAgbmFtZXNwYWNlTGlzdCA9IHJlYWROYW1lc3BhY2VzKHJvb3QpOworICAgIHRhZ0xpc3QgPSByZWFkVGFncyhyb290KTsKKworICAgIGZpcy5jbG9zZSgpOworICB9CisKKworCisgIHByaXZhdGUgTGlzdDxSc3NOYW1lc3BhY2U+IHJlYWROYW1lc3BhY2VzKEVsZW1lbnQgcm9vdCkKKyAgeworICAgIExpc3Q8UnNzTmFtZXNwYWNlPiBuYW1lc3BhY2VzID0gbmV3IFZlY3RvcjxSc3NOYW1lc3BhY2U+KCk7CisgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKE5BTUVTUEFDRSk7CisgICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQorICAgIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKKyAgICAgIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICAgIG5hbWVzcGFjZXMuYWRkKG5ldyBSc3NOYW1lc3BhY2UoZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX0tFWSksCisgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX1ZBTFVFKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmFtZXNwYWNlczsKKyAgfQorCisKKworICBwcml2YXRlIExpc3Q8UnNzVGFnPiByZWFkVGFncyhFbGVtZW50IHJvb3QpCisgIHsKKyAgICBMaXN0PFJzc1RhZz4gdGFncyA9IG5ldyBWZWN0b3I8UnNzVGFnPigpOworICAgIE5vZGVMaXN0IGxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKFRBRyk7CisgICAgaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LmdldExlbmd0aCgpID4gMCkKKyAgICB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKKyAgICAgIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGxpc3QuaXRlbShpKTsKKyAgICAgICAgdGFncy5hZGQobmV3IFJzc1RhZyhlbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfTkFNRSksCisgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1NPVVJDRSksIHJlYWRBdHRyaWJ1dGVzKGVsZW1lbnQpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0YWdzOworICB9CisKKworCisgIHByaXZhdGUgTGlzdDxSc3NUYWdBdHRyaWJ1dGU+IHJlYWRBdHRyaWJ1dGVzKEVsZW1lbnQgZWxlbWVudCkKKyAgeworICAgIExpc3Q8UnNzVGFnQXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IFZlY3RvcjxSc3NUYWdBdHRyaWJ1dGU+KCk7CisgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEFUVFJJQlVURSk7CisgICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQorICAgIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKKyAgICAgIHsKKyAgICAgICAgRWxlbWVudCBhdHRyaWJ1dGUgPSAoRWxlbWVudCkgbm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IFJzc1RhZ0F0dHJpYnV0ZSgKKyAgICAgICAgICBhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKSwKKyAgICAgICAgICBhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9WQUxVRSkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGxpc3Qgb2YgbmFtZXNwYWNlcy4KKyAgICogQHJldHVybiB0aGUgbGlzdCBvZiBuYW1lc3BhY2VzCisgICAqLworICBwdWJsaWMgTGlzdDxSc3NOYW1lc3BhY2U+IGdldE5hbWVzcGFjZUxpc3QoKQorICB7CisgICAgcmV0dXJuIG5hbWVzcGFjZUxpc3Q7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGNoYW5uZWwgbGluayBVUkwgc3RyaW5nLgorICAgKiBAcmV0dXJuIHRoZSBjaGFubmVsIGxpbmsgVVJMIHN0cmluZworICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDaGFubmVsTGluaygpCisgIHsKKyAgICByZXR1cm4gY2hhbm5lbExpbms7CisgIH0KKworCisKKyAgLyoqCisgICAqIEFwcGVuZHMgZWxlbWVudHMgKHRhZ3MpIGRlZmluZWQgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gYSBzcGVjaWZpYworICAgKiBwYXJlbnQgZWxlbWVudC4KKyAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb2R1Y3QKKyAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byB3aGljaCB0aGVzZSBlbGVtZW50cyBiZWxvbmcKKyAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgdG8gYXR0YWNoIHRoZXNlIGVsZW1lbnRzIHRvCisgICAqLworICBwdWJsaWMgdm9pZCBhcHBlbmRUYWdzKE1ldGFkYXRhIG1ldGFkYXRhLCBEb2N1bWVudCBkb2N1bWVudCwKKyAgICBFbGVtZW50IHBhcmVudCkKKyAgeworICAgIGZvciAoUnNzVGFnIHRhZyA6IHRhZ0xpc3QpCisgICAgeworICAgICAgU3RyaW5nIHRhZ05hbWUgPSB0YWcuZ2V0TmFtZSgpOworICAgICAgaWYgKHRhZ05hbWUuaW5kZXhPZigiICIpICE9IC0xKSB7CisgICAgICAgIHRhZ05hbWUgPSBTdHJpbmdVdGlscy5qb2luKFdvcmRVdGlscy5jYXBpdGFsaXplRnVsbHkodGFnTmFtZSkuc3BsaXQoCisgICAgICAgICAgICAiICIpKTsKKyAgICAgIH0KKworICAgICAgCisgICAgICAvLyBDcmVhdGUgYSBuZXcgZWxlbWVudCBmb3IgdGhlIHRhZy4KKyAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jdW1lbnQsIHBhcmVudCwgdGFnTmFtZSk7CisKKyAgICAgIC8vIEFkZCBhIHZhbHVlIGZvciB0aGUgdGFnIGZyb20gdGhlIHRhZyBzb3VyY2UuCisgICAgICBpZiAodGFnLmdldFNvdXJjZSgpICE9IG51bGwpCisgICAgICB7CisgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlWG1sKFBhdGhVdGlscworICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKHRhZy5nZXRTb3VyY2UoKSwgbWV0YWRhdGEpKSkpOworICAgICAgfQorCisgICAgICAvLyBBZGQgYXR0cmlidXRlcyB0byB0aGUgdGFnIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCisgICAgICBmb3IgKFJzc1RhZ0F0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0YWcuZ2V0QXR0cmlidXRlcygpKQorICAgICAgeworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcygKKyAgICAgICAgICBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgbWV0YWRhdGEpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9jb25maWd1cmF0aW9ucy9Sc3NOYW1lc3BhY2UuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9jb25maWd1cmF0aW9ucy9Sc3NOYW1lc3BhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2VjOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2NvbmZpZ3VyYXRpb25zL1Jzc05hbWVzcGFjZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuY29uZmlndXJhdGlvbnM7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBYTUwgbmFtZXNwYWNlIGZvciBSU1MgWE1MIGNvbnRlbnQuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSc3NOYW1lc3BhY2UKK3sKKyAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworICBwcml2YXRlIFN0cmluZyB1cmlTdHJpbmc7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYW4gUnNzTmFtZXNwYWNlIG9iamVjdCBhbmQgc2V0cyB0aGUgcHJlZml4IGFuZCB1cmkgc3RyaW5nLgorICAgKiBAcGFyYW0gcHJlZml4IHRoZSBuYW1lc3BhY2UgcHJlZml4CisgICAqIEBwYXJhbSB1cmlTdHJpbmcgdGhlIG5hbWVzcGFjZSBVUkkgYXMgYSBTdHJpbmcKKyAgICovCisgIHB1YmxpYyBSc3NOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaVN0cmluZykKKyAgeworICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgIHRoaXMudXJpU3RyaW5nID0gdXJpU3RyaW5nOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBwcmVmaXggZm9yIHRoZSBuYW1lc3BhY2UuCisgICAqIEByZXR1cm4gdGhlIHByZWZpeCBmb3IgdGhlIG5hbWVzcGFjZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQorICB7CisgICAgcmV0dXJuIHByZWZpeDsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgVVJJIGZvciB0aGUgbmFtZXNwYWNlIGFzIGEgU3RyaW5nCisgICAqIEByZXR1cm4gdGhlIFVSSSBmb3IgdGhlIG5hbWVzcGFjZSBhcyBhIFN0cmluZworICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRVcmlTdHJpbmcoKQorICB7CisgICAgcmV0dXJuIHVyaVN0cmluZzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2NvbmZpZ3VyYXRpb25zL1Jzc1RhZy5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2NvbmZpZ3VyYXRpb25zL1Jzc1RhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2VmYjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvUnNzVGFnLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuY29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gUlNTIFhNTCB0YWcgdG8gaW5jbHVkZSBpbiBhbiBSU1MgZmVlZC4KKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJzc1RhZworeworICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgc291cmNlID0gbnVsbDsKKyAgcHJpdmF0ZSBMaXN0PFJzc1RhZ0F0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBWZWN0b3I8UnNzVGFnQXR0cmlidXRlPigpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIFJzc1RhZyBvYmplY3QgYW5kIHNldHMgdGhlIG5hbWUsIHNvdXJjZSBhbmQgYXR0cmlidXRlcy4KKyAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgZm9yIHRoZSB0YWcKKyAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGZvciB0aGUgdGFnCisgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgdGFnCisgICAqLworICBwdWJsaWMgUnNzVGFnKFN0cmluZyBuYW1lLCBTdHJpbmcgc291cmNlLCBMaXN0PFJzc1RhZ0F0dHJpYnV0ZT4gYXR0cmlidXRlcykKKyAgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbmFtZSBmb3IgdGhlIHRhZy4KKyAgICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIHRhZworICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKKyAgeworICAgIHJldHVybiBuYW1lOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBzb3VyY2UgZm9yIHRoZSB0YWcuCisgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBmb3IgdGhlIHRhZworICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKQorICB7CisgICAgcmV0dXJuIHNvdXJjZTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHRhZy4KKyAgICogQHJldHVybiB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHRhZworICAgKi8KKyAgcHVibGljIExpc3Q8UnNzVGFnQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkKKyAgeworICAgIHJldHVybiBhdHRyaWJ1dGVzOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvUnNzVGFnQXR0cmlidXRlLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvUnNzVGFnQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlOTE5MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9jb25maWd1cmF0aW9ucy9Sc3NUYWdBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5jb25maWd1cmF0aW9uczsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBmb3IgYW4gUlNTIFhNTCB0YWcuCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworcHVibGljIGNsYXNzIFJzc1RhZ0F0dHJpYnV0ZQoreworICBwcml2YXRlIFN0cmluZyBuYW1lOworICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhbiBSc3NUYWdBdHRyaWJ1dGUgYW5kIHNldHMgdGhlIG5hbWUgYW5kIHZhbHVlLgorICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICovCisgIHB1YmxpYyBSc3NUYWdBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorICB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQorICB7CisgICAgcmV0dXJuIHZhbHVlOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvcGFja2FnZS1pbmZvLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvY29uZmlndXJhdGlvbnMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhZjhiMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9jb25maWd1cmF0aW9ucy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioKKyAqIENvbnRhaW5zIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCB0byBhZGQgY3VzdG9tIGNvbmZpZ3VyYXRpb25zIHRvIG91dHB1dHMuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmNvbmZpZ3VyYXRpb25zOwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2V4Y2VwdGlvbnMvQmFkUmVxdWVzdEV4Y2VwdGlvbi5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2V4Y2VwdGlvbnMvQmFkUmVxdWVzdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMmRlN2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvZXhjZXB0aW9ucy9CYWRSZXF1ZXN0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogVGhpcyB0eXBlIG9mIGV4Y2VwdGlvbiByZXR1cm5zIGFuIEhUVFAgJ2JhZCByZXF1ZXN0JyByZXNwb25zZSAoc3RhdHVzIGNvZGUKKyAqIDQwMCkgd2l0aCBhbiBhZGRpdGlvbmFsIG1lc3NhZ2UuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGV4dGVuZHMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24KK3sKKyAgLy8gQXV0by1nZW5lcmF0ZWQgSUQgZm9yIHNlcmlhbGl6YXRpb24uCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDUwNjUzMTEzMTYxMDAwMjJMOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IGFkZHMgYSBtZXNzYWdlIHRvIHRoZSAnYmFkIHJlcXVlc3QnIChzdGF0dXMgY29kZSA0MDApCisgICAqIEhUVFAgcmVzcG9uc2UuCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZCB0byB0aGUgcmVzcG9uc2UKKyAgICovCisgIHB1YmxpYyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICB7CisgICAgc3VwZXIoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCkuZW50aXR5KG1lc3NhZ2UpCisgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9leGNlcHRpb25zL0ludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9leGNlcHRpb25zL0ludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWYwODQyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2V4Y2VwdGlvbnMvSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqIFRoaXMgdHlwZSBvZiBleGNlcHRpb24gcmV0dXJucyBhbiBIVFRQICdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InIHJlc3BvbnNlCisgKiAoc3RhdHVzIGNvZGUgNTAwKSB3aXRoIGFuIGFkZGl0aW9uYWwgbWVzc2FnZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbgoreworICAvLyBBdXRvLWdlbmVyYXRlZCBJRCBmb3Igc2VyaWFsaXphdGlvbi4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxMzIyNDA1MDkzOTE1MzEzNzNMOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IGFkZHMgYSBtZXNzYWdlIHRvIHRoZSAnaW50ZXJuYWwgc2VydmVyIGVycm9yJyAoc3RhdHVzIGNvZGUKKyAgICogNTAwKSBIVFRQIHJlc3BvbnNlLgorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBhZGQgdG8gdGhlIHJlc3BvbnNlCisgICAqLworICBwdWJsaWMgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKKyAgeworICAgIHN1cGVyKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SKS5lbnRpdHkobWVzc2FnZSkKKyAgICAgIC50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKS5idWlsZCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2V4Y2VwdGlvbnMvTm90Rm91bmRFeGNlcHRpb24uamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9leGNlcHRpb25zL05vdEZvdW5kRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4ZWQ5NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9leGNlcHRpb25zL05vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogVGhpcyB0eXBlIG9mIGV4Y2VwdGlvbiByZXR1cm5zIGFuIEhUVFAgJ25vdCBmb3VuZCcgcmVzcG9uc2UgKHN0YXR1cyBjb2RlIDQwNCkKKyAqIHdpdGggYW4gYWRkaXRpb25hbCBtZXNzYWdlLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbgoreworICAvLyBBdXRvLWdlbmVyYXRlZCBJRCBmb3Igc2VyaWFsaXphdGlvbi4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM4MzUwNzcwODM3NTg1MjU5MTlMOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IGFkZHMgYSBtZXNzYWdlIHRvIHRoZSAnbm90IGZvdW5kJyAoc3RhdHVzIGNvZGUgNDA0KQorICAgKiBIVFRQIHJlc3BvbnNlLgorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBhZGQgdG8gdGhlIHJlc3BvbnNlCisgICAqLworICBwdWJsaWMgTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCisgIHsKKyAgICBzdXBlcihSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkuZW50aXR5KG1lc3NhZ2UpCisgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9leGNlcHRpb25zL3BhY2thZ2UtaW5mby5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2V4Y2VwdGlvbnMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2OTcyOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9leGNlcHRpb25zL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKgorICogQ29udGFpbnMgY2xhc3NlcyB0aGF0IGV4dGVuZCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0byBwcm92aWRlCisgKiBzcGVjaWZpYyByZXNwb25zZSBzdGF0dXMgY29kZXMgYW5kIG1lc3NhZ2VzLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5leGNlcHRpb25zOwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2ZpbHRlcnMvQmFja3dhcmRzQ29tcGF0aWJsZUludGVyY2VwdG9yLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvZmlsdGVycy9CYWNrd2FyZHNDb21wYXRpYmxlSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDcwYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2ZpbHRlcnMvQmFja3dhcmRzQ29tcGF0aWJsZUludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZmlsdGVyczsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jeGYuaW50ZXJjZXB0b3IuRmF1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jeGYubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY3hmLnBoYXNlLkFic3RyYWN0UGhhc2VJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmN4Zi5waGFzZS5QaGFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnV0aWxzLlVSTEVuY29kZWRVdGlsczsKKworLyoqCisgKiBBbiBBcGFjaGUgQ1hGIGludGVyY2VwdG9yIGZvciB0aGUgaW5jb21pbmcgY2hhaW4gdGhhdCBtb25pdG9ycyByZXF1ZXN0IFVSSXMKKyAqIGFuZCBtYXBzIGFueSBVUklzIGZyb20gdGhlIG9yaWdpbmFsIHNjaGVtZSB0byB0aGUgbmV3IHNjaGVtZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEJhY2t3YXJkc0NvbXBhdGlibGVJbnRlcmNlcHRvciBleHRlbmRzCisgIEFic3RyYWN0UGhhc2VJbnRlcmNlcHRvcjxNZXNzYWdlPgoreworICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCBpbnNlcnRzIHRoZSBpbnRlcmNlcHRvciBhdCB0aGUgVVNFUl9TVFJFQU0gcGhhc2Ugb2YgdGhlCisgICAqIGluY29taW5nIGludGVyY2VwdG9yIGNoYWluLgorICAgKi8KKyAgcHVibGljIEJhY2t3YXJkc0NvbXBhdGlibGVJbnRlcmNlcHRvcigpCisgIHsKKyAgICBzdXBlcihQaGFzZS5VU0VSX1NUUkVBTSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBGYXVsdAorICB7CisgICAgU3RyaW5nIGJhc2UgPSAoU3RyaW5nKSBtZXNzYWdlLmdldChNZXNzYWdlLkJBU0VfUEFUSCk7CisgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIG1lc3NhZ2UuZ2V0KE1lc3NhZ2UuUkVRVUVTVF9VUkkpOworICAgIFN0cmluZyBxdWVyeSA9IChTdHJpbmcpIG1lc3NhZ2UuZ2V0KE1lc3NhZ2UuUVVFUllfU1RSSU5HKTsKKworICAgIGJhc2UgKz0gYmFzZS5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyI7CisgICAgU3RyaW5nIHJlcXVlc3QgPSB1cmkucmVwbGFjZUFsbCgiXiIgKyBiYXNlLCAiIik7CisKKyAgICAvLyBQYXJzZSB0aGUgcXVlcnkgc3RyaW5nIGludG8gYSBtYXAgb2YgcGFyYW1ldGVycy4KKyAgICAvLyBbTm90ZTogdGhpcyB3aWxsIG92ZXJ3cml0ZSBtdWx0aXBsZSBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lLl0KKyAgICBMaXN0PE5hbWVWYWx1ZVBhaXI+IHBhcmFtcyA9IFVSTEVuY29kZWRVdGlscy5wYXJzZShxdWVyeSwgQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKTsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGZvciAoTmFtZVZhbHVlUGFpciBwYWlyIDogcGFyYW1zKQorICAgIHsKKyAgICAgIG1hcC5wdXQocGFpci5nZXROYW1lKCksIHBhaXIuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gTWFwcyAiZGF0YT9wcm9kdWN0SUQ9PHByb2R1Y3QgSUQ+IiBVUkkgdG8gZWl0aGVyCisgICAgLy8gInJlZmVyZW5jZS5maWxlP3Byb2R1Y3RJZD08cHJvZHVjdCBJRD4iIG9yCisgICAgLy8gInByb2R1Y3QuemlwP3Byb2R1Y3RJZD08cHJvZHVjdCBJRD4iCisgICAgaWYocmVxdWVzdC5lcXVhbHMoImRhdGEiKSkKKyAgICB7CisgICAgICBTdHJpbmcgZm9ybWF0ID0gbWFwLmdldCgiZm9ybWF0Iik7CisgICAgICByZXF1ZXN0ID0KKyAgICAgICAgImFwcGxpY2F0aW9uL3gtemlwIi5lcXVhbHMoZm9ybWF0KSB8fCAiYXBwbGljYXRpb24vemlwIi5lcXVhbHMoZm9ybWF0KQorICAgICAgICA/ICJwcm9kdWN0LnppcCIgOiAicmVmZXJlbmNlLmZpbGUiOworCisgICAgICBxdWVyeSA9ICJwcm9kdWN0SWQ9IiArIG1hcC5nZXQoInByb2R1Y3RJRCIpOworICAgICAgcXVlcnkgKz0gbWFwLmNvbnRhaW5zS2V5KCJyZWZJbmRleCIpCisgICAgICAgID8gIiZyZWZJbmRleD0iICsgbWFwLmdldCgicmVmSW5kZXgiKSA6ICIiOworICAgIH0KKworICAgIC8vIE1hcHMgImRhdGFzZXQ/dHlwZUlEPTxwcm9kdWN0IHR5cGUgSUQ+IiB0bworICAgIC8vICJkYXRhc2V0LnppcD9wcm9kdWN0VHlwZUlkPTxwcm9kdWN0IHR5cGUgSUQ+IgorICAgIGVsc2UgaWYocmVxdWVzdC5lcXVhbHMoImRhdGFzZXQiKSAmJiBtYXAuY29udGFpbnNLZXkoInR5cGVJRCIpKQorICAgIHsKKyAgICAgIHJlcXVlc3QgPSAiZGF0YXNldC56aXAiOworICAgICAgcXVlcnkgPSAicHJvZHVjdFR5cGVJZD0iICsgbWFwLmdldCgidHlwZUlEIik7CisgICAgfQorCisgICAgLy8gTWFwcyAicmRmP3R5cGU9QUxMIiBvciAicmRmP2lkPTxwcm9kdWN0IHR5cGUgSUQ+IiB0bworICAgIC8vICJkYXRhc2V0LnJkZj9wcm9kdWN0VHlwZUlkPTxBTEwgb3IgcHJvZHVjdCB0eXBlIElEPiIKKyAgICBlbHNlIGlmIChyZXF1ZXN0LmVxdWFscygicmRmIikpCisgICAgeworICAgICAgcmVxdWVzdCA9ICJkYXRhc2V0LnJkZiI7CisgICAgICBTdHJpbmcgdHlwZSA9IG1hcC5nZXQoInR5cGUiKTsKKyAgICAgIHF1ZXJ5ID0gInByb2R1Y3RUeXBlSWQ9IjsKKyAgICAgIHF1ZXJ5ICs9ICJBTEwiLmVxdWFscyh0eXBlKSA/IHR5cGUgOiBtYXAuZ2V0KCJpZCIpOworICAgIH0KKworICAgIC8vIE1hcHMgInJkZi9kYXRhc2V0P3R5cGU9QUxMIiBvciAicmRmL2RhdGFzZXQ/dHlwZUlEPTxwcm9kdWN0IHR5cGUgSUQ+IiB0bworICAgIC8vICJkYXRhc2V0LnJkZj9wcm9kdWN0VHlwZUlkPTxBTEwgb3IgcHJvZHVjdCB0eXBlIElEPiIKKyAgICBlbHNlIGlmIChyZXF1ZXN0LmVxdWFscygicmRmL2RhdGFzZXQiKSkKKyAgICB7CisgICAgICByZXF1ZXN0ID0gImRhdGFzZXQucmRmIjsKKyAgICAgIFN0cmluZyB0eXBlID0gbWFwLmdldCgidHlwZSIpOworICAgICAgcXVlcnkgPSAicHJvZHVjdFR5cGVJZD0iOworICAgICAgcXVlcnkgKz0gIkFMTCIuZXF1YWxzKHR5cGUpID8gdHlwZSA6IG1hcC5nZXQoInR5cGVJRCIpOworICAgICAgcXVlcnkgKz0gbWFwLmNvbnRhaW5zS2V5KCJmaWx0ZXIiKSA/ICImZmlsdGVyPSIgKyBtYXAuZ2V0KCJmaWx0ZXIiKSA6ICIiOworICAgIH0KKworICAgIC8vIE1hcHMgInZpZXdSZWNlbnQ/Y2hhbm5lbD1BTEwiIG9yICJ2aWV3UmVjZW50P2lkPTxwcm9kdWN0IHR5cGUgSUQ+IiB0bworICAgIC8vICJkYXRhc2V0LnJzcz9wcm9kdWN0VHlwZUlkPTxBTEwgb3IgcHJvZHVjdCB0eXBlIElEPiIKKyAgICBlbHNlIGlmIChyZXF1ZXN0LmVxdWFscygidmlld1JlY2VudCIpKQorICAgIHsKKyAgICAgIHJlcXVlc3QgPSAiZGF0YXNldC5yc3MiOworICAgICAgU3RyaW5nIGNoYW5uZWwgPSBtYXAuZ2V0KCJjaGFubmVsIik7CisgICAgICBxdWVyeSA9ICJwcm9kdWN0VHlwZUlkPSI7CisgICAgICBxdWVyeSArPSAiQUxMIi5lcXVhbHMoY2hhbm5lbCkgPyBjaGFubmVsIDogbWFwLmdldCgiaWQiKTsKKyAgICAgIHF1ZXJ5ICs9IG1hcC5jb250YWluc0tleSgidG9wbiIpID8gIiZsaW1pdD0iICsgbWFwLmdldCgidG9wbiIpIDogIiI7CisgICAgfQorCisgICAgLy8gTWFwcyAidmlld1RyYW5zZmVycyIgdG8gInRyYW5zZmVycy5yc3M/cHJvZHVjdElkPUFMTCIKKyAgICBlbHNlIGlmIChyZXF1ZXN0LmVxdWFscygidmlld1RyYW5zZmVycyIpKQorICAgIHsKKyAgICAgIHJlcXVlc3QgPSAidHJhbnNmZXJzLnJzcyI7CisgICAgICBxdWVyeSA9ICJwcm9kdWN0SWQ9QUxMIjsKKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgbmV3IFVSSSBhbmQgcXVlcnkgaW4gdGhlIG1lc3NhZ2UgbWFwLgorICAgIHVyaSA9IGJhc2UgKyByZXF1ZXN0OworICAgIG1lc3NhZ2UucHV0KE1lc3NhZ2UuUkVRVUVTVF9VUkksIHVyaSk7CisgICAgbWVzc2FnZS5wdXQoTWVzc2FnZS5RVUVSWV9TVFJJTkcsIHF1ZXJ5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2ZpbHRlcnMvcGFja2FnZS1pbmZvLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvZmlsdGVycy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWExYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL2ZpbHRlcnMvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqCisgKiBDb250YWlucyBmaWx0ZXJzIGZvciBIVFRQIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmZpbHRlcnM7CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcGFja2FnZS1pbmZvLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3OTBlNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioKKyAqIENvbnRhaW5zIHN1Yi1wYWNrYWdlcyB3aXRoIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgYSBKQVgtUlMgc2VydmljZSBmb3IgdGhlCisgKiBDQVMgUHJvZHVjdCB3ZWIgYXBwbGljYXRpb24uCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzOwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9EYXRhc2V0UmVzb3VyY2UuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvRGF0YXNldFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2JiMjZjZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvRGF0YXNldFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEEgSkFYLVJTIHJlc291cmNlIHJlcHJlc2VudGluZyBhIGRhdGFzZXQgLSBhIHNldCBvZiB7QGxpbmsgUHJvZHVjdCBwcm9kdWN0c30KKyAqIG1haW50YWluZWQgYnkgdGhlIGZpbGUgbWFuYWdlci4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWU9ImRhdGFzZXQiKQorQFhtbFR5cGUocHJvcE9yZGVyID0geyJpZCIsICJuYW1lIiwgIm1ldGFkYXRhUmVzb3VyY2UiLCAicHJvZHVjdFJlc291cmNlcyJ9KQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLk5PTkUpCitwdWJsaWMgY2xhc3MgRGF0YXNldFJlc291cmNlCit7CisgIHByaXZhdGUgU3RyaW5nIGlkOworICBwcml2YXRlIFN0cmluZyBuYW1lOworICBwcml2YXRlIE1ldGFkYXRhUmVzb3VyY2UgbWV0YWRhdGFSZXNvdXJjZTsKKyAgcHJpdmF0ZSBMaXN0PFByb2R1Y3RSZXNvdXJjZT4gcHJvZHVjdFJlc291cmNlcyA9CisgICAgbmV3IEFycmF5TGlzdDxQcm9kdWN0UmVzb3VyY2U+KCk7CisKKyAgLy8gVGhlIGZpbGUgbWFuYWdlcidzIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGlzIHJlc291cmNlLCB1c2VkIGZvciBleGFtcGxlCisgIC8vIHdoZW4gY3JlYXRpbmcgemlwIGFyY2hpdmVzLgorICBwcml2YXRlIEZpbGUgd29ya2luZ0RpcjsKKworCisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IgcmVxdWlyZWQgYnkgSkFYQi4KKyAgICovCisgIHB1YmxpYyBEYXRhc2V0UmVzb3VyY2UoKQorICB7CisgIH0KKworCisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgbmFtZSwgbWV0YWRhdGEgYW5kIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUKKyAgICogZGF0YXNldCByZXNvdXJjZS4KKyAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZGF0YXNldAorICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGF0YXNldAorICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIG1ldGFkYXRhIGZvciB0aGUgZGF0YXNldAorICAgKiBAcGFyYW0gd29ya2luZ0RpciB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlcyB0bworICAgKiBhdHRhY2ggdG8gcmVzcG9uc2VzCisgICAqLworICBwdWJsaWMgRGF0YXNldFJlc291cmNlKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIE1ldGFkYXRhIG1ldGFkYXRhLAorICAgIEZpbGUgd29ya2luZ0RpcikKKyAgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMubWV0YWRhdGFSZXNvdXJjZSA9IG5ldyBNZXRhZGF0YVJlc291cmNlKG1ldGFkYXRhKTsKKyAgICB0aGlzLndvcmtpbmdEaXIgPSB3b3JraW5nRGlyOworICB9CisKKworCisgIC8qKgorICAgKiBBZGRzIGEge0BsaW5rIFByb2R1Y3RSZXNvdXJjZX0gdG8gdGhlIGxpc3Qgb2YgcHJvZHVjdCByZXNvdXJjZXMgZm9yIHRoZQorICAgKiBkYXRhc2V0LgorICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGFkZCB0byB0aGUgZGF0YXNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZFByb2R1Y3RSZXNvdXJjZShQcm9kdWN0UmVzb3VyY2UgcmVzb3VyY2UpCisgIHsKKyAgICBwcm9kdWN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgZGF0YXNldC4KKyAgICogQHJldHVybiB0aGUgd29ya2luZyBkaXJlY3RvcnkKKyAgICovCisgIHB1YmxpYyBGaWxlIGdldFdvcmtpbmdEaXIoKQorICB7CisgICAgcmV0dXJuIHdvcmtpbmdEaXI7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGlkIG9mIHRoZSBkYXRhc2V0LgorICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgZGF0YXNldAorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIFN0cmluZyBnZXRJZCgpCisgIHsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGRhdGFzZXQuCisgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRhdGFzZXQKKyAgICovCisgIEBYbWxFbGVtZW50CisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisgIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgcHJvZHVjdCByZXNvdXJjZXMgZm9yIHRoZSBkYXRhc2V0LgorICAgKiBAcmV0dXJuIHRoZSBwcm9kdWN0UmVzb3VyY2VzCisgICAqLworICBAWG1sRWxlbWVudFdyYXBwZXIobmFtZSA9ICJwcm9kdWN0cyIpCisgIEBYbWxFbGVtZW50KG5hbWUgPSAicHJvZHVjdCIpCisgIHB1YmxpYyBMaXN0PFByb2R1Y3RSZXNvdXJjZT4gZ2V0UHJvZHVjdFJlc291cmNlcygpCisgIHsKKyAgICByZXR1cm4gcHJvZHVjdFJlc291cmNlczsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbWV0YWRhdGEgcmVzb3VyY2UgZm9yIHRoZSBkYXRhc2V0LgorICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSByZXNvdXJjZQorICAgKi8KKyAgQFhtbEVsZW1lbnQobmFtZSA9ICJtZXRhZGF0YSIpCisgIHB1YmxpYyBNZXRhZGF0YVJlc291cmNlIGdldE1ldGFkYXRhUmVzb3VyY2UoKQorICB7CisgICAgcmV0dXJuIG1ldGFkYXRhUmVzb3VyY2U7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvTWV0YWRhdGFSZXNvdXJjZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9NZXRhZGF0YVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3N2Y1NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvTWV0YWRhdGFSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQSBKQVgtUlMgcmVzb3VyY2UgcmVwcmVzZW50aW5nIGEge0BsaW5rIE1ldGFkYXRhfSBvYmplY3QuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK0BYbWxSb290RWxlbWVudChuYW1lID0gIm1ldGFkYXRhIikKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5OT05FKQorcHVibGljIGNsYXNzIE1ldGFkYXRhUmVzb3VyY2UKK3sKKyAgcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKworICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciByZXF1aXJlZCBieSBKQVhCLgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhUmVzb3VyY2UoKQorICB7CisgIH0KKworCisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgZm9yIHRoZSByZXNvdXJjZS4KKyAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBtZXRhZGF0YSBmb3IgdGhlIHJlc291cmNlCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFSZXNvdXJjZShNZXRhZGF0YSBtZXRhZGF0YSkKKyAgeworICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbWV0YWRhdGEuCisgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhCisgICAqLworICBwdWJsaWMgTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKQorICB7CisgICAgcmV0dXJuIG1ldGFkYXRhOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIGEgbWFwIG9mIG1ldGFkYXRhIGtleXMgYW5kIHZhbHVlcy4KKyAgICogQHJldHVybiBhIG1hcCBvZiBtZXRhZGF0YSBrZXlzIGFuZCB2YWx1ZXMKKyAgICovCisgIEBYbWxFbGVtZW50KG5hbWUgPSAia2V5dmFsIikKKyAgcHVibGljIExpc3Q8TWV0YWRhdGFFbnRyeT4gZ2V0TWV0YWRhdGFFbnRyaWVzKCkKKyAgeworICAgICBMaXN0PE1ldGFkYXRhRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGFkYXRhRW50cnk+KCk7CisgICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldGFkYXRhLmdldEFsbEtleXMoKSkKKyAgICAgeworICAgICAgIGVudHJpZXMuYWRkKG5ldyBNZXRhZGF0YUVudHJ5KGtleSwgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KSkpOworICAgICB9CisgICAgIHJldHVybiBlbnRyaWVzOworICB9CisKKworCisgIC8qKgorICAgKiBSZXByZXNlbnRzIGEgbWV0YWRhdGEga2V5dmFsIGVudHJ5LgorICAgKiBAYXV0aG9yIHJsYWlkbGF3CisgICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAgICovCisgIEBYbWxSb290RWxlbWVudAorICBAWG1sVHlwZShwcm9wT3JkZXIgPSB7ImtleSIsICJ2YWx1ZXMifSkKKyAgQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLk5PTkUpCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0YWRhdGFFbnRyeQorICB7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5OworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbHVlczsKKworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHJlcXVpcmVkIGJ5IEpBWEIuCisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhRW50cnkoKQorICAgIHsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGEgbWV0YWRhdGEgZW50cnkgdXNpbmcgdGhlIHN1cHBsaWVkIGtleSBhbmQgbGlzdAorICAgICAqIG9mIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeQorICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5CisgICAgICovCisgICAgcHVibGljIE1ldGFkYXRhRW50cnkoU3RyaW5nIGtleSwgTGlzdDxTdHJpbmc+IHZhbHVlcykKKyAgICB7CisgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeQorICAgICAqLworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAia2V5IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCisgICAgeworICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUocykgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlKHMpIGZvciB0aGUgbWV0YWRhdGEgZW50cnkKKyAgICAgKi8KKyAgICBAWG1sRWxlbWVudChuYW1lID0gInZhbCIpCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXMoKQorICAgIHsKKyAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL1Byb2R1Y3RSZXNvdXJjZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9Qcm9kdWN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YjdmNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9Qcm9kdWN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFdyYXBwZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEEgSkFYLVJTIHJlc291cmNlIHJlcHJlc2VudGluZyBhIHtAbGluayBQcm9kdWN0fS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicHJvZHVjdCIpCitAWG1sVHlwZShwcm9wT3JkZXIgPSB7InByb2R1Y3RJZCIsICJwcm9kdWN0TmFtZSIsICJwcm9kdWN0U3RydWN0dXJlIiwKKyAgInByb2R1Y3RUeXBlTmFtZSIsICJ0cmFuc2ZlclN0YXR1cyIsICJtZXRhZGF0YVJlc291cmNlIiwKKyAgInJlZmVyZW5jZVJlc291cmNlcyJ9KQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLk5PTkUpCitwdWJsaWMgY2xhc3MgUHJvZHVjdFJlc291cmNlCit7CisgIHByaXZhdGUgUHJvZHVjdCBwcm9kdWN0OworICBwcml2YXRlIE1ldGFkYXRhUmVzb3VyY2UgbWV0YWRhdGFSZXNvdXJjZTsKKyAgcHJpdmF0ZSBMaXN0PFJlZmVyZW5jZVJlc291cmNlPiByZWZlcmVuY2VSZXNvdXJjZXMgPQorICAgIG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNlUmVzb3VyY2U+KCk7CisKKyAgLy8gVGhlIGZpbGUgbWFuYWdlcidzIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGlzIHJlc291cmNlLCB1c2VkIGZvciBleGFtcGxlCisgIC8vIHdoZW4gY3JlYXRpbmcgemlwIGFyY2hpdmVzLgorICBwcml2YXRlIEZpbGUgd29ya2luZ0RpcjsKKworCisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IgcmVxdWlyZWQgYnkgSkFYQi4KKyAgICovCisgIHB1YmxpYyBQcm9kdWN0UmVzb3VyY2UoKQorICB7CisgIH0KKworCisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgcHJvZHVjdCwgbWV0YWRhdGEsIHJlZmVyZW5jZXMgYW5kCisgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgcmVzb3VyY2UuCisgICAqIEBwYXJhbSBwcm9kdWN0IHRoZSBwcm9kdWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UKKyAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlCisgICAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UKKyAgICogQHBhcmFtIHdvcmtpbmdEaXIgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0ZW1wb3JhcnkgZmlsZXMgdG8KKyAgICogYXR0YWNoIHRvIHJlc3BvbnNlcworICAgKi8KKyAgcHVibGljIFByb2R1Y3RSZXNvdXJjZShQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhLAorICAgIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzLCBGaWxlIHdvcmtpbmdEaXIpCisgIHsKKyAgICB0aGlzLnByb2R1Y3QgPSBwcm9kdWN0OworICAgIHRoaXMubWV0YWRhdGFSZXNvdXJjZSA9IG5ldyBNZXRhZGF0YVJlc291cmNlKG1ldGFkYXRhKTsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVmZXJlbmNlcy5zaXplKCk7IGluZGV4KyspCisgICAgeworICAgICAgcmVmZXJlbmNlUmVzb3VyY2VzLmFkZChuZXcgUmVmZXJlbmNlUmVzb3VyY2UocHJvZHVjdC5nZXRQcm9kdWN0SWQoKSwKKyAgICAgICAgaW5kZXgsIHJlZmVyZW5jZXMuZ2V0KGluZGV4KSwgd29ya2luZ0RpcikpOworICAgIH0KKyAgICB0aGlzLndvcmtpbmdEaXIgPSB3b3JraW5nRGlyOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHByb2R1Y3QuCisgICAqIEByZXR1cm4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisgICAqLworICBwdWJsaWMgRmlsZSBnZXRXb3JraW5nRGlyKCkKKyAgeworICAgIHJldHVybiB3b3JraW5nRGlyOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBwcm9kdWN0J3MgSUQuCisgICAqIEByZXR1cm4gdGhlIHByb2R1Y3QncyBJRC4KKyAgICovCisgIEBYbWxFbGVtZW50KG5hbWUgPSAiaWQiKQorICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RJZCgpCisgIHsKKyAgICByZXR1cm4gcHJvZHVjdC5nZXRQcm9kdWN0SWQoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgcHJvZHVjdCdzIG5hbWUuCisgICAqIEByZXR1cm4gdGhlIHByb2R1Y3QncyBuYW1lCisgICAqLworICBAWG1sRWxlbWVudChuYW1lID0gIm5hbWUiKQorICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCkKKyAgeworICAgIHJldHVybiBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCk7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHByb2R1Y3QncyBzdHJ1Y3R1cmUuCisgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvZHVjdCdzIHN0cnVjdHVyZQorICAgKi8KKyAgQFhtbEVsZW1lbnQobmFtZSA9ICJzdHJ1Y3R1cmUiKQorICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RTdHJ1Y3R1cmUoKQorICB7CisgICAgcmV0dXJuIHByb2R1Y3QuZ2V0UHJvZHVjdFN0cnVjdHVyZSgpOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9kdWN0J3MgdHlwZS4KKyAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCdzIHR5cGUKKyAgICovCisgIEBYbWxFbGVtZW50KG5hbWUgPSAidHlwZSIpCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFR5cGVOYW1lKCkKKyAgeworICAgIHJldHVybiBwcm9kdWN0LmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSB0cmFuc2ZlciBzdGF0dXMgZm9yIHRoZSBwcm9kdWN0LgorICAgKiBAcmV0dXJuIHRoZSB0cmFuc2ZlciBzdGF0dXMgZm9yIHRoZSBwcm9kdWN0CisgICAqLworICBAWG1sRWxlbWVudChuYW1lID0gInRyYW5zZmVyU3RhdHVzIikKKyAgcHVibGljIFN0cmluZyBnZXRUcmFuc2ZlclN0YXR1cygpCisgIHsKKyAgICByZXR1cm4gcHJvZHVjdC5nZXRUcmFuc2ZlclN0YXR1cygpOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBtZXRhZGF0YSByZXNvdXJjZSBmb3IgdGhlIHByb2R1Y3QuCisgICAqIEByZXR1cm4gdGhlIHByb2R1Y3QncyBtZXRhZGF0YSByZXNvdXJjZQorICAgKi8KKyAgQFhtbEVsZW1lbnQobmFtZSA9ICJtZXRhZGF0YSIpCisgIHB1YmxpYyBNZXRhZGF0YVJlc291cmNlIGdldE1ldGFkYXRhUmVzb3VyY2UoKQorICB7CisgICAgcmV0dXJuIG1ldGFkYXRhUmVzb3VyY2U7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHJlZmVyZW5jZSByZXNvdXJjZXMuCisgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZSByZXNvdXJjZXMKKyAgICovCisgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gInJlZmVyZW5jZXMiKQorICBAWG1sRWxlbWVudChuYW1lID0gInJlZmVyZW5jZSIpCisgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZVJlc291cmNlPiBnZXRSZWZlcmVuY2VSZXNvdXJjZXMoKQorICB7CisgICAgcmV0dXJuIHJlZmVyZW5jZVJlc291cmNlczsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgcHJvZHVjdCdzIHJlZmVyZW5jZXMuCisgICAqIEByZXR1cm4gdGhlIHByb2R1Y3QncyByZWZlcmVuY2VzCisgICAqLworICBwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFByb2R1Y3RSZWZlcmVuY2VzKCkKKyAgeworICAgIHJldHVybiBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvUmVmZXJlbmNlUmVzb3VyY2UuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvUmVmZXJlbmNlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDQ2MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9SZWZlcmVuY2VSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlOworCisvKioKKyAqIEEgSkFYLVJTIHJlc291cmNlIHJlcHJlc2VudGluZyBhIHtAbGluayBSZWZlcmVuY2V9LgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJyZWZlcmVuY2UiKQorQFhtbFR5cGUocHJvcE9yZGVyID0geyJwcm9kdWN0SWQiLCAicmVmSW5kZXgiLCAiZGF0YVN0b3JlUmVmZXJlbmNlIiwKKyAgIm9yaWdSZWZlcmVuY2UiLCAibWltZVR5cGVOYW1lIiwgImZpbGVTaXplIn0pCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSkKK3B1YmxpYyBjbGFzcyBSZWZlcmVuY2VSZXNvdXJjZQoreworICAvLyBUaGUgcmVmZXJlbmNlIGZvciB0aGlzIHJlc291cmNlLgorICBwcml2YXRlIFJlZmVyZW5jZSByZWZlcmVuY2U7CisKKyAgLy8gVGhlIElEIG9mIHRoZSBwcm9kdWN0IHRoYXQgdGhlIHJlZmVyZW5jZSBiZWxvbmdzIHRvLgorICBwcml2YXRlIFN0cmluZyBwcm9kdWN0SWQ7CisKKyAgLy8gVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuY2Ugd2l0aGluIGl0cyBwcm9kdWN0LgorICBwcml2YXRlIGludCByZWZJbmRleDsKKworICAvLyBUaGUgZmlsZSBtYW5hZ2VyJ3Mgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoaXMgcmVzb3VyY2UsIHVzZWQgZm9yIGV4YW1wbGUKKyAgLy8gd2hlbiBjcmVhdGluZyB6aXAgYXJjaGl2ZXMuCisgIHByaXZhdGUgRmlsZSB3b3JraW5nRGlyOworCisKKworICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciByZXF1aXJlZCBieSBKQVhCLgorICAgKi8KKyAgcHVibGljIFJlZmVyZW5jZVJlc291cmNlKCkKKyAgeworICB9CisKKworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IHNldHMgdGhlIHJlZmVyZW5jZSBhbmQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSByZXNvdXJjZS4KKyAgICogQHBhcmFtIHByb2R1Y3RJZCB0aGUgSUQgb2YgdGhlIHByb2R1Y3QgdGhhdCB0aGUgcmVmZXJlbmNlIGJlbG9uZ3MgdG8KKyAgICogQHBhcmFtIHJlZkluZGV4IHRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmNlIHdpdGhpbiBpdHMgcHJvZHVjdAorICAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSByZWZlcmVuY2UgZm9yIHRoZSByZXNvdXJjZQorICAgKiBAcGFyYW0gd29ya2luZ0RpciB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlcyB0bworICAgKiBhdHRhY2ggdG8gcmVzcG9uc2VzCisgICAqLworICBwdWJsaWMgUmVmZXJlbmNlUmVzb3VyY2UoU3RyaW5nIHByb2R1Y3RJZCwgaW50IHJlZkluZGV4LCBSZWZlcmVuY2UgcmVmZXJlbmNlLAorICAgIEZpbGUgd29ya2luZ0RpcikKKyAgeworICAgIHRoaXMucHJvZHVjdElkID0gcHJvZHVjdElkOworICAgIHRoaXMucmVmSW5kZXggPSByZWZJbmRleDsKKyAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKyAgICB0aGlzLndvcmtpbmdEaXIgPSB3b3JraW5nRGlyOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSByZWZlcmVuY2UuCisgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZQorICAgKi8KKyAgcHVibGljIFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKQorICB7CisgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSByZWZlcmVuY2UuCisgICAqIEByZXR1cm4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisgICAqLworICBwdWJsaWMgRmlsZSBnZXRXb3JraW5nRGlyKCkKKyAgeworICAgIHJldHVybiB3b3JraW5nRGlyOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBJRCBvZiB0aGUgcHJvZHVjdCB0aGF0IHRoZSByZWZlcmVuY2UgYmVsb25ncyB0by4KKyAgICogQHJldHVybiB0aGUgSUQgb2YgdGhlIHByb2R1Y3QgdGhhdCB0aGUgcmVmZXJlbmNlIGJlbG9uZ3MgdG8KKyAgICovCisgIEBYbWxFbGVtZW50CisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdElkKCkKKyAgeworICAgIHJldHVybiBwcm9kdWN0SWQ7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSByZWZlcmVuY2Ugd2l0aGluIGl0cyBwcm9kdWN0LgorICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmNlIHdpdGhpbiBpdHMgcHJvZHVjdAorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIGludCBnZXRSZWZJbmRleCgpCisgIHsKKyAgICByZXR1cm4gcmVmSW5kZXg7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGRhdGEgc3RvcmUgcmVmZXJlbmNlIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBkYXRhIHN0b3JlIHJlZmVyZW5jZSBmb3IgdGhlIHJlZmVyZW5jZQorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIFN0cmluZyBnZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICB7CisgICAgcmV0dXJuIHJlZmVyZW5jZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgZmlsZSBzaXplIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBmaWxlIHNpemUgZm9yIHRoZSByZWZlcmVuY2UKKyAgICovCisgIEBYbWxFbGVtZW50CisgIHB1YmxpYyBsb25nIGdldEZpbGVTaXplKCkKKyAgeworICAgIHJldHVybiByZWZlcmVuY2UuZ2V0RmlsZVNpemUoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgTUlNRSB0eXBlIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSByZWZlcmVuY2UKKyAgICovCisgIEBYbWxFbGVtZW50KG5hbWUgPSAibWltZVR5cGUiKQorICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlTmFtZSgpCisgIHsKKyAgICBNaW1lVHlwZSBtID0gcmVmZXJlbmNlLmdldE1pbWVUeXBlKCk7CisgICAgaWYgKG0gIT0gbnVsbCkKKyAgICB7CisgICAgICByZXR1cm4gbS5nZXROYW1lKCk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSByZWZlcmVuY2UuCisgICAqIEByZXR1cm4gdGhlIE1JTUUgdHlwZSBmb3IgdGhlIHJlZmVyZW5jZQorICAgKi8KKyAgcHVibGljIE1pbWVUeXBlIGdldE1pbWVUeXBlKCkKKyAgeworICAgIHJldHVybiByZWZlcmVuY2UuZ2V0TWltZVR5cGUoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCByZWZlcmVuY2UgZm9yIHRoZSByZWZlcmVuY2UKKyAgICovCisgIEBYbWxFbGVtZW50KG5hbWUgPSAib3JpZ2luYWxSZWZlcmVuY2UiKQorICBwdWJsaWMgU3RyaW5nIGdldE9yaWdSZWZlcmVuY2UoKQorICB7CisgICAgcmV0dXJuIHJlZmVyZW5jZS5nZXRPcmlnUmVmZXJlbmNlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvVHJhbnNmZXJSZXNvdXJjZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9UcmFuc2ZlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4MDAyMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvVHJhbnNmZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuRmlsZVRyYW5zZmVyU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQSBKQVgtUlMgcmVzb3VyY2UgcmVwcmVzZW50aW5nIGEge0BsaW5rIEZpbGVUcmFuc2ZlclN0YXR1c30uCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK0BYbWxSb290RWxlbWVudChuYW1lID0gInRyYW5zZmVyIikKK0BYbWxUeXBlKHByb3BPcmRlciA9IHsicHJvZHVjdE5hbWUiLCAicHJvZHVjdElkIiwgInByb2R1Y3RUeXBlTmFtZSIsCisgICJkYXRhU3RvcmVSZWZlcmVuY2UiLCAib3JpZ1JlZmVyZW5jZSIsICJtaW1lVHlwZU5hbWUiLCAiZmlsZVNpemUiLAorICAidG90YWxCeXRlcyIsICJieXRlc1RyYW5zZmVycmVkIiwgInBlcmNlbnRDb21wbGV0ZSIsICJwcm9kdWN0UmVjZWl2ZWRUaW1lIn0pCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSkKK3B1YmxpYyBjbGFzcyBUcmFuc2ZlclJlc291cmNlCit7CisgIHByaXZhdGUgUmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisgIHByaXZhdGUgTWV0YWRhdGEgbWV0YWRhdGE7CisgIHByaXZhdGUgRmlsZVRyYW5zZmVyU3RhdHVzIHN0YXR1czsKKworCisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IgcmVxdWlyZWQgYnkgSkFYQi4KKyAgICovCisgIHB1YmxpYyBUcmFuc2ZlclJlc291cmNlKCkKKyAgeworICB9CisKKworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IHNldHMgdGhlIHtAbGluayBGaWxlVHJhbnNmZXJTdGF0dXN9IGZvciB0aGUgcmVzb3VyY2UuCisgICAqIEBwYXJhbSBwcm9kdWN0IHRoZSBwcm9kdWN0IGJlaW5nIHRyYW5zZmVycmVkCisgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9kdWN0IGJlaW5nIHRyYW5zZmVycmVkCisgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGZpbGUgdHJhbnNmZXIgc3RhdHVzIGZvciBwcm9kdWN0CisgICAqLworICBwdWJsaWMgVHJhbnNmZXJSZXNvdXJjZShQcm9kdWN0IHByb2R1Y3QsIE1ldGFkYXRhIG1ldGFkYXRhLAorICAgIEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXMpCisgIHsKKyAgICB0aGlzLnJlZmVyZW5jZSA9IHN0YXR1cy5nZXRGaWxlUmVmKCk7CisgICAgdGhpcy5wcm9kdWN0ID0gcHJvZHVjdDsKKyAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHByb2R1Y3QuCisgICAqIEByZXR1cm4gdGhlIHByb2R1Y3QKKyAgICovCisgIHB1YmxpYyBQcm9kdWN0IGdldFByb2R1Y3QoKQorICB7CisgICAgcmV0dXJuIHByb2R1Y3Q7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIG1ldGFkYXRhLgorICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YQorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhIGdldE1ldGFkYXRhKCkKKyAgeworICAgIHJldHVybiBtZXRhZGF0YTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgSUQgb2YgdGhlIHByb2R1Y3QuCisgICAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBwcm9kdWN0CisgICAqLworICBAWG1sRWxlbWVudAorICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RJZCgpCisgIHsKKyAgICByZXR1cm4gcHJvZHVjdC5nZXRQcm9kdWN0SWQoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdC4KKyAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdAorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZSgpCisgIHsKKyAgICByZXR1cm4gcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBwcm9kdWN0IHR5cGUgbmFtZSBmb3IgdGhlIHByb2R1Y3QuCisgICAqIEByZXR1cm4gdGhlIHByb2R1Y3QgdHlwZSBuYW1lIGZvciB0aGUgcHJvZHVjdAorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0VHlwZU5hbWUoKQorICB7CisgICAgcmV0dXJuIHByb2R1Y3QuZ2V0UHJvZHVjdFR5cGUoKS5nZXROYW1lKCk7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGRhdGEgc3RvcmUgcmVmZXJlbmNlIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBkYXRhIHN0b3JlIHJlZmVyZW5jZSBmb3IgdGhlIHJlZmVyZW5jZQorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIFN0cmluZyBnZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICB7CisgICAgcmV0dXJuIHJlZmVyZW5jZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCByZWZlcmVuY2UgZm9yIHRoZSByZWZlcmVuY2UKKyAgICovCisgIEBYbWxFbGVtZW50CisgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ1JlZmVyZW5jZSgpCisgIHsKKyAgICByZXR1cm4gcmVmZXJlbmNlLmdldE9yaWdSZWZlcmVuY2UoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgTUlNRSB0eXBlIGZvciB0aGUgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSByZWZlcmVuY2UKKyAgICovCisgIEBYbWxFbGVtZW50KG5hbWUgPSAibWltZVR5cGUiKQorICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlTmFtZSgpCisgIHsKKyAgICByZXR1cm4gcmVmZXJlbmNlLmdldE1pbWVUeXBlKCkuZ2V0TmFtZSgpOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBmaWxlIHNpemUgZm9yIHRoZSByZWZlcmVuY2UuCisgICAqIEByZXR1cm4gdGhlIGZpbGUgc2l6ZSBmb3IgdGhlIHJlZmVyZW5jZQorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIGxvbmcgZ2V0RmlsZVNpemUoKQorICB7CisgICAgcmV0dXJuIHJlZmVyZW5jZS5nZXRGaWxlU2l6ZSgpOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSB0b3RhbCBieXRlcyBvZiB0aGUgZmlsZSBiZWluZyB0cmFuc2ZlcnJlZC4KKyAgICogQHJldHVybiB0aGUgdG90YWwgYnl0ZXMgb2YgdGhlIGZpbGUKKyAgICovCisgIEBYbWxFbGVtZW50CisgIHB1YmxpYyBsb25nIGdldFRvdGFsQnl0ZXMoKQorICB7CisgICAgcmV0dXJuIHN0YXR1cy5nZXRGaWxlUmVmKCkuZ2V0RmlsZVNpemUoKTsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgYnl0ZXMgdHJhbnNmZXJyZWQgc3RhdHVzIG9mIHRoZSBmaWxlIHRyYW5zZmVyLgorICAgKiBAcmV0dXJuIHRoZSBieXRlcyB0cmFuc2ZlcnJlZCBzdGF0dXMKKyAgICovCisgIEBYbWxFbGVtZW50CisgIHB1YmxpYyBsb25nIGdldEJ5dGVzVHJhbnNmZXJyZWQoKQorICB7CisgICAgcmV0dXJuIHN0YXR1cy5nZXRCeXRlc1RyYW5zZmVycmVkKCk7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgc3RhdHVzIG9mIHRoZSBmaWxlIHRyYW5zZmVyLgorICAgKiBAcmV0dXJuIHRoZSBwZXJjZW50YWdlIGNvbXBsZXRlIHN0YXR1cyBvZiB0aGUgZmlsZSB0cmFuc2ZlcgorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIGRvdWJsZSBnZXRQZXJjZW50Q29tcGxldGUoKQorICB7CisgICAgcmV0dXJuIHN0YXR1cy5jb21wdXRlUGN0VHJhbnNmZXJyZWQoKSAqIDEwMDsKKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgb2YgdGhlIHByb2R1Y3QgcmVjZWl2ZWQgdGltZS4KKyAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgdmFsdWUgb2YgdGhlIHByb2R1Y3QgcmVjZWl2ZWQgdGltZQorICAgKi8KKyAgQFhtbEVsZW1lbnQKKyAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0UmVjZWl2ZWRUaW1lKCkKKyAgeworICAgIHJldHVybiBtZXRhZGF0YS5nZXRNZXRhZGF0YSgiQ0FTLlByb2R1Y3RSZWNlaXZlZFRpbWUiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9UcmFuc2ZlcnNSZXNvdXJjZS5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9UcmFuc2ZlcnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMGY3MzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL1RyYW5zZmVyc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKKworLyoqCisgKiBBIEpBWC1SUyByZXNvdXJjZSByZXByZXNlbnRpbmcgY3VycmVudGx5IGFjdGl2ZSB7QGxpbmsgRmlsZVRyYW5zZmVyU3RhdHVzCisgKiBmaWxlIHRyYW5zZmVyc30gYXMge0BsaW5rIFRyYW5zZmVyUmVzb3VyY2UgdHJhbnNmZXIgcmVzb3VyY2VzfS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAidHJhbnNmZXJzIikKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5OT05FKQorcHVibGljIGNsYXNzIFRyYW5zZmVyc1Jlc291cmNlCit7CisgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RJZDsKKworICBwcml2YXRlIExpc3Q8VHJhbnNmZXJSZXNvdXJjZT4gdHJhbnNmZXJSZXNvdXJjZXMgPQorICAgIG5ldyBBcnJheUxpc3Q8VHJhbnNmZXJSZXNvdXJjZT4oKTsKKworCisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IgcmVxdWlyZWQgYnkgSkFYQi4KKyAgICovCisgIHB1YmxpYyBUcmFuc2ZlcnNSZXNvdXJjZSgpCisgIHsKKyAgfQorCisKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCBzZXRzIHRoZSBwcm9kdWN0IElEIGFuZCBsaXN0IG9mIFRyYW5zZmVyUmVzb3VyY2UKKyAgICogaW5zdGFuY2VzIHJlbGF0ZWQgdG8gdGhlIHByb2R1Y3QuCisgICAqIEBwYXJhbSBwcm9kdWN0SWQgdGhlIHByb2R1Y3QgSUQKKyAgICogQHBhcmFtIHRyYW5zZmVyUmVzb3VyY2VzIHRoZSByZXNvdXJjZXMgcmVwcmVzZW50aW5nIGN1cnJlbnRseSBhY3RpdmUgZmlsZQorICAgKiB0cmFuc2ZlcnMgZm9yIHRoZSBwcm9kdWN0CisgICAqLworICBwdWJsaWMgVHJhbnNmZXJzUmVzb3VyY2UoU3RyaW5nIHByb2R1Y3RJZCwKKyAgICBMaXN0PFRyYW5zZmVyUmVzb3VyY2U+IHRyYW5zZmVyUmVzb3VyY2VzKQorICB7CisgICAgdGhpcy5wcm9kdWN0SWQgPSBwcm9kdWN0SWQ7CisgICAgdGhpcy50cmFuc2ZlclJlc291cmNlcyA9IHRyYW5zZmVyUmVzb3VyY2VzOworICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBwcm9kdWN0IElELgorICAgKiBAcmV0dXJuIHRoZSBwcm9kdWN0IElECisgICAqLworICBAWG1sQXR0cmlidXRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdElkKCkKKyAgeworICAgIHJldHVybiBwcm9kdWN0SWQ7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIHRyYW5zZmVyIHJlc291cmNlcy4KKyAgICogQHJldHVybiB0aGUgdHJhbnNmZXIgcmVzb3VyY2VzCisgICAqLworICBAWG1sRWxlbWVudChuYW1lID0gInRyYW5zZmVyIikKKyAgcHVibGljIExpc3Q8VHJhbnNmZXJSZXNvdXJjZT4gZ2V0VHJhbnNmZXJSZXNvdXJjZXMoKQorICB7CisgICAgcmV0dXJuIHRyYW5zZmVyUmVzb3VyY2VzOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL3BhY2thZ2UtaW5mby5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJjNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioKKyAqIENvbnRhaW5zIEpBWC1SUyByZXNvdXJjZSBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGZpbGUgbWFuYWdlciBlbnRpdGllcyBzdWNoCisgKiBhcyBwcm9kdWN0cywgdGhlaXIgcmVmZXJlbmNlcyBhbmQgdGhlaXIgbWV0YWRhdGEuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlczsKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9zZXJ2aWNlcy9DYXNQcm9kdWN0SmF4cnNTZXJ2aWNlLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvc2VydmljZXMvQ2FzUHJvZHVjdEpheHJzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliNDU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvc2VydmljZXMvQ2FzUHJvZHVjdEpheHJzU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5zZXJ2aWNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9ucy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLkRhdGFzZXRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlByb2R1Y3RSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlJlZmVyZW5jZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuVHJhbnNmZXJSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlRyYW5zZmVyc1Jlc291cmNlOworCisvKioKKyAqIFNlcnZpY2UgY2xhc3MgdGhhdCBoYW5kbGVzIEhUVFAgcmVxdWVzdHMgYW5kIHJldHVybnMgZmlsZSBtYW5hZ2VyIGVudGl0aWVzCisgKiBzdWNoIGFzIHtAbGluayBSZWZlcmVuY2UgcmVmZXJlbmNlc30gYW5kIHtAbGluayBQcm9kdWN0IHByb2R1Y3RzfSBhcworICogSkFYLVJTIHJlc291cmNlcyBjb252ZXJ0ZWQgdG8gZGlmZmVyZW50IGZvcm1hdHMuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYXNQcm9kdWN0SmF4cnNTZXJ2aWNlCit7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENhc1Byb2R1Y3RKYXhyc1NlcnZpY2UKKyAgICAuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvLyBUaGUgc2VydmxldCBjb250ZXh0LCB3aGljaCBpcyB1c2VkIHRvIHJldHJpZXZlIGNvbnRleHQgcGFyYW1ldGVycy4KKyAgQENvbnRleHQKKyAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisKKworICAvKioKKyAgICogR2V0cyBhbiBIVFRQIHJlc3BvbnNlIHRoYXQgcmVwcmVzZW50cyBhIHtAbGluayBSZWZlcmVuY2V9IGZyb20gYSB7QGxpbmsKKyAgICogUHJvZHVjdH0gZnJvbSB0aGUgZmlsZSBtYW5hZ2VyLgorICAgKiBAcGFyYW0gcHJvZHVjdElkIHRoZSBJRCBvZiB0aGUgcHJvZHVjdCB0aGF0IHRoZSByZWZlcmVuY2UgYmVsb25ncyB0bworICAgKiBAcGFyYW0gcmVmSW5kZXggdGhlIGluZGV4IG9mIHRoZSByZWZlcmVuY2Ugd2l0aGluIHRoZSBwcm9kdWN0J3MgbGlzdCBvZgorICAgKiByZWZlcmVuY2VzCisgICAqIEByZXR1cm4gYW4gSFRUUCByZXNwb25zZSB0aGF0IHJlcHJlc2VudHMgYSB7QGxpbmsgUmVmZXJlbmNlfSBmcm9tIGEge0BsaW5rCisgICAqIFByb2R1Y3R9IGZyb20gdGhlIGZpbGUgbWFuYWdlcgorICAgKi8KKyAgQEdFVAorICBAUGF0aCgicmVmZXJlbmNlIikKKyAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIiwKKyAgICAiYXBwbGljYXRpb24vYXRvbSt4bWwiLCAiYXBwbGljYXRpb24vcmRmK3htbCIsICJhcHBsaWNhdGlvbi9yc3MreG1sIiwKKyAgICAiYXBwbGljYXRpb24vemlwIn0pCisgIHB1YmxpYyBSZWZlcmVuY2VSZXNvdXJjZSBnZXRSZWZlcmVuY2UoCisgICAgQFF1ZXJ5UGFyYW0oInByb2R1Y3RJZCIpIFN0cmluZyBwcm9kdWN0SWQsCisgICAgQFF1ZXJ5UGFyYW0oInJlZkluZGV4IikgaW50IHJlZkluZGV4KQorICB7CisgICAgaWYgKHByb2R1Y3RJZCA9PSBudWxsIHx8IHByb2R1Y3RJZC50cmltKCkuZXF1YWxzKCIiKSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiVGhpcyBVUkwgcmVxdWlyZXMgYSBwcm9kdWN0SWQgcXVlcnkgIgorICAgICAgICArICJwYXJhbWV0ZXIgd2l0aCBhIHByb2R1Y3QgSUQgdmFsdWUsICIKKyAgICAgICAgKyAiZS5nLiAvcmVmZXJlbmNlP3Byb2R1Y3RJZD0xNzg3YTI1Ny1kZjg3LTExZTItOGEyZC1lM2Y2MjY0ZTg2YzUiKTsKKyAgICB9CisKKyAgICB0cnkKKyAgICB7CisgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBnZXRDb250ZXh0Q2xpZW50KCk7CisgICAgICBQcm9kdWN0IHByb2R1Y3QgPSBjbGllbnQuZ2V0UHJvZHVjdEJ5SWQocHJvZHVjdElkKTsKKyAgICAgIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gY2xpZW50LmdldFByb2R1Y3RSZWZlcmVuY2VzKHByb2R1Y3QpOworCisgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVJlc291cmNlKHByb2R1Y3RJZCwgcmVmSW5kZXgsCisgICAgICAgIHJlZmVyZW5jZXMuZ2V0KHJlZkluZGV4KSwgZ2V0Q29udGV4dFdvcmtpbmdEaXIoKSk7CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gZmluZCB0aGUgcmVxdWVzdGVkIHJlc291cmNlLiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UsIGUpOworICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKG1lc3NhZ2UgKyAiICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKworCisgIC8qKgorICAgKiBHZXRzIGFuIEhUVFAgcmVzcG9uc2UgdGhhdCByZXByZXNlbnRzIGEge0BsaW5rIFByb2R1Y3R9IGZyb20gdGhlIGZpbGUKKyAgICogbWFuYWdlci4KKyAgICogQHBhcmFtIHByb2R1Y3RJZCB0aGUgSUQgb2YgdGhlIHByb2R1Y3QKKyAgICogQHJldHVybiBhbiBIVFRQIHJlc3BvbnNlIHRoYXQgcmVwcmVzZW50cyBhIHtAbGluayBQcm9kdWN0fSBmcm9tIHRoZSBmaWxlCisgICAqIG1hbmFnZXIKKyAgICovCisgIEBHRVQKKyAgQFBhdGgoInByb2R1Y3QiKQorICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi9hdG9tK3htbCIsCisgICAgImFwcGxpY2F0aW9uL3JkZit4bWwiLCAiYXBwbGljYXRpb24vcnNzK3htbCIsICJhcHBsaWNhdGlvbi96aXAifSkKKyAgcHVibGljIFByb2R1Y3RSZXNvdXJjZSBnZXRQcm9kdWN0KEBRdWVyeVBhcmFtKCJwcm9kdWN0SWQiKSBTdHJpbmcgcHJvZHVjdElkKQorICB7CisgICAgaWYgKHByb2R1Y3RJZCA9PSBudWxsIHx8IHByb2R1Y3RJZC50cmltKCkuZXF1YWxzKCIiKSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiVGhpcyBVUkwgcmVxdWlyZXMgYSBwcm9kdWN0SWQgcXVlcnkgIgorICAgICAgICArICJwYXJhbWV0ZXIgd2l0aCBhIHByb2R1Y3QgSUQgdmFsdWUsICIKKyAgICAgICAgKyAiZS5nLiAvcHJvZHVjdD9wcm9kdWN0SWQ9MTc4N2EyNTctZGY4Ny0xMWUyLThhMmQtZTNmNjI2NGU4NmM1Iik7CisgICAgfQorCisgICAgdHJ5CisgICAgeworICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q29udGV4dENsaWVudCgpOworCisgICAgICAvLyBGaW5kIHRoZSBwcm9kdWN0LgorICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gY2xpZW50LmdldFByb2R1Y3RCeUlkKHByb2R1Y3RJZCk7CisgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKGNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KSk7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgcHJvZHVjdCByZXNvdXJjZSwgYWRkIHRoZSBwcm9kdWN0IGRhdGEgYW5kIHJldHVybiB0aGUKKyAgICAgIC8vIHJlc291cmNlIGFzIHRoZSBIVFRQIHJlc3BvbnNlLgorICAgICAgcmV0dXJuIG5ldyBQcm9kdWN0UmVzb3VyY2UocHJvZHVjdCwgY2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3QpLAorICAgICAgICBwcm9kdWN0LmdldFByb2R1Y3RSZWZlcmVuY2VzKCksIGdldENvbnRleHRXb3JraW5nRGlyKCkpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGZpbmQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4iOworICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBtZXNzYWdlLCBlKTsKKyAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihtZXNzYWdlICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyBhbiBIVFRQIHJlc3BvbnNlIHRoYXQgcmVwcmVzZW50cyBhIHNldCBvZiB7QGxpbmsgUHJvZHVjdCBwcm9kdWN0c30KKyAgICogZnJvbSB0aGUgZmlsZSBtYW5hZ2VyLgorICAgKiBAcGFyYW0gcHJvZHVjdFR5cGVJZCB0aGUgSUQgb2YgdGhlIHtAbGluayBQcm9kdWN0VHlwZX0gZm9yIHRoZSBkYXRhIHNldCBvcgorICAgKiAiQUxMIiB0byBkZW5vdGUgYWxsIHByb2R1Y3QgdHlwZXMKKyAgICogQHJldHVybiBhbiBIVFRQIHJlc3BvbnNlIHRoYXQgcmVwcmVzZW50cyBhIHNldCBvZiB7QGxpbmsgUHJvZHVjdCBwcm9kdWN0c30KKyAgICogZnJvbSB0aGUgZmlsZSBtYW5hZ2VyCisgICAqLworICBAR0VUCisgIEBQYXRoKCJkYXRhc2V0IikKKyAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24iLCAiYXBwbGljYXRpb24vYXRvbSt4bWwiLAorICAgImFwcGxpY2F0aW9uL3JkZit4bWwiLCAiYXBwbGljYXRpb24vcnNzK3htbCIsICJhcHBsaWNhdGlvbi96aXAifSkKKyAgcHVibGljIERhdGFzZXRSZXNvdXJjZSBnZXREYXRhc2V0KAorICAgIEBRdWVyeVBhcmFtKCJwcm9kdWN0VHlwZUlkIikgU3RyaW5nIHByb2R1Y3RUeXBlSWQpCisgIHsKKyAgICBpZiAocHJvZHVjdFR5cGVJZCA9PSBudWxsIHx8IHByb2R1Y3RUeXBlSWQudHJpbSgpLmVxdWFscygiIikpCisgICAgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIlRoaXMgVVJMIHJlcXVpcmVzIGEgcHJvZHVjdFR5cGVJZCBxdWVyeSAiCisgICAgICAgICsgInBhcmFtZXRlciBhbmQgZWl0aGVyIGEgcHJvZHVjdCB0eXBlIElEIHZhbHVlIG9yICdBTEwnIGZvciBhbGwgIgorICAgICAgICArICJwcm9kdWN0IHR5cGVzLiIpOworICAgIH0KKworICAgIHRyeQorICAgIHsKKyAgICAgIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IGdldENvbnRleHRDbGllbnQoKTsKKworICAgICAgU3RyaW5nIGRhdGFzZXRJZDsKKyAgICAgIFN0cmluZyBkYXRhc2V0TmFtZTsKKyAgICAgIE1ldGFkYXRhIGRhdGFzZXRNZXRhZGF0YTsKKworICAgICAgTGlzdDxQcm9kdWN0VHlwZT4gcHJvZHVjdFR5cGVzID0gbmV3IFZlY3RvcjxQcm9kdWN0VHlwZT4oKTsKKyAgICAgIGlmIChwcm9kdWN0VHlwZUlkLmVxdWFscygiQUxMIikpCisgICAgICB7CisgICAgICAgIHByb2R1Y3RUeXBlcyA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZXMoKTsKKyAgICAgICAgZGF0YXNldElkID0gcHJvZHVjdFR5cGVJZDsKKyAgICAgICAgZGF0YXNldE5hbWUgPSBwcm9kdWN0VHlwZUlkOworICAgICAgICBkYXRhc2V0TWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgZGF0YXNldE1ldGFkYXRhLmFkZE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIsIHByb2R1Y3RUeXBlSWQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IGNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZHVjdFR5cGVJZCk7CisgICAgICAgIHByb2R1Y3RUeXBlcy5hZGQocHJvZHVjdFR5cGUpOworICAgICAgICBkYXRhc2V0SWQgPSBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCk7CisgICAgICAgIGRhdGFzZXROYW1lID0gcHJvZHVjdFR5cGUuZ2V0TmFtZSgpOworICAgICAgICBkYXRhc2V0TWV0YWRhdGEgPSBwcm9kdWN0VHlwZS5nZXRUeXBlTWV0YWRhdGEoKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIHByb2R1Y3REaXJQYXRoID0gZ2V0Q29udGV4dFdvcmtpbmdEaXIoKS5nZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgICAgKyAiLyIgKyBkYXRhc2V0TmFtZTsKKworICAgICAgRGF0YXNldFJlc291cmNlIHJlc291cmNlID0gbmV3IERhdGFzZXRSZXNvdXJjZShkYXRhc2V0SWQsIGRhdGFzZXROYW1lLAorICAgICAgICBkYXRhc2V0TWV0YWRhdGEsIGdldENvbnRleHRXb3JraW5nRGlyKCkpOworCisgICAgICAvLyBBZGQgYWxsIHByb2R1Y3RzIG9mIHRoZSBjaG9zZW4gdHlwZShzKSB0byB0aGUgZGF0YXNldC4KKyAgICAgIGZvciAoUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUgOiBwcm9kdWN0VHlwZXMpCisgICAgICB7CisgICAgICAgIGZvciAoUHJvZHVjdCBwcm9kdWN0IDogY2xpZW50LmdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZShwcm9kdWN0VHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICBwcm9kdWN0LnNldFByb2R1Y3RSZWZlcmVuY2VzKGNsaWVudC5nZXRQcm9kdWN0UmVmZXJlbmNlcyhwcm9kdWN0KSk7CisgICAgICAgICAgcmVzb3VyY2UuYWRkUHJvZHVjdFJlc291cmNlKG5ldyBQcm9kdWN0UmVzb3VyY2UocHJvZHVjdCwKKyAgICAgICAgICAgIGNsaWVudC5nZXRNZXRhZGF0YShwcm9kdWN0KSwgcHJvZHVjdC5nZXRQcm9kdWN0UmVmZXJlbmNlcygpLAorICAgICAgICAgICAgbmV3IEZpbGUocHJvZHVjdERpclBhdGgpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXNvdXJjZTsKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBmaW5kIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgYW4gSFRUUCByZXNwb25zZSB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiBhIGN1cnJlbnRseSBhY3RpdmUKKyAgICogZmlsZSB0cmFuc2ZlciBmb3IgdGhlIGZpbGUgbWFuYWdlci4KKyAgICogQHBhcmFtIGRhdGFTdG9yZVJlZiB0aGUgZGF0YSBzdG9yZSByZWZlcmVuY2UgZm9yIHRoZSBmaWxlIGJlaW5nIHRyYW5zZmVycmVkCisgICAqIEByZXR1cm4gYW4gSFRUUCByZXNwb25zZSB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiBhIGN1cnJlbnRseSBhY3RpdmUKKyAgICogZmlsZSB0cmFuc2ZlciBmb3IgdGhlIGZpbGUgbWFuYWdlcgorICAgKi8KKyAgQEdFVAorICBAUGF0aCgidHJhbnNmZXIiKQorICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi9hdG9tK3htbCIsCisgICAgImFwcGxpY2F0aW9uL3JkZit4bWwiLCAiYXBwbGljYXRpb24vcnNzK3htbCJ9KQorICBwdWJsaWMgVHJhbnNmZXJSZXNvdXJjZSBnZXRUcmFuc2ZlcigKKyAgICBAUXVlcnlQYXJhbSgiZGF0YVN0b3JlUmVmIikgU3RyaW5nIGRhdGFTdG9yZVJlZikKKyAgeworICAgIGlmIChkYXRhU3RvcmVSZWYgPT0gbnVsbCB8fCBkYXRhU3RvcmVSZWYudHJpbSgpLmVxdWFscygiIikpCisgICAgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIlRoaXMgVVJMIHJlcXVpcmVzIGEgZGF0YVN0b3JlUmVmIHF1ZXJ5ICIKKyAgICAgICAgKyAicGFyYW1ldGVyIGFuZCBhIGRhdGEgc3RvcmUgcmVmZXJlbmNlIHZhbHVlLCAiCisgICAgICAgICsgImUuZy4gL3RyYW5zZmVyP2RhdGFTdG9yZVJlZj1maWxlOi9yZXBvc2l0b3J5L3Rlc3QudHh0L3Rlc3QudHh0Iik7CisgICAgfQorCisgICAgdHJ5CisgICAgeworICAgICAgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q29udGV4dENsaWVudCgpOworICAgICAgZm9yIChGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzIDogY2xpZW50LmdldEN1cnJlbnRGaWxlVHJhbnNmZXJzKCkpCisgICAgICB7CisgICAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2UgPSBzdGF0dXMuZ2V0RmlsZVJlZigpOworICAgICAgICBpZiAoZGF0YVN0b3JlUmVmLmVxdWFscyhyZWZlcmVuY2UuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKQorICAgICAgICB7CisgICAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gc3RhdHVzLmdldFBhcmVudFByb2R1Y3QoKTsKKyAgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IGNsaWVudC5nZXRNZXRhZGF0YShwcm9kdWN0KTsKKyAgICAgICAgICByZXR1cm4gbmV3IFRyYW5zZmVyUmVzb3VyY2UocHJvZHVjdCwgbWV0YWRhdGEsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgYSBjdXJyZW50IGZpbGUgdHJhbnNmZXIgc3RhdHVzIGZvciIKKyAgICAgICAgKyAiZGF0YSBzdG9yZSByZWZlcmVuY2U6ICIgKyBkYXRhU3RvcmVSZWYpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGZpbmQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4iOworICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBtZXNzYWdlLCBlKTsKKyAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihtZXNzYWdlICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisKKworICAvKioKKyAgICogR2V0cyBhbiBIVFRQIHJlc3BvbnNlIHRoYXQgcmVwcmVzZW50cyB0aGUgc3RhdHVzZXMgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUKKyAgICogZmlsZSB0cmFuc2ZlcnMgZm9yIHRoZSBmaWxlIG1hbmFnZXIsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgcHJvZHVjdCBJRC4KKyAgICogQHBhcmFtIHByb2R1Y3RJZCB0aGUgSUQgb2YgYSBwcm9kdWN0IG9yIEFMTCB0byBkZW5vdGUgYWxsIHByb2R1Y3RzCisgICAqIEByZXR1cm4gYW4gSFRUUCByZXNwb25zZSB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXR1c2VzIG9mIGFsbCBjdXJyZW50bHkKKyAgICogYWN0aXZlIGZpbGUgdHJhbnNmZXJzIGZvciB0aGUgZmlsZSBtYW5hZ2VyCisgICAqLworICBAR0VUCisgIEBQYXRoKCJ0cmFuc2ZlcnMiKQorICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi9hdG9tK3htbCIsCisgICAgImFwcGxpY2F0aW9uL3JkZit4bWwiLCAiYXBwbGljYXRpb24vcnNzK3htbCJ9KQorICBwdWJsaWMgVHJhbnNmZXJzUmVzb3VyY2UgZ2V0VHJhbnNmZXJzKAorICAgIEBRdWVyeVBhcmFtKCJwcm9kdWN0SWQiKSBTdHJpbmcgcHJvZHVjdElkKQorICB7CisgICAgaWYgKHByb2R1Y3RJZCA9PSBudWxsIHx8IHByb2R1Y3RJZC50cmltKCkuZXF1YWxzKCIiKSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiVGhpcyBVUkwgcmVxdWlyZXMgYSBwcm9kdWN0SWQgcXVlcnkgIgorICAgICAgICArICJwYXJhbWV0ZXIgYW5kIGVpdGhlciBhIHZhbGlkIHByb2R1Y3QgSUQgdmFsdWUgb3IgJ0FMTCcgZm9yIGFsbCAiCisgICAgICAgICsgInByb2R1Y3RzLiIpOworICAgIH0KKworICAgIHRyeQorICAgIHsKKyAgICAgIExpc3Q8VHJhbnNmZXJSZXNvdXJjZT4gdHJhbnNmZXJSZXNvdXJjZXMgPQorICAgICAgICBuZXcgQXJyYXlMaXN0PFRyYW5zZmVyUmVzb3VyY2U+KCk7CisgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBnZXRDb250ZXh0Q2xpZW50KCk7CisgICAgICBmb3IgKEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXMgOiBjbGllbnQuZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcnMoKSkKKyAgICAgIHsKKyAgICAgICAgUHJvZHVjdCBwcm9kdWN0ID0gc3RhdHVzLmdldFBhcmVudFByb2R1Y3QoKTsKKyAgICAgICAgaWYocHJvZHVjdElkLmVxdWFscygiQUxMIikgfHwgcHJvZHVjdElkLmVxdWFscyhwcm9kdWN0LmdldFByb2R1Y3RJZCgpKSkKKyAgICAgICAgeworICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gY2xpZW50LmdldE1ldGFkYXRhKHByb2R1Y3QpOworICAgICAgICAgIHRyYW5zZmVyUmVzb3VyY2VzLmFkZCgKKyAgICAgICAgICAgIG5ldyBUcmFuc2ZlclJlc291cmNlKHByb2R1Y3QsIG1ldGFkYXRhLCBzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBUcmFuc2ZlcnNSZXNvdXJjZShwcm9kdWN0SWQsIHRyYW5zZmVyUmVzb3VyY2VzKTsKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBmaW5kIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGZpbGUgbWFuYWdlcidzIHdvcmtpbmcgZGlyZWN0b3J5IGZyb20gdGhlIHNlcnZsZXQgY29udGV4dC4KKyAgICogQHJldHVybiB0aGUgZmlsZSBtYW5hZ2VyIHdvcmtpbmcgZGlyZWN0b3J5CisgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIG9iamVjdCBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbnRleHQKKyAgICogYXR0cmlidXRlCisgICAqLworICBwdWJsaWMgRmlsZSBnZXRDb250ZXh0V29ya2luZ0RpcigpIHRocm93cyBFeGNlcHRpb24KKyAgeworICAgIE9iamVjdCB3b3JraW5nRGlyT2JqZWN0ID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIndvcmtpbmdEaXIiKTsKKyAgICBpZiAod29ya2luZ0Rpck9iamVjdCAhPSBudWxsICYmIHdvcmtpbmdEaXJPYmplY3QgaW5zdGFuY2VvZiBGaWxlKQorICAgIHsKKyAgICAgIHJldHVybiAoRmlsZSkgd29ya2luZ0Rpck9iamVjdDsKKyAgICB9CisKKyAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gZ2V0IHRoZSBmaWxlIG1hbmFnZXIncyB3b3JraW5nICIKKyAgICAgICsgImRpcmVjdG9yeSBmcm9tIHRoZSBzZXJ2bGV0IGNvbnRleHQuIjsKKyAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIG1lc3NhZ2UpOworICAgIHRocm93IG5ldyBFeGNlcHRpb24obWVzc2FnZSk7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGZpbGUgbWFuYWdlciBjbGllbnQgaW5zdGFuY2UgZnJvbSB0aGUgc2VydmxldCBjb250ZXh0LgorICAgKiBAcmV0dXJuIHRoZSBmaWxlIG1hbmFnZXIgY2xpZW50IGluc3RhbmNlIGZyb20gdGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUKKyAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gb2JqZWN0IGNhbm5vdCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgY29udGV4dAorICAgKiBhdHRyaWJ1dGUKKyAgICovCisgIHB1YmxpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBnZXRDb250ZXh0Q2xpZW50KCkKKyAgICB0aHJvd3MgRXhjZXB0aW9uCisgIHsKKyAgICAvLyBHZXQgdGhlIGZpbGUgbWFuYWdlciBjbGllbnQgZnJvbSB0aGUgc2VydmxldCBjb250ZXh0LgorICAgIE9iamVjdCBjbGllbnRPYmplY3QgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSgiY2xpZW50Iik7CisgICAgaWYgKGNsaWVudE9iamVjdCAhPSBudWxsICYmCisgICAgICAgIGNsaWVudE9iamVjdCBpbnN0YW5jZW9mIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KQorICAgIHsKKyAgICAgIHJldHVybiAoWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQpIGNsaWVudE9iamVjdDsKKyAgICB9CisKKyAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gZ2V0IHRoZSBmaWxlIG1hbmFnZXIgY2xpZW50IGZyb20gdGhlICIKKyAgICAgICsgInNlcnZsZXQgY29udGV4dC4iOworICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgbWVzc2FnZSk7CisgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3NlcnZpY2VzL3BhY2thZ2UtaW5mby5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3NlcnZpY2VzL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmNiYTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvc2VydmljZXMvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqCisgKiBDb250YWlucyBzZXJ2aWNlIGNsYXNzZXMgZm9yIHRoZSBKQVgtUlMgc2VydmljZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuc2VydmljZXM7CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvc2VydmxldHMvQ2FzUHJvZHVjdEpheHJzU2VydmxldC5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3NlcnZsZXRzL0Nhc1Byb2R1Y3RKYXhyc1NlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTg4NzM5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3NlcnZsZXRzL0Nhc1Byb2R1Y3RKYXhyc1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY3hmLmpheHJzLnNlcnZsZXQuQ1hGTm9uU3ByaW5nSmF4cnNTZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmNvbmZpZ3VyYXRpb25zLlJkZkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmNvbmZpZ3VyYXRpb25zLlJzc0NvbmZpZ3VyYXRpb247CisKKy8qKgorICogUHJvdmlkZXMgYSBzaW5nbGUgcGxhY2UgdG8gaW5pdGlhbGl6ZSBpdGVtcyBzdWNoIGFzIHRoZSBmaWxlIG1hbmFnZXIgY2xpZW50LAorICogd29ya2luZyBkaXJlY3RvcnkgYW5kIGNvbmZpZ3VyYXRpb25zIHdoZW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBpcyBzdGFydGVkIHVwLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ2FzUHJvZHVjdEpheHJzU2VydmxldCBleHRlbmRzIENYRk5vblNwcmluZ0pheHJzU2VydmxldAoreworICAvLyBBdXRvLWdlbmVyYXRlZCBJRCBmb3Igc2VyaWFsaXphdGlvbi4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE4MzU3OTAxODUwMDA3NzMzOTZMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENhc1Byb2R1Y3RKYXhyc1NlcnZsZXQKKyAgICAuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX1BBUkFNX0xFTkdUSCA9IDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05GSUdfUEFSQU1fRk9STUFUID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTkZJR19QQVJBTV9OQU1FID0gMjsKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlndXJhdGlvbikgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KKyAgeworICAgIHN1cGVyLmluaXQoY29uZmlndXJhdGlvbik7CisgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICBpbml0aWFsaXplQ2xpZW50KGNvbnRleHQpOworICAgIGluaXRpYWxpemVXb3JraW5nRGlyKGNvbnRleHQpOworICAgIGluaXRpYWxpemVDb25maWd1cmF0aW9ucyhjb250ZXh0KTsKKyAgfQorCisKKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIGZpbGUgbWFuYWdlciBjbGllbnQgYW5kIHN0b3JlcyBpdCBhcyBhICJjbGllbnQiIGNvbnRleHQKKyAgICogYXR0cmlidXRlIGJ5IHJldHJpZXZpbmcgYSB2YWx1ZSBmb3IgdGhlIGZpbGUgbWFuYWdlciBVUkwgZnJvbSB0aGUgc2VydmxldAorICAgKiBjb250ZXh0LgorICAgKiBAcGFyYW0gY29udGV4dCB0aGUgc2VydmxldCBjb250ZXh0CisgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBjb250ZXh0IHBhcmFtZXRlciBmb3IgdGhlIGZpbGUKKyAgICogbWFuYWdlciB3b3JraW5nIGRpcmVjdG9yeSBwYXRoIGNhbm5vdCBiZSBmb3VuZAorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDbGllbnQoU2VydmxldENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KKyAgeworICAgIHRyeQorICAgIHsKKyAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgU3RyaW5nIHVybFBhcmFtZXRlciA9IGNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcigiZmlsZW1nci51cmwiKTsKKyAgICAgIGlmICh1cmxQYXJhbWV0ZXIgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgLy8gR2V0IHRoZSBmaWxlIG1hbmFnZXIgVVJMIGZyb20gdGhlIGNvbnRleHQgcGFyYW1ldGVyLgorICAgICAgICB1cmwgPSBuZXcgVVJMKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHVybFBhcmFtZXRlcikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBUcnkgdGhlIGRlZmF1bHQgVVJMIGZvciB0aGUgZmlsZSBtYW5hZ2VyLgorICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZmluZCBhIHNlcnZsZXQgY29udGV4dCBwYXJhbWV0ZXIgIgorICAgICAgICAgICsgImZvciB0aGUgZmlsZSBtYW5hZ2VyIFVSTC4iKTsKKyAgICAgICAgdXJsID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIik7CisgICAgICB9CisKKyAgICAgIC8vIEF0dGVtcHQgdG8gY29ubmVjdCB0aGUgY2xpZW50IHRvIHRoZSBmaWxlIG1hbmFnZXIgYW5kIGlmIHN1Y2Nlc3NmdWwKKyAgICAgIC8vIHN0b3JlIHRoZSBjbGllbnQgYXMgYSBjb250ZXh0IGF0dHJpYnV0ZSBmb3Igb3RoZXIgb2JqZWN0cyB0byBhY2Nlc3MuCisgICAgICBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBjbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQodXJsKTsKKyAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjbGllbnQiLCBjbGllbnQpOworICAgIH0KKyAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRW5jb3VudGVyZWQgYSBtYWxmb3JtZWQgVVJMIGZvciB0aGUgZmlsZSBtYW5hZ2VyLiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9CisgICAgY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICJDbGllbnQgY291bGQgbm90IGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGZpbGUgbWFuYWdlci4iOworICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIG1lc3NhZ2UsIGUpOworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorICB9CisKKworCisgIC8qKgorICAgKiBJbml0aWFsaXplcyB0aGUgZmlsZSBtYW5hZ2VyIHdvcmtpbmcgZGlyZWN0b3J5IHBhdGggYW5kIHN0b3JlcyBpdCBhcyBhCisgICAqICJ3b3JraW5nRGlyIiBjb250ZXh0IGF0dHJpYnV0ZSBieSByZXRyaWV2aW5nIGEgdmFsdWUgZnJvbSB0aGUgc2VydmxldAorICAgKiBjb250ZXh0LgorICAgKiBAcGFyYW0gY29udGV4dCB0aGUgc2VydmxldCBjb250ZXh0CisgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBjb250ZXh0IHBhcmFtZXRlciBmb3IgdGhlIGZpbGUKKyAgICogbWFuYWdlciB3b3JraW5nIGRpcmVjdG9yeSBwYXRoIGNhbm5vdCBiZSBmb3VuZAorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXb3JraW5nRGlyKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpCisgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KKyAgeworICAgIFN0cmluZyB3b3JraW5nRGlyUGF0aCA9IGNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcigiZmlsZW1nci53b3JraW5nLmRpciIpOworICAgIGlmICh3b3JraW5nRGlyUGF0aCAhPSBudWxsKQorICAgIHsKKyAgICAgIC8vIFZhbGlkYXRlIHRoZSBwYXRoLgorICAgICAgRmlsZSB3b3JraW5nRGlyID0gbmV3IEZpbGUoUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMod29ya2luZ0RpclBhdGgpKTsKKyAgICAgIGlmICh3b3JraW5nRGlyLmV4aXN0cygpICYmIHdvcmtpbmdEaXIuaXNEaXJlY3RvcnkoKSkKKyAgICAgIHsKKyAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoIndvcmtpbmdEaXIiLCB3b3JraW5nRGlyKTsKKyAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiVGhlIGZpbGUgbWFuYWdlcidzIHdvcmtpbmcgZGlyZWN0b3J5IGhhcyBiZWVuICIKKyAgICAgICAgICArICJzZXQgdXAgYXMgIiArIHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlVuYWJsZSB0byBsb2NhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciAiCisgICAgICAgICAgKyAidGhlIGZpbGUgbWFuYWdlci4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBmaW5kIGEgc2VydmxldCBjb250ZXh0IHBhcmFtZXRlciBmb3IgdGhlIGZpbGUiCisgICAgICAgICsgIiBtYW5hZ2VyIHdvcmtpbmcgZGlyZWN0b3J5IHBhdGguIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisKKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIG91dHB1dCBjb25maWd1cmF0aW9ucyBmb3IgdmFyaW91cyBkaWZmZXJlbnQgZm9ybWF0cyBhbmQKKyAgICogc3RvcmVzIHRoZW0gaW4gImNvbmZpZ3VyYXRpb25zIiBhdHRyaWJ1dGVzIGJ5IHJldHJpZXZpbmcgdmFsdWVzIGZyb20gdGhlCisgICAqIHNlcnZsZXQgY29udGV4dC4KKyAgICogQHBhcmFtIGNvbnRleHQgdGhlIHNlcnZsZXQgY29udGV4dAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IgcmVhZAorICAgKi8KKyAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNvbmZpZ3VyYXRpb25zKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpCisgIHsKKyAgICBNYXA8U3RyaW5nLCBSZGZDb25maWd1cmF0aW9uPiByZGZDb25maWd1cmF0aW9ucyA9CisgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFJkZkNvbmZpZ3VyYXRpb24+KCk7CisgICAgTWFwPFN0cmluZywgUnNzQ29uZmlndXJhdGlvbj4gcnNzQ29uZmlndXJhdGlvbnMgPQorICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBSc3NDb25maWd1cmF0aW9uPigpOworCisgICAgRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IGNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKQorICAgIHsKKyAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgIGlmKHBhcmFtZXRlck5hbWUuc3RhcnRzV2l0aCgiY29uZmlndXJhdGlvbiIpKQorICAgICAgeworICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBwYXJhbWV0ZXJOYW1lLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gQ09ORklHX1BBUkFNX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIFN0cmluZyBmb3JtYXQgPSB2YWx1ZXNbQ09ORklHX1BBUkFNX0ZPUk1BVF07CisgICAgICAgICAgU3RyaW5nIG5hbWUgPSB2YWx1ZXNbQ09ORklHX1BBUkFNX05BTUVdOworICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgICAgY29udGV4dC5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpKTsKKworICAgICAgICAgIHRyeQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgicmRmIi5lcXVhbHMoZm9ybWF0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgUmRmQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFJkZkNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5pbml0aWFsaXplKG5ldyBGaWxlKHZhbHVlKSk7CisgICAgICAgICAgICAgIHJkZkNvbmZpZ3VyYXRpb25zLnB1dChuYW1lLCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCJyc3MiLmVxdWFscyhmb3JtYXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBSc3NDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgUnNzQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmluaXRpYWxpemUobmV3IEZpbGUodmFsdWUpKTsKKyAgICAgICAgICAgICAgcnNzQ29uZmlndXJhdGlvbnMucHV0KG5hbWUsIGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJUaGUgY29uZmlndXJhdGlvbiAnIiArIHBhcmFtZXRlck5hbWUKKyAgICAgICAgICAgICAgKyAiJ2NvdWxkIG5vdCBiZSBpbml0aWFsaXplZCAodmFsdWU6ICIgKyB2YWx1ZSArICIpLiIsIGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsCisgICAgICAgICAgICAiQ29uZmlndXJhdGlvbiBjb250ZXh0IHBhcmFtZXRlciBjb3VsZCBub3QgYmUgcGFyc2VkLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoInJkZkNvbmZpZ3VyYXRpb25zIiwgcmRmQ29uZmlndXJhdGlvbnMpOworICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJyc3NDb25maWd1cmF0aW9ucyIsIHJzc0NvbmZpZ3VyYXRpb25zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3NlcnZsZXRzL3BhY2thZ2UtaW5mby5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3NlcnZsZXRzL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDg3NzIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvc2VydmxldHMvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqCisgKiBDb250YWlucyBzZXJ2bGV0cyBmb3IgdGhlIEpBWC1SUyBzZXJ2aWNlLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5zZXJ2bGV0czsKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL0RhdGFzZXRSZGZXcml0ZXIuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL0RhdGFzZXRSZGZXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA3NDdhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvRGF0YXNldFJkZldyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuY29uZmlndXJhdGlvbnMuUmRmQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9ucy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuRGF0YXNldFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuTWV0YWRhdGFSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLk1ldGFkYXRhUmVzb3VyY2UuTWV0YWRhdGFFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlByb2R1Y3RSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBBIHtAbGluayBQcm92aWRlcn0gdGhhdCB3cml0ZXMge0BsaW5rIERhdGFzZXRSZXNvdXJjZSBkYXRhc2V0IHJlc291cmNlc30gdG8KKyAqIG91dHB1dCBzdHJlYW1zIGZvciBIVFRQIHJlc3BvbnNlcyB3aXRoICJhcHBsaWNhdGlvbi9yZGYreG1sIiBjb250ZW50LXR5cGUuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK0BQcm92aWRlcgorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9yZGYreG1sIikKK3B1YmxpYyBjbGFzcyBEYXRhc2V0UmRmV3JpdGVyIGV4dGVuZHMgUmRmV3JpdGVyCisgIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8RGF0YXNldFJlc291cmNlPgoreworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihEYXRhc2V0UmRmV3JpdGVyLmNsYXNzCisgICAgLmdldE5hbWUoKSk7CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRTaXplKERhdGFzZXRSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3M8Pz4gdHlwZSwKKyAgICBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oRGF0YXNldFJlc291cmNlIHJlc291cmNlLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uCisgIHsKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgIFJkZkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldENvbmZpZ3VyYXRpb24oKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgIERvY3VtZW50IGRvYyA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKworICAgICAgRWxlbWVudCByZGYgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgZG9jLCAicmRmOlJERiIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcmRmLCBSREZfTkFNRVNQQUNFX05BTUUsIFJERl9OQU1FU1BBQ0VfVkFMVUUpOworCisgICAgICBpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKQorICAgICAgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVzcGFjZU1hcCA9IGNvbmZpZ3VyYXRpb24uZ2V0TmFtZXNwYWNlcygpOworICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG5hbWVzcGFjZU1hcC5lbnRyeVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcmRmLCAieG1sbnM6IiArIGVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcmRmLCBDQVNfTkFNRVNQQUNFX05BTUUsCisgICAgICAgICAgQ0FTX05BTUVTUEFDRV9WQUxVRSk7CisgICAgICB9CisKKyAgICAgIGZvciAoUHJvZHVjdFJlc291cmNlIHByb2R1Y3RSZXNvdXJjZSA6IHJlc291cmNlLmdldFByb2R1Y3RSZXNvdXJjZXMoKSkKKyAgICAgIHsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSA9IHByb2R1Y3RSZXNvdXJjZS5nZXRQcm9kdWN0VHlwZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IHByb2R1Y3RSZXNvdXJjZS5nZXRQcm9kdWN0SWQoKTsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3ROcyA9IGNvbmZpZ3VyYXRpb24gIT0gbnVsbAorICAgICAgICAgID8gY29uZmlndXJhdGlvbi5nZXRUeXBlTmFtZXNwYWNlKHByb2R1Y3RUeXBlTmFtZSkKKyAgICAgICAgICA6IENBU19OQU1FU1BBQ0VfUFJFRklYOworICAgICAgICBFbGVtZW50IHByb2R1Y3RSZGYgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgcmRmLAorICAgICAgICAgIHByb2R1Y3ROcyArICI6IiArIHByb2R1Y3RUeXBlTmFtZSk7CisKKyAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcHJvZHVjdFJkZiwgInJkZjphYm91dCIsCisgICAgICAgICAgZ2V0QmFzZVVyaSgpICsgInByb2R1Y3Q/cHJvZHVjdElkPSIgKyBwcm9kdWN0SWQpOworCisgICAgICAgIGlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICBNZXRhZGF0YVJlc291cmNlIG1ldGFkYXRhUmVzb3VyY2UgPSBwcm9kdWN0UmVzb3VyY2UKKyAgICAgICAgICAgIC5nZXRNZXRhZGF0YVJlc291cmNlKCk7CisgICAgICAgICAgZm9yIChNZXRhZGF0YUVudHJ5IGVudHJ5IDogbWV0YWRhdGFSZXNvdXJjZS5nZXRNZXRhZGF0YUVudHJpZXMoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGVudHJ5LmdldFZhbHVlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBFbGVtZW50IG1ldGFFbGVtZW50ID0gY29uZmlndXJhdGlvbi5jcmVhdGVFbGVtZW50KGVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgIHZhbHVlLCBkb2MpOworICAgICAgICAgICAgICBwcm9kdWN0UmRmLmFwcGVuZENoaWxkKG1ldGFFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFhNTFV0aWxzLndyaXRlWG1sVG9TdHJlYW0oZG9jLCBlbnRpdHlTdHJlYW0pOworICAgIH0KKyAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBidWlsZCBvcmcudzNjLmRvbS5Eb2N1bWVudCBmb3Igb3V0cHV0LiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIG1lc3NhZ2UsIGUpOworICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9EYXRhc2V0UnNzV3JpdGVyLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9EYXRhc2V0UnNzV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiNDg4OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL0RhdGFzZXRSc3NXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMud3JpdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5jb25maWd1cmF0aW9ucy5Sc3NDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5jb25maWd1cmF0aW9ucy5Sc3NOYW1lc3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLkRhdGFzZXRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlByb2R1Y3RSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEEge0BsaW5rIFByb3ZpZGVyfSB0aGF0IHdyaXRlcyB7QGxpbmsgRGF0YXNldFJlc291cmNlIGRhdGFzZXQgcmVzb3VyY2VzfSB0bworICogb3V0cHV0IHN0cmVhbXMgZm9yIEhUVFAgcmVzcG9uc2VzIHdpdGggImFwcGxpY2F0aW9uL3Jzcyt4bWwiIGNvbnRlbnQtdHlwZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Jzcyt4bWwiKQorcHVibGljIGNsYXNzIERhdGFzZXRSc3NXcml0ZXIgZXh0ZW5kcyBSc3NXcml0ZXIKKyAgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxEYXRhc2V0UmVzb3VyY2U+Cit7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKERhdGFzZXRSc3NXcml0ZXIuY2xhc3MKKyAgICAuZ2V0TmFtZSgpKTsKKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldFNpemUoRGF0YXNldFJlc291cmNlIHJlc291cmNlLCBDbGFzczw/PiB0eXBlLAorICAgIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpCisgIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVUbyhEYXRhc2V0UmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24KKyAgeworICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisgICAgU3RyaW5nIHByb2R1Y3RUeXBlSWQgPSByZXNvdXJjZS5nZXRJZCgpOworICAgIFN0cmluZyBiYXNlID0gZ2V0QmFzZVVyaSgpICsgImRhdGFzZXQiOworICAgIFN0cmluZyBxdWVyeSA9ICI/cHJvZHVjdFR5cGVJZD0iICsgcHJvZHVjdFR5cGVJZDsKKyAgICBTdHJpbmcgaWRMaW5rID0gYmFzZSArIHF1ZXJ5OworICAgIFN0cmluZyBzZWxmTGluayA9IGJhc2UgKyAiLnJzcyIgKyBxdWVyeTsKKyAgICBTdHJpbmcgY3VycmVudERhdGUgPSBkYXRlRm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKTsKKworICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgUnNzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0Q29uZmlndXJhdGlvbigpOworCisgICAgdHJ5CisgICAgeworICAgICAgRG9jdW1lbnQgZG9jID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgRWxlbWVudCByc3MgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgZG9jLCAicnNzIik7CisgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByc3MsICJ2ZXJzaW9uIiwgIjIuMCIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcnNzLCAieG1sbnM6YXRvbSIsCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iKTsKKworICAgICAgaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgLy8gQWRkIG5hbWVzcGFjZXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAgICBmb3IgKFJzc05hbWVzcGFjZSBuYW1lc3BhY2UgOiBjb25maWd1cmF0aW9uLmdldE5hbWVzcGFjZUxpc3QoKSkKKyAgICAgICAgeworICAgICAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJzcywgInhtbG5zOiIgKyBuYW1lc3BhY2UuZ2V0UHJlZml4KCksCisgICAgICAgICAgICBuYW1lc3BhY2UuZ2V0VXJpU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IGNoYW5uZWwgbGluayBpbmZvcm1hdGlvbiwgaWYgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAgICBTdHJpbmcgY2hhbm5lbExpbmsgPSBjb25maWd1cmF0aW9uLmdldENoYW5uZWxMaW5rKCk7CisgICAgICAgIGlmIChjaGFubmVsTGluayAhPSBudWxsICYmICFjaGFubmVsTGluay5lcXVhbHMoIiIpKQorICAgICAgICB7CisgICAgICAgICAgTWV0YWRhdGEgY2hhbm5lbE1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgICAgY2hhbm5lbE1ldGFkYXRhLmFkZE1ldGFkYXRhKCJQcm9kdWN0VHlwZSIsIHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgICAgY2hhbm5lbE1ldGFkYXRhLmFkZE1ldGFkYXRhKCJQcm9kdWN0VHlwZUlkIiwgcHJvZHVjdFR5cGVJZCk7CisgICAgICAgICAgY2hhbm5lbE1ldGFkYXRhLmFkZE1ldGFkYXRhKCJCYXNlVXJsIiwgYmFzZSk7CisKKyAgICAgICAgICBpZExpbmsgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjaGFubmVsTGluaywgY2hhbm5lbE1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBFbGVtZW50IGNoYW5uZWwgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgcnNzLCAiY2hhbm5lbCIpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJ0aXRsZSIsIHByb2R1Y3RUeXBlTmFtZSk7CisKKyAgICAgIEVsZW1lbnQgYXRvbUxpbmsgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImF0b206bGluayIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJocmVmIiwgc2VsZkxpbmspOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJyZWwiLCAic2VsZiIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJ0eXBlIiwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKTsKKworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsaW5rIiwgaWRMaW5rKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiZGVzY3JpcHRpb24iLCBwcm9kdWN0VHlwZU5hbWUpOworCisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImxhbmd1YWdlIiwgTEFOR1VBR0UpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJjb3B5cmlnaHQiLCBDT1BZUklHSFQpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJwdWJEYXRlIiwgY3VycmVudERhdGUpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJjYXRlZ29yeSIsIHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImdlbmVyYXRvciIsIEdFTkVSQVRPUik7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImxhc3RCdWlsZERhdGUiLCBjdXJyZW50RGF0ZSk7CisKKyAgICAgIGZvciAoUHJvZHVjdFJlc291cmNlIHByb2R1Y3RSZXNvdXJjZSA6IHJlc291cmNlLmdldFByb2R1Y3RSZXNvdXJjZXMoKSkKKyAgICAgIHsKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RMaW5rID0gZ2V0QmFzZVVyaSgpICsgInByb2R1Y3Q/cHJvZHVjdElkPSIKKyAgICAgICAgICArIHByb2R1Y3RSZXNvdXJjZS5nZXRQcm9kdWN0SWQoKTsKKyAgICAgICAgRWxlbWVudCBpdGVtID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJpdGVtIik7CisgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAidGl0bGUiLCBwcm9kdWN0UmVzb3VyY2UuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAibGluayIsIHByb2R1Y3RMaW5rKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJkZXNjcmlwdGlvbiIsIHByb2R1Y3RSZXNvdXJjZQorICAgICAgICAgIC5nZXRQcm9kdWN0VHlwZU5hbWUoKSk7CisgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAiZ3VpZCIsIHByb2R1Y3RMaW5rKTsKKworICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IHByb2R1Y3RSZXNvdXJjZS5nZXRNZXRhZGF0YVJlc291cmNlKCkuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgRGF0ZSBwcm9kdWN0UmVjZWl2ZWRUaW1lID0gRGF0ZUNvbnZlcnQuaXNvUGFyc2UobWV0YWRhdGEKKyAgICAgICAgICAuZ2V0TWV0YWRhdGEoIkNBUy5Qcm9kdWN0UmVjZWl2ZWRUaW1lIikpOworICAgICAgICBpZiAocHJvZHVjdFJlY2VpdmVkVGltZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJwdWJEYXRlIiwgZGF0ZUZvcm1hdHRlcgorICAgICAgICAgICAgLmZvcm1hdChwcm9kdWN0UmVjZWl2ZWRUaW1lKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBlbmQgYWRkaXRpb25hbCB0YWdzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgIGNvbmZpZ3VyYXRpb24uYXBwZW5kVGFncyhtZXRhZGF0YSwgZG9jLCBpdGVtKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKGRvYywgZW50aXR5U3RyZWFtKTsKKyAgICB9CisgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gY3JlYXRlIFJTUyBYTUwgZG9jdW1lbnQgZm9yIFJTUyByZXNwb25zZS4iOworICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBtZXNzYWdlLCBlKTsKKyAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKyAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gY3JlYXRlIFJTUyBYTUwgZG9jdW1lbnQgZm9yIFJTUyByZXNwb25zZS4iOworICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBtZXNzYWdlLCBlKTsKKyAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvRGF0YXNldFppcFdyaXRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvRGF0YXNldFppcFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDZhYmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9EYXRhc2V0WmlwV3JpdGVyLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMud3JpdGVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuRGF0YXNldFJlc291cmNlOworCisvKioKKyAqIEEge0BsaW5rIFByb3ZpZGVyfSB0aGF0IHdyaXRlcyB7QGxpbmsgRGF0YXNldFJlc291cmNlIGRhdGFzZXQgcmVzb3VyY2VzfSB0bworICogb3V0cHV0IHN0cmVhbXMgZm9yIEhUVFAgcmVzcG9uc2VzIHdpdGggImFwcGxpY2F0aW9uL3ppcCIgY29udGVudC10eXBlLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitAUHJvdmlkZXIKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vemlwIikKK3B1YmxpYyBjbGFzcyBEYXRhc2V0WmlwV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8RGF0YXNldFJlc291cmNlPgoreworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0U2l6ZShEYXRhc2V0UmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgeworICAgIHJldHVybiB0cnVlOworICB9CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVRvKERhdGFzZXRSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICB7CisgICAgLy8gQ3JlYXRlIGEgemlwIGZpbGUgZm9yIHRoZSBkYXRhc2V0IHJlc291cmNlLgorICAgIEZpbGUgemlwRmlsZSA9IG5ldyBEYXRhc2V0WmlwcGVyKCkuY3JlYXRlWmlwRmlsZShyZXNvdXJjZSk7CisKKyAgICAvLyBBZGQgdGhlIHppcCBmaWxlIHRvIHRoZSBIVFRQIHJlc3BvbnNlIGVudGl0eSBzdHJlYW0uCisgICAgaHR0cEhlYWRlcnMuYWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vemlwIik7CisgICAgaHR0cEhlYWRlcnMuYWRkKCJDb250ZW50LURpc3Bvc2l0aW9uIiwKKyAgICAgICJhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIgKyB6aXBGaWxlLmdldE5hbWUoKSArICJcIiIpOworICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOworICAgIElPVXRpbHMuY29weShmaXMsIGVudGl0eVN0cmVhbSk7CisgICAgZmlzLmNsb3NlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL0RhdGFzZXRaaXBwZXIuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL0RhdGFzZXRaaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDY2OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvRGF0YXNldFppcHBlci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBuZXQubGluZ2FsYS56aXA0ai5jb3JlLlppcEZpbGU7CitpbXBvcnQgbmV0LmxpbmdhbGEuemlwNGouZXhjZXB0aW9uLlppcEV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQubGluZ2FsYS56aXA0ai5tb2RlbC5aaXBQYXJhbWV0ZXJzOworaW1wb3J0IG5ldC5saW5nYWxhLnppcDRqLnV0aWwuWmlwNGpDb25zdGFudHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuU2VyaWFsaXphYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLkRhdGFzZXRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLk1ldGFkYXRhUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlcy5Qcm9kdWN0UmVzb3VyY2U7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IHppcHMgdXAgYSB7QGxpbmsgRGF0YXNldFJlc291cmNlfSwgaW5jbHVkaW5nIHRoZSBkYXRhc2V0J3MKKyAqIHByb2R1Y3RzIGFuZCBtZXRhZGF0YS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERhdGFzZXRaaXBwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRGF0YXNldFppcHBlci5jbGFzcworICAgIC5nZXROYW1lKCkpOworCisgIHByaXZhdGUgUHJvZHVjdFppcHBlciBwcm9kdWN0WmlwcGVyID0gbmV3IFByb2R1Y3RaaXBwZXIoKTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIHppcCBhcmNoaXZlIG9mIHRoZSBzdXBwbGllZCB7QGxpbmsgRGF0YXNldFJlc291cmNlIGRhdGFzZXQKKyAgICogcmVzb3VyY2V9IGluY2x1ZGluZyBhbGwgb2YgdGhlIGRhdGFzZXQncyBwcm9kdWN0cyBhbmQgbWV0YWRhdGEuCisgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgZGF0YXNldCByZXNvdXJjZSB0byBhcmNoaXZlCisgICAqIEByZXR1cm4gdGhlIGZpbGUgcmVmZXJlbmNlIGZvciB0aGUgemlwIGFyY2hpdmUgb2YgdGhlIGRhdGFzZXQgcmVzb3VyY2UKKyAgICovCisgIHB1YmxpYyBGaWxlIGNyZWF0ZVppcEZpbGUoRGF0YXNldFJlc291cmNlIHJlc291cmNlKQorICB7CisgICAgdHJ5CisgICAgeworICAgICAgLy8gQ3JlYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCisgICAgICBGaWxlIHdvcmtpbmdEaXIgPSByZXNvdXJjZS5nZXRXb3JraW5nRGlyKCk7CisgICAgICBpZiAoIXdvcmtpbmdEaXIuZXhpc3RzKCkgJiYgIXdvcmtpbmdEaXIubWtkaXJzKCkpCisgICAgICB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBjcmVhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5ICgiCisgICAgICAgICAgKyB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpICsgIikgdG8gYnVpbGQgdGhlIHppcCBmaWxlLiI7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSk7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgLy8gVHJ5IHRvIHJlbW92ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCB6aXAgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyLmdldENhbm9uaWNhbFBhdGgoKSArICIvIgorICAgICAgICArIHJlc291cmNlLmdldE5hbWUoKSArICIuemlwIik7CisgICAgICBpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5kZWxldGUoKSkKKyAgICAgIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGRlbGV0ZSBhbiBleGlzdGluZyB6aXAgZmlsZSAoIgorICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICsgIikgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IHppcCBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZS4iOworICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UpOworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24obWVzc2FnZSk7CisgICAgICB9CisKKyAgICAgIC8vIFNldCB1cCB0aGUgemlwIGZpbGUgZm9yIHRoZSBkYXRhc2V0LgorICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICBaaXBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgWmlwUGFyYW1ldGVycygpOworICAgICAgcGFyYW1ldGVycy5zZXRDb21wcmVzc2lvbk1ldGhvZChaaXA0akNvbnN0YW50cy5DT01QX0RFRkxBVEUpOworICAgICAgcGFyYW1ldGVycy5zZXRDb21wcmVzc2lvbkxldmVsKFppcDRqQ29uc3RhbnRzLkRFRkxBVEVfTEVWRUxfTk9STUFMKTsKKworICAgICAgLy8gQ3JlYXRlIHppcCBhcmNoaXZlcyBmb3IgZWFjaCBwcm9kdWN0IGFuZCBhZGQgdGhlbSB0byB0aGUgZGF0YXNldCB6aXAuCisgICAgICBmb3IgKFByb2R1Y3RSZXNvdXJjZSBwcm9kdWN0UmVzb3VyY2UgOiByZXNvdXJjZS5nZXRQcm9kdWN0UmVzb3VyY2VzKCkpCisgICAgICB7CisgICAgICAgIEZpbGUgcmVmRmlsZSA9IHByb2R1Y3RaaXBwZXIuY3JlYXRlWmlwRmlsZShwcm9kdWN0UmVzb3VyY2UpOworICAgICAgICB6aXBGaWxlLmFkZEZpbGUocmVmRmlsZSwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChyZWZGaWxlLmV4aXN0cygpICYmICFyZWZGaWxlLmRlbGV0ZSgpKQorICAgICAgICB7CisgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGRlbGV0ZSBhIHRlbXBvcmFyeSBwcm9kdWN0IHppcCAoIgorICAgICAgICAgICAgKyByZWZGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICArICIpIGFmdGVyIGFkZGluZyBpdCB0byB0aGUgZGF0YXNldCB6aXAuIjsKKyAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UpOworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBBZGQgdGhlIGRhdGFzZXQncyBtZXRhZGF0YSB0byB0aGUgemlwLgorICAgICAgTWV0YWRhdGFSZXNvdXJjZSBtZXRhZGF0YVJlc291cmNlID0gcmVzb3VyY2UuZ2V0TWV0YWRhdGFSZXNvdXJjZSgpOworICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBtZXRhZGF0YVJlc291cmNlLmdldE1ldGFkYXRhKCk7CisKKyAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIFNlcmlhbGl6YWJsZU1ldGFkYXRhIHNlck1ldGFkYXRhID0gbmV3IFNlcmlhbGl6YWJsZU1ldGFkYXRhKG1ldGFkYXRhKTsKKyAgICAgIHNlck1ldGFkYXRhLndyaXRlTWV0YWRhdGFUb1htbFN0cmVhbShvcyk7CisgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgIHBhcmFtZXRlcnMuc2V0RmlsZU5hbWVJblppcChyZXNvdXJjZS5nZXROYW1lKCkgKyAiLm1ldCIpOworICAgICAgcGFyYW1ldGVycy5zZXRTb3VyY2VFeHRlcm5hbFN0cmVhbSh0cnVlKTsKKyAgICAgIHppcEZpbGUuYWRkU3RyZWFtKGJpcywgcGFyYW1ldGVycyk7CisKKyAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIGNhdGNoIChaaXBFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gY3JlYXRlIGEgemlwIGFyY2hpdmUgb2YgdGhlIGRhdGFzZXQuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFbmNvdW50ZXJlZCBJL08gcHJvYmxlbXMgd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBhIHppcCAiCisgICAgICAgICsgImFyY2hpdmUgb2YgdGhlIGRhdGFzZXQuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUHJvZHVjdFJzc1dyaXRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUHJvZHVjdFJzc1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmViZTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9Qcm9kdWN0UnNzV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLndyaXRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlByb2R1Y3RSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlJlZmVyZW5jZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEEge0BsaW5rIFByb3ZpZGVyfSB0aGF0IHdyaXRlcyB7QGxpbmsgUHJvZHVjdFJlc291cmNlIHByb2R1Y3QgcmVzb3VyY2VzfSB0bworICogb3V0cHV0IHN0cmVhbXMgZm9yIEhUVFAgcmVzcG9uc2VzIHdpdGggImFwcGxpY2F0aW9uL3Jzcyt4bWwiIGNvbnRlbnQtdHlwZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Jzcyt4bWwiKQorcHVibGljIGNsYXNzIFByb2R1Y3RSc3NXcml0ZXIgZXh0ZW5kcyBSc3NXcml0ZXIKKyAgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxQcm9kdWN0UmVzb3VyY2U+Cit7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb2R1Y3RSc3NXcml0ZXIuY2xhc3MKKyAgICAuZ2V0TmFtZSgpKTsKKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldFNpemUoUHJvZHVjdFJlc291cmNlIHJlc291cmNlLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpCisgIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVUbyhQcm9kdWN0UmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uCisgIHsKKyAgICB0cnkKKyAgICB7CisgICAgICBTdHJpbmcgcHJvZHVjdE5hbWUgPSByZXNvdXJjZS5nZXRQcm9kdWN0TmFtZSgpOworICAgICAgU3RyaW5nIHByb2R1Y3RJZCA9IHJlc291cmNlLmdldFByb2R1Y3RJZCgpOworICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSA9IHJlc291cmNlLmdldFByb2R1Y3RUeXBlTmFtZSgpOworCisgICAgICBTdHJpbmcgYmFzZSA9IGdldEJhc2VVcmkoKSArICJwcm9kdWN0IjsKKyAgICAgIFN0cmluZyBxdWVyeSA9ICI/cHJvZHVjdElkPSIgKyBwcm9kdWN0SWQ7CisgICAgICBTdHJpbmcgaWRMaW5rID0gYmFzZSArIHF1ZXJ5OworICAgICAgU3RyaW5nIHNlbGZMaW5rID0gYmFzZSArICIucnNzIiArIHF1ZXJ5OworICAgICAgU3RyaW5nIGN1cnJlbnREYXRlID0gZGF0ZUZvcm1hdHRlci5mb3JtYXQobmV3IERhdGUoKSk7CisKKyAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICBEb2N1bWVudCBkb2MgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7CisgICAgICBFbGVtZW50IHJzcyA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBkb2MsICJyc3MiKTsKKyAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJzcywgInZlcnNpb24iLCAiMi4wIik7CisgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByc3MsICJ4bWxuczphdG9tIiwKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIpOworCisgICAgICBFbGVtZW50IGNoYW5uZWwgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgcnNzLCAiY2hhbm5lbCIpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJ0aXRsZSIsIHByb2R1Y3ROYW1lKTsKKworICAgICAgRWxlbWVudCBhdG9tTGluayA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiYXRvbTpsaW5rIik7CisgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCBhdG9tTGluaywgImhyZWYiLCBzZWxmTGluayk7CisgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCBhdG9tTGluaywgInJlbCIsICJzZWxmIik7CisgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCBhdG9tTGluaywgInR5cGUiLCAiYXBwbGljYXRpb24vcnNzK3htbCIpOworCisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImxpbmsiLCBpZExpbmspOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJkZXNjcmlwdGlvbiIsIHByb2R1Y3RUeXBlTmFtZSk7CisKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAibGFuZ3VhZ2UiLCBMQU5HVUFHRSk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImNvcHlyaWdodCIsIENPUFlSSUdIVCk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgInB1YkRhdGUiLCBjdXJyZW50RGF0ZSk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImNhdGVnb3J5IiwgcHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiZ2VuZXJhdG9yIiwgR0VORVJBVE9SKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAibGFzdEJ1aWxkRGF0ZSIsIGN1cnJlbnREYXRlKTsKKworICAgICAgZm9yIChSZWZlcmVuY2VSZXNvdXJjZSByZWZlcmVuY2VSZXNvdXJjZSA6IHJlc291cmNlCisgICAgICAgIC5nZXRSZWZlcmVuY2VSZXNvdXJjZXMoKSkKKyAgICAgIHsKKyAgICAgICAgaW50IHJlZkluZGV4ID0gcmVmZXJlbmNlUmVzb3VyY2UuZ2V0UmVmSW5kZXgoKTsKKyAgICAgICAgU3RyaW5nIHJlZmVyZW5jZUJhc2UgPSBnZXRCYXNlVXJpKCkgKyAicmVmZXJlbmNlIjsKKyAgICAgICAgU3RyaW5nIHJlZmVyZW5jZVF1ZXJ5ID0gIj9wcm9kdWN0SWQ9IiArIHByb2R1Y3RJZCArICImcmVmSW5kZXg9IgorICAgICAgICAgICsgcmVmSW5kZXg7CisgICAgICAgIFN0cmluZyByZWZlcmVuY2VMaW5rID0gcmVmZXJlbmNlQmFzZSArICIuZmlsZSIgKyByZWZlcmVuY2VRdWVyeTsKKyAgICAgICAgU3RyaW5nIHJlZmVyZW5jZUlkTGluayA9IHJlZmVyZW5jZUJhc2UgKyByZWZlcmVuY2VRdWVyeTsKKworICAgICAgICBFbGVtZW50IGl0ZW0gPSBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgIml0ZW0iKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJ0aXRsZSIsICJyZWZlcmVuY2UgKCIgKyByZWZJbmRleCArICIpIik7CisgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAibGluayIsIHJlZmVyZW5jZUxpbmspOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgaXRlbSwgImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAiQSBmaWxlIG1hbmFnZXIgcmVmZXJlbmNlIGVudGl0eSIpOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgaXRlbSwgImd1aWQiLCByZWZlcmVuY2VJZExpbmspOworICAgICAgfQorCisgICAgICBYTUxVdGlscy53cml0ZVhtbFRvU3RyZWFtKGRvYywgZW50aXR5U3RyZWFtKTsKKyAgICB9CisgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gY3JlYXRlIFJTUyBYTUwgZG9jdW1lbnQgZm9yIFJTUyByZXNwb25zZS4iOworICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBtZXNzYWdlLCBlKTsKKyAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUHJvZHVjdFppcFdyaXRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUHJvZHVjdFppcFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9Qcm9kdWN0WmlwV3JpdGVyLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMud3JpdGVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuUHJvZHVjdFJlc291cmNlOworCisvKioKKyAqIEEge0BsaW5rIFByb3ZpZGVyfSB0aGF0IHdyaXRlcyB7QGxpbmsgUHJvZHVjdFJlc291cmNlIHByb2R1Y3QgcmVzb3VyY2VzfSB0bworICogb3V0cHV0IHN0cmVhbXMgZm9yIEhUVFAgcmVzcG9uc2VzIHdpdGggImFwcGxpY2F0aW9uL3ppcCIgY29udGVudC10eXBlLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitAUHJvdmlkZXIKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vemlwIikKK3B1YmxpYyBjbGFzcyBQcm9kdWN0WmlwV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8UHJvZHVjdFJlc291cmNlPgoreworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0U2l6ZShQcm9kdWN0UmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgeworICAgIHJldHVybiB0cnVlOworICB9CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVRvKFByb2R1Y3RSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICB7CisgICAgLy8gQ3JlYXRlIGEgemlwIGZpbGUgZm9yIHRoZSBwcm9kdWN0IHJlc291cmNlLgorICAgIEZpbGUgemlwRmlsZSA9IG5ldyBQcm9kdWN0WmlwcGVyKCkuY3JlYXRlWmlwRmlsZShyZXNvdXJjZSk7CisKKyAgICAvLyBBZGQgdGhlIHppcCBmaWxlIHRvIHRoZSBIVFRQIHJlc3BvbnNlIGVudGl0eSBzdHJlYW0uCisgICAgaHR0cEhlYWRlcnMuYWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vemlwIik7CisgICAgaHR0cEhlYWRlcnMuYWRkKCJDb250ZW50LURpc3Bvc2l0aW9uIiwKKyAgICAgICJhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIgKyB6aXBGaWxlLmdldE5hbWUoKSArICJcIiIpOworICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOworICAgIElPVXRpbHMuY29weShmaXMsIGVudGl0eVN0cmVhbSk7CisgICAgZmlzLmNsb3NlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1Byb2R1Y3RaaXBwZXIuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1Byb2R1Y3RaaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQwMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUHJvZHVjdFppcHBlci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG5ldC5saW5nYWxhLnppcDRqLmNvcmUuWmlwRmlsZTsKK2ltcG9ydCBuZXQubGluZ2FsYS56aXA0ai5leGNlcHRpb24uWmlwRXhjZXB0aW9uOworaW1wb3J0IG5ldC5saW5nYWxhLnppcDRqLm1vZGVsLlppcFBhcmFtZXRlcnM7CitpbXBvcnQgbmV0LmxpbmdhbGEuemlwNGoudXRpbC5aaXA0akNvbnN0YW50czsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuU2VyaWFsaXphYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9ucy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLk1ldGFkYXRhUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlcy5Qcm9kdWN0UmVzb3VyY2U7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IHppcHMgdXAgYSB7QGxpbmsgUHJvZHVjdFJlc291cmNlfSwgaW5jbHVkaW5nIHRoZSBwcm9kdWN0J3MKKyAqIHJlZmVyZW5jZXMgYW5kIG1ldGFkYXRhLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjdFppcHBlcgoreworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihQcm9kdWN0WmlwcGVyLmNsYXNzCisgICAgLmdldE5hbWUoKSk7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSB6aXAgYXJjaGl2ZSBvZiB0aGUgc3VwcGxpZWQge0BsaW5rIFByb2R1Y3RSZXNvdXJjZSBwcm9kdWN0CisgICAqIHJlc291cmNlfSBpbmNsdWRpbmcgYWxsIG9mIHRoZSBwcm9kdWN0J3MgcmVmZXJlbmNlcyBhbmQgbWV0YWRhdGEuCisgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcHJvZHVjdCByZXNvdXJjZSB0byBhcmNoaXZlCisgICAqIEByZXR1cm4gdGhlIGZpbGUgcmVmZXJlbmNlIGZvciB0aGUgemlwIGFyY2hpdmUgb2YgdGhlIHByb2R1Y3QgcmVzb3VyY2UKKyAgICovCisgIHB1YmxpYyBGaWxlIGNyZWF0ZVppcEZpbGUoUHJvZHVjdFJlc291cmNlIHJlc291cmNlKQorICB7CisgICAgdHJ5CisgICAgeworICAgICAgLy8gQ3JlYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCisgICAgICBGaWxlIHdvcmtpbmdEaXIgPSByZXNvdXJjZS5nZXRXb3JraW5nRGlyKCk7CisgICAgICBpZiAoIXdvcmtpbmdEaXIuZXhpc3RzKCkgJiYgIXdvcmtpbmdEaXIubWtkaXJzKCkpCisgICAgICB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byBjcmVhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5ICgiCisgICAgICAgICAgKyB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpICsgIikgdG8gYnVpbGQgdGhlIHppcCBmaWxlLiI7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSk7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgLy8gVHJ5IHRvIHJlbW92ZSBwcmV2aW91c2x5IGNyZWF0ZWQgemlwIGZpbGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod29ya2luZ0Rpci5nZXRDYW5vbmljYWxQYXRoKCkgKyAiLyIKKyAgICAgICAgKyByZXNvdXJjZS5nZXRQcm9kdWN0TmFtZSgpICsgIi56aXAiKTsKKyAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmICFmaWxlLmRlbGV0ZSgpKQorICAgICAgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIHppcCBmaWxlICgiCisgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgKyAiKSBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgemlwIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lLiI7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSk7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgLy8gU2V0IHVwIHRoZSB6aXAgZmlsZS4KKyAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOworICAgICAgWmlwUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IFppcFBhcmFtZXRlcnMoKTsKKyAgICAgIHBhcmFtZXRlcnMuc2V0Q29tcHJlc3Npb25NZXRob2QoWmlwNGpDb25zdGFudHMuQ09NUF9ERUZMQVRFKTsKKyAgICAgIHBhcmFtZXRlcnMuc2V0Q29tcHJlc3Npb25MZXZlbChaaXA0akNvbnN0YW50cy5ERUZMQVRFX0xFVkVMX05PUk1BTCk7CisKKyAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIHByb2R1Y3QncyByZWZlcmVuY2VzIHRvIHRoZSB6aXAgZmlsZS4KKyAgICAgIC8vIEFzc3VtZXMgdGhhdCBmb3IgaGllcmFyY2hpY2FsIHByb2R1Y3RzLCB0aGUgZmlyc3QgcmVmZXJlbmNlIGlzIHRoZSByb290CisgICAgICAvLyBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMgYXJlIGluY2x1ZGVkIGluIHRoZSBwcm9kdWN0LgorICAgICAgTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZXMgPSByZXNvdXJjZS5nZXRQcm9kdWN0UmVmZXJlbmNlcygpOworICAgICAgUmVmZXJlbmNlIHJvb3RSZWZlcmVuY2UgPSByZWZlcmVuY2VzLmdldCgwKTsKKyAgICAgIEZpbGUgcm9vdEZpbGUgPSBuZXcgRmlsZShuZXcgVVJJKHJvb3RSZWZlcmVuY2UuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKTsKKyAgICAgIGlmIChyb290RmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgeworICAgICAgICAvLyBBZGQgdGhlIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50cy4KKyAgICAgICAgemlwRmlsZS5hZGRGb2xkZXIocm9vdEZpbGUsIHBhcmFtZXRlcnMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBBZGQgZWFjaCBmaWxlIGluIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMuCisgICAgICAgIGZvciAoUmVmZXJlbmNlIHJlZmVyZW5jZSA6IHJlZmVyZW5jZXMpCisgICAgICAgIHsKKyAgICAgICAgICB6aXBGaWxlLmFkZEZpbGUobmV3IEZpbGUobmV3IFVSSShyZWZlcmVuY2UuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKSwKKyAgICAgICAgICAgIHBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEFkZCB0aGUgcHJvZHVjdCdzIG1ldGFkYXRhIHRvIHRoZSB6aXAgZmlsZS4KKyAgICAgIE1ldGFkYXRhUmVzb3VyY2UgbWV0YWRhdGFSZXNvdXJjZSA9IHJlc291cmNlLmdldE1ldGFkYXRhUmVzb3VyY2UoKTsKKyAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbWV0YWRhdGFSZXNvdXJjZS5nZXRNZXRhZGF0YSgpOworCisgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBTZXJpYWxpemFibGVNZXRhZGF0YSBzZXJNZXRhZGF0YSA9IG5ldyBTZXJpYWxpemFibGVNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgICBzZXJNZXRhZGF0YS53cml0ZU1ldGFkYXRhVG9YbWxTdHJlYW0ob3MpOworICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgICBwYXJhbWV0ZXJzLnNldEZpbGVOYW1lSW5aaXAocmVzb3VyY2UuZ2V0UHJvZHVjdE5hbWUoKSArICIubWV0Iik7CisgICAgICBwYXJhbWV0ZXJzLnNldFNvdXJjZUV4dGVybmFsU3RyZWFtKHRydWUpOworICAgICAgemlwRmlsZS5hZGRTdHJlYW0oYmlzLCBwYXJhbWV0ZXJzKTsKKworICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgIlByb2JsZW0gd2l0aCB0aGUgZGF0YSBzdG9yZSBVUkkocykgZm9yIHRoZSBwcm9kdWN0J3MgcmVmZXJlbmNlKHMpLiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UsIGUpOworICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKG1lc3NhZ2UgKyAiICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIGNhdGNoIChaaXBFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gY3JlYXRlIGEgemlwIGFyY2hpdmUgb2YgdGhlIHByb2R1Y3QuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFbmNvdW50ZXJlZCBJL08gcHJvYmxlbXMgd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBhIHppcCAiCisgICAgICAgICsgImFyY2hpdmUgb2YgdGhlIHByb2R1Y3QuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUmRmV3JpdGVyLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9SZGZXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhiOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUmRmV3JpdGVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoqCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5jb25maWd1cmF0aW9ucy5SZGZDb25maWd1cmF0aW9uOworCisvKioKKyAqIENsYXNzIHdpdGggc2hhcmVkIHByb3BlcnRpZXMgYW5kIGJlaGF2aW9yIGZvciBSREYgd3JpdGVycy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJkZldyaXRlcgoreworICAvLyBUaGUgUkRGIG5hbWVzcGFjZS4KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkRGX05BTUVTUEFDRV9OQU1FID0gInhtbG5zOnJkZiI7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJERl9OQU1FU1BBQ0VfVkFMVUUgPQorICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIjsKKworICAvLyBUaGUgQ0FTIG5hbWVzcGFjZSAtIHVzZWQgYXMgYSBkZWZhdWx0IGlmIG5vIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLgorICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNfTkFNRVNQQUNFX1BSRUZJWCA9ICJjYXMiOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNfTkFNRVNQQUNFX05BTUUgPSAieG1sbnM6IgorICAgICsgQ0FTX05BTUVTUEFDRV9QUkVGSVg7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBU19OQU1FU1BBQ0VfVkFMVUUgPQorICAgICJodHRwOi8vb29kdC5hcGFjaGUub3JnL25zL2NhcyI7CisKKyAgQENvbnRleHQKKyAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisgIEBDb250ZXh0CisgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisKKworICAvKioKKyAgICogR2V0cyB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgVVJMIHVwIHRvIHRoZSBmaW5hbCAnLycgYXMgYSB7QGxpbmsgU3RyaW5nfS4KKyAgICogQHJldHVybiB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgVVJMIHVwIHRvIHRoZSBmaW5hbCAnLycgYXMgYSBTdHJpbmcKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVyaSgpCisgIHsKKyAgICBTdHJpbmcgYmFzZVVyaSA9IHVyaUluZm8uZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIGJhc2VVcmkgKz0gYmFzZVVyaS5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyI7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRoZSBzZXJ2bGV0IGNvbnRleHQsIG9yIG51bGwgaWYgbm90IGZvdW5kLgorICAgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBvYmplY3Qgb3IgbnVsbCBpZiBub3RoaW5nIHdhcyBmb3VuZAorICAgKi8KKyAgcHVibGljIFJkZkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpCisgIHsKKyAgICBTdHJpbmcgbmFtZSA9IHVyaUluZm8uZ2V0UXVlcnlQYXJhbWV0ZXJzKCkuZ2V0Rmlyc3QoImNvbmZpZ3VyYXRpb24iKTsKKworICAgIGlmIChuYW1lICE9IG51bGwgJiYgIW5hbWUudHJpbSgpLmVxdWFscygiIikpCisgICAgeworICAgICAgTWFwPFN0cmluZywgUmRmQ29uZmlndXJhdGlvbj4gbWFwID0KKyAgICAgICAgKE1hcDxTdHJpbmcsIFJkZkNvbmZpZ3VyYXRpb24+KSBjb250ZXh0CisgICAgICAgICAgLmdldEF0dHJpYnV0ZSgicmRmQ29uZmlndXJhdGlvbnMiKTsKKworICAgICAgaWYgKG1hcCAhPSBudWxsKQorICAgICAgeworICAgICAgICByZXR1cm4gbWFwLmdldChuYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUmVmZXJlbmNlRmlsZVdyaXRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUmVmZXJlbmNlRmlsZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTQ2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9SZWZlcmVuY2VGaWxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLndyaXRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9ucy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5leGNlcHRpb25zLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuUmVmZXJlbmNlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLlRpa2E7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGU7CisKKy8qKgorICogQSB7QGxpbmsgUHJvdmlkZXJ9IHRoYXQgd3JpdGVzIHtAbGluayBSZWZlcmVuY2VSZXNvdXJjZSByZWZlcmVuY2UgcmVzb3VyY2VzfQorICogdG8gb3V0cHV0IHN0cmVhbXMgZm9yIEhUVFAgcmVzcG9uc2VzIHdpdGggZGlmZmVyZW50IGZpbGUgY29udGVudC10eXBlcy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlRmlsZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFJlZmVyZW5jZVJlc291cmNlPgoreworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZWZlcmVuY2VGaWxlV3JpdGVyCisgICAgLmNsYXNzLmdldE5hbWUoKSk7CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRTaXplKFJlZmVyZW5jZVJlc291cmNlIHJlc291cmNlLCBDbGFzczw/PiB0eXBlLAorICAgIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpCisgIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVUbyhSZWZlcmVuY2VSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3M8Pz4gdHlwZSwKKyAgICBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICB7CisgICAgU3RyaW5nIGNvbnRlbnRUeXBlOworICAgIFN0cmluZyBkYXRhU3RvcmVSZWZlcmVuY2UgPSByZXNvdXJjZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKTsKKyAgICBNaW1lVHlwZSBtaW1lVHlwZSA9IHJlc291cmNlLmdldE1pbWVUeXBlKCk7CisgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYKKyAgICAgICAgbWltZVR5cGUuZ2V0TmFtZSgpICE9IG51bGwgJiYKKyAgICAgICAhbWltZVR5cGUuZ2V0TmFtZSgpLmVxdWFscygiIikpCisgICAgeworICAgICAgY29udGVudFR5cGUgPSBtaW1lVHlwZS5nZXROYW1lKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBjb250ZW50VHlwZSA9IG5ldyBUaWthKCkuZGV0ZWN0KGRhdGFTdG9yZVJlZmVyZW5jZSk7CisgICAgfQorCisgICAgdHJ5CisgICAgeworICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUobmV3IFVSSShkYXRhU3RvcmVSZWZlcmVuY2UpKTsKKyAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCBmaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAiQ291bGQgbm90IGxvY2F0ZSB0aGUgcmVmZXJlbmNlIHNvdXJjZSBmaWxlKHMpIGluIHRoZSBkYXRhIHN0b3JlLiI7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSk7CisgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgfQorCisgICAgICBodHRwSGVhZGVycy5hZGQoIkNvbnRlbnQtVHlwZSIsIGNvbnRlbnRUeXBlKTsKKyAgICAgIGh0dHBIZWFkZXJzLmFkZCgiQ29udGVudC1EaXNwb3NpdGlvbiIsCisgICAgICAgICJhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIgKyBmaWxlLmdldE5hbWUoKSArICJcIiIpOworICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICBJT1V0aWxzLmNvcHkoZmlzLCBlbnRpdHlTdHJlYW0pOworICAgICAgZmlzLmNsb3NlKCk7CisgICAgfQorICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICJQcm9ibGVtIHdpdGggdGhlIGRhdGEgc3RvcmUgVVJJIGZvciB0aGUgcmVmZXJlbmNlIHNvdXJjZSBmaWxlKHMpLiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UsIGUpOworICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKG1lc3NhZ2UgKyAiICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9SZWZlcmVuY2VSc3NXcml0ZXIuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1JlZmVyZW5jZVJzc1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDEyYTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9SZWZlcmVuY2VSc3NXcml0ZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMud3JpdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9ucy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuUmVmZXJlbmNlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQSB7QGxpbmsgUHJvdmlkZXJ9IHRoYXQgd3JpdGVzIHtAbGluayBSZWZlcmVuY2VSZXNvdXJjZSByZWZlcmVuY2UgcmVzb3VyY2VzfQorICogdG8gb3V0cHV0IHN0cmVhbXMgZm9yIEhUVFAgcmVzcG9uc2VzIHdpdGggImFwcGxpY2F0aW9uL3Jzcyt4bWwiIGNvbnRlbnQtdHlwZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Jzcyt4bWwiKQorcHVibGljIGNsYXNzIFJlZmVyZW5jZVJzc1dyaXRlciBleHRlbmRzIFJzc1dyaXRlcgorICBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFJlZmVyZW5jZVJlc291cmNlPgoreworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZWZlcmVuY2VSc3NXcml0ZXIuY2xhc3MKKyAgICAuZ2V0TmFtZSgpKTsKKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldFNpemUoUmVmZXJlbmNlUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsCisgICAgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgeworICAgIHJldHVybiB0cnVlOworICB9CisKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVRvKFJlZmVyZW5jZVJlc291cmNlIHJlc291cmNlLCBDbGFzczw/PiB0eXBlLAorICAgIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uCisgIHsKKyAgICB0cnkKKyAgICB7CisgICAgICBTdHJpbmcgcHJvZHVjdElkID0gcmVzb3VyY2UuZ2V0UHJvZHVjdElkKCk7CisgICAgICBpbnQgcmVmSW5kZXggPSByZXNvdXJjZS5nZXRSZWZJbmRleCgpOworCisgICAgICBTdHJpbmcgYmFzZSA9IGdldEJhc2VVcmkoKSArICJyZWZlcmVuY2UiOworICAgICAgU3RyaW5nIHF1ZXJ5ID0gIj9wcm9kdWN0SWQ9IiArIHByb2R1Y3RJZCArICImcmVmSW5kZXg9IiArIHJlZkluZGV4OworICAgICAgU3RyaW5nIGlkTGluayA9IGJhc2UgKyBxdWVyeTsKKyAgICAgIFN0cmluZyBmaWxlTGluayA9IGJhc2UgKyAiLmZpbGUiICsgcXVlcnk7CisgICAgICBTdHJpbmcgc2VsZkxpbmsgPSBiYXNlICsgIi5yc3MiICsgcXVlcnk7CisgICAgICBTdHJpbmcgY3VycmVudERhdGUgPSBkYXRlRm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKTsKKworICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgIERvY3VtZW50IGRvYyA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKyAgICAgIEVsZW1lbnQgcnNzID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIGRvYywgInJzcyIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcnNzLCAidmVyc2lvbiIsICIyLjAiKTsKKyAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJzcywgInhtbG5zOmF0b20iLAorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIik7CisKKyAgICAgIEVsZW1lbnQgY2hhbm5lbCA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByc3MsICJjaGFubmVsIik7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgInRpdGxlIiwgIlJlZmVyZW5jZSgiICsgcmVmSW5kZXggKworICAgICAgICAiKSBmcm9tIFByb2R1Y3QgIiArIHByb2R1Y3RJZCk7CisKKyAgICAgIEVsZW1lbnQgYXRvbUxpbmsgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImF0b206bGluayIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJocmVmIiwgc2VsZkxpbmspOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJyZWwiLCAic2VsZiIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJ0eXBlIiwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKTsKKworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsaW5rIiwgaWRMaW5rKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiZGVzY3JpcHRpb24iLCAicmVmZXJlbmNlIik7CisKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAibGFuZ3VhZ2UiLCBMQU5HVUFHRSk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImNvcHlyaWdodCIsIENPUFlSSUdIVCk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgInB1YkRhdGUiLCBjdXJyZW50RGF0ZSk7CisgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImNhdGVnb3J5IiwgIlJlZmVyZW5jZSIpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJnZW5lcmF0b3IiLCBHRU5FUkFUT1IpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsYXN0QnVpbGREYXRlIiwgY3VycmVudERhdGUpOworCisgICAgICBFbGVtZW50IGl0ZW0gPSBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgIml0ZW0iKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAidGl0bGUiLCAicmVmZXJlbmNlICgiICsgcmVmSW5kZXggKworICAgICAgICAiKSBmb3IgcHJvZHVjdCAiICsgcHJvZHVjdElkKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAibGluayIsIGZpbGVMaW5rKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAiZGVzY3JpcHRpb24iLAorICAgICAgICAiQSBmaWxlIG1hbmFnZXIgcmVmZXJlbmNlIGVudGl0eSIpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJndWlkIiwgaWRMaW5rKTsKKworICAgICAgWE1MVXRpbHMud3JpdGVYbWxUb1N0cmVhbShkb2MsIGVudGl0eVN0cmVhbSk7CisgICAgfQorICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSBSU1MgWE1MIGRvY3VtZW50IGZvciBSU1MgcmVzcG9uc2UuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1JlZmVyZW5jZVppcFdyaXRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUmVmZXJlbmNlWmlwV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjMGJkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1JlZmVyZW5jZVppcFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgbmV0LmxpbmdhbGEuemlwNGouY29yZS5aaXBGaWxlOworaW1wb3J0IG5ldC5saW5nYWxhLnppcDRqLmV4Y2VwdGlvbi5aaXBFeGNlcHRpb247CitpbXBvcnQgbmV0LmxpbmdhbGEuemlwNGoubW9kZWwuWmlwUGFyYW1ldGVyczsKK2ltcG9ydCBuZXQubGluZ2FsYS56aXA0ai51dGlsLlppcDRqQ29uc3RhbnRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5leGNlcHRpb25zLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmV4Y2VwdGlvbnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuZXhjZXB0aW9ucy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzLlJlZmVyZW5jZVJlc291cmNlOworCisvKioKKyAqIEEge0BsaW5rIFByb3ZpZGVyfSB0aGF0IHdyaXRlcyB7QGxpbmsgUmVmZXJlbmNlUmVzb3VyY2UgcmVmZXJlbmNlIHJlc291cmNlc30KKyAqIHRvIG91dHB1dCBzdHJlYW1zIGZvciBIVFRQIHJlc3BvbnNlcyB3aXRoICJhcHBsaWNhdGlvbi96aXAiIGNvbnRlbnQtdHlwZS4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3ppcCIpCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlWmlwV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8UmVmZXJlbmNlUmVzb3VyY2U+Cit7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlZmVyZW5jZVppcFdyaXRlci5jbGFzcworICAgIC5nZXROYW1lKCkpOworCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0U2l6ZShSZWZlcmVuY2VSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3M8Pz4gdHlwZSwKKyAgICBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oUmVmZXJlbmNlUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsCisgICAgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24KKyAgeworICAgIC8vIENyZWF0ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICAgIEZpbGUgd29ya2luZ0RpciA9IHJlc291cmNlLmdldFdvcmtpbmdEaXIoKTsKKyAgICBpZiAoIXdvcmtpbmdEaXIuZXhpc3RzKCkgJiYgIXdvcmtpbmdEaXIubWtkaXJzKCkpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgKCIKKyAgICAgICAgKyB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpICsgIikgdG8gYnVpbGQgdGhlIHppcCBmaWxlLiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UpOworICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorCisgICAgdHJ5CisgICAgeworICAgICAgLy8gUmV0cmlldmUgdGhlIHJlZmVyZW5jZSBmaWxlLgorICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlc291cmNlLmdldFJlZmVyZW5jZSgpOworICAgICAgRmlsZSByZWZGaWxlID0gbmV3IEZpbGUobmV3IFVSSShyZWZlcmVuY2UuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkpKTsKKyAgICAgIGlmICghcmVmRmlsZS5leGlzdHMoKSkKKyAgICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIlVuYWJsZSB0byBsb2NhdGUgdGhlIHNvdXJjZSBmaWxlIGZvciB0aGUiCisgICAgICAgICAgKyAiIHJlZmVyZW5jZS4iKTsKKyAgICAgIH0KKworICAgICAgLy8gVHJ5IHRvIHJlbW92ZSBwcmV2aW91c2x5IGNyZWF0ZWQgemlwIGZpbGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAgU3RyaW5nIHdvcmtpbmdEaXJQYXRoID0gd29ya2luZ0Rpci5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICB3b3JraW5nRGlyUGF0aCArPSB3b3JraW5nRGlyUGF0aC5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyI7CisgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyUGF0aCArIHJlZkZpbGUuZ2V0TmFtZSgpICsgIi56aXAiKTsKKyAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmICFmaWxlLmRlbGV0ZSgpKQorICAgICAgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbmFibGUgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIHppcCBmaWxlICgiCisgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgKyAiKSBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgemlwIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lLiI7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSk7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgfQorCisgICAgICAvLyBBZGQgdGhlIHJlZmVyZW5jZSBmaWxlIHRvIHRoZSB6aXAgZmlsZS4KKyAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOworICAgICAgWmlwUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IFppcFBhcmFtZXRlcnMoKTsKKyAgICAgIHBhcmFtZXRlcnMuc2V0Q29tcHJlc3Npb25NZXRob2QoWmlwNGpDb25zdGFudHMuQ09NUF9ERUZMQVRFKTsKKyAgICAgIHBhcmFtZXRlcnMuc2V0Q29tcHJlc3Npb25MZXZlbChaaXA0akNvbnN0YW50cy5ERUZMQVRFX0xFVkVMX05PUk1BTCk7CisgICAgICB6aXBGaWxlLmFkZEZpbGUocmVmRmlsZSwgcGFyYW1ldGVycyk7CisKKyAgICAgIGh0dHBIZWFkZXJzLmFkZCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3ppcCIpOworICAgICAgaHR0cEhlYWRlcnMuYWRkKCJDb250ZW50LURpc3Bvc2l0aW9uIiwKKyAgICAgICAgImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIiArIGZpbGUuZ2V0TmFtZSgpICsgIlwiIik7CisgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgIElPVXRpbHMuY29weShmaXMsIGVudGl0eVN0cmVhbSk7CisgICAgICBmaXMuY2xvc2UoKTsKKyAgICB9CisgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgIlByb2JsZW0gd2l0aCB0aGUgZGF0YSBzdG9yZSBVUkkgZm9yIHRoZSByZWZlcmVuY2Ugc291cmNlIGZpbGUocykuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgYSB6aXAgYXJjaGl2ZSBvZiB0aGUgcmVmZXJlbmNlIHNvdXJjZSBmaWxlKHMpLiI7CisgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG1lc3NhZ2UsIGUpOworICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24obWVzc2FnZSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1Jzc1dyaXRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvUnNzV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0NDljNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL1Jzc1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMud3JpdGVyczsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMuY29uZmlndXJhdGlvbnMuUnNzQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBDbGFzcyB3aXRoIHNoYXJlZCBwcm9wZXJ0aWVzIGFuZCBiZWhhdmlvciBmb3IgUlNTIHdyaXRlcnMuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSc3NXcml0ZXIKK3sKKyAgLy8gQ29uc3RhbnRzIHVzZWQgYnkgUlNTIHdyaXRlcnMuCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVCA9CisgICAgIkNvcHlyaWdodCAyMDEzOiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiI7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdVQUdFID0gImVuLXVzIjsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SID0gIkNBUyBGaWxlIE1hbmFnZXIiOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0ZPUk1BVCA9ICJFLCBkZCBNTU0geXl5eSBISDptbTpzcyBaIjsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICBEQVRFX0ZPUk1BVCk7CisKKyAgQENvbnRleHQKKyAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisgIEBDb250ZXh0CisgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisKKworICAvKioKKyAgICogR2V0cyB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgVVJMIHVwIHRvIHRoZSBmaW5hbCAnLycgYXMgYSB7QGxpbmsgU3RyaW5nfS4KKyAgICogQHJldHVybiB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgVVJMIHVwIHRvIHRoZSBmaW5hbCAnLycgYXMgYSBTdHJpbmcKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVyaSgpCisgIHsKKyAgICBTdHJpbmcgYmFzZVVyaSA9IHVyaUluZm8uZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIGJhc2VVcmkgKz0gYmFzZVVyaS5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyI7CisgIH0KKworCisKKyAgLyoqCisgICAqIEdldHMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRoZSBzZXJ2bGV0IGNvbnRleHQsIG9yIG51bGwgaWYgbm90IGZvdW5kLgorICAgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBvYmplY3Qgb3IgbnVsbCBpZiBub3RoaW5nIHdhcyBmb3VuZAorICAgKi8KKyAgcHVibGljIFJzc0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpCisgIHsKKyAgICBTdHJpbmcgbmFtZSA9IHVyaUluZm8uZ2V0UXVlcnlQYXJhbWV0ZXJzKCkuZ2V0Rmlyc3QoImNvbmZpZ3VyYXRpb24iKTsKKworICAgIGlmIChuYW1lICE9IG51bGwgJiYgIW5hbWUudHJpbSgpLmVxdWFscygiIikpCisgICAgeworICAgICAgTWFwPFN0cmluZywgUnNzQ29uZmlndXJhdGlvbj4gbWFwID0KKyAgICAgICAgKE1hcDxTdHJpbmcsIFJzc0NvbmZpZ3VyYXRpb24+KSBjb250ZXh0CisgICAgICAgICAgLmdldEF0dHJpYnV0ZSgicnNzQ29uZmlndXJhdGlvbnMiKTsKKworICAgICAgaWYgKG1hcCAhPSBudWxsKQorICAgICAgeworICAgICAgICByZXR1cm4gbWFwLmdldChuYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvVHJhbnNmZXJzUnNzV3JpdGVyLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvd3JpdGVycy9UcmFuc2ZlcnNSc3NXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDBkZGVlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvVHJhbnNmZXJzUnNzV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLndyaXRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5leGNlcHRpb25zLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlcy5UcmFuc2ZlclJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXMuVHJhbnNmZXJzUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBBIHtAbGluayBQcm92aWRlcn0gdGhhdCB3cml0ZXMge0BsaW5rIFRyYW5zZmVyc1Jlc291cmNlIHRyYW5zZmVycyByZXNvdXJjZXN9CisgKiB0byBvdXRwdXQgc3RyZWFtcyBmb3IgSFRUUCByZXNwb25zZXMgd2l0aCAiYXBwbGljYXRpb24vcnNzK3htbCIgY29udGVudC10eXBlLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitAUHJvdmlkZXIKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vcnNzK3htbCIpCitwdWJsaWMgY2xhc3MgVHJhbnNmZXJzUnNzV3JpdGVyIGV4dGVuZHMgUnNzV3JpdGVyCisgIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8VHJhbnNmZXJzUmVzb3VyY2U+Cit7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRyYW5zZmVyc1Jzc1dyaXRlci5jbGFzcworICAgIC5nZXROYW1lKCkpOworCisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0U2l6ZShUcmFuc2ZlcnNSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3M8Pz4gdHlwZSwKKyAgICBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oVHJhbnNmZXJzUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IHR5cGUsCisgICAgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24KKyAgeworICAgIHRyeQorICAgIHsKKyAgICAgIFN0cmluZyBiYXNlID0gZ2V0QmFzZVVyaSgpICsgInRyYW5zZmVycyI7CisgICAgICBTdHJpbmcgcXVlcnkgPSAiP3Byb2R1Y3RJZD0iICsgcmVzb3VyY2UuZ2V0UHJvZHVjdElkKCk7CisgICAgICBTdHJpbmcgaWRMaW5rID0gYmFzZSArIHF1ZXJ5OworICAgICAgU3RyaW5nIHNlbGZMaW5rID0gYmFzZSArICIucnNzIiArIHF1ZXJ5OworICAgICAgU3RyaW5nIGN1cnJlbnREYXRlID0gZGF0ZUZvcm1hdHRlci5mb3JtYXQobmV3IERhdGUoKSk7CisKKyAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICBEb2N1bWVudCBkb2MgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7CisgICAgICBFbGVtZW50IHJzcyA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBkb2MsICJyc3MiKTsKKyAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJzcywgInZlcnNpb24iLCAiMi4wIik7CisgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByc3MsICJ4bWxuczphdG9tIiwKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIpOworCisgICAgICBFbGVtZW50IGNoYW5uZWwgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgcnNzLCAiY2hhbm5lbCIpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJ0aXRsZSIsICJGaWxlIE1hbmFnZXIgVHJhbnNmZXJzIik7CisKKyAgICAgIEVsZW1lbnQgYXRvbUxpbmsgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImF0b206bGluayIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJocmVmIiwgc2VsZkxpbmspOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJyZWwiLCAic2VsZiIpOworICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgYXRvbUxpbmssICJ0eXBlIiwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKTsKKworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsaW5rIiwgaWRMaW5rKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiZGVzY3JpcHRpb24iLAorICAgICAgICAiRmlsZXMgY3VycmVudGx5IGJlaW5nIHRyYW5zZmVycmVkIHRvIHRoZSBmaWxlIG1hbmFnZXIgcmVwb3NpdG9yeS4iKTsKKworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsYW5ndWFnZSIsIExBTkdVQUdFKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiY29weXJpZ2h0IiwgQ09QWVJJR0hUKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAicHViRGF0ZSIsIGN1cnJlbnREYXRlKTsKKyAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiY2F0ZWdvcnkiLCAiZGF0YSB0cmFuc2ZlciIpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJnZW5lcmF0b3IiLCBHRU5FUkFUT1IpOworICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsYXN0QnVpbGREYXRlIiwgY3VycmVudERhdGUpOworCisgICAgICBmb3IgKFRyYW5zZmVyUmVzb3VyY2UgdHJhbnNmZXJSZXNvdXJjZSA6IHJlc291cmNlLmdldFRyYW5zZmVyUmVzb3VyY2VzKCkpCisgICAgICB7CisgICAgICAgIFN0cmluZyBkYXRhU3RvcmVSZWYgPSB0cmFuc2ZlclJlc291cmNlLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpOworICAgICAgICBTdHJpbmcgdHJhbnNmZXJMaW5rID0gZ2V0QmFzZVVyaSgpICsgInRyYW5zZmVyP2RhdGFTdG9yZVJlZj0iCisgICAgICAgICAgKyBkYXRhU3RvcmVSZWY7CisgICAgICAgIEVsZW1lbnQgaXRlbSA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiaXRlbSIpOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgaXRlbSwgInRpdGxlIiwgZGF0YVN0b3JlUmVmKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJsaW5rIiwgdHJhbnNmZXJMaW5rKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiTUlNRSBUeXBlOiAiICsgdHJhbnNmZXJSZXNvdXJjZS5nZXRNaW1lVHlwZU5hbWUoKQorICAgICAgICAgICsgIiwgUHJvZHVjdDogIiArIHRyYW5zZmVyUmVzb3VyY2UuZ2V0UHJvZHVjdE5hbWUoKQorICAgICAgICAgICsgIiwgUHJvZHVjdCBUeXBlOiAiICsgdHJhbnNmZXJSZXNvdXJjZS5nZXRQcm9kdWN0VHlwZU5hbWUoKSk7CisgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAiZ3VpZCIsIHRyYW5zZmVyTGluayk7CisKKyAgICAgICAgRGF0ZSBwcm9kdWN0UmVjZWl2ZWRUaW1lID0gRGF0ZUNvbnZlcnQuaXNvUGFyc2UodHJhbnNmZXJSZXNvdXJjZQorICAgICAgICAgIC5nZXRQcm9kdWN0UmVjZWl2ZWRUaW1lKCkpOworICAgICAgICBpZiAocHJvZHVjdFJlY2VpdmVkVGltZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJwdWJEYXRlIiwgZGF0ZUZvcm1hdHRlcgorICAgICAgICAgICAgLmZvcm1hdChwcm9kdWN0UmVjZWl2ZWRUaW1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgWE1MVXRpbHMud3JpdGVYbWxUb1N0cmVhbShkb2MsIGVudGl0eVN0cmVhbSk7CisgICAgfQorICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSBSU1MgWE1MIGRvY3VtZW50IGZvciBSU1MgcmVzcG9uc2UuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9CisgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSBSU1MgWE1MIGRvY3VtZW50IGZvciBSU1MgcmVzcG9uc2UuIjsKKyAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgbWVzc2FnZSwgZSk7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL3BhY2thZ2UtaW5mby5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3dyaXRlcnMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1ZmM3MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy93cml0ZXJzL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKgorICogQ29udGFpbnMgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIgdG8gcHJvdmlkZQorICogbWFyc2hhbGxpbmcgb2YgSkFYLVJTIHJlc291cmNlcyBpbnRvIGRpZmZlcmVudCBmb3JtYXRzLgorICogQGF1dGhvciBybGFpZGxhdworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzOwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9Qcm9kdWN0VHlwZUZpbHRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9Qcm9kdWN0VHlwZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWFiNmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1Byb2R1Y3RUeXBlRmlsdGVyLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiAKKyAqIEZpbHRlcnMgYSB7QGxpbmsgUHJvZHVjdFR5cGV9LCBiYXNlZCBvbiBhIHNldCBvZiBjb25zdHJhaW50cy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0VHlwZUZpbHRlciB7CisKKyAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGNvbnN0cmFpbnRzOworCisgIHB1YmxpYyBQcm9kdWN0VHlwZUZpbHRlcigpIHsKKyAgICB0aGlzKG51bGwpOworICB9CisKKyAgcHVibGljIFByb2R1Y3RUeXBlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKKyAgICB0aGlzLmNvbnN0cmFpbnRzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBpZiAoZmlsdGVyICE9IG51bGwpCisgICAgICB0aGlzLnBhcnNlKGZpbHRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgZmlsdGVyKSB7CisgICAgaWYoZmlsdGVyID09IG51bGwpIHJldHVybjsKKyAgICBTdHJpbmdbXSBhdHRyQ29uc3RycyA9IGZpbHRlci5zcGxpdCgiLCIpOworICAgIGZvciAoU3RyaW5nIGF0dHJDb25zdHIgOiBhdHRyQ29uc3RycykgeworICAgICAgU3RyaW5nW10gYXR0ckNvbnN0UGFpciA9IGF0dHJDb25zdHIuc3BsaXQoIlxcOiIpOworICAgICAgdGhpcy5jb25zdHJhaW50cy5wdXQoYXR0ckNvbnN0UGFpclswXSwgYXR0ckNvbnN0UGFpclsxXSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGJvb2xlYW4gZmlsdGVyKFByb2R1Y3RUeXBlIHR5cGUpIHsKKyAgICBpZih0aGlzLmNvbnN0cmFpbnRzID09IG51bGwpIHJldHVybiB0cnVlOworICAgIGlmICh0eXBlLmdldFR5cGVNZXRhZGF0YSgpICE9IG51bGwpIHsKKyAgICAgIE1ldGFkYXRhIHR5cGVNZXQgPSB0eXBlLmdldFR5cGVNZXRhZGF0YSgpOworICAgICAgZm9yIChPYmplY3QgY29uc3RyYWludE9iaiA6IHRoaXMuY29uc3RyYWludHMua2V5U2V0KCkpIHsKKyAgICAgICAgU3RyaW5nIGNvbnN0cmFpbnROYW1lID0gKFN0cmluZykgY29uc3RyYWludE9iajsKKyAgICAgICAgU3RyaW5nIGNvbnN0cmFpbnRWYWx1ZSA9IHRoaXMuY29uc3RyYWludHMuZ2V0UHJvcGVydHkoY29uc3RyYWludE5hbWUpOworICAgICAgICBpZiAoIXR5cGVNZXQuY29udGFpbnNLZXkoY29uc3RyYWludE5hbWUpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0eXBlTWV0LmdldE1ldGFkYXRhKGNvbnN0cmFpbnROYW1lKS5lcXVhbHMoY29uc3RyYWludFZhbHVlKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvUkRGQ29uZmlnLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjU3MDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yZGY7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogCisgKiBUaGUgUkRGIFJFU1QtZnVsIHdlYiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBDQVMgcHJvZHVjdCBzZXJ2aWNlIGxheWVyLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJERkNvbmZpZyB7CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG5zTWFwOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiByZXdyaXRlTWFwOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiByZXNMaW5rTWFwOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBrZXlOc01hcDsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXNOc01hcDsKKworICBwcml2YXRlIFN0cmluZyBkZWZhdWx0S2V5TnM7CisKKyAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFR5cGVOczsKKworICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBSREZDb25maWcoKSB7CisgICAgdGhpcy5uc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHRoaXMucmV3cml0ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHRoaXMucmVzTGlua01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHRoaXMua2V5TnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICB0aGlzLnR5cGVzTnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICB0aGlzLmRlZmF1bHRLZXlOcyA9IG51bGw7CisgICAgdGhpcy5kZWZhdWx0VHlwZU5zID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBuc01hcAorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TnNNYXAoKSB7CisgICAgcmV0dXJuIG5zTWFwOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuc01hcAorICAgKiAgICAgICAgICB0aGUgbnNNYXAgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROc01hcChNYXA8U3RyaW5nLCBTdHJpbmc+IG5zTWFwKSB7CisgICAgdGhpcy5uc01hcCA9IG5zTWFwOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHJld3JpdGVNYXAKKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFJld3JpdGVNYXAoKSB7CisgICAgcmV0dXJuIHJld3JpdGVNYXA7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHJld3JpdGVNYXAKKyAgICogICAgICAgICAgdGhlIHJld3JpdGVNYXAgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSZXdyaXRlTWFwKE1hcDxTdHJpbmcsIFN0cmluZz4gcmV3cml0ZU1hcCkgeworICAgIHRoaXMucmV3cml0ZU1hcCA9IHJld3JpdGVNYXA7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcmVzTGlua01hcAorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVzTGlua01hcCgpIHsKKyAgICByZXR1cm4gcmVzTGlua01hcDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcmVzTGlua01hcAorICAgKiAgICAgICAgICB0aGUgcmVzTGlua01hcCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFJlc0xpbmtNYXAoTWFwPFN0cmluZywgU3RyaW5nPiByZXNMaW5rTWFwKSB7CisgICAgdGhpcy5yZXNMaW5rTWFwID0gcmVzTGlua01hcDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBrZXlOc01hcAorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0S2V5TnNNYXAoKSB7CisgICAgcmV0dXJuIGtleU5zTWFwOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBrZXlOc01hcAorICAgKiAgICAgICAgICB0aGUga2V5TnNNYXAgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRLZXlOc01hcChNYXA8U3RyaW5nLCBTdHJpbmc+IGtleU5zTWFwKSB7CisgICAgdGhpcy5rZXlOc01hcCA9IGtleU5zTWFwOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGRlZmF1bHRLZXlOcworICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5TnMoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRLZXlOczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZGVmYXVsdEtleU5zCisgICAqICAgICAgICAgIHRoZSBkZWZhdWx0S2V5TnMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0S2V5TnMoU3RyaW5nIGRlZmF1bHRLZXlOcykgeworICAgIHRoaXMuZGVmYXVsdEtleU5zID0gZGVmYXVsdEtleU5zOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGRlZmF1bHRUeXBlTnMKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGVOcygpIHsKKyAgICByZXR1cm4gZGVmYXVsdFR5cGVOczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZGVmYXVsdFR5cGVOcworICAgKiAgICAgICAgICB0aGUgZGVmYXVsdFR5cGVOcyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRUeXBlTnMoU3RyaW5nIGRlZmF1bHRUeXBlTnMpIHsKKyAgICB0aGlzLmRlZmF1bHRUeXBlTnMgPSBkZWZhdWx0VHlwZU5zOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHR5cGVzTnNNYXAKKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFR5cGVzTnNNYXAoKSB7CisgICAgcmV0dXJuIHR5cGVzTnNNYXA7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHR5cGVzTnNNYXAKKyAgICogICAgICAgICAgdGhlIHR5cGVzTnNNYXAgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUeXBlc05zTWFwKE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXNOc01hcCkgeworICAgIHRoaXMudHlwZXNOc01hcCA9IHR5cGVzTnNNYXA7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kLiBGaXJzdCBjaGVja3MgdG8gc2VlIGlmIHRoZXJlIGlzIGEgZGVjbGFyZWQga2V5CisgICAqIG5hbWVzcGFjZSBmb3IgdGhpcyBrZXksIG90aGVyd2lzZSByZXR1cm5zIHtAbGluayAjZ2V0RGVmYXVsdEtleU5zKCl9CisgICAqIAorICAgKiBAcGFyYW0ga2V5CisgICAqICAgICAgICAgIFRoZSBrZXkgdG8gZmluZCB0aGUgbmFtZXNwYWNlIGZvci4KKyAgICogQHJldHVybiBFaXRoZXIgdGhlIGtleSdzIGRlY2xhcmVkIG5hbWVzcGFjZSwgb3Ige0BsaW5rICNnZXREZWZhdWx0S2V5TnMoKX0uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEtleU5zKFN0cmluZyBrZXkpIHsKKyAgICBpZiAodGhpcy5rZXlOc01hcCAhPSBudWxsICYmIHRoaXMua2V5TnNNYXAuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgcmV0dXJuIHRoaXMua2V5TnNNYXAuZ2V0KGtleSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0S2V5TnMoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QuIEZpcnN0IGNoZWNrcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZWNsYXJlZCB0eXBlCisgICAqIG5hbWVzcGFjZSBmb3IgdGhpcyB7QGxpbmsgUHJvZHVjdFR5cGV9LCBvdGhlcndpc2UsIHJldHVybnMKKyAgICoge0BsaW5rICNnZXREZWZhdWx0VHlwZU5zKCl9LgorICAgKiAKKyAgICogQHBhcmFtIHR5cGUKKyAgICogICAgICAgICAgVGhlIHtAbGluayBQcm9kdWN0VHlwZSNnZXROYW1lKCl9IHRvIGZpbmQgdGhlIG5hbWVzcGFjZSBmb3IuCisgICAqIEByZXR1cm4gRWl0aGVyIHRoZSB0eXBlJ3MgZGVjbGFyZWQgbmFtZXNwYWNlLCBvcgorICAgKiAgICAgICAgIHtAbGluayAjZ2V0RGVmYXVsdFR5cGVOcygpfS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5zKFN0cmluZyB0eXBlKSB7CisgICAgaWYgKHRoaXMudHlwZXNOc01hcCAhPSBudWxsICYmIHRoaXMudHlwZXNOc01hcC5jb250YWluc0tleSh0eXBlKSkgeworICAgICAgcmV0dXJuIHRoaXMudHlwZXNOc01hcC5nZXQodHlwZSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0VHlwZU5zKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9SREZDb25maWdNZXRLZXlzLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZ01ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWYzNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9SREZDb25maWdNZXRLZXlzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmOworCisvKioKKyAqCisgKiBNZXQga2V5cyBmb3IgdGhlIHtAbGluayBSREZDb25maWd9LgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUkRGQ29uZmlnTWV0S2V5cyB7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSREZfQ09OVEVYVF9DT05GX0tFWSA9ICJmaWxlbWdyLnJkZmNvbmYuZmlsZSI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvUkRGQ29uZmlnUmVhZGVyLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZ1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWVjZTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZ1JlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yZGY7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmLlJERkNvbmZpZ1JlYWRlck1ldEtleXMuKjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIAorICogUmVhZGVyIGNsYXNzIGZvciB7QGxpbmsgUkRGQ29uZmlnfXMgZnJvbSB7QGxpbmsgRmlsZX1zLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJERkNvbmZpZ1JlYWRlciB7CisKKyAgLyoqCisgICAqIFJlYWRzIGFuIHtAbGluayBSREZDb25maWd9IGZyb20gYSB7QGxpbmsgRmlsZX0uCisgICAqIAorICAgKiBAcGFyYW0gZmlsZQorICAgKiAgICAgICAgICBUaGUge0BsaW5rIEZpbGV9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgUkRGQ29uZmlnfS4KKyAgICogQHJldHVybiBBbiB7QGxpbmsgUkRGQ29uZmlnfSBpbml0aWFsaXplZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZWFkIGZyb20gdGhlCisgICAqICAgICAgICAgZ2l2ZW4ge0BsaW5rIEZpbGV9LgorICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgdGhlIHtAbGluayBGaWxlfSBpcyBub3QgZm91bmQuCisgICAqLworICBwdWJsaWMgc3RhdGljIFJERkNvbmZpZyByZWFkQ29uZmlnKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgUkRGQ29uZmlnIGNvbmYgPSBuZXcgUkRGQ29uZmlnKCk7CisKKyAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgRWxlbWVudCByb290RWxlbSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgIHJlYWROYW1lc3BhY2VzKHJvb3RFbGVtLCBjb25mKTsKKyAgICByZWFkUmV3cml0ZVJ1bGVzKHJvb3RFbGVtLCBjb25mKTsKKyAgICByZWFkUmVzb3VyY2VMaW5rcyhyb290RWxlbSwgY29uZik7CisgICAgcmVhZEtleU5zTWFwKHJvb3RFbGVtLCBjb25mKTsKKyAgICByZWFkVHlwZXNOc01hcChyb290RWxlbSwgY29uZik7CisKKyAgICByZXR1cm4gY29uZjsKKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWFkTmFtZXNwYWNlcyhFbGVtZW50IHJvb3QsIFJERkNvbmZpZyBjb25mKSB7CisgICAgRWxlbWVudCBuYW1lc3BhY2VzUm9vdCA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudChOU19PVVRFUl9UQUcsIHJvb3QpOworICAgIE5vZGVMaXN0IG5zTGlzdCA9IG5hbWVzcGFjZXNSb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKE5TX1RBRyk7CisgICAgaWYgKG5zTGlzdCAhPSBudWxsICYmIG5zTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCBuc0VsZW0gPSAoRWxlbWVudCkgbnNMaXN0Lml0ZW0oaSk7CisgICAgICAgIGNvbmYuZ2V0TnNNYXAoKS5wdXQobnNFbGVtLmdldEF0dHJpYnV0ZShOU19OQU1FX0FUVFIpLAorICAgICAgICAgICAgbnNFbGVtLmdldEF0dHJpYnV0ZShOU19WQUxVRV9BVFRSKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlYWRSZXdyaXRlUnVsZXMoRWxlbWVudCByb290LCBSREZDb25maWcgY29uZikgeworICAgIEVsZW1lbnQgcmV3cml0ZVJvb3QgPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQoUkVXUklURV9PVVRFUl9UQUcsIHJvb3QpOworICAgIE5vZGVMaXN0IHJld3JpdGVMaXN0ID0gcmV3cml0ZVJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoUkVXUklURV9LRVlfVEFHKTsKKyAgICBpZiAocmV3cml0ZUxpc3QgIT0gbnVsbCAmJiByZXdyaXRlTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV3cml0ZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICBFbGVtZW50IHJld3JpdGVLZXlFbGVtID0gKEVsZW1lbnQpIHJld3JpdGVMaXN0Lml0ZW0oaSk7CisgICAgICAgIGNvbmYuZ2V0UmV3cml0ZU1hcCgpLnB1dCgKKyAgICAgICAgICAgIHJld3JpdGVLZXlFbGVtLmdldEF0dHJpYnV0ZShSRVdSSVRFX0ZST01fQVRUUiksCisgICAgICAgICAgICByZXdyaXRlS2V5RWxlbS5nZXRBdHRyaWJ1dGUoUkVXUklURV9UT19BVFRSKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlYWRSZXNvdXJjZUxpbmtzKEVsZW1lbnQgcm9vdCwgUkRGQ29uZmlnIGNvbmYpIHsKKyAgICBFbGVtZW50IHJlc0xpbmtSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KFJFU09VUkNFX0xJTktfVEFHLCByb290KTsKKyAgICBOb2RlTGlzdCBsaW5rTGlzdCA9IHJlc0xpbmtSb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKFJFU0xJTktfS0VZX1RBRyk7CisgICAgaWYgKGxpbmtMaXN0ICE9IG51bGwgJiYgbGlua0xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCByZXNsaW5rS2V5RWxlbSA9IChFbGVtZW50KSBsaW5rTGlzdC5pdGVtKGkpOworICAgICAgICBjb25mLmdldFJlc0xpbmtNYXAoKS5wdXQoCisgICAgICAgICAgICByZXNsaW5rS2V5RWxlbS5nZXRBdHRyaWJ1dGUoUkVTTElOS19LRVlfVEFHX05BTUVfQVRUUiksCisgICAgICAgICAgICByZXNsaW5rS2V5RWxlbS5nZXRBdHRyaWJ1dGUoUkVTTElOS19LRVlfVEFHX0xJTktfQVRUUikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWFkS2V5TnNNYXAoRWxlbWVudCByb290LCBSREZDb25maWcgY29uZikgeworICAgIEVsZW1lbnQga2V5TnNSb290ID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KEtFWV9OU01BUF9UQUcsIHJvb3QpOworICAgIGNvbmYuc2V0RGVmYXVsdEtleU5zKGtleU5zUm9vdC5nZXRBdHRyaWJ1dGUoS0VZX05TTUFQX0RFRkFVTFRfQVRUUikpOworICAgIE5vZGVMaXN0IGtleU5zTGlzdCA9IGtleU5zUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShLRVlfTlNNQVBfS0VZX1RBRyk7CisgICAgaWYgKGtleU5zTGlzdCAhPSBudWxsICYmIGtleU5zTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5TnNMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCBrZXlOc0VsZW0gPSAoRWxlbWVudCkga2V5TnNMaXN0Lml0ZW0oaSk7CisgICAgICAgIGNvbmYuZ2V0S2V5TnNNYXAoKS5wdXQoCisgICAgICAgICAgICBrZXlOc0VsZW0uZ2V0QXR0cmlidXRlKEtFWV9OU01BUF9LRVlfVEFHX05BTUVfQVRUUiksCisgICAgICAgICAgICBrZXlOc0VsZW0uZ2V0QXR0cmlidXRlKEtFWV9OU01BUF9LRVlfVEFHX05TX0FUVFIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVhZFR5cGVzTnNNYXAoRWxlbWVudCByb290LCBSREZDb25maWcgY29uZikgeworICAgIEVsZW1lbnQgdHlwZU5zUm9vdCA9IFhNTFV0aWxzLmdldEZpcnN0RWxlbWVudChUWVBFX05TTUFQX1RBRywgcm9vdCk7CisgICAgY29uZi5zZXREZWZhdWx0VHlwZU5zKHR5cGVOc1Jvb3QuZ2V0QXR0cmlidXRlKFRZUEVfTlNNQVBfREVGQVVMVF9BVFRSKSk7CisgICAgTm9kZUxpc3QgdHlwZU5zTGlzdCA9IHR5cGVOc1Jvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVFlQRV9OU01BUF9UWVBFX1RBRyk7CisgICAgaWYgKHR5cGVOc0xpc3QgIT0gbnVsbCAmJiB0eXBlTnNMaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTnNMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCB0eXBlTnNFbGVtID0gKEVsZW1lbnQpIHR5cGVOc0xpc3QuaXRlbShpKTsKKyAgICAgICAgY29uZi5nZXRUeXBlc05zTWFwKCkucHV0KAorICAgICAgICAgICAgdHlwZU5zRWxlbS5nZXRBdHRyaWJ1dGUoVFlQRV9OU01BUF9UWVBFX05BTUVfQVRUUiksCisgICAgICAgICAgICB0eXBlTnNFbGVtLmdldEF0dHJpYnV0ZShUWVBFX05TTUFQX1RZUEVfTlNfQVRUUikpOworICAgICAgfQorICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZ1JlYWRlck1ldEtleXMuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvUkRGQ29uZmlnUmVhZGVyTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODgwMjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERkNvbmZpZ1JlYWRlck1ldEtleXMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yZGY7CisKKy8qKgorICogCisgKiBNZXQga2V5cyBmb3IgdGhlIHtAbGluayBSREZDb25maWdSZWFkZXJ9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBSREZDb25maWdSZWFkZXJNZXRLZXlzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19PVVRFUl9UQUcgPSAibmFtZXNwYWNlcyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVEFHID0gIm5zIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX0FUVFIgPSAibmFtZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVkFMVUVfQVRUUiA9ICJ2YWx1ZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9PVVRFUl9UQUcgPSAicmV3cml0ZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9LRVlfVEFHID0gImtleSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9GUk9NX0FUVFIgPSAiZnJvbSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVXUklURV9UT19BVFRSID0gInRvIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9MSU5LX1RBRyA9ICJyZXNvdXJjZWxpbmtzIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNMSU5LX0tFWV9UQUcgPSAia2V5IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNMSU5LX0tFWV9UQUdfTkFNRV9BVFRSID0gIm5hbWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU0xJTktfS0VZX1RBR19MSU5LX0FUVFIgPSAibGluayI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05TTUFQX1RBRyA9ICJrZXluc21hcCI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05TTUFQX0RFRkFVTFRfQVRUUiA9ICJkZWZhdWx0IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTlNNQVBfS0VZX1RBRyA9ICJrZXkiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OU01BUF9LRVlfVEFHX05BTUVfQVRUUiA9ICJuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTlNNQVBfS0VZX1RBR19OU19BVFRSID0gIm5zIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05TTUFQX1RBRyA9ICJ0eXBlc25zbWFwIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05TTUFQX0RFRkFVTFRfQVRUUiA9ICJkZWZhdWx0IjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05TTUFQX1RZUEVfVEFHID0gInR5cGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTlNNQVBfVFlQRV9OQU1FX0FUVFIgPSAibmFtZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OU01BUF9UWVBFX05TX0FUVFIgPSAibnMiOworICAKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvUkRGRGF0YXNldFNlcnZsZXQuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvUkRGRGF0YXNldFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRlMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9SREZEYXRhc2V0U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yZGY7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdFc2NhcGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Xb3JkVXRpbHM7CisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zeXN0ZW0uWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8qKgorICogCisgKiBBIFNlcnZsZXQgdGhhdCBleHBvcnRzIFByb2R1Y3RUeXBlIG1ldGFhdGEgaW5mb3JtYXRpb24gdXNpbmcgdGhlIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZyI+VzNDJ3M8L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1JERi8iPiBSZXNvdXJjZQorICogRGVzY3JpcHRpb24gRnJhbWV3b3JrPC9hPi4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJERkRhdGFzZXRTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgIC8qIHNlcmlhbCBWZXJzaW9uIFVJRCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzY2MDk5MTI3MTY0MjUzMzk4NUw7CisKKyAgLyogb3VyIGNsaWVudCB0byB0aGUgZmlsZSBtYW5hZ2VyICovCisgIHByaXZhdGUgc3RhdGljIFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50IGZDbGllbnQgPSBudWxsOworCisgIC8qIG91ciBsb2cgc3RyZWFtICovCisgIHByaXZhdGUgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoUkRGUHJvZHVjdFNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKiBvdXIgUkRGIGNvbmZpZ3VyYXRpb24gKi8KKyAgcHJpdmF0ZSBSREZDb25maWcgcmRmQ29uZjsKKworICAvKioKKyAgICogPHA+CisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICogPC9wPgorICAgKiAuCisgICAqLworICBwdWJsaWMgUkRGRGF0YXNldFNlcnZsZXQoKSB7CisgIH0KKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIHNlcnZsZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuaW5pdChjb25maWcpOworICAgIHRyeSB7CisgICAgICB0aGlzLnJkZkNvbmYgPSBSREZVdGlscy5pbml0UkRGKGNvbmZpZyk7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgU3RyaW5nIGZpbGVNYW5hZ2VyVXJsID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgZmlsZU1hbmFnZXJVcmwgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKAorICAgICAgICAgICJmaWxlbWdyLnVybCIpICk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGZpbGVtZ3IgdXJsIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9ICAgIAorICAgIAorICAgIGlmIChmaWxlTWFuYWdlclVybCA9PSBudWxsKSB7CisgICAgICAvLyB0cnkgdGhlIGRlZmF1bHQgcG9ydAorICAgICAgZmlsZU1hbmFnZXJVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo5MDAwIjsKKyAgICB9CisKKyAgICBmQ2xpZW50ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBmQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZmlsZU1hbmFnZXJVcmwpKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgIlVuYWJsZSB0byBpbml0aWFsaXplIGZpbGUgbWFuYWdlciB1cmwgaW4gUkRGIFNlcnZsZXQ6IFt1cmw9IgorICAgICAgICAgICAgICArIGZpbGVNYW5hZ2VyVXJsICsgIl0sIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgZmlsZSBtYW5hZ2VyIHVybCBpbiBSREYgU2VydmxldDogW3VybD0iCisgICAgICAgICAgICAgICsgZmlsZU1hbmFnZXJVcmwgKyAiXSwgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICBkb0l0KHJlcSwgcmVzcCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIGRvSXQocmVxLCByZXNwKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvSXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworCisgICAgLy8gbmVlZCB0byBrbm93IHRoZSB0eXBlIG9mIHByb2R1Y3QgdG8gZ2V0IHByb2R1Y3RzIGZvcgorICAgIFN0cmluZyBwcm9kdWN0VHlwZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgU3RyaW5nIHByb2R1Y3RUeXBlSWQgPSByZXEuZ2V0UGFyYW1ldGVyKCJ0eXBlSUQiKTsKKyAgICBQcm9kdWN0VHlwZUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvZHVjdFR5cGVGaWx0ZXIocmVxLmdldFBhcmFtZXRlcigiZmlsdGVyIikpOworICAgIFByb2R1Y3RUeXBlIHR5cGUgPSBudWxsOworCisgICAgTGlzdDxQcm9kdWN0VHlwZT4gcHJvZHVjdFR5cGVzID0gbmV3IFZlY3RvcjxQcm9kdWN0VHlwZT4oKTsKKworICAgIGlmIChwcm9kdWN0VHlwZU5hbWUuZXF1YWxzKCJBTEwiKSkgeworICAgICAgcHJvZHVjdFR5cGVzID0gc2FmZUdldFByb2R1Y3RUeXBlcygpOworICAgIH0gZWxzZSB7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHR5cGUgPSBmQ2xpZW50LmdldFByb2R1Y3RUeXBlQnlJZChwcm9kdWN0VHlwZUlkKTsKKyAgICAgICAgcHJvZHVjdFR5cGVzLmFkZCh0eXBlKTsKKyAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAiVW5hYmxlIHRvIG9idGFpbiBwcm9kdWN0IHR5cGUgZnJvbSBwcm9kdWN0IHR5cGUgaWQ6IFsiCisgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZUlkICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgcmVxdWVzdFVybCA9IHJlcS5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgb3JpZ0Jhc2UgPSByZXF1ZXN0VXJsLnN1YnN0cmluZygwLCByZXF1ZXN0VXJsLmxhc3RJbmRleE9mKCcvJykpOworICAgIFN0cmluZyBiYXNlID0gb3JpZ0Jhc2Uuc3Vic3RyaW5nKDAsIG9yaWdCYXNlLmxhc3RJbmRleE9mKCcvJykpICsgIi9kYXRhc2V0IjsKKworICAgIC8vIGFsbG93IG92ZXJyaWRlIHRocm91Z2ggdGhlICJiYXNlVXJsIiBHRVQgcGFyYW1ldGVyCisgICAgaWYgKHJlcS5nZXRQYXJhbWV0ZXIoImJhc2VVcmwiKSAhPSBudWxsKSB7CisgICAgICBiYXNlID0gcmVxLmdldFBhcmFtZXRlcigiYmFzZVVybCIpOworICAgIH0KKyAgICAKKyAgICBpZiAocHJvZHVjdFR5cGVzICE9IG51bGwgJiYgcHJvZHVjdFR5cGVzLnNpemUoKSA+IDApIHsKKyAgICAgIExpc3Q8UHJvZHVjdFR5cGU+IHN1YnNldExpc3QgPSBuZXcgVmVjdG9yPFByb2R1Y3RUeXBlPigpOworICAgICAgCisgICAgICAvLyBwZXJmb3JtIGZpbHRlcmluZworICAgICAgZm9yKFByb2R1Y3RUeXBlIHB0OiBwcm9kdWN0VHlwZXMpeworICAgICAgICBpZihmaWx0ZXIuZmlsdGVyKHB0KSl7CisgICAgICAgICAgc3Vic2V0TGlzdC5hZGQocHQpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIG91dHB1dFJERihzdWJzZXRMaXN0LCBiYXNlLCByZXNwKTsKKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIG91dHB1dFJERihMaXN0PFByb2R1Y3RUeXBlPiBwcm9kdWN0VHlwZXMsIFN0cmluZyBiYXNlLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICB0cnkgeworICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgIERvY3VtZW50IGRvYyA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKworICAgICAgRWxlbWVudCByZGYgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgZG9jLCAicmRmOlJERiIpOworICAgICAgUkRGVXRpbHMuYWRkTmFtZXNwYWNlcyhkb2MsIHJkZiwgdGhpcy5yZGZDb25mKTsKKworICAgICAgZm9yIChJdGVyYXRvcjxQcm9kdWN0VHlwZT4gaSA9IHByb2R1Y3RUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUHJvZHVjdFR5cGUgdHlwZSA9IGkubmV4dCgpOworICAgICAgICAKKyAgICAgICAgRWxlbWVudCBwcm9kdWN0VHlwZVJkZkRlc2MgPSBYTUxVdGlscy5hZGROb2RlKGRvYywgcmRmLCB0aGlzLnJkZkNvbmYKKyAgICAgICAgICAgIC5nZXRUeXBlTnModHlwZS5nZXROYW1lKCkpCisgICAgICAgICAgICArICI6IiArIHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcHJvZHVjdFR5cGVSZGZEZXNjLCAicmRmOmFib3V0IiwgYmFzZQorICAgICAgICAgICAgKyAiP3R5cGVJRD0iICsgdHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkpOworCisgICAgICAgIC8vIGZvciBhbGwgb2YgaXRzIG1ldGFkYXRhIGtleXMgYW5kIHZhbHVlcywgbG9vcCB0aHJvdWdoIHRoZW0KKyAgICAgICAgLy8gYW5kIGFkZCBSREYgbm9kZXMgdW5kZXJuZWF0aCB0aGUgUmRmRGVzYyBmb3IgdGhpcyBwcm9kdWN0CisKKyAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZU1ldGFkYXRhKCkgIT0gbnVsbCkgeworICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBqID0gdHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKQorICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgai5uZXh0KCk7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWxzID0gdHlwZS5nZXRUeXBlTWV0YWRhdGEoKS5nZXRBbGxNZXRhZGF0YShrZXkpOworCisgICAgICAgICAgICBpZiAodmFscyAhPSBudWxsICYmIHZhbHMuc2l6ZSgpID4gMCkgeworCisgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBrID0gdmFscy5pdGVyYXRvcigpOyBrLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgay5uZXh0KCk7CisgICAgICAgICAgICAgICAgLy9PT0RULTY2NSBmaXgsIHRha2Uga2V5cyBsaWtlIAorICAgICAgICAgICAgICAgIC8vUFJPRFVDVCBFeHBlcmltZW50IFR5cGUKKyAgICAgICAgICAgICAgICAvL2FuZCB0cmFuc2Zvcm0gaXQgaW50byBQcm9kdWN0RXhwZXJpbWVudFR5cGUKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0S2V5ID0ga2V5OworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRLZXkuaW5kZXhPZigiICIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICBvdXRwdXRLZXkgPSBTdHJpbmdVdGlscy5qb2luKFdvcmRVdGlscy5jYXBpdGFsaXplRnVsbHkob3V0cHV0S2V5KS5zcGxpdCgKKyAgICAgICAgICAgICAgICAgICAgICAiICIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFsID0gU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlWG1sKHZhbCk7CisgICAgICAgICAgICAgICAgRWxlbWVudCByZGZFbGVtID0gUkRGVXRpbHMuZ2V0UkRGRWxlbWVudChvdXRwdXRLZXksIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZGZDb25mLCBkb2MpOworICAgICAgICAgICAgICAgIHByb2R1Y3RUeXBlUmRmRGVzYy5hcHBlbmRDaGlsZChyZGZFbGVtKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKKyAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgiaW5kZW50IiwgInllcyIpOworICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQocmVzcC5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICByZXNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOworICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKKworICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBMaXN0PFByb2R1Y3RUeXBlPiBzYWZlR2V0UHJvZHVjdFR5cGVzKCkgeworICAgIExpc3Q8UHJvZHVjdFR5cGU+IHR5cGVzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICB0eXBlcyA9IGZDbGllbnQuZ2V0UHJvZHVjdFR5cGVzKCk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIHJldHJpZXZpbmcgcHJvZHVjdCB0eXBlczogTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHJldHVybiB0eXBlczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERlByb2R1Y3RTZXJ2bGV0LmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERlByb2R1Y3RTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZDEyYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvUkRGUHJvZHVjdFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuV29yZFV0aWxzOworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0UGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8qKgorICogCisgKiBBIFNlcnZsZXQgdGhhdCBleHBvcnRzIFByb2R1Y3QgbWV0YWF0YSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnIj5XM0MnczwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUkRGLyI+IFJlc291cmNlCisgKiBEZXNjcmlwdGlvbiBGcmFtZXdvcms8L2E+LgorICogCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSREZQcm9kdWN0U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAvKiBzZXJpYWwgVmVyc2lvbiBVSUQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM2NjA5OTEyNzE2NDY1MzM5ODVMOworCisgIC8qIG91ciBjbGllbnQgdG8gdGhlIGZpbGUgbWFuYWdlciAqLworICBwcml2YXRlIHN0YXRpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmQ2xpZW50ID0gbnVsbDsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJERlByb2R1Y3RTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgLyogb3VyIFJERiBjb25maWd1cmF0aW9uICovCisgIHByaXZhdGUgUkRGQ29uZmlnIHJkZkNvbmY7CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisgICAqIDwvcD4KKyAgICogLgorICAgKi8KKyAgcHVibGljIFJERlByb2R1Y3RTZXJ2bGV0KCkgeworICB9CisKKyAgLyoqCisgICAqIEluaXRpYWxpemVzIHRoZSBzZXJ2bGV0LgorICAgKi8KKyAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKyAgICB0cnkgeworICAgICAgdGhpcy5yZGZDb25mID0gUkRGVXRpbHMuaW5pdFJERihjb25maWcpOworICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIFN0cmluZyBmaWxlTWFuYWdlclVybCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGZpbGVNYW5hZ2VyVXJsID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgICAiZmlsZW1nci51cmwiKSApOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBmaWxlbWdyIHVybCA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgfQorICAgIAorICAgIGlmIChmaWxlTWFuYWdlclVybCA9PSBudWxsKSB7CisgICAgICAvLyB0cnkgdGhlIGRlZmF1bHQgcG9ydAorICAgICAgZmlsZU1hbmFnZXJVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo5MDAwIjsKKyAgICB9CisKKyAgICBmQ2xpZW50ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBmQ2xpZW50ID0gbmV3IFhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoZmlsZU1hbmFnZXJVcmwpKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgIlVuYWJsZSB0byBpbml0aWFsaXplIGZpbGUgbWFuYWdlciB1cmwgaW4gUkRGIFNlcnZsZXQ6IFt1cmw9IgorICAgICAgICAgICAgICArIGZpbGVNYW5hZ2VyVXJsICsgIl0sIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgZmlsZSBtYW5hZ2VyIHVybCBpbiBSREYgU2VydmxldDogW3VybD0iCisgICAgICAgICAgICAgICsgZmlsZU1hbmFnZXJVcmwgKyAiXSwgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgZG9JdChyZXEsIHJlc3ApOworICB9CisKKyAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICBkb0l0KHJlcSwgcmVzcCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkb0l0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKworICAgIC8vIG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiBwcm9kdWN0IHRvIGdldCBwcm9kdWN0cyBmb3IKKyAgICBTdHJpbmcgcHJvZHVjdFR5cGVOYW1lID0gcmVxLmdldFBhcmFtZXRlcigidHlwZSIpOworICAgIFN0cmluZyBwcm9kdWN0VHlwZUlkID0gcmVxLmdldFBhcmFtZXRlcigiaWQiKTsKKyAgICBQcm9kdWN0VHlwZSB0eXBlID0gbnVsbDsKKworICAgIExpc3Q8UHJvZHVjdD4gcHJvZHVjdHMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGlmIChwcm9kdWN0VHlwZU5hbWUuZXF1YWxzKCJBTEwiKSkgeworICAgICAgICBwcm9kdWN0cyA9IGFnZ3JlZ2F0ZVBhZ2VkUHJvZHVjdHMoKTsKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0eXBlID0gZkNsaWVudC5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZHVjdFR5cGVJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCB0eXBlIGZyb20gcHJvZHVjdCB0eXBlIGlkOiBbIgorICAgICAgICAgICAgICAgICAgKyBwcm9kdWN0VHlwZUlkICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJvZHVjdHMgPSBmQ2xpZW50LmdldFByb2R1Y3RzQnlQcm9kdWN0VHlwZSh0eXBlKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRworICAgICAgICAgIC5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHByb2R1Y3RzIGZyb20gQ2F0YWxvZzogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIHJlcXVlc3RVcmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nIGJhc2UgPSByZXF1ZXN0VXJsLnN1YnN0cmluZygwLCByZXF1ZXN0VXJsLmxhc3RJbmRleE9mKCcvJykpCisgICAgICAgICsgIi9kYXRhIjsKKworICAgIC8vIGFsbG93IG92ZXJyaWRlIHRocm91Z2ggdGhlICJiYXNlVXJsIiBHRVQgcGFyYW1ldGVyCisgICAgaWYgKHJlcS5nZXRQYXJhbWV0ZXIoImJhc2VVcmwiKSAhPSBudWxsKSB7CisgICAgICBiYXNlID0gcmVxLmdldFBhcmFtZXRlcigiYmFzZVVybCIpOworICAgIH0KKworICAgIGlmIChwcm9kdWN0cyAhPSBudWxsICYmIHByb2R1Y3RzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dHB1dFJERihwcm9kdWN0cywgdHlwZSwgYmFzZSwgcmVzcCk7CisgICAgfQorCisgIH0KKworICBwdWJsaWMgdm9pZCBvdXRwdXRSREYoTGlzdDxQcm9kdWN0PiBwcm9kdWN0cywgUHJvZHVjdFR5cGUgdHlwZSwgU3RyaW5nIGJhc2UsCisgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgIHRyeSB7CisgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgRG9jdW1lbnQgZG9jID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCisgICAgICBFbGVtZW50IHJkZiA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBkb2MsICJyZGY6UkRGIik7CisgICAgICBSREZVdGlscy5hZGROYW1lc3BhY2VzKGRvYywgcmRmLCB0aGlzLnJkZkNvbmYpOworCisgICAgICBmb3IgKEl0ZXJhdG9yPFByb2R1Y3Q+IGkgPSBwcm9kdWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgUHJvZHVjdCBwID0gaS5uZXh0KCk7CisKKyAgICAgICAgU3RyaW5nIHByb2R1Y3RUeXBlSWRTdHIgPSBwLmdldFByb2R1Y3RUeXBlKCkuZ2V0UHJvZHVjdFR5cGVJZCgpOworICAgICAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgIHByb2R1Y3RUeXBlID0gdHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGUgPSBmQ2xpZW50LmdldFByb2R1Y3RUeXBlQnlJZChwcm9kdWN0VHlwZUlkU3RyKTsKKyAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gcHJvZHVjdCB0eXBlIGZyb20gcHJvZHVjdCB0eXBlIGlkOiBbIgorICAgICAgICAgICAgICAgICAgICArICgoUHJvZHVjdCkgcHJvZHVjdHMuZ2V0KDApKS5nZXRQcm9kdWN0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdFR5cGVJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcC5zZXRQcm9kdWN0VHlwZShwcm9kdWN0VHlwZSk7CisKKyAgICAgICAgRWxlbWVudCBwcm9kdWN0UmRmRGVzYyA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByZGYsIHRoaXMucmRmQ29uZgorICAgICAgICAgICAgLmdldFR5cGVOcyhwcm9kdWN0VHlwZS5nZXROYW1lKCkpCisgICAgICAgICAgICArICI6IiArIHByb2R1Y3RUeXBlLmdldE5hbWUoKSk7CisgICAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHByb2R1Y3RSZGZEZXNjLCAicmRmOmFib3V0IiwgYmFzZQorICAgICAgICAgICAgKyAiP3Byb2R1Y3RJRD0iICsgcC5nZXRQcm9kdWN0SWQoKSk7CisKKyAgICAgICAgLy8gbm93IGFkZCBhbGwgaXRzIG1ldGFkYXRhCisgICAgICAgIE1ldGFkYXRhIHByb2RNZXRhZGF0YSA9IHNhZmVHZXRNZXRhZGF0YShwKTsKKworICAgICAgICAvLyBmb3IgYWxsIG9mIGl0cyBtZXRhZGF0YSBrZXlzIGFuZCB2YWx1ZXMsIGxvb3AgdGhyb3VnaCB0aGVtCisgICAgICAgIC8vIGFuZCBhZGQgUkRGIG5vZGVzIHVuZGVybmVhdGggdGhlIFJkZkRlc2MgZm9yIHRoaXMgcHJvZHVjdAorCisgICAgICAgIGlmIChwcm9kTWV0YWRhdGEgIT0gbnVsbCkgeworICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBqID0gcHJvZE1ldGFkYXRhLmdldEhhc2h0YWJsZSgpLmtleVNldCgpCisgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBqLm5leHQoKTsKKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHMgPSBwcm9kTWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5KTsKKworICAgICAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCAmJiB2YWxzLnNpemUoKSA+IDApIHsKKworICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gayA9IHZhbHMuaXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIGsubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXRLZXkgPSBrZXk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEtleS5pbmRleE9mKCIgIikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgIG91dHB1dEtleSA9IFN0cmluZ1V0aWxzLmpvaW4oV29yZFV0aWxzLmNhcGl0YWxpemVGdWxseShvdXRwdXRLZXkpLnNwbGl0KAorICAgICAgICAgICAgICAgICAgICAgICIgIikpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFsID0gU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlWG1sKHZhbCk7CisgICAgICAgICAgICAgICAgRWxlbWVudCByZGZFbGVtID0gUkRGVXRpbHMuZ2V0UkRGRWxlbWVudChvdXRwdXRLZXksIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZGZDb25mLCBkb2MpOworICAgICAgICAgICAgICAgIHByb2R1Y3RSZGZEZXNjLmFwcGVuZENoaWxkKHJkZkVsZW0pOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICBET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOworICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJpbmRlbnQiLCAieWVzIik7CisgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChyZXNwLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7CisgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworCisgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIExpc3Q8UHJvZHVjdD4gYWdncmVnYXRlUGFnZWRQcm9kdWN0cygpIHsKKyAgICBMaXN0PFByb2R1Y3RUeXBlPiB0eXBlcyA9IHNhZmVHZXRQcm9kdWN0VHlwZXMoKTsKKyAgICBMaXN0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbnVsbDsKKworICAgIGlmICh0eXBlcyAhPSBudWxsICYmIHR5cGVzLnNpemUoKSA+IDApIHsKKyAgICAgIHByb2R1Y3RzID0gbmV3IFZlY3RvcjxQcm9kdWN0PigpOworICAgICAgZm9yIChJdGVyYXRvcjxQcm9kdWN0VHlwZT4gaSA9IHR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICBQcm9kdWN0VHlwZSB0eXBlID0gaS5uZXh0KCk7CisKKyAgICAgICAgUHJvZHVjdFBhZ2UgcGFnZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwYWdlID0gZkNsaWVudC5nZXRGaXJzdFBhZ2UodHlwZSk7CisKKyAgICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIHByb2R1Y3RzLmFkZEFsbChwYWdlLmdldFBhZ2VQcm9kdWN0cygpKTsKKyAgICAgICAgICAgICAgaWYgKCFwYWdlLmlzTGFzdFBhZ2UoKSkgeworICAgICAgICAgICAgICAgIHBhZ2UgPSBmQ2xpZW50LmdldE5leHRQYWdlKHR5cGUsIHBhZ2UpOworICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2R1Y3RzOworICB9CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBzYWZlR2V0TWV0YWRhdGEoUHJvZHVjdCBwKSB7CisgICAgTWV0YWRhdGEgbWV0ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBtZXQgPSBmQ2xpZW50LmdldE1ldGFkYXRhKHApOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIHJldHJpZXZpbmcgbWV0YWRhdGEgZm9yIHByb2R1Y3Q6IFsiCisgICAgICAgICAgKyBwLmdldFByb2R1Y3RJZCgpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1ldDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxQcm9kdWN0VHlwZT4gc2FmZUdldFByb2R1Y3RUeXBlcygpIHsKKyAgICBMaXN0PFByb2R1Y3RUeXBlPiB0eXBlcyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgdHlwZXMgPSBmQ2xpZW50LmdldFByb2R1Y3RUeXBlcygpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciByZXRyaWV2aW5nIHByb2R1Y3QgdHlwZXM6IE1lc3NhZ2U6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZXM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9SREZVdGlscy5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9SREZVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDQ1OTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcmRmL1JERlV0aWxzLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmLlJERkNvbmZpZ01ldEtleXMuUkRGX0NPTlRFWFRfQ09ORl9LRVk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIAorICogVXRpbGl0eSBjbGFzcyB0byBsZXZlcmFnZSB0aGUge0BsaW5rIFJERkNvbmZpZ30gdG8gZGV0ZXJtaW5lIGhvdyB0byBkaXNwbGF5CisgKiBhbiBSREYgdGFnLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJERlV0aWxzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkRGX1JFU19BVFRSID0gInJkZjpyZXNvdXJjZSI7CisKKyAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldFJERkVsZW1lbnQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbCwgUkRGQ29uZmlnIGNvbmYsCisgICAgICBEb2N1bWVudCBkb2MpIHsKKyAgICAvLyBmaXJzdCBhcHBseSB0aGUgcmV3cml0ZSBydWxlcworICAgIFN0cmluZyB0YWdOYW1lID0gY29uZi5nZXRSZXdyaXRlTWFwKCkuY29udGFpbnNLZXkoa2V5KSA/IGNvbmYKKyAgICAgICAgLmdldFJld3JpdGVNYXAoKS5nZXQoa2V5KSA6IGtleTsKKworICAgIC8vIGRvZXMgdGhpcyB0YWcgaGF2ZSBhIG5hbWVzcGFjZT8gaWYgbm90LCB1c2UgdGhlIGRlZmF1bHQKKyAgICBTdHJpbmcgbnMgPSBjb25mLmdldEtleU5zKGtleSk7CisgICAgRWxlbWVudCBlbGVtID0gbnVsbDsKKyAgICAvLyBpcyB0aGlzIGEgcmVzb3VyY2UgbGluaz8KKyAgICBpZiAoY29uZi5nZXRSZXNMaW5rTWFwKCkuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KG5zICsgIjoiICsgdGFnTmFtZSk7CisgICAgICBTdHJpbmcgbGlua0Jhc2UgPSBjb25mLmdldFJlc0xpbmtNYXAoKS5nZXQoa2V5KS5lbmRzV2l0aCgiLyIpID8gY29uZgorICAgICAgICAgIC5nZXRSZXNMaW5rTWFwKCkuZ2V0KGtleSkgOiBjb25mLmdldFJlc0xpbmtNYXAoKS5nZXQoa2V5KSArICIvIjsKKyAgICAgIGVsZW0uc2V0QXR0cmlidXRlKFJERl9SRVNfQVRUUiwgbGlua0Jhc2UgKyB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICBlbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQobnMgKyAiOiIgKyB0YWdOYW1lKTsKKyAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHZhbCkpOworICAgIH0KKworICAgIHJldHVybiBlbGVtOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hbWVzcGFjZXMoRG9jdW1lbnQgZG9jLCBFbGVtZW50IHJkZiwgUkRGQ29uZmlnIHJkZkNvbmYpIHsKKyAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHJkZkNvbmYuZ2V0TnNNYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpCisgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICBTdHJpbmcgbnNOYW1lID0gaS5uZXh0KCk7CisgICAgICBTdHJpbmcgbnNVcmwgPSByZGZDb25mLmdldE5zTWFwKCkuZ2V0KG5zTmFtZSk7CisKKyAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJkZiwgInhtbG5zOiIgKyBuc05hbWUsIG5zVXJsKTsKKyAgICB9CisgIH0KKyAgCisKKyAgcHVibGljIHN0YXRpYyBSREZDb25maWcgaW5pdFJERihTZXJ2bGV0Q29uZmlnIGNvbmYpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgIHJldHVybiBSREZDb25maWdSZWFkZXIucmVhZENvbmZpZyhuZXcgRmlsZShQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjb25mCisgICAgICAgIC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoKFJERl9DT05URVhUX0NPTkZfS0VZKSkpKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NDb25maWcuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2OTQ0OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTQ29uZmlnLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucnNzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBSU1NQcm9kdWN0U2VydmxldH0sIHdpdGggdGhlIGluZm9ybWF0aW9uCisgKiBkZWZpbmVkIGluIGFuIHJzc2NvbmYueG1sIGZpbGUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUlNTQ29uZmlnIHsKKworICBwcml2YXRlIExpc3Q8UlNTVGFnPiB0YWdzOworICBwcml2YXRlIExpc3Q8UlNTTmFtZXNwYWNlPiBuYW1lc3BhY2VzOworICAKKyAgcHJpdmF0ZSBTdHJpbmcgY2hhbm5lbExpbms7CisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAqLworICBwdWJsaWMgUlNTQ29uZmlnKCkgeworICAgIHRoaXMuY2hhbm5lbExpbmsgPSBudWxsOworICAgIHRoaXMudGFncyA9IG5ldyBWZWN0b3I8UlNTVGFnPigpOworICAgIHRoaXMubmFtZXNwYWNlcyA9IG5ldyBWZWN0b3I8UlNTTmFtZXNwYWNlPigpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHRhZ3MKKyAgICovCisgIHB1YmxpYyBMaXN0PFJTU1RhZz4gZ2V0VGFncygpIHsKKyAgICByZXR1cm4gdGFnczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdGFncworICAgKiAgICAgICAgICB0aGUgdGFncyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRhZ3MoTGlzdDxSU1NUYWc+IHRhZ3MpIHsKKyAgICB0aGlzLnRhZ3MgPSB0YWdzOworICB9CisgIAorICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZXNwYWNlcworICAgKi8KKyAgcHVibGljIExpc3Q8UlNTTmFtZXNwYWNlPiBnZXROYW1lc3BhY2VzKCkgeyAKKyAgICByZXR1cm4gbmFtZXNwYWNlczsgCisgIH0KKyAgCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZXNwYWNlcworICAgKiAgICAgICAgICB0aGUgbmFtZXNwYWNlcyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZXMoTGlzdDxSU1NOYW1lc3BhY2U+IG5hbWVzcGFjZXMpIHsgCisgICAgdGhpcy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsgCisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgY2hhbm5lbExpbmsKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbm5lbExpbmsoKSB7CisgICAgcmV0dXJuIGNoYW5uZWxMaW5rOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjaGFubmVsTGluayB0aGUgY2hhbm5lbExpbmsgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDaGFubmVsTGluayhTdHJpbmcgY2hhbm5lbExpbmspIHsKKyAgICB0aGlzLmNoYW5uZWxMaW5rID0gY2hhbm5lbExpbms7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NDb25maWdNZXRLZXlzLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU0NvbmZpZ01ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjlkNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NDb25maWdNZXRLZXlzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucnNzOworCisvKioKKyAqIAorICogTWV0IGtleXMgdXNlZCBieSB7QGxpbmsgUlNTVXRpbHN9IGFuZCBvdGhlciBjbGFzc2VzIHRoYXQgZGVhbCB3aXRoIHRoZQorICoge0BsaW5rIFJTU0NvbmZpZ30gb2JqZWN0LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBSU1NDb25maWdNZXRLZXlzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSU1NfQ09OVEVYVF9DT05GX0tFWSA9ICJmaWxlbWdyLnJzc2NvbmYuZmlsZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTU19UUkFOU0ZFUl9DT05GX0tFWSA9ICJmaWxlbWdyLnJzcy10cmFuc2Zlci1jb25mLmZpbGUiOworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NDb25maWdSZWFkZXIuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTQ29uZmlnUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZDM4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTQ29uZmlnUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiAKKyAqIFJlYWRlciBjbGFzcyBmb3Ige0BsaW5rIFJTU0NvbmZpZ31zIGZyb20ge0BsaW5rIEZpbGV9cy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSU1NDb25maWdSZWFkZXIgaW1wbGVtZW50cyBSU1NDb25maWdSZWFkZXJNZXRLZXlzIHsKKworICAvKioKKyAgICogUmVhZHMgYW4ge0BsaW5rIFJTU0NvbmZpZ30gZnJvbSBhIHtAbGluayBGaWxlfS4KKyAgICogCisgICAqIEBwYXJhbSBmaWxlCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgRmlsZX0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBSU1NDb25maWd9LgorICAgKiBAcmV0dXJuIEFuIHtAbGluayBSU1NDb25maWd9IGluaXRpYWxpemVkIHdpdGggdGhlIGluZm9ybWF0aW9uIHJlYWQgZnJvbSB0aGUKKyAgICogICAgICAgICBnaXZlbiB7QGxpbmsgRmlsZX0uCisgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiB0aGUge0BsaW5rIEZpbGV9IGlzIG5vdCBmb3VuZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgUlNTQ29uZmlnIHJlYWRDb25maWcoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBSU1NDb25maWcgY29uZiA9IG5ldyBSU1NDb25maWcoKTsKKworICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICBFbGVtZW50IHJvb3RFbGVtID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgIGNvbmYuc2V0Q2hhbm5lbExpbmsocm9vdEVsZW0uZ2V0QXR0cmlidXRlKENIQU5ORUxfTElOS19BVFRSKSk7CisKKyAgICByZWFkTmFtZXNwYWNlcyhyb290RWxlbSwgY29uZik7CisgICAgcmVhZFRhZ3Mocm9vdEVsZW0sIGNvbmYpOworICAgIHJldHVybiBjb25mOworICB9CisgIAorICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVhZE5hbWVzcGFjZXMoRWxlbWVudCByb290LCBSU1NDb25maWcgY29uZikgeworICAgIE5vZGVMaXN0IG5hbWVzcGFjZUxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKE5BTUVTUEFDRV9UQUcpOworICAgIGlmIChuYW1lc3BhY2VMaXN0ICE9IG51bGwgJiYgbmFtZXNwYWNlTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIEVsZW1lbnQgbmFtZXNwYWNlRWxlbSA9IChFbGVtZW50KSBuYW1lc3BhY2VMaXN0Lml0ZW0oaSk7CisgICAgICAgIFJTU05hbWVzcGFjZSBuYW1lc3BhY2UgPSBuZXcgUlNTTmFtZXNwYWNlKCk7CisgICAgICAgIG5hbWVzcGFjZS5zZXRQcmVmaXgobmFtZXNwYWNlRWxlbS5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX0FUVFJfUFJFRklYKSk7CisgICAgICAgIG5hbWVzcGFjZS5zZXRVcmkobmFtZXNwYWNlRWxlbS5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX0FUVFJfVVJJKSk7CisgICAgICAgIGNvbmYuZ2V0TmFtZXNwYWNlcygpLmFkZChuYW1lc3BhY2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWFkVGFncyhFbGVtZW50IHJvb3QsIFJTU0NvbmZpZyBjb25mKSB7CisgICAgTm9kZUxpc3QgdGFnTGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX1RBRyk7CisgICAgaWYgKHRhZ0xpc3QgIT0gbnVsbCAmJiB0YWdMaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCB0YWdFbGVtID0gKEVsZW1lbnQpIHRhZ0xpc3QuaXRlbShpKTsKKyAgICAgICAgUlNTVGFnIHRhZyA9IG5ldyBSU1NUYWcoKTsKKyAgICAgICAgdGFnLnNldE5hbWUodGFnRWxlbS5nZXRBdHRyaWJ1dGUoVEFHX0FUVFJfTkFNRSkpOworCisgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBpdCBoYXMgYSBzb3VyY2UKKyAgICAgICAgaWYgKHRhZ0VsZW0uZ2V0QXR0cmlidXRlTm9kZShUQUdfQVRUUl9TT1VSQ0UpICE9IG51bGwpIHsKKyAgICAgICAgICB0YWcuc2V0U291cmNlKHRhZ0VsZW0uZ2V0QXR0cmlidXRlKFRBR19BVFRSX1NPVVJDRSkpOworICAgICAgICB9CisKKyAgICAgICAgcmVhZEF0dHJzKHRhZ0VsZW0sIHRhZyk7CisgICAgICAgIGNvbmYuZ2V0VGFncygpLmFkZCh0YWcpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWFkQXR0cnMoRWxlbWVudCB0YWdFbGVtLCBSU1NUYWcgdGFnKSB7CisgICAgTm9kZUxpc3QgYXR0clRhZ0xpc3QgPSB0YWdFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKEFUVFJJQlVURV9UQUcpOworCisgICAgaWYgKGF0dHJUYWdMaXN0ICE9IG51bGwgJiYgYXR0clRhZ0xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJUYWdMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCBhdHRyVGFnID0gKEVsZW1lbnQpIGF0dHJUYWdMaXN0Lml0ZW0oaSk7CisgICAgICAgIFJTU1RhZ0F0dHJpYnV0ZSBhdHRyID0gbmV3IFJTU1RhZ0F0dHJpYnV0ZSgpOworICAgICAgICBhdHRyLnNldE5hbWUoYXR0clRhZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0FUVFJfTkFNRSkpOworICAgICAgICBhdHRyLnNldFZhbHVlKGF0dHJUYWcuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9BVFRSX1ZBTFVFKSk7CisgICAgICAgIHRhZy5nZXRBdHRycygpLmFkZChhdHRyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NDb25maWdSZWFkZXJNZXRLZXlzLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU0NvbmZpZ1JlYWRlck1ldEtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzAwMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NDb25maWdSZWFkZXJNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucnNzOworCisvKioKKyAqIAorICogTWV0IGtleXMgdXNlZCBieSB0aGUge0BsaW5rIFJTU0NvbmZpZ1JlYWRlcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJTU0NvbmZpZ1JlYWRlck1ldEtleXMgeworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTk5FTF9MSU5LX0FUVFIgPSAiY2hhbm5lbExpbmsiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1RBRyA9ICJuYW1lc3BhY2UiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJfUFJFRklYID0gInByZWZpeCI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUl9VUkkgPSAidXJpIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVEFHID0gInRhZyI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfTkFNRSA9ICJuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9TT1VSQ0UgPSAic291cmNlIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVEFHID0gImF0dHJpYnV0ZSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0FUVFJfTkFNRSA9ICJuYW1lIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQVRUUl9WQUxVRSA9ICJ2YWx1ZSI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTTmFtZXNwYWNlLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU05hbWVzcGFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMGY2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU05hbWVzcGFjZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzczsKKworLyoqCisgKiAKKyAqIFJTUyBuYW1lc3BhY2UgZGVmaW5pdGlvbiB0byBpbmNsdWRlIGluIGFuIFJTUyBmZWVkIGFzIGRlZmluZWQgYnkgdGhlCisgKiB7QGxpbmsgUlNTUHJvZHVjdFNlcnZsZXR9J3Mge0BsaW5rIFJTU0NvbmZpZ30uCisgKiAKKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJTU05hbWVzcGFjZSAKK3sKKyAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworICBwcml2YXRlIFN0cmluZyB1cmk7CisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAqLworICBwdWJsaWMgUlNTTmFtZXNwYWNlKCkgeyB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHByZWZpeAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7IHJldHVybiBwcmVmaXg7IH0KKworICAvKioKKyAgICogQHBhcmFtIHByZWZpeAorICAgKiAgICAgICAgICB0aGUgcHJlZml4IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsgdGhpcy5wcmVmaXggPSBwcmVmaXg7fQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB1cmkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgeyByZXR1cm4gdXJpOyB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB1cmkKKyAgICogICAgICAgICAgdGhlIHVyaSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7IHRoaXMudXJpID0gdXJpOyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NQcm9kdWN0U2VydmxldC5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NQcm9kdWN0U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiM2U2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1Byb2R1Y3RTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ2F0YWxvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlNYW5hZ2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLyoqCisgKiBBIFNlcnZsZXQgdGhhdCBzdXBwb3J0cyB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9mZWVkdmFsaWRhdG9yLm9yZy9kb2NzL3JzczIuaHRtbCI+UlNTIDIuMDwvYT4gc3BlY2lmaWNhdGlvbiBmb3IKKyAqIGRlbGl2ZXJpbmcgUHJvZHVjdCBGZWVkcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJTU1Byb2R1Y3RTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgIC8qIHNlcmlhbCBWZXJzaW9uIFVJRCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY1MzIxNzM4MjM5ODg1Nzc3TDsKKworICAvKiBvdXIgY2xpZW50IHRvIHRoZSBmaWxlIG1hbmFnZXIgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQgZm0gPSBudWxsOworCisgIC8qIHJzcyBjb25maWcgKi8KKyAgcHJpdmF0ZSBSU1NDb25maWcgY29uZjsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJTU1Byb2R1Y3RTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0JPSUxFUl9QTEFURSA9ICJDb3B5cmlnaHQgMjAxMDogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTU19GT1JNQVRfU1RSID0gIkUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIHoiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCisgICAgICBSU1NfRk9STUFUX1NUUik7CisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAqLworICBwdWJsaWMgUlNTUHJvZHVjdFNlcnZsZXQoKSB7CisgIH0KKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIHNlcnZsZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuaW5pdChjb25maWcpOworCisgICAgU3RyaW5nIGZpbGVNYW5hZ2VyVXJsOworCXRyeSB7CisJCWZpbGVNYW5hZ2VyVXJsID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKwkJICAgICJmaWxlbWdyLnVybCIpICk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZmlsZW1nciB1cmwgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCX0KKyAgICBpZiAoZmlsZU1hbmFnZXJVcmwgPT0gbnVsbCkgeworICAgICAgLy8gdHJ5IHRoZSBkZWZhdWx0IHBvcnQKKyAgICAgIGZpbGVNYW5hZ2VyVXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCI7CisgICAgfQorCisgICAgdGhpcy5nZXRGaWxlTWFuYWdlcihmaWxlTWFuYWdlclVybCk7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuY29uZiA9IFJTU1V0aWxzLmluaXRSU1MoY29uZmlnKTsKKyAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIGRvSXQocmVxLCByZXNwKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgZG9JdChyZXEsIHJlc3ApOworICB9CisKKyAgcHVibGljIHZvaWQgZG9JdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisKKyAgICAvLyBuZWVkIHRvIGtub3cgdGhlIHR5cGUgb2YgcHJvZHVjdCB0byBnZXQgcHJvZHVjdHMgZm9yCisgICAgU3RyaW5nIHByb2R1Y3RUeXBlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoImNoYW5uZWwiKTsKKyAgICBTdHJpbmcgcHJvZHVjdFR5cGVJZCA9IHJlcS5nZXRQYXJhbWV0ZXIoImlkIik7CisgICAgU3RyaW5nIHRvcE4gPSByZXEuZ2V0UGFyYW1ldGVyKCJ0b3BuIik7CisgICAgUHJvZHVjdFR5cGUgdHlwZSA9IG51bGw7CisgICAgaW50IHRvcCA9IDIwOworCisgICAgaWYgKHRvcE4gIT0gbnVsbCkgeworICAgICAgdG9wID0gSW50ZWdlci52YWx1ZU9mKHRvcE4pLmludFZhbHVlKCk7CisgICAgfQorCisgICAgU3RyaW5nIHJlcXVlc3RVcmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nIGJhc2UgPSByZXF1ZXN0VXJsLnN1YnN0cmluZygwLCByZXF1ZXN0VXJsLmxhc3RJbmRleE9mKCcvJykpOworCisgICAgTWV0YWRhdGEgY2hhbm5lbE1ldCA9IG5ldyBNZXRhZGF0YSgpOworICAgIGNoYW5uZWxNZXQuYWRkTWV0YWRhdGEoIlByb2R1Y3RUeXBlIiwgcHJvZHVjdFR5cGVOYW1lKTsKKyAgICBjaGFubmVsTWV0LmFkZE1ldGFkYXRhKCJQcm9kdWN0VHlwZUlkIiwgcHJvZHVjdFR5cGVJZCk7CisgICAgY2hhbm5lbE1ldC5hZGRNZXRhZGF0YSgiVG9wTiIsIFN0cmluZy52YWx1ZU9mKHRvcE4pKTsKKyAgICBjaGFubmVsTWV0LmFkZE1ldGFkYXRhKCJCYXNlVXJsIiwgYmFzZSk7CisKKyAgICBMaXN0IHByb2R1Y3RzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBpZiAocHJvZHVjdFR5cGVOYW1lLmVxdWFscygiQUxMIikpIHsKKyAgICAgICAgcHJvZHVjdHMgPSBmbS5nZXRUb3BOUHJvZHVjdHModG9wKTsKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0eXBlID0gZm0uZ2V0UHJvZHVjdFR5cGVCeUlkKHByb2R1Y3RUeXBlSWQpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5TWFuYWdlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgdHlwZSBmcm9tIHByb2R1Y3QgdHlwZSBpZDogWyIKKyAgICAgICAgICAgICAgICAgICsgcHJvZHVjdFR5cGVJZCArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByb2R1Y3RzID0gZm0uZ2V0VG9wTlByb2R1Y3RzKHRvcCwgdHlwZSk7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChDYXRhbG9nRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cKKyAgICAgICAgICAubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBwcm9kdWN0cyBmcm9tIENhdGFsb2c6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwcm9kdWN0cyAhPSBudWxsICYmIHByb2R1Y3RzLnNpemUoKSA+IDApIHsKKyAgICAgIFN0cmluZyBjaGFubmVsRGVzYyA9IG51bGw7CisKKyAgICAgIGlmICghcHJvZHVjdFR5cGVOYW1lLmVxdWFscygiQUxMIikpIHsKKyAgICAgICAgY2hhbm5lbERlc2MgPSB0eXBlLmdldERlc2NyaXB0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGFubmVsRGVzYyA9ICJBTEwiOworICAgICAgfQorCisgICAgICB0cnkgeworCisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCisgICAgICAgIEVsZW1lbnQgcnNzID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIGRvYywgInJzcyIpOworICAgICAgICBYTUxVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCByc3MsICJ2ZXJzaW9uIiwgIjIuMCIpOworICAgICAgICAKKyAgICAgICAgLy8gYWRkIG5hbWVzcGFjZSBhdHRyaWJ1dGVzIGZyb20gY29uZmlnIGZpbGUgdG8gcnNzIHRhZworICAgICAgICBmb3IgKFJTU05hbWVzcGFjZSBuYW1lc3BhY2UgOiB0aGlzLmNvbmYuZ2V0TmFtZXNwYWNlcygpKSAKKyAgICAgICAgeworICAgICAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJzcywgInhtbG5zOiIgKyBuYW1lc3BhY2UuZ2V0UHJlZml4KCksIG5hbWVzcGFjZS5nZXRVcmkoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEVsZW1lbnQgY2hhbm5lbCA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByc3MsICJjaGFubmVsIik7CisKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJ0aXRsZSIsIHByb2R1Y3RUeXBlTmFtZSk7CisgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAibGluayIsIFJTU1V0aWxzLmdldENoYW5uZWxMaW5rKAorICAgICAgICAgICAgdGhpcy5jb25mLmdldENoYW5uZWxMaW5rKCksIGNoYW5uZWxNZXQpKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJkZXNjcmlwdGlvbiIsIGNoYW5uZWxEZXNjKTsKKworICAgICAgICBTdHJpbmcgYnVpbGRQdWJEYXRlID0gZGF0ZUZvcm1hdHRlci5mb3JtYXQobmV3IERhdGUoKSk7CisKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsYW5ndWFnZSIsICJlbi11cyIpOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImNvcHlyaWdodCIsIENPUFlSSUdIVF9CT0lMRVJfUExBVEUpOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgInB1YkRhdGUiLCBidWlsZFB1YkRhdGUpOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImNhdGVnb3J5IiwgcHJvZHVjdFR5cGVOYW1lKTsKKyAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJnZW5lcmF0b3IiLCAiQ0FTIEZpbGUgTWFuYWdlciIpOworICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImxhc3RCdWlsZERhdGUiLCBidWlsZFB1YkRhdGUpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2R1Y3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgIFByb2R1Y3QgcCA9IChQcm9kdWN0KSBpLm5leHQoKTsKKworICAgICAgICAgIFN0cmluZyBwcm9kdWN0VHlwZUlkU3RyID0gcC5nZXRQcm9kdWN0VHlwZSgpLmdldFByb2R1Y3RUeXBlSWQoKTsKKyAgICAgICAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG51bGw7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvZHVjdFR5cGUgPSBmbS5nZXRQcm9kdWN0VHlwZUJ5SWQocHJvZHVjdFR5cGVJZFN0cik7CisgICAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU1hbmFnZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICJVbmFibGUgdG8gb2J0YWluIHByb2R1Y3QgdHlwZSBmcm9tIHByb2R1Y3QgdHlwZSBpZDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyAoKFByb2R1Y3QpIHByb2R1Y3RzLmdldCgwKSkuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RUeXBlSWQoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHAuc2V0UHJvZHVjdFR5cGUocHJvZHVjdFR5cGUpOworICAgICAgICAgIHAuc2V0UHJvZHVjdFJlZmVyZW5jZXMoc2FmZUdldFByb2R1Y3RSZWZlcmVuY2VzKHApKTsKKworICAgICAgICAgIEVsZW1lbnQgaXRlbSA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiaXRlbSIpOworCisgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJ0aXRsZSIsIHAuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJkZXNjcmlwdGlvbiIsIHAuZ2V0UHJvZHVjdFR5cGUoKQorICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgaXRlbSwgImxpbmsiLCBiYXNlICsgIi9kYXRhP3Byb2R1Y3RJRD0iCisgICAgICAgICAgICAgICsgcC5nZXRQcm9kdWN0SWQoKSk7CisKKyAgICAgICAgICBNZXRhZGF0YSBtID0gdGhpcy5zYWZlR2V0TWV0YWRhdGEocCk7CisgICAgICAgICAgU3RyaW5nIHByb2R1Y3RSZWNlaXZlZFRpbWUgPSBtLmdldE1ldGFkYXRhKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIpOworICAgICAgICAgIERhdGUgcmVjZWl2ZWRUaW1lID0gbnVsbDsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWNlaXZlZFRpbWUgPSBEYXRlQ29udmVydC5pc29QYXJzZShwcm9kdWN0UmVjZWl2ZWRUaW1lKTsKKyAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmVjZWl2ZWRUaW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAicHViRGF0ZSIsIGRhdGVGb3JtYXR0ZXIKKyAgICAgICAgICAgICAgICAuZm9ybWF0KHJlY2VpdmVkVGltZSkpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGFkZCBtZXQgZmllbGQgZm9yIEZpbGVTaXplIGZvciB1c2UgaW4gUlNTIGVudmVsb3BlCisgICAgICAgICAgaWYgKHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKSAhPSBudWxsCisgICAgICAgICAgICAgICYmIHAuZ2V0UHJvZHVjdFJlZmVyZW5jZXMoKS5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgbS5hZGRNZXRhZGF0YSgiRmlsZVNpemUiLCBTdHJpbmcudmFsdWVPZihwLmdldFByb2R1Y3RSZWZlcmVuY2VzKCkKKyAgICAgICAgICAgICAgICAuZ2V0KDApLmdldEZpbGVTaXplKCkpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCBlbGVtZW50cyBmcm9tIHRoZSBSU1NDb25maWcKKyAgICAgICAgICBmb3IgKFJTU1RhZyB0YWcgOiB0aGlzLmNvbmYuZ2V0VGFncygpKSB7CisgICAgICAgICAgICBpdGVtLmFwcGVuZENoaWxkKFJTU1V0aWxzLmVtaXRSU1NUYWcodGFnLCBtLCBkb2MsIGl0ZW0pKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIERPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7CisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImluZGVudCIsICJ5ZXMiKTsKKyAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQocmVzcC5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7CisgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisKKyAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICB9CisKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgTWV0YWRhdGEgc2FmZUdldE1ldGFkYXRhKFByb2R1Y3QgcCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gZm0uZ2V0TWV0YWRhdGEocCk7CisgICAgfSBjYXRjaCAoQ2F0YWxvZ0V4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIGlnbm9yZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgTGlzdDxSZWZlcmVuY2U+IHNhZmVHZXRQcm9kdWN0UmVmZXJlbmNlcyhQcm9kdWN0IHApIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZtLmdldFByb2R1Y3RSZWZlcmVuY2VzKHApOworICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICBpZ25vcmUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2V0RmlsZU1hbmFnZXIoU3RyaW5nIGZpbGVNYW5hZ2VyVXJsKSB7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuZm0gPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTChmaWxlTWFuYWdlclVybCkpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgZmlsZSBtYW5hZ2VyIHVybCBpbiBSU1MgU2VydmxldDogW3VybD0iCisgICAgICAgICAgICAgICsgZmlsZU1hbmFnZXJVcmwgKyAiXSwgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmaWxlIG1hbmFnZXIgdXJsIGluIFJTUyBTZXJ2bGV0OiBbdXJsPSIKKyAgICAgICAgICAgICAgKyBmaWxlTWFuYWdlclVybCArICJdLCBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1Byb2R1Y3RUcmFuc2ZlclNlcnZsZXQuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTUHJvZHVjdFRyYW5zZmVyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTUwZGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1Byb2R1Y3RUcmFuc2ZlclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucnNzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzcy5SU1NDb25maWdNZXRLZXlzLlJTU19UUkFOU0ZFUl9DT05GX0tFWTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5leGNlcHRpb25zLkNhdGFsb2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5EYXRhVHJhbnNmZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3lzdGVtLlhtbFJwY0ZpbGVNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBTZXJ2bGV0IHRoYXQgc3VwcG9ydHMgdGhlIDxhCisgKiBocmVmPSJodHRwOi8vZmVlZHZhbGlkYXRvci5vcmcvZG9jcy9yc3MyLmh0bWwiPlJTUyAyLjA8L2E+IHNwZWNpZmljYXRpb24gZm9yCisgKiBkZWxpdmVyaW5nIFByb2R1Y3QgVHJhbnNmZXIgRmVlZHMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFJTU1Byb2R1Y3RUcmFuc2ZlclNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICAvKiBzZXJpYWwgVmVyc2lvbiBVSUQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzk4MzgzMjUxMjgxODMzOTA3OUw7CisKKyAgICAvKiBvdXIgY2xpZW50IHRvIHRoZSBmaWxlIG1hbmFnZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBYbWxScGNGaWxlTWFuYWdlckNsaWVudCBmQ2xpZW50ID0gbnVsbDsKKworICAgIC8qIFJTUyBjb25maWcgKi8KKyAgICBwcml2YXRlIFJTU0NvbmZpZyByc3Njb25mOworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJTU1Byb2R1Y3RUcmFuc2ZlclNlcnZsZXQuY2xhc3MKKyAgICAgICAgICAgIC5nZXROYW1lKCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0JPSUxFUl9QTEFURSA9ICJDb3B5cmlnaHQgMjAxMDogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNTX0ZPUk1BVF9TVFIgPSAiRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgeiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAorICAgICAgICAgICAgUlNTX0ZPUk1BVF9TVFIpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIFJTU1Byb2R1Y3RUcmFuc2ZlclNlcnZsZXQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7CisKKyAgICAgICAgU3RyaW5nIGZpbGVNYW5hZ2VyVXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaWxlTWFuYWdlclVybCA9IFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICJmaWxlbWdyLnVybCIpICk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZmlsZW1nciB1cmwgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGZpbGVNYW5hZ2VyVXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHRyeSB0aGUgZGVmYXVsdCBwb3J0CisgICAgICAgICAgICBmaWxlTWFuYWdlclVybCA9ICJodHRwOi8vbG9jYWxob3N0OjkwMDAiOworICAgICAgICB9CisKKyAgICAgICAgZkNsaWVudCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZDbGllbnQgPSBuZXcgWG1sUnBjRmlsZU1hbmFnZXJDbGllbnQobmV3IFVSTChmaWxlTWFuYWdlclVybCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmaWxlIG1hbmFnZXIgdXJsIGluIFJTUyBTZXJ2bGV0OiBbdXJsPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVNYW5hZ2VyVXJsICsgIl0sIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmaWxlIG1hbmFnZXIgdXJsIGluIFJTUyBTZXJ2bGV0OiBbdXJsPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVNYW5hZ2VyVXJsICsgIl0sIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgIHJzc2NvbmYgPSBSU1NDb25maWdSZWFkZXIucmVhZENvbmZpZyhuZXcgRmlsZShQYXRoVXRpbHMKKyAgICAgICAgICAgICAgLnJlcGxhY2VFbnZWYXJpYWJsZXMoY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgIChSU1NfVFJBTlNGRVJfQ09ORl9LRVkpKSkpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgZG9JdChyZXEsIHJlc3ApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGRvSXQocmVxLCByZXNwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0l0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCBjdXJyZW50VHJhbnNmZXJzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3VycmVudFRyYW5zZmVycyA9IGZDbGllbnQuZ2V0Q3VycmVudEZpbGVUcmFuc2ZlcnMoKTsKKyAgICAgICAgfSBjYXRjaCAoRGF0YVRyYW5zZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBjdXJyZW50IHRyYW5zZmVycyBmcm9tIGZpbGUgbWFuYWdlcjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBiYXNlID0gcmVxdWVzdFVybC5zdWJzdHJpbmcoMCwgcmVxdWVzdFVybC5sYXN0SW5kZXhPZignLycpKTsKKworICAgICAgICBpZiAoY3VycmVudFRyYW5zZmVycyAhPSBudWxsICYmIGN1cnJlbnRUcmFuc2ZlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgU3RyaW5nIGNoYW5uZWxEZXNjID0gIkN1cnJlbnQgRmlsZXMgQmVpbmcgVHJhbnNmZXJyZWQgdG8gdGhlIEZpbGUgTWFuYWdlciI7CisKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKworICAgICAgICAgICAgICAgIEVsZW1lbnQgcnNzID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIGRvYywgInJzcyIpOworICAgICAgICAgICAgICAgIFhNTFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsIHJzcywgInZlcnNpb24iLCAiMi4wIik7CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgZnJvbSBjb25maWcgZmlsZSB0byByc3MgdGFnCisgICAgICAgICAgICAgICAgZm9yIChSU1NOYW1lc3BhY2UgbmFtZXNwYWNlIDogcnNzY29uZi5nZXROYW1lc3BhY2VzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgcnNzLAorICAgICAgICAgICAgICAgICAgICAgICJ4bWxuczoiICsgbmFtZXNwYWNlLmdldFByZWZpeCgpLCBuYW1lc3BhY2UuZ2V0VXJpKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVsZW1lbnQgY2hhbm5lbCA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCByc3MsICJjaGFubmVsIik7CisKKyAgICAgICAgICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgInRpdGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIE1hbmFnZXIgVHJhbnNmZXJzIik7CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsaW5rIiwgYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiL3ZpZXdUcmFuc2ZlcnMiKTsKKyAgICAgICAgICAgICAgICBYTUxVdGlscy5hZGROb2RlKGRvYywgY2hhbm5lbCwgImRlc2NyaXB0aW9uIiwgY2hhbm5lbERlc2MpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1aWxkUHViRGF0ZSA9IGRhdGVGb3JtYXR0ZXIuZm9ybWF0KG5ldyBEYXRlKCkpOworCisgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJsYW5ndWFnZSIsICJlbi11cyIpOworICAgICAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAiY29weXJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPUFlSSUdIVF9CT0lMRVJfUExBVEUpOworICAgICAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAicHViRGF0ZSIsIGJ1aWxkUHViRGF0ZSk7CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJjYXRlZ29yeSIsICJkYXRhIHRyYW5zZmVyIik7CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJnZW5lcmF0b3IiLCAiQ0FTIEZpbGUgTWFuYWdlciIpOworICAgICAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBjaGFubmVsLCAibGFzdEJ1aWxkRGF0ZSIsIGJ1aWxkUHViRGF0ZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjdXJyZW50VHJhbnNmZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzID0gKEZpbGVUcmFuc2ZlclN0YXR1cykgaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBpdGVtID0gWE1MVXRpbHMuYWRkTm9kZShkb2MsIGNoYW5uZWwsICJpdGVtIik7CisKKyAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJ0aXRsZSIsIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJlbnRQcm9kdWN0KCkuZ2V0UHJvZHVjdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCAiZGVzY3JpcHRpb24iLCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyZW50UHJvZHVjdCgpLmdldFByb2R1Y3RUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJsaW5rIiwgYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi92aWV3VHJhbnNmZXI/cmVmPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRGaWxlUmVmKCkuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIiZzaXplPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXR1cy5nZXRGaWxlUmVmKCkuZ2V0RmlsZVNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgbSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBmQ2xpZW50LmdldE1ldGFkYXRhKHN0YXR1cy5nZXRQYXJlbnRQcm9kdWN0KCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvZHVjdFJlY2VpdmVkVGltZSA9IG0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldGFkYXRhKCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSByZWNlaXZlZFRpbWUgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGltZSA9IERhdGVDb252ZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNvUGFyc2UocHJvZHVjdFJlY2VpdmVkVGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVkVGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuYWRkTm9kZShkb2MsIGl0ZW0sICJwdWJEYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXR0ZXIuZm9ybWF0KHJlY2VpdmVkVGltZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcHJvZHVjdCB0cmFuc2ZlciBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgbS5hZGRNZXRhZGF0YSgiQnl0ZXNUcmFuc2ZlcnJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgc3RhdHVzLmdldEJ5dGVzVHJhbnNmZXJyZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLmFkZE1ldGFkYXRhKCJUb3RhbEJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBzdGF0dXMuZ2V0RmlsZVJlZigpLmdldEZpbGVTaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbS5hZGRNZXRhZGF0YSgiUGVyY2VudENvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBzdGF0dXMuY29tcHV0ZVBjdFRyYW5zZmVycmVkKCkpOworCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhdGFsb2dFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCBlbGVtZW50cyBmcm9tIHRoZSBSU1NDb25maWcKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSU1NUYWcgdGFnIDogcnNzY29uZi5nZXRUYWdzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFwcGVuZENoaWxkKFJTU1V0aWxzLmVtaXRSU1NUYWcodGFnLCBtLCBkb2MsIGl0ZW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJpbmRlbnQiLCAieWVzIik7CisgICAgICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQocmVzcC5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworCisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTVGFnLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1RhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTU0NDcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1RhZy5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogCisgKiBBbiBvdXRwdXQgUlNTIHRhZyB0byBpbmNsdWRlIGluIGFuIFJTUyBmZWVkIGFzIGRlZmluZWQgYnkgdGhlCisgKiB7QGxpbmsgUlNTUHJvZHVjdFNlcnZsZXR9J3Mge0BsaW5rIFJTU0NvbmZpZ30uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUlNTVGFnIHsKKworICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgIHByaXZhdGUgU3RyaW5nIHNvdXJjZTsKKworICBwcml2YXRlIExpc3Q8UlNTVGFnQXR0cmlidXRlPiBhdHRyczsKKworICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICovCisgIHB1YmxpYyBSU1NUYWcoKSB7CisgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICB0aGlzLnNvdXJjZSA9IG51bGw7CisgICAgdGhpcy5hdHRycyA9IG5ldyBWZWN0b3I8UlNTVGFnQXR0cmlidXRlPigpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHNvdXJjZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIHNvdXJjZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gc291cmNlCisgICAqICAgICAgICAgIHRoZSBzb3VyY2UgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgeworICAgIHRoaXMuc291cmNlID0gc291cmNlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGF0dHJzCisgICAqLworICBwdWJsaWMgTGlzdDxSU1NUYWdBdHRyaWJ1dGU+IGdldEF0dHJzKCkgeworICAgIHJldHVybiBhdHRyczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYXR0cnMKKyAgICogICAgICAgICAgdGhlIGF0dHJzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QXR0cnMoTGlzdDxSU1NUYWdBdHRyaWJ1dGU+IGF0dHJzKSB7CisgICAgdGhpcy5hdHRycyA9IGF0dHJzOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTVGFnQXR0cmlidXRlLmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1RhZ0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWE4NzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU1RhZ0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzczsKKworLyoqCisgKiAKKyAqIEFuIGF0dHJpYnV0ZSBvbiBhbiBSU1Mgb3V0cHV0IHRhZywgZ2VuZXJhdGVkIGZyb20gdGhlCisgKiBDQVMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUlNTVGFnQXR0cmlidXRlIHsKKworICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgIC8qKgorICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgKi8KKyAgcHVibGljIFJTU1RhZ0F0dHJpYnV0ZSgpIHsKKyAgICB0aGlzLm5hbWUgPSBudWxsOworICAgIHRoaXMudmFsdWUgPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdmFsdWUKKyAgICogICAgICAgICAgdGhlIHZhbHVlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTVXRpbHMuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTEwYTQxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3Jzcy9SU1NVdGlscy5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LnJzcy5SU1NDb25maWdNZXRLZXlzLlJTU19DT05URVhUX0NPTkZfS0VZOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuV29yZFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEudXRpbC5QYXRoVXRpbHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogCisgKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoZWxwIG91dCBpbiBjb25maWd1cmluZyB0aGUge0BsaW5rIFJTU1Byb2R1Y3RTZXJ2bGV0fS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSU1NVdGlscyB7CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhbm5lbExpbmsoU3RyaW5nIGNoYW5uZWxMaW5rLCBNZXRhZGF0YSBjaGFubmVsTWV0KSB7CisgICAgaWYgKGNoYW5uZWxMaW5rICE9IG51bGwgJiYgIWNoYW5uZWxMaW5rLmVxdWFscygiIikpIHsKKyAgICAgIHJldHVybiBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhjaGFubmVsTGluaywgY2hhbm5lbE1ldCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZyBjTGluayA9IGNoYW5uZWxNZXQuZ2V0TWV0YWRhdGEoIkJhc2VVcmwiKSArICIvcmRmL2RhdGFzZXQ/dHlwZT0iCisgICAgICArIGNoYW5uZWxNZXQuZ2V0TWV0YWRhdGEoIlByb2R1Y3RUeXBlIikgKyAiJnR5cGVJRD0iCisgICAgICArIGNoYW5uZWxNZXQuZ2V0TWV0YWRhdGEoIlByb2R1Y3RUeXBlSWQiKTsKKyAgICAgIHJldHVybiBjTGluazsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZW1pdFJTU1RhZyhSU1NUYWcgdGFnLCBNZXRhZGF0YSBwcm9kTWV0LCBEb2N1bWVudCBkb2MsCisgICAgICBFbGVtZW50IGl0ZW0pIHsKKyAgICBTdHJpbmcgb3V0cHV0VGFnID0gdGFnLmdldE5hbWUoKTsKKyAgICBpZiAob3V0cHV0VGFnLmluZGV4T2YoIiAiKSAhPSAtMSkgeworICAgICAgb3V0cHV0VGFnID0gU3RyaW5nVXRpbHMuam9pbihXb3JkVXRpbHMuY2FwaXRhbGl6ZUZ1bGx5KG91dHB1dFRhZykuc3BsaXQoCisgICAgICAgICAgIiAiKSk7CisgICAgfQorICAgIEVsZW1lbnQgcnNzTWV0RWxlbSA9IFhNTFV0aWxzLmFkZE5vZGUoZG9jLCBpdGVtLCBvdXRwdXRUYWcpOworCisgICAgLy8gZmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBzb3VyY2UgZGVmaW5lZCwgaWYgc28sIHVzZSB0aGF0IGFzIHRoZSB2YWx1ZQorICAgIGlmICh0YWcuZ2V0U291cmNlKCkgIT0gbnVsbCkgeworICAgICAgcnNzTWV0RWxlbS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlWG1sKFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKAorICAgICAgICAgIHRhZy5nZXRTb3VyY2UoKSwgcHJvZE1ldCkpKSk7CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgZGVmaW5lZCwgYW5kIGlmIHNvLCBhZGQgdG8gdGhlIGF0dHJpYnV0ZXMKKyAgICBmb3IgKFJTU1RhZ0F0dHJpYnV0ZSBhdHRyIDogdGFnLmdldEF0dHJzKCkpIHsKKyAgICAgIHJzc01ldEVsZW0uc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcygKKyAgICAgICAgICBhdHRyLmdldFZhbHVlKCksIHByb2RNZXQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcnNzTWV0RWxlbTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUlNTQ29uZmlnIGluaXRSU1MoU2VydmxldENvbmZpZyBjb25mKQorICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIFJTU0NvbmZpZ1JlYWRlci5yZWFkQ29uZmlnKG5ldyBGaWxlKFBhdGhVdGlscworICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhjb25mLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgICAgIChSU1NfQ09OVEVYVF9DT05GX0tFWSkpKSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvZ2VvcnNzLWNvbmZpZy54bWwgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL2dlb3Jzcy1jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmQ0NzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL2dlb3Jzcy1jb25maWcueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorICBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKyAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworICBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisgIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgQXV0aG9yczogQ2hyaXMgQS4gTWF0dG1hbm4sIFJvc3MgTGFpZGxhdworICBEZXNjcmlwdGlvbjogVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIENBUyBSU1Mgd2ViIHNlcnZpY2UuIFRoZSBtYWluIGFzcGVjdHMKKyAgb2YgdGhpcyBmaWxlIGFyZSB0aGUgYWJpbGl0eSB0byByZWNhc3QgYSBwcm9kdWN0J3MgbWV0YWRhdGEgYXMgcmVsZXZhbnQgUlNTCisgIGNvbXBhdGlibGUgdGFncy4gIFRoaXMgZmlsZSBjb250YWlucyBleGFtcGxlIEdlb1JTUyB0YWdzLgorLS0+CisKKzxjYXM6cnNzY29uZiB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvY2FzIj4KKworICA8IS0tCisgICAgQW4gb3B0aW9uICJjaGFubmVsTGluayIgYXR0cmlidXRlIG1heSBiZSBzZXQgb24gdGhlIGFib3ZlIG91dGVyIHRhZyB0byBzZXQKKyAgICB0aGUgY2hhbm5lbCdzIGxpbmsgYXR0cmlidXRlLgorCisgICAgTWV0YWRhdGEgYXZhaWxhYmxlIGZvciByZXBsYWNlbWVudCBpbiB0aGlzIGF0dHJpYnV0ZSBpczoKKworICAgIEJhc2VVcmw6IHRoZSBiYXNlIFVSTCBmb3IgdGhlIENBUyB3ZWIgc2VydmljZSBsYXllci4KKyAgICBQcm9kdWN0VHlwZUlkOiB0aGUgaWQgcGFzc2VkIHRvIHRoZSBSU1MgY2hhbm5lbCB2aWEgdGhlIGlkIHBhcmFtCisgICAgUHJvZHVjdFR5cGU6IHRoZSBjaGFubmVsIHByb2R1Y3QgdHlwZSBuYW1lIHBhc3NlZCB2aWEgdGhlIGNoYW5uZWwgcGFyYW0KKyAgICBUb3BOOiB0aGUgdG9wbiBwYXJhbSwgaWYgcGFzc2VkLgorICAtLT4KKworICA8IS0tCisgICAgRWFjaCAmbHQ7dGFnJmd0OyB0YWcgZGVmaW5lcyAyIGF0dHJpYnV0ZXM6CisKKyAgICBuYW1lIChyZXF1aXJlZCkgLSB0aGUgUlNTIG91dHB1dCB0YWcgbmFtZQorICAgIHNvdXJjZSAob3B0aW9uYWwpIC0gdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgQ0FTIHByb2R1Y3QncyBtZXRhZGF0YSBhbmQgaXRzCisgICAgYXNzb2NpYXRlZCB2YWx1ZS4KKworICAgIEVhY2ggJmx0O3RhZyZndDsgaGFzIGEgc2V0IG9mICZsdDthdHRyaWJ1dGUmZ3Q7IHRhZ3MsIHdoaWNoIGRlZmluZSBYTUwKKyAgICBhdHRyaWJ1dGVzIG9uIHRoZSBSU1Mgb3V0cHV0IHRhZ3MuIEVhY2ggJmx0O2F0dHJpYnV0ZSZndDsgaGFzIHRoZSBmb2xsb3dpbmcKKyAgICBhdHRyaWJ1dGVzOgorCisgICAgbmFtZSAocmVxdWlyZWQpIC0gdGhlIFJTUyBvdXRwdXQgdGFnIGF0dHJpYnV0ZSBuYW1lCisgICAgdmFsdWUgKHJlcXVpcmVkKSAtIHRoZSBSU1Mgb3V0cHV0IHRhZyBhdHRyaWJ1dGUgdmFsdWUuIEJ5IGRlZmF1bHQgdGhlc2UKKyAgICB2YWx1ZXMgYXJlIHJ1biB0aHJvdWdoIFBhdGhVdGlscyNyZXBsYWNlRW52VmFyaWFibGVzIHdoaWNoIHJlcGxhY2VzIG1ldCBrZXlzCisgICAgdXNpbmcgdGhlIHN0YW5kYXJkIENBUyBtZXQgcmVwbGFjZW1lbnQgc3RyYXRlZ3kuCisgIC0tPgorCisgIDwhLS0KKyAgICBJZiB5b3Ugd2FudCB0byB0dXJuIHlvdXIgQ0FTIEZpbGUgTWFuYWdlciBpbnRvIGEgR2VvUlNTIGJhc2ljIFczQyAoV0dTODQpCisgICAgc2VydmljZSAoc2VlIGh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvKSwgYWRkIHRoZSBmb2xsb3dpbmcgYmxvY2ssCisgICAgYXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSBpbmRleGVkIG1ldCBmaWVsZHMgbmFtZWQgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZSBmb3IKKyAgICB5b3VyIHByb2R1Y3QgKHVwZGF0ZSBhcyBhcHByb3ByaWF0ZSBvdGhlcndpc2UpLgorCisgICAgPG5hbWVzcGFjZSBwcmVmaXg9ImdlbyIgdXJpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjIi8+CisgICAgPHRhZyBuYW1lPSJnZW86bGF0IiBzb3VyY2U9IltMYXRpdHVkZV0iLz4KKyAgICA8dGFnIG5hbWU9Imdlbzpsb25nIiBzb3VyY2U9IltMb25naXR1ZGVdIi8+CisgIC0tPgorCisgIDwhLS0KKyAgICBJZiB5b3Ugd2FudCB0byB0dXJuIHlvdXIgQ0FTIEZpbGUgTWFuYWdlciBpbnRvIGEgR2VvUlNTIHNpbXBsZSBzZXJ2aWNlCisgICAgKHNlZSBodHRwOi8vZ2VvcnNzLm9yZy9zaW1wbGUpLCBhZGQgdGhlIGZvbGxvd2luZyBibG9jaywgYXNzdW1pbmcgdGhhdCB5b3UKKyAgICBoYXZlIGluZGV4ZWQgbWV0IGZpZWxkcyBuYW1lZCBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIGZvciB5b3VyIHByb2R1Y3QKKyAgICAodXBkYXRlIGFzIGFwcHJvcHJpYXRlIG90aGVyd2lzZSkuCisKKyAgICA8bmFtZXNwYWNlIHByZWZpeD0iZ2VvcnNzIiB1cmk9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiLz4KKyAgICA8dGFnIG5hbWU9Imdlb3Jzczpwb2ludCIgc291cmNlPSJbTGF0aXR1ZGVdIFtMb25naXR1ZGVdIi8+CisgIC0tPgorCisgIDxuYW1lc3BhY2UgcHJlZml4PSJjYXMiIHVyaT0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy9ucy9jYXMiLz4KKyAgPHRhZyBuYW1lPSJjYXM6c291cmNlIiBzb3VyY2U9IltQcm9kdWN0VHlwZV0iLz4KKyAgPHRhZyBuYW1lPSJzb3VyY2UiIHNvdXJjZT0iW1Byb2R1Y3RUeXBlXSIvPgorCis8L2Nhczpyc3Njb25mPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY1MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgaXMgYW4gZXhhbXBsZSBsb2dnaW5nIHByb3BlcnRpZXMgZmlsZSBmb3IgdXNlIGluIHRoZSBkZXBsb3llZCB3ZWIKKyMgYXBwbGljYXRpb24gb24gYW4gQXBhY2hlIFRvbWNhdCB3ZWIgc2VydmVyLgorCisjIExvZyBsZXZlbHM6IE9GRiwgU0VWRVJFLCBXQVJOSU5HLCBJTkZPLCBDT05GSUcsIEZJTkUsIEZJTkVSLCBGSU5FU1QsIEFMTAorCitoYW5kbGVycyA9IG9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlcgorCitvcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIubGV2ZWwgPSBGSU5FCitvcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIuZGlyZWN0b3J5ID0gJHtjYXRhbGluYS5iYXNlfS9sb2dzCitvcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIucHJlZml4ID0gZm1wcm9kLgorCisjIENBUy1Qcm9kdWN0IHNldHRpbmdzCitvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QubGV2ZWwgPSBGSU5FCisKKyMgRmlsZSBtYW5hZ2VyIHNldHRpbmdzCitvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3IubGV2ZWwgPSBTRVZFUkUKKworIyBYTUxSUEMgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBzZXR0aW5ncworb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBXQVJOSU5HCitodHRwY2xpZW50LndpcmUubGV2ZWwgPSBXQVJOSU5HCisKKyMgQXBhY2hlIENYRiBzZXR0aW5ncworb3JnLmFwYWNoZS5jeGYubGV2ZWwgPSBXQVJOSU5HCisKKyMgSkFYQiBzZXR0aW5ncworamF2YXgueG1sLmJpbmQubGV2ZWwgPSBXQVJOSU5HCitjb20uc3VuLnhtbC5iaW5kLmxldmVsID0gV0FSTklORwpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL3Jlc291cmNlcy9yZGZjb25mLnhtbCBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcmRmY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0NDNjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcmRmY29uZi54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorICBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKyAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworICBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICB0aGUgTGljZW5zZS4KKworICBBdXRob3I6IENocmlzIEEuIE1hdHRtYW5uCisgIERlc2NyaXB0aW9uOiBSZWZhY3RvcmVkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByZWxldmFudCBDQVMgUkRGIHdlYiBzZXJ2aWNlCisgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIHRoaXMgZmlsZS4gU2VlIHRhZyBzcGVjaWZpYyBkb2N1bWVudGF0aW9uIGJlbG93CisgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBmaWxlIHRvIGNvbmZpZ3VyZSB0aGUgQ0FTIFJERiB3ZWIgc2VydmljZS4KKy0tPgorPGNhczpyZGZjb25mIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy9ucy9jYXMiPgorICA8IS0tCisgICAgSGVyZSB5b3UgY2FuIGFkZCBhcyBtYW55ICZxdW90O25zJnF1b3Q7IHRhZ3MgYXMgZGVzaXJlZC4gRWFjaCBucyBzaG91bGQKKyAgICBpbmNsdWRlIDxiPmJvdGg8L2I+IGEgbmFtZSBhdHRyaWJ1dGUgYW5kIGEgdmFsdWUgYXR0cmlidXRlLCB3aGVyZSBuYW1lIGFuZAorICAgIHZhbHVlIGFyZSB0aGUgeG1sbnMgbmFtZSBhbmQgdmFsdWUsCisgICAgZS5nLiB4bWxuczombHQ7bmFtZSZndDs9JnF1b3Q7dmFsdWUmcXVvdDsKKyAgLS0+CisgIDxuYW1lc3BhY2VzPgorICAgIDxucyBuYW1lPSJjYXMiIHZhbHVlPSJ1cm46b29kdDoiLz4KKyAgICA8bnMgbmFtZT0icmRmIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIvPgorCisgICAgPCEtLSBhbiBleGFtcGxlIGluY2x1ZGVkIGZyb20gRURSTiAtLT4KKyAgICA8bnMgbmFtZT0iZWRybiIgdmFsdWU9InVybjplZHJuOiIvPgorICAgIDxucyBuYW1lPSJ4IiB2YWx1ZT0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvcmRmL3NjaGVtYS5yZGYjIi8+CisgIDwvbmFtZXNwYWNlcz4KKworICA8IS0tCisgICAgT3B0aW9uYWxseSBzcGVjaWZ5IENBUyBtZXQga2V5cyB0byBiZSByZW5hbWVkIGluIHRoZSBvdXRwdXQgUkRGLiBFYWNoIGtleQorICAgIHRhZyBtdXN0IGluY2x1ZGUgYSA8Yj5mcm9tPC9iPiBhbmQgYSA8Yj50bzwvYj4gYXR0cmlidXRlLCByZW5hbWluZyB0aGUKKyAgICBvcmlnaW5hbCBDQVMgcHJvZHVjdCBtZXQga2V5ICZxdW90O2Zyb20mcXVvdDsgdG8gdGhlIG5ldyBSREYgb3V0cHV0IGtleQorICAgICZxdW90O3RvJnF1b3Q7CisgIC0tPgorICA8cmV3cml0ZT4KKyAgICA8a2V5IGZyb209IlNpdGVJZCIgdG89InNpdGUiLz4KKyAgICA8a2V5IGZyb209IlNpdGVOYW1lIiB0bz0ic2l0ZSIvPgorICAgIDxrZXkgZnJvbT0iUHJvdG9jb2xJZCIgdG89InByb3RvY29sIi8+CisgICAgPGtleSBmcm9tPSJPcmdhbklkIiB0bz0ib3JnYW4iLz4KKyAgICA8a2V5IGZyb209Ik9yZ2FuU2l0ZSIgdG89Im9yZ2FuIi8+CisgICAgPGtleSBmcm9tPSJQcm90b2NvbE5hbWUiIHRvPSJwcm90b2NvbCIvPgorICA8L3Jld3JpdGU+CisKKyAgPCEtLQorICAgIFBsYWNpbmcga2V5IHRhZ3MgaW4gdGhpcyBmaWxlIGRlY2xhcmVzIHRoYXQgdGhlIHNvdXJjZSBDQVMgcHJvZHVjdCBtZXQga2V5cworICAgIGFyZSBpbiBmYWN0IHJlc291cmNlIGxpbmsgaWRlbnRpZmllcnMsIGFuZCBzaG91bGQgYmUgb3V0cHV0IGFzIHN1Y2ggaW4gdGhlCisgICAgUkRGLiBSZXF1aXJlZCBwYXJhbWV0ZXJzIGZvciBlYWNoIGtleSB0YWcgYXJlOiBuYW1lLCBpZGVudGlmeWluZyB0aGUgc291cmNlCisgICAgQ0FTIHByb2R1Y3QgbWV0IGtleSwgYW5kIGxpbmssIGlkZW50aWZ5aW5nIHRoZSBzdGFydCBvZiB0aGUgcmVzb3VyY2UgbGluayB0bworICAgIGJlIHVzZWQgaW4gdGhlIHJkZjpyZXNvdXJjZSBvdXRwdXQgdGFnLCBlLmcuLAorICAgICZsdDt4OnByb3RvY29sIHJkZjpyZXNvdXJjZT0mcXVvdDsmbHQ7bGluayZndDsvJmx0O2tleSB2YWx1ZSZndDsmcXVvdDsmZ3Q7CisgIC0tPgorICA8cmVzb3VyY2VsaW5rcz4KKyAgICA8a2V5IG5hbWU9IlNpdGVJZCIgbGluaz0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvZGF0YS9zaXRlcy8iLz4KKyAgICA8a2V5IG5hbWU9IlNpdGVOYW1lIiBsaW5rPSJodHRwOi8vZWRybi5uY2kubmloLmdvdi9kYXRhL3NpdGVzLyIvPgorICAgIDxrZXkgbmFtZT0iUHJvdG9jb2xJZCIgbGluaz0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvZGF0YS9wcm90b2NvbHMvIi8+CisgICAgPGtleSBuYW1lPSJQcm90b2NvbE5hbWUiIGxpbms9Imh0dHA6Ly9lZHJuLm5jaS5uaWguZ292L2RhdGEvcHJvdG9jb2xzLyIvPgorICAgIDxrZXkgbmFtZT0iT3JnYW5JZCIgbGluaz0iaHR0cDovL2Vkcm4ubmNpLm5paC5nb3YvZGF0YS9ib2R5LXN5c3RlbXMvIi8+CisgICAgPGtleSBuYW1lPSJPcmdhblNpdGUiIGxpbms9Imh0dHA6Ly9lZHJuLm5jaS5uaWguZ292L2RhdGEvYm9keS1zeXN0ZW1zLyIvPgorICA8L3Jlc291cmNlbGlua3M+CisKKyAgPCEtLQorICAgIEFzc29jaWF0ZXMgQ0FTIHByb2R1Y3QgbWV0YWRhdGEgc3BlY2lmaWMga2V5cyB0byBwcmV2aW91c2x5IGRlY2xhcmVkCisgICAgbmFtZXNwYWNlcy4gRWFjaCBrZXkgdGFnIHNob3VsZCBjb250YWluIGEgbmFtZSBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUgaXMKKyAgICB2YWxpZCBDQVMgcHJvZHVjdCBtZXQga2V5LCBhbmQgZWFjaCBucyBhdHRyaWJ1dGUgb24gZWFjaCBrZXkgdGFnIHNob3VsZCBiZSBhCisgICAgcHJldmlvdXNseSBkZWNsYXJlZCBuYW1lc3BhY2UgZnJvbSB0aGUgbmFtZXNwYWNlcyB0YWcuCisKKyAgICBZb3UgPGI+bXVzdDwvYj4gZGVjbGFyZSBhIGRlZmF1bHQgbnMgaW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGluIHRoZQorICAgIGtleW5zbWFwIHRhZy4gVGhpcyBucyB3aWxsIGJlIHVzZWQgaWYgbm8ga2V5IG5zIGlzIGRlY2xhcmVkIGluIHRoZSBuc21hcC4KKyAgLS0+CisgIDxrZXluc21hcCBkZWZhdWx0PSJjYXMiPgorICAgIDxrZXkgbmFtZT0iQ0FTLlByb2R1Y3RJZCIgbnM9ImNhcyIvPgorICAgIDxrZXkgbmFtZT0iQ0FTLlByb2R1Y3ROYW1lIiBucz0iY2FzIi8+CisgICAgPGtleSBuYW1lPSJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIgbnM9ImNhcyIvPgorICAgIDxrZXkgbmFtZT0iRmlsZUxvY2F0aW9uIiBucz0iY2FzIi8+CisgICAgPGtleSBuYW1lPSJGaWxlbmFtZSIgbnM9ImNhcyIvPgorICAgIDxrZXkgbmFtZT0iUHJvZHVjdFR5cGUiIG5zPSJjYXMiLz4KKyAgICA8a2V5IG5hbWU9IkRhdGFWZXJzaW9uIiBucz0iY2FzIi8+CisgICAgPGtleSBuYW1lPSJNaW1lVHlwZSIgbnM9ImNhcyIvPgorCisgICAgPCEtLSAgRURSTiBleGFtcGxlIC0tPgorICAgIDxrZXkgbmFtZT0iU2l0ZUlkIiBucz0ieCIvPgorICAgIDxrZXkgbmFtZT0iU2l0ZU5hbWUiIG5zPSJ4Ii8+CisgICAgPGtleSBuYW1lPSJQcm90b2NvbE5hbWUiIG5zPSJ4Ii8+CisgICAgPGtleSBuYW1lPSJQcm90b2NvbElkIiBucz0ieCIvPgorICAgIDxrZXkgbmFtZT0iT3JnYW5JZCIgbnM9IngiLz4KKyAgICA8a2V5IG5hbWU9Ik9yZ2FuU2l0ZSIgbnM9IngiLz4KKyAgPC9rZXluc21hcD4KKworICA8IS0tCisgICAgQXNzb2NpYXRlcyBDQVMgcHJvZHVjdCB0eXBlIG5hbWVzIHRvIHByZXZpb3VzbHkgZGVjbGFyZWQgbmFtZXNwYWNlcy4gRWFjaAorICAgIHR5cGUgdGFnIHNob3VsZCBjb250YWluIGEgbmFtZSBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUgaXMgdmFsaWQgQ0FTIHByb2R1Y3QKKyAgICB0eXBlLCBhbmQgZWFjaCBucyBhdHRyaWJ1dGUgb24gZWFjaCBrZXkgdGFnIHNob3VsZCBiZSBhIHByZXZpb3VzbHkgZGVjbGFyZWQKKyAgICBuYW1lc3BhY2UgZnJvbSB0aGUgbmFtZXNwYWNlcyB0YWcuCisKKyAgICBZb3UgPGI+bXVzdDwvYj4gZGVjbGFyZSBhIGRlZmF1bHQgbnMgaW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGluIHRoZQorICAgIHR5cGVzbnNtYXAgdGFnLiBUaGlzIG5zIHdpbGwgYmUgdXNlZCBpZiBubyB0eXBlIG5zIGlzIGRlY2xhcmVkIGluIHRoZSBuc21hcC4KKyAgLS0+CisgIDx0eXBlc25zbWFwIGRlZmF1bHQ9ImNhcyI+CisgICAgPHR5cGUgbmFtZT0iR2VuZXJpY0ZpbGUiIG5zPSJjYXMiLz4KKyAgPC90eXBlc25zbWFwPgorPC9jYXM6cmRmY29uZj4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcnNzLXRyYW5zZmVyLWNvbmYueG1sIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy9tYWluL3Jlc291cmNlcy9yc3MtdHJhbnNmZXItY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4M2VmMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcnNzLXRyYW5zZmVyLWNvbmYueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorICBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisgIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisgIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgIHRoZSBMaWNlbnNlLgorCisgIEF1dGhvcjogcmxhaWRsYXcKKyAgRGVzY3JpcHRpb246IFRoaXMgZmlsZSBjb25maWd1cmVzIHRoZSBDQVMgUlNTIHdlYiBzZXJ2aWNlIGZvciBGaWxlIE1hbmFnZXIKKyAgcHJvZHVjdCB0cmFuc2ZlcnMuICBJdCBhbGxvd3MgbWV0YWRhdGEgZm9yIGEgcHJvZHVjdCBiZWluZyB0cmFuc2ZlcnJlZCB0byBiZQorICBhc3NpZ25lZCB0byBSU1MgY29tcGF0aWJsZSB0YWdzLgorLS0+Cis8Y2FzOnJzc2NvbmYgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5hcGFjaGUub3JnL25zL2NhcyI+CisKKyAgPG5hbWVzcGFjZSBwcmVmaXg9ImNhcyIgdXJpPSJodHRwOi8vb29kdC5hcGFjaGUub3JnL25zL2NhcyIvPgorICA8dGFnIG5hbWU9ImNhczpieXRlc1RyYW5zZmVycmVkIiBzb3VyY2U9IltCeXRlc1RyYW5zZmVycmVkXSIvPgorICA8dGFnIG5hbWU9ImNhczp0b3RhbEJ5dGVzIiBzb3VyY2U9IltUb3RhbEJ5dGVzXSIvPgorICA8dGFnIG5hbWU9ImNhczpwZXJjZW50Q29tcGxldGUiIHNvdXJjZT0iW1BlcmNlbnRDb21wbGV0ZV0iLz4KKworPC9jYXM6cnNzY29uZj4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi9yZXNvdXJjZXMvcnNzY29uZi54bWwgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL3Jzc2NvbmYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjUwNzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vcmVzb3VyY2VzL3Jzc2NvbmYueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorICBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKKyAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworICBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICB0aGUgTGljZW5zZS4KKworICBBdXRob3I6IENocmlzIEEuIE1hdHRtYW5uCisgIERlc2NyaXB0aW9uOiBUaGlzIGZpbGUgY29uZmlndXJlcyB0aGUgQ0FTIFJTUyB3ZWIgc2VydmljZS4gVGhlIG1haW4gYXNwZWN0cyBvZgorICB0aGlzIGZpbGUgYXJlIHRoZSBhYmlsaXR5IHRvIHJlY2FzdCBhIHByb2R1Y3QncyAgbWV0YWRhdGEgYXMgcmVsZXZhbnQgUlNTCisgIGNvbXBhdGlibGUgdGFncy4KKy0tPgorPGNhczpyc3Njb25mIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuYXBhY2hlLm9yZy9ucy9jYXMiPgorICA8IS0tCisgICAgQW4gb3B0aW9uYWwgImNoYW5uZWxMaW5rIiBhdHRyaWJ1dGUgbWF5IGJlIHNldCBvbiB0aGUgYWJvdmUgb3V0ZXIgdGFnIHRvCisgICAgc2V0IHRoZSBjaGFubmVsJ3MgbGluayBhdHRyaWJ1dGUuCisKKyAgICBNZXRhZGF0YSBhdmFpbGFibGUgZm9yIHJlcGxhY2VtZW50IGluIHRoaXMgYXR0cmlidXRlIGlzOgorCisgICAgQmFzZVVybDogdGhlIGJhc2UgVVJMIGZvciB0aGUgQ0FTIHdlYiBzZXJ2aWNlIGxheWVyLgorICAgIFByb2R1Y3RUeXBlSWQ6IHRoZSBpZCBwYXNzZWQgdG8gdGhlIFJTUyBjaGFubmVsIHZpYSB0aGUgaWQgcGFyYW0KKyAgICBQcm9kdWN0VHlwZTogdGhlIGNoYW5uZWwgcHJvZHVjdCB0eXBlIG5hbWUgcGFzc2VkIHZpYSB0aGUgY2hhbm5lbCBwYXJhbQorICAgIFRvcE46IHRoZSB0b3BuIHBhcmFtLCBpZiBwYXNzZWQuCisgIC0tPgorCisgIDwhLS0KKyAgICBFYWNoICZsdDt0YWcmZ3Q7IHRhZyBkZWZpbmVzIDIgYXR0cmlidXRlczoKKworICAgIG5hbWUgKHJlcXVpcmVkKSAtIHRoZSBSU1Mgb3V0cHV0IHRhZyBuYW1lCisgICAgc291cmNlIChvcHRpb25hbCkgLSB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBDQVMgcHJvZHVjdCdzIG1ldGFkYXRhIGFuZCBpdHMKKyAgICBhc3NvY2lhdGVkIHZhbHVlLgorCisgICAgRWFjaCAmbHQ7dGFnJmd0OyBoYXMgYSBzZXQgb2YgJmx0O2F0dHJpYnV0ZSZndDsgdGFncywgd2hpY2ggZGVmaW5lIFhNTAorICAgIGF0dHJpYnV0ZXMgb24gdGhlIFJTUyBvdXRwdXQgdGFncy4gRWFjaCAmbHQ7YXR0cmlidXRlJmd0OyBoYXMgdGhlIGZvbGxvd2luZworICAgIGF0dHJpYnV0ZXM6CisKKyAgICBuYW1lIChyZXF1aXJlZCkgLSB0aGUgUlNTIG91dHB1dCB0YWcgYXR0cmlidXRlIG5hbWUKKyAgICB2YWx1ZSAocmVxdWlyZWQpIC0gdGhlIFJTUyBvdXRwdXQgdGFnIGF0dHJpYnV0ZSB2YWx1ZS4gQnkgZGVmYXVsdCB0aGVzZQorICAgIHZhbHVlcyBhcmUgcnVuIHRocm91Z2ggUGF0aFV0aWxzI3JlcGxhY2VFbnZWYXJpYWJsZXMgd2hpY2ggcmVwbGFjZXMgbWV0IGtleXMKKyAgICB1c2luZyB0aGUgc3RhbmRhcmQgQ0FTIG1ldCByZXBsYWNlbWVudCBzdHJhdGVneS4KKyAgLS0+CisKKyAgPCEtLQorICAgIElmIHlvdSB3YW50IHRvIHR1cm4geW91ciBDQVMgRmlsZSBNYW5hZ2VyIGludG8gYSBQb2RjYXN0IGZlZWRlciBmb3IgaVR1bmVzLAorICAgIHVuY29tbWVudCB0aGUgdGFnIGJsb2NrIGJlbG93LiBZb3UnbGwgbmVlZCB0byBtb2RpZnkgeW91ciB3ZWIueG1sIGZvciB0aGlzCisgICAgd2ViYXBwIGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQgbmFtZSBvZiB0aGUgL2RhdGEgc2VydmljZSB0byAvZGF0YS5tcDMuIFRoZW4KKyAgICB5b3UncmUgc2V0IQorCisgICAgPHRhZyBuYW1lPSJlbmNsb3N1cmUiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiCisgICAgICAgIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvZm1wcm9kL2RhdGEubXAzP3Byb2R1Y3RJRD1bQ0FTLlByb2R1Y3RJZF0iLz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB2YWx1ZT0iW0ZpbGVTaXplXSIvPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB2YWx1ZT0iYXVkaW8vbXBlZyIvPgorICAgIDwvdGFnPgorICAtLT4KKworICA8IS0tCisgICAgSWYgeW91IHdhbnQgdG8gdHVybiB5b3VyIENBUyBGaWxlIE1hbmFnZXIgaW50byBhIEdlb1JTUyBzaW1wbGUgc2VydmljZSAoc2VlCisgICAgaHR0cDovL2dlb3Jzcy5vcmcvc2ltcGxlKSwgYWRkIHRoZSBmb2xsb3dpbmcgYmxvY2ssIGFzc3VtaW5nIHRoYXQgeW91IGhhdmUKKyAgICBpbmRleGVkIG1ldCBmaWVsZHMgbmFtZWQgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZSBmb3IgeW91ciBwcm9kdWN0ICh1cGRhdGUgYXMKKyAgICBhcHByb3ByaWF0ZSBvdGhlcndpc2UpLgorCisgICAgPG5hbWVzcGFjZSBwcmVmaXg9Imdlb3JzcyIgdXJpPSJodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzIi8+CisgICAgPHRhZyBuYW1lPSJnZW9yc3M6cG9pbnQiIHNvdXJjZT0iW0xhdGl0dWRlXSBbTG9uZ2l0dWRlXSIvPgorICAtLT4KKworICA8bmFtZXNwYWNlIHByZWZpeD0iY2FzIiB1cmk9Imh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvY2FzIi8+CisgIDx0YWcgbmFtZT0iY2FzOnNvdXJjZSIgc291cmNlPSJbUHJvZHVjdFR5cGVdIi8+CisgIDx0YWcgbmFtZT0ic291cmNlIiBzb3VyY2U9IltQcm9kdWN0VHlwZV0iLz4KKworPC9jYXM6cnNzY29uZj4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzc1MzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL2NvbnRleHQueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorCis8Q29udGV4dCBkb2NCYXNlPSIvcGF0aC90by9jYXMtcHJvZHVjdC53YXIiIHJlbG9hZGFibGU9InRydWUiCisgIGNyb3NzQ29udGV4dD0idHJ1ZSI+CisKKyAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgcHJlZml4PSJmbXByb2RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIgcGF0dGVybj0iY29tbW9uIi8+CisKKyAgPFBhcmFtZXRlciBuYW1lPSJmaWxlbWdyLm5zIgorICAgIHZhbHVlPSJjYXN8dXJuOm9vZHQ6fHJkZnxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgorICAgIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci5ucy5kZWZhdWx0IgorICAgIHZhbHVlPSJjYXMiIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci51cmwiCisgICAgdmFsdWU9IltGSUxFTUdSX1VSTF0iIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci53b3JraW5nLmRpciIKKyAgICB2YWx1ZT0iW0ZJTEVNR1JfV09SS0lOR0RJUl0iIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci5yZGZjb25mLmZpbGUiCisgICAgdmFsdWU9IltGTVBST0RfSE9NRV0vcmRmY29uZi54bWwiIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci5yc3Njb25mLmZpbGUiCisgICAgdmFsdWU9IltGTVBST0RfSE9NRV0vcnNzY29uZi54bWwiIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iZmlsZW1nci5yc3MtdHJhbnNmZXItY29uZi5maWxlIgorICAgIHZhbHVlPSJbRk1QUk9EX0hPTUVdL3Jzcy10cmFuc2Zlci1jb25mLnhtbCIgb3ZlcnJpZGU9ImZhbHNlIi8+CisKKyAgPFBhcmFtZXRlciBuYW1lPSJjb25maWd1cmF0aW9uLnJkZi5leGFtcGxlIgorICAgIHZhbHVlPSJbRk1QUk9EX0hPTUVdL3JkZmNvbmYueG1sIiBvdmVycmlkZT0iZmFsc2UiLz4KKworICA8UGFyYW1ldGVyIG5hbWU9ImNvbmZpZ3VyYXRpb24ucnNzLmV4YW1wbGUiCisgICAgdmFsdWU9IltGTVBST0RfSE9NRV0vcnNzY29uZi54bWwiIG92ZXJyaWRlPSJmYWxzZSIvPgorCisgIDxQYXJhbWV0ZXIgbmFtZT0iY29uZmlndXJhdGlvbi5yc3MuZ2VvcnNzIgorICAgIHZhbHVlPSJbRk1QUk9EX0hPTUVdL2dlb3Jzcy1jb25maWcueG1sIiBvdmVycmlkZT0iZmFsc2UiLz4KKworICA8UGFyYW1ldGVyIG5hbWU9ImNvbmZpZ3VyYXRpb24ucnNzLnRyYW5zZmVyIgorICAgIHZhbHVlPSJbRk1QUk9EX0hPTUVdL3Jzcy10cmFuc2Zlci1jb25mLnhtbCIgb3ZlcnJpZGU9ImZhbHNlIi8+Cis8L0NvbnRleHQ+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWZiMGQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDE1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCisgIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCisgIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisgIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgIHRoZSBMaWNlbnNlLgorLS0+Cis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCisgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgPGRpc3BsYXktbmFtZT5DQVMgUHJvZHVjdCBTZXJ2ZXIgV2ViIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5SU1NTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucnNzLlJTU1Byb2R1Y3RTZXJ2bGV0CisgICAgPC9zZXJ2bGV0LWNsYXNzPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5SU1NUcmFuc2ZlclNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yc3MuUlNTUHJvZHVjdFRyYW5zZmVyU2VydmxldAorICAgIDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+UkRGUHJvZHVjdFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yZGYuUkRGUHJvZHVjdFNlcnZsZXQKKyAgICA8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKworICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPlJERkRhdGFzZXRTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucmRmLlJERkRhdGFzZXRTZXJ2bGV0CisgICAgPC9zZXJ2bGV0LWNsYXNzPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhRGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuZGF0YS5EYXRhRGVsaXZlcnlTZXJ2bGV0CisgICAgPC9zZXJ2bGV0LWNsYXNzPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhc2V0RGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuZGF0YS5EYXRhc2V0RGVsaXZlcnlTZXJ2bGV0CisgICAgPC9zZXJ2bGV0LWNsYXNzPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5DYXNQcm9kdWN0SmF4cnNTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnNlcnZsZXRzLkNhc1Byb2R1Y3RKYXhyc1NlcnZsZXQKKyAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5qYXhycy5zZXJ2aWNlQ2xhc3NlczwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4KKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnNlcnZpY2VzLkNhc1Byb2R1Y3RKYXhyc1NlcnZpY2UKKyAgICAgIDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+amF4cnMucHJvdmlkZXJzPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPgorICAgICAgICBvcmcuYXBhY2hlLmN4Zi5qYXhycy5wcm92aWRlci5qc29uLkpTT05Qcm92aWRlciwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLndyaXRlcnMuUmVmZXJlbmNlRmlsZVdyaXRlciwKKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLndyaXRlcnMuUmVmZXJlbmNlWmlwV3JpdGVyLAorICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMud3JpdGVycy5SZWZlcmVuY2VSc3NXcml0ZXIsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzLlByb2R1Y3RaaXBXcml0ZXIsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzLlByb2R1Y3RSc3NXcml0ZXIsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzLkRhdGFzZXRaaXBXcml0ZXIsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzLkRhdGFzZXRSZGZXcml0ZXIsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzLkRhdGFzZXRSc3NXcml0ZXIsCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy53cml0ZXJzLlRyYW5zZmVyc1Jzc1dyaXRlcgorICAgICAgPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5qYXhycy5pbkludGVyY2VwdG9yczwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4KKyAgICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLmZpbHRlcnMuQmFja3dhcmRzQ29tcGF0aWJsZUludGVyY2VwdG9yCisgICAgICA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmpheHJzLnNjb3BlPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPnByb3RvdHlwZTwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+amF4cnMuZXh0ZW5zaW9uczwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4KKyAgICAgICAgZmlsZT1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICAgICAganNvbj1hcHBsaWNhdGlvbi9qc29uCisgICAgICAgIHJkZj1hcHBsaWNhdGlvbi9yZGYreG1sCisgICAgICAgIHJzcz1hcHBsaWNhdGlvbi9yc3MreG1sCisgICAgICAgIHhtbD1hcHBsaWNhdGlvbi94bWwKKyAgICAgICAgemlwPWFwcGxpY2F0aW9uL3ppcAorICAgICAgPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKworCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5SU1NTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi92aWV3UmVjZW50PC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPlJTU1RyYW5zZmVyU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vdmlld1RyYW5zZmVyczwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5SREZQcm9kdWN0U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vcmRmPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIAorICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgPHNlcnZsZXQtbmFtZT5SREZEYXRhc2V0U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9yZGYvZGF0YXNldDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5EYXRhRGVsaXZlcnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9kYXRhPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkRhdGFzZXREZWxpdmVyeVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L2RhdGFzZXQ8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+Q2FzUHJvZHVjdEpheHJzU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vamF4cnMvKjwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvVGVzdERhdGFVdGlscy5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2RhdGEvVGVzdERhdGFVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTQyZDMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvZGF0YS9UZXN0RGF0YVV0aWxzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmRhdGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3RzIERhdGFVdGlscyBtb2R1bGUgbWV0aG9kcworICoKKyAqIEBhdXRob3IgdGhvbWFzIChUaG9tYXMgQmVubmV0dCkKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdERhdGFVdGlscyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIEZpbGUgd29ya2luZ0RpcjsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlVXRpbHMuZm9yY2VEZWxldGUod29ya2luZ0Rpcik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2R1Y3RaaXBGaWxlRnJvbUhpZXJhcmNoaWNhbFByb2R1Y3QoKXsKKwkJLy9EYXRhIHN0b3JlIHJlZmVyZW5jZSBuZWVkcyBhYnNvbHV0ZSBwYXRoIHRvIHRlc3QgZGF0YQorCQlTdHJpbmcgY3dkPVN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKworCQlQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworCQlwcm9kdWN0LnNldFByb2R1Y3RJZCgiVGVzdFByb2R1Y3RJZCIpOworCQlwcm9kdWN0LnNldFByb2R1Y3ROYW1lKCJUZXN0UHJvZHVjdE5hbWUiKTsKKwkJcHJvZHVjdC5zZXRQcm9kdWN0UmVmZXJlbmNlcyhMaXN0cy5uZXdBcnJheUxpc3QoCisJCQluZXcgUmVmZXJlbmNlKCJmaWxlOi8vL29yaWcvZGF0YS8iLCAiZmlsZTovLyIgKyBjd2QgKyAiL3NyYy90ZXN0L3Jlc291cmNlcy8iLCA0MDk2KSwKKwkJCW5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vb3JpZy9kYXRhL3Rlc3QtZmlsZS0xLnR4dCIsICJmaWxlOi8vIiArIGN3ZCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtZmlsZS0xLnR4dCIsIDIwKSwKKwkJCW5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vb3JpZy9kYXRhL3Rlc3QtZmlsZS0yLnR4dCIsICJmaWxlOi8vIiArIGN3ZCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtZmlsZS0yLnR4dCIsIDIwKSwKKwkJCW5ldyBSZWZlcmVuY2UoImZpbGU6Ly8vb3JpZy9kYXRhL3Rlc3QtZmlsZS0zLnR4dCIsICJmaWxlOi8vIiArIGN3ZCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtZmlsZS0zLnR4dCIsIDIwKSkpOworCQlwcm9kdWN0LnNldFByb2R1Y3RTdHJ1Y3R1cmUoUHJvZHVjdC5TVFJVQ1RVUkVfSElFUkFSQ0hJQ0FMKTsKKwkJcHJvZHVjdC5zZXRUcmFuc2ZlclN0YXR1cyhQcm9kdWN0LlNUQVRVU19SRUNFSVZFRCk7CisJCVByb2R1Y3RUeXBlIHB0ID0gbmV3IFByb2R1Y3RUeXBlKCk7CisJCXB0LnNldE5hbWUoIlRlc3RQcm9kdWN0VHlwZSIpOworCisJCU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisKKwkJU3RyaW5nIHdvcmtpbmdEaXJQYXRoID0gbnVsbDsKKwkJd29ya2luZ0RpciA9IEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKwkJd29ya2luZ0RpclBhdGggPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOworCQl3b3JraW5nRGlyLmRlbGV0ZU9uRXhpdCgpOworCisJCVN0cmluZyBwcm9kdWN0WmlwRmlsZVBhdGggPSBudWxsOworCQl0cnkgeworCQkJcHJvZHVjdFppcEZpbGVQYXRoID0gRGF0YVV0aWxzLmNyZWF0ZVByb2R1Y3RaaXBGaWxlKHByb2R1Y3QsIG1ldGFkYXRhLCB3b3JraW5nRGlyUGF0aCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlTdHJpbmcgemlwRmlsZU5hbWUgPSBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiLnppcCI7CisJCWFzc2VydEVxdWFscyhwcm9kdWN0WmlwRmlsZVBhdGgsIHdvcmtpbmdEaXJQYXRoICsgIi8iICsgemlwRmlsZU5hbWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9EYXRhc2V0UmVzb3VyY2VUZXN0LmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL0RhdGFzZXRSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTAxZjYyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9EYXRhc2V0UmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlczsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50cyB0ZXN0cyBmb3IgbWV0aG9kcyBpbiB0aGUge0BsaW5rIERhdGFzZXRSZXNvdXJjZX0gY2xhc3MuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhc2V0UmVzb3VyY2VUZXN0Cit7CisgIC8qKgorICAgKiBUZXN0cyB0aGF0IHtAbGluayBEYXRhc2V0UmVzb3VyY2UgZGF0YXNldCByZXNvdXJjZXN9IGFyZSBtYXJzaGFsbGVkIHRvCisgICAqIHRoZSBleHBlY3RlZCBYTUwgZm9ybWF0LgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgRGlmZn0gY29uc3RydWN0b3IgZmFpbHMKKyAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgSkFYQkNvbnRleHR9IG9yIHtAbGluayBNYXJzaGFsbGVyfSBmYWlsCisgICAqIEB0aHJvd3MgTWltZVR5cGVFeGNlcHRpb24gaWYge0BsaW5rIE1pbWVUeXBlcyNmb3JOYW1lKFN0cmluZyl9IGZhaWxzCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgRGlmZn0gY29uc3RydWN0b3IgZmFpbHMKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RYbWxNYXJzaGFsbGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSkFYQkV4Y2VwdGlvbiwKKyAgICBNaW1lVHlwZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBDcmVhdGUgYSBQcm9kdWN0VHlwZS4KKyAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgiMSIsICJHZW5lcmljRmlsZSIsICJ0ZXN0IHR5cGUiLAorICAgICAgInJlcG9zaXRvcnkiLCAidmVyc2lvbmVyIik7CisKKyAgICAvLyBDcmVhdGUgYSBQcm9kdWN0UmVzb3VyY2UgdXNpbmcgUmVmZXJlbmNlLCBNZXRhZGF0YSBhbmQgUHJvZHVjdCBpbnN0YW5jZXMuCisgICAgUmVmZXJlbmNlIHJlZmVyZW5jZTEgPSBuZXcgUmVmZXJlbmNlKCJvcmlnaW5hbDEiLCAiZGF0YVN0b3JlMSIsIDUwMCwKKyAgICAgIG5ldyBNaW1lVHlwZXMoKS5mb3JOYW1lKCJ0ZXh0L3BsYWluIikpOworICAgIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzMSA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNlPigpOworICAgIHJlZmVyZW5jZXMxLmFkZChyZWZlcmVuY2UxKTsKKworICAgIEhhc2h0YWJsZSBtZXRhZGF0YUVudHJpZXMxID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBtZXRhZGF0YUVudHJpZXMxLnB1dCgicHJvZHVjdDFfbWV0YSIsICJ0ZXN0MSIpOworICAgIE1ldGFkYXRhIG1ldGFkYXRhMSA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldGFkYXRhMS5hZGRNZXRhZGF0YShtZXRhZGF0YUVudHJpZXMxKTsKKworICAgIFByb2R1Y3QgcHJvZHVjdDEgPSBuZXcgUHJvZHVjdCgpOworICAgIHByb2R1Y3QxLnNldFByb2R1Y3RJZCgiMTIzIik7CisgICAgcHJvZHVjdDEuc2V0UHJvZHVjdE5hbWUoInRlc3QudHh0Iik7CisgICAgcHJvZHVjdDEuc2V0UHJvZHVjdFR5cGUocHJvZHVjdFR5cGUpOworCisgICAgUHJvZHVjdFJlc291cmNlIHByb2R1Y3RSZXNvdXJjZTEgPSBuZXcgUHJvZHVjdFJlc291cmNlKHByb2R1Y3QxLCBtZXRhZGF0YTEsCisgICAgICByZWZlcmVuY2VzMSwgbmV3IEZpbGUoIi90bXAiKSk7CisKKworICAgIC8vIENyZWF0ZSBhbm90aGVyIFByb2R1Y3RSZXNvdXJjZSB1c2luZyBSZWZlcmVuY2UsIE1ldGFkYXRhIGFuZCBQcm9kdWN0CisgICAgLy8gaW5zdGFuY2VzLgorICAgIFJlZmVyZW5jZSByZWZlcmVuY2UyID0gbmV3IFJlZmVyZW5jZSgib3JpZ2luYWwyIiwgImRhdGFTdG9yZTIiLCAxMDAwLAorICAgICAgbmV3IE1pbWVUeXBlcygpLmZvck5hbWUoImFwcGxpY2F0aW9uL3BkZiIpKTsKKyAgICBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlczIgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jZT4oKTsKKyAgICByZWZlcmVuY2VzMi5hZGQocmVmZXJlbmNlMik7CisKKyAgICBIYXNodGFibGUgbWV0YWRhdGFFbnRyaWVzMiA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgbWV0YWRhdGFFbnRyaWVzMi5wdXQoInByb2R1Y3QyX21ldGEiLCAidGVzdDIiKTsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YTIgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YTIuYWRkTWV0YWRhdGEobWV0YWRhdGFFbnRyaWVzMik7CisKKyAgICBQcm9kdWN0IHByb2R1Y3QyID0gbmV3IFByb2R1Y3QoKTsKKyAgICBwcm9kdWN0Mi5zZXRQcm9kdWN0SWQoIjQ1NiIpOworICAgIHByb2R1Y3QyLnNldFByb2R1Y3ROYW1lKCJ0ZXN0Mi50eHQiKTsKKyAgICBwcm9kdWN0Mi5zZXRQcm9kdWN0VHlwZShwcm9kdWN0VHlwZSk7CisKKyAgICBQcm9kdWN0UmVzb3VyY2UgcHJvZHVjdFJlc291cmNlMiA9IG5ldyBQcm9kdWN0UmVzb3VyY2UocHJvZHVjdDIsIG1ldGFkYXRhMiwKKyAgICAgIHJlZmVyZW5jZXMyLCBuZXcgRmlsZSgiL3RtcCIpKTsKKworICAgIC8vIENyZWF0ZSBhIERhdGFzZXRSZXNvdXJjZSB1c2luZyBQcm9kdWN0VHlwZSwgTWV0YWRhdGEgYW5kIFByb2R1Y3RSZXNvdXJjZQorICAgIC8vIGluc3RhbmNlcy4KKyAgICBIYXNodGFibGUgbWV0YWRhdGFFbnRyaWVzMyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgbWV0YWRhdGFFbnRyaWVzMy5wdXQoImRhdGFzZXRfbWV0YSIsICJ0ZXN0MyIpOworICAgIE1ldGFkYXRhIG1ldGFkYXRhMyA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldGFkYXRhMy5hZGRNZXRhZGF0YShtZXRhZGF0YUVudHJpZXMzKTsKKworICAgIERhdGFzZXRSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBEYXRhc2V0UmVzb3VyY2UoCisgICAgICBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCksIHByb2R1Y3RUeXBlLmdldE5hbWUoKSwgbWV0YWRhdGEzLAorICAgICAgbmV3IEZpbGUoIi90bXAiKSk7CisgICAgcmVzb3VyY2UuYWRkUHJvZHVjdFJlc291cmNlKHByb2R1Y3RSZXNvdXJjZTEpOworICAgIHJlc291cmNlLmFkZFByb2R1Y3RSZXNvdXJjZShwcm9kdWN0UmVzb3VyY2UyKTsKKworCisgICAgLy8gR2VuZXJhdGUgdGhlIGV4cGVjdGVkIG91dHB1dC4KKyAgICBTdHJpbmcgZXhwZWN0ZWRYbWwgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PiIKKyAgICAgICsgIjxkYXRhc2V0PiIKKyAgICAgICsgICAiPGlkPiIgKyBwcm9kdWN0VHlwZS5nZXRQcm9kdWN0VHlwZUlkKCkgKyAiPC9pZD4iCisgICAgICArICAgIjxuYW1lPiIgKyBwcm9kdWN0VHlwZS5nZXROYW1lKCkgKyAiPC9uYW1lPiIKKyAgICAgICsgICAiPG1ldGFkYXRhPiIKKyAgICAgICsgICAgICI8a2V5dmFsPiIKKyAgICAgICsgICAgICAgIjxrZXk+IiArIG1ldGFkYXRhMy5nZXRBbGxLZXlzKCkuZ2V0KDApICsgIjwva2V5PiIKKyAgICAgICsgICAgICAgIjx2YWw+IiArIG1ldGFkYXRhMy5nZXRBbGxWYWx1ZXMoKS5nZXQoMCkgKyAiPC92YWw+IgorICAgICAgKyAgICAgIjwva2V5dmFsPiIKKyAgICAgICsgICAiPC9tZXRhZGF0YT4iCisgICAgICArICAgIjxwcm9kdWN0cz4iCisgICAgICArICAgICAiPHByb2R1Y3Q+IgorICAgICAgKyAgICAgICAiPGlkPiIgKyBwcm9kdWN0MS5nZXRQcm9kdWN0SWQoKSArICI8L2lkPiIKKyAgICAgICsgICAgICAgIjxuYW1lPiIgKyBwcm9kdWN0MS5nZXRQcm9kdWN0TmFtZSgpICsgIjwvbmFtZT4iCisgICAgICArICAgICAgICI8dHlwZT4iICsgcHJvZHVjdFR5cGUuZ2V0TmFtZSgpICsgIjwvdHlwZT4iCisgICAgICArICAgICAgICI8bWV0YWRhdGE+IgorICAgICAgKyAgICAgICAgICI8a2V5dmFsPiIKKyAgICAgICsgICAgICAgICAgICI8a2V5PiIgKyBtZXRhZGF0YTEuZ2V0QWxsS2V5cygpLmdldCgwKSArICI8L2tleT4iCisgICAgICArICAgICAgICAgICAiPHZhbD4iICsgbWV0YWRhdGExLmdldEFsbFZhbHVlcygpLmdldCgwKSArICI8L3ZhbD4iCisgICAgICArICAgICAgICAgIjwva2V5dmFsPiIKKyAgICAgICsgICAgICAgIjwvbWV0YWRhdGE+IgorICAgICAgKyAgICAgICAiPHJlZmVyZW5jZXM+IgorICAgICAgKyAgICAgICAgICI8cmVmZXJlbmNlPiIKKyAgICAgICsgICAgICAgICAgICI8cHJvZHVjdElkPiIgKyBwcm9kdWN0MS5nZXRQcm9kdWN0SWQoKSArICI8L3Byb2R1Y3RJZD4iCisgICAgICArICAgICAgICAgICAiPHJlZkluZGV4PjA8L3JlZkluZGV4PiIKKyAgICAgICsgICAgICAgICAgICI8ZGF0YVN0b3JlUmVmZXJlbmNlPiIKKyAgICAgICsgICAgICAgICAgICAgIHJlZmVyZW5jZTEuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICsgICAgICAgICAgICI8L2RhdGFTdG9yZVJlZmVyZW5jZT4iCisgICAgICArICAgICAgICAgICAiPG9yaWdpbmFsUmVmZXJlbmNlPiIKKyAgICAgICsgICAgICAgICAgICAgIHJlZmVyZW5jZTEuZ2V0T3JpZ1JlZmVyZW5jZSgpCisgICAgICArICAgICAgICAgICAiPC9vcmlnaW5hbFJlZmVyZW5jZT4iCisgICAgICArICAgICAgICAgICAiPG1pbWVUeXBlPiIKKyAgICAgICsgICAgICAgICAgICAgIHJlZmVyZW5jZTEuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkKKyAgICAgICsgICAgICAgICAgICI8L21pbWVUeXBlPiIKKyAgICAgICsgICAgICAgICAgICI8ZmlsZVNpemU+IiArIHJlZmVyZW5jZTEuZ2V0RmlsZVNpemUoKSArICI8L2ZpbGVTaXplPiIKKyAgICAgICsgICAgICAgICAiPC9yZWZlcmVuY2U+IgorICAgICAgKyAgICAgICAiPC9yZWZlcmVuY2VzPiIKKyAgICAgICsgICAgICI8L3Byb2R1Y3Q+IgorICAgICAgKyAgICAgIjxwcm9kdWN0PiIKKyAgICAgICsgICAgICAgIjxpZD4iICsgcHJvZHVjdDIuZ2V0UHJvZHVjdElkKCkgKyAiPC9pZD4iCisgICAgICArICAgICAgICI8bmFtZT4iICsgcHJvZHVjdDIuZ2V0UHJvZHVjdE5hbWUoKSArICI8L25hbWU+IgorICAgICAgKyAgICAgICAiPHR5cGU+IiArIHByb2R1Y3RUeXBlLmdldE5hbWUoKSArICI8L3R5cGU+IgorICAgICAgKyAgICAgICAiPG1ldGFkYXRhPiIKKyAgICAgICsgICAgICAgICAiPGtleXZhbD4iCisgICAgICArICAgICAgICAgICAiPGtleT4iICsgbWV0YWRhdGEyLmdldEFsbEtleXMoKS5nZXQoMCkgKyAiPC9rZXk+IgorICAgICAgKyAgICAgICAgICAgIjx2YWw+IiArIG1ldGFkYXRhMi5nZXRBbGxWYWx1ZXMoKS5nZXQoMCkgKyAiPC92YWw+IgorICAgICAgKyAgICAgICAgICI8L2tleXZhbD4iCisgICAgICArICAgICAgICI8L21ldGFkYXRhPiIKKyAgICAgICsgICAgICAgIjxyZWZlcmVuY2VzPiIKKyAgICAgICsgICAgICAgICAiPHJlZmVyZW5jZT4iCisgICAgICArICAgICAgICAgICAiPHByb2R1Y3RJZD4iICsgcHJvZHVjdDIuZ2V0UHJvZHVjdElkKCkgKyAiPC9wcm9kdWN0SWQ+IgorICAgICAgKyAgICAgICAgICAgIjxyZWZJbmRleD4wPC9yZWZJbmRleD4iCisgICAgICArICAgICAgICAgICAiPGRhdGFTdG9yZVJlZmVyZW5jZT4iCisgICAgICArICAgICAgICAgICAgICByZWZlcmVuY2UyLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpCisgICAgICArICAgICAgICAgICAiPC9kYXRhU3RvcmVSZWZlcmVuY2U+IgorICAgICAgKyAgICAgICAgICAgIjxvcmlnaW5hbFJlZmVyZW5jZT4iCisgICAgICArICAgICAgICAgICAgICByZWZlcmVuY2UyLmdldE9yaWdSZWZlcmVuY2UoKQorICAgICAgKyAgICAgICAgICAgIjwvb3JpZ2luYWxSZWZlcmVuY2U+IgorICAgICAgKyAgICAgICAgICAgIjxtaW1lVHlwZT4iCisgICAgICArICAgICAgICAgICAgICByZWZlcmVuY2UyLmdldE1pbWVUeXBlKCkuZ2V0TmFtZSgpCisgICAgICArICAgICAgICAgICAiPC9taW1lVHlwZT4iCisgICAgICArICAgICAgICAgICAiPGZpbGVTaXplPiIgKyByZWZlcmVuY2UyLmdldEZpbGVTaXplKCkgKyAiPC9maWxlU2l6ZT4iCisgICAgICArICAgICAgICAgIjwvcmVmZXJlbmNlPiIKKyAgICAgICsgICAgICAgIjwvcmVmZXJlbmNlcz4iCisgICAgICArICAgICAiPC9wcm9kdWN0PiIKKyAgICAgICsgICAiPC9wcm9kdWN0cz4iCisgICAgICArICI8L2RhdGFzZXQ+IjsKKworCisgICAgLy8gU2V0IHVwIGEgSkFYQiBjb250ZXh0IGFuZCBtYXJzaGFsbCB0aGUgRGF0YXNldFJlc291cmNlIHRvIFhNTC4KKyAgICBKQVhCQ29udGV4dCBjb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UocmVzb3VyY2UuZ2V0Q2xhc3MoKSk7CisgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICBtYXJzaGFsbGVyLm1hcnNoYWwocmVzb3VyY2UsIHdyaXRlcik7CisKKyAgICAvLyBDb21wYXJlIHRoZSBleHBlY3RlZCBhbmQgYWN0dWFsIG91dHB1dHMuCisgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOworICAgIFhNTFVuaXQuc2V0SWdub3JlQ29tbWVudHModHJ1ZSk7CisgICAgWE1MVW5pdC5zZXRJZ25vcmVBdHRyaWJ1dGVPcmRlcih0cnVlKTsKKyAgICBEaWZmIGRpZmYgPSBuZXcgRGlmZihleHBlY3RlZFhtbCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIGFzc2VydFRydWUoIlRoZSBvdXRwdXQgWE1MIHdhcyBkaWZmZXJlbnQgdG8gdGhlIGV4cGVjdGVkIFhNTDogIgorICAgICAgKyBkaWZmLnRvU3RyaW5nKCksIGRpZmYuaWRlbnRpY2FsKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL01ldGFkYXRhUmVzb3VyY2VUZXN0LmphdmEgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL01ldGFkYXRhUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzYmIzZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvTWV0YWRhdGFSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5qYXhycy5yZXNvdXJjZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5leGFtcGxlcy5SZWN1cnNpdmVFbGVtZW50TmFtZUFuZFRleHRRdWFsaWZpZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudHMgdGVzdHMgZm9yIG1ldGhvZHMgaW4gdGhlIHtAbGluayBNZXRhZGF0YVJlc291cmNlfSBjbGFzcy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhUmVzb3VyY2VUZXN0Cit7CisgIC8qKgorICAgKiBUZXN0cyB0aGF0IHtAbGluayBNZXRhZGF0YVJlc291cmNlIG1ldGFkYXRhIHJlc291cmNlc30gYXJlIG1hcnNoYWxsZWQgdG8KKyAgICogdGhlIGV4cGVjdGVkIFhNTCBmb3JtYXQuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaWYgdGhlIHtAbGluayBKQVhCQ29udGV4dH0gb3Ige0BsaW5rIE1hcnNoYWxsZXJ9IGZhaWwKKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFhtbE1hcnNoYWxsaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uLAorICAgIFNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gR2VuZXJhdGUgdGhlIGV4cGVjdGVkIG91dHB1dC4KKyAgICBTdHJpbmcgZXhwZWN0ZWRYbWwgPQorICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz4iCisgICAgICArICI8bWV0YWRhdGE+IgorICAgICAgKyAiPGtleXZhbD48a2V5PjE8L2tleT48dmFsPm9uZTwvdmFsPjwva2V5dmFsPiIKKyAgICAgICsgIjxrZXl2YWw+PGtleT4yPC9rZXk+PHZhbD50d288L3ZhbD48L2tleXZhbD4iCisgICAgICArICI8a2V5dmFsPjxrZXk+Mzwva2V5Pjx2YWw+dGhyZWU8L3ZhbD48L2tleXZhbD4iCisgICAgICArICI8a2V5dmFsPjxrZXk+NDwva2V5Pjx2YWw+YTwvdmFsPjx2YWw+YjwvdmFsPjx2YWw+YzwvdmFsPjwva2V5dmFsPiIKKyAgICAgICsgIjwvbWV0YWRhdGE+IjsKKworICAgIC8vIENyZWF0ZSBhIE1ldGFkYXRhUmVzb3VyY2UgdXNpbmcgYSBNZXRhZGF0YSBpbnN0YW5jZS4KKyAgICBIYXNodGFibGUgbWV0YWRhdGFFbnRyaWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBtZXRhZGF0YUVudHJpZXMucHV0KCIxIiwgIm9uZSIpOworICAgIG1ldGFkYXRhRW50cmllcy5wdXQoIjIiLCAidHdvIik7CisgICAgbWV0YWRhdGFFbnRyaWVzLnB1dCgiMyIsICJ0aHJlZSIpOworICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgbGlzdC5hZGQoImEiKTsKKyAgICBsaXN0LmFkZCgiYiIpOworICAgIGxpc3QuYWRkKCJjIik7CisgICAgbWV0YWRhdGFFbnRyaWVzLnB1dCgiNCIsIGxpc3QpOworCisgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShtZXRhZGF0YUVudHJpZXMpOworICAgIE1ldGFkYXRhUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgTWV0YWRhdGFSZXNvdXJjZShtZXRhZGF0YSk7CisKKworICAgIC8vIFNldCB1cCBhIEpBWEIgY29udGV4dCBhbmQgbWFyc2hhbGwgdGhlIFJlZmVyZW5jZVJlc291cmNlIHRvIFhNTC4KKyAgICBKQVhCQ29udGV4dCBjb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UocmVzb3VyY2UuZ2V0Q2xhc3MoKSk7CisgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICBtYXJzaGFsbGVyLm1hcnNoYWwocmVzb3VyY2UsIHdyaXRlcik7CisKKyAgICAvLyBDb21wYXJlIHRoZSBleHBlY3RlZCBhbmQgYWN0dWFsIG91dHB1dHMuCisgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOworICAgIFhNTFVuaXQuc2V0SWdub3JlQ29tbWVudHModHJ1ZSk7CisgICAgWE1MVW5pdC5zZXRJZ25vcmVBdHRyaWJ1dGVPcmRlcih0cnVlKTsKKyAgICBEaWZmIGRpZmYgPSBuZXcgRGlmZihleHBlY3RlZFhtbCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIGRpZmYub3ZlcnJpZGVFbGVtZW50UXVhbGlmaWVyKG5ldyBSZWN1cnNpdmVFbGVtZW50TmFtZUFuZFRleHRRdWFsaWZpZXIoKSk7CisgICAgYXNzZXJ0VHJ1ZSgiVGhlIG91dHB1dCBYTUwgd2FzIGRpZmZlcmVudCB0byB0aGUgZXhwZWN0ZWQgWE1MOiAiCisgICAgICArIGRpZmYudG9TdHJpbmcoKSwgZGlmZi5zaW1pbGFyKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL1Byb2R1Y3RSZXNvdXJjZVRlc3QuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvUHJvZHVjdFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjljMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL1Byb2R1Y3RSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aWthLm1pbWUuTWltZVR5cGVzOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRzIHRlc3RzIGZvciBtZXRob2RzIGluIHRoZSB7QGxpbmsgUHJvZHVjdFJlc291cmNlfSBjbGFzcy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFByb2R1Y3RSZXNvdXJjZVRlc3QKK3sKKyAgLyoqCisgICAqIFRlc3RzIHRoYXQge0BsaW5rIFByb2R1Y3RSZXNvdXJjZSBwcm9kdWN0IHJlc291cmNlc30gYXJlIG1hcnNoYWxsZWQgdG8KKyAgICogdGhlIGV4cGVjdGVkIFhNTCBmb3JtYXQuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaWYgdGhlIHtAbGluayBKQVhCQ29udGV4dH0gb3Ige0BsaW5rIE1hcnNoYWxsZXJ9IGZhaWwKKyAgICogQHRocm93cyBNaW1lVHlwZUV4Y2VwdGlvbiBpZiB7QGxpbmsgTWltZVR5cGVzI2Zvck5hbWUoU3RyaW5nKX0gZmFpbHMKKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFhtbE1hcnNoYWxsaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uLAorICAgIE1pbWVUeXBlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KKyAgeworICAgIC8vIENyZWF0ZSBhIFByb2R1Y3RSZXNvdXJjZSB1c2luZyBQcm9kdWN0VHlwZSwgUmVmZXJlbmNlLCBNZXRhZGF0YSBhbmQKKyAgICAvLyBQcm9kdWN0IGluc3RhbmNlcy4KKyAgICBIYXNodGFibGUgbWV0YWRhdGFFbnRyaWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBtZXRhZGF0YUVudHJpZXMucHV0KCJDQVMuVGVzdCIsICJ0ZXN0IHZhbHVlIik7CisgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YS5hZGRNZXRhZGF0YShtZXRhZGF0YUVudHJpZXMpOworCisgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UoIm9yaWdpbmFsIiwgImRhdGFTdG9yZSIsIDEwMDAsCisgICAgICBuZXcgTWltZVR5cGVzKCkuZm9yTmFtZSgidGV4dC9wbGFpbiIpKTsKKyAgICBMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNlPigpOworICAgIHJlZmVyZW5jZXMuYWRkKHJlZmVyZW5jZSk7CisKKyAgICBQcm9kdWN0VHlwZSBwcm9kdWN0VHlwZSA9IG5ldyBQcm9kdWN0VHlwZSgiMSIsICJHZW5lcmljRmlsZSIsICJ0ZXN0IHR5cGUiLAorICAgICAgInJlcG9zaXRvcnkiLCAidmVyc2lvbmVyIik7CisKKyAgICBQcm9kdWN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdCgpOworICAgIHByb2R1Y3Quc2V0UHJvZHVjdElkKCIxMjMiKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3ROYW1lKCJ0ZXN0LnR4dCIpOworICAgIHByb2R1Y3Quc2V0UHJvZHVjdFN0cnVjdHVyZShQcm9kdWN0LlNUUlVDVFVSRV9GTEFUKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3RUeXBlKHByb2R1Y3RUeXBlKTsKKworICAgIFByb2R1Y3RSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBQcm9kdWN0UmVzb3VyY2UocHJvZHVjdCwgbWV0YWRhdGEsCisgICAgICByZWZlcmVuY2VzLCBuZXcgRmlsZSgiL3RtcCIpKTsKKworCisgICAgLy8gR2VuZXJhdGUgdGhlIGV4cGVjdGVkIG91dHB1dC4KKyAgICBTdHJpbmcgZXhwZWN0ZWRYbWwgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PiIKKyAgICAgICAgKyAiPHByb2R1Y3Q+IgorICAgICAgICArICI8aWQ+IiArIHByb2R1Y3QuZ2V0UHJvZHVjdElkKCkgKyAiPC9pZD4iCisgICAgICAgICsgIjxuYW1lPiIgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiPC9uYW1lPiIKKyAgICAgICAgKyAiPHN0cnVjdHVyZT4iICsgcHJvZHVjdC5nZXRQcm9kdWN0U3RydWN0dXJlKCkgKyAiPC9zdHJ1Y3R1cmU+IgorICAgICAgICArICI8dHlwZT4iICsgcHJvZHVjdFR5cGUuZ2V0TmFtZSgpICsgIjwvdHlwZT4iCisgICAgICAgICsgIjxtZXRhZGF0YT4iCisgICAgICAgICsgIjxrZXl2YWw+IgorICAgICAgICArICI8a2V5PiIgKyBtZXRhZGF0YS5nZXRBbGxLZXlzKCkuZ2V0KDApICsgIjwva2V5PiIKKyAgICAgICAgKyAiPHZhbD4iICsgbWV0YWRhdGEuZ2V0QWxsVmFsdWVzKCkuZ2V0KDApICsgIjwvdmFsPiIKKyAgICAgICAgKyAiPC9rZXl2YWw+IgorICAgICAgICArICI8L21ldGFkYXRhPiIKKyAgICAgICAgKyAiPHJlZmVyZW5jZXM+IgorICAgICAgICArICI8cmVmZXJlbmNlPiIKKyAgICAgICAgKyAiPHByb2R1Y3RJZD4iICsgcHJvZHVjdC5nZXRQcm9kdWN0SWQoKSArICI8L3Byb2R1Y3RJZD4iCisgICAgICAgICsgIjxyZWZJbmRleD4wPC9yZWZJbmRleD4iCisgICAgICAgICsgIjxkYXRhU3RvcmVSZWZlcmVuY2U+IgorICAgICAgICArICAgIHJlZmVyZW5jZS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICAgICAgICArICI8L2RhdGFTdG9yZVJlZmVyZW5jZT4iCisgICAgICAgICsgIjxvcmlnaW5hbFJlZmVyZW5jZT4iCisgICAgICAgICsgICAgcmVmZXJlbmNlLmdldE9yaWdSZWZlcmVuY2UoKQorICAgICAgICArICI8L29yaWdpbmFsUmVmZXJlbmNlPiIKKyAgICAgICAgKyAiPG1pbWVUeXBlPiIgKyByZWZlcmVuY2UuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkgKyAiPC9taW1lVHlwZT4iCisgICAgICAgICsgIjxmaWxlU2l6ZT4iICsgcmVmZXJlbmNlLmdldEZpbGVTaXplKCkgKyAiPC9maWxlU2l6ZT4iCisgICAgICAgICsgIjwvcmVmZXJlbmNlPiIKKyAgICAgICAgKyAiPC9yZWZlcmVuY2VzPiIKKyAgICAgICAgKyAiPC9wcm9kdWN0PiI7CisKKworICAgIC8vIFNldCB1cCBhIEpBWEIgY29udGV4dCBhbmQgbWFyc2hhbGwgdGhlIFByb2R1Y3RSZXNvdXJjZSB0byBYTUwuCisgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKHJlc291cmNlLmdldENsYXNzKCkpOworICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgbWFyc2hhbGxlci5tYXJzaGFsKHJlc291cmNlLCB3cml0ZXIpOworCisgICAgLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgYW5kIGFjdHVhbCBvdXRwdXRzLgorICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKKyAgICBYTUxVbml0LnNldElnbm9yZUNvbW1lbnRzKHRydWUpOworICAgIFhNTFVuaXQuc2V0SWdub3JlQXR0cmlidXRlT3JkZXIodHJ1ZSk7CisgICAgRGlmZiBkaWZmID0gbmV3IERpZmYoZXhwZWN0ZWRYbWwsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICBhc3NlcnRUcnVlKCJUaGUgb3V0cHV0IFhNTCB3YXMgZGlmZmVyZW50IHRvIHRoZSBleHBlY3RlZCBYTUw6ICIKKyAgICAgICsgZGlmZi50b1N0cmluZygpLCBkaWZmLmlkZW50aWNhbCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9SZWZlcmVuY2VSZXNvdXJjZVRlc3QuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvUmVmZXJlbmNlUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyNzY4NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvUmVmZXJlbmNlUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QuamF4cnMucmVzb3VyY2VzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlczsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50cyB0ZXN0cyBmb3IgbWV0aG9kcyBpbiB0aGUge0BsaW5rIFJlZmVyZW5jZVJlc291cmNlfSBjbGFzcy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJlZmVyZW5jZVJlc291cmNlVGVzdAoreworICAvKioKKyAgICogVGVzdHMgdGhhdCB7QGxpbmsgUmVmZXJlbmNlUmVzb3VyY2UgcmVmZXJlbmNlIHJlc291cmNlc30gYXJlIG1hcnNoYWxsZWQgdG8KKyAgICogdGhlIGV4cGVjdGVkIFhNTCBmb3JtYXQuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaWYgdGhlIHtAbGluayBKQVhCQ29udGV4dH0gb3Ige0BsaW5rIE1hcnNoYWxsZXJ9IGZhaWwKKyAgICogQHRocm93cyBNaW1lVHlwZUV4Y2VwdGlvbiBpZiB7QGxpbmsgTWltZVR5cGVzI2Zvck5hbWUoU3RyaW5nKX0gZmFpbHMKKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFhtbE1hcnNoYWxsaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uLAorICAgIE1pbWVUeXBlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KKyAgeworICAgIFN0cmluZyBwcm9kdWN0SWQgPSAiMTIzIjsKKyAgICBpbnQgcmVmSW5kZXggPSAwOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFJlZmVyZW5jZVJlc291cmNlIHVzaW5nIGEgUmVmZXJlbmNlIGluc3RhbmNlLgorICAgIFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKCJvcmlnaW5hbCIsICJkYXRhU3RvcmUiLCAxMDAwLAorICAgICAgbmV3IE1pbWVUeXBlcygpLmZvck5hbWUoInRleHQvcGxhaW4iKSk7CisKKyAgICBSZWZlcmVuY2VSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZWZlcmVuY2VSZXNvdXJjZShwcm9kdWN0SWQsIHJlZkluZGV4LAorICAgICAgcmVmZXJlbmNlLCBuZXcgRmlsZSgiL3RtcCIpKTsKKworCisgICAgLy8gR2VuZXJhdGUgdGhlIGV4cGVjdGVkIG91dHB1dC4KKyAgICBTdHJpbmcgZXhwZWN0ZWRYbWwgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PiIKKyAgICAgICsgIjxyZWZlcmVuY2U+IgorICAgICAgKyAiPHByb2R1Y3RJZD4iICsgcHJvZHVjdElkICsgIjwvcHJvZHVjdElkPiIKKyAgICAgICsgIjxyZWZJbmRleD4iICsgcmVmSW5kZXggKyAiPC9yZWZJbmRleD4iCisgICAgICArICI8ZGF0YVN0b3JlUmVmZXJlbmNlPiIKKyAgICAgICsgICAgcmVmZXJlbmNlLmdldERhdGFTdG9yZVJlZmVyZW5jZSgpCisgICAgICArICI8L2RhdGFTdG9yZVJlZmVyZW5jZT4iCisgICAgICArICI8b3JpZ2luYWxSZWZlcmVuY2U+IgorICAgICAgKyAgICByZWZlcmVuY2UuZ2V0T3JpZ1JlZmVyZW5jZSgpCisgICAgICArICI8L29yaWdpbmFsUmVmZXJlbmNlPiIKKyAgICAgICsgIjxtaW1lVHlwZT4iICsgcmVmZXJlbmNlLmdldE1pbWVUeXBlKCkuZ2V0TmFtZSgpICsgIjwvbWltZVR5cGU+IgorICAgICAgKyAiPGZpbGVTaXplPiIgKyByZWZlcmVuY2UuZ2V0RmlsZVNpemUoKSArICAiPC9maWxlU2l6ZT4iCisgICAgICArICI8L3JlZmVyZW5jZT4iOworCisKKyAgICAvLyBTZXQgdXAgYSBKQVhCIGNvbnRleHQgYW5kIG1hcnNoYWxsIHRoZSBSZWZlcmVuY2VSZXNvdXJjZSB0byBYTUwuCisgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKHJlc291cmNlLmdldENsYXNzKCkpOworICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgbWFyc2hhbGxlci5tYXJzaGFsKHJlc291cmNlLCB3cml0ZXIpOworCisgICAgLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgYW5kIGFjdHVhbCBvdXRwdXRzLgorICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKKyAgICBYTUxVbml0LnNldElnbm9yZUNvbW1lbnRzKHRydWUpOworICAgIFhNTFVuaXQuc2V0SWdub3JlQXR0cmlidXRlT3JkZXIodHJ1ZSk7CisgICAgRGlmZiBkaWZmID0gbmV3IERpZmYoZXhwZWN0ZWRYbWwsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICBhc3NlcnRUcnVlKCJUaGUgb3V0cHV0IFhNTCB3YXMgZGlmZmVyZW50IHRvIHRoZSBleHBlY3RlZCBYTUw6ICIKKyAgICAgICsgZGlmZi50b1N0cmluZygpLCBkaWZmLmlkZW50aWNhbCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9UcmFuc2ZlclJlc291cmNlVGVzdC5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9UcmFuc2ZlclJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTg5YWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvamF4cnMvcmVzb3VyY2VzL1RyYW5zZmVyUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5GaWxlVHJhbnNmZXJTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMuUHJvZHVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NaW1lVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpa2EubWltZS5NaW1lVHlwZXM7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmY7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFVuaXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudHMgdGVzdHMgZm9yIG1ldGhvZHMgaW4gdGhlIHtAbGluayBUcmFuc2ZlclJlc291cmNlfSBjbGFzcy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFRyYW5zZmVyUmVzb3VyY2VUZXN0Cit7CisgIC8qKgorICAgKiBUZXN0cyB0aGF0IHtAbGluayBUcmFuc2ZlclJlc291cmNlIHRyYW5zZmVyIHJlc291cmNlc30gYXJlIG1hcnNoYWxsZWQgdG8KKyAgICogdGhlIGV4cGVjdGVkIFhNTCBmb3JtYXQuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaWYgdGhlIHtAbGluayBKQVhCQ29udGV4dH0gb3Ige0BsaW5rIE1hcnNoYWxsZXJ9IGZhaWwKKyAgICogQHRocm93cyBNaW1lVHlwZUV4Y2VwdGlvbiBpZiB7QGxpbmsgTWltZVR5cGVzI2Zvck5hbWUoU3RyaW5nKX0gZmFpbHMKKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgdGhlIHtAbGluayBEaWZmfSBjb25zdHJ1Y3RvciBmYWlscworICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFhtbE1hcnNoYWxsaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uLAorICAgIE1pbWVUeXBlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KKyAgeworICAgIC8vIENyZWF0ZSBhIFRyYW5zZmVyUmVzb3VyY2UgdXNpbmcgUHJvZHVjdFR5cGUsIFByb2R1Y3QsIE1ldGFkYXRhLCBSZWZlcmVuY2UKKyAgICAvLyBhbmQgRmlsZVRyYW5zZmVyU3RhdHVzIGluc3RhbmNlcy4KKyAgICBIYXNodGFibGUgbWV0YWRhdGFFbnRyaWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBtZXRhZGF0YUVudHJpZXMucHV0KCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsICIyMDEzLTA5LTEyVDE2OjI1OjUwLjY2MloiKTsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgIG1ldGFkYXRhLmFkZE1ldGFkYXRhKG1ldGFkYXRhRW50cmllcyk7CisKKyAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSgib3JpZ2luYWwiLCAiZGF0YVN0b3JlIiwgMTAwMCwKKyAgICAgIG5ldyBNaW1lVHlwZXMoKS5mb3JOYW1lKCJ0ZXh0L3BsYWluIikpOworCisgICAgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUgPSBuZXcgUHJvZHVjdFR5cGUoIjEiLCAiR2VuZXJpY0ZpbGUiLCAidGVzdCB0eXBlIiwKKyAgICAgICJyZXBvc2l0b3J5IiwgInZlcnNpb25lciIpOworCisgICAgUHJvZHVjdCBwcm9kdWN0ID0gbmV3IFByb2R1Y3QoKTsKKyAgICBwcm9kdWN0LnNldFByb2R1Y3RJZCgiMTIzIik7CisgICAgcHJvZHVjdC5zZXRQcm9kdWN0TmFtZSgidGVzdCBwcm9kdWN0Iik7CisgICAgcHJvZHVjdC5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworICAgIHByb2R1Y3Quc2V0UHJvZHVjdFR5cGUocHJvZHVjdFR5cGUpOworCisgICAgRmlsZVRyYW5zZmVyU3RhdHVzIHN0YXR1cyA9IG5ldyBGaWxlVHJhbnNmZXJTdGF0dXMocmVmZXJlbmNlLCAxMDAwLCAxMDAsCisgICAgICBwcm9kdWN0KTsKKworICAgIFRyYW5zZmVyUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgVHJhbnNmZXJSZXNvdXJjZShwcm9kdWN0LCBtZXRhZGF0YSwgc3RhdHVzKTsKKworCisgICAgLy8gR2VuZXJhdGUgdGhlIGV4cGVjdGVkIG91dHB1dC4KKyAgICBTdHJpbmcgZXhwZWN0ZWRYbWwgPQorICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz4iCisgICAgICArICI8dHJhbnNmZXI+IgorICAgICAgKyAiPHByb2R1Y3ROYW1lPiIgKyBwcm9kdWN0LmdldFByb2R1Y3ROYW1lKCkgKyAiPC9wcm9kdWN0TmFtZT4iCisgICAgICArICI8cHJvZHVjdElkPiIgKyBwcm9kdWN0LmdldFByb2R1Y3RJZCgpICsgIjwvcHJvZHVjdElkPiIKKyAgICAgICsgIjxwcm9kdWN0VHlwZU5hbWU+IiArIHByb2R1Y3RUeXBlLmdldE5hbWUoKSArICI8L3Byb2R1Y3RUeXBlTmFtZT4iCisgICAgICArICI8ZGF0YVN0b3JlUmVmZXJlbmNlPiIKKyAgICAgICsgICByZWZlcmVuY2UuZ2V0RGF0YVN0b3JlUmVmZXJlbmNlKCkKKyAgICAgICsgIjwvZGF0YVN0b3JlUmVmZXJlbmNlPiIKKyAgICAgICsgIjxvcmlnUmVmZXJlbmNlPiIKKyAgICAgICsgICByZWZlcmVuY2UuZ2V0T3JpZ1JlZmVyZW5jZSgpCisgICAgICArICI8L29yaWdSZWZlcmVuY2U+IgorICAgICAgKyAiPG1pbWVUeXBlPiIgKyByZWZlcmVuY2UuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkgKyAiPC9taW1lVHlwZT4iCisgICAgICArICI8ZmlsZVNpemU+IiArIHJlZmVyZW5jZS5nZXRGaWxlU2l6ZSgpICsgIjwvZmlsZVNpemU+IgorICAgICAgKyAiPHRvdGFsQnl0ZXM+IiArIHJlZmVyZW5jZS5nZXRGaWxlU2l6ZSgpICsgIjwvdG90YWxCeXRlcz4iCisgICAgICArICI8Ynl0ZXNUcmFuc2ZlcnJlZD4iCisgICAgICArICAgIHN0YXR1cy5nZXRCeXRlc1RyYW5zZmVycmVkKCkKKyAgICAgICsgIjwvYnl0ZXNUcmFuc2ZlcnJlZD4iCisgICAgICArICI8cGVyY2VudENvbXBsZXRlPiIKKyAgICAgICsgICAgc3RhdHVzLmNvbXB1dGVQY3RUcmFuc2ZlcnJlZCgpICogMTAwCisgICAgICArICI8L3BlcmNlbnRDb21wbGV0ZT4iCisgICAgICArICI8cHJvZHVjdFJlY2VpdmVkVGltZT4iCisgICAgICArICAgIG1ldGFkYXRhLmdldEFsbFZhbHVlcygpLmdldCgwKQorICAgICAgKyAiPC9wcm9kdWN0UmVjZWl2ZWRUaW1lPiIKKyAgICAgICsgIjwvdHJhbnNmZXI+IjsKKworICAgIC8vIFNldCB1cCBhIEpBWEIgY29udGV4dCBhbmQgbWFyc2hhbGwgdGhlIERhdGFzZXRSZXNvdXJjZSB0byBYTUwuCisgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKHJlc291cmNlLmdldENsYXNzKCkpOworICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgbWFyc2hhbGxlci5tYXJzaGFsKHJlc291cmNlLCB3cml0ZXIpOworCisgICAgLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgYW5kIGFjdHVhbCBvdXRwdXRzLgorICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKKyAgICBYTUxVbml0LnNldElnbm9yZUNvbW1lbnRzKHRydWUpOworICAgIFhNTFVuaXQuc2V0SWdub3JlQXR0cmlidXRlT3JkZXIodHJ1ZSk7CisgICAgRGlmZiBkaWZmID0gbmV3IERpZmYoZXhwZWN0ZWRYbWwsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICBhc3NlcnRUcnVlKCJUaGUgb3V0cHV0IFhNTCB3YXMgZGlmZmVyZW50IHRvIHRoZSBleHBlY3RlZCBYTUw6ICIKKyAgICAgICsgZGlmZi50b1N0cmluZygpLCBkaWZmLmlkZW50aWNhbCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L2pheHJzL3Jlc291cmNlcy9UcmFuc2ZlcnNSZXNvdXJjZVRlc3QuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvVHJhbnNmZXJzUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MGJjNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9qYXhycy9yZXNvdXJjZXMvVHJhbnNmZXJzUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmpheHJzLnJlc291cmNlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLkZpbGVUcmFuc2ZlclN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmZpbGVtZ3Iuc3RydWN0cy5Qcm9kdWN0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlByb2R1Y3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuZmlsZW1nci5zdHJ1Y3RzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5taW1lLk1pbWVUeXBlczsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50cyB0ZXN0cyBmb3IgbWV0aG9kcyBpbiB0aGUge0BsaW5rIFRyYW5zZmVyc1Jlc291cmNlfSBjbGFzcy4KKyAqIEBhdXRob3IgcmxhaWRsYXcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFRyYW5zZmVyc1Jlc291cmNlVGVzdAoreworICAvKioKKyAgICogVGVzdHMgdGhhdCB7QGxpbmsgVHJhbnNmZXJSZXNvdXJjZSB0cmFuc2ZlciByZXNvdXJjZXN9IGFyZSBtYXJzaGFsbGVkIHRvCisgICAqIHRoZSBleHBlY3RlZCBYTUwgZm9ybWF0LgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgRGlmZn0gY29uc3RydWN0b3IgZmFpbHMKKyAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgSkFYQkNvbnRleHR9IG9yIHtAbGluayBNYXJzaGFsbGVyfSBmYWlsCisgICAqIEB0aHJvd3MgTWltZVR5cGVFeGNlcHRpb24gaWYge0BsaW5rIE1pbWVUeXBlcyNmb3JOYW1lKFN0cmluZyl9IGZhaWxzCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgRGlmZn0gY29uc3RydWN0b3IgZmFpbHMKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RYbWxNYXJzaGFsbGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSkFYQkV4Y2VwdGlvbiwKKyAgICBNaW1lVHlwZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBDcmVhdGUgYSBGaWxlVHJhbnNmZXJTdGF0dXMgaW5zdGFuY2UgdXNpbmcgTWV0YWRhdGEsIFJlZmVyZW5jZSwKKyAgICAvLyBQcm9kdWN0VHlwZSBhbmQgUHJvZHVjdCBpbnN0YW5jZXMuCisgICAgSGFzaHRhYmxlIG1ldGFkYXRhRW50cmllczEgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgIG1ldGFkYXRhRW50cmllczEucHV0KCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsICIyMDEzLTA5LTEyVDE2OjI1OjUwLjY2MloiKTsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YTEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YTEuYWRkTWV0YWRhdGEobWV0YWRhdGFFbnRyaWVzMSk7CisKKyAgICBSZWZlcmVuY2UgcmVmZXJlbmNlMSA9IG5ldyBSZWZlcmVuY2UoIm9yaWdpbmFsMSIsICJkYXRhU3RvcmUxIiwgMTAwMCwKKyAgICAgIG5ldyBNaW1lVHlwZXMoKS5mb3JOYW1lKCJ0ZXh0L3BsYWluIikpOworCisgICAgUHJvZHVjdFR5cGUgcHJvZHVjdFR5cGUxID0gbmV3IFByb2R1Y3RUeXBlKCIxIiwgIlRlc3RUeXBlIiwgInRlc3QgdHlwZSAxIiwKKyAgICAgICJyZXBvc2l0b3J5MSIsICJ2ZXJzaW9uZXIxIik7CisKKyAgICBQcm9kdWN0IHByb2R1Y3QxID0gbmV3IFByb2R1Y3QoKTsKKyAgICBwcm9kdWN0MS5zZXRQcm9kdWN0SWQoIjEyMyIpOworICAgIHByb2R1Y3QxLnNldFByb2R1Y3ROYW1lKCJ0ZXN0IHByb2R1Y3QiKTsKKyAgICBwcm9kdWN0MS5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0ZMQVQpOworICAgIHByb2R1Y3QxLnNldFByb2R1Y3RUeXBlKHByb2R1Y3RUeXBlMSk7CisKKyAgICBGaWxlVHJhbnNmZXJTdGF0dXMgc3RhdHVzMSA9IG5ldyBGaWxlVHJhbnNmZXJTdGF0dXMocmVmZXJlbmNlMSwgMTAwMCwgMTAwLAorICAgICAgcHJvZHVjdDEpOworCisKKyAgICAvLyBDcmVhdGUgYW5vdGhlciBGaWxlVHJhbnNmZXJTdGF0dXMgaW5zdGFuY2UgdXNpbmcgTWV0YWRhdGEsIFJlZmVyZW5jZSwKKyAgICAvLyBQcm9kdWN0VHlwZSBhbmQgUHJvZHVjdCBpbnN0YW5jZXMuCisgICAgSGFzaHRhYmxlIG1ldGFkYXRhRW50cmllczIgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgIG1ldGFkYXRhRW50cmllczIucHV0KCJDQVMuUHJvZHVjdFJlY2VpdmVkVGltZSIsICIyMDExLTA0LTExVDExOjU5OjU5LjY2MloiKTsKKyAgICBNZXRhZGF0YSBtZXRhZGF0YTIgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXRhZGF0YTIuYWRkTWV0YWRhdGEobWV0YWRhdGFFbnRyaWVzMik7CisKKyAgICBSZWZlcmVuY2UgcmVmZXJlbmNlMiA9IG5ldyBSZWZlcmVuY2UoIm9yaWdpbmFsMiIsICJkYXRhU3RvcmUyIiwgNTAwLAorICAgICAgbmV3IE1pbWVUeXBlcygpLmZvck5hbWUoImFwcGxpY2F0aW9uL3BkZiIpKTsKKworICAgIFByb2R1Y3RUeXBlIHByb2R1Y3RUeXBlMiA9IG5ldyBQcm9kdWN0VHlwZSgiMiIsICJUZXN0VHlwZTIiLCAidGVzdCB0eXBlIDIiLAorICAgICAgICAicmVwb3NpdG9yeTIiLCAidmVyc2lvbmVyMiIpOworCisgICAgUHJvZHVjdCBwcm9kdWN0MiA9IG5ldyBQcm9kdWN0KCk7CisgICAgcHJvZHVjdDIuc2V0UHJvZHVjdElkKCI0NTYiKTsKKyAgICBwcm9kdWN0Mi5zZXRQcm9kdWN0TmFtZSgidGVzdCBwcm9kdWN0IDIiKTsKKyAgICBwcm9kdWN0Mi5zZXRQcm9kdWN0U3RydWN0dXJlKFByb2R1Y3QuU1RSVUNUVVJFX0hJRVJBUkNISUNBTCk7CisgICAgcHJvZHVjdDIuc2V0UHJvZHVjdFR5cGUocHJvZHVjdFR5cGUyKTsKKworICAgIEZpbGVUcmFuc2ZlclN0YXR1cyBzdGF0dXMyID0gbmV3IEZpbGVUcmFuc2ZlclN0YXR1cyhyZWZlcmVuY2UyLCA1MDAsIDIwMCwKKyAgICAgIHByb2R1Y3QyKTsKKworCisgICAgLy8gQ3JlYXRlIGEgVHJhbnNmZXJzUmVzb3VyY2UgdXNpbmcgdGhlIHR3byBGaWxlVHJhbnNmZXJTdGF0dXMgaW5zdGFuY2VzIHRvCisgICAgLy8gZ2VuZXJhdGUgVHJhbnNmZXJSZXNvdXJjZSBpbnN0YW5jZXMgZm9yIHRoZSBUcmFuc2ZlcnNSZXNvdXJjZS4KKyAgICBMaXN0PFRyYW5zZmVyUmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8VHJhbnNmZXJSZXNvdXJjZT4oKTsKKyAgICByZXNvdXJjZXMuYWRkKG5ldyBUcmFuc2ZlclJlc291cmNlKHByb2R1Y3QxLCBtZXRhZGF0YTEsIHN0YXR1czEpKTsKKyAgICByZXNvdXJjZXMuYWRkKG5ldyBUcmFuc2ZlclJlc291cmNlKHByb2R1Y3QyLCBtZXRhZGF0YTIsIHN0YXR1czIpKTsKKyAgICBUcmFuc2ZlcnNSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBUcmFuc2ZlcnNSZXNvdXJjZSgiQUxMIiwgcmVzb3VyY2VzKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBleHBlY3RlZCBvdXRwdXQuCisgICAgU3RyaW5nIGV4cGVjdGVkWG1sID0KKyAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+IgorICAgICAgKyAiPHRyYW5zZmVycyBwcm9kdWN0SWQ9XCJBTExcIj4iCisgICAgICArICI8dHJhbnNmZXI+IgorICAgICAgKyAiPHByb2R1Y3ROYW1lPiIgKyBwcm9kdWN0MS5nZXRQcm9kdWN0TmFtZSgpICsgIjwvcHJvZHVjdE5hbWU+IgorICAgICAgKyAiPHByb2R1Y3RJZD4iICsgcHJvZHVjdDEuZ2V0UHJvZHVjdElkKCkgKyAiPC9wcm9kdWN0SWQ+IgorICAgICAgKyAiPHByb2R1Y3RUeXBlTmFtZT4iICsgcHJvZHVjdFR5cGUxLmdldE5hbWUoKSArICI8L3Byb2R1Y3RUeXBlTmFtZT4iCisgICAgICArICI8ZGF0YVN0b3JlUmVmZXJlbmNlPiIKKyAgICAgICsgICAgcmVmZXJlbmNlMS5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICAgICAgKyAiPC9kYXRhU3RvcmVSZWZlcmVuY2U+IgorICAgICAgKyAiPG9yaWdSZWZlcmVuY2U+IiArIHJlZmVyZW5jZTEuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIjwvb3JpZ1JlZmVyZW5jZT4iCisgICAgICArICI8bWltZVR5cGU+IiArIHJlZmVyZW5jZTEuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkgKyAiPC9taW1lVHlwZT4iCisgICAgICArICI8ZmlsZVNpemU+IiArIHJlZmVyZW5jZTEuZ2V0RmlsZVNpemUoKSArICI8L2ZpbGVTaXplPiIKKyAgICAgICsgIjx0b3RhbEJ5dGVzPiIgKyByZWZlcmVuY2UxLmdldEZpbGVTaXplKCkgKyAiPC90b3RhbEJ5dGVzPiIKKyAgICAgICsgIjxieXRlc1RyYW5zZmVycmVkPiIKKyAgICAgICsgICAgc3RhdHVzMS5nZXRCeXRlc1RyYW5zZmVycmVkKCkKKyAgICAgICsgIjwvYnl0ZXNUcmFuc2ZlcnJlZD4iCisgICAgICArICI8cGVyY2VudENvbXBsZXRlPiIKKyAgICAgICsgICAgc3RhdHVzMS5jb21wdXRlUGN0VHJhbnNmZXJyZWQoKSAqIDEwMAorICAgICAgKyAiPC9wZXJjZW50Q29tcGxldGU+IgorICAgICAgKyAiPHByb2R1Y3RSZWNlaXZlZFRpbWU+IgorICAgICAgKyAgICBtZXRhZGF0YTEuZ2V0QWxsVmFsdWVzKCkuZ2V0KDApCisgICAgICArICI8L3Byb2R1Y3RSZWNlaXZlZFRpbWU+IgorICAgICAgKyAiPC90cmFuc2Zlcj4iCisgICAgICArICI8dHJhbnNmZXI+IgorICAgICAgKyAiPHByb2R1Y3ROYW1lPiIgKyBwcm9kdWN0Mi5nZXRQcm9kdWN0TmFtZSgpICsgIjwvcHJvZHVjdE5hbWU+IgorICAgICAgKyAiPHByb2R1Y3RJZD4iICsgcHJvZHVjdDIuZ2V0UHJvZHVjdElkKCkgKyAiPC9wcm9kdWN0SWQ+IgorICAgICAgKyAiPHByb2R1Y3RUeXBlTmFtZT4iICsgcHJvZHVjdFR5cGUyLmdldE5hbWUoKSArICI8L3Byb2R1Y3RUeXBlTmFtZT4iCisgICAgICArICI8ZGF0YVN0b3JlUmVmZXJlbmNlPiIKKyAgICAgICsgICAgcmVmZXJlbmNlMi5nZXREYXRhU3RvcmVSZWZlcmVuY2UoKQorICAgICAgKyAiPC9kYXRhU3RvcmVSZWZlcmVuY2U+IgorICAgICAgKyAiPG9yaWdSZWZlcmVuY2U+IiArIHJlZmVyZW5jZTIuZ2V0T3JpZ1JlZmVyZW5jZSgpICsgIjwvb3JpZ1JlZmVyZW5jZT4iCisgICAgICArICI8bWltZVR5cGU+IiArIHJlZmVyZW5jZTIuZ2V0TWltZVR5cGUoKS5nZXROYW1lKCkgKyAiPC9taW1lVHlwZT4iCisgICAgICArICI8ZmlsZVNpemU+IiArIHJlZmVyZW5jZTIuZ2V0RmlsZVNpemUoKSArICI8L2ZpbGVTaXplPiIKKyAgICAgICsgIjx0b3RhbEJ5dGVzPiIgKyByZWZlcmVuY2UyLmdldEZpbGVTaXplKCkgKyAiPC90b3RhbEJ5dGVzPiIKKyAgICAgICsgIjxieXRlc1RyYW5zZmVycmVkPiIKKyAgICAgICsgICAgc3RhdHVzMi5nZXRCeXRlc1RyYW5zZmVycmVkKCkKKyAgICAgICsgIjwvYnl0ZXNUcmFuc2ZlcnJlZD4iCisgICAgICArICI8cGVyY2VudENvbXBsZXRlPiIKKyAgICAgICsgICAgc3RhdHVzMi5jb21wdXRlUGN0VHJhbnNmZXJyZWQoKSAqIDEwMAorICAgICAgKyAiPC9wZXJjZW50Q29tcGxldGU+IgorICAgICAgKyAiPHByb2R1Y3RSZWNlaXZlZFRpbWU+IgorICAgICAgKyAgICBtZXRhZGF0YTIuZ2V0QWxsVmFsdWVzKCkuZ2V0KDApCisgICAgICArICI8L3Byb2R1Y3RSZWNlaXZlZFRpbWU+IgorICAgICAgKyAiPC90cmFuc2Zlcj4iCisgICAgICArIjwvdHJhbnNmZXJzPiI7CisKKyAgICAvLyBTZXQgdXAgYSBKQVhCIGNvbnRleHQgYW5kIG1hcnNoYWxsIHRoZSBEYXRhc2V0UmVzb3VyY2UgdG8gWE1MLgorICAgIEpBWEJDb250ZXh0IGNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShyZXNvdXJjZS5nZXRDbGFzcygpKTsKKyAgICBNYXJzaGFsbGVyIG1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgIG1hcnNoYWxsZXIubWFyc2hhbChyZXNvdXJjZSwgd3JpdGVyKTsKKworICAgIC8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIGFuZCBhY3R1YWwgb3V0cHV0cy4KKyAgICBYTUxVbml0LnNldElnbm9yZVdoaXRlc3BhY2UodHJ1ZSk7CisgICAgWE1MVW5pdC5zZXRJZ25vcmVDb21tZW50cyh0cnVlKTsKKyAgICBYTUxVbml0LnNldElnbm9yZUF0dHJpYnV0ZU9yZGVyKHRydWUpOworICAgIERpZmYgZGlmZiA9IG5ldyBEaWZmKGV4cGVjdGVkWG1sLCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgYXNzZXJ0VHJ1ZSgiVGhlIG91dHB1dCBYTUwgd2FzIGRpZmZlcmVudCB0byB0aGUgZXhwZWN0ZWQgWE1MOiAiCisgICAgICArIGRpZmYudG9TdHJpbmcoKSwgZGlmZi5pZGVudGljYWwoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvVGVzdFJERkNvbmZpZ1JlYWRlci5qYXZhIGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy9wcm9kdWN0L3JkZi9UZXN0UkRGQ29uZmlnUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhYzk0NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yZGYvVGVzdFJERkNvbmZpZ1JlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMucHJvZHVjdC5yZGY7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKKworLy9KVW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogRXhlcmNpc2VzIHRoZSB7QGxpbmsgUkRGQ29uZmlnUmVhZGVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UkRGQ29uZmlnUmVhZGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTmFtZXNwYWNlcygpIHsKKyAgICBTdHJpbmcgdGVzdERvY1N0cmluZyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PjxvdXRlcj48bmFtZXNwYWNlcz48bnMgbmFtZT1cImZvb1wiIHZhbHVlPVwiYmFyXCIvPjwvbmFtZXNwYWNlcz48L291dGVyPlxuIjsKKyAgICBEb2N1bWVudCB0ZXN0RG9jID0gWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgdGVzdERvY1N0cmluZy5nZXRCeXRlcygpKSk7CisgICAgUkRGQ29uZmlnIGNvbmYgPSBuZXcgUkRGQ29uZmlnKCk7CisgICAgUkRGQ29uZmlnUmVhZGVyLnJlYWROYW1lc3BhY2VzKHRlc3REb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGNvbmYpOworICAgIGFzc2VydE5vdE51bGwoY29uZik7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldE5zTWFwKCkpOworICAgIGFzc2VydE5vdE51bGwoY29uZi5nZXROc01hcCgpLmtleVNldCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY29uZi5nZXROc01hcCgpLmtleVNldCgpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZShjb25mLmdldE5zTWFwKCkuY29udGFpbnNLZXkoImZvbyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImJhciIsIGNvbmYuZ2V0TnNNYXAoKS5nZXQoImZvbyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkUmV3cml0ZVJ1bGVzKCkgeworICAgIFN0cmluZyB0ZXN0RG9jU3RyaW5nID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+PG91dGVyPjxyZXdyaXRlPjxrZXkgZnJvbT1cIlNpdGVJZFwiIHRvPVwic2l0ZVwiLz48L3Jld3JpdGU+PC9vdXRlcj5cbiI7CisgICAgRG9jdW1lbnQgdGVzdERvYyA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgIHRlc3REb2NTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIFJERkNvbmZpZyBjb25mID0gbmV3IFJERkNvbmZpZygpOworICAgIFJERkNvbmZpZ1JlYWRlci5yZWFkUmV3cml0ZVJ1bGVzKHRlc3REb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGNvbmYpOworICAgIGFzc2VydE5vdE51bGwoY29uZik7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldFJld3JpdGVNYXAoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldFJld3JpdGVNYXAoKS5rZXlTZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmYuZ2V0UmV3cml0ZU1hcCgpLmtleVNldCgpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZShjb25mLmdldFJld3JpdGVNYXAoKS5jb250YWluc0tleSgiU2l0ZUlkIikpOworICAgIGFzc2VydEVxdWFscygic2l0ZSIsIGNvbmYuZ2V0UmV3cml0ZU1hcCgpLmdldCgiU2l0ZUlkIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRSZXNvdXJjZUxpbmtzKCkgeworICAgIFN0cmluZyB0ZXN0RG9jU3RyaW5nID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+PG91dGVyPjxyZXNvdXJjZWxpbmtzPjxrZXkgbmFtZT1cIlNpdGVJZFwiIGxpbms9XCJodHRwOi8vZWRybi5uY2kubmloLmdvdi9kYXRhL3NpdGVzL1wiLz48L3Jlc291cmNlbGlua3M+PC9vdXRlcj5cbiI7CisgICAgRG9jdW1lbnQgdGVzdERvYyA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgIHRlc3REb2NTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIFJERkNvbmZpZyBjb25mID0gbmV3IFJERkNvbmZpZygpOworICAgIFJERkNvbmZpZ1JlYWRlci5yZWFkUmVzb3VyY2VMaW5rcyh0ZXN0RG9jLmdldERvY3VtZW50RWxlbWVudCgpLCBjb25mKTsKKyAgICBhc3NlcnROb3ROdWxsKGNvbmYpOworICAgIGFzc2VydE5vdE51bGwoY29uZi5nZXRSZXNMaW5rTWFwKCkpOworICAgIGFzc2VydE5vdE51bGwoY29uZi5nZXRSZXNMaW5rTWFwKCkua2V5U2V0KCkpOworICAgIGFzc2VydEVxdWFscygxLCBjb25mLmdldFJlc0xpbmtNYXAoKS5rZXlTZXQoKS5zaXplKCkpOworICAgIGFzc2VydFRydWUoY29uZi5nZXRSZXNMaW5rTWFwKCkuY29udGFpbnNLZXkoIlNpdGVJZCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9lZHJuLm5jaS5uaWguZ292L2RhdGEvc2l0ZXMvIiwgY29uZi5nZXRSZXNMaW5rTWFwKCkKKyAgICAgICAgLmdldCgiU2l0ZUlkIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRLZXlOc01hcCgpIHsKKyAgICBTdHJpbmcgdGVzdERvY1N0cmluZyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PjxvdXRlcj48a2V5bnNtYXAgZGVmYXVsdD1cImNhc1wiPjxrZXkgbmFtZT1cIlNpdGVJZFwiIG5zPVwieFwiLz48L2tleW5zbWFwPjwvb3V0ZXI+XG4iOworICAgIERvY3VtZW50IHRlc3REb2MgPSBYTUxVdGlscy5nZXREb2N1bWVudFJvb3QobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICB0ZXN0RG9jU3RyaW5nLmdldEJ5dGVzKCkpKTsKKyAgICBSREZDb25maWcgY29uZiA9IG5ldyBSREZDb25maWcoKTsKKyAgICBSREZDb25maWdSZWFkZXIucmVhZEtleU5zTWFwKHRlc3REb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGNvbmYpOworICAgIGFzc2VydE5vdE51bGwoY29uZik7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldEtleU5zTWFwKCkpOworICAgIGFzc2VydE5vdE51bGwoY29uZi5nZXREZWZhdWx0S2V5TnMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJjYXMiLCBjb25mLmdldERlZmF1bHRLZXlOcygpKTsKKyAgICBhc3NlcnROb3ROdWxsKGNvbmYuZ2V0S2V5TnNNYXAoKS5rZXlTZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmYuZ2V0S2V5TnNNYXAoKS5rZXlTZXQoKS5zaXplKCkpOworICAgIGFzc2VydFRydWUoY29uZi5nZXRLZXlOc01hcCgpLmNvbnRhaW5zS2V5KCJTaXRlSWQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgY29uZi5nZXRLZXlOc01hcCgpLmdldCgiU2l0ZUlkIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRUeXBlTnNNYXAoKSB7CisgICAgU3RyaW5nIHRlc3REb2NTdHJpbmcgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48b3V0ZXI+PHR5cGVzbnNtYXAgZGVmYXVsdD1cImNhc1wiPjx0eXBlIG5hbWU9XCJHZW5lcmljRmlsZVwiIG5zPVwiY2FzXCIvPjwvdHlwZXNuc21hcD48L291dGVyPlxuIjsKKyAgICBEb2N1bWVudCB0ZXN0RG9jID0gWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgdGVzdERvY1N0cmluZy5nZXRCeXRlcygpKSk7CisgICAgUkRGQ29uZmlnIGNvbmYgPSBuZXcgUkRGQ29uZmlnKCk7CisgICAgUkRGQ29uZmlnUmVhZGVyLnJlYWRUeXBlc05zTWFwKHRlc3REb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGNvbmYpOworICAgIGFzc2VydE5vdE51bGwoY29uZik7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldFR5cGVzTnNNYXAoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldERlZmF1bHRUeXBlTnMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJjYXMiLCBjb25mLmdldERlZmF1bHRUeXBlTnMoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChjb25mLmdldFR5cGVzTnNNYXAoKS5rZXlTZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmYuZ2V0VHlwZXNOc01hcCgpLmtleVNldCgpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZShjb25mLmdldFR5cGVzTnNNYXAoKS5jb250YWluc0tleSgiR2VuZXJpY0ZpbGUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJjYXMiLCBjb25mLmdldFR5cGVzTnNNYXAoKS5nZXQoIkdlbmVyaWNGaWxlIikpOworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU0NvbmZpZ1JlYWRlclRlc3QuamF2YSBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvcHJvZHVjdC9yc3MvUlNTQ29uZmlnUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NWNjMjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3Byb2R1Y3QvcnNzL1JTU0NvbmZpZ1JlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnByb2R1Y3QucnNzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFJTU0NvbmZpZ1JlYWRlcn0gY2xhc3MuCisgKiBAYXV0aG9yIHJsYWlkbGF3CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSU1NDb25maWdSZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgLyoqCisgICAqIFRlc3RzIHRoZSByZWFkTmFtZXNwYWNlcyBtZXRob2QuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE5hbWVzcGFjZXMoKQorICB7CisgICAgU3RyaW5nIHRlc3RYbWxTdHJpbmcgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICArICI8cnNzOnJzc2NvbmYgeG1sbnM6cnNzPVwiaHR0cDovL29vZHQuYXBhY2hlLm9yZy9ucy9yc3NcIj4iCisgICAgICAgICsgIiAgPG5hbWVzcGFjZSBwcmVmaXg9XCJjYXNcIiB1cmk9XCJodHRwOi8vb29kdC5hcGFjaGUub3JnL25zL2Nhc1wiLz4iCisgICAgICAgICsgIiAgPHRhZyBuYW1lPVwiY2FzOnNvdXJjZVwiIHNvdXJjZT1cIltQcm9kdWN0VHlwZV1cIi8+IgorICAgICAgICArICIgIDxuYW1lc3BhY2UgcHJlZml4PVwicGdlXCIgdXJpPVwiaHR0cDovL29vZHQuYXBhY2hlLm9yZy9ucy9wZ2VcIi8+IgorICAgICAgICArICIgIDx0YWcgbmFtZT1cInBnZTp0YWdcIiBzb3VyY2U9XCJbUHJvZHVjdFR5cGVdXCIvPiIKKyAgICAgICAgKyAiICA8bmFtZXNwYWNlIHByZWZpeD1cInJzc1wiIHVyaT1cImh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvcnNzXCIvPiIKKyAgICAgICAgKyAiICA8dGFnIG5hbWU9XCJyc3M6ZW5jbG9zdXJlXCI+IgorICAgICAgICArICIgICAgPGF0dHJpYnV0ZSBuYW1lPVwieFwiIHZhbHVlPVwiWFwiLz4iCisgICAgICAgICsgIiAgICA8YXR0cmlidXRlIG5hbWU9XCJ5XCIgdmFsdWU9XCJZXCIvPiIKKyAgICAgICAgKyAiICAgIDxhdHRyaWJ1dGUgbmFtZT1cInpcIiB2YWx1ZT1cIlpcIi8+IgorICAgICAgICArICIgIDwvdGFnPiIKKyAgICAgICAgKyAiPC9yc3M6cnNzY29uZj4iOworCisgICAgRG9jdW1lbnQgdGVzdFhtbERvY3VtZW50ID0KKyAgICAgICAgWE1MVXRpbHMuZ2V0RG9jdW1lbnRSb290KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXN0WG1sU3RyaW5nCisgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSkpOworCisgICAgUlNTQ29uZmlnIGNvbmYgPSBuZXcgUlNTQ29uZmlnKCk7CisgICAgUlNTQ29uZmlnUmVhZGVyLnJlYWROYW1lc3BhY2VzKHRlc3RYbWxEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgY29uZik7CisKKyAgICBMaXN0PFJTU05hbWVzcGFjZT4gbmFtZXNwYWNlTGlzdCA9IGNvbmYuZ2V0TmFtZXNwYWNlcygpOworICAgIGFzc2VydE5vdE51bGwobmFtZXNwYWNlTGlzdCk7CisgICAgYXNzZXJ0RmFsc2UobmFtZXNwYWNlTGlzdC5pc0VtcHR5KCkpOworICAgIGFzc2VydEVxdWFscygzLCBuYW1lc3BhY2VMaXN0LnNpemUoKSk7CisKKyAgICBSU1NOYW1lc3BhY2UgbmFtZXNwYWNlQSA9IG5hbWVzcGFjZUxpc3QuZ2V0KDApOworICAgIFJTU05hbWVzcGFjZSBuYW1lc3BhY2VCID0gbmFtZXNwYWNlTGlzdC5nZXQoMSk7CisgICAgUlNTTmFtZXNwYWNlIG5hbWVzcGFjZUMgPSBuYW1lc3BhY2VMaXN0LmdldCgyKTsKKworICAgIGFzc2VydE5vdE51bGwobmFtZXNwYWNlQSk7CisgICAgYXNzZXJ0Tm90TnVsbChuYW1lc3BhY2VCKTsKKyAgICBhc3NlcnROb3ROdWxsKG5hbWVzcGFjZUMpOworCisgICAgYXNzZXJ0RXF1YWxzKCJjYXMiLCBuYW1lc3BhY2VBLmdldFByZWZpeCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBnZSIsIG5hbWVzcGFjZUIuZ2V0UHJlZml4KCkpOworICAgIGFzc2VydEVxdWFscygicnNzIiwgbmFtZXNwYWNlQy5nZXRQcmVmaXgoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvY2FzIiwKKyAgICAgICAgbmFtZXNwYWNlQS5nZXRVcmkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvcGdlIiwKKyAgICAgICAgbmFtZXNwYWNlQi5nZXRVcmkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvcnNzIiwKKyAgICAgICAgbmFtZXNwYWNlQy5nZXRVcmkoKSk7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgdGhlIHJlYWRUYWdzIGFuZCByZWFkQXR0cnMgbWV0aG9kcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkVGFnc0FuZEF0dHJzKCkKKyAgeworICAgIFN0cmluZyB0ZXN0WG1sU3RyaW5nID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKKyAgICAgICAgKyAiPHJzczpyc3Njb25mIHhtbG5zOnJzcz1cImh0dHA6Ly9vb2R0LmFwYWNoZS5vcmcvbnMvcnNzXCI+IgorICAgICAgICArICIgPG5hbWVzcGFjZSBwcmVmaXg9XCJjYXNcIiB1cmk9XCJodHRwOi8vb29kdC5hcGFjaGUub3JnL25zL2Nhc1wiLz4iCisgICAgICAgICsgIiA8dGFnIG5hbWU9XCJjYXM6c291cmNlXCIgc291cmNlPVwiW1Byb2R1Y3RUeXBlXVwiLz4iCisgICAgICAgICsgIiA8bmFtZXNwYWNlIHByZWZpeD1cImdlb3Jzc1wiIHVyaT1cImh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3NcIi8+IgorICAgICAgICArICIgPHRhZyBuYW1lPVwiZ2VvcnNzOnBvaW50XCIgc291cmNlPVwiW0xhdGl0dWRlXSBbTG9uZ2l0dWRlXVwiPiIKKyAgICAgICAgKyAiICA8YXR0cmlidXRlIG5hbWU9XCJvbmVcIiB2YWx1ZT1cIjFcIi8+IgorICAgICAgICArICIgPC90YWc+IgorICAgICAgICArICIgPHRhZyBuYW1lPVwiZW5jbG9zdXJlXCIgc291cmNlPVwiXCI+IgorICAgICAgICArICIgIDxhdHRyaWJ1dGUgbmFtZT1cInR3b1wiIHZhbHVlPVwiMlwiLz4iCisgICAgICAgICsgIiAgPGF0dHJpYnV0ZSBuYW1lPVwidGhyZWVcIiB2YWx1ZT1cIjNcIi8+IgorICAgICAgICArICIgPC90YWc+IgorICAgICAgICArICIgPHRhZyBuYW1lPVwiZW5jbG9zdXJlXCI+IgorICAgICAgICArICIgIDxhdHRyaWJ1dGUgbmFtZT1cImZvdXJcIiB2YWx1ZT1cIjRcIi8+IgorICAgICAgICArICIgIDxhdHRyaWJ1dGUgbmFtZT1cImZpdmVcIiB2YWx1ZT1cIjVcIi8+IgorICAgICAgICArICIgIDxhdHRyaWJ1dGUgbmFtZT1cInNpeFwiIHZhbHVlPVwiNlwiLz4iCisgICAgICAgICsgIiA8L3RhZz4iCisgICAgICAgICsgIjwvcnNzOnJzc2NvbmY+IjsKKworICAgIERvY3VtZW50IHRlc3RYbWxEb2N1bWVudCA9CisgICAgICAgIFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdFhtbFN0cmluZworICAgICAgICAgICAgLmdldEJ5dGVzKCkpKTsKKworICAgIFJTU0NvbmZpZyBjb25mID0gbmV3IFJTU0NvbmZpZygpOworICAgIFJTU0NvbmZpZ1JlYWRlci5yZWFkVGFncyh0ZXN0WG1sRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGNvbmYpOworCisgICAgTGlzdDxSU1NUYWc+IHRhZ0xpc3QgPSBjb25mLmdldFRhZ3MoKTsKKyAgICBhc3NlcnROb3ROdWxsKHRhZ0xpc3QpOworICAgIGFzc2VydEZhbHNlKHRhZ0xpc3QuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgdGFnTGlzdC5zaXplKCkpOworCisgICAgUlNTVGFnIHRhZ0EgPSB0YWdMaXN0LmdldCgwKTsKKyAgICBSU1NUYWcgdGFnQiA9IHRhZ0xpc3QuZ2V0KDEpOworICAgIFJTU1RhZyB0YWdDID0gdGFnTGlzdC5nZXQoMik7CisgICAgUlNTVGFnIHRhZ0QgPSB0YWdMaXN0LmdldCgzKTsKKworICAgIGFzc2VydE5vdE51bGwodGFnQSk7CisgICAgYXNzZXJ0Tm90TnVsbCh0YWdCKTsKKyAgICBhc3NlcnROb3ROdWxsKHRhZ0MpOworICAgIGFzc2VydE5vdE51bGwodGFnRCk7CisKKyAgICBhc3NlcnRFcXVhbHMoImNhczpzb3VyY2UiLCB0YWdBLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJnZW9yc3M6cG9pbnQiLCB0YWdCLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJlbmNsb3N1cmUiLCB0YWdDLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJlbmNsb3N1cmUiLCB0YWdELmdldE5hbWUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIltQcm9kdWN0VHlwZV0iLCB0YWdBLmdldFNvdXJjZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIltMYXRpdHVkZV0gW0xvbmdpdHVkZV0iLCB0YWdCLmdldFNvdXJjZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHRhZ0MuZ2V0U291cmNlKCkpOworICAgIGFzc2VydE51bGwodGFnRC5nZXRTb3VyY2UoKSk7CisKKyAgICBMaXN0PFJTU1RhZ0F0dHJpYnV0ZT4gYXR0cmlidXRlc0EgPSB0YWdBLmdldEF0dHJzKCk7CisgICAgTGlzdDxSU1NUYWdBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNCID0gdGFnQi5nZXRBdHRycygpOworICAgIExpc3Q8UlNTVGFnQXR0cmlidXRlPiBhdHRyaWJ1dGVzQyA9IHRhZ0MuZ2V0QXR0cnMoKTsKKyAgICBMaXN0PFJTU1RhZ0F0dHJpYnV0ZT4gYXR0cmlidXRlc0QgPSB0YWdELmdldEF0dHJzKCk7CisKKyAgICBhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZXNBKTsKKyAgICBhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZXNCKTsKKyAgICBhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZXNDKTsKKyAgICBhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZXNEKTsKKworICAgIGFzc2VydFRydWUoYXR0cmlidXRlc0EuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlc0Iuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlc0Muc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlc0Quc2l6ZSgpKTsKKworICAgIGFzc2VydEVxdWFscygib25lIiwgYXR0cmlidXRlc0IuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCBhdHRyaWJ1dGVzQy5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRocmVlIiwgYXR0cmlidXRlc0MuZ2V0KDEpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb3VyIiwgYXR0cmlidXRlc0QuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmaXZlIiwgYXR0cmlidXRlc0QuZ2V0KDEpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJzaXgiLCBhdHRyaWJ1dGVzRC5nZXQoMikuZ2V0TmFtZSgpKTsKKworICAgIGFzc2VydEVxdWFscygiMSIsIGF0dHJpYnV0ZXNCLmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIjIiLCBhdHRyaWJ1dGVzQy5nZXQoMCkuZ2V0VmFsdWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIzIiwgYXR0cmlidXRlc0MuZ2V0KDEpLmdldFZhbHVlKCkpOworICAgIGFzc2VydEVxdWFscygiNCIsIGF0dHJpYnV0ZXNELmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIjUiLCBhdHRyaWJ1dGVzRC5nZXQoMSkuZ2V0VmFsdWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCI2IiwgYXR0cmlidXRlc0QuZ2V0KDIpLmdldFZhbHVlKCkpOworICB9Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1maWxlLTEudHh0IGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWZpbGUtMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyNWU4NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1maWxlLTEudHh0CkBAIC0wLDAgKzEgQEAKK3RoaXMgaXMgdGVzdC1maWxlLTEKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1maWxlLTIudHh0IGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWZpbGUtMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxZmNmNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1maWxlLTIudHh0CkBAIC0wLDAgKzEgQEAKK3RoaXMgaXMgdGVzdC1maWxlLTIKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1maWxlLTMudHh0IGIvMC4xMC93ZWJhcHAvZm1wcm9kL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWZpbGUtMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2NjcxMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1maWxlLTMudHh0CkBAIC0wLDAgKzEgQEAKK3RoaXMgaXMgdGVzdC1maWxlLTMKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL2ZtcHJvZC9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXMgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTk1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC9mbXByb2Qvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisjIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGxvZ2dpbmcgcHJvcGVydGllcyBmaWxlIGlzIHVzZWQgZHVyaW5nIHVuaXQgdGVzdGluZy4KKworIyBMb2cgbGV2ZWxzOiBPRkYsIFNFVkVSRSwgV0FSTklORywgSU5GTywgQ09ORklHLCBGSU5FLCBGSU5FUiwgRklORVNULCBBTEwKKworIyBTcGVjaWZ5IHdoaWNoIGhhbmRsZXJzIGFyZSB0byBiZSB1c2VkCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCisKKyMgTG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBGSU5FCisKKyMgTG9nZ2luZyBsZXZlbCBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWwgPSBGSU5FCisKKyMgRm9ybWF0dGVyIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKworIyBDQVMtUHJvZHVjdCBzZXR0aW5ncworb3JnLmFwYWNoZS5vb2R0LmNhcy5wcm9kdWN0LmxldmVsID0gRklORQorCisjIEZpbGUgbWFuYWdlciBzZXR0aW5ncworb3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmxldmVsID0gU0VWRVJFCisKKyMgWE1MUlBDIGNvbW1vbnMtaHR0cGNsaWVudCB0cmFuc3BvcnQgbGF5ZXIgc2V0dGluZ3MKK29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmxldmVsID0gV0FSTklORworaHR0cGNsaWVudC53aXJlLmxldmVsID0gV0FSTklORworCisjIEFwYWNoZSBDWEYgc2V0dGluZ3MKK29yZy5hcGFjaGUuY3hmLmxldmVsID0gV0FSTklORworCisjIEpBWEIgc2V0dGluZ3MKK2phdmF4LnhtbC5iaW5kLmxldmVsID0gV0FSTklORworY29tLnN1bi54bWwuYmluZC5sZXZlbCA9IFdBUk5JTkcKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3BvbS54bWwgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTU1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9wb20ueG1sCkBAIC0wLDAgKzEsMTQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCQorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8cGFyZW50PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8L3BhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCTxhcnRpZmFjdElkPndtb25pdG9yPC9hcnRpZmFjdElkPgorCTxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwk8bmFtZT5DQVMgV29ya2Zsb3cgTWFuYWdlciBNb25pdG9yIFdlYiBBcHA8L25hbWU+CisJPHByb3BlcnRpZXM+CisJCTx3aWNrZXQudmVyc2lvbj4xLjQuMTc8L3dpY2tldC52ZXJzaW9uPgorCQk8amV0dHkudmVyc2lvbj42LjEuMjU8L2pldHR5LnZlcnNpb24+CisJCTxzbGY0ai52ZXJzaW9uPjEuNS44PC9zbGY0ai52ZXJzaW9uPgorCQk8bG9nNGoudmVyc2lvbj4xLjIuMTQ8L2xvZzRqLnZlcnNpb24+CisJPC9wcm9wZXJ0aWVzPgorCTxzY20+CisgICAJCTxjb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90YWdzLzAuMTAtcmMyL3dlYmFwcC93bW9uaXRvcjwvY29ubmVjdGlvbj4KKyAgIAkJPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vb2R0L3RhZ3MvMC4xMC1yYzIvd2ViYXBwL3dtb25pdG9yPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgCQk8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyL3dlYmFwcC93bW9uaXRvcjwvdXJsPgorICAJPC9zY20+CisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLndpY2tldDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPndpY2tldDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7d2lja2V0LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJICA8YXJ0aWZhY3RJZD5vb2R0LXdlYmFwcC1jb21wb25lbnRzPC9hcnRpZmFjdElkPgorCQkgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisJCSAgPGV4Y2x1c2lvbnM+CisJCSAgICA8ZXhjbHVzaW9uPgorCQkgICAgICA8YXJ0aWZhY3RJZD5jYXMtZmlsZW1ncjwvYXJ0aWZhY3RJZD4KKwkJICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkgICAgPC9leGNsdXNpb24+CisJCSAgPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBMT0dHSU5HIERFUEVOREVOQ0lFUyAtIExPRzRKIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3NsZjRqLnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMi4xNDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gIEpVTklUIERFUEVOREVOQ1kgRk9SIFRFU1RJTkcgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSAgSkVUVFkgREVQRU5ERU5DSUVTIEZPUiBURVNUSU5HICAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHR5PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amV0dHktbWFuYWdlbWVudDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisJPGJ1aWxkPgorCQk8cmVzb3VyY2VzPgorCQkJPHJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJPC9yZXNvdXJjZT4KKwkJCTxyZXNvdXJjZT4KKwkJCQk8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisJCQkJPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisJCQkJPGluY2x1ZGVzPgorCQkJCQk8aW5jbHVkZT4qKjwvaW5jbHVkZT4KKwkJCQk8L2luY2x1ZGVzPgorCQkJCTxleGNsdWRlcz4KKwkJCQkJPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorCQkJCTwvZXhjbHVkZXM+CisJCQk8L3Jlc291cmNlPgorCQk8L3Jlc291cmNlcz4KKwkJPHRlc3RSZXNvdXJjZXM+CisJCQk8dGVzdFJlc291cmNlPgorCQkJCTxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKwkJCQk8ZGlyZWN0b3J5PnNyYy90ZXN0L2phdmE8L2RpcmVjdG9yeT4KKwkJCQk8aW5jbHVkZXM+CisJCQkJCTxpbmNsdWRlPioqPC9pbmNsdWRlPgorCQkJCTwvaW5jbHVkZXM+CisJCQkJPGV4Y2x1ZGVzPgorCQkJCQk8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+CisJCQkJPC9leGNsdWRlcz4KKwkJCTwvdGVzdFJlc291cmNlPgorCQk8L3Rlc3RSZXNvdXJjZXM+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c291cmNlPjEuNTwvc291cmNlPgorCQkJCQk8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorCQkJCQk8b3B0aW1pemU+dHJ1ZTwvb3B0aW1pemU+CisJCQkJCTxkZWJ1Zz50cnVlPC9kZWJ1Zz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+CisJPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL0hvbWUuY3NzIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL0hvbWUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2JkZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvSG9tZS5jc3MKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2JvZHl7CisgZm9udC1mYW1pbHk6QXJpYWwsIFNhbnMtU2VyaWY7CisgZm9udC1zaXplOjEycHg7Cit9CisKKyNicmVhZGNydW1ic3sKKyAgcGFkZGluZy1ib3R0b206MjBweDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9Ib21lLmh0bWwgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvSG9tZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDhlZDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvSG9tZS5odG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sCisJeG1sbnM6d2lja2V0PSJodHRwOi8vd2lja2V0LmFwYWNoZS5vcmcvZHRkcy5kYXRhL3dpY2tldC14aHRtbDEuNC1zdHJpY3QuZHRkIj4KKzxoZWFkPgorPHRpdGxlPk9PRFQgQ0FTIFdvcmtmbG93IE1hbmFnZXIgTW9uaXRvcjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgzPldlbGNvbWUgdG8gdGhlIE9PRFQgQ0FTIFdvcmtmbG93IE1hbmFnZXIgTW9uaXRvciE8L2gzPgorCis8cD5Zb3UgY2FuOgorICA8dWw+CisgICAgPGxpPjxhIGhyZWY9IiMiIHdpY2tldDppZD0id29ya2Zsb3dfaW5zdHNfdmlld2VyX2xpbmsiPlZpZXcgYWN0aXZlIFdvcmtmbG93czwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9IndvcmtmbG93c192aWV3ZXJfbGluayI+VmlldyB3aGF0IFdvcmtmbG93IERlc2NyaXB0aW9ucyBhcmUgYXZhaWxhYmxlLjwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9IndvcmtmbG93X2V2ZW50X3ZpZXdlcl9saW5rIj5WaWV3IHdoYXQgV29ya2Zsb3dzIGFyZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IEV2ZW50czwvYT48L2xpPgorICA8L3VsPgorICAKKzwvYm9keT4KKzwvaHRtbD4KKyAKZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9Ib21lLmphdmEgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvSG9tZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2FlMzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvSG9tZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5tb25pdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci5ldmVudHMuV29ya2Zsb3dFdmVudFZpZXdlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci5pbnN0YW5jZS5Xb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5tb25pdG9yLndvcmtmbG93LldvcmtmbG93c1ZpZXdlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSG9tZSBleHRlbmRzIFdlYlBhZ2UgeworCisgIHB1YmxpYyBIb21lKCkgeworICAgIGFkZChuZXcgTGluaygid29ya2Zsb3dfZXZlbnRfdmlld2VyX2xpbmsiKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBzZXRSZXNwb25zZVBhZ2UoV29ya2Zsb3dFdmVudFZpZXdlclBhZ2UuY2xhc3MpOworICAgICAgfQorICAgIH0pOworCisgICAgYWRkKG5ldyBMaW5rKCJ3b3JrZmxvd3Nfdmlld2VyX2xpbmsiKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBzZXRSZXNwb25zZVBhZ2UoV29ya2Zsb3dzVmlld2VyUGFnZS5jbGFzcyk7CisKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGFkZChuZXcgTGluaygid29ya2Zsb3dfaW5zdHNfdmlld2VyX2xpbmsiKSB7CisgICAgICAvKgorICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICogCisgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBQYWdlUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLmFkZCgicGFnZU51bSIsICIxIik7CisgICAgICAgIHBhcmFtcy5hZGQoInN0YXR1cyIsICJBTEwiKTsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKFdvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlLmNsYXNzLCBwYXJhbXMpOworCisgICAgICB9CisgICAgfSk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvV01Nb25pdG9yQXBwLmphdmEgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvV01Nb25pdG9yQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwM2FlMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9XTU1vbml0b3JBcHAuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuV01Nb25pdG9yQXBwQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndlYmNvbXBvbmVudHMud29ya2Zsb3cuaW5zdGFuY2UuV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci5jb25kaXRpb24uV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuZXZlbnRzLldvcmtmbG93RXZlbnRWaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuaW5zdGFuY2UuV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci50YXNrLldvcmtmbG93VGFza1ZpZXdlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci53b3JrZmxvdy5Xb3JrZmxvd1ZpZXdlclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci53b3JrZmxvdy5Xb3JrZmxvd3NWaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUmVzb3VyY2VSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQucmVxdWVzdC50YXJnZXQuY29kaW5nLk1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneTsKKworLyoqCisgKiAKKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBXTU1vbml0b3JBcHAgZXh0ZW5kcyBXTU1vbml0b3JBcHBCYXNlIHsKKworICBwdWJsaWMgV01Nb25pdG9yQXBwKCkgeworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSB0YXNrUGFnZU1vdW50ID0gbmV3IE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSgKKyAgICAgICAgInRhc2siLCBXb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlLmNsYXNzLCBuZXcgU3RyaW5nW10geyAiaWQiIH0pOworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSBjb25kUGFnZU1vdW50ID0gbmV3IE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSgKKyAgICAgICAgImNvbmRpdGlvbiIsIFdvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZS5jbGFzcywgbmV3IFN0cmluZ1tdIHsgImlkIiB9KTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSB3b3JrZmxvd1BhZ2VNb3VudCA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJ3b3JrZmxvdyIsIFdvcmtmbG93Vmlld2VyUGFnZS5jbGFzcywgbmV3IFN0cmluZ1tdIHsgImlkIiB9KTsKKworICAgIE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSBldmVudHNQYWdlTW91bnQgPSBuZXcgTWl4ZWRQYXJhbVVybENvZGluZ1N0cmF0ZWd5KAorICAgICAgICAiZXZlbnRzIiwgV29ya2Zsb3dFdmVudFZpZXdlclBhZ2UuY2xhc3MsIG5ldyBTdHJpbmdbXSB7fSk7CisKKyAgICBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3kgd29ya2Zsb3dzUGFnZU1vdW50ID0gbmV3IE1peGVkUGFyYW1VcmxDb2RpbmdTdHJhdGVneSgKKyAgICAgICAgIndvcmtmbG93cyIsIFdvcmtmbG93c1ZpZXdlclBhZ2UuY2xhc3MsIG5ldyBTdHJpbmdbXSB7fSk7CisKKyAgICBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3kgd29ya2Zsb3dJbnN0c1BhZ2VNb3VudCA9IG5ldyBNaXhlZFBhcmFtVXJsQ29kaW5nU3RyYXRlZ3koCisgICAgICAgICJpbnN0YW5jZXMiLCBXb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZS5jbGFzcywgbmV3IFN0cmluZ1tdIHsgInN0YXR1cyIsCisgICAgICAgICAgICAicGFnZU51bSIgfSk7CisKKyAgICBtb3VudCh0YXNrUGFnZU1vdW50KTsKKyAgICBtb3VudChjb25kUGFnZU1vdW50KTsKKyAgICBtb3VudCh3b3JrZmxvd1BhZ2VNb3VudCk7CisgICAgbW91bnQoZXZlbnRzUGFnZU1vdW50KTsKKyAgICBtb3VudCh3b3JrZmxvd3NQYWdlTW91bnQpOworICAgIG1vdW50KHdvcmtmbG93SW5zdHNQYWdlTW91bnQpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5BcHBsaWNhdGlvbiNnZXRIb21lUGFnZSgpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBQYWdlPiBnZXRIb21lUGFnZSgpIHsKKyAgICByZXR1cm4gSG9tZS5jbGFzczsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQucHJvdG9jb2wuaHR0cC5XZWJBcHBsaWNhdGlvbiNpbml0KCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworICAgIHN1cGVyLmluaXQoKTsKKworICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvcGVyY2VudEltYWdlX2JhY2sxLnBuZyIsCisgICAgICAgIG5ldyBSZXNvdXJjZVJlZmVyZW5jZShXb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5jbGFzcywKKyAgICAgICAgICAgICJwZXJjZW50SW1hZ2VfYmFjazEucG5nIikuZ2V0U2hhcmVkUmVzb3VyY2VLZXkoKSk7CisgICAgbW91bnRTaGFyZWRSZXNvdXJjZSgiL2ltYWdlcy9wZXJjZW50SW1hZ2VfYmFjazIucG5nIiwKKyAgICAgICAgbmV3IFJlc291cmNlUmVmZXJlbmNlKFdvcmtmbG93SW5zdGFuY2VzVmlld2VyLmNsYXNzLAorICAgICAgICAgICAgInBlcmNlbnRJbWFnZV9iYWNrMi5wbmciKS5nZXRTaGFyZWRSZXNvdXJjZUtleSgpKTsKKyAgICBtb3VudFNoYXJlZFJlc291cmNlKCIvaW1hZ2VzL3BlcmNlbnRJbWFnZV9iYWNrMy5wbmciLAorICAgICAgICBuZXcgUmVzb3VyY2VSZWZlcmVuY2UoV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIuY2xhc3MsCisgICAgICAgICAgICAicGVyY2VudEltYWdlX2JhY2szLnBuZyIpLmdldFNoYXJlZFJlc291cmNlS2V5KCkpOworICAgIG1vdW50U2hhcmVkUmVzb3VyY2UoIi9pbWFnZXMvcGVyY2VudEltYWdlX2JhY2s0LnBuZyIsCisgICAgICAgIG5ldyBSZXNvdXJjZVJlZmVyZW5jZShXb3JrZmxvd0luc3RhbmNlc1ZpZXdlci5jbGFzcywKKyAgICAgICAgICAgICJwZXJjZW50SW1hZ2VfYmFjazQucG5nIikuZ2V0U2hhcmVkUmVzb3VyY2VLZXkoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL2NvbmRpdGlvbi9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UuY3NzIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL2NvbmRpdGlvbi9Xb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2JkZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvY29uZGl0aW9uL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZS5jc3MKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2JvZHl7CisgZm9udC1mYW1pbHk6QXJpYWwsIFNhbnMtU2VyaWY7CisgZm9udC1zaXplOjEycHg7Cit9CisKKyNicmVhZGNydW1ic3sKKyAgcGFkZGluZy1ib3R0b206MjBweDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9jb25kaXRpb24vV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmh0bWwgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvY29uZGl0aW9uL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDlhYmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvY29uZGl0aW9uL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZS5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6bGluaz4KKyA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJXb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UuY3NzIi8+Cis8L3dpY2tldDpsaW5rPgorPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjxhIGhyZWY9IiMiIHdpY2tldDppZD0iaG9tZV9saW5rIj5Ib21lPC9hPiZuYnNwOzxzcGFuIGlkPSJkaXZpZGVyIj4vPC9zcGFuPiZuYnNwO0NvbmRpdGlvbnMmbmJzcDs8c3BhbiBpZD0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDs8c3BhbiB3aWNrZXQ6aWQ9ImNvbmRfaWQiPnVybjpvb2R0OlRlc3RDb25kaXRpb248L3NwYW4+PC9kaXY+Cis8ZGl2IHdpY2tldDppZD0iY29uZF92aWV3ZXIiLz4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9jb25kaXRpb24vV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlLmphdmEgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvY29uZGl0aW9uL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjdkNjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvY29uZGl0aW9uL1dvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LmNvbmRpdGlvbnMuV29ya2Zsb3dDb25kaXRpb25WaWV3ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci5XTU1vbml0b3JBcHA7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQuUGFnZVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5iYXNpYy5MYWJlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CisKKy8qKgorICoKKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZS4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlIGV4dGVuZHMgV2ViUGFnZSB7CisgIAorICAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uVmlld2VyUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbXMpeworICAgICBhZGQobmV3IExpbmsoImhvbWVfbGluayIpeworICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICAgIHNldFJlc3BvbnNlUGFnZShnZXRBcHBsaWNhdGlvbigpLmdldEhvbWVQYWdlKCkpOworICAgICAgICB9CisgICAgIH0pOworICAgICBhZGQobmV3IExhYmVsKCJjb25kX2lkIiwgcGFyYW1zLmdldFN0cmluZygiaWQiKSkpOworICAgICBhZGQobmV3IFdvcmtmbG93Q29uZGl0aW9uVmlld2VyKCJjb25kX3ZpZXdlciIsICgoV01Nb25pdG9yQXBwKWdldEFwcGxpY2F0aW9uKCkpLmdldFdvcmtmbG93VXJsKCksIAorICAgICAgICAgcGFyYW1zLmdldFN0cmluZygiaWQiKSkpOworICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvZXZlbnRzL1dvcmtmbG93RXZlbnRWaWV3ZXJQYWdlLmNzcyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9ldmVudHMvV29ya2Zsb3dFdmVudFZpZXdlclBhZ2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2JkZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvZXZlbnRzL1dvcmtmbG93RXZlbnRWaWV3ZXJQYWdlLmNzcwpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworYm9keXsKKyBmb250LWZhbWlseTpBcmlhbCwgU2Fucy1TZXJpZjsKKyBmb250LXNpemU6MTJweDsKK30KKworI2JyZWFkY3J1bWJzeworICBwYWRkaW5nLWJvdHRvbToyMHB4OworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL2V2ZW50cy9Xb3JrZmxvd0V2ZW50Vmlld2VyUGFnZS5odG1sIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL2V2ZW50cy9Xb3JrZmxvd0V2ZW50Vmlld2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWNkNWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvZXZlbnRzL1dvcmtmbG93RXZlbnRWaWV3ZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpsaW5rPgorIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IldvcmtmbG93RXZlbnRWaWV3ZXJQYWdlLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKzxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImhvbWVfbGluayI+SG9tZTwvYT4mbmJzcDs8c3BhbiBpZD0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDtFdmVudHMmbmJzcDs8L2Rpdj4KKzxkaXYgd2lja2V0OmlkPSJ2aWV3ZXIiLz4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9ldmVudHMvV29ya2Zsb3dFdmVudFZpZXdlclBhZ2UuamF2YSBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9ldmVudHMvV29ya2Zsb3dFdmVudFZpZXdlclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdjNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL2V2ZW50cy9Xb3JrZmxvd0V2ZW50Vmlld2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuZXZlbnRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93LmV2ZW50LkV2ZW50VG9Xb3JrZmxvd1ZpZXdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5tb25pdG9yLldNTW9uaXRvckFwcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5tb25pdG9yLndvcmtmbG93LldvcmtmbG93Vmlld2VyUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5XZWJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluazsKKworLyoqCisgKgorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd0V2ZW50Vmlld2VyUGFnZSBleHRlbmRzIFdlYlBhZ2UgeworICAKKyAgcHVibGljIFdvcmtmbG93RXZlbnRWaWV3ZXJQYWdlKCl7CisgICAgYWRkKG5ldyBMaW5rKCJob21lX2xpbmsiKXsKKyAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAqLworICAgICBAT3ZlcnJpZGUKKyAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICBzZXRSZXNwb25zZVBhZ2UoZ2V0QXBwbGljYXRpb24oKS5nZXRIb21lUGFnZSgpKTsKKyAgICAgfQorICB9KTsgICAgCisgICAgYWRkKG5ldyBFdmVudFRvV29ya2Zsb3dWaWV3ZXIoInZpZXdlciIsICgoV01Nb25pdG9yQXBwKWdldEFwcGxpY2F0aW9uKCkpLmdldFdvcmtmbG93VXJsKCksIFdvcmtmbG93Vmlld2VyUGFnZS5jbGFzcykpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9pbnN0YW5jZS9Xb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZS5jc3MgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2JkZWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuY3NzCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitib2R5eworIGZvbnQtZmFtaWx5OkFyaWFsLCBTYW5zLVNlcmlmOworIGZvbnQtc2l6ZToxMnB4OworfQorCisjYnJlYWRjcnVtYnN7CisgIHBhZGRpbmctYm90dG9tOjIwcHg7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuaHRtbCBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9pbnN0YW5jZS9Xb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTE5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuaHRtbApAQCAtMCwwICsxLDIyIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0Omxpbms+CisgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuY3NzIi8+Cis8L3dpY2tldDpsaW5rPgorPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjxhIGhyZWY9IiMiIHdpY2tldDppZD0iaG9tZV9saW5rIj5Ib21lPC9hPiZuYnNwOzxzcGFuIGlkPSJkaXZpZGVyIj4vPC9zcGFuPiZuYnNwO0luc3RhbmNlcyZuYnNwOzwvZGl2PgorCis8ZGl2IHdpY2tldDppZD0iaW5zdGFuY2Vfdmlld2VyIi8+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuamF2YSBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci9pbnN0YW5jZS9Xb3JrZmxvd0luc3RhbmNlVmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyM2RhNWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvaW5zdGFuY2UvV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5tb25pdG9yLmluc3RhbmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93Lmluc3RhbmNlLldvcmtmbG93SW5zdGFuY2VzVmlld2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuV01Nb25pdG9yQXBwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IudGFzay5Xb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3Iud29ya2Zsb3cuV29ya2Zsb3dWaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworCisvKioKKyAqCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlIGV4dGVuZHMgV2ViUGFnZSB7CisgIAorICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVZpZXdlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1zKXsKKyAgICBhZGQobmV3IExpbmsoImhvbWVfbGluayIpeworICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICovCisgICAgIEBPdmVycmlkZQorICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgIHNldFJlc3BvbnNlUGFnZShnZXRBcHBsaWNhdGlvbigpLmdldEhvbWVQYWdlKCkpOworICAgICB9CisgIH0pOworICAgIAorICAgIGFkZChuZXcgV29ya2Zsb3dJbnN0YW5jZXNWaWV3ZXIoImluc3RhbmNlX3ZpZXdlciIsICgoV01Nb25pdG9yQXBwKWdldEFwcGxpY2F0aW9uKCkpLmdldFdvcmtmbG93VXJsKCksIAorICAgICAgICBwYXJhbXMuZ2V0U3RyaW5nKCJzdGF0dXMiLCAiQUxMIiksIHBhcmFtcy5nZXRJbnQoInBhZ2VOdW0iLCAxKSwgKChXTU1vbml0b3JBcHApZ2V0QXBwbGljYXRpb24oKSkuZ2V0U3RhdHVzZXMoKSwgCisgICAgICAgICgoV01Nb25pdG9yQXBwKWdldEFwcGxpY2F0aW9uKCkpLmdldExpZmVjeWNsZUZpbGVQYXRoKCksICgoV01Nb25pdG9yQXBwKWdldEFwcGxpY2F0aW9uKCkpLmdldEluc3RNZXRGaWVsZHNGaWxlUGF0aCgpLAorICAgICAgICBXb3JrZmxvd1ZpZXdlclBhZ2UuY2xhc3MsIFdvcmtmbG93VGFza1ZpZXdlclBhZ2UuY2xhc3MsIFdvcmtmbG93SW5zdGFuY2VWaWV3ZXJQYWdlLmNsYXNzKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3Rhc2svV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5jc3MgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvdGFzay9Xb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNiZGVjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3Rhc2svV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5jc3MKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2JvZHl7CisgZm9udC1mYW1pbHk6QXJpYWwsIFNhbnMtU2VyaWY7CisgZm9udC1zaXplOjEycHg7Cit9CisKKyNicmVhZGNydW1ic3sKKyAgcGFkZGluZy1ib3R0b206MjBweDsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci90YXNrL1dvcmtmbG93VGFza1ZpZXdlclBhZ2UuaHRtbCBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci90YXNrL1dvcmtmbG93VGFza1ZpZXdlclBhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE1YWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3Rhc2svV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3aWNrZXQ6bGluaz4KKyA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJXb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKzxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImhvbWVfbGluayI+SG9tZTwvYT4mbmJzcDs8c3BhbiBpZD0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDtUYXNrcyZuYnNwOzxzcGFuIGlkPSJkaXZpZGVyIj4vPC9zcGFuPiZuYnNwOzxzcGFuIHdpY2tldDppZD0idGFza19pZCI+dXJuOm9vZHQ6TG9uZ1Rhc2s8L3NwYW4+PC9kaXY+Cis8ZGl2IHdpY2tldDppZD0idGFza192aWV3ZXIiIGlkPSJ0YXNrX3ZpZXdlciIvPgpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3Rhc2svV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5qYXZhIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3Rhc2svV29ya2Zsb3dUYXNrVmlld2VyUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNWRmYmYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3IvdGFzay9Xb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IudGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5XTU1vbml0b3JBcHBCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy50YXNrcy5Xb3JrZmxvd1Rhc2tWaWV3ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci5jb25kaXRpb24uV29ya2Zsb3dDb25kaXRpb25WaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworCisvKioKKyAqIAorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93VGFza1ZpZXdlclBhZ2UgZXh0ZW5kcyBXZWJQYWdlIHsKKworICBwdWJsaWMgV29ya2Zsb3dUYXNrVmlld2VyUGFnZShQYWdlUGFyYW1ldGVycyBwYXJhbXMpIHsKKyAgICBhZGQobmV3IExpbmsoImhvbWVfbGluayIpeworICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLmxpbmsuTGluayNvbkNsaWNrKCkKKyAgICAgICovCisgICAgIEBPdmVycmlkZQorICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKCkgeworICAgICAgIHNldFJlc3BvbnNlUGFnZShnZXRBcHBsaWNhdGlvbigpLmdldEhvbWVQYWdlKCkpOworICAgICB9CisgIH0pOyAgICAKKyAgICBhZGQobmV3IExhYmVsKCJ0YXNrX2lkIiwgcGFyYW1zLmdldFN0cmluZygiaWQiKSkpOworICAgIFdvcmtmbG93VGFza1ZpZXdlciB2aWV3ZXJDb21wb25lbnQgPSBuZXcgV29ya2Zsb3dUYXNrVmlld2VyKCJ0YXNrX3ZpZXdlciIsCisgICAgICAgICgoV01Nb25pdG9yQXBwQmFzZSkgZ2V0QXBwbGljYXRpb24oKSkuZ2V0V29ya2Zsb3dVcmwoKSwgcGFyYW1zCisgICAgICAgICAgICAuZ2V0U3RyaW5nKCJpZCIpLCBXb3JrZmxvd0NvbmRpdGlvblZpZXdlclBhZ2UuY2xhc3MpOworICAgIGFkZCh2aWV3ZXJDb21wb25lbnQpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd1ZpZXdlclBhZ2UuY3NzIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3dvcmtmbG93L1dvcmtmbG93Vmlld2VyUGFnZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYmRlYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd1ZpZXdlclBhZ2UuY3NzCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitib2R5eworIGZvbnQtZmFtaWx5OkFyaWFsLCBTYW5zLVNlcmlmOworIGZvbnQtc2l6ZToxMnB4OworfQorCisjYnJlYWRjcnVtYnN7CisgIHBhZGRpbmctYm90dG9tOjIwcHg7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3Ivd29ya2Zsb3cvV29ya2Zsb3dWaWV3ZXJQYWdlLmh0bWwgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3Ivd29ya2Zsb3cvV29ya2Zsb3dWaWV3ZXJQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjNzFlNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd1ZpZXdlclBhZ2UuaHRtbApAQCAtMCwwICsxLDIxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lja2V0Omxpbms+CisgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iV29ya2Zsb3dWaWV3ZXJQYWdlLmNzcyIvPgorPC93aWNrZXQ6bGluaz4KKzxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48YSBocmVmPSIjIiB3aWNrZXQ6aWQ9ImhvbWVfbGluayI+SG9tZTwvYT4mbmJzcDs8c3BhbiBpZD0iZGl2aWRlciI+Lzwvc3Bhbj4mbmJzcDs8YSBocmVmPSIjIiB3aWNrZXQ6aWQ9IndvcmtmbG93c192aWV3ZXJfbGluayI+V29ya2Zsb3dzPC9hPiZuYnNwOzxzcGFuIGlkPSJkaXZpZGVyIj4vPC9zcGFuPiZuYnNwOzxzcGFuIHdpY2tldDppZD0id29ya2Zsb3dfaWQiPnVybjpvb2R0OkxvbmdXb3JrZmxvdzwvc3Bhbj48L2Rpdj4KKzxkaXYgd2lja2V0OmlkPSJ3b3JrZmxvd192aWV3ZXIiIGlkPSJ3b3JrZmxvd192aWV3ZXIiLz4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd1ZpZXdlclBhZ2UuamF2YSBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd1ZpZXdlclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzg0NTVkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3dvcmtmbG93L1dvcmtmbG93Vmlld2VyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5tb25pdG9yLndvcmtmbG93OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53ZWJjb21wb25lbnRzLndvcmtmbG93Lm1vZGVsLldvcmtmbG93Vmlld2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuV01Nb25pdG9yQXBwOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IudGFzay5Xb3JrZmxvd1Rhc2tWaWV3ZXJQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0LlBhZ2VQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUud2lja2V0Lm1hcmt1cC5odG1sLldlYlBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuYmFzaWMuTGFiZWw7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rOworCisvKioKKyAqIAorICogRGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93Vmlld2VyUGFnZSBleHRlbmRzIFdlYlBhZ2UgeworCisgIHB1YmxpYyBXb3JrZmxvd1ZpZXdlclBhZ2UoUGFnZVBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgYWRkKG5ldyBMaW5rKCJob21lX2xpbmsiKXsKKyAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAqLworICAgICBAT3ZlcnJpZGUKKyAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICBzZXRSZXNwb25zZVBhZ2UoZ2V0QXBwbGljYXRpb24oKS5nZXRIb21lUGFnZSgpKTsKKyAgICAgfQorICB9KTsKKyAgICBhZGQobmV3IExpbmsoIndvcmtmbG93c192aWV3ZXJfbGluayIpeworICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwubGluay5MaW5rI29uQ2xpY2soKQorICAgICAgICovCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soKSB7CisgICAgICAgIHNldFJlc3BvbnNlUGFnZShXb3JrZmxvd3NWaWV3ZXJQYWdlLmNsYXNzKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBhZGQobmV3IExhYmVsKCJ3b3JrZmxvd19pZCIsIHBhcmFtcy5nZXRTdHJpbmcoImlkIikpKTsKKyAgICBhZGQobmV3IFdvcmtmbG93Vmlld2VyKCJ3b3JrZmxvd192aWV3ZXIiLCAoKFdNTW9uaXRvckFwcCkgZ2V0QXBwbGljYXRpb24oKSkKKyAgICAgICAgLmdldFdvcmtmbG93VXJsKCksIHBhcmFtcy5nZXRTdHJpbmcoImlkIiksIFdvcmtmbG93VGFza1ZpZXdlclBhZ2UuY2xhc3MpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3Ivd29ya2Zsb3cvV29ya2Zsb3dzVmlld2VyUGFnZS5jc3MgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3Ivd29ya2Zsb3cvV29ya2Zsb3dzVmlld2VyUGFnZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYmRlYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd3NWaWV3ZXJQYWdlLmNzcwpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworYm9keXsKKyBmb250LWZhbWlseTpBcmlhbCwgU2Fucy1TZXJpZjsKKyBmb250LXNpemU6MTJweDsKK30KKworI2JyZWFkY3J1bWJzeworICBwYWRkaW5nLWJvdHRvbToyMHB4OworfQpkaWZmIC0tZ2l0IGEvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3dvcmtmbG93L1dvcmtmbG93c1ZpZXdlclBhZ2UuaHRtbCBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd3NWaWV3ZXJQYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhNDM3NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy93ZWJhcHAvbW9uaXRvci93b3JrZmxvdy9Xb3JrZmxvd3NWaWV3ZXJQYWdlLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdpY2tldDpsaW5rPgorIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IldvcmtmbG93c1ZpZXdlclBhZ2UuY3NzIi8+Cis8L3dpY2tldDpsaW5rPgorPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjxhIGhyZWY9IiMiIHdpY2tldDppZD0iaG9tZV9saW5rIj5Ib21lPC9hPiZuYnNwOzxzcGFuIGlkPSJkaXZpZGVyIj4vPC9zcGFuPiZuYnNwO1dvcmtmbG93cyZuYnNwOzwvZGl2PgorPGRpdiB3aWNrZXQ6aWQ9IndvcmtmbG93c192aWV3ZXIiIGlkPSJ3b3JrZmxvd3Nfdmlld2VyIi8+CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvd2ViYXBwL21vbml0b3Ivd29ya2Zsb3cvV29ya2Zsb3dzVmlld2VyUGFnZS5qYXZhIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3dvcmtmbG93L1dvcmtmbG93c1ZpZXdlclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTcxOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93ZWJhcHAvd21vbml0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3dlYmFwcC9tb25pdG9yL3dvcmtmbG93L1dvcmtmbG93c1ZpZXdlclBhZ2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci53b3JrZmxvdzsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud2ViY29tcG9uZW50cy53b3JrZmxvdy5tb2RlbC5Xb3JrZmxvd3NWaWV3ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZWJhcHAubW9uaXRvci5XTU1vbml0b3JBcHA7CitpbXBvcnQgb3JnLmFwYWNoZS53aWNrZXQubWFya3VwLmh0bWwuV2ViUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbms7CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dzVmlld2VyUGFnZSBleHRlbmRzIFdlYlBhZ2UgeworCisgIHB1YmxpYyBXb3JrZmxvd3NWaWV3ZXJQYWdlKCkgeworICAgIGFkZChuZXcgTGluaygiaG9tZV9saW5rIikgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZSBvcmcuYXBhY2hlLndpY2tldC5tYXJrdXAuaHRtbC5saW5rLkxpbmsjb25DbGljaygpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljaygpIHsKKyAgICAgICAgc2V0UmVzcG9uc2VQYWdlKGdldEFwcGxpY2F0aW9uKCkuZ2V0SG9tZVBhZ2UoKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBhZGQobmV3IFdvcmtmbG93c1ZpZXdlcigid29ya2Zsb3dzX3ZpZXdlciIsCisgICAgICAgICgoV01Nb25pdG9yQXBwKSBnZXRBcHBsaWNhdGlvbigpKS5nZXRXb3JrZmxvd1VybCgpLAorICAgICAgICBXb3JrZmxvd1ZpZXdlclBhZ2UuY2xhc3MpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlNDZiOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxDb250ZXh0IHBhdGg9Ii93bW9uaXRvciI+CisJCQorCTxQYXJhbWV0ZXIgbmFtZT0id29ya2Zsb3cudXJsIgorCSAgICB2YWx1ZT0iW1dPUktGTE9XX1VSTF0iLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5saWZlY3ljbGVGaWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctbGlmZWN5Y2xlLnhtbCIvPgorCSAgICAKKwk8UGFyYW1ldGVyIG5hbWU9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdC5zdGF0dXNlcyIKKwkgICAgdmFsdWU9IlNUQVJURUQsIEZJTklTSEVELCBNRVRNSVNTLCBQQVVTRUQiLz4KKwkgICAgCisJPFBhcmFtZXRlciBuYW1lPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlYmFwcC5pbnN0Lm1ldEZpZWxkcy5maWxlUGF0aCIKKwkgICAgdmFsdWU9IltXT1JLRkxPV19IT01FXS9wb2xpY3kvd29ya2Zsb3ctaW5zdGFuY2UtbWV0LnhtbCIvPgorCSAgICAKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhLzAuMTAvd2ViYXBwL3dtb25pdG9yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODUzMWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dlYmFwcC93bW9uaXRvci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisJIHZlcnNpb249IjIuNCI+CisKKwk8ZGlzcGxheS1uYW1lPndvcmtmbG93LW1vbml0b3I8L2Rpc3BsYXktbmFtZT4KKworCSA8IS0tICAKKwkgICAgICBUaGVyZSBhcmUgdGhyZWUgbWVhbnMgdG8gY29uZmlndXJlIFdpY2tldHMgY29uZmlndXJhdGlvbiBtb2RlIGFuZCB0aGV5IGFyZQorCSAgICAgIHRlc3RlZCBpbiB0aGUgb3JkZXIgZ2l2ZW4uIAorCSAgICAgIDEpIEEgc3lzdGVtIHByb3BlcnR5OiAtRHdpY2tldC5jb25maWd1cmF0aW9uCisJICAgICAgMikgc2VydmxldCBzcGVjaWZpYyA8aW5pdC1wYXJhbT4KKwkgICAgICAzKSBjb250ZXh0IHNwZWNpZmljIDxjb250ZXh0LXBhcmFtPgorCSAgICAgIFRoZSB2YWx1ZSBtaWdodCBiZSBlaXRoZXIgImRldmVsb3BtZW50IiAocmVsb2FkaW5nIHdoZW4gdGVtcGxhdGVzIGNoYW5nZSkKKwkgICAgICBvciAiZGVwbG95bWVudCIuIElmIG5vIGNvbmZpZ3VyYXRpb24gaXMgZm91bmQsICJkZXZlbG9wbWVudCIgaXMgdGhlIGRlZmF1bHQuCisJLS0+CisKKwk8ZmlsdGVyPgorCQk8ZmlsdGVyLW5hbWU+d2lja2V0LmJyb3dzZXI8L2ZpbHRlci1uYW1lPgorIAkJPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLndpY2tldC5wcm90b2NvbC5odHRwLldpY2tldEZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmFwcGxpY2F0aW9uQ2xhc3NOYW1lPC9wYXJhbS1uYW1lPgorCQkJPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2ViYXBwLm1vbml0b3IuV01Nb25pdG9yQXBwPC9wYXJhbS12YWx1ZT4KKyAJCTwvaW5pdC1wYXJhbT4KKyAJPC9maWx0ZXI+CisKKyA8ZmlsdGVyLW1hcHBpbmc+CisgIDxmaWx0ZXItbmFtZT53aWNrZXQuYnJvd3NlcjwvZmlsdGVyLW5hbWU+CisJPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyA8L2ZpbHRlci1tYXBwaW5nPgorCisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvcG9tLnhtbCBiLzAuMTAvd29ya2Zsb3cvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2FlM2VkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9wb20ueG1sCkBAIC0wLDAgKzEsMjE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vb2R0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGFydGlmYWN0SWQ+Y2FzLXdvcmtmbG93PC9hcnRpZmFjdElkPgorICA8bmFtZT5DYXRhbG9nIGFuZCBBcmNoaXZlIFdvcmtmbG93IE1hbmFnZW1lbnQgQ29tcG9uZW50PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VGhlIHdvcmtmbG93IG1hbmFnZW1lbnQgY29tcG9uZW50IG9mIGEgQ2F0YWxvZyBhbmQgQXJjaGl2ZSBTZXJ2aWNlLiBUaGlzIGNvbXBvbmVudAorICAgICBwdXJwb3NlZnVsbHkgc2VwYXJhdGVzIHdvcmtmbG93IHJlcG9zaXRvcmllcyBhbmQgd29ya2Zsb3cgZW5naW5lcyBzdGFuZGFyZCBpbnRlcmZhY2VzLCBhbmQKKyAgICAgcHJvdmlkZXMgc29tZSBvdXQgb2YgdGhlIGJveCBiYWNrZW5kIGltcGxlbWVudGF0aW9ucyBvZiB0aGVtIChpbmNsdWRpbmcgb25lIGJhc2VkCisgICAgIG9uIHRoZSBqYXZheC5zcWwuRGF0YVNvdXJjZSBpbnRlcmZhY2UpLiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBldmVyeXRoaW5nIHRoYXQgeW91IG5lZWQKKyAgICAgdG8gZXhlY3V0ZSB3b3JrZmxvd3MsIGFuZCBzY2llbmNlIHByb2Nlc3NpbmcgcGlwZWxpbmVzLjwvZGVzY3JpcHRpb24+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Zm9ya01vZGU+cGVydGVzdDwvZm9ya01vZGU+CisgICAgICAgICAgPHVzZVN5c3RlbUNsYXNzTG9hZGVyPmZhbHNlPC91c2VTeXN0ZW1DbGFzc0xvYWRlcj4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICA8bmFtZT5qYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZTwvbmFtZT4KKyAgICAgICAgICAgICAgIDx2YWx1ZT4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmxvZ2dpbmcucHJvcGVydGllczwvdmFsdWU+CisgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgPGZvcmtlZFByb2Nlc3NUaW1lb3V0SW5TZWNvbmRzPjA8L2ZvcmtlZFByb2Nlc3NUaW1lb3V0SW5TZWNvbmRzPgorICAgICAgICAgICA8cmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPnRydWU8L3JlZGlyZWN0VGVzdE91dHB1dFRvRmlsZT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QqLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjItYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ8L21haW5DbGFzcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPiAKKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5hdWRpdDwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdGVzdC9yZXNvdXJjZXMvKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgPC9wcm9maWxlcz4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9vZHQtY29tbW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC5wYXJlbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9vZHQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXMtcmVzb3VyY2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29uY3VycmVudDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29uY3VycmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtZGJjcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGJjcDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLXBvb2w8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXBvb2w8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+eG1scnBjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eG1scnBjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5sdWNlbmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sdWNlbmUtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMC4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zYWZlaGF1cy5qdWc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdWc8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjAuMDwvdmVyc2lvbj4KKyAgICAgIDxjbGFzc2lmaWVyPmFzbDwvY2xhc3NpZmllcj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5oc3FsZGI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oc3FsZGI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjguMC43PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfbWFpbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuOC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmpvZGEtdGltZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpvZGEtdGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViNjM1NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsODYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGFzc2VtYmx5PgorICA8aWQ+ZGlzdDwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgIDxiYXNlRGlyZWN0b3J5PiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+CisgIDxpbmNsdWRlU2l0ZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZVNpdGVEaXJlY3Rvcnk+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT4uPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5DSEFOR0VTLnR4dDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2JpbjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5iaW48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcy8+CisgICAgICA8ZmlsZU1vZGU+NzU1PC9maWxlTW9kZT4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxvZ3M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+UkVNT1ZFLmxvZzwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5ldGM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+d29ya2Zsb3cucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+bG9nZ2luZy5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PnBvbGljeTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5jbWQtbGluZS1hY3Rpb25zLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Y21kLWxpbmUtb3B0aW9ucy54bWw8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cG9saWN5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5PgorICAgICAgPGZpbHRlcmVkPmZhbHNlPC9maWx0ZXJlZD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZXhjbHVkZXMvPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgorICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgIDx1bnBhY2tPcHRpb25zLz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9iaW4vd21nciBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYmluL3dtZ3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlMDVjOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYmluL3dtZ3IKQEAgLTAsMCArMSw3NSBAQAorIyEvYmluL3NoCisjCisjIGluaXQgc2NyaXB0IGZvciBYbWxScGNXb3JrZmxvd01hbmFnZXIKKyMKKyMgY2hrY29uZmlnOiAzNDUgODggMjIKKyMgZGVzY3JpcHRpb246IENBUyBXb3JrZmxvdyBNYW5hZ2VyCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisKKworWyAtZiAvZXRjL3N5c2NvbmZpZy9qYXZhIF0gJiYgLiAvZXRjL3N5c2NvbmZpZy9qYXZhCisjWyAtZiAvZXRjL3N5c2NvbmZpZy9jYXMtZmlsZW1ncl0gJiYgLiAvZXRjL3N5c2NvbmZpZy9jYXMtZmlsZW1ncgorCitTRVJWRVJfUE9SVD05MDAxCitleHBvcnQgU0VSVkVSX1BPUlQKKworaWYgWyAteiAkSkFWQV9IT01FIF0gOyB0aGVuCisJSkFWQV9IT01FPS9wYXRoL3RvL2phdmEvaG9tZQorZWxzZQorCUpBVkFfSE9NRT0ke0pBVkFfSE9NRX0KK2ZpCisKK2V4cG9ydCBKQVZBX0hPTUUKK0NBU19XT1JLRkxPV19IT01FPS4uCitleHBvcnQgQ0FTX1dPUktGTE9XX0hPTUUKK1JVTl9IT01FPSR7Q0FTX1dPUktGTE9XX0hPTUV9Ly4uL3J1bgorZXhwb3J0IFJVTl9IT01FCitDQVNfV09SS0ZMT1dfUFJPUFM9Li4vZXRjL3dvcmtmbG93LnByb3BlcnRpZXMKK2V4cG9ydCBDQVNfV09SS0ZMT1dfUFJPUFMKKworUEFUSD0ke0pBVkFfSE9NRX0vYmluOiR7Q0FTX1dPUktGTE9XX0hPTUV9L2JpbjovdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbgorZXhwb3J0IFBBVEgKKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorICAgICAgICBlY2hvIC1uICJTdGFydGluZyBjYXMgd29ya2Zsb3cgbWFuYWdlcjogIgorICAgICAgICAkSkFWQV9IT01FL2Jpbi9qYXZhIC1EamF2YS5leHQuZGlycz0ke0NBU19XT1JLRkxPV19IT01FfS9saWIgXAorICAgICAgICAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSR7Q0FTX1dPUktGTE9XX0hPTUV9L2V0Yy9sb2dnaW5nLnByb3BlcnRpZXMgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucHJvcGVydGllcz0ke0NBU19XT1JLRkxPV19QUk9QU30gXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMucGdlLnRhc2subWV0a2V5cy5sZWdhY3lNb2RlPSJ0cnVlIiBcCisgICAgICAgIC1Eb3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UudGFzay5zdGF0dXMubGVnYWN5TW9kZT0idHJ1ZSIgXAorICAgICAgICBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXIgLS1wb3J0TnVtICRTRVJWRVJfUE9SVCAmICAgICAgIAorICAgICAgICBlY2hvICQhID4ke1JVTl9IT01FfS9jYXMud29ya2Zsb3cucGlkIAorICAgICAgICBlY2hvICJPSyIKKyAgICAgICAgc2xlZXAgNQorICAgICAgICA7OworICBzdG9wKQorICAgICAgICBlY2hvIC1uICJTaHV0dGluZyBkb3duIGNhcyB3b3JrZmxvdyBtYW5hZ2VyOiAiCisgICAgICAgIGtpbGwgYGNhdCAke1JVTl9IT01FfS9jYXMud29ya2Zsb3cucGlkYAorICAgICAgICBlY2hvICJPSyIKKyAgICAgICAgOzsKKyAgcmVzdGFydCkKKyAgICAgICAgJDAgc3RvcAorICAgICAgICAkMCBzdGFydAorICAgICAgICA7OworICAqKQorICAgICAgICBlY2hvICJVc2FnZTogJDAge3N0YXJ0fHN0b3B8cmVzdGFydH0iCisgICAgICAgIGV4aXQgMQorZXNhYworCitleGl0IDAKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYmluL3dtZ3ItY2xpZW50IGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9iaW4vd21nci1jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1MDhkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYmluL3dtZ3ItY2xpZW50CkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisKK2lmIFsgLXogJEpBVkFfSE9NRSBdIDsgdGhlbgorCUpBVkFfSE9NRT0vcGF0aC90by9qYXZhL2hvbWUKK2Vsc2UKKwlKQVZBX0hPTUU9JHtKQVZBX0hPTUV9CitmaQorCitleHBvcnQgSkFWQV9IT01FCisKKyRKQVZBX0hPTUUvYmluL2phdmEgXAorICAgICAgICAtRGphdmEuZXh0LmRpcnM9Li4vbGliIFwKKyAgICAgICAgLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT0uLi9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzIFwKKyAgICAgICAgLURvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZz0uLi9wb2xpY3kvY21kLWxpbmUtYWN0aW9ucy54bWwgXAorICAgICAgICAtRG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnPS4uL3BvbGljeS9jbWQtbGluZS1vcHRpb25zLnhtbCBcCisgICAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCAkKgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9iaW4vd21raWxsIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9iaW4vd21raWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjZWMyMmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2Jpbi93bWtpbGwKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL2Jhc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK2V4cG9ydCBPUklHX0RJUj1gcHdkYAorZXhwb3J0IERJUj1gZGlybmFtZSAkMGAKK2NkICRESVIKK2V4cG9ydCBESVJfUEFUSD1gcHdkYAorY2QgJE9SSUdfRElSCisKK2lmIFsgIiQjIiAtbmUgMSBdOyB0aGVuCisgICAgZWNobyAiVXNhZ2U6ICQwIDx3b3JrZmxvdyBpbnN0YW5jZSBpZD4iCisgICAgZXhpdCAxCitlbHNlCisgICAgcHVzaGQgJERJUl9QQVRICisgICAgLi93bWdyLWNsaWVudCAtLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDEgLS1vcGVyYXRpb24gLS1zdG9wV29ya2Zsb3dJbnN0IC0taWQgJDEKKyAgICBwb3BkCitmaQorCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2Jpbi93bWtpbGxhbGxieXN0YXR1cyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vYmluL3dta2lsbGFsbGJ5c3RhdHVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwZGY5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2Jpbi93bWtpbGxhbGxieXN0YXR1cwpAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vYmFzaAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuIAorCitleHBvcnQgT1JJR19ESVI9YHB3ZGAKK2V4cG9ydCBESVI9YGRpcm5hbWUgJDBgCitjZCAkRElSCitleHBvcnQgRElSX1BBVEg9YHB3ZGAKK2NkICRPUklHX0RJUgorCitpZiBbICIkIyIgLW5lIDEgXTsgdGhlbgorICAgIGVjaG8gIlVzYWdlOiAkMCA8c3RhdHVzLCBlLmcuLCBRVUVVRUQsIFJTVUJNSVQsIGV0Yy4+IgorICAgIGV4aXQgMQorZWxzZQorICAgIHB1c2hkICRESVJfUEFUSAorICAgIGZvciBpZCBpbiBgLi93bWdyLWNsaWVudCAtLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDEgLS1vcGVyYXRpb24gLS1nZXRGaXJzdFBhZ2UgLS1zdGF0dXMgJDEgfCBhd2sgJ3twcmludCAkMn0nIHwgY3V0IC1mIDIgLWQgPSB8IGN1dCAtZiAxIC1kICxgIAorICAgICAgICBkbworICAgICAgICAgICAgZWNobyAiS2lsbGluZyB3b3JrZmxvdyB3aXRoIElEICRpZCIKKyAgICAgICAgICAgIC4vd21raWxsICRpZAorICAgIGRvbmUKKyAgICBwb3BkCitmaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vRHluV29ya2Zsb3dDbGlBY3Rpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vRHluV29ya2Zsb3dDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYxZTAwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9EeW5Xb3JrZmxvd0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gZm9yIHN1Ym1pdHRpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB7QGxpbmsgV29ya2Zsb3d9cworICogb2YgcHJlLWRlZmluZWQge0BsaW5rIFdvcmtmbG93VGFza31zLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIER5bldvcmtmbG93Q2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIExpc3Q8U3RyaW5nPiB0YXNrSWRzOworICAgcHJpdmF0ZSBNZXRhZGF0YSBtZXRhZGF0YTsKKworICAgcHVibGljIER5bldvcmtmbG93Q2xpQWN0aW9uKCkgeworICAgICAgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHRhc2tJZHMsICJNdXN0IHNwZWNpZnkgdGFza0lkcyIpOworCisgICAgICB0cnkgeworICAgICAgICAgU3RyaW5nIGluc3RJZCA9IGdldENsaWVudCgpLmV4ZWN1dGVEeW5hbWljV29ya2Zsb3codGFza0lkcywgbWV0YWRhdGEpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJTdGFydGVkIGR5bmFtaWMgd29ya2Zsb3cgd2l0aCBpZCAnIiArIGluc3RJZCArICInIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHN1Ym1pdCBkeW5hbWljIHdvcmtmbG93IGZvciB0YXNrSWRzICIgKyB0YXNrSWRzCisgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBtZXRhZGF0YSAiICsgbWV0YWRhdGEuZ2V0SGFzaHRhYmxlKCkgKyAiIDogIgorICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFRhc2tJZHMoTGlzdDxTdHJpbmc+IHRhc2tJZHMpIHsKKyAgICAgIHRoaXMudGFza0lkcyA9IHRhc2tJZHM7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIGFkZE1ldGFkYXRhKExpc3Q8U3RyaW5nPiBtZXRhZGF0YSkgeworICAgICAgVmFsaWRhdGUuaXNUcnVlKG1ldGFkYXRhLnNpemUoKSA+IDEpOworCisgICAgICB0aGlzLm1ldGFkYXRhLmFkZE1ldGFkYXRhKG1ldGFkYXRhLmdldCgwKSwKKyAgICAgICAgICAgIG1ldGFkYXRhLnN1Ykxpc3QoMSwgbWV0YWRhdGEuc2l6ZSgpKSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldENvbmRpdGlvbkJ5SWRDbGlBY3Rpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0Q29uZGl0aW9uQnlJZENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDE2YjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldENvbmRpdGlvbkJ5SWRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCByZXRyaWV2ZXMgV29ya2Zsb3dDb25kaXRpb24gaW5mb3JtYXRpb24gZm9yCisgKiBXb3JrZmxvd0NvbmRpdGlvbiB3aXRoIGdpdmVuIGNvbmRpdGlvbiBJRC4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRDb25kaXRpb25CeUlkQ2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBjb25kaXRpb25JZDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgV29ya2Zsb3dDb25kaXRpb24gY29uZGl0aW9uID0gZ2V0Q2xpZW50KCkKKyAgICAgICAgICAgICAgIC5nZXRDb25kaXRpb25CeUlkKGNvbmRpdGlvbklkKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiQ29uZGl0aW9uOiBbaWQ9IiArIGNvbmRpdGlvbi5nZXRDb25kaXRpb25JZCgpCisgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIGNvbmRpdGlvbi5nZXRDb25kaXRpb25OYW1lKCkgKyAiLCBvcmRlcj0iCisgICAgICAgICAgICAgICArIGNvbmRpdGlvbi5nZXRPcmRlcigpICsgIiwgY2xhc3M9IgorICAgICAgICAgICAgICAgKyBjb25kaXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgY29uZGl0aW9uIGJ5IGlkIGZvciBjb25kaXRpb25JZCAnIiArIGNvbmRpdGlvbklkCisgICAgICAgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uSWQoU3RyaW5nIGNvbmRpdGlvbklkKSB7CisgICAgICB0aGlzLmNvbmRpdGlvbklkID0gY29uZGl0aW9uSWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldEZpcnN0UGFnZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRGaXJzdFBhZ2VDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJmYjFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRGaXJzdFBhZ2VDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2VQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBHZXRzIHRoZSBmaXJzdCBwYWdlIG9mIHdvcmtmbG93IGluc3RhbmNlcy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRGaXJzdFBhZ2VDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gbnVsbDsKKyAgICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHBhZ2UgPSBjbGllbnQucGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcygxLCBzdGF0dXMpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhZ2UgPSBjbGllbnQuZ2V0Rmlyc3RQYWdlKCk7CisgICAgICAgICB9CisKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbigiUGFnZTogW251bT0iICsgcGFnZS5nZXRQYWdlTnVtKCkgKyAiLCIKKyAgICAgICAgICAgICAgICsgInBhZ2VTaXplPSIgKyBwYWdlLmdldFBhZ2VTaXplKCkgKyAiLHRvdGFsUGFnZXM9IgorICAgICAgICAgICAgICAgKyBwYWdlLmdldFRvdGFsUGFnZXMoKSArICJdIik7CisgICAgICAgICBpZiAocGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICJXb3JrZmxvd01hbmFnZXIgcmV0dXJuZWQgbnVsbCBwYWdlIG9mIHdvcmtmbG93cyIpOworICAgICAgICAgfQorICAgICAgICAgZm9yIChXb3JrZmxvd0luc3RhbmNlIGluc3QgOiAoTGlzdDxXb3JrZmxvd0luc3RhbmNlPikgcGFnZQorICAgICAgICAgICAgICAgLmdldFBhZ2VXb3JrZmxvd3MoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJJbnN0YW5jZTogW2lkPSIgKyBpbnN0LmdldElkKCkgKyAiLCBzdGF0dXM9IgorICAgICAgICAgICAgICAgICAgKyBpbnN0LmdldFN0YXR1cygpICsgIiwgY3VycmVudFRhc2s9IgorICAgICAgICAgICAgICAgICAgKyBpbnN0LmdldEN1cnJlbnRUYXNrSWQoKSArICIsIHdvcmtmbG93PSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRXb3JrZmxvdygpLmdldE5hbWUoKSArICIsIHdhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICsgIiwgY3VycmVudFRhc2tXYWxsQ2xvY2tUaW1lPSIKKyAgICAgICAgICAgICAgICAgICsgY2xpZW50LmdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgICAgIH0KKworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgZmlyc3QgcGFnZSBvZiB3b3JrZmxvd3MgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldExhc3RQYWdlQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldExhc3RQYWdlQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMzY0YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0TGFzdFBhZ2VDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2VQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lT3B0aW9ufSB3aGljaCBnZXRzIHRoZSBsYXN0IHBhZ2Ugb2Ygd29ya2Zsb3dzLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldExhc3RQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSA9IG51bGw7CisgICAgICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBmaXJzdFBhZ2UgPSBjbGllbnQucGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcygKKyAgICAgICAgICAgICAgICAgIDEsIHN0YXR1cyk7CisgICAgICAgICAgICBwYWdlID0gY2xpZW50LnBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMoZmlyc3RQYWdlLmdldFRvdGFsUGFnZXMoKSwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFnZSA9IGNsaWVudC5nZXRMYXN0UGFnZSgpOworICAgICAgICAgfQorCisgICAgICAgICBwcmludGVyLnByaW50bG4oIlBhZ2U6IFtudW09IiArIHBhZ2UuZ2V0UGFnZU51bSgpICsgIiwiCisgICAgICAgICAgICAgICArICJwYWdlU2l6ZT0iICsgcGFnZS5nZXRQYWdlU2l6ZSgpICsgIix0b3RhbFBhZ2VzPSIKKyAgICAgICAgICAgICAgICsgcGFnZS5nZXRUb3RhbFBhZ2VzKCkgKyAiXSIpOworICAgICAgICAgaWYgKHBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiV29ya2Zsb3dNYW5hZ2VyIHJldHVybmVkIG51bGwgcGFnZSBvZiB3b3JrZmxvd3MiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGZvciAoV29ya2Zsb3dJbnN0YW5jZSBpbnN0IDogKExpc3Q8V29ya2Zsb3dJbnN0YW5jZT4pIHBhZ2UKKyAgICAgICAgICAgICAgIC5nZXRQYWdlV29ya2Zsb3dzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiSW5zdGFuY2U6IFtpZD0iICsgaW5zdC5nZXRJZCgpICsgIiwgc3RhdHVzPSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRTdGF0dXMoKSArICIsIGN1cnJlbnRUYXNrPSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRDdXJyZW50VGFza0lkKCkgKyAiLCB3b3JrZmxvdz0iCisgICAgICAgICAgICAgICAgICArIGluc3QuZ2V0V29ya2Zsb3coKS5nZXROYW1lKCkgKyAiLHdhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICsgIixjdXJyZW50VGFza1dhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdC5nZXRJZCgpKQorICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbGFzdCBwYWdlIG9mIHdvcmtmbG93cyB3aXRoICIgKyAic3RhdHVzICciCisgICAgICAgICAgICAgICAgICAgICArIHN0YXR1cyArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXROZXh0UGFnZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXROZXh0UGFnZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZmM1NTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldE5leHRQYWdlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2VQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIHRoZSBuZXh0IHBhZ2Ugb2Ygd29ya2Zsb3dzLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldE5leHRQYWdlQ2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIGludCBwYWdlTnVtID0gLTE7CisgICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5pc1RydWUocGFnZU51bSAhPSAtMSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gbnVsbDsKKyAgICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHBhZ2UgPSBjbGllbnQucGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhwYWdlTnVtICsgMSwgc3RhdHVzKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWdlID0gY2xpZW50LnBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMocGFnZU51bSArIDEpOworICAgICAgICAgfQorCisgICAgICAgICBwcmludGVyLnByaW50bG4oIlBhZ2U6IFtudW09IiArIHBhZ2UuZ2V0UGFnZU51bSgpICsgIiwiCisgICAgICAgICAgICAgICArICJwYWdlU2l6ZT0iICsgcGFnZS5nZXRQYWdlU2l6ZSgpICsgIix0b3RhbFBhZ2VzPSIKKyAgICAgICAgICAgICAgICsgcGFnZS5nZXRUb3RhbFBhZ2VzKCkgKyAiXSIpOworICAgICAgICAgaWYgKHBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiV29ya2Zsb3dNYW5hZ2VyIHJldHVybmVkIG51bGwgcGFnZSBvZiB3b3JrZmxvd3MiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGZvciAoV29ya2Zsb3dJbnN0YW5jZSBpbnN0IDogKExpc3Q8V29ya2Zsb3dJbnN0YW5jZT4pIHBhZ2UKKyAgICAgICAgICAgICAgIC5nZXRQYWdlV29ya2Zsb3dzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiSW5zdGFuY2U6IFtpZD0iICsgaW5zdC5nZXRJZCgpICsgIiwgc3RhdHVzPSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRTdGF0dXMoKSArICIsIGN1cnJlbnRUYXNrPSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRDdXJyZW50VGFza0lkKCkgKyAiLCB3b3JrZmxvdz0iCisgICAgICAgICAgICAgICAgICArIGluc3QuZ2V0V29ya2Zsb3coKS5nZXROYW1lKCkgKyAiLHdhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICsgIixjdXJyZW50VGFza1dhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdC5nZXRJZCgpKQorICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbmV4dCBwYWdlIG9mIHdvcmtmbG93cyBmb3IgcGFnZSAnIiArIHBhZ2VOdW0KKyAgICAgICAgICAgICAgICAgICAgICsgIicgYW5kIHN0YXR1cyAnIiArIHN0YXR1cyArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UGFnZU51bShpbnQgcGFnZU51bSkgeworICAgICAgdGhpcy5wYWdlTnVtID0gcGFnZU51bTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRQcmV2UGFnZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRQcmV2UGFnZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzBkZDkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFByZXZQYWdlQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2VQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXRzIHRoZSBwcmV2aW91cyBwYWdlIG9mIHdvcmtmbG93cy4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRQcmV2UGFnZUNsaUFjdGlvbiBleHRlbmRzIFdvcmtmbG93Q2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBpbnQgcGFnZU51bSA9IC0xOworICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzOworCisgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgVmFsaWRhdGUuaXNUcnVlKHBhZ2VOdW0gIT0gLTEpOworCisgICAgICB0cnkgeworICAgICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSA9IG51bGw7CisgICAgICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBwYWdlID0gY2xpZW50LnBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMocGFnZU51bSAtIDEsIHN0YXR1cyk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFnZSA9IGNsaWVudC5wYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzKHBhZ2VOdW0gLSAxKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcHJpbnRlci5wcmludGxuKCJQYWdlOiBbbnVtPSIgKyBwYWdlLmdldFBhZ2VOdW0oKSArICIsIgorICAgICAgICAgICAgICAgKyAicGFnZVNpemU9IiArIHBhZ2UuZ2V0UGFnZVNpemUoKSArICIsdG90YWxQYWdlcz0iCisgICAgICAgICAgICAgICArIHBhZ2UuZ2V0VG90YWxQYWdlcygpICsgIl0iKTsKKyAgICAgICAgIGlmIChwYWdlLmdldFBhZ2VXb3JrZmxvd3MoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIldvcmtmbG93TWFuYWdlciByZXR1cm5lZCBudWxsIHBhZ2Ugb2Ygd29ya2Zsb3dzIik7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKFdvcmtmbG93SW5zdGFuY2UgaW5zdCA6IChMaXN0PFdvcmtmbG93SW5zdGFuY2U+KSBwYWdlCisgICAgICAgICAgICAgICAuZ2V0UGFnZVdvcmtmbG93cygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIkluc3RhbmNlOiBbaWQ9IiArIGluc3QuZ2V0SWQoKSArICIsIHN0YXR1cz0iCisgICAgICAgICAgICAgICAgICArIGluc3QuZ2V0U3RhdHVzKCkgKyAiLCBjdXJyZW50VGFzaz0iCisgICAgICAgICAgICAgICAgICArIGluc3QuZ2V0Q3VycmVudFRhc2tJZCgpICsgIiwgd29ya2Zsb3c9IgorICAgICAgICAgICAgICAgICAgKyBpbnN0LmdldFdvcmtmbG93KCkuZ2V0TmFtZSgpICsgIix3YWxsQ2xvY2tUaW1lPSIKKyAgICAgICAgICAgICAgICAgICsgY2xpZW50LmdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyhpbnN0LmdldElkKCkpCisgICAgICAgICAgICAgICAgICArICIsY3VycmVudFRhc2tXYWxsQ2xvY2tUaW1lPSIKKyAgICAgICAgICAgICAgICAgICsgY2xpZW50LmdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHByZXZpb3VzIHBhZ2Ugb2Ygd29ya2Zsb3dzIGZvciAiICsgInBhZ2VOdW0gJyIKKyAgICAgICAgICAgICAgICAgICAgICsgcGFnZU51bSArICInIGFuZCBzdGF0dXMgJyIgKyBzdGF0dXMgKyAiJyA6ICIKKyAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRQYWdlTnVtKGludCBwYWdlTnVtKSB7CisgICAgICB0aGlzLnBhZ2VOdW0gPSBwYWdlTnVtOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFJlZ2lzdGVyZWRFdmVudHNDbGlBY3Rpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0UmVnaXN0ZXJlZEV2ZW50c0NsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2ZhYjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFJlZ2lzdGVyZWRFdmVudHNDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0cyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZCBldmVudHMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0UmVnaXN0ZXJlZEV2ZW50c0NsaUFjdGlvbiBleHRlbmRzIFdvcmtmbG93Q2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICBMaXN0PFN0cmluZz4gZXZlbnRzID0gZ2V0Q2xpZW50KCkuZ2V0UmVnaXN0ZXJlZEV2ZW50cygpOworCisgICAgICAgICBpZiAoZXZlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldvcmtmbG93TWFuYWdlciByZXR1cm5lZCBudWxsIGV2ZW50IGxpc3QiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGZvciAoU3RyaW5nIGV2ZW50IDogZXZlbnRzKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIkV2ZW50OiBbbmFtZT0iICsgZXZlbnQgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IHJlZ2lzdGVyZWQgZXZlbnRzIDogIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFRhc2tCeUlkQ2xpQWN0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFRhc2tCeUlkQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzMWVjYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0VGFza0J5SWRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmV4Y2VwdGlvbi5DbWRMaW5lQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggcmV0cmlldmVzIFdvcmtmbG93VGFzayBpbmZvcm1hdGlvbiBmb3IKKyAqIFdvcmtmbG93VGFzayB3aXRoIGdpdmVuIHRhc2sgSUQuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRUYXNrQnlJZENsaUFjdGlvbiBleHRlbmRzIFdvcmtmbG93Q2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgdGFza0lkOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IGdldENsaWVudCgpLmdldFRhc2tCeUlkKHRhc2tJZCk7CisgICAgICAgICAKKyAgICAgICAgIFN0cmluZyByZXF1aXJlZE1ldEZpZWxkcyA9ICIiOworICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGFzay5nZXRSZXF1aXJlZE1ldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAJIGlmIChyZXF1aXJlZE1ldEZpZWxkcy5sZW5ndGgoKT4wKSByZXF1aXJlZE1ldEZpZWxkcyArPSAiLCAiOworICAgICAgICAgICAgIHJlcXVpcmVkTWV0RmllbGRzICs9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICBwcmludGVyLnByaW50bG4oIlRhc2s6IFtpZD0iICsgdGFzay5nZXRUYXNrSWQoKSAKKyAgICAgICAgICAgICAgICsgIiwgbmFtZT0iICsgdGFzay5nZXRUYXNrTmFtZSgpIAorICAgICAgICAgICAgICAgKyAiLCBvcmRlcj0iICsgdGFzay5nZXRPcmRlcigpIAorICAgICAgICAgICAgICAgKyAiLCBjbGFzcz0iICsgdGFzay5nZXRDbGFzcygpLmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICsgIiwgbnVtQ29uZGl0aW9ucz0iICsgdGFzay5nZXRDb25kaXRpb25zKCkuc2l6ZSgpIAorICAgICAgICAgICAgICAgKyAiLCByZXF1aXJlZE1ldGFkYXRhRmllbGRzPVsiICsgcmVxdWlyZWRNZXRGaWVsZHMrIl0iCisgICAgICAgICAgICAgICArICIsIGNvbmZpZ3VyYXRpb249IisgdGFzay5nZXRUYXNrQ29uZmlnKCkuZ2V0UHJvcGVydGllcygpICsgIl0iKTsKKyAgICAgICAgIAorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdGFzayBieSBpZCBmb3IgdGFza0lkICciICsgdGFza0lkICsgIicgOiAiCisgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0VGFza0lkKFN0cmluZyB0YXNrSWQpIHsKKyAgICAgIHRoaXMudGFza0lkID0gdGFza0lkOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRUYXNrV2FsbENsb2NrVGltZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRUYXNrV2FsbENsb2NrVGltZUNsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWVkNzkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFRhc2tXYWxsQ2xvY2tUaW1lQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgYSB3b3JrZmxvdyBpbnN0YW5jZSdzIGN1cnJlbnQgdGFzaydzIHdhbGwKKyAqIGNsb2NrIHRpbWUuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0VGFza1dhbGxDbG9ja1RpbWVDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGluc3RhbmNlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIGRvdWJsZSB3YWxsQ2xvY2tUaW1lID0gZ2V0Q2xpZW50KCkKKyAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0N1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhpbnN0YW5jZUlkKTsKKyAgICAgICAgIHByaW50ZXIucHJpbnRsbih3YWxsQ2xvY2tUaW1lICsgIiBtaW51dGVzIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHdvcmtmbG93IGluc3RhbmNlJ3MgIgorICAgICAgICAgICAgICAgICAgICAgKyAiY3VycmVudHMgdGFza3Mgd2FsbCBjbG9jayB0aW1lIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VJZChTdHJpbmcgaW5zdGFuY2VJZCkgeworICAgICAgdGhpcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V2FsbENsb2NrVGltZUNsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXYWxsQ2xvY2tUaW1lQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5MjNjMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V2FsbENsb2NrVGltZUNsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggZ2V0cyBXYWxsIENsb2NrIFRpbWUgZm9yIGEgZ2l2ZW4gd29ya2Zsb3cKKyAqIGluc3RhbmNlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldFdhbGxDbG9ja1RpbWVDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGluc3RhbmNlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIGRvdWJsZSB3YWxsQ2xvY2tUaW1lID0gZ2V0Q2xpZW50KCkuZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKAorICAgICAgICAgICAgICAgaW5zdGFuY2VJZCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4od2FsbENsb2NrVGltZSArICIgbWludXRlcyIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgd2FsbCBjbG9jayB0aW1lIGZvciBpbnN0YW5jZSAnIiArIGluc3RhbmNlSWQKKyAgICAgICAgICAgICAgICAgICAgICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRJbnN0YW5jZUlkKFN0cmluZyBpbnN0YW5jZUlkKSB7CisgICAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd0J5SWRDbGlBY3Rpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dCeUlkQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1YTljNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dCeUlkQ2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCByZXRyaWV2ZXMgV29ya2Zsb3cgaW5mb3JtYXRpb24gZm9yCisgKiBXb3JrZmxvdyB3aXRoIGdpdmVuIHdvcmtmbG93IElELgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0V29ya2Zsb3dCeUlkQ2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyB3b3JrZmxvd0lkOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IGdldENsaWVudCgpLmdldFdvcmtmbG93QnlJZCh3b3JrZmxvd0lkKTsKKyAgICAgICAgIAorICAgICAgICAgU3RyaW5nIHRhc2tJZHMgPSAiIjsKKyAgICAgICAgIGZvciAoV29ya2Zsb3dUYXNrIHd0IDogd29ya2Zsb3cuZ2V0VGFza3MoKSkgeworICAgICAgICAJIGlmICh0YXNrSWRzLmxlbmd0aCgpPjApIHRhc2tJZHMgKz0gIiwgIjsKKyAgICAgICAgCSB0YXNrSWRzICs9IHd0LmdldFRhc2tJZCgpOworICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICBwcmludGVyLnByaW50bG4oIldvcmtmbG93OiBbaWQ9IiArIHdvcmtmbG93LmdldElkKCkgKyAiLCBuYW1lPSIKKyAgICAgICAgICAgICAgICsgd29ya2Zsb3cuZ2V0TmFtZSgpICsgIiwgbnVtVGFza3M9IgorICAgICAgICAgICAgICAgKyB3b3JrZmxvdy5nZXRUYXNrcygpLnNpemUoKSArICIsIHRhc2tJZHM9Iit0YXNrSWRzKyJdIik7CisgICAgICAgICAKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHdvcmtmbG93IGluZm9ybWF0aW9uIGZvciIgKyAiIHdvcmtmbG93SWQgJyIKKyAgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0gICAKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3dJZChTdHJpbmcgd29ya2Zsb3dJZCkgeworICAgICAgdGhpcy53b3JrZmxvd0lkID0gd29ya2Zsb3dJZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dJbnN0Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFdvcmtmbG93SW5zdENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDY0OTUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFdvcmtmbG93SW5zdENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW0uWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldCBXb3JrZmxvd0luc3RhbmNlIGluZm9ybWF0aW9uIGJ5IGdpdmVuCisgKiBpbnN0YW5jZUlkLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0V29ya2Zsb3dJbnN0Q2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBpbnN0YW5jZUlkOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBjbGllbnQuZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoaW5zdGFuY2VJZCk7CisgICAgICAgICBpZiAoaW5zdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIldvcmtmbG93TWFuYWdlciByZXR1cm5lZCBudWxsIHdvcmtmbG93IGluc3RhbmNlIik7CisgICAgICAgICB9CisgICAgICAgICBwcmludGVyLnByaW50bG4oIkluc3RhbmNlOiBbaWQ9IiArIGluc3QuZ2V0SWQoKSArICIsIHN0YXR1cz0iCisgICAgICAgICAgICAgICArIGluc3QuZ2V0U3RhdHVzKCkgKyAiLCBjdXJyZW50VGFzaz0iICsgaW5zdC5nZXRDdXJyZW50VGFza0lkKCkKKyAgICAgICAgICAgICAgICsgIiwgd29ya2Zsb3c9IiArIGluc3QuZ2V0V29ya2Zsb3coKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICsgIix3YWxsQ2xvY2tUaW1lPSIKKyAgICAgICAgICAgICAgICsgY2xpZW50LmdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyhpbnN0LmdldElkKCkpCisgICAgICAgICAgICAgICArICIsY3VycmVudFRhc2tXYWxsQ2xvY2tUaW1lPSIKKyAgICAgICAgICAgICAgICsgY2xpZW50LmdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHdvcmtmbG93IGluc3RhbmNlIGluZm9ybWF0aW9uIGZvciIKKyAgICAgICAgICAgICAgICAgICAgICsgIiBpbnN0YW5jZUlkICciICsgaW5zdGFuY2VJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlSWQoU3RyaW5nIGluc3RhbmNlSWQpIHsKKyAgICAgIHRoaXMuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFdvcmtmbG93SW5zdE1ldENsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd0luc3RNZXRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE4ZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd0luc3RNZXRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0FwYWNoZSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgd29ya2Zsb3cgaW5zdGFuY2UgbWV0YWRhdGEuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0V29ya2Zsb3dJbnN0TWV0Q2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBwcml2YXRlIFN0cmluZyBpbnN0YW5jZUlkOworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoaW5zdGFuY2VJZCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBNZXRhZGF0YSBtZXQgPSBnZXRDbGllbnQoKS5nZXRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEoaW5zdGFuY2VJZCk7CisgICAgICAgICBwcmludGVyLnByaW50bG4oIltpZD0iICsgaW5zdGFuY2VJZCArICIsIG1ldD0iICsgbWV0LmdldEhhc2h0YWJsZSgpCisgICAgICAgICAgICAgICArICJdIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3Igd29ya2Zsb3cgaW5zdGFuY2UgJyIgKyBpbnN0YW5jZUlkCisgICAgICAgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VJZChTdHJpbmcgaW5zdGFuY2VJZCkgeworICAgICAgdGhpcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dJbnN0c0NsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd0luc3RzQ2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliNTcyYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dJbnN0c0NsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggbGlzdHMgd29ya2Zsb3cgaW5zdGFuY2VzIGN1cnJlbnQgbWFuYWdlZCBieQorICogd29ya2Zsb3cgbWFuYWdlciBhdCBnaXZlbiBVUkwuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0V29ya2Zsb3dJbnN0c0NsaUFjdGlvbiBleHRlbmRzIFdvcmtmbG93Q2xpQWN0aW9uIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgIHRyeSB7CisgICAgICAgICBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgIExpc3Q8V29ya2Zsb3dJbnN0YW5jZT4gaW5zdHMgPSBjbGllbnQuZ2V0V29ya2Zsb3dJbnN0YW5jZXMoKTsKKworICAgICAgICAgaWYgKGluc3RzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiV29ya2Zsb3dNYW5hZ2VyIHJldHVybiBudWxsIHdvcmtmbG93IGluc3RhbmNlcyBsaXN0Iik7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKFdvcmtmbG93SW5zdGFuY2UgaW5zdCA6IGluc3RzKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIkluc3RhbmNlOiBbaWQ9IgorICAgICAgICAgICAgICAgICAgKyBpbnN0LmdldElkKCkKKyAgICAgICAgICAgICAgICAgICsgIiwgc3RhdHVzPSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRTdGF0dXMoKQorICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50VGFzaz0iCisgICAgICAgICAgICAgICAgICArIGluc3QuZ2V0Q3VycmVudFRhc2tJZCgpCisgICAgICAgICAgICAgICAgICArICIsIHdvcmtmbG93PSIKKyAgICAgICAgICAgICAgICAgICsgaW5zdC5nZXRXb3JrZmxvdygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgKyAiLHdhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKGluc3QuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICsgIixjdXJyZW50VGFza1dhbGxDbG9ja1RpbWU9IgorICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCkpICsgIl0iKTsKKyAgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHdvcmtmbG93IGluc3RhbmNlcyBmcm9tIFVSTCAnIiArIGdldFVybCgpCisgICAgICAgICAgICAgICAgICAgICArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dzQnlFdmVudENsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd3NCeUV2ZW50Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MjkxYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vR2V0V29ya2Zsb3dzQnlFdmVudENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBnZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiB3b3JrZmxvd3MgYnkKKyAqIGV2ZW50IG5hbWUKKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEdldFdvcmtmbG93c0J5RXZlbnRDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGV2ZW50TmFtZTsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIAorCSAgIHRyeSB7CisgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgIExpc3Q8V29ya2Zsb3c+IHdvcmtmbG93cyA9IGdldENsaWVudCgpLmdldFdvcmtmbG93c0J5RXZlbnQoZXZlbnROYW1lKTsKKworICAgICAgICAgaWYgKHdvcmtmbG93cyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJXb3JrZmxvd01hbmFnZXIgcmV0dXJuZWQgbnVsbCB3b3JrZmxvdyBsaXN0Iik7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIGZvciAoV29ya2Zsb3cgd29ya2Zsb3cgOiB3b3JrZmxvd3MpIHsKKyAgICAgICAgCSAKKyAgICAgICAgICAgICBTdHJpbmcgdGFza0lkcyA9ICIiOworICAgICAgICAgICAgIGZvciAoV29ya2Zsb3dUYXNrIHd0IDogd29ya2Zsb3cuZ2V0VGFza3MoKSkgeworICAgICAgICAgICAgCSBpZiAodGFza0lkcy5sZW5ndGgoKT4wKSB0YXNrSWRzICs9ICIsICI7CisgICAgICAgICAgICAJIHRhc2tJZHMgKz0gd3QuZ2V0VGFza0lkKCk7CisgICAgICAgICAgICAgfQorICAgICAgICAJIAorICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJXb3JrZmxvdzogW2lkPSIgKyB3b3JrZmxvdy5nZXRJZCgpICsgIiwgbmFtZT0iCisgICAgICAgICAgICAgICAgICArIHdvcmtmbG93LmdldE5hbWUoKSArICIsIG51bVRhc2tzPSIKKyAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3cuZ2V0VGFza3MoKS5zaXplKCkgKyAiLCB0YXNrSWRzPSIrdGFza0lkcyArICJdIik7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICB0aHJvdyBuZXcgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHdvcmtmbG93cyBieSBldmVudCBuYW1lICciICsgZXZlbnROYW1lICsgIicgOiAiCisgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0RXZlbnROYW1lKFN0cmluZyBldmVudE5hbWUpIHsKKyAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lOworICAgfQorICAgCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL0dldFdvcmtmbG93c0NsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd3NDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGExMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9HZXRXb3JrZmxvd3NDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIGdldCBsaXN0IG9mIGtub3cgd29ya2Zsb3cgbW9kZWxzIGZyb20KKyAqIFdvcmtmbG93TWFuYWdlciBhdCBnaXZlbiBVUkwuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgR2V0V29ya2Zsb3dzQ2xpQWN0aW9uIGV4dGVuZHMgV29ya2Zsb3dDbGlBY3Rpb24geworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgIExpc3Q8V29ya2Zsb3c+IHdvcmtmbG93cyA9IGdldENsaWVudCgpLmdldFdvcmtmbG93cygpOworCisgICAgICAgICBpZiAod29ya2Zsb3dzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiV29ya2Zsb3dNYW5hZ2VyIHJldHVybmVkIG51bGwgbGlzdCBvZiBXb3JrZmxvd3MiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgZm9yIChXb3JrZmxvdyB3b3JrZmxvdyA6IHdvcmtmbG93cykgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJXb3JrZmxvdzogW2lkPSIgKyB3b3JrZmxvdy5nZXRJZCgpICsgIiwgbmFtZT0iCisgICAgICAgICAgICAgICAgICArIHdvcmtmbG93LmdldE5hbWUoKSArICIsIG51bVRhc2tzPSIKKyAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3cuZ2V0VGFza3MoKS5zaXplKCkgKyAiXSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbGlzdCBvZiB3b3JrZmxvdyBtb2RlbHMgZnJvbSB1cmwgJyIgKyBnZXRVcmwoKQorICAgICAgICAgICAgICAgICAgICAgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vUGF1c2VXb3JrZmxvd0luc3RDbGlBY3Rpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vUGF1c2VXb3JrZmxvd0luc3RDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M0YWFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9QYXVzZVdvcmtmbG93SW5zdENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggc3RvcHMgYSB3b3JrZmxvdyBpbnN0YW5jZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBQYXVzZVdvcmtmbG93SW5zdENsaUFjdGlvbiBleHRlbmRzIFdvcmtmbG93Q2xpQWN0aW9uIHsKKworICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VJZDsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbk1lc3NhZ2VQcmludGVyIHByaW50ZXIpCisgICAgICAgICB0aHJvd3MgQ21kTGluZUFjdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgaWYgKGdldENsaWVudCgpLnBhdXNlV29ya2Zsb3dJbnN0YW5jZShpbnN0YW5jZUlkKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJTdWNjZXNzZnVsbHkgcGF1c2VkIHdvcmtmbG93ICciICsgaW5zdGFuY2VJZAorICAgICAgICAgICAgICAgICAgKyAiJyIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBhdXNlZCB3b3JrZmxvdyByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGF1c2Ugd29ya2Zsb3cgJyIKKyAgICAgICAgICAgICAgICsgaW5zdGFuY2VJZCArICInIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VJZChTdHJpbmcgaW5zdGFuY2VJZCkgeworICAgICAgdGhpcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vUmVzdW1lV29ya2Zsb3dJbnN0Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL1Jlc3VtZVdvcmtmbG93SW5zdENsaUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzg2OWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL1Jlc3VtZVdvcmtmbG93SW5zdENsaUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb247CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuZXhjZXB0aW9uLkNtZExpbmVBY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQSB7QGxpbmsgQ21kTGluZUFjdGlvbn0gd2hpY2ggcmVzdW1lcyBhIHBhdXNlZCB3b3JrZmxvdyBpbnN0YW5jZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN1bWVXb3JrZmxvd0luc3RDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGluc3RhbmNlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIGlmIChnZXRDbGllbnQoKS5yZXN1bWVXb3JrZmxvd0luc3RhbmNlKGluc3RhbmNlSWQpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIlN1Y2Nlc3NmdWxseSByZXN1bWVkIHdvcmtmbG93ICciICsgaW5zdGFuY2VJZAorICAgICAgICAgICAgICAgICAgKyAiJyIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlJlc3VtZSB3b3JrZmxvdyByZXR1cm5lZCBmYWxzZSIpOworICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVzdW1lIHdvcmtmbG93ICciCisgICAgICAgICAgICAgICArIGluc3RhbmNlSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlSWQoU3RyaW5nIGluc3RhbmNlSWQpIHsKKyAgICAgIHRoaXMuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL1NlbmRFdmVudENsaUFjdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9TZW5kRXZlbnRDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTc5M2MxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9TZW5kRXZlbnRDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vQXBhY2hlIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEEge0BsaW5rIENtZExpbmVBY3Rpb259IHdoaWNoIHRyaWdnZXJzIGEgd29ya2Zsb3cgZXZlbnQuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBTZW5kRXZlbnRDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGV2ZW50TmFtZTsKKyAgIHByaXZhdGUgTWV0YWRhdGEgbWV0YWRhdGE7CisKKyAgIHB1YmxpYyBTZW5kRXZlbnRDbGlBY3Rpb24oKSB7CisgICAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uTWVzc2FnZVByaW50ZXIgcHJpbnRlcikKKyAgICAgICAgIHRocm93cyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoZXZlbnROYW1lLCAiTXVzdCBzcGVjaWZ5IGV2ZW50TmFtZSIpOworCisgICAgICB0cnkgeworICAgICAgICAgcHJpbnRlci5wcmludCgiU2VuZGluZyBldmVudCAnIiArIGV2ZW50TmFtZSArICInLi4uICIpOworICAgICAgICAgcHJpbnRlci5wcmludGxuKGdldENsaWVudCgpLnNlbmRFdmVudChldmVudE5hbWUsIG1ldGFkYXRhKSA/CisgICAgICAgICAgICAgICAiU1VDQ0VTUyIgOiAiRkFJTFVSRSIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBDbWRMaW5lQWN0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2VuZCBldmVudCAnIiArIGV2ZW50TmFtZQorICAgICAgICAgICAgICAgKyAiJyB0byB1cmwgJyIgKyBnZXRVcmwoKSArICInIHdpdGggbWV0YWRhdGEgJyIKKyAgICAgICAgICAgICAgICsgbWV0YWRhdGEuZ2V0SGFzaHRhYmxlKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEV2ZW50TmFtZShTdHJpbmcgZXZlbnROYW1lKSB7CisgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKKyAgIH0KKworICAgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoKSB7CisgICAgICByZXR1cm4gZXZlbnROYW1lOworICAgfQorCisgICBwdWJsaWMgdm9pZCBhZGRNZXRhZGF0YShMaXN0PFN0cmluZz4gbWV0YWRhdGEpIHsKKyAgICAgIFZhbGlkYXRlLmlzVHJ1ZShtZXRhZGF0YS5zaXplKCkgPiAxKTsKKworICAgICAgdGhpcy5tZXRhZGF0YS5hZGRNZXRhZGF0YShtZXRhZGF0YS5nZXQoMCksCisgICAgICAgICAgICBtZXRhZGF0YS5zdWJMaXN0KDEsIG1ldGFkYXRhLnNpemUoKSkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9TdG9wV29ya2Zsb3dJbnN0Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL1N0b3BXb3JrZmxvd0luc3RDbGlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjJiOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL2FjdGlvbi9TdG9wV29ya2Zsb3dJbnN0Q2xpQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBDbWRMaW5lQWN0aW9ufSB3aGljaCBzdG9wcyBhIHdvcmtmbG93IGluc3RhbmNlLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIFN0b3BXb3JrZmxvd0luc3RDbGlBY3Rpb24gZXh0ZW5kcyBXb3JrZmxvd0NsaUFjdGlvbiB7CisKKyAgIHByaXZhdGUgU3RyaW5nIGluc3RhbmNlSWQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25NZXNzYWdlUHJpbnRlciBwcmludGVyKQorICAgICAgICAgdGhyb3dzIENtZExpbmVBY3Rpb25FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgIGlmIChnZXRDbGllbnQoKS5zdG9wV29ya2Zsb3dJbnN0YW5jZShpbnN0YW5jZUlkKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJTdWNjZXNzZnVsbHkgc3RvcHBlZCB3b3JrZmxvdyAnIiArIGluc3RhbmNlSWQKKyAgICAgICAgICAgICAgICAgICsgIiciKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTdG9wIHdvcmtmbG93IHJldHVybmVkIGZhbHNlIik7CisgICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgdGhyb3cgbmV3IENtZExpbmVBY3Rpb25FeGNlcHRpb24oIkZhaWxlZCB0byBzdG9wIHdvcmtmbG93ICciCisgICAgICAgICAgICAgICArIGluc3RhbmNlSWQgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlSWQoU3RyaW5nIGluc3RhbmNlSWQpIHsKKyAgICAgIHRoaXMuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL1dvcmtmbG93Q2xpQWN0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvYWN0aW9uL1dvcmtmbG93Q2xpQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1YTUxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9hY3Rpb24vV29ya2Zsb3dDbGlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5DbWRMaW5lQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBCYXNlIHtAbGluayBDbWRMaW5lQWN0aW9ufSBmb3IgV29ya2Zsb3cgTWFuYWdlci4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtmbG93Q2xpQWN0aW9uIGV4dGVuZHMgQ21kTGluZUFjdGlvbiB7CisKKyAgIHByaXZhdGUgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGNsaWVudDsKKworICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnVybCIpOworICAgfQorCisgICBwcm90ZWN0ZWQgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpCisgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoZ2V0VXJsKCkpOworCisgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQobmV3IFVSTChnZXRVcmwoKSkpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRDbGllbnQoWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGNsaWVudCkgeworICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvQ2hhbmdlVHlwZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL0NoYW5nZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjcwYzYyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL0NoYW5nZVR5cGUuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBEaWZmZXJlbnQgTGlzdGVuZXIgTWVzc2FnZSBDYXRlZ29yaWVzCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIENoYW5nZVR5cGUgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGFuZ2VUeXBlIFNUQVRFID0gbmV3IENoYW5nZVR5cGUoIlN0YXRlIik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGFuZ2VUeXBlIERZTl9NRVQgPSBuZXcgQ2hhbmdlVHlwZSgiRHluYW1pY01ldGFkYXRhIik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGFuZ2VUeXBlIFNUQVRJQ19NRVQgPSBuZXcgQ2hhbmdlVHlwZSgiU3RhdGljTWV0YWRhdGEiKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoYW5nZVR5cGUgTElTVEVORVJTID0gbmV3IENoYW5nZVR5cGUoIkxpc3RlbmVycyIpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhbmdlVHlwZSBQUklPUklUWSA9IG5ldyBDaGFuZ2VUeXBlKCJQcmlvcml0eSIpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhbmdlVHlwZSBFWENVU0VEX1dQUyA9IG5ldyBDaGFuZ2VUeXBlKCJFeGN1c2VkV29ya2Zsb3dQcm9jZXNzb3JzIik7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCQorCXB1YmxpYyBDaGFuZ2VUeXBlKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIENoYW5nZVR5cGUpIHsKKwkJCXJldHVybiB0aGlzLm5hbWUuZXF1YWxzKCgoQ2hhbmdlVHlwZSkgb2JqKS5uYW1lKTsKKwkJfWVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLmdldE5hbWUoKS5oYXNoQ29kZSgpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9JdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZC5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL0l0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4NWQ0MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9JdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsNTkyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zeXN0ZW0uWG1sUnBjUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5tZXRhZGF0YS5Db3JlTWV0S2V5czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuVGFza0pvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1N0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5HZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBXb3JrZmxvd1Byb2Nlc3NvclRocmVhZH0gdGhhdCBwcm9jZXNzZXMgdGhyb3VnaCBhbgorICogaXRlcmF0aXZlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfS4gVGhpcyBjbGFzcyBrZWVwcyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4KKyAqIHRoYXQgYWxsb3dzIGl0IHRvIG1vdmUgZnJvbSBvbmUgZW5kIG9mIGEgc2VxdWVudGlhbCB7QGxpbmsgV29ya2Zsb3d9CisgKiBwcm9jZXNzaW5nIHBpcGVsaW5lIHRvIGFub3RoZXIuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBwcm9jZXNzCisgKiBzY2llbmNlIHBpcGVsaW5lIHN0eWxlIHtAbGluayBXb3JrZmxvd31zLCBpLmUuLCB0aG9zZSB3aGljaCByZXNlbWJsZSBhbgorICogaXRlcmF0aXZlIHByb2Nlc3NpbmcgcGlwZWxpbmVzLCB3aXRoIG5vIGZvcmtzLCBvciBjb25jdXJyZW50IHRhc2sgZXhlY3V0aW9ucy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KKworcHVibGljIGNsYXNzIEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkIGltcGxlbWVudHMgV29ya2Zsb3dTdGF0dXMsCisgICAgQ29yZU1ldEtleXMsIFJ1bm5hYmxlIHsKKworICAvKiB0aGUgZGVmYXVsdCBxdWV1ZSBuYW1lIGlmIHdlJ3JlIHVzaW5nIHJlc21nciBqb2Igc3VibWlzc2lvbiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9RVUVVRV9OQU1FID0gImhpZ2giOworCisgIC8qIGFuIGl0ZXJhdG9yIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB0YXNrIHRoYXQgd2UgYXJlIG9uIGluIHRoZSB3b3JrZmxvdyAqLworICBwcml2YXRlIEl0ZXJhdG9yIHRhc2tJdGVyYXRvciA9IG51bGw7CisKKyAgLyogdGhlIHdvcmtmbG93IGluc3RhbmNlIHRoYXQgdGhpcyBwcm9jZXNzb3IgdGhyZWFkIGlzIHByb2Nlc3NpbmcgKi8KKyAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdCA9IG51bGw7CisKKyAgLyogc2hvdWxkIG91ciB3b3JrZmxvdyBwcm9jZXNzb3IgdGhyZWFkIHN0YXJ0IHJ1bm5pbmc/ICovCisgIHByaXZhdGUgYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7CisKKyAgLyoKKyAgICogdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRvIHdhaXQgaW5iZXR3ZWVuIGNoZWNraW5nIGZvciB0YXNrIHByZS1jb25kaXRpb24KKyAgICogc2F0aXNmYWN0aW9uCisgICAqLworICBwcml2YXRlIGxvbmcgd2FpdEZvckNvbmRpdGlvblNhdGlzZnkgPSAtMTsKKworICAvKiBvdXIgaW5zdGFuY2UgcmVwb3NpdG9yeSB1c2VkIHRvIHBlcnNpc3Qgd29ya2Zsb3cgaW5zdGFuY2UgaW5mbyAqLworICBwcml2YXRlIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGluc3RhbmNlUmVwb3NpdG9yeSA9IG51bGw7CisKKyAgLyoKKyAgICogb3VyIGNsaWVudCB0byBhIHJlc291cmNlIG1hbmFnZXI6IGlmIG51bGwsIGxvY2FsIHRhc2sgZXhlY3V0aW9uIHdpbGwgYmUKKyAgICogcGVyZm9ybWVkCisgICAqLworICBwcml2YXRlIFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudCByQ2xpZW50ID0gbnVsbDsKKworICAvKiBwb2xsaW5nIHdhaXQgZm9yIHJlcyBtZ3IgKi8KKyAgcHJpdmF0ZSBsb25nIHBvbGxpbmdXYWl0VGltZSA9IDEwTDsKKworICAvKgorICAgKiBzaG91bGQgb3VyIHdvcmtmbG93IHByb2Nlc3NvciB0aHJlYWQgcGF1c2UsIGFuZCBub3QgbW92ZSBvbnRvIHRoZSBuZXh0CisgICAqIHRhc2s/CisgICAqLworICBwcml2YXRlIGJvb2xlYW4gcGF1c2UgPSBmYWxzZTsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHJpdmF0ZSBNYXAgQ09ORElUSU9OX0NBQ0hFID0gbmV3IEhhc2hNYXAoKTsKKworICAvKiB0aGUgcGFyZW50IHdvcmtmbG93IG1hbmFnZXIgdXJsIHRoYXQgZXhlY3V0ZWQgdGhpcyBwcm9jZXNzb3IgdGhyZWFkICovCisgIHByaXZhdGUgVVJMIHdtZ3JQYXJlbnRVcmwgPSBudWxsOworCisgIC8qIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGpvYklkIGlmIHdlJ3JlIHVzaW5nIHRoZSByZXNvdXJjZSBtYW5hZ2VyICovCisgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRKb2JJZCA9IG51bGw7CisKKyAgcHVibGljIEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QsCisgICAgICBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBpbnN0UmVwLCBVUkwgd1BhcmVudFVybCkgeworICAgIHdvcmtmbG93SW5zdCA9IHdJbnN0OworICAgIHRhc2tJdGVyYXRvciA9IHdvcmtmbG93SW5zdC5nZXRXb3JrZmxvdygpLmdldFRhc2tzKCkuaXRlcmF0b3IoKTsKKyAgICB0aGlzLmluc3RhbmNlUmVwb3NpdG9yeSA9IGluc3RSZXA7CisKKyAgICAvKiBzdGFydCBvdXQgdGhlIGdhdGVzIHJ1bm5pbmcgKi8KKyAgICBydW5uaW5nID0gdHJ1ZTsKKworICAgIC8qCisgICAgICogZ2V0IHRoZSBhbW91bnQgb2Ygd2FpdCB0aW1lIGluYmV0d2VlbiBjaGVja2luZyBmb3IgdGFzayBwcmUtY29uZGl0aW9uCisgICAgICogc2F0aXNmYWN0aW9uCisgICAgICovCisgICAgd2FpdEZvckNvbmRpdGlvblNhdGlzZnkgPSBMb25nLmdldExvbmcoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcmVDb25kaXRpb25XYWl0VGltZSIsIDEwKQorICAgICAgICAubG9uZ1ZhbHVlKCk7CisKKyAgICBwb2xsaW5nV2FpdFRpbWUgPSBMb25nLmdldExvbmcoCisgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5yZXNvdXJjZW1nci5wb2xsaW5nV2FpdFRpbWUiLCAxMCkKKyAgICAgICAgLmxvbmdWYWx1ZSgpOworCisgICAgd21nclBhcmVudFVybCA9IHdQYXJlbnRVcmw7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQorICAgKi8KKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIC8qCisgICAgICogb2theSwgd2UgZ290IGludG8gdGhlIHJ1biBtZXRob2QsIG1hcmsgdGhlIHN0YXJ0IGRhdGUgdGltZSBmb3IgdGhlCisgICAgICogd29ya2Zsb3cgaW5zdGFuY2UgaGVyZQorICAgICAqLworICAgIFN0cmluZyBzdGFydERhdGVUaW1lSXNvU3RyID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KG5ldyBEYXRlKCkpOworICAgIHdvcmtmbG93SW5zdC5zZXRTdGFydERhdGVUaW1lSXNvU3RyKHN0YXJ0RGF0ZVRpbWVJc29TdHIpOworICAgIC8vIHBlcnNpc3QgaXQKKyAgICBwZXJzaXN0V29ya2Zsb3dJbnN0YW5jZSgpOworCisgICAgd2hpbGUgKHJ1bm5pbmcgJiYgdGFza0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgaWYgKHBhdXNlKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwKKyAgICAgICAgICAgICJJdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZDogU2tpcHBpbmcgZXhlY3V0aW9uOiBQYXVzZWQ6IEN1cnJlbnRUYXNrOiAiCisgICAgICAgICAgICAgICAgKyBnZXRUYXNrTmFtZUJ5SWQod29ya2Zsb3dJbnN0LmdldEN1cnJlbnRUYXNrSWQoKSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgV29ya2Zsb3dUYXNrIHRhc2sgPSAoV29ya2Zsb3dUYXNrKSB0YXNrSXRlcmF0b3IubmV4dCgpOworICAgICAgd29ya2Zsb3dJbnN0LnNldEN1cnJlbnRUYXNrSWQodGFzay5nZXRUYXNrSWQoKSk7CisKKyAgICAgIC8vIG5vdyBwZXJzaXN0IGl0CisgICAgICBwZXJzaXN0V29ya2Zsb3dJbnN0YW5jZSgpOworCisgICAgICAvLyBjaGVjayB0byBzZWUgaWYgcmVxIG1ldCBmaWVsZHMgYXJlIHByZXNlbnQKKyAgICAgIC8vIGlmIHRoZXkgYXJlbid0LCBzZXQgdGhlIHN0YXR1cyB0byBNRVRFUlJPUiwgYW5kIHRoZW4gZmFpbAorICAgICAgaWYgKCFjaGVja1Rhc2tSZXF1aXJlZE1ldGFkYXRhKHRhc2ssIHRoaXMud29ya2Zsb3dJbnN0LmdldFNoYXJlZENvbnRleHQoKSkpIHsKKyAgICAgICAgdGhpcy53b3JrZmxvd0luc3Quc2V0U3RhdHVzKE1FVEFEQVRBX01JU1NJTkcpOworICAgICAgICBwZXJzaXN0V29ya2Zsb3dJbnN0YW5jZSgpOworICAgICAgICAvLyBub3cgYnJlYWsgb3V0IG9mIHRoaXMgcnVuIGxvb3AKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyB0aGlzIGlzIHdoZXJlIHRoZSBwcmUtY29uZGl0aW9ucyBjb21lIGluCisgICAgICAvLyBvbmx5IGV4ZWN1dGUgdGhlIGJlbG93IGNvZGUgd2hlbiBpdCdzIHBhc3NlZCBhbGwgb2YgaXRzCisgICAgICAvLyBwcmUtY29uZGl0aW9ucworICAgICAgaWYgKHRhc2suZ2V0Q29uZGl0aW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgd2hpbGUgKCFzYXRpc2ZpZWQodGFzay5nZXRDb25kaXRpb25zKCksIHRhc2suZ2V0VGFza0lkKCkpCisgICAgICAgICAgICAmJiAhaXNTdG9wcGVkKCkpIHsKKworICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBwYXVzZWQsIGdvIGFoZWFkIGFuZCBwYXVzZSB1cyBub3cKKyAgICAgICAgICBpZiAoIWlzUGF1c2VkKCkpIHsKKyAgICAgICAgICAgIHBhdXNlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FU1QsCisgICAgICAgICAgICAgICJQcmUtY29uZGl0aW9ucyBmb3IgdGFzazogIiArIHRhc2suZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgICAgICAgKyAiIHVuc2F0aXNmaWVkOiB3YWl0aW5nOiAiICsgd2FpdEZvckNvbmRpdGlvblNhdGlzZnkKKyAgICAgICAgICAgICAgICAgICsgIiBzZWNvbmRzIGJlZm9yZSBjaGVja2luZyBhZ2Fpbi4iKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCh3YWl0Rm9yQ29uZGl0aW9uU2F0aXNmeSAqIDEwMDApOworICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBiZWVuIHJlc3VtZWQsIGlmIHNvLCBicmVhaworICAgICAgICAgIC8vIHRoZSBsb29wIGFuZCBzdGFydAorICAgICAgICAgIGlmICghaXNQYXVzZWQoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGJlZW4ga2lsbGVkCisgICAgICAgIGlmIChpc1N0b3BwZWQoKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gdW4gcGF1c2UgdXMgKGlmIG5lZWRlZCkKKyAgICAgICAgaWYgKGlzUGF1c2VkKCkpIHsKKyAgICAgICAgICByZXN1bWUoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyB0YXNrIGV4ZWN1dGlvbgorICAgICAgTE9HLmxvZygKKyAgICAgICAgICBMZXZlbC5GSU5FU1QsCisgICAgICAgICAgIkl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkOiBFeGVjdXRpbmcgdGFzazogIgorICAgICAgICAgICAgICArIHRhc2suZ2V0VGFza05hbWUoKSk7CisKKyAgICAgIFdvcmtmbG93VGFza0luc3RhbmNlIHRhc2tJbnN0YW5jZSA9IEdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkKKyAgICAgICAgICAuZ2V0VGFza09iamVjdEZyb21DbGFzc05hbWUodGFzay5nZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAvLyBhZGQgdGhlIFRhc2tJZCBhbmQgdGhlIEpvYklkIGFuZCBQcm9jZXNzaW5nTm9kZQorICAgICAgLy8gVE9ETzogdW5mYWtlIHRoZSBKb2JJZAorICAgICAgd29ya2Zsb3dJbnN0LmdldFNoYXJlZENvbnRleHQoKQorICAgICAgICAgIC5yZXBsYWNlTWV0YWRhdGEoVEFTS19JRCwgdGFzay5nZXRUYXNrSWQoKSk7CisgICAgICB3b3JrZmxvd0luc3QuZ2V0U2hhcmVkQ29udGV4dCgpLnJlcGxhY2VNZXRhZGF0YShXT1JLRkxPV19JTlNUX0lELAorICAgICAgICAgIHdvcmtmbG93SW5zdC5nZXRJZCgpKTsKKyAgICAgIHdvcmtmbG93SW5zdC5nZXRTaGFyZWRDb250ZXh0KCkucmVwbGFjZU1ldGFkYXRhKEpPQl9JRCwKKyAgICAgICAgICB3b3JrZmxvd0luc3QuZ2V0SWQoKSk7CisgICAgICB3b3JrZmxvd0luc3QuZ2V0U2hhcmVkQ29udGV4dCgpLnJlcGxhY2VNZXRhZGF0YShQUk9DRVNTSU5HX05PREUsCisgICAgICAgICAgZ2V0SG9zdG5hbWUoKSk7CisgICAgICB3b3JrZmxvd0luc3QuZ2V0U2hhcmVkQ29udGV4dCgpLnJlcGxhY2VNZXRhZGF0YShXT1JLRkxPV19NQU5BR0VSX1VSTCwKKyAgICAgICAgICB0aGlzLndtZ3JQYXJlbnRVcmwudG9TdHJpbmcoKSk7CisKKyAgICAgIGlmIChyQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgLy8gYnVpbGQgdXAgdGhlIEpvYgorICAgICAgICAvLyBhbmQgdGhlIEpvYiBJbnB1dAorICAgICAgICBKb2IgdGFza0pvYiA9IG5ldyBKb2IoKTsKKyAgICAgICAgdGFza0pvYi5zZXROYW1lKHRhc2suZ2V0VGFza0lkKCkpOworICAgICAgICB0YXNrSm9iCisgICAgICAgICAgICAuc2V0Sm9iSW5zdGFuY2VDbGFzc05hbWUoIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5UYXNrSm9iIik7CisgICAgICAgIHRhc2tKb2IKKyAgICAgICAgICAgIC5zZXRKb2JJbnB1dENsYXNzTmFtZSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlRhc2tKb2JJbnB1dCIpOworICAgICAgICB0YXNrSm9iLnNldExvYWRWYWx1ZSh0YXNrLmdldFRhc2tDb25maWcoKS5nZXRQcm9wZXJ0eShUQVNLX0xPQUQpICE9IG51bGwgPyAKKyAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQodGFzay5nZXRUYXNrQ29uZmlnKCkuZ2V0UHJvcGVydHkoVEFTS19MT0FEKSk6bmV3IEludGVnZXIoMikpOworICAgICAgICB0YXNrSm9iCisgICAgICAgICAgICAuc2V0UXVldWVOYW1lKHRhc2suZ2V0VGFza0NvbmZpZygpLmdldFByb3BlcnR5KFFVRVVFX05BTUUpICE9IG51bGwgPyB0YXNrCisgICAgICAgICAgICAgICAgLmdldFRhc2tDb25maWcoKS5nZXRQcm9wZXJ0eShRVUVVRV9OQU1FKSA6IERFRkFVTFRfUVVFVUVfTkFNRSk7CisKKyAgICAgICAgVGFza0pvYklucHV0IGluID0gbmV3IFRhc2tKb2JJbnB1dCgpOworICAgICAgICBpbi5zZXREeW5NZXRhZGF0YSh3b3JrZmxvd0luc3QuZ2V0U2hhcmVkQ29udGV4dCgpKTsKKyAgICAgICAgaW4uc2V0VGFza0NvbmZpZyh0YXNrLmdldFRhc2tDb25maWcoKSk7CisgICAgICAgIGluLnNldFdvcmtmbG93VGFza0luc3RhbmNlQ2xhc3NOYW1lKHRhc2suZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkpOworCisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRTdGF0dXMoUkVTTUdSX1NVQk1JVCk7CisgICAgICAgIHBlcnNpc3RXb3JrZmxvd0luc3RhbmNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAvLyB0aGlzIGlzICogTk9UICogYSBibG9ja2luZyBvcGVyYXRpb24gc28gd2hlbiBpdCByZXR1cm5zCisgICAgICAgICAgLy8gdGhlIGpvYiBtYXkgbm90IGFjdHVhbGx5IGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nCisgICAgICAgICAgLy8gc28gd2UgZ28gaW50byBhIHdhaXRpbmcvc2xlZXAgYmVoYXZpb3IgdXNpbmcgdGhlIHBhc3NlZAorICAgICAgICAgIC8vIGJhY2sgam9iIGlkIHRvIHdhaXQgdW50aWwgdGhlIGpvYiBoYXMgYWN0dWFsbHkgZmluaXNoZWQKKyAgICAgICAgICAvLyBleGVjdXRpbmcKKworICAgICAgICAgIHRoaXMuY3VycmVudEpvYklkID0gckNsaWVudC5zdWJtaXRKb2IodGFza0pvYiwgaW4pOworCisgICAgICAgICAgd2hpbGUgKCFzYWZlQ2hlY2tKb2JDb21wbGV0ZSh0aGlzLmN1cnJlbnRKb2JJZCkgJiYgIWlzU3RvcHBlZCgpKSB7CisgICAgICAgICAgICAvLyBzbGVlcCBmb3IgNSBzZWNvbmRzIHRoZW4gY29tZSBiYWNrCisgICAgICAgICAgICAvLyBhbmQgY2hlY2sgYWdhaW4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAocG9sbGluZ1dhaXRUaW1lICogMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBva2F5IGpvYiBpcyBkb25lOiBUT0RPOiBmaXggdGhpcyBoYWNrCisgICAgICAgICAgLy8gdGhlIHRhc2sgdXBkYXRlIHRpbWUgd2FzIHNldCByZW1vdGVseQorICAgICAgICAgIC8vIGJ5IHJlbW90ZSB0YXNrLCBzbyBsZXQncyByZWFkIGl0IG5vdworICAgICAgICAgIC8vIGZyb20gdGhlIGluc3RSZXBvICh3aGljaCB3aWxsIGhhdmUgdGhlIHVwZGF0ZWQKKyAgICAgICAgICAvLyB0aW1lKQorCisgICAgICAgICAgaWYgKGlzU3RvcHBlZCgpKSB7CisgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhpcyB3b3JrZmxvdyB3YXMga2lsbGVkLCBzbworICAgICAgICAgICAgLy8gZ3JhY2VmdWxseSBleGl0CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIHVwZGF0ZWRJbnN0ID0gbnVsbDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdXBkYXRlZEluc3QgPSBpbnN0YW5jZVJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQod29ya2Zsb3dJbnN0LmdldElkKCkpOworICAgICAgICAgICAgd29ya2Zsb3dJbnN0ID0gdXBkYXRlZEluc3Q7CisgICAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gZ2V0ICIgKyAidXBkYXRlZCB3b3JrZmxvdyAiCisgICAgICAgICAgICAgICAgKyAiaW5zdGFuY2UgcmVjb3JkICIgKyAid2hlbiBleGVjdXRpbmcgcmVtb3RlIGpvYjogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChKb2JFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgIkpvYiBleGVjdXRpb24gZXhjZXB0aW9uIHVzaW5nIHJlc291cmNlIG1hbmFnZXIgdG8gZXhlY3V0ZSBqb2I6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyB3ZSBzdGFydGVkLCBzbyBtYXJrIGl0CisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRTdGF0dXMoU1RBUlRFRCk7CisgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBwZXJzaXN0IHRoZSB3b3JrZmxvdyBpbnN0YW5jZSwgYWZ0ZXIgd2UKKyAgICAgICAgLy8gc2F2ZSB0aGUgY3VycmVudCB0YXNrIHN0YXJ0IGRhdGUgdGltZQorICAgICAgICBTdHJpbmcgY3VycmVudFRhc2tJc29TdGFydERhdGVUaW1lU3RyID0gRGF0ZUNvbnZlcnQKKyAgICAgICAgICAgIC5pc29Gb3JtYXQobmV3IERhdGUoKSk7CisgICAgICAgIHdvcmtmbG93SW5zdAorICAgICAgICAgICAgLnNldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cihjdXJyZW50VGFza0lzb1N0YXJ0RGF0ZVRpbWVTdHIpOworICAgICAgICB3b3JrZmxvd0luc3Quc2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cihudWxsKTsgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNsZWFyIHRoaXMgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1bnRpbCBpdCdzIHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcGVyc2lzdFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgICAgZXhlY3V0ZVRhc2tMb2NhbGx5KHRhc2tJbnN0YW5jZSwgd29ya2Zsb3dJbnN0LmdldFNoYXJlZENvbnRleHQoKSwKKyAgICAgICAgICAgIHRhc2suZ2V0VGFza0NvbmZpZygpLCB0YXNrLmdldFRhc2tOYW1lKCkpOworICAgICAgICBTdHJpbmcgY3VycmVudFRhc2tJc29FbmREYXRlVGltZVN0ciA9IERhdGVDb252ZXJ0Lmlzb0Zvcm1hdChuZXcgRGF0ZSgpKTsKKyAgICAgICAgd29ya2Zsb3dJbnN0CisgICAgICAgICAgICAuc2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cihjdXJyZW50VGFza0lzb0VuZERhdGVUaW1lU3RyKTsKKyAgICAgICAgcGVyc2lzdFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgIH0KKworICAgICAgTE9HLmxvZygKKyAgICAgICAgICBMZXZlbC5GSU5FU1QsCisgICAgICAgICAgIkl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkOiBDb21wbGV0ZWQgdGFzazogIgorICAgICAgICAgICAgICArIHRhc2suZ2V0VGFza05hbWUoKSk7CisKKyAgICB9CisKKyAgICBMT0cubG9nKExldmVsLkZJTkVTVCwKKyAgICAgICAgIkl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkOiBDb21wbGV0ZWQgd29ya2Zsb3c6ICIKKyAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0LmdldFdvcmtmbG93KCkuZ2V0TmFtZSgpKTsKKyAgICBpZiAoIWlzU3RvcHBlZCgpKSB7CisgICAgICBzdG9wKCk7CisgICAgfQorCisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZSBnZXRXb3JrZmxvd0luc3RhbmNlKCkgeworICAgIHJldHVybiB3b3JrZmxvd0luc3Q7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKyAgICBydW5uaW5nID0gZmFsc2U7CisgICAgLy8gaWYgdGhlIHJlc291cmNlIG1hbmFnZXIgaXMgYWN0aXZlCisgICAgLy8gdGhlbiBraWxsIHRoZSBjdXJyZW50IGpvYiB0aGVyZQorICAgIGlmICh0aGlzLnJDbGllbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRKb2JJZCAhPSBudWxsKSB7CisgICAgICBpZiAoIXRoaXMuckNsaWVudC5raWxsSm9iKHRoaXMuY3VycmVudEpvYklkKSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJBdHRlbXB0IHRvIGtpbGwgIiArICJjdXJyZW50IHJlc21nciBqb2I6IFsiCisgICAgICAgICAgICArIHRoaXMuY3VycmVudEpvYklkICsgIl06IGZhaWxlZCIpOworICAgICAgfQorICAgIH0KKworICAgIHdvcmtmbG93SW5zdC5zZXRTdGF0dXMoRklOSVNIRUQpOworICAgIFN0cmluZyBpc29FbmREYXRlVGltZVN0ciA9IERhdGVDb252ZXJ0Lmlzb0Zvcm1hdChuZXcgRGF0ZSgpKTsKKyAgICB3b3JrZmxvd0luc3Quc2V0RW5kRGF0ZVRpbWVJc29TdHIoaXNvRW5kRGF0ZVRpbWVTdHIpOworICAgIHBlcnNpc3RXb3JrZmxvd0luc3RhbmNlKCk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgeworICAgIHBhdXNlID0gZmFsc2U7CisgICAgd29ya2Zsb3dJbnN0LnNldFN0YXR1cyhTVEFSVEVEKTsKKyAgICBwZXJzaXN0V29ya2Zsb3dJbnN0YW5jZSgpOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBhdXNlKCkgeworICAgIHBhdXNlID0gdHJ1ZTsKKyAgICB3b3JrZmxvd0luc3Quc2V0U3RhdHVzKFBBVVNFRCk7CisgICAgcGVyc2lzdFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFdvcmtmbG93SW5zdGFuY2UgbWFuYWdlZCBieSB0aGlzIHByb2Nlc3NvciBpcyBwYXVzZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc1BhdXNlZCgpIHsKKyAgICByZXR1cm4gcGF1c2UgPT0gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzU3RvcHBlZCgpIHsKKyAgICByZXR1cm4gIXJ1bm5pbmc7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ3VycmVudFRhc2tJZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFRhc2tJZCgpIHsKKyAgICByZXR1cm4gd29ya2Zsb3dJbnN0LmdldEN1cnJlbnRUYXNrSWQoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gd29ya2Zsb3dJbnN0CisgICAqICAgICAgICAgIFRoZSBmV29ya2Zsb3dJbnN0IHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFdvcmtmbG93SW5zdChXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdCkgeworICAgIHRoaXMud29ya2Zsb3dJbnN0ID0gd29ya2Zsb3dJbnN0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2FpdEZvckNvbmRpdGlvblNhdGlzZnkuCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRXYWl0Zm9yQ29uZGl0aW9uU2F0aXNmeSgpIHsKKyAgICByZXR1cm4gd2FpdEZvckNvbmRpdGlvblNhdGlzZnk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHdhaXRmb3JDb25kaXRpb25TYXRpc2Z5CisgICAqICAgICAgICAgIFRoZSB3YWl0Rm9yQ29uZGl0aW9uU2F0aXNmeSB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRXYWl0Zm9yQ29uZGl0aW9uU2F0aXNmeShsb25nIHdhaXRmb3JDb25kaXRpb25TYXRpc2Z5KSB7CisgICAgdGhpcy53YWl0Rm9yQ29uZGl0aW9uU2F0aXNmeSA9IHdhaXRmb3JDb25kaXRpb25TYXRpc2Z5OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGluc3RSZXAKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBnZXRJbnN0YW5jZVJlcG9zaXRvcnkoKSB7CisgICAgcmV0dXJuIGluc3RhbmNlUmVwb3NpdG9yeTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gaW5zdFJlcAorICAgKiAgICAgICAgICB0aGUgaW5zdFJlcCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlUmVwb3NpdG9yeShXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBpbnN0UmVwKSB7CisgICAgdGhpcy5pbnN0YW5jZVJlcG9zaXRvcnkgPSBpbnN0UmVwOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHJDbGllbnQKKyAgICovCisgIHB1YmxpYyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgZ2V0UkNsaWVudCgpIHsKKyAgICByZXR1cm4gckNsaWVudDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY2xpZW50CisgICAqICAgICAgICAgIHRoZSByQ2xpZW50IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UkNsaWVudChYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgY2xpZW50KSB7CisgICAgckNsaWVudCA9IGNsaWVudDsKKyAgICBpZiAockNsaWVudCAhPSBudWxsKSB7CisgICAgICBMT0cubG9nKExldmVsLklORk8sICJSZXNvdXJjZSBNYW5hZ2VyIEpvYiBTdWJtaXNzaW9uIGVuYWJsZWQgdG86IFsiCisgICAgICAgICAgKyByQ2xpZW50LmdldFJlc01nclVybCgpICsgIl0iKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgd21nclBhcmVudFVybAorICAgKi8KKyAgcHVibGljIFVSTCBnZXRXbWdyUGFyZW50VXJsKCkgeworICAgIHJldHVybiB3bWdyUGFyZW50VXJsOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB3bWdyUGFyZW50VXJsCisgICAqICAgICAgICAgIHRoZSB3bWdyUGFyZW50VXJsIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0V21nclBhcmVudFVybChVUkwgd21nclBhcmVudFVybCkgeworICAgIHRoaXMud21nclBhcmVudFVybCA9IHdtZ3JQYXJlbnRVcmw7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gY2hlY2tUYXNrUmVxdWlyZWRNZXRhZGF0YShXb3JrZmxvd1Rhc2sgdGFzaywKKyAgICAgIE1ldGFkYXRhIGR5bk1ldGFkYXRhKSB7CisgICAgaWYgKHRhc2suZ2V0UmVxdWlyZWRNZXRGaWVsZHMoKSA9PSBudWxsCisgICAgICAgIHx8ICh0YXNrLmdldFJlcXVpcmVkTWV0RmllbGRzKCkgIT0gbnVsbCAmJiB0YXNrLmdldFJlcXVpcmVkTWV0RmllbGRzKCkKKyAgICAgICAgICAgIC5zaXplKCkgPT0gMCkpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlRhc2s6IFsiICsgdGFzay5nZXRUYXNrTmFtZSgpCisgICAgICAgICAgKyAiXSBoYXMgbm8gcmVxdWlyZWQgbWV0YWRhdGEgZmllbGRzIik7CisgICAgICByZXR1cm4gdHJ1ZTsgLyogbm8gcmVxdWlyZWQgbWV0YWRhdGEsIHNvIHdlJ3JlIGZpbmUgKi8KKyAgICB9CisKKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrLmdldFJlcXVpcmVkTWV0RmllbGRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBTdHJpbmcgcmVxRmllbGQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgIGlmICghZHluTWV0YWRhdGEuY29udGFpbnNLZXkocmVxRmllbGQpKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiQ2hlY2tpbmcgbWV0YWRhdGEga2V5OiBbIiArIHJlcUZpZWxkCisgICAgICAgICAgICArICJdIGZvciB0YXNrOiBbIiArIHRhc2suZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgKyAiXTogZmFpbGVkOiBhYm9ydGluZyB3b3JrZmxvdyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiQWxsIHJlcXVpcmVkIG1ldGFkYXRhIGZpZWxkcyBwcmVzZW50IGZvciB0YXNrOiBbIgorICAgICAgICArIHRhc2suZ2V0VGFza05hbWUoKSArICJdIik7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFRhc2tOYW1lQnlJZChTdHJpbmcgdGFza0lkKSB7CisgICAgZm9yIChJdGVyYXRvciBpID0gd29ya2Zsb3dJbnN0LmdldFdvcmtmbG93KCkuZ2V0VGFza3MoKS5pdGVyYXRvcigpOyBpCisgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IChXb3JrZmxvd1Rhc2spIGkubmV4dCgpOworICAgICAgaWYgKHRhc2suZ2V0VGFza0lkKCkuZXF1YWxzKHRhc2tJZCkpIHsKKyAgICAgICAgcmV0dXJuIHRhc2suZ2V0VGFza05hbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBzYXRpc2ZpZWQoTGlzdCBjb25kaXRpb25MaXN0LCBTdHJpbmcgdGFza0lkKSB7CisgICAgZm9yIChJdGVyYXRvciBpID0gY29uZGl0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGMgPSAoV29ya2Zsb3dDb25kaXRpb24pIGkubmV4dCgpOworICAgICAgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSBjSW5zdCA9IG51bGw7CisKKyAgICAgIC8vIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IGNhY2hlZCB0aGlzIGNvbmRpdGlvbiBpbnN0YW5jZQorICAgICAgaWYgKENPTkRJVElPTl9DQUNIRS5nZXQodGFza0lkKSAhPSBudWxsKSB7CisgICAgICAgIEhhc2hNYXAgY29uZGl0aW9uTWFwID0gKEhhc2hNYXApIENPTkRJVElPTl9DQUNIRS5nZXQodGFza0lkKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBva2F5IHdlIGhhdmUgc29tZSBjb25kaXRpb25zIGNhY2hlZCBmb3IgdGhpcyB0YXNrLCBzZWUgaWYgd2UgaGF2ZSB0aGUKKyAgICAgICAgICogb25lIHdlIG5lZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChjb25kaXRpb25NYXAuZ2V0KGMuZ2V0Q29uZGl0aW9uSWQoKSkgIT0gbnVsbCkgeworICAgICAgICAgIGNJbnN0ID0gKFdvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UpIGNvbmRpdGlvbk1hcC5nZXQoYworICAgICAgICAgICAgICAuZ2V0Q29uZGl0aW9uSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgbm90LCB0aGVuIGdvIGFoZWFkIGFuZCBjcmVhdGUgaXQgYW5kIGNhY2hlIGl0ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIGNJbnN0ID0gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAuZ2V0Q29uZGl0aW9uT2JqZWN0RnJvbUNsYXNzTmFtZShjCisgICAgICAgICAgICAgICAgICAuZ2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgICAgY29uZGl0aW9uTWFwLnB1dChjLmdldENvbmRpdGlvbklkKCksIGNJbnN0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogbm8gY29uZGl0aW9ucyBjYWNoZWQgeWV0LCBzbyBzZXQgZXZlcnl0aGluZyB1cCAqLworICAgICAgZWxzZSB7CisgICAgICAgIEhhc2hNYXAgY29uZGl0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgY0luc3QgPSBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmdldENvbmRpdGlvbk9iamVjdEZyb21DbGFzc05hbWUoYworICAgICAgICAgICAgLmdldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgICAgICBjb25kaXRpb25NYXAucHV0KGMuZ2V0Q29uZGl0aW9uSWQoKSwgY0luc3QpOworICAgICAgICBDT05ESVRJT05fQ0FDSEUucHV0KHRhc2tJZCwgY29uZGl0aW9uTWFwKTsKKyAgICAgIH0KKworICAgICAgLy8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgZXZhbHVhdGlvbgorICAgICAgaWYgKCFjSW5zdC5ldmFsdWF0ZSh3b3JrZmxvd0luc3QuZ2V0U2hhcmVkQ29udGV4dCgpLCBjLmdldFRhc2tDb25maWcoKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIEdldCBob3N0bmFtZSBieSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIElQIGFkZHJlc3MKKyAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgIC8vIEdldCB0aGUgaG9zdCBuYW1lCisgICAgICBTdHJpbmcgaG9zdG5hbWUgPSBhZGRyLmdldEhvc3ROYW1lKCk7CisgICAgICByZXR1cm4gaG9zdG5hbWU7CisgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwZXJzaXN0V29ya2Zsb3dJbnN0YW5jZSgpIHsKKyAgICB0cnkgeworICAgICAgaW5zdGFuY2VSZXBvc2l0b3J5LnVwZGF0ZVdvcmtmbG93SW5zdGFuY2Uod29ya2Zsb3dJbnN0KTsKKyAgICB9IGNhdGNoIChJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIHBlcnNpc3Rpbmcgd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgKyB3b3JrZmxvd0luc3QuZ2V0SWQoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBleGVjdXRlVGFza0xvY2FsbHkoV29ya2Zsb3dUYXNrSW5zdGFuY2UgaW5zdGFuY2UsIE1ldGFkYXRhIG1ldCwKKyAgICAgIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY2ZnLCBTdHJpbmcgdGFza05hbWUpIHsKKyAgICB0cnkgeworICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiRXhlY3V0aW5nIHRhc2s6IFsiICsgdGFza05hbWUgKyAiXSBsb2NhbGx5Iik7CisgICAgICBpbnN0YW5jZS5ydW4obWV0LCBjZmcpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGV4ZWN1dGluZyB0YXNrOiBbIiArIHRhc2tOYW1lCisgICAgICAgICAgKyAiXSBsb2NhbGx5OiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBzYWZlQ2hlY2tKb2JDb21wbGV0ZShTdHJpbmcgam9iSWQpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHJDbGllbnQuaXNKb2JDb21wbGV0ZShqb2JJZCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBjaGVja2luZyBjb21wbGV0aW9uIHN0YXR1cyBmb3Igam9iOiBbIgorICAgICAgICAgICsgam9iSWQgKyAiXTogTWVzc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9Qcmlvcml0aXplZFF1ZXVlQmFzZWRXb3JrZmxvd0VuZ2luZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1ByaW9yaXRpemVkUXVldWVCYXNlZFdvcmtmbG93RW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYzdiOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9Qcmlvcml0aXplZFF1ZXVlQmFzZWRXb3JrZmxvd0VuZ2luZS5qYXZhCkBAIC0wLDAgKzEsMjY0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvclF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lci5FbmdpbmVSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5IaWdoZXN0RklGT1ByaW9yaXR5U29ydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5QYXJlbnRDaGlsZFdvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Qcmlvcml0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHlTb3J0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLkVuZ2luZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5JbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8qKgorICogCisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEBhdXRob3IgYmZvc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQcmlvcml0aXplZFF1ZXVlQmFzZWRXb3JrZmxvd0VuZ2luZSBpbXBsZW1lbnRzIFdvcmtmbG93RW5naW5lIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKFByaW9yaXRpemVkUXVldWVCYXNlZFdvcmtmbG93RW5naW5lLmNsYXNzLmdldE5hbWUoKSk7CisgIHByaXZhdGUgZmluYWwgVGhyZWFkIHF1ZXVlclRocmVhZDsKKyAgcHJpdmF0ZSBmaW5hbCBUaHJlYWQgcnVubmVyVGhyZWFkOworICBwcml2YXRlIGZpbmFsIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IHJlcG87CisgIHByaXZhdGUgZmluYWwgV29ya2Zsb3dSZXBvc2l0b3J5IG1vZGVsUmVwbzsKKyAgcHJpdmF0ZSBmaW5hbCBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlOworICBwcml2YXRlIGZpbmFsIFByaW9yaXR5U29ydGVyIHByaW9yaXRpemVyOworICBwcml2YXRlIFdvcmtmbG93UHJvY2Vzc29yUXVldWUgcHJvY2Vzc29yUXVldWU7CisgIHByaXZhdGUgVVJMIHdtZ3JVcmw7CisgIHByaXZhdGUgRW5naW5lUnVubmVyIHJ1bm5lcjsKKworICBwdWJsaWMgUHJpb3JpdGl6ZWRRdWV1ZUJhc2VkV29ya2Zsb3dFbmdpbmUoV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgcmVwbywKKyAgICAgIFByaW9yaXR5U29ydGVyIHByaW9yaXRpemVyLCBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlLAorICAgICAgRW5naW5lUnVubmVyIHJ1bm5lciwgV29ya2Zsb3dSZXBvc2l0b3J5IG1vZGVsUmVwbywgbG9uZyBxdWVyaWVyV2FpdFNlY29uZHMpIHsKKyAgICB0aGlzLnJlcG8gPSByZXBvOworICAgIHRoaXMucHJpb3JpdGl6ZXIgPSBwcmlvcml0aXplciAhPSBudWxsID8gbmV3IEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIoMSwKKyAgICAgICAgNTAsIDEpIDogcHJpb3JpdGl6ZXI7CisgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgICAgdGhpcy5tb2RlbFJlcG8gPSBtb2RlbFJlcG87CisgICAgdGhpcy5wcm9jZXNzb3JRdWV1ZSA9IG5ldyBXb3JrZmxvd1Byb2Nlc3NvclF1ZXVlKHJlcG8sIGxpZmVjeWNsZSwgbW9kZWxSZXBvKTsKKyAgICB0aGlzLnJ1bm5lciA9IHJ1bm5lcjsKKyAgICB0aGlzLnJ1bm5lci5zZXRJbnN0YW5jZVJlcG9zaXRvcnkocmVwbyk7CisKKyAgICAvLyBUYXNrIFFVRVVFUiB0aHJlYWQKKyAgICBUYXNrUXVlcmllciBxdWVyaWVyID0gbmV3IFRhc2tRdWVyaWVyKHByb2Nlc3NvclF1ZXVlLCB0aGlzLnByaW9yaXRpemVyLAorICAgICAgICB0aGlzLnJlcG8sIHF1ZXJpZXJXYWl0U2Vjb25kcyk7CisgICAgcXVldWVyVGhyZWFkID0gbmV3IFRocmVhZChxdWVyaWVyKTsKKyAgICBxdWV1ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgIC8vIFRhc2sgUnVubmVyIHRocmVhZAorICAgIHJ1bm5lclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRhc2tSdW5uZXIocXVlcmllciwgcnVubmVyKSk7CisgICAgcnVubmVyVGhyZWFkLnN0YXJ0KCk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEVuZ2luZVJ1bm5lcihFbmdpbmVSdW5uZXIgcnVubmVyKSB7CisgICAgdGhpcy5ydW5uZXIgPSBydW5uZXI7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLldvcmtmbG93RW5naW5lI3N0YXJ0V29ya2Zsb3cob3JnLmFwYWNoZQorICAgKiAub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdywgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZSBzdGFydFdvcmtmbG93KFdvcmtmbG93IHdvcmtmbG93LCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgIHRocm93cyBFbmdpbmVFeGNlcHRpb24geworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIC8vIGxvb2tzIGxpa2UgdGhlIHdvcmsgdG8gZG8gaGVyZSBpcworICAgIC8vIGNyZWF0ZSBhIG5ldyBXb3JrZmxvd0luc3RhbmNlCisgICAgLy8gY3JlYXRlIGEgbmV3IFdvcmtmbG93UHJvY2Vzc29yIGFyb3VuZCBpdAorICAgIC8vIHNldCBpdCBpbiBRdWV1ZWQgc3RhdHVzCisgICAgLy8gY29tbWl0IGl0IHRvIHdvcmtmbG93IGluc3RhbmNlIHJlcG8gYW5kIGl0IHdpbGwgZ2V0IHBpY2tlZCB1cAorCisgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICBpbnN0LnNldFBhcmVudENoaWxkV29ya2Zsb3cod29ya2Zsb3cgaW5zdGFuY2VvZiBQYXJlbnRDaGlsZFdvcmtmbG93ID8gKFBhcmVudENoaWxkV29ya2Zsb3cpIHdvcmtmbG93CisgICAgICAgIDogbmV3IFBhcmVudENoaWxkV29ya2Zsb3cod29ya2Zsb3cpKTsKKyAgICBpbnN0LnNldFN0YXJ0RGF0ZShDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSk7CisgICAgaW5zdC5zZXRDdXJyZW50VGFza0lkKHdvcmtmbG93LmdldFRhc2tzKCkuZ2V0KDApLmdldFRhc2tJZCgpKTsKKyAgICBpbnN0LnNldFNoYXJlZENvbnRleHQobWV0YWRhdGEpOworICAgIGluc3Quc2V0UHJpb3JpdHkoUHJpb3JpdHkuZ2V0RGVmYXVsdCgpKTsgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHNlbnNlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkIGluCisgICAgV29ya2Zsb3dMaWZlY3ljbGUgY3ljbGUgPSBnZXRMaWZlY3ljbGVGb3JXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgV29ya2Zsb3dTdGF0ZSBzdGF0ZSA9IGN5Y2xlLmNyZWF0ZVN0YXRlKCJOdWxsIiwgImluaXRpYWwiLAorICAgICAgICAiV29ya2Zsb3cgY3JlYXRlZCBieSBFbmdpbmUuIik7CisgICAgaW5zdC5zZXRTdGF0ZShzdGF0ZSk7CisgICAgcGVyc2lzdChpbnN0KTsKKyAgICByZXR1cm4gaW5zdDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dFbmdpbmUjc3RvcFdvcmtmbG93KGphdmEubGFuZworICAgKiAuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3BXb3JrZmxvdyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dFbmdpbmUjcGF1c2VXb3JrZmxvd0luc3RhbmNlCisgICAqIChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHBhdXNlV29ya2Zsb3dJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dFbmdpbmUjcmVzdW1lV29ya2Zsb3dJbnN0YW5jZQorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZXN1bWVXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNnZXRJbnN0YW5jZVJlcG9zaXRvcnkoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBnZXRJbnN0YW5jZVJlcG9zaXRvcnkoKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbzsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dFbmdpbmUjdXBkYXRlTWV0YWRhdGEoamF2YS4KKyAgICogbGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gdXBkYXRlTWV0YWRhdGEoU3RyaW5nIHdvcmtmbG93SW5zdElkLCBNZXRhZGF0YSBtZXQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNzZXRXb3JrZmxvd01hbmFnZXJVcmwKKyAgICogKGphdmEubmV0LlVSTCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRXb3JrZmxvd01hbmFnZXJVcmwoVVJMIHVybCkgeworICAgIHRoaXMud21nclVybCA9IHVybDsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNnZXRXYWxsQ2xvY2tNaW51dGVzKAorICAgKiBqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBkb3VibGUgZ2V0V2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLldvcmtmbG93RW5naW5lIworICAgKiBnZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgZG91YmxlIGdldEN1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLldvcmtmbG93RW5naW5lI2dldFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YQorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTWV0YWRhdGEgZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcGVyc2lzdChXb3JrZmxvd0luc3RhbmNlIGluc3QpIHRocm93cyBFbmdpbmVFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBpZiAoaW5zdC5nZXRJZCgpID09IG51bGwKKyAgICAgICAgICB8fCAoaW5zdC5nZXRJZCgpICE9IG51bGwgJiYgaW5zdC5nZXRJZCgpLmVxdWFscygiIikpKSB7CisgICAgICAgIC8vIHdlIGhhdmUgdG8gcGVyc2lzdCBpdCBieSBhZGRpbmcgaXQKKyAgICAgICAgLy8gcmF0aGVyIHRoYW4gdXBkYXRpbmcgaXQKKyAgICAgICAgcmVwby5hZGRXb3JrZmxvd0luc3RhbmNlKGluc3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcGVyc2lzdCBieSB1cGRhdGUKKyAgICAgICAgcmVwby51cGRhdGVXb3JrZmxvd0luc3RhbmNlKGluc3QpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgdGhyb3cgbmV3IEVuZ2luZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0xpZmVjeWNsZSBnZXRMaWZlY3ljbGVGb3JXb3JrZmxvdyhXb3JrZmxvdyB3b3JrZmxvdykgeworICAgIHJldHVybiBsaWZlY3ljbGUuZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3cod29ya2Zsb3cpICE9IG51bGwgPyBsaWZlY3ljbGUKKyAgICAgICAgLmdldExpZmVjeWNsZUZvcldvcmtmbG93KHdvcmtmbG93KSA6IGxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1ByaW9yaXRpemVkUXVldWVCYXNlZFdvcmtmbG93RW5naW5lRmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1ByaW9yaXRpemVkUXVldWVCYXNlZFdvcmtmbG93RW5naW5lRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjU3MjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvUHJpb3JpdGl6ZWRRdWV1ZUJhc2VkV29ya2Zsb3dFbmdpbmVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lci5FbmdpbmVSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHlTb3J0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3Rvcnk7CisKKy8qKgorICogCisgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgUHJpb3JpdGl6ZWRRdWV1ZUJhc2VkV29ya2Zsb3dFbmdpbmV9LAorICogYmFzZWQgb24gaXRzIGNvbnN0aXR1ZW50IGluc3RhbmNlIHJlcG9zaXRvcnksIHdvcmtmbG93IHRhc2sgcHJpb3JpdGl6ZXIsCisgKiB3b3JrZmxvdyBsaWZlY3ljbGUsIGFuZCBlbmdpbmUgcnVubmVyLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFByaW9yaXRpemVkUXVldWVCYXNlZFdvcmtmbG93RW5naW5lRmFjdG9yeSBpbXBsZW1lbnRzCisgICAgV29ya2Zsb3dFbmdpbmVGYWN0b3J5IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfUkVQT19GQUNUT1JZX1BST1BFUlRZID0gIndvcmtmbG93LnJlcG8uZmFjdG9yeSI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTkNFX1JFUE9fRkFDVE9SWV9QUk9QRVJUWSA9ICJ3b3JrZmxvdy5lbmdpbmUuaW5zdGFuY2VSZXAuZmFjdG9yeSI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRJWkVSX0NMQVNTX1BST1BFUlRZID0gIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2VuZ2luZS5wcmlvcml0aXplciI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJRkVDWUNMRVNfRklMRV9QQVRIX1BST1BFUlRZID0gIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLmZpbGVQYXRoIjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5HSU5FX1JVTk5FUl9DTEFTUyA9ICJ3b3JrZmxvdy53ZW5naW5lLnJ1bm5lci5mYWN0b3J5IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FJVF9TRUNTX1BST1BFUlRZID0gIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cud2VuZ2luZS50YXNrcXVlcmllci53YWl0U2Vjb25kcyI7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZUZhY3RvcnkjY3JlYXRlV29ya2Zsb3dFbmdpbmUKKyAgICogKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgV29ya2Zsb3dFbmdpbmUgY3JlYXRlV29ya2Zsb3dFbmdpbmUoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgUHJpb3JpdGl6ZWRRdWV1ZUJhc2VkV29ya2Zsb3dFbmdpbmUoCisgICAgICAgICAgZ2V0V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoKSwgZ2V0UHJpb3JpdGl6ZXIoKSwKKyAgICAgICAgICBnZXRXb3JrZmxvd0xpZmVjeWNsZSgpLCBnZXRFbmdpbmVSdW5uZXIoKSwgZ2V0TW9kZWxSZXBvc2l0b3J5KCksCisgICAgICAgICAgZ2V0V2FpdFNlY29uZHMoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgV29ya2Zsb3dSZXBvc2l0b3J5IGdldE1vZGVsUmVwb3NpdG9yeSgpIHsKKyAgICByZXR1cm4gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorICAgICAgICAuZ2V0V29ya2Zsb3dSZXBvc2l0b3J5RnJvbUNsYXNzTmFtZShTeXN0ZW0KKyAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShNT0RFTF9SRVBPX0ZBQ1RPUllfUFJPUEVSVFkpKTsKKyAgfQorCisgIHByb3RlY3RlZCBsb25nIGdldFdhaXRTZWNvbmRzKCkgeworICAgIHJldHVybiBMb25nLmdldExvbmcoV0FJVF9TRUNTX1BST1BFUlRZLCAyKTsKKyAgfQorCisgIHByb3RlY3RlZCBFbmdpbmVSdW5uZXIgZ2V0RW5naW5lUnVubmVyKCkgeworICAgIHJldHVybiBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmdldEVuZ2luZVJ1bm5lckZyb21DbGFzc05hbWUoU3lzdGVtCisgICAgICAgIC5nZXRQcm9wZXJ0eShFTkdJTkVfUlVOTkVSX0NMQVNTKSk7CisgIH0KKworICBwcm90ZWN0ZWQgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGdldFdvcmtmbG93TGlmZWN5Y2xlKCkKKyAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcihQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgLmdldFByb3BlcnR5KExJRkVDWUNMRVNfRklMRV9QQVRIX1BST1BFUlRZKSkpOworICB9CisKKyAgcHJvdGVjdGVkIFByaW9yaXR5U29ydGVyIGdldFByaW9yaXRpemVyKCkgeworICAgIHJldHVybiBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmdldFByaW9yaXR5U29ydGVyRnJvbUNsYXNzTmFtZShTeXN0ZW0KKyAgICAgICAgLmdldFByb3BlcnR5KFBSSU9SSVRJWkVSX0NMQVNTX1BST1BFUlRZKSk7CisKKyAgfQorCisgIHByb3RlY3RlZCBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBnZXRXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSgpIHsKKyAgICByZXR1cm4gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorICAgICAgICAuZ2V0V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGcm9tQ2xhc3NOYW1lKFN5c3RlbQorICAgICAgICAgICAgLmdldFByb3BlcnR5KElOU1RBTkNFX1JFUE9fRkFDVE9SWV9QUk9QRVJUWSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UYXNrUXVlcmllci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1Rhc2tRdWVyaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0NWI4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UYXNrUXVlcmllci5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuVGFza1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuV29ya2Zsb3dQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29ySGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvclF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dMaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHlTb3J0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIAorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBjb25zdGFudGx5IHBvcCBvZmYgdGFza3MgdGhhdCBhcmUgcnVuIHRvIHJ1bgorICogYW5kIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZX0sIGFuZCB0aGVuIHRvIHNldAorICogdGhlaXIgc3RhdGUgdG8gRXhlY3V0aW5nIChydW5uaW5nIENhdGVnb3J5KSwgc28gdGhleSB3aWxsIGJlIHBpY2tlZCB1cCBvbiB0aGUKKyAqIG5leHQgV29ya2Zsb3dTdGF0ZSBjaGFuZ2UsIGFuZCBlbmQgdXAgZXhlY3V0aW5nLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGFza1F1ZXJpZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgcHJpdmF0ZSBib29sZWFuIHJ1bm5pbmc7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Byb2Nlc3NvclF1ZXVlIHByb2Nlc3NvclF1ZXVlOworCisgIHByaXZhdGUgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gcnVubmFibGVQcm9jZXNzb3JzOworCisgIHByaXZhdGUgUHJpb3JpdHlTb3J0ZXIgcHJpb3JpdGl6ZXI7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSByZXBvOworICAKKyAgcHJpdmF0ZSBsb25nIHdhaXRTZWNvbmRzOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRhc2tRdWVyaWVyLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBUYXNrUXVlcmllciB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZX0sCisgICAqIGFuZCB3aXRoIHRoZSBhc3NvY2lhdGVkIHtAbGluayBQcmlvcml0eVNvcnRlcn0gd2hpY2ggYWN0cyBhcyBhIHNvcnRlciBvZgorICAgKiB0aGUgcnVubmFibGUge0BsaW5rIFdvcmtmbG93UHJvY2Vzc29yfXMuCisgICAqIAorICAgKiBAcGFyYW0gcHJvY2Vzc29yUXVldWUKKyAgICogICAgICAgICAgVGhlIGFzc29jaWF0ZWQgc2V0IG9mIHF1ZXVlZCBXb3JrZmxvdyBUYXNrcy4KKyAgICogQHBhcmFtIHByaW9yaXRpemVyCisgICAqICAgICAgICAgIFRoZSBwcmlvcml0aXplciB0byB1c2UgdG8gc29ydCB0aGUgcmVhZHktdG8tcnVuIFdvcmtmbG93IFRhc2tzLgorICAgKiAKKyAgICogQHBhcmFtIHJlcG8KKyAgICogICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeX0gdG8gc2F2ZSB0aGUgc3RhdGUgb2YKKyAgICogICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZXMuCisgICAqICAgICAgICAgIAorICAgKiBAcGFyYW0gd2FpdFNlY29uZHMgVGhlIGRlZmF1bHQgYW1vdW50IG9mIHNlY29uZHMgdG8gd2FpdCB3aGlsZSBkaXNwb3NpdGlvbmluZworICAgKiAgICAgICAgcHJvY2Vzc29ycworICAgKi8KKyAgcHVibGljIFRhc2tRdWVyaWVyKFdvcmtmbG93UHJvY2Vzc29yUXVldWUgcHJvY2Vzc29yUXVldWUsCisgICAgICBQcmlvcml0eVNvcnRlciBwcmlvcml0aXplciwgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgcmVwbywgbG9uZyB3YWl0U2Vjb25kcykgeworICAgIHRoaXMucnVubmluZyA9IHRydWU7CisgICAgdGhpcy5wcm9jZXNzb3JRdWV1ZSA9IHByb2Nlc3NvclF1ZXVlOworICAgIHRoaXMucnVubmFibGVQcm9jZXNzb3JzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgICB0aGlzLnByaW9yaXRpemVyID0gcHJpb3JpdGl6ZXI7CisgICAgdGhpcy5yZXBvID0gcmVwbzsKKyAgICB0aGlzLndhaXRTZWNvbmRzID0gd2FpdFNlY29uZHM7CisgIH0KKworICAvKioKKyAgICogTWFyY2hlcyB0aHJvdWdoIHRoZSBzZXQgb2YgcHJvY2Vzc29ycyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdGhlIFByb2Nlc3NvcgorICAgKiBxdWV1ZSwgY2hlY2tzIHRvIHNlZSBpZiB0aGV5IGFyZSBOT1QgaW4gdGhlIGRvbmUgc3RhdGUsIG9yIGlmIHRoZXkgYXJlCisgICAqIGN1cnJlbnRseSBpbiB0aGUgaG9sZGluZyBzdGF0ZS4gSWYgZWl0aGVyIG9mIHRob3NlIGFyZSB0cnVlLCB0aGUgcHJvY2Vzc29yCisgICAqIGlzIHBvcHBlZCBvZmYgdGhlIHF1ZXVlLCBhbmQgdGhlbiBhZGRlZCB0byB0aGUgcnVubmFibGVQcm9jZXNzb3JzIGxpc3QgKGluCisgICAqIGEgc3luY2hyb25pemVkIGZhc2hpb24pLCBhbmQgdGhlbiB0aGVpciBzdGF0ZSBpcyBzZXQgdG8gRXhlY3V0aW5nCisgICAqIChjYXRlZ29yeSwgcnVubmluZykuCisgICAqIAorICAgKiBGaW5hbGx5IHRoZSBydW5uYWJsZVByb2Nlc3NvcnMgbGlzdCBpcyBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgorICAgKiB7QGxpbmsgI3ByaW9yaXRpemVyfS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBMT0cubG9nKExldmVsLkZJTkUsICJUYXNrUXVlcmllciBjb25maWd1cmVkIHdpdGggd2FpdCBzZWNvbmRzOiBbIit0aGlzLndhaXRTZWNvbmRzKyJdIik7CisgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IHByb2Nlc3NvcnMgPSBwcm9jZXNzb3JRdWV1ZS5nZXRQcm9jZXNzb3JzKCk7CisgICAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBwcm9jZXNzb3JzVG9SdW4gPSBuZXcgVmVjdG9yPFdvcmtmbG93UHJvY2Vzc29yPigpOworCisgICAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHByb2Nlc3NvciA6IHByb2Nlc3NvcnMpIHsKKyAgICAgICAgLy8gT0sgbm93IGdldCBpdHMgbGlmZWN5Y2xlCisgICAgICAgIFdvcmtmbG93UHJvY2Vzc29ySGVscGVyIGhlbHBlciA9IG5ldyBXb3JrZmxvd1Byb2Nlc3NvckhlbHBlcigKKyAgICAgICAgICAgIHByb2Nlc3Nvci5nZXRMaWZlY3ljbGVNYW5hZ2VyKCkpOworICAgICAgICBXb3JrZmxvd0xpZmVjeWNsZSBsaWZlY3ljbGUgPSBoZWxwZXIKKyAgICAgICAgICAgIC5nZXRMaWZlY3ljbGVGb3JQcm9jZXNzb3IocHJvY2Vzc29yKTsKKworICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJUYXNrUXVlcmllcjogZGlzcG9zaXRpb25pbmcgcHJvY2Vzc29yIHdpdGggaWQ6IFsiCisgICAgICAgICAgICArIHByb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0SWQoKSArICJdOiBzdGF0ZTogIgorICAgICAgICAgICAgKyBwcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFN0YXRlKCkpOworCisgICAgICAgIGlmICghcHJvY2Vzc29yLmlzQW55Q2F0ZWdvcnkoImRvbmUiLCAiaG9sZGluZyIpCisgICAgICAgICAgICAmJiAhcHJvY2Vzc29yLmlzQW55U3RhdGUoIkV4ZWN1dGluZyIpCisgICAgICAgICAgICAmJiBwcm9jZXNzb3IuZ2V0UnVubmFibGVXb3JrZmxvd1Byb2Nlc3NvcnMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgZm9yIChUYXNrUHJvY2Vzc29yIHRwIDogcHJvY2Vzc29yLmdldFJ1bm5hYmxlV29ya2Zsb3dQcm9jZXNzb3JzKCkpIHsKKyAgICAgICAgICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSBsaWZlY3ljbGUuY3JlYXRlU3RhdGUoIldhaXRpbmdPblJlc291cmNlcyIsCisgICAgICAgICAgICAgICAgIndhaXRpbmciLCAiQWRkZWQgdG8gUnVubmFibGUgcXVldWUiKTsKKyAgICAgICAgICAgIHRwLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICBwZXJzaXN0KHRwLmdldFdvcmtmbG93SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJBZGRlZCBwcm9jZXNzb3Igd2l0aCBwcmlvcml0eTogWyIKKyAgICAgICAgICAgICAgICArIHRwLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpICsgIl0iKTsKKyAgICAgICAgICAgIHByb2Nlc3NvcnNUb1J1bi5hZGQodHApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwcm9jZXNzb3JzVG9SdW4gIT0gbnVsbCAmJiBwcm9jZXNzb3JzVG9SdW4uc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgcHJpb3JpdGl6ZXIuc29ydChwcm9jZXNzb3JzVG9SdW4pOworICAgICAgICAgIH0KKworICAgICAgICAgIHN5bmNocm9uaXplZCAocnVubmFibGVQcm9jZXNzb3JzKSB7CisgICAgICAgICAgICBpZiAocnVubmluZykKKyAgICAgICAgICAgICAgcnVubmFibGVQcm9jZXNzb3JzID0gcHJvY2Vzc29yc1RvUnVuOworICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIHNpbXBseSBjYWxsIG5leHRTdGF0ZSBhbmQgcGVyc2lzdCBpdAorICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlByb2Nlc3NvciBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgICAgICsgcHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRJZCgpCisgICAgICAgICAgICAgICsgIl0gbm90IHJlYWR5IHRvIEV4ZWN1dGUgb3IgYWxyZWFkeSBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgKyAiYWR2YW5jaW5nIGl0IHRvIG5leHQgc3RhdGUuIik7CisgICAgICAgICAgcHJvY2Vzc29yLm5leHRTdGF0ZSgpOworICAgICAgICAgIHBlcnNpc3QocHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgdHJ5eworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKHdhaXRTZWNvbmRzKjEwMDApOworICAgICAgfQorICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKXt9CisgICAgICAKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcnVubmluZworICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworICAgIHJldHVybiBydW5uaW5nOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBydW5uaW5nCisgICAqICAgICAgICAgIHRoZSBydW5uaW5nIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UnVubmluZyhib29sZWFuIHJ1bm5pbmcpIHsKKyAgICB0aGlzLnJ1bm5pbmcgPSBydW5uaW5nOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHJ1bm5hYmxlUHJvY2Vzc29ycworICAgKi8KKyAgcHVibGljIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IGdldFJ1bm5hYmxlUHJvY2Vzc29ycygpIHsKKyAgICByZXR1cm4gcnVubmFibGVQcm9jZXNzb3JzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIHtAbGluayBUYXNrUHJvY2Vzc29yfSBmcm9tIHRoZSB7QGxpbmsgTGlzdH0gb2YKKyAgICoge0BsaW5rICNydW5uYWJsZVByb2Nlc3NvcnN9LiBSZW1vdmVzIHRoYXQge0BsaW5rIFRhc2tQcm9jZXNzb3J9IGZyb20gdGhlCisgICAqIGFjdHVhbCB7QGxpbmsgI3J1bm5hYmxlUHJvY2Vzc29yc30ge0BsaW5rIExpc3R9LgorICAgKiAKKyAgICogQHJldHVybiBUaGUgbmV4dCBhdmFpbGFibGUge0BsaW5rIFRhc2tQcm9jZXNzb3J9IGZyb20gdGhlIHtAbGluayBMaXN0fSBvZgorICAgKiAgICAgICAgIHtAbGluayAjcnVubmFibGVQcm9jZXNzb3JzfS4KKyAgICovCisgIHB1YmxpYyBUYXNrUHJvY2Vzc29yIGdldE5leHQoKSB7CisgICAgaWYgKGdldFJ1bm5hYmxlUHJvY2Vzc29ycygpLnNpemUoKSA9PSAwKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIChUYXNrUHJvY2Vzc29yKSBnZXRSdW5uYWJsZVByb2Nlc3NvcnMoKS5yZW1vdmUoMCk7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHBlcnNpc3QoV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSkgeworICAgIGlmICh0aGlzLnJlcG8gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGluc3RhbmNlLmdldElkKCkgPT0gbnVsbAorICAgICAgICAgICAgfHwgKGluc3RhbmNlLmdldElkKCkgIT0gbnVsbCAmJiBpbnN0YW5jZS5nZXRJZCgpLmVxdWFscygiIikpKSB7CisgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwZXJzaXN0IGl0IGJ5IGFkZGluZyBpdAorICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHVwZGF0aW5nIGl0CisgICAgICAgICAgcmVwby5hZGRXb3JrZmxvd0luc3RhbmNlKGluc3RhbmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBwZXJzaXN0IGJ5IHVwZGF0ZQorICAgICAgICAgIHJlcG8udXBkYXRlV29ya2Zsb3dJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byB1cGRhdGUgd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgICArIGluc3RhbmNlLmdldElkKCkgKyAiXSBzdGF0dXMgdG8gWyIgKyBpbnN0YW5jZS5nZXRTdGF0ZSgpLmdldE5hbWUoKQorICAgICAgICAgICAgKyAiXS4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1Rhc2tSdW5uZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UYXNrUnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1Y2ViZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UYXNrUnVubmVyLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuVGFza1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXIuRW5naW5lUnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5QYXJlbnRDaGlsZFdvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CisKKy8qKgorICogCisgKiBJbXBsZW1lbnRzIHRoZSBUYXNrUnVubmVyIGZyYW1ld29yay4gQWN0cyBhcyBhIHRocmVhZCB0aGF0IHdvcmtzIHdpdGggdGhlCisgKiBUYXNrUXVlcmllciB0byB0YWtlIHRoZSBuZXh0IHNvcnRlZCAoYWthIG9uZXMgdGhhdCBoYXZlIGJlZW4gc29ydGVkIHdpdGggdGhlCisgKiBXb3JrZmxvdyBQcmlvcml0eVNvcnRlcikgdGFzayBhbmQgdGhlbiBsZXZlcmFnZSB0aGUgRW5naW5lJ3MgUnVubmVyIHRvCisgKiBleGVjdXRlIHRoZSB0YXNrLgorICogCisgKiBUaGUgVGFza1J1bm5lciB0aHJlYWQgZmlyc3QgcG9wcyBhIHRhc2sgb2ZmIHRoZSBsaXN0IHVzaW5nCisgKiB7QGxpbmsgVGFza1F1ZXJpZXIjZ2V0TmV4dCgpfSBhbmQgdGhlbiBzbyBsb25nIGFzIHRoZSB0aHJlYWQncworICoge0BsaW5rICNydW5uZXJ9IGhhcyBvcGVuIHNsb3RzIGFzIHJldHVybmVkIGJ5CisgKiB7QGxpbmsgRW5naW5lUnVubmVyI2hhc09wZW5TbG90cyhXb3JrZmxvd1Rhc2spfSwgYW5kIHtAbGluayAjaXNQYXVzZSgpfSBpcworICogZmFsc2UgYW5kIHtAbGluayAjaXNSdW5uaW5nKCl9IGlzIHRydWUsIHRoZW4gdGhlIHRhc2sgaXMgaGFuZGVkIG9mZiB0byB0aGUKKyAqIHJ1bm5lciBmb3IgZXhlY3V0aW9uLgorICogCisgKiBUaGUgVGFza1J1bm5lciB0aHJlYWQgY2FuIGJlIHBhdXNlZCBkdXJpbmcgd2hpY2ggdGltZSBpdCB3YWl0cworICoge0BsaW5rICN3YWl0U2Vjb25kc30gc2Vjb25kcywgd2FrZXMgdXAgdG8gc2VlIGlmIGl0J3MgdW5wYXVzZWQsIGFuZCB0aGVuIGdvZXMKKyAqIGJhY2sgdG8gc2xlZXAgaWYgbm90LCBvdGhlcndpc2UsIHJlc3VtZXMgZXhlY3V0aW5nIGlmIGl0IHdhcyB1bnBhdXNlZC4KKyAqIAorICogQHNpbmNlIEFwYWNoZSBPT0RUIDAuNQorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCisvLyBUT0RPKGJmb3N0ZXIpOiBSZW5hbWUuLi4gUnVubmVyIGlzIG1pc3NsZWFkaW5nLgorcHVibGljIGNsYXNzIFRhc2tSdW5uZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgcHJpdmF0ZSBib29sZWFuIHJ1bm5pbmc7CisKKyAgcHJpdmF0ZSBmaW5hbCBUYXNrUXVlcmllciB0YXNrUXVlcmllcjsKKworICBwcml2YXRlIGZpbmFsIEVuZ2luZVJ1bm5lciBydW5uZXI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihUYXNrUnVubmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIFRhc2tSdW5uZXIoVGFza1F1ZXJpZXIgdGFza1F1ZXJpZXIsIEVuZ2luZVJ1bm5lciBydW5uZXIpIHsKKyAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOworICAgIHRoaXMudGFza1F1ZXJpZXIgPSB0YXNrUXVlcmllcjsKKyAgICB0aGlzLnJ1bm5lciA9IHJ1bm5lcjsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIFRhc2tQcm9jZXNzb3IgbmV4dFRhc2tQcm9jZXNzb3IgPSBudWxsOworCisgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgIG5leHRUYXNrUHJvY2Vzc29yID0gdGFza1F1ZXJpZXIuZ2V0TmV4dCgpOworCisgICAgICB0cnkgeworICAgICAgICBpZiAobmV4dFRhc2tQcm9jZXNzb3IgIT0gbnVsbCAmJiBydW5uZXIuaGFzT3BlblNsb3RzKG5leHRUYXNrUHJvY2Vzc29yKSkgeworICAgICAgICAgIHJ1bm5lci5leGVjdXRlKG5leHRUYXNrUHJvY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJFbmdpbmUgZmFpbGVkIHdoaWxlIHN1Ym1pdHRpbmcgam9icyB0byBpdHMgcnVubmVyIDogIgorICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICBpZiAobmV4dFRhc2tQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgIHRoaXMuZmxhZ1Byb2Nlc3NvckFzRmFpbGVkKG5leHRUYXNrUHJvY2Vzc29yLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBydW5uaW5nCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgcmV0dXJuIHJ1bm5pbmc7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHJ1bm5pbmcKKyAgICogICAgICAgICAgdGhlIHJ1bm5pbmcgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSdW5uaW5nKGJvb2xlYW4gcnVubmluZykgeworICAgIHRoaXMucnVubmluZyA9IHJ1bm5pbmc7CisgIH0KKworICBwcm90ZWN0ZWQgV29ya2Zsb3dUYXNrIGV4dHJhY3RUYXNrRnJvbVByb2Nlc3NvcihUYXNrUHJvY2Vzc29yIHRhc2tQcm9jZXNzb3IpIHsKKyAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSB0YXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICBQYXJlbnRDaGlsZFdvcmtmbG93IHdvcmtmbG93ID0gaW5zdC5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCk7CisgICAgU3RyaW5nIHRhc2tJZCA9IGluc3QuZ2V0Q3VycmVudFRhc2tJZCgpOworICAgIGZvciAoV29ya2Zsb3dUYXNrIHRhc2sgOiB3b3JrZmxvdy5nZXRUYXNrcygpKSB7CisgICAgICBpZiAodGFzay5nZXRUYXNrSWQoKS5lcXVhbHModGFza0lkKSkgeworICAgICAgICByZXR1cm4gdGFzazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBmbGFnUHJvY2Vzc29yQXNGYWlsZWQoVGFza1Byb2Nlc3NvciBuZXh0VGFza1Byb2Nlc3NvciwgU3RyaW5nIG1zZykgeworICAgIG5leHRUYXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTdGF0ZShuZXh0VGFza1Byb2Nlc3NvcgorICAgICAgICAuZ2V0TGlmZWN5Y2xlTWFuYWdlcigpCisgICAgICAgIC5nZXREZWZhdWx0TGlmZWN5Y2xlKCkKKyAgICAgICAgLmNyZWF0ZVN0YXRlKCJGYWlsdXJlIiwgImRvbmUiLAorICAgICAgICAgICAgIkZhaWxlZCB3aGlsZSBzdWJtaXR0aW5nIGpvYiB0byBSdW5uZXIgOiAiICsgbXNnKSk7CisgICAgLy9UT0RPOiBwZXJzaXN0IG1lPworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1RocmVhZFBvb2xXb3JrZmxvd0VuZ2luZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1RocmVhZFBvb2xXb3JrZmxvd0VuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzI4NTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLmphdmEKQEAgLTAsMCArMSw0NzQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLlhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93U3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuRW5naW5lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLkluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5JdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRGF0ZUNvbnZlcnQ7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9qYXZhLnV0aWwuY29uY3VycmVudCBpbXBvcnRzCitpbXBvcnQgRURVLm9zd2Vnby5jcy5kbC51dGlsLmNvbmN1cnJlbnQuQm91bmRlZEJ1ZmZlcjsKK2ltcG9ydCBFRFUub3N3ZWdvLmNzLmRsLnV0aWwuY29uY3VycmVudC5DaGFubmVsOworaW1wb3J0IEVEVS5vc3dlZ28uY3MuZGwudXRpbC5jb25jdXJyZW50LkxpbmtlZFF1ZXVlOworaW1wb3J0IEVEVS5vc3dlZ28uY3MuZGwudXRpbC5jb25jdXJyZW50LlBvb2xlZEV4ZWN1dG9yOworCisvKioKKyAqIAorICogVGhlIFRocmVhZFBvb2xpbmcgcG9ydGlvbiBvZiB0aGUgV29ya2Zsb3dFbmdpbmUuIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgYW4KKyAqIGV4dGVuc2lvbiBwb2ludCBmb3IgV29ya2Zsb3dFbmdpbmVzIHRoYXQgd2FudCB0byBpbXBsZW1lbnQgVGhyZWFkUG9vbGluZy4KKyAqIFRoaXMgV29ya2Zsb3dFbmdpbmUgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gbWFuYWdlIGEgVGhyZWFkUG9vbCB1c2luZworICogRG91ZyBMZWEncyB3b25kZXJmdWwgamF2YS51dGlsLmNvbmN1cnJlbnQgcGFja2FnZSB0aGF0IG1hZGUgaXQgaW50byBKREs1LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2c2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lIGltcGxlbWVudHMgV29ya2Zsb3dFbmdpbmUsIFdvcmtmbG93U3RhdHVzIHsKKworICAvKiBvdXIgdGhyZWFkIHBvb2wgKi8KKyAgcHJpdmF0ZSBQb29sZWRFeGVjdXRvciBwb29sID0gbnVsbDsKKworICAvKiBvdXIgd29ya2VyIHRocmVhZCBoYXNoIG1hcHBpbmcgd29ya2VyIHRocmVhZHMgdG8gd29ya2Zsb3cgaW5zdGFuY2UgaWRzICovCisgIHByaXZhdGUgSGFzaE1hcCB3b3JrZXJNYXAgPSBudWxsOworCisgIC8qIG91ciBsb2cgc3RyZWFtICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgLyogb3VyIGluc3RhbmNlIHJlcG9zaXRvcnkgKi8KKyAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBpbnN0UmVwID0gbnVsbDsKKworICAvKiBvdXIgcmVzb3VyY2UgbWFuYWdlciBjbGllbnQgKi8KKyAgcHJpdmF0ZSBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgckNsaWVudCA9IG51bGw7CisKKyAgLyogdGhlIFVSTCBwb2ludGVyIHRvIHRoZSBwYXJlbnQgV29ya2Zsb3cgTWFuYWdlciAqLworICBwcml2YXRlIFVSTCB3bWdyVXJsID0gbnVsbDsKKworICAvKioKKyAgICogRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICogCisgICAqIEBwYXJhbSBpbnN0UmVwCisgICAqICAgICAgICAgIFRoZSBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSB0byBiZSB1c2VkIGJ5IHRoaXMgZW5naW5lLgorICAgKiBAcGFyYW0gcXVldWVTaXplCisgICAqICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBxdWV1ZSB0aGF0IHRoZSB3b3JrZmxvdyBlbmdpbmUgc2hvdWxkIHVzZQorICAgKiAgICAgICAgICAoaXJyZWxldmFudCBpZiB1bmxpbWl0ZWRRdWV1ZSBpcyBzZXQgdG8gdHJ1ZSkKKyAgICogQHBhcmFtIG1heFBvb2xTaXplCisgICAqICAgICAgICAgIFRoZSBtaW5pbXVtIHRocmVhZCBwb29sIHNpemUuCisgICAqIEBwYXJhbSBtaW5Qb29sU2l6ZQorICAgKiAgICAgICAgICBUaGUgbWF4aW11bSB0aHJlYWQgcG9vbCBzaXplLgorICAgKiBAcGFyYW0gdGhyZWFkS2VlcEFsaXZlVGltZQorICAgKiAgICAgICAgICBUaGUgYW1vdW50IG9mIG1pbnV0ZXMgdGhhdCBlYWNoIHRocmVhZCBpbiB0aGUgcG9vbCBzaG91bGQgYmUga2VwdAorICAgKiAgICAgICAgICBhbGl2ZS4KKyAgICogQHBhcmFtIHVubGltaXRlZFF1ZXVlCisgICAqICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIHF1ZXVlIHdob3NlIGJvdW5kcyBhcmUgZGljdGF0ZWQgYnkgdGhlCisgICAqICAgICAgICAgIHBoeXNpY2FsIG1lbW9yeSBvZiB0aGUgdW5kZXJseWluZyBoYXJkd2FyZS4KKyAgICogQHBhcmFtIHJlc1VybAorICAgKiAgICAgICAgICBBIFVSTCBwb2ludGVyIHRvIGEgcmVzb3VyY2UgbWFuYWdlci4gSWYgdGhpcyBpcyBzZXQgVGFza3Mgd2lsbCBiZQorICAgKiAgICAgICAgICB3cmFwcGVkIGFzIFJlc291cmNlIE1hbmFnZXIge0BsaW5rIEpvYn1zIGFuZCBzZW50IHRocm91Z2ggdGhlCisgICAqICAgICAgICAgIFJlc291cmNlIE1hbmFnZXIuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzZXQsIGxvY2FsIGV4ZWN1dGlvbgorICAgKiAgICAgICAgICAodGhlIGRlZmF1bHQpIHdpbGwgYmUgdXNlZAorICAgKi8KKyAgcHVibGljIFRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZShXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBpbnN0UmVwLAorICAgICAgaW50IHF1ZXVlU2l6ZSwgaW50IG1heFBvb2xTaXplLCBpbnQgbWluUG9vbFNpemUsCisgICAgICBsb25nIHRocmVhZEtlZXBBbGl2ZVRpbWUsIGJvb2xlYW4gdW5saW1pdGVkUXVldWUsIFVSTCByZXNVcmwpIHsKKworICAgIHRoaXMuaW5zdFJlcCA9IGluc3RSZXA7CisgICAgQ2hhbm5lbCBjID0gbnVsbDsKKyAgICBpZiAodW5saW1pdGVkUXVldWUpIHsKKyAgICAgIGMgPSBuZXcgTGlua2VkUXVldWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgYyA9IG5ldyBCb3VuZGVkQnVmZmVyKHF1ZXVlU2l6ZSk7CisgICAgfQorCisgICAgcG9vbCA9IG5ldyBQb29sZWRFeGVjdXRvcihjLCBtYXhQb29sU2l6ZSk7CisgICAgcG9vbC5zZXRNaW5pbXVtUG9vbFNpemUobWluUG9vbFNpemUpOworICAgIHBvb2wuc2V0S2VlcEFsaXZlVGltZSgxMDAwICogNjAgKiB0aHJlYWRLZWVwQWxpdmVUaW1lKTsKKworICAgIHdvcmtlck1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBpZiAocmVzVXJsICE9IG51bGwpCisgICAgICByQ2xpZW50ID0gbmV3IFhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudChyZXNVcmwpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNwYXVzZVdvcmtmbG93SW5zdGFuY2UKKyAgICogKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcGF1c2VXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgIC8vIG9rYXksIHRyeSBhbmQgbG9vayB1cCB0aGF0IHdvcmtlciB0aHJlYWQgaW4gb3VyIGhhc2ggbWFwCisgICAgSXRlcmF0aXZlV29ya2Zsb3dQcm9jZXNzb3JUaHJlYWQgd29ya2VyID0gKEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkKSB3b3JrZXJNYXAKKyAgICAgICAgLmdldCh3b3JrZmxvd0luc3RJZCk7CisgICAgaWYgKHdvcmtlciA9PSBudWxsKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIldvcmtmbG93RW5naW5lOiBBdHRlbXB0IHRvIHBhdXNlIHdvcmtmbG93IGluc3RhbmNlIGlkOiAiCisgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0SWQKKyAgICAgICAgICAgICAgKyAiLCBob3dldmVyLCB0aGlzIGVuZ2luZSBpcyBub3QgdHJhY2tpbmcgaXRzIGV4ZWN1dGlvbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIG90aGVyd2lzZSwgYWxsIGdvb2QKKyAgICB3b3JrZXIucGF1c2UoKTsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNyZXN1bWVXb3JrZmxvd0luc3RhbmNlCisgICAqIChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc3VtZVdvcmtmbG93SW5zdGFuY2UoU3RyaW5nIHdvcmtmbG93SW5zdElkKSB7CisgICAgLy8gb2theSwgdHJ5IGFuZCBsb29rIHVwIHRoYXQgd29ya2VyIHRocmVhZCBpbiBvdXIgaGFzaCBtYXAKKyAgICBJdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZCB3b3JrZXIgPSAoSXRlcmF0aXZlV29ya2Zsb3dQcm9jZXNzb3JUaHJlYWQpIHdvcmtlck1hcAorICAgICAgICAuZ2V0KHdvcmtmbG93SW5zdElkKTsKKyAgICBpZiAod29ya2VyID09IG51bGwpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiV29ya2Zsb3dFbmdpbmU6IEF0dGVtcHQgdG8gcmVzdW1lIHdvcmtmbG93IGluc3RhbmNlIGlkOiAiCisgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0SWQgKyAiLCBob3dldmVyLCB0aGlzIGVuZ2luZSBpcyAiCisgICAgICAgICAgICAgICsgIm5vdCB0cmFja2luZyBpdHMgZXhlY3V0aW9uIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYWxzbyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgd29ya2VyIGlzIGN1cnJlbnRseSBwYXVzZWQKKyAgICAvLyBvbmx5IGNhbiByZXN1bWUgV29ya2Zsb3dJbnN0YW5jZXMgdGhhdCBhcmUgcGF1c2VkLCByaWdodD8KKyAgICBpZiAoIXdvcmtlci5pc1BhdXNlZCgpKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIldvcmtmbG93RW5naW5lOiBBdHRlbXB0IHRvIHJlc3VtZSBhIHdvcmtmbG93IHRoYXQgIgorICAgICAgICAgICAgICArICJpc24ndCBwYXVzZWQgY3VycmVudGx5OiBpbnN0YW5jZSBpZDogIiArIHdvcmtmbG93SW5zdElkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBva2F5LCBhbGwgZ29vZAorICAgIHdvcmtlci5yZXN1bWUoKTsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNzdGFydFdvcmtmbG93KG9yZy5hcGFjaGUKKyAgICogLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3csIG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIFdvcmtmbG93SW5zdGFuY2Ugc3RhcnRXb3JrZmxvdyhXb3JrZmxvdyB3b3JrZmxvdywKKyAgICAgIE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgRW5naW5lRXhjZXB0aW9uIHsKKyAgICAvLyB0byBzdGFydCB0aGUgd29ya2Zsb3csIHdlIGNyZWF0ZSBhIGRlZmF1bHQgd29ya2Zsb3cgaW5zdGFuY2UKKyAgICAvLyBwb3B1bGF0ZSBpdAorICAgIC8vIHBlcnNpc3QgaXQKKyAgICAvLyBhZGQgaXQgdG8gdGhlIHdvcmtlciBtYXAKKyAgICAvLyBzdGFydCBpdAorCisgICAgV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgd0luc3Quc2V0V29ya2Zsb3cod29ya2Zsb3cpOworICAgIHdJbnN0LnNldEN1cnJlbnRUYXNrSWQoKChXb3JrZmxvd1Rhc2spIHdvcmtmbG93LmdldFRhc2tzKCkuZ2V0KDApKQorICAgICAgICAuZ2V0VGFza0lkKCkpOworICAgIHdJbnN0LnNldFNoYXJlZENvbnRleHQobWV0YWRhdGEpOworICAgIHdJbnN0LnNldFN0YXR1cyhDUkVBVEVEKTsKKyAgICBwZXJzaXN0V29ya2Zsb3dJbnN0YW5jZSh3SW5zdCk7CisKKyAgICBJdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZCB3b3JrZXIgPSBuZXcgSXRlcmF0aXZlV29ya2Zsb3dQcm9jZXNzb3JUaHJlYWQoCisgICAgICAgIHdJbnN0LCBpbnN0UmVwLCB0aGlzLndtZ3JVcmwpOworICAgIHdvcmtlci5zZXRSQ2xpZW50KHJDbGllbnQpOworICAgIHdvcmtlck1hcC5wdXQod0luc3QuZ2V0SWQoKSwgd29ya2VyKTsKKworICAgIHdJbnN0LnNldFN0YXR1cyhRVUVVRUQpOworICAgIHBlcnNpc3RXb3JrZmxvd0luc3RhbmNlKHdJbnN0KTsKKworICAgIHRyeSB7CisgICAgICBwb29sLmV4ZWN1dGUod29ya2VyKTsKKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgRW5naW5lRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIHJldHVybiB3SW5zdDsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNnZXRJbnN0YW5jZVJlcG9zaXRvcnkoKQorICAgKi8KKyAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGdldEluc3RhbmNlUmVwb3NpdG9yeSgpIHsKKyAgICByZXR1cm4gdGhpcy5pbnN0UmVwOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSN1cGRhdGVNZXRhZGF0YShqYXZhLgorICAgKiBsYW5nLlN0cmluZywgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVNZXRhZGF0YShTdHJpbmcgd29ya2Zsb3dJbnN0SWQsIE1ldGFkYXRhIG1ldCkgeworICAgIC8vIG9rYXksIHRyeSBhbmQgbG9vayB1cCB0aGF0IHdvcmtlciB0aHJlYWQgaW4gb3VyIGhhc2ggbWFwCisgICAgSXRlcmF0aXZlV29ya2Zsb3dQcm9jZXNzb3JUaHJlYWQgd29ya2VyID0gKEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkKSB3b3JrZXJNYXAKKyAgICAgICAgLmdldCh3b3JrZmxvd0luc3RJZCk7CisgICAgaWYgKHdvcmtlciA9PSBudWxsKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIldvcmtmbG93RW5naW5lOiBBdHRlbXB0IHRvIHVwZGF0ZSBtZXRhZGF0YSBjb250ZXh0ICIKKyAgICAgICAgICAgICAgKyAiZm9yIHdvcmtmbG93IGluc3RhbmNlIGlkOiAiICsgd29ya2Zsb3dJbnN0SWQKKyAgICAgICAgICAgICAgKyAiLCBob3dldmVyLCB0aGlzIGVuZ2luZSBpcyAiICsgIm5vdCB0cmFja2luZyBpdHMgZXhlY3V0aW9uIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgd29ya2VyLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTaGFyZWRDb250ZXh0KG1ldCk7CisgICAgdHJ5IHsKKyAgICAgIHBlcnNpc3RXb3JrZmxvd0luc3RhbmNlKHdvcmtlci5nZXRXb3JrZmxvd0luc3RhbmNlKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKAorICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBwZXJzaXN0aW5nIHdvcmtmbG93IGluc3RhbmNlOiBbIgorICAgICAgICAgICAgICArIHdvcmtlci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0SWQoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNzZXRXb3JrZmxvd01hbmFnZXJVcmwKKyAgICogKGphdmEubmV0LlVSTCkKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFdvcmtmbG93TWFuYWdlclVybChVUkwgdXJsKSB7CisgICAgdGhpcy53bWdyVXJsID0gdXJsOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSNzdG9wV29ya2Zsb3coamF2YS5sYW5nCisgICAqIC5TdHJpbmcpCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcFdvcmtmbG93KFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgIC8vIG9rYXksIHRyeSBhbmQgbG9vayB1cCB0aGF0IHdvcmtlciB0aHJlYWQgaW4gb3VyIGhhc2ggbWFwCisgICAgSXRlcmF0aXZlV29ya2Zsb3dQcm9jZXNzb3JUaHJlYWQgd29ya2VyID0gKEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkKSB3b3JrZXJNYXAKKyAgICAgICAgLmdldCh3b3JrZmxvd0luc3RJZCk7CisgICAgaWYgKHdvcmtlciA9PSBudWxsKSB7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIldvcmtmbG93RW5naW5lOiBBdHRlbXB0IHRvIHN0b3Agd29ya2Zsb3cgaW5zdGFuY2UgaWQ6ICIKKyAgICAgICAgICAgICAgKyB3b3JrZmxvd0luc3RJZCArICIsIGhvd2V2ZXIsIHRoaXMgZW5naW5lIGlzICIKKyAgICAgICAgICAgICAgKyAibm90IHRyYWNraW5nIGl0cyBleGVjdXRpb24iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3b3JrZXIuc3RvcCgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZSMKKyAgICogZ2V0Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgZG91YmxlIGdldEN1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBnZXQgdGhlIHdvcmtmbG93IGluc3RhbmNlIHRoYXQgd2UncmUgdGFsa2luZyBhYm91dAorICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdCA9IHNhZmVHZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3b3JrZmxvd0luc3RJZCk7CisgICAgcmV0dXJuIGdldEN1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhpbnN0KTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dFbmdpbmUjZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhCisgICAqIChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhIGdldFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBva2F5LCB0cnkgYW5kIGxvb2sgdXAgdGhhdCB3b3JrZXIgdGhyZWFkIGluIG91ciBoYXNoIG1hcAorICAgIEl0ZXJhdGl2ZVdvcmtmbG93UHJvY2Vzc29yVGhyZWFkIHdvcmtlciA9IChJdGVyYXRpdmVXb3JrZmxvd1Byb2Nlc3NvclRocmVhZCkgd29ya2VyTWFwCisgICAgICAgIC5nZXQod29ya2Zsb3dJbnN0SWQpOworICAgIGlmICh3b3JrZXIgPT0gbnVsbCkgeworICAgICAgLy8gdHJ5IGFuZCBnZXQgdGhlIG1ldGFkYXRhCisgICAgICAvLyBmcm9tIHRoZSB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IChhcyBpdCB3YXMgcGVyc2lzdGVkKQorICAgICAgdHJ5IHsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gaW5zdFJlcC5nZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3b3JrZmxvd0luc3RJZCk7CisgICAgICAgIHJldHVybiBpbnN0LmdldFNoYXJlZENvbnRleHQoKTsKKyAgICAgIH0gY2F0Y2ggKEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiV29ya2Zsb3dFbmdpbmU6IEF0dGVtcHQgdG8gZ2V0IG1ldGFkYXRhICIKKyAgICAgICAgICAgICsgImZvciB3b3JrZmxvdyBpbnN0YW5jZSBpZDogIiArIHdvcmtmbG93SW5zdElkCisgICAgICAgICAgICArICIsIGhvd2V2ZXIsIHRoaXMgZW5naW5lIGlzICIKKyAgICAgICAgICAgICsgIm5vdCB0cmFja2luZyBpdHMgZXhlY3V0aW9uIGFuZCB0aGUgaWQ6IFsiICsgd29ya2Zsb3dJbnN0SWQKKyAgICAgICAgICAgICsgIl0gIiArICJ3YXMgbmV2ZXIgcGVyc2lzdGVkIHRvICIgKyAidGhlIGluc3RhbmNlIHJlcG9zaXRvcnkiKTsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRhZGF0YSgpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3b3JrZXIuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFNoYXJlZENvbnRleHQoKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dFbmdpbmUjZ2V0V2FsbENsb2NrTWludXRlcygKKyAgICogamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBkb3VibGUgZ2V0V2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAvLyBnZXQgdGhlIHdvcmtmbG93IGluc3RhbmNlIHRoYXQgd2UncmUgdGFsa2luZyBhYm91dAorICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdCA9IHNhZmVHZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3b3JrZmxvd0luc3RJZCk7CisgICAgcmV0dXJuIGdldFdhbGxDbG9ja01pbnV0ZXMoaW5zdCk7CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBnZXRXYWxsQ2xvY2tNaW51dGVzKFdvcmtmbG93SW5zdGFuY2UgaW5zdCkgeworICAgIGlmIChpbnN0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiAwLjA7CisgICAgfQorCisgICAgRGF0ZSBjdXJyZW50RGF0ZU9yU3RvcFRpbWUgPSAoaW5zdC5nZXRFbmREYXRlVGltZUlzb1N0cigpICE9IG51bGwKKyAgICAgICAgJiYgIWluc3QuZ2V0RW5kRGF0ZVRpbWVJc29TdHIoKS5lcXVhbHMoIiIpICYmICFpbnN0CisgICAgICAgIC5nZXRFbmREYXRlVGltZUlzb1N0cigpLmVxdWFscygibnVsbCIpKSA/IHNhZmVEYXRlQ29udmVydChpbnN0CisgICAgICAgIC5nZXRFbmREYXRlVGltZUlzb1N0cigpKSA6IG5ldyBEYXRlKCk7CisKKyAgICBEYXRlIHdvcmtmbG93U3RhcnREYXRlVGltZSA9IG51bGw7CisKKyAgICBpZiAoaW5zdC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkgPT0gbnVsbAorICAgICAgICB8fCAoaW5zdC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkgIT0gbnVsbCAmJiAoaW5zdAorICAgICAgICAgICAgLmdldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKS5lcXVhbHMoIiIpIHx8IGluc3QKKyAgICAgICAgICAgIC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkuZXF1YWxzKCJudWxsIikpKSkgeworICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgd29ya2Zsb3dTdGFydERhdGVUaW1lID0gRGF0ZUNvbnZlcnQuaXNvUGFyc2UoaW5zdAorICAgICAgICAgIC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkpOworICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiAwLjA7CisgICAgfQorCisgICAgbG9uZyBkaWZmTXMgPSBjdXJyZW50RGF0ZU9yU3RvcFRpbWUuZ2V0VGltZSgpCisgICAgICAgIC0gd29ya2Zsb3dTdGFydERhdGVUaW1lLmdldFRpbWUoKTsKKyAgICBkb3VibGUgZGlmZlNlY3MgPSAoZGlmZk1zICogMS4wIC8gMTAwMC4wKTsKKyAgICBkb3VibGUgZGlmZk1pbnMgPSBkaWZmU2VjcyAvIDYwLjA7CisgICAgcmV0dXJuIGRpZmZNaW5zOworCisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBnZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoV29ya2Zsb3dJbnN0YW5jZSBpbnN0KSB7CisgICAgaWYgKGluc3QgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgICBEYXRlIGN1cnJlbnREYXRlT3JTdG9wVGltZSA9IChpbnN0LmdldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoKSAhPSBudWxsCisgICAgICAgICYmICFpbnN0LmdldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoKS5lcXVhbHMoIiIpICYmICFpbnN0CisgICAgICAgIC5nZXRDdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyKCkuZXF1YWxzKCJudWxsIikpID8gc2FmZURhdGVDb252ZXJ0KGluc3QKKyAgICAgICAgLmdldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoKSkgOiBuZXcgRGF0ZSgpOworCisgICAgRGF0ZSB3b3JrZmxvd1Rhc2tTdGFydERhdGVUaW1lID0gbnVsbDsKKworICAgIGlmIChpbnN0LmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpID09IG51bGwKKyAgICAgICAgfHwgKGluc3QuZ2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKCkgIT0gbnVsbCAmJiAoaW5zdAorICAgICAgICAgICAgLmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpLmVxdWFscygiIikgfHwgaW5zdAorICAgICAgICAgICAgLmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpLmVxdWFscygibnVsbCIpKSkpIHsKKyAgICAgIHJldHVybiAwLjA7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHdvcmtmbG93VGFza1N0YXJ0RGF0ZVRpbWUgPSBEYXRlQ29udmVydC5pc29QYXJzZShpbnN0CisgICAgICAgICAgLmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpKTsKKyAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICAgIC8vIHNob3VsZCBuZXZlciBiZSBpbiB0aGlzIHN0YXRlLCBzbyByZXR1cm4gMAorICAgIGlmICh3b3JrZmxvd1Rhc2tTdGFydERhdGVUaW1lLmFmdGVyKGN1cnJlbnREYXRlT3JTdG9wVGltZSkpIHsKKyAgICAgIExPRy5sb2coCisgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiU3RhcnQgZGF0ZSB0aW1lOiBbIgorICAgICAgICAgICAgICArIERhdGVDb252ZXJ0Lmlzb0Zvcm1hdCh3b3JrZmxvd1Rhc2tTdGFydERhdGVUaW1lKQorICAgICAgICAgICAgICArICIgb2Ygd29ya2Zsb3cgaW5zdCBbIiArIGluc3QuZ2V0SWQoKSArICJdIGlzIEFGVEVSICIKKyAgICAgICAgICAgICAgKyAiRW5kIGRhdGUgdGltZTogWyIKKyAgICAgICAgICAgICAgKyBEYXRlQ29udmVydC5pc29Gb3JtYXQoY3VycmVudERhdGVPclN0b3BUaW1lKQorICAgICAgICAgICAgICArICJdIG9mIHdvcmtmbG93IGluc3QuIik7CisgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICAgIGxvbmcgZGlmZk1zID0gY3VycmVudERhdGVPclN0b3BUaW1lLmdldFRpbWUoKQorICAgICAgICAtIHdvcmtmbG93VGFza1N0YXJ0RGF0ZVRpbWUuZ2V0VGltZSgpOworICAgIGRvdWJsZSBkaWZmU2VjcyA9IChkaWZmTXMgKiAxLjAgLyAxMDAwLjApOworICAgIGRvdWJsZSBkaWZmTWlucyA9IGRpZmZTZWNzIC8gNjAuMDsKKyAgICByZXR1cm4gZGlmZk1pbnM7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHBlcnNpc3RXb3JrZmxvd0luc3RhbmNlKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpCisgICAgICB0aHJvd3MgRW5naW5lRXhjZXB0aW9uIHsKKworICAgIHRyeSB7CisgICAgICBpZiAod0luc3QuZ2V0SWQoKSA9PSBudWxsCisgICAgICAgICAgfHwgKHdJbnN0LmdldElkKCkgIT0gbnVsbCAmJiB3SW5zdC5nZXRJZCgpLmVxdWFscygiIikpKSB7CisgICAgICAgIC8vIHdlIGhhdmUgdG8gcGVyc2lzdCBpdCBieSBhZGRpbmcgaXQKKyAgICAgICAgLy8gcmF0aGVyIHRoYW4gdXBkYXRpbmcgaXQKKyAgICAgICAgaW5zdFJlcC5hZGRXb3JrZmxvd0luc3RhbmNlKHdJbnN0KTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcGVyc2lzdCBieSB1cGRhdGUKKyAgICAgICAgaW5zdFJlcC51cGRhdGVXb3JrZmxvd0luc3RhbmNlKHdJbnN0KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHRocm93IG5ldyBFbmdpbmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlIHNhZmVHZXRXb3JrZmxvd0luc3RhbmNlQnlJZChTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGluc3RSZXAuZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQod29ya2Zsb3dJbnN0SWQpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBEYXRlIHNhZmVEYXRlQ29udmVydChTdHJpbmcgaXNvVGltZVN0cikgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gRGF0ZUNvbnZlcnQuaXNvUGFyc2UoaXNvVGltZVN0cik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgaWdub3JlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lRmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1RocmVhZFBvb2xXb3JrZmxvd0VuZ2luZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E4YzUyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1RocmVhZFBvb2xXb3JrZmxvd0VuZ2luZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkJvb2xlYW4uZ2V0Qm9vbGVhbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIuZ2V0SW50ZWdlcjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkxvbmcuZ2V0TG9uZzsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3Rvcnk7CisKKy8qKgorICogQSBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyB7QGxpbmsgVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lfXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmVGYWN0b3J5IGltcGxlbWVudHMgV29ya2Zsb3dFbmdpbmVGYWN0b3J5IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKFRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFOQ0VfUkVQT19GQUNUT1JZX1BST1BFUlRZID0gIndvcmtmbG93LmVuZ2luZS5pbnN0YW5jZVJlcC5mYWN0b3J5IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVVFX1NJWkVfUFJPUEVSVFkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucXVldWVTaXplIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9QT09MX1NJWkVfUFJPUEVSVFkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUubWF4UG9vbFNpemUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX1BPT0xfU0laRV9QUk9QRVJUWSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5taW5Qb29sU2l6ZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJFQURfS0VFUF9BTElWRV9QUk9QRVJUWSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS50aHJlYWRLZWVwQWxpdmUubWludXRlcyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxJTUlURURfUVVFVUVfUFJPUEVSVFkgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUudW5saW1pdGVkUXVldWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTUdSX1VSTF9QUk9QRVJUWSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5yZXNvdXJjZW1nci51cmwiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1FVRVVFX1NJWkUgPSAxMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1BPT0xfU0laRSA9IDEwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NSU5fUE9PTF9TSVpFID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1RIUkVBRF9LRUVQX0FMSVZFX01JTlMgPSA1OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgV29ya2Zsb3dFbmdpbmUgY3JlYXRlV29ya2Zsb3dFbmdpbmUoKSB7CisgICAgcmV0dXJuIG5ldyBUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUoZ2V0V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoKSwKKyAgICAgICAgZ2V0UXVldWVTaXplKCksIGdldE1heFBvb2xTaXplKCksIGdldE1pblBvb2xTaXplKCksCisgICAgICAgIGdldFRocmVhZEtlZXBBbGl2ZU1pbnV0ZXMoKSwgaXNVbmxpbWl0ZWRRdWV1ZSgpLCBnZXRSZXNtZ3JVcmwoKSk7CisgIH0KKworICBwcm90ZWN0ZWQgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgZ2V0V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoKSB7CisgICAgcmV0dXJuIEdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkKKyAgICAgICAgLmdldFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RnJvbUNsYXNzTmFtZShTeXN0ZW0KKyAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShJTlNUQU5DRV9SRVBPX0ZBQ1RPUllfUFJPUEVSVFkpKTsKKyAgfQorCisgIHByb3RlY3RlZCBVUkwgZ2V0UmVzbWdyVXJsKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFVSTChTeXN0ZW0uZ2V0UHJvcGVydHkoUkVTTUdSX1VSTF9QUk9QRVJUWSkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0cubG9nKAorICAgICAgICAgIExldmVsLklORk8sCisgICAgICAgICAgIk5vIFJlc291cmNlIE1hbmFnZXIgVVJMIHByb3ZpZGVkIG9yIG1hbGZvcm1lZCBVUkw6IGV4ZWN1dGluZyBqb2JzICIgKworICAgICAgICAgICJsb2NhbGx5LiBVUkw6IFsiK1N5c3RlbS5nZXRQcm9wZXJ0eShSRVNNR1JfVVJMX1BST1BFUlRZKSsiXSIpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGludCBnZXRRdWV1ZVNpemUoKSB7CisgICAgcmV0dXJuIGdldEludGVnZXIoUVVFVUVfU0laRV9QUk9QRVJUWSwgREVGQVVMVF9RVUVVRV9TSVpFKTsKKyAgfQorCisgIHByb3RlY3RlZCBpbnQgZ2V0TWF4UG9vbFNpemUoKSB7CisgICAgcmV0dXJuIGdldEludGVnZXIoTUFYX1BPT0xfU0laRV9QUk9QRVJUWSwgREVGQVVMVF9NQVhfUE9PTF9TSVpFKTsKKyAgfQorCisgIHByb3RlY3RlZCBpbnQgZ2V0TWluUG9vbFNpemUoKSB7CisgICAgcmV0dXJuIGdldEludGVnZXIoTUlOX1BPT0xfU0laRV9QUk9QRVJUWSwgREVGQVVMVF9NSU5fUE9PTF9TSVpFKTsKKyAgfQorCisgIHByb3RlY3RlZCBsb25nIGdldFRocmVhZEtlZXBBbGl2ZU1pbnV0ZXMoKSB7CisgICAgcmV0dXJuIGdldExvbmcoVEhSRUFEX0tFRVBfQUxJVkVfUFJPUEVSVFksIERFRkFVTFRfVEhSRUFEX0tFRVBfQUxJVkVfTUlOUyk7CisgIH0KKworICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VubGltaXRlZFF1ZXVlKCkgeworICAgIHJldHVybiBnZXRCb29sZWFuKFVOTElNSVRFRF9RVUVVRV9QUk9QRVJUWSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9Xb3JrZmxvd0VuZ2luZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1dvcmtmbG93RW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMDAyNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9Xb3JrZmxvd0VuZ2luZS5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5FbmdpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogVGhlIGVuZ2luZSB0aGF0IGV4ZWN1dGVzIGFuZCBtb25pdG9ycyB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX1zLCB3aGljaCBhcmUKKyAqIHRoZSBwaHlzaWNhbCBleGVjdXRpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFidHJhY3Qge0BsaW5rIFdvcmtmbG93fXMKKyAqIHByb3ZpZGVkLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93RW5naW5lIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhfUE9JTlRfSUQgPSBXb3JrZmxvd0VuZ2luZS5jbGFzcy5nZXROYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIFN0YXJ0cyB0aGUgc3BlY2lmaWVkIHtAbGluayBXb3JrZmxvd30gYnkgY3JlYXRpbmcgYQorICAgICAqIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSwgYW5kIHRoZW4gcnVubmluZyB0aGF0IGluc3RhbmNlLiBUaGUgc3RhcnRlZAorICAgICAqIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSB3aGljaCBpcyByZXR1cm5lZCwgd2lsbCBoYXZlIGl0cyBzdGF0dXMgdXBkYXRlZAorICAgICAqIGJ5IHRoZSB3b3JrZmxvdyBlbmdpbmUsIGluY2x1ZGluZyBpdHMgc3RhdHVzIGZpZWxkLCBhbmQgaXRzCisgICAgICogY3VycmVudFRhc2tJZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya2Zsb3cKKyAgICAgKiAgICAgICAgICAgIFRoZSBhYnN0cmFjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIFdvcmtmbG93fSB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIEFueSBtZXRhZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRoZSB0YXNrcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfS4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rICBXb3JrZmxvd0luc3RhbmNlfSB3aGljaCBjYW4gYmUgdXNlZCB0byBtb25pdG9yIHRoZQorICAgICAqICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3d9IHRocm91Z2ggdGhlIEVuZ2luZS4KKyAgICAgKiBAdGhyb3dzIEVuZ2luZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2Ugc3RhcnRXb3JrZmxvdyhXb3JrZmxvdyB3b3JrZmxvdywgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgICAgICB0aHJvd3MgRW5naW5lRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbgorICAgICAqIDxjb2RlPndvcmtmbG93SW5zdElkPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrZmxvd0luc3RJZAorICAgICAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSB0byBzdG9wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BXb3JrZmxvdyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogUGF1c2VzIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gc3BlY2lmaWVkIGJ5IGl0cworICAgICAqIDxjb2RlPndvcmtmbG93SW5zdElkPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya2Zsb3dJbnN0SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgV29ya2Zsb3cgSW5zdGFuY2UgdG8gcGF1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGF1c2VXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCk7CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBSZXN1bWVzIEV4ZWN1dGlvbiBvZiB0aGUgc3BlY2lmaWVkIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBpZGVudGlmaWVkIGJ5CisgICAgICogaXRzIDxjb2RlPndvcmtmbG93SW5zdElkPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya2Zsb3dJbnN0SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRvIHJlc3VtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXN1bWVXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnl9IHVzZWQgYnkgdGhpcworICAgICAqIHtAbGluayBXb3JrZmxvd0VuZ2luZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnl9IHVzZWQgYnkgdGhpcworICAgICAqICAgICAgICAge0BsaW5rIFdvcmtmbG93RW5naW5lfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSB7QGxpbmsgTWV0YWRhdGF9IGNvbnRleHQgZm9yIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0KKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiA8Y29kZT53b3JrZmxvd0luc3RJZDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrZmxvd0luc3RJZAorICAgICAqICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHdob3NlIHtAbGluayBNZXRhZGF0YX0KKyAgICAgKiAgICAgICAgICAgIGNvbnRleHQgd2lsbCBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBtZXQKKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcge0BsaW5rIE1ldGFkYXRhfSBjb250ZXh0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlTWV0YWRhdGEoU3RyaW5nIHdvcmtmbG93SW5zdElkLCBNZXRhZGF0YSBtZXQpOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHBvaW50ZXIgdG8gdGhlIFdvcmtmbG93IE1hbmFnZXIgdGhhdCB0aGlzIHtAbGluayBXb3JrZmxvd0VuZ2luZX0KKyAgICAgKiBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHVybAorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBVUkx9IHBvaW50ZXIgdG8gdGhlIFdvcmtmbG93IE1hbmFnZXIgdGhhdCB0aGlzCisgICAgICogICAgICAgICAgICB7QGxpbmsgV29ya2Zsb3dFbmdpbmV9IGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3dNYW5hZ2VyVXJsKFVSTCB1cmwpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW1vdW50IG9mIHdhbGwgY2xvY2sgbWludXRlcyB0aGF0IGEgcGFydGljdWxhcgorICAgICAqIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSAoaWRlbnRpZmllZCBieSBpdHMgPGNvZGU+d29ya2Zsb3dJbnN0PC9jb2RlPikKKyAgICAgKiBoYXMgYmVlbiBleGVjdXRpbmcuIFRoaXMgaW5jbHVkZXMgdGltZSBzcGVudCA8Y29kZT5RVUVVRUQ8L2NvZGU+LCB0aW1lCisgICAgICogc3BlbnQgPGNvZGU+V0FJVElORzwvY29kZT4sIHRocm91Z2hvdXQgaXRzIGVudGlyZSBsaWZlY3ljbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya2Zsb3dJbnN0SWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gdG8gbWVhc3VyZSB3YWxsCisgICAgICogICAgICAgICAgICBjbG9jayB0aW1lIGZvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGFtb3VudCBvZiB3YWxsIGNsb2NrIG1pbnV0ZXMgdGhhdCBhIHBhcnRpY3VsYXIKKyAgICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBoYXMgYmVlbiBleGVjdXRpbmcgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0V2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW1vdW50IG9mIHdhbGwgY2xvY2sgbWludXRlcyB0aGF0IHRoZSBwYXJ0aWN1bGFyCisgICAgICoge0BsaW5rIFdvcmtmbG93VGFza30gd2l0aGluIGEge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IGhhcyBiZWVuIGV4ZWN1dGluZworICAgICAqIGZvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrZmxvd0luc3RJZAorICAgICAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSB0byBtZWFzdXJlIHdhbGwKKyAgICAgKiAgICAgICAgICAgIGNsb2NrIHRpbWUgZm9yIGl0cyBjdXJyZW50IHtAbGluayBXb3JrZmxvd1Rhc2t9LgorICAgICAqIEByZXR1cm4gVGhlIGFtb3VudCBvZiB3YWxsIGNsb2NrIG1pbnV0ZXMgdGhhdCBhIHBhcnRpY3VsYXIKKyAgICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSdzIGN1cnJlbnQge0BsaW5rIFdvcmtmbG93VGFza30gaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIGV4ZWN1dGluZyBmb3IuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoU3RyaW5nIHdvcmtmbG93SW5zdElkKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBNZXRhZGF0YX0gYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0KKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtmbG93SW5zdElkCisgICAgICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRvIG9idGFpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBNZXRhZGF0YX0gZm9yLgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBNZXRhZGF0YX0gc2hhcmVkIGNvbnRleHQgb2YgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllci4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBNZXRhZGF0YSBnZXRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEoU3RyaW5nIHdvcmtmbG93SW5zdElkKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1dvcmtmbG93RW5naW5lRmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1dvcmtmbG93RW5naW5lRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MmM2OTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvV29ya2Zsb3dFbmdpbmVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lOworCisvKioKKyAqIEEgZmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIHtAbGluayBXb3JrZmxvd0VuZ2luZX0gb2JqZWN0cy4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93RW5naW5lRmFjdG9yeSB7CisKKyAgIC8qKgorICAgICogTWV0aG9kIHdoaWNoIGNyZWF0ZXMge0BsaW5rIFdvcmtmbG93RW5naW5lfXMuCisgICAgKgorICAgICogQHJldHVybiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFdvcmtmbG93RW5naW5lfSBpbnRlcmZhY2UKKyAgICAqLworICAgcHVibGljIFdvcmtmbG93RW5naW5lIGNyZWF0ZVdvcmtmbG93RW5naW5lKCk7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcHJvY2Vzc29yL0NvbmRpdGlvblByb2Nlc3Nvci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9Db25kaXRpb25Qcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xY2VlMTcwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9Db25kaXRpb25Qcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3NvcjsKKworLy9PT0RUIGltcG9ydAoraW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CisKKy8qKgorICogCisgKiBXb3JrZmxvd1Byb2Nlc3NvciB3aGljaCBoYW5kbGVzIFdvcmtmbG93IFByZS9Qb3N0IENvbmRpdGlvbnMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUYXNrUHJvY2Vzc29yIHsKKworICBwdWJsaWMgQ29uZGl0aW9uUHJvY2Vzc29yKFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNYW5hZ2VyLCBXb3JrZmxvd0luc3RhbmNlIGluc3QpIHsKKyAgICBzdXBlcihsaWZlY3ljbGVNYW5hZ2VyLCBpbnN0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRQcmVDb25kaXRpb25zKFdvcmtmbG93UHJvY2Vzc29yIHByZUNvbmRpdGlvbnMpIHsKKyAgICAvLyBub3QgYWxsb3dlZAorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFBvc3RDb25kaXRpb25zKFdvcmtmbG93UHJvY2Vzc29yIHBvc3RDb25kaXRpb25zKSB7CisgICAgLy8gbm90IGFsbG93ZWQKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLlRhc2tQcm9jZXNzb3Ijc2V0V29ya2Zsb3dJbnN0YW5jZQorICAgKiAob3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2UpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlKSB7CisgICAgaW5zdGFuY2Uuc2V0UHJpb3JpdHkoUHJpb3JpdHkKKyAgICAgICAgLmdldFByaW9yaXR5KGluc3RhbmNlLmdldFByaW9yaXR5KCkuZ2V0VmFsdWUoKSAtIDAuMSkpOworICAgIHN1cGVyLnNldFdvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvUGFyYWxsZWxQcm9jZXNzb3IuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvUGFyYWxsZWxQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZWQ3MjBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9QYXJhbGxlbFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CisKKy8qKgorICogCisgKiBXb3JrZmxvd1Byb2Nlc3NvciB3aGljaCBoYW5kbGVzIHJ1bm5pbmcgc3ViLXdvcmtmbG93IHByb2Nlc3NvcnMgaW4gcGFyYWxsZWwuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFByb2Nlc3NvciBleHRlbmRzIFdvcmtmbG93UHJvY2Vzc29yIHsKKworICBwdWJsaWMgUGFyYWxsZWxQcm9jZXNzb3IoV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGxpZmVjeWNsZU1nciwgV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSkgeworICAgIHN1cGVyKGxpZmVjeWNsZU1nciwgaW5zdGFuY2UpOworICB9CisKKyAgcHVibGljIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IGdldFJ1bm5hYmxlU3ViUHJvY2Vzc29ycygpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRTdWJQcm9jZXNzb3JzKCk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvciMKKyAgICogaGFuZGxlU3ViUHJvY2Vzc29yTWV0YWRhdGEKKyAgICogKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvcikKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdWJQcm9jZXNzb3JNZXRhZGF0YShXb3JrZmxvd1Byb2Nlc3NvciB3b3JrZmxvd1Byb2Nlc3NvcikgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvU2VxdWVudGlhbFByb2Nlc3Nvci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9TZXF1ZW50aWFsUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzJjYzYwOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvU2VxdWVudGlhbFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3I7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKKworLyoqCisgKiAKKyAqIFdvcmtmbG93UHJvY2Vzc29yIHdoaWNoIGhhbmRsZXMgcnVubmluZyBzdWItcHJvY2Vzc29ycyBpbiBzZXF1ZW5jZS4KKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsUHJvY2Vzc29yIGV4dGVuZHMgV29ya2Zsb3dQcm9jZXNzb3IgeworCisgIHB1YmxpYyBTZXF1ZW50aWFsUHJvY2Vzc29yKFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNYW5hZ2VyLCBXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlKSB7CisgICAgc3VwZXIobGlmZWN5Y2xlTWFuYWdlciwgaW5zdGFuY2UpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBnZXRSdW5uYWJsZVN1YlByb2Nlc3NvcnMoKSB7CisgICAgV29ya2Zsb3dQcm9jZXNzb3IgbmV4dFdQID0gdGhpcy5nZXROZXh0KCk7CisgICAgaWYgKG5leHRXUCAhPSBudWxsKQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV4dFdQKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVTdWJQcm9jZXNzb3JNZXRhZGF0YShXb3JrZmxvd1Byb2Nlc3NvciB3b3JrZmxvd1Byb2Nlc3NvcikgeworICAgIC8vIGRvIG5vdGhpbmcKKyAgfQorCisgIHByaXZhdGUgV29ya2Zsb3dQcm9jZXNzb3IgZ2V0TmV4dCgpIHsKKyAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHdwIDogdGhpcy5nZXRTdWJQcm9jZXNzb3JzKCkpCisgICAgICBpZiAoIXdwLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGF0ZSgpLmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpCisgICAgICAgICAgLmVxdWFscygiZG9uZSIpICYmICF3cC5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKS5nZXROYW1lKCkuZXF1YWxzKCJFeGVjdXRpbmciKSkKKyAgICAgICAgcmV0dXJuIHdwOworICAgIHJldHVybiBudWxsOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvVGFza1Byb2Nlc3Nvci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9UYXNrUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDEzOWU4ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvVGFza1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Qcmlvcml0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrSW5zdGFuY2U7CisKKy8qKgorICogCisgKiBXb3JrZmxvd1Byb2Nlc3NvciB3aGljaCBoYW5kbGVzIHJ1bm5pbmcgdGFzayB3b3JrZmxvd3MuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrUHJvY2Vzc29yIGV4dGVuZHMgV29ya2Zsb3dQcm9jZXNzb3IgeworCisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIFdvcmtmbG93VGFza0luc3RhbmNlPiBpbnN0YW5jZUNsYXNzOworICBwcml2YXRlIFN0cmluZyBqb2JJZDsKKyAgCisgIHB1YmxpYyBUYXNrUHJvY2Vzc29yKFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNYW5hZ2VyLCBXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlKSB7CisgICAgc3VwZXIobGlmZWN5Y2xlTWFuYWdlciwgaW5zdGFuY2UpOworICB9CisKKyAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXb3JrZmxvd1Rhc2tJbnN0YW5jZT4gZ2V0SW5zdGFuY2VDbGFzcygpIHsKKyAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNsYXNzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Sm9iSWQoU3RyaW5nIGpvYklkKSB7CisgICAgdGhpcy5qb2JJZCA9IGpvYklkOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRKb2JJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5qb2JJZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlQ2xhc3MoCisgICAgICBDbGFzczw/IGV4dGVuZHMgV29ya2Zsb3dUYXNrSW5zdGFuY2U+IGluc3RhbmNlQ2xhc3MpIHsKKyAgICB0aGlzLmluc3RhbmNlQ2xhc3MgPSBpbnN0YW5jZUNsYXNzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFdvcmtmbG93SW5zdGFuY2UoV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSkgeworICAgIGluc3RhbmNlLnNldFByaW9yaXR5KFByaW9yaXR5CisgICAgICAgIC5nZXRQcmlvcml0eShpbnN0YW5jZS5nZXRQcmlvcml0eSgpLmdldFZhbHVlKCkgKyAwLjEpKTsKKyAgICBzdXBlci5zZXRXb3JrZmxvd0luc3RhbmNlKGluc3RhbmNlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxUYXNrUHJvY2Vzc29yPiBnZXRSdW5uYWJsZVdvcmtmbG93UHJvY2Vzc29ycygpIHsKKyAgICBMaXN0PFRhc2tQcm9jZXNzb3I+IHRwcyA9IHN1cGVyLmdldFJ1bm5hYmxlV29ya2Zsb3dQcm9jZXNzb3JzKCk7CisgICAgaWYgKHRwcy5zaXplKCkgPT0gMCkgeworICAgICAgaWYgKHRoaXMuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFN0YXRlKCkuZ2V0TmFtZSgpLmVxdWFscygiQmxvY2tlZCIpKSB7CisgICAgICAgIFN0cmluZyByZXF1aXJlZEJsb2NrVGltZUVsYXBzZVN0cmluZyA9IHRoaXMuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpCisgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2soKS5nZXRUYXNrQ29uZmlnKCkuZ2V0UHJvcGVydHkoIkJsb2NrVGltZUVsYXBzZSIpOworICAgICAgICBpbnQgcmVxdWlyZWRCbG9ja1RpbWVFbGFwc2UgPSAyOworICAgICAgICBpZiAocmVxdWlyZWRCbG9ja1RpbWVFbGFwc2VTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1aXJlZEJsb2NrVGltZUVsYXBzZSA9IEludGVnZXIKKyAgICAgICAgICAgICAgICAucGFyc2VJbnQocmVxdWlyZWRCbG9ja1RpbWVFbGFwc2VTdHJpbmcpOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsZW5kYXIuc2V0VGltZSh0aGlzLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGF0ZSgpLmdldFN0YXJ0VGltZSgpKTsKKyAgICAgICAgbG9uZyBlbGFwc2VkVGltZSA9ICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBjYWxlbmRhcgorICAgICAgICAgICAgLmdldFRpbWVJbk1pbGxpcygpKSAvIDEwMDApIC8gNjA7CisgICAgICAgIGlmIChlbGFwc2VkVGltZSA+PSByZXF1aXJlZEJsb2NrVGltZUVsYXBzZSkKKyAgICAgICAgICB0cHMuYWRkKHRoaXMpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQW55U3RhdGUoIkxvYWRlZCIsICJRdWV1ZWQiLCAiUHJlQ29uZGl0aW9uU3VjY2VzcyIpICYmIAorICAgICAgICAgICF0aGlzLmlzQW55U3RhdGUoIkV4ZWN1dGluZyIpICYmIHRoaXMucGFzc2VkUHJlQ29uZGl0aW9ucygpKXsKKyAgICAgICAgdHBzLmFkZCh0aGlzKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRwczsKKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIGhhc1N1YlByb2Nlc3NvcnMoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IGdldFJ1bm5hYmxlU3ViUHJvY2Vzc29ycygpIHsKKyAgICByZXR1cm4gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRTdWJQcm9jZXNzb3JzKExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IHN1YlByb2Nlc3NvcnMpIHsKKyAgICAvLyBub3QgYWxsb3dlZAorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVN1YlByb2Nlc3Nvck1ldGFkYXRhKFdvcmtmbG93UHJvY2Vzc29yIHdvcmtmbG93UHJvY2Vzc29yKSB7CisgICAgLy8gZG8gbm90aGluZworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3IuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTFiY2IxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9Xb3JrZmxvd1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDUyIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3NvcjsNCisNCisvL0pESyBpbXBvcnRzDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQorDQorLy9PT0RUIGltcG9ydHMNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuQ2hhbmdlVHlwZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZVN0YWdlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd1N0YXRlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsNCisNCisvKioNCisgKiANCisgKiBUaGUgbmV3IEFwYWNoZSBPT0RUIHdvcmtmbG93IHN0eWxlIG9mIHByb2Nlc3Nvci4gVGhlc2UgcHJvY2Vzc29ycyBhcmUNCisgKiByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSBzZXQgb2YgdW5kZXJseWluZyB0YXNrcywgb3IgY29uZGl0aW9ucyB0aGF0IGNhbg0KKyAqIHJ1bi4gQSBzZXF1ZW50aWFsIHZlcnNpb24gd2lsbCByZXR1cm4gb25seSBhIHNpbmdsZSBzdWItcHJvY2Vzc29yIChjb25kaXRpb24NCisgKiBvciB0YXNrLCBvciBldmVuIHdvcmtmbG93KTsgYSBwYXJhbGxlbCB2ZXJzaW9uIHdpbGwgcmV0dXJuIG1hbnkgc3ViDQorICogcHJvY2Vzc29ycyB0byBydW4uDQorICogDQorICogQHNpbmNlIEFwYWNoZSBPT0RUIDAuNC4NCisgKiANCisgKiBAYXV0aG9yIG1hdHRtYW5uDQorICogQGF1dGhvciBiZm9zdGVyDQorICogDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtmbG93UHJvY2Vzc29yIGltcGxlbWVudHMgV29ya2Zsb3dQcm9jZXNzb3JMaXN0ZW5lciwNCisgICAgQ29tcGFyYWJsZTxXb3JrZmxvd1Byb2Nlc3Nvcj4gew0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoV29ya2Zsb3dQcm9jZXNzb3IuY2xhc3MNCisgICAgICAuZ2V0TmFtZSgpKTsNCisNCisgIHByaXZhdGUgV29ya2Zsb3dJbnN0YW5jZSB3b3JrZmxvd0luc3RhbmNlOw0KKyAgcHJpdmF0ZSBXb3JrZmxvd1Byb2Nlc3NvciBwcmVDb25kaXRpb25zOw0KKyAgcHJpdmF0ZSBXb3JrZmxvd1Byb2Nlc3NvciBwb3N0Q29uZGl0aW9uczsNCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHM7IC8vIEZJWE1FOiByZWFkIHRoaXMgaW4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhY2thZ2VkUmVwbzogZmxvdyB0aHJvdWdoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZQ0KKyAgcHJpdmF0ZSBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBzdWJQcm9jZXNzb3JzOw0KKyAgcHJpdmF0ZSBMaXN0PFdvcmtmbG93UHJvY2Vzc29yTGlzdGVuZXI+IGxpc3RlbmVyczsNCisgIHByaXZhdGUgaW50IG1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzOyAvLyBGSVhNRTogcmVhZCB0aGlzIGluDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFja2FnZWRSZXBvOiBmbG93IHRocm91Z2gNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZQ0KKyAgcHJvdGVjdGVkIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNYW5hZ2VyOw0KKyAgcHJvdGVjdGVkIFdvcmtmbG93UHJvY2Vzc29ySGVscGVyIGhlbHBlcjsNCisNCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvcihXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlTWFuYWdlciwNCisgICAgICBXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdGFuY2UpIHsNCisgICAgdGhpcy5zdWJQcm9jZXNzb3JzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsNCisgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgVmVjdG9yPFdvcmtmbG93UHJvY2Vzc29yTGlzdGVuZXI+KCk7DQorICAgIHRoaXMuZXhjdXNlZFN1YlByb2Nlc3NvcklkcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOw0KKyAgICB0aGlzLm1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzID0gLTE7DQorICAgIHRoaXMubGlmZWN5Y2xlTWFuYWdlciA9IGxpZmVjeWNsZU1hbmFnZXI7DQorICAgIHRoaXMud29ya2Zsb3dJbnN0YW5jZSA9IHdvcmtmbG93SW5zdGFuY2U7DQorICAgIHRoaXMuaGVscGVyID0gbmV3IFdvcmtmbG93UHJvY2Vzc29ySGVscGVyKGxpZmVjeWNsZU1hbmFnZXIpOw0KKyAgICBXb3JrZmxvd1N0YXRlIGluaXRTdGF0ZSA9IGhlbHBlci5nZXRMaWZlY3ljbGVGb3JQcm9jZXNzb3IodGhpcykNCisgICAgICAgIC5jcmVhdGVTdGF0ZSgiTnVsbCIsICJpbml0aWFsIiwNCisgICAgICAgICAgICAiSW5zdGFuY2UgY3JlYXRlZCBieSB3b3JrZmxvdyBwcm9jZXNzb3IuIik7DQorICAgIHRoaXMud29ya2Zsb3dJbnN0YW5jZS5zZXRTdGF0ZShpbml0U3RhdGUpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSB3b3JrZmxvd0luc3RhbmNlDQorICAgKi8NCisgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlIGdldFdvcmtmbG93SW5zdGFuY2UoKSB7DQorICAgIHJldHVybiB3b3JrZmxvd0luc3RhbmNlOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcGFyYW0gd29ya2Zsb3dJbnN0YW5jZQ0KKyAgICogICAgICAgICAgdGhlIHdvcmtmbG93SW5zdGFuY2UgdG8gc2V0DQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHNldFdvcmtmbG93SW5zdGFuY2UoV29ya2Zsb3dJbnN0YW5jZSB3b3JrZmxvd0luc3RhbmNlKSB7DQorICAgIHRoaXMud29ya2Zsb3dJbnN0YW5jZSA9IHdvcmtmbG93SW5zdGFuY2U7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMNCisgICAqLw0KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkgew0KKyAgICByZXR1cm4gZXhjdXNlZFN1YlByb2Nlc3NvcklkczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMNCisgICAqICAgICAgICAgIHRoZSBleGN1c2VkU3ViUHJvY2Vzc29ySWRzIHRvIHNldA0KKyAgICovDQorICBwdWJsaWMgdm9pZCBzZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKExpc3Q8U3RyaW5nPiBleGN1c2VkU3ViUHJvY2Vzc29ySWRzKSB7DQorICAgIHRoaXMuZXhjdXNlZFN1YlByb2Nlc3NvcklkcyA9IGV4Y3VzZWRTdWJQcm9jZXNzb3JJZHM7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIHN1YlByb2Nlc3NvcnMNCisgICAqLw0KKyAgcHVibGljIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IGdldFN1YlByb2Nlc3NvcnMoKSB7DQorICAgIHJldHVybiBzdWJQcm9jZXNzb3JzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcGFyYW0gc3ViUHJvY2Vzc29ycw0KKyAgICogICAgICAgICAgdGhlIHN1YlByb2Nlc3NvcnMgdG8gc2V0DQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHNldFN1YlByb2Nlc3NvcnMoTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gc3ViUHJvY2Vzc29ycykgew0KKyAgICB0aGlzLnN1YlByb2Nlc3NvcnMgPSBzdWJQcm9jZXNzb3JzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSBsaXN0ZW5lcnMNCisgICAqLw0KKyAgcHVibGljIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3JMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgew0KKyAgICByZXR1cm4gbGlzdGVuZXJzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcGFyYW0gbGlzdGVuZXJzDQorICAgKiAgICAgICAgICB0aGUgbGlzdGVuZXJzIHRvIHNldA0KKyAgICovDQorICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcnMoTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvckxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsNCisgICAgdGhpcy5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIG1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzDQorICAgKi8NCisgIHB1YmxpYyBpbnQgZ2V0TWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMoKSB7DQorICAgIHJldHVybiBtaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29yczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIG1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzDQorICAgKiAgICAgICAgICB0aGUgbWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMgdG8gc2V0DQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHNldE1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzKGludCBtaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29ycykgew0KKyAgICB0aGlzLm1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzID0gbWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnM7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIGxpZmVjeWNsZU1hbmFnZXINCisgICAqLw0KKyAgcHVibGljIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBnZXRMaWZlY3ljbGVNYW5hZ2VyKCkgew0KKyAgICByZXR1cm4gbGlmZWN5Y2xlTWFuYWdlcjsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIGxpZmVjeWNsZU1hbmFnZXINCisgICAqICAgICAgICAgIHRoZSBsaWZlY3ljbGVNYW5hZ2VyIHRvIHNldA0KKyAgICovDQorICBwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVNYW5hZ2VyKFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNYW5hZ2VyKSB7DQorICAgIHRoaXMubGlmZWN5Y2xlTWFuYWdlciA9IGxpZmVjeWNsZU1hbmFnZXI7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIHByZUNvbmRpdGlvbnMNCisgICAqLw0KKyAgcHVibGljIFdvcmtmbG93UHJvY2Vzc29yIGdldFByZUNvbmRpdGlvbnMoKSB7DQorICAgIHJldHVybiBwcmVDb25kaXRpb25zOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcGFyYW0gcHJlQ29uZGl0aW9ucw0KKyAgICogICAgICAgICAgdGhlIHByZUNvbmRpdGlvbnMgdG8gc2V0DQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHNldFByZUNvbmRpdGlvbnMoV29ya2Zsb3dQcm9jZXNzb3IgcHJlQ29uZGl0aW9ucykgew0KKyAgICB0aGlzLnByZUNvbmRpdGlvbnMgPSBwcmVDb25kaXRpb25zOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSBwb3N0Q29uZGl0aW9ucw0KKyAgICovDQorICBwdWJsaWMgV29ya2Zsb3dQcm9jZXNzb3IgZ2V0UG9zdENvbmRpdGlvbnMoKSB7DQorICAgIHJldHVybiBwb3N0Q29uZGl0aW9uczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIHBvc3RDb25kaXRpb25zDQorICAgKiAgICAgICAgICB0aGUgcG9zdENvbmRpdGlvbnMgdG8gc2V0DQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHNldFBvc3RDb25kaXRpb25zKFdvcmtmbG93UHJvY2Vzc29yIHBvc3RDb25kaXRpb25zKSB7DQorICAgIHRoaXMucG9zdENvbmRpdGlvbnMgPSBwb3N0Q29uZGl0aW9uczsNCisgIH0NCisNCisgIC8qDQorICAgKiAobm9uLUphdmFkb2MpDQorICAgKiANCisgICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBjb21wYXJlVG8oV29ya2Zsb3dQcm9jZXNzb3Igd29ya2Zsb3dQcm9jZXNzb3IpIHsNCisgICAgcmV0dXJuIHRoaXMuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFByaW9yaXR5KCkNCisgICAgICAgIC5jb21wYXJlVG8od29ya2Zsb3dQcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFByaW9yaXR5KCkpOw0KKyAgfQ0KKw0KKyAgLyoNCisgICAqIChub24tSmF2YWRvYykNCisgICAqIA0KKyAgICogQHNlZQ0KKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dQcm9jZXNzb3JMaXN0ZW5lciNub3RpZnlDaGFuZ2UNCisgICAqIChvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd1Byb2Nlc3NvciwNCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLkNoYW5nZVR5cGUpDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlKFdvcmtmbG93UHJvY2Vzc29yIHByb2Nlc3NvciwgQ2hhbmdlVHlwZSBjaGFuZ2VUeXBlKSB7DQorICAgIGZvciAoV29ya2Zsb3dQcm9jZXNzb3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMuZ2V0TGlzdGVuZXJzKCkpDQorICAgICAgbGlzdGVuZXIubm90aWZ5Q2hhbmdlKHRoaXMsIGNoYW5nZVR5cGUpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PFRhc2tQcm9jZXNzb3I+IGdldFJ1bm5hYmxlV29ya2Zsb3dQcm9jZXNzb3JzKCkgew0KKyAgICBWZWN0b3I8VGFza1Byb2Nlc3Nvcj4gcnVubmFibGVUYXNrcyA9IG5ldyBWZWN0b3I8VGFza1Byb2Nlc3Nvcj4oKTsNCisNCisgICAgLy8gZXZhbHVhdGUgcHJlLWNvbmRpdGlvbnMNCisgICAgaWYgKCF0aGlzLnBhc3NlZFByZUNvbmRpdGlvbnMoKSkgew0KKyAgICAgIGZvciAoV29ya2Zsb3dQcm9jZXNzb3Igc3ViUHJvY2Vzc29yIDogdGhpcy5nZXRQcmVDb25kaXRpb25zKCkNCisgICAgICAgICAgLmdldFJ1bm5hYmxlU3ViUHJvY2Vzc29ycygpKSB7DQorICAgICAgICBmb3IgKFRhc2tQcm9jZXNzb3IgdHAgOiBzdWJQcm9jZXNzb3IuZ2V0UnVubmFibGVXb3JrZmxvd1Byb2Nlc3NvcnMoKSkgew0KKyAgICAgICAgICBydW5uYWJsZVRhc2tzLmFkZCh0cCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICB9IGVsc2UgaWYgKHRoaXMuaXNEb25lKCkuZ2V0TmFtZSgpLmVxdWFscygiUmVzdWx0c0ZhaWx1cmUiKSkgew0KKyAgICAgIC8vIGRvIG5vdGhpbmcgLS0gdGhpcyB3b3JrZmxvdyBmYWlsZWQhISENCisgICAgfSBlbHNlIGlmICh0aGlzLmlzRG9uZSgpLmdldE5hbWUoKS5lcXVhbHMoIlJlc3VsdHNCYWlsIikpIHsNCisgICAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHN1YlByb2Nlc3NvciA6IHRoaXMuZ2V0UnVubmFibGVTdWJQcm9jZXNzb3JzKCkpDQorICAgICAgICBydW5uYWJsZVRhc2tzLmFkZEFsbChzdWJQcm9jZXNzb3IuZ2V0UnVubmFibGVXb3JrZmxvd1Byb2Nlc3NvcnMoKSk7DQorICAgIH0gZWxzZSBpZiAoIXRoaXMucGFzc2VkUG9zdENvbmRpdGlvbnMoKSkgew0KKyAgICAgIGZvciAoV29ya2Zsb3dQcm9jZXNzb3Igc3ViUHJvY2Vzc29yIDogdGhpcy5nZXRQb3N0Q29uZGl0aW9ucygpDQorICAgICAgICAgIC5nZXRSdW5uYWJsZVN1YlByb2Nlc3NvcnMoKSkgew0KKyAgICAgICAgZm9yIChUYXNrUHJvY2Vzc29yIHRwIDogc3ViUHJvY2Vzc29yLmdldFJ1bm5hYmxlV29ya2Zsb3dQcm9jZXNzb3JzKCkpIHsNCisgICAgICAgICAgcnVubmFibGVUYXNrcy5hZGQodHApOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcnVubmFibGVUYXNrczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQWR2YW5jZXMgdGhpcyBXb3JrZmxvd1Byb2Nlc3NvciB0byBpdHMgbmV4dCB7QGxpbmsgV29ya2Zsb3dTdGF0ZX0uDQorICAgKi8NCisgIHB1YmxpYyB2b2lkIG5leHRTdGF0ZSgpIHsNCisgICAgaWYgKHRoaXMud29ya2Zsb3dJbnN0YW5jZSAhPSBudWxsDQorICAgICAgICAmJiB0aGlzLndvcmtmbG93SW5zdGFuY2UuZ2V0U3RhdGUoKSAhPSBudWxsKSB7DQorICAgICAgV29ya2Zsb3dTdGF0ZSBjdXJyU3RhdGUgPSB0aGlzLndvcmtmbG93SW5zdGFuY2UuZ2V0U3RhdGUoKTsNCisgICAgICBXb3JrZmxvd1N0YXRlIG5leHRTdGF0ZSA9IG51bGw7DQorICAgICAgaWYgKGN1cnJTdGF0ZS5nZXROYW1lKCkuZXF1YWxzKCJOdWxsIikpIHsNCisgICAgICAgIG5leHRTdGF0ZSA9IHRoaXMuaGVscGVyLmdldExpZmVjeWNsZUZvclByb2Nlc3Nvcih0aGlzKS5jcmVhdGVTdGF0ZSgNCisgICAgICAgICAgICAiTG9hZGVkIiwNCisgICAgICAgICAgICAiaW5pdGlhbCIsDQorICAgICAgICAgICAgIldvcmtmbG93IFByb2Nlc3NvcjogbmV4dFN0YXRlOiAiICsgImxvYWRpbmcgd29ya2Zsb3cgaW5zdGFuY2U6IFsiDQorICAgICAgICAgICAgICAgICsgdGhpcy53b3JrZmxvd0luc3RhbmNlLmdldElkKCkgKyAiXSIpOw0KKyAgICAgIH0gZWxzZSBpZiAoY3VyclN0YXRlLmdldE5hbWUoKS5lcXVhbHMoIkxvYWRlZCIpKSB7DQorICAgICAgICBuZXh0U3RhdGUgPSB0aGlzLmhlbHBlci5nZXRMaWZlY3ljbGVGb3JQcm9jZXNzb3IodGhpcykuY3JlYXRlU3RhdGUoDQorICAgICAgICAgICAgIlF1ZXVlZCIsDQorICAgICAgICAgICAgImluaXRpYWwiLA0KKyAgICAgICAgICAgICJXb3JrZmxvdyBQcm9jZXNzb3I6IG5leHRTdGF0ZTogIiArICJxdWV1ZWluZyBpbnN0YW5jZTogWyINCisgICAgICAgICAgICAgICAgKyB0aGlzLndvcmtmbG93SW5zdGFuY2UuZ2V0SWQoKSArICJdIik7DQorICAgICAgfSBlbHNlIGlmIChjdXJyU3RhdGUuZ2V0TmFtZSgpLmVxdWFscygiUXVldWVkIikpIHsNCisgICAgICAgIGlmICghdGhpcy5wYXNzZWRQcmVDb25kaXRpb25zKCkpIHsNCisgICAgICAgICAgbmV4dFN0YXRlID0gdGhpcy5oZWxwZXIuZ2V0TGlmZWN5Y2xlRm9yUHJvY2Vzc29yKHRoaXMpLmNyZWF0ZVN0YXRlKA0KKyAgICAgICAgICAgICAgIlByZUNvbmRpdGlvbkV2YWwiLA0KKyAgICAgICAgICAgICAgInJ1bm5pbmciLA0KKyAgICAgICAgICAgICAgIldvcmtmbG93IFByb2Nlc3NvcjogbmV4dFN0YXRlOiAiDQorICAgICAgICAgICAgICAgICAgKyAicnVubmluZyBwcmVjb25kaXRpb3NuIGZvciB3b3JrZmxvdyBpbnN0YW5jZTogWyINCisgICAgICAgICAgICAgICAgICArIHRoaXMud29ya2Zsb3dJbnN0YW5jZS5nZXRJZCgpICsgIl0iKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmICh0aGlzLmlzRG9uZSgpLmdldE5hbWUoKS5lcXVhbHMoIlJlc3VsdHNTdWNjZXNzIikpIHsNCisgICAgICAgICAgICBuZXh0U3RhdGUgPSB0aGlzLmhlbHBlci5nZXRMaWZlY3ljbGVGb3JQcm9jZXNzb3IodGhpcykuY3JlYXRlU3RhdGUoDQorICAgICAgICAgICAgICAgICJTdWNjZXNzIiwNCisgICAgICAgICAgICAgICAgImRvbmUiLA0KKyAgICAgICAgICAgICAgICAiV29ya2Zsb3cgUHJvY2Vzc29yOiBuZXh0U3RhdGU6ICIgKyAid29ya2Zsb3cgaW5zdGFuY2U6IFsiDQorICAgICAgICAgICAgICAgICAgICArIHRoaXMud29ya2Zsb3dJbnN0YW5jZS5nZXRJZCgpDQorICAgICAgICAgICAgICAgICAgICArICJdIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoY3VyclN0YXRlLmdldE5hbWUoKS5lcXVhbHMoIkV4ZWN1dGluZyIpKSB7DQorICAgICAgICBpZih0aGlzLmlzRG9uZSgpLmdldE5hbWUoKS5lcXVhbHMoIlJlc3VsdHNTdWNjZXNzIikpew0KKyAgICAgICAgbmV4dFN0YXRlID0gdGhpcy5oZWxwZXIuZ2V0TGlmZWN5Y2xlRm9yUHJvY2Vzc29yKHRoaXMpLmNyZWF0ZVN0YXRlKA0KKyAgICAgICAgICAgICJTdWNjZXNzIiwNCisgICAgICAgICAgICAiZG9uZSIsDQorICAgICAgICAgICAgIldvcmtmbG93IFByb2Nlc3NvcjogbmV4dFN0YXRlOiAiICsgIndvcmtmbG93IGluc3RhbmNlOiBbIg0KKyAgICAgICAgICAgICAgICArIHRoaXMud29ya2Zsb3dJbnN0YW5jZS5nZXRJZCgpICsgIl0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmKGN1cnJTdGF0ZS5nZXROYW1lKCkuZXF1YWxzKCJFeGVjdXRpb25Db21wbGV0ZSIpKXsNCisgICAgICAgIG5leHRTdGF0ZSA9IHRoaXMuaGVscGVyLmdldExpZmVjeWNsZUZvclByb2Nlc3Nvcih0aGlzKS5jcmVhdGVTdGF0ZSgNCisgICAgICAgICAgICAiU3VjY2VzcyIsDQorICAgICAgICAgICAgImRvbmUiLA0KKyAgICAgICAgICAgICJXb3JrZmxvdyBQcm9jZXNzb3I6IG5leHRTdGF0ZTogIiArICJ3b3JrZmxvdyBpbnN0YW5jZTogWyINCisgICAgICAgICAgICAgICAgKyB0aGlzLndvcmtmbG93SW5zdGFuY2UuZ2V0SWQoKSArICJdIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKTsgICAgICAgIA0KKyAgICAgIH0NCisNCisgICAgICBpZiAobmV4dFN0YXRlICE9IG51bGwpIHsNCisgICAgICAgIHRoaXMud29ya2Zsb3dJbnN0YW5jZS5zZXRTdGF0ZShuZXh0U3RhdGUpOw0KKyAgICAgIH0NCisNCisgICAgfSBlbHNlIHsNCisgICAgICB0aGlzLndvcmtmbG93SW5zdGFuY2Uuc2V0U3RhdGUoaGVscGVyLmdldExpZmVjeWNsZUZvclByb2Nlc3Nvcih0aGlzKQ0KKyAgICAgICAgICAuY3JlYXRlU3RhdGUoDQorICAgICAgICAgICAgICAiVW5rbm93biIsDQorICAgICAgICAgICAgICAiaG9sZGluZyIsDQorICAgICAgICAgICAgICAiVGhlIFdvcmtmbG93IFByb2Nlc3NvciBmb3IgaW5zdGFuY2UgOiBbIg0KKyAgICAgICAgICAgICAgICAgICsgdGhpcy5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0SWQoKSArICJdICINCisgICAgICAgICAgICAgICAgICArICJoYWQgYSBudWxsIHN0YXRlIikpOw0KKyAgICB9DQorICB9DQorICANCisgIC8qKg0KKyAgICogRXZhbHVhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgcHJvY2Vzc29yJ3Mge0BsaW5rIFdvcmtmbG93U3RhdGV9DQorICAgKiBpcyBpbiBhbnkgb2YgdGhlIHByb3ZpZGVkIHN0YXRlIG5hbWVzLg0KKyAgICogDQorICAgKiBAcGFyYW0gc3RhdGVzIFRoZSBuYW1lcyBvZiBzdGF0ZXMgdG8gY2hlY2sgdGhpcyBwcm9jZXNzb3IncyANCisgICAqIHtAbGluayBXb3JrZmxvd1N0YXRlfSBhZ2FpbnN0Lg0KKyAgICogDQorICAgKiBAcmV0dXJuIFRydWUsIGlmIGFueSBvZiB0aGUgc3RhdGUgbmFtZXMgcHJvdmlkZWQgaXMgdGhlIG5hbWUgb2YNCisgICAqIHRoaXMgcHJvY2Vzc29yJ3MgaW50ZXJuYWwge0BsaW5rIFdvcmtmbG93U3RhdGV9LCBGYWxzZSBvdGhlcndpc2UuDQorICAgKi8NCisgIHB1YmxpYyBib29sZWFuIGlzQW55U3RhdGUoU3RyaW5nLi4uIHN0YXRlcykgew0KKyAgICBmb3IgKFN0cmluZyBzdGF0ZSA6IHN0YXRlcykgew0KKyAgICAgIGlmICh0aGlzLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGF0ZSgpLmdldE5hbWUoKS5lcXVhbHMoc3RhdGUpKSB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBFdmFsdWF0ZXMgd2hldGhlciBvciBub3QgdGhpcyBwcm9jZXNzb3IncyB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZX0NCisgICAqIGlzIGluIGFueSBvZiB0aGUgcHJvdmlkZWQgY2F0ZWdvcnkgbmFtZXMuDQorICAgKiANCisgICAqIEBwYXJhbSBjYXRlZ29yaWVzIFRoZSBuYW1lcyBvZiBjYXRlZ29yaWVzIHRvIGNoZWNrIHRoaXMgcHJvY2Vzc29yJ3MgDQorICAgKiB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZX0gYWdhaW5zdC4NCisgICAqIA0KKyAgICogQHJldHVybiBUcnVlLCBpZiBhbnkgb2YgdGhlIGNhdGVnb3J5IG5hbWVzIHByb3ZpZGVkIGlzIHRoZSBuYW1lIG9mDQorICAgKiB0aGlzIHByb2Nlc3NvcidzIGludGVybmFsIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfSwgRmFsc2Ugb3RoZXJ3aXNlLg0KKyAgICovDQorICBwdWJsaWMgYm9vbGVhbiBpc0FueUNhdGVnb3J5KFN0cmluZy4uLiBjYXRlZ29yaWVzKSB7DQorICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgew0KKyAgICAgIGlmICh0aGlzLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGF0ZSgpLmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpDQorICAgICAgICAgIC5lcXVhbHMoY2F0ZWdvcnkpKSB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfSAgDQorDQorICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXNzZWRQcmVDb25kaXRpb25zKCkgew0KKyAgICBpZiAodGhpcy5nZXRQcmVDb25kaXRpb25zKCkgIT0gbnVsbCkgew0KKyAgICAgIHJldHVybiB0aGlzLmdldFByZUNvbmRpdGlvbnMoKS5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKS5nZXROYW1lKCkNCisgICAgICAgICAgLmVxdWFscygiU3VjY2VzcyIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorDQorICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXNzZWRQb3N0Q29uZGl0aW9ucygpIHsNCisgICAgaWYgKHRoaXMuZ2V0UG9zdENvbmRpdGlvbnMoKSAhPSBudWxsKSB7DQorICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9zdENvbmRpdGlvbnMoKS5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKQ0KKyAgICAgICAgICAuZ2V0TmFtZSgpLmVxdWFscygiU3VjY2VzcyIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqIEZpcnN0IGNoZWNrcyB0byBzZWUgaWYgYW55IG9mIHRoaXMgUHJvY2Vzc29yJ3Mge0BsaW5rICNzdWJQcm9jZXNzb3JzfSBoYXZlDQorICAgKiBhcnJpdmVkIGluIGEgc3RhdGUgd2l0aGluIHRoZSBkb25lIGNhdGVnb3J5LiBJZiBzbyB0aGUgbWV0aG9kIGRldGVybWluZXMgaWYNCisgICAqIGFueSBvZiB0aGUgZG9uZSB7QGxpbmsgI3N1YlByb2Nlc3NvcnN9IGFyZSBpbiBGYWlsdXJlIHN0YXRlLiBJZiBzbywgdGhlDQorICAgKiBtZXRob2QgY29tcGFyZXMgdGhlIG51bWJlciBvZiBGYWlsZWQgc3ViLXByb2Nlc3NvcnMgYWdhaW5zdA0KKyAgICoge0BsaW5rICNtaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29yc30sIGFuZCBpZiBpdCBpcyBncmVhdGVyIHRoYW4gaXQsDQorICAgKiByZXR1cm5zIGEgUmVzdWx0c0ZhaWx1cmUge0BsaW5rIFdvcmtmbG93U3RhdGV9LiBPdGhlcndpc2UsIHRoZSBtZXRob2Qgc2NhbnMNCisgICAqIHRoZSBmYWlsZWQgc3ViLXByb2Nlc3NvcnMsIGFuZCBjaGVja3MgdG8gc2VlIGlmIGFsbCBvZiB0aGVtIGhhdmUgYmVlbg0KKyAgICogZXhjdXNlZC4gSWYgdGhleSBoYXZlbid0LCB0aGVuIGEgUmVzdWx0RmFpbHVyZSBzdGF0ZSBpcyByZXR1cm5lZC4gRmluYWxseSwNCisgICAqIHRoZSBtZXRob2QgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IGFsbCBzdWIgcHJvY2Vzc29ycyBhcmUgaW4gdGhlIGRvbmUNCisgICAqIGNhdGVnb3J5LiBJZiB0aGV5IGFyZSwgYSBSZXN1bHRzU3VjY2VzcyB7QGxpbmsgV29ya2Zsb3dTdGF0ZX0gaXMgcmV0dXJuZWQsDQorICAgKiBvdGhlcndpc2UsIGEgUmVzdWx0c0JhaWwgc3RhdGUgaXMgcmV0dXJuZWQuDQorICAgKiANCisgICAqIEByZXR1cm4gQSB7QGxpbmsgV29ya2Zsb3dTdGF0ZX0sIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIGRlc2NyaXB0aW9uLg0KKyAgICovDQorICBwcm90ZWN0ZWQgV29ya2Zsb3dTdGF0ZSBpc0RvbmUoKSB7DQorICAgIGlmICh0aGlzLmhlbHBlci5jb250YWluc0NhdGVnb3J5KHRoaXMuZ2V0U3ViUHJvY2Vzc29ycygpLCAiZG9uZSIpKSB7DQorICAgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gZmFpbGVkU3ViUHJvY2Vzc29ycyA9IHRoaXMuaGVscGVyDQorICAgICAgICAgIC5nZXRXb3JrZmxvd1Byb2Nlc3NvcnNCeVN0YXRlKHRoaXMuZ2V0U3ViUHJvY2Vzc29ycygpLCAiRmFpbHVyZSIpOw0KKyAgICAgIGlmICh0aGlzLm1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzICE9IC0xDQorICAgICAgICAgICYmIGZhaWxlZFN1YlByb2Nlc3NvcnMuc2l6ZSgpID4gKHRoaXMuZ2V0U3ViUHJvY2Vzc29ycygpLnNpemUoKSAtIHRoaXMubWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMpKQ0KKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZU1hbmFnZXIuZ2V0RGVmYXVsdExpZmVjeWNsZSgpLmNyZWF0ZVN0YXRlKA0KKyAgICAgICAgICAgICJSZXN1bHRzRmFpbHVyZSIsICJyZXN1bHRzIiwNCisgICAgICAgICAgICAiTW9yZSB0aGFuIHRoZSBhbGxvd2VkIG51bWJlciBvZiBzdWItcHJvY2Vzc29ycyBmYWlsZWQiKTsNCisgICAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHN1YlByb2Nlc3NvciA6IGZhaWxlZFN1YlByb2Nlc3NvcnMpIHsNCisgICAgICAgIGlmICghdGhpcy5nZXRFeGN1c2VkU3ViUHJvY2Vzc29ySWRzKCkuY29udGFpbnMoDQorICAgICAgICAgICAgc3ViUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRJZCgpKSkgew0KKyAgICAgICAgICByZXR1cm4gbGlmZWN5Y2xlTWFuYWdlci5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuY3JlYXRlU3RhdGUoDQorICAgICAgICAgICAgICAiUmVzdWx0c0ZhaWx1cmUiLA0KKyAgICAgICAgICAgICAgInJlc3VsdHMiLA0KKyAgICAgICAgICAgICAgIlN1YiBwcm9jZXNzb3I6IFsiICsgc3ViUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRJZCgpDQorICAgICAgICAgICAgICAgICAgKyAiXSBmYWlsZWQuIik7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmICh0aGlzLmhlbHBlcg0KKyAgICAgICAgICAuYWxsUHJvY2Vzc29yc1NhbWVDYXRlZ29yeSh0aGlzLmdldFN1YlByb2Nlc3NvcnMoKSwgImRvbmUiKSkNCisgICAgICAgIHJldHVybiBsaWZlY3ljbGVNYW5hZ2VyLmdldERlZmF1bHRMaWZlY3ljbGUoKS5jcmVhdGVTdGF0ZSgNCisgICAgICAgICAgICAiUmVzdWx0c1N1Y2Nlc3MiLA0KKyAgICAgICAgICAgICJyZXN1bHRzIiwNCisgICAgICAgICAgICAiV29ya2Zsb3cgUHJvY2Vzc29yOiBwcm9jZXNzaW5nIGluc3RhbmNlIGlkOiBbIg0KKyAgICAgICAgICAgICAgICArIHdvcmtmbG93SW5zdGFuY2UuZ2V0SWQoKSArICJdIGlzIERvbmUuIik7DQorICAgIH0NCisgICAgcmV0dXJuIGxpZmVjeWNsZU1hbmFnZXIuZ2V0RGVmYXVsdExpZmVjeWNsZSgpLmNyZWF0ZVN0YXRlKA0KKyAgICAgICAgIlJlc3VsdHNCYWlsIiwNCisgICAgICAgICJyZXN1bHRzIiwNCisgICAgICAgICJBbGwgc3ViLXByb2Nlc3NvcnMgZm9yIFdvcmtmbG93IFByb2Nlc3NvciBoYW5kbGluZyB3b3JrZmxvdyBpZDogWyINCisgICAgICAgICAgICArIHdvcmtmbG93SW5zdGFuY2UuZ2V0SWQoKSArICJdIGFyZSAiICsgIm5vdCBjb21wbGV0ZSIpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBUaGlzIGlzIHRoZSBjb3JlIG1ldGhvZCBvZiB0aGUgV29ya2Zsb3dQcm9jZXNzb3IgY2xhc3MgaW4gdGhlIG5ldyBXZW5naW5lDQorICAgKiBzdHlsZSB3b3JrZmxvd3MuIEluc3RlYWQgb2YgcmVxdWlyaW5nIHRoYXQgYSBwcm9jZXNzb3IgYWN0dWFsbHkgd2Fsaw0KKyAgICogdGhyb3VnaCB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya2Zsb3d9LCB0aGVzZSBzdHlsZSBXb3JrZmxvd1Byb2Nlc3NvcnMNCisgICAqIGFjdHVhbGx5IHJlcXVpcmUgdGhlaXIgaW1wbGVtZW50aW5nIHN1Yi1jbGFzc2VzIHRvIHJldHVybiB0aGUgY3VycmVudCBzZXQNCisgICAqIG9mIFJ1bm5hYmxlIHN1Yi1wcm9jZXNzb3JzICh3aGljaCBjb3VsZCBiZSB0YXNrcywgY29uZGl0aW9ucywgZXZlbg0KKyAgICoge0BsaW5rIFdvcmtmbG93fXMgdGhlbXNlbHZlcy4NCisgICAqIA0KKyAgICogVGhlIFBhcmFsbGVsIHN1Yi1jbGFzcyByZXR1cm5zIGEgbGlzdCBvZiB0YXNrIG9yIGNvbmRpdGlvbiBwcm9jZXNzb3JzIHRoYXQNCisgICAqIGFyZSBhYmxlIHRvIHJ1biBhdCBhIGdpdmVuIHRpbWUuIFRoZSBTZXF1ZW50aWFsIHN1Yi1jbGFzcyByZXR1cm5zIG9ubHkgYQ0KKyAgICogc2luZ2xlIHRhc2sgb3IgY29uZGl0aW9uIHByb2Nlc3NvciB0byBydW4sIGFuZCBzbyBmb3J0aC4NCisgICAqIA0KKyAgICogQHJldHVybiBUaGUgbGlzdCBvZiBXb3JrZmxvd1Byb2Nlc3NvcnMgYWJsZSB0byBjdXJyZW50bHkgcnVuLg0KKyAgICovDQorICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gZ2V0UnVubmFibGVTdWJQcm9jZXNzb3JzKCk7DQorDQorICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVTdWJQcm9jZXNzb3JNZXRhZGF0YSgNCisgICAgICBXb3JrZmxvd1Byb2Nlc3NvciB3b3JrZmxvd1Byb2Nlc3Nvcik7DQorDQorfQ0KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JCdWlsZGVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcHJvY2Vzc29yL1dvcmtmbG93UHJvY2Vzc29yQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjY4YWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcHJvY2Vzc29yL1dvcmtmbG93UHJvY2Vzc29yQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yOworCisvL0pESyBpbW9ydHMKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIAorICogQnVpbGRzIHtAbGluayBXb3JrZmxvd1Byb2Nlc3Nvcn1zLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dQcm9jZXNzb3JCdWlsZGVyIHsKKworICBwcml2YXRlIFN0cmluZyBpZDsKKyAgcHJpdmF0ZSBkb3VibGUgcHJpb3JpdHk7CisgIHByaXZhdGUgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gc3ViUHJvY2Vzc29yczsKKyAgcHJpdmF0ZSBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlTWFuYWdlcjsKKyAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdGFuY2U7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Byb2Nlc3NvckJ1aWxkZXIoKSB7CisgICAgc3ViUHJvY2Vzc29ycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHRoaXMuaWQgPSBudWxsOworICAgIHRoaXMucHJpb3JpdHkgPSAtMTsKKyAgICB0aGlzLmxpZmVjeWNsZU1hbmFnZXIgPSBudWxsOworICAgIHRoaXMud29ya2Zsb3dJbnN0YW5jZSA9IG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFdvcmtmbG93UHJvY2Vzc29yQnVpbGRlciBhV29ya2Zsb3dQcm9jZXNzb3IoKSB7CisgICAgcmV0dXJuIG5ldyBXb3JrZmxvd1Byb2Nlc3NvckJ1aWxkZXIoKTsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvckJ1aWxkZXIgd2l0aElkKFN0cmluZyBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvckJ1aWxkZXIgd2l0aExpZmVjeWNsZU1hbmFnZXIoCisgICAgICBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlTWFuYWdlcikgeworICAgIHRoaXMubGlmZWN5Y2xlTWFuYWdlciA9IGxpZmVjeWNsZU1hbmFnZXI7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dQcm9jZXNzb3JCdWlsZGVyIHdpdGhQcmlvcml0eShkb3VibGUgcHJpb3JpdHkpIHsKKyAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dQcm9jZXNzb3JCdWlsZGVyIHdpdGhJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdGFuY2UpIHsKKyAgICB0aGlzLndvcmtmbG93SW5zdGFuY2UgPSB3b3JrZmxvd0luc3RhbmNlOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIFdvcmtmbG93UHJvY2Vzc29yQnVpbGRlciB3aXRoKFdvcmtmbG93UHJvY2Vzc29yQnVpbGRlciB3cGIsCisgICAgICBDbGFzczw/IGV4dGVuZHMgV29ya2Zsb3dQcm9jZXNzb3I+IGNsYXp6KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgIHN1YlByb2Nlc3NvcnMuYWRkKHdwYi5idWlsZChjbGF6eikpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIFdvcmtmbG93UHJvY2Vzc29yIGJ1aWxkKENsYXNzPD8gZXh0ZW5kcyBXb3JrZmxvd1Byb2Nlc3Nvcj4gY2xhenopCisgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sCisgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBXb3JrZmxvd1Byb2Nlc3Nvcj4gY2xhenpDb25zdHJ1Y3RvciA9IGNsYXp6CisgICAgICAgIC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2UuY2xhc3MgfSk7CisgICAgV29ya2Zsb3dQcm9jZXNzb3Igd3AgPSBjbGF6ekNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMubGlmZWN5Y2xlTWFuYWdlciwKKyAgICAgICAgdGhpcy53b3JrZmxvd0luc3RhbmNlKTsKKyAgICBpZiAodGhpcy5pZCAhPSBudWxsKQorICAgICAgd3AuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLnNldElkKGlkKTsKKyAgICBpZiAodGhpcy5wcmlvcml0eSAhPSAtMSkKKyAgICAgIHdwLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRQcmlvcml0eShQcmlvcml0eS5nZXRQcmlvcml0eShwcmlvcml0eSkpOworICAgIGlmICh0aGlzLnN1YlByb2Nlc3NvcnMgIT0gbnVsbCkKKyAgICAgIHdwLnNldFN1YlByb2Nlc3NvcnMoc3ViUHJvY2Vzc29ycyk7CisgICAgaWYgKHRoaXMud29ya2Zsb3dJbnN0YW5jZSAhPSBudWxsKXsKKyAgICAgIHdwLnNldFdvcmtmbG93SW5zdGFuY2Uod29ya2Zsb3dJbnN0YW5jZSk7CisgICAgfQorICAgIHJldHVybiB3cDsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JIZWxwZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OTE4MDYwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9Xb3JrZmxvd1Byb2Nlc3NvckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmV4ZWMuRXhlY0hlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5QYXJlbnRDaGlsZFdvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLyoqCisgKiAKKyAqIFV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIFdvcmtmbG93UHJvY2Vzc29ycyBhbmQgV29ya2Zsb3dNb2RlbHMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KKy8vVE9ETzogZ28gdGhyb3VnaCBtZSBhbmQgZmluZCBhbGwgdGhlIG1ldGhvZHMgdGhhdCBhcmVuJ3QgdXNlZCBhbmQgcmVtb3ZlIHRoZW0KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1Byb2Nlc3NvckhlbHBlciB7CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlOworICAKKyAgcHVibGljIFdvcmtmbG93UHJvY2Vzc29ySGVscGVyKCl7CisgICAgdGhpcyhudWxsKTsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvckhlbHBlcihXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlKSB7CisgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFdvcmtmbG93UHJvY2Vzc29yIHNrZWxldG9uKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKHNrZWxldG9uLCAiXG4gICAiKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFdvcmtmbG93UHJvY2Vzc29yIHNrZWxldG9uLCBTdHJpbmcgaW5kZW50KSB7CisgICAgU3RyaW5nQnVmZmVyIHN0cmluZ01vZGVsID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgIlsiCisgICAgICAgICAgICArIChza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpLmdldElkKCkgPT0gbnVsbCA/ICIiCisgICAgICAgICAgICAgICAgOiAiaWQgPSAnIgorICAgICAgICAgICAgICAgICAgICArIHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgICsgIicsIG5hbWUgPSAnIgorICAgICAgICAgICAgICAgICAgICArIHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkgKyAiJywgIikKKyAgICAgICAgICAgICsgImV4ZWN1dGlvbiA9ICciCisgICAgICAgICAgICArIHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkKKyAgICAgICAgICAgICAgICAuZ2V0R3JhcGgoKS5nZXRFeGVjdXRpb25UeXBlKCkgKyAiJywgc3RhdGUgPSAnIgorICAgICAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKS5nZXROYW1lKCkgKyAiJ10iKTsvLyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMKKyAgICAvLyA9CisgICAgLy8gIiArIHByb2Nlc3Nvci5nZXRTdGF0aWNNZXRhZGF0YSgpLmFzSGFzaHRhYmxlKCkgKyAiXSIpOworICAgIGlmIChza2VsZXRvbi5nZXRQcmVDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgIHN0cmluZ01vZGVsLmFwcGVuZChpbmRlbnQgKyAie1ByZUNvbmQ6IiArIGluZGVudCArICIgICAiCisgICAgICAgICAgKyB0b1N0cmluZyhza2VsZXRvbi5nZXRQcmVDb25kaXRpb25zKCksIGluZGVudCArICIgICAgICAiKSArICJ9Iik7CisgICAgaWYgKHNrZWxldG9uLmdldFBvc3RDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgIHN0cmluZ01vZGVsLmFwcGVuZChpbmRlbnQgKyAie1Bvc3RDb25kOiIgKyBpbmRlbnQgKyAiICAgIgorICAgICAgICAgICsgdG9TdHJpbmcoc2tlbGV0b24uZ2V0UG9zdENvbmRpdGlvbnMoKSwgaW5kZW50ICsgIiAgICAgICIpICsgIn0iKTsKKyAgICBpZiAoc2tlbGV0b24uZ2V0U3ViUHJvY2Vzc29ycygpICE9IG51bGwpCisgICAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHN1YlByb2Nlc3NvciA6IHNrZWxldG9uLmdldFN1YlByb2Nlc3NvcnMoKSkKKyAgICAgICAgc3RyaW5nTW9kZWwuYXBwZW5kKGluZGVudCArIHRvU3RyaW5nKHN1YlByb2Nlc3NvciwgaW5kZW50ICsgIiAgICIpKTsKKyAgICByZXR1cm4gc3RyaW5nTW9kZWwudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpYmUoV29ya2Zsb3dQcm9jZXNzb3Igc2tlbGV0b24pIHsKKyAgICBTdHJpbmdCdWZmZXIgc3RyaW5nTW9kZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICBzdHJpbmdNb2RlbC5hcHBlbmQoIlByb2Nlc3NvciBbaWQgPSAnIgorICAgICAgICArIHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0SWQoKQorICAgICAgICArICInLCBuYW1lID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpLmdldE5hbWUoKQorICAgICAgICArICInXVxuIik7CisgICAgc3RyaW5nTW9kZWwuYXBwZW5kKCIgICAtIGluc3RhbmNlID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0SWQoKSArICInXG4iKTsKKyAgICBzdHJpbmdNb2RlbC5hcHBlbmQoIiAgIC0gZXhlY3V0aW9uID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpLmdldEdyYXBoKCkKKyAgICAgICAgICAgIC5nZXRFeGVjdXRpb25UeXBlKCkgKyAiJ1xuIik7CisgICAgc3RyaW5nTW9kZWwuYXBwZW5kKCIgICAtIHRpbWVzQmxvY2tlZCA9ICciCisgICAgICAgICsgc2tlbGV0b24uZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFRpbWVzQmxvY2tlZCgpICsgIidcbiIpOworICAgIHN0cmluZ01vZGVsLmFwcGVuZCgiICAgLSBkYXRlczogXG4iKTsKKyAgICBzdHJpbmdNb2RlbC5hcHBlbmQoIiAgICAgICAgQ3JlYXRpb25EYXRlID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhcnREYXRlKCkgKyAiJ1xuIik7CisgICAgc3RyaW5nTW9kZWwuYXBwZW5kKCIgICAgICAgIENvbXBsZXRpb25EYXRlID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0RW5kRGF0ZSgpICsgIidcbiIpOworICAgIHN0cmluZ01vZGVsLmFwcGVuZCgiICAgLSBzdGF0ZTogXG4iKTsKKyAgICBzdHJpbmdNb2RlbC5hcHBlbmQoIiAgICAgICAgbmFtZSA9ICciCisgICAgICAgICsgc2tlbGV0b24uZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFN0YXRlKCkuZ2V0TmFtZSgpICsgIidcbiIpOworICAgIHN0cmluZ01vZGVsLmFwcGVuZCgiICAgICAgICBzdGFydFRpbWUgPSAnIgorICAgICAgICArIHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGF0ZSgpLmdldFN0YXJ0VGltZSgpICsgIidcbiIpOworICAgIHN0cmluZ01vZGVsLmFwcGVuZCgiICAgICAgICBtZXNzYWdlID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKS5nZXRNZXNzYWdlKCkgKyAiJ1xuIik7CisgICAgc3RyaW5nTW9kZWwuYXBwZW5kKCIgICAtIHByaW9yaXR5ID0gJyIKKyAgICAgICAgKyBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UHJpb3JpdHkoKSArICInXG4iKTsKKyAgICBzdHJpbmdNb2RlbAorICAgICAgICAuYXBwZW5kKCIgICAtIGV4ZWN1c2VkU3ViUHJvY2Vzc29ycyA9ICciCisgICAgICAgICAgICArIFN0cmluZ1V0aWxzLmpvaW4oc2tlbGV0b24uZ2V0RXhjdXNlZFN1YlByb2Nlc3NvcklkcygpLml0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgIiwiKSArICInXG4iKTsKKyAgICBzdHJpbmdNb2RlbC5hcHBlbmQoIiAgIC0gc3RhdGljIG1ldGFkYXRhID0gXG4iKTsKKyAgICBmb3IgKFN0cmluZyBrZXkgOiBza2VsZXRvbi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U2hhcmVkQ29udGV4dCgpCisgICAgICAgIC5nZXRBbGxLZXlzKCkpCisgICAgICBzdHJpbmdNb2RlbC5hcHBlbmQoIiAgICAgICsgIgorICAgICAgICAgICsga2V5CisgICAgICAgICAgKyAiIC0+ICciCisgICAgICAgICAgKyBTdHJpbmdVdGlscy5qb2luKHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTaGFyZWRDb250ZXh0KCkKKyAgICAgICAgICAgICAgLmdldEFsbE1ldGFkYXRhKGtleSksICIsIikgKyAiJ1xuIik7CisgICAgc3RyaW5nTW9kZWwuYXBwZW5kKCIgICAtIGR5bmFtaWMgbWV0YWRhdGEgPSBcbiIpOworICAgIGZvciAoU3RyaW5nIGtleSA6IHNrZWxldG9uLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTaGFyZWRDb250ZXh0KCkKKyAgICAgICAgLmdldEFsbEtleXMoKSkKKyAgICAgIHN0cmluZ01vZGVsLmFwcGVuZCgiICAgICAgKyAiCisgICAgICAgICAgKyBrZXkKKyAgICAgICAgICArICIgLT4gJyIKKyAgICAgICAgICArIFN0cmluZ1V0aWxzLmpvaW4oc2tlbGV0b24uZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFNoYXJlZENvbnRleHQoKQorICAgICAgICAgICAgICAuZ2V0QWxsTWV0YWRhdGEoa2V5KSwgIiwiKSArICInXG4iKTsKKyAgICByZXR1cm4gc3RyaW5nTW9kZWwudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvciBidWlsZFByb2Nlc3NvcihTdHJpbmcgaW5zdGFuY2VJZCwKKyAgICAgIFBhcmVudENoaWxkV29ya2Zsb3cgd29ya2Zsb3csCisgICAgICBNYXA8U3RyaW5nLCBDbGFzczw/IGV4dGVuZHMgV29ya2Zsb3dQcm9jZXNzb3I+PiBtb2RlbFRvUHJvY2Vzc29yTWFwLAorICAgICAgYm9vbGVhbiBwcmVDb25kKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBzdWJQcm9jZXNzb3JzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgICBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBjb25kaXRpb25zID0gcHJlQ29uZCA/IHdvcmtmbG93LmdldFByZUNvbmRpdGlvbnMoKQorICAgICAgICA6IHdvcmtmbG93LmdldFBvc3RDb25kaXRpb25zKCk7CisgICAgZm9yIChXb3JrZmxvd0NvbmRpdGlvbiBjb25kIDogY29uZGl0aW9ucykgeworICAgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyBjb25kV29ya2Zsb3cgPSBuZXcgUGFyZW50Q2hpbGRXb3JrZmxvdyhuZXcgR3JhcGgoKSk7CisgICAgICBjb25kV29ya2Zsb3cuZ2V0R3JhcGgoKS5zZXRFeGVjdXRpb25UeXBlKCJjb25kaXRpb24iKTsKKyAgICAgIGNvbmRXb3JrZmxvdy5nZXRHcmFwaCgpLnNldENvbmQoY29uZCk7CisgICAgICBzdWJQcm9jZXNzb3JzLmFkZChidWlsZFByb2Nlc3NvcihpbnN0YW5jZUlkLCBjb25kV29ya2Zsb3csCisgICAgICAgICAgbW9kZWxUb1Byb2Nlc3Nvck1hcCwgcHJlQ29uZCkpOworICAgIH0KKyAgICBXb3JrZmxvd1Byb2Nlc3NvciB3cCA9IGJ1aWxkUHJvY2Vzc29yKGluc3RhbmNlSWQsIHdvcmtmbG93LCB3b3JrZmxvdworICAgICAgICAuZ2V0R3JhcGgoKS5pc0NvbmRpdGlvbigpLCBtb2RlbFRvUHJvY2Vzc29yTWFwKTsKKyAgICB3cC5zZXRTdWJQcm9jZXNzb3JzKHN1YlByb2Nlc3NvcnMpOworICAgIHJldHVybiB3cDsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvciBidWlsZFByb2Nlc3NvcihTdHJpbmcgaW5zdGFuY2VJZCwKKyAgICAgIFBhcmVudENoaWxkV29ya2Zsb3cgbW9kZWwsIGJvb2xlYW4gaXNDb25kaXRpb24sCisgICAgICBNYXA8U3RyaW5nLCBDbGFzczw/IGV4dGVuZHMgV29ya2Zsb3dQcm9jZXNzb3I+PiBtb2RlbFRvUHJvY2Vzc29yTWFwKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgV29ya2Zsb3dQcm9jZXNzb3Igd3AgPSBtb2RlbFRvUHJvY2Vzc29yTWFwLmdldCgKKyAgICAgICAgbW9kZWwuZ2V0R3JhcGgoKS5nZXRFeGVjdXRpb25UeXBlKCkpLm5ld0luc3RhbmNlKCk7CisgICAgV29ya2Zsb3dMaWZlY3ljbGUgd0xpZmVjeWNsZSA9IGdldExpZmVjeWNsZShtb2RlbCk7CisgICAgLy8gRklYTUU6IEknbSBub3Qgc3VyZSB3aGF0IHRoZXNlIGV4Y3VzZWQgcHJvY2Vzc29yIElkcyBhcmUuIEkgZGlkbid0IHNlZW0KKyAgICAvLyBuZWVkIHRoZW0gaW4gdGhlIFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5LCBzbyBub3Qgc3VyZSB3aGF0IHRoZXkgZG8uCisgICAgLy8gd3Auc2V0RXhjdXNlZFN1YlByb2Nlc3Nvcklkcyhtb2RlbC5nZXRHcmFwaCgpLmdldEV4Y3VzZWRTdWJQcm9jZXNzb3JJZHMoKSk7CisgICAgd3AuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLnNldElkKGluc3RhbmNlSWQpOworICAgIGlmIChtb2RlbC5nZXRQcmVDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgIHdwLnNldFByZUNvbmRpdGlvbnMoYnVpbGRQcm9jZXNzb3IoaW5zdGFuY2VJZCwgbW9kZWwsCisgICAgICAgICAgbW9kZWxUb1Byb2Nlc3Nvck1hcCwgdHJ1ZSkpOworICAgIGlmIChtb2RlbC5nZXRQb3N0Q29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICB3cC5zZXRQb3N0Q29uZGl0aW9ucyhidWlsZFByb2Nlc3NvcihpbnN0YW5jZUlkLCBtb2RlbCwKKyAgICAgICAgICBtb2RlbFRvUHJvY2Vzc29yTWFwLCBmYWxzZSkpOworICAgIHdwLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRQcmlvcml0eShQcmlvcml0eS5nZXREZWZhdWx0KCkpOworICAgIHdwLnNldE1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzKEludGVnZXIucGFyc2VJbnQobW9kZWwuZ2V0R3JhcGgoKQorICAgICAgICAuZ2V0TWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMoKSkpOworICAgIHdwLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTaGFyZWRDb250ZXh0KG5ldyBNZXRhZGF0YSgpKTsKKyAgICB3cC5nZXRXb3JrZmxvd0luc3RhbmNlKCkuc2V0U3RhdGUoCisgICAgICAgIHdMaWZlY3ljbGUuY3JlYXRlU3RhdGUoIkxvYWRlZCIsCisgICAgICAgICAgICB3TGlmZWN5Y2xlLmdldFN0YWdlRm9yV29ya2Zsb3coIkxvYWRlZCIpLmdldE5hbWUoKSwgIiIpKTsKKyAgICBpZiAod3AgaW5zdGFuY2VvZiBUYXNrUHJvY2Vzc29yKQorICAgICAgKChUYXNrUHJvY2Vzc29yKSB3cCkKKyAgICAgICAgICAuc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3M8PyBleHRlbmRzIFdvcmtmbG93VGFza0luc3RhbmNlPikgQ2xhc3MKKyAgICAgICAgICAgICAgLmZvck5hbWUobW9kZWwuZ2V0R3JhcGgoKS5nZXRUYXNrKCkuZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkpKTsKKyAgICByZXR1cm4gd3A7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dQcm9jZXNzb3IgZmluZFNrZWxldG9uKFdvcmtmbG93UHJvY2Vzc29yIHNrZWxldG9uLAorICAgICAgU3RyaW5nIG1vZGVsSWQpIHsKKyAgICBpZiAoc2tlbGV0b24uZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRHcmFwaCgpCisgICAgICAgIC5nZXRNb2RlbElkKCkuZXF1YWxzKG1vZGVsSWQpKQorICAgICAgcmV0dXJuIHNrZWxldG9uOworICAgIFdvcmtmbG93UHJvY2Vzc29yIGZvdW5kID0gZmluZFNrZWxldG9uKHNrZWxldG9uLmdldFN1YlByb2Nlc3NvcnMoKSwgbW9kZWxJZCk7CisgICAgaWYgKGZvdW5kID09IG51bGwpIHsKKyAgICAgIGlmIChza2VsZXRvbi5nZXRQcmVDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgICAgZm91bmQgPSBmaW5kU2tlbGV0b24oc2tlbGV0b24uZ2V0UHJlQ29uZGl0aW9ucygpLCBtb2RlbElkKTsKKyAgICAgIGlmIChmb3VuZCA9PSBudWxsICYmIHNrZWxldG9uLmdldFBvc3RDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgICAgZm91bmQgPSBmaW5kU2tlbGV0b24oc2tlbGV0b24uZ2V0UG9zdENvbmRpdGlvbnMoKSwgbW9kZWxJZCk7CisgICAgfQorICAgIHJldHVybiBmb3VuZDsKKyAgfQorCisgIHByb3RlY3RlZCBXb3JrZmxvd1Byb2Nlc3NvciBmaW5kU2tlbGV0b24oTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gc2tlbGV0b25zLAorICAgICAgU3RyaW5nIG1vZGVsSWQpIHsKKyAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHNrZWxldG9uIDogc2tlbGV0b25zKSB7CisgICAgICBpZiAoc2tlbGV0b24uZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRJZCgpCisgICAgICAgICAgLmVxdWFscyhtb2RlbElkKSkgeworICAgICAgICByZXR1cm4gc2tlbGV0b247CisgICAgICB9IGVsc2UgeworICAgICAgICBza2VsZXRvbiA9IGZpbmRTa2VsZXRvbihza2VsZXRvbiwgbW9kZWxJZCk7CisgICAgICAgIGlmIChza2VsZXRvbiAhPSBudWxsKQorICAgICAgICAgIHJldHVybiBza2VsZXRvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dQcm9jZXNzb3IgZmluZFByb2Nlc3NvcihXb3JrZmxvd1Byb2Nlc3NvciB3cCwgU3RyaW5nIG1vZGVsSWQpIHsKKyAgICBpZiAod3AuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRJZCgpCisgICAgICAgIC5lcXVhbHMobW9kZWxJZCkpCisgICAgICByZXR1cm4gd3A7CisgICAgV29ya2Zsb3dQcm9jZXNzb3IgZm91bmQgPSBmaW5kUHJvY2Vzc29yKHdwLmdldFN1YlByb2Nlc3NvcnMoKSwgbW9kZWxJZCk7CisgICAgaWYgKGZvdW5kID09IG51bGwpIHsKKyAgICAgIGlmICh3cC5nZXRQcmVDb25kaXRpb25zKCkgIT0gbnVsbCkKKyAgICAgICAgZm91bmQgPSBmaW5kUHJvY2Vzc29yKHdwLmdldFByZUNvbmRpdGlvbnMoKSwgbW9kZWxJZCk7CisgICAgICBpZiAoZm91bmQgPT0gbnVsbCAmJiB3cC5nZXRQb3N0Q29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICAgIGZvdW5kID0gZmluZFByb2Nlc3Nvcih3cC5nZXRQb3N0Q29uZGl0aW9ucygpLCBtb2RlbElkKTsKKyAgICB9CisgICAgcmV0dXJuIGZvdW5kOworICB9CisKKyAgcHJvdGVjdGVkIFdvcmtmbG93UHJvY2Vzc29yIGZpbmRQcm9jZXNzb3IoTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gcHJvY2Vzc29ycywKKyAgICAgIFN0cmluZyBtb2RlbElkKSB7CisgICAgZm9yIChXb3JrZmxvd1Byb2Nlc3NvciBwcm9jZXNzb3IgOiBwcm9jZXNzb3JzKSB7CisgICAgICBpZiAocHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRJZCgpLmVxdWFscyhtb2RlbElkKSkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc29yOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvY2Vzc29yID0gZmluZFByb2Nlc3Nvcihwcm9jZXNzb3IsIG1vZGVsSWQpOworICAgICAgICBpZiAocHJvY2Vzc29yICE9IG51bGwpCisgICAgICAgICAgcmV0dXJuIHByb2Nlc3NvcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogVmVyaWZpZXMgdGhhdCBhbGwgcHJvdmlkZWQgV29ya2Zsb3dQcm9jZXNzb3JzIGFyZSBpbiBhIHN0YXRlIGJlbG9uZ2luZyB0bworICAgKiB0aGUgZ2l2ZW4gY2F0ZWdvcnlOYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHdvcmtmbG93UHJvY2Vzc29ycworICAgKiAgICAgICAgICBUaGUge0BsaW5rIExpc3R9IG9mIFdvcmtmbG93UHJvY2Vzc29ycyB0byBpbnNwZWN0LgorICAgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBXb3JrZmxvd1N0YXRlJ3MgY2F0ZWdvcnkgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICogQHJldHVybiBUcnVlIGlmIHRoZXkgYXJlIGFsbCBpbiB0aGUgc2FtZSBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYWxsUHJvY2Vzc29yc1NhbWVDYXRlZ29yeSgKKyAgICAgIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IHdvcmtmbG93UHJvY2Vzc29ycywgU3RyaW5nIGNhdGVnb3J5TmFtZSkgeworICAgIGZvciAoV29ya2Zsb3dQcm9jZXNzb3Igd29ya2Zsb3dQcm9jZXNzb3IgOiB3b3JrZmxvd1Byb2Nlc3NvcnMpCisgICAgICBpZiAoIXdvcmtmbG93UHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGF0ZSgpLmdldENhdGVnb3J5KCkKKyAgICAgICAgICAuZ2V0TmFtZSgpLmVxdWFscyhjYXRlZ29yeU5hbWUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogU3ViLXNlbGVjdHMgYWxsIFdvcmtmbG93UHJvY2Vzc29ycyBwcm92aWRlZCBieSB0aGUgcHJvdmlkZWQgc3RhdGUKKyAgICogaWRlbnRpZmllZCBieSBzdGF0ZU5hbWUuCisgICAqIAorICAgKiBAcGFyYW0gd29ya2Zsb3dQcm9jZXNzb3JzCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgTGlzdH0gb2YgV29ya2Zsb3dQcm9jZXNzb3JzIHRvIHN1YnNldC4KKyAgICogCisgICAqIEBwYXJhbSBzdGF0ZU5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHN0YXRlIHRvIHN1YnNldCBieS4KKyAgICogQHJldHVybiBBIHN1YnNldCB2ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCB7QGxpbmsgTGlzdH0gb2YKKyAgICogICAgICAgICBXb3JrZmxvd1Byb2Nlc3NvcnMuCisgICAqLworICBwdWJsaWMgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gZ2V0V29ya2Zsb3dQcm9jZXNzb3JzQnlTdGF0ZSgKKyAgICAgIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IHdvcmtmbG93UHJvY2Vzc29ycywgU3RyaW5nIHN0YXRlTmFtZSkgeworICAgIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IHJldHVyblByb2Nlc3NvcnMgPSBuZXcgVmVjdG9yPFdvcmtmbG93UHJvY2Vzc29yPigpOworICAgIGZvciAoV29ya2Zsb3dQcm9jZXNzb3Igd29ya2Zsb3dQcm9jZXNzb3IgOiB3b3JrZmxvd1Byb2Nlc3NvcnMpIHsKKyAgICAgIGlmICh3b3JrZmxvd1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKS5lcXVhbHMoc3RhdGVOYW1lKSkgeworICAgICAgICByZXR1cm5Qcm9jZXNzb3JzLmFkZCh3b3JrZmxvd1Byb2Nlc3Nvcik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXR1cm5Qcm9jZXNzb3JzOworICB9CisKKyAgLyoqCisgICAqIFN1Yi1zZWxlY3RzIGFsbCBXb3JrZmxvd1Byb2Nlc3NvcnMgcHJvdmlkZWQgYnkgdGhlIHByb3ZpZGVkIGNhdGVnb3J5CisgICAqIGlkZW50aWZpZWQgYnkgY2F0ZWdvcnlOYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHdvcmtmbG93UHJvY2Vzc29ycworICAgKiAgICAgICAgICBUaGUge0BsaW5rIExpc3R9IG9mIFdvcmtmbG93UHJvY2Vzc29ycyB0byBzdWJzZXQuCisgICAqIAorICAgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeSB0byBzdWJzZXQgYnkuCisgICAqIEByZXR1cm4gQSBzdWJzZXQgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZWQge0BsaW5rIExpc3R9IG9mCisgICAqICAgICAgICAgV29ya2Zsb3dQcm9jZXNzb3JzLgorICAgKi8KKyAgcHVibGljIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IGdldFdvcmtmbG93UHJvY2Vzc29yc0J5Q2F0ZWdvcnkoCisgICAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiB3b3JrZmxvd1Byb2Nlc3NvcnMsIFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKKyAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiByZXR1cm5Qcm9jZXNzb3JzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgICBmb3IgKFdvcmtmbG93UHJvY2Vzc29yIHdvcmtmbG93UHJvY2Vzc29yIDogd29ya2Zsb3dQcm9jZXNzb3JzKSB7CisgICAgICBpZiAod29ya2Zsb3dQcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFN0YXRlKCkuZ2V0Q2F0ZWdvcnkoKQorICAgICAgICAgIC5nZXROYW1lKCkuZXF1YWxzKGNhdGVnb3J5TmFtZSkpIHsKKyAgICAgICAgcmV0dXJuUHJvY2Vzc29ycy5hZGQod29ya2Zsb3dQcm9jZXNzb3IpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0dXJuUHJvY2Vzc29yczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiB0b1Rhc2tzKFdvcmtmbG93UHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IG9wdGlvbnMgPSBuZXcgVmVjdG9yPFdvcmtmbG93UHJvY2Vzc29yPigpOworICAgIG9wdGlvbnMuYWRkKHByb2Nlc3Nvcik7CisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gdGFza3MgPSBuZXcgVmVjdG9yPFdvcmtmbG93UHJvY2Vzc29yPigpOworICAgIHdoaWxlICghb3B0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgIFdvcmtmbG93UHJvY2Vzc29yIGN1cnJlbnRPcHRpb24gPSBvcHRpb25zLnJlbW92ZSgwKTsKKyAgICAgIGlmIChjdXJyZW50T3B0aW9uLmdldFN1YlByb2Nlc3NvcnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgdGFza3MuYWRkKGN1cnJlbnRPcHRpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN1cnJlbnRPcHRpb24uZ2V0UHJlQ29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICAgICAgb3B0aW9ucy5hZGQoY3VycmVudE9wdGlvbi5nZXRQcmVDb25kaXRpb25zKCkpOworICAgICAgICBpZiAoY3VycmVudE9wdGlvbi5nZXRQb3N0Q29uZGl0aW9ucygpICE9IG51bGwpCisgICAgICAgICAgb3B0aW9ucy5hZGQoY3VycmVudE9wdGlvbi5nZXRQb3N0Q29uZGl0aW9ucygpKTsKKyAgICAgICAgZm9yIChXb3JrZmxvd1Byb2Nlc3NvciBwcyA6IGN1cnJlbnRPcHRpb24uZ2V0U3ViUHJvY2Vzc29ycygpKQorICAgICAgICAgIG9wdGlvbnMuYWRkKHBzKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRhc2tzOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnNDYXRlZ29yeShMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiB3b3JrZmxvd1Byb2Nlc3NvcnMsCisgICAgICBTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7CisgICAgZm9yIChXb3JrZmxvd1Byb2Nlc3NvciB3b3JrZmxvd1Byb2Nlc3NvciA6IHdvcmtmbG93UHJvY2Vzc29ycykKKyAgICAgIGlmICh3b3JrZmxvd1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U3RhdGUoKS5nZXRDYXRlZ29yeSgpCisgICAgICAgICAgLmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnlOYW1lKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKKyAgICBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0cnkgeworICAgICAgICBob3N0ID0gRXhlY0hlbHBlci5leGVjKG5ldyBTdHJpbmdbXSB7ICJob3N0bmFtZSIgfSkuZ2V0T3V0cHV0KCkudHJpbSgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisgICAgICB9CisgICAgfQorICAgIGlmIChob3N0ID09IG51bGwpCisgICAgICByZXR1cm4gIlVua25vd24iOworICAgIHJldHVybiBob3N0OworICB9CisgIAorICBwdWJsaWMgV29ya2Zsb3dMaWZlY3ljbGUgZ2V0TGlmZWN5Y2xlRm9yUHJvY2Vzc29yKFdvcmtmbG93UHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIGlmIChwcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpICE9IG51bGwKKyAgICAgICAgJiYgcHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHByb2Nlc3Nvci5nZXRMaWZlY3ljbGVNYW5hZ2VyKCkuZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3coCisgICAgICAgICAgcHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHByb2Nlc3Nvci5nZXRMaWZlY3ljbGVNYW5hZ2VyKCkuZ2V0RGVmYXVsdExpZmVjeWNsZSgpOworICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0xpZmVjeWNsZSBnZXRMaWZlY3ljbGUoUGFyZW50Q2hpbGRXb3JrZmxvdyBtb2RlbCkgeworICAgIHJldHVybiBsaWZlY3ljbGUuZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3cobW9kZWwpICE9IG51bGwgPyBsaWZlY3ljbGUKKyAgICAgICAgLmdldExpZmVjeWNsZUZvcldvcmtmbG93KG1vZGVsKSA6IGxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JMaXN0ZW5lci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9Xb3JrZmxvd1Byb2Nlc3Nvckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjAyYWU2YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuQ2hhbmdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuV29ya2Zsb3dQcm9jZXNzb3I7CisKKy8qKgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+CisgKiBOb3RpZmljYXRpb24gSW50ZXJmYWNlIGZvciBXb3JrZmxvd1Byb2Nlc3NvcnMKKyAqIDxwPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93UHJvY2Vzc29yTGlzdGVuZXIgeworCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlKFdvcmtmbG93UHJvY2Vzc29yIHByb2Nlc3NvciwgQ2hhbmdlVHlwZSBjaGFuZ2VUeXBlKTsKKwkKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3Byb2Nlc3Nvci9Xb3JrZmxvd1Byb2Nlc3NvclF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5NjRmZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9wcm9jZXNzb3IvV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5UYXNrUXVlcmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLkNvbmRpdGlvblRhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlBhcmVudENoaWxkV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5FbmdpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8qKgorICogCisgKiBUaGUgcXVldWUgb2YgYXZhaWxhYmxlIHtAbGluayBXb3JrZmxvd1Rhc2t9cywgdGhhdCB3aWxsIGJlIGZlZCBpbnRvIHRoZQorICoge0BsaW5rIFRhc2tRdWVyaWVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1Byb2Nlc3NvclF1ZXVlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKFdvcmtmbG93UHJvY2Vzc29yUXVldWUuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IHJlcG87CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1JlcG9zaXRvcnkgbW9kZWxSZXBvOworCisgIHByaXZhdGUgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGxpZmVjeWNsZTsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFdvcmtmbG93UHJvY2Vzc29yPiBwcm9jZXNzb3JDYWNoZTsKKworICBwdWJsaWMgV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZShXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSByZXBvLAorICAgICAgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGxpZmVjeWNsZSwgV29ya2Zsb3dSZXBvc2l0b3J5IG1vZGVsUmVwbykgeworICAgIHRoaXMucmVwbyA9IHJlcG87CisgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgICAgdGhpcy5tb2RlbFJlcG8gPSBtb2RlbFJlcG87CisgICAgdGhpcy5wcm9jZXNzb3JDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgV29ya2Zsb3dQcm9jZXNzb3I+KCk7CisgIH0KKworICAvKioKKyAgICogU2hvdWxkIHJldHVybiB0aGUgbGlzdCBvZiBhdmFpbGFibGUsIFF1ZXVlZCwge0BsaW5rIFdvcmtmbG93UHJvY2Vzc29yfXMuCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSwgUXVldWVkLCB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3J9cy4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29ycygpIHsKKyAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgcGFnZSA9IHJlcG8uZ2V0UGFnZWRXb3JrZmxvd3MoMSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gbG9hZCB3b3JrZmxvdyBwcm9jZXNzb3JzOiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBwcm9jZXNzb3JzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oCisgICAgICAgIHBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpICE9IG51bGwgPyBwYWdlLmdldFBhZ2VXb3JrZmxvd3MoKS5zaXplKCkgOiAwKTsKKyAgICBmb3IgKFdvcmtmbG93SW5zdGFuY2UgaW5zdCA6IChMaXN0PFdvcmtmbG93SW5zdGFuY2U+KSAoTGlzdDw/PikgcGFnZQorICAgICAgICAuZ2V0UGFnZVdvcmtmbG93cygpKSB7CisgICAgICBpZiAoIWluc3QuZ2V0U3RhdGUoKS5nZXRDYXRlZ29yeSgpLmdldE5hbWUoKS5lcXVhbHMoImRvbmUiKSkgeworICAgICAgICBXb3JrZmxvd1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgIHByb2Nlc3NvciA9IGZyb21Xb3JrZmxvd0luc3RhbmNlKGluc3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNvbnZlcnQgd29ya2Zsb3cgaW5zdGFuY2U6IFsiICsgaW5zdC5nZXRJZCgpCisgICAgICAgICAgICAgICAgICArICJdIGludG8gV29ya2Zsb3dQcm9jZXNzb3I6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKQorICAgICAgICAgIHByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2Nlc3NvcnM7CisgIH0KKyAgCisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBlcnNpc3QoV29ya2Zsb3dJbnN0YW5jZSBpbnN0KSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChpbnN0LmdldElkKCkgPT0gbnVsbAorICAgICAgICAgIHx8IChpbnN0LmdldElkKCkgIT0gbnVsbCAmJiBpbnN0LmdldElkKCkuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgLy8gd2UgaGF2ZSB0byBwZXJzaXN0IGl0IGJ5IGFkZGluZyBpdAorICAgICAgICAvLyByYXRoZXIgdGhhbiB1cGRhdGluZyBpdAorICAgICAgICByZXBvLmFkZFdvcmtmbG93SW5zdGFuY2UoaW5zdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBwZXJzaXN0IGJ5IHVwZGF0ZQorICAgICAgICByZXBvLnVwZGF0ZVdvcmtmbG93SW5zdGFuY2UoaW5zdCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVuYWJsZSB0byB1cGRhdGUgd29ya2Zsb3cgaW5zdGFuY2U6IFsiICsgaW5zdC5nZXRJZCgpCisgICAgICAgICAgICAgICsgIl0gd2l0aCBzdGF0dXM6IFsiICsgaW5zdC5nZXRTdGF0ZSgpLmdldE5hbWUoKSArICJdOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfSAgCisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Byb2Nlc3NvciBmcm9tV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIGluc3QpCisgICAgICB0aHJvd3MgRW5naW5lRXhjZXB0aW9uIHsKKyAgICBXb3JrZmxvd1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworICAgIGlmIChwcm9jZXNzb3JDYWNoZS5jb250YWluc0tleShpbnN0LmdldElkKCkpKSB7CisgICAgICByZXR1cm4gcHJvY2Vzc29yQ2FjaGUuZ2V0KGluc3QuZ2V0SWQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRHcmFwaCgpID09IG51bGwpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAiVW5hYmxlIHRvIHByb2Nlc3MgR3JhcGggZm9yIHdvcmtmbG93IGluc3RhbmNlOiBbIiArIGluc3QuZ2V0SWQoKQorICAgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvcjsKKyAgICAgIH0KKworICAgICAgaWYgKGlzQ29tcG9zaXRlUHJvY2Vzc29yKGluc3QpKSB7CisgICAgICAgIHByb2Nlc3NvciA9IGdldFByb2Nlc3NvckZyb21JbnN0YW5jZUdyYXBoKGluc3QsIGxpZmVjeWNsZSk7CisgICAgICAgIFdvcmtmbG93U3RhdGUgcHJvY2Vzc29yU3RhdGUgPSBnZXRMaWZlY3ljbGUoCisgICAgICAgICAgICBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKSkuY3JlYXRlU3RhdGUoCisgICAgICAgICAgICAiTG9hZGVkIiwKKyAgICAgICAgICAgICJpbml0aWFsIiwKKyAgICAgICAgICAgICJTZXF1ZW50aWFsIFdvcmtmbG93IGluc3RhbmNlIHdpdGggaWQ6IFsiICsgaW5zdC5nZXRJZCgpCisgICAgICAgICAgICAgICAgKyAiXSBsb2FkZWQgYnkgcHJvY2Vzc29yIHF1ZXVlLiIpOworICAgICAgICBpbnN0LnNldFN0YXRlKHByb2Nlc3NvclN0YXRlKTsKKyAgICAgICAgcGVyc2lzdChpbnN0KTsKKworICAgICAgICAvLyBoYW5kbGUgaXRzIHByZS1jb25kaXRpb25zCisgICAgICAgIGZvciAoV29ya2Zsb3dDb25kaXRpb24gY29uZCA6IGluc3QuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpCisgICAgICAgICAgICAuZ2V0UHJlQ29uZGl0aW9ucygpKSB7CisgICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgICAgICAgV29ya2Zsb3dTdGF0ZSBjb25kV29ya2Zsb3dTdGF0ZSA9IGxpZmVjeWNsZQorICAgICAgICAgICAgICAuZ2V0RGVmYXVsdExpZmVjeWNsZSgpCisgICAgICAgICAgICAgIC5jcmVhdGVTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICJOdWxsIiwKKyAgICAgICAgICAgICAgICAgICJpbml0aWFsIiwKKyAgICAgICAgICAgICAgICAgICJTdWIgUHJlIENvbmRpdGlvbiBXb3JrZmxvdyBjcmVhdGVkIGJ5IFdvcmtmbG93IFByb2Nlc3NvciBRdWV1ZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICArICJbIiArIGluc3QuZ2V0SWQoKSArICJdIik7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0U3RhdGUoY29uZFdvcmtmbG93U3RhdGUpOworICAgICAgICAgIGluc3RhbmNlLnNldFByaW9yaXR5KGluc3QuZ2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgV29ya2Zsb3dUYXNrIGNvbmRpdGlvblRhc2sgPSB0b0NvbmRpdGlvblRhc2soY29uZCk7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0Q3VycmVudFRhc2tJZChjb25kaXRpb25UYXNrLmdldFRhc2tJZCgpKTsKKyAgICAgICAgICBHcmFwaCBjb25kR3JhcGggPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgICBjb25kR3JhcGguc2V0RXhlY3V0aW9uVHlwZSgiY29uZGl0aW9uIik7CisgICAgICAgICAgY29uZEdyYXBoLnNldENvbmQoY29uZCk7CisgICAgICAgICAgY29uZEdyYXBoLnNldFRhc2soY29uZGl0aW9uVGFzayk7CisgICAgICAgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KGNvbmRHcmFwaCk7CisgICAgICAgICAgd29ya2Zsb3cuc2V0SWQoInByZS1jb25kLXdvcmtmbG93LSIKKyAgICAgICAgICAgICAgKyBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRJZCgpKTsKKyAgICAgICAgICB3b3JrZmxvdy5zZXROYW1lKCJQcmUgQ29uZGl0aW9uIFdvcmtmbG93LSIgKyBjb25kLmdldENvbmRpdGlvbk5hbWUoKSk7CisgICAgICAgICAgd29ya2Zsb3cuZ2V0VGFza3MoKS5hZGQoY29uZGl0aW9uVGFzayk7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgICAgICAgdGhpcy5hZGRUb01vZGVsUmVwbyh3b3JrZmxvdyk7CisgICAgICAgICAgcGVyc2lzdChpbnN0YW5jZSk7CisgICAgICAgICAgV29ya2Zsb3dQcm9jZXNzb3Igc3ViUHJvY2Vzc29yID0gZnJvbVdvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpOworICAgICAgICAgIHByb2Nlc3Nvci5nZXRTdWJQcm9jZXNzb3JzKCkuYWRkKHN1YlByb2Nlc3Nvcik7CisgICAgICAgICAgc3luY2hyb25pemVkIChwcm9jZXNzb3JDYWNoZSkgeworICAgICAgICAgICAgcHJvY2Vzc29yQ2FjaGUucHV0KGluc3RhbmNlLmdldElkKCksIHN1YlByb2Nlc3Nvcik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGl0cyB0YXNrcworICAgICAgICBmb3IgKFdvcmtmbG93VGFzayB0YXNrIDogaW5zdC5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0VGFza3MoKSkgeworICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdGFuY2UgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZSgpOworICAgICAgICAgIFdvcmtmbG93U3RhdGUgdGFza1dvcmtmbG93U3RhdGUgPSBsaWZlY3ljbGUuZ2V0RGVmYXVsdExpZmVjeWNsZSgpCisgICAgICAgICAgICAgIC5jcmVhdGVTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICJOdWxsIiwKKyAgICAgICAgICAgICAgICAgICJpbml0aWFsIiwKKyAgICAgICAgICAgICAgICAgICJTdWIgVGFzayBXb3JrZmxvdyBjcmVhdGVkIGJ5IFdvcmtmbG93IFByb2Nlc3NvciBRdWV1ZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICArICJbIiArIGluc3QuZ2V0SWQoKSArICJdIik7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0U3RhdGUodGFza1dvcmtmbG93U3RhdGUpOworICAgICAgICAgIGluc3RhbmNlLnNldFByaW9yaXR5KGluc3QuZ2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0Q3VycmVudFRhc2tJZCh0YXNrLmdldFRhc2tJZCgpKTsKKyAgICAgICAgICBHcmFwaCB0YXNrR3JhcGggPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgICB0YXNrR3JhcGguc2V0RXhlY3V0aW9uVHlwZSgidGFzayIpOworICAgICAgICAgIHRhc2tHcmFwaC5zZXRUYXNrKHRhc2spOworICAgICAgICAgIFBhcmVudENoaWxkV29ya2Zsb3cgd29ya2Zsb3cgPSBuZXcgUGFyZW50Q2hpbGRXb3JrZmxvdyh0YXNrR3JhcGgpOworICAgICAgICAgIHdvcmtmbG93LnNldElkKCJ0YXNrLXdvcmtmbG93LSIKKyAgICAgICAgICAgICAgKyBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRJZCgpKTsKKyAgICAgICAgICB3b3JrZmxvdy5zZXROYW1lKCJUYXNrIFdvcmtmbG93LSIgKyB0YXNrLmdldFRhc2tOYW1lKCkpOworICAgICAgICAgIHdvcmtmbG93LmdldFRhc2tzKCkuYWRkKHRhc2spOworICAgICAgICAgIHdvcmtmbG93LmdldEdyYXBoKCkuc2V0VGFzayh0YXNrKTsKKyAgICAgICAgICBpbnN0YW5jZS5zZXRQYXJlbnRDaGlsZFdvcmtmbG93KHdvcmtmbG93KTsKKyAgICAgICAgICB0aGlzLmFkZFRvTW9kZWxSZXBvKHdvcmtmbG93KTsKKyAgICAgICAgICBwZXJzaXN0KGluc3RhbmNlKTsKKyAgICAgICAgICBXb3JrZmxvd1Byb2Nlc3NvciBzdWJQcm9jZXNzb3IgPSBmcm9tV29ya2Zsb3dJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgICAgICAgcHJvY2Vzc29yLmdldFN1YlByb2Nlc3NvcnMoKS5hZGQoc3ViUHJvY2Vzc29yKTsKKyAgICAgICAgICBzeW5jaHJvbml6ZWQgKHByb2Nlc3NvckNhY2hlKSB7CisgICAgICAgICAgICBwcm9jZXNzb3JDYWNoZS5wdXQoaW5zdGFuY2UuZ2V0SWQoKSwgc3ViUHJvY2Vzc29yKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgaXRzIHBvc3QgY29uZGl0aW9ucworICAgICAgICBmb3IgKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgOiBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKQorICAgICAgICAgICAgLmdldFBvc3RDb25kaXRpb25zKCkpIHsKKyAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgICAgICBXb3JrZmxvd1N0YXRlIGNvbmRXb3JrZmxvd1N0YXRlID0gbGlmZWN5Y2xlCisgICAgICAgICAgICAgIC5nZXREZWZhdWx0TGlmZWN5Y2xlKCkKKyAgICAgICAgICAgICAgLmNyZWF0ZVN0YXRlKAorICAgICAgICAgICAgICAgICAgIk51bGwiLAorICAgICAgICAgICAgICAgICAgImluaXRpYWwiLAorICAgICAgICAgICAgICAgICAgIlN1YiBQb3N0IENvbmRpdGlvbiBXb3JrZmxvdyBjcmVhdGVkIGJ5IFdvcmtmbG93IFByb2Nlc3NvciBRdWV1ZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICArICJbIiArIGluc3QuZ2V0SWQoKSArICJdIik7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0U3RhdGUoY29uZFdvcmtmbG93U3RhdGUpOworICAgICAgICAgIGluc3RhbmNlLnNldFByaW9yaXR5KGluc3QuZ2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgV29ya2Zsb3dUYXNrIGNvbmRpdGlvblRhc2sgPSB0b0NvbmRpdGlvblRhc2soY29uZCk7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0Q3VycmVudFRhc2tJZChjb25kaXRpb25UYXNrLmdldFRhc2tJZCgpKTsKKyAgICAgICAgICBHcmFwaCBjb25kR3JhcGggPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgICBjb25kR3JhcGguc2V0RXhlY3V0aW9uVHlwZSgiY29uZGl0aW9uIik7CisgICAgICAgICAgY29uZEdyYXBoLnNldENvbmQoY29uZCk7CisgICAgICAgICAgY29uZEdyYXBoLnNldFRhc2soY29uZGl0aW9uVGFzayk7CisgICAgICAgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KGNvbmRHcmFwaCk7CisgICAgICAgICAgd29ya2Zsb3cuc2V0SWQoInBvc3QtY29uZC13b3JrZmxvdy0iCisgICAgICAgICAgICAgICsgaW5zdC5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0SWQoKSk7CisgICAgICAgICAgd29ya2Zsb3cKKyAgICAgICAgICAgICAgLnNldE5hbWUoIlBvc3QgQ29uZGl0aW9uIFdvcmtmbG93LSIgKyBjb25kLmdldENvbmRpdGlvbk5hbWUoKSk7CisgICAgICAgICAgd29ya2Zsb3cuZ2V0VGFza3MoKS5hZGQoY29uZGl0aW9uVGFzayk7CisgICAgICAgICAgaW5zdGFuY2Uuc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgICAgICAgdGhpcy5hZGRUb01vZGVsUmVwbyh3b3JrZmxvdyk7CisgICAgICAgICAgcGVyc2lzdChpbnN0YW5jZSk7CisgICAgICAgICAgV29ya2Zsb3dQcm9jZXNzb3Igc3ViUHJvY2Vzc29yID0gZnJvbVdvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpOworICAgICAgICAgIHByb2Nlc3Nvci5nZXRTdWJQcm9jZXNzb3JzKCkuYWRkKHN1YlByb2Nlc3Nvcik7CisgICAgICAgICAgc3luY2hyb25pemVkIChwcm9jZXNzb3JDYWNoZSkgeworICAgICAgICAgICAgcHJvY2Vzc29yQ2FjaGUucHV0KGluc3RhbmNlLmdldElkKCksIHN1YlByb2Nlc3Nvcik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGl0J3Mgbm90IGEgY29tcG9zaXRlIHdvcmtmbG93LCBhbmQgaXQncyBlaXRoZXIganVzdCBhIHRhc2sgcHJvY2Vzc29yCisgICAgICAgIC8vIG9yIGEgY29uZGl0aW9uIHByb2Nlc3NvcgorICAgICAgICBpZiAoaW5zdC5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0R3JhcGgoKS5nZXRFeGVjdXRpb25UeXBlKCkKKyAgICAgICAgICAgIC5lcXVhbHMoInRhc2siKSkgeworICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBUYXNrUHJvY2Vzc29yKGxpZmVjeWNsZSwgaW5zdCk7CisgICAgICAgICAgV29ya2Zsb3dTdGF0ZSB0YXNrUHJvY2Vzc29yU3RhdGUgPSBnZXRMaWZlY3ljbGUoCisgICAgICAgICAgICAgIGluc3QuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpKS5jcmVhdGVTdGF0ZSgKKyAgICAgICAgICAgICAgIkxvYWRlZCIsCisgICAgICAgICAgICAgICJpbml0aWFsIiwKKyAgICAgICAgICAgICAgIlRhc2sgV29ya2Zsb3cgaW5zdGFuY2Ugd2l0aCBpZDogWyIgKyBpbnN0LmdldElkKCkKKyAgICAgICAgICAgICAgICAgICsgIl0gbG9hZGVkIGJ5IHByb2Nlc3NvciBxdWV1ZS4iKTsKKyAgICAgICAgICBpbnN0LnNldFN0YXRlKHRhc2tQcm9jZXNzb3JTdGF0ZSk7CisKKyAgICAgICAgICAvLyBoYW5kbGUgaXRzIHByZS1jb25kaXRpb25zCisgICAgICAgICAgZm9yIChXb3JrZmxvd0NvbmRpdGlvbiBjb25kIDogaW5zdC5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkKKyAgICAgICAgICAgICAgLmdldEdyYXBoKCkuZ2V0VGFzaygpLmdldFByZUNvbmRpdGlvbnMoKSkgeworICAgICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgICAgICAgICBXb3JrZmxvd1N0YXRlIGNvbmRXb3JrZmxvd1N0YXRlID0gbGlmZWN5Y2xlCisgICAgICAgICAgICAgICAgLmdldERlZmF1bHRMaWZlY3ljbGUoKQorICAgICAgICAgICAgICAgIC5jcmVhdGVTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgIk51bGwiLAorICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbCIsCisgICAgICAgICAgICAgICAgICAgICJTdWIgUHJlIENvbmRpdGlvbiBXb3JrZmxvdyBmb3IgVGFzayBjcmVhdGVkIGJ5IFdvcmtmbG93IFByb2Nlc3NvciBRdWV1ZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlsiICsgaW5zdC5nZXRJZCgpICsgIl0iKTsKKyAgICAgICAgICAgIGluc3RhbmNlLnNldFN0YXRlKGNvbmRXb3JrZmxvd1N0YXRlKTsKKyAgICAgICAgICAgIGluc3RhbmNlLnNldFByaW9yaXR5KGluc3QuZ2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgICBXb3JrZmxvd1Rhc2sgY29uZGl0aW9uVGFzayA9IHRvQ29uZGl0aW9uVGFzayhjb25kKTsKKyAgICAgICAgICAgIGluc3RhbmNlLnNldEN1cnJlbnRUYXNrSWQoY29uZGl0aW9uVGFzay5nZXRUYXNrSWQoKSk7CisgICAgICAgICAgICBHcmFwaCBjb25kR3JhcGggPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgICAgIGNvbmRHcmFwaC5zZXRFeGVjdXRpb25UeXBlKCJjb25kaXRpb24iKTsKKyAgICAgICAgICAgIGNvbmRHcmFwaC5zZXRDb25kKGNvbmQpOworICAgICAgICAgICAgY29uZEdyYXBoLnNldFRhc2soY29uZGl0aW9uVGFzayk7CisgICAgICAgICAgICBQYXJlbnRDaGlsZFdvcmtmbG93IHdvcmtmbG93ID0gbmV3IFBhcmVudENoaWxkV29ya2Zsb3coY29uZEdyYXBoKTsKKyAgICAgICAgICAgIHdvcmtmbG93LnNldElkKCJwcmUtY29uZC13b3JrZmxvdy0iCisgICAgICAgICAgICAgICAgKyBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRHcmFwaCgpLmdldFRhc2soKQorICAgICAgICAgICAgICAgICAgICAuZ2V0VGFza0lkKCkpOworICAgICAgICAgICAgd29ya2Zsb3cuc2V0TmFtZSgiVGFzayBQcmUgQ29uZGl0aW9uIFdvcmtmbG93LSIKKyAgICAgICAgICAgICAgICArIGNvbmQuZ2V0Q29uZGl0aW9uTmFtZSgpKTsKKyAgICAgICAgICAgIHdvcmtmbG93LmdldFRhc2tzKCkuYWRkKGNvbmRpdGlvblRhc2spOworICAgICAgICAgICAgaW5zdGFuY2Uuc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgICAgICAgICB0aGlzLmFkZFRvTW9kZWxSZXBvKHdvcmtmbG93KTsKKyAgICAgICAgICAgIHBlcnNpc3QoaW5zdGFuY2UpOworICAgICAgICAgICAgV29ya2Zsb3dQcm9jZXNzb3Igc3ViUHJvY2Vzc29yID0gZnJvbVdvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgcHJvY2Vzc29yLmdldFN1YlByb2Nlc3NvcnMoKS5hZGQoc3ViUHJvY2Vzc29yKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc29yQ2FjaGUpIHsKKyAgICAgICAgICAgICAgcHJvY2Vzc29yQ2FjaGUucHV0KGluc3RhbmNlLmdldElkKCksIHN1YlByb2Nlc3Nvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaGFuZGxlIGl0cyBwb3N0LWNvbmRpdGlvbnMKKyAgICAgICAgICBmb3IgKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgOiBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKQorICAgICAgICAgICAgICAuZ2V0R3JhcGgoKS5nZXRUYXNrKCkuZ2V0UG9zdENvbmRpdGlvbnMoKSkgeworICAgICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgICAgICAgICBXb3JrZmxvd1N0YXRlIGNvbmRXb3JrZmxvd1N0YXRlID0gbGlmZWN5Y2xlCisgICAgICAgICAgICAgICAgLmdldERlZmF1bHRMaWZlY3ljbGUoKQorICAgICAgICAgICAgICAgIC5jcmVhdGVTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgIk51bGwiLAorICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbCIsCisgICAgICAgICAgICAgICAgICAgICJTdWIgUG9zdCBDb25kaXRpb24gV29ya2Zsb3cgZm9yIFRhc2sgY3JlYXRlZCBieSBXb3JrZmxvdyBQcm9jZXNzb3IgUXVldWUgZm9yIHdvcmtmbG93IGluc3RhbmNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJbIiArIGluc3QuZ2V0SWQoKSArICJdIik7CisgICAgICAgICAgICBpbnN0YW5jZS5zZXRTdGF0ZShjb25kV29ya2Zsb3dTdGF0ZSk7CisgICAgICAgICAgICBpbnN0YW5jZS5zZXRQcmlvcml0eShpbnN0LmdldFByaW9yaXR5KCkpOworICAgICAgICAgICAgV29ya2Zsb3dUYXNrIGNvbmRpdGlvblRhc2sgPSB0b0NvbmRpdGlvblRhc2soY29uZCk7CisgICAgICAgICAgICBpbnN0YW5jZS5zZXRDdXJyZW50VGFza0lkKGNvbmRpdGlvblRhc2suZ2V0VGFza0lkKCkpOworICAgICAgICAgICAgR3JhcGggY29uZEdyYXBoID0gbmV3IEdyYXBoKCk7CisgICAgICAgICAgICBjb25kR3JhcGguc2V0RXhlY3V0aW9uVHlwZSgiY29uZGl0aW9uIik7CisgICAgICAgICAgICBjb25kR3JhcGguc2V0Q29uZChjb25kKTsKKyAgICAgICAgICAgIGNvbmRHcmFwaC5zZXRUYXNrKGNvbmRpdGlvblRhc2spOworICAgICAgICAgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KGNvbmRHcmFwaCk7CisgICAgICAgICAgICB3b3JrZmxvdy5zZXRJZCgicG9zdC1jb25kLXdvcmtmbG93LSIKKyAgICAgICAgICAgICAgICArIGluc3QuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpLmdldEdyYXBoKCkuZ2V0VGFzaygpCisgICAgICAgICAgICAgICAgICAgIC5nZXRUYXNrSWQoKSk7CisgICAgICAgICAgICB3b3JrZmxvdy5zZXROYW1lKCJUYXNrIFBvc3QgQ29uZGl0aW9uIFdvcmtmbG93LSIKKyAgICAgICAgICAgICAgICArIGNvbmQuZ2V0Q29uZGl0aW9uTmFtZSgpKTsKKyAgICAgICAgICAgIHdvcmtmbG93LmdldFRhc2tzKCkuYWRkKGNvbmRpdGlvblRhc2spOworICAgICAgICAgICAgaW5zdGFuY2Uuc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgICAgICAgICB0aGlzLmFkZFRvTW9kZWxSZXBvKHdvcmtmbG93KTsKKyAgICAgICAgICAgIHBlcnNpc3QoaW5zdGFuY2UpOworICAgICAgICAgICAgV29ya2Zsb3dQcm9jZXNzb3Igc3ViUHJvY2Vzc29yID0gZnJvbVdvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgcHJvY2Vzc29yLmdldFN1YlByb2Nlc3NvcnMoKS5hZGQoc3ViUHJvY2Vzc29yKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc29yQ2FjaGUpIHsKKyAgICAgICAgICAgICAgcHJvY2Vzc29yQ2FjaGUucHV0KGluc3RhbmNlLmdldElkKCksIHN1YlByb2Nlc3Nvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoaW5zdC5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0R3JhcGgoKS5nZXRFeGVjdXRpb25UeXBlKCkKKyAgICAgICAgICAgIC5lcXVhbHMoImNvbmRpdGlvbiIpKSB7CisgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENvbmRpdGlvblByb2Nlc3NvcihsaWZlY3ljbGUsIGluc3QpOworICAgICAgICAgIFdvcmtmbG93U3RhdGUgY29uZFByb2Nlc3NvclN0YXRlID0gZ2V0TGlmZWN5Y2xlKAorICAgICAgICAgICAgICBpbnN0LmdldFBhcmVudENoaWxkV29ya2Zsb3coKSkuY3JlYXRlU3RhdGUoCisgICAgICAgICAgICAgICJMb2FkZWQiLAorICAgICAgICAgICAgICAiaW5pdGlhbCIsCisgICAgICAgICAgICAgICJDb25kaXRpb24gV29ya2Zsb3cgaW5zdGFuY2Ugd2l0aCBpZDogWyIgKyBpbnN0LmdldElkKCkKKyAgICAgICAgICAgICAgICAgICsgIl0gbG9hZGVkIGJ5IHByb2Nlc3NvciBxdWV1ZS4iKTsKKyAgICAgICAgICBpbnN0LnNldFN0YXRlKGNvbmRQcm9jZXNzb3JTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcGVyc2lzdChpbnN0KTsKKyAgICAgIH0KKworICAgICAgc3luY2hyb25pemVkIChwcm9jZXNzb3JDYWNoZSkgeworICAgICAgICBwcm9jZXNzb3JDYWNoZS5wdXQoaW5zdC5nZXRJZCgpLCBwcm9jZXNzb3IpOworICAgICAgfQorICAgICAgcmV0dXJuIHByb2Nlc3NvcjsKKyAgICB9CisKKyAgfQorICAKKyAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUYXNrVG9Nb2RlbFJlcG8oV29ya2Zsb3dUYXNrIHRhc2speworICAgIGlmKG1vZGVsUmVwbyAhPSBudWxsKXsKKyAgICAgIHRyeXsKKyAgICAgICAgbW9kZWxSZXBvLmFkZFRhc2sodGFzayk7CisgICAgICB9CisgICAgICBjYXRjaChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkVG9Nb2RlbFJlcG8oV29ya2Zsb3cgd29ya2Zsb3cpIHsKKyAgICBpZiAobW9kZWxSZXBvICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIG1vZGVsUmVwby5hZGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFdvcmtmbG93TGlmZWN5Y2xlIGdldExpZmVjeWNsZShXb3JrZmxvdyB3b3JrZmxvdykgeworICAgIHJldHVybiBsaWZlY3ljbGUuZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3cod29ya2Zsb3cpICE9IG51bGwgPyBsaWZlY3ljbGUKKyAgICAgICAgLmdldExpZmVjeWNsZUZvcldvcmtmbG93KHdvcmtmbG93KSA6IGxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCk7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb3NpdGVQcm9jZXNzb3IoV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSkgeworICAgIGlmIChpbnN0YW5jZS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0R3JhcGgoKSAhPSBudWxsCisgICAgICAgICYmIGluc3RhbmNlLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRHcmFwaCgpLmdldEV4ZWN1dGlvblR5cGUoKSAhPSBudWxsCisgICAgICAgICYmICFpbnN0YW5jZS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0R3JhcGgoKS5nZXRFeGVjdXRpb25UeXBlKCkKKyAgICAgICAgICAgIC5lcXVhbHMoIiIpKSB7CisgICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpLmdldEdyYXBoKCkuZ2V0RXhlY3V0aW9uVHlwZSgpCisgICAgICAgICAgLmVxdWFscygicGFyYWxsZWwiKQorICAgICAgICAgIHx8IGluc3RhbmNlLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRHcmFwaCgpLmdldEV4ZWN1dGlvblR5cGUoKQorICAgICAgICAgICAgICAuZXF1YWxzKCJzZXF1ZW50aWFsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBHcmFwaCB0byB3b3JrIHdpdGgsIHNvIHdlJ2xsIGRlZmF1bHQgdG8gd2hldGhlciBvciBub3QKKyAgICAgIC8vIHNvIHdlJ2xsIGFzc3VtZSB0aGlzIGlzIGEgd29ya2Zsb3cgaW5zdGFuY2UgZGVsaXZlcmVkIHRvIHVzIGJ5IHRoZQorICAgICAgLy8gaW5zdFJlcAorICAgICAgLy8gd2hpY2ggZG9lc24ndCB1bmRlcnN0YW5kIEdyYXBocyB5ZXQgKFRPRE86IG1ha2UgaW5zdFJlcCB1bmRlcnN0YW5kCisgICAgICAvLyBncmFwaHMKKyAgICAgIC8vIGFuZCBwZXJzaXN0IHRoZW0pCisgICAgICAvLyBzbyB0aGUgc2ltcGxlIHNvbHV0aW9uIGlzIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBJRCBzdGFydHMgd2l0aAorICAgICAgLy8gdGFzay13b3JrZmxvdyBvciBwcmUtY29uZCBvciBwb3N0LWNvbmQKKyAgICAgIHJldHVybiAhKGluc3RhbmNlLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRJZCgpCisgICAgICAgICAgLnN0YXJ0c1dpdGgoInRhc2std29ya2Zsb3ciKQorICAgICAgICAgIHx8IGluc3RhbmNlLmdldFBhcmVudENoaWxkV29ya2Zsb3coKS5nZXRJZCgpLnN0YXJ0c1dpdGgoInByZS1jb25kIikgfHwgaW5zdGFuY2UKKyAgICAgICAgICAuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpLmdldElkKCkuc3RhcnRzV2l0aCgicG9zdC1jb25kIikpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgV29ya2Zsb3dQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRnJvbUluc3RhbmNlR3JhcGgoCisgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlLCBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlKSB7CisgICAgR3JhcGggZ3JhcGggPSBpbnN0YW5jZS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0R3JhcGgoKTsKKyAgICBpZiAoZ3JhcGggIT0gbnVsbCAmJiBncmFwaC5nZXRFeGVjdXRpb25UeXBlKCkgIT0gbnVsbAorICAgICAgICAmJiBncmFwaC5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJzZXF1ZW50aWFsIikpIHsKKyAgICAgIHJldHVybiBuZXcgU2VxdWVudGlhbFByb2Nlc3NvcihsaWZlY3ljbGUsIGluc3RhbmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBQYXJhbGxlbFByb2Nlc3NvcihsaWZlY3ljbGUsIGluc3RhbmNlKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgc3luY2hyb25pemVkIFdvcmtmbG93VGFzayB0b0NvbmRpdGlvblRhc2soV29ya2Zsb3dDb25kaXRpb24gY29uZCl7ICAgIAorICAgIFN0cmluZyB0YXNrSWQgPSBjb25kLmdldENvbmRpdGlvbklkKCkrIi10YXNrIjsgLy8gVE9ETzogdGhpcyBpcyBpbmNvbXBhdCB3aXRoIERhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnkKKyAgICBXb3JrZmxvd1Rhc2sgY29uZFRhc2sgPSBzYWZlR2V0VGFza0J5SWQodGFza0lkKTsKKyAgICBpZihjb25kVGFzayAhPSBudWxsKSByZXR1cm4gY29uZFRhc2s7CisgICAgY29uZFRhc2sgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisgICAgY29uZFRhc2suc2V0VGFza0lkKHRhc2tJZCk7CisgICAgY29uZFRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKENvbmRpdGlvblRhc2tJbnN0YW5jZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIGNvbmRUYXNrLnNldFRhc2tOYW1lKGNvbmQuZ2V0Q29uZGl0aW9uTmFtZSgpKyIgVGFzayIpOworICAgIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oKTsKKyAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLnB1dEFsbChjb25kLmdldENvbmRDb25maWcoKS5nZXRQcm9wZXJ0aWVzKCkpOworICAgIC8vIHRoaXMgb25lIGlzIGEgc3BlY2lhbCBvbmUgdGhhdCB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIENvbmRpdGlvblRhc2tJbnN0YW5jZSBjbGFzcworICAgIGNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eSgiQ29uZGl0aW9uQ2xhc3NOYW1lIiwgY29uZC5nZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpKTsgCisgICAgY29uZFRhc2suc2V0VGFza0NvbmZpZyhjb25maWcpOworICAgIHRoaXMuYWRkVGFza1RvTW9kZWxSZXBvKGNvbmRUYXNrKTsKKyAgICByZXR1cm4gY29uZFRhc2s7CisgIH0KKyAgCisgIHByaXZhdGUgV29ya2Zsb3dUYXNrIHNhZmVHZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKXsKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG51bGw7CisgICAgICB0cnl7CisgICAgICAgIGlmKCh0YXNrID0gdGhpcy5tb2RlbFJlcG8uZ2V0VGFza0J5SWQodGFza0lkKSkgIT0gbnVsbCl7CisgICAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhdGNoKFJlcG9zaXRvcnlFeGNlcHRpb24gZSl7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB9CisgICAgCisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9BYnN0cmFjdEVuZ2luZVJ1bm5lckJhc2UuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9ydW5uZXIvQWJzdHJhY3RFbmdpbmVSdW5uZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllYzhkOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9ydW5uZXIvQWJzdHJhY3RFbmdpbmVSdW5uZXJCYXNlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuVGFza1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIAorICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBwcm92aWRpbmcgaGVscGVyIGZ1bmN0aW9uYWxpdHkgdG8gcGVyc2lzdAorICoge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cywgdG8gZ2V0IHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZX1zIGZyb20gdW5kZXJseWluZworICoge0BsaW5rIFRhc2tQcm9jZXNzb3J9cywgYW5kIHRvIGdldCB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgZnJvbSB0aGUgdW5kZXJseWluZworICoge0BsaW5rIFRhc2tQcm9jZXNzb3J9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW5naW5lUnVubmVyQmFzZSBleHRlbmRzIEVuZ2luZVJ1bm5lciB7CisKKyAgcHJvdGVjdGVkIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGluc3RSZXA7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihBYnN0cmFjdEVuZ2luZVJ1bm5lckJhc2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBBYnNyYWN0RW5naW5lUnVubmVyQmFzZSB3aXRoIHRoZSBwcm92aWRlZAorICAgKiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnl9LgorICAgKiAKKyAgICogQHBhcmFtIGluc3RSZXAKKyAgICogICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeX0gdG8gdXNlIHRvIHBlcnNpc3QKKyAgICogICAgICAgICAge0BsaW5rIFRhc2tQcm9jZXNzb3J9IHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBpbmZvcm1hdGlvbi4KKyAgICovCisgIHB1YmxpYyBBYnN0cmFjdEVuZ2luZVJ1bm5lckJhc2UoKSB7CisgICAgdGhpcy5pbnN0UmVwID0gbnVsbDsKKyAgfQorCisgIHByb3RlY3RlZCBXb3JrZmxvd1Rhc2sgZ2V0VGFza0Zyb21Qcm9jZXNzb3IoVGFza1Byb2Nlc3NvciB0YXNrUHJvY2Vzc29yKSB7CisgICAgaWYgKHRhc2tQcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpICE9IG51bGwKKyAgICAgICAgJiYgdGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpICE9IG51bGwKKyAgICAgICAgJiYgdGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpCisgICAgICAgICAgICAuZ2V0R3JhcGgoKSAhPSBudWxsICYmIAorICAgICAgICAgICB0YXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkuZ2V0R3JhcGgoKS5nZXRUYXNrKCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRhc2tQcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFBhcmVudENoaWxkV29ya2Zsb3coKQorICAgICAgICAgICAgLmdldEdyYXBoKCkuZ2V0VGFzaygpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRhc2tQcm9jZXNzb3IuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFBhcmVudENoaWxkV29ya2Zsb3coKQorICAgICAgICAgIC5nZXRUYXNrcygpLmdldCgwKTsKKyAgfQorCisgIHByb3RlY3RlZCBXb3JrZmxvd0xpZmVjeWNsZSBnZXRMaWZlY3ljbGUoVGFza1Byb2Nlc3NvciB0YXNrUHJvY2Vzc29yKSB7CisgICAgcmV0dXJuIHRhc2tQcm9jZXNzb3IuZ2V0TGlmZWN5Y2xlTWFuYWdlcigpLmdldERlZmF1bHRMaWZlY3ljbGUoKTsKKyAgfQorCisgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwZXJzaXN0KFdvcmtmbG93SW5zdGFuY2UgaW5zdGFuY2UpIHsKKyAgICBpZihpbnN0UmVwID09IG51bGwpIHJldHVybjsKKyAgICB0cnkgeworICAgICAgaWYgKGluc3RhbmNlLmdldElkKCkgPT0gbnVsbAorICAgICAgICAgIHx8IChpbnN0YW5jZS5nZXRJZCgpICE9IG51bGwgJiYgaW5zdGFuY2UuZ2V0SWQoKS5lcXVhbHMoIiIpKSkgeworICAgICAgICAvLyB3ZSBoYXZlIHRvIHBlcnNpc3QgaXQgYnkgYWRkaW5nIGl0CisgICAgICAgIC8vIHJhdGhlciB0aGFuIHVwZGF0aW5nIGl0CisgICAgICAgIGluc3RSZXAuYWRkV29ya2Zsb3dJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBwZXJzaXN0IGJ5IHVwZGF0ZQorICAgICAgICBpbnN0UmVwLnVwZGF0ZVdvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlZCB0byBwZXJzaXN0IHdvcmtmbG93IGluc3RhbmNlOiBbIgorICAgICAgICAgICsgaW5zdGFuY2UuZ2V0SWQoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gICAgCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9Bc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9Bc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTkzMjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL0FzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5UYXNrUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dMaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeTsKKworLyoqCisgKiBSdW5zIGEgbG9jYWwgdmVyc2lvbiBvZiBhIHtAbGluayBUYXNrUHJvY2Vzc29yfSBhc3luY2hyb25vdXNseS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyIGV4dGVuZHMgQWJzdHJhY3RFbmdpbmVSdW5uZXJCYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9OVU1fVEhSRUFEUyA9IDI1OworCisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOworICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFRocmVhZD4gd29ya2VyTWFwOworCisgIHB1YmxpYyBBc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lcigpIHsKKyAgICB0aGlzKERFRkFVTFRfTlVNX1RIUkVBRFMpOworICB9CisKKyAgcHVibGljIEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyKGludCBudW1UaHJlYWRzKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLmV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKKyAgICB0aGlzLndvcmtlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGhyZWFkPigpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXIuRW5naW5lUnVubmVyI2V4ZWN1dGUob3JnLmFwYWNoZQorICAgKiAub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5UYXNrUHJvY2Vzc29yKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgVGFza1Byb2Nlc3NvciB0YXNrUHJvY2Vzc29yKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUaHJlYWQgd29ya2VyID0gbmV3IFRocmVhZCgpIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlIGxpZmVjeWNsZSA9IGdldExpZmVjeWNsZSh0YXNrUHJvY2Vzc29yKTsKKyAgICAgICAgV29ya2Zsb3dUYXNrIHdvcmtmbG93VGFzayA9IGdldFRhc2tGcm9tUHJvY2Vzc29yKHRhc2tQcm9jZXNzb3IpOworICAgICAgICBXb3JrZmxvd1Rhc2tJbnN0YW5jZSBpbnN0ID0gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgLmdldFRhc2tPYmplY3RGcm9tQ2xhc3NOYW1lKHdvcmtmbG93VGFzay5nZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaW5zdC5ydW4odGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U2hhcmVkQ29udGV4dCgpLAorICAgICAgICAgICAgICB3b3JrZmxvd1Rhc2suZ2V0VGFza0NvbmZpZygpKTsKKyAgICAgICAgICBTdHJpbmcgbXNnID0gIlRhc2s6IFsiICsgd29ya2Zsb3dUYXNrLmdldFRhc2tOYW1lKCkKKyAgICAgICAgICAgICAgKyAiXSBmb3IgaW5zdGFuY2UgaWQ6IFsiCisgICAgICAgICAgICAgICsgdGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0SWQoKQorICAgICAgICAgICAgICArICJdIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiOworICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgbXNnKTsKKyAgICAgICAgICBXb3JrZmxvd1N0YXRlIHN0YXRlID0gbGlmZWN5Y2xlLmNyZWF0ZVN0YXRlKCJFeGVjdXRpb25Db21wbGV0ZSIsICJ0cmFuc2l0aW9uIiwgbXNnKTsKKyAgICAgICAgICB0YXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgcGVyc2lzdCh0YXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiBleGVjdXRpbmcgdGFzazogWyIKKyAgICAgICAgICAgICAgKyB3b3JrZmxvd1Rhc2suZ2V0VGFza05hbWUoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBtc2cpOworICAgICAgICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSBsaWZlY3ljbGUuY3JlYXRlU3RhdGUoIkZhaWx1cmUiLCAiZG9uZSIsIG1zZyk7CisgICAgICAgICAgdGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuc2V0U3RhdGUoc3RhdGUpOworICAgICAgICAgIHBlcnNpc3QodGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkpOworICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkI2ludGVycnVwdCgpCisgICAgICAgKi8KKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGludGVycnVwdCgpIHsKKyAgICAgICAgc3VwZXIuaW50ZXJydXB0KCk7CisgICAgICAgIHRoaXMuZGVzdHJveSgpOworICAgICAgfQorCisgICAgfTsKKworICAgIFN0cmluZyBpZCA9ICIiOworICAgIHN5bmNocm9uaXplZCAoaWQpIHsKKyAgICAgIGlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgIHRoaXMud29ya2VyTWFwLnB1dChpZCwgd29ya2VyKTsKKyAgICAgIHRoaXMuZXhlY3V0b3IuZXhlY3V0ZSh3b3JrZXIpOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuRW5naW5lUnVubmVyI3NodXRkb3duKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoVGhyZWFkIHdvcmtlciA6IHRoaXMud29ya2VyTWFwLnZhbHVlcygpKSB7CisgICAgICBpZiAod29ya2VyICE9IG51bGwpIHsKKyAgICAgICAgd29ya2VyLmludGVycnVwdCgpOworICAgICAgICB3b3JrZXIgPSBudWxsOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXIuRW5naW5lUnVubmVyI2hhc09wZW5TbG90cyhvcmcKKyAgICogLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLlRhc2tQcm9jZXNzb3IpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaGFzT3BlblNsb3RzKFRhc2tQcm9jZXNzb3IgdGFza1Byb2Nlc3NvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lci5FbmdpbmVSdW5uZXIjc2V0SW5zdGFuY2VSZXBvc2l0b3J5KG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VSZXBvc2l0b3J5KFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGluc3RSZXApIHsKKyAgICB0aGlzLmluc3RSZXAgPSBpbnN0UmVwOyAgICAKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL0FzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyRmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9Bc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGYwZDRmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9Bc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucnVubmVyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3Rvcnk7CisKKy8qKgorICogQSB7QGxpbmsgRW5naW5lUnVubmVyRmFjdG9yeX0gd2hpY2ggY3JlYXRlcworICoge0BsaW5rIEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyfXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lckZhY3RvcnkgaW1wbGVtZW50cworICAgIEVuZ2luZVJ1bm5lckZhY3RvcnkgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1fVEhSRUFEU19QUk9QRVJUWSA9ICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LndlbmdpbmUuYXN5bmNocm9ub3VzLnJ1bm5lci5udW0udGhyZWFkcyI7CisKKyAgcHJpdmF0ZSBpbnQgbnVtVGhyZWFkczsKKworICBwdWJsaWMgQXN5bmNocm9ub3VzTG9jYWxFbmdpbmVSdW5uZXJGYWN0b3J5KCkgeworICAgIG51bVRocmVhZHMgPSBJbnRlZ2VyLmdldEludGVnZXIoTlVNX1RIUkVBRFNfUFJPUEVSVFksCisgICAgICAgIEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyLkRFRkFVTFRfTlVNX1RIUkVBRFMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lciBjcmVhdGVFbmdpbmVSdW5uZXIoKSB7CisgICAgcmV0dXJuIG5ldyBBc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lcihudW1UaHJlYWRzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE51bVRocmVhZHMoaW50IG51bVRocmVhZHMpIHsKKyAgICB0aGlzLm51bVRocmVhZHMgPSBudW1UaHJlYWRzOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9ydW5uZXIvRW5naW5lUnVubmVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL0VuZ2luZVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDFmZmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL0VuZ2luZVJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuVGFza1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CisKKy8qKgorICoKKyAqIE9iZnVzY2F0ZXMgdGhlIHVuZGVybHlpbmcgc3Vic3RyYXRlIG9uIHdoaWNoIGEge0BsaW5rIFdvcmtmbG93VGFza30gc2hvdWxkCisgKiBydW4uIEluIHNob3J0LCBleGVjdXRlcyBhIHtAbGluayBXb3JrZmxvd1Rhc2t9IGZvciB0aGUgV29ya2Zsb3cgRW5naW5lLgorICoKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVuZ2luZVJ1bm5lciB7CisKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEge0BsaW5rIFRhc2tQcm9jZXNzb3J9IG9uIGFuIGV4ZWN1dGlvbiBzdWJzdHJhdGUuIElkZWFsbHkgdGhlcmUKKyAgICogd2lsbCBvbmx5IGV2ZXIgYmUgdHdvIG9mIHRoZXNlIHN1YnN0cmF0ZXMsIG9uZSBmb3IgbG9jYWwgZXhlY3V0aW9uLCBhbmQKKyAgICogYW5vdGhlciBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBSZXNvdXJjZSBNYW5hZ2VyLgorICAgKgorICAgKiBAcGFyYW0gdGFza1Byb2Nlc3NvcgorICAgKiAgICAgICAgICBUaGUge0BsaW5rIFRhc2tQcm9jZXNzb3J9IHRvIGluc3RhbnRpYXRlIGFuZCBleGVjdXRlLgorICAgKgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoVGFza1Byb2Nlc3NvciB0YXNrUHJvY2Vzc29yKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogU2h1dHMgdGhpcyBydW5uZXIgZG93biBhbmQgZnJlZXMgaXRzIHJlc291cmNlcy4KKyAgICoKKyAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMgd2hpbGUgZnJlZWluZyByZXNvdXJjZXMuCisgICAqCisgICAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaHV0ZG93bigpIHRocm93cyBFeGNlcHRpb247CisgIAorICAvKioKKyAgICogRGVjaWRlcyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgYXZhaWxhYmxlIHNsb3RzIHdpdGhpbiB0aGlzIHJ1bm5lcgorICAgKiB0byBleGVjdXRlIHRoZSBwcm92aWRlZCB7QGxpbmsgVGFza1Byb2Nlc3Nvcn0uCisgICAqIAorICAgKiBAcGFyYW0gd29ya2Zsb3dUYXNrIFRoZSB7QGxpbmsgVGFza1Byb2Nlc3Nvcn0gdG8gZXhlY3V0ZS4KKyAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFuIG9wZW4gc2xvdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzT3BlblNsb3RzKFRhc2tQcm9jZXNzb3IgdGFza1Byb2Nlc3NvcikgdGhyb3dzIEV4Y2VwdGlvbjsgIAorICAKKyAgCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEluc3RhbmNlUmVwb3NpdG9yeShXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBpbnN0UmVwKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9FbmdpbmVSdW5uZXJGYWN0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL0VuZ2luZVJ1bm5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFhODg0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9FbmdpbmVSdW5uZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lcjsKKworLyoqCisgKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMge0BsaW5rIEVuZ2luZVJ1bm5lcn1zLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVuZ2luZVJ1bm5lckZhY3RvcnkgeworCisgICBwdWJsaWMgRW5naW5lUnVubmVyIGNyZWF0ZUVuZ2luZVJ1bm5lcigpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9SZXNvdXJjZVJ1bm5lci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9SZXNvdXJjZVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOGVlZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL1Jlc291cmNlUnVubmVyLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSm9iRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3lzdGVtLlhtbFJwY1Jlc291cmNlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuVGFza1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubWV0YWRhdGEuQ29yZU1ldEtleXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlRhc2tKb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKKworLyoqCisgKiAKKyAqIFN1Ym1pdHMgYSB7QGxpbmsgV29ya2Zsb3dUYXNrfSB0byB0aGUgUmVzb3VyY2UgTWFuYWdlci4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVJ1bm5lciBleHRlbmRzIEFic3RyYWN0RW5naW5lUnVubmVyQmFzZSBpbXBsZW1lbnRzIENvcmVNZXRLZXlzLAorICAgIFdvcmtmbG93U3RhdHVzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihSZXNvdXJjZVJ1bm5lci5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9RVUVVRV9OQU1FID0gImhpZ2giOworCisgIHByb3RlY3RlZCBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQgckNsaWVudDsKKworICBwcml2YXRlIFN0cmluZyBjdXJyZW50Sm9iSWQ7CisKKyAgcHVibGljIFJlc291cmNlUnVubmVyKFVSTCByZXNVcmwsIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGluc3RSZXApIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuckNsaWVudCA9IG5ldyBYbWxScGNSZXNvdXJjZU1hbmFnZXJDbGllbnQocmVzVXJsKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXIuRW5naW5lUnVubmVyI2V4ZWN1dGUob3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLlRhc2tQcm9jZXNzb3IpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZXhlY3V0ZShUYXNrUHJvY2Vzc29yIHRhc2tQcm9jZXNzb3IpIHRocm93cyBFeGNlcHRpb24geworICAgIEpvYiB3b3JrZmxvd1Rhc2tKb2IgPSBuZXcgSm9iKCk7CisgICAgV29ya2Zsb3dUYXNrIHdvcmtmbG93VGFzayA9IGdldFRhc2tGcm9tUHJvY2Vzc29yKHRhc2tQcm9jZXNzb3IpOworICAgIHdvcmtmbG93VGFza0pvYi5zZXROYW1lKHdvcmtmbG93VGFzay5nZXRUYXNrSWQoKSk7CisgICAgd29ya2Zsb3dUYXNrSm9iCisgICAgICAgIC5zZXRKb2JJbnN0YW5jZUNsYXNzTmFtZSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlRhc2tKb2IiKTsKKyAgICB3b3JrZmxvd1Rhc2tKb2IKKyAgICAgICAgLnNldEpvYklucHV0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuVGFza0pvYklucHV0Iik7CisgICAgd29ya2Zsb3dUYXNrSm9iLnNldExvYWRWYWx1ZShuZXcgSW50ZWdlcigyKSk7CisgICAgd29ya2Zsb3dUYXNrSm9iLnNldFF1ZXVlTmFtZSh3b3JrZmxvd1Rhc2suZ2V0VGFza0NvbmZpZygpLmdldFByb3BlcnR5KAorICAgICAgICBRVUVVRV9OQU1FKSAhPSBudWxsID8gd29ya2Zsb3dUYXNrLmdldFRhc2tDb25maWcoKS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgUVVFVUVfTkFNRSkgOiBERUZBVUxUX1FVRVVFX05BTUUpOworCisgICAgaWYgKHdvcmtmbG93VGFzay5nZXRUYXNrQ29uZmlnKCkuZ2V0UHJvcGVydHkoVEFTS19MT0FEKSAhPSBudWxsKSB7CisgICAgICB3b3JrZmxvd1Rhc2tKb2Iuc2V0TG9hZFZhbHVlKEludGVnZXIudmFsdWVPZih3b3JrZmxvd1Rhc2suZ2V0VGFza0NvbmZpZygpCisgICAgICAgICAgLmdldFByb3BlcnR5KFRBU0tfTE9BRCkpKTsKKyAgICB9CisKKyAgICBUYXNrSm9iSW5wdXQgaW4gPSBuZXcgVGFza0pvYklucHV0KCk7CisgICAgaW4uc2V0RHluTWV0YWRhdGEodGFza1Byb2Nlc3Nvci5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U2hhcmVkQ29udGV4dCgpKTsKKyAgICBpbi5zZXRUYXNrQ29uZmlnKHdvcmtmbG93VGFzay5nZXRUYXNrQ29uZmlnKCkpOworICAgIGluLnNldFdvcmtmbG93VGFza0luc3RhbmNlQ2xhc3NOYW1lKHdvcmtmbG93VGFzay5nZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoKSk7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5jdXJyZW50Sm9iSWQgPSByQ2xpZW50LnN1Ym1pdEpvYih3b3JrZmxvd1Rhc2tKb2IsIGluKTsKKyAgICB9IGNhdGNoIChKb2JFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJKb2IgZXhlY3V0aW9uIGV4Y2VwdGlvbiB1c2luZyByZXNvdXJjZSBtYW5hZ2VyIHRvIGV4ZWN1dGUgam9iOiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5FbmdpbmVSdW5uZXIjc2h1dGRvd24oKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKyAgCisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lci5FbmdpbmVSdW5uZXIjaGFzT3BlblNsb3RzKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5UYXNrUHJvY2Vzc29yKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGhhc09wZW5TbG90cyhUYXNrUHJvY2Vzc29yIHRhc2tQcm9jZXNzb3IpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJ1bm5lci5FbmdpbmVSdW5uZXIjc2V0SW5zdGFuY2VSZXBvc2l0b3J5KG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VSZXBvc2l0b3J5KFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGluc3RSZXApIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgCisgIH0KKyAgCisgIAorCisgIHByb3RlY3RlZCBib29sZWFuIHNhZmVDaGVja0pvYkNvbXBsZXRlKFN0cmluZyBqb2JJZCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gckNsaWVudC5pc0pvYkNvbXBsZXRlKGpvYklkKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGNoZWNraW5nIGNvbXBsZXRpb24gc3RhdHVzIGZvciBqb2I6IFsiCisgICAgICAgICAgKyBqb2JJZCArICJdOiBNZXNzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wSm9iKFN0cmluZyBqb2JJZCkgeworICAgIGlmICh0aGlzLnJDbGllbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRKb2JJZCAhPSBudWxsKSB7CisgICAgICBpZiAoIXRoaXMuckNsaWVudC5raWxsSm9iKHRoaXMuY3VycmVudEpvYklkKSkgeworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJBdHRlbXB0IHRvIGtpbGwgIiArICJjdXJyZW50IHJlc21nciBqb2I6IFsiCisgICAgICAgICAgICArIHRoaXMuY3VycmVudEpvYklkICsgIl06IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvcnVubmVyL1Jlc291cmNlUnVubmVyRmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9SZXNvdXJjZVJ1bm5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMyMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL3J1bm5lci9SZXNvdXJjZVJ1bm5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucnVubmVyOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5HZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5OworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCisKKy8qKgorICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHtAbGluayBSZXNvdXJjZVJ1bm5lcn1zLgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICogQGF1dGhvciBtYXR0bWFubiAoQ2hyaXMgTWF0dG1hbm4pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVJ1bm5lckZhY3RvcnkgaW1wbGVtZW50cyBFbmdpbmVSdW5uZXJGYWN0b3J5eworCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihSZXNvdXJjZVJ1bm5lckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX01BTkFHRVJfVVJMX1BST1BFUlRZID0gIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnJlc291cmNlbWdyLnVybCI7CisKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQU5DRV9SRVBPX0ZBQ1RPUllfUFJPUEVSVFkgPSAid29ya2Zsb3cuZW5naW5lLmluc3RhbmNlUmVwLmZhY3RvcnkiOworICAgCisgICBwcml2YXRlIFN0cmluZyByZXNVcmw7CisKKyAgIHB1YmxpYyBSZXNvdXJjZVJ1bm5lckZhY3RvcnkoKSB7CisgICAgICByZXNVcmwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUkVTT1VSQ0VfTUFOQUdFUl9VUkxfUFJPUEVSVFkpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBSZXNvdXJjZVJ1bm5lciBjcmVhdGVFbmdpbmVSdW5uZXIoKSB7CisgICAgICB0cnkgeworICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocmVzVXJsLAorICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBSZXNvdXJjZSBNYW5hZ2VyIFVSTCBbcHJvcGVydHkgPSAiCisgICAgICAgICAgICAgICAgICAgICArIFJFU09VUkNFX01BTkFHRVJfVVJMX1BST1BFUlRZICsgIl0iKTsKKyAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VSdW5uZXIobmV3IFVSTChyZXNVcmwpLCBnZXRXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSgpKTsKKyAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkZhaWxlZCB0byBsb2FkIFJlc291cmNlUnVubmVyIDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXJVcmwoU3RyaW5nIHJlc1VybCkgeworICAgICAgdGhpcy5yZXNVcmwgPSByZXNVcmw7CisgICB9CisgICAKKyAgIHByb3RlY3RlZCBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBnZXRXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSgpIHsKKyAgICAgcmV0dXJuIEdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkKKyAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZyb21DbGFzc05hbWUoU3lzdGVtCisgICAgICAgICAgICAgLmdldFByb3BlcnR5KElOU1RBTkNFX1JFUE9fRkFDVE9SWV9QUk9QRVJUWSkpOworICAgfSAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvQnJhbmNoUmVkaXJlY3Rvci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvQnJhbmNoUmVkaXJlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYWE3YTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9CcmFuY2hSZWRpcmVjdG9yLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ7CisKKy8qKgorICogCisgKiBSZWRpcmVjdHMgZnJvbSBhbiBleGlzdGluZyB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gYnkgc2VuZGluZyBhIHNwZWNpZmllZAorICogZXZlbnQgc3BlY2lmaWVkIGJ5IHRoZSB0YXNrIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIG5hbWVkCisgKiA8Y29kZT5ldmVudE5hbWU8L2NvZGU+LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEJyYW5jaFJlZGlyZWN0b3IgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKyAgcHVibGljIEJyYW5jaFJlZGlyZWN0b3IoKSB7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZSNydW4ob3JnLmFwYWNoZQorICAgKiAub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpCisgICAgICB0aHJvd3MgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24geworICAgIFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCB3bSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgd20gPSBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KG5ldyBVUkwoCisgICAgICAgICAgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoQ29yZU1ldEtleXMuV09SS0ZMT1dfTUFOQUdFUl9VUkwpKSk7CisgICAgICB3bS5zZW5kRXZlbnQoY29uZmlnLmdldFByb3BlcnR5KCJldmVudE5hbWUiKSwgbWV0YWRhdGEpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9DaGVja0Zvck1ldGFkYXRhS2V5cy5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvQ2hlY2tGb3JNZXRhZGF0YUtleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmOWViCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvQ2hlY2tGb3JNZXRhZGF0YUtleXMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlOworCitwdWJsaWMgY2xhc3MgQ2hlY2tGb3JNZXRhZGF0YUtleXMgaW1wbGVtZW50cyBXb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlIHsKKworICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBTdHJpbmdbXSByZXFNZXRLZXlzID0gKGNvbmZpZy5nZXRQcm9wZXJ0eSgicmVxTWV0S2V5cyIpICsgIiwiKQorICAgICAgICAgICAgICAgIC5zcGxpdCgiLCIpOworICAgICAgICBmb3IgKFN0cmluZyByZXFNZXRLZXkgOiByZXFNZXRLZXlzKSB7CisgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmNvbnRhaW5zS2V5KHJlcU1ldEtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvRXh0ZXJuU2NyaXB0VGFza0luc3RhbmNlLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9FeHRlcm5TY3JpcHRUYXNrSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjgyNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvRXh0ZXJuU2NyaXB0VGFza0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworLy9KYXZhIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIGRhdm9vZGkKKyAqIEB2ZXJzaW9uICRSZXZzaW9uJAorICogQHNpbmNlIE9PRFQtMjI2CisgKiAKKyAqIDxwPgorICogQSB0YXNrIHRoYXQgdGFrZXMgaW4gdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciwgYW5kIG1ldGFkYXRhCisgKiAmcXVvdDthcmdzJnF1b3Q7LCB0aGVuIHJ1bnMgYW4gZXh0ZXJuYWwgc2NyaXB0LgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuU2NyaXB0VGFza0luc3RhbmNlIGltcGxlbWVudHMgV29ya2Zsb3dUYXNrSW5zdGFuY2UgeworCisgICAgLyoqCisgICAgICogCisgICAgICovCisgICAgcHVibGljIEV4dGVyblNjcmlwdFRhc2tJbnN0YW5jZSgpIHsKKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlI3J1bihqYXZhLnV0aWwuTWFwLAorICAgICAqICAgICAgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKE1ldGFkYXRhIG1ldGFkYXRhLCBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBMaXN0IGFyZ3MgPSBtZXRhZGF0YS5nZXRBbGxNZXRhZGF0YSgiQXJncyIpOyAvLyBjb21tYW5kIGxpbmUKKyAgICAgICAgLy8gYXJndW1lbnRzIGZvciBhCisgICAgICAgIC8vIHNwZWNpZmljIHNjcmlwdC4KKyAgICAgICAgU3RyaW5nIHBhdGhUb1NjcmlwdCA9IGNvbmZpZy5nZXRQcm9wZXJ0eSgiUGF0aFRvU2NyaXB0Iik7IC8vIHNob3VsZAorICAgICAgICAvLyBpbmNsdWRlCisgICAgICAgIC8vIHRoZSBmaWxlCisgICAgICAgIC8vIG5hbWUgYXMKKyAgICAgICAgLy8gd2VsbC4KKyAgICAgICAgU3RyaW5nIHNoZWxsVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eSgiU2hlbGxUeXBlIik7IC8vIGUuZy4gL2Jpbi9zaC8KKworICAgICAgICAvLyBqb2luaW5nIHRoZSBhcmd1bWVudCBsaXN0J3MgZWxlbWVudHMgdG8gYSBzdHJpbmcKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGFyZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY21kTGluZSA9IHNoZWxsVHlwZSArICIgIiArIHBhdGhUb1NjcmlwdCArICIgIgorICAgICAgICAgICAgICAgICsgYnVmZmVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgLy8gZXhlY3V0aW5nIHRoZSBleHRlcm5hbCBzY3JpcHQgb24gdGhlIGNvbW1hbmQgbGluZQorICAgICAgICBSdW50aW1lIHJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgUHJvY2VzcyBwcm9jID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2MgPSBydW50aW1lLmV4ZWMoY21kTGluZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSA9IHByb2MuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXRzdHJlYW1yZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRzdHJlYW0pOworICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dHN0cmVhbXJlYWRlcik7CisKKyAgICAgICAgLy8gc2VuZGluZyB0aGUgc2NyaXB0J3Mgb3V0cHV0IHJlc3VsdCB0byBTeXN0ZW0ub3V0IHRvIGJlIHByaW50ZWQKKyAgICAgICAgU3RyaW5nIGNtZGxuT3V0cHV0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKChjbWRsbk91dHB1dCA9IGJ1ZmZlcmVkcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY21kbG5PdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChwcm9jLndhaXRGb3IoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVycgorICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oInRoZSBwcm9jZXNzIGRpZCBub3QgdGVybWluYXRlIG5vcm1hbGx5IGV4aXQgY29kZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9jLmV4aXRWYWx1ZSgpICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkcmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJlZHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmZXJlZHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL0ZhbHNlQ29uZGl0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9GYWxzZUNvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2EwMzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9GYWxzZUNvbmRpdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkEge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2V9IHRoYXQgYWx3YXlzIHJldHVybnMgZmFsc2UuPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIEZhbHNlQ29uZGl0aW9uIGltcGxlbWVudHMgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRmFsc2VDb25kaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlI2V2YWx1YXRlKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisJICovCisJcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoTWV0YWRhdGEgbWV0YWRhdGEsIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9GaWx0ZXJUYXNrLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9GaWx0ZXJUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3YWQzNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL0ZpbHRlclRhc2suamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLldvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uOworCisvKioKKyAqIEZpbHRlcnMgZHluYW1pYyB7QGxpbmsgTWV0YWRhdGF9IGZyb20gdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGluIHRoZQorICoge0BsaW5rICNydW4oTWV0YWRhdGEsIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24pfSBtZXRob2QuCisgKiAKKyAqIFRoZSBjb25maWcgcGFyYW1ldGVyIGluIHtAbGluayAjcnVuKE1ldGFkYXRhLCBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKX0KKyAqIGRlZmluZXMgbWV0YWRhdGEgcGFyYW1ldGVycyB0byByZW1vdmUgYW5kIHJlbmFtZSB2aWEgdGhlIGZvbGxvd2luZworICogZGlyZWN0aXZlczoKKyAqIAorICogPHVsPgorICogPGxpPlJlbW92ZV9LZXkgLSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleXMgdG8gcmVtb3ZlPC9saT4KKyAqIDxsaT5SZW5hbWVfW0tleV0gLSBzZXQgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgdG8gdGhlIG5ldyBuYW1lIG9mIHRoZQorICogW0tleV0gcGFyYW1ldGVyLiBFLmcuLCBoYXZpbmcgYSBrZXkgaW4gdGhlIHRhc2sgY29uZmlndXJhdGlvbiBuYW1lZAorICogUmVuYW1lX0ZpbGVuYW1lIHdpdGggdmFsdWUgc2V0IHRvIFByaW9yX0ZpbGVuYW1lIHdpbGwgcmVuYW1lIHRoZSBrZXkgaW4gdGhlCisgKiBkeW5hbWljIG1ldGFkYXRhIG5hbWVkIEZpbGVuYW1lIHRvIHRoZSBuZXcgbmFtZSBvZiBQcmlvcl9GaWxlbmFtZSwgcHJlc2VydmluZworICogaXRzIHByaW9yIHZhbHVlLjwvbGk+CisgKiA8L3VsPgorICogCisgKiBOb3RlIHRoYXQgdGhlIFJlbmFtZSBrZXlzIHdpbGwgYmUgZXZhbHVhdGVkIGZpcnN0LCBiZWZvcmUgdGhlIFJlbW92ZV9LZXkKKyAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGV2YWx1YXRlZC4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyVGFzayBpbXBsZW1lbnRzIFdvcmtmbG93VGFza0luc3RhbmNlIHsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRU1PVkVfS0VZID0gIlJlbW92ZV9LZXkiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZpbHRlclRhc2suY2xhc3MKKwkJCS5nZXROYW1lKCkpOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcnVuKE1ldGFkYXRhIG1ldGFkYXRhLCBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZykKKwkJCXRocm93cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbiB7CisKKwkJLy8gZXZhbHVhdGUgcmVuYW1lcworCQlmb3IgKE9iamVjdCBjb25maWdLZXkgOiBjb25maWcuZ2V0UHJvcGVydGllcygpLmtleVNldCgpKSB7CisJCQlTdHJpbmcgY29uZmlnS2V5TmFtZSA9IChTdHJpbmcpIGNvbmZpZ0tleTsKKwkJCWlmIChjb25maWdLZXlOYW1lLnN0YXJ0c1dpdGgoIlJlbmFtZSIpKSB7CisJCQkJU3RyaW5nIHJlbmFtZU9yaWdLZXlOYW1lID0gY29uZmlnS2V5TmFtZS5zcGxpdCgiXyIpWzFdOworCQkJCVN0cmluZyByZW5hbWVLZXlOYW1lID0gY29uZmlnLmdldFByb3BlcnR5KGNvbmZpZ0tleU5hbWUpOworCQkJCS8vIGNoZWNrIHRvIHNlZSBpZiBrZXkgZXhpc3RzCisJCQkJaWYgKG1ldGFkYXRhLmNvbnRhaW5zS2V5KHJlbmFtZU9yaWdLZXlOYW1lKSkgeworCQkJCQlMT0cubG9nKExldmVsLklORk8sICJSZW5hbWluZyBrZXk6IFsiICsgcmVuYW1lT3JpZ0tleU5hbWUKKwkJCQkJCQkrICJdIHRvIFsiICsgcmVuYW1lS2V5TmFtZSArICJdOiB2YWx1ZXM6ICIKKwkJCQkJCQkrIG1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKHJlbmFtZU9yaWdLZXlOYW1lKSk7CisJCQkJCW1ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShyZW5hbWVLZXlOYW1lLAorCQkJCQkJCW1ldGFkYXRhLmdldEFsbE1ldGFkYXRhKHJlbmFtZU9yaWdLZXlOYW1lKSk7CisJCQkJCW1ldGFkYXRhLnJlbW92ZU1ldGFkYXRhKHJlbmFtZU9yaWdLZXlOYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJSZXF1ZXN0IHRvIHJlbmFtZSBrZXk6IFsiCisJCQkJCQkJKyByZW5hbWVPcmlnS2V5TmFtZSArICJdIHRvIFsiICsgcmVuYW1lS2V5TmFtZQorCQkJCQkJCSsgIl06IG9yaWcga2V5IGRvZXMgbm90IGV4aXN0IGluIGR5bmFtaWMgbWV0YWRhdGEhIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gZXZhbHVhdGUgcmVtb3ZlcworCQlpZiAoY29uZmlnLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleShSRU1PVkVfS0VZKSkgeworCQkJU3RyaW5nIHJlbW92ZU1ldEtleU5hbWVzID0gY29uZmlnLmdldFByb3BlcnR5KFJFTU9WRV9LRVkpOworCQkJZm9yIChTdHJpbmcga2V5TmFtZSA6IEFycmF5cy5hc0xpc3QocmVtb3ZlTWV0S2V5TmFtZXMuc3BsaXQoIiwiKSkpIHsKKwkJCQkvLyBoYW5kbGUgd2hpdGVzcGFjZQorCQkJCWtleU5hbWUgPSBrZXlOYW1lLnRyaW0oKTsKKwkJCQlpZiAobWV0YWRhdGEuY29udGFpbnNLZXkoa2V5TmFtZSkpIHsKKwkJCQkJTE9HLmxvZyhMZXZlbC5JTkZPLAorCQkJCQkJCSJSZW1vdmluZyBrZXkgZnJvbSB3b3JrZmxvdyBtZXRhZGF0YTogWyIgKyBrZXlOYW1lCisJCQkJCQkJCQkrICJdOiB2YWx1ZXM6ICIKKwkJCQkJCQkJCSsgbWV0YWRhdGEuZ2V0QWxsTWV0YWRhdGEoa2V5TmFtZSkpOworCQkJCQltZXRhZGF0YS5yZW1vdmVNZXRhZGF0YShrZXlOYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJSZXF1ZXN0IHRvIHJlbW92ZSBrZXk6IFsiICsga2V5TmFtZQorCQkJCQkJCSsgIl06IGtleSBkb2VzIG5vdCBleGlzdCBpbiB3b3JrZmxvdyBtZXRhZGF0YSEiKTsgIAorCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9Hb29kYnllV29ybGQuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL0dvb2RieWVXb3JsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTFhNzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9Hb29kYnllV29ybGQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldnNpb24kCisgKiAKKyAqIDxwPkEgc2ltcGxlIHRhc2sgdGhhdCB0YWtlcyBpbiBhIHN0YXRpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciwgIlBlcnNvbiIsIAorICogYW5kIGVjaG9zIHRoZSBzdHJpbmcgIkdvb2RieWUgJHtwZXJzb259Ii48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBHb29kYnllV29ybGQgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgR29vZGJ5ZVdvcmxkKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNJbnN0YW5jZWsjcnVuKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsIAorCSAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJHb29kYnllIFdvcmxkOiAiK2NvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KCJQZXJzb24iKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL0hlbGxvV29ybGQuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL0hlbGxvV29ybGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2FkMzdkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvSGVsbG9Xb3JsZC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2c2lvbiQKKyAqIAorICogPHA+QSBzaW1wbGUgdGFzayB0aGF0IHRha2VzIGluIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVyLCAiUGVyc29uIiwgYW5kIGVjaG9zIHRoZSBTdHJpbmcgIkhlbGxvICR7cGVyc29ufS4iPC9wPgorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCBpbXBsZW1lbnRzIFdvcmtmbG93VGFza0luc3RhbmNlIHsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBIZWxsb1dvcmxkKCkgeworCQkKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrSW5zdGFuY2UjcnVuKGphdmEudXRpbC5NYXAsIAorCSAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZDogIitjb25maWcuZ2V0UHJvcGVydGllcygpLmdldCgiUGVyc29uIikpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTG9uZ0NvbmRpdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTG9uZ0NvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2M1YTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9Mb25nQ29uZGl0aW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+QSBTaW1wbGUgY29uZGl0aW9uIHRoYXQgZXZhbHVhdGVzIHRvIGZhbHNlIGFzIG1hbnkgdGltZXMgYXMgc3BlY2lmaWVkCisgKiBieSB0aGUgZHluYW1pYyBtZXRhZGF0YSBwYXJhbWV0ZXIgIm51bUZhbHNlIi4gQWZ0ZXIgdGhhdCwgdGhlIGNvbmRpdGlvbiByZXR1cm5zCisgKiB0cnVlLjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMb25nQ29uZGl0aW9uIGltcGxlbWVudHMgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSB7CisKKwlwcml2YXRlIGludCB0aW1lc0ZhbHNlID0gMDsKKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgTG9uZ0NvbmRpdGlvbigpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UjZXZhbHVhdGUob3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSkKKwkgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uIGNvbmZpZykgeworCQkvL3NpbXVsYXRlIHRoYXQgdGhpcyBjb25kaXRpb24gdGFrZXMgYSBwYXNzZWQgaW4gYW1vdW50IG9mIHNlY29uZHMgdG8gd2FpdCBmb3IKKwkJCisJCWludCBudW1GYWxzZSA9IChTdHJpbmcpbWV0YWRhdGEuZ2V0TWV0YWRhdGEoIm51bUZhbHNlIikgIT0gbnVsbCA/IEludGVnZXIucGFyc2VJbnQoKFN0cmluZyltZXRhZGF0YS5nZXRNZXRhZGF0YSgibnVtRmFsc2UiKSk6NTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb246IE51bSBmYWxzZTogIitudW1GYWxzZSk7CisJCQorCQlpZih0aW1lc0ZhbHNlIDwgbnVtRmFsc2UpeworCQkJdGltZXNGYWxzZSsrOworCQkJcmV0dXJuIGZhbHNlOwkJCQorCQl9CisJCWVsc2UgcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9Mb25nVGFzay5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTG9uZ1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmNiZDAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTG9uZ1Rhc2suamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIDxwPkFuIGV4YW1wbGUgdGFzayB0byBzaW11bGF0ZSBhY3R1YWwgd29yayB0aGF0IHNob3VsZCBsYXN0CisgKiBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcy48L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgTG9uZ1Rhc2sgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgTG9uZ1Rhc2soKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZSNydW4ob3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSwgCisJICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIHZvaWQgcnVuKE1ldGFkYXRhIG1ldGFkYXRhLCBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZykgeworCQkvL3NpbXVsYXRlIHRoYXQgdGhpcyBqb2IgdGFrZXMgYSBwYXNzZWQgaW4gYW1vdW50IG9mIHNlY29uZHMgdG8gZXhlY3V0ZSBmb3IKKwkJCisJCWxvbmcgd2FpdFNlY29uZHMgPSAoU3RyaW5nKW1ldGFkYXRhLmdldE1ldGFkYXRhKCJudW1TZWNvbmRzIikgIT0gbnVsbCA/IExvbmcucGFyc2VMb25nKChTdHJpbmcpbWV0YWRhdGEuZ2V0TWV0YWRhdGEoIm51bVNlY29uZHMiKSk6MTBMOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhc2s6IE51bSBzZWNvbmRzOiAiK3dhaXRTZWNvbmRzKTsKKwkJCisJCSAgdHJ5eworCQkJICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKHdhaXRTZWNvbmRzKjEwMDApOworCQkgIH0KKwkJICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpe30KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTWFpbFRhc2suamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL01haWxUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4NDgzMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL01haWxUYXNrLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnZTsKK2ltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYWlsLlNlc3Npb247CitpbXBvcnQgamF2YXgubWFpbC5UcmFuc3BvcnQ7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5JbnRlcm5ldEFkZHJlc3M7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIEEgQ0FTIHtAbGluayBXb3JrZmxvd1Rhc2tJbnN0YW5jZX0gcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgYW4gZW1haWwKKyAqIHRvIGEgcmVjaXBpZW50IG5vdGlmeWluZyB0aGVtIG9mIGluZ2VzdC4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNYWlsVGFzayBpbXBsZW1lbnRzIFdvcmtmbG93VGFza0luc3RhbmNlIHsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZSNydW4oZ292Lm5hc2EKKyAgICogLmpwbC5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSwKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24pCisgICAqLworICBwdWJsaWMgdm9pZCBydW4oTWV0YWRhdGEgbWV0YWRhdGEsIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY29uZmlnKQorICAgICAgdGhyb3dzIFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uIHsKKyAgICBQcm9wZXJ0aWVzIG1haWxQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgbWFpbFByb3BzLnNldFByb3BlcnR5KCJtYWlsLmhvc3QiLCAic210cC5qcGwubmFzYS5nb3YiKTsKKyAgICBtYWlsUHJvcHMuc2V0UHJvcGVydHkoIm1haWwudXNlciIsICJtYXR0bWFubiIpOworICAgIAorICAgIFNlc3Npb24gc2Vzc2lvbiA9IFNlc3Npb24uZ2V0SW5zdGFuY2UobWFpbFByb3BzKTsKKworICAgIFN0cmluZyBtc2dUeHQgPSAiSGVsbG8gIgorICAgICAgICArIGNvbmZpZy5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIikKKyAgICAgICAgKyAiOlxuXG4iCisgICAgICAgICsgIllvdSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmdlc3RlZCB0aGUgZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGE6IFxuXG4iCisgICAgICAgICsgZ2V0TXNnU3RyaW5nRnJvbU1ldChtZXRhZGF0YSkgKyAiXG5cbiIgKyAiVGhhbmtzIVxuXG4iICsgIkNBUyI7CisKKyAgICBNZXNzYWdlIG1zZyA9IG5ldyBNaW1lTWVzc2FnZShzZXNzaW9uKTsKKyAgICB0cnkgeworICAgICAgbXNnLnNldFN1YmplY3QoY29uZmlnLmdldFByb3BlcnR5KCJtc2cuc3ViamVjdCIpKTsKKyAgICAgIG1zZy5zZXRTZW50RGF0ZShuZXcgRGF0ZSgpKTsKKyAgICAgIG1zZy5zZXRGcm9tKEludGVybmV0QWRkcmVzcy5wYXJzZShjb25maWcuZ2V0UHJvcGVydHkoIm1haWwuZnJvbSIpKVswXSk7CisgICAgICBtc2cuc2V0UmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUuVE8sIEludGVybmV0QWRkcmVzcy5wYXJzZShjb25maWcKKyAgICAgICAgICAuZ2V0UHJvcGVydHkoIm1haWwudG8iKSwgZmFsc2UpKTsKKyAgICAgIG1zZy5zZXRUZXh0KG1zZ1R4dCk7CisgICAgICBUcmFuc3BvcnQuc2VuZChtc2cpOworCisgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRNc2dTdHJpbmdGcm9tTWV0KE1ldGFkYXRhIG1ldCkgeworICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgZm9yIChPYmplY3Qga2V5IDogbWV0LmdldEhhc2h0YWJsZSgpLmtleVNldCgpKSB7CisgICAgICBTdHJpbmcga2V5U3RyID0gKFN0cmluZykga2V5OworICAgICAgU3RyaW5nQnVmZmVyIHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogbWV0LmdldEFsbE1ldGFkYXRhKGtleVN0cikpIHsKKyAgICAgICAgU3RyaW5nIHZhbFN0ciA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICB2YWwuYXBwZW5kKHZhbFN0cik7CisgICAgICAgIHZhbC5hcHBlbmQoIiwiKTsKKyAgICAgIH0KKyAgICAgIHZhbC5kZWxldGVDaGFyQXQodmFsLmxlbmd0aCgpIC0gMSk7CisKKyAgICAgIGJ1Zi5hcHBlbmQoIlsiICsga2V5U3RyICsgIj0+IiArIHZhbCArICJdXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTm9PcFRhc2suamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL05vT3BUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOGZjZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL05vT3BUYXNrLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb247CisKKy8qKgorICogCisgKiBQZXJmb3JtcyBubyBhY3Rpb24sIGFuIGlzIGEgbm8tb3AuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTm9PcFRhc2sgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrSW5zdGFuY2UjcnVuKG9yZy5hcGFjaGUKKyAgICogLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhLAorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbikKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oTWV0YWRhdGEgbWV0YWRhdGEsIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY29uZmlnKQorICAgICAgdGhyb3dzIFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uIHsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL051bUluY3JlbWVudFRhc2suamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL051bUluY3JlbWVudFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjY1NmYxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvTnVtSW5jcmVtZW50VGFzay5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAc2luY2UgT09EVC01MworICogCisgKiA8cD4KKyAqIFRoaXMgdGFzayBpbGx1c3RyYXRlcyBPT0RULTUzIGJ5IHRha2luZyBhIDxjb2RlPm51bTwvY29kZT4ge0BsaW5rIE1ldGFkYXRhfQorICogcGFyYW1ldGVyIGFuZCB0aGVuIGluY3JlbWVudGluZyBpdC4gU3Vic2VxdWVudCBleGVjdXRpb25zIG9mIHRoaXMgc2FtZQorICoge0BsaW5rIFdvcmtmbG93VGFza0luc3RhbmNlfSB3aXRoaW4gYSB7QGxpbmsgV29ya2Zsb3d9IHNob3VsZCB5aWVsZAorICogaW5jcmVtZW50ZWQgdmVyc2lvbnMgb2YgdGhlIGluaXRpYWxseSBwcm92aWRlZCA8Y29kZT5udW08L2NvZGU+IHBhcmFtZXRlci4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBOdW1JbmNyZW1lbnRUYXNrIGltcGxlbWVudHMgV29ya2Zsb3dUYXNrSW5zdGFuY2UgeworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlI3J1bihvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhLAorICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorICAgKi8KKyAgcHVibGljIHZvaWQgcnVuKE1ldGFkYXRhIG1ldGFkYXRhLCBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgIC8vIHJlYWQgdGhlIG51bSBmcm9tIHRoZSBtZXRhZGF0YSwgYW5kIHRoZW4gaW5jcmVtZW50IGl0CisgICAgLy8gYW5kIHVwZGF0ZSB0aGUgbWV0YWRhdGEKKyAgICBpZiAobWV0YWRhdGEuZ2V0TWV0YWRhdGEoIm51bSIpID09IG51bGwKKyAgICAgICAgfHwgKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJudW0iKSAhPSBudWxsICYmIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJudW0iKQorICAgICAgICAgICAgLmVxdWFscygiIikpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bSA9IEludGVnZXIucGFyc2VJbnQobWV0YWRhdGEuZ2V0TWV0YWRhdGEoIm51bSIpKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bSBwcmUgaW5jcmVtZW50OiBbIitudW0rIl0iKTsKKyAgICBudW0rKzsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bSBwb3N0IGluY3JlbWVudDogWyIrbnVtKyJdIik7CisgICAgbWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKCJudW0iLCBTdHJpbmcudmFsdWVPZihudW0pKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9SYW5kb21TdGF0dXNVcGRhdGVUYXNrLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9SYW5kb21TdGF0dXNVcGRhdGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhMDhmYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL1JhbmRvbVN0YXR1c1VwZGF0ZVRhc2suamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiBUaGlzIGNsYXNzIGlsbHVzdHJhdGVzIE9PRFQtODYsIGRlbW9uc3RyYXRpbmcgaG93IHRoZSBtZXRob2QKKyAqIHtAbGluayBYbWxScGNXb3JrZmxvd01hbmFnZXIjdXBkYXRlV29ya2Zsb3dJbnN0YW5jZShqYXZhLnV0aWwuSGFzaHRhYmxlKX0KKyAqIGFsbG93cyBhIHVzZXIgdG8gY2hhbmdlIHRoZSBzdGF0dXMgb2YgYSBnaXZlbiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0KKyAqIHByb2dyYW1tYXRpY2FsbHkuCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5kb21TdGF0dXNVcGRhdGVUYXNrIGltcGxlbWVudHMgV29ya2Zsb3dUYXNrSW5zdGFuY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhdHVzZXMgPSBuZXcgU3RyaW5nW10geyAiVEhJTktJTkciLAorICAgICAgICAgICAgIlJVTk5JTkciLCAiV0FJVElORyIsICJJTkZJTklURUxZIFdBSVRJTkciLCAiV0FUQ0hJTkcgVFYiLAorICAgICAgICAgICAgIlNMRUVQSU5HIiwgIkRSRUFNSU5HIiwgIldPUktJTkciLCAiV0FUQ0hJTkcgTU9WSUVTIiB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtU3RhdHVzZXNUb0Rpc3BsYXkgPSAxMDsKKworICAgIHByaXZhdGUgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZSNydW4ob3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgLy8gdGhlIGdvYWwgaW4gdGhpcyB0YXNrIHRvIGlzIHJhbmRvbWx5IGRpc3BsYXkgc3RhdHVzZXMsIGFuZCB0aGVuIHNsZWVwCisgICAgICAgIC8vIGZvciA1IHNlY29uZHMKKyAgICAgICAgLy8gYWZ0ZXIgZWFjaCBzdGF0dXMgaXMgcGlja2VkCisgICAgICAgIHNldFdvcmtmbG93TWdyVXJsKG1ldGFkYXRhLmdldE1ldGFkYXRhKCJXb3JrZmxvd01hbmFnZXJVcmwiKSk7CisgICAgICAgIFN0cmluZyB3b3JrZmxvd0luc3RJZCA9IG1ldGFkYXRhLmdldE1ldGFkYXRhKCJXb3JrZmxvd0luc3RJZCIpOworCisgICAgICAgIGludCBudW1QaWNrZWQgPSAwOworICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICB3aGlsZSAobnVtUGlja2VkIDwgMTApIHsKKyAgICAgICAgICAgIGludCBpZHggPSByLm5leHRJbnQoc3RhdHVzZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIFN0cmluZyBzdGF0dXNQaWNrZWQgPSBzdGF0dXNlc1tpZHhdOworICAgICAgICAgICAgdXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyh3b3JrZmxvd0luc3RJZCwgc3RhdHVzUGlja2VkKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MDAwTCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bVBpY2tlZCsrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyhTdHJpbmcgd0luc3RJZCwgU3RyaW5nIHN0YXR1cykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlbmRpbmcgc3RhdHVzIHVwZGF0ZSBmb3IgIit3SW5zdElkKyIsIitzdGF0dXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5jbGllbnQudXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyh3SW5zdElkLCBzdGF0dXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFdvcmtmbG93TWdyVXJsKFN0cmluZyB3bVVybFN0cikgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3RpbmcgdG8gd29ya2Zsb3cgbWdyOiBbIit3bVVybFN0cisiXSIpOworICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQoc2FmZUdldFVybCh3bVVybFN0cikpOworICAgIH0KKworICAgIHByaXZhdGUgVVJMIHNhZmVHZXRVcmwoU3RyaW5nIHVybFN0cikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJsU3RyKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvVHJ1ZUNvbmRpdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvVHJ1ZUNvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTgyYjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9UcnVlQ29uZGl0aW9uLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2c2lvbiQKKyAqIAorICogPHA+QSBzaW1wbGUgY29uZGl0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aGVuIGludm9rZWQuPC9wPgorICovCitwdWJsaWMgY2xhc3MgVHJ1ZUNvbmRpdGlvbiBpbXBsZW1lbnRzIFdvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UgeworCisJLyoqCisJICogCisJICovCisJcHVibGljIFRydWVDb25kaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlI2V2YWx1YXRlKG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEpCisJICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoTWV0YWRhdGEgbWV0YWRhdGEsIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9BYnN0cmFjdFBhZ2luYXRpYmxlSW5zdGFuY2VSZXBvc2l0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9BYnN0cmFjdFBhZ2luYXRpYmxlSW5zdGFuY2VSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMWVlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0Fic3RyYWN0UGFnaW5hdGlibGVJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5JbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMucGFnaW5hdGlvbi5QYWdpbmF0aW9uVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFnaW5hdGlibGVJbnN0YW5jZVJlcG9zaXRvcnkgaW1wbGVtZW50cworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSB7CisKKyAgICBwcm90ZWN0ZWQgaW50IHBhZ2VTaXplID0gLTE7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoQWJzdHJhY3RQYWdpbmF0aWJsZUluc3RhbmNlUmVwb3NpdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuUGFnaW5hdGlvbiNnZXRGaXJzdFBhZ2UoKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBnZXRGaXJzdFBhZ2UoKSB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIGZpcnN0UGFnZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpcnN0UGFnZSA9IGdldFBhZ2VkV29ya2Zsb3dzKDEpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIGZpcnN0IHBhZ2U6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpcnN0UGFnZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5QYWdpbmF0aW9uI2dldExhc3RQYWdlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0TGFzdFBhZ2UoKSB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIGxhc3RQYWdlID0gbnVsbDsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZmlyc3RQYWdlID0gZ2V0Rmlyc3RQYWdlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxhc3RQYWdlID0gZ2V0UGFnZWRXb3JrZmxvd3MoZmlyc3RQYWdlLmdldFRvdGFsUGFnZXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBsYXN0IHBhZ2U6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGFzdFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuUGFnaW5hdGlvbiNnZXROZXh0UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2UpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldE5leHRQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlIGN1cnJlbnRQYWdlKSB7CisgICAgICAgIGlmIChjdXJyZW50UGFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3RQYWdlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudFBhZ2UuaXNMYXN0UGFnZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBuZXh0UGFnZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5leHRQYWdlID0gZ2V0UGFnZWRXb3JrZmxvd3MoY3VycmVudFBhZ2UuZ2V0UGFnZU51bSgpICsgMSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBuZXh0IHBhZ2U6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV4dFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuUGFnaW5hdGlvbiNnZXRQcmV2UGFnZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2UpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldFByZXZQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlIGN1cnJlbnRQYWdlKSB7CisgICAgICAgIGlmIChjdXJyZW50UGFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3RQYWdlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudFBhZ2UuaXNMYXN0UGFnZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBuZXh0UGFnZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5leHRQYWdlID0gZ2V0UGFnZWRXb3JrZmxvd3MoY3VycmVudFBhZ2UuZ2V0UGFnZU51bSgpIC0gMSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyBuZXh0IHBhZ2U6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV4dFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuUGFnaW5hdGlvbiNnZXRQYWdlZFdvcmtmbG93cyhpbnQpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldFBhZ2VkV29ya2Zsb3dzKGludCBwYWdlTnVtKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRQYWdlZFdvcmtmbG93cyhwYWdlTnVtLCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5QYWdpbmF0aW9uI2dldFBhZ2VkV29ya2Zsb3dzKGludCwKKyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldFBhZ2VkV29ya2Zsb3dzKGludCBwYWdlTnVtLCBTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIGludCB0b3RhbFBhZ2VzID0gUGFnaW5hdGlvblV0aWxzLmdldFRvdGFsUGFnZSgKKyAgICAgICAgICAgICAgICBzdGF0dXMgIT0gbnVsbCA/IGdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpLCB0aGlzLnBhZ2VTaXplKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBpZiB0aGVyZSBhcmUgMCB0b3RhbCBwYWdlcyBpbiB0aGUgcmVzdWx0IGxpc3Qgc2l6ZSB0aGVuIGRvbid0IGJvdGhlcgorICAgICAgICAgKiByZXR1cm5pbmcgYSB2YWxpZCBwcm9kdWN0IHBhZ2UgaW5zdGVhZCwgcmV0dXJuIGJsYW5rIFByb2R1Y3RQYWdlCisgICAgICAgICAqLworICAgICAgICBpZiAodG90YWxQYWdlcyA9PSAwIHx8IHBhZ2VOdW0gPiB0b3RhbFBhZ2VzIHx8IHBhZ2VOdW0gPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFdvcmtmbG93SW5zdGFuY2VQYWdlLmJsYW5rUGFnZSgpOworICAgICAgICB9CisKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcmV0UGFnZSA9IG5ldyBXb3JrZmxvd0luc3RhbmNlUGFnZSgpOworICAgICAgICByZXRQYWdlLnNldFBhZ2VOdW0ocGFnZU51bSk7CisgICAgICAgIHJldFBhZ2Uuc2V0UGFnZVNpemUodGhpcy5wYWdlU2l6ZSk7CisgICAgICAgIHJldFBhZ2Uuc2V0VG90YWxQYWdlcyh0b3RhbFBhZ2VzKTsKKworICAgICAgICBMaXN0IHdJbnN0SWRzID0gcGFnaW5hdGVXb3JrZmxvd3MocGFnZU51bSwgc3RhdHVzKTsKKworICAgICAgICBpZiAod0luc3RJZHMgIT0gbnVsbCAmJiB3SW5zdElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBMaXN0IHdvcmtmbG93SW5zdGFuY2VzID0gbmV3IFZlY3Rvcih3SW5zdElkcy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3SW5zdElkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgd29ya2Zsb3dJbnN0SWQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBnZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3b3JrZmxvd0luc3RJZCk7CisgICAgICAgICAgICAgICAgd29ya2Zsb3dJbnN0YW5jZXMuYWRkKGluc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXRQYWdlLnNldFBhZ2VXb3JrZmxvd3Mod29ya2Zsb3dJbnN0YW5jZXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldFBhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHBhZ2VOdW0KKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCBwYWdpbmF0ZVdvcmtmbG93cyhpbnQgcGFnZU51bSkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFnaW5hdGVXb3JrZmxvd3MocGFnZU51bSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHBhZ2VOdW0KKyAgICAgKiBAcGFyYW0gc3RhdHVzCisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgcGFnaW5hdGVXb3JrZmxvd3MoaW50IHBhZ2VOdW0sIFN0cmluZyBzdGF0dXMpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9EYXRhU291cmNlV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0RhdGFTb3VyY2VXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjcyY2MKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9EYXRhU291cmNlV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwbzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5JbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkRiU3RydWN0RmFjdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnl9IHRoYXQgcGVyc2lzdHMge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cworICogdG8gYSBKREJDLWFjY2Vzc2libGUgREJNUy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgZXh0ZW5kcworICAgICAgICBBYnN0cmFjdFBhZ2luYXRpYmxlSW5zdGFuY2VSZXBvc2l0b3J5IHsKKworICAgIC8qIG91ciBkYXRhIHNvdXJjZSAqLworICAgIHByaXZhdGUgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihEYXRhU291cmNlV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qIHNob3VsZCB3ZSBxdW90ZSBmaWVsZHMgb3Igbm90ICovCisgICAgcHJpdmF0ZSBib29sZWFuIHF1b3RlRmllbGRzID0gZmFsc2U7CisKKyAgICBwdWJsaWMgRGF0YVNvdXJjZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5KERhdGFTb3VyY2UgZHMsCisgICAgICAgICAgICBib29sZWFuIHF1b3RlRmllbGRzLCBpbnQgcGFnZVNpemUpIHsKKyAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZHM7CisgICAgICAgIHRoaXMucXVvdGVGaWVsZHMgPSBxdW90ZUZpZWxkczsKKyAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjYWRkV29ya2Zsb3dJbnN0YW5jZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIHN0YXJ0V29ya2Zsb3dTcWwgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHRhc2tJZEZpZWxkID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0lkRmllbGQgPSBudWxsOworCisgICAgICAgICAgICBpZiAocXVvdGVGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICB0YXNrSWRGaWVsZCA9ICInIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFdvcmtmbG93VGFzaykgd0luc3QuZ2V0V29ya2Zsb3coKS5nZXRUYXNrcygpLmdldCgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRhc2tJZCgpICsgIiciOworICAgICAgICAgICAgICAgIHdvcmtmbG93SWRGaWVsZCA9ICInIiArIHdJbnN0LmdldFdvcmtmbG93KCkuZ2V0SWQoKSArICInIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGFza0lkRmllbGQgPSAoKFdvcmtmbG93VGFzaykgd0luc3QuZ2V0V29ya2Zsb3coKS5nZXRUYXNrcygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDApKS5nZXRUYXNrSWQoKTsKKyAgICAgICAgICAgICAgICB3b3JrZmxvd0lkRmllbGQgPSB3SW5zdC5nZXRXb3JrZmxvdygpLmdldElkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXJ0V29ya2Zsb3dTcWwgPSAiSU5TRVJUIElOVE8gd29ya2Zsb3dfaW5zdGFuY2VzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiKHdvcmtmbG93X2luc3RhbmNlX3N0YXR1cywgd29ya2Zsb3dfaWQsIGN1cnJlbnRfdGFza19pZCwiCisgICAgICAgICAgICAgICAgICAgICsgInN0YXJ0X2RhdGVfdGltZSwgZW5kX2RhdGVfdGltZSwgY3VycmVudF90YXNrX3N0YXJ0X2RhdGVfdGltZSwiCisgICAgICAgICAgICAgICAgICAgICsgImN1cnJlbnRfdGFza19lbmRfZGF0ZV90aW1lLCBwcmlvcml0eSwgdGltZXNfYmxvY2tlZCkgIiArICJWQUxVRVMgKCciCisgICAgICAgICAgICAgICAgICAgICsgd0luc3QuZ2V0U3RhdHVzKCkgKyAiJywgIiArIHdvcmtmbG93SWRGaWVsZCArICIsIgorICAgICAgICAgICAgICAgICAgICArIHRhc2tJZEZpZWxkICsgIiwgJyIgKyB3SW5zdC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJywnIiArIHdJbnN0LmdldEVuZERhdGVUaW1lSXNvU3RyKCkgKyAiJywnIgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpICsgIicsJyIKKyAgICAgICAgICAgICAgICAgICAgKyB3SW5zdC5nZXRDdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyKCkgKyAiJywgIit3SW5zdC5nZXRQcmlvcml0eSgpLmdldFZhbHVlKCkrIiwgIgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldFRpbWVzQmxvY2tlZCgpICsgIikiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJzcWw6IEV4ZWN1dGluZzogIiArIHN0YXJ0V29ya2Zsb3dTcWwpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoc3RhcnRXb3JrZmxvd1NxbCk7CisKKyAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0luc3RJZCA9IG5ldyBTdHJpbmcoKTsKKworICAgICAgICAgICAgc3luY2hyb25pemVkICh3b3JrZmxvd0luc3RJZCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBnZXRXb3JrZmxvd0luc3RJZFNxbCA9ICJTRUxFQ1QgTUFYKHdvcmtmbG93X2luc3RhbmNlX2lkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJBUyBtYXhfaWQgRlJPTSB3b3JrZmxvd19pbnN0YW5jZXMiOworCisgICAgICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFdvcmtmbG93SW5zdElkU3FsKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJbnN0SWQgPSBTdHJpbmcudmFsdWVPZihycy5nZXRJbnQoIm1heF9pZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgICAgICB3SW5zdC5zZXRJZCh3b3JrZmxvd0luc3RJZCk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhZGQgaXRzIG1ldGFkYXRhCisgICAgICAgICAgICBhZGRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEod0luc3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBzdGFydGluZyB3b3JrZmxvdy4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIHN0YXJ0V29ya2Zsb3cgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSN1cGRhdGVXb3JrZmxvd0luc3RhbmNlKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVXb3JrZmxvd0luc3RhbmNlKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFN0cmluZyB0YXNrSWRGaWVsZCA9IG51bGwsIHdvcmtmbG93SWRGaWVsZCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBpZiAocXVvdGVGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICB0YXNrSWRGaWVsZCA9ICInIiArIHdJbnN0LmdldEN1cnJlbnRUYXNrSWQoKSArICInIjsKKyAgICAgICAgICAgICAgICB3b3JrZmxvd0lkRmllbGQgPSAiJyIgKyB3SW5zdC5nZXRXb3JrZmxvdygpLmdldElkKCkgKyAiJyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRhc2tJZEZpZWxkID0gd0luc3QuZ2V0Q3VycmVudFRhc2tJZCgpOworICAgICAgICAgICAgICAgIHdvcmtmbG93SWRGaWVsZCA9IHdJbnN0LmdldFdvcmtmbG93KCkuZ2V0SWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHVwZGF0ZVN0YXR1c1NxbCA9ICJVUERBVEUgd29ya2Zsb3dfaW5zdGFuY2VzIFNFVCAiCisgICAgICAgICAgICAgICAgICAgICsgIndvcmtmbG93X2luc3RhbmNlX3N0YXR1cz0nIiArIHdJbnN0LmdldFN0YXR1cygpCisgICAgICAgICAgICAgICAgICAgICsgIicsIGN1cnJlbnRfdGFza19pZD0iICsgdGFza0lkRmllbGQgKyAiLCB3b3JrZmxvd19pZCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyB3b3JrZmxvd0lkRmllbGQgKyAiLHN0YXJ0X2RhdGVfdGltZT0nIgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKSArICInLCIgKyAiZW5kX2RhdGVfdGltZT0nIgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldEVuZERhdGVUaW1lSXNvU3RyKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJyxjdXJyZW50X3Rhc2tfc3RhcnRfZGF0ZV90aW1lPSciCisgICAgICAgICAgICAgICAgICAgICsgd0luc3QuZ2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiJyxjdXJyZW50X3Rhc2tfZW5kX2RhdGVfdGltZT0nIgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoKQorICAgICAgICAgICAgICAgICAgICArICInLHByaW9yaXR5PSIKKyAgICAgICAgICAgICAgICAgICAgKyB3SW5zdC5nZXRQcmlvcml0eSgpLmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLHRpbWVzX2Jsb2NrZWQ9IgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldFRpbWVzQmxvY2tlZCgpCisgICAgICAgICAgICAgICAgICAgICsiIFdIRVJFIHdvcmtmbG93X2luc3RhbmNlX2lkID0gIiArIHdJbnN0LmdldElkKCk7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgInVwZGF0ZVN0YXR1c1NxbDogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgdXBkYXRlU3RhdHVzU3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKHVwZGF0ZVN0YXR1c1NxbCk7CisgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworCisgICAgICAgICAgICAvLyBub3cgdXBkYXRlIGl0cyBtZXRhZGF0YQorICAgICAgICAgICAgcmVtb3ZlV29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKHdJbnN0LmdldElkKCkpOworICAgICAgICAgICAgYWRkV29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKHdJbnN0KTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiB1cGRhdGluZyB3b3JrZmxvdyBpbnN0YW5jZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgdXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjcmVtb3ZlV29ya2Zsb3dJbnN0YW5jZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGRlbGV0ZVNxbCA9ICJERUxFVEUgRlJPTSB3b3JrZmxvd19pbnN0YW5jZXMgIgorICAgICAgICAgICAgICAgICAgICArICJXSEVSRSB3b3JrZmxvd19pbnN0YW5jZV9pZCA9ICIgKyB3SW5zdC5nZXRJZCgpOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJzcWw6IEV4ZWN1dGluZzogIiArIGRlbGV0ZVNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShkZWxldGVTcWwpOworICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKworICAgICAgICAgICAgLy8gbm93IHJlbW92ZSBpdHMgbWV0YWRhdGEKKyAgICAgICAgICAgIHJlbW92ZVdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YSh3SW5zdC5nZXRJZCgpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiByZW1vdmluZyB3b3JrZmxvdyBpbnN0YW5jZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgcmVtb3ZlV29ya2Zsb3dJbnN0YW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZSBnZXRXb3JrZmxvd0luc3RhbmNlQnlJZChTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSB3b3JrZmxvd0luc3QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0V29ya2Zsb3dTcWwgPSAiU0VMRUNUICogZnJvbSB3b3JrZmxvd19pbnN0YW5jZXMgIgorICAgICAgICAgICAgICAgICAgICArICJXSEVSRSB3b3JrZmxvd19pbnN0YW5jZV9pZCA9ICIgKyB3b3JrZmxvd0luc3RJZDsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQ6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICArIGdldFdvcmtmbG93U3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRXb3JrZmxvd1NxbCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3QgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dJbnN0YW5jZShycyk7CisgICAgICAgICAgICAgICAgLy8gYWRkIGl0cyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNoYXJlZENvbnRleHQoZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3cgaW5zdGFuY2UuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFdvcmtmbG93SW5zdGFuY2VCeUlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3b3JrZmxvd0luc3Q7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXRXb3JrZmxvd0luc3RhbmNlcygpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0V29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIExpc3Qgd29ya2Zsb3dJbnN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRXb3JrZmxvd1NxbCA9ICJTRUxFQ1QgKiBmcm9tIHdvcmtmbG93X2luc3RhbmNlcyAiCisgICAgICAgICAgICAgICAgICAgICsgIk9SREVSIEJZIHdvcmtmbG93X2luc3RhbmNlX2lkIERFU0MiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRXb3JrZmxvd0luc3RhbmNlczogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0V29ya2Zsb3dTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFdvcmtmbG93U3FsKTsKKworICAgICAgICAgICAgd29ya2Zsb3dJbnN0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdCA9IERiU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtmbG93SW5zdGFuY2UocnMpOworICAgICAgICAgICAgICAgIC8vIGFkZCBpdHMgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaGFyZWRDb250ZXh0KGdldFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YSh3b3JrZmxvd0luc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElkKCkpKTsKKyAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3RzLmFkZCh3b3JrZmxvd0luc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3cgaW5zdGFuY2UuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFdvcmtmbG93SW5zdGFuY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3b3JrZmxvd0luc3RzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUuV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICBMaXN0IHdvcmtmbG93SW5zdHMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0V29ya2Zsb3dTcWwgPSAiU0VMRUNUICogZnJvbSB3b3JrZmxvd19pbnN0YW5jZXMgIgorICAgICAgICAgICAgICAgICAgICArICJXSEVSRSB3b3JrZmxvd19pbnN0YW5jZV9zdGF0dXMgPSAnIiArIHN0YXR1cworICAgICAgICAgICAgICAgICAgICArICInIE9SREVSIEJZIHdvcmtmbG93X2luc3RhbmNlX2lkIERFU0MiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRXb3JrZmxvd1NxbCk7CisgICAgICAgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0V29ya2Zsb3dTcWwpOworCisgICAgICAgICAgICB3b3JrZmxvd0luc3RzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd29ya2Zsb3dJbnN0ID0gRGJTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dJbnN0YW5jZShycyk7CisgICAgICAgICAgICAgICAgLy8gYWRkIGl0cyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNoYXJlZENvbnRleHQoZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSkpOworICAgICAgICAgICAgICAgIHdvcmtmbG93SW5zdHMuYWRkKHdvcmtmbG93SW5zdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyB3b3JrZmxvdyBpbnN0YW5jZS4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd29ya2Zsb3dJbnN0czsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIGludCBudW1JbnN0cyA9IC0xOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICAgICAgICBTdHJpbmcgZ2V0V29ya2Zsb3dTcWwgPSAiU0VMRUNUIENPVU5UKHdvcmtmbG93X2luc3RhbmNlX2lkKSBBUyBudW1faW5zdHMgZnJvbSB3b3JrZmxvd19pbnN0YW5jZXMiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXROdW1Xb3JrZmxvd0luc3RhbmNlczogRXhlY3V0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0V29ya2Zsb3dTcWwpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFdvcmtmbG93U3FsKTsKKworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIG51bUluc3RzID0gcnMuZ2V0SW50KCJudW1faW5zdHMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIG51bSB3b3JrZmxvdyBpbnN0YW5jZXMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldE51bVdvcmtmbG93SW5zdGFuY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudW1JbnN0czsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICBpbnQgbnVtSW5zdHMgPSAtMTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFdvcmtmbG93U3FsID0gIlNFTEVDVCBDT1VOVCh3b3JrZmxvd19pbnN0YW5jZV9pZCkgQVMgbnVtX2luc3RzIGZyb20gd29ya2Zsb3dfaW5zdGFuY2VzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiV0hFUkUgd29ya2Zsb3dfaW5zdGFuY2Vfc3RhdHVzID0gJyIgKyBzdGF0dXMgKyAiJyI7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXM6IEV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICArIGdldFdvcmtmbG93U3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRXb3JrZmxvd1NxbCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBudW1JbnN0cyA9IHJzLmdldEludCgibnVtX2luc3RzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBudW0gd29ya2Zsb3cgaW5zdGFuY2VzIGJ5IHN0YXR1cy4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVtSW5zdHM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIExpc3QgcGFnaW5hdGVXb3JrZmxvd3MoaW50IHBhZ2VOdW0sIFN0cmluZyBzdGF0dXMpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgTGlzdCB3SW5zdElkcyA9IG51bGw7CisgICAgICAgIGludCBudW1SZXN1bHRzID0gLTE7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsIHx8IChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIG51bVJlc3VsdHMgPSBnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtUmVzdWx0cyA9IGdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudChSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsCisgICAgICAgICAgICAgICAgICAgIFJlc3VsdFNldC5DT05DVVJfUkVBRF9PTkxZKTsKKworICAgICAgICAgICAgU3RyaW5nIGdldFdvcmtmbG93U3FsID0gIlNFTEVDVCB3b3JrZmxvd19pbnN0YW5jZV9pZCBGUk9NIHdvcmtmbG93X2luc3RhbmNlcyAiOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGdldFdvcmtmbG93U3FsICs9ICJXSEVSRSB3b3JrZmxvd19pbnN0YW5jZV9zdGF0dXMgPSAnIiArIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyI7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2V0V29ya2Zsb3dTcWwgKz0gIk9SREVSIEJZIHdvcmtmbG93X2luc3RhbmNlX2lkIERFU0MgIjsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAid29ya2Zsb3cgaW5zdGFuY2UgcGFnZWQgcXVlcnk6IGV4ZWN1dGluZzogIgorICAgICAgICAgICAgICAgICAgICArIGdldFdvcmtmbG93U3FsKTsKKworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFdvcmtmbG93U3FsKTsKKyAgICAgICAgICAgIHdJbnN0SWRzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgICAgICBpbnQgc3RhcnROdW0gPSAocGFnZU51bSAtIDEpICogcGFnZVNpemU7CisKKyAgICAgICAgICAgIGlmIChzdGFydE51bSA+IG51bVJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICBzdGFydE51bSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG11c3QgY2FsbCBuZXh0IGZpcnN0LCBvciBlbHNlIG5vIHJlbGF0aXZlIGN1cnNvcgorICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGZpcnN0IG9uZQorICAgICAgICAgICAgICAgIGludCBudW1HcmFiYmVkID0gLTE7CisgICAgICAgICAgICAgICAgaWYocGFnZU51bSA9PSAxKXsKKyAgICAgICAgICAgICAgICAgICAgbnVtR3JhYmJlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdJbnN0SWRzLmFkZChycy5nZXRTdHJpbmcoIndvcmtmbG93X2luc3RhbmNlX2lkIikpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIG51bUdyYWJiZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHBhZ2VOdW0gIT0gMSl7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgcnMucmVsYXRpdmUoc3RhcnROdW0pOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZ3JhYiB0aGUgcmVzdAorICAgICAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkgJiYgbnVtR3JhYmJlZCA8IHBhZ2VTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3SW5zdElkID0gcnMuZ2V0U3RyaW5nKCJ3b3JrZmxvd19pbnN0YW5jZV9pZCIpOworICAgICAgICAgICAgICAgICAgICB3SW5zdElkcy5hZGQod0luc3RJZCk7CisgICAgICAgICAgICAgICAgICAgIG51bUdyYWJiZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3SW5zdElkcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHdJbnN0SWRzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBwZXJmb3JtaW5nIHF1ZXJ5LiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgcXVlcnkgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3SW5zdElkczsKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGFkYXRhIGdldFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRXb3JrZmxvd1NxbCA9ICJTRUxFQ1QgKiBmcm9tIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgKyAiV0hFUkUgd29ya2Zsb3dfaW5zdGFuY2VfaWQgPSAiICsgd29ya2Zsb3dJbnN0SWQ7CisKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIkV4ZWN1dGluZzogIiArIGdldFdvcmtmbG93U3FsKTsKKyAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRXb3JrZmxvd1NxbCk7CisKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBtZXQuYWRkTWV0YWRhdGEocnMuZ2V0U3RyaW5nKCJ3b3JrZmxvd19tZXRfa2V5IiksIFVSTERlY29kZXIuZGVjb2RlKHJzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJ3b3JrZmxvd19tZXRfdmFsIiksICJVVEYtOCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHdvcmtmbG93IGluc3RhbmNlIG1ldGFkYXRhLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRXb3JrZmxvd0luc3RhbmNlc01ldGFkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEoV29ya2Zsb3dJbnN0YW5jZSBpbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGluc3QuZ2V0U2hhcmVkQ29udGV4dCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBpbnN0LmdldFNoYXJlZENvbnRleHQoKS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbnN0LmdldFNoYXJlZENvbnRleHQoKS5nZXRIYXNodGFibGUoKS5rZXlTZXQoKQorICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIExpc3QgdmFscyA9IGluc3QuZ2V0U2hhcmVkQ29udGV4dCgpLmdldEFsbE1ldGFkYXRhKGtleSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCAmJiB2YWxzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gdmFscy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSBqLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCAmJiAhdmFsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNZXRhZGF0YVZhbHVlKGluc3QuZ2V0SWQoKSwga2V5LCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWV0YWRhdGFWYWx1ZShTdHJpbmcgd0luc3RJZCwgU3RyaW5nIGtleSwKKyAgICAgICAgICAgIFN0cmluZyB2YWwpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgYWRkTWV0U3FsID0gIklOU0VSVCBJTlRPIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhIgorICAgICAgICAgICAgICAgICAgICArICIgKHdvcmtmbG93X2luc3RhbmNlX2lkLHdvcmtmbG93X21ldF9rZXksd29ya2Zsb3dfbWV0X3ZhbCkgVkFMVUVTICgiCisgICAgICAgICAgICAgICAgICAgICsgd0luc3RJZCArICIsJyIgKyBrZXkgKyAiJywnIiArIFVSTEVuY29kZXIuZW5jb2RlKHZhbCwgIlVURi04IikgKyAiJykiOworCisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJzcWw6IEV4ZWN1dGluZzogIiArIGFkZE1ldFNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShhZGRNZXRTcWwpOworCisgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBhZGRpbmcgbWV0YWRhdGEgWyIgKyBrZXkgKyAiPT4iCisgICAgICAgICAgICAgICAgICAgICsgdmFsICsgIl0gdG8gd29ya2Zsb3cgaW5zdDogWyIgKyB3SW5zdElkICsgIl0uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBhZGRNZXRhZGF0YVZhbHVlIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEoCisgICAgICAgICAgICBTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBkZWxldGVTcWwgPSAiREVMRVRFIEZST00gd29ya2Zsb3dfaW5zdGFuY2VfbWV0YWRhdGEgIgorICAgICAgICAgICAgICAgICAgICArICJXSEVSRSB3b3JrZmxvd19pbnN0YW5jZV9pZCA9ICIgKyB3b3JrZmxvd0luc3RJZDsKKworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAic3FsOiBFeGVjdXRpbmc6ICIgKyBkZWxldGVTcWwpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoZGVsZXRlU3FsKTsKKyAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gcmVtb3Zpbmcgd29ya2Zsb3cgaW5zdGFuY2UgbWV0YWRhdGEuIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIHJlbW92ZVdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0RhdGFTb3VyY2VXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0RhdGFTb3VyY2VXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDJhYTZiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vRGF0YVNvdXJjZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG87CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5OworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuRHJpdmVyTWFuYWdlckNvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLlBvb2xhYmxlQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuUG9vbGluZ0RhdGFTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLnBvb2wuaW1wbC5HZW5lcmljT2JqZWN0UG9vbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBEYXRhU291cmNlfSBiYXNlZAorICoge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5fXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkgeworCisgICAgLyogb3VyIGRhdGEgc291cmNlICovCisgICAgcHJpdmF0ZSBEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBudWxsOworCisgICAgLyogd2hldGhlciBvciBub3Qgd2UgYXJlIHF1b3RpbmcgdGhlIHRhc2tfaWQgYW5kIHdvcmtmbG93X2lkIGZpZWxkcyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBxdW90ZUZpZWxkcyA9IGZhbHNlOworCisgICAgLyogdGhlIG51bWJlciBvZiB3b3JrZmxvdyBpbnN0YW5jZXMgcmV0dXJuZWQgcGVyIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nICovCisgICAgcHJpdmF0ZSBpbnQgcGFnZVNpemUgPSAtMTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIERhdGFTb3VyY2VXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpkYmNVcmwgPSBudWxsLCB1c2VyID0gbnVsbCwgcGFzcyA9IG51bGwsIGRyaXZlciA9IG51bGw7CisKKyAgICAgICAgamRiY1VybCA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmRhdGFzb3VyY2UuamRiYy51cmwiKSk7CisgICAgICAgIHVzZXIgPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLmpkYmMudXNlciIpKTsKKyAgICAgICAgcGFzcyA9IFBhdGhVdGlscworICAgICAgICAgICAgICAgIC5yZXBsYWNlRW52VmFyaWFibGVzKFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmRhdGFzb3VyY2UuamRiYy5wYXNzIikpOworICAgICAgICBkcml2ZXIgPSBQYXRoVXRpbHMKKyAgICAgICAgICAgICAgICAucmVwbGFjZUVudlZhcmlhYmxlcyhTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLmpkYmMuZHJpdmVyIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKGRyaXZlcik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgZHJpdmVyOiAiICsgZHJpdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEdlbmVyaWNPYmplY3RQb29sIGNvbm5lY3Rpb25Qb29sID0gbmV3IEdlbmVyaWNPYmplY3RQb29sKG51bGwpOworICAgICAgICBDb25uZWN0aW9uRmFjdG9yeSBjb25uZWN0aW9uRmFjdG9yeSA9IG5ldyBEcml2ZXJNYW5hZ2VyQ29ubmVjdGlvbkZhY3RvcnkoCisgICAgICAgICAgICAgICAgamRiY1VybCwgdXNlciwgcGFzcyk7CisgICAgICAgIFBvb2xhYmxlQ29ubmVjdGlvbkZhY3RvcnkgcG9vbGFibGVDb25uZWN0aW9uRmFjdG9yeSA9IG5ldyBQb29sYWJsZUNvbm5lY3Rpb25GYWN0b3J5KAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5LCBjb25uZWN0aW9uUG9vbCwgbnVsbCwgbnVsbCwgZmFsc2UsIHRydWUpOworCisgICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgUG9vbGluZ0RhdGFTb3VyY2UoY29ubmVjdGlvblBvb2wpOworICAgICAgICBxdW90ZUZpZWxkcyA9IEJvb2xlYW4KKyAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLnF1b3RlRmllbGRzIik7CisgICAgICAgIHBhZ2VTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLnBhZ2VTaXplIiwgMjApCisgICAgICAgICAgICAgICAgLmludFZhbHVlKCk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5I2NyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGNyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoZGF0YVNvdXJjZSwKKyAgICAgICAgICAgICAgICBxdW90ZUZpZWxkcywgcGFnZVNpemUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0x1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwMzAwMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0x1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSw4MTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwbzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlU3RhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLkluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLy9MdWNlbmUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guQm9vbGVhbkNsYXVzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guQm9vbGVhblF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5IaXRzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5JbmRleFNlYXJjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlRlcm1RdWVyeTsKKworLy9KVUcgaW1wb3J0cworaW1wb3J0IG9yZy5zYWZlaGF1cy51dWlkLlVVSUQ7CitpbXBvcnQgb3JnLnNhZmVoYXVzLnV1aWQuVVVJREdlbmVyYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBXb3JrZmxvd0VuZ2luZX0gaW50ZXJmYWNlIHRoYXQgaXMgYmFja2VkIGJ5CisgKiA8YSBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmciPkFwYWNoZSBMdWNlbmU8L2E+LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIEx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGV4dGVuZHMKKyAgICAgICAgQWJzdHJhY3RQYWdpbmF0aWJsZUluc3RhbmNlUmVwb3NpdG9yeSB7CisKKyAgICAvKiBwYXRoIHRvIGx1Y2VuZSBpbmRleCBkaXJlY3RvcnkgdG8gc3RvcmUgd0luc3QgaW5mbyAqLworICAgIHByaXZhdGUgU3RyaW5nIGlkeEZpbGVQYXRoID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyogb3VyIHdvcmtmbG93IGluc3QgaWQgZ2VuZXJhdG9yICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVVVJREdlbmVyYXRvciBnZW5lcmF0b3IgPSBVVUlER2VuZXJhdG9yLmdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoU3RyaW5nIGlkeFBhdGgsIGludCBwYWdlU2l6ZSkgeworICAgICAgICB0aGlzLmlkeEZpbGVQYXRoID0gaWR4UGF0aDsKKyAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgaW50IG51bUluc3RzID0gLTE7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaWR4RmlsZVBhdGgpOworICAgICAgICAgICAgVGVybSBpbnN0SWRUZXJtID0gbmV3IFRlcm0oIm15ZmllbGQiLCAibXl2YWx1ZSIpOworICAgICAgICAgICAgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5IHF1ZXJ5ID0gbmV3IFRlcm1RdWVyeShpbnN0SWRUZXJtKTsKKyAgICAgICAgICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoIndvcmtmbG93X2luc3Rfc3RhcnRkYXRldGltZSIsCisgICAgICAgICAgICAgICAgICAgIFNvcnRGaWVsZC5TVFJJTkcsIHRydWUpKTsKKyAgICAgICAgICAgIEhpdHMgaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxdWVyeSwgc29ydCk7CisKKyAgICAgICAgICAgIG51bUluc3RzID0gaGl0cy5sZW5ndGgoKTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIiArIGlkeEZpbGVQYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBmb3Igc2VhcmNoOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2VhcmNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWFyY2hlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVtSW5zdHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5I2dldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgaW50IG51bUluc3RzID0gLTE7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaWR4RmlsZVBhdGgpOworICAgICAgICAgICAgVGVybSBpbnN0SWRUZXJtID0gbmV3IFRlcm0oIndvcmtmbG93X2luc3Rfc3RhdHVzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSBxdWVyeSA9IG5ldyBUZXJtUXVlcnkoaW5zdElkVGVybSk7CisgICAgICAgICAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ3b3JrZmxvd19pbnN0X3N0YXJ0ZGF0ZXRpbWUiLAorICAgICAgICAgICAgICAgICAgICBTb3J0RmllbGQuU1RSSU5HLCB0cnVlKSk7CisgICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnksIHNvcnQpOworCisgICAgICAgICAgICBudW1JbnN0cyA9IGhpdHMubGVuZ3RoKCk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBvcGVuaW5nIGluZGV4IGRpcmVjdG9yeTogWyIgKyBpZHhGaWxlUGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZm9yIHNlYXJjaDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlYXJjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZWFyY2hlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VhcmNoZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bUluc3RzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNhZGRXb3JrZmxvd0luc3RhbmNlKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRXb3JrZmxvd0luc3RhbmNlKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZ2VuZXJhdGUgVVVJRCBmb3IgaW5zdAorICAgICAgICBVVUlEIHV1aWQgPSBVVUlER2VuZXJhdG9yLmdldEluc3RhbmNlKCkuZ2VuZXJhdGVUaW1lQmFzZWRVVUlEKCk7CisgICAgICAgIHdJbnN0LnNldElkKHV1aWQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYWRkV29ya2Zsb3dJbnN0YW5jZVRvQ2F0YWxvZyh3SW5zdCk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjcmVtb3ZlV29ya2Zsb3dJbnN0YW5jZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJlbW92ZVdvcmtmbG93SW5zdGFuY2VEb2N1bWVudCh3SW5zdCk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjdXBkYXRlV29ya2Zsb3dJbnN0YW5jZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJlbW92ZVdvcmtmbG93SW5zdGFuY2VEb2N1bWVudCh3SW5zdCk7CisgICAgICAgIGFkZFdvcmtmbG93SW5zdGFuY2VUb0NhdGFsb2cod0luc3QpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXRXb3JrZmxvd0luc3RhbmNlQnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlIGdldFdvcmtmbG93SW5zdGFuY2VCeUlkKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaWR4RmlsZVBhdGgpOworICAgICAgICAgICAgVGVybSBpbnN0SWRUZXJtID0gbmV3IFRlcm0oIndvcmtmbG93X2luc3RfaWQiLCB3b3JrZmxvd0luc3RJZCk7CisgICAgICAgICAgICBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnkgcXVlcnkgPSBuZXcgVGVybVF1ZXJ5KGluc3RJZFRlcm0pOworICAgICAgICAgICAgSGl0cyBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5KTsKKworICAgICAgICAgICAgaWYgKGhpdHMubGVuZ3RoKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlRoZSB3b3JrZmxvdyBpbnN0YW5jZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0SWQgKyAiXSBpcyBub3QgYmVpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAibWFuYWdlZCBieSB0aGlzICIgKyAid29ya2Zsb3cgZW5naW5lLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBub3QgdW5pcXVlIGluIHRoZSBjYXRhbG9nOiBudW0gaGl0czogWyIraGl0cy5sZW5ndGgoKSsiXSIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBpbnN0RG9jID0gaGl0cy5kb2MoMCk7CisgICAgICAgICAgICAgICAgd0luc3QgPSB0b1dvcmtmbG93SW5zdGFuY2UoaW5zdERvYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBvcGVuaW5nIGluZGV4IGRpcmVjdG9yeTogWyIgKyBpZHhGaWxlUGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZm9yIHNlYXJjaDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlYXJjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZWFyY2hlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VhcmNoZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdJbnN0OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXRXb3JrZmxvd0luc3RhbmNlcygpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0V29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG51bGw7CisgICAgICAgIExpc3Qgd0luc3RzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpZHhGaWxlUGF0aCk7CisgICAgICAgICAgICBUZXJtIGluc3RJZFRlcm0gPSBuZXcgVGVybSgibXlmaWVsZCIsICJteXZhbHVlIik7CisgICAgICAgICAgICBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnkgcXVlcnkgPSBuZXcgVGVybVF1ZXJ5KGluc3RJZFRlcm0pOworICAgICAgICAgICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgid29ya2Zsb3dfaW5zdF9zdGFydGRhdGV0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgU29ydEZpZWxkLlNUUklORywgdHJ1ZSkpOworICAgICAgICAgICAgSGl0cyBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5LCBzb3J0KTsKKworICAgICAgICAgICAgaWYgKGhpdHMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgd0luc3RzID0gbmV3IFZlY3RvcihoaXRzLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGl0cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGhpdHMuZG9jKGkpOworICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIHdJbnN0ID0gdG9Xb3JrZmxvd0luc3RhbmNlKGRvYyk7CisgICAgICAgICAgICAgICAgICAgIHdJbnN0cy5hZGQod0luc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIG9wZW5pbmcgaW5kZXggZGlyZWN0b3J5OiBbIiArIGlkeEZpbGVQYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBmb3Igc2VhcmNoOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2VhcmNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWFyY2hlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd0luc3RzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOworICAgICAgICBMaXN0IHdJbnN0cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaWR4RmlsZVBhdGgpOworICAgICAgICAgICAgVGVybSBpbnN0SWRUZXJtID0gbmV3IFRlcm0oIndvcmtmbG93X2luc3Rfc3RhdHVzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSBxdWVyeSA9IG5ldyBUZXJtUXVlcnkoaW5zdElkVGVybSk7CisgICAgICAgICAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ3b3JrZmxvd19pbnN0X3N0YXJ0ZGF0ZXRpbWUiLAorICAgICAgICAgICAgICAgICAgICBTb3J0RmllbGQuU1RSSU5HLCB0cnVlKSk7CisgICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnksIHNvcnQpOworCisgICAgICAgICAgICBpZiAoaGl0cy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB3SW5zdHMgPSBuZXcgVmVjdG9yKGhpdHMubGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaXRzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gaGl0cy5kb2MoaSk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSB0b1dvcmtmbG93SW5zdGFuY2UoZG9jKTsKKyAgICAgICAgICAgICAgICAgICAgd0luc3RzLmFkZCh3SW5zdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIHdoZW4gb3BlbmluZyBpbmRleCBkaXJlY3Rvcnk6IFsiICsgaWR4RmlsZVBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGZvciBzZWFyY2g6IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlYXJjaGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3SW5zdHM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLkFic3RyYWN0UGFnaW5hdGlibGVJbnN0YW5jZVJlcG9zaXRvcnkjcGFnaW5hdGVXb3JrZmxvd3MoaW50LAorICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCBwYWdpbmF0ZVdvcmtmbG93cyhpbnQgcGFnZU51bSwgU3RyaW5nIHN0YXR1cykKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBMaXN0IGluc3RJZHMgPSBudWxsOworICAgICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpZHhGaWxlUGF0aCk7CisKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBhIEJvb2xlYW4gcXVlcnkgaGVyZQorICAgICAgICAgICAgQm9vbGVhblF1ZXJ5IGJvb2xlYW5RdWVyeSA9IG5ldyBCb29sZWFuUXVlcnkoKTsKKworICAgICAgICAgICAgVGVybSBpbnN0SWRUZXJtID0gbmV3IFRlcm0oIm15ZmllbGQiLCAibXl2YWx1ZSIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGVybSBzdGF0dXNUZXJtID0gbmV3IFRlcm0oIndvcmtmbG93X2luc3Rfc3RhdHVzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBib29sZWFuUXVlcnkuYWRkKG5ldyBUZXJtUXVlcnkoc3RhdHVzVGVybSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuQ2xhdXNlLk9jY3VyLk1VU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhblF1ZXJ5LmFkZChuZXcgVGVybVF1ZXJ5KGluc3RJZFRlcm0pLAorICAgICAgICAgICAgICAgICAgICBCb29sZWFuQ2xhdXNlLk9jY3VyLk1VU1QpOworCisgICAgICAgICAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ3b3JrZmxvd19pbnN0X3N0YXJ0ZGF0ZXRpbWUiLAorICAgICAgICAgICAgICAgICAgICBTb3J0RmllbGQuU1RSSU5HLCB0cnVlKSk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsCisgICAgICAgICAgICAgICAgICAgICJRdWVyeWluZyBMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeTogcTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJvb2xlYW5RdWVyeSArICJdIik7CisgICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2goYm9vbGVhblF1ZXJ5LCBzb3J0KTsKKyAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCgpID4gMCkgeworCisgICAgICAgICAgICAgICAgaW50IHN0YXJ0TnVtID0gKHBhZ2VOdW0gLSAxKSAqIHBhZ2VTaXplOworICAgICAgICAgICAgICAgIGlmIChzdGFydE51bSA+IGhpdHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnROdW0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluc3RJZHMgPSBuZXcgVmVjdG9yKHBhZ2VTaXplKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydE51bTsgaSA8IE1hdGgubWluKGhpdHMubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnROdW0gKyBwYWdlU2l6ZSkpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgaW5zdERvYyA9IGhpdHMuZG9jKGkpOworICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSB0b1dvcmtmbG93SW5zdGFuY2UoaW5zdERvYyk7CisgICAgICAgICAgICAgICAgICAgIGluc3RJZHMuYWRkKGluc3QuZ2V0SWQoKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIk5vIHdvcmtmbG93IGluc3RhbmNlcyBmb3VuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIGF0dGVtcHRpbmcgdG8gcGFnaW5hdGUhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBvcGVuaW5nIGluZGV4IGRpcmVjdG9yeTogWyIgKyBpZHhGaWxlUGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZm9yIHNlYXJjaDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlYXJjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZWFyY2hlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VhcmNoZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluc3RJZHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVXb3JrZmxvd0luc3RhbmNlRG9jdW1lbnQoCisgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBJbmRleFJlYWRlciByZWFkZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBJbmRleFJlYWRlci5vcGVuKGlkeEZpbGVQYXRoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwKKyAgICAgICAgICAgICAgICAgICAgIkx1Y2VuZVdvcmtmbG93RW5naW5lOiByZW1vdmUgZG9jdW1lbnQgZnJvbSBpbmRleCBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnN0LmdldElkKCkgKyAiXSIpOworICAgICAgICAgICAgcmVhZGVyLmRlbGV0ZURvY3VtZW50cyhuZXcgVGVybSgid29ya2Zsb3dfaW5zdF9pZCIsIGluc3QuZ2V0SWQoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHJlbW92aW5nIHdvcmtmbG93IGluc3RhbmNlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnN0LmdldElkKCkgKyAiXSBmcm9tIGluZGV4OiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkV29ya2Zsb3dJbnN0YW5jZVRvQ2F0YWxvZygKKyAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBudWxsOworCisgICAgICAgIEZpbGUgaW5kZXhEaXIgPSBuZXcgRmlsZShpZHhGaWxlUGF0aCk7CisKKyAgICAgICAgYm9vbGVhbiBjcmVhdGVJbmRleCA9IGZhbHNlOworCisgICAgICAgIGlmIChpbmRleERpci5leGlzdHMoKSAmJiBpbmRleERpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBjcmVhdGVJbmRleCA9IGZhbHNlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNyZWF0ZUluZGV4ID0gdHJ1ZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGlkeEZpbGVQYXRoLCBuZXcgU3RhbmRhcmRBbmFseXplcigpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmRleCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0TWVyZ2VGYWN0b3IoMjApOworCisgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSB0b0RvYyh3SW5zdCk7CisgICAgICAgICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIGluZGV4IHdvcmtmbG93IGluc3RhbmNlOiBbIgorICAgICAgICAgICAgICAgICAgICArIHdJbnN0LmdldElkKCkgKyAiXTogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gaW5kZXggd29ya2Zsb3cgaW5zdGFuY2U6IFsiICsgd0luc3QuZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBEb2N1bWVudCB0b0RvYyhXb3JrZmxvd0luc3RhbmNlIHdvcmtmbG93SW5zdCkgeworICAgICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKKworICAgICAgICAvLyBzdG9yZSB0aGUgd29ya2Zsb3cgaW5zdGFuY2UgaW5mbyBmaXJzdAorICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgid29ya2Zsb3dfaW5zdF9pZCIsIHdvcmtmbG93SW5zdC5nZXRJZCgpLAorICAgICAgICAgICAgICAgIEZpZWxkLlN0b3JlLllFUywgRmllbGQuSW5kZXguVU5fVE9LRU5JWkVEKSk7CisgICAgICAgIAorICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgid29ya2Zsb3dfaW5zdF90aW1lc2Jsb2NrZWQiLCAKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHdvcmtmbG93SW5zdC5nZXRUaW1lc0Jsb2NrZWQoKSksIEZpZWxkLlN0b3JlLllFUywgCisgICAgICAgICAgICBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgCisgICAgICAgIC8vIHdpbGwgbGVhdmUgdGhpcyBmb3IgYmFjayBjb21wYXQsIGJ1dCB3aWxsIGFsc28gc3RvcmUgCisgICAgICAgIC8vIGNhdGVnb3J5IAorICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgid29ya2Zsb3dfaW5zdF9zdGF0dXMiLCB3b3JrZmxvd0luc3QuZ2V0U3RhdHVzKCksCisgICAgICAgICAgICAgICAgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgCisgICAgICAgIGlmKHdvcmtmbG93SW5zdC5nZXRTdGF0ZSgpICE9IG51bGwpeworICAgICAgICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSB3b3JrZmxvd0luc3QuZ2V0U3RhdGUoKTsKKyAgICAgICAgCisgICAgICAgICAgaWYoc3RhdGUuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKXsKKyAgICAgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJ3b3JrZmxvd19pbnN0X3N0YXRlX2Rlc2MiLAorICAgICAgICAgICAgICAgIHN0YXRlLmdldERlc2NyaXB0aW9uKCksIEZpZWxkLlN0b3JlLllFUywgRmllbGQuSW5kZXguVU5fVE9LRU5JWkVEKSk7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmKHN0YXRlLmdldE1lc3NhZ2UoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJ3b3JrZmxvd19pbnN0X3N0YXRlX21lc3NhZ2UiLAorICAgICAgICAgICAgICAgIHN0YXRlLmdldE1lc3NhZ2UoKSwgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYoc3RhdGUuZ2V0Q2F0ZWdvcnkoKSAhPSBudWxsICYmIHN0YXRlLmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpICE9IG51bGwpeworICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIndvcmtmbG93X2luc3Rfc3RhdGVfY2F0ZWdvcnkiLAorICAgICAgICAgICAgICAgIHN0YXRlLmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpLCBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICBkb2MKKyAgICAgICAgICAgICAgICAuYWRkKG5ldyBGaWVsZCgid29ya2Zsb3dfaW5zdF9jdXJyZW50X3Rhc2tfaWQiLCB3b3JrZmxvd0luc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50VGFza0lkKCksIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworCisgICAgICAgIGRvYworICAgICAgICAgICAgICAgIC5hZGQobmV3IEZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93X2luc3RfY3VycmVudHRhc2tfc3RhcnRkYXRldGltZSIsCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3QuZ2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKCkgIT0gbnVsbCA/IHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIiwgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIndvcmtmbG93X2luc3RfY3VycmVudHRhc2tfZW5kZGF0ZXRpbWUiLCB3b3JrZmxvd0luc3QKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cigpICE9IG51bGwgPyB3b3JrZmxvd0luc3QKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cigpIDogIiIsIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIndvcmtmbG93X2luc3Rfc3RhcnRkYXRldGltZSIsIHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgIC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkgIT0gbnVsbCA/IHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgIC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkgOiAiIiwgRmllbGQuU3RvcmUuWUVTLAorICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgid29ya2Zsb3dfaW5zdF9lbmRkYXRldGltZSIsIHdvcmtmbG93SW5zdAorICAgICAgICAgICAgICAgIC5nZXRFbmREYXRlVGltZUlzb1N0cigpICE9IG51bGwgPyB3b3JrZmxvd0luc3QKKyAgICAgICAgICAgICAgICAuZ2V0RW5kRGF0ZVRpbWVJc29TdHIoKSA6ICIiLCBGaWVsZC5TdG9yZS5ZRVMsCisgICAgICAgICAgICAgICAgRmllbGQuSW5kZXguVU5fVE9LRU5JWkVEKSk7CisgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJ3b3JrZmxvd19pbnN0X3ByaW9yaXR5IiwKKyAgICAgICAgICAgIHdvcmtmbG93SW5zdC5nZXRQcmlvcml0eSgpICE9IG51bGwgPyAKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZih3b3JrZmxvd0luc3QuZ2V0UHJpb3JpdHkoKS5nZXRWYWx1ZSgpKToKKyAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFByaW9yaXR5LmdldERlZmF1bHQoKS5nZXRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworCisgICAgICAgIC8vIGFkZCBhbGwgbWV0YWRhdGEKKyAgICAgICAgYWRkSW5zdGFuY2VNZXRhZGF0YVRvRG9jKGRvYywgd29ya2Zsb3dJbnN0LmdldFNoYXJlZENvbnRleHQoKSk7CisKKyAgICAgICAgLy8gc3RvcmUgdGhlIHdvcmtmbG93IGluZm8gdG9vCisgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJ3b3JrZmxvd19pZCIsIHdvcmtmbG93SW5zdC5nZXRXb3JrZmxvdygpLmdldElkKCksCisgICAgICAgICAgICAgICAgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIndvcmtmbG93X25hbWUiLAorICAgICAgICAgICAgICAgIHdvcmtmbG93SW5zdC5nZXRXb3JrZmxvdygpLmdldE5hbWUoKSwgRmllbGQuU3RvcmUuWUVTLAorICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4Lk5PKSk7CisKKyAgICAgICAgLy8gc3RvcmUgdGhlIHRhc2tzCisgICAgICAgIGFkZFRhc2tzVG9Eb2MoZG9jLCB3b3JrZmxvd0luc3QuZ2V0V29ya2Zsb3coKS5nZXRUYXNrcygpKTsKKyAgICAgICAgCisgICAgICAgIC8vIHN0b3JlIHdvcmtmbG93IGNvbmRpdGlvbnMKKyAgICAgICAgYWRkQ29uZGl0aW9uc1RvRG9jKCJ3b3JrZmxvd19jb25kaXRpb25fIit3b3JrZmxvd0luc3QuZ2V0V29ya2Zsb3coKS5nZXRJZCgpLCAKKyAgICAgICAgICAgIHdvcmtmbG93SW5zdC5nZXRXb3JrZmxvdygpLmdldENvbmRpdGlvbnMoKQorICAgICAgICAgICAgLCBkb2MpOworCisgICAgICAgIC8vIGFkZCB0aGUgZGVmYXVsdCBmaWVsZCAoc28gdGhhdCB3ZSBjYW4gZG8gYSBxdWVyeSBmb3IgKikKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIm15ZmllbGQiLCAibXl2YWx1ZSIsIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKworICAgICAgICByZXR1cm4gZG9jOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJbnN0YW5jZU1ldGFkYXRhVG9Eb2MoRG9jdW1lbnQgZG9jLCBNZXRhZGF0YSBtZXQpIHsKKyAgICAgICAgaWYgKG1ldCAhPSBudWxsICYmIG1ldC5nZXRIYXNodGFibGUoKS5rZXlTZXQoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtZXQuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXRLZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBMaXN0IG1ldFZhbHMgPSBtZXQuZ2V0QWxsTWV0YWRhdGEobWV0S2V5KTsKKyAgICAgICAgICAgICAgICBpZiAobWV0VmFscyAhPSBudWxsICYmIG1ldFZhbHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtZXRWYWxzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1ldFZhbCA9IChTdHJpbmcpIGoubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQobWV0S2V5LCBtZXRWYWwsIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQuSW5kZXguVU5fVE9LRU5JWkVEKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBub3cgaW5kZXggdGhlIGZpZWxkIG5hbWUgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgaXQgdXAgd2hlbiBjb252ZXJ0aW5nIGZyb20gZG9jIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93SW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoIndvcmtmbG93X2luc3RfbWV0X2ZsZHMiLCBtZXRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5OTykpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRhc2tzVG9Eb2MoRG9jdW1lbnQgZG9jLCBMaXN0IHRhc2tzKSB7CisgICAgICAgIGlmICh0YXNrcyAhPSBudWxsICYmIHRhc2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhc2tzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFdvcmtmbG93VGFzayB0YXNrID0gKFdvcmtmbG93VGFzaykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoInRhc2tfaWQiLCB0YXNrLmdldFRhc2tJZCgpLCBGaWVsZC5TdG9yZS5ZRVMsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZC5JbmRleC5VTl9UT0tFTklaRUQpKTsKKyAgICAgICAgICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCgidGFza19uYW1lIiwgdGFzay5nZXRUYXNrTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5OTykpOworICAgICAgICAgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKCJ0YXNrX29yZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHRhc2suZ2V0T3JkZXIoKSksIEZpZWxkLlN0b3JlLllFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkLkluZGV4Lk5PKSk7CisgICAgICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQoInRhc2tfY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoKSwgRmllbGQuU3RvcmUuWUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQuSW5kZXguTk8pKTsKKworICAgICAgICAgICAgICAgIGFkZENvbmRpdGlvbnNUb0RvYyh0YXNrLmdldFRhc2tJZCgpLCB0YXNrLmdldENvbmRpdGlvbnMoKSwgZG9jKTsKKyAgICAgICAgICAgICAgICBhZGRUYXNrQ29uZmlnVG9Eb2ModGFzay5nZXRUYXNrSWQoKSwgdGFzay5nZXRUYXNrQ29uZmlnKCksIGRvYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVGFza0NvbmZpZ1RvRG9jKFN0cmluZyB0YXNrSWQsCisgICAgICAgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZywgRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29uZmlnLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpCisgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7CisKKyAgICAgICAgICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCh0YXNrSWQgKyAiX2NvbmZpZ19wcm9wZXJ0eV9uYW1lIiwgcHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4Lk5PKSk7CisgICAgICAgICAgICAgICAgZG9jLmFkZChuZXcgRmllbGQodGFza0lkICsgIl9jb25maWdfcHJvcGVydHlfdmFsdWUiLCBwcm9wVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4Lk5PKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZENvbmRpdGlvbnNUb0RvYyhTdHJpbmcgdGFza0lkLCBMaXN0IGNvbmRpdGlvbkxpc3QsCisgICAgICBEb2N1bWVudCBkb2MpIHsKKyAgICBpZiAoY29uZGl0aW9uTGlzdCAhPSBudWxsICYmIGNvbmRpdGlvbkxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gY29uZGl0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgV29ya2Zsb3dDb25kaXRpb24gY29uZCA9IChXb3JrZmxvd0NvbmRpdGlvbikgaS5uZXh0KCk7CisgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKHRhc2tJZCArICJfY29uZGl0aW9uX25hbWUiLCBjb25kLmdldENvbmRpdGlvbk5hbWUoKSwKKyAgICAgICAgICAgIEZpZWxkLlN0b3JlLllFUywgRmllbGQuSW5kZXguTk8pKTsKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQodGFza0lkICsgIl9jb25kaXRpb25faWQiLCBjb25kLmdldENvbmRpdGlvbklkKCksCisgICAgICAgICAgICBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4LlVOX1RPS0VOSVpFRCkpOworICAgICAgICBkb2MuYWRkKG5ldyBGaWVsZCh0YXNrSWQgKyAiX2NvbmRpdGlvbl9jbGFzcyIsIGNvbmQKKyAgICAgICAgICAgIC5nZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpLCBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4Lk5PKSk7CisgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKHRhc2tJZCArICJfY29uZGl0aW9uX29yZGVyIiwgU3RyaW5nLnZhbHVlT2YoY29uZAorICAgICAgICAgICAgLmdldE9yZGVyKCkpLCBGaWVsZC5TdG9yZS5ZRVMsIEZpZWxkLkluZGV4Lk5PKSk7CisgICAgICAgIGRvYy5hZGQobmV3IEZpZWxkKHRhc2tJZCArICJfY29uZGl0aW9uX3RpbWVvdXQiLCBTdHJpbmcudmFsdWVPZihjb25kCisgICAgICAgICAgICAuZ2V0VGltZW91dFNlY29uZHMoKSksIEZpZWxkLlN0b3JlLllFUywgRmllbGQuSW5kZXguTk8pKTsKKyAgICAgICAgZG9jLmFkZChuZXcgRmllbGQodGFza0lkKyJfY29uZGl0aW9uX29wdGlvbmFsIiwgU3RyaW5nLnZhbHVlT2YoY29uZC5pc09wdGlvbmFsKCkpLAorICAgICAgICAgICAgRmllbGQuU3RvcmUuWUVTLCBGaWVsZC5JbmRleC5OTykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgICAgcHJpdmF0ZSBXb3JrZmxvd0luc3RhbmNlIHRvV29ya2Zsb3dJbnN0YW5jZShEb2N1bWVudCBkb2MpIHsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKworICAgICAgICAvLyBmaXJzdCByZWFkIGFsbCB0aGUgaW5zdGFuY2UgaW5mbworICAgICAgICBpbnN0LnNldElkKGRvYy5nZXQoIndvcmtmbG93X2luc3RfaWQiKSk7CisgICAgICAgIAorICAgICAgICBpbnN0LnNldFRpbWVzQmxvY2tlZChJbnRlZ2VyLnBhcnNlSW50KGRvYy5nZXQoIndvcmtmbG93X2luc3RfdGltZXNibG9ja2VkIikgIT0gCisgICAgICAgICAgbnVsbCA/IGRvYy5nZXQoIndvcmtmbG93X2luc3RfdGltZXNibG9ja2VkIik6IjAiKSk7CisgICAgICAgIAorICAgICAgICAvLyB0cnkgYW5kIGNvbnN0cnVjdCBhIHN0YXRlCisgICAgICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSBuZXcgV29ya2Zsb3dTdGF0ZSgpOworICAgICAgICBzdGF0ZS5zZXROYW1lKGRvYy5nZXQoIndvcmtmbG93X2luc3Rfc3RhdHVzIikpOworICAgICAgICBpZihkb2MuZ2V0KCJ3b3JrZmxvd19pbnN0X3N0YXRlX2NhdGVnb3J5IikgIT0gbnVsbCl7CisgICAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBjYXRlZ29yeSA9IG5ldyBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlKCk7CisgICAgICAgICAgY2F0ZWdvcnkuc2V0TmFtZShkb2MuZ2V0KCJ3b3JrZmxvd19pbnN0X3N0YXRlX2NhdGVnb3J5IikpOworICAgICAgICAgIHN0YXRlLnNldENhdGVnb3J5KGNhdGVnb3J5KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoZG9jLmdldCgid29ya2Zsb3dfaW5zdF9zdGF0ZV9kZXNjIikgIT0gbnVsbCl7CisgICAgICAgICAgc3RhdGUuc2V0RGVzY3JpcHRpb24oZG9jLmdldCgid29ya2Zsb3dfaW5zdF9zdGF0ZV9kZXNjIikpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihkb2MuZ2V0KCJ3b3JrZmxvd19pbnN0X3N0YXRlX21lc3NhZ2UiKSAhPSBudWxsKXsKKyAgICAgICAgICBzdGF0ZS5zZXRNZXNzYWdlKGRvYy5nZXQoIndvcmtmbG93X2luc3Rfc3RhdGVfbWVzc2FnZSIpKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGluc3Quc2V0U3RhdGUoc3RhdGUpOworICAgICAgICBpbnN0LnNldEN1cnJlbnRUYXNrSWQoZG9jLmdldCgid29ya2Zsb3dfaW5zdF9jdXJyZW50X3Rhc2tfaWQiKSk7CisgICAgICAgIGluc3Quc2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKGRvYworICAgICAgICAgICAgICAgIC5nZXQoIndvcmtmbG93X2luc3RfY3VycmVudHRhc2tfc3RhcnRkYXRldGltZSIpKTsKKyAgICAgICAgaW5zdC5zZXRDdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyKGRvYworICAgICAgICAgICAgICAgIC5nZXQoIndvcmtmbG93X2luc3RfY3VycmVudHRhc2tfZW5kZGF0ZXRpbWUiKSk7CisgICAgICAgIGluc3Quc2V0U3RhcnREYXRlVGltZUlzb1N0cihkb2MuZ2V0KCJ3b3JrZmxvd19pbnN0X3N0YXJ0ZGF0ZXRpbWUiKSk7CisgICAgICAgIGluc3Quc2V0RW5kRGF0ZVRpbWVJc29TdHIoZG9jLmdldCgid29ya2Zsb3dfaW5zdF9lbmRkYXRldGltZSIpKTsKKyAgICAgICAgaW5zdC5zZXRQcmlvcml0eShQcmlvcml0eS5nZXRQcmlvcml0eShkb2MuZ2V0KCJ3b3JrZmxvd19pbnN0X3ByaW9yaXR5IikgIT0gbnVsbCA/IAorICAgICAgICAgICAgRG91YmxlLnZhbHVlT2YoZG9jLmdldCgid29ya2Zsb3dfaW5zdF9wcmlvcml0eSIpKTpQcmlvcml0eS5nZXREZWZhdWx0KCkuZ2V0VmFsdWUoKSkpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHdvcmtmbG93IGluc3RhbmNlIG1ldGFkYXRhCisgICAgICAgIE1ldGFkYXRhIHNoYXJlZENvbnRleHQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgU3RyaW5nW10gaW5zdE1ldEZpZWxkcyA9IGRvYy5nZXRWYWx1ZXMoIndvcmtmbG93X2luc3RfbWV0X2ZsZHMiKTsKKyAgICAgICAgaWYgKGluc3RNZXRGaWVsZHMgIT0gbnVsbCAmJiBpbnN0TWV0RmllbGRzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdE1ldEZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBmbGROYW1lID0gaW5zdE1ldEZpZWxkc1tpXTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWxzID0gZG9jLmdldFZhbHVlcyhmbGROYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodmFscyAhPSBudWxsICYmIHZhbHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZENvbnRleHQuYWRkTWV0YWRhdGEoZmxkTmFtZSwgdmFsc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnN0LnNldFNoYXJlZENvbnRleHQoc2hhcmVkQ29udGV4dCk7CisKKyAgICAgICAgLy8gbm93IHJlYWQgYWxsIG9mIHRoZSB3b3JrZmxvdyBpbmZvCisKKyAgICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBuZXcgV29ya2Zsb3coKTsKKworICAgICAgICB3b3JrZmxvdy5zZXRJZChkb2MuZ2V0KCJ3b3JrZmxvd19pZCIpKTsKKyAgICAgICAgd29ya2Zsb3cuc2V0TmFtZShkb2MuZ2V0KCJ3b3JrZmxvd19uYW1lIikpOworICAgICAgICB3b3JrZmxvdy5zZXRUYXNrcyh0b1Rhc2tzKGRvYykpOworICAgICAgICB3b3JrZmxvdy5zZXRDb25kaXRpb25zKHRvQ29uZGl0aW9ucygid29ya2Zsb3dfY29uZGl0aW9uXyIrd29ya2Zsb3cuZ2V0SWQoKSwgZG9jKSk7CisKKyAgICAgICAgaW5zdC5zZXRXb3JrZmxvdyh3b3JrZmxvdyk7CisKKyAgICAgICAgcmV0dXJuIGluc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IHRvVGFza3MoRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIExpc3QgdGFza0xpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgU3RyaW5nW10gdGFza0lkcyA9IGRvYy5nZXRWYWx1ZXMoInRhc2tfaWQiKTsKKyAgICAgICAgU3RyaW5nW10gdGFza05hbWVzID0gZG9jLmdldFZhbHVlcygidGFza19uYW1lIik7CisgICAgICAgIFN0cmluZ1tdIHRhc2tPcmRlcnMgPSBkb2MuZ2V0VmFsdWVzKCJ0YXNrX29yZGVyIik7CisgICAgICAgIFN0cmluZ1tdIHRhc2tDbGFzc2VzID0gZG9jLmdldFZhbHVlcygidGFza19jbGFzcyIpOworCisgICAgICAgIGlmICh0YXNrSWRzLmxlbmd0aCAhPSB0YXNrTmFtZXMubGVuZ3RoCisgICAgICAgICAgICAgICAgfHwgdGFza0lkcy5sZW5ndGggIT0gdGFza09yZGVycy5sZW5ndGgKKyAgICAgICAgICAgICAgICB8fCB0YXNrSWRzLmxlbmd0aCAhPSB0YXNrQ2xhc3Nlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgInRhc2sgYXJyYXlzIGFyZSBub3Qgb2Ygc2FtZSBzaXplIHdoZW4gcmVidWlsZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGFzayBsaXN0IGZyb20gRG9jdW1lbnQhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFza0lkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgV29ya2Zsb3dUYXNrIHRhc2sgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisgICAgICAgICAgICB0YXNrLnNldE9yZGVyKEludGVnZXIucGFyc2VJbnQodGFza09yZGVyc1tpXSkpOworICAgICAgICAgICAgdGFzay5zZXRUYXNrTmFtZSh0YXNrTmFtZXNbaV0pOworICAgICAgICAgICAgdGFzay5zZXRUYXNrSWQodGFza0lkc1tpXSk7CisgICAgICAgICAgICB0YXNrLnNldFRhc2tJbnN0YW5jZUNsYXNzTmFtZSh0YXNrQ2xhc3Nlc1tpXSk7CisKKyAgICAgICAgICAgIHRhc2suc2V0Q29uZGl0aW9ucyh0b0NvbmRpdGlvbnModGFzay5nZXRUYXNrSWQoKSwgZG9jKSk7CisgICAgICAgICAgICB0YXNrLnNldFRhc2tDb25maWcodG9UYXNrQ29uZmlnKHRhc2suZ2V0VGFza0lkKCksIGRvYykpOworICAgICAgICAgICAgdGFza0xpc3QuYWRkKHRhc2spOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRhc2tMaXN0OworICAgIH0KKworICAgIHByaXZhdGUgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiB0b1Rhc2tDb25maWcoU3RyaW5nIHRhc2tJZCwgRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gdGFza0NvbmZpZyA9IG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgU3RyaW5nW10gcHJvcE5hbWVzID0gZG9jLmdldFZhbHVlcyh0YXNrSWQgKyAiX2NvbmZpZ19wcm9wZXJ0eV9uYW1lIik7CisgICAgICAgIFN0cmluZ1tdIHByb3BWYWx1ZXMgPSBkb2MuZ2V0VmFsdWVzKHRhc2tJZCArICJfY29uZmlnX3Byb3BlcnR5X3ZhbHVlIik7CisKKyAgICAgICAgaWYgKHByb3BOYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGFza0NvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wTmFtZXMubGVuZ3RoICE9IHByb3BWYWx1ZXMubGVuZ3RoKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJUYXNrIENvbmZpZyBwcm9wIG5hbWUgYW5kIHZhbHVlIGFycmF5cyBhcmUgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvZiBzYW1lIHNpemUhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YXNrQ29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KHByb3BOYW1lc1tpXSwgcHJvcFZhbHVlc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGFza0NvbmZpZzsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgdG9Db25kaXRpb25zKFN0cmluZyB0YXNrSWQsIERvY3VtZW50IGRvYykgeworICAgICAgICBMaXN0IGNvbmRMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIFN0cmluZ1tdIGNvbmROYW1lcyA9IGRvYy5nZXRWYWx1ZXModGFza0lkICsgIl9jb25kaXRpb25fbmFtZSIpOworICAgICAgICBTdHJpbmdbXSBjb25kQ2xhc3NlcyA9IGRvYy5nZXRWYWx1ZXModGFza0lkICsgIl9jb25kaXRpb25fY2xhc3MiKTsKKyAgICAgICAgU3RyaW5nW10gY29uZE9yZGVycyA9IGRvYy5nZXRWYWx1ZXModGFza0lkICsgIl9jb25kaXRpb25fb3JkZXIiKTsKKyAgICAgICAgU3RyaW5nW10gY29uZElkcyA9IGRvYy5nZXRWYWx1ZXModGFza0lkICsgIl9jb25kaXRpb25faWQiKTsKKyAgICAgICAgU3RyaW5nW10gY29uZFRpbWVvdXRzID0gZG9jLmdldFZhbHVlcyh0YXNrSWQrIl9jb25kaXRpb25fdGltZW91dCIpOworICAgICAgICBTdHJpbmdbXSBjb25kT3B0aW9uYWxzID0gZG9jLmdldFZhbHVlcyh0YXNrSWQrIl9jb25kaXRpb25fb3B0aW9uYWwiKTsKKworICAgICAgICBpZiAoY29uZE5hbWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25kTGlzdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNvbmROYW1lcy5sZW5ndGggIT0gY29uZENsYXNzZXMubGVuZ3RoCisgICAgICAgICAgICAgICAgfHwgY29uZE5hbWVzLmxlbmd0aCAhPSBjb25kT3JkZXJzLmxlbmd0aAorICAgICAgICAgICAgICAgIHx8IGNvbmROYW1lcy5sZW5ndGggIT0gY29uZElkcy5sZW5ndGggCisgICAgICAgICAgICAgICAgfHwgKGNvbmRUaW1lb3V0cyAhPSBudWxsICYmIGNvbmROYW1lcy5sZW5ndGggIT0gY29uZFRpbWVvdXRzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB8fCAoY29uZE9wdGlvbmFscyAhPSBudWxsICYmIGNvbmROYW1lcy5sZW5ndGggIT0gY29uZE9wdGlvbmFscy5sZW5ndGgpKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb24gYXJyYXlzIGFyZSBub3Qgb2Ygc2FtZSBzaXplIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlYnVpbGRpbmcgZnJvbSBnaXZlbiBEb2N1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kID0gbmV3IFdvcmtmbG93Q29uZGl0aW9uKCk7CisgICAgICAgICAgICBjb25kLnNldENvbmRpdGlvbklkKGNvbmRJZHNbaV0pOworICAgICAgICAgICAgY29uZC5zZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZShjb25kQ2xhc3Nlc1tpXSk7CisgICAgICAgICAgICBjb25kLnNldENvbmRpdGlvbk5hbWUoY29uZE5hbWVzW2ldKTsKKyAgICAgICAgICAgIGNvbmQuc2V0T3JkZXIoSW50ZWdlci5wYXJzZUludChjb25kT3JkZXJzW2ldKSk7CisgICAgICAgICAgICBpZihjb25kVGltZW91dHMgIT0gbnVsbCl7CisgICAgICAgICAgICAgIGNvbmQuc2V0VGltZW91dFNlY29uZHMoTG9uZy5wYXJzZUxvbmcoY29uZFRpbWVvdXRzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihjb25kT3B0aW9uYWxzICE9IG51bGwpeworICAgICAgICAgICAgICBjb25kLnNldE9wdGlvbmFsKEJvb2xlYW4udmFsdWVPZihjb25kT3B0aW9uYWxzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25kTGlzdC5hZGQoY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBjb25kTGlzdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0x1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmNDk4NQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL0x1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwbzsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKKworLy9MdWNlbmUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcge0BsaW5rIEx1Y2VuZVdvcmtmbG93RW5naW5lfXMuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5IHsKKworICAgIC8qIHRoZSBwYXRoIHRvIHRoZSBsdWNlbmUgaW5kZXggZGlyZWN0b3J5ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5kZXhGaWxlUGF0aCA9IG51bGw7CisKKyAgICBwcml2YXRlIGludCBwYWdlU2l6ZSA9IC0xOworICAgIAorCS8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5KCkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaW5kZXhGaWxlUGF0aCA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5sdWNlbmUuaWR4UGF0aCIpOworCisgICAgICAgIGlmIChpbmRleEZpbGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5kZXggRmlsZSBwcm9wZXJ0eTogW29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImVuZ2luZS5sdWNlbmUuaWR4UGF0aF0gbm90IHNldCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIGVudiB2YXJpYWJsZSByZXBsYWNlbWVudAorICAgICAgICBpbmRleEZpbGVQYXRoID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXMoaW5kZXhGaWxlUGF0aCk7CisgICAgICAgIHBhZ2VTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLnBhZ2VTaXplIiwgMjApCisgICAgICAgICAgICAgICAgLmludFZhbHVlKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeSNjcmVhdGVJbnN0YW5jZVJlcG9zaXRvcnkoKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBjcmVhdGVJbnN0YW5jZVJlcG9zaXRvcnkoKSB7CisJICAgIEZpbGUgaW5kZXhEaXIgPSBuZXcgRmlsZShpbmRleEZpbGVQYXRoKTsKKwkgICAgLy8gQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CisJICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG51bGw7CisJICAgIGlmICghaW5kZXhEaXIuZXhpc3RzKCkpIHsKKwkgICAgICAgIHRyeSB7IAorCSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihpbmRleERpciwgbmV3IFN0YW5kYXJkQW5hbHl6ZXIoKSwgdHJ1ZSk7CisJICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICAgICAgICAgIExPRy5zZXZlcmUoIlVuYWJsZSB0byBjcmVhdGUgaW5kZXg6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJICAgICAgICB9IGZpbmFsbHkgeworCSAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworCSAgICAgICAgICAgICAgICB0cnkgeworCSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisJICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJICAgICAgICAgICAgICAgICAgICBMT0cuc2V2ZXJlKCJVbmFibGUgdG8gY2xvc2UgaW5kZXg6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeShpbmRleEZpbGVQYXRoLCBwYWdlU2l6ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9NZW1vcnlXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vTWVtb3J5V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ3YWZjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vTWVtb3J5V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLkluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZzaW9uJAorICogCisgKiA8cD4KKyAqIEEgc2ltcGxlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeX0gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2YKKyAqIGEgZGF0YWJhc2UgdG8gdHJhY2sgdGhlIHN0YXR1cyBvZiB0aGUgV29ya2Zsb3cgZXhlY3V0aW9ucyBpdCBtYW5hZ2VzLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgTWVtb3J5V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgZXh0ZW5kcworICAgICAgICBBYnN0cmFjdFBhZ2luYXRpYmxlSW5zdGFuY2VSZXBvc2l0b3J5IHsKKworICAgIC8qIG91ciB3b3JrZmxvdyBpbnN0YW5jZSBtYXA6IG1hcHMgd29ya2ZsbG93SW5zdElkIHRvIFdvcmtmbG93SW5zdGFuY2UgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgd29ya2Zsb3dJbnN0TWFwID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihNZW1vcnlXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoaW50IHBhZ2VTaXplKSB7CisgICAgICAgIHdvcmtmbG93SW5zdE1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjYWRkV29ya2Zsb3dJbnN0YW5jZShvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpbnN0SWQgPSAidXJuOiIgKyBEYXRlQ29udmVydC5pc29Gb3JtYXQobmV3IERhdGUoKSk7CisgICAgICAgIHdJbnN0LnNldElkKGluc3RJZCk7CisgICAgICAgIHdvcmtmbG93SW5zdE1hcC5wdXQoaW5zdElkLCB3SW5zdCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5I3JlbW92ZVdvcmtmbG93SW5zdGFuY2Uob3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2UpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVdvcmtmbG93SW5zdGFuY2UoV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICB3b3JrZmxvd0luc3RNYXAucmVtb3ZlKHdJbnN0LmdldElkKCkpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSN1cGRhdGVXb3JrZmxvd0luc3RhbmNlKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVXb3JrZmxvd0luc3RhbmNlKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gKFdvcmtmbG93SW5zdGFuY2UpIHdvcmtmbG93SW5zdE1hcC5nZXQod0luc3QKKyAgICAgICAgICAgICAgICAuZ2V0SWQoKSk7CisKKyAgICAgICAgaWYgKGluc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgIC5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB1cGRhdGUgd29ya2Zsb3cgaW5zdGFuY2UgaWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd0luc3QuZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdvcmtmbG93IGluc3RhbmNlIGlzIG5vdCBiZWluZyB0cmFja2VkIGJ5IHRoaXMgZW5naW5lISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd29ya2Zsb3dJbnN0TWFwLnB1dCh3SW5zdC5nZXRJZCgpLCB3SW5zdCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5I2dldFdvcmtmbG93SW5zdGFuY2VCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2UgZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoU3RyaW5nIHdvcmtmbG93SW5zdElkKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoV29ya2Zsb3dJbnN0YW5jZSkgd29ya2Zsb3dJbnN0TWFwLmdldCh3b3JrZmxvd0luc3RJZCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5I2dldFdvcmtmbG93SW5zdGFuY2VzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRXb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh3b3JrZmxvd0luc3RNYXAudmFsdWVzKCkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkjZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBMaXN0IGluc3RhbmNlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3b3JrZmxvd0luc3RNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgd29ya2Zsb3dJbnN0SWQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdCA9IChXb3JrZmxvd0luc3RhbmNlKSB3b3JrZmxvd0luc3RNYXAKKyAgICAgICAgICAgICAgICAgICAgLmdldCh3b3JrZmxvd0luc3RJZCk7CisgICAgICAgICAgICBpZiAoaW5zdC5nZXRTdGF0dXMoKS5lcXVhbHMoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlcy5hZGQoaW5zdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5zdGFuY2VzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5BYnN0cmFjdFBhZ2luYXRpYmxlSW5zdGFuY2VSZXBvc2l0b3J5I3BhZ2luYXRlV29ya2Zsb3dzKGludCwKKyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3QgcGFnaW5hdGVXb3JrZmxvd3MoaW50IHBhZ2VOdW0sIFN0cmluZyBzdGF0dXMpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZmlyc3Qgc29ydCBpbnN0cyBieSBzdGFydERhdGVUaW1lCisgICAgICAgIExpc3QgYWxsSW5zdHMgPSBBcnJheXMuYXNMaXN0KHRoaXMud29ya2Zsb3dJbnN0TWFwLmtleVNldCgpLnRvQXJyYXkoKSk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWxsSW5zdHMsIG5ldyBDb21wYXJhdG9yKCkgeworCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QxID0gKFdvcmtmbG93SW5zdGFuY2UpIG8xOworICAgICAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdDIgPSAoV29ya2Zsb3dJbnN0YW5jZSkgbzI7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdDEuZ2V0U3RhcnREYXRlVGltZUlzb1N0cigpLmNvbXBhcmVUbygKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3QyLmdldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW50IHN0YXJ0TnVtID0gKHBhZ2VOdW0gLSAxKSAqIHBhZ2VTaXplOworICAgICAgICBpZiAoc3RhcnROdW0gPiBhbGxJbnN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIHN0YXJ0TnVtID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIExpc3QgaW5zdElkcyA9IG5ldyBWZWN0b3IocGFnZVNpemUpOworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydE51bTsgaSA8IE1hdGgubWluKGFsbEluc3RzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAoc3RhcnROdW0gKyBwYWdlU2l6ZSkpOyBpKyspIHsKKyAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSAoV29ya2Zsb3dJbnN0YW5jZSlhbGxJbnN0cy5nZXQoaSk7CisgICAgICAgICAgICBpbnN0SWRzLmFkZCh3SW5zdC5nZXRJZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnN0SWRzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy53b3JrZmxvd0luc3RNYXAua2V5U2V0KCkuc2l6ZSgpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSNnZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKFN0cmluZyBzdGF0dXMpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNudCA9IDA7CisKKyAgICAgICAgaWYgKHRoaXMud29ya2Zsb3dJbnN0TWFwICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiB0aGlzLndvcmtmbG93SW5zdE1hcC5rZXlTZXQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgdGhpcy53b3JrZmxvd0luc3RNYXAua2V5U2V0KCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy53b3JrZmxvd0luc3RNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyB3SW5zdElkID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gKFdvcmtmbG93SW5zdGFuY2UpIHRoaXMud29ya2Zsb3dJbnN0TWFwCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHdJbnN0SWQpOworICAgICAgICAgICAgICAgIGlmIChpbnN0LmdldFN0YXR1cygpLmVxdWFscyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbnQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9NZW1vcnlXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL01lbW9yeVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzRjZDQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9NZW1vcnlXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG87CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldnNpb24kCisgKiAKKyAqIDxwPgorICogQSBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgTWVtb3J5V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnl9cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIE1lbW9yeVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzCisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeSB7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcGFnZVNpemUgPSAtMTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIE1lbW9yeVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeSgpIHsKKyAgICAgICAgcGFnZVNpemUgPSBJbnRlZ2VyLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2VSZXAucGFnZVNpemUiLCAyMCkKKyAgICAgICAgICAgICAgICAuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5I2NyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGNyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW1vcnlXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeShwYWdlU2l6ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlTWV0TWFwLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlTWV0TWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjZTZkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL1dvcmtmbG93SW5zdGFuY2VNZXRNYXAuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG87CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JrZmxvd0luc3RhbmNlTWV0TWFwIGltcGxlbWVudHMgV29ya2Zsb3dJbnN0YW5jZU1ldE1hcEtleXN7CisgICAgcHJpdmF0ZSBNZXRhZGF0YSBtYXA7CisKKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZU1ldE1hcCgpIHsKKyAgICAgICAgbWFwID0gbmV3IE1ldGFkYXRhKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRGaWVsZChTdHJpbmcgZmxkKXsKKyAgICAgICAgbWFwLmFkZE1ldGFkYXRhKERFRkFVTFRfV09SS0ZMT1dfSUQsIGZsZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRGaWVsZHMoTGlzdCBmbGRzKXsKKyAgICAgICAgYWRkV29ya2Zsb3dUb01hcChERUZBVUxUX1dPUktGTE9XX0lELCBmbGRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRXb3JrZmxvd1RvTWFwKFN0cmluZyBpZCwgTGlzdCBmaWVsZHMpIHsKKyAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZsZCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIGFkZEZpZWxkVG9Xb3JrZmxvdyhpZCwgZmxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdCBnZXREZWZhdWx0RmllbGRzKCl7CisgICAgICAgIHJldHVybiBnZXRGaWVsZHNGb3JXb3JrZmxvdyhERUZBVUxUX1dPUktGTE9XX0lEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRGaWVsZHNGb3JXb3JrZmxvdyhTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1hcC5nZXRBbGxNZXRhZGF0YShpZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmllbGRUb1dvcmtmbG93KFN0cmluZyBpZCwgU3RyaW5nIGZsZCkgeworICAgICAgICBtYXAuYWRkTWV0YWRhdGEoaWQsIGZsZCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0V29ya2Zsb3dzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChtYXAuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkudG9BcnJheSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL1dvcmtmbG93SW5zdGFuY2VNZXRNYXBLZXlzLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlTWV0TWFwS2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2MwZWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlTWV0TWFwS2V5cy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwbzsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVzY3JpYmUgeW91ciBjbGFzcyBoZXJlPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBXb3JrZmxvd0luc3RhbmNlTWV0TWFwS2V5cyB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XT1JLRkxPV19NQVAgPSAiZGVmYXVsdCI7CisKKyAgICAvKiB0aGlzIGlzIGEgUkVTRVJWRUQga2V5d29yZDogRE9OJ1QgZ2l2ZSB5b3VyIHdvcmtmbG93cyB0aGlzIElEISAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV09SS0ZMT1dfSUQgPSAiX19kZWZhdWx0X18iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1RBRyA9ICJmaWVsZCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfVEFHX05BTUVfQVRUUiA9ICJuYW1lIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19UQUdfTkFNRSA9ICJ3b3JrZmxvdyI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfVEFHX0lEX0FUVFIgPSAiaWQiOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlTWV0YWRhdGFSZWFkZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL1dvcmtmbG93SW5zdGFuY2VNZXRhZGF0YVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzFiN2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlTWV0YWRhdGFSZWFkZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnhtbC5ET01VdGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGFSZWFkZXIgaW1wbGVtZW50cworICAgICAgICBXb3JrZmxvd0luc3RhbmNlTWV0TWFwS2V5cyB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoV29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhUmVhZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YVJlYWRlcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCB1dGlsaXR5IGNsYXNzZXMhIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXb3JrZmxvd0luc3RhbmNlTWV0TWFwIHBhcnNlTWV0TWFwRmlsZShTdHJpbmcgbWFwRmlsZVBhdGgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRSb290KG1hcEZpbGVQYXRoKTsKKyAgICAgICAgRWxlbWVudCByb290RWxlbSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZU1ldE1hcCBtYXAgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZU1ldE1hcCgpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGEgZGVmYXVsdCB0YWcKKyAgICAgICAgRWxlbWVudCBkZWZhdWx0RWxlbSA9IERPTVV0aWwuZ2V0Rmlyc3RFbGVtZW50KHJvb3RFbGVtLAorICAgICAgICAgICAgICAgIERFRkFVTFRfV09SS0ZMT1dfTUFQKTsKKworICAgICAgICBpZiAoZGVmYXVsdEVsZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiZmlsZTogWyIgKyBtYXBGaWxlUGF0aAorICAgICAgICAgICAgICAgICAgICArICJdIG11c3Qgc3BlY2lmeSBhIGRlZmF1bHQgd29ya2Zsb3cgdG8gZmllbGQgbWFwISIpOworICAgICAgICB9CisKKyAgICAgICAgbWFwLmFkZERlZmF1bHRGaWVsZHMocmVhZEZpZWxkcyhkZWZhdWx0RWxlbSkpOworCisgICAgICAgIE5vZGVMaXN0IHdvcmtmbG93TWFwTm9kZXMgPSByb290RWxlbQorICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShXT1JLRkxPV19UQUdfTkFNRSk7CisKKyAgICAgICAgaWYgKHdvcmtmbG93TWFwTm9kZXMgIT0gbnVsbCAmJiB3b3JrZmxvd01hcE5vZGVzLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JrZmxvd01hcE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHdvcmtmbG93TWFwRWxlbSA9IChFbGVtZW50KSB3b3JrZmxvd01hcE5vZGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHdvcmtmbG93SWQgPSB3b3JrZmxvd01hcEVsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoV09SS0ZMT1dfVEFHX0lEX0FUVFIpOworICAgICAgICAgICAgICAgIExpc3Qgd29ya2Zsb3dGaWVsZHMgPSByZWFkRmllbGRzKHdvcmtmbG93TWFwRWxlbSk7CisgICAgICAgICAgICAgICAgbWFwLmFkZFdvcmtmbG93VG9NYXAod29ya2Zsb3dJZCwgd29ya2Zsb3dGaWVsZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbWFwOworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCByZWFkRmllbGRzKEVsZW1lbnQgcm9vdEZsZEVsZW0pIHsKKyAgICAgICAgTm9kZUxpc3QgZGVmYXVsdEZsZE5vZGVzID0gcm9vdEZsZEVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoRklFTERfVEFHKTsKKyAgICAgICAgTGlzdCBmaWVsZHMgPSBudWxsOworCisgICAgICAgIGlmIChkZWZhdWx0RmxkTm9kZXMgIT0gbnVsbCAmJiBkZWZhdWx0RmxkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBmaWVsZHMgPSBuZXcgVmVjdG9yKGRlZmF1bHRGbGROb2Rlcy5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRGbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBkZWZhdWx0RmxkRWxlbSA9IChFbGVtZW50KSBkZWZhdWx0RmxkTm9kZXMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBmaWVsZHMuYWRkKGRlZmF1bHRGbGRFbGVtLmdldEF0dHJpYnV0ZShGSUVMRF9UQUdfTkFNRV9BVFRSKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50Um9vdChTdHJpbmcgeG1sRmlsZSkgeworICAgICAgICAvLyBvcGVuIHVwIHRoZSBYTUwgZmlsZQorICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7CisKKyAgICAgICAgSW5wdXRTdHJlYW0geG1sSW5wdXRTdHJlYW0gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4bWxJbnB1dFN0cmVhbSA9IG5ldyBGaWxlKHhtbEZpbGUpLnRvVVJMKCkub3BlblN0cmVhbSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3aGVuIGdldHRpbmcgaW5wdXQgc3RyZWFtIGZyb20gWyIgKyB4bWxGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogcmV0dXJuaW5nIG51bGwgZG9jdW1lbnQgcm9vdCIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh4bWxJbnB1dFN0cmVhbSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLndhcm5pbmcoIlVuYWJsZSB0byBwYXJzZSB4bWwgZmlsZSBbIiArIHhtbEZpbGUgKyAiXS4iCisgICAgICAgICAgICAgICAgICAgICsgIlJlYXNvbiBpcyBbIiArIGUgKyAiXSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJlZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5QYWdpbmF0aW9uOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkgZXh0ZW5kcyBQYWdpbmF0aW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhfUE9JTlRfSUQgPSBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RzIHRoZSBzcGVjaWZpZWQge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRvIHRoZSBpbnN0YW5jZQorICAgICAqIHJlcG9zaXRvcnkuCisgICAgICogCisgICAgICogQHBhcmFtIHdJbnN0CisgICAgICogICAgICAgICAgICBUaGUgd29ya2Zsb3cgaW5zdGFuY2UgdG8gcGVyc2lzdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIHRoZSBzcGVjaWZpZWQge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRvIHRoZQorICAgICAqIGluc3RhbmNlIHJlcG9zaXRvcnkuCisgICAgICogCisgICAgICogQHBhcmFtIHdJbnN0CisgICAgICogICAgICAgICAgICBUaGUgd29ya2Zsb3cgaW5zdGFuY2UgdG8gdXBkYXRlIGFuZCBwZXJzaXN0LgorICAgICAqIEB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVXb3JrZmxvd0luc3RhbmNlKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBmcm9tIHRoZSBpbnN0YW5jZQorICAgICAqIHJlcG9zaXRvcnkuCisgICAgICogCisgICAgICogQHBhcmFtIHdJbnN0CisgICAgICogICAgICAgICAgICBUaGUgd29ya2Zsb3cgaW5zdGFuY2UgdG8gcmVtb3ZlLgorICAgICAqIEB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXb3JrZmxvd0luc3RhbmNlKFdvcmtmbG93SW5zdGFuY2Ugd0luc3QpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cyB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT53b3JrZmxvd0luc3RJZDwvY29kZT4uCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSB3b3JrZmxvd0luc3RJZAorICAgICAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm4gVGhlIHNwZWNpZmllZCB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0uCisgICAgICogQHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlIGdldFdvcmtmbG93SW5zdGFuY2VCeUlkKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfXMgdGhhdCB0aGlzCisgICAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dFbmdpbmV9IGlzIG1hbmFnaW5nLgorICAgICAqIEB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRXb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfXMsIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIDxjb2RlPnN0YXR1czwvY29kZT4gU3RyaW5nLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RhdHVzCisgICAgICogICAgICAgICAgICBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzIG9mIHRoZQorICAgICAqICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9LgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cywgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICA8Y29kZT5zdGF0dXM8L2NvZGU+IFN0cmluZy4KKyAgICAgKiBAdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciB0aGF0IG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKFN0cmluZyBzdGF0dXMpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHtAbGluayBXb3JrZmxvd0luc3RhbmNlc30gd2l0aCBhbnkgPGNvZGU+c3RhdHVzPC9jb2RlPgorICAgICAqIGJlaW5nIG1hbmFnZWQgYnkgdGhpcyBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Yge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VzfSBhc3NvY2lhdGVkIHdpdGggYW55CisgICAgICogICAgICAgICA8Y29kZT5zdGF0dXM8L2NvZGU+IGJlaW5nIG1hbmFnZWQgYnkgdGhpcworICAgICAqICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Yge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VzfSB3aXRoIHRoZSBnaXZlbgorICAgICAqIDxjb2RlPnN0YXR1czwvY29kZT4gYmVpbmcgbWFuYWdlZCBieSB0aGlzIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdGF0dXMKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGF0dXMgdG8gb2J0YWluIHRoZSBudW1iZXIgb2Yge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cworICAgICAqICAgICAgICAgICAgZm9yLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX1zIHdpdGggdGhlIGdpdmVuCisgICAgICogICAgICAgICA8Y29kZT5zdGF0dXM8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIElmIHRoZXJlIGlzIGFueSBlcnJvciB0aGF0IG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9Xb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzU3NjIyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvaW5zdHJlcG8vV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIGZhY3RvcnkgaW50ZXJmYWNlIGZvciBjcmVhdGluZyB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnl9IG9iamVjdHMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogQHJldHVybiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCisgICAgICoge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5fSBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IGNyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9saWZlY3ljbGUvV29ya2Zsb3dMaWZlY3ljbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZjMjJkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlLmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsgLy9qYXZhZG9jCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7IC8vamF2YWRvYworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1N0YXR1czsgLy9qYXZhZG9jCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworLyoqCisgKiAKKyAqIERlZmluZXMgdGhlIGxpZmVjeWNsZSBvZiBhIHtAbGluayBXb3JrZmxvd30sIGlkZW50aWZ5aW5nIHdoYXQKKyAqIHtAbGluayBXb3JrZmxvd1N0YXR1c31lcyBiZWxvbmcgdG8gYSBwYXJ0aWN1bGFyIHBoYXNlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dMaWZlY3ljbGUgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTElGRUNZQ0xFID0gIl9fZGVmYXVsdF9fIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19XT1JLRkxPV19JRCA9ICJfX25vX193b3JrZmxvd19faWQiOworCisgIHByaXZhdGUgU29ydGVkU2V0IHN0YWdlczsKKworICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgIHByaXZhdGUgU3RyaW5nIHdvcmtmbG93SWQ7CisKKyAgLyoqCisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAqIAorICAgKi8KKyAgcHVibGljIFdvcmtmbG93TGlmZWN5Y2xlKCkgeworICAgIHRoaXMobnVsbCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBXb3JrZmxvd0xpZmVjeWNsZSB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgKiAKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFdvcmtmbG93TGlmZWN5Y2xlLgorICAgKiBAcGFyYW0gd29ya2Zsb3dJZAorICAgKiAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBpZGVudGlmaWVyIGZvciB0aGUge0BsaW5rIFdvcmtmbG93fXMgdGhhdCB0aGlzCisgICAqICAgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlIGlzIGFwcHJvcHJpYXRlIGZvci4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0xpZmVjeWNsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHdvcmtmbG93SWQpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMud29ya2Zsb3dJZCA9IHdvcmtmbG93SWQ7CisgICAgdGhpcy5zdGFnZXMgPSBuZXcgVHJlZVNldChuZXcgQ29tcGFyYXRvcigpIHsKKworICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2Ugc3RhZ2UxID0gKFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2UpIG8xOworICAgICAgICBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlIHN0YWdlMiA9IChXb3JrZmxvd0xpZmVjeWNsZVN0YWdlKSBvMjsKKworICAgICAgICBpZiAoc3RhZ2UxLmdldE9yZGVyKCkgPCBzdGFnZTIuZ2V0T3JkZXIoKSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFnZTEuZ2V0T3JkZXIoKSA9PSBzdGFnZTIuZ2V0T3JkZXIoKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9KTsKKworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHN0YWdlcworICAgKi8KKyAgcHVibGljIFNvcnRlZFNldCBnZXRTdGFnZXMoKSB7CisgICAgcmV0dXJuIHN0YWdlczsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIGEge0BsaW5rIFdvcmtmbG93U3RhZ2V9IHRvIHRoaXMgV29ya2Zsb3dMaWZlY3ljbGUuCisgICAqIAorICAgKiBAcGFyYW0gc3RhZ2UKKyAgICogICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd1N0YWdlfSB0byBhZGQgdG8gdGhpcyBXb3JrZmxvd0xpZmVjeWNsZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZFN0YWdlKFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2Ugc3RhZ2UpIHsKKyAgICBpZiAoIXN0YWdlcy5jb250YWlucyhzdGFnZSkpIHsKKyAgICAgIHN0YWdlcy5hZGQoc3RhZ2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIHRoZSBnaXZlbiB7QGxpbmsgV29ya2Zsb3dTdGFnZX0gZnJvbSB0aGlzIFdvcmtmbG93TGlmZWN5Y2xlLgorICAgKiAKKyAgICogQHBhcmFtIHN0YWdlCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgV29ya2Zsb3dTdGFnZX0gdG8gcmVtb3ZlLgorICAgKiBAcmV0dXJuIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIHJlbW92ZVN0YWdlKFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2Ugc3RhZ2UpIHsKKyAgICByZXR1cm4gc3RhZ2VzLnJlbW92ZShzdGFnZSk7CisgIH0KKworICAvKioKKyAgICogQ2xlYXJzIHRoZSB7QGxpbmsgV29ya2Zsb3dTdGFnZX1zIGluIHRoaXMgV29ya2Zsb3dMaWZlY3ljbGUuCisgICAqIAorICAgKi8KKyAgcHVibGljIHZvaWQgY2xlYXJTdGFnZXMoKSB7CisgICAgc3RhZ2VzLmNsZWFyKCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgd29ya2Zsb3dJZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRXb3JrZmxvd0lkKCkgeworICAgIHJldHVybiB3b3JrZmxvd0lkOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB3b3JrZmxvd0lkCisgICAqICAgICAgICAgIHRoZSB3b3JrZmxvd0lkIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3dJZChTdHJpbmcgd29ya2Zsb3dJZCkgeworICAgIHRoaXMud29ya2Zsb3dJZCA9IHdvcmtmbG93SWQ7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZX0gZm9yIGEKKyAgICoge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHdpdGggYSBnaXZlbiBzdGF0dXMuCisgICAqIAorICAgKiBAcGFyYW0gc3RhdHVzCisgICAqICAgICAgICAgIFRoZSBzdGF0dXMgb2YgdGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSB0byBnZXQgdGhlCisgICAqICAgICAgICAgIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfSBmb3IuCisgICAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2V9IGZvciB0aGUKKyAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzLCBvciBudWxsIGlmIHRoYXQKKyAgICogICAgICAgICBzdGF0dXMgZG9lcyBub3QgZXhpc3QgaW4gYW55IGRlZmluZWQge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2V9CisgICAqICAgICAgICAgLgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2UgZ2V0U3RhZ2VGb3JXb3JrZmxvdyhTdHJpbmcgc3RhdHVzKSB7CisgICAgaWYgKHRoaXMuc3RhZ2VzICE9IG51bGwgJiYgdGhpcy5zdGFnZXMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy5zdGFnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2Ugc3RhZ2UgPSAoV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSkgaS5uZXh0KCk7CisgICAgICAgIGZvcihXb3JrZmxvd1N0YXRlIHN0YXRlOiBzdGFnZS5nZXRTdGF0ZXMoKSl7CisgICAgICAgICAgaWYoc3RhdGUuZ2V0TmFtZSgpLmVxdWFscyhzdGF0dXMpKXsKKyAgICAgICAgICAgIHJldHVybiBzdGFnZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBMb29rcyB1cCBhbiBhc3NvY2lhdGVkIHtAbGluayBXb3JrZmxvd1N0YXRlfSBieSBzY2FubmluZyB0aGUKKyAgICoge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2V9cyBwcmVzZW50IGluIHRoaXMgbGlmZWN5Y2xlIChha2EsIGJ5IHNjYW5uaW5nCisgICAqIGl0cyAiQ2F0ZWdvcmllcyIsIGluIFdvcmtmbG93MiB0ZXJtaW5vbG9neSkuIFNpbmNlIG5vIENhdGVnb3J5IGlzIHByb3ZpZGVkLAorICAgKiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSB7QGxpbmsgV29ya2Zsb3dTdGF0ZX0gZm91bmQgaW4gdGhlIGdpdmVuCisgICAqIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfSBiZWluZyBzY2FubmVkIGlzIHJldHVybmVkLCBldmVuIGlmIHRoZXJlIGFyZQorICAgKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhhdCBzdGF0ZSAoZS5nLiwgb3RoZXJzIHByZXNlbnQgaW4gYW5vdGhlcgorICAgKiBjYXRlZ29yeSkuCisgICAqIAorICAgKiBJZiBmb3VuZCwgdGhlIHtAbGluayBXb3JrZmxvd1N0YXRlfSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIG51bGwgaXMKKyAgICogcmV0dXJuZWQuCisgICAqIAorICAgKiBAcGFyYW0gc3RhdGVOYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3dTdGF0ZX0gdG8gbG9jYXRlIGFuZCByZXR1cm4uCisgICAqIEByZXR1cm4gVGhlIHtAbGluayBXb3JrZmxvd1N0YXRlfSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dTdGF0ZSBnZXRTdGF0ZUJ5TmFtZShTdHJpbmcgc3RhdGVOYW1lKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGVCeU5hbWVBbmRDYXRlZ29yeShzdGF0ZU5hbWUsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSB7QGxpbmsgV29ya2Zsb3dTdGF0ZX0gYnkgaXRzIG5hbWUgYW5kIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfQorICAgKiAob3IgQ2F0ZWdvcnkgaW4gV29ya2Zsb3cyIHRlcm1pbm9sb2d5KS4gSWYgdGhlIHN0YXRlIGlzIGZvdW5kIHdpdGhpbiB0aGF0CisgICAqIGNhdGVnb3J5LCB0aGVuIGl0IGlzIHJldHVybmVkLCBvdGhlcndpc2UgbnVsbCBpcyByZXR1cm5lZC4KKyAgICogCisgICAqIEBwYXJhbSBzdGF0ZU5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHtAbGluayBXb3JrZmxvd1N0YXRlfSB0byBsb2NhdGUgYW5kIHJldHVybi4KKyAgICogQHBhcmFtIGNhdGVnb3J5CisgICAqICAgICAgICAgIFRoZSBwcm92aWRlZCB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZX0gbmFtZSB0byBjYXRlZ29yaXplIHRoZQorICAgKiAgICAgICAgICBzdGF0ZSBieS4KKyAgICogQHJldHVybiBUaGUge0BsaW5rIFdvcmtmbG93U3RhdGV9IGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd1N0YXRlIGdldFN0YXRlQnlOYW1lQW5kQ2F0ZWdvcnkoU3RyaW5nIHN0YXRlTmFtZSwKKyAgICAgIFN0cmluZyBjYXRlZ29yeSkgeworICAgIGlmICh0aGlzLmdldFN0YWdlcygpICE9IG51bGwpIHsKKyAgICAgIGZvciAoV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBzdGFnZSA6IChTb3J0ZWRTZXQ8V29ya2Zsb3dMaWZlY3ljbGVTdGFnZT4pIHRoaXMKKyAgICAgICAgICAuZ2V0U3RhZ2VzKCkpIHsKKyAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgIXN0YWdlLmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnkpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RhZ2UuZ2V0U3RhdGVzKCkgIT0gbnVsbCkgeworICAgICAgICAgIGZvciAoV29ya2Zsb3dTdGF0ZSBzdGF0ZSA6IChMaXN0PFdvcmtmbG93U3RhdGU+KSBzdGFnZS5nZXRTdGF0ZXMoKSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmdldE5hbWUoKS5lcXVhbHMoc3RhdGVOYW1lKSkgeworICAgICAgICAgICAgICByZXR1cm4gbWFrZUNvcHkoc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisgIAorICBwdWJsaWMgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBnZXRDYXRlZ29yeUJ5TmFtZShTdHJpbmcgY2F0ZWdvcnkpeworICAgIGlmKHRoaXMuZ2V0U3RhZ2VzKCkgIT0gbnVsbCl7CisgICAgICBmb3IoV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBzdGFnZTogKFNvcnRlZFNldDxXb3JrZmxvd0xpZmVjeWNsZVN0YWdlPil0aGlzLmdldFN0YWdlcygpKXsKKyAgICAgICAgaWYoc3RhZ2UuZ2V0TmFtZSgpLmVxdWFscyhjYXRlZ29yeSkpeworICAgICAgICAgIHJldHVybiBzdGFnZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICAKKyAgcHVibGljIFdvcmtmbG93U3RhdGUgY3JlYXRlU3RhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpeworICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSBuZXcgV29ya2Zsb3dTdGF0ZSgpOworICAgIHN0YXRlLnNldE5hbWUobmFtZSk7CisgICAgc3RhdGUuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnlCeU5hbWUoY2F0ZWdvcnkpKTsKKyAgICBzdGF0ZS5zZXRNZXNzYWdlKG1lc3NhZ2UpOworICAgIHJldHVybiBzdGF0ZTsKKyAgfQorCisgIHByaXZhdGUgV29ya2Zsb3dTdGF0ZSBtYWtlQ29weShXb3JrZmxvd1N0YXRlIHN0YXRlKXsKKyAgICBXb3JrZmxvd1N0YXRlIG5ld1N0YXRlID0gbmV3IFdvcmtmbG93U3RhdGUoKTsKKyAgICBuZXdTdGF0ZS5zZXRDYXRlZ29yeShzdGF0ZS5nZXRDYXRlZ29yeSgpKTsKKyAgICBuZXdTdGF0ZS5zZXREZXNjcmlwdGlvbihzdGF0ZS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICBuZXdTdGF0ZS5zZXRNZXNzYWdlKHN0YXRlLmdldE1lc3NhZ2UoKSk7CisgICAgbmV3U3RhdGUuc2V0TmFtZShzdGF0ZS5nZXROYW1lKCkpOworICAgIG5ld1N0YXRlLnNldFByZXZTdGF0ZShzdGF0ZS5nZXRQcmV2U3RhdGUoKSk7CisgICAgbmV3U3RhdGUuc2V0U3RhcnRUaW1lKHN0YXRlLmdldFN0YXJ0VGltZSgpKTsKKyAgICByZXR1cm4gbmV3U3RhdGU7CisgIH0KKyAgCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2xpZmVjeWNsZS9Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2xpZmVjeWNsZS9Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJlNzcwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1N0YXR1czsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBNYW5hZ2VyIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZXN9IHRvCisgKiBkZXRlcm1pbmUgc3RhdHVzIGZvciBhIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBMaXN0IGxpZmVjeWNsZXM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciB3aXRoIHRoZQorICAgICAqIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZX1zIGlkZW50aWZpZWQgaW4gdGhlIHByb3ZpZGVkIGZpbGUgcGF0aC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlmZWN5Y2xlc0ZpbGVQYXRoCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcihTdHJpbmcgbGlmZWN5Y2xlc0ZpbGVQYXRoKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5saWZlY3ljbGVzID0gV29ya2Zsb3dMaWZlY3ljbGVzUmVhZGVyCisgICAgICAgICAgICAgICAgICAgIC5wYXJzZUxpZmVjeWNsZXNGaWxlKGxpZmVjeWNsZXNGaWxlUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2V9IGZvciB0aGUKKyAgICAgKiBwcm92aWRlZCB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0uCisgICAgICogCisgICAgICogQHBhcmFtIGluc3QKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gdG8gZ2V0IHRoZSBjdXJyZW50IHN0YWdlIG51bSBmb3IuCisgICAgICogQHJldHVybiBUaGUgaW50IG51bWJlciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfSBmb3IgdGhlIHByb3ZpZGVkCisgICAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdGFnZU51bShXb3JrZmxvd0luc3RhbmNlIGluc3QpIHsKKyAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBzdGFnZSA9IGdldFN0YWdlKGluc3QpOworICAgICAgICBpZiAoc3RhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YWdlLmdldE9yZGVyKCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZX1zIGZvciB0aGUKKyAgICAgKiBwcm92aWRlZCB7QGxpbmsgV29ya2Zsb3d9IG1vZGVsLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3b3JrZmxvdworICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd30gbW9kZWwgdG8gZ2V0IHRoZSBudW1iZXIgb2YKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfXMgZm9yLiBPbmx5IHRoZSBpZGVudGlmaWVyCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgZnJvbQorICAgICAqIEBsaW5rIHtAbGluayBXb3JrZmxvdyNnZXRJZCgpfSBpcyB1c2VkLgorICAgICAqIEByZXR1cm4gVGhlIHRvdGFsIG51bWJlciBvZiB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZX1zIGZvciB0aGUKKyAgICAgKiAgICAgICAgIHByb3ZpZGVkIHtAbGluayBXb3JrZmxvd30gbW9kZWwuCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1TdGFnZXMoV29ya2Zsb3cgd29ya2Zsb3cpIHsKKyAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgbGlmZWN5Y2xlID0gZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3cod29ya2Zsb3cpOworICAgICAgICBpZiAobGlmZWN5Y2xlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZ2V0U3RhZ2VzKCkuc2l6ZSgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlfSBmb3IgdGhlIHByb3ZpZGVkCisgICAgICoge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IGJhc2VkIG9uIGl0cworICAgICAqIHtAbGluayBXb3JrZmxvd0luc3RhbmNlI2dldFN0YXR1cygpfSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5zdAorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSB0byBnZXQgdGhlIGN1cnJlbnQgc3RhZ2UgZm9yLgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2V9IGZvciB0aGUgcHJvdmlkZWQKKyAgICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBiYXNlZCBvbiBpdHMKKyAgICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0luc3RhbmNlI2dldFN0YXR1cygpfSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBnZXRTdGFnZShXb3JrZmxvd0luc3RhbmNlIGluc3QpIHsKKyAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgbGlmZWN5Y2xlID0gZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3coaW5zdAorICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvdygpKTsKKyAgICAgICAgaWYgKGxpZmVjeWNsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlIHN0YWdlID0gbGlmZWN5Y2xlLmdldFN0YWdlRm9yV29ya2Zsb3coaW5zdAorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgcmV0dXJuIHN0YWdlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdGhhdCB0aGlzIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBpcyBiYXNlZAorICAgICAqIG9uIGl0cyB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnN0CisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRvIGdldCB0aGUgY29tcGxldGlvbiBwZXJjZW50YWdlCisgICAgICogICAgICAgICAgICBmb3IuCisgICAgICogQHJldHVybiBUaGUgZG91YmxlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY29tcGxldGlvbiBwZXJjZW50YWdlIGZvciB0aGlzCisgICAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0uCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXRQZXJjZW50YWdlQ29tcGxldGUoV29ya2Zsb3dJbnN0YW5jZSBpbnN0KSB7CisgICAgICAgIGludCBudW1TdGFnZXMgPSBnZXROdW1TdGFnZXMoaW5zdC5nZXRXb3JrZmxvdygpKTsKKyAgICAgICAgaW50IGxhc3RDb21wbGV0ZWRTdGFnZU51bSA9IGdldExhc3RDb21wbGV0ZWRTdGFnZU51bShpbnN0KTsKKworICAgICAgICBkb3VibGUgcGN0ID0gKGRvdWJsZSkgKChsYXN0Q29tcGxldGVkU3RhZ2VOdW0gKiAxLjApIC8gKG51bVN0YWdlcyAqIDEuMCkpOworICAgICAgICByZXR1cm4gcGN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdHMgYSBkb3VibGUgcGVyY2VudCBudW1iZXIgdG8gYSAyIGRlY2ltYWwgcGxhY2UgU3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwY3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBkb3VibGUgcGVyY2VudCBudW1iZXIgdG8gZm9ybWF0LgorICAgICAqIEByZXR1cm4gQSBTdHJpbmcgZm9ybWF0dGVkIDIgZGVjaW1hbCBwbGFjZSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0UGN0KGRvdWJsZSBwY3QpIHsKKyAgICAgICAgTnVtYmVyRm9ybWF0IGZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOworICAgICAgICBmb3JtYXR0ZXIuc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKDIpOworICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChwY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlfSBtYW5hZ2VkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dMaWZlY3ljbGUgZ2V0RGVmYXVsdExpZmVjeWNsZSgpIHsKKyAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgZGVmYXVsdExpZmVjeWNsZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHRoaXMubGlmZWN5Y2xlcyAhPSBudWxsICYmIHRoaXMubGlmZWN5Y2xlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLmxpZmVjeWNsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgbGlmZWN5Y2xlID0gKFdvcmtmbG93TGlmZWN5Y2xlKSBpLm5leHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGUuZ2V0TmFtZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlLkRFRkFVTFRfTElGRUNZQ0xFKSkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRMaWZlY3ljbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlfSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkCisgICAgICoge0BsaW5rIFdvcmtmbG93fSBtb2RlbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd29ya2Zsb3cKKyAgICAgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgV29ya2Zsb3d9IHRvIG9idGFpbiB0aGUge0BsaW5rIFdvcmtmbG93TGlmZWN5Y2xlfQorICAgICAqICAgICAgICAgICAgZm9yLgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBXb3JrZmxvd0xpZmVjeWNsZX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZAorICAgICAqICAgICAgICAge0BsaW5rIFdvcmtmbG93fSBtb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dMaWZlY3ljbGUgZ2V0TGlmZWN5Y2xlRm9yV29ya2Zsb3coV29ya2Zsb3cgd29ya2Zsb3cpIHsKKyAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgZGVmYXVsdExpZmVjeWNsZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHRoaXMubGlmZWN5Y2xlcyAhPSBudWxsICYmIHRoaXMubGlmZWN5Y2xlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLmxpZmVjeWNsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgbGlmZWN5Y2xlID0gKFdvcmtmbG93TGlmZWN5Y2xlKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGlmZWN5Y2xlLmdldFdvcmtmbG93SWQoKS5lcXVhbHMod29ya2Zsb3cuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpZmVjeWNsZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGlmZWN5Y2xlLmdldE5hbWUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd0xpZmVjeWNsZS5ERUZBVUxUX0xJRkVDWUNMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdExpZmVjeWNsZSA9IGxpZmVjeWNsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0TGlmZWN5Y2xlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxhc3QgY29tcGxldGVkIHN0YWdlIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnN0CisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRvIG9idGFpbiB0aGUgbGFzdCBjb21wbGV0ZWQKKyAgICAgKiAgICAgICAgICAgIHN0YWdlIG51bWJlciBmb3IuCisgICAgICogQHJldHVybiBUaGUgbGFzdCBjb21wbGV0ZWQgc3RhZ2UgZm9yIHRoZSBnaXZlbiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMYXN0Q29tcGxldGVkU3RhZ2VOdW0oV29ya2Zsb3dJbnN0YW5jZSBpbnN0KSB7ICAKKyAgICAgICAgaW50IGN1cnJTdGFnZU51bSA9IGdldFN0YWdlTnVtKGluc3QpOworICAgICAgICBpZihpbnN0LmdldFN0YXRlKCkuZ2V0Q2F0ZWdvcnkoKSA9PSBudWxsKXsKKyAgICAgICAgICBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlIGNhdGVnb3J5ID0gbnVsbDsKKyAgICAgICAgICBpZigoY2F0ZWdvcnkgPSBnZXRTdGFnZShpbnN0KSkgIT0gbnVsbCl7CisgICAgICAgICAgICBpbnN0LmdldFN0YXRlKCkuc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpOworICAgICAgICAgIH0gICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgoaW5zdC5nZXRTdGF0dXMoKS5lcXVhbHMoV29ya2Zsb3dTdGF0dXMuRklOSVNIRUQpIHx8IAorICAgICAgICAgICAgIChpbnN0LmdldFN0YXRlKCkuZ2V0Q2F0ZWdvcnkoKSAhPSBudWxsICYmIAorICAgICAgICAgICAgIGluc3QuZ2V0U3RhdGUoKS5nZXRDYXRlZ29yeSgpLmdldE5hbWUoKS5lcXVhbHMoImRvbmUiKSkpCisgICAgICAgICAgICAgICAgJiYgY3VyclN0YWdlTnVtID09IGdldE51bVN0YWdlcyhpbnN0LmdldFdvcmtmbG93KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VyclN0YWdlTnVtOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjdXJyU3RhZ2VOdW0gLSAxOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlTWV0S2V5cy5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlTWV0S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWI5NmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9saWZlY3ljbGUvV29ya2Zsb3dMaWZlY3ljbGVNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogTWV0YWRhdGEga2V5cyBmb3IgcmVhZGluZyB0aGUge0BsaW5rIFdvcmtmbG93TGljeWNsZX1zIGZpbGUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dMaWZlY3ljbGVNZXRLZXlzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTElGRUNZQ0xFID0gImRlZmF1bHQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElGRUNZQ0xFX1RBR19OQU1FX0FUVFIgPSAibmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFHRV9UQUdfTkFNRV9BVFRSID0gIm5hbWUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX1RBR19OQU1FID0gInN0YXR1cyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFHRV9FTEVNX05BTUUgPSAic3RhZ2UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElGRUNZQ0xFX1RBR19OQU1FID0gImxpZmVjeWNsZSI7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9saWZlY3ljbGUvV29ya2Zsb3dMaWZlY3ljbGVTdGFnZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlU3RhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjAwYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlU3RhZ2UuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIEEgcGFydGljdWxhciBzdGVwIChvciBTdGFnZSkgaW4gYSB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGV9CisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICBwcml2YXRlIGludCBvcmRlcjsKKworICBwcml2YXRlIExpc3Q8V29ya2Zsb3dTdGF0ZT4gc3RhdGVzOworCisgIC8qKgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKiAKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlKCkgeworICAgIHN0YXRlcyA9IG5ldyBWZWN0b3I8V29ya2Zsb3dTdGF0ZT4oKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFdvcmtmbG93TGlmZWN5Y2xlU2FnZSB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgKiAKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFdvcmtmbG93TGlmZUN5Y2xlU3RhZ2UuCisgICAqIEBwYXJhbSBzdGF0ZXMKKyAgICogICAgICAgICAgVGhlIHtAbGluayBMaXN0fSBvZiBTdHJpbmcgc3RhdGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBwYXJ0aWN1bGFyCisgICAqICAgICAgICAgIHN0YWdlLgorICAgKiAKKyAgICogQHBhcmFtIG9yZGVyCisgICAqICAgICAgICAgIFRoZSBvcmRlcmluZyBvZiB0aGlzIFN0YXRlIGluIGEge0BMaXN0fSBvZiBTdGF0ZXMgdGhhdCBtYWtlCisgICAqICAgICAgICAgIHVwIGEge0BsaW5rIFdvcmtmbG93TGlmZUN5Y2xlfS4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlKFN0cmluZyBuYW1lLCBMaXN0PFdvcmtmbG93U3RhdGU+IHN0YXRlcywKKyAgICAgIGludCBvcmRlcikgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5zdGF0ZXMgPSBzdGF0ZXM7CisgICAgdGhpcy5vcmRlciA9IG9yZGVyOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHN0YXRlcworICAgKi8KKyAgcHVibGljIExpc3Q8V29ya2Zsb3dTdGF0ZT4gZ2V0U3RhdGVzKCkgeworICAgIHJldHVybiBzdGF0ZXM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHN0YXRlcworICAgKiAgICAgICAgICB0aGUgc3RhdGVzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U3RhdGVzKExpc3Q8V29ya2Zsb3dTdGF0ZT4gc3RhdGVzKSB7CisgICAgdGhpcy5zdGF0ZXMgPSBzdGF0ZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgb3JkZXIKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CisgICAgcmV0dXJuIG9yZGVyOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBvcmRlcgorICAgKiAgICAgICAgICB0aGUgb3JkZXIgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRPcmRlcihpbnQgb3JkZXIpIHsKKyAgICB0aGlzLm9yZGVyID0gb3JkZXI7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorICAgKi8KKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5uYW1lLmhhc2hDb2RlKCkgKyBuZXcgSW50ZWdlcih0aGlzLm9yZGVyKS5oYXNoQ29kZSgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgc3RhZ2UpIHsKKyAgICByZXR1cm4gdGhpcy5uYW1lLmVxdWFscygoKFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2UpIHN0YWdlKS5nZXROYW1lKCkpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiB0aGlzLm5hbWU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlc1JlYWRlci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93TGlmZWN5Y2xlc1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTM0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9saWZlY3ljbGUvV29ya2Zsb3dMaWZlY3ljbGVzUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLkRPTVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIHJlYWRlciBmb3IgdGhlIDxjb2RlPndvcmtmbG93LWxpZmVjeWNsZS54bWw8L2NvZGU+IGZpbGUuCisgKiA8L3A+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV29ya2Zsb3dMaWZlY3ljbGVzUmVhZGVyIGltcGxlbWVudHMgV29ya2Zsb3dMaWZlY3ljbGVNZXRLZXlzIHsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoV29ya2Zsb3dMaWZlY3ljbGVzUmVhZGVyLmNsYXNzCisgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgV29ya2Zsb3dMaWZlY3ljbGVzUmVhZGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiRG9uJ3QgY29uc3RydWN0IHV0aWxpdHkgY2xhc3NlcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgcGFyc2VMaWZlY3ljbGVzRmlsZShTdHJpbmcgbGlmZWN5Y2xlc0ZpbGVQYXRoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50Um9vdChsaWZlY3ljbGVzRmlsZVBhdGgpOworICAgICAgICBFbGVtZW50IHJvb3RFbGVtID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICBMaXN0IGxpZmVjeWNsZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYSBkZWZhdWx0IHRhZworICAgICAgICBFbGVtZW50IGRlZmF1bHRFbGVtID0gRE9NVXRpbC5nZXRGaXJzdEVsZW1lbnQocm9vdEVsZW0sCisgICAgICAgICAgICAgICAgREVGQVVMVF9MSUZFQ1lDTEUpOworCisgICAgICAgIGlmIChkZWZhdWx0RWxlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJmaWxlOiBbIiArIGxpZmVjeWNsZXNGaWxlUGF0aAorICAgICAgICAgICAgICAgICAgICArICJdIG11c3Qgc3BlY2lmeSBhIGRlZmF1bHQgd29ya2Zsb3cgbGlmZWN5Y2xlISIpOworICAgICAgICB9CisKKyAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGUgZGVmYXVsdExpZmVjeWNsZSA9IHJlYWRMaWZlY3ljbGUoZGVmYXVsdEVsZW0sIHRydWUpOworICAgICAgICBsaWZlY3ljbGVzLmFkZChkZWZhdWx0TGlmZWN5Y2xlKTsKKworICAgICAgICBOb2RlTGlzdCBsaWZlY3ljbGVOb2RlcyA9IGRlZmF1bHRFbGVtCisgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKExJRkVDWUNMRV9UQUdfTkFNRSk7CisgICAgICAgIGlmIChsaWZlY3ljbGVOb2RlcyAhPSBudWxsICYmIGxpZmVjeWNsZU5vZGVzLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWZlY3ljbGVOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBsaWZlY3ljbGVFbGVtID0gKEVsZW1lbnQpIGxpZmVjeWNsZU5vZGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlcy5hZGQocmVhZExpZmVjeWNsZShsaWZlY3ljbGVFbGVtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlczsKKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFdvcmtmbG93TGlmZWN5Y2xlIHJlYWRMaWZlY3ljbGUoRWxlbWVudCBsaWZlY3ljbGVFbGVtKSB7CisgICAgICAgIHJldHVybiByZWFkTGlmZWN5Y2xlKGxpZmVjeWNsZUVsZW0sIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBXb3JrZmxvd0xpZmVjeWNsZSByZWFkTGlmZWN5Y2xlKEVsZW1lbnQgbGlmZWN5Y2xlRWxlbSwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNEZWZhdWx0KSB7CisgICAgICAgIFdvcmtmbG93TGlmZWN5Y2xlIGxpZmVjeWNsZSA9IG5ldyBXb3JrZmxvd0xpZmVjeWNsZSgpOworICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlTmFtZSA9IGlzRGVmYXVsdCA/IFdvcmtmbG93TGlmZWN5Y2xlLkRFRkFVTFRfTElGRUNZQ0xFCisgICAgICAgICAgICAgICAgOiBsaWZlY3ljbGVFbGVtLmdldEF0dHJpYnV0ZShMSUZFQ1lDTEVfVEFHX05BTUVfQVRUUik7CisgICAgICAgIGxpZmVjeWNsZS5zZXROYW1lKGxpZmVjeWNsZU5hbWUpOworICAgICAgICBsaWZlY3ljbGUuc2V0V29ya2Zsb3dJZChXb3JrZmxvd0xpZmVjeWNsZS5OT19XT1JLRkxPV19JRCk7CisgICAgICAgIGFkZFN0YWdlc1RvTGlmZWN5Y2xlKGxpZmVjeWNsZSwgbGlmZWN5Y2xlRWxlbSk7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFN0YWdlc1RvTGlmZWN5Y2xlKFdvcmtmbG93TGlmZWN5Y2xlIGxpZmVjeWNsZSwKKyAgICAgICAgICAgIEVsZW1lbnQgbGlmZWN5Y2xlRWxlbSkgeworICAgICAgICBOb2RlTGlzdCBzdGFnZXNOb2RlcyA9IGxpZmVjeWNsZUVsZW0KKyAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoU1RBR0VfRUxFTV9OQU1FKTsKKworICAgICAgICBpZiAoc3RhZ2VzTm9kZXMgIT0gbnVsbCAmJiBzdGFnZXNOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhZ2VzTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgc3RhZ2VFbGVtID0gKEVsZW1lbnQpIHN0YWdlc05vZGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBzdGFnZSA9IG5ldyBXb3JrZmxvd0xpZmVjeWNsZVN0YWdlKCk7CisgICAgICAgICAgICAgICAgc3RhZ2Uuc2V0TmFtZShzdGFnZUVsZW0uZ2V0QXR0cmlidXRlKFNUQUdFX1RBR19OQU1FX0FUVFIpKTsKKyAgICAgICAgICAgICAgICBzdGFnZS5zZXRPcmRlcihpKzEpOworICAgICAgICAgICAgICAgIHN0YWdlLnNldFN0YXRlcyhyZWFkU3RhdGVzKHN0YWdlRWxlbSwgc3RhZ2UpKTsKKyAgICAgICAgICAgICAgICBsaWZlY3ljbGUuYWRkU3RhZ2Uoc3RhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIExpc3Q8V29ya2Zsb3dTdGF0ZT4gcmVhZFN0YXRlcyhFbGVtZW50IHN0YWdlRWxlbSwgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBjYXRlZ29yeSl7CisgICAgICBMaXN0PFdvcmtmbG93U3RhdGU+IHN0YXRlcyA9IG5ldyBWZWN0b3I8V29ya2Zsb3dTdGF0ZT4oKTsKKyAgICAgIE5vZGVMaXN0IHN0YXR1c05vZGVMaXN0ID0gc3RhZ2VFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFNUQVRVU19UQUdfTkFNRSk7CisgICAgICBpZihzdGF0dXNOb2RlTGlzdCAhPSBudWxsICYmIHN0YXR1c05vZGVMaXN0LmdldExlbmd0aCgpID4gMCl7CisgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgc3RhdHVzTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKyl7CisgICAgICAgICAgRWxlbWVudCBzdGF0dXNFbGVtID0gKEVsZW1lbnQpc3RhdHVzTm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgICAvLyBzZWUgaWYgaXRzIG5hbWUgaXMgc3BlY2lmaWVkIHZpYSB0aGUgbmFtZSBhdHRyaWJ1dGUsIG90aGVyd2lzZQorICAgICAgICAgIC8vIHJlYWQgaXQgaW4gYmFjayBjb21wYXQgbW9kZQorICAgICAgICAgIAorICAgICAgICAgIGlmKHN0YXR1c0VsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikgIT0gbnVsbCAmJiAKKyAgICAgICAgICAgICAgIXN0YXR1c0VsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikuZXF1YWxzKCIiKSl7CisgICAgICAgICAgICBTdHJpbmcgc3RhdHVzTmFtZSA9IHN0YXR1c0VsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBYTUxVdGlscy5nZXRFbGVtZW50VGV4dCgiZGVzY3JpcHRpb24iLCBzdGF0dXNFbGVtKTsKKyAgICAgICAgICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSBuZXcgV29ya2Zsb3dTdGF0ZSgpOworICAgICAgICAgICAgc3RhdGUuc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpOworICAgICAgICAgICAgc3RhdGUuc2V0TmFtZShzdGF0dXNOYW1lKTsKKyAgICAgICAgICAgIHN0YXRlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHN0YXRlcy5hZGQoc3RhdGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNleworICAgICAgICAgICAgLy8gYmFjayBjb21wYXQgbW9kZQorICAgICAgICAgICAgU3RyaW5nIHN0YXR1c05hbWUgPSBYTUxVdGlscy5nZXRTaW1wbGVFbGVtZW50VGV4dChzdGF0dXNFbGVtKTsKKyAgICAgICAgICAgIFdvcmtmbG93U3RhdGUgc3RhdGUgPSBuZXcgV29ya2Zsb3dTdGF0ZSgpOworICAgICAgICAgICAgc3RhdGUuc2V0TmFtZShzdGF0dXNOYW1lKTsKKyAgICAgICAgICAgIHN0YXRlLnNldE1lc3NhZ2Uoc3RhdHVzTmFtZSk7CisgICAgICAgICAgICBzdGF0ZS5zZXRDYXRlZ29yeShjYXRlZ29yeSk7CisgICAgICAgICAgICBzdGF0ZXMuYWRkKHN0YXRlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIHN0YXRlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudFJvb3QoU3RyaW5nIHhtbEZpbGUpIHsKKyAgICAgICAgLy8gb3BlbiB1cCB0aGUgWE1MIGZpbGUKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IG51bGw7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKyAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOworCisgICAgICAgIElucHV0U3RyZWFtIHhtbElucHV0U3RyZWFtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgeG1sSW5wdXRTdHJlYW0gPSBuZXcgRmlsZSh4bWxGaWxlKS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBnZXR0aW5nIGlucHV0IHN0cmVhbSBmcm9tIFsiICsgeG1sRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IHJldHVybmluZyBudWxsIGRvY3VtZW50IHJvb3QiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoeG1sSW5wdXRTdHJlYW0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy53YXJuaW5nKCJVbmFibGUgdG8gcGFyc2UgeG1sIGZpbGUgWyIgKyB4bWxGaWxlICsgIl0uIgorICAgICAgICAgICAgICAgICAgICArICJSZWFzb24gaXMgWyIgKyBlICsgIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1dvcmtmbG93U3RhdGUuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2xpZmVjeWNsZS9Xb3JrZmxvd1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlMWNhNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2xpZmVjeWNsZS9Xb3JrZmxvd1N0YXRlLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIAorICogVGhlIHN0YXRlIG9mIGEgV29ya2Zsb3dQcm9jZXNzb3IKKyAqIAorICogQGF1dGhvciBiZm9zdGVyCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93U3RhdGUgeworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisJcHJpdmF0ZSBEYXRlIHN0YXJ0VGltZTsKKwlwcml2YXRlIFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2UgY2F0ZWdvcnk7CisJcHJpdmF0ZSBXb3JrZmxvd1N0YXRlIHByZXZTdGF0ZTsKKwkKKwkKKwlwdWJsaWMgV29ya2Zsb3dTdGF0ZSgpeworCSAgdGhpcy5zdGFydFRpbWUgPSBudWxsOworCSAgdGhpcy5uYW1lID0gbnVsbDsKKwkgIHRoaXMuZGVzY3JpcHRpb24gPSBudWxsOworCSAgdGhpcy5tZXNzYWdlID0gbnVsbDsKKwkgIHRoaXMuY2F0ZWdvcnkgPSBudWxsOworCSAgdGhpcy5wcmV2U3RhdGUgPSBudWxsOworCX0KKwkKKwlwdWJsaWMgV29ya2Zsb3dTdGF0ZShTdHJpbmcgbWVzc2FnZSkgeworCSAgdGhpcygpOworCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworCQl0aGlzLnN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpeworCSAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lKERhdGUgc3RhcnRUaW1lKXsKKwkgIHRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisJCXJldHVybiB0aGlzLm1lc3NhZ2U7CisJfQorCQorCXB1YmxpYyBEYXRlIGdldFN0YXJ0VGltZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3RhcnRUaW1lOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya2Zsb3dTdGF0ZSkgCisJCQlyZXR1cm4gKChXb3JrZmxvd1N0YXRlKSBvYmopLmdldE5hbWUoKS5lcXVhbHModGhpcy5nZXROYW1lKCkpOworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCQkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkgKyAiIFsiK3RoaXMuZ2V0Q2F0ZWdvcnkoKSsiXSA6ICIgKyB0aGlzLmdldE1lc3NhZ2UoKTsKKwl9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGNhdGVnb3J5CisgICAqLworICBwdWJsaWMgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBnZXRDYXRlZ29yeSgpIHsKKyAgICByZXR1cm4gY2F0ZWdvcnk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFdvcmtmbG93TGlmZWN5Y2xlU3RhZ2UgY2F0ZWdvcnkpIHsKKyAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcHJldlN0YXRlCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dTdGF0ZSBnZXRQcmV2U3RhdGUoKSB7CisgICAgcmV0dXJuIHByZXZTdGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcHJldlN0YXRlIHRoZSBwcmV2U3RhdGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcmV2U3RhdGUoV29ya2Zsb3dTdGF0ZSBwcmV2U3RhdGUpIHsKKyAgICB0aGlzLnByZXZTdGF0ZSA9IHByZXZTdGF0ZTsKKyAgfQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbWV0YWRhdGEvQ29yZU1ldEtleXMuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L21ldGFkYXRhL0NvcmVNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2MmE4YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L21ldGFkYXRhL0NvcmVNZXRLZXlzLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lm1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBDb3JlIG1ldGFkYXRhIGtleSBuYW1lcyBmb3IgdGhlIFdvcmtmbG93IE1hbmFnZXIKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29yZU1ldEtleXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19JRCA9ICJUYXNrSWQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfSU5TVF9JRCA9ICJXb3JrZmxvd0luc3RJZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfSUQgPSAiSm9iSWQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0lOR19OT0RFID0gIlByb2Nlc3NpbmdOb2RlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktGTE9XX01BTkFHRVJfVVJMID0gIldvcmtmbG93TWFuYWdlclVybCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVVRV9OQU1FID0gIlF1ZXVlTmFtZSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19MT0FEID0gIlRhc2tMb2FkIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9EYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L0RhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYwNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9EYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxNzg2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5EYlN0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Ob09wVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5RXhjZXB0aW9uOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKKworLyoqCisgKiAKKyAqIEEge0BsaW5rIERhdGFTb3VyY2V9LWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIGEgd29ya2Zsb3cgcmVwb3NpdG9yeS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVdvcmtmbG93UmVwb3NpdG9yeSBpbXBsZW1lbnRzIFdvcmtmbG93UmVwb3NpdG9yeSB7CisKKyAgLyogb3VyIGRhdGEgc291cmNlICovCisgIHByaXZhdGUgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwcml2YXRlIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnkuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8qKgorICAgKiA8cD4KKyAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgKiA8L3A+CisgICAqIC4KKyAgICovCisgIHB1YmxpYyBEYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5KERhdGFTb3VyY2UgZHMpIHsKKyAgICBkYXRhU291cmNlID0gZHM7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dCeU5hbWUKKyAgICogKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgV29ya2Zsb3cgZ2V0V29ya2Zsb3dCeU5hbWUoU3RyaW5nIHdvcmtmbG93TmFtZSkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0V29ya2Zsb3dCeU5hbWUod29ya2Zsb3dOYW1lLCB0cnVlLCB0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5TmFtZShTdHJpbmcgd29ya2Zsb3dOYW1lLCBib29sZWFuIGdldFRhc2tzLAorICAgICAgYm9vbGVhbiBnZXRDb25kaXRpb25zKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBnZXRXb3JrZmxvd1NxbCA9ICJTRUxFQ1QgKiBmcm9tIHdvcmtmbG93cyBXSEVSRSB3b3JrZmxvd19uYW1lID0gJyIKKyAgICAgICAgICArIHdvcmtmbG93TmFtZSArICInIjsKKworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0V29ya2Zsb3dCeU5hbWU6IEV4ZWN1dGluZzogIiArIGdldFdvcmtmbG93U3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRXb3JrZmxvd1NxbCk7CisKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgd29ya2Zsb3cgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3cocnMpOworCisgICAgICAgIGlmIChnZXRUYXNrcykgeworICAgICAgICAgIHdvcmtmbG93LnNldFRhc2tzKGdldFRhc2tzQnlXb3JrZmxvd0lkKHdvcmtmbG93LmdldElkKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRDb25kaXRpb25zKSB7CisgICAgICAgICAgd29ya2Zsb3cuc2V0Q29uZGl0aW9ucyhnZXRDb25kaXRpb25zQnlXb3JrZmxvd0lkKHdvcmtmbG93LmdldElkKCkpKTsKKyAgICAgICAgICBoYW5kbGVHbG9iYWxXb3JrZmxvd0NvbmRpdGlvbnMod29ya2Zsb3cpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3cuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0cnkgeworICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0V29ya2Zsb3dCeU5hbWUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3b3JrZmxvdzsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRXb3JrZmxvd0J5SWQKKyAgICogKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgV29ya2Zsb3cgZ2V0V29ya2Zsb3dCeUlkKFN0cmluZyB3b3JrZmxvd0lkKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldFdvcmtmbG93QnlJZCh3b3JrZmxvd0lkLCB0cnVlLCB0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQsIGJvb2xlYW4gZ2V0VGFza3MsCisgICAgICBib29sZWFuIGdldENvbmRpdGlvbnMpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgU3RyaW5nIGdldFdvcmtmbG93U3FsID0gIlNFTEVDVCAqIGZyb20gd29ya2Zsb3dzIFdIRVJFIHdvcmtmbG93X2lkID0gJyIKKyAgICAgICAgICArIHdvcmtmbG93SWQgKyAiJyI7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldFdvcmtmbG93QnlJZDogRXhlY3V0aW5nOiAiICsgZ2V0V29ya2Zsb3dTcWwpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFdvcmtmbG93U3FsKTsKKworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICB3b3JrZmxvdyA9IERiU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvdyhycyk7CisKKyAgICAgICAgaWYgKGdldFRhc2tzKSB7CisgICAgICAgICAgd29ya2Zsb3cuc2V0VGFza3MoZ2V0VGFza3NCeVdvcmtmbG93SWQod29ya2Zsb3cuZ2V0SWQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldENvbmRpdGlvbnMpIHsKKyAgICAgICAgICB3b3JrZmxvdy5zZXRDb25kaXRpb25zKGdldENvbmRpdGlvbnNCeVdvcmtmbG93SWQod29ya2Zsb3cuZ2V0SWQoKSkpOworICAgICAgICAgIGhhbmRsZUdsb2JhbFdvcmtmbG93Q29uZGl0aW9ucyh3b3JrZmxvdyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyB3b3JrZmxvdy4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKAorICAgICAgICAgICAgTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRXb3JrZmxvd0J5SWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3b3JrZmxvdzsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRXb3JrZmxvd3MoKQorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0V29ya2Zsb3dzKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIHJldHVybiBnZXRXb3JrZmxvd3ModHJ1ZSwgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgTGlzdCBnZXRXb3JrZmxvd3MoYm9vbGVhbiBnZXRUYXNrcywgYm9vbGVhbiBnZXRDb25kaXRpb25zKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgIExpc3Qgd29ya2Zsb3dzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgZ2V0V29ya2Zsb3dTcWwgPSAiU0VMRUNUICogZnJvbSB3b3JrZmxvd3MiOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRXb3JrZmxvd3M6IEV4ZWN1dGluZzogIiArIGdldFdvcmtmbG93U3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRXb3JrZmxvd1NxbCk7CisgICAgICB3b3JrZmxvd3MgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3cocnMpOworCisgICAgICAgIGlmIChnZXRUYXNrcykgeworICAgICAgICAgIHdvcmtmbG93LnNldFRhc2tzKGdldFRhc2tzQnlXb3JrZmxvd0lkKHdvcmtmbG93LmdldElkKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRDb25kaXRpb25zKSB7CisgICAgICAgICAgd29ya2Zsb3cuc2V0Q29uZGl0aW9ucyhnZXRDb25kaXRpb25zQnlXb3JrZmxvd0lkKHdvcmtmbG93LmdldElkKCkpKTsKKyAgICAgICAgICBoYW5kbGVHbG9iYWxXb3JrZmxvd0NvbmRpdGlvbnMod29ya2Zsb3cpOworICAgICAgICB9CisKKyAgICAgICAgd29ya2Zsb3dzLmFkZCh3b3JrZmxvdyk7CisgICAgICB9CisKKyAgICAgIGlmICh3b3JrZmxvd3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgd29ya2Zsb3dzID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyB3b3JrZmxvd3MuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0cnkgeworICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0V29ya2Zsb3dzIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0gZmluYWxseSB7CisKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd29ya2Zsb3dzOworICB9CisKKyAgcHVibGljIExpc3QgZ2V0VGFza3NCeVdvcmtmbG93SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgTGlzdCB0YXNrcyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgU3RyaW5nIGdldFRhc2tzU3FsID0gIlNFTEVDVCB3b3JrZmxvd190YXNrcy4qLCB3b3JrZmxvd190YXNrX21hcC50YXNrX29yZGVyICIKKyAgICAgICAgICArICJGUk9NIHdvcmtmbG93X3Rhc2tzLCB3b3JrZmxvd190YXNrX21hcCAiCisgICAgICAgICAgKyAiV0hFUkUgd29ya2Zsb3dfdGFza19tYXAud29ya2Zsb3dfdGFza19pZCA9IHdvcmtmbG93X3Rhc2tzLndvcmtmbG93X3Rhc2tfaWQgIgorICAgICAgICAgICsgIkFORCB3b3JrZmxvd190YXNrX21hcC53b3JrZmxvd19pZCA9ICIKKyAgICAgICAgICArIHdvcmtmbG93SWQKKyAgICAgICAgICArICIgIgorICAgICAgICAgICsgIk9SREVSIEJZIHdvcmtmbG93X3Rhc2tfbWFwLnRhc2tfb3JkZXIiOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRUYXNrc0J5V29ya2Zsb3dJZDogRXhlY3V0aW5nOiAiICsgZ2V0VGFza3NTcWwpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFRhc2tzU3FsKTsKKyAgICAgIHRhc2tzID0gbmV3IFZlY3RvcigpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIC8vIGdldCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZQorCisgICAgICAgIFdvcmtmbG93VGFzayB0YXNrID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93VGFzayhycywgdHJ1ZSk7CisKKyAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCkgeworICAgICAgICAgIHRhc2suc2V0Q29uZGl0aW9ucyhnZXRDb25kaXRpb25zQnlUYXNrSWQodGFzay5nZXRUYXNrSWQoKSkpOworICAgICAgICAgIHRhc2suc2V0VGFza0NvbmZpZyhnZXRDb25maWd1cmF0aW9uQnlUYXNrSWQodGFzay5nZXRUYXNrSWQoKSkpOworICAgICAgICAgIHRhc2tzLmFkZCh0YXNrKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGFza3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgdGFza3MgPSBudWxsOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gZ2V0dGluZyB0YXNrcyBmb3Igd29ya2Zsb3cuIE1lc3NhZ2U6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0VGFza3NCeVdvcmtmbG93SWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0YXNrczsKKyAgfQorCisgIHB1YmxpYyBMaXN0IGdldFRhc2tzQnlXb3JrZmxvd05hbWUoU3RyaW5nIHdvcmtmbG93TmFtZSkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICBMaXN0IHRhc2tzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgZ2V0VGFza3NTcWwgPSAiU0VMRUNUIHdvcmtmbG93X3Rhc2tzLiosIHdvcmtmbG93X3Rhc2tfbWFwLnRhc2tfb3JkZXIgIgorICAgICAgICAgICsgIkZST00gd29ya2Zsb3dfdGFza3MsIHdvcmtmbG93X3Rhc2tfbWFwLCB3b3JrZmxvd3MgIgorICAgICAgICAgICsgIldIRVJFIHdvcmtmbG93X3Rhc2tfbWFwLndvcmtmbG93X3Rhc2tfaWQgPSB3b3JrZmxvd190YXNrcy53b3JrZmxvd190YXNrX2lkICIKKyAgICAgICAgICArICJBTkQgd29ya2Zsb3dfdGFza19tYXAud29ya2Zsb3dfaWQgPSB3b3JrZmxvd3Mud29ya2Zsb3dfaWQgIgorICAgICAgICAgICsgIkFORCB3b3JrZmxvd3Mud29ya2Zsb3dfbmFtZSA9ICciCisgICAgICAgICAgKyB3b3JrZmxvd05hbWUKKyAgICAgICAgICArICInICIKKyAgICAgICAgICArICJPUkRFUiBCWSB3b3JrZmxvd190YXNrX21hcC50YXNrX29yZGVyIjsKKworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0VGFza3NCeVdvcmtmbG93TmFtZTogRXhlY3V0aW5nOiAiICsgZ2V0VGFza3NTcWwpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFRhc2tzU3FsKTsKKyAgICAgIHRhc2tzID0gbmV3IFZlY3RvcigpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIC8vIGdldCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZQorICAgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IERiU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd1Rhc2socnMsIHRydWUpOworCisgICAgICAgIGlmICh0YXNrICE9IG51bGwpIHsKKyAgICAgICAgICB0YXNrLnNldENvbmRpdGlvbnMoZ2V0Q29uZGl0aW9uc0J5VGFza0lkKHRhc2suZ2V0VGFza0lkKCkpKTsKKyAgICAgICAgICB0YXNrLnNldFRhc2tDb25maWcoZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKHRhc2suZ2V0VGFza0lkKCkpKTsKKyAgICAgICAgICB0YXNrcy5hZGQodGFzayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRhc2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHRhc2tzID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgdGFza3MgZm9yIHdvcmtmbG93LiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0cnkgeworICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFRhc2tzQnlXb3JrZmxvd05hbWUgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0YXNrczsKKyAgfQorCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93c0ZvckV2ZW50KFN0cmluZyBldmVudE5hbWUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0V29ya2Zsb3dzRm9yRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93c0ZvckV2ZW50KFN0cmluZyBldmVudE5hbWUsIGJvb2xlYW4gZ2V0VGFza3MsCisgICAgICBib29sZWFuIGdldENvbmRpdGlvbnMpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICBMaXN0IHdvcmtmbG93cyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgU3RyaW5nIGdldFdvcmtmbG93U3FsID0gIlNFTEVDVCAqIGZyb20gd29ya2Zsb3dzLCBldmVudF93b3JrZmxvd19tYXAgV0hFUkUgZXZlbnRfd29ya2Zsb3dfbWFwLndvcmtmbG93X2lkID0gd29ya2Zsb3dzLndvcmtmbG93X2lkICAiCisgICAgICAgICAgKyAiQU5EIGV2ZW50X3dvcmtmbG93X21hcC5ldmVudF9uYW1lID0gJyIgKyBldmVudE5hbWUgKyAiJyI7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldFdvcmtmbG93c0ZvckV2ZW50OiBFeGVjdXRpbmc6ICIgKyBnZXRXb3JrZmxvd1NxbCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0V29ya2Zsb3dTcWwpOworICAgICAgd29ya2Zsb3dzID0gbmV3IFZlY3RvcigpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93KHJzKTsKKworICAgICAgICBpZiAoZ2V0VGFza3MpIHsKKyAgICAgICAgICB3b3JrZmxvdy5zZXRUYXNrcyhnZXRUYXNrc0J5V29ya2Zsb3dJZCh3b3JrZmxvdy5nZXRJZCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0Q29uZGl0aW9ucykgeworICAgICAgICAgIHdvcmtmbG93LnNldENvbmRpdGlvbnMoZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZCh3b3JrZmxvdy5nZXRJZCgpKSk7CisgICAgICAgICAgaGFuZGxlR2xvYmFsV29ya2Zsb3dDb25kaXRpb25zKHdvcmtmbG93KTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtmbG93cy5hZGQod29ya2Zsb3cpOworICAgICAgfQorCisgICAgICBpZiAod29ya2Zsb3dzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHdvcmtmbG93cyA9IG51bGw7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIHdvcmtmbG93cyBmb3IgZXZlbnQuIE1lc3NhZ2U6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0V29ya2Zsb3dzRm9yRXZlbnQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3b3JrZmxvd3M7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjCisgICAqIGdldENvbmRpdGlvbnNCeVRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgTGlzdCBnZXRDb25kaXRpb25zQnlUYXNrTmFtZShTdHJpbmcgdGFza05hbWUpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgTGlzdCBjb25kaXRpb25zID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgZ2V0Q29uZGl0aW9uc1NxbCA9ICJTRUxFQ1Qgd29ya2Zsb3dfY29uZGl0aW9ucy4qLCB0YXNrX2NvbmRpdGlvbl9tYXAuY29uZGl0aW9uX29yZGVyICIKKyAgICAgICAgICArICJGUk9NIHdvcmtmbG93X2NvbmRpdGlvbnMsIHRhc2tfY29uZGl0aW9uX21hcCwgd29ya2Zsb3dfdGFza3MgIgorICAgICAgICAgICsgIldIRVJFIHRhc2tfY29uZGl0aW9uX21hcC53b3JrZmxvd19jb25kaXRpb25faWQgPSB3b3JrZmxvd19jb25kaXRpb25zLndvcmtmbG93X2NvbmRpdGlvbl9pZCAiCisgICAgICAgICAgKyAiQU5EIHRhc2tfY29uZGl0aW9uX21hcC53b3JrZmxvd190YXNrX2lkID0gd29ya2Zsb3dfdGFza3Mud29ya2Zsb3dfdGFza19pZCAiCisgICAgICAgICAgKyAiQU5EIHdvcmtmbG93X3Rhc2tzLndvcmtmbG93X3Rhc2tfbmFtZSA9ICciCisgICAgICAgICAgKyB0YXNrTmFtZQorICAgICAgICAgICsgIicgIgorICAgICAgICAgICsgIk9SREVSIEJZIHRhc2tfY29uZGl0aW9uX21hcC5jb25kaXRpb25fb3JkZXIiOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRDb25kaXRpb25zQnlUYXNrTmFtZTogRXhlY3V0aW5nOiAiCisgICAgICAgICAgKyBnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIGNvbmRpdGlvbnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgLy8gZ2V0IGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBuYW1lCisgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbiA9IERiU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd0NvbmRpdGlvbihycywKKyAgICAgICAgICAgIHRydWUpOworICAgICAgICBjb25kaXRpb25zLmFkZChjb25kaXRpb24pOworICAgICAgfQorCisgICAgICBpZiAoY29uZGl0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICBjb25kaXRpb25zID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgY29uZGl0aW9ucyBmb3IgdGFzay4gTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRDb25kaXRpb25zQnlUYXNrTmFtZSB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworCisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbmRpdGlvbnM7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjCisgICAqIGdldENvbmRpdGlvbnNCeVRhc2tJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0Q29uZGl0aW9uc0J5VGFza0lkKFN0cmluZyB0YXNrSWQpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICBMaXN0IGNvbmRpdGlvbnMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBnZXRDb25kaXRpb25zU3FsID0gIlNFTEVDVCB3b3JrZmxvd19jb25kaXRpb25zLiosIHRhc2tfY29uZGl0aW9uX21hcC5jb25kaXRpb25fb3JkZXIgIgorICAgICAgICAgICsgIkZST00gd29ya2Zsb3dfY29uZGl0aW9ucywgdGFza19jb25kaXRpb25fbWFwICIKKyAgICAgICAgICArICJXSEVSRSB0YXNrX2NvbmRpdGlvbl9tYXAud29ya2Zsb3dfY29uZGl0aW9uX2lkID0gd29ya2Zsb3dfY29uZGl0aW9ucy53b3JrZmxvd19jb25kaXRpb25faWQgIgorICAgICAgICAgICsgIkFORCB0YXNrX2NvbmRpdGlvbl9tYXAud29ya2Zsb3dfdGFza19pZCA9ICIKKyAgICAgICAgICArIHRhc2tJZAorICAgICAgICAgICsgIiAiCisgICAgICAgICAgKyAiT1JERVIgQlkgdGFza19jb25kaXRpb25fbWFwLmNvbmRpdGlvbl9vcmRlciI7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldENvbmRpdGlvbnNCeVRhc2tJZDogRXhlY3V0aW5nOiAiCisgICAgICAgICAgKyBnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIGNvbmRpdGlvbnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgLy8gZ2V0IGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBuYW1lCisgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbiA9IERiU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd0NvbmRpdGlvbihycywKKyAgICAgICAgICAgIHRydWUpOworICAgICAgICBjb25kaXRpb25zLmFkZChjb25kaXRpb24pOworICAgICAgfQorCisgICAgICBpZiAoY29uZGl0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICBjb25kaXRpb25zID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgY29uZGl0aW9ucyBmb3IgdGFzay4gTWVzc2FnZTogIgorICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRDb25kaXRpb25zQnlUYXNrSWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb25kaXRpb25zOworICB9CisKKyAgcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKFN0cmluZyB0YXNrSWQpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBnZXRDb25maWd1cmF0aW9uU3FsID0gIlNFTEVDVCAqIGZyb20gd29ya2Zsb3dfdGFza19jb25maWd1cmF0aW9uIFdIRVJFIHdvcmtmbG93X3Rhc2tfaWQgPSAiCisgICAgICAgICAgKyB0YXNrSWQ7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldENvbmZpZ3VyYXRpb25CeVRhc2tJZDogRXhlY3V0aW5nOiAiCisgICAgICAgICAgKyBnZXRDb25maWd1cmF0aW9uU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRDb25maWd1cmF0aW9uU3FsKTsKKworICAgICAgY29uZmlnID0gbmV3IFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgY29uZmlnLmdldFByb3BlcnRpZXMoKS5wdXQocnMuZ2V0U3RyaW5nKCJwcm9wZXJ0eV9uYW1lIiksCisgICAgICAgICAgICBycy5nZXRTdHJpbmcoInByb3BlcnR5X3ZhbHVlIikpOworICAgICAgfQorCisgICAgICBpZiAoY29uZmlnLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKS5zaXplKCkgPT0gMCkgeworICAgICAgICBjb25maWcgPSBudWxsOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHRhc2sgY29uZmlndXJhdGlvbiBmb3IgdGFza0lkOiAiICsgdGFza0lkCisgICAgICAgICAgICAgICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRDb25maWd1cmF0aW9uQnl0YXNrSWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb25maWc7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb25CeUNvbmRpdGlvbklkKAorICAgICAgU3RyaW5nIGNvbmRJZCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBnZXRDb25maWd1cmF0aW9uU3FsID0gIlNFTEVDVCAqIGZyb20gd29ya2Zsb3dfY29uZGl0aW9uX2NvbmZpZ3VyYXRpb24gV0hFUkUgd29ya2Zsb3dfY29uZGl0aW9uX2lkID0gIgorICAgICAgICAgICsgY29uZElkOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRDb25maWd1cmF0aW9uQnlDb25maWd1cmF0aW9uSWQ6IEV4ZWN1dGluZzogIgorICAgICAgICAgICsgZ2V0Q29uZmlndXJhdGlvblNxbCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoZ2V0Q29uZmlndXJhdGlvblNxbCk7CisKKyAgICAgIGNvbmZpZyA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24oKTsKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgY29uZmlnLmdldFByb3BlcnRpZXMoKS5wdXQocnMuZ2V0U3RyaW5nKCJwcm9wZXJ0eV9uYW1lIiksCisgICAgICAgICAgICBycy5nZXRTdHJpbmcoInByb3BlcnR5X3ZhbHVlIikpOworICAgICAgfQorCisgICAgICBpZiAoY29uZmlnLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKS5zaXplKCkgPT0gMCkgeworICAgICAgICBjb25maWcgPSBudWxsOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHRhc2sgY29uZmlndXJhdGlvbiBmb3IgY29uZElkOiAiICsgY29uZElkCisgICAgICAgICAgICAgICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRDb25maWd1cmF0aW9uQnlDb25maWd1cmF0aW9uSWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb25maWc7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dUYXNrQnlJZAorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrQnlJZChTdHJpbmcgdGFza0lkKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgIFdvcmtmbG93VGFzayB0YXNrID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgZ2V0VGFza1NxbCA9ICJTRUxFQ1QgKiBGUk9NIHdvcmtmbG93X3Rhc2tzIFdIRVJFIHdvcmtmbG93X3Rhc2tfaWQgPSAiCisgICAgICAgICAgKyB0YXNrSWQ7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldFdvcmtmbG93VGFza0J5SWQ6IEV4ZWN1dGluZzogIiArIGdldFRhc2tTcWwpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldFRhc2tTcWwpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIC8vIGdldCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZQorICAgICAgICB0YXNrID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93VGFzayhycywgZmFsc2UpOworICAgICAgICB0YXNrLnNldENvbmRpdGlvbnMoZ2V0Q29uZGl0aW9uc0J5VGFza0lkKHRhc2suZ2V0VGFza0lkKCkpKTsKKyAgICAgICAgdGFzay5zZXRUYXNrQ29uZmlnKGdldENvbmZpZ3VyYXRpb25CeVRhc2tJZCh0YXNrLmdldFRhc2tJZCgpKSk7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgdGFzayBieSBpZC4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0V29ya2Zsb3dUYXNrQnlJZCB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworCisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjCisgICAqIGdldFdvcmtmbG93Q29uZGl0aW9uQnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uIGdldFdvcmtmbG93Q29uZGl0aW9uQnlJZChTdHJpbmcgY29uZGl0aW9uSWQpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgV29ya2Zsb3dDb25kaXRpb24gY29uZGl0aW9uID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgZ2V0Q29uZGl0aW9uc1NxbCA9ICJTRUxFQ1QgKiBGUk9NIHdvcmtmbG93X2NvbmRpdGlvbnMgV0hFUkUgd29ya2Zsb3dfY29uZGl0aW9uX2lkID0gIgorICAgICAgICAgICsgY29uZGl0aW9uSWQ7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImdldFdvcmtmbG93Q29uZGl0aW9uQnlJZDogRXhlY3V0aW5nOiAiCisgICAgICAgICAgKyBnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRDb25kaXRpb25zU3FsKTsKKworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAvLyBnZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5hbWUKKyAgICAgICAgY29uZGl0aW9uID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93Q29uZGl0aW9uKHJzLCBmYWxzZSk7CisgICAgICAgIGNvbmRpdGlvbi5zZXRDb25kQ29uZmlnKGdldENvbmZpZ3VyYXRpb25CeUNvbmRpdGlvbklkKGNvbmRpdGlvbklkKSk7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgY29uZGl0aW9uIGJ5IGlkLiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgIlVuYWJsZSB0byByb2xsYmFjayBnZXRXb3JrZmxvd0NvbmRpdGlvbkJ5SWQgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb25kaXRpb247CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0UmVnaXN0ZXJlZEV2ZW50cworICAgKiAoKQorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0UmVnaXN0ZXJlZEV2ZW50cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICBMaXN0IGV2ZW50cyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgU3RyaW5nIGdldEV2ZW50U3FsID0gIlNFTEVDVCBESVNUSU5DVCBldmVudF9uYW1lIEZST00gZXZlbnRfd29ya2Zsb3dfbWFwIE9SREVSIEJZIGV2ZW50X25hbWUgQVNDIjsKKworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0UmVnaXN0ZXJlZEV2ZW50czogRXhlY3V0aW5nOiAiICsgZ2V0RXZlbnRTcWwpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldEV2ZW50U3FsKTsKKyAgICAgIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAvLyBnZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5hbWUKKyAgICAgICAgU3RyaW5nIGV2ZW50ID0gRGJTdHJ1Y3RGYWN0b3J5LmdldEV2ZW50KHJzKTsKKyAgICAgICAgZXZlbnRzLmFkZChldmVudCk7CisgICAgICB9CisKKyAgICAgIGlmIChldmVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZXZlbnRzID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgcmVnaXN0ZXJlZCBldmVudHMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0UmVnaXN0ZXJlZEV2ZW50cyB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworCisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGV2ZW50czsKKyAgfQorICAKKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNhZGRUYXNrKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2spCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhZGRUYXNrKFdvcmtmbG93VGFzayB0YXNrKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gYWxsQ29uZGl0aW9ucyA9IGdldENvbmRpdGlvbnMoKTsKKyAgICAvLyBjaGVjayBpdHMgY29uZGl0aW9ucworICAgIGlmKHRhc2suZ2V0UHJlQ29uZGl0aW9ucygpICE9IG51bGwgJiYgdGFzay5nZXRQcmVDb25kaXRpb25zKCkuc2l6ZSgpID4gMCl7CisgICAgICBmb3IoV29ya2Zsb3dDb25kaXRpb24gY29uZDogdGFzay5nZXRQcmVDb25kaXRpb25zKCkpeworICAgICAgICBpZighdGhpcy5oYXNDb25kaXRpb25JZChhbGxDb25kaXRpb25zLCBjb25kLmdldENvbmRpdGlvbklkKCkpKXsKKyAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiUmVmZXJlbmNlIGluIG5ldyB0YXNrOiBbIit0YXNrLmdldFRhc2tOYW1lKCkrIl0gdG8gdW5kZWZpbmVkIHByZSBjb25kaXRpb24gaXRoIGlkOiBbIitjb25kLmdldENvbmRpdGlvbklkKCkrIl0iKTsgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IHRhc2suZ2V0UG9zdENvbmRpdGlvbnMoKSl7CisgICAgICAgIGlmKCF0aGlzLmhhc0NvbmRpdGlvbklkKGFsbENvbmRpdGlvbnMsIGNvbmQuZ2V0Q29uZGl0aW9uSWQoKSkpeworICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJSZWZlcmVuY2UgaW4gbmV3IHRhc2s6IFsiK3Rhc2suZ2V0VGFza05hbWUoKSsiXSB0byB1bmRlZmluZWQgcG9zdCBjb25kaXRpb24gaXRoIGlkOiBbIitjb25kLmdldENvbmRpdGlvbklkKCkrIl0iKTsgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfQorICAgIAorICAgIFN0cmluZyB0YXNrSWQgPSB0aGlzLmNvbW1pdFRhc2sobnVsbCwgdGFzayk7CisgICAgcmV0dXJuIHRhc2tJZDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNhZGRXb3JrZmxvdygKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgYWRkV29ya2Zsb3coV29ya2Zsb3cgd29ya2Zsb3cpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgdGhhdCBpdHMgdGFza3MgYXJlIGFsbCBwcmVzZW50CisgICAgaWYgKHdvcmtmbG93LmdldFRhc2tzKCkgPT0gbnVsbAorICAgICAgICB8fCAod29ya2Zsb3cuZ2V0VGFza3MoKSAhPSBudWxsICYmIHdvcmtmbG93LmdldFRhc2tzKCkuc2l6ZSgpID09IDApKSB7CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBkZWZpbmUgYSBuZXcgd29ya2xmb3c6IFsiCisgICAgICAgICAgKyB3b3JrZmxvdy5nZXROYW1lKCkgKyAiXSB3aXRoIG5vIHRhc2tzLiIpOworICAgIH0KKworICAgIExpc3Q8V29ya2Zsb3dUYXNrPiBhbGxUYXNrcyA9IHRoaXMuZ2V0VGFza3MoKTsKKworICAgIGZvciAoV29ya2Zsb3dUYXNrIHRhc2sgOiAoTGlzdDxXb3JrZmxvd1Rhc2s+KSB3b3JrZmxvdy5nZXRUYXNrcygpKSB7CisgICAgICBpZiAoIXRoaXMuaGFzVGFza0lkKGFsbFRhc2tzLCB0YXNrLmdldFRhc2tJZCgpKSkgeworICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiUmVmZXJlbmNlIGluIG5ldyB3b3JrZmxvdzogWyIKKyAgICAgICAgICAgICsgd29ya2Zsb3cuZ2V0TmFtZSgpICsgIl0gdG8gdW5kZWZpbmVkIHRhc2sgd2l0aCBpZDogWyIKKyAgICAgICAgICAgICsgdGFzay5nZXRUYXNrSWQoKSArICJdIik7CisgICAgICB9CisKKyAgICAgIC8vIGNoZWNrIGl0cyBjb25kaXRpb25zCisgICAgICBpZiAodGFzay5nZXRDb25kaXRpb25zKCkgIT0gbnVsbCAmJiB0YXNrLmdldENvbmRpdGlvbnMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMgPSB0aGlzLmdldENvbmRpdGlvbnNCeVRhc2tJZCh0YXNrCisgICAgICAgICAgICAuZ2V0VGFza0lkKCkpOworICAgICAgICBmb3IgKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgOiAoTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4pIHRhc2sKKyAgICAgICAgICAgIC5nZXRDb25kaXRpb25zKCkpIHsKKyAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29uZGl0aW9uSWQoY29uZGl0aW9ucywgY29uZC5nZXRDb25kaXRpb25JZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgd29ya2Zsb3c6IFsiCisgICAgICAgICAgICAgICAgKyB3b3JrZmxvdy5nZXROYW1lKCkgKyAiXSB0byB1bmRlZmluZWQgY29uZGl0aW9uIGl0aCBpZDogWyIKKyAgICAgICAgICAgICAgICArIGNvbmQuZ2V0Q29uZGl0aW9uSWQoKSArICJdIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIHdvcmtmbG93SWQgPSB0aGlzLmNvbW1pdFdvcmtmbG93KHdvcmtmbG93KTsKKyAgICByZXR1cm4gd29ya2Zsb3dJZDsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSMKKyAgICogZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBnZXRDb25kaXRpb25zQnlXb3JrZmxvd0lkKFN0cmluZyB3b3JrZmxvd0lkKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBnZXRDb25kaXRpb25zU3FsID0gIlNFTEVDVCB3b3JrZmxvd19jb25kaXRpb25zLiosIHdvcmtmbG93X2NvbmRpdGlvbl9tYXAuY29uZGl0aW9uX29yZGVyICIKKyAgICAgICAgICArICJGUk9NIHdvcmtmbG93X2NvbmRpdGlvbnMsIHdvcmtmbG93X2NvbmRpdGlvbl9tYXAgIgorICAgICAgICAgICsgIldIRVJFIHdvcmtmbG93X2NvbmRpdGlvbl9tYXAud29ya2Zsb3dfY29uZGl0aW9uX2lkID0gd29ya2Zsb3dfY29uZGl0aW9ucy53b3JrZmxvd19jb25kaXRpb25faWQgIgorICAgICAgICAgICsgIkFORCB3b3JrZmxvd19jb25kaXRpb25fbWFwLndvcmtmbG93X2lkID0gIgorICAgICAgICAgICsgd29ya2Zsb3dJZAorICAgICAgICAgICsgIiAiCisgICAgICAgICAgKyAiT1JERVIgQlkgd29ya2Zsb3dfY29uZGl0aW9uX21hcC5jb25kaXRpb25fb3JkZXIiOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJnZXRDb25kaXRpb25zQnlXb3JrZmxvd0lkOiBFeGVjdXRpbmc6ICIKKyAgICAgICAgICArIGdldENvbmRpdGlvbnNTcWwpOworICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KGdldENvbmRpdGlvbnNTcWwpOworICAgICAgY29uZGl0aW9ucyA9IG5ldyBWZWN0b3I8V29ya2Zsb3dDb25kaXRpb24+KCk7CisKKyAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgLy8gZ2V0IGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBuYW1lCisgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbiA9IERiU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd0NvbmRpdGlvbihycywKKyAgICAgICAgICAgIHRydWUpOworICAgICAgICBjb25kaXRpb25zLmFkZChjb25kaXRpb24pOworICAgICAgfQorCisgICAgICBpZiAoY29uZGl0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICBjb25kaXRpb25zID0gbnVsbDsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZygKKyAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyBjb25kaXRpb25zIGZvciB3b3JrZmxvdy4gTWVzc2FnZTogIgorICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZCB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworCisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbmRpdGlvbnM7CisgIH0KKyAgCisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0VGFza0J5SWQoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgV29ya2Zsb3dUYXNrIGdldFRhc2tCeUlkKFN0cmluZyB0YXNrSWQpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKworICAgICAgU3RyaW5nIGdldFRhc2tzU3FsID0gIlNFTEVDVCAqICIKKyAgICAgICAgICArICJGUk9NIHdvcmtmbG93X3Rhc2tzICIKKyAgICAgICAgICArICJXSEVSRSB3b3JrZmxvd190YXNrX2lkID0gIiArIHRhc2tJZDsKKworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0VGFza0J5SWQ6IEV4ZWN1dGluZzogIiArIGdldFRhc2tzU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRUYXNrc1NxbCk7CisgICAgIAorCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIC8vIGdldCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZQorCisgICAgICAgIHRhc2sgPSBEYlN0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dUYXNrKHJzLCB0cnVlKTsKKworICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICAgdGFzay5zZXRDb25kaXRpb25zKGdldENvbmRpdGlvbnNCeVRhc2tJZCh0YXNrLmdldFRhc2tJZCgpKSk7CisgICAgICAgICAgdGFzay5zZXRUYXNrQ29uZmlnKGdldENvbmZpZ3VyYXRpb25CeVRhc2tJZCh0YXNrLmdldFRhc2tJZCgpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXhjZXB0aW9uIGdldHRpbmcgdGFza3MgZm9yIHdvcmtmbG93LiBNZXNzYWdlOiAiCisgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0cnkgeworICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFRhc2tzQnlXb3JrZmxvd0lkIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0gZmluYWxseSB7CisKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGFzazsKKyAgfSAgICAKKworICBwcml2YXRlIFN0cmluZyBjb21taXRXb3JrZmxvdyhXb3JrZmxvdyB3b3JrZmxvdykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICBTdHJpbmcgd29ya2Zsb3dJZCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29ubiA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBzcWwgPSAiSU5TRVJUIElOVE8gd29ya2Zsb3dzICh3b3JrZmxvd19uYW1lKSBWQUxVRVMgKCciCisgICAgICAgICAgKyB3b3JrZmxvdy5nZXROYW1lKCkgKyAiJykiOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJjb21taXRXb3JrZmxvd1RvREI6IEV4ZWN1dGluZzogIiArIHNxbCk7CisgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOworCisgICAgICBzcWwgPSAiU0VMRUNUIE1BWCh3b3JrZmxvd19pZCkgQVMgbWF4X2lkIEZST00gd29ya2Zsb3dzIjsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIHdvcmtmbG93SWQgPSBTdHJpbmcudmFsdWVPZihycy5nZXRJbnQoIm1heF9pZCIpKTsKKyAgICAgIH0KKworICAgICAgd29ya2Zsb3cuc2V0SWQod29ya2Zsb3dJZCk7CisKKyAgICAgIC8vIGV2ZW50IHRvIHdvcmtmbG93IG1hcAorICAgICAgc3FsID0gIklOU0VSVCBJTlRPIGV2ZW50X3dvcmtmbG93X21hcCAod29ya2Zsb3dfaWQsIGV2ZW50X25hbWUpIFZBTFVFUyAoIgorICAgICAgICAgICsgd29ya2Zsb3dJZCArICIsJ3dvcmtmbG93LSIgKyB3b3JrZmxvd0lkICsgIicpIjsKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImNvbW1pdFdvcmtmbG93VG9EQjogRXhlY3V0aW5nOiAiICsgc3FsKTsKKyAgICAgIHN0YXRlbWVudC5leGVjdXRlKHNxbCk7CisgICAgICBjb25uLmNvbW1pdCgpOworCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBhZGRpbmcgd29ya2Zsb3cuIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB0cnkgeworICAgICAgICBjb25uLnJvbGxiYWNrKCk7CisgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgTE9HLmxvZygKKyAgICAgICAgICAgIExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgd29ya2Zsb3cgdHJhbnNhY3Rpb24uIE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3b3JrZmxvd0lkOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgY29tbWl0VGFzayhXb3JrZmxvdyB3b3JrZmxvdywgV29ya2Zsb3dUYXNrIHRhc2spCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgIFN0cmluZyB0YXNrSWQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBNQVgod29ya2Zsb3dfdGFza19pZCkgQVMgbWF4X2lkIEZST00gd29ya2Zsb3dfdGFza3MiOworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiY29tbWl0VGFza1RvREI6IEV4ZWN1dGluZzogIiArIHNxbCk7CisgICAgICBycyA9IHN0YXRlbWVudC5leGVjdXRlUXVlcnkoc3FsKTsKKworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICB0YXNrSWQgPSBTdHJpbmcudmFsdWVPZihycy5nZXRJbnQoIm1heF9pZCIpKTsKKyAgICAgIH0KKworICAgICAgc3luY2hyb25pemVkICh0YXNrSWQpIHsKKyAgICAgICAgdGFza0lkID0gU3RyaW5nLnZhbHVlT2YobmV3IEludGVnZXIodGFza0lkKSArIDEpOworICAgICAgfQorCisgICAgICB0YXNrLnNldFRhc2tJZCh0YXNrSWQpOworICAgICAgc3FsID0gIklOU0VSVCBJTlRPIHdvcmtmbG93X3Rhc2tzICh3b3JrZmxvd190YXNrX2lkLCB3b3JrZmxvd190YXNrX25hbWUsIHdvcmtmbG93X3Rhc2tfY2xhc3MpIFZBTFVFUyAoIgorICAgICAgICAgICsgdGFza0lkCisgICAgICAgICAgKyAiLCAnIgorICAgICAgICAgICsgdGFzay5nZXRUYXNrTmFtZSgpCisgICAgICAgICAgKyAiJywgJyIKKyAgICAgICAgICArIHRhc2suZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkgKyAiJykiOworCisgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJjb21taXRUYXNrVG9EQjogRXhlY3V0aW5nOiAiICsgc3FsKTsKKyAgICAgIHN0YXRlbWVudC5leGVjdXRlKHNxbCk7CisKKyAgICAgIGlmICh3b3JrZmxvdyAhPSBudWxsKSB7CisgICAgICAgIC8vIHRhc2sgdG8gd29ya2Zsb3cgbWFwCisgICAgICAgIHNxbCA9ICJJTlNFUlQgSU5UTyB3b3JrZmxvd190YXNrX21hcCAod29ya2Zsb3dfaWQsIHdvcmtmbG93X3Rhc2tfaWQsIHRhc2tfb3JkZXIpIFZBTFVFUyAoIgorICAgICAgICAgICAgKyB3b3JrZmxvdy5nZXRJZCgpICsgIiwiICsgdGFza0lkICsgIiwxKSI7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgImNvbW1pdFRhc2tUb0RCOiBFeGVjdXRpbmc6ICIgKyBzcWwpOworICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOworICAgICAgfQorCisgICAgICBjb25uLmNvbW1pdCgpOworCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBhZGRpbmcgdGFzay4gTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIlVuYWJsZSB0byByb2xsYmFjayB0YXNrIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICArIGUyLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKworICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBycyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY29ubi5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0YXNrSWQ7CisgIH0KKyAgCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBnZXRDb25kaXRpb25zKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisKKyAgICAgIFN0cmluZyBnZXRDb25kaXRpb25zU3FsID0gIlNFTEVDVCB3b3JrZmxvd19jb25kaXRpb25zLiogIgorICAgICAgICAgICsgIkZST00gd29ya2Zsb3dfY29uZGl0aW9ucyAiCisgICAgICAgICAgKyAiT1JERVIgQlkgY29uZGl0aW9uX2lkIjsKKworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0Q29uZGl0aW9uczogRXhlY3V0aW5nOiAiCisgICAgICAgICAgKyBnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRDb25kaXRpb25zU3FsKTsKKyAgICAgIGNvbmRpdGlvbnMgPSBuZXcgVmVjdG9yPFdvcmtmbG93Q29uZGl0aW9uPigpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIC8vIGdldCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZQorICAgICAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kaXRpb24gPSBEYlN0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dDb25kaXRpb24ocnMsCisgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQoY29uZGl0aW9uKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbmRpdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgY29uZGl0aW9ucyA9IG51bGw7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiBnZXR0aW5nIGNvbmRpdGlvbnMuIE1lc3NhZ2U6ICIKKyAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlMikgeworICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICJVbmFibGUgdG8gcm9sbGJhY2sgZ2V0Q29uZGl0aW9ucyB0cmFuc2FjdGlvbi4gTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworCisgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb25uLmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbmRpdGlvbnM7CisgIH0gIAorICAKKyAgcHJpdmF0ZSBMaXN0PFdvcmtmbG93VGFzaz4gZ2V0VGFza3MoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworCisgICAgTGlzdDxXb3JrZmxvd1Rhc2s+IHRhc2tzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworCisgICAgICBTdHJpbmcgZ2V0VGFza3NTcWwgPSAiU0VMRUNUIHdvcmtmbG93X3Rhc2tzLiosIHdvcmtmbG93X3Rhc2tfbWFwLnRhc2tfb3JkZXIgIgorICAgICAgICAgICsgIkZST00gd29ya2Zsb3dfdGFza3MgIiArICJPUkRFUiBCWSB3b3JrZmxvd190YXNrX21hcC50YXNrX29yZGVyIjsKKworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiZ2V0VGFza3M6IEV4ZWN1dGluZzogIiArIGdldFRhc2tzU3FsKTsKKyAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShnZXRUYXNrc1NxbCk7CisgICAgICB0YXNrcyA9IG5ldyBWZWN0b3I8V29ya2Zsb3dUYXNrPigpOworCisgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgIC8vIGdldCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZQorCisgICAgICAgIFdvcmtmbG93VGFzayB0YXNrID0gRGJTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93VGFzayhycywgdHJ1ZSk7CisKKyAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCkgeworICAgICAgICAgIHRhc2suc2V0Q29uZGl0aW9ucyhnZXRDb25kaXRpb25zQnlUYXNrSWQodGFzay5nZXRUYXNrSWQoKSkpOworICAgICAgICAgIHRhc2suc2V0VGFza0NvbmZpZyhnZXRDb25maWd1cmF0aW9uQnlUYXNrSWQodGFzay5nZXRUYXNrSWQoKSkpOworICAgICAgICAgIHRhc2tzLmFkZCh0YXNrKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGFza3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgdGFza3MgPSBudWxsOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHRhc2tzLiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUyKSB7CisgICAgICAgIExPRy5sb2coCisgICAgICAgICAgICBMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAiVW5hYmxlIHRvIHJvbGxiYWNrIGdldFRhc2tzIHRyYW5zYWN0aW9uLiBNZXNzYWdlOiAiCisgICAgICAgICAgICAgICAgKyBlMi5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0gZmluYWxseSB7CisKKyAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgcnMgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKworICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGFza3M7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaGFzVGFza0lkKExpc3Q8V29ya2Zsb3dUYXNrPiB0YXNrcywgU3RyaW5nIGlkKSB7CisgICAgaWYgKHRhc2tzID09IG51bGwgfHwgKHRhc2tzICE9IG51bGwgJiYgdGFza3Muc2l6ZSgpID09IDApKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChXb3JrZmxvd1Rhc2sgdGFzayA6IHRhc2tzKSB7CisgICAgICBpZiAodGFzay5nZXRUYXNrSWQoKS5lcXVhbHMoaWQpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBoYXNDb25kaXRpb25JZChMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBjb25kcywgU3RyaW5nIGlkKSB7CisgICAgaWYgKGNvbmRzID09IG51bGwgfHwgKGNvbmRzICE9IG51bGwgJiYgY29uZHMuc2l6ZSgpID09IDApKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChXb3JrZmxvd0NvbmRpdGlvbiBjb25kIDogY29uZHMpIHsKKyAgICAgIGlmIChjb25kLmdldENvbmRpdGlvbklkKCkuZXF1YWxzKGlkKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHZvaWQgaGFuZGxlR2xvYmFsV29ya2Zsb3dDb25kaXRpb25zKFdvcmtmbG93IHdvcmtmbG93KSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgaWYgKHdvcmtmbG93LmdldENvbmRpdGlvbnMoKSAhPSBudWxsICYmIHdvcmtmbG93LmdldENvbmRpdGlvbnMoKS5zaXplKCkgPiAwKSB7CisgICAgICBpZiAod29ya2Zsb3cuZ2V0VGFza3MoKSA9PSBudWxsCisgICAgICAgICAgfHwgKHdvcmtmbG93LmdldFRhc2tzKCkgIT0gbnVsbCAmJiB3b3JrZmxvdy5nZXRUYXNrcygpLnNpemUoKSA9PSAwKSkgeworICAgICAgICB3b3JrZmxvdy5zZXRUYXNrcyhuZXcgVmVjdG9yPFdvcmtmbG93VGFzaz4oKSk7CisgICAgICB9CisKKyAgICAgIHdvcmtmbG93LmdldFRhc2tzKCkuYWRkKAorICAgICAgICAgIDAsCisgICAgICAgICAgZ2V0R2xvYmFsV29ya2Zsb3dDb25kaXRpb25zVGFzayh3b3JrZmxvdywKKyAgICAgICAgICAgICAgd29ya2Zsb3cuZ2V0Q29uZGl0aW9ucygpKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Rhc2sgZ2V0R2xvYmFsV29ya2Zsb3dDb25kaXRpb25zVGFzayhXb3JrZmxvdyB3b3JrZmxvdywKKyAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICB0YXNrLnNldENvbmRpdGlvbnMoY29uZGl0aW9ucyk7CisgICAgdGFzay5zZXRUYXNrQ29uZmlnKG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCkpOworICAgIHRhc2suc2V0VGFza0lkKHdvcmtmbG93LmdldElkKCkgKyAiLWdsb2JhbC1jb25kaXRpb25zLWV2YWwiKTsKKyAgICB0YXNrLnNldFRhc2tOYW1lKHdvcmtmbG93LmdldE5hbWUoKSArICItZ2xvYmFsLWNvbmRpdGlvbnMtZXZhbCIpOworICAgIHRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKE5vT3BUYXNrLmNsYXNzLmdldE5hbWUoKSk7CisgICAgdGFzay5zZXRUYXNrSWQodGhpcy5jb21taXRUYXNrKHdvcmtmbG93LCB0YXNrKSk7CisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L0RhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L0RhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4YTRlYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvRGF0YVNvdXJjZVdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeTsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkNvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkRyaXZlck1hbmFnZXJDb25uZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGJjcC5Qb29sYWJsZUNvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLlBvb2xpbmdEYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5wb29sLmltcGwuR2VuZXJpY09iamVjdFBvb2w7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeX0gdGhhdCBjcmVhdGVzCisgKiB7QERhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnl9IGluc3RhbmNlcy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cworICAgICAgICBXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5IHsKKworICAgIC8qIG91ciBkYXRhIHNvdXJjZSAqLworICAgIHByaXZhdGUgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICAgKiA8L3A+LgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgamRiY1VybCA9IG51bGwsIHVzZXIgPSBudWxsLCBwYXNzID0gbnVsbCwgZHJpdmVyID0gbnVsbDsKKworICAgICAgICBqZGJjVXJsID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG8uZGF0YXNvdXJjZS5qZGJjLnVybCIpOworICAgICAgICB1c2VyID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG8uZGF0YXNvdXJjZS5qZGJjLnVzZXIiKTsKKyAgICAgICAgcGFzcyA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRhdGFzb3VyY2UuamRiYy5wYXNzIik7CisgICAgICAgIGRyaXZlciA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRhdGFzb3VyY2UuamRiYy5kcml2ZXIiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShkcml2ZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNhbm5vdCBsb2FkIGRyaXZlcjogIiArIGRyaXZlcik7CisgICAgICAgIH0KKworICAgICAgICBHZW5lcmljT2JqZWN0UG9vbCBjb25uZWN0aW9uUG9vbCA9IG5ldyBHZW5lcmljT2JqZWN0UG9vbChudWxsKTsKKyAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkgY29ubmVjdGlvbkZhY3RvcnkgPSBuZXcgRHJpdmVyTWFuYWdlckNvbm5lY3Rpb25GYWN0b3J5KAorICAgICAgICAgICAgICAgIGpkYmNVcmwsIHVzZXIsIHBhc3MpOworICAgICAgICBQb29sYWJsZUNvbm5lY3Rpb25GYWN0b3J5IHBvb2xhYmxlQ29ubmVjdGlvbkZhY3RvcnkgPSBuZXcgUG9vbGFibGVDb25uZWN0aW9uRmFjdG9yeSgKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uRmFjdG9yeSwgY29ubmVjdGlvblBvb2wsIG51bGwsIG51bGwsIGZhbHNlLCB0cnVlKTsKKworICAgICAgICBkYXRhU291cmNlID0gbmV3IFBvb2xpbmdEYXRhU291cmNlKGNvbm5lY3Rpb25Qb29sKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5I2NyZWF0ZVJlcG9zaXRvcnkoKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd1JlcG9zaXRvcnkgY3JlYXRlUmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5KGRhdGFTb3VyY2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9QYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9QYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YWNlYmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1BhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSw3NjggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5CcmFuY2hSZWRpcmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuTm9PcFRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLkdyYXBoOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5QYXJlbnRDaGlsZFdvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLlhtbFN0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMueG1sLlhNTFV0aWxzOworCisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIAorICogCisgKiBMb2FkcyBXb3JrZmxvdzIgKFdFbmdpbmUpIFN0eWxlIFdvcmtmbG93IFhNTCBmaWxlcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeSBpbXBsZW1lbnRzIFdvcmtmbG93UmVwb3NpdG9yeSB7CisKKyAgcHJpdmF0ZSBMaXN0PEZpbGU+IGZpbGVzOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgUGFyZW50Q2hpbGRXb3JrZmxvdz4gd29ya2Zsb3dzOworCisgIHByaXZhdGUgTGlzdDxHcmFwaD4gZ3JhcGhzOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgV29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnM7CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBXb3JrZmxvd1Rhc2s+IHRhc2tzOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0YWRhdGE+IGdsb2JhbENvbmZHcm91cHM7CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFBhcmVudENoaWxkV29ya2Zsb3c+PiBldmVudFdvcmtmbG93TWFwOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoUGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgUGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnkoTGlzdDxGaWxlPiBmaWxlcykKKyAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aGlzLmZpbGVzID0gZmlsZXM7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuaW5pdCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRXb3JrZmxvd0J5TmFtZQorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgV29ya2Zsb3cgZ2V0V29ya2Zsb3dCeU5hbWUoU3RyaW5nIHdvcmtmbG93TmFtZSkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKworICAgIGZvciAoV29ya2Zsb3cgdyA6IHRoaXMud29ya2Zsb3dzLnZhbHVlcygpKSB7CisgICAgICBpZiAody5nZXROYW1lKCkuZXF1YWxzKHdvcmtmbG93TmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHc7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dCeUlkCisgICAqIChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gd29ya2Zsb3dzLmdldCh3b3JrZmxvd0lkKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRXb3JrZmxvd3MoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBMaXN0PFdvcmtmbG93PiB3b3JrZmxvd3MgPSBuZXcgVmVjdG9yPFdvcmtmbG93PigpOworICAgIHdvcmtmbG93cy5hZGRBbGwodGhpcy53b3JrZmxvd3MudmFsdWVzKCkpOworICAgIHJldHVybiB3b3JrZmxvd3M7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0VGFza3NCeVdvcmtmbG93SWQKKyAgICogKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3QgZ2V0VGFza3NCeVdvcmtmbG93SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgV29ya2Zsb3cgdyA9IHRoaXMuZ2V0V29ya2Zsb3dCeUlkKHdvcmtmbG93SWQpOworICAgIHJldHVybiB3LmdldFRhc2tzKCk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjCisgICAqIGdldFRhc2tzQnlXb3JrZmxvd05hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdCBnZXRUYXNrc0J5V29ya2Zsb3dOYW1lKFN0cmluZyB3b3JrZmxvd05hbWUpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgV29ya2Zsb3cgdyA9IHRoaXMuZ2V0V29ya2Zsb3dCeU5hbWUod29ya2Zsb3dOYW1lKTsKKyAgICBpZiAodyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gdy5nZXRUYXNrcygpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFdvcmtmbG93c0ZvckV2ZW50CisgICAqIChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93c0ZvckV2ZW50KFN0cmluZyBldmVudE5hbWUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBMaXN0PFBhcmVudENoaWxkV29ya2Zsb3c+IHdvcmtmbG93cyA9IHRoaXMuZXZlbnRXb3JrZmxvd01hcC5nZXQoZXZlbnROYW1lKTsKKyAgICBpZiAod29ya2Zsb3dzICE9IG51bGwgJiYgd29ya2Zsb3dzLnNpemUoKSA+IDApIHsKKyAgICAgIHJldHVybiB3b3JrZmxvd3M7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjCisgICAqIGdldENvbmRpdGlvbnNCeVRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3QgZ2V0Q29uZGl0aW9uc0J5VGFza05hbWUoU3RyaW5nIHRhc2tOYW1lKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworCisgICAgZm9yIChXb3JrZmxvd1Rhc2sgdGFzayA6IHRoaXMudGFza3MudmFsdWVzKCkpIHsKKyAgICAgIGlmICh0YXNrLmdldFRhc2tOYW1lKCkuZXF1YWxzKHRhc2tOYW1lKSkgeworICAgICAgICByZXR1cm4gdGFzay5nZXRDb25kaXRpb25zKCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5IworICAgKiBnZXRDb25kaXRpb25zQnlUYXNrSWQoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdCBnZXRDb25kaXRpb25zQnlUYXNrSWQoU3RyaW5nIHRhc2tJZCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIGlmICh0aGlzLnRhc2tzLmdldCh0YXNrSWQpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB0aGlzLnRhc2tzLmdldCh0YXNrSWQpLmdldENvbmRpdGlvbnMoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSMKKyAgICogZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKFN0cmluZyB0YXNrSWQpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNvbnZlcnRUb1Rhc2tDb25maWd1cmF0aW9uKHRoaXMuZ2xvYmFsQ29uZkdyb3Vwcy5nZXQodGFza0lkKSk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dUYXNrQnlJZAorICAgKiAoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgV29ya2Zsb3dUYXNrIGdldFdvcmtmbG93VGFza0J5SWQoU3RyaW5nIHRhc2tJZCkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdGhpcy50YXNrcy5nZXQodGFza0lkKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSMKKyAgICogZ2V0V29ya2Zsb3dDb25kaXRpb25CeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uIGdldFdvcmtmbG93Q29uZGl0aW9uQnlJZChTdHJpbmcgY29uZGl0aW9uSWQpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucy5nZXQoY29uZGl0aW9uSWQpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFJlZ2lzdGVyZWRFdmVudHMKKyAgICogKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdCBnZXRSZWdpc3RlcmVkRXZlbnRzKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHRoaXMuZXZlbnRXb3JrZmxvd01hcC5rZXlTZXQoKS50b0FycmF5KCkpOworICB9CisgIAorICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNhZGRUYXNrKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2spCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhZGRUYXNrKFdvcmtmbG93VGFzayB0YXNrKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgaXRzIGNvbmRpdGlvbnMKKyAgICBpZih0YXNrLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsICYmIHRhc2suZ2V0UHJlQ29uZGl0aW9ucygpLnNpemUoKSA+IDApeworICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IHRhc2suZ2V0UHJlQ29uZGl0aW9ucygpKXsKKyAgICAgICAgaWYoIXRoaXMuY29uZGl0aW9ucy5jb250YWluc0tleShjb25kLmdldENvbmRpdGlvbklkKCkpKXsKKyAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiUmVmZXJlbmNlIGluIG5ldyB0YXNrOiBbIit0YXNrLmdldFRhc2tOYW1lKCkrIl0gdG8gdW5kZWZpbmVkIHByZSBjb25kaXRpb24gaXRoIGlkOiBbIitjb25kLmdldENvbmRpdGlvbklkKCkrIl0iKTsgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IHRhc2suZ2V0UG9zdENvbmRpdGlvbnMoKSl7CisgICAgICAgIGlmKCF0aGlzLmNvbmRpdGlvbnMuY29udGFpbnNLZXkoY29uZC5nZXRDb25kaXRpb25JZCgpKSl7CisgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgdGFzazogWyIrdGFzay5nZXRUYXNrTmFtZSgpKyJdIHRvIHVuZGVmaW5lZCBwb3N0IGNvbmRpdGlvbiBpdGggaWQ6IFsiK2NvbmQuZ2V0Q29uZGl0aW9uSWQoKSsiXSIpOyAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgICBTdHJpbmcgdGFza0lkID0gdGFzay5nZXRUYXNrSWQoKSAhPSBudWxsID8gCisgICAgICAgIHRhc2suZ2V0VGFza0lkKCk6VVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgIHRoaXMudGFza3MucHV0KHRhc2tJZCwgdGFzayk7CisgICAgICByZXR1cm4gdGFza0lkOworICB9ICAKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjYWRkV29ya2Zsb3coCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFkZFdvcmtmbG93KFdvcmtmbG93IHdvcmtmbG93KSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgLy8gZmlyc3QgY2hlY2sgdG8gc2VlIHRoYXQgaXRzIHRhc2tzIGFyZSBhbGwgcHJlc2VudAorICAgIGlmICh3b3JrZmxvdy5nZXRUYXNrcygpID09IG51bGwKKyAgICAgICAgfHwgKHdvcmtmbG93LmdldFRhc2tzKCkgIT0gbnVsbCAmJiB3b3JrZmxvdy5nZXRUYXNrcygpLnNpemUoKSA9PSAwKSkgeworICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIkF0dGVtcHQgdG8gZGVmaW5lIGEgbmV3IHdvcmtsZm93OiBbIgorICAgICAgICAgICsgd29ya2Zsb3cuZ2V0TmFtZSgpICsgIl0gd2l0aCBubyB0YXNrcy4iKTsKKyAgICB9CisKKyAgICBmb3IgKFdvcmtmbG93VGFzayB0YXNrIDogKExpc3Q8V29ya2Zsb3dUYXNrPikgd29ya2Zsb3cuZ2V0VGFza3MoKSkgeworICAgICAgaWYgKCF0aGlzLnRhc2tzLmNvbnRhaW5zS2V5KHRhc2suZ2V0VGFza0lkKCkpKSB7CisgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJSZWZlcmVuY2UgaW4gbmV3IHdvcmtmbG93OiBbIgorICAgICAgICAgICAgKyB3b3JrZmxvdy5nZXROYW1lKCkgKyAiXSB0byB1bmRlZmluZWQgdGFzayB3aXRoIGlkOiBbIgorICAgICAgICAgICAgKyB0YXNrLmdldFRhc2tJZCgpICsgIl0iKTsKKyAgICAgIH0KKworICAgICAgLy8gY2hlY2sgaXRzIGNvbmRpdGlvbnMKKyAgICAgIGlmICh0YXNrLmdldENvbmRpdGlvbnMoKSAhPSBudWxsICYmIHRhc2suZ2V0Q29uZGl0aW9ucygpLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChXb3JrZmxvd0NvbmRpdGlvbiBjb25kIDogKExpc3Q8V29ya2Zsb3dDb25kaXRpb24+KSB0YXNrCisgICAgICAgICAgICAuZ2V0Q29uZGl0aW9ucygpKSB7CisgICAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMuY29udGFpbnNLZXkoY29uZC5nZXRDb25kaXRpb25JZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgd29ya2Zsb3c6IFsiCisgICAgICAgICAgICAgICAgKyB3b3JrZmxvdy5nZXROYW1lKCkgKyAiXSB0byB1bmRlZmluZWQgY29uZGl0aW9uIGl0aCBpZDogWyIKKyAgICAgICAgICAgICAgICArIGNvbmQuZ2V0Q29uZGl0aW9uSWQoKSArICJdIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gcmVjYXN0IGl0IGFzIGEgcGFyZW50L2NoaWxkIHdvcmtmbG93CisgICAgU3RyaW5nIHdvcmtmbG93SWQgPSB3b3JrZmxvdy5nZXRJZCgpOworCWlmICh3b3JrZmxvd0lkID09IG51bGwKKwkJCXx8ICh3b3JrZmxvd0lkICE9IG51bGwgJiYgd29ya2Zsb3dJZC5lcXVhbHMoIiIpKSkgeworCQkvLyBnZW5lcmF0ZSBpdHMgSUQKKwkJd29ya2Zsb3dJZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCXdvcmtmbG93LnNldElkKHdvcmtmbG93SWQpOworCX0KKyAgICAgIAorICAgIFBhcmVudENoaWxkV29ya2Zsb3cgcGN3ID0gbnVsbDsKKyAgICBpZih3b3JrZmxvdyBpbnN0YW5jZW9mIFBhcmVudENoaWxkV29ya2Zsb3cpIHsKKyAgICAgICAgcGN3ID0gKFBhcmVudENoaWxkV29ya2Zsb3cpIHdvcmtmbG93OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgR3JhcGggZ3JhcGggPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgZ3JhcGguc2V0RXhlY3V0aW9uVHlwZSgic2VxdWVudGlhbCIpOworICAgICAgICBwY3cgPSBuZXcgUGFyZW50Q2hpbGRXb3JrZmxvdyhncmFwaCk7CisgICAgICAgIHBjdy5zZXROYW1lKHdvcmtmbG93LmdldE5hbWUoKSk7CisgICAgICAgIHBjdy5zZXRUYXNrcyh3b3JrZmxvdy5nZXRUYXNrcygpKTsKKyAgICAgICAgcGN3LnNldElkKHdvcmtmbG93LmdldElkKCkpOworICAgIH0KKyAgICB0aGlzLndvcmtmbG93cy5wdXQocGN3LmdldElkKCksIHBjdyk7CisgICAgdGhpcy5ldmVudFdvcmtmbG93TWFwLnB1dCh3b3JrZmxvd0lkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBjdykpOworCisgICAgLy8gZ2VuZXJhdGUgaXRzIElECisgICAgcmV0dXJuIHdvcmtmbG93SWQ7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjCisgICAqIGdldENvbmRpdGlvbnNCeVdvcmtmbG93SWQoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZChTdHJpbmcgd29ya2Zsb3dJZCkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICBpZiAoIXRoaXMud29ya2Zsb3dzLmNvbnRhaW5zS2V5KHdvcmtmbG93SWQpKQorICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oCisgICAgICAgICAgIkF0dGVtcHQgdG8gb2J0YWluIGNvbmRpdGlvbnMgZm9yIGEgd29ya2Zsb3c6ICIgKyAiWyIgKyB3b3JrZmxvd0lkCisgICAgICAgICAgICAgICsgIl0gdGhhdCBkb2VzIG5vdCBleGlzdCEiKTsKKworICAgIHJldHVybiB0aGlzLndvcmtmbG93cy5nZXQod29ya2Zsb3dJZCkuZ2V0Q29uZGl0aW9ucygpOworICB9CisgIAorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFRhc2tCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFdvcmtmbG93VGFzayBnZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRoaXMudGFza3MuZ2V0KHRhc2tJZCk7CisgIH0gIAorCisgIHByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIHRoaXMud29ya2Zsb3dzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJlbnRDaGlsZFdvcmtmbG93PigpOworICAgIHRoaXMudGFza3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdvcmtmbG93VGFzaz4oKTsKKyAgICB0aGlzLmNvbmRpdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdvcmtmbG93Q29uZGl0aW9uPigpOworICAgIHRoaXMuZXZlbnRXb3JrZmxvd01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQYXJlbnRDaGlsZFdvcmtmbG93Pj4oKTsKKyAgICB0aGlzLmdsb2JhbENvbmZHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGFkYXRhPigpOworICAgIHRoaXMuZ3JhcGhzID0gbmV3IFZlY3RvcjxHcmFwaD4oKTsKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgIExpc3Q8RWxlbWVudD4gcm9vdEVsZW1lbnRzID0gbmV3IFZlY3RvcjxFbGVtZW50PigpOworICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykKKyAgICAgICAgcm9vdEVsZW1lbnRzLmFkZChwYXJzZXIucGFyc2UoZmlsZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOworICAgICAgZm9yIChFbGVtZW50IHJvb3QgOiByb290RWxlbWVudHMpIHsKKyAgICAgICAgTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24ocm9vdEVsZW1lbnRzLCByb290LCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgIGxvYWRUYXNrQW5kQ29uZGl0aW9uRGVmaW5pdGlvbnMocm9vdEVsZW1lbnRzLCByb290LCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgIGxvYWRHcmFwaHMocm9vdEVsZW1lbnRzLCByb290LCBuZXcgR3JhcGgoKSwgc3RhdGljTWV0YWRhdGEpOworICAgICAgICBjb21wdXRlRXZlbnRzKCk7CisgICAgICAgIGNvbXB1dGVXb3JrZmxvd0NvbmRpdGlvbnMoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY29tcHV0ZVdvcmtmbG93Q29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIGlmICh0aGlzLndvcmtmbG93cyAhPSBudWxsICYmIHRoaXMud29ya2Zsb3dzLnZhbHVlcygpICE9IG51bGwKKyAgICAgICAgJiYgdGhpcy53b3JrZmxvd3MudmFsdWVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChQYXJlbnRDaGlsZFdvcmtmbG93IHcgOiB0aGlzLndvcmtmbG93cy52YWx1ZXMoKSkgeworICAgICAgICBpZiAody5nZXRDb25kaXRpb25zKCkgIT0gbnVsbCAmJiB3LmdldENvbmRpdGlvbnMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgdy5nZXRUYXNrcygpLmFkZCgwLAorICAgICAgICAgICAgICBnZXRHbG9iYWxXb3JrZmxvd0NvbmRpdGlvbnNUYXNrKHcuZ2V0TmFtZSgpLCB3LmdldElkKCksIHcuZ2V0Q29uZGl0aW9ucygpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY29tcHV0ZUV2ZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UGFyZW50Q2hpbGRXb3JrZmxvdz4gd29ya2Zsb3dzID0gbmV3IFZlY3RvcjxQYXJlbnRDaGlsZFdvcmtmbG93PigpOworICAgIGZvciAoUGFyZW50Q2hpbGRXb3JrZmxvdyB3IDogdGhpcy53b3JrZmxvd3MudmFsdWVzKCkpIHsKKyAgICAgIHdvcmtmbG93cy5hZGQodyk7CisKKyAgICB9CisgICAgZm9yIChQYXJlbnRDaGlsZFdvcmtmbG93IHdvcmtmbG93IDogd29ya2Zsb3dzKSB7CisKKyAgICAgIC8vIGV2ZW50IGZvciBlYWNoIHdvcmtmbG93IGlkCisgICAgICBMaXN0PFBhcmVudENoaWxkV29ya2Zsb3c+IHdMaXN0ID0gbmV3IFZlY3RvcjxQYXJlbnRDaGlsZFdvcmtmbG93PigpOworICAgICAgd0xpc3QuYWRkKHdvcmtmbG93KTsKKyAgICAgIHRoaXMuZXZlbnRXb3JrZmxvd01hcC5wdXQod29ya2Zsb3cuZ2V0SWQoKSwgd0xpc3QpOworCisgICAgICAvLyBjbGVhciBpdHMgdGFza3MsIHdlIGFyZSBnb2luZyB0byByZS1hZGQgdGhlbSBiYWNrCisgICAgICB3b3JrZmxvdy5nZXRUYXNrcygpLmNsZWFyKCk7CisgICAgICBMaXN0PEdyYXBoPiBjaGlsZHJlbiA9IHdvcmtmbG93LmdldEdyYXBoKCkuZ2V0Q2hpbGRyZW4oKTsKKyAgICAgIGlmICh3b3JrZmxvdy5nZXRHcmFwaCgpLmdldEV4ZWN1dGlvblR5cGUoKS5lcXVhbHMoInNlcXVlbnRpYWwiKSkgeworICAgICAgICBmb3IgKEdyYXBoIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICBpZiAoY2hpbGQuZ2V0V29ya2Zsb3coKSAhPSBudWxsKSB7CisgICAgICAgICAgICB3b3JrZmxvdy5nZXRUYXNrcygpLmFkZCgKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVJlZGlyZWN0b3IoY2hpbGQuZ2V0V29ya2Zsb3coKS5nZXRJZCgpKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRUYXNrKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgd29ya2Zsb3cuZ2V0VGFza3MoKS5hZGQoY2hpbGQuZ2V0VGFzaygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAod29ya2Zsb3cuZ2V0R3JhcGgoKS5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJwYXJhbGxlbCIpKSB7CisgICAgICAgIC8vIGNsZWFyIGl0IGFzIGEgd29ya2Zsb3cgZnJvbSB0aGUgbGlzdAorICAgICAgICAvLyB0byBiZWdpbiB3aXRoCisgICAgICAgIHRoaXMuZXZlbnRXb3JrZmxvd01hcC5nZXQod29ya2Zsb3cuZ2V0SWQoKSkuY2xlYXIoKTsKKyAgICAgICAgdGhpcy53b3JrZmxvd3MucmVtb3ZlKHdvcmtmbG93LmdldElkKCkpOworICAgICAgICBmb3IgKEdyYXBoIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICBpZiAoY2hpbGQuZ2V0V29ya2Zsb3coKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBhZGQgY2hpbGQgd29ya2Zsb3cgdG8gdGhlIGV2ZW50IGtpY2tvZmYgZm9yIHRoaXMgaWQKKyAgICAgICAgICAgIHRoaXMuZXZlbnRXb3JrZmxvd01hcC5nZXQod29ya2Zsb3cuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAuYWRkKGNoaWxkLmdldFdvcmtmbG93KCkpOworICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0VGFzaygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGFkZCBhIG5ldyBkeW5hbWljIHdvcmtmbG93CisgICAgICAgICAgICAvLyB3aXRoIGp1c3QgdGhpcyB0YXNrCisgICAgICAgICAgICBQYXJlbnRDaGlsZFdvcmtmbG93IHcgPSBnZXREeW5hbWljV29ya2Zsb3coY2hpbGQuZ2V0VGFzaygpKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnRXb3JrZmxvd01hcC5nZXQod29ya2Zsb3cuZ2V0SWQoKSkuYWRkKHcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGV4ZWN1dGlvbiB0eXBlOiBbIgorICAgICAgICAgICAgKyB3b3JrZmxvdy5nZXRHcmFwaCgpLmdldEV4ZWN1dGlvblR5cGUoKSArICJdIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWRUYXNrQW5kQ29uZGl0aW9uRGVmaW5pdGlvbnMoTGlzdDxFbGVtZW50PiByb290RWxlbWVudHMsCisgICAgICBFbGVtZW50IHJvb3RFbGVtLCBNZXRhZGF0YSBzdGF0aWNNZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBMaXN0PEVsZW1lbnQ+IGNvbmRpdGlvbkJsb2NrcyA9IHRoaXMuZ2V0Q2hpbGRyZW5CeVRhZ05hbWUocm9vdEVsZW0sCisgICAgICAgICJjb25kaXRpb24iKTsKKyAgICBMaXN0PEVsZW1lbnQ+IHRhc2tCbG9ja3MgPSB0aGlzLmdldENoaWxkcmVuQnlUYWdOYW1lKHJvb3RFbGVtLCAidGFzayIpOworCisgICAgaWYgKGNvbmRpdGlvbkJsb2NrcyAhPSBudWxsICYmIGNvbmRpdGlvbkJsb2Nrcy5zaXplKCkgPiAwKSB7CisgICAgICBMT0cubG9nKExldmVsLkZJTkVSLCAiTG9hZGluZzogWyIgKyBjb25kaXRpb25CbG9ja3Muc2l6ZSgpCisgICAgICAgICAgKyAiXSBjb25kaXRpb25zIGZyb206IFsiCisgICAgICAgICAgKyByb290RWxlbS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRVUkkoKSArICJdIik7CisKKyAgICAgIGZvciAoRWxlbWVudCBjb25kRWxlbSA6IGNvbmRpdGlvbkJsb2NrcykgeworICAgICAgICBsb2FkR3JhcGhzKHJvb3RFbGVtZW50cywgY29uZEVsZW0sIG5ldyBHcmFwaCgpLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAodGFza0Jsb2NrcyAhPSBudWxsICYmIHRhc2tCbG9ja3Muc2l6ZSgpID4gMCkgeworICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FUiwgIkxvYWRpbmc6IFsiICsgdGFza0Jsb2Nrcy5zaXplKCkgKyAiXSB0YXNrcyBmcm9tOiBbIgorICAgICAgICAgICsgcm9vdEVsZW0uZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50VVJJKCkgKyAiXSIpOworICAgICAgZm9yIChFbGVtZW50IHRhc2tFbGVtIDogdGFza0Jsb2NrcykgeworICAgICAgICBsb2FkR3JhcGhzKHJvb3RFbGVtZW50cywgdGFza0VsZW0sIG5ldyBHcmFwaCgpLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWRHcmFwaHMoTGlzdDxFbGVtZW50PiByb290RWxlbWVudHMsIEVsZW1lbnQgZ3JhcGhFbGVtLAorICAgICAgR3JhcGggcGFyZW50LCBNZXRhZGF0YSBzdGF0aWNNZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBMT0cubG9nKExldmVsLkZJTkVTVCwgIlZpc2l0aW5nIG5vZGU6IFsiICsgZ3JhcGhFbGVtLmdldE5vZGVOYW1lKCkgKyAiXSIpOworICAgIGxvYWRDb25maWd1cmF0aW9uKHJvb3RFbGVtZW50cywgZ3JhcGhFbGVtLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgR3JhcGggZ3JhcGggPSAhZ3JhcGhFbGVtLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJjYXM6d29ya2Zsb3dzIikgPyBuZXcgR3JhcGgoCisgICAgICAgIGdyYXBoRWxlbSwgc3RhdGljTWV0YWRhdGEpIDogbmV3IEdyYXBoKCk7CisgICAgcGFyZW50LmdldENoaWxkcmVuKCkuYWRkKGdyYXBoKTsKKyAgICBncmFwaC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICBpZiAoIWdyYXBoRWxlbS5nZXROb2RlTmFtZSgpLmVxdWFscygiY2FzOndvcmtmbG93cyIpKSB7CisgICAgICBleHBhbmRXb3JrZmxvd1Rhc2tzQW5kQ29uZGl0aW9ucyhncmFwaCwgc3RhdGljTWV0YWRhdGEpOworICAgIH0KKworICAgIGZvciAoU3RyaW5nIHByb2Nlc3NvclR5cGUgOiBHcmFwaC5wcm9jZXNzb3JJZHMpIHsKKyAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIlNjYW5uaW5nIGZvcjogWyIgKyBwcm9jZXNzb3JUeXBlICsgIl0gbm9kZXMiKTsKKyAgICAgIExpc3Q8RWxlbWVudD4gcHJvY1R5cGVCbG9ja3MgPSB0aGlzLmdldENoaWxkcmVuQnlUYWdOYW1lKGdyYXBoRWxlbSwKKyAgICAgICAgICBwcm9jZXNzb3JUeXBlKTsKKyAgICAgIGlmIChwcm9jVHlwZUJsb2NrcyAhPSBudWxsICYmIHByb2NUeXBlQmxvY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiRm91bmQ6IFsiICsgcHJvY1R5cGVCbG9ja3Muc2l6ZSgpICsgIl0gWyIKKyAgICAgICAgICAgICsgcHJvY2Vzc29yVHlwZSArICJdIHByb2Nlc3NvciB0eXBlcyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NUeXBlQmxvY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgbG9hZEdyYXBocyhyb290RWxlbWVudHMsIHByb2NUeXBlQmxvY2tzLmdldChpKSwgZ3JhcGgsIHN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByb2Nlc3NvclR5cGUuZXF1YWxzKCJjb25kaXRpb24iKSkgeworICAgICAgICAgIEVsZW1lbnQgY29uZGl0aW9uc0VsZW0gPSBYTUxVdGlscy5nZXRGaXJzdEVsZW1lbnQoImNvbmRpdGlvbnMiLAorICAgICAgICAgICAgICBncmFwaEVsZW0pOworICAgICAgICAgIGlmIChjb25kaXRpb25zRWxlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IHByb2NUeXBlQmxvY2tOb2RlcyA9IHRoaXMuZ2V0Q2hpbGRyZW5CeVRhZ05hbWUoCisgICAgICAgICAgICAgICAgY29uZGl0aW9uc0VsZW0sICJjb25kaXRpb24iKTsKKyAgICAgICAgICAgIGlmIChwcm9jVHlwZUJsb2NrTm9kZXMgIT0gbnVsbCAmJiBwcm9jVHlwZUJsb2NrTm9kZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICBMT0cubG9nKExldmVsLkZJTkUsICJGb3VuZDogWyIgKyBwcm9jVHlwZUJsb2NrTm9kZXMuc2l6ZSgpCisgICAgICAgICAgICAgICAgICArICJdIGxpbmtlZCBjb25kaXRpb24gZGVmaW5pdGlvbnMiKTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jVHlwZUJsb2NrTm9kZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsb2FkR3JhcGhzKHJvb3RFbGVtZW50cywgcHJvY1R5cGVCbG9ja05vZGVzLmdldChpKSwgZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChncmFwaEVsZW0uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImNhczp3b3JrZmxvd3MiKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2FkQ29uZmlndXJhdGlvbihMaXN0PEVsZW1lbnQ+IHJvb3RFbGVtZW50cywgTm9kZSB3b3JrZmxvd05vZGUsCisgICAgICBNZXRhZGF0YSBzdGF0aWNNZXRhZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSB3b3JrZmxvd05vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgTm9kZSBjdXJDaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisKKyAgICAgIGlmIChjdXJDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygiY29uZmlndXJhdGlvbiIpKSB7CisgICAgICAgIE1ldGFkYXRhIGN1ck1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIGlmICghKChFbGVtZW50KSBjdXJDaGlsZCkuZ2V0QXR0cmlidXRlKCJleHRlbmRzIikuZXF1YWxzKCIiKSkKKyAgICAgICAgICBmb3IgKFN0cmluZyBleHRlbnNpb24gOiAoKEVsZW1lbnQpIGN1ckNoaWxkKS5nZXRBdHRyaWJ1dGUoImV4dGVuZHMiKQorICAgICAgICAgICAgICAuc3BsaXQoIiwiKSkKKyAgICAgICAgICAgIGN1ck1ldGFkYXRhCisgICAgICAgICAgICAgICAgLnJlcGxhY2VNZXRhZGF0YShnbG9iYWxDb25mR3JvdXBzLmNvbnRhaW5zS2V5KGV4dGVuc2lvbikgPyBnbG9iYWxDb25mR3JvdXBzCisgICAgICAgICAgICAgICAgICAgIC5nZXQoZXh0ZW5zaW9uKSA6IHRoaXMubG9hZENvbmZHcm91cChyb290RWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgZ2xvYmFsQ29uZkdyb3VwcykpOworICAgICAgICBjdXJNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEoWG1sU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25Bc01ldGFkYXRhKGN1ckNoaWxkKSk7CisgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyTWFwID0gY3VyQ2hpbGQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBTdHJpbmcgY29uZmlnTmFtZSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJNYXAuaXRlbShqKTsKKyAgICAgICAgICBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKCJuYW1lIikpIHsKKyAgICAgICAgICAgIGNvbmZpZ05hbWUgPSBhdHRyLmdldFZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZ05hbWUgPT0gbnVsbCB8fCAoY29uZmlnTmFtZSAhPSBudWxsICYmIGNvbmZpZ05hbWUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICBOYW1lZE5vZGVNYXAgd29ya2Zsb3dOb2RlQXR0cnMgPSB3b3JrZmxvd05vZGUuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd29ya2Zsb3dOb2RlQXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIHdvcmtmbG93Tm9kZUF0dHJzLml0ZW0oaik7CisgICAgICAgICAgICBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKCJpZCIpKSB7CisgICAgICAgICAgICAgIGNvbmZpZ05hbWUgPSBhdHRyLmdldFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5nbG9iYWxDb25mR3JvdXBzLnB1dChjb25maWdOYW1lLCBjdXJNZXRhZGF0YSk7CisgICAgICAgIHN0YXRpY01ldGFkYXRhLnJlcGxhY2VNZXRhZGF0YShjdXJNZXRhZGF0YSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBsb2FkQ29uZkdyb3VwKExpc3Q8RWxlbWVudD4gcm9vdEVsZW1lbnRzLCBTdHJpbmcgZ3JvdXAsCisgICAgICBNYXA8U3RyaW5nLCBNZXRhZGF0YT4gZ2xvYmFsQ29uZkdyb3VwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChmaW5hbCBFbGVtZW50IHJvb3RFbGVtZW50IDogcm9vdEVsZW1lbnRzKSB7CisgICAgICBOb2RlTGlzdCBub2RlcyA9IHJvb3RFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb25maWd1cmF0aW9uIik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoZ3JvdXApKQorICAgICAgICAgIHJldHVybiBYbWxTdHJ1Y3RGYWN0b3J5LmdldENvbmZpZ3VyYXRpb25Bc01ldGFkYXRhKG5vZGUpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIGdyb3VwICciICsgZ3JvdXAgKyAiJyBub3QgZGVmaW5lZCEiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBleHBhbmRXb3JrZmxvd1Rhc2tzQW5kQ29uZGl0aW9ucyhHcmFwaCBncmFwaCwKKyAgICAgIE1ldGFkYXRhIHN0YXRpY01ldGFkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAoZ3JhcGguZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygid29ya2Zsb3ciKQorICAgICAgICB8fCBncmFwaC5nZXRFeGVjdXRpb25UeXBlKCkuZXF1YWxzKCJzZXF1ZW50aWFsIikKKyAgICAgICAgfHwgZ3JhcGguZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygicGFyYWxsZWwiKSkgeworICAgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KGdyYXBoKTsKKyAgICAgIHdvcmtmbG93LnNldElkKGdyYXBoLmdldE1vZGVsSWQoKSk7CisgICAgICB3b3JrZmxvdy5zZXROYW1lKGdyYXBoLmdldE1vZGVsTmFtZSgpKTsKKyAgICAgIGdyYXBoLnNldFdvcmtmbG93KHdvcmtmbG93KTsKKyAgICAgIGlmIChncmFwaC5nZXRQYXJlbnQoKSA9PSBudWxsCisgICAgICAgICAgfHwgKGdyYXBoLmdldFBhcmVudCgpICE9IG51bGwgJiYgZ3JhcGguZ2V0UGFyZW50KCkuZ2V0V29ya2Zsb3coKSA9PSBudWxsKSkgeworICAgICAgICBMT0cubG9nKExldmVsLkZJTkVTVCwgIldvcmtmbG93OiBbIiArIGdyYXBoLmdldE1vZGVsSWQoKQorICAgICAgICAgICAgKyAiXSBoYXMgbm8gcGFyZW50OiBpdCdzIGEgdG9wLWxldmVsIHdvcmtmbG93Iik7CisgICAgICB9CisKKyAgICAgIGlmICh3b3JrZmxvdy5nZXROYW1lKCkgPT0gbnVsbAorICAgICAgICAgIHx8ICh3b3JrZmxvdy5nZXROYW1lKCkgIT0gbnVsbCAmJiB3b3JrZmxvdy5nZXROYW1lKCkuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgd29ya2Zsb3cuc2V0TmFtZShncmFwaC5nZXRFeGVjdXRpb25UeXBlKCkgKyAiLSIgKyB3b3JrZmxvdy5nZXRJZCgpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMud29ya2Zsb3dzLnB1dChncmFwaC5nZXRNb2RlbElkKCksIHdvcmtmbG93KTsKKyAgICB9IGVsc2UgaWYgKGdyYXBoLmdldEV4ZWN1dGlvblR5cGUoKS5lcXVhbHMoImNvbmRpdGlvbiIpKSB7CisgICAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kID0gbnVsbDsKKworICAgICAgaWYgKGdyYXBoLmdldE1vZGVsSWRSZWYoKSAhPSBudWxsICYmICFncmFwaC5nZXRNb2RlbElkUmVmKCkuZXF1YWxzKCIiKSkgeworICAgICAgICBjb25kID0gdGhpcy5jb25kaXRpb25zLmdldChncmFwaC5nZXRNb2RlbElkUmVmKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uZCA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbigpOworICAgICAgICBjb25kLnNldENvbmRpdGlvbklkKGdyYXBoLmdldE1vZGVsSWQoKSk7CisgICAgICAgIGNvbmQuc2V0Q29uZGl0aW9uTmFtZShncmFwaC5nZXRNb2RlbE5hbWUoKSk7CisgICAgICAgIGNvbmQuc2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoZ3JhcGguZ2V0Q2xhenooKSk7CisgICAgICAgIGNvbmQuc2V0VGltZW91dFNlY29uZHMoZ3JhcGguZ2V0VGltZW91dCgpKTsKKyAgICAgICAgY29uZC5zZXRPcHRpb25hbChncmFwaC5pc09wdGlvbmFsKCkpOworICAgICAgICBjb25kLnNldENvbmRDb25maWcoY29udmVydFRvQ29uZGl0aW9uQ29uZmlndXJhdGlvbihzdGF0aWNNZXRhZGF0YSkpOworCisgICAgICAgIGlmIChjb25kLmdldENvbmRpdGlvbk5hbWUoKSA9PSBudWxsCisgICAgICAgICAgICB8fCAoY29uZC5nZXRDb25kaXRpb25OYW1lKCkgIT0gbnVsbCAmJiBjb25kLmdldENvbmRpdGlvbk5hbWUoKQorICAgICAgICAgICAgICAgIC5lcXVhbHMoIiIpKSkgeworICAgICAgICAgIGNvbmQuc2V0Q29uZGl0aW9uTmFtZShjb25kLmdldENvbmRpdGlvbklkKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29uZGl0aW9ucy5wdXQoZ3JhcGguZ2V0TW9kZWxJZCgpLCBjb25kKTsKKworICAgICAgfQorCisgICAgICBncmFwaC5zZXRDb25kKGNvbmQpOworICAgICAgaWYgKGdyYXBoLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGdyYXBoLmdldFBhcmVudCgpLmdldFdvcmtmbG93KCkgIT0gbnVsbCkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiQWRkaW5nIGNvbmRpdGlvbjogWyIgKyBjb25kLmdldENvbmRpdGlvbk5hbWUoKQorICAgICAgICAgICAgICArICJdIHRvIHBhcmVudCB3b3JrZmxvdzogWyIKKyAgICAgICAgICAgICAgKyBncmFwaC5nZXRQYXJlbnQoKS5nZXRXb3JrZmxvdygpLmdldE5hbWUoKSArICJdIik7CisgICAgICAgICAgZ3JhcGguZ2V0UGFyZW50KCkuZ2V0V29ya2Zsb3coKS5nZXRDb25kaXRpb25zKCkuYWRkKGNvbmQpOworICAgICAgICB9IGVsc2UgaWYgKGdyYXBoLmdldFBhcmVudCgpLmdldFRhc2soKSAhPSBudWxsKSB7CisgICAgICAgICAgZ3JhcGguZ2V0UGFyZW50KCkuZ2V0VGFzaygpLmdldENvbmRpdGlvbnMoKS5hZGQoY29uZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FU1QsICJDb25kaXRpb246IFsiICsgZ3JhcGguZ2V0TW9kZWxJZCgpCisgICAgICAgICAgICAgICsgIl0gaGFzIG5vdCBwYXJlbnQ6IGl0J3MgYSBjb25kaXRpb24gZGVmaW5pdGlvbiIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0cubG9nKExldmVsLkZJTkVTVCwgIkNvbmRpdGlvbjogWyIgKyBncmFwaC5nZXRNb2RlbElkKCkKKyAgICAgICAgICAgICsgIl06IHBhcmVudCBpcyBudWxsIik7CisgICAgICB9CisgICAgICAvLyBpZiBwYXJlbnQgZG9lc24ndCBoYXZlIHRhc2sgb3Igd29ya2Zsb3cgc2V0LCB0aGVuIGl0cyBwYXJlbnQKKyAgICAgIC8vIGlzIG51bGwgYW5kIGl0J3MgYSBjb25kaXRpb24gZGVmaW5pdGlvbiwganVzdCBhZGQgaXQKKworICAgIH0gZWxzZSBpZiAoZ3JhcGguZ2V0RXhlY3V0aW9uVHlwZSgpLmVxdWFscygidGFzayIpKSB7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG51bGw7CisgICAgICBpZiAoZ3JhcGguZ2V0TW9kZWxJZFJlZigpICE9IG51bGwgJiYgIWdyYXBoLmdldE1vZGVsSWRSZWYoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVIsICJNb2RlbCBJRC1SZWYgdG86IFsiICsgZ3JhcGguZ2V0TW9kZWxJZFJlZigpICsgIl0iKTsKKyAgICAgICAgdGFzayA9IHRoaXMudGFza3MuZ2V0KGdyYXBoLmdldE1vZGVsSWRSZWYoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YXNrID0gbmV3IFdvcmtmbG93VGFzaygpOworICAgICAgICB0YXNrLnNldFRhc2tJZChncmFwaC5nZXRNb2RlbElkKCkpOworICAgICAgICB0YXNrLnNldFRhc2tOYW1lKGdyYXBoLmdldE1vZGVsTmFtZSgpKTsKKyAgICAgICAgdGFzay5zZXRUYXNrQ29uZmlnKGNvbnZlcnRUb1Rhc2tDb25maWd1cmF0aW9uKHN0YXRpY01ldGFkYXRhKSk7CisgICAgICAgIHRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKGdyYXBoLmdldENsYXp6KCkpOworCisgICAgICAgIGlmICh0YXNrLmdldFRhc2tOYW1lKCkgPT0gbnVsbAorICAgICAgICAgICAgfHwgKHRhc2suZ2V0VGFza05hbWUoKSAhPSBudWxsICYmIHRhc2suZ2V0VGFza05hbWUoKS5lcXVhbHMoIiIpKSkgeworICAgICAgICAgIHRhc2suc2V0VGFza05hbWUodGFzay5nZXRUYXNrSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50YXNrcy5wdXQoZ3JhcGguZ2V0TW9kZWxJZCgpLCB0YXNrKTsKKyAgICAgIH0KKworICAgICAgZ3JhcGguc2V0VGFzayh0YXNrKTsKKyAgICAgIGlmIChncmFwaC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgIGlmIChncmFwaC5nZXRQYXJlbnQoKS5nZXRXb3JrZmxvdygpICE9IG51bGwpIHsKKyAgICAgICAgICBncmFwaC5nZXRQYXJlbnQoKS5nZXRXb3JrZmxvdygpLmdldFRhc2tzKCkuYWRkKHRhc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiVGFzazogWyIgKyBncmFwaC5nZXRNb2RlbElkKCkKKyAgICAgICAgICAgICAgKyAiXSBoYXMgbm8gcGFyZW50OiBpdCdzIGEgdGFzayBkZWZpbml0aW9uIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiVGFzazogWyIgKyBncmFwaC5nZXRNb2RlbElkKCkKKyAgICAgICAgICAgICsgIl06IHBhcmVudCBpcyBudWxsIik7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwcml2YXRlIFBhcmVudENoaWxkV29ya2Zsb3cgZ2V0RHluYW1pY1dvcmtmbG93KFdvcmtmbG93VGFzayB0YXNrKSB7CisgICAgR3JhcGggZ3JhcGggPSBuZXcgR3JhcGgoKTsKKyAgICBncmFwaC5zZXRFeGVjdXRpb25UeXBlKCJzZXF1ZW50aWFsIik7CisgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KGdyYXBoKTsKKyAgICB3b3JrZmxvdy5zZXRJZCgicGFyYWxsZWwtIiArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworICAgIHdvcmtmbG93LnNldE5hbWUoIlBhcmFsbGVsIFNpbmdsZSBUYXNrICIgKyB0YXNrLmdldFRhc2tOYW1lKCkpOworICAgIHdvcmtmbG93LmdldFRhc2tzKCkuYWRkKHRhc2spOworICAgIHRoaXMud29ya2Zsb3dzLnB1dCh3b3JrZmxvdy5nZXRJZCgpLCB3b3JrZmxvdyk7CisgICAgcmV0dXJuIHdvcmtmbG93OworICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Rhc2sgZ2VuZXJhdGVSZWRpcmVjdG9yKFN0cmluZyBldmVudE5hbWUpIHsKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCk7CisgICAgY29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KCJldmVudE5hbWUiLCBldmVudE5hbWUpOworICAgIHRhc2suc2V0VGFza0lkKCJyZWRpcmVjdG9yLSIgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsKKyAgICB0YXNrLnNldFRhc2tOYW1lKCJSZWRpcmVjdG9yIFRhc2siKTsKKyAgICB0YXNrLnNldFRhc2tJbnN0YW5jZUNsYXNzTmFtZShCcmFuY2hSZWRpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7CisgICAgdGhpcy50YXNrcy5wdXQodGFzay5nZXRUYXNrSWQoKSwgdGFzayk7CisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworICBwcml2YXRlIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY29udmVydFRvVGFza0NvbmZpZ3VyYXRpb24oTWV0YWRhdGEgbWV0KSB7CisgICAgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldC5nZXRBbGxLZXlzKCkpIHsKKyAgICAgIGNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eShrZXksIG1ldC5nZXRNZXRhZGF0YShrZXkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbmZpZzsKKyAgfQorCisgIHByaXZhdGUgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uIGNvbnZlcnRUb0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24oCisgICAgICBNZXRhZGF0YSBtZXQpIHsKKyAgICBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IG1ldC5nZXRBbGxLZXlzKCkpIHsKKyAgICAgIGNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eShrZXksIG1ldC5nZXRNZXRhZGF0YShrZXkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbmZpZzsKKyAgfQorCisgIC8qKgorICAgKiBUYWtlbiBmcm9tOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyNDE1MjUvamF2YS1lbGVtZW50LQorICAgKiBnZXRlbGVtZW50c2J5dGFnbmFtZS1yZXN0cmljdC10by10b3AtbGV2ZWwKKyAgICovCisgIHByaXZhdGUgTGlzdDxFbGVtZW50PiBnZXRDaGlsZHJlbkJ5VGFnTmFtZShFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICBMaXN0PEVsZW1lbnQ+IG5vZGVMaXN0ID0gbmV3IFZlY3RvcjxFbGVtZW50PigpOworICAgIGZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKKyAgICAgICAgLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFCisgICAgICAgICAgJiYgbmFtZS5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgbm9kZUxpc3QuYWRkKChFbGVtZW50KSBjaGlsZCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5vZGVMaXN0OworICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Rhc2sgZ2V0R2xvYmFsV29ya2Zsb3dDb25kaXRpb25zVGFzayhTdHJpbmcgd29ya2Zsb3dOYW1lLCBTdHJpbmcgd29ya2Zsb3dJZCwKKyAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMpIHsKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICB0YXNrLnNldENvbmRpdGlvbnMoY29uZGl0aW9ucyk7CisgICAgdGFzay5zZXRUYXNrQ29uZmlnKG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCkpOworICAgIHRhc2suc2V0VGFza0lkKHdvcmtmbG93SWQgKyAiLWdsb2JhbC1jb25kaXRpb25zLWV2YWwiKTsKKyAgICB0YXNrLnNldFRhc2tOYW1lKHdvcmtmbG93TmFtZSArICItZ2xvYmFsLWNvbmRpdGlvbnMtZXZhbCIpOworICAgIHRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKE5vT3BUYXNrLmNsYXNzLmdldE5hbWUoKSk7CisgICAgdGhpcy50YXNrcy5wdXQodGFzay5nZXRUYXNrSWQoKSwgdGFzayk7CisgICAgcmV0dXJuIHRhc2s7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1BhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9QYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAzMTcwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9QYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIAorICogQ29uc3RydWN0cyB7QGxpbmsgUGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnl9cy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cworICAgIFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkgeworCisgIHByaXZhdGUgU3RyaW5nIHdEaXJQYXRoOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoUGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aGlzLndEaXJQYXRoID0gU3lzdGVtCisgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZW5naW5lLnBhY2thZ2VkUmVwby5kaXIucGF0aCIpOworICAgIGlmICh0aGlzLndEaXJQYXRoID09IG51bGwKKyAgICAgICAgfHwgKHRoaXMud0RpclBhdGggIT0gbnVsbCAmJiAhbmV3IEZpbGUod0RpclBhdGgpLmlzRGlyZWN0b3J5KCkpKSB7CisgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IHZhbGlkIGRpcmVjdG9yeSBwYXRoICIKKyAgICAgICAgICArICJjb250YWluaW5nIHdlbmdpbmUtc3R5bGUgd29ya2Zsb3cgeG1sIGZpbGVzISBwYXRoIHNwZWNpZmllZDogWyIKKyAgICAgICAgICArIHRoaXMud0RpclBhdGggKyAiXSIpOworICAgIH0KKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeSMKKyAgICogY3JlYXRlUmVwb3NpdG9yeSgpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFdvcmtmbG93UmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5KAorICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IEZpbGUodGhpcy53RGlyUGF0aCkubGlzdEZpbGVzKCkpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIExPRy5sb2coCisgICAgICAgICAgTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIHBhY2thZ2VkIHdvcmtmbG93IHJlcG9zaXRvcnkhIFJlYXNvbjogIgorICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1dvcmtmbG93UmVwb3NpdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9Xb3JrZmxvd1JlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjU1ODViCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9Xb3JrZmxvd1JlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIAorICogQSByZXBvc2l0b3J5IGludGVyZmFjZSBmb3Igb2J0YWluaW5nIHtAbGluayBXb3JrZmxvd31zLCBhbmQgbWFuYWdpbmcgdGhlCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciB7QGxpbmsgV29ya2Zsb3dUYXNrfXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93UmVwb3NpdG9yeSB7CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBSZXR1cm5zIGEge0BsaW5rIFdvcmtmbG93fSB3aXRoIHRoZSBnaXZlbiA8Y29kZT53b3JrZmxvd05hbWU8L2NvZGU+LgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gd29ya2Zsb3dOYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3d9IHRvIG9idGFpbi4KKyAgICogQHJldHVybiBBIHtAbGluayBXb3JrZmxvd30gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5TmFtZShTdHJpbmcgd29ya2Zsb3dOYW1lKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBSZXR1cm5zIGEge0BsaW5rIFdvcmtmbG93fSB3aXRoIHRoZSBnaXZlbiA8Y29kZT53b3JrZmxvd0lkPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHdvcmtmbG93SWQKKyAgICogICAgICAgICAgVGhlIElEIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3d9IHRvIG9idGFpbi4KKyAgICogQHJldHVybiBBIHtAbGluayBXb3JrZmxvd30gd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyBhbGwge0BsaW5rIFdvcmtmbG93fXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiBhbGwge0BsaW5rIFdvcmtmbG93fXMgaW4gdGhlIHJlcG9zaXRvcnkuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiA8cD4KKyAgICogUmV0dXJucyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgKiBzcGVjaWZpZWQge0BsaW5rIFdvcmtmbG93fSBpZGVudGlmaWVkIGJ5IGl0cyA8Y29kZT53b3JrZmxvd0lkPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHdvcmtmbG93SWQKKyAgICogICAgICAgICAgVGhlIElEIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3d9IHRvIG9idGFpbiB0aGUge0BsaW5rIExpc3R9IG9mCisgICAqICAgICAgICAgIHtAbGluayBXb3JrZmxvd1Rhc2t9cyBmb3IuCisgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93VGFza31zIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICogICAgICAgICBzcGVjaWZpZWQgV29ya2Zsb3cuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFRhc2tzQnlXb3JrZmxvd0lkKFN0cmluZyB3b3JrZmxvd0lkKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd1Rhc2t9cyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAqIHNwZWNpZmllZCB7QGxpbmsgV29ya2Zsb3d9IGlkZW50aWZpZWQgYnkgaXRzIDxjb2RlPndvcmtmbG93TmFtZTwvY29kZT4uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSB3b3JrZmxvd05hbWUKKyAgICogICAgICAgICAgVGhlIE5hbWUgb2YgdGhlIHtAbGluayBXb3JrZmxvd30gdG8gb2J0YWluIHRoZSB7QGxpbmsgTGlzdH0gb2YKKyAgICogICAgICAgICAge0BsaW5rIFdvcmtmbG93VGFza31zIGZvci4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgKiAgICAgICAgIHNwZWNpZmllZCBXb3JrZmxvdy4KKyAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0VGFza3NCeVdvcmtmbG93TmFtZShTdHJpbmcgd29ya2Zsb3dOYW1lKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd31zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAqIDxjb2RlPmV2ZW50TmFtZTwvY29kZT4uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSBldmVudE5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlYXJjaCBmb3Igd29ya2Zsb3dzIGZvci4gPC9wPgorICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd31zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAqICAgICAgICAgZXZlbnQuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93c0ZvckV2ZW50KFN0cmluZyBldmVudE5hbWUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiA8cD4KKyAgICogUmV0dXJucyBhbiBvcmRlcmVkIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cyBhc3NvY2lhdGVkCisgICAqIHdpdGggdGhlIGdpdmVuIDxjb2RlPnRhc2tOYW1lPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHRhc2tOYW1lCisgICAqICAgICAgICAgIFRoZSB0YXNrTmFtZSB0byBvYnRhaW4gdGhlIGNvbmRpdGlvbnMgZm9yLgorICAgKiBAcmV0dXJuIFJldHVybnMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMgYXNzb2NpYXRlZAorICAgKiAgICAgICAgIHdpdGggdGhlIGdpdmVuIDxjb2RlPnRhc2tOYW1lPC9jb2RlPgorICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgTGlzdCBnZXRDb25kaXRpb25zQnlUYXNrTmFtZShTdHJpbmcgdGFza05hbWUpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogPHA+CisgICAqIFJldHVybnMgYW4gb3JkZXJlZCB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMgYXNzb2NpYXRlZAorICAgKiB3aXRoIHRoZSBnaXZlbiA8Y29kZT50YXNrSWQ8L2NvZGU+LgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gdGFza0lkCisgICAqICAgICAgICAgIFRoZSBJRCBvZiB0aGUgdGFzayB0byBvYnRhaW4gdGhlIGNvbmRpdGlvbnMgZm9yLgorICAgKiBAcmV0dXJuIFJldHVybnMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMgYXNzb2NpYXRlZAorICAgKiAgICAgICAgIHdpdGggdGhlIGdpdmVuIDxjb2RlPnRhc2tJZDwvY29kZT4KKyAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAqICAgICAgICAgICBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0Q29uZGl0aW9uc0J5VGFza0lkKFN0cmluZyB0YXNrSWQpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyB0aGUge0BsaW5rIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb259IG1ldGFkYXRhIGZvciB0aGUKKyAgICoge0BsaW5rIFdvcmtmbG93VGFza30gd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+dGFza0lkPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHRhc2tJZAorICAgKiAgICAgICAgICBUaGUgSUQgb2YgdGhlIHtAbGluayBXb3JrZmxvd1Rhc2t9IHRvIGdldCB0aGUKKyAgICogICAgICAgICAge0BsaW5rIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb259IG1ldGFkYXRhIGZvci4KKyAgICogQHJldHVybiBUaGUge0BsaW5rIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb259IG1ldGFkYXRhIGZvciB0aGUKKyAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dUYXNrfSB3aXRoIHRoZSBnaXZlbiA8Y29kZT50YXNrSWQ8L2NvZGU+LgorICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uQnlUYXNrSWQoU3RyaW5nIHRhc2tJZCkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiA8cD4KKyAgICogUmV0dXJucyB0aGUge0BsaW5rIFdvcmtmbG93VGFza30gd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+dGFza0lkPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHRhc2tJZAorICAgKiAgICAgICAgICBUaGUgSUQgb2YgdGhlIFdvcmtmbG93VGFzayB0byByZXR1cm4uCisgICAqIEByZXR1cm4gdGhlIHtAbGluayBXb3JrZmxvd1Rhc2t9IHdpdGggdGhlIGdpdmVuIDxjb2RlPnRhc2tJZDwvY29kZT4uCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrQnlJZChTdHJpbmcgdGFza0lkKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259IHdpdGggdGhlIGdpdmVuCisgICAqIDxjb2RlPmNvbmRpdGlvbklkPC9jb2RlPi4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIGNvbmRpdGlvbklkCisgICAqICAgICAgICAgIFRoZSBJRCBvZiB0aGUgV29ya2Zsb3dDb25kaXRpb24gdG8gcmV0dXJuLgorICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259IHdpdGggdGhlIGdpdmVuCisgICAqICAgICAgICAgPGNvZGU+Y29uZGl0aW9uSWQ8L2NvZGU+LgorICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dDb25kaXRpb24gZ2V0V29ya2Zsb3dDb25kaXRpb25CeUlkKFN0cmluZyBjb25kaXRpb25JZCkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyBhIHtAbGluayBMaXN0fSBvZiA8Y29kZT5FdmVudDwvY29kZT5zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAqIFdvcmtmbG93IE1hbmFnZXIgYXMgaGF2aW5nIHZhbGlkIHtAbGluayBXb3JrZmxvd31zIG1hcHBlZCB0byB0aGVpciBuYW1lcy4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiA8Y29kZT5FdmVudDwvY29kZT5zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAqICAgICAgICAgV29ya2Zsb3cgTWFuYWdlciBhcyBoYXZpbmcgdmFsaWQge0BsaW5rIFdvcmtmbG93fXMgbWFwcGVkIHRvIHRoZWlyCisgICAqICAgICAgICAgbmFtZXMuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBMaXN0IGdldFJlZ2lzdGVyZWRFdmVudHMoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG5ldyB7QGxpbmsgV29ya2Zsb3d9IHRvIHRoaXMgUmVwb3NpdG9yeS4KKyAgICogCisgICAqIEBwYXJhbSB3b3JrZmxvdworICAgKiAgICAgICAgICBUaGUge0BsaW5rIFdvcmtmbG93fSB0byBhZGQuCisgICAqIEByZXR1cm4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG5ldyB7QGxpbmsgV29ya2Zsb3d9IGFzIGRlZmluZWQgYnkgdGhpcworICAgKiAgICAgICAgIHJlcG9zaXRvcnkuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgYWRkV29ya2Zsb3coV29ya2Zsb3cgd29ya2Zsb3cpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgIC8qKgorICAgKiAKKyAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cyBmb3IgdGhpcyB7QGxpbmsgV29ya2Zsb3d9CisgICAqIHNwZWNpZmllZCBieSBpdHMgPGNvZGU+d29ya2Zsb3dJZDwvY29kZT4uCisgICAqIAorICAgKiBAcGFyYW0gd29ya2Zsb3dJZAorICAgKiAgICAgICAgICBUaGUgSWRlbnRpZmllciBvZiB0aGUge0BsaW5rIFdvcmtmbG93fSB0byBnZXQgdGhlCisgICAqICAgICAgICAgIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zIGZvci4KKyAgICogCisgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMgZm9yIHRoaXMKKyAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3d9LgorICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KKyAgICogICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAqLworICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZChTdHJpbmcgd29ya2Zsb3dJZCkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOworICAKKyAgCisgIC8qKgorICAgKiBBZGRzIHRoZSBwcm92aWRlZCBuZXcge0BsaW5rIFdvcmtmbG93VGFza30gdG8gdGhlIG1vZGVsIHJlcG9zaXRvcnkuCisgICAqIAorICAgKiBAcGFyYW0gdGFzayBUaGUgbmV3IHtAbGluayBXb3JrZmxvd1Rhc2t9IHRvIGFkZC4KKyAgICogQHJldHVybiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbmV3IHtAbGluayBXb3JrZmxvd1Rhc2t9LiBDYWxsaW5nIHRoaXMKKyAgICogZnVuY3Rpb24gYW5kIHByb3ZpZGluZyBhIHRhc2sgd2l0aCBpdHMgaWRlbnRpZmllciBhbHJlYWR5IHNldCB3aWxsIGNhdXNlCisgICAqIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRoYXQgc2FtZSBpZGVudGlmaWVyIGJhY2suCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBhZGRUYXNrKFdvcmtmbG93VGFzayB0YXNrKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKyAgCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgV29ya2Zsb3dUYXNrfSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB0YXNrSWQuCisgICAqIAorICAgKiBAcGFyYW0gdGFza0lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGUge0BsaW5rIFdvcmtmbG93VGFza30gdG8gcmV0dXJuLgorICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV29ya2Zsb3dUYXNrfSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB0YXNrSWQuCisgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgcHVibGljIFdvcmtmbG93VGFzayBnZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9Xb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1dvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzExYjRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9Xb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnk7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBXb3JrZmxvd1JlcG9zaXRvcnl9cy4KKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogQHJldHVybiBBIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFdvcmtmbG93UmVwb3NpdG9yeX0gaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd1JlcG9zaXRvcnkgY3JlYXRlUmVwb3NpdG9yeSgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9YTUxXb3JrZmxvd1JlcG9zaXRvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvWE1MV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyZjJmOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvWE1MV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSw3MTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLlhtbFN0cnVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Ob09wVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldnNpb24kCisgKiAKKyAqIDxwPgorICogQSB7QGxpbmsgV29ya2Zsb3dSZXBvc2l0b3J5fSB0aGF0IGxvYWRzIGV2ZW50cywge0BsaW5rIFdvcmtmbG93fXMsCisgKiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgYW5kIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zIGZyb20gc3BlY2lhbGl6ZWQgeG1sCisgKiBmaWxlcy4gVGhlIFdvcmtmbG93UmVwb3NpdG9yeSBpcyBnaXZlbiBhbiBpbml0aWFsIHNldCBvZiBzZWVkIGRpcmVjdG9yeSB1cmlzLAorICogd2hlcmUgaXQgbG9va3MgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgKiAKKyAqIDx1bD4KKyAqIDxsaT5jb25kaXRpb25zLnhtbCAtIGRlZmluZXMgd29ya2Zsb3cgcHJlIGNvbmRpdGlvbnM8L2xpPgorICogPGxpPnRhc2tzLnhtbCAtIGRlZmluZXMgd29ya2Zsb3cgdGFza3M8L2xpPgorICogPGxpPioud29ya2Zsb3cueG1sIC0gaW5kaXZpZHVhbCB3b3JrZmxvdyB4bWwgZmlsZXMgc3BlY2lmeWluZyBhIHNpbmdsZQorICogd29ya2Zsb3c8L2xpPgorICogPGxpPmV2ZW50cy54bWwgLSBtYXBzIGF2YWlsYWJsZSB3b3JrZmxvd3MgdG8gZXZlbnQgbmFtZXM8L2xpPgorICogPC91bD4KKyAqIAorICogQWxsIG9mIHRoZSBXb3JrZmxvd1Rhc2tzLCBXb3JrZmxvd0NvbmRpdGlvbnMgYW5kIFdvcmtmbG93cyB0aGVtc2VsdmVzIGFyZQorICogY2FjaGVkIGluIG1lbW9yeSBieSB0aGVpciBpZHMgKHdoaWNoIGFyZSB0eXBpY2FsbHkgVVJOcykuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBYTUxXb3JrZmxvd1JlcG9zaXRvcnkgaW1wbGVtZW50cyBXb3JrZmxvd1JlcG9zaXRvcnkgeworCisgICAgLyogdGhlIGxpc3Qgb2YgZGlyZWN0b3J5IFVSSXMgd2hlcmUgd29ya2Zsb3cgeG1sIGZpbGVzIGxpdmUgKi8KKyAgICBwcml2YXRlIExpc3Qgd29ya2Zsb3dIb21lVXJpcyA9IG51bGw7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhNTFdvcmtmbG93UmVwb3NpdG9yeS5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICAvKiBvdXIgdGFzayBtYXAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHRhc2tNYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyogb3VyIGNvbmRpdGlvbiBtYXAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGNvbmRpdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKiBvdXIgd29ya2Zsb3cgbWFwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCB3b3JrZmxvd01hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKiBvdXIgZXZlbnQgbWFwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBldmVudE1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIHdvcmtmbG93WG1sRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuaXNGaWxlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcGF0aG5hbWUudG9TdHJpbmcoKS5lbmRzV2l0aCgiLndvcmtmbG93LnhtbCIpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgWE1MV29ya2Zsb3dSZXBvc2l0b3J5IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcgorICAgICAqIDxjb2RlPnVyaXM8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXJpcworICAgICAqICAgICAgICAgICAgVVJJcyBwb2ludGluZyB0byBkaXJlY3RvcmllcyB0aGF0IGZvbGxvdyB0aGUgWE1MIHdvcmtmbG93CisgICAgICogICAgICAgICAgICByZXBvc2l0b3J5IGNvbnZlbnRpb24gZG9jdW1lbnRlZCBhdCB0aGUgdG9wIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFhNTFdvcmtmbG93UmVwb3NpdG9yeShMaXN0IHVyaXMpIHsKKyAgICAgICAgd29ya2Zsb3dIb21lVXJpcyA9IHVyaXM7CisKKyAgICAgICAgLy8gbG9hZCB0aGUgdGFza3MgYW5kIGNvbmRpdGlvbnMKKyAgICAgICAgbG9hZENvbmRpdGlvbnMod29ya2Zsb3dIb21lVXJpcyk7CisgICAgICAgIGxvYWRUYXNrcyh3b3JrZmxvd0hvbWVVcmlzKTsKKyAgICAgICAgbG9hZFdvcmtmbG93cyh3b3JrZmxvd0hvbWVVcmlzKTsKKyAgICAgICAgbG9hZEV2ZW50cyh3b3JrZmxvd0hvbWVVcmlzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0UmVnaXN0ZXJlZEV2ZW50cygpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0UmVnaXN0ZXJlZEV2ZW50cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZXZlbnRNYXAua2V5U2V0KCkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dUYXNrQnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrQnlJZChTdHJpbmcgdGFza0lkKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFdvcmtmbG93VGFzaykgdGFza01hcC5nZXQodGFza0lkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dDb25kaXRpb25CeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uIGdldFdvcmtmbG93Q29uZGl0aW9uQnlJZChTdHJpbmcgY29uZGl0aW9uSWQpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoV29ya2Zsb3dDb25kaXRpb24pIGNvbmRpdGlvbk1hcC5nZXQoY29uZGl0aW9uSWQpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRXb3JrZmxvd0J5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5TmFtZShTdHJpbmcgd29ya2Zsb3dOYW1lKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3b3JrZmxvd01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0lkID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBXb3JrZmxvdyB3ID0gKFdvcmtmbG93KSB3b3JrZmxvd01hcC5nZXQod29ya2Zsb3dJZCk7CisKKyAgICAgICAgICAgIGlmICh3LmdldE5hbWUoKS5lcXVhbHMod29ya2Zsb3dOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFdvcmtmbG93QnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoV29ya2Zsb3cpIHdvcmtmbG93TWFwLmdldCh3b3JrZmxvd0lkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0V29ya2Zsb3dzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRXb3JrZmxvd3MoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHdvcmtmbG93TWFwLnZhbHVlcygpLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFRhc2tzQnlXb3JrZmxvd0lkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0VGFza3NCeVdvcmtmbG93SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93IHcgPSBnZXRXb3JrZmxvd0J5SWQod29ya2Zsb3dJZCk7CisgICAgICAgIHJldHVybiB3LmdldFRhc2tzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFRhc2tzQnlXb3JrZmxvd05hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRUYXNrc0J5V29ya2Zsb3dOYW1lKFN0cmluZyB3b3JrZmxvd05hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93IHcgPSBnZXRXb3JrZmxvd0J5TmFtZSh3b3JrZmxvd05hbWUpOworICAgICAgICByZXR1cm4gdy5nZXRUYXNrcygpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRXb3JrZmxvd3NGb3JFdmVudChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93c0ZvckV2ZW50KFN0cmluZyBldmVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoTGlzdCkgZXZlbnRNYXAuZ2V0KGV2ZW50TmFtZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldENvbmRpdGlvbnNCeVRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Q29uZGl0aW9uc0J5VGFza05hbWUoU3RyaW5nIHRhc2tOYW1lKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgV29ya2Zsb3dUYXNrIHQgPSAoV29ya2Zsb3dUYXNrKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0LmdldFRhc2tOYW1lKCkuZXF1YWxzKHRhc2tOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0LmdldENvbmRpdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRDb25kaXRpb25zQnlUYXNrSWQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRDb25kaXRpb25zQnlUYXNrSWQoU3RyaW5nIHRhc2tJZCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBXb3JrZmxvd1Rhc2sgdCA9IChXb3JrZmxvd1Rhc2spIHRhc2tNYXAuZ2V0KHRhc2tJZCk7CisgICAgICAgIGlmICh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0LmdldENvbmRpdGlvbnMoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKFN0cmluZyB0YXNrSWQpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93VGFzayB0YXNrID0gKFdvcmtmbG93VGFzaykgdGFza01hcC5nZXQodGFza0lkKTsKKyAgICAgICAgcmV0dXJuIHRhc2suZ2V0VGFza0NvbmZpZygpOworICAgIH0KKyAgICAKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjYWRkVGFzayhvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYWRkVGFzayhXb3JrZmxvd1Rhc2sgdGFzaykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgaXRzIGNvbmRpdGlvbnMKKyAgICAgIGlmKHRhc2suZ2V0UHJlQ29uZGl0aW9ucygpICE9IG51bGwgJiYgdGFzay5nZXRQcmVDb25kaXRpb25zKCkuc2l6ZSgpID4gMCl7CisgICAgICAgIGZvcihXb3JrZmxvd0NvbmRpdGlvbiBjb25kOiB0YXNrLmdldFByZUNvbmRpdGlvbnMoKSl7CisgICAgICAgICAgaWYoIXRoaXMuY29uZGl0aW9uTWFwLmNvbnRhaW5zS2V5KGNvbmQuZ2V0Q29uZGl0aW9uSWQoKSkpeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgdGFzazogWyIrdGFzay5nZXRUYXNrTmFtZSgpKyJdIHRvIHVuZGVmaW5lZCBwcmUgY29uZGl0aW9uIGl0aCBpZDogWyIrY29uZC5nZXRDb25kaXRpb25JZCgpKyJdIik7ICAgICAgICAgICAgCisgICAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IHRhc2suZ2V0UG9zdENvbmRpdGlvbnMoKSl7CisgICAgICAgICAgaWYoIXRoaXMuY29uZGl0aW9uTWFwLmNvbnRhaW5zS2V5KGNvbmQuZ2V0Q29uZGl0aW9uSWQoKSkpeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgdGFzazogWyIrdGFzay5nZXRUYXNrTmFtZSgpKyJdIHRvIHVuZGVmaW5lZCBwb3N0IGNvbmRpdGlvbiBpdGggaWQ6IFsiK2NvbmQuZ2V0Q29uZGl0aW9uSWQoKSsiXSIpOyAgICAgICAgICAgIAorICAgICAgICAgIH0gICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgICAgU3RyaW5nIHRhc2tJZCA9IHRhc2suZ2V0VGFza0lkKCkgIT0gbnVsbCA/IAorICAgICAgICAgICAgIHRhc2suZ2V0VGFza0lkKCk6VVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgdGhpcy50YXNrTWFwLnB1dCh0YXNrSWQsIHRhc2spOworICAgICAgICByZXR1cm4gdGFza0lkOworICAgIH0KKyAgICAKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnkjYWRkV29ya2Zsb3cob3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYWRkV29ya2Zsb3coV29ya2Zsb3cgd29ya2Zsb3cpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgdGhhdCBpdHMgdGFza3MgYXJlIGFsbCBwcmVzZW50CisgICAgICBpZih3b3JrZmxvdy5nZXRUYXNrcygpID09IG51bGwgfHwgKHdvcmtmbG93LmdldFRhc2tzKCkgIT0gbnVsbCAmJiB3b3JrZmxvdy5nZXRUYXNrcygpLnNpemUoKSA9PSAwKSl7CisgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJBdHRlbXB0IHRvIGRlZmluZSBhIG5ldyB3b3JrbGZvdzogWyIrd29ya2Zsb3cuZ2V0TmFtZSgpKyJdIHdpdGggbm8gdGFza3MuIik7CisgICAgICB9CisgICAgICAKKyAgICAgIGZvcihXb3JrZmxvd1Rhc2sgdGFzazogKExpc3Q8V29ya2Zsb3dUYXNrPil3b3JrZmxvdy5nZXRUYXNrcygpKXsKKyAgICAgICAgaWYoIXRoaXMudGFza01hcC5jb250YWluc0tleSh0YXNrLmdldFRhc2tJZCgpKSl7CisgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgd29ya2Zsb3c6IFsiK3dvcmtmbG93LmdldE5hbWUoKSsiXSB0byB1bmRlZmluZWQgdGFzayB3aXRoIGlkOiBbIit0YXNrLmdldFRhc2tJZCgpKyJdIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGNoZWNrIGl0cyBjb25kaXRpb25zCisgICAgICAgIGlmKHRhc2suZ2V0Q29uZGl0aW9ucygpICE9IG51bGwgJiYgdGFzay5nZXRDb25kaXRpb25zKCkuc2l6ZSgpID4gMCl7CisgICAgICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IChMaXN0PFdvcmtmbG93Q29uZGl0aW9uPil0YXNrLmdldENvbmRpdGlvbnMoKSl7CisgICAgICAgICAgICBpZighdGhpcy5jb25kaXRpb25NYXAuY29udGFpbnNLZXkoY29uZC5nZXRDb25kaXRpb25JZCgpKSl7CisgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJSZWZlcmVuY2UgaW4gbmV3IHdvcmtmbG93OiBbIit3b3JrZmxvdy5nZXROYW1lKCkrIl0gdG8gdW5kZWZpbmVkIGNvbmRpdGlvbiBpdGggaWQ6IFsiK2NvbmQuZ2V0Q29uZGl0aW9uSWQoKSsiXSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAgIFN0cmluZyB3b3JrZmxvd0lkID0gd29ya2Zsb3cuZ2V0SWQoKTsKKwkJaWYgKHdvcmtmbG93SWQgPT0gbnVsbAorCQkJCXx8ICh3b3JrZmxvd0lkICE9IG51bGwgJiYgd29ya2Zsb3dJZC5lcXVhbHMoIiIpKSkgeworCQkJLy8gZ2VuZXJhdGUgaXRzIElECisJCQl3b3JrZmxvd0lkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCXdvcmtmbG93LnNldElkKHdvcmtmbG93SWQpOworCQl9CisJCXRoaXMud29ya2Zsb3dNYXAucHV0KHdvcmtmbG93SWQsIHdvcmtmbG93KTsKKwkJdGhpcy5ldmVudE1hcC5wdXQod29ya2Zsb3dJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh3b3JrZmxvdykpOworCQlyZXR1cm4gd29ya2Zsb3dJZDsKKwkJCisgICAgfSAgICAKKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldENvbmRpdGlvbnNCeVdvcmtmbG93SWQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZChTdHJpbmcgd29ya2Zsb3dJZCkKKyAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgaWYoIXRoaXMud29ya2Zsb3dNYXAuY29udGFpbnNLZXkod29ya2Zsb3dJZCkpIHRocm93IG5ldyAKKyAgICAgICAgIFJlcG9zaXRvcnlFeGNlcHRpb24oIkF0dGVtcHQgdG8gb2J0YWluIGNvbmRpdGlvbnMgZm9yIGEgd29ya2Zsb3c6ICIgKworICAgICAgICAgCQkiWyIrd29ya2Zsb3dJZCsiXSB0aGF0IGRvZXMgbm90IGV4aXN0ISIpOworICAgICAgCisgICAgICByZXR1cm4gKChXb3JrZmxvdyl0aGlzLndvcmtmbG93TWFwLmdldCh3b3JrZmxvd0lkKSkuZ2V0Q29uZGl0aW9ucygpOworICAgIH0gICAgCisgICAgCisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5I2dldFRhc2tCeUlkKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFdvcmtmbG93VGFzayBnZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gKFdvcmtmbG93VGFzayl0aGlzLnRhc2tNYXAuZ2V0KHRhc2tJZCk7CisgICAgfSAgICAKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdXNhZ2UgPSAiWG1sV29ya2Zsb3dSZXBvc2l0b3J5IDx1cmkgMT4uLi48dXJpIG4+XG4iOworICAgICAgICBMaXN0IHVyaXMgPSBudWxsOworCisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICB1cmlzID0gbmV3IFZlY3RvcihhcmdzLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXJpcy5hZGQoYXJnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYTUxXb3JrZmxvd1JlcG9zaXRvcnkgcmVwbyA9IG5ldyBYTUxXb3JrZmxvd1JlcG9zaXRvcnkodXJpcyk7CisKKyAgICAgICAgTGlzdCB3b3JrZmxvd3MgPSByZXBvLmdldFdvcmtmbG93cygpOworCisgICAgICAgIGlmICh3b3JrZmxvd3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gd29ya2Zsb3dzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFdvcmtmbG93IHcgPSAoV29ya2Zsb3cpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2Zsb3c6IFtpZD0iICsgdy5nZXRJZCgpICsgIiwgbmFtZT0iCisgICAgICAgICAgICAgICAgICAgICAgICArIHcuZ2V0TmFtZSgpICsgIl0iKTsKKworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGFza3M6ICIpOworCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gdy5nZXRUYXNrcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IChXb3JrZmxvd1Rhc2spIGoubmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGFzazogW2NsYXNzPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2suZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkgKyAiLCBpZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrLmdldFRhc2tJZCgpICsgIiwgbmFtZT0iICsgdGFzay5nZXRUYXNrTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvcmRlcj0iICsgdGFzay5nZXRPcmRlcigpICsgIixyZXFNZXRGaWVsZHM9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFzay5nZXRSZXF1aXJlZE1ldEZpZWxkcygpICsgIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25maWd1cmF0aW9uOiAiKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSB0YXNrLmdldFRhc2tDb25maWcoKS5nZXRQcm9wZXJ0aWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAua2V5U2V0KCkuaXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgay5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSB0YXNrLmdldFRhc2tDb25maWcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydGllcygpLmdldChrZXkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltuYW1lPSIgKyBrZXkgKyAiLCB2YWx1ZT0iICsgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25zOiAiKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSB0YXNrLmdldENvbmRpdGlvbnMoKS5pdGVyYXRvcigpOyBrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbiA9IChXb3JrZmxvd0NvbmRpdGlvbikgaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb246IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZGl0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiwgaWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbmRpdGlvbi5nZXRDb25kaXRpb25JZCgpICsgIiwgbmFtZT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZGl0aW9uLmdldENvbmRpdGlvbk5hbWUoKSArICIsIHRpbWVvdXQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbmRpdGlvbi5nZXRUaW1lb3V0U2Vjb25kcygpKyAiLCBvcHRpb25hbD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZGl0aW9uLmlzT3B0aW9uYWwoKSsiLCBvcmRlcj0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZGl0aW9uLmdldE9yZGVyKCkgKyAiXSIpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmZpZ3VyYXRpb246ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY0tleU5hbWUgOiAoU2V0PFN0cmluZz4pIChTZXQ8Pz4pIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZENvbmZpZygpLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW25hbWU9IiArIGNLZXlOYW1lICsgIiwgdmFsdWU9IgorICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZGl0aW9uLmdldENvbmRDb25maWcoKS5nZXRQcm9wZXJ0eShjS2V5TmFtZSkgKyAiXSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gd29ya2Zsb3dzIGRlZmluZWQhIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkVGFza3MoTGlzdCBkaXJVcmlzKSB7CisgICAgICAgIGlmIChkaXJVcmlzICE9IG51bGwgJiYgZGlyVXJpcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkaXJVcmlzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBkaXJVcmkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2Zsb3dEaXIgPSBuZXcgRmlsZShuZXcgVVJJKGRpclVyaSkpOworICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdvcmtmbG93RGlyU3RyID0gd29ya2Zsb3dEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dEaXJTdHIuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGlyU3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgdGFza1Jvb3QgPSBnZXREb2N1bWVudFJvb3Qod29ya2Zsb3dEaXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGFza3MueG1sIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgdGFza0VsZW1lbnQgPSB0YXNrUm9vdC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgdGFza0VsZW1MaXN0ID0gdGFza0VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YXNrIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrRWxlbUxpc3QgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0YXNrRWxlbUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YXNrRWxlbUxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHRhc2tFbGVtID0gKEVsZW1lbnQpIHRhc2tFbGVtTGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtKGopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IFhtbFN0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dUYXNrKHRhc2tFbGVtLCBjb25kaXRpb25NYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrTWFwLnB1dCh0YXNrLmdldFRhc2tJZCgpLCB0YXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyVXJpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBkaXJlY3Rvcnk6IHNraXBwaW5nIHRhc2sgbG9hZGluZyBmb3IgaXQuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZENvbmRpdGlvbnMoTGlzdCBkaXJVcmlzKSB7CisgICAgICAgIGlmIChkaXJVcmlzICE9IG51bGwgJiYgZGlyVXJpcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkaXJVcmlzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBkaXJVcmkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2Zsb3dEaXIgPSBuZXcgRmlsZShuZXcgVVJJKGRpclVyaSkpOworICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdvcmtmbG93RGlyU3RyID0gd29ya2Zsb3dEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dEaXJTdHIuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGlyU3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgY29uZGl0aW9uUm9vdCA9IGdldERvY3VtZW50Um9vdCh3b3JrZmxvd0RpclN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb25kaXRpb25zLnhtbCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGNvbmRpdGlvbkVsZW1lbnQgPSBjb25kaXRpb25Sb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgY29uZGl0aW9uRWxlbUxpc3QgPSBjb25kaXRpb25FbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY29uZGl0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25FbGVtTGlzdCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbmRpdGlvbkVsZW1MaXN0LmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29uZGl0aW9uRWxlbUxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGNvbmRpdGlvbkVsZW0gPSAoRWxlbWVudCkgY29uZGl0aW9uRWxlbUxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3dDb25kaXRpb24gY29uZGl0aW9uID0gWG1sU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0NvbmRpdGlvbihjb25kaXRpb25FbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25NYXAucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24uZ2V0Q29uZGl0aW9uSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyVXJpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBkaXJlY3Rvcnk6IHNraXBwaW5nIGNvbmRpdGlvbiBsb2FkaW5nIGZvciBpdC4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkV29ya2Zsb3dzKExpc3QgZGlyVXJpcykgeworICAgICAgICBpZiAoZGlyVXJpcyAhPSBudWxsICYmIGRpclVyaXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGlyVXJpcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGlyVXJpID0gKFN0cmluZykgaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHdvcmtmbG93RGlyID0gbmV3IEZpbGUobmV3IFVSSShkaXJVcmkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0RpclN0ciA9IHdvcmtmbG93RGlyLmdldEFic29sdXRlUGF0aCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93RGlyU3RyLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RpclN0ciArPSAiLyI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgdGhlIHdvcmtmbG93IHhtbCBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVtdIHdvcmtmbG93RmlsZXMgPSB3b3JrZmxvd0RpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGlzdEZpbGVzKHdvcmtmbG93WG1sRmlsdGVyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3b3JrZmxvd0ZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdvcmtmbG93WG1sRmlsZSA9IHdvcmtmbG93RmlsZXNbal0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCB3b3JrZmxvd1Jvb3QgPSBnZXREb2N1bWVudFJvb3Qod29ya2Zsb3dYbWxGaWxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0lkID0gd29ya2Zsb3dSb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJpZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd01hcC5nZXQod29ya2Zsb3dJZCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvdyB3ID0gWG1sU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvdygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1Jvb3QuZ2V0RG9jdW1lbnRFbGVtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza01hcCwgY29uZGl0aW9uTWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHcuZ2V0Q29uZGl0aW9ucygpICE9IG51bGwgJiYgdy5nZXRDb25kaXRpb25zKCkuc2l6ZSgpID4gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGEgdmlydHVhbCBmaXJzdCB0YXNrLCB3aXRoIHRoZSBjb25kaXRpb25zIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcuZ2V0VGFza3MoKS5hZGQoMCwgZ2V0R2xvYmFsV29ya2Zsb3dDb25kaXRpb25zVGFzayh3LmdldE5hbWUoKSwgdy5nZXRJZCgpLCB3LmdldENvbmRpdGlvbnMoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TWFwLnB1dCh3b3JrZmxvd0lkLCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuRklORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyB3b3JrZmxvdyBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dYbWxGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIGxvYWRpbmcgd29ya2Zsb3dzLCB3b3JrZmxvdyBpZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdvcmtmbG93SWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgbG9hZGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXJVcmk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXJVcmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeTogc2tpcHBpbmcgd29ya2Zsb3cgbG9hZGluZyBmb3IgaXQuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEV2ZW50cyhMaXN0IGRpclVyaXMpIHsKKyAgICAgICAgaWYgKGRpclVyaXMgIT0gbnVsbCAmJiBkaXJVcmlzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRpclVyaXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRpclVyaSA9IChTdHJpbmcpIGkubmV4dCgpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSB3b3JrZmxvd0RpciA9IG5ldyBGaWxlKG5ldyBVUkkoZGlyVXJpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd0Rpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd29ya2Zsb3dEaXJTdHIgPSB3b3JrZmxvd0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd0RpclN0ci5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEaXJTdHIgKz0gIi8iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBldmVudFJvb3QgPSBnZXREb2N1bWVudFJvb3Qod29ya2Zsb3dEaXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXZlbnRzLnhtbCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGV2ZW50RWxlbWVudCA9IGV2ZW50Um9vdC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgZXZlbnRFbGVtTGlzdCA9IGV2ZW50RWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImV2ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudEVsZW1MaXN0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXZlbnRFbGVtTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV2ZW50RWxlbUxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGV2ZW50RWxlbSA9IChFbGVtZW50KSBldmVudEVsZW1MaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZW0oaik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9IGV2ZW50RWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3cgdyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3Qgd29ya2Zsb3dOb2RlTGlzdCA9IGV2ZW50RWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgid29ya2Zsb3ciKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dOb2RlTGlzdCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd29ya2Zsb3dOb2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgd29ya2Zsb3dMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdvcmtmbG93Tm9kZUxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHdvcmtmbG93RWxlbWVudCA9IChFbGVtZW50KSB3b3JrZmxvd05vZGVMaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlbShrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gKFdvcmtmbG93KSB3b3JrZmxvd01hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldCh3b3JrZmxvd0VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TGlzdC5hZGQodyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1hcC5wdXQoZXZlbnROYW1lLCB3b3JrZmxvd0xpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyVXJpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyVXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBkaXJlY3Rvcnk6IHNraXBwaW5nIGV2ZW50IGxvYWRpbmcgZm9yIGl0LiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudFJvb3QoU3RyaW5nIHhtbEZpbGUpIHsKKyAgICAgICAgLy8gb3BlbiB1cCB0aGUgWE1MIGZpbGUKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IG51bGw7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKyAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOworCisgICAgICAgIElucHV0U3RyZWFtIHhtbElucHV0U3RyZWFtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgeG1sSW5wdXRTdHJlYW0gPSBuZXcgRmlsZSh4bWxGaWxlKS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hlbiBnZXR0aW5nIGlucHV0IHN0cmVhbSBmcm9tIFsiICsgeG1sRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IHJldHVybmluZyBudWxsIGRvY3VtZW50IHJvb3QiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoeG1sSW5wdXRTdHJlYW0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy53YXJuaW5nKCJVbmFibGUgdG8gcGFyc2UgeG1sIGZpbGUgWyIgKyB4bWxGaWxlICsgIl0uIgorICAgICAgICAgICAgICAgICAgICArICJSZWFzb24gaXMgWyIgKyBlICsgIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50OworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFdvcmtmbG93VGFzayBnZXRHbG9iYWxXb3JrZmxvd0NvbmRpdGlvbnNUYXNrKFN0cmluZyB3b3JrZmxvd05hbWUsIFN0cmluZyB3b3JrZmxvd0lkLCBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBjb25kaXRpb25zKXsKKyAgICAgIFdvcmtmbG93VGFzayB0YXNrID0gbmV3IFdvcmtmbG93VGFzaygpOworICAgICAgdGFzay5zZXRDb25kaXRpb25zKGNvbmRpdGlvbnMpOworICAgICAgdGFzay5zZXRUYXNrQ29uZmlnKG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCkpOworICAgICAgdGFzay5zZXRUYXNrSWQod29ya2Zsb3dJZCsiLWdsb2JhbC1jb25kaXRpb25zLWV2YWwiKTsKKyAgICAgIHRhc2suc2V0VGFza05hbWUod29ya2Zsb3dOYW1lKyItZ2xvYmFsLWNvbmRpdGlvbnMtZXZhbCIpOworICAgICAgdGFzay5zZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoTm9PcFRhc2suY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgIHRoaXMudGFza01hcC5wdXQodGFzay5nZXRUYXNrSWQoKSwgdGFzayk7CisgICAgICByZXR1cm4gdGFzazsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvWE1MV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9YTUxXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5ZDE3MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvWE1MV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLkRpcmVjdG9yeVNlbGVjdG9yOworCisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBsdWNhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPkEgRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcge0BsaW5rIFhNTFdvcmtmbG93UmVwb3NpdG9yeX1zLjwvcD4KKyAqLworcHVibGljIGNsYXNzIFhNTFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cyBXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5IHsKKworCS8qIGxpc3Qgb2YgZGlyIHVyaXMgc3BlY2lmeWluZyBmaWxlIHBhdGhzIHRvIHdvcmtmbG93IGRpcmVjdG9yaWVzICovCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gd29ya2Zsb3dEaXJMaXN0ID0gbnVsbDsKKwkKKwkvKiBvdXIgbG9nIHN0cmVhbSAqLworCXByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhNTFdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwkvKioKKwkgKiA8cD5EZWZhdWx0IENvbnN0cnVjdG9yPC9wPi4KKwkgKi8KKwlwdWJsaWMgWE1MV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeSgpIHsKKwkJCisJCVN0cmluZyB3b3JrZmxvd0RpclVyaXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kaXJzIik7CisJCQorICAgICAgICAvLyBvbmx5IHJldHVybnMgdHJ1ZSBpZiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG8uZGlycy5yZWN1cnNpdmU9dHJ1ZQorICAgICAgICBib29sZWFuIHJlY3Vyc2l2ZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKCAKKyAgICAgICAgCQlTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kaXJzLnJlY3Vyc2l2ZSIpICk7CisJCQorCQlpZih3b3JrZmxvd0RpclVyaXMgIT0gbnVsbCl7CisJCQkvKiBkbyBlbnYgdmFyIHJlcGxhY2VtZW50ICovCisJCQl3b3JrZmxvd0RpclVyaXMgPSBQYXRoVXRpbHMucmVwbGFjZUVudlZhcmlhYmxlcyh3b3JrZmxvd0RpclVyaXMpOworCQkJU3RyaW5nIFtdIGRpclVyaXMgPSB3b3JrZmxvd0RpclVyaXMuc3BsaXQoIiwiKTsKKwkJCQorCQkJLy8gcmVjdXJzaXZlIGRpcmVjdG9yeSBsaXN0aW5nCisJCQlpZiAocmVjdXJzaXZlKSB7CisJCQkJCisgICAgICAgICAgICAJLy8gZW1wdHkgbGlzdAorCQkJCXdvcmtmbG93RGlyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgCQorICAgICAgICAgICAgCS8vIGxvb3Agb3ZlciBzcGVjaWZpZWQgcm9vdCBkaXJlY3RvcmllcywKKyAgICAgICAgICAgIAkvLyBhZGQgZGlyZWN0b3JpZXMgYW5kIHN1Yi1kaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gYWxsIHdvcmtmbG93IHJlbGF0ZWQgWE1MIGZpbGVzCisgICAgICAgICAgICAJZm9yIChTdHJpbmcgcm9vdERpciA6IGRpclVyaXMpIHsKKyAgICAgICAgICAgIAkJdHJ5IHsKKyAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgCQkJRGlyZWN0b3J5U2VsZWN0b3IgZGlyc2VsID0gbmV3IERpcmVjdG9yeVNlbGVjdG9yKAorICAgICAgICAgICAgCQkJCQlBcnJheXMuYXNMaXN0KCAKKyAgICAgICAgICAgIAkJCQkJCQluZXcgU3RyaW5nW10geyJldmVudHMueG1sIiwgInRhc2tzLnhtbCIsICJjb25kaXRpb25zLnhtbCJ9ICkpOworICAgICAgICAgICAgCQkJd29ya2Zsb3dEaXJMaXN0LmFkZEFsbCggZGlyc2VsLnRyYXZlcnNlRGlyKG5ldyBGaWxlKG5ldyBVUkkocm9vdERpcikpKSApOworICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJVUklTeW50YXhFeGNlcHRpb24gd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yeTogIityb290RGlyKTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCX0gICAgICAgIAorCQkJCisJCQkvLyBub24tcmVjdXJzaXZlIGRpcmVjdG9yeSBsaXN0aW5nCisJCQl9IGVsc2UgeworCQkJCXdvcmtmbG93RGlyTGlzdCA9IEFycmF5cy5hc0xpc3QoZGlyVXJpcyk7CisJCQl9CisJCQkKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwiQ29sbGVjdGluZyBYTUwgd29ya2Zsb3dzIGZyb20gdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllczoiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBkaXIgOiB3b3JrZmxvd0Rpckxpc3QpIHsKKyAgICAgICAgICAgIAlMT0cubG9nKExldmVsLkZJTkUsIHBkaXIpOworICAgICAgICAgICAgfQorCQkJCisJCX0KKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkjY3JlYXRlUmVwb3NpdG9yeSgpCisJICovCisJcHVibGljIFdvcmtmbG93UmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KCkgeworCQlpZih3b3JrZmxvd0Rpckxpc3QgIT0gbnVsbCl7CisJCQlyZXR1cm4gbmV3IFhNTFdvcmtmbG93UmVwb3NpdG9yeSh3b3JrZmxvd0Rpckxpc3QpOworCQl9CisJCWVsc2V7CisJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJDYW5ub3QgY3JlYXRlIFhNTCBXb3JrZmxvdyBSZXBvc2l0b3J5OiBubyB3b3JrZmxvdyBkaXIgdXJpcyBzcGVjaWZpZWQ6IHZhbHVlOiAiK1N5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRpcnMiKSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Db25kaXRpb25UYXNrSW5zdGFuY2UuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvQ29uZGl0aW9uVGFza0luc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNTk0NwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvQ29uZGl0aW9uVGFza0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3Rvcnk7CisKKy8qKgorICogCisgKiBUaGlzIGlzIGEge0BsaW5rIFdvcmtmbG93VGFza0luc3RhbmNlfSB0aGF0IGlzIGFibGUgdG8gcnVuIGEKKyAqIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlfSwgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgdGFzayBjb25maWcKKyAqIHByb3BlcnR5IG5hbWUgIkNvbmRpdGlvbkNsYXNzTmFtZSIuIElmIHRoZSBydW4gb2YgdGhlCisgKiB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZX0gZG9lcyBub3QgcmV0dXJuIHRydWUsIHRoZW4gYQorICoge0BsaW5rIFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9ufSBpcyB0aHJvd24uIE5vdGUsIHRoaXMgZXhjZXB0aW9uIGlzIGFsc28KKyAqIHRocm93biBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBwcm92aWRlZCBDb25kaXRpb25DbGFzc05hbWUsIG9yIGlmIGl0J3MKKyAqIG5vdCBwcm92aWRlZC4KKyAqIAorICogSWYgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2V9IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGlzCisgKiB0YXNrIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGFuZCBkb2VzIG5vdCB0aHJvdyBhbnkgRXhjZXB0aW9ucy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25UYXNrSW5zdGFuY2UgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgLmdldExvZ2dlcihDb25kaXRpb25UYXNrSW5zdGFuY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZSNydW4ob3JnLmFwYWNoZQorICAgKiAub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpCisgICAgICB0aHJvd3MgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24geworICAgIFN0cmluZyBjb25kaXRpb25DbGFzc05hbWUgPSBjb25maWcuZ2V0UHJvcGVydHkoIkNvbmRpdGlvbkNsYXNzTmFtZSIpOworICAgIGlmIChjb25kaXRpb25DbGFzc05hbWUgPT0gbnVsbAorICAgICAgICB8fCAoY29uZGl0aW9uQ2xhc3NOYW1lICE9IG51bGwgJiYgY29uZGl0aW9uQ2xhc3NOYW1lLmVxdWFscygiIikpKSB7CisgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24oCisgICAgICAgICAgIkNvbmRpdGlvbiBjbGFzcyBuYW1lIGlzIG51bGwgb3IgIiArICJ1bnJlYWRhYmxlOiBbIgorICAgICAgICAgICAgICArIGNvbmRpdGlvbkNsYXNzTmFtZSArICJdOiB1bmFibGUgdG8gcnVuIENvbmRpdGlvblRhc2tJbnN0YW5jZSEiKTsKKyAgICB9CisKKyAgICBMT0cubG9nKExldmVsLklORk8sICJDb25kaXRpb25UYXNrSW5zdGFuY2U6IGV2YWx1YXRpbmcgY29uZGl0aW9uOiBbIgorICAgICAgICArIGNvbmRpdGlvbkNsYXNzTmFtZSArICJdIik7CisgICAgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSBjb25kID0gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorICAgICAgICAuZ2V0Q29uZGl0aW9uT2JqZWN0RnJvbUNsYXNzTmFtZShjb25kaXRpb25DbGFzc05hbWUpOworICAgIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBjb25kQ29uZmlnID0gZnJvbVdvcmtmbG93VGFza0NvbmZpZyhjb25maWcpOworICAgIGlmICghY29uZC5ldmFsdWF0ZShtZXRhZGF0YSwgY29uZENvbmZpZykpIHsKKyAgICAgIHRocm93IG5ldyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbigiQ29uZGl0aW9uOiBbIgorICAgICAgICAgICsgY29uZGl0aW9uQ2xhc3NOYW1lICsgIl0gZmFpbGVkISIpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24gZnJvbVdvcmtmbG93VGFza0NvbmZpZygKKyAgICAgIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uIGNmZyA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24oKTsKKyAgICBmb3IgKFN0cmluZyBwcm9wTmFtZSA6IChTZXQ8U3RyaW5nPikgKFNldDw/PikgY29uZmlnLmdldFByb3BlcnRpZXMoKQorICAgICAgICAua2V5U2V0KCkpIHsKKyAgICAgIGlmICghcHJvcE5hbWUuZXF1YWxzKCJDb25kaXRpb25DbGFzc05hbWUiKSkgeworICAgICAgICBjZmcuYWRkQ29uZmlnUHJvcGVydHkocHJvcE5hbWUsIGNvbmZpZy5nZXRQcm9wZXJ0eShwcm9wTmFtZSkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjZmc7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9GSUxPUHJpb3JpdHlTb3J0ZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvRklMT1ByaW9yaXR5U29ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNGIwZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvRklMT1ByaW9yaXR5U29ydGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29yOworCisvKioKKyAqIAorICogU29ydHMgdGhlIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3J9IGNhbmRpZGF0ZXMgYWNjb3JkaW5nIHRvCisgKiB0aGUgdGltZSBpbiB3aGljaCB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHRoYXQgdGhleSBhcmUgcHJvY2Vzc2luZyB3YXMKKyAqIGNyZWF0ZWQuIFRoZSBmaXJzdCBvbmVzIHRvIGdldCBwcm9jZXNzZWQgYXJlIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQKKyAqIGluc3RhbmNlcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEZJTE9Qcmlvcml0eVNvcnRlciBpbXBsZW1lbnRzIFByaW9yaXR5U29ydGVyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihGSUxPUHJpb3JpdHlTb3J0ZXIuY2xhc3MKKyAgICAgIC5nZXROYW1lKCkpOworCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUKKyAgICogb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlByaW9yaXR5U29ydGVyI3NvcnQoamF2YS51dGlsLkxpc3QpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNvcnQoTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gY2FuZGlkYXRlcykgeworICAgIENvbGxlY3Rpb25zLnNvcnQoY2FuZGlkYXRlcywgbmV3IENvbXBhcmF0b3I8V29ya2Zsb3dQcm9jZXNzb3I+KCkgeworICAgICAgLyoKKyAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAqIAorICAgICAgICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKFdvcmtmbG93UHJvY2Vzc29yIG8xLCBXb3JrZmxvd1Byb2Nlc3NvciBvMikgeworICAgICAgICByZXR1cm4gbzEuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFN0YXJ0RGF0ZSgpCisgICAgICAgICAgICAuY29tcGFyZVRvKG8yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTdGFydERhdGUoKSk7CisgICAgICB9CisKKyAgICB9KTsKKworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL0dyYXBoLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL0dyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyYTA3NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvR3JhcGguamF2YQpAQCAtMCwwICsxLDQwNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGRhdGEgZmxvdyBhbmQgY29udHJvbCBmbG93IHJlbGF0aW9uc2hpcCBhc3NvY2lhdGVkIHdpdGggYQorICoge0BsaW5rIFdvcmtmbG93fS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZnNvdGVyCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdyYXBoIHsKKworICBwcml2YXRlIFdvcmtmbG93VGFzayB0YXNrOworCisgIHByaXZhdGUgV29ya2Zsb3dDb25kaXRpb24gY29uZDsKKworICBwcml2YXRlIFBhcmVudENoaWxkV29ya2Zsb3cgd29ya2Zsb3c7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbW9kZWxJZFJlZjsKKworICBwcml2YXRlIFN0cmluZyBtb2RlbElkOworCisgIHByaXZhdGUgU3RyaW5nIG1vZGVsTmFtZTsKKworICBwcml2YXRlIFN0cmluZyBhbGlhczsKKworICBwcml2YXRlIFN0cmluZyBleGVjdXRpb25UeXBlOworCisgIHByaXZhdGUgU3RyaW5nIG1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzOworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4Y3VzZWQ7CisKKyAgcHJpdmF0ZSBTdHJpbmcgY2xheno7CisKKyAgcHJpdmF0ZSBsb25nIHRpbWVvdXQ7CisKKyAgcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOworCisgIHByaXZhdGUgR3JhcGggcGFyZW50OworCisgIHByaXZhdGUgTGlzdDxHcmFwaD4gY2hpbGRyZW47CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gcHJvY2Vzc29ySWRzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geworICAgICAgInNlcXVlbnRpYWwiLCAicGFyYWxsZWwiLCAiY29uZGl0aW9uIiwgInRhc2siIH0pOworCisgIHB1YmxpYyBHcmFwaChFbGVtZW50IGdyYXBoRWxlbSwgTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMoKTsKKyAgICB0aGlzLm1vZGVsSWQgPSBncmFwaEVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpOworICAgIHRoaXMubW9kZWxOYW1lID0gZ3JhcGhFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgIHRoaXMuY2xhenogPSBncmFwaEVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpOworICAgIHRoaXMubW9kZWxJZFJlZiA9IGdyYXBoRWxlbS5nZXRBdHRyaWJ1dGUoImlkLXJlZiIpOworICAgIHRoaXMuZXhjdXNlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChncmFwaEVsZW0uZ2V0QXR0cmlidXRlKCJleGN1c2VkIikuc3BsaXQoCisgICAgICAgICIsIikpKTsKKyAgICB0aGlzLmFsaWFzID0gZ3JhcGhFbGVtLmdldEF0dHJpYnV0ZSgiYWxpYXMiKTsKKyAgICB0aGlzLm1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzID0gZ3JhcGhFbGVtLmdldEF0dHJpYnV0ZSgibWluIik7CisgICAgdGhpcy5leGVjdXRpb25UeXBlID0gZ3JhcGhFbGVtLmdldEF0dHJpYnV0ZSgiZXhlY3V0aW9uIik7CisgICAgdGhpcy50aW1lb3V0ID0gTG9uZy52YWx1ZU9mKGdyYXBoRWxlbS5nZXRBdHRyaWJ1dGUoInRpbWVvdXQiKSAhPSBudWxsCisgICAgICAgICYmICFncmFwaEVsZW0uZ2V0QXR0cmlidXRlKCJ0aW1lb3V0IikuZXF1YWxzKCIiKSA/IGdyYXBoRWxlbQorICAgICAgICAuZ2V0QXR0cmlidXRlKCJ0aW1lb3V0IikgOiAiLTEiKTsKKyAgICB0aGlzLm9wdGlvbmFsID0gQm9vbGVhbi52YWx1ZU9mKGdyYXBoRWxlbS5nZXRBdHRyaWJ1dGUoIm9wdGlvbmFsIikpOworCisgICAgTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBncmFwaEVsZW0uZ2V0QXR0cmlidXRlcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgYXR0ck1hcC5pdGVtKGkpOworICAgICAgaWYgKGF0dHIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInA6IikpIHsKKyAgICAgICAgc3RhdGljTWV0YWRhdGEucmVwbGFjZU1ldGFkYXRhKGF0dHIuZ2V0TmFtZSgpLnN1YnN0cmluZygyKSwKKyAgICAgICAgICAgIGF0dHIuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChncmFwaEVsZW0uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIndvcmtmbG93IikgfHwgZ3JhcGhFbGVtLmdldE5vZGVOYW1lKCkKKyAgICAgICAgLmVxdWFscygiY29uZGl0aW9ucyIpKSAmJiB0aGlzLmV4ZWN1dGlvblR5cGUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigid29ya2Zsb3cgbW9kZWwgJyIgKyBncmFwaEVsZW0uZ2V0Tm9kZU5hbWUoKQorICAgICAgICAgICsgIicgbWlzc2luZyBleGVjdXRpb24gdHlwZSIpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmV4ZWN1dGlvblR5cGUgPSBncmFwaEVsZW0uZ2V0Tm9kZU5hbWUoKTsKKyAgICB9CisKKyAgICBpZiAoIXByb2Nlc3Nvcklkcy5jb250YWlucyh0aGlzLmV4ZWN1dGlvblR5cGUpKQorICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZXhlY3V0aW9uIHR5cGUgaWQgJyIKKyAgICAgICAgICArIHRoaXMuZXhlY3V0aW9uVHlwZSArICInIik7CisKKyAgICBpZiAoIWNoZWNrVmFsdWUodGhpcy5tb2RlbElkKSAmJiAhY2hlY2tWYWx1ZSh0aGlzLm1vZGVsSWRSZWYpKSB7CisgICAgICB0aGlzLm1vZGVsSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgIH0KKworICAgIGlmICh0aGlzLmFsaWFzICE9IG51bGwgJiYgIXRoaXMuYWxpYXMuZXF1YWxzKCIiKSkgeworICAgICAgdGhpcy5tb2RlbElkID0gdGhpcy5hbGlhczsKKyAgICB9CisgIH0KKworICBwdWJsaWMgR3JhcGgoKSB7CisgICAgdGhpcy50YXNrID0gbnVsbDsKKyAgICB0aGlzLmNvbmQgPSBudWxsOworICAgIHRoaXMud29ya2Zsb3cgPSBudWxsOworICAgIHRoaXMubW9kZWxJZFJlZiA9IG51bGw7CisgICAgdGhpcy5tb2RlbElkID0gbnVsbDsKKyAgICB0aGlzLm1vZGVsTmFtZSA9IG51bGw7CisgICAgdGhpcy5hbGlhcyA9IG51bGw7CisgICAgdGhpcy5leGVjdXRpb25UeXBlID0gbnVsbDsKKyAgICB0aGlzLm1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzID0gbnVsbDsKKyAgICB0aGlzLmV4Y3VzZWQgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICB0aGlzLmNsYXp6ID0gbnVsbDsKKyAgICB0aGlzLmNoaWxkcmVuID0gbmV3IFZlY3RvcjxHcmFwaD4oKTsKKyAgICB0aGlzLnBhcmVudCA9IG51bGw7CisgICAgdGhpcy50aW1lb3V0ID0gLTE7CisgICAgdGhpcy5vcHRpb25hbCA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBhcmVudAorICAgKi8KKyAgcHVibGljIEdyYXBoIGdldFBhcmVudCgpIHsKKyAgICByZXR1cm4gcGFyZW50OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwYXJlbnQKKyAgICogICAgICAgICAgdGhlIHBhcmVudCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFBhcmVudChHcmFwaCBwYXJlbnQpIHsKKyAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbgorICAgKi8KKyAgcHVibGljIExpc3Q8R3JhcGg+IGdldENoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZHJlbjsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY2hpbGRyZW4KKyAgICogICAgICAgICAgdGhlIGNoaWxkcmVuIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oTGlzdDxHcmFwaD4gY2hpbGRyZW4pIHsKKyAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbW9kZWxJZFJlZgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNb2RlbElkUmVmKCkgeworICAgIHJldHVybiBtb2RlbElkUmVmOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtb2RlbElkUmVmCisgICAqICAgICAgICAgIHRoZSBtb2RlbElkUmVmIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TW9kZWxJZFJlZihTdHJpbmcgbW9kZWxJZFJlZikgeworICAgIHRoaXMubW9kZWxJZFJlZiA9IG1vZGVsSWRSZWY7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbW9kZWxJZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNb2RlbElkKCkgeworICAgIHJldHVybiBtb2RlbElkOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtb2RlbElkCisgICAqICAgICAgICAgIHRoZSBtb2RlbElkIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TW9kZWxJZChTdHJpbmcgbW9kZWxJZCkgeworICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbW9kZWxOYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsTmFtZSgpIHsKKyAgICByZXR1cm4gbW9kZWxOYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtb2RlbE5hbWUKKyAgICogICAgICAgICAgdGhlIG1vZGVsTmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE1vZGVsTmFtZShTdHJpbmcgbW9kZWxOYW1lKSB7CisgICAgdGhpcy5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgYWxpYXMKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgcmV0dXJuIGFsaWFzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBhbGlhcworICAgKiAgICAgICAgICB0aGUgYWxpYXMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcgYWxpYXMpIHsKKyAgICB0aGlzLmFsaWFzID0gYWxpYXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZXhlY3V0aW9uVHlwZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRpb25UeXBlKCkgeworICAgIHJldHVybiBleGVjdXRpb25UeXBlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBleGVjdXRpb25UeXBlCisgICAqICAgICAgICAgIHRoZSBleGVjdXRpb25UeXBlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uVHlwZShTdHJpbmcgZXhlY3V0aW9uVHlwZSkgeworICAgIHRoaXMuZXhlY3V0aW9uVHlwZSA9IGV4ZWN1dGlvblR5cGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMoKSB7CisgICAgcmV0dXJuIG1pblJlcVN1Y2Nlc3NmdWxTdWJQcm9jZXNzb3JzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBtaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29ycworICAgKiAgICAgICAgICB0aGUgbWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29ycygKKyAgICAgIFN0cmluZyBtaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29ycykgeworICAgIHRoaXMubWluUmVxU3VjY2Vzc2Z1bFN1YlByb2Nlc3NvcnMgPSBtaW5SZXFTdWNjZXNzZnVsU3ViUHJvY2Vzc29yczsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBleGN1c2VkCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEV4Y3VzZWQoKSB7CisgICAgcmV0dXJuIGV4Y3VzZWQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGV4Y3VzZWQKKyAgICogICAgICAgICAgdGhlIGV4Y3VzZWQgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFeGN1c2VkKExpc3Q8U3RyaW5nPiBleGN1c2VkKSB7CisgICAgdGhpcy5leGN1c2VkID0gZXhjdXNlZDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjbGF6egorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDbGF6eigpIHsKKyAgICByZXR1cm4gY2xheno7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNsYXp6CisgICAqICAgICAgICAgIHRoZSBjbGF6eiB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENsYXp6KFN0cmluZyBjbGF6eikgeworICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0YXNrCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dUYXNrIGdldFRhc2soKSB7CisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHRhc2sKKyAgICogICAgICAgICAgdGhlIHRhc2sgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUYXNrKFdvcmtmbG93VGFzayB0YXNrKSB7CisgICAgdGhpcy50YXNrID0gdGFzazsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjb25kCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dDb25kaXRpb24gZ2V0Q29uZCgpIHsKKyAgICByZXR1cm4gY29uZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY29uZAorICAgKiAgICAgICAgICB0aGUgY29uZCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENvbmQoV29ya2Zsb3dDb25kaXRpb24gY29uZCkgeworICAgIHRoaXMuY29uZCA9IGNvbmQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgd29ya2Zsb3cKKyAgICovCisgIHB1YmxpYyBQYXJlbnRDaGlsZFdvcmtmbG93IGdldFdvcmtmbG93KCkgeworICAgIHJldHVybiB3b3JrZmxvdzsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gd29ya2Zsb3cKKyAgICogICAgICAgICAgdGhlIHdvcmtmbG93IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3coUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdykgeworICAgIHRoaXMud29ya2Zsb3cgPSB3b3JrZmxvdzsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMubW9kZWxJZDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0aW1lb3V0CisgICAqLworICBwdWJsaWMgbG9uZyBnZXRUaW1lb3V0KCkgeworICAgIHJldHVybiB0aW1lb3V0OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0aW1lb3V0CisgICAqICAgICAgICAgIHRoZSB0aW1lb3V0IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG9wdGlvbmFsCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworICAgIHJldHVybiBvcHRpb25hbDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gb3B0aW9uYWwKKyAgICogICAgICAgICAgdGhlIG9wdGlvbmFsIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiBvcHRpb25hbCkgeworICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzb3JJZHMKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvY2Vzc29ySWRzKCkgeworICAgIHJldHVybiBwcm9jZXNzb3JJZHM7CisgIH0KKyAgCisgIC8qKgorICAgKiAKKyAgICogQHJldHVybiBUcnVlIGlzIHtAbGluayAjY29uZH0gaXNuJ3QgbnVsbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNDb25kaXRpb24oKXsKKyAgICByZXR1cm4gdGhpcy5jb25kICE9IG51bGw7CisgIH0KKyAgCisgIC8qKgorICAgKiAKKyAgICogQHJldHVybiBUcnVlIGlmIHtAbGluayAjd29ya2Zsb3d9IGlzbid0IG51bGwsIGZhbHNlIG90aGV3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNXb3JrZmxvdygpeworICAgIHJldHVybiB0aGlzLndvcmtmbG93ICE9IG51bGw7CisgIH0KKyAgCisgIC8qKgorICAgKiAKKyAgICogQHJldHVybiBUcnVlIGlmIHtAbGluayAjdGFza30gaXNuJ3QgbnVsbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNUYXNrKCl7CisgICAgcmV0dXJuIHRoaXMudGFzayAhPSBudWxsOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscygiIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9IaWdoZXN0RklGT1ByaW9yaXR5U29ydGVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL0hpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc3OThjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9IaWdoZXN0RklGT1ByaW9yaXR5U29ydGVyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29yOworCisvKioKKyAqIAorICogU29ydHMgYmFzZWQgb24gaGlnaGVzdCB7QGxpbmsgUHJpb3JpdHl9IGZvciBhIHtAbGluayBXb3JrZmxvd1Byb2Nlc3Nvcn0gdXNpbmcKKyAqIGEgcGFydGljdWxhciB7QGxpbmsgI2Jvb3N0QW1vdW50fSBwcm92aWRlZCBieSBhIGNhbGxpbmcgcGFydHkuIFRoZQorICoge0BsaW5rICNib29zdEFtb3VudH0gaXMgY29tcHV0ZWQgYmFzZWQgb24gYSBmdW5jdGlvbiB0aGF0IGFsbG93cworICoge0BsaW5rICNib29zdEFtb3VudH0gdG8gZ3JvdyBvdmVyIHRpbWUgZGVwZW5kaW5nIG9uCisgKiB7QGxpbmsgI3NlY29uZHNCZXR3ZWVuQm9vc3RzfSBhbmQgYSBtYXhpbXVtIHtAbGluayAjYm9vc3RDYXB9LgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSGlnaGVzdEZJRk9Qcmlvcml0eVNvcnRlciBpbXBsZW1lbnRzIFByaW9yaXR5U29ydGVyIHsKKworICBwcml2YXRlIGludCBzZWNvbmRzQmV0d2VlbkJvb3N0czsKKyAgcHJpdmF0ZSBkb3VibGUgYm9vc3RBbW91bnQ7CisgIHByaXZhdGUgZG91YmxlIGJvb3N0Q2FwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyCisgICAgICAuZ2V0TG9nZ2VyKEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgSGlnaGVzdEZJRk9Qcmlvcml0eVNvcnRlcihpbnQgc2Vjb25kc0JldHdlZW5Cb29zdHMsCisgICAgICBkb3VibGUgYm9vc3RBbW91bnQsIGRvdWJsZSBib29zdENhcCkgeworICAgIHRoaXMuc2Vjb25kc0JldHdlZW5Cb29zdHMgPSBzZWNvbmRzQmV0d2VlbkJvb3N0czsKKyAgICB0aGlzLmJvb3N0QW1vdW50ID0gYm9vc3RBbW91bnQ7CisgICAgdGhpcy5ib29zdENhcCA9IGJvb3N0Q2FwOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZQorICAgKiBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHlTb3J0ZXIjc29ydChqYXZhLnV0aWwuTGlzdCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc29ydChMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBjYW5kaWRhdGVzKSB7CisKKyAgICBDb2xsZWN0aW9ucy5zb3J0KGNhbmRpZGF0ZXMsIG5ldyBDb21wYXJhdG9yPFdvcmtmbG93UHJvY2Vzc29yPigpIHsKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShXb3JrZmxvd1Byb2Nlc3NvciBvMSwgV29ya2Zsb3dQcm9jZXNzb3IgbzIpIHsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZVByaW9yaXR5KG8yKS5jb21wYXJlVG8oY2FsY3VsYXRlUHJpb3JpdHkobzEpKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHByaXZhdGUgRG91YmxlIGNhbGN1bGF0ZVByaW9yaXR5KFdvcmtmbG93UHJvY2Vzc29yIHByb2Nlc3NvclN0dWIpIHsKKyAgICBkb3VibGUgYWxpdmVUaW1lID0gMC4wOworCisgICAgdHJ5IHsKKyAgICAgIGFsaXZlVGltZSA9IChkb3VibGUpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHByb2Nlc3NvclN0dWIKKyAgICAgICAgICAuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgIlVuYWJsZSB0byBjb21wdXRlIGFsaXZlVGltZSBmb3IgY29tcHV0aW5nIEZJRk8gcHJpb3JpdHk6IFJlYXNvbjogWyIKKyAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7CisgICAgICBhbGl2ZVRpbWUgPSAwLjA7CisgICAgfQorCisgICAgZG91YmxlIGJvb3N0UGVyY2VudGFnZSA9IGFsaXZlVGltZSAvIDEwMDAuMAorICAgICAgICAvIChkb3VibGUpIHRoaXMuc2Vjb25kc0JldHdlZW5Cb29zdHM7CisgICAgcmV0dXJuIE1hdGgubWF4KAorICAgICAgICBwcm9jZXNzb3JTdHViLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpLmdldFZhbHVlKCksCisgICAgICAgIE1hdGgubWluKAorICAgICAgICAgICAgdGhpcy5ib29zdENhcCwKKyAgICAgICAgICAgIERvdWJsZS52YWx1ZU9mKHByb2Nlc3NvclN0dWIuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFByaW9yaXR5KCkKKyAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKQorICAgICAgICAgICAgICAgICsgKGJvb3N0UGVyY2VudGFnZSAqIHRoaXMuYm9vc3RBbW91bnQpKSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvSGlnaGVzdFByaW9yaXR5U29ydGVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL0hpZ2hlc3RQcmlvcml0eVNvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTk5MjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL0hpZ2hlc3RQcmlvcml0eVNvcnRlci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29yOworCisvKioKKyAqIAorICogU29ydHMgc3RyaWN0bHkgYmFzZWQgb24gYXNzb2NpYXRlZCB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3IjZ2V0UHJpb3JpdHkoKX0gaW4KKyAqIHJldmVyc2UgbmF0dXJhbCBvcmRlci4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQGF1dGhvciBiZm9zdGVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIEhpZ2hlc3RQcmlvcml0eVNvcnRlciBpbXBsZW1lbnRzIFByaW9yaXR5U29ydGVyIHsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Qcmlvcml0eVNvcnRlciNzb3J0KGphdmEudXRpbC5MaXN0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzb3J0KExpc3Q8V29ya2Zsb3dQcm9jZXNzb3I+IGNhbmRpZGF0ZXMpIHsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KGNhbmRpZGF0ZXMsIG5ldyBDb21wYXJhdG9yPFdvcmtmbG93UHJvY2Vzc29yPigpIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoV29ya2Zsb3dQcm9jZXNzb3IgbzEsIFdvcmtmbG93UHJvY2Vzc29yIG8yKSB7CisgICAgICAgIHJldHVybiBvMi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UHJpb3JpdHkoKQorICAgICAgICAgICAgLmNvbXBhcmVUbyhvMS5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UHJpb3JpdHkoKSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9QYXJlbnRDaGlsZFdvcmtmbG93LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1BhcmVudENoaWxkV29ya2Zsb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTVmM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9QYXJlbnRDaGlsZFdvcmtmbG93LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiAKKyAqIEEge0BsaW5rIFdvcmtmbG93fSBjb250YWluZXIgb2JqZWN0IHRoYXQgbWFwcyBhIFBhcmVudCBhbmQgYSBDaGlsZAorICoge0BsaW5rIFdvcmtmbG93fSBtb2RlbCBieSB1c2luZyB0aGUge0BsaW5rIEdyYXBofSBjb25zdHJ1Y3QuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUGFyZW50Q2hpbGRXb3JrZmxvdyBleHRlbmRzIFdvcmtmbG93IHsKKworICBwcml2YXRlIEdyYXBoIGdyYXBoOworCisgIHB1YmxpYyBQYXJlbnRDaGlsZFdvcmtmbG93KFdvcmtmbG93IHdvcmtmbG93KSB7CisgICAgc3VwZXIod29ya2Zsb3cuZ2V0TmFtZSgpLCB3b3JrZmxvdy5nZXRJZCgpLCB3b3JrZmxvdy5nZXRUYXNrcygpLCB3b3JrZmxvdworICAgICAgICAuZ2V0Q29uZGl0aW9ucygpKTsKKyAgICB0aGlzLmdyYXBoID0gbmV3IEdyYXBoKCk7CisgIH0KKworICBwdWJsaWMgUGFyZW50Q2hpbGRXb3JrZmxvdyhHcmFwaCBncmFwaCkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5ncmFwaCA9IGdyYXBoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlt3b3JrZmxvdyBpZD0iKTsKKyAgICBidWYuYXBwZW5kKHRoaXMuZ2V0SWQoKSk7CisgICAgYnVmLmFwcGVuZCgiLG5hbWU9Iik7CisgICAgYnVmLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7CisgICAgYnVmLmFwcGVuZCgiLHBhcmVudD0iKTsKKyAgICBidWYuYXBwZW5kKHRoaXMuZ3JhcGguZ2V0UGFyZW50KCkgIT0gbnVsbCA/IHRoaXMuZ3JhcGguZ2V0UGFyZW50KCkKKyAgICAgICAgLmdldE1vZGVsSWQoKSA6IG51bGwpOworICAgIGJ1Zi5hcHBlbmQoIixjaGlsZHJlbj0iKTsKKyAgICBidWYuYXBwZW5kKHRoaXMuZ3JhcGguZ2V0Q2hpbGRyZW4oKSk7CisgICAgYnVmLmFwcGVuZCgiLGV4ZWN1dGlvblR5cGU9Iik7CisgICAgYnVmLmFwcGVuZCh0aGlzLmdyYXBoLmdldEV4ZWN1dGlvblR5cGUoKSk7CisgICAgYnVmLmFwcGVuZCgiLHRhc2tzPSIpOworICAgIGZvciAoV29ya2Zsb3dUYXNrIHRhc2sgOiAoTGlzdDxXb3JrZmxvd1Rhc2s+KSB0aGlzLmdldFRhc2tzKCkpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIlt0YXNrIG5hbWU9Iik7CisgICAgICBidWYuYXBwZW5kKHRhc2suZ2V0VGFza05hbWUoKSk7CisgICAgICBidWYuYXBwZW5kKCIsaWQ9Iik7CisgICAgICBidWYuYXBwZW5kKHRhc2suZ2V0VGFza0lkKCkpOworICAgICAgYnVmLmFwcGVuZCgiLGluc3RhbmNlQ2xhc3M9Iik7CisgICAgICBidWYuYXBwZW5kKHRhc2suZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgICAgYnVmLmFwcGVuZCgiLHJlcXVpcmVkTWV0PSIpOworICAgICAgYnVmLmFwcGVuZCh0YXNrLmdldFJlcXVpcmVkTWV0RmllbGRzKCkpOworCisgICAgICBidWYuYXBwZW5kKCIsY29uZGl0aW9ucz0iKTsKKyAgICAgIGZvciAoV29ya2Zsb3dDb25kaXRpb24gY29uZCA6IChMaXN0PFdvcmtmbG93Q29uZGl0aW9uPikgdGFzaworICAgICAgICAgIC5nZXRDb25kaXRpb25zKCkpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiW2NvbmRpdGlvbiBuYW1lPSIpOworICAgICAgICBidWYuYXBwZW5kKGNvbmQuZ2V0Q29uZGl0aW9uTmFtZSgpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLGlkPSIpOworICAgICAgICBidWYuYXBwZW5kKGNvbmQuZ2V0Q29uZGl0aW9uSWQoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIixpbnN0YW5jZUNsYXNzPSIpOworICAgICAgICBidWYuYXBwZW5kKGNvbmQuZ2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIix0aW1lb3V0PSIpOworICAgICAgICBidWYuYXBwZW5kKGNvbmQuZ2V0VGltZW91dFNlY29uZHMoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIixvcHRpb25hPSIpOworICAgICAgICBidWYuYXBwZW5kKGNvbmQuaXNPcHRpb25hbCgpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLGNvbmZpZz0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChjb25kLmdldENvbmRDb25maWcoKS5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICBidWYuYXBwZW5kKCJdIik7CisgICAgICB9CisKKyAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZ3JhcGgKKyAgICovCisgIHB1YmxpYyBHcmFwaCBnZXRHcmFwaCgpIHsKKyAgICByZXR1cm4gZ3JhcGg7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGdyYXBoCisgICAqICAgICAgICAgIHRoZSBncmFwaCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEdyYXBoKEdyYXBoIGdyYXBoKSB7CisgICAgdGhpcy5ncmFwaCA9IGdyYXBoOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvUHJpb3JpdHkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvUHJpb3JpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZWExODUxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Qcmlvcml0eS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHM7CisKKy8qKgorICogCisgKiBQcmlvcml0eSBvZiBhIFdvcmtmbG93UHJvY2Vzc29yLgorICogCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpb3JpdHkgaW1wbGVtZW50cyBDb21wYXJhYmxlPFByaW9yaXR5PiB7CisKKyAgLyoqCisgICAqIEJpZyB0aGUgYmV0dGVyICh0aGF0IGlzIGhpZ2hlciB0aGUgbnVtYmVyIGhpZ2hlciB0aGUgcHJpb3JpdHkpCisgICAqIAorICAgKiBAcmV0dXJuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFZhbHVlKCk7CisKKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmlvcml0eSBMT1cgPSBuZXcgUHJpb3JpdHkoKSB7CisgICAgcHVibGljIGRvdWJsZSBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgIHJldHVybiAiTE9XIjsKKyAgICB9CisgIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpb3JpdHkgTUVESVVNX0xPVyA9IG5ldyBQcmlvcml0eSgpIHsKKyAgICBwdWJsaWMgZG91YmxlIGdldFZhbHVlKCkgeworICAgICAgcmV0dXJuIDIuNTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gIk1FRElVTV9MT1ciOworICAgIH0KKyAgfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmlvcml0eSBNRURJVU0gPSBuZXcgUHJpb3JpdHkoKSB7CisgICAgcHVibGljIGRvdWJsZSBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiA1OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgIHJldHVybiAiTUVESVVNIjsKKyAgICB9CisgIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpb3JpdHkgTUVESVVNX0hJR0ggPSBuZXcgUHJpb3JpdHkoKSB7CisgICAgcHVibGljIGRvdWJsZSBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiA3LjU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgcmV0dXJuICJNRURJVU1fSElHSCI7CisgICAgfQorICB9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIFByaW9yaXR5IEhJR0ggPSBuZXcgUHJpb3JpdHkoKSB7CisgICAgcHVibGljIGRvdWJsZSBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiAxMDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gIkhJR0giOworICAgIH0KKyAgfTsKKworICBwdWJsaWMgc3RhdGljIFByaW9yaXR5IGdldERlZmF1bHQoKSB7CisgICAgcmV0dXJuIE1FRElVTTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUHJpb3JpdHkgZ2V0UHJpb3JpdHkoZmluYWwgZG91YmxlIHByaW9yaXR5KSB7CisgICAgaWYgKHByaW9yaXR5ID09IExPVy5nZXRWYWx1ZSgpKQorICAgICAgcmV0dXJuIExPVzsKKyAgICBlbHNlIGlmIChwcmlvcml0eSA9PSBNRURJVU1fTE9XLmdldFZhbHVlKCkpCisgICAgICByZXR1cm4gTUVESVVNX0xPVzsKKyAgICBlbHNlIGlmIChwcmlvcml0eSA9PSBNRURJVU0uZ2V0VmFsdWUoKSkKKyAgICAgIHJldHVybiBNRURJVU07CisgICAgZWxzZSBpZiAocHJpb3JpdHkgPT0gTUVESVVNX0hJR0guZ2V0VmFsdWUoKSkKKyAgICAgIHJldHVybiBNRURJVU1fSElHSDsKKyAgICBlbHNlIGlmIChwcmlvcml0eSA9PSBISUdILmdldFZhbHVlKCkpCisgICAgICByZXR1cm4gSElHSDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbmV3IFByaW9yaXR5KCkgeworICAgICAgICBwdWJsaWMgZG91YmxlIGdldFZhbHVlKCkgeworICAgICAgICAgIHJldHVybiBwcmlvcml0eTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICByZXR1cm4gIkNVU1RPTSI7CisgICAgICAgIH0KKyAgICAgIH07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gbmV3IERvdWJsZSh0aGlzLmdldFZhbHVlKCkpLmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqIGluc3RhbmNlb2YgUHJpb3JpdHkpCisgICAgICByZXR1cm4gbmV3IERvdWJsZSh0aGlzLmdldFZhbHVlKCkpLmVxdWFscygoKFByaW9yaXR5KSBvYmopLmdldFZhbHVlKCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhQcmlvcml0eSBwcmlvcml0eSkgeworICAgIHJldHVybiBuZXcgRG91YmxlKHRoaXMuZ2V0VmFsdWUoKSkuY29tcGFyZVRvKHByaW9yaXR5LmdldFZhbHVlKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpICsgIiA6ICIgKyBEb3VibGUudG9TdHJpbmcodGhpcy5nZXRWYWx1ZSgpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1ByaW9yaXR5U29ydGVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1ByaW9yaXR5U29ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkN2M2MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvUHJpb3JpdHlTb3J0ZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29yOworCisvKioKKyAqIAorICogSW50ZXJmYWNlIHNwZWNpZnlpbmcgYSBtZXRob2QgdG8gc29ydCBhbmQgcHJpb3JpdGl6ZQorICoge0BsaW5rIFdvcmtmbG93UHJvY2Vzc29yfXMuCisgKiAKKyAqIEBhdXRob3IgYmZvc3RlcgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJpb3JpdHlTb3J0ZXIgeworCisgIC8qKgorICAgKiBTb3J0cyB0aGUge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd1Byb2Nlc3Nvcn1zIHRoYXQgYXJlIHJlYWR5IHRvIHJ1bgorICAgKiBpbiBhIHBhcnRpY3VsYXIgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBzdWItY2xhc3MgaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kLgorICAgKiAKKyAgICogQHBhcmFtIGNhbmRpZGF0ZXMKKyAgICogICAgICAgICAgVGhlIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3J9cyB0byBzb3J0IGluIHByaW9yaXR5CisgICAqICAgICAgICAgIG9yZGVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgc29ydChMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBjYW5kaWRhdGVzKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UYXNrSm9iLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rhc2tKb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNjNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UYXNrSm9iLmphdmEKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuZXhjZXB0aW9ucy5Kb2JJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lm1ldGFkYXRhLkNvcmVNZXRLZXlzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLldvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLlhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBSZXNvdXJjZSBNYW5hZ2VyIHtAbGluayBKb2J9IHRoYXQgcnVucyBhbiB1bmRlcmx5aW5nIHtAbGluayBXb3JrZmxvd1Rhc2t9LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRhc2tKb2IgaW1wbGVtZW50cyBKb2JJbnN0YW5jZSwgV29ya2Zsb3dTdGF0dXMsIENvcmVNZXRLZXlzeworCisgICAgLyogb3VyIGxvZyBzdHJlYW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihUYXNrSm9iLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBUYXNrSm9iKCkgeworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYkluc3RhbmNlI2V4ZWN1dGUob3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS5zdHJ1Y3RzLkpvYklucHV0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSm9iSW5wdXQgaW4pIHRocm93cyBKb2JJbnB1dEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKGluIGluc3RhbmNlb2YgVGFza0pvYklucHV0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYklucHV0RXhjZXB0aW9uKCJUYXNrIEpvYjogdW5rbm93biBKb2JJbnB1dCBjbGFzczogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBpbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBvdGhlcndpc2UsIHdlJ3JlIGFsbCBnb29kCisgICAgICAgIFRhc2tKb2JJbnB1dCB0YXNrSW5wdXQgPSAoVGFza0pvYklucHV0KSBpbjsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSB0aGUgV29ya2Zsb3cgVGFzayBJbnN0YW5jZQorICAgICAgICBXb3JrZmxvd1Rhc2tJbnN0YW5jZSBpbnN0ID0gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRUYXNrT2JqZWN0RnJvbUNsYXNzTmFtZSh0YXNrSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd1Rhc2tJbnN0YW5jZUNsYXNzTmFtZSgpKTsKKworICAgICAgICAvLyBvdmVycmlkZSB3aGF0IFByb2Nlc3NpbmdOb2RlIHdlIGFyZSBydW5uaW5nIG9uCisgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBtYW5hZ2VyIGJ5IGRlZmF1bHQgaW5zZXJ0cyBpdHMgb3duIGhvc3QKKyAgICAgICAgLy8gYXMgdGhlIFByb2Nlc3NpbmdOb2RlCisgICAgICAgIHRhc2tJbnB1dC5nZXREeW5NZXRhZGF0YSgpLnJlcGxhY2VNZXRhZGF0YShQUk9DRVNTSU5HX05PREUsCisgICAgICAgICAgICAgICAgZ2V0SG9zdG5hbWUoKSk7CisgICAgICAgIHVwZGF0ZU1ldGFkYXRhKHRhc2tJbnB1dC5nZXREeW5NZXRhZGF0YSgpKTsKKworICAgICAgICAvLyB1cGRhdGUgc3RhdHVzIHRvIHN0YXJ0ZWQgYWdhaW4gKG5vdyB0aGF0IHRoZSBqb2IgaXMgZGlzdHJpYnV0ZWQgYW5kCisgICAgICAgIC8vIGFib3V0IHRvIHJ1bgorICAgICAgICB1cGRhdGVTdGF0dXMoU1RBUlRFRCwgdGFza0lucHV0LmdldER5bk1ldGFkYXRhKCkpOworCisgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBwZXJzaXN0IHRoZSB3b3JrZmxvdyBpbnN0YW5jZSwgYWZ0ZXIgd2UKKyAgICAgICAgLy8gc2F2ZSB0aGUgY3VycmVudCB0YXNrIHN0YXJ0IGRhdGUgdGltZQorICAgICAgICBTdHJpbmcgY3VycmVudFRhc2tJc29TdGFydERhdGVUaW1lU3RyID0gRGF0ZUNvbnZlcnQKKyAgICAgICAgICAgICAgICAuaXNvRm9ybWF0KG5ldyBEYXRlKCkpOworICAgICAgICBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tTdGFydERhdGVUaW1lKAorICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrSXNvU3RhcnREYXRlVGltZVN0ciwgdGFza0lucHV0LmdldER5bk1ldGFkYXRhKCkpOworICAgICAgICBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tFbmREYXRlVGltZSgiIiwgdGFza0lucHV0CisgICAgICAgICAgICAgICAgLmdldER5bk1ldGFkYXRhKCkpOyAvKiBjbGVhciB0aGlzIG91dCAqLworCisgICAgICAgIC8vIG5vdyB3ZSBqdXN0IGNhbGwgaW5zdCB3aXRoIHRoZSBnaXZlbiB0YXNrIGNmZyBhbmQgbWV0YWRhdGEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluc3QucnVuKHRhc2tJbnB1dC5nZXREeW5NZXRhZGF0YSgpLCB0YXNrSW5wdXQuZ2V0VGFza0NvbmZpZygpKTsKKyAgICAgICAgfSBjYXRjaCAoV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpvYklucHV0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcnVuIHRhc2siLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjdXJyZW50VGFza0lzb0VuZERhdGVUaW1lU3RyID0gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KG5ldyBEYXRlKCkpOworICAgICAgICBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tFbmREYXRlVGltZShjdXJyZW50VGFza0lzb0VuZERhdGVUaW1lU3RyLAorICAgICAgICAgICAgICAgIHRhc2tJbnB1dC5nZXREeW5NZXRhZGF0YSgpKTsKKworICAgICAgICAvLyBub3cgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIHdvcmtmbG93IG1hbmFnZXIgd2l0aCB0aGUgbWV0YWRhdGEKKyAgICAgICAgLy8gdGhhdCBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQKKyAgICAgICAgdXBkYXRlTWV0YWRhdGEodGFza0lucHV0LmdldER5bk1ldGFkYXRhKCkpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoU3RyaW5nIHN0YXR1cywgTWV0YWRhdGEgbWV0KSB7CisgICAgICAgIFN0cmluZyB3b3JrZmxvd0luc3RJZCA9IG1ldC5nZXRNZXRhZGF0YShXT1JLRkxPV19JTlNUX0lEKTsKKyAgICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IHdDbGllbnQgPSBnZXRXbUNsaWVudEZyb21NZXRhZGF0YShtZXQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXdDbGllbnQudXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyh3b3JrZmxvd0luc3RJZCwgc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gdXBkYXRlIHN0YXR1cyBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0SWQgKyAiXSB0byA6IFsiICsgc3RhdHVzICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1ldGFkYXRhKE1ldGFkYXRhIG1ldCkgeworICAgICAgICBTdHJpbmcgd29ya2Zsb3dJbnN0SWQgPSBtZXQuZ2V0TWV0YWRhdGEoV09SS0ZMT1dfSU5TVF9JRCk7CisgICAgICAgIFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCB3Q2xpZW50ID0gZ2V0V21DbGllbnRGcm9tTWV0YWRhdGEobWV0KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCF3Q2xpZW50LnVwZGF0ZU1ldGFkYXRhRm9yV29ya2Zsb3cod29ya2Zsb3dJbnN0SWQsIG1ldCkpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHVwZGF0ZSBNZXRhZGF0YSBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0SWQgKyAiXSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V29ya2Zsb3dJbnN0YW5jZUN1cnJlbnRUYXNrU3RhcnREYXRlVGltZSgKKyAgICAgICAgICAgIFN0cmluZyBzdGFydERhdGVUaW1lLCBNZXRhZGF0YSBtZXQpIHsKKyAgICAgICAgU3RyaW5nIHdvcmtmbG93SW5zdElkID0gbWV0LmdldE1ldGFkYXRhKFdPUktGTE9XX0lOU1RfSUQpOworICAgICAgICBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgd0NsaWVudCA9IGdldFdtQ2xpZW50RnJvbU1ldGFkYXRhKG1ldCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghd0NsaWVudC5zZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tTdGFydERhdGVUaW1lKAorICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3RJZCwgc3RhcnREYXRlVGltZSkpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHVwZGF0ZSBzdGFydCBkYXRlIHRpbWUgZm9yIHdvcmtmbG93IGluc3RhbmNlOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdvcmtmbG93SW5zdElkICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza0VuZERhdGVUaW1lKFN0cmluZyBlbmREYXRlVGltZSwKKyAgICAgICAgICAgIE1ldGFkYXRhIG1ldCkgeworICAgICAgICBTdHJpbmcgd29ya2Zsb3dJbnN0SWQgPSBtZXQuZ2V0TWV0YWRhdGEoV09SS0ZMT1dfSU5TVF9JRCk7CisgICAgICAgIFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCB3Q2xpZW50ID0gZ2V0V21DbGllbnRGcm9tTWV0YWRhdGEobWV0KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCF3Q2xpZW50LnNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza0VuZERhdGVUaW1lKAorICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3RJZCwgZW5kRGF0ZVRpbWUpKSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byB1cGRhdGUgZW5kIGRhdGUgdGltZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2U6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0SWQgKyAiXSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCBnZXRXbUNsaWVudEZyb21NZXRhZGF0YShNZXRhZGF0YSBtZXQpIHsKKyAgICAgICAgU3RyaW5nIHdvcmtmbG93TWdyVXJsU3RyID0gbWV0LmdldE1ldGFkYXRhKFdPUktGTE9XX01BTkFHRVJfVVJMKTsKKyAgICAgICAgaWYgKHdvcmtmbG93TWdyVXJsU3RyID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAod29ya2Zsb3dNZ3JVcmxTdHIgIT0gbnVsbCAmJiB3b3JrZmxvd01nclVybFN0ci5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIGRlZmF1bHQgdG8gYSB3b3JrZmxvdyBtZ3Igb24gbG9jYWxob3N0CisgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSB3b24ndCB3b3JrLCBidXQgd29ydGggdHJ5aW5nCisgICAgICAgICAgICB3b3JrZmxvd01nclVybFN0ciA9ICJodHRwOi8vbG9jYWxob3N0OjkwMDEiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQoCisgICAgICAgICAgICAgICAgc2FmZUdldFVybEZyb21TdHJpbmcod29ya2Zsb3dNZ3JVcmxTdHIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRIb3N0bmFtZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEdldCBob3N0bmFtZSBieSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIElQIGFkZHJlc3MKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgaG9zdCBuYW1lCisgICAgICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSBhZGRyLmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gaG9zdG5hbWU7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFVSTCBzYWZlR2V0VXJsRnJvbVN0cmluZyhTdHJpbmcgdXJsU3RyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxTdHIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvVGFza0pvYklucHV0LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rhc2tKb2JJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTNlNjEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rhc2tKb2JJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2Uuc3RydWN0cy5Kb2JJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuWG1sUnBjU3RydWN0RmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICoge0BsaW5rIEpvYklucHV0fSBmb3IgYSB7QGxpbmsgV29ya2Zsb3dUYXNrfS4gVGhpcyBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZAorICogYnkgdGhlIFJlc291cmNlIE1hbmFnZXIgd2hlbiBpdCByZWNlaXZlcyBhIHtAbGluayBUYXNrSm9ifS4gVGhlIGNsYXNzCisgKiBjb25zaXN0cyBvZiB0aHJlZSBpbXBvcnRhbnQgcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICogCisgKiA8dWw+CisgKiA8bGk+U3RhdGljIHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufTwvbGk+CisgKiA8bGk+RHluYW1pYyBUYXNrIHtAbGluayBNZXRhZGF0YX08L2xpPgorICogPGxpPlRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3dUYXNrSW5zdGFuY2V9IGNsYXNzPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGFza0pvYklucHV0IGltcGxlbWVudHMgSm9iSW5wdXQgeworCisgIC8qIHN0YXRpYyB0YXNrIGNvbmZpZyAqLworICBwcml2YXRlIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gdGFza0NvbmZpZyA9IG51bGw7CisKKyAgLyogZHluYW1pYyB0YXNrIG1ldGFkYXRhICovCisgIHByaXZhdGUgTWV0YWRhdGEgZHluTWV0YWRhdGEgPSBudWxsOworCisgIC8qIG91ciBqb2IgaWQgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOworICAKKyAgLyogdGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93IHRhc2sgaW5zdGFuY2UgdG8gaW5zdGFudGlhdGUKKyAgICogYWdhaW5zdCB0aGlzIGlucHV0CisgICAqLworICBwcml2YXRlIFN0cmluZyB3b3JrZmxvd1Rhc2tJbnN0YW5jZUNsYXNzTmFtZSA9IG51bGw7CisgIAorCisgIC8qKgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKi8KKyAgcHVibGljIFRhc2tKb2JJbnB1dCgpIHsKKyAgICB0YXNrQ29uZmlnID0gbmV3IFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oKTsKKyAgICBkeW5NZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQuY2FzLnJlc291cmNlLnN0cnVjdHMuSm9iSW5wdXQjZ2V0SWQoKQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5YbWxScGNXcml0ZWFibGUjcmVhZChqYXZhLmxhbmcuT2JqZWN0KQorICAgKi8KKyAgcHVibGljIHZvaWQgcmVhZChPYmplY3QgaW4pIHsKKyAgICBpZiAoIShpbiBpbnN0YW5jZW9mIEhhc2h0YWJsZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIYXNodGFibGUgaW5IYXNoID0gKEhhc2h0YWJsZSkgaW47CisKKyAgICB0aGlzLnRhc2tDb25maWcgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgIC5nZXRXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uRnJvbVhtbFJwYygoSGFzaHRhYmxlKSBpbkhhc2gKKyAgICAgICAgICAgIC5nZXQoInRhc2suY29uZmlnIikpOworICAgIHRoaXMuZHluTWV0YWRhdGEuYWRkTWV0YWRhdGEoKEhhc2h0YWJsZSkgaW5IYXNoLmdldCgidGFzay5tZXRhZGF0YSIpKTsKKyAgICB0aGlzLndvcmtmbG93VGFza0luc3RhbmNlQ2xhc3NOYW1lID0gKFN0cmluZylpbkhhc2guZ2V0KCJ0YXNrLmluc3RhbmNlLmNsYXNzIik7CisKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy5yZXNvdXJjZS51dGlsLlhtbFJwY1dyaXRlYWJsZSN3cml0ZSgpCisgICAqLworICBwdWJsaWMgT2JqZWN0IHdyaXRlKCkgeworICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgaGFzaHRhYmxlIHdpdGggdGhlIHRhc2sgbWV0YWRhdGEgYW5kIHRoZSB0YXNrIGNvbmZpZworICAgIEhhc2h0YWJsZSBvdXRIYXNoID0gbmV3IEhhc2h0YWJsZSgpOworICAgIG91dEhhc2gucHV0KCJ0YXNrLmNvbmZpZyIsIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24odGhpcy50YXNrQ29uZmlnKSk7CisgICAgb3V0SGFzaC5wdXQoInRhc2subWV0YWRhdGEiLCB0aGlzLmR5bk1ldGFkYXRhLmdldEhhc2h0YWJsZSgpKTsKKyAgICBvdXRIYXNoLnB1dCgidGFzay5pbnN0YW5jZS5jbGFzcyIsIHRoaXMud29ya2Zsb3dUYXNrSW5zdGFuY2VDbGFzc05hbWUpOworICAgIHJldHVybiBvdXRIYXNoOworICB9CisKKyAgcHVibGljIE1ldGFkYXRhIGdldER5bk1ldGFkYXRhKCkgeworICAgIHJldHVybiBkeW5NZXRhZGF0YTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldER5bk1ldGFkYXRhKE1ldGFkYXRhIGR5bk1ldGFkYXRhKSB7CisgICAgdGhpcy5keW5NZXRhZGF0YSA9IGR5bk1ldGFkYXRhOworICB9CisKKyAgcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gZ2V0VGFza0NvbmZpZygpIHsKKyAgICByZXR1cm4gdGFza0NvbmZpZzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRhc2tDb25maWcoV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiB0YXNrQ29uZmlnKSB7CisgICAgdGhpcy50YXNrQ29uZmlnID0gdGFza0NvbmZpZzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2Zsb3dUYXNrSW5zdGFuY2VDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIHdvcmtmbG93VGFza0luc3RhbmNlQ2xhc3NOYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0V29ya2Zsb3dUYXNrSW5zdGFuY2VDbGFzc05hbWUoCisgICAgICBTdHJpbmcgd29ya2Zsb3dUYXNrSW5zdGFuY2VDbGFzc05hbWUpIHsKKyAgICB0aGlzLndvcmtmbG93VGFza0luc3RhbmNlQ2xhc3NOYW1lID0gd29ya2Zsb3dUYXNrSW5zdGFuY2VDbGFzc05hbWU7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMucmVzb3VyY2UudXRpbC5Db25maWd1cmFibGUjY29uZmlndXJlKGphdmEudXRpbC5Qcm9wZXJ0aWVzKQorICAgKi8KKyAgcHVibGljIHZvaWQgY29uZmlndXJlKFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAvLyBsb29raW5nIGZvciBkeW4ubWV0YWRhdGEuZmlsZQorICAgIC8vIGxvb2tpbmcgZm9yIHN0YXRpYy5jb25maWcuZmlsZQorICAgIFN0cmluZyBzdGF0aWNDb25maWdGaWxlID0gcHJvcHMuZ2V0UHJvcGVydHkoInN0YXRpYy5jb25maWcuZmlsZSIpOworICAgIFN0cmluZyBkeW5NZXRhZGF0YUZpbGUgPSBwcm9wcy5nZXRQcm9wZXJ0eSgiZHluLm1ldGFkYXRhLmZpbGUiKTsKKworICAgIGlmIChzdGF0aWNDb25maWdGaWxlICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMudGFza0NvbmZpZy5nZXRQcm9wZXJ0aWVzKCkubG9hZCgKKyAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoc3RhdGljQ29uZmlnRmlsZSkpKTsKKyAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7ICAKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZHluTWV0YWRhdGFGaWxlICE9IG51bGwpIHsKKyAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuZHluTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgUHJvcGVydGllcyBmaWxlUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZHluTWV0YWRhdGFGaWxlKSkpOworICAgICAgICBmaWxlUHJvcHMubG9hZChpbik7CisgICAgICAgIGZvciAoT2JqZWN0IGtleTogZmlsZVByb3BzLmtleVNldCgpKXsKKyAgICAgICAgICBTdHJpbmcga2V5U3RyID0gKFN0cmluZylrZXk7CisgICAgICAgICAgdGhpcy5keW5NZXRhZGF0YS5hZGRNZXRhZGF0YShrZXlTdHIsIGZpbGVQcm9wcy5nZXRQcm9wZXJ0eShrZXlTdHIpKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChpbiAhPSBudWxsKSB0cnkgeworICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzZWQxNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3cuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogCisgKiAKKyAqIEEgV29ya2Zsb3cgaXMgYW4gYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgb2YgaW50ZXJjb25uZWN0ZWQKKyAqIHByb2Nlc3Nlcy4gUHJvY2Vzc2VzLCBvciBqb2JzLCBtYXkgaGF2ZSBkZXBlbmRlbmNpZXMgdXBvbiBvbmUgYW5vdGhlciwgbWF5CisgKiBwcm92aWRlIGVhY2ggb3RoZXIgaW5wdXQsIGFuZC9vciBvdXRwdXQsIG9yIG1heSBiZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mCisgKiBvbmUgYW5vdGhlci4KKyAqIAorICogPGJyPgorICogU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JpZGJ1cy5vcmcvcmVwb3J0cy9HcmlkV29ya2Zsb3dUYXhvbm9teS5wZGYiPkJ1eXlhCisgKiBldCBhbC48L2E+IGZvciBhIGdyZWF0IGRlc2NyaXB0aW9uIGluIGRldGFpbCBvZiB3aGF0IGV4YWN0bHkgYSBXb3JrZmxvdyBpcy4KKyAqIAorICogPGJyPgorICogSW1wb3J0YW50IG5vdGU6IEFzIG9mIEFwYWNoZSBPT0RUIDAuNCwgV29ya2Zsb3dzIG5vdyBzdXBwb3J0IGJvdGggcHJlLSBhbmQgCisgKiBwb3N0LSBjb25kaXRpb25zIChhcyBvcHBvc2VkIHRvIGp1c3QgcHJlLWNvbmRpdGlvbnMsIGFzIHdhcyB0aGUgYmVoYXZpb3IpCisgKiBiZWZvcmUuIFRoZSBtZXRob2RzIHtAbGluayAjZ2V0Q29uZGl0aW9ucygpfSBhbmQge0BsaW5rICNzZXRDb25kaXRpb25zKExpc3QpfSBhcmUKKyAqIG5vdyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZWlyIHtAbGluayAjZ2V0UHJlQ29uZGl0aW9ucygpfSBhbmQge0BsaW5rICNzZXRQcmVDb25kaXRpb25zKExpc3QpfQorICogYW5kIHtAbGluayAjZ2V0UG9zdENvbmRpdGlvbnMoKX0gYW5kIHtAbGluayAjc2V0UG9zdENvbmRpdGlvbnMoTGlzdCl9IGNvdW50ZXJwYXJ0cy4KKyAqIFRoZSBleGlzdGluZyBjb25kaXRpb24gb25seSBtZXRob2RzIGhhdmUgYmVlbiBwcmVzZXJ2ZWQgZm9yIGJhY2sgY29tcGF0LCBidXQgd2lsbAorICogZ28gYXdheSBpbiBsYXRlciB2ZXJzaW9ucyBvZiB0aGUgY2xhc3MgYW5kIEFQSS4gQWxzbyBvdmVyIHRoZSBuZXh0IGZldyByZWxlYXNlcywKKyAqIHdlIGludGVuZCB0byBjaGFuZ2UgdGhlIGlubmVyIEFQSXMgdG8gdXNlIHByZSBhbmQgcG9zdCBjb25kaXRpb25zLgorICogCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3cgeworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKyAgcHJpdmF0ZSBMaXN0PFdvcmtmbG93VGFzaz4gdGFza3M7CisKKyAgcHJpdmF0ZSBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBwcmVDb25kaXRpb25zOworCisgIHByaXZhdGUgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gcG9zdENvbmRpdGlvbnM7CisKKyAgLyoqCisgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICogCisgICAqLworICBwdWJsaWMgV29ya2Zsb3coKSB7CisgICAgdGhpcyhudWxsLCBudWxsLCBuZXcgVmVjdG9yPFdvcmtmbG93VGFzaz4oKSwgbmV3IFZlY3RvcjxXb3JrZmxvd0NvbmRpdGlvbj4oKSwgCisgICAgICAgIG5ldyBWZWN0b3I8V29ya2Zsb3dDb25kaXRpb24+KCkpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgV29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gRGVwcmVjYXRlZC4gVXNlCisgICAqIHtAbGluayAjV29ya2Zsb3coU3RyaW5nLCBTdHJpbmcsIExpc3QsIExpc3QsIExpc3QpfSBpbnN0ZWFkLgorICAgKiAKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyB3b3JrZmxvdy4KKyAgICogQHBhcmFtIGlkCisgICAqICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHdvcmtmbG93LgorICAgKiBAcGFyYW0gdGFza3MKKyAgICogICAgICAgICAgVGhlIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICogICAgICAgICAgd29ya2Zsb3cuCisgICAqIAorICAgKiBAcGFyYW0gY29uZGl0aW9ucworICAgKiAgICAgICAgICBUaGUge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zIGFzc29jaWF0ZWQgd2l0aAorICAgKiAgICAgICAgICB0aGlzIHdvcmtmbG93LgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFdvcmtmbG93KFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIExpc3Q8V29ya2Zsb3dUYXNrPiB0YXNrcywKKyAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMpIHsKKyAgICB0aGlzKG5hbWUsIGlkLCB0YXNrcywgY29uZGl0aW9ucywKKyAgICAgICAgbmV3IFZlY3RvcjxXb3JrZmxvd0NvbmRpdGlvbj4oKSk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEBwYXJhbSBuYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBXb3JrZmxvdy4KKyAgICogQHBhcmFtIGlkCisgICAqICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBXb3JrZmxvdy4KKyAgICogQHBhcmFtIHRhc2tzCisgICAqICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMuCisgICAqIEBwYXJhbSBwcmVDb25kaXRpb25zCisgICAqICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBMaXN0fSBvZiBwcmUte0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMuCisgICAqIEBwYXJhbSBwb3N0Q29uZGl0aW9ucworICAgKiAgICAgICAgICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgTGlzdH0gb2YgcG9zdHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zLgorICAgKi8KKyAgcHVibGljIFdvcmtmbG93KFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIExpc3Q8V29ya2Zsb3dUYXNrPiB0YXNrcywKKyAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IHByZUNvbmRpdGlvbnMsCisgICAgICBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBwb3N0Q29uZGl0aW9ucykgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMudGFza3MgPSB0YXNrczsKKyAgICB0aGlzLnByZUNvbmRpdGlvbnMgPSBwcmVDb25kaXRpb25zOworICAgIHRoaXMucG9zdENvbmRpdGlvbnMgPSBwb3N0Q29uZGl0aW9uczsKKworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGlkCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgIHJldHVybiBpZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gaWQKKyAgICogICAgICAgICAgdGhlIGlkIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgdGhpcy5pZCA9IGlkOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIERlcHJlY2F0ZWQuIEN1cnJlbnRseSwgdGhpcyB3aWxsIHJldHVybiBhIGxpc3QKKyAgICogb2YgYWxsIHByZS0ge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMuIFRoZSBsaXN0CisgICAqIGlzIG11dGFibGUsIGFuZCBjYW4gY2hhbmdlIHRoZSBpbm5lciBwb3J0aW9uIG9mIHRoZQorICAgKiBjbGFzcy4gCisgICAqIAorICAgKiBAcmV0dXJuIEFsbCBwcmUtIGNvbmRpdGlvbnMuCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0Q29uZGl0aW9ucygpIHsKKyAgICByZXR1cm4gdGhpcy5wcmVDb25kaXRpb25zOworICB9CisKKyAgLyoqCisgICAqIERlcHJlY2F0ZWQuIFVzZSB7QGxpbmsgI3NldFByZUNvbmRpdGlvbnMoTGlzdCl9IG9yIAorICAgKiB7QGxpbmsgI3NldFBvc3RDb25kaXRpb25zKExpc3QpfSBpbnN0ZWFkLgorICAgKiAKKyAgICogQHBhcmFtIGNvbmRpdGlvbnMKKyAgICogICAgICAgICAgdGhlIGNvbmRpdGlvbnMgdG8gc2V0CisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb25zKExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMpIHsKKyAgICB0aGlzLnByZUNvbmRpdGlvbnMgPSBjb25kaXRpb25zOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0YXNrcworICAgKiAgICAgICAgICB0aGUgdGFza3MgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUYXNrcyhMaXN0PFdvcmtmbG93VGFzaz4gdGFza3MpIHsKKyAgICB0aGlzLnRhc2tzID0gdGFza3M7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgdGFza3MKKyAgICovCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93VGFzaz4gZ2V0VGFza3MoKSB7CisgICAgcmV0dXJuIHRhc2tzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHByZUNvbmRpdGlvbnMKKyAgICovCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBnZXRQcmVDb25kaXRpb25zKCkgeworICAgIHJldHVybiBwcmVDb25kaXRpb25zOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwcmVDb25kaXRpb25zIHRoZSBwcmVDb25kaXRpb25zIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UHJlQ29uZGl0aW9ucyhMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBwcmVDb25kaXRpb25zKSB7CisgICAgdGhpcy5wcmVDb25kaXRpb25zID0gcHJlQ29uZGl0aW9uczsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBwb3N0Q29uZGl0aW9ucworICAgKi8KKyAgcHVibGljIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGdldFBvc3RDb25kaXRpb25zKCkgeworICAgIHJldHVybiBwb3N0Q29uZGl0aW9uczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcG9zdENvbmRpdGlvbnMgdGhlIHBvc3RDb25kaXRpb25zIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UG9zdENvbmRpdGlvbnMoTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gcG9zdENvbmRpdGlvbnMpIHsKKyAgICB0aGlzLnBvc3RDb25kaXRpb25zID0gcG9zdENvbmRpdGlvbnM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd0NvbmRpdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd0NvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDY4YmUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93Q29uZGl0aW9uLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLyoqCisgKiAKKyAqIEEgV29ya2Zsb3dDb25kaXRpb24gaXMgc29tZSBwcmUtY29uZGl0aW9uIHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGluIG9yZGVyCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHtAbGluayBXb3JrZmxvd1Rhc2t9IHRvIGJlIHBlcm1pdHRlZCB0byBleGVjdXRlIC4KKyAqIAorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93Q29uZGl0aW9uIHsKKworICAvKiB0aGUgbmFtZSBvZiB0aGUgY29uZGl0aW9uICovCisgIHByaXZhdGUgU3RyaW5nIGNvbmRpdGlvbk5hbWUgPSBudWxsOworCisgIC8qIHRoZSBpZCBmb3IgdGhlIGNvbmRpdGlvbiAqLworICBwcml2YXRlIFN0cmluZyBjb25kaXRpb25JZCA9IG51bGw7CisKKyAgLyogdGhlIGFjdHVhbCBwb3J0aW9uIG9mIHRoZSBjb25kaXRpb24gdGhhdCBwZXJmb3JtcyB0aGUgd29yayAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lID0gbnVsbDsKKworICAvKiB0aGUgb3JkZXIgdGhhdCB0aGlzIGNvbmRpdGlvbiBjb21lcyBpbiAqLworICBwcm90ZWN0ZWQgaW50IG9yZGVyID0gLTE7CisKKyAgLyogdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25kaXRpb24gKi8KKyAgcHJvdGVjdGVkIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBjb25kQ29uZmlnOworICAKKyAgcHJpdmF0ZSBsb25nIHRpbWVvdXRTZWNvbmRzOworICAKKyAgcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOworCisgIC8qKgorICAgKiA8cD4KKyAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgKiA8L3A+CisgICAqIAorICAgKi8KKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uKCkgeworICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgLTEpOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFdvcmtmbG93Q29uZGl0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gY29uZGl0aW9uTmFtZQorICAgKiAgICAgICAgICBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25kaXRpb24uCisgICAqIEBwYXJhbSBjb25kaXRpb25JZAorICAgKiAgICAgICAgICBUaGUgSUQgZm9yIHRoaXMgY29uZGl0aW9uLgorICAgKiBAcGFyYW0gaW5zdGFuY2VDbGFzcworICAgKiAgICAgICAgICBUaGUgcGFydGljdWxhciBpbnN0YW5jZSBjbGFzcyBuYW1lIGF0dGFjaGVkIHRvIHRoaXMKKyAgICogICAgICAgICAgV29ya2Zsb3dDb25kaXRpb24uCisgICAqIEBwYXJhbSBvcmRlcgorICAgKiAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggdGhpcyBjb25kaXRpb24gc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGEKKyAgICogICAgICAgICAgcGFydGljdWxhciBXb3JrZmxvd1Rhc2suCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbk5hbWUsIFN0cmluZyBjb25kaXRpb25JZCwKKyAgICAgIFN0cmluZyBpbnN0YW5jZUNsYXNzLCBpbnQgb3JkZXIpIHsKKyAgICB0aGlzLmNvbmRpdGlvbk5hbWUgPSBjb25kaXRpb25OYW1lOworICAgIHRoaXMuY29uZGl0aW9uSWQgPSBjb25kaXRpb25JZDsKKyAgICB0aGlzLmNvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lID0gaW5zdGFuY2VDbGFzczsKKyAgICB0aGlzLm9yZGVyID0gb3JkZXI7CisgICAgdGhpcy50aW1lb3V0U2Vjb25kcyA9IC0xOworICAgIHRoaXMuY29uZENvbmZpZyA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24oKTsKKyAgICB0aGlzLm9wdGlvbmFsID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0YXNrQ29uZmlnLgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBnZXRUYXNrQ29uZmlnKCkgeworICAgIHJldHVybiB0aGlzLmNvbmRDb25maWc7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHRhc2tDb25maWcKKyAgICogICAgICAgICAgVGhlIHRhc2tDb25maWcgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29uZENvbmZpZyhXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24gY29uZENvbmZpZykgeworICAgIHRoaXMuY29uZENvbmZpZyA9IGNvbmRDb25maWc7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29uZENvbmZpZworICAgKi8KKyAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBnZXRDb25kQ29uZmlnKCkgeworICAgIHJldHVybiB0aGlzLmNvbmRDb25maWc7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25kaXRpb25JZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uSWQoKSB7CisgICAgcmV0dXJuIGNvbmRpdGlvbklkOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjb25kaXRpb25JZAorICAgKiAgICAgICAgICBUaGUgY29uZGl0aW9uSWQgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uSWQoU3RyaW5nIGNvbmRpdGlvbklkKSB7CisgICAgdGhpcy5jb25kaXRpb25JZCA9IGNvbmRpdGlvbklkOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29uZGl0aW9uTmFtZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uTmFtZSgpIHsKKyAgICByZXR1cm4gY29uZGl0aW9uTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY29uZGl0aW9uTmFtZQorICAgKiAgICAgICAgICBUaGUgY29uZGl0aW9uTmFtZSB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb25OYW1lKFN0cmluZyBjb25kaXRpb25OYW1lKSB7CisgICAgdGhpcy5jb25kaXRpb25OYW1lID0gY29uZGl0aW9uTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpIHsKKyAgICByZXR1cm4gY29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lCisgICAqICAgICAgICAgIFRoZSBjb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZShTdHJpbmcgY29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUpIHsKKyAgICB0aGlzLmNvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lID0gY29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcmRlci4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CisgICAgcmV0dXJuIG9yZGVyOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBvcmRlcgorICAgKiAgICAgICAgICBUaGUgb3JkZXIgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0T3JkZXIoaW50IG9yZGVyKSB7CisgICAgdGhpcy5vcmRlciA9IG9yZGVyOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHRpbWVvdXRTZWNvbmRzCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRUaW1lb3V0U2Vjb25kcygpIHsKKyAgICByZXR1cm4gdGltZW91dFNlY29uZHM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHRpbWVvdXRTZWNvbmRzIHRoZSB0aW1lb3V0U2Vjb25kcyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXRTZWNvbmRzKGxvbmcgdGltZW91dFNlY29uZHMpIHsKKyAgICB0aGlzLnRpbWVvdXRTZWNvbmRzID0gdGltZW91dFNlY29uZHM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgb3B0aW9uYWwKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisgICAgcmV0dXJuIG9wdGlvbmFsOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBvcHRpb25hbCB0aGUgb3B0aW9uYWwgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7CisgICAgdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGI3MjUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIAorICogQ29uZmlndXJhdGlvbiBmb3IgYSB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259LgorICoKKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiB7CisgICAKKyAgICAvKiB0aGUgY29uZGl0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyAqLworICAgIHByaXZhdGUgUHJvcGVydGllcyBjb25kUHJvcGVydGllcyA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgY29uZFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGZyb20gYSBqYXZhIFByb3BlcnRpZXMgb2JqZWN0LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcworICAgICAqICAgICAgICAgICAgVGhlIHRhc2sgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24oUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGNvbmRQcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBBZGRzIHRoZSBwcm9wZXJ0eSBkZW5vdGVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5uYW1lPjwvY29kZT4gYW5kCisgICAgICogPGNvZGU+dmFsdWU8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICBUaGUgcHJvcGVydHkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlnUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjb25kUHJvcGVydGllcy5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICBUaGUgcHJvcGVydHkgdG8gZ2V0IHRoZSB2YWx1ZSBmb3IuCisgICAgICogQHJldHVybiBUaGUgU3RyaW5nIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHByb3BOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7CisgICAgICAgIHJldHVybiBjb25kUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByb3BlcnRpZXN9IGZvciBjb25maWd1cmluZyB0aGlzIFdvcmtmbG93VGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gY29uZFByb3BlcnRpZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTEwN2YKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBhY3R1YWwgZXZhbHVhdGlvbiBtZXRob2QgZm9yIHRoZSBjb25kaXRpb24gc2hvdWxkIGJlIGRlZmluZWQgaW4gYW55IGNsYXNzCisgKiB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSB7CisKKwkvKioKKwkgKiA8cD4KKwkgKiBUaGUgYWN0dWFsIGNvbmRpdGlvbmFsOiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCisJICogdGhlIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQsIG90aGVyd2lzZSwgZmFsc2UuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBtZXRhZGF0YQorCSAqICAgICAgICAgICAgQW55IG1ldGFkYXRhIG5lZWRlZCBieSB0aGUgY29uZGl0aW9uYWwgdG8gZGV0ZXJtaW5lCisJICogICAgICAgICAgICBzYXRpc2ZhY3Rpb24uCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgc2F0aXNmaWVkLCBvdGhlcndpc2UsIGZhbHNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE1ldGFkYXRhIG1ldGFkYXRhLCBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd0luc3RhbmNlLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93SW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTU0NDI2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLyoqCisgKiBBIFdvcmtmbG93SW5zdGFuY2UgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYQorICogV29ya2Zsb3cgcHJvdmlkZWQgYnkgdGhlIHtAbGluayBXb3JrZmxvd30gY2xhc3MuIFdvcmtmbG93SW5zdGFuY2VzIGhhdmUKKyAqIHN0YXR1cywgYW5kIGluIGdlbmVyYWwgYXJlIGRhdGEgc3RydWN0dXJlcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgbWVhbnMgZm9yCisgKiBtb25pdG9yaW5nIHRoZSBzdGF0dXMgb2YgYW4gZXhlY3V0aW5nIHtAbGluayBXb3JrZmxvd30uCisgKiAKKyAqIEFzIG9mIEFwYWNoZSBPT0RUIDAuNCwgdGhlIGludGVybmFsIHtAbGluayBXb3JrZmxvd30gaW1wbGVtZW50YXRpb24gdXNlcworICoge0BsaW5rIFBhcmVudENoaWxkV29ya2Zsb3d9LCBpbnRyb2R1Y2VkIGFzIHBhcnQgb2YgT09EVC03MCwgYW5kIHRoZQorICogUGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnkuIHtAbGluayBXb3JrZmxvd30gaW5zdGFuY2VzIGdpdmVuIHRvIHRoZSBjbGFzcworICogd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgdG8ge0BsaW5rIFBhcmVudENoaWxkV29ya2Zsb3d9IGltcGxlbWVudGF0aW9ucworICogaW50ZXJuYWxseSwgYW5kIHRoZSBleGlzdGluZyB7QGxpbmsgI2dldFdvcmtmbG93KCl9IGFuZAorICoge0BsaW5rICNzZXRXb3JrZmxvdyhXb3JrZmxvdyl9IG1ldGhvZHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YKKyAqIHtAbGluayAjZ2V0UGFyZW50Q2hpbGRXb3JrZmxvdygpfSBhbmQKKyAqIHtAbGluayAjc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyhQYXJlbnRDaGlsZFdvcmtmbG93KX0gd2hpY2ggd2lsbCBzdXBlcnNlZGUKKyAqIHRob3NlIG1ldGhvZHMsIGFuZCBldmVudHVhbGx5IHR1cm4gaW50byB0aGVpciBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEluIGFkZGl0aW9uLCBhcyBvZiBBcGFjaGUgT09EVCAwLjQgdGhlIGludGVybmFsIHtAbGluayAjc3RhdGV9IG1lbWJlcgorICogdmFyaWFibGUgbm93IHVzZXMge0BsaW5rIFdvcmtmbG93U3RhdGV9IGZvciByZXByZXNlbnRhdGlvbi4gVGhpcyByZXF1aXJlcyB0aGUKKyAqIHVzZSBvZiB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGV9IHdoaWNoIGhhcyBub3cgbW92ZWQgZnJvbSBiZWluZyBzaW1wbHkgYSBVSQorICogdXRpbGl0eSBjbGFzcyBmb3IgdGhlIFdvcmtsb3cgTW9uaXRvciB3ZWIgYXBwbGljYXRpb24gdG8gYWN0dWFsbHkgYmVpbmcgZnVsbHkKKyAqIGludGVncmF0ZWQgd2l0aCB0aGUgV29ya2Zsb3cgTWFuYWdlci4gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHRoZQorICoge0BsaW5rICNzZXRTdGF0dXMoU3RyaW5nKX0gYW5kIHtAbGluayAjZ2V0U3RhdHVzKCl9IG1ldGhvZHMgYXJlIHN0aWxsCisgKiBzdXBwb3J0ZWQsIGJ1dCBhcmUgZGVwcmVjYXRlZC4gRGV2ZWxvcGVycyB1c2luZyB0aGlzIGNsYXNzIHNob3VsZCBtb3ZlCisgKiB0b3dhcmRzIHVzaW5nIHtAbGluayAjc2V0U3RhdGUoV29ya2Zsb3dTdGF0ZSl9IGFuZCB7QGxpbmsgI2dldFN0YXRlKCl9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dJbnN0YW5jZSB7CisKKyAgcHJpdmF0ZSBQYXJlbnRDaGlsZFdvcmtmbG93IHdvcmtmbG93OworCisgIHByaXZhdGUgU3RyaW5nIGlkOworCisgIHByaXZhdGUgV29ya2Zsb3dTdGF0ZSBzdGF0ZTsKKworICBwcml2YXRlIFN0cmluZyBjdXJyZW50VGFza0lkOworCisgIHByaXZhdGUgRGF0ZSBzdGFydERhdGU7CisKKyAgcHJpdmF0ZSBEYXRlIGVuZERhdGU7CisKKyAgcHJpdmF0ZSBNZXRhZGF0YSBzaGFyZWRDb250ZXh0OworCisgIHByaXZhdGUgUHJpb3JpdHkgcHJpb3JpdHk7CisKKyAgcHJpdmF0ZSBpbnQgdGltZXNCbG9ja2VkOworCisgIC8qKgorICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKiAKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlKCkgeworICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbmV3IERhdGUoKSwgbnVsbCwgbmV3IE1ldGFkYXRhKCksCisgICAgICAgIDAsIFByaW9yaXR5LmdldERlZmF1bHQoKSk7CisgIH0KKworICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvdyB3b3JrZmxvdywgU3RyaW5nIGlkLCBXb3JrZmxvd1N0YXRlIHN0YXRlLAorICAgICAgU3RyaW5nIGN1cnJlbnRUYXNrSWQsIERhdGUgc3RhcnREYXRlLCBEYXRlIGVuZERhdGUsIAorICAgICAgTWV0YWRhdGEgc2hhcmVkQ29udGV4dCwgaW50IHRpbWVzQmxvY2tlZCwgUHJpb3JpdHkgcHJpb3JpdHkpIHsKKyAgICB0aGlzLndvcmtmbG93ID0gd29ya2Zsb3cgIT0gbnVsbCAmJiB3b3JrZmxvdyBpbnN0YW5jZW9mIFBhcmVudENoaWxkV29ya2Zsb3cgPyAoUGFyZW50Q2hpbGRXb3JrZmxvdykgd29ya2Zsb3cKKyAgICAgICAgOiBuZXcgUGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyAhPSBudWxsID8gd29ya2Zsb3cgOiBuZXcgV29ya2Zsb3coKSk7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICB0aGlzLmN1cnJlbnRUYXNrSWQgPSBjdXJyZW50VGFza0lkOworICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlOworICAgIHRoaXMuZW5kRGF0ZSA9IGVuZERhdGU7CisgICAgdGhpcy5zaGFyZWRDb250ZXh0ID0gc2hhcmVkQ29udGV4dDsKKyAgICB0aGlzLnRpbWVzQmxvY2tlZCA9IHRpbWVzQmxvY2tlZDsKKyAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgaWQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgcmV0dXJuIGlkOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBpZAorICAgKiAgICAgICAgICB0aGUgaWQgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICB0aGlzLmlkID0gaWQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgc3RhdHVzCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKyAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCA/IHN0YXRlLmdldE5hbWUoKSA6ICJOdWxsIjsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBjdXJyZW50IHtAbGluayBXb3JrZmxvd1N0YXRlfSB0byB0aGUgcHJvdmlkZWQgc3RhdHVzLgorICAgKiAKKyAgICogQHBhcmFtIHN0YXR1cworICAgKiAgICAgICAgICBUaGUgcHJvdmlkZWQgc3RhdHVzIHRvIHNldC4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgV29ya2Zsb3dTdGF0ZSBzdGF0ZSA9IG5ldyBXb3JrZmxvd1N0YXRlKCk7CisgICAgc3RhdGUuc2V0TmFtZShzdGF0dXMpOworICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBzdGF0ZQorICAgKi8KKyAgcHVibGljIFdvcmtmbG93U3RhdGUgZ2V0U3RhdGUoKSB7CisgICAgcmV0dXJuIHN0YXRlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzdGF0ZQorICAgKiAgICAgICAgICB0aGUgc3RhdGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShXb3JrZmxvd1N0YXRlIHN0YXRlKSB7CisgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHdvcmtmbG93CisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgV29ya2Zsb3cgZ2V0V29ya2Zsb3coKSB7CisgICAgcmV0dXJuIChXb3JrZmxvdykgd29ya2Zsb3c7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHdvcmtmbG93CisgICAqICAgICAgICAgIHRoZSB3b3JrZmxvdyB0byBzZXQKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldFdvcmtmbG93KFdvcmtmbG93IHdvcmtmbG93KSB7CisgICAgaWYgKHdvcmtmbG93ICE9IG51bGwgJiYgd29ya2Zsb3cgaW5zdGFuY2VvZiBQYXJlbnRDaGlsZFdvcmtmbG93KSB7CisgICAgICB0aGlzLndvcmtmbG93ID0gKFBhcmVudENoaWxkV29ya2Zsb3cpIHdvcmtmbG93OworICAgIH0gZWxzZSB7CisgICAgICBpZiAod29ya2Zsb3cgPT0gbnVsbCkKKyAgICAgICAgd29ya2Zsb3cgPSBuZXcgV29ya2Zsb3coKTsKKyAgICAgIHRoaXMud29ya2Zsb3cgPSBuZXcgUGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAcmV0dXJuIFRoZSB3b3JrZmxvdywgd2l0aCBpdHMgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcHMuCisgICAqLworICBwdWJsaWMgUGFyZW50Q2hpbGRXb3JrZmxvdyBnZXRQYXJlbnRDaGlsZFdvcmtmbG93KCkgeworICAgIHJldHVybiB0aGlzLndvcmtmbG93OworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIFBhcmVudCBDaGlsZCB3b3JrZmxvdy4KKyAgICogCisgICAqIEBwYXJhbSB3b3JrZmxvdworICAgKiAgICAgICAgICBUaGUgd29ya2Zsb3cgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyhQYXJlbnRDaGlsZFdvcmtmbG93IHdvcmtmbG93KSB7CisgICAgdGhpcy53b3JrZmxvdyA9IHdvcmtmbG93OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRUYXNrSWQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFRhc2tJZCgpIHsKKyAgICByZXR1cm4gY3VycmVudFRhc2tJZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY3VycmVudFRhc2tJZAorICAgKiAgICAgICAgICB0aGUgY3VycmVudFRhc2tJZCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRUYXNrSWQoU3RyaW5nIGN1cnJlbnRUYXNrSWQpIHsKKyAgICB0aGlzLmN1cnJlbnRUYXNrSWQgPSBjdXJyZW50VGFza0lkOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHNoYXJlZENvbnRleHQKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YSBnZXRTaGFyZWRDb250ZXh0KCkgeworICAgIHJldHVybiBzaGFyZWRDb250ZXh0OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzaGFyZWRDb250ZXh0CisgICAqICAgICAgICAgIHRoZSBzaGFyZWRDb250ZXh0IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U2hhcmVkQ29udGV4dChNZXRhZGF0YSBzaGFyZWRDb250ZXh0KSB7CisgICAgdGhpcy5zaGFyZWRDb250ZXh0ID0gc2hhcmVkQ29udGV4dDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eQorICAgKi8KKyAgcHVibGljIFByaW9yaXR5IGdldFByaW9yaXR5KCkgeworICAgIHJldHVybiBwcmlvcml0eTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcHJpb3JpdHkKKyAgICogICAgICAgICAgdGhlIHByaW9yaXR5IHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoUHJpb3JpdHkgcHJpb3JpdHkpIHsKKyAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGZvcm1hdCBhbmQgcmV0dXJuIHRoZQorICAgKiB7QGxpbmsgI2N1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cn0gYXMgYSB7QGxpbmsgRGF0ZX0uCisgICAqIAorICAgKiBAcmV0dXJuIHtAbGluayBEYXRlfSByZXByZXNlbnRhdGlvbiBvZgorICAgKiAgICAgICAgIHtAbGluayAjZ2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKCl9LgorICAgKi8KKyAgcHVibGljIERhdGUgZ2V0Q3JlYXRpb25EYXRlKCkgeworICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZm9ybWF0IGFuZCByZXR1cm4gdGhlCisgICAqIHtAbGluayAjY3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cn0gYXMgYSB7QGxpbmsgRGF0ZX0uCisgICAqIAorICAgKiBAcmV0dXJuIHtAbGluayBEYXRlfSByZXByZXNlbnRhdGlvbiBvZgorICAgKiAgICAgICAgIHtAbGluayAjZ2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cigpfS4KKyAgICovCisgIHB1YmxpYyBEYXRlIGdldEZpbmlzaERhdGUoKSB7CisgICAgcmV0dXJuIHRoaXMuZW5kRGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBzdGFydERhdGUKKyAgICovCisgIHB1YmxpYyBEYXRlIGdldFN0YXJ0RGF0ZSgpIHsKKyAgICByZXR1cm4gc3RhcnREYXRlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzdGFydERhdGUKKyAgICogICAgICAgICAgdGhlIHN0YXJ0RGF0ZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShEYXRlIHN0YXJ0RGF0ZSkgeworICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGVuZERhdGUKKyAgICovCisgIHB1YmxpYyBEYXRlIGdldEVuZERhdGUoKSB7CisgICAgcmV0dXJuIGVuZERhdGU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGVuZERhdGUKKyAgICogICAgICAgICAgdGhlIGVuZERhdGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFbmREYXRlKERhdGUgZW5kRGF0ZSkgeworICAgIHRoaXMuZW5kRGF0ZSA9IGVuZERhdGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZW5kRGF0ZVRpbWVJc29TdHIKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kRGF0ZVRpbWVJc29TdHIoKSB7CisgICAgcmV0dXJuIHRoaXMuZW5kRGF0ZSAhPSBudWxsID8gRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KHRoaXMuZW5kRGF0ZSkgOiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBlbmREYXRlVGltZUlzb1N0cgorICAgKiAgICAgICAgICB0aGUgZW5kRGF0ZVRpbWVJc29TdHIgdG8gc2V0CisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCBzZXRFbmREYXRlVGltZUlzb1N0cihTdHJpbmcgZW5kRGF0ZVRpbWVJc29TdHIpIHsKKyAgICBpZiAoZW5kRGF0ZVRpbWVJc29TdHIgIT0gbnVsbCAmJiAhZW5kRGF0ZVRpbWVJc29TdHIuZXF1YWxzKCIiKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5lbmREYXRlID0gRGF0ZUNvbnZlcnQuaXNvUGFyc2UoZW5kRGF0ZVRpbWVJc29TdHIpOworICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAvLyBmYWlsIHNpbGVudGx5IGJlc2lkZXMgdGhpczogaXQncyBqdXN0IGEgc2V0dGVyCisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHN0YXJ0RGF0ZVRpbWVJc29TdHIKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnREYXRlVGltZUlzb1N0cigpIHsKKyAgICByZXR1cm4gdGhpcy5zdGFydERhdGUgIT0gbnVsbCA/IERhdGVDb252ZXJ0Lmlzb0Zvcm1hdCh0aGlzLnN0YXJ0RGF0ZSkKKyAgICAgICAgOiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBzdGFydERhdGVUaW1lSXNvU3RyCisgICAqICAgICAgICAgIHRoZSBzdGFydERhdGVUaW1lSXNvU3RyIHRvIHNldAorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgc2V0U3RhcnREYXRlVGltZUlzb1N0cihTdHJpbmcgc3RhcnREYXRlVGltZUlzb1N0cikgeworICAgIGlmIChzdGFydERhdGVUaW1lSXNvU3RyICE9IG51bGwgJiYgIXN0YXJ0RGF0ZVRpbWVJc29TdHIuZXF1YWxzKCIiKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zdGFydERhdGUgPSBEYXRlQ29udmVydC5pc29QYXJzZShzdGFydERhdGVUaW1lSXNvU3RyKTsKKyAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBiZXNpZGVzIHRoaXM6IGl0J3MganVzdCBhIHNldHRlcgorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0VGFza0J5SWQoY3VycmVudFRhc2tJZCkgIT0gbnVsbCA/IAorICAgICAgICAodGhpcy5nZXRUYXNrQnlJZChjdXJyZW50VGFza0lkKS5nZXRFbmREYXRlKCkgIT0gbnVsbCA/IAorICAgICAgICAgICAgRGF0ZUNvbnZlcnQuaXNvRm9ybWF0KHRoaXMuZ2V0VGFza0J5SWQoY3VycmVudFRhc2tJZCkuZ2V0RW5kRGF0ZSgpKQorICAgICAgICA6IG51bGwpOm51bGw7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIKKyAgICogICAgICAgICAgdGhlIGN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIgdG8gc2V0CisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyKAorICAgICAgU3RyaW5nIGN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIpIHsKKyAgICBpZiAoY3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0ciAhPSBudWxsCisgICAgICAgICYmICFjdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyLmVxdWFscygiIikgJiYgCisgICAgICAgIHRoaXMuZ2V0VGFza0J5SWQoY3VycmVudFRhc2tJZCkgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5nZXRUYXNrQnlJZChjdXJyZW50VGFza0lkKS4KKyAgICAgICAgICBzZXRFbmREYXRlKERhdGVDb252ZXJ0Lmlzb1BhcnNlKGN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIpKTsKKyAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBiZXNpZGVzIHRoaXM6IGl0J3MganVzdCBhIHNldHRlcgorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWVJc29TdHIKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKCkgeworICAgIHJldHVybiB0aGlzLmdldFRhc2tCeUlkKGN1cnJlbnRUYXNrSWQpICE9IG51bGwgPyAKKyAgICAgICAgKHRoaXMuZ2V0VGFza0J5SWQoY3VycmVudFRhc2tJZCkuZ2V0U3RhcnREYXRlKCkgIT0gbnVsbCA/IERhdGVDb252ZXJ0CisgICAgICAgIC5pc29Gb3JtYXQodGhpcy5nZXRUYXNrQnlJZChjdXJyZW50VGFza0lkKS5nZXRTdGFydERhdGUoKSkgOiBudWxsKTpudWxsOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWVJc29TdHIKKyAgICogICAgICAgICAgdGhlIGN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0ciB0byBzZXQKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigKKyAgICAgIFN0cmluZyBjdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWVJc29TdHIpIHsKKyAgICBpZiAoY3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyICE9IG51bGwKKyAgICAgICAgJiYgIWN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0ci5lcXVhbHMoIiIpICYmIAorICAgICAgICB0aGlzLmdldFRhc2tCeUlkKGN1cnJlbnRUYXNrSWQpICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuZ2V0VGFza0J5SWQoY3VycmVudFRhc2tJZCkuc2V0U3RhcnREYXRlKERhdGVDb252ZXJ0CisgICAgICAgICAgICAuaXNvUGFyc2UoY3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKSk7CisgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIC8vIGZhaWwgc2lsZW50bHkgYmVzaWRlcyB0aGlzOiBpdCdzIGp1c3QgYSBzZXR0ZXIKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHtAbGluayBXb3JrZmxvd1Rhc2t9CisgICAqIHBhcnQgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICogCisgICAqIEByZXR1cm4gVGhlIGN1cnJlbnRseSBleGVjdXRpbmcge0BsaW5rIFdvcmtmbG93VGFza30KKyAgICogcGFydCBvZiB0aGlzIGluc3RhbmNlLgorICAgKi8KKyAgcHVibGljIFdvcmtmbG93VGFzayBnZXRDdXJyZW50VGFzaygpeworICAgIHJldHVybiBnZXRUYXNrQnlJZChjdXJyZW50VGFza0lkKTsKKyAgfQorICAKKworICAvKioKKyAgICogQHJldHVybiB0aGUgdGltZXNCbG9ja2VkCisgICAqLworICBwdWJsaWMgaW50IGdldFRpbWVzQmxvY2tlZCgpIHsKKyAgICByZXR1cm4gdGltZXNCbG9ja2VkOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0aW1lc0Jsb2NrZWQgdGhlIHRpbWVzQmxvY2tlZCB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRpbWVzQmxvY2tlZChpbnQgdGltZXNCbG9ja2VkKSB7CisgICAgdGhpcy50aW1lc0Jsb2NrZWQgPSB0aW1lc0Jsb2NrZWQ7CisgIH0KKyAgCisgIAorICBwcml2YXRlIFdvcmtmbG93VGFzayBnZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKXsKKyAgICBpZih0aGlzLndvcmtmbG93LmdldFRhc2tzKCkgIT0gbnVsbCAmJiAKKyAgICAgICAgdGhpcy53b3JrZmxvdy5nZXRUYXNrcygpLnNpemUoKSA+IDApeworICAgICAgZm9yKFdvcmtmbG93VGFzayB0YXNrOiB0aGlzLndvcmtmbG93LmdldFRhc2tzKCkpeworICAgICAgICBpZih0YXNrLmdldFRhc2tJZCgpLmVxdWFscyh0YXNrSWQpKXsKKyAgICAgICAgICByZXR1cm4gdGFzazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgZWxzZSByZXR1cm4gbnVsbDsKKyAgfQorCisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dJbnN0YW5jZVBhZ2UuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dJbnN0YW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBhNDdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd0luc3RhbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFdvcmtmbG93SW5zdGFuY2VQYWdlIHsKKworICAgIC8qIHRoZSBudW1iZXIgb2YgdGhpcyBwYWdlICovCisgICAgcHJpdmF0ZSBpbnQgcGFnZU51bSA9IC0xOworCisgICAgLyogdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgc2V0ICovCisgICAgcHJpdmF0ZSBpbnQgdG90YWxQYWdlcyA9IC0xOworCisgICAgLyogdGhlIHNpemUgb2YgdGhlIG51bWJlciBvZiB3b3JrZmxvd3Mgb24gdGhpcyBwYWdlICovCisgICAgcHJpdmF0ZSBpbnQgcGFnZVNpemUgPSAtMTsKKworICAgIC8qIHRoZSBsaXN0IG9mIHByb2R1ZGN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlICovCisgICAgcHJpdmF0ZSBMaXN0IHBhZ2VXb3JrZmxvd3MgPSBudWxsOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4uCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlKCkgeworICAgICAgICBwYWdlV29ya2Zsb3dzID0gbmV3IFZlY3RvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYWdlTnVtCisgICAgICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRoaXMgcGFnZS4KKyAgICAgKiBAcGFyYW0gdG90YWxQYWdlcworICAgICAqICAgICAgICAgICAgVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgc2V0LgorICAgICAqIEBwYXJhbSBwYWdlU2l6ZQorICAgICAqICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhpcyBwYWdlLgorICAgICAqIEBwYXJhbSBwYWdlV29ya2Zsb3dzCisgICAgICogICAgICAgICAgICBUaGUgd29ya2Zsb3dzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlKGludCBwYWdlTnVtLCBpbnQgdG90YWxQYWdlcywgaW50IHBhZ2VTaXplLAorICAgICAgICAgICAgTGlzdCBwYWdlV29ya2Zsb3dzKSB7CisgICAgICAgIHRoaXMucGFnZU51bSA9IHBhZ2VOdW07CisgICAgICAgIHRoaXMudG90YWxQYWdlcyA9IHRvdGFsUGFnZXM7CisgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKKyAgICAgICAgdGhpcy5wYWdlV29ya2Zsb3dzID0gcGFnZVdvcmtmbG93czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhZ2VOdW0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYWdlTnVtKCkgeworICAgICAgICByZXR1cm4gcGFnZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFnZU51bQorICAgICAqICAgICAgICAgICAgVGhlIHBhZ2VOdW0gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VOdW0oaW50IHBhZ2VOdW0pIHsKKyAgICAgICAgdGhpcy5wYWdlTnVtID0gcGFnZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhZ2VXb3JrZmxvd3MuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0UGFnZVdvcmtmbG93cygpIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VXb3JrZmxvd3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhZ2VQcm9kdWN0cworICAgICAqICAgICAgICAgICAgVGhlIHBhZ2VXb3JrZmxvd3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VXb3JrZmxvd3MoTGlzdCBwYWdlV29ya2Zsb3dzKSB7CisgICAgICAgIHRoaXMucGFnZVdvcmtmbG93cyA9IHBhZ2VXb3JrZmxvd3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYWdlU2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhZ2VTaXplKCkgeworICAgICAgICByZXR1cm4gcGFnZVNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhZ2VTaXplCisgICAgICogICAgICAgICAgICBUaGUgcGFnZVNpemUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VTaXplKGludCBwYWdlU2l6ZSkgeworICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0b3RhbFBhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VG90YWxQYWdlcygpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsUGFnZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHRvdGFsUGFnZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSB0b3RhbFBhZ2VzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbFBhZ2VzKGludCB0b3RhbFBhZ2VzKSB7CisgICAgICAgIHRoaXMudG90YWxQYWdlcyA9IHRvdGFsUGFnZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSBpbiB0aGUgc2V0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMYXN0UGFnZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VOdW0gPT0gdG90YWxQYWdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBpcyB0aGUgZmlzdCBwYWdlIG9mIHRoZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0UGFnZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VOdW0gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgYmxhbmssIHVucG9wdWxhdGVkIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUGFnZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBibGFua1BhZ2UoKSB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIGJsYW5rID0gbmV3IFdvcmtmbG93SW5zdGFuY2VQYWdlKCk7CisgICAgICAgIGJsYW5rLnNldFBhZ2VOdW0oMCk7CisgICAgICAgIGJsYW5rLnNldFRvdGFsUGFnZXMoMCk7CisgICAgICAgIGJsYW5rLnNldFBhZ2VTaXplKDApOworICAgICAgICByZXR1cm4gYmxhbms7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd1N0YXR1cy5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd1N0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMmI3NWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93U3RhdHVzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHM7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGFoYXJ0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+RGVmYXVsdCBXb3JrZmxvdyBTdGF0dXMgU3RyaW5nczwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dTdGF0dXMgeworCisgICAgLyogQSBzZXQgb2YgZmluYWwgU3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiBhIHdvcmtmbG93LCBvciBQcm9jZXNzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRFRCA9ICJTVEFSVEVEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSEVEID0gIkZJTklTSEVEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVVNFRCA9ICJQQVVTRUQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiRVJST1IiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVVFRCA9ICJRVUVVRUQiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURUQgPSAiQ1JFQVRFRCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTUdSX1NVQk1JVCA9ICJSU1VCTUlUIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9NSVNTSU5HID0gIk1FVE1JU1MiOworICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd1Rhc2suamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkODBhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dUYXNrLmphdmEKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogCisgKiBBIFdvcmtmbG93IHRhc2ssIG9yIGpvYiwgb3IgcHJvY2Vzcy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1Rhc2sgeworCisgIC8qIGEgdW5pcXVlIElEIGZvciB0aGUgdGFzayAqLworICBwcm90ZWN0ZWQgU3RyaW5nIHRhc2tJZCA9IG51bGw7CisKKyAgLyogdGhlIG5hbWUgb2YgdGhlIHRhc2sgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyB0YXNrTmFtZSA9IG51bGw7CisKKyAgLyogdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSB0YXNrICovCisgIHByb3RlY3RlZCBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIHRhc2tDb25maWcgPSBudWxsOworCisgIC8qIHByZSBjb25kaXRpb25zIGZvciB0aGlzIHRhc2sgKi8KKyAgcHJvdGVjdGVkIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IHByZUNvbmRpdGlvbnMgPSBudWxsOworCisgIC8qIHBvc3QgY29uZGl0aW9ucyBmb3IgdGhpcyB0YXNrICovCisgIHByb3RlY3RlZCBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBwb3N0Q29uZGl0aW9ucyA9IG51bGw7CisKKyAgLyogdGhlIGFjdHVhbCB3b3JrIHBlcmZvcm1pbmcgcG9ydGlvbiBvZiB0aGlzIFdvcmtmbG93VGFzayAqLworICBwcm90ZWN0ZWQgU3RyaW5nIHRhc2tJbnN0YW5jZUNsYXNzTmFtZSA9IG51bGw7CisKKyAgLyogdGhlIG9yZGVyIGZvciB0aGlzIHRhc2sgKi8KKyAgcHJvdGVjdGVkIGludCBvcmRlciA9IC0xOworCisgIC8qIHRoZSBsaXN0IG9mIHJlcXVpcmVkIG1ldGFkYXRhIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGludG8gdGhpcyB0YXNrICovCisgIHByb3RlY3RlZCBMaXN0IHJlcXVpcmVkTWV0RmllbGRzID0gbnVsbDsKKworICBwcml2YXRlIERhdGUgc3RhcnREYXRlOworCisgIHByaXZhdGUgRGF0ZSBlbmREYXRlOworCisgIC8qKgorICAgKiA8cD4KKyAgICogRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICogPC9wPgorICAgKiAKKyAgICovCisgIHB1YmxpYyBXb3JrZmxvd1Rhc2soKSB7CisgICAgdGhpcyhudWxsLCBudWxsLCBuZXcgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbigpLAorICAgICAgICBuZXcgVmVjdG9yPFdvcmtmbG93Q29uZGl0aW9uPigpLCBuZXcgVmVjdG9yPFdvcmtmbG93Q29uZGl0aW9uPigpLAorICAgICAgICBuZXcgVmVjdG9yPFN0cmluZz4oKSwgbnVsbCwgbnVsbCwgbnVsbCwgLTEpOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdyBkZXByZWNhdGVkIGluIEFwYWNoZSBPT0RUIDAuNCwgaW4gZmF2b3Igb2YKKyAgICoge0BsaW5rICNXb3JrZmxvd1Rhc2soU3RyaW5nLCBTdHJpbmcsIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24sIExpc3QsIExpc3QsIFN0cmluZywgaW50KX0KKyAgICogdGhhdCBleHBsaWNpdGx5IHNwZWNpZmllcyBwcmUtIGFuZCBwb3N0LSB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cy4gQXMKKyAgICogdXNlZCwgdGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIHByZS1jb25kaXRpb25zIHZpYSB0aGUgcGFzc2VkIGluCisgICAqIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cyBvbmx5LgorICAgKiAKKyAgICogQHBhcmFtIHRhc2tJZAorICAgKiAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGlzIFdvcmtmbG93VGFzay4KKyAgICogQHBhcmFtIHRhc2tOYW1lCisgICAqICAgICAgICAgIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgV29ya2Zsb3dUYXNrLgorICAgKiBAcGFyYW0gdGFza0NvbmZpZworICAgKiAgICAgICAgICBUaGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyBXb3JrZmxvd1Rhc2suCisgICAqIEBwYXJhbSBjb25kaXRpb25zCisgICAqICAgICAgICAgIFRoZSBMaXN0IG9mIGNvbmRpdGlvbnMgYXR0YWNoZWQgdG8gdGhpcyBXb3JrZmxvd1Rhc2sgKGlmIGFueSkuCisgICAqIEBwYXJhbSB0YXNrSW5zdGFuY2VDbGFzc05hbWUKKyAgICogICAgICAgICAgVGhlIGluc3RhbmNlIGNsYXNzIG5hbWUgZm9yIHRoaXMgV29ya2Zsb3dUYXNrLgorICAgKiBAcGFyYW0gb3JkZXIKKyAgICogICAgICAgICAgVGhlIG9yZGVyIGluIHdoaWNoIHRoaXMgV29ya2Zsb3dUYXNrIGlzIGV4ZWN1dGVkIHdpdGhpbiBhCisgICAqICAgICAgICAgIFdvcmtmbG93LgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFdvcmtmbG93VGFzayhTdHJpbmcgdGFza0lkLCBTdHJpbmcgdGFza05hbWUsCisgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIHRhc2tDb25maWcsIExpc3QgY29uZGl0aW9ucywKKyAgICAgIFN0cmluZyB0YXNrSW5zdGFuY2VDbGFzc05hbWUsIGludCBvcmRlcikgeworICAgIHRoaXModGFza0lkLCB0YXNrTmFtZSwgdGFza0NvbmZpZywgY29uZGl0aW9ucywKKyAgICAgICAgbmV3IFZlY3RvcjxXb3JrZmxvd0NvbmRpdGlvbj4oKSwgbmV3IFZlY3RvcjxTdHJpbmc+KCksIG51bGwsCisgICAgICAgIG51bGwsIG51bGwsIC0xKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFdvcmtmbG93VGFzay4KKyAgICogCisgICAqIEBwYXJhbSB0YXNrSWQKKyAgICogICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzay4KKyAgICogQHBhcmFtIHRhc2tOYW1lCisgICAqICAgICAgICAgIFRoZSBuYW1lIGZvciB0aGlzIHRhc2suCisgICAqIEBwYXJhbSB0YXNrQ29uZmlnCisgICAqICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufS4KKyAgICogQHBhcmFtIHJlcXVpcmVkTWV0RmllbGRzCisgICAqICAgICAgICAgIEEge0BsaW5rIExpc3R9IG9mIFN0cmluZyBtZXQgZmllbGQgbmFtZXMgdGhhdCB0aGlzIHRhc2sgcmVxdWlyZXMuCisgICAqIEBwYXJhbSBwcmVDb25kaXRpb25zCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgTGlzdH0gb2YgcHJlLXtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zLgorICAgKiBAcGFyYW0gcG9zdENvbmRpdGlvbnMKKyAgICogICAgICAgICAgVGhlIHtAbGluayBMaXN0fSBvZiBwb3N0LXtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zLgorICAgKiBAcGFyYW0gdGFza0luc3RhbmNlQ2xhc3NOYW1lCisgICAqICAgICAgICAgIFRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgbmFtZSBvZiB0aGlzIFdvcmtmbG93VGFzay4KKyAgICogQHBhcmFtIHN0YXJ0RGF0ZQorICAgKiAgICAgICAgICBUaGUgdGltZSB0aGF0IHRoaXMgdGFzayBzdGFydGVkIGV4ZWN1dGluZy4KKyAgICogQHBhcmFtIGVuZERhdGUKKyAgICogICAgICAgICAgVGhlIHRpbWUgdGhhdCB0aGlzIHRhc2sgc3RvcHBlZCBleGVjdXRpbmcuCisgICAqIEBwYXJhbSBvcmRlcgorICAgKiAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggdGhpcyB0YXNrIHNob3VsZCBiZSBydW4uCisgICAqLworICBwdWJsaWMgV29ya2Zsb3dUYXNrKFN0cmluZyB0YXNrSWQsIFN0cmluZyB0YXNrTmFtZSwKKyAgICAgIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gdGFza0NvbmZpZywKKyAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IHByZUNvbmRpdGlvbnMsCisgICAgICBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBwb3N0Q29uZGl0aW9ucywgTGlzdDxTdHJpbmc+IHJlcXVpcmVkTWV0RmllbGRzLAorICAgICAgU3RyaW5nIHRhc2tJbnN0YW5jZUNsYXNzTmFtZSwgRGF0ZSBzdGFydERhdGUsIERhdGUgZW5kRGF0ZSwgaW50IG9yZGVyKSB7CisgICAgdGhpcy50YXNrSWQgPSB0YXNrSWQ7CisgICAgdGhpcy50YXNrTmFtZSA9IHRhc2tOYW1lOworICAgIHRoaXMudGFza0NvbmZpZyA9IHRhc2tDb25maWc7CisgICAgdGhpcy5yZXF1aXJlZE1ldEZpZWxkcyA9IHJlcXVpcmVkTWV0RmllbGRzOworICAgIHRoaXMucHJlQ29uZGl0aW9ucyA9IHByZUNvbmRpdGlvbnM7CisgICAgdGhpcy5wb3N0Q29uZGl0aW9ucyA9IHBvc3RDb25kaXRpb25zOworICAgIHRoaXMudGFza0luc3RhbmNlQ2xhc3NOYW1lID0gdGFza0luc3RhbmNlQ2xhc3NOYW1lOworICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlOworICAgIHRoaXMuZW5kRGF0ZSA9IGVuZERhdGU7CisgICAgdGhpcy5vcmRlciA9IG9yZGVyOworCisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0YXNrQ29uZmlnLgorICAgKi8KKyAgcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gZ2V0VGFza0NvbmZpZygpIHsKKyAgICByZXR1cm4gdGFza0NvbmZpZzsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBwcmVDb25kaXRpb25zCisgICAqLworICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0UHJlQ29uZGl0aW9ucygpIHsKKyAgICByZXR1cm4gcHJlQ29uZGl0aW9uczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gcHJlQ29uZGl0aW9ucworICAgKiAgICAgICAgICB0aGUgcHJlQ29uZGl0aW9ucyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFByZUNvbmRpdGlvbnMoTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gcHJlQ29uZGl0aW9ucykgeworICAgIHRoaXMucHJlQ29uZGl0aW9ucyA9IHByZUNvbmRpdGlvbnM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgcG9zdENvbmRpdGlvbnMKKyAgICovCisgIHB1YmxpYyBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBnZXRQb3N0Q29uZGl0aW9ucygpIHsKKyAgICByZXR1cm4gcG9zdENvbmRpdGlvbnM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHBvc3RDb25kaXRpb25zCisgICAqICAgICAgICAgIHRoZSBwb3N0Q29uZGl0aW9ucyB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFBvc3RDb25kaXRpb25zKExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IHBvc3RDb25kaXRpb25zKSB7CisgICAgdGhpcy5wb3N0Q29uZGl0aW9ucyA9IHBvc3RDb25kaXRpb25zOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0YXNrQ29uZmlnCisgICAqICAgICAgICAgIFRoZSB0YXNrQ29uZmlnIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRhc2tDb25maWcoV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiB0YXNrQ29uZmlnKSB7CisgICAgdGhpcy50YXNrQ29uZmlnID0gdGFza0NvbmZpZzsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhc2tJZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza0lkKCkgeworICAgIHJldHVybiB0YXNrSWQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHRhc2tJZAorICAgKiAgICAgICAgICBUaGUgdGFza0lkIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRhc2tJZChTdHJpbmcgdGFza0lkKSB7CisgICAgdGhpcy50YXNrSWQgPSB0YXNrSWQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0YXNrSW5zdGFuY2VDbGFzc05hbWUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFRhc2tJbnN0YW5jZUNsYXNzTmFtZSgpIHsKKyAgICByZXR1cm4gdGFza0luc3RhbmNlQ2xhc3NOYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB0YXNrSW5zdGFuY2VDbGFzc05hbWUKKyAgICogICAgICAgICAgVGhlIHRhc2tJbnN0YW5jZUNsYXNzTmFtZSB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUoU3RyaW5nIHRhc2tJbnN0YW5jZUNsYXNzTmFtZSkgeworICAgIHRoaXMudGFza0luc3RhbmNlQ2xhc3NOYW1lID0gdGFza0luc3RhbmNlQ2xhc3NOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFza05hbWUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgeworICAgIHJldHVybiB0YXNrTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdGFza05hbWUKKyAgICogICAgICAgICAgVGhlIHRhc2tOYW1lIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyB0YXNrTmFtZSkgeworICAgIHRoaXMudGFza05hbWUgPSB0YXNrTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHVzaW5nIHtAbGluayAjZ2V0UHJlQ29uZGl0aW9ucygpfSBvcgorICAgKiB7QGxpbmsgI2dldFBvc3RDb25kaXRpb25zKCl9LiBBcyBjYWxsZWQsIHdpbGwgcmV0dXJuIGEgdW5pb24gb2YgdGhlIFRhc2tzJ3MKKyAgICogcHJlLSBhbmQgcG9zdC0ge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMuCisgICAqIAorICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAqICAgICAgICAgdGFzay4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBMaXN0IGdldENvbmRpdGlvbnMoKSB7CisgICAgTGlzdCBjb25kaXRpb25zID0gbmV3IFZlY3RvcigpOworICAgIGNvbmRpdGlvbnMuYWRkQWxsKHRoaXMucHJlQ29uZGl0aW9ucyk7CisgICAgY29uZGl0aW9ucy5hZGRBbGwodGhpcy5wb3N0Q29uZGl0aW9ucyk7CisgICAgcmV0dXJuIGNvbmRpdGlvbnM7CisgIH0KKworICAvKioKKyAgICogCisgICAqIFRoaXMgbWV0aG9kIGlzIGRlcGNyZWF0ZWQgaW4gZmF2b3Igb2Yge0BsaW5rICNzZXRQb3N0Q29uZGl0aW9ucyhMaXN0KX0gYW5kCisgICAqIHtAbGluayAjc2V0UHJlQ29uZGl0aW9ucyhMaXN0KX0sIGZvciBleHBsaWNpdGx5IHNldHRpbmcgdGhlIHByZSBvciBwb3N0CisgICAqIGNvbmRpdGlvbnMgb2YgdGhpcyBXb3JrZmxvd1Rhc2suCisgICAqIAorICAgKiBUbyBrZWVwIGJhY2sgY29tcGF0LCB0aGlzIG1ldGhvZCBpbiBpdHMgZGVwcmVjYXRlZCBmb3JtIHdpbGwgc2V0IHRoZQorICAgKiBXb3JrZmxvd1Rhc2sgcHJlLWNvbmRpdGlvbnMsIGFzIHdhcyB0aGUgY2FzZSBiZWZvcmUuCisgICAqIAorICAgKiBTZXRzIHRoZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICogdGFzay4KKyAgICogCisgICAqIEBwYXJhbSBjb25kaXRpb25zCisgICAqICAgICAgICAgIFRoZSBjb25kaXRpb24ge0BsaW5rIExpc3R9LgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgc2V0Q29uZGl0aW9ucyhMaXN0IGNvbmRpdGlvbnMpIHsKKyAgICB0aGlzLnByZUNvbmRpdGlvbnMgPSBjb25kaXRpb25zOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3JkZXIuIERvbid0IHVzZSB0aGlzIG1ldGhvZCBhbnltb3JlIC0tIG9yZGVyIGlzIG5vdAorICAgKiAgICAgICAgIHJlbGV2YW50IHRvIHRoZSBjb250cm9sIGZsb3cgd2hpY2ggaXMgYWN1dGFsbHkgY29udHJvbGxlZCBub3cgYnkKKyAgICogICAgICAgICB0aGUgc3Vycm91bmRpbmcgd29ya2Zsb3cgbW9kZWwuCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgIHJldHVybiBvcmRlcjsKKyAgfQorCisgIC8qKgorICAgKiBEb24ndCB1c2UgdGhpcyBtZXRob2QgYW55bW9yZSAtLSBvcmRlciBpcyBub3QgcmVsZXZhbnQgdG8gdGhlIGNvbnRyb2wgZmxvdworICAgKiB3aGljaCBpcyBhY3V0YWxseSBjb250cm9sbGVkIG5vdyBieSB0aGUgc3Vycm91bmRpbmcgd29ya2Zsb3cgbW9kZWwuCisgICAqIAorICAgKiBAcGFyYW0gb3JkZXIKKyAgICogICAgICAgICAgVGhlIG9yZGVyIHRvIHNldC4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldE9yZGVyKGludCBvcmRlcikgeworICAgIHRoaXMub3JkZXIgPSBvcmRlcjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZE1ldEZpZWxkcworICAgKi8KKyAgcHVibGljIExpc3QgZ2V0UmVxdWlyZWRNZXRGaWVsZHMoKSB7CisgICAgcmV0dXJuIHJlcXVpcmVkTWV0RmllbGRzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSByZXF1aXJlZE1ldEZpZWxkcworICAgKiAgICAgICAgICB0aGUgcmVxdWlyZWRNZXRGaWVsZHMgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZE1ldEZpZWxkcyhMaXN0IHJlcXVpcmVkTWV0RmllbGRzKSB7CisgICAgdGhpcy5yZXF1aXJlZE1ldEZpZWxkcyA9IHJlcXVpcmVkTWV0RmllbGRzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHN0YXJ0RGF0ZQorICAgKi8KKyAgcHVibGljIERhdGUgZ2V0U3RhcnREYXRlKCkgeworICAgIHJldHVybiBzdGFydERhdGU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHN0YXJ0RGF0ZQorICAgKiAgICAgICAgICB0aGUgc3RhcnREYXRlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKERhdGUgc3RhcnREYXRlKSB7CisgICAgdGhpcy5zdGFydERhdGUgPSBzdGFydERhdGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZW5kRGF0ZQorICAgKi8KKyAgcHVibGljIERhdGUgZ2V0RW5kRGF0ZSgpIHsKKyAgICByZXR1cm4gZW5kRGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZW5kRGF0ZQorICAgKiAgICAgICAgICB0aGUgZW5kRGF0ZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEVuZERhdGUoRGF0ZSBlbmREYXRlKSB7CisgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWE4OTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1dvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5BIHNwZWNpYWxpemVkIHNldCBvZiBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciBhIHtAbGluayBXb3JrZmxvd1Rhc2t9LjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIHsKKworCS8qIHRoZSB0YXNrIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyAqLworCXByaXZhdGUgUHJvcGVydGllcyB0YXNrUHJvcGVydGllcyA9IG51bGw7CisJCisJLyoqCisJICogPHA+CisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqIDwvcD4uCisJICovCisJcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oKSB7CisJCXRhc2tQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwl9CisKKwkvKioKKwkgKiA8cD4KKwkgKiBDb25zdHJ1Y3QgYSBuZXcgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBmcm9tIGEgamF2YSBQcm9wZXJ0aWVzIG9iamVjdC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHByb3BlcnRpZXMKKwkgKiAgICAgICAgICAgIFRoZSB0YXNrIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKwkgKi8KKwlwdWJsaWMgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbihQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKwkJdGFza1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIDxwPgorCSAqIEFkZHMgdGhlIHByb3BlcnR5IGRlbm90ZWQgYnkgdGhlIGdpdmVuIDxjb2RlPm5hbWU+PC9jb2RlPiBhbmQKKwkgKiA8Y29kZT52YWx1ZTwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDb25maWdQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCXRhc2tQcm9wZXJ0aWVzLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gcHJvcE5hbWUKKwkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIHZhbHVlIGZvci4KKwkgKiBAcmV0dXJuIFRoZSBTdHJpbmcgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcE5hbWUuCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKKwkJcmV0dXJuIHRhc2tQcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BOYW1lKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJvcGVydGllc30gZm9yIGNvbmZpZ3VyaW5nIHRoaXMgV29ya2Zsb3dUYXNrLgorCSAqLworCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0YXNrUHJvcGVydGllczsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dUYXNrSW5zdGFuY2UuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvV29ya2Zsb3dUYXNrSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjAzNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9Xb3JrZmxvd1Rhc2tJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldnNpb24kCisgKiAKKyAqIDxwPlRoZSBwYXJ0IG9mIGEgV29ya2Zsb3dUYXNrIHRoYXQgaXMgcmVzcG9uc2libGUKKyAqIGZvciBhY3R1YWxseSBkb2luZyB0aGUgd29yay48L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dUYXNrSW5zdGFuY2UgeworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogUnVucyB0aGUgVGFzayB3aXRoIHRoZSBzcGVjaWZpZWQgbWV0YWRhdGEgY29udGV4dC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICBUaGUgVGFza0NvbnRleHQgb2YgbWV0YWRhdGEgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MuCisgICAgICogICAgICAgICAgICAKKyAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBtZXRhZGF0YSBmb3IgdGhpcyB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvZXhjZXB0aW9ucy9FbmdpbmVFeGNlcHRpb24uamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvZXhjZXB0aW9ucy9FbmdpbmVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI1NDRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL0VuZ2luZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD5BbiBleGNlcHRpb24gdGhyb3cgYnkgdGhlIFdvcmtmbG93IEVuZ2luZS48L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIEVuZ2luZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICAvKiBzZXJpYWwgdmVyc2lvbiBVSUQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjkwNzYyNzczODI2OTEwMDAwTDsKKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBFbmdpbmVFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIEVuZ2luZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICovCisgICAgcHVibGljIEVuZ2luZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqLworICAgIHB1YmxpYyBFbmdpbmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL0luc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL0luc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZjkyMWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL2V4Y2VwdGlvbnMvSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogPHA+QW4gZXhjZXB0aW9uIHRocm93biBieSB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5fTwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJLyogc2VyaWFsIHZlcnNpb24gVUlEICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ5NTY2MTIwNDk4NzQ5NTI2NjlMOworCisJLyoqCisJICogCisJICovCisJcHVibGljIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbigpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyoqCisJICogQHBhcmFtIGFyZzAKKwkgKi8KKwlwdWJsaWMgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYXJnMAorCSAqLworCXB1YmxpYyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICogQHBhcmFtIGFyZzEKKwkgKi8KKwlwdWJsaWMgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgeworCQlzdXBlcihhcmcwLCBhcmcxKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL2V4Y2VwdGlvbnMvUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL1JlcG9zaXRvcnlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQ5MzljCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL1JlcG9zaXRvcnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5BbiBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB3b3JrZmxvdyByZXBvc2l0b3J5LjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvc2l0b3J5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIC8qIHNlcmlhbCB2ZXJzaW9uIFVJRCAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc4NjcwMzk3NzQ5MzU4MzQ0NzJMOworCisJLyoqCisJICogCisJICovCisJcHVibGljIFJlcG9zaXRvcnlFeGNlcHRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIFJlcG9zaXRvcnlFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICogQHBhcmFtIGFyZzEKKwkgKi8KKwlwdWJsaWMgUmVwb3NpdG9yeUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKKwkJc3VwZXIoYXJnMCwgYXJnMSk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmcwCisJICovCisJcHVibGljIFJlcG9zaXRvcnlFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL1dvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL2V4Y2VwdGlvbnMvV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNjNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9leGNlcHRpb25zL1dvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIGJmb3N0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqCisgKiA8cD5BbiBleGNlcHRpb24gdGhyb3duIGJ5IHtAbGluayBXb3JrZmxvd1Rhc2tJbnN0YW5jZX08L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNjY2MzQ2NTgxMDY2MDcwMTU2TDsKKworICAgIHB1YmxpYyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgIHN1cGVyKHRocm93YWJsZSk7CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgc3VwZXIobXNnLCB0aHJvd2FibGUpOworICAgIH0KKworICAgIAorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3lzdGVtL1htbFJwY1dvcmtmbG93TWFuYWdlci5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3lzdGVtL1htbFJwY1dvcmtmbG93TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGRhMTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zeXN0ZW0vWG1sUnBjV29ya2Zsb3dNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw3MjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbTsKKworLy9PT0RUIHN0YXRpYyBpbXBvcnRzCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5HZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmdldFdvcmtmbG93RW5naW5lRnJvbUNsYXNzTmFtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dSZXBvc2l0b3J5RnJvbUNsYXNzTmFtZTsKKworLy9BcGFjaGUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLldlYlNlcnZlcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuWG1sUnBjU3RydWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5UaHJlYWRQb29sV29ya2Zsb3dFbmdpbmVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLldvcmtmbG93RW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5EYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuV29ya2Zsb3dSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuRW5naW5lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLkluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5SZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL0dvb2dsZSBpbXBvcnRzCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCisvKioKKyAqIEFuIFhNTCBSUEMtYmFzZWQgV29ya2Zsb3cgbWFuYWdlci4KKyAqCisgKiBAYXV0aG9yIG1hdHRtYW5uIChDaHJpcyBNYXR0bWFubikKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyIHsKKworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoWG1sUnBjV29ya2Zsb3dNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0VCX1NFUlZFUl9QT1JUID0gOTAwMTsKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9SUENfSEFORExFUl9OQU1FID0gIndvcmtmbG93bWdyIjsKKworICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFX1BST1BFUlRZID0gIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucHJvcGVydGllcyI7CisgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19FTkdJTkVfRkFDVE9SWV9QUk9QRVJUWSA9ICJ3b3JrZmxvdy5lbmdpbmUuZmFjdG9yeSI7CisgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdJTkVfUlVOTkVSX0ZBQ1RPUllfUFJPUEVSVFkgPSAid29ya2Zsb3cuZW5naW5lLnJ1bm5lci5mYWN0b3J5IjsKKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktGTE9XX1JFUE9TSVRPUllfRkFDVE9SWV9QUk9QRVJUWSA9ICJ3b3JrZmxvdy5yZXBvLmZhY3RvcnkiOworCisgICBwcml2YXRlIGZpbmFsIGludCB3ZWJTZXJ2ZXJQb3J0OworICAgcHJpdmF0ZSBXZWJTZXJ2ZXIgd2ViU2VydmVyOworICAgcHJpdmF0ZSBmaW5hbCBXb3JrZmxvd0VuZ2luZSBlbmdpbmU7CisgICBwcml2YXRlIFdvcmtmbG93UmVwb3NpdG9yeSByZXBvOworCisgICBwdWJsaWMgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyKCkgeworICAgICAgdGhpcyhERUZBVUxUX1dFQl9TRVJWRVJfUE9SVCk7CisgICB9CisKKyAgIHB1YmxpYyBYbWxScGNXb3JrZmxvd01hbmFnZXIoaW50IHBvcnQpIHsKKyAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChwb3J0ID4gMCwgIk11c3Qgc3BlY2lmeSBhIHBvcnQgZ3JlYXRlciB0aGFuIDAiKTsKKyAgICAgIHdlYlNlcnZlclBvcnQgPSBwb3J0OworCisgICAgICBlbmdpbmUgPSBnZXRXb3JrZmxvd0VuZ2luZUZyb21Qcm9wZXJ0eSgpOworICAgICAgZW5naW5lLnNldFdvcmtmbG93TWFuYWdlclVybChzYWZlR2V0VXJsRnJvbVN0cmluZygiaHR0cDovLyIKKyAgICAgICAgICAgICsgZ2V0SG9zdG5hbWUoKSArICI6IiArIHRoaXMud2ViU2VydmVyUG9ydCkpOworICAgICAgcmVwbyA9IGdldFdvcmtmbG93UmVwb3NpdG9yeUZyb21Qcm9wZXJ0eSgpOworCisgICAgICAvLyBzdGFydCB1cCB0aGUgd2ViIHNlcnZlcgorICAgICAgd2ViU2VydmVyID0gbmV3IFdlYlNlcnZlcih3ZWJTZXJ2ZXJQb3J0KTsKKyAgICAgIHdlYlNlcnZlci5hZGRIYW5kbGVyKFhNTF9SUENfSEFORExFUl9OQU1FLCB0aGlzKTsKKyAgICAgIHdlYlNlcnZlci5zdGFydCgpOworCisgICAgICBMT0cubG9nKExldmVsLklORk8sICJXb3JrZmxvdyBNYW5hZ2VyIHN0YXJ0ZWQgYnkgIgorICAgICAgICAgICAgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIsICJ1bmtub3duIikpOworICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBzaHV0ZG93bigpIHsKKyAgICAgIGlmICh3ZWJTZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgd2ViU2VydmVyLnNodXRkb3duKCk7CisgICAgICAgICB3ZWJTZXJ2ZXIgPSBudWxsOworICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcHVibGljIGJvb2xlYW4gcmVmcmVzaFJlcG9zaXRvcnkoKQorICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgcmVwbyA9IGdldFdvcmtmbG93UmVwb3NpdG9yeUZyb21Qcm9wZXJ0eSgpOworICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICBwdWJsaWMgU3RyaW5nIGV4ZWN1dGVEeW5hbWljV29ya2Zsb3coVmVjdG9yPFN0cmluZz4gdGFza0lkcywgSGFzaHRhYmxlIG1ldGFkYXRhKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24sIEVuZ2luZUV4Y2VwdGlvbiB7CisgICAgaWYgKHRhc2tJZHMgPT0gbnVsbCB8fCAodGFza0lkcyAhPSBudWxsICYmIHRhc2tJZHMuc2l6ZSgpID09IDApKQorICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oCisgICAgICAgICAgIk11c3Qgc3BlY2lmeSB0YXNrIGlkZW50aWZpZXJzIHRvIGJ1aWxkIGR5bmFtaWMgd29ya2Zsb3dzISIpOworCisgICAgV29ya2Zsb3cgZHluYW1pY1dvcmtmbG93ID0gbmV3IFdvcmtmbG93KCk7CisKKyAgICBmb3IgKFN0cmluZyB0YXNrSWQgOiB0YXNrSWRzKSB7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IHRoaXMucmVwby5nZXRXb3JrZmxvd1Rhc2tCeUlkKHRhc2tJZCk7CisgICAgICBpZiAodGFzayA9PSBudWxsKQorICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiRHluYW1pYyB3b3JrZmxvdyB0YXNrOiBbIiArIHRhc2tJZAorICAgICAgICAgICAgKyAiXSBpcyBub3QgZGVmaW5lZCEiKTsKKyAgICAgIGR5bmFtaWNXb3JrZmxvdy5nZXRUYXNrcygpLmFkZCh0YXNrKTsKKyAgICB9CisKKyAgICBkeW5hbWljV29ya2Zsb3cuc2V0SWQodGhpcy5yZXBvLmFkZFdvcmtmbG93KGR5bmFtaWNXb3JrZmxvdykpOworICAgIGR5bmFtaWNXb3JrZmxvdy5zZXROYW1lKCJEeW5hbWljIFdvcmtmbG93LSIgKyBkeW5hbWljV29ya2Zsb3cuZ2V0SWQoKSk7CisKKyAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBtZXQuYWRkTWV0YWRhdGEobWV0YWRhdGEpOworCisgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gdGhpcy5lbmdpbmUuc3RhcnRXb3JrZmxvdyhkeW5hbWljV29ya2Zsb3csIG1ldCk7CisgICAgcmV0dXJuIGluc3QuZ2V0SWQoKTsKKyAgfQorCisgICAgcHVibGljIFZlY3RvciBnZXRSZWdpc3RlcmVkRXZlbnRzKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworCisgICAgICAgIExpc3QgZXZlbnRzID0gbnVsbDsKKyAgICAgICAgVmVjdG9yIGV2ZW50c1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXZlbnRzID0gcmVwby5nZXRSZWdpc3RlcmVkRXZlbnRzKCk7CisKKyAgICAgICAgICAgIGlmIChldmVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV2ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRzVmVjdG9yLmFkZChpLm5leHQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBldmVudHNWZWN0b3I7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHJlZ2lzdGVyZWQgZXZlbnRzIGZyb20gcmVwb3NpdG9yeTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEZpcnN0UGFnZSgpIHsKKyAgICAJV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSA9IGVuZ2luZS5nZXRJbnN0YW5jZVJlcG9zaXRvcnkoKQorICAgICAgICAgICAgICAgIC5nZXRGaXJzdFBhZ2UoKTsKKyAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdWxhdGVXb3JrZmxvd3MocGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZVBhZ2UocGFnZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsYW5rUGFnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldE5leHRQYWdlKEhhc2h0YWJsZSBjdXJyZW50UGFnZSkgeworICAgICAgICAvLyBmaXJzdCB1bnBhY2sgY3VycmVudCBwYWdlCisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIGN1cnJQYWdlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlUGFnZUZyb21YbWxScGMoY3VycmVudFBhZ2UpOworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gZW5naW5lLmdldEluc3RhbmNlUmVwb3NpdG9yeSgpLmdldE5leHRQYWdlKAorICAgICAgICAgICAgICAgIGN1cnJQYWdlKTsKKyAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdWxhdGVXb3JrZmxvd3MocGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZVBhZ2UocGFnZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsYW5rUGFnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFByZXZQYWdlKEhhc2h0YWJsZSBjdXJyZW50UGFnZSkgeworICAgICAgICAvLyBmaXJzdCB1bnBhY2sgY3VycmVudCBwYWdlCisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIGN1cnJQYWdlID0gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlUGFnZUZyb21YbWxScGMoY3VycmVudFBhZ2UpOworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gZW5naW5lLmdldEluc3RhbmNlUmVwb3NpdG9yeSgpLmdldFByZXZQYWdlKAorICAgICAgICAgICAgICAgIGN1cnJQYWdlKTsKKyAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdWxhdGVXb3JrZmxvd3MocGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZVBhZ2UocGFnZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsYW5rUGFnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldExhc3RQYWdlKCkgeworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gZW5naW5lLmdldEluc3RhbmNlUmVwb3NpdG9yeSgpCisgICAgICAgICAgICAgICAgLmdldExhc3RQYWdlKCk7CisgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBvcHVsYXRlV29ya2Zsb3dzKHBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpKTsKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKHBhZ2UpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRYbWxScGNXb3JrZmxvd0luc3RhbmNlUGFnZShXb3JrZmxvd0luc3RhbmNlUGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ibGFua1BhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZSBwYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzKGludCBwYWdlTnVtLCBTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIHBhZ2UgPSBlbmdpbmUuZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCkKKyAgICAgICAgICAgICAgICAuZ2V0UGFnZWRXb3JrZmxvd3MocGFnZU51bSwgc3RhdHVzKTsKKyAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdWxhdGVXb3JrZmxvd3MocGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZVBhZ2UocGFnZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsYW5rUGFnZSgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBIYXNodGFibGUgcGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhpbnQgcGFnZU51bSkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gZW5naW5lLmdldEluc3RhbmNlUmVwb3NpdG9yeSgpCisgICAgICAgICAgICAgICAgLmdldFBhZ2VkV29ya2Zsb3dzKHBhZ2VOdW0pOworICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3B1bGF0ZVdvcmtmbG93cyhwYWdlLmdldFBhZ2VXb3JrZmxvd3MoKSk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNXb3JrZmxvd0luc3RhbmNlUGFnZShwYWdlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZVBhZ2UoV29ya2Zsb3dJbnN0YW5jZVBhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmxhbmtQYWdlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKFN0cmluZyB3SW5zdElkKSB7CisgICAgICAgIE1ldGFkYXRhIG1ldCA9IGVuZ2luZS5nZXRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEod0luc3RJZCk7CisgICAgICAgIHJldHVybiBtZXQuZ2V0SGFzaHRhYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIFZlY3RvciBnZXRXb3JrZmxvd3NCeUV2ZW50KFN0cmluZyBldmVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Qgd29ya2Zsb3dzID0gbnVsbDsKKyAgICAgICAgVmVjdG9yIHdvcmtmbG93TGlzdCA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd29ya2Zsb3dzID0gcmVwby5nZXRXb3JrZmxvd3NGb3JFdmVudChldmVudE5hbWUpOworCisgICAgICAgICAgICBpZiAod29ya2Zsb3dzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3b3JrZmxvd3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93IHcgPSAoV29ya2Zsb3cpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgd29ya2Zsb3cgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93KHcpOworICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0xpc3QuYWRkKHdvcmtmbG93KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd0xpc3Q7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHdvcmtmbG93cyBmb3IgZXZlbnQ6ICIgKyBldmVudE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSByZXBvc2l0b3J5OiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRXZlbnQoU3RyaW5nIGV2ZW50TmFtZSwgSGFzaHRhYmxlIG1ldGFkYXRhKQorICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24sIEVuZ2luZUV4Y2VwdGlvbiB7CisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIldvcmtmbG93TWFuYWdlcjogUmVjZWl2ZWQgZXZlbnQ6ICIgKyBldmVudE5hbWUpOworCisgICAgICAgIExpc3Qgd29ya2Zsb3dzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd29ya2Zsb3dzID0gcmVwby5nZXRXb3JrZmxvd3NGb3JFdmVudChldmVudE5hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3dzIGFzc29jaWF0ZWQgd2l0aCBldmVudDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXZlbnROYW1lICsgIjogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3b3JrZmxvd3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gd29ya2Zsb3dzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFdvcmtmbG93IHcgPSAoV29ya2Zsb3cpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIldvcmtmbG93TWFuYWdlcjogV29ya2Zsb3cgIiArIHcuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmV0cmlldmVkIGZvciBldmVudCAiICsgZXZlbnROYW1lKTsKKworICAgICAgICAgICAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICBtLmFkZE1ldGFkYXRhKG1ldGFkYXRhKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zdGFydFdvcmtmbG93KHcsIG0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbmdpbmVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2luZSBleGNlcHRpb24gd2hlbiBzdGFydGluZyB3b3JrZmxvdzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3LmdldE5hbWUoKSArICI6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFdvcmtmbG93SW5zdGFuY2VCeUlkKFN0cmluZyB3SW5zdElkKQorICAgICAgICAgICAgdGhyb3dzIEVuZ2luZUV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluc3QgPSBlbmdpbmUuZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCkuZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoCisgICAgICAgICAgICAgICAgICAgIHdJbnN0SWQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9idGFpbmluZyB3b3JrZmxvdyBpbnN0YW5jZSB3aXRoIElEOiBbIiArIHdJbnN0SWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgaW5zdCA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNXb3JrZmxvd0luc3RhbmNlKGluc3QpOworCisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgICAgICBlbmdpbmUuc3RvcFdvcmtmbG93KHdvcmtmbG93SW5zdElkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHBhdXNlV29ya2Zsb3dJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpIHsKKyAgICAgICAgZW5naW5lLnBhdXNlV29ya2Zsb3dJbnN0YW5jZSh3b3JrZmxvd0luc3RJZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXN1bWVXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgICAgICBlbmdpbmUucmVzdW1lV29ya2Zsb3dJbnN0YW5jZSh3b3JrZmxvd0luc3RJZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKFN0cmluZyB3b3JrZmxvd0luc3RJZCkgeworICAgICAgICByZXR1cm4gZW5naW5lLmdldFdhbGxDbG9ja01pbnV0ZXMod29ya2Zsb3dJbnN0SWQpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoU3RyaW5nIHdvcmtmbG93SW5zdElkKSB7CisgICAgICAgIHJldHVybiBlbmdpbmUuZ2V0Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKHdvcmtmbG93SW5zdElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBlbmdpbmUuZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCkuZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cygKKyAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGVuZ2luZS5nZXRJbnN0YW5jZVJlcG9zaXRvcnkoKS5nZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpOworICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3IgZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgdGhyb3dzIEVuZ2luZUV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Qgd29ya2Zsb3dJbnN0cyA9IG51bGw7CisKKyAgICAgICAgVmVjdG9yIHdvcmtmbG93SW5zdGFuY2VzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3b3JrZmxvd0luc3RzID0gZW5naW5lLmdldEluc3RhbmNlUmVwb3NpdG9yeSgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3cgaW5zdGFuY2VzIGJ5IHN0YXR1czogTWVzc2FnZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpICsgIl0iKTsKKyAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd0luc3RhbmNlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3b3JrZmxvd0luc3RzICE9IG51bGwpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgICAgICAgIkdldHRpbmcgd29ya2Zsb3cgaW5zdGFuY2VzIGJ5IHN0YXR1czogcmV0cmlldmVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3b3JrZmxvd0luc3RzLnNpemUoKSArICIgaW5zdGFuY2VzIik7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gd29ya2Zsb3dJbnN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCA9IChXb3JrZmxvd0luc3RhbmNlKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGljayB1cCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmtmbG93CisgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93IHdEZXNjID0gcmVwby5nZXRXb3JrZmxvd0J5SWQod0luc3QuZ2V0V29ya2Zsb3coKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFjayBmb3Igbm93LCBmaXggdGhpcywgd2Ugc2hvdWxkbid0IGhhdmUgdG8gY2FzdAorICAgICAgICAgICAgICAgICAgICAvLyBoZXJlLCBiYWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduCisgICAgICAgICAgICAgICAgICAgIGlmKHdEZXNjID09IG51bGwpeworICAgICAgICAgICAgICAgICAgICAgIC8vUG9zc2libGUgZHluYW1pYyB3b3JrZmxvdyBmb3IgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAvL3JlY29uc2l0dXRlIGl0IGZyb20gY2FjaGUKKyAgICAgICAgICAgICAgICAgICAgICB3RGVzYyA9IHdJbnN0LmdldFdvcmtmbG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgcmVwby5hZGRXb3JrZmxvdyh3RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd0luc3Quc2V0V29ya2Zsb3cod0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgd29ya2Zsb3dJbnN0YW5jZSA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZSh3SW5zdCk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93SW5zdGFuY2VzLmFkZCh3b3JrZmxvd0luc3RhbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuZ2luZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyB3b3JrZmxvdyBpbnN0YW5jZXMgYnkgc3RhdHVzZnJvbSB3b3JrZmxvdyBlbmdpbmU6IE1lc3NhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd29ya2Zsb3dJbnN0YW5jZXM7CisgICAgfQorCisgICAgcHVibGljIFZlY3RvciBnZXRXb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBFbmdpbmVFeGNlcHRpb24geworICAgICAgICBMaXN0IHdvcmtmbG93SW5zdHMgPSBudWxsOworCisgICAgICAgIFZlY3RvciB3b3JrZmxvd0luc3RhbmNlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd29ya2Zsb3dJbnN0cyA9IGVuZ2luZS5nZXRJbnN0YW5jZVJlcG9zaXRvcnkoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dJbnN0YW5jZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gZ2V0dGluZyB3b3JrZmxvdyBpbnN0YW5jZXM6IE1lc3NhZ2U6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7CisgICAgICAgICAgICByZXR1cm4gd29ya2Zsb3dJbnN0YW5jZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAod29ya2Zsb3dJbnN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJHZXR0aW5nIHdvcmtmbG93IGluc3RhbmNlczogcmV0cmlldmVkOiAiCisgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJbnN0cy5zaXplKCkgKyAiIGluc3RhbmNlcyIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHdvcmtmbG93SW5zdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSAoV29ya2Zsb3dJbnN0YW5jZSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrZmxvdworICAgICAgICAgICAgICAgICAgICBXb3JrZmxvdyB3RGVzYyA9IHJlcG8uZ2V0V29ya2Zsb3dCeUlkKHdJbnN0LmdldFdvcmtmbG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHdEZXNjID09IG51bGwpeworICAgICAgICAgICAgICAgICAgICAgIC8vcG9zc2libGUgZHluYW1pYyB3b3JrZmxvdworICAgICAgICAgICAgICAgICAgICAgIC8vcmVjb25zaXR1dGUgaXQgZnJvbSBjYWNoZWQgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICB3RGVzYyA9IHdJbnN0LmdldFdvcmtmbG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgLy9ub3cgc2F2ZSBpdAorICAgICAgICAgICAgICAgICAgICAgIHJlcG8uYWRkV29ya2Zsb3cod0Rlc2MpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFjayBmb3Igbm93LCBmaXggdGhpcywgd2Ugc2hvdWxkbid0IGhhdmUgdG8gY2FzdAorICAgICAgICAgICAgICAgICAgICAvLyBoZXJlLCBiYWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduCisgICAgICAgICAgICAgICAgICAgIHdJbnN0LnNldFdvcmtmbG93KHdEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHdvcmtmbG93SW5zdGFuY2UgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2Uod0luc3QpOworICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0luc3RhbmNlcy5hZGQod29ya2Zsb3dJbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd0luc3RhbmNlczsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW5naW5lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIHdvcmtmbG93IGluc3RhbmNlcyBmcm9tIHdvcmtmbG93IGVuZ2luZTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmVjdG9yIGdldFdvcmtmbG93cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCB3b3JrZmxvd0xpc3QgPSByZXBvLmdldFdvcmtmbG93cygpOworICAgICAgICBWZWN0b3Igd29ya2Zsb3dzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGlmICh3b3JrZmxvd0xpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiR2V0dGluZyB3b3JrZmxvd3M6IHJldHJpZXZlZDogIgorICAgICAgICAgICAgICAgICAgICArIHdvcmtmbG93TGlzdC5zaXplKCkgKyAiIHdvcmtmbG93cyIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHdvcmtmbG93TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3cgdyA9IChXb3JrZmxvdykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSB3b3JrZmxvdyA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WG1sUnBjV29ya2Zsb3codyk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93cy5hZGQod29ya2Zsb3cpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd3M7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3dzIGZyb20gcmVwb3NpdG9yeTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBXb3JrZmxvd1Rhc2sgdCA9IHJlcG8uZ2V0V29ya2Zsb3dUYXNrQnlJZCh0YXNrSWQpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjV29ya2Zsb3dUYXNrKHQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgdGFzayBieSBpZDogTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRDb25kaXRpb25CeUlkKFN0cmluZyBjb25kaXRpb25JZCkKKyAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGMgPSByZXBvLmdldFdvcmtmbG93Q29uZGl0aW9uQnlJZChjb25kaXRpb25JZCk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRYbWxScGNXb3JrZmxvd0NvbmRpdGlvbihjKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBnZXR0aW5nIGNvbmRpdGlvbiBieSBpZDogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IHJlcG8uZ2V0V29ya2Zsb3dCeUlkKHdvcmtmbG93SWQpOworICAgICAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0WG1sUnBjV29ya2Zsb3cod29ya2Zsb3cpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGdldHRpbmcgd29ya2Zsb3cgYnkgaWQgZnJvbSB0aGUgcmVwb3NpdG9yeTogTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVwZGF0ZU1ldGFkYXRhRm9yV29ya2Zsb3coCisgICAgICAgICAgICBTdHJpbmcgd29ya2Zsb3dJbnN0SWQsIEhhc2h0YWJsZSBtZXRhZGF0YSkgeworICAgICAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbWV0LmFkZE1ldGFkYXRhKG1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLnVwZGF0ZU1ldGFkYXRhKHdvcmtmbG93SW5zdElkLCBtZXQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVXb3JrZmxvd0luc3RhbmNlKEhhc2h0YWJsZSB3b3JrZmxvd0luc3QpIHsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dJbnN0YW5jZUZyb21YbWxScGMod29ya2Zsb3dJbnN0KTsKKyAgICAgICAgcmV0dXJuIGRvVXBkYXRlV29ya2Zsb3dJbnN0YW5jZSh3SW5zdCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V29ya2Zsb3dJbnN0YW5jZUN1cnJlbnRUYXNrU3RhcnREYXRlVGltZSgKKyAgICAgICAgICAgIFN0cmluZyB3SW5zdElkLCBTdHJpbmcgc3RhcnREYXRlVGltZUlzb1N0cikgeworICAgICAgICBXb3JrZmxvd0luc3RhbmNlIHdJbnN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdJbnN0ID0gdGhpcy5lbmdpbmUuZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtmbG93SW5zdGFuY2VCeUlkKHdJbnN0SWQpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB3SW5zdC5zZXRDdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWVJc29TdHIoc3RhcnREYXRlVGltZUlzb1N0cik7CisgICAgICAgIHJldHVybiBkb1VwZGF0ZVdvcmtmbG93SW5zdGFuY2Uod0luc3QpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tFbmREYXRlVGltZSgKKyAgICAgICAgICAgIFN0cmluZyB3SW5zdElkLCBTdHJpbmcgZW5kRGF0ZVRpbWVJc29TdHIpIHsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3SW5zdCA9IHRoaXMuZW5naW5lLmdldEluc3RhbmNlUmVwb3NpdG9yeSgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3SW5zdElkKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgd0luc3Quc2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cihlbmREYXRlVGltZUlzb1N0cik7CisgICAgICAgIHJldHVybiBkb1VwZGF0ZVdvcmtmbG93SW5zdGFuY2Uod0luc3QpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVXb3JrZmxvd0luc3RhbmNlU3RhdHVzKAorICAgICAgICAgICAgU3RyaW5nIHdvcmtmbG93SW5zdGFuY2VJZCwgU3RyaW5nIHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd0luc3QgPSBlbmdpbmUuZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCkuZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoCisgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93SW5zdGFuY2VJZCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIHdJbnN0LnNldFN0YXR1cyhzdGF0dXMpOworICAgICAgICByZXR1cm4gZG9VcGRhdGVXb3JrZmxvd0luc3RhbmNlKHdJbnN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHBvcnROdW0gPSAtMTsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gIlhtbFJwY1dvcmtmbG93TWFuYWdlciAtLXBvcnROdW0gPHBvcnQgbnVtYmVyIGZvciB4bWwgcnBjIHNlcnZpY2U+XG4iOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXBvcnROdW0iKSkgeworICAgICAgICAgICAgICAgIHBvcnROdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydE51bSA9PSAtMSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHVzYWdlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgbG9hZFByb3BlcnRpZXMoKTsKKyAgICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyKHBvcnROdW0pOworCisgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BFUlRJRVNfRklMRV9QUk9QRVJUWSk7CisgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgICAiTG9hZGluZyBXb3JrZmxvdyBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyBmcm9tOiBbIgorICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnRmlsZSArICJdIik7CisgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoCisgICAgICAgICAgICAgICAgY29uZmlnRmlsZSkpKTsKKyAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgV29ya2Zsb3dFbmdpbmUgZ2V0V29ya2Zsb3dFbmdpbmVGcm9tUHJvcGVydHkoKSB7CisgICAgICAgcmV0dXJuIGdldFdvcmtmbG93RW5naW5lRnJvbUNsYXNzTmFtZShTeXN0ZW0uZ2V0UHJvcGVydHkoCisgICAgICAgICAgICAgV09SS0ZMT1dfRU5HSU5FX0ZBQ1RPUllfUFJPUEVSVFksCisgICAgICAgICAgICAgVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lRmFjdG9yeS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBXb3JrZmxvd1JlcG9zaXRvcnkgZ2V0V29ya2Zsb3dSZXBvc2l0b3J5RnJvbVByb3BlcnR5KCkgeworICAgICAgIHJldHVybiBnZXRXb3JrZmxvd1JlcG9zaXRvcnlGcm9tQ2xhc3NOYW1lKFN5c3RlbS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICBXT1JLRkxPV19SRVBPU0lUT1JZX0ZBQ1RPUllfUFJPUEVSVFksCisgICAgICAgICAgICAgRGF0YVNvdXJjZVdvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBHZXQgaG9zdG5hbWUgYnkgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBJUCBhZGRyZXNzCisgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGhvc3QgbmFtZQorICAgICAgICAgICAgU3RyaW5nIGhvc3RuYW1lID0gYWRkci5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIGhvc3RuYW1lOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBVUkwgc2FmZUdldFVybEZyb21TdHJpbmcoU3RyaW5nIHVybFN0cikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJsU3RyKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRvVXBkYXRlV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbmdpbmUuZ2V0SW5zdGFuY2VSZXBvc2l0b3J5KCkudXBkYXRlV29ya2Zsb3dJbnN0YW5jZSh3SW5zdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVXb3JrZmxvd3MoTGlzdCB3SW5zdHMpIHsKKyAgICAgICAgaWYgKHdJbnN0cyAhPSBudWxsICYmIHdJbnN0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3SW5zdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSB3SW5zdCA9IChXb3JrZmxvd0luc3RhbmNlKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZih3SW5zdC5nZXRXb3JrZmxvdygpID09IG51bGwgfHwgCisgICAgICAgICAgICAgICAgCSh3SW5zdC5nZXRXb3JrZmxvdygpICE9IG51bGwgJiYgCisgICAgICAgICAgICAgICAgCSAgKHdJbnN0LmdldFdvcmtmbG93KCkuZ2V0TmFtZSgpID09IG51bGwgfHwgCisgICAgICAgICAgICAgICAgCSAgIHdJbnN0LmdldFdvcmtmbG93KCkuZ2V0SWQoKSA9PSBudWxsKSkpeworICAgICAgICAgICAgICAgICAgICB3SW5zdC5zZXRXb3JrZmxvdyhzYWZlR2V0V29ya2Zsb3dCeUlkKHdJbnN0LmdldFdvcmtmbG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSkpOyAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgCS8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgd29ya2Zsb3cgZXhpc3RzIGluIHRoZSAKKyAgICAgICAgICAgICAgICAJLy8gcmVwbworICAgICAgICAgICAgICAgIAl0cnkgeworCQkJCQkJaWYocmVwby5nZXRXb3JrZmxvd0J5SWQod0luc3QuZ2V0V29ya2Zsb3coKS5nZXRJZCgpKSA9PSBudWxsKXsKKwkJCQkJCQlyZXBvLmFkZFdvcmtmbG93KHdJbnN0LmdldFdvcmtmbG93KCkpOworCQkJCQkJfQorCQkJCQl9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKwkJCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkF0dGVtcHRpbmcgdG8gbG9vayB1cCB3b3JrZmxvdzogWyIrd0luc3QuZ2V0V29ya2Zsb3coKQorCQkJCQkJCQkuZ2V0SWQoKSsiXSBpbiBwb3B1bGF0ZSB3b3JrZmxvd3MuIE1lc3NhZ2U6ICIrZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBXb3JrZmxvdyBzYWZlR2V0V29ya2Zsb3dCeUlkKFN0cmluZyB3b3JrZmxvd0lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcmVwby5nZXRXb3JrZmxvd0J5SWQod29ya2Zsb3dJZCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgZ2V0dGluZyB3b3JrZmxvdyBieSBpdHMgaWQ6IFsiCisgICAgICAgICAgICAgICAgICAgICsgd29ya2Zsb3dJZCArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZmxvdygpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zeXN0ZW0vWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zeXN0ZW0vWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1OGU5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N5c3RlbS9YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuamF2YQpAQCAtMCwwICsxLDcxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbTsKKworLy9BUEFDSEUgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUueG1scnBjLlhtbFJwY0NsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbHJwYy5YbWxScGNFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbC5YbWxScGNTdHJ1Y3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMuY2xpLkNtZExpbmVVdGlsaXR5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFRoZSBYTUwgUlBDIGJhc2VkIHdvcmtmbG93IG1hbmFnZXIgY2xpZW50LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgeworCisgICAgLyogb3VyIHhtbCBycGMgY2xpZW50ICovCisgICAgcHJpdmF0ZSBYbWxScGNDbGllbnQgY2xpZW50ID0gbnVsbDsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlcgorICAgICAgICAgICAgLmdldExvZ2dlcihYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qIHdvcmtmbG93IG1hbmFnZXIgdXJsICovCisgICAgcHJpdmF0ZSBVUkwgd29ya2Zsb3dNYW5hZ2VyVXJsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IHdpdGggdGhlIGdpdmVuCisgICAgICogPGNvZGU+dXJsPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHVybAorICAgICAqICAgICAgICAgICAgVGhlIHVybCBwb2ludGVyIHRvIHRoZSB4bWwgcnBjIHdvcmtmbG93IG1hbmFnZXIgc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KFVSTCB1cmwpIHsKKyAgICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY0NsaWVudCh1cmwpOworICAgICAgICB3b3JrZmxvd01hbmFnZXJVcmwgPSB1cmw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHJlZnJlc2hSZXBvc2l0b3J5KCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLnJlZnJlc2hSZXBvc2l0b3J5IiwgbmV3IFZlY3RvcigpKSkKKyAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICBwdWJsaWMgU3RyaW5nIGV4ZWN1dGVEeW5hbWljV29ya2Zsb3coTGlzdDxTdHJpbmc+IHRhc2tJZHMsIE1ldGFkYXRhIG1ldGFkYXRhKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgVmVjdG9yPFN0cmluZz4gdGFza0lkVmVjdG9yID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgdGFza0lkVmVjdG9yLmFkZEFsbCh0YXNrSWRzKTsKKyAgICBTdHJpbmcgaW5zdElkID0gbnVsbDsKKyAgICAKKyAgICBhcmdMaXN0LmFkZCh0YXNrSWRWZWN0b3IpOworICAgIGFyZ0xpc3QuYWRkKG1ldGFkYXRhLmdldEhhc2h0YWJsZSgpKTsKKworICAgIHRyeSB7CisgICAgICBpbnN0SWQgPSAoU3RyaW5nKSBjbGllbnQuZXhlY3V0ZSgid29ya2Zsb3dtZ3IuZXhlY3V0ZUR5bmFtaWNXb3JrZmxvdyIsCisgICAgICAgICAgYXJnTGlzdCk7CisgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5zdElkOworCisgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFJlZ2lzdGVyZWRFdmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoTGlzdCkgY2xpZW50LmV4ZWN1dGUoIndvcmtmbG93bWdyLmdldFJlZ2lzdGVyZWRFdmVudHMiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0Rmlyc3RQYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBIYXNodGFibGUgcGFnZUhhc2ggPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWdlSGFzaCA9IChIYXNodGFibGUpIGNsaWVudC5leGVjdXRlKCJ3b3JrZmxvd21nci5nZXRGaXJzdFBhZ2UiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd0luc3RhbmNlUGFnZUZyb21YbWxScGMocGFnZUhhc2gpOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBnZXROZXh0UGFnZShXb3JrZmxvd0luc3RhbmNlUGFnZSBjdXJyZW50UGFnZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQoWG1sUnBjU3RydWN0RmFjdG9yeQorICAgICAgICAgICAgICAgIC5nZXRYbWxScGNXb3JrZmxvd0luc3RhbmNlUGFnZShjdXJyZW50UGFnZSkpOworICAgICAgICBIYXNodGFibGUgcGFnZUhhc2ggPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWdlSGFzaCA9IChIYXNodGFibGUpIGNsaWVudC5leGVjdXRlKCJ3b3JrZmxvd21nci5nZXROZXh0UGFnZSIsCisgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93SW5zdGFuY2VQYWdlRnJvbVhtbFJwYyhwYWdlSGFzaCk7CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldFByZXZQYWdlKFdvcmtmbG93SW5zdGFuY2VQYWdlIGN1cnJlbnRQYWdlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgLmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKGN1cnJlbnRQYWdlKSk7CisgICAgICAgIEhhc2h0YWJsZSBwYWdlSGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhZ2VIYXNoID0gKEhhc2h0YWJsZSkgY2xpZW50LmV4ZWN1dGUoIndvcmtmbG93bWdyLmdldFByZXZQYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dJbnN0YW5jZVBhZ2VGcm9tWG1sUnBjKHBhZ2VIYXNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0TGFzdFBhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEhhc2h0YWJsZSBwYWdlSGFzaCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhZ2VIYXNoID0gKEhhc2h0YWJsZSkgY2xpZW50LmV4ZWN1dGUoIndvcmtmbG93bWdyLmdldExhc3RQYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dJbnN0YW5jZVBhZ2VGcm9tWG1sUnBjKHBhZ2VIYXNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhpbnQgcGFnZU51bSwKKyAgICAgICAgICAgIFN0cmluZyBzdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQobmV3IEludGVnZXIocGFnZU51bSkpOworICAgICAgICBhcmdMaXN0LmFkZChzdGF0dXMpOworICAgICAgICBIYXNodGFibGUgcGFnZUhhc2ggPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWdlSGFzaCA9IChIYXNodGFibGUpIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IucGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyIsIGFyZ0xpc3QpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93SW5zdGFuY2VQYWdlRnJvbVhtbFJwYyhwYWdlSGFzaCk7CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIHBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMoaW50IHBhZ2VOdW0pCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKG5ldyBJbnRlZ2VyKHBhZ2VOdW0pKTsKKyAgICAgICAgSGFzaHRhYmxlIHBhZ2VIYXNoID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFnZUhhc2ggPSAoSGFzaHRhYmxlKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLnBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMiLCBhcmdMaXN0KTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd0luc3RhbmNlUGFnZUZyb21YbWxScGMocGFnZUhhc2gpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFdvcmtmbG93c0J5RXZlbnQoU3RyaW5nIGV2ZW50TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Qgd29ya2Zsb3dzID0gbmV3IFZlY3RvcigpOworICAgICAgICBWZWN0b3Igd29ya2Zsb3dWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZChldmVudE5hbWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3b3JrZmxvd1ZlY3RvciA9IChWZWN0b3IpIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dzQnlFdmVudCIsIGFyZ0xpc3QpOworCisgICAgICAgICAgICBpZiAod29ya2Zsb3dWZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHdvcmtmbG93VmVjdG9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgd29ya2Zsb3dIYXNoID0gKEhhc2h0YWJsZSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93IHcgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtmbG93RnJvbVhtbFJwYyh3b3JrZmxvd0hhc2gpOworICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd3MuYWRkKHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHdvcmtmbG93czsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YWRhdGEgZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKFN0cmluZyB3SW5zdElkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHdJbnN0SWQpOworICAgICAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIYXNodGFibGUgaW5zdE1ldEhhc2ggPSAoSGFzaHRhYmxlKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLmdldFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YSIsIGFyZ0xpc3QpOworICAgICAgICAgICAgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgICAgICBtZXQuYWRkTWV0YWRhdGEoaW5zdE1ldEhhc2gpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXQ7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWUoCisgICAgICAgICAgICBTdHJpbmcgd0luc3RJZCwgU3RyaW5nIHN0YXJ0RGF0ZVRpbWVJc29TdHIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQod0luc3RJZCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHN0YXJ0RGF0ZVRpbWVJc29TdHIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLnNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWUiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQod29ya2Zsb3dJbnN0SWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChEb3VibGUpIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHdvcmtmbG93SW5zdElkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLmdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFdvcmtmbG93SW5zdGFuY2UoU3RyaW5nIHdvcmtmbG93SW5zdElkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZCh3b3JrZmxvd0luc3RJZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3Iuc3RvcFdvcmtmbG93SW5zdGFuY2UiLCBhcmdMaXN0KSkKKyAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwYXVzZVdvcmtmbG93SW5zdGFuY2UoU3RyaW5nIHdvcmtmbG93SW5zdElkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZCh3b3JrZmxvd0luc3RJZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IucGF1c2VXb3JrZmxvd0luc3RhbmNlIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVzdW1lV29ya2Zsb3dJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHdvcmtmbG93SW5zdElkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJ3b3JrZmxvd21nci5yZXN1bWVXb3JrZmxvd0luc3RhbmNlIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V29ya2Zsb3dJbnN0YW5jZUN1cnJlbnRUYXNrRW5kRGF0ZVRpbWUoCisgICAgICAgICAgICBTdHJpbmcgd0luc3RJZCwgU3RyaW5nIGVuZERhdGVUaW1lSXNvU3RyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHdJbnN0SWQpOworICAgICAgICBhcmdMaXN0LmFkZChlbmREYXRlVGltZUlzb1N0cik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3Iuc2V0V29ya2Zsb3dJbnN0YW5jZUN1cnJlbnRUYXNrRW5kRGF0ZVRpbWUiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gdXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cygKKyAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0luc3RJZCwgU3RyaW5nIHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZCh3b3JrZmxvd0luc3RJZCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHN0YXR1cyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IudXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gdXBkYXRlV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBhcmdMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBhcmdMaXN0LmFkZChYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2UoaW5zdGFuY2UpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgY2xpZW50LmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICJ3b3JrZmxvd21nci51cGRhdGVXb3JrZmxvd0luc3RhbmNlIiwgYXJnTGlzdCkpCisgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gdXBkYXRlTWV0YWRhdGFGb3JXb3JrZmxvdygKKyAgICAgICAgICAgIFN0cmluZyB3b3JrZmxvd0luc3RJZCwgTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJnTGlzdC5hZGQod29ya2Zsb3dJbnN0SWQpOworICAgICAgICBhcmdMaXN0LmFkZChtZXRhZGF0YS5nZXRIYXNodGFibGUoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IudXBkYXRlTWV0YWRhdGFGb3JXb3JrZmxvdyIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZW5kRXZlbnQoU3RyaW5nIGV2ZW50TmFtZSwgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGV2ZW50TmFtZSk7CisgICAgICAgIGFyZ0xpc3QuYWRkKG1ldGFkYXRhLmdldEhhc2h0YWJsZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCJ3b3JrZmxvd21nci5oYW5kbGVFdmVudCIsIGFyZ0xpc3QpKQorICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93VGFzayBnZXRUYXNrQnlJZChTdHJpbmcgdGFza0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHRhc2tJZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEhhc2h0YWJsZSB0ID0gKEhhc2h0YWJsZSkgY2xpZW50LmV4ZWN1dGUoIndvcmtmbG93bWdyLmdldFRhc2tCeUlkIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCk7CisgICAgICAgICAgICByZXR1cm4gWG1sUnBjU3RydWN0RmFjdG9yeS5nZXRXb3JrZmxvd1Rhc2tGcm9tWG1sUnBjKHQpOworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3dDb25kaXRpb24gZ2V0Q29uZGl0aW9uQnlJZChTdHJpbmcgY29uZGl0aW9uSWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKGNvbmRpdGlvbklkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSGFzaHRhYmxlIGMgPSAoSGFzaHRhYmxlKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLmdldENvbmRpdGlvbkJ5SWQiLCBhcmdMaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBYbWxScGNTdHJ1Y3RGYWN0b3J5LmdldFdvcmtmbG93Q29uZGl0aW9uRnJvbVhtbFJwYyhjKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2UgZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoU3RyaW5nIHdJbnN0SWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHdJbnN0SWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIYXNodGFibGUgd29ya2Zsb3dJbnN0YW5jZSA9IChIYXNodGFibGUpIGNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQiLCBhcmdMaXN0KTsKKyAgICAgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlRnJvbVhtbFJwYyh3b3JrZmxvd0luc3RhbmNlKTsKKyAgICAgICAgICAgIHJldHVybiB3SW5zdDsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3cgZ2V0V29ya2Zsb3dCeUlkKFN0cmluZyB3b3JrZmxvd0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHdvcmtmbG93SWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIYXNodGFibGUgd29ya2Zsb3cgPSAoSGFzaHRhYmxlKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLmdldFdvcmtmbG93QnlJZCIsIGFyZ0xpc3QpOworICAgICAgICAgICAgV29ya2Zsb3cgdyA9IFhtbFJwY1N0cnVjdEZhY3RvcnkuZ2V0V29ya2Zsb3dGcm9tWG1sUnBjKHdvcmtmbG93KTsKKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9IGNhdGNoIChYbWxScGNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmVjdG9yIGdldFdvcmtmbG93cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgVmVjdG9yIHdvcmtzID0gbnVsbDsKKyAgICAgICAgVmVjdG9yIHdvcmtmbG93cyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdvcmtzID0gKFZlY3RvcikgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCJ3b3JrZmxvd21nci5nZXRXb3JrZmxvd3MiLCBhcmdMaXN0KTsKKworICAgICAgICAgICAgaWYgKHdvcmtzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3b3JrZmxvd3MgPSBuZXcgVmVjdG9yKHdvcmtzLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB3b3Jrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHdvcmtmbHcgPSAoSGFzaHRhYmxlKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3cgdyA9IFhtbFJwY1N0cnVjdEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dGcm9tWG1sUnBjKHdvcmtmbHcpOworICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd3MuYWRkKHcpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd3M7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMoU3RyaW5nIHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHN0YXR1cyk7CisgICAgICAgIGludCBudW1JbnN0cyA9IC0xOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBudW1JbnN0cyA9ICgoSW50ZWdlciljbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLmdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMiLCBhcmdMaXN0KSkuaW50VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bUluc3RzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICBWZWN0b3IgYXJnTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW50IG51bUluc3RzID0gLTE7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG51bUluc3RzID0gKChJbnRlZ2VyKWNsaWVudC5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAid29ya2Zsb3dtZ3IuZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMiLCBhcmdMaXN0KSkuaW50VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUnBjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bUluc3RzOworICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3IgZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFyZ0xpc3QuYWRkKHN0YXR1cyk7CisgICAgICAgIFZlY3RvciBpbnN0cyA9IG51bGw7CisgICAgICAgIFZlY3RvciBpbnN0c1VucGFja2VkID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdHMgPSAoVmVjdG9yKSBjbGllbnQuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgIndvcmtmbG93bWdyLmdldFdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMiLCBhcmdMaXN0KTsKKyAgICAgICAgICAgIGlmIChpbnN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdHNVbnBhY2tlZCA9IG5ldyBWZWN0b3IoaW5zdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbnN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGhXaW5zdCA9IChIYXNodGFibGUpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtmbG93SW5zdGFuY2VGcm9tWG1sUnBjKGhXaW5zdCk7CisgICAgICAgICAgICAgICAgICAgIGluc3RzVW5wYWNrZWQuYWRkKGluc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdHNVbnBhY2tlZDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3IgZ2V0V29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGFyZ0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciBpbnN0cyA9IG51bGw7CisgICAgICAgIFZlY3RvciBpbnN0c1VucGFja2VkID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdHMgPSAoVmVjdG9yKSBjbGllbnQuZXhlY3V0ZSgid29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dJbnN0YW5jZXMiLAorICAgICAgICAgICAgICAgICAgICBhcmdMaXN0KTsKKyAgICAgICAgICAgIGlmIChpbnN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdHNVbnBhY2tlZCA9IG5ldyBWZWN0b3IoaW5zdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbnN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGhXaW5zdCA9IChIYXNodGFibGUpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBYbWxScGNTdHJ1Y3RGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtmbG93SW5zdGFuY2VGcm9tWG1sUnBjKGhXaW5zdCk7CisgICAgICAgICAgICAgICAgICAgIGluc3RzVW5wYWNrZWQuYWRkKGluc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdHNVbnBhY2tlZDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIH0gY2F0Y2ggKFhtbFJwY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICBDbWRMaW5lVXRpbGl0eSBjbWRMaW5lVXRpbGl0eSA9IG5ldyBDbWRMaW5lVXRpbGl0eSgpOworICAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bihhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdvcmtmbG93TWFuYWdlclVybC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFdvcmtmbG93TWFuYWdlclVybCgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtmbG93TWFuYWdlclVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd29ya2Zsb3dNYW5hZ2VyVXJsCisgICAgICogICAgICAgICAgICBUaGUgd29ya2Zsb3dNYW5hZ2VyVXJsIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZmxvd01hbmFnZXJVcmwoVVJMIHdvcmtmbG93TWFuYWdlclVybCkgeworICAgICAgICB0aGlzLndvcmtmbG93TWFuYWdlclVybCA9IHdvcmtmbG93TWFuYWdlclVybDsKKworICAgICAgICAvLyByZXNldCB0aGUgY2xpZW50CisgICAgICAgIGNsaWVudCA9IG5ldyBYbWxScGNDbGllbnQod29ya2Zsb3dNYW5hZ2VyVXJsKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3Rvb2xzL0luc3RhbmNlUmVwb0NsZWFuZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3Rvb2xzL0luc3RhbmNlUmVwb0NsZWFuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc3OWVjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdG9vbHMvSW5zdGFuY2VSZXBvQ2xlYW5lci5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy50b29sczsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2VQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1N0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5YbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CisKKy8qKgorICogCisgKiBDbGVhbnMgYSB3b3JrZmxvdyBtYW5hZ2VyIGluc3RhbmNlIHJlcG9zaXRvcnkgb2YgZ2hvc3Qgam9icyB0aGF0IHdpbGwgbmV2ZXIKKyAqIGV4ZWN1dGUgYW5kIGNsZWFucyB1cCBqb2IgaGlzdG9yeSBhbmQgcmVwb3NpdG9yeSBzdGF0dXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgSW5zdGFuY2VSZXBvQ2xlYW5lciB7CisKKyAgLyogUEdFIHRhc2sgc3RhdHVzZXMgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBR0lOR19JTlBVVCA9ICJTVEFHSU5HIElOUFVUIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GX0ZJTEVfQlVJTEQgPSAiQlVJTERJTkcgQ09ORklHIEZJTEUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5JTkdfUEdFID0gIlBHRSBFWEVDIjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkFXTElORyA9ICJDUkFXTElORyI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoSW5zdGFuY2VSZXBvQ2xlYW5lci5jbGFzcworICAgICAgLmdldE5hbWUoKSk7CisKKyAgcHJpdmF0ZSBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgd207CisKKyAgcHJpdmF0ZSBMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSByZXA7CisKKyAgcHVibGljIEluc3RhbmNlUmVwb0NsZWFuZXIoKSB7CisgIH0KKworICBwdWJsaWMgSW5zdGFuY2VSZXBvQ2xlYW5lcihTdHJpbmcgd21VcmxTdHIpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMud20gPSBuZXcgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50KG5ldyBVUkwod21VcmxTdHIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlUmVwbyhTdHJpbmcgaWR4UGF0aCkgeworICAgIHRoaXMucmVwID0gbmV3IEx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5KGlkeFBhdGgsIDEwMDApOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHVzYWdlID0gIkluc3RhbmNlUmVwb0NsZWFuZXIgW29wdGlvbnNdXG4iCisgICAgICAgICsgIjx3b3JrZmxvdyBtYW5hZ2VyIHVybD5cbiIgKyAiLS1pZHhQYXRoIDxwYXRoPlxuIjsKKyAgICBpZiAoYXJncy5sZW5ndGggIT0gMSAmJiBhcmdzLmxlbmd0aCAhPSAyKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgSW5zdGFuY2VSZXBvQ2xlYW5lciBjbGVhbiA9IG51bGw7CisgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpIHsKKyAgICAgIFN0cmluZyB3bVVybFN0ciA9IGFyZ3NbMF07CisgICAgICBjbGVhbiA9IG5ldyBJbnN0YW5jZVJlcG9DbGVhbmVyKHdtVXJsU3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIGlkeFBhdGggPSBhcmdzWzFdOworICAgICAgY2xlYW4gPSBuZXcgSW5zdGFuY2VSZXBvQ2xlYW5lcigpOworICAgICAgY2xlYW4uc2V0SW5zdGFuY2VSZXBvKGlkeFBhdGgpOworICAgIH0KKyAgICBjbGVhbi5jbGVhblJlcG9zaXRvcnkoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFuUmVwb3NpdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIHBhZ2UgPSB3bSAhPSBudWxsID8gd20uZ2V0Rmlyc3RQYWdlKCkgOiByZXAKKyAgICAgICAgLmdldEZpcnN0UGFnZSgpOworICAgIHdoaWxlIChwYWdlICE9IG51bGwgJiYgcGFnZS5nZXRQYWdlV29ya2Zsb3dzKCkgIT0gbnVsbAorICAgICAgICAmJiBwYWdlLmdldFBhZ2VXb3JrZmxvd3MoKS5zaXplKCkgPiAwKSB7CisKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywKKyAgICAgICAgICAiQ2xlYW5pbmcgd29ya2Zsb3cgaW5zdGFuY2VzOiBwYWdlOiBbIiArIHBhZ2UuZ2V0UGFnZU51bSgpICsgIl0gb2YgWyIKKyAgICAgICAgICAgICAgKyBwYWdlLmdldFRvdGFsUGFnZXMoKSArICJdOiBwYWdlIHNpemU6IFsiICsgcGFnZS5nZXRQYWdlU2l6ZSgpCisgICAgICAgICAgICAgICsgIl0iKTsKKyAgICAgIGZvciAoV29ya2Zsb3dJbnN0YW5jZSBpbnN0IDogKExpc3Q8V29ya2Zsb3dJbnN0YW5jZT4pIHBhZ2UKKyAgICAgICAgICAuZ2V0UGFnZVdvcmtmbG93cygpKSB7CisgICAgICAgIGlmIChpbnN0LmdldFN0YXR1cygpLmVxdWFscyhXb3JrZmxvd1N0YXR1cy5DUkVBVEVEKQorICAgICAgICAgICAgfHwgaW5zdC5nZXRTdGF0dXMoKS5lcXVhbHMoV29ya2Zsb3dTdGF0dXMuU1RBUlRFRCkKKyAgICAgICAgICAgIHx8IGluc3QuZ2V0U3RhdHVzKCkuZXF1YWxzKFdvcmtmbG93U3RhdHVzLlFVRVVFRCkKKyAgICAgICAgICAgIHx8IGluc3QuZ2V0U3RhdHVzKCkuZXF1YWxzKFdvcmtmbG93U3RhdHVzLlJFU01HUl9TVUJNSVQpCisgICAgICAgICAgICB8fCBpbnN0LmdldFN0YXR1cygpLmVxdWFscyhDT05GX0ZJTEVfQlVJTEQpCisgICAgICAgICAgICB8fCBpbnN0LmdldFN0YXR1cygpLmVxdWFscyhDUkFXTElORykKKyAgICAgICAgICAgIHx8IGluc3QuZ2V0U3RhdHVzKCkuZXF1YWxzKFJVTk5JTkdfUEdFKQorICAgICAgICAgICAgfHwgaW5zdC5nZXRTdGF0dXMoKS5lcXVhbHMoU1RBR0lOR19JTlBVVCkpIHsKKyAgICAgICAgICBTdHJpbmcgZW5kRGF0ZVRpbWVJc29TdHIgPSBEYXRlVXRpbHMudG9TdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCAiVXBkYXRlZCB3b3JrZmxvdyBpbnN0YW5jZSBpZDogWyIgKyBpbnN0LmdldElkKCkKKyAgICAgICAgICAgICAgKyAiXTogc2V0dGluZyBlbmQgZGF0ZSB0aW1lIHRvOiBbIiArIGVuZERhdGVUaW1lSXNvU3RyICsgIl0iKTsKKyAgICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJFeGlzdGluZyBzdGF0dXM6IFsiICsgaW5zdC5nZXRTdGF0dXMoKQorICAgICAgICAgICAgICArICJdOiBzZXR0aW5nIHRvIFsiICsgV29ya2Zsb3dTdGF0dXMuRklOSVNIRUQgKyAiXSIpOworICAgICAgICAgIGluc3Quc2V0RW5kRGF0ZVRpbWVJc29TdHIoZW5kRGF0ZVRpbWVJc29TdHIpOworICAgICAgICAgIGlmIChpbnN0LmdldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKSA9PSBudWxsCisgICAgICAgICAgICAgIHx8IChpbnN0LmdldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKSAhPSBudWxsICYmIGluc3QKKyAgICAgICAgICAgICAgICAgIC5nZXRTdGFydERhdGVUaW1lSXNvU3RyKCkuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIGluc3Quc2V0U3RhcnREYXRlVGltZUlzb1N0cihlbmREYXRlVGltZUlzb1N0cik7CisgICAgICAgICAgfQorICAgICAgICAgIGluc3Quc2V0U3RhdHVzKFdvcmtmbG93U3RhdHVzLkZJTklTSEVEKTsKKyAgICAgICAgICBpZiAod20gIT0gbnVsbCkgeworICAgICAgICAgICAgd20udXBkYXRlV29ya2Zsb3dJbnN0YW5jZShpbnN0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwLnVwZGF0ZVdvcmtmbG93SW5zdGFuY2UoaW5zdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwYWdlLmlzTGFzdFBhZ2UoKSkgeworICAgICAgICBMT0cubG9nKExldmVsLklORk8sICJMYXN0IHNldCBvZiB3b3JrZmxvdyBpbnN0YW5jZXMgY2xlYW5lZC4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBhZ2UgPSB3bSAhPSBudWxsID8gd20uZ2V0TmV4dFBhZ2UocGFnZSkgOiByZXAuZ2V0TmV4dFBhZ2UocGFnZSk7CisKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL0N5Z3dpblNjcmlwdEZpbGUuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvQ3lnd2luU2NyaXB0RmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZGY3MjIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL0N5Z3dpblNjcmlwdEZpbGUuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3Igcml2ZXJtYSAoUmlzaGkgVmVybWEpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBzY3JpcHQgZmlsZSByZXByZXNlbnRpbmcgYSBzZXQgb2YgY29tbWFuZHMgKHdoaWNoIGFyZSBqdXN0CisgKiA8Y29kZT5TdHJpbmc8L2NvZGU+cykgdG8gYmUgcnVuIHRocm91Z2ggYSBjb21tYW5kIHNoZWxsIGluIFdpbmRvd3MgY3lnd2luLiAKKyAqIDwvcD4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ3lnd2luU2NyaXB0RmlsZSBleHRlbmRzIFNjcmlwdEZpbGUgeworCisgICAgLyoqCisgICAgICogCisgICAgICovCisgICAgcHVibGljIEN5Z3dpblNjcmlwdEZpbGUoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIEN5Z3dpblNjcmlwdEZpbGUoU3RyaW5nIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3lnd2luU2NyaXB0RmlsZShTdHJpbmcgc2hlbGwsIExpc3QgY21kcykgeworICAgICAgICBzdXBlcihzaGVsbCwgY21kcyk7CisgICAgfQkJCisJCisJQE92ZXJyaWRlCisJLyoqCisJICogT3ZlcnJpZGUgd3JpdGVTY3JpcHRGaWxlIHRvIGVuc3VyZSBXaW5kb3dzIChjeWd3aW4pIGNvbXBhdGliaWxpdHkgZm9yIGdlbmVyYXRlZCBzY3JpcHRzCisJICovCisgICAgcHVibGljIHZvaWQgd3JpdGVTY3JpcHRGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZmlsZVBhdGgpKSkpOworICAgICAgICAgICAgcHcucHJpbnQodG9TdHJpbmcoKSk7IC8vIENoYW5nZWQgcHJpbnRsbiB0byBwcmludCBmb3IgQ3lnd2luIGNvbXBhdGliaWxpdHkKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgc2NyaXB0IGZpbGUhOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwdy5jbG9zZSgpOworICAgICAgICAgICAgICAgIHB3ID0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CQorCQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9EYlN0cnVjdEZhY3RvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvRGJTdHJ1Y3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjNzM5MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvRGJTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Qcmlvcml0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogQSBGYWN0b3J5IGZvciBjcmVhdGluZyBXb3JrZmxvdyBNYW5hZ2VyIG9iamVjdHMgZnJvbSB7QGxpbmsgUmVzdWx0U2V0fXMuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERiU3RydWN0RmFjdG9yeSB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERiU3RydWN0RmFjdG9yeS5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIERiU3RydWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGNvbnN0cnVjdCBEYlN0cnVjdEZhY3RvcmllcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFdmVudChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZXZlbnROYW1lID0gcnMuZ2V0U3RyaW5nKCJldmVudF9uYW1lIik7CisgICAgICAgIHJldHVybiBldmVudE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXb3JrZmxvd0luc3RhbmNlIGdldFdvcmtmbG93SW5zdGFuY2UoUmVzdWx0U2V0IHJzKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd29ya2Zsb3dJbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgICAgd29ya2Zsb3dJbnN0LnNldFRpbWVzQmxvY2tlZChycy5nZXRJbnQoInRpbWVzX2Jsb2NrZWQiKSk7CisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRTdGF0dXMocnMuZ2V0U3RyaW5nKCJ3b3JrZmxvd19pbnN0YW5jZV9zdGF0dXMiKSk7CisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRJZChycy5nZXRTdHJpbmcoIndvcmtmbG93X2luc3RhbmNlX2lkIikpOworICAgICAgICB3b3JrZmxvd0luc3Quc2V0Q3VycmVudFRhc2tJZChycy5nZXRTdHJpbmcoImN1cnJlbnRfdGFza19pZCIpKTsKKyAgICAgICAgd29ya2Zsb3dJbnN0LnNldFN0YXJ0RGF0ZVRpbWVJc29TdHIocnMuZ2V0U3RyaW5nKCJzdGFydF9kYXRlX3RpbWUiKSk7CisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRFbmREYXRlVGltZUlzb1N0cihycy5nZXRTdHJpbmcoImVuZF9kYXRlX3RpbWUiKSk7CisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRDdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWVJc29TdHIocnMKKyAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJjdXJyZW50X3Rhc2tfc3RhcnRfZGF0ZV90aW1lIikpOworICAgICAgICB3b3JrZmxvd0luc3Quc2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cihycworICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImN1cnJlbnRfdGFza19lbmRfZGF0ZV90aW1lIikpOworICAgICAgICB3b3JrZmxvd0luc3Quc2V0UHJpb3JpdHkoUHJpb3JpdHkuZ2V0UHJpb3JpdHkocnMuZ2V0RG91YmxlKCJwcmlvcml0eSIpKSk7CisgICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gbmV3IFdvcmtmbG93KCk7CisgICAgICAgIHdvcmtmbG93LnNldElkKHJzLmdldFN0cmluZygid29ya2Zsb3dfaWQiKSk7CisgICAgICAgIHdvcmtmbG93SW5zdC5zZXRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgICAgIHJldHVybiB3b3JrZmxvd0luc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXb3JrZmxvdyBnZXRXb3JrZmxvdyhSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBXb3JrZmxvdygpOworICAgICAgICB3b3JrZmxvdy5zZXROYW1lKHJzLmdldFN0cmluZygid29ya2Zsb3dfbmFtZSIpKTsKKyAgICAgICAgd29ya2Zsb3cuc2V0SWQoU3RyaW5nLnZhbHVlT2YocnMuZ2V0SW50KCJ3b3JrZmxvd19pZCIpKSk7CisKKyAgICAgICAgcmV0dXJuIHdvcmtmbG93OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV29ya2Zsb3dUYXNrIGdldFdvcmtmbG93VGFzayhSZXN1bHRTZXQgcnMsIGJvb2xlYW4gc2V0T3JkZXIpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRhc2tDbGFzc05hbWUgPSBycy5nZXRTdHJpbmcoIndvcmtmbG93X3Rhc2tfY2xhc3MiKTsKKworICAgICAgICBpZiAodGFza0NsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICAgICAgICAgIHRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKHRhc2tDbGFzc05hbWUpOworICAgICAgICAgICAgdGFzay5zZXRUYXNrSWQoU3RyaW5nLnZhbHVlT2YocnMuZ2V0SW50KCJ3b3JrZmxvd190YXNrX2lkIikpKTsKKyAgICAgICAgICAgIHRhc2suc2V0VGFza05hbWUocnMuZ2V0U3RyaW5nKCJ3b3JrZmxvd190YXNrX25hbWUiKSk7CisgICAgICAgICAgICBpZiAoc2V0T3JkZXIpIHsKKyAgICAgICAgICAgICAgICB0YXNrLnNldE9yZGVyKHJzLmdldEludCgidGFza19vcmRlciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0YXNrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV29ya2Zsb3dDb25kaXRpb24gZ2V0V29ya2Zsb3dDb25kaXRpb24oUmVzdWx0U2V0IHJzLAorICAgICAgICAgICAgYm9vbGVhbiBzZXRPcmRlcikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGNvbmRpdGlvbkNsYXNzTmFtZSA9IHJzLmdldFN0cmluZygid29ya2Zsb3dfY29uZGl0aW9uX2NsYXNzIik7CisKKyAgICAgICAgaWYgKGNvbmRpdGlvbkNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICAgICAgICAgIGNvbmRpdGlvbi5zZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZShjb25kaXRpb25DbGFzc05hbWUpOworICAgICAgICAgICAgY29uZGl0aW9uLnNldENvbmRpdGlvbklkKFN0cmluZy52YWx1ZU9mKHJzCisgICAgICAgICAgICAgICAgICAgIC5nZXRJbnQoIndvcmtmbG93X2NvbmRpdGlvbl9pZCIpKSk7CisgICAgICAgICAgICBjb25kaXRpb24uc2V0Q29uZGl0aW9uTmFtZShycy5nZXRTdHJpbmcoIndvcmtmbG93X2NvbmRpdGlvbl9uYW1lIikpOworICAgICAgICAgICAgY29uZGl0aW9uLnNldFRpbWVvdXRTZWNvbmRzKHJzLmdldExvbmcoIndvcmtmbG93X2NvbmRpdGlvbl90aW1lb3V0IikpOworICAgICAgICAgICAgY29uZGl0aW9uLnNldE9wdGlvbmFsKHJzLmdldEJvb2xlYW4oIndvcmtmbG93X2NvbmRpdGlvbl9vcHRpb25hbCIpKTsKKyAgICAgICAgICAgIGlmIChzZXRPcmRlcikgeworICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5zZXRPcmRlcihycy5nZXRJbnQoImNvbmRpdGlvbl9vcmRlciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb25kaXRpb247CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL0dlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTM4MjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL0dlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Xb3JrZmxvd0VuZ2luZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucnVubmVyLkVuZ2luZVJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXIuRW5naW5lUnVubmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLldvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Xb3JrZmxvd1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlByaW9yaXR5U29ydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBHZW5lcmljIFdvcmtmbG93IG9iamVjdCBjb25zdHJ1Y3Rpb24gdXRpbGl0aWVzLgorICoKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5IHsKKworCS8qIG91ciBsb2cgc3RyZWFtICovCisJcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmNsYXNzCisJCQkuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9ueworCQl0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKwkJIkRvbid0IGluc3RhbnRpYXRlIFhNTCBTdHJ1Y3QgRmFjdG9yaWVzISIpOworCX0KKworICAgcHVibGljIHN0YXRpYyBXb3JrZmxvd0VuZ2luZSBnZXRXb3JrZmxvd0VuZ2luZUZyb21DbGFzc05hbWUoU3RyaW5nIGVuZ2luZUZhY3RvcnkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICByZXR1cm4gKChXb3JrZmxvd0VuZ2luZUZhY3RvcnkpIENsYXNzLmZvck5hbWUoZW5naW5lRmFjdG9yeSkKKyAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpKS5jcmVhdGVXb3JrZmxvd0VuZ2luZSgpOworICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gIgorICAgICAgICAgICAgICAgKyAibG9hZGluZyB3b3JrZmxvdyBlbmdpbmUgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICArIGVuZ2luZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiAiCisgICAgICAgICAgICAgICArICJsb2FkaW5nIHdvcmtmbG93IGVuZ2luZSBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICsgZW5naW5lRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgIgorICAgICAgICAgICAgICAgKyAid29ya2Zsb3cgZW5naW5lIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgKyBlbmdpbmVGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICB9CisKKwlwdWJsaWMgc3RhdGljIEVuZ2luZVJ1bm5lciBnZXRFbmdpbmVSdW5uZXJGcm9tQ2xhc3NOYW1lKFN0cmluZyBlbmdpbmVGYWN0b3J5KSB7CisJICAgdHJ5IHsKKyAgICAgICAgIHJldHVybiAoKEVuZ2luZVJ1bm5lckZhY3RvcnkpIENsYXNzLmZvck5hbWUoZW5naW5lRmFjdG9yeSkKKyAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpKS5jcmVhdGVFbmdpbmVSdW5uZXIoKTsKKyAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuICIKKyAgICAgICAgICAgICAgICsgImxvYWRpbmcgZW5naW5lIHJ1bm5lciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICsgZW5naW5lRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB3aGVuICIKKyAgICAgICAgICAgICAgICsgImxvYWRpbmcgZW5naW5lIHJ1bm5lciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICsgZW5naW5lRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgIgorICAgICAgICAgICAgICAgKyAiZW5naW5lIHJ1bm5lciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICsgZW5naW5lRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworCX0KKworICAgcHVibGljIHN0YXRpYyBXb3JrZmxvd1JlcG9zaXRvcnkgZ2V0V29ya2Zsb3dSZXBvc2l0b3J5RnJvbUNsYXNzTmFtZShTdHJpbmcgcmVwb3NpdG9yeUZhY3RvcnkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgICByZXR1cm4gKChXb3JrZmxvd1JlcG9zaXRvcnlGYWN0b3J5KSBDbGFzcy5mb3JOYW1lKHJlcG9zaXRvcnlGYWN0b3J5KQorICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCkpLmNyZWF0ZVJlcG9zaXRvcnkoKTsKKyAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuICIKKyAgICAgICAgICAgICAgICsgImxvYWRpbmcgZW5naW5lIHJ1bm5lciBmYWN0b3J5IGNsYXNzICIKKyAgICAgICAgICAgICAgICsgcmVwb3NpdG9yeUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiAiCisgICAgICAgICAgICAgICArICJsb2FkaW5nIGVuZ2luZSBydW5uZXIgZmFjdG9yeSBjbGFzcyAiCisgICAgICAgICAgICAgICArIHJlcG9zaXRvcnlGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gbG9hZGluZyAiCisgICAgICAgICAgICAgICArICJlbmdpbmUgcnVubmVyIGZhY3RvcnkgY2xhc3MgIgorICAgICAgICAgICAgICAgKyByZXBvc2l0b3J5RmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisJcHVibGljIHN0YXRpYyBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBnZXRXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZyb21DbGFzc05hbWUoCisJCQlTdHJpbmcgc2VydmljZUZhY3RvcnkpIHsKKwkJV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCQlDbGFzcyBjbGF6eiA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCWNsYXp6ID0gQ2xhc3MuZm9yTmFtZShzZXJ2aWNlRmFjdG9yeSk7CisJCQlmYWN0b3J5ID0gKFdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKKwkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoZW4gIgorCQkJCQkrICJsb2FkaW5nIHdvcmtmbG93IGluc3RhbmNlIHJlcG9zaXRvcnkgZmFjdG9yeSBjbGFzcyAiCisJCQkJCSsgc2VydmljZUZhY3RvcnkgKyAiIE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gd2hlbiAiCisJCQkJCSsgImxvYWRpbmcgd29ya2Zsb3cgaW5zdGFuY2UgcmVwb3NpdG9yeSBmYWN0b3J5IGNsYXNzICIKKwkJCQkJKyBzZXJ2aWNlRmFjdG9yeSArICIgTWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgIgorCQkJCQkrICJ3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IGZhY3RvcnkgY2xhc3MgIgorCQkJCQkrIHNlcnZpY2VGYWN0b3J5ICsgIiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPHA+CisJICogQ29uc3RydWN0cyBhIHtAbGluayBXb3JrZmxvd1Rhc2tJbnN0YW5jZX0gZnJvbSB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24KKwkgKiBjbGFzcyBuYW1lLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBjbGFzc05hbWUKKwkgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyBwYWNrYWdlIHF1YWxpZmllcnMpCisJICogICAgICAgICAgICB0aGF0IGltcGxlbWVudHMgdGhlIFdvcmtmbG93VGFza0luc3RhbmNlIGludGVyZmFjZSB0bworCSAqICAgICAgICAgICAgY29uc3RydWN0LgorCSAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFdvcmtmbG93VGFza0luc3RhbmNlfSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZWQgYnkKKwkgKiAgICAgICAgIGl0cyBjbGFzcyBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgV29ya2Zsb3dUYXNrSW5zdGFuY2UgZ2V0VGFza09iamVjdEZyb21DbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCisJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgeworCQkJV29ya2Zsb3dUYXNrSW5zdGFuY2UgdGFza0luc3RhbmNlID0gbnVsbDsKKworCQkJdHJ5IHsKKwkJCQlDbGFzcyB3b3JrZmxvd1Rhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJCQl0YXNrSW5zdGFuY2UgPSAoV29ya2Zsb3dUYXNrSW5zdGFuY2UpIHdvcmtmbG93VGFza0NsYXNzLm5ld0luc3RhbmNlKCk7CisKKwkJCQlyZXR1cm4gdGFza0luc3RhbmNlOworCisJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkJCSJDbGFzc05vdEZvdW5kLCBVbmFibGUgdG8gbG9jYXRlIHRhc2sgY2xhc3M6ICIKKwkJCQkJCQkJKyBjbGFzc05hbWUgKyAiOiBjYW5ub3QgaW5zdGFudGlhdGUhIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSB0YXNrIGNsYXNzOiAiCisJCQkJCQkrIGNsYXNzTmFtZSArICI6IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIiAhIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkJCSJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gaW5zdGFudGlhdGluZyB0YXNrIGNsYXNzOiAiCisJCQkJCQkJCSsgY2xhc3NOYW1lICsgIjogY2Fubm90IGluc3RhbnRpYXRlISIpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9IGVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKworICAvKioKKyAgICogPHA+CisgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgV29ya2Zsb3dUYXNrSW5zdGFuY2V9IGZyb20gdGhlIGdpdmVuIGltcGxlbWVudGF0aW9uCisgICAqIGNsYXNzIG5hbWUuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGNsYXNzTmFtZQorICAgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgbmFtZSBvZiB0aGUgaW5uZXIgY2xhc3MgKGluY2x1ZGluZyBwYWNrYWdlIHF1YWxpZmllcnMpCisgICAqICAgICAgICAgICAgdGhhdCBpbXBsZW1lbnRzIHRoZSBXb3JrZmxvd1Rhc2tJbnN0YW5jZSBpbnRlcmZhY2UgdG8KKyAgICogICAgICAgICAgICBjb25zdHJ1Y3QuCisgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFdvcmtmbG93VGFza0luc3RhbmNlfSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZWQgYnkKKyAgICogICAgICAgICBpdHMgY2xhc3MgbmFtZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgV29ya2Zsb3dUYXNrSW5zdGFuY2UgZ2V0VGFza09iamVjdEZyb21Jbm5lckNsYXNzTmFtZShDbGFzczw/PiBlbmNsb3NpbmdJbnN0YW5jZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCisgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB0YXNrSW5zdGFuY2UgPSBudWxsOworCisgICAgICB0cnkgeworICAgICAgICBDbGFzcyB3b3JrZmxvd1Rhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0ID0gd29ya2Zsb3dUYXNrQ2xhc3MuZ2V0Q29uc3RydWN0b3IoZW5jbG9zaW5nSW5zdGFuY2UpOworICAgICAgICB0YXNrSW5zdGFuY2UgPSAoV29ya2Zsb3dUYXNrSW5zdGFuY2UpIGNvbnN0cnVjdC5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIHJldHVybiB0YXNrSW5zdGFuY2U7CisKKyAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAiQ2xhc3NOb3RGb3VuZCwgVW5hYmxlIHRvIGxvY2F0ZSB0YXNrIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiOiBjYW5ub3QgaW5zdGFudGlhdGUhIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSB0YXNrIGNsYXNzOiAiCisgICAgICAgICAgICArIGNsYXNzTmFtZSArICI6IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIiAhIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gaW5zdGFudGlhdGluZyB0YXNrIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiOiBjYW5ub3QgaW5zdGFudGlhdGUhIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFeGNlcHRpb24gd2hlbiBpbnN0YW50aWF0aW5nIHRhc2sgY2xhc3M6ICIKKyAgICAgICAgICAgICAgICArIGNsYXNzTmFtZSArICI6IGNhbm5vdCBpbnN0YW50aWF0ZSEiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHdoZW4gaW5zdGFudGlhdGluZyB0YXNrIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiOiBjYW5ub3QgaW5zdGFudGlhdGUhIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisgIH0KKworCS8qKgorCSAqIDxwPgorCSAqIENvbnN0cnVjdHMgYSB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZX0gZnJvbSB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24KKwkgKiBjbGFzcyBuYW1lLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBjbGFzc05hbWUKKwkgKiAgICAgICAgICAgIFRoZSBTdHJpbmcgbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyBwYWNrYWdlIHF1YWxpZmllcnMpCisJICogICAgICAgICAgICB0aGF0IGltcGxlbWVudHMgdGhlIFdvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UgaW50ZXJmYWNlIHRvIGNvbnN0cnVjdC4KKwkgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlfSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZWQgYnkgaXRzIGNsYXNzCisJICogICAgICAgICBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSBnZXRDb25kaXRpb25PYmplY3RGcm9tQ2xhc3NOYW1lKAorCQkJU3RyaW5nIGNsYXNzTmFtZSkgeworCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKKwkJCVdvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2UgY29uZGl0aW9uSW5zdGFuY2UgPSBudWxsOworCisJCQl0cnkgeworCQkJCUNsYXNzIHdvcmtmbG93Q29uZGl0aW9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisJCQkJY29uZGl0aW9uSW5zdGFuY2UgPSAoV29ya2Zsb3dDb25kaXRpb25JbnN0YW5jZSkgd29ya2Zsb3dDb25kaXRpb25DbGFzcworCQkJCQkJLm5ld0luc3RhbmNlKCk7CisJCQkJcmV0dXJuIGNvbmRpdGlvbkluc3RhbmNlOworCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gbG9jYXRlIGNvbmRpdGlvbiBjbGFzczogIgorCQkJCQkJKyBjbGFzc05hbWUgKyAiOiBjYW5ub3QgaW5zdGFudGlhdGUhIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkJCSJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29uZGl0aW9uIGNsYXNzOiAiICsgY2xhc3NOYW1lCisJCQkJCQkJCSsgIjogUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiICEiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorCQkJCQkJIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBpbnN0YW50aWF0aW5nIGNvbmRpdGlvbiBjbGFzczogIgorCQkJCQkJCQkrIGNsYXNzTmFtZSArICI6IGNhbm5vdCBpbnN0YW50aWF0ZSEiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSBlbHNlCisJCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8cD4KKwkgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtmbG93fSBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBpbXBsZW1lbnRhdGlvbgorCSAqIGNsYXNzIG5hbWUuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGNsYXNzTmFtZQorCSAqICAgICAgICAgICAgVGhlIFN0cmluZyBuYW1lIG9mIHRoZSBjbGFzcyAoaW5jbHVkaW5nIHBhY2thZ2UgcXVhbGlmaWVycykKKwkgKiAgICAgICAgICAgIHRoYXQgaW1wbGVtZW50cyB0aGUgV29ya2Zsb3cgaW50ZXJmYWNlIHRvIGNvbnN0cnVjdC4KKwkgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBXb3JrZmxvd30gaW1wbGVtZW50YXRpb24gc3BlY2lmaWVkIGJ5IGl0cyBjbGFzcworCSAqICAgICAgICAgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdvcmtmbG93IGdldFdvcmtmbG93T2JqZWN0RnJvbUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKXsKKwkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQlXb3JrZmxvdyB3b3JrZmxvdyA9IG51bGw7CisKKwkJCXRyeSB7CisJCQkJQ2xhc3Mgd29ya2Zsb3dDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJCQl3b3JrZmxvdyA9IChXb3JrZmxvdykgd29ya2Zsb3dDbGFzcworCQkJCQkJLm5ld0luc3RhbmNlKCk7CisJCQkJcmV0dXJuIHdvcmtmbG93OworCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gbG9jYXRlIHdvcmtmbG93IGNsYXNzOiAiCisJCQkJCQkrIGNsYXNzTmFtZSArICI6IGNhbm5vdCBpbnN0YW50aWF0ZSEiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorCQkJCQkJIlVuYWJsZSB0byBpbnN0YW50aWF0ZSB3b3JrZmxvdyBjbGFzczogIiArIGNsYXNzTmFtZQorCQkJCQkJCQkrICI6IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIiAhIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUxPRy5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkJCSJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHdoZW4gaW5zdGFudGlhdGluZyB3b3JrZmxvdyBjbGFzczogIgorCQkJCQkJCQkrIGNsYXNzTmFtZSArICI6IGNhbm5vdCBpbnN0YW50aWF0ZSEiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSBlbHNlCisJCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBQcmlvcml0eVNvcnRlciBnZXRQcmlvcml0eVNvcnRlckZyb21DbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSl7CisJICBpZihjbGFzc05hbWUgIT0gbnVsbCl7CisJICAgIHRyeXsKKwkgICAgICBDbGFzczxQcmlvcml0eVNvcnRlcj4gc29ydGVyQ2xhc3MgPSAoQ2xhc3M8UHJpb3JpdHlTb3J0ZXI+KUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsJICAgICAgCisJICAgICAgcmV0dXJuIHNvcnRlckNsYXNzLm5ld0luc3RhbmNlKCk7CisJICAgIH0KKwkgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gbG9jYXRlIHdvcmtmbG93IHByaW9yaXRpemVyIGNsYXNzOiAiCisgICAgICAgICAgICArIGNsYXNzTmFtZSArICI6IGNhbm5vdCBpbnN0YW50aWF0ZSEiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSB3b3JrZmxvdyBwcmlvcml0aXplciBjbGFzczogIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICsgIjogUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiICEiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gd2hlbiBpbnN0YW50aWF0aW5nIHdvcmtmbG93IHByaW9yaXRpemVyIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiOiBjYW5ub3QgaW5zdGFudGlhdGUhIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCSAgfQorCSAgZWxzZSByZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3QgY29weVdvcmtmbG93cyhMaXN0IHdvcmtmbG93cyl7CisJCWlmKHdvcmtmbG93cyAhPSBudWxsKXsKKwkJCUxpc3QgbmV3V29ya2Zsb3dzID0gbmV3IFZlY3Rvcih3b3JrZmxvd3Muc2l6ZSgpKTsKKwkJCWZvcihJdGVyYXRvciBpID0gd29ya2Zsb3dzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworCQkJCVdvcmtmbG93IHcgPSAoV29ya2Zsb3cpaS5uZXh0KCk7CisJCQkJV29ya2Zsb3cgbmV3V29ya2Zsb3cgPSBjb3B5V29ya2Zsb3codyk7CisJCQkJbmV3V29ya2Zsb3dzLmFkZChuZXdXb3JrZmxvdyk7CisJCQl9CisKKwkJCXJldHVybiBuZXdXb3JrZmxvd3M7CisJCX0KKwkJZWxzZSByZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8cD5DcmVhdGVzIGFuIGV4YWN0IGNvcHkgb2YgdGhlIHNwZWNpZmllZCB7QGxpbmsgV29ya2Zsb3d9IDxjb2RlPnc8L2NvZGU+LAorCSAqIGFsbG9jYXRpbmcgbmV3IG1lbW9yeSBmb3IgdGhlIG5ldyBvYmplY3QsIGFuZCB0aGVuIHJldHVybmluZyBpdC4gVGhlIFdvcmtmbG93J3MKKwkgKiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgYW5kIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zIG9uIHRob3NlIHRhc2tzIGFyZSBhbHNvIGNvbnN0cnVjdGVkCisJICogYW5ldywgYW5kIGNvcGllZCBmcm9tIHRoZWlyIG9yaWdpbmFsIGluc3RhbmNlcy48L3A+CisJICoKKwkgKiBAcGFyYW0gdyBUaGUgV29ya2Zsb3cgb2JqZWN0IHRvIGNyZWF0ZSBhIGNvcHkgb2YuCisJICogQHJldHVybiBBIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBXb3JrZmxvdy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdvcmtmbG93IGNvcHlXb3JrZmxvdyhXb3JrZmxvdyB3KXsKKwkJV29ya2Zsb3cgbmV3V29ya2Zsb3cgPSBudWxsOworCisKKwkJbmV3V29ya2Zsb3cgPSBnZXRXb3JrZmxvd09iamVjdEZyb21DbGFzc05hbWUody5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKworCQkvL2NvcHkgdGhyb3VnaAorCQluZXdXb3JrZmxvdy5zZXROYW1lKHcuZ2V0TmFtZSgpKTsKKwkJbmV3V29ya2Zsb3cuc2V0SWQody5nZXRJZCgpKTsKKwkJbmV3V29ya2Zsb3cuc2V0VGFza3MoY29weVRhc2tzKHcuZ2V0VGFza3MoKSkpOworCisJCXJldHVybiBuZXdXb3JrZmxvdzsKKwl9CisKKwkvKioKKwkgKiA8cD5DcmVhdGVzIGNvcGllcyBvZiBlYWNoIHtAbGluayBXb3JrZmxvd1Rhc2t9IHdpdGhpbiB0aGUgc3BlY2lmaWVkCisJICoge0BsaW5rIExpc3R9IG9mIFdvcmtmbG93VGFza3Mgc3BlY2lmaWVkIGJ5IDxjb2RlPnRhc2tMaXN0PC9jb2RlPi4gVGhlIG5ldworCSAqIExpc3Qgb2YgV29ya2Zsb3dUYXNrcyBpcyByZXR1cm5lZC48L3A+CisJICoKKwkgKiBAcGFyYW0gdGFza0xpc3QgVGhlIG9yaWdpbmFsIExpc3Qgb2YgV29ya2Zsb3dUYXNrcyB0byBjb3B5LgorCSAqIEByZXR1cm4gQSBuZXcgTGlzdCBvZiBXb3JrZmxvd1Rhc2tzLCBjb3BpZWQgZnJvbSB0aGUgb3JpZ2luYWwgb25lIHNwZWNpZmllZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3QgY29weVRhc2tzKExpc3QgdGFza0xpc3QpeworCQlpZih0YXNrTGlzdCAhPSBudWxsKXsKKworCQkJTGlzdCBuZXdUYXNrTGlzdCA9IG5ldyBWZWN0b3IodGFza0xpc3Quc2l6ZSgpKTsKKworCQkJZm9yKEl0ZXJhdG9yIGkgPSB0YXNrTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCQlXb3JrZmxvd1Rhc2sgdCA9IChXb3JrZmxvd1Rhc2spaS5uZXh0KCk7CisJCQkJV29ya2Zsb3dUYXNrIG5ld1Rhc2sgPSBjb3B5VGFzayh0KTsKKwkJCQluZXdUYXNrTGlzdC5hZGQobmV3VGFzayk7CisJCQl9CisKKwkJCXJldHVybiBuZXdUYXNrTGlzdDsKKwkJfQorCQllbHNlIHJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgV29ya2Zsb3dUYXNrIGNvcHlUYXNrKFdvcmtmbG93VGFzayB0KXsKKwkJV29ya2Zsb3dUYXNrIG5ld1Rhc2sgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisJCW5ld1Rhc2suc2V0VGFza0NvbmZpZyh0LmdldFRhc2tDb25maWcoKSk7CisJCW5ld1Rhc2suc2V0VGFza0lkKHQuZ2V0VGFza0lkKCkpOworCQluZXdUYXNrLnNldFRhc2tOYW1lKHQuZ2V0VGFza05hbWUoKSk7CisJCW5ld1Rhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKHQuZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkpOworCQluZXdUYXNrLnNldE9yZGVyKHQuZ2V0T3JkZXIoKSk7CisJCW5ld1Rhc2suc2V0Q29uZGl0aW9ucyhjb3B5Q29uZGl0aW9ucyh0LmdldENvbmRpdGlvbnMoKSkpOworCQlyZXR1cm4gbmV3VGFzazsKKwl9CisKKwkvKioKKwkgKiA8cD5DcmVhdGVzIGNvcGllcyBvZiBlYWNoIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn0gd2l0aGluIHRoZSBzcGVjaWZpZWQKKwkgKiB7QGxpbmsgTGlzdH0gb2YgV29ya2Zsb3dDb25kaXRpb25zIHNwZWNpZmllZCBieSA8Y29kZT5jb25kaXRpb25MaXN0PC9jb2RlPi4gVGhlIG5ldworCSAqIExpc3Qgb2YgV29ya2Zsb3dDb25kaXRpb25zIGlzIHJldHVybmVkLjwvcD4KKwkgKgorCSAqIEBwYXJhbSBjb25kaXRpb25MaXN0IFRoZSBvcmlnaW5hbCBMaXN0IG9mIFdvcmtmbG93Q29uZGl0aW9ucyB0byBjb3B5LgorCSAqIEByZXR1cm4gQSBuZXcgTGlzdCBvZiBXb3JrZmxvd0NvbmRpdGlvbnMsIGNvcGllZCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUgc3BlY2lmaWVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCBjb3B5Q29uZGl0aW9ucyhMaXN0IGNvbmRpdGlvbkxpc3QpeworCQlpZihjb25kaXRpb25MaXN0ICE9IG51bGwpeworCQkJTGlzdCBuZXdDb25kaXRpb25MaXN0ID0gbmV3IFZlY3Rvcihjb25kaXRpb25MaXN0LnNpemUoKSk7CisKKwkJCWZvcihJdGVyYXRvciBpID0gY29uZGl0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKXsKKwkJCQlXb3JrZmxvd0NvbmRpdGlvbiBjID0gKFdvcmtmbG93Q29uZGl0aW9uKWkubmV4dCgpOworCQkJCVdvcmtmbG93Q29uZGl0aW9uIG5ld0NvbmRpdGlvbiA9IGNvcHlDb25kaXRpb24oYyk7CisJCQkJbmV3Q29uZGl0aW9uTGlzdC5hZGQobmV3Q29uZGl0aW9uKTsKKwkJCX0KKworCQkJcmV0dXJuIG5ld0NvbmRpdGlvbkxpc3Q7CisJCX0KKwkJZWxzZSByZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdvcmtmbG93Q29uZGl0aW9uIGNvcHlDb25kaXRpb24oV29ya2Zsb3dDb25kaXRpb24gYyl7CisJCVdvcmtmbG93Q29uZGl0aW9uIG5ld0NvbmRpdGlvbiA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbigpOworCQluZXdDb25kaXRpb24uc2V0Q29uZGl0aW9uTmFtZShjLmdldENvbmRpdGlvbk5hbWUoKSk7CisJCW5ld0NvbmRpdGlvbi5zZXRPcmRlcihjLmdldE9yZGVyKCkpOworCQluZXdDb25kaXRpb24uc2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoYy5nZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpKTsKKwkJcmV0dXJuIG5ld0NvbmRpdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvUGFnaW5hdGlvbi5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9QYWdpbmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxYzU1YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvUGFnaW5hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBEZXNjcmliZSB5b3VyIGNsYXNzIGhlcmUKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFnaW5hdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBmaXJzdCBwYWdlIG9mIHByb2R1Y3RzIGZvciBhIHBhcnRpY3VsYXIge0BsaW5rIFByb2R1Y3RUeXBlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0Rmlyc3RQYWdlKCk7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBsYXN0IHBhZ2Ugb2YgcHJvZHVjdHMgZm9yIGEgcGFydGljdWxhciB7QGxpbmsgUHJvZHVjdFR5cGV9LgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBnZXRMYXN0UGFnZSgpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGN1cnJlbnRQYWdlCisgICAgICogICAgICAgICAgICBUaGUgY3VycmVudCBwYWdlIHRoYXQgdGVsbHMgdGhlIGZ1bmN0aW9uIHdoYXQgdGhlIG5leHQgcGFnZSB0bworICAgICAqICAgICAgICAgICAgb2J0YWluIGlzLgorICAgICAqIEByZXR1cm4gVGhlIG5leHQgcGFnZSBpbiB0aGUgUHJvZHVjdFR5cGUgcHJvZHVjdCBsaXN0LCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIGN1cnJlbnRQYWdlLgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBnZXROZXh0UGFnZShXb3JrZmxvd0luc3RhbmNlUGFnZSBjdXJyZW50UGFnZSk7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3VycmVudFBhZ2UKKyAgICAgKiAgICAgICAgICAgIFRoZSBjdXJyZW50UGFnZSB0aGF0IHRlbGxzIHRoZSBmdW5jdGlvbiB3aGF0IHRoZSBwcmV2aW91cyBwYWdlCisgICAgICogICAgICAgICAgICB0byBvYnRhaW4gaXMuCisgICAgICogQHJldHVybiBUaGUgcHJldmlvdXMgcGFnZSBpbiB0aGUgUHJvZHVjdFR5cGUgcHJvZHVjdCBsaXN0LCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIGN1cnJlbnRQYWdlLgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBnZXRQcmV2UGFnZShXb3JrZmxvd0luc3RhbmNlUGFnZSBjdXJyZW50UGFnZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVBhZ2V9IGlkZW50aWZpZWQgYnkgaXRzCisgICAgICogPGNvZGU+cGFnZU51bTwvY29kZT4gYW5kIGFzc29jaWF0ZWQgPGNvZGU+c3RhdHVzPC9jb2RlPiBwYXJhbWV0ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYWdlTnVtCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfSBudW1iZXIgdG8gZ2V0LgorICAgICAqIEBwYXJhbSBzdGF0dXMKKyAgICAgKiAgICAgICAgICAgIElkZW50aWZpZXMgd2hpY2gge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9IHNldCB0byBwYWdpbmF0ZSwKKyAgICAgKiAgICAgICAgICAgIGUuZy4sIG9ubHkge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cyB3aXRoIGEgZ2l2ZW4gc3RhdHVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUGFnZX0gd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzLCBhbmQgcGFnZQorICAgICAqICAgICAgICAgbnVtYmVyLgorICAgICAqIEB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0UGFnZWRXb3JrZmxvd3MoaW50IHBhZ2VOdW0pCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfSBpZGVudGlmaWVkIGJ5IGl0cworICAgICAqIDxjb2RlPnBhZ2VOdW08L2NvZGU+IGFuZCBhc3NvY2lhdGVkIDxjb2RlPnN0YXR1czwvY29kZT4gcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFnZU51bQorICAgICAqICAgICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUGFnZX0gbnVtYmVyIHRvIGdldC4KKyAgICAgKiBAcGFyYW0gc3RhdHVzCisgICAgICogICAgICAgICAgICBJZGVudGlmaWVzIHdoaWNoIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfSBzZXQgdG8gcGFnaW5hdGUsCisgICAgICogICAgICAgICAgICBlLmcuLCBvbmx5IHtAbGluayBXb3JrZmxvd0luc3RhbmNlfXMgd2l0aCBhIGdpdmVuIHN0YXR1cy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVBhZ2V9IHdpdGggdGhlIGdpdmVuIHN0YXR1cywgYW5kIHBhZ2UKKyAgICAgKiAgICAgICAgIG51bWJlci4KKyAgICAgKiBAdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldFBhZ2VkV29ya2Zsb3dzKGludCBwYWdlTnVtLCBTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9TY3JpcHRGaWxlLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL1NjcmlwdEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY0YWQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9TY3JpcHRGaWxlLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIEEgc2NyaXB0IGZpbGUgcmVwcmVzZW50cyBhIHNldCBvZiBjb21tYW5kcyAod2hpY2ggYXJlIGp1c3QKKyAqIDxjb2RlPlN0cmluZzwvY29kZT5zKSB0byBiZSBydW4gdGhyb3VnaCBhIGNvbW1hbmQgc2hlbGwuCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIFNjcmlwdEZpbGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZFNoZWxsID0gbnVsbDsKKworICAgIHByaXZhdGUgTGlzdCBjb21tYW5kcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NyaXB0RmlsZSgpIHsKKyAgICAgICAgY29tbWFuZFNoZWxsID0gIi9iaW4vc2giOworICAgICAgICBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0RmlsZShTdHJpbmcgc2hlbGwpIHsKKyAgICAgICAgY29tbWFuZFNoZWxsID0gc2hlbGw7CisgICAgICAgIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWxlKFN0cmluZyBzaGVsbCwgTGlzdCBjbWRzKSB7CisgICAgICAgIGNvbW1hbmRTaGVsbCA9IHNoZWxsOworICAgICAgICBjb21tYW5kcyA9IGNtZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tYW5kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRDb21tYW5kcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb21tYW5kcworICAgICAqICAgICAgICAgICAgVGhlIGNvbW1hbmRzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kcyhMaXN0IGNvbW1hbmRzKSB7CisgICAgICAgIHRoaXMuY29tbWFuZHMgPSBjb21tYW5kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1hbmRTaGVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmRTaGVsbCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRTaGVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29tbWFuZFNoZWxsCisgICAgICogICAgICAgICAgICBUaGUgY29tbWFuZFNoZWxsIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kU2hlbGwoU3RyaW5nIGNvbW1hbmRTaGVsbCkgeworICAgICAgICB0aGlzLmNvbW1hbmRTaGVsbCA9IGNvbW1hbmRTaGVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgclN0ciA9ICIiOworCisgICAgICAgIHJTdHIgKz0gIiMhIiArIGNvbW1hbmRTaGVsbCArICJcbiI7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tbWFuZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgY21kID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICByU3RyICs9IGNtZCArICJcbiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gclN0cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVNjcmlwdEZpbGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShmaWxlUGF0aCkpKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKHRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyBzY3JpcHQgZmlsZSE6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcHcgPSBudWxsOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9YbWxScGNTdHJ1Y3RGYWN0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL1htbFJwY1N0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E3ZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9YbWxScGNTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1OTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cudXRpbDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Qcmlvcml0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZVBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CisKKy8qKgorICogCisgKiBBIFN0cnVjdCBGYWN0b3J5IGZvciBjcmVhdGluZyBhbmQgdW5wYWNraW5nIFdvcmtmbG93IE9iamVjdHMgdG8gYmUgc2VudCBhbmQKKyAqIHJlY2VpdmVkIGFjcm9zcyB0aGUgWE1MLVJQQyB3aXJlLgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFhtbFJwY1N0cnVjdEZhY3RvcnkgeworCisgIHByaXZhdGUgWG1sUnBjU3RydWN0RmFjdG9yeSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiRG9uJ3QgaW5zdGFudGlhdGUgWG1sUnBjU3RydWN0RmFjdG9yaWVzISIpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSB7QGxpbmsgSGFzaHRhYmxlfSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUGFnZX0KKyAgICogdGhhdCBpcyBzZXJpYWxpemFibGUgb3ZlciB0aGUgWE1MLVJQQyB3aXJlLgorICAgKiAKKyAgICogQHBhcmFtIHBhZ2UKKyAgICogICAgICAgICAgVGhlIHtAbGluayBXb3JrZmxvd0luc3RhbmNlUGFnZX0gdG8gdHVybiBpbnRvIGEge0BsaW5rIEhhc2h0YWJsZX0uCisgICAqIEByZXR1cm4gQSB7QGxpbmsgSGFzaHRhYmxlfSByZXByZXNlbnRhdGlvbiBvZiBhCisgICAqICAgICAgICAge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VQYWdlKAorICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSkgeworICAgIEhhc2h0YWJsZSBwYWdlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwYWdlSGFzaC5wdXQoInRvdGFsUGFnZXMiLCBTdHJpbmcudmFsdWVPZihwYWdlLmdldFRvdGFsUGFnZXMoKSkpOworICAgIHBhZ2VIYXNoLnB1dCgicGFnZU51bSIsIFN0cmluZy52YWx1ZU9mKHBhZ2UuZ2V0UGFnZU51bSgpKSk7CisgICAgcGFnZUhhc2gucHV0KCJwYWdlU2l6ZSIsIFN0cmluZy52YWx1ZU9mKHBhZ2UuZ2V0UGFnZVNpemUoKSkpOworICAgIHBhZ2VIYXNoLnB1dCgicGFnZVdvcmtmbG93cyIsCisgICAgICAgIGdldFhtbFJwY1dvcmtmbG93SW5zdGFuY2VzKHBhZ2UuZ2V0UGFnZVdvcmtmbG93cygpKSk7CisKKyAgICByZXR1cm4gcGFnZUhhc2g7CisKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIGEge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfSBvZmYgb2YgdGhlIFhNTC1SUEMgd2lyZSBieSBjb252ZXJ0aW5nCisgICAqIHRoZSBYTUwtUlBDIHtAbGluayBIYXNodGFibGV9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYWdlIGludG8gYQorICAgKiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZVBhZ2V9LgorICAgKiAKKyAgICogQHBhcmFtIHBhZ2VIYXNoCisgICAqICAgICAgICAgIFRoZSBYTUwtUlBDIHtAbGluayBIYXNodGFibGV9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMKKyAgICogICAgICAgICAge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfS4KKyAgICogQHJldHVybiBUaGUge0BsaW5rIFdvcmtmbG93SW5zdGFuY2VQYWdlfSB0aGF0IHRoaXMgWE1MLVJQQworICAgKiAgICAgICAgIHtAbGluayBIYXNodGFibGV9IHByb3ZpZGVkIHJlcHJlc2VudHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIGdldFdvcmtmbG93SW5zdGFuY2VQYWdlRnJvbVhtbFJwYygKKyAgICAgIEhhc2h0YWJsZSBwYWdlSGFzaCkgeworICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIHBhZ2UgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZVBhZ2UoKTsKKyAgICBwYWdlLnNldFBhZ2VOdW0oSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwYWdlSGFzaC5nZXQoInBhZ2VOdW0iKSkpOworICAgIHBhZ2Uuc2V0UGFnZVNpemUoSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwYWdlSGFzaC5nZXQoInBhZ2VTaXplIikpKTsKKyAgICBwYWdlLnNldFRvdGFsUGFnZXMoSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwYWdlSGFzaC5nZXQoInRvdGFsUGFnZXMiKSkpOworICAgIHBhZ2Uuc2V0UGFnZVdvcmtmbG93cyhnZXRXb3JrZmxvd0luc3RhbmNlc0Zyb21YbWxScGMoKFZlY3RvcikgcGFnZUhhc2gKKyAgICAgICAgLmdldCgicGFnZVdvcmtmbG93cyIpKSk7CisKKyAgICByZXR1cm4gcGFnZTsKKworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBHZXRzIGEge0BsaW5rIEhhc2h0YWJsZX0gcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX0gdG8gYmUKKyAgICogc2VudCBhY3Jvc3MgdGhlIFhNTC1SUEMgd2lyZS4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHdJbnN0CisgICAqICAgICAgICAgIFRoZSBXb3JrZmxvd0luc3RhbmNlIHRvIHR1cm5lZCBpbnRvIGEgamF2YS51dGlsLkhhc2h0YWJsZS4KKyAgICogQHJldHVybiBBIHtAbGluayBIYXNodGFibGV9IHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBIYXNodGFibGUgZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZShXb3JrZmxvd0luc3RhbmNlIHdJbnN0KSB7CisgICAgSGFzaHRhYmxlIHdvcmtmbG93SW5zdGFuY2UgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgd29ya2Zsb3dJbnN0YW5jZS5wdXQoImN1cnJlbnRfdGFza19pZCIsIHdJbnN0LmdldEN1cnJlbnRUYXNrSWQoKSk7CisgICAgd29ya2Zsb3dJbnN0YW5jZS5wdXQoInN0YXR1cyIsIHdJbnN0LmdldFN0YXR1cygpKTsKKyAgICB3b3JrZmxvd0luc3RhbmNlLnB1dCgiaWQiLCB3SW5zdC5nZXRJZCgpKTsKKyAgICB3b3JrZmxvd0luc3RhbmNlLnB1dCgid29ya2Zsb3ciLCBnZXRYbWxScGNXb3JrZmxvdyh3SW5zdC5nZXRXb3JrZmxvdygpKSk7CisgICAgd29ya2Zsb3dJbnN0YW5jZS5wdXQoInN0YXJ0X2RhdGVfdGltZSIsCisgICAgICAgIHdJbnN0LmdldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKSAhPSBudWxsID8gd0luc3QuZ2V0U3RhcnREYXRlVGltZUlzb1N0cigpCisgICAgICAgICAgICA6ICIiKTsKKyAgICB3b3JrZmxvd0luc3RhbmNlLnB1dCgiZW5kX2RhdGVfdGltZSIsCisgICAgICAgIHdJbnN0LmdldEVuZERhdGVUaW1lSXNvU3RyKCkgIT0gbnVsbCA/IHdJbnN0LmdldEVuZERhdGVUaW1lSXNvU3RyKCkKKyAgICAgICAgICAgIDogIiIpOworICAgIHdvcmtmbG93SW5zdGFuY2UucHV0KAorICAgICAgICAiY3VycmVudF90YXNrX3N0YXJ0X2RhdGVfdGltZSIsCisgICAgICAgIHdJbnN0LmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpICE9IG51bGwgPyB3SW5zdAorICAgICAgICAgICAgLmdldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cigpIDogIiIpOworICAgIHdvcmtmbG93SW5zdGFuY2UucHV0KAorICAgICAgICAiY3VycmVudF90YXNrX2VuZF9kYXRlX3RpbWUiLAorICAgICAgICB3SW5zdC5nZXRDdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyKCkgIT0gbnVsbCA/IHdJbnN0CisgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cigpIDogIiIpOworICAgIHdvcmtmbG93SW5zdGFuY2UucHV0KCJzaGFyZWRDb250ZXh0IiwKKyAgICAgICAgd0luc3QuZ2V0U2hhcmVkQ29udGV4dCgpICE9IG51bGwgPyB3SW5zdC5nZXRTaGFyZWRDb250ZXh0KCkKKyAgICAgICAgICAgIC5nZXRIYXNodGFibGUoKSA6IG5ldyBIYXNodGFibGUoKSk7CisgICAgd29ya2Zsb3dJbnN0YW5jZS5wdXQoCisgICAgICAgICJwcmlvcml0eSIsCisgICAgICAgIHdJbnN0LmdldFByaW9yaXR5KCkgIT0gbnVsbCA/IFN0cmluZy52YWx1ZU9mKHdJbnN0LmdldFByaW9yaXR5KCkKKyAgICAgICAgICAgIC5nZXRWYWx1ZSgpKSA6IFN0cmluZy52YWx1ZU9mKFByaW9yaXR5LmdldERlZmF1bHQoKS5nZXRWYWx1ZSgpKSk7CisgICAgcmV0dXJuIHdvcmtmbG93SW5zdGFuY2U7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFdvcmtmbG93SW5zdGFuY2UgZ2V0V29ya2Zsb3dJbnN0YW5jZUZyb21YbWxScGMoCisgICAgICBIYXNodGFibGUgd29ya2Zsb3dJbnN0YW5jZSkgeworICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZSgpOworICAgIHdJbnN0LnNldEN1cnJlbnRUYXNrSWQoKFN0cmluZykgd29ya2Zsb3dJbnN0YW5jZS5nZXQoImN1cnJlbnRfdGFza19pZCIpKTsKKyAgICB3SW5zdC5zZXRTdGF0dXMoKFN0cmluZykgd29ya2Zsb3dJbnN0YW5jZS5nZXQoInN0YXR1cyIpKTsKKyAgICB3SW5zdC5zZXRJZCgoU3RyaW5nKSB3b3JrZmxvd0luc3RhbmNlLmdldCgiaWQiKSk7CisgICAgd0luc3Quc2V0V29ya2Zsb3coZ2V0V29ya2Zsb3dGcm9tWG1sUnBjKChIYXNodGFibGUpIHdvcmtmbG93SW5zdGFuY2UKKyAgICAgICAgLmdldCgid29ya2Zsb3ciKSkpOworICAgIHdJbnN0LnNldFN0YXJ0RGF0ZVRpbWVJc29TdHIoKFN0cmluZykgd29ya2Zsb3dJbnN0YW5jZQorICAgICAgICAuZ2V0KCJzdGFydF9kYXRlX3RpbWUiKSk7CisgICAgd0luc3Quc2V0RW5kRGF0ZVRpbWVJc29TdHIoKFN0cmluZykgd29ya2Zsb3dJbnN0YW5jZS5nZXQoImVuZF9kYXRlX3RpbWUiKSk7CisgICAgd0luc3Quc2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKChTdHJpbmcpIHdvcmtmbG93SW5zdGFuY2UKKyAgICAgICAgLmdldCgiY3VycmVudF90YXNrX3N0YXJ0X2RhdGVfdGltZSIpKTsKKyAgICB3SW5zdC5zZXRDdXJyZW50VGFza0VuZERhdGVUaW1lSXNvU3RyKChTdHJpbmcpIHdvcmtmbG93SW5zdGFuY2UKKyAgICAgICAgLmdldCgiY3VycmVudF90YXNrX2VuZF9kYXRlX3RpbWUiKSk7CisgICAgaWYgKHdvcmtmbG93SW5zdGFuY2UuZ2V0KCJzaGFyZWRDb250ZXh0IikgIT0gbnVsbCkgeworICAgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBtZXQuYWRkTWV0YWRhdGEoKEhhc2h0YWJsZSkgd29ya2Zsb3dJbnN0YW5jZS5nZXQoInNoYXJlZENvbnRleHQiKSk7CisgICAgICB3SW5zdC5zZXRTaGFyZWRDb250ZXh0KG1ldCk7CisgICAgfSBlbHNlCisgICAgICB3SW5zdC5zZXRTaGFyZWRDb250ZXh0KG5ldyBNZXRhZGF0YSgpKTsKKworICAgIGlmICh3b3JrZmxvd0luc3RhbmNlLmdldCgicHJpb3JpdHkiKSAhPSBudWxsKSB7CisgICAgICBQcmlvcml0eSBwID0gUHJpb3JpdHkuZ2V0UHJpb3JpdHkoRG91YmxlCisgICAgICAgICAgLnZhbHVlT2YoKFN0cmluZykgd29ya2Zsb3dJbnN0YW5jZS5nZXQoInByaW9yaXR5IikpKTsKKyAgICB9CisKKyAgICByZXR1cm4gd0luc3Q7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX1zIGZyb20gdGhlaXIgcmVwcmVzZW50YXRpb25zCisgICAqIGFzIHtAbGluayBIYXNodGFibGV9cyBpbiBYTUwtUlBDLgorICAgKiAKKyAgICogQHBhcmFtIGluc3RzVmVjdG9yCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgVmVjdG9yfSBvZiB7QGxpbmsgSGFzaHRhYmxlfSByZXByZXNlbnRhdGlvbnMgb2YKKyAgICogICAgICAgICAge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cy4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX1zIGZyb20gdGhlaXIKKyAgICogICAgICAgICByZXByZXNlbnRhdGlvbnMgYXMge0BsaW5rIEhhc2h0YWJsZX1zIGluIFhNTC1SUEMuCisgICAqLworICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya2Zsb3dJbnN0YW5jZXNGcm9tWG1sUnBjKFZlY3RvciBpbnN0c1ZlY3RvcikgeworICAgIExpc3Qgd0luc3RzID0gbmV3IFZlY3RvcigpOworCisgICAgaWYgKGluc3RzVmVjdG9yICE9IG51bGwgJiYgaW5zdHNWZWN0b3Iuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5zdHNWZWN0b3IuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIEhhc2h0YWJsZSB3SW5zdEhhc2ggPSAoSGFzaHRhYmxlKSBpLm5leHQoKTsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gZ2V0V29ya2Zsb3dJbnN0YW5jZUZyb21YbWxScGMod0luc3RIYXNoKTsKKyAgICAgICAgd0luc3RzLmFkZChpbnN0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd0luc3RzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYW4gWE1MLVJQQyBzZXJpYWxpemFibGUge0BsaW5rIFZlY3Rvcn0gb2Yge0BsaW5rIEhhc2h0YWJsZX0KKyAgICogcmVwcmVzZW50YXRpb25zIG9mIHtAbGluayBXb3JrZmxvd0luc3RhbmNlfXMuCisgICAqIAorICAgKiBAcGFyYW0gd0luc3RzCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93SW5zdGFuY2V9cyB0byBzZXJpYWxpemUuCisgICAqIEByZXR1cm4gQSBYTUwtUlBDIHNlcmlhbGl6YWJsZSB7QGxpbmsgVmVjdG9yfSBvZiB7QGxpbmsgSGFzaHRhYmxlfQorICAgKiAgICAgICAgIHJlcHJlc2VudGF0aW9ucyBvZiB7QGxpbmsgV29ya2Zsb3dJbnN0YW5jZX1zLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZXMoTGlzdCB3SW5zdHMpIHsKKyAgICBWZWN0b3IgaW5zdHNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBpZiAod0luc3RzICE9IG51bGwgJiYgd0luc3RzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHdJbnN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gKFdvcmtmbG93SW5zdGFuY2UpIGkubmV4dCgpOworICAgICAgICBpbnN0c1ZlY3Rvci5hZGQoZ2V0WG1sUnBjV29ya2Zsb3dJbnN0YW5jZShpbnN0KSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGluc3RzVmVjdG9yOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBHZXRzIGEge0BsaW5rIEhhc2h0YWJsZX0gcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgV29ya2Zsb3d9IHRvIGJlIHNlbnQKKyAgICogYWNyb3NzIHRoZSBYTUwtUlBDIHdpcmUuCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSB3CisgICAqICAgICAgICAgIFRoZSBXb3JrZmxvdyB0byBiZSB0dXJuZWQgaW50byBhIGphdmEudXRpbC5IYXNodGFibGUKKyAgICogQHJldHVybiBBIHtAbGluayBIYXNodGFibGV9IHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFdvcmtmbG93fS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFhtbFJwY1dvcmtmbG93KFdvcmtmbG93IHcpIHsKKyAgICBIYXNodGFibGUgd29ya2Zsb3cgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgd29ya2Zsb3cucHV0KCJpZCIsIHcuZ2V0SWQoKSk7CisgICAgd29ya2Zsb3cucHV0KCJuYW1lIiwgdy5nZXROYW1lKCkgIT0gbnVsbCA/IHcuZ2V0TmFtZSgpIDogIiIpOworICAgIHdvcmtmbG93LnB1dCgidGFza3MiLCBnZXRYbWxScGNXb3JrZmxvd1Rhc2tzKHcuZ2V0VGFza3MoKSkpOworICAgIHdvcmtmbG93LnB1dCgiY29uZGl0aW9ucyIsIGdldFhtbFJwY1dvcmtmbG93Q29uZGl0aW9ucyh3LmdldENvbmRpdGlvbnMoKSkpOworCisgICAgcmV0dXJuIHdvcmtmbG93OworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBHZXRzIGEge0BsaW5rIFdvcmtmbG93fSBmcm9tIHRoZSBYTUwtUlBDIHtAbGluayBIYXNodGFibGV9IHZlcnNpb24uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSB3CisgICAqICAgICAgICAgIFRoZSBIYXNodGFibGUgdG8gb2J0YWluIGEgV29ya2Zsb3cgZnJvbS4KKyAgICogQHJldHVybiBhIHtAbGluayBXb3JrZmxvd30gZnJvbSB0aGUgWE1MLVJQQyB7QGxpbmsgSGFzaHRhYmxlfSB2ZXJzaW9uLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0Zyb21YbWxScGMoSGFzaHRhYmxlIHcpIHsKKyAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBXb3JrZmxvdygpOworICAgIHdvcmtmbG93LnNldE5hbWUoKFN0cmluZykgdy5nZXQoIm5hbWUiKSk7CisgICAgd29ya2Zsb3cuc2V0SWQoKFN0cmluZykgdy5nZXQoImlkIikpOworICAgIHdvcmtmbG93LnNldFRhc2tzKGdldFdvcmtmbG93VGFza3NGcm9tWG1sUnBjKChWZWN0b3IpIHcuZ2V0KCJ0YXNrcyIpKSk7CisgICAgd29ya2Zsb3cuc2V0Q29uZGl0aW9ucyhnZXRXb3JrZmxvd0NvbmRpdGlvbnNGcm9tWG1sUnBjKChWZWN0b3IpIHcKKyAgICAgICAgLmdldCgiY29uZGl0aW9ucyIpKSk7CisKKyAgICByZXR1cm4gd29ya2Zsb3c7CisgIH0KKworICAvKioKKyAgICogPHA+CisgICAqIEdldHMgYW4gWE1MLVJQQyB2ZXJzaW9uIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3dUYXNrfSB0byBzZW5kIG92ZXIgdGhlIHdpcmUuCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSB0CisgICAqICAgICAgICAgIFRoZSBXb3JrZmxvd1Rhc2sgdG8gb2J0YWluIGFuIFhNTC1SUEMgSGFzaHRhYmxlIGZyb20uCisgICAqIEByZXR1cm4gYW4gWE1MLVJQQyB2ZXJzaW9uIG9mIHRoZSB7QGxpbmsgV29ya2Zsb3dUYXNrfSB0byBzZW5kIG92ZXIgdGhlCisgICAqICAgICAgICAgd2lyZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFhtbFJwY1dvcmtmbG93VGFzayhXb3JrZmxvd1Rhc2sgdCkgeworICAgIEhhc2h0YWJsZSB0YXNrID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHRhc2sucHV0KCJjbGFzcyIsIHQuZ2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgIHRhc2sucHV0KCJpZCIsIHQuZ2V0VGFza0lkKCkpOworICAgIHRhc2sucHV0KCJuYW1lIiwgdC5nZXRUYXNrTmFtZSgpKTsKKyAgICB0YXNrLnB1dCgib3JkZXIiLCBTdHJpbmcudmFsdWVPZih0LmdldE9yZGVyKCkpKTsKKyAgICB0YXNrLnB1dCgiY29uZGl0aW9ucyIsIGdldFhtbFJwY1dvcmtmbG93Q29uZGl0aW9ucyh0LmdldENvbmRpdGlvbnMoKSkpOworICAgIHRhc2sucHV0KCJjb25maWd1cmF0aW9uIiwKKyAgICAgICAgZ2V0WG1sUnBjV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbih0LmdldFRhc2tDb25maWcoKSkpOworICAgIHRhc2sucHV0KCJyZXF1aXJlZE1ldEZpZWxkcyIsCisgICAgICAgIGdldFhtbFJwY1dvcmtmbG93VGFza1JlcU1ldEZpZWxkcyh0LmdldFJlcXVpcmVkTWV0RmllbGRzKCkpKTsKKyAgICByZXR1cm4gdGFzazsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyBhIHtAbGluayBWZWN0b3J9IHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIExpc3R9IG9mCisgICAqIHtAbGluayBXb3JrZmxvd1Rhc2t9cyB0byBiZSBzZW50IGFjcm9zcyB0aGUgWE1MLVJQQyB3aXJlLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gdGFza3MKKyAgICogICAgICAgICAgVGhlIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMuCisgICAqIAorICAgKiBAcmV0dXJuIEEge0BsaW5rIFZlY3Rvcn0gcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgTGlzdH0gb2YKKyAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dUYXNrfXMuCisgICAqLworICBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRYbWxScGNXb3JrZmxvd1Rhc2tzKExpc3QgdGFza3MpIHsKKyAgICBWZWN0b3Igd1Rhc2tzID0gbmV3IFZlY3RvcigpOworCisgICAgaWYgKHRhc2tzID09IG51bGwpIHsKKyAgICAgIHJldHVybiB3VGFza3M7CisgICAgfQorCisgICAgZm9yIChJdGVyYXRvciBpID0gdGFza3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBXb3JrZmxvd1Rhc2sgdCA9IChXb3JrZmxvd1Rhc2spIGkubmV4dCgpOworICAgICAgSGFzaHRhYmxlIHRhc2sgPSBnZXRYbWxScGNXb3JrZmxvd1Rhc2sodCk7CisgICAgICB3VGFza3MuYWRkKHRhc2spOworICAgIH0KKworICAgIHJldHVybiB3VGFza3M7CisgIH0KKworICAvKioKKyAgICogPHA+CisgICAqIEdldHMgYSB7QGxpbmsgV29ya2Zsb3dUYXNrfSBmcm9tIGFuIFhNTC1SUEMge0BsaW5rIEhhc2h0YWJsZX0gc2VudCBvdmVyIHRoZQorICAgKiB3aXJlLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gdGFzaworICAgKiAgICAgICAgICBUaGUgWE1MLVJQQyBIYXNodGFibGUgdmVyc2lvbiBvZiB0aGUgV29ya2Zsb3dUYXNrLgorICAgKiBAcmV0dXJuIGEge0BsaW5rIFdvcmtmbG93VGFza30gZnJvbSBhbiBYTUwtUlBDIHtAbGluayBIYXNodGFibGV9IHNlbnQgb3ZlcgorICAgKiAgICAgICAgIHRoZSB3aXJlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrRnJvbVhtbFJwYyhIYXNodGFibGUgdGFzaykgeworICAgIFdvcmtmbG93VGFzayB0ID0gbmV3IFdvcmtmbG93VGFzaygpOworICAgIHQuc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKChTdHJpbmcpIHRhc2suZ2V0KCJjbGFzcyIpKTsKKyAgICB0LnNldFRhc2tJZCgoU3RyaW5nKSB0YXNrLmdldCgiaWQiKSk7CisgICAgdC5zZXRUYXNrTmFtZSgoU3RyaW5nKSB0YXNrLmdldCgibmFtZSIpKTsKKyAgICB0LnNldE9yZGVyKEludGVnZXIudmFsdWVPZigoU3RyaW5nKSB0YXNrLmdldCgib3JkZXIiKSkuaW50VmFsdWUoKSk7CisgICAgdC5zZXRUYXNrQ29uZmlnKGdldFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb25Gcm9tWG1sUnBjKChIYXNodGFibGUpIHRhc2sKKyAgICAgICAgLmdldCgiY29uZmlndXJhdGlvbiIpKSk7CisgICAgdC5zZXRDb25kaXRpb25zKGdldFdvcmtmbG93Q29uZGl0aW9uc0Zyb21YbWxScGMoKFZlY3RvcikgdGFzaworICAgICAgICAuZ2V0KCJjb25kaXRpb25zIikpKTsKKyAgICB0LnNldFJlcXVpcmVkTWV0RmllbGRzKGdldFdvcmtmbG93VGFza1JlcU1ldEZpZWxkc0Zyb21YbWxScGMoKFZlY3RvcikgdGFzaworICAgICAgICAuZ2V0KCJyZXF1aXJlZE1ldEZpZWxkcyIpKSk7CisKKyAgICByZXR1cm4gdDsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgZnJvbSBhbiBYTUwtUlBDIHtAbGluayBWZWN0b3J9CisgICAqIC4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIHRza3MKKyAgICogICAgICAgICAgVGhlIHtAbGluayBWZWN0b3J9IG9mIHtAbGluayBXb3JrZmxvd1Rhc2t9cy4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dUYXNrfXMgZnJvbSBhbiBYTUwtUlBDCisgICAqICAgICAgICAge0BsaW5rIFZlY3Rvcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya2Zsb3dUYXNrc0Zyb21YbWxScGMoVmVjdG9yIHRza3MpIHsKKyAgICBMaXN0IHRhc2tzID0gbmV3IFZlY3RvcigpOworCisgICAgZm9yIChJdGVyYXRvciBpID0gdHNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIEhhc2h0YWJsZSB0YXNrSGFzaHRhYmxlID0gKEhhc2h0YWJsZSkgaS5uZXh0KCk7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IGdldFdvcmtmbG93VGFza0Zyb21YbWxScGModGFza0hhc2h0YWJsZSk7CisgICAgICB0YXNrcy5hZGQodGFzayk7CisKKyAgICB9CisgICAgcmV0dXJuIHRhc2tzOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBHZXRzIGFuIFhNTC1SUEMge0BsaW5rIEhhc2h0YWJsZX0gcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAqIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn0gdG8gc2VuZCBvdmVyIHRoZSB3aXJlLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gYworICAgKiAgICAgICAgICBUaGUgV29ya2Zsb3dDb25kaXRpb24gdG8gdHVybiBpbnRvIGFuIFhNTC1SUEMgSGFzaHRhYmxlLgorICAgKiBAcmV0dXJuIGFuIFhNTC1SUEMge0BsaW5rIEhhc2h0YWJsZX0gcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAqICAgICAgICAge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufSB0byBzZW5kIG92ZXIgdGhlIHdpcmUuCisgICAqLworICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXRYbWxScGNXb3JrZmxvd0NvbmRpdGlvbihXb3JrZmxvd0NvbmRpdGlvbiBjKSB7CisgICAgSGFzaHRhYmxlIGNvbmRpdGlvbiA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBjb25kaXRpb24ucHV0KCJjbGFzcyIsIGMuZ2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgY29uZGl0aW9uLnB1dCgiaWQiLCBjLmdldENvbmRpdGlvbklkKCkpOworICAgIGNvbmRpdGlvbi5wdXQoIm5hbWUiLCBjLmdldENvbmRpdGlvbk5hbWUoKSk7CisgICAgY29uZGl0aW9uLnB1dCgib3JkZXIiLCBTdHJpbmcudmFsdWVPZihjLmdldE9yZGVyKCkpKTsKKyAgICBjb25kaXRpb24ucHV0KCJ0aW1lb3V0IiwgU3RyaW5nLnZhbHVlT2YoYy5nZXRUaW1lb3V0U2Vjb25kcygpKSk7CisgICAgY29uZGl0aW9uLnB1dCgib3B0aW9uYWwiLCBTdHJpbmcudmFsdWVPZihjLmlzT3B0aW9uYWwoKSkpOworICAgIGNvbmRpdGlvbi5wdXQoImNvbmZpZ3VyYXRpb24iLAorICAgICAgICBnZXRYbWxScGNXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZyhjLmdldENvbmRDb25maWcoKSkpOworICAgIHJldHVybiBjb25kaXRpb247CisKKyAgfQorCisgIC8qKgorICAgKiBCdWxpZHMgYW4gWE1MLVJQQyBmcmllbmRseSB2ZXJzaW9uIG9mIGEKKyAgICoge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbn0uCisgICAqIAorICAgKiBAcGFyYW0gY29uZgorICAgKiAgICAgICAgICBUaGUge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbn0gdG8gdHJhbnNmb3JtIGludG8gYW4KKyAgICogICAgICAgICAgWE1MLVJQQyB7QGxpbmsgSGFzaHRhYmxlfS4KKyAgICogQHJldHVybiBhbiBYTUwtUlBDIGZyaWVuZGx5IHZlcnNpb24gb2YgYQorICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb259LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBIYXNodGFibGUgZ2V0WG1sUnBjV29ya2Zsb3dDb25kaXRpb25Db25maWcoCisgICAgICBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24gY29uZikgeworICAgIEhhc2h0YWJsZSBjb25mSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBmb3IgKFN0cmluZyBwcm9wTmFtZSA6IChTZXQ8U3RyaW5nPikgKFNldDw/PikgY29uZi5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKKyAgICAgIGNvbmZIYXNoLnB1dChwcm9wTmFtZSwgY29uZi5nZXRQcm9wZXJ0eShwcm9wTmFtZSkpOworICAgIH0KKyAgICByZXR1cm4gY29uZkhhc2g7CisgIH0KKworICAvKioKKyAgICogPHA+CisgICAqIEdldHMgYSB7QGxpbmsgVmVjdG9yfSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIExpc3R9IG9mCisgICAqIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zIHRvIGJlIHNlbnQgYWNyb3NzIHRoZSBYTUwtUlBDIHdpcmUuCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSBjb25kaXRpb25zCisgICAqICAgICAgICAgIFRoZSBMaXN0IG9mIFdvcmtmbG93Q29uZGl0aW9ucyB0byB0dXJuIGludG8gYSBWZWN0b3IuCisgICAqIEByZXR1cm4gQSB7QGxpbmsgVmVjdG9yfSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBMaXN0fSBvZgorICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn1zLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0WG1sUnBjV29ya2Zsb3dDb25kaXRpb25zKExpc3QgY29uZGl0aW9ucykgeworICAgIFZlY3RvciB3Q29uZGl0aW9ucyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qCisgICAgICogYmVjYXVzZSBjb25kaXRpb25zIGFyZSBvcHRpb25hbCwgc28gaWYgdGhleSdyZSBudWxsLCBqdXN0IHJldHVybiBhbiBlbXB0eQorICAgICAqIFZlY3RvcjogWE1MLVJQQyBkb2Vzbid0IHN1cHBvcnQgbnVsbAorICAgICAqLworICAgIGlmIChjb25kaXRpb25zID09IG51bGwpIHsKKyAgICAgIHJldHVybiB3Q29uZGl0aW9uczsKKyAgICB9CisKKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25kaXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgV29ya2Zsb3dDb25kaXRpb24gYyA9IChXb3JrZmxvd0NvbmRpdGlvbikgaS5uZXh0KCk7CisgICAgICBIYXNodGFibGUgY29uZGl0aW9uID0gZ2V0WG1sUnBjV29ya2Zsb3dDb25kaXRpb24oYyk7CisgICAgICB3Q29uZGl0aW9ucy5hZGQoY29uZGl0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gd0NvbmRpdGlvbnM7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgcmVxdWlyZWQge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IG1ldCBmaWVsZHMgZm9yIHRoaXMKKyAgICoge0BsaW5rIFdvcmtmbG93VGFza30uCisgICAqIAorICAgKiBAcGFyYW0gZmllbGRzCisgICAqICAgICAgICAgIFRoZSBmaWVsZHMgcmVxdWlyZWQgZm9yIHRoaXMgdGFzay4KKyAgICogQHJldHVybiBUaGUge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IG1ldCBmaWVsZHMgZm9yIHRoaXMKKyAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dUYXNrfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrZmxvd1Rhc2tSZXFNZXRGaWVsZHNGcm9tWG1sUnBjKFZlY3RvciBmaWVsZHMpIHsKKyAgICBMaXN0IHJlcUZpZWxkcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIHJlcUZpZWxkczsKKyAgICB9CisKKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICBTdHJpbmcgcmVxRmllbGQgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgIHJlcUZpZWxkcy5hZGQocmVxRmllbGQpOworICAgIH0KKworICAgIHJldHVybiByZXFGaWVsZHM7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgdGhhdCBhcmUgcmVxdWlyZWQge0BsaW5rIE1ldGFkYXRhfQorICAgKiBmaWVsZHMgZm9yIHRoaXMge0BsaW5rIFdvcmtmbG93VGFza30uCisgICAqIAorICAgKiBAcGFyYW0gbWV0RmllbGRzCisgICAqICAgICAgICAgIFRoZSByZXF1aXJlZCB7QGxpbmsgTWV0YWRhdGF9IGZpZWxkcy4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoaXMKKyAgICogICAgICAgICB7QGxpbmsgV29ya2Zsb3dUYXNrfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldFhtbFJwY1dvcmtmbG93VGFza1JlcU1ldEZpZWxkcyhMaXN0IG1ldEZpZWxkcykgeworICAgIFZlY3RvciBmaWVsZHMgPSBuZXcgVmVjdG9yKCk7CisgICAgaWYgKG1ldEZpZWxkcyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIGZvciAoSXRlcmF0b3IgaSA9IG1ldEZpZWxkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFN0cmluZyByZXFGaWVsZE5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgIGZpZWxkcy5hZGQocmVxRmllbGROYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmllbGRzOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBHZXRzIGEge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufSBmcm9tIGFuIFhNTC1SUEMge0BsaW5rIEhhc2h0YWJsZX0uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSBjb25kCisgICAqICAgICAgICAgIFRoZSBIYXNodGFibGUgdG8gdHVybiBpbnRvIGEgcmVhbCBXb3JrZmxvd0NvbmRpdGlvbi4KKyAgICogQHJldHVybiBhIHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn0gZnJvbSBhbiBYTUwtUlBDIHtAbGluayBIYXNodGFibGV9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBXb3JrZmxvd0NvbmRpdGlvbiBnZXRXb3JrZmxvd0NvbmRpdGlvbkZyb21YbWxScGMoSGFzaHRhYmxlIGNvbmQpIHsKKyAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICBjb25kaXRpb24uc2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgY29uZC5nZXQoImNsYXNzIikpOworICAgIGNvbmRpdGlvbi5zZXRDb25kaXRpb25JZCgoU3RyaW5nKSBjb25kLmdldCgiaWQiKSk7CisgICAgY29uZGl0aW9uLnNldENvbmRpdGlvbk5hbWUoKFN0cmluZykgY29uZC5nZXQoIm5hbWUiKSk7CisgICAgY29uZGl0aW9uLnNldE9yZGVyKEludGVnZXIudmFsdWVPZigoU3RyaW5nKSBjb25kLmdldCgib3JkZXIiKSkuaW50VmFsdWUoKSk7CisgICAgY29uZGl0aW9uCisgICAgICAgIC5zZXRUaW1lb3V0U2Vjb25kcyhMb25nLnZhbHVlT2YoY29uZC5nZXQoInRpbWVvdXQiKSAhPSBudWxsID8gKFN0cmluZykgY29uZAorICAgICAgICAgICAgLmdldCgidGltZW91dCIpIDogIi0xIikpOworICAgIGNvbmRpdGlvbi5zZXRPcHRpb25hbChCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgY29uZC5nZXQoIm9wdGlvbmFsIikpKTsKKyAgICBjb25kaXRpb24KKyAgICAgICAgLnNldENvbmRDb25maWcoZ2V0V29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uRnJvbVhtbFJwYygoSGFzaHRhYmxlKSBjb25kCisgICAgICAgICAgICAuZ2V0KCJjb25maWd1cmF0aW9uIikpKTsKKyAgICByZXR1cm4gY29uZGl0aW9uOworICB9CisKKyAgLyoqCisgICAqIFVucmF2ZWxzIGEge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbn0gZnJvbSBYTUwtUlBDLgorICAgKiAKKyAgICogQHBhcmFtIGNvbmYKKyAgICogICAgICAgICAgWE1MLVJQQyBmcmllbmRseSBIYXNodGFibGUgcmVwcmVzZW50aW5nIGEKKyAgICogICAgICAgICAge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbn0uCisgICAqIEByZXR1cm4gQSB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9ufSBmcm9tIFhNTC1SUEMuCisgICAqLworICBwdWJsaWMgc3RhdGljIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBnZXRXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb25Gcm9tWG1sUnBjKAorICAgICAgSGFzaHRhYmxlIGNvbmYpIHsKKyAgICBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbigpOworICAgIGZvciAoU3RyaW5nIGtleSA6IChTZXQ8U3RyaW5nPikgKFNldDw/PikgY29uZi5rZXlTZXQoKSkgeworICAgICAgY29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KGtleSwgKFN0cmluZykgY29uZi5nZXQoa2V5KSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZzsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cyBmcm9tIGFuIFhNTC1SUEMKKyAgICoge0BsaW5rIFZlY3Rvcn0uCisgICAqIDwvcD4KKyAgICogCisgICAqIEBwYXJhbSBjb25kcworICAgKiAgICAgICAgICBUaGUge0BsaW5rIFZlY3Rvcn0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMuCisgICAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFdvcmtmbG93Q29uZGl0aW9ufXMgZnJvbSBhbiBYTUwtUlBDCisgICAqICAgICAgICAge0BsaW5rIFZlY3Rvcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya2Zsb3dDb25kaXRpb25zRnJvbVhtbFJwYyhWZWN0b3IgY29uZHMpIHsKKyAgICBMaXN0IGNvbmRpdGlvbnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBpZiAoY29uZHMgIT0gbnVsbCAmJiBjb25kcy5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25kcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgSGFzaHRhYmxlIGNvbmQgPSAoSGFzaHRhYmxlKSBpLm5leHQoKTsKKyAgICAgICAgV29ya2Zsb3dDb25kaXRpb24gY29uZGl0aW9uID0gZ2V0V29ya2Zsb3dDb25kaXRpb25Gcm9tWG1sUnBjKGNvbmQpOworICAgICAgICBjb25kaXRpb25zLmFkZChjb25kaXRpb24pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb25kaXRpb25zOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBHZXRzIGEge0BsaW5rIEhhc2h0YWJsZX0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhc3NlZCBpbgorICAgKiB7QGxpbmsgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbn0ncyB7QGxpbmsgUHJvcGVydGllc30gdG8gYmUgc2VudCBhY3Jvc3MKKyAgICogdGhlIFhNTC1SUEMgd2lyZS4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIGNvbmZpZworICAgKiAgICAgICAgICBUaGUgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiB0byBjb252ZXJ0IHRvIGEgSGFzaHRhYmxlLgorICAgKiBAcmV0dXJuIEEge0BsaW5rIEhhc2h0YWJsZX0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhc3NlZCBpbgorICAgKiAgICAgICAgIHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufSdzIHtAbGluayBQcm9wZXJ0aWVzfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFhtbFJwY1dvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oCisgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgIEhhc2h0YWJsZSBjb25maWd1cmF0aW9uID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgZm9yIChJdGVyYXRvciBpID0gY29uZmlnLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldChuYW1lKTsKKyAgICAgIGNvbmZpZ3VyYXRpb24ucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogR2V0cyBhIHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufSBmcm9tIGFuIFhNTC1SUEMge0BsaW5rIEhhc2h0YWJsZX0uCisgICAqIAorICAgKiBAcGFyYW0gY29uZmlnCisgICAqICAgICAgICAgIFRoZSBvcmlnaW5hbCBIYXNodGFibGUgdmVyc2lvbiBvZiB0aGUgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbi4KKyAgICogQHJldHVybiBBIHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufSBmcm9tIGFuIFhNTC1SUEMKKyAgICogICAgICAgICB7QGxpbmsgSGFzaHRhYmxlfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBnZXRXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uRnJvbVhtbFJwYygKKyAgICAgIEhhc2h0YWJsZSBjb25maWcpIHsKKyAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbigpOworCisgICAgZm9yIChJdGVyYXRvciBpID0gY29uZmlnLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGNvbmZpZy5nZXQobmFtZSk7CisKKyAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9YbWxTdHJ1Y3RGYWN0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy91dGlsL1htbFN0cnVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNjMTUyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9YbWxTdHJ1Y3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKKworLyoqCisgKiAqIEEgY2xhc3MgZm9yIGNvbnN0cnVjdGluZyBXb3JrZmxvdyBNYW5hZ2VyIG9iamVjdHMgZnJvbSBYTUwge0BsaW5rIE5vZGV9cworICogYW5kIHtAbGluayBFbGVtZW50fXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZzaW9uJAorICogCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBYbWxTdHJ1Y3RGYWN0b3J5IHsKKworICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhtbFN0cnVjdEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIFhtbFN0cnVjdEZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkRvbid0IGluc3RhbnRpYXRlIFhNTCBTdHJ1Y3QgRmFjdG9yaWVzISIpOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDcmVhdGVzIHtAbGluayBXb3JrZmxvd31zIGZyb20gdGhlIFhNTCBOb2RlIGFuZCB0aGUgbWFwIG9mIGV4aXN0aW5nCisgICAqIHtAbGluayBXb3JrZmxvd1Rhc2t9cy4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIG5vZGUKKyAgICogICAgICAgICAgVGhlIFhNTCBub2RlIHRvIGNvbnN0cnVjdCB0aGUgV29ya2Zsb3cgZnJvbS4KKyAgICogQHBhcmFtIHRhc2tzCisgICAqICAgICAgICAgIFRoZSB7QGxpbmsgSGFzaE1hcH0gb2YgZXhpc3Rpbmcge0BsaW5rIFdvcmtmbG93VGFza31zLgorICAgKiAKKyAgICogQHBhcmFtIGNvbmRpdGlvbnMKKyAgICogICAgICAgICAgVGhlIHtAbGluayBIYXNoTWFwfSBvZiBleGlzdGluZyB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cy4KKyAgICogCisgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFdvcmtmbG93fSBjcmVhdGVkIGZyb20gdGhlIFhNTCBub2RlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBXb3JrZmxvdyBnZXRXb3JrZmxvdyhOb2RlIG5vZGUsIEhhc2hNYXAgdGFza3MsCisgICAgICBIYXNoTWFwIGNvbmRpdGlvbnMpIHsKKyAgICBFbGVtZW50IHdvcmtmbG93Um9vdCA9IChFbGVtZW50KSBub2RlOworCisgICAgU3RyaW5nIGlkID0gd29ya2Zsb3dSb290LmdldEF0dHJpYnV0ZSgiaWQiKTsKKyAgICBTdHJpbmcgbmFtZSA9IHdvcmtmbG93Um9vdC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKworICAgIFdvcmtmbG93IHdvcmtmbG93ID0gbmV3IFdvcmtmbG93KCk7CisgICAgd29ya2Zsb3cuc2V0TmFtZShuYW1lKTsKKyAgICB3b3JrZmxvdy5zZXRJZChpZCk7CisKKyAgICBFbGVtZW50IHRhc2tFbGVtID0gZ2V0Rmlyc3RFbGVtZW50KCJ0YXNrcyIsIHdvcmtmbG93Um9vdCk7CisgICAgRWxlbWVudCBjb25kaXRpb25zRWxlbSA9IGdldEZpcnN0RWxlbWVudCgiY29uZGl0aW9ucyIsIHdvcmtmbG93Um9vdCk7CisKKyAgICBpZiAodGFza0VsZW0gIT0gbnVsbCkKKyAgICAgIHdvcmtmbG93LnNldFRhc2tzKGdldFRhc2tzKHRhc2tFbGVtLCB0YXNrcykpOworICAgIGlmIChjb25kaXRpb25zRWxlbSAhPSBudWxsKQorICAgICAgd29ya2Zsb3cuc2V0Q29uZGl0aW9ucyhnZXRDb25kaXRpb25zKGNvbmRpdGlvbnNFbGVtLCBjb25kaXRpb25zKSk7CisKKyAgICByZXR1cm4gd29ya2Zsb3c7CisgIH0KKworICAvKioKKyAgICogPHA+CisgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFdvcmtmbG93VGFza30gZnJvbSB0aGUgZ2l2ZW4gWE1MIG5vZGUgYW5kCisgICAqIHtAbGluayBIYXNoTWFwfSBvZiB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cy4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIG5vZGUKKyAgICogICAgICAgICAgVGhlIFhNTCBub2RlIHRvIGNvbnN0cnVjdCB0aGUge0BsaW5rIFdvcmtmbG93VGFza30gZnJvbS4KKyAgICogQHBhcmFtIGNvbmRpdGlvbnMKKyAgICogICAgICAgICAgVGhlIHtAbGluayBIYXNoTWFwfSBvZiB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259cyB0byB1c2Ugd2hlbgorICAgKiAgICAgICAgICBjb25zdHJ1Y3RpbmcgdGhlIFdvcmtmbG93VGFzay4KKyAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgV29ya2Zsb3dUYXNrfSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIFhNTCBub2RlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrKE5vZGUgbm9kZSwgSGFzaE1hcCBjb25kaXRpb25zKSB7CisgICAgRWxlbWVudCB0YXNrTm9kZSA9IChFbGVtZW50KSBub2RlOworCisgICAgU3RyaW5nIHRhc2tDbGFzc05hbWUgPSB0YXNrTm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CisgICAgV29ya2Zsb3dUYXNrIHRhc2sgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisgICAgdGFzay5zZXRUYXNrSW5zdGFuY2VDbGFzc05hbWUodGFza0NsYXNzTmFtZSk7CisKKyAgICB0YXNrLnNldFRhc2tJZCh0YXNrTm9kZS5nZXRBdHRyaWJ1dGUoImlkIikpOworICAgIHRhc2suc2V0VGFza05hbWUodGFza05vZGUuZ2V0QXR0cmlidXRlKCJuYW1lIikpOworCisgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGNvbmRpdGlvbiBJRHMgZm9yIHRoaXMgdGFzayBhbmQgdGhlbiBnZXQgdGhlCisgICAgLy8gY29uZGl0aW9ucyBmb3IgdGhlbQorICAgIHRhc2suc2V0Q29uZGl0aW9ucyhnZXRDb25kaXRpb25zKHRhc2tOb2RlLCBjb25kaXRpb25zKSk7CisKKyAgICBFbGVtZW50IHJlcU1ldEZpZWxkc0VsZW0gPSBnZXRGaXJzdEVsZW1lbnQoInJlcXVpcmVkTWV0RmllbGRzIiwgdGFza05vZGUpOworICAgIGlmIChyZXFNZXRGaWVsZHNFbGVtICE9IG51bGwpIHsKKyAgICAgIHRhc2suc2V0UmVxdWlyZWRNZXRGaWVsZHMoZ2V0UmVxdWlyZWRNZXRGaWVsZHMocmVxTWV0RmllbGRzRWxlbSkpOworICAgIH0KKworICAgIC8vIGxvYWQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICBFbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBnZXRGaXJzdEVsZW1lbnQoImNvbmZpZ3VyYXRpb24iLCB0YXNrTm9kZSk7CisgICAgaWYgKGNvbmZpZ0VsZW1lbnQgIT0gbnVsbCkgeworICAgICAgdGFzay5zZXRUYXNrQ29uZmlnKG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKAorICAgICAgICAgIGdldENvbmZpZ3VyYXRpb24oY29uZmlnRWxlbWVudCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGFzazsKKyAgfQorCisgIC8qKgorICAgKiA8cD4KKyAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgV29ya2Zsb3dDb25kaXRpb259IGZyb20gdGhlIGdpdmVuIFhNTCBOb2RlLgorICAgKiA8L3A+CisgICAqIAorICAgKiBAcGFyYW0gbm9kZQorICAgKiAgICAgICAgICBUaGUgWE1MIG5vZGUgdG8gY29uc3RydWN0IHRoZSBXb3JrZmxvd0NvbmRpdGlvbiBmcm9tLgorICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBXb3JrZmxvd0NvbmRpdGlvbn0gZnJvbSB0aGUgZ2l2ZW4gWE1MIG5vZGUuCisgICAqLworICBwdWJsaWMgc3RhdGljIFdvcmtmbG93Q29uZGl0aW9uIGdldFdvcmtmbG93Q29uZGl0aW9uKE5vZGUgbm9kZSkgeworICAgIEVsZW1lbnQgY29uZGl0aW9uRWxlbWVudCA9IChFbGVtZW50KSBub2RlOworCisgICAgU3RyaW5nIGNvbmRpdGlvbkNsYXNzTmFtZSA9IGNvbmRpdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOworICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbigpOworICAgIGNvbmRpdGlvbi5zZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZShjb25kaXRpb25DbGFzc05hbWUpOworICAgIGNvbmRpdGlvbi5zZXRDb25kaXRpb25JZChjb25kaXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSk7CisgICAgY29uZGl0aW9uLnNldENvbmRpdGlvbk5hbWUoY29uZGl0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7CisgICAgY29uZGl0aW9uCisgICAgICAgIC5zZXRUaW1lb3V0U2Vjb25kcyhMb25nLnZhbHVlT2YoY29uZGl0aW9uRWxlbWVudAorICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgidGltZW91dCIpICE9IG51bGwKKyAgICAgICAgICAgICYmICFjb25kaXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZSgidGltZW91dCIpLmVxdWFscygiIikgPyBjb25kaXRpb25FbGVtZW50CisgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCJ0aW1lb3V0IikgOiAiLTEiKSk7CisgICAgY29uZGl0aW9uLnNldE9wdGlvbmFsKEJvb2xlYW4udmFsdWVPZihjb25kaXRpb25FbGVtZW50CisgICAgICAgIC5nZXRBdHRyaWJ1dGUoIm9wdGlvbmFsIikpKTsKKworICAgIC8vIGxvYWQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICBFbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBnZXRGaXJzdEVsZW1lbnQoImNvbmZpZ3VyYXRpb24iLCBjb25kaXRpb25FbGVtZW50KTsKKyAgICBpZiAoY29uZmlnRWxlbWVudCAhPSBudWxsKSB7CisgICAgICBjb25kaXRpb24uc2V0Q29uZENvbmZpZyhuZXcgV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uKAorICAgICAgICAgIGdldENvbmZpZ3VyYXRpb24oY29uZmlnRWxlbWVudCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29uZGl0aW9uOworCisgIH0KKworICAvKioKKyAgICogCisgICAqIEBwYXJhbSBub2RlCisgICAqIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZXF1aXJlZE1ldEZpZWxkcyhOb2RlIG5vZGUpIHsKKyAgICBFbGVtZW50IHJlcU1ldEZpZWxkc0VsZW0gPSAoRWxlbWVudCkgbm9kZTsKKworICAgIE5vZGVMaXN0IHJlcU1ldEZpZWxkTm9kZXMgPSByZXFNZXRGaWVsZHNFbGVtCisgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWV0ZmllbGQiKTsKKyAgICBMaXN0IHJlcUZpZWxkcyA9IG51bGw7CisKKyAgICBpZiAocmVxTWV0RmllbGROb2RlcyAhPSBudWxsICYmIHJlcU1ldEZpZWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICByZXFGaWVsZHMgPSBuZXcgVmVjdG9yKHJlcU1ldEZpZWxkTm9kZXMuZ2V0TGVuZ3RoKCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXFNZXRGaWVsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCByZXFNZXRGaWVsZEVsZW0gPSAoRWxlbWVudCkgcmVxTWV0RmllbGROb2Rlcy5pdGVtKGkpOworICAgICAgICBTdHJpbmcgcmVxRmllbGROYW1lID0gcmVxTWV0RmllbGRFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICByZXFGaWVsZHMuYWRkKHJlcUZpZWxkTmFtZSk7CisKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVxRmllbGRzOworICB9CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufSBmcm9tIHRoZSBnaXZlbiBYTUwgbm9kZS4KKyAgICogPC9wPgorICAgKiAKKyAgICogQHBhcmFtIG5vZGUKKyAgICogICAgICAgICAgVGhlIFhNTCBub2RlIHRvIGNvbnN0cnVjdCB0aGUgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBmcm9tLgorICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9ufSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBnaXZlbgorICAgKiAgICAgICAgIFhNTCBub2RlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldENvbmZpZ3VyYXRpb24oTm9kZSBub2RlKSB7CisgICAgRWxlbWVudCBjb25maWdOb2RlID0gKEVsZW1lbnQpIG5vZGU7CisKKyAgICBOb2RlTGlzdCBjb25maWdQcm9wZXJ0aWVzID0gY29uZmlnTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcGVydHkiKTsKKworICAgIGlmIChjb25maWdQcm9wZXJ0aWVzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdQcm9wZXJ0aWVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIEVsZW1lbnQgcHJvcEVsZW0gPSAoRWxlbWVudCkgY29uZmlnUHJvcGVydGllcy5pdGVtKGkpOworICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcEVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCisgICAgICBib29sZWFuIGRvUmVwbGFjZSA9IEJvb2xlYW4udmFsdWVPZihwcm9wRWxlbS5nZXRBdHRyaWJ1dGUoImVudlJlcGxhY2UiKSkKKyAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICBpZiAoZG9SZXBsYWNlKSB7CisgICAgICAgIHZhbHVlID0gUGF0aFV0aWxzLnJlcGxhY2VFbnZWYXJpYWJsZXModmFsdWUpOworICAgICAgfQorICAgICAgcHJvcGVydGllcy5wdXQocHJvcEVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIiksIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvcGVydGllczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTWV0YWRhdGEgZ2V0Q29uZmlndXJhdGlvbkFzTWV0YWRhdGEoTm9kZSBjb25maWdOb2RlKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWV0YWRhdGEgY3VyTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoKTsKKyAgICBOb2RlTGlzdCBjdXJHcmFuZENoaWxkcmVuID0gY29uZmlnTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjdXJHcmFuZENoaWxkcmVuLmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgIGlmIChjdXJHcmFuZENoaWxkcmVuLml0ZW0oaykuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInByb3BlcnR5IikpIHsKKyAgICAgICAgRWxlbWVudCBwcm9wZXJ0eSA9IChFbGVtZW50KSBjdXJHcmFuZENoaWxkcmVuLml0ZW0oayk7CisgICAgICAgIFN0cmluZyBkZWxpbSA9IHByb3BlcnR5LmdldEF0dHJpYnV0ZSgiZGVsaW0iKTsKKyAgICAgICAgU3RyaW5nIGVudlJlcGxhY2UgPSBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGUoImVudlJlcGxhY2UiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydHkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oZW52UmVwbGFjZSkpCisgICAgICAgICAgdmFsdWUgPSBQYXRoVXRpbHMuZG9EeW5hbWljUmVwbGFjZW1lbnQodmFsdWUpOworICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGlmIChkZWxpbS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgdmFsdWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlLnNwbGl0KCJcXCIgKyBkZWxpbSkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICBjdXJNZXRhZGF0YS5yZXBsYWNlTWV0YWRhdGEobmFtZSwgdmFsdWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGN1ck1ldGFkYXRhOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxXb3JrZmxvd1Rhc2s+IGdldFRhc2tzKEVsZW1lbnQgcm9vdE5vZGUsIEhhc2hNYXAgdGFza3MpIHsKKyAgICBOb2RlTGlzdCB0YXNrTGlzdCA9IHJvb3ROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YXNrIik7CisgICAgTGlzdDxXb3JrZmxvd1Rhc2s+IHdvcmtmbG93VGFza3MgPSBudWxsOworCisgICAgaWYgKHRhc2tMaXN0ICE9IG51bGwgJiYgdGFza0xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICB3b3JrZmxvd1Rhc2tzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Rhc2s+KHRhc2tMaXN0LmdldExlbmd0aCgpKTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIEVsZW1lbnQgdGFza0VsZW1lbnQgPSAoRWxlbWVudCkgdGFza0xpc3QuaXRlbShpKTsKKworICAgICAgICBXb3JrZmxvd1Rhc2sgdCA9IChXb3JrZmxvd1Rhc2spIHRhc2tzLmdldCh0YXNrRWxlbWVudAorICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisKKyAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgIFdvcmtmbG93VGFzayB3b3JrZmxvd1Rhc2sgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisgICAgICAgICAgd29ya2Zsb3dUYXNrLnNldFRhc2tJbnN0YW5jZUNsYXNzTmFtZSh0LmdldFRhc2tJbnN0YW5jZUNsYXNzTmFtZSgpKTsKKyAgICAgICAgICB3b3JrZmxvd1Rhc2suc2V0Q29uZGl0aW9ucyh0LmdldENvbmRpdGlvbnMoKSk7CisgICAgICAgICAgd29ya2Zsb3dUYXNrLnNldFRhc2tJZCh0LmdldFRhc2tJZCgpKTsKKyAgICAgICAgICB3b3JrZmxvd1Rhc2suc2V0VGFza0NvbmZpZyh0LmdldFRhc2tDb25maWcoKSk7CisgICAgICAgICAgd29ya2Zsb3dUYXNrLnNldFRhc2tOYW1lKHQuZ2V0VGFza05hbWUoKSk7CisgICAgICAgICAgd29ya2Zsb3dUYXNrLnNldE9yZGVyKGkgKyAxKTsKKyAgICAgICAgICB3b3JrZmxvd1Rhc2suc2V0UmVxdWlyZWRNZXRGaWVsZHModC5nZXRSZXF1aXJlZE1ldEZpZWxkcygpKTsKKyAgICAgICAgICB3b3JrZmxvd1Rhc2tzLmFkZCh3b3JrZmxvd1Rhc2spOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gd29ya2Zsb3dUYXNrczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGdldENvbmRpdGlvbnMoRWxlbWVudCByb290Tm9kZSwKKyAgICAgIEhhc2hNYXAgY29uZGl0aW9ucykgeworICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbkxpc3QgPSBuZXcgVmVjdG9yPFdvcmtmbG93Q29uZGl0aW9uPigpOworICAgIE5vZGVMaXN0IGNvbmRpdGlvbk5vZGVzID0gcm9vdE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvbmRpdGlvbiIpOworCisgICAgaWYgKGNvbmRpdGlvbk5vZGVzICE9IG51bGwgJiYgY29uZGl0aW9uTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBjb25kaXRpb25MaXN0ID0gbmV3IFZlY3RvcjxXb3JrZmxvd0NvbmRpdGlvbj4oY29uZGl0aW9uTm9kZXMuZ2V0TGVuZ3RoKCkpOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmRpdGlvbk5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgRWxlbWVudCBjb25kaXRpb25Ob2RlID0gKEVsZW1lbnQpIGNvbmRpdGlvbk5vZGVzLml0ZW0oaSk7CisgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbiA9IChXb3JrZmxvd0NvbmRpdGlvbikgY29uZGl0aW9ucworICAgICAgICAgICAgLmdldChjb25kaXRpb25Ob2RlLmdldEF0dHJpYnV0ZSgiaWQiKSk7CisKKyAgICAgICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgV29ya2Zsb3dDb25kaXRpb24gd29ya2Zsb3dDb25kaXRpb24gPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICAgICAgICB3b3JrZmxvd0NvbmRpdGlvbi5zZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZShjb25kaXRpb24KKyAgICAgICAgICAgICAgLmdldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgICAgICAgIHdvcmtmbG93Q29uZGl0aW9uLnNldENvbmRpdGlvbklkKGNvbmRpdGlvbi5nZXRDb25kaXRpb25JZCgpKTsKKyAgICAgICAgICB3b3JrZmxvd0NvbmRpdGlvbi5zZXRDb25kaXRpb25OYW1lKGNvbmRpdGlvbi5nZXRDb25kaXRpb25OYW1lKCkpOworICAgICAgICAgIHdvcmtmbG93Q29uZGl0aW9uLnNldE9yZGVyKGkgKyAxKTsKKyAgICAgICAgICB3b3JrZmxvd0NvbmRpdGlvbi5zZXRUaW1lb3V0U2Vjb25kcyhjb25kaXRpb24uZ2V0VGltZW91dFNlY29uZHMoKSk7CisgICAgICAgICAgd29ya2Zsb3dDb25kaXRpb24uc2V0T3B0aW9uYWwoY29uZGl0aW9uLmlzT3B0aW9uYWwoKSk7CisgICAgICAgICAgd29ya2Zsb3dDb25kaXRpb24uc2V0Q29uZENvbmZpZyhjb25kaXRpb24uZ2V0Q29uZENvbmZpZygpKTsKKyAgICAgICAgICBjb25kaXRpb25MaXN0LmFkZCh3b3JrZmxvd0NvbmRpdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBjb25kaXRpb25MaXN0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBnZXRGaXJzdEVsZW1lbnQoU3RyaW5nIG5hbWUsIEVsZW1lbnQgcm9vdCkgeworICAgIE5vZGVMaXN0IGxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpOworICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiAoRWxlbWVudCkgbGlzdC5pdGVtKDApOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlRWxlbWVudFRleHQoRWxlbWVudCBub2RlKSB7CisgICAgaWYgKG5vZGUuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCkgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICByZXR1cm4gbm9kZS5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKS5nZXROb2RlVmFsdWUoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KFN0cmluZyBlbGVtTmFtZSwgRWxlbWVudCByb290KSB7CisgICAgRWxlbWVudCBlbGVtID0gZ2V0Rmlyc3RFbGVtZW50KGVsZW1OYW1lLCByb290KTsKKyAgICByZXR1cm4gZ2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbSk7CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcHl0aG9uL3htbHJwYy13cmFwcGVyL29vZHRfbWV0YWRhdGEucHkgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3B5dGhvbi94bWxycGMtd3JhcHBlci9vb2R0X21ldGFkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMWE5YTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3B5dGhvbi94bWxycGMtd3JhcHBlci9vb2R0X21ldGFkYXRhLnB5CkBAIC0wLDAgKzEsMjkgQEAKKyMJTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIwlvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMJZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMJcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIwl0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjCSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMJd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIwlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMJVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIwlzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIwkiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMJS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjCXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMJdW5kZXIgdGhlIExpY2Vuc2UuIAorCisKK2NsYXNzIE1ldGFEYXRhKG9iamVjdCk6CisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlzZWxmLmRhdGEgPSB7fQorCisJZGVmIGFkZE1ldGFEYXRhKHNlbGYsIGtleSwgdmFsdWUpOgorCQlpZiBrZXkgbm90IGluIHNlbGYuZGF0YToKKwkJCXNlbGYuZGF0YVtrZXldID0gW10KKwkJc2VsZi5kYXRhW2tleV0uYXBwZW5kKHZhbHVlKQorCisJZGVmIHRvWG1sUnBjKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5kYXRhCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3B5dGhvbi94bWxycGMtd3JhcHBlci9vb2R0X3dvcmtmbG93X3htbHJwYy5weSBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcHl0aG9uL3htbHJwYy13cmFwcGVyL29vZHRfd29ya2Zsb3dfeG1scnBjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODNjMjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3B5dGhvbi94bWxycGMtd3JhcHBlci9vb2R0X3dvcmtmbG93X3htbHJwYy5weQpAQCAtMCwwICsxLDEzNCBAQAorIwlMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjCW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIwlkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIwlyZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjCXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMJIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIwl3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIwlVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjCXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjCSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIwlLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMJc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIwl1bmRlciB0aGUgTGljZW5zZS4KKworCitpbXBvcnQgeG1scnBjbGliCitmcm9tIG9vZHRfbWV0YWRhdGEgaW1wb3J0IE1ldGFEYXRhCisKKworY2xhc3MgT09EVFdvcmtGbG93V3JhcHBlcihvYmplY3QpOgorCWRlZiBfX2luaXRfXyhzZWxmLCBob3N0KToKKwkJc2VsZi5fc2VydmVyID0geG1scnBjbGliLlNlcnZlcihob3N0KQorCisJI1N0cmluZwkgICAgZXhlY3V0ZUR5bmFtaWNXb3JrZmxvdyhWZWN0b3I8U3RyaW5nPiB0YXNrSWRzLCBIYXNodGFibGUgbWV0YWRhdGEpCisJZGVmIGV4ZWN1dGVEeW5hbWljV29ya2Zsb3coc2VsZiwgdGFza0lkcywgbWV0YWRhdGEpOgorCQlyZXR1cm4gc2VsZi5fc2VydmVyLndvcmtmbG93bWdyLmV4ZWN1dGVEeW5hbWljV29ya2Zsb3codGFza0lkcywgbWV0YWRhdGEpCisJI0hhc2h0YWJsZQlnZXRDb25kaXRpb25CeUlkKFN0cmluZyBjb25kaXRpb25JZCkKKwlkZWYgZ2V0Q29uZGl0aW9uQnlJZChzZWxmLCBjb25kaXRpb25JZCk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0Q29uZGl0aW9uQnlJZChjb25kaXRpb25JZCkKKwkjSGFzaHRhYmxlCWdldEZpcnN0UGFnZSgpCisJZGVmIGdldEZpcnN0UGFnZShzZWxmKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXRGaXJzdFBhZ2UoKQorCSNIYXNodGFibGUJZ2V0TGFzdFBhZ2UoKQorCWRlZiBnZXRMYXN0UGFnZShzZWxmKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXRMYXN0UGFnZSgpCisJI0hhc2h0YWJsZQlnZXROZXh0UGFnZShIYXNodGFibGUgY3VycmVudFBhZ2UpCisJZGVmIGdldE5leHRQYWdlKHNlbGYsIGN1cnJlbnRQYWdlKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXROZXh0UGFnZSgpCisJI2ludAkgICAgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMoKQorCWRlZiBnZXROdW1Xb3JrZmxvd0luc3RhbmNlcyhzZWxmKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXROdW1Xb3JrZmxvd0luc3RhbmNlcygpCisJI2ludAkgICAgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKQorCWRlZiBnZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHNlbGYsIHN0YXR1cyk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhzdGF0dXMpCisJI0hhc2h0YWJsZQlnZXRQcmV2UGFnZShIYXNodGFibGUgY3VycmVudFBhZ2UpCisJZGVmIGdldFByZXZQYWdlKHNlbGYsIGN1cnJlbnRQYWdlKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXRQcmV2UGFnZShjdXJyZW50UGFnZSkKKwkjVmVjdG9yIAlnZXRSZWdpc3RlcmVkRXZlbnRzKCkKKwlkZWYgZ2V0RXZlbnROYW1lcyhzZWxmKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXRSZWdpc3RlcmVkRXZlbnRzKCkKKwkjSGFzaHRhYmxlCWdldFRhc2tCeUlkKFN0cmluZyB0YXNrSWQpCisJZGVmIGdldFRhc2tCeUlkKHNlbGYsIHRhc2tJZCk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0VGFza0J5SWQodGFza0lkKQorCSNIYXNodGFibGUJZ2V0V29ya2Zsb3dCeUlkKFN0cmluZyB3b3JrZmxvd0lkKQorCWRlZiBnZXRXb3JrZmxvd0J5SWQoc2VsZiwgd29ya2Zsb3dJZCk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dCeUlkKHdvcmtmbG93SWQpCisJI2RvdWJsZQkgICAgZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoU3RyaW5nIHdvcmtmbG93SW5zdElkKQorCWRlZiBnZXRXb3JrZmxvd0N1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhzZWxmLCB3b3JrZmxvd0luc3RJZCk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMod29ya2Zsb3dJbnN0SWQpCisJI0hhc2h0YWJsZQlnZXRXb3JrZmxvd0luc3RhbmNlQnlJZChTdHJpbmcgd0luc3RJZCkKKwlkZWYgZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQoc2VsZix3SW5zdElkKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXRXb3JrZmxvd0luc3RhbmNlQnlJZCh3SW5zdElkKQorCSNIYXNodGFibGUJZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKFN0cmluZyB3SW5zdElkKQorCWRlZiBnZXRXb3JrZmxvd0luc3RhbmNlTWV0YWRhdGEoc2VsZiwgd0luc3RJZCk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKHdJbnN0SWQpCisJI1ZlY3RvcgkJZ2V0V29ya2Zsb3dJbnN0YW5jZXMoKQorCWRlZiBnZXRXb3JrZmxvd0luc3RhbmNlcyhzZWxmKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5nZXRXb3JrZmxvd0luc3RhbmNlcygpCisJI1ZlY3RvcgkJZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhTdHJpbmcgc3RhdHVzKQorCWRlZiBnZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKHNlbGYsIHN0YXR1cyk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dJbnN0YW5jZXNCeVN0YXR1cyhzdGF0dXMpCisJI1ZlY3RvcgkJZ2V0V29ya2Zsb3dzKCkKKwlkZWYgZ2V0V29ya2Zsb3dzKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fc2VydmVyLndvcmtmbG93bWdyLmdldFdvcmtmbG93cygpCisJI1ZlY3RvcgkJZ2V0V29ya2Zsb3dzQnlFdmVudChTdHJpbmcgZXZlbnROYW1lKQorCWRlZiBnZXRXb3JrZmxvd3NCeUV2ZW50KHNlbGYsIGV2ZW50TmFtZSk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IuZ2V0V29ya2Zsb3dzQnlFdmVudChldmVudE5hbWUpCisJI2RvdWJsZQkJZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKwlkZWYgZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKHNlbGYsd29ya2Zsb3dJbnN0SWQpOgorCQlyZXR1cm4gZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKHdvcmtmbG93SW5zdElkKQorCSNib29sZWFuCWhhbmRsZUV2ZW50KFN0cmluZyBldmVudE5hbWUsIEhhc2h0YWJsZSBtZXRhZGF0YSkKKwlkZWYgc3RhcnRFdmVudChzZWxmLCBldmVudE5hbWUsIG1ldGFEYXRhKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5oYW5kbGVFdmVudChldmVudE5hbWUsIG1ldGFEYXRhKQorCSNIYXNodGFibGUJcGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhpbnQgcGFnZU51bSkKKwlkZWYgcGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhzZWxmLCBwYWdlTnVtKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5wYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzKHBhZ2VOdW0pCisJI0hhc2h0YWJsZQlwYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzKGludCBwYWdlTnVtLCBTdHJpbmcgc3RhdHVzKShzZWxmLCB3b3JrZmxvd0luc3RJZCkKKwlkZWYgcGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyhzZWxmLCBwYWdlTnVtLCBzdGF0dXMpOgorCQlyZXR1cm4gc2VsZi5fc2VydmVyLndvcmtmbG93bWdyLnBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMocGFnZU51bSwgc3RhdHVzKQorCSNib29sZWFuCXBhdXNlV29ya2Zsb3dJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisJZGVmIHBhdXNlV29ya2Zsb3dJbnN0YW5jZShzZWxmLCB3b3JrZmxvd0luc3RJZCk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IucGF1c2VXb3JrZmxvd0luc3RhbmNlKHdvcmtmbG93SW5zdElkKQorCSNib29sZWFuCXJlc3VtZVdvcmtmbG93SW5zdGFuY2UoU3RyaW5nIHdvcmtmbG93SW5zdElkKQorCWRlZiByZXN1bWVXb3JrZmxvd0luc3RhbmNlKHNlbGYsIHdvcmtmbG93SW5zdElkKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5yZXN1bWVXb3JrZmxvd0luc3RhbmNlKHdvcmtmbG93SW5zdElkKQorCSNib29sZWFuCXNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza0VuZERhdGVUaW1lKFN0cmluZyB3SW5zdElkLCBTdHJpbmcgZW5kRGF0ZVRpbWVJc29TdHIpCisJZGVmIHNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza0VuZERhdGVUaW1lKHNlbGYsIHdvcmtmbG93SW5zdElkLCBlbmREYXRlVGltZUlzb1N0cik6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3Iuc2V0V29ya2Zsb3dJbnN0YW5jZUN1cnJlbnRUYXNrRW5kRGF0ZVRpbWUod29ya2Zsb3dJbnN0SWQsIGVuZERhdGVUaW1lSXNvU3RyKQorCSNib29sZWFuCXNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWUoU3RyaW5nIHdJbnN0SWQsIFN0cmluZyBzdGFydERhdGVUaW1lSXNvU3RyKQorCWRlZiBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tTdGFydERhdGVUaW1lKHNlbGYsIHdvcmtmbG93SW5zdElkLCBzdGFydERhdGVUaW1lSXNvU3RyKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci5zZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tTdGFydERhdGVUaW1lKHdvcmtmbG93SW5zdElkLCBzdGFydERhdGVUaW1lSXNvU3RyKQorCSNib29sZWFuCXN0b3BXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKwlkZWYgc3RvcFdvcmtmbG93SW5zdGFuY2Uoc2VsZiwgd29ya2Zsb3dJbnN0SWQpOgorCQlyZXR1cm4gc2VsZi5fc2VydmVyLndvcmtmbG93bWdyLnN0b3BXb3JrZmxvd0luc3RhbmNlKHdvcmtmbG93SW5zdElkKQorCSNib29sZWFuCXVwZGF0ZU1ldGFkYXRhRm9yV29ya2Zsb3coU3RyaW5nIHdvcmtmbG93SW5zdElkLCBIYXNodGFibGUgbWV0YWRhdGEpCisJZGVmIHVwZGF0ZU1ldGFkYXRhRm9yV29ya2Zsb3coc2VsZiwgd29ya2Zsb3dJbnN0SWQsIG1ldGFkYXRhKToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci51cGRhdGVNZXRhZGF0YUZvcldvcmtmbG93KHdvcmtmbG93SW5zdElkLCBtZXRhZGF0YSkKKwkjYm9vbGVhbgl1cGRhdGVXb3JrZmxvd0luc3RhbmNlKEhhc2h0YWJsZSB3b3JrZmxvd0luc3QpCisJZGVmIHVwZGF0ZVdvcmtmbG93SW5zdGFuY2Uod29ya2Zsb3dJbnN0KToKKwkJcmV0dXJuIHNlbGYuX3NlcnZlci53b3JrZmxvd21nci51cGRhdGVXb3JrZmxvd0luc3RhbmNlKHdvcmtmbG93SW5zdCkKKwkjYm9vbGVhbgl1cGRhdGVXb3JrZmxvd0luc3RhbmNlU3RhdHVzKFN0cmluZyB3b3JrZmxvd0luc3RhbmNlSWQsIFN0cmluZyBzdGF0dXMpCisJZGVmIHVwZGF0ZVdvcmtmbG93SW5zdGFuY2VTdGF0dXMoc2VsZiwgd29ya2Zsb3dJbnN0SWQsIHN0YXR1cyk6CisJCXJldHVybiBzZWxmLl9zZXJ2ZXIud29ya2Zsb3dtZ3IudXBkYXRlV29ya2Zsb3dJbnN0YW5jZVN0YXR1cyh3b3JrZmxvd0luc3RJZCwgc3RhdHVzKSAKKworCisKK2RlZiBtYWluKCk6CisJIyBjcmVhdGUgaW5zdGFuY2UKKyAgICBvb2R0ID0gT09EVFdvcmtGbG93V3JhcHBlcigiaHR0cDovL2xvY2FsaG9zdDo5MjAwIikKKyAgICAjIGdldCBldmVudCBpbmZvCisgICAgZXZlbnRzID0gb29kdC5nZXRFdmVudE5hbWVzKCkKKyAgICAjIGNyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gaW52b2tlIGFuIGV2ZW50CisgICAgbWV0ID0gTWV0YURhdGEoKQorICAgIG1ldC5hZGRNZXRhRGF0YSgiaGVsbG8iLCAid29ybGQiKQorICAgICMgcHJpbnQgYXZhaWxhYmxlIGV2ZW50cworICAgIHByaW50ICdhdmFpbGFibGUgZXZlbnRzOicsIGV2ZW50cworCisgICAgIyBvb2R0LnN0YXJ0RXZlbnQoZXZlbnRzWzBdLCBtZXQudG9YbWxScGMoKSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL1JFTU9WRS5sb2cgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjdkMTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9SRU1PVkUubG9nCkBAIC0wLDAgKzEsMTggQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworWW91IGNhbiByZW1vdmUgdGhpcyBmaWxlLiBJdCB3YXMgb25seSBpbmNsdWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgbG9nIGRpcmVjdG9yeSBmb3IgdGhpcworZGlzdHJpYnV0aW9uIHdhcyBjcmVhdGVkIG9uIGFzc2VtYmx5LgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI4YjRhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvY21kLWxpbmUtYWN0aW9ucy54bWwKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBBdXRob3I6IGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKy0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKwk8YmVhbiBpZD0ic2VuZEV2ZW50IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLlNlbmRFdmVudENsaUFjdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGFuIGV2ZW50IiAvPgorCTwvYmVhbj4KKwk8YmVhbiBpZD0iZHluV29ya2Zsb3ciIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uRHluV29ya2Zsb3dDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkNyZWF0ZXMgYSB3b3JrZmxvdyB1c2luZyB0aGUgZ2l2ZW4gdGFza3MgYW5kIHRoZW4gZXhlY3V0ZXMgaXQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFdvcmtmbG93SW5zdHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0V29ya2Zsb3dJbnN0c0NsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTGlzdCBhbGwgd29ya2Zsb3cgaW5zdGFuY2VzIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRXb3JrZmxvd3MiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0V29ya2Zsb3dzQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJMaXN0IGFsbCB3b3JrZmxvdyBtb2RlbHMiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFRhc2tCeUlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFRhc2tCeUlkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHRhc2sgaW5mb3JtYXRpb24gZm9yIHRhc2sgd2l0aCBnaXZlbiBJRCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0Q29uZGl0aW9uQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRDb25kaXRpb25CeUlkQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGNvbmRpdGlvbiBpbmZvcm1hdGlvbiBmb3IgY29uZGl0aW9uIHdpdGggZ2l2ZW4gSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFdvcmtmbG93QnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRXb3JrZmxvd0J5SWRDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkdldHMgd29ya2Zsb3cgaW5mb3JtYXRpb24gZm9yIHdvcmtmbG93IHdpdGggZ2l2ZW4gSUQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFdvcmtmbG93c0J5RXZlbnQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0V29ya2Zsb3dzQnlFdmVudENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTGlzdCB3b3JrZmxvdyBpbmZvcm1hdGlvbiBmb3Igd29ya2Zsb3dzIHdpdGggYXR0YWNoZWQgdG8gZXZlbnQiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFJlZ2lzdGVyZWRFdmVudHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0UmVnaXN0ZXJlZEV2ZW50c0NsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTGlzdCByZWdpc3RlcmVkIGV2ZW50cyIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0V29ya2Zsb3dJbnN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFdvcmtmbG93SW5zdENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyB3b3JrZmxvdyBpbnN0YW5jZSBieSBpbnN0YW5jZSBJRCIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0iZ2V0V2FsbENsb2NrVGltZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRXYWxsQ2xvY2tUaW1lQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHdhbGwgY2xvY2sgdGltZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2UiIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9ImdldFRhc2tXYWxsQ2xvY2tUaW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5jbGkuYWN0aW9uLkdldFRhc2tXYWxsQ2xvY2tUaW1lQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHdhbGwgY2xvY2sgdGltZSBmb3Igd29ya2Zsb3cgaW5zdGFuY2UncyBjdXJyZW50IHRhc2siIC8+CisgIDwvYmVhbj4KKyAgPGJlYW4gaWQ9InN0b3BXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uU3RvcFdvcmtmbG93SW5zdENsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iU3RvcHMgYSB3b3JrZmxvdyBpbnN0YW5jZSIgLz4KKyAgPC9iZWFuPgorICA8YmVhbiBpZD0icGF1c2VXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uUGF1c2VXb3JrZmxvd0luc3RDbGlBY3Rpb24iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlBhdXNlcyBhIHdvcmtmbG93IGluc3RhbmNlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJyZXN1bWVXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uUmVzdW1lV29ya2Zsb3dJbnN0Q2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJSZXN1bWVzIGEgcGF1c2VkIHdvcmtmbG93IGluc3RhbmNlIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRGaXJzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0Rmlyc3RQYWdlQ2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIGZpcnN0IHBhZ2Ugb2Ygd29ya2Zsb3dzIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXROZXh0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXROZXh0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBuZXh0IHBhZ2Ugb2Ygd29ya2Zsb3dzIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRQcmV2UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRQcmV2UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBwcmV2IHBhZ2Ugb2Ygd29ya2Zsb3dzIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRMYXN0UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5HZXRMYXN0UGFnZUNsaUFjdGlvbiI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iR2V0cyBsYXN0IHBhZ2Ugb2Ygd29ya2Zsb3dzIiAvPgorICA8L2JlYW4+CisgIDxiZWFuIGlkPSJnZXRXb3JrZmxvd0luc3RNZXQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaS5hY3Rpb24uR2V0V29ya2Zsb3dJbnN0TWV0Q2xpQWN0aW9uIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJHZXRzIHdvcmtmbG93IGluc3RhbmNlIG1ldGFkYXRhIiAvPgorICA8L2JlYW4+CisKKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLW9wdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzE4MzgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbApAQCAtMCwwICsxLDY4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yIAorCWxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCAKKwlpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gCisJWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgCisJdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiAKKwl0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIAorCWJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgCisJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyAKKwlPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgCisJbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gQXV0aG9yOiAKKwliZm9zdGVyIChCcmlhbiBGb3N0ZXIpIC0tPgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnA9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvcCIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi4wLnhzZCI+CisKKwk8YmVhbiBpZD0idXJsIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0idXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJXb3JrZmxvdyBNYW5hZ2VyIFVSTCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0idXJsIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZWQiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbgorCQkJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5TZXRKYXZhUHJvcGVydGllc0hhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eU5hbWVzIj4KKwkJCQkJPGxpc3Q+CisJCQkJCQk8dmFsdWU+b3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51cmw8L3ZhbHVlPgorCQkJCQk8L2xpc3Q+CisJCQkJPC9wcm9wZXJ0eT4KKwkJCTwvYmVhbj4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0ib3BlcmF0aW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im9wIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9Im9wZXJhdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkJdmFsdWU9IkRlY2xhcmUgdGhhdCB5b3Ugd2lzaCB0byBwcmVzZW50IGFuIG9wZXJhdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVkIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN1Yk9wdGlvbnMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJzZW5kRXZlbnQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZHluV29ya2Zsb3ciIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0V29ya2Zsb3dJbnN0cyIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRXb3JrZmxvd3MiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0VGFza0J5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0Q29uZGl0aW9uQnlJZCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRXb3JrZmxvd0J5SWQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0iZ2V0V29ya2Zsb3dzQnlFdmVudCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRSZWdpc3RlcmVkRXZlbnRzIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImdldFdvcmtmbG93SW5zdCIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRXYWxsQ2xvY2tUaW1lIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImdldFRhc2tXYWxsQ2xvY2tUaW1lIiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9InN0b3BXb3JrZmxvd0luc3QiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0icGF1c2VXb3JrZmxvd0luc3QiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uR3JvdXBTdWJPcHRpb24iCisJCQkJCXA6b3B0aW9uLXJlZj0icmVzdW1lV29ya2Zsb3dJbnN0IiBwOnJlcXVpcmVkPSJmYWxzZSIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImdldEZpcnN0UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXROZXh0UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRQcmV2UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRMYXN0UGFnZSIgcDpyZXF1aXJlZD0iZmFsc2UiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5Hcm91cFN1Yk9wdGlvbiIKKwkJCQkJcDpvcHRpb24tcmVmPSJnZXRXb3JrZmxvd0luc3RNZXQiIHA6cmVxdWlyZWQ9ImZhbHNlIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gU2VuZEV2ZW50IE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9InNlbmRFdmVudCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0ic2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic2VuZEV2ZW50IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBzZW5kRXZlbnQgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+c2VuZEV2ZW50PC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InNlbmRFdmVudCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBEeW5Xb3JrZmxvdyBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJkeW5Xb3JrZmxvdyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZHciIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZHluV29ya2Zsb3ciIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGR5bldvcmtmbG93IEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmR5bldvcmtmbG93PC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImR5bldvcmtmbG93IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0idGFza0lkcyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ0aWRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InRhc2tJZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9Ikxpc3Qgb2Ygd29ya2Zsb3cgdGFzayBpZHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InRhc2staWRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZHluV29ya2Zsb3ciIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRXb3JrZmxvd0luc3RzIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldFdvcmtmbG93SW5zdHMiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9IndpbnN0cyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRXb3JrZmxvd0luc3RzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBHZXRXb3JrZmxvd0luc3RzIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldFdvcmtmbG93SW5zdHM8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iR2V0V29ya2Zsb3dJbnN0cyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRXb3JrZmxvd3MgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0V29ya2Zsb3dzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ3Zmxvd3MiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0V29ya2Zsb3dzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRXb3JrZmxvd3MgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0V29ya2Zsb3dzPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93cyIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRUYXNrQnlJZCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXRUYXNrQnlJZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0idGJ5aWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0VGFza0J5SWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFRhc2tCeUlkIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldFRhc2tCeUlkPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFRhc2tCeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldFRhc2tCeUlkIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldENvbmRpdGlvbkJ5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImNieWlkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldENvbmRpdGlvbkJ5SWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldENvbmRpdGlvbkJ5SWQgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0Q29uZGl0aW9uQnlJZDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRDb25kaXRpb25CeUlkIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldFdvcmtmbG93QnlJZCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXRXb3JrZmxvd0J5SWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9IndieWlkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFdvcmtmbG93QnlJZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0V29ya2Zsb3dCeUlkIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldFdvcmtmbG93QnlJZDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0J5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0V29ya2Zsb3dzQnlFdmVudCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXRXb3JrZmxvd3NCeUV2ZW50IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJ3YnllIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFdvcmtmbG93c0J5RXZlbnQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFdvcmtmbG93c0J5RXZlbnQgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0V29ya2Zsb3dzQnlFdmVudDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd3NCeUV2ZW50IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldFJlZ2lzdGVyZWRFdmVudHMgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0UmVnaXN0ZXJlZEV2ZW50cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0iZXZlbnRzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFJlZ2lzdGVyZWRFdmVudHMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFJlZ2lzdGVyZWRFdmVudHMgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0UmVnaXN0ZXJlZEV2ZW50czwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRSZWdpc3RlcmVkRXZlbnRzIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldFdvcmtmbG93SW5zdCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXRXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Imluc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0V29ya2Zsb3dJbnN0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRXb3JrZmxvd0luc3QgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0V29ya2Zsb3dJbnN0PC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRXYWxsQ2xvY2tUaW1lIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldFdhbGxDbG9ja1RpbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InRpbWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0V2FsbENsb2NrVGltZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0V2FsbENsb2NrVGltZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXRXYWxsQ2xvY2tUaW1lPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFdhbGxDbG9ja1RpbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0VGFza1dhbGxDbG9ja1RpbWUgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0VGFza1dhbGxDbG9ja1RpbWUiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InR0aW1lIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldFRhc2tXYWxsQ2xvY2tUaW1lIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXRUYXNrV2FsbENsb2NrVGltZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXRUYXNrV2FsbENsb2NrVGltZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRUYXNrV2FsbENsb2NrVGltZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBTdG9wV29ya2Zsb3dJbnN0IE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9InN0b3BXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InN0b3AiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ic3RvcFdvcmtmbG93SW5zdCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgc3RvcFdvcmtmbG93SW5zdCBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5zdG9wV29ya2Zsb3dJbnN0PC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InN0b3BXb3JrZmxvd0luc3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gUGF1c2VXb3JrZmxvd0luc3QgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0icGF1c2VXb3JrZmxvd0luc3QiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9InBhdXNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InBhdXNlV29ya2Zsb3dJbnN0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBwYXVzZVdvcmtmbG93SW5zdCBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5wYXVzZVdvcmtmbG93SW5zdDwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJwYXVzZVdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBSZXN1bWVXb3JrZmxvd0luc3QgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0icmVzdW1lV29ya2Zsb3dJbnN0IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJyZXN1bWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0icmVzdW1lV29ya2Zsb3dJbnN0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyByZXN1bWVXb3JrZmxvd0luc3QgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+cmVzdW1lV29ya2Zsb3dJbnN0PC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InJlc3VtZVdvcmtmbG93SW5zdCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRGaXJzdFBhZ2UgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0Rmlyc3RQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJwYWdlMSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRGaXJzdFBhZ2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldEZpcnN0UGFnZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXRGaXJzdFBhZ2U8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Rmlyc3RQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldE5leHRQYWdlIE9wdGlvbnMgLS0+CisJPGJlYW4gaWQ9ImdldE5leHRQYWdlIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFjdGlvbkNtZExpbmVPcHRpb24iCisJCXA6aXNTdWJPcHRpb249InRydWUiPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJuZXh0IiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImdldE5leHRQYWdlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJUcmlnZ2VycyBnZXROZXh0UGFnZSBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXROZXh0UGFnZTwvdmFsdWU+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQk8L2xpc3Q+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPCEtLSBHZXRQcmV2UGFnZSBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXRQcmV2UGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BY3Rpb25DbWRMaW5lT3B0aW9uIgorCQlwOmlzU3ViT3B0aW9uPSJ0cnVlIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icHJldiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRQcmV2UGFnZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iVHJpZ2dlcnMgZ2V0UHJldlBhZ2UgQWN0aW9uIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ic3RhdGljQXJncyI+CisJCQk8bGlzdD4KKwkJCQk8dmFsdWU+Z2V0UHJldlBhZ2U8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0UHJldlBhZ2UiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKworCTwhLS0gR2V0TGFzdFBhZ2UgT3B0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZ2V0TGFzdFBhZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Imxhc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0iZ2V0TGFzdFBhZ2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldExhc3RQYWdlIEFjdGlvbiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJmYWxzZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InN0YXRpY0FyZ3MiPgorCQkJPGxpc3Q+CisJCQkJPHZhbHVlPmdldExhc3RQYWdlPC92YWx1ZT4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldExhc3RQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIEdldFdvcmtmbG93SW5zdE1ldCBPcHRpb25zIC0tPgorCTxiZWFuIGlkPSJnZXRXb3JrZmxvd0luc3RNZXQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWN0aW9uQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImdldE1ldCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJnZXRXb3JrZmxvd0luc3RNZXQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IlRyaWdnZXJzIGdldFdvcmtmbG93SW5zdE1ldCBBY3Rpb24iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0iZmFsc2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzdGF0aWNBcmdzIj4KKwkJCTxsaXN0PgorCQkJCTx2YWx1ZT5nZXRXb3JrZmxvd0luc3RNZXQ8L3ZhbHVlPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0V29ya2Zsb3dJbnN0TWV0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8IS0tIE9wdGlvbnMgdXNlZCBmb3IgbXVsdGlwbGUgQWN0aW9ucyAtLT4KKwk8YmVhbiBpZD0iZXZlbnROYW1lIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImVuIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImV2ZW50TmFtZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iTmFtZSBvZiB0aGUgRXZlbnQgdG8gdHJpZ2dlciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iZXZlbnQtbmFtZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InJlcXVpcmVtZW50UnVsZXMiPgorCQkJPGxpc3Q+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9InNlbmRFdmVudCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93c0J5RXZlbnQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9Im1ldGFEYXRhIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9Im0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ibWV0YURhdGEiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXNjcmlwdGlvbiIgdmFsdWU9IkRlY2xhcmUgdGhhdCB5b3Ugd2lzaCB0byBwcmVzZW50IG1ldGFkYXRhIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9ImZhbHNlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVxdWlyZW1lbnRSdWxlcyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0ic2VuZEV2ZW50IiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZHluTWV0YWRhdGEiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0ic3ViT3B0aW9ucyI+CisJCQk8bGlzdD4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkdyb3VwU3ViT3B0aW9uIgorCQkJCQlwOm9wdGlvbi1yZWY9ImtleSIgcDpyZXF1aXJlZD0idHJ1ZSIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwk8L2JlYW4+CisKKwk8YmVhbiBpZD0ia2V5IiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiIKKwkJcDppc1N1Yk9wdGlvbj0idHJ1ZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImsiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJsb25nT3B0aW9uIiB2YWx1ZT0ia2V5IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJXb3JrZmxvdyBNZXRhZGF0YToga2V5IHZhbCB2YWwuLi4iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9ImtleS12YWxzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icmVwZWF0aW5nIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIj4KKwkJCQk8cHJvcGVydHkgbmFtZT0iYXBwbHlUb0FjdGlvbnMiPgorCQkJCQk8bGlzdD4KKwkJCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorCQkJCQkJCXA6YWN0aW9uTmFtZT0ic2VuZEV2ZW50IiBwOm1ldGhvZE5hbWU9ImFkZE1ldGFkYXRhIiAvPgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJkeW5Xb3JrZmxvdyIgcDptZXRob2ROYW1lPSJhZGRNZXRhZGF0YSIgLz4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9ImlkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLkFkdmFuY2VkQ21kTGluZU9wdGlvbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJzaG9ydE9wdGlvbiIgdmFsdWU9ImlkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9ImlkIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJJRCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9Imhhc0FyZ3MiIHZhbHVlPSJ0cnVlIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYXJnc0Rlc2NyaXB0aW9uIiB2YWx1ZT0iaWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRUYXNrQnlJZCIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldENvbmRpdGlvbkJ5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0J5SWQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0luc3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRXYWxsQ2xvY2tUaW1lIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0VGFza1dhbGxDbG9ja1RpbWUiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJzdG9wV29ya2Zsb3dJbnN0IiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0icGF1c2VXb3JrZmxvd0luc3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJyZXN1bWVXb3JrZmxvd0luc3QiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0luc3RNZXQiIHA6cmVsYXRpb249IlJFUVVJUkVEIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiPgorCQkJCTxwcm9wZXJ0eSBuYW1lPSJhcHBseVRvQWN0aW9ucyI+CisJCQkJCTxsaXN0PgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJnZXRUYXNrQnlJZCIgcDptZXRob2ROYW1lPSJzZXRUYXNrSWQiCisJCQkJCQkJcDphcmdEZXNjcmlwdGlvbj0idGFzay1pZCIgLz4KKwkJCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorCQkJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0Q29uZGl0aW9uQnlJZCIgcDptZXRob2ROYW1lPSJzZXRDb25kaXRpb25JZCIKKwkJCQkJCQlwOmFyZ0Rlc2NyaXB0aW9uPSJjb25kaXRpb24taWQiIC8+CisJCQkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKwkJCQkJCQlwOmFjdGlvbk5hbWU9ImdldFdvcmtmbG93QnlJZCIgcDptZXRob2ROYW1lPSJzZXRXb3JrZmxvd0lkIgorCQkJCQkJCXA6YXJnRGVzY3JpcHRpb249IndvcmtmbG93LWlkIiAvPgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0luc3QiIHA6bWV0aG9kTmFtZT0ic2V0SW5zdGFuY2VJZCIKKwkJCQkJCQlwOmFyZ0Rlc2NyaXB0aW9uPSJpbnN0YW5jZS1pZCIgLz4KKwkJCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uaGFuZGxlci5BcHBseVRvQWN0aW9uIgorCQkJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0V2FsbENsb2NrVGltZSIgcDptZXRob2ROYW1lPSJzZXRJbnN0YW5jZUlkIgorCQkJCQkJCXA6YXJnRGVzY3JpcHRpb249Imluc3RhbmNlLWlkIiAvPgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJnZXRUYXNrV2FsbENsb2NrVGltZSIgcDptZXRob2ROYW1lPSJzZXRJbnN0YW5jZUlkIgorCQkJCQkJCXA6YXJnRGVzY3JpcHRpb249Imluc3RhbmNlLWlkIiAvPgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJzdG9wV29ya2Zsb3dJbnN0IiBwOm1ldGhvZE5hbWU9InNldEluc3RhbmNlSWQiCisJCQkJCQkJcDphcmdEZXNjcmlwdGlvbj0iaW5zdGFuY2UtaWQiIC8+CisJCQkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKwkJCQkJCQlwOmFjdGlvbk5hbWU9InBhdXNlV29ya2Zsb3dJbnN0IiBwOm1ldGhvZE5hbWU9InNldEluc3RhbmNlSWQiCisJCQkJCQkJcDphcmdEZXNjcmlwdGlvbj0iaW5zdGFuY2UtaWQiIC8+CisJCQkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbiIKKwkJCQkJCQlwOmFjdGlvbk5hbWU9InJlc3VtZVdvcmtmbG93SW5zdCIgcDptZXRob2ROYW1lPSJzZXRJbnN0YW5jZUlkIgorCQkJCQkJCXA6YXJnRGVzY3JpcHRpb249Imluc3RhbmNlLWlkIiAvPgorCQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb24iCisJCQkJCQkJcDphY3Rpb25OYW1lPSJnZXRXb3JrZmxvd0luc3RNZXQiIHA6bWV0aG9kTmFtZT0ic2V0SW5zdGFuY2VJZCIKKwkJCQkJCQlwOmFyZ0Rlc2NyaXB0aW9uPSJpbnN0YW5jZS1pZCIgLz4KKwkJCQkJPC9saXN0PgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2JlYW4+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InN0YXR1cyIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5BZHZhbmNlZENtZExpbmVPcHRpb24iPgorCQk8cHJvcGVydHkgbmFtZT0ic2hvcnRPcHRpb24iIHZhbHVlPSJzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0ibG9uZ09wdGlvbiIgdmFsdWU9InN0YXR1cyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iV29ya2Zsb3cgc3RhdHVzIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iaGFzQXJncyIgdmFsdWU9InRydWUiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzRGVzY3JpcHRpb24iIHZhbHVlPSJzdGF0dXMiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXRGaXJzdFBhZ2UiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iT1BUSU9OQUwiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFByZXZQYWdlIiBwOnJlbGF0aW9uPSJPUFRJT05BTCIgLz4KKwkJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnJlcXVpcmUuQWN0aW9uRGVwZW5kZW5jeVJ1bGUiCisJCQkJCXA6YWN0aW9uTmFtZT0iZ2V0TGFzdFBhZ2UiIHA6cmVsYXRpb249Ik9QVElPTkFMIiAvPgorCQkJPC9saXN0PgorCQk8L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iaGFuZGxlciI+CisJCQk8YmVhbiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLmhhbmRsZXIuQXBwbHlUb0FjdGlvbkhhbmRsZXIiIC8+CisJCTwvcHJvcGVydHk+CisJPC9iZWFuPgorCisJPGJlYW4gaWQ9InBhZ2VOdW0iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24uQWR2YW5jZWRDbWRMaW5lT3B0aW9uIj4KKwkJPHByb3BlcnR5IG5hbWU9InNob3J0T3B0aW9uIiB2YWx1ZT0icCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImxvbmdPcHRpb24iIHZhbHVlPSJwYWdlTnVtIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iIHZhbHVlPSJQYWdlIE51bWJlciIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJpbnQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJoYXNBcmdzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImFyZ3NEZXNjcmlwdGlvbiIgdmFsdWU9InBhZ2UiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJyZXF1aXJlbWVudFJ1bGVzIj4KKwkJCTxsaXN0PgorCQkJCTxiZWFuIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5vcHRpb24ucmVxdWlyZS5BY3Rpb25EZXBlbmRlbmN5UnVsZSIKKwkJCQkJcDphY3Rpb25OYW1lPSJnZXROZXh0UGFnZSIgcDpyZWxhdGlvbj0iUkVRVUlSRUQiIC8+CisJCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5yZXF1aXJlLkFjdGlvbkRlcGVuZGVuY3lSdWxlIgorCQkJCQlwOmFjdGlvbk5hbWU9ImdldFByZXZQYWdlIiBwOnJlbGF0aW9uPSJSRVFVSVJFRCIgLz4KKwkJCTwvbGlzdD4KKwkJPC9wcm9wZXJ0eT4KKwkJPHByb3BlcnR5IG5hbWU9ImhhbmRsZXIiPgorCQkJPGJlYW4gY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5oYW5kbGVyLkFwcGx5VG9BY3Rpb25IYW5kbGVyIiAvPgorCQk8L3Byb3BlcnR5PgorCTwvYmVhbj4KKzwvYmVhbnM+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9iYWNrd2FyZHNUZXN0V29ya2Zsb3cud29ya2Zsb3cueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvYmFja3dhcmRzVGVzdFdvcmtmbG93LndvcmtmbG93LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA1ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvYmFja3dhcmRzVGVzdFdvcmtmbG93LndvcmtmbG93LnhtbApAQCAtMCwwICsxLDIyIEBACis8IS0tDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPGNhczp3b3JrZmxvdyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBuYW1lPSJiYWNrd2FyZHNUZXN0V29ya2Zsb3ciIGlkPSJ1cm46b29kdDpiYWNrd2FyZHNUZXN0V29ya2Zsb3ciPg0KKyA8dGFza3M+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0Okdvb2RieWVXb3JsZCIvPg0KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpIZWxsb1dvcmxkIi8+DQorIDwvdGFza3M+DQorPC9jYXM6d29ya2Zsb3c+DQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29uZGl0aW9uLndvcmtmbG93LnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvbmRpdGlvbi53b3JrZmxvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzMzOTMzMgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvbmRpdGlvbi53b3JrZmxvdy54bWwKQEAgLTAsMCArMSwyNSBAQAorPCEtLQ0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzxjYXM6d29ya2Zsb3cgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIgbmFtZT0iQ29uZGl0aW9ucyBXb3JrZmxvdyIgaWQ9InVybjpvb2R0OmNvbmRpdGlvbnNXb3JrZmxvdyI+DQorIDxjb25kaXRpb25zPg0KKyAgIDxjb25kaXRpb24gaWQ9InVybjpvb2R0OlRpbWVvdXRDb25kaXRpb24iLz4NCisgPC9jb25kaXRpb25zPg0KKyA8dGFza3M+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0OkludGVuc2l2ZVRhc2siLz4NCisgICA8dGFzayBpZD0idXJuOm9vZHQ6SW50ZW5zaXZlVGFzayIvPg0KKyA8L3Rhc2tzPg0KKzwvY2FzOndvcmtmbG93Pg0KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvbmRpdGlvbnMueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvY29uZGl0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4Mzg2MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2NvbmRpdGlvbnMueG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6Y29uZGl0aW9ucyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKyAgICA8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpUcnVlQ29uZGl0aW9uIiBuYW1lPSJUcnVlIENvbmRpdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuVHJ1ZUNvbmRpdGlvbiIvPgorICAgIDxjb25kaXRpb24gaWQ9InVybjpvb2R0OkZhbHNlQ29uZGl0aW9uIiBuYW1lPSJGYWxzZSBDb25kaXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkZhbHNlQ29uZGl0aW9uIi8+CisgICAgPGNvbmRpdGlvbiBpZD0idXJuOm9vZHQ6TG9uZ0NvbmRpdGlvbiIgbmFtZT0iTG9uZyBDb25kaXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkxvbmdDb25kaXRpb24iLz4KKyAgICA8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpDaGVja0Zvck1ldGFkYXRhS2V5cyIgbmFtZT0iTWV0YWRhdGEgS2V5IENoZWNrIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5DaGVja0Zvck1ldGFkYXRhS2V5cyI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcU1ldEtleXMiIHZhbHVlPSJNZXQxLE1ldDIsTWV0MyIvPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBpZD0idXJuOm9vZHQ6VGltZW91dENvbmRpdGlvbiIgbmFtZT0iVGltZW91dCBDb25kaXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkZhbHNlQ29uZGl0aW9uIiB0aW1lb3V0PSIzMCIvPgorICAgIDxjb25kaXRpb24gaWQ9InVybjpvb2R0Ok9wdGlvbmFsQ29uZGl0aW9uIiBuYW1lPSJPcHRpb25hbCBDb25kaXRpb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkZhbHNlQ29uZGl0aW9uIiBvcHRpb25hbD0idHJ1ZSIvPgorPC9jYXM6Y29uZGl0aW9ucz4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2V2ZW50cy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9ldmVudHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDI2YWUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9ldmVudHMueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6d29ya2Zsb3dldmVudHMgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyI+CisJPGV2ZW50IG5hbWU9InRlc3QiPgorCQk8d29ya2Zsb3cgaWQ9InVybjpvb2R0OnRlc3RXb3JrZmxvdyIgLz4KKwk8L2V2ZW50PgorCTxldmVudCBuYW1lPSJleHRlcm5hbFNjcmlwdCI+CisgICAgICAgIDx3b3JrZmxvdyBpZD0idXJuOm9vZHQ6ZXh0ZXJuYWxTY3JpcHRXb3JrZmxvdyIgLz4KKyAgICA8L2V2ZW50PgorCTxldmVudCBuYW1lPSJiYWNrd2FyZHMiPgorCQk8d29ya2Zsb3cgaWQ9InVybjpvb2R0OmJhY2t3YXJkc1Rlc3RXb3JrZmxvdyIgLz4KKwk8L2V2ZW50PgorCTxldmVudCBuYW1lPSJzdHVjayI+CisJCTx3b3JrZmxvdyBpZD0idXJuOm9vZHQ6d29udEZpbmlzaFdvcmtmbG93IiAvPgorCTwvZXZlbnQ+CisJPGV2ZW50IG5hbWU9ImxvbmciPgorCQk8d29ya2Zsb3cgaWQ9InVybjpvb2R0OmxvbmdXb3JrZmxvdyIgLz4KKwkJPHdvcmtmbG93IGlkPSJ1cm46b29kdDpsb25nV29ya2Zsb3ciIC8+CisJPC9ldmVudD4KKwk8ZXZlbnQgbmFtZT0ibWV0VXBkYXRlIj4KKwkJPHdvcmtmbG93IGlkPSJ1cm46b29kdDp0ZXN0TWV0YWRhdGFVcGRhdGVXb3JrZmxvdyIgLz4KKwk8L2V2ZW50PgorCTxldmVudCBuYW1lPSJzdGF0dXNVcGRhdGUiPgorCQk8d29ya2Zsb3cgaWQ9InVybjpvb2R0OnRlc3RTdGF0dXNVcGRhdGVXb3JrZmxvdyIgLz4KKwk8L2V2ZW50PgorCTxldmVudCBuYW1lPSJtZXRFcnJvciI+CisJCTx3b3JrZmxvdyBpZD0idXJuOm9vZHQ6dGVzdE1ldEVycm9yV29ya2Zsb3ciIC8+CisJPC9ldmVudD4KKwk8ZXZlbnQgbmFtZT0idGltZW91dCI+CisJICAgIDx3b3JrZmxvdyBpZD0idXJuOm9vZHQ6dGltZW91dFdvcmtmbG93Ii8+CisJPC9ldmVudD4KKwk8ZXZlbnQgbmFtZT0ib3B0aW9uYWwiPgorCSAgICA8d29ya2Zsb3cgaWQ9InVybjpvb2R0Om9wdGlvbmFsV29ya2Zsb3ciLz4KKwk8L2V2ZW50PgorCTxldmVudCBuYW1lPSJjb25kaXRpb25zIj4KKwkgICAgPHdvcmtmbG93IGlkPSJ1cm46b29kdDpjb25kaXRpb25zV29ya2Zsb3ciLz4KKwk8L2V2ZW50PgorICAgIDxldmVudCBuYW1lPSJHZW5lcmljRmlsZUluZ2VzdCI+CisgICAgICAgPHdvcmtmbG93IGlkPSJ1cm46b29kdDptYWlsV29ya2Zsb3ciLz4KKyAgICA8L2V2ZW50PgorPC9jYXM6d29ya2Zsb3dldmVudHM+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9leHRlcm5hbFNjcmlwdC53b3JrZmxvdy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9leHRlcm5hbFNjcmlwdC53b3JrZmxvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMDk4NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL2V4dGVybmFsU2NyaXB0LndvcmtmbG93LnhtbApAQCAtMCwwICsxLDIxIEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOndvcmtmbG93IHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiIG5hbWU9IkV4dGVybmFsIFNjcmlwdCBXb3JrZmxvdyIgaWQ9InVybjpvb2R0OmV4dGVybmFsU2NyaXB0V29ya2Zsb3ciPgorIDx0YXNrcz4KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpFeHRlcm5hbFNjcmlwdFRhc2siLz4KKyA8L3Rhc2tzPgorPC9jYXM6d29ya2Zsb3c+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9sb25nV29ya2Zsb3cud29ya2Zsb3cueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbG9uZ1dvcmtmbG93LndvcmtmbG93LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA2NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvbG9uZ1dvcmtmbG93LndvcmtmbG93LnhtbApAQCAtMCwwICsxLDI0IEBACis8IS0tDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPGNhczp3b3JrZmxvdyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBuYW1lPSJMb25nIFdvcmtmbG93IiBpZD0idXJuOm9vZHQ6bG9uZ1dvcmtmbG93Ij4NCisgPHRhc2tzPg0KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpIZWxsb1dvcmxkIi8+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0Okdvb2RieWVXb3JsZCIvPg0KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpJbnRlbnNpdmVUYXNrIi8+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0OkludGVuc2l2ZVRhc2tXaXRoV2FpdCIvPg0KKyA8L3Rhc2tzPg0KKzwvY2FzOndvcmtmbG93Pg0KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL21haWxXb3JrZmxvdy53b3JrZmxvdy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9tYWlsV29ya2Zsb3cud29ya2Zsb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGI4NTYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9tYWlsV29ya2Zsb3cud29ya2Zsb3cueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8Y2FzOndvcmtmbG93IHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiIG5hbWU9Im1haWxXb3JrZmxvdyIgaWQ9InVybjpvb2R0Om1haWxXb3JrZmxvdyI+DQorIDx0YXNrcz4NCisgICA8dGFzayBpZD0idXJuOm9vZHQ6bWFpbFRhc2siLz4NCisgPC90YXNrcz4NCis8L2Nhczp3b3JrZmxvdz4NCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9vcHRpb25hbC53b3JrZmxvdy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy9vcHRpb25hbC53b3JrZmxvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2FjZjRjYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL29wdGlvbmFsLndvcmtmbG93LnhtbApAQCAtMCwwICsxLDIxIEBACis8IS0tDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPGNhczp3b3JrZmxvdyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIiBuYW1lPSJPcHRpb25hbCBXb3JrZmxvdyIgaWQ9InVybjpvb2R0Om9wdGlvbmFsV29ya2Zsb3ciPg0KKyA8dGFza3M+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0Ok9wdGlvbmFsVGFzayIvPg0KKyA8L3Rhc2tzPg0KKzwvY2FzOndvcmtmbG93Pg0KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rhc2tzLnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rhc2tzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU2OWNjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdGFza3MueG1sCkBAIC0wLDAgKzEsMTYzIEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOnRhc2tzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorCTx0YXNrIGlkPSJ1cm46b29kdDpIZWxsb1dvcmxkIiBuYW1lPSJIZWxsbyBXb3JsZCIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuSGVsbG9Xb3JsZCI+CisJCTxjb25kaXRpb25zPgorCQkJPGNvbmRpdGlvbiBpZD0idXJuOm9vZHQ6VHJ1ZUNvbmRpdGlvbiIgLz4KKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQZXJzb24iIHZhbHVlPSJDaHJpcyIgLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6R29vZGJ5ZVdvcmxkIiBuYW1lPSJHb29kYnllIFdvcmxkIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Hb29kYnllV29ybGQiPgorCQk8Y29uZGl0aW9ucz4KKwkJCTxjb25kaXRpb24gaWQ9InVybjpvb2R0OlRydWVDb25kaXRpb24iIC8+CisJCTwvY29uZGl0aW9ucz4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUGVyc29uIiB2YWx1ZT0iQ2hyaXMiIC8+CisJCTwvY29uZmlndXJhdGlvbj4KKwk8L3Rhc2s+CisJPHRhc2sgaWQ9InVybjpvb2R0OllvdXJlU3R1Y2siIG5hbWU9IllvdSdyZSBTdHVjayIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuR29vZGJ5ZVdvcmxkIj4KKwkJPGNvbmRpdGlvbnM+CisJCQk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpGYWxzZUNvbmRpdGlvbiIgLz4KKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQZXJzb24iIHZhbHVlPSJDaHJpcyIgLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6SW50ZW5zaXZlVGFzayIgbmFtZT0iUHJvY2Vzc29yIEludGVuc2l2ZSBUYXNrIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Mb25nVGFzayI+CisJCTxjb25kaXRpb25zIC8+CisJCTxjb25maWd1cmF0aW9uIC8+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpJbnRlbnNpdmVUYXNrV2l0aFdhaXQiIG5hbWU9IkludGVuc2l2ZSBXYWl0ZXIiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkxvbmdUYXNrIj4KKwkJPGNvbmRpdGlvbnM+CisJCQk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpMb25nQ29uZGl0aW9uIiAvPgorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uIC8+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpQcm9wUmVwbGFjZVRhc2siIG5hbWU9IlBSVGFzayIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuTG9uZ1Rhc2siPgorCQk8Y29uZGl0aW9ucyAvPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQYXRoVG9SZXBsYWNlIiB2YWx1ZT0iW0hPTUVdL215L3BhdGgiCisJCQkJZW52UmVwbGFjZT0idHJ1ZSIgLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJEb250UmVwbGFjZU1lIiB2YWx1ZT0iW0hPTUVdL215L3BhdGgiCisJCQkJZW52UmVwbGFjZT0iZmFsc2UiIC8+CisJCQk8cHJvcGVydHkgbmFtZT0iRG9udFJlcGxhY2VNZU5vU3BlYyIgdmFsdWU9IltIT01FXS9teS9wYXRoIiAvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpOdW1JbmNyZW1lbnRUYXNrIiBuYW1lPSJOdW0gSW5jcmVtZW50IFRhc2siCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLk51bUluY3JlbWVudFRhc2siPgorCQk8Y29uZGl0aW9ucyAvPgorCQk8Y29uZmlndXJhdGlvbiAvPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6UmFuZG9tU3RhdHVzVXBkYXRlVGFzayIKKwkJbmFtZT0iUmFuZG9tIFN0YXR1cyBVcGRhdGUiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLlJhbmRvbVN0YXR1c1VwZGF0ZVRhc2siPgorCQk8Y29uZGl0aW9ucyAvPgorCQk8Y29uZmlndXJhdGlvbiAvPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6VGVzdE11bHRpQ29uZGl0aW9uVGFzayIKKwkJbmFtZT0iVGVzdCBNdWx0aSBDb25kaXRpb24iCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkhlbGxvV29ybGQiPgorCQk8Y29uZGl0aW9ucz4KKwkJCTxjb25kaXRpb24gaWQ9InVybjpvb2R0OlRydWVDb25kaXRpb24iIC8+CisJCQk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpGYWxzZUNvbmRpdGlvbiIgLz4KKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQZXJzb24iIHZhbHVlPSJDaHJpcyIgLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6VGVzdFJlcU1ldEZpZWxkc1Rhc2siIG5hbWU9IlRlc3QgTWV0IEZpZWxkcyIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuTG9uZ1Rhc2siPgorCQk8Y29uZGl0aW9ucyAvPgorCQk8Y29uZmlndXJhdGlvbiAvPgorCQk8cmVxdWlyZWRNZXRGaWVsZHM+CisJCQk8bWV0ZmllbGQgbmFtZT0ibnVtU2Vjb25kcyIgLz4KKwkJPC9yZXF1aXJlZE1ldEZpZWxkcz4KKwk8L3Rhc2s+CisJCTx0YXNrIGlkPSJ1cm46b29kdDpFeHRlcm5hbFNjcmlwdFRhc2siIG5hbWU9IkV4dGVybmFsIFNjcmlwdCBUYXNrIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5FeHRlcm5TY3JpcHRUYXNrSW5zdGFuY2UiPgorCQk8Y29uZGl0aW9ucyAvPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJICAgIDxwcm9wZXJ0eSBuYW1lPSJTaGVsbFR5cGUiIHZhbHVlPSIvYmluL3NoIi8+IDwhLS0gb3IgL2Jpbi90Y3NoIGlmIHlvdSBoYXZlIHRjc2ggc2hlbGwgZW52aW9ubWVudDsgb3IgL3Vzci9iaW4vIGlmIHlvdSBoYXZlIGEgY29tcGlsZWQgcHJvZ3JhbSAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQYXRoVG9TY3JpcHQiIHZhbHVlPSIvdXNyL2xvY2FsL3NhbXBsZVNjcmlwdC5zaCIvPiA8IS0tIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGZpbGUgbmFtZSBhcyB3ZWxsLS0+CisJCTwvY29uZmlndXJhdGlvbj4KKwk8L3Rhc2s+CisJPHRhc2sgaWQ9InVybjpvb2R0Om1haWxUYXNrIiBuYW1lPSJJbmdlc3QgZS1NYWlsIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5NYWlsVGFzayI+CisJCTxjb25kaXRpb25zLz4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0idXNlci5uYW1lIiB2YWx1ZT0iQ29zdGluIi8+CisJCQk8cHJvcGVydHkgbmFtZT0ibXNnLnN1YmplY3QiIHZhbHVlPSJJbmdlc3QgTm90aWZpY2F0aW9uIi8+CisJCQk8cHJvcGVydHkgbmFtZT0ibWFpbC50byIgdmFsdWU9ImNocmlzLm1hdHRtYW5uQGpwbC5uYXNhLmdvdiIvPgorCQkJPHByb3BlcnR5IG5hbWU9Im1haWwuZnJvbSIgdmFsdWU9Im9vZHRAanBsLm5hc2EuZ292Ii8+CisJCTwvY29uZmlndXJhdGlvbj4KKwk8L3Rhc2s+CQorCTx0YXNrIGlkPSJ1cm46b29kdDpUZXN0VGltZW91dFRhc2siIG5hbWU9IlRlc3QgVGltZW91dCIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuTG9uZ1Rhc2siPgorCQk8Y29uZGl0aW9ucz4KKwkJICAgPGNvbmRpdGlvbiBpZD0idXJuOm9vZHQ6VGltZW91dENvbmRpdGlvbiIvPgorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uIC8+CisJCTxyZXF1aXJlZE1ldEZpZWxkcz4KKwkJCTxtZXRmaWVsZCBuYW1lPSJudW1TZWNvbmRzIiAvPgorCQk8L3JlcXVpcmVkTWV0RmllbGRzPgorCTwvdGFzaz4JCisJPHRhc2sgaWQ9InVybjpvb2R0Ok9wdGlvbmFsVGFzayIgbmFtZT0iT3B0aW9uYWwgVGFzayIgCisJICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkxvbmdUYXNrIj4KKwkgIDxjb25kaXRpb25zPgorCSAgICAgPGNvbmRpdGlvbiBpZD0idXJuOm9vZHQ6T3B0aW9uYWxDb25kaXRpb24iLz4KKwkgIDwvY29uZGl0aW9ucz4KKwkgIDxjb25maWd1cmF0aW9uLz4KKwkgIDxyZXF1aXJlZE1ldEZpZWxkcz4KKwkgICAgIDxtZXRmaWVsZCBuYW1lPSJudW1TZWNvbmRzIi8+CisJICA8L3JlcXVpcmVkTWV0RmllbGRzPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6VGFza1dpdGhMb2FkIiBuYW1lPSJUYXNrIHdpdGggTG9hZCIKKwkgICBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Mb25nVGFzayI+CisJICAgPGNvbmRpdGlvbnM+CisJICAgPC9jb25kaXRpb25zPiAKKwkgICA8Y29uZmlndXJhdGlvbj4KKwkgICAgICA8IS0tICBub3cgc2V0dGFibGUgc2luY2UgT09EVC02MDIKKwkgICAgICAgICAgICBjb250cm9scyB0aGUgbG9hZCB2YWx1ZSBvZiB0aGlzIHRhc2sgd2hlbiBydW5uaW5nCisJICAgICAgICAgICAgV29ya2Zsb3cgTWFuYWdlciB3aXRoIGNvbm5lY3Rpb24gdG8gdGhlIFJlc291cmNlIE1hbmFnZXIuCisJICAgICAgIC0tPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJUYXNrTG9hZCIgdmFsdWU9IjIiLz4KKwkgICA8L2NvbmZpZ3VyYXRpb24+ICAKKwk8L3Rhc2s+CisgICAgPHRhc2sgaWQ9InVybjpvb2R0OkZpbHRlclRhc2siIG5hbWU9IkZpbHRlciBUYXNrIgorICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkZpbHRlclRhc2siPgorICAgICAgIDxjb25kaXRpb25zPgorICAgICAgIDwvY29uZGl0aW9ucz4gCisgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLSAgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5cyB0byByZW1vdmUgZnJvbSB0aGUgbWV0YWRhdGEuIC0tPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJSZW1vdmVfS2V5IiB2YWx1ZT0iUHJvZHVjdGlvbkRhdGVUaW1lIi8+CisgICAgICAgICAgPCEtLSB5b3UgY2FuIGxpc3QgbWFueSBvZiB0aGVzZSBSZW5hbWVfW0tleV0gcGFyYW1ldGVycywgdG8KKyAgICAgICAgICAgICAgIHJlbW92ZSBzcGVjaWZpYyBrZXlzIGZyb20gdGhlIG1ldGFkYXRhLiBOb3RlIHRoYXQgcmVuYW1lcworICAgICAgICAgICAgICAgYXJlIHByb2Nlc3NlZCAqZmlyc3QqIGJlZm9yZSByZW1vdmVzLCBzbyB5b3UgY2FuIGNvbmNlaXZhYmx5CisgICAgICAgICAgICAgICByZW5hbWUgYSBmaWVsZCwgYW5kIHRoZW4gKnJlbW92ZSogaXQgdG9vLCBzbyBiZSBjYXJlZnVsLgorICAgICAgICAgICAtLT4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUmVuYW1lX0ZpbGVuYW1lIiB2YWx1ZT0iUHJpb3JfRmlsZW5hbWUiLz4KKyAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAKKyAgICA8L3Rhc2s+Cis8L2Nhczp0YXNrcz4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rlc3RNZXRFcnJvci53b3JrZmxvdy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0TWV0RXJyb3Iud29ya2Zsb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNmViODkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0TWV0RXJyb3Iud29ya2Zsb3cueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6d29ya2Zsb3cgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIKKwluYW1lPSJ0ZXN0TWV0RXJyb3JXb3JrZmxvdyIKKwlpZD0idXJuOm9vZHQ6dGVzdE1ldEVycm9yV29ya2Zsb3ciPgorCTx0YXNrcz4KKwkJPHRhc2sgaWQ9InVybjpvb2R0OlRlc3RSZXFNZXRGaWVsZHNUYXNrIiAvPgorCTwvdGFza3M+Cis8L2Nhczp3b3JrZmxvdz4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rlc3RNZXRhZGF0YVVwZGF0ZS53b3JrZmxvdy54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0TWV0YWRhdGFVcGRhdGUud29ya2Zsb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODkzYjAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0TWV0YWRhdGFVcGRhdGUud29ya2Zsb3cueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjYXM6d29ya2Zsb3cgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIgbmFtZT0idGVzdE1ldGFkYXRhVXBkYXRlV29ya2Zsb3ciIGlkPSJ1cm46b29kdDp0ZXN0TWV0YWRhdGFVcGRhdGVXb3JrZmxvdyI+CisgPHRhc2tzPgorICAgPHRhc2sgaWQ9InVybjpvb2R0Ok51bUluY3JlbWVudFRhc2siLz4KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpOdW1JbmNyZW1lbnRUYXNrIi8+CisgICA8dGFzayBpZD0idXJuOm9vZHQ6TnVtSW5jcmVtZW50VGFzayIvPgorICAgPHRhc2sgaWQ9InVybjpvb2R0Ok51bUluY3JlbWVudFRhc2siLz4KKyA8L3Rhc2tzPgorPC9jYXM6d29ya2Zsb3c+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0U3RhdHVzVXBkYXRlLndvcmtmbG93LnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rlc3RTdGF0dXNVcGRhdGUud29ya2Zsb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTk0YTcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy90ZXN0U3RhdHVzVXBkYXRlLndvcmtmbG93LnhtbApAQCAtMCwwICsxLDIyIEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOndvcmtmbG93IHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiIG5hbWU9InRlc3RTdGF0dXNVcGRhdGVXb3JrZmxvdyIgaWQ9InVybjpvb2R0OnRlc3RTdGF0dXNVcGRhdGVXb3JrZmxvdyI+CisgPHRhc2tzPgorICAgPHRhc2sgaWQ9InVybjpvb2R0OlJhbmRvbVN0YXR1c1VwZGF0ZVRhc2siLz4KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpSYW5kb21TdGF0dXNVcGRhdGVUYXNrIi8+CisgPC90YXNrcz4KKzwvY2FzOndvcmtmbG93PgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdGVzdFdvcmtmbG93LndvcmtmbG93LnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rlc3RXb3JrZmxvdy53b3JrZmxvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4N2EwNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3Rlc3RXb3JrZmxvdy53b3JrZmxvdy54bWwKQEAgLTAsMCArMSwyMiBAQAorPCEtLQ0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzxjYXM6d29ya2Zsb3cgeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMS4wL2NhcyIgbmFtZT0idGVzdFdvcmtmbG93IiBpZD0idXJuOm9vZHQ6dGVzdFdvcmtmbG93Ij4NCisgPHRhc2tzPg0KKyAgIDx0YXNrIGlkPSJ1cm46b29kdDpIZWxsb1dvcmxkIi8+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0Okdvb2RieWVXb3JsZCIvPg0KKyA8L3Rhc2tzPg0KKzwvY2FzOndvcmtmbG93Pg0KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3RpbWVvdXQud29ya2Zsb3cueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvdGltZW91dC53b3JrZmxvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmViOGNiNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3RpbWVvdXQud29ya2Zsb3cueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8Y2FzOndvcmtmbG93IHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiIG5hbWU9IlRpbWVvdXQgV29ya2Zsb3ciIGlkPSJ1cm46b29kdDp0aW1lb3V0V29ya2Zsb3ciPg0KKyA8dGFza3M+DQorICAgPHRhc2sgaWQ9InVybjpvb2R0OlRlc3RUaW1lb3V0VGFzayIvPg0KKyA8L3Rhc2tzPg0KKzwvY2FzOndvcmtmbG93Pg0KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dlbmdpbmUvR3JhbnVsZU1hcHMueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvd2VuZ2luZS9HcmFudWxlTWFwcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1YzdiZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dlbmdpbmUvR3JhbnVsZU1hcHMueG1sCkBAIC0wLDAgKzEsMjYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNhczp3b3JrZmxvd3MgCisJeG1sbnM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8yLjAvY2FzIgorCXhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzIuMC9jYXMiCisJeG1sbnM6cD0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzIuMC9jYXMvcHJvcGVydHkiPgorCQorCTxzZXF1ZW50aWFsIGlkPSJ1cm46bnBwOkdyYW51bGVNYXBzIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQkKKwkJCTwhLS0gUENTIHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9RdWVyeS9GaWxlTWFuYWdlclVybCIgdmFsdWU9IltGSUxFTUdSX1VSTF0iIGVudlJlcGxhY2U9InRydWUiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9GaWxlTWFuYWdlclVybCIgdmFsdWU9IltGSUxFTUdSX1VSTF0iIGVudlJlcGxhY2U9InRydWUiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9DbGllbnRUcmFuc2ZlclNlcnZpY2VGYWN0b3J5IiB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLmRhdGF0cmFuc2Zlci5Mb2NhbERhdGFUcmFuc2ZlckZhY3RvcnkiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9NZXRGaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iY2FzIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Jbmdlc3QvQ3Jhd2xlckNyYXdsRm9yRGlycyIgdmFsdWU9ImZhbHNlIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Jbmdlc3QvQ3Jhd2xlclJlY3VyIiB2YWx1ZT0iZmFsc2UiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0luZ2VzdC9BY3Rpb25zSWRzIiB2YWx1ZT0iUm1EYXRhRmlsZSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svSW5nZXN0L0FjdGlvblJlcG9GaWxlIiB2YWx1ZT0iZmlsZTpbUENTX0hPTUVdL2NvcmUvcGdlL3BvbGljeS9hY3Rpb24tYmVhbnMueG1sIiBlbnZSZXBsYWNlPSJ0cnVlIi8+CisJCQkKKwkJCTwhLS0gVGltZW91dCBwcm9wZXJ0aWVzIC0tPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1RpbWVvdXQiIHZhbHVlPSIzMDAwMCIvPgorCQkJCisJCQk8IS0tIG1ldGFkYXRhIGVsZW1lbnQgbmFtZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRmlsZW5hbWVLZXkiIHZhbHVlPSJGaWxlbmFtZSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1N0YXJ0RGF0ZVRpbWVLZXkiIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRW5kRGF0ZVRpbWVLZXkiIHZhbHVlPSJFbmREYXRlVGltZSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1NvcnRCeUtleSIgdmFsdWU9IlN0YXJ0RGF0ZVRpbWUiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9WZXJzaW9uaW5nS2V5IiB2YWx1ZT0iUHJvZHVjdGlvbkRhdGVUaW1lIi8+CisJCQkKKwkJCTwhLS0gcXVlcnkgcHJvcGVydGllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9GaWx0ZXJBbGdvckNsYXNzIiB2YWx1ZT0ib3JnLmFwYWNoZS5vb2R0LmNhcy5maWxlbWdyLnN0cnVjdHMucXVlcnkuZmlsdGVyLldlaWdodGVkSGFzaEZpbHRlckFsZ29yIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vTWluTnVtT2ZGaWxlcyIgdmFsdWU9IjEiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9NYXhHYXBTaXplIiB2YWx1ZT0iLTEiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FcHNpbG9uSW5NaWxsaXMiIHZhbHVlPSIwIi8+CQkJCisJCQkKKwkJCTwhLS0gZm9ybWF0dGluZyBwcm9wZXJ0aWVzIGZvciBxdWVyaWVzIC0tPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Jlc3VsdEZvcm1hdCIgdmFsdWU9IiRGaWxlTG9jYXRpb24vJEZpbGVuYW1lIi8+CisJCQkKKwkJCTwhLS0gV2FpdCB0aW1lIGJldHdlZW4gYmxvY2sgYW5kIHVuYmxvY2sgaW4gbWludXRlcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJCbG9ja1RpbWVFbGFwc2UiIHZhbHVlPSIxIi8+CisKKwkJPC9jb25maWd1cmF0aW9uPgorCisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0icGFyYWxsZWwiIHR5cGU9InByZSI+CisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpNT0FfSUFTSV9MMUNfRGFpbHkiLz4JCQkKKwkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46bnBwOk1PQV9NSFNfTDFCX0RhaWx5Ii8+CQkJCisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm5wcDpNT0FfQU1TVUFfTDFCX0RhaWx5Ii8+CQkJCisJCTwvY29uZGl0aW9ucz4KKwkJCisJCTxwYXJhbGxlbD4KKwkJCTx0YXNrIGlkLXJlZj0idXJuOm5wcDpPcmJpdHMiLz4KKwkJCTx0YXNrIGlkLXJlZj0idXJuOm5wcDpNb2FJYXNpR1BvbHlnb24iLz4KKwkJCTx0YXNrIGlkLXJlZj0idXJuOm5wcDpNb2FNaHNHUG9seWdvbiIvPgorCQkJPHRhc2sgaWQtcmVmPSJ1cm46bnBwOk1vYUFtc3VhR1BvbHlnb24iLz4JCQkKKwkJPC9wYXJhbGxlbD4KKwkJCisJCTxwYXJhbGxlbD4JCQorCQkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiB0eXBlPSJwcmUiPgorCQkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46bnBwOk1PQV9PUkJJVFNfRmlsZUJhc2VkIi8+CisJCQk8L2NvbmRpdGlvbnM+CisJCQkKKwkJCTx0YXNrIGlkLXJlZj0idXJuOm5wcDpNb2FJYXNpTWFwIi8+CisJCQk8dGFzayBpZC1yZWY9InVybjpucHA6TW9hTWhzTWFwIi8+CisJCQk8dGFzayBpZC1yZWY9InVybjpucHA6TW9hQW1zdWFNYXAiLz4KKwkJCQorCQkJPCEtLWNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiB0eXBlPSJwb3N0Ij4gIAorCQkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46bnBwOlZlcmlmeU1hcHNFeGlzdCIgbmFtZT0iVmVyaWZ5TWFwc0V4aXN0Ii8+CQkJCQorCQkJPC9jb25kaXRpb25zLS0+CisKKwkJPC9wYXJhbGxlbD4KKwkJCisJPC9zZXF1ZW50aWFsPgorCisKKwk8IS0tIENPTkRJVElPTlMgLS0+CisJPGNvbmRpdGlvbiBpZD0idXJuOm5wcDpNT0FfSUFTSV9MMUNfRGFpbHkiIG5hbWU9Ik1PQV9JQVNJX0wxQ19EYWlseSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iIHRpbWVvdXQ9IjMwIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8IS0tIHF1ZXJ5IHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUHJvZHVjdFR5cGVOYW1lcyIgdmFsdWU9Ik1PQV9JQVNJX0wxQyIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0V4cGVjdGVkTnVtT2ZGaWxlcyIgdmFsdWU9IjQ4MCIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0Vwc2lsb25Jbk1pbGxpcyIgdmFsdWU9IjMwMDAwIi8+CisJCQk8IS0tIGZvcm1hdHRpbmcgcHJvcGVydGllcyBmb3IgcXVlcmllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Gb3JtYXR0ZWRTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0lBU0lfTDFGb3JtYXR0ZWRRdWVyeSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9GaWxlbmFtZXNTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0lBU0lfTDFGaWxlbmFtZXNRdWVyeSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJqYXZhIi8+CisJCTwvY29uZmlndXJhdGlvbj4KKwk8L2NvbmRpdGlvbj4JCQkKKwk8Y29uZGl0aW9uIGlkPSJ1cm46bnBwOk1PQV9NSFNfTDFCX0RhaWx5IiBuYW1lPSJNT0FfTUhTX0wxQl9EYWlseSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTwhLS0gcXVlcnkgcHJvcGVydGllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTU9BX01IU19MMUIiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxNSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0Vwc2lsb25Jbk1pbGxpcyIgdmFsdWU9IjYwMDAwIi8+IDwhLS0ybWlucy0tPgorCQkJPCEtLSBmb3JtYXR0aW5nIHByb3BlcnRpZXMgZm9yIHF1ZXJpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRm9ybWF0dGVkU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9NSFNfTDFGb3JtYXR0ZWRRdWVyeSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9GaWxlbmFtZXNTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL01IU19MMUZpbGVuYW1lc1F1ZXJ5Ii8+IAorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImphdmEiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvY29uZGl0aW9uPgkJCisJPGNvbmRpdGlvbiBpZD0idXJuOm5wcDpNT0FfQU1TVUFfTDFCX0RhaWx5IiBuYW1lPSJNT0FfTUhTX0wxQl9EYWlseSIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTwhLS0gcXVlcnkgcHJvcGVydGllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Qcm9kdWN0VHlwZU5hbWVzIiB2YWx1ZT0iTU9BX0FNU1VBX0wxQiIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0V4cGVjdGVkTnVtT2ZGaWxlcyIgdmFsdWU9IjE1Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXBzaWxvbkluTWlsbGlzIiB2YWx1ZT0iNjAwMDAiLz4gPCEtLTJtaW5zLS0+CisJCQk8IS0tIGZvcm1hdHRpbmcgcHJvcGVydGllcyBmb3IgcXVlcmllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Gb3JtYXR0ZWRTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0FNU1VBX0wxRm9ybWF0dGVkUXVlcnkiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRmlsZW5hbWVzU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9MMUZpbGVuYW1lc1F1ZXJ5Ii8+IAorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImphdmEiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvY29uZGl0aW9uPgkKKwk8Y29uZGl0aW9uIGlkPSJ1cm46bnBwOk1PQV9PUkJJVFNfRmlsZUJhc2VkIiBuYW1lPSJNT0FfT1JCSVRTX0ZpbGVCYXNlZCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iIG9wdGlvbmFsPSJ0cnVlIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8IS0tIHF1ZXJ5IHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUHJvZHVjdFR5cGVOYW1lcyIgdmFsdWU9Ik1PQV9PUkJJVFMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisJCQk8IS0tIGZvcm1hdHRpbmcgcHJvcGVydGllcyBmb3IgcXVlcmllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Gb3JtYXR0ZWRTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL09yYml0c0Zvcm1hdHRlZFF1ZXJ5Ii8+IAorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0ZpbGVuYW1lc1NxbFF1ZXJ5S2V5IiB2YWx1ZT0iUnVudGltZS9Db25kaXRpb24vT3JiaXRzRmlsZW5hbWVzUXVlcnkiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJqYXZhIi8+CQkKKwkJPC9jb25maWd1cmF0aW9uPgkKKwk8L2NvbmRpdGlvbj4JCisJPGNvbmRpdGlvbiBpZD0idXJuOm5wcDpNT0FfSUFTSV9QT0xZX0ZpbGVCYXNlZCIgbmFtZT0iTU9BX0lBU0lfUE9MWV9GaWxlQmFzZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8IS0tIHF1ZXJ5IHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUHJvZHVjdFR5cGVOYW1lcyIgdmFsdWU9Ik1PQV9JQVNJX1BPTFkiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisJCQk8IS0tIGZvcm1hdHRpbmcgcHJvcGVydGllcyBmb3IgcXVlcmllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Gb3JtYXR0ZWRTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0lBU0lfR1BvbHlGb3JtYXR0ZWRRdWVyeSIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9GaWxlbmFtZXNTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0lBU0lfR1BvbHlGaWxlbmFtZXNRdWVyeSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImphdmEiLz4JCisJCTwvY29uZmlndXJhdGlvbj4JCisJPC9jb25kaXRpb24+CQkJCisJPGNvbmRpdGlvbiBpZD0idXJuOm5wcDpNT0FfTUhTX1BPTFlfRmlsZUJhc2VkIiBuYW1lPSJNT0FfTUhTX1BPTFlfRmlsZUJhc2VkIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuY29uZGl0aW9uLlBHRVRhc2tXb3JrZmxvd0NvbmRpdGlvbiI+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPCEtLSBxdWVyeSBwcm9wZXJ0aWVzIC0tPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL1Byb2R1Y3RUeXBlTmFtZXMiIHZhbHVlPSJNT0FfTUhTX1BPTFkiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9FeHBlY3RlZE51bU9mRmlsZXMiIHZhbHVlPSIxIi8+CisJCQk8IS0tIGZvcm1hdHRpbmcgcHJvcGVydGllcyBmb3IgcXVlcmllcyAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmRpdGlvbi9Gb3JtYXR0ZWRTcWxRdWVyeUtleSIgdmFsdWU9IlJ1bnRpbWUvQ29uZGl0aW9uL01IU19HUG9seUZvcm1hdHRlZFF1ZXJ5Ii8+IAorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0ZpbGVuYW1lc1NxbFF1ZXJ5S2V5IiB2YWx1ZT0iUnVudGltZS9Db25kaXRpb24vTUhTX0dQb2x5RmlsZW5hbWVzUXVlcnkiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJqYXZhIi8+CQorCQk8L2NvbmZpZ3VyYXRpb24+CQorCTwvY29uZGl0aW9uPgkJCQorCTxjb25kaXRpb24gaWQ9InVybjpucHA6TU9BX0FNU1VBX1BPTFlfRmlsZUJhc2VkIiBuYW1lPSJNT0FfQU1TVUFfUE9MWV9GaWxlQmFzZWQiIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5jb25kaXRpb24uUEdFVGFza1dvcmtmbG93Q29uZGl0aW9uIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8IS0tIHF1ZXJ5IHByb3BlcnRpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vUHJvZHVjdFR5cGVOYW1lcyIgdmFsdWU9Ik1PQV9BTVNVQV9QT0xZIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRXhwZWN0ZWROdW1PZkZpbGVzIiB2YWx1ZT0iMSIvPgorCQkJPCEtLSBmb3JtYXR0aW5nIHByb3BlcnRpZXMgZm9yIHF1ZXJpZXMgLS0+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25kaXRpb24vRm9ybWF0dGVkU3FsUXVlcnlLZXkiIHZhbHVlPSJSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9HUG9seUZvcm1hdHRlZFF1ZXJ5Ii8+IAorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZGl0aW9uL0ZpbGVuYW1lc1NxbFF1ZXJ5S2V5IiB2YWx1ZT0iUnVudGltZS9Db25kaXRpb24vQU1TVUFfR1BvbHlGaWxlbmFtZXNRdWVyeSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImphdmEiLz4KKwkJPC9jb25maWd1cmF0aW9uPgkKKwk8L2NvbmRpdGlvbj4JCisJPCEtLWNvbmRpdGlvbiBpZD0idXJuOm5wcDpWZXJpZnlNYXBzRXhpc3QiIG5hbWU9IlZlcmlmeU1hcHNFeGlzdCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLmNvbmRpdGlvbi5QR0VUYXNrV29ya2Zsb3dDb25kaXRpb24iLy0tPgkJCQkKKwkKKwkKKwk8IS0tIFRBU0tTIC0tPgorCTx0YXNrIGlkPSJ1cm46bnBwOk9yYml0cyIgbmFtZT0iTW9hT3JiaXRzIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuU3RkUEdFVGFza0luc3RhbmNlIj4KKwkJPGNvbmZpZ3VyYXRpb24+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9OYW1lIiB2YWx1ZT0iTW9hT3JiaXRzIiAvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZmlnRmlsZVBhdGgiIHZhbHVlPSJbU1BTU19DT05GSUdfSE9NRV0vW01vYU9yYml0cy9TUFNTX1ZlcnNpb25dL2NvbmZpZy9QZ2VDb25maWdfTW9hT3JiaXRzLnhtbCIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxRm9ybWF0dGVkUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vSUFTSV9MMUZvcm1hdHRlZFF1ZXJ5XSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxRmlsZW5hbWVzUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vSUFTSV9MMUZpbGVuYW1lc1F1ZXJ5XSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL1NoYXJlZE1ldG91dCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hT3JiaXRzL1NQU1NfVmVyc2lvbl0vbWV0b3V0L0FsbFByb2R1Y3RzX21ldGFkYXRhLnhtbCxbU1BTU19DT05GSUdfSE9NRV0vW01vYU9yYml0cy9TUFNTX1ZlcnNpb25dL21ldG91dC9EYWlseVByb2R1Y3RfbWV0YWRhdGEueG1sIi8+IAorCQkJPHByb3BlcnR5IG5hbWU9Ikluc3RydW1lbnQiIHZhbHVlPSJNZXRPcFMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FJYXNpR1BvbHlnb24iIG5hbWU9Ik1vYUlhc2lHUG9seWdvbiIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLlN0ZFBHRVRhc2tJbnN0YW5jZSI+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svTmFtZSIgdmFsdWU9Ik1vYUlhc2lHUG9seWdvbiIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZmlnRmlsZVBhdGgiIHZhbHVlPSJbU1BTU19DT05GSUdfSE9NRV0vW01vYUlhc2lHUG9seWdvbi9TUFNTX1ZlcnNpb25dL2NvbmZpZy9QZ2VDb25maWdfTW9hR1BvbHlnb24ueG1sIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vTDFGb3JtYXR0ZWRRdWVyeSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0wxRm9ybWF0dGVkUXVlcnldIi8+CQkJCisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vTDFGaWxlbmFtZXNRdWVyeSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9JQVNJX0wxRmlsZW5hbWVzUXVlcnldIi8+CQkJCisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vU2hhcmVkTWV0b3V0IiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FJYXNpR1BvbHlnb24vU1BTU19WZXJzaW9uXS9tZXRvdXQvQWxsUHJvZHVjdHNfbWV0YWRhdGEueG1sLFtTUFNTX0NPTkZJR19IT01FXS9bTW9hSWFzaUdQb2x5Z29uL1NQU1NfVmVyc2lvbl0vbWV0b3V0L0RhaWx5UHJvZHVjdF9tZXRhZGF0YS54bWwiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iSW5zdHJ1bWVudCIgdmFsdWU9IklBU0kiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FNaHNHUG9seWdvbiIgbmFtZT0iTW9hTWhzR1BvbHlnb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNb2FBbXN1YUdQb2x5Z29uIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hQW1zdWFHUG9seWdvbi9TUFNTX1ZlcnNpb25dL2NvbmZpZy9QZ2VDb25maWdfTW9hR1BvbHlnb24ueG1sIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vTDFGb3JtYXR0ZWRRdWVyeSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9MMUZvcm1hdHRlZFF1ZXJ5XSIvPgkJCQkJCQorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxRmlsZW5hbWVzUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vQU1TVUFfTDFGaWxlbmFtZXNRdWVyeV0iLz4JCQkJCQkKKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9TaGFyZWRNZXRvdXQiIHZhbHVlPSJbU1BTU19DT05GSUdfSE9NRV0vW01vYUFtc3VhR1BvbHlnb24vU1BTU19WZXJzaW9uXS9tZXRvdXQvQWxsUHJvZHVjdHNfbWV0YWRhdGEueG1sLFtTUFNTX0NPTkZJR19IT01FXS9bTW9hQW1zdWFHUG9seWdvbi9TUFNTX1ZlcnNpb25dL21ldG91dC9EYWlseVByb2R1Y3RfbWV0YWRhdGEueG1sIi8+IAorCQkJPHByb3BlcnR5IG5hbWU9Ikluc3RydW1lbnQiIHZhbHVlPSJBTVNVQSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImlkbCIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46bnBwOk1vYUFtc3VhR1BvbHlnb24iIG5hbWU9Ik1vYUFtc3VhR1BvbHlnb24iIGNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLnBnZS5TdGRQR0VUYXNrSW5zdGFuY2UiPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNb2FNaHNHUG9seWdvbiIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svQ29uZmlnRmlsZVBhdGgiIHZhbHVlPSJbU1BTU19DT05GSUdfSE9NRV0vW01vYU1oc0dQb2x5Z29uL1NQU1NfVmVyc2lvbl0vY29uZmlnL1BnZUNvbmZpZ19Nb2FHUG9seWdvbi54bWwiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9MMUZvcm1hdHRlZFF1ZXJ5IiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL01IU19MMUZvcm1hdHRlZFF1ZXJ5XSIvPgkJCQkJCQkJCQorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0wxRmlsZW5hbWVzUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vTUhTX0wxRmlsZW5hbWVzUXVlcnldIi8+CQkJCQkJCQkJCisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vU2hhcmVkTWV0b3V0IiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FNaHNHUG9seWdvbi9TUFNTX1ZlcnNpb25dL21ldG91dC9BbGxQcm9kdWN0c19tZXRhZGF0YS54bWwsW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FNaHNHUG9seWdvbi9TUFNTX1ZlcnNpb25dL21ldG91dC9EYWlseVByb2R1Y3RfbWV0YWRhdGEueG1sIi8+IAorCQkJPHByb3BlcnR5IG5hbWU9Ikluc3RydW1lbnQiIHZhbHVlPSJNSFMiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FJYXNpTWFwIiBuYW1lPSJNb2FJYXNpTWFwIiBjbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy5wZ2UuU3RkUEdFVGFza0luc3RhbmNlIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiB0eXBlPSJwcmUiPgorCQkJPGNvbmRpdGlvbiBpZC1yZWY9InVybjpucHA6TU9BX0lBU0lfUE9MWV9GaWxlQmFzZWQiLz4JCQkKKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNb2FJYXNpTWFwIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hSWFzaU1hcC9TUFNTX1ZlcnNpb25dL2NvbmZpZy9QZ2VDb25maWdfTW9hTWFwLnhtbCIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0dQb2x5Rm9ybWF0dGVkUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vSUFTSV9HUG9seUZvcm1hdHRlZFF1ZXJ5XSIvPgkJCQkJCQkJCQorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0dQb2x5RmlsZW5hbWVzUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vSUFTSV9HUG9seUZpbGVuYW1lc1F1ZXJ5XSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL1NoYXJlZE1ldG91dCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hSWFzaU1hcC9TUFNTX1ZlcnNpb25dL21ldG91dC9BbGxQcm9kdWN0c19tZXRhZGF0YS54bWwsW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FJYXNpTWFwL1NQU1NfVmVyc2lvbl0vbWV0b3V0L0RhaWx5UHJvZHVjdF9tZXRhZGF0YS54bWwiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iSW5zdHJ1bWVudCIgdmFsdWU9IklBU0kiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm5wcDpNb2FNaHNNYXAiIG5hbWU9Ik1vYU1oc01hcCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLlN0ZFBHRVRhc2tJbnN0YW5jZSI+CisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCIgdHlwZT0icHJlIj4KKwkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46bnBwOk1PQV9NSFNfUE9MWV9GaWxlQmFzZWQiLz4JCQkKKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL05hbWUiIHZhbHVlPSJNb2FNaHNNYXAiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQR0VUYXNrL0NvbmZpZ0ZpbGVQYXRoIiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FNaHNNYXAvU1BTU19WZXJzaW9uXS9jb25maWcvUGdlQ29uZmlnX01vYU1hcC54bWwiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9HUG9seUZvcm1hdHRlZFF1ZXJ5IiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL01IU19HUG9seUZvcm1hdHRlZFF1ZXJ5XSIvPgkJCQkJCQkJCQorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL0dQb2x5RmlsZW5hbWVzUXVlcnkiIHZhbHVlPSJbUnVudGltZS9Db25kaXRpb24vTUhTX0dQb2x5RmlsZW5hbWVzUXVlcnldIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vU2hhcmVkTWV0b3V0IiB2YWx1ZT0iW1NQU1NfQ09ORklHX0hPTUVdL1tNb2FNaHNNYXAvU1BTU19WZXJzaW9uXS9tZXRvdXQvQWxsUHJvZHVjdHNfbWV0YWRhdGEueG1sLFtTUFNTX0NPTkZJR19IT01FXS9bTW9hTWhzTWFwL1NQU1NfVmVyc2lvbl0vbWV0b3V0L0RhaWx5UHJvZHVjdF9tZXRhZGF0YS54bWwiLz4gCisJCQk8cHJvcGVydHkgbmFtZT0iSW5zdHJ1bWVudCIgdmFsdWU9Ik1IUyIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlF1ZXVlTmFtZSIgdmFsdWU9ImlkbCIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46bnBwOk1vYUFtc3VhTWFwIiBuYW1lPSJNb2FBbXN1YU1hcCIgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMucGdlLlN0ZFBHRVRhc2tJbnN0YW5jZSI+CisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCIgdHlwZT0icHJlIj4KKwkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46bnBwOk1PQV9BTVNVQV9QT0xZX0ZpbGVCYXNlZCIvPgkJCQorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBHRVRhc2svTmFtZSIgdmFsdWU9Ik1vYUFtc3VhTWFwIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iUEdFVGFzay9Db25maWdGaWxlUGF0aCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hQW1zdWFNYXAvU1BTU19WZXJzaW9uXS9jb25maWcvUGdlQ29uZmlnX01vYU1hcC54bWwiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJSdW50aW1lL0NvbmRpdGlvbi9HUG9seUZvcm1hdHRlZFF1ZXJ5IiB2YWx1ZT0iW1J1bnRpbWUvQ29uZGl0aW9uL0FNU1VBX0dQb2x5Rm9ybWF0dGVkUXVlcnldIi8+CQkJCQkJCQkJCisJCQk8cHJvcGVydHkgbmFtZT0iUnVudGltZS9Db25kaXRpb24vR1BvbHlGaWxlbmFtZXNRdWVyeSIgdmFsdWU9IltSdW50aW1lL0NvbmRpdGlvbi9BTVNVQV9HUG9seUZpbGVuYW1lc1F1ZXJ5XSIvPgorCQkJPHByb3BlcnR5IG5hbWU9IlJ1bnRpbWUvQ29uZGl0aW9uL1NoYXJlZE1ldG91dCIgdmFsdWU9IltTUFNTX0NPTkZJR19IT01FXS9bTW9hQW1zdWFNYXAvU1BTU19WZXJzaW9uXS9tZXRvdXQvQWxsUHJvZHVjdHNfbWV0YWRhdGEueG1sLFtTUFNTX0NPTkZJR19IT01FXS9bTW9hQW1zdWFNYXAvU1BTU19WZXJzaW9uXS9tZXRvdXQvRGFpbHlQcm9kdWN0X21ldGFkYXRhLnhtbCIvPiAKKwkJCTxwcm9wZXJ0eSBuYW1lPSJJbnN0cnVtZW50IiB2YWx1ZT0iQU1TVUEiLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJRdWV1ZU5hbWUiIHZhbHVlPSJpZGwiLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwkKKzwvY2FzOndvcmtmbG93cz4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dlbmdpbmUvaGVsbG8tZ29vZGJ5ZS54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy93ZW5naW5lL2hlbGxvLWdvb2RieWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTk0OWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy93ZW5naW5lL2hlbGxvLWdvb2RieWUueG1sCkBAIC0wLDAgKzEsMTUzIEBACis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y2FzOndvcmtmbG93cyB4bWxucz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzIuMC9jYXMiCisJeG1sbnM6Y2FzPSJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvMi4wL2NhcyIgCisJeG1sbnM6cD0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzIuMC9jYXMvcHJvcGVydHkiPgorCisJPHBhcmFsbGVsIGlkPSJ1cm46b29kdDpUZXN0UGFyYWxsZWwiIG5hbWU9IlRlc3RQYXJhbGxlbCI+CisJCTxzZXF1ZW50aWFsIGlkPSJ1cm46b29kdDpTYXlIZWxsb0FuZEdvb2RCeWUiIG5hbWU9IkhlbGxvR29vZGJ5ZSI+CisJCQk8dGFzayBpZC1yZWY9InVybjpvb2R0OkhlbGxvV29ybGQiIC8+CisJCQk8dGFzayBpZC1yZWY9InVybjpvb2R0Okdvb2RieWVXb3JsZCIgLz4KKwkJPC9zZXF1ZW50aWFsPgorCQkKKwkJPGNvbmRpdGlvbnM+CisJCSAgPGNvbmRpdGlvbiBpZC1yZWY9InVybjpvb2R0OlRpbWVvdXRDb25kaXRpb24iLz4KKwkJPC9jb25kaXRpb25zPgorCisJCTx0YXNrIGlkLXJlZj0idXJuOm9vZHQ6SW50ZW5zaXZlVGFzayIgLz4KKwk8L3BhcmFsbGVsPgorCisJPHRhc2sgaWQ9InVybjpvb2R0OkhlbGxvV29ybGQiIG5hbWU9IkhlbGxvIFdvcmxkIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5IZWxsb1dvcmxkIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIj4KKwkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46b29kdDpUcnVlQ29uZGl0aW9uIiAvPgorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBlcnNvbiIgdmFsdWU9IkNocmlzIiAvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpHb29kYnllV29ybGQiIG5hbWU9Ikdvb2RieWUgV29ybGQiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkdvb2RieWVXb3JsZCI+CisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCI+CisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm9vZHQ6VHJ1ZUNvbmRpdGlvbiIgLz4KKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQZXJzb24iIHZhbHVlPSJDaHJpcyIgLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6WW91cmVTdHVjayIgbmFtZT0iWW91J3JlIFN0dWNrIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Hb29kYnllV29ybGQiPgorCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiPgorCQkJPGNvbmRpdGlvbiBpZC1yZWY9InVybjpvb2R0OkZhbHNlQ29uZGl0aW9uIiAvPgorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBlcnNvbiIgdmFsdWU9IkNocmlzIiAvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpJbnRlbnNpdmVUYXNrIiBuYW1lPSJQcm9jZXNzb3IgSW50ZW5zaXZlIFRhc2siCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkxvbmdUYXNrIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiAvPgorCQk8Y29uZmlndXJhdGlvbiAvPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6SW50ZW5zaXZlVGFza1dpdGhXYWl0IiBuYW1lPSJJbnRlbnNpdmUgV2FpdGVyIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Mb25nVGFzayI+CisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCI+CisJCQk8Y29uZGl0aW9uIGlkLXJlZj0idXJuOm9vZHQ6TG9uZ0NvbmRpdGlvbiIgLz4KKwkJPC9jb25kaXRpb25zPgorCQk8Y29uZmlndXJhdGlvbiAvPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6UHJvcFJlcGxhY2VUYXNrIiBuYW1lPSJQUlRhc2siCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLkxvbmdUYXNrIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiAvPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQYXRoVG9SZXBsYWNlIiB2YWx1ZT0iW0hPTUVdL215L3BhdGgiCisJCQkJZW52UmVwbGFjZT0idHJ1ZSIgLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJEb250UmVwbGFjZU1lIiB2YWx1ZT0iW0hPTUVdL215L3BhdGgiCisJCQkJZW52UmVwbGFjZT0iZmFsc2UiIC8+CisJCQk8cHJvcGVydHkgbmFtZT0iRG9udFJlcGxhY2VNZU5vU3BlYyIgdmFsdWU9IltIT01FXS9teS9wYXRoIiAvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpOdW1JbmNyZW1lbnRUYXNrIiBuYW1lPSJOdW0gSW5jcmVtZW50IFRhc2siCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLk51bUluY3JlbWVudFRhc2siPgorCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiIC8+CisJCTxjb25maWd1cmF0aW9uIC8+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpSYW5kb21TdGF0dXNVcGRhdGVUYXNrIiBuYW1lPSJSYW5kb20gU3RhdHVzIFVwZGF0ZSIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuUmFuZG9tU3RhdHVzVXBkYXRlVGFzayI+CisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCIgLz4KKwkJPGNvbmZpZ3VyYXRpb24gLz4KKwk8L3Rhc2s+CisJPHRhc2sgaWQ9InVybjpvb2R0OlRlc3RNdWx0aUNvbmRpdGlvblRhc2siIG5hbWU9IlRlc3QgTXVsdGkgQ29uZGl0aW9uIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5IZWxsb1dvcmxkIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIj4KKwkJCTxjb25kaXRpb24gaWQtcmVmPSJ1cm46b29kdDpUcnVlQ29uZGl0aW9uIiAvPgorCQkJPGNvbmRpdGlvbiBpZC1yZWY9InVybjpvb2R0OkZhbHNlQ29uZGl0aW9uIiAvPgorCQk8L2NvbmRpdGlvbnM+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlBlcnNvbiIgdmFsdWU9IkNocmlzIiAvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpUZXN0UmVxTWV0RmllbGRzVGFzayIgbmFtZT0iVGVzdCBNZXQgRmllbGRzIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Mb25nVGFzayI+CisJCTxjb25kaXRpb25zIGV4ZWN1dGlvbj0ic2VxdWVudGlhbCIgLz4KKwkJPGNvbmZpZ3VyYXRpb24gLz4KKwkJPHJlcXVpcmVkTWV0RmllbGRzPgorCQkJPG1ldGZpZWxkIG5hbWU9Im51bVNlY29uZHMiIC8+CisJCTwvcmVxdWlyZWRNZXRGaWVsZHM+CisJPC90YXNrPgorCTx0YXNrIGlkPSJ1cm46b29kdDpFeHRlcm5hbFNjcmlwdFRhc2siIG5hbWU9IkV4dGVybmFsIFNjcmlwdCBUYXNrIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5FeHRlcm5TY3JpcHRUYXNrSW5zdGFuY2UiPgorCQk8Y29uZGl0aW9ucyBleGVjdXRpb249InNlcXVlbnRpYWwiIC8+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9IlNoZWxsVHlwZSIgdmFsdWU9Ii9iaW4vc2giIC8+IDwhLS0gb3IgL2Jpbi90Y3NoIGlmIHlvdSBoYXZlIHRjc2ggc2hlbGwgZW52aW9ubWVudDsgb3IgL3Vzci9iaW4vIGlmIHlvdSAKKwkJCQloYXZlIGEgY29tcGlsZWQgcHJvZ3JhbSAtLT4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJQYXRoVG9TY3JpcHQiIHZhbHVlPSIvdXNyL2xvY2FsL3NhbXBsZVNjcmlwdC5zaCIgLz4gPCEtLSBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBmaWxlIG5hbWUgYXMgd2VsbCAtLT4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvdGFzaz4KKwk8dGFzayBpZD0idXJuOm9vZHQ6bWFpbFRhc2siIG5hbWU9IkluZ2VzdCBlLU1haWwiCisJCWNsYXNzPSJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmV4YW1wbGVzLk1haWxUYXNrIj4KKwkJPGNvbmRpdGlvbnMgZXhlY3V0aW9uPSJzZXF1ZW50aWFsIiAvPgorCQk8Y29uZmlndXJhdGlvbj4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJ1c2VyLm5hbWUiIHZhbHVlPSJDb3N0aW4iIC8+CisJCQk8cHJvcGVydHkgbmFtZT0ibXNnLnN1YmplY3QiIHZhbHVlPSJJbmdlc3QgTm90aWZpY2F0aW9uIiAvPgorCQkJPHByb3BlcnR5IG5hbWU9Im1haWwudG8iIHZhbHVlPSJjaHJpcy5tYXR0bWFubkBqcGwubmFzYS5nb3YiIC8+CisJCQk8cHJvcGVydHkgbmFtZT0ibWFpbC5mcm9tIiB2YWx1ZT0ib29kdEBqcGwubmFzYS5nb3YiIC8+CisJCTwvY29uZmlndXJhdGlvbj4KKwk8L3Rhc2s+CisKKwk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpUcnVlQ29uZGl0aW9uIiBuYW1lPSJUcnVlIENvbmRpdGlvbiIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuVHJ1ZUNvbmRpdGlvbiIgLz4KKwk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpGYWxzZUNvbmRpdGlvbiIgbmFtZT0iRmFsc2UgQ29uZGl0aW9uIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5GYWxzZUNvbmRpdGlvbiIgLz4KKwk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpMb25nQ29uZGl0aW9uIiBuYW1lPSJMb25nIENvbmRpdGlvbiIKKwkJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuTG9uZ0NvbmRpdGlvbiIgLz4KKwk8Y29uZGl0aW9uIGlkPSJ1cm46b29kdDpDaGVja0Zvck1ldGFkYXRhS2V5cyIgbmFtZT0iTWV0YWRhdGEgS2V5IENoZWNrIgorCQljbGFzcz0ib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5DaGVja0Zvck1ldGFkYXRhS2V5cyI+CisJCTxjb25maWd1cmF0aW9uPgorCQkJPHByb3BlcnR5IG5hbWU9InJlcU1ldEtleXMiIHZhbHVlPSJNZXQxLE1ldDIsTWV0MyIgLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCTwvY29uZGl0aW9uPgorCTxjb25kaXRpb24gaWQ9InVybjpvb2R0OlRpbWVvdXRDb25kaXRpb24iIG5hbWU9IlRpbWVvdXQgQ29uZGl0aW9uIiAKKwkgICAgY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuRmFsc2VDb25kaXRpb24iIHRpbWVvdXQ9IjMwIi8+CisJCisJPGNvbmRpdGlvbiBpZD0idXJuOm9vZHQ6T3B0aW9uYWxDb25kaXRpb24iIG5hbWU9Ik9wdGlvbmFsIENvbmRpdGlvbiIgCisJY2xhc3M9Im9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuRmFsc2VDb25kaXRpb24iIG9wdGlvbmFsPSJ0cnVlIi8+CisJCisKKworCis8L2Nhczp3b3JrZmxvd3M+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy93ZW5naW5lL3dlbmdpbmUtbGlmZWN5Y2xlLnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dlbmdpbmUvd2VuZ2luZS1saWZlY3ljbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MDIxNWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy93ZW5naW5lL3dlbmdpbmUtbGlmZWN5Y2xlLnhtbApAQCAtMCwwICsxLDEyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEZJWE1FOiBDaGFuZ2UgbmFtZXNwYWNlIFVSST8gLS0+Cis8Y2FzOndvcmtmbG93bGlmZWN5Y2xlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKzxkZWZhdWx0PgorIDwhLS0gc3RhZ2VzIGluIHRoaXMgc2Vuc2UgbWFwIHRvIGJmb3N0ZXIncyBvcmlnaW5hbCAiQ2F0ZWdvcnkiIGNsYXNzaWZpY2F0aW9uCisgICAgICB0aGF0IGlzIG1lbnRpb25lZCBpbiB0aGUgV29ya2Zsb3cyIFVzZXIncyBHdWlkZQorICAgICAgCisgIC0tPgorICA8c3RhZ2UgbmFtZT0iaW5pdGlhbCI+CisgICA8IS0tIAorICAgICBTdGF0dXNlcyBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQKKyAgICAgaW4gdGhlIGZvcm06CisgICAgICAgJmx0O3N0YXR1cyZndDtOYW1lJmx0Oy9zdGF0dXMmZ3Q7CisgICAgICAgCisgICAgICAgVG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEluIHRoaXMKKyAgICAgICBjYXNlLCB0aGUgZ2l2ZW4gZGVzY3JpcHRpb24gd2lsbCBzaW1wbHkgYmUgdGhlIAorICAgICAgIHByb3ZpZGVkIHN0YXR1cyBuYW1lLgorICAgICAgIAorICAgICBBcyBvZiBBcGFjaGUgT09EVCAwLjQsIHN0YXR1c2VzIGluIHRoaXMgZmlsZSBjYW4gCisgICAgIGFsc28gdGFrZSB0aGUgZm9ybToKKyAgICAgCisgICAgICAgJmx0O3N0YXR1cyBuYW1lPSZxdW90O05hbWUmcXVvdDsmZ3Q7CisgICAgICAgICZsdDtkZXNjcmlwdGlvbiZndDtEZXNjcmlwdGlvbiZsdDsvZGVzY3JpcHRpb24mZ3Q7ICAgCisgICAgICAgJmx0Oy9zdGF0dXMmZ3Q7ICAgICAgCisgICAgLS0+CisgICA8c3RhdHVzIG5hbWU9Ik51bGwiPgorICAgICA8ZGVzY3JpcHRpb24+VW5pbml0aWFsaXplZCBTdGF0ZTwvZGVzY3JpcHRpb24+CisgICA8L3N0YXR1cz4KKyAgIDxzdGF0dXMgbmFtZT0iTG9hZGVkIj4KKyAgICAgPGRlc2NyaXB0aW9uPkxvYWRpbmcgQ29tcGxldGU8L2Rlc2NyaXB0aW9uPgorICAgPC9zdGF0dXM+CisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJ3YWl0aW5nIj4KKyAgIDxzdGF0dXMgbmFtZT0iUXVldWVkIj4KKyAgICAgIDxkZXNjcmlwdGlvbj5RdWV1ZWQgaW4gV29ya2Zsb3dFbmdpbmU8L2Rlc2NyaXB0aW9uPgorICAgPC9zdGF0dXM+CisgICA8c3RhdHVzIG5hbWU9IkJsb2NrZWQiPgorICAgICAgPGRlc2NyaXB0aW9uPlRhc2sgQmFpbGVkPC9kZXNjcmlwdGlvbj4KKyAgIDwvc3RhdHVzPgorICAgPHN0YXR1cyBuYW1lPSJXYWl0aW5nT25SZXNvdXJjZXMiPgorICAgICAgPGRlc2NyaXB0aW9uPldhaXRpbmcgZm9yIHJlc291cmNlIHRvIGV4ZWN1dGU8L2Rlc2NyaXB0aW9uPiAgIAorICAgPC9zdGF0dXM+CisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJ0cmFuc2l0aW9uIj4KKyAgIDxzdGF0dXMgbmFtZT0iUHJlQ29uZGl0aW9uU3VjY2VzcyI+ICAKKyAgICAgIDxkZXNjcmlwdGlvbj5BbGwgUHJlQ29uZGl0aW9uIEZpbmlzaGVkIFN1Y2Nlc3NmdWxseTwvZGVzY3JpcHRpb24+CisgICA8L3N0YXR1cz4KKyAgIDxzdGF0dXMgbmFtZT0iRXhlY3V0aW9uQ29tcGxldGUiPgorICAgICAgPGRlc2NyaXB0aW9uPkV4ZWN1dGlvbiBDb21wbGV0ZWQgU3VjY2Vzc2Z1bGx5PC9kZXNjcmlwdGlvbj4KKyAgIDwvc3RhdHVzPgorICA8L3N0YWdlPgorICA8c3RhZ2UgbmFtZT0iaG9sZGluZyI+CisgICA8c3RhdHVzIG5hbWU9IlVua25vd24iPgorICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIGlzIFVua25vd248L2Rlc2NyaXB0aW9uPgorICAgPC9zdGF0dXM+CisgICA8c3RhdHVzIG5hbWU9IlBhdXNlZCI+CisgICAgICA8ZGVzY3JpcHRpb24+SGFzIGJlZW4gbWFudWFsbHkgcGF1c2VkPC9kZXNjcmlwdGlvbj4KKyAgIDwvc3RhdHVzPgorICA8L3N0YWdlPiAgCisgIDxzdGFnZSBuYW1lPSJydW5uaW5nIj4KKyAgIDxzdGF0dXMgbmFtZT0iUHJlQ29uZGl0aW9uRXZhbCI+CisgICAgICA8ZGVzY3JpcHRpb24+RXhlY3V0aW5nIFByZUNvbmRpdGlvbnM8L2Rlc2NyaXB0aW9uPgorICAgPC9zdGF0dXM+CisgICA8c3RhdHVzIG5hbWU9IkV4ZWN1dGluZyI+CisgICAgICA8ZGVzY3JpcHRpb24+Q3VycmVudCBiZWluZyBleGVjdXRlZDwvZGVzY3JpcHRpb24+CisgICA8L3N0YXR1cz4KKyAgIDxzdGF0dXMgbmFtZT0iUG9zdENvbmRpdGlvbkV2YWwiPiAKKyAgICAgIDxkZXNjcmlwdGlvbj5FeGVjdXRpbmcgUG9zdENvbmRpdGlvbnM8L2Rlc2NyaXB0aW9uPgorICAgPC9zdGF0dXM+CisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJyZXN1bHRzIj4KKyAgICA8c3RhdHVzIG5hbWU9IlJlc3VsdHNTdWNjZXNzIj4KKyAgICAgIDxkZXNjcmlwdGlvbj5Ob3RpZmljYXRpb24gb2Ygc3VjY2VzczwvZGVzY3JpcHRpb24+CisgICAgPC9zdGF0dXM+CisgICAgPHN0YXR1cyBuYW1lPSJSZXN1bHRzRmFpbHVyZSI+CisgICAgICA8ZGVzY3JpcHRpb24+Tm90aWZpY2F0aW9uIG9mIGZhaWx1cmU8L2Rlc2NyaXB0aW9uPgorICAgIDwvc3RhdHVzPgorICAgIDxzdGF0dXMgbmFtZT0iUmVzdWx0c0JhaWwiPgorICAgICAgPGRlc2NyaXB0aW9uPk5vdGlmaWNhdGlvbiB0byBiYWlsIHdvcmtmbG93PC9kZXNjcmlwdGlvbj4KKyAgICA8L3N0YXR1cz4KKyAgPC9zdGFnZT4gIAorICA8c3RhZ2UgbmFtZT0iZG9uZSI+CisgICAgPHN0YXR1cyBuYW1lPSJTdG9wcGVkIj4KKyAgICAgIDxkZXNjcmlwdGlvbj5Gb3JjZSBLaWxsZWQ8L2Rlc2NyaXB0aW9uPgorICAgIDwvc3RhdHVzPgorICAgIDxzdGF0dXMgbmFtZT0iT2ZmIj4KKyAgICAgIDxkZXNjcmlwdGlvbj5UdXJuZWQgT0ZGPC9kZXNjcmlwdGlvbj4KKyAgICA8L3N0YXR1cz4KKyAgICA8c3RhdHVzIG5hbWU9IkZhaWx1cmUiPgorICAgICAgPGRlc2NyaXB0aW9uPkV4ZWN1dGlvbiBGYWlsZWQ8L2Rlc2NyaXB0aW9uPgorICAgIDwvc3RhdHVzPgorICAgIDxzdGF0dXMgbmFtZT0iU3VjY2VzcyI+CisgICAgICA8ZGVzY3JpcHRpb24+U3VjY2Vzc2Z1bGx5IENvbXBsZXRlZDwvZGVzY3JpcHRpb24+CisgICAgPC9zdGF0dXM+CisgIDwvc3RhZ2U+IAorIDwvZGVmYXVsdD4KKzwhLS0gCisgIExpZmVjeWNsZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGF0IHRoZSAKKyAgV29ya2Zsb3cgSWQgbGV2ZWwsIGJ5IHN0YXJ0aW5nIHdpdGggYSAKKyAgPGxpZmVjeWNsZSBuYW1lPSIiIHdvcmtmbG93SWQ9InNvbWVfaWQiPgorICAgIAorICAgIGRlY2xhcmF0aW9uLCBhbmQgdGhlbiB1c2luZyB0aGUgc3RhZ2UKKyAgICBhbmQgc3RhdHVzIHRhZ3MgYXBwcm9wcmlhdGVseSBhcyBzaG93bgorICAgIGFib3ZlCisgICAgCisgIDwvbGlmZWN5Y2xlPgorIC0tPgorPC9jYXM6d29ya2Zsb3dsaWZlY3ljbGVzPgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvd29ya2Zsb3ctaW5zdGFuY2UtbWV0LnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dvcmtmbG93LWluc3RhbmNlLW1ldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwZmY3NAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dvcmtmbG93LWluc3RhbmNlLW1ldC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEZJWE1FOiBDaGFuZ2UgbmFtZXNwYWNlIFVSST8gLS0+Cis8Y2FzOndpbnN0ZmllbGRzIHhtbG5zOmNhcz0iaHR0cDovL29vZHQuanBsLm5hc2EuZ292LzEuMC9jYXMiPgorPGRlZmF1bHQ+CisgIDxmaWVsZCBuYW1lPSJXb3JrZmxvd0luc3RJZCIvPgorICA8ZmllbGQgbmFtZT0iVGFza0lkIi8+CisgIDxmaWVsZCBuYW1lPSJQcm9jZXNzaW5nTm9kZSIvPgorPC9kZWZhdWx0PgorPHdvcmtmbG93IGlkPSJ1cm46b29kdDp0ZXN0V29ya2Zsb3ciPgorICA8ZmllbGQgbmFtZT0iV29ya2Zsb3dJbnN0SWQiLz4KKzwvd29ya2Zsb3c+Cis8d29ya2Zsb3cgaWQ9InVybjpvb2R0OnRlc3RNZXRFcnJvcldvcmtmbG93Ij4KKyAgPGZpZWxkIG5hbWU9Im51bVNlY29uZHMiLz4KKyAgPGZpZWxkIG5hbWU9IldvcmtmbG93SW5zdElkIi8+CisgIDxmaWVsZCBuYW1lPSJQcm9jZXNzaW5nTm9kZSIvPgorPC93b3JrZmxvdz4KKzwvY2FzOndpbnN0ZmllbGRzPgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvd29ya2Zsb3ctbGlmZWN5Y2xlLnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dvcmtmbG93LWxpZmVjeWNsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjNzMxYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dvcmtmbG93LWxpZmVjeWNsZS54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEZJWE1FOiBDaGFuZ2UgbmFtZXNwYWNlIFVSST8gLS0+Cis8Y2FzOndvcmtmbG93bGlmZWN5Y2xlcyB4bWxuczpjYXM9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi8xLjAvY2FzIj4KKzwhLS0gCisgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJbiB0aGlzCisgICAgICAgY2FzZSwgdGhlIGdpdmVuIGRlc2NyaXB0aW9uIHdpbGwgc2ltcGx5IGJlIHRoZSAKKyAgICAgICBwcm92aWRlZCBzdGF0dXMgbmFtZS4KKyAgICAgICAKKyAgICAgQXMgb2YgQXBhY2hlIE9PRFQgMC40LCBzdGF0dXNlcyBpbiB0aGlzIGZpbGUgY2FuIAorICAgICBhbHNvIHRha2UgdGhlIGZvcm06CisgICAgIAorICAgICAgICZsdDtzdGF0dXMgbmFtZT0mcXVvdDtOYW1lJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7RGVzY3JpcHRpb24mbHQ7L2Rlc2NyaXB0aW9uJmd0OyAgIAorICAgICAgICZsdDsvc3RhdHVzJmd0OworICAgICAgIAorIC0tPgorPGRlZmF1bHQ+CisgIDxzdGFnZSBuYW1lPSJzZXR1cCI+CisgICAgPHN0YXR1cz5RVUVVRUQ8L3N0YXR1cz4KKyAgICA8c3RhdHVzPkNSRUFURUQ8L3N0YXR1cz4KKyAgPC9zdGFnZT4KKyAgPHN0YWdlIG5hbWU9Im1ldF9jaGVjayI+CisgICAgPHN0YXR1cz5NRVRNSVNTPC9zdGF0dXM+CisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJwcmVjb25kX2NoZWNrIj4KKyAgICA8c3RhdHVzPlBBVVNFRDwvc3RhdHVzPiAgCisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJ3b3JrZmxvd19zdGFydCI+CisgICAgPHN0YXR1cz5SU1VCTUlUPC9zdGF0dXM+CisgICAgPHN0YXR1cz5TVEFSVEVEPC9zdGF0dXM+CisgIDwvc3RhZ2U+CisgIDxzdGFnZSBuYW1lPSJjb21wbGV0aW9uIj4KKyAgICA8c3RhdHVzPkZJTklTSEVEPC9zdGF0dXM+CisgIDwvc3RhZ2U+Cis8L2RlZmF1bHQ+CisKKzwhLS0gCisgIExpZmVjeWNsZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGF0IHRoZSAKKyAgV29ya2Zsb3cgSWQgbGV2ZWwsIGJ5IHN0YXJ0aW5nIHdpdGggYSAKKyAgPGxpZmVjeWNsZSBuYW1lPSIiIHdvcmtmbG93SWQ9InNvbWVfaWQiPgorICAgIAorICAgIGRlY2xhcmF0aW9uLCBhbmQgdGhlbiB1c2luZyB0aGUgc3RhZ2UKKyAgICBhbmQgc3RhdHVzIHRhZ3MgYXBwcm9wcmlhdGVseSBhcyBzaG93bgorICAgIGFib3ZlCisgICAgCisgIDwvbGlmZWN5Y2xlPgorIC0tPgorPC9jYXM6d29ya2Zsb3dsaWZlY3ljbGVzPgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzUwZTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3MCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGCisjIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorCisjIFNwZWNpZnkgdGhlIGhhbmRsZXJzIHRvIGNyZWF0ZSBpbiB0aGUgcm9vdCBsb2dnZXIKKyMgKGFsbCBsb2dnZXJzIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBsb2dnZXIpCisjIFRoZSBmb2xsb3dpbmcgY3JlYXRlcyB0d28gaGFuZGxlcnMKK2hhbmRsZXJzID0gamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIsIGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSByb290IGxvZ2dlcgorLmxldmVsID0gQUxMCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEFMTAoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWwgPSBBTEwKKyAgICAgICAgCisjIFNldCB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorCisjIGRlZmF1bHQgZmlsZSBvdXRwdXQgaXMgaW4gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgoramF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIucGF0dGVybiA9IC4uL2xvZ3MvY2FzX3dvcmtmbG93JWcubG9nCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5saW1pdCA9IDUwMDAwCitqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5jb3VudCA9IDUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmFwcGVuZCA9IHRydWUKK2phdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHN1YnN5c3RlbXMKKworIyBkYXRhIHN0cnVjdHVyZXMgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMubGV2ZWwgPSBJTkZPCisKKyMgZW5naW5lIHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUubGV2ZWwgPSBJTkZPCisKKyMgaW5zdGFuY2UgcmVwb3NpdG9yeSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8ubGV2ZWwgPSBJTkZPCisKKyMgcmVwb3NpdG9yeSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5sZXZlbCA9IElORk8KKworIyBzeXN0ZW0gc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5sZXZlbCA9IEZJTkUKKworIyBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGNvbW1vbnMtaHR0cGNsaWVudCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHhtbHJwYyAKK29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmhlYWRlci5sZXZlbCA9IElORk8KK2h0dHBjbGllbnQud2lyZS5sZXZlbCA9IElORk8KK3N1bi5uZXQubGV2ZWwgPSBPRkYKK3N1bi5uZXQud3d3LmxldmVsID0gT0ZGCisKKyMgc3ByaW5nIGZyYW1ld29yayBsb2dnaW5nCitvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmxldmVsID0gU0VWRVJFCitvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsubGV2ZWwgPSBTRVZFUkUKK29yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5sZXZlbCA9IFNFVkVSRQorb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5Qcm9wZXJ0eVBsYWNlaG9sZGVyQ29uZmlndXJlci5sZXZlbCA9IFNFVkVSRQorb3JnLmFwYWNoZS5vb2R0LmNhcy5jcmF3bC51dGlsLkNhc1Byb3BlcnR5UGxhY2Vob2xkZXJDb25maWd1cmVyLmxldmVsID0gU0VWRVJFCitzdW4ubmV0LmxldmVsID0gU0VWRVJFCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy93b3JrZmxvdy5wcm9wZXJ0aWVzIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvd29ya2Zsb3cucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2IyYTRlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvd29ya2Zsb3cucHJvcGVydGllcwpAQCAtMCwwICsxLDg3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCisjCisjIFByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSBXb3JrZmxvdyBNYW5hZ2VyCisKKyMgd29ya2Zsb3cgcmVwb3NpdG9yeSBmYWN0b3J5Cit3b3JrZmxvdy5yZXBvLmZhY3RvcnkgPSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuWE1MV29ya2Zsb3dSZXBvc2l0b3J5RmFjdG9yeQorCisjIHdvcmtmbG93IGVuZ2luZSBmYWN0b3J5Cit3b3JrZmxvdy5lbmdpbmUuZmFjdG9yeSA9IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLlRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZUZhY3RvcnkKKworIyB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IGZhY3RvcnkKK3dvcmtmbG93LmVuZ2luZS5pbnN0YW5jZVJlcC5mYWN0b3J5ID0gb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5MdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeUZhY3RvcnkKKworIyBlbmdpbmUgcnVubmVyIGZhY3RvcnkKK3dvcmtmbG93LndlbmdpbmUucnVubmVyLmZhY3Rvcnk9b3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucnVubmVyLkFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyRmFjdG9yeQorCisjIHRocmVhZCBwb29sIHdvcmtmbG93IGVuZ2luZSBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5xdWV1ZVNpemU9CitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5tYXhQb29sU2l6ZT0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLm1pblBvb2xTaXplPTYKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnRocmVhZEtlZXBBbGl2ZS5taW51dGVzPTUKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnVubGltaXRlZFF1ZXVlPXRydWUKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByZUNvbmRpdGlvbldhaXRUaW1lPTEwCisKKyMgc2V0IHRoaXMgaWYgeW91IHdhbnQgdGhlIHdvcmtmbG93IG1hbmFnZXIgdG8gc3VibWl0IGpvYnMgdGhyb3VnaCB0aGUgcmVzb3VyY2UgbWdyCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5yZXNvdXJjZW1nci51cmw9CisKKyMgaWYgeW91IHVzZSB0aGUgcmVzb3VyY2UgbWdyIHN1Ym1pc3Npb24sIHlvdSBjYW4gc3BlY2lmeSBob3cgbWFueSBzZWNvbmRzIHRoZSAKKyMgd29ya2Zsb3cgbWFuYWdlciBzaG91bGQgd2FpdCBpbmJldHdlZW4gY2hlY2tpbmcgdG8gc2VlIGlmIGEgam9iIGlzIGNvbXBsZXRlCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5yZXNvdXJjZW1nci5wb2xsaW5nV2FpdFRpbWU9MTAKKworIyB3ZW5naW5lIHByb3BlcnRpZXMKKyMgZGVmaW5lIHdvcmtmbG93IHByaW9yaXRpemVyIGNsYXNzIHRvIHVzZSBmb3Igc29ydGluZyB3b3JrZmxvdyB0YXNrcworb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZW5naW5lLnByaW9yaXRpemVyPW9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5GSUxPUHJpb3JpdHlTb3J0ZXIKKyMgdGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIHRhc2sgcXVlcmllciB3YWl0cyBiZWZvcmUgZGlzcG9zaXRpb25pbmcgcHJvY2Vzc29ycworb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZW5naW5lLnRhc2txdWVyaWVyLndhaXRTZWNvbmRzPTIKKworIyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBhc3luY2hyb25vdXMgZW5naW5lIHJ1bm5lcgorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZW5naW5lLmFzeW5jaHJvbm91cy5ydW5uZXIubnVtLnRocmVhZHM9MjUKKworIyB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IGdlbmVyYWwgcHJvcGVydGllcworIyBkZWZhdWx0IHBhZ2Ugc2l6ZSB0byBwYWdlIHRocm91Z2ggV29ya2Zsb3dJbnN0YW5jZXMgd2l0aAorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5wYWdlU2l6ZT0yMAorCisjIGx1Y2VuZSB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2VSZXAubHVjZW5lLmlkeFBhdGg9L3BhdGgvdG8vaW5kZXgKKworIyBkYXRhIHNvdXJjZSB3b3JrZmxvdyBpbnN0YW5jZSByZXBvc2l0b3J5IHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2VSZXAuZGF0YXNvdXJjZS5qZGJjLnVybD1qZGJjOnVybAorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5kYXRhc291cmNlLmpkYmMudXNlcj11c2VyCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmRhdGFzb3VyY2UuamRiYy5wYXNzPXBhc3MKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdGFuY2VSZXAuZGF0YXNvdXJjZS5qZGJjLmRyaXZlcj15b3VyLmpkYmMuRHJpdmVyCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmRhdGFzb3VyY2UucXVvdGVGaWVsZHM9ZmFsc2UKKworIyBYTUwgd29ya2Zsb3cgcmVwb3NpdG9yeSBwcm9wZXJ0aWVzCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG8uZGlycz1maWxlOi8vL3BhdGgvdG8veW91ci9yZXBvMSwgZmlsZTovLy9wYXRoL3RvL3lvdXIvcmVwbzIKKyMgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBhbmQgc2V0IHRoZSB2YWx1ZSB0byB0cnVlIHRvIHJlY3Vyc2l2ZWx5IHBhcnNlIHJlcG9zaXRvcnkgZGlyZWN0b3JpZXMKKyNvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG8uZGlycy5yZWN1cnNpdmU9ZmFsc2UKKworIyB3ZW5naW5lLXN0eWxlIHBhY2thZ2VkIHdvcmtmbG93IHJlcG8gcHJvcGVydGllcworb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy53ZW5naW5lLnBhY2thZ2VkUmVwby5kaXIucGF0aCA9IC9wYXRoL3RvL3dlbmdpbmUvd29ya2Zsb3cvZmlsZXMKKworIyBkYXRhIHNvdXJjZSB3b3JrZmxvdyByZXBvc2l0b3J5IHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kYXRhc291cmNlLmpkYmMudXJsPWpkYmM6dXJsCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG8uZGF0YXNvdXJjZS5qZGJjLnVzZXI9dXNlcgorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRhdGFzb3VyY2UuamRiYy5wYXNzPXBhc3MKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwby5kYXRhc291cmNlLmpkYmMuZHJpdmVyPXlvdXIuamRiYy5Ecml2ZXIKKworIyBTcHJpbmcgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgYWN0aW9uIHN0b3JlIHByb3BlcnRpZXMKK29yZy5hcGFjaGUub29kdC5jYXMuY2xpLmFjdGlvbi5zcHJpbmcuY29uZmlnPXNyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1hY3Rpb25zLnhtbAorb3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkub3B0aW9uLnNwcmluZy5jb25maWc9c3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLW9wdGlvbnMueG1sCisKKyMgd29ya2Zsb3cgbGlmZWN5Y2xlIE1hbmFnZXIKK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLmZpbGVQYXRoPS9wYXRoL3RvL3dvcmtmbG93LWxpZmVjeWNsZS54bWwKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3dvcmtmbG93LnNxbCBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3dvcmtmbG93LnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc3Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvbWFpbi9yZXNvdXJjZXMvd29ya2Zsb3cuc3FsCkBAIC0wLDAgKzEsODkgQEAKKy0tICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy0tICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy0tICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCistLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy0tICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLS0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLS0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLS0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dzCisod29ya2Zsb3dfaWQgaW50IFBSSU1BUlkgS0VZIE5PVCBOVUxMLAord29ya2Zsb3dfbmFtZSB2YXJjaGFyKDI1NSkpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfY29uZGl0aW9uX21hcAorKHdvcmtmbG93X2lkIGludCBOT1QgTlVMTCwKK3dvcmtmbG93X2NvbmRpdGlvbl9pZCBpbnQgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgZXZlbnRfd29ya2Zsb3dfbWFwCisod29ya2Zsb3dfaWQgaW50IE5PVCBOVUxMLAorZXZlbnRfbmFtZSB2YXJjaGFyKDI1NSkgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfdGFza3MKKyh3b3JrZmxvd190YXNrX2lkIGludCBOT1QgTlVMTCBQUklNQVJZIEtFWSwKK3dvcmtmbG93X3Rhc2tfbmFtZSB2YXJjaGFyKDI1NSksCit3b3JrZmxvd190YXNrX2NsYXNzIHZhcmNoYXIoMjU1KSk7CisKK0NSRUFURSBUQUJMRSB3b3JrZmxvd190YXNrX21hcAorKHdvcmtmbG93X2lkIGludCBOT1QgTlVMTCwKK3dvcmtmbG93X3Rhc2tfaWQgaW50IE5PVCBOVUxMLAordGFza19vcmRlciBpbnQgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfaW5zdGFuY2VzCisod29ya2Zsb3dfaW5zdGFuY2VfaWQgaW50IFBSSU1BUlkgS0VZIE5PVCBOVUxMLAord29ya2Zsb3dfaW5zdGFuY2Vfc3RhdHVzIHZhcmNoYXIoMjU1KSwKK3dvcmtmbG93X2lkIGludCBOT1QgTlVMTCwKK2N1cnJlbnRfdGFza19pZCBpbnQgTk9UIE5VTEwsCitzdGFydF9kYXRlX3RpbWUgdmFyY2hhcigyNTUpLAorZW5kX2RhdGVfdGltZSB2YXJjaGFyKDI1NSksCitjdXJyZW50X3Rhc2tfc3RhcnRfZGF0ZV90aW1lIHZhcmNoYXIoMjU1KSwKK2N1cnJlbnRfdGFza19lbmRfZGF0ZV90aW1lIHZhcmNoYXIoMjU1KSwKK3ByaW9yaXR5IGZsb2F0LAordGltZXNfYmxvY2tlZCBpbnQgREVGQVVMVCAwKTsKKworLS0gdXNlIHRoaXMgZGVmaW5pdGlvbiBpZiB5b3Ugd291bGQgbGlrZQorLS0gdG8gdXNlIHF1b3RlRmllbGRzIChzdHJpbmcgdmVyc2lvbnMgb2YKKy0tIGN1cnJlbnRfdGFza19pZCBhbmQgd29ya2Zsb3dfaWQpCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfaW5zdGFuY2VzCisod29ya2Zsb3dfaW5zdGFuY2VfaWQgaW50IFBSSU1BUlkgS0VZIE5PVCBOVUxMLAord29ya2Zsb3dfaW5zdGFuY2Vfc3RhdHVzIHZhcmNoYXIoMjU1KSwKK3dvcmtmbG93X2lkIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKK2N1cnJlbnRfdGFza19pZCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsCitzdGFydF9kYXRlX3RpbWUgdmFyY2hhcigyNTUpLAorZW5kX2RhdGVfdGltZSB2YXJjaGFyKDI1NSksCitjdXJyZW50X3Rhc2tfc3RhcnRfZGF0ZV90aW1lIHZhcmNoYXIoMjU1KSwKK2N1cnJlbnRfdGFza19lbmRfZGF0ZV90aW1lIHZhcmNoYXIoMjU1KSwKK3ByaW9yaXR5IGZsb2F0KTsKKworQ1JFQVRFIFRBQkxFIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhCisod29ya2Zsb3dfaW5zdGFuY2VfaWQgaW50IE5PVCBOVUxMLAord29ya2Zsb3dfbWV0X2tleSB2YXJjaGFyKDEwMDApIE5PVCBOVUxMLAord29ya2Zsb3dfbWV0X3ZhbCB2YXJjaGFyKDEwMDApIE5PVCBOVUxMKTsKKworQ1JFQVRFIFRBQkxFIHdvcmtmbG93X2NvbmRpdGlvbnMKKyh3b3JrZmxvd19jb25kaXRpb25faWQgaW50IE5PVCBOVUxMIFBSSU1BUlkgS0VZLAord29ya2Zsb3dfY29uZGl0aW9uX25hbWUgdmFyY2hhcigyNTUpIE5PVCBOVUxMLAord29ya2Zsb3dfY29uZGl0aW9uX2NsYXNzIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKK3dvcmtmbG93X2NvbmRpdGlvbl90aW1lb3V0IGludCwKK3dvcmtmbG93X29wdGlvbmFsIGJvb2xlYW4gREVGQVVMVCBmYWxzZSk7CisKK0NSRUFURSBUQUJMRSAgdGFza19jb25kaXRpb25fbWFwCisod29ya2Zsb3dfdGFza19pZCBpbnQgTk9UIE5VTEwsIAord29ya2Zsb3dfY29uZGl0aW9uX2lkIGludCBOT1QgTlVMTAorY29uZGl0aW9uX29yZGVyIGludCBOT1QgTlVMTCk7CisKK0NSRUFURSBUQUJMRSB3b3JrZmxvd190YXNrX2NvbmZpZ3VyYXRpb24KKyh3b3JrZmxvd190YXNrX2lkIGludCBOT1QgTlVMTCwKK3Byb3BlcnR5X25hbWUgdmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKK3Byb3BlcnR5X3ZhbHVlIHZhcmNoYXIoMTAwMCkgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfY29uZGl0aW9uX2NvbmZpZ3VyYXRpb24KKyh3b3JrZmxvd19jb25kaXRpb25faWQgaW50IE5PVCBOVUxMLAorcHJvcGVydHlfbmFtZSB2YXJjaGFyKDEwMDApIE5PVCBOVUxMLAorcHJvcGVydHlfdmFsdWUgdmFyY2hhcigxMDAwKSBOT1QgTlVMTCk7CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy93b3JrZmxvd19vcmFjbGVfY3JlYXRlX3NlcXVlbmNlcy5zcWwgYi8wLjEwL3dvcmtmbG93L3NyYy9tYWluL3Jlc291cmNlcy93b3JrZmxvd19vcmFjbGVfY3JlYXRlX3NlcXVlbmNlcy5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ODViYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL21haW4vcmVzb3VyY2VzL3dvcmtmbG93X29yYWNsZV9jcmVhdGVfc2VxdWVuY2VzLnNxbApAQCAtMCwwICsxLDY0IEBACisvKgorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2NyZWF0ZSBzZXF1ZW5jZSB3b3JrZmxvd3Nfc2VxCitzdGFydCB3aXRoIDEKK2luY3JlbWVudCBieSAxCitub21heHZhbHVlOworCitjcmVhdGUgdHJpZ2dlciB3b3JrZmxvd3NfdHJpZ2dlcgorYmVmb3JlIGluc2VydCBvbiB3b3JrZmxvd3MKK2ZvciBlYWNoIHJvdworYmVnaW4KK3NlbGVjdCB3b3JrZmxvd3Nfc2VxLm5leHR2YWwgaW50byA6bmV3LndvcmtmbG93X2lkIGZyb20gZHVhbDsKK2VuZDsKKworY3JlYXRlIHNlcXVlbmNlIHdvcmtmbG93X3Rhc2tzX3NlcQorc3RhcnQgd2l0aCAxCitpbmNyZW1lbnQgYnkgMQorbm9tYXh2YWx1ZTsKKworY3JlYXRlIHRyaWdnZXIgd29ya2Zsb3dfdGFza3NfdHJpZ2dlcgorYmVmb3JlIGluc2VydCBvbiB3b3JrZmxvd190YXNrcworZm9yIGVhY2ggcm93CitiZWdpbgorc2VsZWN0IHdvcmtmbG93X3Rhc2tzX3NlcS5uZXh0dmFsIGludG8gOm5ldy53b3JrZmxvd190YXNrX2lkIGZyb20gZHVhbDsKK2VuZDsKKworY3JlYXRlIHNlcXVlbmNlIHdvcmtmbG93X2luc3RhbmNlc19zZXEKK3N0YXJ0IHdpdGggMQoraW5jcmVtZW50IGJ5IDEKK25vbWF4dmFsdWU7CisKK2NyZWF0ZSB0cmlnZ2VyIHdvcmtmbG93X2luc3RhbmNlc190cmlnZ2VyCitiZWZvcmUgaW5zZXJ0IG9uIHdvcmtmbG93X2luc3RhbmNlcworZm9yIGVhY2ggcm93CitiZWdpbgorc2VsZWN0IHdvcmtmbG93X2luc3RhbmNlc19zZXEubmV4dHZhbCBpbnRvIDpuZXcud29ya2Zsb3dfaW5zdGFuY2VfaWQgZnJvbSBkdWFsOworZW5kOworCitjcmVhdGUgc2VxdWVuY2Ugd29ya2Zsb3dfY29uZGl0aW9uc19zZXEKK3N0YXJ0IHdpdGggMQoraW5jcmVtZW50IGJ5IDEKK25vbWF4dmFsdWU7CisKK2NyZWF0ZSB0cmlnZ2VyIHdvcmtmbG93X2NvbmRpdGlvbnNfdHJpZ2dlcgorYmVmb3JlIGluc2VydCBvbiB3b3JrZmxvd19jb25kaXRpb25zCitmb3IgZWFjaCByb3cKK2JlZ2luCitzZWxlY3Qgd29ya2Zsb3dfY29uZGl0aW9uc19zZXEubmV4dHZhbCBpbnRvIDpuZXcud29ya2Zsb3dfY29uZGl0aW9uX2lkIGZyb20gZHVhbDsKK2VuZDsKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2Nzcy9ndWlkZXMuY3NzIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvY3NzL2d1aWRlcy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0YWY3MgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2Nzcy9ndWlkZXMuY3NzCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLmluZm8sIC5zdWNjZXNzLCAud2FybmluZywgLmVycm9yLCAudmFsaWRhdGlvbiB7Citib3JkZXI6IDFweCBzb2xpZDsKK21hcmdpbjogMTBweCAwcHg7CitwYWRkaW5nOjE1cHggMTBweCAxNXB4IDUwcHg7CitiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCBjZW50ZXI7Cit9CisuaW5mbyB7Citjb2xvcjogIzAwNTI5QjsKK2JhY2tncm91bmQtY29sb3I6ICNCREU1Rjg7CitiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9pbmZvLnBuZycpOworfQorLnN1Y2Nlc3MgeworY29sb3I6ICM0RjhBMTA7CitiYWNrZ3JvdW5kLWNvbG9yOiAjREZGMkJGOworYmFja2dyb3VuZC1pbWFnZTp1cmwoJy4uL2ltYWdlcy9zdWNjZXNzLnBuZycpOworfQorLndhcm5pbmcgeworY29sb3I6ICM5RjYwMDA7CitiYWNrZ3JvdW5kLWNvbG9yOiAjRkVFRkIzOworYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvd2FybmluZy5wbmcnKTsKK30KKy5lcnJvciB7Citjb2xvcjogI0Q4MDAwQzsKK2JhY2tncm91bmQtY29sb3I6ICNGRkJBQkE7CitiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy9lcnJvci5wbmcnKTsKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtd29ya2Zsb3cuanBnIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy13b3JrZmxvdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZDI5ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtd29ya2Zsb3cuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtd29ya2Zsb3cucHNkIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2Nhcy13b3JrZmxvdy5wc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljYTIwMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jYXMtd29ya2Zsb3cucHNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9lcnJvci5wbmcgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZXJyb3IucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjY0MjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZXJyb3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9pbmZvLnBuZyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9pbmZvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU0Njg3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2luZm8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9zdWNjZXNzLnBuZyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9zdWNjZXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA3NGM2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3N1Y2Nlc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93YXJuaW5nLnBuZyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93YXJuaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgzNGIwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dhcm5pbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93bV9leHRlbnNpb25fcG9pbnRzLnBuZyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93bV9leHRlbnNpb25fcG9pbnRzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjhhYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dtX2V4dGVuc2lvbl9wb2ludHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93bV9vYmplY3RfbW9kZWwucG5nIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dtX29iamVjdF9tb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyNDQ2ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93bV9vYmplY3RfbW9kZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93bV91c2VfY2FzZTEuanBnIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3dtX3VzZV9jYXNlMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NTVjMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy93bV91c2VfY2FzZTEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUvc2l0ZS54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzYwZDUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iY2FzLXdvcmtmbG93Ij4KKworICA8Ym9keT4KKyAgICA8bGlua3M+CisgICAgICA8aXRlbSBuYW1lPSJPT0RUIiBocmVmPSIuLi9vb2R0LXNpdGUvIi8+CisgICAgPC9saW5rcz4KKworICAgIDxtZW51IHJlZj0icmVwb3J0cyIgaW5oZXJpdD0iYm90dG9tIi8+CisgICAgPG1lbnUgbmFtZT0iU29mdHdhcmUgRG9jdW1lbnRhdGlvbiI+CisgICAgICA8aXRlbSBuYW1lPSJEZXZlbG9wZXIgR3VpZGUiIGhyZWY9ImRldmVsb3BtZW50L2RldmVsb3Blci5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJCYXNpYyBVc2VyIEd1aWRlIiBocmVmPSJ1c2VyL2Jhc2ljLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IkFkdmFuY2VkIFVzZXIgR3VpZGUiIGhyZWY9InVzZXIvYWR2YW5jZWQuaHRtbCIvPgorICAgIDwvbWVudT4KKyAgPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L2RldmVsb3Blci54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3hkb2MvZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUyZDFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L2RldmVsb3Blci54bWwKQEAgLTAsMCArMSwzMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAgPHByb3BlcnRpZXM+CisgICAgICA8dGl0bGU+Q0FTIEZpbGUgTWFuYWdlciBEZXZlbG9wZXIgR3VpZGU8L3RpdGxlPgorICAgICAgPGF1dGhvciBlbWFpbD0iQ2hyaXMuTWF0dG1hbm5AanBsLm5hc2EuZ292Ij5DaHJpcyBNYXR0bWFubjwvYXV0aG9yPgorICAgICAgPGF1dGhvciBlbWFpbD0id29vbGxhcmRAanBsLm5hc2EuZ292Ij5EYXZlIFdvb2xsYXJkPC9hdXRob3I+CisgICA8L3Byb3BlcnRpZXM+CisKKyAgIDxib2R5PgorICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgICA8cD4KKyAgICAgICAgICBUaGlzIGlzIHRoZSBkZXZlbG9wZXIgZ3VpZGUgZm9yIHRoZSBPT0RUIENhdGFsb2cgYW5kIEFyY2hpdmUgU2VydmljZSAoQ0FTKSAKKyAgICAgICAgICBXb3JrZmxvdyBNYW5hZ2VyIGNvbXBvbmVudCwgb3IgV29ya2Zsb3cgTWFuYWdlciBmb3Igc2hvcnQuIFByaW1hcmlseSwgdGhpcyBndWlkZSAKKyAgICAgICAgICB3aWxsIGV4cGxhaW4gdGhlIFdvcmtmbG93IE1hbmFnZXIgYXJjaGl0ZWN0dXJlIGFuZCBpbnRlcmZhY2VzLCBpbmNsdWRpbmcgaXRzIAorICAgICAgICAgIHRhaWxvcmFibGUgZXh0ZW5zaW9uIHBvaW50cy4gRm9yIGluZm9ybWF0aW9uIG9uIGluc3RhbGxhdGlvbiwgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICBhbmQgZXhhbXBsZXMsIHBsZWFzZSBzZWUgb3VyIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+VXNlciBHdWlkZXMuPC9hPgorICAgICAgICAgIAorICAgICAgICAgIDxwPlRoZSByZW1haW5kZXIgb2YgdGhpcyBndWlkZSBpcyBzZXBhcmF0ZWQgaW50byB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjwvcD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMSI+UHJvamVjdCBEZXNjcmlwdGlvbjwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24yIj5BcmNoaXRlY3R1cmU8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMyI+RXh0ZW5zaW9uIFBvaW50czwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb240Ij5DdXJyZW50IEV4dGVuc2lvbiBQb2ludCBJbXBsZW1lbnRhdGlvbnM8L2E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgICAgICAgCisgICAgICAgIDwvcD4gICAgIAorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMSIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iUHJvamVjdCBEZXNjcmlwdGlvbiI+CisgICAgICA8cD5UaGUgV29ya2Zsb3cgTWFuYWdlciBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgZm9yIGRlc2NyaXB0aW9uLCBleGVjdXRpb24sIGFuZCAKKyAgICAgIG1vbml0b3Jpbmcgb2YgPGk+V29ya2Zsb3dzPC9pPiwgdXNpbmcgYSBjbGllbnQsIGFuZCBhIHNlcnZlciBzeXN0ZW0uIFdvcmtmbG93cyBhcmUgCisgICAgICB0eXBpY2FsbHkgY29uc2lkZXJlZCB0byBiZSBzZXF1ZW5jZXMgb2YgdGFza3MsIGpvaW5lZCB0b2dldGhlciBieSBjb250cm9sIGZsb3csIGFuZCAKKyAgICAgIGRhdGEgZmxvdywgdGhhdCBtdXN0IGV4ZWN1dGUgaW4gc29tZSBvcmRlcmVkIGZhc2hpb24uIFdvcmtmbG93cyB0eXBpY2FsbHkgZ2VuZXJhdGUgCisgICAgICBvdXRwdXQgZGF0YSwgcGVyZm9ybSByb3V0aW5lIG1hbmFnZW1lbnQgdGFza3MgKHN1Y2ggYXMgZW1haWwsIGV0Yy4pLCBvciBkZXNjcmliZSBhIAorICAgICAgYnVzaW5lc3MncyBpbnRlcm5hbCByb3V0aW5lIHByYWN0aWNlcy4gVGhlIFdvcmtmbG93IE1hbmFnZXIgaXMgYW4gZXh0ZW5zaWJsZSAKKyAgICAgIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzIGFuIFhNTC1SUEMgZXh0ZXJuYWwgaW50ZXJmYWNlLCBhbmQgYSBmdWxseSAKKyAgICAgIHRhaWxvcmFibGUgSmF2YS1iYXNlZCBBUEkgZm9yIHdvcmtmbG93IG1hbmFnZW1lbnQuPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iQXJjaGl0ZWN0dXJlIj4KKyAgICAgIAorICAgICAgPHA+SW4gdGhpcyBzZWN0aW9uLCB3ZSB3aWxsIGRlc2NyaWJlIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIFdvcmtmbG93IE1hbmFnZXIsCisgICAgICBpbmNsdWRpbmcgaXRzIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMsIG9iamVjdCBtb2RlbCwgYW5kIGtleSBjYXBhYmlsaXRpZXMuPC9wPgorICAgICAgCisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbXBvbmVudHMiPgorICAgICAgICAKKyAgICAgICAgPHA+VGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIFdvcmtmbG93IE1hbmFnZXIgYXJlIHRoZSBDbGllbnQgYW5kIFNlcnZlciwgdGhlIAorICAgICAgICBXb3JrZmxvdyBSZXBvc2l0b3J5LCB0aGUgV29ya2Zsb3cgRW5naW5lLGFuZCB0aGUgV29ya2Zsb3cgSW5zdGFuY2UgUmVwb3NpdG9yeS4KKyAgICAgICAgVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFsbCBvZiB0aGVzZSBjb21wb25lbnRzIGFyZSBzaG93biBpbiB0aGUgZGlhZ3JhbSAKKyAgICAgICAgYmVsb3c6PC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy93bV9leHRlbnNpb25fcG9pbnRzLnBuZyIgYWx0PSJXb3JrZmxvdyBNYW5hZ2VyIEFyY2hpdGVjdHVyZSIvPjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPlRoZSBXb3JrZmxvdyBNYW5hZ2VyIFNlcnZlciBjb250YWlucyBib3RoIGEgV29ya2Zsb3cgUmVwb3NpdG9yeSB0aGF0IG1hbmFnZXMgCisgICAgICAgIHdvcmtmbG93IG1vZGVscywgYW5kIFdvcmtmbG93IEVuZ2luZSB0aGF0IHByb2Nlc3NlcyB3b3JrZmxvdyBpbnN0YW5jZXMuIFRoZSBXb3JrZmxvdworICAgICAgICBFbmdpbmUgYWxzbyBoYXMgYSBwZXJzaXN0ZW5jZSBsYXllciBjYWxsZWQgYSBXb3JrZmxvdyBJbnN0YW5jZSBSZXBvc2l0b3J5IHRoYXQgaXMKKyAgICAgICAgcmVzcG9uc2libGUgZm9yIHNhdmluZyB3b3JrZmxvdyBpbnN0YW5jZSBtZXRhZGF0YSBhbmQgc3RhdGUuPC9wPiAKKyAgICAgICAgCisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgICAgCisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik9iamVjdCBNb2RlbCI+CisgICAgICAgIDxwPlRoZSBjcml0aWNhbCBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIFdvcmtmbG93IE1hbmFnZXIgaW5jbHVkZTo8L3A+CisgICAgICAgIAorICAgICAgICA8dWw+CisgICAgICAgICA8bGk+PHN0cm9uZz5FdmVudHM8L3N0cm9uZz4gLSBhcmUgd2hhdCB0cmlnZ2VyIFdvcmtmbG93cyB0byBiZSBleGVjdXRlZC4gRXZlbnRzIAorICAgICAgICAgYXJlIG5hbWVkLCBhbmQgY29udGFpbiBkeW5hbWljIE1ldGFkYXRhIGluZm9ybWF0aW9uLCBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+TWV0YWRhdGE8L3N0cm9uZz4gLSBhIGR5bmFtaWMgc2V0IG9mIHByb3BlcnRpZXMsIGFuZCB2YWx1ZXMsIHByb3ZpZGVkIAorICAgICAgICAgdG8gYSBXb3JrZmxvd0luc3RhbmNlIHZpYSBhIHVzZXItdHJpZ2dlcmVkIEV2ZW50LjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT48c3Ryb25nPldvcmtmbG93PC9zdHJvbmc+IC0gYSBkZXNjcmlwdGlvbiBvZiBib3RoIHRoZSBjb250cm9sIGZsb3csIGFuZCBkYXRhIAorICAgICAgICAgZmxvdyBvZiBhIHNlcXVlbmNlIG9mIHRhc2tzIChvciA8aT5zdGFnZXM8L2k+IHRoYXQgbXVzdCBiZSBleGVjdXRlZCBpbiBzb21lIG9yZGVyLgorICAgICAgICAgPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+V29ya2Zsb3cgSW5zdGFuY2U8L3N0cm9uZz4gLSBhbiBpbnN0YW5jZSBvZiBhIFdvcmtmbG93LCB0eXBpY2FsbHkgCisgICAgICAgICBjb250YWluaW5nIGFkZGl0aW9uYWwgcnVudGltZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBzdGFydCB0aW1lLCBlbmQgCisgICAgICAgICB0aW1lLCB0YXNrIHdhbGwgY2xvY2sgdGltZSwgZXRjLiBBIFdvcmtmbG93SW5zdGFuY2UgYWxzbyBjb250YWlucyBhIHNoYXJlZCBNZXRhZGF0YSAKKyAgICAgICAgIGNvbnRleHQsIHBhc3NlZCBpbiBieSB0aGUgdXNlciB3aG8gdHJpZ2dlcmVkIHRoZSBXb3JrZmxvdy4gVGhpcyBjb250ZXh0IGNhbiBiZSAKKyAgICAgICAgIHJlYWQvd3JpdHRlbiB0byBieSB0aGUgdW5kZXJseWluZyBXb3JrZmxvd1Rhc2tzLCBwcmVzZW50IGluIGEgV29ya2Zsb3cuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+V29ya2Zsb3cgVGFza3M8L3N0cm9uZz4gLSBkZXNjcmlwdGlvbnMgb2YgZGF0YSBmbG93LCBhbmQgYW4gdW5kZXJseWluZyAKKyAgICAgICAgIHByb2Nlc3MsIG9yIHN0YWdlLCB0aGF0IGlzIHBhcnQgb2YgYSBXb3JrZmxvdy48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5Xb3JrZmxvdyBUYXNrIEluc3RhbmNlczwvc3Ryb25nPiAtIHRoZSBhY3R1YWwgZXhlY3V0aW5nIGNvZGUsIG9yIAorICAgICAgICAgcHJvY2VzcywgdGhhdCBwZXJmb3JtcyB0aGUgd29yayBpbiB0aGUgV29ya2Zsb3cgVGFzay48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5Xb3JrZmxvdyBUYXNrIENvbmZpZ3VyYXRpb248L3N0cm9uZz4gLSBzdGF0aWMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLCAKKyAgICAgICAgIHRoYXQgPGk+Y29uZmlndXJlPC9pPiBhIFdvcmtmbG93VGFzay48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5Xb3JrZmxvdyBDb25kaXRpb25zPC9zdHJvbmc+IC0gYW55IHByZSAob3IgcG9zdCkgY29uZGl0aW9ucyBvbiB0aGUgCisgICAgICAgICBleGVjdXRpb24gb2YgYSBXb3JrZmxvd1Rhc2suPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPjxzdHJvbmc+V29ya2Zsb3cgQ29uZGl0aW9uIEluc3RhbmNlczwvc3Ryb25nPiAtIHRoZSBhY3R1YWwgZXhlY3V0aW5nIGNvZGUsIAorICAgICAgICAgb3IgcHJvY2VzcywgdGhhdCBwZXJmb3JtcyB0aGUgd29yayBpbiB0aGUgV29ya2Zsb3cgQ29uZGl0aW9uLjwvbGk+CisgICAgICAgIDwvdWw+CisKKyAgICAgICAgPHA+RWFjaCBFdmVudCBraWNrcyBvZmYgMSBvciBtb3JlIFdvcmtmbG93IEluc3RhbmNlcywgcHJvdmlkaW5nIGEgTWV0YWRhdGEgY29udGV4dCAKKyAgICAgICAgKHN1Ym1pdHRlZCBieSBhbiBleHRlcm5hbCB1c2VyKS4gRWFjaCBXb3JrZmxvdyBJbnN0YW5jZSBpcyBhIHJ1bi10aW1lIGV4ZWN1dGlvbiBtb2RlbCAKKyAgICAgICAgb2YgYSBXb3JrZmxvdy4gRWFjaCBXb3JrZmxvdyBjb250YWlucyAxIG9yIG1vcmUgV29ya2Zsb3cgVGFza3MuIEVhY2ggV29ya2Zsb3cgVGFzayAKKyAgICAgICAgY29udGFpbnMgYSBzaW5nbGUgV29ya2Zsb3cgVGFzayBDb25maWd1cmF0aW9uLCBhbmQgb25lIG9yIG1vcmUgV29ya2Zsb3cgQ29uZGl0aW9ucy4gCisgICAgICAgIEVhY2ggV29ya2Zsb3cgVGFzayBoYXMgYSBjb3JyZXNwb25kaW5nIFdvcmtmbG93IFRhc2sgSW5zdGFuY2UgKHRoYXQgaXQgbW9kZWxzKSwgCisgICAgICAgIGFzIGRvZXMgZWFjaCBXb3JrZmxvdyBDb25kaXRpb24gaGF2ZSBhIGNvcnJlc3BvbmRpbmcgV29ya2Zsb3cgQ29uZGl0aW9uIEluc3RhbmNlLiAKKyAgICAgICAgVGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgc2hvd24gaW4gdGhlIGJlbG93IGZpZ3VyZS48L3A+CisgICAgICAgIAorICAgICAgICA8cD48aW1nIHNyYz0iLi4vaW1hZ2VzL3dtX29iamVjdF9tb2RlbC5wbmciIGFsdD0iV29ya2Zsb3cgTWFuYWdlciBPYmplY3QgTW9kZWwiLz48L3A+CisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIAorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJLZXkgQ2FwYWJpbGl0aWVzIj4KKyAgICAgICAgPHA+VGhlIFdvcmtmbG93IE1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgbmVjZXNzYXJ5IGtleSBjYXBhYmlsaXRpZXMgCisgICAgICAgIGZvciBtYW5hZ2luZyBwcm9jZXNzaW5nIHBpcGVsaW5lcywgZGF0YSBmbG93LCBhbmQgY29udHJvbCBmbG93LiBFYWNoIGhpZ2ggbGV2ZWwgCisgICAgICAgIGNhcGFiaWxpdHkgcHJvdmlkZWQgYnkgdGhlIFdvcmtmbG93IE1hbmFnZXIgaXMgZGV0YWlsZWQgYmVsb3c6PC9wPgorICAgICAgICAKKwkJPHA+PHN0cm9uZz5FeHBsaWNpdCBNb2RlbGluZy48L3N0cm9uZz4gVGhlIFdvcmtmbG93IG1hbmFnZXIgY2FwdHVyZXMgYm90aAorICAgICAgICBpZGVudGlmaWVkIHdvcmtmbG93IHBhdHRlcm5zIChjb250cm9sLWZsb3cpIGFuZCBkYXRhLWZsb3cgYmV0d2VlbiBXb3JrZmxvdyBUYXNrIAorICAgICAgICBJbnN0YW5jZXMuIFdvcmtmbG93cyBhcmUgZGlyZWN0ZWQgZ3JhcGhzLCBhbGxvd2luZyBmb3IgdHJ1ZSBwYXJhbGxlbGlzbS48L3A+CisgICAgICAgICAgCisgICAgICAgIDxwPjxzdHJvbmc+UGVyc2lzdGVuY2UuPC9zdHJvbmc+IFN1cHBvcnQgZm9yIHBlcnNpc3RhbmNlIG9mIFdvcmtmbG93IEluc3RhbmNlcyAKKyAgICAgICAgdG8gc2V2ZXJhbCBiYWNrZW5kIHJlcG9zaXRvcmllcywgaW5jbHVkaW5nIHJlbGF0aW9uYWwgZGF0YWJhc2VzLCBhbmQgQXBhY2hlIAorICAgICAgICA8YSBocmVmPSJodHRwOi8vbHVjZW5lLmFwYWNoZS5vcmciPkx1Y2VuZTwvYT4gZmxhdCBmaWxlIGluZGljZXMuPC9wPgorICAgICAgICAgIAorICAgICAgICA8cD48c3Ryb25nPlN0YW5kYXJkIFJlcHJlc2VudGF0aW9ucy48L3N0cm9uZz4gVGhlIFdvcmtmbG93IE1hbmFnZXIgcmVwcmVzZW50cyAKKyAgICAgICAgV29ya2Zsb3cgbW9kZWxzIGFzIFhNTCBkb2N1bWVudHMuPC9wPgorICAgICAgICAgIAorICAgICAgICA8cD48c3Ryb25nPlNjYWxhYmlsaXR5Ljwvc3Ryb25nPiBUaGUgV29ya2Zsb3cgTWFuYWdlciB1c2VzIHRoZSBwb3B1bGFyIAorICAgICAgICBjbGllbnQtc2VydmVyIHBhcmFkaWdtLCBhbGxvd2luZyBuZXcgV29ya2Zsb3cgTWFuYWdlciBzZXJ2ZXJzIHRvIGJlIAorICAgICAgICBpbnN0YW50aWF0ZWQsIGFzIG5lZWRlZCwgd2l0aG91dCBhZmZlY3RpbmcgdGhlIFdvcmtmbG93IE1hbmFnZXIgY2xpZW50cywgCisgICAgICAgIGFuZCB2aWNlLXZlcnNhLjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5TdGFuZGFyZCBjb21tdW5pY2F0aW9uIHByb3RvY29scy48L3N0cm9uZz4gVGhlIFdvcmtmbG93IE1hbmFnZXIgdXNlcyAKKyAgICAgICAgWE1MLVJQQyBhcyBpdHMgbWFpbiBleHRlcm5hbCBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgRmlsZSBNYW5hZ2VyIGNsaWVudCBhbmQgCisgICAgICAgIHNlcnZlci4gWE1MLVJQQywgdGhlIGxpdHRsZSBicm90aGVyIG9mIFNPQVAsIGlzIGZhc3QsIGV4dGVuc2libGUsIGFuZCB1c2VzIAorICAgICAgICB0aGUgdW5kZXJseWluZyBIVFRQIHByb3RvY29sIGZvciBkYXRhIHRyYW5zZmVyLjwvcD4KKyAgICAgICAgICAKKyAgICAgICAgPHA+PHN0cm9uZz5FdmVudC1Ecml2ZW4gRXhlY3V0aW9uLjwvc3Ryb25nPiBXb3JrZmxvd3MgYXJlIHRyaWdnZXJlZCBieSBldmVudHMgCisgICAgICAgIHRoYXQgY2FuIGluY2x1ZGUgYXJiaXRyYXJ5IE1ldGFkYXRhIHBhcmFtZXRlcnMsIHByb3ZpZGVkIGFzIGEgc2hhcmVkIGNvbnRleHQKKyAgICAgICAgYmV0d2VlbiBzdGFnZXMgb2YgdGhlIGV4ZWN1dGluZyBXb3JrZmxvdy48L3A+CisgICAgICAgICAgCisgICAgICAgIDxwPlRoaXMgY2FwYWJpbGl0eSBzZXQgaXMgbm90IGV4aGF1c3RpdmUsIGFuZCBpcyBtZWFudCB0byBnaXZlIHRoZSB1c2VyIGEgCisgICAgICAgIDxpPmZlZWw8L2k+IGZvciB3aGF0IGdlbmVyYWwgZmVhdHVyZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBXb3JrZmxvdyBNYW5hZ2VyLiAKKyAgICAgICAgTW9zdCBsaWtlbHkgdGhlIHVzZXIgd2lsbCBmaW5kIHRoYXQgdGhlIFdvcmtmbG93IE1hbmFnZXIgcHJvdmlkZXMgbWFueSBvdGhlciAKKyAgICAgICAgY2FwYWJpbGl0aWVzIGJlc2lkZXMgdGhvc2UgZGVzY3JpYmVkIGhlcmUuPC9wPgorICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAKKyAgICAgIDwvc2VjdGlvbj4KKyAgICAgIAorICAgICAgPGEgbmFtZT0ic2VjdGlvbjMiLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IkV4dGVuc2lvbiBQb2ludHMiPgorICAgICAgCisgICAgICAgIDxwPldlIGhhdmUgY29uc3RydWN0ZWQgdGhlIFdvcmtmbG93IE1hbmFnZXIgbWFraW5nIHVzZSBvZiB0aGUgPGk+ZmFjdG9yeSAKKyAgICAgICAgbWV0aG9kIHBhdHRlcm48L2k+IHRvIHByb3ZpZGUgbXVsdGlwbGUgZXh0ZW5zaW9uIHBvaW50cyBmb3IgdGhlIFdvcmtmbG93IAorICAgICAgICBNYW5hZ2VyLiBBbiBleHRlbnNpb24gcG9pbnQgaXMgYW4gaW50ZXJmYWNlIHdpdGhpbiB0aGUgV29ya2Zsb3cgTWFuYWdlciAKKyAgICAgICAgdGhhdCBjYW4gaGF2ZSBtYW55IGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gaXQgCisgICAgICAgIGNvbWVzIHRvIHNvZnR3YXJlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGJlY2F1c2UgaXQgYWxsb3dzIGRpZmZlcmVudCAKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIG9mIGFuIGV4aXN0aW5nIGludGVyZmFjZSB0byBiZSBzZWxlY3RlZCBhdCBkZXBsb3ltZW50IAorICAgICAgICB0aW1lLjwvcD4gCisgICAgICAgICAgCisgICAgICAgIDxkaXYgY2xhc3M9ImluZm8iPlRoZSBmYWN0b3J5IG1ldGhvZCBwYXR0ZXJuIGlzIGEgY3JlYXRpb25hbCBwYXR0ZXJuIGNvbW1vbiB0bworICAgICAgICBvYmplY3Qgb3JpZW50ZWQgZGVzaWduLiBFYWNoIEZpbGUgTWFuYWdlciBleHRlbnNpb24gcG9pbnQgaW52b2x2ZXMgdGhlIAorICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0d28gaW50ZXJmYWNlczogYW4gPGk+ZXh0ZW5zaW9uIGZhY3Rvcnk8L2k+IGFuZCBhbiAKKyAgICAgICAgPGk+ZXh0ZW5zaW9uPC9pPiBpbXBsZW1lbnRhdGlvbi4gQXQgcnVuLXRpbWUsIHRoZSBGaWxlIE1hbmFnZXIgbG9hZHMgYSAKKyAgICAgICAgcHJvcGVydGllcyBmaWxlIHNwZWNpZmllcyBhIGZhY3RvcnkgY2xhc3MgdG8gdXNlIGR1cmluZyBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgaW5zdGFudGlhdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBGaWxlIE1hbmFnZXIgbWF5IGNvbW11bmljYXRlIHdpdGggYSAKKyAgICAgICAgZGF0YWJhc2UtYmFzZWQgQ2F0YWxvZyBhbmQgYW4gWE1MLWJhc2VkIEVsZW1lbnQgU3RvcmUgKGNhbGxlZCBhIFZhbGlkYXRpb24gCisgICAgICAgIExheWVyKSwgb3IgaXQgbWF5IHVzZSBhIEx1Y2VuZS1iYXNlZCBDYXRhbG9nIGFuZCBhIGRhdGFiYXNlLWJhc2VkIFZhbGlkYXRpb24gCisgICAgICAgIExheWVyLjwvZGl2PiAKKyAgICAgICAgICAKKyAgICAgICAgPHA+VXNpbmcgZXh0ZW5zaW9uIHBvaW50cywgaXQgaXMgZmFpcmx5IHNpbXBsZSB0byBzdXBwb3J0IG1hbnkgZGlmZmVyZW50IHR5cGVzIAorICAgICAgICBvZiB3aGF0IGFyZSB0eXBpY2FsbHkgcmVmZXJyZWQgdG8gYXMgInBsdWctaW4gYXJjaGl0ZWN0dXJlcy4iIEVhY2ggb2YgdGhlIGNvcmUgCisgICAgICAgIGV4dGVuc2lvbiBwb2ludHMgZm9yIHRoZSBXb3JrZmxvdyBNYW5hZ2VyIGlzIGRlc2NyaWJlZCBiZWxvdzo8L3A+CisgICAgICAgCisgICAgICAgPHRhYmxlPgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+V29ya2Zsb3cgSW5zdGFuY2UgUmVwb3NpdG9yeTwvdGQ+CisgICAgICAgICAgIDx0ZD5UaGUgV29ya2Zsb3cgSW5zdGFuY2UgUmVwb3NpdG9yeSBleHRlbnNpb24gcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIAorICAgICAgICAgICBzdG9yaW5nIGFsbCB0aGUgaW5zdGFuY2UgZGF0YSBmb3IgV29ya2Zsb3cgSW5zdGFuY2VzLCBpbmNsdWRpbmcgc2hhcmVkIAorICAgICAgICAgICBjb250ZXh0IG1ldGFkYXRhLCBydW50aW1lIHByb3BlcnRpZXMgc3VjaCBhcyBzdGFydCBkYXRlIHRpbWUsIGVuZCBkYXRlIHRpbWUsIAorICAgICAgICAgICBhbmQgdGFzayBzdGFydC9lbmQgZGF0ZSB0aW1lLgorICAgICAgICAgICA8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPldvcmtmbG93IFJlcG9zaXRvcnk8L3RkPgorICAgICAgICAgICA8dGQ+VGhlIFdvcmtmbG93IFJlcG9zaXRvcnkgZXh0ZW5zaW9uIHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyAKKyAgICAgICAgICAgV29ya2Zsb3cgbW9kZWxzLCBzdG9yaW5nIGNvbnRyb2wgZmxvdywgYW5kIFdvcmtmbG93IFRhc2tzLCB3aGljaCBtb2RlbCBkYXRhIAorICAgICAgICAgICBmbG93LiBUaGUgV29ya2Zsb3cgUmVwb3NpdG9yeSBhbHNvIHN0b3JlcyBXb3JrZmxvdyBDb25kaXRpb24gaW5mb3JtYXRpb24sIGFuZCAKKyAgICAgICAgICAgV29ya2Zsb3cgVGFzayBDb25maWd1cmF0aW9uLiBJbiBlc3NlbmNlLCB0aGUgV29ya2Zsb3cgUmVwb3NpdG9yeSBpcyBhIHJlcG9zaXRvcnkgCisgICAgICAgICAgIG9mIGFic3RyYWN0IFdvcmtmbG93IG1vZGVscywgdGhhdCBnZXQgdHVybmVkIGludG8gV29ya2Zsb3cgSW5zdGFuY2VzIGJ5IHRoZSAKKyAgICAgICAgICAgPGNvZGU+RW5naW5lPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCisgICAgICAgICAgIDwvdGQ+CisgICAgICAgICA8L3RyPgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+V29ya2Zsb3cgRW5naW5lPC90ZD4KKyAgICAgICAgICAgPHRkPlRoZSBXb3JrZmxvdyBFbmdpbmUncyByZXNwb25zaWJpbGl0eSBpcyB0byB0dXJuIGFic3RyYWN0IFdvcmtmbG93IG1vZGVscyAKKyAgICAgICAgICAgaW50byBleGVjdXRpbmcgV29ya2Zsb3cgSW5zdGFuY2VzLiBUaGUgV29ya2Zsb3cgRW5naW5lIHRyYWNrcyBhbmQgbW9uaXRvcnMgCisgICAgICAgICAgIGV4ZWN1dGlvbiBvZiBXb3JrZmxvdyBJbnN0YW5jZXMsIGFuZCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBzdGFydCwgc3RvcAorICAgICAgICAgICBhbmQgcGF1c2UgZXhlY3V0aW5nIFdvcmtmbG93IEluc3RhbmNlcy4gCisgICAgICAgICAgIDwvdGQ+CisgICAgICAgICA8L3RyPgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+U3lzdGVtPC90ZD4KKyAgICAgICAgICAgPHRkPlRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCBwcm92aWRlcyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBXb3JrZmxvdyAKKyAgICAgICAgICAgTWFuYWdlciBzZXJ2aWNlcy4gVGhpcyBpbmNsdWRlcyB0aGUgV29ya2Zsb3cgTWFuYWdlciBzZXJ2ZXIgaW50ZXJmYWNlLCBhcyB3ZWxsIAorICAgICAgICAgICBhcyB0aGUgYXNzb2NpYXRlZCBXb3JrZmxvdyBNYW5hZ2VyIGNsaWVudCBpbnRlcmZhY2UsIHRoYXQgY29tbXVuaWNhdGVzIHdpdGggCisgICAgICAgICAgIHRoZSBzZXJ2ZXIuCisgICAgICAgICAgIDwvdGQ+CisgICAgICAgICA8L3RyPiAgICAgICAgICAgCisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3NlY3Rpb24+CisgICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uNCIvPiAgIAorICAgICAgPHNlY3Rpb24gbmFtZT0iQ3VycmVudCBFeHRlbnNpb24gUG9pbnQgSW1wbGVtZW50YXRpb25zIj4KKyAgICAgICAgCisgICAgICAgIDxwPlRoZXJlIGFyZSBhdCBsZWFzdCB0d28gaW1wbGVtZW50YXRpb25zIG9mIGFsbCBvZiB0aGUgYWZvcmVtZW50aW9uZWQgZXh0ZW5zaW9uIAorICAgICAgICBwb2ludHMgZm9yIHRoZSBNYW5hZ2VyLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIFRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZSwgd2hpY2ggCisgICAgICAgIGl0c2VsZiBpcyBtZWFudCB0byBiZSBhbiBleHRlbnNpb24gcG9pbnQuIEVhY2ggZXh0ZW5zaW9uIHBvaW50IGltcGxlbWVudGF0aW9uIGlzIAorICAgICAgICBkZXRhaWxlZCBiZWxvdzo8L3A+CisKKyAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iV29ya2Zsb3cgSW5zdGFuY2UgUmVwb3NpdG9yeSI+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT48c3Ryb25nPkRhdGEgU291cmNlIGJhc2VkIFdvcmtmbG93IEluc3RhbmNlIFJlcG9zaXRvcnkuPC9zdHJvbmc+IEFuIAorICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXb3JrZmxvdyBJbnN0YW5jZSBSZXBvc2l0b3J5ICBleHRlbnNpb24gcG9pbnQgCisgICAgICAgICAgICAgaW50ZXJmYWNlIHRoYXQgdXNlcyBhIEpEQkMgYWNjZXNzaWJsZSBkYXRhYmFzZSBiYWNrZW5kLjwvbGk+CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+THVjZW5lIGJhc2VkIFdvcmtmbG93IEluc3RhbmNlIFJlcG9zaXRvcnkuPC9zdHJvbmc+IEFuIAorICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXb3JrZmxvdyBJbnN0YW5jZSBSZXBvc2l0b3J5IGV4dGVuc2lvbiBwb2ludCBpbnRlcmZhY2UgCisgICAgICAgICAgICAgdGhhdCB1c2VzIHRoZSBMdWNlbmUgZnJlZSB0ZXh0IGluZGV4IHN5c3RlbSB0byBzdG9yZSBXb3JrZmxvdyBJbnN0YW5jZSAKKyAgICAgICAgICAgICBpbmZvcm1hdGlvbi48L2xpPgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIDxsaT48c3Ryb25nPk1lbW9yeSBiYXNlZCBXb3JrZmxvdyBJbnN0YW5jZSBSZXBvc2l0b3J5Ljwvc3Ryb25nPiBBbiAKKyAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV29ya2Zsb3cgSW5zdGFuY2UgUmVwb3NpdG9yeSBleHRlbnNpb24gcG9pbnQgaW50ZXJmYWNlIAorICAgICAgICAgICAgIHRoYXQgc3RvcmVzIFdvcmtmbG93IEluc3RhbmNlIGluZm9ybWF0aW9uIGluIHJ1bnRpbWUgbWVtb3J5LjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9zdWJzZWN0aW9uPiAgCisgICAgICAgICAgIAorICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJXb3JrZmxvdyBSZXBvc2l0b3J5Ij4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+RGF0YSBTb3VyY2UgYmFzZWQgV29ya2Zsb3cgUmVwb3NpdG9yeS48L3N0cm9uZz4gQW4gCisgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdvcmtmbG93IFJlcG9zaXRvcnkgZXh0ZW5zaW9uIHBvaW50IHRoYXQgc3RvcmVzIAorICAgICAgICAgICAgIFdvcmtmbG93IG1vZGVsIGluZm9ybWF0aW9uIGluIGEgSkRCQyBhY2Nlc3NpYmxlIGRhdGFiYXNlLjwvbGk+CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+WE1MIGJhc2VkIFdvcmtmbG93IFJlcG9zaXRvcnkuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSAKKyAgICAgICAgICAgICBXb3JrZmxvdyBSZXBvc2l0b3J5IGV4dGVuc2lvbiBwb2ludCB0aGF0IHN0b3JlcyBXb3JrZmxvdyBtb2RlbCBpbmZvcm1hdGlvbiAKKyAgICAgICAgICAgICBpbiBYTUwgZmlsZXMgZW5kaW5nIGluIDxjb2RlPioud29ya2Zsb3cueG1sPC9jb2RlPiwgYXMgd2VsbCBhcyBmaWxlcyBuYW1lZCAKKyAgICAgICAgICAgICA8Y29kZT50YXNrcy54bWw8L2NvZGU+LCA8Y29kZT5jb25kaXRpb25zLnhtbDwvY29kZT4sIGFuZCAKKyAgICAgICAgICAgICA8Y29kZT5ldmVudHMueG1sPC9jb2RlPi48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvc3Vic2VjdGlvbj4gCisgICAgICAgICAKKyAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iV29ya2Zsb3cgRW5naW5lIj4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+VGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLjwvc3Ryb25nPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCisgICAgICAgICAgICAgV29ya2Zsb3cgRW5naW5lIHRoYXQgaXRzZWxmIGlzIG1lYW50IHRvIGJlIGFuIGV4dGVuc2lvbiBwb2ludCBmb3IgCisgICAgICAgICAgICAgV29ya2Zsb3dFbmdpbmVzIHRoYXQgd2FudCB0byBpbXBsZW1lbnQgVGhyZWFkUG9vbGluZy4gVGhpcyBXb3JrZmxvd0VuZ2luZSAKKyAgICAgICAgICAgICBwcm92aWRlcyBldmVyeXRoaW5nIG5lZWRlZCB0byBtYW5hZ2UgYSBUaHJlYWRQb29sIHVzaW5nIERvdWcgTGVhJ3Mgd29uZGVyZnVsIAorICAgICAgICAgICAgIGphdmEudXRpbC5jb25jdXJyZW50IHBhY2thZ2UgdGhhdCBtYWRlIGl0IGludG8gSkRLNS48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgICAgCisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlN5c3RlbSAoV29ya2Zsb3cgTWFuYWdlciBjbGllbnQgYW5kIFdvcmtmbG93IE1hbmFnZXIgc2VydmVyKSI+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT48c3Ryb25nPlhNTC1SUEMgYmFzZWQgV29ya2Zsb3cgTWFuYWdlciBTZXJ2ZXIuPC9zdHJvbmc+IEFuIGltcGxlbWVudGF0aW9uIAorICAgICAgICAgICAgIG9mIHRoZSBleHRlcm5hbCBzZXJ2ZXIgaW50ZXJmYWNlIGZvciB0aGUgV29ya2Zsb3cgTWFuYWdlciB0aGF0IHVzZXMgWE1MLVJQQyAKKyAgICAgICAgICAgICBhcyB0aGUgdHJhbnNwb3J0YXRpb24gbWVkaXVtLjwvbGk+CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgPGxpPjxzdHJvbmc+WE1MLVJQQyBiYXNlZCBXb3JrZmxvdyBNYW5hZ2VyIENsaWVudC48L3N0cm9uZz4gQW4gaW1wbGVtZW50YXRpb24gCisgICAgICAgICAgICAgb2YgdGhlIGNsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBYTUwtUlBDIFdvcmtmbG93IE1hbmFnZXIgc2VydmVyIHRoYXQgdXNlcyAKKyAgICAgICAgICAgICBYTUwtUlBDIGFzIHRoZSB0cmFuc3BvcnRhdGlvbiBtZWRpdW0uPC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgICAgIDxzZWN0aW9uIG5hbWU9IlVzZSBDYXNlcyI+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoZSBXb3JrZmxvdyBNYW5hZ2VyIHdhcyBidWlsdCB0byBzdXBwb3J0IHNldmVyYWwgb2YgdGhlIGFib3ZlIGNhcGFiaWxpdGllcy4gSW4gcGFydGljdWxhciB0aGVyZSAKKyAgICAgICAgICB3ZXJlIHNldmVyYWwgdXNlIGNhc2VzIHRoYXQgd2Ugd2FudGVkIHRvIHN1cHBvcnQsIHNvbWUgCisgICAgICAgICAgb2Ygd2hpY2ggYXJlIGRlc2NyaWJlZCBiZWxvdy4gICAgICAgIAorICAgICAgICA8L3A+CisgICAgICAKKyAgICAgICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvd21fdXNlX2Nhc2UxLmpwZyIgYWx0PSJXb3JrZmxvdyBNYW5hZ2VyIEV2ZW50LWJhc2VkIEV4ZWN1dGlvbiBVc2UgQ2FzZSIvPgorICAgICAgICAgCisgICAgICAgICA8cD5UaGUgYmxhY2sgbnVtYmVycyBpbiB0aGUgYWJvdmUgRmlndXJlIGNvcnJlc3BvbmQgdG8gYSBzZXF1ZW5jZSBvZiBzdGVwcyB0aGF0IG9jY3VycyBhbmQgYSAKKyAgICAgICAgIHNlcmllcyBvZiBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IFdvcmtmbG93IE1hbmFnZXIgZXh0ZW5zaW9uIHBvaW50cyBpbiBvcmRlciB0byAKKyAgICAgICAgIHBlcmZvcm0gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBhY3Rpdml0eS4gSW4gU3RlcCAxLCBhbiBldmVudCBpcyBwcm92aWRlZCB0byB0aGUgV29ya2Zsb3cKKyAgICAgICAgIE1hbmFnZXIgZXZlbnQgbGlzdGVudGVyICh0aGUgU3lzdGVtIGV4dGVuc2lvbiBwb2ludCksIGFsb25nIHdpdGggcmVxdWlyZWQgTWV0YWRhdGEuIFRoZQorICAgICAgICAgV29ya2Zsb3cgTWFuYWdlciwgaW4gc3RlcCAyLCBsb29rcyB1cCBpZiB0aGVyIGFyZSBhbnkgYXNzb2NpYXRlZCBXb3JrZmxvdyBSZXBvc2l0b3J5IG1vZGVscworICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBFdmVudC4gSWYgc28sIGluIHN0ZXBzIDMgYW5kIDQsIHRoZSByZXR1cm5lZCBXb3JrZmxvdyBtb2RlbHMKKyAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBXb3JrZmxvd0VuZ2luZSwgdG8gYmUgdHVybmVkIGludG8gZXhlY3V0YWJsZSBXb3JrZmxvdyBJbnN0YW5jZXMuRWFjaCAKKyAgICAgICAgIFdvcmtmbG93SW5zdGFuY2UgaXMgaGFuZGVkIG9mZiB0byBhIFdvcmtmbG93UHJvY2Vzc29yVGhyZWFkLCB0YWtlbiBmcm9tIHRoZSBUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUsCisgICAgICAgICBpbiBzdGVwcyA1IGFuZCA2LiBUaGUgV29ya2Zsb3dQcm9jZXNzb3JUaHJlYWQsIGluIHN0ZXAgNywgc3RlcHMgdGhyb3VnaCBlYWNoIGV4ZWN1dGFibGUgV29ya2Zsb3dUYXNrLAorICAgICAgICAgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG5lY2Vzc2FyeSBXb3JrZmxvdyBDb25kaXRpb25zIChpZiBhbnkpIGFyZSBzYXRpc2ZpZWQuIElmIGFsbCBXb3JrZmxvdyAKKyAgICAgICAgIENvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCwgdGhlbiB0aGUgV29ya2Zsb3cgVGFzayBpcyBleGVjdXRlZCwgZWl0aGVyIGxvY2FsbHksIG9yIGlmIGFuIFJlc291cmNlIE1hbmFnZXIKKyAgICAgICAgIGlzIGRlZmluZWQsIHRoZW4gdGhlIHRhc2sgaXMgc2VudCAoaW4gc3RlcCA3KSB0byB0aGUgUmVzb3VyY2UgTWFuYWdlciAobGFiZWxlZCA8Y29kZT5Qcm9jZXNzIE1hbmFnZXI8L2NvZGU+CisgICAgICAgICBpbiB0aGUgZmlndXJlKS4gSW4gc3RlcHMgOC0xMywgdGhlIFdvcmtmbG93VGFzayBpcyBleGVjdXRlZCBvbiByZW1vdGUgcmVzb3VyY2VzIHVzaW5nIHRoZSBSZXNvdXJjZSBNYW5hZ2VyLAorICAgICAgICAgYW5kIGV2ZW50dWFsbHkgY29tcGxldGVkLCB3aXRoIHRoZSBmaW5hbCBub3RpZmljYXRpb24gYmVpbmcgc2VudCBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdvcmtmbG93IFByb2Nlc3NvcgorICAgICAgICAgVGhyZWFkLCB3aGljaCBpcyBzdGVwcGluZyB0aHJvdWdoIHRoZSBXb3JrZmxvdyBJbnN0YW5jZSwgY29udHJvbGxpbmcgaXRzIGV4ZWN0dWlvbi4gPC9wPgorICAgICAgICAgCisgICAgICA8L3NlY3Rpb24+ICAgICAgCisgICAgICAKKyAgICAgIDxzZWN0aW9uIG5hbWU9IkNvbmNsdXNpb24iPgorICAgICAgPHA+VGhlIGFpbSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gZGV2ZWxvcGVycworICAgICAgYWJvdXQgdGhlIENBUyBXb3JrbGZvdyBNYW5hZ2VyLiBTcGVjaWZpY2FsbHksIHRoaXMgZG9jdW1lbnQgaGFzIGRlc2NyaWJlZCB0aGUgV29ya2Zsb3cgCisgICAgICBNYW5hZ2VyJ3MgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgaXRzIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMsIG9iamVjdCBtb2RlbCBhbmQKKyAgICAgIGtleSBjYXBhYmlsaXRpZXMuIEFkZGl0aW9uYWxseSwgdGhpcyBkb2N1bWVudCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgCisgICAgICBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgV29ya2Zsb3cgTWFuYWdlcidzIGV4dGVuc2lvbiBwb2ludHMuPC9wPiAKKyAgICAgIAorICAgICAgPHA+SW4gdGhlIDxhIGhyZWY9Ii4uL3VzZXIvYmFzaWMuaHRtbCI+QmFzaWMgVXNlciBHdWlkZTwvYT4gYW5kIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBVc2VyIEd1aWRlPC9hPiwgd2Ugd2lsbCBjb3ZlciB0b3BpY3MKKyAgICAgIGxpa2UgaW5zdGFsbGF0aW9uLCBjb25maWd1cmF0aW9uLCBhbmQgZXhhbXBsZSB1c2VzIGFzIHdlbGwgYXMgYWR2YW5jZWQgdG9waWNzCisgICAgICBsaWtlIHNjYWxpbmcgYW5kIG90aGVyIHRpcHMgYW5kIHRyaWNrcy48L3A+IAorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS94ZG9jL2RldmVsb3BtZW50L21hdmVuLnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9tYXZlbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThlZTE5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUveGRvYy9kZXZlbG9wbWVudC9tYXZlbi54bWwKQEAgLTAsMCArMSwxNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+VXNpbmcgTWF2ZW48L3RpdGxlPgorICAgIDxhdXRob3IgZW1haWw9Indvb2xsYXJkQGpwbC5uYXNhLmdvdiI+RGF2aWQgV29vbGxhcmQ8L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IlVzaW5nIE1hdmVuIj4KKyAgICAgIDxwPk9PRFQgdXNlcyA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iPk1hdmVuPC9hPiBmb3IgCisgICAgICBtYW5hZ2luZyBvdXIgYnVpbGQgZW52aXJvbm1lbnQuIE1hdmVuIGlzIGFuIG9wZW4gc291cmNlIHByb2R1Y3QgZnJvbSB0aGUgCisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4gdGhhdCBpbXByb3ZlcyAKKyAgICAgIG9uIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4gaW4gdGhlIGFyZWEgb2YgYnVpbGQgbWFuYWdlbWVudCwgCisgICAgICB3aGljaCBpdCB0dXJuIHdhcyBhbiBpbXByb3ZlbWVudCBvbiBNYWtlLiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgdXNlIG9mIAorICAgICAgTWF2ZW4gZm9yIE9PRFQgYnVpbGQgbWFuYWdlbWVudC48L3A+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9IlNldHVwIj4KKyAgICAgIDxwPk1hdmVuIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlIAorICAgICAgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCI+TWF2ZW4gRG93bmxvYWQ8L2E+IAorICAgICAgcGFnZS4gT09EVCBpcyB1c2luZyB2ZXJzaW9uIDIuMCBhbmQgYWJvdmUuIE1hdmVuIHdhcyBkZXZlbG9wZWQgaW4gSmF2YSBzbyBpdCAKKyAgICAgIHdpbGwgcnVuIG9uIHRoZSBwb3B1bGFyIHBsYXRmb3JtcyAoZS5nLiwgV2luZG93cywgTWFjIE9TWCwgZXRjLikuIEJleW9uZCAKKyAgICAgIG1ha2luZyBzdXJlIHRoZSA8aT5tdm48L2k+IGV4ZWN1dGFibGUgaXMgaW4geW91ciBwYXRoLCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSAKKyAgICAgIHNldHVwIHJlcXVpcmVkLjwvcD4KKworICAgICAgPHA+TWF2ZW4gaXMgYmFzZWQgb24gdGhlIGNvbmNlcHQgb2YgYSBQcm9qZWN0IE9iamVjdCBNb2RlbCAoUE9NKSB3aGljaCBpcyAKKyAgICAgIGNvbnRhaW5lZCBpbiB0aGUgPGk+cG9tLnhtbDwvaT4gZmlsZSBmb3VuZCBhdCB0aGUgcm9vdCBvZiBlYWNoIHByb2plY3QuIAorICAgICAgVGhlIFBPTSBhbGxvd3MgTWF2ZW4gdG8gbWFuYWdlIGEgcHJvamVjdCdzIGJ1aWxkLCByZXBvcnRpbmcgYW5kIGRvY3VtZW50YXRpb24uIAorICAgICAgRm9yIE9PRFQsIG11Y2ggb2YgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIG1hbmFnaW5nIHRoZSBwcm9qZWN0cyBpcyAKKyAgICAgIGNvbnRhaW5lZCBpbiBhIHBhcmVudCBQT00sIHdoaWNoIGlzIGxvY2F0ZWQgaW4gdGhlIDxpPm9vZHQtY29yZTwvaT4gcHJvamVjdC4gU28sIAorICAgICAgaW4gb3JkZXIgdG8gYnVpbGQgYW55IG9mIHRoZSBvdGhlciBwcm9qZWN0cyAoZS5nLiwgY2FzLWN1cmF0b3IsIGNhcy1maWxlbWdyLCAKKyAgICAgIGV0Yy4pIHRoZSBwYXJlbnQgUE9NIG11c3QgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBPT0RUIE1hdmVuIHJlcG9zaXRvcnkuIFRoZSAKKyAgICAgIGxvY2FsIDxpPnBvbS54bWw8L2k+IGZpbGVzIGZvciBlYWNoIG9mIHRoZSBwcm9qZWN0cyBoYXZlIGJlZW4gY29uZmlndXJlZCB0byAKKyAgICAgIHJldHJpZXZlIHRoZSBwYXJlbnQgUE9NIGF1dG9tYXRpY2FsbHkuPC9wPgorICAgICAgCisgICAgICA8cD5PbmNlIE1hdmVuIGhhcyBiZWVuIHNldHVwLCB0aGUgZmlyc3Qgc3RlcCB0byBidWlsZGluZyBhIHByb2plY3Qgd2l0aCBNYXZlbiAKKyAgICAgIGlzIHRvIGNoZWNrb3V0IGEgcHJvamVjdCdzIHNvdXJjZSBjb2RlIGludG8gdGhlIGRldmVsb3BlcidzIHdvcmsgYXJlYS4gU2VlIHRoZSAKKyAgICAgIDxhIGhyZWY9Ii4uL2RldmVsb3BtZW50L3N1YnZlcnNpb24uaHRtbCI+VXNpbmcgU3VidmVyc2lvbjwvYT4gZG9jdW1lbnQgZm9yIGhvdyB0byAKKyAgICAgIGNoZWNrIG91dCBwcm9qZWN0cyBmcm9tIHRoZSBDTSByZXBvc2l0b3J5LjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iUHJvamVjdCBTdHJ1Y3R1cmUiPgorICAgICAgPHA+SW4gb3JkZXIgZm9yIGRlZmF1bHQgTWF2ZW4gZnVuY3Rpb25zIHRvIG9wZXJhdGUgcHJvcGVybHksIHRoZXJlIGlzIGEgCisgICAgICBzdWdnZXN0ZWQgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6PC9wPgorICAgICAgCisgICAgICA8c291cmNlPgorLworICBzcmMvICAgICAgICAgICAgIFNvdXJjZSBDb2RlIChldmVyeXRoaW5nKQorICAgIG1haW4vICAgICAgICAgICAgUHJvZ3JhbSBTb3VyY2UKKyAgICAgIGFzc2VtYmx5LyAgICAgICAgUGFja2FnZSBEZXNjcmlwdG9yCisgICAgICBqYXZhLyAgICAgICAgICAgIEphdmEgU291cmNlCisgICAgICByZXNvdXJjZXMvICAgICAgIFNjcmlwdHMsIENvbmZpZyBGaWxlLCBldGMuCisgICAgICAgIC4uLgorICAgIHRlc3QvICAgICAgICAgICAgVGVzdCBTb3VyY2UKKyAgICAgIGphdmEvCisgICAgICByZXNvdXJjZXMvCisgICAgICAgIC4uLgorICAgIHNpdGUvICAgICAgICAgICAgU2l0ZSBEb2N1bWVudGF0aW9uCisgICAgICBhcHQvICAgICAgICAgICAgIERvY3MgaW4gQVBUIEZvcm1hdAorICAgICAgICBpbmRleC5hcHQKKyAgICAgICAgLi4uCisgICAgICB4ZG9jLyAgICAgICAgICAgIERvY3MgaW4gWERPQyBGb3JtYXQKKyAgICAgICAgaW5kZXgueG1sCisgICAgICAgIC4uLgorICAgICAgcmVzb3VyY2VzLworICAgICAgICBpbWFnZXMvCisgICAgICBzaXRlLnhtbCAgICAgICAgIE1lbnUgU3RydWN0dXJlCisKKyAgdGFyZ2V0LyAgICAgICAgICBCdWlsZCBSZXN1bHRzIChiaW5hcmllcywgZG9jcyBhbmQgcGFja2FnZXMpCisgICAgLi4uCisKKyAgTElDRU5TRS50eHQKKyAgUkVBRE1FLnR4dAorICBwb20ueG1sICAgICAgICAgIFByb2plY3QgT2JqZWN0IE1vZGVsIChQT00pCisgICAgICA8L3NvdXJjZT4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgQ29tbWFuZHMiPgorICAgIDxwPlRoZXJlIGFyZSBmZXcgc3RhbmRhcmQgY29tbWFuZHMgdGhhdCBkZXZlbG9wZXJzIHdpbGwgdXNlIG9uIGEgZGFpbHkgYmFzaXMgCisgICAgYW5kIHRoZXkgYXJlIHJlbGF0ZWQgdG8gYnVpbGRpbmcgYW5kIGNsZWFuaW5nIGEgcHJvamVjdC48L3A+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGQgYSBQcm9qZWN0Ij4KKyAgICAgIDxwPkJ1aWxkIHRoZSBwcm9qZWN0J3MgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgCisgICAgICBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gY29tcGlsZQorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5UaGUgYWJvdmUgY29tbWFuZCB3aWxsIGdlbmVyYXRlIHRoZSBhcnRpZmFjdHMgaW4gdGhlIDxpPnRhcmdldC88L2k+IAorICAgICAgZGlyZWN0b3J5LjwvcD4gICAgICAKKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iSW5zdGFsbCBhIFByb2plY3QiPgorICAgICAgPHA+SW5zdGFsbCB0aGUgcHJvamVjdCdzIGFydGlmYWN0cyBsb2NhbGx5IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gaW5zdGFsbAorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5QcmlvciB0byBpbnN0YWxsYXRpb24sIHRoZSBhYm92ZSBjb21tYW5kIHdpbGwgY29tcGlsZSB0aGUgc291cmNlIGNvZGUsIAorICAgICAgaWYgbmVjZXNzYXJ5LCBhbmQgZXhlY3V0ZSB0aGUgdW5pdCB0ZXN0cy4gVGhlIHJlc3VsdCBvZiB0aGUgYWJvdmUgY29tbWFuZCAKKyAgICAgIGlzIHRvIGluc3RhbGwgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHMgKGUuZy4gcG9tLCBqYXIsIGV0Yy4pIGluIHRoZSB1c2VyJ3MgCisgICAgICBsb2NhbCBNYXZlbiByZXBvc2l0b3J5ICgkSE9NRS8ubTIvcmVwb3NpdG9yeS8pLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSAKKyAgICAgIGFydGlmYWN0IGlzIGEgZGVwZW5kZW5jeSBmb3IgYW5vdGhlciBwcm9qZWN0IGJ1dCBoYXMgeWV0IHRvIGJlIGRlcGxveWVkIAorICAgICAgdG8gdGhlIFNXU0EgTWF2ZW4gcmVwb3NpdG9yeS48L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IlBhY2thZ2UgYSBQcm9qZWN0Ij4KKyAgICAgIDxwPkNyZWF0ZSB0aGUgcHJvamVjdCdzIGRpc3RyaWJ1dGlvbiBwYWNrYWdlIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gcGFja2FnZQorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD5QcmlvciB0byBwYWNrYWdlIGNyZWF0aW9uLCB0aGUgYWJvdmUgY29tbWFuZCB3aWxsIGNvbXBpbGUgdGhlIHNvdXJjZSAKKyAgICAgIGNvZGUsIGlmIG5lY2Vzc2FyeSwgYW5kIGV4ZWN1dGUgdGhlIHVuaXQgdGVzdHMuIFRoZSBhYm92ZSBjb21tYW5kIHdpbGwgCisgICAgICBjcmVhdGUgdGhlIHBhY2thZ2UocykgaW4gdGhlIHRhcmdldC8gZGlyZWN0b3J5LjwvcD4KKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGQgYSBQcm9qZWN0J3MgV2ViIFNpdGUiPgorICAgICAgPHA+QnVpbGQgdGhlIHByb2plY3QncyB3ZWIgc2l0ZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIHNpdGUKKyAgICAgIDwvc291cmNlPgorICAgICAgPHA+VGhlIGFib3ZlIGNvbW1hbmQgd2lsbCBnZW5lcmF0ZSB0aGUgd2ViIHNpdGUgaW4gdGhlIDxpPnRhcmdldC9zaXRlLzwvaT4KKyAgICAgIGRpcmVjdG9yeS4gVmlldyB0aGUgc2l0ZSBieSBwb2ludGluZyB5b3VyIHdlYiBicm93c2VyIGF0IHRoZSAKKyAgICAgIDxpPmluZGV4Lmh0bWw8L2k+IGZpbGUgd2l0aGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KKyAgICA8L3N1YnNlY3Rpb24+IAorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNsZWFuIGEgUHJvamVjdCI+CisgICAgICA8cD5DbGVhbiBvdXQgdGhlIHByb2plY3QgZGlyZWN0b3J5IG9mIGdlbmVyYXRlZCBhcnRpZmFjdHMgd2l0aCB0aGUgCisgICAgICBmb2xsb3dpbmcgY29tbWFuZDo8L3A+CisgICAgICA8c291cmNlPgorbXZuIGNsZWFuCisgICAgICA8L3NvdXJjZT4KKyAgICAgIDxwPlRoZSBhYm92ZSBjb21tYW5kIHdpbGwgcmVtb3ZlIHRoZSA8aT50YXJnZXQvPC9pPiBkaXJlY3RvcnkgYW5kIGl0cyAKKyAgICAgIGNvbnRlbnRzLjwvcD4KKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iVXNlZnVsIENvbW1hbmQgQXJndW1lbnRzIj4KKyAgICAgIDxwPlRoZXJlIGEgY291cGxlIG9mIHVzZWZ1bCBhcmd1bWVudHMgd2hpY2ggY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSAKKyAgICAgIGNvbW1hbmRzIGFib3ZlIHRvIGxpbWl0IHRoZSBzY29wZSBvZiB0aGUgY29tbWFuZC48L3A+CisgICAgICA8cD5JbiBvcmRlciB0byBza2lwIHVuaXQgdGVzdCBleGVjdXRpb24sIGFkZCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50OjwvcD4KKyAgICAgIDxzb3VyY2U+Cittdm4gW2NvbW1hbmRdIC1EbWF2ZW4udGVzdC5za2lwPXRydWUKKyAgICAgIDwvc291cmNlPgorICAgICAgPHA+VGhlIGFib3ZlIGNvbW1hbmQgaXMgbW9zdCB1c2VmdWwgd2l0aCB0aGUgPGk+aW5zdGFsbDwvaT4sIAorICAgICAgPGk+cGFja2FnZTwvaT4gYW5kIDxpPnNpdGU8L2k+IGNvbW1hbmRzLjwvcD4KKyAgICAgIDxwPldoZW4gYSBwcm9qZWN0IGhhcyBtb2R1bGVzIGRlZmluZWQgaW4gdGhlIFBPTSwgdGhlIGNvbW1hbmQgY2FuIGJlIAorICAgICAgcGVyZm9ybWVkIGFnYWluc3QgdGhlIHRvcCBsZXZlbCBvZiB0aGUgcHJvamVjdCBpbnN0ZWFkIG9mIHRoZSBtb2R1bGVzIGJ5IAorICAgICAgYWRkaW5nIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQ6PC9wPgorICAgICAgPHNvdXJjZT4KK212biBbY29tbWFuZF0gLS1ub24tcmVjdXJzaXZlCisgICAgICA8L3NvdXJjZT4KKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIG5hbWU9IkFja25vd2xlZGdtZW50cyI+CisgICAgICA8cD5NdWNoIG9mIHRoZSBtYXRlcmlhbCBpbiB0aGlzIE1hdmVuIGd1aWRlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkIAorICAgICAgYnkgU2VhbiBIYXJkbWFuIHVuZGVyIHRoZSBzcG9uc29yc2hpcCBvZiBOQVNBIEpldCBQcm9wdWxzaW9uIAorICAgICAgTGFib3JhdG9yeSdzIFBsYW5ldGFyeSBEYXRhIFN5c3RlbS4gPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBuYW1lPSJSZWZlcmVuY2VzIj4KKyAgICAgIDxwPkhlcmUgaXMgYSBsaXN0IG9mIE1hdmVuIHJlc291cmNlczo8L3A+CisgICAgICA8dWw+CisgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvaW5kZXguaHRtbCI+T25saW5lIAorICAgICAgICBEb2N1bWVudGF0aW9uIEluZGV4PC9hPjwvbGk+CisgICAgICA8L3VsPgorICAgIDwvc2VjdGlvbj4KKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUveGRvYy91c2VyL2FkdmFuY2VkLnhtbCBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUveGRvYy91c2VyL2FkdmFuY2VkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTllNzIwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS94ZG9jL3VzZXIvYWR2YW5jZWQueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAgPHByb3BlcnRpZXM+CisgICAgICA8dGl0bGU+Q0FTIFdvcmtmbG93IE1hbmFnZXIgVXNlciBHdWlkZTwvdGl0bGU+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmUgV29vbGxhcmQ8L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAKKyAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPlRoaXMgZG9jdW1lbnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVvcmdhbml6ZWQgYXMKKyAgICAgIHBhcnQgb2Ygb3VyIG9uZ29pbmcgZG9jdW1lbnRhdGlvbiBlZmZvcnQuIFBsZWFzZSBjaGVjayBiYWNrIGZvciB1cGRhdGVzLjwvZGl2PiAgCisgICAKKyAgICAgIDxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisgICAgICAKKyAgICAgIDxwPkluIHRoZSBDQVMgV29ya2Zsb3cgTWFuYWdlciBBZHZhbmNlZCBVc2VyIEd1aWRlLCB3ZSB3aWxsIGNvdmVyIGEgbnVtYmVyIG9mIAorICAgICAgYWR2YW5jZWQgdG9waWNzIHJlbGF0ZWQgdG8gdXNpbmcgdGhlIENBUyBXb3JrZmxvdyBNYW5hZ2VyLCBpbmNsdWRpbmcgc2l0dWF0aW9ucworICAgICAgdGhhdCBoYXZlIGFyaXNlbiBpbiB0aGUgYXV0aG9ycycgZXhwZXJpZW5jZXMgcmVnYXJkaW5nIHRoZSB1c2UgYWx0ZXJuYXRpdmUgcXVldWluZyAKKyAgICAgIHN0cmF0ZWdpZXMsIGFkZHJlc3Npbmcgc2NhbGluZyBpc3N1ZXMsIGV0Yy4gQmFzaWMgY29uY2VwdHMsIHN1Y2ggYXMgaW5zdGFsbGF0aW9uIGFuZCAKKyAgICAgIGNvbmZpZ3VyYXRpb24sIGNhbiBiZSBmb3VuZCBpbiB0aGUgCisgICAgICA8YSBocmVmPSIuLi91c2VyL2Jhc2ljLmh0bWwiPkJhc2ljIFVzZXIgR3VpZGU8L2E+LjwvcD4KKyAgICAgIAorICAgICAgPHA+VGhlIHJlbWFpbmRlciBvZiB0aGlzIGd1aWRlIGlzIHNlcGFyYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PC9wPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iI3NlY3Rpb24xIj5BbHRlcm5hdGl2ZSBRdWV1aW5nPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjIiPlNjYWxpbmcgSXNzdWVzPC9hPjwvbGk+CisgICAgICA8L3VsPgorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgICAgIDxhIG5hbWU9InNlY3Rpb24xIi8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJBbHRlcm5hdGl2ZSBRdWV1aW5nIj4KKyAgICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMiIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iU2NhbGluZyBJc3N1ZXMiPgorICAgICAgPHA+Q29taW5nIFNvb24uLi48L3A+CisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgIDwvYm9keT4KKzwvZG9jdW1lbnQ+IApkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS94ZG9jL3VzZXIvYmFzaWMueG1sIGIvMC4xMC93b3JrZmxvdy9zcmMvc2l0ZS94ZG9jL3VzZXIvYmFzaWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDcyMWQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3hkb2MvdXNlci9iYXNpYy54bWwKQEAgLTAsMCArMSwyNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAgPHByb3BlcnRpZXM+CisgICAgICA8dGl0bGU+Q0FTIFdvcmtmbG93IE1hbmFnZXIgVXNlciBHdWlkZTwvdGl0bGU+CisgICAgICA8YXV0aG9yIGVtYWlsPSJDaHJpcy5NYXR0bWFubkBqcGwubmFzYS5nb3YiPkNocmlzIE1hdHRtYW5uPC9hdXRob3I+CisgICAgICA8YXV0aG9yIGVtYWlsPSJ3b29sbGFyZEBqcGwubmFzYS5nb3YiPkRhdmUgV29vbGxhcmQ8L2F1dGhvcj4KKyAgIDwvcHJvcGVydGllcz4KKworICAgPGJvZHk+CisgICAKKyAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPlRoaXMgZG9jdW1lbnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVvcmdhbml6ZWQgYXMKKyAgICAgIHBhcnQgb2Ygb3VyIG9uZ29pbmcgZG9jdW1lbnRhdGlvbiBlZmZvcnQuIFBsZWFzZSBjaGVjayBiYWNrIGZvciB1cGRhdGVzLjwvZGl2PgorICAgICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgCisgICAgICA8cD5UaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhIGJhc2ljIHVzZXIncyBndWlkZSBmb3IgdGhlIENBUyBXb3JrZmxvdyBNYW5hZ2VyIAorICAgICAgcHJvamVjdC4gVGhlIGdvYWwgb2YgdGhlIGRvY3VtZW50IGlzIHRvIGFsbG93IHVzZXJzIHRvIGNoZWNrIG91dCwgYnVpbGQsIGFuZCAKKyAgICAgIGluc3RhbGwgYSBiYXNlIHZlcnNpb24gb2YgdGhlIENBUyBXb3JrZmxvdyBNYW5hZ2VyLCBhcyB3ZWxsIGFzIHBlcmZvcm0gYmFzaWMgCisgICAgICBjb25maWd1cmF0aW9uIHRhc2tzLiBGb3IgYWR2YW5jZWQgdG9waWNzLCBzdWNoIGFzIGNvbmZpZ3VyaW5nIHRoZSBXb3JrZmxvdyAKKyAgICAgIE1hbmFnZXIgdG8gU2NhbGUgYW5kIG90aGVyIHRpcHMgYW5kIHRyaWNrcywgcGxlYXNlIHNlZSBvdXIgCisgICAgICA8YSBocmVmPSIuLi91c2VyL2FkdmFuY2VkLmh0bWwiPkFkdmFuY2VkIEd1aWRlLjwvYT48L3A+CisgICAgICAKKyAgICAgIDxwPlRoZSByZW1haW5kZXIgb2YgdGhpcyBndWlkZSBpcyBzZXBhcmF0ZWQgaW50byB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjwvcD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMSI+RG93bmxvYWQgYW5kIEJ1aWxkPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjc2VjdGlvbjIiPkNvbmZpZ3VyYXRpb24gaW4gMiBNaW51dGVzIG9yIExlc3M8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNzZWN0aW9uMyI+TGVhcm4gQnkgRXhhbXBsZTwvYT48L2xpPgorICAgICAgPC91bD4gIAorICAgICAgPC9zZWN0aW9uPiAKKyAgICAgCisgICAgICA8YSBuYW1lPSJzZWN0aW9uMSIvPgorICAgICAgPHNlY3Rpb24gbmFtZT0iRG93bmxvYWQgYW5kIEJ1aWxkIj4KKyAgICAgICAgPHA+VGhlIG1vc3QgcmVjZW50IENBUy1Xb3JrZmxvdyBNYW5hZ2VyIHByb2plY3QgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgQXBhY2hlIE9PRFQKKyAgICAgICAgPGEgaHJlZj0iLyI+d2Vic2l0ZTwvYT4gb3IgaXQgY2FuIGJlIGNoZWNrZWQgb3V0IAorICAgICAgICBmcm9tIHRoZSBPT0RUIHJlcG9zaXRvcnkgdXNpbmcgU3VidmVyc2lvbi4gVGhlIENBUy1Xb3JrZmxvdyBNYW5hZ2VyIHByb2plY3QgaXMgCisgICAgICAgIGxvY2F0ZWQgYXQgPGNvZGU+Li4vLi4vd29ya2Zsb3cvPC9jb2RlPi4gV2UgcmVjb21tZW5kIGNoZWNraW5nCisgICAgICAgIG91dCB0aGUgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb24gKHYxLjUuMSBhdCB0aGUgdGltZSBvZiB3cml0aW5nKS48L3A+CisgICAgICAKKyAgICAgICAgPHA+TWF2ZW4gaXMgdGhlIGJ1aWxkIG1hbmFnZW1lbnQgc3lzdGVtIHVzZWQgZm9yIE9PRFQgcHJvamVjdHMuIFdlIGN1cnJlbnRseSAKKyAgICAgICAgc3VwcG9ydCBNYXZlbiAyLjAgYW5kIGxhdGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBNYXZlbiwgc2VlIG91ciAKKyAgICAgICAgPGEgaHJlZj0iLi4vZGV2ZWxvcG1lbnQvbWF2ZW4uaHRtbCI+TWF2ZW4gR3VpZGUuPC9hPjwvcD4KKyAgICAgIAorICAgICAgICA8cD5Bc3N1bWluZyBhICpuaXgtbGlrZSBlbnZpcm9ubWVudCwgd2l0aCBib3RoIE1hdmVuIGFuZCBTdWJ2ZXJzaW9uIAorICAgICAgICBjbGllbnRzIGluc3RhbGxlZCBhbmQgb24geW91ciBwYXRoLCBhbiBleGFtcGxlIG9mIHRoZSBjaGVja291dCBhbmQgCisgICAgICAgIGJ1aWxkIHByb2Nlc3MgaXMgcHJlc2VudGVkIGJlbG93OjwvcD4KKyAgICAgICAgCisgICAgICAgICA8c291cmNlPgorPiBta2RpciAvdXNyL2xvY2FsL3NyYworPiBjZCAvdXNyL2xvY2FsL3NyYworPiBzdm4gY2hlY2tvdXQgaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvb29kdC90cnVuay93b3JrZmxvdyB3b3JrZmxvdworICAgICAgPC9zb3VyY2U+CisgICAgICAgIAorICAgICAgPHA+QWZ0ZXIgdGhlIFN1YnZlcnNpb24gY29tbWFuZCBjb21wbGV0ZXMsIHlvdSB3aWxsIGhhdmUgdGhlIHNvdXJjZQorICAgICAgZm9yIHRoZSBDQVMtV29ya2Zsb3cgcHJvamVjdCBpbiB0aGUgPGNvZGU+L3Vzci9sb2NhbC9zcmMvd29ya2Zsb3c8L2NvZGU+CisgICAgICBkaXJlY3RvcnkuPC9wPgorICAgICAgCisgICAgICA8cD5JbiBvcmRlciB0byBidWlsZCB0aGUgcHJvamVjdCBmcm9tIHRoaXMgc291cmNlLCBpc3N1ZSB0aGUgZm9sbG93aW5nIAorICAgICAgY29tbWFuZHM6PC9wPgorICAgICAgCisgICAgICA8c291cmNlPgorPiBjZCAvdXNyL2xvY2FsL3NyYy93b3JrZmxvdworPiBtdm4gcGFja2FnZSAgICAKKyAgICAgIDwvc291cmNlPiAgIAorICAgICAgCisgICAgICA8cD5Ob3RlIHRoYXQgdGhpcyBjb21tYW5kIHBlcmZvcm1zIGEgbnVtYmVyIG9mIHRhc2tzLCBpbmNsdWRpbmcgcGVyZm9ybWluZworICAgICAgdW5pdCB0ZXN0cyB3aGljaCBjYW4gdGFrZSBhIGxvbmcgdGltZSBkZXBlbmRpbmcgb24geW91ciBzeXN0ZW0uIEF0IHRoZSBlbmQgb2YgCisgICAgICB0aGUgcHJvY2VzcywgeW91IHdpbGwgc2VlIGEgTWF2ZW4gc3VjY2VzcyBiYW5uZXIuPC9wPgorICAgICAgCisgICAgICA8cD5PbmNlIHRoZSBNYXZlbiBjb21tYW5kIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHlvdSBzaG91bGQgaGF2ZSBhIAorICAgICAgPGNvZGU+dGFyZ2V0PC9jb2RlPiBkaXJlY3RvcnkgdW5kZXIgPGNvZGU+LXdvcmtmbG93PC9jb2RlPi4gCisgICAgICBUaGUgcHJvamVjdCBoYXMgYmVlbiBidWlsdCBpbiB0aGlzIGRpcmVjdG9yeSBhcyBhIGRpc3RyaWJ1dGlvbiB0YXIgYmFsbC4KKyAgICAgIEluIG9yZGVyIHRvIG1vdmUgdGhlIGJ1aWx0IHByb2plY3Qgb3V0IG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB1bnBhY2sgdGhlCisgICAgICB0YXIgYmFsbCwgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kczo8L3A+CisgICAgICAKKyAgICAgIDxzb3VyY2U+Cis+IGNkIC91c3IvbG9jYWwKKz4gbXYgc3JjL3dvcmtmbG93L3RydW5rL2Nhcy13b3JrZmxvdy12WC5ZLlotZGlzdC50YXIuZ3ogLi8KKz4gdGFyIC14dnpmIGNhcy13b3JrZmxvdy12WC5ZLlotZGlzdC50YXIuZ3oKKz4gZXhwb3J0IFdPUktGTE9XX0hPTUU9L3Vzci9sb2NhbC9jYXMtd29ya2Zsb3ctdlguWS5aCisgICAgICA8L3NvdXJjZT4gICAgICAgCisgICAgICAKKyAgICAgIDxwPlRoZSByZXN1bHRhbnQgZGlyZWN0b3J5IGxheW91dCBmcm9tIHRoZSB1bnBhY2tlZCB0YXJiYWxsIGlzIGFzIGZvbGxvd3M6PC9wPgorICAgICAgICAgICAKKyAgICAgIDxzb3VyY2U+CitiaW4vIGV0Yy8gbG9ncy8gZG9jLyBsaWIvIHBvbGljeS8gTElDRU5TRS50eHQgQ0hBTkdFUy50eHQKKyAgICAgIDwvc291cmNlPgorICAgICAgCisgICAgICA8cD5BIGJhc2ljIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRlcGxveW1lbnQgaXMgCisgICAgICBwcmVzZW50ZWQgYmVsb3c6PC9wPgorICAgICAgPHVsPgorICAgICAgICAgPGxpPjxzdHJvbmc+YmluPC9zdHJvbmc+IC0gY29udGFpbnMgc2NyaXB0cyBmb3IgcnVubmluZyB0aGUgV29ya2Zsb3cgTWFuYWdlciwgCisgICAgICAgICBpbmNsdWRpbmcgdGhlICJ3bWdyIiBzZXJ2ZXIgc2NyaXB0LCBhbmQgdGhlICJ3bWdyLWNsaWVudCIgY2xpZW50IHNjcmlwdC48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5ldGM8L3N0cm9uZz4gLSBjb250YWlucyB0aGUgbG9nZ2luZy5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSAKKyAgICAgICAgIFdvcmtmbG93IE1hbmFnZXIsIGFuZCB0aGUgd29ya2Zsb3cucHJvcGVydGllcyBmaWxlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBzZXJ2ZXIgCisgICAgICAgICBvcHRpb25zLjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT48c3Ryb25nPmxvZ3M8L3N0cm9uZz4gLSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgaW50byB3aGljaCBsb2cgZmlsZXMgYXJlIAorICAgICAgICAgd3JpdHRlbi48L2xpPgorICAgICAgICAgICAgICAKKyAgICAgICAgIDxsaT48c3Ryb25nPmRvYzwvc3Ryb25nPiAtIGNvbnRhaW5zIEphdmFkb2MgZG9jdW1lbnRhdGlvbiwgYW5kIHVzZXIgZ3VpZGVzIAorICAgICAgICAgZm9yIHVzaW5nIHRoZSBXb3JrZmxvdyBNYW5hZ2VyLjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT48c3Ryb25nPmxpYjwvc3Ryb25nPiAtIHRoZSByZXF1aXJlZCBKYXZhIGphciBmaWxlcyB0byBydW4gdGhlIFdvcmtmbG93IAorICAgICAgICAgTWFuYWdlci48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5wb2xpY3k8L3N0cm9uZz4gLSB0aGUgZGVmYXVsdCBYTUwtYmFzZWQgZWxlbWVudCBhbmQgcHJvZHVjdCB0eXBlIAorICAgICAgICAgcG9saWN5IGluIGNhc2UgdGhlIHVzZXIgaXMgdXNpbmcgdGhlIEx1Y2VuZSBXb3JrZmxvdyBJbnN0YW5jZSBSZXBvc2l0b3J5IGFuZC9vciAKKyAgICAgICAgIHRoZSBYTUwgV29ya2Zsb3cgUmVwb3NpdG9yeSwgYWxvbmcgd2l0aCB0aGUgVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT48c3Ryb25nPkNIQU5HRVMudHh0PC9zdHJvbmc+IC0gY29udGFpbnMgdGhlIENIQU5HRVMgcHJlc2VudCBpbiB0aGlzIAorICAgICAgICAgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgV29ya2Zsb3cgTWFuYWdlci48L2xpPgorICAgICAgICAgCisgICAgICAgICA8bGk+PHN0cm9uZz5MSUNFTlNFLnR4dDwvc3Ryb25nPiAtIHRoZSBMSUNFTlNFIGZvciB0aGUgV29ya2Zsb3cgTWFuYWdlciAKKyAgICAgICAgIHByb2plY3QuPC9saT4KKyAgICAgICA8L3VsPgorICAgICAgCisgICAgICA8cD5Ob3cgeW91IGhhdmUgYSBidWlsdCBXb3JrZmxvdyBNYW5hZ2VyIGF0IDxjb2RlPi91c3IvbG9jYWwvY2FzLXdvcmtmbG93LXZYLlkuWjwvY29kZT4uCisgICAgICBJbiB0aGUgbmV4dCBzZWN0aW9uLCB3ZSB3aWxsIGRpc2N1c3MgaG93IHlvdSBjYW4gY29uZmlndXJlIHRoZSBXb3JrZmxvdyBNYW5hZ2VyIGZvcgorICAgICAgYmFzaWMgb3BlcmF0aW9ucy48L3A+CisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgICAgIDxhIG5hbWU9InNlY3Rpb24yIi8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJDb25maWd1cmF0aW9uIGluIDIgTWludXRlcyBvciBMZXNzIj4KKyAgICAgIAorICAgICAgPHA+VGhlIHJlYXNvbiBmb3IgZW50aXRsaW5nIHRoaXMgc2VjdGlvbiAiaW4gMiBNaW51dGVzIG9yIExlc3MiIGlzIHRvIHNob3cgdGhhdAorICAgICAgaW4gaXQncyBiYXNlIGRlcGxveW1lbnQsIHdpdGggdmVyeSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24sIHdlIGNhbiBoYXZlIHRoZSBXb3JrZmxvdworICAgICAgTWFuYWdlciBpbiBhIHVzYWJsZSBzdGF0ZSwgY2FwYWJsZSBvZiBtYW5hZ2luZyB3b3JrZmxvdyB0YXNrcyB0byBjb21wbGV0aW9uLiBGb3IgCisgICAgICB0aGUgcmVjb3JkLCBJIGhhdmVuJ3QgdGltZWQgaXQsIGJ1dCBpdHMgcHJldHR5IGZhc3QuLi48L3A+CisgICAgICAKKyAgICAgIDxwPldlIGFyZSBnb2luZyB0byBzZXQgdXAgdGhlIFdvcmtmbG93IE1hbmFnZXIgdG8gdXNlIHRoZSBYTUwtYmFzZWQgV29ya2Zsb3cgCisgICAgICBSZXBvc2l0b3J5LCB0aGUgVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLCBhbmQgTHVjZW5lIFdvcmtmbG93IEluc3RhbmNlIFJlcG9zaXRvcnkgCisgICAgICBleHRlbnNpb24gcG9pbnRzLiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBlZGl0IHRoZSB3bWdyIHNjcmlwdCBpbiAKKyAgICAgIDxjb2RlPiRXT1JLRkxPV19IT01FL2JpbjwvY29kZT4uIE1ha2UgdGhlIGZvbGxvd2luZyAKKyAgICAgIGNoYW5nZXM6PC9wPgorICAgICAKKyAgICAgICA8dWw+CisgICAgICAgICA8bGk+U2V0IHRoZSA8Y29kZT5TRVJWRVJfUE9SVDwvY29kZT4gdmFyaWFibGUgdG8gdGhlIGRlc2lyZWQgcG9ydCBvbiB3aGljaCAKKyAgICAgICAgIHlvdSdkIGxpa2UgdG8gcnVuIHRoZSBXb3JrZmxvdyBNYW5hZ2VyLiBPdXIgZGVmYXVsdCBwb3J0IGlzIDkwMDEuPC9saT4KKyAgICAgICAgIAorICAgICAgICAgPGxpPlNldCB0aGUgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gb2YgeW91ciAKKyAgICAgICAgIGluc3RhbGxlZCBKUkUgcnVudGltZS4gSWYgeW91IGRvIG5vdCBrbm93IHdoZXJlIHRoaXMgaXMsIHR5cGUgPGNvZGU+Jmd0OyB3aGljaCAKKyAgICAgICAgIGphdmE8L2NvZGU+IGFuZCB1c2UgdGhhdCBwYXRoLjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT5TZXQgdGhlIDxjb2RlPlJVTl9IT01FPC9jb2RlPiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gdG8gd2hpY2gKKyAgICAgICAgIHlvdSdkIGxpa2UgdGhlIFdvcmtmbG93IE1hbmFnZXIgUElEIGZpbGUgd3JpdHRlbi4gVHlwaWNhbGx5IHRoaXMgc2hvdWxkIGRlZmF1bHQgdG8gCisgICAgICAgICA8Y29kZT4vdmFyL3J1bjwvY29kZT4sIGJ1dCBub3QgYWxsIHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBhbGxvdyB1c2VycyB0byB3cml0ZSAKKyAgICAgICAgIHRvIDxjb2RlPi92YXIvcnVuPC9jb2RlPi48L2xpPgorICAgICAgIDwvdWw+CisgICAgICAgCisgICAgICAgPHA+VGhlIHNlY29uZCBzdGVwIGluIGNvbmZpZ3VyYXRpb24gaXMgdG8gZWRpdCAKKyAgICAgICA8Y29kZT4kV09SS0ZMT1dfSE9NRS9iaW4vd21nci1jbGllbnQ8L2NvZGU+IHNjcmlwdCwgbWFraW5nIHRoZSBmb2xsb3dpbmcgCisgICAgICAgY2hhbmdlOjwvcD4KKyAgICAgICAKKyAgICAgICA8dWw+CisgICAgICAgICAgPGxpPlNldCB0aGUgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gb2YgCisgICAgICAgICAgeW91ciBpbnN0YWxsZWQgSlJFIHJ1bnRpbWUuPC9saT4KKyAgICAgICA8L3VsPgorICAgICAgIAorICAgICAgIDxwPkluIHRoZSB0aGlyZCBzdGVwIG9mIHRoaXMgY29uZmlndXJhdGlvbiwgeW91IHdpbGwgc2V0IHRoZSBXb3JrZmxvdyBNYW5hZ2VyJ3MKKyAgICAgICB2YXJpb3VzIGV4dGVuc2lvbiBwb2ludHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdW5jdGlvbmFsaXR5IG9mCisgICAgICAgdGhlc2UgZXh0ZW5zaW9uIHBvaW50cywgc2VlIG91ciAKKyAgICAgICA8YSBocmVmPSIuLi9kZXZlbG9wbWVudC9kZXZlbG9wZXIuaHRtbCI+RGV2ZWxvcGVyIEd1aWRlLjwvYT4gQnkgZGVmYXVsdCwgCisgICAgICAgdGhlIFdvcmtmbG93IE1hbmFnZXIgaXMgYnVpbHQgdG8gdXNlIHRoZSBYTUwtYmFzZWQgV29ya2Zsb3cgUmVwb3NpdG9yeSwgdGhlIAorICAgICAgIFRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZSwgYW5kIDxhIGhyZWY9Imh0dHA6Ly9sdWNlbmUuYXBhY2hlLm9yZy8iPkx1Y2VuZTwvYT4gCisgICAgICAgV29ya2Zsb3cgSW5zdGFuY2UgUmVwb3NpdG9yeSBleHRlbnNpb24gcG9pbnRzLjwvcD4gCisgICAgICAgCisgICAgICAgPHA+TWFrZSB0aGUgZm9sbG93aW5nIGNoYW5nZXMgdG8gCisgICAgICAgPGNvZGU+JFdPUktGTE9XX0hPTUUvZXRjL3dvcmtmbG93LnByb3BlcnRpZXM8L2NvZGU+OjwvcD4KKyAgICAgICAKKyAgICAgICA8dWw+ICAgICAKKyAgICAgICAgIDxsaT5TcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIFdvcmtmbG93IE1hbmFnZXIgd2lsbCBjcmVhdGUgdGhlCisgICAgICAgICBMdWNlbmUgaW5kZXggYW5kIGFzc29jaWF0ZWQgZmlsZXMgYnkgc2V0dGluZyB0aGUgCisgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLmx1Y2VuZS5pZHhQYXRoPC9jb2RlPiBwcm9wZXJ0eQorICAgICAgICAgdG8gPGNvZGU+JFdPUktGTE9XX0hPTUUvcmVwbzwvY29kZT4uIE1ha2Ugc3VyZSB0aGF0IHRoaXMgZGlyZWN0b3J5IGRvZXMKKyAgICAgICAgIE5PVCBleGlzdCB0aGUgdGltZSB5b3UgcnVuIHRoZSBXb3JrZmxvdyBNYW5hZ2VyLiBJZiB0aGUgV29ya2Zsb3cgTWFuYWdlciBkb2VzIAorICAgICAgICAgbm90IGZpbmQgYSBkaXJlY3RvcnkgYXQgdGhpZSBzcGVjaWZpZWQgbG9jYXRpb24sIGl0IHdpbGwgY3JlYXRlIGFsbCBvZiB0aGUgCisgICAgICAgICBuZWNlc3NhcnkgZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgYW5jaWxsYXJ5IGZpbGVzLjwvbGk+CisgICAgICAgICAKKyAgICAgICAgIDxsaT5TcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIFhNTCBwb2xpY3kgZmlsZXMgYXJlIHN0b3JlZCAKKyAgICAgICAgIGZvciB0aGUgdGhlIFhNTCBXb3JrZmxvdyBSZXBvc2l0b3J5LiBUaGlzIHBhdGggaXMgc2V0IGJ5IAorICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRpcnM8L2NvZGU+LiBUaGUgCisgICAgICAgICBkZWZhdWx0IGxvY2F0aW9uIChhbmQgZGVmYXVsdCBwb2xpY3kgZmlsZXMpIGFyZSBsb2NhdGVkIGF0IAorICAgICAgICAgPGNvZGU+JFdPUktGTE9XX0hPTUUvcG9saWN5PC9jb2RlPiBpbiB0aGUgdmFuaWxsYSBkZXBsb3ltZW50IG9mIHRoZSBXb3JrZmxvdyBNYW5hZ2VyLgorICAgICAgICAgTm90ZSB0aGF0IHRoZXNlIHByb3BlcnRpZXMgbmVlZCB0byBiZSBmdWxseSBzcGVjaWZpZWQgVVJMcyAoZS5nLiwgdGhleSBzaG91bGQgCisgICAgICAgICBzdGFydCB3aXRoIDxjb2RlPmZpbGU6Ly88L2NvZGU+KS48L2xpPgorICAgICAgIDwvdWw+CisKKyAgICAgICA8ZGl2IGNsYXNzPSJpbmZvIj5PcHRpb25hbGx5LCB5b3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBsb2dnaW5nIHByb3BlcnRpZXMgZm9yCisgICAgICAgdGhlIENBUyBXb3JrZmxvdyBNYW5hZ2VyLiBUaGlzIGlzIGRvbmUgYnkgZWRpdGluZyAKKyAgICAgICA8Y29kZT4kV09SS0ZMT1dfSE9NRS9ldGMvbG9nZ2luZy5wcm9wZXJ0aWVzPC9jb2RlPi4gV2UgaGF2ZSB0cmllZCB0byBzZWxlY3Qgc2Vuc2libGUKKyAgICAgICBkZWZhdWx0cyBmb3IgdGhlIGF2ZXJhZ2UgdXNlciwgYnV0IGlmIHlvdSB3b3VsZCBsaWtlIG1vcmUgb3IgbGVzcyBpbmZvcm1hdGlvbiAKKyAgICAgICBnZW5lcmF0ZWQgaW4gdGhlIFdvcmtmbG93IE1hbmFnZXIgbG9ncywgeW91IGNhbiBlZGl0IHRoZSBsZXZlbHMgb2YgZGlmZmVyZW50IGNhdGFnb3JpZXMKKyAgICAgICBvZiBpbmZvcm1hdGlvbiBpbiB0aGlzIHByb3BvcnRpZXMgZmlsZS4gVGhlIGZvbGxvd2luZyBsb2dnaW5nIGxldmVscyBhcmUgYXZhaWxhYmxlOgorICAgICAgIDxjb2RlPklORk88L2NvZGU+LCA8Y29kZT5XQVJOSU5HPC9jb2RlPiwgPGNvZGU+RklORTwvY29kZT4sIDxjb2RlPkZJTkVSPC9jb2RlPiwKKyAgICAgICA8Y29kZT5GSU5FU1Q8L2NvZGU+LCBhbmQgPGNvZGU+QUxMPC9jb2RlPi48L2Rpdj4KKyAgIAorICAgICAgPHA+V2l0aCB0aGlzIGxhc3Qgc3RlcCwgeW91IGhhdmUgY29uZmlndXJlZCB0aGUgV29ya2Zsb3cgTWFuYWdlci4gSW4gb3JkZXIgdG8gdGVzdCB5b3VyIAorICAgICAgY29uZmlndXJhdGlvbiwgY2QgdG8gPGNvZGU+JFdPUktGTE9XX0hPTUUvYmluPC9jb2RlPiBhbmQgdHlwZTo8L3A+CisgICAgICAgCisgICAgICA8c291cmNlPgorPiAuL3dtZ3Igc3RhcnQKKyAgICAgIDwvc291cmNlPiAKKyAgICAgICAKKyAgICAgIDxwPlRoaXMgd2lsbCBzdGFydHVwIHRoZSB3b3JrZmxvdyBtYW5hZ2VyIFhNTC1SUEMgc2VydmVyIGludGVyZmFjZS4gWW91ciBXb3JrZmxvdyBNYW5hZ2VyIAorICAgICAgaXMgbm93IHJlYWR5IHRvIHJ1biEgWW91IGNhbiB0ZXN0IG91dCB0aGUgd29ya2Zsb3cgbWFuYWdlciBieSBydW5uaW5nIGEgY29tbWFuZCB0aGF0IAorICAgICAgd2lsbCBleGVjdXRlIG91ciBwcmVjb25maWd1cmVkIGhlbGxvIHdvcmxkIHdvcmtmbG93LjwvcD4KKworICAgICAgPHA+UnVuIHRoZSBiZWxvdyBjb21tYW5kLCBhc3N1bWluZyB0aGF0IHlvdSBzdGFydGVkIHRoZSBXb3JrZmxvdyBNYW5hZ2VyIG9uIHRoZSBkZWZhdWx0IAorICAgICAgcG9ydCBvZiA5MDAxOjwvcD4KKyAgICAgIAorICAgICAgPHNvdXJjZT4KKz4gLi93bWdyLWNsaWVudCAtLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDEgLS1vcGVyYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZW5kRXZlbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1ldmVudE5hbWUgdGVzdCAKKyAgICAgIDwvc291cmNlPiAKKyAgICAgIAorICAgICAgPHA+WW91IHNob3VsZCBzZWUgYSB2YXJpZXR5IG9mIGluZm8gbWVzc2FnZXMsIGluIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgIAorICAgICAgPHNvdXJjZT4KK0lORk86IFdvcmtmbG93TWFuYWdlcjogUmVjZWl2ZWQgZXZlbnQ6IHRlc3QKK0lORk86IFdvcmtmbG93TWFuYWdlcjogV29ya2Zsb3cgdGVzdFdvcmtmbG93IHJldHJpZXZlZCBmb3IgZXZlbnQgdGVzdAorSU5GTzogVGFzazogW0hlbGxvIFdvcmxkXSBoYXMgbm8gcmVxdWlyZWQgbWV0YWRhdGEgZmllbGRzCitJTkZPOiBFeGVjdXRpbmcgdGFzazogW0hlbGxvIFdvcmxkXSBsb2NhbGx5CitIZWxsbyBXb3JsZDogQ2hyaXMKK0lORk86IFRhc2s6IFtHb29kYnllIFdvcmxkXSBoYXMgbm8gcmVxdWlyZWQgbWV0YWRhdGEgZmllbGRzCitJTkZPOiBFeGVjdXRpbmcgdGFzazogW0dvb2RieWUgV29ybGRdIGxvY2FsbHkKKyBHb29kYnllIFdvcmxkOiBDaHJpcyAgICAgICAgICAgIAorICAgICAgPC9zb3VyY2U+CisgICAgICAKKyAgICAgIDxwPk5vdGUgdGhhdCB3ZSBoYXZlIGVsaWRlZCBzb21lIG9mIHRoZSB0aW1lc3RhbXAgaW5mb3JtYXRpb24gZm9yIHRoZSBwdXJwb3NlcyBvZiAKKyAgICAgIGNsYXJpdHkuIElmIHlvdSBzZWUgdGhlIGNhbm5vbmljYWwgSGVsbG8gV29ybGQgc3RhdGVtZW50LCB5b3UgaGF2ZSBzdWNjZWVkZWQgaW4gCisgICAgICBjb25maWd1cmluZyB0aGUgQ0FTIFdvcmtmbG93IE1hbmFnZXIsIGhvcGVmdWxseSBpbiAyIG1pbnV0ZXMgb3IgbGVzcyAoYW5kIGV2ZW4gaWYgCisgICAgICBpdCB0b29rIGEgbGl0dGxlIG1vcmUgdGltZSwgeW91IGhhdmUgdG8gYWRtaXQgaXQgd2FzIGJ5IGFuZCBsYXJnZSBwYWlubGVzcykuPC9wPgorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICAgICAKKyAgICAgIDxhIG5hbWU9InNlY3Rpb24zIi8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJMZWFybiBCeSBFeGFtcGxlIj4KKyAgICAgIDxwPkNvbWluZyBTb29uLi4uPC9wPgorICAgICAgPC9zZWN0aW9uPgorICAgICAgCisgICAgICA8c2VjdGlvbiBuYW1lPSJDb25jbHVzaW9uIj4KKyAgICAgIAorICAgICAgPHA+SW4gdGhpcyBCYXNpYyBVc2VyIEd1aWRlLCB3ZSBoYXZlIGNvdmVyZWQgYSBudW1iZXIgb2YgdG9waWNzLCBpbmNsdWRpbmcgV29ya2Zsb3cgCisgICAgICBNYW5hZ2VyIGluc3RhbGxhdGlvbiwgY29uZmlndXJhdGlvbiwgYW5kIGEgYmFzaWMgZXhhbXBsZSBvZiB1c2UuIEZvciBtb3JlIGFkdmFuY2VkIAorICAgICAgdG9waWNzLCBpbmNsdWRpbmcgdGhlIHVzZSBvZiBhbHRlcm5hdGl2ZSBxdWV1aW5nIHN0cmF0ZWdpZXMgYW5kIGJlc3QgcHJhY3RpY2VzIGZvciAKKyAgICAgIGFkZHJlc3NpbmJnIHNjYWxpbmcgaXNzdWVzLCBzZWUgb3VyIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBHdWlkZS48L2E+PC9wPgorICAgICAgCisgICAgICA8L3NlY3Rpb24+CisgICA8L2JvZHk+CisgICAKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3hkb2MvdXNlci9pbmRleC54bWwgYi8wLjEwL3dvcmtmbG93L3NyYy9zaXRlL3hkb2MvdXNlci9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyNmM1MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3NpdGUveGRvYy91c2VyL2luZGV4LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgIDxwcm9wZXJ0aWVzPgorICAgICAgPHRpdGxlPkNBUyBXb3JrZmxvdyBNYW5hZ2VyIFVzZXIgR3VpZGU8L3RpdGxlPgorICAgICAgPGF1dGhvciBlbWFpbD0iQ2hyaXMuTWF0dG1hbm5AanBsLm5hc2EuZ292Ij5DaHJpcyBNYXR0bWFubjwvYXV0aG9yPgorICAgICAgPGF1dGhvciBlbWFpbD0id29vbGxhcmRAanBsLm5hc2EuZ292Ij5EYXZlIFdvb2xsYXJkPC9hdXRob3I+CisgICA8L3Byb3BlcnRpZXM+CisKKyAgIDxib2R5PgorCisgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj5UaGlzIGRvY3VtZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlb3JnYW5pemVkIGFzCisgICAgICBwYXJ0IG9mIG91ciBvbmdvaW5nIGRvY3VtZW50YXRpb24gZWZmb3J0LiBQbGVhc2UgZm9sbG93IHRoZSBsaW5rcyBiZWxvdyB0byBmaW5kCisgICAgICBpbmZvcm1hdGlvbiB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gaG9zdGVkIG9uIHRoaXMgcGFnZS48L2Rpdj4KKyAKKworICAgICAgPHA+V2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHVwZ3JhZGluZyBPT0RUIGRvY3VtZW50YXRpb24uIEluIHRoZSBuZWFyCisgICAgICBmdXR1cmUsIHdlIGhvcGUgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgZGV2ZWxvcGVycyByZWdhcmRpbmcgZWFjaCAKKyAgICAgIGNvbXBvbmVudCwgaW5jbHVkaW5nIGl0cyBwdXJwb3NlLCBzdHJ1Y3R1cmUsIGludGVyZmFjZXMsIGFuZCAKKyAgICAgIGNvbmZpZ3VyYXRpb24gcG9pbnRzIGluIGEgPGEgaHJlZj0iLi4vZGV2ZWxvcG1lbnQvZGV2ZWxvcGVyLmh0bWwiPkRldmVsb3BlcgorICAgICAgR3VpZGUuPC9hPjwvcD4KKyAgICAgIAorICAgICAgPHA+SW5mb3JtYXRpb24gZm9yIHVzZXJzLCBpbmNsdWRpbmcgaW5zdGFsbGF0aW9uIGFuZCBiYXNpYyBjb25maWd1cmF0aW9uLAorICAgICAgYXMgd2VsbCBhcyBleGFtcGxlIHVzYWdlIGFyZSBwcm92aWRlZCBpbiBhIAorICAgICAgPGEgaHJlZj0iLi4vdXNlci9iYXNpYy5odG1sIj5CYXNpYyBVc2VyIEd1aWRlLjwvYT4gQWR2YW5jZWQgdG9waWNzLCBsaWtlCisgICAgICBsb29rIGFuZCBmZWVsLCBsZXNzb25zLWxlYXJuZWQsIGFuZCBiZXN0IHByYWN0aWNlcyBhcmUgcHJvdmlkZWQgaW4gYW4KKyAgICAgIDxhIGhyZWY9Ii4uL3VzZXIvYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgVXNlciBHdWlkZS48L2E+PC9wPgorICAgICAgCisgICAgICA8cD5GaW5hbGx5LCB3ZSBhcmUgcGxhbm5pbmcgdG8gcHJvdmlkZSBhIG51bWJlciBvZiBjYXNlIHN0dWRpZXMgaW4gdGhlIAorICAgICAgZnV0dXJlLCBpbiB3aGljaCBtdWx0aS1jb21wb25lbnQgZGVwbG95bWVudHMgYXJlIGNvbmZpZ3VyZWQgdG8gaGFuZGxlCisgICAgICBjb21tb24gZGF0YSBhbmQgY29tcHV0YXRpb24gbWFuYWdlbWVudCBzY2VuYXJpb3MuPC9wPiAKKworICAgPC9ib2R5PgorPC9kb2N1bWVudD4gCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvVGVzdFdvcmtmbG93Q2xpLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9jbGkvVGVzdFdvcmtmbG93Q2xpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmNGU5MQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9UZXN0V29ya2Zsb3dDbGkuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmNsaTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5DbWRMaW5lVXRpbGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS51dGlsLk9wdGlvblByb3BlcnR5UmVnaXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuTW9ja1dvcmtmbG93UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5Nb2NrWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLk1vY2tYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuTWV0aG9kQ2FsbERldGFpbHM7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvL0pVbml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgV29ya2Zsb3cgTWFuYWdlciBDbGllbnRzIENvbW1hbmQtbGluZSBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBiZm9zdGVyIChCcmlhbiBGb3N0ZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0V29ya2Zsb3dDbGkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgIHN0YXRpYyB7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2xpLmRlYnVnIiwgInRydWUiKTsKKyAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy5jbGkuYWN0aW9uLnNwcmluZy5jb25maWciLCAic3JjL21haW4vcmVzb3VyY2VzL2NtZC1saW5lLWFjdGlvbnMueG1sIik7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMuY2xpLm9wdGlvbi5zcHJpbmcuY29uZmlnIiwgInNyYy9tYWluL3Jlc291cmNlcy9jbWQtbGluZS1vcHRpb25zLnhtbCIpOworICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJ3b3JrZmxvdy5lbmdpbmUuZmFjdG9yeSIsICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5Nb2NrV29ya2Zsb3dFbmdpbmVGYWN0b3J5Iik7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIndvcmtmbG93LmVuZ2luZS5pbnN0YW5jZVJlcC5mYWN0b3J5IiwgIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uTWVtb3J5V29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5Iik7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIndvcmtmbG93LnJlcG8uZmFjdG9yeSIsICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnkuTW9ja1dvcmtmbG93UmVwb3NpdG9yeUZhY3RvcnkiKTsKKyAgIH0KKworICAgcHJpdmF0ZSBDbWRMaW5lVXRpbGl0eSBjbWRMaW5lVXRpbGl0eTsKKyAgIHByaXZhdGUgTW9ja1htbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGNtZExpbmVVdGlsaXR5ID0gbmV3IENtZExpbmVVdGlsaXR5KCk7CisgICAgICBVc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlIGFjdGlvblN0b3JlID0gbmV3IFVzZU1vY2tDbGllbnRDbWRMaW5lQWN0aW9uU3RvcmUoKTsKKyAgICAgIGNsaWVudCA9IGFjdGlvblN0b3JlLmdldENsaWVudCgpOworICAgICAgY21kTGluZVV0aWxpdHkuc2V0QWN0aW9uU3RvcmUoYWN0aW9uU3RvcmUpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBPcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyLmNsZWFyUmVnaXN0ZXIoKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdER5bldvcmtmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWR5bldvcmtmbG93IC0tdGFza0lkcyAiCisgICAgICAgICAgICAgICAgICArIE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkuVEFTSzFfSUQgKyAiICIKKyAgICAgICAgICAgICAgICAgICsgTW9ja1dvcmtmbG93UmVwb3NpdG9yeS5UQVNLMl9JRCArICIgIgorICAgICAgICAgICAgICAgICAgKyBNb2NrV29ya2Zsb3dSZXBvc2l0b3J5LlRBU0szX0lECisgICAgICAgICAgICAgICAgICArICIgLS1tZXRhRGF0YSAtLWtleSBGaWxlbmFtZSBkYXRhLmRhdCAtLWtleSBOb21pbmFsRGF0ZSAyMDAxLTAyLTIwIikKKyAgICAgICAgICAgICAgICAgIC5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJleGVjdXRlRHluYW1pY1dvcmtmbG93IiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QoTW9ja1dvcmtmbG93UmVwb3NpdG9yeS5UQVNLMV9JRCwKKyAgICAgICAgICAgIE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkuVEFTSzJfSUQsIE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkuVEFTSzNfSUQpLAorICAgICAgICAgICAgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBtLmFkZE1ldGFkYXRhKCJOb21pbmFsRGF0ZSIsIExpc3RzLm5ld0FycmF5TGlzdCgiMjAwMS0wMi0yMCIpKTsKKyAgICAgIG0uYWRkTWV0YWRhdGEoIkZpbGVuYW1lIiwgTGlzdHMubmV3QXJyYXlMaXN0KCJkYXRhLmRhdCIpKTsKKyAgICAgIGFzc2VydEVxdWFscyhtLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDEpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldENvbmRpdGlvbkJ5SWQoKSB7CisgICAgICBjbWRMaW5lVXRpbGl0eQorICAgICAgICAgICAgLnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldENvbmRpdGlvbkJ5SWQgLS1pZCAiCisgICAgICAgICAgICAgICAgICArIE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkuQ09ORElUSU9OMV9JRCkKKyAgICAgICAgICAgICAgICAgIC5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDb25kaXRpb25CeUlkIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhNb2NrV29ya2Zsb3dSZXBvc2l0b3J5LkNPTkRJVElPTjFfSUQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Rmlyc3RQYWdlKCkgeworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0Rmlyc3RQYWdlIikuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0Rmlyc3RQYWdlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKworICAgICAgT3B0aW9uUHJvcGVydHlSZWdpc3Rlci5jbGVhclJlZ2lzdGVyKCk7CisKKyAgICAgIFN0cmluZyBzdGF0dXMgPSAiRE9ORSI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRGaXJzdFBhZ2UgLS1zdGF0dXMgIiArIHN0YXR1cykuc3BsaXQoIiAiKSk7CisgICAgICBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygicGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDEpKTsKKyAgIH0KKyAKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYXN0UGFnZSgpIHsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldExhc3RQYWdlIikuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0TGFzdFBhZ2UiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworCisgICAgICBPcHRpb25Qcm9wZXJ0eVJlZ2lzdGVyLmNsZWFyUmVnaXN0ZXIoKTsKKworICAgICAgU3RyaW5nIHN0YXR1cyA9ICJET05FIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldExhc3RQYWdlIC0tc3RhdHVzICIgKyBzdGF0dXMpLnNwbGl0KCIgIikpOworICAgICAgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cywgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgxKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXROZXh0UGFnZSgpIHsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldE5leHRQYWdlIC0tcGFnZU51bSAxIikuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygicGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisKKyAgICAgIE9wdGlvblByb3BlcnR5UmVnaXN0ZXIuY2xlYXJSZWdpc3RlcigpOworCisgICAgICBTdHJpbmcgc3RhdHVzID0gIkRPTkUiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0TmV4dFBhZ2UgLS1wYWdlTnVtIDEgLS1zdGF0dXMgIiArIHN0YXR1cykuc3BsaXQoIiAiKSk7CisgICAgICBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygicGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDEpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFByZXZQYWdlKCkgeworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0UHJldlBhZ2UgLS1wYWdlTnVtIDEiKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJwYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKworICAgICAgT3B0aW9uUHJvcGVydHlSZWdpc3Rlci5jbGVhclJlZ2lzdGVyKCk7CisKKyAgICAgIFN0cmluZyBzdGF0dXMgPSAiRE9ORSI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRQcmV2UGFnZSAtLXBhZ2VOdW0gMSAtLXN0YXR1cyAiICsgc3RhdHVzKS5zcGxpdCgiICIpKTsKKyAgICAgIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJwYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMSkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVnaXN0ZXJlZEV2ZW50cygpIHsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldFJlZ2lzdGVyZWRFdmVudHMiKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRSZWdpc3RlcmVkRXZlbnRzIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydFRydWUobWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmlzRW1wdHkoKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXNrQnlJZCgpIHsKKyAgICAgIFN0cmluZyB0YXNrSWQgPSBNb2NrV29ya2Zsb3dSZXBvc2l0b3J5LlRBU0sxX0lEOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0VGFza0J5SWQgLS1pZCAiICsgdGFza0lkKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRUYXNrQnlJZCIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHModGFza0lkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFRhc2tXYWxsQ2xvY2tUaW1lKCkgeworICAgICAgU3RyaW5nIHRhc2tJZCA9IE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkuVEFTSzFfSUQ7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRUYXNrV2FsbENsb2NrVGltZSAtLWlkICIgKyB0YXNrSWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyh0YXNrSWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2FsbENsb2NrVGltZSgpIHsKKyAgICAgIFN0cmluZyB0YXNrSWQgPSBNb2NrV29ya2Zsb3dSZXBvc2l0b3J5LlRBU0sxX0lEOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0V2FsbENsb2NrVGltZSAtLWlkICIgKyB0YXNrSWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRFcXVhbHModGFza0lkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtmbG93QnlJZCgpIHsKKyAgICAgIFN0cmluZyB3b3JrZmxvd0lkID0gTW9ja1dvcmtmbG93UmVwb3NpdG9yeS5XT1JLRkxPVzFfSUQ7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRXb3JrZmxvd0J5SWQgLS1pZCAiICsgd29ya2Zsb3dJZCkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0V29ya2Zsb3dCeUlkIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyh3b3JrZmxvd0lkLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDApKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtmbG93SW5zdCgpIHsKKyAgICAgIFN0cmluZyBpbnN0SWQgPSAiVGVzdElkIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldFdvcmtmbG93SW5zdCAtLWlkICIgKyBpbnN0SWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFdvcmtmbG93Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpbnN0SWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2Zsb3dJbnN0TWV0KCkgeworICAgICAgU3RyaW5nIGluc3RJZCA9ICJUZXN0SWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tZ2V0V29ya2Zsb3dJbnN0TWV0IC0taWQgIiArIGluc3RJZCkuc3BsaXQoIiAiKSk7CisgICAgICBNZXRob2RDYWxsRGV0YWlscyBtZXRob2RDYWxsRGV0YWlscyA9IGNsaWVudC5nZXRMYXN0TWV0aG9kQ2FsbERldGFpbHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygiZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpbnN0SWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2Zsb3dJbnN0cygpIHsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLWdldFdvcmtmbG93SW5zdHMiKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRXb3JrZmxvd0luc3RhbmNlcyIsIG1ldGhvZENhbGxEZXRhaWxzLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICBhc3NlcnRUcnVlKG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5pc0VtcHR5KCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2Zsb3dzQnlFdmVudCgpIHsKKyAgICAgIFN0cmluZyBldmVudE5hbWUgPSAiVGVzdEV2ZW50TmFtZSI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRXb3JrZmxvd3NCeUV2ZW50IC0tZXZlbnROYW1lICIgKyBldmVudE5hbWUpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoImdldFdvcmtmbG93c0J5RXZlbnQiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrZmxvd3MoKSB7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1nZXRXb3JrZmxvd3MiKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRXb3JrZmxvd3MiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0VHJ1ZShtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuaXNFbXB0eSgpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFBhdXNlV29ya2Zsb3dJbnN0KCkgeworICAgICAgU3RyaW5nIGluc3RJZCA9ICJUZXN0SWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tcGF1c2VXb3JrZmxvd0luc3QgLS1pZCAiICsgaW5zdElkKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJwYXVzZVdvcmtmbG93SW5zdGFuY2UiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGluc3RJZCwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bWVXb3JrZmxvd0luc3QoKSB7CisgICAgICBTdHJpbmcgaW5zdElkID0gIlRlc3RJZCI7CisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICArICIgLS1vcGVyYXRpb24gLS1yZXN1bWVXb3JrZmxvd0luc3QgLS1pZCAiICsgaW5zdElkKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bWVXb3JrZmxvd0luc3RhbmNlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpbnN0SWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEV2ZW50KCkgeworICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9ICJUZXN0RXZlbnROYW1lIjsKKyAgICAgIGNtZExpbmVVdGlsaXR5LnJ1bigoIi0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIKKyAgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLXNlbmRFdmVudCAtLWV2ZW50TmFtZSAiICsgZXZlbnROYW1lKS5zcGxpdCgiICIpKTsKKyAgICAgIE1ldGhvZENhbGxEZXRhaWxzIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzZW5kRXZlbnQiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisKKyAgICAgIE9wdGlvblByb3BlcnR5UmVnaXN0ZXIuY2xlYXJSZWdpc3RlcigpOworCisgICAgICBjbWRMaW5lVXRpbGl0eS5ydW4oKCItLXVybCBodHRwOi8vbG9jYWxob3N0OjkwMDAiCisgICAgICAgICAgICsgIiAtLW9wZXJhdGlvbiAtLXNlbmRFdmVudCAtLWV2ZW50TmFtZSAiICsgZXZlbnROYW1lCisgICAgICAgICAgICsgIiAtLW1ldGFEYXRhIC0ta2V5IEZpbGVuYW1lIGRhdGEuZGF0IC0ta2V5IE5vbWluYWxEYXRlIDIwMDEtMDItMjAiKS5zcGxpdCgiICIpKTsKKyAgICAgIG1ldGhvZENhbGxEZXRhaWxzID0gY2xpZW50LmdldExhc3RNZXRob2RDYWxsRGV0YWlscygpOworICAgICAgYXNzZXJ0RXF1YWxzKCJzZW5kRXZlbnQiLCBtZXRob2RDYWxsRGV0YWlscy5nZXRNZXRob2ROYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TmFtZSwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0QXJncygpLmdldCgwKSk7CisgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICBtLmFkZE1ldGFkYXRhKCJGaWxlbmFtZSIsIExpc3RzLm5ld0FycmF5TGlzdCgiZGF0YS5kYXQiKSk7CisgICAgICBtLmFkZE1ldGFkYXRhKCJOb21pbmFsRGF0ZSIsIExpc3RzLm5ld0FycmF5TGlzdCgiMjAwMS0wMi0yMCIpKTsKKyAgICAgIGFzc2VydEVxdWFscyhtLCBtZXRob2RDYWxsRGV0YWlscy5nZXRBcmdzKCkuZ2V0KDEpKTsKKyAgIH0KKworICAgcHVibGljIHZvaWQgdGVzdFN0b3BXb3JrZmxvd0luc3RhbmNlKCkgeworICAgICAgU3RyaW5nIGluc3RJZCA9ICJUZXN0SWQiOworICAgICAgY21kTGluZVV0aWxpdHkucnVuKCgiLS11cmwgaHR0cDovL2xvY2FsaG9zdDo5MDAwIgorICAgICAgICAgICAgKyAiIC0tb3BlcmF0aW9uIC0tc3RvcFdvcmtmbG93SW5zdCAtLWlkICIgKyBpbnN0SWQpLnNwbGl0KCIgIikpOworICAgICAgTWV0aG9kQ2FsbERldGFpbHMgbWV0aG9kQ2FsbERldGFpbHMgPSBjbGllbnQuZ2V0TGFzdE1ldGhvZENhbGxEZXRhaWxzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoInN0b3BXb3JrZmxvd0luc3RhbmNlIiwgbWV0aG9kQ2FsbERldGFpbHMuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpbnN0SWQsIG1ldGhvZENhbGxEZXRhaWxzLmdldEFyZ3MoKS5nZXQoMCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvY2xpL1VzZU1vY2tDbGllbnRDbWRMaW5lQWN0aW9uU3RvcmUuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9Vc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1Y2I1YQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2NsaS9Vc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uQ21kTGluZUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3RvcmUuc3ByaW5nLlNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5leGNlcHRpb24uQ21kTGluZUFjdGlvblN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuY2xpLmFjdGlvbi5Xb3JrZmxvd0NsaUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbS5Nb2NrWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIEEge0BsaW5rIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZX0gd2hpY2ggc2V0cyB7QGxpbmsgV29ya2Zsb3dDbGlBY3Rpb259cworICogdG8gdXNlIGEge0BsaW5rIE1vY2tYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnR9LgorICoKKyAqIEBhdXRob3IgYmZvc3RlciAoQnJpYW4gRm9zdGVyKQorICovCitwdWJsaWMgY2xhc3MgVXNlTW9ja0NsaWVudENtZExpbmVBY3Rpb25TdG9yZSBleHRlbmRzIFNwcmluZ0NtZExpbmVBY3Rpb25TdG9yZSB7CisKKyAgIHByaXZhdGUgTW9ja1htbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCBjbGllbnQ7CisKKyAgIHB1YmxpYyBVc2VNb2NrQ2xpZW50Q21kTGluZUFjdGlvblN0b3JlKCkgeworICAgICAgc3VwZXIoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQuY2FzLmNsaS5hY3Rpb24uc3ByaW5nLmNvbmZpZyIpKTsKKyAgICAgIHRyeSB7CisgICAgICAgICBjbGllbnQgPSBuZXcgTW9ja1htbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgfQorCisgICBwdWJsaWMgU2V0PENtZExpbmVBY3Rpb24+IGxvYWRTdXBwb3J0ZWRBY3Rpb25zKCkgdGhyb3dzIENtZExpbmVBY3Rpb25TdG9yZUV4Y2VwdGlvbiB7CisgICAgICBTZXQ8Q21kTGluZUFjdGlvbj4gYWN0aW9ucyA9IHN1cGVyLmxvYWRTdXBwb3J0ZWRBY3Rpb25zKCk7CisgICAgICBmb3IgKENtZExpbmVBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFdvcmtmbG93Q2xpQWN0aW9uKSB7CisgICAgICAgICAgICAoKFdvcmtmbG93Q2xpQWN0aW9uKSBhY3Rpb24pLnNldENsaWVudChjbGllbnQpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICB9CisKKyAgIHB1YmxpYyBNb2NrWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgIHJldHVybiBjbGllbnQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvTWV0U2V0dGVyVGFza1F1ZXJpZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9NZXRTZXR0ZXJUYXNrUXVlcmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTViYzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvTWV0U2V0dGVyVGFza1F1ZXJpZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuVGFza1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUHJpb3JpdHlTb3J0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuZGF0ZS5EYXRlVXRpbHM7CisKKy8qKgorICogCisgKiBJbnRlcmNlcHRzIHRoZSBjYWxscyB0byB7QGxpbmsgVGFza1F1ZXJpZXIjZ2V0TmV4dCgpfSBhbmQgaW5qZWN0cworICogU3RhcnREYXRlVGltZSAoYW5kIHBvdGVudGlhbGx5IG90aGVyIG1ldCBmaWVsZHMgaW50byB0aGUKKyAqIHtAbGluayBUYXNrUHJvY2Vzc29yI2dldER5bmFtaWNNZXRhZGF0YSgpfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRTZXR0ZXJUYXNrUXVlcmllciBleHRlbmRzIFRhc2tRdWVyaWVyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfU0VDUz0xOworICAKKyAgLyoqCisgICAqIEBwYXJhbSBwcm9jZXNzb3JRdWV1ZQorICAgKiBAcGFyYW0gcHJpb3JpdGl6ZXIKKyAgICovCisgIHB1YmxpYyBNZXRTZXR0ZXJUYXNrUXVlcmllcihXb3JrZmxvd1Byb2Nlc3NvclF1ZXVlIHByb2Nlc3NvclF1ZXVlLAorICAgICAgUHJpb3JpdHlTb3J0ZXIgcHJpb3JpdGl6ZXIpIHsKKyAgICBzdXBlcihwcm9jZXNzb3JRdWV1ZSwgcHJpb3JpdGl6ZXIsIG51bGwsIFdBSVRfU0VDUyk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLlRhc2tRdWVyaWVyI2dldE5leHQoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUYXNrUHJvY2Vzc29yIGdldE5leHQoKSB7CisgICAgVGFza1Byb2Nlc3NvciB0YXNrUHJvY2Vzc29yID0gc3VwZXIuZ2V0TmV4dCgpOworICAgIGlmKHRhc2tQcm9jZXNzb3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJTdGFydERhdGVUaW1lIiwgRGF0ZVV0aWxzLnRvU3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkpKTsKKyAgICB0YXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTaGFyZWRDb250ZXh0KG1ldCk7CisgICAgcmV0dXJuIHRhc2tQcm9jZXNzb3I7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL01vY2tQcm9jZXNzb3JRdWV1ZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL01vY2tQcm9jZXNzb3JRdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDI4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvTW9ja1Byb2Nlc3NvclF1ZXVlLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZTsKKworLyoqCisgKiAKKyAqIEEgbW9jayB7QGxpbmsgV29ya2Zsb3dQcm9jZXNzb3JRdWV1ZX0gb2JqZWN0IGZvciB1c2UgaW4gdGVzdGluZy4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUHJvY2Vzc29yUXVldWUgZXh0ZW5kcyBXb3JrZmxvd1Byb2Nlc3NvclF1ZXVlIHsKKworICBwcml2YXRlIFF1ZXJpZXJBbmRSdW5uZXJVdGlscyB1dGlsczsKKworICBwcml2YXRlIGJvb2xlYW4gY29uc3VtZWQ7CisKKyAgcHVibGljIE1vY2tQcm9jZXNzb3JRdWV1ZSgpIHsKKyAgICBzdXBlcihudWxsLG51bGwsbnVsbCk7CisgICAgdGhpcy51dGlscyA9IG5ldyBRdWVyaWVyQW5kUnVubmVyVXRpbHMoKTsKKyAgICB0aGlzLmNvbnN1bWVkID0gZmFsc2U7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLldvcmtmbG93UHJvY2Vzc29yUXVldWUjZ2V0UHJvY2Vzc29ycyAoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29ycygpIHsKKyAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBwcm9jZXNzb3JzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgICB0cnkgeworICAgICAgaWYgKCFjb25zdW1lZCkgeworICAgICAgICBwcm9jZXNzb3JzLmFkZCh1dGlscy5nZXRQcm9jZXNzb3IoMTAuMCwgIlN1Y2Nlc3MiLCAiZG9uZSIpKTsKKyAgICAgICAgcHJvY2Vzc29ycy5hZGQodXRpbHMuZ2V0UHJvY2Vzc29yKDIuMCwgIkxvYWRlZCIsICJpbml0aWFsIikpOworICAgICAgICBwcm9jZXNzb3JzLmFkZCh1dGlscy5nZXRQcm9jZXNzb3IoNy4wLCAiTG9hZGVkIiwgImluaXRpYWwiKSk7CisgICAgICAgIHRoaXMuY29uc3VtZWQgPSB0cnVlOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb2Nlc3NvcnM7CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9RdWVyaWVyQW5kUnVubmVyVXRpbHMuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9RdWVyaWVyQW5kUnVubmVyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgzNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1F1ZXJpZXJBbmRSdW5uZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5TZXF1ZW50aWFsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5UYXNrUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuV29ya2Zsb3dQcm9jZXNzb3JCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlBhcmVudENoaWxkV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLlByaW9yaXR5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CisKKy8qKgorICogCisgKiBVdGlsaXRpZXMgZm9yIHRlc3RpbmcgdGhlIHtAbGluayBUYXNrUXVlcmllcn0gYW5kIHtAbGluayBUYXNrUnVubmVyfSB0aHJlYWQKKyAqIGNsYXNzZXMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUXVlcmllckFuZFJ1bm5lclV0aWxzIHsKKworICBwcml2YXRlIGludCBkYXRlR2VuOworICAKKyAgcHVibGljIFF1ZXJpZXJBbmRSdW5uZXJVdGlscygpIHsKKyAgICB0aGlzLmRhdGVHZW4gPSAwOworICB9CisgIAorICBwdWJsaWMgV29ya2Zsb3dUYXNrIGdldFRhc2soRmlsZSB0ZXN0RGlyKXsKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICB0YXNrLnNldENvbmRpdGlvbnMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIHRhc2suc2V0UmVxdWlyZWRNZXRGaWVsZHMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIHRhc2suc2V0VGFza0lkKCJ1cm46Y2FzOndvcmtmbG93OnRlc3RlciIpOworICAgIHRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKFNpbXBsZVRlc3Rlci5jbGFzcy5nZXROYW1lKCkpOworICAgIHRhc2suc2V0VGFza05hbWUoIlRlc3RlciIpOworICAgIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oKTsKKyAgICBjb25maWcuYWRkQ29uZmlnUHJvcGVydHkoIlRlc3REaXJQYXRoIiwKKyAgICAgICAgdGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLyIpID8gdGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgOiB0ZXN0RGlyLmdldEFic29sdXRlUGF0aCgpICsgIi8iKTsKKyAgICB0YXNrLnNldFRhc2tDb25maWcoY29uZmlnKTsKKyAgICByZXR1cm4gdGFzazsKKyAgfQorCisgIHB1YmxpYyBXb3JrZmxvd1Byb2Nlc3NvciBnZXRQcm9jZXNzb3IoZG91YmxlIHByaW9yaXR5LCBTdHJpbmcgc3RhdGVOYW1lLAorICAgICAgU3RyaW5nIGNhdGVnb3J5TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlTWFuYWdlciA9IG5ldyBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIoCisgICAgICAgICIuL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy93ZW5naW5lL3dlbmdpbmUtbGlmZWN5Y2xlLnhtbCIpOworICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdCA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgRGF0ZSBzZCA9IG5ldyBEYXRlKCk7CisgICAgc2Quc2V0VGltZShzZC5nZXRUaW1lKCkgKyAodGhpcy5kYXRlR2VuICogNTAwMCkpOworICAgIHRoaXMuZGF0ZUdlbisrOworICAgIGluc3Quc2V0U3RhcnREYXRlKHNkKTsKKyAgICBpbnN0LnNldElkKCJ0YXNrLXdpbnN0LSIgKyBwcmlvcml0eSk7CisgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KG5ldyBHcmFwaCgpKTsKKyAgICB3b3JrZmxvdy5nZXRUYXNrcygpLmFkZChnZXRUYXNrKGdldFRtcFBhdGgoKSkpOworICAgIGluc3Quc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgaW5zdC5zZXRQcmlvcml0eShQcmlvcml0eS5nZXRQcmlvcml0eShwcmlvcml0eSkpOworICAgIGluc3Quc2V0Q3VycmVudFRhc2tJZCh3b3JrZmxvdy5nZXRUYXNrcygpLmdldCgwKS5nZXRUYXNrSWQoKSk7CisgICAgaW5zdC5zZXRQYXJlbnRDaGlsZFdvcmtmbG93KHdvcmtmbG93KTsKKyAgICBXb3JrZmxvd1Byb2Nlc3NvckJ1aWxkZXIgYnVpbGRlciA9IFdvcmtmbG93UHJvY2Vzc29yQnVpbGRlcgorICAgICAgICAuYVdvcmtmbG93UHJvY2Vzc29yKCkud2l0aExpZmVjeWNsZU1hbmFnZXIobGlmZWN5Y2xlTWFuYWdlcikKKyAgICAgICAgLndpdGhQcmlvcml0eShwcmlvcml0eSkud2l0aEluc3RhbmNlKGluc3QpOworICAgIFRhc2tQcm9jZXNzb3IgdGFza1Byb2Nlc3NvciA9IChUYXNrUHJvY2Vzc29yKSBidWlsZGVyCisgICAgICAgIC5idWlsZChUYXNrUHJvY2Vzc29yLmNsYXNzKTsKKyAgICB0YXNrUHJvY2Vzc29yLmdldFdvcmtmbG93SW5zdGFuY2UoKS5zZXRTdGF0ZShsaWZlY3ljbGVNYW5hZ2VyLmdldERlZmF1bHRMaWZlY3ljbGUoKS5jcmVhdGVTdGF0ZSgKKyAgICAgICAgc3RhdGVOYW1lLCBjYXRlZ29yeU5hbWUsICIiKSk7ICAgIAorICAgIHJldHVybiB0YXNrUHJvY2Vzc29yOworICB9CisgIAorICBwcml2YXRlIEZpbGUgZ2V0VG1wUGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbnsKKyAgICBGaWxlIHRlc3REaXIgPSBudWxsOworICAgIFN0cmluZyBwYXJlbnRQYXRoID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdCIsICJ0eHQiKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgcGFyZW50UGF0aCA9IHBhcmVudFBhdGguZW5kc1dpdGgoIi8iKSA/IHBhcmVudFBhdGg6cGFyZW50UGF0aCArICIvIjsKKyAgICBTdHJpbmcgdGVzdEpvYkRpclBhdGggPSBwYXJlbnRQYXRoICsgImpvYnMiOworICAgIHRlc3REaXIgPSBuZXcgRmlsZSh0ZXN0Sm9iRGlyUGF0aCk7CisgICAgdGVzdERpci5ta2RpcnMoKTsKKyAgICByZXR1cm4gdGVzdERpcjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvU2ltcGxlVGVzdGVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvU2ltcGxlVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyYzM3OAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9TaW1wbGVUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLldvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uOworCisvKioKKyAqIAorICogQSBzaW1wbGUgd29ya2Zsb3cgdGFzayBpbnN0YW5jZSB0aGF0IHdyaXRlcyBpdHMgc3RhcnQgZGF0ZSB0aW1lIHRvIGEgZmlsZS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVUZXN0ZXIgaW1wbGVtZW50cyBXb3JrZmxvd1Rhc2tJbnN0YW5jZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoU2ltcGxlVGVzdGVyLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZSNydW4ob3JnLmFwYWNoZQorICAgKiAub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGEsCisgICAqIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bihNZXRhZGF0YSBtZXRhZGF0YSwgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpCisgICAgICB0aHJvd3MgV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24geworICAgIFByaW50V3JpdGVyIHB3ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgU3RyaW5nIGpvYkZpbGVQYXRoID0gY29uZmlnLmdldFByb3BlcnR5KCJUZXN0RGlyUGF0aCIpICsgInRhc2stIgorICAgICAgICAgICsgbWV0YWRhdGEuZ2V0TWV0YWRhdGEoIlN0YXJ0RGF0ZVRpbWUiKSArICIuam9iIjsKKyAgICAgIGludCBuPTA7CisgICAgICB3aGlsZShuZXcgRmlsZShqb2JGaWxlUGF0aCkuZXhpc3RzKCkpeworICAgICAgICBqb2JGaWxlUGF0aCA9IGNvbmZpZy5nZXRQcm9wZXJ0eSgiVGVzdERpclBhdGgiKSArICJ0YXNrLSIgCisgICAgICAgICsgbiArIG1ldGFkYXRhLmdldE1ldGFkYXRhKCJTdGFydERhdGVUaW1lIikgKyAiLmpvYiI7CisgICAgICAgIG4rKzsKKyAgICAgIH0KKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIkNyZWF0aW5nIGpvYiBmaWxlOiBbIiArIGpvYkZpbGVQYXRoICsgIl0iKTsKKyAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGpvYkZpbGVQYXRoKSk7CisgICAgICBwdy5wcmludGxuKCJTdGFydERhdGVUaW1lPSIgKyBtZXRhZGF0YS5nZXRNZXRhZGF0YSgiU3RhcnREYXRlVGltZSIpKTsKKyAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHB3ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwdy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHcgPSBudWxsOworICAgICAgfQorICAgIH0KKworICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGVzdEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGVzdEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNWIxYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UZXN0QXN5bmNocm9ub3VzTG9jYWxFbmdpbmVSdW5uZXIuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLlRhc2tQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucnVubmVyLkFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Qcmlvcml0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRlLkRhdGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRhdGVDb252ZXJ0OworCisvL0pPREEgaW1wb3J0cworaW1wb3J0IG9yZy5qb2RhLnRpbWUuRGF0ZVRpbWU7CitpbXBvcnQgb3JnLmpvZGEudGltZS5TZWNvbmRzOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogCisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBBc3luY2hyb25vdXNMb2NhbEVuZ2luZVJ1bm5lcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgQXN5bmNocm9ub3VzTG9jYWxFbmdpbmVSdW5uZXIgcnVubmVyOworCisgIHByb3RlY3RlZCBGaWxlIHRlc3REaXI7CisKKyAgcHJpdmF0ZSBRdWVyaWVyQW5kUnVubmVyVXRpbHMgdXRpbHM7CisKKyAgcHVibGljIHZvaWQgdGVzdFJ1bigpIHsKKyAgICBUYXNrUHJvY2Vzc29yIHRhc2tQcm9jZXNzb3IxID0gbnVsbDsKKyAgICBUYXNrUHJvY2Vzc29yIHRhc2tQcm9jZXNzb3IyID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICB0YXNrUHJvY2Vzc29yMSA9IChUYXNrUHJvY2Vzc29yKSB1dGlscy5nZXRQcm9jZXNzb3IoUHJpb3JpdHkuZ2V0RGVmYXVsdCgpCisgICAgICAgICAgLmdldFZhbHVlKCksICJFeGVjdXRpbmciLCAicnVubmluZyIpOworICAgICAgdGFza1Byb2Nlc3NvcjIgPSAoVGFza1Byb2Nlc3NvcikgdXRpbHMuZ2V0UHJvY2Vzc29yKFByaW9yaXR5LmdldERlZmF1bHQoKQorICAgICAgICAgIC5nZXRWYWx1ZSgpLCAiRXhlY3V0aW5nIiwgInJ1bm5pbmciKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgTWV0YWRhdGEgbWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgbWV0LmFkZE1ldGFkYXRhKCJTdGFydERhdGVUaW1lIiwgRGF0ZVV0aWxzLnRvU3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkpKTsKKworICAgIHRhc2tQcm9jZXNzb3IxLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRTaGFyZWRDb250ZXh0KCkuYWRkTWV0YWRhdGEobWV0KTsKKyAgICB0YXNrUHJvY2Vzc29yMi5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0U2hhcmVkQ29udGV4dCgpLmFkZE1ldGFkYXRhKG1ldCk7CisKKyAgICB0cnkgeworICAgICAgcnVubmVyLmV4ZWN1dGUodGFza1Byb2Nlc3NvcjEpOworICAgICAgcnVubmVyLmV4ZWN1dGUodGFza1Byb2Nlc3NvcjIpOworICAgICAgYXNzZXJ0VHJ1ZShyYW5GYXN0KCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIHJhbkZhc3QoKSB7CisgICAgYm9vbGVhbiByYW5GYXN0ID0gdHJ1ZTsKKyAgICBpbnQgam9iTnVtID0gMTsKKyAgICBmb3IgKEZpbGUgZiA6IHRoaXMudGVzdERpci5saXN0RmlsZXMoKSkgeworICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIGxpbmUgPSBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyhmKTsKKyAgICAgICAgU3RyaW5nW10gdG9rcyA9IGxpbmUuc3BsaXQoIiwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb2tzIG5vdCBlcXVhbCB0byAyOiB0b2tzPVsiICsgQXJyYXlzLmFzTGlzdCh0b2tzKSArICJdIiwKKyAgICAgICAgICAgIDIsIHRva3MubGVuZ3RoKTsKKyAgICAgICAgRGF0ZSBkYXRlVGltZSA9IERhdGVDb252ZXJ0Lmlzb1BhcnNlKHRva3NbMV0pOworICAgICAgICBTZWNvbmRzIHNlY29uZHMgPSBTZWNvbmRzLnNlY29uZHNCZXR3ZWVuKG5ldyBEYXRlVGltZShkYXRlVGltZSksCisgICAgICAgICAgICBuZXcgRGF0ZVRpbWUoKSk7CisgICAgICAgIGlmIChzZWNvbmRzLmdldFNlY29uZHMoKSA+IDMwKSB7CisgICAgICAgICAgZmFpbCgiTW9yZSB0aGFuIDMwIHNlY29uZHMgZWxhcHNlZCBub3cgYW5kIHJ1bm5pbmcgam9iICIgKyBqb2JOdW0KKyAgICAgICAgICAgICAgKyAiOiBzZWNvbmRzIGVsYXBzZWQ6IFsiICsgc2Vjb25kcy5nZXRTZWNvbmRzKCkgKyAiXSIpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmFuRmFzdCA9IGZhbHNlOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKGJyICE9IG51bGwpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnIgPSBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhbkZhc3Q7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcGFyZW50UGF0aCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAidHh0IikuZ2V0UGFyZW50RmlsZSgpCisgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICBwYXJlbnRQYXRoID0gcGFyZW50UGF0aC5lbmRzV2l0aCgiLyIpID8gcGFyZW50UGF0aCA6IHBhcmVudFBhdGggKyAiLyI7CisgICAgU3RyaW5nIHRlc3RKb2JEaXJQYXRoID0gcGFyZW50UGF0aCArICJqb2JzIjsKKyAgICB0ZXN0RGlyID0gbmV3IEZpbGUodGVzdEpvYkRpclBhdGgpOworICAgIHRlc3REaXIubWtkaXJzKCk7CisgICAgdGhpcy5ydW5uZXIgPSBuZXcgQXN5bmNocm9ub3VzTG9jYWxFbmdpbmVSdW5uZXIoKTsKKyAgICB0aGlzLnV0aWxzID0gbmV3IFF1ZXJpZXJBbmRSdW5uZXJVdGlscygpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgZGVsZXRlQWxsRmlsZXModGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdGVzdERpci5kZWxldGUoKTsKKyAgICB0ZXN0RGlyID0gbnVsbDsKKyAgICB0aGlzLnJ1bm5lciA9IG51bGw7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGVsZXRlQWxsRmlsZXMoU3RyaW5nIHN0YXJ0RGlyKSB7CisgICAgRmlsZSBzdGFydERpckZpbGUgPSBuZXcgRmlsZShzdGFydERpcik7CisgICAgRmlsZVtdIGRlbEZpbGVzID0gc3RhcnREaXJGaWxlLmxpc3RGaWxlcygpOworCisgICAgaWYgKGRlbEZpbGVzICE9IG51bGwgJiYgZGVsRmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBkZWxGaWxlc1tpXS5kZWxldGUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGFydERpckZpbGUuZGVsZXRlKCk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGVzdFRhc2tRdWVyaWVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGVzdFRhc2tRdWVyaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1YmM5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UZXN0VGFza1F1ZXJpZXIuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLlRhc2tQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5GSUxPUHJpb3JpdHlTb3J0ZXI7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIFRlc3QgaGFybmVzcyBmb3IgdGhlIHtAbGluayBUZXN0VGFza1F1ZXJpZXJ9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RUYXNrUXVlcmllciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgCisgIHByaXZhdGUgaW50IGRhdGVHZW47CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfU0VDUyA9IDE7CisKKyAgcHVibGljIFRlc3RUYXNrUXVlcmllcigpIHsKKyAgICB0aGlzLmRhdGVHZW4gPSAwOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dCgpeworICAgIEZJTE9Qcmlvcml0eVNvcnRlciBwcmlvcml0aXplciA9IG5ldyBGSUxPUHJpb3JpdHlTb3J0ZXIoKTsKKyAgICBNb2NrUHJvY2Vzc29yUXVldWUgcHJvY2Vzc29yUXVldWUgPSBuZXcgTW9ja1Byb2Nlc3NvclF1ZXVlKCk7CisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gcXVldWVkID0gbnVsbDsKKyAgICBhc3NlcnROb3ROdWxsKHF1ZXVlZCA9IHByb2Nlc3NvclF1ZXVlLmdldFByb2Nlc3NvcnMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHF1ZXVlZC5zaXplKCkpOworICAgIHByb2Nlc3NvclF1ZXVlID0gbmV3IE1vY2tQcm9jZXNzb3JRdWV1ZSgpOworICAgIFRhc2tRdWVyaWVyIHF1ZXJpZXIgPSBuZXcgVGFza1F1ZXJpZXIocHJvY2Vzc29yUXVldWUsIHByaW9yaXRpemVyLCBudWxsLCBXQUlUX1NFQ1MpOworICAgIFRocmVhZCBxdWVyaWVyVGhyZWFkID0gbmV3IFRocmVhZChxdWVyaWVyKTsKKyAgICBxdWVyaWVyVGhyZWFkLnN0YXJ0KCk7CisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gcnVubmFibGVzID0gbnVsbDsKKyAgICB3aGlsZSAoKHJ1bm5hYmxlcyA9IHF1ZXJpZXIuZ2V0UnVubmFibGVQcm9jZXNzb3JzKCkpICE9IG51bGwgJiYgCisgICAgICAgIHJ1bm5hYmxlcy5zaXplKCkgPCAyKSB7CisgICAgICBhc3NlcnROb3ROdWxsKHJ1bm5hYmxlcyk7CisgICAgfQorCisgICAgcXVlcmllci5zZXRSdW5uaW5nKGZhbHNlKTsKKyAgICBhc3NlcnROb3ROdWxsKHJ1bm5hYmxlcyk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHJ1bm5hYmxlcy5zaXplKCkpOworICAgIFRhc2tQcm9jZXNzb3IgbmV4dCA9IHF1ZXJpZXIuZ2V0TmV4dCgpOworICAgIGFzc2VydE5vdE51bGwobmV4dCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHF1ZXJpZXIuZ2V0UnVubmFibGVQcm9jZXNzb3JzKCkuc2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRSdW5uYWJsZVByb2Nlc3NvcnMoKSB7CisgICAgRklMT1ByaW9yaXR5U29ydGVyIHByaW9yaXRpemVyID0gbmV3IEZJTE9Qcmlvcml0eVNvcnRlcigpOworICAgIE1vY2tQcm9jZXNzb3JRdWV1ZSBwcm9jZXNzb3JRdWV1ZSA9IG5ldyBNb2NrUHJvY2Vzc29yUXVldWUoKTsgICAgCisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gcXVldWVkID0gbnVsbDsKKyAgICBhc3NlcnROb3ROdWxsKHF1ZXVlZCA9IHByb2Nlc3NvclF1ZXVlLmdldFByb2Nlc3NvcnMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHF1ZXVlZC5zaXplKCkpOworICAgIHByb2Nlc3NvclF1ZXVlID0gbmV3IE1vY2tQcm9jZXNzb3JRdWV1ZSgpOworICAgIFRhc2tRdWVyaWVyIHF1ZXJpZXIgPSBuZXcgVGFza1F1ZXJpZXIocHJvY2Vzc29yUXVldWUsIHByaW9yaXRpemVyLCBudWxsLCBXQUlUX1NFQ1MpOworICAgIFRocmVhZCBxdWVyaWVyVGhyZWFkID0gbmV3IFRocmVhZChxdWVyaWVyKTsKKyAgICBxdWVyaWVyVGhyZWFkLnN0YXJ0KCk7CisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gcnVubmFibGVzID0gbnVsbDsKKyAgICB3aGlsZSAoKHJ1bm5hYmxlcyA9IHF1ZXJpZXIuZ2V0UnVubmFibGVQcm9jZXNzb3JzKCkpICE9IG51bGwgJiYgCisgICAgICAgIHJ1bm5hYmxlcy5zaXplKCkgPCAyKSB7CisgICAgICBhc3NlcnROb3ROdWxsKHJ1bm5hYmxlcyk7CisgICAgfQorCisgICAgcXVlcmllci5zZXRSdW5uaW5nKGZhbHNlKTsKKyAgICBhc3NlcnROb3ROdWxsKHJ1bm5hYmxlcyk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHJ1bm5hYmxlcy5zaXplKCkpOworICAgIGFzc2VydE5vdE51bGwocnVubmFibGVzLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90TnVsbChydW5uYWJsZXMuZ2V0KDApLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMi4xLCBydW5uYWJsZXMuZ2V0KDApLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpCisgICAgICAgIC5nZXRWYWx1ZSgpKTsgLy8gZXh0cmEgLjEgc2luY2UgaXQncyBhIHRhc2sKKyAgICBhc3NlcnRFcXVhbHMoNy4xLCBydW5uYWJsZXMuZ2V0KDEpLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpCisgICAgICAgIC5nZXRWYWx1ZSgpKTsgLy8gZXh0cmEgLjEgc2luY2UgaXQncyBhIHRhc2sKKyAgICB0cnl7CisgICAgICBxdWVyaWVyVGhyZWFkLmpvaW4oKTsKKyAgICB9CisgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKXt9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGVzdFRhc2tSdW5uZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UZXN0VGFza1J1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlY2RiMzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9lbmdpbmUvVGVzdFRhc2tSdW5uZXIuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5UYXNrUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5ydW5uZXIuQXN5bmNocm9ub3VzTG9jYWxFbmdpbmVSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucnVubmVyLkVuZ2luZVJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuRklMT1ByaW9yaXR5U29ydGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIEV4ZXJjaXNlcyB0aGUge0BsaW5rIFRhc2tSdW5uZXJ9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RUYXNrUnVubmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgRmlsZSB0ZXN0RGlyOworCisgIHByaXZhdGUgRW5naW5lUnVubmVyIHJ1bm5lcjsKKworICBwcml2YXRlIFRhc2tSdW5uZXIgdGFza1J1bm5lcjsKKworICBwcml2YXRlIFRhc2tRdWVyaWVyIHF1ZXJpZXI7CisKKyAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVUYXNrcygpIHsKKyAgICBGSUxPUHJpb3JpdHlTb3J0ZXIgcHJpb3JpdGl6ZXIgPSBuZXcgRklMT1ByaW9yaXR5U29ydGVyKCk7CisgICAgTW9ja1Byb2Nlc3NvclF1ZXVlIHByb2Nlc3NvclF1ZXVlID0gbmV3IE1vY2tQcm9jZXNzb3JRdWV1ZSgpOworICAgIHF1ZXJpZXIgPSBuZXcgTWV0U2V0dGVyVGFza1F1ZXJpZXIocHJvY2Vzc29yUXVldWUsIHByaW9yaXRpemVyKTsKKyAgICBUaHJlYWQgcXVlcmllclRocmVhZCA9IG5ldyBUaHJlYWQocXVlcmllcik7CisgICAgcXVlcmllclRocmVhZC5zdGFydCgpOworICAgIHdoaWxlIChxdWVyaWVyLmdldFJ1bm5hYmxlUHJvY2Vzc29ycygpLnNpemUoKSAhPSAyKSB7CisgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJpZXIuZ2V0UnVubmFibGVQcm9jZXNzb3JzKCkpOworICAgIH0KKyAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBydW5uYWJsZXMgPSBxdWVyaWVyLmdldFJ1bm5hYmxlUHJvY2Vzc29ycygpOworICAgIGFzc2VydE5vdE51bGwocnVubmFibGVzKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgcnVubmFibGVzLnNpemUoKSk7CisgICAgcnVubmVyID0gbmV3IEFzeW5jaHJvbm91c0xvY2FsRW5naW5lUnVubmVyKCk7CisgICAgdGFza1J1bm5lciA9IG5ldyBUYXNrUnVubmVyKHF1ZXJpZXIsIHJ1bm5lcik7CisgICAgYXNzZXJ0Tm90TnVsbCh0YXNrUnVubmVyKTsKKyAgICBUaHJlYWQgcnVubmVyVGhyZWFkID0gbmV3IFRocmVhZCh0YXNrUnVubmVyKTsKKyAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IHRhc2tSdW5uZXIKKyAgICAgICAgLmV4dHJhY3RUYXNrRnJvbVByb2Nlc3NvcigoVGFza1Byb2Nlc3NvcikgcnVubmFibGVzLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90TnVsbCh0YXNrKTsKKyAgICB0ZXN0RGlyID0gbmV3IEZpbGUodGFzay5nZXRUYXNrQ29uZmlnKCkuZ2V0UHJvcGVydHkoIlRlc3REaXJQYXRoIikpOworICAgIGFzc2VydE5vdE51bGwodGVzdERpcik7CisgICAgcnVubmVyVGhyZWFkLnN0YXJ0KCk7CisKKyAgICB3aGlsZSAoIXRlc3REaXIuZXhpc3RzKCkKKyAgICAgICAgfHwgKHRlc3REaXIuZXhpc3RzKCkgJiYgdGVzdERpci5saXN0RmlsZXMoKS5sZW5ndGggIT0gMikpIHsKKyAgICB9CisKKyAgICBxdWVyaWVyLnNldFJ1bm5pbmcoZmFsc2UpOworICAgIHJ1bm5lclRocmVhZC5pbnRlcnJ1cHQoKTsKKworICAgIC8vIGdldCB0aGUgdGVzdCBkaXIgcGF0aAorICAgIGFzc2VydFRydWUodGVzdERpci5leGlzdHMoKSk7CisgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RGlyLmxpc3RGaWxlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgdGVzdERpci5saXN0RmlsZXMoKS5sZW5ndGgpOworICAgIHRhc2tSdW5uZXIuc2V0UnVubmluZyhmYWxzZSk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdXBlci5zZXRVcCgpOworCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBibG93IGF3YXkgdGVzdCBmaWxlCisgICAgZGVsZXRlQWxsRmlsZXModGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdGVzdERpci5kZWxldGUoKTsKKyAgICB0ZXN0RGlyID0gbnVsbDsKKyAgICB0aGlzLnJ1bm5lciA9IG51bGw7CisgICAgdGhpcy5xdWVyaWVyID0gbnVsbDsKKyAgICB0aGlzLnRhc2tSdW5uZXIgPSBudWxsOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBzdGFydERpcikgeworICAgIEZpbGUgc3RhcnREaXJGaWxlID0gbmV3IEZpbGUoc3RhcnREaXIpOworICAgIEZpbGVbXSBkZWxGaWxlcyA9IHN0YXJ0RGlyRmlsZS5saXN0RmlsZXMoKTsKKworICAgIGlmIChkZWxGaWxlcyAhPSBudWxsICYmIGRlbEZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICB9CisgICAgfQorCisgICAgc3RhcnREaXJGaWxlLmRlbGV0ZSgpOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZW5naW5lL1Rlc3RUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UZXN0VGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MWNmYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2VuZ2luZS9UZXN0VGhyZWFkUG9vbFdvcmtmbG93RW5naW5lLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLkdyYXBoOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5QYXJlbnRDaGlsZFdvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0luc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5EYXRlQ29udmVydDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqIDxwPgorICogVGVzdCBzdWl0ZSBmb3IgdGhlIFRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGhyZWFkUG9vbFdvcmtmbG93RW5naW5lIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIFRlc3RUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUoKSB7CisgICAgICAgIC8vIHN1cHByZXNzIFdBUk5JTkcgbGV2ZWwgYW5kIGJlbG93IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAorICAgICAgICAvLyB0aGUgd2FybmluZyBtZXNzYWdlIHdoZXJlIHdlIHRlc3QgaWYgc3RhcnQgZGF0ZSB0aW1lIGlzIEFGVEVSCisgICAgICAgIC8vIGVuZCBkYXRlIHRpbWUgYmVsb3cKKyAgICAgICAgTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKCIiKS5zZXRMZXZlbChMZXZlbC5TRVZFUkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJyZW50VGFza1dhbGxDbG9ja1RpbWUoKSB7CisgICAgICAgIC8vIGF0IGZpcnN0LCB0aGVyZSBpcyBubyBzdGFydCBkYXRlIHRpbWUKKyAgICAgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgICAgV29ya2Zsb3dUYXNrIHRhc2sgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisgICAgICAgIHRhc2suc2V0VGFza0lkKCJ1cm46b29kdDp0ZXN0VGFzayIpOworICAgICAgICBQYXJlbnRDaGlsZFdvcmtmbG93IHdvcmtmbG93ID0gbmV3IFBhcmVudENoaWxkV29ya2Zsb3cobmV3IEdyYXBoKCkpOworICAgICAgICB3b3JrZmxvdy5nZXRUYXNrcygpLmFkZCh0YXNrKTsKKyAgICAgICAgaW5zdC5zZXRQYXJlbnRDaGlsZFdvcmtmbG93KHdvcmtmbG93KTsKKyAgICAgICAgaW5zdC5zZXRDdXJyZW50VGFza0lkKCJ1cm46b29kdDp0ZXN0VGFzayIpOworICAgICAgICBhc3NlcnRFcXVhbHMoRG91YmxlLnZhbHVlT2YoMC4wKSwgRG91YmxlCisgICAgICAgICAgICAgICAgLnZhbHVlT2YoVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QpKSk7CisKKyAgICAgICAgLy8gbm93IHNldCBzdGFydCBkYXRlIHRpbWUsIGFuZCBhc3NlcnQgdGhhdCB3YWxsIGNsb2NrIG1pbnV0ZXMgPiAwCisgICAgICAgIGluc3Quc2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKERhdGVDb252ZXJ0CisgICAgICAgICAgICAgICAgLmlzb0Zvcm1hdChuZXcgRGF0ZSgpKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUuZ2V0Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudFRhc2tXYWxsQ2xvY2tNaW51dGVzKGluc3QpID4gMC4wKTsKKworICAgICAgICAvLyBzZXQgZW5kIGRhdGUgdGltZSB0byAiIiBhbmQgbWFrZSBzdXJlIHdhbGwgY2xvY2sgbWlucyBzdGlsbCBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gMAorICAgICAgICBpbnN0LnNldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoIiIpOworICAgICAgICBhc3NlcnRUcnVlKFRocmVhZFBvb2xXb3JrZmxvd0VuZ2luZQorICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdCkgPiAwLjApOworCisgICAgICAgIC8vIHNldCB0aGUgZW5kIGRhdGUgdGltZSwgY29tcHV0ZSBpdCwgYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyB0aGUgc2FtZQorICAgICAgICBTdHJpbmcgZW5kRGF0ZVRpbWVJc29TdHIgPSBEYXRlQ29udmVydC5pc29Gb3JtYXQobmV3IERhdGUoKSk7CisgICAgICAgIGluc3Quc2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cihlbmREYXRlVGltZUlzb1N0cik7CisgICAgICAgIGRvdWJsZSB3YWxsQ2xvY2tNaW5zID0gVGhyZWFkUG9vbFdvcmtmbG93RW5naW5lCisgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhpbnN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS52YWx1ZU9mKHdhbGxDbG9ja01pbnMpLCBEb3VibGUKKyAgICAgICAgICAgICAgICAudmFsdWVPZihUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS52YWx1ZU9mKHdhbGxDbG9ja01pbnMpLCBEb3VibGUKKyAgICAgICAgICAgICAgICAudmFsdWVPZihUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdCkpKTsKKworICAgICAgICAvLyBzZXQgdGhlIHN0YXJ0IGRhdGUgdGltZSBhZnRlciB0aGUgZW5kIGRhdGUgdGltZQorICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgd2FsbCBjb2NrIHRpbWUgaXMgMC4wCisgICAgICAgIGluc3Quc2V0Q3VycmVudFRhc2tTdGFydERhdGVUaW1lSXNvU3RyKERhdGVDb252ZXJ0CisgICAgICAgICAgICAgICAgLmlzb0Zvcm1hdChuZXcgRGF0ZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEb3VibGUudmFsdWVPZigwLjApLCBEb3VibGUKKyAgICAgICAgICAgICAgICAudmFsdWVPZihUaHJlYWRQb29sV29ya2Zsb3dFbmdpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50VGFza1dhbGxDbG9ja01pbnV0ZXMoaW5zdCkpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL1Rlc3RFeHRlcm5TY3JpcHRUYXNrSW5zdGFuY2UuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL1Rlc3RFeHRlcm5TY3JpcHRUYXNrSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQwMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvZXhhbXBsZXMvVGVzdEV4dGVyblNjcmlwdFRhc2tJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgZGF2b29kaQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQHNpbmNlIE9PRFQtMjI2CisgKiAKKyAqIDxwPgorICogVW5pdCB0ZXN0IGZvciBydW5uaW5nIGFuIGV4dGVybmFsIHNjcmlwdCBhcyBhIHRhc2sgaW5zdGFuY2UuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgVGVzdEV4dGVyblNjcmlwdFRhc2tJbnN0YW5jZSBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0U2NyaXB0UGF0aCA9IG5ldyBGaWxlKAorICAgICAgICAgICAgIi4vc3JjL3Rlc3QvcmVzb3VyY2VzL215U2NyaXB0LnNoIikuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICBwcml2YXRlIEV4dGVyblNjcmlwdFRhc2tJbnN0YW5jZSBteUluczsKKworICAgIHByaXZhdGUgTWV0YWRhdGEgbXlNZXQ7CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBUZXN0RXh0ZXJuU2NyaXB0VGFza0luc3RhbmNlKCkgeworICAgICAgICBteUlucyA9IG5ldyBFeHRlcm5TY3JpcHRUYXNrSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuc2FsU2NyaXB0KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworCisgICAgICAgIG15TWV0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG15TWV0LmFkZE1ldGFkYXRhKCJBcmdzIiwgIkZhcmFuYWsiKTsKKyAgICAgICAgbXlNZXQuYWRkTWV0YWRhdGEoIkFyZ3MiLCAiRGF2b29kaSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKG15TWV0KTsKKyAgICAgICAgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBteUNvbmZpZyA9IG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCk7CisgICAgICAgIG15Q29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KCJQYXRoVG9TY3JpcHQiLCB0ZXN0U2NyaXB0UGF0aCk7CisgICAgICAgIG15Q29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KCJTaGVsbFR5cGUiLCAiL2Jpbi9iYXNoIik7CisgICAgICAgIGFzc2VydE5vdE51bGwobXlDb25maWcpOworICAgICAgICBteUlucy5ydW4obXlNZXQsIG15Q29uZmlnKTsKKyAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVTdHIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0RmlsZVN0ciA9IEZpbGVVdGlscy5yZWFkRmlsZVRvU3RyaW5nKG5ldyBGaWxlKAorICAgICAgICAgICAgICAgICAgICAiLi9zcmMvdGVzdC9yZXNvdXJjZXMvbXlTY3JpcHQtT3V0cHV0LnR4dCIpLCBvdXRwdXRGaWxlU3RyKTsKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFN0ciA9ICJIaSBteSBmaXJzdCBuYW1lIGlzIEZhcmFuYWsgYW5kIG15IGxhc3QgbmFtZSBpcyBEYXZvb2RpLiI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHIudHJpbSgpLCBvdXRwdXRGaWxlU3RyLnRyaW0oKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2V4YW1wbGVzL1Rlc3RGaWx0ZXJUYXNrLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9UZXN0RmlsdGVyVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDA4YTkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9leGFtcGxlcy9UZXN0RmlsdGVyVGFzay5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlczsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBoYXJuZXNzIGZvciBGaWx0ZXJUYXNrLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RmlsdGVyVGFzayBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByaXZhdGUgRmlsdGVyVGFzayB0YXNrOworCXByaXZhdGUgTWV0YWRhdGEgZHluTWV0OworCXByaXZhdGUgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWc7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2REYXRlVGltZSA9ICIyMDE0LTA0LTA3VDAwOjAwOjAwLjAwMFoiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmaWxlbmFtZSA9ICJmb28udHh0IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uID0gIi90bXAvc29tZWRpciI7CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGFzayA9IG5ldyBGaWx0ZXJUYXNrKCk7CisJCWR5bk1ldCA9IG5ldyBNZXRhZGF0YSgpOworCQlkeW5NZXQuYWRkTWV0YWRhdGEoIkZpbGVuYW1lIiwgZmlsZW5hbWUpOworCQlkeW5NZXQuYWRkTWV0YWRhdGEoIlByb2R1Y3Rpb25EYXRlVGltZSIsIHByb2REYXRlVGltZSk7CisJCWNvbmZpZyA9IG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJCXRhc2sgPSBudWxsOworCQlkeW5NZXQgPSBudWxsOworCQljb25maWcgPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7CisJCWNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eSgiUmVtb3ZlX0tleSIsICJGaWxlbmFtZSIpOworCQl0cnkgeworCQkJdGFzay5ydW4oZHluTWV0LCBjb25maWcpOworCQl9IGNhdGNoIChXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJYXNzZXJ0Tm90TnVsbChkeW5NZXQpOworCQlhc3NlcnRGYWxzZShkeW5NZXQuY29udGFpbnNLZXkoIkZpbGVuYW1lIikpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWUoKSB7CisJCWNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eSgiUmVuYW1lX1Byb2R1Y3Rpb25EYXRlVGltZSIsCisJCQkJIlByaW9yX1Byb2R1Y3Rpb25EYXRlVGltZSIpOworCQl0cnkgeworCQkJdGFzay5ydW4oZHluTWV0LCBjb25maWcpOworCQl9IGNhdGNoIChXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJYXNzZXJ0Tm90TnVsbChkeW5NZXQpOworCQlhc3NlcnRGYWxzZShkeW5NZXQuY29udGFpbnNLZXkoIlByb2R1Y3Rpb25EYXRlVGltZSIpKTsKKwkJYXNzZXJ0VHJ1ZShkeW5NZXQuY29udGFpbnNLZXkoIlByaW9yX1Byb2R1Y3Rpb25EYXRlVGltZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJWYWx1ZTogWyIgKyBkeW5NZXQuZ2V0TWV0YWRhdGEoIlByaW9yX1Byb2R1Y3Rpb25EYXRlVGltZSIpCisJCQkJCQkrICJdIHdhcyBub3QgZXF1YWwgdG86IFsiICsgcHJvZERhdGVUaW1lICsgIl0iLAorCQkJCXByb2REYXRlVGltZSwgZHluTWV0LmdldE1ldGFkYXRhKCJQcmlvcl9Qcm9kdWN0aW9uRGF0ZVRpbWUiKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZUFmdGVyUmVuYW1lKCkgeworCQljb25maWcuYWRkQ29uZmlnUHJvcGVydHkoIlJlbmFtZV9GaWxlbmFtZSIsICJGb29OYW1lIik7CisJCWNvbmZpZy5hZGRDb25maWdQcm9wZXJ0eSgiUmVtb3ZlX0tleSIsICJGb29OYW1lIik7CisJCXRyeSB7CisJCQl0YXNrLnJ1bihkeW5NZXQsIGNvbmZpZyk7CisJCX0gY2F0Y2ggKFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlhc3NlcnROb3ROdWxsKGR5bk1ldCk7CisJCWFzc2VydEZhbHNlKGR5bk1ldC5jb250YWluc0tleSgiRmlsZW5hbWUiKSk7CisJCWFzc2VydEZhbHNlKGR5bk1ldC5jb250YWluc0tleSgiRm9vTmFtZSIpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTXVsdGlwbGVLZXlzKCkgeworCQljb25maWcuYWRkQ29uZmlnUHJvcGVydHkoIlJlbW92ZV9LZXkiLCAiRmlsZW5hbWUsIFByb2R1Y3Rpb25EYXRlVGltZSIpOworCQl0cnkgeworCQkJdGFzay5ydW4oZHluTWV0LCBjb25maWcpOworCQl9IGNhdGNoIChXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJYXNzZXJ0Tm90TnVsbChkeW5NZXQpOworCQlhc3NlcnRGYWxzZShkeW5NZXQuY29udGFpbnNLZXkoIkZpbGVuYW1lIikpOworCQlhc3NlcnRGYWxzZShkeW5NZXQuY29udGFpbnNLZXkoIlByb2R1Y3Rpb25EYXRlVGltZSIpKTsKKworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVLZXlUaGF0RG9lc05vdEV4aXN0KCkgeworCQljb25maWcuYWRkQ29uZmlnUHJvcGVydHkoIlJlbW92ZV9LZXkiLCAiRmlsZUxvY2F0aW9uIik7CisJCXRyeSB7CisJCQl0YXNrLnJ1bihkeW5NZXQsIGNvbmZpZyk7CisJCX0gY2F0Y2ggKFdvcmtmbG93VGFza0luc3RhbmNlRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlhc3NlcnROb3ROdWxsKGR5bk1ldCk7CisJCWFzc2VydEZhbHNlKGR5bk1ldC5jb250YWluc0tleSgiRmlsZUxvY2F0aW9uIikpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVLZXlUaGF0RG9lc05vdEV4aXN0KCkgeworCQljb25maWcuYWRkQ29uZmlnUHJvcGVydHkoIlJlbmFtZV9GaWxlTG9jYXRpb24iLCAiRm9vTG9jYXRpb24iKTsKKwkJdHJ5IHsKKwkJCXRhc2sucnVuKGR5bk1ldCwgY29uZmlnKTsKKwkJfSBjYXRjaCAoV29ya2Zsb3dUYXNrSW5zdGFuY2VFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9CisJCWFzc2VydE5vdE51bGwoZHluTWV0KTsKKwkJYXNzZXJ0RmFsc2UoZHluTWV0LmNvbnRhaW5zS2V5KCJGaWxlTG9jYXRpb24iKSk7CisJCWFzc2VydEZhbHNlKGR5bk1ldC5jb250YWluc0tleSgiRm9vTG9jYXRpb24iKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFJlbmFtZVRvS2V5V2l0aEV4aXN0aW5nVmFsdWVzKCkgeworCQlkeW5NZXQuYWRkTWV0YWRhdGEoIlByaW9yX0ZpbGVMb2NhdGlvbiIsIGZpbGVMb2NhdGlvbik7CisJCWR5bk1ldC5hZGRNZXRhZGF0YSgiRmlsZUxvY2F0aW9uIiwgZmlsZUxvY2F0aW9uICsgIi9zb21lb3RoZXJkaXIiKTsKKwkJY29uZmlnLmFkZENvbmZpZ1Byb3BlcnR5KCJSZW5hbWVfRmlsZUxvY2F0aW9uIiwgIlByaW9yX0ZpbGVMb2NhdGlvbiIpOworCQl0cnkgeworCQkJdGFzay5ydW4oZHluTWV0LCBjb25maWcpOworCQl9IGNhdGNoIChXb3JrZmxvd1Rhc2tJbnN0YW5jZUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJYXNzZXJ0Tm90TnVsbChkeW5NZXQpOworCQlhc3NlcnRGYWxzZShkeW5NZXQuY29udGFpbnNLZXkoIkZpbGVMb2NhdGlvbiIpKTsKKwkJYXNzZXJ0VHJ1ZShkeW5NZXQuY29udGFpbnNLZXkoIlByaW9yX0ZpbGVMb2NhdGlvbiIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZDogWzFdIHZhbHVlLCBhY3R1YWwgd2FzIDogWyIKKwkJCQkrIGR5bk1ldC5nZXRBbGxNZXRhZGF0YSgiUHJpb3JfRmlsZUxvY2F0aW9uIikuc2l6ZSgpICsgIl0iLCAxLAorCQkJCWR5bk1ldC5nZXRBbGxNZXRhZGF0YSgiUHJpb3JfRmlsZUxvY2F0aW9uIikuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZDogWyIgKyBmaWxlTG9jYXRpb24gKyAiL3NvbWVvdGhlcmRpciIKKwkJCQkrICJdOiBnb3Q6IFsiICsgZHluTWV0LmdldE1ldGFkYXRhKCJQcmlvcl9GaWxlTG9jYXRpb24iKSArICJdIiwKKwkJCQlmaWxlTG9jYXRpb24gKyAiL3NvbWVvdGhlcmRpciIsCisJCQkJZHluTWV0LmdldE1ldGFkYXRhKCJQcmlvcl9GaWxlTG9jYXRpb24iKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9UZXN0THVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2luc3RyZXBvL1Rlc3RMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZDI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9pbnN0cmVwby9UZXN0THVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5JbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9BcGFjaGUgSW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAc2luY2UgT09EVC01NQorICogCisgKiA8cD4KKyAqIFRlc3QgQ2FzZSBmb3IgdGhlIHtAbGluayBMdWNlbmVXb3JrZmxvd0luc3RhY2VSZXBvc2l0b3J5fQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMKKyAgICAgICAgV29ya2Zsb3dTdGF0dXMgeworCisgICAgcHJpdmF0ZSBMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSByZXBvID0gbnVsbDsKKworICAgIHByaXZhdGUgV29ya2Zsb3dJbnN0YW5jZSB0ZXN0SW5zdCA9IG51bGw7CisKKyAgICBwcml2YXRlIFdvcmtmbG93IHRlc3RXa2ZsdzsKKworICAgIHByaXZhdGUgV29ya2Zsb3dUYXNrIHRlc3RUYXNrOworCisgICAgcHJpdmF0ZSBXb3JrZmxvd0NvbmRpdGlvbiB0ZXN0Q29uZDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyB0bXBEaXJQYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBUZXN0THVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnkoKSB7CisgICAgICAgIHRlc3RJbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgICAgdGVzdFdrZmx3ID0gbmV3IFdvcmtmbG93KCk7CisgICAgICAgIHRlc3RUYXNrID0gbmV3IFdvcmtmbG93VGFzaygpOworICAgICAgICB0ZXN0Q29uZCA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbigpOworICAgICAgICB0ZXN0V2tmbHcuc2V0TmFtZSgidGVzdC53b3JrZmxvdyIpOworICAgICAgICB0ZXN0V2tmbHcuc2V0SWQoInRlc3QuaWQiKTsKKyAgICAgICAgTGlzdCB0YXNrcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgTGlzdCBjb25kcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICB0ZXN0Q29uZC5zZXRDb25kaXRpb25JZCgidGVzdC5jb25kLmlkIik7CisgICAgICAgIHRlc3RDb25kLnNldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCJ0ZXN0LmNsYXNzIik7CisgICAgICAgIHRlc3RDb25kLnNldENvbmRpdGlvbk5hbWUoInRlc3QuY29uZC5uYW1lIik7CisgICAgICAgIHRlc3RDb25kLnNldE9yZGVyKDEpOworICAgICAgICBjb25kcy5hZGQodGVzdENvbmQpOworCisgICAgICAgIHRlc3RUYXNrLnNldFRhc2tDb25maWcobmV3IFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIHRlc3RUYXNrLnNldFRhc2tJZCgidGVzdC50YXNrLmlkIik7CisgICAgICAgIHRlc3RUYXNrLnNldENvbmRpdGlvbnMoY29uZHMpOworICAgICAgICB0ZXN0VGFzay5zZXRPcmRlcigxKTsKKyAgICAgICAgdGVzdFRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCJ0ZXN0LmNsYXNzIik7CisgICAgICAgIHRlc3RUYXNrLnNldFRhc2tOYW1lKCJ0ZXN0LnRhc2submFtZSIpOworICAgICAgICB0YXNrcy5hZGQodGVzdFRhc2spOworICAgICAgICB0ZXN0V2tmbHcuc2V0VGFza3ModGFza3MpOworCisgICAgICAgIHRlc3RJbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICAgICAgdGVzdEluc3Quc2V0Q3VycmVudFRhc2tJZCgidGVzdC50YXNrIik7CisgICAgICAgIHRlc3RJbnN0LnNldFN0YXR1cyhTVEFSVEVEKTsKKyAgICAgICAgdGVzdEluc3Quc2V0V29ya2Zsb3codGVzdFdrZmx3KTsKKworICAgICAgICBNZXRhZGF0YSBzaGFyZWRDb250ZXh0ID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIHNoYXJlZENvbnRleHQuYWRkTWV0YWRhdGEoIlRlc3RLZXkxIiwgIlRlc3RWYWwxIik7CisgICAgICAgIHNoYXJlZENvbnRleHQuYWRkTWV0YWRhdGEoIlRlc3RLZXkxIiwgIlRlc3RWYWwyIik7CisgICAgICAgIHNoYXJlZENvbnRleHQuYWRkTWV0YWRhdGEoIlRlc3RLZXkyIiwgIlRlc3RWYWwzIik7CisgICAgICAgIHRlc3RJbnN0LnNldFNoYXJlZENvbnRleHQoc2hhcmVkQ29udGV4dCk7CisgICAgCisgICAgICAgIC8vIGZpcnN0IGxvYWQgdGhlIGV4YW1wbGUgY29uZmlndXJhdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKCIuL3NyYy9tYWluL3Jlc291cmNlcy93b3JrZmxvdy5wcm9wZXJ0aWVzIikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgYSB0ZW1wIGRpcmVjdG9yeQorCisgICAgICAgIEZpbGUgdGVtcERpciA9IG51bGw7CisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgdGVtcERpciA9IHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdG1wRGlyUGF0aCA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIGlmICghdG1wRGlyUGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB0bXBEaXJQYXRoICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIHRtcERpclBhdGggKz0gInRlc3RJbnN0UmVwby8iOworCisgICAgICAgIC8vIG5vdyBvdmVycmlkZSB0aGUgY2F0YWxvZyBvbmVzCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5sdWNlbmUuaWR4UGF0aCIsCisgICAgICAgICAgICAgICAgdG1wRGlyUGF0aCk7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RhbmNlUmVwLnBhZ2VTaXplIiwgIjIwIik7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVwbyA9IChMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSkgbmV3IEx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5RmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlUmVwb3NpdG9yeSgpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBub3cgcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHVzZWQKKyAgICAgICAgaWYgKHRtcERpclBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKG5ldyBGaWxlKHRtcERpclBhdGgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVwbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXBvID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIC8qKgorICAgICogQHNpbmNlIE9PRFQtMzg5CisgICAgKiovCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlUmVwb0luaXRpYWxpemF0aW9uKCkgeworICAgICAgICAvLyBHZXR0aW5nIHRoZSBudW1iZXIgb2Ygd29ya2Zsb3cgaW5zdGFuY2VzIHNob3VsZCBub3QgZmFpbCBldmVuIG9uIGFuIGVtcHR5IGluZGV4CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZXBvLmdldE51bVdvcmtmbG93SW5zdGFuY2VzKCk7CisgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gaW5zdGFuY2VzIGluIHRoZSBpbmRleCBhdCB0aGlzIHBvaW50CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRG9jdW1lbnRBbmRQcmVzZXJ2ZUlkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVwby5hZGRXb3JrZmxvd0luc3RhbmNlKHRlc3RJbnN0KTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgCisgICAgICAgIC8vIHByZXNlcnZlIGl0cyBpZAorICAgICAgICBTdHJpbmcgd0luc3RJZCA9IHRlc3RJbnN0LmdldElkKCk7CisKKyAgICAgICAgLy8gbW9kaWZ5IGl0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvLnVwZGF0ZVdvcmtmbG93SW5zdGFuY2UodGVzdEluc3QpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgbmV3IGlkIGlzIHRoZSBzYW1lCisgICAgICAgIGFzc2VydEVxdWFscyh3SW5zdElkLCB0ZXN0SW5zdC5nZXRJZCgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IDEgd29ya2Zsb3cgaW5zdGFuY2UKKyAgICAgICAgTGlzdCB3SW5zdHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd0luc3RzID0gcmVwby5nZXRXb3JrZmxvd0luc3RhbmNlcygpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHdJbnN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB3SW5zdHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBjYW4gbG9vayB1cCB0aGF0IHdvcmtmbG93IGluc3QgYnkgaXRzIGlkCisgICAgICAgIFdvcmtmbG93SW5zdGFuY2UgZm91bmRJbnN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvdW5kSW5zdCA9IHJlcG8uZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQod0luc3RJZCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoZm91bmRJbnN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kSW5zdC5nZXRJZCgpLCB3SW5zdElkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmb3VuZEluc3QuZ2V0U2hhcmVkQ29udGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmb3VuZEluc3QuZ2V0U2hhcmVkQ29udGV4dCgpLmdldEhhc2h0YWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvdW5kSW5zdC5nZXRTaGFyZWRDb250ZXh0KCkuZ2V0SGFzaHRhYmxlKCkua2V5U2V0KCkKKyAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmb3VuZEluc3QuZ2V0U2hhcmVkQ29udGV4dCgpLmdldEFsbE1ldGFkYXRhKCJUZXN0S2V5MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvdW5kSW5zdC5nZXRTaGFyZWRDb250ZXh0KCkuZ2V0QWxsTWV0YWRhdGEoIlRlc3RLZXkxIikKKyAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKworICAgICAgICBib29sZWFuIGdvdFZhbDEgPSBmYWxzZSwgZ290VmFsMiA9IGZhbHNlOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZvdW5kSW5zdC5nZXRTaGFyZWRDb250ZXh0KCkuZ2V0QWxsTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgIlRlc3RLZXkxIikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAodmFsLmVxdWFscygiVGVzdFZhbDEiKSkgeworICAgICAgICAgICAgICAgIGdvdFZhbDEgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwuZXF1YWxzKCJUZXN0VmFsMiIpKSB7CisgICAgICAgICAgICAgICAgZ290VmFsMiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgKGdvdFZhbDEgJiYgZ290VmFsMik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmb3VuZEluc3QuZ2V0U2hhcmVkQ29udGV4dCgpLmdldE1ldGFkYXRhKCJUZXN0S2V5MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0VmFsMyIsIGZvdW5kSW5zdC5nZXRTaGFyZWRDb250ZXh0KCkuZ2V0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgIlRlc3RLZXkyIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvbGlmZWN5Y2xlL1Rlc3RXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2xpZmVjeWNsZS9UZXN0V29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3MDYyZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L2xpZmVjeWNsZS9UZXN0V29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuUGFyZW50Q2hpbGRXb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dJbnN0YW5jZTsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciB7QGxpbmsgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0V29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGxpZmVjeWNsZTsKKworICBwdWJsaWMgdm9pZCB0ZXN0UGN0Q29tcGxldGVXZW5naW5lU3RhZ2VzKCl7CisgICAgUGFyZW50Q2hpbGRXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBQYXJlbnRDaGlsZFdvcmtmbG93KG5ldyBHcmFwaCgpKTsKKyAgICBXb3JrZmxvd1N0YXRlIHN1Y2Nlc3NTdGF0ZSA9IGxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuY3JlYXRlU3RhdGUoIlN1Y2Nlc3MiLCAiZG9uZSIsICJBbGwgZG9uZS4iKTsKKyAgICBXb3JrZmxvd0luc3RhbmNlIGluc3RhbmNlID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICBpbnN0YW5jZS5zZXRTdGF0ZShzdWNjZXNzU3RhdGUpOworICAgIGluc3RhbmNlLnNldFBhcmVudENoaWxkV29ya2Zsb3cod29ya2Zsb3cpOworICAgIGRvdWJsZSBwY3QgPSBsaWZlY3ljbGUuZ2V0UGVyY2VudGFnZUNvbXBsZXRlKGluc3RhbmNlKTsKKyAgICBhc3NlcnROb3ROdWxsKHBjdCk7CisgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcGN0KTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdFBjdENvbXBsZXRlV29ya2Zsb3cxU3RhZ2VzKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb257CisgICAgdGhpcy5saWZlY3ljbGUgPSBuZXcgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyKCIuL3NyYy9tYWluL3Jlc291cmNlcyIKKyAgICAgICAgKyAiL2V4YW1wbGVzL3dvcmtmbG93LWxpZmVjeWNsZS54bWwiKTsKKyAgICBhc3NlcnROb3ROdWxsKHRoaXMubGlmZWN5Y2xlKTsKKyAgICBhc3NlcnROb3ROdWxsKHRoaXMubGlmZWN5Y2xlLmdldERlZmF1bHRMaWZlY3ljbGUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuZ2V0U3RhZ2VzKCkpOworICAgIFBhcmVudENoaWxkV29ya2Zsb3cgd29ya2Zsb3cgPSBuZXcgUGFyZW50Q2hpbGRXb3JrZmxvdyhuZXcgR3JhcGgoKSk7CisgICAgV29ya2Zsb3dTdGF0ZSBzdWNjZXNzU3RhdGUgPSBsaWZlY3ljbGUuZ2V0RGVmYXVsdExpZmVjeWNsZSgpLmNyZWF0ZVN0YXRlKCJGSU5JU0hFRCIsICJkb25lIiwgIkFsbCBkb25lLiIpOworICAgIFdvcmtmbG93SW5zdGFuY2UgaW5zdGFuY2UgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZSgpOworICAgIGluc3RhbmNlLnNldFN0YXRlKHN1Y2Nlc3NTdGF0ZSk7CisgICAgaW5zdGFuY2Uuc2V0UGFyZW50Q2hpbGRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgZG91YmxlIHBjdCA9IGxpZmVjeWNsZS5nZXRQZXJjZW50YWdlQ29tcGxldGUoaW5zdGFuY2UpOworICAgIGFzc2VydE5vdE51bGwocGN0KTsKKyAgICBhc3NlcnRFcXVhbHMoMS4wLCBwY3QpOworICAgIAorICAgIAorICB9CisgIAorICAKKyAgcHVibGljIHZvaWQgdGVzdFN0YWdlcygpIHsKKyAgICBhc3NlcnROb3ROdWxsKHRoaXMubGlmZWN5Y2xlLmdldERlZmF1bHRMaWZlY3ljbGUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuZ2V0U3RhZ2VzKCkpOworICAgIGFzc2VydEVxdWFscyh0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuZ2V0U3RhZ2VzKCkuc2l6ZSgpLCA3KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTmV3U3RhdGVGb3JtYXQoKSB7CisgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkpOworICAgIGFzc2VydE5vdE51bGwodGhpcy5saWZlY3ljbGUuZ2V0RGVmYXVsdExpZmVjeWNsZSgpLmdldFN0YWdlcygpKTsKKyAgICBib29sZWFuIGdvdE51bGwgPSBmYWxzZSwgZ290TG9hZGVkID0gZmFsc2U7CisgICAgV29ya2Zsb3dMaWZlY3ljbGVTdGFnZSBjYXRlZ29yeSA9IHRoaXMubGlmZWN5Y2xlLmdldERlZmF1bHRMaWZlY3ljbGUoKQorICAgICAgICAuZ2V0Q2F0ZWdvcnlCeU5hbWUoImluaXRpYWwiKTsKKyAgICBhc3NlcnROb3ROdWxsKGNhdGVnb3J5KTsKKyAgICBhc3NlcnRFcXVhbHMoImluaXRpYWwiLCBjYXRlZ29yeS5nZXROYW1lKCkpOworICAgIGZvciAoV29ya2Zsb3dTdGF0ZSBzdGF0ZSA6IChMaXN0PFdvcmtmbG93U3RhdGU+KSBjYXRlZ29yeS5nZXRTdGF0ZXMoKSkgeworICAgICAgaWYgKHN0YXRlLmdldE5hbWUoKS5lcXVhbHMoIk51bGwiKSkgeworICAgICAgICBnb3ROdWxsID0gdHJ1ZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXRlLmdldERlc2NyaXB0aW9uKCksICJVbmluaXRpYWxpemVkIFN0YXRlIik7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZS5nZXROYW1lKCkuZXF1YWxzKCJMb2FkZWQiKSkgeworICAgICAgICBnb3RMb2FkZWQgPSB0cnVlOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUuZ2V0RGVzY3JpcHRpb24oKSwgIkxvYWRpbmcgQ29tcGxldGUiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnRUcnVlKGdvdE51bGwgJiYgZ290TG9hZGVkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT2xkU3RhdGVGb3JtYXQoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgdGhpcy5saWZlY3ljbGUgPSBuZXcgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyKCIuL3NyYy9tYWluL3Jlc291cmNlcyIKKyAgICAgICAgKyAiL2V4YW1wbGVzL3dvcmtmbG93LWxpZmVjeWNsZS54bWwiKTsKKyAgICBhc3NlcnROb3ROdWxsKHRoaXMubGlmZWN5Y2xlKTsKKyAgICBhc3NlcnROb3ROdWxsKHRoaXMubGlmZWN5Y2xlLmdldERlZmF1bHRMaWZlY3ljbGUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuZ2V0U3RhZ2VzKCkpOworICAgIGFzc2VydEVxdWFscyh0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkuZ2V0U3RhZ2VzKCkuc2l6ZSgpLCA1KTsKKyAgICBhc3NlcnROb3ROdWxsKHRoaXMubGlmZWN5Y2xlLmdldERlZmF1bHRMaWZlY3ljbGUoKS5nZXRDYXRlZ29yeUJ5TmFtZSgKKyAgICAgICAgIndvcmtmbG93X3N0YXJ0IikpOworICAgIGFzc2VydE5vdE51bGwodGhpcy5saWZlY3ljbGUuZ2V0RGVmYXVsdExpZmVjeWNsZSgpCisgICAgICAgIC5nZXRDYXRlZ29yeUJ5TmFtZSgid29ya2Zsb3dfc3RhcnQiKS5nZXRTdGF0ZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICB0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkKKyAgICAgICAgICAgIC5nZXRDYXRlZ29yeUJ5TmFtZSgid29ya2Zsb3dfc3RhcnQiKS5nZXRTdGF0ZXMoKS5zaXplKCksIDIpOworICAgIGJvb2xlYW4gZ290UnN1Ym1pdCA9IGZhbHNlLCBnb3RTdGFydGVkID0gZmFsc2U7CisKKyAgICBmb3IgKFdvcmtmbG93U3RhdGUgc3RhdGUgOiB0aGlzLmxpZmVjeWNsZS5nZXREZWZhdWx0TGlmZWN5Y2xlKCkKKyAgICAgICAgLmdldENhdGVnb3J5QnlOYW1lKCJ3b3JrZmxvd19zdGFydCIpLmdldFN0YXRlcygpKSB7CisgICAgICBpZiAoc3RhdGUuZ2V0TmFtZSgpLmVxdWFscygiUlNVQk1JVCIpKSB7CisgICAgICAgIGdvdFJzdWJtaXQgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUuZ2V0TmFtZSgpLmVxdWFscygiU1RBUlRFRCIpKSB7CisgICAgICAgIGdvdFN0YXJ0ZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGFzc2VydFRydWUoZ290UnN1Ym1pdCAmJiBnb3RTdGFydGVkKTsKKyAgfQorCisgIC8qCisgICAqIChub24tSmF2YWRvYykKKyAgICogCisgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcigKKyAgICAgICAgbmV3IEZpbGUoIi4vc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dlbmdpbmUvd2VuZ2luZS1saWZlY3ljbGUueG1sIikKKyAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0aGlzLmxpZmVjeWNsZSA9IG51bGw7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9Nb2NrV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L01vY2tXb3JrZmxvd1JlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhiZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9Nb2NrV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb25Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFza0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworLy9Hb29nbGUgaW1wb3J0cworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCisvKioKKyAqIEEgbW9jayB7QGxpbmsgV29ya2Zsb3dSZXBvc2l0b3J5fS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqIEBhdXRob3IgbWF0dG1hbm4gKENocmlzIE1hdHRtYW5uKQorICovCitwdWJsaWMgY2xhc3MgTW9ja1dvcmtmbG93UmVwb3NpdG9yeSBpbXBsZW1lbnRzIFdvcmtmbG93UmVwb3NpdG9yeSB7CisKKyAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxXb3JrZmxvdz4+IGV2ZW50VG9Xb3JrZmxvd3NNYXA7CisgICBwcml2YXRlIE1hcDxTdHJpbmcsIFdvcmtmbG93PiB3b3JrZmxvd3M7CisgICBwcml2YXRlIE1hcDxTdHJpbmcsIFdvcmtmbG93VGFzaz4gdGFza3M7CisgICBwcml2YXRlIE1hcDxTdHJpbmcsIFdvcmtmbG93Q29uZGl0aW9uPiBjb25kaXRpb25zOworCisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFVkVOVDFfTkFNRSA9ICJFdmVudDFfTmFtZSI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFVkVOVDJfTkFNRSA9ICJFdmVudDJfTmFtZSI7CisKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktGTE9XMV9JRCA9ICJXb3JrZmxvdzFfSWQiOworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS0ZMT1cyX0lEID0gIldvcmtmbG93Ml9JZCI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLRkxPVzNfSUQgPSAiV29ya2Zsb3czX0lkIjsKKworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS0ZMT1cxX05BTUUgPSAiV29ya2Zsb3cxX05hbWUiOworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS0ZMT1cyX05BTUUgPSAiV29ya2Zsb3cyX05hbWUiOworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS0ZMT1czX05BTUUgPSAiV29ya2Zsb3czX05hbWUiOworCisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLMV9JRCA9ICJUYXNrMV9JZCI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLMl9JRCA9ICJUYXNrMl9JZCI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLM19JRCA9ICJUYXNrM19JZCI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLNF9JRCA9ICJUYXNrNF9JZCI7CisKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0sxX05BTUUgPSAiVGFzazFfTmFtZSI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLMl9OQU1FID0gIlRhc2syX05hbWUiOworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTSzNfTkFNRSA9ICJUYXNrM19OYW1lIjsKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0s0X05BTUUgPSAiVGFzazRfTmFtZSI7ICAgCisKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkRJVElPTjFfSUQgPSAiQ29uZGl0aW9uMV9JZCI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05ESVRJT04yX0lEID0gIkNvbmRpdGlvbjJfSWQiOworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ORElUSU9OM19JRCA9ICJDb25kaXRpb24zX0lkIjsKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkRJVElPTjRfSUQgPSAiQ29uZGl0aW9uNF9JZCI7IAorCisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05ESVRJT04xX05BTUUgPSAiQ29uZGl0aW9uMV9OYW1lIjsKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkRJVElPTjJfTkFNRSA9ICJDb25kaXRpb24yX05hbWUiOworICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ORElUSU9OM19OQU1FID0gIkNvbmRpdGlvbjNfTmFtZSI7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05ESVRJT040X05BTUUgPSAiQ29uZGl0aW9uNF9OYW1lIjsgCisKKyAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiB0Q29uZiA9IG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCk7CisgICBwdWJsaWMgZmluYWwgc3RhdGljIFdvcmtmbG93Q29uZGl0aW9uQ29uZmlndXJhdGlvbiBjQ29uZiA9IG5ldyBXb3JrZmxvd0NvbmRpdGlvbkNvbmZpZ3VyYXRpb24oKTsKKworICAgcHVibGljIE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkoKSB7CisgICAgICBldmVudFRvV29ya2Zsb3dzTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICB3b3JrZmxvd3MgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIHRhc2tzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICBjb25kaXRpb25zID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbjEgPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICAgIGNvbmRpdGlvbjEuc2V0Q29uZGl0aW9uSWQoQ09ORElUSU9OMV9JRCk7CisgICAgICBjb25kaXRpb24xLnNldENvbmRpdGlvbk5hbWUoQ09ORElUSU9OMV9OQU1FKTsKKyAgICAgIGNvbmRpdGlvbjEuc2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoInNvbWUuY2xhc3MucGF0aCIpOworICAgICAgY29uZGl0aW9uMS5zZXRDb25kQ29uZmlnKGNDb25mKTsKKyAgICAgIGNvbmRpdGlvbnMucHV0KGNvbmRpdGlvbjEuZ2V0Q29uZGl0aW9uSWQoKSwgY29uZGl0aW9uMSk7CisKKyAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbjIgPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICAgIGNvbmRpdGlvbjIuc2V0Q29uZGl0aW9uSWQoQ09ORElUSU9OMl9JRCk7CisgICAgICBjb25kaXRpb24yLnNldENvbmRpdGlvbk5hbWUoQ09ORElUSU9OMl9OQU1FKTsKKyAgICAgIGNvbmRpdGlvbjIuc2V0Q29uZENvbmZpZyhjQ29uZik7CisgICAgICBjb25kaXRpb24yLnNldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCJzb21lLmNsYXNzLnBhdGgiKTsKKyAgICAgIGNvbmRpdGlvbnMucHV0KGNvbmRpdGlvbjIuZ2V0Q29uZGl0aW9uSWQoKSwgY29uZGl0aW9uMik7CisKKyAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbjMgPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICAgIGNvbmRpdGlvbjMuc2V0Q29uZGl0aW9uSWQoQ09ORElUSU9OM19JRCk7CisgICAgICBjb25kaXRpb24zLnNldENvbmRpdGlvbk5hbWUoQ09ORElUSU9OM19OQU1FKTsKKyAgICAgIGNvbmRpdGlvbjMuc2V0Q29uZENvbmZpZyhjQ29uZik7CisgICAgICBjb25kaXRpb24zLnNldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCJzb21lLmNsYXNzLnBhdGgiKTsKKyAgICAgIGNvbmRpdGlvbnMucHV0KGNvbmRpdGlvbjMuZ2V0Q29uZGl0aW9uSWQoKSwgY29uZGl0aW9uMyk7CisKKyAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmRpdGlvbjQgPSBuZXcgV29ya2Zsb3dDb25kaXRpb24oKTsKKyAgICAgIGNvbmRpdGlvbjQuc2V0Q29uZGl0aW9uSWQoQ09ORElUSU9ONF9JRCk7CisgICAgICBjb25kaXRpb240LnNldENvbmRpdGlvbk5hbWUoQ09ORElUSU9ONF9OQU1FKTsKKyAgICAgIGNvbmRpdGlvbjQuc2V0Q29uZENvbmZpZyhjQ29uZik7CisgICAgICBjb25kaXRpb240LnNldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCJzb21lLmNsYXNzLnBhdGgiKTsKKyAgICAgIGNvbmRpdGlvbnMucHV0KGNvbmRpdGlvbjQuZ2V0Q29uZGl0aW9uSWQoKSwgY29uZGl0aW9uNCk7CisKKyAgICAgIFdvcmtmbG93VGFzayB0YXNrMSA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICAgIHRhc2sxLnNldFRhc2tJZChUQVNLMV9JRCk7CisgICAgICB0YXNrMS5zZXRUYXNrTmFtZShUQVNLMV9OQU1FKTsKKyAgICAgIHRhc2sxLnNldFRhc2tDb25maWcodENvbmYpOworICAgICAgdGFzazEuc2V0Q29uZGl0aW9ucyhMaXN0cy5uZXdBcnJheUxpc3QoY29uZGl0aW9uMSwgY29uZGl0aW9uMikpOworICAgICAgdGFza3MucHV0KHRhc2sxLmdldFRhc2tJZCgpLCB0YXNrMSk7CisKKyAgICAgIFdvcmtmbG93VGFzayB0YXNrMiA9IG5ldyBXb3JrZmxvd1Rhc2soKTsKKyAgICAgIHRhc2syLnNldFRhc2tJZChUQVNLMl9JRCk7CisgICAgICB0YXNrMi5zZXRUYXNrTmFtZShUQVNLMl9OQU1FKTsKKyAgICAgIHRhc2syLnNldFRhc2tDb25maWcodENvbmYpOworICAgICAgdGFzazIuc2V0Q29uZGl0aW9ucyhMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICB0YXNrcy5wdXQodGFzazIuZ2V0VGFza0lkKCksIHRhc2syKTsKKworICAgICAgV29ya2Zsb3dUYXNrIHRhc2szID0gbmV3IFdvcmtmbG93VGFzaygpOworICAgICAgdGFzazMuc2V0VGFza0lkKFRBU0szX0lEKTsKKyAgICAgIHRhc2szLnNldFRhc2tOYW1lKFRBU0szX05BTUUpOworICAgICAgdGFzazMuc2V0VGFza0NvbmZpZyh0Q29uZik7CisgICAgICB0YXNrMy5zZXRDb25kaXRpb25zKExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHRhc2tzLnB1dCh0YXNrMy5nZXRUYXNrSWQoKSwgdGFzazMpOworCisgICAgICBXb3JrZmxvd1Rhc2sgdGFzazQgPSBuZXcgV29ya2Zsb3dUYXNrKCk7CisgICAgICB0YXNrNC5zZXRUYXNrSWQoVEFTSzRfSUQpOworICAgICAgdGFzazQuc2V0VGFza05hbWUoVEFTSzRfTkFNRSk7CisgICAgICB0YXNrNC5zZXRUYXNrQ29uZmlnKHRDb25mKTsKKyAgICAgIHRhc2s0LnNldENvbmRpdGlvbnMoTGlzdHMubmV3QXJyYXlMaXN0KGNvbmRpdGlvbjQpKTsKKyAgICAgIHRhc2tzLnB1dCh0YXNrNC5nZXRUYXNrSWQoKSwgdGFzazQpOworCisgICAgICBXb3JrZmxvdyB3b3JrZmxvdzEgPSBuZXcgV29ya2Zsb3coKTsKKyAgICAgIHdvcmtmbG93MS5zZXRJZChXT1JLRkxPVzFfSUQpOworICAgICAgd29ya2Zsb3cxLnNldE5hbWUoV09SS0ZMT1cxX05BTUUpOworICAgICAgd29ya2Zsb3cxLnNldFRhc2tzKExpc3RzLm5ld0FycmF5TGlzdCh0YXNrMSwgdGFzazIpKTsKKyAgICAgIHdvcmtmbG93MS5zZXRDb25kaXRpb25zKExpc3RzLm5ld0FycmF5TGlzdChjb25kaXRpb24xKSk7CisgICAgICB3b3JrZmxvd3MucHV0KHdvcmtmbG93MS5nZXRJZCgpLCB3b3JrZmxvdzEpOworCisgICAgICBXb3JrZmxvdyB3b3JrZmxvdzIgPSBuZXcgV29ya2Zsb3coKTsKKyAgICAgIHdvcmtmbG93Mi5zZXRJZChXT1JLRkxPVzJfSUQpOworICAgICAgd29ya2Zsb3cyLnNldE5hbWUoV09SS0ZMT1cyX05BTUUpOworICAgICAgd29ya2Zsb3cyLnNldFRhc2tzKExpc3RzLm5ld0FycmF5TGlzdCh0YXNrMSwgdGFzazIsIHRhc2s0KSk7CisgICAgICB3b3JrZmxvdzIuc2V0Q29uZGl0aW9ucyhMaXN0cy5uZXdBcnJheUxpc3QoY29uZGl0aW9uMSwgY29uZGl0aW9uNCkpOworICAgICAgd29ya2Zsb3dzLnB1dCh3b3JrZmxvdzIuZ2V0SWQoKSwgd29ya2Zsb3cyKTsKKworICAgICAgV29ya2Zsb3cgd29ya2Zsb3czID0gbmV3IFdvcmtmbG93KCk7CisgICAgICB3b3JrZmxvdzMuc2V0SWQoV09SS0ZMT1czX0lEKTsKKyAgICAgIHdvcmtmbG93My5zZXROYW1lKFdPUktGTE9XM19OQU1FKTsKKyAgICAgIHdvcmtmbG93My5zZXRUYXNrcyhMaXN0cy5uZXdBcnJheUxpc3QodGFzazMpKTsKKyAgICAgIHdvcmtmbG93My5zZXRDb25kaXRpb25zKG5ldyBBcnJheUxpc3Q8V29ya2Zsb3dDb25kaXRpb24+KCkpOworICAgICAgd29ya2Zsb3dzLnB1dCh3b3JrZmxvdzMuZ2V0SWQoKSwgd29ya2Zsb3czKTsKKworICAgICAgZXZlbnRUb1dvcmtmbG93c01hcC5wdXQoRVZFTlQxX05BTUUsIExpc3RzLm5ld0FycmF5TGlzdCh3b3JrZmxvdzEpKTsKKyAgICAgIGV2ZW50VG9Xb3JrZmxvd3NNYXAucHV0KEVWRU5UMl9OQU1FLCBMaXN0cy5uZXdBcnJheUxpc3Qod29ya2Zsb3cxLAorICAgICAgICAgICAgd29ya2Zsb3cyKSk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFdvcmtmbG93IGdldFdvcmtmbG93QnlOYW1lKFN0cmluZyB3b3JrZmxvd05hbWUpCisgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHdvcmtmbG93TmFtZSk7CisKKyAgICAgIGZvciAoV29ya2Zsb3cgd29ya2Zsb3cgOiB3b3JrZmxvd3MudmFsdWVzKCkpIHsKKyAgICAgICAgIGlmICh3b3JrZmxvdy5nZXROYW1lKCkuZXF1YWxzKHdvcmtmbG93TmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JrZmxvdzsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHdvcmtmbG93SWQpOworCisgICAgICByZXR1cm4gd29ya2Zsb3dzLmdldCh3b3JrZmxvd0lkKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxXb3JrZmxvdz4gZ2V0V29ya2Zsb3dzKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCh3b3JrZmxvd3MudmFsdWVzKCkpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBMaXN0PFdvcmtmbG93VGFzaz4gZ2V0VGFza3NCeVdvcmtmbG93SWQoU3RyaW5nIHdvcmtmbG93SWQpCisgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IGdldFdvcmtmbG93QnlJZCh3b3JrZmxvd0lkKTsKKyAgICAgIExpc3Q8V29ya2Zsb3dUYXNrPiB0YXNrcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgaWYgKHdvcmtmbG93ICE9IG51bGwpIHsKKyAgICAgICAgIHRhc2tzLmFkZEFsbCh3b3JrZmxvdy5nZXRUYXNrcygpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0YXNrczsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxXb3JrZmxvd1Rhc2s+IGdldFRhc2tzQnlXb3JrZmxvd05hbWUoU3RyaW5nIHdvcmtmbG93TmFtZSkKKyAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIExpc3Q8V29ya2Zsb3dUYXNrPiB0YXNrcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBnZXRXb3JrZmxvd0J5TmFtZSh3b3JrZmxvd05hbWUpOworICAgICAgaWYgKHdvcmtmbG93ICE9IG51bGwpIHsKKyAgICAgICAgIHRhc2tzLmFkZEFsbCh3b3JrZmxvdy5nZXRUYXNrcygpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0YXNrczsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxXb3JrZmxvdz4gZ2V0V29ya2Zsb3dzRm9yRXZlbnQoU3RyaW5nIGV2ZW50TmFtZSkKKyAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoZXZlbnROYW1lKTsKKworICAgICAgTGlzdDxXb3JrZmxvdz4gd29ya2Zsb3dzID0gZXZlbnRUb1dvcmtmbG93c01hcC5nZXQoZXZlbnROYW1lKTsKKyAgICAgIGlmICh3b3JrZmxvd3MgPT0gbnVsbCkgeworICAgICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgfQorICAgICAgcmV0dXJuIHdvcmtmbG93czsKKyAgIH0KKworICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBnZXRDb25kaXRpb25zQnlUYXNrTmFtZShTdHJpbmcgdGFza05hbWUpCisgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBjb25kaXRpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IGdldFdvcmtmbG93VGFza0J5TmFtZSh0YXNrTmFtZSk7CisgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICBjb25kaXRpb25zLmFkZEFsbCh0YXNrLmdldENvbmRpdGlvbnMoKSk7IAorICAgICAgfQorICAgICAgcmV0dXJuIGNvbmRpdGlvbnM7CisgICB9CisKKyAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0Q29uZGl0aW9uc0J5VGFza0lkKFN0cmluZyB0YXNrSWQpCisgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICBMaXN0PFdvcmtmbG93Q29uZGl0aW9uPiBjb25kaXRpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IGdldFdvcmtmbG93VGFza0J5SWQodGFza0lkKTsKKyAgICAgIGlmICh0YXNrICE9IG51bGwpIHsKKyAgICAgICAgIGNvbmRpdGlvbnMuYWRkQWxsKExpc3RzLm5ld0FycmF5TGlzdCh0YXNrLmdldENvbmRpdGlvbnMoKSkpOworICAgICAgfQorICAgICAgcmV0dXJuIGNvbmRpdGlvbnM7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFdvcmtmbG93VGFza0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKFN0cmluZyB0YXNrSWQpCisgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICBXb3JrZmxvd1Rhc2sgdGFzayA9IGdldFdvcmtmbG93VGFza0J5SWQodGFza0lkKTsKKyAgICAgIGlmICh0YXNrICE9IG51bGwpIHsKKyAgICAgICAgIHJldHVybiB0YXNrLmdldFRhc2tDb25maWcoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrQnlJZChTdHJpbmcgdGFza0lkKQorICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgVmFsaWRhdGUubm90TnVsbCh0YXNrSWQpOworCisgICAgICByZXR1cm4gdGFza3MuZ2V0KHRhc2tJZCk7CisgICB9CisKKyAgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0V29ya2Zsb3dUYXNrQnlOYW1lKFN0cmluZyB0YXNrTmFtZSkKKyAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwodGFza05hbWUpOworCisgICAgICBmb3IgKFdvcmtmbG93VGFzayB0YXNrIDogdGFza3MudmFsdWVzKCkpIHsKKyAgICAgICAgIGlmICh0YXNrLmdldFRhc2tOYW1lKCkuZXF1YWxzKHRhc2tOYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgV29ya2Zsb3dDb25kaXRpb24gZ2V0V29ya2Zsb3dDb25kaXRpb25CeUlkKFN0cmluZyBjb25kaXRpb25JZCkKKyAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIFZhbGlkYXRlLm5vdE51bGwoY29uZGl0aW9uSWQpOworCisgICAgICByZXR1cm4gY29uZGl0aW9ucy5nZXQoY29uZGl0aW9uSWQpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVnaXN0ZXJlZEV2ZW50cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QoZXZlbnRUb1dvcmtmbG93c01hcC5rZXlTZXQoKSk7CisgICB9CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIFN0cmluZyBhZGRXb3JrZmxvdyhXb3JrZmxvdyB3b3JrZmxvdykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgICAgd29ya2Zsb3dzLnB1dCh3b3JrZmxvdy5nZXRJZCgpLCB3b3JrZmxvdyk7CisgICAgICByZXR1cm4gd29ya2Zsb3cuZ2V0SWQoKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgTGlzdDxXb3JrZmxvd0NvbmRpdGlvbj4gZ2V0Q29uZGl0aW9uc0J5V29ya2Zsb3dJZChTdHJpbmcgd29ya2Zsb3dJZCkKKyAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKKyAgICAgIExpc3Q8V29ya2Zsb3dDb25kaXRpb24+IGNvbmRpdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gZ2V0V29ya2Zsb3dCeUlkKHdvcmtmbG93SWQpOworICAgICAgaWYgKHdvcmtmbG93ICE9IG51bGwpIHsKKyAgICAgICAgIGNvbmRpdGlvbnMuYWRkQWxsKHdvcmtmbG93LmdldENvbmRpdGlvbnMoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gY29uZGl0aW9uczsKKyAgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNhZGRUYXNrKG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2spCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhZGRUYXNrKFdvcmtmbG93VGFzayB0YXNrKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgaXRzIGNvbmRpdGlvbnMKKyAgICBpZih0YXNrLmdldFByZUNvbmRpdGlvbnMoKSAhPSBudWxsICYmIHRhc2suZ2V0UHJlQ29uZGl0aW9ucygpLnNpemUoKSA+IDApeworICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IHRhc2suZ2V0UHJlQ29uZGl0aW9ucygpKXsKKyAgICAgICAgaWYoIXRoaXMuY29uZGl0aW9ucy5jb250YWluc0tleShjb25kLmdldENvbmRpdGlvbklkKCkpKXsKKyAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiUmVmZXJlbmNlIGluIG5ldyB0YXNrOiBbIit0YXNrLmdldFRhc2tOYW1lKCkrIl0gdG8gdW5kZWZpbmVkIHByZSBjb25kaXRpb24gaXRoIGlkOiBbIitjb25kLmdldENvbmRpdGlvbklkKCkrIl0iKTsgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgZm9yKFdvcmtmbG93Q29uZGl0aW9uIGNvbmQ6IHRhc2suZ2V0UG9zdENvbmRpdGlvbnMoKSl7CisgICAgICAgIGlmKCF0aGlzLmNvbmRpdGlvbnMuY29udGFpbnNLZXkoY29uZC5nZXRDb25kaXRpb25JZCgpKSl7CisgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlJlZmVyZW5jZSBpbiBuZXcgdGFzazogWyIrdGFzay5nZXRUYXNrTmFtZSgpKyJdIHRvIHVuZGVmaW5lZCBwb3N0IGNvbmRpdGlvbiBpdGggaWQ6IFsiK2NvbmQuZ2V0Q29uZGl0aW9uSWQoKSsiXSIpOyAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgU3RyaW5nIHRhc2tJZCA9IHRhc2suZ2V0VGFza0lkKCkgIT0gbnVsbCA/IAorICAgICAgICB0YXNrLmdldFRhc2tJZCgpOlVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICB0aGlzLnRhc2tzLnB1dCh0YXNrSWQsIHRhc2spOworICAgcmV0dXJuIHRhc2tJZDsgICAgCisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LldvcmtmbG93UmVwb3NpdG9yeSNnZXRUYXNrQnlJZChqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0VGFza0J5SWQoU3RyaW5nIHRhc2tJZCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24geworICAgIHJldHVybiB0YXNrcy5nZXQodGFza0lkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9UZXN0UGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvVGVzdFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjOTAwZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvVGVzdFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnk7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciB0aGUge0BsaW5rIFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5fS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBQYWNrYWdlZFdvcmtmbG93UmVwb3NpdG9yeSByZXBvOworCisgIHB1YmxpYyBUZXN0UGFja2FnZWRXb3JrZmxvd1JlcG9zaXRvcnkoKSB7CisgIH0KKyAgCisgIC8qKgorICAgKiBAc2luY2UgT09EVC0yMDUKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RXb3JrZmxvd0NvbmRpdGlvbnMoKXsKKyAgICBXb3JrZmxvdyB3ID0gbnVsbDsKKyAgICB0cnl7CisgICAgICB3ID0gdGhpcy5yZXBvLmdldFdvcmtmbG93QnlJZCgidXJuOm5wcDpHcmFudWxlTWFwcyIpOworICAgIH0KKyAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgCisgICAgYXNzZXJ0Tm90TnVsbCh3KTsKKyAgICBhc3NlcnROb3ROdWxsKHcuZ2V0Q29uZGl0aW9ucygpKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5VTSBDT05ESVRJT05TOiAiK3cuZ2V0Q29uZGl0aW9ucygpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZSh3LmdldENvbmRpdGlvbnMoKS5zaXplKCkgPiAwKTsKKyAgICBhc3NlcnRFcXVhbHMody5nZXRDb25kaXRpb25zKCkuc2l6ZSgpLCAzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZXRlY3RPdXRlckxldmVsV29ya2Zsb3dzKCkgeworICAgIGFzc2VydE5vdE51bGwodGhpcy5yZXBvKTsKKyAgICBMaXN0PFdvcmtmbG93PiB3b3JrZmxvd3MgPSBudWxsOworICAgIHRyeSB7CisgICAgICB3b3JrZmxvd3MgPSB0aGlzLnJlcG8uZ2V0V29ya2Zsb3dzKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGJvb2xlYW4gZm91bmRHcmFudWxlTWFwcyA9IGZhbHNlOworICAgIGZvciAoV29ya2Zsb3cgdyA6IHdvcmtmbG93cykgeworICAgICAgaWYgKHcuZ2V0SWQoKS5lcXVhbHMoInVybjpucHA6R3JhbnVsZU1hcHMiKSkgeworICAgICAgICBmb3VuZEdyYW51bGVNYXBzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnRUcnVlKGZvdW5kR3JhbnVsZU1hcHMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERldGVjdElubmVyV29ya2Zsb3dzKCkgeworICAgIGFzc2VydE5vdE51bGwodGhpcy5yZXBvKTsKKyAgICBMaXN0PFN0cmluZz4gZXZlbnRzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBldmVudHMgPSB0aGlzLnJlcG8uZ2V0UmVnaXN0ZXJlZEV2ZW50cygpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBib29sZWFuIGZvdW5kRm91ciA9IGZhbHNlLCBmb3VuZFRocmVlID0gZmFsc2U7CisgICAgZm9yIChTdHJpbmcgZXZlbnQgOiBldmVudHMpIHsKKyAgICAgIExpc3Q8V29ya2Zsb3c+IHdvcmtmbG93cyA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHdvcmtmbG93cyA9IHRoaXMucmVwby5nZXRXb3JrZmxvd3NGb3JFdmVudChldmVudCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKworICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JrZmxvd3MpOworICAgICAgYXNzZXJ0VHJ1ZSh3b3JrZmxvd3Muc2l6ZSgpID4gMCk7CisgICAgICBpZiAod29ya2Zsb3dzLnNpemUoKSA9PSAzKSB7CisgICAgICAgIGZvdW5kVGhyZWUgPSB0cnVlOworICAgICAgfSBlbHNlIGlmICh3b3JrZmxvd3Muc2l6ZSgpID09IDQpIHsKKyAgICAgICAgZm91bmRGb3VyID0gdHJ1ZTsKKyAgICAgIH0KKworICAgIH0KKworICAgIGFzc2VydFRydWUoZm91bmRUaHJlZSk7CisgICAgYXNzZXJ0VHJ1ZShmb3VuZEZvdXIpOworICB9CisgIAorICAvKioKKyAgICogQHNpbmNlIE9PRFQtMjA3CisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uZGl0aW9uVGltZW91dCgpeworICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgPSBudWxsOworICAgIHRyeXsKKyAgICAgIGNvbmQgPSB0aGlzLnJlcG8uZ2V0V29ya2Zsb3dDb25kaXRpb25CeUlkKCJ1cm46bnBwOk1PQV9JQVNJX0wxQ19EYWlseSIpOworICAgIH0KKyAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIAorICAgIGFzc2VydE5vdE51bGwoY29uZCk7CisgICAgYXNzZXJ0RXF1YWxzKDMwTCwgY29uZC5nZXRUaW1lb3V0U2Vjb25kcygpKTsKKyAgfQorICAKKyAgLyoqCisgICAqIEBzaW5jZSBPT0RULTIwOAorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCl7CisgICAgV29ya2Zsb3dDb25kaXRpb24gY29uZCA9IG51bGw7CisgICAgdHJ5eworICAgICAgY29uZCA9IHRoaXMucmVwby5nZXRXb3JrZmxvd0NvbmRpdGlvbkJ5SWQoInVybjpucHA6TU9BX09SQklUU19GaWxlQmFzZWQiKTsKKyAgICB9CisgICAgY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICAKKyAgICBhc3NlcnROb3ROdWxsKGNvbmQpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb25kLmlzT3B0aW9uYWwoKSk7ICAgCisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvID0gbmV3IFBhY2thZ2VkV29ya2Zsb3dSZXBvc2l0b3J5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEZpbGUoCisgICAgICAgICJzcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvd2VuZ2luZS9HcmFudWxlTWFwcy54bWwiKSkpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwbyA9IG51bGw7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9UZXN0V29ya2Zsb3dEYXRhU291cmNlUmVwb3NpdG9yeS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvcmVwb3NpdG9yeS9UZXN0V29ya2Zsb3dEYXRhU291cmNlUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2QxYWIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1Rlc3RXb3JrZmxvd0RhdGFTb3VyY2VSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLlNxbFNjcmlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLmV4Y2VwdGlvbnMuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnV0aWwuR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeTsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBUZXN0IHN1aXRlIGZvciB0aGUge0BsaW5rIERhdGFTb3VyY2VDYXRhbG9nfSBhbmQKKyAqIHtAbGluayBEYXRhU291cmNlQ2F0YWxvZ0ZhY3Rvcnl9LgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RXb3JrZmxvd0RhdGFTb3VyY2VSZXBvc2l0b3J5IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgdG1wRGlyUGF0aCA9IG51bGw7CisKKyAgICBwcml2YXRlIERhdGFTb3VyY2UgZHM7CisgICAgCisgICAgcHVibGljIFRlc3RXb3JrZmxvd0RhdGFTb3VyY2VSZXBvc2l0b3J5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBsb2cgbGV2ZWxzCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGUiLCBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICAiLi9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIGZpcnN0IGxvYWQgdGhlIGV4YW1wbGUgY29uZmlndXJhdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKCIuL3NyYy9tYWluL3Jlc291cmNlcy93b3JrZmxvdy5wcm9wZXJ0aWVzIikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgYSB0ZW1wIGRpcmVjdG9yeQorICAgICAgICBGaWxlIHRlbXBEaXIgPSBudWxsOworICAgICAgICBGaWxlIHRlbXBGaWxlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJmb28iLCAiYmFyIik7CisgICAgICAgICAgICB0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgIHRlbXBEaXIgPSB0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdG1wRGlyUGF0aCA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRzID0gRGF0YWJhc2VDb25uZWN0aW9uQnVpbGRlci5idWlsZERhdGFTb3VyY2UoInNhIiwgIiIsICJvcmcuaHNxbGRiLmpkYmNEcml2ZXIiLCAiamRiYzpoc3FsZGI6ZmlsZToiICsgdG1wRGlyUGF0aCArICIvdGVzdENhdDtzaHV0ZG93bj10cnVlIik7CisgICAgICAgIFNxbFNjcmlwdCBjb3JlU2NoZW1hU2NyaXB0ID0gbmV3IFNxbFNjcmlwdCgic3JjL3Rlc3QvcmVzb3VyY2VzL3dvcmtmbG93LnNxbCIsIGRzKTsKKyAgICAgICAgY29yZVNjaGVtYVNjcmlwdC5sb2FkU2NyaXB0KCk7CisgICAgICAgIGNvcmVTY2hlbWFTY3JpcHQuZXhlY3V0ZSgpOworICAgICAgICBkcy5nZXRDb25uZWN0aW9uKCkuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRzLmdldENvbm5lY3Rpb24oKS5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2luY2UgT09EVC0yMDUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya2Zsb3dDb25kaXRpb25zKCl7CisgICAgICBEYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5IHJlcG8gPSBuZXcgRGF0YVNvdXJjZVdvcmtmbG93UmVwb3NpdG9yeShkcyk7CisgICAgICAgICAgICAKKyAgICAgIFdvcmtmbG93IHcgPSBudWxsOworICAgICAgdHJ5eworICAgICAgICB3ID0gcmVwby5nZXRXb3JrZmxvd0J5SWQoIjEiKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIGFzc2VydE5vdE51bGwodyk7CisgICAgICBhc3NlcnROb3ROdWxsKHcuZ2V0Q29uZGl0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUody5nZXRDb25kaXRpb25zKCkuc2l6ZSgpID4gMCk7CisgICAgICBhc3NlcnRFcXVhbHMody5nZXRDb25kaXRpb25zKCkuc2l6ZSgpLCAxKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFTb3VyY2VSZXBvKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7CisgICAgICAgIERhdGFTb3VyY2VXb3JrZmxvd1JlcG9zaXRvcnkgcmVwbyA9IG5ldyBEYXRhU291cmNlV29ya2Zsb3dSZXBvc2l0b3J5KGRzKTsKKyAgICAgICAgCisgICAgICAgIC8vdGVzdCBpZCAxCisgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIHdjID0gcmVwby5nZXRXb3JrZmxvd0NvbmRpdGlvbkJ5SWQoIjEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHdjLmdldENvbmRpdGlvbk5hbWUoKSwgIkNoZWNrQ29uZCIpOworICAgICAgICBXb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlIGNvbmRJbnN0ID0gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeS5nZXRDb25kaXRpb25PYmplY3RGcm9tQ2xhc3NOYW1lKHdjLmdldENvbmRpdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCkpOworICAgICAgICBNZXRhZGF0YSBtID0gbmV3IE1ldGFkYXRhKCk7CisgICAgICAgIG0uYWRkTWV0YWRhdGEoIk1ldDEiLCAiVmFsMSIpOworICAgICAgICBtLmFkZE1ldGFkYXRhKCJNZXQyIiwgIlZhbDIiKTsKKyAgICAgICAgbS5hZGRNZXRhZGF0YSgiTWV0MyIsICJWYWwzIik7CisgICAgICAgIGFzc2VydFRydWUoY29uZEluc3QuZXZhbHVhdGUobSwgd2MuZ2V0VGFza0NvbmZpZygpKSk7CisgICAgICAgIAorICAgICAgICAvL3Rlc3QgaWQgMgorICAgICAgICB3YyA9IHJlcG8uZ2V0V29ya2Zsb3dDb25kaXRpb25CeUlkKCIyIik7CisgICAgICAgIGFzc2VydEVxdWFscyh3Yy5nZXRDb25kaXRpb25OYW1lKCksICJGYWxzZUNvbmQiKTsKKyAgICAgICAgY29uZEluc3QgPSBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmdldENvbmRpdGlvbk9iamVjdEZyb21DbGFzc05hbWUod2MuZ2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmRJbnN0LmV2YWx1YXRlKG0sIHdjLmdldFRhc2tDb25maWcoKSkpOworICAgICAgICAKKyAgICAgICAgLy90ZXN0IGlkIDMKKyAgICAgICAgd2MgPSByZXBvLmdldFdvcmtmbG93Q29uZGl0aW9uQnlJZCgiMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMod2MuZ2V0Q29uZGl0aW9uTmFtZSgpLCAiVHJ1ZUNvbmQiKTsKKyAgICAgICAgY29uZEluc3QgPSBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5LmdldENvbmRpdGlvbk9iamVjdEZyb21DbGFzc05hbWUod2MuZ2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZEluc3QuZXZhbHVhdGUobSwgd2MuZ2V0VGFza0NvbmZpZygpKSk7CisgICAgfQorICAgIAorfQorCmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1Rlc3RXb3JrZmxvd1JlcG9zaXRvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3JlcG9zaXRvcnkvVGVzdFdvcmtmbG93UmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGQ5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9yZXBvc2l0b3J5L1Rlc3RXb3JrZmxvd1JlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnJlcG9zaXRvcnk7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93Q29uZGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLlJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsLkdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKiA8cD4KKyAqIFVuaXQgdGVzdHMgZm9yIHRoZSBXb3JrZmxvdyBSZXBvc2l0b3J5LgorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0V29ya2Zsb3dSZXBvc2l0b3J5IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBYTUxXb3JrZmxvd1JlcG9zaXRvcnkgd29ya2Zsb3dSZXBvc2l0b3J5ID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3Qgd29ya2Zsb3dEaXJVcmlzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdFdvcmtmbG93UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgd29ya2Zsb3dEaXJVcmlzLmFkZChuZXcgRmlsZSgiLi9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMiKS50b1VSSSgpCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgICAgICB3b3JrZmxvd1JlcG9zaXRvcnkgPSBuZXcgWE1MV29ya2Zsb3dSZXBvc2l0b3J5KHdvcmtmbG93RGlyVXJpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzaW5jZSBPT0RULTIwNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JrZmxvd0NvbmRpdGlvbnMoKXsKKyAgICAgIFdvcmtmbG93IHcgPSBudWxsOworICAgICAgdHJ5eworICAgICAgICB3ID0gdGhpcy53b3JrZmxvd1JlcG9zaXRvcnkuZ2V0V29ya2Zsb3dCeUlkKCJ1cm46b29kdDpjb25kaXRpb25zV29ya2Zsb3ciKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIGFzc2VydE5vdE51bGwodyk7CisgICAgICBhc3NlcnROb3ROdWxsKHcuZ2V0Q29uZGl0aW9ucygpKTsKKyAgICAgIGFzc2VydFRydWUody5nZXRDb25kaXRpb25zKCkuc2l6ZSgpID4gMCk7CisgICAgICBhc3NlcnRFcXVhbHMody5nZXRDb25kaXRpb25zKCkuc2l6ZSgpLCAxKTsKKyAgICB9ICAgIAorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtmbG93QnlOYW1lKCkgeworICAgICAgICBXb3JrZmxvdyB3ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdyA9IHdvcmtmbG93UmVwb3NpdG9yeS5nZXRXb3JrZmxvd0J5TmFtZSgiYmFja3dhcmRzVGVzdFdvcmtmbG93Iik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFsaWRhdGVCYWNrd2FyZHNXb3JrZmxvdyh3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2Zsb3dCeUlkKCkgeworICAgICAgICBXb3JrZmxvdyB3ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdyA9IHdvcmtmbG93UmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dCeUlkKCJ1cm46b29kdDpiYWNrd2FyZHNUZXN0V29ya2Zsb3ciKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB2YWxpZGF0ZUJhY2t3YXJkc1dvcmtmbG93KHcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrZmxvd3MoKSB7CisgICAgICAgIExpc3Qgd29ya2Zsb3dzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd29ya2Zsb3dzID0gd29ya2Zsb3dSZXBvc2l0b3J5LmdldFdvcmtmbG93cygpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwod29ya2Zsb3dzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDExLCB3b3JrZmxvd3Muc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2Zsb3dzRm9yRXZlbnQoKSB7CisgICAgICAgIExpc3Qgd29ya2Zsb3dzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd29ya2Zsb3dzID0gd29ya2Zsb3dSZXBvc2l0b3J5LmdldFdvcmtmbG93c0ZvckV2ZW50KCJ0ZXN0Iik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JrZmxvd3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgd29ya2Zsb3dzLnNpemUoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdvcmtmbG93cyA9IHdvcmtmbG93UmVwb3NpdG9yeS5nZXRXb3JrZmxvd3NGb3JFdmVudCgiYmFja3dhcmRzIik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JrZmxvd3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgd29ya2Zsb3dzLnNpemUoKSk7CisgICAgICAgIAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3b3JrZmxvd3MgPSB3b3JrZmxvd1JlcG9zaXRvcnkuZ2V0V29ya2Zsb3dzRm9yRXZlbnQoImV4dGVybmFsU2NyaXB0Iik7CisgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JrZmxvd3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgd29ya2Zsb3dzLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRhc2tzQnlXb3JrZmxvd0lkKCkgeworICAgICAgICBMaXN0IHRhc2tzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFza3MgPSB3b3JrZmxvd1JlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFRhc2tzQnlXb3JrZmxvd0lkKCJ1cm46b29kdDpiYWNrd2FyZHNUZXN0V29ya2Zsb3ciKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB2YWxpZGF0ZUJhY2t3YXJkc1dvcmtmbG93VGFza3ModGFza3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXNrc0J5V29ya2Zsb3dOYW1lKCkgeworICAgICAgICBMaXN0IHRhc2tzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFza3MgPSB3b3JrZmxvd1JlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFRhc2tzQnlXb3JrZmxvd05hbWUoImJhY2t3YXJkc1Rlc3RXb3JrZmxvdyIpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbGlkYXRlQmFja3dhcmRzV29ya2Zsb3dUYXNrcyh0YXNrcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbmRpdGlvbnNCeVRhc2tJZCgpIHsKKyAgICAgICAgTGlzdCBjb25kaXRpb25zID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZGl0aW9ucyA9IHdvcmtmbG93UmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZGl0aW9uc0J5VGFza0lkKCJ1cm46b29kdDpHb29kYnllV29ybGQiKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB2YWxpZGF0ZVRhc2tDb25kaXRpb24oY29uZGl0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbmRpdGlvbnNCeVRhc2tOYW1lKCkgeworICAgICAgICBMaXN0IGNvbmRpdGlvbnMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25kaXRpb25zID0gd29ya2Zsb3dSZXBvc2l0b3J5CisgICAgICAgICAgICAgICAgICAgIC5nZXRDb25kaXRpb25zQnlUYXNrTmFtZSgiR29vZGJ5ZSBXb3JsZCIpOworICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbGlkYXRlVGFza0NvbmRpdGlvbihjb25kaXRpb25zKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNpbmNlIE9PRFQtMjA3CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbmRpdGlvblRpbWVvdXQoKXsKKyAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGNvbmQgPSBudWxsOworICAgICAgdHJ5eworICAgICAgICBjb25kID0gd29ya2Zsb3dSZXBvc2l0b3J5LmdldFdvcmtmbG93Q29uZGl0aW9uQnlJZCgidXJuOm9vZHQ6VGltZW91dENvbmRpdGlvbiIpOworICAgICAgfQorICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgYXNzZXJ0RXF1YWxzKDMwTCwgY29uZC5nZXRUaW1lb3V0U2Vjb25kcygpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNpbmNlIE9PRFQtMjA4CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbmRpdGlvbk9wdGlvbmFsKCl7CisgICAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kID0gbnVsbDsKKyAgICAgIHRyeXsKKyAgICAgICAgY29uZCA9IHdvcmtmbG93UmVwb3NpdG9yeS5nZXRXb3JrZmxvd0NvbmRpdGlvbkJ5SWQoInVybjpvb2R0Ok9wdGlvbmFsQ29uZGl0aW9uIik7CisgICAgICB9CisgICAgICBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgCisgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29uZC5pc09wdGlvbmFsKCkpOworICAgIH0gICAgCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKCkgeworICAgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZyA9IHdvcmtmbG93UmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKCJ1cm46b29kdDpHb29kYnllV29ybGQiKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB2YWxpZGF0ZVRhc2tDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVudlZhclJlcGxhY2VDb25maWdQcm9wZXJ0aWVzKCkgeworICAgICAgICBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZyA9IHdvcmtmbG93UmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkJ5VGFza0lkKCJ1cm46b29kdDpQcm9wUmVwbGFjZVRhc2siKTsKKyAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgIFN0cmluZyByZXBsYWNlZFBhdGggPSBjb25maWcuZ2V0UHJvcGVydHkoIlBhdGhUb1JlcGxhY2UiKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmFsdWUgPSBTeXN0ZW0uZ2V0ZW52KCJIT01FIikgKyAiL215L3BhdGgiOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoOiBbIiArIHJlcGxhY2VkUGF0aAorICAgICAgICAgICAgICAgICsgIl0gZG9lcyBub3QgZXF1YWwgdGhlIGV4cGVjdGVkIiArICJwYXRoOiBbIiArIGV4cGVjdGVkVmFsdWUKKyAgICAgICAgICAgICAgICArICJdIiwgcmVwbGFjZWRQYXRoLCBleHBlY3RlZFZhbHVlKTsKKworICAgICAgICBTdHJpbmcgbm90UmVwbGFjZWRQYXRoID0gY29uZmlnLmdldFByb3BlcnR5KCJEb250UmVwbGFjZU1lIik7CisgICAgICAgIFN0cmluZyBub3RSZXBsYWNlZFBhdGhOb1NwZWMgPSBjb25maWcKKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIkRvbnRSZXBsYWNlTWVOb1NwZWMiKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKG5vdFJlcGxhY2VkUGF0aCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobm90UmVwbGFjZWRQYXRoTm9TcGVjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdFJlcGxhY2VkUGF0aCwgbm90UmVwbGFjZWRQYXRoTm9TcGVjKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiW0hPTUVdL215L3BhdGgiOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoOiBbIiArIG5vdFJlcGxhY2VkUGF0aCArICJdIGlzIG5vdCBlcXVhbCB0byB0aGUgIgorICAgICAgICAgICAgICAgICsgImV4cGVjdGVkIHZhbHVlOiBbIiArIGV4cGVjdGVkICsgIl0iLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICBub3RSZXBsYWNlZFBhdGgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ29uZGl0aW9ucygpIHsKKyAgICAgICAgV29ya2Zsb3dUYXNrIG11bHRpVGFzayA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG11bHRpVGFzayA9IHdvcmtmbG93UmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZ2V0V29ya2Zsb3dUYXNrQnlJZCgidXJuOm9vZHQ6VGVzdE11bHRpQ29uZGl0aW9uVGFzayIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKG11bHRpVGFzayk7CisgICAgICAgIGFzc2VydE5vdE51bGwobXVsdGlUYXNrLmdldENvbmRpdGlvbnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtdWx0aVRhc2suZ2V0Q29uZGl0aW9ucygpLnNpemUoKSk7CisKKyAgICAgICAgYm9vbGVhbiBnb3RUcnVlQ29uZCA9IGZhbHNlLCBnb3RGYWxzZUNvbmQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11bHRpVGFzay5nZXRDb25kaXRpb25zKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGMgPSAoV29ya2Zsb3dDb25kaXRpb24pIG11bHRpVGFzay5nZXRDb25kaXRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldChpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYyk7CisgICAgICAgICAgICBpZiAoYy5nZXRDb25kaXRpb25OYW1lKCkuZXF1YWxzKCJUcnVlIENvbmRpdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgZ290VHJ1ZUNvbmQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChjLmdldENvbmRpdGlvbk5hbWUoKS5lcXVhbHMoIkZhbHNlIENvbmRpdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgZ290RmFsc2VDb25kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoZ290VHJ1ZUNvbmQgJiYgZ290RmFsc2VDb25kKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbnNDb25maWd1cmF0aW9uKCkgeworICAgICAgICBXb3JrZmxvd0NvbmRpdGlvbiBjb25kaXRpb24gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25kaXRpb24gPSB3b3JrZmxvd1JlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtmbG93Q29uZGl0aW9uQnlJZCgidXJuOm9vZHQ6Q2hlY2tGb3JNZXRhZGF0YUtleXMiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25kaXRpb24pOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmRpdGlvbi5nZXRUYXNrQ29uZmlnKCkpOworCisgICAgICAgIE1ldGFkYXRhIG0gPSBuZXcgTWV0YWRhdGEoKTsKKyAgICAgICAgbS5hZGRNZXRhZGF0YSgiTWV0MSIsICJWYWwxIik7CisgICAgICAgIG0uYWRkTWV0YWRhdGEoIk1ldDIiLCAiVmFsMiIpOworICAgICAgICBtLmFkZE1ldGFkYXRhKCJNZXQzIiwgIlZhbDMiKTsKKyAgICAgICAgR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeS5nZXRDb25kaXRpb25PYmplY3RGcm9tQ2xhc3NOYW1lKAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5nZXRDb25kaXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpKS5ldmFsdWF0ZShtLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5nZXRUYXNrQ29uZmlnKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJhY2t3YXJkc1dvcmtmbG93KFdvcmtmbG93IHcpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh3KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh3LmdldElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVybjpvb2R0OmJhY2t3YXJkc1Rlc3RXb3JrZmxvdyIsIHcuZ2V0SWQoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwody5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhY2t3YXJkc1Rlc3RXb3JrZmxvdyIsIHcuZ2V0TmFtZSgpKTsKKyAgICAgICAgdmFsaWRhdGVCYWNrd2FyZHNXb3JrZmxvd1Rhc2tzKHcuZ2V0VGFza3MoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFja3dhcmRzV29ya2Zsb3dUYXNrcyhMaXN0IHRhc2tzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwodGFza3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdGFza3Muc2l6ZSgpKTsKKworICAgICAgICBXb3JrZmxvd1Rhc2sgdDEgPSAoV29ya2Zsb3dUYXNrKSB0YXNrcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR29vZGJ5ZSBXb3JsZCIsIHQxLmdldFRhc2tOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVybjpvb2R0Okdvb2RieWVXb3JsZCIsIHQxLmdldFRhc2tJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHQxLmdldE9yZGVyKCkpOworICAgICAgICB2YWxpZGF0ZVRhc2tDb25maWd1cmF0aW9uKHQxLmdldFRhc2tDb25maWcoKSk7CisgICAgICAgIHZhbGlkYXRlVGFza0NvbmRpdGlvbih0MS5nZXRDb25kaXRpb25zKCkpOworCisgICAgICAgIFdvcmtmbG93VGFzayB0MiA9IChXb3JrZmxvd1Rhc2spIHRhc2tzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIHQyLmdldFRhc2tOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVybjpvb2R0OkhlbGxvV29ybGQiLCB0Mi5nZXRUYXNrSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0Mi5nZXRPcmRlcigpKTsKKyAgICAgICAgdmFsaWRhdGVUYXNrQ29uZmlndXJhdGlvbih0Mi5nZXRUYXNrQ29uZmlnKCkpOworICAgICAgICB2YWxpZGF0ZVRhc2tDb25kaXRpb24odDIuZ2V0Q29uZGl0aW9ucygpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhc2tDb25kaXRpb24oTGlzdCBjb25kaXRpb25zKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZGl0aW9ucyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25kaXRpb25zLnNpemUoKSk7CisgICAgICAgIFdvcmtmbG93Q29uZGl0aW9uIGMgPSAoV29ya2Zsb3dDb25kaXRpb24pIGNvbmRpdGlvbnMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInVybjpvb2R0OlRydWVDb25kaXRpb24iLCBjLmdldENvbmRpdGlvbklkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRydWUgQ29uZGl0aW9uIiwgYy5nZXRDb25kaXRpb25OYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRPcmRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgYy5nZXRUaW1lb3V0U2Vjb25kcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjLmlzT3B0aW9uYWwoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGFza0NvbmZpZ3VyYXRpb24oV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KCJQZXJzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2hyaXMiLCAoU3RyaW5nKSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldCgiUGVyc29uIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UZXN0RklMT1ByaW9yaXR5U29ydGVyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rlc3RGSUxPUHJpb3JpdHlTb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFmODE4Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UZXN0RklMT1ByaW9yaXR5U29ydGVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5TZXF1ZW50aWFsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZW5naW5lLnByb2Nlc3Nvci5Xb3JrZmxvd1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmxpZmVjeWNsZS5Xb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXI7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiAKKyAqIFRlc3RzIHRoZSB7QGxpbmsgRklMT1ByaW9yaXR5U29ydGVyfS4KKyAqIAorICogQGF1dGhvciBtYXR0bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RklMT1ByaW9yaXR5U29ydGVyIGV4dGVuZHMgVGVzdENhc2UgeworICAKKyAgcHJpdmF0ZSBpbnQgZGF0ZUdlbjsKKyAgCisgIHB1YmxpYyBUZXN0RklMT1ByaW9yaXR5U29ydGVyKCl7CisgICAgdGhpcy5kYXRlR2VuID0gMDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTb3J0KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIEZJTE9Qcmlvcml0eVNvcnRlciBzb3J0ZXIgPSBuZXcgRklMT1ByaW9yaXR5U29ydGVyKCk7CisgICAgV29ya2Zsb3dQcm9jZXNzb3IgcHJvYyA9IGdldFByb2Nlc3NvcigyLjApOworICAgIFdvcmtmbG93UHJvY2Vzc29yIHByb2MyID0gZ2V0UHJvY2Vzc29yKDcuMCk7CisgICAgV29ya2Zsb3dQcm9jZXNzb3IgcHJvYzMgPSBnZXRQcm9jZXNzb3IoOS4wKTsKKyAgICBMaXN0PFdvcmtmbG93UHJvY2Vzc29yPiBjYW5kaWRhdGVzID0gbmV3IFZlY3RvcjxXb3JrZmxvd1Byb2Nlc3Nvcj4oKTsKKyAgICBjYW5kaWRhdGVzLmFkZChwcm9jMyk7CisgICAgY2FuZGlkYXRlcy5hZGQocHJvYzIpOworICAgIGNhbmRpZGF0ZXMuYWRkKHByb2MpOyAgICAKKyAgICBzb3J0ZXIuc29ydChjYW5kaWRhdGVzKTsKKyAgICAKKyAgICBhc3NlcnROb3ROdWxsKGNhbmRpZGF0ZXMpOworICAgIGFzc2VydEVxdWFscygzLCBjYW5kaWRhdGVzLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIuMCwgY2FuZGlkYXRlcy5nZXQoMCkuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFByaW9yaXR5KCkKKyAgICAgICAgLmdldFZhbHVlKCkpOworICAgIGFzc2VydEVxdWFscyg3LjAsIGNhbmRpZGF0ZXMuZ2V0KDEpLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpCisgICAgICAgIC5nZXRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOS4wLCBjYW5kaWRhdGVzLmdldCgyKS5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UHJpb3JpdHkoKQorICAgICAgICAuZ2V0VmFsdWUoKSk7CisgIH0KKworICBwcml2YXRlIFdvcmtmbG93UHJvY2Vzc29yIGdldFByb2Nlc3Nvcihkb3VibGUgcHJpb3JpdHkpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIgbGlmZWN5Y2xlTWFuYWdlciA9IG5ldyBXb3JrZmxvd0xpZmVjeWNsZU1hbmFnZXIoIi4vc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGVzL3dlbmdpbmUvd2VuZ2luZS1saWZlY3ljbGUueG1sIik7CisgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICBEYXRlIHNkID0gbmV3IERhdGUoKTsKKyAgICBzZC5zZXRUaW1lKHNkLmdldFRpbWUoKSsodGhpcy5kYXRlR2VuKjUwMDApKTsKKyAgICB0aGlzLmRhdGVHZW4rKzsKKyAgICBpbnN0LnNldFN0YXJ0RGF0ZShzZCk7CisgICAgaW5zdC5zZXRJZCgid2luc3QtIitwcmlvcml0eSk7CisgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBuZXcgV29ya2Zsb3coKTsKKyAgICB3b3JrZmxvdy5zZXRUYXNrcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKKyAgICBpbnN0LnNldFdvcmtmbG93KHdvcmtmbG93KTsKKyAgICBpbnN0LnNldFByaW9yaXR5KFByaW9yaXR5LmdldFByaW9yaXR5KHByaW9yaXR5KSk7CisgICAgU2VxdWVudGlhbFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgU2VxdWVudGlhbFByb2Nlc3NvcihsaWZlY3ljbGVNYW5hZ2VyLCBpbnN0KTsKKyAgICByZXR1cm4gcHJvY2Vzc29yOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvVGVzdEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvVGVzdEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzgwMWQzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UZXN0SGlnaGVzdEZJRk9Qcmlvcml0eVNvcnRlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuU2VxdWVudGlhbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5wcm9jZXNzb3IuV29ya2Zsb3dQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5saWZlY3ljbGUuV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogCisgKiBUZXN0cyB0aGUge0BsaW5rIEhpZ2hlc3RQcmlvcml0eVNvcnRlcn0uCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBpbnQgZGF0ZUdlbjsKKyAgCisgIHB1YmxpYyBUZXN0SGlnaGVzdEZJRk9Qcmlvcml0eVNvcnRlcigpeworICAgIHRoaXMuZGF0ZUdlbiA9IDA7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RTb3J0KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIgc29ydGVyID0gbmV3IEhpZ2hlc3RGSUZPUHJpb3JpdHlTb3J0ZXIoMSwgMTUuMCwgMjUuMCk7CisgICAgV29ya2Zsb3dQcm9jZXNzb3IgcHJvYyA9IGdldFByb2Nlc3NvcigyLjApOworICAgIFdvcmtmbG93UHJvY2Vzc29yIHByb2MyID0gZ2V0UHJvY2Vzc29yKDcuMCk7CisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gY2FuZGlkYXRlcyA9IG5ldyBWZWN0b3I8V29ya2Zsb3dQcm9jZXNzb3I+KCk7CisgICAgY2FuZGlkYXRlcy5hZGQocHJvYyk7CisgICAgY2FuZGlkYXRlcy5hZGQocHJvYzIpOworICAgIHNvcnRlci5zb3J0KGNhbmRpZGF0ZXMpOworICAgIGFzc2VydE5vdE51bGwoY2FuZGlkYXRlcyk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGNhbmRpZGF0ZXMuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoNy4wLCBjYW5kaWRhdGVzLmdldCgwKS5nZXRXb3JrZmxvd0luc3RhbmNlKCkuZ2V0UHJpb3JpdHkoKQorICAgICAgICAuZ2V0VmFsdWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIuMCwgY2FuZGlkYXRlcy5nZXQoMSkuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFByaW9yaXR5KCkKKyAgICAgICAgLmdldFZhbHVlKCkpOworICB9CisKKyAgcHJpdmF0ZSBXb3JrZmxvd1Byb2Nlc3NvciBnZXRQcm9jZXNzb3IoZG91YmxlIHByaW9yaXR5KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyIGxpZmVjeWNsZU1hbmFnZXIgPSBuZXcgV29ya2Zsb3dMaWZlY3ljbGVNYW5hZ2VyKCIuL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcy93ZW5naW5lL3dlbmdpbmUtbGlmZWN5Y2xlLnhtbCIpOyAgICAKKyAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZSgpOworICAgIERhdGUgc2QgPSBuZXcgRGF0ZSgpOworICAgIHNkLnNldFRpbWUoc2QuZ2V0VGltZSgpKyh0aGlzLmRhdGVHZW4qNTAwMCkpOworICAgIHRoaXMuZGF0ZUdlbisrOworICAgIGluc3Quc2V0U3RhcnREYXRlKG5ldyBEYXRlKCkpOworICAgIGluc3Quc2V0SWQoIndpbnN0LSIrcHJpb3JpdHkpOworICAgIFdvcmtmbG93IHdvcmtmbG93ID0gbmV3IFdvcmtmbG93KCk7CisgICAgd29ya2Zsb3cuc2V0VGFza3MoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisgICAgaW5zdC5zZXRXb3JrZmxvdyh3b3JrZmxvdyk7CisgICAgaW5zdC5zZXRQcmlvcml0eShQcmlvcml0eS5nZXRQcmlvcml0eShwcmlvcml0eSkpOworICAgIFNlcXVlbnRpYWxQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFNlcXVlbnRpYWxQcm9jZXNzb3IobGlmZWN5Y2xlTWFuYWdlciwgaW5zdCk7CisgICAgcmV0dXJuIHByb2Nlc3NvcjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rlc3RIaWdoZXN0UHJpb3JpdHlTb3J0ZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N0cnVjdHMvVGVzdEhpZ2hlc3RQcmlvcml0eVNvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDYzOTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rlc3RIaWdoZXN0UHJpb3JpdHlTb3J0ZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLlNlcXVlbnRpYWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5lbmdpbmUucHJvY2Vzc29yLldvcmtmbG93UHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLldvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdHMgdGhlIHtAbGluayBIaWdoZXN0UHJpb3JpdHlTb3J0ZXJ9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RIaWdoZXN0UHJpb3JpdHlTb3J0ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBpbnQgZGF0ZUdlbjsKKyAgCisgIHB1YmxpYyBUZXN0SGlnaGVzdFByaW9yaXR5U29ydGVyKCl7CisgICAgdGhpcy5kYXRlR2VuID0gMDsKKyAgfQorICAKKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RTb3J0KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIEhpZ2hlc3RQcmlvcml0eVNvcnRlciBzb3J0ZXIgPSBuZXcgSGlnaGVzdFByaW9yaXR5U29ydGVyKCk7CisgICAgV29ya2Zsb3dQcm9jZXNzb3IgcHJvYyA9IGdldFByb2Nlc3NvcigyLjApOworICAgIFdvcmtmbG93UHJvY2Vzc29yIHByb2MyID0gZ2V0UHJvY2Vzc29yKDcuMCk7CisgICAgTGlzdDxXb3JrZmxvd1Byb2Nlc3Nvcj4gY2FuZGlkYXRlcyA9IG5ldyBWZWN0b3I8V29ya2Zsb3dQcm9jZXNzb3I+KCk7CisgICAgY2FuZGlkYXRlcy5hZGQocHJvYyk7CisgICAgY2FuZGlkYXRlcy5hZGQocHJvYzIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQkVGT1JFIHNvcnQ6IFsiK2NhbmRpZGF0ZXMrIl0iKTsKKyAgICBzb3J0ZXIuc29ydChjYW5kaWRhdGVzKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFGVEVSIHNvcnQ6IFsiK2NhbmRpZGF0ZXMrIl0iKTsKKyAgICBhc3NlcnROb3ROdWxsKGNhbmRpZGF0ZXMpOworICAgIGFzc2VydEVxdWFscygyLCBjYW5kaWRhdGVzLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDcuMCwgY2FuZGlkYXRlcy5nZXQoMCkuZ2V0V29ya2Zsb3dJbnN0YW5jZSgpLmdldFByaW9yaXR5KCkKKyAgICAgICAgLmdldFZhbHVlKCkpOworICAgIGFzc2VydEVxdWFscygyLjAsIGNhbmRpZGF0ZXMuZ2V0KDEpLmdldFdvcmtmbG93SW5zdGFuY2UoKS5nZXRQcmlvcml0eSgpCisgICAgICAgIC5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHByaXZhdGUgV29ya2Zsb3dQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKGRvdWJsZSBwcmlvcml0eSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlciBsaWZlY3ljbGVNYW5hZ2VyID0gbmV3IFdvcmtmbG93TGlmZWN5Y2xlTWFuYWdlcigiLi9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvd2VuZ2luZS93ZW5naW5lLWxpZmVjeWNsZS54bWwiKTsgICAgCisgICAgV29ya2Zsb3dJbnN0YW5jZSBpbnN0ID0gbmV3IFdvcmtmbG93SW5zdGFuY2UoKTsKKyAgICBEYXRlIHNkID0gbmV3IERhdGUoKTsKKyAgICBzZC5zZXRUaW1lKHNkLmdldFRpbWUoKSsodGhpcy5kYXRlR2VuKjUwMDApKTsKKyAgICB0aGlzLmRhdGVHZW4rKzsKKyAgICBpbnN0LnNldFN0YXJ0RGF0ZShuZXcgRGF0ZSgpKTsKKyAgICBpbnN0LnNldElkKCJ3aW5zdC0iK3ByaW9yaXR5KTsKKyAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IG5ldyBXb3JrZmxvdygpOworICAgIHdvcmtmbG93LnNldFRhc2tzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworICAgIGluc3Quc2V0V29ya2Zsb3cod29ya2Zsb3cpOworICAgIGluc3Quc2V0UHJpb3JpdHkoUHJpb3JpdHkuZ2V0UHJpb3JpdHkocHJpb3JpdHkpKTsKKyAgICBTZXF1ZW50aWFsUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBTZXF1ZW50aWFsUHJvY2Vzc29yKGxpZmVjeWNsZU1hbmFnZXIsIGluc3QpOworICAgIHJldHVybiBwcm9jZXNzb3I7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UZXN0V29ya2Zsb3dJbnN0YW5jZS5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3RydWN0cy9UZXN0V29ya2Zsb3dJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjNkZGYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zdHJ1Y3RzL1Rlc3RXb3JrZmxvd0luc3RhbmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0czsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciBXb3JrZmxvd0luc3RhbmNlIG1ldGhvZHMuCisgKiAKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdFdvcmtmbG93SW5zdGFuY2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgLyoqCisgICAqIEBzaW5jZSBPT0RULTQ4NgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNldFN0YXJ0RW5kRGF0ZVRpbWVzTnVsbCgpIHsKKyAgICBXb3JrZmxvd0luc3RhbmNlIGluc3QgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZSgpOworICAgIGluc3Quc2V0Q3VycmVudFRhc2tFbmREYXRlVGltZUlzb1N0cihudWxsKTsKKyAgICBpbnN0LnNldEN1cnJlbnRUYXNrU3RhcnREYXRlVGltZUlzb1N0cihudWxsKTsKKyAgICBpbnN0LnNldFN0YXJ0RGF0ZVRpbWVJc29TdHIobnVsbCk7CisgICAgaW5zdC5zZXRFbmREYXRlVGltZUlzb1N0cihudWxsKTsKKworICAgIGFzc2VydE51bGwoaW5zdC5nZXRFbmREYXRlKCkpOworICAgIGFzc2VydE5vdE51bGwoaW5zdC5nZXRTdGFydERhdGUoKSk7IC8vIG9ubHkgb25lIGluaXRpYWxseSBzZXQgdG8gbmV3IERhdGUoKQorICAgIGFzc2VydE51bGwoaW5zdC5nZXRDdXJyZW50VGFza1N0YXJ0RGF0ZVRpbWVJc29TdHIoKSk7CisgICAgYXNzZXJ0TnVsbChpbnN0LmdldEN1cnJlbnRUYXNrRW5kRGF0ZVRpbWVJc29TdHIoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3lzdGVtL01vY2tYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N5c3RlbS9Nb2NrWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNWNiYwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N5c3RlbS9Nb2NrWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN5c3RlbTsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cucmVwb3NpdG9yeS5Nb2NrV29ya2Zsb3dSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2VQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2s7CisKKy8vR29vZ2xlIGltcG9ydHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIEEgTW9jayB7QGxpbmsgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50fS4KKyAqCisgKiBAYXV0aG9yIGJmb3N0ZXIgKEJyaWFuIEZvc3RlcikKKyAqLworcHVibGljIGNsYXNzIE1vY2tYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgZXh0ZW5kcworICAgICAgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyQ2xpZW50IHsKKworICAgcHJpdmF0ZSBNZXRob2RDYWxsRGV0YWlscyBsYXN0TWV0aG9kQ2FsbERldGFpbHM7CisgICBwcml2YXRlIE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkgd29ya2Zsb3dSZXBvOworCisgICBwdWJsaWMgTW9ja1htbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgc3VwZXIobmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo5MDAwIikpOworICAgICAgd29ya2Zsb3dSZXBvID0gbmV3IE1vY2tXb3JrZmxvd1JlcG9zaXRvcnkoKTsKKyAgIH0KKworICAgcHVibGljIE1ldGhvZENhbGxEZXRhaWxzIGdldExhc3RNZXRob2RDYWxsRGV0YWlscygpIHsKKyAgICAgIHJldHVybiBsYXN0TWV0aG9kQ2FsbERldGFpbHM7CisgICB9CisKKyAgIHB1YmxpYyBTdHJpbmcgZXhlY3V0ZUR5bmFtaWNXb3JrZmxvdyhMaXN0PFN0cmluZz4gdGFza0lkcywgTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZXhlY3V0ZUR5bmFtaWNXb3JrZmxvdyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QodGFza0lkcywgbWV0YWRhdGEpKTsKKyAgICAgIHJldHVybiAiVGVzdElkMSI7CisgICB9CisKKyAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVnaXN0ZXJlZEV2ZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKCJnZXRSZWdpc3RlcmVkRXZlbnRzIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHJldHVybiB3b3JrZmxvd1JlcG8uZ2V0UmVnaXN0ZXJlZEV2ZW50cygpOworICAgfQorCisgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0Rmlyc3RQYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldEZpcnN0UGFnZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gbmV3IFdvcmtmbG93SW5zdGFuY2VQYWdlKCk7CisgICAgICBwYWdlLnNldFBhZ2VOdW0oMSk7CisgICAgICBwYWdlLnNldFBhZ2VTaXplKDApOworICAgICAgcGFnZS5zZXRUb3RhbFBhZ2VzKDApOworICAgICAgcGFnZS5zZXRQYWdlV29ya2Zsb3dzKExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHJldHVybiBwYWdlOworICAgfQorCisgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0TmV4dFBhZ2UoV29ya2Zsb3dJbnN0YW5jZVBhZ2UgY3VycmVudFBhZ2UpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0TmV4dFBhZ2UiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGN1cnJlbnRQYWdlKSk7CisgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gbmV3IFdvcmtmbG93SW5zdGFuY2VQYWdlKCk7CisgICAgICBwYWdlLnNldFBhZ2VOdW0oMSk7CisgICAgICBwYWdlLnNldFBhZ2VTaXplKDApOworICAgICAgcGFnZS5zZXRUb3RhbFBhZ2VzKDApOworICAgICAgcGFnZS5zZXRQYWdlV29ya2Zsb3dzKExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHJldHVybiBwYWdlOworICAgfQorCisgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0UHJldlBhZ2UoV29ya2Zsb3dJbnN0YW5jZVBhZ2UgY3VycmVudFBhZ2UpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0UHJldlBhZ2UiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGN1cnJlbnRQYWdlKSk7CisgICAgICBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdlID0gbmV3IFdvcmtmbG93SW5zdGFuY2VQYWdlKCk7CisgICAgICBwYWdlLnNldFBhZ2VOdW0oMSk7CisgICAgICBwYWdlLnNldFBhZ2VTaXplKDApOworICAgICAgcGFnZS5zZXRUb3RhbFBhZ2VzKDApOworICAgICAgcGFnZS5zZXRQYWdlV29ya2Zsb3dzKExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHJldHVybiBwYWdlOworICAgfQorCisgICBwdWJsaWMgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgZ2V0TGFzdFBhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0TGFzdFBhZ2UiLCBudWxsKTsKKyAgICAgIFdvcmtmbG93SW5zdGFuY2VQYWdlIHBhZ2UgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZVBhZ2UoKTsKKyAgICAgIHBhZ2Uuc2V0UGFnZU51bSgxKTsKKyAgICAgIHBhZ2Uuc2V0UGFnZVNpemUoMCk7CisgICAgICBwYWdlLnNldFRvdGFsUGFnZXMoMCk7CisgICAgICBwYWdlLnNldFBhZ2VXb3JrZmxvd3MoTGlzdHMubmV3QXJyYXlMaXN0KCkpOworICAgICAgcmV0dXJuIHBhZ2U7CisgICB9CisKKyAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlUGFnZSBwYWdpbmF0ZVdvcmtmbG93SW5zdGFuY2VzKGludCBwYWdlTnVtLAorICAgICAgICAgU3RyaW5nIHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoInBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KHBhZ2VOdW0sIChPYmplY3QpIHN0YXR1cykpOworICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSA9IG5ldyBXb3JrZmxvd0luc3RhbmNlUGFnZSgpOworICAgICAgcGFnZS5zZXRQYWdlTnVtKDEpOworICAgICAgcGFnZS5zZXRQYWdlU2l6ZSgwKTsKKyAgICAgIHBhZ2Uuc2V0VG90YWxQYWdlcygwKTsKKyAgICAgIHBhZ2Uuc2V0UGFnZVdvcmtmbG93cyhMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICByZXR1cm4gcGFnZTsKKyAgIH0KKworICAgcHVibGljIFdvcmtmbG93SW5zdGFuY2VQYWdlIHBhZ2luYXRlV29ya2Zsb3dJbnN0YW5jZXMoaW50IHBhZ2VOdW0pCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygicGFnaW5hdGVXb3JrZmxvd0luc3RhbmNlcyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgcGFnZU51bSkpOworICAgICAgV29ya2Zsb3dJbnN0YW5jZVBhZ2UgcGFnZSA9IG5ldyBXb3JrZmxvd0luc3RhbmNlUGFnZSgpOworICAgICAgcGFnZS5zZXRQYWdlTnVtKDEpOworICAgICAgcGFnZS5zZXRQYWdlU2l6ZSgwKTsKKyAgICAgIHBhZ2Uuc2V0VG90YWxQYWdlcygwKTsKKyAgICAgIHBhZ2Uuc2V0UGFnZVdvcmtmbG93cyhMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICByZXR1cm4gcGFnZTsKKyAgIH0KKworICAgcHVibGljIExpc3Q8V29ya2Zsb3c+IGdldFdvcmtmbG93c0J5RXZlbnQoU3RyaW5nIGV2ZW50TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoImdldFdvcmtmbG93c0J5RXZlbnQiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGV2ZW50TmFtZSkpOworICAgICAgcmV0dXJuIHdvcmtmbG93UmVwby5nZXRXb3JrZmxvd3NGb3JFdmVudChldmVudE5hbWUpOworICAgfQorCisgICBwdWJsaWMgTWV0YWRhdGEgZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhKFN0cmluZyB3SW5zdElkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygiZ2V0V29ya2Zsb3dJbnN0YW5jZU1ldGFkYXRhIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB3SW5zdElkKSk7CisgICAgICByZXR1cm4gbmV3IE1ldGFkYXRhKCk7CisgICB9CisKKyAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tTdGFydERhdGVUaW1lKAorICAgICAgICAgU3RyaW5nIHdJbnN0SWQsIFN0cmluZyBzdGFydERhdGVUaW1lSXNvU3RyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygKKyAgICAgICAgICAgICJzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tTdGFydERhdGVUaW1lIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB3SW5zdElkLCBzdGFydERhdGVUaW1lSXNvU3RyKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgcHVibGljIGRvdWJsZSBnZXRXb3JrZmxvd0N1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyhTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygKKyAgICAgICAgICAgICJnZXRXb3JrZmxvd0N1cnJlbnRUYXNrV2FsbENsb2NrTWludXRlcyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgd29ya2Zsb3dJbnN0SWQpKTsKKyAgICAgIHJldHVybiAwLjA7CisgICB9CisKKyAgIHB1YmxpYyBkb3VibGUgZ2V0V29ya2Zsb3dXYWxsQ2xvY2tNaW51dGVzKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldFdvcmtmbG93V2FsbENsb2NrTWludXRlcyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgd29ya2Zsb3dJbnN0SWQpKTsKKyAgICAgIHJldHVybiAwLjA7CisgICB9CisKKyAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wV29ya2Zsb3dJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygKKyAgICAgICAgICAgICJzdG9wV29ya2Zsb3dJbnN0YW5jZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgd29ya2Zsb3dJbnN0SWQpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcGF1c2VXb3JrZmxvd0luc3RhbmNlKFN0cmluZyB3b3JrZmxvd0luc3RJZCkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgInBhdXNlV29ya2Zsb3dJbnN0YW5jZSIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgd29ya2Zsb3dJbnN0SWQpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVzdW1lV29ya2Zsb3dJbnN0YW5jZShTdHJpbmcgd29ya2Zsb3dJbnN0SWQpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygKKyAgICAgICAgICAgICJyZXN1bWVXb3JrZmxvd0luc3RhbmNlIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB3b3JrZmxvd0luc3RJZCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRXb3JrZmxvd0luc3RhbmNlQ3VycmVudFRhc2tFbmREYXRlVGltZSgKKyAgICAgICAgIFN0cmluZyB3SW5zdElkLCBTdHJpbmcgZW5kRGF0ZVRpbWVJc29TdHIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgInNldFdvcmtmbG93SW5zdGFuY2VDdXJyZW50VGFza0VuZERhdGVUaW1lIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB3SW5zdElkLCBlbmREYXRlVGltZUlzb1N0cikpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVXb3JrZmxvd0luc3RhbmNlU3RhdHVzKAorICAgICAgICAgU3RyaW5nIHdvcmtmbG93SW5zdElkLCBTdHJpbmcgc3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygKKyAgICAgICAgICAgICJ1cGRhdGVXb3JrZmxvd0luc3RhbmNlU3RhdHVzIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgoT2JqZWN0KSB3b3JrZmxvd0luc3RJZCwgc3RhdHVzKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVwZGF0ZVdvcmtmbG93SW5zdGFuY2UoV29ya2Zsb3dJbnN0YW5jZSBpbnN0YW5jZSkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgInVwZGF0ZVdvcmtmbG93SW5zdGFuY2UiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGluc3RhbmNlKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVwZGF0ZU1ldGFkYXRhRm9yV29ya2Zsb3coU3RyaW5nIHdvcmtmbG93SW5zdElkLAorICAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgInVwZGF0ZU1ldGFkYXRhRm9yV29ya2Zsb3ciLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHdvcmtmbG93SW5zdElkLCBtZXRhZGF0YSkpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHB1YmxpYyBib29sZWFuIHNlbmRFdmVudChTdHJpbmcgZXZlbnROYW1lLCBNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgInNlbmRFdmVudCIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgZXZlbnROYW1lLCBtZXRhZGF0YSkpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHB1YmxpYyBXb3JrZmxvd1Rhc2sgZ2V0VGFza0J5SWQoU3RyaW5nIHRhc2tJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoCisgICAgICAgICAgICAiZ2V0VGFza0J5SWQiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHRhc2tJZCkpOworICAgICAgcmV0dXJuIHdvcmtmbG93UmVwby5nZXRXb3JrZmxvd1Rhc2tCeUlkKHRhc2tJZCk7CisgICB9CisKKyAgIHB1YmxpYyBXb3JrZmxvd0NvbmRpdGlvbiBnZXRDb25kaXRpb25CeUlkKFN0cmluZyBjb25kaXRpb25JZCkKKyAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldENvbmRpdGlvbkJ5SWQiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIGNvbmRpdGlvbklkKSk7CisgICAgICByZXR1cm4gd29ya2Zsb3dSZXBvLmdldFdvcmtmbG93Q29uZGl0aW9uQnlJZChjb25kaXRpb25JZCk7CisgICB9CisKKyAgIHB1YmxpYyBXb3JrZmxvd0luc3RhbmNlIGdldFdvcmtmbG93SW5zdGFuY2VCeUlkKFN0cmluZyB3SW5zdElkKQorICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBsYXN0TWV0aG9kQ2FsbERldGFpbHMgPSBuZXcgTWV0aG9kQ2FsbERldGFpbHMoCisgICAgICAgICAgICAiZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHdJbnN0SWQpKTsKKyAgICAgIFdvcmtmbG93SW5zdGFuY2Ugd0luc3QgPSBuZXcgV29ya2Zsb3dJbnN0YW5jZSgpOworICAgICAgd0luc3Quc2V0U3RhdHVzKCJSdW5uaW5nIik7CisgICAgICB3SW5zdC5zZXRJZCgiVGVzdElkIik7CisgICAgICB3SW5zdC5zZXRXb3JrZmxvdyh3b3JrZmxvd1JlcG8uZ2V0V29ya2Zsb3dCeUlkKAorICAgICAgICAgICAgTW9ja1dvcmtmbG93UmVwb3NpdG9yeS5XT1JLRkxPVzFfSUQpKTsKKyAgICAgIHdJbnN0LnNldEN1cnJlbnRUYXNrSWQoTW9ja1dvcmtmbG93UmVwb3NpdG9yeS5UQVNLMV9JRCk7CisgICAgICByZXR1cm4gd0luc3Q7CisgICB9CisKKyAgIHB1YmxpYyBXb3JrZmxvdyBnZXRXb3JrZmxvd0J5SWQoU3RyaW5nIHdvcmtmbG93SWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldFdvcmtmbG93QnlJZCIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKE9iamVjdCkgd29ya2Zsb3dJZCkpOworICAgICAgcmV0dXJuIHdvcmtmbG93UmVwby5nZXRXb3JrZmxvd0J5SWQod29ya2Zsb3dJZCk7CisgICB9CisKKyAgIHB1YmxpYyBWZWN0b3I8V29ya2Zsb3c+IGdldFdvcmtmbG93cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldFdvcmtmbG93cyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICByZXR1cm4gbmV3IFZlY3RvcjxXb3JrZmxvdz4od29ya2Zsb3dSZXBvLmdldFdvcmtmbG93cygpKTsKKyAgIH0KKworICAgcHVibGljIGludCBnZXROdW1Xb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKFN0cmluZyBzdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldE51bVdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHN0YXR1cykpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIHB1YmxpYyBpbnQgZ2V0TnVtV29ya2Zsb3dJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxhc3RNZXRob2RDYWxsRGV0YWlscyA9IG5ldyBNZXRob2RDYWxsRGV0YWlscygKKyAgICAgICAgICAgICJnZXROdW1Xb3JrZmxvd0luc3RhbmNlcyIsCisgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QoKSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgcHVibGljIFZlY3RvcjxXb3JrZmxvd0luc3RhbmNlPiBnZXRXb3JrZmxvd0luc3RhbmNlc0J5U3RhdHVzKFN0cmluZyBzdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldFdvcmtmbG93SW5zdGFuY2VzQnlTdGF0dXMiLAorICAgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0KChPYmplY3QpIHN0YXR1cykpOworICAgICAgcmV0dXJuIG5ldyBWZWN0b3I8V29ya2Zsb3dJbnN0YW5jZT4oKTsKKyAgIH0KKworICAgcHVibGljIFZlY3RvcjxXb3JrZmxvd0luc3RhbmNlPiBnZXRXb3JrZmxvd0luc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbGFzdE1ldGhvZENhbGxEZXRhaWxzID0gbmV3IE1ldGhvZENhbGxEZXRhaWxzKAorICAgICAgICAgICAgImdldFdvcmtmbG93SW5zdGFuY2VzIiwKKyAgICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdCgpKTsKKyAgICAgIHJldHVybiBuZXcgVmVjdG9yPFdvcmtmbG93SW5zdGFuY2U+KCk7CisgICB9CisKKyAgIHB1YmxpYyBjbGFzcyBNZXRob2RDYWxsRGV0YWlscyB7CisgICAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOworICAgICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gYXJnczsKKworICAgICAgcHVibGljIE1ldGhvZENhbGxEZXRhaWxzKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0PE9iamVjdD4gYXJncykgeworICAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKKyAgICAgICAgIHJldHVybiBtZXRob2ROYW1lOworICAgICAgfQorCisgICAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldEFyZ3MoKSB7CisgICAgICAgICByZXR1cm4gYXJnczsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3N5c3RlbS9UZXN0WG1sUnBjV29ya2Zsb3dNYW5hZ2VyLmphdmEgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zeXN0ZW0vVGVzdFhtbFJwY1dvcmtmbG93TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWJkYzAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zeXN0ZW0vVGVzdFhtbFJwY1dvcmtmbG93TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zeXN0ZW07CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vSnVuaXQgaW1wb3J0cworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMubWV0YWRhdGEuTWV0YWRhdGE7CisKKy8qKgorICogCisgKiAKKyAqIFRlc3QgaGFybmVzcyBmb3IgdGhlIHtAbGluayBYbWxScGNXb3JrZmxvd01hbmFnZXJ9LgorICogCisgKiBAYXV0aG9yIHNoZXJ5bGoKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGVzdFhtbFJwY1dvcmtmbG93TWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV01fUE9SVCA9IDUwMDAyOworCisgIHByaXZhdGUgWG1sUnBjV29ya2Zsb3dNYW5hZ2VyIHdtZ3I7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbHVjZW5lQ2F0TG9jOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgIC5nZXRMb2dnZXIoVGVzdFhtbFJwY1dvcmtmbG93TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrZmxvd0luc3RhbmNlcygpIHsKKworICAgIFZlY3RvciB3b3JrZmxvd0luc3RzID0gbnVsbDsKKworICAgIGludCBudW1JbnN0cyA9IC0xOworICAgIHdoaWxlIChudW1JbnN0cyAhPSAyKSB7CisgICAgICB0cnkgeworICAgICAgICB3b3JrZmxvd0luc3RzID0gd21nci5nZXRXb3JrZmxvd0luc3RhbmNlcygpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKworICAgICAgYXNzZXJ0Tm90TnVsbCh3b3JrZmxvd0luc3RzKTsKKyAgICAgIG51bUluc3RzID0gd29ya2Zsb3dJbnN0cy5zaXplKCk7CisgICAgfQorCisgICAgYXNzZXJ0RXF1YWxzKDIsIHdvcmtmbG93SW5zdHMuc2l6ZSgpKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3RhcnRYbWxScGNXb3JrZmxvd01hbmFnZXIoKTsKKyAgICBzdGFydFdvcmtmbG93KCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCisgIH0KKworICBwcml2YXRlIHZvaWQgc3RhcnRXb3JrZmxvdygpIHsKKyAgICBYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgY2xpZW50ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgY2xpZW50ID0gbmV3IFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIKKyAgICAgICAgICArIFdNX1BPUlQpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC5zZW5kRXZlbnQoImxvbmciLCBuZXcgTWV0YWRhdGEoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdGFydFhtbFJwY1dvcmtmbG93TWFuYWdlcigpIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlIiwgbmV3IEZpbGUoCisgICAgICAgICIuL3NyYy9tYWluL3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMiKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB0cnkgeworICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5sb2FkKAorICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oIi4vc3JjL21haW4vcmVzb3VyY2VzL3dvcmtmbG93LnByb3BlcnRpZXMiKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBsdWNlbmVDYXRMb2MgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJibGFoIiwgInR4dCIpLmdldFBhcmVudEZpbGUoKQorICAgICAgICAgIC5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICBsdWNlbmVDYXRMb2MgPSAhbHVjZW5lQ2F0TG9jLmVuZHNXaXRoKCIvIikgPyBsdWNlbmVDYXRMb2MgKyAiLyIKKyAgICAgICAgICA6IGx1Y2VuZUNhdExvYzsKKyAgICAgIGx1Y2VuZUNhdExvYyArPSAicmVwbyI7CisgICAgICBMT0cubG9nKExldmVsLklORk8sICJMdWNlbmUgaW5zdGFuY2UgcmVwb3NpdG9yeTogWyIgKyBsdWNlbmVDYXRMb2MgKyAiXSIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBpZiAobmV3IEZpbGUobHVjZW5lQ2F0TG9jKS5leGlzdHMoKSkgeworICAgICAgLy8gYmxvdyBhd2F5IGx1Y2VuZSBjYXQKKyAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgIlJlbW92aW5nIHdvcmtmbG93IGluc3RhbmNlIHJlcG9zaXRvcnk6IFsiCisgICAgICAgICAgKyBsdWNlbmVDYXRMb2MgKyAiXSIpOworICAgICAgdHJ5IHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShuZXcgRmlsZShsdWNlbmVDYXRMb2MpKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorCisgICAgU3lzdGVtCisgICAgICAgIC5zZXRQcm9wZXJ0eSgid29ya2Zsb3cuZW5naW5lLmluc3RhbmNlUmVwLmZhY3RvcnkiLAorICAgICAgICAgICAgIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uTHVjZW5lV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnlGYWN0b3J5Iik7CisgICAgU3lzdGVtCisgICAgICAgIC5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0YW5jZVJlcC5sdWNlbmUuaWR4UGF0aCIsCisgICAgICAgICAgICBsdWNlbmVDYXRMb2MpOworCisgICAgdHJ5IHsKKyAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvLmRpcnMiLCAiZmlsZTovLyIKKyAgICAgICAgICArIG5ldyBGaWxlKCIuL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlcyIpLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cubGlmZWN5Y2xlLmZpbGVQYXRoIiwKKyAgICAgICAgICBuZXcgRmlsZSgiLi9zcmMvbWFpbi9yZXNvdXJjZXMvZXhhbXBsZXMvd29ya2Zsb3ctbGlmZWN5Y2xlLnhtbCIpCisgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgd21nciA9IG5ldyBYbWxScGNXb3JrZmxvd01hbmFnZXIoV01fUE9SVCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L2Nhcy93b3JrZmxvdy9zeXN0ZW0vVGVzdFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudC5qYXZhIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3lzdGVtL1Rlc3RYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFiZjhkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvc3lzdGVtL1Rlc3RYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLkx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dDb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuV29ya2Zsb3dUYXNrQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnN0cnVjdHMuZXhjZXB0aW9ucy5JbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb247CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciB0aGUge0BsaW5rIFhtbFJwY1dvcmtmbG93TWFuYWdlckNsaWVudH0uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNhdGFsb2dQYXRoID0gbmV3IEZpbGUoIi4vdGFyZ2V0L2luc3RUZXN0TWV0Q2F0IikKKyAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICBwcml2YXRlIEx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5IHJlcG8gPSBudWxsOworICBwcml2YXRlIFdvcmtmbG93SW5zdGFuY2UgdGVzdFdya0luc3QgPSBudWxsOworICBwcml2YXRlIFdvcmtmbG93IHRlc3RXcmtGbHc7CisgIHByaXZhdGUgV29ya2Zsb3dUYXNrIHRlc3RUYXNrOworICBwcml2YXRlIFdvcmtmbG93Q29uZGl0aW9uIHRlc3RDb25kOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzdGRQZ1N6ID0gMjA7CisKKyAgcHVibGljIFRlc3RYbWxScGNXb3JrZmxvd01hbmFnZXJDbGllbnQoKSB7CisKKyAgICB0ZXN0V3JrSW5zdCA9IG5ldyBXb3JrZmxvd0luc3RhbmNlKCk7CisgICAgdGVzdFdya0ZsdyA9IG5ldyBXb3JrZmxvdygpOworICAgIHRlc3RUYXNrID0gbmV3IFdvcmtmbG93VGFzaygpOworICAgIHRlc3RDb25kID0gbmV3IFdvcmtmbG93Q29uZGl0aW9uKCk7CisgICAgTWV0YWRhdGEgc2hhcmVkQ29udGV4dCA9IG5ldyBNZXRhZGF0YSgpOworCisgICAgLy8gdG8gY2hlY2sgaWYgdGhlIHBhdGggYWxyZWFkeSBleGlzdHMgYW5kIHRvIGRlbGV0ZSBpZiBpdCBkb2VzIGV4aXN0CisgICAgaWYgKG5ldyBGaWxlKGNhdGFsb2dQYXRoKS5leGlzdHMoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShuZXcgRmlsZShjYXRhbG9nUGF0aCkpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVwbyA9IG5ldyBMdWNlbmVXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeShjYXRhbG9nUGF0aCwgc3RkUGdTeik7CisKKyAgICB0ZXN0V3JrRmx3LnNldE5hbWUoInRlc3QuZ2V0TWV0YWRhdGFXb3JrZmxvdyIpOworICAgIHRlc3RXcmtGbHcuc2V0SWQoInRlc3QuaWQiKTsKKyAgICBMaXN0IHRhc2tzID0gbmV3IFZlY3RvcigpOworICAgIExpc3QgY29uZHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICB0ZXN0Q29uZC5zZXRDb25kaXRpb25JZCgidGVzdC5jb25kLmlkIik7CisgICAgdGVzdENvbmQuc2V0Q29uZGl0aW9uSW5zdGFuY2VDbGFzc05hbWUoInRlc3QuY2xhc3MiKTsKKyAgICB0ZXN0Q29uZC5zZXRDb25kaXRpb25OYW1lKCJ0ZXN0LmNvbmQubmFtZSIpOworICAgIHRlc3RDb25kLnNldE9yZGVyKDEpOworICAgIGNvbmRzLmFkZCh0ZXN0Q29uZCk7CisKKyAgICB0ZXN0VGFzay5zZXRUYXNrQ29uZmlnKG5ldyBXb3JrZmxvd1Rhc2tDb25maWd1cmF0aW9uKCkpOworICAgIHRlc3RUYXNrLnNldFRhc2tJZCgidGVzdC50YXNrLmlkIik7CisgICAgdGVzdFRhc2suc2V0Q29uZGl0aW9ucyhjb25kcyk7CisgICAgdGVzdFRhc2suc2V0T3JkZXIoMSk7CisgICAgdGVzdFRhc2suc2V0VGFza0luc3RhbmNlQ2xhc3NOYW1lKCJ0ZXN0LmNsYXNzIik7CisgICAgdGVzdFRhc2suc2V0VGFza05hbWUoInRlc3QudGFzay5uYW1lIik7CisgICAgdGFza3MuYWRkKHRlc3RUYXNrKTsKKyAgICB0ZXN0V3JrRmx3LnNldFRhc2tzKHRhc2tzKTsKKworICAgIHRlc3RXcmtJbnN0LnNldEN1cnJlbnRUYXNrSWQoInRlc3QudGFzayIpOworICAgIHRlc3RXcmtJbnN0LnNldFN0YXR1cygiU1RBUlRFRCIpOworICAgIHRlc3RXcmtJbnN0LnNldFdvcmtmbG93KHRlc3RXcmtGbHcpOworCisgICAgc2hhcmVkQ29udGV4dC5hZGRNZXRhZGF0YSgia2V5MSIsICJ2YWwxIik7CisgICAgc2hhcmVkQ29udGV4dC5hZGRNZXRhZGF0YSgia2V5MSIsICJ2YWwyIik7CisgICAgc2hhcmVkQ29udGV4dC5hZGRNZXRhZGF0YSgia2V5MSIsICJ2YWwzIik7CisgICAgc2hhcmVkQ29udGV4dC5hZGRNZXRhZGF0YSgia2V5MiIsICJ2YWw0Iik7CisgICAgc2hhcmVkQ29udGV4dC5hZGRNZXRhZGF0YSgia2V5MiIsICJ2YWw1Iik7CisgICAgdGVzdFdya0luc3Quc2V0U2hhcmVkQ29udGV4dChzaGFyZWRDb250ZXh0KTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdldFdvcmtmbG93SW5zdGFuY2VNZXRhZGF0YSgpIHsKKworICAgIHRyeSB7CisgICAgICByZXBvLmFkZFdvcmtmbG93SW5zdGFuY2UodGVzdFdya0luc3QpOworICAgIH0gY2F0Y2ggKEluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgU3RyaW5nIHRlc3RXcmtJbnN0SWQgPSB0ZXN0V3JrSW5zdC5nZXRJZCgpOworICAgIGFzc2VydE5vdE51bGwodGVzdFdya0luc3RJZCk7CisKKyAgICAvLyBnZXQgd29ya2Zsb3cgaW5zdGFuY2UgZnJvbSBpbnN0YW5jZSBpZAorICAgIFdvcmtmbG93SW5zdGFuY2UgV0luc3QgPSBudWxsOworICAgIHRyeSB7CisgICAgICBXSW5zdCA9IHJlcG8uZ2V0V29ya2Zsb3dJbnN0YW5jZUJ5SWQodGVzdFdya0luc3RJZCk7CisgICAgfSBjYXRjaCAoSW5zdGFuY2VSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGFzc2VydE5vdE51bGwoV0luc3QpOworCisgICAgLy8gZ2V0IE1ldGFkYXRhIGZvciB0aGUgd29ya2Zsb3cgaW5zdGFuY2UKKyAgICBNZXRhZGF0YSBtZXQgPSBudWxsOworICAgIG1ldCA9IFdJbnN0LmdldFNoYXJlZENvbnRleHQoKTsKKyAgICBhc3NlcnROb3ROdWxsKG1ldCk7CisKKyAgICBhc3NlcnROb3ROdWxsKG1ldC5nZXRIYXNodGFibGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldC5nZXRIYXNodGFibGUoKS5rZXlTZXQoKS5zaXplKCkpOworICAgIGFzc2VydE5vdE51bGwobWV0LmdldEFsbE1ldGFkYXRhKCJrZXkxIikpOworICAgIGFzc2VydEVxdWFscygzLCBtZXQuZ2V0QWxsTWV0YWRhdGEoImtleTEiKS5zaXplKCkpOworICAgIGFzc2VydE5vdE51bGwobWV0LmdldEFsbE1ldGFkYXRhKCJrZXkyIikpOworICAgIGFzc2VydEVxdWFscygyLCBtZXQuZ2V0QWxsTWV0YWRhdGEoImtleTIiKS5zaXplKCkpOworCisgICAgLy8gY2hlY2sga2V5LXZhbHVlcyBmb3Iga2V5MQorICAgIGJvb2xlYW4gY2hlY2tWYWwxID0gZmFsc2UsIGNoZWNrVmFsMiA9IGZhbHNlLCBjaGVja1ZhbDMgPSBmYWxzZTsKKworICAgIGZvciAoSXRlcmF0b3IgaSA9IG1ldC5nZXRBbGxNZXRhZGF0YSgia2V5MSIpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgaWYgKHZhbC5lcXVhbHMoInZhbDEiKSkgeworICAgICAgICBjaGVja1ZhbDEgPSB0cnVlOworICAgICAgfSBlbHNlIGlmICh2YWwuZXF1YWxzKCJ2YWwyIikpIHsKKyAgICAgICAgY2hlY2tWYWwyID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAodmFsLmVxdWFscygidmFsMyIpKSB7CisgICAgICAgIGNoZWNrVmFsMyA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0IChjaGVja1ZhbDEgJiYgY2hlY2tWYWwyICYmIGNoZWNrVmFsMyk7CisKKyAgICAvLyBjaGVjayBrZXktdmFsdWVzIGZvciBrZXkyCisgICAgYm9vbGVhbiBjaGVja1ZhbDQgPSBmYWxzZSwgY2hlY2tWYWw1ID0gZmFsc2U7CisKKyAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtZXQuZ2V0QWxsTWV0YWRhdGEoImtleTIiKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgIGlmICh2YWwuZXF1YWxzKCJ2YWw0IikpIHsKKyAgICAgICAgY2hlY2tWYWw0ID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAodmFsLmVxdWFscygidmFsNSIpKSB7CisgICAgICAgIGNoZWNrVmFsNSA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0VHJ1ZShjaGVja1ZhbDQgJiYgY2hlY2tWYWw1KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdG9vbHMvVGVzdEluc3RhbmNlUmVwb0NsZWFuZXIuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3Rvb2xzL1Rlc3RJbnN0YW5jZVJlcG9DbGVhbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmOWY0ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3Rvb2xzL1Rlc3RJbnN0YW5jZVJlcG9DbGVhbmVyLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LnRvb2xzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93Lmluc3RyZXBvLkx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuaW5zdHJlcG8uV29ya2Zsb3dJbnN0YW5jZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93SW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5zdHJ1Y3RzLldvcmtmbG93U3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5leGNlcHRpb25zLkluc3RhbmNlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIAorICogVGVzdCBoYXJuZXNzIGZvciB0aGUge0BsaW5rIEluc3RhbmNlUmVwb0NsZWFuZXJ9LgorICogCisgKiBAYXV0aG9yIG1hdHRtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAc2luY2UgCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRlc3RJbnN0YW5jZVJlcG9DbGVhbmVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgU3RyaW5nIGluc3RSZXBvUGF0aDsKKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW4oKSB7CisgICAgSW5zdGFuY2VSZXBvQ2xlYW5lciBjbGVhbmVyID0gbmV3IEluc3RhbmNlUmVwb0NsZWFuZXIoKTsKKyAgICBjbGVhbmVyLnNldEluc3RhbmNlUmVwbyhpbnN0UmVwb1BhdGgpOworICAgIHRyeSB7CisgICAgICBjbGVhbmVyLmNsZWFuUmVwb3NpdG9yeSgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBXb3JrZmxvd0luc3RhbmNlUmVwb3NpdG9yeSByZXBvID0gbmV3IEx1Y2VuZVdvcmtmbG93SW5zdGFuY2VSZXBvc2l0b3J5KAorICAgICAgICBpbnN0UmVwb1BhdGgsIDIwKTsKKyAgICB0cnkgeworICAgICAgYXNzZXJ0RXF1YWxzKDEwLCByZXBvLmdldE51bVdvcmtmbG93SW5zdGFuY2VzKCkpOworICAgICAgZm9yIChXb3JrZmxvd0luc3RhbmNlIGluc3QgOiAoTGlzdDxXb3JrZmxvd0luc3RhbmNlPikgcmVwbworICAgICAgICAgIC5nZXRXb3JrZmxvd0luc3RhbmNlcygpKSB7CisgICAgICAgIGlmICghaW5zdC5nZXRTdGF0dXMoKS5lcXVhbHMoV29ya2Zsb3dTdGF0dXMuRklOSVNIRUQpKSB7CisgICAgICAgICAgZmFpbCgiV29ya2Zsb3cgSW5zdGFuY2U6IFsiICsgaW5zdC5nZXRJZCgpCisgICAgICAgICAgICAgICsgIl0gZG9lcyB3YXMgbm90IG1hcmtlZCBhcyBmaW5pc2hlZCBieSB0aGUgY2xlYW5lcjogc3RhdHVzOiBbIgorICAgICAgICAgICAgICArIGluc3QuZ2V0U3RhdHVzKCkgKyAiXSIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IGNhdGNoIChJbnN0YW5jZVJlcG9zaXRvcnlFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gZ2V0IGEgdGVtcCBkaXJlY3RvcnkgcGF0aAorICAgIEZpbGUgdGVtcERpciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJvZ3VzIiwgInR4dCIpLmdldFBhcmVudEZpbGUoKTsKKyAgICBGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZSgiLi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGluc3RyZXBvIiksIG5ldyBGaWxlKAorICAgICAgICB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgInRlc3RpbnN0cmVwbyIpKTsKKyAgICBpbnN0UmVwb1BhdGggPSB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIvIikgPyAodGVtcERpcgorICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkgKyAidGVzdGluc3RyZXBvIikKKyAgICAgICAgOiAodGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArICJ0ZXN0aW5zdHJlcG8iKTsKKworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKiAKKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShuZXcgRmlsZShpbnN0UmVwb1BhdGgpKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvVGVzdEdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkuamF2YSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQvY2FzL3dvcmtmbG93L3V0aWwvVGVzdEdlbmVyaWNXb3JrZmxvd09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZhNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC9jYXMvd29ya2Zsb3cvdXRpbC9UZXN0R2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5Xb3JrZmxvd1Rhc2tJbnN0YW5jZTsKKworLy9KdW5pdCBpbXBvcnRzCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgbWF0dG1hbm4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIAorICogPHA+CisgKiBBIFRlc3QgU3VpdGUgZm9yIHRoZSBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5IGNsYXNzLgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5IGV4dGVuZHMgVGVzdENhc2UgeworCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVRhc2soKSB7CisJCVN0cmluZyB0YXNrQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Mb25nVGFzayI7CisKKwkJV29ya2Zsb3dUYXNrSW5zdGFuY2UgdGFza0luc3QgPSBHZW5lcmljV29ya2Zsb3dPYmplY3RGYWN0b3J5CisJCQkJLmdldFRhc2tPYmplY3RGcm9tQ2xhc3NOYW1lKHRhc2tDbGFzcyk7CisJCWFzc2VydE5vdE51bGwodGFza0luc3QpOworCQlhc3NlcnRFcXVhbHMoIlRoZSBjbGFzczogWyIgKyB0YXNrSW5zdC5nZXRDbGFzcygpLmdldE5hbWUoKQorCQkJCSsgIl0gaXMgbm90ICIgKyAiZXF1YWwgdG8gdGhlIGV4cGVjdGVkIGNsYXNzIG5hbWU6IFsiCisJCQkJKyB0YXNrQ2xhc3MgKyAiXSIsIHRhc2tDbGFzcywgdGFza0luc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb25kaXRpb24oKSB7CisJCVN0cmluZyBjb25kQ2xhc3MgPSAib3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5Mb25nQ29uZGl0aW9uIjsKKworCQlXb3JrZmxvd0NvbmRpdGlvbkluc3RhbmNlIGNvbmRJbnN0ID0gR2VuZXJpY1dvcmtmbG93T2JqZWN0RmFjdG9yeQorCQkJCS5nZXRDb25kaXRpb25PYmplY3RGcm9tQ2xhc3NOYW1lKGNvbmRDbGFzcyk7CisJCWFzc2VydE5vdE51bGwoY29uZEluc3QpOworCQlhc3NlcnRFcXVhbHMoY29uZENsYXNzLCBjb25kSW5zdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L3Jlc291cmNlcy9teVNjcmlwdC1PdXRwdXQudHh0IGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvbXlTY3JpcHQtT3V0cHV0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdmMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvbXlTY3JpcHQtT3V0cHV0LnR4dApAQCAtMCwwICsxIEBACitIaSBteSBmaXJzdCBuYW1lIGlzIEZhcmFuYWsgYW5kIG15IGxhc3QgbmFtZSBpcyBEYXZvb2RpLgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvbXlTY3JpcHQuc2ggYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L3Jlc291cmNlcy9teVNjcmlwdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDlmYmY3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvbXlTY3JpcHQuc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YKKyMgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gICAgCitlY2hvIEhpIG15IGZpcnN0IG5hbWUgaXMgICQxIGFuZCBteSBsYXN0IG5hbWUgaXMgJDIuID4gLi9zcmMvdGVzdGRhdGEvbXlTY3JpcHQtT3V0cHV0LnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5sb2dnaW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2N2RmYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QubG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRgorIyBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKworIyBTcGVjaWZ5IHRoZSBoYW5kbGVycyB0byBjcmVhdGUgaW4gdGhlIHJvb3QgbG9nZ2VyCisjIChhbGwgbG9nZ2VycyBhcmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgbG9nZ2VyKQorIyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgdHdvIGhhbmRsZXJzCitoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCisKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSByb290IGxvZ2dlcgorLmxldmVsID0gQUxMCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEFMTAorICAgICAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisgICAgCisjIFNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgc3Vic3lzdGVtcworCisjIGRhdGEgc3RydWN0dXJlcyBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3RydWN0cy5sZXZlbCA9IElORk8KKworIyBlbmdpbmUgc3Vic3lzdGVtCitvcmcuYXBhY2hlLm9vZHQuY2FzLndvcmtmbG93LmVuZ2luZS5sZXZlbCA9IElORk8KKworIyBpbnN0YW5jZSByZXBvc2l0b3J5IHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5pbnN0cmVwby5sZXZlbCA9IElORk8KKworIyByZXBvc2l0b3J5IHN1YnN5c3RlbQorb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5yZXBvc2l0b3J5LmxldmVsID0gSU5GTworCisjIHN5c3RlbSBzdWJzeXN0ZW0KK29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuc3lzdGVtLmxldmVsID0gRklORQorCisjIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgY29tbW9ucy1odHRwY2xpZW50IHRyYW5zcG9ydCBsYXllciBmb3IgeG1scnBjIAorb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubGV2ZWwgPSBJTkZPCitodHRwY2xpZW50LndpcmUuaGVhZGVyLmxldmVsID0gSU5GTworaHR0cGNsaWVudC53aXJlLmxldmVsID0gSU5GTworc3VuLm5ldC5sZXZlbCA9IE9GRgorc3VuLm5ldC53d3cubGV2ZWwgPSBPRkYKKwpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGluc3RyZXBvL180My5jZnMgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0aW5zdHJlcG8vXzQzLmNmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGZhZWUzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGluc3RyZXBvL180My5jZnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGluc3RyZXBvL2RlbGV0YWJsZSBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RpbnN0cmVwby9kZWxldGFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzZjQ3MAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAvd29ya2Zsb3cvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RpbnN0cmVwby9kZWxldGFibGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGluc3RyZXBvL3NlZ21lbnRzIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdGluc3RyZXBvL3NlZ21lbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjAwZDIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0aW5zdHJlcG8vc2VnbWVudHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvd29ya2Zsb3cuc3FsIGIvMC4xMC93b3JrZmxvdy9zcmMvdGVzdC9yZXNvdXJjZXMvd29ya2Zsb3cuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjVhNjkKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3dvcmtmbG93L3NyYy90ZXN0L3Jlc291cmNlcy93b3JrZmxvdy5zcWwKQEAgLTAsMCArMSw4MSBAQAorCitEUk9QIFRBQkxFIHdvcmtmbG93cyBJRiBFWElTVFM7CitEUk9QIFRBQkxFIHdvcmtmbG93X2NvbmRpdGlvbl9tYXAgSUYgRVhJU1RTOworRFJPUCBUQUJMRSBldmVudF93b3JrZmxvd19tYXAgSUYgRVhJU1RTOworRFJPUCBUQUJMRSB3b3JrZmxvd190YXNrcyBJRiBFWElTVFM7CitEUk9QIFRBQkxFIHdvcmtmbG93X3Rhc2tfbWFwIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgd29ya2Zsb3dfaW5zdGFuY2VzIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgd29ya2Zsb3dfaW5zdGFuY2VfbWV0YWRhdGEgSUYgRVhJU1RTOworRFJPUCBUQUJMRSB3b3JrZmxvd19jb25kaXRpb25zIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgdGFza19jb25kaXRpb25fbWFwIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgd29ya2Zsb3dfdGFza19jb25maWd1cmF0aW9uIElGIEVYSVNUUzsKK0RST1AgVEFCTEUgd29ya2Zsb3dfY29uZGl0aW9uX2NvbmZpZ3VyYXRpb24gSUYgRVhJU1RTOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dzIAorKHdvcmtmbG93X2lkIGludCBOT1QgTlVMTCBQUklNQVJZIEtFWSwgCit3b3JrZmxvd19uYW1lIHZhcmNoYXIoMjU1KSk7CisKK0NSRUFURSBUQUJMRSB3b3JrZmxvd19jb25kaXRpb25fbWFwCisod29ya2Zsb3dfaWQgaW50IE5PVCBOVUxMLAord29ya2Zsb3dfY29uZGl0aW9uX2lkIGludCBOT1QgTlVMTCwKK2NvbmRpdGlvbl9vcmRlciBpbnQgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgZXZlbnRfd29ya2Zsb3dfbWFwCisod29ya2Zsb3dfaWQgaW50IE5PVCBOVUxMLAorZXZlbnRfbmFtZSB2YXJjaGFyKDI1NSkgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfdGFza3MKKyh3b3JrZmxvd190YXNrX2lkIGludCBOT1QgTlVMTCBQUklNQVJZIEtFWSwKK3dvcmtmbG93X3Rhc2tfbmFtZSB2YXJjaGFyKDI1NSksCit3b3JrZmxvd190YXNrX2NsYXNzIHZhcmNoYXIoMjU1KSk7CisKK0NSRUFURSBUQUJMRSB3b3JrZmxvd190YXNrX21hcAorKHdvcmtmbG93X2lkIGludCBOT1QgTlVMTCwKK3dvcmtmbG93X3Rhc2tfaWQgaW50IE5PVCBOVUxMLAordGFza19vcmRlciBpbnQgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfaW5zdGFuY2VzCisod29ya2Zsb3dfaW5zdGFuY2VfaWQgaW50IE5PVCBOVUxMIFBSSU1BUlkgS0VZLAord29ya2Zsb3dfaW5zdGFuY2Vfc3RhdHVzIHZhcmNoYXIoMjU1KSwKK3dvcmtmbG93X2lkIGludCBOT1QgTlVMTCwKK2N1cnJlbnRfdGFza19pZCBpbnQgTk9UIE5VTEwsCitzdGFydF9kYXRlX3RpbWUgdmFyY2hhcigyNTUpLAorZW5kX2RhdGVfdGltZSB2YXJjaGFyKDI1NSksCitjdXJyZW50X3Rhc2tfc3RhcnRfZGF0ZV90aW1lIHZhcmNoYXIoMjU1KSwKK2N1cnJlbnRfdGFza19lbmRfZGF0ZV90aW1lIHZhcmNoYXIoMjU1KSwKK3ByaW9yaXR5IGZsb2F0IE5PVCBOVUxMLAordGltZXNfYmxvY2tlZCBpbnQgREVGQVVMVCAwKTsKKworQ1JFQVRFIFRBQkxFIHdvcmtmbG93X2luc3RhbmNlX21ldGFkYXRhCisod29ya2Zsb3dfaW5zdGFuY2VfaWQgaW50IE5PVCBOVUxMLAord29ya2Zsb3dfbWV0X2tleSB2YXJjaGFyKDEwMDApIE5PVCBOVUxMLAord29ya2Zsb3dfbWV0X3ZhbCB2YXJjaGFyKDEwMDApIE5PVCBOVUxMKTsKKworQ1JFQVRFIFRBQkxFIHdvcmtmbG93X2NvbmRpdGlvbnMKKyh3b3JrZmxvd19jb25kaXRpb25faWQgaW50IE5PVCBOVUxMIFBSSU1BUlkgS0VZLAord29ya2Zsb3dfY29uZGl0aW9uX25hbWUgdmFyY2hhcigyNTUpIE5PVCBOVUxMLAord29ya2Zsb3dfY29uZGl0aW9uX2NsYXNzIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKK3dvcmtmbG93X2NvbmRpdGlvbl90aW1lb3V0IGludCBOT1QgTlVMTCwKK3dvcmtmbG93X2NvbmRpdGlvbl9vcHRpb25hbCBib29sZWFuIERFRkFVTFQgZmFsc2UpOworCitDUkVBVEUgVEFCTEUgdGFza19jb25kaXRpb25fbWFwCisod29ya2Zsb3dfdGFza19pZCBpbnQgTk9UIE5VTEwsIAord29ya2Zsb3dfY29uZGl0aW9uX2lkIGludCBOT1QgTlVMTCwKK2NvbmRpdGlvbl9vcmRlciBpbnQgTk9UIE5VTEwpOworCitDUkVBVEUgVEFCTEUgd29ya2Zsb3dfdGFza19jb25maWd1cmF0aW9uCisod29ya2Zsb3dfdGFza19pZCBpbnQgTk9UIE5VTEwsCitwcm9wZXJ0eV9uYW1lIHZhcmNoYXIoMTAwMCkgTk9UIE5VTEwsCitwcm9wZXJ0eV92YWx1ZSB2YXJjaGFyKDEwMDApIE5PVCBOVUxMKTsKKworQ1JFQVRFIFRBQkxFIHdvcmtmbG93X2NvbmRpdGlvbl9jb25maWd1cmF0aW9uCisod29ya2Zsb3dfY29uZGl0aW9uX2lkIGludCBOT1QgTlVMTCwKK3Byb3BlcnR5X25hbWUgdmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKK3Byb3BlcnR5X3ZhbHVlIHZhcmNoYXIoMTAwMCkgTk9UIE5VTEwpOworCitJTlNFUlQgSU5UTyB3b3JrZmxvd19jb25kaXRpb25zIFZBTFVFUyAoJzEnLCAnQ2hlY2tDb25kJywgJ29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuQ2hlY2tGb3JNZXRhZGF0YUtleXMnLCAzMCwgZmFsc2UpOworSU5TRVJUIElOVE8gd29ya2Zsb3dfY29uZGl0aW9uX2NvbmZpZ3VyYXRpb24gVkFMVUVTICgnMScsICdyZXFNZXRLZXlzJywgJ01ldDEsTWV0MixNZXQzJyk7CitJTlNFUlQgSU5UTyB3b3JrZmxvd19jb25kaXRpb25zIFZBTFVFUyAoJzInLCAnRmFsc2VDb25kJywgJ29yZy5hcGFjaGUub29kdC5jYXMud29ya2Zsb3cuZXhhbXBsZXMuRmFsc2VDb25kaXRpb24nLCAxMCwgdHJ1ZSk7CitJTlNFUlQgSU5UTyB3b3JrZmxvd19jb25kaXRpb25zIFZBTFVFUyAoJzMnLCAnVHJ1ZUNvbmQnLCAnb3JnLmFwYWNoZS5vb2R0LmNhcy53b3JrZmxvdy5leGFtcGxlcy5UcnVlQ29uZGl0aW9uJywgMzAsIHRydWUpOworSU5TRVJUIElOVE8gd29ya2Zsb3dzIFZBTFVFUyAoJzEnLCAnVGVzdCBXb3JrZmxvdycpOworSU5TRVJUIElOVE8gd29ya2Zsb3dfY29uZGl0aW9uX21hcCBWQUxVRVMgKCcxJywgJzMnLCAnMScpOwpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9wb20ueG1sIGIvMC4xMC94bWxwcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTBjNTEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3BvbS54bWwKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKwk8IS0tCisJCUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorCQljb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorCQl0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisJCVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KKwkJMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorCQl3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworCQlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5CisJCWFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKwkJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKwkJQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvcgorCQl0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKKwkJTGljZW5zZS4KKwktLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b29kdC1jb3JlPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoPi4uL2NvcmUvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorCTwvcGFyZW50PgorCTxhcnRpZmFjdElkPm9vZHQteG1scHM8L2FydGlmYWN0SWQ+CisJPG5hbWU+WE1MLWNvbmZpZ3VyZWQsIERCTVMtYmFzZWQgUHJvZHVjdCBhbmQgUHJvZmlsZSBTZXJ2ZXI8L25hbWU+CisJPHZlcnNpb24+MC4xMDwvdmVyc2lvbj4KKwk8ZGVzY3JpcHRpb24+CisJICBBbiBYTUwtY29uZmlndXJlZCBEQk1TLWJhc2VkIFByb2R1Y3QgYW5kIFByb2ZpbGUgbWVhbnQgdG8gZWFzaWx5IAorCSAgc2l0IG9uIHRvcCBvZiBXZWItR3JpZCBhbmQgb3RoZXIgUHJvZHVjdCBhbmQgUHJvZmlsZSBzZXJ2ZXIgY29udGV4dHMKKwkgIGZvciByYXBpZCBkZXBsb3ltZW50IGFuZCBpbnRlZ3JhdGlvbi4KKwk8L2Rlc2NyaXB0aW9uPgorCTxidWlsZD4KKwkgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvdGVzdC9qYXZhPC90ZXN0U291cmNlRGlyZWN0b3J5PgorCQk8cmVzb3VyY2VzPgorCQkJPHJlc291cmNlPgorCQkJCTx0YXJnZXRQYXRoPm9yZy9hcGFjaGUvb29kdC94bWxwczwvdGFyZ2V0UGF0aD4KKwkJCQk8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vY29uZjwvZGlyZWN0b3J5PgorCQkJPC9yZXNvdXJjZT4KKwkJPC9yZXNvdXJjZXM+CisJCTx0ZXN0UmVzb3VyY2VzPgorCQkJPHRlc3RSZXNvdXJjZT4KKwkJCQk8dGFyZ2V0UGF0aD5vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZzwvdGFyZ2V0UGF0aD4KKwkJCQk8ZmlsdGVyaW5nIC8+CisJCQkJPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJCTxpbmNsdWRlcyAvPgorCQkJCTxleGNsdWRlcyAvPgorCQkJPC90ZXN0UmVzb3VyY2U+CisJCTwvdGVzdFJlc291cmNlcz4KKwkJCisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxkZXNjcmlwdG9yUmVmcz4KKwkJCQkJCTxkZXNjcmlwdG9yUmVmPmphci13aXRoLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KKwkJCQkJPC9kZXNjcmlwdG9yUmVmcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJCTxwbHVnaW4+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCSAgICA8Zm9ya01vZGU+cGVydGVzdDwvZm9ya01vZGU+CisJCQkJCTxzeXN0ZW1Qcm9wZXJ0aWVzPgorCQkJICAgICAgICAgIDxwcm9wZXJ0eT4KKwkJCSAgICAgICAgICAgIDxuYW1lPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPC9uYW1lPgorCQkJICAgICAgICAgICAgPHZhbHVlPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllczwvdmFsdWU+CisJCQkgICAgICAgICAgPC9wcm9wZXJ0eT4JCQkJCQorCQkJCQk8L3N5c3RlbVByb3BlcnRpZXM+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9wbHVnaW4+CisJCTwvcGx1Z2lucz4KKwk8L2J1aWxkPgorCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+b29kdC1jb21tb25zPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUub29kdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm9vZHQteG1scXVlcnk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3Byb2plY3QucGFyZW50LnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FzLW1ldGFkYXRhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxvcHRpb25hbCAvPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+b29kdC1wcm9kdWN0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxvcHRpb25hbCAvPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+b29kdC1wcm9maWxlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxvcHRpb25hbCAvPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1kYmNwPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1kYmNwPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+CisJCQk8b3B0aW9uYWwgLz4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorCQkJPG9wdGlvbmFsIC8+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLXBvb2w8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLXBvb2w8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisJCQk8b3B0aW9uYWwgLz4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMDwvdmVyc2lvbj4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2NvbmYvZXhhbXBsZS1wcy54bWwgYi8wLjEwL3htbHBzL3NyYy9tYWluL2NvbmYvZXhhbXBsZS1wcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjYjA4YwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vY29uZi9leGFtcGxlLXBzLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBFeGFtcGxlIFhNTCBtYXBwaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxvb2R0OnhtbHBzIHhtbG5zOm9vZHQ9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9vb2R0LzAuMS1pbmN1YmF0aW5nIgorCW5hbWU9IkV4YW1wbGUgUXVlcnkgSGFuZGxlciIgaWQ9InByb2plY3Q6c3VicHJvamVjdDpleGFtcGxlcHMiPgorCTwhLS0gCisJIGF0dHJpYnV0ZToKKwkgICBkZWZhdWx0IChyZXF1aXJlZCk6IFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIG1hc3RlciB0YWJsZSBwYXJ0IG9mIHRoZQorCSAgICAgICAgICBmcm9tIGNsYXVzZSBpbiB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LiBUaGUgZGVmYXVsdCB0YWJsZSAqZG9lcyBub3QqCisJICAgICAgICAgIHJlcXVpcmUgYSBkZWZpbml0aW9uIGluIHRoZSB1bmRlcmx5aW5nIDx0YWJsZS4uIHRhZ3MgYmVsb3csIHRob3VnaAorCSAgICAgICAgICBwb3N0IE9PRFQtNTQ4IHRoZXNlIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4JCisJIC0tPgorCTx0YWJsZXMgZGVmYXVsdD0iVGFibGUxIj4KKwkJPHRhYmxlIG5hbWU9IlRhYmxlMiIgam9pbj0iam9pbl9rZXkiIHRvZmxkPSJiYXNlX3RhYmxlX2pvaW5fa2V5IiAvPgorCQk8dGFibGUgbmFtZT0iVGFibGUzIiBqb2luPSJqb2luX2tleSIgdG9mbGQ9ImJhc2VfdGFibGVfam9pbl9rZXkiIC8+CisJPC90YWJsZXM+CisJPCEtLSAKKwkJZmllbGQ6CisJCQorCQl0eXBlIChyZXF1aXJlZCk6ICAgZHluYW1pYyBvciBjb25zdGFudC4gSWYgeW91IGNob29zZSBkeW5hbWljLCB0aGVuIHRoZSBmaWVsZAorCQl2YWx1ZSBpcyByZWFkIGZyb20gdGhlIHJvdyBpbiB0aGUgUmVzdWx0U2V0IHJldHVybmVkCisJCWZyb20gdGhlIGRhdGFiYXNlLiBJZiBjb25zdGFudCwgdGhlbiBlYWNoIHJldHVybmVkIHJvdworCQlmcm9tIHRoZSBSZXN1bHRTZXQgaXMgYW5ub3RhdGVkIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZAorCQlpbiB0aGUgJ3ZhbHVlJyBhdHRyaWJ1dGUuCisJCQorCSAgbmFtZSAocmVxdWlyZWQpOiAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB5b3Ugd2FudCByZXR1cm5lZAorCQlpbiB0aGUgcHJvZHVjdCBzZXJ2ZXIuCisJCQorCQlzdHJpbmcgKG9wdGlvbmFsKTogd2hldGhlciBvciBub3QgdGhlIGludGVybmFsIGRiIHJlcHJlc2VudGF0aW9uIGF0IHRoZSBsb2NhbAorCQlzaXRlIGZvciB0aGlzIGZpZWxkIGlzIGEgU1RSSU5HLCBvciBzb21ldGhpbmcgZWxzZSAoZS5nLiwgYSBudW1iZXIsIGV0Yy4pLiBQb3NzaWJsZSAKKwkJdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgInRydWUiLCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaWVsZCBpcyBhIHN0cmluZywgb3IKKwkJImZhbHNlIiwgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBzb21ldGhpbmcgZWxzZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgb21pdHRlZCwgYSB2YWx1ZQorCQlvZiAiZmFsc2UiIGlzIGFzc3VtZWQsIGFuZCB0aGUgYXR0cmlidXRlIHdpbGwgbm90IGJlIHF1b3RlZCBpbiB0aGUgd2hlcmUgY2xhdXNlIG9mCisJCXRoZSB1bmRlcmx5aW5nIFNRTCBzdGF0ZW1lbnQgZ2VuZXJhdGVkLgorCQkKKwkJZGJuYW1lIChvcHRpb25hbCk6IHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aXRoaW4gdGhlIHVuZGVybHlpbmcgZGIuIElmIG5vdAorCQlzcGVjaWZpZWQsIHRoZW4gYXNzdW1lZCB0byBiZSBuYW1lCisJCQorCQl0YWJsZSAob3B0aW9uYWwpOiAgaWYgcHJvdmlkZWQsIHRoZW4gdGhlIGF0dHJpYnV0ZSBhIGlzIHNlbGVjdGVkIGFzCisJCSd0YWJsZScuJ2EnLGFuZCB0aGVuIHJldHVybmVkLiBJZiBvbWl0dGVkLCB0aGUgYXR0cmlidXRlCisJCWlzIGFzc3VtZWQgdG8gY29tZSBmcm9tIHRoZSBkZWZhdWx0IHRhYmxlIHJldHVybmVkIGZyb20gdGhlCisJCVBTIHF1ZXJ5LgorCQkKKwkJdmFsdWUgKG9wdGlvbmFsKTogIGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGlmIHR5cGU9J2NvbnN0YW50JyBpcyBzZWxlY3RlZC4KKwkJCisJCXNjb3BlIChvcHRpb25hbCk6ICBsaW1pdHMgdGhlIHNjb3BlIG9mIGEgZmllbGQncyBleGlzdGVuY2U6IGFjY2VwdGFibGUgdmFsdWVzCisJCWFyZSAmcXVvdDtxdWVyeSZxdW90Oywgd2hpY2ggc2lnbmlmaWVzIHRoYXQgdGhlIGZpZWxkIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuCisJCXRyYW5zbGF0aW5nIHF1ZXJpZXM6IGFuZCAmcXVvdDtyZXR1cm4mcXVvdDssIHdoaWNoIHNpZ25pZmllcyB0aGUgZmllbGQgaXMgb25seQorCQlhcHBsaWNhYmxlIGFzIGEgcmV0dXJuIGZpZWxkIHdoZW4gY29udmVydGluZyBkYXRhYmFzZSByZXN1bHRzIGludG8gQ0RFUmVzdWx0cy4KKwkJCisJLS0+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IkNERV9OQU1FMSIgZGJuYW1lPSJzaXRlX3NwZWNpZmljX25hbWUxIiB0YWJsZT0iVGFibGUxIiAvPgorCTxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJDREVfTkFNRTIiIGRibmFtZT0ic2l0ZV9zcGVjaWZpY19uYW1lMiIgdGFibGU9IlRhYmxlMiIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iQ0RFX05BTUUzIiBkYm5hbWU9InNpdGVfc3BlY2lmaWNfbmFtZTMiIHRhYmxlPSJUYWJsZTIiIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJDREVfTkFNRTQiIHZhbHVlPSJjb25zdGFudF92YWx1ZSIgLz4KKzwvb29kdDp4bWxwcz4KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vY29uZi9leGFtcGxlLmRiLnByb3BlcnRpZXMgYi8wLjEwL3htbHBzL3NyYy9tYWluL2NvbmYvZXhhbXBsZS5kYi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzFmNmEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2NvbmYvZXhhbXBsZS5kYi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjEgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBFeGFtcGxlIGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb24gZmlsZQorCit4bWxwcy5kYXRhc291cmNlLmpkYmMudXJsPTxkcml2ZXI+OjxzZXJ2ZXJfdHlwZT46Ly88c2VydmVyPls6PHBvcnQ+XVsvPGRhdGFiYXNlPl1bOzxwcm9wZXJ0eT49PHZhbHVlPls7Li4uXV0KK3htbHBzLmRhdGFzb3VyY2UuamRiYy51c2VyPVVTRVJOQU1FCit4bWxwcy5kYXRhc291cmNlLmpkYmMucGFzcz1QQVNTV09SRAoreG1scHMuZGF0YXNvdXJjZS5qZGJjLmRyaXZlcj1qYXZhLnNxbC5Ecml2ZXIKZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9EYXRhYmFzZVRhYmxlLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvRGF0YWJhc2VUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGJiOGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvRGF0YWJhc2VUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmc7CisKKy8qKgorICogCisgKiA8cD4KKyAqIERlc2NyaXB0aW9uIG9mIGEgbG9jYWwgc2l0ZSdzIGRhdGFiYXNlIHRhYmxlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgbW9kZWwgdG8KKyAqIHF1ZXJ5IGFnYWluc3QgYW5kIHNlbGVjdCBkYXRhIGZyb20uCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VUYWJsZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgam9pbkZpZWxkTmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRUYWJsZUpvaW5GaWVsZE5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VGFibGVKb2luOworCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gam9pbkZpZWxkTmFtZQorICAgICAqIEBwYXJhbSBkZWZhdWx0VGFibGVKb2luRmllbGROYW1lCisgICAgICogQHBhcmFtIGRlZmF1bHRUYWJsZUpvaW4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YWJhc2VUYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGpvaW5GaWVsZE5hbWUsCisgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFRhYmxlSm9pbkZpZWxkTmFtZSwgU3RyaW5nIGRlZmF1bHRUYWJsZUpvaW4pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5qb2luRmllbGROYW1lID0gam9pbkZpZWxkTmFtZTsKKyAgICAgICAgdGhpcy5kZWZhdWx0VGFibGVKb2luRmllbGROYW1lID0gZGVmYXVsdFRhYmxlSm9pbkZpZWxkTmFtZTsKKyAgICAgICAgdGhpcy5kZWZhdWx0VGFibGVKb2luID0gZGVmYXVsdFRhYmxlSm9pbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YWJhc2VUYWJsZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBqb2luRmllbGROYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKb2luRmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gam9pbkZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gam9pbkZpZWxkTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGpvaW5GaWVsZE5hbWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbkZpZWxkTmFtZShTdHJpbmcgam9pbkZpZWxkTmFtZSkgeworICAgICAgICB0aGlzLmpvaW5GaWVsZE5hbWUgPSBqb2luRmllbGROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdFRhYmxlSm9pbkZpZWxkTmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlSm9pbkZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRUYWJsZUpvaW5GaWVsZE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRlZmF1bHRUYWJsZUpvaW5GaWVsZE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0VGFibGVKb2luRmllbGROYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRUYWJsZUpvaW5GaWVsZE5hbWUoU3RyaW5nIGRlZmF1bHRUYWJsZUpvaW5GaWVsZE5hbWUpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0VGFibGVKb2luRmllbGROYW1lID0gZGVmYXVsdFRhYmxlSm9pbkZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0VGFibGVKb2luCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVKb2luKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFRhYmxlSm9pbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFRhYmxlSm9pbgorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHRUYWJsZUpvaW4gdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhYmxlSm9pbihTdHJpbmcgZGVmYXVsdFRhYmxlSm9pbikgeworICAgICAgICB0aGlzLmRlZmF1bHRUYWJsZUpvaW4gPSBkZWZhdWx0VGFibGVKb2luOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL0RhdGFiYXNlVGFibGVHcm91cC5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL0RhdGFiYXNlVGFibGVHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGVlM2EKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvRGF0YWJhc2VUYWJsZUdyb3VwLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiAKKyAqIDxwPgorICogQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEYXRhYmFzZVRhYmxlfXMKKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhYmFzZVRhYmxlR3JvdXAgeworCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBEYXRhYmFzZVRhYmxlPiBncm91cDsKKworICAgIHByaXZhdGUgTGlzdDxEYXRhYmFzZVRhYmxlPiBvcmRlcmVkR3JvdXA7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VGFibGU7CisKKyAgICBwdWJsaWMgRGF0YWJhc2VUYWJsZUdyb3VwKCkgeworICAgICAgICB0aGlzLmdyb3VwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBEYXRhYmFzZVRhYmxlPigpOworICAgICAgICB0aGlzLm9yZGVyZWRHcm91cCA9IG5ldyBWZWN0b3I8RGF0YWJhc2VUYWJsZT4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUYWJsZShTdHJpbmcgdGJsTmFtZSwgRGF0YWJhc2VUYWJsZSB0YmwpIHsKKyAgICAgICAgdGhpcy5ncm91cC5wdXQodGJsTmFtZSwgdGJsKTsKKyAgICAgICAgdGhpcy5vcmRlcmVkR3JvdXAuYWRkKHRibCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFiYXNlVGFibGUgZ2V0VGFibGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtVGFibGVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ncm91cC5rZXlTZXQoKS5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWJsZU5hbWVzKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxEYXRhYmFzZVRhYmxlPiBpID0gdGhpcy5vcmRlcmVkR3JvdXAuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBEYXRhYmFzZVRhYmxlIHRibCA9IGkubmV4dCgpOworICAgICAgICAgICAgbmFtZXMuYWRkKHRibC5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHRUYWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkZWZhdWx0VGFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0VGFibGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhYmxlKFN0cmluZyBkZWZhdWx0VGFibGUpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0VGFibGUgPSBkZWZhdWx0VGFibGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvRmllbGRTY29wZS5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL0ZpZWxkU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU3MjczCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL0ZpZWxkU2NvcGUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmc7CisKKy8qKgorICoKKyAqIDxwPgorICogRGVmaW5lcyB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgTWFwcGluZ0ZpZWxkfS4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBlbnVtIEZpZWxkU2NvcGUgeworCisgIFFVRVJZLAorICBSRVRVUk47CisKKyAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgIHJldHVybiB0b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL0ZpZWxkVHlwZS5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL0ZpZWxkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvRmllbGRUeXBlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nOworCisvKioKKyAqCisgKiA8cD4KKyAqIERlZmluZXMgdGhlIHR5cGUgb2YgYSB7QGxpbmsgTWFwcGluZ0ZpZWxkfQorICogPC9wPi4KKyAqLworcHVibGljIGVudW0gRmllbGRUeXBlIHsKKworICBEWU5BTUlDLAorICBDT05TVEFOVDsKKworICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvTWFwcGluZy5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL01hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM4YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL01hcHBpbmcuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCisvKioKKyAqCisgKiA8cD4KKyAqIEFuIE1hcHBpbmcgaXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIE1hcHBpbmdGaWVsZH1zIHRoYXQgZGVmaW5lIHRoZQorICogdHJhbnNsYXRpb24gb2YgY29tbW9uIG9udG9sb2dpY2FsIHF1ZXJpZXMgaW50byBxdWVyaWVzIGFnYWluc3QgYSBsb2NhbCBzaXRlJ3MKKyAqIERCTVMKKyAqIDwvcD4KKyAqIC4KKyAqLworcHVibGljIGNsYXNzIE1hcHBpbmcgeworCisgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTWFwcGluZ0ZpZWxkPiBmaWVsZHM7CisKKyAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZVRhYmxlR3JvdXAgdGFibGVzOworCisgIHByaXZhdGUgU3RyaW5nIGlkOworCisgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgcHVibGljIE1hcHBpbmcoKSB7CisgICAgdGhpcy5maWVsZHMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIE1hcHBpbmdGaWVsZD4oKTsKKyAgICB0aGlzLnRhYmxlcyA9IG5ldyBEYXRhYmFzZVRhYmxlR3JvdXAoKTsKKyAgfQorCisgIHB1YmxpYyBNYXBwaW5nKE1hcDxTdHJpbmcsIE1hcHBpbmdGaWVsZD4gZmllbGRzLCBEYXRhYmFzZVRhYmxlR3JvdXAgdGFibGVzLAorICAgICAgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy50YWJsZXMgPSB0YWJsZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRGaWVsZChTdHJpbmcgZmxkTmFtZSwgTWFwcGluZ0ZpZWxkIGZpZWxkKSB7CisgICAgdGhpcy5maWVsZHMucHV0KGZsZE5hbWUsIGZpZWxkKTsKKyAgfQorCisgIHB1YmxpYyBNYXBwaW5nRmllbGQgZ2V0RmllbGRCeUxvY2FsTmFtZShTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgaWYgKHRoaXMuZmllbGRzID09IG51bGwKKyAgICAgICAgfHwgKHRoaXMuZmllbGRzICE9IG51bGwgJiYgdGhpcy5maWVsZHMua2V5U2V0KCkgPT0gbnVsbCkKKyAgICAgICAgfHwgKHRoaXMuZmllbGRzICE9IG51bGwgJiYgdGhpcy5maWVsZHMua2V5U2V0KCkgIT0gbnVsbCAmJiB0aGlzLmZpZWxkcworICAgICAgICAgICAgLmtleVNldCgpLnNpemUoKSA9PSAwKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgZm9yIChNYXBwaW5nRmllbGQgZmxkIDogdGhpcy5maWVsZHMudmFsdWVzKCkpIHsKKyAgICAgIGlmIChmbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGZsZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBNYXBwaW5nRmllbGQgZ2V0RmllbGRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5maWVsZHMuZ2V0KG5hbWUpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY29uc3RhbnRGaWVsZChTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgTWFwcGluZ0ZpZWxkIGZsZCA9IGdldEZpZWxkQnlMb2NhbE5hbWUobG9jYWxOYW1lKTsKKworICAgIGlmIChmbGQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRydWU7IC8vIGxlYXZlIGl0IG91dAorICAgIH0KKworICAgIGlmIChmbGQuZ2V0VHlwZSgpID09IEZpZWxkVHlwZS5DT05TVEFOVCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgaW50IGdldE51bUZpZWxkcygpIHsKKyAgICByZXR1cm4gdGhpcy5maWVsZHMua2V5U2V0KCkuc2l6ZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkVGFibGUoU3RyaW5nIHRibE5hbWUsIERhdGFiYXNlVGFibGUgdGJsKSB7CisgICAgdGhpcy50YWJsZXMuYWRkVGFibGUodGJsTmFtZSwgdGJsKTsKKyAgfQorCisgIHB1YmxpYyBEYXRhYmFzZVRhYmxlIGdldFRhYmxlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIHRoaXMudGFibGVzLmdldFRhYmxlQnlOYW1lKG5hbWUpOworICB9CisKKyAgcHVibGljIGludCBnZXROdW1UYWJsZXMoKSB7CisgICAgcmV0dXJuIHRoaXMudGFibGVzLmdldE51bVRhYmxlcygpOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWJsZU5hbWVzKCkgeworICAgIHJldHVybiB0aGlzLnRhYmxlcy5nZXRUYWJsZU5hbWVzKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEZpZWxkTmFtZXMoKSB7CisgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QodGhpcy5maWVsZHMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW10geyAiIiB9KSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgaWQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgcmV0dXJuIGlkOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBpZAorICAgKiAgICAgICAgICB0aGUgaWQgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICB0aGlzLmlkID0gaWQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lCisgICAqICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZGVmYXVsdFRhYmxlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKKyAgICByZXR1cm4gdGhpcy50YWJsZXMuZ2V0RGVmYXVsdFRhYmxlKCk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGRlZmF1bHRUYWJsZQorICAgKiAgICAgICAgICB0aGUgZGVmYXVsdFRhYmxlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhYmxlKFN0cmluZyBkZWZhdWx0VGFibGUpIHsKKyAgICB0aGlzLnRhYmxlcy5zZXREZWZhdWx0VGFibGUoZGVmYXVsdFRhYmxlKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvTWFwcGluZ0ZpZWxkLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvTWFwcGluZ0ZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjMzBjYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9NYXBwaW5nRmllbGQuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzLk1hcHBpbmdGdW5jOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICoKKyAqIDxwPgorICogQSBmaWVsZCB3aXRoaW4gYSBtYXBwaW5nLnhtbCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQ0RFcworICogYW5kIHRoZSB1bmRlcmx5aW5nIGF0dHJpYnV0ZXMgb2YgYSBsb2NhbCBzaXRlJ3MgREJNUy4KKyAqIDwvcD4KKyAqIC4KKyAqLworcHVibGljIGNsYXNzIE1hcHBpbmdGaWVsZCB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICBwcml2YXRlIEZpZWxkVHlwZSB0eXBlOworCisgIHByaXZhdGUgU3RyaW5nIGRiTmFtZTsKKworICBwcml2YXRlIFN0cmluZyB0YWJsZU5hbWU7CisKKyAgcHJpdmF0ZSBTdHJpbmcgY29uc3RhbnRWYWx1ZTsKKworICBwcml2YXRlIEZpZWxkU2NvcGUgc2NvcGU7CisKKyAgcHJpdmF0ZSBMaXN0PE1hcHBpbmdGdW5jPiBmdW5jczsKKworICBwcml2YXRlIGJvb2xlYW4gc3RyaW5nOworCisgIC8qKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiBAcGFyYW0gdHlwZQorICAgKiBAcGFyYW0gZGJOYW1lCisgICAqIEBwYXJhbSB0YWJsZU5hbWUKKyAgICogQHBhcmFtIGNvbnN0YW50VmFsdWUKKyAgICogQHBhcmFtIHNjb3BlCisgICAqIEBwYXJhbSBmdW5jcworICAgKiBAcGFyYW0gc3RyaW5nCisgICAqIEBwYXJhbSBhcHBlbmRUYWJsZU5hbWUKKyAgICovCisgIHB1YmxpYyBNYXBwaW5nRmllbGQoU3RyaW5nIG5hbWUsIEZpZWxkVHlwZSB0eXBlLCBTdHJpbmcgZGJOYW1lLAorICAgICAgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbnN0YW50VmFsdWUsIEZpZWxkU2NvcGUgc2NvcGUsCisgICAgICBMaXN0PE1hcHBpbmdGdW5jPiBmdW5jcywgYm9vbGVhbiBzdHJpbmcpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTsKKyAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTsKKyAgICB0aGlzLmNvbnN0YW50VmFsdWUgPSBjb25zdGFudFZhbHVlOworICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB0aGlzLmZ1bmNzID0gZnVuY3M7CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH0KKworICAvKioKKyAgICAgKgorICAgICAqLworICBwdWJsaWMgTWFwcGluZ0ZpZWxkKCkgeworICAgIHRoaXMubmFtZSA9IG51bGw7CisgICAgdGhpcy5kYk5hbWUgPSBudWxsOworICAgIHRoaXMudGFibGVOYW1lID0gbnVsbDsKKyAgICB0aGlzLmNvbnN0YW50VmFsdWUgPSBudWxsOworICAgIHRoaXMuc2NvcGUgPSBudWxsOworICAgIHRoaXMuc3RyaW5nID0gZmFsc2U7CisgICAgdGhpcy5mdW5jcyA9IG5ldyBWZWN0b3I8TWFwcGluZ0Z1bmM+KCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgY29uc3RhbnRWYWx1ZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDb25zdGFudFZhbHVlKCkgeworICAgIHJldHVybiBjb25zdGFudFZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjb25zdGFudFZhbHVlCisgICAqICAgICAgICAgIHRoZSBjb25zdGFudFZhbHVlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29uc3RhbnRWYWx1ZShTdHJpbmcgY29uc3RhbnRWYWx1ZSkgeworICAgIHRoaXMuY29uc3RhbnRWYWx1ZSA9IGNvbnN0YW50VmFsdWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgZGJOYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERiTmFtZSgpIHsKKyAgICByZXR1cm4gZGJOYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBkYk5hbWUKKyAgICogICAgICAgICAgdGhlIGRiTmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERiTmFtZShTdHJpbmcgZGJOYW1lKSB7CisgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lCisgICAqICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgc2NvcGUKKyAgICovCisgIHB1YmxpYyBGaWVsZFNjb3BlIGdldFNjb3BlKCkgeworICAgIHJldHVybiBzY29wZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gc2NvcGUKKyAgICogICAgICAgICAgdGhlIHNjb3BlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U2NvcGUoRmllbGRTY29wZSBzY29wZSkgeworICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0YWJsZU5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworICAgIHJldHVybiB0YWJsZU5hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHRhYmxlTmFtZQorICAgKiAgICAgICAgICB0aGUgdGFibGVOYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGFibGVOYW1lKFN0cmluZyB0YWJsZU5hbWUpIHsKKyAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0eXBlCisgICAqLworICBwdWJsaWMgRmllbGRUeXBlIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHR5cGUKKyAgICogICAgICAgICAgdGhlIHR5cGUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUeXBlKEZpZWxkVHlwZSB0eXBlKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBmdW5jcworICAgKi8KKyAgcHVibGljIExpc3Q8TWFwcGluZ0Z1bmM+IGdldEZ1bmNzKCkgeworICAgIHJldHVybiBmdW5jczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZnVuY3MKKyAgICogICAgICAgICAgdGhlIGZ1bmNzIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RnVuY3MoTGlzdDxNYXBwaW5nRnVuYz4gZnVuY3MpIHsKKyAgICB0aGlzLmZ1bmNzID0gZnVuY3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgclN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoIltuYW1lPSIpOworICAgIHJTdHIuYXBwZW5kKHRoaXMubmFtZSk7CisgICAgclN0ci5hcHBlbmQoIixkYm5hbWU9Iik7CisgICAgclN0ci5hcHBlbmQodGhpcy5kYk5hbWUpOworICAgIHJTdHIuYXBwZW5kKCIsY29uc3RhbnRfdmFsdWU9Iik7CisgICAgclN0ci5hcHBlbmQodGhpcy5jb25zdGFudFZhbHVlKTsKKyAgICByU3RyLmFwcGVuZCgiLHRhYmxlX25hbWU9Iik7CisgICAgclN0ci5hcHBlbmQodGhpcy50YWJsZU5hbWUpOworICAgIHJTdHIuYXBwZW5kKCIsc2NvcGU9Iik7CisgICAgclN0ci5hcHBlbmQodGhpcy5zY29wZS5lcXVhbHMoRmllbGRTY29wZS5SRVRVUk4pID8gInJldHVybiIgOiAicXVlcnkiKTsKKyAgICByU3RyLmFwcGVuZCgiLHR5cGU9Iik7CisgICAgclN0ci5hcHBlbmQodGhpcy50eXBlLmVxdWFscyhGaWVsZFR5cGUuQ09OU1RBTlQpID8gImNvbnN0YW50IiA6ICJkeW5hbWljIik7CisgICAgclN0ci5hcHBlbmQoIixmdW5jcz0iKTsKKyAgICByU3RyLmFwcGVuZChwcmludENsYXNzTmFtZXModGhpcy5mdW5jcykpOworICAgIHJTdHIuYXBwZW5kKCIsc3RyaW5nPSIpOworICAgIHJTdHIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKHRoaXMuc3RyaW5nKSk7CisgICAgclN0ci5hcHBlbmQoIl0iKTsKKyAgICByZXR1cm4gclN0ci50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgcHJpbnRDbGFzc05hbWVzKExpc3Q8TWFwcGluZ0Z1bmM+IGZ1bmNzKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIGlmIChmdW5jcyA9PSBudWxsIHx8IChmdW5jcyAhPSBudWxsICYmIGZ1bmNzLnNpemUoKSA9PSAwKSkgeworICAgICAgcmV0dXJuICIiOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKEl0ZXJhdG9yPE1hcHBpbmdGdW5jPiBpID0gZnVuY3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgIE1hcHBpbmdGdW5jIGZ1bmMgPSBpLm5leHQoKTsKKyAgICAgICAgYnVmLmFwcGVuZChmdW5jLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCIpOworICAgICAgfQorCisgICAgICBidWYuZGVsZXRlQ2hhckF0KGJ1Zi5sZW5ndGgoKSAtIDEpOworCisgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHN0cmluZworICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoKSB7CisgICAgcmV0dXJuIHN0cmluZzsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gc3RyaW5nCisgICAqICAgICAgICAgIHRoZSBzdHJpbmcgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoYm9vbGVhbiBzdHJpbmcpIHsKKyAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgfQorCisgIC8qKgorICAgKiBJZiBkYm5hbWUgZXhpc3RzIGFuZCBpcyBub3QgZW1wdHksIGl0IGlzIHVzZWQgYXMgdGhlIGZpZWxkIG5hbWUuCisgICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eSwKKyAgICogcmV0dXJuIHRhYmxlTmFtZS5maWVsZE5hbWUsIG90aGVyd2lzZSByZXR1cm4gZmllbGROYW1lLgorICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbmFtZSB1bmRlcnN0b29kIGJ5IHRoZSBsb2NhbCBkYgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgU3RyaW5nIGRiQ29sTmFtZSA9IGdldE5hbWUoKTsKKyAgICBpZiAoZ2V0RGJOYW1lKCkgIT0gbnVsbCAmJiAhZ2V0RGJOYW1lKCkuaXNFbXB0eSgpKQorICAgICAgZGJDb2xOYW1lID0gZ2V0RGJOYW1lKCk7CisgICAgaWYgKGdldFRhYmxlTmFtZSgpID09IG51bGwgfHwgZ2V0VGFibGVOYW1lKCkuaXNFbXB0eSgpKQorICAgICAgcmV0dXJuIGRiQ29sTmFtZTsKKyAgICByZXR1cm4gZ2V0VGFibGVOYW1lKCkgKyAiLiIgKyBkYkNvbE5hbWU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL01hcHBpbmdSZWFkZXIuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9NYXBwaW5nUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhNGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9NYXBwaW5nUmVhZGVyLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZzsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy54bWwuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmcuZnVuY3MuTWFwcGluZ0Z1bmM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnV0aWwuR2VuZXJpY0NERU9iamVjdEZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKgorICogPHA+CisgKiBBIHN0YXRpYyBmaW5hbCByZWFkZXIgY2xhc3MgZm9yIHJlYWRpbmcge0BsaW5rIE1hcHBpbmd9cy4KKyAqIDwvcD4KKyAqIC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1hcHBpbmdSZWFkZXIgaW1wbGVtZW50cyBNYXBwaW5nUmVhZGVyTWV0S2V5cyB7CisKKyAgcHJpdmF0ZSBNYXBwaW5nUmVhZGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJEb24ndCBjb25zdHJ1Y3QgcmVhZGVyIG9iamVjdHMhIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIE1hcHBpbmcgZ2V0TWFwcGluZyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRG9jdW1lbnQgbWFwcGluZ0RvYyA9IFhNTFV0aWxzLmdldERvY3VtZW50Um9vdChpcyk7CisgICAgTWFwcGluZyBtYXAgPSBuZXcgTWFwcGluZygpOworCisgICAgRWxlbWVudCByb290RWxlbSA9IG1hcHBpbmdEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBtYXAuc2V0SWQocm9vdEVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKKyAgICBtYXAuc2V0TmFtZShyb290RWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7CisgICAgcmVhZFRhYmxlcyhyb290RWxlbSwgbWFwKTsKKyAgICByZWFkRmllbGRzKHJvb3RFbGVtLCBtYXApOworCisgICAgcmV0dXJuIG1hcDsKKworICB9CisKKyAgcHVibGljIHN0YXRpYyBNYXBwaW5nIGdldE1hcHBpbmcoVVJMIG1hcHBpbmdVcmwpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBnZXRNYXBwaW5nKG1hcHBpbmdVcmwub3BlblN0cmVhbSgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTWFwcGluZyBnZXRNYXBwaW5nKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldE1hcHBpbmcobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCkpOworCisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRUYWJsZXMoRWxlbWVudCByb290RWxlbSwgTWFwcGluZyBtYXApCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBFbGVtZW50IHRibHNFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KFRBQkxFU19PVVRFUl9UQUcsIHJvb3RFbGVtKTsKKyAgICBpZiAodGJsc0VsZW0gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgWE1MIGZpbGU6IFsiICsgbWFwLmdldE5hbWUoKQorICAgICAgICAgICsgIl06IHJlYXNvbjogbm8gZGVmaW5lZCB0YWJsZXMgdGFnIGVsZW1lbnQhIik7CisKKyAgICB9CisKKyAgICBTdHJpbmcgZGVmYXVsdFRibCA9IHRibHNFbGVtLmdldEF0dHJpYnV0ZSgiZGVmYXVsdCIpOworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSBpcyBzZXQKKyAgICBpZiAoZGVmYXVsdFRibCA9PSBudWxsIHx8IChkZWZhdWx0VGJsICE9IG51bGwgJiYgZGVmYXVsdFRibC5lcXVhbHMoIiIpKSkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgWE1MIGZpbGU6IFsiICsgbWFwLmdldE5hbWUoKQorICAgICAgICAgICsgIl06IHJlYXNvbjogdGhlcmUgbmVlZHMgdG8gYmUgYSBkZWZhdWx0IHRhYmxlIGRlZmluZWQgIgorICAgICAgICAgICsgImJ5IHRoZSBcImRlZmF1bHRcIiBhdHRyaWJ1dGUhIik7CisgICAgfQorCisgICAgbWFwLnNldERlZmF1bHRUYWJsZShkZWZhdWx0VGJsKTsKKworICAgIC8vIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSB0YWJsZXMsIGFuZCBwcm9jZXNzIHRoZW0gb25lIGJ5IG9uZQorICAgIE5vZGVMaXN0IHRhYmxlTm9kZXMgPSB0YmxzRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUJMRV9UQUcpOworICAgIGlmICh0YWJsZU5vZGVzICE9IG51bGwgJiYgdGFibGVOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIEVsZW1lbnQgdGFibGVFbGVtID0gKEVsZW1lbnQpIHRhYmxlTm9kZXMuaXRlbShpKTsKKyAgICAgICAgRGF0YWJhc2VUYWJsZSB0YmwgPSByZWFkVGFibGUodGFibGVFbGVtKTsKKyAgICAgICAgaWYgKHRibC5nZXREZWZhdWx0VGFibGVKb2luKCkgPT0gbnVsbCB8fCB0YmwuZ2V0RGVmYXVsdFRhYmxlSm9pbigpLmlzRW1wdHkoKSkKKyAgICAgICAgICB0Ymwuc2V0RGVmYXVsdFRhYmxlSm9pbihtYXAuZ2V0RGVmYXVsdFRhYmxlKCkpOworICAgICAgICBtYXAuYWRkVGFibGUodGJsLmdldE5hbWUoKSwgdGJsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBEYXRhYmFzZVRhYmxlIHJlYWRUYWJsZShFbGVtZW50IHRhYmxlRWxlbSkgeworICAgIERhdGFiYXNlVGFibGUgdGJsID0gbmV3IERhdGFiYXNlVGFibGUoKTsKKyAgICB0Ymwuc2V0Sm9pbkZpZWxkTmFtZSh0YWJsZUVsZW0uZ2V0QXR0cmlidXRlKFRBQkxFX0FUVFJfSk9JTl9GTEQpKTsKKyAgICB0Ymwuc2V0TmFtZSh0YWJsZUVsZW0uZ2V0QXR0cmlidXRlKFRBQkxFX0FUVFJfTkFNRSkpOworICAgIHRibC5zZXREZWZhdWx0VGFibGVKb2luRmllbGROYW1lKHRhYmxlRWxlbQorICAgICAgICAuZ2V0QXR0cmlidXRlKFRBQkxFX0FUVFJfQkFTRV9UQkxfSk9JTl9GTEQpKTsKKyAgICB0Ymwuc2V0RGVmYXVsdFRhYmxlSm9pbih0YWJsZUVsZW0KKyAgICAgICAgLmdldEF0dHJpYnV0ZShUQUJMRV9BVFRSX0JBU0VfVEJMX0pPSU5fVEFCTEUpKTsKKyAgICByZXR1cm4gdGJsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkRmllbGRzKEVsZW1lbnQgcm9vdEVsZW0sIE1hcHBpbmcgbWFwKSB7CisgICAgTm9kZUxpc3QgZmxkTm9kZXMgPSByb290RWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShGSUVMRF9UQUcpOworCisgICAgaWYgKGZsZE5vZGVzICE9IG51bGwgJiYgZmxkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgTWFwcGluZ0ZpZWxkIGZsZCA9IHJlYWRGaWVsZCgoRWxlbWVudCkgZmxkTm9kZXMuaXRlbShpKSk7CisgICAgICAgIGlmIChmbGQuZ2V0VGFibGVOYW1lKCkgPT0gbnVsbCB8fCBmbGQuZ2V0VGFibGVOYW1lKCkuaXNFbXB0eSgpKQorICAgICAgICAgIGZsZC5zZXRUYWJsZU5hbWUobWFwLmdldERlZmF1bHRUYWJsZSgpKTsKKyAgICAgICAgbWFwLmFkZEZpZWxkKGZsZC5nZXROYW1lKCksIGZsZCk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBNYXBwaW5nRmllbGQgcmVhZEZpZWxkKEVsZW1lbnQgZmxkRWxlbSkgeworICAgIE1hcHBpbmdGaWVsZCBmaWVsZCA9IG5ldyBNYXBwaW5nRmllbGQoKTsKKyAgICBmaWVsZC5zZXRUYWJsZU5hbWUoZmxkRWxlbS5nZXRBdHRyaWJ1dGUoRklFTERfQVRUUl9UQUJMRSkpOworICAgIGZpZWxkLnNldE5hbWUoZmxkRWxlbS5nZXRBdHRyaWJ1dGUoRklFTERfQVRUUl9OQU1FKSk7CisgICAgZmllbGQKKyAgICAgICAgLnNldFR5cGUoZmxkRWxlbS5nZXRBdHRyaWJ1dGUoRklFTERfQVRUUl9UWVBFKS5lcXVhbHMoImR5bmFtaWMiKSA/IEZpZWxkVHlwZS5EWU5BTUlDCisgICAgICAgICAgICA6IEZpZWxkVHlwZS5DT05TVEFOVCk7CisgICAgZmllbGQuc2V0U3RyaW5nKEJvb2xlYW4udmFsdWVPZihmbGRFbGVtLmdldEF0dHJpYnV0ZShGSUVMRF9BVFRSX1NUUklORykpKTsKKyAgICBmaWVsZC5zZXRDb25zdGFudFZhbHVlKGZsZEVsZW0uZ2V0QXR0cmlidXRlKEZJRUxEX0FUVFJfVkFMVUUpKTsKKyAgICBmaWVsZC5zZXREYk5hbWUoZmxkRWxlbS5nZXRBdHRyaWJ1dGUoRklFTERfQVRUUl9EQk5BTUUpKTsKKyAgICBpZiAoZmxkRWxlbS5nZXRBdHRyaWJ1dGUoRklFTERfQVRUUl9TQ09QRSkgIT0gbnVsbAorICAgICAgICAmJiAhZmxkRWxlbS5nZXRBdHRyaWJ1dGUoRklFTERfQVRUUl9TQ09QRSkuZXF1YWxzKCIiKSkgeworCisgICAgICBmaWVsZAorICAgICAgICAgIC5zZXRTY29wZShmbGRFbGVtLmdldEF0dHJpYnV0ZShGSUVMRF9BVFRSX1NDT1BFKS5lcXVhbHMoInF1ZXJ5IikgPyBGaWVsZFNjb3BlLlFVRVJZCisgICAgICAgICAgICAgIDogRmllbGRTY29wZS5SRVRVUk4pOworICAgIH0KKworICAgIGZpZWxkLnNldEZ1bmNzKGdldFRyYW5zbGF0ZUZ1bmNzKGZsZEVsZW0pKTsKKworICAgIHJldHVybiBmaWVsZDsKKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxNYXBwaW5nRnVuYz4gZ2V0VHJhbnNsYXRlRnVuY3MoRWxlbWVudCBmbGRFbGVtKSB7CisgICAgRWxlbWVudCB0cmFuc2xhdGVFbGVtID0gWE1MVXRpbHMuZ2V0Rmlyc3RFbGVtZW50KEZJRUxEX1RSQU5TTEFURV9UQUcsCisgICAgICAgIGZsZEVsZW0pOworCisgICAgTGlzdDxNYXBwaW5nRnVuYz4gZnVuY3MgPSBuZXcgVmVjdG9yPE1hcHBpbmdGdW5jPigpOworCisgICAgaWYgKHRyYW5zbGF0ZUVsZW0gIT0gbnVsbCkgeworICAgICAgLy8gY2hlY2sgZm9yIGZ1bmMgdGFncworICAgICAgTm9kZUxpc3QgZnVuY05vZGVzID0gdHJhbnNsYXRlRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShGVU5DX1RBRyk7CisgICAgICBpZiAoZnVuY05vZGVzICE9IG51bGwgJiYgZnVuY05vZGVzLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmNOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgRWxlbWVudCBmdW5jRWxlbSA9IChFbGVtZW50KSBmdW5jTm9kZXMuaXRlbShpKTsKKyAgICAgICAgICBmdW5jcy5hZGQoZ2V0RnVuYyhmdW5jRWxlbSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmNzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwcGluZ0Z1bmMgZ2V0RnVuYyhFbGVtZW50IGZ1bmNFbGVtKSB7CisgICAgU3RyaW5nIGZ1bmNDbGFzcyA9IGZ1bmNFbGVtLmdldEF0dHJpYnV0ZShGVU5DX0FUVFJfQ0xBU1MpOworICAgIE1hcHBpbmdGdW5jIGZ1bmMgPSBHZW5lcmljQ0RFT2JqZWN0RmFjdG9yeQorICAgICAgICAuZ2V0TWFwcGluZ0Z1bmNGcm9tQ2xhc3NOYW1lKGZ1bmNDbGFzcyk7CisKKyAgICBpZiAoZnVuYyAhPSBudWxsKSB7CisgICAgICBmdW5jLmNvbmZpZ3VyZShnZXRQcm9wc0Zyb21FbGVtZW50QXR0cnMoZnVuY0VsZW0uZ2V0QXR0cmlidXRlcygpKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGdldFByb3BzRnJvbUVsZW1lbnRBdHRycyhOYW1lZE5vZGVNYXAgbWFwKSB7CisgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICBpZiAobWFwICE9IG51bGwpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgTm9kZSBtYXBOb2RlID0gbWFwLml0ZW0oaSk7CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KG1hcE5vZGUuZ2V0Tm9kZU5hbWUoKSwgbWFwTm9kZS5nZXROb2RlVmFsdWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb3BzOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9NYXBwaW5nUmVhZGVyTWV0S2V5cy5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL01hcHBpbmdSZWFkZXJNZXRLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmMzMzNwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9NYXBwaW5nUmVhZGVyTWV0S2V5cy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nOworCisvKioKKyAqIAorICogPHA+CisgKiBNZXQgS2V5cyBmb3IgdGhlIHtAbGluayBNYXBwaW5nUmVhZGVyfQorICogPC9wPi4KKyAqLworcHVibGljIGludGVyZmFjZSBNYXBwaW5nUmVhZGVyTWV0S2V5cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9UQUcgPSAiZmllbGQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVTX09VVEVSX1RBRyA9ICJ0YWJsZXMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVEFHID0gInRhYmxlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0FUVFJfSk9JTl9GTEQgPSAiam9pbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9BVFRSX0JBU0VfVEJMX0pPSU5fVEFCTEUgPSAidG8iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfQVRUUl9CQVNFX1RCTF9KT0lOX0ZMRCA9ICJ0b2ZsZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9BVFRSX05BTUUgPSAibmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BVFRSX1RZUEUgPSAidHlwZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BVFRSX05BTUUgPSAibmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BVFRSX0RCTkFNRSA9ICJkYm5hbWUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfQVRUUl9TQ09QRSA9ICJzY29wZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BVFRSX1ZBTFVFID0gInZhbHVlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0FUVFJfVEFCTEUgPSAidGFibGUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfQVRUUl9TVFJJTkcgPSAic3RyaW5nIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1RSQU5TTEFURV9UQUcgPSAidHJhbnNsYXRlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNfVEFHID0gImZ1bmMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ19BVFRSX0NMQVNTID0gImNsYXNzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0FUVFJfQVBQRU5EX1RBQkxFX05BTUUgPSAiYXBwZW5kVGFibGVOYW1lIjsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL2Z1bmNzL01hcHBpbmdGdW5jLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvZnVuY3MvTWFwcGluZ0Z1bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDNkNTJjCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL2Z1bmNzL01hcHBpbmdGdW5jLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHMuQ0RFVmFsdWU7CisKKy8qKgorICogCisgKiA8cD4KKyAqIEEgZnVuY3Rpb24gdG8gY29udmVydCB7QGxpbmsgQ0RFVmFsdWV9cyBmcm9tIGEgQ0RFIGRvbWFpbiB2b2NhYnVsYXJ5IGludG8gYQorICogU0RFIGRvbWFpbiB2b2NhYnVsYXJ5CisgKiA8L3A+LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdGdW5jIHsKKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZXMgdGhlIG9yaWdpbmFsIENERSB7QGxpbmsgQ0RFVmFsdWV9IGludG8gYSBsb2NhbCBzaXRlJ3MgU0RFCisgICAgICoge0BsaW5rIENERVZhbHVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3JpZworICAgICAqICAgICAgICAgICAgVGhlIG9yaWdpbmFsIHtAbGluayBDREVWYWx1ZX0gdG8gdHJhbnNsYXRlLgorICAgICAqIEByZXR1cm4gVGhlIHRyYW5zbGF0ZWQge0BsaW5rIENERVZhbHVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ0RFVmFsdWUgdHJhbnNsYXRlKENERVZhbHVlIG9yaWcpOworCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlcyB0aGUgbG9jYWwgc2l0ZSdzIFNERSB7QGxpbmsgQ0RFVmFsdWV9IGJhY2sgaW50byBpdHMgQ0RFCisgICAgICoge0BsaW5rIENERVZhbHVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3JpZworICAgICAqICAgICAgICAgICAgVGhlIGxvY2FsIHNpdGUncyBTREUge0BsaW5rIENERVZhbHVlfSB0byB0cmFuc2xhdGUgYmFjayBpbnRvCisgICAgICogICAgICAgICAgICBhIENERS4KKyAgICAgKiBAcmV0dXJuIFRoZSB0cmFuc2xhdGVkIHtAbGluayBDREVWYWx1ZX0uCisgICAgICovCisgICAgcHVibGljIENERVZhbHVlIGludmVyc2VUcmFuc2xhdGUoQ0RFVmFsdWUgb3JpZyk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSBNYXBwaW5nRnVuYyB3aXRoIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgUHJvcGVydGllc30uCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BzCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIFByb3BlcnRpZXN9IHRvIHVzZSB0byBjb25maWd1cmUgdGhlIE1hcHBpbmdGdW5jLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShQcm9wZXJ0aWVzIHByb3BzKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL2Z1bmNzL1JlcGxhY2VGdW5jLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL21hcHBpbmcvZnVuY3MvUmVwbGFjZUZ1bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZiNDFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL2Z1bmNzL1JlcGxhY2VGdW5jLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzOworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHMuQ0RFVmFsdWU7CisKKy8qKgorICogCisgKiA8cD4KKyAqIERlc2NyaWJlIHlvdXIgY2xhc3MgaGVyZQorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIFJlcGxhY2VGdW5jIGltcGxlbWVudHMgTWFwcGluZ0Z1bmMgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgb3JpZzsKKworICAgIHByaXZhdGUgU3RyaW5nIHdpdGg7CisKKyAgICBwdWJsaWMgUmVwbGFjZUZ1bmMoKSB7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzLk1hcHBpbmdGdW5jI3RyYW5zbGF0ZShvcmcuYXBhY2hlLm9vZHQueG1scHMuc3RydWN0cy5DREVWYWx1ZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ0RFVmFsdWUgdHJhbnNsYXRlKENERVZhbHVlIG9yaWcpIHsKKyAgICAgICAgQ0RFVmFsdWUgY2RlVmFsID0gbmV3IENERVZhbHVlKG9yaWcuZ2V0Q2RlTmFtZSgpLCBvcmlnLmdldFZhbCgpKTsKKyAgICAgICAgU3RyaW5nIG5ld1ZhbCA9IG9yaWcuZ2V0VmFsKCkuZXF1YWxzKHRoaXMub3JpZykgPyB3aXRoIDogb3JpZy5nZXRWYWwoKTsKKyAgICAgICAgY2RlVmFsLnNldFZhbChuZXdWYWwpOworICAgICAgICByZXR1cm4gY2RlVmFsOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmcuZnVuY3MuTWFwcGluZ0Z1bmMjY29uZmlndXJlKGphdmEudXRpbC5Qcm9wZXJ0aWVzKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIG9yaWcgPSBwcm9wcy5nZXRQcm9wZXJ0eSgib3JpZyIpOworICAgICAgICB3aXRoID0gcHJvcHMuZ2V0UHJvcGVydHkoIndpdGgiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzLk1hcHBpbmdGdW5jI2ludmVyc2VUcmFuc2xhdGUob3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHMuQ0RFVmFsdWUpCisgICAgICovCisgICAgcHVibGljIENERVZhbHVlIGludmVyc2VUcmFuc2xhdGUoQ0RFVmFsdWUgb3JpZykgeworICAgICAgICBDREVWYWx1ZSBjZGVWYWwgPSBuZXcgQ0RFVmFsdWUob3JpZy5nZXRDZGVOYW1lKCksIG9yaWcuZ2V0VmFsKCkpOworICAgICAgICBTdHJpbmcgbmV3VmFsID0gb3JpZy5nZXRWYWwoKS5lcXVhbHModGhpcy53aXRoKSA/IHRoaXMub3JpZyA6IG9yaWcKKyAgICAgICAgICAgICAgICAuZ2V0VmFsKCk7CisgICAgICAgIGNkZVZhbC5zZXRWYWwobmV3VmFsKTsKKyAgICAgICAgcmV0dXJuIGNkZVZhbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZHVjdC9EQk1TRXhlY3V0b3IuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZHVjdC9EQk1TRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM1ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9kdWN0L0RCTVNFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucHJvZHVjdDsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5kYXRhYmFzZS5EYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5zdHJ1Y3RzLkNERVJlc3VsdDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CisKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLyoqCisgKgorICogPHA+CisgKiBFeGVjdXRlcyBDREUgUXVlcmllcyBhZ2FpbnN0IGFuIHVuZGVybHlpbmcgSkRCQyBkYXRhYmFzZSwgYmFja2VkIGJ5IEFwYWNoZQorICogY29tbW9ucy1wb29sIGFuZCBjb21tb25zLWRiY3AuCisgKiA8L3A+CisgKiAuCisgKi8KK3B1YmxpYyBjbGFzcyBEQk1TRXhlY3V0b3IgeworCisgIHByaXZhdGUgZmluYWwgRGF0YVNvdXJjZSBkYXRhU291cmNlOworCisgIHB1YmxpYyBEQk1TRXhlY3V0b3IoKSB7CisgICAgU3RyaW5nIGpkYmNVcmwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbHBzLmRhdGFzb3VyY2UuamRiYy51cmwiKTsKKyAgICBTdHJpbmcgdXNlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1scHMuZGF0YXNvdXJjZS5qZGJjLnVzZXIiKTsKKyAgICBTdHJpbmcgcGFzcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1scHMuZGF0YXNvdXJjZS5qZGJjLnBhc3MiKTsKKyAgICBTdHJpbmcgZHJpdmVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ4bWxwcy5kYXRhc291cmNlLmpkYmMuZHJpdmVyIik7CisgICAgZGF0YVNvdXJjZSA9IERhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXIuYnVpbGREYXRhU291cmNlKHVzZXIsIHBhc3MsIGRyaXZlciwgamRiY1VybCk7CisgIH0KKworICBwdWJsaWMgQ0RFUmVzdWx0IGV4ZWN1dGVMb2NhbFF1ZXJ5KFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBDb25uZWN0aW9uIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgUmVzdWx0U2V0IHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgQ0RFUmVzdWx0IHJlc3VsdCA9IG5ldyBDREVSZXN1bHQocnMsIGNvbm4pOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHRocm93IGU7CisgICAgfQorICAgIC8vIGRvIG5vdCBjbG9zZSB0aGUgU3RhdGVtZW50IG9yIENvbm5lY3Rpb24gaGVyZQorICAgIC8vIGNhbGwgQ0RFUmVzdWx0I2Nsb3NlKCkgdG8gY2xvc2UgUmVzdWx0U2V0IGFuZCBDb25uZWN0aW9uCisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3Byb2R1Y3QvWE1MUFNQcm9kdWN0SGFuZGxlci5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9kdWN0L1hNTFBTUHJvZHVjdEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNjNDRkCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9kdWN0L1hNTFBTUHJvZHVjdEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDM4OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5wcm9kdWN0OworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlByb2R1Y3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUXVlcnlIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLkRhdGFiYXNlVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmcuRmllbGRTY29wZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLk1hcHBpbmdGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5NYXBwaW5nUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzLk1hcHBpbmdGdW5jOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlci5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlci5IYW5kbGVyUXVlcnlQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHMuQ0RFUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5zdHJ1Y3RzLkNERVZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy51dGlsLlhNTFF1ZXJ5SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqCisgKiA8cD4KKyAqIEFuIFhNTCBjb25maWd1cmFibGUgdmVyc2lvbiBvZiBhIFByb2R1Y3QgU2VydmVyIHRoYXQgcmVxdWlyZXMgbm8gY29kZQorICogdG8gYmUgd3JpdHRlbiB0byBwbHVnIGludG8gYSBsb2NhbCBzaXRlJ3MgcmVsYXRpb25hbCBiYWNrZW5kIERCTVMuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgWE1MUFNQcm9kdWN0SGFuZGxlciBpbXBsZW1lbnRzIFF1ZXJ5SGFuZGxlciB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoWE1MUFNQcm9kdWN0SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJvdGVjdGVkIE1hcHBpbmcgbWFwcGluZzsKKworICAgIHByaXZhdGUgREJNU0V4ZWN1dG9yIGV4ZWN1dG9yOworCisgICAgcHJvdGVjdGVkIFhNTFBTUHJvZHVjdEhhbmRsZXIoU3RyaW5nIHBob255KSB7CisgICAgICAgIC8qIHRoaXMgaXMgdG8gZ2V0IGFyb3VuZCBpbnZva2luZyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBzdWItY2xhc3NlcyAqLworICAgIH0KKworICAgIHB1YmxpYyBYTUxQU1Byb2R1Y3RIYW5kbGVyKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgTWFwcGluZ0ZpbGVQYXRoID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQueG1scHMueG1sLm1hcEZpbGVQYXRoIik7CisKKyAgICAgICAgaWYgKE1hcHBpbmdGaWxlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5lZWQgdG8gc3BlY2lmeSBwYXRoIHRvIHhtbCBtYXBwaW5nIGZpbGUhIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwcGluZyA9IE1hcHBpbmdSZWFkZXIuZ2V0TWFwcGluZyhNYXBwaW5nRmlsZVBhdGgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcGFyc2UgbWFwcGluZyB4bWwgZmlsZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hcHBpbmdGaWxlUGF0aCArICJdOiByZWFzb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGxvYWQgdGhlIGRiIHByb3BlcnRpZXMgZmlsZSAqLworICAgICAgICAvKgorICAgICAgICAgKiBpZiBvbmUgZXhpc3RzOiBvdGhlcndpc2UsIGRvbid0IGJvdGhlciBhbmQganVzdCBwcmludCBvdXQgdGhlIFNRTCB0bworICAgICAgICAgKiB0aGUgY29uc29sZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBkYlByb3BGaWxlUGF0aCA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LnhtbHBzLnhtbC5kYlByb3BGaWxlUGF0aCIpOworICAgICAgICBpZiAoZGJQcm9wRmlsZVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGRiUHJvcEZpbGVQYXRoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBleGVjdXRvciA9IG5ldyBEQk1TRXhlY3V0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQucHJvZHVjdC5RdWVyeUhhbmRsZXIjcXVlcnkob3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5KQorICAgICAqLworICAgIHB1YmxpYyBYTUxRdWVyeSBxdWVyeShYTUxRdWVyeSBxdWVyeSkgdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24geworICAgICAgICBMaXN0PFF1ZXJ5RWxlbWVudD4gd2hlcmVTZXQgPSBxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKTsKKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IHNlbGVjdFNldCA9IHF1ZXJ5LmdldFNlbGVjdEVsZW1lbnRTZXQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zbGF0ZVRvRG9tYWluKHNlbGVjdFNldCwgdHJ1ZSk7CisgICAgICAgICAgICB0cmFuc2xhdGVUb0RvbWFpbih3aGVyZVNldCwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLnNldmVyZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvZHVjdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBxdWVyeUFuZFBhY2thZ2VSZXN1bHRzKHF1ZXJ5KTsKKworICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB1c2FnZSA9ICJYTUxQU1Byb2R1Y3RIYW5kbGVyIDxxdWVyeT5cbiI7CisKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih1c2FnZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFhNTFBTUHJvZHVjdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxQU1Byb2R1Y3RIYW5kbGVyKCk7CisgICAgICAgIFhNTFF1ZXJ5IHEgPSBoYW5kbGVyLnF1ZXJ5KFhNTFF1ZXJ5SGVscGVyCisgICAgICAgICAgICAgICAgLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyhhcmdzWzBdKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihxLmdldFhNTERvY1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxRdWVyeUVsZW1lbnQ+IGdldEVsZW1OYW1lc0Zyb21RdWVyeUVsZW1TZXQoCisgICAgICAgICAgICBMaXN0PFF1ZXJ5RWxlbWVudD4gb3JpZ1NldCkgeworICAgICAgICBpZiAob3JpZ1NldCA9PSBudWxsIHx8IChvcmlnU2V0ICE9IG51bGwgJiYgb3JpZ1NldC5zaXplKCkgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisKKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IG5ld1NldCA9IG5ldyBWZWN0b3I8UXVlcnlFbGVtZW50PigpOworCisgICAgICAgIGZvciAoSXRlcmF0b3I8UXVlcnlFbGVtZW50PiBpID0gb3JpZ1NldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudCBlbGVtID0gaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZWxlbS5nZXRSb2xlKCkuZXF1YWxzKFhNTFF1ZXJ5SGVscGVyLlJPTEVfRUxFTU5BTUUpCisgICAgICAgICAgICAgICAgICAgICYmICFtYXBwaW5nLmNvbnN0YW50RmllbGQoZWxlbS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgIG5ld1NldC5hZGQoZWxlbSk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld1NldDsKKworICAgIH0KKworICAgIHByb3RlY3RlZCBMaXN0PFF1ZXJ5RWxlbWVudD4gZ2V0Q29uc3RFbGVtTmFtZXNGcm9tUXVlcnlFbGVtU2V0KAorICAgICAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IG9yaWdTZXQpIHsKKyAgICAgICAgaWYgKG9yaWdTZXQgPT0gbnVsbCB8fCAob3JpZ1NldCAhPSBudWxsICYmIG9yaWdTZXQuc2l6ZSgpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCisgICAgICAgIExpc3Q8UXVlcnlFbGVtZW50PiBuZXdTZXQgPSBuZXcgVmVjdG9yPFF1ZXJ5RWxlbWVudD4oKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPFF1ZXJ5RWxlbWVudD4gaSA9IG9yaWdTZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBRdWVyeUVsZW1lbnQgZWxlbSA9IGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGVsZW0uZ2V0Um9sZSgpLmVxdWFscyhYTUxRdWVyeUhlbHBlci5ST0xFX0VMRU1OQU1FKQorICAgICAgICAgICAgICAgICAgICAmJiBtYXBwaW5nLmNvbnN0YW50RmllbGQoZWxlbS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgIG5ld1NldC5hZGQoZWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3U2V0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHF1ZXJ5QW5kUGFja2FnZVJlc3VsdHMoWE1MUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgU3RhY2s8UXVlcnlFbGVtZW50PiBxdWVyeVN0YWNrID0gSGFuZGxlclF1ZXJ5UGFyc2VyCisgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5U3RhY2socXVlcnkuZ2V0V2hlcmVFbGVtZW50U2V0KCkpOworICAgICAgICBFeHByZXNzaW9uIHBhcnNlZFF1ZXJ5ID0gSGFuZGxlclF1ZXJ5UGFyc2VyLnBhcnNlKHF1ZXJ5U3RhY2ssCisgICAgICAgICAgICAgICAgdGhpcy5tYXBwaW5nKTsKKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IHNlbGVjdE5hbWVzID0gZ2V0RWxlbU5hbWVzRnJvbVF1ZXJ5RWxlbVNldChxdWVyeQorICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RFbGVtZW50U2V0KCkpOworCisgICAgICAgIFN0cmluZyBxdWVyeVNlbGVjdE5hbWVzID0gdG9TUUxTZWxlY3RDb2x1bW5zKHNlbGVjdE5hbWVzKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc3FsQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiU0VMRUNUICIpOworICAgICAgICBzcWxCdWYuYXBwZW5kKHF1ZXJ5U2VsZWN0TmFtZXMpOworICAgICAgICBzcWxCdWYuYXBwZW5kKCIgRlJPTSAiKTsKKyAgICAgICAgc3FsQnVmLmFwcGVuZChtYXBwaW5nLmdldERlZmF1bHRUYWJsZSgpKTsKKyAgICAgICAgc3FsQnVmLmFwcGVuZCgiICIpOworCisgICAgICAgIGlmIChtYXBwaW5nLmdldE51bVRhYmxlcygpID4gMCkgeworICAgICAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IHdoZXJlTmFtZXMgPSBnZXRFbGVtTmFtZXNGcm9tUXVlcnlFbGVtU2V0KHF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpKTsKKyAgICAgICAgICAgIFNldDxEYXRhYmFzZVRhYmxlPiByZXF1aXJlZFRhYmxlcyA9IGdldFJlcXVpcmVkVGFibGVzKHdoZXJlTmFtZXMsIHNlbGVjdE5hbWVzKTsKKyAgICAgICAgICAgIGZvciAoRGF0YWJhc2VUYWJsZSB0YmwgOiByZXF1aXJlZFRhYmxlcykgeworICAgICAgICAgICAgICAgIHNxbEJ1Zi5hcHBlbmQoIklOTkVSIEpPSU4gIik7CisgICAgICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCh0YmwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIgT04gIik7CisgICAgICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCh0YmwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCh0YmwuZ2V0Sm9pbkZpZWxkTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIgPSAiKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKHRibC5nZXREZWZhdWx0VGFibGVKb2luKCkpOworICAgICAgICAgICAgICAgIHNxbEJ1Zi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKHRibC5nZXREZWZhdWx0VGFibGVKb2luRmllbGROYW1lKCkpOworICAgICAgICAgICAgICAgIHNxbEJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHBhcnNlZFF1ZXJ5ICE9IG51bGwpeworICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCgiIFdIRVJFICIpOworICAgICAgICAgICAgc3FsQnVmLmFwcGVuZChwYXJzZWRRdWVyeS5ldmFsdWF0ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIExPRy5sb2coTGV2ZWwuSU5GTywgc3FsQnVmLnRvU3RyaW5nKCkpOworCisgICAgICAgIGlmIChleGVjdXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENERVJlc3VsdCByZXMgPSBleGVjdXRvci5leGVjdXRlTG9jYWxRdWVyeShzcWxCdWYudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzLnNldE9yZGVyZWRGaWVsZHMocXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpKTsKKyAgICAgICAgICAgICAgICByZXMuc2V0TWFwcGluZyhtYXBwaW5nKTsKKyAgICAgICAgICAgICAgICByZXMuc2V0Q29uc3RWYWx1ZXMoZ2V0Q29uc3RWYWx1ZXNGb3JRdWVyeShxdWVyeSkpOworICAgICAgICAgICAgICAgIHF1ZXJ5LmdldFJlc3VsdHMoKS5hZGQocmVzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBleGVjdXRpbmcgc3FsOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzcWxCdWYudG9TdHJpbmcoKSArICJdOiBNZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Q0RFVmFsdWU+IGdldENvbnN0VmFsdWVzRm9yUXVlcnkoWE1MUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IHNlbGVjdCA9IHF1ZXJ5LmdldFNlbGVjdEVsZW1lbnRTZXQoKTsKKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IGNvbnN0TmFtZXMgPSBnZXRDb25zdEVsZW1OYW1lc0Zyb21RdWVyeUVsZW1TZXQoc2VsZWN0KTsKKyAgICAgICAgTGlzdDxDREVWYWx1ZT4gY29uc3RWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PENERVZhbHVlPigpOworICAgICAgICBpZiAoY29uc3ROYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFF1ZXJ5RWxlbWVudCBxZSA6IGNvbnN0TmFtZXMpIHsKKyAgICAgICAgICAgICAgICBNYXBwaW5nRmllbGQgZmxkID0gbWFwcGluZy5nZXRGaWVsZEJ5TG9jYWxOYW1lKHFlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmIChmbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdFZhbHVlcy5hZGQobmV3IENERVZhbHVlKGZsZC5nZXROYW1lKCksIGZsZC5nZXRDb25zdGFudFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnN0VmFsdWVzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU1FMU2VsZWN0Q29sdW1ucyhMaXN0PFF1ZXJ5RWxlbWVudD4gZWxlbXMpIHsKKyAgICAgICAgaWYgKGVsZW1zID09IG51bGwgfHwgKGVsZW1zICE9IG51bGwgJiYgZWxlbXMuc2l6ZSgpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKFF1ZXJ5RWxlbWVudCBxZSA6IGVsZW1zKSB7CisgICAgICAgICAgICBNYXBwaW5nRmllbGQgZmxkID0gdGhpcy5tYXBwaW5nLmdldEZpZWxkQnlMb2NhbE5hbWUocWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBpZiAoZmxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGZsZC5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIGFzICIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZmxkLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmLmRlbGV0ZUNoYXJBdChidWYubGVuZ3RoKCkgLSAxKTsKKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlVG9Eb21haW4oTGlzdDxRdWVyeUVsZW1lbnQ+IGVsZW1TZXQsCisgICAgICAgICAgICBib29sZWFuIHNlbGVjdFNldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGdvIHRocm91Z2ggZWFjaCBxdWVyeSBlbGVtZW50OiB1c2UgdGhlIG1hcHBpbmcgZmllbGRzCisgICAgICAgIC8vIHRvIHRyYW5zbGF0ZSB0aGUgbmFtZXMKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPFF1ZXJ5RWxlbWVudD4gaSA9IGVsZW1TZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBRdWVyeUVsZW1lbnQgZWxlbSA9IGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGVsZW0uZ2V0Um9sZSgpLmVxdWFscyhYTUxRdWVyeUhlbHBlci5ST0xFX0VMRU1OQU1FKSkgeworICAgICAgICAgICAgICAgIC8vIGRvIHRoZSB0cmFuc2xhdGlvbgorICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtVmFsdWUgPSBlbGVtLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgTWFwcGluZ0ZpZWxkIGZsZCA9IHRoaXMubWFwcGluZy5nZXRGaWVsZEJ5TmFtZShlbGVtVmFsdWUpOworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBmbGQgaXMgbm90IG51bGwKKyAgICAgICAgICAgICAgICBpZiAoZmxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHNjb3BlIGlzIG51bGwsIG9yIGlmIGl0J3Mgbm90IG51bGwsIHRoZW4gaXQncworICAgICAgICAgICAgICAgIC8vIEZpZWxkU2NvcGUuUVVFUlkKKworICAgICAgICAgICAgICAgIGlmIChmbGQuZ2V0U2NvcGUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmbGQuZ2V0U2NvcGUoKS5lcXVhbHMoRmllbGRTY29wZS5SRVRVUk4pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGhhcyBhIGRibmFtZSBhdHRyLCBpZiBub3QsIHRoZW4gdGhlIG5hbWUKKyAgICAgICAgICAgICAgICAvLyBzdGF5cworICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld0ZsZE5hbWUgPSBmbGQuZ2V0TG9jYWxOYW1lKCk7CisKKyAgICAgICAgICAgICAgICBlbGVtLnNldFZhbHVlKG5ld0ZsZE5hbWUpOworCisgICAgICAgICAgICAgICAgLy8gbm93IHRyYW5zbGF0ZSB0aGUgZG9tYWluIHZvY2FiIGlmIHRoZXJlIGFyZSB0cmFuc2xhdGUgZnVuY3MKKyAgICAgICAgICAgICAgICAvLyBwcmVzZW50IGFuZCB0aGlzIGlzbid0IHRoZSBzZWxlY3Qgc2V0CisKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdFNldCAmJiBmbGQuZ2V0RnVuY3MoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmbGQuZ2V0RnVuY3MoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IHF1ZXJ5IGVsZW1lbnQgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIFhNTFF1ZXJ5SGVscGVyLlJPTEVfTElURVJBTAorICAgICAgICAgICAgICAgICAgICBpZiAoIWkuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5RWxlbWVudCBsaXRFbGVtID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbGl0RWxlbS5nZXRSb2xlKCkuZXF1YWxzKFhNTFF1ZXJ5SGVscGVyLlJPTEVfTElURVJBTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm5leHQgcXVlcnkgZWxlbWVudCBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFhNTFF1ZXJ5SGVscGVyLlJPTEVfTElURVJBTCArICIhIHJvbGUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpdEVsZW0uZ2V0Um9sZSgpICsgIiBpbnN0ZWFkISIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxNYXBwaW5nRnVuYz4gaiA9IGZsZC5nZXRGdW5jcygpLml0ZXJhdG9yKCk7IGoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0Z1bmMgZnVuYyA9IGoubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0RFVmFsdWUgb3JpZ1ZhbCA9IG5ldyBDREVWYWx1ZShmbGQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRFbGVtLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0RFVmFsdWUgbmV3VmFsID0gZnVuYy5pbnZlcnNlVHJhbnNsYXRlKG9yaWdWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgbGl0RWxlbS5zZXRWYWx1ZShuZXdWYWwuZ2V0VmFsKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIFNldDxEYXRhYmFzZVRhYmxlPiBnZXRSZXF1aXJlZFRhYmxlcygKKyAgICAgICAgICAgIExpc3Q8UXVlcnlFbGVtZW50PiB3aGVyZUVsZW1OYW1lcywgTGlzdDxRdWVyeUVsZW1lbnQ+IHNlbGVjdEVsZW1OYW1lcykgeworICAgICAgICBTZXQ8RGF0YWJhc2VUYWJsZT4gdGFibGVzID0gbmV3IEhhc2hTZXQ8RGF0YWJhc2VUYWJsZT4oKTsKKyAgICAgICAgLy8gYWRkIHRhYmxlcyBmcm9tIHdoZXJlIGVsZW1lbnQgc2V0CisgICAgICAgIGlmICh3aGVyZUVsZW1OYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFF1ZXJ5RWxlbWVudCBxZSA6IHdoZXJlRWxlbU5hbWVzKSB7CisgICAgICAgICAgICAgICAgTWFwcGluZ0ZpZWxkIGZsZCA9IG1hcHBpbmcuZ2V0RmllbGRCeUxvY2FsTmFtZShxZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VUYWJsZSB0ID0gbWFwcGluZy5nZXRUYWJsZUJ5TmFtZShmbGQuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsICYmICF0YWJsZXMuY29udGFpbnModCkgJiYgIXQuZ2V0TmFtZSgpLmVxdWFscyhtYXBwaW5nLmdldERlZmF1bHRUYWJsZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgdGFibGVzIGZyb20gc2VsZWN0IGVsZW1lbnQgc2V0CisgICAgICAgIGlmIChzZWxlY3RFbGVtTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChRdWVyeUVsZW1lbnQgcWUgOiBzZWxlY3RFbGVtTmFtZXMpIHsKKyAgICAgICAgICAgICAgICBNYXBwaW5nRmllbGQgZmxkID0gbWFwcGluZy5nZXRGaWVsZEJ5TG9jYWxOYW1lKHFlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmIChmbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVRhYmxlIHQgPSBtYXBwaW5nLmdldFRhYmxlQnlOYW1lKGZsZC5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9IG51bGwgJiYgIXRhYmxlcy5jb250YWlucyh0KSAmJiAhdC5nZXROYW1lKCkuZXF1YWxzKG1hcHBpbmcuZ2V0RGVmYXVsdFRhYmxlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMuYWRkKHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRoZSB0YWJsZXMgZm91bmQgbWF5IGJlIGpvaW5lZCBvbiBjb2x1bW5zIGZyb20gdGFibGVzIHdlIGhhdmVuJ3QgZm91bmQKKyAgICAgICAgLy8geWV0CisgICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIHJlcXVpcmVkIGpvaW4gdGFibGVzCisgICAgICAgIFNldDxEYXRhYmFzZVRhYmxlPiBtb3JlVGFibGVzID0gbmV3IEhhc2hTZXQ8RGF0YWJhc2VUYWJsZT4odGFibGVzKTsKKyAgICAgICAgZm9yIChEYXRhYmFzZVRhYmxlIHQgOiB0YWJsZXMpIHsKKyAgICAgICAgICAgIERhdGFiYXNlVGFibGUgam9pbiA9IG1hcHBpbmcuZ2V0VGFibGVCeU5hbWUodC5nZXREZWZhdWx0VGFibGVKb2luKCkpOworICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgYWRkIGFsbCBqb2luIHRhYmxlcyB1bnRpbCB3ZSBnZXQgdG8gZWl0aGVyCisgICAgICAgICAgICAvLyAoYSkgdGhlIG1hcHBpbmcgZGVmYXVsdCB0YWJsZSAoam9pbiA9PSBudWxsKQorICAgICAgICAgICAgLy8gKGIpIG9yIGEgdGFibGUgYWxyZWFkeSBmb3VuZCAobW9yZVRhYmxlcy5jb250YWlucyhqb2luKSkKKyAgICAgICAgICAgIHdoaWxlIChqb2luICE9IG51bGwgJiYgIW1vcmVUYWJsZXMuY29udGFpbnMoam9pbikgJiYgIWpvaW4uZ2V0TmFtZSgpLmVxdWFscyhtYXBwaW5nLmdldERlZmF1bHRUYWJsZSgpKSkgeworICAgICAgICAgICAgICAgIG1vcmVUYWJsZXMuYWRkKGpvaW4pOworICAgICAgICAgICAgICAgIGpvaW4gPSBtYXBwaW5nLmdldFRhYmxlQnlOYW1lKGpvaW4uZ2V0RGVmYXVsdFRhYmxlSm9pbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW9yZVRhYmxlczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZmlsZS9EQk1TRXhlY3V0b3IuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZmlsZS9EQk1TRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDI0NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9maWxlL0RCTVNFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnByb2ZpbGU7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNhcy5tZXRhZGF0YS5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY2FzLm1ldGFkYXRhLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmRhdGFiYXNlLkRhdGFiYXNlQ29ubmVjdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuRW51bWVyYXRlZFByb2ZpbGVFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUmVzb3VyY2VBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLkZpZWxkVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLk1hcHBpbmdGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5mdW5jcy5NYXBwaW5nRnVuYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMuc3RydWN0cy5DREVWYWx1ZTsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8qKgorICoKKyAqIDxwPgorICogRXhlY3V0ZXMgUHJvZmlsZSBRdWVyaWVzIGFnYWluc3QgYW4gdW5kZXJseWluZyBKREJDIGRhdGFiYXNlLCBiYWNrZWQgYnkKKyAqIEFwYWNoZSBjb21tb25zLXBvb2wgYW5kIGNvbW1vbnMtZGJjcC4KKyAqIDwvcD4KKyAqIC4KKyAqLworcHVibGljIGNsYXNzIERCTVNFeGVjdXRvciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlIGRhdGFTb3VyY2U7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoREJNU0V4ZWN1dG9yLmNsYXNzCisgICAgICAuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgREJNU0V4ZWN1dG9yKCkgeworICAgIFN0cmluZyBqZGJjVXJsID0gU3lzdGVtLmdldFByb3BlcnR5KCJ4bWxwcy5kYXRhc291cmNlLmpkYmMudXJsIik7CisgICAgU3RyaW5nIHVzZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbHBzLmRhdGFzb3VyY2UuamRiYy51c2VyIik7CisgICAgU3RyaW5nIHBhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbHBzLmRhdGFzb3VyY2UuamRiYy5wYXNzIik7CisgICAgU3RyaW5nIGRyaXZlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1scHMuZGF0YXNvdXJjZS5qZGJjLmRyaXZlciIpOworICAgIHRyeSB7CisgICAgICBDbGFzcy5mb3JOYW1lKGRyaXZlcik7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICB9CisKKyAgICB0aGlzLmRhdGFTb3VyY2UgPSBEYXRhYmFzZUNvbm5lY3Rpb25CdWlsZGVyLmJ1aWxkRGF0YVNvdXJjZSh1c2VyLCBwYXNzLAorICAgICAgICBkcml2ZXIsIGpkYmNVcmwpOworCisgIH0KKworICBwdWJsaWMgTGlzdDxQcm9maWxlPiBleGVjdXRlTG9jYWxRdWVyeShNYXBwaW5nIG1hcCwgU3RyaW5nIHNxbCwKKyAgICAgIFN0cmluZyByZXNMb2NhdGlvblNwZWMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICBMaXN0PFByb2ZpbGU+IHByb2ZpbGVzID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25uID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICBzdGF0ZW1lbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgUmVzdWx0U2V0IHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworCisgICAgICBwcm9maWxlcyA9IG5ldyBWZWN0b3I8UHJvZmlsZT4oKTsKKworICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICBQcm9maWxlIHByb2YgPSB0b1Byb2ZpbGUocnMsIG1hcCwgcmVzTG9jYXRpb25TcGVjKTsKKyAgICAgICAgcHJvZmlsZXMuYWRkKHByb2YpOworICAgICAgfQorCisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBlOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2ZpbGVzOworCisgIH0KKworICBwcml2YXRlIFByb2ZpbGUgdG9Qcm9maWxlKFJlc3VsdFNldCBycywgTWFwcGluZyBtYXAsIFN0cmluZyByZXNMb2NhdGlvblNwZWMpIHsKKyAgICBQcm9maWxlIHByb2ZpbGUgPSBuZXcgUHJvZmlsZSgpOworICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNBdHRyID0gcHJvZmlsZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKKyAgICBQcm9maWxlQXR0cmlidXRlcyBwcm9mQXR0ciA9IHByb2ZpbGUuZ2V0UHJvZmlsZUF0dHJpYnV0ZXMoKTsKKyAgICByZXNBdHRyLnNldFJlc0NsYXNzKCJzeXN0ZW0ucHJvZmlsZSIpOworICAgIHByb2ZBdHRyLnNldFN0YXR1c0lEKCJhY3RpdmUiKTsKKyAgICBwcm9mQXR0ci5zZXRUeXBlKCJwcm9maWxlIik7CisKKyAgICBNZXRhZGF0YSBtZXQgPSBuZXcgTWV0YWRhdGEoKTsKKworICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gbWFwLmdldEZpZWxkTmFtZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIFN0cmluZyBmbGROYW1lID0gaS5uZXh0KCk7CisgICAgICBNYXBwaW5nRmllbGQgZmxkID0gbWFwLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpOworICAgICAgUHJvZmlsZUVsZW1lbnQgZWxlbSA9IG5ldyBFbnVtZXJhdGVkUHJvZmlsZUVsZW1lbnQocHJvZmlsZSk7CisgICAgICBlbGVtLnNldE5hbWUoZmxkLmdldE5hbWUoKSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChmbGQuZ2V0VHlwZSgpLmVxdWFscyhGaWVsZFR5cGUuQ09OU1RBTlQpKSB7CisgICAgICAgICAgZWxlbS5nZXRWYWx1ZXMoKS5hZGQoZmxkLmdldENvbnN0YW50VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3RyaW5nIGVsZW1EYlZhbCA9IHJzLmdldFN0cmluZyhmbGQuZ2V0RGJOYW1lKCkpOworICAgICAgICAgIGZvciAoSXRlcmF0b3I8TWFwcGluZ0Z1bmM+IGogPSBmbGQuZ2V0RnVuY3MoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcHBpbmdGdW5jIGZ1bmMgPSBqLm5leHQoKTsKKyAgICAgICAgICAgIENERVZhbHVlIG9yaWdWYWwgPSBuZXcgQ0RFVmFsdWUoZmxkLmdldE5hbWUoKSwgZWxlbURiVmFsKTsKKyAgICAgICAgICAgIENERVZhbHVlIG5ld1ZhbCA9IGZ1bmMudHJhbnNsYXRlKG9yaWdWYWwpOworICAgICAgICAgICAgZWxlbURiVmFsID0gbmV3VmFsLmdldFZhbCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGVsZW0uZ2V0VmFsdWVzKCkuYWRkKGVsZW1EYlZhbCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBvYnRhaW4gZmllbGQ6IFsiCisgICAgICAgICAgICArIGZsZC5nZXRMb2NhbE5hbWUoKSArICJdIGZyb20gcmVzdWx0IHNldDogbWVzc2FnZTogIgorICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgICAgIG1ldC5hZGRNZXRhZGF0YShlbGVtLmdldE5hbWUoKSwgKFN0cmluZykgZWxlbS5nZXRWYWx1ZXMoKS5nZXQoMCkpOworCisgICAgICBwcm9maWxlLmdldFByb2ZpbGVFbGVtZW50cygpLnB1dChmbGQuZ2V0TmFtZSgpLCBlbGVtKTsKKyAgICB9CisKKyAgICBpZiAocmVzTG9jYXRpb25TcGVjICE9IG51bGwpIHsKKyAgICAgIHJlc0F0dHIuZ2V0UmVzTG9jYXRpb25zKCkuYWRkKAorICAgICAgICAgIFBhdGhVdGlscy5yZXBsYWNlRW52VmFyaWFibGVzKHJlc0xvY2F0aW9uU3BlYywgbWV0KSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb2ZpbGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9maWxlL1hNTFBTUHJvZmlsZUhhbmRsZXIuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZmlsZS9YTUxQU1Byb2ZpbGVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5OWY4MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZmlsZS9YTUxQU1Byb2ZpbGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucHJvZmlsZTsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5EYXRhYmFzZVRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLk1hcHBpbmdSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnByb2R1Y3QuWE1MUFNQcm9kdWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMucHJvZmlsZS5EQk1TRXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyLkhhbmRsZXJRdWVyeVBhcnNlcjsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9maWxlLlByb2ZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQucHJvZmlsZS5oYW5kbGVycy5Qcm9maWxlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuUXVlcnlFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworLyoqCisgKiAKKyAqIDxwPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgUHJvZmlsZUhhbmRsZXJ9IHRoYXQgZXh0ZW5kcyB0aGUgY2FwYWJpbGl0aWVzCisgKiBvZiB0aGUge0BsaW5rIFhNTFBTUHJvZHVjdEhhbmRsZXJ9LCBhbmQgdXNlcyB0aGUgWE1MIFNwZWNpZmljYXRpb24gZGVmaW5lZAorICogYnkgdGhlIG1hcHBpbmcgZmlsZSB0byByZXByZXNlbnQgaXRzIGZpZWxkIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgWE1MUFNQcm9maWxlSGFuZGxlciBleHRlbmRzIFhNTFBTUHJvZHVjdEhhbmRsZXIgaW1wbGVtZW50cworICAgICAgICBQcm9maWxlSGFuZGxlciB7CisKKyAgICBwcml2YXRlIERCTVNFeGVjdXRvciBleGVjdXRvcjsKKworICAgIC8qIG91ciBsb2cgc3RyZWFtICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoWE1MUFNQcm9maWxlSGFuZGxlci5jbGFzcworICAgICAgICAgICAgLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIFN0cmluZyByZXNMb2NhdGlvblNwZWM7CisKKyAgICBwdWJsaWMgWE1MUFNQcm9maWxlSGFuZGxlcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIFN0cmluZyBtYXBwaW5nRmlsZVBhdGggPSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC54bWxwcy5wcm9maWxlLnhtbC5tYXBGaWxlUGF0aCIpOworCisgICAgICAgIGlmIChtYXBwaW5nRmlsZVBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJOZWVkIHRvIHNwZWNpZnkgcGF0aCB0byB4bWwgbWFwcGluZyBmaWxlISIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hcHBpbmcgPSBNYXBwaW5nUmVhZGVyLmdldE1hcHBpbmcobWFwcGluZ0ZpbGVQYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIHByb2ZpbGUgbWFwcGluZyB4bWwgZmlsZTogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1hcHBpbmdGaWxlUGF0aCArICJdOiByZWFzb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvYWQgdGhlIGRiIHByb3BlcnRpZXMgZmlsZQorICAgICAgICAgICAgICAgIC8vIGlmIG9uZSBleGlzdHM6IG90aGVyd2lzZSwgZG9uJ3QgYm90aGVyIGFuZCBqdXN0IHByaW50IG91dCB0aGUgU1FMIHRvCisgICAgICAgIC8vIHRoZSBjb25zb2xlLgorICAgICAgICAvLyAKKyAgICAgICAgU3RyaW5nIGRiUHJvcEZpbGVQYXRoID0gU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQueG1scHMucHJvZmlsZS54bWwuZGJQcm9wRmlsZVBhdGgiKTsKKyAgICAgICAgaWYgKGRiUHJvcEZpbGVQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShkYlByb3BGaWxlUGF0aCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXhlY3V0b3IgPSBuZXcgREJNU0V4ZWN1dG9yKCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlc0xvY2F0aW9uU3BlYyA9IFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LnhtbHBzLnByb2ZpbGUueG1sLnJlc0xvY2F0aW9uU3BlYyIpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXIjZmluZFByb2ZpbGVzKG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9maWxlPiBmaW5kUHJvZmlsZXMoWE1MUXVlcnkgcXVlcnkpIHRocm93cyBQcm9maWxlRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IHdoZXJlU2V0ID0gcXVlcnkuZ2V0V2hlcmVFbGVtZW50U2V0KCk7CisgICAgICAgIExpc3Q8UXVlcnlFbGVtZW50PiBzZWxlY3RTZXQgPSBxdWVyeS5nZXRTZWxlY3RFbGVtZW50U2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc2xhdGVUb0RvbWFpbihzZWxlY3RTZXQsIHRydWUpOworICAgICAgICAgICAgdHJhbnNsYXRlVG9Eb21haW4od2hlcmVTZXQsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxQcm9maWxlPiBwcm9mcyA9IHF1ZXJ5QW5kUGFja2FnZVByb2ZpbGVzKHF1ZXJ5KTsKKyAgICAgICAgcmV0dXJuIHByb2ZzOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuaGFuZGxlcnMuUHJvZmlsZUhhbmRsZXIjZ2V0KGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFByb2ZpbGUgZ2V0KFN0cmluZyBpZCkgdGhyb3dzIFByb2ZpbGVFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgUHJvZmlsZUV4Y2VwdGlvbigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCEiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC5wcm9maWxlLmhhbmRsZXJzLlByb2ZpbGVIYW5kbGVyI2dldElEKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRJZCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBMaXN0PFByb2ZpbGU+IHF1ZXJ5QW5kUGFja2FnZVByb2ZpbGVzKFhNTFF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIFN0YWNrPFF1ZXJ5RWxlbWVudD4gcXVlcnlTdGFjayA9IEhhbmRsZXJRdWVyeVBhcnNlcgorICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeVN0YWNrKHF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpKTsKKyAgICAgICAgRXhwcmVzc2lvbiBwYXJzZWRRdWVyeSA9IEhhbmRsZXJRdWVyeVBhcnNlci5wYXJzZShxdWVyeVN0YWNrLAorICAgICAgICAgICAgICAgIHRoaXMubWFwcGluZyk7CisgICAgICAgIExpc3Q8UHJvZmlsZT4gcHJvZnMgPSBudWxsOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzcWxCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJTRUxFQ1QgKiIpOworICAgICAgICBzcWxCdWYuYXBwZW5kKCIgRlJPTSAiKTsKKyAgICAgICAgc3FsQnVmLmFwcGVuZChtYXBwaW5nLmdldERlZmF1bHRUYWJsZSgpKTsKKyAgICAgICAgc3FsQnVmLmFwcGVuZCgiICIpOworCisgICAgICAgIGlmIChtYXBwaW5nLmdldE51bVRhYmxlcygpID4gMCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBtYXBwaW5nLmdldFRhYmxlTmFtZXMoKS5pdGVyYXRvcigpOyBpCisgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGlmKHRhYmxlTmFtZS5lcXVhbHMobWFwcGluZy5nZXREZWZhdWx0VGFibGUoKSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIERhdGFiYXNlVGFibGUgdGJsID0gbWFwcGluZy5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpOworICAgICAgICAgICAgICAgIHNxbEJ1Zi5hcHBlbmQoIklOTkVSIEpPSU4gIik7CisgICAgICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCh0YmwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIgT04gIik7CisgICAgICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCh0YmwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgc3FsQnVmLmFwcGVuZCh0YmwuZ2V0Sm9pbkZpZWxkTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIgPSAiKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKHRibC5nZXREZWZhdWx0VGFibGVKb2luKCkpOworICAgICAgICAgICAgICAgIHNxbEJ1Zi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKHRibC5nZXREZWZhdWx0VGFibGVKb2luRmllbGROYW1lKCkpOworICAgICAgICAgICAgICAgIHNxbEJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJzZWRRdWVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKCIgV0hFUkUgIik7CisgICAgICAgICAgICBzcWxCdWYuYXBwZW5kKHBhcnNlZFF1ZXJ5LmV2YWx1YXRlKCkpOworICAgICAgICB9CisKKyAgICAgICAgTE9HLmxvZyhMZXZlbC5JTkZPLCBzcWxCdWYudG9TdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKGV4ZWN1dG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvZnMgPSBleGVjdXRvci5leGVjdXRlTG9jYWxRdWVyeSh0aGlzLm1hcHBpbmcsIHNxbEJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCksIHRoaXMucmVzTG9jYXRpb25TcGVjKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGV4ZWN1dGluZyBzcWw6IFsiCisgICAgICAgICAgICAgICAgICAgICAgICArIHNxbEJ1Zi50b1N0cmluZygpICsgIl06IE1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvZnM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlVG9Eb21haW4oTGlzdDxRdWVyeUVsZW1lbnQ+IGVsZW1TZXQsCisgICAgICAgICAgICBib29sZWFuIHNlbGVjdFNldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRyYW5zbGF0ZVRvRG9tYWluKGVsZW1TZXQsIHNlbGVjdFNldCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0FuZEV4cHJlc3Npb24uamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvQW5kRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTdiMDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0FuZEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyOworCisvKioKKyAqCisgKiA8cD5BIGxvZ2ljYWwgYW5kIGV4cHJlc3Npb248L3A+LgorICovCitwdWJsaWMgY2xhc3MgQW5kRXhwcmVzc2lvbiBleHRlbmRzIExvZ09wRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFBhcnNlQ29uc3RhbnRzeworCisgICAgcHVibGljIEFuZEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gcmhzKSB7CisgICAgICAgIHN1cGVyKFNRTF9BTkQsIGxocywgcmhzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvQ29udGFpbnNFeHByZXNzaW9uLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0NvbnRhaW5zRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMmVmNjMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0NvbnRhaW5zRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXI7CisKKy8qKgorICogCisgKiBBIGxvZ2ljYWwgY29udGFpbnMgZXhwcmVzc2lvbi4KKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5zRXhwcmVzc2lvbiBleHRlbmRzIFJlbE9wRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFBhcnNlQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBDb250YWluc0V4cHJlc3Npb24oU3RyaW5nIGxocywgRXhwcmVzc2lvbiBsaXRlcmFsKSB7CisgICAgICAgIHN1cGVyKFNRTF9MSUtFLCBsaHMsIGxpdGVyYWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9FcXVhbHNFeHByZXNzaW9uLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0VxdWFsc0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMzYWFmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9FcXVhbHNFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlcjsKKworLyoqCisgKiAKKyAqIE9wZXJhdG9yIGVxdWFscyBleHByZXNzaW9uLgorICovCitwdWJsaWMgY2xhc3MgRXF1YWxzRXhwcmVzc2lvbiBleHRlbmRzIFJlbE9wRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFBhcnNlQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBFcXVhbHNFeHByZXNzaW9uKFN0cmluZyBsaHMsIEV4cHJlc3Npb24gbGl0ZXJhbCkgeworICAgICAgICBzdXBlcihTUUxfRVFVQUwsIGxocywgbGl0ZXJhbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0V4cHJlc3Npb24uamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzMzNTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0V4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyOworCisvKioKKyAqIAorICogVGhlIGFic3RyYWN0IGludGVyZmFjZSBmb3Igb3VyIGV4cHJlc3Npb24gdHJlZS4KKyAqLworcHVibGljIGludGVyZmFjZSBFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIERlZmluZXMgaG93IHRvIHR1cm4gdGhpcyBFeHByZXNzaW9uIGludG8gYSBTdHJpbmctcmVhZGFibGUgcXVlcnkgdG8gYW4KKyAgICAgKiB1bmRlcmx5aW5nIFNRTCBkYXRhYmFzZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgU3RyaW5nLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhpcyBFeHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZXZhbHVhdGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9HcmVhdGVyVGhhbkVxdWFsc0V4cHJlc3Npb24uamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvR3JlYXRlclRoYW5FcXVhbHNFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjZTE3OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvR3JlYXRlclRoYW5FcXVhbHNFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlcjsKKworLyoqCisgKiAKKyAqIEdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgZXhwcmVzc2lvbi4KKyAqLworcHVibGljIGNsYXNzIEdyZWF0ZXJUaGFuRXF1YWxzRXhwcmVzc2lvbiBleHRlbmRzIFJlbE9wRXhwcmVzc2lvbiBpbXBsZW1lbnRzCisgICAgICAgIFBhcnNlQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBHcmVhdGVyVGhhbkVxdWFsc0V4cHJlc3Npb24oU3RyaW5nIGxocywgRXhwcmVzc2lvbiBsaXRlcmFsKSB7CisgICAgICAgIHN1cGVyKFNRTF9HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE8sIGxocywgbGl0ZXJhbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0dyZWF0ZXJUaGFuRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9HcmVhdGVyVGhhbkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjU4MmVmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9HcmVhdGVyVGhhbkV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyOworCisvKioKKyAqIAorICogR3JlYXRlciB0aGFuIGV4cHJlc3Npb24uCisgKi8KK3B1YmxpYyBjbGFzcyBHcmVhdGVyVGhhbkV4cHJlc3Npb24gZXh0ZW5kcyBSZWxPcEV4cHJlc3Npb24gaW1wbGVtZW50cworICAgICAgICBQYXJzZUNvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgR3JlYXRlclRoYW5FeHByZXNzaW9uKFN0cmluZyBsaHMsIEV4cHJlc3Npb24gbGl0ZXJhbCkgeworICAgICAgICBzdXBlcihTUUxfR1JFQVRFUl9USEFOLCBsaHMsIGxpdGVyYWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9IYW5kbGVyUXVlcnlQYXJzZXIuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvSGFuZGxlclF1ZXJ5UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMThmZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvSGFuZGxlclF1ZXJ5UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXI7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLk1hcHBpbmdGaWVsZDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLy9PT0RUIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuUXVlcnlFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworLyoqCisgKiAKKyAqIFBhcnNlcnMgdGhlIHtAbGluayBYTUxRdWVyeX0gYW5kIGl0cyBAbGluayBYTUxRdWVyeSNnZXRXaGVyZUVsZW1lbnRTZXQoKX0KKyAqIGludG8gYW4ge0BsaW5rIEV4cHJlc3Npb259IHRyZWUuCisgKi8KK3B1YmxpYyBjbGFzcyBIYW5kbGVyUXVlcnlQYXJzZXIgaW1wbGVtZW50cyBQYXJzZUNvbnN0YW50cyB7CisKKyAgLyoqCisgICAqIENhbGxzIHtAbGluayAjcGFyc2UoU3RhY2ssIE1hcHBpbmcpfSB3aXRoIGEgbnVsbCBtYXBwaW5nLgorICAgKiAKKyAgICogQHBhcmFtIHF1ZXJ5U3RhY2sgVGhlIHtAbGluayBYTUxRdWVyeSNnZXRXaGVyZUVsZW1lbnRTZXQoKX0uCisgICAqIEByZXR1cm4gVGhlIHBhcnNlZCB7QGxpbmsgRXhwcmVzc2lvbn0gdHJlZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbiBwYXJzZShTdGFjazxRdWVyeUVsZW1lbnQ+IHF1ZXJ5U3RhY2spIHsKKyAgICByZXR1cm4gcGFyc2UocXVlcnlTdGFjaywgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogCisgICAqIFBhcnNlcyB0aGUge0BsaW5rIFhNTFF1ZXJ5I2dldFdoZXJlRWxlbWVudFNldCgpfSB1c2luZyB0aGUgcHJvdmlkZWQKKyAgICogPHBhcmFtPm1hcDwvcGFyYW0+LgorICAgKiAKKyAgICogQHBhcmFtIHF1ZXJ5U3RhY2sgVGhlIHtAbGluayBYTUxRdWVyeSNnZXRXaGVyZUVsZW1lbnRTZXQoKX0KKyAgICogQHBhcmFtIG1hcCBUaGUgcHJvdmlkZWQgb250b2xvZ2ljYWwgbWFwcGluZy4KKyAgICogQHJldHVybiBUaGUgcGFyc2VkIHtAbGluayBFeHByZXNzaW9ufSB0cmVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBFeHByZXNzaW9uIHBhcnNlKFN0YWNrPFF1ZXJ5RWxlbWVudD4gcXVlcnlTdGFjaywgTWFwcGluZyBtYXApIHsKKworICAgIFF1ZXJ5RWxlbWVudCBxZSA9IG51bGw7CisKKyAgICBpZiAoIXF1ZXJ5U3RhY2suZW1wdHkoKSkgeworICAgICAgcWUgPSAoUXVlcnlFbGVtZW50KSBxdWVyeVN0YWNrLnBvcCgpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIG51bGw7CisKKyAgICBpZiAocWUuZ2V0Um9sZSgpLmVxdWFsc0lnbm9yZUNhc2UoWE1MUVVFUllfTE9HT1ApKSB7CisKKyAgICAgIFN0cmluZyBsb2dPcFR5cGUgPSBxZS5nZXRWYWx1ZSgpOworICAgICAgaWYgKGxvZ09wVHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhNTFFVRVJZX0FORCkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbmRFeHByZXNzaW9uKHBhcnNlKHF1ZXJ5U3RhY2ssIG1hcCksIHBhcnNlKHF1ZXJ5U3RhY2ssIG1hcCkpOworICAgICAgfSBlbHNlIGlmIChsb2dPcFR5cGUuZXF1YWxzSWdub3JlQ2FzZShYTUxRVUVSWV9PUikpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPckV4cHJlc3Npb24ocGFyc2UocXVlcnlTdGFjaywgbWFwKSwgcGFyc2UocXVlcnlTdGFjaywgbWFwKSk7CisgICAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9IGVsc2UgaWYgKHFlLmdldFJvbGUoKS5lcXVhbHNJZ25vcmVDYXNlKFhNTFFVRVJZX1JFTE9QKSkgeworICAgICAgU3RyaW5nIHJlbE9wVHlwZSA9IHFlLmdldFZhbHVlKCk7CisgICAgICBRdWVyeUVsZW1lbnQgcmhzUUUgPSAoUXVlcnlFbGVtZW50KSBxdWVyeVN0YWNrLnBvcCgpOworICAgICAgUXVlcnlFbGVtZW50IGxoc1FFID0gKFF1ZXJ5RWxlbWVudCkgcXVlcnlTdGFjay5wb3AoKTsKKworICAgICAgU3RyaW5nIHJoc1ZhbCA9IChTdHJpbmcpIHJoc1FFLmdldFZhbHVlKCk7CisgICAgICBTdHJpbmcgbGhzVmFsID0gKFN0cmluZykgbGhzUUUuZ2V0VmFsdWUoKTsKKworICAgICAgaWYgKG1hcCAhPSBudWxsKSB7CisgICAgICAgIC8vIGNvbnZlcnQgdGhlIHJpZ2h0IGhhbmQgc2lkZSwgdXNpbmcKKyAgICAgICAgLy8gdGhlIGxvY2FsIG5hbWUKKyAgICAgICAgTWFwcGluZ0ZpZWxkIGZsZCA9IG1hcC5nZXRGaWVsZEJ5TG9jYWxOYW1lKGxoc1ZhbCk7CisgICAgICAgIGlmIChmbGQgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChmbGQuaXNTdHJpbmcoKSkgeworICAgICAgICAgICAgcmhzVmFsID0gIiciICsgcmhzVmFsICsgIiciOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocmVsT3BUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWE1MUVVFUllfRVFVQUwpKSB7CisgICAgICAgIHJldHVybiBuZXcgRXF1YWxzRXhwcmVzc2lvbihsaHNWYWwsIG5ldyBMaXRlcmFsKHJoc1ZhbCkpOworICAgICAgfSBlbHNlIGlmIChyZWxPcFR5cGUuZXF1YWxzSWdub3JlQ2FzZShYTUxRVUVSWV9MSUtFKSkgeworICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5zRXhwcmVzc2lvbihsaHNWYWwsIG5ldyBXaWxkY2FyZExpdGVyYWwocmhzVmFsKSk7CisgICAgICB9IGVsc2UgaWYgKHJlbE9wVHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhNTFFVRVJZX0dSRUFURVJfVEhBTikpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcmVhdGVyVGhhbkV4cHJlc3Npb24obGhzVmFsLCBuZXcgTGl0ZXJhbChyaHNWYWwpKTsKKyAgICAgIH0gZWxzZSBpZiAocmVsT3BUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWE1MUVVFUllfR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPKSkgeworICAgICAgICByZXR1cm4gbmV3IEdyZWF0ZXJUaGFuRXF1YWxzRXhwcmVzc2lvbihsaHNWYWwsIG5ldyBMaXRlcmFsKHJoc1ZhbCkpOworICAgICAgfSBlbHNlIGlmIChyZWxPcFR5cGUuZXF1YWxzSWdub3JlQ2FzZShYTUxRVUVSWV9MRVNTX1RIQU4pKSB7CisgICAgICAgIHJldHVybiBuZXcgTGVzc1RoYW5FeHByZXNzaW9uKGxoc1ZhbCwgbmV3IExpdGVyYWwocmhzVmFsKSk7CisgICAgICB9IGVsc2UgaWYgKHJlbE9wVHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhNTFFVRVJZX0xFU1NfVEhBTl9PUl9FUVVBTF9UTykpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMZXNzVGhhbkVxdWFsc0V4cHJlc3Npb24obGhzVmFsLCBuZXcgTGl0ZXJhbChyaHNWYWwpKTsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0gZWxzZSBpZiAocWUuZ2V0Um9sZSgpLmVxdWFsc0lnbm9yZUNhc2UoWE1MUVVFUllfTElURVJBTCkpIHsKKyAgICAgIHJldHVybiBuZXcgTGl0ZXJhbChxZS5nZXRWYWx1ZSgpKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBudWxsOworCisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0YWNrPFF1ZXJ5RWxlbWVudD4gY3JlYXRlUXVlcnlTdGFjayhMaXN0PFF1ZXJ5RWxlbWVudD4gbCkgeworCisgICAgU3RhY2s8UXVlcnlFbGVtZW50PiByZXQgPSBuZXcgU3RhY2s8UXVlcnlFbGVtZW50PigpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLnNpemUoKTsgaSsrKSB7CisgICAgICByZXQucHVzaChsLmdldChpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvTGVzc1RoYW5FcXVhbHNFeHByZXNzaW9uLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0xlc3NUaGFuRXF1YWxzRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTY5NzUKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0xlc3NUaGFuRXF1YWxzRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXI7CisKKy8qKgorICogCisgKiA8cD4KKyAqICBBIGxlc3MgdGhhbiBvciBlcXVhbHMgZXhwcmVzc2lvbi4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBMZXNzVGhhbkVxdWFsc0V4cHJlc3Npb24gZXh0ZW5kcyBSZWxPcEV4cHJlc3Npb24gaW1wbGVtZW50cworICAgICAgICBQYXJzZUNvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgTGVzc1RoYW5FcXVhbHNFeHByZXNzaW9uKFN0cmluZyBsaHMsIEV4cHJlc3Npb24gbGl0ZXJhbCkgeworICAgICAgICBzdXBlcihTUUxfTEVTU19USEFOX09SX0VRVUFMX1RPLCBsaHMsIGxpdGVyYWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9MZXNzVGhhbkV4cHJlc3Npb24uamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvTGVzc1RoYW5FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4NGYxOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvTGVzc1RoYW5FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlcjsKKworLyoqCisgKiAKKyAqIDxwPgorICogQSBsZXNzIHRoYW4gZXhwcmVzc2lvbi4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBjbGFzcyBMZXNzVGhhbkV4cHJlc3Npb24gZXh0ZW5kcyBSZWxPcEV4cHJlc3Npb24gaW1wbGVtZW50cworICAgICAgICBQYXJzZUNvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgTGVzc1RoYW5FeHByZXNzaW9uKFN0cmluZyBsaHMsIEV4cHJlc3Npb24gbGl0ZXJhbCkgeworICAgICAgICBzdXBlcihTUUxfTEVTU19USEFOLCBsaHMsIGxpdGVyYWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9MaXRlcmFsLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL0xpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWMzZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9MaXRlcmFsLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlcjsKKworLyoqCisgKgorICogQSB2YWx1ZSBsaXRlcmFsLgorICovCitwdWJsaWMgY2xhc3MgTGl0ZXJhbCBpbXBsZW1lbnRzIEV4cHJlc3Npb257CisgICAgCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWw7CisgICAgCisgICAgcHVibGljIExpdGVyYWwoU3RyaW5nIHZhbCl7CisgICAgICAgIHRoaXMudmFsID0gdmFsOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlci5FeHByZXNzaW9uI2V2YWx1YXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGV2YWx1YXRlKCkgeworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9Mb2dPcEV4cHJlc3Npb24uamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvTG9nT3BFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1YTI5ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvTG9nT3BFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5xdWVyeXBhcnNlcjsKKworLyoqCisgKiAKKyAqIEEgbG9naWNhbCBleHByZXNzaW9uIHdpdGggYSBsZWZ0LWhhbmQgc2lkZSAKKyAqIGFuZCByaWdodCBoaW5kLXNpZGUge0BsaW5rIEV4cHJlc3Npb259LgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dPcEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGxvZ29wOworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGxoczsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiByaHM7CisgICAgCisgICAgCisKKyAgICBwdWJsaWMgTG9nT3BFeHByZXNzaW9uKFN0cmluZyBsb2dvcCwgRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gcmhzKSB7CisgICAgICAgIHRoaXMubGhzID0gbGhzOworICAgICAgICB0aGlzLnJocyA9IHJoczsKKyAgICAgICAgdGhpcy5sb2dvcCA9IGxvZ29wOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyLkV4cHJlc3Npb24jZXZhbHVhdGUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZXZhbHVhdGUoKSB7CisgICAgICAgIHJldHVybiAiKCIgKyBsaHMuZXZhbHVhdGUoKSArICIgIiArIGxvZ29wICsgIiAiICsgcmhzLmV2YWx1YXRlKCkgKyAiKSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbGhzCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0TGhzKCkgeworICAgICAgICByZXR1cm4gbGhzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBsaHMgdGhlIGxocyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaHMoRXhwcmVzc2lvbiBsaHMpIHsKKyAgICAgICAgdGhpcy5saHMgPSBsaHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcmhzCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0UmhzKCkgeworICAgICAgICByZXR1cm4gcmhzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByaHMgdGhlIHJocyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSaHMoRXhwcmVzc2lvbiByaHMpIHsKKyAgICAgICAgdGhpcy5yaHMgPSByaHM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL09yRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9PckV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjU1MzFlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9PckV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyOworCisvKioKKyAqCisgKiBBbiBPciBleHByZXNzaW9uLgorICovCitwdWJsaWMgY2xhc3MgT3JFeHByZXNzaW9uIGV4dGVuZHMgTG9nT3BFeHByZXNzaW9uIGltcGxlbWVudHMgUGFyc2VDb25zdGFudHN7CisKKyAgICBwdWJsaWMgT3JFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBFeHByZXNzaW9uIHJocykgeworICAgICAgICBzdXBlcihTUUxfT1IsIGxocywgcmhzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvUGFyc2VDb25zdGFudHMuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcXVlcnlwYXJzZXIvUGFyc2VDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJhNDdiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9QYXJzZUNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXI7CisKKy8qKgorICoKKyAqIENvbnN0YW50IG1ldCBrZXlzIHVzZWQgaW4gcGFyc2luZyB0aGUgWE1MUXVlcnkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFyc2VDb25zdGFudHMgeworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTFFVRVJZX0xPR09QID0gIkxPR09QIjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxRVUVSWV9BTkQgPSAiQU5EIjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxRVUVSWV9PUiA9ICJPUiI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MUVVFUllfUkVMT1AgPSAiUkVMT1AiOworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTFFVRVJZX0VRVUFMID0gIkVRIjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxRVUVSWV9MSUtFID0gIkxJS0UiOworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTFFVRVJZX0dSRUFURVJfVEhBTiA9ICJHVCI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MUVVFUllfR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPID0gIkdFIjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxRVUVSWV9MRVNTX1RIQU4gPSAiTFQiOworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTFFVRVJZX0xFU1NfVEhBTl9PUl9FUVVBTF9UTyA9ICJMRSI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MUVVFUllfTElURVJBTCA9ICJMSVRFUkFMIjsKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTUUxfTElLRSA9ICJMSUtFIjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTUUxfRVFVQUwgPSAiPSI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1FMX0FORCA9ICJBTkQiOworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNRTF9PUiA9ICJPUiI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1FMX0dSRUFURVJfVEhBTl9PUl9FUVVBTF9UTyA9ICI+PSI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1FMX0dSRUFURVJfVEhBTiA9ICI+IjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTUUxfTEVTU19USEFOID0gIjwiOworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNRTF9MRVNTX1RIQU5fT1JfRVFVQUxfVE8gPSAiPD0iOworCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL1JlbE9wRXhwcmVzc2lvbi5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9SZWxPcEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU5OWZmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9SZWxPcEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyOworCisvKioKKyAqIAorICogQSByZWxhdGlvbmFsIG9wZXJhdG9yLgorICovCitwdWJsaWMgY2xhc3MgUmVsT3BFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyByZWxvcDsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBsaXRlcmFsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbGhzOworCisgICAgcHVibGljIFJlbE9wRXhwcmVzc2lvbihTdHJpbmcgcmVsb3AsIFN0cmluZyBsaHMsIEV4cHJlc3Npb24gbGl0ZXJhbCkgeworICAgICAgICB0aGlzLnJlbG9wID0gcmVsb3A7CisgICAgICAgIHRoaXMubGhzID0gbGhzOworICAgICAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyLkV4cHJlc3Npb24jZXZhbHVhdGUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZXZhbHVhdGUoKSB7CisgICAgICAgIHJldHVybiBsaHMgKyAiICIgKyByZWxvcCArICIgIiArIGxpdGVyYWwuZXZhbHVhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsaHMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExocygpIHsKKyAgICAgICAgcmV0dXJuIGxoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGhzIHRoZSBsaHMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGhzKFN0cmluZyBsaHMpIHsKKyAgICAgICAgdGhpcy5saHMgPSBsaHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbGl0ZXJhbAorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldExpdGVyYWwoKSB7CisgICAgICAgIHJldHVybiBsaXRlcmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBsaXRlcmFsIHRoZSBsaXRlcmFsIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpdGVyYWwoRXhwcmVzc2lvbiBsaXRlcmFsKSB7CisgICAgICAgIHRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL1dpbGRjYXJkTGl0ZXJhbC5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9XaWxkY2FyZExpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk3YzJhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9XaWxkY2FyZExpdGVyYWwuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnF1ZXJ5cGFyc2VyOworCisvKioKKyAqIAorICogQSB3aWxkY2FyZCBsaXRlcmFsLgorICovCitwdWJsaWMgY2xhc3MgV2lsZGNhcmRMaXRlcmFsIGV4dGVuZHMgTGl0ZXJhbCB7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkTGl0ZXJhbChTdHJpbmcgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXIuTGl0ZXJhbCNldmFsdWF0ZSgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBldmFsdWF0ZSgpIHsKKyAgICAgICAgaWYodmFsLnN0YXJ0c1dpdGgoIiciKSl7CisgICAgICAgICAgcmV0dXJuICInJSIrdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoKCktMSkrIiUnIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHJldHVybiAiJSIgKyB2YWwgKyAiJSI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFUmVzdWx0LmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiYTdhOAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9DREVSZXN1bHQuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5zdHJ1Y3RzOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmcuTWFwcGluZ0ZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzLk1hcHBpbmdGdW5jOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlJlc3VsdDsKKworLy9KREsgaW1wb3J0cworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEEge0BsaW5rIFJlc3VsdH0gdGhhdCB3cmFwcyBhIHtAbGluayBSZXN1bHRTZXR9IGFuZCByZXR1cm5zIHJvd3MgYXMgU3RyaW5ncywKKyAqIGFwcGx5aW5nIHtAbGluayBNYXBwaW5nRnVuY3N9IGlmIGEge0BsaW5rIE1hcHBpbmd9IGlzIHByb3ZpZGVkLCBhbmQgYXBwZW5kaW5nCisgKiBjb25zdGFudCBmaWVsZHMgaWYgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIENERVZhbHVlfXMgaXMgcHJvdmlkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDREVSZXN1bHQgZXh0ZW5kcyBSZXN1bHQgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST1dfVEVSTUlOQVRPUiA9ICIkIjsKKworICBwcml2YXRlIGZpbmFsIFJlc3VsdFNldCByczsKKyAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uIGNvbjsKKyAgcHJpdmF0ZSBNYXBwaW5nIG1hcHBpbmc7CisgIHByaXZhdGUgTGlzdDxDREVWYWx1ZT4gY29uc3RWYWx1ZXM7CisgIHByaXZhdGUgTGlzdDxRdWVyeUVsZW1lbnQ+IG9yZGVyZWRGaWVsZHM7CisKKyAgcHVibGljIENERVJlc3VsdChSZXN1bHRTZXQgcnMsIENvbm5lY3Rpb24gY29uKSB7CisgICAgdGhpcy5ycyA9IHJzOworICAgIHRoaXMuY29uID0gY29uOworICAgIHNldE1pbWVUeXBlKCJ0ZXh0L3BsYWluIik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHNldE9yZGVyZWRGaWVsZHMoTGlzdDxRdWVyeUVsZW1lbnQ+IG9yZGVyZWRGaWVsZHMpeworICAgIHRoaXMub3JkZXJlZEZpZWxkcyA9IG9yZGVyZWRGaWVsZHM7ICAgIAorICB9CisKKyAgcHVibGljIHZvaWQgc2V0TWFwcGluZyhNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICB0aGlzLm1hcHBpbmcgPSBtYXBwaW5nOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q29uc3RWYWx1ZXMoTGlzdDxDREVWYWx1ZT4gY29uc3RWYWx1ZXMpIHsKKyAgICB0aGlzLmNvbnN0VmFsdWVzID0gY29uc3RWYWx1ZXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAocnMgPT0gbnVsbCB8fCBjb24gPT0gbnVsbCkKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW5wdXRTdHJlYW0gbm90IHJlYWR5LCBSZXN1bHRTZXQgb3IgQ29ubmVjdGlvbiBpcyBudWxsISIpOworICAgIHJldHVybiBuZXcgQ0RFUmVzdWx0SW5wdXRTdHJlYW0odGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgaWYgKHJzICE9IG51bGwpCisgICAgICBycy5jbG9zZSgpOworICAgIGlmIChjb24gIT0gbnVsbCkKKyAgICAgIGNvbi5jbG9zZSgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROZXh0Um93QXNTdHJpbmcoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICBpZiAocnMubmV4dCgpKSB7CisgICAgICBDREVSb3cgcm93ID0gY3JlYXRlQ0RFUm93KCk7CisgICAgICBpZiAobWFwcGluZyAhPSBudWxsKQorICAgICAgICBhcHBseU1hcHBpbmdGdW5jcyhyb3cpOworICAgICAgaWYgKHRoaXMuY29uc3RWYWx1ZXMgIT0gbnVsbCAmJiAKKyAgICAgICAgICAoKHRoaXMub3JkZXJlZEZpZWxkcyA9PSBudWxsKSB8fCAKKyAgICAgICAgICAodGhpcy5vcmRlcmVkRmllbGRzICE9IG51bGwgJiYgdGhpcy5vcmRlcmVkRmllbGRzLnNpemUoKSA9PSAwKSkpeworICAgICAgICBhZGRDb25zdFZhbHVlcyhyb3cpOworICAgICAgfQorICAgICAgLy8gaWYgdGhlcmUgaXMgc29tZSBraW5kIG9mIGNvbmZpZ3VyYWJsZSByZXNwb25zZSB3cml0ZXIsCisgICAgICAvLyBoZXJlIHdvdWxkIGJlIGEgbmljZSBwbGFjZSB0byBwdXQgaXQuLi4KKyAgICAgIHJldHVybiByb3cudG9TdHJpbmcoKSArIFJPV19URVJNSU5BVE9SOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgQ0RFUm93IGNyZWF0ZUNERVJvdygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIENERVJvdyByb3cgPSBuZXcgQ0RFUm93KCk7CisgICAgUmVzdWx0U2V0TWV0YURhdGEgbWV0ID0gcnMuZ2V0TWV0YURhdGEoKTsKKyAgICBpbnQgY291bnQgPSBtZXQuZ2V0Q29sdW1uQ291bnQoKTsKKyAgICBNYXA8U3RyaW5nLCBDREVWYWx1ZT4gZGJWYWxNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENERVZhbHVlPigpOworICAgIE1hcDxTdHJpbmcsIENERVZhbHVlPiBjb25zdFZhbE1hcCA9IGNkZUxpc3RUb01hcCh0aGlzLmNvbnN0VmFsdWVzKTsKKyAgICBMaXN0PENERVZhbHVlPiBvcmRlcmVkRGJWYWxzID0gbmV3IFZlY3RvcjxDREVWYWx1ZT4oKTsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAvLyBzaW5jZSB0aGUgU1FMIHF1ZXJ5IHdhcyBidWlsdCB3aXRoICJTRUxFQ1QgJHtmaWVsZGxvY2FsbmFtZX0gYXMgJHtmaWVsZG5hbWV9IgorICAgICAgLy8gd2Uga25vdyB0aGF0IFJlc3VsdFNldCBjb2x1bW4gbmFtZXMgZXF1YWwgQ0RFIGZpZWxkIG5hbWVzCisgICAgICAvLyBhbmQgYXBwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGFzIHdlbGwKKyAgICAgIFN0cmluZyBmaWVsZExvY2FsQ29sTmFtZSA9IG1ldC5nZXRDb2x1bW5MYWJlbChpKTsKKyAgICAgIFN0cmluZyBjb2xWYWx1ZSA9IHJzLmdldFN0cmluZyhpKTsKKyAgICAgIENERVZhbHVlIHZhbCA9IG5ldyBDREVWYWx1ZShmaWVsZExvY2FsQ29sTmFtZSwgY29sVmFsdWUpOworICAgICAgZGJWYWxNYXAucHV0KGZpZWxkTG9jYWxDb2xOYW1lLCB2YWwpOworICAgICAgb3JkZXJlZERiVmFscy5hZGQodmFsKTsKKyAgICB9CisgICAgCisgICAgLy8gbm93IGhhdmUgdGhlIGNvbnN0YW50IHZhbHVlcywgYW5kIHRoZSBkYiB2YWx1ZXMsIG9yZGVyIHRoZSByb3cKKyAgICBpZih0aGlzLm9yZGVyZWRGaWVsZHMgIT0gbnVsbCl7CisgICAgICBmb3IoUXVlcnlFbGVtZW50IHFlOiB0aGlzLm9yZGVyZWRGaWVsZHMpeworICAgICAgICBTdHJpbmcgcWVDZGVWYWwgPSB0aGlzLm1hcHBpbmcuZ2V0RmllbGRCeUxvY2FsTmFtZShxZS5nZXRWYWx1ZSgpKS5nZXROYW1lKCk7CisgICAgICAgIGlmKGRiVmFsTWFwLmNvbnRhaW5zS2V5KHFlQ2RlVmFsKSl7CisgICAgICAgICAgcm93LmdldFZhbHMoKS5hZGQoZGJWYWxNYXAuZ2V0KHFlQ2RlVmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihjb25zdFZhbE1hcC5jb250YWluc0tleShxZUNkZVZhbCkpeworICAgICAgICAgIHJvdy5nZXRWYWxzKCkuYWRkKGNvbnN0VmFsTWFwLmdldChxZUNkZVZhbCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2Ugcm93LmdldFZhbHMoKS5hZGRBbGwob3JkZXJlZERiVmFscyk7CisgICAgCisgICAgCisgICAgcmV0dXJuIHJvdzsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhcHBseU1hcHBpbmdGdW5jcyhDREVSb3cgcm93KSB7CisgICAgZm9yIChDREVWYWx1ZSB2YWx1ZSA6IHJvdy5nZXRWYWxzKCkpIHsKKyAgICAgIE1hcHBpbmdGaWVsZCBmbGQgPSBtYXBwaW5nLmdldEZpZWxkQnlOYW1lKHZhbHVlLmdldENkZU5hbWUoKSk7CisgICAgICBpZiAoZmxkICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChNYXBwaW5nRnVuYyBmdW5jIDogZmxkLmdldEZ1bmNzKCkpIHsKKyAgICAgICAgICBDREVWYWx1ZSBuZXdWYWx1ZSA9IGZ1bmMudHJhbnNsYXRlKHZhbHVlKTsKKyAgICAgICAgICB2YWx1ZS5zZXRWYWwobmV3VmFsdWUuZ2V0VmFsKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgYWRkQ29uc3RWYWx1ZXMoQ0RFUm93IHJvdykgeworICAgIHJvdy5nZXRWYWxzKCkuYWRkQWxsKGNvbnN0VmFsdWVzKTsKKyAgfSAgCisgIAorICBwcml2YXRlIE1hcDxTdHJpbmcsIENERVZhbHVlPiBjZGVMaXN0VG9NYXAoTGlzdDxDREVWYWx1ZT4gdmFscyl7CisgICAgTWFwPFN0cmluZywgQ0RFVmFsdWU+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ0RFVmFsdWU+KCk7CisgICAgaWYodmFscyAhPSBudWxsKXsKKyAgICAgIGZvcihDREVWYWx1ZSB2YWw6IHZhbHMpeworICAgICAgICBtYXAucHV0KHZhbC5nZXRDZGVOYW1lKCksIHZhbCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBtYXA7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9zdHJ1Y3RzL0NERVJlc3VsdElucHV0U3RyZWFtLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFUmVzdWx0SW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ3ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9zdHJ1Y3RzL0NERVJlc3VsdElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMuc3RydWN0czsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworY2xhc3MgQ0RFUmVzdWx0SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBDREVSZXN1bHQgcmVzOworICBwcml2YXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIHJvd1N0cmVhbTsKKworICBwdWJsaWMgQ0RFUmVzdWx0SW5wdXRTdHJlYW0oQ0RFUmVzdWx0IHJlcykgeworICAgIHRoaXMucmVzID0gcmVzOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGZldGNoTmV4dFJvdygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHMgPSBudWxsOworICAgIHRyeSB7CisgICAgICBzID0gcmVzLmdldE5leHRSb3dBc1N0cmluZygpOworICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgfQorICAgIGlmIChyb3dTdHJlYW0gIT0gbnVsbCkKKyAgICAgIHJvd1N0cmVhbS5jbG9zZSgpOworICAgIHJvd1N0cmVhbSA9IHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgcmV0dXJuIHJvd1N0cmVhbSAhPSBudWxsOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGVuc3VyZU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChyb3dTdHJlYW0gPT0gbnVsbCB8fCByb3dTdHJlYW0uYXZhaWxhYmxlKCkgPD0gMCkKKyAgICAgIHJldHVybiBmZXRjaE5leHRSb3coKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBlbnN1cmVPcGVuKCkgPyByb3dTdHJlYW0ucmVhZCgpIDogLTE7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICghZW5zdXJlT3BlbigpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fCAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkKKyAgICAgICAgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKyAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IHRvdGFsID0gMDsKKyAgICBpbnQgbiA9IHJvd1N0cmVhbS5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICB0b3RhbCArPSBuOworICAgIHdoaWxlIChuICE9IC0xICYmIHRvdGFsIDwgbGVuKSB7CisgICAgICBpZiAoIWZldGNoTmV4dFJvdygpKQorICAgICAgICByZXR1cm4gdG90YWw7CisgICAgICBuID0gcm93U3RyZWFtLnJlYWQoYiwgb2ZmICsgdG90YWwsIGxlbiAtIHRvdGFsKTsKKyAgICAgIHRvdGFsICs9IG47CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHJvd1N0cmVhbSAhPSBudWxsKQorICAgICAgcm93U3RyZWFtLmNsb3NlKCk7CisgICAgcm93U3RyZWFtID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICByZXMuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChyb3dTdHJlYW0gPT0gbnVsbCkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiByb3dTdHJlYW0uYXZhaWxhYmxlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWFyayBub3Qgc3VwcG9ydGVkIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlc2V0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFUm93LmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFUm93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhM2NkZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9DREVSb3cuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHM7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworCisvKioKKyAqIAorICogPHA+CisgKiBBIHJvdyBvZiB7QGxpbmsgQ0RFVmFsdWV9cywgcmV0dXJuZWQKKyAqIGZyb20gYSBxdWVyeSBhZ2FpbnN0IGEgUHJvZHVjdCBTZXJ2ZXIuCisgKiA8L3A+LgorICovCitwdWJsaWMgY2xhc3MgQ0RFUm93IHsKKworICAgIHByaXZhdGUgTGlzdDxDREVWYWx1ZT4gdmFsczsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1NFUEFSQVRPUiA9ICJcdCI7CisKKyAgICBwdWJsaWMgQ0RFUm93KCkgeworICAgICAgICB2YWxzID0gbmV3IFZlY3RvcjxDREVWYWx1ZT4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgclN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCAmJiB2YWxzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8Q0RFVmFsdWU+IGkgPSB2YWxzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENERVZhbHVlIHYgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICByU3RyLmFwcGVuZCh2LmdldFZhbCgpICsgQ09MX1NFUEFSQVRPUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJTdHIuZGVsZXRlQ2hhckF0KHJTdHIubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByU3RyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdmFscworICAgICAqLworICAgIHB1YmxpYyBMaXN0PENERVZhbHVlPiBnZXRWYWxzKCkgeworICAgICAgICByZXR1cm4gdmFsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmFscworICAgICAqICAgICAgICAgICAgdGhlIHZhbHMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFscyhMaXN0PENERVZhbHVlPiB2YWxzKSB7CisgICAgICAgIHRoaXMudmFscyA9IHZhbHM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFVmFsdWUuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9DREVWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTg0MDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3N0cnVjdHMvQ0RFVmFsdWUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHM7CisKKy8qKgorICogCisgKiA8cD4KKyAqIEEgY2RlIG5hbWUgYW5kIGEgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5IGFnYWluc3QgYSBQcm9kdWN0IFNlcnZlcgorICogPC9wPi4KKyAqLworcHVibGljIGNsYXNzIENERVZhbHVlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNkZU5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyB2YWw7CisKKyAgICBwdWJsaWMgQ0RFVmFsdWUoKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgQ0RFVmFsdWUoU3RyaW5nIGNkZU5hbWUsIFN0cmluZyB2YWwpIHsKKyAgICAgICAgdGhpcy5jZGVOYW1lID0gY2RlTmFtZTsKKyAgICAgICAgdGhpcy52YWwgPSB2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2RlTmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2RlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNkZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNkZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjZGVOYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENkZU5hbWUoU3RyaW5nIGNkZU5hbWUpIHsKKyAgICAgICAgdGhpcy5jZGVOYW1lID0gY2RlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbChTdHJpbmcgdmFsKSB7CisgICAgICAgIHRoaXMudmFsID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKyAgICAgICAgcmV0dXJuICJbY2RlTmFtZT0iK3RoaXMuY2RlTmFtZSsiLHZhbD0iK3RoaXMudmFsKyJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3V0aWwvR2VuZXJpY0NERU9iamVjdEZhY3RvcnkuamF2YSBiLzAuMTAveG1scHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvdXRpbC9HZW5lcmljQ0RFT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzJjYWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3V0aWwvR2VuZXJpY0NERU9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnV0aWw7CisKKy8vSkRLIGltcG9ydHMKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8vT09EVCBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmcuZnVuY3MuTWFwcGluZ0Z1bmM7CisKKy8qKgorICogCisgKiA8cD4KKyAqIEFuIG9iamVjdCBmYWN0b3J5IGZvciBjcmVhdGluZyBDREUgb2JqZWN0cy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljQ0RFT2JqZWN0RmFjdG9yeSB7CisKKyAgICAvKiBvdXIgbG9nIHN0cmVhbSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIKKyAgICAgICAgICAgIC5nZXRMb2dnZXIoR2VuZXJpY0NERU9iamVjdEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgR2VuZXJpY0NERU9iamVjdEZhY3RvcnkoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJEb24ndCBjb25zdHJ1Y3Qgb2JqZWN0IGZhY3RvcmllcyEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1hcHBpbmdGdW5jIGdldE1hcHBpbmdGdW5jRnJvbUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIE1hcHBpbmdGdW5jIGZ1bmMgPSBudWxsOworICAgICAgICBDbGFzcyBmdW5jQ2xheno7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmdW5jQ2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgICBmdW5jID0gKE1hcHBpbmdGdW5jKSBmdW5jQ2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBmdW5jOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gbG9hZCBjbGFzczogWyIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiXTogY2xhc3Mgbm90IGZvdW5kISBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBsb2FkIGNsYXNzOiBbIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICArICJdOiBjYW5ub3QgaW5zdGFudGlhdGUhIG1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCAiVW5hYmxlIHRvIGxvYWQgY2xhc3M6IFsiICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIl06IGlsbGVnYWwgYWNjZXNzISBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy91dGlsL1hNTFF1ZXJ5SGVscGVyLmphdmEgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3V0aWwvWE1MUXVlcnlIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDE0MTAyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy91dGlsL1hNTFF1ZXJ5SGVscGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy51dGlsOworCisvL09PRFQgaW1wb3J0cworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTsKKworLyoqCisgKiAKKyAqIDxwPgorICogSGVscGVyIG1ldGhvZHMgdG8gaGFuZGxlIHRob3NlIHBlc2t5IHtAbGluayBYTUxRdWVyeX0gb2JqZWN0cy4KKyAqIDwvcD4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBYTUxRdWVyeUhlbHBlciBpbXBsZW1lbnRzIFhNTFF1ZXJ5S2V5c3sKKworICAgIHB1YmxpYyBzdGF0aWMgWE1MUXVlcnkgZ2V0RGVmYXVsdFF1ZXJ5RnJvbVF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSkgeworICAgICAgICByZXR1cm4gbmV3IFhNTFF1ZXJ5KHF1ZXJ5Lyoga2V5d29yZFF1ZXJ5ICovLCAiIi8qIGlkICovLAorICAgICAgICAgICAgICAgICIiLyogdGl0bGUgKi8sICIiLyogZGVzYyAqLywgIiIvKiBkZElkICovLAorICAgICAgICAgICAgICAgICIiLyogcmVzdWx0TW9kZUlkICovLCAiIi8qIHByb3BUeXBlICovLCAiIi8qIHByb3BMZXZlbHMgKi8sCisgICAgICAgICAgICAgICAgWE1MUXVlcnkuREVGQVVMVF9NQVhfUkVTVUxUUy8qIG1heFJlc3VsdHMgKi8pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy91dGlsL1hNTFF1ZXJ5S2V5cy5qYXZhIGIvMC4xMC94bWxwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy91dGlsL1hNTFF1ZXJ5S2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWUzZjYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3V0aWwvWE1MUXVlcnlLZXlzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy51dGlsOworCisvKioKKyAqCisgKiA8cD5NZXQgS2V5cyBmb3IgZGVhbGluZyB3aXRoIHtAbGluayBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuWE1MUXVlcnl9czwvcD4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWE1MUXVlcnlLZXlzIHsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0xJVEVSQUwgPSAiTElURVJBTCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9FTEVNTkFNRSA9ICJlbGVtTmFtZSI7CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9UZXN0TWFwcGluZ1JlYWRlci5qYXZhIGIvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9tYXBwaW5nL1Rlc3RNYXBwaW5nUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkYzdlZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvbWFwcGluZy9UZXN0TWFwcGluZ1JlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLm1hcHBpbmc7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5mdW5jcy5NYXBwaW5nRnVuYzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMuc3RydWN0cy5DREVWYWx1ZTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBzdWl0ZSBmb3IgWE1MUFMgeG1sIG1hcCBmaWxlIHJlYWRlci4KKyAqLworcHVibGljIGNsYXNzIFRlc3RNYXBwaW5nUmVhZGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkTmFtZSA9ICJUZXN0IFF1ZXJ5IEhhbmRsZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkSWQgPSAidXJuOm9vZHQ6eG1scHM6dGVzdHBzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBleHBlY3RlZEZpZWxkcyA9IDQzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJTUVOX0NPTlRBQ1RfRU1BSUxfVEVYVCA9ICJTUEVDSU1FTl9DT05UQUNULUVNQUlMX1RFWFQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJTUVOX0NPTExFQ1RFRF9DT0RFID0gIlNQRUNJTUVOX0NPTExFQ1RFRF9DT0RFIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSU1FTl9USVNTVUVfT1JHQU5fU0lURV9DT0RFID0gIlNQRUNJTUVOX1RJU1NVRV9PUkdBTi1TSVRFX0NPREUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBQ1RfUEVSU09OX0VNQUlMID0gIkJyZW5kYW4uUGhhbGFuQG1lZC5ueXUuZWR1IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZERlZmF1bHRUYWJsZSA9ICJiYXNlbGluZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRKb2luRmxkID0gInBhdGllbnRfaWQiOworCisgICAgcHVibGljIFRlc3RNYXBwaW5nUmVhZGVyKCkgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRUYWJsZXMoKSB7CisgICAgICAgIE1hcHBpbmcgbWFwcGluZyA9IGdldE1hcHBpbmdPckZhaWwoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXBwaW5nKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwcGluZy5nZXROdW1UYWJsZXMoKSk7CisgICAgICAgIGFzc2VydE51bGwobWFwcGluZy5nZXRUYWJsZUJ5TmFtZSgiYmFzZWxpbmUiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFwcGluZy5nZXRUYWJsZUJ5TmFtZSgic3BlY2ltZW4iKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFwcGluZy5nZXREZWZhdWx0VGFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZERlZmF1bHRUYWJsZSwgbWFwcGluZy5nZXREZWZhdWx0VGFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEpvaW5GbGQsIG1hcHBpbmcuZ2V0VGFibGVCeU5hbWUoInNwZWNpbWVuIikKKyAgICAgICAgICAgICAgICAuZ2V0Sm9pbkZpZWxkTmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJhc2ljSW5mbygpIHsKKyAgICAgICAgTWFwcGluZyBtYXBwaW5nID0gZ2V0TWFwcGluZ09yRmFpbCgpOworCisgICAgICAgIGFzc2VydE5vdE51bGwobWFwcGluZyk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE5hbWUsIG1hcHBpbmcuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSWQsIG1hcHBpbmcuZ2V0SWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRGaWVsZHMoKSB7CisgICAgICAgIE1hcHBpbmcgbWFwcGluZyA9IGdldE1hcHBpbmdPckZhaWwoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXBwaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmllbGRzLCBtYXBwaW5nLmdldE51bUZpZWxkcygpKTsKKyAgICAgICAgY29udGFpbnNTcGVjaW1lbkNvbnRhY3RFbWFpbFRleHRPckZhaWwobWFwcGluZyk7CisgICAgICAgIGNvbnRhaW5zU3BlY2ltZW5Db2xsZWN0ZWRDb2RlT3JGYWlsKG1hcHBpbmcpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRGdW5jcygpIHsKKyAgICAgICAgTWFwcGluZyBtYXBwaW5nID0gZ2V0TWFwcGluZ09yRmFpbCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1hcHBpbmcpOworICAgICAgICBhc3NlcnRUcnVlKG1hcHBpbmcuZ2V0TnVtRmllbGRzKCkgPiAwKTsKKworICAgICAgICBNYXBwaW5nRmllbGQgZnVuY0ZpZWxkID0gbWFwcGluZworICAgICAgICAgICAgICAgIC5nZXRGaWVsZEJ5TmFtZShTUEVDSU1FTl9USVNTVUVfT1JHQU5fU0lURV9DT0RFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmdW5jRmllbGQpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoZnVuY0ZpZWxkLmdldEZ1bmNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZnVuY0ZpZWxkLmdldEZ1bmNzKCkuc2l6ZSgpLCAxKTsKKworICAgICAgICBNYXBwaW5nRnVuYyBmdW5jID0gZnVuY0ZpZWxkLmdldEZ1bmNzKCkuZ2V0KDApOworICAgICAgICBDREVWYWx1ZSB2YWwgPSBuZXcgQ0RFVmFsdWUoInRlc3QiLCAiMTYiKTsKKyAgICAgICAgQ0RFVmFsdWUgcmVzdWx0ID0gZnVuYy50cmFuc2xhdGUodmFsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFZhbCgpLCAiMSIpOworICAgICAgICB2YWwuc2V0VmFsKCIyMzUiKTsKKyAgICAgICAgcmVzdWx0ID0gZnVuYy50cmFuc2xhdGUodmFsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRWYWwoKSwgIjIzNSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nRmllbGRHZXRMb2NhbE5hbWUoKSB7CisgICAgICAgIE1hcHBpbmcgbWFwcGluZyA9IGdldE1hcHBpbmdPckZhaWwoInRlc3Qtc2FtZS1jb2wtbmFtZS1wcy54bWwiKTsKKworICAgICAgICBNYXBwaW5nRmllbGQgZmllbGRPbmx5ID0gbWFwcGluZy5nZXRGaWVsZEJ5TmFtZSgiZmllbGRfb25seSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHRUYWJsZS5maWVsZF9vbmx5IiwgZmllbGRPbmx5LmdldExvY2FsTmFtZSgpKTsKKworICAgICAgICBNYXBwaW5nRmllbGQgZmllbGRXaXRoVGFibGUgPSBtYXBwaW5nLmdldEZpZWxkQnlOYW1lKCJmaWVsZF93aXRoX3RhYmxlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYW5vdGhlclRhYmxlLmZpZWxkX2RiIiwgZmllbGRXaXRoVGFibGUuZ2V0TG9jYWxOYW1lKCkpOworCisgICAgICAgIE1hcHBpbmdGaWVsZCBmaWVsZFVzZURlZmF1bHQgPSBtYXBwaW5nLmdldEZpZWxkQnlOYW1lKCJmaWVsZF91c2VfZGVmYXVsdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHRUYWJsZS5maWVsZF9kYiIsIGZpZWxkVXNlRGVmYXVsdC5nZXRMb2NhbE5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbnRhaW5zU3BlY2ltZW5Db2xsZWN0ZWRDb2RlT3JGYWlsKE1hcHBpbmcgbWFwcGluZykgeworCisgICAgICAgIE1hcHBpbmdGaWVsZCBmbGQgPSBtYXBwaW5nLmdldEZpZWxkQnlOYW1lKFNQRUNJTUVOX0NPTExFQ1RFRF9DT0RFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmbGQpOworICAgICAgICBhc3NlcnRUcnVlKGZsZC5nZXRUeXBlKCkuZXF1YWxzKEZpZWxkVHlwZS5EWU5BTUlDKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGZsZC5nZXRUeXBlKCkuZXF1YWxzKEZpZWxkVHlwZS5DT05TVEFOVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNwZWNpbWVuX2NvbGxlY3RlZCIsIGZsZC5nZXREYk5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3BlY2ltZW4iLCBmbGQuZ2V0VGFibGVOYW1lKCkpOworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbnRhaW5zU3BlY2ltZW5Db250YWN0RW1haWxUZXh0T3JGYWlsKE1hcHBpbmcgbWFwcGluZykgeworICAgICAgICBNYXBwaW5nRmllbGQgZmxkID0gbWFwcGluZy5nZXRGaWVsZEJ5TmFtZShTUEVDSU1FTl9DT05UQUNUX0VNQUlMX1RFWFQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZsZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmbGQuZ2V0Q29uc3RhbnRWYWx1ZSgpLCBDT05UQUNUX1BFUlNPTl9FTUFJTCk7CisgICAgICAgIGFzc2VydFRydWUoZmxkLmdldFR5cGUoKS5lcXVhbHMoRmllbGRUeXBlLkNPTlNUQU5UKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGZsZC5nZXRUeXBlKCkuZXF1YWxzKEZpZWxkVHlwZS5EWU5BTUlDKSk7CisgICAgICAgIGFzc2VydFRydWUoZmxkLmdldFNjb3BlKCkuZXF1YWxzKEZpZWxkU2NvcGUuUkVUVVJOKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGZsZC5nZXRTY29wZSgpLmVxdWFscyhGaWVsZFNjb3BlLlFVRVJZKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcHBpbmcgZ2V0TWFwcGluZ09yRmFpbCgpIHsKKyAgICAgIHJldHVybiBnZXRNYXBwaW5nT3JGYWlsKCJ0ZXN0LXBzLnhtbCIpOworICAgIH0KKworICAgIHByaXZhdGUgTWFwcGluZyBnZXRNYXBwaW5nT3JGYWlsKFN0cmluZyBtYXBmaWxlKSB7CisgICAgICAgIE1hcHBpbmcgbWFwcGluZyA9IG51bGw7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gY29uZmlnRmlsZUlzID0gVGVzdE1hcHBpbmdSZWFkZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbShtYXBmaWxlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwcGluZyA9IE1hcHBpbmdSZWFkZXIuZ2V0TWFwcGluZyhjb25maWdGaWxlSXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hcHBpbmc7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3Byb2R1Y3QvVGVzdFhNTFBTUHJvZHVjdEhhbmRsZXIuamF2YSBiLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvcHJvZHVjdC9UZXN0WE1MUFNQcm9kdWN0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjQ1MWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3Byb2R1Y3QvVGVzdFhNTFBTUHJvZHVjdEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5wcm9kdWN0OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5EYXRhYmFzZVRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy51dGlsLlhNTFF1ZXJ5SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgdGhlIFhNTFBTIHByb2R1Y3QgaGFuZGxlci4KKyAqLworcHVibGljIGNsYXNzIFRlc3RYTUxQU1Byb2R1Y3RIYW5kbGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cGVjdGVkU3BlY2ltZW5GbGROYW1lID0gInNwZWNpbWVuLnNwZWNpbWVuX2NvbGxlY3RlZCI7CisKKyAgICBwcml2YXRlIFhNTFBTUHJvZHVjdEhhbmRsZXIgaGFuZGxlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcGVjaW1lbkNvbGxlY3RlZENvZGVGaWVsZCA9ICJTUEVDSU1FTl9DT0xMRUNURURfQ09ERSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3R1ZHlQcm90b2NvbElkRmllbGQgPSAiU1RVRFlfUFJPVE9DT0xfSUQiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1bmNvbnN0cmFpbmVkUXVlcnkgPSAiUkVUVVJOID0gU1RVRFlfUEFSVElDSVBBTlRfSUQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHF1ZXJ5U3RyID0gc3BlY2ltZW5Db2xsZWN0ZWRDb2RlRmllbGQKKyAgICAgICAgICAgICsgIiA9IDMgQU5EICIgKyBzdHVkeVByb3RvY29sSWRGaWVsZCArICIgPSA3MSBBTkQgUkVUVVJOID0gIgorICAgICAgICAgICAgKyBzcGVjaW1lbkNvbGxlY3RlZENvZGVGaWVsZDsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUub29kdC54bWxwcy54bWwubWFwRmlsZVBhdGgiLAorICAgICAgICAgICAgICAgICIuL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LXBzLnhtbCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBoYW5kbGVyID0gbmV3IFhNTFBTUHJvZHVjdEhhbmRsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDYW4ndCBjb25zdHJ1Y3QgdGVzdCBzdWl0ZTogZXhjZXB0aW9uIGJ1aWxkaW5nIHRlc3QgaGFuZGxlciIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd1VuQ29uc3RyYWluZWRRdWVyeSgpeworICAgICAgICBYTUxRdWVyeSBxdWVyeSA9IFhNTFF1ZXJ5SGVscGVyCisgICAgICAgICAgICAgLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyh1bmNvbnN0cmFpbmVkUXVlcnkpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGFzc2VydE5vdE51bGwocXVlcnkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5zaXplKCkgPT0gMCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeS5nZXRTZWxlY3RFbGVtZW50U2V0KCkuc2l6ZSgpID09IDEpOworICAgICAgICAKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgaGFuZGxlci50cmFuc2xhdGVUb0RvbWFpbihxdWVyeS5nZXRTZWxlY3RFbGVtZW50U2V0KCksIHRydWUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnl7CisgICAgICAgICAgICBoYW5kbGVyLnF1ZXJ5QW5kUGFja2FnZVJlc3VsdHMocXVlcnkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb21haW5UcmFuc2xhdGlvbldoZXJlU2V0KCkgeworICAgICAgICBYTUxRdWVyeSBxdWVyeSA9IFhNTFF1ZXJ5SGVscGVyCisgICAgICAgICAgICAgICAgLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyhxdWVyeVN0cik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocXVlcnkuZ2V0V2hlcmVFbGVtZW50U2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgcXVlcnkuZ2V0V2hlcmVFbGVtZW50U2V0KCkuc2l6ZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFuZGxlci50cmFuc2xhdGVUb0RvbWFpbihxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKSwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxRdWVyeUVsZW1lbnQ+IGVsZW1OYW1lcyA9IGhhbmRsZXIKKyAgICAgICAgICAgICAgICAuZ2V0RWxlbU5hbWVzRnJvbVF1ZXJ5RWxlbVNldChxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZWxlbU5hbWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVsZW1OYW1lcy5zaXplKCkpOyAvLyBvbmx5IDEgYi9jIG9uZSBmaWVsZCBpcyBjb25zdGFudAorCisgICAgICAgIGJvb2xlYW4gZ290U3BlY0NvbGxlY3RlZCA9IGZhbHNlOworICAgICAgICBmb3IgKEl0ZXJhdG9yPFF1ZXJ5RWxlbWVudD4gaSA9IGVsZW1OYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFF1ZXJ5RWxlbWVudCBlbGVtID0gaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZWxlbS5nZXRWYWx1ZSgpLmVxdWFscygic3BlY2ltZW4uc3BlY2ltZW5fY29sbGVjdGVkIikpIHsKKyAgICAgICAgICAgICAgICBnb3RTcGVjQ29sbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShnb3RTcGVjQ29sbGVjdGVkKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb21haW5UcmFuc2xhdGlvblNlbGVjdFNldCgpIHsKKworICAgICAgICBYTUxRdWVyeSBxdWVyeSA9IFhNTFF1ZXJ5SGVscGVyCisgICAgICAgICAgICAgICAgLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyhxdWVyeVN0cik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHF1ZXJ5LmdldFNlbGVjdEVsZW1lbnRTZXQoKS5zaXplKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFuZGxlci50cmFuc2xhdGVUb0RvbWFpbihxdWVyeS5nZXRTZWxlY3RFbGVtZW50U2V0KCksIHRydWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeS5nZXRTZWxlY3RFbGVtZW50U2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpLnNpemUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpLmdldCgwKSk7CisgICAgICAgIFF1ZXJ5RWxlbWVudCBlbGVtID0gKFF1ZXJ5RWxlbWVudCkgcXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkOiBbIiArIGV4cGVjdGVkU3BlY2ltZW5GbGROYW1lICsgIl06IGdvdDogWyIKKyAgICAgICAgICAgICAgICArIGVsZW0uZ2V0VmFsdWUoKSArICJdIiwgZWxlbS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkU3BlY2ltZW5GbGROYW1lKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVxdWlyZWRUYWJsZXMoKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5vb2R0LnhtbHBzLnhtbC5tYXBGaWxlUGF0aCIsCisgICAgICAgICAgICAiLi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1yZXF1aXJlZC10YWJsZXMtcHMueG1sIik7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBYTUxQU1Byb2R1Y3RIYW5kbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBxdWVyeVN0ciA9ICJSRVRVUk4gPSBpZCBBTkQgUkVUVVJOID0gaWRfMSBBTkQgUkVUVVJOID0gaWRfMiBBTkQgUkVUVVJOID0gaWRfMyBBTkQgUkVUVVJOID0gaWRfNCI7CisgICAgICAgIFhNTFF1ZXJ5IHF1ZXJ5ID0gWE1MUXVlcnlIZWxwZXIuZ2V0RGVmYXVsdFF1ZXJ5RnJvbVF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyKTsKKyAgICAgICAgCisgICAgICAgIExpc3Q8UXVlcnlFbGVtZW50PiB3aGVyZSA9IHF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpOworICAgICAgICBMaXN0PFF1ZXJ5RWxlbWVudD4gc2VsZWN0ID0gcXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhbmRsZXIudHJhbnNsYXRlVG9Eb21haW4od2hlcmUsIGZhbHNlKTsKKyAgICAgICAgICAgIGhhbmRsZXIudHJhbnNsYXRlVG9Eb21haW4oc2VsZWN0LCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBMaXN0PFF1ZXJ5RWxlbWVudD4gd2hlcmVOYW1lcyA9IGhhbmRsZXIuZ2V0RWxlbU5hbWVzRnJvbVF1ZXJ5RWxlbVNldCh3aGVyZSk7CisgICAgICAgIExpc3Q8UXVlcnlFbGVtZW50PiBzZWxlY3ROYW1lcyA9IGhhbmRsZXIuZ2V0RWxlbU5hbWVzRnJvbVF1ZXJ5RWxlbVNldChzZWxlY3QpOworICAgICAgICAKKyAgICAgICAgU2V0PERhdGFiYXNlVGFibGU+IHRhYmxlcyA9IGhhbmRsZXIuZ2V0UmVxdWlyZWRUYWJsZXMod2hlcmVOYW1lcywgc2VsZWN0TmFtZXMpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIHRhYmxlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHRhYmxlcy5jb250YWlucyhoYW5kbGVyLm1hcHBpbmcuZ2V0VGFibGVCeU5hbWUoImpvaW5Ub0RlZmF1bHQiKSkpOworICAgICAgICBhc3NlcnRUcnVlKHRhYmxlcy5jb250YWlucyhoYW5kbGVyLm1hcHBpbmcuZ2V0VGFibGVCeU5hbWUoImpvaW5Ub0V4dHJhRGVmYXVsdCIpKSk7CisgICAgICAgIGFzc2VydFRydWUodGFibGVzLmNvbnRhaW5zKGhhbmRsZXIubWFwcGluZy5nZXRUYWJsZUJ5TmFtZSgiam9pblRvRXh0cmFKb2luIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YWJsZXMuY29udGFpbnMoaGFuZGxlci5tYXBwaW5nLmdldFRhYmxlQnlOYW1lKCJqb2luVG9FeHRyYU90aGVyIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YWJsZXMuY29udGFpbnMoaGFuZGxlci5tYXBwaW5nLmdldFRhYmxlQnlOYW1lKCJleHRyYURlZmF1bHQiKSkpOworICAgICAgICBhc3NlcnRUcnVlKHRhYmxlcy5jb250YWlucyhoYW5kbGVyLm1hcHBpbmcuZ2V0VGFibGVCeU5hbWUoImV4dHJhT3RoZXIiKSkpOworICAgICAgICBhc3NlcnRUcnVlKHRhYmxlcy5jb250YWlucyhoYW5kbGVyLm1hcHBpbmcuZ2V0VGFibGVCeU5hbWUoIm90aGVyIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghdGFibGVzLmNvbnRhaW5zKGhhbmRsZXIubWFwcGluZy5nZXRUYWJsZUJ5TmFtZSgiYW5vdGhlciIpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9maWxlL1Rlc3RYTUxQU1Byb2ZpbGVIYW5kbGVyLmphdmEgYi8wLjEwL3htbHBzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3Byb2ZpbGUvVGVzdFhNTFBTUHJvZmlsZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MThkODQyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9wcm9maWxlL1Rlc3RYTUxQU1Byb2ZpbGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxwcy5wcm9maWxlOworCisvL0FQQUNIRSBpbXBvcnRzCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnV0aWwuWE1MUXVlcnlIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgdGhlIFhNTFBTIHByb2ZpbGUgaGFuZGxlci4KKyAqLworcHVibGljIGNsYXNzIFRlc3RYTUxQU1Byb2ZpbGVIYW5kbGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIFhNTFBTUHJvZmlsZUhhbmRsZXIgaGFuZGxlcjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdW5jb25zdHJhaW5lZFF1ZXJ5ID0gIlJFVFVSTiA9IFNUVURZX1BBUlRJQ0lQQU5UX0lEIjsKKworICBwdWJsaWMgVGVzdFhNTFBTUHJvZmlsZUhhbmRsZXIoKSB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLm9vZHQueG1scHMucHJvZmlsZS54bWwubWFwRmlsZVBhdGgiLAorICAgICAgICAiLi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1wcy54bWwiKTsKKworICAgIHRyeSB7CisgICAgICBoYW5kbGVyID0gbmV3IFhNTFBTUHJvZmlsZUhhbmRsZXIoKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoIkNhbid0IGNvbnN0cnVjdCB0ZXN0IHN1aXRlOiBleGNlcHRpb24gYnVpbGRpbmcgdGVzdCBoYW5kbGVyIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEFsbG93VW5Db25zdHJhaW5lZFF1ZXJ5KCkgeworICAgIFhNTFF1ZXJ5IHF1ZXJ5ID0gWE1MUXVlcnlIZWxwZXIKKyAgICAgICAgLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyh1bmNvbnN0cmFpbmVkUXVlcnkpOworCisgICAgYXNzZXJ0Tm90TnVsbChxdWVyeSk7CisgICAgYXNzZXJ0Tm90TnVsbChxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKSk7CisgICAgYXNzZXJ0VHJ1ZShxdWVyeS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5zaXplKCkgPT0gMCk7CisgICAgYXNzZXJ0Tm90TnVsbChxdWVyeS5nZXRTZWxlY3RFbGVtZW50U2V0KCkpOworICAgIGFzc2VydFRydWUocXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpLnNpemUoKSA9PSAxKTsKKworICAgIHRyeSB7CisgICAgICBoYW5kbGVyLnRyYW5zbGF0ZVRvRG9tYWluKHF1ZXJ5LmdldFNlbGVjdEVsZW1lbnRTZXQoKSwgdHJ1ZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBoYW5kbGVyLnF1ZXJ5QW5kUGFja2FnZVByb2ZpbGVzKHF1ZXJ5KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9UZXN0SGFuZGxlclF1ZXJ5UGFyc2VyLmphdmEgYi8wLjEwL3htbHBzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHBzL3F1ZXJ5cGFyc2VyL1Rlc3RIYW5kbGVyUXVlcnlQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTkxOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9xdWVyeXBhcnNlci9UZXN0SGFuZGxlclF1ZXJ5UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXI7CisKKy8vQVBBQ0hFIGltcG9ydHMKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMubWFwcGluZy5NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLk1hcHBpbmdGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXIuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQueG1scHMucXVlcnlwYXJzZXIuSGFuZGxlclF1ZXJ5UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxwcy51dGlsLlhNTFF1ZXJ5SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5OworCisvL0pESyBpbXBvcnRzCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvL0p1bml0IGltcG9ydHMKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgdGhlIFhNTFBTIHF1ZXJ5IGhhbmRsZXIgcGFyc2VyLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXJRdWVyeVBhcnNlciBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgVGVzdEhhbmRsZXJRdWVyeVBhcnNlcigpIHsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVF1ZXJ5KCkgeworICAgIFN0cmluZyBxdWVyeVN0ciA9ICJBID0gQiBBTkQgQyA9IEQiOworICAgIFN0cmluZyBleHBlY3RlZCA9ICIoQyA9IEQgQU5EIEEgPSBCKSI7CisKKyAgICBYTUxRdWVyeSBxdWVyeSA9IFhNTFF1ZXJ5SGVscGVyLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyhxdWVyeVN0cik7CisgICAgYXNzZXJ0Tm90TnVsbChxdWVyeSk7CisgICAgU3RhY2s8UXVlcnlFbGVtZW50PiBxdWVyeVN0YWNrID0gSGFuZGxlclF1ZXJ5UGFyc2VyLmNyZWF0ZVF1ZXJ5U3RhY2socXVlcnkKKyAgICAgICAgLmdldFdoZXJlRWxlbWVudFNldCgpKTsKKyAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5U3RhY2spOworICAgIEV4cHJlc3Npb24gcGFyc2VkUXVlcnkgPSBIYW5kbGVyUXVlcnlQYXJzZXIucGFyc2UocXVlcnlTdGFjayk7CisgICAgYXNzZXJ0Tm90TnVsbChwYXJzZWRRdWVyeSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBwYXJzZWRRdWVyeS5ldmFsdWF0ZSgpKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlV2lsZGNhcmRXaXRoTWFwcGluZygpeworICAgIFN0cmluZyBxdWVyeVN0ciA9ICJiYXIgTElLRSAnRk9PJyI7CisgICAgU3RyaW5nIGV4cGVjdGVkID0gImJhciBMSUtFICclRk9PJSciOworICAgIE1hcHBpbmcgbWFwcGluZyA9IG5ldyBNYXBwaW5nKCk7CisgICAgTWFwcGluZ0ZpZWxkIG1mID0gbmV3IE1hcHBpbmdGaWVsZCgpOworICAgIG1mLnNldERiTmFtZSgiYmFyIik7CisgICAgbWYuc2V0TmFtZSgiZm9vIik7CisgICAgbWYuc2V0U3RyaW5nKHRydWUpOworICAgIG1hcHBpbmcuYWRkRmllbGQoImZvbyIsIG1mKTsKKyAgICAKKyAgICBYTUxRdWVyeSBxdWVyeSA9IFhNTFF1ZXJ5SGVscGVyLmdldERlZmF1bHRRdWVyeUZyb21RdWVyeVN0cmluZyhxdWVyeVN0cik7CisgICAgYXNzZXJ0Tm90TnVsbChxdWVyeSk7CisgICAgU3RhY2s8UXVlcnlFbGVtZW50PiBxdWVyeVN0YWNrID0gSGFuZGxlclF1ZXJ5UGFyc2VyLmNyZWF0ZVF1ZXJ5U3RhY2socXVlcnkKKyAgICAgICAgLmdldFdoZXJlRWxlbWVudFNldCgpKTsKKyAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5U3RhY2spOworICAgIEV4cHJlc3Npb24gcGFyc2VkUXVlcnkgPSBIYW5kbGVyUXVlcnlQYXJzZXIucGFyc2UocXVlcnlTdGFjaywgbWFwcGluZyk7CisgICAgYXNzZXJ0Tm90TnVsbChwYXJzZWRRdWVyeSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBwYXJzZWRRdWVyeS5ldmFsdWF0ZSgpKTsgICAgCisgIH0KKyAgCisgIHByaXZhdGUgTWFwcGluZyBjcmVhdGVGb29CYXJNYXBwaW5nKCkgeworICAgIE1hcHBpbmcgbSA9IG5ldyBNYXBwaW5nKCk7CisgICAgTWFwcGluZ0ZpZWxkIGZvb2YgPSBuZXcgTWFwcGluZ0ZpZWxkKCk7CisgICAgZm9vZi5zZXROYW1lKCJmb28iKTsKKyAgICBmb29mLnNldERiTmFtZSgiZm9vIik7CisgICAgZm9vZi5zZXRTdHJpbmcodHJ1ZSk7CisgICAgTWFwcGluZ0ZpZWxkIGJhcmYgPSBuZXcgTWFwcGluZ0ZpZWxkKCk7CisgICAgYmFyZi5zZXROYW1lKCJiYXIiKTsKKyAgICBiYXJmLnNldERiTmFtZSgiYmFyIik7CisgICAgYmFyZi5zZXRTdHJpbmcodHJ1ZSk7CisgICAgbS5hZGRGaWVsZCgiZm9vIiwgZm9vZik7CisgICAgbS5hZGRGaWVsZCgiYmFyIiwgYmFyZik7CisgICAgcmV0dXJuIG07CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VMaXRlcmFsUXVvdGVzV2l0aFBhcmVuKCkgeworICAgIE1hcHBpbmcgbSA9IGNyZWF0ZUZvb0Jhck1hcHBpbmcoKTsKKworICAgIFN0cmluZyBxID0gIihmb28gPSAneWVzJyBPUiBiYXIgPSAnbm8nKSBBTkQgUkVUVVJOID0gZm9vIEFORCBSRVRVUk4gPSBiYXIiOworICAgIFN0cmluZyBleHBlY3RlZCA9ICIoYmFyID0gJ25vJyBPUiBmb28gPSAneWVzJykiOworCisgICAgWE1MUXVlcnkgcXVlcnkgPSBYTUxRdWVyeUhlbHBlci5nZXREZWZhdWx0UXVlcnlGcm9tUXVlcnlTdHJpbmcocSk7CisgICAgYXNzZXJ0Tm90TnVsbChxdWVyeSk7CisgICAgU3RhY2s8UXVlcnlFbGVtZW50PiB3aGVyZSA9IEhhbmRsZXJRdWVyeVBhcnNlci5jcmVhdGVRdWVyeVN0YWNrKHF1ZXJ5LmdldFdoZXJlRWxlbWVudFNldCgpKTsKKyAgICBhc3NlcnROb3ROdWxsKHdoZXJlKTsKKyAgICBMaXN0PFF1ZXJ5RWxlbWVudD4gc2VsZWN0ID0gcXVlcnkuZ2V0U2VsZWN0RWxlbWVudFNldCgpOworICAgIGFzc2VydE5vdE51bGwoc2VsZWN0KTsKKworICAgIEV4cHJlc3Npb24gcGFyc2VkID0gSGFuZGxlclF1ZXJ5UGFyc2VyLnBhcnNlKHdoZXJlLCBtKTsKKyAgICBhc3NlcnROb3ROdWxsKHBhcnNlZCk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBwYXJzZWQuZXZhbHVhdGUoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9zdHJ1Y3RzL1Rlc3RDREVSZXN1bHQuamF2YSBiLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9UZXN0Q0RFUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmMjNiMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9UZXN0Q0RFUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scHMuc3RydWN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKK2ltcG9ydCBvcmcuZWFzeW1vY2suSU1vY2tzQ29udHJvbDsKKworcHVibGljIGNsYXNzIFRlc3RDREVSZXN1bHQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIjEyMyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUID0gImRvZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVCA9ICJqb2huIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQiA9ICIxOTgwLTAxLTAxIDAwOjAwOjAwLjAiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRDEgPSAiMzIxIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1QxID0gInNtaXRoIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUMSA9ICJqYW5lIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQjEgPSAiMTk5MC0wMS0wMSAwMDowMDowMC4wIjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlMgPSAiXHQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlMgPSAiJCI7CisKKyAgcHJpdmF0ZSBSZXN1bHRTZXQgcnM7CisgIHByaXZhdGUgQ29ubmVjdGlvbiBjb247CisgIHByaXZhdGUgUmVzdWx0U2V0TWV0YURhdGEgcnNtZXQ7CisgIHByaXZhdGUgQ0RFUmVzdWx0IHJlc3VsdDsKKyAgcHJpdmF0ZSBJTW9ja3NDb250cm9sIGN0cmw7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgY3RybCA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VDb250cm9sKCk7CisgICAgcnMgPSBjdHJsLmNyZWF0ZU1vY2soUmVzdWx0U2V0LmNsYXNzKTsKKyAgICBjb24gPSBjdHJsLmNyZWF0ZU1vY2soQ29ubmVjdGlvbi5jbGFzcyk7CisgICAgcnNtZXQgPSBjdHJsLmNyZWF0ZU1vY2soUmVzdWx0U2V0TWV0YURhdGEuY2xhc3MpOworICAgIGV4cGVjdChycy5uZXh0KCkpLmFuZFJldHVybih0cnVlKTsKKyAgICBleHBlY3QocnNtZXQuZ2V0Q29sdW1uQ291bnQoKSkuYW5kUmV0dXJuKDQpLmFueVRpbWVzKCk7CisgICAgZXhwZWN0KHJzLmdldE1ldGFEYXRhKCkpLmFuZFJldHVybihyc21ldCkuYW55VGltZXMoKTsKKyAgICBleHBlY3QocnMuZ2V0U3RyaW5nKDEpKS5hbmRSZXR1cm4oSUQpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoMikpLmFuZFJldHVybihMQVNUKTsKKyAgICBleHBlY3QocnMuZ2V0U3RyaW5nKDMpKS5hbmRSZXR1cm4oRklSU1QpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoNCkpLmFuZFJldHVybihET0IpOworICAgIGV4cGVjdChycy5uZXh0KCkpLmFuZFJldHVybih0cnVlKTsKKyAgICBleHBlY3QocnMuZ2V0U3RyaW5nKDEpKS5hbmRSZXR1cm4oSUQxKTsKKyAgICBleHBlY3QocnMuZ2V0U3RyaW5nKDIpKS5hbmRSZXR1cm4oTEFTVDEpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoMykpLmFuZFJldHVybihGSVJTVDEpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoNCkpLmFuZFJldHVybihET0IxKTsKKyAgICBleHBlY3QocnMubmV4dCgpKS5hbmRSZXR1cm4oZmFsc2UpOworICAgIGN0cmwucmVwbGF5KCk7CisgICAgcmVzdWx0ID0gbmV3IENERVJlc3VsdChycyxjb24pOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdldElucHV0U3RyZWFtKCkgeworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgaW4gPSByZXN1bHQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKCJDb3VsZCBub3QgZ2V0IGlucHV0c3RyZWFtOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICBhc3NlcnROb3ROdWxsKGluKTsKKyAgICBhc3NlcnRFcXVhbHMoQ0RFUmVzdWx0SW5wdXRTdHJlYW0uY2xhc3MsIGluLmdldENsYXNzKCkpOworCisgICAgYm9vbGVhbiB0aHJvd24gPSBmYWxzZTsKKyAgICB0cnkgeworICAgICAgaW4gPSBuZXcgQ0RFUmVzdWx0KG51bGwsIGNvbikuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvd24gPSB0cnVlOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJJbnB1dFN0cmVhbSBzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24gd2l0aCBudWxsIFJlc3VsdFNldCEiLCB0aHJvd24pOworCisgICAgdGhyb3duID0gZmFsc2U7CisgICAgdHJ5IHsKKyAgICAgIGluID0gbmV3IENERVJlc3VsdChycywgbnVsbCkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvd24gPSB0cnVlOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJJbnB1dFN0cmVhbSBzaG91bGQgdGhyb3cgSU9FeGNlcHRpb24gd2l0aCBudWxsIENvbm5lY3Rpb24hIiwgdGhyb3duKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXROZXh0Um93QXNTdHJpbmcoKSB7CisgICAgdHJ5IHsKKyAgICAgIGFzc2VydEVxdWFscyhJRCArIEZTICsgTEFTVCArIEZTICsgRklSU1QgKyBGUyArIERPQiArIFJTLCByZXN1bHQuZ2V0TmV4dFJvd0FzU3RyaW5nKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKElEMSArIEZTICsgTEFTVDEgKyBGUyArIEZJUlNUMSArIEZTICsgRE9CMSArIFJTLCByZXN1bHQuZ2V0TmV4dFJvd0FzU3RyaW5nKCkpOworICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKCJDb3VsZCBub3QgZ2V0IG5leHQgcm93OiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRNaW1lVHlwZSgpIHsKKyAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCByZXN1bHQuZ2V0TWltZVR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIHJlc3VsdC5nZXRTaXplKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9UZXN0Q0RFUmVzdWx0SW5wdXRTdHJlYW0uamF2YSBiLzAuMTAveG1scHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scHMvc3RydWN0cy9UZXN0Q0RFUmVzdWx0SW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYwNDBlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxwcy9zdHJ1Y3RzL1Rlc3RDREVSZXN1bHRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnN0cnVjdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7CitpbXBvcnQgb3JnLmVhc3ltb2NrLklNb2Nrc0NvbnRyb2w7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q0RFUmVzdWx0SW5wdXRTdHJlYW0gZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiMTIzIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1QgPSAiZG9lIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUID0gImpvaG4iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9CID0gIjE5ODAtMDEtMDEgMDA6MDA6MDAuMCI7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQxID0gIjMyMSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUMSA9ICJzbWl0aCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVDEgPSAiamFuZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0IxID0gIjE5OTAtMDEtMDEgMDA6MDA6MDAuMCI7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlMgPSAiXHQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlMgPSAiJCI7CisKKyAgcHJpdmF0ZSBSZXN1bHRTZXQgcnM7CisgIHByaXZhdGUgQ29ubmVjdGlvbiBjb247CisgIHByaXZhdGUgUmVzdWx0U2V0TWV0YURhdGEgcnNtZXQ7CisgIHByaXZhdGUgQ0RFUmVzdWx0IHJlc3VsdDsKKyAgcHJpdmF0ZSBDREVSZXN1bHRJbnB1dFN0cmVhbSBpbjsKKyAgcHJpdmF0ZSBJTW9ja3NDb250cm9sIGN0cmw7CisgIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBjdHJsID0gRWFzeU1vY2suY3JlYXRlTmljZUNvbnRyb2woKTsKKyAgICBycyA9IGN0cmwuY3JlYXRlTW9jayhSZXN1bHRTZXQuY2xhc3MpOworICAgIGNvbiA9IGN0cmwuY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKKyAgICByc21ldCA9IGN0cmwuY3JlYXRlTW9jayhSZXN1bHRTZXRNZXRhRGF0YS5jbGFzcyk7CisgICAgZXhwZWN0KHJzLm5leHQoKSkuYW5kUmV0dXJuKHRydWUpOworICAgIGV4cGVjdChyc21ldC5nZXRDb2x1bW5Db3VudCgpKS5hbmRSZXR1cm4oNCkuYW55VGltZXMoKTsKKyAgICBleHBlY3QocnMuZ2V0TWV0YURhdGEoKSkuYW5kUmV0dXJuKHJzbWV0KS5hbnlUaW1lcygpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoMSkpLmFuZFJldHVybihJRCk7CisgICAgZXhwZWN0KHJzLmdldFN0cmluZygyKSkuYW5kUmV0dXJuKExBU1QpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoMykpLmFuZFJldHVybihGSVJTVCk7CisgICAgZXhwZWN0KHJzLmdldFN0cmluZyg0KSkuYW5kUmV0dXJuKERPQik7CisgICAgZXhwZWN0KHJzLm5leHQoKSkuYW5kUmV0dXJuKHRydWUpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoMSkpLmFuZFJldHVybihJRDEpOworICAgIGV4cGVjdChycy5nZXRTdHJpbmcoMikpLmFuZFJldHVybihMQVNUMSk7CisgICAgZXhwZWN0KHJzLmdldFN0cmluZygzKSkuYW5kUmV0dXJuKEZJUlNUMSk7CisgICAgZXhwZWN0KHJzLmdldFN0cmluZyg0KSkuYW5kUmV0dXJuKERPQjEpOworICAgIGV4cGVjdChycy5uZXh0KCkpLmFuZFJldHVybihmYWxzZSk7CisgICAgY3RybC5yZXBsYXkoKTsKKyAgICByZXN1bHQgPSBuZXcgQ0RFUmVzdWx0KHJzLGNvbik7CisgICAgaW4gPSBuZXcgQ0RFUmVzdWx0SW5wdXRTdHJlYW0ocmVzdWx0KTsKKyAgfQorICAKKyBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpbi5jbG9zZSgpOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpIHsKKyAgICBTdHJpbmcgZXhwZWN0ZWQgPSBJRCArIEZTICsgTEFTVCArIEZTICsgRklSU1QgKyBGUyArIERPQiArIFJTOworICAgIFN0cmluZyBleHBlY3RlZDEgPSBJRDEgKyBGUyArIExBU1QxICsgRlMgKyBGSVJTVDEgKyBGUyArIERPQjEgKyBSUzsKKyAgICB0cnkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGFzc2VydEVxdWFscygoaW50KWV4cGVjdGVkLmNoYXJBdChpKSwgaW4ucmVhZCgpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQxLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChpbnQpZXhwZWN0ZWQxLmNoYXJBdChpKSwgaW4ucmVhZCgpKTsKKyAgICAgIH0KKyAgICAgIGFzc2VydEVxdWFscygtMSwgaW4ucmVhZCgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKCJJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ2hhckFycmF5SW50SW50KCkgeworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMjhdOworICAgIGludCBuID0gMDsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBTdHJpbmcgZXhwZWN0ZWQgPSBudWxsOworICAgIAorICAgIHRyeSB7CisgICAgICBleHBlY3RlZCA9IElEICsgRlMgKyBMQVNUOworICAgICAgbGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoKCk7CisgICAgICBuID0gaW4ucmVhZChidWYsIDAsIGxlbmd0aCk7CisgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLCBuKTsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhidWYsIDAsIG4pKTsKKworICAgICAgZXhwZWN0ZWQgPSBGUyArIEZJUlNUOworICAgICAgbGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoKCk7CisgICAgICBuID0gaW4ucmVhZChidWYsIDAsIGxlbmd0aCk7CisgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLCBuKTsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhidWYsIDAsIG4pKTsKKworICAgICAgZXhwZWN0ZWQgPSBGUyArIERPQi5zdWJzdHJpbmcoMCwgbGVuZ3RoLTEpOworICAgICAgbGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoKCk7CisgICAgICBuID0gaW4ucmVhZChidWYsIDAsIGxlbmd0aCk7CisgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLCBuKTsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhidWYsIDAsIG4pKTsKKyAgICAgIAorICAgICAgZXhwZWN0ZWQgPSBET0Iuc3Vic3RyaW5nKDQpICsgUlMgKyBJRDEgKyBGUyArIExBU1QxICsgRlMgKyBGSVJTVDEgKyBGUyArIERPQjEgKyBSUzsKKyAgICAgIGxlbmd0aCA9IGJ1Zi5sZW5ndGg7CisgICAgICBuID0gaW4ucmVhZChidWYsIDAsIGxlbmd0aCk7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoKCksIG4pOworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKGJ1ZiwgMCwgbikpOworICAgICAgCisgICAgICBuID0gaW4ucmVhZChidWYsIDAsIDEwKTsKKyAgICAgIGFzc2VydEVxdWFscygtMSwgbik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZmFpbCgiSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2luZy5wcm9wZXJ0aWVzIGIvMC4xMC94bWxwcy9zcmMvdGVzdC9yZXNvdXJjZXMvbG9naW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1ZTRhNQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scHMvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjIFNwZWNpZnkgdGhlIGhhbmRsZXJzIHRvIGNyZWF0ZSBpbiB0aGUgcm9vdCBsb2dnZXIKKyMgKGFsbCBsb2dnZXJzIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBsb2dnZXIpCisjIFRoZSBmb2xsb3dpbmcgY3JlYXRlcyBvbmUgaGFuZGxlcnMKK2hhbmRsZXJzID0gamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIKKworIyBTZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIHJvb3QgbG9nZ2VyCisubGV2ZWwgPSBBTEwKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gQUxMCisgICAgICAgIAorIyBTZXQgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciBuZXcgQ29uc29sZUhhbmRsZXIgaW5zdGFuY2VzCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXIgPSBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKKyAgICAKKyMgU2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwKKyMgZGlzYWJsZSBvdXRwdXQgb2YgSU5GTyBtZXNzYWdlcyBmcm9tIHByb2R1Y3QgaGFuZGxlcgorb3JnLmFwYWNoZS5vb2R0LnhtbHBzLnByb2R1Y3QubGV2ZWwgPSBTRVZFUkUKK29yZy5hcGFjaGUub29kdC54bWxwcy5wcm9maWxlLmxldmVsID0gU0VWRVJFCmRpZmYgLS1naXQgYS8wLjEwL3htbHBzL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LXBzLnhtbCBiLzAuMTAveG1scHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtcHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzNmYzMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LXBzLnhtbApAQCAtMCwwICsxLDEyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxvb2R0OnBzIHhtbG5zOm9vZHQ9Imh0dHA6Ly9vb2R0LmpwbC5uYXNhLmdvdi94bWxwcy8xLjAiIG5hbWU9IlRlc3QgUXVlcnkgSGFuZGxlciIgaWQ9InVybjpvb2R0OnhtbHBzOnRlc3RwcyI+Cis8dGFibGVzIGRlZmF1bHQ9ImJhc2VsaW5lIj4KKyAgPHRhYmxlIG5hbWU9InNwZWNpbWVuIiBqb2luPSJwYXRpZW50X2lkIiB0b2ZsZD0icGFydGljaXBhbnRfbnVtIi8+Cis8L3RhYmxlcz4KKworCTwhLS0gCisJCWZpZWxkOgorCQkKKwkJdHlwZSAocmVxdWlyZWQpOiAgIGR5YW5taWMgb3IgY29uc3RhbnQuIElmIHlvdSBjaG9vc2UgZHluYW1pYywgdGhlbiB0aGUgZmllbGQKKwkJdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSByb3cgaW4gdGhlIFJlc3VsdFNldCByZXR1cm5lZAorCQlmcm9tIHRoZSBkYXRhYmFzZS4gSWYgY29uc3RhbnQsIHRoZW4gZWFjaCByZXR1cm5lZCByb3cKKwkJZnJvbSB0aGUgUmVzdWx0U2V0IGlzIGFubm90YXRlZCB3aXRoIHRoZSB2YWx1ZSBzcGVjaWZpZWQKKwkJaW4gdGhlICd2YWx1ZScgYXR0cmlidXRlLgorCQkKKwkJZGJuYW1lIChvcHRpb25hbCk6IHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aXRoaW4gdGhlIHVuZGVybHlpbmcgZGIuIElmIG5vdAorCQlzcGVjaWZpZWQsIHRoZW4gYXNzdW1lZCB0byBiZSBuYW1lCisJCQorCQluYW1lIChyZXF1aXJlZCk6ICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHlvdSB3YW50IHJldHVybmVkCisJCWluIHRoZSBwcm9kdWN0IHNlcnZlci4KKwkJCisJCXRhYmxlIChvcHRpb25hbCk6ICBpZiBwcm92aWRlZCwgdGhlbiB0aGUgYXR0cmlidXRlIGEgaXMgc2VsZWN0ZWQgYXMKKwkJJ3RhYmxlJy4nYScsYW5kIHRoZW4gcmV0dXJuZWQuIElmIG9taXR0ZWQsIHRoZSBhdHRyaWJ1dGUKKwkJaXMgYXNzdW1lZCB0byBjb21lIGZyb20gdGhlIGRlZmF1bHQgdGFibGUgcmV0dXJuZWQgZnJvbSB0aGUKKwkJUFMgcXVlcnkuCisJCQorCQl2YWx1ZSAob3B0aW9uYWwpOiAgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgaWYgdHlwZT0nY29uc3RhbnQnIGlzIHNlbGVjdGVkLgorCQkKKwkJc2NvcGUgKG9wdGlvbmFsKTogIGxpbWl0cyB0aGUgc2NvcGUgb2YgYSBmaWVsZCdzIGV4aXN0YW5jZTogYWNjZXB0YWJsZSB2YWx1ZXMKKwkJYXJlICZxdW90O3F1ZXJ5JnF1b3Q7LCB3aGljaCBzaWduaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4KKwkJdHJhbnNsYXRpbmcgcXVlcmllczogYW5kICZxdW90O3JldHVybiZxdW90Oywgd2hpY2ggc2lnbmlmaWVzIHRoZSBmaWVsZCBpcyBvbmx5CisJCWFwcGxpY2FibGUgYXMgYSByZXR1cm4gZmllbGQgd2hlbiBjb252ZXJ0aW5nIGRhdGFiYXNlIHJlc3VsdHMgaW50byBFUk5FUmVzdWx0cy4KKwkJCisJLS0+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIGRibmFtZT0ic3BlY2ltZW5fY29sbGVjdGVkIiB0YWJsZT0ic3BlY2ltZW4iCisJCW5hbWU9IlNQRUNJTUVOX0NPTExFQ1RFRF9DT0RFIiBhcHBlbmRUYWJsZU5hbWU9InRydWUiLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiIG5hbWU9IlNUVURZX1NJVEVfSUQiIHZhbHVlPSI3MSIgLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiIG5hbWU9IlNUVURZX1BST1RPQ09MX0lEIiB2YWx1ZT0iWFgiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIGRibmFtZT0iIiBuYW1lPSJTVFVEWV9QQVJUSUNJUEFOVF9JRCIgLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiIG5hbWU9IlNQRUNJTUVOX1NUVURZLURFU0lHTl9DT0RFIgorCQl2YWx1ZT0icHJvc3BlY3RpdmUiIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJTUEVDSU1FTl9DT05UQUNUX05BTUUtVEVYVCIKKwkJdmFsdWU9IkJyZW5kYW4gUGhhbGFuIiAvPgorCTxmaWVsZCB0eXBlPSJjb25zdGFudCIgbmFtZT0iU1BFQ0lNRU5fQ09OVEFDVC1FTUFJTF9URVhUIgorCQl2YWx1ZT0iQnJlbmRhbi5QaGFsYW5AbWVkLm55dS5lZHUiIHNjb3BlPSJyZXR1cm4iLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiIG5hbWU9IkJBU0VMSU5FX0RFTU9HUkFQSElDUy1HRU5ERVJfQ09ERSIKKwkJdmFsdWU9IjEiIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJCQVNFTElORV9ERU1PR1JBUEhJQ1MtRVRITklDX0NPREUiCisJCXZhbHVlPSIxIiAvPgorCTxmaWVsZCB0eXBlPSJjb25zdGFudCIgbmFtZT0iQkFTRUxJTkVfREVNT0dSQVBISUNTX1JBQ0VfQ09ERSIKKwkJdmFsdWU9IjEiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IkJBU0VMSU5FX0RFTU9HUkFQSElDUy1SQUNFX09USEVSX1RFWFQiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IkJBU0VMSU5FX0RFTU9HUkFQSElDUy1CSVJUSC1ZRUFSX1RFWFQiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IkJBU0VMSU5FX1NNT0tFLVJFR1VMQVJfMVlFQVJfQ09ERSIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIKKwkJbmFtZT0iQkFTRUxJTkVfU01PS0UtSFhfQkVHSU4tQUdFLVJFR1VMQVJfVkFMVUUiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IkJBU0VMSU5FX1NNT0tFLUhYX0FWRVJBR0UtREFZX1ZBTFVFIiAvPgorCTxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJCQVNFTElORV9TTU9LRS1IWF9RVUlULUFHRV9WQUxVRSIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iQkFTRUxJTkVfQ0FOQ0VSLUNPTkZJUk1BVElPTl9DT0RFIiAvPgorCTxmaWVsZCB0eXBlPSJjb25zdGFudCIgbmFtZT0iQkFTRUxJTkVfQ0FOQ0VSLUlDRDktQ09ERSIKKwkJdmFsdWU9IlVOS05PV04iIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJCQVNFTElORV9DQU5DRVItRElBR05PU0lTX1lFQVJfVEVYVCIKKwkJdmFsdWU9IlVOS05PV04iIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJCQVNFTElORV9DQU5DRVItQUdFLURJQUdOT1NJU19WQUxVRSIKKwkJdmFsdWU9IlVOS05PV04iIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiCisJCW5hbWU9IkJBU0VMSU5FX0ZBTUlMWV9DQU5DRVItQ09ORklSTUFUSU9OX0NPREUiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IkJBU0VMSU5FX0ZBTUlMWV9DQU5DRVItTE9DQVRJT05fQ09ERSIgLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiCisJCW5hbWU9IkJBU0VMSU5FX0ZBTUlMWV9DQU5DRVItTE9DQVRJT04tT1RIRVJfVEVYVCIgdmFsdWU9IlVOS05PV04iIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IlNQRUNJTUVOX0NPTExFQ1RJT05fVEVYVCIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iU1BFQ0lNRU5fU1RPUkVEX0NPREUiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IlNQRUNJTUVOX0ZJTkFMLVNUT1JFX0NPREUiIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJTUEVDSU1FTl9GSU5BTC1TVE9SRS1PVEhFUl9URVhUIgorCQl2YWx1ZT0iVU5LTk9XTiIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iU1BFQ0lNRU5fREFZLUNPTExFQ1RFRF9WQUxVRSIgLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiIG5hbWU9IlNQRUNJTUVOX0RBWS1DQS1ESUFHTk9TSVNfVkFMVUUiCisJCXZhbHVlPSJVTktOT1dOIiAvPgorCTxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJTUEVDSU1FTl9BR0UtQ09MTEVDVEVEX1ZBTFVFIiAvPgorCTxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJTUEVDSU1FTl9BTU9VTlQtU1RPUkVEX1ZBTFVFIiAvPgorCTxmaWVsZCB0eXBlPSJjb25zdGFudCIgbmFtZT0iU1BFQ0lNRU5fQU1PVU5ULVNUT1JFRC1VTklUX0NPREUiCisJCXZhbHVlPSIxIiAvPgorCTxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJTUEVDSU1FTl9BTU9VTlRfUkVNQUlOSU5HX1ZBTFVFIiAvPgorCTxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJTUEVDSU1FTl9BTU9VTlRfUkVNQUlOSU5HX1VOSVRfQ09ERSIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iU1BFQ0lNRU5fQ09OQ0VOVFJBVElPTl9WQUxVRSIgLz4KKwk8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iU1BFQ0lNRU5fQVZBSUxBQkxFX0NPREUiIC8+CisJPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9IlNQRUNJTUVOX1RJU1NVRV9PUkdBTi1TSVRFX0NPREUiPgorCQk8dHJhbnNsYXRlPgorCQkJPGZ1bmMgY2xhc3M9Im9yZy5hcGFjaGUub29kdC54bWxwcy5tYXBwaW5nLmZ1bmNzLlJlcGxhY2VGdW5jIiBvcmlnPSIxNiIgd2l0aD0iMSIgLz4KKwkJPC90cmFuc2xhdGU+CisJPC9maWVsZD4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiIG5hbWU9IlNQRUNJTUVOX1RJU1NVRS1PUkdBTi1TSVRFLU9USEVSX1RFWFQiCisJCXZhbHVlPSJVTktOT1dOIiAvPgorCTxmaWVsZCB0eXBlPSJjb25zdGFudCIgbmFtZT0iU1BFQ0lNRU5fVElTU1VFX0RFR1JFRS1JTlZBU0lWRV9DT0RFIgorCQl2YWx1ZT0iVU5LTk9XTiIgLz4KKwk8ZmllbGQgdHlwZT0iY29uc3RhbnQiCisJCW5hbWU9IlNQRUNJTUVOX1RJU1NVRV9ERUdSRUUtSU5WQVNJVkUtVFVNT1JfQ09ERSIgdmFsdWU9IlVOS05PV04iIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJTUEVDSU1FTl9CT05FLU1BUlJPV19CTEFTVF9WQUxVRSIKKwkJdmFsdWU9IlVOS05PV04iIC8+CisJPGZpZWxkIHR5cGU9ImNvbnN0YW50IiBuYW1lPSJTUEVDSU1FTl9TUFVUVU1fUFJFU0VSVkFUSVZFX0NPREUiCisJCXZhbHVlPSJVTktOT1dOIiAvPgorCTxmaWVsZCB0eXBlPSJjb25zdGFudCIKKwkJbmFtZT0iU1BFQ0lNRU5fU1BVVFVNLVBSRVNFUlZBVElWRS1PVEhFUl9URVhUIiB2YWx1ZT0iVU5LT1dOIiAvPgorPC9vb2R0OnBzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtcmVxdWlyZWQtdGFibGVzLXBzLnhtbCBiLzAuMTAveG1scHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QtcmVxdWlyZWQtdGFibGVzLXBzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Q3MDZiCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxwcy9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1yZXF1aXJlZC10YWJsZXMtcHMueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEV4YW1wbGUgWE1MIG1hcHBpbmcgY29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG9vZHQ6eG1scHMgeG1sbnM6b29kdD0iaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL29vZHQvMC4xLWluY3ViYXRpbmciCisgIG5hbWU9IkV4YW1wbGUgUXVlcnkgSGFuZGxlciIgaWQ9InByb2plY3Q6c3VicHJvamVjdDpleGFtcGxlcHMiPgorICA8dGFibGVzIGRlZmF1bHQ9ImRlZmF1bHRUYWJsZSI+CisgICAgPHRhYmxlIG5hbWU9ImpvaW5Ub0RlZmF1bHQiIGpvaW49ImlkIiB0b2ZsZD0iaWQiIC8+CisgICAgPHRhYmxlIG5hbWU9ImpvaW5Ub0V4dHJhRGVmYXVsdCIgam9pbj0iaWQiIHRvPSJleHRyYURlZmF1bHQiIHRvZmxkPSJpZCIgLz4KKyAgICA8dGFibGUgbmFtZT0iam9pblRvRXh0cmFKb2luIiBqb2luPSJpZCIgdG89ImpvaW5Ub0V4dHJhRGVmYXVsdCIgdG9mbGQ9ImlkIi8+CisgICAgPHRhYmxlIG5hbWU9ImpvaW5Ub0V4dHJhT3RoZXIiIGpvaW49ImlkIiB0bz0iZXh0cmFPdGhlciIgdG9mbGQ9ImlkIi8+CisgICAgPHRhYmxlIG5hbWU9ImV4dHJhRGVmYXVsdCIgam9pbj0iaWQiIHRvZmxkPSJpZCIvPgorICAgIDx0YWJsZSBuYW1lPSJleHRyYU90aGVyIiBqb2luPSJpZCIgdG89Im90aGVyIiB0b2ZsZD0iaWQiLz4KKyAgICA8dGFibGUgbmFtZT0ib3RoZXIiIGpvaW49ImlkIiB0b2ZsZD0iaWQiIC8+CisgICAgPHRhYmxlIG5hbWU9ImFub3RoZXIiIGpvaW49ImlkIiB0b2ZsZD0iaWQiIC8+CisgIDwvdGFibGVzPgorICA8IS0tIAorICAgIGZpZWxkOgorICAgIAorICAgIHR5cGUgKHJlcXVpcmVkKTogICBkeW5hbWljIG9yIGNvbnN0YW50LiBJZiB5b3UgY2hvb3NlIGR5bmFtaWMsIHRoZW4gdGhlIGZpZWxkCisgICAgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSByb3cgaW4gdGhlIFJlc3VsdFNldCByZXR1cm5lZAorICAgIGZyb20gdGhlIGRhdGFiYXNlLiBJZiBjb25zdGFudCwgdGhlbiBlYWNoIHJldHVybmVkIHJvdworICAgIGZyb20gdGhlIFJlc3VsdFNldCBpcyBhbm5vdGF0ZWQgd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAgaW4gdGhlICd2YWx1ZScgYXR0cmlidXRlLgorICAgIAorICAgIG5hbWUgKHJlcXVpcmVkKTogICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgeW91IHdhbnQgcmV0dXJuZWQKKyAgICBpbiB0aGUgcHJvZHVjdCBzZXJ2ZXIuCisgICAgCisgICAgc3RyaW5nIChvcHRpb25hbCk6IHdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcm5hbCBkYiByZXByZXNlbnRhdGlvbiBhdCB0aGUgbG9jYWwKKyAgICBzaXRlIGZvciB0aGlzIGZpZWxkIGlzIGEgU1RSSU5HLCBvciBzb21ldGhpbmcgZWxzZSAoZS5nLiwgYSBudW1iZXIsIGV0Yy4pLiBQb3NzaWJsZSAKKyAgICB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlIGFyZSAidHJ1ZSIsIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpZWxkIGlzIGEgc3RyaW5nLCBvcgorICAgICJmYWxzZSIsIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgc29tZXRoaW5nIGVsc2UuIElmIHRoaXMgYXR0cmlidXRlIGlzIG9taXR0ZWQsIGEgdmFsdWUKKyAgICBvZiAiZmFsc2UiIGlzIGFzc3VtZWQsIGFuZCB0aGUgYXR0cmlidXRlIHdpbGwgbm90IGJlIHF1b3RlZCBpbiB0aGUgd2hlcmUgY2xhdXNlIG9mCisgICAgdGhlIHVuZGVybHlpbmcgU1FMIHN0YXRlbWVudCBnZW5lcmF0ZWQuCisgICAgCisgICAgZGJuYW1lIChvcHRpb25hbCk6IHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aXRoaW4gdGhlIHVuZGVybHlpbmcgZGIuIElmIG5vdAorICAgIHNwZWNpZmllZCwgdGhlbiBhc3N1bWVkIHRvIGJlIG5hbWUKKyAgICAKKyAgICB0YWJsZSAob3B0aW9uYWwpOiAgaWYgcHJvdmlkZWQsIHRoZW4gdGhlIGF0dHJpYnV0ZSBhIGlzIHNlbGVjdGVkIGFzCisgICAgJ3RhYmxlJy4nYScsYW5kIHRoZW4gcmV0dXJuZWQuIElmIG9taXR0ZWQsIHRoZSBhdHRyaWJ1dGUKKyAgICBpcyBhc3N1bWVkIHRvIGNvbWUgZnJvbSB0aGUgZGVmYXVsdCB0YWJsZSByZXR1cm5lZCBmcm9tIHRoZQorICAgIFBTIHF1ZXJ5LgorICAgIAorICAgIHZhbHVlIChvcHRpb25hbCk6ICBpcyBuZWNlc3NhcnkgdG8gcHJvdmlkZSBpZiB0eXBlPSdjb25zdGFudCcgaXMgc2VsZWN0ZWQuCisgICAgCisgICAgc2NvcGUgKG9wdGlvbmFsKTogIGxpbWl0cyB0aGUgc2NvcGUgb2YgYSBmaWVsZCdzIGV4aXN0ZW5jZTogYWNjZXB0YWJsZSB2YWx1ZXMKKyAgICBhcmUgJnF1b3Q7cXVlcnkmcXVvdDssIHdoaWNoIHNpZ25pZmllcyB0aGF0IHRoZSBmaWVsZCBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbgorICAgIHRyYW5zbGF0aW5nIHF1ZXJpZXM6IGFuZCAmcXVvdDtyZXR1cm4mcXVvdDssIHdoaWNoIHNpZ25pZmllcyB0aGUgZmllbGQgaXMgb25seQorICAgIGFwcGxpY2FibGUgYXMgYSByZXR1cm4gZmllbGQgd2hlbiBjb252ZXJ0aW5nIGRhdGFiYXNlIHJlc3VsdHMgaW50byBDREVSZXN1bHRzLgorICAgIAorICAtLT4KKyAgPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9ImlkIiBkYm5hbWU9ImlkIiB0YWJsZT0iZGVmYXVsdFRhYmxlIi8+CisgIDxmaWVsZCB0eXBlPSJkeW5hbWljIiBuYW1lPSJpZF8xIiBkYm5hbWU9ImlkIiB0YWJsZT0iam9pblRvRGVmYXVsdCIvPgorICA8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iaWRfMiIgZGJuYW1lPSJpZCIgdGFibGU9ImpvaW5Ub0V4dHJhRGVmYXVsdCIvPgorICA8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iaWRfMyIgZGJuYW1lPSJpZCIgdGFibGU9ImpvaW5Ub0V4dHJhSm9pbiIvPgorICA8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iaWRfNCIgZGJuYW1lPSJpZCIgdGFibGU9ImpvaW5Ub0V4dHJhT3RoZXIiLz4KKzwvb29kdDp4bWxwcz4KZGlmZiAtLWdpdCBhLzAuMTAveG1scHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Qtc2FtZS1jb2wtbmFtZS1wcy54bWwgYi8wLjEwL3htbHBzL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LXNhbWUtY29sLW5hbWUtcHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDJkY2IKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHBzL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LXNhbWUtY29sLW5hbWUtcHMueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIEV4YW1wbGUgWE1MIG1hcHBpbmcgY29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG9vZHQ6eG1scHMgeG1sbnM6b29kdD0iaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL29vZHQvMC4xLWluY3ViYXRpbmciCisgIG5hbWU9IkV4YW1wbGUgUXVlcnkgSGFuZGxlciIgaWQ9InByb2plY3Q6c3VicHJvamVjdDpleGFtcGxlcHMiPgorICA8dGFibGVzIGRlZmF1bHQ9ImRlZmF1bHRUYWJsZSI+CisgICAgPHRhYmxlIG5hbWU9ImpvaW5UYWJsZSIgam9pbj0iaWQiIHRvZmxkPSJpZCIgLz4KKyAgPC90YWJsZXM+CisgIDwhLS0gCisgICAgZmllbGQ6CisgICAgCisgICAgdHlwZSAocmVxdWlyZWQpOiAgIGR5bmFtaWMgb3IgY29uc3RhbnQuIElmIHlvdSBjaG9vc2UgZHluYW1pYywgdGhlbiB0aGUgZmllbGQKKyAgICB2YWx1ZSBpcyByZWFkIGZyb20gdGhlIHJvdyBpbiB0aGUgUmVzdWx0U2V0IHJldHVybmVkCisgICAgZnJvbSB0aGUgZGF0YWJhc2UuIElmIGNvbnN0YW50LCB0aGVuIGVhY2ggcmV0dXJuZWQgcm93CisgICAgZnJvbSB0aGUgUmVzdWx0U2V0IGlzIGFubm90YXRlZCB3aXRoIHRoZSB2YWx1ZSBzcGVjaWZpZWQKKyAgICBpbiB0aGUgJ3ZhbHVlJyBhdHRyaWJ1dGUuCisgICAgCisgICAgbmFtZSAocmVxdWlyZWQpOiAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB5b3Ugd2FudCByZXR1cm5lZAorICAgIGluIHRoZSBwcm9kdWN0IHNlcnZlci4KKyAgICAKKyAgICBzdHJpbmcgKG9wdGlvbmFsKTogd2hldGhlciBvciBub3QgdGhlIGludGVybmFsIGRiIHJlcHJlc2VudGF0aW9uIGF0IHRoZSBsb2NhbAorICAgIHNpdGUgZm9yIHRoaXMgZmllbGQgaXMgYSBTVFJJTkcsIG9yIHNvbWV0aGluZyBlbHNlIChlLmcuLCBhIG51bWJlciwgZXRjLikuIFBvc3NpYmxlIAorICAgIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgYXJlICJ0cnVlIiwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmllbGQgaXMgYSBzdHJpbmcsIG9yCisgICAgImZhbHNlIiwgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBzb21ldGhpbmcgZWxzZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgb21pdHRlZCwgYSB2YWx1ZQorICAgIG9mICJmYWxzZSIgaXMgYXNzdW1lZCwgYW5kIHRoZSBhdHRyaWJ1dGUgd2lsbCBub3QgYmUgcXVvdGVkIGluIHRoZSB3aGVyZSBjbGF1c2Ugb2YKKyAgICB0aGUgdW5kZXJseWluZyBTUUwgc3RhdGVtZW50IGdlbmVyYXRlZC4KKyAgICAKKyAgICBkYm5hbWUgKG9wdGlvbmFsKTogdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHdpdGhpbiB0aGUgdW5kZXJseWluZyBkYi4gSWYgbm90CisgICAgc3BlY2lmaWVkLCB0aGVuIGFzc3VtZWQgdG8gYmUgbmFtZQorICAgIAorICAgIHRhYmxlIChvcHRpb25hbCk6ICBpZiBwcm92aWRlZCwgdGhlbiB0aGUgYXR0cmlidXRlIGEgaXMgc2VsZWN0ZWQgYXMKKyAgICAndGFibGUnLidhJyxhbmQgdGhlbiByZXR1cm5lZC4gSWYgb21pdHRlZCwgdGhlIGF0dHJpYnV0ZQorICAgIGlzIGFzc3VtZWQgdG8gY29tZSBmcm9tIHRoZSBkZWZhdWx0IHRhYmxlIHJldHVybmVkIGZyb20gdGhlCisgICAgUFMgcXVlcnkuCisgICAgCisgICAgdmFsdWUgKG9wdGlvbmFsKTogIGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGlmIHR5cGU9J2NvbnN0YW50JyBpcyBzZWxlY3RlZC4KKyAgICAKKyAgICBzY29wZSAob3B0aW9uYWwpOiAgbGltaXRzIHRoZSBzY29wZSBvZiBhIGZpZWxkJ3MgZXhpc3RlbmNlOiBhY2NlcHRhYmxlIHZhbHVlcworICAgIGFyZSAmcXVvdDtxdWVyeSZxdW90Oywgd2hpY2ggc2lnbmlmaWVzIHRoYXQgdGhlIGZpZWxkIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuCisgICAgdHJhbnNsYXRpbmcgcXVlcmllczogYW5kICZxdW90O3JldHVybiZxdW90Oywgd2hpY2ggc2lnbmlmaWVzIHRoZSBmaWVsZCBpcyBvbmx5CisgICAgYXBwbGljYWJsZSBhcyBhIHJldHVybiBmaWVsZCB3aGVuIGNvbnZlcnRpbmcgZGF0YWJhc2UgcmVzdWx0cyBpbnRvIENERVJlc3VsdHMuCisgICAgCisgIC0tPgorICA8ZmllbGQgdHlwZT0iZHluYW1pYyIgbmFtZT0iaWRfeG1scHMiIGRibmFtZT0iaWQiIHRhYmxlPSJkZWZhdWx0VGFibGUiLz4KKyAgPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9ImZpZWxkX29ubHkiLz4KKyAgPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9ImZpZWxkX3dpdGhfdGFibGUiIGRibmFtZT0iZmllbGRfZGIiIHRhYmxlPSJhbm90aGVyVGFibGUiLz4KKyAgPGZpZWxkIHR5cGU9ImR5bmFtaWMiIG5hbWU9ImZpZWxkX3VzZV9kZWZhdWx0IiBkYm5hbWU9ImZpZWxkX2RiIi8+Cis8L29vZHQ6eG1scHM+CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3BvbS54bWwgYi8wLjEwL3htbHF1ZXJ5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1NGZlYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvcG9tLnhtbApAQCAtMCwwICsxLDEwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9vZHQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjEwPC92ZXJzaW9uPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vY29yZS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5vb2R0LXhtbHF1ZXJ5PC9hcnRpZmFjdElkPgorICA8bmFtZT5RdWVyeSBFeHByZXNzaW9uPC9uYW1lPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICA8ZGVzY3JpcHRpb24+VGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSB3YXkgdG8gZXhwcmVzcyBxdWVyaWVzIGluIGEgZ2VuZXJpYworICAgIG1hbm5lci4gIEl0cyBjZW50ZXJwaWVjZSBpcyBhIGNsYXNzIGNhbGxlZCBYTUxRdWVyeSB0aGF0IHVzZXMKKyAgICBib29sZWFuIHBvc3RmaXggZXhwcmVzc2lvbnMgdG8gY2FwdHVyZSB0aGUgZG9tYWluLCByYW5nZSwgYW5kCisgICAgY29uc3RyYWludCBvZiBhIHF1ZXJ5LCByZWdhcmRsZXNzIG9mIHRoZSBzb3VyY2Ugb2YgdGhlIHF1ZXJ5IChTUUwsCisgICAga2V5d29yZCBxdWVyeSwgZXRjLikuICBJdCBjYW4gYWxzbyBlbmNhcHN1bGF0ZSB0aGUgcmVzdWx0cyBvZiBhCisgICAgcXVlcnkuICBJdCdzIHVzZWQgYnkgbWFueSBvdGhlciBjb21wb25lbnRzIGFzIHRoZSBzdGFuZGFyZCB3YXkgdG8KKyAgICBwYXNzIGEgcXVlcnkgYW5kIGl0cyByZXN1bHRzIGJldHdlZW4gc2VydmVycywgY2xpZW50cywgbm9kZXMsIGFuZAorICAgIG90aGVyIGNvbXBvbmVudHMuPC9kZXNjcmlwdGlvbj4KKyAgPHNjbT4KKyAgIAk8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjEwLXJjMi94bWxxdWVyeTwvY29ubmVjdGlvbj4KKyAgIAk8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29vZHQvdGFncy8wLjEwLXJjMi94bWxxdWVyeTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgIAk8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvb29kdC90YWdzLzAuMTAtcmMyL3htbHF1ZXJ5PC91cmw+CisgIDwvc2NtPgorICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPHRhcmdldFBhdGg+b3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5PC90YXJnZXRQYXRoPgorICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vY29uZjwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+bWltZS5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2R0ZDwvZGlyZWN0b3J5PgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvZGVjVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmF1ZGl0PC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL29vZHQveG1scXVlcnkvcGFja2FnZS5odG1sPC9leGNsdWRlPgorICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vb2R0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b29kdC1jb21tb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnBhcmVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vY29uZi9taW1lLnByb3BlcnRpZXMgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2NvbmYvbWltZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOTVhZGEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2NvbmYvbWltZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDA3IEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyBJbnRlcm5ldCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgT09EVAorIworIyAkSWQ6IG1pbWUucHJvcGVydGllcyx2IDEuMS4xLjEgMjAwNC0wMy0wMiAxOTozNzoxMyBrZWxseSBFeHAgJAorCisjIFRoZXNlIHR5cGVzIGFyZW4ndCBpbiB0aGUgb2ZmaWNpYWwgbGlzdCBhdCBJQU5BLCBidXQgYXJlIGxpc3RlZAorIyBoZXJlIGZvciBpbnRlcm5hbCBPT0RUIHVzZToKKworYXBwbGljYXRpb24vdm5kLmpwbC5sYXJnZS1wcm9kdWN0OgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuU3RyaW5nQ29kZWMKKworIyBUaGVzZSB0eXBlcyBhcmVuJ3QgaW4gdGhlIG9mZmljaWFsIGxpc3QgYXQgSUFOQSwgYnV0IGFyZSBzdXBwb3J0ZWQKKyMgaW4gdmFyaW91cyBlbnZpcm9ubWVudHM6CisKK2FwcGxpY2F0aW9uL3gtamF2YS1zZXJpYWxpemVkLW9iamVjdAkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuT2JqZWN0Q29kZWMKK2FwcGxpY2F0aW9uL2phdmEtdm0JCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuT2JqZWN0Q29kZWMKKworIyBUaGlzIHR5cGVzIGFyZSB0cmFuc2xhdGVkIGZyb20gdGhlIEludGVybmV0IG1lZGlhIHR5cGUgcmVnaXN0cnkgYXQKKyMgZnRwOi8vZnRwLmlhbmEub3JnL2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMKKwordGV4dC9wbGFpbjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlN0cmluZ0NvZGVjCit0ZXh0L3JpY2h0ZXh0OgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L2VucmljaGVkOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlN0cmluZ0NvZGVjCit0ZXh0L2h0bWw6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db21wcmVzc2VkU3RyaW5nQ29kZWMKK3RleHQvc2dtbDoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkNvbXByZXNzZWRTdHJpbmdDb2RlYwordGV4dC92bmQubGF0ZXgtejoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L3ZuZC5mbWkuZmxleHN0b3I6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC91cmktbGlzdDoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlN0cmluZ0NvZGVjCit0ZXh0L3ZuZC5hYmM6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvcmZjODIyLWhlYWRlcnM6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlN0cmluZ0NvZGVjCit0ZXh0L3ZuZC5pbjNkLjNkbWw6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC9wcnMubGluZXMudGFnOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvdm5kLmluM2Quc3BvdDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L2NzczoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkNvbXByZXNzZWRTdHJpbmdDb2RlYwordGV4dC94bWw6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5TdHJpbmdDb2RlYwordGV4dC9ydGY6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvZGlyZWN0b3J5OgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L2NhbGVuZGFyOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L3ZuZC53YXAud21sOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvdm5kLndhcC53bWxzY3JpcHQ6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC92bmQubW90b3JvbGEucmVmbGV4OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC92bmQuZmx5OgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit0ZXh0L3ZuZC53YXAuc2w6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC92bmQud2FwLnNpOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvdDE0MDoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC92bmQubXMtbWVkaWFwYWNrYWdlOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC92bmQuSVBUQy5OZXdzTUw6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC92bmQuSVBUQy5OSVRGOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvdm5kLmN1cmw6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3RleHQvdm5kLkRNQ2xpZW50U2NyaXB0OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordGV4dC9wYXJpdHlmZWM6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK211bHRpcGFydC9taXhlZDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittdWx0aXBhcnQvYWx0ZXJuYXRpdmU6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbXVsdGlwYXJ0L2RpZ2VzdDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittdWx0aXBhcnQvcGFyYWxsZWw6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbXVsdGlwYXJ0L2FwcGxlZG91YmxlOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK211bHRpcGFydC9oZWFkZXItc2V0OgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK211bHRpcGFydC9mb3JtLWRhdGE6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbXVsdGlwYXJ0L3JlbGF0ZWQ6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbXVsdGlwYXJ0L3JlcG9ydDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittdWx0aXBhcnQvdm9pY2UtbWVzc2FnZToJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK211bHRpcGFydC9zaWduZWQ6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbXVsdGlwYXJ0L2VuY3J5cHRlZDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittdWx0aXBhcnQvYnl0ZXJhbmdlczoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittZXNzYWdlL3JmYzgyMjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkNvbXByZXNzZWRTdHJpbmdDb2RlYworbWVzc2FnZS9wYXJ0aWFsOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK21lc3NhZ2UvZXh0ZXJuYWwtYm9keToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittZXNzYWdlL25ld3M6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db21wcmVzc2VkU3RyaW5nQ29kZWMKK21lc3NhZ2UvaHR0cDoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittZXNzYWdlL2Rpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvbjoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbWVzc2FnZS9zLWh0dHA6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbToJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5CeXRlQXJyYXlDb2RlYworYXBwbGljYXRpb24vcG9zdHNjcmlwdDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9vZGE6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vYXRvbWljbWFpbDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9zbGF0ZToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi93aXRhOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2RlYy1keDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9kY2EtcmZ0OgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2FjdGl2ZW1lc3NhZ2U6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9ydGY6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vYXBwbGVmaWxlOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL21hYy1iaW5oZXg0MDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL25ld3MtbWVzc2FnZS1pZDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL25ld3MtdHJhbnNtaXNzaW9uOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vd29yZHBlcmZlY3Q1LjE6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9wZGY6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vemlwOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL21hY3dyaXRlaWk6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vbXN3b3JkOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZzoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL21hdGhlbWF0aWNhOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vY3liZXJjYXNoOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2lnZXM6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vcmlzY29zOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2VzaG9wOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3g0MDAtYnA6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vc2dtbDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9jYWxzLTE4NDA6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vcGdwLWVuY3J5cHRlZDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3BncC1zaWduYXR1cmU6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9wZ3Ata2V5czoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZnJhbWVtYWtlcjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5taWY6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubXMtcHJvamVjdDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5tcy13b3JrczoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5tcy10bmVmOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnN2ZDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubXVzaWMtbmlmZjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5tcy1hcnRnYWxyeToJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC50cnVlZG9jOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmtvYW46CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnN0cmVldC1zdHJlYW06CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZmRmOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3NldC1wYXltZW50LWluaXRpYXRpb246CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3NldC1wYXltZW50OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvbi1pbml0aWF0aW9uOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb246CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuc2VlbWFpbDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5idXNpbmVzc29iamVjdHM6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5tZXJpZGlhbi1zbGluZ3Nob3Q6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC54YXJhOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3NnbWwtb3Blbi1jYXRhbG9nOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnJhcGlkOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXJlZ2lzdHJhdGlvbi13YWtldXA6CQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXA6CQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXBheW1lbnQtd2FrZXVwOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1kaXJlY3Rvcnktc2VydmljZToJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5kaWdpYm94OgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5ubmNwOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9wcnMuYWx2ZXN0cmFuZC50aXRyYXgtc2hlZXQ6CQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXdlYjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1zZWFsZXI6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1kaXJlY3Rvcnk6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3Bycy5ucHJlbmQ6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLndlYnR1cmJvOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vaHlwZXJzdHVkaW86CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybXRlbXBsYXRlOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YToJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmludGVyY2hhbmdlOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC4kY29tbWVyY2VfYmF0dGVsbGU6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5vc2EubmV0ZGVwbG95OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmlibS5NaW5pUGF5OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cDoJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtc2V0c3RvcmUtd2FrZXVwOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC12ZXJpZmljYXRpb246CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb246CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ocC1IUEdMOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmhwLVBDTDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaHAtUENMWEw6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubXVzaWNpYW46CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuRmxvR3JhcGhJdDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5pbnRlcmNvbi5mb3JtbmV0OgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92ZW1taToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubXMtYXNmOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5lY2Rpcy11cGRhdGU6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2LXM6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy13b3JkcHJvOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmxvdHVzLWFwcHJvYWNoOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmxvdHVzLTEtMi0zOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplcjoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmxvdHVzLWZyZWVsYW5jZToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czI6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuc3dpZnR2aWV3LWljczoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5kbmE6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vcHJzLmN3dzoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQud3Quc3RmOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5keHI6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1pdHN1YmlzaGkubWlzdHktZ3VhcmQudHJ1c3R3ZWI6CQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMzoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL21hcmM6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNwcnM6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3A6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC52aXNpbzoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubmV0ZnB4OgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5hdWRpb2dyYXBoOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuM00uUG9zdC1pdC1Ob3RlczoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLkVEWDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5FWFQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubm92YWRpZ20uRURNOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmNsYXltb3JlOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmNvbXNvY2FsbGVyOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vcGtjczctbWltZToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9wa2NzNy1zaWduYXR1cmU6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9wa2NzMTA6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51OgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5lY293aW4uY2hhcnQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllczoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5lY293aW4uZmlsZXJlcXVlc3Q6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5lY293aW4uZmlsZXVwZGF0ZToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXNyZXF1ZXN0OgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3VwZGF0ZToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vRURJRkFDVDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9FREktWDEyOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL0VESS1Db25zZW50OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLndycS1ocDMwMDAtbGFiZWxsZWQ6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5taW5pc29mdC1ocDMwMDAtc2F2ZToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmZmc25zOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ocC1ocHM6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3M6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3htbDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWZ1bmRzLXRyYW5zZmVyLWluaXRpYXRpb246CQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWNlcnRpZmljYXRlLWlzc3VlLWluaXRpYXRpb246CQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaXMteHByOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5pbnR1LnFibzoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWU6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5jeWJhbms6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vYmF0Y2gtU01UUDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3A6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Q6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jaGFubmVsOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudXBsYW5ldC5zaWduYWw6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2FjaGVvcC13Ym14bDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdC13YnhtbDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdGNtZC13YnhtbDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbC13YnhtbDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ljZS13YnhtbDoJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZXBzb24ucXVpY2thbmltZToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmNvbW1vbnNwYWNlOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmZ1dC1taXNuZXQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQueGZkbDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaW50dS5xZng6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZXBzb24uc3NmOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmVwc29uLm1zZjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjctczoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmxvdHVzLW5vdGVzOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vcGtpeGNtcDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQud2FwLndtbGM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQud2FwLndieG1sOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS53ZW06CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUua21yOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmFkc2k6CQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS5maXM6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUuZ290YXA6CQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS50dGM6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC51ZmRsOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmltcDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuYXNvOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudmN4OgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2lwcDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9vY3NwLXJlcXVlc3Q6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9vY3NwLXJlc3BvbnNlOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnByZXZpZXdzeXN0ZW1zLmJveDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1lZGlhc3RhdGlvbi5jZGtleToJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnBnLmZvcm1hdDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5wZy5vc2FzbGk6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaHAtaHBpZDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3BraXgtY2VydDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9wa2l4LWNybDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuTW9iaXVzLlRYRjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5Nb2JpdXMuUExDOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLk1vYml1cy5ESVM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuTW9iaXVzLkRBRjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5Nb2JpdXMuTVNMOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmN1cHMtcmFzdGVyOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmN1cHMtcG9zdHNjcmlwdDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmN1cHMtcmF3OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vaW5kZXg6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vaW5kZXguY21kOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2luZGV4LnJlc3BvbnNlOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vaW5kZXgub2JqOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2luZGV4LnZuZDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1LXM6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5kcGdyYXBoOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vaHR0cDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9zZHA6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmV1ZG9yYS5kYXRhOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MuYmluZGVyOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC52ZWN0b3J3b3JrczoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ncmFmZXE6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmJtaToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZXJpY3Nzb24ucXVpY2tjYWxsOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaHpuLTNkLWNyb3Nzd29yZDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLndhcC5zbGM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQud2FwLnNpYzoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaW5qZWN0b3I6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50OgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmdyb292ZS1pZGVudGl0eS1tZXNzYWdlOgkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC1tZXNzYWdlOgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtdGVtcGxhdGU6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdmNhcmQ6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuY3RjLXBvc21sOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmNhbm9uLWxpcHM6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuY2Fub24tY3BkbDoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC50cnVlYXBwOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnMzc21zOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL2lvdHA6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1jZDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaHR0cGhvbmU6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuaW5mb3JtaXgtdmlzaW9uYXJ5OgkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQubXNpZ246CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1zLWxybToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLmVwc29uLmVzZjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3dob2lzcHAtcXVlcnk6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi93aG9pc3BwLXJlc3BvbnNlOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLm1vemlsbGEueHVsK3htbDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vcGFyaXR5ZmVjOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5wYWxtOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2FwcGxpY2F0aW9uL3ZuZC5mc2Mud2VibGF1bmNoOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vdm5kLnR2ZS10cmlnZ2VyOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXBwbGljYXRpb24vZHZjczoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithcHBsaWNhdGlvbi9zaWV2ZToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCitpbWFnZS9qcGVnOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuQnl0ZUFycmF5Q29kZWMKK2ltYWdlL2dpZjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkJ5dGVBcnJheUNvZGVjCitpbWFnZS9pZWY6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL2czZmF4OgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCitpbWFnZS90aWZmOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCitpbWFnZS9jZ206CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL25hcGxwczoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2Uvdm5kLmR3ZzoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2Uvdm5kLnN2ZjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2Uvdm5kLmR4ZjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2UvcG5nOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuQnl0ZUFycmF5Q29kZWMKK2ltYWdlL3ZuZC5mcHg6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL3ZuZC5uZXQtZnB4OgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL3ZuZC54aWZmOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCitpbWFnZS9wcnMuYnRpZjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCitpbWFnZS92bmQud2FwLndibXA6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2UvcHJzLnB0aToJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworaW1hZ2Uvdm5kLmNucy5pbmYyOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL3ZuZC5taXg6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLXJsYzoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLW1tcjoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2ltYWdlL3ZuZC5mc3Q6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL2Jhc2ljOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithdWRpby8zMmthZHBjbToJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vdm5kLnFjZWxwOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vdm5kLmx1Y2VudC52b2ljZToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithdWRpby92bmQub2N0ZWwuc2JjOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL3ZuZC5yaGV0b3JleC4zMmthZHBjbToJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL3ZuZC52bXguY3ZzZDoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithdWRpby92bmQubm9ydGVsLnZiazoJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithdWRpby92bmQuY25zLmFucDE6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vdm5kLmNucy5pbmYxOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL0wxNjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vdm5kLmV2ZXJhZC5wbGo6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vdGVsZXBob25lLWV2ZW50OgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL3RvbmU6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL3Bycy5zaWQ6CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL3ZuZC5udWVyYS5lY2VscDQ4MDA6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCithdWRpby92bmQubnVlcmEuZWNlbHA3NDcwOgkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vbXBlZzoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworYXVkaW8vcGFyaXR5ZmVjOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK2F1ZGlvL01QNEEtTEFUTToJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit2aWRlby9tcGVnOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit2aWRlby9xdWlja3RpbWU6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordmlkZW8vdm5kLnZpdm86CQkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3ZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlbzoJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK3ZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlb3A6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit2aWRlby92bmQuZnZ0OgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit2aWRlby9wb2ludGVyOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCit2aWRlby9wYXJpdHlmZWM6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordmlkZW8vdm5kLm1wZWd1cmw6CQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYwordmlkZW8vTVA0Vi1FUzoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvaWdlczoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvdnJtbDoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvbWVzaDoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvdm5kLmR3ZjoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvdm5kLmd0dzoJCQkJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvdm5kLmZsYXRsYW5kLjNkbWw6CQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittb2RlbC92bmQudnR1OgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittb2RlbC92bmQubXRzOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittb2RlbC92bmQuZ2RsOgkJCQkJCQlvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjCittb2RlbC92bmQuZ3MtZ2RsOgkJCQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKK21vZGVsL3ZuZC5wYXJhc29saWQudHJhbnNtaXQudGV4dDoJCQkJb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYworbW9kZWwvdm5kLnBhcmFzb2xpZC50cmFuc21pdC5iaW5hcnk6CQkJCW9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMKZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vZHRkL3F1ZXJ5LmR0ZCBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vZHRkL3F1ZXJ5LmR0ZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wY2YzNDAxCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9kdGQvcXVlcnkuZHRkCkBAIC0wLDAgKzEsMTAwIEBACis8P3htbCBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworICA8IUVMRU1FTlQgcXVlcnkKKwkocXVlcnlBdHRyaWJ1dGVzLAorICAgICAgICAgcXVlcnlSZXN1bHRNb2RlSWQsCisgICAgICAgICBxdWVyeVByb3BvZ2F0aW9uVHlwZSwKKwkgcXVlcnlQcm9wb2dhdGlvbkxldmVscywKKyAgICAgICAgIHF1ZXJ5TWltZUFjY2VwdCosCisgICAgICAgICBxdWVyeU1heFJlc3VsdHMsCisgICAgICAgICBxdWVyeVJlc3VsdHMsCisgICAgICAgICBxdWVyeUtXUVN0cmluZywKKwkgcXVlcnlTdGF0aXN0aWNzPywKKyAgICAgICAgIHF1ZXJ5U2VsZWN0U2V0LAorICAgICAgICAgcXVlcnlGcm9tU2V0LAorCSBxdWVyeVdoZXJlU2V0LAorCSBxdWVyeVJlc3VsdFNldCk+CisKKyAgICA8IUVMRU1FTlQgcXVlcnlBdHRyaWJ1dGVzCisgICAgICAocXVlcnlJZCwgcXVlcnlUaXRsZSosIHF1ZXJ5RGVzYyosIHF1ZXJ5VHlwZSosCisgICAgICAgcXVlcnlTdGF0dXNJZCosIHF1ZXJ5U2VjdXJpdHlUeXBlKiwgCisgICAgICAgcXVlcnlQYXJlbnRJZCosIHF1ZXJ5Q2hpbGRJZCosCisgICAgICAgcXVlcnlSZXZpc2lvbk5vdGUqLAorICAgICAgIHF1ZXJ5RGF0YURpY3RJZCopPgorCisgICAgPCFFTEVNRU5UIHF1ZXJ5U3RhdGlzdGljcyAoc3RhdGlzdGljKik+CisKKyAgICA8IUVMRU1FTlQgcXVlcnlTZWxlY3RTZXQKKwkocXVlcnlFbGVtZW50Kik+CisKKyAgICA8IUVMRU1FTlQgcXVlcnlGcm9tU2V0CisJKHF1ZXJ5RWxlbWVudCopPgorCisgICAgPCFFTEVNRU5UIHF1ZXJ5V2hlcmVTZXQKKwkocXVlcnlFbGVtZW50Kik+CisKKyAgICAgIDwhRUxFTUVOVCBxdWVyeUVsZW1lbnQKKyAgICAgICAgKHRva2VuUm9sZSosIHRva2VuVmFsdWUqKT4KKworICAgIDwhRUxFTUVOVCBzdGF0aXN0aWMgKHVybCwgdGltZSk+CisKKyAgICA8IUVMRU1FTlQgcXVlcnlSZXN1bHRTZXQKKwkocmVzdWx0RWxlbWVudCopPgorCisgICAgICA8IUVMRU1FTlQgcmVzdWx0RWxlbWVudAorICAgICAgICAocmVzdWx0SWQqLCByZXN1bHRNaW1lVHlwZSosCisgICAgICAgICBwcm9mSWQqLCBpZGVudGlmaWVyKiwgcmVzdWx0SGVhZGVyLAorICAgICAgICAgcmVzdWx0VmFsdWUqKT4KKyAgICAgIDwhQVRUTElTVCByZXN1bHRFbGVtZW50IGNsYXNzaWZpZWQgKHRydWV8ZmFsc2UpICdmYWxzZSc+CisgICAgICA8IUFUVExJU1QgcmVzdWx0RWxlbWVudCB2YWxpZGl0eSBDREFUQSAjSU1QTElFRD4KKworICAgIDwhRUxFTUVOVCByZXN1bHRIZWFkZXIgKGhlYWRlckVsZW1lbnQqKT4KKyAgICA8IUVMRU1FTlQgaGVhZGVyRWxlbWVudCAoZWxlbU5hbWUsIGVsZW1UeXBlPywgZWxlbVVuaXQ/KT4KKworICAgIDwhRUxFTUVOVCBxdWVyeUlkICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlUaXRsZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHF1ZXJ5VHlwZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHF1ZXJ5RGVzYyAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHF1ZXJ5UGFyZW50SWQgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBxdWVyeUNoaWxkSWQgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBxdWVyeVN0YXR1c0lkICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlTZWN1cml0eVR5cGUgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBxdWVyeVJldmlzaW9uTm90ZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHF1ZXJ5RGF0YURpY3RJZCAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHF1ZXJ5UmVzdWx0TW9kZUlkICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlQcm9wb2dhdGlvblR5cGUgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBxdWVyeVByb3BvZ2F0aW9uTGV2ZWxzICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlNaW1lQWNjZXB0ICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlNYXhSZXN1bHRzICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlSZXN1bHRzICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcXVlcnlLV1FTdHJpbmcgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCB1cmwgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCB0aW1lICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgZWxlbU5hbWUgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCBlbGVtVHlwZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIGVsZW1Vbml0ICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgZWxlbVZhbHVlICgjUENEQVRBKT4KKyAgICA8IUVMRU1FTlQgcmVzdWx0SWQgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCByZXN1bHRNaW1lVHlwZSAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIHJlc3VsdFZhbHVlICgjUENEQVRBKT4KKyAgICA8IUFUVExJU1QgcmVzdWx0VmFsdWUgeG1sOnNwYWNlIChkZWZhdWx0fHByZXNlcnZlKSAnZGVmYXVsdCc+CisgICAgPCFFTEVNRU5UIHByb2ZJZCAoI1BDREFUQSk+CisgICAgPCFFTEVNRU5UIGlkZW50aWZpZXIgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCB0b2tlblJvbGUgKCNQQ0RBVEEpPgorICAgIDwhRUxFTUVOVCB0b2tlblZhbHVlICgjUENEQVRBKT4KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9IdHRwUmVkaXJlY3RFeGNlcHRpb24uamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9IdHRwUmVkaXJlY3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk3MTFhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L0h0dHBSZWRpcmVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC5wcm9kdWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUHJvZHVjdEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNsYXNzIAorICogCisgKiBAYXV0aG9yIG1jYXlhbmFuCisgKgorICovCitwdWJsaWMgY2xhc3MgSHR0cFJlZGlyZWN0RXhjZXB0aW9uIGV4dGVuZHMgUHJvZHVjdEV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ2ODA2ODk5NTExNDEzNDY0MDNMOworICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKKworICBwdWJsaWMgSHR0cFJlZGlyZWN0RXhjZXB0aW9uKFN0cmluZyBsb2NhdGlvbikgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKyAgICByZXR1cm4gbG9jYXRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9Qcm9kdWN0RXhjZXB0aW9uLmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvUHJvZHVjdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzNjg2YTMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3Byb2R1Y3QvUHJvZHVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3Q7CisKKy8qKgorICogQ2hlY2tlZCBleGNlcHRpb24gdG8gaW5kaWNhdGUgYSBwcm9kdWN0IGZhdWx0LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIFByb2R1Y3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCS8qKgorCSAqIENvbnN0cnVjdCBhIHByb2R1Y3QgZXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UuCisJICovCisJcHVibGljIFByb2R1Y3RFeGNlcHRpb24oKSB7fQorCisJLyoqCisJICogQ29uc3RydWN0IGEgcHJvZHVjdCBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIG1lc3NhZ2UuCisJICoKKwkgKiBAcGFyYW0gbXNnIERldGFpbCBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBQcm9kdWN0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwkJc3VwZXIobXNnKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2R1Y3RFeGNlcHRpb248L2NvZGU+IGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIGNhdXNlIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgUHJvZHVjdEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIoY2F1c2UpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvZHVjdEV4Y2VwdGlvbjwvY29kZT4gaW5zdGFuY2UuCisJICoKKwkgKiBAcGFyYW0gbXNnIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKwkgKiBAcGFyYW0gY2F1c2UgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IHZhbHVlLgorCSAqLworCXB1YmxpYyBQcm9kdWN0RXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtc2csIGNhdXNlKTsKKwl9CisKKwkvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLworCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MjQwMTAyOTY5NDgyMDcxNDUxTDsKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9SZXRyaWV2ZXIuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQvcHJvZHVjdC9SZXRyaWV2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZTg4ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC9wcm9kdWN0L1JldHJpZXZlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3Q7CisKKy8qKgorICogUmV0cmlldmVycyByZXRyaWV2ZSBwcm9kdWN0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMS4xLjEgJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJldHJpZXZlciB7CisJLyoqCisJICogUmV0cmlldmUgYSBjaHVuayBmcm9tIGEgbGFyZ2UgcHJvZHVjdC4KKwkgKgorCSAqIEBwYXJhbSBwcm9kdWN0SUQgUHJvZHVjdCBJRC4KKwkgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIGluIHRoZSBwcm9kdWN0IHRvIHJldHJpZXZlIHRoZSBkYXRhLgorCSAqIEBwYXJhbSBsZW5ndGggSG93IG11Y2ggZGF0YSB0byBnZXQuCisJICogQHJldHVybiBUaGUgZGF0YS4KKwkgKiBAdGhyb3dzIFByb2R1Y3RFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCWJ5dGVbXSByZXRyaWV2ZUNodW5rKFN0cmluZyBwcm9kdWN0SUQsIGxvbmcgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgUHJvZHVjdEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIENsb3NlIG9mZiBhIGxhcmdlIHByb2R1Y3QuCisJICoKKwkgKiBAcGFyYW0gcHJvZHVjdElEIFByb2R1Y3QgSUQuCisJICogQHRocm93cyBQcm9kdWN0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKwkgKi8KKwl2b2lkIGNsb3NlKFN0cmluZyBwcm9kdWN0SUQpIHRocm93cyBQcm9kdWN0RXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9CeXRlQXJyYXlDb2RlYy5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9CeXRlQXJyYXlDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZiMjE0NmIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0J5dGVBcnJheUNvZGVjLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5YTUw7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqIEEgcmVzdWx0IGVuY29kZXIvZGVjb2RlciBmb3IgYnl0ZSBhcnJheXMuCisgKgorICogVGhpcyBjb2RlYyB1c2VzIGJhc2UtNjQgZW5jb2RpbmcgZm9yIGJ5dGUgYXJyYXlzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworY2xhc3MgQnl0ZUFycmF5Q29kZWMgaW1wbGVtZW50cyBDb2RlYyB7CisJcHVibGljIE5vZGUgZW5jb2RlKE9iamVjdCBvYmplY3QsIERvY3VtZW50IGRvYykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCUVsZW1lbnQgdmFsdWUgPSBkb2MuY3JlYXRlRWxlbWVudCgicmVzdWx0VmFsdWUiKTsKKwkJdmFsdWUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoKGJ5dGVbXSkgb2JqZWN0KSkpKTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBPYmplY3QgZGVjb2RlKE5vZGUgbm9kZSkgeworCQlTdHJpbmcgZW5jb2RlZFZhbHVlOworCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiBub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKQorCQkJZW5jb2RlZFZhbHVlID0gbm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7CisJCWVsc2UKKwkJCWVuY29kZWRWYWx1ZSA9IFhNTC50ZXh0KG5vZGUpOworCQlpZiAoZW5jb2RlZFZhbHVlLmxlbmd0aCgpIDw9IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKwkJcmV0dXJuIEJhc2U2NC5kZWNvZGUoZW5jb2RlZFZhbHVlLmdldEJ5dGVzKCkpOworCX0KKworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoYnl0ZVtdKSB2YWx1ZSk7CisJfQorCisJcHVibGljIGxvbmcgc2l6ZU9mKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuICgoYnl0ZVtdKSBvYmplY3QpLmxlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvZGVjLmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvZGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmViY2JiYQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29kZWMuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkludmFsaWRDbGFzc0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9wdGlvbmFsRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqIFJlc3VsdCBlbmNvZGVyL2RlY29kZXIuCisgKgorICogQ2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBlbmNvZGUgYW5kIGRlY29kZSBxdWVyeSByZXN1bHRzIHRvIGFuZCBmcm9tIFhNTAorICogZm9ybWF0LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworaW50ZXJmYWNlIENvZGVjIHsKKwkvKiogRW5jb2RlIHRoZSBnaXZlbiBvYmplY3QgaW50byBYTUwgZm9ybWF0LgorCSAqCisJICogVGhlIGVuY29kaW5nIHRha2VzIHRoZSBvYmplY3QsIGVuY29kZXMgaW50byBhIERPTSBzdHJ1Y3R1cmUsIGFuZCByZXR1cm5zIGEKKwkgKiAmbHQ7cmVzdWx0VmFsdWUmZ3Q7IGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0IE9iamVjdCB0byBlbmNvZGUuCisJICogQHBhcmFtIGRvYyBXaGF0IGRvY3VtZW50IHdpbGwgb3duIHRoZSBjcmVhdGVkIFhNTCBub2Rlcy4KKwkgKiBAcmV0dXJuIEEgJmx0O3Jlc3VsdFZhbHVlJmd0OyBlbGVtZW50IGVuY29kaW5nIHRoZSA8dmFyPm9iamVjdDwvdmFyPi4KKwkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZW5jb2RpbmcgdGhlIG9iamVjdC4KKwkgKi8KKwlOb2RlIGVuY29kZShPYmplY3Qgb2JqZWN0LCBEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb247CisKKwkvKiogRGVjb2RlIHRoZSBnaXZlbiBYTUwgcmVwcmVzZW50YXRpb24gaW50byBpdHMgb2JqZWN0LgorCSAqCisJICogVGhlIGRlY29kaW5nIHRha2VzIHRoZSAmbHQ7cmVzdWx0VmFsdWUmZ3Q7IG5vZGUsIGFuZCBkZWNvZGVzIGl0IGludG8gdGhlIG9iamVjdAorCSAqIGl0IHJlcHJlc2VudHMuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBUaGUgJmx0O3Jlc3VsdFZhbHVlJmd0OyBub2RlLgorCSAqIEByZXR1cm4gVGhlIG9iamVjdCB0aGF0IHRoZSA8dmFyPm5vZGU8L3Zhcj4gcmVwcmVzZW50cy4KKwkgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgaW4gPHZhcj5ub2RlPC92YXI+IGNhbid0IGJlIGZvdW5kLgorCSAqIEB0aHJvd3MgSW52YWxpZENsYXNzRXhjZXB0aW9uIElmIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBjbGFzcyBlbmNvZGVkIGluIDx2YXI+bm9kZTwvdmFyPi4KKwkgKiBAdGhyb3dzIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiBXaGVuIGNvbnRyb2wgaW5mb3JtYXRpb24gaW4gPHZhcj5ub2RlPC92YXI+IGlzIGluY29uc2lzdGVudC4KKwkgKiBAdGhyb3dzIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiBJZiBwcmltaXRpdmUgZGF0YXR5cGVzIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdhcyBmb3VuZCBlbmNvZGVkIGluIHRoZSA8dmFyPm5vZGU8L3Zhcj4uCisJICovCisJT2JqZWN0IGRlY29kZShOb2RlIG5vZGUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnZhbGlkQ2xhc3NFeGNlcHRpb24sIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwKKwkJT3B0aW9uYWxEYXRhRXhjZXB0aW9uOworCisJLyoqCisJICogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgorCSAqCisJICogQHBhcmFtIG9iamVjdCBPYmplY3QuCisJICogQHJldHVybiBTaXplIG9mIDx2YXI+b2JqZWN0PC92YXI+IGluIGJ5dGVzLgorCSAqLworCWxvbmcgc2l6ZU9mKE9iamVjdCBvYmplY3QpOworCisJLyoqCisJICogWWllbGQgdGhlIGdpdmVuIG9iamVjdCBhcyBhIHN0cmVhbS4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBnaXZlbiBvYmplY3QgYW5kIHlpZWxkcyBhIHN0cmVhbSB2ZXJzaW9uIG9mIGl0CisJICogYXBwcm9wcmlhdGUgY29uY3JldGUgY29kZWMgdHlwZS4gIEZvciBleGFtcGxlLCB7QGxpbmsgQnl0ZUFycmF5Q29kZWN9cyBtYXkKKwkgKiB5aWVsZCBzaW1wbGUge0BsaW5rIEJ5dGVBcnJheUlucHV0U3RyZWFtfXMgZm9yIHRoZWlyIG9iamVjdHMuCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgc3RyZWFtZWQuCisJICogQHJldHVybiBBbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gb2YgPHZhcj5vYmplY3Q8L3Zhcj4uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oT2JqZWN0IG9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9Db2RlY0ZhY3RvcnkuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29kZWNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODkzNWU1MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29kZWNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBBIGZhY3RvcnkgZm9yIGNvZGVjcy4KKyAqCisgKiBUaGUgY29kZWMgZmFjdG9yeSBjcmVhdGVzIGFuZCBtYWludGFpbnMgY29kZWMgb2JqZWN0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIENvZGVjRmFjdG9yeSB7CisJLyoqIENyZWF0ZSBhIGNvZGVjLgorCSAqCisJICogSWYgdGhlIGNvZGVjIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMsIGl0J3MgcmV0dXJuZWQuCisJICogT3RoZXJ3aXNlLCB0aGUgZmFjdG9yeSBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb2RlYyBhbmQgcmV0dXJucyBpdC4gIEFueQorCSAqIHRvIGluc3RhbnRpYXRlIHRoZSBjb2RlYyByZXN1bHRzIGluIGEgcnVudGltZSBleGNlcHRpb24uCisJICoKKwkgKiBAcGFyYW0gY2xhc3NOYW1lIE5hbWUgb2YgdGhlIGNvZGVjIGNsYXNzIHRvIGNyZWF0ZS4KKwkgKiBAcmV0dXJuIFRoZSBjb2RlYyBvYmplY3Qgb2YgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIDx2YXI+Y2xhc3NOYW1lPC92YXI+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29kZWMgY3JlYXRlQ29kZWMoU3RyaW5nIGNsYXNzTmFtZSkgeworCQlDb2RlYyBjb2RlYyA9IChDb2RlYykgY29kZWNzLmdldChjbGFzc05hbWUpOworCQlpZiAoY29kZWMgPT0gbnVsbCkgdHJ5IHsKKwkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCQkJY29kZWMgPSAoQ29kZWMpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisJCQljb2RlY3MucHV0KGNsYXNzTmFtZSwgY29kZWMpOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3MgXCIiICsgY2xhc3NOYW1lICsgIlwiIG5vdCBmb3VuZCIpOworCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3MgXCIiICsgY2xhc3NOYW1lICsgIlwiIGlzIGFic3RyYWN0IG9yIGlzIGFuIGludGVyZmFjZSIpOworCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3MgXCIiICsgY2xhc3NOYW1lICsgIlwiIGRvZXNuJ3QgaGF2ZSBwdWJsaWMgbm8tYXJncyBjb25zdHJ1Y3RvciIpOworCQl9CisJCXJldHVybiBjb2RlYzsKKwl9CisKKwkvKiogQ2FjaGVjIGNvZGVjczsgdGhlIG1hcHBpbmcgaXMgZnJvbSB7QGxpbmsgU3RyaW5nfSBjbGFzcyBuYW1lIHRvIHtAbGluayBDb2RlY30gb2JqZWN0LiAqLworCXByaXZhdGUgc3RhdGljIE1hcCBjb2RlY3MgPSBuZXcgSGFzaE1hcCgpOworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9Db21wcmVzc2VkT2JqZWN0Q29kZWMuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29tcHJlc3NlZE9iamVjdENvZGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJmYjU0ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29tcHJlc3NlZE9iamVjdENvZGVjLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9wdGlvbmFsRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5CYXNlNjRFbmNvZGluZ091dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5OdWxsT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLkNvdW50aW5nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKKy8qKiBBIHJlc3VsdCBlbmNvZGVyL2RlY29kZXIgZm9yIGNvbXByZXNzZWQsIHNlcmlhbGl6ZWQgb2JqZWN0cy4KKyAqCisgKiBUaGlzIGNvZGVjIHVzZXMgYSBHWklQIGNvbXByZXNzZWQgc2VyaWFsaXplZCBvYmplY3QgZm9ybWF0IGZvciBvYmplY3RzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworY2xhc3MgQ29tcHJlc3NlZE9iamVjdENvZGVjIGltcGxlbWVudHMgQ29kZWMgeworCXB1YmxpYyBOb2RlIGVuY29kZShPYmplY3Qgb2JqZWN0LCBEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQl0cnkgeworCQkJQmFzZTY0RW5jb2RpbmdPdXRwdXRTdHJlYW0gYmFzZTY0ID0gbmV3IEJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtKGJ5dGVBcnJheSk7CisJCQlHWklQT3V0cHV0U3RyZWFtIGd6aXAgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShiYXNlNjQpOworCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZ3ppcCk7CisJCQlvYmpTdHJlYW0ud3JpdGVPYmplY3Qob2JqZWN0KTsKKwkJCW9ialN0cmVhbS5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBjYW50SGFwcGVuKSB7fQorCQlFbGVtZW50IHZhbHVlID0gZG9jLmNyZWF0ZUVsZW1lbnQoInJlc3VsdFZhbHVlIik7CisJCXZhbHVlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oYnl0ZUFycmF5LnRvU3RyaW5nKCkpKTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBPYmplY3QgZGVjb2RlKE5vZGUgbm9kZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEludmFsaWRDbGFzc0V4Y2VwdGlvbiwgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uLAorCQlPcHRpb25hbERhdGFFeGNlcHRpb24geworCQlTdHJpbmcgZW5jb2RlZFZhbHVlOworCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkKKwkJCWVuY29kZWRWYWx1ZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOworCQllbHNlCisJCQllbmNvZGVkVmFsdWUgPSBYTUwudGV4dChub2RlKTsKKwkJT2JqZWN0IHJjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJ5dGVBcnJheSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGVkVmFsdWUuZ2V0Qnl0ZXMoKSk7CisJCQlCYXNlNjREZWNvZGluZ0lucHV0U3RyZWFtIGJhc2U2NCA9IG5ldyBCYXNlNjREZWNvZGluZ0lucHV0U3RyZWFtKGJ5dGVBcnJheSk7CisJCQlHWklQSW5wdXRTdHJlYW0gZ3ppcCA9IG5ldyBHWklQSW5wdXRTdHJlYW0oYmFzZTY0KTsKKwkJCU9iamVjdElucHV0U3RyZWFtIG9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShnemlwKTsKKwkJCXJjID0gb2JqU3RyZWFtLnJlYWRPYmplY3QoKTsKKwkJCW9ialN0cmVhbS5jbG9zZSgpOworCQl9IGNhdGNoIChJbnZhbGlkQ2xhc3NFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IGV4OworCQl9IGNhdGNoIChTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IGV4OworCQl9IGNhdGNoIChPcHRpb25hbERhdGFFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IGV4OworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBjYW50SGFwcGVuKSB7fQorCQlyZXR1cm4gcmM7CisJfQorCisJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKE9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCU9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworCQlvb3Mud3JpdGVPYmplY3QodmFsdWUpOworCQlvb3MuY2xvc2UoKTsKKwkJYmFvcy5jbG9zZSgpOworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisJfQorCisJcHVibGljIGxvbmcgc2l6ZU9mKE9iamVjdCBvYmopIHsKKwkJdHJ5IHsKKwkJCUNvdW50aW5nT3V0cHV0U3RyZWFtIGMgPSBuZXcgQ291bnRpbmdPdXRwdXRTdHJlYW0obmV3IE51bGxPdXRwdXRTdHJlYW0oKSk7CisJCQlPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShjKTsKKwkJCXN0cmVhbS53cml0ZU9iamVjdChvYmopOworCQkJc3RyZWFtLmNsb3NlKCk7CisJCQlyZXR1cm4gYy5nZXRCeXRlc1dyaXR0ZW4oKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkkvTyBleGNlcHRpb24gIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYW4ndCBoYXBwZW4sIHlldCBkaWQ6ICIKKwkJCQkrIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvbXByZXNzZWRTdHJpbmdDb2RlYy5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9Db21wcmVzc2VkU3RyaW5nQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZmEzMDljCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9Db21wcmVzc2VkU3RyaW5nQ29kZWMuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5CYXNlNjREZWNvZGluZ0lucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLkJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKKy8qKiBBIHJlc3VsdCBlbmNvZGVyL2RlY29kZXIgZm9yIGNvbXByZXNzZWQgc3RyaW5ncy4KKyAqCisgKiBUaGlzIGNvZGVjIHVzZXMgYSBHWklQIGNvbXByZXNzZWQgc3RyaW5nIGZvcm1hdCBmb3Igb2JqZWN0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIENvbXByZXNzZWRTdHJpbmdDb2RlYyBpbXBsZW1lbnRzIENvZGVjIHsKKwlwdWJsaWMgTm9kZSBlbmNvZGUoT2JqZWN0IG9iamVjdCwgRG9jdW1lbnQgZG9jKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJdHJ5IHsKKwkJCUJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtIGJhc2U2NCA9IG5ldyBCYXNlNjRFbmNvZGluZ091dHB1dFN0cmVhbShieXRlQXJyYXkpOworCQkJR1pJUE91dHB1dFN0cmVhbSBnemlwID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oYmFzZTY0KTsKKwkJCWd6aXAud3JpdGUob2JqZWN0LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisJCQlnemlwLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGNhbnRIYXBwZW4pIHt9CisJCUVsZW1lbnQgdmFsdWUgPSBkb2MuY3JlYXRlRWxlbWVudCgicmVzdWx0VmFsdWUiKTsKKwkJdmFsdWUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihieXRlQXJyYXkudG9TdHJpbmcoKSkpOworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIE9iamVjdCBkZWNvZGUoTm9kZSBub2RlKSB7CisJCVN0cmluZyBlbmNvZGVkVmFsdWU7CisJCWlmIChub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKQorCQkJZW5jb2RlZFZhbHVlID0gbm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7CisJCWVsc2UKKwkJCWVuY29kZWRWYWx1ZSA9IFhNTC50ZXh0KG5vZGUpOworCQlTdHJpbmcgcmMgPSBudWxsOworCQl0cnkgeworCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kZWRWYWx1ZS5nZXRCeXRlcygpKTsKKwkJCUJhc2U2NERlY29kaW5nSW5wdXRTdHJlYW0gYmFzZTY0ID0gbmV3IEJhc2U2NERlY29kaW5nSW5wdXRTdHJlYW0oYnl0ZUFycmF5KTsKKwkJCUdaSVBJbnB1dFN0cmVhbSBnemlwID0gbmV3IEdaSVBJbnB1dFN0cmVhbShiYXNlNjQpOworCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlpbnQgbnVtUmVhZDsKKwkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCXdoaWxlICgobnVtUmVhZCA9IGd6aXAucmVhZChidWYpKSAhPSAtMSkKKwkJCQliLmFwcGVuZChuZXcgU3RyaW5nKGJ1ZiwgMCwgbnVtUmVhZCkpOworCQkJZ3ppcC5jbG9zZSgpOworCQkJcmMgPSBiLnRvU3RyaW5nKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGNhbnRIYXBwZW4pIHt9CisJCXJldHVybiByYzsKKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oT2JqZWN0IHZhbHVlKSB7CisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKChTdHJpbmcpIHZhbHVlKS5nZXRCeXRlcygpKTsKKwl9CisKKwlwdWJsaWMgbG9uZyBzaXplT2YoT2JqZWN0IG9iaikgeworCQlyZXR1cm4gKChTdHJpbmcpIG9iaikuZ2V0Qnl0ZXMoKS5sZW5ndGg7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9IZWFkZXIuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NiN2RhYgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvSGVhZGVyLmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC56aXAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworLyoqIEEgc2luZ2xlIGhlYWRlci4KKyAqCisgKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBhIGhlYWRlciBlbGVtZW50IG9mIGEgcXVlcnkuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgSGVhZGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIERvY3VtZW50YWJsZSB7CisJLyoqIENyZWF0ZSBhIGxpc3Qgb2YgaGVhZGVycyBmcm9tIGFuIFhNTCBkb2N1bWVudC4KKwkgKgorCSAqIEBwYXJhbSByb290IEEgJmx0O3Jlc3VsdEhlYWRlciZndDsgZWxlbWVudC4KKwkgKiBAcmV0dXJuIEEgbGlzdCBvZiA8Y29kZT5IZWFkZXI8L2NvZGU+cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3QgY3JlYXRlSGVhZGVycyhOb2RlIHJvb3QpIHsKKwkJaWYgKCEicmVzdWx0SGVhZGVyIi5lcXVhbHMocm9vdC5nZXROb2RlTmFtZSgpKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkV4cGVjdGVkIDxyZXN1bHRIZWFkZXI+IGJ1dCBnb3QgPCIgKyByb290LmdldE5vZGVOYW1lKCkgKyAiPiIpOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOworCQlMaXN0IHJjID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpeworCQkJTm9kZSBub2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKwkJCQlIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcihub2RlKTsKKwkJCQlyYy5hZGQoaGVhZGVyKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmM7CisJfQorCisJLyoqIENyZWF0ZSBhIG5ldywgYmxhbmsgaGVhZGVyLgorCSAqCisJICogVGhpcyBpbml0aWFsaXplcyB0aGUgcmVzdWx0IHdpdGggZGVmYXVsdCB2YWx1ZXMgZm9yIHZhcmlvdXMgcHJvcGVydGllcy4KKwkgKi8KKwlwdWJsaWMgSGVhZGVyKCkgeworCQl0aGlzKC8qbmFtZSovIlVOS05PV04iKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgaGVhZGVyLgorCSAqCisJICogSGVyZSwgeW91IHNwZWNpZnkgdGhlIGhlYWRlcidzIG5hbWUgb25seS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhpcyBoZWFkZXIuCisJICovCisJcHVibGljIEhlYWRlcihTdHJpbmcgbmFtZSkgeworCQl0aGlzKG5hbWUsIC8qdHlwZSovbnVsbCwgLyp1bml0Ki9udWxsKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgZnVsbHkgc3BlY2lmaWVkIGhlYWRlci4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhpcyBoZWFkZXIuCisJICogQHBhcmFtIHR5cGUgRGF0YSB0eXBlLgorCSAqIEBwYXJhbSB1bml0IFVuaXRzLgorCSAqLworCXB1YmxpYyBIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdW5pdCkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnVuaXQgPSB1bml0OworCX0KKworCS8qKiBDcmVhdGUgYSBoZWFkZXIgZnJvbSBhIERPTSBub2RlLgorCSAqCisJICogQHBhcmFtIG5vZGUgVGhlIERPTSBub2RlLCB3aGljaCBtdXN0IGJlIGEgJmx0O2hlYWRlckVsZW1lbnQmZ3Q7IGVsZW1lbnQuCisJICovCisJcHVibGljIEhlYWRlcihOb2RlIG5vZGUpIHsKKwkJaWYgKCEiaGVhZGVyRWxlbWVudCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIZWFkZXIgbXVzdCBiZSBjb25zdHJ1Y3RlZCBmcm9tIDxoZWFkZXJFbGVtZW50PiBub2RlLCBub3QgPCIKKwkJCQkrIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+Iik7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoImVsZW1OYW1lIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJbmFtZSA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJlbGVtVHlwZSIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKQorCQkJCXR5cGUgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgiZWxlbVVuaXQiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQl1bml0ID0gWE1MLnVud3JhcHBlZFRleHQoY2hpbGQpOworCQl9CisJfQorCisJLyoqIEdldCB0aGUgbmFtZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGhlYWRlciwgc3VpdGFibGUgZm9yIHByaW50aW5nIGluIGEgY29sdW1uIGhlYWRpbmcuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKiogR2V0IHRoZSB0eXBlIG9mIHRoaXMgcmVzdWx0LgorCSAqCisJICogQHJldHVybiBUaGUgdHlwZSwgYXMgaW4gZGF0YSB0eXBlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqIEdldCB0aGUgdW5pdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHVuaXRzIGluIHdoaWNoIHRoZSBoZWFkZXIgaXMgcHJlc2VudGVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIHVuaXQ7CisJfQorCisJLyoqIFNldCB0aGUgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIsIHN1aXRhYmxlIGZvciBwcmludGluZyBpbiBhIGNvbHVtbiBoZWFkaW5nLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwkvKiogU2V0IHRoZSB0eXBlIG9mIHRoaXMgcmVzdWx0LgorCSAqCisJICogQHBhcmFtIHR5cGUgVGhlIHR5cGUsIGFzIGluIGRhdGEgdHlwZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJLyoqIFNldCB0aGUgdW5pdC4KKwkgKgorCSAqIEBwYXJhbSB1bml0IFRoZSB1bml0cyBpbiB3aGljaCB0aGUgaGVhZGVyIGlzIHByZXNlbnRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVbml0KFN0cmluZyB1bml0KSB7CisJCXRoaXMudW5pdCA9IHVuaXQ7CisJfQorCisJcHVibGljIE5vZGUgdG9YTUwoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImhlYWRlckVsZW1lbnQiKTsKKwkJWE1MLmFkZChyb290LCAiZWxlbU5hbWUiLCBnZXROYW1lKCkpOworCQlYTUwuYWRkTm9uTnVsbChyb290LCAiZWxlbVR5cGUiLCBnZXRUeXBlKCkpOworCQlYTUwuYWRkTm9uTnVsbChyb290LCAiZWxlbVVuaXQiLCBnZXRVbml0KCkpOworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIEhlYWRlcikpIHJldHVybiBmYWxzZTsKKwkJSGVhZGVyIG9iaiA9IChIZWFkZXIpIHJoczsKKwkJcmV0dXJuIG5hbWUuZXF1YWxzKG9iai5uYW1lKSAmJiAoKHR5cGUgPT0gbnVsbCAmJiBvYmoudHlwZSA9PSBudWxsKSB8fCB0eXBlLmVxdWFscyhvYmoudHlwZSkpCisJCQkmJiAoKHVuaXQgPT0gbnVsbCAmJiBvYmoudW5pdCA9PSBudWxsKSB8fCB1bml0LmVxdWFscyhvYmoudW5pdCkpOworCX0KKworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisJCU9iamVjdCByYyA9IG51bGw7CisJCXRyeSB7CisJCQlyYyA9IHN1cGVyLmNsb25lKCk7CisJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNhbnRIYXBwZW4pIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB0aHJvd24gZm9yIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBDbG9uZWFibGU6ICIKKwkJCQkrIGNhbnRIYXBwZW4uZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltuYW1lPSIgKyBnZXROYW1lKCkgKyAiLHR5cGU9IiArIGdldFR5cGUoKSArICIsdW5pdD0iICsgZ2V0VW5pdCgpICsgIl0iOworCX0KKworCS8qKiBOYW1lIG9mIHRoZSBoZWFkZXIuICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCS8qKiBUeXBlLCBhcyBpbiB0eXBlIG9mIHRoZSBkYXRhLiAqLworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwkvKiogVW5pdCwgYXMgaW4gdGhlIHVuaXRzIG9mIHRoZSBkYXRhIHR5cGUuICovCisJcHJpdmF0ZSBTdHJpbmcgdW5pdDsKKworICAgICAgICAvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLworICAgICAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1OTY1ODgzODMwNDY1ODE4NDBMOworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9PYmplY3RDb2RlYy5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9PYmplY3RDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwNjU3OTQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L09iamVjdENvZGVjLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9wdGlvbmFsRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5CYXNlNjREZWNvZGluZ0lucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLkJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLmlvLk51bGxPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC5YTUw7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuaW8uQ291bnRpbmdPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqIEEgcmVzdWx0IGVuY29kZXIvZGVjb2RlciBmb3Igc2VyaWFsaXplZCBvYmplY3RzLgorICoKKyAqIFRoaXMgY29kZWMgdXNlcyBhIHNlcmlhbGl6ZWQgb2JqZWN0IGZvcm1hdCBmb3Igb2JqZWN0cy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIE9iamVjdENvZGVjIGltcGxlbWVudHMgQ29kZWMgeworCXB1YmxpYyBOb2RlIGVuY29kZShPYmplY3Qgb2JqZWN0LCBEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQl0cnkgeworCQkJQmFzZTY0RW5jb2RpbmdPdXRwdXRTdHJlYW0gYmFzZTY0ID0gbmV3IEJhc2U2NEVuY29kaW5nT3V0cHV0U3RyZWFtKGJ5dGVBcnJheSk7CisJCQlPYmplY3RPdXRwdXRTdHJlYW0gb2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYXNlNjQpOworCQkJb2JqU3RyZWFtLndyaXRlT2JqZWN0KG9iamVjdCk7CisJCQlvYmpTdHJlYW0uY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJRWxlbWVudCB2YWx1ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJyZXN1bHRWYWx1ZSIpOworCQl2YWx1ZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKGJ5dGVBcnJheS50b1N0cmluZygpKSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGRlY29kZShOb2RlIG5vZGUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnZhbGlkQ2xhc3NFeGNlcHRpb24sIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwKKwkJT3B0aW9uYWxEYXRhRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGVuY29kZWRWYWx1ZTsKKwkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpCisJCQllbmNvZGVkVmFsdWUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKKwkJZWxzZQorCQkJZW5jb2RlZFZhbHVlID0gWE1MLnRleHQobm9kZSk7CisJCU9iamVjdCByYyA9IG51bGw7CisJCXRyeSB7CisJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBieXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZFZhbHVlLmdldEJ5dGVzKCkpOworCQkJQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbSBiYXNlNjQgPSBuZXcgQmFzZTY0RGVjb2RpbmdJbnB1dFN0cmVhbShieXRlQXJyYXkpOworCQkJT2JqZWN0SW5wdXRTdHJlYW0gb2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhc2U2NCk7CisJCQlyYyA9IG9ialN0cmVhbS5yZWFkT2JqZWN0KCk7CisJCQlvYmpTdHJlYW0uY2xvc2UoKTsKKwkJfSBjYXRjaCAoSW52YWxpZENsYXNzRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBleDsKKwkJfSBjYXRjaCAoU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBleDsKKwkJfSBjYXRjaCAoT3B0aW9uYWxEYXRhRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBleDsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJcmV0dXJuIHJjOworCX0KKworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShPYmplY3QgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQlPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKwkJb29zLndyaXRlT2JqZWN0KHZhbHVlKTsKKwkJb29zLmNsb3NlKCk7CisJCWJhb3MuY2xvc2UoKTsKKwkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOworCX0KKworCXB1YmxpYyBsb25nIHNpemVPZihPYmplY3Qgb2JqKSB7CisJCXRyeSB7CisJCQlDb3VudGluZ091dHB1dFN0cmVhbSBjID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG5ldyBOdWxsT3V0cHV0U3RyZWFtKCkpOworCQkJT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYyk7CisJCQlzdHJlYW0ud3JpdGVPYmplY3Qob2JqKTsKKwkJCXN0cmVhbS5jbG9zZSgpOworCQkJcmV0dXJuIGMuZ2V0Qnl0ZXNXcml0dGVuKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJL08gZXhjZXB0aW9uICIgKyBleC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuJ3QgaGFwcGVuLCB5ZXQgZGlkOiAiCisJCQkJKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeUVsZW1lbnQuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUXVlcnlFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDAzMmUwMQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUXVlcnlFbGVtZW50LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC56aXAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworLyoqIEEgc2luZ2xlIHF1ZXJ5IGVsZW1lbnQuCisgKgorICogQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgYW4gZWxlbWVudCBvZiBhIHF1ZXJ5LgorICoKKyAqIDxwPlRPRE86IENvbnNpZGVyIGNvbXB1dGluZyBwcm9wZXIgbWltZS10eXBlIGJhc2VkIG9uIGNsYXNzIG9mIG9iamVjdCBiZWluZyBpbnNlcnRlZCBhcworICogYSB2YWx1ZSBpbnRvIHRoZSByZXN1bHQuCisgKgorICogQGF1dGhvciBLZWxseQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlFbGVtZW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIERvY3VtZW50YWJsZSB7CisJLyoqIENyZWF0ZSBhIGJsYW5rIHF1ZXJ5IGVsZW1lbnQuCisJICovCisJcHVibGljIFF1ZXJ5RWxlbWVudCgpIHsKKwkJdGhpcygiVU5LTk9XTiIsICJVTktOT1dOIik7CisJfQorCisJLyoqIENyZWF0ZSBhIHF1ZXJ5IGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0aGUgZWxlbWVudCBwbGF5cy4KKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50LgorCSAqLworCXB1YmxpYyBRdWVyeUVsZW1lbnQoU3RyaW5nIHJvbGUsIFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnJvbGUgPSByb2xlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFF1ZXJ5RWxlbWVudChOb2RlIG5vZGUpIHsKKwkJaWYgKCEicXVlcnlFbGVtZW50Ii5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlF1ZXJ5IGVsZW1lbnQgbXVzdCBiZSBjb25zdHJ1Y3RlZCBmcm9tIDxxdWVyeUVsZW1lbnQ+IG5vZGUsIG5vdCA8IgorCQkJCSsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iKTsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCWlmICgidG9rZW5Sb2xlIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJcm9sZSA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJ0b2tlblZhbHVlIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJdmFsdWUgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCX0KKwl9CisKKwkvKiogR2V0IG15IHJvbGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByb2xlIHRoaXMgZWxlbWVudCBwbGF5cy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSB7CisJCXJldHVybiByb2xlOworCX0KKworCS8qKiBHZXQgbXkgdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKiBTZXQgbXkgcm9sZS4KKwkgKgorCSAqIEBwYXJhbSByb2xlIFRoZSBuZXcgcm9sZSB0aGlzIGVsZW1lbnQgcGxheXMuCisJICovCisJcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkgeworCQlpZiAocm9sZSA9PSBudWxsKSByb2xlID0gIlVOS05PV04iOworCQl0aGlzLnJvbGUgPSByb2xlOworCX0KKworCS8qKiBTZXQgbXkgdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICJVTktOT1dOIjsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBOb2RlIHRvWE1MKERvY3VtZW50IGRvYykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCUVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJxdWVyeUVsZW1lbnQiKTsKKwkJWE1MLmFkZChyb290LCAidG9rZW5Sb2xlIiwgZ2V0Um9sZSgpKTsKKwkJWE1MLmFkZChyb290LCAidG9rZW5WYWx1ZSIsIGdldFZhbHVlKCkpOworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgeworCQlpZiAocmhzID09IHRoaXMpIHJldHVybiB0cnVlOworCQlpZiAocmhzID09IG51bGwgfHwgIShyaHMgaW5zdGFuY2VvZiBRdWVyeUVsZW1lbnQpKSByZXR1cm4gZmFsc2U7CisJCVF1ZXJ5RWxlbWVudCBvYmogPSAoUXVlcnlFbGVtZW50KSByaHM7CisJCXJldHVybiByb2xlLmVxdWFscyhvYmoucm9sZSkgJiYgdmFsdWUuZXF1YWxzKG9iai52YWx1ZSk7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHJvbGUuaGFzaENvZGUoKSBeIHZhbHVlLmhhc2hDb2RlKCk7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IHJjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJjID0gc3VwZXIuY2xvbmUoKTsKKwkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJcmV0dXJuIHJjOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbcm9sZT0iICsgcm9sZSArICIsdmFsdWU9IiArIHZhbHVlICsgIl0iOworCX0KKworCS8qKiBUaGUgcm9sZSBJIHBsYXkuICovCisJcHJpdmF0ZSBTdHJpbmcgcm9sZTsKKworCS8qKiBUaGUgdmFsdWUgbXkgcm9sZSBoYXMuICovCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgLyoqIFNlcmlhbCB2ZXJzaW9uIHVuaXF1ZSBJRC4gKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NDAxNDM0NDQzNDc1NTQwODAwTDsKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUXVlcnlFeGNlcHRpb24uamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUXVlcnlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NjllMDQyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCisvKiogQ2hlY2tlZCBleGNlcHRpb24gdG8gaW5kaWNhdGUgYSBxdWVyeSBmYXVsdC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisJLyoqIENvbnN0cnVjdCBhIHF1ZXJ5IGV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBRdWVyeUV4Y2VwdGlvbigpIHt9CisKKwkvKiogQ29uc3RydWN0IGEgcXVlcnkgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRldGFpbCBtZXNzYWdlLgorCSAqCisJICogQHBhcmFtIG1zZyBEZXRhaWwgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgUXVlcnlFeGNlcHRpb24oU3RyaW5nIG1zZykgeworCQlzdXBlcihtc2cpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUXVlcnlIZWFkZXIuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUXVlcnlIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMDNhYzNmCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeUhlYWRlci5qYXZhCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRvY3VtZW50YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLlhNTDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKiogSGVhZGVyIG9mIGEgcXVlcnkKKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeUhlYWRlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBEb2N1bWVudGFibGUgeworCS8qKiBDcmVhdGUgYSBibGFuayBxdWVyeSBoZWFkZXIuCisJICovCisJcHVibGljIFF1ZXJ5SGVhZGVyKCkgeworCQl0aGlzKC8qaWQqLyJVTktOT1dOIiwgLyp0aXRsZSovIlVOS05PV04iLCAvKmRlc2MqLyJVTktOT1dOIiwgLyp0eXBlKi8iUVVFUlkiLCAvKnN0YXR1cyovIkFDVElWRSIsCisJCQkvKnNlY3VyaXR5Ki8iVU5LTk9XTiIsIC8qcmV2Ki8iMTk5OS0xMi0xMiBKU0ggVjEuMCBVbmRlciBEZXZlbG9wbWVudCIsIC8qZGF0YWRpY3QqLyJVTktOT1dOIik7CisJfQorCisJLyoqIENyZWF0ZSBhIHF1ZXJ5IGhlYWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGlzIHF1ZXJ5LgorCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhpcyBxdWVyeS4KKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gQSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIHF1ZXJ5LgorCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBxdWVyeSwgdXN1YWxseSBRVUVSWS4KKwkgKiBAcGFyYW0gc3RhdHVzSUQgVGhlIHN0YXR1cyBvZiB0aGUgcXVlcnkuCisJICogQHBhcmFtIHNlY3VyaXR5VHlwZSBUaGUgdHlwZSBvZiBzZWN1cml0eSB0byBhcHBseSB0byB0aGlzIHF1ZXJ5LgorCSAqIEBwYXJhbSByZXZpc2lvbk5vdGUgQSBub3RlIGFib3V0IHRoZSByZXZpc2lvbiBoaXN0b3J5IG9mIHRoaXMgcXVlcnkuCisJICogQHBhcmFtIGRhdGFEaWN0SUQgVGhlIElEIG9mIHRoZSBkYXRhIGRpY3Rpb25hcnkgdXNlZCBieSB0aGlzIHF1ZXJ5LgorCSAqLworCXB1YmxpYyBRdWVyeUhlYWRlcihTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHN0YXR1c0lELCBTdHJpbmcgc2VjdXJpdHlUeXBlLAorCQlTdHJpbmcgcmV2aXNpb25Ob3RlLCBTdHJpbmcgZGF0YURpY3RJRCkgeworCQl0aGlzLmlkICAgICAgICAgICA9IGlkOworCQl0aGlzLnRpdGxlICAgICAgICA9IHRpdGxlOworCQl0aGlzLmRlc2NyaXB0aW9uICA9IGRlc2NyaXB0aW9uOworCQl0aGlzLnR5cGUgICAgICAgICA9IHR5cGU7CisJCXRoaXMuc3RhdHVzSUQgICAgID0gc3RhdHVzSUQ7CisJCXRoaXMuc2VjdXJpdHlUeXBlID0gc2VjdXJpdHlUeXBlOworCQl0aGlzLnJldmlzaW9uTm90ZSA9IHJldmlzaW9uTm90ZTsKKwkJdGhpcy5kYXRhRGljdElEICAgPSBkYXRhRGljdElEOworCX0KKworCS8qKiBDcmVhdGUgYSBxdWVyeSBoZWFkZXIgZnJvbSBhbiBYTUwgbm9kZS4KKwkgKgorCSAqIEBwYXJhbSBub2RlIFRoZSAmbHQ7cXVlcnlBdHRyaWJ1dGVzJmd0OyBub2RlLgorCSAqLworCXB1YmxpYyBRdWVyeUhlYWRlcihOb2RlIG5vZGUpIHsKKwkJaWYgKCEicXVlcnlBdHRyaWJ1dGVzIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlF1ZXJ5SGVhZGVyIG11c3QgYmUgY29uc3RydWN0ZWQgZnJvbSA8cXVlcnlBdHRyaWJ1dGVzPiBub2RlLCBub3QgPCIKKwkJCQkrIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+Iik7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoInF1ZXJ5SWQiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQlpZCA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJxdWVyeVRpdGxlIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJdGl0bGUgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgicXVlcnlEZXNjIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJZGVzY3JpcHRpb24gPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgicXVlcnlUeXBlIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJdHlwZSA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJxdWVyeVN0YXR1c0lkIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJc3RhdHVzSUQgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgicXVlcnlTZWN1cml0eVR5cGUiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQlzZWN1cml0eVR5cGUgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgicXVlcnlQYXJlbnRJZCIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKQorCQkJCTsgLy8gaWdub3JlCisJCQllbHNlIGlmICgicXVlcnlDaGlsZElkIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJOyAvLyBpZ25vcmUKKwkJCWVsc2UgaWYgKCJxdWVyeVJldmlzaW9uTm90ZSIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKQorCQkJCXJldmlzaW9uTm90ZSA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJxdWVyeURhdGFEaWN0SWQiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQlkYXRhRGljdElEID0gWE1MLnVud3JhcHBlZFRleHQoY2hpbGQpOworCQl9CisJfQorCisJLyoqIEdldCB0aGUgaWRlbnRpZmljYXRpb24gb2YgdGhpcyBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGlkZW50aWZpY2F0aW9uIG9mIHRoaXMgcXVlcnkuCisJICovCisJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworIAkvKioKKyAgICAgICAgICogR2V0IHRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGlzIHF1ZXJ5IGFzIGEgVVJJLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPlVSSTwvY29kZT4gdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVVJJIGdldFVSSUlEKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBVUkkuY3JlYXRlKGlkLnN0YXJ0c1dpdGgoInVybiIpPyBpZCA6ICJ1cm46b29kdDpxdWVyeToiICsgaWQpOworICAgICAgICB9CisKKworCS8qKiBHZXQgdGhlIHRpdGxlIG9mIHRoaXMgcXVlcnkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB0aXRsZSBvZiB0aGlzIHF1ZXJ5LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisJCXJldHVybiB0aXRsZTsKKwl9CisKKwkvKiogR2V0IGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gQSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIHF1ZXJ5LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKiogR2V0IHRoZSB0eXBlIG9mIHRoZSBxdWVyeSwgdXN1YWxseSBRVUVSWS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHF1ZXJ5LCB1c3VhbGx5IFFVRVJZLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHN0YXR1cyBvZiB0aGUgcXVlcnkuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXNJRCgpIHsKKwkJcmV0dXJuIHN0YXR1c0lEOworCX0KKworCS8qKiBHZXQgdGhlIHR5cGUgb2Ygc2VjdXJpdHkgdG8gYXBwbHkgdG8gdGhpcyBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHR5cGUgb2Ygc2VjdXJpdHkgdG8gYXBwbHkgdG8gdGhpcyBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNlY3VyaXR5VHlwZSgpIHsKKwkJcmV0dXJuIHNlY3VyaXR5VHlwZTsKKwl9CisKKwkvKiogR2V0IGEgbm90ZSBhYm91dCB0aGUgcmV2aXNpb24gaGlzdG9yeSBvZiB0aGlzIHF1ZXJ5LgorCSAqCisJICogQHJldHVybiBBIG5vdGUgYWJvdXQgdGhlIHJldmlzaW9uIGhpc3Rvcnkgb2YgdGhpcyBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJldmlzaW9uTm90ZSgpIHsKKwkJcmV0dXJuIHJldmlzaW9uTm90ZTsKKwl9CisKKwkvKiogR2V0IHRoZSBJRCBvZiB0aGUgZGF0YSBkaWN0aW9uYXJ5IHVzZWQgYnkgdGhpcyBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIElEIG9mIHRoZSBkYXRhIGRpY3Rpb25hcnkgdXNlZCBieSB0aGlzIHF1ZXJ5LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YURpY3RJRCgpIHsKKwkJcmV0dXJuIGRhdGFEaWN0SUQ7CisJfQorCisJLyoqIFNldCB0aGUgaWRlbnRpZmljYXRpb24gb2YgdGhpcyBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhpcyBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpIHsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCS8qKiBTZXQgdGhlIHRpdGxlIG9mIHRoaXMgcXVlcnkuCisJICoKKwkgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoaXMgcXVlcnkuCisJICovCisJcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisJCXRoaXMudGl0bGUgPSB0aXRsZTsKKwl9CisKKwkvKiogU2V0IGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgcXVlcnkuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKiogU2V0IHRoZSB0eXBlIG9mIHRoZSBxdWVyeSwgdXN1YWxseSBRVUVSWS4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBxdWVyeSwgdXN1YWxseSBRVUVSWS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJLyoqIFNldCB0aGUgc3RhdHVzIG9mIHRoZSBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBzdGF0dXNJRCBUaGUgc3RhdHVzIG9mIHRoZSBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNJRChTdHJpbmcgc3RhdHVzSUQpIHsKKwkJdGhpcy5zdGF0dXNJRCA9IHN0YXR1c0lEOworCX0KKworCS8qKiBTZXQgdGhlIHR5cGUgb2Ygc2VjdXJpdHkgdG8gYXBwbHkgdG8gdGhpcyBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBzZWN1cml0eVR5cGUgVGhlIHR5cGUgb2Ygc2VjdXJpdHkgdG8gYXBwbHkgdG8gdGhpcyBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWN1cml0eVR5cGUoU3RyaW5nIHNlY3VyaXR5VHlwZSkgeworCQl0aGlzLnNlY3VyaXR5VHlwZSA9IHNlY3VyaXR5VHlwZTsKKwl9CisKKwkvKiogU2V0IGEgbm90ZSBhYm91dCB0aGUgcmV2aXNpb24gaGlzdG9yeSBvZiB0aGlzIHF1ZXJ5LgorCSAqCisJICogQHBhcmFtIHJldmlzaW9uTm90ZSBBIG5vdGUgYWJvdXQgdGhlIHJldmlzaW9uIGhpc3Rvcnkgb2YgdGhpcyBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXZpc2lvbk5vdGUoU3RyaW5nIHJldmlzaW9uTm90ZSkgeworCQl0aGlzLnJldmlzaW9uTm90ZSA9IHJldmlzaW9uTm90ZTsKKwl9CisKKwkvKiogU2V0IHRoZSBJRCBvZiB0aGUgZGF0YSBkaWN0aW9uYXJ5IHVzZWQgYnkgdGhpcyBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBkYXRhRGljdElEIFRoZSBJRCBvZiB0aGUgZGF0YSBkaWN0aW9uYXJ5IHVzZWQgYnkgdGhpcyBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRhRGljdElEKFN0cmluZyBkYXRhRGljdElEKSB7CisJCXRoaXMuZGF0YURpY3RJRCA9IGRhdGFEaWN0SUQ7CisJfQorCisJcHVibGljIE5vZGUgdG9YTUwoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInF1ZXJ5QXR0cmlidXRlcyIpOworCQlYTUwuYWRkKHJvb3QsICJxdWVyeUlkIiwgZ2V0SUQoKSk7CisJCVhNTC5hZGQocm9vdCwgInF1ZXJ5VGl0bGUiLCBnZXRUaXRsZSgpKTsKKwkJWE1MLmFkZChyb290LCAicXVlcnlEZXNjIiwgZ2V0RGVzY3JpcHRpb24oKSk7CisJCVhNTC5hZGQocm9vdCwgInF1ZXJ5VHlwZSIsIGdldFR5cGUoKSk7CisJCVhNTC5hZGQocm9vdCwgInF1ZXJ5U3RhdHVzSWQiLCBnZXRTdGF0dXNJRCgpKTsKKwkJWE1MLmFkZChyb290LCAicXVlcnlTZWN1cml0eVR5cGUiLCBnZXRTZWN1cml0eVR5cGUoKSk7CisJCVhNTC5hZGQocm9vdCwgInF1ZXJ5UmV2aXNpb25Ob3RlIiwgZ2V0UmV2aXNpb25Ob3RlKCkpOworCQlYTUwuYWRkKHJvb3QsICJxdWVyeURhdGFEaWN0SWQiLCBnZXREYXRhRGljdElEKCkpOworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gZ2V0SUQoKS5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIFF1ZXJ5SGVhZGVyKSkgcmV0dXJuIGZhbHNlOworCQlRdWVyeUhlYWRlciBvYmogPSAoUXVlcnlIZWFkZXIpIHJoczsKKwkJcmV0dXJuIGdldElEKCkuZXF1YWxzKG9iai5nZXRJRCgpKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworCQlPYmplY3QgcmMgPSBudWxsOworCQl0cnkgeworCQkJcmMgPSBzdXBlci5jbG9uZSgpOworCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjYW50SGFwcGVuKSB7fQorCQlyZXR1cm4gcmM7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltpZD0iICsgaWQgKyAiXSI7CisJfQorCisJLyoqIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGlzIHF1ZXJ5LiAqLworCXByaXZhdGUgU3RyaW5nIGlkOworCisJLyoqIFRoZSB0aXRsZSBvZiB0aGlzIHF1ZXJ5LiAqLworCXByaXZhdGUgU3RyaW5nIHRpdGxlOworCisJLyoqIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBxdWVyeS4gKi8KKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCS8qKiBUaGUgdHlwZSBvZiB0aGUgcXVlcnksIHVzdWFsbHkgUVVFUlkuICovCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCS8qKiBUaGUgc3RhdHVzIG9mIHRoZSBxdWVyeS4gKi8KKwlwcml2YXRlIFN0cmluZyBzdGF0dXNJRDsKKworCS8qKiBUaGUgdHlwZSBvZiBzZWN1cml0eSB0byBhcHBseSB0byB0aGlzIHF1ZXJ5LiAqLworCXByaXZhdGUgU3RyaW5nIHNlY3VyaXR5VHlwZTsKKworCS8qKiBBIG5vdGUgYWJvdXQgdGhlIHJldmlzaW9uIGhpc3Rvcnkgb2YgdGhpcyBxdWVyeS4gKi8KKwlwcml2YXRlIFN0cmluZyByZXZpc2lvbk5vdGU7CisKKwkvKiogVGhlIElEIG9mIHRoZSBkYXRhIGRpY3Rpb25hcnkgdXNlZCBieSB0aGlzIHF1ZXJ5LiAqLworCXByaXZhdGUgU3RyaW5nIGRhdGFEaWN0SUQ7CisKKwkvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLworICAgICAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg2MDEyMjkyMzQ2OTY2NzA4MTZMOworfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeVJlc3VsdC5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyNjdiOTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1F1ZXJ5UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUmV0cmlldmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRG9jdW1lbnRhYmxlOworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKgorICogUmVzdWx0cyBvZiBhIHF1ZXJ5LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UmVzdWx0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIERvY3VtZW50YWJsZSB7CisJLyoqCisJICogQ3JlYXRlIGVtcHR5IHJlc3VsdHMuCisJICovCisJcHVibGljIFF1ZXJ5UmVzdWx0KCkgeworCQl0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIHJlc3VsdHMgZnJvbSB0aGUgZ2l2ZW4gbGlzdCBvZiByZXN1bHRzLgorCSAqCisJICogQHBhcmFtIGxpc3QgTGlzdCBvZiB7QGxpbmsgUmVzdWx0fXMuCisJICovCisJcHVibGljIFF1ZXJ5UmVzdWx0KExpc3QgbGlzdCkgeworCQl0aGlzLmxpc3QgPSBsaXN0OworCX0KKworCS8qKgorCSAqIENyZWF0ZSByZXN1bHRzIGZyb20gYW4gWE1MIG5vZGUuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBUaGUgJmx0O3F1ZXJ5UmVzdWx0U2V0Jmd0OyBub2RlLgorCSAqLworCXB1YmxpYyBRdWVyeVJlc3VsdChOb2RlIG5vZGUpIHsKKwkJaWYgKCEicXVlcnlSZXN1bHRTZXQiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUXVlcnlSZXN1bHQgbXVzdCBiZSBjb25zdHJ1Y3RlZCBmcm9tIDxxdWVyeVJlc3VsdFNldD4gbm9kZSwgbm90IDwiCisJCQkJKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIpOworCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpIHsKKwkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgInJlc3VsdEVsZW1lbnQiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQlsaXN0LmFkZChuZXcgUmVzdWx0KGNoaWxkKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGxpc3Qgb2YgcmVzdWx0cy4KKwkgKgorCSAqIEByZXR1cm4gQSBsaXN0IG9mIHtAbGluayBSZXN1bHR9cy4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgeworCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiBDbGVhciBvdXQgYW55IHJlc3VsdHMuCisJICovCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCWxpc3QuY2xlYXIoKTsKKwl9CisKKwlwdWJsaWMgTm9kZSB0b1hNTChEb2N1bWVudCBkb2MpIHRocm93cyBET01FeGNlcHRpb24geworCQlFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgicXVlcnlSZXN1bHRTZXQiKTsKKwkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCVJlc3VsdCByID0gKFJlc3VsdCkgaS5uZXh0KCk7CisJCQlyb290LmFwcGVuZENoaWxkKHIudG9YTUwoZG9jKSk7CisJCX0KKwkJcmV0dXJuIHJvb3Q7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOworCQlpZiAob2JqIGluc3RhbmNlb2YgUXVlcnlSZXN1bHQpIHsKKwkJCVF1ZXJ5UmVzdWx0IHJocyA9IChRdWVyeVJlc3VsdCkgb2JqOworCQkJcmV0dXJuIGxpc3QuZXF1YWxzKHJocy5saXN0KTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBzdXBlci5jbG9uZSgpOworCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjYW50SGFwcGVuKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBoYXBwZW5lZDogIiArIGNhbnRIYXBwZW4uZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbbGlzdD0iICsgbGlzdCArICJdIjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXRyaWV2ZXIoUmV0cmlldmVyIHJldHJpZXZlcikgeworCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUmVzdWx0IHIgPSAoUmVzdWx0KSBpLm5leHQoKTsKKwkJCXIuc2V0UmV0cmlldmVyKHJldHJpZXZlcik7CisJCX0KKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworCQlsb25nIHNpemUgPSAwOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUmVzdWx0IHIgPSAoUmVzdWx0KSBpLm5leHQoKTsKKwkJCXNpemUgKz0gci5nZXRTaXplKCk7CisJCX0KKwkJcmV0dXJuIHNpemU7CisJfQorCisJLyoqIExpc3Qgb2Yge0BsaW5rIFJlc3VsdH1zLiAqLworCXByaXZhdGUgTGlzdCBsaXN0OworCisJLyoqIFNlcmlhbCB2ZXJzaW9uIHVuaXF1ZSBJRC4gKi8KKwlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTE1NjAzMDkyNzA1MTIyNjg0OEw7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1Jlc3VsdC5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2FkN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9SZXN1bHQuamF2YQpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnppcC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5wcm9kdWN0LlJldHJpZXZlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKiBBIHNpbmdsZSByZXN1bHQuCisgKgorICogQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgYSByZXN1bHQgb2YgYSBxdWVyeS4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK3B1YmxpYyBjbGFzcyBSZXN1bHQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSwgRG9jdW1lbnRhYmxlIHsKKwkvKiogQ3JlYXRlIGEgbmV3LCBibGFuayByZXN1bHQuCisJICoKKwkgKiBUaGlzIGluaXRpYWxpemVzIHRoZSByZXN1bHQgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaW91cyBwcm9wZXJ0aWVzLgorCSAqLworCXB1YmxpYyBSZXN1bHQoKSB7CisJCXRoaXMoLyppZCovIlVOS05PV04iLCAvKm1pbWVUeXBlKi8iVU5LTk9XTiIsIC8qcHJvZmlsZUlkKi8iVU5LTk9XTiIsIC8qcmVzb3VyY2VJZCovIlVOS05PV04iLAorCQkJLypyZXN1bHRIZWFkZXIqLyBuZXcgQXJyYXlMaXN0KCksIC8qdmFsdWUqLyIiKTsKKwl9CisKKwkvKiogQ3JlYXRlIGEgcmVzdWx0LgorCSAqCisJICogSGVyZSwgeW91IHNwZWNpZnkgdGhlIHJlc3VsdCdzIElEIGFuZCB2YWx1ZSBvbmx5LgorCSAqCisJICogQHBhcmFtIGlkIElkZW50aWZpY2F0aW9uIG9mIHRoaXMgcmVzdWx0LgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgcmVzdWx0LgorCSAqLworCXB1YmxpYyBSZXN1bHQoU3RyaW5nIGlkLCBPYmplY3QgdmFsdWUpIHsKKwkJdGhpcyhpZCwgLyptaW1lVHlwZSovIlVOS05PV04iLCAvKnByb2ZpbGVJZCovIlVOS05PV04iLCAvKnJlc291cmNlSWQqLyJVTktOT1dOIiwKKwkJCS8qcmVzdWx0SGVhZGVyKi8gbmV3IEFycmF5TGlzdCgpLCB2YWx1ZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbW9yZSBmdWxseSBzcGVjaWZpZWQgcmVzdWx0IHRoYXQncyBub3QgY2xhc3NpZmllZCBhbmQgbGFzdHMgZm9yZXZlci4KKwkgKgorCSAqIEBwYXJhbSBpZCBJZGVudGlmaWNhdGlvbiBvZiB0aGlzIHJlc3VsdC4KKwkgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSBUeXBlLgorCSAqIEBwYXJhbSBwcm9maWxlSUQgSUQgb2YgdGhlIHJlc291cmNlIHByb2ZpbGUgd2hlcmUgdGhpcyByZXN1bHQgb3JpZ2luYXRlZC4KKwkgKiBAcGFyYW0gcmVzb3VyY2VJRCBJRCBvZiB0aGUgcmVzb3VyY2Ugd2hlcmUgdGhpcyByZXN1bHQgb3JpZ2luYXRlZC4KKwkgKiBAcGFyYW0gaGVhZGVycyBBIGhlYWRlciBlbGVtZW50cywgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgcmVzdWx0LgorCSAqLworCXB1YmxpYyBSZXN1bHQoU3RyaW5nIGlkLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBwcm9maWxlSUQsIFN0cmluZyByZXNvdXJjZUlELCBMaXN0IGhlYWRlcnMsIE9iamVjdCB2YWx1ZSkgeworCQl0aGlzKGlkLCBtaW1lVHlwZSwgcHJvZmlsZUlELCByZXNvdXJjZUlELCBoZWFkZXJzLCB2YWx1ZSwgLypjbGFzc2lmaWVkKi9mYWxzZSwgLyp2YWxpZGl0eSovSU5GSU5JVEUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIGZ1bGx5IHNwZWNpZmllZCByZXN1bHQuCisJICoKKwkgKiBAcGFyYW0gaWQgSWRlbnRpZmljYXRpb24gb2YgdGhpcyByZXN1bHQuCisJICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgVHlwZS4KKwkgKiBAcGFyYW0gcHJvZmlsZUlEIElEIG9mIHRoZSByZXNvdXJjZSBwcm9maWxlIHdoZXJlIHRoaXMgcmVzdWx0IG9yaWdpbmF0ZWQuCisJICogQHBhcmFtIHJlc291cmNlSUQgSUQgb2YgdGhlIHJlc291cmNlIHdoZXJlIHRoaXMgcmVzdWx0IG9yaWdpbmF0ZWQuCisJICogQHBhcmFtIGhlYWRlcnMgQSBoZWFkZXIgZWxlbWVudHMsIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHJlc3VsdC4KKwkgKiBAcGFyYW0gY2xhc3NpZmllZCBUcnVlIGlmIHRoaXMgcmVzdWx0IGlzIHNlY3JldCwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIEBwYXJhbSB2YWxpZGl0eSBUaW1lIGZvciBob3cgbG9uZyB0aGlzIHByb2R1Y3QgaXMgdmFsaWQgaW4gbWlsbGlzZWNvbmRzIG9yIHtAbGluayAjSU5GSU5JVEV9LgorCSAqLworCXB1YmxpYyBSZXN1bHQoU3RyaW5nIGlkLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBwcm9maWxlSUQsIFN0cmluZyByZXNvdXJjZUlELCBMaXN0IGhlYWRlcnMsIE9iamVjdCB2YWx1ZSwKKwkJYm9vbGVhbiBjbGFzc2lmaWVkLCBsb25nIHZhbGlkaXR5KSB7CisJCWlmICh2YWxpZGl0eSA8IDAgJiYgdmFsaWRpdHkgIT0gSU5GSU5JVEUpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWxpZGl0eSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgdGltZSBpbiBtaWxsaXNlY29uZHMgb3IgIgorCQkJCSsgIiBSZXN1bHQuSU5GSU5JVEUgdG8gaW5kaWNhdGUgbm8gZXhwaXJhdGlvbiIpOworCQlpZiAoIWNvZGVjcy5jb250YWluc0tleShtaW1lVHlwZSkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNSU1FIHR5cGUgXCIiICsgbWltZVR5cGUgKyAiXCIgdW5rbm93biIpOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBoZWFkZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJT2JqZWN0IGhlYWRlciA9IGkubmV4dCgpOworCQkJaWYgKCEoaGVhZGVyIGluc3RhbmNlb2YgSGVhZGVyKSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0IG9mIGhlYWRlcnMgZG9lc24ndCBjb250YWluIEhlYWRlciBvYmplY3QiKTsKKwkJfQorCisJCXRoaXMuaWQgICAgICAgICA9IGlkOworCQl0aGlzLm1pbWVUeXBlICAgPSBtaW1lVHlwZTsKKwkJdGhpcy5wcm9maWxlSUQgID0gcHJvZmlsZUlEOworCQl0aGlzLnJlc291cmNlSUQgPSByZXNvdXJjZUlEOworCQl0aGlzLmhlYWRlcnMgICAgPSBoZWFkZXJzOworCQl0aGlzLnZhbHVlICAgICAgPSB2YWx1ZTsKKwkJdGhpcy5jbGFzc2lmaWVkID0gY2xhc3NpZmllZDsKKwkJdGhpcy52YWxpZGl0eSAgID0gdmFsaWRpdHk7CisJfQorCisJLyoqIENyZWF0ZSBhIHJlc3VsdCBmcm9tIGEgRE9NIG5vZGUuCisJICoKKwkgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIG5vZGUsIHdoaWNoIG11c3QgYmUgYSAmbHQ7cmVzdWx0RWxlbWVudCZndDsgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgUmVzdWx0KE5vZGUgbm9kZSkgeworCQlpZiAoISJyZXN1bHRFbGVtZW50Ii5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc3VsdCBtdXN0IGJlIGNvbnN0cnVjdGVkIGZyb20gPHJlc3VsdEVsZW1lbnQ+IG5vZGUsIG5vdCA8IgorCQkJCSsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iKTsKKwkJRWxlbWVudCByb290RWxlbWVudCA9IChFbGVtZW50KSBub2RlOworCQljbGFzc2lmaWVkID0gInRydWUiLmVxdWFscyhyb290RWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzaWZpZWQiKSk7CisJCXZhbGlkaXR5ID0gTG9uZy5wYXJzZUxvbmcocm9vdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2YWxpZGl0eSIpKTsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJU3RyaW5nIGVuY29kZWRWYWx1ZSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoInJlc3VsdElkIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJaWQgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgicmVzdWx0TWltZVR5cGUiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQltaW1lVHlwZSA9IFhNTC51bndyYXBwZWRUZXh0KGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJwcm9mSWQiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkKKwkJCQlwcm9maWxlSUQgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgiaWRlbnRpZmllciIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKQorCQkJCXJlc291cmNlSUQgPSBYTUwudW53cmFwcGVkVGV4dChjaGlsZCk7CisJCQllbHNlIGlmICgicmVzdWx0SGVhZGVyIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCisJCQkJaGVhZGVycyA9IEhlYWRlci5jcmVhdGVIZWFkZXJzKGNoaWxkKTsKKwkJCWVsc2UgaWYgKCJyZXN1bHRWYWx1ZSIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJQ29kZWMgY29kZWMgPSAoQ29kZWMpIGNvZGVjcy5nZXQobWltZVR5cGUpOworCQkJCWlmIChjb2RlYyA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gTUlNRSB0eXBlIFwiIiArIG1pbWVUeXBlCisJCQkJCQkrICJcIiBpbiA8cmVzdWx0RWxlbWVudD4ncyA8cmVzdWx0TWltZVR5cGU+Iik7CisJCQkJdHJ5IHsKKwkJCQkJdmFsdWUgPSBjb2RlYy5kZWNvZGUoY2hpbGQpOworCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKwkJCQkJdGhyb3cgZXg7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBlbmNvZGluZyBvZiAiICsgbWltZVR5cGUgKyAiIG9iamVjdCIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKiBHZXQgdGhlIHJlc3VsdCBJRC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGlkZW50aWZpY2F0aW9uIG9mIHRoaXMgcmVzdWx0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwlwdWJsaWMgVVJJIGdldFVSSUlEKCkgeworCQlyZXR1cm4gVVJJLmNyZWF0ZShpZC5zdGFydHNXaXRoKCJ1cm4iKT8gaWQgOiAidXJuOmVkYTpyZXN1bHQ6dW5zcGVjOiIgKyBpZCk7CisJfQorCisJLyoqIEdldCB0aGUgTUlNRSB0eXBlIG9mIHRoaXMgcmVzdWx0LgorCSAqCisJICogQHJldHVybiBUaGUgTUlNRSB0eXBlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisJCXJldHVybiBtaW1lVHlwZTsKKwl9CisKKwkvKiogR2V0IHRoZSBwcm9maWxlIElELgorCSAqCisJICogQHJldHVybiBUaGUgSUQgb2YgdGhlIHJlc291cmNlIHByb2ZpbGUgd2hlcmUgdGhpcyByZXN1bHQgb3JpZ2luYXRlZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJRCgpIHsKKwkJcmV0dXJuIHByb2ZpbGVJRDsKKwl9CisKKwkvKiogR2V0IHRoZSByZXNvdXJjZSBJRC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIElEIG9mIHRoZSByZXNvdXJjZSB3aGVyZSB0aGlzIHJlc3VsdCBvcmlnaW5hdGVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VJRCgpIHsKKwkJcmV0dXJuIHJlc291cmNlSUQ7CisJfQorCisJLyoqIEdldCB0aGUgaGVhZGVycy4KKwkgKgorCSAqIEByZXR1cm4gQSBsaXN0IG9mIHtAbGluayBIZWFkZXJ9cyBkZXNjcmliaW5nIHRoZSByZXN1bHQuCisJICovCisJcHVibGljIExpc3QgZ2V0SGVhZGVycygpIHsKKwkJcmV0dXJuIGhlYWRlcnM7CisJfQorCisJLyoqIEdldCB0aGUgcmVzdWx0J3MgdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXN1bHQgaW5zdGFuY2UuCisJICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBrbm93IHRoZSByZXR1cm4gdHlwZSBhbmQgdG8KKwkgKiBkb3duY2FzdCB0byBpdDsgZnVydGhlciwgdGhlIHJlc3VsdCBtYXkgYmUgdG9vIGxhcmdlIHRvIGNvbnRhaW4gaW4gbWVtb3J5LiAgVXNlCisJICoge0BsaW5rICNnZXRJbnB1dFN0cmVhbX0gaW5zdGVhZCB0byBwZXJmb3JtIHN0cmVhbSBwcm9jZXNzaW5nIG9uIHByb2R1Y3QgZGF0YS4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqIFNldCB0aGUgcmVzdWx0IElELgorCSAqCisJICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGlzIHJlc3VsdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpIHsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCS8qKiBTZXQgdGhlIE1JTUUgdHlwZSBvZiB0aGlzIHJlc3VsdC4KKwkgKgorCSAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgTUlNRSB0eXBlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworCQl0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisJfQorCisJLyoqIFNldCB0aGUgcHJvZmlsZSBJRC4KKwkgKgorCSAqIEBwYXJhbSBwcm9maWxlSUQgVGhlIElEIG9mIHRoZSByZXNvdXJjZSBwcm9maWxlIHdoZXJlIHRoaXMgcmVzdWx0IG9yaWdpbmF0ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvZmlsZUlEKFN0cmluZyBwcm9maWxlSUQpIHsKKwkJdGhpcy5wcm9maWxlSUQgPSBwcm9maWxlSUQ7CisJfQorCisJLyoqIFNldCB0aGUgcmVzb3VyY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gcmVzb3VyY2VJRCBUaGUgSUQgb2YgdGhlIHJlc291cmNlIHdoZXJlIHRoaXMgcmVzdWx0IG9yaWdpbmF0ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJRChTdHJpbmcgcmVzb3VyY2VJRCkgeworCQl0aGlzLnJlc291cmNlSUQgPSByZXNvdXJjZUlEOworCX0KKworCS8qKiBTZXQgdGhlIHJlc3VsdCdzIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSByZXN1bHQgaW5zdGFuY2UuCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBwcm9kdWN0LgorCSAqCisJICogQHJldHVybiBTaXplIGluIGJ5dGVzLgorCSAqLworCXB1YmxpYyBsb25nIGdldFNpemUoKSB7CisJCUNvZGVjIGNvZGVjID0gKENvZGVjKSBjb2RlY3MuZ2V0KG1pbWVUeXBlKTsKKwkJaWYgKGNvZGVjID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGNvZGVjIGF2YWlsYWJsZSBmb3Igc3VwcG9zZWRseSB2YWxpZCBNSU1FIHR5cGUgXCIiCisJCQkrIG1pbWVUeXBlICsgIlwiIik7CisJCXJldHVybiBjb2RlYy5zaXplT2YodmFsdWUpOworCX0KKworCXB1YmxpYyBOb2RlIHRvWE1MKERvY3VtZW50IGRvYykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCUVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJyZXN1bHRFbGVtZW50Iik7CisJCXJvb3Quc2V0QXR0cmlidXRlKCJjbGFzc2lmaWVkIiwgU3RyaW5nLnZhbHVlT2YoY2xhc3NpZmllZCkpOworCQlyb290LnNldEF0dHJpYnV0ZSgidmFsaWRpdHkiLCBTdHJpbmcudmFsdWVPZih2YWxpZGl0eSkpOworCQlYTUwuYWRkKHJvb3QsICJyZXN1bHRJZCIsIGlkKTsKKwkJWE1MLmFkZChyb290LCAicmVzdWx0TWltZVR5cGUiLCBtaW1lVHlwZSk7CisJCVhNTC5hZGQocm9vdCwgInByb2ZJZCIsIHByb2ZpbGVJRCk7CisJCVhNTC5hZGQocm9vdCwgImlkZW50aWZpZXIiLCByZXNvdXJjZUlEKTsKKwkJRWxlbWVudCByZXN1bHRIZWFkZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgicmVzdWx0SGVhZGVyIik7CisJCXJvb3QuYXBwZW5kQ2hpbGQocmVzdWx0SGVhZGVyKTsKKwkJZm9yIChJdGVyYXRvciBpID0gaGVhZGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCUhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBpLm5leHQoKTsKKwkJCXJlc3VsdEhlYWRlci5hcHBlbmRDaGlsZChoZWFkZXIudG9YTUwoZG9jKSk7CisJCX0KKwkJQ29kZWMgY29kZWMgPSAoQ29kZWMpIGNvZGVjcy5nZXQobWltZVR5cGUpOworCQlpZiAoY29kZWMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gY29kZWMgYXZhaWxhYmxlIGZvciBzdXBwb3NlZGx5IHZhbGlkIE1JTUUgdHlwZSBcIiIKKwkJCSsgbWltZVR5cGUgKyAiXCIiKTsKKwkJcm9vdC5hcHBlbmRDaGlsZChjb2RlYy5lbmNvZGUodmFsdWUsIGRvYykpOworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwkvKioKKwkgKiBHZXQgYW4gaW5wdXQgc3RyZWFtIHZlcnNpb24gb2YgdGhlIHJlc3VsdCdzIHZhbHVlLgorCSAqCisJICogQHJldHVybiBhbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gdmFsdWUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisJICovCisJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29kZWMgY29kZWMgPSAoQ29kZWMpIGNvZGVjcy5nZXQobWltZVR5cGUpOworCQlpZiAoY29kZWMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gY29kZWMgYXZhaWxhYmxlIGZvciBhbGxlZ2VkbHkgdmFsaWQgTUlNRSB0eXBlIFwiIgorCQkJKyBtaW1lVHlwZSArICJcIiIpOworCQlyZXR1cm4gY29kZWMuZ2V0SW5wdXRTdHJlYW0odmFsdWUpOworCX0KKworCS8qKgorCSAqIElzIHRoaXMgcmVzdWx0IGNsYXNzaWZpZWQ/CisJICoKKwkgKiBAcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzaWZpZWQoKSB7CisJCXJldHVybiBjbGFzc2lmaWVkOworCX0KKworCS8qKgorCSAqIFNldCB3aGV0aGVyIHRoaXMgcmVzdWx0IGlzIGNsYXNzaWZpZWQuCisJICoKKwkgKiBAcGFyYW0gY2xhc3NpZmllZCBhIGJvb2xlYW4gdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0Q2xhc3NpZmllZChib29sZWFuIGNsYXNzaWZpZWQpIHsKKwkJdGhpcy5jbGFzc2lmaWVkID0gY2xhc3NpZmllZDsKKwl9CisKKwkvKioKKwkgKiBHZXQgaG93IGxvbmcgdGhpcyBwcm9kdWN0IGlzIHZhbGlkLgorCSAqCisJICogQHJldHVybiBUaW1lIGluIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgI0lORklOSVRFfS4KKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRWYWxpZGl0eSgpIHsKKwkJcmV0dXJuIHZhbGlkaXR5OworCX0KKworCS8qKgorCSAqIFNldCB0aGUgdGltZSB0aGlzIHByb2R1Y3QgaXMgdmFsaWQuCisJICoKKwkgKiBAcGFyYW0gdmFsaWRpdHkgVGltZSBpbiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rICNJTkZJTklURX0uCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsaWRpdHkobG9uZyB2YWxpZGl0eSkgeworCQl0aGlzLnZhbGlkaXR5ID0gdmFsaWRpdHk7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGlkLmhhc2hDb2RlKCkgXiBtaW1lVHlwZS5oYXNoQ29kZSgpIF4gcHJvZmlsZUlELmhhc2hDb2RlKCkgXiByZXNvdXJjZUlELmhhc2hDb2RlKCkgXiBoZWFkZXJzLmhhc2hDb2RlKCkKKwkJCV4gdmFsdWUuaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgeworCQlpZiAocmhzID09IHRoaXMpIHJldHVybiB0cnVlOworCQlpZiAocmhzID09IG51bGwgfHwgIShyaHMgaW5zdGFuY2VvZiBSZXN1bHQpKSByZXR1cm4gZmFsc2U7CisJCVJlc3VsdCBvYmogPSAoUmVzdWx0KSByaHM7CisJCXJldHVybiBpZC5lcXVhbHMob2JqLmlkKSAmJiBtaW1lVHlwZS5lcXVhbHMob2JqLm1pbWVUeXBlKSAmJiBwcm9maWxlSUQuZXF1YWxzKG9iai5wcm9maWxlSUQpCisJCQkmJiByZXNvdXJjZUlELmVxdWFscyhvYmoucmVzb3VyY2VJRCkgJiYgaGVhZGVycy5lcXVhbHMob2JqLmhlYWRlcnMpICYmIHZhbHVlLmVxdWFscyhvYmoudmFsdWUpOworCX0KKworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisJCU9iamVjdCByYyA9IG51bGw7CisJCXRyeSB7CisJCQlyYyA9IHN1cGVyLmNsb25lKCk7CisJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNhbnRIYXBwZW4pIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB0aHJvd24gZm9yIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBDbG9uZWFibGU6ICIKKwkJCQkrIGNhbnRIYXBwZW4uZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmV0cmlldmVyKFJldHJpZXZlciByZXRyaWV2ZXIpIHsKKwkJaWYgKHJldHJpZXZlciA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXRyaWV2ZXIgbXVzdCBiZSBub24tbnVsbCIpOworCQlpZiAodGhpcy5yZXRyaWV2ZXIgPT0gbnVsbCkgdGhpcy5yZXRyaWV2ZXIgPSByZXRyaWV2ZXI7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltpZD0iICsgZ2V0SUQoKSArICIsbWltZVR5cGU9IiArIGdldE1pbWVUeXBlKCkgKyAiLHByb2ZpbGVJRD0iICsgZ2V0UHJvZmlsZUlEKCkKKwkJCSsgIixyZXNvdXJjZUlEPSIgKyBnZXRSZXNvdXJjZUlEKCkgKyAiLHZhbHVlPSIgKyBnZXRWYWx1ZSgpICsgIl0iOworCX0KKworCS8qKiBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhpcyByZXN1bHQuICovCisJcHJvdGVjdGVkIFN0cmluZyBpZDsKKworCS8qKiBUaGUgTUlNRSB0eXBlLiAqLworCXByb3RlY3RlZCBTdHJpbmcgbWltZVR5cGU7CisKKwkvKiogVGhlIElEIG9mIHRoZSByZXNvdXJjZSBwcm9maWxlIHdoZXJlIHRoaXMgcmVzdWx0IG9yaWdpbmF0ZWQuICovCisJcHJpdmF0ZSBTdHJpbmcgcHJvZmlsZUlEOworCisJLyoqIFRoZSBJRCBvZiB0aGUgcmVzb3VyY2Ugd2hlcmUgdGhpcyByZXN1bHQgb3JpZ2luYXRlZC4gKi8KKwlwcml2YXRlIFN0cmluZyByZXNvdXJjZUlEOworCisJLyoqIFRoZSBoZWFkZXJzIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4gKi8KKwlwcml2YXRlIExpc3QgaGVhZGVyczsKKworCS8qKiBUaGUgcmVzdWx0IGluc3RhbmNlLiAqLworCXByb3RlY3RlZCBPYmplY3QgdmFsdWU7CisKKwkvKiogVHJ1ZSBpZiB0aGlzIHByb2R1Y3QgaXMgY2xhc3NpZmllZC4gKi8KKwlwcml2YXRlIGJvb2xlYW4gY2xhc3NpZmllZDsKKworCS8qKiBGb3IgaG93IGxvbmcgdGhlIHByb2R1Y3QncyBnb29kLiAqLworCXByaXZhdGUgbG9uZyB2YWxpZGl0eTsKKworCS8qKiBNYXBwaW5nIG9mIE1JTUUgdHlwZSB0byBjb2RlYy4gKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE1hcCBjb2RlY3M7CisKKwkvKiogT2JqZWN0IHRvIHJldHJpZXZlIHRoaXMgcHJvZHVjdCdzIGRhdGEuICovCisJcHJvdGVjdGVkIHRyYW5zaWVudCBSZXRyaWV2ZXIgcmV0cmlldmVyOworCisJLyoqIEluaXRpYWxpemUgdGhlIHNldCBvZiB2YWxpZCBNSU1FIHR5cGVzLiAqLworCXN0YXRpYyB7CisJCWNvZGVjcyA9IG5ldyBIYXNoTWFwKCk7CisJCXRyeSB7CisJCQlqYXZhLmlvLklucHV0U3RyZWFtIGlucCA9IFJlc3VsdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtaW1lLnByb3BlcnRpZXMiKTsKKwkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnApOworCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCQlwcm9wcy5sb2FkKGluKTsKKwkJCWluLmNsb3NlKCk7CisJCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworCQkJCWNvZGVjcy5wdXQoZW50cnkuZ2V0S2V5KCksIENvZGVjRmFjdG9yeS5jcmVhdGVDb2RlYygoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKSk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkkvTyBleGNlcHRpb24gV0hJTEUgcmVhZGluZyBtaW1lLnByb3BlcnRpZXM6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHZhbGlkIE1JTUUgdHlwZXMgd2lsbCBiZSByZWNvZ25pemVkIGJ5IGNsYXNzIFJlc3VsdCIpOworCQl9CisKKwkJLy8gQWRkIG91ciBvd24gc3BlY2lhbCBNSU1FIHR5cGU6CisJCWNvZGVjcy5wdXQoIlVOS05PV04iLENvZGVjRmFjdG9yeS5jcmVhdGVDb2RlYygib3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYyIpKTsKKwl9CisKKwkvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLworCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5MTY5MTQzOTQ0MTkxMjM5NTc1TDsKKworCS8qKiBTZW50aW5lbCB2YWx1ZSBmb3IgdmFsaWRpdHkgdGhhdCBpbmRpY2F0ZXMgYSBwcm9kdWN0IG5ldmVyIGV4cGlyZXMuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElORklOSVRFID0gLTE7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1Jlc3VsdHMuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUmVzdWx0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5Y2YzOWMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1Jlc3VsdHMuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuKjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIFJlc3VsdHMKKyoqCisqKiBUaGlzIHdpbGwgbWFuYWdlIGEgbGlzdCBvZiByZXN1bHRzCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcHVibGljIGNsYXNzIFJlc3VsdHMKK3sKKyAgICBWZWN0b3IgdjsKKworICAgIHB1YmxpYyBSZXN1bHRzKCkKKyAgICB7CisKKyAgICAgICAgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkSXRlbShPYmplY3QgbykKKyAgICB7CisgICAgICAgIHYuYWRkRWxlbWVudChvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSXRlbShpbnQgaSkKKyAgICB7CisgICAgICAgIHYucmVtb3ZlRWxlbWVudEF0KGkpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybih2LnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0SXRlbShpbnQgaSkKKyAgICB7CisgICAgICAgIHJldHVybigoT2JqZWN0KSB2LmVsZW1lbnRBdChpKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1N0YXRpc3RpYy5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9TdGF0aXN0aWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzA2YmEyCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9TdGF0aXN0aWMuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKglFRE0gU3RhdGlzdGljIENsYXNzCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLkRPTVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworCisvKioKKyAqIEVETSBTdGF0aXN0aSBjbGFzcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0aXN0aWMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIAoreworICAgICAgICAvKiogU2VyaWFsIHZlcnNpb24gdW5pcXVlIElELiAqLworICAgICAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODYxMTI3OTc1NTY4MjczNjA2Mkw7CisJCisgICAgICAgIC8qKiBVUkwuICovCisJcHJpdmF0ZSBTdHJpbmcgdXJsOworCisJLyoqIFRpbWUuICovCisJcHJpdmF0ZSBsb25nIHRpbWU7CisKKwlwdWJsaWMgU3RhdGlzdGljKCkKKyAgICAgICAgeworCQl1cmwgPSBuZXcgU3RyaW5nKCJVTktOT1dOIik7CisJCXRpbWUgPSAwOworCX0KKworCS8qKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB1cmwgIFRoZSBzZXJ2ZXIncyBVUkwuIAorCSAqIEBwYXJhbSB0aW1lIFRoZSBzZWFyY2ggdGltZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgaW5kaWN0ZWQgYnkgdXJsLgorICAgICAgICAgKi8KKwlwdWJsaWMgU3RhdGlzdGljKFN0cmluZyB1cmwsIGxvbmcgdGltZSkgCisJeworCQl0aGlzLnVybD11cmw7CisJCXRoaXMudGltZT0gdGltZTsKKwl9CisKKyAgICAgICAgIC8qKgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYW4gU3RhdGlzdGljIGluc3RhbmNlIGZyb20gYW4gU3RhdGlzdGljIHN0cnVjdHVyZSBpbiBET00gbm9kZSBmb3JtYXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb290ICBUaGUgRE9NIG5vZGUuCisgICAgICAgICAqLworCXB1YmxpYyBTdGF0aXN0aWMoTm9kZSByb290KQorCXsKKwkJTm9kZSBub2RlOworCSAgICAgICAgU3RyaW5nIG5vZGVOYW1lOworCisJICAgICAgICBmb3IgKG5vZGUgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIAkJbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQorICAgICAgICAJeworICAgICAgICAgICAgICAgIAlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgCQlpZiAobm9kZU5hbWUuY29tcGFyZVRvKCJ1cmwiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgCSAgIHVybCA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworICAgICAgICAgICAgICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCQlpZiAobm9kZU5hbWUuY29tcGFyZVRvKCJ0aW1lIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAkgICB0aW1lID0gTG9uZy5wYXJzZUxvbmcoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgCX0KKyAgIAl9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBkb2MgVGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IG9iamVjdC4KKyAgICAgICAgICovCisJcHVibGljIHN5bmNocm9uaXplZCBOb2RlIHRvWE1MKERvY3VtZW50IGRvYykgdGhyb3dzIERPTUV4Y2VwdGlvbgorICAJeworICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdGF0aXN0aWMiKTsKKyAgICAgICAgICAgICAgICBYTUwuYWRkKHJvb3QsICJ1cmwiLCB1cmwpOworICAgICAgICAgICAgICAgIFhNTC5hZGQocm9vdCwgInRpbWUiLCAiIit0aW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIFVSTCBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIFVSTCBzdHJpbmcuCisgICAgICAgICAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFVSTCAoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHNlYXJjaCB0aW1lCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRpbWUKKyAgICAgICAgICovCisJcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFRpbWUoKQorCXsKKwkJcmV0dXJuIHRpbWU7CisJfQorCQorCS8qKgorICAgICAgICAgKiBTZXRzIHRoZSBzZWFyY2ggdGltZSAgICAgICAgICovICAgICAgICAgICAgICAKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWUobG9uZyB0aW1lKQorICAgICAgICB7CisJCSB0aGlzLnRpbWU9IHRpbWU7CisgICAgICAgIH0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0YXRpc3RpYyBzdGEgPSBuZXcgU3RhdGlzdGljKCJERE0iLCAxMjAwKTsJLy8gdGVzdCBjb25zdHJ1Y3RvciAyCisJCVN5c3RlbS5lcnIucHJpbnRsbigiUHJvZmlsZSBTZXJ2ZXI6IitzdGEuZ2V0VVJMKCkpOworCQlTeXN0ZW0uZXJyLnByaW50bG4oIlNlYXJjaCB0aW1lOiIrc3RhLmdldFRpbWUoKSk7CisJCVN0YXRpc3RpYyBzdGExID0gbmV3IFN0YXRpc3RpYygpOwkJLy8gdGVzdCBjb25zdHJ1Y3QgMQorCQlTeXN0ZW0uZXJyLnByaW50bG4oIlByb2ZpbGUgU2VydmVyOiIrc3RhMS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZWFyY2ggdGltZToiK3N0YTEuZ2V0VGltZSgpKTsKKwkJCisJCS8vIGNyZWF0ZSBhIGRvY3VtZW50CisJCURvY3VtZW50IGRvYyA9IFhNTC5jcmVhdGVEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIEVsZW1lbnQgU3RhdGlzdGljTm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJTdGF0aXN0aWMiKTsKKyAgICAgICAgICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoU3RhdGlzdGljTm9kZSk7CisJCVhNTC5hZGQoU3RhdGlzdGljTm9kZSwgInVybCIsICJETUlFIik7CisJCVhNTC5hZGQoU3RhdGlzdGljTm9kZSwgInRpbWUiLCAiIisyMDAwKTsKKworCisJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsJLy90ZXN0IGNvbnN0cnVjdG9yIDMKKwkJU3RhdGlzdGljIHN0YTIgPSBuZXcgU3RhdGlzdGljKHJvb3QpOwkKKwkJU3lzdGVtLmVyci5wcmludGxuKCJQcm9maWxlIFNlcnZlcjoiK3N0YTIuZ2V0VVJMKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VhcmNoIHRpbWU6IitzdGEyLmdldFRpbWUoKSk7CisKKworCQkvL3Rlc3QgdG9YTUwoKQorCQlOb2RlIHJvb3QxID0gc3RhMi50b1hNTChkb2MpOworCQlTdGF0aXN0aWMgc3RhMyA9IG5ldyBTdGF0aXN0aWMocm9vdDEpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUHJvZmlsZSBTZXJ2ZXI6IitzdGEzLmdldFVSTCgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlYXJjaCB0aW1lOiIrc3RhMy5nZXRUaW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvU3RyaW5nQ29kZWMuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvU3RyaW5nQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MzcxM2QzCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9TdHJpbmdDb2RlYy5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC56aXAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworLyoqIEEgcmVzdWx0IGVuY29kZXIvZGVjb2RlciBmb3Igc3RyaW5ncy4KKyAqCisgKiBUaGlzIGNvZGVjIHVzZXMgYSBzdHJpbmcgZm9ybWF0IGZvciBvYmplY3RzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLworY2xhc3MgU3RyaW5nQ29kZWMgaW1wbGVtZW50cyBDb2RlYyB7CisJcHVibGljIE5vZGUgZW5jb2RlKE9iamVjdCBvYmplY3QsIERvY3VtZW50IGRvYykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCUVsZW1lbnQgdmFsdWUgPSBkb2MuY3JlYXRlRWxlbWVudCgicmVzdWx0VmFsdWUiKTsKKwkJdmFsdWUuc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKKwkJdmFsdWUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKG9iamVjdC50b1N0cmluZygpKSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGRlY29kZShOb2RlIG5vZGUpIHsKKwkJcmV0dXJuIFhNTC50ZXh0KG5vZGUpOworCX0KKworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShPYmplY3QgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKChTdHJpbmcpIHZhbHVlKS5nZXRCeXRlcygpKTsKKwl9CisKKwlwdWJsaWMgbG9uZyBzaXplT2YoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gKChTdHJpbmcpIG9iamVjdCkuZ2V0Qnl0ZXMoKS5sZW5ndGg7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9VbnN1cHBvcnRlZE1pbWVUeXBlQ29kZWMuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWFmZThlNAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvVW5zdXBwb3J0ZWRNaW1lVHlwZUNvZGVjLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworLyoqIEEgcmVzdWx0IGVuY29kZXIvZGVjb2RlciBmb3IgdW5zdXBwb3J0ZWQgTUlNRSB0eXBlcy4KKyAqCisgKiBUaGlzIGNvZGVjIHRocm93cyA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT5zIG9uIGFueSBlbmNvZGluZyBvcgorICogZGVjb2RpbmcgYXR0ZW1wdC4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8KK2NsYXNzIFVuc3VwcG9ydGVkTWltZVR5cGVDb2RlYyBpbXBsZW1lbnRzIENvZGVjIHsKKwlwdWJsaWMgTm9kZSBlbmNvZGUoT2JqZWN0IG9iamVjdCwgRG9jdW1lbnQgZG9jKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTUlNRSB0eXBlIG5vdCBzdXBwb3J0ZWQgZm9yIGVuY29kaW5nIik7CisJfQorCXB1YmxpYyBPYmplY3QgZGVjb2RlKE5vZGUgbm9kZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1JTUUgdHlwZSBub3Qgc3VwcG9ydGVkIGZvciBkZWNvZGluZyIpOworCX0KKwlwdWJsaWMgbG9uZyBzaXplT2YoT2JqZWN0IG9iamVjdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1JTUUgdHlwZSBub3Qgc3VwcG9ydGVkIGZvciBzaXppbmciKTsKKwl9CisJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKE9iamVjdCBvYmplY3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNSU1FIHR5cGUgbm90IHN1cHBvcnRlZCBmb3Igc3RyZWFtaW5nIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9YTUxRdWVyeS5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9YTUxRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2M2U4NDAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1hNTFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw5NjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisJRURBIFhNTCBRdWVyeSBDbGFzcworICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyZWFtVG9rZW5pemVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnByb2R1Y3QuUmV0cmlldmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuRW50ZXJwcmlzZUVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuWE1MOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5UZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBFREEgWE1MIHF1ZXJ5IGNsYXNzLiBQYXJzZXMgYSBESVMgc3R5bGUga2V5d29yZCBxdWVyeSBhbmQgY3JlYXRlcyBxdWVyeSAKKyAqIFNFTEVDVCwgRlJPTSwgYW5kIFdIRVJFIGNsYXVzZXMuIEFuIFhNTCBET00gc3RydWN0dXJlIGFuZCBhbiBYTUwgZG9jdW1lbnQKKyAqIHJlcHJlc2VudGluZyB0aGUgcXVlcnkgY2FuIGFsc28gYmUgY3JlYXRlZC4gQSBSRVNVTFQgc2V0IGNhbiBiZSBhZGRlZCB0byAKKyAqIGFuZCByZXRyaWV2ZS4gCisgKgorICovCitwdWJsaWMgY2xhc3MgWE1MUXVlcnkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKKwkvKiogUmVzdWx0IG1vZGUuICovCisJcHJpdmF0ZSBTdHJpbmcgcmVzdWx0TW9kZUlkOworCisJLyoqIFByb3BvZ2F0aW9uIHR5cGUuICovCisJcHJpdmF0ZSBTdHJpbmcgcHJvcG9nYXRpb25UeXBlOworCisJLyoqICMgb2YgbGV2ZWxzIHRvIHByb3BvZ2F0ZSwgZGVwZW5kaW5nIG9uIHByb3BvZ2F0aW9uIHR5cGUuICovCisJcHJpdmF0ZSBTdHJpbmcgcHJvcG9nYXRpb25MZXZlbHM7CisKKwkvKiogTWF4IHJlc3VsdHMgYWxsb3dlZC4gKi8KKwlwcml2YXRlIGludCBtYXhSZXN1bHRzID0gREVGQVVMVF9NQVhfUkVTVUxUUzsKKworCS8qKiBLV1EsIGFzIGEgc3RyaW5nLiAqLworCXByaXZhdGUgU3RyaW5nIGt3cVN0cmluZzsKKworCS8qKiBMaXN0IG9mIGFjY2VwdGFibGUgTUlNRSB0eXBlcy4gKi8KKwlwcml2YXRlIExpc3QgbWltZUFjY2VwdDsKKworCS8qKiBMaXN0IG9mIHN0YXRpc3RpY3MuICovCisgICAgICAgIHByaXZhdGUgTGlzdCBzdGF0aXN0aWNzID0gbmV3IEFycmF5TGlzdCgpOworCisJLyoqIE51bWJlciBvZiByZXN1bHRzIHNvIGZhci4KKwkgKgorCSAqIFRoaXMgY291bGQgYmUgZ3JlYXRlciB0aGFuIDxjb2RlPnJlc3VsdHMuc2l6ZSgpPC9jb2RlPiBiZWNhdXNlIHRoYXQncyBsaW1pdGVkIGJ5IG1heFJlc3VsdHMuCisJICoKKwkgKiBNZWgsIHRoaXMgaXNuJ3QgZXZlbiB1cGRhdGVkIGJ5IGFueW9uZSBhcyBmYXIgYXMgSSBjYW4gdGVsbC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG51bVJlc3VsdHM7CisKKwlwcml2YXRlIFF1ZXJ5SGVhZGVyIHF1ZXJ5SGVhZGVyOworCXByaXZhdGUgTGlzdCBzZWxlY3RFbGVtZW50U2V0ID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgTGlzdCBmcm9tRWxlbWVudFNldCA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcml2YXRlIExpc3Qgd2hlcmVFbGVtZW50U2V0ID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgUXVlcnlSZXN1bHQgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7CisKKwlwcml2YXRlIHRyYW5zaWVudCBTdHJlYW1Ub2tlbml6ZXIgdG9rZW5zOyAvLyBVc2VkIGZvciBwYXJzZQorCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBscGFydDsgICAgICAgICAgIC8vIHBhcnNlciBsZWZ0IHBhcnQKKwlwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgb3BhcnQ7ICAgICAgICAgICAvLyBwYXJzZXIgb3BlcmF0b3IKKwlwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgcnBhcnQ7ICAgICAgICAgICAvLyBwYXJzZXIgcmlnaHQgcGFydAorCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBwcmV2aW91c190b2tlbjsgIC8vIHBhcnNlciAtIGFsbG93cyBiYWNrb3V0CisJcHJpdmF0ZSB0cmFuc2llbnQgaW50IHFmc2MgPSAwOyAgICAgICAgICAgLy8gcXVlcnkgZnJvbSBzZXQgaXRlbSBjb3VudAorCXByaXZhdGUgdHJhbnNpZW50IGludCBxd3NjID0gMDsgICAgICAgICAgIC8vIHF1ZXJ5IHdoZXJlIHNldCBpdGVtIGNvdW50CisJcHJpdmF0ZSB0cmFuc2llbnQgaW50IGxpdCA9IDA7ICAgICAgICAgICAgLy8gbGFzdCBxdWVyeSBpdGVtIHR5cGUgKCJmcm9tIiBvciAid2hlcmUiIGNsYXVzZSkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZST01fVE9LRU5TID0ge307CisKKwkvKiogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0ga2V5d29yZFF1ZXJ5ICBUaGUgRElTIHN0eWxlIGtleXdvcmQgcXVlcnkgc3RyaW5nLgorCSAqIEBwYXJhbSBpZCBBIHF1ZXJ5IGlkZW50aWZpZXIuCisJICogQHBhcmFtIHRpdGxlIEEgdGVyc2UgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5IGZvciBkaXNwbGF5LgorCSAqIEBwYXJhbSBkZXNjIEEgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5LgorCSAqIEBwYXJhbSBkZElkIFRoZSBkYXRhIGRpY3Rpb25hcnkgaWRlbnRpZmllci4gICAgCisJICogQHBhcmFtIHJlc3VsdE1vZGVJZCBJbmRpY2F0ZXMgdGhlIHJldHVybiBvZiBJTlNUQU5DRSwgUFJPRklMRSwgb3IgQ0xBU1MuCisJICogQHBhcmFtIHByb3BUeXBlIEluZGljYXRlcyBxdWVyeSBCUk9BRENBU1Qgb3IgUFJPUE9HQVRFLgorCSAqIEBwYXJhbSBwcm9wTGV2ZWxzIE51bWJlciBvZiBwcm9wb2dhdGlvbiBsZXZlbHMuCisJICogQHBhcmFtIG1heFJlc3VsdHMgTWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgWE1MUXVlcnkoU3RyaW5nIGtleXdvcmRRdWVyeSwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgZGRJZCwgU3RyaW5nIHJlc3VsdE1vZGVJZCwKKwkJU3RyaW5nIHByb3BUeXBlLCBTdHJpbmcgcHJvcExldmVscywgaW50IG1heFJlc3VsdHMpIHsKKwkJdGhpcyhrZXl3b3JkUXVlcnksIGlkLCB0aXRsZSwgZGVzYywgZGRJZCwgcmVzdWx0TW9kZUlkLCBwcm9wVHlwZSwgcHJvcExldmVscywgbWF4UmVzdWx0cywgbnVsbCwgdHJ1ZSk7CisJfQorCisJLyoqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGtleXdvcmRRdWVyeSAgVGhlIERJUyBzdHlsZSBrZXl3b3JkIHF1ZXJ5IHN0cmluZy4KKwkgKiBAcGFyYW0gaWQgQSBxdWVyeSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSB0aXRsZSBBIHRlcnNlIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeSBmb3IgZGlzcGxheS4KKwkgKiBAcGFyYW0gZGVzYyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeS4KKwkgKiBAcGFyYW0gZGRJZCBUaGUgZGF0YSBkaWN0aW9uYXJ5IGlkZW50aWZpZXIuICAgIAorCSAqIEBwYXJhbSByZXN1bHRNb2RlSWQgSW5kaWNhdGVzIHRoZSByZXR1cm4gb2YgSU5TVEFOQ0UsIFBST0ZJTEUsIG9yIENMQVNTLgorCSAqIEBwYXJhbSBwcm9wVHlwZSBJbmRpY2F0ZXMgcXVlcnkgQlJPQURDQVNUIG9yIFBST1BPR0FURS4KKwkgKiBAcGFyYW0gcHJvcExldmVscyBOdW1iZXIgb2YgcHJvcG9nYXRpb24gbGV2ZWxzLgorCSAqIEBwYXJhbSBtYXhSZXN1bHRzIE1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gYmUgcmV0dXJuZWQuCisJICogQHBhcmFtIHBhcnNlUXVlcnkgSW5kaWNhdGVzIHdoZXRoZXIgcXVlcnkgc2hvdWxkIGJlIHBhcnNlZAorCSAqLworCXB1YmxpYyBYTUxRdWVyeShTdHJpbmcga2V5d29yZFF1ZXJ5LCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBkZElkLCBTdHJpbmcgcmVzdWx0TW9kZUlkLAorCQlTdHJpbmcgcHJvcFR5cGUsIFN0cmluZyBwcm9wTGV2ZWxzLCBpbnQgbWF4UmVzdWx0cywgYm9vbGVhbiBwYXJzZVF1ZXJ5KSB7CisJCXRoaXMoa2V5d29yZFF1ZXJ5LCBpZCwgdGl0bGUsIGRlc2MsIGRkSWQsIHJlc3VsdE1vZGVJZCwgcHJvcFR5cGUsIHByb3BMZXZlbHMsIG1heFJlc3VsdHMsIG51bGwsIHBhcnNlUXVlcnkpOworCX0KKworCS8qKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBrZXl3b3JkUXVlcnkgIFRoZSBESVMgc3R5bGUga2V5d29yZCBxdWVyeSBzdHJpbmcuCisJICogQHBhcmFtIGlkIEEgcXVlcnkgaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gdGl0bGUgQSB0ZXJzZSBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkgZm9yIGRpc3BsYXkuCisJICogQHBhcmFtIGRlc2MgQSBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkuCisJICogQHBhcmFtIGRkSWQgVGhlIGRhdGEgZGljdGlvbmFyeSBpZGVudGlmaWVyLiAgICAKKwkgKiBAcGFyYW0gcmVzdWx0TW9kZUlkIEluZGljYXRlcyB0aGUgcmV0dXJuIG9mIElOU1RBTkNFLCBQUk9GSUxFLCBvciBDTEFTUy4KKwkgKiBAcGFyYW0gcHJvcFR5cGUgSW5kaWNhdGVzIHF1ZXJ5IEJST0FEQ0FTVCBvciBQUk9QT0dBVEUuCisJICogQHBhcmFtIHByb3BMZXZlbHMgTnVtYmVyIG9mIHByb3BvZ2F0aW9uIGxldmVscy4KKwkgKiBAcGFyYW0gbWF4UmVzdWx0cyBNYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIGJlIHJldHVybmVkLgorCSAqIEBwYXJhbSBtaW1lQWNjZXB0IExpc3Qgb2YgYWNjZXB0YWJsZSBNSU1FIHR5cGVzLgorCSAqLworCXB1YmxpYyBYTUxRdWVyeShTdHJpbmcga2V5d29yZFF1ZXJ5LCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBkZElkLCBTdHJpbmcgcmVzdWx0TW9kZUlkLAorCQlTdHJpbmcgcHJvcFR5cGUsIFN0cmluZyBwcm9wTGV2ZWxzLCBpbnQgbWF4UmVzdWx0cywgTGlzdCBtaW1lQWNjZXB0KSB7CisJCXRoaXMoa2V5d29yZFF1ZXJ5LCBpZCwgdGl0bGUsIGRlc2MsIGRkSWQsIHJlc3VsdE1vZGVJZCwgcHJvcFR5cGUsIHByb3BMZXZlbHMsIG1heFJlc3VsdHMsIG1pbWVBY2NlcHQsIHRydWUpOworCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorCS8qKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBrZXl3b3JkUXVlcnkgIFRoZSBESVMgc3R5bGUga2V5d29yZCBxdWVyeSBzdHJpbmcuCisJICogQHBhcmFtIGlkIEEgcXVlcnkgaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gdGl0bGUgQSB0ZXJzZSBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkgZm9yIGRpc3BsYXkuCisJICogQHBhcmFtIGRlc2MgQSBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkuCisJICogQHBhcmFtIGRkSWQgVGhlIGRhdGEgZGljdGlvbmFyeSBpZGVudGlmaWVyLiAgICAKKwkgKiBAcGFyYW0gcmVzdWx0TW9kZUlkIEluZGljYXRlcyB0aGUgcmV0dXJuIG9mIElOU1RBTkNFLCBQUk9GSUxFLCBvciBDTEFTUy4KKwkgKiBAcGFyYW0gcHJvcFR5cGUgSW5kaWNhdGVzIHF1ZXJ5IEJST0FEQ0FTVCBvciBQUk9QT0dBVEUuCisJICogQHBhcmFtIHByb3BMZXZlbHMgTnVtYmVyIG9mIHByb3BvZ2F0aW9uIGxldmVscy4KKwkgKiBAcGFyYW0gbWF4UmVzdWx0cyBNYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIGJlIHJldHVybmVkLgorCSAqIEBwYXJhbSBtaW1lQWNjZXB0IExpc3Qgb2YgYWNjZXB0YWJsZSBNSU1FIHR5cGVzLgorCSAqIEBwYXJhbSBwYXJzZVF1ZXJ5IEluZGljYXRlcyB3aGV0aGVyIHF1ZXJ5IHNob3VsZCBiZSBwYXJzZWQKKwkgKi8KKwlwdWJsaWMgWE1MUXVlcnkoU3RyaW5nIGtleXdvcmRRdWVyeSwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgZGRJZCwgU3RyaW5nIHJlc3VsdE1vZGVJZCwKKwkJU3RyaW5nIHByb3BUeXBlLCBTdHJpbmcgcHJvcExldmVscywgaW50IG1heFJlc3VsdHMsIAorCQlMaXN0IG1pbWVBY2NlcHQsIGJvb2xlYW4gcGFyc2VRdWVyeSkgeworCQlpZiAobWltZUFjY2VwdCA9PSBudWxsKSB7CisJCQltaW1lQWNjZXB0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJbWltZUFjY2VwdC5hZGQoIiovKiIpOworCQl9CisJCWlmIChrZXl3b3JkUXVlcnkgPT0gbnVsbCkga2V5d29yZFF1ZXJ5ID0gIlVOS05PV04iOworCQkvLyBpbml0IHF1ZXJ5IGhlYWRlciAob2JqZWN0IGF0dHJpYnV0ZXMpCisJCWlmIChpZCA9PSBudWxsKSBpZCA9IG5ldyBTdHJpbmcoIlVOS05PV04iKTsKKwkJaWYgKHRpdGxlID09IG51bGwpIHRpdGxlID0gbmV3IFN0cmluZygiVU5LTk9XTiIpOworCQlpZiAoZGVzYyA9PSBudWxsKSBkZXNjID0gbmV3IFN0cmluZygiVU5LTk9XTiIpOworCQlpZiAoZGRJZCA9PSBudWxsKSBkZElkID0gbmV3IFN0cmluZygiVU5LTk9XTiIpOworCQlxdWVyeUhlYWRlciA9IG5ldyBRdWVyeUhlYWRlcihpZCwgdGl0bGUsIGRlc2MsIC8qdHlwZSovIlFVRVJZIiwgLypzdGF0dXMqLyJBQ1RJVkUiLCAvKnNlY3VyaXR5Ki8iVU5LTk9XTiIsCisJCQkvKnJldmlzaW9uKi8iMTk5OS0xMi0xMiBKU0ggVjEuMCBVbmRlciBEZXZlbG9wbWVudCIsIGRkSWQpOworCisJCS8vIGluaXQgcXVlcnkgYXR0cmlidXRlcworCQlpZiAocmVzdWx0TW9kZUlkID09IG51bGwpIHJlc3VsdE1vZGVJZCA9IG5ldyBTdHJpbmcoIkFUVFJJQlVURSIpOworCQlpZiAocHJvcFR5cGUgPT0gbnVsbCkgeworCQkJcHJvcFR5cGUgPSBuZXcgU3RyaW5nKCJCUk9BRENBU1QiKTsKKwkJCXByb3BMZXZlbHMgPSBuZXcgU3RyaW5nKCJOL0EiKTsKKwkJfQorCQl0aGlzLnJlc3VsdE1vZGVJZCA9IHJlc3VsdE1vZGVJZDsKKwkJdGhpcy5wcm9wb2dhdGlvblR5cGUgPSBwcm9wVHlwZTsKKwkJdGhpcy5wcm9wb2dhdGlvbkxldmVscyA9IHByb3BMZXZlbHM7CisJCXRoaXMubWF4UmVzdWx0cyA9IG1heFJlc3VsdHM7CisJCXRoaXMua3dxU3RyaW5nID0ga2V5d29yZFF1ZXJ5OworCQl0aGlzLm1pbWVBY2NlcHQgPSBtaW1lQWNjZXB0OworICAgICAgICAKKwkJLy8gcGFyc2UgdGhlIGtleXdvcmQgcXVlcnkgc3RyaW5nCisJCWlmICghIHBhcnNlUXVlcnkpIHsKKwkJCXF1ZXJ5SGVhZGVyLnNldFN0YXR1c0lEKCJOT1RQQVJTRUQiKTsKKwkJfSBlbHNlIGlmICghcGFyc2VLZXl3b3JkU3RyaW5nKGtleXdvcmRRdWVyeSkpIHsKKwkJCXF1ZXJ5SGVhZGVyLnNldFN0YXR1c0lEKCJFUlJPUiIpOworCQl9CisJfQorCisJLyoqIEdldCB0aGUgbGlzdCBvZiBhY2NlcHRhYmxlIE1JTUUgdHlwZXMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGFjY2VwdGFibGUgTUlNRSB0eXBlczsgeW91IG1heSBtb2RpZnkgdGhlIGxpc3QuCisJICovCisJcHVibGljIExpc3QgZ2V0TWltZUFjY2VwdCgpIHsKKwkJcmV0dXJuIG1pbWVBY2NlcHQ7CisJfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGFuIFhNTFF1ZXJ5IGluc3RhbmNlIGZyb20gYW4gWE1MIHF1ZXJ5IHN0cnVjdHVyZSBpbiBzdHJpbmcgZm9ybWF0LgorICAgICAqCisgICAgICogQHBhcmFtIHhtbFF1ZXJ5U3RyaW5nICBUaGUgWE1MIHF1ZXJ5IHN0cnVjdHVyZSBpbiBzdHJpbmcgZm9ybWF0LgorICAgICAqLworCXB1YmxpYyBYTUxRdWVyeSAoU3RyaW5nIHhtbFF1ZXJ5U3RyaW5nKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJaWYgKHhtbFF1ZXJ5U3RyaW5nID09IG51bGwpIHhtbFF1ZXJ5U3RyaW5nID0gQkxBTks7CisJCXRyeSB7CisJCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisJCQlmYWN0b3J5LnNldENvYWxlc2NpbmcoZmFsc2UpOworCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CisJCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOworCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihFTlRJVFlfUkVTT0xWRVIpOworCQkJRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sUXVlcnlTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworCQkJbG9hZFhNTFF1ZXJ5U3RydWN0KGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVuZXhwZWN0ZWQgbm8gZ29vZCBibG9vZHkgSU9FeGNlcHRpb24gd2hpbGUgcGFyc2luZyBkb2M6ICIgKyB4bWxRdWVyeVN0cmluZyk7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIG5vIGdvb2QgYmxvb2R5IElPRXhjZXB0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpICsgIiwgZHVyaW5nIgorCQkJCSsgIiBwYXJzZSBvZiAiICsgeG1sUXVlcnlTdHJpbmcpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworCQl9CisgICAJfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGFuIFhNTFF1ZXJ5IGluc3RhbmNlIGZyb20gYW4gWE1MIHF1ZXJ5IHN0cnVjdHVyZSBpbiBET00gbm9kZSBmb3JtYXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSAgVGhlIFhNTCAmbHQ7cXVlcnkmZ3Q7IG5vZGUuCisgICAgICovCisJcHVibGljIFhNTFF1ZXJ5IChOb2RlIG5vZGUpIHsKKwkJbG9hZFhNTFF1ZXJ5U3RydWN0KG5vZGUpOworICAgCX0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG9yaWdpbmFsIERJUyBzdHlsZSBrZXl3b3JkIHF1ZXJ5IHN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIERJUyBzdHlsZSBrZXl3b3JkIHF1ZXJ5IHN0cmluZy4KKyAgICAgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEt3ZFF1ZXJ5U3RyaW5nICgpIHsKKwkJcmV0dXJuIGt3cVN0cmluZzsKKwl9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtYXggIyBvZiByZXN1bHRzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRzCisgICAgICovCisJcHVibGljIGludCBnZXRNYXhSZXN1bHRzKCkgeworCQlyZXR1cm4gbWF4UmVzdWx0czsKKwl9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEdldHMgdGhlIHNlbGVjdCBlbGVtZW50cworICAgICAqCisgICAgICovCisJcHVibGljIExpc3QgZ2V0U2VsZWN0RWxlbWVudFNldCgpIHsKKwkgICByZXR1cm4oc2VsZWN0RWxlbWVudFNldCk7CisJfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBHZXRzIHRoZSBmcm9tIGVsZW1lbnQgc2V0IGZyb20gdGhlIHF1ZXJ5CisgICAgICoKKyAgICAgKi8KKwlwdWJsaWMgTGlzdCBnZXRGcm9tRWxlbWVudFNldCgpCisJeworCSAgIHJldHVybihmcm9tRWxlbWVudFNldCk7CisJfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEdldHMgdGhlIHJlc3VsdE1vZGVJRAorICAgICAqCisgICAgICovCisJcHVibGljIFN0cmluZyBnZXRSZXN1bHRNb2RlSUQoKQorCXsKKyAgICAgICAgICAgcmV0dXJuKHJlc3VsdE1vZGVJZCk7CisgICAgICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEdldHMgdGhlIHdoZXJlIHNldAorICAgICAqCisgICAgICovCisJcHVibGljIExpc3QgZ2V0V2hlcmVFbGVtZW50U2V0KCkgeworCSAgIHJldHVybih3aGVyZUVsZW1lbnRTZXQpOworCX0KKwkKKyAgICAvKioKKyAgICAgKiBTZXQgcXVlcnkgd2hlcmUgZWxlbWVudCBzZXQuCisgICAgICogQHBhcmFtIHdoZXJlRWxlbWVudFNldCBUaHcgd2hlcmUgZWxlbWVudCBzZXQgb2YgWE1MUXVlcnkuCisgICAgICovCisJcHVibGljIHZvaWQgc2V0V2hlcmVFbGVtZW50U2V0KExpc3Qgd2hlcmVFbGVtZW50U2V0KSB7CisJCXRoaXMud2hlcmVFbGVtZW50U2V0ID0gd2hlcmVFbGVtZW50U2V0OworCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEdldHMgdGhlIHJlc3VsdCBsaXN0CisgICAgICoKKyAgICAgKi8KKwlwdWJsaWMgUXVlcnlSZXN1bHQgZ2V0UmVzdWx0KCkgeworCSAgICByZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBMaXN0IGdldFJlc3VsdHMoKSB7CisJCXJldHVybiByZXN1bHQuZ2V0TGlzdCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRSZXRyaWV2ZXIoUmV0cmlldmVyIHJldHJpZXZlcikgeworCQlyZXN1bHQuc2V0UmV0cmlldmVyKHJldHJpZXZlcik7CisJfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcXVlcnkgYXMgYW4gWE1MIERPTSBzdHJ1Y3R1cmUuCisgICAgICovCisJcHVibGljIERvY3VtZW50IGdldFhNTERvYyAoKSB7CisJCURvY3VtZW50IGRvYyA9IGNyZWF0ZURvY3VtZW50KCk7CisJCWRvYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudCgicXVlcnkiKSk7CisgICAJCWNyZWF0ZVhNTERvYyhkb2MpOworCQlyZXR1cm4gZG9jOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2Ygc3Rhc2l0aWNzIG9mIHRoaXMgcXVlcnkuCisgICAgKgorICAgICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIFN0YXRpc3RpY30gb2JqZWN0cy4KKyAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFN0YXRpc3RpY3MoKSB7CisgICAgICByZXR1cm4gc3RhdGlzdGljczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHF1ZXJ5IGFzIGFuIFhNTCBkb2N1bWVudCBpbiBzdHJpbmcgZm9ybWF0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcXVlcnkgYXMgYW4gWE1MIGRvY3VtZW50IGluIHN0cmluZyBmb3JtYXQuCisgICAgICovCisJcHVibGljIFN0cmluZyBnZXRYTUxEb2NTdHJpbmcgKCkgeworCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQl0cnkgeworCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVESUFfVFlQRSwgInRleHQveG1sIik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgIm5vIik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlNUQU5EQUxPTkUsICJubyIpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OLCAiMS4wIik7CisJCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShnZXRYTUxEb2MoKSksIG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKSk7CisJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIFRyYW5zZm9ybWVyRXhjZXB0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJd3JpdGVyLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCX0KKwkJcmV0dXJuIHdyaXRlci50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvcGFnYXRpb24gdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BhZ2F0aW9uVHlwZSgpIHsKKwkJcmV0dXJuIHByb3BvZ2F0aW9uVHlwZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHByb3BhZ2F0aW9uIGxldmVscy4KKwkgKgorCSAqIEByZXR1cm4gYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BhZ2F0aW9uTGV2ZWxzKCkgeworCQlyZXR1cm4gcHJvcG9nYXRpb25MZXZlbHM7CisJfQorCisgICAgLyoqCisgICAgICogUGFyc2Uga2V5d29yZCBxdWVyeSBzdHJpbmcgKHNpbXBsZSB0b3AgZG93biByZWN1cnNpb24pLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUtleXdvcmRTdHJpbmcgKFN0cmluZyBrd2RRdWVyeVN0cmluZykgeworCSAgICBwcmV2aW91c190b2tlbiA9ICIiOworCSAgICBscGFydCA9ICIiOworCSAgICBycGFydCA9ICIiOworCisgICAgICAgICAgICB0b2tlbnMgPSBuZXcgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIobmV3IFN0cmluZ1JlYWRlcihrd2RRdWVyeVN0cmluZykpOworICAgICAgICAgICAgdG9rZW5zLnJlc2V0U3ludGF4KCk7CisgICAgICAgICAgICB0b2tlbnMub3JkaW5hcnlDaGFyKCcvJyk7CisgICAgICAgICAgICB0b2tlbnMud29yZENoYXJzKCcjJywgJyMnKTsKKyAgICAgICAgICAgIHRva2Vucy53b3JkQ2hhcnMoJzonLCAnOicpOworICAgICAgICAgICAgdG9rZW5zLndvcmRDaGFycygnMCcsICc5Jyk7CisgICAgICAgICAgICB0b2tlbnMud29yZENoYXJzKCcuJywgJy4nKTsKKyAgICAgICAgICAgIHRva2Vucy53b3JkQ2hhcnMoJy0nLCAnLScpOworICAgICAgICAgICAgdG9rZW5zLndvcmRDaGFycygnWycsICdbJyk7CisgICAgICAgICAgICB0b2tlbnMud29yZENoYXJzKCddJywgJ10nKTsKKyAgICAgICAgICAgIHRva2Vucy53b3JkQ2hhcnMoJ2EnLCAneicpOworICAgICAgICAgICAgdG9rZW5zLndvcmRDaGFycygnQScsICdaJyk7CisgICAgICAgICAgICB0b2tlbnMud29yZENoYXJzKCdfJywgJ18nKTsKKyAgICAgICAgICAgIHRva2Vucy53b3JkQ2hhcnMoJy8nLCAnLycpOworICAgICAgICAgICAgdG9rZW5zLmVvbElzU2lnbmlmaWNhbnQodHJ1ZSk7CisgICAgICAgICAgICB0b2tlbnMud2hpdGVzcGFjZUNoYXJzKDAsICcgJyk7CisgICAgICAgICAgICB0b2tlbnMucXVvdGVDaGFyKCciJyk7CisgICAgICAgICAgICB0b2tlbnMucXVvdGVDaGFyKCdcJycpOworCSAgICAKKwkgICAgaWYgKGtxT3JQYXJzZSAoKSl7CisJICAgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKworICAgIC8qKgorICAgICAqIFBhcnNlIE9SIGxvZ2ljYWwgb3BlcmF0b3IuCisgICAgICovCisJcHJpdmF0ZSBib29sZWFuIGtxT3JQYXJzZSAoKQorCXsKKwkgICAgYm9vbGVhbiBsZmxhZywgcmZsYWc7CisKKwkgICAgbGZsYWcgPSBrcUFuZFBhcnNlKCk7CisJICAgIHdoaWxlIChpc1Rva2VuRXF1YWwoIk9SIikgfCBpc1Rva2VuRXF1YWwoIm9yIikgfCBpc1Rva2VuRXF1YWwoInwiKSkgeworICAgICAgICAgICAgcmZsYWcgPSBrcUFuZFBhcnNlKCk7CisgICAgICAgICAgICBsZmxhZyAmPSByZmxhZzsKKyAgICAgICAgICAgIGFwcGVuZExvZ09wZXJhdG9yKCJMT0dPUCIsICJPUiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsZmxhZzsKKwl9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBBTkQgbG9naWNhbCBvcGVyYXRvci4KKyAgICAgKi8KKyAgIAlwcml2YXRlIGJvb2xlYW4ga3FBbmRQYXJzZSAoKQorCXsKKwkgICAgYm9vbGVhbiBsZmxhZywgcmZsYWc7CisKKwkgICAgbGZsYWcgPSBrcU5vdFBhcnNlKCk7CisJICAgIHdoaWxlIChpc1Rva2VuRXF1YWwoIkFORCIpIHwgaXNUb2tlbkVxdWFsKCJhbmQiKSB8IGlzVG9rZW5FcXVhbCgiJiIpKSB7CisgICAgICAgICAgICByZmxhZyA9IGtxTm90UGFyc2UoKTsKKyAgICAgICAgICAgIGxmbGFnICY9IHJmbGFnOworICAgICAgICAgICAgYXBwZW5kTG9nT3BlcmF0b3IoIkxPR09QIiwgIkFORCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsZmxhZzsKKwl9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBOT1QgbG9naWNhbCBvcGVyYXRvci4KKyAgICAgKi8KKwlwcml2YXRlIGJvb2xlYW4ga3FOb3RQYXJzZSAoKQorCXsKKwkgICAgYm9vbGVhbiBsZmxhZywgcmZsYWc7CisKKwkgICAgaWYgKGlzVG9rZW5FcXVhbCgiTk9UIikgfCBpc1Rva2VuRXF1YWwoIm5vdCIpIHwgaXNUb2tlbkVxdWFsKCIhIikpIHsKKyAgICAgICAgICAgIGxmbGFnID0ga3FGYWN0b3JQYXJzZSgpOworICAgICAgICAgICAgYXBwZW5kTG9nT3BlcmF0b3IoIkxPR09QIiwgIk5PVCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGZsYWcgPSBrcUZhY3RvclBhcnNlICgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsZmxhZzsKKwl9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBsb2dpY2FsIG9wZXJhdG9yIG9wZXJhbmQgYW5kIGhhbmRsZSBuZXN0aW5nIChwYXJlbnMpCisgICAgICogYWxzbyBsb2dpYyBmb3IgZGlmZmVyZW50aWF0aW5nIFNFTEVDVCwgV0hFUkUsIGFuZCBGUk9NCisgICAgICovCisJcHJpdmF0ZSBib29sZWFuIGtxRmFjdG9yUGFyc2UgKCkKKwl7CisJICAgIFN0cmluZyByb3BuLCBlbm07CisJICAgIGlmIChpc1Rva2VuRXF1YWwoIigiKSkgeworCSAgICAgICAgcmV0dXJuIChrcU9yUGFyc2UgKCkgJiBpc1Rva2VuRXF1YWwoIikiKSk7CisJICAgIH0gZWxzZSB7CisgICAgICAgICAgICBscGFydCA9IGdldE5leHRUb2tlbiAoKTsKKyAgICAgICAgICAgIGlmIChscGFydC5jb21wYXJlVG8oIiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgcm9wbiA9IGdldE5leHRUb2tlbiAoKTsKKyAgICAgICAgICAgICAgICAgaWYgKHJvcG4uY29tcGFyZVRvKCJFUSIpID09IDAgfHwgcm9wbi5jb21wYXJlVG8oIkxUIikgPT0gMCB8fCByb3BuLmNvbXBhcmVUbygiTEUiKSA9PSAwIHx8IHJvcG4uY29tcGFyZVRvKCJHVCIpID09IDAgfHwgcm9wbi5jb21wYXJlVG8oIkdFIik9PSAwIHx8IHJvcG4uY29tcGFyZVRvKCJORSIpID09IDAgfHwgcm9wbi5jb21wYXJlVG9JZ25vcmVDYXNlKCJMSUtFIikgPT0gMCB8fCByb3BuLmNvbXBhcmVUb0lnbm9yZUNhc2UoIk5PVExJS0UiKSA9PSAwIHx8IHJvcG4uY29tcGFyZVRvKCJJUyIpID09IDAgfHwgcm9wbi5jb21wYXJlVG8oIklTTk9UIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBycGFydCA9IGdldE5leHRUb2tlbiAoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJwYXJ0LmNvbXBhcmVUbygiIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGl0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVubSA9IGxwYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVubS5jb21wYXJlVG8oIlJFVFVSTiIpID09IDApIHsKKwkJCSAgICBzZWxlY3RFbGVtZW50U2V0LmFkZChuZXcgUXVlcnlFbGVtZW50KCJlbGVtTmFtZSIsIHJwYXJ0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRnJvbVRva2VuKGxwYXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFmc2MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXQgPSAxOworCQkJICAgIGZyb21FbGVtZW50U2V0LmFkZChuZXcgUXVlcnlFbGVtZW50KCJlbGVtTmFtZSIsIGxwYXJ0KSk7CisJCQkgICAgZnJvbUVsZW1lbnRTZXQuYWRkKG5ldyBRdWVyeUVsZW1lbnQoIkxJVEVSQUwiLCBycGFydCkpOworCQkJICAgIGZyb21FbGVtZW50U2V0LmFkZChuZXcgUXVlcnlFbGVtZW50KCJSRUxPUCIsIHJvcG4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxd3NjKys7CisJCQkgICAgd2hlcmVFbGVtZW50U2V0LmFkZChuZXcgUXVlcnlFbGVtZW50KCJlbGVtTmFtZSIsIGxwYXJ0KSk7CisJCQkgICAgd2hlcmVFbGVtZW50U2V0LmFkZChuZXcgUXVlcnlFbGVtZW50KCJMSVRFUkFMIiwgcnBhcnQpKTsKKwkJCSAgICB3aGVyZUVsZW1lbnRTZXQuYWRkKG5ldyBRdWVyeUVsZW1lbnQoIlJFTE9QIiwgcm9wbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBMb2dpY2FsIE9wZXJhdG9yIERPTSBub2RlIGZvciBXSEVSRSBjbGF1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFwcGVuZExvZ09wZXJhdG9yIChTdHJpbmcgdHQsIFN0cmluZyB0cykKKwl7CisJICAgIGlmIChsaXQgPT0gMSAmIHFmc2MgPiAxKSB7CisJCSAgICBmcm9tRWxlbWVudFNldC5hZGQobmV3IFF1ZXJ5RWxlbWVudCh0dCwgdHMpKTsKKworICAgIAl9IGVsc2UgaWYgKGxpdCA9PSAyICYgcXdzYyA+IDEpIHsKKwkJd2hlcmVFbGVtZW50U2V0LmFkZChuZXcgUXVlcnlFbGVtZW50KHR0LCB0cykpOworICAgIAl9CisJICAgIHJldHVybiB0cnVlOworCX0KKworICAgIC8qKgorICAgICAqIExleGljYWwgYW5hbHl6ZXIgLSBmaW5kIGEgRlJPTSB0b2tlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRnJvbVRva2VuIChTdHJpbmcgczEpCisJeworCQlTdHJpbmcgdG1wU3RyID0gczE7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJPTV9UT0tFTlMubGVuZ3RoOyBpKyspCisJICAgIHsKKwkgICAgICAgIGlmICh0bXBTdHIuY29tcGFyZVRvKEZST01fVE9LRU5TW2ldKSA9PSAwKSB7CisJICAgICAgICAgICAgcmV0dXJuIHRydWU7CisJICAgICAgICB9CisJICAgIH0KKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgIC8qKgorICAgICAqIExleGljYWwgYW5hbHl6ZXIgLSByZXR1cm4gbmV4dCB0b2tlbiAtIGFsbG93cyBsb29rYWhlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dFRva2VuICgpCisJeworCSAgICBTdHJpbmcgdHM7CisKKyAgICAJICAgIHRzID0gcHJldmlvdXNfdG9rZW47CisgICAgICAgICAgICBpZiAocHJldmlvdXNfdG9rZW4uY29tcGFyZVRvKCIiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRzID0gZ2V0TmV4dFRva2VuRnJvbVN0cmVhbSgpOworICAgICAgICAJICAgIHJldHVybiB0czsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAkgICAgcHJldmlvdXNfdG9rZW4gPSAiIjsKKyAgICAgICAgCSAgICByZXR1cm4gdHM7CisgICAgICAgICAgICB9CisJfQorCisgICAgLyoqCisgICAgICogTGV4aWNhbCBhbmFseXplciAtIGNoZWNrIGlmIG5leHQgdG9rZW4gZXF1YWwgdG8gYXJndW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVG9rZW5FcXVhbCAoU3RyaW5nIHMxKSB7CisJICAgIFN0cmluZyB0czsKKwkgICAgYm9vbGVhbiByYyA9IGZhbHNlOworCisJICAgIHRzID0gcHJldmlvdXNfdG9rZW47CisgICAgICAgCSAgICBpZiAocHJldmlvdXNfdG9rZW4uY29tcGFyZVRvKCIiKSA9PSAwKSB7CisgICAgICAgCSAgICAgICAgdHMgPSBnZXROZXh0VG9rZW5Gcm9tU3RyZWFtICgpOworCQlpZiAodHMuY29tcGFyZVRvKCIiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgCSAgICBpZiAodHMuY29tcGFyZVRvKHMxKSA9PSAwKSB7CisgICAgIAkgICAgICAgICAgICAgICAgcHJldmlvdXNfdG9rZW4gPSAiIjsKKyAgICAgICAJICAgICAgICAgICAgICAgIHJjID0gdHJ1ZTsKKyAgICAgICAJICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAJICAgICAgICAgICAgICAgIHByZXZpb3VzX3Rva2VuID0gdHM7CisgICAgICAgCSAgICAgICAgICAgICAgICByYyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgCSAgICAgICAgfQorICAgICAgCSAgICB9IGVsc2UgeworICAgICAgICAgICAJICAgIGlmIChwcmV2aW91c190b2tlbi5jb21wYXJlVG8oczEpID09IDApIHsKKyAgICAgICAJICAgICAgICAgICAgcHJldmlvdXNfdG9rZW4gPSAiIjsKKyAgICAgICAJICAgICAgICAgICAgcmMgPSB0cnVlOworICAgICAgIAkgICAgICAgIH0gZWxzZSB7CisgICAgICAgCSAgICAgICAgICAgIHJjID0gZmFsc2U7CisgICAgICAgCSAgICAgICAgfQorICAgICAJICAgIH0KKwkgICAgcmV0dXJuIHJjOworCX0gIAorCisgICAgLyoqCisgICAgICogTGV4aWNhbCBhbmFseXplciAtIHJldHVybiBuZXh0IHRva2VuIGZyb20gaW5zdGFuY2Ugb2YgU3RyZWFtVG9rZW5pemVyLgorICAgICAqLworICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dFRva2VuRnJvbVN0cmVhbSAoKSB7CisgICAgICAgICAgICBpbnQgYywgYzI7CisJICAgIFN0cmluZyByYyA9ICIiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGM9dG9rZW5zLm5leHRUb2tlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RyZWFtVG9rZW5pemVyLlRUX0VPRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gIiI7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9MOgorICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAiIjsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVI6IC8vIG5vdCBjdXJyZW50bHkgc2V0CisJCQlyYyA9ICIiOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RyZWFtVG9rZW5pemVyLlRUX1dPUkQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHRva2Vucy5zdmFsOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcpJzoKKwkJCXJjID0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpYyk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gdG9rZW5zLnN2YWw7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9ICJFUSI7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9ICJBTkQiOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3wnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAiT1IiOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSB0b2tlbnMubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYzIgPT0gJz0nKSB7CisJCQkJcmMgPSAiTEUiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQl0b2tlbnMucHVzaEJhY2soKTsKKwkJCQlyYyA9ICJMVCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjMiA9PSAnPScpIHsKKwkJCQlyYyA9ICJHRSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaEJhY2soKTsKKwkJCQlyYyA9ICJHVCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnISc6CisgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjMiA9PSAnPScpIHsKKwkJCQlyYyA9ICJORSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaEJhY2soKTsKKwkJCQlyYyA9ICJOT1QiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCXJjID0gIiI7CisJCX0KKwkgICAgcmV0dXJuIHJjOworICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSBjaGFyYWN0ZXIgd2l0aCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXBsYWNlQ2hhcldpdGhTdHJpbmcgKFN0cmluZyBzMSwgY2hhciBjLCBTdHJpbmcgcnMpCisJeworICAgICAgICBpbnQgcDEsIHAyLCBzMWw7CisgICAgCVN0cmluZyBzMjsKKyAgICAJCisgICAgCXAxID0gMDsgcDIgPSAwOworICAgIAlzMWwgPSBzMS5sZW5ndGgoKTsKKyAgICAJczIgPSAiIjsKKyAgICAJcDIgPSBzMS5pbmRleE9mKGMsIHAxKTsKKyAgICAJd2hpbGUgKHAyID49IDApIHsKKyAgICAJICAgIHMyICs9IHMxLnN1YnN0cmluZyAocDEsIHAyKSArIHJzOworICAgICAgICAgICAgcDEgPSBwMiArIDE7CisgICAgICAgICAgICBwMiA9IHMxLmluZGV4T2YoYywgcDEpOworICAgICAgICB9CisgICAgICAgIGlmIChwMSA8IHMxbCkgeworICAgICAgICAgICAgczIgKz0gczEuc3Vic3RyaW5nKHAxLCBzMWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzMjsKKwl9ICAgICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBYTUwgRE9NIHN0cnVjdHVyZSBmcm9tIGEga2V5d29yZCBxdWVyeSBzdHJpbmcuCisgICAgICogU2V0IHVwIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgdGhlbiBjYWxscyB0aGUgcXVlcnkgcGFyc2VyLgorICAgICAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVYTUxEb2MgKERvY3VtZW50IGRvYykgeworCSAgICBpbnQgbG9jOworCSAgICBTdHJpbmcga3dkOworCSAgICBTdHJpbmcgdHlwZTsKKwkgICAgU3RyaW5nIHZhbDsKKwkgICAgRWxlbWVudCBpdGVtOworCSAgICBFbGVtZW50IGVsZW07CisJICAgIAorCSAgICBFbGVtZW50IHF1ZXJ5ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgCSAgICAgICAgCisgICAgICAgIC8vIGNyZWF0ZSBxdWVyeSBoZWFkZXIgKG9iamVjdCBhdHRyaWJ1dGVzKQorCSAgICBxdWVyeS5hcHBlbmRDaGlsZChxdWVyeUhlYWRlci50b1hNTChkb2MpKTsKKwkgICAgICAgIAorCSAgICAvLyBjcmVhdGUgcXVlcnkgYXR0cmlidXRlcworCSAgICBYTUwuYWRkKHF1ZXJ5LCAicXVlcnlSZXN1bHRNb2RlSWQiLCByZXN1bHRNb2RlSWQpOworCSAgICBYTUwuYWRkKHF1ZXJ5LCAicXVlcnlQcm9wb2dhdGlvblR5cGUiLCBwcm9wb2dhdGlvblR5cGUpOworCSAgICBYTUwuYWRkKHF1ZXJ5LCAicXVlcnlQcm9wb2dhdGlvbkxldmVscyIsIHByb3BvZ2F0aW9uTGV2ZWxzKTsKKwkgICAgWE1MLmFkZChxdWVyeSwgInF1ZXJ5TWltZUFjY2VwdCIsIG1pbWVBY2NlcHQpOworCSAgICBYTUwuYWRkKHF1ZXJ5LCAicXVlcnlNYXhSZXN1bHRzIiwgU3RyaW5nLnZhbHVlT2YobWF4UmVzdWx0cykpOworCSAgICBYTUwuYWRkKHF1ZXJ5LCAicXVlcnlSZXN1bHRzIiwgU3RyaW5nLnZhbHVlT2YobnVtUmVzdWx0cykpOworCSAgICBYTUwuYWRkKHF1ZXJ5LCAicXVlcnlLV1FTdHJpbmciLCBrd3FTdHJpbmcpOworCisJICAgIC8vIGNyZWF0ZSBhbmQgbG9hZCBxdWVyeVN0YXRpc3RpY3MKKyAgICAgICAgICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgicXVlcnlTdGF0aXN0aWNzIik7CisgICAgICAgICAgICBxdWVyeS5hcHBlbmRDaGlsZChlbGVtKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0YXRpc3RpY3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdGF0aXN0aWMgcyA9IChTdGF0aXN0aWMpIGkubmV4dCgpOworICAgICAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChzLnRvWE1MKGRvYykpOworICAgICAgICAgICAgfQorCisJICAgIC8vIGNyZWF0ZSBhbmQgbG9hZCBxdWVyeVNlbGVjdFNldAorCSAgICBlbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoInF1ZXJ5U2VsZWN0U2V0Iik7CisJICAgIHF1ZXJ5LmFwcGVuZENoaWxkKGVsZW0pOworCisJICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdEVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCSAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudCkgaS5uZXh0KCk7CisJCSAgICBlbGVtLmFwcGVuZENoaWxkKHF1ZXJ5RWxlbWVudC50b1hNTChkb2MpKTsKKwkgICAgfQorCisJICAgIC8vIGNyZWF0ZSBhbmQgbG9hZCBxdWVyeUZyb21TZXQKKwkgICAgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJxdWVyeUZyb21TZXQiKTsKKwkgICAgcXVlcnkuYXBwZW5kQ2hpbGQoZWxlbSk7CisKKwkgICAgZm9yIChJdGVyYXRvciBpID0gZnJvbUVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCSAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudCkgaS5uZXh0KCk7CisJCSAgICBlbGVtLmFwcGVuZENoaWxkKHF1ZXJ5RWxlbWVudC50b1hNTChkb2MpKTsKKwkgICAgfQorCisJICAgIC8vIGNyZWF0ZSBhbmQgbG9hZCBxdWVyeVdoZXJlU2V0CisJICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgicXVlcnlXaGVyZVNldCIpOworCSAgICBxdWVyeS5hcHBlbmRDaGlsZChlbGVtKTsKKwkgICAgZm9yIChJdGVyYXRvciBpID0gd2hlcmVFbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkgICAgUXVlcnlFbGVtZW50IHF1ZXJ5RWxlbWVudCA9IChRdWVyeUVsZW1lbnQpIGkubmV4dCgpOworCQkgICAgZWxlbS5hcHBlbmRDaGlsZChxdWVyeUVsZW1lbnQudG9YTUwoZG9jKSk7CisJICAgIH0KKworCSAgICBxdWVyeS5hcHBlbmRDaGlsZChyZXN1bHQudG9YTUwoZG9jKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxlYWYgKGVuZCBub2RlIC0gVEVYVCkgaW4gdGhlIERPTSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZUxlYWYgKEVsZW1lbnQgY2hpbGQsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjaGlsZC5hcHBlbmRDaGlsZChjaGlsZC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGludGVybmFsIHF1ZXJ5IHN0cnVjdHVyZSAoZGljdGlvbmFyeSkgZnJvbSBhbiBYTUwgRE9NIHN0cnVjdHVyZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkWE1MUXVlcnlTdHJ1Y3QgKE5vZGUgcm9vdCkgeworICAgICAgICBOb2RlIG5vZGU7CisgICAgICAgIFN0cmluZyBub2RlTmFtZTsKKyAgICAgICAgCisgICAgICAgIGluaXROb2RlcygpOworICAgICAgICBmb3IgKG5vZGUgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIG5vZGUgIT0gbnVsbDsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZS5jb21wYXJlVG8oInF1ZXJ5QXR0cmlidXRlcyIpID09IDApIHsKKwkJICAgICAgICBxdWVyeUhlYWRlciA9IG5ldyBRdWVyeUhlYWRlcihub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZS5jb21wYXJlVG8oInF1ZXJ5UmVzdWx0TW9kZUlkIikgPT0gMCkgeworCQkJICAgIHJlc3VsdE1vZGVJZCA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkgICAgfSBlbHNlIGlmIChub2RlTmFtZS5jb21wYXJlVG8oInF1ZXJ5UHJvcG9nYXRpb25UeXBlIikgPT0gMCkgeworCQkJICAgIHByb3BvZ2F0aW9uVHlwZSA9IFhNTC51bndyYXBwZWRUZXh0KG5vZGUpOworCQkgICAgfSBlbHNlIGlmIChub2RlTmFtZS5jb21wYXJlVG8oInF1ZXJ5UHJvcG9nYXRpb25MZXZlbHMiKSA9PSAwKSB7CisJCQkgICAgcHJvcG9nYXRpb25MZXZlbHMgPSBYTUwudW53cmFwcGVkVGV4dChub2RlKTsKKwkJICAgIH0gZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKCJxdWVyeU1pbWVBY2NlcHQiKSkgeworCQkJICAgIG1pbWVBY2NlcHQuYWRkKFhNTC51bndyYXBwZWRUZXh0KG5vZGUpKTsKKwkJICAgIH0gZWxzZSBpZiAobm9kZU5hbWUuY29tcGFyZVRvKCJxdWVyeU1heFJlc3VsdHMiKSA9PSAwKSB7CisJCQkgICAgbWF4UmVzdWx0cyA9IEludGVnZXIucGFyc2VJbnQoWE1MLnVud3JhcHBlZFRleHQobm9kZSkpOworCQkgICAgfSBlbHNlIGlmIChub2RlTmFtZS5jb21wYXJlVG8oInF1ZXJ5UmVzdWx0cyIpID09IDApIHsKKwkJCSAgICBudW1SZXN1bHRzID0gSW50ZWdlci5wYXJzZUludChYTUwudW53cmFwcGVkVGV4dChub2RlKSk7CisJCSAgICB9IGVsc2UgaWYgKG5vZGVOYW1lLmNvbXBhcmVUbygicXVlcnlLV1FTdHJpbmciKSA9PSAwKSB7CisJCQkgICAga3dxU3RyaW5nID0gWE1MLnVud3JhcHBlZFRleHQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUuY29tcGFyZVRvKCJxdWVyeVNlbGVjdFNldCIpID09IDApIHsKKwkJCXNjYW5RdWVyeUVsZW1lbnRzKHNlbGVjdEVsZW1lbnRTZXQsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lLmNvbXBhcmVUbygicXVlcnlGcm9tU2V0IikgPT0gMCkgeworCQkJc2NhblF1ZXJ5RWxlbWVudHMoZnJvbUVsZW1lbnRTZXQsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lLmNvbXBhcmVUbygicXVlcnlXaGVyZVNldCIpID09IDApIHsKKwkJCXNjYW5RdWVyeUVsZW1lbnRzKHdoZXJlRWxlbWVudFNldCwgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUuY29tcGFyZVRvKCJxdWVyeVJlc3VsdFNldCIpID09IDApIHsKKwkJCSAgICByZXN1bHQgPSBuZXcgUXVlcnlSZXN1bHQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKCJxdWVyeVN0YXRpc3RpY3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJCU5vZGUgc3RhdGlzdGljTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQkJaWYgKHN0YXRpc3RpY05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworCQkJCQlTdGF0aXN0aWMgcyA9IG5ldyBTdGF0aXN0aWMoc3RhdGlzdGljTm9kZSk7CisJCQkJCXN0YXRpc3RpY3MuYWRkKHMpOworCQkJCX0KKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSBkaWN0aW9uYXJ5IGtleXdvcmQgdmFsdWUgd2l0aCB0aGUgRE9NIHRleHQgbm9kZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZUt3ZFZhbCAoTWFwIG1hcCwgTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKKyAgICAgICAgTm9kZSBjaGlsZE5vZGU7CisgICAgICAgIAorICAgICAgICBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaWYgKGNoaWxkTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKKyAgICAgICAgICAgICAgICBtYXAucHV0KG5vZGVOYW1lLCBjaGlsZE5vZGUuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hcC5wdXQobm9kZU5hbWUsICJVTktOT1dOIik7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW4gdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIHRoZSBTRUxFQ1QsIEZST00sIG9yIFdIRVJFIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0IFRvIHdoYXQgbGlzdCB0byBhZGQgdGhlIHF1ZXJ5IGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBub2RlIFdoZXJlIHRvIGZpbmQgdGhlIHF1ZXJ5IGVsZW1lbnRzLiAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNjYW5RdWVyeUVsZW1lbnRzKExpc3QgbGlzdCwgTm9kZSBub2RlKSB7CisJICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkgICAgTm9kZSBuID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJICAgIGlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCisJCQkgICAgbGlzdC5hZGQobmV3IFF1ZXJ5RWxlbWVudChuKSk7CisJICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBRdWVyeSBhbmQgUmVzb3VyY2UgYXR0cmlidXRlcyBpbiB0aGUgZGljdGlvbmFyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdE5vZGVzICgpIHsKKwlxdWVyeUhlYWRlciA9IG5ldyBRdWVyeUhlYWRlcigpOworCXJlc3VsdE1vZGVJZCA9ICJBVFRSSUJVVEUiOworCXByb3BvZ2F0aW9uVHlwZSA9ICJCUk9BRENBU1QiOworCXByb3BvZ2F0aW9uTGV2ZWxzID0gIk4vQSI7CisJbWF4UmVzdWx0cyA9IERFRkFVTFRfTUFYX1JFU1VMVFM7CisJa3dxU3RyaW5nID0gIlVOS05PV04iOworCW1pbWVBY2NlcHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgfSAgICAKKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiByZXN1bHRNb2RlSWQuaGFzaENvZGUoKSBeIHByb3BvZ2F0aW9uVHlwZS5oYXNoQ29kZSgpIF4gcHJvcG9nYXRpb25MZXZlbHMuaGFzaENvZGUoKQorCQkJXiAobWF4UmVzdWx0cyA8PCA4KSBeIGt3cVN0cmluZy5oYXNoQ29kZSgpIF4gbnVtUmVzdWx0cyBeIHF1ZXJ5SGVhZGVyLmhhc2hDb2RlKCkKKwkJCV4gc2VsZWN0RWxlbWVudFNldC5oYXNoQ29kZSgpIF4gZnJvbUVsZW1lbnRTZXQuaGFzaENvZGUoKSBeIHdoZXJlRWxlbWVudFNldC5oYXNoQ29kZSgpCisJCQleIHJlc3VsdC5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisJCWlmIChyaHMgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChyaHMgPT0gbnVsbCB8fCAhKHJocyBpbnN0YW5jZW9mIFhNTFF1ZXJ5KSkgcmV0dXJuIGZhbHNlOworCQlYTUxRdWVyeSBvYmogPSAoWE1MUXVlcnkpIHJoczsKKwkJcmV0dXJuIHJlc3VsdE1vZGVJZC5lcXVhbHMob2JqLnJlc3VsdE1vZGVJZCkgJiYgcHJvcG9nYXRpb25UeXBlLmVxdWFscyhvYmoucHJvcG9nYXRpb25UeXBlKQorCQkJJiYgcHJvcG9nYXRpb25MZXZlbHMuZXF1YWxzKG9iai5wcm9wb2dhdGlvbkxldmVscykgJiYgbWF4UmVzdWx0cyA9PSBvYmoubWF4UmVzdWx0cworCQkJJiYga3dxU3RyaW5nLmVxdWFscyhvYmoua3dxU3RyaW5nKSAmJiBudW1SZXN1bHRzID09IG9iai5udW1SZXN1bHRzCisJCQkmJiBxdWVyeUhlYWRlci5lcXVhbHMob2JqLnF1ZXJ5SGVhZGVyKSAmJiBzZWxlY3RFbGVtZW50U2V0LmVxdWFscyhvYmouc2VsZWN0RWxlbWVudFNldCkKKwkJCSYmIGZyb21FbGVtZW50U2V0LmVxdWFscyhvYmouZnJvbUVsZW1lbnRTZXQpICYmIHdoZXJlRWxlbWVudFNldC5lcXVhbHMob2JqLndoZXJlRWxlbWVudFNldCkKKwkJCSYmIHJlc3VsdC5lcXVhbHMob2JqLnJlc3VsdCk7CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJT2JqZWN0IHJjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJjID0gc3VwZXIuY2xvbmUoKTsKKwkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2FudEhhcHBlbikge30KKwkJcmV0dXJuIHJjOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJba3dxU3RyaW5nPSIgKyBrd3FTdHJpbmcgKyAiXSI7CisJfQorCisJLyoqIENyZWF0ZSBhbiBYTUwgRE9NIGRvY3VtZW50IHVzaW5nIHRoZSBxdWVyeSBEVEQuCisJICoKKwkgKiBAcmV0dXJuIEFuIFhNTCBET00gZG9jdW1lbnQsIHdpdGggYSBxdWVyeSByb290IGVsZW1lbnQsIHVzaW5nIHRoZSBxdWVyeSBEVEQuCisJICovCisJcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKKwkJdHJ5IHsKKwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCWZhY3Rvcnkuc2V0Q29hbGVzY2luZyh0cnVlKTsKKwkJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOworCQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKwkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKwkJCXJldHVybiBidWlsZGVyLm5ld0RvY3VtZW50KCk7CisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKGFyZ3YubGVuZ3RoIDwgMiB8fCAoIWFyZ3ZbMF0uZXF1YWxzKCItZXhwciIpICYmICFhcmd2WzBdLmVxdWFscygiLWZpbGUiKSkKKwkJCXx8IChhcmd2WzBdLmVxdWFscygiLWZpbGUiKSAmJiBhcmd2Lmxlbmd0aCA+IDIpKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiAtZXhwciA8ZXhwcj4uLi4iKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiICAgb3I6IC1maWxlIDxmaWxlPiIpOworCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlYTUxRdWVyeSBxOworCQlpZiAoYXJndlswXS5lcXVhbHMoIi1leHByIikpIHsKKwkJCVN0cmluZ0J1ZmZlciBleHByID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBhcmd2Lmxlbmd0aDsgKytpKQorCQkJCWV4cHIuYXBwZW5kKGFyZ3ZbaV0pLmFwcGVuZCgnICcpOworCQkJcSA9IG5ldyBYTUxRdWVyeShleHByLnRvU3RyaW5nKCkudHJpbSgpLCAiZXhwcjEiLCAiQ29tbWFuZC1saW5lIEV4cHJlc3Npb24gUXVlcnkiLAorCQkJCSJUaGUgZXhwcmVzc2lvbiBmb3IgdGhpcyBxdWVyeSBjYW1lIGZyb20gdGhlIGNvbW1hbmQtbGluZSIsIC8qZGRJZCovIG51bGwsCisJCQkJLypyZXN1bHRNb2RlSWQqLyBudWxsLCAvKnByb3BUeXBlKi8gbnVsbCwgLypwcm9wTGV2ZWxzKi8gbnVsbCwgWE1MUXVlcnkuREVGQVVMVF9NQVhfUkVTVUxUUyk7CisJCX0gZWxzZSBpZiAoYXJndlswXS5lcXVhbHMoIi1maWxlIikpIHsKKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmd2WzFdKSk7CisJCQlTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJU3RyaW5nIGxpbmU7CisJCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKKwkJCQlzdHIuYXBwZW5kKGxpbmUpLmFwcGVuZCgnXG4nKTsKKwkJCXJlYWRlci5jbG9zZSgpOworCQkJcSA9IG5ldyBYTUxRdWVyeShzdHIudG9TdHJpbmcoKSk7CisJCX0gZWxzZSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBnZXQgaGVyZTsgb25seSAtZXhwciBvciAtZmlsZSBhbGxvd2VkLCBidXQgZ290IFwiIiArIGFyZ3ZbMF0gKyAiXCIiKTsKKwkJCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJrd2RRdWVyeVN0cmluZzogIiArIHEuZ2V0S3dkUXVlcnlTdHJpbmcoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiZnJvbUVsZW1lbnRTZXQ6ICIgKyBxLmdldEZyb21FbGVtZW50U2V0KCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc3VsdHM6ICIgKyBxLmdldFJlc3VsdCgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJ3aGVyZUVsZW1lbnRTZXQ6ICIgKyBxLmdldFdoZXJlRWxlbWVudFNldCgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3RFbGVtZW50U2V0OiAiICsgcS5nZXRTZWxlY3RFbGVtZW50U2V0KCkpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09ZG9jIHN0cmluZz09PT09PT0iKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHEuZ2V0WE1MRG9jU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBRdWVyeUhlYWRlciBnZXRRdWVyeUhlYWRlcigpIHsKKwkJcmV0dXJuIHF1ZXJ5SGVhZGVyOworCX0KKworCS8qKiBNYXhpbXVtIG51bWJlciByZXN1bHRzIHRvIGdldCAoZGVmYXVsdCkuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfUkVTVUxUUyA9IDEwMDsKKworCS8qKiBUaGUgRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVyIG9mIHRoZSBxdWVyeSBEVEQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfRlBJID0gIi0vL0pQTC8vRFREIE9PRFQgUXVlcnkgMS4wLy9FTiI7CisJCisJLyoqIFRoZSBTeXN0ZW0gSWRlbnRpZmllciBvZiB0aGUgcXVlcnkgRFRELiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1VSTCA9ICJodHRwOi8vb29kdC5qcGwubmFzYS5nb3YvZWRtLXF1ZXJ5L3F1ZXJ5LmR0ZCI7IC8vIEZJWE1FOiBNb3ZlIHRvIGFwYWNoZS5vcmcKKworCS8qKiBBIGJsYW5rIHF1ZXJ5IGRvY3VtZW50LCBhcyBhIHN0cmluZy4gKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkxBTksgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz5cbjwhRE9DVFlQRSBxdWVyeSBQVUJMSUMgJyIgKyBRVUVSWV9GUEkKKwkJKyAiJyAnIiArIFFVRVJZX1VSTCArICInPlxuPHF1ZXJ5Lz4iOworCisJLyoqIFJlc29sdmVyIGZvciB0aGUgcXVlcnkgRFRELiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIEVudGl0eVJlc29sdmVyIEVOVElUWV9SRVNPTFZFUiA9IG5ldyBFbnRlcnByaXNlRW50aXR5UmVzb2x2ZXIoKTsKKworCS8qKiBTZXJpYWwgdmVyc2lvbiB1bmlxdWUgSUQuICovCisJc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NjM4MDY4NzgyMDQ4OTYzNzEwTDsKK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvYWN0aXZpdHkvUXVlcnlDb25zdHJ1Y3RlZC5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9hY3Rpdml0eS9RdWVyeUNvbnN0cnVjdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDU5ODk2NgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvYWN0aXZpdHkvUXVlcnlDb25zdHJ1Y3RlZC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LmFjdGl2aXR5OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuSW5jaWRlbnQ7CisKK3B1YmxpYyBjbGFzcyBRdWVyeUNvbnN0cnVjdGVkIGV4dGVuZHMgSW5jaWRlbnQge30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvYWN0aXZpdHkvUmVzdWx0c1JlY2VpdmVkLmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L2FjdGl2aXR5L1Jlc3VsdHNSZWNlaXZlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjNTYxNmQKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L2FjdGl2aXR5L1Jlc3VsdHNSZWNlaXZlZC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LmFjdGl2aXR5OworCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMuYWN0aXZpdHkuSW5jaWRlbnQ7CisKK3B1YmxpYyBjbGFzcyBSZXN1bHRzUmVjZWl2ZWQgZXh0ZW5kcyBJbmNpZGVudCB7fQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9wYWNrYWdlLmh0bWwgYi8wLjEwL3htbHF1ZXJ5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDNiNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpQTCBPT0RUIFhNTC1iYXNlZCBRdWVyeS9SZXN1bHRzCisgICAgPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5DbGFzc2VzIHRvIHN1cHBvcnQgWE1MLWJhc2VkIHJlcHJlc2VudGF0aW9uIG9mIHF1ZXJpZXMgYW5kCisgICAgICB0aGVpciByZXN1bHRzLgorICAgIDwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2VkbS1xdWVyeS5qcGcgYi8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvZWRtLXF1ZXJ5LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNmI1ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2VkbS1xdWVyeS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2xhcmdlLXN0YWNrLnBuZyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9sYXJnZS1zdGFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJkY2Y1MwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9sYXJnZS1zdGFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2xhcmdlLXN0YWNrLnBzZCBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9sYXJnZS1zdGFjay5wc2QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2FhNmJlOQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9sYXJnZS1zdGFjay5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3Jlc3VsdHMucG5nIGIvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3Jlc3VsdHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlZjYzZTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcmVzdWx0cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3Jlc3VsdHMucHNkIGIvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3Jlc3VsdHMucHNkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlODQ3NmMKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvcmVzdWx0cy5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3NtYWxsLXN0YWNrLnBuZyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9zbWFsbC1zdGFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDM2MDRlZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9zbWFsbC1zdGFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3NtYWxsLXN0YWNrLnBzZCBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9zbWFsbC1zdGFjay5wc2QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDEzYWM2ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9zbWFsbC1zdGFjay5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3htbHF1ZXJ5LnBuZyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy94bWxxdWVyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg5ZmViNgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy94bWxxdWVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL3htbHF1ZXJ5LnBzZCBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy94bWxxdWVyeS5wc2QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NlMDIyMAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy94bWxxdWVyeS5wc2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS9zaXRlLnhtbCBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4NGI4ZAotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9IlF1ZXJ5IEV4cHJlc3Npb24iPgorCisgIDxib2R5PgorICAgIDxsaW5rcz4KKyAgICAgIDxpdGVtIG5hbWU9Ik9PRFQiIGhyZWY9Ii4uL29vZHQtc2l0ZS8iLz4KKyAgICA8L2xpbmtzPgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJib3R0b20iLz4KKyAgICA8bWVudSBuYW1lPSJVc2VyJ3MgR3VpZGUiPgorICAgICAgPGl0ZW0gbmFtZT0iVHV0b3JpYWwiIGhyZWY9InR1dG9yaWFsLyIvPgorICAgICAgPGl0ZW0gbmFtZT0iRElTLVN0eWxlIFF1ZXJ5IiBocmVmPSJkaXNxdWVyeS8iLz4KKyAgICAgIDxpdGVtIG5hbWU9IlF1ZXJ5IFNlcnZsZXQiIGhyZWY9InNlcnZsZXQvIi8+CisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3hkb2MvZGlzcXVlcnkvaW5kZXgueG1sIGIvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS94ZG9jL2Rpc3F1ZXJ5L2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOWRkZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS94ZG9jL2Rpc3F1ZXJ5L2luZGV4LnhtbApAQCAtMCwwICsxLDEwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvcgorbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yCithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzCitmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKK3VzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgordGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZQorTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKK3RoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPkRJUy1TdHlsZSBRdWVyeTwvdGl0bGU+CisgICAgPGF1dGhvciBlbWFpbD0iU2Vhbi5IYXJkbWFuQGpwbC5uYXNhLmdvdiI+U2VhbiBIYXJkbWFuPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJESVMtU3R5bGUgUXVlcnkiPgorICAgICAgPHA+QSBESVMtU3R5bGUgUXVlcnkgaXMgYSBxdWVyeSB1c2luZyB0cmlwbGVzIGxpbmtlZCBpbiBhIGxvZ2ljYWwgZXhwcmVzc2lvbi4gRWFjaCB0cmlwbGUgaXMgaW4gdGhlIGZvcm1hdCBvZiAoZWxlbWVudCwgcmVsYXRpb24sIGxpdGVyYWwpLiBUaGUgZWxlbWVudCBwb3J0aW9uIG9mIHRoZSB0cmlwbGUgbWF5IGJlIGFueSBuYW1lZCBkYXRhIGVsZW1lbnQgcmVjb2duaXplZCBhcyBhIHF1ZXJ5YWJsZSBhdHRyaWJ1dGUgYnkgdGhlIHRhcmdldCBvZiB0aGUgcXVlcnkuIFRoZSByZWxhdGlvbiBwb3J0aW9uIG9mIHRoZSB0cmlwbGUgbWF5IGNvbnRhaW4gYW55IG9mIHRoZSByZWxhdGlvbmFsIG9wZXJhdG9ycyBmcm9tIHRoZSB0YWJsZSBiZWxvdy4gVGhlIGxpdGVyYWwgcG9ydGlvbiBvZiB0aGUgdHJpcGxlIGlzIHRoZSBlbGVtZW50IHZhbHVlIHRvIGJlIGNvbXBhcmVkLiBNdWx0aXBsZSBzZXRzIG9mIHRyaXBsZXMgbWF5IGJlIGpvaW5lZCB1c2luZyBhbnkgb2YgdGhlIGxvZ2ljYWwgb3BlcmF0b3JzIGZyb20gdGhlIHRhYmxlIGJlbG93LiBOb3RlIHRoYXQgZWxlbWVudHMgb3IgbGl0ZXJhbHMgY29udGFpbmluZyBzcGFjZXMgbXVzdCBiZSBxdW90ZWQuIEFsc28gbm90ZSB0aGF0IGNhc2Ugc2Vuc2l0aXZpdHkgYW5kIHN1cHBvcnQgZm9yIHRoZSB2YXJpb3VzIG9wZXJhdG9ycyBpcyBzdWJqZWN0IHRvIHRoZSBjYXBhYmlsaXRpZXMgb2ZmZXJlZCBieSB0aGUgdGFyZ2V0IG9mIHRoZSBxdWVyeS4KKyAgICAgIDwvcD4KKworICAgICAgPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyB0aGUgc3VwcG9ydGVkIHJlbGF0aW9uYWwgb3BlcmF0b3JzOjwvcD4KKworICAgICAgPHRhYmxlPgorICAgICAgPHRyPgorICAgICAgICA8dGggY29sc3Bhbj0iMiI+UmVsYXRpb25hbCBPcGVyYXRvcnM8L3RoPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPkVxdWFsPC90ZD4gPHRkPj0sIEVRPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5Ob3QgRXF1YWw8L3RkPiA8dGQ+IT0sIE5FPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5MZXNzIFRoYW48L3RkPiA8dGQ+Jmx0OywgTFQ8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPkxlc3MgVGhhbiBvciBFcXVhbDwvdGQ+IDx0ZD4mbHQ7PSwgTEU8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPkdyZWF0ZXIgVGhhbjwvdGQ+IDx0ZD4mZ3Q7LCBHVDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+R3JlYXRlciBUaGFuIG9yIEVxdWFsPC90ZD4gPHRkPiZndDs9LCBHRTwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+Q29udGFpbnM8L3RkPiA8dGQ+TElLRTwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+RG9lcyBOb3QgQ29udGFpbjwvdGQ+IDx0ZD5OT1RMSUtFPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5JcyBOdWxsPC90ZD4gPHRkPklTPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5JcyBOb3QgTnVsbDwvdGQ+IDx0ZD5JU05PVDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKworICAgICAgPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyB0aGUgc3VwcG9ydGVkIGxvZ2ljYWwgb3BlcmF0b3JzOjwvcD4KKworICAgICAgPHRhYmxlPgorICAgICAgPHRyPgorICAgICAgICA8dGggY29sc3Bhbj0iMiI+TG9naWNhbCBPcGVyYXRvcnM8L3RoPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPkFuZDwvdGQ+IDx0ZD5BTkQsICZhbXA7PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5PcjwvdGQ+IDx0ZD5PUiwgfDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+Tm90PC90ZD4gPHRkPk5PVCwgITwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKworICAgICAgPHA+VGhlIGZvbGxvd2luZyBhcmUgZXhhbXBsZXMgb2YgRElTLVN0eWxlIHF1ZXJpZXM6PC9wPgorCisgICAgICA8dWw+CisgICAgICA8bGk+VGl0bGUgTElLRSBFRE0gQU5EIENyZWF0b3IgPSAiU2VhbiBIYXJkbWFuIgorICAgICAgPHA+VGhpcyBxdWVyeSB3aWxsIHJldHVybiBhbGwgb2JqZWN0cyB3aGVyZSB0aGUgPGk+VGl0bGU8L2k+IGVsZW1lbnQgY29udGFpbnMgdGhlIHRleHQgIkVETSIgYW5kIHRoZSA8aT5DcmVhdG9yPC9pPiBlbGVtZW50IGlzIGVxdWFsIHRvICJTZWFuIEhhcmRtYW4iLjwvcD4KKyAgICAgIDwvbGk+CisKKyAgICAgIDxsaT5UaXRsZSBMSUtFIEVETSBBTkQgQ3JlYXRvciA9ICJTZWFuIEhhcmRtYW4iIE9SIFRpdGxlIExJS0UgT09EVCBBTkQgQ3JlYXRvciA9ICJTZWFuIEtlbGx5IgorICAgICAgPHA+VGhpcyBxdWVyeSB3aWxsIHJldHVybiBhbGwgb2JqZWN0cyB3aGVyZSBlaXRoZXIgdGhlIGZpcnN0IHNldCBvZiBjcml0ZXJpYSBtYXRjaGVzIG9yIHRoZSBzZWNvbmQgc2V0IG9mIGNyaXRlcmlhIG1hdGNoZXMuPC9wPgorICAgICAgPC9saT4KKworICAgICAgPGxpPlRlbXBlcmF0dXJlICZndDsgMzIgQU5EIFRlbXBlcmF0dXJlICZsdDsgMjEyCisgICAgICA8cD5UaGlzIHF1ZXJ5IHdpbGwgcmV0dXJuIGFsbCBvYmplY3RzIHdoZXJlIHRoZSA8aT5UZW1wZXJhdHVyZTwvaT4gZWxlbWVudCB2YWx1ZSBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgcmFuZ2UuPC9wPgorICAgICAgPC9saT4KKworICAgICAgPGxpPlN1YmplY3QgSVMgTlVMTAorICAgICAgPHA+VGhpcyBxdWVyeSB3aWxsIHJldHVybiBhbGwgb2JqZWN0cyB3aGVyZSB0aGUgPGk+U3ViamVjdDwvaT4gZWxlbWVudCBoYXMgbm8gYXNzb2NpYXRlZCB2YWx1ZS4gV2hlbiB1c2luZyB0aGUgSVMgYW5kIElTTk9UIHJlbGF0aW9uYWwgb3BlcmF0b3JzLCB0aGUgbGl0ZXJhbCBtdXN0IGJlICJOVUxMIiBvciAibnVsbCIuPC9wPgorICAgICAgPC9saT4KKyAgICAgIDwvdWw+CisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS94ZG9jL3NlcnZsZXQvaW5kZXgueG1sIGIvMC4xMC94bWxxdWVyeS9zcmMvc2l0ZS94ZG9jL3NlcnZsZXQvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjZlMWEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3hkb2Mvc2VydmxldC9pbmRleC54bWwKQEAgLTAsMCArMSw2NDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUgY29udHJpYnV0b3IKK2xpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFLnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvcgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcworZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUKK0xpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCit0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5RdWVyeSBTZXJ2bGV0PC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSJTZWFuLktlbGx5QGpwbC5uYXNhLmdvdiI+U2VhbiBLZWxseTwvYXV0aG9yPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iUXVlcnkgU2VydmxldCI+CisKKyAgICAgIDxwPlRoZSBxdWVyeSBzZXJ2bGV0IGVuYWJsZXMgeW91IHRvIGluamVjdCBnZW5lcmljIHF1ZXJpZXMgaW50bworCXRoZSBPT0RUIGZyYW1ld29yayB1c2luZyBIVFRQLiAgVGhpcyBlbmFibGVzIHlvdSB0byBxdWVyeSBmb3IKKwlwcm9maWxlcyBhbmQgcHJvZHVjdHMgd2l0aG91dCByZXF1aXJpbmcgYSBKYXZhLCBSTUksIG9yIENPUkJBCisgICBlbmFibGVkIGFwcGxpY2F0aW9uLgorICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IlJlcXVpcmVtZW50cyI+CisKKyAgICAgIDxwPlRoZSBxdWVyeSBzZXJ2bGV0IGFjY2VwdHMgdmFyaW91cyBwYXJhbWV0ZXJzIGZvciBhIHF1ZXJ5IGFuZAorCXR1cm5zIHRoZW0gaW50byBhbiA8Y29kZT5YTUxRdWVyeTwvY29kZT4gb2JqZWN0LiAgSXQgdXNlcyB0aGlzCisJb2JqZWN0IGludGVybmFsbHkgdG8gc2VuZCB0aGUgcXVlcnkgYXJvdW5kIHRoZSBuZXR3b3JrIGFuZCB0bworCWdhdGhlciByZXN1bHRzLiAgSXQgdGhlbiByZXR1cm5zIGEgPGNvZGU+dGV4dC94bWw8L2NvZGU+CisJcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBvYmplY3QgKGZvciBwcm9kdWN0CisJcXVlcmllcykgb3IgYSA8Y29kZT50ZXh0L3htbDwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgYWxsIG1hdGNoaW5nCisJcHJvZmlsZXMgKGZvciBwcm9maWxlIHF1ZXJpZXMpLgorICAgICAgPC9wPgorCisgICAgICA8cD48c3Ryb25nPlRoYXQgbWVhbnMgeW91IG11c3QgYmUgYWJsZSB0byBwcm9jZXNzIFhNTDwvc3Ryb25nPiBpbgorCW9yZGVyIHRvIHVzZSB0aGUgcXVlcnkgc2VydmxldC4gIEx1Y2tpbHksIHRoaXMgaXNuJ3QgYW4gb25lcm91cworCXJlc3RyaWN0aW9uLCBhcyBtYW55IGxhbmd1YWdlcyBhcmUgbW9yZSB0aGFuIGNhcGFibGUgb2YgZG9pbmcgc28uCisgICAgICA8L3A+CisKKyAgICAgIDxwPkZvciBtb3JlIGRldGFpbHMsIHZpZXcgdGhlIEphdmFkb2NzIGZvciB0aGUKKwk8Y29kZT5qcGwub29kdC5zZXJ2bGV0cy5RdWVyeVNlcnZsZXQ8L2NvZGU+IGNsYXNzLjwvcD4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJVc2luZyB0aGUgUXVlcnkgU2VydmxldCI+CisKKyAgICAgIDxwPkluIG9yZGVyIHRvIHVzZSB0aGUgcXVlcnkgc2VydmxldCwgeW91IG5lZWQgdG8gc3BlY2lmeSB0aHJlZSBwYXJhbWV0ZXJzOgorICAgICAgPC9wPgorCisgICAgICA8b2w+CisJPGxpPllvdSBuZWVkIHRvIGtub3cgdGhlIDxzdHJvbmc+dHlwZSBvZiB0aGUgcXVlcnk8L3N0cm9uZz4geW91CisJICB3YW50IHRvIG1ha2UuICBZb3Ugd2lsbCB1c2UgYSBzdHJpbmcgdmFsdWUgb2YKKwkgIDxjb2RlPnByb2ZpbGU8L2NvZGU+IHRvIG1ha2UgYSBwcm9maWxlIHF1ZXJ5LCBhbmQKKwkgIDxjb2RlPnByb2R1Y3Q8L2NvZGU+IHRvIG1ha2UgYSBwcm9kdWN0IHF1ZXJ5LiAgWW91IHNwZWNpZnkKKwkgIHlvdXIgY2hvaWNlIGluIGEgcGFyYW1ldGVyIG5hbWVkIDxjb2RlPnR5cGU8L2NvZGU+LgorCTwvbGk+CisKKwk8bGk+WW91IG5lZWQgdG8ga25vdyB0aGUgPHN0cm9uZz5uYW1lIG9mIHRoZSBvYmplY3Q8L3N0cm9uZz4KKwkgIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHF1ZXJ5LiAgVGhpcyB0YWtlcyB0aGUgZm9ybSBvZgorCSAgPGNvZGU+dXJuOmVkYTo8dmFyPnByb3RvY29sPC92YXI+Ojx2YXI+bmFtZTwvdmFyPjwvY29kZT4gc3VjaAorCSAgYXMgPGNvZGU+dXJuOmVkYTpjb3JiYTpQRFMuUHJvZmlsZTwvY29kZT4gb3IKKwkgIDxjb2RlPnVybjplZGE6cm1pOk5DSS1JbWFnZVNlcnZlcjwvY29kZT4uICBZb3Ugc3BlY2lmeSB0aGUKKwkgIG9iamVjdCBuYW1lIGluIGEgcGFyYW1ldGVyIG5hbWVkIDxjb2RlPm9iamVjdDwvY29kZT4uCisJPC9saT4KKworCTxsaT5Zb3UgbmVlZCA8c3Ryb25nPnRoZSBhY3R1YWwgcXVlcnk8L3N0cm9uZz4geW91IHdhbnQgdG8KKwkgIHNlbmQuICBZb3UgY2FuIGV4cHJlc3MgdGhpcyBpbiB0d28gd2F5czoKKworCSAgPG9sPgorCSAgICA8bGk+QXMgYW4gPHN0cm9uZz5rZXl3b3JkIHF1ZXJ5IGV4cHJlc3Npb248L3N0cm9uZz4gbGlrZQorCSAgICAgIDxjb2RlPlRBUkdFVF9OQU1FID0gTUFSUzwvY29kZT4uICBZb3Ugc3BlY2lmeSB0aGUKKwkgICAgICBxdWVyeSBleHByZXNzaW9uIGluIGEgcGFyYW1ldGVyIG5hbWVkCisJICAgICAgPGNvZGU+a2V5d29yZFF1ZXJ5PC9jb2RlPi4KKwkgICAgPC9saT4KKworCSAgICA8bGk+QXMgYSA8c3Ryb25nPnRleHQgc2VyaWFsaXplZCA8Y29kZT5YTUxRdWVyeTwvY29kZT4KKwkJb2JqZWN0PC9zdHJvbmc+LiAgWW91IHNwZWNpZnkgdGhlIFhNTCBkb2N1bWVudCBpbiBhCisJICAgICAgcGFyYW1ldGVyIG5hbWVkIDxjb2RlPnF1ZXJ5PC9jb2RlPi4KKwkgICAgPC9saT4KKwkgIDwvb2w+CisKKwkgIDxwPlVzaW5nIHRoZSBsYXR0ZXIgZW5hYmxlcyB5b3UgdG8gZnVsbHkgc3BlY2lmeSBhbGwgc29ydHMgb2YKKwkgICAgcGFyYW1ldGVycyBpbiB0aGUgcXVlcnkuICBUaGUgZm9ybWVyLCB0aG91Z2gsIGlzIGZhcgorCSAgICBlYXNpZXIgdG8gdXNlLgorCSAgPC9wPgorCisJPC9saT4KKyAgICAgIDwvb2w+CisKKyAgICAgIDxwPllvdSB0aGVuIFVSTCBlbmNvZGUgcGFyYW1ldGVycycgdmFsdWVzIGFuZCBtYWtlIGVpdGhlciBhbiBIVFRQCisJPGNvZGU+R0VUPC9jb2RlPiBvciA8Y29kZT5QT1NUPC9jb2RlPiByZXF1ZXN0IHRvIHRoZSBxdWVyeQorCXNlcnZsZXQuICBJZiBhbGwgZ29lcyBhY2NvcmRpbmcgdG8gcGxhbiwgdGhlIHNlcnZsZXQgd2lsbCBleGVjdXRlCisJdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdG8geW91IGEgPGNvZGU+dGV4dC94bWw8L2NvZGU+IGRvY3VtZW50CisJZGVzY3JpYmluZyB0aGUgcmVzdWx0cy4gIFlvdSBjYW4gdGhlbiBtYW5pcHVsYXRlIHRoYXQgZG9jdW1lbnQgYXMKKwl5b3Ugc2VlIGZpdC4gIEZvciBwcm9maWxlIHF1ZXJpZXMsIHRoZSByZXR1cm4gdmFsdWUgaXMgYQorCTxjb2RlPiZsdDtwcm9maWxlcyZndDs8L2NvZGU+IGRvY3VtZW50IHdpdGggemVybyBvciBtb3JlIG1hdGNoaW5nCisJcHJvZmlsZXMuICBGb3IgcHJvZHVjdCBxdWVyaWVzLCBpdCdzIGEgPGNvZGU+Jmx0O3F1ZXJ5Jmd0OzwvY29kZT4KKworCWRvY3VtZW50IHdpdGggdGhlIG9yaWdpbmFsIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBvYmplY3Qgd2l0aCBhbnkKKwlwcm9kdWN0IHJlc3VsdHMgaW4gdGhlIDxjb2RlPiZsdDtxdWVyeVJlc3VsdHMmZ3Q7PC9jb2RlPiBzZWN0aW9uLgorICAgICAgPC9wPgorCisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iUXVlcnkgRXhhbXBsZXMiPgorCisgICAgICA8cD5MZXQncyBsb29rIGF0IGEgY291cGxlIG9mIGNvbmNyZXRlIGV4YW1wbGVzLiAgSW4gdGhlIGZpcnN0CisJZXhhbXBsZSwgd2UnbGwgcnVuIGEgcHJvZmlsZSBxdWVyeSBhZ2FpbnN0IHNvbWUgcGxhbmV0YXJ5IGRhdGEKKwlzZXJ2ZXJzOyB0aGUgc2Vjb25kIGV4YW1wbGUgd2lsbCBydW4gYSBwcm9kdWN0IHF1ZXJ5IGZvciBjYW5jZXIKKwliaW9tYXJrZXJzLgorICAgICAgPC9wPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJQbGFuZXRhcnkgUHJvZmlsZSBRdWVyeSI+CisKKwk8cD5TdXBwb3NlIHlvdSB3YW50ZWQgdG8ga25vdyB3aGF0IFBEUyBwcm9kdWN0IHNlcnZlcnMgc3VwcG9ydGVkCisJICB0aGUgcXVlcnkgZWxlbWVudCA8Y29kZT5PTkxJTkVfRklMRV9TUEVDSUZJQ0FUSU9OX05BTUU8L2NvZGU+LgorCSAgWW91IGNvdWxkIHBhc3MgdGhhdCBlbGVtZW50IHRvIHRoZSBQRFMgc3lzdGVtIHByb2ZpbGUgc2VydmVyIG5hbWVkCisJICA8Y29kZT51cm46ZWRhOnJtaTpQRFMuU3lzdGVtLlByb2ZpbGU8L2NvZGU+IHVzaW5nIHRoZSBxdWVyeQorCSAgc2VydmxldCBhdAorCSAgPGNvZGU+aHR0cDovL3N0YXJicml0ZS5qcGwubmFzYS5nb3Yvc2VydmxldC9qcGwub29kdC5zZXJ2bGV0cy5RdWVyeVNlcnZsZXQ8L2NvZGU+LgorCSAgWW91IGNhbiBmb3JtdWxhdGUgdGhlIEhUVFAgPGNvZGU+R0VUPC9jb2RlPiByZXF1ZXN0IGluIGEgVVJMIGFzCisJICBmb2xsb3dzOgorCTwvcD4KKworCTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly9zdGFyYnJpdGUuanBsLm5hc2EuZ292L3NlcnZsZXQvanBsLm9vZHQuc2VydmxldHMuUXVlcnlTZXJ2bGV0P29iamVjdD11cm46ZWRhOnJtaTpQRFMuU3lzdGVtLlByb2ZpbGUmYW1wO3R5cGU9cHJvZmlsZSZhbXA7a2V5d29yZFF1ZXJ5PU9OTElORV9GSUxFX1NQRUNJRklDQVRJT05fTkFNRSslM0QrQU5ZIj5odHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9zZXJ2bGV0L2pwbC5vb2R0LnNlcnZsZXRzLlF1ZXJ5U2VydmxldD88YnIvPiAgb2JqZWN0PXVybjplZGE6cm1pOlBEUy5TeXN0ZW0uUHJvZmlsZSZhbXA7PGJyLz4gIHR5cGU9cHJvZmlsZSZhbXA7PGJyLz4gIGtleXdvcmRRdWVyeT1PTkxJTkVfRklMRV9TUEVDSUZJQ0FUSU9OX05BTUUrJTNEK0FOWTwvYT48L2NvZGU+PC9wPgorCisJPHA+Tm90ZSB0aGF0IHdlJ3ZlIGJyb2tlbiB0aGlzIFVSTCBpbnRvIG11bHRpcGxlIGxpbmVzIGZvcgorCSAgcmVhZGFiaWxpdHkuICBUaGVyZSBzaG91bGQgYmUgbm8gbGluZWJyZWFrcyBpbiBhIHJlYWwgVVJMLiAgTm90ZQorCSAgdGhlIGZvbGxvd2luZyBhYm91dCB0aGlzIFVSTDoKKwk8L3A+CisKKwk8dWw+CisJICA8bGk+VGhlIHF1ZXN0aW9uLW1hcmsgc2VwYXJhdGVzIHRoZSByZXF1ZXN0IFVSSSBmcm9tIGl0cworCSAgICBwYXJhbWV0ZXJzLgorCSAgPC9saT4KKworCSAgPGxpPlRoZSBwYXJhbWV0ZXJzIG1heSBjb21lIGluIGFueSBvcmRlci48L2xpPgorCisJICA8bGk+VGhlIDxjb2RlPm9iamVjdDwvY29kZT4gcGFyYW1ldGVyIG5hbWVzIHRoZSB0YXJnZXQgb2YgdGhlCisJICAgIHF1ZXJ5OyBpbiB0aGlzIGNhc2UsIHRoZSBSTUkgcHJvZHVjdCBzZXJ2ZXIgbmFtZWQKKwkgICAgPGNvZGU+dXJuOmVkYTpybWk6UERTLlN5c3RlbS5Qcm9maWxlPC9jb2RlPi4KKwkgIDwvbGk+CisKKwkgIDxsaT5UaGUgPGNvZGU+dHlwZTwvY29kZT4gcGFyYW1ldGVyIHNwZWNpZmllcyB0aGF0IHdlJ3JlIGRvaW5nIGEKKwkgICAgPGVtPnByb2ZpbGUgc2VhcmNoPC9lbT4uPC9saT4KKworCSAgPGxpPlRoZSA8Y29kZT5rZXl3b3JkUXVlcnk8L2NvZGU+IHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBxdWVyeQorCSAgICBleHByZXNzaW9uLiAgTm90ZSB0aGUgVVJMIGVuY29kaW5nOiB0aGUgc3BhY2VzIGJlY29tZQorCSAgICA8Y29kZT4rPC9jb2RlPiBzeW1ib2xzLCBhbmQgdGhlIGVxdWFscyBzaWduIGJlY29tZQorCSAgICA8Y29kZT4lM0Q8L2NvZGU+LgorCSAgPC9saT4KKwk8L3VsPgorCisJPHA+VGhlIHJlc3BvbnNlIGZyb20gc3VjaCBhIHF1ZXJ5IGlzIGFuIFhNTCBkb2N1bWVudDsgdGhpcyBYTUwKKwkgIGRvY3VtZW50IGRlc2NyaWJlcyBtYXRjaGluZyBwcm9maWxlcyBhbmQgbWF5IHRha2UgYSBmb3JtIHN1Y2ggYXMKKwkgIHRoZSBmb2xsb3dpbmc6PC9wPgorCis8c291cmNlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKKyZsdDshRE9DVFlQRSBwcm9maWxlcyBQVUJMSUMgIi0vL0pQTC8vRFREIE9PRFQgUHJvZmlsZSAxLjEvL0VOIgorImh0dHA6Ly9zdGFyc2hpbmUuanBsLm5hc2EuZ292OjgwL2R0ZC9wcm9mLmR0ZCImZ3Q7CisKKyZsdDtwcm9maWxlcyZndDsKKyAgJmx0O3Byb2ZpbGUmZ3Q7CisgICAgJmx0O3Byb2ZBdHRyaWJ1dGVzJmd0OworICAgICAgJmx0O3Byb2ZJZCZndDsxLjMuNi4xLjQuMS4xMzA2LjIuMS4xLjcmbHQ7L3Byb2ZJZCZndDsKKyAgICAgICZsdDtwcm9mVHlwZSZndDtwcm9maWxlJmx0Oy9wcm9mVHlwZSZndDsKKyAgICAgICZsdDtwcm9mU3RhdHVzSWQmZ3Q7YWN0aXZlJmx0Oy9wcm9mU3RhdHVzSWQmZ3Q7CisgICAgJmx0Oy9wcm9mQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cmVzQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtJZGVudGlmaWVyJmd0O1BEUy5BU1UuUHJvZHVjdCZsdDsvSWRlbnRpZmllciZndDsKKyAgICAgICZsdDtUaXRsZSZndDsKKyAgICAgIFBEUyBBcml6b25hIFN0YXRlIFVuaXZlcnNpdHkgRGF0YSBOb2RlIFByb2R1Y3QgU2VydmVyCisgICAgICAmbHQ7L1RpdGxlJmd0OworICAgICAgJmx0O0Zvcm1hdCZndDt0ZXh0L2h0bWwmbHQ7L0Zvcm1hdCZndDsKKyAgICAgICZsdDtyZXNDb250ZXh0Jmd0O05BU0EuUERTLkFTVSZsdDsvcmVzQ29udGV4dCZndDsKKyAgICAgICZsdDtyZXNDbGFzcyZndDtzeXN0ZW0ucHJvZHVjdFNlcnZlciZsdDsvcmVzQ2xhc3MmZ3Q7CisgICAgICAmbHQ7cmVzTG9jYXRpb24mZ3Q7CisgICAgICBodHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9zZXJ2bGV0LworICAgICAganBsLm9vZHQuc2VydmxldHMuUHJvZHVjdFNlcnZsZXQ/b2JqZWN0PVBEUy5BU1UuUHJvZHVjdAorICAgICAgJmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAgICZsdDtyZXNMb2NhdGlvbiZndDt1cm46ZWRhOnJtaTpQRFMuQVNVLlByb2R1Y3QmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICZsdDsvcmVzQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7T05MSU5FX0ZJTEVfU1BFQ0lGSUNBVElPTl9OQU1FJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7UkVUVVJOX1RZUEUmbHQ7L2VsZW1OYW1lJmd0OworICAgICAgJmx0O2VsZW1UeXBlJmd0O0NIQVJBQ1RFUiZsdDsvZWxlbVR5cGUmZ3Q7CisgICAgICAmbHQ7ZWxlbUVudW1GbGFnJmd0O1QmbHQ7L2VsZW1FbnVtRmxhZyZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX1pJUCZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtQRFNfTEFCRUwmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UkFXJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgJmx0Oy9wcm9maWxlJmd0OworCisgICZsdDtwcm9maWxlJmd0OworICAgICZsdDtwcm9mQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtwcm9mSWQmZ3Q7MS4zLjYuMS40LjEuMTMwNi4yLjEuMS42Jmx0Oy9wcm9mSWQmZ3Q7CisgICAgICAmbHQ7cHJvZlR5cGUmZ3Q7cHJvZmlsZSZsdDsvcHJvZlR5cGUmZ3Q7CisgICAgICAmbHQ7cHJvZlN0YXR1c0lkJmd0O2FjdGl2ZSZsdDsvcHJvZlN0YXR1c0lkJmd0OworICAgICZsdDsvcHJvZkF0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3Jlc0F0dHJpYnV0ZXMmZ3Q7CisgICAgICAmbHQ7SWRlbnRpZmllciZndDtQRFMuUlMuUHJvZHVjdCZsdDsvSWRlbnRpZmllciZndDsKKyAgICAgICZsdDtUaXRsZSZndDtQRFMgUmFkaW8gU2NpZW5jZSBQcm9kdWN0IFNlcnZlciZsdDsvVGl0bGUmZ3Q7CisgICAgICAmbHQ7Rm9ybWF0Jmd0O3RleHQvaHRtbCZsdDsvRm9ybWF0Jmd0OworICAgICAgJmx0O3Jlc0NvbnRleHQmZ3Q7TkFTQS5QRFMuUlMmbHQ7L3Jlc0NvbnRleHQmZ3Q7CisgICAgICAmbHQ7cmVzQ2xhc3MmZ3Q7c3lzdGVtLnByb2R1Y3RTZXJ2ZXImbHQ7L3Jlc0NsYXNzJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0OworICAgICAgaHR0cDovL3N0YXJicml0ZS5qcGwubmFzYS5nb3Yvc2VydmxldC8KKyAgICAgIGpwbC5vb2R0LnNlcnZsZXRzLlByb2R1Y3RTZXJ2bGV0P29iamVjdD1QRFMuUlMuUHJvZHVjdAorICAgICAgJmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAgICZsdDtyZXNMb2NhdGlvbiZndDt1cm46ZWRhOnJtaTpQRFMuUlMuUHJvZHVjdCZsdDsvcmVzTG9jYXRpb24mZ3Q7CisgICAgJmx0Oy9yZXNBdHRyaWJ1dGVzJmd0OworICAgICZsdDtwcm9mRWxlbWVudCZndDsKKyAgICAgICZsdDtlbGVtTmFtZSZndDtPTkxJTkVfRklMRV9TUEVDSUZJQ0FUSU9OX05BTUUmbHQ7L2VsZW1OYW1lJmd0OworICAgICAgJmx0O2VsZW1UeXBlJmd0O0NIQVJBQ1RFUiZsdDsvZWxlbVR5cGUmZ3Q7CisgICAgICAmbHQ7ZWxlbUVudW1GbGFnJmd0O1QmbHQ7L2VsZW1FbnVtRmxhZyZndDsKKyAgICAgICZsdDtlbGVtTWF4T2NjdXJyZW5jZSZndDswJmx0Oy9lbGVtTWF4T2NjdXJyZW5jZSZndDsKKyAgICAmbHQ7L3Byb2ZFbGVtZW50Jmd0OworICAgICZsdDtwcm9mRWxlbWVudCZndDsKKyAgICAgICZsdDtlbGVtTmFtZSZndDtSRVRVUk5fVFlQRSZsdDsvZWxlbU5hbWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVR5cGUmZ3Q7Q0hBUkFDVEVSJmx0Oy9lbGVtVHlwZSZndDsKKyAgICAgICZsdDtlbGVtRW51bUZsYWcmZ3Q7VCZsdDsvZWxlbUVudW1GbGFnJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtQRFNfWklQJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1BEU19MQUJFTCZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtSQVcmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtTWF4T2NjdXJyZW5jZSZndDswJmx0Oy9lbGVtTWF4T2NjdXJyZW5jZSZndDsKKyAgICAmbHQ7L3Byb2ZFbGVtZW50Jmd0OworICAmbHQ7L3Byb2ZpbGUmZ3Q7CisKKyAgJmx0O3Byb2ZpbGUmZ3Q7CisgICAgJmx0O3Byb2ZBdHRyaWJ1dGVzJmd0OworICAgICAgJmx0O3Byb2ZJZCZndDsxLjMuNi4xLjQuMS4xMzA2LjIuMS4xLjQmbHQ7L3Byb2ZJZCZndDsKKyAgICAgICZsdDtwcm9mVHlwZSZndDtwcm9maWxlJmx0Oy9wcm9mVHlwZSZndDsKKyAgICAgICZsdDtwcm9mU3RhdHVzSWQmZ3Q7YWN0aXZlJmx0Oy9wcm9mU3RhdHVzSWQmZ3Q7CisgICAgJmx0Oy9wcm9mQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cmVzQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtJZGVudGlmaWVyJmd0O1BEUy5BdG1vcy5Qcm9kdWN0Jmx0Oy9JZGVudGlmaWVyJmd0OworICAgICAgJmx0O1RpdGxlJmd0O1BEUyBBdG1vc3BoZXJlcyBQcm9kdWN0IFNlcnZlciZsdDsvVGl0bGUmZ3Q7CisgICAgICAmbHQ7Rm9ybWF0Jmd0O3RleHQvaHRtbCZsdDsvRm9ybWF0Jmd0OworICAgICAgJmx0O3Jlc0NvbnRleHQmZ3Q7TkFTQS5QRFMuQXRtb3MmbHQ7L3Jlc0NvbnRleHQmZ3Q7CisgICAgICAmbHQ7cmVzQ2xhc3MmZ3Q7c3lzdGVtLnByb2R1Y3RTZXJ2ZXImbHQ7L3Jlc0NsYXNzJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0OworICAgICAgaHR0cDovL3N0YXJicml0ZS5qcGwubmFzYS5nb3Yvc2VydmxldC8KKyAgICAgIGpwbC5vb2R0LnNlcnZsZXRzLlByb2R1Y3RTZXJ2bGV0P29iamVjdD1QRFMuQXRtb3MuUHJvZHVjdAorICAgICAgJmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAgICZsdDtyZXNMb2NhdGlvbiZndDt1cm46ZWRhOnJtaTpQRFMuQXRtb3MuUHJvZHVjdCZsdDsvcmVzTG9jYXRpb24mZ3Q7CisgICAgJmx0Oy9yZXNBdHRyaWJ1dGVzJmd0OworICAgICZsdDtwcm9mRWxlbWVudCZndDsKKyAgICAgICZsdDtlbGVtTmFtZSZndDtPTkxJTkVfRklMRV9TUEVDSUZJQ0FUSU9OX05BTUUmbHQ7L2VsZW1OYW1lJmd0OworICAgICAgJmx0O2VsZW1UeXBlJmd0O0NIQVJBQ1RFUiZsdDsvZWxlbVR5cGUmZ3Q7CisgICAgICAmbHQ7ZWxlbUVudW1GbGFnJmd0O1QmbHQ7L2VsZW1FbnVtRmxhZyZndDsKKyAgICAgICZsdDtlbGVtTWF4T2NjdXJyZW5jZSZndDswJmx0Oy9lbGVtTWF4T2NjdXJyZW5jZSZndDsKKyAgICAmbHQ7L3Byb2ZFbGVtZW50Jmd0OworICAgICZsdDtwcm9mRWxlbWVudCZndDsKKyAgICAgICZsdDtlbGVtTmFtZSZndDtSRVRVUk5fVFlQRSZsdDsvZWxlbU5hbWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVR5cGUmZ3Q7Q0hBUkFDVEVSJmx0Oy9lbGVtVHlwZSZndDsKKyAgICAgICZsdDtlbGVtRW51bUZsYWcmZ3Q7VCZsdDsvZWxlbUVudW1GbGFnJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtQRFNfWklQJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1BEU19MQUJFTCZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtSQVcmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtTWF4T2NjdXJyZW5jZSZndDswJmx0Oy9lbGVtTWF4T2NjdXJyZW5jZSZndDsKKyAgICAmbHQ7L3Byb2ZFbGVtZW50Jmd0OworICAmbHQ7L3Byb2ZpbGUmZ3Q7CisKKyAgJmx0O3Byb2ZpbGUmZ3Q7CisgICAgJmx0O3Byb2ZBdHRyaWJ1dGVzJmd0OworICAgICAgJmx0O3Byb2ZJZCZndDsxLjMuNi4xLjQuMS4xMzA2LjIuMS4xLjMmbHQ7L3Byb2ZJZCZndDsKKyAgICAgICZsdDtwcm9mVHlwZSZndDtwcm9maWxlJmx0Oy9wcm9mVHlwZSZndDsKKyAgICAgICZsdDtwcm9mU3RhdHVzSWQmZ3Q7YWN0aXZlJmx0Oy9wcm9mU3RhdHVzSWQmZ3Q7CisgICAgJmx0Oy9wcm9mQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cmVzQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtJZGVudGlmaWVyJmd0O1BEUy5OQUlGLlByb2R1Y3QmbHQ7L0lkZW50aWZpZXImZ3Q7CisgICAgICAmbHQ7VGl0bGUmZ3Q7UERTIE5BSUYgUHJvZHVjdCBTZXJ2ZXImbHQ7L1RpdGxlJmd0OworICAgICAgJmx0O0Zvcm1hdCZndDt0ZXh0L2h0bWwmbHQ7L0Zvcm1hdCZndDsKKyAgICAgICZsdDtyZXNDb250ZXh0Jmd0O05BU0EuUERTLk5BSUYmbHQ7L3Jlc0NvbnRleHQmZ3Q7CisgICAgICAmbHQ7cmVzQ2xhc3MmZ3Q7c3lzdGVtLnByb2R1Y3RTZXJ2ZXImbHQ7L3Jlc0NsYXNzJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0OworICAgICAgaHR0cDovL3N0YXJicml0ZS5qcGwubmFzYS5nb3Yvc2VydmxldC8KKyAgICAgIGpwbC5vb2R0LnNlcnZsZXRzLlByb2R1Y3RTZXJ2bGV0P29iamVjdD1QRFMuTkFJRi5Qcm9kdWN0CisgICAgICAmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0O3VybjplZGE6cm1pOlBEUy5OQUlGLlByb2R1Y3QmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICZsdDsvcmVzQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7T05MSU5FX0ZJTEVfU1BFQ0lGSUNBVElPTl9OQU1FJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7UkVUVVJOX1RZUEUmbHQ7L2VsZW1OYW1lJmd0OworICAgICAgJmx0O2VsZW1UeXBlJmd0O0NIQVJBQ1RFUiZsdDsvZWxlbVR5cGUmZ3Q7CisgICAgICAmbHQ7ZWxlbUVudW1GbGFnJmd0O1QmbHQ7L2VsZW1FbnVtRmxhZyZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX1pJUCZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtQRFNfTEFCRUwmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UkFXJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgJmx0Oy9wcm9maWxlJmd0OworCisgICZsdDtwcm9maWxlJmd0OworICAgICZsdDtwcm9mQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtwcm9mSWQmZ3Q7MS4zLjYuMS40LjEuMTMwNi4yLjEuMS4yJmx0Oy9wcm9mSWQmZ3Q7CisgICAgICAmbHQ7cHJvZlR5cGUmZ3Q7cHJvZmlsZSZsdDsvcHJvZlR5cGUmZ3Q7CisgICAgICAmbHQ7cHJvZlN0YXR1c0lkJmd0O2FjdGl2ZSZsdDsvcHJvZlN0YXR1c0lkJmd0OworICAgICZsdDsvcHJvZkF0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3Jlc0F0dHJpYnV0ZXMmZ3Q7CisgICAgICAmbHQ7SWRlbnRpZmllciZndDtQRFMuR2VvLlByb2R1Y3QmbHQ7L0lkZW50aWZpZXImZ3Q7CisgICAgICAmbHQ7VGl0bGUmZ3Q7UERTIEdlb3NjaWVuY2VzIFByb2R1Y3QgU2VydmVyJmx0Oy9UaXRsZSZndDsKKyAgICAgICZsdDtGb3JtYXQmZ3Q7dGV4dC9odG1sJmx0Oy9Gb3JtYXQmZ3Q7CisgICAgICAmbHQ7cmVzQ29udGV4dCZndDtOQVNBLlBEUy5HRU8mbHQ7L3Jlc0NvbnRleHQmZ3Q7CisgICAgICAmbHQ7cmVzQ2xhc3MmZ3Q7c3lzdGVtLnByb2R1Y3RTZXJ2ZXImbHQ7L3Jlc0NsYXNzJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0OworICAgICAgaHR0cDovL3N0YXJicml0ZS5qcGwubmFzYS5nb3Yvc2VydmxldC8KKyAgICAgIGpwbC5vb2R0LnNlcnZsZXRzLlByb2R1Y3RTZXJ2bGV0P29iamVjdD1QRFMuR2VvLlByb2R1Y3QKKyAgICAgICZsdDsvcmVzTG9jYXRpb24mZ3Q7CisgICAgICAmbHQ7cmVzTG9jYXRpb24mZ3Q7dXJuOmVkYTpybWk6UERTLkdlby5Qcm9kdWN0Jmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAmbHQ7L3Jlc0F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3Byb2ZFbGVtZW50Jmd0OworICAgICAgJmx0O2VsZW1OYW1lJmd0O09OTElORV9GSUxFX1NQRUNJRklDQVRJT05fTkFNRSZsdDsvZWxlbU5hbWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVR5cGUmZ3Q7Q0hBUkFDVEVSJmx0Oy9lbGVtVHlwZSZndDsKKyAgICAgICZsdDtlbGVtRW51bUZsYWcmZ3Q7VCZsdDsvZWxlbUVudW1GbGFnJmd0OworICAgICAgJmx0O2VsZW1NYXhPY2N1cnJlbmNlJmd0OzAmbHQ7L2VsZW1NYXhPY2N1cnJlbmNlJmd0OworICAgICZsdDsvcHJvZkVsZW1lbnQmZ3Q7CisgICAgJmx0O3Byb2ZFbGVtZW50Jmd0OworICAgICAgJmx0O2VsZW1OYW1lJmd0O1JFVFVSTl9UWVBFJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1BEU19aSVAmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX0xBQkVMJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1JBVyZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1NYXhPY2N1cnJlbmNlJmd0OzAmbHQ7L2VsZW1NYXhPY2N1cnJlbmNlJmd0OworICAgICZsdDsvcHJvZkVsZW1lbnQmZ3Q7CisgICZsdDsvcHJvZmlsZSZndDsKKworICAmbHQ7cHJvZmlsZSZndDsKKyAgICAmbHQ7cHJvZkF0dHJpYnV0ZXMmZ3Q7CisgICAgICAmbHQ7cHJvZklkJmd0OzEuMy42LjEuNC4xLjEzMDYuMi4xLjEuMSZsdDsvcHJvZklkJmd0OworICAgICAgJmx0O3Byb2ZUeXBlJmd0O3Byb2ZpbGUmbHQ7L3Byb2ZUeXBlJmd0OworICAgICAgJmx0O3Byb2ZTdGF0dXNJZCZndDthY3RpdmUmbHQ7L3Byb2ZTdGF0dXNJZCZndDsKKyAgICAmbHQ7L3Byb2ZBdHRyaWJ1dGVzJmd0OworICAgICZsdDtyZXNBdHRyaWJ1dGVzJmd0OworICAgICAgJmx0O0lkZW50aWZpZXImZ3Q7UERTLkNOLlByb2R1Y3QmbHQ7L0lkZW50aWZpZXImZ3Q7CisgICAgICAmbHQ7VGl0bGUmZ3Q7UERTIENlbnRyYWwgTm9kZSBBcmNoaXZlIFByb2R1Y3QgU2VydmVyJmx0Oy9UaXRsZSZndDsKKyAgICAgICZsdDtGb3JtYXQmZ3Q7dGV4dC9odG1sJmx0Oy9Gb3JtYXQmZ3Q7CisgICAgICAmbHQ7cmVzQ29udGV4dCZndDtOQVNBLlBEUy5DTiZsdDsvcmVzQ29udGV4dCZndDsKKyAgICAgICZsdDtyZXNDbGFzcyZndDtzeXN0ZW0ucHJvZHVjdFNlcnZlciZsdDsvcmVzQ2xhc3MmZ3Q7CisgICAgICAmbHQ7cmVzTG9jYXRpb24mZ3Q7CisgICAgICBodHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9zZXJ2bGV0LworICAgICAganBsLm9vZHQuc2VydmxldHMuUHJvZHVjdFNlcnZsZXQ/b2JqZWN0PVBEUy5DTi5Qcm9kdWN0CisgICAgICAmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0O3VybjplZGE6cm1pOlBEUy5DTi5Qcm9kdWN0Jmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAmbHQ7L3Jlc0F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3Byb2ZFbGVtZW50Jmd0OworICAgICAgJmx0O2VsZW1OYW1lJmd0O09OTElORV9GSUxFX1NQRUNJRklDQVRJT05fTkFNRSZsdDsvZWxlbU5hbWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVR5cGUmZ3Q7Q0hBUkFDVEVSJmx0Oy9lbGVtVHlwZSZndDsKKyAgICAgICZsdDtlbGVtRW51bUZsYWcmZ3Q7VCZsdDsvZWxlbUVudW1GbGFnJmd0OworICAgICAgJmx0O2VsZW1NYXhPY2N1cnJlbmNlJmd0OzAmbHQ7L2VsZW1NYXhPY2N1cnJlbmNlJmd0OworICAgICZsdDsvcHJvZkVsZW1lbnQmZ3Q7CisgICAgJmx0O3Byb2ZFbGVtZW50Jmd0OworICAgICAgJmx0O2VsZW1OYW1lJmd0O1JFVFVSTl9UWVBFJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1BEU19aSVAmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX0xBQkVMJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1JBVyZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1NYXhPY2N1cnJlbmNlJmd0OzAmbHQ7L2VsZW1NYXhPY2N1cnJlbmNlJmd0OworICAgICZsdDsvcHJvZkVsZW1lbnQmZ3Q7CisgICZsdDsvcHJvZmlsZSZndDsKKworICAmbHQ7cHJvZmlsZSZndDsKKyAgICAmbHQ7cHJvZkF0dHJpYnV0ZXMmZ3Q7CisgICAgICAmbHQ7cHJvZklkJmd0OzEuMy42LjEuNC4xLjEzMDYuMi4xLjEuMTAmbHQ7L3Byb2ZJZCZndDsKKyAgICAgICZsdDtwcm9mVHlwZSZndDtwcm9maWxlJmx0Oy9wcm9mVHlwZSZndDsKKyAgICAgICZsdDtwcm9mU3RhdHVzSWQmZ3Q7YWN0aXZlJmx0Oy9wcm9mU3RhdHVzSWQmZ3Q7CisgICAgJmx0Oy9wcm9mQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cmVzQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtJZGVudGlmaWVyJmd0O1BEUy5DTi5Qcm9maWxlJmx0Oy9JZGVudGlmaWVyJmd0OworICAgICAgJmx0O1RpdGxlJmd0O1BEUy5DTi5Qcm9maWxlJmx0Oy9UaXRsZSZndDsKKyAgICAgICZsdDtGb3JtYXQmZ3Q7dGV4dC9odG1sJmx0Oy9Gb3JtYXQmZ3Q7CisgICAgICAmbHQ7cmVzQ29udGV4dCZndDtOQVNBLlBEUy5DTiZsdDsvcmVzQ29udGV4dCZndDsKKyAgICAgICZsdDtyZXNDbGFzcyZndDtzeXN0ZW0ucHJvZHVjdFNlcnZlciZsdDsvcmVzQ2xhc3MmZ3Q7CisgICAgICAmbHQ7cmVzTG9jYXRpb24mZ3Q7CisgICAgICBodHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9zZXJ2bGV0LworICAgICAganBsLm9vZHQuc2VydmxldHMuUHJvZHVjdFNlcnZsZXQ/b2JqZWN0PVBEUy5DTi5Qcm9maWxlCisgICAgICAmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICAgJmx0O3Jlc0xvY2F0aW9uJmd0O3VybjplZGE6cm1pOlBEUy5DTi5Qcm9maWxlJmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAmbHQ7L3Jlc0F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3Byb2ZFbGVtZW50Jmd0OworICAgICAgJmx0O2VsZW1OYW1lJmd0O09OTElORV9GSUxFX1NQRUNJRklDQVRJT05fTkFNRSZsdDsvZWxlbU5hbWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVR5cGUmZ3Q7Q0hBUkFDVEVSJmx0Oy9lbGVtVHlwZSZndDsKKyAgICAgICZsdDtlbGVtRW51bUZsYWcmZ3Q7VCZsdDsvZWxlbUVudW1GbGFnJmd0OworICAgICAgJmx0O2VsZW1NYXhPY2N1cnJlbmNlJmd0OzAmbHQ7L2VsZW1NYXhPY2N1cnJlbmNlJmd0OworICAgICZsdDsvcHJvZkVsZW1lbnQmZ3Q7CisgICAgJmx0O3Byb2ZFbGVtZW50Jmd0OworICAgICAgJmx0O2VsZW1OYW1lJmd0O1JFVFVSTl9UWVBFJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1BEU19aSVAmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX0xBQkVMJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbVZhbHVlJmd0O1JBVyZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1NYXhPY2N1cnJlbmNlJmd0OzAmbHQ7L2VsZW1NYXhPY2N1cnJlbmNlJmd0OworICAgICZsdDsvcHJvZkVsZW1lbnQmZ3Q7CisgICZsdDsvcHJvZmlsZSZndDsKKworICAmbHQ7cHJvZmlsZSZndDsKKyAgICAmbHQ7cHJvZkF0dHJpYnV0ZXMmZ3Q7CisgICAgICAmbHQ7cHJvZklkJmd0OzEuMy42LjEuNC4xLjEzMDYuMi4xLjEuOSZsdDsvcHJvZklkJmd0OworICAgICAgJmx0O3Byb2ZUeXBlJmd0O3Byb2ZpbGUmbHQ7L3Byb2ZUeXBlJmd0OworICAgICAgJmx0O3Byb2ZTdGF0dXNJZCZndDthY3RpdmUmbHQ7L3Byb2ZTdGF0dXNJZCZndDsKKyAgICAmbHQ7L3Byb2ZBdHRyaWJ1dGVzJmd0OworICAgICZsdDtyZXNBdHRyaWJ1dGVzJmd0OworICAgICAgJmx0O0lkZW50aWZpZXImZ3Q7UERTLlBQSS5Qcm9kdWN0Jmx0Oy9JZGVudGlmaWVyJmd0OworICAgICAgJmx0O1RpdGxlJmd0OworICAgICAgUERTIFBsYW5ldGFyeSBQbGFzbWEgSW50ZXJhY3Rpb25zIFByb2R1Y3QgU2VydmVyCisgICAgICAmbHQ7L1RpdGxlJmd0OworICAgICAgJmx0O0Zvcm1hdCZndDt0ZXh0L2h0bWwmbHQ7L0Zvcm1hdCZndDsKKyAgICAgICZsdDtyZXNDb250ZXh0Jmd0O05BU0EuUERTLlBQSSZsdDsvcmVzQ29udGV4dCZndDsKKyAgICAgICZsdDtyZXNDbGFzcyZndDtzeXN0ZW0ucHJvZHVjdFNlcnZlciZsdDsvcmVzQ2xhc3MmZ3Q7CisgICAgICAmbHQ7cmVzTG9jYXRpb24mZ3Q7CisgICAgICBodHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9zZXJ2bGV0LworICAgICAganBsLm9vZHQuc2VydmxldHMuUHJvZHVjdFNlcnZsZXQ/b2JqZWN0PVBEUy5QUEkuUHJvZHVjdAorICAgICAgJmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAgICZsdDtyZXNMb2NhdGlvbiZndDt1cm46ZWRhOnJtaTpQRFMuUFBJLlByb2R1Y3QmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICZsdDsvcmVzQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7T05MSU5FX0ZJTEVfU1BFQ0lGSUNBVElPTl9OQU1FJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7UkVUVVJOX1RZUEUmbHQ7L2VsZW1OYW1lJmd0OworICAgICAgJmx0O2VsZW1UeXBlJmd0O0NIQVJBQ1RFUiZsdDsvZWxlbVR5cGUmZ3Q7CisgICAgICAmbHQ7ZWxlbUVudW1GbGFnJmd0O1QmbHQ7L2VsZW1FbnVtRmxhZyZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX1pJUCZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtQRFNfTEFCRUwmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UkFXJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgJmx0Oy9wcm9maWxlJmd0OworCisgICZsdDtwcm9maWxlJmd0OworICAgICZsdDtwcm9mQXR0cmlidXRlcyZndDsKKyAgICAgICZsdDtwcm9mSWQmZ3Q7MS4zLjYuMS40LjEuMTMwNi4yLjEuMS44Jmx0Oy9wcm9mSWQmZ3Q7CisgICAgICAmbHQ7cHJvZlR5cGUmZ3Q7cHJvZmlsZSZsdDsvcHJvZlR5cGUmZ3Q7CisgICAgICAmbHQ7cHJvZlN0YXR1c0lkJmd0O2FjdGl2ZSZsdDsvcHJvZlN0YXR1c0lkJmd0OworICAgICZsdDsvcHJvZkF0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3Jlc0F0dHJpYnV0ZXMmZ3Q7CisgICAgICAmbHQ7SWRlbnRpZmllciZndDtQRFMuSW1nLlByb2R1Y3QmbHQ7L0lkZW50aWZpZXImZ3Q7CisgICAgICAmbHQ7VGl0bGUmZ3Q7UERTIEltYWdpbmcgUHJvZHVjdCBTZXJ2ZXImbHQ7L1RpdGxlJmd0OworICAgICAgJmx0O0Zvcm1hdCZndDt0ZXh0L2h0bWwmbHQ7L0Zvcm1hdCZndDsKKyAgICAgICZsdDtyZXNDb250ZXh0Jmd0O05BU0EuUERTLkltZyZsdDsvcmVzQ29udGV4dCZndDsKKyAgICAgICZsdDtyZXNDbGFzcyZndDtzeXN0ZW0ucHJvZHVjdFNlcnZlciZsdDsvcmVzQ2xhc3MmZ3Q7CisgICAgICAmbHQ7cmVzTG9jYXRpb24mZ3Q7CisgICAgICBodHRwOi8vc3RhcmJyaXRlLmpwbC5uYXNhLmdvdi9zZXJ2bGV0LworICAgICAganBsLm9vZHQuc2VydmxldHMuUHJvZHVjdFNlcnZsZXQ/b2JqZWN0PVBEUy5JbWcuUHJvZHVjdAorICAgICAgJmx0Oy9yZXNMb2NhdGlvbiZndDsKKyAgICAgICZsdDtyZXNMb2NhdGlvbiZndDt1cm46ZWRhOnJtaTpQRFMuSW1nLlByb2R1Y3QmbHQ7L3Jlc0xvY2F0aW9uJmd0OworICAgICZsdDsvcmVzQXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7T05MSU5FX0ZJTEVfU1BFQ0lGSUNBVElPTl9OQU1FJmx0Oy9lbGVtTmFtZSZndDsKKyAgICAgICZsdDtlbGVtVHlwZSZndDtDSEFSQUNURVImbHQ7L2VsZW1UeXBlJmd0OworICAgICAgJmx0O2VsZW1FbnVtRmxhZyZndDtUJmx0Oy9lbGVtRW51bUZsYWcmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgICAmbHQ7cHJvZkVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7ZWxlbU5hbWUmZ3Q7UkVUVVJOX1RZUEUmbHQ7L2VsZW1OYW1lJmd0OworICAgICAgJmx0O2VsZW1UeXBlJmd0O0NIQVJBQ1RFUiZsdDsvZWxlbVR5cGUmZ3Q7CisgICAgICAmbHQ7ZWxlbUVudW1GbGFnJmd0O1QmbHQ7L2VsZW1FbnVtRmxhZyZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UERTX1pJUCZsdDsvZWxlbVZhbHVlJmd0OworICAgICAgJmx0O2VsZW1WYWx1ZSZndDtQRFNfTEFCRUwmbHQ7L2VsZW1WYWx1ZSZndDsKKyAgICAgICZsdDtlbGVtVmFsdWUmZ3Q7UkFXJmx0Oy9lbGVtVmFsdWUmZ3Q7CisgICAgICAmbHQ7ZWxlbU1heE9jY3VycmVuY2UmZ3Q7MCZsdDsvZWxlbU1heE9jY3VycmVuY2UmZ3Q7CisgICAgJmx0Oy9wcm9mRWxlbWVudCZndDsKKyAgJmx0Oy9wcm9maWxlJmd0OworJmx0Oy9wcm9maWxlcyZndDsKKzwvc291cmNlPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkJpb21hcmtlciBQcm9kdWN0IFF1ZXJ5Ij4KKworCTxwPlN1cHBvc2UgeW91IGhhZCBhIHF1ZXJ5IHNlcnZsZXQgYXZhaWxhYmxlIGF0CisJICA8Y29kZT5odHRwOi8vcGFuY3JlYXMvcXM8L2NvZGU+LCBhbmQgeW91IHdhbnQgdG8gcXVlcnkgdGhlIENPUkJBCisJICBwcm9kdWN0IHNlcnZlciA8Y29kZT51cm46ZWRhOmNvcmJhOlRpc3N1ZUJhbms8L2NvZGU+IHdpdGggdGhlCisJICBxdWVyeSBleHByZXNzaW9uIDxjb2RlPlNldmVyaXR5TGV2ZWwgPSAzPC9jb2RlPi4gIFlvdSBjYW4KKwkgIGZvcm11bGF0ZSB0aGUgZW50aXJlIDxjb2RlPkdFVDwvY29kZT4gcmVxdWVzdCBhcyB0aGUgZm9sbG93aW5nCisJICBVUkw6CisJPC9wPgorCisJPHNvdXJjZT4KKyAgaHR0cDovL3BhbmNyZWFzL3FzPworICB0eXBlPXByb2R1Y3QmYW1wOworICBvYmplY3Q9dXJuOmVkYTpjb3JiYTpUaXNzdWVCYW5rJmFtcDsKKyAga2V5d29yZFF1ZXJ5PVNldmVyaXR5TGV2ZWwrJTNEKzMKKyAgIDwvc291cmNlPgorCisJPHA+KEFnYWluLCB3ZSd2ZSBicm9rZW4gdGhlIFVSTCBmb3IgcmVhZGFiaWxpdHkuKSAgVGhlIHJlc3VsdCB0bworCSAgdGhpcyBxdWVyeSBjb3VsZCBiZSBhbiBYTUwgZG9jdW1lbnQgbGlrZSB0aGUgZm9sbG93aW5nOgorCTwvcD4KKworPHNvdXJjZT4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7CismbHQ7IURPQ1RZUEUgcXVlcnkgUFVCTElDICItLy9KUEwvL0RURCBPT0RUIFF1ZXJ5IDEuMC8vRU4iCisgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vcGFuY3JlYXMvZHRkL3F1ZXJ5LmR0ZCImZ3Q7CisKKyZsdDtxdWVyeSZndDsKKyAgJmx0O3F1ZXJ5QXR0cmlidXRlcyZndDsKKyAgICAmbHQ7cXVlcnlJZCZndDtVTktOT1dOJmx0Oy9xdWVyeUlkJmd0OworICAgICZsdDtxdWVyeVRpdGxlJmd0O1VOS05PV04mbHQ7L3F1ZXJ5VGl0bGUmZ3Q7CisgICAgJmx0O3F1ZXJ5RGVzYyZndDtVTktOT1dOJmx0Oy9xdWVyeURlc2MmZ3Q7CisgICAgJmx0O3F1ZXJ5VHlwZSZndDtRVUVSWSZsdDsvcXVlcnlUeXBlJmd0OworICAgICZsdDtxdWVyeVN0YXR1c0lkJmd0O0FDVElWRSZsdDsvcXVlcnlTdGF0dXNJZCZndDsKKyAgICAmbHQ7cXVlcnlTZWN1cml0eVR5cGUmZ3Q7VU5LTk9XTiZsdDsvcXVlcnlTZWN1cml0eVR5cGUmZ3Q7CisgICAgJmx0O3F1ZXJ5UmV2aXNpb25Ob3RlJmd0OworICAgIDE5OTktMTItMTIgSlNIIFYxLjAgVW5kZXIgRGV2ZWxvcG1lbnQKKyAgICAmbHQ7L3F1ZXJ5UmV2aXNpb25Ob3RlJmd0OworICAgICZsdDtxdWVyeURhdGFEaWN0SWQmZ3Q7VU5LTk9XTiZsdDsvcXVlcnlEYXRhRGljdElkJmd0OworICAmbHQ7L3F1ZXJ5QXR0cmlidXRlcyZndDsKKyAgJmx0O3F1ZXJ5UmVzdWx0TW9kZUlkJmd0O0FUVFJJQlVURSZsdDsvcXVlcnlSZXN1bHRNb2RlSWQmZ3Q7CisgICZsdDtxdWVyeVByb3BvZ2F0aW9uVHlwZSZndDtCUk9BRENBU1QmbHQ7L3F1ZXJ5UHJvcG9nYXRpb25UeXBlJmd0OworICAmbHQ7cXVlcnlQcm9wb2dhdGlvbkxldmVscyZndDtOL0EmbHQ7L3F1ZXJ5UHJvcG9nYXRpb25MZXZlbHMmZ3Q7CisgICZsdDtxdWVyeU1pbWVBY2NlcHQmZ3Q7Ki8qJmx0Oy9xdWVyeU1pbWVBY2NlcHQmZ3Q7CisgICZsdDtxdWVyeU1heFJlc3VsdHMmZ3Q7MTAwJmx0Oy9xdWVyeU1heFJlc3VsdHMmZ3Q7CisgICZsdDtxdWVyeVJlc3VsdHMmZ3Q7MCZsdDsvcXVlcnlSZXN1bHRzJmd0OworICAmbHQ7cXVlcnlLV1FTdHJpbmcmZ3Q7U2V2ZXJpdHlMZXZlbCA9IDMmbHQ7L3F1ZXJ5S1dRU3RyaW5nJmd0OworICAmbHQ7cXVlcnlTZWxlY3RTZXQmZ3Q7CisgICAgJmx0O3F1ZXJ5RWxlbWVudCZndDsKKyAgICAgICZsdDt0b2tlblJvbGUmZ3Q7TElURVJBTCZsdDsvdG9rZW5Sb2xlJmd0OworICAgICAgJmx0O3Rva2VuVmFsdWUmZ3Q7MyZsdDsvdG9rZW5WYWx1ZSZndDsKKyAgICAmbHQ7L3F1ZXJ5RWxlbWVudCZndDsKKyAgICAmbHQ7cXVlcnlFbGVtZW50Jmd0OworICAgICAgJmx0O3Rva2VuUm9sZSZndDtlbGVtTmFtZSZsdDsvdG9rZW5Sb2xlJmd0OworICAgICAgJmx0O3Rva2VuVmFsdWUmZ3Q7U2V2ZXJpdHlMZXZlbCZsdDsvdG9rZW5WYWx1ZSZndDsKKyAgICAmbHQ7L3F1ZXJ5RWxlbWVudCZndDsKKyAgICAmbHQ7cXVlcnlFbGVtZW50Jmd0OworICAgICAgJmx0O3Rva2VuUm9sZSZndDtSRUxPUCZsdDsvdG9rZW5Sb2xlJmd0OworICAgICAgJmx0O3Rva2VuVmFsdWUmZ3Q7RVEmbHQ7L3Rva2VuVmFsdWUmZ3Q7CisgICAgJmx0Oy9xdWVyeUVsZW1lbnQmZ3Q7CisgICZsdDsvcXVlcnlTZWxlY3RTZXQmZ3Q7CisgICZsdDtxdWVyeUZyb21TZXQvJmd0OworICAmbHQ7cXVlcnlXaGVyZVNldC8mZ3Q7CisgICZsdDtxdWVyeVJlc3VsdFNldCZndDsKKyAgICAmbHQ7cmVzdWx0RWxlbWVudCZndDsKKyAgICAgICZsdDtyZXN1bHRJZCZndDsxJmx0Oy9yZXN1bHRJZCZndDsKKyAgICAgICZsdDtyZXN1bHRNaW1lVHlwZSZndDt0ZXh0L3BsYWluJmx0Oy9yZXN1bHRNaW1lVHlwZSZndDsKKyAgICAgICZsdDtwcm9mSWQmZ3Q7VGlzc3VlQmFuayZsdDsvcHJvZklkJmd0OworICAgICAgJmx0O2lkZW50aWZpZXIvJmd0OworICAgICAgJmx0O3Jlc3VsdEhlYWRlciZndDsKKyAgICAgICAgJmx0O2hlYWRlckVsZW1lbnQmZ3Q7CisgICAgICAgICAgJmx0O2VsZW1OYW1lJmd0O1VOS05PV04mbHQ7L2VsZW1OYW1lJmd0OworICAgICAgICAgICZsdDtlbGVtVHlwZSZndDtURVhUJmx0Oy9lbGVtVHlwZSZndDsKKyAgICAgICAgJmx0Oy9oZWFkZXJFbGVtZW50Jmd0OworICAgICAgJmx0Oy9yZXN1bHRIZWFkZXImZ3Q7CisgICAgICAmbHQ7UmVzdWx0dmFsdWUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSImZ3Q7CisgICAgICBQYXRpZW50SURzPVsxLDIsNCw3LDExLDE5LDIyXSZsdDsvcmVzdWx0VmFsdWUmZ3Q7CisgICAgJmx0Oy9yZXN1bHRFbGVtZW50Jmd0OworICAmbHQ7L3F1ZXJ5UmVzdWx0U2V0Jmd0OworJmx0Oy9xdWVyeSZndDsKKzwvc291cmNlPgorCisJPHA+SW5zdGVhZCBvZiB1c2luZyB0aGUgPGNvZGU+a2V5d29yZFF1ZXJ5PC9jb2RlPiBwYXJhbWV0ZXIsIHlvdQorCSAgY2FuIGNyZWF0ZSB5b3VyIG93biA8Y29kZT5YTUxRdWVyeTwvY29kZT4gZG9jdW1lbnQgYW5kIHBhc3MgaXQgaW4KKwkgIGFzIHRoZSA8Y29kZT5xdWVyeTwvY29kZT4gcGFyYW1ldGVyIGluc3RlYWQuICBUaGUgcXVlcnkgZG9jdW1lbnQKKwkgIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorCTwvcD4KKworICAgIDxzb3VyY2U+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OworJmx0OyFET0NUWVBFIHF1ZXJ5IFBVQkxJQyAiLS8vSlBMLy9EVEQgT09EVCBRdWVyeSAxLjAvL0VOIgorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3BhbmNyZWFzOjgwL2R0ZC9xdWVyeS5kdGQiJmd0OworCismbHQ7cXVlcnkmZ3Q7CisgICZsdDtxdWVyeUF0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0O3F1ZXJ5SWQmZ3Q7ZXhwcjEmbHQ7L3F1ZXJ5SWQmZ3Q7CisgICAgJmx0O3F1ZXJ5VGl0bGUmZ3Q7Q29tbWFuZC1saW5lIEV4cHJlc3Npb24gUXVlcnkmbHQ7L3F1ZXJ5VGl0bGUmZ3Q7CisgICAgJmx0O3F1ZXJ5RGVzYyZndDsKKyAgICBUaGUgZXhwcmVzc2lvbiBmb3IgdGhpcyBxdWVyeSBjYW1lIGZyb20gdGhlIGNvbW1hbmQtbGluZS4KKyAgICAmbHQ7L3F1ZXJ5RGVzYyZndDsKKyAgICAmbHQ7cXVlcnlUeXBlJmd0O1FVRVJZJmx0Oy9xdWVyeVR5cGUmZ3Q7CisgICAgJmx0O3F1ZXJ5U3RhdHVzSWQmZ3Q7QUNUSVZFJmx0Oy9xdWVyeVN0YXR1c0lkJmd0OworICAgICZsdDtxdWVyeVNlY3VyaXR5VHlwZSZndDtVTktOT1dOJmx0Oy9xdWVyeVNlY3VyaXR5VHlwZSZndDsKKyAgICAmbHQ7cXVlcnlSZXZpc2lvbk5vdGUmZ3Q7CisgICAgMTk5OS0xMi0xMiBKU0ggVjEuMCBVbmRlciBEZXZlbG9wbWVudAorICAgICZsdDsvcXVlcnlSZXZpc2lvbk5vdGUmZ3Q7CisgICAgJmx0O3F1ZXJ5RGF0YURpY3RJZCZndDtVTktOT1dOJmx0Oy9xdWVyeURhdGFEaWN0SWQmZ3Q7CisgICZsdDsvcXVlcnlBdHRyaWJ1dGVzJmd0OworICAmbHQ7cXVlcnlSZXN1bHRNb2RlSWQmZ3Q7QVRUUklCVVRFJmx0Oy9xdWVyeVJlc3VsdE1vZGVJZCZndDsKKyAgJmx0O3F1ZXJ5UHJvcG9nYXRpb25UeXBlJmd0O0JST0FEQ0FTVCZsdDsvcXVlcnlQcm9wb2dhdGlvblR5cGUmZ3Q7CisgICZsdDtxdWVyeVByb3BvZ2F0aW9uTGV2ZWxzJmd0O04vQSZsdDsvcXVlcnlQcm9wb2dhdGlvbkxldmVscyZndDsKKyAgJmx0O3F1ZXJ5TWltZUFjY2VwdCZndDsqLyombHQ7L3F1ZXJ5TWltZUFjY2VwdCZndDsKKyAgJmx0O3F1ZXJ5TWF4UmVzdWx0cyZndDsxMDAmbHQ7L3F1ZXJ5TWF4UmVzdWx0cyZndDsKKyAgJmx0O3F1ZXJ5UmVzdWx0cyZndDswJmx0Oy9xdWVyeVJlc3VsdHMmZ3Q7CisgICZsdDtxdWVyeUtXUVN0cmluZyZndDtTZXZlcml0eUxldmVsID0gMyZsdDsvcXVlcnlLV1FTdHJpbmcmZ3Q7CisgICZsdDtxdWVyeVNlbGVjdFNldC8mZ3Q7CisgICZsdDtxdWVyeUZyb21TZXQvJmd0OworICAmbHQ7cXVlcnlXaGVyZVNldCZndDsKKyAgICAmbHQ7cXVlcnlFbGVtZW50Jmd0OworICAgICAgJmx0O3Rva2VuUm9sZSZndDtlbGVtTmFtZSZsdDsvdG9rZW5Sb2xlJmd0OworICAgICAgJmx0O3Rva2VuVmFsdWUmZ3Q7U2V2ZXJpdHlMZXZlbCZsdDsvdG9rZW5WYWx1ZSZndDsKKyAgICAmbHQ7L3F1ZXJ5RWxlbWVudCZndDsKKyAgICAmbHQ7cXVlcnlFbGVtZW50Jmd0OworICAgICAgJmx0O3Rva2VuUm9sZSZndDtMSVRFUkFMJmx0Oy90b2tlblJvbGUmZ3Q7CisgICAgICAmbHQ7dG9rZW5WYWx1ZSZndDszJmx0Oy90b2tlblZhbHVlJmd0OworICAgICZsdDsvcXVlcnlFbGVtZW50Jmd0OworICAgICZsdDtxdWVyeUVsZW1lbnQmZ3Q7CisgICAgICAmbHQ7dG9rZW5Sb2xlJmd0O1JFTE9QJmx0Oy90b2tlblJvbGUmZ3Q7CisgICAgICAmbHQ7dG9rZW5WYWx1ZSZndDtFUSZsdDsvdG9rZW5WYWx1ZSZndDsKKyAgICAmbHQ7L3F1ZXJ5RWxlbWVudCZndDsKKyAgJmx0Oy9xdWVyeVdoZXJlU2V0Jmd0OworICAmbHQ7cXVlcnlSZXN1bHRTZXQvJmd0OworJmx0Oy9xdWVyeSZndDsKKzwvc291cmNlPgorCisJPHA+UGFzc2luZyBzdWNoIGEgbG9uZyBzdHJpbmcgYXMgYSBVUkwgcGFyYW1ldGVyIGluIGEKKwkgIDxjb2RlPkdFVDwvY29kZT4gcmVxdWVzdCBjYW4gYmUgdHJpY2t5LCB0aG91Z2guICBGb3Igc3VjaCBsb25nCisJICBwYXJhbWV0ZXJzLCBpdCdzIGJldHRlciB0byB1c2UgYSA8Y29kZT5QT1NUPC9jb2RlPiByZXF1ZXN0CisJICBpbnN0ZWFkLiAgU2VlIHlvdXIgSFRUUCBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbgorCSAgZm9ybXVsYXRpbmcgPGNvZGU+UE9TVDwvY29kZT4gcmVxdWVzdHMuCisJPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL3NpdGUveGRvYy90dXRvcmlhbC9pbmRleC54bWwgYi8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3hkb2MvdHV0b3JpYWwvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjYjJhNzEKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy9zaXRlL3hkb2MvdHV0b3JpYWwvaW5kZXgueG1sCkBAIC0wLDAgKzEsNjU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlIGNvbnRyaWJ1dG9yCitsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMKK2ZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAordXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCit0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlCitMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgordGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPlVuZGVyc3RhbmRpbmcgdGhlIFhNTFF1ZXJ5PC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSJrZWxseUBhcGFjaGUub3JnIj5TZWFuIEtlbGx5PC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJVbmRlcnN0YW5kaW5nIHRoZSBYTUxRdWVyeSI+CisgICAgICA8cD5BcGFjaGUgT09EVCdzIDxhIGhyZWY9Ii4uLy4uL3Byb2ZpbGUvIj5wcm9maWxlIHNlcnZlcnM8L2E+LCA8YQorCSAgaHJlZj0iLi4vLi4vcHJvZHVjdC8iPnByb2R1Y3Qgc2VydmVyczwvYT4sIGFuZCBvdGhlcgorCWNvbXBvbmVudHMgYWxsIHVzZSB0aGUgc2FtZSBmb3JtYXQgZm9yIGEgcXVlcnkuICBJdCdzCisJZW5jYXBzdWxhdGVkIGJ5IHRoZSBjbGFzcworCTxjb2RlPm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeTwvY29kZT4uICBJbiB0aGlzIHR1dG9yaWFsLAorCXdlJ2xsIGxvb2sgYXQgdGhpcyBjbGFzcyBhbmQgc2VlIGhvdyBpdCByZXByZXNlbnRzIHF1ZXJpZXMuCisJWW91J2xsIG5lZWQgdGhpcyBrbm93bGVkZ2UgYm90aCB0byBtYWtlIHF1ZXJpZXMgdG8gT09EVAorCXNlcnZlcnMsIGFzIHdlbGwgYXMgdG8gdW5kZXJzdGFuZCBxdWVyaWVzIGNvbWluZyBpbnRvIE9PRFQKKwlzZXJ2ZXJzLgorICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IkJhc2ljIFF1ZXJ5IENvbmNlcHRzIj4KKyAgICAgIDxwPkNhcHR1cmluZyB2YXJpb3VzIGFzcGVjdHMgb2YgYSBxdWVyeSBpcyBkaWZmaWN1bHQgdG8gZG8gaW4KKwlnZW5lcmFsLCBhbmQgT09EVCdzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzdGVsbGFyIG9yIGNvbXBsZXRlLgorCUJ1dCwgaXQgaGFzIHByb3ZlZCBzdWNjZXNmdWwgaW4gYSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucywgc28KKwlsZXQncyBzZWUgd2hhdCBjb25jZXB0cyBpdCBlbmNhcHN1bGF0ZXMuCisgICAgICA8L3A+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlhNTD8iPgorCTxwPkZpcnN0LCBmb3JnZXQgdGhlIGZhY3QgdGhhdCB0aGUgWE1MUXVlcnkgaGFzICJYTUwiIGluIGl0cworCSAgbmFtZS4gIEl0IGRvZXNuJ3QgbWVhbiB5b3UgY2FuIHF1ZXJ5IG9ubHkgWE1MIHJlc291cmNlcy4KKwkgIEl0J3MgY2FsbGVkIFhNTFF1ZXJ5IHByb2JhYmx5IGJlY2F1c2UgdGhlIHBlcnNvbiB3aG8gY2FtZSB1cAorCSAgd2l0aCBpdCB0aG91Z2h0IFhNTCB3YXMgcHJldHR5IGNvb2wsIG9yIHRoYXQgeW91IGNhbgorCSAgcmVwcmVzZW50IGFuIE9PRFQgcXVlcnkgaW4gWE1MIGZvcm1hdC4KKwk8L3A+CisKKwk8cD5XaGlsZSB5b3UgPGVtPmNhbjwvZW0+IHJlcHJlc2VudCBhbiBYTUxRdWVyeSBpbiBYTUwsIHlvdQorCSAgdXN1YWxseSBvbmx5IHVzZSB0aGUgSmF2YSByZXByZXNlbnRhdGlvbiwgdGhhdCBpcywgeW91CisJICBjcmVhdGUgYW5kIG1hbmlwdWxhdGUgSmF2YSBvYmplY3RzIG9mIHRoZSBjbGFzcworCSAgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlhNTFF1ZXJ5PC9jb2RlPi4KKwk8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyaWMgUXVlcmllcyI+CisJPHA+SW4gdGhlb3J5LCB0aGUgWE1MUXVlcnkgY2FuIHJlcHJlc2VudCA8ZW0+YW55PC9lbT4gcXVlcnkKKwkgIGZvciBpbmZvcm1hdGlvbi4gIEl0IGNhcHR1cmVzIGdlbmVyaWMgYXNwZWN0cyBvZiBhIHF1ZXJ5LAorCSAgc3VjaCBhcyB0aGUgZG9tYWluIG9mIHRoZSBxdWVzdGlvbiBiZWluZyBwb3NlZCwgdGhlIHJhbmdlIGluCisJICB3aGljaCB0aGUgZGVzaXJlZCByZXNwb25zZSBzaG91bGQgYmUgZm9ybXVsYXRlZCwgYW5kCisJICBjb25zdHJhaW50cyBvbiB3aGF0IHNlbGVjdHMgdGhlIHJlc3BvbnNlLiAgSW4gWE1MUXVlcnkKKwkgIHBhcmxhbmNlLCB3ZSBjYWxsIHRoZXNlIHRoZSAiZnJvbSBlbGVtZW50IHNldCIgKGRvbWFpbiksIHRoZQorCSAgInNlbGVjdCBlbGVtZW50IHNldCIgKHJhbmdlKSwgYW5kIHRoZSAid2hlcmUgZWxlbWVudCBzZXQiCisJICAoY29uc3RyYWludHMpLgorCTwvcD4KKworCTxwPkluIHByYWN0aWNlLCBub25lIG9mIHRoZSBjdXJyZW50IE9PRFQgaW1wbGVtZW50YXRpb25zIHVzZQorCSAgYW55IGJ1dCB0aGUgIndoZXJlIGVsZW1lbnQgc2V0LiIgIEFuZCBpbmRlZWQsIGZvciBtb3N0CisJICBwcm9ibGVtcyBwcmVzZW50ZWQgdG8gT09EVCwgdGhhdCBpcyBzdWZmaWNpZW50LiAgSG93ZXZlciwKKwkgIHRoZSBmcmFtZXdvcmsgaXMgdGhlcmUgdG8gc3VwcG9ydCBtb3JlIGFzcGVjdHMgb2YgYSBxdWVyeSwKKwkgIGFuZCB5b3UncmUgd2VsY29tZSB0byB1c2UgdGhlbSBpbiB5b3VyIG93biBkZXBsb3ltZW50cy4KKwk8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlF1ZXJ5IE1ldGFkYXRhIj4KKwk8cD5UaGUgWE1MUXVlcnkgY29uY2VwdCBjYXB0dXJlcyBtZXRhZGF0YSBhYm91dCBhIHF1ZXJ5IGFzCisJICB3ZWxsLCBzdWNoIGFzIHRoZSB0aXRsZSBmb3IgdGhlIHF1ZXJ5LCB3aGV0aGVyIHRoZSBxdWVyeQorCSAgaXRzZWxmIGlzIHNlY3JldCBvciBjbGFzc2lmaWVkLCBob3cgbWFueSByZXN1bHRzIHRvIHJldHVybgorCSAgYXQgbW9zdCwgaG93IHRvIHByb3BhZ2F0ZSB0aGUgcXVlcnkgdGhyb3VnaCBhIG5ldHdvcmssIGFuZAorCSAgc28gZm9ydGguICBJbiBwcmFjdGljZSwgdGhvdWdoLCBub25lIG9mIHRoZXNlIGFkZGl0aW9uYWwKKwkgIGF0dHJpYnV0ZXMgYXJlIHVzZWQgaW4gY3VycmVudCBkZXBsb3ltZW50cyBvZiBPT0RULgorCSAgTW9yZW92ZXIsIG5vbmUgb2YgdGhlIGN1cnJlbnQgT09EVCBjb21wb25lbnRzIG9iZXkgc3VjaAorCSAgc2V0dGluZ3Mgc3VjaCBhcyBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIG9yIHByb3BhZ2F0aW9uCisJICB0eXBlcy4KKwk8L3A+CisKKwk8cD5BcyBhIHJlc3VsdCwgeW91IHNob3VsZCBpZ25vcmUgdGhlc2UgYXNwZWN0cyBvZiB0aGUKKwkgIFhNTFF1ZXJ5IGFuZCBtZXJlbHkgdXNlIGl0cyBkZWZhdWx0IHZhbHVlcy4gIFdlJ2xsIHNlZSB0aGVzZQorCSAgc2hvcnRseS4KKwk8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlhNTFF1ZXJ5IFN0cnVjdHVyZSI+CisJPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBYTUxRdWVyeSBhbmQgcmVsYXRlZCBjbGFzc2VzIChub3RlIHRoZSBkaWFncmFtIGlzIG91dGRhdGVkOyAianBsLmVkYS54bWxxdWVyeSIKKwkgICAgc2hvdWxkIHJlYWQgIm9yZy5hcGFjaGUub29kdC54bWxxdWVyeSIpOjwvcD4KKworCTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMveG1scXVlcnkucG5nIiBhbHQ9IkNsYXNzIGRpYWdyYW0gb2YgWE1MUXVlcnkiLz48L3A+CisKKwk8cD5BIHNpbmdsZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gb2JqZWN0IGhhcyB0aHJlZSBzZXBhcmF0ZQorCSAgbGlzdHMgb2YgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPiBvYmplY3RzLCByZXByZXNlbnRpbmcgdGhlCisJICAiZnJvbSIsICJzZWxlY3QiLCBhbmQgIndoZXJlIiBlbGVtZW50IHNldHMuICBJbiBwcmFjdGljZSwKKwkgIHRoZSAiZnJvbSIgYW5kICJ3aGVyZSIgc2V0cyBhcmUgZW1wdHksIHRob3VnaCwgYXMgbWVudGlvbmVkLgorCSAgVGhlcmUncyBhbHNvIGEgc2luZ2xlIDxjb2RlPlF1ZXJ5SGVhZGVyPC9jb2RlPiBvYmplY3QKKwkgIGNhcHR1cmluZyBxdWVyeSBtZXRhZGF0YS4gIFdpdGhpbiB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+CisJICBpdHNlbGYgaXMgYWRkaXRpb25hbCBxdWVyeSBtZXRhZGF0YS4gIEZpbmFsbHksIHRoZXJlJ3MKKwkgIGV4YWN0bHkgb25lIDxjb2RlPlF1ZXJ5UmVzdWx0PC9jb2RlPiBvYmplY3Qgd2hpY2ggY2FwdHVyZXMKKwkgIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSBzbyBmYXIuCisJPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IkJvb2xlYW4gRXhwcmVzc2lvbnMiPgorICAgICAgPHA+VGhlIFhNTFF1ZXJ5IGNsYXNzIHVzZXMgbGlzdHMgb2YgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPgorCW9iamVjdHMgdG8gcmVwcmVzZW50IGl0cyAiZnJvbSIsICJzZWxlY3QiLCBhbmQgIndoZXJlIiBlbGVtZW50CisJc2V0cy4gIFRoZSBsaXN0cyBmb3JtIGEgcG9zdGZpeCBib29sZWFuIHN0YWNrLCB3aXRoIHRoZQorCXplcm90aCBlbGVtZW50IG9mIHRoZSBsaXN0IGJlaW5nIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorCUFsdGhvdWdoIHlvdSBjYW4gcG9wdWxhdGUgdGhlc2Ugc3RhY2tzIGJ5IG1hbmlwdWxhdGluZyB0aGVpcgorCWNvcnJlc3BvbmRpbmcgPGNvZGU+amF2YS51dGlsLkxpc3Q8L2NvZGU+cywgdGhlIFhNTFF1ZXJ5IGNsYXNzCisJcHJvdmlkZXMgYSBib29sZWFuIGV4cHJlc3Npb24gbGFuZ3VhZ2UgdGhhdCBsZXRzIHlvdSBkaXJlY3RseQorCXBvcHVsYXRlIHRoZW0uCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRoZSBYTUxRdWVyeSBjbGFzcyBhbHNvIHJlc3BlY3RzIHRoYXQgc29tZSBxdWVyaWVzIGp1c3QKKwljYW5ub3QgYmUgZm9ybXVsYXRlZCBhcyBhIGJvb2xlYW4gZXhwcmVzc2lvbi4gIEluIHRoZXNlIGNhc2VzLAorCXlvdSBjYW4gcGFzcyBpbiBhIHN0cmluZyB0aGF0IHRoZSBYTUxRdWVyeSB3aWxsIG90aGVyd2lzZQorCWNhcnJ5IHVucGFyc2VkLiAgTm90ZSB0aGF0IHlvdXIgcHJvZmlsZSBhbmQgcHJvZHVjdCBzZXJ2ZXJzCisJd2lsbCB0aGVuIGhhdmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGhhbmRsaW5nIHRoYXQgc3RyaW5nIGluCisJc29tZSBhcHByb3ByaWF0ZSB3YXkuCisgICAgICA8L3A+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlF1ZXJ5IExhbmd1YWdlIj4KKwk8cD5UaGUgcXVlcnkgbGFuZ3VhZ2UgdGhhdCBYTUxRdWVyeSB1c2VzIHRvIGdlbmVyYXRlIHBvc3RmaXgKKwkgIGJvb2xlYW4gc3RhY2tzIGlzIGEgc2VyaWVzIG9mIGluZml4LCBub3QgcG9zdGZpeCwKKwkgIGVsZW1lbnQtYW5kLXZhbHVlIGV4cHJlc3Npb24gbGlua2VkIGJ5IGJvb2xlYW4gb3BlcmF0b3JzLgorCSAgSGVyZSdzIGFuIGV4YW1wbGU6CisJPC9wPgorCisJPHNvdXJjZT50ZW1wZXJhdHVyZSAmZ3Q7IDM2IEFORCBsYXRpdHVkZSAmbHQ7IDQ1PC9zb3VyY2U+CisKKwk8cD5BcyB5b3UgY2FuIHNlZSwgdGhlc2UgYXJlIDxlbT50cmlwbGVzPC9lbT4gbGlua2VkIGluIGEKKwkgIGxvZ2ljYWwgZXhwcmVzc2lvbi4gIEVhY2ggdHJpcGxlIGhhcyB0aGUgZm9ybQorCSAgKDx2YXI+ZWxlbWVudDwvdmFyPiwgPHZhcj5yZWxhdGlvbjwvdmFyPiwgPHZhcj5saXRlcmFsPC92YXI+KS4KKwkgIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgdHJpcGxlIGhhcyA8dmFyPmVsZW1lbnQ8L3Zhcj4gPQorCSAgPGNvZGU+dGVtcGVyYXR1cmU8L2NvZGU+LCA8dmFyPnJlbGF0aW9uPC92YXI+ID0gR1QKKwkgIChncmVhdGVyLXRoYW4pLCBhbmQgPHZhcj5saXRlcmFsPC92YXI+ID0gMzYuICBUaGF0IHRyaXBsZSBpcworCSAgbGlua2VkIHRvIHRoZSBuZXh0IG9uZSB3aXRoIHRoZSBib29sZWFuIDxjb2RlPkFORDwvY29kZT4KKwkgIG9wZXJhdG9yLgorCTwvcD4KKworCTxwPlRoZSBmdWxsIHNldCByZWxhdGlvbiBvcGVyYXRvcnMgaW5jbHVkZTogPGNvZGU+PTwvY29kZT4gKEVRKSwKKwkgIDxjb2RlPiE9PC9jb2RlPiAoTkUpLCA8Y29kZT4mbHQ7PC9jb2RlPiAoTFQpLAorCSAgPGNvZGU+Jmx0Oz08L2NvZGU+IChMRSksIDxjb2RlPiZndDs8L2NvZGU+IChHVCksCisJICA8Y29kZT4mZ3Q7PTwvY29kZT4gKEdFKSwgPGNvZGU+TElLRTwvY29kZT4sIGFuZAorCSAgPGNvZGU+Tk9UTElLRTwvY29kZT4uICBUaGUgbG9naWNhbCBvcGVyYXRvcnMgaW5jbHVkZQorCSAgPGNvZGU+QU5EPC9jb2RlPiwgPGNvZGU+JmFtcDs8L2NvZGU+LCA8Y29kZT5PUjwvY29kZT4sCisJICA8Y29kZT58PC9jb2RlPiwgPGNvZGU+Tk9UPC9jb2RlPiwgYW5kIDxjb2RlPiE8L2NvZGU+LiAgWW91IGNhbgorCSAgdXNlIHBhcmVudGhlc2lzIHRvIGdyb3VwIHRoaW5ncyB0b28uCisJPC9wPgorCisJPHA+SGVyZSBhcmUgYSBmZXcgbW9yZSBleGFtcGxlczo8L3A+CisKKwk8c291cmNlPnNwZWNpbWVuID0gQmxvb2QKK2JhYyAmZ3Q7IDAuMDUgQU5EIHByaW9ycyA9IDMKK3N1cm5hbWUgTElLRSAnU2ltc3BvbiUnIE9SIG51bUNoaWxkcmVuICZsdDs9IDMgQU5EIFJFVFVSTiA9IG51bUVwaXNvZGVzPC9zb3VyY2U+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkV4cHJlc3Npb24gU3RhY2tzIj4KKwk8cD5UaGUgIndoZXJlIiBlbGVtZW50IHNldCBpcyBhY3R1YWxseSBhCisJICA8Y29kZT5qYXZhLnV0aWwuTGlzdDwvY29kZT4gb2YKKwkgIDxjb2RlPm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnQ8L2NvZGU+IG9iamVjdHMsIGFycmFuZ2VkCisJICBpbiBhIGJvb2xlYW4gc3RhY2sgd2l0aCB0aGUgdG9wIG9mIHRoZSBzdGFjayBhcyB0aGUgemVyb3RoCisJICBlbGVtZW50IGluIHRoZSBsaXN0LiAgPGNvZGU+UXVlcnlFbGVtZW50PC9jb2RlPiBvYmplY3RzCisJICB0aGVtc2VsdmVzIGhhdmUgdHdvIGF0dHJpYnV0ZXMsIGEgcm9sZSBhbmQgYSB2YWx1ZS4KKwk8L3A+CisKKwk8cD5UaGUgcm9sZSB0ZWxscyB3aGF0IHJvbGUgdGhlIDxjb2RlPlF1ZXJ5RWxlbWVudDwvY29kZT4gaXMKKwkgIHBsYXlpbmcuICBJdCBjYW4gYmUgPGNvZGU+ZWxlbU5hbWU8L2NvZGU+IGZvciB0aGUKKwkgIDx2YXI+ZWxlbWVudDwvdmFyPiBwYXJ0IG9mIGEgdHJpcGxlLCA8Y29kZT5SRUxPUDwvY29kZT4gZm9yCisJICB0aGUgPHZhcj5yZWxhdGlvbjwvdmFyPiBwYXJ0IG9mIGEgdHJpcGxlLCA8Y29kZT5MSVRFUkFMPC9jb2RlPgorCSAgZm9yIHRoZSA8dmFyPmxpdGVyYWw8L3Zhcj4gcGFydCBvZiBhIHRyaXBsZSwgb3IKKwkgIDxjb2RlPkxPR09QPC9jb2RlPiBmb3IgYSBsb2dpY2FsIG9wZXJhdG9yIGxpbmtpbmcgdHJpcGxlcworCSAgdG9nZXRoZXIuICBUaGUgdmFsdWUgdGVsbHMgd2hhdCB0aGUgZWxlbWVudCBpcywgd2hhdCB0aGUKKwkgIHJlbGF0aW9uYWwgb3BlcmF0b3IgaXMsIHdoYXQgbGl0ZXJhbCB2YWx1ZSBpcyBiZWluZyByZWxhdGVkLAorCSAgb3Igd2hhdCB0aGUgbG9naWNhbCBvcGVyYXRvciBpcy4KKwk8L3A+CisKKwk8cD5UaGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IHBhcnNlcyBhIHF1ZXJ5IGV4cHJlc3Npb24gYW5kCisJICBnZW5lcmF0ZXMgYSBjb3JyZXNwb25kaW5nIHN0YWNrIG9mIDxjb2RlPlF1ZXJ5RWxlbWVudDwvY29kZT5zLgorCSAgTGV0J3MgbG9vayBhdCBhIGNvdXBsZSBleGFtcGxlcy4gIFRoZSBleHByZXNzaW9uCisJPC9wPgorCTxzb3VyY2U+bGF0aXR1ZGUgJmd0OyA0NTwvc291cmNlPgorCTxwPmdlbmVyYXRlcyB0aGUgIndoZXJlIiBzdGFjazwvcD4KKwk8aW1nIHNyYz0iLi4vaW1hZ2VzL3NtYWxsLXN0YWNrLnBuZyIgYWx0PSJTdGFjayBvZiB0aHJlZSBxdWVyeSBlbGVtZW50cyIvPgorCisJPHA+V2hpbGUgdGhlIGV4cHJlc3Npb248L3A+CisJPHNvdXJjZT5hcnRpc3QgPSBCYWNoIEFORCBOT1QgYWxidW0gPSBQb2VtIE9SIHRyYWNrICE9IEFyaWE8L3NvdXJjZT4KKwk8cD5nZW5lcmF0ZXMgdGhlICJ3aGVyZSIgc3RhY2s8L3A+CisJPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9sYXJnZS1zdGFjay5wbmciIGFsdD0iU3RhY2sgb2YgYSBsb3Qgb2YgcXVlcnkgZWxlbWVudHMiLz48L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlRoZSBSRVRVUk4gRWxlbWVudCI+CisJPHA+QSBzcGVjaWFsIGVsZW1lbnQgaXMgcmVzZXJ2ZWQgYnkgWE1MUXVlcnk6CisJICA8Y29kZT5SRVRVUk48L2NvZGU+LiAgSXQncyB1c2VkIHRvIGluZGljYXRlIHdoYXQgdG8gc2VsZWN0LAorCSAgYW5kIHNvIGFueSB2YWx1ZSBzcGVjaWZpZWQgd2l0aCA8Y29kZT5SRVRVUk48L2NvZGU+IGdvZXMKKwkgIGludG8gdGhlICJzZWxlY3QiIHNldCwgbm90IHRoZSAid2hlcmUiIHNldC4KKwk8L3A+CisKKwk8cD5Nb3Jlb3ZlciwgdGhlIDxjb2RlPlJFVFVSTjwvY29kZT4gZWxlbWVudCBkb2Vzbid0IHBheQorCSAgYXR0ZW50aW9uIHRvIGhvdyBpdCdzIGxpbmtlZCB3aXRoIGJvb2xlYW4gZXhwcmVzc2lvbnMgaW4gdGhlCisJICByZXN0IG9mIHF1ZXJ5LCBvciB3aGF0IHJlbGF0aW9uYWwgb3BlcmF0b3IgaXMgdXNlZCB3aXRoIHRoZQorCSAgbGl0ZXJhbCB2YWx1ZSBiZWluZyByZXR1cm5lZC4gIEZvciBleGFtcGxlLCB0aGF0IG1lYW5zCisJICA8ZW0+YWxsPC9lbT4gb2YgdGhlIGZvbGxvd2luZyBleHByZXNzaW9ucyB3b3VsZCBnZW5lcmF0ZQorCSAgPGVtPmlkZW50aWNhbDwvZW0+IFhNTFF1ZXJpZXM6CisJPC9wPgorCisJPHNvdXJjZT5zcGVjaW1lbiA9IEJsb29kIEFORCBSRVRVUk4gPSB2b2x1bWUKK3NwZWNpbWVuID0gQmxvb2QgT1IgUkVUVVJOID0gdm9sdW1lCitzcGVjaW1lbiA9IEJsb29kIEFORCBSRVRVUk4gIT0gdm9sdW1lCitzcGVjaW1lbiA9IEJsb29kIEFORCBSRVRVUk4gJmx0OyB2b2x1bWUKK3NwZWNpbWVuID0gQmxvb2QgQU5EIFJFVFVSTiBMSUtFIHZvbHVtZTwvc291cmNlPgorCisJPHA+QWxsIDxjb2RlPlF1ZXJ5RWxlbWVudHM8L2NvZGU+IGZyb20gUkVUVVJOIHRyaXBsZXMgd291bGQgZ28KKwkgIGludG8gdGhlICJzZWxlY3QiIGluc3RlYWQgb2YgdGhlICJ3aGVyZSIgc2V0LgorCTwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJDb25zdHJ1Y3RpbmcgYSBRdWVyeSI+CisgICAgICA8cD5UbyBjb25zdHJ1Y3QgYSBxdWVyeSwgeW91J2xsIHVzZSBhIEphdmEgY29uc3RydWN0b3Igb2YgdGhlCisJZm9sbG93aW5nIGZvcm06CisgICAgICA8L3A+CisgICAgICA8c291cmNlPlhNTFF1ZXJ5KFN0cmluZyBrZXl3b3JkUXVlcnksIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlLAorICBTdHJpbmcgZGVzYywgU3RyaW5nIGRkSWQsIFN0cmluZyByZXN1bHRNb2RlSWQsIFN0cmluZyBwcm9wVHlwZSwKKyAgU3RyaW5nIHByb3BMZXZlbHMsIGludCBtYXhSZXN1bHRzLCBqYXZhLnV0aWwuTGlzdCBtaW1lQWNjZXB0LAorICBib29sZWFuIHBhcnNlUXVlcnkpPC9zb3VyY2U+CisKKyAgICAgIDxwPlRoZSBwYXJhbWV0ZXJzIGFyZSBzdW1tYXJpemVkIGJlbG93OjwvcD4KKworICAgICAgPHRhYmxlPgorCTx0aGVhZD4KKwkgIDx0cj4KKwkgICAgPHRoPlBhcmFtZXRlcjwvdGg+CisJICAgIDx0aD5QdXJwb3NlPC90aD4KKwkgICAgPHRoPlNhbXBsZSB2YWx1ZXM8L3RoPgorCSAgPC90cj4KKwk8L3RoZWFkPgorCTx0Ym9keT4KKwkgIDx0cj4KKwkgICAgPHRkPmtleXdvcmRRdWVyeTwvdGQ+PHRkPkEgc3RyaW5nIHJlcHJlc2VudGluZyB5b3VyIHF1ZXJ5CisJICAgICAgZXhwcmVzc2lvbiwgaW4gdGhlIHF1ZXJ5IGxhbmd1YWdlIGRlc2NyaWJlZCBhYm92ZSwgb3IgaW4KKwkgICAgICBzb21lIG90aGVyIGFwcGxpY2F0aW9uLXNlcGNpZmljCisJICAgICAgbGFuZ3VhZ2UuPC90ZD48dGQ+PGNvZGU+bnVtRG9udXRzID0gMzwvY29kZT4sCisJICAgICAgPGNvZGU+c2VsZWN0IHZvbHVtZV9yZW1haW5pbmcgZnJvbSBzcGVjaW1lbnMgd2hlcmUKKwkgICAgICBzcGVjaW1lbl90eXBlID0gNDwvY29kZT48L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPmlkPC90ZD48dGQ+QW4gaWRlbnRpZmllciBmb3IgeW91ciBxdWVyeTwvdGQ+CisJICAgIDx0ZD5xdWVyeS0xLCAxLjMuNi4xLjEzMTYuNC4xLCBteVF1ZXJ5LCB1cm46aWJtOnN5czoweDM5YWQ5MzBhPC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD50aXRsZTwvdGQ+PHRkPkEgdGl0bGUgZm9yIHlvdXIgcXVlcnk8L3RkPgorCSAgICA8dGQ+TXkgRmlyc3QgUXVlcnksIFF1ZXJ5IGZvciBCbG9vZCBTcGVjaW1lbnMsIFNpbXBzb24ncyBRdWVyeTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+ZGVzYzwvdGQ+PHRkPkRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTwvdGQ+CisJICAgIDx0ZD5ILkouIFNpbXBzb24gaXMgbG9va2luZyBmb3IgZG9udXQgc2hvcHM8L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPmRkSWQ8L3RkPjx0ZD5EYXRhIGRpY3Rpb25hcnkgSUQuICBUaGlzIGlkZW50aWZpZXMgdGhlCisJICAgIGRhdGEgZGljdGlvbmFyeSB0aGF0IHByb3ZpZGVzIGRlZmluaXRpb25zIGZvciB0aGUgZWxlbWVudHMKKwkgICAgdXNlZCBpbiB0aGUgcXVlcnkgbGlrZSAic3BlY2ltZW4iIG9yICJudW1Eb251dHMiLiAgSXQncworCSAgICBub3QgdXNlZCBieSBhbnkgY3VycmVudCBPT0RUIGRlcGxveW1lbnQgb3IgdGhlIE9PRFQKKwkgICAgZnJhbWV3b3JrLjwvdGQ+PHRkPjxjb2RlPm51bGw8L2NvZGU+PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5yZXN1bHRNb2RlSWQ8L3RkPiA8dGQ+SWRlbnRpZmllcyB3aGF0IHRvIHJldHVybiBmcm9tCisJICAgIHRoZSBxdWVyeS4gIERlZmF1bHRzIHRvIDxjb2RlPkFUVFJJQlVURTwvY29kZT4uICBOb3QgdXNlZAorCSAgICBieSBhbnkgY3VycmVudCBPT0RUIGRlcGxveW1lbnQgb3IgdGhlIE9PRFQKKwkgICAgZnJhbWV3b3JrLjwvdGQ+PHRkPjxjb2RlPm51bGw8L2NvZGU+PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5wcm9wVHlwZTwvdGQ+PHRkPkhvdyB0byBwcm9wYWdhdGUgdGhlIHF1ZXJ5LCBkZWZhdWx0cworCSAgICB0byA8Y29kZT5CUk9BRENBU1Q8L2NvZGU+LiAgSXQncyBub3QgdXNlZCBieSBhbnkgY3VycmVudAorCSAgICBPT0RUIGRlcGxveW1lbnQgb3IgdGhlIE9PRFQgZnJhbWV3b3JrLjwvdGQ+PHRkPjxjb2RlPm51bGw8L2NvZGU+PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5wcm9wTGV2ZWxzPC90ZD4gPHRkPkhvdyBmYXIgdG8gcHJvcGFnYXRlIHRoZSBxdWVyeSwKKwkgICAgZGVmYXVsdHMgdG8gPGNvZGU+Ti9BPC9jb2RlPi4gIE5vdCB1c2VkIGJ5IGFueSBjdXJyZW50CisJICAgIE9PRFQgZGVwbG95bWVudCBvciB0aGUgT09EVAorCSAgICBmcmFtZXdvcmsuPC90ZD48dGQ+PGNvZGU+bnVsbDwvY29kZT48L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPm1heFJlc3VsdHM8L3RkPgorCSAgICA8dGQ+QXQgbW9zdCBob3cgbWFueSByZXN1bHRzIHRvIHJldHVybjsgbm90IGVuZm9yY2VkIGJ5IE9PRFQgZnJhbWV3b3JrLjwvdGQ+CisJICAgIDx0ZD4xLCAxMDAsIDxjb2RlPkludGVnZXIuTUFYX1ZBTFVFPC9jb2RlPiwgLTY8L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPm1pbWVBY2NlcHQ8L3RkPiA8dGQ+TGlzdCBvZiBhY2NlcHRhYmxlIE1JTUUgdHlwZXMgZm9yCisJICAgIHJldHVybmVkIHByb2R1Y3RzLCBkZWZhdWx0cyB0byA8Y29kZT4qLyo8L2NvZGU+PC90ZD48dGQ+PGNvZGU+TGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsgdHlwZXMuYWRkKCJ0ZXh0L3htbCIpOyB0eXBlcy5hZGQoInRleHQvaHRtbCIpOyB0eXBlcy5hZGQoInRleHQvKiIpOzwvY29kZT48L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPnBhcnNlUXVlcnk8L3RkPjx0ZD5TaG91bGQgdGhlIGNsYXNzIHBhcnNlIHRoZSBxdWVyeSBhcworCSAgICBhIGJvb2xlYW4gZXhwcmVzc2lvbj8gIFRydWUgc2F5cyB0byBnZW5lcmF0ZSB0aGUgYm9vbGVhbgorCSAgICBleHByZXNzaW9uIHN0YWNrcy4gIEZhbHNlIHNheXMgdG8ganVzdCBzYXZlIHRoZSBleHByZXNzaW9uCisJICAgIHN0cmluZy48L3RkPgorCSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisJICA8L3RyPgorCTwvdGJvZHk+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8cD5BbGwgb2YgdGhlIHZhbHVlcyBhYm92ZSBjYW4gYmUgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IHRvCisJdXNlIGEgZGVmYXVsdCBvciBub24tc3BlY2lmaWMgdmFsdWUgKGV4Y2VwdCBmb3IKKwk8Y29kZT5tYXhSZXN1bHRzPC9jb2RlPiBhbmQgPGNvZGU+cGFyc2VRdWVyeTwvY29kZT4sIHdoaWNoIGFyZQorCTxjb2RlPmludDwvY29kZT4gYW5kIDxjb2RlPmJvb2xlYW48L2NvZGU+IHR5cGVzIGFuZCBjYW4ndCBiZQorCWFzc2lnbmVkIDxjb2RlPm51bGw8L2NvZGU+KS4gIEZvciBtb3N0IGFwcGxpY2F0aW9ucywgdXNpbmcKKwk8Y29kZT5udWxsPC9jb2RlPiBpcyBwZXJmZWN0bHkgYWNjZXB0YWJsZS4gIFNpbmNlIHRoZSBPT0RUCisJZnJhbWV3b3JrIGRvZXNuJ3QgdXNlIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+LCB5b3UgY2FuIHVzZSBhbnkKKwl2YWx1ZS4gIEhvd2V2ZXIsIHNwZWNpZmljIHByb2ZpbGUgc2VydmVycycgYW5kIHByb2R1Y3QKKwlzZXJ2ZXJzJyBxdWVyeSBoYW5kbGVycyBtYXkgcGF5IGF0dGVudGlvbiB0byB2YWx1ZSBpZiBzbworCXByb2dyYW1tZWQuCisgICAgICA8L3A+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlBhcnNlZCBvciBVbnBhcnNlZCBRdWVyaWVzIj4KKwk8cD5UaGUgbGFzdCBwYXJhbWV0ZXIsIDxjb2RlPnBhcnNlUXVlcnk8L2NvZGU+LCB0ZWxscyBpZiB5b3UKKwkgIHdhbnQgdGhlIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBjbGFzcyB0byBwYXJzZSB5b3VyIHF1ZXJ5IGFuZAorCSAgZ2VuZXJhdGUgYm9vbGVhbiBleHByZXNzaW9uIHN0YWNrcyAoZGlzY3Vzc2VkIGFib3ZlKSBvciBub3QuCisJICBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBjbGFzcyB3aWxsIHBhcnNlIHRoZSBzdHJpbmcgYXMKKwkgIGlmIGluIHRoZSBYTUxRdWVyeSBsYW5ndWFnZSBkZXNjcmliZWQgYWJvdmUsIGFuZCB3aWxsIGdlbmVyYXRlCisJICB0aGUgImZyb20iLCAic2VsZWN0IiwgYW5kICJ3aGVyZSIgZWxlbWVudCBib29sZWFuIHN0YWNrcy4gIFNldAorCSAgaXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCB0aGUgY2xhc3Mgd29uJ3QgcGFyc2UgdGhlIHN0cmluZworCSAgb3IgZ2VuZXJhdGUgdGhlIHN0YWNrcy4gIEl0IHdpbGwgaW5zdGVhZCBzdG9yZSB0aGUgc3RyaW5nIGZvcgorCSAgbGF0ZXIgdXNlIGJ5IGEgcHJvZmlsZSBzZXJ2ZXIncyBvciBwcm9kdWN0IHNlcnZlcidzIHF1ZXJ5CisJICBoYW5kbGVyLgorCTwvcD4KKworCTxwPkZvciBleGFtcGxlLCBpZiB5b3UgcGFzcyBpbiB0aGUgWE1MIHF1ZXJ5IGxhbmd1YWdlCisJICBleHByZXNzaW9uLDwvcD4KKworCTxzb3VyY2U+ZG9udXRzRWF0ZW4gJmd0OyA1IEFORCBSRVRVUk4gPSBlcGlzb2RlTnVtYmVyPC9zb3VyY2U+CisKKwk8cD50aGVuIHNldCB0aGUgPGNvZGU+cGFyc2VRdWVyeTwvY29kZT4KKwkgIGZsYWcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uICBBcyBhbm90aGVyIGV4YW1wbGUsIHN1cHBvc2UgdGhlCisJICBxdWVyeSBleHByZXNzaW9uIGlzCisJPC9wPgorCisJPHNvdXJjZT5zZWxlY3QgZXBpc29kZU51bWJlciBmcm9tIGVwaXNvZGVzIHdoZXJlIGRvbnV0c0VhdGVuICZndDsgNTwvc291cmNlPgorCisJPHA+VGhpcyBpcyBhbiBTUUwgZXhwcmVzc2lvbiwgcHJvYmFibHkgdGFyZ2V0ZWQgdG8gYSBwcm9kdWN0CisJICBzZXJ2ZXIgdGhhbiBjYW4gaGFuZGxlIFNRTCBleHByZXNzaW9ucy4gIEluIHRoaXMgY2FzZSwgc2V0CisJICA8Y29kZT5wYXJzZVF1ZXJ5PC9jb2RlPiB0byBmYWxzZS4KKwk8L3A+CisKKwk8cD5UaGUgY3VycmVudCBPT0RUIGRlcGxveW1lbnRzIGZvciB0aGUgUGxhbmV0YXJ5IERhdGEgU3lzdGVtCisJICBhbmQgdGhlIEVhcmx5IERldGVjdGlvbiBSZXNlYXJjaCBOZXR3b3JrIGJvdGggdXNlCisJICA8ZW0+cGFyc2VkPC9lbT4gcXVlcmllcy4KKwk8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFjY2VwdGFibGUgTUlNRSBUeXBlcyI+CisJPHA+SW50ZXJuZXQgc3RhbmRhcmRzIGZvciBtYWlsLCB3ZWIsIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMKKwkgICAgdXNlIDxhYmJyIHRpdGxlPSdNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbAorCSAgICBFeHRlbnNpb25zJz5NSU1FPC9hYmJyPiB0eXBlcyAoZGVzY3JpYmVkIGluIDxhCisJICAgIGhyZWY9ImZ0cDovL2Z0cC5yZmMtZWRpdG9yLm9yZy9pbi1ub3Rlcy9yZmMyMDQ2LnR4dCI+UkZDLTIwNDY8L2E+CisJICAgIGFtb25nc3Qgb3RoZXIgZG9jdW1lbnRzKSB0byBkZXNjcmliZSB0aGUgY29udGVudCBhbmQgbWVkaWEKKwkgICAgdHlwZSBvZiBkYXRhLiAgU28gZG9lcyBPT0RULiAgV2hlbiB5b3UgY29uc3RydWN0IGFuCisJICAgIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiwgeW91IGNhbiBhbHNvIHBhc3MgaW4gYSBsaXN0IG9mIE1JTUUKKwkgICAgdHlwZXMgdGhhdCBhcmUgYWNjZXB0YWJsZSB0byB5b3UgZm9yIHRoZSBmb3JtYXQgb2YgYW55CisJICAgIHJldHVybmVkIHByb2R1Y3RzLCBtdWNoIGluIHRoZSBzYW1lIHdheSB5b3VyIHdlYiBicm93c2VyCisJICAgIHRlbGxzIGEgd2ViIHNlcnZlciB3aGF0IG1lZGlhIHR5cGVzIGl0IGNhbiBkaXNwbGF5LgorCTwvcD4KKworCTxwPlRoZSBsaXN0IG9mIGFjY2VwdGFibGUgTUlNRSB0eXBlcyBpcyBvbmx5IHVzZWQgZm9yIHByb2R1Y3QKKwkgIHF1ZXJpZXMgc2luY2UgcHJvZHVjdHMgY2FuIGNvbWUgaW4gYW55IHNoYXBlIGFuZCBmbGF2b3IuCisJICBQcm9maWxlIHF1ZXJpZXMgaWdub3JlIHRoZSBsaXN0OyBwcm9maWxlcyBhcmUgYWx3YXlzCisJICByZXR1cm5lZCBhcyBhIGxpc3Qgb2YgSmF2YQorCSAgPGNvZGU+b3JnLmFwYWNoZS5vb2R0LnByb2ZpbGUuUHJvZmlsZTwvY29kZT4gb2JqZWN0cy4KKwk8L3A+CisKKwk8cD5Zb3UndmUgcHJvYmFibHkgc2VlbiBNSU1FIHR5cGVzIGJlZm9yZSwgYnV0IGhlcmUgYXJlIHNvbWUKKwkgIGV4YW1wbGVzIGluIGNhc2UgeW91IGhhdmVuJ3Q6CisJPC9wPgorCisJPHVsPgorCSAgPGxpPjxjb2RlPnRleHQvcGxhaW48L2NvZGU+IC0gYSBwbGFpbiBvbGQgdGV4dCBmaWxlPC9saT4KKwkgIDxsaT48Y29kZT50ZXh0L2h0bWw8L2NvZGU+IC0gYSBoeXBlcnRleHQgZG9jdW1lbnQ8L2xpPgorCSAgPGxpPjxjb2RlPmltYWdlL2pwZWc8L2NvZGU+IC0gYSBwaWN0dXJlIGluIHRoZSBKUEVHL0pGSUYgZm9ybWF0PC9saT4KKwkgIDxsaT48Y29kZT5pbWFnZS9naWY8L2NvZGU+IC0gYSBwaWN0dXJlIGluIHRoZSBHSUYgZm9ybWF0PC9saT4KKwkgIDxsaT48Y29kZT5hdWRpby9tcGVnPC9jb2RlPiAtIGFuIGF1ZGlvIGZpbGUsIHByb2JhYmx5IGluIHRoZSBNUDMgZm9ybWF0PC9saT4KKwkgIDxsaT48Y29kZT52aWRlby9tcGVnPC9jb2RlPiAtIGEgdmlkZW8gZmlsZSwgcHJvYmFibHkgaW4gdGhlIE1QMiBmb3JtYXQ8L2xpPgorCSAgPGxpPjxjb2RlPmFwcGxpY2F0aW9uL21zd29yZDwvY29kZT4gLSBhIE1pY3JvJG9mdCBXb3JkIGRvY3VtZW50PC9saT4KKwkgIDxsaT48Y29kZT5hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW08L2NvZGU+IC0gYmluYXJ5IGRhdGE8L2xpPgorCTwvdWw+CisKKwk8cD5JbiB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGNvbnN0cnVjdG9yLCB5b3UgY2FuIHBhc3MgaW4gYQorCSAgbGlzdCBvZiBNSU1FIHR5cGVzIHRoYXQgc2hvd3MgeW91ciA8ZW0+cHJlZmVyZW5jZTwvZW0+IGZvcgorCSAgcmV0dXJuZWQgcHJvZHVjdHMuICBQcm9kdWN0IHNlcnZlcnMnIHF1ZXJ5IGhhbmRsZXJzIGV4YW1pbmUKKwkgIHRoZSBxdWVyeSB0byBzZWUgaWYgdGhleSBjYW4gcHJvdmlkZSBhIG1hdGNoaW5nIHByb2R1Y3QsCisJICA8ZW0+YW5kPC9lbT4gdGhleSBleGFtaW5lIHRoZSBsaXN0IG9mIE1JTUUgdHlwZXMgdG8gc2VlIGlmCisJICB0aGV5IGNhbiBwcm92aWRlIG1hdGNoaW5nIHByb2R1Y3RzIGluIHRoZSBmb3JtYXQgeW91IGRlc2lyZS4KKwk8L3A+CisKKwk8cD5BcyBhbiBleGFtcGxlLCBzdXBwb3NlIHlvdSBjcmVhdGUgYSBNSU1FIHR5cGUgbGlzdCBhcyBmb2xsb3dzOjwvcD4KKworCTxzb3VyY2U+TGlzdCBhY2NlcHRhYmxlVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CithY2NlcHRhYmxlVHlwZXMuYWRkKCJpbWFnZS90aWZmIik7CithY2NlcHRhYmxlVHlwZXMuYWRkKCJpbWFnZS9wbmciKTsKK2FjY2VwdGFibGVUeXBlcy5hZGQoImltYWdlL2pwZWciKTs8L3NvdXJjZT4KKworCTxwPmFuZCB5b3UgcGFzcyA8Y29kZT5hY2NlcHRhYmxlVHlwZXM8L2NvZGU+IGFzIHRoZQorCSAgPGNvZGU+bWltZUFjY2VwdDwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZQorCSAgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGNvbnN0cnVjdG9yLiAgVGhpcyB0ZWxscyBxdWVyeQorCSAgaGFuZGxlcnMgcmVjZWl2aW5nIHlvdXIgcXVlcnkgdGhhdCB5b3UnZCByZWFsbHkgcHJlZmVyIGEKKwkgIFRJRkYgZm9ybWF0IGltYWdlLiAgSG93ZXZlciwgZmFpbGluZyB0aGF0LCB5b3UnbGwgYWNjZXB0IGEKKwkgIFBORyBmb3JtYXQgaW1hZ2UuICBBbmQsIGFzIGEgbGFzdCByZXNvcnQsIGEgSlBFRyB3aWxsIGRvLgorCTwvcD4KKworCTxwPllvdSBjYW4gYWxzbyB1c2Ugd2lsZGNhcmRzIGluIHlvdXIgTUlNRSB0eXBlcy4gIFN1cHBvc2Ugd2UKKwlkaWQgdGhlIGZvbGxvd2luZzo8L3A+CisKKwk8c291cmNlPkxpc3QgYWNjZXB0YWJsZVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworYWNjZXB0YWJsZVR5cGVzLmFkZCgiaW1hZ2UvdGlmZiIpOworYWNjZXB0YWJsZVR5cGVzLmFkZCgiaW1hZ2UvcG5nIik7CithY2NlcHRhYmxlVHlwZXMuYWRkKCJpbWFnZS8qIik7PC9zb3VyY2U+CisKKwk8cD5Ob3cgd2UgdGVsbCBxdWVyeSBoYW5kbGVycyBpbiBwcm9kdWN0IHNlcnZlcnMgdGhhdCB3ZQorCSAgcmVhbGx5IHByZWZlciBUSUZGIGZvcm1hdCBpbWFnZXMuICBJZiBhIHF1ZXJ5IGhhbmRsZXIgY2FuJ3QKKwkgIGRvIHRoYXQsIHRoZW4gYSBQTkcgZm9ybWF0IHdpbGwgYmUgT0suICBBbmQgaWYgYSBxdWVyeQorCSAgaGFuZGxlciBjYW4ndCBkbyBQTkcsIHRoZW4gPGVtPmFueTwvZW0+IGltYWdlIGZvcm1hdCB3aWxsIGJlCisJICBmaW5lLCBldmVuIGxvYXRoZXNvbWUgR0lGLgorCTwvcD4KKworCTxwPklmIHlvdSBwYXNzIGEgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgbGlzdCBpbiB0aGUKKwkgIDxjb2RlPm1pbWVBY2NlcHQ8L2NvZGU+IHBhcmFtZXRlciwgdGhlIE9PRFQgZnJhbWV3b3JrIHdpbGwKKwkgIGNvbnZlcnQgaW50byBhIHNpbmdsZSBpdGVtIGxpc3Q6IDxjb2RlPiovKjwvY29kZT4sIG1lYW5pbmcKKwkgIGFueSBmb3JtYXQgaXMgYWNjZXB0YWJsZS4KKwk8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0nIlJ1bm5pbmciIFhNTFF1ZXJ5Jz4KKyAgICAgIDxwPlRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gY2xhc3MgaXMgYWxzbyBhbiBleGVjdXRhYmxlIGNsYXNzLgorCUJ5IHJ1bm5pbmcgaXQgZnJvbSB0aGUgY29tbWFuZC1saW5lLCB5b3UgY2FuIHNlZSBob3cgaXQKKwlnZW5lcmF0ZXMgaXRzIFhNTCByZXByZXNlbnRhdGlvbi4gIEl0IGFsc28gbGV0cyB5b3UgcGFzcyBpbiBhCisJZmlsZSBjb250YWluaW5nIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUxRdWVyeSBhbmQKKwlwYXJzZXMgaXQgZm9yIHZhbGlkaXR5LgorICAgICAgPC9wPgorCisgICAgICA8cD5MZXQncyB0cnkganVzdCBzZWVpbmcgdGhhdCBYTUwgcmVwcmVzZW50YXRpb24uICAoSW4gdGhlc2UKKwkgIGV4YW1wbGVzLCB3ZSdsbCBiZSB1c2luZyBhIFVuaXggPGNvZGU+Y3NoPC9jb2RlPiBsaWtlCisJICBjb21tYW5kIGVudmlyb25tZW50LiAgT3RoZXIgc2hlbGxzIGFuZCBub24tVW5peCB1c2VycyB3aWxsCisJICBoYXZlIHRvIGFkanVzdC4pCisgICAgICA8L3A+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J0NvbGxlY3RpbmcgdGhlIENvbXBvbmVudHMnPgorCTxwPkZpcnN0IHVwLCB3ZSdsbCBuZWVkIHR3byBjb21wb25lbnRzOjwvcD4KKworCTx1bD4KKwkgIDxsaT48YSBocmVmPSIuLi8uLi9jb21tb25zLyI+T09EVCBDb21tb24gQ29tcG9uZW50czwvYT4uICBUaGlzCisJICAgIGlzIG5lZWRlZCBieSBhbGwgb2YgT09EVCBzb2Z0d2FyZTsgaXQgY29udGFpbnMgZ2VuZXJhbAorCSAgICB1dGlsaXRpZXMgZm9yIHN0YXJ0aW5nIHNlcnZlcnMsIHBhcnNpbmcgWE1MLCBsb2dnaW5nLCBhbmQKKwkgICAgbW9yZS4KKwkgIDwvbGk+CisJICA8bGk+PGEgaHJlZj0iLi4vLi4veG1scXVlcnkvIj5PT0RUIFF1ZXJ5IEV4cHJlc3Npb248L2E+LiAgVGhpcworCSAgICBjb250YWlucyB0aGUgPGNvZGU+WE1MUXVlcnk8L2NvZGU+IGFuZCByZWxhdGVkIGNsYXNzZXMuCisJICA8L2xpPgorCTwvdWw+CisKKwk8cD5Eb3dubG9hZCB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBlYWNoIG9mIHRoZXNlIHBhY2thZ2VzCisJICBhbmQgZXh0cmFjdCB0aGVpciBjb250ZW50cy4gIFRoZW4sIGNyZWF0ZSBhIHNpbmdsZSBkaXJlY3RvcnkKKwkgIGFuZCBjb2xsZWN0IHRoZSBqYXIgZmlsZXMgdG9nZXRoZXIgaW4gb25lIHBsYWNlLgorCTwvcD4KKworICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSdHZW5lcmF0aW5nIHRoZSBRdWVyeSc+CisJPHA+VG8gZ2VuZXJhdGUgdGhlIHF1ZXJ5LCBwYXNzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnQKKwkgIDxjb2RlPi1leHByPC9jb2RlPi4gIFRoYXQgdGVsbHMgdGhlIFhNTFF1ZXJ5IHRoYXQgdGhlIHJlc3QKKwkgIG9mIHRoZSBjb21tYW5kIGxpbmUgaXMgdGhlIHF1ZXJ5IGV4cHJlc3Npb24uICBJdCB3aWxsIGV4cGVjdAorCSAgaXQgdG8gYmUgaW4gdGhlIFhNTFF1ZXJ5IHF1ZXJ5IGxhbmd1YWdlIChtZWFuaW5nIHRoYXQgaXQKKwkgIHdpbGwgY3JlYXRlIGFuIDxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBvYmplY3Qgd2l0aAorCSAgPGNvZGU+cGFyc2VRdWVyeTwvY29kZT4gc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+KS4KKwk8L3A+CisKKwk8cD5IZXJlJ3MgYW4gZXhhbXBsZTo8L3A+CisKKwk8c291cmNlPiUgPGI+amF2YSAtRGphdmEuZXh0LmRpcnM9LiBcCisgIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5YTUxRdWVyeSBcCisgIC1leHByIGRvbnV0c0VhdGVuIFwmZ3Q7IDUgQU5EIFJFVFVSTiA9IGVwaXNvZGVOdW1iZXI8L2I+Citrd2RRdWVyeVN0cmluZzogZG9udXRzRWF0ZW4gJmd0OyA1IEFORCBSRVRVUk4gPSBlcGlzb2RlTnVtYmVyCitmcm9tRWxlbWVudFNldDogW10KK3Jlc3VsdHM6IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeVJlc3VsdFtsaXN0PVtdXQord2hlcmVFbGVtZW50U2V0OgorW29yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnRbcm9sZT1lbGVtTmFtZSx2YWx1ZT1kb251dHNFYXRlbl0sCitvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuUXVlcnlFbGVtZW50W3JvbGU9TElURVJBTCx2YWx1ZT01XSwKK29yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnRbcm9sZT1SRUxPUCx2YWx1ZT1HVF1dCitzZWxlY3RFbGVtZW50U2V0OgorW29yZy5hcGFjaGUub29kdC54bWxxdWVyeS5RdWVyeUVsZW1lbnRbcm9sZT1lbGVtTmFtZSx2YWx1ZT1lcGlzb2RlTnVtYmVyXV0KKz09PT09PWRvYyBzdHJpbmc9PT09PT09CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OworJmx0O3F1ZXJ5Jmd0OyAuIC4gLjwvc291cmNlPgorCisJPHA+VGhlIHByb2dyYW0gcHJpbnRzIG91dCBzb21lIGZpZWxkcyBvZiB0aGUgWE1MUXVlcnkgc3VjaCBhcworCSAgdGhlICJmcm9tIiBlbGVtZW50IHNldCwgdGhlIGN1cnJlbnQgcmVzdWx0cyAod2hpY2ggc2hvdWxkCisJICBhbHdheXMgYmUgZW1wdHkgc2luY2Ugd2UgaGF2ZW4ndCBwYXNzZWQgdGhpcyBxdWVyeSB0byBhbnkKKwkgIHByb2R1Y3Qgc2VydmVycyksIHRoZSAid2hlcmUiIGVsZW1lbnQgc2V0LCBhbmQgdGhlICJzZWxlY3QiCisJICBlbGVtZW50IHNldC4gIEl0IHRoZW4gcHJpbnRzIG91dCB0aGUgWE1MIHJlcHJlc2VudGF0aW9uLgorCTwvcD4KKworCTxwPklmIHlvdSBleGFtaW5lIHRoZSBYTUwgcmVwcmVzZW50YXRpb24gY2xvc2VseSwgeW91J2xsIHNlZQorCSAgdGhpbmdzIGxpa2UgdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBNSU1FIHR5cGVzOgorCTwvcD4KKwk8c291cmNlPiZsdDtxdWVyeU1pbWVBY2NlcHQmZ3Q7Ki8qJmx0Oy9xdWVyeU1pbWVBY2NlcHQmZ3Q7PC9zb3VyY2U+CisJPHA+VGhpcyBzYXlzIHRoYXQgYW55IHR5cGUgaXMgYWNjZXB0YWJsZS4gIFlvdSdsbCBhbHNvIHNlZSB0aGUKKwlwYXNzZWQgaW4gcXVlcnkgc3RyaW5nOjwvcD4KKwk8c291cmNlPiZsdDtxdWVyeUtXUVN0cmluZyZndDtkb251dHNFYXRlbiAmYW1wO2d0OyA1IEFORAorICBSRVRVUk4gPSBlcGlzb2RlTnVtYmVyJmx0Oy9xdWVyeUtXUVN0cmluZyZndDs8L3NvdXJjZT4KKworCTxwPlJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB5b3UgcGFzc2VkIDxjb2RlPnRydWU8L2NvZGU+IG9yCisJICA8Y29kZT5mYWxzZTwvY29kZT4gaW4gdGhlIDxjb2RlPnBhcnNlUXVlcnk8L2NvZGU+IHBhcmFtZXRlciwKKwkgIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gYWx3YXlzIHNhdmVzIHRoZSBvcmlnaW5hbCBxdWVyeQorCSAgc3RyaW5nLiAgRm9yIHVucGFyc2VkIHF1ZXJpZXMsIHRoaXMgaXMgaG93IHRoZSBzdHJpbmcgaXMKKwkgIHBhY2thZ2VkIG9uIGl0cyB3YXkgdG8gYSBwcm9kdWN0IHNlcnZlci4gIEZvciBwYXJzZWQKKwkgIHF1ZXJpZXMsIHByb2R1Y3Qgc2VydmVycyB3aWxsIHVzZSB0aGUgYm9vbGVhbiBzdGFja3MuCisJICAoU2luY2UgdGhpcyB3YXMgYSBwYXJzZWQgcXVlcnksIHlvdSdsbCBhbHNvIHNlZSB0aGUgYm9vbGVhbgorCSAgc3RhY2tzIGluIFhNTCBmb3JtYXQgaWYgeW91IGxvb2sgY2xvc2VseS4gIFRoZXkncmUgdGhlcmUuKQorCTwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSdHZXR0aW5nIFJlc3VsdHMnPgorICAgICAgPHA+QWxlcnQgcmVhZGVycyB3aWxsIGhhdmUgbm90aWNlZCB0aGF0IHRoZSByZXN1bHRzIG9mIGEgcXVlcnkKKwloYXZlIGEgcGxhY2UgaW4gPGNvZGU+WE1MUXVlcnk8L2NvZGU+IG9iamVjdHMuICBUaGlzIGFjdHVhbGx5CisJYXBwbGllcyB0byBwcm9kdWN0IHF1ZXJpZXMgb25seS4gIEFmdGVyIHNlbmRpbmcgYW4KKwk8Y29kZT5YTUxRdWVyeTwvY29kZT4gdG8gYSBwcm9kdWN0IHNlcnZlciwgdGhlIHF1ZXJ5IG9iamVjdAorCWNvbWVzIGJhY2sgYWRvcm5lZCB3aXRoIHplcm8gb3IgbW9yZSBtYXRjaGluZyByZXN1bHRzLiAgWW91CisJdGhlbiBhY2Nlc3MgdGhlIDxjb2RlPlhNTHF1ZXJ5PC9jb2RlPiBvYmplY3QgbWV0aG9kcyB0bworCXJldHJpZXZlIHRob3NlIHJlc3VsdHMuCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRoZSBmb2xsb3dpbmcgY2xhc3MgZGlhZ3JhbSBkZW1vbnN0cmF0ZXMgdGhlIHJlbGF0aW9uc2hpcCAoYWdhaW4sIHRoZSBkaWFncmFtIGlzIG91dGRhdGVkOworICAgICAgICAgICJqcGwuZWRhLnhtcXVlcnkiIHNob3VsZCByZWFkICJvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkiKTo8L3A+CisKKyAgICAgIDxwPjxpbWcgc3JjPScuLi9pbWFnZXMvcmVzdWx0cy5wbmcnIGFsdD0nUmVzdWx0IGNsYXNzIGRpYWdyYW0nLz48L3A+CisKKyAgICAgIDxwPkFzIHlvdSBjYW4gc2VlLCBhIHNpbmdsZSBxdWVyeSBoYXMgYSBzaW5nbGUKKwk8Y29kZT5vcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuUXVlcnlSZXN1bHQ8L2NvZGU+LCB3aGljaCBjb250YWlucyBhCisJPGNvZGU+amF2YS51dGlsLkxpc3Q8L2NvZGU+IG9mCisJPGNvZGU+b3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlJlc3VsdDwvY29kZT4gb2JqZWN0cy4KKwk8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdHMgbWF5IGhhdmUgemVybyBvciBtb3JlCisJPGNvZGU+SGVhZGVyPC9jb2RlPnMsIGFuZCA8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdHMgbWF5CisJYWN0dWFsbHkgYmUgPGNvZGU+TGFyZ2VSZXN1bHQ8L2NvZGU+IG9iamVjdHMuCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRvIHJldHJpZXZlIHRoZSBsaXN0IG9mIDxjb2RlPlJlc3VsdDwvY29kZT4gb2JqZWN0cywgY2FsbCB0aGUKKwk8Y29kZT5YTUxRdWVyeTwvY29kZT4ncyA8Y29kZT5nZXRSZXN1bHRzPC9jb2RlPiBtZXRob2QsIHdoaWNoCisJcmV0dXJucyB0aGUgPGNvZGU+amF2YS51dGlsLkxpc3Q8L2NvZGU+IGRpcmVjdGx5LgorICAgICAgPC9wPgorCisgICAgICA8cD5FYWNoIHJlc3VsdCBhbHNvIGluY2x1ZGVzPC9wPgorICAgICAgPHVsPgorCTxsaT5BbiBpZGVudGlmaWVyLiAgSW4gdGhlIGNhc2UgdGhlcmUncyBtb3JlIHRoYW4gb25lIG1hdGNoaW5nCisJICByZXN1bHRzLCB0aGlzIGlkZW50aWZpZXIgKGEgc3RyaW5nKSBzaG91bGQgYmUgdW5pcXVlIGFtb25nc3QKKwkgIHJlc3VsdHMuCisJPC9saT4KKwk8bGk+QSBNSU1FIHR5cGUuICBUaGlzIHRlbGxzIHlvdSB3aGF0IGZvcm1hdCB0aGUgbWF0Y2hpbmcgcHJvZHVjdCBpcyBpbi48L2xpPgorCTxsaT5BIHByb2ZpbGUgSUQuICBUaGlzIGlzIGN1cnJlbnRseSB1bnVzZWQuPC9saT4KKwk8bGk+QSByZXNvdXJjZSBJRC4gIFRoaXMgaXMgYWxzbyB1bnVzZWQuPC9saT4KKworCTxsaT5BIHZhbGlkaXR5IHBlcmlvZC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yCisJICB3aGljaCB0aGUgcHJvZHVjdCBpcyBjb25zaWRlcmVkIHZhbGlkLiAgWW91IGNhbiB1c2UgdGhpcworCSAgaW5mb3JtYXRpb24gdG8gZGVjaWRlIGhvdyBsb25nIHRvIGNhY2hlIHRoZSBwcm9kdWN0IHdpdGhpbgorCSAgeW91ciBvd24gcHJvZ3JhbSBiZWZvcmUgaGF2aW5nIHRvIHJldHJpZXZlIGl0IGFnYWluLgorCTwvbGk+CisKKwk8bGk+QSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvZHVjdCBpcyBjbGFzc2lmaWVkLgorCSAgQ2xhc3NpZmllZCBvciBzZWNyZXQgcHJvZHVjdHMgc2hvdWxkbid0IGJlIGNhY2hlZCBvciBzaG91bGQKKwkgIG90aGVyd2lzZSBiZSBoYW5kbGVkIGNhcmVmdWxseSBieSB5b3VyIGFwcGxpY2F0aW9uIHByb2dyYW0uCisJPC9saT4KKyAgICAgIDwvdWw+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J1Jlc3VsdCBIZWFkZXJzJz4KKwk8cD5UaGUgaGVhZGVycyBvZiBhIHJlc3VsdCBhcmUgb3B0aW9uYWwuICBUaGV5J3JlIHVzZWQgZm9yCisJICB0YWJ1bGFyIHN0eWxlIHJlc3VsdHMgdG8gaW5kaWNhdGUgY29sdW1uIGhlYWRpbmdzLiAgRWFjaAorCSAgPGNvZGU+SGVhZGVyPC9jb2RlPiBvYmplY3QgY2FwdHVyZXMgdGhyZWUgc3RyaW5ncywgYSBuYW1lLCBhCisJICBkYXRhIHR5cGUsIGFuZCB1bml0cy4KKwk8L3A+CisKKwk8cD5Gb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgcmV0cmlldmVkIGEgcHJvZHVjdCB0aGF0IHdhcyBhCisJICB0YWJsZSBvZiB0ZW1wZXJhdHVyZXMgYXQgdmFyaW91cyBsb2NhdGlvbnMgb24gdGhlIEVhcnRoLgorCSAgVGhlcmUgbWlnaHQgYmUgdGhyZWUgaGVhZGVycyBpbiB0aGUgaGVhZGVycyBsaXN0OgorCTwvcD4KKworCTx0YWJsZT4KKwkgIDx0aGVhZD4KKwkgICAgPHRyPgorCSAgICAgIDx0aCByb3dzcGFuPSIyIj5MaXN0IEluZGV4PC90aD4KKwkgICAgICA8dGggY29sc3Bhbj0iMyI+SGVhZGVyPC90aD4KKwkgICAgPC90cj4KKwkgICAgPHRyPgorCSAgICAgIDx0aD5OYW1lPC90aD4KKwkgICAgICA8dGg+RGF0YSBUeXBlPC90aD4KKwkgICAgICA8dGg+VW5pdHM8L3RoPgorCSAgICA8L3RyPgorCSAgPC90aGVhZD4KKwkgIDx0Ym9keT4KKwkgICAgPHRyPjx0ZD4wPC90ZD48dGQ+bGF0aXR1ZGU8L3RkPjx0ZD5mbG9hdDwvdGQ+PHRkPmRlZ3JlZXM8L3RkPjwvdHI+CisJICAgIDx0cj48dGQ+MTwvdGQ+PHRkPmxvbmdpdHVkZTwvdGQ+PHRkPmZsb2F0PC90ZD48dGQ+ZGVncmVlczwvdGQ+PC90cj4KKwkgICAgPHRyPjx0ZD4yPC90ZD48dGQ+dGVtcGVyYXR1ZXI8L3RkPjx0ZD5mbG9hdDwvdGQ+PHRkPmtlbHZpbnM8L3RkPjwvdHI+CisJICA8L3Rib2R5PgorCTwvdGFibGU+CisKKwk8cD5TdXBwb3NlIHRoZSBwcm9kdWN0IHlvdSBnZXQgYmFjayBhcyBhIHBpY3R1cmUgb2YgYSB0aXNzdWUKKwkgIHNwZWNpbWVuLiAgSW4gdGhpcyBjYXNlLCB0aGVyZSB3b3VsZCBiZSA8ZW0+bm88L2VtPiBoZWFkZXJzLgorCTwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0nR2V0dGluZyB0aGUgUHJvZHVjdCBEYXRhJz4KKwk8cD5UbyByZXRyaWV2ZSB0aGUgYWN0dWFsIGRhdGEgY29tcHJpc2luZyB5b3VyIHByb2R1Y3QsIGNhbGwKKwkgIHRoZSA8Y29kZT5SZXN1bHQ8L2NvZGU+IG9iamVjdCdzIDxjb2RlPmdldElucHV0U3RyZWFtPC9jb2RlPgorCSAgbWV0aG9kLiAgVGhpcyByZXR1cm5zIGEgc3RhbmRhcmQKKwkgIDxjb2RlPmphdmEuaW8uSW5wdXRTdHJlYW08L2NvZGU+IHRoYXQgbGV0cyB5b3UgYWNjZXNzIHRoZQorCSAgZGF0YS4gIEhvdyB5b3UgaW50ZXJwcmV0IHRoYXQgZGF0YSwgdGhvdWdoLCBkZXBlbmRzIG9uIHRoZQorCSAgTUlNRSB0eXBlIG9mIHRoZSBwcm9kdWN0LCB3aGljaCB5b3UgY2FuIGdldCBieSBjYWxsaW5nIHRoZQorCSAgPGNvZGU+UmVzdWx0PC9jb2RlPidzIDxjb2RlPmdldE1JTUVUeXBlPC9jb2RlPiBtZXRob2QuCisJPC9wPgorCisJPHA+Rm9yIGV4YW1wbGUsIGlmIHRoZSBNSU1FIHR5cGUgd2FzIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LAorCSAgdGhlbiB0aGUgYnl0ZSBzdHJlYW0gd291bGQgYmUgYSBzZXF1ZW5jZSBvZiBVbmljb2RlCisJICBjaGFyYWN0ZXJzLiAgSWYgaXQgd2VyZSA8Y29kZT5pbWFnZS9qcGVnPC9jb2RlPiwgdGhlbiB0aGUKKwkgIGJ5dGVzIHdvdWxkIGJlIGltYWdlIGRhdGEgaW4gSlBFRy9KRklGIGZvcm1hdC4KKwk8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0nQ29uY2x1c2lvbic+CisgICAgICA8cD5JbiB0aGlzIHR1dG9yaWFsLCB3ZSBsZWFybmVkIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCisJc3RhbmRhcmQgcXVlcnkgY29tcG9uZW50IGluIE9PRFQsIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4uCisJV2Ugc2F3IHRoZSBxdWVyeSBsYW5ndWFnZSB0aGF0IFhNTFF1ZXJ5IHN1cHBvcnRzIGFuZCBob3cgaXQKKwlnZW5lcmF0ZXMgcG9zdGZpeCBib29sZWFuIGV4cHJlc3Npb24gc3RhY2tzLiAgWW91IGNhbiBhbHNvCisJZW5jb2RlIGFueSBxdWVyeSBleHByZXNzaW9uIGJ5IHVzaW5nIGEgc3BlY2lhbCBjb25zdHJ1Y3RvcgorCWFyZ3VtZW50IHRoYXQgdGVsbHMgWE1MUXVlcnkgdG8gbm90IHBhcnNlIHRoZSBxdWVyeSBzdHJpbmcuCisJV2UgYWxzbyBleGVjdXRlIHRoZSA8Y29kZT5YTUxRdWVyeTwvY29kZT4gY2xhc3MgZGlyZWN0bHkuCisJRmluYWxseSwgd2Ugc2F3IGhvdyBwcm9kdWN0IGRhdGEgaXMgZW1iZWRkZWQgaW4gdGhlIFhNTFF1ZXJ5CisJYW5kIGhvdyB0byBkZWFsIHdpdGggc3VjaCByZXN1bHRzLgorICAgICAgPC9wPgorCisgICAgICA8cD5BcyBhIGNsaWVudCBvZiB0aGUgT09EVCBmcmFtZXdvcmssIHlvdSBjYW4gbm93IGNyZWF0ZQorCTxjb2RlPlhNTFF1ZXJ5PC9jb2RlPiBvYmplY3RzIHRvIHF1ZXJ5IHByb2R1Y3Qgc2VydmVycyBmcm9tCisJd2l0aGluIHlvdXIgSmF2YSBhcHBsaWNhdGlvbnMuICBBcyBhIHNlcnZlciBpbiB0aGUgZnJhbWV3b3JrLAorCXlvdSBrbm93IGhvdyB0byBkZWFsIHdpdGggaW5jb21pbmcgcXVlcnkgb2JqZWN0cy4KKyAgICAgIDwvcD4KKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CisKZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29kZWNGYWN0b3J5VGVzdC5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9Db2RlY0ZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZmMDk1ZgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29kZWNGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy5pby5OdWxsSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkNvZGVjRmFjdG9yeTsgLy8gSW1wb3J0ZWQgc29sZWx5IGZvciBKYXZhZG9jCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKKy8qKiBVbml0IHRlc3QgdGhlIHtAbGluayBDb2RlY0ZhY3Rvcnl9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBDb2RlY0ZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBDb2RlY0ZhY3Rvcnl9IGNsYXNzLiAqLworCXB1YmxpYyBDb2RlY0ZhY3RvcnlUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ29kZWMoKSB7CisJCXRyeSB7CisJCQlDb2RlYyBjb2RlYyA9IENvZGVjRmFjdG9yeS5jcmVhdGVDb2RlYygidW5rbm93bi5jbGFzcy5uYW1lIik7CisJCQlmYWlsKCJDb2RlY0ZhY3Rvcnkgc29tZWhvdyBjcmVhdGVkIGFuIG9iamVjdCBvZiBhbiB1bmtub3duIGNsYXNzIik7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZ29vZCkge30KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDb2RlYygpIHsKKwkJQ29kZWMgYzEgPSBDb2RlY0ZhY3RvcnkuY3JlYXRlQ29kZWMoIm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db2RlY0ZhY3RvcnlUZXN0JFRlc3RDb2RlYyIpOworCQlhc3NlcnROb3ROdWxsKGMxKTsKKwkJQ29kZWMgYzIgPSBDb2RlY0ZhY3RvcnkuY3JlYXRlQ29kZWMoIm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db2RlY0ZhY3RvcnlUZXN0JFRlc3RDb2RlYyIpOworCQlhc3NlcnRTYW1lKGMxLCBjMik7CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q29kZWMgaW1wbGVtZW50cyBDb2RlYyB7CisJCXB1YmxpYyBUZXN0Q29kZWMoKSB7fQorCQlwdWJsaWMgTm9kZSBlbmNvZGUoT2JqZWN0IG9iamVjdCwgRG9jdW1lbnQgZG9jKSB7IHJldHVybiBudWxsOyB9CisJCXB1YmxpYyBPYmplY3QgZGVjb2RlKE5vZGUgbm9kZSkgeyByZXR1cm4gbnVsbDsgfQorCQlwdWJsaWMgbG9uZyBzaXplT2YoT2JqZWN0IG9iaikgeyByZXR1cm4gMDsgfQorCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29kZWNUZXN0LmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvZGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyYjdiMTIKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvZGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuKjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKKy8qKiBVbml0IHRlc3QgYSBjb2RlYy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCithYnN0cmFjdCBjbGFzcyBDb2RlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciBhIGNvZGVjLiAqLworCXByb3RlY3RlZCBDb2RlY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqIFRlc3QgdGhlIGNvZGVjLiAqLworCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoQ29kZWMgY29kZWMpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUZXN0IGVuY29kaW5nIGFuZCBkZWNvZGluZworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJTm9kZSBub2RlID0gY29kZWMuZW5jb2RlKGdldFRlc3RPYmplY3QoKSwgZG9jKTsKKwkJT2JqZWN0IG9iamVjdCA9IGNvZGVjLmRlY29kZShub2RlKTsKKwkJY2hlY2tFcXVhbGl0eShvYmplY3QpOworCisJCS8vIFRlc3Qgc2l6ZSBjb21wdXRhdGlvbgorCQlhc3NlcnRFcXVhbHMoZ2V0VGVzdFNpemUoKSwgY29kZWMuc2l6ZU9mKGdldFRlc3RPYmplY3QoKSkpOworCX0KKworCS8qKiBHZXQgdGhlIHRlc3Qgb2JqZWN0IHRvIGVuY29kZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRlc3Qgb2JqZWN0LgorCSAqLworCXByb3RlY3RlZCBPYmplY3QgZ2V0VGVzdE9iamVjdCgpIHsKKwkJcmV0dXJuIFRFU1RfT0JKRUNUOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgdGVzdCBvYmplY3QuCisJICoKKwkgKiBAcmV0dXJuIFNpemUgb2YgdGhlIHRlc3Qgb2JqZWN0IGluIGJ5dGVzLgorCSAqLworCXByb3RlY3RlZCBsb25nIGdldFRlc3RTaXplKCkgeworCQlyZXR1cm4gVEVTVF9TSVpFOworCX0KKworCS8qKiBUZXN0IHRoZSBlbmNvZGVkIGFuZCBkZWNvZGVkIG9iamVjdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgdGVzdCBvYmplY3QuCisJICoKKwkgKiBAcGFyYW0gZW5jb2RlZEFuZERlY29kZWQgVGhlIGVuY29kZWQgYW5kIGRlY29kZWQgb2JqZWN0LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrRXF1YWxpdHkoT2JqZWN0IGVuY29kZWRBbmREZWNvZGVkKSB7CisJCWFzc2VydEVxdWFscyhnZXRUZXN0T2JqZWN0KCksIGVuY29kZWRBbmREZWNvZGVkKTsKKwl9CisKKwkvKiogVGhlIG9iamVjdCB3ZSdsbCBlbmNvZGUgYW5kIGRlY29kZSB3aXRoIHRoZSBjb2RlYy4gKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9PQkpFQ1QgPSAiVGhpcyBpcyBteSB0ZXN0IG9iamVjdC4iOworCisJLyoqIFNpemUgb2YgdGhlIHRlc3Qgb2JqZWN0IGluIGJ5dGVzLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9TSVpFID0gMjM7Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvbXByZXNzZWRPYmplY3RDb2RlY1Rlc3QuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29tcHJlc3NlZE9iamVjdENvZGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyNDhiMTAKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0NvbXByZXNzZWRPYmplY3RDb2RlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db21wcmVzc2VkT2JqZWN0Q29kZWM7IC8vIEltcG9ydGVkIGZvciBqYXZhZG9jCisKKy8qKiBVbml0IHRlc3QgdGhlIHtAbGluayBDb21wcmVzc2VkT2JqZWN0Q29kZWN9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2VkT2JqZWN0Q29kZWNUZXN0IGV4dGVuZHMgQ29kZWNUZXN0IHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSB7QGxpbmsgQ29tcHJlc3NlZE9iamVjdENvZGVjfSBjbGFzcy4gKi8KKwlwdWJsaWMgQ29tcHJlc3NlZE9iamVjdENvZGVjVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcnVuVGVzdChDb2RlY0ZhY3RvcnkuY3JlYXRlQ29kZWMoIm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db21wcmVzc2VkT2JqZWN0Q29kZWMiKSk7CisJfQorCisJcHVibGljIGxvbmcgZ2V0VGVzdFNpemUoKSB7CisJCS8vIFNlcmlhbGl6YXRpb24gb3ZlcmhlYWQgYWRkcyBhIGZldyBieXRlcywgc28gd2Ugb3ZlcnJpZGUgdGhlIG1ldGhvZCBoZXJlCisJCS8vIHdpdGggdGhpcyB2YWx1ZToKKwkJcmV0dXJuIDMwOworCX0KK30KZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29tcHJlc3NlZFN0cmluZ0NvZGVjVGVzdC5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9Db21wcmVzc2VkU3RyaW5nQ29kZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTU4MWU1YgotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvQ29tcHJlc3NlZFN0cmluZ0NvZGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5Db21wcmVzc2VkU3RyaW5nQ29kZWM7IC8vIEltcG9ydGVkIGZvciBKYXZhZG9jCitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFVuaXQgdGVzdCB0aGUge0BsaW5rIENvbXByZXNzZWRTdHJpbmdDb2RlY30gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIENvbXByZXNzZWRTdHJpbmdDb2RlY1Rlc3QgZXh0ZW5kcyBDb2RlY1Rlc3QgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBDb21wcmVzc2VkU3RyaW5nQ29kZWN9IGNsYXNzLiAqLworCXB1YmxpYyBDb21wcmVzc2VkU3RyaW5nQ29kZWNUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24geworCQlydW5UZXN0KENvZGVjRmFjdG9yeS5jcmVhdGVDb2RlYygib3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LkNvbXByZXNzZWRTdHJpbmdDb2RlYyIpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0VtcHR5Qnl0ZUFycmF5Q29kZWNUZXN0LmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0VtcHR5Qnl0ZUFycmF5Q29kZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDg4NmY3OQotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvRW1wdHlCeXRlQXJyYXlDb2RlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5CeXRlQXJyYXlDb2RlYzsgLy8gSW1wb3J0ZWQgZm9yIGphdmFkb2MKKworLyoqCisgKiBVbml0IHRlc3QgdGhlIHtAbGluayBCeXRlQXJyYXlDb2RlY30gY2xhc3Mgd2l0aCBhbiBlbXB0eSBieXRlIGFycmF5LgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBFbXB0eUJ5dGVBcnJheUNvZGVjVGVzdCBleHRlbmRzIENvZGVjVGVzdCB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIEJ5dGVBcnJheUNvZGVjfSBjbGFzcy4gKi8KKwlwdWJsaWMgRW1wdHlCeXRlQXJyYXlDb2RlY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJ1blRlc3QoQ29kZWNGYWN0b3J5LmNyZWF0ZUNvZGVjKCJvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuQnl0ZUFycmF5Q29kZWMiKSk7CisJfQorCisJcHJvdGVjdGVkIE9iamVjdCBnZXRUZXN0T2JqZWN0KCkgeworCQlyZXR1cm4gVEVTVF9PQkpFQ1Q7CisJfQorCisJcHJvdGVjdGVkIGxvbmcgZ2V0VGVzdFNpemUoKSB7CisJCXJldHVybiAwOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrRXF1YWxpdHkoT2JqZWN0IGVuY29kZWRBbmREZWNvZGVkKSB7CisJCWFzc2VydFRydWUoIkVtcHR5IGJ5dGUgYXJyYXkgY29kZWMgZmFpbGVkIiwgamF2YS51dGlsLkFycmF5cy5lcXVhbHMoVEVTVF9PQkpFQ1QsIChieXRlW10pIGVuY29kZWRBbmREZWNvZGVkKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFRFU1RfT0JKRUNUID0gbmV3IGJ5dGVbMF07Cit9CmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0hlYWRlclRlc3QuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvSGVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwZTVhNjgKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L0hlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFVuaXQgdGVzdCB0aGUge0BsaW5rIEhlYWRlcn0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIEhlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIEhlYWRlcn0gY2xhc3MuICovCisJcHVibGljIEhlYWRlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5vQXJnc0N0b3IoKSB7CisJCUhlYWRlciBibGFuayA9IG5ldyBIZWFkZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKCJVTktOT1dOIiwgYmxhbmsuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChibGFuay5nZXRUeXBlKCkpOworCQlhc3NlcnROdWxsKGJsYW5rLmdldFVuaXQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNpbXBsZUN0b3IoKSB7CisJCUhlYWRlciBzaW1wbGUgPSBuZXcgSGVhZGVyKCJuYW1lIik7CisJCWFzc2VydEVxdWFscygibmFtZSIsIHNpbXBsZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHNpbXBsZS5nZXRUeXBlKCkpOworCQlhc3NlcnROdWxsKHNpbXBsZS5nZXRVbml0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RGdWxsQ3RvcigpIHsKKwkJSGVhZGVyIGZ1bGwgPSBuZXcgSGVhZGVyKCJuYW1lIiwgInR5cGUiLCAidW5pdCIpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBmdWxsLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygidHlwZSIsIGZ1bGwuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1bml0IiwgZnVsbC5nZXRVbml0KCkpOworCX0JCQorCisJcHVibGljIHZvaWQgdGVzdFNldHRlcnMoKSB7CisJCUhlYWRlciBoID0gbmV3IEhlYWRlcigibmFtZSIsICJ0eXBlIiwgInVuaXQiKTsKKworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBoLmdldE5hbWUoKSk7CisJCWguc2V0TmFtZSgibmV3TmFtZSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBoLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ0eXBlIiwgaC5nZXRUeXBlKCkpOworCQloLnNldFR5cGUoIm5ld1R5cGUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdUeXBlIiwgaC5nZXRUeXBlKCkpOworCisJCWFzc2VydEVxdWFscygidW5pdCIsIGguZ2V0VW5pdCgpKTsKKwkJaC5zZXRVbml0KCJuZXdVbml0Iik7CisJCWFzc2VydEVxdWFscygibmV3VW5pdCIsIGguZ2V0VW5pdCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0TWV0aG9kcygpIHsKKwkJSGVhZGVyIGgxID0gbmV3IEhlYWRlcigibmFtZTEiLCAidHlwZTEiLCAidW5pdDEiKTsKKwkJSGVhZGVyIGgyID0gbmV3IEhlYWRlcigibmFtZTEiLCAidHlwZTEiLCAidW5pdDEiKTsKKwkJSGVhZGVyIGgzID0gbmV3IEhlYWRlcigibmFtZTIiLCAidHlwZTIiLCAidW5pdDIiKTsKKwkJYXNzZXJ0RXF1YWxzKGgxLCBoMSk7CisJCWFzc2VydEVxdWFscyhoMSwgaDIpOworCQlhc3NlcnRUcnVlKCFoMS5lcXVhbHMoaDMpKTsKKwkJSGVhZGVyIGg0ID0gKEhlYWRlcikgaDMuY2xvbmUoKTsKKwkJYXNzZXJ0RXF1YWxzKGgzLCBoNCk7CisJCWFzc2VydFRydWUoaDMgIT0gaDQpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCUVsZW1lbnQgYm9ndXMgPSBkb2MuY3JlYXRlRWxlbWVudCgiYm9ndXMiKTsKKwkJdHJ5IHsKKwkJCUhlYWRlciBoMCA9IG5ldyBIZWFkZXIoYm9ndXMpOworCQkJZmFpbCgiSGVhZGVyIGNvbnN0cnVjdG9yIGZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24gd2hlbiBnaXZlbiBpbnZhbGlkIFhNTCBub2RlIik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBnb29kKSB7fQorCisJCUhlYWRlciBoMSA9IG5ldyBIZWFkZXIoIm5hbWUxIiwgInR5cGUxIiwgInVuaXQxIik7CisJCU5vZGUgcm9vdCA9IGgxLnRvWE1MKGRvYyk7CisJCWFzc2VydEVxdWFscygiaGVhZGVyRWxlbWVudCIsIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoImVsZW1OYW1lIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoIm5hbWUxIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoImVsZW1UeXBlIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInR5cGUxIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoImVsZW1Vbml0Ii5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInVuaXQxIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBmYWlsKCJVbmtub3duIG5vZGUgXCIiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICJcIiBpbiBYTUwgcmVzdWx0Iik7CisJCX0KKwkJSGVhZGVyIGgyID0gbmV3IEhlYWRlcihyb290KTsKKwkJYXNzZXJ0RXF1YWxzKGgxLCBoMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlEb2N1bWVudCBkb2MgPSBYTUwuY3JlYXRlRG9jdW1lbnQoKTsKKwkJRWxlbWVudCByZXN1bHRIZWFkZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgicmVzdWx0SGVhZGVyIik7CisJCUVsZW1lbnQgaGVhZGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJoZWFkZXJFbGVtZW50Iik7CisJCXJlc3VsdEhlYWRlci5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbU5hbWUiLCAibmFtZTEiKTsKKwkJaGVhZGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJoZWFkZXJFbGVtZW50Iik7CisJCXJlc3VsdEhlYWRlci5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbU5hbWUiLCAibmFtZTIiKTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbVR5cGUiLCAidHlwZTIiKTsKKwkJaGVhZGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJoZWFkZXJFbGVtZW50Iik7CisJCXJlc3VsdEhlYWRlci5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbU5hbWUiLCAibmFtZTMiKTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbVVuaXQiLCAidW5pdDMiKTsKKwkJaGVhZGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJoZWFkZXJFbGVtZW50Iik7CisJCXJlc3VsdEhlYWRlci5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbU5hbWUiLCAibmFtZTQiKTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbVR5cGUiLCAidHlwZTQiKTsKKwkJWE1MLmFkZChoZWFkZXJFbGVtZW50LCAiZWxlbVVuaXQiLCAidW5pdDQiKTsKKworCQlMaXN0IGhlYWRlcnMgPSBIZWFkZXIuY3JlYXRlSGVhZGVycyhyZXN1bHRIZWFkZXIpOworCQlIZWFkZXIgaDEgPSBuZXcgSGVhZGVyKCJuYW1lMSIpOworCQlIZWFkZXIgaDIgPSBuZXcgSGVhZGVyKCJuYW1lMiIsICJ0eXBlMiIsIG51bGwpOworCQlIZWFkZXIgaDMgPSBuZXcgSGVhZGVyKCJuYW1lMyIsIG51bGwsICJ1bml0MyIpOworCQlIZWFkZXIgaDQgPSBuZXcgSGVhZGVyKCJuYW1lNCIsICJ0eXBlNCIsICJ1bml0NCIpOworCQlhc3NlcnRFcXVhbHMoaDEsIGhlYWRlcnMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKGgyLCBoZWFkZXJzLmdldCgxKSk7CisJCWFzc2VydEVxdWFscyhoMywgaGVhZGVycy5nZXQoMikpOworCQlhc3NlcnRFcXVhbHMoaDQsIGhlYWRlcnMuZ2V0KDMpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvT2JqZWN0Q29kZWNUZXN0LmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L09iamVjdENvZGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5ZTkyYzYKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L09iamVjdENvZGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuKjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5Lk9iamVjdENvZGVjOyAvLyBJbXBvcnRlZCBmb3IgamF2YWRvYworCisvKiogVW5pdCB0ZXN0IHRoZSB7QGxpbmsgT2JqZWN0Q29kZWN9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgS2VsbHkKKyAqLyAKK3B1YmxpYyBjbGFzcyBPYmplY3RDb2RlY1Rlc3QgZXh0ZW5kcyBDb2RlY1Rlc3QgeworCS8qKiBDb25zdHJ1Y3QgdGhlIHRlc3QgY2FzZSBmb3IgdGhlIHtAbGluayBPYmplY3RDb2RlY30gY2xhc3MuICovCisJcHVibGljIE9iamVjdENvZGVjVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcnVuVGVzdChDb2RlY0ZhY3RvcnkuY3JlYXRlQ29kZWMoIm9yZy5hcGFjaGUub29kdC54bWxxdWVyeS5PYmplY3RDb2RlYyIpKTsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRUZXN0U2l6ZSgpIHsKKwkJLy8gU2VyaWFsaXphdGlvbiBvdmVyaGVhZCBhZGRzIGEgZmV3IGJ5dGVzLCBzbyB3ZSBvdmVycmlkZSB0aGUgbWV0aG9kIGhlcmUKKwkJLy8gd2l0aCB0aGlzIHZhbHVlOgorCQlyZXR1cm4gMzA7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeUVsZW1lbnRUZXN0LmphdmEgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1F1ZXJ5RWxlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWYwYjBhCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9RdWVyeUVsZW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFVuaXQgdGVzdCB0aGUge0BsaW5rIFF1ZXJ5RWxlbWVudH0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIFF1ZXJ5RWxlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIFF1ZXJ5RWxlbWVudH0gY2xhc3MuICovCisJcHVibGljIFF1ZXJ5RWxlbWVudFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5vQXJnc0N0b3IoKSB7CisJCVF1ZXJ5RWxlbWVudCBibGFuayA9IG5ldyBRdWVyeUVsZW1lbnQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJVTktOT1dOIiwgYmxhbmsuZ2V0Um9sZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJVTktOT1dOIiwgYmxhbmsuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEN0b3IoKSB7CisJCVF1ZXJ5RWxlbWVudCBmdWxsID0gbmV3IFF1ZXJ5RWxlbWVudCgicm9sZSIsICJ2YWx1ZSIpOworCQlhc3NlcnRFcXVhbHMoInJvbGUiLCBmdWxsLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygidmFsdWUiLCBmdWxsLmdldFZhbHVlKCkpOworCX0JCQorCisJcHVibGljIHZvaWQgdGVzdFNldHRlcnMoKSB7CisJCVF1ZXJ5RWxlbWVudCBxID0gbmV3IFF1ZXJ5RWxlbWVudCgicm9sZSIsICJ2YWx1ZSIpOworCisJCWFzc2VydEVxdWFscygicm9sZSIsIHEuZ2V0Um9sZSgpKTsKKwkJcS5zZXRSb2xlKCJuZXdSb2xlIik7CisJCWFzc2VydEVxdWFscygibmV3Um9sZSIsIHEuZ2V0Um9sZSgpKTsKKwkJcS5zZXRSb2xlKG51bGwpOworCQlhc3NlcnRFcXVhbHMoIlVOS05PV04iLCBxLmdldFJvbGUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHEuZ2V0VmFsdWUoKSk7CisJCXEuc2V0VmFsdWUoIm5ld1ZhbHVlIik7CisJCWFzc2VydEVxdWFscygibmV3VmFsdWUiLCBxLmdldFZhbHVlKCkpOworCQlxLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnRFcXVhbHMoIlVOS05PV04iLCBxLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RPYmplY3RNZXRob2RzKCkgeworCQlRdWVyeUVsZW1lbnQgcTEgPSBuZXcgUXVlcnlFbGVtZW50KCJhIiwgIjEiKTsKKwkJUXVlcnlFbGVtZW50IHEyID0gbmV3IFF1ZXJ5RWxlbWVudCgiYSIsICIxIik7CisJCVF1ZXJ5RWxlbWVudCBxMyA9IG5ldyBRdWVyeUVsZW1lbnQoImIiLCAiMiIpOworCQlhc3NlcnRFcXVhbHMocTEsIHExKTsKKwkJYXNzZXJ0RXF1YWxzKHExLCBxMik7CisJCWFzc2VydFRydWUoIXExLmVxdWFscyhxMykpOworCQlRdWVyeUVsZW1lbnQgcTQgPSAoUXVlcnlFbGVtZW50KSBxMy5jbG9uZSgpOworCQlhc3NlcnRFcXVhbHMocTMsIHE0KTsKKwkJYXNzZXJ0VHJ1ZShxMyAhPSBxNCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFhNTCgpIHRocm93cyBFeGNlcHRpb24geworCQlRdWVyeUVsZW1lbnQgcTEgPSBuZXcgUXVlcnlFbGVtZW50KCJhIiwgIjEiKTsKKwkJRG9jdW1lbnQgZG9jID0gWE1MLmNyZWF0ZURvY3VtZW50KCk7CisJCU5vZGUgcm9vdCA9IHExLnRvWE1MKGRvYyk7CisJCWFzc2VydEVxdWFscygicXVlcnlFbGVtZW50Iiwgcm9vdC5nZXROb2RlTmFtZSgpKTsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSByb290LmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCWlmICgidG9rZW5Sb2xlIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImEiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgidG9rZW5WYWx1ZSIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCIxIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBmYWlsKCJVbmtub3duIG5vZGUgXCIiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICJcIiBpbiBYTUwgcmVzdWx0Iik7CisJCX0KKwkJUXVlcnlFbGVtZW50IHEyID0gbmV3IFF1ZXJ5RWxlbWVudChyb290KTsKKwkJYXNzZXJ0RXF1YWxzKHExLCBxMik7CisJfQorfQorCmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1Jlc3VsdFRlc3QuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvUmVzdWx0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwYjhmODcKLS0tIC9kZXYvbnVsbAorKysgYi8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1Jlc3VsdFRlc3QuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm9vZHQueG1scXVlcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LmNvbW1vbnMudXRpbC4qOworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFVuaXQgdGVzdCB0aGUge0BsaW5rIFJlc3VsdH0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIFJlc3VsdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIFJlc3VsdH0gY2xhc3MuICovCisJcHVibGljIFJlc3VsdFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5vQXJnc0N0b3IoKSB7CisJCVJlc3VsdCBibGFuayA9IG5ldyBSZXN1bHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJVTktOT1dOIiwgYmxhbmsuZ2V0SUQoKSk7CisJCWFzc2VydEVxdWFscygiVU5LTk9XTiIsIGJsYW5rLmdldE1pbWVUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIlVOS05PV04iLCBibGFuay5nZXRQcm9maWxlSUQoKSk7CisJCWFzc2VydEVxdWFscygiVU5LTk9XTiIsIGJsYW5rLmdldFJlc291cmNlSUQoKSk7CisJCWFzc2VydEVxdWFscygwLCBibGFuay5nZXRIZWFkZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBibGFuay5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZSghYmxhbmsuaXNDbGFzc2lmaWVkKCkpOworCQlhc3NlcnRFcXVhbHMoUmVzdWx0LklORklOSVRFLCBibGFuay5nZXRWYWxpZGl0eSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ3RvcigpIHsKKwkJUmVzdWx0IHNpbXBsZSA9IG5ldyBSZXN1bHQoIjEiLCAiVGhlIFZhbHVlIik7CisJCWFzc2VydEVxdWFscygiMSIsIHNpbXBsZS5nZXRJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJVTktOT1dOIiwgc2ltcGxlLmdldE1pbWVUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIlVOS05PV04iLCBzaW1wbGUuZ2V0UHJvZmlsZUlEKCkpOworCQlhc3NlcnRFcXVhbHMoIlVOS05PV04iLCBzaW1wbGUuZ2V0UmVzb3VyY2VJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHNpbXBsZS5nZXRIZWFkZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJUaGUgVmFsdWUiLCBzaW1wbGUuZ2V0VmFsdWUoKSk7CisJCWFzc2VydFRydWUoIXNpbXBsZS5pc0NsYXNzaWZpZWQoKSk7CisJCWFzc2VydEVxdWFscyhSZXN1bHQuSU5GSU5JVEUsIHNpbXBsZS5nZXRWYWxpZGl0eSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RnVsbEN0b3IoKSB7CisJCUxpc3QgaGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaGVhZGVycy5hZGQobmV3IEhlYWRlcigiaGVhZGVyIikpOworCQlSZXN1bHQgZnVsbCA9IG5ldyBSZXN1bHQoIjEiLCAidGV4dC94bWwiLCAiZWRhRGF0YVNldEludjEiLCAiZ2VlYmExIiwgaGVhZGVycyxURVNUX1ZBTFVFLCAvKmNsYXNzaWZpZWQqL3RydWUsCisJCQkvKnZhbGlkaXR5Ki8xMjM0NUwpOworCQlhc3NlcnRFcXVhbHMoIjEiLCBmdWxsLmdldElEKCkpOworCQlhc3NlcnRFcXVhbHMoInRleHQveG1sIiwgZnVsbC5nZXRNaW1lVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJlZGFEYXRhU2V0SW52MSIsIGZ1bGwuZ2V0UHJvZmlsZUlEKCkpOworCQlhc3NlcnRFcXVhbHMoImdlZWJhMSIsIGZ1bGwuZ2V0UmVzb3VyY2VJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGZ1bGwuZ2V0SGVhZGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhURVNUX1ZBTFVFLCBmdWxsLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZnVsbC5pc0NsYXNzaWZpZWQoKSk7CisJCWFzc2VydEVxdWFscygxMjM0NUwsIGZ1bGwuZ2V0VmFsaWRpdHkoKSk7CisJfQkJCisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0dGVycygpIHsKKwkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoIjEiLCAidGV4dC94bWwiLCAiZWRhRGF0YVNldEludjEiLCAiZ2VlYmExIiwgbmV3IEFycmF5TGlzdCgpLCBURVNUX1ZBTFVFKTsKKworCQlhc3NlcnRFcXVhbHMoIjEiLCByZXN1bHQuZ2V0SUQoKSk7CisJCXJlc3VsdC5zZXRJRCgiMiIpOworCQlhc3NlcnRFcXVhbHMoIjIiLCByZXN1bHQuZ2V0SUQoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0L3htbCIsIHJlc3VsdC5nZXRNaW1lVHlwZSgpKTsKKwkJcmVzdWx0LnNldE1pbWVUeXBlKCJ0ZXh0L3NnbWwiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0L3NnbWwiLCByZXN1bHQuZ2V0TWltZVR5cGUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJlZGFEYXRhU2V0SW52MSIsIHJlc3VsdC5nZXRQcm9maWxlSUQoKSk7CisJCXJlc3VsdC5zZXRQcm9maWxlSUQoInB0aURhdGFTZXQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJwdGlEYXRhU2V0IiwgcmVzdWx0LmdldFByb2ZpbGVJRCgpKTsKKworCQlhc3NlcnRFcXVhbHMoImdlZWJhMSIsIHJlc3VsdC5nZXRSZXNvdXJjZUlEKCkpOworCQlyZXN1bHQuc2V0UmVzb3VyY2VJRCgiZmlzaDIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJmaXNoMiIsIHJlc3VsdC5nZXRSZXNvdXJjZUlEKCkpOworCisJCWFzc2VydEVxdWFscyhURVNUX1ZBTFVFLCByZXN1bHQuZ2V0VmFsdWUoKSk7CisJCXJlc3VsdC5zZXRWYWx1ZSgiPGhlbGxvPndvcmxkPC9oZWxsbz4iKTsKKwkJYXNzZXJ0RXF1YWxzKCI8aGVsbG8+d29ybGQ8L2hlbGxvPiIsIHJlc3VsdC5nZXRWYWx1ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlc3VsdC5pc0NsYXNzaWZpZWQoKSk7CisJCXJlc3VsdC5zZXRDbGFzc2lmaWVkKHRydWUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVzdWx0LmlzQ2xhc3NpZmllZCgpKTsKKworCQlhc3NlcnRFcXVhbHMoUmVzdWx0LklORklOSVRFLCByZXN1bHQuZ2V0VmFsaWRpdHkoKSk7CisJCXJlc3VsdC5zZXRWYWxpZGl0eSg1NDMyMUwpOworCQlhc3NlcnRFcXVhbHMoNTQzMjFMLCByZXN1bHQuZ2V0VmFsaWRpdHkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE9iamVjdE1ldGhvZHMoKSB7CisJCVJlc3VsdCByMSA9IG5ldyBSZXN1bHQoIjEiLCAidGV4dC94bWwiLCAiZWRhRGF0YVNldEludjEiLCAiZ2VlYmExIiwgbmV3IEFycmF5TGlzdCgpLCBURVNUX1ZBTFVFKTsKKwkJUmVzdWx0IHIyID0gbmV3IFJlc3VsdCgiMSIsICJ0ZXh0L3htbCIsICJlZGFEYXRhU2V0SW52MSIsICJnZWViYTEiLCBuZXcgQXJyYXlMaXN0KCksIFRFU1RfVkFMVUUpOworCQlSZXN1bHQgcjMgPSBuZXcgUmVzdWx0KCIyIiwgInRleHQveG1sIiwgImVkYURhdGFTZXRJbnYxIiwgImdlZWJhMSIsIG5ldyBBcnJheUxpc3QoKSwgVEVTVF9WQUxVRSk7CisJCWFzc2VydEVxdWFscyhyMSwgcjEpOworCQlhc3NlcnRFcXVhbHMocjEsIHIyKTsKKwkJYXNzZXJ0VHJ1ZSghcjEuZXF1YWxzKHIzKSk7CisJCVJlc3VsdCByNCA9IChSZXN1bHQpIHIzLmNsb25lKCk7CisJCWFzc2VydEVxdWFscyhyMywgcjQpOworCQlhc3NlcnRUcnVlKHIzICE9IHI0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0WE1MKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURvY3VtZW50IGRvYyA9IFhNTC5jcmVhdGVEb2N1bWVudCgpOworCQlFbGVtZW50IGJvZ3VzID0gZG9jLmNyZWF0ZUVsZW1lbnQoImJvZ3VzIik7CisJCXRyeSB7CisJCQlSZXN1bHQgcjAgPSBuZXcgUmVzdWx0KGJvZ3VzKTsKKwkJCWZhaWwoIlJlc3VsdCBjb25zdHJ1Y3RvciBmYWlsZWQgdG8gdGhyb3cgZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gaW52YWxpZCBYTUwgbm9kZSIpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZ29vZCkge30KKworCQlSZXN1bHQgcjEgPSBuZXcgUmVzdWx0KCIxIiwgInRleHQveG1sIiwgImVkYURhdGFTZXRJbnYxIiwgImdlZWJhMSIsIG5ldyBBcnJheUxpc3QoKSwgVEVTVF9WQUxVRSwKKwkJCS8qY2xhc3NpZmllZCovdHJ1ZSwgLyp2YWxpZGl0eSovMzQ1Njc4OSk7CisJCU5vZGUgcm9vdCA9IHIxLnRvWE1MKGRvYyk7CisJCWFzc2VydEVxdWFscygicmVzdWx0RWxlbWVudCIsIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygidHJ1ZSIsICgoRWxlbWVudCkgcm9vdCkuZ2V0QXR0cmlidXRlKCJjbGFzc2lmaWVkIikpOworCQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkiLCAoKEVsZW1lbnQpIHJvb3QpLmdldEF0dHJpYnV0ZSgidmFsaWRpdHkiKSk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7ICsraSkgeworCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoInJlc3VsdElkIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoIjEiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicmVzdWx0TWltZVR5cGUiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgeworCQkJCWFzc2VydEVxdWFscygidGV4dC94bWwiLCBYTUwudGV4dChjaGlsZCkpOworCQkJfSBlbHNlIGlmICgicHJvZklkIi5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImVkYURhdGFTZXRJbnYxIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoImlkZW50aWZpZXIiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgeworCQkJCWFzc2VydEVxdWFscygiZ2VlYmExIiwgWE1MLnRleHQoY2hpbGQpKTsKKwkJCX0gZWxzZSBpZiAoInJlc3VsdEhlYWRlciIuZXF1YWxzKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJLy8gaWdub3JlLCB1c2UgSGVhZGVyVGVzdAorCQkJfSBlbHNlIGlmICgicmVzdWx0VmFsdWUiLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgeworCQkJCWFzc2VydEVxdWFscyhURVNUX1ZBTFVFLCBjaGlsZC5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOworCQkJfSBlbHNlIGZhaWwoIlVua25vd24gbm9kZSBcIiIgKyBjaGlsZC5nZXROb2RlTmFtZSgpICsgIlwiIGluIFhNTCByZXN1bHQiKTsKKwkJfQorCQlSZXN1bHQgcjIgPSBuZXcgUmVzdWx0KHJvb3QpOworCQlhc3NlcnRFcXVhbHMocjEsIHIyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TWltZVR5cGVzKCkgeworCQl0cnkgeworCQkJUmVzdWx0IHIgPSBuZXcgUmVzdWx0KCIxIiwgImludmFsaWQvbWltZS50eXBlIiwgIiIsICIiLCBuZXcgQXJyYXlMaXN0KCksICIiKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisJCQkvLyBHb29kLgorCQkJcmV0dXJuOworCQl9CisJCWZhaWwoIlJlc3VsdCBjb25zdHJ1Y3RvciBmYWlsZWQgdG8gdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBpbnZhbGlkIG1pbWUgdHlwZSIpOworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1ZBTFVFID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+XG48dGVzdD52YWx1ZTwvdGVzdD4iOworfQorCmRpZmYgLS1naXQgYS8wLjEwL3htbHF1ZXJ5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vb2R0L3htbHF1ZXJ5L1N0cmluZ0NvZGVjVGVzdC5qYXZhIGIvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9TdHJpbmdDb2RlY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYWRjMGFlCi0tLSAvZGV2L251bGwKKysrIGIvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9TdHJpbmdDb2RlY1Rlc3QuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUub29kdC54bWxxdWVyeTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9vZHQuY29tbW9ucy51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5LlN0cmluZ0NvZGVjOyAvLyBJbXBvcnRlZCBmb3IgamF2YWRvYworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqIFVuaXQgdGVzdCB0aGUge0BsaW5rIFN0cmluZ0NvZGVjfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtlbGx5CisgKi8gCitwdWJsaWMgY2xhc3MgU3RyaW5nQ29kZWNUZXN0IGV4dGVuZHMgQ29kZWNUZXN0IHsKKwkvKiogQ29uc3RydWN0IHRoZSB0ZXN0IGNhc2UgZm9yIHRoZSB7QGxpbmsgU3RyaW5nQ29kZWN9IGNsYXNzLiAqLworCXB1YmxpYyBTdHJpbmdDb2RlY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJ1blRlc3QoQ29kZWNGYWN0b3J5LmNyZWF0ZUNvZGVjKCJvcmcuYXBhY2hlLm9vZHQueG1scXVlcnkuU3RyaW5nQ29kZWMiKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMC4xMC94bWxxdWVyeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb29kdC94bWxxdWVyeS9YTUxRdWVyeVRlc3QuamF2YSBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvWE1MUXVlcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTVhN2RkMwotLS0gL2Rldi9udWxsCisrKyBiLzAuMTAveG1scXVlcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29vZHQveG1scXVlcnkvWE1MUXVlcnlUZXN0LmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5vb2R0LnhtbHF1ZXJ5OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUub29kdC5jb21tb25zLnV0aWwuKjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKKy8qKiBVbml0IHRlc3QgdGhlIHtAbGluayBYTUxRdWVyeX0gY2xhc3MuCisgKgorICogQGF1dGhvciBLZWxseQorICovIAorcHVibGljIGNsYXNzIFhNTFF1ZXJ5VGVzdCBleHRlbmRzIG9yZy5hcGFjaGUub29kdC5jb21tb25zLkNvbmZpZ3VyZWRUZXN0Q2FzZSB7CisJLyoqIENvbnN0cnVjdCB0aGUgdGVzdCBjYXNlIGZvciB0aGUge0BsaW5rIFhNTFF1ZXJ5fSBjbGFzcy4gKi8KKwlwdWJsaWMgWE1MUXVlcnlUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDdG9yKCkgeworCQlMaXN0IG1pbWVzID0gbmV3IEFycmF5TGlzdCgpOworCQltaW1lcy5hZGQoInRleHQvcGxhaW4iKTsKKwkJbWltZXMuYWRkKCJpbWFnZS9qcGVnIik7CisJCVhNTFF1ZXJ5IHEgPSBuZXcgWE1MUXVlcnkoInByb2ZTdGF0dXNJZCA9IFVOS05PV04gT1IgQSA+IDMgQU5EIFJFVFVSTiA9IEMiLAorCQkJImlkIiwgInRpdGxlIiwgImRlc2NyaXB0aW9uIiwgImRhdGFEaWN0SUQiLCAicmVzdWx0TW9kZUlEIiwgInByb3BUeXBlIiwgInByb3BMZXZlbHMiLCA0NSwgbWltZXMpOworCQlhc3NlcnRFcXVhbHMoInByb2ZTdGF0dXNJZCA9IFVOS05PV04gT1IgQSA+IDMgQU5EIFJFVFVSTiA9IEMiLCBxLmdldEt3ZFF1ZXJ5U3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoNDUsIHEuZ2V0TWF4UmVzdWx0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHEuZ2V0U2VsZWN0RWxlbWVudFNldCgpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgUXVlcnlFbGVtZW50KCJlbGVtTmFtZSIsICJDIiksIHEuZ2V0U2VsZWN0RWxlbWVudFNldCgpLmdldCgwKSk7CisJCWFzc2VydEVxdWFscygwLCBxLmdldEZyb21FbGVtZW50U2V0KCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHEuZ2V0V2hlcmVFbGVtZW50U2V0KCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBRdWVyeUVsZW1lbnQoImVsZW1OYW1lIiwgInByb2ZTdGF0dXNJZCIpLCBxLmdldFdoZXJlRWxlbWVudFNldCgpLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhuZXcgUXVlcnlFbGVtZW50KCJMSVRFUkFMIiwgIlVOS05PV04iKSwgcS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5nZXQoMSkpOworCQlhc3NlcnRFcXVhbHMobmV3IFF1ZXJ5RWxlbWVudCgiUkVMT1AiLCAiRVEiKSwgcS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5nZXQoMikpOworCQlhc3NlcnRFcXVhbHMobmV3IFF1ZXJ5RWxlbWVudCgiZWxlbU5hbWUiLCAiQSIpLCBxLmdldFdoZXJlRWxlbWVudFNldCgpLmdldCgzKSk7CisJCWFzc2VydEVxdWFscyhuZXcgUXVlcnlFbGVtZW50KCJMSVRFUkFMIiwgIjMiKSwgcS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5nZXQoNCkpOworCQlhc3NlcnRFcXVhbHMobmV3IFF1ZXJ5RWxlbWVudCgiUkVMT1AiLCAiR1QiKSwgcS5nZXRXaGVyZUVsZW1lbnRTZXQoKS5nZXQoNSkpOworCQkvLyBOZWVkIHNvbWUgdGVzdGluZyBvZiBleHByZXNzaW9ucyB3aXRoIExPR09QJ3MsIGJ1dCBOT1QgaGFuZGxpbmcgc2VlbXMgYnJva2VuLgorCQlhc3NlcnRFcXVhbHMoMCwgcS5nZXRSZXN1bHRzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHEuZ2V0TWltZUFjY2VwdCgpLnNpemUoKSk7CisJfQkJCisJCisJcHVibGljIHZvaWQgdGVzdE9iamVjdE1ldGhvZHMoKSB7CisJCVhNTFF1ZXJ5IHExID0gbmV3IFhNTFF1ZXJ5KCJTdWJqZWN0IDwgUGhyZW5vbG9neSBPUiBBID4gMyBBTkQgUkVUVVJOID0gQyIsCisJCQkiaWQiLCAidGl0bGUiLCAiZGVzY3JpcHRpb24iLCAiZGF0YURpY3RJRCIsICJyZXN1bHRNb2RlSUQiLCAicHJvcFR5cGUiLCAicHJvcExldmVscyIsIDQ1KTsKKwkJWE1MUXVlcnkgcTIgPSBuZXcgWE1MUXVlcnkoIlN1YmplY3QgPCBQaHJlbm9sb2d5IE9SIEEgPiAzIEFORCBSRVRVUk4gPSBDIiwKKwkJCSJpZCIsICJ0aXRsZSIsICJkZXNjcmlwdGlvbiIsICJkYXRhRGljdElEIiwgInJlc3VsdE1vZGVJRCIsICJwcm9wVHlwZSIsICJwcm9wTGV2ZWxzIiwgNDUpOworCQlYTUxRdWVyeSBxMyA9IG5ldyBYTUxRdWVyeSgiU3ViamVjdCA+IFBocmVub2xvZ3kgT1IgQSA8IDMgQU5EIFJFVFVSTiA9IEQiLAorCQkJImlkIiwgInRpdGxlIiwgImRlc2NyaXB0aW9uIiwgImRhdGFEaWN0SUQiLCAicmVzdWx0TW9kZUlEIiwgInByb3BUeXBlIiwgInByb3BMZXZlbHMiLCA0NSk7CisJCWFzc2VydEVxdWFscyhxMSwgcTEpOworCQlhc3NlcnRFcXVhbHMocTEsIHEyKTsKKwkJYXNzZXJ0VHJ1ZSghcTEuZXF1YWxzKHEzKSk7CisJCVhNTFF1ZXJ5IHE0ID0gKFhNTFF1ZXJ5KSBxMy5jbG9uZSgpOworCQlhc3NlcnRFcXVhbHMocTMsIHE0KTsKKwkJYXNzZXJ0VHJ1ZShxMyAhPSBxNCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFBhcnNlcigpIHsKKwkJWE1MUXVlcnkgcTEgPSBuZXcgWE1MUXVlcnkoIihBIDwgMSBBTkQgQSA+IDIpIEFORCBSRVRVUk4gPSBCIiwgImlkIiwgInRpdGxlIiwgImRlc2NyaXB0aW9uIiwgImRhdGFEaWN0SUQiLAorCQkJInJlc3VsdE1vZGVJRCIsICJwcm9wVHlwZSIsICJwcm9wTGV2ZWxzIiwgNDUpOworCQlMaXN0IHdoZXJlID0gcTEuZ2V0V2hlcmVFbGVtZW50U2V0KCk7CisJCWFzc2VydEVxdWFscyg3LCB3aGVyZS5zaXplKCkpOworCisJCVF1ZXJ5RWxlbWVudCBxZTsKKworCQlxZSA9IChRdWVyeUVsZW1lbnQpIHdoZXJlLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbGVtTmFtZSIsIHFlLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygiQSIsIHFlLmdldFZhbHVlKCkpOworCisJCXFlID0gKFF1ZXJ5RWxlbWVudCkgd2hlcmUuZ2V0KDEpOworCQlhc3NlcnRFcXVhbHMoIkxJVEVSQUwiLCBxZS5nZXRSb2xlKCkpOworCQlhc3NlcnRFcXVhbHMoIjEiLCBxZS5nZXRWYWx1ZSgpKTsKKworCQlxZSA9IChRdWVyeUVsZW1lbnQpIHdoZXJlLmdldCgyKTsKKwkJYXNzZXJ0RXF1YWxzKCJSRUxPUCIsIHFlLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygiTFQiLCBxZS5nZXRWYWx1ZSgpKTsKKworCQlxZSA9IChRdWVyeUVsZW1lbnQpIHdoZXJlLmdldCgzKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbGVtTmFtZSIsIHFlLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygiQSIsIHFlLmdldFZhbHVlKCkpOworCisJCXFlID0gKFF1ZXJ5RWxlbWVudCkgd2hlcmUuZ2V0KDQpOworCQlhc3NlcnRFcXVhbHMoIkxJVEVSQUwiLCBxZS5nZXRSb2xlKCkpOworCQlhc3NlcnRFcXVhbHMoIjIiLCBxZS5nZXRWYWx1ZSgpKTsKKworCQlxZSA9IChRdWVyeUVsZW1lbnQpIHdoZXJlLmdldCg1KTsKKwkJYXNzZXJ0RXF1YWxzKCJSRUxPUCIsIHFlLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygiR1QiLCBxZS5nZXRWYWx1ZSgpKTsKKworCQlxZSA9IChRdWVyeUVsZW1lbnQpIHdoZXJlLmdldCg2KTsKKwkJYXNzZXJ0RXF1YWxzKCJMT0dPUCIsIHFlLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygiQU5EIiwgcWUuZ2V0VmFsdWUoKSk7CisKKwkJTGlzdCBzZWxlY3QgPSBxMS5nZXRTZWxlY3RFbGVtZW50U2V0KCk7CisJCWFzc2VydEVxdWFscygxLCBzZWxlY3Quc2l6ZSgpKTsKKwkJCisJCXFlID0gKFF1ZXJ5RWxlbWVudCkgc2VsZWN0LmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbGVtTmFtZSIsIHFlLmdldFJvbGUoKSk7CisJCWFzc2VydEVxdWFscygiQiIsIHFlLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RYTUwoKSB7CisJCU5vZGVMaXN0IGNoaWxkcmVuOworCisJCUxpc3QgbWltZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCW1pbWVzLmFkZCgidGV4dC94bWwiKTsKKwkJbWltZXMuYWRkKCJpbWFnZS9naWYiKTsKKwkJWE1MUXVlcnkgcTEgPSBuZXcgWE1MUXVlcnkoIlN1YmplY3QgPCBQaHJlbm9sb2d5IE9SIEEgPiAzIEFORCBSRVRVUk4gPSBDIiwKKwkJCSJpZCIsICJ0aXRsZSIsICJkZXNjcmlwdGlvbiIsICJkYXRhRGljdElEIiwgInJlc3VsdE1vZGVJRCIsICJwcm9wVHlwZSIsICJwcm9wTGV2ZWxzIiwgNDUsIG1pbWVzKTsKKwkJRG9jdW1lbnQgZG9jID0gcTEuZ2V0WE1MRG9jKCk7CisJCU5vZGUgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJxdWVyeSIsIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7CisKKwkJTm9kZSBxdWVyeUF0dHJpYnV0ZXMgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJxdWVyeUF0dHJpYnV0ZXMiLCBxdWVyeUF0dHJpYnV0ZXMuZ2V0Tm9kZU5hbWUoKSk7CisJCWNoaWxkcmVuID0gcXVlcnlBdHRyaWJ1dGVzLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKSB7CisJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKKwkJCVN0cmluZyB0ZXh0ID0gWE1MLnRleHQoY2hpbGQpOworCQkJaWYgKCJxdWVyeUlkIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoImlkIiwgdGV4dCk7CisJCQl9IGVsc2UgaWYgKCJxdWVyeVRpdGxlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoInRpdGxlIiwgdGV4dCk7CisJCQl9IGVsc2UgaWYgKCJxdWVyeURlc2MiLmVxdWFscyhuYW1lKSkgeworCQkJCWFzc2VydEVxdWFscygiZGVzY3JpcHRpb24iLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoInF1ZXJ5VHlwZSIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJRVUVSWSIsIHRleHQpOworCQkJfSBlbHNlIGlmICgicXVlcnlTdGF0dXNJZCIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJBQ1RJVkUiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoInF1ZXJ5U2VjdXJpdHlUeXBlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoIlVOS05PV04iLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoInF1ZXJ5UmV2aXNpb25Ob3RlIi5lcXVhbHMobmFtZSkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoIjE5OTktMTItMTIgSlNIIFYxLjAgVW5kZXIgRGV2ZWxvcG1lbnQiLCB0ZXh0KTsKKwkJCX0gZWxzZSBpZiAoInF1ZXJ5RGF0YURpY3RJZCIuZXF1YWxzKG5hbWUpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKCJkYXRhRGljdElEIiwgdGV4dCk7CisJCQl9IGVsc2UgZmFpbCgiVW5rbm93biBub2RlIDwiICsgbmFtZSArICI+IHVuZGVyIDxxdWVyeUF0dHJpYnV0ZXM+Iik7CisJCX0KKworCQlOb2RlIHF1ZXJ5UmVzdWx0TW9kZSA9IHF1ZXJ5QXR0cmlidXRlcy5nZXROZXh0U2libGluZygpOworCQlhc3NlcnRFcXVhbHMoInF1ZXJ5UmVzdWx0TW9kZUlkIiwgcXVlcnlSZXN1bHRNb2RlLmdldE5vZGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInJlc3VsdE1vZGVJRCIsIFhNTC50ZXh0KHF1ZXJ5UmVzdWx0TW9kZSkpOworCisJCU5vZGUgcHJvcG9nYXRpb25UeXBlID0gcXVlcnlSZXN1bHRNb2RlLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlQcm9wb2dhdGlvblR5cGUiLCBwcm9wb2dhdGlvblR5cGUuZ2V0Tm9kZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygicHJvcFR5cGUiLCBYTUwudGV4dChwcm9wb2dhdGlvblR5cGUpKTsKKworCQlOb2RlIHByb3BvZ2F0aW9uTGV2ZWxzID0gcHJvcG9nYXRpb25UeXBlLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlQcm9wb2dhdGlvbkxldmVscyIsIHByb3BvZ2F0aW9uTGV2ZWxzLmdldE5vZGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInByb3BMZXZlbHMiLCBYTUwudGV4dChwcm9wb2dhdGlvbkxldmVscykpOworCisJCU5vZGUgbWltZU5vZGUgPSBwcm9wb2dhdGlvbkxldmVscy5nZXROZXh0U2libGluZygpOworCQlhc3NlcnRFcXVhbHMoInF1ZXJ5TWltZUFjY2VwdCIsIG1pbWVOb2RlLmdldE5vZGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInRleHQveG1sIiwgWE1MLnRleHQobWltZU5vZGUpKTsKKworCQltaW1lTm9kZSA9IG1pbWVOb2RlLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlNaW1lQWNjZXB0IiwgbWltZU5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaW1hZ2UvZ2lmIiwgWE1MLnRleHQobWltZU5vZGUpKTsJCQorCisJCU5vZGUgbWF4UmVzdWx0cyA9IG1pbWVOb2RlLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlNYXhSZXN1bHRzIiwgbWF4UmVzdWx0cy5nZXROb2RlTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCI0NSIsIFhNTC50ZXh0KG1heFJlc3VsdHMpKTsKKworCQlOb2RlIHJlc3VsdHMgPSBtYXhSZXN1bHRzLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlSZXN1bHRzIiwgcmVzdWx0cy5nZXROb2RlTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCIwIiwgWE1MLnRleHQocmVzdWx0cykpOworCisJCU5vZGUga3dxU3RyaW5nID0gcmVzdWx0cy5nZXROZXh0U2libGluZygpOworCQlhc3NlcnRFcXVhbHMoInF1ZXJ5S1dRU3RyaW5nIiwga3dxU3RyaW5nLmdldE5vZGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIlN1YmplY3QgPCBQaHJlbm9sb2d5IE9SIEEgPiAzIEFORCBSRVRVUk4gPSBDIiwgWE1MLnRleHQoa3dxU3RyaW5nKSk7CisKKwkJTm9kZSBub2RlID0ga3dxU3RyaW5nLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlTdGF0aXN0aWNzIiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKKwkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKCJxdWVyeVNlbGVjdFNldCIsIG5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisJCWFzc2VydEVxdWFscygicXVlcnlGcm9tU2V0Iiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKKwkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKCJxdWVyeVdoZXJlU2V0Iiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKKwkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKCJxdWVyeVJlc3VsdFNldCIsIG5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisJCWFzc2VydE51bGwobm9kZS5nZXROZXh0U2libGluZygpKTsKKworCQlYTUxRdWVyeSBxMiA9IG5ldyBYTUxRdWVyeShyb290KTsKKwkJYXNzZXJ0RXF1YWxzKHExLCBxMik7CisJfQorCisJLyoqCisJICogVGVzdCBpZiB3ZSBjYW4gcGFyc2UgYW4gWE1MIHF1ZXJ5IGRvY3VtZW50IGV2ZW4gd2l0aCBhbiBpbmFjY2Vzc2libGUgc3lzdGVtIElELgorCSAqCisJICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RYTUxFbnRpdHlSZXNvbHV0aW9uKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCW5ldyBYTUxRdWVyeShCQURfSE9TVCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJBRF9IT1NUID0gIjwhRE9DVFlQRSBxdWVyeSBQVUJMSUMgJy0vL0pQTC8vRFREIE9PRFQgUXVlcnkgMS4wLy9FTicgIgorCQkrICInaHR0cDovL3Vua25vd24taG9zdC51bmsvZWRtLXF1ZXJ5L3F1ZXJ5LmR0ZCc+XG48cXVlcnk+PHF1ZXJ5QXR0cmlidXRlcz48cXVlcnlJZD5xdWVyeVNlcnZsZXQ8L3F1ZXJ5SWQ+IgorCQkrICI8cXVlcnlUaXRsZT5RdWVyeWZyb21RdWVyeVNlcnZsZXQ8L3F1ZXJ5VGl0bGU+PHF1ZXJ5RGVzYz5CYWQgaG9zdCBuYW1lIGluIHN5c3RlbSBJRDwvcXVlcnlEZXNjPjxxdWVyeVR5cGU+IgorCQkrICJRVUVSWTwvcXVlcnlUeXBlPjxxdWVyeVN0YXR1c0lkPkFDVElWRTwvcXVlcnlTdGF0dXNJZD48cXVlcnlTZWN1cml0eVR5cGU+VU5LTk9XTjwvcXVlcnlTZWN1cml0eVR5cGU+IgorCQkrICI8cXVlcnlSZXZpc2lvbk5vdGU+MTk5OS0xMi0xMkpTSFYxLjBVbmRlckRldmVsb3BtZW50PC9xdWVyeVJldmlzaW9uTm90ZT48cXVlcnlEYXRhRGljdElkPlVOS05PV04iCisJCSsgIjwvcXVlcnlEYXRhRGljdElkPjwvcXVlcnlBdHRyaWJ1dGVzPjxxdWVyeVJlc3VsdE1vZGVJZD5BVFRSSUJVVEU8L3F1ZXJ5UmVzdWx0TW9kZUlkPjxxdWVyeVByb3BvZ2F0aW9uVHlwZT4iCisJCSsgIkJST0FEQ0FTVDwvcXVlcnlQcm9wb2dhdGlvblR5cGU+PHF1ZXJ5UHJvcG9nYXRpb25MZXZlbHM+Ti9BPC9xdWVyeVByb3BvZ2F0aW9uTGV2ZWxzPjxxdWVyeU1pbWVBY2NlcHQ+Ki8qIgorCQkrICI8L3F1ZXJ5TWltZUFjY2VwdD48cXVlcnlNYXhSZXN1bHRzPjEwMDwvcXVlcnlNYXhSZXN1bHRzPjxxdWVyeVJlc3VsdHM+MDwvcXVlcnlSZXN1bHRzPjxxdWVyeUtXUVN0cmluZz4iCisJCSsgIlJFVFVSTiA9IFNQRUNJTUVOX0NPTExFQ1RFRF9DT0RFPC9xdWVyeUtXUVN0cmluZz48cXVlcnlTdGF0aXN0aWNzLz48cXVlcnlTZWxlY3RTZXQ+PHF1ZXJ5RWxlbWVudD4iCisJCSsgIjx0b2tlblJvbGU+ZWxlbU5hbWU8L3Rva2VuUm9sZT48dG9rZW5WYWx1ZT5TUEVDSU1FTl9DT0xMRUNURURfQ09ERTwvdG9rZW5WYWx1ZT48L3F1ZXJ5RWxlbWVudD48L3F1ZXJ5U2VsZWN0U2V0PiIKKwkJKyAiPHF1ZXJ5RnJvbVNldC8+PHF1ZXJ5V2hlcmVTZXQvPjxxdWVyeVJlc3VsdFNldC8+PC9xdWVyeT4iOworCit9Cg==